From 110924543b9a1d79a7f49a8e1a059ecad4c5baf9 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期一, 13 二月 2023 10:28:21 +0800
Subject: [PATCH] 提交基础框架

---
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserCouponRecord.java                                             |  215 
 management/guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsProperties.java                                                  |  129 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ControllerConfig.java                                      |   70 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITComplaintService.java                                         |   34 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TUserServiceImpl.java                                      |   38 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSystemPriceMapper.java                                             |   28 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/AbstractDictMap.java                                 |   53 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/alldeletebtnupskin.png                                           |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229845707005523.png                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/progress.png                                            |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tCar/tCar.js                                                                      |  385 
 management/guns-core/src/main/resources/default-config.properties                                                                             |   36 
 management/guns-admin/src/main/webapp/static/layui/css/layui.mobile.css                                                                       |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/AbstractJob.java                                         |   36 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/MenuServiceImpl.java                                       |   92 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java                                         |   46 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityHistoryController.java                 |  113 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineCompanyServiceImpl.java                               |   20 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/loading.gif                                                               |    0 
 management/guns-generator/pom.xml                                                                                                             |   35 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java                                      |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAgreementServiceImpl.java                                 |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.all.min.js                                                              |  709 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/webapp/webapp.html                                                        |   53 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/PingYinUtil.java                                                              |  206 
 management/guns-admin/src/main/webapp/static/js/common/web-upload-object.js                                                                   |  126 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineMapper.java                                                    |   46 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverOnlineService.java                                       |   24 
 management/guns-admin/src/main/webapp/static/layui/images/face/32.gif                                                                         |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/DateUtil.java                                                                 |  353 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/images/success.png                                             |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre4.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/16.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverTrainMapper.xml                                       |   33 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/charts.js                                                          |  519 
 management/guns-admin/src/main/webapp/WEB-INF/view/code/code.html                                                                             |  101 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/toolbar_bg.png                                              |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java                                                |  107 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/alignicon.gif                                           |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading2.gif                                                 |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/moon/style.css                                                             |  141 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/no-data-to-display.js                                              |   12 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderTaxiService.java                                         |   81 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverServiceMapper.xml                                    |   17 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LoginLogServiceImpl.java                                   |   29 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/exporting.src.js                                 |  709 
 management/guns-admin/src/main/webapp/static/js/plugins/chartJs/Chart.min.js                                                                  |   11 
 management/guns-admin/src/main/webapp/static/netCarInfo.js                                                                                    |   69 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreement.html                                                          |  105 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysCouponActivityMapper.xml                                 |   28 
 management/guns-admin/src/main/webapp/static/crypto-js/hmac.js                                                                                |  143 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/groups.json                                                          |   56 
 management/guns-admin/src/main/webapp/static/js/jquery.sparkline 2.1.2.js                                                                     |    5 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/line_conn.gif                                                              |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_immediately.html                                                |   35 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAdvertisementMapper.xml                                    |   46 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarController.java                                  | 1045 
 management/guns-admin/src/main/webapp/static/layui/images/face/41.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.ttf                                               |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/zh-cn.js                                                             |  669 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.parse.min.js                                                            |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.flashonly.js                                  | 4176 
 management/guns-admin/src/main/webapp/static/layui/images/face/25.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverTrain.java                                                  |  120 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/drilldown.js                                       |   11 
 management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultWebConfig.java                                                       |   65 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.html                                                            |   82 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/redo.png                                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.html                                                        |   86 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/DatasourceEnum.java                                               |   15 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java                                                         |   80 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITIntegralOrderService.java                                     |   33 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts2.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre2.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/css/umeditor.min.css                                          |    8 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/snapscreen/UEditorSnapscreen.exe                                      |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-green.js                                                       |  255 
 management/guns-admin/src/main/webapp/static/modular/system/tDispatch/tDispatch.js                                                            |  226 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/eraser.png                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCharterMapper.xml                                     |   52 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DateUtil.java                                                      | 1130 
 management/guns-admin/src/main/webapp/static/crypto-js/format-openssl.js                                                                      |   18 
 management/guns-admin/src/main/webapp/static/crypto-js/pad-ansix923.js                                                                        |   49 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/success.png                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarBrandService.java                                          |   29 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarService.java                                               |   47 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict_edit.html                                                                 |   86 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/success.png                                             |    0 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/code.js                                                                        |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/map.src.js                                       | 1002 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityBalance.java                                          |  313 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/mootools-adapter.js                                               |   13 
 management/guns-admin/src/main/webapp/static/js/common/tree-table-object.js                                                                   |  136 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TVersionManagementController.java                    |  208 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineSiteMapper.java                                                |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPhone.java                                                       |   94 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INoticeService.java                                             |   23 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/preview/preview.html                                                      |   40 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/exception/ToolBoxException.java                                            |   45 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/ShiroFactroy.java                                                   |   98 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCrossCityMapper.xml                                   |  240 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/alldeletebtnhoverskin.png                                        |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/data.js                                          |   17 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/word.gif                                                    |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch_edit.html                                                       |   51 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/imglabel.png                                               |    0 
 management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.ttf                                                                    |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DeptMapper.xml                                              |   37 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.css                                                           |  635 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityMapper.xml                                    |   81 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/franchisee.html                                                            |   70 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.woff       |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/progress.png                                          |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_detail.html                                               |  496 
 management/guns-admin/src/main/webapp/static/crypto-js/rabbit.js                                                                              |  192 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TransactionDetailsServiceImpl.java                         |   48 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.js                                          | 6733 
 management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponActivity_info.js                                       |  291 
 management/guns-admin/src/main/webapp/static/img/account.png                                                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRedenvelopeServiceImpl.java                    |   20 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/background.png                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PaymentRecordMapper.xml                                     |   55 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/standalone-framework.js                           |   17 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter.html                                                    |   61 
 management/guns-admin/src/main/webapp/static/css/bootstrap.min.css                                                                            |    6 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.min.js                                                              |  264 
 management/guns-core/src/main/java/com/stylefeng/guns/core/exception/ServiceExceptionEnum.java                                                |   20 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/icon.png                                                          |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.js                                                |  754 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.parse.js                                                                | 1022 
 management/guns-admin/src/main/webapp/static/layui/images/face/50.gif                                                                         |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/ExcelExportUtil.java                                                          |  271 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system_add.html                                                            |   55 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/Handler.cs                                                         |   44 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityDiscount1ServiceImpl.java                      |  268 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/codemirror/codemirror.js                                            | 3581 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignmentCross.html                                          |   34 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords_edit.html                                     |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/README.md                                                                   |  141 
 management/guns-admin/src/main/webapp/static/layui/images/face/18.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.css                                                 |  681 
 management/guns-admin/src/main/webapp/static/img/20210511-092352.JPG                                                                          |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tNotices/tNotices_info.js                                                         |  150 
 management/guns-admin/src/main/webapp/static/modular/system/tVersionManagement/tVersionManagement.js                                          |  222 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCrossCityMapper.java                                          |   51 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineServiceImpl.java                                      |   38 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/ActionEnter.java                                      |  127 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IncomeServiceImpl.java                                     |   37 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.css                                                           |   28 
 management/guns-admin/src/main/webapp/WEB-INF/view/home.html                                                                                  |  264 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCompanyCityServiceImpl.java                               |   20 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi.html                                                          |   97 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/UserAuthenticationDict.java                          |   24 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/input.tag                                                                      |   54 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TServerCarmodel.java                                              |  125 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_add.html                                      |   40 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.ttf        |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftDriverMapper.xml                                   |   61 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_add.html                                                        |   33 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/GDInterfaceMapper.java                                              |   12 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/eraser.png                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponRecordService.java                                    |   16 
 management/guns-admin/src/main/webapp/static/modular/system/tProblem/tProblem_info.js                                                         |  111 
 management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen-sprite@2x.png                                                          |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.html                                                    |   64 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysFaceDistinguishServiceImpl.java                        |   20 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/cface.gif                                             |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.config.js                                                                 |  512 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderLogisticsMapper.java                                          |   46 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_v.gif                                              |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.min.js                                    |    9 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/tag_tips                                                                       |   22 
 management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectPrivateCarDriver.js                                               |  156 
 management/guns-admin/src/main/webapp/static/modular/system/tVersionManagement/tVersionManagement_info.js                                     |  175 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict.html                                                                      |   38 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/report/couponStatisticsInfo.html                                                    |   46 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_upload.php                                                           |   66 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/service/TableService.java                                                 |   29 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DeptWarpper.java                                                |   33 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TProblemServiceImpl.java                                   |   28 
 management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/GlobalController.java                                              |   37 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderEvaluate/tOrderEvaluate_info.js                                             |  100 
 management/guns-admin/pom.xml                                                                                                                 |  306 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml                                              |  111 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.html5only.min.js                              |    2 
 management/guns-admin/src/main/webapp/static/layui/images/face/30.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/css/plugins/bootstrap-table/bootstrap-table.min.css                                              |    1 
 management/guns-admin/src/main/webapp/static/crypto-js/pad-pkcs7.js                                                                           |   18 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/prototype-adapter.js                            |   15 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.css                                                     |   84 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.js                                                  |  754 
 management/guns-admin/src/main/webapp/static/modular/system/tSite/tSite_info.js                                                               |  376 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_assign.html                                                               |   78 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/standalone-framework.src.js                                       |  590 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_add.html                                                        |   36 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_add.html                                                      |   76 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/css/ueditor.css                                                  | 1903 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/localimage.png                                                     |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord2.html                                                  |   38 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/NoticeMapper.xml                                            |   23 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/ConfigManager.java                                    |  222 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/pagebreak.gif                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserCouponRecordMapper.xml                                  | 1291 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon.png                                                           |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/emotion.js                                                      |  186 
 management/guns-admin/src/main/webapp/static/modular/system/report/operationalData.js                                                         |   87 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysSensitiveWordsMapper.java                                       |   29 
 management/guns-admin/src/main/webapp/static/modular/system/tVerified/tVerified_info.js                                                       |  118 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany.html                                                              |   73 
 management/guns-admin/src/main/webapp/static/bitbug_favicon.ico                                                                               |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/pbkdf2.js                                                                              |  145 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.svg                                                 |   65 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.ttf                                       |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement_add.html                                      |   72 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/PlatformUtil.java                                            |  374 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/redo.png                                                  |    0 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/Menu.java                                                  |  203 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_detail.html                                           |  132 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAdvertisementController.java                        |  151 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/Order.java                                                  |   26 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/zTreeStyle.css                                                                 |   97 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/codemirror/codemirror.js                                              | 3581 
 management/guns-admin/src/main/webapp/static/js/plugins/pace/pace.min.js                                                                      |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/music.png                                                       |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.js                                                              |   56 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityOnlineController.java                  |  104 
 management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_selectCar.js                                                    |  155 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/UserDict.java                                             |   36 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/standalone-framework.js                                           |   18 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/controller.php                                                              |   59 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPubTransactionDetailsMapper.xml                            |   24 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre4.png                                                |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/rabbit-legacy.js                                                                       |  190 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAgreementMapper.java                                               |   16 
 management/guns-admin/src/main/webapp/static/modular/system/notice/notice_info.js                                                             |  127 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder.html                                                  |   61 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.css                                         |   28 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OperationLogMapper.xml                                      |   48 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserRedPacketRecordMapper.xml                               |  218 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre2.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/music.png                                                          |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_add.html                                                          |  307 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar.html                                          |   61 
 management/guns-admin/src/main/webapp/static/layui/font/iconfont.woff2                                                                        |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/index.html                                                                                 |   47 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/group.json                                                           |   57 
 management/guns-core/src/main/java/com/stylefeng/guns/core/datascope/DataScope.java                                                           |   50 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics.html                                                |   94 
 management/guns-admin/src/main/webapp/static/favicon1.ico                                                                                     |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/PathFormater.cs                                                    |   50 
 management/guns-admin/src/main/webapp/static/modular/system/driverActivity/driverActivity.js                                                  |  208 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityOnlineMapper.java                                     |   16 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/commonProblem.html                                                       |   65 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/wordpaste.png                                               |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/format-hex.js                                                                          |   66 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/localimage.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/video.js                                                       |  282 
 management/guns-admin/src/main/webapp/static/modular/system/userActivity/sysRedPacketRecord.js                                                |  104 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-unica.js                                                       |  213 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/PermissionAop.java                                                            |   70 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/form.js                                                                        |    2 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/upload1.png                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/NoticeMap.java                                            |   22 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITFeedbackService.java                                          |   32 
 management/guns-admin/src/main/webapp/static/layui/images/face/23.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/util/KaptchaUtil.java                                                             |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_v.png                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineSiteServiceImpl.java                                  |   20 
 management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/bootstrap-table-mobile.min.js                                         |    7 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord_edit.html                                 |   35 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/toolbar_bg.png                                            |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/UserDto.java                                                   |  153 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityServiceImpl.java                             |  241 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/CacheKey.java                                               |   31 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RoleServiceImpl.java                                       |   75 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java                                   |   46 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_add.html                                                        |   79 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DictMapper.xml                                              |   42 
 management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_info.js                                                         |  714 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_view.html                                                                 |   75 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/emptyH.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/layui/css/modules/laydate/default/laydate.css                                                    |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ExpenseState.java                                           |   52 
 management/guns-admin/src/main/webapp/static/layui/font/iconfont.woff                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.css                                                           |   30 
 management/guns-admin/src/main/webapp/static/layui/images/face/52.gif                                                                         |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/exception/GunsException.java                                                       |   36 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dict.java                                                         |  116 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/internal.js                                                             |   81 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DeptMapper.java                                                     |   32 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity.html                                                            |   48 
 management/guns-admin/src/main/webapp/static/modular/system/tIntegralGoods/tIntegralGoods_info.js                                             |  151 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLinePriceMapper.xml                                        |   22 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/ASPJson.class.asp                                                           |  271 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord.html                                          |   45 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PaymentRecordMapper.java                                            |   23 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/GDInterfaceServiceImpl.java                                |   39 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_immediately.html                              |   28 
 management/guns-core/src/main/java/com/stylefeng/guns/core/qr/ImgQrTool.java                                                                  |  294 
 management/guns-admin/src/main/webapp/static/layui/images/face/59.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/neweditor-tab-bg.png                                     |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/images/success.png                                           |    0 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ContextConfig.java                                         |  214 
 management/guns-admin/src/main/webapp/static/layui/images/face/7.gif                                                                          |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/sha3.js                                                                                |  326 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_txt.gif                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_pdf.gif                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts5.png                                               |    0 
 management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-2.gif                                                    |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.withoutimage.js                                               | 4993 
 management/guns-admin/src/main/webapp/static/img/index4.png                                                                                   |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tIntegralGoods/tIntegralGoods.js                                                  |  202 
 management/guns-admin/src/main/webapp/static/modular/system/tNotices/system.js                                                                |  200 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TServerCarmodelMapper.xml                                   |   35 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/emotion.css                                                       |   43 
 management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha1.js                                                                           |   18 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/instructions.html                                                        |   65 
 management/guns-admin/src/main/webapp/static/modular/system/tReassign/smallPieceLogistics.js                                                  |  325 
 management/guns-admin/src/main/webapp/static/crypto-js/sha384.js                                                                              |   83 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/model/GenQo.java                                                  |  297 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_trajectory.html                                   |   52 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord_edit.html                                                     |   31 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts.js                                              |  283 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityDiscount2ServiceImpl.java                      |   20 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/corssHtml.html                                                           |   65 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.pdb                                                     |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts0.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/modular/system/role/role_info.js                                                                 |  202 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/icons.png                                                    |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/left_focus.jpg                                          |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/neweditor-tab-bg.png                                      |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TFeedbackMapper.xml                                         |   67 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderEvaluateMapper.xml                                    |   60 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video.dev.js                                                 | 7108 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.flashonly.js                                                  | 4622 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/0.gif                                                      |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITProblemService.java                                           |   30 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts-more.js                                       |   50 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverServiceImpl.java                                    |   64 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCharterController.java                    |  109 
 management/guns-admin/src/main/webapp/static/img/index.png                                                                                    |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/68.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/tOrderTaxi_info.js                                                     |  236 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/upload.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.woff                                      |    0 
 management/guns-generator/src/main/resources/gunsTemplate/advanced/page_add.html.btl                                                          |   41 
 management/guns-admin/src/main/webapp/static/modular/system/sysRedPacketRecord/sysRedPacketRecord.js                                          |  122 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/FileType.java                                  |   31 
 management/guns-admin/src/main/webapp/static/layui/images/face/43.gif                                                                         |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/PageKit.java                                                               |   57 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/util/WoUtil.java                                                                  |   31 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.java                                                   |   16 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderPrivateCar/tOrderPrivateCar.js                                              |  379 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.ttf  |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-all.js                                                          |  462 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/empty.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/mode-ctr.js                                                                            |   58 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/heatmap.js                                         |    1 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotaterightenable.png                                              |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPubWithdrawalMapper.java                                           |   30 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineShift.java                                                   |  138 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_roleassign.html                                                           |   79 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/icon-ext.png                                                      |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tSite/tSite.js                                                                    |  231 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/HexKit.java                                                                |  254 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.js                                                        |  237 
 management/guns-admin/src/main/webapp/static/crypto-js/tripledes.js                                                                           |  779 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/image.png                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java                              |   20 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/GunsUserFilter.java                                                     |  105 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSmsrecordService.java                                         |   29 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_optDriver.html                                                      |   29 
 management/guns-admin/src/main/webapp/static/layui/images/face/29.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverLineMapper.java                                              |   26 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/PathFormat.java                                       |  157 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/link/link.html                                                            |  126 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/ObjectDict.java                                      |   28 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_edit.html                                           |   34 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/images/bg.png                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPubWithdrawalService.java                                     |   30 
 management/guns-admin/src/main/webapp/static/modular/system/tIntegralOrder/tIntegralOrder.js                                                  |  240 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement_edit.html                                             |   79 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/spacer.gif                                             |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.min.js                                                        |    3 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOperationLogService.java                                       |   24 
 management/guns-admin/src/main/webapp/static/layui/font/iconfont.ttf                                                                          |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserCouponRecordServiceImpl.java                           |  483 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSystemNoticeMapper.java                                            |   16 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.js                                                            | 8106 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_ico0.png                                                     |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/listbackground.png                                               |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role.html                                                                      |   41 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_add.html                                                |   35 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderCharteredCar/tOrderCharteredCar_info.js                                     |  107 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_edit.html                                                       |   36 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/alldeletebtnhoverskin.png                                     |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TIntegralGoodsServiceImpl.java                             |   28 
 management/guns-admin/src/main/resources/application.yml                                                                                      |  104 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/BasicType.java                                                             |   38 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineShiftService.java                                         |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/emotion.html                                                    |   54 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.js                                                  |  376 
 management/guns-admin/src/main/webapp/static/modular/system/tReassign/tReassign_info.js                                                       |  108 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSiteMapper.java                                                    |   36 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TUserRedPacketRecordServiceImpl.java                       |   20 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_trajectory.html                                               |   52 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_edit.html                                                                 |   47 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/tangram-colorpicker.png                                   |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-1.gif                                                     |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/searchreplace/searchreplace.html                                        |  102 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/QuartzManager.java                                       |  141 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityMapper.java                                             |   32 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/copy.png                                                   |    0 
 management/guns-admin/src/main/webapp/static/js/jquery.min.js                                                                                 |    4 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/colorpicker.js                                                                 |    2 
 management/guns-admin/src/main/webapp/static/car.png                                                                                          |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/NotSupportedHandler.cs                                             |   23 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityServiceImpl.java                               |  293 
 management/guns-admin/src/main/webapp/static/css/plugins/iCheck/green.png                                                                     |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/moon/default.png                                                           |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java                                                 |   39 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/jsp/controller.jsp                                                                |   14 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/addimage.png                                                       |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysCancleOrderMapper.xml                                   |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/success.gif                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDispatchService.java                                          |   35 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.js                                                            | 1143 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/success.png                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/UploadUtil.java                                         |  170 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement_edit.html                                     |   32 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/template.html                                                    |   26 
 management/guns-admin/src/main/webapp/static/layui/images/face/9.gif                                                                          |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDispatchController.java                        |  233 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/map/map.html                                                            |  135 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityRedenvelopeController.java               |  104 
 management/guns-admin/src/main/webapp/static/layui/images/face/14.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/57.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/exporting.src.js                                                   |  775 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/button.png                                                         |    0 
 management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponActivity.js                                            |  184 
 management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver_info.js                                                           |  172 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading0.gif                                                 |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/cache/ILoader.java                                                                 |   23 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Web.config                                                                  |    9 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineShiftMapper.java                                               |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCancel.java                                                  |  178 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIncomeService.java                                             |   19 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord_edit.html                                     |   34 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/image.png                                             |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/aop/MultiSourceExAop.java                                           |   77 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/button.png                                                    |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice_edit.html                                                         |   39 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/Permission.java                                                   |   22 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/spechars/spechars.js                                                      |   57 
 management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen-sprite.png                                                             |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/button.png                                                       |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OperationLogServiceImpl.java                               |   29 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/file-icons.png                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCharteredCar.java                                           |  225 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotaterightdisable.png                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarBrandController.java                             |  116 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.js                                                      |  237 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCharteredCarServiceImpl.java                         |   28 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/skins/default/laydate.css                                               |   59 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/data.src.js                                      |  582 
 management/guns-admin/src/main/webapp/static/modular/system/tUser/tUser_info.js                                                               |  218 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysRedPacketRecordMapper.xml                                |   26 
 management/guns-admin/src/main/webapp/static/js/common/bootstrap-table-object.js                                                              |  146 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TProblem.java                                                     |  137 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.xml                                                     | 8472 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java                           |   33 
 management/guns-admin/src/main/webapp/static/crypto-js/mode-cfb.js                                                                            |   80 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITReassignService.java                                          |  108 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityOnlineService.java                               |   16 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/laypage.js                                                                     |    2 
 management/guns-admin/src/main/webapp/static/crypto-js/sha512.js                                                                              |  326 
 management/guns-admin/src/main/webapp/static/modular/system/driverActivity/driverActivity_info.js                                             |  277 
 management/guns-admin/src/main/webapp/static/crypto-js/mode-ctr-gladman.js                                                                    |  116 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/drilldown.src.js                                                   |  586 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCompanyCityMapper.java                                             |   16 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/caret.png                                              |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLinePriceMapper.java                                               |   16 
 management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.woff2                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityRegisteredService.java                           |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TProblemMapper.java                                                 |   30 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLocationMapper.java                                                |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/copy.png                                                           |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_edit.html                                                                 |   58 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotaterightdisable.png                                           |    0 
 management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-0.gif                                                    |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/uploadImg.tag                                                                  |   26 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/template.css                                                     |   18 
 management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/tServerCarmodel_info.js                                           |  131 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/standalone-framework.js                         |   17 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TInvoiceServiceImpl.java                                   |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_doc.gif                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.js                                                |  376 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/tag/DictSelectorTag.java                                                          |  201 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice_edit.html                                                 |  182 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/README.md                                                                   |  115 
 management/guns-admin/src/main/webapp/static/layui/images/face/54.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_immediately.html                                |   41 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/bface.gif                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/loading.gif                                                 |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/Base64Coder.java                                             |  125 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_edit.html                                                           |  283 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderLogisticsServiceImpl.java                            |   33 
 management/guns-admin/src/main/webapp/static/img/bg.png                                                                                       |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_mv.gif                                   |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/BlackboardController.java                             |   96 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LoginLogMapper.xml                                          |   43 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/bface.gif                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineCompanyMapper.xml                                      |   19 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/success.gif                                                |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_v.png                                              |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/DataSourceContextHolder.java                                        |   35 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityBalanceService.java                                |   16 
 management/guns-core/src/main/java/com/stylefeng/guns/core/page/PageBT.java                                                                   |   65 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCharterMapper.java                                            |   33 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/button-bg.gif                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityBalanceMapper.java                                      |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/upload.png                                                      |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tLine/tLine.js                                                                    |  244 
 management/guns-admin/src/main/webapp/static/layui/images/face/27.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice.html                                                              |   63 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/word.gif                                                  |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/exception/GunsExceptionEnum.java                                                   |   59 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/wordimage.js                                                    |  157 
 management/guns-admin/src/main/webapp/static/modular/system/tNotices/tNotices.js                                                              |  171 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/MenuDict.java                                             |   34 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysReformist.java                                                |   98 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts4.png                                                 |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogFactory.java                                                       |   47 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_edit.html                                                 |  509 
 management/guns-admin/src/main/webapp/static/modular/system/tSite/electricFence.js                                                            |  329 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/MenuMapper.java                                                     |   80 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/laydate.js                                                                     |    2 
 management/guns-admin/src/main/webapp/static/layui/images/face/12.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java                 |  227 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/flow.js                                                                        |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts.src.js                                        | 16974 +
 management/guns-admin/src/main/webapp/static/modular/system/report/couponStatisticsInfo.js                                                    |  135 
 management/guns-admin/src/main/webapp/static/modular/system/dept/dept.js                                                                      |  110 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOpenCityService.java                                          |   40 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/lookDetail.html                                                          |   29 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysReformistMapper.java                                            |   16 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_add.html                                        |   65 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/funnel.src.js                                                      |  310 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/jquery.js                                                                      |    5 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system_update.html                                                         |   40 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderTaxiServiceImpl.java                                 |   56 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/SpringContextsUtil.java                                            |   37 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/Uploader.swf                                                              |    0 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/GunsCodeGenerator.java                                            |   30 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/videologo.gif                                               |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TLineController.java                            |  378 
 management/guns-admin/src/main/webapp/static/js/plugins/chosen/chosen.jquery.js                                                               | 1211 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarModelServiceImpl.java                                  |   28 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/ThreadTes.java                                                |   25 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/table.tag                                                                      |   12 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserServiceImpl.java                                       |   61 
 management/guns-admin/src/main/resources/META-INF/spring-devtools.properties                                                                  |    1 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarModelMapper.xml                                         |   38 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.flashonly.min.js                            |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TServerCarmodelMapper.java                                          |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/bg.png                                                     |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/en.js                                                                   |  684 
 management/guns-admin/src/main/webapp/static/modular/flowable/expense/expense.js                                                              |   93 
 management/guns-admin/src/main/webapp/static/css/plugins/sweetalert/sweetalert.css                                                            |  715 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/ActionState.java                               |    5 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverService.java                                            |   94 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCompanyCityService.java                                       |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/sortable.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/left_focus.jpg                                               |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict_add.html                                                                  |   64 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogObjectHolder.java                                                          |   34 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept_add.html                                                                  |   42 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/no-data-to-display.src.js                        |  128 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.custom.js                                                     | 6502 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPubWithdrawalMapper.xml                                    |   51 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarServiceImpl.java                                       |   33 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/receiveRecord.html                                                     |  296 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/4.png                                                                  |    0 
 management/guns-admin/src/main/webapp/static/img/index1.png                                                                                   |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/layim.js                                                                  |  630 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/config.json                                                                 |   94 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_default.png                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRedenvelope.java                                      |  163 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITServerCarmodelService.java                                    |   28 
 management/guns-admin/src/main/webapp/static/modular/flowable/expense/expense_info.js                                                         |   96 
 management/guns-admin/src/main/webapp/static/modular/system/tCompany/tCompany.js                                                              |  293 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/template.html                                                  |   26 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/ICheck.java                                                           |   32 
 management/guns-admin/src/main/webapp/static/modular/system/report/couponStatistics.js                                                        |  399 
 management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.eot                                               |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/upload.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/ztree/jquery.ztree.all.min.js                                                         |  165 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverServiceService.java                                     |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.min.js                                      |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cancelbutton.gif                                            |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/config/web/BeetlConfig.java                                                            |   46 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/chart.config.js                                                    |   65 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/LabelDict.java                                       |   25 
 management/guns-admin/src/main/webapp/static/css/login.css                                                                                    |   93 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.eot                                                 |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/71.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/_container.html                                                                     |  194 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow_up.png                                              |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/lib-typedarrays.js                                                                     |   76 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Income.java                                                       |  134 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotateleftdisable.png                                            |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/56.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/Uploader.Class.asp                                                          |  219 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Role.java                                                         |  127 
 management/guns-admin/src/main/resources/logback-spring.xml                                                                                   |  132 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/drilldown.src.js                                 |  447 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/emptyH.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.min.css                                             |    5 
 management/guns-admin/src/main/webapp/static/modular/system/driverActivityHistory/driverActivityHistory.js                                    |  104 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AESUtils.java                                                      |  104 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_updateFranchisee.html                                             |  278 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/UploadHandler.cs                                                   |  182 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/TokenUtil.java                                               |   95 
 management/guns-admin/src/main/webapp/static/crypto-js/hmac-md5.js                                                                            |   18 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/exporting.src.js                                   |  709 
 management/guns-admin/src/main/webapp/static/modular/flowable/process/process.js                                                              |   77 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice_add.html                                                          |   39 
 management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.ttf                                                           |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/delimg.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/file-icons.png                                               |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tUser/tUser.js                                                                    |  386 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/prototype-adapter.js                                              |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_default.png                              |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TPubWithdrawalController.java                        |  168 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserCouponRecordController.java                      |  121 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java                                                        |  402 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_edit.html                                                         |   33 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal.html                                                  |   49 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_add.html                                                                |   54 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_immediately.html                                              |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/background.png                                                   |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderLogisticsService.java                                    |   47 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_edit.html                                                       |   95 
 management/guns-admin/src/main/webapp/static/modular/system/tProblem/tProblem.js                                                              |  182 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user.html                                                                      |   80 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/music.png                                                     |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts0.png                                               |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSmsrecordController.java                            |   84 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpRequestUtil.java                                               |  182 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/close.png                                              |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/emotion.html                                                      |   54 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userCouponRecord/userCouponRecord.html                                              |   61 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineMapper.xml                                             |   66 
 management/guns-admin/src/main/webapp/static/css/patterns/shattered.png                                                                       |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarModel.java                                                    |  127 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/fface.gif                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarInsurance.java                                                 |  134 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/ObjectKit.java                                                             |   22 
 management/guns-admin/src/main/webapp/static/js/contabs.js                                                                                    |  339 
 management/guns-admin/src/main/webapp/static/js/plugins/switchery/switchery.js                                                                |    1 
 management/guns-admin/src/main/webapp/static/crypto-js/pad-iso97971.js                                                                        |   40 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.ttf  |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_updateBalance.html                                                      |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229766809036054.jpg                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineCompanyService.java                                       |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysIntegralService.java                                       |   16 
 management/guns-admin/src/main/webapp/static/css/patterns/header-profile-skin-3.png                                                           |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/pop-bg.png                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TRegionMapper.java                                                  |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow_down.png                                              |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_immediately.html                                        |   28 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_addCompany.html                                                         |   65 
 management/guns-admin/src/main/webapp/static/fonts/FontAwesome.otf                                                                            |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarMapper.xml                                              |  144 
 management/guns-admin/src/main/webapp/static/layui/images/face/64.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityInviteService.java                                 |   16 
 management/guns-admin/src/main/webapp/static/layui/images/face/47.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/QuartzTest.java                                               |   19 
 management/guns-admin/src/main/webapp/static/css/plugins/webuploader/webuploader.css                                                          |   30 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSysSensitiveWordsController.java                    |   97 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cancelbutton.gif                                          |    0 
 management/guns-admin/src/main/webapp/static/modular/system/dict/dict.js                                                                      |  104 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverMapper.xml                                           |  302 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/factory/UserFactory.java                                                |   54 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dept.java                                                         |  140 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/icons.png                                                    |    0 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/1_close.png                                                            |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.js                                                        |  671 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.ttf     |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDispatchMapper.java                                                |   35 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/index.html                                                                        |  175 
 management/guns-admin/src/main/webapp/static/layui/images/face/10.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tIntegralOrder/tIntegralOrder_info.js                                             |  106 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_edit.html                                       |   81 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LogWarpper.java                                                 |   40 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand_add.html                                                        |   30 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/BinaryUploader.java                            |   98 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/PageFactory.java                                          |   38 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/success.gif                                                |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.svg                                               |   65 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityOrderController.java                   |  104 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/StorageManager.java                            |  155 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/label.tag                                                                      |   31 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/skins/default/icon.png                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java                                                       |  109 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/userFeedback.html                                                         |   52 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord_add.html                                  |   35 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java                                  |   55 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.html                                                          |  120 
 management/guns-admin/src/main/webapp/static/modular/system/tCarBrand/tCarBrand_info.js                                                       |  134 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityHistory.java                                        |  151 
 management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/tUser.js                                                        |  238 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/util/ObsUploadUtil.java                                                           |   76 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverOnlineMapper.java                                             |   27 
 management/guns-admin/src/main/webapp/static/layui/images/face/5.gif                                                                          |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderLogistics/tOrderLogistics_info.js                                           |  149 
 management/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java                                             |  217 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/RoleDict.java                                             |   31 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video.dev.js                                               | 7108 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverMapper.java                                                  |   94 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TUserMapper.java                                                    |   58 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.config.js                                                               |  413 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.js                                      | 1256 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.custom.js                                     | 5670 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/small.html                                                             |  397 
 management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/layer.css                                                        |    2 
 management/guns-admin/src/main/webapp/static/modular/system/tDriver/punish.js                                                                 |  157 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TReassignMapper.xml                                         |  264 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_rar.gif                                    |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_detail.html                                                       |  346 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/chart.config.js                                                  |   65 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/neweditor-tab-bg.png                                        |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/index.js                                                                               |   18 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityInvite.java                                           |  174 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/hunter/FileManager.java                               |  112 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/brush.png                                                   |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysIntegralMapper.java                                             |   16 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotaterightdisable.png                                        |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityOnlineMapper.xml                              |   23 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/exporting.js                                                       |   17 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/MultiformProcessor.class.asp                                                |  138 
 management/guns-admin/src/main/webapp/static/crypto-js/hmac-ripemd160.js                                                                      |   18 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TUserRedPacketRecordMapper.java                                     |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPubWithdrawal.java                                               |  206 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/anchor.gif                                                  |    0 
 management/guns-admin/src/main/webapp/static/modular/flowable/process/process_info.js                                                         |   96 
 management/guns-admin/src/main/webapp/static/js/hplus.js                                                                                      |  294 
 management/guns-admin/src/main/webapp/static/crypto-js/mode-ecb.js                                                                            |   40 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords_add.html                                      |   22 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarServiceService.java                                        |   16 
 management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.svg                                                                    |  640 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/canvas-tools.js                                    |  133 
 management/guns-core/src/main/java/com/stylefeng/guns/core/qr/QrImage.java                                                                    |  170 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/tangram.js                                                    | 1495 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShiftDriver.java                                              |  134 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_mp3.gif                                  |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/charter_info.js                                                   |  173 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-blue.js                                                        |  254 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/success.gif                                           |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter_add.html                                                    |   47 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponRecordMapper.java                                          |   16 
 management/guns-admin/src/main/webapp/static/crypto-js/crypto-js.js                                                                           | 6191 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/icons.png                                              |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityDiscount1Service.java                              |   65 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_psd.gif                                    |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITRegionService.java                                            |   16 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord.html                                      |   61 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TServerCarmodelController.java                  |  285 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarInsuranceMapper.xml                                      |   37 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLocationService.java                                          |   22 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/demo.css                                                                       |   33 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityDiscount2Service.java                              |   16 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/chatlog.json                                                         |   30 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/GunsGeneratorConfig.java                                   |   81 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysIntegralServiceImpl.java                               |   20 
 management/guns-admin/src/main/webapp/static/modular/system/tSysSensitiveWords/tSysSensitiveWords_info.js                                     |  105 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverTrainMapper.java                                              |   15 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/images/bg.png                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITNoticesService.java                                           |   30 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLocationServiceImpl.java                                  |   58 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/prototype-adapter.src.js                                          |  381 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_edit.html                                                         |  372 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDeMapUtil.java                                                  |   85 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCityMapper.xml                                         |   65 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice.html                                                      |   52 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityRegisteredMapper.xml                          |   22 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IncomeMapper.xml                                            |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.parse.js                                                                  | 1022 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDispatchMapper.xml                                         |   60 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCharterServiceImpl.java                              |   28 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/element.js                                                                     |    2 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/SimpleTemplateEngine.java                                         |   70 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/solid-gauge.js                                                     |   13 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts2.png                                               |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/45.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.js                                                            |  192 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/controller.jsp                                                              |   14 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityBalanceController.java                   |  104 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementSmallPieceLogistics.html                                       |   65 
 management/guns-admin/src/main/webapp/static/modular/system/user/user.js                                                                      |  265 
 management/guns-admin/src/main/webapp/static/crypto-js/evpkdf.js                                                                              |  134 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/image.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/laytpl.js                                                                      |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysFaceDistinguishMapper.xml                               |   18 
 management/guns-admin/src/main/webapp/static/crypto-js/md5.js                                                                                 |  268 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/carInsuranceInfo.html                                                          |   35 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/BeetlConfiguration.java                                                     |   71 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/Encoder.java                                          |   24 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSiteMapper.xml                                             |   91 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon_ext.png                                                       |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/data.src.js                                                        |  622 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts.js                                            |  283 
 management/guns-admin/src/main/webapp/static/layui/images/face/38.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_edit.html                                             |   35 
 management/guns-admin/src/main/webapp/static/modular/system/userActivity/userActivity.js                                                      |  209 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.js                                                            |   56 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_optUser.html                                                            |   29 
 management/guns-admin/src/main/webapp/static/modular/system/tComplaint/tComplaint_info.js                                                     |  111 
 management/guns-admin/src/main/webapp/static/css/plugins/switchery/switchery.css                                                              |   32 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/empty.png                                                   |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotateleftdisable.png                                              |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/listbackground.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/standalone-framework.src.js                       |  583 
 management/guns-admin/src/main/webapp/static/layui/images/face/66.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/JwtConstants.java                                                 |   19 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineCompanyMapper.java                                             |   16 
 management/guns-core/src/main/java/com/stylefeng/guns/core/node/MenuNode.java                                                                 |  239 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite_add.html                                                                |  170 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/lock.gif                                                  |    0 
 management/guns-admin/src/main/webapp/static/layui/font/iconfont.eot                                                                          |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/slimscroll/jquery.slimscroll.min.js                                                   |   15 
 management/guns-admin/src/main/java/com/stylefeng/guns/config/SpringSessionConfig.java                                                        |   15 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/MutiStrFactory.java                                       |   96 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityDiscount1Controller.java                 |  104 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/icons.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tAgreement/tAgreement_info.js                                                     |  101 
 management/guns-admin/src/main/webapp/static/layui/images/face/3.gif                                                                          |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityHistoryMapper.xml                             |   30 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/center_focus.jpg                                        |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.woff |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter.html                                                        |   49 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.html                                              |   56 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.withoutimage.js                             | 4593 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TransactionDetails.java                                           |  164 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.html                                                |   60 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_title0.png                                                   |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/datascope/DataScopeInterceptor.java                                                |   82 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TProblemMapper.xml                                          |   42 
 management/guns-admin/src/main/webapp/static/js/plugins/wangEditor/wangEditor.js                                                              | 3967 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/layedit.js                                                                     |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TServerCarmodelServiceImpl.java                            |   28 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord_add.html                                                      |   31 
 management/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord_info.js                                           |  143 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysRedPacketRecordMapper.java                                       |   16 
 management/guns-admin/src/main/webapp/static/js/plugins/iCheck/icheck.min.js                                                                  |   11 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/cface.gif                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ConstellationUtil.java                                             |   68 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/dark-blue.js                                      |  254 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_psd.gif                                  |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementDriver.html                                                    |  105 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/success.png                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TVersionManagementMapper.xml                                |   36 
 management/guns-admin/src/main/webapp/WEB-INF/view/driverOnline.html                                                                          |   33 
 management/guns-admin/src/main/webapp/static/layui/css/layui.css                                                                              |    2 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_edit.html                                                     |   34 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/deletedisable.png                                             |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/close.png                                               |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_orderDetail.html                                  |  115 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponActivityMapper.java                                        |   16 
 management/guns-admin/src/main/webapp/WEB-INF/view/blackboard.html                                                                            |  634 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TFeedbackMapper.java                                                |   32 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/button-bg.gif                                               |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/map/show.html                                                           |  118 
 management/guns-admin/src/main/webapp/static/crypto-js/mode-ofb.js                                                                            |   54 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/alldeletebtnhoverskin.png                                          |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/wordpaste.png                                             |    0 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/8.png                                                                  |    0 
 management/guns-admin/src/test/sql/test.sql                                                                                                   |   35 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/data.js                                                            |   17 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotaterightenable.png                                            |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/db/Db.java                                                                         |  108 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/TimeJobType.java                                         |   30 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementLaw.html                                                       |   65 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java                                              |  789 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/template.js                                                    |   53 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/data.js                                            |   17 
 management/guns-admin/src/main/webapp/static/layui/images/face/60.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-more.js                                                         |   53 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.custom.min.js                                 |    2 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_detail.html                                         |  107 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre1.png                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TRegionMapper.xml                                           |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotateleftenable.png                                               |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignmentSmall.html                                          |   34 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.js                                           | 3888 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.eot        |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons.png                                                   |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarServiceMapper.java                                              |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/canvas-tools.js                                  |  133 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTaxiMapper.java                                               |   79 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_immediately.html                                                    |   87 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/CrawlerHandler.cs                                                  |  103 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderLogisticsMapper.xml                                   |  146 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/VenueLatVo.java                                         |   25 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/progress.png                                                 |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSystemPriceMapper.xml                                      |   37 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/SyntaxHighlighter/shCore.js                                         | 3655 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/extend/layer.ext.js                                                             |    2 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/smallPieceLogistics.html                                                  |   86 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java                                            |  138 
 management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectSmallDriver.js                                                    |  156 
 management/guns-core/src/main/java/com/stylefeng/guns/core/cache/EhcacheFactory.java                                                          |   86 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/pagebreak.gif                                               |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods_add.html                                              |   31 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/listbackground.png                                            |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/dark-green.js                                       |  255 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPositionMapper.xml                                    |   21 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITUserRedPacketRecordService.java                               |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/canvas-tools.src.js                              | 3113 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/scaleH.png                                                  |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord.html                                                          |   48 
 management/guns-admin/src/main/webapp/static/modular/system/sysRedPacketRecord/sysRedPacketRecord_info.js                                     |  199 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/alignicon.gif                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityOrderMapper.xml                               |   24 
 management/guns-admin/src/main/webapp/static/home.js                                                                                          |  500 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/layer.js                                                                       |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityMapper.xml                                      |   75 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept.html                                                                      |   38 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DictMapper.java                                                     |   34 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_track.html                                          |   52 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogSucceed.java                                             |   27 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogManager.java                                                               |   33 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.eot                                       |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount2.java                                        |  124 
 management/guns-admin/src/main/webapp/static/layui/images/face/21.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITVerifiedService.java                                          |   32 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/bg.png                                                       |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/1.gif                                                                          |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushURL.java                                                       |   22 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLine.java                                                        |  125 
 management/guns-admin/src/main/webapp/static/js/common/web-upload-image.js                                                                    |  124 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCity.java                                                    |  219 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.custom.min.js                                                 |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RoleMapper.xml                                              |   78 
 management/guns-admin/src/main/webapp/WEB-INF/view/blackboardBlank.html                                                                       |   59 
 management/guns-admin/src/main/webapp/static/layui/images/face/19.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/2.png                                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/GunsServletInitializer.java                                                            |   18 
 management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/BaseController.java                                                |  127 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITransactionDetailsService.java                                 |   23 
 management/guns-admin/src/main/webapp/static/layui/images/face/36.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LoginLogMapper.java                                                 |   27 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/copy.png                                                        |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_edit.html                                               |   35 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_chm.gif                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/tface.gif                                                |    0 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/WebGeneratorConfig.java                                    |   97 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/canvas-tools.src.js                                | 3113 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.html                                                        |  120 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/tOrderTaxi.js                                                          |  405 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RongCloudUtil.java                                                 |  148 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/start/TimerServerStartJob.java                                |   39 
 management/guns-admin/src/main/webapp/static/layui/images/face/34.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/dark-green.js                                     |  255 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/scale.png                                                   |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/GlobalExceptionHandler.java                                                   |  123 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/delimgH.png                                               |    0 
 management/guns-generator/src/main/resources/gunsTemplate/advanced/Controller.java.btl                                                        |   96 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/none_focus.jpg                                               |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/unhighlighted.gif                                         |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultFastjsonConfig.java                                                  |   81 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/background.png                                                     |    0 
 management/guns-admin/src/main/webapp/static/js/common/web-upload-file.js                                                                     |   40 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/loaderror.png                                             |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.html5only.min.js                            |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/config.json                                                                 |   94 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/ConfigHandler.cs                                                   |   17 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_detail.html                                         |   63 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.svg  | 1089 
 management/guns-admin/src/main/webapp/static/layui/images/face/62.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/controller.asp                                                              |   44 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/dialogbase.css                                                     |  100 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu_add.html                                                                  |   40 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/6.png                                                                  |    0 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/SqlConfig.java                                             |  194 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.js                                                    | 9789 +
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementCharterCar.html                                                |   65 
 management/guns-admin/src/main/webapp/static/modular/system/tSmsrecord/tSmsrecord.js                                                          |  158 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices_add.html                                                          |   29 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts.src.js                                          | 16974 +
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel.html                                                            |   48 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/map/map.js                                                           |  263 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineSite.java                                                    |   87 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_rar.gif                                  |    0 
 management/guns-admin/src/main/webapp/static/img/locked.png                                                                                   |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tComplaint/tComplaint.js                                                          |  239 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/util/SinataUtil.java                                                              |  385 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivityHistory/driverActivityHistory.html                                    |   25 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java                                                         |  268 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.css                                                           |    7 
 management/guns-admin/src/main/webapp/static/js/plugins/validate/zh_CN.js                                                                     |  370 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCompanyServiceImpl.java                                   |  237 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/no-data-to-display.js                            |   12 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/factory/DictFieldWarpperFactory.java                      |   33 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre0.png                                                |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tAgreement/tAgreement.js                                                          |  105 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarBrandServiceImpl.java                                  |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/icons.gif                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.css                                           |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.custom.min.js                               |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/emotion.css                                                     |   43 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserRedPacketRecordServiceImpl.java                        |  294 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/SimpleContrast.java                                                           |   58 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarServiceMapper.xml                                       |   17 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java                                  |  207 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeleteDict.java                                           |   31 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-1.gif                                                      |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/Cache.java                                                  |   15 
 management/guns-admin/src/main/webapp/WEB-INF/web.xml                                                                                         |   12 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponActivityService.java                                  |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserRedPacketRecordMapper.java                                      |   39 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/_theme.html                                                                         |   84 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineShiftMapper.xml                                        |   21 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLinePrice.java                                                   |  151 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java                                  |  525 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LoginLog.java                                                     |  128 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAgreementController.java                            |  283 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityInviteMapper.xml                                |   24 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/HttpKit.java                                                               |  195 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/scale.png                                                   |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate_add.html                                              |   33 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TInvoiceController.java                              |  125 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_chm.gif                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarBrand.java                                                    |  114 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/DateTime.java                                                              |   67 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_h.png                                                |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/qr/MatrixToImageWriter.java                                                        |  122 
 management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/DynamicDataSource.java                                              |   18 
 management/guns-admin/src/main/webapp/static/modular/system/tVerified/tVerified.js                                                            |  217 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.css                                                         |  635 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDispatchServiceImpl.java                                  |   28 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TFeedbackWarpper.java                                           |   28 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java                                                      |   79 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/jxface2.gif                                              |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/wface.gif                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/VersionDict.java                                     |   28 
 management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver.js                                                                |  307 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/index.html                                                                      |  175 
 management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponRecord.js                                              |  110 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/AbstractGeneratorConfig.java                               |  109 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TRegion.java                                                      |  109 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDeptService.java                                               |   33 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.html                                                          |   86 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysIntegralMapper.xml                                      |   17 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ManagerUser.java                                               |   97 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysReformistService.java                                      |   16 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity.html                                                      |   68 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/success.png                                           |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.min.js                                                |    6 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java                                   |  609 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_chpwd.html                                                                |   34 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqEditManager.java                                            |   60 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/NoticeWrapper.java                                              |   26 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCompany.java                                                     |  736 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_add.html                                            |   57 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.js                                            | 6733 
 management/guns-admin/src/main/webapp/static/modular/system/tCompany/franchisee.js                                                            |  270 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IGDInterfaceService.java                                        |   10 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/imageUploader.swf                                               |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/NameCon.tag                                                                    |   14 
 management/guns-admin/src/main/java/com/stylefeng/guns/config/SwaggerConfig.java                                                              |   47 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java                                                  |   91 
 management/guns-admin/src/main/webapp/static/modular/system/tInvoice/tInvoice_info.js                                                         |  106 
 management/guns-admin/src/main/webapp/static/modular/system/userActivity/addRegist.js                                                         |  110 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/mootools-adapter.src.js                         |  313 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_updatePassword.html                                                     |   24 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/bg.png                                                     |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TIntegralGoodsController.java                   |  131 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.min.map                                               |    1 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/NoticeMapper.java                                                   |   25 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.swf                                               |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysPushOrderServiceImpl.java                              |   20 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/en.js                                                                |  150 
 management/guns-admin/src/main/webapp/static/layui/images/face/49.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/css/ueditor.min.css                                                |    8 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTaxiMapper.xml                                        |  263 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/funnel.js                                                          |   13 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/filescan.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/video.css                                                      |   59 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/map/map.html                                                              |  135 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITInvoiceService.java                                           |   32 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts3.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tCarModel/tCarModel_info.js                                                       |  139 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityService.java                                       |   35 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_userDetail.html                                                         |  108 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCityBusinessMapper.xml                                 |   24 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderEvaluateMapper.java                                           |   36 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysCancleOrderMapper.java                                          |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityOrder.java                                          |  163 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/copy.png                                                      |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/codemirror/codemirror.css                                             |  104 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RoleMapper.java                                                     |   53 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.withoutimage.min.js                         |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.js                                                          |  671 
 management/guns-generator/src/main/resources/gunsTemplate/advanced/page.html.btl                                                              |   38 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/receiveRecord.html                                                   |  226 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogType.java                                                |   30 
 management/guns-admin/src/main/webapp/static/img/login-background.jpg                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.withoutimage.min.js                                           |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/deleteenable.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/music.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/sparator_v.png                                              |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts-more.js                                         |   50 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/upload.png                                                       |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel_add.html                                                        |   38 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/copy.png                                                      |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_edit.html                                           |   82 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/SyntaxHighlighter/shCore.js                                           | 3655 
 management/guns-core/src/main/java/com/stylefeng/guns/core/cache/CacheKit.java                                                                |   59 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLocationMapper.xml                                         |   29 
 management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.woff                                              |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderPrivateCar/tOrderPrivateCar_info.js                                         |  248 
 management/guns-admin/src/main/webapp/static/css/plugins/bootstrap-treetable/bootstrap-treetable.css                                          |   10 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/filescan.png                                              |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/annotations.src.js                               |  401 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCharteredCarMapper.xml                                |   72 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/log/log.html                                                                        |   48 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TComplaintServiceImpl.java                                 |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/progress.png                                               |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRedenvelopeMapper.xml                           |   24 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/progress.png                                                 |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPubTransactionDetails.java                                       |  167 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/hunter/ImageHunter.java                               |  133 
 management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/icon.png                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/upload.png                                                    |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/uploadFile.tag                                                                 |   13 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderEvaluateController.java                        |  140 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarBrandMapper.xml                                         |   37 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSystemNoticeMapper.xml                                     |   22 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine.html                                                                    |   70 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.nolog.min.js                                                  |    3 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TransactionDetailsMapper.xml                                |   18 
 management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js                                   |    7 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.xml                                            |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/mootools-adapter.src.js                           |  313 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/solid-gauge.src.js                                                 |  234 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/file-icons.gif                                        |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/annotations.js                                     |    7 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserRedPacketRecordService.java                                |   59 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity.html                                                  |   57 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.css                                                  |   32 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.html5only.js                                                  | 6030 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.css                                                         |  894 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.css                                                       |   84 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverServiceServiceImpl.java                             |   20 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand_edit.html                                                       |   30 
 management/guns-admin/src/main/webapp/static/css/bootstrap-rtl.css                                                                            | 1468 
 management/guns-admin/src/main/webapp/static/layui/images/face/24.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/MenuWarpper.java                                                |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/map/show.html                                                             |  118 
 management/guns-admin/src/main/webapp/static/js/plugins/sweetalert/sweetalert.min.js                                                          |    1 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/charts.png                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverPunish.java                                                 |   92 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityMapper.java                                           |   27 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/fClipboard_ueditor.swf                                          |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityController.java                        |  359 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityRegisteredController.java              |  104 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityBalanceServiceImpl.java                        |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.min.js                                  |    9 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel_edit.html                                                       |   39 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/addimage.png                                                     |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarModelService.java                                          |   29 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/grid-light.js                                                       |   74 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java                  |  301 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/wface.gif                                             |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tCar/carInsurance.js                                                              |  117 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity.html                                                |  109 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/videologo.gif                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarModelMapper.java                                                |   29 
 management/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity.js                                                            |  182 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponRecord.java                                              |  162 
 management/guns-admin/src/main/webapp/static/js/md5.js                                                                                        |  256 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.swf                                                 |    0 
 management/guns-admin/src/main/webapp/static/css/_fstyle.css                                                                                  |   65 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/yface.gif                                                |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/31.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderCharteredCar/tOrderCharteredCar.js                                          |  216 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice_edit.html                                                             |   39 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/tface.gif                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserRedPacketRecord.java                                          |  175 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/loading.gif                                               |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.min.js                                        |    2 
 management/guns-admin/src/main/webapp/static/js/common/laydateChoose.js                                                                       |   30 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysPushOrderMapper.xml                                     |   21 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/skies.js                                                            |   89 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_detailFranchisee.html                                             |  246 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/deleteenable.png                                                   |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/drilldown.src.js                                   |  447 
 management/guns-admin/src/main/webapp/static/layui/images/face/15.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/pad-nopadding.js                                                                       |   30 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading1.gif                                                 |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons.gif                                                   |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel_edit.html                                           |   24 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysSensitiveWordsMapper.xml                                |   32 
 management/guns-admin/src/main/webapp/static/css/plugins/iCheck/custom.css                                                                    |   59 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.nolog.js                                                      | 8012 
 management/guns-admin/src/main/webapp/static/img/loading-upload.gif                                                                           |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/alignicon.jpg                                                |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/controller.ashx                                                             |   80 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint.html                                                          |   58 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverServiceMapper.java                                           |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/map.js                                             |   27 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/mootools-adapter.js                               |   13 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/slider.js                                                                      |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLocation.java                                                    |  243 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/spechars/spechars.js                                                    |   57 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/right_focus.jpg                                              |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/taxi/TOrderTaxiController.java                               |  278 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/undoH.png                                                   |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/alignicon.jpg                                              |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.css                                                 |   94 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/DateTimeKit.java                                                           |  665 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount2Mapper.java                                    |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/spechars/spechars.html                                                  |   21 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRedenvelopeService.java                            |   16 
 management/guns-admin/src/main/webapp/static/js/common/ajax-object.js                                                                         |   66 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre1.png                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqAddManager.java                                             |   76 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/SyntaxHighlighter/shCoreDefault.css                                 |    1 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/map/map.html                                                         |  148 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOpenCityController.java                             |  293 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate_edit.html                                             |   33 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/center_focus.jpg                                             |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/heatmap.src.js                                                     |  675 
 management/guns-admin/src/main/webapp/static/crypto-js/enc-base64url.js                                                                       |  140 
 management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.svg                                                           |  288 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/DriverDict.java                                      |   34 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WoUtil.java                                             |   31 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre3.png                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java                  |  211 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRegisteredService.java                             |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NoticeServiceImpl.java                                     |   28 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/base/GunsTemplateEngine.java                                      |  126 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittd.html                                                       |   61 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video.js                                                   |  129 
 management/guns-core/src/main/java/com/stylefeng/guns/core/aop/BaseControllerExceptionHandler.java                                            |   45 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDictService.java                                               |   48 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.withoutimage.min.js                           |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCompanyMapper.xml                                          |  635 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow.png                                                   |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/mootools-adapter.js                             |   13 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.eot                                               |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Notice.java                                                       |  115 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/drilldown.js                                     |   11 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TFeedback.java                                                    |  176 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_immediately.html                                      |   41 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/right_focus.jpg                                            |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPositionService.java                                     |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysPushOrderMapper.java                                            |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityRegistered.java                                     |  137 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/deletedisable.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/icons.gif                                                    |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/StrKit.java                                                                | 1370 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/bg.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_h.gif                                                |    0 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/carousel.js                                                                    |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysFaceDistinguish.java                                          |   87 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement.html                                                  |   61 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckManager.java                                           |   50 
 management/guns-admin/src/main/webapp/static/modular/system/tSystemPrice/tSystemPrice_info.js                                                 |  477 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCrossCityService.java                                    |   54 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre3.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/pad-iso10126.js                                                                        |   44 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysPushOrder.java                                                |  126 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/emotion.js                                                   |  272 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/ListFileHandler.cs                                                 |  106 
 management/guns-admin/src/main/webapp/static/modular/system/userCouponRecord/userCouponRecord.js                                              |  146 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_edit.html                                             |  138 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/NoticeDict.java                                      |   28 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCompanyCityMapper.xml                                      |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/iframe.css                                                                 |   19 
 management/guns-admin/src/main/webapp/static/layui/images/face/22.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/UediterController.java                                |  125 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/BeanKit.java                                                               |  508 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement_add.html                                              |   58 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/mootools-adapter.src.js                                           |  321 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ResultUtil.java                                                    |  195 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCharter.java                                                |  166 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord_add.html                                      |   82 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-0.gif                                                     |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/Convert.java                                                                  | 1060 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/redoH.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittd.html                                                         |   61 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/transfer.js                                                                    |    2 
 management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/acrossCity.js                                                     |  209 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAdvertisementServiceImpl.java                             |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/tangram.js                                                      | 1495 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/success.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/17.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/validate/bootstrapValidator.min.js                                                    |   14 
 management/guns-admin/src/main/webapp/static/layui/images/face/51.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/BrandDict.java                                       |   29 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/localimage.png                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/util/ApiMenuFilter.java                                                           |   36 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/wordimage.html                                                  |  111 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java                              |  476 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TComplaintController.java                            |  186 
 management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha3.js                                                                           |   18 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/undoH.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/tree.js                                                                        |    2 
 management/guns-admin/src/main/webapp/static/modular/system/dept/dept_info.js                                                                 |  195 
 management/guns-admin/src/main/webapp/static/img/boy.gif                                                                                      |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/zh-cn.js                                                          |  150 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/left_focus.jpg                                             |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/constant/IsMenu.java                                                               |   50 
 management/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java                                                            |  205 
 management/guns-admin/src/main/webapp/static/crypto-js/pad-zeropadding.js                                                                     |   47 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/CollectionKit.java                                                         |  801 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/snapscreen/snapscreen.html                                              |   58 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/inputRequired.tag                                                              |   51 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.noimage.min.js                                                |    2 
 management/guns-admin/src/main/webapp/static/js/plugins/laydate/laydate.js                                                                    |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/skies.js                                            |   89 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAdvertisementService.java                                     |   35 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/neweditor-tab-bg.png                                       |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tNotices/system_info.js                                                           |  179 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/undo.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/sparator_v.png                                            |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroDbRealm.java                                                           |   78 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/code/code.html                                                                      |   47 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/no-data-to-display.src.js                                          |  130 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/heatmap.src.js                                     |   53 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/ReportController.java                                |  434 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_h.png                                              |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittip.html                                                      |   33 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/9.png                                                                  |    0 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/mobile.js                                                                      |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/BaseState.java                                 |   90 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount1Mapper.xml                             |  310 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/icons.gif                                               |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount2Mapper.xml                             |   21 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_add.html                                                                  |   47 
 management/guns-admin/src/main/webapp/static/layui/layui.js                                                                                   |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/dragicon.png                                                      |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.js                                                          | 1139 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.flashonly.min.js                              |    2 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/image.js                                                       |  445 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.woff                                                |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.all.js                                                                    | 29568 +++
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord.html                                                |   61 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading3.gif                                                 |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysPushOrderService.java                                      |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons-all.gif                                               |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAdvertisementMapper.java                                           |   35 
 management/guns-core/pom.xml                                                                                                                  |  156 
 management/guns-admin/src/main/webapp/static/js/common/Feng.js                                                                                |  233 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/jxface2.gif                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPhoneService.java                                             |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSmsrecord.java                                                   |  114 
 management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/annotion/DataSource.java                                            |   18 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysFaceDistinguishService.java                                |   16 
 management/guns-admin/src/main/webapp/static/modular/system/code/code.js                                                                      |   18 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/LogAop.java                                                                   |  105 
 management/guns-admin/src/main/webapp/static/css/plugins/images/sprite-skin-flat.png                                                          |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.html5only.min.js                                              |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/bg.gif                                                    |    0 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/DaoConfig.java                                             |   55 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/redoH.png                                                   |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/preview/preview.html                                                    |   40 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/center_focus.jpg                                           |    0 
 management/guns-admin/src/main/webapp/static/modular/system/log/log.js                                                                        |  105 
 management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.woff2                                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityRegisteredMapper.java                                 |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TFeedbackServiceImpl.java                                  |   28 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified.html                                                            |   59 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/emotion.css                                                  |   87 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_edit.html                                     |   40 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_add.html                                                      |   34 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.js                                                          |  192 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/rate.js                                                                        |    2 
 management/guns-admin/src/main/webapp/static/img/NoPIC.png                                                                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/prototype-adapter.src.js                          |  316 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderCrossCity/tOrderCrossCity_info.js                                           |  244 
 management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/icon-ext.png                                                     |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/28.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/44.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/Const.java                                                        |   36 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java                                                     |  129 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity_edit.html                                                |   24 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_immediately.html                                                  |   28 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts.src.js                                                          | 17696 +
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityRegisteredController.java                |  104 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/platformEdit.html                                                          |  371 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/RoleController.java                                   |  237 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/MD5.java                                                |  119 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineService.java                                              |   46 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/icons.png                                               |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JpushUtil.java                                                     |  256 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_add.html                                                  |  309 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_jpg.gif                                    |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysCancleOrderServiceImpl.java                            |   20 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_edit.html                                                               |  257 
 management/guns-admin/src/main/webapp/static/modular/system/notice/notice.js                                                                  |  106 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityDiscount2Controller.java                 |  104 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/lock.gif                                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/Uploader.class.php                                                          |  349 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_mp3.gif                                    |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/imglabel.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/sha256.js                                                                              |  199 
 management/guns-admin/src/main/webapp/static/layui/images/face/13.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.withoutimage.js                               | 4593 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow.png                                                 |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/ConstantFactory.java                                      |  356 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/gmap/gmap.html                                                          |   89 
 management/guns-admin/src/main/webapp/static/css/plugins/iCheck/green@2x.png                                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/upload2.png                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverPunishMapper.java                                             |   13 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.css                                               |  766 
 management/guns-admin/src/main/webapp/static/modular/system/tPubWithdrawal/tPubWithdrawal.js                                                  |  197 
 management/guns-admin/src/main/webapp/static/js/plugins/chartJs/echarts.simple.min.js                                                         |    1 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/bface.gif                                             |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/funnel.js                                          |   12 
 management/guns-admin/src/main/webapp/static/layui/images/face/67.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.config.js                                                           |  323 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddSensitiveWord.java                                    |   50 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ManagerStatus.java                                          |   49 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarBrandMapper.java                                                |   29 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/loading.gif                                                                |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity_add.html                                                 |   24 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroUser.java                                                              |   98 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSysReformistController.java                         |  413 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TVerifiedMapper.xml                                         |   47 
 management/guns-admin/src/main/webapp/static/modular/system/tSystemPrice/tSystemPrice.js                                                      |  229 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/BussinessLog.java                                                 |   33 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/skies.js                                          |   89 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/searchreplace/searchreplace.js                                            |  164 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCharteredCarService.java                                 |   35 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.min.css                                           |    5 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPubTransactionDetailsServiceImpl.java                     |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/size.png                                                  |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_look.html                                                           |   70 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TVersionManagement.java                                           |  127 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-2.gif                                                     |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/6.gif                                                                          |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverOnlineMapper.xml                                      |   55 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/none_focus.jpg                                             |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.custom.js                                   | 5670 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TVerifiedMapper.java                                                |   33 
 management/guns-admin/src/main/webapp/static/modular/system/userActivity/userActivity_info.js                                                 |  466 
 management/guns-admin/src/main/webapp/static/js/common/DateUtils.js                                                                           |  173 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/SendSms.java                                             |   33 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java                                        |  405 
 management/guns-admin/src/main/webapp/static/layui/images/face/58.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_edit.html                                                               |   54 
 management/guns-admin/src/main/webapp/static/modular/system/tSmsrecord/tSmsrecord_info.js                                                     |   98 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddMachine.java                                          |  185 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.css                                                           |  894 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.fis.js                                                        | 8083 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRedenvelopeMapper.java                                  |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSystemNotice.java                                                |  137 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.html                                                        |   32 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.html                                              |   60 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/Uploader.swf                                            |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts4.png                                               |    0 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/PageConfig.java                                            |   74 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_upload.asp                                                           |   29 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video.js                                                     |  129 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TNoticesServiceImpl.java                                   |   28 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/mobile/layer.js                                                                 |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/HMACSHA1Util.java                                            |   31 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/layer.css                                                         |    1 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementUser.html                                                      |   65 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/en.js                                                                     |  684 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TIntegralGoodsMapper.java                                           |   30 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate.html                                                  |   71 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPhoneServiceImpl.java                                     |   20 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderCrossCity/tOrderCrossCity.js                                                |  383 
 management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/GunsErrorView.java                                                 |   26 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/RenderUtil.java                                                               |   32 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar.html                                                                      |   90 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/exceptions/TimeException.java                                 |   37 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/training.html                                                               |   75 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DeptServiceImpl.java                                       |   49 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts1.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/53.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/canvas-tools.src.js                                                | 3113 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/config.js                                                        |   42 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSmsrecordMapper.java                                               |   29 
 management/guns-admin/src/main/java/com/stylefeng/guns/config/properties/BeetlProperties.java                                                 |  103 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser.html                                                                    |   84 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/delimg.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/charts.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/map.src.js                                         | 1002 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/upload.js                                                                      |    2 
 management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/Tip.java                                                                 |   29 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TIntegralOrder.java                                               |  166 
 management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-1.gif                                                    |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TNoticesController.java                              |  241 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TNoticesMapper.java                                                 |   30 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/table-cell-align.png                                      |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/localimage.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-3d.js                                                           |   44 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/0.gif                                                 |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRegisteredMapper.xml                            |   24 
 management/guns-admin/src/main/webapp/static/crypto-js/sha1.js                                                                                |  150 
 management/guns-admin/src/main/webapp/static/layui/images/face/42.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityOrderService.java                                |   16 
 management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha256.js                                                                         |   18 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRegistered.java                                       |  174 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/imageUploader.swf                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCompanyCity.java                                                 |  110 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_edit.html                                                       |   33 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/LogDict.java                                              |   22 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OperationLogMapper.java                                             |   26 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotaterightenable.png                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/bg.gif                                                  |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/69.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginLogController.java                               |   69 
 management/guns-core/src/main/resources/META-INF/spring.factories                                                                             |    6 
 management/guns-admin/src/main/webapp/static/js/jquery.min.map                                                                                |    1 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.html                                                 |  212 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/factory/DefaultTemplateFactory.java                                       |   61 
 management/guns-admin/src/main/webapp/static/layui/images/face/26.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysReformistMapper.xml                                     |   17 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/KaptchaController.java                                |  114 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/internal.js                                                               |   81 
 management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver.js                                                              |  567 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAgreementMapper.xml                                        |   23 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/success.gif                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/bg.png                                                       |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderLogistics/tOrderLogistics.js                                                |  366 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/alignicon.png                                         |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/qr/MatrixToImageConfig.java                                                        |   62 
 management/guns-core/src/main/java/com/stylefeng/guns/core/xss/XssFilter.java                                                                 |   42 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts5.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/tServerCarmodel.js                                                |  205 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TProblemController.java                              |  127 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.html                                                |   56 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotateleftenable.png                                             |    0 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/table.js                                                                       |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverLine.java                                                  |   93 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSiteService.java                                              |   37 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/music.png                                                     |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/dialogbase.css                                                   |  100 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TUserRedPacketRecordMapper.xml                              |   24 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/snapscreen/snapscreen.html                                                |   58 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_immediately.html                                          |   41 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices.html                                                              |   48 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityController.java                          |  447 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods.html                                                  |   61 
 management/guns-admin/src/main/webapp/static/modular/system/tCarModel/tCarModel.js                                                            |  189 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLinePriceService.java                                         |   16 
 management/guns-admin/src/main/webapp/static/crypto-js/enc-hex.js                                                                             |   18 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/upload.png                                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/standalone-framework.src.js                     |  583 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WoUtil.java                                                        |   31 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementOrder.html                                                     |   65 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/config.js                                                      |   42 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.svg     | 1738 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java                                              |  818 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/MIMEType.java                                  |   20 
 management/guns-admin/src/main/webapp/static/crypto-js/aes.js                                                                                 |  234 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_txt.gif                                  |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/enc-utf16.js                                                                           |  149 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/addimage.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_pdf.gif                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/spacer.gif                                                |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/drilldown.js                                                       |   14 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/tangram-colorpicker.png                                     |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/need/laydate.css                                                        |   75 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter_edit.html                                                   |   47 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_mv.gif                                     |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityOrderMapper.java                                      |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/prototype-adapter.src.js                        |  316 
 management/guns-admin/src/main/webapp/static/layui/images/face/11.gif                                                                         |    0 
 management/guns-generator/src/main/resources/gunsTemplate/advanced/page.js.btl                                                                |  102 
 management/guns-admin/src/main/webapp/static/layui/lay/modules/util.js                                                                        |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityOnlineServiceImpl.java                       |   20 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_add.html                                          |   89 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/yesDriver.html                                                              |   95 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TIntegralOrderController.java                   |  109 
 management/guns-admin/src/main/webapp/static/modular/system/tInvoice/tInvoice.js                                                              |  244 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TVerified.java                                                    |  137 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/searchreplace/searchreplace.js                                          |  164 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPositionServiceImpl.java                             |   20 
 management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha384.js                                                                         |   18 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITIntegralGoodsService.java                                     |   30 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Menu.java                                                         |  208 
 management/guns-admin/src/main/webapp/static/layui/images/face/8.gif                                                                          |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/images/formula.png                                           |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/upload.png                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TIntegralGoods.java                                               |  153 
 management/guns-admin/src/main/webapp/static/js/bootstrap.min.js                                                                              |    7 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPaymentRecordService.java                                      |   35 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.js                                                            |  791 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/image.png                                                    |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/_right.html                                                                         |   59 
 management/guns-generator/src/main/resources/gunsTemplate/advanced/menu_sql.sql.btl                                                           |    3 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_immediately.html                                      |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittip.html                                                        |   33 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/spechars/spechars.html                                                    |   21 
 management/guns-admin/src/main/webapp/static/crypto-js/cipher-core.js                                                                         |  890 
 management/guns-admin/src/main/webapp/static/js/common/ztree-object.js                                                                        |   94 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OperationLog.java                                                 |  154 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/ok.gif                                                 |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCrossCityServiceImpl.java                            |   58 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite_edit.html                                                               |  193 
 management/guns-admin/src/main/webapp/static/crypto-js/enc-latin1.js                                                                          |   18 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverOnline.java                                                 |  104 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.html                                                          |   32 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DictServiceImpl.java                                       |  106 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel_add.html                                            |   24 
 management/guns-admin/src/main/webapp/static/layui/images/face/55.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineShiftServiceImpl.java                                 |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/jsp/config.json                                                                   |   94 
 management/guns-admin/src/main/webapp/static/css/patterns/header-profile-skin-1.png                                                           |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponActivityServiceImpl.java                          |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_doc.gif                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/loaderror.png                                               |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice_add.html                                                              |   39 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/map.js                                           |   27 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/dragicon.png                                                        |    0 
 management/guns-admin/src/main/webapp/static/css/font-awesome.css                                                                             | 2026 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons.gif                                                 |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/0.gif                                                    |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPhoneMapper.java                                                   |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PaymentRecordServiceImpl.java                              |   64 
 management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha224.js                                                                         |   18 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/icons.gif                                                  |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity.html                                            |   68 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarModelController.java                             |  128 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/layim.css                                                                 |  158 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCityBusiness.java                                            |  141 
 management/guns-admin/src/main/webapp/static/layui/images/face/40.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/file-icons.gif                                               |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOpenCityBusinessService.java                                  |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroKit.java                                                               |  290 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/controller/CodeController.java                                            |   61 
 management/guns-admin/src/main/webapp/static/modular/system/tCompany/tCompany_info.js                                                         |  716 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/Config.cs                                                          |   55 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/icons.gif                                              |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/addimg.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/spacer.gif                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TSystemPriceController.java                     |  274 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.eot  |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/laydate.css                                                     |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserCouponRecordService.java                                   |  175 
 management/guns-admin/src/main/webapp/static/layui/css/modules/code.css                                                                       |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LogController.java                                    |   84 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/annotations.js                                   |    7 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.eot     |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/page/PageInfoBT.java                                                               |   41 
 management/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java                                          |   61 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_add.html                                              |   38 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/Base64Uploader.java                            |   52 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts1.png                                               |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/bootstrap-table.min.js                                                |    8 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Relation.java                                                     |   75 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarServiceServiceImpl.java                                |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_list.php                                                             |   92 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch_add.html                                                        |   47 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html                                                    |  554 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/data.src.js                                        |  582 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow_down.png                                            |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/emotion.js                                                        |  186 
 management/guns-admin/src/main/webapp/static/modular/system/tCar/tCar_info.js                                                                 |  550 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_add.html                                                          |   33 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/charts.js                                                        |  519 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/ActionMap.java                                 |   42 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity.html                                                     |   49 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLinePriceServiceImpl.java                                 |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/charts.html                                                        |   89 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.otf                                       |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.parse.min.js                                                              |    7 
 management/guns-admin/src/main/webapp/static/css/plugins/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css                            |  251 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/PathFormatter.class.asp                                                     |   81 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/insertframe/insertframe.html                                            |   98 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityBalanceMapper.xml                               |   31 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/addimg.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotateleftenable.png                                          |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineCompany.java                                                 |  101 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java                                             |  869 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.css                                               |  681 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.all.min.js                                                                |   18 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRelationService.java                                           |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/config/EhCacheConfig.java                                                              |   38 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon-ext.png                                                       |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tCompany/franchisee_info.js                                                       |  606 
 management/guns-admin/src/main/webapp/static/layui/images/face/48.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite.html                                                                    |   67 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/cface.gif                                                |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.eot  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityOrderServiceImpl.java                        |   20 
 management/guns-admin/src/main/webapp/static/layui/images/face/39.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysCancleOrderService.java                                    |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOpenCityBusinessServiceImpl.java                          |   20 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/IConstantFactory.java                                     |  120 
 management/guns-admin/src/main/webapp/static/crypto-js/ripemd160.js                                                                           |  267 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/icons.gif                                             |    0 
 management/guns-admin/src/main/webapp/static/modular/system/userActivity/sysCouponRecord.js                                                   |  162 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DictMap.java                                              |   24 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityHistoryServiceImpl.java                      |   27 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/config_loader.asp                                                           |   21 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu.html                                                                      |   41 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TIntegralGoodsMapper.xml                                    |   41 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/ToolUtil.java                                                                 |  582 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_xls.gif                                  |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/4.gif                                                                          |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectCrossDriver.js                                                    |  156 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/exporting.js                                       |   22 
 management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha512.js                                                                         |   18 
 management/guns-admin/src/main/webapp/static/modular/system/tReassign/tReassign.js                                                            |  325 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount1.java                                        |  137 
 management/guns-admin/src/main/resources/ehcache.xml                                                                                          |   57 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/tUser.html                                                        |   63 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/config.json                                                                 |   94 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/RestApiInteceptor.java                                                  |   62 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TVersionManagementMapper.java                                       |   29 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysCouponRecordMapper.xml                                   |   23 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IMenuService.java                                               |   94 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemPriceServiceImpl.java                               |   28 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/jxface2.gif                                           |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/metisMenu/jquery.metisMenu.js                                                         |  120 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RelationServiceImpl.java                                   |   21 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityInviteServiceImpl.java                         |   20 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCompanyMapper.java                                                 |   77 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/localimage.png                                             |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/log/login_log.html                                                                  |   47 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/grid.js                                             |  103 
 management/guns-admin/src/main/webapp/static/js/plugins/validate/additional-methods.min.js                                                    |    4 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow_up.png                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TVerifiedController.java                             |  136 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysSensitiveWordsService.java                                 |   29 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/zTreeStandard.png                                                          |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/net.sln                                                                     |   38 
 management/guns-admin/src/main/webapp/static/img/index2.png                                                                                   |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_ppt.gif                                  |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-treetable/bootstrap-treetable.js                                            |  353 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WrapperUtil.java                                        |   30 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice_add.html                                                  |  182 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOpenCityServiceImpl.java                                  |   33 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/brush.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tFeedback/tFeedback_info.js                                                       |  123 
 management/guns-admin/src/main/webapp/static/layui/images/face/63.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCityMapper.java                                                |   40 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCompanyService.java                                           |   92 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar_add.html                                                                  |  198 
 management/guns-admin/src/main/webapp/static/modular/system/menu/menu_info.js                                                                 |  175 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/OrderDict.java                                       |   33 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/UserMgrController.java                                |  451 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java                    |  132 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRegisteredMapper.java                                   |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_xls.gif                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/insertframe/insertframe.html                                              |   98 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/SendSms.java                                            |  263 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_addFranchisee.html                                                |  221 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/addRegist.html                                                         |   78 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityOnline.java                                         |  150 
 management/guns-admin/src/main/webapp/WEB-INF/view/login.html                                                                                 |  234 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/SyntaxHighlighter/shCoreDefault.css                                   |    1 
 management/guns-admin/src/main/webapp/static/modular/system/tLine/tLine_info.js                                                               |  441 
 management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/acrossCity_info.js                                                |  141 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.js                                                      | 9789 +
 management/guns-admin/src/main/webapp/static/layui/images/face/70.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/layui/layui.all.js                                                                               |    5 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PaymentRecord.java                                                |  176 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/sortable.png                                              |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/DictController.java                                   |  142 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement.html                                          |   49 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/AppInfo.java                                   |   77 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysReformistServiceImpl.java                              |   20 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCharteredCarMapper.java                                       |   35 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponRecord.html                                              |   37 
 management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.woff                                                          |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/template.js                                                      |   53 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysCouponRecordController.java                       |  140 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCharterService.java                                      |   33 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignment.html                                               |   34 
 management/guns-admin/src/main/webapp/static/css/patterns/header-profile.png                                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/content.js                                                                                    |   98 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUserRedPacketRecord.java                                         |  164 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_config.asp                                                           |    9 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TVerifiedServiceImpl.java                                  |   28 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_add.html                                                            |  257 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/anchor.gif                                                |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tSysSensitiveWords/tSysSensitiveWords.js                                          |  122 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysFaceDistinguishMapper.java                                      |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java                               | 1904 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/yface.gif                                             |    0 
 management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.woff                                                                   |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysSensitiveWordsServiceImpl.java                         |   28 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.svg                                       | 5102 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/progress.png                                               |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.ttf                                               |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.ttf                                                 |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOnlineServiceImpl.java                               |   47 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogTaskFactory.java                                                   |  102 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.js                                                   |  124 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_add.html                                              |   85 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/report/operationalData.html                                                         |   53 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPosition.java                                               |  124 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.woff |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/driverRegister.html                                                      |   65 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.css                                                 |  766 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.svg  | 1137 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityHistoryService.java                              |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/music.png                                                        |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/anchor/anchor.html                                                        |   40 
 management/guns-admin/src/main/webapp/static/modular/system/tCar/carInsuranceInfo.js                                                          |  100 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/textbg.png                                                         |    0 
 management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen.css                                                                    |  423 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/deletedisable.png                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.java                                              |   22 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/link/link.html                                                          |  126 
 management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultProperties.java                                                      |   25 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TInvoiceMapper.xml                                          |   52 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotateleftdisable.png                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/State.java                                     |   18 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/WafRequestWrapper.java                                                     |  149 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/avatar.tag                                                                     |   29 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts3.png                                               |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/DeptController.java                                   |  169 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/css/ueditor.min.css                                              |    8 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.html5only.js                                | 5559 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_add.html                                              |   35 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.noimage.js                                                    | 5026 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.css                                                       |   72 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TComplaintMapper.java                                               |   34 
 management/guns-admin/src/main/webapp/static/layui/images/face/46.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/sand-signika.js                                                     |  104 
 management/guns-admin/src/main/webapp/static/layui/images/face/2.gif                                                                          |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/enc-utf8.js                                                                            |   18 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_crawler.php                                                          |   44 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.css                                                         |   30 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TInvoiceMapper.java                                                 |   32 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods_edit.html                                             |   31 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.css                                          |  357 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/report/couponStatistics.html                                                        |  184 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_immediately.html                                      |   41 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/IShiro.java                                                         |   50 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons-all.gif                                             |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/pricingRules.html                                                        |   65 
 management/guns-admin/src/main/webapp/static/favicon.ico                                                                                      |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords.html                                          |   48 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSystemPrice.java                                                 |  127 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPubTransactionDetailsService.java                             |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemPriceService.java                                       |   28 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/TestJob.java                                                  |   23 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/fClipboard_ueditor.swf                                        |    0 
 management/guns-admin/src/main/webapp/static/layui/images/face/65.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.html                                                          |   82 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.html                                                      |   64 
 management/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/MutiDataSourceProperties.java                                    |   80 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftDriverMapper.java                                          |   31 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HuaWeiSMSUtil.java                                                 |  171 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSmsrecordMapper.xml                                        |   35 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/no-data-to-display.js                              |   12 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/heatmap.js                                       |    1 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/punish.html                                                                 |   62 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITVersionManagementService.java                                 |   29 
 management/guns-admin/src/main/webapp/static/modular/system/dict/dict_info.js                                                                 |  118 
 management/guns-admin/src/main/webapp/WEB-INF/view/404.html                                                                                   |   41 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign.html                                                            |   87 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysRedPacketRecordService.java                                 |   16 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord.html                                                   |   37 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/gray.js                                           |  257 
 management/guns-admin/src/main/webapp/static/layui/images/face/37.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/config.json                                                                 |   94 
 management/guns-admin/src/main/webapp/static/crypto-js/rc4.js                                                                                 |  139 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AddAdminLogUtil.java                                               |   26 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/none_focus.jpg                                          |    0 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/base/AbstractTemplateEngine.java                                  |  115 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OrderUtil.java                                                     |   57 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.css                                               |   94 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DictWarpper.java                                                |   36 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice.html                                                                  |   38 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TIntegralOrderMapper.java                                           |   33 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/size.png                                                    |    0 
 management/guns-admin/src/main/webapp/static/modular/system/log/login_log.js                                                                  |  123 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderCharter/tOrderCharter_info.js                                               |  106 
 management/pom.xml                                                                                                                            |  253 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/webapp/webapp.html                                                      |   53 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/videologo.gif                                          |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/tface.gif                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPubWithdrawalServiceImpl.java                             |   28 
 management/guns-admin/src/main/webapp/static/img/icon100.png                                                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/grid.js                                           |  103 
 management/guns-admin/src/main/webapp/static/modular/system/user/user_info.js                                                                 |  341 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TRegionServiceImpl.java                                    |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/bg.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.svg        | 3318 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysSensitiveWords.java                                           |   75 
 management/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java                                                                   |   51 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.html                                                        |   95 
 management/guns-admin/src/main/webapp/static/css/style.css                                                                                    | 7897 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPubTransactionDetailsMapper.java                                   |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivity.java                                                 |  146 
 management/guns-admin/src/main/webapp/static/modular/system/tFeedback/tFeedback.js                                                            |  199 
 management/guns-admin/src/main/webapp/static/crypto-js/core.js                                                                                |  807 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/heatmap.src.js                                   |   53 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.css                                                         |   72 
 management/guns-admin/src/main/webapp/static/img/user.png                                                                                     |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverLineService.java                                        |   26 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/table-cell-align.png                                        |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementRecharge.html                                                  |   65 
 management/guns-admin/src/main/webapp/static/modular/system/role/role.js                                                                      |  134 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.all.js                                                                  | 29429 +++
 management/guns-admin/src/main/webapp/static/modular/code/gen.js                                                                              |   93 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/file-icons.png                                          |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/icons.gif                                                    |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback.html                                                            |   52 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TReassign.java                                                    |  268 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_list.asp                                                             |   81 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAgreementService.java                                         |   16 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/localimage.png                                                   |    0 
 management/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord.js                                                |  133 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/SystemDict.java                                      |   20 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_immediately.html                                                |   29 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TIntegralOrderServiceImpl.java                             |   28 
 management/guns-generator/src/main/resources/gunsTemplate/advanced/page_edit.html.btl                                                         |   41 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem.html                                                              |   49 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.min.js                                       |    2 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.js                                                          |  789 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/wordimage.html                                                |  111 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/ResKit.java                                                                   |   38 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserWarpper.java                                                |   29 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/IdGenerator.java                                                              |   20 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderEvaluate.java                                               |  137 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount1Mapper.java                                    |   48 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSmsrecordServiceImpl.java                                 |   28 
 management/guns-admin/src/main/webapp/static/modular/system/tFeedback/userFeedback.js                                                         |  199 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarMapper.java                                                     |   47 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverLineMapper.xml                                       |   25 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/file-icons.png                                        |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/sha224.js                                                                              |   80 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/alignicon.png                                           |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysCouponActivityController.java                     |  276 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderEvaluateService.java                                     |   36 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TComplaint.java                                                   |  166 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_jpg.gif                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverPunishMapper.xml                                      |   24 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/select.tag                                                                     |   26 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TComplaintMapper.xml                                        |   60 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.js                                                                  | 10923 +
 management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/SessionHolderInterceptor.java                                           |   34 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TNoticesMapper.xml                                          |   42 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TInvoice.java                                                     |  212 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/MD5Util.java                                                                  |   39 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml                                       |   51 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RoleWarpper.java                                                |   27 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RelationMapper.xml                                          |   12 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysCancleOrder.java                                              |  114 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/BizExceptionEnum.java                                            |  100 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_changeOrder.html                                              |   35 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/fface.gif                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/codemirror/codemirror.css                                           |  104 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/WafKit.java                                                                |  114 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/alldeletebtnupskin.png                                             |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/carInsurance.html                                                              |   31 
 management/guns-generator/src/main/resources/gunsTemplate/advanced/page_info.js.btl                                                           |   98 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/Uploader.swf                                              |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderEvaluate/tOrderEvaluate.js                                                  |  224 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPositionMapper.java                                           |   16 
 management/guns-admin/src/main/webapp/static/layui/images/face/0.gif                                                                          |    0 
 management/guns-admin/src/main/webapp/static/css/font-awesome.min.css                                                                         |    4 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/CarDict.java                                         |   34 
 management/guns-core/src/main/java/com/stylefeng/guns/core/cache/BaseCacheFactory.java                                                        |   49 
 management/guns-core/src/main/java/com/stylefeng/guns/core/cache/ICache.java                                                                  |   40 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel.html                                                |   49 
 management/guns-admin/src/main/webapp/static/modular/system/tAdvertisement/tAdvertisement_info.js                                             |  210 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.html5only.js                                  | 5559 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/yface.gif                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuOpenStatus.java                                         |   50 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/delimgH.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/x64-core.js                                                                            |  304 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver.html                                                                |   70 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementMe.html                                                        |   65 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/success.gif                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229845748008398.jpg                         |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/SuccessTip.java                                                          |   15 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_add.html                                                                  |   62 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/util/OssUploadUtil.java                                                           |   59 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TUserRedPacketRecordController.java                  |  123 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserService.java                                               |   62 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/zTreeStandard.gif                                                          |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/unhighlighted.gif                                           |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarInsuranceMapper.java                                             |   24 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TUserMapper.xml                                             |  120 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/_tab.html                                                                           |   74 
 management/guns-core/src/main/java/com/stylefeng/guns/core/node/ZTreeNode.java                                                                |   79 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/layer.min.js                                                                    |    2 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysIntegral.java                                                 |   74 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/exporting.js                                     |   22 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserMapper.java                                                     |   61 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/snapscreen/UEditorSnapscreen.exe                                    |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/xss/XssHttpServletRequestWrapper.java                                              |   87 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/neweditor-tab-bg.png                                  |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/SqlUtil.java                                                                  |   35 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeptDict.java                                             |   28 
 management/guns-core/src/main/java/com/stylefeng/guns/core/support/ClassKit.java                                                              |  206 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IncomeMapper.java                                                   |    7 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysRedPacketRecord.java                                           |  190 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/scale.png                                                 |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/SelectCon.tag                                                                  |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExt.java                                                               |  186 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons.png                                                 |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityRegisteredServiceImpl.java                   |   20 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/GDInterfaceMapper.xml                                       |   18 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/mobile/need/layer.css                                                           |    1 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/image.png                                               |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAdvertisement.java                                               |  216 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAgreement.java                                                   |  141 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderEvaluateServiceImpl.java                             |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.dll                                                     |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept_edit.html                                                                 |   44 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/grid.js                                                             |  103 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/icons.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/css/umeditor.css                                              |  777 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/gray.js                                                             |  257 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml                                  |  168 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/gmap/gmap.html                                                            |   89 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/anchor/anchor.html                                                      |   40 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/NumUtil.java                                                                  |   89 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverLineServiceImpl.java                                |   27 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-more.src.js                                                     | 2576 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/file-icons.gif                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSite.java                                                        |  179 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/wordimage.js                                                  |  157 
 management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.svg                                               |   45 
 management/guns-admin/src/main/webapp/static/img/icons.png                                                                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.min.map                                                 |    1 
 management/guns-admin/src/main/webapp/static/layui/images/face/35.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_add.html                                                                |  243 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILoginLogService.java                                           |   24 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TransactionDetailsMapper.java                                       |    7 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_changeCar.html                                                      |   46 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityInviteController.java                    |  104 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-3d.src.js                                                       | 1352 
 management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ServiceConfig.java                                         |   91 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCharteredCarController.java               |  108 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPhoneMapper.xml                                            |   19 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.flashonly.js                                | 4176 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCar.java                                                         |  566 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/7.png                                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/funnel.js                                        |   12 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts.js                                                              |  307 
 management/guns-admin/src/main/webapp/static/img/shangchuanpic.png                                                                            |    0 
 management/guns-admin/src/main/webapp/static/modular/system/tDispatch/tDispatch_info.js                                                       |  251 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_exe.gif                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/iframe.css                                                               |    1 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.css                                                             |    7 
 management/guns-admin/src/main/webapp/static/modular/system/tReassign/tCross.js                                                               |  325 
 management/guns-admin/src/main/webapp/static/layui/images/face/20.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckFactory.java                                           |   73 
 management/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity_info.js                                                       |  309 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TNotices.java                                                     |  228 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineSiteService.java                                          |   16 
 management/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java                                                              |  175 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/FileUtil.java                                                                 |   73 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_edit.html                                                     |  108 
 management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/charter.js                                                        |  214 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/util/Contrast.java                                                                |  214 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/link/link.js                                                         |   73 
 management/guns-admin/src/main/webapp/static/img/logo.png                                                                                     |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/upload.png                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponActivity.java                                            |  249 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre0.png                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/css/ueditor.css                                                    | 1903 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderCharter/tOrderCharter.js                                                    |  222 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/scale.png                                                 |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/friend.json                                                          |  107 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserCouponRecordMapper.java                                         |   93 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.swf                                     |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/dark-blue.js                                        |  254 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-2.gif                                                      |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/funnel.src.js                                      |  289 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TIntegralOrderMapper.xml                                    |   53 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRegisteredServiceImpl.java                     |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/xss.min.js                                                            |    1 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/icons.png                                             |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/SpringContextHolder.java                                                      |   46 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java                                                   |  723 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/TimeCon.tag                                                                    |   15 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_ppt.gif                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/no-data-to-display.src.js                          |  128 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/layer.css                                                                  |    7 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.swf                                       |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_edit.html                                             |   38 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/searchreplace/searchreplace.html                                          |  102 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/charts.css                                                       |  165 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TSiteController.java                            |  285 
 management/guns-core/src/main/java/com/stylefeng/guns/core/base/warpper/BaseControllerWarpper.java                                            |   38 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysRedPacketRecord.html                                                |   36 
 management/guns-admin/src/main/webapp/static/modular/system/tPubWithdrawal/tPubWithdrawal_info.js                                             |  119 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/laydate.js                                                              |   11 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityService.java                                     |   45 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts-more.src.js                                   | 2430 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TUserController.java                                 |  588 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TVersionManagementServiceImpl.java                         |   28 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/MultiState.java                                |  112 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityHistoryMapper.java                                    |   28 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITUserService.java                                              |   57 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.woff    |    0 
 management/guns-admin/src/main/webapp/static/crypto-js/enc-base64.js                                                                          |  136 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/charts.css                                                         |  165 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar_edit.html                                                                 |  216 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/deleteenable.png                                              |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/BizLogType.java                                             |   51 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CustomWarpper.java                                              |    6 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/dialog-title-bg.png                                         |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/jquery.min.js                                                    |    6 
 management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.js                                       |   46 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/layer.ext.css                                                              |    8 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/wface.gif                                                |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/file-icons.gif                                          |    0 
 management/guns-admin/src/main/webapp/static/img/girl.gif                                                                                     |    0 
 management/guns-core/src/main/java/com/stylefeng/guns/core/util/HttpSessionHolder.java                                                        |   26 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDispatch.java                                                    |  176 
 management/guns-admin/src/main/webapp/static/modular/system/tAdvertisement/tAdvertisement.js                                                  |  296 
 management/guns-admin/src/main/webapp/static/css/plugins/validate/bootstrapValidator.min.css                                                  |   12 
 management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.eot                                                           |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system.html                                                                |   51 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/scaleH.png                                                |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/highlighted.gif                                           |    0 
 management/guns-admin/src/main/webapp/static/layui/font/iconfont.svg                                                                          |  554 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/UserDict.java                                        |   36 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch.html                                                            |   70 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_crawler.asp                                                          |   32 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts-more.src.js                                     | 2430 
 management/guns-admin/src/main/webapp/static/modular/system/tUserRedPacketRecord/tUserRedPacketRecord.js                                      |  130 
 management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/ErrorTip.java                                                            |   16 
 management/guns-admin/src/main/webapp/static/js/plugins/chartJs/echarts.min.js                                                                |    1 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/listener/ConfigListener.java                                                      |   54 
 management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/button.tag                                                                     |   30 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/highlighted.gif                                             |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCityBusinessMapper.java                                        |   16 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/heatmap.js                                                         |   23 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/3.png                                                                  |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/copy.png                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_h.gif                                              |    0 
 management/guns-admin/src/main/webapp/static/modular/system/menu/menu.js                                                                      |  119 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarService.java                                                  |   85 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponRecordServiceImpl.java                            |   20 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/util/JwtTokenUtil.java                                                            |  127 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/fface.gif                                             |    0 
 management/guns-admin/src/main/webapp/static/js/common/select-list-object.js                                                                  |   36 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/funnel.src.js                                    |  289 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriver.java                                                      |  870 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/STIXFontLicense2010.txt        |  103 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/gray.js                                             |  257 
 management/guns-admin/src/main/webapp/static/modular/system/tDriver/training.js                                                               |  211 
 management/guns-core/src/main/java/com/stylefeng/guns/core/CoreFlag.java                                                                      |   11 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_v.gif                                                |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RelationMapper.java                                                 |   16 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/5.png                                                                  |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSiteServiceImpl.java                                      |   37 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.min.js                                                  |    6 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.js                                        | 1256 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/SignUtil.java                                           |  119 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar.html                                              |  101 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/cross.html                                                                |   87 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/index.html                                                                   |  277 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/charts.html                                                      |   89 
 management/guns-admin/src/main/webapp/static/modular/system/tUserRedPacketRecord/tUserRedPacketRecord_info.js                                 |  102 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineSiteMapper.xml                                         |   18 
 management/guns-admin/src/main/webapp/static/img/password.png                                                                                 |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverService.java                                               |   74 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRoleService.java                                               |   68 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/image.png                                                    |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/MenuController.java                                   |  251 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TFeedbackController.java                             |  169 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddNotice.java                                           |   91 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/undo.png                                                    |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/image.css                                                      |   42 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityInviteMapper.java                                       |   16 
 management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/selectDriver.js                                                        |  150 
 management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/canvas-tools.js                                                    |  133 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/alldeletebtnupskin.png                                        |    0 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu_edit.html                                                                 |   42 
 management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultMultiConfig.java                                                     |   22 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuStatus.java                                             |   50 
 management/guns-admin/src/main/webapp/static/layui/images/face/33.gif                                                                         |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java                                           |  125 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/prototype-adapter.js                              |   15 
 management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/1_open.png                                                             |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/layer.js                                                                        |    2 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices_edit.html                                                         |   29 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord1.html                                                  |   37 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/annotations.src.js                                 |  401 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/Uploader.java                                  |   29 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.woff                                              |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/zh-cn.js                                                               |  669 
 management/guns-admin/src/main/webapp/static/modular/system/tCarBrand/tCarBrand.js                                                            |  190 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivity.java                                               |  146 
 management/guns-admin/src/main/webapp/WEB-INF/view/netCarInfo.html                                                                            |   25 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand.html                                                            |   48 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.html                                                      |   95 
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_add.html                                            |   82 
 management/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/InvalidKaptchaException.java                                     |   10 
 management/guns-admin/src/main/webapp/static/layui/images/face/61.gif                                                                         |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/right_focus.jpg                                         |    0 
 management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.flashonly.min.js                                              |    2 
 management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-0.gif                                                      |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_exe.gif                                    |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysRedPacketRecordServiceImpl.java                         |   20 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/dialog-title-bg.png                                       |    0 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java                        |  798 
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/MenuMapper.xml                                              |  179 
 management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.eot                                                                    |    0 
 management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/template.css                                                   |   18 
 2,210 files changed, 550,029 insertions(+), 0 deletions(-)

diff --git a/management/guns-admin/pom.xml b/management/guns-admin/pom.xml
new file mode 100644
index 0000000..d05d5a9
--- /dev/null
+++ b/management/guns-admin/pom.xml
@@ -0,0 +1,306 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+   
+
+    <artifactId>guns-admin</artifactId>
+    <name>guns-admin</name>
+    <description>guns 的spring boot版本</description>
+ 	<parent>
+        <groupId>com.stylefeng</groupId>
+        <artifactId>guns-parent</artifactId>
+        <version>1.0.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <packaging>war</packaging>
+
+    <dependencies>
+        <!--<dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+        </dependency>-->
+
+        <dependency>
+            <groupId>com.stylefeng</groupId>
+            <artifactId>guns-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.stylefeng</groupId>
+            <artifactId>guns-generator</artifactId>
+        </dependency>
+
+        <!--spring boot依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>2.9.0</version>
+        </dependency>
+
+        <!-- 导入Excel数据依赖 start -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>RELEASE</version>
+        </dependency>
+
+        <!--shiro依赖-->
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-core</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-spring</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shiro</groupId>
+            <artifactId>shiro-ehcache</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.ehcache</groupId>
+            <artifactId>ehcache</artifactId>
+        </dependency>
+
+        <!--极光推送-->
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jpush-client</artifactId>
+            <version>3.2.17</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jiguang-common</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+
+        <!--需要分布式session的话需要放开注释-->
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.session</groupId>-->
+            <!--<artifactId>spring-session-data-redis</artifactId>-->
+        <!--</dependency>-->
+        <!--<dependency>-->
+            <!--<groupId>org.springframework.boot</groupId>-->
+            <!--<artifactId>spring-boot-starter-data-redis</artifactId>-->
+        <!--</dependency>-->
+
+        <dependency>
+            <groupId>com.github.penggle</groupId>
+            <artifactId>kaptcha</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.ibeetl</groupId>
+            <artifactId>beetl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+        </dependency>
+		<dependency>
+		    <groupId>commons-io</groupId>
+		    <artifactId>commons-io</artifactId>
+		    <version>2.6</version>
+		</dependency>
+
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>2.5.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+            <version>2.2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.rongcloud.im</groupId>
+            <artifactId>server-sdk-java</artifactId>
+            <version>3.0.4</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+        </dependency>
+
+        <!--引入本地工行支付jar start-->
+        <dependency>
+            <groupId>com.icbc</groupId>
+            <artifactId>icbc</artifactId>
+            <version>v2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/icbc-api-sdk-cop.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.icbc.api</groupId>
+            <artifactId>icbc</artifactId>
+            <version>v2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/icbc-api-sdk-cop-io.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.infosec</groupId>
+            <artifactId>icbc</artifactId>
+            <version>v2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/icbc-ca.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.infosecCrypto</groupId>
+            <artifactId>icbc</artifactId>
+            <version>v2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/InfosecCrypto_Java1_02_JDK14+.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>proguard</groupId>
+            <artifactId>icbc</artifactId>
+            <version>v2</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/lib/proguard.jar</systemPath>
+        </dependency>
+        <!--引入本地工行支付jar end-->
+    </dependencies>
+
+
+
+
+    <build>
+        <!--<plugins>-->
+            <!--<plugin>-->
+                <!--<groupId>org.springframework.boot</groupId>-->
+                <!--<artifactId>spring-boot-maven-plugin</artifactId>-->
+                <!--<configuration>-->
+                    <!--<fork>true</fork>&lt;!&ndash; 如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart &ndash;&gt;-->
+                <!--</configuration>-->
+            <!--</plugin>-->
+            <!--<plugin>-->
+			    <!--<groupId>org.apache.maven.plugins</groupId>-->
+			    <!--<artifactId>maven-surefire-plugin</artifactId>-->
+			    <!--<configuration>-->
+			     	<!--<skip>true</skip>-->
+			    <!--</configuration>-->
+		    <!--</plugin>-->
+        <!--</plugins>-->
+
+        <!--打包war包引入本地jar的打包方式-->
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <configuration>
+                    <!-- 设置成false,否则检查web.xml是否存在。因为springboot是没有web.xml的 -->
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <!--打包后的项目名-->
+                    <!--<warName>example</warName>-->
+                    <webResources>
+                        <resource>
+                            <!--把本地lib里面的jar复制到lib-->
+                            <directory>${project.basedir}/lib</directory>
+                            <targetPath>WEB-INF/lib/</targetPath>
+                            <includes>
+                                <include>**/*.jar</include>
+                            </includes>
+                        </resource>
+                    </webResources>
+                </configuration>
+            </plugin>
+        </plugins>
+
+        <resources>
+            <resource>
+                <directory>lib</directory>
+                <targetPath>/BOOT-INF/lib/</targetPath>
+                <includes>
+                    <include>**/*.jar</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/webapp</directory>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
+
+</project>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java b/management/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java
new file mode 100644
index 0000000..e3b45f4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java
@@ -0,0 +1,51 @@
+package com.stylefeng.guns;
+
+import org.apache.http.client.HttpClient;
+import org.apache.http.config.SocketConfig;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * SpringBoot方式启动类
+ *
+ * @author stylefeng
+ * @Date 2017/5/21 12:06
+ */
+@EnableScheduling//开启定时任务
+@SpringBootApplication
+public class GunsApplication {
+
+    private final static Logger logger = LoggerFactory.getLogger(GunsApplication.class);
+
+    public static void main(String[] args) {
+        SpringApplication.run(GunsApplication.class, args);
+        logger.info("GunsApplication is success!"); 
+    }
+
+    @Bean //通过ip地址调用
+    public RestTemplate restTemplate() {
+        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
+        connectionManager.setDefaultSocketConfig(SocketConfig.custom().setTcpNoDelay(true).build());
+        connectionManager.setDefaultMaxPerRoute(100);//最大并发连接
+        connectionManager.setMaxTotal(200); // 总的最大连接数
+        HttpClient httpClient = HttpClientBuilder.create().setConnectionManager(connectionManager).build();
+        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
+        httpRequestFactory.setConnectionRequestTimeout(30 * 1000);
+        httpRequestFactory.setConnectTimeout(30 * 3000);
+        httpRequestFactory.setReadTimeout(30 * 3000);
+        RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
+        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
+        return restTemplate;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/GunsServletInitializer.java b/management/guns-admin/src/main/java/com/stylefeng/guns/GunsServletInitializer.java
new file mode 100644
index 0000000..18e63c5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/GunsServletInitializer.java
@@ -0,0 +1,18 @@
+package com.stylefeng.guns;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * Guns Web程序启动类
+ *
+ * @author fengshuonan
+ * @date 2017-05-21 9:43
+ */
+public class GunsServletInitializer extends SpringBootServletInitializer {
+
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
+        return builder.sources(GunsApplication.class);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/config/EhCacheConfig.java b/management/guns-admin/src/main/java/com/stylefeng/guns/config/EhCacheConfig.java
new file mode 100644
index 0000000..34616c6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/config/EhCacheConfig.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.config;
+
+import net.sf.ehcache.CacheManager;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.ehcache.EhCacheCacheManager;
+import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+
+/**
+ * ehcache配置
+ *
+ * @author fengshuonan
+ * @date 2017-05-20 23:11
+ */
+@Configuration
+@EnableCaching
+public class EhCacheConfig {
+
+    /**
+     * EhCache的配置
+     */
+    @Bean
+    public EhCacheCacheManager cacheManager(CacheManager cacheManager) {
+        return new EhCacheCacheManager(cacheManager);
+    }
+
+    /**
+     * EhCache的配置
+     */
+    @Bean
+    public EhCacheManagerFactoryBean ehcache() {
+        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
+        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
+        return ehCacheManagerFactoryBean;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/config/SpringSessionConfig.java b/management/guns-admin/src/main/java/com/stylefeng/guns/config/SpringSessionConfig.java
new file mode 100644
index 0000000..ef9a5bc
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/config/SpringSessionConfig.java
@@ -0,0 +1,15 @@
+package com.stylefeng.guns.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+
+/**
+ * spring session配置
+ *
+ * @author fengshuonan
+ * @date 2017-07-13 21:05
+ */
+//@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)  //session过期时间  如果部署多机环境,需要打开注释
+@ConditionalOnProperty(prefix = "guns", name = "spring-session-open", havingValue = "true")
+public class SpringSessionConfig {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/config/SwaggerConfig.java b/management/guns-admin/src/main/java/com/stylefeng/guns/config/SwaggerConfig.java
new file mode 100644
index 0000000..e02e7aa
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/config/SwaggerConfig.java
@@ -0,0 +1,47 @@
+package com.stylefeng.guns.config;
+
+import io.swagger.annotations.ApiOperation;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * swagger配置类
+ *
+ * @author fengshuonan
+ * @date 2017年6月1日19:42:59
+ */
+@Configuration
+@EnableSwagger2
+@ConditionalOnProperty(prefix = "guns", name = "swagger-open", havingValue = "true")
+public class SwaggerConfig{
+
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))                         //这里采用包含注解的方式来确定要显示的接口
+                //.apis(RequestHandlerSelectors.basePackage("com.stylefeng.guns.controller.system.controller"))    //这里采用包扫描的方式来确定要显示的接口
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("Guns Doc")
+                .description("Guns Api文档")
+                .termsOfServiceUrl("http://git.oschina.net/naan1993/guns")
+                .contact("stylefeng")
+                .version("2.0")
+                .build();
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java b/management/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java
new file mode 100644
index 0000000..8c50753
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java
@@ -0,0 +1,125 @@
+package com.stylefeng.guns.config.datasource;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor;
+import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
+import com.stylefeng.guns.core.config.properties.DruidProperties;
+import com.stylefeng.guns.core.config.properties.MutiDataSourceProperties;
+import com.stylefeng.guns.core.datascope.DataScopeInterceptor;
+import com.stylefeng.guns.core.mutidatasource.DynamicDataSource;
+import com.stylefeng.guns.core.mutidatasource.aop.MultiSourceExAop;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import java.sql.SQLException;
+import java.util.HashMap;
+
+/**
+ * 多数据源配置<br/>
+ * <p>
+ * 注:由于引入多数据源,所以让spring事务的aop要在多数据源切换aop的后面
+ *
+ * @author stylefeng
+ * @Date 2017/5/20 21:58
+ */
+@Configuration
+@ConditionalOnProperty(prefix = "guns.muti-datasource", name = "open", havingValue = "true")
+@EnableTransactionManagement(order = 2)
+@MapperScan(basePackages = {"com.stylefeng.guns.modular.system.dao"})
+public class MultiDataSourceConfig {
+
+    @Bean
+    @ConfigurationProperties(prefix = "guns.muti-datasource")
+    public MutiDataSourceProperties mutiDataSourceProperties() {
+        return new MutiDataSourceProperties();
+    }
+
+    @Bean
+    public MultiSourceExAop multiSourceExAop() {
+        return new MultiSourceExAop();
+    }
+
+    /**
+     * guns的数据源
+     */
+    private DruidDataSource dataSource(DruidProperties druidProperties) {
+        DruidDataSource dataSource = new DruidDataSource();
+        druidProperties.config(dataSource);
+        return dataSource;
+    }
+
+    /**
+     * 多数据源,第二个数据源
+     */
+    private DruidDataSource bizDataSource(DruidProperties druidProperties, MutiDataSourceProperties mutiDataSourceProperties) {
+        DruidDataSource dataSource = new DruidDataSource();
+        druidProperties.config(dataSource);
+        mutiDataSourceProperties.config(dataSource);
+        return dataSource;
+    }
+
+    /**
+     * 多数据源连接池配置
+     */
+    @Bean
+    public DynamicDataSource mutiDataSource(DruidProperties druidProperties, MutiDataSourceProperties mutiDataSourceProperties) {
+
+        DruidDataSource dataSourceGuns = dataSource(druidProperties);
+        DruidDataSource bizDataSource = bizDataSource(druidProperties, mutiDataSourceProperties);
+
+        try {
+            dataSourceGuns.init();
+            bizDataSource.init();
+        } catch (SQLException sql) {
+            sql.printStackTrace();
+        }
+
+        DynamicDataSource dynamicDataSource = new DynamicDataSource();
+        HashMap<Object, Object> hashMap = new HashMap<>();
+        hashMap.put(mutiDataSourceProperties.getDataSourceNames()[0], dataSourceGuns);
+        hashMap.put(mutiDataSourceProperties.getDataSourceNames()[1], bizDataSource);
+        dynamicDataSource.setTargetDataSources(hashMap);
+        dynamicDataSource.setDefaultTargetDataSource(dataSourceGuns);
+        return dynamicDataSource;
+    }
+
+    /**
+     * mybatis-plus分页插件
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return new PaginationInterceptor();
+    }
+
+    /**
+     * 数据范围mybatis插件
+     */
+    @Bean
+    public DataScopeInterceptor dataScopeInterceptor() {
+        return new DataScopeInterceptor();
+    }
+
+    /**
+     * 乐观锁mybatis插件
+     */
+    @Bean
+    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
+        return new OptimisticLockerInterceptor();
+    }
+
+    /**
+     * 事务配置
+     *
+     * @author stylefeng
+     * @Date 2018/6/27 23:11
+     */
+    @Bean
+    public DataSourceTransactionManager dataSourceTransactionManager(DynamicDataSource mutiDataSource) {
+        return new DataSourceTransactionManager(mutiDataSource);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java b/management/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java
new file mode 100644
index 0000000..b09ddbf
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java
@@ -0,0 +1,61 @@
+package com.stylefeng.guns.config.datasource;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor;
+import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
+import com.stylefeng.guns.core.config.properties.DruidProperties;
+import com.stylefeng.guns.core.datascope.DataScopeInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * 多数据源配置
+ *
+ * @author stylefeng
+ * @Date 2017/5/20 21:58
+ */
+@Configuration
+@ConditionalOnProperty(prefix = "guns.muti-datasource", name = "open", havingValue = "false", matchIfMissing = true)
+@EnableTransactionManagement
+@MapperScan(basePackages = {"com.stylefeng.guns.modular.system.dao"})
+public class SingleDataSourceConfig {
+
+    /**
+     * 单数据源连接池配置
+     */
+    @Bean
+    public DruidDataSource dataSource(DruidProperties druidProperties) {
+        DruidDataSource dataSource = new DruidDataSource();
+        druidProperties.config(dataSource);
+        return dataSource;
+    }
+
+    /**
+     * mybatis-plus分页插件
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return new PaginationInterceptor();
+    }
+
+    /**
+     * 数据范围mybatis插件
+     */
+    @Bean
+    public DataScopeInterceptor dataScopeInterceptor() {
+        return new DataScopeInterceptor();
+    }
+
+    /**
+     * 乐观锁mybatis插件
+     */
+    @Bean
+    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
+        return new OptimisticLockerInterceptor();
+    }
+
+}
+
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/config/properties/BeetlProperties.java b/management/guns-admin/src/main/java/com/stylefeng/guns/config/properties/BeetlProperties.java
new file mode 100644
index 0000000..e1dc4cb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/config/properties/BeetlProperties.java
@@ -0,0 +1,103 @@
+package com.stylefeng.guns.config.properties;
+
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Properties;
+
+/**
+ * beetl配置(如果需要配置别的配置可参照这个形式自己添加)
+ *
+ * @author fengshuonan
+ * @date 2017-05-24 20:37
+ */
+@Configuration
+@ConfigurationProperties(prefix = BeetlProperties.BEETLCONF_PREFIX)
+public class BeetlProperties {
+
+    public static final String BEETLCONF_PREFIX = "beetl";
+
+    private String delimiterStatementStart;
+
+    private String delimiterStatementEnd;
+
+    private String resourceTagroot;
+
+    private String resourceTagsuffix;
+
+    private String resourceAutoCheck;
+
+    @Value("${spring.mvc.view.prefix}")
+    private String prefix;
+
+    public Properties getProperties(){
+        Properties properties = new Properties();
+        if(ToolUtil.isNotEmpty(delimiterStatementStart)){
+            if(delimiterStatementStart.startsWith("\\")){
+                delimiterStatementStart = delimiterStatementStart.substring(1);
+            }
+            properties.setProperty("DELIMITER_STATEMENT_START",delimiterStatementStart);
+        }
+        if(ToolUtil.isNotEmpty(delimiterStatementEnd)){
+            properties.setProperty("DELIMITER_STATEMENT_END",delimiterStatementEnd);
+        }else{
+            properties.setProperty("DELIMITER_STATEMENT_END","null");
+        }
+        if(ToolUtil.isNotEmpty(resourceTagroot)){
+            properties.setProperty("RESOURCE.tagRoot",resourceTagroot);
+        }
+        if(ToolUtil.isNotEmpty(resourceTagsuffix)){
+            properties.setProperty("RESOURCE.tagSuffix",resourceTagsuffix);
+        }
+        if(ToolUtil.isNotEmpty(resourceAutoCheck)){
+            properties.setProperty("RESOURCE.autoCheck",resourceAutoCheck);
+        }
+        return properties;
+    }
+
+    public String getPrefix() {
+        return prefix;
+    }
+
+    public String getDelimiterStatementStart() {
+        return delimiterStatementStart;
+    }
+
+    public void setDelimiterStatementStart(String delimiterStatementStart) {
+        this.delimiterStatementStart = delimiterStatementStart;
+    }
+
+    public String getDelimiterStatementEnd() {
+        return delimiterStatementEnd;
+    }
+
+    public void setDelimiterStatementEnd(String delimiterStatementEnd) {
+        this.delimiterStatementEnd = delimiterStatementEnd;
+    }
+
+    public String getResourceTagroot() {
+        return resourceTagroot;
+    }
+
+    public void setResourceTagroot(String resourceTagroot) {
+        this.resourceTagroot = resourceTagroot;
+    }
+
+    public String getResourceTagsuffix() {
+        return resourceTagsuffix;
+    }
+
+    public void setResourceTagsuffix(String resourceTagsuffix) {
+        this.resourceTagsuffix = resourceTagsuffix;
+    }
+
+    public String getResourceAutoCheck() {
+        return resourceAutoCheck;
+    }
+
+    public void setResourceAutoCheck(String resourceAutoCheck) {
+        this.resourceAutoCheck = resourceAutoCheck;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsProperties.java b/management/guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsProperties.java
new file mode 100644
index 0000000..df80c8a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/config/properties/GunsProperties.java
@@ -0,0 +1,129 @@
+package com.stylefeng.guns.config.properties;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+
+import static com.stylefeng.guns.core.util.ToolUtil.getTempPath;
+import static com.stylefeng.guns.core.util.ToolUtil.isEmpty;
+
+/**
+ * guns项目配置
+ *
+ * @author stylefeng
+ * @Date 2017/5/23 22:31
+ */
+@Component
+@ConfigurationProperties(prefix = GunsProperties.PREFIX)
+public class GunsProperties {
+
+    public static final String PREFIX = "guns";
+
+    private Boolean kaptchaOpen = false;
+
+    private Boolean swaggerOpen = false;
+
+    // 文件上传位置配置
+    private String fileUploadPath;
+
+    // 文件服务器访问地址
+    private String pictureServerAddress;
+
+    private Boolean haveCreatePath = false;
+
+    private Boolean springSessionOpen = false;
+
+    /**
+     * session 失效时间(默认为30分钟 单位:秒)
+     */
+    private Integer sessionInvalidateTime = 30 * 60;
+
+    /**
+     * session 验证失效时间(默认为15分钟 单位:秒)
+     */
+    private Integer sessionValidationInterval = 15 * 60;
+    /**
+     *前端接口调用基础路径
+     */
+    private String restUrl;
+
+    public String getFileUploadPath() {
+        //如果没有写文件上传路径,保存到临时目录
+        if (isEmpty(fileUploadPath)) {
+            return getTempPath();
+        } else {
+            //判断有没有结尾符,没有得加上
+            if (!fileUploadPath.endsWith(File.separator)) {
+                fileUploadPath = fileUploadPath + File.separator;
+            }
+            //判断目录存不存在,不存在得加上
+            if (!haveCreatePath) {
+                File file = new File(fileUploadPath);
+                file.mkdirs();
+                haveCreatePath = true;
+            }
+            return fileUploadPath;
+        }
+    }
+
+    public void setFileUploadPath(String fileUploadPath) {
+        this.fileUploadPath = fileUploadPath;
+    }
+
+    public String getPictureServerAddress() {
+        return pictureServerAddress;
+    }
+
+    public void setPictureServerAddress(String pictureServerAddress) {
+        this.pictureServerAddress = pictureServerAddress;
+    }
+
+    public Boolean getKaptchaOpen() {
+        return kaptchaOpen;
+    }
+
+    public void setKaptchaOpen(Boolean kaptchaOpen) {
+        this.kaptchaOpen = kaptchaOpen;
+    }
+
+    public Boolean getSwaggerOpen() {
+        return swaggerOpen;
+    }
+
+    public void setSwaggerOpen(Boolean swaggerOpen) {
+        this.swaggerOpen = swaggerOpen;
+    }
+
+    public Boolean getSpringSessionOpen() {
+        return springSessionOpen;
+    }
+
+    public void setSpringSessionOpen(Boolean springSessionOpen) {
+        this.springSessionOpen = springSessionOpen;
+    }
+
+    public Integer getSessionInvalidateTime() {
+        return sessionInvalidateTime;
+    }
+
+    public void setSessionInvalidateTime(Integer sessionInvalidateTime) {
+        this.sessionInvalidateTime = sessionInvalidateTime;
+    }
+
+    public Integer getSessionValidationInterval() {
+        return sessionValidationInterval;
+    }
+
+    public void setSessionValidationInterval(Integer sessionValidationInterval) {
+        this.sessionValidationInterval = sessionValidationInterval;
+    }
+
+    public String getRestUrl() {
+        return restUrl;
+    }
+
+    public void setRestUrl(String restUrl) {
+        this.restUrl = restUrl;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/BeetlConfig.java b/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/BeetlConfig.java
new file mode 100644
index 0000000..748ed06
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/BeetlConfig.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.config.web;
+
+import com.stylefeng.guns.config.properties.BeetlProperties;
+import com.stylefeng.guns.core.beetl.BeetlConfiguration;
+import org.beetl.core.resource.ClasspathResourceLoader;
+import org.beetl.ext.spring.BeetlSpringViewResolver;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * web 配置类
+ *
+ * @author fengshuonan
+ * @date 2016年11月12日 下午5:03:32
+ */
+@Configuration
+public class BeetlConfig {
+
+    @Autowired
+    BeetlProperties beetlProperties;
+
+    /**
+     * beetl的配置
+     */
+    @Bean(initMethod = "init")
+    public BeetlConfiguration beetlConfiguration() {
+        BeetlConfiguration beetlConfiguration = new BeetlConfiguration();
+        beetlConfiguration.setResourceLoader(new ClasspathResourceLoader(BeetlConfig.class.getClassLoader(), beetlProperties.getPrefix()));
+        beetlConfiguration.setConfigProperties(beetlProperties.getProperties());
+        return beetlConfiguration;
+    }
+
+    /**
+     * beetl的视图解析器
+     */
+    @Bean
+    public BeetlSpringViewResolver beetlViewResolver() {
+        BeetlSpringViewResolver beetlSpringViewResolver = new BeetlSpringViewResolver();
+        beetlSpringViewResolver.setConfig(beetlConfiguration());
+        beetlSpringViewResolver.setContentType("text/html;charset=UTF-8");
+        beetlSpringViewResolver.setOrder(0);
+        return beetlSpringViewResolver;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java b/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java
new file mode 100644
index 0000000..ad068ae
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java
@@ -0,0 +1,205 @@
+package com.stylefeng.guns.config.web;
+
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.intercept.GunsUserFilter;
+import com.stylefeng.guns.core.shiro.ShiroDbRealm;
+import org.apache.shiro.cache.CacheManager;
+import org.apache.shiro.cache.ehcache.EhCacheManager;
+import org.apache.shiro.codec.Base64;
+import org.apache.shiro.session.mgt.SessionManager;
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.CookieRememberMeManager;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.apache.shiro.web.servlet.Cookie;
+import org.apache.shiro.web.servlet.ShiroHttpSession;
+import org.apache.shiro.web.servlet.SimpleCookie;
+import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+import org.apache.shiro.web.session.mgt.ServletContainerSessionManager;
+import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.Filter;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * shiro权限管理的配置
+ *
+ * @author fengshuonan
+ * @date 2016年11月14日 下午3:03:44
+ */
+@Configuration
+public class ShiroConfig {
+
+    /**
+     * 安全管理器
+     */
+    @Bean
+    public DefaultWebSecurityManager securityManager(CookieRememberMeManager rememberMeManager, CacheManager cacheShiroManager, SessionManager sessionManager) {
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+        securityManager.setRealm(this.shiroDbRealm());
+        securityManager.setCacheManager(cacheShiroManager);
+        securityManager.setRememberMeManager(rememberMeManager);
+        securityManager.setSessionManager(sessionManager);
+        return securityManager;
+    }
+
+    /**
+     * spring session管理器(多机环境)
+     */
+    @Bean
+    @ConditionalOnProperty(prefix = "guns", name = "spring-session-open", havingValue = "true")
+    public ServletContainerSessionManager servletContainerSessionManager() {
+        return new ServletContainerSessionManager();
+    }
+
+    /**
+     * session管理器(单机环境)
+     */
+    @Bean
+    @ConditionalOnProperty(prefix = "guns", name = "spring-session-open", havingValue = "false")
+    public DefaultWebSessionManager defaultWebSessionManager(CacheManager cacheShiroManager, GunsProperties gunsProperties) {
+        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
+        sessionManager.setCacheManager(cacheShiroManager);
+        sessionManager.setSessionValidationInterval(gunsProperties.getSessionValidationInterval() * 1000);
+        sessionManager.setGlobalSessionTimeout(gunsProperties.getSessionInvalidateTime() * 1000);
+        sessionManager.setDeleteInvalidSessions(true);
+        sessionManager.setSessionValidationSchedulerEnabled(true);
+        Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
+        cookie.setName("shiroCookie");
+        cookie.setHttpOnly(true);
+        sessionManager.setSessionIdCookie(cookie);
+        return sessionManager;
+    }
+
+    /**
+     * 缓存管理器 使用Ehcache实现
+     */
+    @Bean
+    public CacheManager getCacheShiroManager(EhCacheManagerFactoryBean ehcache) {
+        EhCacheManager ehCacheManager = new EhCacheManager();
+        ehCacheManager.setCacheManager(ehcache.getObject());
+        return ehCacheManager;
+    }
+
+    /**
+     * 项目自定义的Realm
+     */
+    @Bean
+    public ShiroDbRealm shiroDbRealm() {
+        return new ShiroDbRealm();
+    }
+
+    /**
+     * rememberMe管理器, cipherKey生成见{@code Base64Test.java}
+     */
+    @Bean
+    public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) {
+        CookieRememberMeManager manager = new CookieRememberMeManager();
+        manager.setCipherKey(Base64.decode("Z3VucwAAAAAAAAAAAAAAAA=="));
+        manager.setCookie(rememberMeCookie);
+        return manager;
+    }
+
+    /**
+     * 记住密码Cookie
+     */
+    @Bean
+    public SimpleCookie rememberMeCookie() {
+        SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
+        simpleCookie.setHttpOnly(true);
+        simpleCookie.setMaxAge(7 * 24 * 60 * 60);//7天
+        return simpleCookie;
+    }
+
+    /**
+     * Shiro的过滤器链
+     */
+    @Bean
+    public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) {
+        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
+        shiroFilter.setSecurityManager(securityManager);
+        /**
+         * 默认的登陆访问url
+         */
+        shiroFilter.setLoginUrl("/login");
+        /**
+         * 登陆成功后跳转的url
+         */
+        shiroFilter.setSuccessUrl("/");
+        /**
+         * 没有权限跳转的url
+         */
+        shiroFilter.setUnauthorizedUrl("/global/error");
+
+        /**
+         * 覆盖默认的user拦截器(默认拦截器解决不了ajax请求 session超时的问题,若有更好的办法请及时反馈作者)
+         */
+        HashMap<String, Filter> myFilters = new HashMap<>();
+        myFilters.put("user", new GunsUserFilter());
+        shiroFilter.setFilters(myFilters);
+
+        /**
+         * 配置shiro拦截器链
+         *
+         * anon  不需要认证
+         * authc 需要认证
+         * user  验证通过或RememberMe登录的都可以
+         *
+         * 当应用开启了rememberMe时,用户下次访问时可以是一个user,但不会是authc,因为authc是需要重新认证的
+         *
+         * 顺序从上到下,优先级依次降低
+         *
+         * api开头的接口,走rest api鉴权,不走shiro鉴权
+         *
+         */
+        Map<String, String> hashMap = new LinkedHashMap<>();
+        hashMap.put("/static/**", "anon");
+        hashMap.put("/gunsApi/**", "anon");
+        hashMap.put("/login", "anon");
+        hashMap.put("/global/sessionError", "anon");
+        hashMap.put("/kaptcha", "anon");
+        hashMap.put("/**", "user");
+        shiroFilter.setFilterChainDefinitionMap(hashMap);
+        return shiroFilter;
+    }
+
+    /**
+     * 在方法中 注入 securityManager,进行代理控制
+     */
+    @Bean
+    public MethodInvokingFactoryBean methodInvokingFactoryBean(DefaultWebSecurityManager securityManager) {
+        MethodInvokingFactoryBean bean = new MethodInvokingFactoryBean();
+        bean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager");
+        bean.setArguments(new Object[]{securityManager});
+        return bean;
+    }
+
+    /**
+     * Shiro生命周期处理器:
+     * 用于在实现了Initializable接口的Shiro bean初始化时调用Initializable接口回调(例如:UserRealm)
+     * 在实现了Destroyable接口的Shiro bean销毁时调用 Destroyable接口回调(例如:DefaultSecurityManager)
+     */
+    @Bean
+    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
+        return new LifecycleBeanPostProcessor();
+    }
+
+    /**
+     * 启用shrio授权注解拦截方式,AOP式方法级权限检查
+     */
+    @Bean
+    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
+        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor =
+                new AuthorizationAttributeSourceAdvisor();
+        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
+        return authorizationAttributeSourceAdvisor;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java b/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java
new file mode 100644
index 0000000..e66c6d5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java
@@ -0,0 +1,175 @@
+package com.stylefeng.guns.config.web;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.support.http.StatViewServlet;
+import com.alibaba.druid.support.http.WebStatFilter;
+import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator;
+import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.intercept.RestApiInteceptor;
+import com.stylefeng.guns.core.listener.ConfigListener;
+import com.stylefeng.guns.core.xss.XssFilter;
+import org.springframework.aop.Advisor;
+import org.springframework.aop.support.DefaultPointcutAdvisor;
+import org.springframework.aop.support.JdkRegexpMethodPointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.context.request.RequestContextListener;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+import java.util.Arrays;
+import java.util.Properties;
+
+/**
+ * web 配置类
+ *
+ * @author fengshuonan
+ * @date 2016年11月12日 下午5:03:32
+ */
+@Configuration
+public class WebConfig extends WebMvcConfigurerAdapter {
+
+    @Autowired
+    private GunsProperties gunsProperties;
+
+    /**
+     * 增加swagger的支持
+     */
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        if (gunsProperties.getSwaggerOpen()) {
+            registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
+            registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+        }
+    }
+
+    /**
+     * 增加对rest api鉴权的spring mvc拦截器
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(new RestApiInteceptor()).addPathPatterns("/gunsApi/**");
+    }
+
+    /**
+     * druidServlet注册
+     */
+    @Bean
+    public ServletRegistrationBean druidServletRegistration() {
+        ServletRegistrationBean registration = new ServletRegistrationBean(new StatViewServlet());
+        registration.addUrlMappings("/druid/*");
+        return registration;
+    }
+
+    /**
+     * druid监控 配置URI拦截策略
+     */
+    @Bean
+    public FilterRegistrationBean druidStatFilter() {
+        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
+        //添加过滤规则.
+        filterRegistrationBean.addUrlPatterns("/*");
+        //添加不需要忽略的格式信息.
+        filterRegistrationBean.addInitParameter(
+                "exclusions", "/static/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid,/druid/*");
+        //用于session监控页面的用户名显示 需要登录后主动将username注入到session里
+        filterRegistrationBean.addInitParameter("principalSessionName", "username");
+        return filterRegistrationBean;
+    }
+
+    /**
+     * druid数据库连接池监控
+     */
+    @Bean
+    public DruidStatInterceptor druidStatInterceptor() {
+        return new DruidStatInterceptor();
+    }
+
+    @Bean
+    public JdkRegexpMethodPointcut druidStatPointcut() {
+        JdkRegexpMethodPointcut druidStatPointcut = new JdkRegexpMethodPointcut();
+        String patterns = "com.stylefeng.guns.controller.*.service.*";
+        //可以set多个
+        druidStatPointcut.setPatterns(patterns);
+        return druidStatPointcut;
+    }
+
+    /**
+     * druid数据库连接池监控
+     */
+    @Bean
+    public BeanTypeAutoProxyCreator beanTypeAutoProxyCreator() {
+        BeanTypeAutoProxyCreator beanTypeAutoProxyCreator = new BeanTypeAutoProxyCreator();
+        beanTypeAutoProxyCreator.setTargetBeanType(DruidDataSource.class);
+        beanTypeAutoProxyCreator.setInterceptorNames("druidStatInterceptor");
+        return beanTypeAutoProxyCreator;
+    }
+
+    /**
+     * druid 为druidStatPointcut添加拦截
+     *
+     * @return
+     */
+    @Bean
+    public Advisor druidStatAdvisor() {
+        return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor());
+    }
+
+    /**
+     * xssFilter注册
+     */
+    @Bean
+    public FilterRegistrationBean xssFilterRegistration() {
+        XssFilter xssFilter = new XssFilter();
+        xssFilter.setUrlExclusion(Arrays.asList("/tAgreement/updateAppParam","/tAdvertisement/add","/tAdvertisement/update","/tNotices/addSystem","/tNotices/updateSystem"
+                ,"/tIntegralGoods/add","/tIntegralGoods/update"));
+        FilterRegistrationBean registration = new FilterRegistrationBean(xssFilter);
+        registration.addUrlPatterns("/*");
+        return registration;
+    }
+
+    /**
+     * RequestContextListener注册
+     */
+    @Bean
+    public ServletListenerRegistrationBean<RequestContextListener> requestContextListenerRegistration() {
+        return new ServletListenerRegistrationBean<>(new RequestContextListener());
+    }
+
+    /**
+     * ConfigListener注册
+     */
+    @Bean
+    public ServletListenerRegistrationBean<ConfigListener> configListenerRegistration() {
+        return new ServletListenerRegistrationBean<>(new ConfigListener());
+    }
+
+    /**
+     * 验证码生成相关
+     */
+    @Bean
+    public DefaultKaptcha kaptcha() {
+        Properties properties = new Properties();
+        properties.put("kaptcha.border", "no");
+        properties.put("kaptcha.border.color", "105,179,90");
+        properties.put("kaptcha.textproducer.font.color", "blue");
+        properties.put("kaptcha.image.width", "125");
+        properties.put("kaptcha.image.height", "45");
+        properties.put("kaptcha.textproducer.font.size", "45");
+        properties.put("kaptcha.session.key", "code");
+        properties.put("kaptcha.textproducer.char.length", "4");
+        properties.put("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
+        Config config = new Config(properties);
+        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+        defaultKaptcha.setConfig(config);
+        return defaultKaptcha;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/GlobalExceptionHandler.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/GlobalExceptionHandler.java
new file mode 100644
index 0000000..5f4f745
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/GlobalExceptionHandler.java
@@ -0,0 +1,123 @@
+package com.stylefeng.guns.core.aop;
+
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.common.exception.InvalidKaptchaException;
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogManager;
+import com.stylefeng.guns.core.log.factory.LogTaskFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.CredentialsException;
+import org.apache.shiro.authc.DisabledAccountException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.HttpStatus;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import java.lang.reflect.UndeclaredThrowableException;
+
+import static com.stylefeng.guns.core.support.HttpKit.getIp;
+import static com.stylefeng.guns.core.support.HttpKit.getRequest;
+
+/**
+ * 全局的的异常拦截器(拦截所有的控制器)(带有@RequestMapping注解的方法上都会拦截)
+ *
+ * @author fengshuonan
+ * @date 2016年11月12日 下午3:19:56
+ */
+@ControllerAdvice
+@Order(-1)
+public class GlobalExceptionHandler {
+
+    private Logger log = LoggerFactory.getLogger(this.getClass());
+
+    /**
+     * 拦截业务异常
+     */
+    @ExceptionHandler(GunsException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    @ResponseBody
+    public ErrorTip notFount(GunsException e) {
+        LogManager.me().executeLog(LogTaskFactory.exceptionLog(ShiroKit.getUser().getId(), e));
+        getRequest().setAttribute("tip", e.getMessage());
+        log.error("业务异常:", e);
+        return new ErrorTip(e.getCode(), e.getMessage());
+    }
+
+    /**
+     * 用户未登录异常
+     */
+    @ExceptionHandler(AuthenticationException.class)
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    public String unAuth(AuthenticationException e) {
+        log.error("用户未登陆:", e);
+        return "/login.html";
+    }
+
+    /**
+     * 账号被冻结异常
+     */
+    @ExceptionHandler(DisabledAccountException.class)
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    public String accountLocked(DisabledAccountException e, Model model) {
+        String username = getRequest().getParameter("username");
+        LogManager.me().executeLog(LogTaskFactory.loginLog(username, "账号被冻结", getIp()));
+        model.addAttribute("tips", "账号被冻结");
+        return "/login.html";
+    }
+
+    /**
+     * 账号密码错误异常
+     */
+    @ExceptionHandler(CredentialsException.class)
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    public String credentials(CredentialsException e, Model model) {
+        String username = getRequest().getParameter("username");
+        LogManager.me().executeLog(LogTaskFactory.loginLog(username, "账号密码错误", getIp()));
+        model.addAttribute("tips", "账号密码错误");
+        return "/login.html";
+    }
+
+    /**
+     * 验证码错误异常
+     */
+    @ExceptionHandler(InvalidKaptchaException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public String credentials(InvalidKaptchaException e, Model model) {
+        String username = getRequest().getParameter("username");
+        LogManager.me().executeLog(LogTaskFactory.loginLog(username, "验证码错误", getIp()));
+        model.addAttribute("tips", "验证码错误");
+        return "/login.html";
+    }
+
+    /**
+     * 无权访问该资源异常
+     */
+    @ExceptionHandler(UndeclaredThrowableException.class)
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    @ResponseBody
+    public ErrorTip credentials(UndeclaredThrowableException e) {
+        getRequest().setAttribute("tip", "权限异常");
+        log.error("权限异常!", e);
+        return new ErrorTip(BizExceptionEnum.NO_PERMITION.getCode(), BizExceptionEnum.NO_PERMITION.getMessage());
+    }
+
+    /**
+     * 拦截未知的运行时异常
+     */
+    @ExceptionHandler(RuntimeException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    @ResponseBody
+    public ErrorTip notFount(RuntimeException e) {
+        LogManager.me().executeLog(LogTaskFactory.exceptionLog(ShiroKit.getUser().getId(), e));
+        getRequest().setAttribute("tip", "服务器未知运行时异常");
+        log.error("运行时异常:", e);
+        return new ErrorTip(BizExceptionEnum.SERVER_ERROR.getCode(), BizExceptionEnum.SERVER_ERROR.getMessage());
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/LogAop.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/LogAop.java
new file mode 100644
index 0000000..d5123f4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/LogAop.java
@@ -0,0 +1,105 @@
+package com.stylefeng.guns.core.aop;
+
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+import com.stylefeng.guns.core.log.LogManager;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.log.factory.LogTaskFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.support.HttpKit;
+import com.stylefeng.guns.core.util.Contrast;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * 日志记录
+ *
+ * @author fengshuonan
+ * @date 2016年12月6日 下午8:48:30
+ */
+@Aspect
+@Component
+public class LogAop {
+
+    private Logger log = LoggerFactory.getLogger(this.getClass());
+
+    @Pointcut(value = "@annotation(com.stylefeng.guns.core.common.annotion.BussinessLog)")
+    public void cutService() {
+    }
+
+    @Around("cutService()")
+    public Object recordSysLog(ProceedingJoinPoint point) throws Throwable {
+
+        //先执行业务
+        Object result = point.proceed();
+
+        try {
+            handle(point);
+        } catch (Exception e) {
+            log.error("日志记录出错!", e);
+        }
+
+        return result;
+    }
+
+    private void handle(ProceedingJoinPoint point) throws Exception {
+
+        //获取拦截的方法名
+        Signature sig = point.getSignature();
+        MethodSignature msig = null;
+        if (!(sig instanceof MethodSignature)) {
+            throw new IllegalArgumentException("该注解只能用于方法");
+        }
+        msig = (MethodSignature) sig;
+        Object target = point.getTarget();
+        Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
+        String methodName = currentMethod.getName();
+
+        //如果当前用户未登录,不做日志
+        ShiroUser user = ShiroKit.getUser();
+        if (null == user) {
+            return;
+        }
+
+        //获取拦截方法的参数
+        String className = point.getTarget().getClass().getName();
+        Object[] params = point.getArgs();
+
+        //获取操作名称
+        BussinessLog annotation = currentMethod.getAnnotation(BussinessLog.class);
+        String bussinessName = annotation.value();
+        String key = annotation.key();
+        Class dictClass = annotation.dict();
+
+        StringBuilder sb = new StringBuilder();
+        for (Object param : params) {
+            sb.append(param);
+            sb.append(" & ");
+        }
+
+        //如果涉及到修改,比对变化
+        String msg;
+        if (bussinessName.indexOf("修改") != -1 || bussinessName.indexOf("编辑") != -1) {
+            Object obj1 = LogObjectHolder.me().get();
+            Map<String, String> obj2 = HttpKit.getRequestParameters();
+            msg = Contrast.contrastObj(dictClass, key, obj1, obj2);
+        } else {
+            Map<String, String> parameters = HttpKit.getRequestParameters();
+            AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
+            msg = Contrast.parseMutiKey(dictMap,key,parameters);
+        }
+
+        LogManager.me().executeLog(LogTaskFactory.bussinessLog(user.getId(), bussinessName, className, methodName, msg));
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/PermissionAop.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/PermissionAop.java
new file mode 100644
index 0000000..13e9d6c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/aop/PermissionAop.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package com.stylefeng.guns.core.aop;
+
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.shiro.check.PermissionCheckManager;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import javax.naming.NoPermissionException;
+import java.lang.reflect.Method;
+
+/**
+ * AOP 权限自定义检查
+ */
+@Aspect
+@Component
+@Order(200)
+public class PermissionAop {
+
+    @Pointcut(value = "@annotation(com.stylefeng.guns.core.common.annotion.Permission)")
+    private void cutPermission() {
+
+    }
+
+    @Around("cutPermission()")
+    public Object doPermission(ProceedingJoinPoint point) throws Throwable {
+        MethodSignature ms = (MethodSignature) point.getSignature();
+        Method method = ms.getMethod();
+        Permission permission = method.getAnnotation(Permission.class);
+        Object[] permissions = permission.value();
+        if (permissions == null || permissions.length == 0) {
+            //检查全体角色
+            boolean result = PermissionCheckManager.checkAll();
+            if (result) {
+                return point.proceed();
+            } else {
+                throw new NoPermissionException();
+            }
+        } else {
+            //检查指定角色
+            boolean result = PermissionCheckManager.check(permissions);
+            if (result) {
+                return point.proceed();
+            } else {
+                throw new NoPermissionException();
+            }
+        }
+
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/BeetlConfiguration.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/BeetlConfiguration.java
new file mode 100644
index 0000000..fa53e22
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/BeetlConfiguration.java
@@ -0,0 +1,71 @@
+package com.stylefeng.guns.core.beetl;
+
+import com.stylefeng.guns.core.tag.DictSelectorTag;
+import com.stylefeng.guns.core.util.KaptchaUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.beetl.core.Context;
+import org.beetl.core.Function;
+import org.beetl.core.Tag;
+import org.beetl.core.TagFactory;
+import org.beetl.ext.spring.BeetlGroupUtilConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.env.Environment;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * beetl拓展配置,绑定一些工具类,方便在模板中直接调用
+ *
+ * @author stylefeng
+ * @Date 2018/2/22 21:03
+ */
+public class BeetlConfiguration extends BeetlGroupUtilConfiguration {
+
+    @Autowired
+    Environment env;
+
+    @Autowired
+    ApplicationContext applicationContext;
+
+    @Autowired
+    DictSelectorTag dictSelectorTag;
+
+
+
+    @Override
+    public void initOther() {
+        groupTemplate.registerFunctionPackage("shiro", new ShiroExt());
+        groupTemplate.registerFunctionPackage("tool", new ToolUtil());
+        groupTemplate.registerFunctionPackage("kaptcha", new KaptchaUtil());
+        groupTemplate.registerTagFactory("dictSelector", new TagFactory() {
+            @Override
+            public Tag createTag() {
+                return dictSelectorTag;
+            }
+        });
+
+        groupTemplate.registerFunction("env", new Function() {
+            @Override
+            public String call(Object[] paras, Context ctx) {
+                String key = (String)paras[0];
+                String value =  env.getProperty(key);
+                if(value!=null) {
+                    return getStr(value);
+                }
+                if(paras.length==2) {
+                    return (String)paras[1];
+                }
+                return null;
+            }
+
+            protected String getStr(String str) {
+                try {
+                    return new String(str.getBytes("iso8859-1"),"UTF-8");
+                } catch (UnsupportedEncodingException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExt.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExt.java
new file mode 100644
index 0000000..55e7234
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExt.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package com.stylefeng.guns.core.beetl;
+
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.beetl.core.GroupTemplate;
+
+import com.stylefeng.guns.core.shiro.ShiroUser;
+
+public class ShiroExt {
+    private static final String NAMES_DELIMETER = ",";
+
+    /**
+     * 获取当前 Subject
+     *
+     * @return Subject
+     */
+    protected static Subject getSubject() {
+        return SecurityUtils.getSubject();
+    }
+
+    /**
+     * 获取封装的 ShiroUser
+     *
+     * @return ShiroUser
+     */
+    public ShiroUser getUser() {
+        if (isGuest()) {
+            return null;
+        } else {
+            return (ShiroUser) getSubject().getPrincipals().getPrimaryPrincipal();
+        }
+    }
+
+    /**
+     * 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用
+     *
+     * @param roleName 角色名
+     * @return 属于该角色:true,否则false
+     */
+    public boolean hasRole(String roleName) {
+        return getSubject() != null && roleName != null
+                && roleName.length() > 0 && getSubject().hasRole(roleName);
+    }
+
+    /**
+     * 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。
+     *
+     * @param roleName 角色名
+     * @return 不属于该角色:true,否则false
+     */
+    public boolean lacksRole(String roleName) {
+        return !hasRole(roleName);
+    }
+
+    /**
+     * 验证当前用户是否属于以下任意一个角色。
+     *
+     * @param roleNames 角色列表
+     * @return 属于:true,否则false
+     */
+    public boolean hasAnyRoles(String roleNames) {
+        boolean hasAnyRole = false;
+        Subject subject = getSubject();
+        if (subject != null && roleNames != null && roleNames.length() > 0) {
+            for (String role : roleNames.split(NAMES_DELIMETER)) {
+                if (subject.hasRole(role.trim())) {
+                    hasAnyRole = true;
+                    break;
+                }
+            }
+        }
+        return hasAnyRole;
+    }
+
+    /**
+     * 验证当前用户是否属于以下所有角色。
+     *
+     * @param roleNames 角色列表
+     * @return 属于:true,否则false
+     */
+    public boolean hasAllRoles(String roleNames) {
+        boolean hasAllRole = true;
+        Subject subject = getSubject();
+        if (subject != null && roleNames != null && roleNames.length() > 0) {
+            for (String role : roleNames.split(NAMES_DELIMETER)) {
+                if (!subject.hasRole(role.trim())) {
+                    hasAllRole = false;
+                    break;
+                }
+            }
+        }
+        return hasAllRole;
+    }
+
+    /**
+     * 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用
+     *
+     * @param permission 权限名
+     * @return 拥有权限:true,否则false
+     */
+    public boolean hasPermission(String permission) {
+        return getSubject() != null && permission != null
+                && permission.length() > 0
+                && getSubject().isPermitted(permission);
+    }
+
+    /**
+     * 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。
+     *
+     * @param permission 权限名
+     * @return 拥有权限:true,否则false
+     */
+    public boolean lacksPermission(String permission) {
+        return !hasPermission(permission);
+    }
+
+    /**
+     * 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用
+     *
+     * @return 通过身份验证:true,否则false
+     */
+    public boolean authenticated() {
+        return getSubject() != null && getSubject().isAuthenticated();
+    }
+
+    /**
+     * 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。
+     *
+     * @return 没有通过身份验证:true,否则false
+     */
+    public boolean notAuthenticated() {
+        return !authenticated();
+    }
+
+    /**
+     * 认证通过或已记住的用户。与guset搭配使用。
+     *
+     * @return 用户:true,否则 false
+     */
+    public boolean isUser() {
+        return getSubject() != null && getSubject().getPrincipal() != null;
+    }
+
+    /**
+     * 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用
+     *
+     * @return 访客:true,否则false
+     */
+    public boolean isGuest() {
+        return !isUser();
+    }
+
+    /**
+     * 输出当前用户信息,通常为登录帐号信息。
+     *
+     * @return 当前用户信息
+     */
+    public String principal() {
+        if (getSubject() != null) {
+            Object principal = getSubject().getPrincipal();
+            return principal.toString();
+        }
+        return "";
+    }
+
+    public static void main(String[] args) {
+        GroupTemplate gt = new GroupTemplate();
+        gt.registerFunctionPackage("shiro", new ShiroExt());
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/BussinessLog.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/BussinessLog.java
new file mode 100644
index 0000000..369be8b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/BussinessLog.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.core.common.annotion;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+import com.stylefeng.guns.core.common.constant.dictmap.base.SystemDict;
+
+import java.lang.annotation.*;
+
+/**
+ * 标记需要做业务日志的方法
+ *
+ * @author fengshuonan
+ * @date 2017-03-31 12:46
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface BussinessLog {
+
+    /**
+     * 业务的名称,例如:"修改菜单"
+     */
+    String value() default "";
+
+    /**
+     * 被修改的实体的唯一标识,例如:菜单实体的唯一标识为"id"
+     */
+    String key() default "id";
+
+    /**
+     * 字典(用于查找key的中文名称和字段的中文名称)
+     */
+    Class<? extends AbstractDictMap> dict() default SystemDict.class;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/Permission.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/Permission.java
new file mode 100644
index 0000000..bfb1500
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/annotion/Permission.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.core.common.annotion;
+
+import java.lang.annotation.*;
+
+/**
+ * 权限注解 用于检查权限 规定访问权限
+ *
+ * @example @Permission({role1,role2})
+ * @example @Permission
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+public @interface Permission {
+
+    /**
+     * <p>角色英文名称</p>
+     * <p>使用注解时加上这个值表示限制只有某个角色的才可以访问对应的资源</p>
+     * <p>常用在某些资源限制只有超级管理员角色才可访问</p>
+     */
+    String[] value() default {};
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/Const.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/Const.java
new file mode 100644
index 0000000..1b2b5d8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/Const.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.core.common.constant;
+
+/**
+ * 系统常量
+ *
+ * @author fengshuonan
+ * @date 2017年2月12日 下午9:42:53
+ */
+public interface Const {
+
+    /**
+     * 系统默认的管理员密码
+     */
+    String DEFAULT_PWD = "111111";
+
+    /**
+     * 管理员角色的名字
+     */
+    String ADMIN_NAME = "administrator";
+
+    /**
+     * 管理员id
+     */
+    Integer ADMIN_ID = 1;
+
+    /**
+     * 超级管理员角色id
+     */
+    Integer ADMIN_ROLE_ID = 1;
+
+    /**
+     * 接口文档的菜单名
+     */
+    String API_MENU_NAME = "接口文档";
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/DatasourceEnum.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/DatasourceEnum.java
new file mode 100644
index 0000000..b2b534f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/DatasourceEnum.java
@@ -0,0 +1,15 @@
+package com.stylefeng.guns.core.common.constant;
+
+/**
+ * 
+ * 多数据源的枚举
+ *
+ * @author fengshuonan
+ * @date 2017年3月5日 上午10:15:02
+ */
+public interface DatasourceEnum {
+
+	String DATA_SOURCE_GUNS = "dataSourceGuns";			//guns数据源
+	
+	String DATA_SOURCE_BIZ = "dataSourceBiz";			//其他业务的数据源
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/JwtConstants.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/JwtConstants.java
new file mode 100644
index 0000000..75472c8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/JwtConstants.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.core.common.constant;
+
+/**
+ * jwt相关配置
+ *
+ * @author fengshuonan
+ * @date 2017-08-23 9:23
+ */
+public interface JwtConstants {
+
+    String AUTH_HEADER = "Authorization";
+
+    String SECRET = "defaultSecret";
+
+    Long EXPIRATION = 604800L;
+
+    String AUTH_PATH = "/gunsApi/auth";
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/Cache.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/Cache.java
new file mode 100644
index 0000000..a24800f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/Cache.java
@@ -0,0 +1,15 @@
+package com.stylefeng.guns.core.common.constant.cache;
+
+/**
+ * 所有缓存名称的集合
+ *
+ * @author fengshuonan
+ * @date 2017-04-24 21:56
+ */
+public interface Cache {
+
+    /**
+     * 常量缓存
+     */
+    String CONSTANT = "CONSTANT";
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/CacheKey.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/CacheKey.java
new file mode 100644
index 0000000..a7a93cd
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/cache/CacheKey.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.core.common.constant.cache;
+
+/**
+ * 缓存标识前缀集合,常用在ConstantFactory类中
+ *
+ * @author fengshuonan
+ * @date 2017-04-25 9:37
+ */
+public interface CacheKey {
+
+    /**
+     * 角色名称(多个)
+     */
+    String ROLES_NAME = "roles_name_";
+
+    /**
+     * 角色名称(单个)
+     */
+    String SINGLE_ROLE_NAME = "single_role_name_";
+
+    /**
+     * 角色英文名称
+     */
+    String SINGLE_ROLE_TIP = "single_role_tip_";
+
+    /**
+     * 部门名称
+     */
+    String DEPT_NAME = "dept_name_";
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeleteDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeleteDict.java
new file mode 100644
index 0000000..0436003
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeleteDict.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 用于删除业务的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class DeleteDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("roleId","角色名称");
+        put("deptId", "部门名称");
+        put("menuId", "菜单名称");
+        put("dictId", "字典名称");
+        put("noticeId", "标题");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+        putFieldWrapperMethodName("roleId","getCacheObject");
+        putFieldWrapperMethodName("deptId","getCacheObject");
+        putFieldWrapperMethodName("menuId","getCacheObject");
+        putFieldWrapperMethodName("dictId","getCacheObject");
+        putFieldWrapperMethodName("noticeId","getCacheObject");
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeptDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeptDict.java
new file mode 100644
index 0000000..eb44e1c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DeptDict.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 部门的映射
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class DeptDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("deptId", "部门名称");
+        put("num", "部门排序");
+        put("pid", "上级名称");
+        put("simplename", "部门简称");
+        put("fullname", "部门全称");
+        put("tips", "备注");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+        putFieldWrapperMethodName("deptId", "getDeptName");
+        putFieldWrapperMethodName("pid", "getDeptName");
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/BrandDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/BrandDict.java
new file mode 100644
index 0000000..ce72aeb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/BrandDict.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.core.common.constant.dictmap.Dict;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 车牌品牌日志记录
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class BrandDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("id","车辆品牌id");
+        put("addTime","添加时间");
+        put("name","品牌名称");
+        put("brandImg","品牌图片(多个用逗号隔开)");
+        put("state","状态(1正常,2停用)");
+        put("specialMode","专车计费");
+        put("charteredMode","包车计费");
+        put("seatNum","座位数");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/CarDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/CarDict.java
new file mode 100644
index 0000000..dee5deb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/CarDict.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.core.common.constant.dictmap.Dict;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 车辆日志记录
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class CarDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("id","车辆id");
+        put("addTime","添加时间");
+        put("carImg","车辆图片");
+        put("plateNumber","车牌号");
+        put("licenseNumber","行驶证编号");
+        put("licenseImg","行驶证照片");
+        put("brandId","关联品牌id");
+        put("color","车辆颜色");
+        put("serviceMode","服务模式(1专车,2包车)");
+        put("state","状态(1正常,2停用)");
+        put("insuranceNumber","保险编号");
+        put("insuranceImg","保险图片");
+        put("insuranceDate","保险到期时间");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/DriverDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/DriverDict.java
new file mode 100644
index 0000000..02e35eb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/DriverDict.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.core.common.constant.dictmap.Dict;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 司机日志记录
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class DriverDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("id","司机id");
+        put("addTime","添加时间");
+        put("name","司机姓名");
+        put("headImg","头像");
+        put("phone","电话");
+        put("sex","性别");
+        put("password","登录密码");
+        put("state","状态(1正常,2停用)");
+        put("serviceMode","服务模式(1专车,2包车)");
+        put("driveNumber","驾驶证编号");
+        put("driveImg","驾驶证照片");
+        put("carId","车辆id");
+        put("driverId","司机id");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/LabelDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/LabelDict.java
new file mode 100644
index 0000000..4be7cf1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/LabelDict.java
@@ -0,0 +1,25 @@
+package com.stylefeng.guns.core.common.constant.dictmap.Dict;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 评价标签日志记录
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class LabelDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("id","标签id");
+        put("appLabelId","标签id");
+        put("addTime","添加时间");
+        put("name","标签名称");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/NoticeDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/NoticeDict.java
new file mode 100644
index 0000000..b8e8c38
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/NoticeDict.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.core.common.constant.dictmap.Dict;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 系统通知日志记录
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class NoticeDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("id","通知id");
+        put("addTime","添加时间");
+        put("title","标题");
+        put("issue","是否发布(1未发布,2已发布)");
+        put("content","内容");
+        put("sendType","发送对象(1用户,2司机 ,3用户和司机)");
+        put("sendTime","发送时间");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/ObjectDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/ObjectDict.java
new file mode 100644
index 0000000..cdc1ab4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/ObjectDict.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.core.common.constant.dictmap.Dict;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 日志记录
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class ObjectDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("appOrderTopupId","充值订单id");
+        put("id","提现记录id");
+        put("appInvoiceId","发票记录id");
+        put("appOrderEvaluateId","订单评价id");
+        put("appComplaintId","投诉id");
+        put("appFeedbackId","意见反馈id");
+        put("appDriverRecruitId","司机招募id");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/OrderDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/OrderDict.java
new file mode 100644
index 0000000..1c584ac
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/OrderDict.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.core.common.constant.dictmap.Dict;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 订单日志记录
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class OrderDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("id","订单id");
+        put("appOrderId","订单id");
+        put("addTime","添加时间");
+        put("orderNum","订单编号");
+        put("userName","乘车人名称");
+        put("userPhone","乘车人手机");
+        put("number","乘车人数");
+        put("chargeMode","计费方式(1时间,2里程)");
+        put("rideTime","乘车时间");
+        put("startName","起点名称");
+        put("endName","终点名称");
+        put("driverId","接单司机id");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/UserAuthenticationDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/UserAuthenticationDict.java
new file mode 100644
index 0000000..82642df
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/UserAuthenticationDict.java
@@ -0,0 +1,24 @@
+package com.stylefeng.guns.core.common.constant.dictmap.Dict;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 用户日志记录
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class UserAuthenticationDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("id","实名认证id");
+        put("state","审核状态(1待审核,2审核成功,3审核失败)");
+        put("isDelete","是否删除(1正常,2删除)");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/UserDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/UserDict.java
new file mode 100644
index 0000000..2948292
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/UserDict.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.core.common.constant.dictmap.Dict;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 用户日志记录
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class UserDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("id","用户id");
+        put("state","用户状态(1正常,2冻结)");
+        put("gold","用户金币数");
+        put("balance","用户余额数");
+        put("nickName","用户昵称");
+        put("phone","用户手机号");
+        put("level","等级(1普通用户,2白银会员,3黄金会员,4白金会员)");
+        put("sex","性别");
+        put("birthday","生日");
+        put("industry","行业");
+        put("job","职业");
+        put("company","公司");
+        put("education","学历");
+        put("signature","个性签名");
+        put("addTime","添加时间");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/VersionDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/VersionDict.java
new file mode 100644
index 0000000..2e08363
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/Dict/VersionDict.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.core.common.constant.dictmap.Dict;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 版本控制日志记录
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class VersionDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("id","版本id");
+        put("createDate","添加时间");
+        put("type","类型(1用户端,2司机端)");
+        put("versions","版本号");
+        put("mark","版本描述");
+        put("state","是否强制更新 1否,2 是");
+        put("url","版本链接");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DictMap.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DictMap.java
new file mode 100644
index 0000000..a04927f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/DictMap.java
@@ -0,0 +1,24 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 字典map
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:43
+ */
+public class DictMap extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("dictId","字典名称");
+        put("dictName","字典名称");
+        put("dictValues","字典内容");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/LogDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/LogDict.java
new file mode 100644
index 0000000..f7b7bf9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/LogDict.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 日志的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class LogDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("tips","备注");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/MenuDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/MenuDict.java
new file mode 100644
index 0000000..4b60184
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/MenuDict.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 菜单的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class MenuDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("menuId","菜单id");
+        put("id","菜单id");
+        put("code","菜单编号");
+        put("pcode","菜单父编号");
+        put("name","菜单名称");
+        put("icon","菜单图标");
+        put("url","url地址");
+        put("num","菜单排序号");
+        put("levels","菜单层级");
+        put("tips","备注");
+        put("status","菜单状态");
+        put("isopen","是否打开");
+        put("","");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/NoticeMap.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/NoticeMap.java
new file mode 100644
index 0000000..a0a13c9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/NoticeMap.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 通知的映射
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class NoticeMap extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("title", "标题");
+        put("content", "内容");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/RoleDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/RoleDict.java
new file mode 100644
index 0000000..08389af
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/RoleDict.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 角色的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class RoleDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("roleId","角色名称");
+        put("num","角色排序");
+        put("pid","角色的父级");
+        put("name","角色名称");
+        put("deptid","部门名称");
+        put("tips","备注");
+        put("ids","资源名称");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+        putFieldWrapperMethodName("pid","getSingleRoleName");
+        putFieldWrapperMethodName("deptid","getDeptName");
+        putFieldWrapperMethodName("roleId","getSingleRoleName");
+        putFieldWrapperMethodName("ids","getMenuNames");
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/UserDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/UserDict.java
new file mode 100644
index 0000000..cc34eb5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/UserDict.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.core.common.constant.dictmap;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+
+/**
+ * 用户的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:01
+ */
+public class UserDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+        put("userId","账号");
+        put("avatar","头像");
+        put("account","账号");
+        put("name","名字");
+        put("birthday","生日");
+        put("sex","性别");
+        put("email","电子邮件");
+        put("phone","电话");
+        put("roleid","角色名称");
+        put("deptid","部门名称");
+        put("roleIds","角色名称集合");
+    }
+
+    @Override
+    protected void initBeWrapped() {
+        putFieldWrapperMethodName("sex","getSexName");
+        putFieldWrapperMethodName("deptid","getDeptName");
+        putFieldWrapperMethodName("roleid","getSingleRoleName");
+        putFieldWrapperMethodName("userId","getUserAccountById");
+        putFieldWrapperMethodName("roleIds","getRoleName");
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/AbstractDictMap.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/AbstractDictMap.java
new file mode 100644
index 0000000..9f091a3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/AbstractDictMap.java
@@ -0,0 +1,53 @@
+package com.stylefeng.guns.core.common.constant.dictmap.base;
+
+import java.util.HashMap;
+
+/**
+ * 字典映射抽象类
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 14:58
+ */
+public abstract class AbstractDictMap {
+
+    protected HashMap<String, String> dictory = new HashMap<>();
+    protected HashMap<String, String> fieldWarpperDictory = new HashMap<>();
+
+    public AbstractDictMap(){
+        put("id","主键id");
+        init();
+        initBeWrapped();
+    }
+
+    /**
+     * 初始化字段英文名称和中文名称对应的字典
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 19:39
+     */
+    public abstract void init();
+
+    /**
+     * 初始化需要被包装的字段(例如:性别为1:男,2:女,需要被包装为汉字)
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 19:35
+     */
+    protected abstract void initBeWrapped();
+
+    public String get(String key) {
+        return this.dictory.get(key);
+    }
+
+    public void put(String key, String value) {
+        this.dictory.put(key, value);
+    }
+
+    public String getFieldWarpperMethodName(String key){
+        return this.fieldWarpperDictory.get(key);
+    }
+
+    public void putFieldWrapperMethodName(String key,String methodName){
+        this.fieldWarpperDictory.put(key,methodName);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/SystemDict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/SystemDict.java
new file mode 100644
index 0000000..110633e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/base/SystemDict.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.core.common.constant.dictmap.base;
+
+/**
+ * 系统相关的字典
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:48
+ */
+public class SystemDict extends AbstractDictMap {
+
+    @Override
+    public void init() {
+
+    }
+
+    @Override
+    protected void initBeWrapped() {
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/factory/DictFieldWarpperFactory.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/factory/DictFieldWarpperFactory.java
new file mode 100644
index 0000000..9d86da3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/dictmap/factory/DictFieldWarpperFactory.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.core.common.constant.dictmap.factory;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.constant.factory.IConstantFactory;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+
+import java.lang.reflect.Method;
+
+/**
+ * 字典字段的包装器(从ConstantFactory中获取包装值)
+ *
+ * @author fengshuonan
+ * @date 2017-05-06 15:12
+ */
+public class DictFieldWarpperFactory {
+
+    public static Object createFieldWarpper(Object parameter, String methodName) {
+        IConstantFactory constantFactory = ConstantFactory.me();
+        try {
+            Method method = IConstantFactory.class.getMethod(methodName, parameter.getClass());
+            return method.invoke(constantFactory, parameter);
+        } catch (Exception e) {
+            try {
+                Method method = IConstantFactory.class.getMethod(methodName, Integer.class);
+                return method.invoke(constantFactory, Integer.parseInt(parameter.toString()));
+            } catch (Exception e1) {
+                throw new GunsException(BizExceptionEnum.ERROR_WRAPPER_FIELD);
+            }
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/ConstantFactory.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/ConstantFactory.java
new file mode 100644
index 0000000..6437075
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/ConstantFactory.java
@@ -0,0 +1,356 @@
+package com.stylefeng.guns.core.common.constant.factory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.stereotype.Component;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.stylefeng.guns.core.common.constant.cache.Cache;
+import com.stylefeng.guns.core.common.constant.cache.CacheKey;
+import com.stylefeng.guns.core.common.constant.state.ManagerStatus;
+import com.stylefeng.guns.core.common.constant.state.MenuStatus;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.support.StrKit;
+import com.stylefeng.guns.core.util.Convert;
+import com.stylefeng.guns.core.util.SpringContextHolder;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.DeptMapper;
+import com.stylefeng.guns.modular.system.dao.DictMapper;
+import com.stylefeng.guns.modular.system.dao.MenuMapper;
+import com.stylefeng.guns.modular.system.dao.NoticeMapper;
+import com.stylefeng.guns.modular.system.dao.RoleMapper;
+import com.stylefeng.guns.modular.system.dao.UserMapper;
+import com.stylefeng.guns.modular.system.model.Dept;
+import com.stylefeng.guns.modular.system.model.Dict;
+import com.stylefeng.guns.modular.system.model.Menu;
+import com.stylefeng.guns.modular.system.model.Notice;
+import com.stylefeng.guns.modular.system.model.Role;
+import com.stylefeng.guns.modular.system.model.User;
+
+/**
+ * 常量的生产工厂
+ *
+ * @author fengshuonan
+ * @date 2017年2月13日 下午10:55:21
+ */
+@Component
+@DependsOn("springContextHolder")
+public class ConstantFactory implements IConstantFactory {
+
+    private RoleMapper roleMapper = SpringContextHolder.getBean(RoleMapper.class);
+    private DeptMapper deptMapper = SpringContextHolder.getBean(DeptMapper.class);
+    private DictMapper dictMapper = SpringContextHolder.getBean(DictMapper.class);
+    private UserMapper userMapper = SpringContextHolder.getBean(UserMapper.class);
+    private MenuMapper menuMapper = SpringContextHolder.getBean(MenuMapper.class);
+    private NoticeMapper noticeMapper = SpringContextHolder.getBean(NoticeMapper.class);
+
+    public static IConstantFactory me() {
+        return SpringContextHolder.getBean("constantFactory");
+    }
+
+    /**
+     * 根据用户id获取用户名称
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 23:41
+     */
+    @Override
+    public String getUserNameById(Integer userId) {
+        User user = userMapper.selectById(userId);
+        if (user != null) {
+            return user.getName();
+        } else {
+            return "--";
+        }
+    }
+
+    /**
+     * 根据用户id获取用户账号
+     *
+     * @author stylefeng
+     * @date 2017年5月16日21:55:371
+     */
+    @Override
+    public String getUserAccountById(Integer userId) {
+        User user = userMapper.selectById(userId);
+        if (user != null) {
+            return user.getAccount();
+        } else {
+            return "--";
+        }
+    }
+
+    /**
+     * 通过角色ids获取角色名称
+     */
+    @Override
+    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.ROLES_NAME + "'+#roleIds")
+    public String getRoleName(String roleIds) {
+        Integer[] roles = Convert.toIntArray(roleIds);
+        StringBuilder sb = new StringBuilder();
+        for (int role : roles) {
+            Role roleObj = roleMapper.selectById(role);
+            if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
+                sb.append(roleObj.getName()).append(",");
+            }
+        }
+        return StrKit.removeSuffix(sb.toString(), ",");
+    }
+
+    /**
+     * 通过角色id获取角色名称
+     */
+    @Override
+    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_NAME + "'+#roleId")
+    public String getSingleRoleName(Integer roleId) {
+        if (0 == roleId) {
+            return "--";
+        }
+        Role roleObj = roleMapper.selectById(roleId);
+        if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
+            return roleObj.getName();
+        }
+        return "";
+    }
+
+    /**
+     * 通过角色id获取角色英文名称
+     */
+    @Override
+    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.SINGLE_ROLE_TIP + "'+#roleId")
+    public String getSingleRoleTip(Integer roleId) {
+        if (0 == roleId) {
+            return "--";
+        }
+        Role roleObj = roleMapper.selectById(roleId);
+        if (ToolUtil.isNotEmpty(roleObj) && ToolUtil.isNotEmpty(roleObj.getName())) {
+            return roleObj.getTips();
+        }
+        return "";
+    }
+
+    /**
+     * 获取部门名称
+     */
+    @Override
+    @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.DEPT_NAME + "'+#deptId")
+    public String getDeptName(Integer deptId) {
+        Dept dept = deptMapper.selectById(deptId);
+        if (ToolUtil.isNotEmpty(dept) && ToolUtil.isNotEmpty(dept.getFullname())) {
+            return dept.getFullname();
+        }
+        return "";
+    }
+
+    /**
+     * 获取菜单的名称们(多个)
+     */
+    @Override
+    public String getMenuNames(String menuIds) {
+        Integer[] menus = Convert.toIntArray(menuIds);
+        StringBuilder sb = new StringBuilder();
+        for (int menu : menus) {
+            Menu menuObj = menuMapper.selectById(menu);
+            if (ToolUtil.isNotEmpty(menuObj) && ToolUtil.isNotEmpty(menuObj.getName())) {
+                sb.append(menuObj.getName()).append(",");
+            }
+        }
+        return StrKit.removeSuffix(sb.toString(), ",");
+    }
+
+    /**
+     * 获取菜单名称
+     */
+    @Override
+    public String getMenuName(Long menuId) {
+        if (ToolUtil.isEmpty(menuId)) {
+            return "";
+        } else {
+            Menu menu = menuMapper.selectById(menuId);
+            if (menu == null) {
+                return "";
+            } else {
+                return menu.getName();
+            }
+        }
+    }
+
+    /**
+     * 获取菜单名称通过编号
+     */
+    @Override
+    public String getMenuNameByCode(String code) {
+        if (ToolUtil.isEmpty(code)) {
+            return "";
+        } else {
+            Menu param = new Menu();
+            param.setCode(code);
+            Menu menu = menuMapper.selectOne(param);
+            if (menu == null) {
+                return "";
+            } else {
+                return menu.getName();
+            }
+        }
+    }
+
+    /**
+     * 获取字典名称
+     */
+    @Override
+    public String getDictName(Integer dictId) {
+        if (ToolUtil.isEmpty(dictId)) {
+            return "";
+        } else {
+            Dict dict = dictMapper.selectById(dictId);
+            if (dict == null) {
+                return "";
+            } else {
+                return dict.getName();
+            }
+        }
+    }
+
+    /**
+     * 获取通知标题
+     */
+    @Override
+    public String getNoticeTitle(Integer dictId) {
+        if (ToolUtil.isEmpty(dictId)) {
+            return "";
+        } else {
+        	Notice notice = noticeMapper.selectById(dictId);
+            if (notice == null) {
+                return "";
+            } else {
+                return notice.getTitle();
+            }
+        }
+    }
+
+    /**
+     * 根据字典名称和字典中的值获取对应的名称
+     */
+    @Override
+    public String getDictsByName(String name, Integer val) {
+        Dict temp = new Dict();
+        temp.setName(name);
+        Dict dict = dictMapper.selectOne(temp);
+        if (dict == null) {
+            return "";
+        } else {
+            Wrapper<Dict> wrapper = new EntityWrapper<>();
+            wrapper = wrapper.eq("pid", dict.getId());
+            List<Dict> dicts = dictMapper.selectList(wrapper);
+            for (Dict item : dicts) {
+                if (item.getNum() != null && item.getNum().equals(val)) {
+                    return item.getName();
+                }
+            }
+            return "";
+        }
+    }
+
+    /**
+     * 获取性别名称
+     */
+    @Override
+    public String getSexName(Integer sex) {
+        return getDictsByName("性别", sex);
+    }
+
+    /**
+     * 获取用户登录状态
+     */
+    @Override
+    public String getStatusName(Integer status) {
+        return ManagerStatus.valueOf(status);
+    }
+
+    /**
+     * 获取菜单状态
+     */
+    @Override
+    public String getMenuStatusName(Integer status) {
+        return MenuStatus.valueOf(status);
+    }
+
+    /**
+     * 查询字典
+     */
+    @Override
+    public List<Dict> findInDict(Integer id) {
+        if (ToolUtil.isEmpty(id)) {
+            return null;
+        } else {
+            EntityWrapper<Dict> wrapper = new EntityWrapper<>();
+            List<Dict> dicts = dictMapper.selectList(wrapper.eq("pid", id));
+            if (dicts == null || dicts.size() == 0) {
+                return null;
+            } else {
+                return dicts;
+            }
+        }
+    }
+
+    /**
+     * 获取被缓存的对象(用户删除业务)
+     */
+    @Override
+    public String getCacheObject(String para) {
+        return LogObjectHolder.me().get().toString();
+    }
+
+    /**
+     * 获取子部门id
+     */
+    @Override
+    public List<Integer> getSubDeptId(Integer deptid) {
+        Wrapper<Dept> wrapper = new EntityWrapper<>();
+        wrapper = wrapper.like("pids", "%[" + deptid + "]%");
+        List<Dept> depts = this.deptMapper.selectList(wrapper);
+
+        ArrayList<Integer> deptids = new ArrayList<>();
+
+        if(depts != null && depts.size() > 0){
+            for (Dept dept : depts) {
+                deptids.add(dept.getId());
+            }
+        }
+
+        return deptids;
+    }
+
+    /**
+     * 获取所有父部门id
+     */
+    @Override
+    public List<Integer> getParentDeptIds(Integer deptid) {
+        Dept dept = deptMapper.selectById(deptid);
+        String pids = dept.getPids();
+        String[] split = pids.split(",");
+        ArrayList<Integer> parentDeptIds = new ArrayList<>();
+        for (String s : split) {
+            parentDeptIds.add(Integer.valueOf(StrKit.removeSuffix(StrKit.removePrefix(s, "["), "]")));
+        }
+        return parentDeptIds;
+    }
+
+    /**
+     * 根据用户Id获取用户昵称
+     */
+    @Override
+    public String getTUserNickNameById(Integer userId) {
+      /*  TUser user = tUserMapper.selectById(userId);
+        if (user != null) {
+            return user.getNickName();
+        } else {
+            return "--";
+        }*/
+    	return "--";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/IConstantFactory.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/IConstantFactory.java
new file mode 100644
index 0000000..e227a8d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/IConstantFactory.java
@@ -0,0 +1,120 @@
+package com.stylefeng.guns.core.common.constant.factory;
+
+import com.stylefeng.guns.modular.system.model.Dict;
+
+import java.util.List;
+
+/**
+ * 常量生产工厂的接口
+ *
+ * @author fengshuonan
+ * @date 2017-06-14 21:12
+ */
+public interface IConstantFactory {
+
+    /**
+     * 根据用户id获取用户名称
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 23:41
+     */
+    String getUserNameById(Integer userId);
+
+    /**
+     * 根据用户id获取用户账号
+     *
+     * @author stylefeng
+     * @date 2017年5月16日21:55:371
+     */
+    String getUserAccountById(Integer userId);
+
+    /**
+     * 通过角色ids获取角色名称
+     */
+    String getRoleName(String roleIds);
+
+    /**
+     * 通过角色id获取角色名称
+     */
+    String getSingleRoleName(Integer roleId);
+
+    /**
+     * 通过角色id获取角色英文名称
+     */
+    String getSingleRoleTip(Integer roleId);
+
+    /**
+     * 获取部门名称
+     */
+    String getDeptName(Integer deptId);
+
+    /**
+     * 获取菜单的名称们(多个)
+     */
+    String getMenuNames(String menuIds);
+
+    /**
+     * 获取菜单名称
+     */
+    String getMenuName(Long menuId);
+
+    /**
+     * 获取菜单名称通过编号
+     */
+    String getMenuNameByCode(String code);
+
+    /**
+     * 获取字典名称
+     */
+    String getDictName(Integer dictId);
+
+    /**
+     * 获取通知标题
+     */
+    String getNoticeTitle(Integer dictId);
+
+    /**
+     * 根据字典名称和字典中的值获取对应的名称
+     */
+    String getDictsByName(String name, Integer val);
+
+    /**
+     * 获取性别名称
+     */
+    String getSexName(Integer sex);
+
+    /**
+     * 获取用户登录状态
+     */
+    String getStatusName(Integer status);
+
+    /**
+     * 获取菜单状态
+     */
+    String getMenuStatusName(Integer status);
+
+    /**
+     * 查询字典
+     */
+    List<Dict> findInDict(Integer id);
+
+    /**
+     * 获取被缓存的对象(用户删除业务)
+     */
+    String getCacheObject(String para);
+
+    /**
+     * 获取子部门id
+     */
+    List<Integer> getSubDeptId(Integer deptid);
+
+    /**
+     * 获取所有父部门id
+     */
+    List<Integer> getParentDeptIds(Integer deptid);
+
+    /**
+     * 根据用户Id获取用户昵称
+     */
+    String getTUserNickNameById(Integer userId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/MutiStrFactory.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/MutiStrFactory.java
new file mode 100644
index 0000000..ae01578
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/MutiStrFactory.java
@@ -0,0 +1,96 @@
+package com.stylefeng.guns.core.common.constant.factory;
+
+import com.stylefeng.guns.core.support.StrKit;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 组合字符串生产者
+ *
+ * @author fengshuonan
+ * @date 2017-04-27 16:42
+ */
+public class MutiStrFactory {
+
+    /**
+     * 每个条目之间的分隔符
+     */
+    public static final String ITEM_SPLIT = ";";
+
+    /**
+     * 属性之间的分隔符
+     */
+    public static final String ATTR_SPLIT = ":";
+
+    /**
+     * 拼接字符串的id
+     */
+    public static final String MUTI_STR_ID = "ID";
+
+    /**
+     * 拼接字符串的CODE
+     */
+    public static final String MUTI_STR_CODE = "CODE";
+
+    /**
+     * 拼接字符串的NAME
+     */
+    public static final String MUTI_STR_NAME = "NAME";
+
+    /**
+     * 拼接字符串的NUM
+     */
+    public static final String MUTI_STR_NUM = "NUM";
+
+    /**
+     * 解析一个组合字符串(例如:  "1:启用;2:禁用;3:冻结"  这样的字符串)
+     *
+     * @author fengshuonan
+     * @Date 2017/4/27 16:44
+     */
+    public static List<Map<String,String>> parseKeyValue(String mutiString){
+        if(ToolUtil.isEmpty(mutiString)){
+            return new ArrayList<>();
+        }else{
+            ArrayList<Map<String,String>> results = new ArrayList<>();
+            String[] items = StrKit.split(StrKit.removeSuffix(mutiString, ITEM_SPLIT), ITEM_SPLIT);
+            for (String item : items) {
+                String[] attrs = item.split(ATTR_SPLIT);
+                HashMap<String, String> itemMap = new HashMap<>();
+                itemMap.put(MUTI_STR_CODE,attrs[0]);
+                itemMap.put(MUTI_STR_NAME,attrs[1]);
+                itemMap.put(MUTI_STR_NUM,attrs[2]);
+                results.add(itemMap);
+            }
+            return results;
+        }
+    }
+
+    /**
+     * 解析id:key:value这样类型的字符串
+     *
+     * @author fengshuonan
+     * @Date 2017/4/28 11:06
+     */
+    public static List<Map<String,String>> parseIdKeyValue(String mutiString){
+        if(ToolUtil.isEmpty(mutiString)){
+            return new ArrayList<>();
+        }else{
+            ArrayList<Map<String,String>> results = new ArrayList<>();
+            String[] items = StrKit.split(StrKit.removeSuffix(mutiString, ITEM_SPLIT), ITEM_SPLIT);
+            for (String item : items) {
+                String[] attrs = item.split(ATTR_SPLIT);
+                HashMap<String, String> itemMap = new HashMap<>();
+                itemMap.put(MUTI_STR_CODE,attrs[0]);
+                itemMap.put(MUTI_STR_NAME,attrs[1]);
+                itemMap.put(MUTI_STR_NUM,attrs[2]);
+                results.add(itemMap);
+            }
+            return results;
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/PageFactory.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/PageFactory.java
new file mode 100644
index 0000000..9fd65e0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/factory/PageFactory.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.core.common.constant.factory;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.common.constant.state.Order;
+import com.stylefeng.guns.core.support.HttpKit;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * BootStrap Table默认的分页参数创建
+ *
+ * @author fengshuonan
+ * @date 2017-04-05 22:25
+ */
+public class PageFactory<T> {
+
+    public Page<T> defaultPage() {
+        HttpServletRequest request = HttpKit.getRequest();
+        int limit = Integer.valueOf(request.getParameter("limit"));     //每页多少条数据
+        int offset = Integer.valueOf(request.getParameter("offset"));   //每页的偏移量(本页当前有多少条)
+        String sort = request.getParameter("sort");         //排序字段名称
+        String order = request.getParameter("order");       //asc或desc(升序或降序)
+        if (ToolUtil.isEmpty(sort)) {
+            Page<T> page = new Page<>((offset / limit + 1), limit);
+            page.setOpenSort(false);
+            return page;
+        } else {
+            Page<T> page = new Page<>((offset / limit + 1), limit, sort);
+            if (Order.ASC.getDes().equals(order)) {
+                page.setAsc(true);
+            } else {
+                page.setAsc(false);
+            }
+            return page;
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/BizLogType.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/BizLogType.java
new file mode 100644
index 0000000..18c15a7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/BizLogType.java
@@ -0,0 +1,51 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 业务日志类型
+ *
+ * @author fengshuonan
+ * @Date 2017年1月22日 下午12:14:59
+ */
+public enum BizLogType {
+
+    ALL(0, null),//全部日志
+    BUSSINESS(1, "业务日志"),
+    EXCEPTION(2, "异常日志");
+
+    Integer val;
+    String message;
+
+    BizLogType(Integer val, String message) {
+        this.val = val;
+        this.message = message;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public Integer getVal() {
+        return val;
+    }
+
+    public void setVal(Integer val) {
+        this.val = val;
+    }
+
+    public static String valueOf(Integer value) {
+        if (value == null) {
+            return null;
+        } else {
+            for (BizLogType bizLogType : BizLogType.values()) {
+                if (bizLogType.getVal().equals(value)) {
+                    return bizLogType.getMessage();
+                }
+            }
+            return null;
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ExpenseState.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ExpenseState.java
new file mode 100644
index 0000000..d4cffc3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ExpenseState.java
@@ -0,0 +1,52 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 是否是菜单的枚举
+ *
+ * @author fengshuonan
+ * @date 2017年6月1日22:50:11
+ */
+public enum ExpenseState {
+
+    SUBMITING(1, "待提交"),
+    CHECKING(2, "待审核"),
+    PASS(3, "审核通过"),
+    UN_PASS(4, "未通过");
+
+    int code;
+    String message;
+
+    ExpenseState(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public static String valueOf(Integer status) {
+        if (status == null) {
+            return "";
+        } else {
+            for (ExpenseState s : ExpenseState.values()) {
+                if (s.getCode() == status) {
+                    return s.getMessage();
+                }
+            }
+            return "";
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogSucceed.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogSucceed.java
new file mode 100644
index 0000000..2c2a823
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogSucceed.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 业务是否成功的日志记录
+ *
+ * @author fengshuonan
+ * @Date 2017年1月22日 下午12:14:59
+ */
+public enum LogSucceed {
+
+    SUCCESS("成功"),
+    FAIL("失败");
+
+    String message;
+
+    LogSucceed(String message) {
+        this.message = message;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogType.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogType.java
new file mode 100644
index 0000000..1c44232
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/LogType.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 日志类型
+ *
+ * @author fengshuonan
+ * @Date 2017年1月22日 下午12:14:59
+ */
+public enum LogType {
+
+    LOGIN("登录日志"),
+    LOGIN_FAIL("登录失败日志"),
+    EXIT("退出日志"),
+    EXCEPTION("异常日志"),
+    BUSSINESS("业务日志");
+
+    String message;
+
+    LogType(String message) {
+        this.message = message;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ManagerStatus.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ManagerStatus.java
new file mode 100644
index 0000000..0de9d4f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/ManagerStatus.java
@@ -0,0 +1,49 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 管理员的状态
+ *
+ * @author fengshuonan
+ * @Date 2017年1月10日 下午9:54:13
+ */
+public enum ManagerStatus {
+
+    OK(1, "启用"), FREEZED(2, "冻结"), DELETED(3, "被删除");
+
+    int code;
+    String message;
+
+    ManagerStatus(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public static String valueOf(Integer value) {
+        if (value == null) {
+            return "";
+        } else {
+            for (ManagerStatus ms : ManagerStatus.values()) {
+                if (ms.getCode() == value) {
+                    return ms.getMessage();
+                }
+            }
+            return "";
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuOpenStatus.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuOpenStatus.java
new file mode 100644
index 0000000..f0c5841
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuOpenStatus.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 菜单是否打开的状态
+ *
+ * @author fengshuonan
+ * @Date 2017年4月8日10:12:15
+ */
+public enum MenuOpenStatus {
+
+    OPEN(1, "打开"),
+    CLOSE(0, "关闭");
+
+    int code;
+    String message;
+
+    MenuOpenStatus(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public static String valueOf(Integer status) {
+        if (status == null) {
+            return "";
+        } else {
+            for (MenuOpenStatus s : MenuOpenStatus.values()) {
+                if (s.getCode() == status) {
+                    return s.getMessage();
+                }
+            }
+            return "";
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuStatus.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuStatus.java
new file mode 100644
index 0000000..940fe84
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/MenuStatus.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 菜单的状态
+ *
+ * @author fengshuonan
+ * @Date 2017年1月22日 下午12:14:59
+ */
+public enum MenuStatus {
+
+    ENABLE(1, "启用"),
+    DISABLE(0, "禁用");
+
+    int code;
+    String message;
+
+    MenuStatus(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public static String valueOf(Integer status) {
+        if (status == null) {
+            return "";
+        } else {
+            for (MenuStatus s : MenuStatus.values()) {
+                if (s.getCode() == status) {
+                    return s.getMessage();
+                }
+            }
+            return "";
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/Order.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/Order.java
new file mode 100644
index 0000000..5856284
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/constant/state/Order.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.core.common.constant.state;
+
+/**
+ * 数据库排序
+ *
+ * @author fengshuonan
+ * @Date 2017年5月31日20:48:41
+ */
+public enum Order {
+
+    ASC("asc"), DESC("desc");
+
+    private String des;
+
+    Order(String des) {
+        this.des = des;
+    }
+
+    public String getDes() {
+        return des;
+    }
+
+    public void setDes(String des) {
+        this.des = des;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/BizExceptionEnum.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/BizExceptionEnum.java
new file mode 100644
index 0000000..2f1812b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/BizExceptionEnum.java
@@ -0,0 +1,100 @@
+package com.stylefeng.guns.core.common.exception;
+
+import com.stylefeng.guns.core.exception.ServiceExceptionEnum;
+
+/**
+ * @author fengshuonan
+ * @Description 所有业务异常的枚举
+ * @date 2016年11月12日 下午5:04:51
+ */
+public enum BizExceptionEnum implements ServiceExceptionEnum {
+
+    /**
+     * 字典
+     */
+    DICT_EXISTED(400, "字典已经存在"),
+    ERROR_CREATE_DICT(500, "创建字典失败"),
+    ERROR_WRAPPER_FIELD(500, "包装字典属性失败"),
+    ERROR_CODE_EMPTY(500, "字典类型不能为空"),
+
+    /**
+     * 文件上传
+     */
+    FILE_READING_ERROR(400, "FILE_READING_ERROR!"),
+    FILE_NOT_FOUND(400, "FILE_NOT_FOUND!"),
+    UPLOAD_ERROR(500, "上传图片出错"),
+
+    /**
+     * 权限和数据问题
+     */
+    DB_RESOURCE_NULL(400, "数据库中没有该资源"),
+    NO_PERMITION(405, "权限异常"),
+    REQUEST_INVALIDATE(400, "请求数据格式不正确"),
+    INVALID_KAPTCHA(400, "验证码不正确"),
+    CANT_DELETE_ADMIN(600, "不能删除超级管理员"),
+    CANT_FREEZE_ADMIN(600, "不能冻结超级管理员"),
+    CANT_CHANGE_ADMIN(600, "不能修改超级管理员角色"),
+
+    /**
+     * 账户问题
+     */
+    USER_ALREADY_REG(401, "该用户已经注册"),
+    NO_THIS_USER(400, "没有此用户"),
+    USER_NOT_EXISTED(400, "没有此用户"),
+    ACCOUNT_FREEZED(401, "账号被冻结"),
+    OLD_PWD_NOT_RIGHT(402, "原密码不正确"),
+    TWO_PWD_NOT_MATCH(405, "两次输入密码不一致"),
+
+    /**
+     * 错误的请求
+     */
+    MENU_PCODE_COINCIDENCE(400, "菜单编号和副编号不能一致"),
+    EXISTED_THE_MENU(400, "菜单编号重复,不能添加"),
+    DICT_MUST_BE_NUMBER(400, "字典的值必须为数字"),
+    REQUEST_NULL(400, "请求有错误"),
+    SESSION_TIMEOUT(400, "会话超时"),
+    SERVER_ERROR(500, "服务器异常"),
+
+    /**
+     * token异常
+     */
+    TOKEN_EXPIRED(700, "token过期"),
+    TOKEN_ERROR(700, "token验证失败"),
+
+    /**
+     * 签名异常
+     */
+    SIGN_ERROR(700, "签名验证失败"),
+
+    /**
+     * 其他
+     */
+    AUTH_REQUEST_ERROR(400, "账号密码错误");
+
+    BizExceptionEnum(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    private Integer code;
+
+    private String message;
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/InvalidKaptchaException.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/InvalidKaptchaException.java
new file mode 100644
index 0000000..78581cd
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/common/exception/InvalidKaptchaException.java
@@ -0,0 +1,10 @@
+package com.stylefeng.guns.core.common.exception;
+
+/**
+ * 验证码错误异常
+ *
+ * @author fengshuonan
+ * @date 2017-05-05 23:52
+ */
+public class InvalidKaptchaException extends RuntimeException {
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/GunsUserFilter.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/GunsUserFilter.java
new file mode 100644
index 0000000..3e98298
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/GunsUserFilter.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package com.stylefeng.guns.core.intercept;
+
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.web.filter.AccessControlFilter;
+import org.apache.shiro.web.util.WebUtils;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Filter that allows access to resources if the accessor is a known user, which is defined as
+ * having a known principal.  This means that any user who is authenticated or remembered via a
+ * 'remember me' feature will be allowed access from this filter.
+ * <p/>
+ * If the accessor is not a known user, then they will be redirected to the {@link #setLoginUrl(String) loginUrl}</p>
+ *
+ * @since 0.9
+ */
+public class GunsUserFilter extends AccessControlFilter {
+
+    /**
+     * Returns <code>true</code> if the request is a
+     * {@link #isLoginRequest(javax.servlet.ServletRequest, javax.servlet.ServletResponse) loginRequest} or
+     * if the current {@link #getSubject(javax.servlet.ServletRequest, javax.servlet.ServletResponse) subject}
+     * is not <code>null</code>, <code>false</code> otherwise.
+     *
+     * @return <code>true</code> if the request is a
+     * {@link #isLoginRequest(javax.servlet.ServletRequest, javax.servlet.ServletResponse) loginRequest} or
+     * if the current {@link #getSubject(javax.servlet.ServletRequest, javax.servlet.ServletResponse) subject}
+     * is not <code>null</code>, <code>false</code> otherwise.
+     */
+    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
+        if (isLoginRequest(request, response)) {
+            return true;
+        } else {
+            Subject subject = getSubject(request, response);
+            // If principal is not null, then the user is known and should be allowed access.
+            return subject.getPrincipal() != null;
+        }
+    }
+
+    /**
+     * This default implementation simply calls
+     * {@link #saveRequestAndRedirectToLogin(javax.servlet.ServletRequest, javax.servlet.ServletResponse) saveRequestAndRedirectToLogin}
+     * and then immediately returns <code>false</code>, thereby preventing the chain from continuing so the redirect may
+     * execute.
+     */
+    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
+        HttpServletRequest httpServletRequest = WebUtils.toHttp(request);
+        HttpServletResponse httpServletResponse = WebUtils.toHttp(response);
+
+        /**
+         * 如果是ajax请求则不进行跳转
+         */
+        if (httpServletRequest.getHeader("x-requested-with") != null
+                && httpServletRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
+            httpServletResponse.setHeader("sessionstatus", "timeout");
+            return false;
+        } else {
+
+            /**
+             * 第一次点击页面
+             */
+            String referer = httpServletRequest.getHeader("Referer");
+            if (referer == null) {
+                saveRequestAndRedirectToLogin(request, response);
+                return false;
+            } else {
+
+                /**
+                 * 从别的页面跳转过来的
+                 */
+                if (ShiroKit.getSession().getAttribute("sessionFlag") == null) {
+                    httpServletRequest.setAttribute("tips", "请重新登录");
+                    httpServletRequest.getRequestDispatcher("/login").forward(request, response);
+                    return false;
+                } else {
+                    saveRequestAndRedirectToLogin(request, response);
+                    return false;
+                }
+            }
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/RestApiInteceptor.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/RestApiInteceptor.java
new file mode 100644
index 0000000..1415e13
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/RestApiInteceptor.java
@@ -0,0 +1,62 @@
+package com.stylefeng.guns.core.intercept;
+
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.common.constant.JwtConstants;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.util.JwtTokenUtil;
+import com.stylefeng.guns.core.util.RenderUtil;
+import io.jsonwebtoken.JwtException;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * Rest Api接口鉴权
+ *
+ * @author stylefeng
+ * @Date 2018/7/20 23:11
+ */
+public class RestApiInteceptor extends HandlerInterceptorAdapter {
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        if (handler instanceof org.springframework.web.servlet.resource.ResourceHttpRequestHandler) {
+            return true;
+        }
+        HandlerMethod handlerMethod = (HandlerMethod) handler;
+        return check(request, response, handlerMethod);
+    }
+
+    private boolean check(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) {
+        if (request.getServletPath().equals(JwtConstants.AUTH_PATH)) {
+            return true;
+        }
+        final String requestHeader = request.getHeader(JwtConstants.AUTH_HEADER);
+        String authToken;
+        if (requestHeader != null && requestHeader.startsWith("Bearer ")) {
+            authToken = requestHeader.substring(7);
+
+            //验证token是否过期,包含了验证jwt是否正确
+            try {
+                boolean flag = JwtTokenUtil.isTokenExpired(authToken);
+                if (flag) {
+                    RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_EXPIRED.getCode(), BizExceptionEnum.TOKEN_EXPIRED.getMessage()));
+                    return false;
+                }
+            } catch (JwtException e) {
+                //有异常就是token解析失败
+                RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_ERROR.getCode(), BizExceptionEnum.TOKEN_ERROR.getMessage()));
+                return false;
+            }
+        } else {
+            //header没有带Bearer字段
+            RenderUtil.renderJson(response, new ErrorTip(BizExceptionEnum.TOKEN_ERROR.getCode(), BizExceptionEnum.TOKEN_ERROR.getMessage()));
+            return false;
+        }
+        return true;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/SessionHolderInterceptor.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/SessionHolderInterceptor.java
new file mode 100644
index 0000000..acafeaf
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/SessionHolderInterceptor.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.core.intercept;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.util.HttpSessionHolder;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+
+/**
+ * 静态调用session的拦截器
+ *
+ * @author fengshuonan
+ * @date 2016年11月13日 下午10:15:42
+ */
+@Aspect
+@Component
+public class SessionHolderInterceptor extends BaseController {
+
+    @Pointcut("execution(* com.stylefeng.guns.*..controller.*.*(..))")
+    public void cutService() {
+    }
+
+    @Around("cutService()")
+    public Object sessionKit(ProceedingJoinPoint point) throws Throwable {
+        HttpSessionHolder.put(super.getHttpServletRequest().getSession());
+        try {
+            return point.proceed();
+        } finally {
+            HttpSessionHolder.remove();
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/listener/ConfigListener.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/listener/ConfigListener.java
new file mode 100644
index 0000000..18089f5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/listener/ConfigListener.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package com.stylefeng.guns.core.listener;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * ServletContext监听器
+ *
+ * @author stylefeng
+ * @Date 2018/2/22 21:07
+ */
+public class ConfigListener implements ServletContextListener {
+
+    private static Map<String, String> conf = new HashMap<>();
+
+    public static Map<String, String> getConf() {
+        return conf;
+    }
+
+    @Override
+    public void contextDestroyed(ServletContextEvent arg0) {
+        conf.clear();
+    }
+
+    @Override
+    public void contextInitialized(ServletContextEvent evt) {
+        ServletContext sc = evt.getServletContext();
+
+        //项目发布,当前运行环境的绝对路径
+        conf.put("realPath", sc.getRealPath("/").replaceFirst("/", ""));
+
+        //servletContextPath,默认""
+        conf.put("contextPath", sc.getContextPath());
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogManager.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogManager.java
new file mode 100644
index 0000000..8d5e20e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogManager.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.core.log;
+
+import java.util.TimerTask;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 日志管理器
+ *
+ * @author fengshuonan
+ * @date 2017-03-30 16:29
+ */
+public class LogManager {
+
+    //日志记录操作延时
+    private final int OPERATE_DELAY_TIME = 10;
+
+    //异步操作记录日志的线程池
+    private ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
+
+    private LogManager() {
+    }
+
+    public static LogManager logManager = new LogManager();
+
+    public static LogManager me() {
+        return logManager;
+    }
+
+    public void executeLog(TimerTask task) {
+        executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogObjectHolder.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogObjectHolder.java
new file mode 100644
index 0000000..f43d81b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/LogObjectHolder.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.core.log;
+
+import com.stylefeng.guns.core.util.SpringContextHolder;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.WebApplicationContext;
+
+import java.io.Serializable;
+
+/**
+ * 被修改的bean临时存放的地方
+ *
+ * @author fengshuonan
+ * @date 2017-03-31 11:19
+ */
+@Component
+@Scope(scopeName = WebApplicationContext.SCOPE_SESSION)
+public class LogObjectHolder implements Serializable{
+
+    private Object object = null;
+
+    public void set(Object obj) {
+        this.object = obj;
+    }
+
+    public Object get() {
+        return object;
+    }
+
+    public static LogObjectHolder me(){
+        LogObjectHolder bean = SpringContextHolder.getBean(LogObjectHolder.class);
+        return bean;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogFactory.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogFactory.java
new file mode 100644
index 0000000..3094dd9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogFactory.java
@@ -0,0 +1,47 @@
+package com.stylefeng.guns.core.log.factory;
+
+import com.stylefeng.guns.core.common.constant.state.LogSucceed;
+import com.stylefeng.guns.core.common.constant.state.LogType;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+
+import java.util.Date;
+
+/**
+ * 日志对象创建工厂
+ *
+ * @author fengshuonan
+ * @date 2016年12月6日 下午9:18:27
+ */
+public class LogFactory {
+
+    /**
+     * 创建操作日志
+     */
+    public static OperationLog createOperationLog(LogType logType, Integer userId, String bussinessName, String clazzName, String methodName, String msg, LogSucceed succeed) {
+        OperationLog operationLog = new OperationLog();
+        operationLog.setLogtype(logType.getMessage());
+        operationLog.setLogname(bussinessName);
+        operationLog.setUserid(userId);
+        operationLog.setClassname(clazzName);
+        operationLog.setMethod(methodName);
+        operationLog.setCreatetime(new Date());
+        operationLog.setSucceed(succeed.getMessage());
+        operationLog.setMessage(msg);
+        return operationLog;
+    }
+
+    /**
+     * 创建登录日志
+     */
+    public static LoginLog createLoginLog(LogType logType, Integer userId, String msg, String ip) {
+        LoginLog loginLog = new LoginLog();
+        loginLog.setLogname(logType.getMessage());
+        loginLog.setUserid(userId);
+        loginLog.setCreatetime(new Date());
+        loginLog.setSucceed(LogSucceed.SUCCESS.getMessage());
+        loginLog.setIp(ip);
+        loginLog.setMessage(msg);
+        return loginLog;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogTaskFactory.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogTaskFactory.java
new file mode 100644
index 0000000..2c29451
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/log/factory/LogTaskFactory.java
@@ -0,0 +1,102 @@
+package com.stylefeng.guns.core.log.factory;
+
+import com.stylefeng.guns.core.common.constant.state.LogSucceed;
+import com.stylefeng.guns.core.common.constant.state.LogType;
+import com.stylefeng.guns.modular.system.dao.LoginLogMapper;
+import com.stylefeng.guns.modular.system.dao.OperationLogMapper;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+import com.stylefeng.guns.core.db.Db;
+import com.stylefeng.guns.core.log.LogManager;
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.TimerTask;
+
+/**
+ * 日志操作任务创建工厂
+ *
+ * @author fengshuonan
+ * @date 2016年12月6日 下午9:18:27
+ */
+public class LogTaskFactory {
+
+    private static Logger logger = LoggerFactory.getLogger(LogManager.class);
+    private static LoginLogMapper loginLogMapper = Db.getMapper(LoginLogMapper.class);
+    private static OperationLogMapper operationLogMapper = Db.getMapper(OperationLogMapper.class);
+
+    public static TimerTask loginLog(final Integer userId, final String ip) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                try {
+                    LoginLog loginLog = LogFactory.createLoginLog(LogType.LOGIN, userId, null, ip);
+                    loginLogMapper.insert(loginLog);
+                } catch (Exception e) {
+                    logger.error("创建登录日志异常!", e);
+                }
+            }
+        };
+    }
+
+    public static TimerTask loginLog(final String username, final String msg, final String ip) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                LoginLog loginLog = LogFactory.createLoginLog(
+                        LogType.LOGIN_FAIL, null, "账号:" + username + "," + msg, ip);
+                try {
+                    loginLogMapper.insert(loginLog);
+                } catch (Exception e) {
+                    logger.error("创建登录失败异常!", e);
+                }
+            }
+        };
+    }
+
+    public static TimerTask exitLog(final Integer userId, final String ip) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                LoginLog loginLog = LogFactory.createLoginLog(LogType.EXIT, userId, null,ip);
+                try {
+                    loginLogMapper.insert(loginLog);
+                } catch (Exception e) {
+                    logger.error("创建退出日志异常!", e);
+                }
+            }
+        };
+    }
+
+    public static TimerTask bussinessLog(final Integer userId, final String bussinessName, final String clazzName, final String methodName, final String msg) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                OperationLog operationLog = LogFactory.createOperationLog(
+                        LogType.BUSSINESS, userId, bussinessName, clazzName, methodName, msg, LogSucceed.SUCCESS);
+                try {
+                    operationLogMapper.insert(operationLog);
+                } catch (Exception e) {
+                    logger.error("创建业务日志异常!", e);
+                }
+            }
+        };
+    }
+
+    public static TimerTask exceptionLog(final Integer userId, final Exception exception) {
+        return new TimerTask() {
+            @Override
+            public void run() {
+                String msg = ToolUtil.getExceptionMsg(exception);
+                OperationLog operationLog = LogFactory.createOperationLog(
+                        LogType.EXCEPTION, userId, "", null, null, msg, LogSucceed.FAIL);
+                try {
+                    operationLogMapper.insert(operationLog);
+                } catch (Exception e) {
+                    logger.error("创建异常日志异常!", e);
+                }
+            }
+        };
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroDbRealm.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroDbRealm.java
new file mode 100644
index 0000000..2a95558
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroDbRealm.java
@@ -0,0 +1,78 @@
+package com.stylefeng.guns.core.shiro;
+
+import com.stylefeng.guns.core.shiro.factory.IShiro;
+import com.stylefeng.guns.core.shiro.factory.ShiroFactroy;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.AuthenticationInfo;
+import org.apache.shiro.authc.AuthenticationToken;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.authc.credential.CredentialsMatcher;
+import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.apache.shiro.authz.AuthorizationInfo;
+import org.apache.shiro.authz.SimpleAuthorizationInfo;
+import org.apache.shiro.realm.AuthorizingRealm;
+import org.apache.shiro.subject.PrincipalCollection;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class ShiroDbRealm extends AuthorizingRealm {
+
+    /**
+     * 登录认证
+     */
+    @Override
+    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)
+            throws AuthenticationException {
+        IShiro shiroFactory = ShiroFactroy.me();
+        UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
+        User user = shiroFactory.user(token.getUsername());
+        ShiroUser shiroUser = shiroFactory.shiroUser(user);
+        return shiroFactory.info(shiroUser, user, super.getName());
+    }
+
+    /**
+     * 权限认证
+     */
+    @Override
+    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
+        IShiro shiroFactory = ShiroFactroy.me();
+        ShiroUser shiroUser = (ShiroUser) principals.getPrimaryPrincipal();
+        List<Integer> roleList = shiroUser.getRoleList();
+
+        Set<String> permissionSet = new HashSet<>();
+        Set<String> roleNameSet = new HashSet<>();
+
+        for (Integer roleId : roleList) {
+            List<String> permissions = shiroFactory.findPermissionsByRoleId(roleId);
+            if (permissions != null) {
+                for (String permission : permissions) {
+                    if (ToolUtil.isNotEmpty(permission)) {
+                        permissionSet.add(permission);
+                    }
+                }
+            }
+            String roleName = shiroFactory.findRoleNameByRoleId(roleId);
+            roleNameSet.add(roleName);
+        }
+
+        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
+        info.addStringPermissions(permissionSet);
+        info.addRoles(roleNameSet);
+        return info;
+    }
+
+    /**
+     * 设置认证加密方式
+     */
+    @Override
+    public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {
+        HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
+        md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
+        md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations);
+        super.setCredentialsMatcher(md5CredentialsMatcher);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroKit.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroKit.java
new file mode 100644
index 0000000..eedfe1c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroKit.java
@@ -0,0 +1,290 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package com.stylefeng.guns.core.shiro;
+
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.crypto.hash.Md5Hash;
+import org.apache.shiro.crypto.hash.SimpleHash;
+import org.apache.shiro.session.Session;
+import org.apache.shiro.subject.Subject;
+import org.apache.shiro.util.ByteSource;
+
+import java.util.List;
+
+/**
+ * shiro工具类
+ *
+ * @author dafei, Chill Zhuang
+ */
+public class ShiroKit {
+
+    private static final String NAMES_DELIMETER = ",";
+
+    /**
+     * 加盐参数
+     */
+    public final static String hashAlgorithmName = "MD5";
+
+    /**
+     * 循环次数
+     */
+    public final static int hashIterations = 1024;
+
+    /**
+     * shiro密码加密工具类
+     *
+     * @param credentials 密码
+     * @param saltSource 密码盐
+     * @return
+     */
+    public static String md5(String credentials, String saltSource) {
+        ByteSource salt = new Md5Hash(saltSource);
+        return new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations).toString();
+    }
+
+    /**
+     * 获取随机盐值
+     * @param length
+     * @return
+     */
+    public static String getRandomSalt(int length) {
+        return ToolUtil.getRandomString(length);
+    }
+
+    /**
+     * 获取当前 Subject
+     *
+     * @return Subject
+     */
+    public static Subject getSubject() {
+        return SecurityUtils.getSubject();
+    }
+
+    /**
+     * 获取封装的 ShiroUser
+     *
+     * @return ShiroUser
+     */
+    public static ShiroUser getUser() {
+        if (isGuest()) {
+            return null;
+        } else {
+            return (ShiroUser) getSubject().getPrincipals().getPrimaryPrincipal();
+        }
+    }
+
+    /**
+     * 从shiro获取session
+     *
+     */
+    public static Session getSession() {
+        return getSubject().getSession();
+    }
+
+    /**
+     * 获取shiro指定的sessionKey
+     *
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getSessionAttr(String key) {
+        Session session = getSession();
+        return session != null ? (T) session.getAttribute(key) : null;
+    }
+
+    /**
+     * 设置shiro指定的sessionKey
+     *
+     */
+    public static void setSessionAttr(String key, Object value) {
+        Session session = getSession();
+        session.setAttribute(key, value);
+    }
+
+    /**
+     * 移除shiro指定的sessionKey
+     */
+    public static void removeSessionAttr(String key) {
+        Session session = getSession();
+        if (session != null)
+            session.removeAttribute(key);
+    }
+
+    /**
+     * 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用
+     *
+     * @param roleName
+     *            角色名
+     * @return 属于该角色:true,否则false
+     */
+    public static boolean hasRole(String roleName) {
+        return getSubject() != null && roleName != null
+                && roleName.length() > 0 && getSubject().hasRole(roleName);
+    }
+
+    /**
+     * 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。
+     *
+     * @param roleName
+     *            角色名
+     * @return 不属于该角色:true,否则false
+     */
+    public static boolean lacksRole(String roleName) {
+        return !hasRole(roleName);
+    }
+
+    /**
+     * 验证当前用户是否属于以下任意一个角色。
+     *
+     * @param roleNames
+     *            角色列表
+     * @return 属于:true,否则false
+     */
+    public static boolean hasAnyRoles(String roleNames) {
+        boolean hasAnyRole = false;
+        Subject subject = getSubject();
+        if (subject != null && roleNames != null && roleNames.length() > 0) {
+            for (String role : roleNames.split(NAMES_DELIMETER)) {
+                if (subject.hasRole(role.trim())) {
+                    hasAnyRole = true;
+                    break;
+                }
+            }
+        }
+        return hasAnyRole;
+    }
+
+    /**
+     * 验证当前用户是否属于以下所有角色。
+     *
+     * @param roleNames
+     *            角色列表
+     * @return 属于:true,否则false
+     */
+    public static boolean hasAllRoles(String roleNames) {
+        boolean hasAllRole = true;
+        Subject subject = getSubject();
+        if (subject != null && roleNames != null && roleNames.length() > 0) {
+            for (String role : roleNames.split(NAMES_DELIMETER)) {
+                if (!subject.hasRole(role.trim())) {
+                    hasAllRole = false;
+                    break;
+                }
+            }
+        }
+        return hasAllRole;
+    }
+
+    /**
+     * 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用
+     *
+     * @param permission
+     *            权限名
+     * @return 拥有权限:true,否则false
+     */
+    public static boolean hasPermission(String permission) {
+        return getSubject() != null && permission != null
+                && permission.length() > 0
+                && getSubject().isPermitted(permission);
+    }
+
+    /**
+     * 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。
+     *
+     * @param permission
+     *            权限名
+     * @return 拥有权限:true,否则false
+     */
+    public static boolean lacksPermission(String permission) {
+        return !hasPermission(permission);
+    }
+
+    /**
+     * 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用
+     *
+     * @return 通过身份验证:true,否则false
+     */
+    public static boolean isAuthenticated() {
+        return getSubject() != null && getSubject().isAuthenticated();
+    }
+
+    /**
+     * 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。
+     *
+     * @return 没有通过身份验证:true,否则false
+     */
+    public static boolean notAuthenticated() {
+        return !isAuthenticated();
+    }
+
+    /**
+     * 认证通过或已记住的用户。与guset搭配使用。
+     *
+     * @return 用户:true,否则 false
+     */
+    public static boolean isUser() {
+        return getSubject() != null && getSubject().getPrincipal() != null;
+    }
+
+    /**
+     * 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用
+     *
+     * @return 访客:true,否则false
+     */
+    public static boolean isGuest() {
+        return !isUser();
+    }
+
+    /**
+     * 输出当前用户信息,通常为登录帐号信息。
+     *
+     * @return 当前用户信息
+     */
+    public static String principal() {
+        if (getSubject() != null) {
+            Object principal = getSubject().getPrincipal();
+            return principal.toString();
+        }
+        return "";
+    }
+
+    /**
+     * 获取当前用户的部门数据范围的集合
+     */
+    public static List<Integer> getDeptDataScope() {
+        Integer deptId = getUser().getDeptId();
+        List<Integer> subDeptIds = ConstantFactory.me().getSubDeptId(deptId);
+        subDeptIds.add(deptId);
+        return subDeptIds;
+    }
+
+    /**
+     * 判断当前用户是否是超级管理员
+     */
+    public static boolean isAdmin() {
+        List<Integer> roleList = ShiroKit.getUser().getRoleList();
+        for (Integer integer : roleList) {
+            String singleRoleTip = ConstantFactory.me().getSingleRoleTip(integer);
+            if (singleRoleTip.equals(Const.ADMIN_NAME)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroUser.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroUser.java
new file mode 100644
index 0000000..defcc45
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/ShiroUser.java
@@ -0,0 +1,98 @@
+package com.stylefeng.guns.core.shiro;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息
+ *
+ * @author fengshuonan
+ * @date 2016年12月5日 上午10:26:43
+ */
+public class ShiroUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public Integer id;          // 主键ID
+    public String account;      // 账号
+    public String name;         // 姓名
+    public Integer deptId;      // 部门id
+    public List<Integer> roleList; // 角色集
+    public String deptName;        // 部门名称
+    public List<String> roleNames; // 角色名称集
+    public Integer roleType; // 角色类型 1=平台 2=分公司 3=加盟商
+    public Integer objectId; // 对象ID
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getAccount() {
+        return account;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Integer deptId) {
+        this.deptId = deptId;
+    }
+
+    public List<Integer> getRoleList() {
+        return roleList;
+    }
+
+    public void setRoleList(List<Integer> roleList) {
+        this.roleList = roleList;
+    }
+
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    public List<String> getRoleNames() {
+        return roleNames;
+    }
+
+    public void setRoleNames(List<String> roleNames) {
+        this.roleNames = roleNames;
+    }
+
+    public Integer getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(Integer roleType) {
+        this.roleType = roleType;
+    }
+
+    public Integer getObjectId() {
+        return objectId;
+    }
+
+    public void setObjectId(Integer objectId) {
+        this.objectId = objectId;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/ICheck.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/ICheck.java
new file mode 100644
index 0000000..b93a834
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/ICheck.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package com.stylefeng.guns.core.shiro.check;
+
+/**
+ * 检查用接口
+ */
+public interface ICheck {
+
+    /**
+     * 检查当前登录用户是否拥有指定的角色访问当
+     */
+    boolean check(Object[] permissions);
+
+    /**
+     * 检查当前登录用户是否拥有当前请求的servlet的权限
+     */
+    boolean checkAll();
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckFactory.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckFactory.java
new file mode 100644
index 0000000..89f602f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckFactory.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package com.stylefeng.guns.core.shiro.check;
+
+import com.stylefeng.guns.core.listener.ConfigListener;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.support.CollectionKit;
+import com.stylefeng.guns.core.support.HttpKit;
+import com.stylefeng.guns.core.util.SpringContextHolder;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 权限自定义检查
+ */
+@Service
+@DependsOn("springContextHolder")
+@Transactional(readOnly = true)
+public class PermissionCheckFactory implements ICheck {
+
+    public static ICheck me() {
+        return SpringContextHolder.getBean(ICheck.class);
+    }
+
+    @Override
+    public boolean check(Object[] permissions) {
+        ShiroUser user = ShiroKit.getUser();
+        if (null == user) {
+            return false;
+        }
+        String join = CollectionKit.join(permissions, ",");
+        if (ShiroKit.hasAnyRoles(join)) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean checkAll() {
+        HttpServletRequest request = HttpKit.getRequest();
+        ShiroUser user = ShiroKit.getUser();
+        if (null == user) {
+            return false;
+        }
+        String requestURI = request.getRequestURI().replaceFirst(ConfigListener.getConf().get("contextPath"), "");
+        String[] str = requestURI.split("/");
+        if (str.length > 3) {
+            requestURI = "/" + str[1] + "/" + str[2];
+        }
+        if (ShiroKit.hasPermission(requestURI)) {
+            return true;
+        }
+        return false;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckManager.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckManager.java
new file mode 100644
index 0000000..690f728
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/check/PermissionCheckManager.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package com.stylefeng.guns.core.shiro.check;
+
+import com.stylefeng.guns.core.util.SpringContextHolder;
+
+/**
+ * 权限检查管理器(入口)
+ */
+public class PermissionCheckManager {
+    private final static PermissionCheckManager me = new PermissionCheckManager();
+
+    private ICheck defaultCheckFactory = SpringContextHolder.getBean(ICheck.class);
+
+    public static PermissionCheckManager me() {
+        return me;
+    }
+
+    private PermissionCheckManager() {
+    }
+
+    public PermissionCheckManager(ICheck checkFactory) {
+        this.defaultCheckFactory = checkFactory;
+    }
+
+    public void setDefaultCheckFactory(ICheck defaultCheckFactory) {
+        this.defaultCheckFactory = defaultCheckFactory;
+    }
+
+    public static boolean check(Object[] permissions) {
+        return me.defaultCheckFactory.check(permissions);
+    }
+
+    public static boolean checkAll() {
+        return me.defaultCheckFactory.checkAll();
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/IShiro.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/IShiro.java
new file mode 100644
index 0000000..c701170
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/IShiro.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.core.shiro.factory;
+
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+
+import java.util.List;
+
+/**
+ * 定义shirorealm所需数据的接口
+ *
+ * @author fengshuonan
+ * @date 2016年12月5日 上午10:23:34
+ */
+public interface IShiro {
+
+    /**
+     * 根据账号获取登录用户
+     *
+     * @param account 账号
+     */
+    User user(String account);
+
+    /**
+     * 根据系统用户获取Shiro的用户
+     *
+     * @param user 系统用户
+     */
+    ShiroUser shiroUser(User user);
+
+    /**
+     * 获取权限列表通过角色id
+     *
+     * @param roleId 角色id
+     */
+    List<String> findPermissionsByRoleId(Integer roleId);
+
+    /**
+     * 根据角色id获取角色名称
+     *
+     * @param roleId 角色id
+     */
+    String findRoleNameByRoleId(Integer roleId);
+
+    /**
+     * 获取shiro的认证信息
+     */
+    SimpleAuthenticationInfo info(ShiroUser shiroUser, User user, String realmName);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/ShiroFactroy.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/ShiroFactroy.java
new file mode 100644
index 0000000..970a268
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/shiro/factory/ShiroFactroy.java
@@ -0,0 +1,98 @@
+package com.stylefeng.guns.core.shiro.factory;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.constant.state.ManagerStatus;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.Convert;
+import com.stylefeng.guns.core.util.SpringContextHolder;
+import com.stylefeng.guns.modular.system.dao.MenuMapper;
+import com.stylefeng.guns.modular.system.dao.UserMapper;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.shiro.authc.CredentialsException;
+import org.apache.shiro.authc.LockedAccountException;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+import org.apache.shiro.crypto.hash.Md5Hash;
+import org.apache.shiro.util.ByteSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.DependsOn;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@DependsOn("springContextHolder")
+@Transactional(readOnly = true)
+public class ShiroFactroy implements IShiro {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private MenuMapper menuMapper;
+
+    public static IShiro me() {
+        return SpringContextHolder.getBean(IShiro.class);
+    }
+
+    @Override
+    public User user(String account) {
+
+        User user = userMapper.getByAccount(account);
+
+        // 账号不存在
+        if (null == user) {
+            throw new CredentialsException();
+        }
+        // 账号被冻结
+        if (user.getStatus() != ManagerStatus.OK.getCode()) {
+            throw new LockedAccountException();
+        }
+        return user;
+    }
+
+    @Override
+    public ShiroUser shiroUser(User user) {
+        ShiroUser shiroUser = new ShiroUser();
+
+        shiroUser.setId(user.getId());
+        shiroUser.setAccount(user.getAccount());
+        shiroUser.setDeptId(user.getDeptid());
+        shiroUser.setDeptName(ConstantFactory.me().getDeptName(user.getDeptid()));
+        shiroUser.setName(user.getName());
+
+        Integer[] roleArray = Convert.toIntArray(user.getRoleid());
+        List<Integer> roleList = new ArrayList<Integer>();
+        List<String> roleNameList = new ArrayList<String>();
+        for (int roleId : roleArray) {
+            roleList.add(roleId);
+            roleNameList.add(ConstantFactory.me().getSingleRoleName(roleId));
+        }
+        shiroUser.setRoleList(roleList);
+        shiroUser.setRoleNames(roleNameList);
+
+        return shiroUser;
+    }
+
+    @Override
+    public List<String> findPermissionsByRoleId(Integer roleId) {
+        return menuMapper.getResUrlsByRoleId(roleId);
+    }
+
+    @Override
+    public String findRoleNameByRoleId(Integer roleId) {
+        return ConstantFactory.me().getSingleRoleTip(roleId);
+    }
+
+    @Override
+    public SimpleAuthenticationInfo info(ShiroUser shiroUser, User user, String realmName) {
+        String credentials = user.getPassword();
+
+        // 密码加盐处理
+        String source = user.getSalt();
+        ByteSource credentialsSalt = new Md5Hash(source);
+        return new SimpleAuthenticationInfo(shiroUser, credentials, credentialsSalt, realmName);
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/tag/DictSelectorTag.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/tag/DictSelectorTag.java
new file mode 100644
index 0000000..a07afe1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/tag/DictSelectorTag.java
@@ -0,0 +1,201 @@
+package com.stylefeng.guns.core.tag;
+
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.Dict;
+import com.stylefeng.guns.modular.system.service.IDictService;
+import org.beetl.core.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典标签渲染
+ *
+ * @author zhangjiajia
+ * @Date 2018年6月4日17:33:32
+ */
+@Component
+@Scope("prototype")
+public class DictSelectorTag extends Tag {
+
+    @Autowired
+    IDictService iDictService;
+
+    @Override
+    public void render(){
+        //String tagName = (String) this.args[0];
+        Map attrs = (Map) args[1];
+        if(ToolUtil.isEmpty(attrs.get("code"))){
+            throw new GunsException(BizExceptionEnum.ERROR_CODE_EMPTY);
+        }
+
+        //字典类型编码
+        String code = attrs.get("code").toString();
+        //控件显示类型select 选择框,radio 单选按钮,checkbox 多选按钮
+        String type = ToolUtil.isNotEmpty(attrs.get("type"))?attrs.get("type").toString():"select";
+        //开启多选
+        String multiple = ToolUtil.isNotEmpty(attrs.get("multiple"))?attrs.get("multiple").toString():"";
+        //字典名称
+        String label = ToolUtil.isNotEmpty(attrs.get("label"))?attrs.get("label").toString():"";
+        //提示
+        String placeholder = (ToolUtil.isNotEmpty(attrs.get("placeholder"))?attrs.get("placeholder").toString():"");
+        //宽度
+        String width = ToolUtil.isNotEmpty(attrs.get("width"))?attrs.get("width").toString():"248";
+        //默认值
+        String value = ToolUtil.isNotEmpty(attrs.get("value"))?attrs.get("value").toString():"";
+        //id
+        String id = ToolUtil.isNotEmpty(attrs.get("id"))?attrs.get("id").toString():"";
+        //name
+        String name = ToolUtil.isNotEmpty(attrs.get("name"))?attrs.get("name").toString():"";
+        //分割线
+        String underline = ToolUtil.isNotEmpty(attrs.get("underline"))?attrs.get("underline").toString():"";
+        //onchange事件
+        String onchange = ToolUtil.isNotEmpty(attrs.get("onchange"))?attrs.get("onchange").toString():"";
+        //readonly属性
+        String readonly = ToolUtil.isNotEmpty(attrs.get("readonly"))?attrs.get("readonly").toString():"";
+        //disabled属性
+        String disabled = ToolUtil.isNotEmpty(attrs.get("disabled"))?attrs.get("disabled").toString():"";
+        //searchnum 下拉选项数量达到多少启用搜索,默认10
+        int searchnum = ToolUtil.isNum(attrs.get("searchnum"))?Integer.parseInt(attrs.get("searchnum").toString()):10;
+        //根据code查询字典数据
+        List<Dict>  list = iDictService.selectByParentCode(code);
+
+        StringBuffer html = new StringBuffer();
+        html.append("<div class=\"form-group\">\r\n");
+        html.append("<label class=\"col-sm-3 control-label\">"+label+"</label>\r\n");
+        html.append("<div class=\"col-sm-9\">\r\n");
+
+        //单选按钮
+        if("radio".equals(type)) {
+
+            list.forEach(obj->{
+                html.append("<label class=\"radio-inline i-checks\">\r\n<input type=\"radio\" ");
+                //判断控件是否禁用
+                if("true".equals(disabled)||"disabled".equals(disabled)) {
+                    html.append("disabled ");
+                }else{
+                    if(ToolUtil.isNotEmpty(name)){
+                        html.append("name=\""+name+"\" ");
+                    }
+                }
+                if("true".equals(readonly)||"disabled".equals(readonly)) {
+                    html.append("disabled ");
+                }
+                if(ToolUtil.isNotEmpty(value)&&value.equals(obj.getCode())){
+                    html.append("checked ");
+                }
+
+                html.append("value=\""+obj.getCode()+"\" >"+obj.getName()+"</label>\r\n");
+            });
+
+        //多选按钮
+        }else if("checkbox".equals(type)){
+            list.forEach(obj->{
+                html.append("<label class=\"checkbox-inline i-checks\">\r\n<input type=\"checkbox\" ");
+                //判断控件是否禁用
+                if("true".equals(disabled)||"disabled".equals(disabled)) {
+                    html.append("disabled ");
+                }else{
+                    if(ToolUtil.isNotEmpty(name)){
+                        html.append("name=\""+name+"\" ");
+                    }
+                }
+                if("true".equals(readonly)||"disabled".equals(readonly)) {
+                    html.append("disabled ");
+                }
+                if(ToolUtil.isNotEmpty(value)&&value.equals(obj.getCode())){
+                    html.append("checked ");
+                }
+
+                html.append("value=\""+obj.getCode()+"\" >"+obj.getName()+"</label>\r\n");
+            });
+
+        //默认select
+        }else{
+            //开启多选
+            if("true".equals(multiple)){
+                if(list.size()>=searchnum) {
+                    html.append("<select multiple ");
+                }else{
+                    html.append("<select multiple=\"multiple\" size=\"10\" ");
+                }
+            }else{
+                html.append("<select ");
+            }
+
+            //判断控件是否启用提示
+            if(ToolUtil.isNotEmpty(placeholder)){
+                html.append(" data-placeholder=\""+placeholder+"\" ");
+            }
+
+            //判断控件是否禁用
+            if("true".equals(disabled)||"disabled".equals(disabled)) {
+                html.append("disabled=\"disabled\" ");
+            }else{
+                //启用
+                if(ToolUtil.isNotEmpty(id)){
+                    html.append("id=\""+id+"\" ");
+                }
+
+                if(ToolUtil.isNotEmpty(name)){
+                    html.append("name=\""+name+"\" ");
+                }
+            }
+
+            //判断是否启用搜索框
+            //判断下拉数据,如果查询出来的条数达到启用搜索的数量就启用
+
+
+            if(list.size()>=searchnum){
+                html.append("class=\"form-control chosen-select\" style=\"width:"+width+"px\"  tabindex=\"1\" \r\n");
+            } else{
+                html.append("class=\"form-control\" style=\"width:"+width+"px\" \r\n");
+            }
+
+            //判断控件是否只读
+            if("true".equals(readonly)||"readonly".equals(readonly)) {
+                if(list.size()>=searchnum) {
+                    html.append("disabled=\"disabled\" ");
+                }else{
+                    html.append("onfocus=\"this.defaultIndex=this.selectedIndex;\" onchange=\"this.selectedIndex=this.defaultIndex;\" ");
+                }
+            }
+
+            //判断是否绑定onchange事件
+            if(ToolUtil.isNotEmpty(onchange)){
+                html.append("onchange=\""+onchange+"($(this).children('option:selected').val())\" ");
+            }
+
+            html.append(">");
+            if(ToolUtil.isNotEmpty(placeholder)){
+                html.append("<option value=\"\">"+placeholder+"</option>\r\n");
+            }
+            //将查询出来的数据添加到select中
+            list.forEach(obj->{
+                if(ToolUtil.isNotEmpty(value)&&value.equals(obj.getCode())){
+                    html.append("<option selected value=\""+obj.getCode()+"\">"+obj.getName()+"</option>\r\n");
+                }else{
+                    html.append("<option value=\""+obj.getCode()+"\">"+obj.getName()+"</option>\r\n");
+                }
+            });
+            html.append("</select>\r\n");
+        }
+
+        html.append("</div>\r\n</div>\r\n");
+        //判断是否添加分割线
+        if(ToolUtil.isNotEmpty(underline) && "true".equals(underline)) {
+            html.append("<div class=\"hr-line-dashed\" ></div >\r\n");
+        }
+
+        try{
+            this.ctx.byteWriter.writeString(html.toString());
+        }catch (IOException e){
+            throw new RuntimeException("输出字典标签错误");
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/ApiMenuFilter.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/ApiMenuFilter.java
new file mode 100644
index 0000000..ffba2f2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/ApiMenuFilter.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.core.util;
+
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.node.MenuNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * api接口文档显示过滤
+ *
+ * @author fengshuonan
+ * @date 2017-08-17 16:55
+ */
+public class ApiMenuFilter extends MenuNode {
+
+    public static List<MenuNode> build(List<MenuNode> nodes) {
+
+        //如果关闭了接口文档,则不显示接口文档菜单
+        GunsProperties gunsProperties = SpringContextHolder.getBean(GunsProperties.class);
+        if (!gunsProperties.getSwaggerOpen()) {
+            List<MenuNode> menuNodesCopy = new ArrayList<>();
+            for (MenuNode menuNode : nodes) {
+                if (Const.API_MENU_NAME.equals(menuNode.getName())) {
+                    continue;
+                } else {
+                    menuNodesCopy.add(menuNode);
+                }
+            }
+            nodes = menuNodesCopy;
+        }
+
+        return nodes;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/Contrast.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/Contrast.java
new file mode 100644
index 0000000..980f947
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/Contrast.java
@@ -0,0 +1,214 @@
+package com.stylefeng.guns.core.util;
+
+import com.stylefeng.guns.core.common.constant.dictmap.base.AbstractDictMap;
+import com.stylefeng.guns.core.common.constant.dictmap.factory.DictFieldWarpperFactory;
+import com.stylefeng.guns.core.support.StrKit;
+
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 对比两个对象的变化的工具类
+ *
+ * @author fengshuonan
+ * @Date 2017/3/31 10:36
+ */
+public class Contrast {
+
+    //记录每个修改字段的分隔符
+    public static final String separator = ";;;";
+
+    /**
+     * 比较两个对象,并返回不一致的信息
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 19:34
+     */
+    public static String contrastObj(Object pojo1, Object pojo2) {
+        String str = "";
+        try {
+            Class clazz = pojo1.getClass();
+            Field[] fields = pojo1.getClass().getDeclaredFields();
+            int i = 1;
+            for (Field field : fields) {
+                if ("serialVersionUID".equals(field.getName())) {
+                    continue;
+                }
+                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
+                Method getMethod = pd.getReadMethod();
+                Object o1 = getMethod.invoke(pojo1);
+                Object o2 = getMethod.invoke(pojo2);
+                if (o1 == null || o2 == null) {
+                    continue;
+                }
+                if (o1 instanceof Date) {
+                    o1 = DateUtil.getDay((Date) o1);
+                }
+                if (!o1.toString().equals(o2.toString())) {
+                    if (i != 1) {
+                        str += separator;
+                    }
+                    str += "字段名称" + field.getName() + ",旧值:" + o1 + ",新值:" + o2;
+                    i++;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return str;
+    }
+
+    /**
+     * 比较两个对象pojo1和pojo2,并输出不一致信息
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 19:34
+     */
+    public static String contrastObj(Class dictClass, String key, Object pojo1, Map<String, String> pojo2) throws IllegalAccessException, InstantiationException {
+        AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
+        String str = parseMutiKey(dictMap, key, pojo2) + separator;
+        try {
+            Class clazz = pojo1.getClass();
+            Field[] fields = pojo1.getClass().getDeclaredFields();
+            int i = 1;
+            for (Field field : fields) {
+                if ("serialVersionUID".equals(field.getName())) {
+                    continue;
+                }
+                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
+                Method getMethod = pd.getReadMethod();
+                Object o1 = getMethod.invoke(pojo1);
+                Object o2 = pojo2.get(StrKit.firstCharToLowerCase(getMethod.getName().substring(3)));
+                if (o1 == null || o2 == null) {
+                    continue;
+                }
+                if (o1 instanceof Date) {
+                    o1 = DateUtil.getDay((Date) o1);
+                } else if (o1 instanceof Integer) {
+                    o2 = Integer.parseInt(o2.toString());
+                }
+                if (!o1.toString().equals(o2.toString())) {
+                    if (i != 1) {
+                        str += separator;
+                    }
+                    String fieldName = dictMap.get(field.getName());
+                    String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(field.getName());
+                    if (fieldWarpperMethodName != null) {
+                        Object o1Warpper = DictFieldWarpperFactory.createFieldWarpper(o1, fieldWarpperMethodName);
+                        Object o2Warpper = DictFieldWarpperFactory.createFieldWarpper(o2, fieldWarpperMethodName);
+                        str += "字段名称:" + fieldName + ",旧值:" + o1Warpper + ",新值:" + o2Warpper;
+                    } else {
+                        str += "字段名称:" + fieldName + ",旧值:" + o1 + ",新值:" + o2;
+                    }
+                    i++;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return str;
+    }
+
+    /**
+     * 比较两个对象pojo1和pojo2,并输出不一致信息
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 19:34
+     */
+    public static String contrastObjByName(Class dictClass, String key, Object pojo1, Map<String, String> pojo2) throws IllegalAccessException, InstantiationException {
+        AbstractDictMap dictMap = (AbstractDictMap) dictClass.newInstance();
+        String str = parseMutiKey(dictMap, key, pojo2) + separator;
+        try {
+            Class clazz = pojo1.getClass();
+            Field[] fields = pojo1.getClass().getDeclaredFields();
+            int i = 1;
+            for (Field field : fields) {
+                if ("serialVersionUID".equals(field.getName())) {
+                    continue;
+                }
+                String prefix = "get";
+                int prefixLength = 3;
+                if (field.getType().getName().equals("java.lang.Boolean")) {
+                    prefix = "is";
+                    prefixLength = 2;
+                }
+                Method getMethod = null;
+                try {
+                    getMethod = clazz.getDeclaredMethod(prefix + StrKit.firstCharToUpperCase(field.getName()));
+                } catch (java.lang.NoSuchMethodException e) {
+                    System.err.println("this className:" + clazz.getName() + " is not methodName: " + e.getMessage());
+                    continue;
+                }
+                Object o1 = getMethod.invoke(pojo1);
+                Object o2 = pojo2.get(StrKit.firstCharToLowerCase(getMethod.getName().substring(prefixLength)));
+                if (o1 == null || o2 == null) {
+                    continue;
+                }
+                if (o1 instanceof Date) {
+                    o1 = DateUtil.getDay((Date) o1);
+                } else if (o1 instanceof Integer) {
+                    o2 = Integer.parseInt(o2.toString());
+                }
+                if (!o1.toString().equals(o2.toString())) {
+                    if (i != 1) {
+                        str += separator;
+                    }
+                    String fieldName = dictMap.get(field.getName());
+                    String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(field.getName());
+                    if (fieldWarpperMethodName != null) {
+                        Object o1Warpper = DictFieldWarpperFactory.createFieldWarpper(o1, fieldWarpperMethodName);
+                        Object o2Warpper = DictFieldWarpperFactory.createFieldWarpper(o2, fieldWarpperMethodName);
+                        str += "字段名称:" + fieldName + ",旧值:" + o1Warpper + ",新值:" + o2Warpper;
+                    } else {
+                        str += "字段名称:" + fieldName + ",旧值:" + o1 + ",新值:" + o2;
+                    }
+                    i++;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return str;
+    }
+
+    /**
+     * 解析多个key(逗号隔开的)
+     *
+     * @author stylefeng
+     * @Date 2017/5/16 22:19
+     */
+    public static String parseMutiKey(AbstractDictMap dictMap, String key, Map<String, String> requests) {
+        StringBuilder sb = new StringBuilder();
+        if (key.indexOf(",") != -1) {
+            String[] keys = key.split(",");
+            for (String item : keys) {
+                String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(item);
+                String value = requests.get(item);
+                if (fieldWarpperMethodName != null) {
+                    Object valueWarpper = DictFieldWarpperFactory.createFieldWarpper(value, fieldWarpperMethodName);
+                    sb.append(dictMap.get(item) + "=" + valueWarpper + ",");
+                } else {
+                    if(item.equals("addTime") || item.equals("createDate")){
+                        value= com.stylefeng.guns.modular.system.util.DateUtil.todayStr("yyyy-MM-dd HH:mm");
+                    }
+                    sb.append(dictMap.get(item) + "=" + value + ",");
+                }
+            }
+            return StrKit.removeSuffix(sb.toString(), ",");
+        } else {
+            String fieldWarpperMethodName = dictMap.getFieldWarpperMethodName(key);
+            String value = requests.get(key);
+            if (fieldWarpperMethodName != null) {
+                Object valueWarpper = DictFieldWarpperFactory.createFieldWarpper(value, fieldWarpperMethodName);
+                sb.append(dictMap.get(key) + "=" + valueWarpper);
+            } else {
+                sb.append(dictMap.get(key) + "=" + value);
+            }
+            return sb.toString();
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/JwtTokenUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/JwtTokenUtil.java
new file mode 100644
index 0000000..0b2eb41
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/JwtTokenUtil.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.core.util;
+
+import com.stylefeng.guns.core.common.constant.JwtConstants;
+import io.jsonwebtoken.*;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <p>jwt token工具类</p>
+ * <pre>
+ *     jwt的claim里一般包含以下几种数据:
+ *         1. iss -- token的发行者
+ *         2. sub -- 该JWT所面向的用户
+ *         3. aud -- 接收该JWT的一方
+ *         4. exp -- token的失效时间
+ *         5. nbf -- 在此时间段之前,不会被处理
+ *         6. iat -- jwt发布时间
+ *         7. jti -- jwt唯一标识,防止重复使用
+ * </pre>
+ *
+ * @author fengshuonan
+ * @Date 2017/8/25 10:59
+ */
+@Component
+public class JwtTokenUtil {
+
+    /**
+     * 获取用户名从token中
+     */
+    public static String getUsernameFromToken(String token) {
+        return getClaimFromToken(token).getSubject();
+    }
+
+    /**
+     * 获取jwt发布时间
+     */
+    public static Date getIssuedAtDateFromToken(String token) {
+        return getClaimFromToken(token).getIssuedAt();
+    }
+
+    /**
+     * 获取jwt失效时间
+     */
+    public static Date getExpirationDateFromToken(String token) {
+        return getClaimFromToken(token).getExpiration();
+    }
+
+    /**
+     * 获取jwt接收者
+     */
+    public static String getAudienceFromToken(String token) {
+        return getClaimFromToken(token).getAudience();
+    }
+
+    /**
+     * 获取私有的jwt claim
+     */
+    public static String getPrivateClaimFromToken(String token, String key) {
+        return getClaimFromToken(token).get(key).toString();
+    }
+
+    /**
+     * 获取jwt的payload部分
+     */
+    public static Claims getClaimFromToken(String token) {
+        return Jwts.parser()
+                .setSigningKey(JwtConstants.SECRET)
+                .parseClaimsJws(token)
+                .getBody();
+    }
+
+    /**
+     * 解析token是否正确,不正确会报异常<br>
+     */
+    public static void parseToken(String token) throws JwtException {
+        Jwts.parser().setSigningKey(JwtConstants.SECRET).parseClaimsJws(token).getBody();
+    }
+
+    /**
+     * <pre>
+     *  验证token是否失效
+     *  true:过期   false:没过期
+     * </pre>
+     */
+    public static Boolean isTokenExpired(String token) {
+        try {
+            final Date expiration = getExpirationDateFromToken(token);
+            return expiration.before(new Date());
+        } catch (ExpiredJwtException expiredJwtException) {
+            return true;
+        }
+    }
+
+    /**
+     * 生成token(通过用户名和签名时候用的随机数)
+     */
+    public static String generateToken(String userId) {
+        Map<String, Object> claims = new HashMap<>();
+        return doGenerateToken(claims, userId);
+    }
+
+    /**
+     * 生成token
+     */
+    private static String doGenerateToken(Map<String, Object> claims, String subject) {
+        final Date createdDate = new Date();
+        final Date expirationDate = new Date(createdDate.getTime() + JwtConstants.EXPIRATION * 1000);
+
+        return Jwts.builder()
+                .setClaims(claims)
+                .setSubject(subject)
+                .setIssuedAt(createdDate)
+                .setExpiration(expirationDate)
+                .signWith(SignatureAlgorithm.HS512, JwtConstants.SECRET)
+                .compact();
+    }
+
+    /**
+     * 获取混淆MD5签名用的随机字符串
+     */
+    public static String getRandomKey() {
+        return ToolUtil.getRandomString(6);
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/KaptchaUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/KaptchaUtil.java
new file mode 100644
index 0000000..719de81
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/KaptchaUtil.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.core.util;
+
+import com.stylefeng.guns.config.properties.GunsProperties;
+
+/**
+ * 验证码工具类
+ */
+public class KaptchaUtil {
+
+    /**
+     * 获取验证码开关
+     */
+    public static Boolean getKaptchaOnOff() {
+        return SpringContextHolder.getBean(GunsProperties.class).getKaptchaOpen();
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/ObsUploadUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/ObsUploadUtil.java
new file mode 100644
index 0000000..07a5d51
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/ObsUploadUtil.java
@@ -0,0 +1,76 @@
+package com.stylefeng.guns.core.util;
+
+import com.obs.services.ObsClient;
+import com.obs.services.model.ObjectMetadata;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+
+public class ObsUploadUtil {
+	//OBS图片访问域名
+	public static String endPoint = "obs.cn-east-3.myhuaweicloud.com";
+	public static String accessKeyId = "HB7DOVELEVWYYUS7QHYX";
+	public static String accessKeySecret = "nEwDoSdLRkA1BRfW17pMZL9RlnrVywuTeHSkMn7y";
+	public static String bucketName = "mian-ju-mi-liao";
+	public static String oss_domain = "https://mian-ju-mi-liao.obs.cn-east-3.myhuaweicloud.com/";
+
+
+	// 创建ObsClient实例
+	public static ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endPoint);
+
+	public static String obsUpload(HttpServletRequest request,  MultipartFile file) throws IOException{
+		//CommonsMultipartFile file = (CommonsMultipartFile)multipartFile;
+		String fileName = "";
+		if(file!=null && !"".equals(file.getOriginalFilename()) && file.getOriginalFilename()!=null){
+			InputStream content = file.getInputStream();//获得指定文件的输入流
+			ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata
+			meta.setContentLength(file.getSize());  // 必须设置ContentLength
+			String originalFilename = file.getOriginalFilename();
+			fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
+			obsClient.putObject(bucketName,"admin/"+fileName,content,meta);// 上传Object.
+			if(fileName != null && !"".equals(fileName)){
+				System.out.println(fileName);
+				fileName = oss_domain+"admin/"+fileName;
+			}
+		}
+		return fileName;
+	}
+
+	/**
+	 * 删除某个Object
+	 *
+	 * @param bucketUrl
+	 * @return
+	 */
+	public static boolean deleteObject(String bucketUrl) {
+		try {
+			bucketUrl=bucketUrl.replace(oss_domain+"web","");
+			// 删除Object.
+			obsClient.deleteObject(bucketName, bucketUrl);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return false;
+		} finally {
+			//ossClient.shutdown();
+		}
+		return true;
+	}
+	
+//	 public static void createBucket(String bucketName)
+//     {
+//         //初始化 OSSClient
+////          ossClient = new OssClient(endPoint, accessKeyId, accessKeySecret);
+//
+//         // 新建一个Bucket
+//         Bucket bucket = ossClient.createBucket(bucketName);
+//         System.out.println(bucket.getName());
+//         System.out.println(bucket.getCreationDate());
+//     }
+//	 
+//	 public static void main(String[] args) {
+//		 OssUploadUtil.createBucket("ssfdfsd");
+//	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/OssUploadUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/OssUploadUtil.java
new file mode 100644
index 0000000..07a5d46
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/OssUploadUtil.java
@@ -0,0 +1,59 @@
+package com.stylefeng.guns.core.util;
+
+import com.obs.services.ObsClient;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+
+public class OssUploadUtil {
+	public static String endPoint = "obs.cn-south-1.myhuaweicloud.com";
+	public static String accessKeyId = "MLJEFPYY0LJKAVA5C4YI";
+	public static String accessKeySecret = "C8PmdLHAW7OOKR1fbEGYrqIiTh4yaLrRzA0uVZ89";
+	public static String bucketName = "qinqinzhuanche";
+	public static String oss_domain = "https://qinqinzhuanche.obs.cn-south-1.myhuaweicloud.com/";
+	// 创建ObsClient实例
+	public static ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endPoint);
+
+	public static String ossUpload(HttpServletRequest request,MultipartFile file) throws IOException{
+		//CommonsMultipartFile file = (CommonsMultipartFile)multipartFile;
+		String fileName = "";
+		if(file!=null && !"".equals(file.getOriginalFilename()) && file.getOriginalFilename()!=null){
+			InputStream content = file.getInputStream();//获得指定文件的输入流
+			com.obs.services.model.ObjectMetadata meta = new com.obs.services.model.ObjectMetadata();// 创建上传Object的Metadata
+			meta.setContentLength(file.getSize());  // 必须设置ContentLength
+			String originalFilename = file.getOriginalFilename();
+			fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
+			obsClient.putObject(bucketName,fileName,content,meta);// 上传Object.
+			if(fileName != null && !"".equals(fileName)){
+				System.out.println(fileName);
+				fileName = oss_domain+fileName;
+			}
+		}
+		return fileName;
+	}
+
+	/**
+	 * 删除某个Object
+	 *
+	 * @param bucketUrl
+	 * @return
+	 */
+	public static boolean deleteObject(String bucketUrl) {
+		try {
+			bucketUrl=bucketUrl.replace(oss_domain+"web","");
+			// 删除Object.
+			obsClient.deleteObject(bucketName, bucketUrl);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return false;
+		} finally {
+			//ossClient.shutdown();
+		}
+		return true;
+	}
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/SinataUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/SinataUtil.java
new file mode 100644
index 0000000..6043e3f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/SinataUtil.java
@@ -0,0 +1,385 @@
+package com.stylefeng.guns.core.util;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * 基本数据处理工具类
+ */
+public class SinataUtil {
+
+	
+	/**
+	 * List集合分页<br/> 
+	 * 创建人:Mryang<br/>
+	 * 时间:2016年7月28日-下午2:58:14 <br/> 
+	 * @param <T>
+	 * @param pageNo
+	 * @param pageSize
+	 * @param list 
+	 * @throws Exception List<UserOrderList> <br/>
+	 */
+	public static <T> List<T> listpage(int pageNo, int pageSize, List<T> list) throws Exception {
+		List<T> result = new ArrayList<T>();
+		if (list != null && list.size() > 0) {
+			int allCount = list.size();
+			if(pageNo > 1 && allCount < pageSize) {
+				return new ArrayList<>();
+			}
+			int pageCount = (allCount + pageSize - 1) / pageSize;
+			if (pageNo >= pageCount) {
+				pageNo = pageCount;
+			}
+			int start = (pageNo - 1) * pageSize;
+			int end = pageNo * pageSize;
+			if (end >= allCount) {
+				end = allCount;
+			}
+			for (int i = start; i < end; i++) {
+				result.add(list.get(i));
+			}
+		}
+		return (result != null && result.size() > 0) ? result : new ArrayList<T>();
+	}
+
+	/**
+	 * Double类型取整
+	 * @param num
+	 * @return
+	 */
+	public static String doubleTrans(double num) {
+		return String.valueOf((long) num);
+	}
+
+	/**
+	 * Double类型保留1位小数
+	 * 
+	 * @param num
+	 * @return
+	 */
+	public static String doubleRetainOne(double num) {
+		DecimalFormat dfs = new DecimalFormat("0.0");
+		return dfs.format(num);
+	}
+
+	/**
+	 * 5位随机数
+	 * @return
+	 */
+	public static synchronized String getFive() {
+		int i=(int)((Math.random()*9+1)*10000);
+		return i+"";
+	}
+	/**
+	 * Double类型保留2位小数
+	 * 
+	 * @param num
+	 * @return
+	 */
+	public static String doubleRetainTwo(double num) {
+		DecimalFormat dfs = new DecimalFormat("0.00");
+		String.format("%.2f", num);
+		return dfs.format(num);
+	}
+
+	/**
+	 * Double类型保留1位小数(四舍五入)
+	 * 
+	 * @param num
+	 * @return
+	 */
+	public static String doubleForwardOne(double num) {
+		return String.format("%.1f", num);
+	}
+
+	/**
+	 * Double类型保留2位小数(四舍五入)
+	 * 
+	 * @param num
+	 * @return
+	 */
+	public static String doubleForwardTwo(double num) {
+		return String.format("%.2f", num);
+	}
+
+	/**
+	 * 字符串转换成Ascii
+	 * 
+	 * @param value
+	 * @return
+	 */
+	public static String stringToAscii(String value) {
+		StringBuffer sbu = new StringBuffer();
+		char[] chars = value.toCharArray();
+		for (int i = 0; i < chars.length; i++) {
+			if (i != chars.length - 1) {
+				sbu.append((int) chars[i]);
+			} else {
+				sbu.append((int) chars[i]);
+			}
+		}
+		return sbu.toString();
+	}
+
+	/**
+	 * 小数转换为百分比
+	 *  
+	 * @param decimal
+	 * @return
+	 * @author TaoNingBo
+	 */
+	public static String decTurnPercent(double decimal) {
+		NumberFormat num = NumberFormat.getPercentInstance();
+		num.setMaximumIntegerDigits(3);
+		num.setMaximumFractionDigits(2);
+		return num.format(decimal);
+	}
+
+	/**
+	 * Ascii转换成字符串
+	 * 
+	 * @param value
+	 * @return
+	 */
+	public static String asciiToString(String value) {
+		String[] chars = value.split(",");
+		StringBuffer sbu = new StringBuffer();
+		for (int i = 0; i < chars.length; i++) {
+			sbu.append((char) Integer.parseInt(chars[i]));
+		}
+		return sbu.toString();
+	}
+
+	/**
+	 * 字符串转换unicode
+	 * 
+	 * @param string
+	 * @return
+	 * @author TaoNingBo
+	 */
+	public static String string2Unicode(String string) {
+		StringBuffer unicode = new StringBuffer();
+		for (int i = 0; i < string.length(); i++) {
+			// 取出每一个字符
+			char c = string.charAt(i);
+			// 转换为unicode
+			unicode.append("\\u" + Integer.toHexString(c));
+		}
+		return unicode.toString();
+	}
+
+	/**
+	 * unicode 转字符串
+	 * 
+	 * @param unicode
+	 * @return
+	 * @author TaoNingBo
+	 */
+	public static String unicode2String(String unicode) {
+		StringBuffer string = new StringBuffer();
+		String[] hex = unicode.split("\\\\u");
+		for (int i = 1; i < hex.length; i++) {
+			// 转换出每一个代码点
+			int data = Integer.parseInt(hex[i], 16);
+			// 追加成string
+			string.append((char) data);
+		}
+		return string.toString();
+	}
+
+	/**
+	 * 字符串编码转换的实现方法
+	 * 
+	 * @param str
+	 *            待转换编码的字符串
+	 * @param newCharset
+	 *            目标编码
+	 * @return
+	 * @throws UnsupportedEncodingException
+	 */
+	public static String changeCharset(String str, String newCharset) throws UnsupportedEncodingException {
+		if (str != null) {
+			// 用默认字符编码解码字符串。
+			byte[] bs = str.getBytes();
+			// 用新的字符编码生成字符串
+			return new String(bs, newCharset);
+		}
+		return null;
+	}
+
+	/**
+	 * 注: \n 回车( ) \t 水平制表符( ) \s 空格(\u0008) \r 换行( )
+	 * 
+	 * @param str
+	 * @return
+	 */
+	public static String replaceBlank(String str) {
+		String dest = "";
+		if (str != null) {
+			Pattern p = Pattern.compile("\\s*|\t|\r|\n");
+			Matcher m = p.matcher(str);
+			dest = m.replaceAll("");
+		}
+		return dest;
+	}
+
+	/**
+	 * 判断该字符串不能为空
+	 * 
+	 * @param str
+	 * @return
+	 * @author TaoNingBo
+	 */
+	public static boolean isNotEmpty(Object str) {
+		return !isEmpty(str);
+	}
+	
+	
+	public static boolean isNotEmptyUndefined(Object str) {
+		return !isEmpty(str) && !str.toString().equals("undefined");
+	}
+
+	/**
+	 * 字符串编码转换的实现方法
+	 * 
+	 * @param str
+	 *            待转换编码的字符串
+	 * @param oldCharset
+	 *            原编码
+	 * @param newCharset
+	 *            目标编码
+	 * @return
+	 * @throws UnsupportedEncodingException
+	 */
+	public static String changeCharset(String str, String oldCharset, String newCharset) throws UnsupportedEncodingException {
+		if (str != null) {
+			// 用旧的字符编码解码字符串。解码可能会出现异常。
+			byte[] bs = str.getBytes(oldCharset);
+			// 用新的字符编码生成字符串
+			return new String(bs, newCharset);
+		}
+		return null;
+	}
+
+	/**
+	 * 给手机号码加分割符
+	 * 
+	 * @param phone
+	 * @return
+	 * @author TaoNingBo
+	 */
+	public static String splitPhone(String phone) {
+		if (isNotEmpty(phone)) {
+			String strone = phone.substring(0, 3);
+			String strtwo = phone.substring(strone.length(), 7);
+			String strthree = phone.substring(strtwo.length() + strone.length(), phone.length());
+			return strone + "-" + strtwo + "-" + strthree;
+		}
+		return "";
+	}
+
+	/**
+	 * 非空判断
+	 * 
+	 * @param str
+	 * @return
+	 * @author TaoNingBo
+	 */
+	public static boolean isEmpty(Object str) {
+		return str == null || str.toString().length() == 0 || str.equals("") || str.toString().matches("\\s*");
+	}
+
+
+	
+	/**
+	 * 将List<{@link Object}>转换成List<{@link T}>
+	 * 
+	 * @param list
+	 *            将要转换的对象
+	 * @param clazs
+	 *            需要转换的泛型对象
+	 * @return
+	 * @author TaoNingBo
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> List<T> fromToObject(List<?> list, Class<T> clazs) {
+		List<T> t = new ArrayList<T>();
+		for (Object object : list) {
+			t.add((T) object);
+		}
+		return t;
+	}
+	
+	 /**
+     * 生成 uuid, 即用来标识一笔单,也用做 nonce_str
+     * @return
+     */
+    public static String generateUUID() {
+        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
+    }
+	
+	/**
+	 * 将List<{@link Object}>转换成List<{@link Map<String, Object>}>
+	 * 
+	 * @param list
+	 * @return
+	 * @author TaoNingBo
+	 */
+	@SuppressWarnings("unchecked")
+	public static List<Map<String, Object>> fromToObject_M(List<?> list) {
+		List<Map<String, Object>> t = new ArrayList<Map<String, Object>>();
+		for (Object object : list) {
+			t.add((Map<String, Object>) object);
+		}
+		return t;
+	}
+	
+	/**
+	 * URL编码
+	 * 
+	 * @param url
+	 * @return
+	 */
+	@SuppressWarnings("deprecation")
+	public static String URLEncode(String url) {
+		try {
+			return URLEncoder.encode(url, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		return URLEncoder.encode(url);
+	}
+
+	/**
+	 * URL解码
+	 * 
+	 * @param url
+	 * @return
+	 */
+	@SuppressWarnings("deprecation")
+	public static String URLDecode(String url) {
+		try {
+			return URLDecoder.decode(url, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		return URLDecoder.decode(url);
+	}
+	public static void main(String[] args) throws ParseException {
+		
+		System.out.println(doubleRetainTwo(0.0));
+
+	}
+	
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/WoUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/WoUtil.java
new file mode 100644
index 0000000..62f437f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/util/WoUtil.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.core.util;
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+public class WoUtil {
+    public static Workbook ImportFile(MultipartFile importFile) {
+        Workbook book = null;
+        if(importFile == null)
+        {
+            //throw new WoException(SysConstant.ERR_EXCEL_NULL);
+        }
+        String fileName = importFile.getOriginalFilename();
+        try {
+            if(fileName.endsWith(".xlsx"))    //当表格的后缀是".xlsx时"
+            {
+                book = new XSSFWorkbook(importFile.getInputStream());
+            }else
+            {
+                book = new HSSFWorkbook(importFile.getInputStream());
+            }
+        } catch (IOException e) {
+            //throw new WoException(e,SysConstant.ERR_EXCEL_NO);
+        }
+        return book;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java
new file mode 100644
index 0000000..c60adfa
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/api/ApiController.java
@@ -0,0 +1,80 @@
+package com.stylefeng.guns.modular.api;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.JwtTokenUtil;
+import com.stylefeng.guns.modular.system.dao.UserMapper;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.shiro.authc.SimpleAuthenticationInfo;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
+import org.apache.shiro.crypto.hash.Md5Hash;
+import org.apache.shiro.util.ByteSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+
+/**
+ * 接口控制器提供
+ *
+ * @author stylefeng
+ * @Date 2018/7/20 23:39
+ */
+@RestController
+@RequestMapping("/gunsApi")
+public class ApiController extends BaseController {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    /**
+     * api登录接口,通过账号密码获取token
+     */
+    @RequestMapping("/auth")
+    public Object auth(@RequestParam("username") String username,
+                       @RequestParam("password") String password) {
+
+        //封装请求账号密码为shiro可验证的token
+        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password.toCharArray());
+
+        //获取数据库中的账号密码,准备比对
+        User user = userMapper.getByAccount(username);
+
+        String credentials = user.getPassword();
+        String salt = user.getSalt();
+        ByteSource credentialsSalt = new Md5Hash(salt);
+        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
+                new ShiroUser(), credentials, credentialsSalt, "");
+
+        //校验用户账号密码
+        HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher();
+        md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName);
+        md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations);
+        boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch(
+                usernamePasswordToken, simpleAuthenticationInfo);
+
+        if (passwordTrueFlag) {
+            HashMap<String, Object> result = new HashMap<>();
+            result.put("token", JwtTokenUtil.generateToken(String.valueOf(user.getId())));
+            return result;
+        } else {
+            return new ErrorTip(500, "账号密码错误!");
+        }
+    }
+
+    /**
+     * 测试接口是否走鉴权
+     */
+    @RequestMapping(value = "/test", method = RequestMethod.POST)
+    public Object test() {
+        return SUCCESS_TIP;
+    }
+
+}
+
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/controller/CodeController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/controller/CodeController.java
new file mode 100644
index 0000000..725029b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/controller/CodeController.java
@@ -0,0 +1,61 @@
+package com.stylefeng.guns.modular.code.controller;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.config.properties.DruidProperties;
+import com.stylefeng.guns.generator.action.config.WebGeneratorConfig;
+import com.stylefeng.guns.generator.action.model.GenQo;
+import com.stylefeng.guns.modular.code.factory.DefaultTemplateFactory;
+import com.stylefeng.guns.modular.code.service.TableService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * 代码生成控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年11月30日16:39:19
+ */
+@Controller
+@RequestMapping("/code")
+public class CodeController extends BaseController {
+
+    private static String PREFIX = "/code";
+
+    @Autowired
+    private TableService tableService;
+
+    @Autowired
+    private DruidProperties druidProperties;
+
+    /**
+     * 跳转到代码生成主页
+     */
+    @RequestMapping("")
+    public String blackboard(Model model) {
+        model.addAttribute("tables", tableService.getAllTables());
+        model.addAttribute("params", DefaultTemplateFactory.getDefaultParams());
+        model.addAttribute("templates", DefaultTemplateFactory.getDefaultTemplates());
+        return PREFIX + "/code.html";
+    }
+
+    /**
+     * 生成代码
+     */
+    @ApiOperation("生成代码")
+    @RequestMapping(value = "/generate", method = RequestMethod.POST)
+    @ResponseBody
+    public Object generate(GenQo genQo) {
+        genQo.setUrl(druidProperties.getUrl());
+        genQo.setUserName(druidProperties.getUsername());
+        genQo.setPassword(druidProperties.getPassword());
+        WebGeneratorConfig webGeneratorConfig = new WebGeneratorConfig(genQo);
+        webGeneratorConfig.doMpGeneration();
+        webGeneratorConfig.doGunsGeneration();
+        return SUCCESS_TIP;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/factory/DefaultTemplateFactory.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/factory/DefaultTemplateFactory.java
new file mode 100644
index 0000000..1cebee4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/factory/DefaultTemplateFactory.java
@@ -0,0 +1,61 @@
+package com.stylefeng.guns.modular.code.factory;
+
+
+import com.stylefeng.guns.GunsApplication;
+import com.stylefeng.guns.core.CoreFlag;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.generator.action.model.GenQo;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 模板种类构建器
+ *
+ * @author fengshuonan
+ * @date 2017-12-04-下午2:59
+ */
+public class DefaultTemplateFactory {
+
+    /**
+     * 获取所有的模板种类
+     */
+    public static List<Map<String,Object>> getDefaultTemplates(){
+        ArrayList<Map<String, Object>> templates = new ArrayList<>();
+        templates.add(create("controllerSwitch","controller-控制器模板"));
+        templates.add(create("entitySwitch","entity-实体模板"));
+        templates.add(create("serviceSwitch","service-service模板"));
+        templates.add(create("daoSwitch","dao-dao模板"));
+        templates.add(create("indexPageSwitch","indexPage-首页模板"));
+        templates.add(create("addPageSwitch","addPage-添加页面模板"));
+        templates.add(create("editPageSwitch","editPage-编辑页面模板"));
+        templates.add(create("jsSwitch","indexJs-主页js模板"));
+        templates.add(create("infoJsSwitch","infoJs-详情页js模板"));
+        templates.add(create("sqlSwitch","sql-sql语句模板"));
+        return templates;
+    }
+
+    /**
+     * 获取默认的参数
+     */
+    public static GenQo getDefaultParams(){
+        GenQo genQo = new GenQo();
+        genQo.setProjectPath(ToolUtil.getWebRootPath(null));
+        genQo.setAuthor("stylefeng");
+        genQo.setProjectPackage(GunsApplication.class.getPackage().getName());
+        genQo.setCorePackage(CoreFlag.class.getPackage().getName());
+        genQo.setIgnoreTabelPrefix("sys_");
+        genQo.setModuleName("system");
+        genQo.setParentMenuName("系统管理");
+        return genQo;
+    }
+
+    private static Map<String,Object> create(String key,String desc){
+        HashMap<String, Object> template = new HashMap<>();
+        template.put("key",key);
+        template.put("desc",desc);
+        return template;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/service/TableService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/service/TableService.java
new file mode 100644
index 0000000..f8f9478
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/code/service/TableService.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.code.service;
+
+import com.baomidou.mybatisplus.mapper.SqlRunner;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 获取数据库所有的表
+ *
+ * @author fengshuonan
+ * @date 2017-12-04-下午1:37
+ */
+@Service
+public class TableService {
+
+    @Value("${spring.datasource.db-name}")
+    private String dbName;
+
+    /**
+     * 获取当前数据库所有的表信息
+     */
+    public List<Map<String, Object>> getAllTables() {
+        String sql = "select TABLE_NAME as tableName,TABLE_COMMENT as tableComment from information_schema.`TABLES` where TABLE_SCHEMA = '" + dbName + "'";
+        return SqlRunner.db().selectList(sql);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityController.java
new file mode 100644
index 0000000..43e8c5d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityController.java
@@ -0,0 +1,359 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-17 20:51:18
+ */
+@Controller
+@RequestMapping("/driverActivity")
+public class DriverActivityController extends BaseController {
+
+    private String PREFIX = "/system/driverActivity/";
+
+    @Autowired
+    private IDriverActivityService driverActivityService;
+
+    @Autowired
+    private IDriverActivityOnlineService driverActivityOnlineService;
+
+    @Autowired
+    private IDriverActivityOrderService driverActivityOrderService;
+
+    @Autowired
+    private IDriverActivityRegisteredService driverActivityRegisteredService;
+
+    @Autowired
+    private IDriverActivityHistoryService driverActivityHistoryService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "driverActivity.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/driverActivity_add")
+    public String driverActivityAdd() {
+        return PREFIX + "driverActivity_add.html";
+    }
+
+    /**
+     * 跳转领取统计
+     * @return
+     */
+    @RequestMapping("/receiveRecord")
+    public String receiveRecord(Model model,Integer activityId){
+        model.addAttribute("activityId",activityId);
+        DriverActivity driverActivity = driverActivityService.selectById(activityId);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        model.addAttribute("startTime", sdf.format(driverActivity.getStartTime()));
+        model.addAttribute("endTime", sdf.format(driverActivity.getEndTime()));
+        DriverActivityRegistered driverActivityRegistered = driverActivityRegisteredService.selectOne(new EntityWrapper<DriverActivityRegistered>().eq("driverActivityId",activityId).eq("type",1));
+        model.addAttribute("id1",driverActivityRegistered.getId());
+        driverActivityRegistered = driverActivityRegisteredService.selectOne(new EntityWrapper<DriverActivityRegistered>().eq("driverActivityId",activityId).eq("type",2));
+        model.addAttribute("id2",driverActivityRegistered.getId());
+        DriverActivityOnline driverActivityOnline = driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",activityId).eq("type",1));
+        model.addAttribute("id3",driverActivityOnline.getId());
+        //统计专车在线
+        driverActivityOnline = driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",activityId).eq("type",2));
+        model.addAttribute("id4",driverActivityOnline.getId());
+        driverActivityOnline = driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",activityId).eq("type",3));
+        model.addAttribute("id5",driverActivityOnline.getId());
+        DriverActivityOrder driverActivityOrder = driverActivityOrderService.selectOne(new EntityWrapper<DriverActivityOrder>().eq("driverActivityId",activityId));
+        model.addAttribute("id6",driverActivityOrder.getId());
+        return PREFIX + "receiveRecord.html";
+    }
+
+    @RequestMapping(value = "/receiveRecordDetail")
+    @ResponseBody
+    public Object receiveRecordDetail(String createTime,Integer activityId) {
+        Date startTimes = null;
+        Date endTimes = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            startTimes = DateUtil.getDate_str3(timeArray[0]+" 00:00:00");
+            endTimes = DateUtil.getDate_str3(timeArray[1]+" 23:59:59");
+        }else{
+            DriverActivity driverActivity = driverActivityService.selectById(activityId);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            startTimes=driverActivity.getStartTime();
+            endTimes=driverActivity.getEndTime();
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Map<String,Object> map = new HashMap<>();
+        DriverActivityRegistered driverActivityRegistered = driverActivityRegisteredService.selectOne(new EntityWrapper<DriverActivityRegistered>().eq("driverActivityId",activityId)
+                        .eq("type",1).where("startTime >= '" + sdf.format(startTimes) + "' and endTime < '" + sdf.format(endTimes) + "'").orderBy("insertTime desc limit 0, 1"));
+        //统计邀请司机注册
+        List<DriverActivityHistory> historyList = driverActivityHistoryService.selectList(new EntityWrapper<DriverActivityHistory>()
+                .between("insertTime",startTimes,endTimes).eq("type",1).eq("activityId",driverActivityRegistered.getId()).eq("carryOut",2));
+        Double totalMOney=0d;
+        Double money=0d;
+        Integer number=0;
+        for(DriverActivityHistory history:historyList){
+            totalMOney+=history.getMoney();
+            money+=history.getMoney();
+            number+=1;
+        }
+        map.put("money1",money);
+        map.put("number1",number);
+        driverActivityRegistered = driverActivityRegisteredService.selectOne(new EntityWrapper<DriverActivityRegistered>().eq("driverActivityId",activityId)
+                .eq("type",2).where("startTime >= '" + sdf.format(startTimes) + "' and endTime < '" + sdf.format(endTimes) + "'").orderBy("insertTime desc limit 0, 1"));
+        //统计邀请用户注册
+        historyList = driverActivityHistoryService.selectList(new EntityWrapper<DriverActivityHistory>().between("insertTime",startTimes,endTimes).eq("type",2).eq("activityId",driverActivityRegistered.getId()).eq("carryOut",2));
+        money=0d;
+        number=0;
+        for(DriverActivityHistory history:historyList){
+            totalMOney+=history.getMoney();
+            money+=history.getMoney();
+            number+=1;
+        }
+        map.put("money2",money);
+        map.put("number2",number);
+        DriverActivityOnline driverActivityOnline = driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",activityId)
+                .eq("type",1).where("startTime >= '" + sdf.format(startTimes) + "' and endTime < '" + sdf.format(endTimes) + "'").orderBy("insertTime desc limit 0, 1"));
+        //统计专车在线
+        historyList = driverActivityHistoryService.selectList(new EntityWrapper<DriverActivityHistory>().between("insertTime",startTimes,endTimes).eq("type",3).eq("activityId",driverActivityOnline.getId()).eq("carryOut",2));
+        money=0d;
+        number=0;
+        for(DriverActivityHistory history:historyList){
+            totalMOney+=history.getMoney();
+            money+=history.getMoney();
+            number+=1;
+        }
+        map.put("money3",money);
+        map.put("number3",number);
+        driverActivityOnline = driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",activityId)
+                .eq("type",2).where("startTime >= '" + sdf.format(startTimes) + "' and endTime < '" + sdf.format(endTimes) + "'").orderBy("insertTime desc limit 0, 1"));
+        //统计出租车在线
+        historyList = driverActivityHistoryService.selectList(new EntityWrapper<DriverActivityHistory>().between("insertTime",startTimes,endTimes).eq("type",3).eq("activityId",driverActivityOnline.getId()).eq("carryOut",2));
+        money=0d;
+        number=0;
+        for(DriverActivityHistory history:historyList){
+            totalMOney+=history.getMoney();
+            money+=history.getMoney();
+            number+=1;
+        }
+        map.put("money4",money);
+        map.put("number4",number);
+        driverActivityOnline = driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",activityId)
+                .eq("type",3).where("startTime >= '" + sdf.format(startTimes) + "' and endTime < '" + sdf.format(endTimes) + "'").orderBy("insertTime desc limit 0, 1"));
+        //统计城际在线
+        historyList = driverActivityHistoryService.selectList(new EntityWrapper<DriverActivityHistory>().between("insertTime",startTimes,endTimes).eq("type",3).eq("activityId",driverActivityOnline.getId()).eq("carryOut",2));
+        money=0d;
+        number=0;
+        for(DriverActivityHistory history:historyList){
+            totalMOney+=history.getMoney();
+            money+=history.getMoney();
+            number+=1;
+        }
+        map.put("money5",money);
+        map.put("number5",number);
+        DriverActivityOrder driverActivityOrder = driverActivityOrderService.selectOne(new EntityWrapper<DriverActivityOrder>()
+                .eq("driverActivityId",activityId).where("startTime >= '" + sdf.format(startTimes) + "' and endTime < '" + sdf.format(endTimes) + "'").orderBy("insertTime desc limit 0, 1"));
+        //统计订单数
+        historyList = driverActivityHistoryService.selectList(new EntityWrapper<DriverActivityHistory>().between("insertTime",startTimes,endTimes).eq("type",4).eq("activityId",driverActivityOrder.getId()).eq("carryOut",2));
+        money=0d;
+        number=0;
+        for(DriverActivityHistory history:historyList){
+            totalMOney+=history.getMoney();
+            money+=history.getMoney();
+            number+=1;
+        }
+        map.put("money6",money);
+        map.put("number6",number);
+        map.put("totalMOney",totalMOney);
+        return map;
+    }
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/driverActivity_update/{driverActivityId}")
+    public String driverActivityUpdate(@PathVariable Integer driverActivityId, Model model) {
+        DriverActivity driverActivity = driverActivityService.selectById(driverActivityId);
+        model.addAttribute("item",driverActivity);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        model.addAttribute("startTime", sdf.format(driverActivity.getStartTime()));
+        model.addAttribute("endTime", sdf.format(driverActivity.getEndTime()));
+        model.addAttribute("online1",driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",driverActivityId).eq("type",1)));
+        model.addAttribute("online2",driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",driverActivityId).eq("type",2)));
+        model.addAttribute("online3",driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",driverActivityId).eq("type",3)));
+        DriverActivityOrder driverActivityOrder = driverActivityOrderService.selectOne(new EntityWrapper<DriverActivityOrder>().eq("driverActivityId",driverActivityId));
+        if(driverActivityOrder!=null){
+            model.addAttribute("startTime1", driverActivityOrder.getStart()+" - "+driverActivityOrder.getEnd());
+        }else{
+            model.addAttribute("startTime1", "");
+        }
+        model.addAttribute("order",driverActivityOrder);
+        model.addAttribute("regist1",driverActivityRegisteredService.selectOne(new EntityWrapper<DriverActivityRegistered>().eq("driverActivityId",driverActivityId).eq("type",1)));
+        model.addAttribute("regist2",driverActivityRegisteredService.selectOne(new EntityWrapper<DriverActivityRegistered>().eq("driverActivityId",driverActivityId).eq("type",2)));
+
+        LogObjectHolder.me().set(driverActivity);
+        return PREFIX + "driverActivity_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime,String name) {
+        ShiroUser user = ShiroKit.getUser();
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(driverActivityService.getList(page,beginTime,endTime,name,user.getRoleType(),user.getObjectId()));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(String staTime, String startTime, String num1, Double num2
+            , Double num3
+            , Integer num4
+            , Double num5
+            , Integer num6
+            , Double num7
+            , Integer num8
+            , Double num9
+            , Integer num10
+            , Double num11) {
+
+        driverActivityService.insertOrUpdate(null,staTime,startTime,  num1,  num2
+                ,  num3
+                ,  num4
+                ,  num5
+                ,  num6
+                ,  num7
+                ,  num8
+                ,  num9
+                ,  num10
+                ,  num11);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer driverActivityId) {
+        driverActivityService.deleteById(driverActivityId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(Integer id,String staTime, String startTime, String num1, Double num2
+            , Double num3
+            , Integer num4
+            , Double num5
+            , Integer num6
+            , Double num7
+            , Integer num8
+            , Double num9
+            , Integer num10
+            , Double num11) {
+        driverActivityService.insertOrUpdate(id,staTime,startTime,  num1,  num2
+                ,  num3
+                ,  num4
+                ,  num5
+                ,  num6
+                ,  num7
+                ,  num8
+                ,  num9
+                ,  num10
+                ,  num11);
+        return SUCCESS_TIP;
+    }
+    @RequestMapping(value = "/updateStatus")
+    @ResponseBody
+    public Object updateStatus(DriverActivity driverActivity) {
+        driverActivityService.updateById(driverActivity);
+        return SUCCESS_TIP;
+    }
+
+    @RequestMapping("/driverActivity_detail/{driverActivityId}")
+    public String driverActivityDetail(@PathVariable Integer driverActivityId, Model model) {
+        DriverActivity driverActivity = driverActivityService.selectById(driverActivityId);
+        model.addAttribute("item",driverActivity);
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        model.addAttribute("startTime", sdf.format(driverActivity.getStartTime()));
+        model.addAttribute("endTime", sdf.format(driverActivity.getEndTime()));
+
+        model.addAttribute("online1",driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",driverActivityId).eq("type",1)));
+        model.addAttribute("online2",driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",driverActivityId).eq("type",2)));
+        model.addAttribute("online3",driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",driverActivityId).eq("type",3)));
+        model.addAttribute("order",driverActivityOrderService.selectOne(new EntityWrapper<DriverActivityOrder>().eq("driverActivityId",driverActivityId)));
+        model.addAttribute("regist1",driverActivityRegisteredService.selectOne(new EntityWrapper<DriverActivityRegistered>().eq("driverActivityId",driverActivityId).eq("type",1)));
+        model.addAttribute("regist2",driverActivityRegisteredService.selectOne(new EntityWrapper<DriverActivityRegistered>().eq("driverActivityId",driverActivityId).eq("type",2)));
+        LogObjectHolder.me().set(driverActivity);
+        return PREFIX + "driverActivity_detail.html";
+    }
+
+    /**
+     * 跳转到立即处理页面
+     */
+    @RequestMapping("/driverActivity_immediately/{id}")
+    public String driverActivityImmediately(@PathVariable Integer id, Model model) {
+        model.addAttribute("id",id);
+        return PREFIX + "driverActivity_immediately.html";
+    }
+    /**
+     * 立即处理操作
+     */
+    @RequestMapping(value = "/immediately")
+    @ResponseBody
+    public Object immediately(@RequestParam Integer id,@RequestParam Integer state,@RequestParam String remark) {
+        DriverActivity driverActivity = driverActivityService.selectById(id);
+        if (SinataUtil.isNotEmpty(driverActivity)){
+            driverActivity.setStatus(state);
+            driverActivity.setRemark(remark);
+            driverActivityService.updateById(driverActivity);
+        }
+        return SUCCESS_TIP;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityHistoryController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityHistoryController.java
new file mode 100644
index 0000000..9491413
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityHistoryController.java
@@ -0,0 +1,113 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.DriverActivityHistory;
+import com.stylefeng.guns.modular.system.service.IDriverActivityHistoryService;
+
+import java.util.Map;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-17 20:51:26
+ */
+@Controller
+@RequestMapping("/driverActivityHistory")
+public class DriverActivityHistoryController extends BaseController {
+
+    private String PREFIX = "/system/driverActivityHistory/";
+
+    @Autowired
+    private IDriverActivityHistoryService driverActivityHistoryService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index(Model model,Integer type,Integer activityId) {
+        model.addAttribute("type",type);
+        model.addAttribute("activityId",activityId);
+        return PREFIX + "driverActivityHistory.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/driverActivityHistory_add")
+    public String driverActivityHistoryAdd() {
+        return PREFIX + "driverActivityHistory_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/driverActivityHistory_update/{driverActivityHistoryId}")
+    public String driverActivityHistoryUpdate(@PathVariable Integer driverActivityHistoryId, Model model) {
+        DriverActivityHistory driverActivityHistory = driverActivityHistoryService.selectById(driverActivityHistoryId);
+        model.addAttribute("item",driverActivityHistory);
+        LogObjectHolder.me().set(driverActivityHistory);
+        return PREFIX + "driverActivityHistory_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(Integer type,Integer activityId) {
+
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(driverActivityHistoryService.getList(page,activityId,type));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(DriverActivityHistory driverActivityHistory) {
+        driverActivityHistoryService.insert(driverActivityHistory);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer driverActivityHistoryId) {
+        driverActivityHistoryService.deleteById(driverActivityHistoryId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(DriverActivityHistory driverActivityHistory) {
+        driverActivityHistoryService.updateById(driverActivityHistory);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{driverActivityHistoryId}")
+    @ResponseBody
+    public Object detail(@PathVariable("driverActivityHistoryId") Integer driverActivityHistoryId) {
+        return driverActivityHistoryService.selectById(driverActivityHistoryId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityOnlineController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityOnlineController.java
new file mode 100644
index 0000000..181b816
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityOnlineController.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.DriverActivityOnline;
+import com.stylefeng.guns.modular.system.service.IDriverActivityOnlineService;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-17 20:51:31
+ */
+@Controller
+@RequestMapping("/driverActivityOnline")
+public class DriverActivityOnlineController extends BaseController {
+
+    private String PREFIX = "/system/driverActivityOnline/";
+
+    @Autowired
+    private IDriverActivityOnlineService driverActivityOnlineService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "driverActivityOnline.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/driverActivityOnline_add")
+    public String driverActivityOnlineAdd() {
+        return PREFIX + "driverActivityOnline_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/driverActivityOnline_update/{driverActivityOnlineId}")
+    public String driverActivityOnlineUpdate(@PathVariable Integer driverActivityOnlineId, Model model) {
+        DriverActivityOnline driverActivityOnline = driverActivityOnlineService.selectById(driverActivityOnlineId);
+        model.addAttribute("item",driverActivityOnline);
+        LogObjectHolder.me().set(driverActivityOnline);
+        return PREFIX + "driverActivityOnline_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        return driverActivityOnlineService.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(DriverActivityOnline driverActivityOnline) {
+        driverActivityOnlineService.insert(driverActivityOnline);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer driverActivityOnlineId) {
+        driverActivityOnlineService.deleteById(driverActivityOnlineId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(DriverActivityOnline driverActivityOnline) {
+        driverActivityOnlineService.updateById(driverActivityOnline);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{driverActivityOnlineId}")
+    @ResponseBody
+    public Object detail(@PathVariable("driverActivityOnlineId") Integer driverActivityOnlineId) {
+        return driverActivityOnlineService.selectById(driverActivityOnlineId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityOrderController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityOrderController.java
new file mode 100644
index 0000000..f527036
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityOrderController.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.DriverActivityOrder;
+import com.stylefeng.guns.modular.system.service.IDriverActivityOrderService;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-17 20:51:36
+ */
+@Controller
+@RequestMapping("/driverActivityOrder")
+public class DriverActivityOrderController extends BaseController {
+
+    private String PREFIX = "/system/driverActivityOrder/";
+
+    @Autowired
+    private IDriverActivityOrderService driverActivityOrderService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "driverActivityOrder.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/driverActivityOrder_add")
+    public String driverActivityOrderAdd() {
+        return PREFIX + "driverActivityOrder_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/driverActivityOrder_update/{driverActivityOrderId}")
+    public String driverActivityOrderUpdate(@PathVariable Integer driverActivityOrderId, Model model) {
+        DriverActivityOrder driverActivityOrder = driverActivityOrderService.selectById(driverActivityOrderId);
+        model.addAttribute("item",driverActivityOrder);
+        LogObjectHolder.me().set(driverActivityOrder);
+        return PREFIX + "driverActivityOrder_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        return driverActivityOrderService.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(DriverActivityOrder driverActivityOrder) {
+        driverActivityOrderService.insert(driverActivityOrder);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer driverActivityOrderId) {
+        driverActivityOrderService.deleteById(driverActivityOrderId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(DriverActivityOrder driverActivityOrder) {
+        driverActivityOrderService.updateById(driverActivityOrder);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{driverActivityOrderId}")
+    @ResponseBody
+    public Object detail(@PathVariable("driverActivityOrderId") Integer driverActivityOrderId) {
+        return driverActivityOrderService.selectById(driverActivityOrderId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityRegisteredController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityRegisteredController.java
new file mode 100644
index 0000000..4def063
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/DriverActivityRegisteredController.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.DriverActivityRegistered;
+import com.stylefeng.guns.modular.system.service.IDriverActivityRegisteredService;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-17 20:51:43
+ */
+@Controller
+@RequestMapping("/driverActivityRegistered")
+public class DriverActivityRegisteredController extends BaseController {
+
+    private String PREFIX = "/system/driverActivityRegistered/";
+
+    @Autowired
+    private IDriverActivityRegisteredService driverActivityRegisteredService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "driverActivityRegistered.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/driverActivityRegistered_add")
+    public String driverActivityRegisteredAdd() {
+        return PREFIX + "driverActivityRegistered_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/driverActivityRegistered_update/{driverActivityRegisteredId}")
+    public String driverActivityRegisteredUpdate(@PathVariable Integer driverActivityRegisteredId, Model model) {
+        DriverActivityRegistered driverActivityRegistered = driverActivityRegisteredService.selectById(driverActivityRegisteredId);
+        model.addAttribute("item",driverActivityRegistered);
+        LogObjectHolder.me().set(driverActivityRegistered);
+        return PREFIX + "driverActivityRegistered_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        return driverActivityRegisteredService.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(DriverActivityRegistered driverActivityRegistered) {
+        driverActivityRegisteredService.insert(driverActivityRegistered);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer driverActivityRegisteredId) {
+        driverActivityRegisteredService.deleteById(driverActivityRegisteredId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(DriverActivityRegistered driverActivityRegistered) {
+        driverActivityRegisteredService.updateById(driverActivityRegistered);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{driverActivityRegisteredId}")
+    @ResponseBody
+    public Object detail(@PathVariable("driverActivityRegisteredId") Integer driverActivityRegisteredId) {
+        return driverActivityRegisteredService.selectById(driverActivityRegisteredId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java
new file mode 100644
index 0000000..3ebfebd
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java
@@ -0,0 +1,525 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.DateUtil;
+import com.stylefeng.guns.modular.system.util.RedisUtil;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import com.sun.org.apache.regexp.internal.RE;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 首页统计
+ */
+@Controller
+@RequestMapping("/home")
+public class HomeController {
+
+    @Autowired
+    private ITUserService tUserService;
+
+    @Autowired
+    private ITDriverService tDriverService;
+
+    @Autowired
+    private ITOrderTaxiService tOrderTaxiService;
+
+    @Autowired
+    private ITCarService tCarService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private ITCompanyService tCompanyService;
+
+    @Autowired
+    private ITCarBrandService carBrandService;
+
+    @Autowired
+    private ITCarModelService carModelService;
+
+    private List<TCompany> companys = null;
+
+
+    @Autowired
+    private ITOrderPrivateCarService itOrderPrivateCarService;
+
+    @Autowired
+    private ITOrderCrossCityService itOrderCrossCityService;
+
+    @Autowired
+    private ITOrderLogisticsService itOrderLogisticsService;
+
+    @Autowired
+    private IDriverOnlineService driverOnlineService;
+
+
+    @RequestMapping("/openNetCarInfo")
+    public Object openNetCarInfo(Integer id, Model model){
+        model.addAttribute("id", id);
+        return "/netCarInfo.html";
+    }
+
+    @RequestMapping("/showDriverOnline")
+    public String showDriverOnline(){
+        return "/driverOnline.html";
+    }
+
+
+
+
+    @ResponseBody
+    @PostMapping("/getSumData")
+    public Object getSumData(Integer companyId, Date addDate, Date start, Date end){
+        Integer id = ShiroKit.getUser().getId();
+        User user = userService.selectById(id);
+        if(companyId == null && user.getRoleType() != 1){
+            companyId = user.getObjectId();
+        }
+        Map<String, Object> map = new HashMap<>();
+        Date date = new Date();
+        Calendar calendar1 = Calendar.getInstance();
+        Calendar calendar2 = Calendar.getInstance();
+        Calendar calendar3 = Calendar.getInstance();
+        Calendar calendar4 = Calendar.getInstance();
+        if(addDate == null){
+            calendar1.setTime(date);
+            calendar2.setTime(date);
+        }else{
+            calendar1.setTime(addDate);
+            calendar2.setTime(addDate);
+        }
+        if(start == null || end == null){
+            calendar3.setTime(date);
+            calendar4.setTime(date);
+        }else{
+            calendar3.setTime(start);
+            calendar4.setTime(end);
+        }
+        calendar1.set(Calendar.HOUR_OF_DAY, 00);
+        calendar1.set(Calendar.MINUTE, 00);
+        calendar1.set(Calendar.SECOND, 00);
+        calendar2.set(Calendar.HOUR_OF_DAY, 23);
+        calendar2.set(Calendar.MINUTE, 59);
+        calendar2.set(Calendar.SECOND, 59);
+        calendar3.set(Calendar.HOUR_OF_DAY, 00);
+        calendar3.set(Calendar.MINUTE, 00);
+        calendar3.set(Calendar.SECOND, 00);
+        calendar4.set(Calendar.HOUR_OF_DAY, 23);
+        calendar4.set(Calendar.MINUTE, 59);
+        calendar4.set(Calendar.SECOND, 59);
+
+        //【今日运行情况】
+        Map<String, Object> map1 = new HashMap<>();
+        Wrapper<TUser> ne = new EntityWrapper<TUser>().between("insertTime", calendar1.getTime(), calendar2.getTime()).ne("flag", 3);
+        if(companyId != null){
+            ne.eq("companyId", companyId);
+        }
+        int i = tUserService.selectCount(ne);
+        map1.put("passengerInfo", i);  //新增用户
+
+        Wrapper<TDriver> ne1 = new EntityWrapper<TDriver>().ne("state", 1).eq("authState", 2).ne("flag", 3);
+        if(companyId != null){
+            ne1.eq("companyId", companyId).or().eq("franchiseeId", companyId);
+        }
+        List<TDriver> tDrivers = tDriverService.selectList(ne1);
+        String keys = "";
+        for(TDriver driver : tDrivers){
+            keys += "DRIVER" + driver.getId() + ",";
+        }
+        String value = redisUtil.getValues(keys.substring(0, keys.length() - 1));
+        JSONArray jsonArray = JSON.parseArray(value);
+        int size = driverOnlineService.queryOnlineDriverCount(null, null);
+        map1.put("netcardriver", size);  //在线司机
+
+        Wrapper<TOrderTaxi> travelTime1 = new EntityWrapper<TOrderTaxi>().between("travelTime", calendar1.getTime(), calendar2.getTime());
+        if(companyId != null){
+            travelTime1.eq("companyId", companyId);
+        }
+        int i1 = tOrderTaxiService.selectCount(travelTime1);
+        map1.put("orderDetail2", i1);  //出租车订单
+
+        Wrapper<TOrderPrivateCar> zcTodayTme = new EntityWrapper<TOrderPrivateCar>().between("travelTime", calendar1.getTime(), calendar2.getTime());
+        if(companyId != null){
+            zcTodayTme.eq("companyId", companyId);
+        }
+        int zcTodayNum = itOrderPrivateCarService.selectCount(zcTodayTme);
+        map1.put("orderDetail1", zcTodayNum);  //专车订单
+
+        Wrapper<TOrderCrossCity> kcTodayTme = new EntityWrapper<TOrderCrossCity>().between("travelTime", calendar1.getTime(), calendar2.getTime());
+        if(companyId != null){
+            kcTodayTme.eq("companyId", companyId);
+        }
+        int kcTodayNum = itOrderCrossCityService.selectCount(kcTodayTme);
+        map1.put("orderDetail3", kcTodayNum);  //跨城订单
+
+        Wrapper<TOrderLogistics> tcxTodayTme = new EntityWrapper<TOrderLogistics>().between("travelTime", calendar1.getTime(), calendar2.getTime());
+        if(companyId != null){
+            tcxTodayTme.eq("companyId", companyId);
+        }
+        tcxTodayTme.eq("type",4);
+        int tcxTodayNum = itOrderLogisticsService.selectCount(tcxTodayTme);
+        map1.put("orderDetail4", tcxTodayNum);  //同城物流订单
+
+        Wrapper<TOrderLogistics> kcxTodayTme = new EntityWrapper<TOrderLogistics>().between("travelTime", calendar1.getTime(), calendar2.getTime());
+        if(companyId != null){
+            kcxTodayTme.eq("companyId", companyId);
+        }
+        tcxTodayTme.eq("type",5);
+        int kcxTodayNum = itOrderLogisticsService.selectCount(kcxTodayTme);
+        map1.put("orderDetail5", kcxTodayNum);  //跨城物流订单
+
+        map.put("operationStatus", map1);
+
+        //【全部运营总数据】
+        map1 = new HashMap<>();
+        Wrapper<TUser> flag1 = new EntityWrapper<TUser>().ne("flag", 3);
+        if(companyId != null){
+            flag1.eq("companyId", companyId);
+        }
+        int flag = tUserService.selectCount(flag1);
+        map1.put("passengerInfoSum", flag);  //总用户
+
+        Wrapper<TDriver> ne4 = new EntityWrapper<TDriver>().eq("authState", 2).ne("flag", 3);
+        if(companyId != null){
+            ne4.eq("companyId", companyId).or().eq("franchiseeId", companyId);
+        }
+        int i2 = tDriverService.selectCount(ne4);
+        map1.put("netcarDriverSum", i2);  //总司机
+
+        Wrapper<TCar> state3 = new EntityWrapper<TCar>().eq("state", 1);
+        if(companyId != null){
+            state3.eq("companyId", companyId).or().eq("franchiseeId", companyId);
+        }
+        int state1 = tCarService.selectCount(state3);
+        map1.put("netCarSum", state1);  //总车辆
+
+        Integer i3 = tOrderTaxiService.getAllOrderNum(companyId,null,null);
+        map1.put("orderDetailSum", i3); //总订单
+
+        Double allTradeMoney = tOrderTaxiService.getAllTradeMoney(companyId, null, null);
+        Double allIncomeMoney = tOrderTaxiService.getAllIncomeMoney(companyId, null, null);
+        map1.put("paiceSum", allTradeMoney);  //交易总金额
+        map1.put("paySum", allIncomeMoney);  //总收益
+        map.put("operationSum", map1);
+
+        //【运营数据增长查询】
+        map1 = new HashMap<>();
+        Wrapper<TUser> ne2 = new EntityWrapper<TUser>().between("insertTime", calendar3.getTime(), calendar4.getTime()).ne("flag", 3);
+        if(companyId != null){
+            ne2.eq("companyId", companyId);
+        }
+        int i4 = tUserService.selectCount(ne2);
+        map1.put("passengerInfoSum", i4);
+
+        Wrapper<TDriver> ne3 = new EntityWrapper<TDriver>().between("insertTime", calendar3.getTime(), calendar4.getTime()).eq("authState", 2).ne("flag", 3);
+        if(companyId != null){
+            ne3.eq("companyId", companyId).or().eq("franchiseeId", companyId);
+        }
+        int i5 = tDriverService.selectCount(ne3);
+        map1.put("netcarDriverSum", i5);
+
+        Wrapper<TOrderPrivateCar> zcTodayTmeByConditions = new EntityWrapper<TOrderPrivateCar>().between("travelTime", calendar3.getTime(), calendar4.getTime());
+        if(companyId != null){
+            zcTodayTmeByConditions.eq("companyId", companyId);
+        }
+        int zcTodayNum1 = itOrderPrivateCarService.selectCount(zcTodayTmeByConditions);
+        map1.put("orderDetail1", zcTodayNum1);  //专车订单
+
+        Wrapper<TOrderTaxi> travelTime2 = new EntityWrapper<TOrderTaxi>().between("travelTime", calendar3.getTime(), calendar4.getTime());
+        if(companyId != null){
+            travelTime2.eq("companyId", companyId);
+        }
+        int travelTime = tOrderTaxiService.selectCount(travelTime2);
+        map1.put("orderDetail2", travelTime);  //出租车订单
+
+        Wrapper<TOrderCrossCity> kcTodayTmeByConditions = new EntityWrapper<TOrderCrossCity>().between("travelTime", calendar3.getTime(), calendar4.getTime());
+        if(companyId != null){
+            kcTodayTmeByConditions.eq("companyId", companyId);
+        }
+        int kcTodayNum1 = itOrderCrossCityService.selectCount(kcTodayTmeByConditions);
+        map1.put("orderDetail3", kcTodayNum1);  //跨城订单
+
+        Wrapper<TOrderLogistics> tcxTodayTmeByConditions = new EntityWrapper<TOrderLogistics>().between("travelTime", calendar3.getTime(), calendar4.getTime());
+        if(companyId != null){
+            tcxTodayTmeByConditions.eq("companyId", companyId);
+        }
+        tcxTodayTmeByConditions.eq("type",4);
+        int tcxTodayNum1 = itOrderLogisticsService.selectCount(tcxTodayTmeByConditions);
+        map1.put("orderDetail4", tcxTodayNum1);  //同城物流订单
+
+        Wrapper<TOrderLogistics> kcxTodayTmeByConditions = new EntityWrapper<TOrderLogistics>().between("travelTime", calendar3.getTime(), calendar4.getTime());
+        if(companyId != null){
+            kcxTodayTmeByConditions.eq("companyId", companyId);
+        }
+        kcxTodayTmeByConditions.eq("type",5);
+        int kcxTodayNum1 = itOrderLogisticsService.selectCount(kcxTodayTmeByConditions);
+        map1.put("orderDetail5", kcxTodayNum1);  //跨城物流订单
+
+        String startTime = null;
+        if (SinataUtil.isNotEmpty(start)){
+            startTime = DateUtil.format(start, "yyyy-MM-dd");
+        }
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(end)){
+            endTime = DateUtil.format(end, "yyyy-MM-dd");
+        }
+        Double allTradeMoneyByTime = tOrderTaxiService.getAllTradeMoney(companyId, startTime, endTime);
+        Double allIncomeMoneyByTime = tOrderTaxiService.getAllIncomeMoney(companyId, startTime, endTime);
+        map1.put("paiceSum", allTradeMoneyByTime);  //交易总金额
+        map1.put("paySum", allIncomeMoneyByTime);   //总收益
+        map.put("operationGrow", map1);
+
+
+        //【运营总趋势】
+        Integer[] states = new Integer[]{8, 9};
+        map1 = new HashMap<>();
+        List<Integer> m1 = new ArrayList<>();
+        List<Integer> m2 = new ArrayList<>();
+        List<Integer> m3 = new ArrayList<>();
+        List<Integer> m4 = new ArrayList<>();
+        List<Integer> m5 = new ArrayList<>();
+        List<Integer> m6 = new ArrayList<>();
+        List<Integer> m7 = new ArrayList<>();
+        for(int j = 30; j > 0; j--){
+            Calendar s1 = Calendar.getInstance();
+            s1.setTime(date);
+            s1.set(s1.get(Calendar.YEAR), s1.get(Calendar.MONTH), s1.get(Calendar.DAY_OF_MONTH) - j, 0, 0, 1);
+            Calendar e1 = Calendar.getInstance();
+            e1.setTime(date);
+            e1.set(e1.get(Calendar.YEAR), e1.get(Calendar.MONTH), e1.get(Calendar.DAY_OF_MONTH) - j, 23, 59, 59);
+
+            //出租车订单趋势图
+            Wrapper<TOrderTaxi> in = new EntityWrapper<TOrderTaxi>().between("travelTime", s1.getTime(), e1.getTime()).in("state", states);
+            if(companyId != null){
+                in.eq("companyId", companyId);
+            }
+            int i6 = tOrderTaxiService.selectCount(in);
+            m1.add(i6);
+
+            //用户注册趋势图
+            Wrapper<TUser> ne5 = new EntityWrapper<TUser>().between("insertTime", s1.getTime(), e1.getTime()).ne("flag", 3);
+            if(companyId != null){
+                ne5.eq("companyId", companyId);
+            }
+            int i7 = tUserService.selectCount(ne5);
+            m2.add(i7);
+
+            //订单数趋势图
+            String startTime1 = DateUtil.format(s1.getTime(), "yyyy-MM-dd");
+            String endTime1 = DateUtil.format(e1.getTime(), "yyyy-MM-dd");
+            Integer allOrderNum = tOrderTaxiService.getAllOrderNum(companyId, startTime1, endTime1);
+            m3.add(allOrderNum);
+
+            //专车订单趋势图
+            Wrapper<TOrderPrivateCar> inZC = new EntityWrapper<TOrderPrivateCar>().between("travelTime", s1.getTime(), e1.getTime()).in("state", states);
+            if(companyId != null){
+                inZC.eq("companyId", companyId);
+            }
+            int zc = itOrderPrivateCarService.selectCount(inZC);
+            m4.add(zc);
+
+            //跨城订单趋势图
+            Wrapper<TOrderCrossCity> inKC = new EntityWrapper<TOrderCrossCity>().between("travelTime", s1.getTime(), e1.getTime()).in("state", states);
+            if(companyId != null){
+                inKC.eq("companyId", companyId);
+            }
+            int kc = itOrderCrossCityService.selectCount(inKC);
+            m5.add(kc);
+
+            //同城物流订单趋势图
+            Wrapper<TOrderLogistics> inTCX = new EntityWrapper<TOrderLogistics>().between("travelTime", s1.getTime(), e1.getTime()).in("state", states);
+            if(companyId != null){
+                inTCX.eq("companyId", companyId);
+            }
+            inTCX.eq("type",4);
+            int tcx = itOrderLogisticsService.selectCount(inTCX);
+            m6.add(tcx);
+
+            //跨城物流订单趋势图
+            Wrapper<TOrderLogistics> inKCX = new EntityWrapper<TOrderLogistics>().between("travelTime", s1.getTime(), e1.getTime()).in("state", states);
+            if(companyId != null){
+                inKCX.eq("companyId", companyId);
+            }
+            inKCX.eq("type",5);
+            int kcx = itOrderLogisticsService.selectCount(inKCX);
+            m7.add(kcx);
+
+        }
+        map1.put("orderDetail5", m7);  //跨城物流订单数趋势图
+        map1.put("orderDetail4", m6);  //同城物流订单数趋势图
+        map1.put("orderDetail3", m5);  //跨城订单数趋势图
+        map1.put("orderDetail1", m4);  //专车订单数趋势图
+        map1.put("orderDetailSum", m3);  //全部订单数趋势图
+        map1.put("passengerInfoSum", m2);  //用户注册趋势图
+        map1.put("orderDetail2", m1);  //出租车订单趋势图
+        map.put("operationTrend", map1);
+
+        return map;
+    }
+
+
+
+    @ResponseBody
+    @PostMapping("/getDriverPosition")
+    public Object getDriverPosition(Integer companyId){
+        Integer id = ShiroKit.getUser().getId();
+        User user = userService.selectById(id);
+        if(companyId == null && user.getRoleType() != 1){
+            companyId = user.getObjectId();
+        }
+        Wrapper<TDriver> ne = new EntityWrapper<TDriver>().eq("authState", 2).eq("state", 2).ne("flag", 3);
+        if(companyId != null){
+            ne.eq("companyId", companyId).or().eq("franchiseeId", companyId);
+        }
+        List<TDriver> tDrivers = tDriverService.selectList(ne);
+        Map<String, Object> map = new HashMap<>();
+        List<Object> list = new ArrayList<>();
+        for(TDriver tDriver : tDrivers){
+            Map<String, Object> d = new HashMap<>();
+            String value = redisUtil.getValue("DRIVER" + tDriver.getId());
+            if(ToolUtil.isEmpty(value)){
+                continue;
+            }
+            d.put("driver", tDriver);
+            d.put("lon", value.split(",")[0]);
+            d.put("lat", value.split(",")[1]);
+            list.add(d);
+        }
+        map.put("driver", list);
+
+        Map<String, Object> map2 = new HashMap<>();
+        Wrapper<TOrderTaxi> eq = new EntityWrapper<TOrderTaxi>().eq("state", 1).eq("isDelete", 1);
+        if(companyId != null){
+            eq.eq("companyId", companyId);
+        }
+        List<TOrderTaxi> tOrderTaxis = tOrderTaxiService.selectList(eq);
+        list = new ArrayList<>();
+        for(TOrderTaxi t : tOrderTaxis){
+            Map<String, Object> map1 = new HashMap<>();
+            map1.put("start", t.getStartAddress());
+            map1.put("end", t.getEndAddress());
+            map1.put("travelTime", t.getTravelTime());
+            map1.put("carModel", "");
+            map1.put("num", 1);
+            list.add(map1);
+        }
+        map2.put("chuzu", list);
+        map.put("order", map2);
+
+        return map;
+    }
+
+
+    @ResponseBody
+    @PostMapping("/getAllOrder")
+    public Object getAllOrder(){
+        List<TOrderTaxi> tOrderTaxis = tOrderTaxiService.selectList(new EntityWrapper<TOrderTaxi>().eq("isDelete", 1));
+        List list = new ArrayList<>();
+        for(TOrderTaxi t : tOrderTaxis){
+            Map<String, Object> map = new HashMap<>();
+            map.put("lon", t.getStartLon());
+            map.put("lat", t.getStartLat());
+            list.add(map);
+        }
+        return list;
+    }
+
+
+    @ResponseBody
+    @PostMapping("/getCompanyInfoByUserId")
+    public Object getCompanyInfoByUserId(){
+        Integer id = ShiroKit.getUser().getId();
+        User user = userService.selectById(id);
+        companys = new ArrayList<>();
+        List<TCompany> ids = new ArrayList<>();
+        TCompany tCompany = null;
+        if(user.getRoleType() == 1 && user.getObjectId() == null){
+            tCompany = tCompanyService.selectById(1);
+        }else{
+            tCompany = tCompanyService.selectById(user.getObjectId());
+        }
+        ids.add(tCompany);
+        companys.addAll(ids);
+        this.getCompanyIds(ids);
+        return companys;
+    }
+
+
+    @ResponseBody
+    @RequestMapping(value = "/getDriverInfo", method = RequestMethod.POST)
+    public Object getDriverInfo(Integer driverId){
+        Map<String, Object> map = new HashMap<>();
+        TDriver tDriver = tDriverService.selectById(driverId);
+        TCar tCar = tCarService.selectById(tDriver.getCarId());
+        TCarBrand tCarBrand = null;
+        TCarModel tCarModel = null;
+        if(null != tCar){
+            tCarBrand = carBrandService.selectById(tCar.getCarBrandId());
+            tCarModel = carModelService.selectById(tCar.getCarModelId());
+        }
+        Integer[] states = new Integer[]{2, 3, 4, 5, 6, 11};
+        Wrapper<TOrderTaxi> state4 = new EntityWrapper<TOrderTaxi>().in("state", states).eq("driverId", driverId).eq("isDelete", 1);
+        List<TOrderTaxi> tOrderTaxis = tOrderTaxiService.selectList(state4);
+        map.put("netcarDriver", tDriver);
+        map.put("netcar", tCar);
+        map.put("carBrand", null != tCarBrand ? tCarBrand.getName() : "");
+        map.put("carModel", null != tCarModel ? tCarModel.getName() : "");
+        map.put("order", tOrderTaxis);
+        return map;
+    }
+
+
+
+    public void getCompanyIds(List<TCompany> ids){
+        List<TCompany> ids_ = new ArrayList<>();
+        for(TCompany id : ids){
+            if(id.getId() == 1){
+                List<TCompany> tCompanies = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("superiorId", id.getId()).or().isNull("superiorId").eq("state", 0).ne("flag", 3).ne("type", 1));
+                ids_.addAll(tCompanies);
+                companys.addAll(tCompanies);
+            }else{
+                List<TCompany> tCompanies = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("superiorId", id.getId()).eq("state", 0).ne("flag", 3));
+                ids_.addAll(tCompanies);
+                companys.addAll(tCompanies);
+            }
+        }
+        if(ids_.size() == 0){
+            return;
+        }
+        this.getCompanyIds(ids_);
+    }
+
+
+
+    @ResponseBody
+    @RequestMapping(value = "/queryOnlineDriver", method = RequestMethod.POST)
+    public Object queryOnlineDriver(String name, String phone, Integer offset, Integer limit){
+        try {
+            return driverOnlineService.queryOnlineDriver(name, phone, offset, limit);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/ReportController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/ReportController.java
new file mode 100644
index 0000000..52fbfa1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/ReportController.java
@@ -0,0 +1,434 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.TCompany;
+import com.stylefeng.guns.modular.system.service.ITCompanyService;
+import com.stylefeng.guns.modular.system.service.IUserActivityDiscount1Service;
+import com.stylefeng.guns.modular.system.service.IUserCouponRecordService;
+import com.stylefeng.guns.modular.system.service.IUserRedPacketRecordService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
+import java.util.List;
+
+/**
+ * 报表控制器
+ */
+@Controller
+@RequestMapping("/report")
+public class ReportController {
+
+    private String PREFIX = "/system/report/";
+
+    @Autowired
+    private ITCompanyService companyService;
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+    @Autowired
+    private IUserRedPacketRecordService redPacketRecordService;
+
+    @Autowired
+    private IUserActivityDiscount1Service userActivityDiscount1Service;
+
+
+
+
+    /**
+     * 跳转到日常运营数据汇总页
+     * @return
+     */
+    @RequestMapping("/showOperationalData")
+    public String showOperationalData(Model model){
+        List<TCompany> tCompanies = companyService.selectList(new EntityWrapper<TCompany>().eq("state", 0).ne("flag", 3));
+        model.addAttribute("company", tCompanies);
+        return PREFIX + "operationalData.html";
+    }
+
+    /**
+     * 跳转到优惠券统计页
+     * @param model
+     * @return
+     */
+    @RequestMapping("/showCouponStatistics")
+    public String showCouponStatistics(Model model){
+        List<TCompany> tCompanies = companyService.selectList(new EntityWrapper<TCompany>().eq("state", 0).ne("flag", 3));
+        model.addAttribute("company", tCompanies);
+        return PREFIX + "couponStatistics.html";
+    }
+
+    /**
+     * 跳转到优惠券统计详情页
+     * @param type
+     * @param model
+     * @return
+     */
+    @RequestMapping("/showCouponStatisticsInfo")
+    public String showCouponStatisticsInfo(Integer type, Model model){
+        List<TCompany> tCompanies = companyService.selectList(new EntityWrapper<TCompany>().eq("state", 0).ne("flag", 3));
+        model.addAttribute("company", tCompanies);
+        model.addAttribute("type", type);
+        return PREFIX + "couponStatisticsInfo.html";
+    }
+
+
+
+
+
+
+    /**
+     * 获取日常运营数据
+     * @param type
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryOperationalData", method = RequestMethod.POST)
+    public Object queryOperationalData(Integer type, String time, Integer companyId, Integer offset, Integer limit){
+        try {
+            String start = null;
+            String end = null;
+            if(ToolUtil.isNotEmpty(time)){
+                start = time.split(" - ")[0];
+                end = time.split(" - ")[1];
+            }
+            return companyService.queryOperationalData(type, start, end, companyId, offset, limit);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 下载日常运营数据汇总表
+     * @param type
+     * @param time
+     * @param companyId
+     * @param response
+     */
+    @ResponseBody
+    @RequestMapping(value = "/downloadOperationalData", method = RequestMethod.GET)
+    public void downloadOperationalData(Integer type, String time, Integer companyId, HttpServletResponse response){
+        try {
+            String start = null;
+            String end = null;
+            if(ToolUtil.isNotEmpty(time)){
+                start = time.split(" - ")[0];
+                end = time.split(" - ")[1];
+            }
+            HSSFWorkbook hssfWorkbook = companyService.downloadOperationalData(type, start, end, companyId);
+            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("日常运营数据汇总表.xls", "utf-8"));
+            response.setContentType("application/vnd.ms-excel");
+            ServletOutputStream out = response.getOutputStream();
+            hssfWorkbook.write(out);
+            out.flush();
+            out.close();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 获取优惠券统计
+     * @param type
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryCouponRegister", method = RequestMethod.POST)
+    public Object queryCouponRegister(Integer type, String name, String time, Integer companyId, Integer offset, Integer limit){
+        try {
+            return userCouponRecordService.queryCouponRegister(type, name, time, companyId, offset, limit);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 下载优惠券领取数据
+     * @param type
+     * @param name
+     * @param time
+     * @param companyId
+     * @param response
+     */
+    @ResponseBody
+    @RequestMapping(value = "/downloadCouponRegister", method = RequestMethod.GET)
+    public void downloadCouponRegister(Integer type, String name, String time, Integer companyId, HttpServletResponse response){
+        try {
+            String na = "";
+            if(type == 2){
+                na = "注册优惠券奖励";
+            }
+            if(type == 3){
+                na = "邀请优惠券奖励";
+            }
+            if(type == 4){
+                na = "充值优惠券奖励";
+            }
+            HSSFWorkbook hssfWorkbook = userCouponRecordService.downloadCouponRegister(type, name, time, companyId);
+            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(na + ".xls", "utf-8"));
+            response.setContentType("application/vnd.ms-excel");
+            ServletOutputStream out = response.getOutputStream();
+            hssfWorkbook.write(out);
+            out.flush();
+            out.close();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 获取红包统计数据
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryRedEnvelopes", method = RequestMethod.POST)
+    public Object queryRedEnvelopes(String name, String time, Integer companyId, Integer offset, Integer limit){
+        try {
+            return redPacketRecordService.queryRedEnvelopes(name, time, companyId, offset, limit);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 下载红包奖励
+     * @param name
+     * @param time
+     * @param companyId
+     * @param response
+     */
+    @ResponseBody
+    @RequestMapping(value = "/downloadRedEnvelopes", method = RequestMethod.GET)
+    public void downloadRedEnvelopes(String name, String time, Integer companyId, HttpServletResponse response){
+        try {
+            HSSFWorkbook hssfWorkbook = redPacketRecordService.downloadRedEnvelopes(name, time, companyId);
+            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("红包奖励.xls", "utf-8"));
+            response.setContentType("application/vnd.ms-excel");
+            ServletOutputStream out = response.getOutputStream();
+            hssfWorkbook.write(out);
+            out.flush();
+            out.close();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+
+    /**
+     * 获取折扣统计
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryDiscount1", method = RequestMethod.POST)
+    public Object queryDiscount1(String name, String time, Integer companyId, Integer offset, Integer limit){
+        try {
+            return userActivityDiscount1Service.queryDiscount1(name, time, companyId, offset, limit);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 下载折扣优惠活动
+     * @param name
+     * @param time
+     * @param companyId
+     * @param response
+     */
+    @ResponseBody
+    @RequestMapping(value = "/downloadDiscount1", method = RequestMethod.GET)
+    public void downloadDiscount1(String name, String time, Integer companyId, HttpServletResponse response){
+        try {
+            HSSFWorkbook hssfWorkbook = userActivityDiscount1Service.downloadDiscount1(name, time, companyId);
+            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("折扣优惠活动.xls", "utf-8"));
+            response.setContentType("application/vnd.ms-excel");
+            ServletOutputStream out = response.getOutputStream();
+            hssfWorkbook.write(out);
+            out.flush();
+            out.close();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 获取优惠券统计明细
+     * @param type
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryCouponRegisterInfo", method = RequestMethod.POST)
+    public Object queryCouponRegisterInfo(Integer type, String name, String time, Integer companyId, Integer offset, Integer limit){
+        try {
+            type += 1;
+            return userCouponRecordService.queryCouponRegisterInfo(type, name, time, companyId, offset, limit);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    /**
+     * 获取充值赠送优惠券明细
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryCouponRegisterInfo1", method = RequestMethod.POST)
+    public Object queryCouponRegisterInfo1(String name, String time, Integer companyId, Integer offset, Integer limit){
+        try {
+            return userCouponRecordService.queryCouponRegisterInfo1( name, time, companyId, offset, limit);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 获取折扣优惠详情
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryDiscountInfo", method = RequestMethod.POST)
+    public Object queryDiscountInfo(String name, String time, Integer companyId, Integer offset, Integer limit){
+        try {
+            return userActivityDiscount1Service.queryDiscountInfo(name, time, companyId, offset, limit);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+
+
+    /**
+     * 获取红包领取详情
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryRedEnvelopesInfo", method = RequestMethod.POST)
+    public Object queryRedEnvelopesInfo(String name, String time, Integer companyId, Integer offset, Integer limit){
+        try {
+            return redPacketRecordService.queryRedEnvelopesInfo(name, time, companyId, offset, limit);
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+
+    /**
+     * 优惠明细下载
+     * @param type
+     * @param name
+     * @param time
+     * @param companyId
+     * @param response
+     */
+    @ResponseBody
+    @RequestMapping(value = "/downloadCouponStatisticsInfo", method = RequestMethod.GET)
+    public void downloadCouponStatisticsInfo(Integer type, String name, String time, Integer companyId, HttpServletResponse response){
+        try {
+            if(type == 1 || type == 2){
+                type += 1;
+                HSSFWorkbook hssfWorkbook = userCouponRecordService.downloadCouponRegisterInfo(type, name, time, companyId);
+                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode((type == 2 ? "注册奖励明细" : "邀请奖励明细") + ".xls", "utf-8"));
+                response.setContentType("application/vnd.ms-excel");
+                ServletOutputStream out = response.getOutputStream();
+                hssfWorkbook.write(out);
+                out.flush();
+                out.close();
+            }
+            if(type == 3){
+                HSSFWorkbook hssfWorkbook = userCouponRecordService.downloadCouponRegisterInfo1(name, time, companyId);
+                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("充值奖励明细.xls", "utf-8"));
+                response.setContentType("application/vnd.ms-excel");
+                ServletOutputStream out = response.getOutputStream();
+                hssfWorkbook.write(out);
+                out.flush();
+                out.close();
+            }
+            if(type == 4){
+                HSSFWorkbook hssfWorkbook = userActivityDiscount1Service.downloadDiscountInfo(name, time, companyId);
+                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("折扣优惠明细.xls", "utf-8"));
+                response.setContentType("application/vnd.ms-excel");
+                ServletOutputStream out = response.getOutputStream();
+                hssfWorkbook.write(out);
+                out.flush();
+                out.close();
+            }
+            if(type == 5){
+                HSSFWorkbook hssfWorkbook = redPacketRecordService.downloadRedEnvelopesInfo(name, time, companyId);
+                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("红包优惠明细.xls", "utf-8"));
+                response.setContentType("application/vnd.ms-excel");
+                ServletOutputStream out = response.getOutputStream();
+                hssfWorkbook.write(out);
+                out.flush();
+                out.close();
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysCouponActivityController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysCouponActivityController.java
new file mode 100644
index 0000000..06d0d5f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysCouponActivityController.java
@@ -0,0 +1,276 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.SysCouponRecord;
+import com.stylefeng.guns.modular.system.model.TUser;
+import com.stylefeng.guns.modular.system.model.UserCouponRecord;
+import com.stylefeng.guns.modular.system.service.ISysCouponRecordService;
+import com.stylefeng.guns.modular.system.service.ITUserService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.SysCouponActivity;
+import com.stylefeng.guns.modular.system.service.ISysCouponActivityService;
+
+import java.util.*;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-17 09:14:59
+ */
+@Controller
+@RequestMapping("/sysCouponActivity")
+public class SysCouponActivityController extends BaseController {
+
+    private String PREFIX = "/system/sysCouponActivity/";
+
+    @Autowired
+    private ISysCouponActivityService sysCouponActivityService;
+
+    @Autowired
+    private ITUserService userService;
+
+    @Autowired
+    private ISysCouponRecordService couponRecordService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "sysCouponActivity.html";
+    }
+
+    /**
+     * 跳转到选择优惠券页面
+     * @return
+     */
+    @RequestMapping("/sysCouponRecord")
+    public String sysCouponRecord() {
+        return PREFIX + "sysCouponRecord.html";
+    }
+
+    /**
+     * 跳转到选择用户页面
+     * @return
+     */
+    @RequestMapping("user")
+    public String user() {
+        return PREFIX + "tUser.html";
+    }
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/sysCouponActivity_add")
+    public String sysCouponActivityAdd() {
+        return PREFIX + "sysCouponActivity_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/sysCouponActivity_update/{sysCouponActivityId}")
+    public String sysCouponActivityUpdate(@PathVariable Integer sysCouponActivityId, Model model) {
+        SysCouponActivity sysCouponActivity = sysCouponActivityService.selectById(sysCouponActivityId);
+        model.addAttribute("item",sysCouponActivity);
+        if(sysCouponActivity.getSendType()==2){
+            model.addAttribute("sendUserInfoList",JSON.parseArray(sysCouponActivity.getSendUserId()));
+        }else{
+            model.addAttribute("sendUserInfoList",new ArrayList<>());
+        }
+        LogObjectHolder.me().set(sysCouponActivity);
+        return PREFIX + "sysCouponActivity_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime,Integer couponUseType,Integer status) {
+        Date startTimes = null;
+        Date endTimes = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            startTimes = DateUtil.getDate_str3(timeArray[0]+" 00:00:00");
+            endTimes = DateUtil.getDate_str3(timeArray[1]+" 23:59:59");
+        }
+        Page<SysCouponActivity> page = new PageFactory<SysCouponActivity>().defaultPage();
+        Wrapper wrapper = new EntityWrapper<SysCouponActivity>();
+        if(SinataUtil.isNotEmpty(createTime)){
+            wrapper.between("insertTime",startTimes,endTimes);
+        }
+        if(SinataUtil.isNotEmpty(couponUseType)){wrapper.eq("couponUseType",couponUseType);}
+        if(SinataUtil.isNotEmpty(status)){wrapper.eq("status",status);}
+        ShiroUser user = ShiroKit.getUser();
+        if(user.getRoleType()!=1){
+            wrapper.eq("companyId",user.getObjectId());
+            wrapper.eq("companyType",user.getRoleType());
+        }
+        wrapper.ne("status",4);
+        wrapper.orderBy("id",false);
+        return super.packForBT(sysCouponActivityService.selectPage(page,wrapper));
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(SysCouponActivity sysCouponActivity,Integer activityId) {
+        SysCouponRecord sysCouponRecord = couponRecordService.selectById(activityId);
+        sysCouponActivity.setCouponType(sysCouponRecord.getCouponType());
+        sysCouponActivity.setCouponUseType(sysCouponRecord.getCouponUseType());
+        sysCouponActivity.setMoney(sysCouponRecord.getMoney());
+        sysCouponActivity.setFullMoney(sysCouponRecord.getFullMoney());
+        sysCouponActivity.setInsertTime(new Date());
+        sysCouponActivity.setCouponId(activityId);
+        sysCouponActivity.setCompanyId(ShiroKit.getUser().getObjectId());
+        sysCouponActivity.setCompanyType(ShiroKit.getUser().getRoleType());
+        sysCouponActivity.setStatus(sysCouponActivity.getCompanyType()==1?3:1);
+        sysCouponActivityService.insert(sysCouponActivity);
+        if(sysCouponActivity.getCompanyType()==1){
+            //定时发送优惠券
+            Timer timer = new Timer();
+            timer.schedule(new timerTaskTest(sysCouponActivity.getId()),30*1000);//timer.schedule(执行的方法,延迟多久执行(ms))
+        }
+        return SUCCESS_TIP;
+    }
+    /**
+     * 跳转到立即处理页面
+     */
+    @RequestMapping("/sysCouponActivity_immediately/{id}")
+    public String sysCouponActivityImmediately(@PathVariable Integer id, Model model) {
+        model.addAttribute("id",id);
+        return PREFIX + "sysCouponActivity_immediately.html";
+    }
+    /**
+     * 立即处理操作
+     */
+    @RequestMapping(value = "/immediately")
+    @ResponseBody
+    public Object immediately(@RequestParam Integer id,@RequestParam Integer state,@RequestParam String remark) {
+        SysCouponActivity sysCouponActivity = sysCouponActivityService.selectById(id);
+        if (SinataUtil.isNotEmpty(sysCouponActivity)){
+            sysCouponActivity.setStatus(state);
+            sysCouponActivity.setRemark(remark);
+            sysCouponActivityService.updateById(sysCouponActivity);
+            if(state==3){
+                //定时发送优惠券
+                Timer timer = new Timer();
+                timer.schedule(new timerTaskTest(id),30*1000);//timer.schedule(执行的方法,延迟多久执行(ms))
+            }
+        }
+        return SUCCESS_TIP;
+    }
+    class timerTaskTest extends TimerTask {
+        private Integer id;
+
+        public timerTaskTest(Integer id) {
+            this.id = id;
+        }
+        @Override
+        public void run() {
+            SysCouponActivity sysCouponActivity = sysCouponActivityService.selectById(id);
+            UserCouponRecord userCouponRecord = new UserCouponRecord();
+            userCouponRecord.setMoney(sysCouponActivity.getMoney());
+            userCouponRecord.setFullMoney(sysCouponActivity.getFullMoney());
+            Date nowDay = new Date();
+            userCouponRecord.setInsertTime(nowDay);
+            userCouponRecord.setExpirationTime(new Date(nowDay.getTime()+sysCouponActivity.getEffective()*24*3600*1000L));
+            userCouponRecord.setCompanyId(sysCouponActivity.getCompanyId());
+            userCouponRecord.setState(1);
+            userCouponRecord.setCouponType(sysCouponActivity.getCouponType());
+            userCouponRecord.setCouponUseType(sysCouponActivity.getCouponUseType());
+            userCouponRecord.setCouponActivityId(sysCouponActivity.getId());
+            userCouponRecord.setActivityType(1);
+            //判断发送类型1=全部用户,2=选择用户
+            if(sysCouponActivity.getSendType()==1){
+                Wrapper wrapper = new EntityWrapper<TUser>();
+                if(sysCouponActivity.getCompanyType()!=1){
+                    wrapper.eq("companyId",sysCouponActivity.getCompanyId());
+                }
+                List<TUser> list = userService.selectList(wrapper);
+                for(TUser user:list){
+                    userCouponRecord.setUserId(user.getId());
+                    for (int i=0;i<sysCouponActivity.getNumber();i++){
+                        userCouponRecord.insert();
+                    }
+                }
+                sysCouponActivity.setSendUserNum(list.size());
+                sysCouponActivity.updateById();
+            }else{
+               JSONArray  userId = JSON.parseArray(sysCouponActivity.getSendUserId());
+                for(int j=0;j<userId.size();j++){
+                    userCouponRecord.setUserId(userId.getJSONObject(j).getInteger("userId"));
+                    for (int i=0;i<sysCouponActivity.getNumber();i++){
+                        userCouponRecord.insert();
+                    }
+                }
+                sysCouponActivity.setSendUserNum(userId.size());
+                sysCouponActivity.updateById();
+
+            }
+
+        }
+    }
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer sysCouponActivityId) {
+        SysCouponActivity sysCouponActivity = new SysCouponActivity();
+        sysCouponActivity.setId(sysCouponActivityId);
+        sysCouponActivity.setStatus(4);
+        sysCouponActivityService.updateById(sysCouponActivity);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(SysCouponActivity sysCouponActivity,Integer activityId) {
+        SysCouponRecord sysCouponRecord = couponRecordService.selectById(activityId);
+        sysCouponActivity.setCouponType(sysCouponRecord.getCouponType());
+        sysCouponActivity.setCouponUseType(sysCouponRecord.getCouponUseType());
+        sysCouponActivity.setMoney(sysCouponRecord.getMoney());
+        sysCouponActivity.setFullMoney(sysCouponRecord.getFullMoney());
+        sysCouponActivity.setInsertTime(new Date());
+        sysCouponActivity.setCouponId(activityId);
+        sysCouponActivity.setCompanyId(ShiroKit.getUser().getObjectId());
+        sysCouponActivity.setCompanyType(ShiroKit.getUser().getRoleType());
+        sysCouponActivity.setStatus(sysCouponActivity.getCompanyType()==1?3:1);
+        sysCouponActivityService.updateById(sysCouponActivity);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{sysCouponActivityId}")
+    @ResponseBody
+    public Object detail(@PathVariable("sysCouponActivityId") Integer sysCouponActivityId) {
+        return sysCouponActivityService.selectById(sysCouponActivityId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysCouponRecordController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysCouponRecordController.java
new file mode 100644
index 0000000..fa1e918
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysCouponRecordController.java
@@ -0,0 +1,140 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.SysRedPacketRecord;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.SysCouponRecord;
+import com.stylefeng.guns.modular.system.service.ISysCouponRecordService;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-15 17:42:16
+ */
+@Controller
+@RequestMapping("/sysCouponRecord")
+public class SysCouponRecordController extends BaseController {
+
+    private String PREFIX = "/system/sysCouponRecord/";
+
+    @Autowired
+    private ISysCouponRecordService sysCouponRecordService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "sysCouponRecord.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/sysCouponRecord_add")
+    public String sysCouponRecordAdd() {
+        return PREFIX + "sysCouponRecord_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/sysCouponRecord_update/{sysCouponRecordId}")
+    public String sysCouponRecordUpdate(@PathVariable Integer sysCouponRecordId, Model model) {
+        SysCouponRecord sysCouponRecord = sysCouponRecordService.selectById(sysCouponRecordId);
+        model.addAttribute("item",sysCouponRecord);
+        LogObjectHolder.me().set(sysCouponRecord);
+        return PREFIX + "sysCouponRecord_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime,Integer couponUseType,Integer couponType) {
+
+        Date startTimes = null;
+        Date endTimes = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            startTimes = DateUtil.getDate_str3(timeArray[0]+" 00:00:00");
+            endTimes = DateUtil.getDate_str3(timeArray[1]+" 23:59:59");
+        }
+        Page<SysCouponRecord> page = new PageFactory<SysCouponRecord>().defaultPage();
+        Wrapper wrapper = new EntityWrapper<SysCouponRecord>();
+        if(SinataUtil.isNotEmpty(createTime)){
+            wrapper.between("insertTime",startTimes,endTimes);
+        }
+        if(SinataUtil.isNotEmpty(couponUseType)){
+            wrapper.eq("couponUseType",couponUseType);
+        }
+        if(SinataUtil.isNotEmpty(couponType)){
+            wrapper.eq("couponType",couponType);
+        }
+        wrapper.eq("companyId",ShiroKit.getUser().getObjectId());
+        wrapper.eq("companyType",ShiroKit.getUser().getRoleType());
+        wrapper.orderBy("id",false);
+        return super.packForBT(sysCouponRecordService.selectPage(page,wrapper));
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(SysCouponRecord sysCouponRecord) {
+        sysCouponRecord.setInsertTime(new Date());
+        sysCouponRecord.setCompanyId(ShiroKit.getUser().getObjectId());
+        sysCouponRecord.setCompanyType(ShiroKit.getUser().getRoleType());
+        sysCouponRecordService.insert(sysCouponRecord);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer sysCouponRecordId) {
+        sysCouponRecordService.deleteById(sysCouponRecordId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(SysCouponRecord sysCouponRecord) {
+        sysCouponRecordService.updateById(sysCouponRecord);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{sysCouponRecordId}")
+    @ResponseBody
+    public Object detail(@PathVariable("sysCouponRecordId") Integer sysCouponRecordId) {
+        return sysCouponRecordService.selectById(sysCouponRecordId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java
new file mode 100644
index 0000000..fd0f70a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java
@@ -0,0 +1,132 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.SysRedPacketRecord;
+import com.stylefeng.guns.modular.system.service.ISysRedPacketRecordService;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-13 10:50:42
+ */
+@Controller
+@RequestMapping("/sysRedPacketRecord")
+public class SysRedPacketRecordController extends BaseController {
+
+    private String PREFIX = "/system/sysRedPacketRecord/";
+
+    @Autowired
+    private ISysRedPacketRecordService sysRedPacketRecordService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "sysRedPacketRecord.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/sysRedPacketRecord_add")
+    public String sysRedPacketRecordAdd() {
+        return PREFIX + "sysRedPacketRecord_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/sysRedPacketRecord_update/{sysRedPacketRecordId}")
+    public String sysRedPacketRecordUpdate(@PathVariable Integer sysRedPacketRecordId, Model model) {
+        SysRedPacketRecord sysRedPacketRecord = sysRedPacketRecordService.selectById(sysRedPacketRecordId);
+        model.addAttribute("item",sysRedPacketRecord);
+        LogObjectHolder.me().set(sysRedPacketRecord);
+        return PREFIX + "sysRedPacketRecord_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime) {
+        Date startTimes = null;
+        Date endTimes = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            startTimes = DateUtil.getDate_str3(timeArray[0]+" 00:00:00");
+            endTimes = DateUtil.getDate_str3(timeArray[1]+" 23:59:59");
+        }
+        Page<SysRedPacketRecord> page = new PageFactory<SysRedPacketRecord>().defaultPage();
+        Wrapper wrapper = new EntityWrapper<SysRedPacketRecord>();
+        if(SinataUtil.isNotEmpty(createTime)){
+            wrapper.between("insertTime",startTimes,endTimes);
+        }
+        wrapper.eq("companyId",ShiroKit.getUser().getObjectId());
+        wrapper.eq("companyType",ShiroKit.getUser().getRoleType());
+        wrapper.orderBy("id",false);
+        return super.packForBT(sysRedPacketRecordService.selectPage(page,wrapper));
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(SysRedPacketRecord sysRedPacketRecord) {
+        sysRedPacketRecord.setInsertTime(new Date());
+        sysRedPacketRecord.setCompanyId(ShiroKit.getUser().getObjectId());
+        sysRedPacketRecord.setCompanyType(ShiroKit.getUser().getRoleType());
+        sysRedPacketRecordService.insert(sysRedPacketRecord);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer sysRedPacketRecordId) {
+        sysRedPacketRecordService.deleteById(sysRedPacketRecordId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(SysRedPacketRecord sysRedPacketRecord) {
+        sysRedPacketRecordService.updateById(sysRedPacketRecord);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{sysRedPacketRecordId}")
+    @ResponseBody
+    public Object detail(@PathVariable("sysRedPacketRecordId") Integer sysRedPacketRecordId) {
+        return sysRedPacketRecordService.selectById(sysRedPacketRecordId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAdvertisementController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAdvertisementController.java
new file mode 100644
index 0000000..91003a0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAdvertisementController.java
@@ -0,0 +1,151 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TRegion;
+import com.stylefeng.guns.modular.system.service.ITRegionService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TAdvertisement;
+import com.stylefeng.guns.modular.system.service.ITAdvertisementService;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 广告设置控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-02 09:36:03
+ */
+@Controller
+@RequestMapping("/tAdvertisement")
+public class TAdvertisementController extends BaseController {
+
+    private String PREFIX = "/system/tAdvertisement/";
+
+    @Autowired
+    private ITAdvertisementService tAdvertisementService;
+
+    @Autowired
+    private ITRegionService tRegionService;
+
+    /**
+     * 跳转到广告设置首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tAdvertisement.html";
+    }
+
+    /**
+     * 跳转到添加广告设置
+     */
+    @RequestMapping("/tAdvertisement_add")
+    public String tAdvertisementAdd(Model model) {
+        List<TRegion> list = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("list",list);
+        return PREFIX + "tAdvertisement_add.html";
+    }
+
+    /**
+     * 跳转到修改广告设置
+     */
+    @RequestMapping("/tAdvertisement_update/{tAdvertisementId}")
+    public String tAdvertisementUpdate(@PathVariable Integer tAdvertisementId, Model model) {
+        TAdvertisement tAdvertisement = tAdvertisementService.selectById(tAdvertisementId);
+        model.addAttribute("item",tAdvertisement);
+        LogObjectHolder.me().set(tAdvertisement);
+
+        List<TRegion> list = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("list",list);
+        return PREFIX + "tAdvertisement_edit.html";
+    }
+
+    /**
+     * 获取广告设置列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String name,
+                       Integer type) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tAdvertisementService.getAdvertisementList(page,beginTime,endTime,type,name));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增广告设置
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TAdvertisement tAdvertisement) {
+        tAdvertisement.setInsertTime(new Date());
+        tAdvertisement.setInsertUser(ShiroKit.getUser().getId());
+        tAdvertisementService.insert(tAdvertisement);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除广告设置
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tAdvertisementId) {
+        tAdvertisementService.deleteById(tAdvertisementId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 操作广告设置
+     */
+    @RequestMapping(value = "/opt")
+    @ResponseBody
+    public Object opt(@RequestParam Integer tAdvertisementId,@RequestParam Integer optType) {
+        TAdvertisement tAdvertisement = tAdvertisementService.selectById(tAdvertisementId);
+        if (SinataUtil.isNotEmpty(tAdvertisement)){
+            if (1 == optType.intValue()){  //上线
+                tAdvertisement.setState(1);
+            }else if (2 == optType.intValue()){  //下线
+                tAdvertisement.setState(2);
+            }
+            tAdvertisement.setUpdateTime(new Date());
+            tAdvertisement.setUpdateUser(ShiroKit.getUser().getId());
+            tAdvertisementService.updateById(tAdvertisement);
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改广告设置
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TAdvertisement tAdvertisement) {
+        tAdvertisement.setUpdateTime(new Date());
+        tAdvertisement.setUpdateUser(ShiroKit.getUser().getId());
+        tAdvertisementService.updateById(tAdvertisement);
+        return SUCCESS_TIP;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAgreementController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAgreementController.java
new file mode 100644
index 0000000..e1e332e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAgreementController.java
@@ -0,0 +1,283 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.modular.system.util.AddAdminLogUtil;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TAgreement;
+import com.stylefeng.guns.modular.system.service.ITAgreementService;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 用户端协议管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-01 17:42:20
+ */
+@Controller
+@RequestMapping("/tAgreement")
+public class TAgreementController extends BaseController {
+
+    private String PREFIX = "/system/tAgreement/";
+
+    @Autowired
+    private ITAgreementService tAgreementService;
+
+    /**
+     * 跳转到用户端协议管理首页
+     */
+    @RequestMapping("")
+    public String index(Model model) {
+        //注册协议
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("useType", 1).eq("type", 6));
+        //用户协议
+        TAgreement two = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("useType", 1).eq("type", 2));
+        //隐私协议
+        TAgreement three = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("useType", 1).eq("type", 1));
+        model.addAttribute("one",one);
+        model.addAttribute("two",two);
+        model.addAttribute("three",three);
+        return PREFIX + "tAgreement.html";
+    }
+
+    /**
+     * 跳转到司机端协议管理首页
+     */
+    @RequestMapping("/driver")
+    public String driverIndex(Model model) {
+        //注册协议
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("useType", 2).eq("type", 6));
+        //用户协议
+        TAgreement two = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("useType", 2).eq("type", 2));
+        //隐私协议
+        TAgreement three = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("useType", 2).eq("type", 1));
+        model.addAttribute("one",one);
+        model.addAttribute("two",two);
+        model.addAttribute("three",three);
+        return PREFIX + "tAgreementDriver.html";
+    }
+
+    /**
+     * 跳转到取消订单说明协议管理首页
+     */
+    @RequestMapping("/order")
+    public String orderIndex(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 7));
+        model.addAttribute("one",one);
+        return PREFIX + "tAgreementOrder.html";
+    }
+
+    /**
+     * 跳转到用户指南设置协议管理首页
+     */
+    @RequestMapping("/user")
+    public String userIndex(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 3));
+        model.addAttribute("one",one);
+        return PREFIX + "tAgreementUser.html";
+    }
+
+    /**
+     * 跳转到法律法规设置协议管理首页
+     */
+    @RequestMapping("/law")
+    public String lawIndex(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 4));
+        model.addAttribute("one",one);
+        return PREFIX + "tAgreementLaw.html";
+    }
+
+    /**
+     * 跳转到关于我们设置协议管理首页
+     */
+    @RequestMapping("/me")
+    public String meIndex(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 5));
+        model.addAttribute("one",one);
+        return PREFIX + "tAgreementMe.html";
+    }
+
+    /**
+     * 跳转到充值领券规则设置协议管理首页
+     */
+    @RequestMapping("/recharge")
+    public String rechargeIndex(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 8));
+        model.addAttribute("one",one);
+        return PREFIX + "tAgreementRecharge.html";
+    }
+
+    /**
+     * 跳转到司机注册协议设置管理首页
+     */
+    @RequestMapping("/driverRegister")
+    public String driverRegister(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 9));
+        model.addAttribute("one",one);
+        return PREFIX + "driverRegister.html";
+    }
+
+    /**
+     * 跳转到改派说明设置管理首页
+     */
+    @RequestMapping("/instructions")
+    public String instructions(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 10));
+        model.addAttribute("one",one);
+        return PREFIX + "instructions.html";
+    }
+
+    /**
+     * 跳转到跨城出行乘车须知
+     */
+    @RequestMapping("/corssHtml")
+    public String corssHtml(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 11));
+        model.addAttribute("one",one);
+        return PREFIX + "corssHtml.html";
+    }
+
+
+    /**
+     * 跳转到常见问题
+     * @param model
+     * @return
+     */
+    @RequestMapping("/showCommonProblem")
+    public String showCommonProblem(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 12));
+        model.addAttribute("one",one);
+        return PREFIX + "commonProblem.html";
+    }
+
+
+    /**
+     * 跳转到计价规则
+     * @param model
+     * @return
+     */
+    @RequestMapping("/showPricingRules")
+    public String showPricingRules(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 13));
+        model.addAttribute("one",one);
+        return PREFIX + "pricingRules.html";
+    }
+
+
+    /**
+     * 跳转到包车协议
+     * @param model
+     * @return
+     */
+    @RequestMapping("/showCharterCar")
+    public String showCharterCar(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 14));
+        model.addAttribute("one",one);
+        return PREFIX + "tAgreementCharterCar.html";
+    }
+
+
+    /**
+     * 跳转到小件物流协议
+     * @param model
+     * @return
+     */
+    @RequestMapping("/showSmallPieceLogistics")
+    public String showSmallPieceLogistics(Model model) {
+        TAgreement one = tAgreementService.selectOne(new EntityWrapper<TAgreement>().eq("type", 15));
+        model.addAttribute("one",one);
+        return PREFIX + "tAgreementSmallPieceLogistics.html";
+    }
+
+
+    /**
+     * 修改协议
+     */
+    @RequestMapping(value = "/updateAppParam")
+    @ResponseBody
+    public Object updateAppParam(@RequestParam Integer id,@RequestParam String context) {
+        TAgreement agreement = tAgreementService.selectById(id);
+        agreement.setContent(context);
+        agreement.setUpdateTime(new Date());
+        agreement.setUpdateUser(ShiroKit.getUser().getId());
+        tAgreementService.updateById(agreement);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 跳转到添加用户端协议管理
+     */
+    @RequestMapping("/tAgreement_add")
+    public String tAgreementAdd() {
+        return PREFIX + "tAgreement_add.html";
+    }
+
+    /**
+     * 跳转到修改用户端协议管理
+     */
+    @RequestMapping("/tAgreement_update/{tAgreementId}")
+    public String tAgreementUpdate(@PathVariable Integer tAgreementId, Model model) {
+        TAgreement tAgreement = tAgreementService.selectById(tAgreementId);
+        model.addAttribute("item",tAgreement);
+        LogObjectHolder.me().set(tAgreement);
+        return PREFIX + "tAgreement_edit.html";
+    }
+
+    /**
+     * 获取用户端协议管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        return tAgreementService.selectList(null);
+    }
+
+    /**
+     * 新增用户端协议管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TAgreement tAgreement) {
+        tAgreementService.insert(tAgreement);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除用户端协议管理
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tAgreementId) {
+        tAgreementService.deleteById(tAgreementId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改用户端协议管理
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TAgreement tAgreement) {
+        tAgreementService.updateById(tAgreement);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 用户端协议管理详情
+     */
+    @RequestMapping(value = "/detail/{tAgreementId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tAgreementId") Integer tAgreementId) {
+        return tAgreementService.selectById(tAgreementId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarBrandController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarBrandController.java
new file mode 100644
index 0000000..bd0a98f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarBrandController.java
@@ -0,0 +1,116 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.util.SinataUtil;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TCarBrand;
+import com.stylefeng.guns.modular.system.service.ITCarBrandService;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 车辆品牌管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-05 13:52:25
+ */
+@Controller
+@RequestMapping("/tCarBrand")
+public class TCarBrandController extends BaseController {
+
+    private String PREFIX = "/system/tCarBrand/";
+
+    @Autowired
+    private ITCarBrandService tCarBrandService;
+
+    /**
+     * 跳转到车辆品牌管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tCarBrand.html";
+    }
+
+    /**
+     * 跳转到添加车辆品牌管理
+     */
+    @RequestMapping("/tCarBrand_add")
+    public String tCarBrandAdd() {
+        return PREFIX + "tCarBrand_add.html";
+    }
+
+    /**
+     * 跳转到修改车辆品牌管理
+     */
+    @RequestMapping("/tCarBrand_update/{tCarBrandId}")
+    public String tCarBrandUpdate(@PathVariable Integer tCarBrandId, Model model) {
+        TCarBrand tCarBrand = tCarBrandService.selectById(tCarBrandId);
+        model.addAttribute("item",tCarBrand);
+        LogObjectHolder.me().set(tCarBrand);
+        return PREFIX + "tCarBrand_edit.html";
+    }
+
+    /**
+     * 获取车辆品牌管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime,
+                       String name) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tCarBrandService.getCarBrandList(page,beginTime,endTime,name));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增车辆品牌管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TCarBrand tCarBrand) {
+        tCarBrand.setInsertTime(new Date());
+        tCarBrand.setState(1);
+        tCarBrandService.insert(tCarBrand);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除车辆品牌管理
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tCarBrandId) {
+        TCarBrand tCarBrand = tCarBrandService.selectById(tCarBrandId);
+        tCarBrand.setState(2);
+        tCarBrandService.updateById(tCarBrand);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改车辆品牌管理
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TCarBrand tCarBrand) {
+        tCarBrandService.updateById(tCarBrand);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarController.java
new file mode 100644
index 0000000..cf3a42c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarController.java
@@ -0,0 +1,1045 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.ExcelExportUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.WoUtil;
+import com.stylefeng.guns.modular.system.dao.CarInsuranceMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.PushMinistryOfTransportUtil;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.apache.commons.lang.time.DateUtils;
+import org.apache.poi.hdf.extractor.TC;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.ui.Model;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 车辆管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-05 17:25:12
+ */
+@Controller
+@RequestMapping("/tCar")
+public class TCarController extends BaseController {
+
+    private String PREFIX = "/system/tCar/";
+
+    @Autowired
+    private ITCarService tCarService;
+
+    @Autowired
+    private ITCompanyService tCompanyService;
+
+    @Autowired
+    private ITCarServiceService tCarServiceService;
+
+    @Autowired
+    private ITDriverLineService tDriverLineService;
+
+    @Autowired
+    private ITCarBrandService tCarBrandService;
+
+    @Autowired
+    private ITCarModelService tCarModelService;
+
+    @Autowired
+    private ITDriverService tDriverService;
+
+    @Autowired
+    private ITCompanyService itCompanyService;
+
+    @Autowired
+    private ITCarServiceService itCarServiceService;
+
+    @Autowired
+    private ITServerCarmodelService itServerCarmodelService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Resource
+    private CarInsuranceMapper carInsuranceMapper;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+    /**
+     * 跳转到车辆管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tCar.html";
+    }
+
+    /**
+     * 跳转到添加车辆管理
+     */
+    @RequestMapping("/tCar_add")
+    public String tCarAdd(Model model) {
+        List<TCompany> companyList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 2));
+        model.addAttribute("companyList",companyList);
+
+        Integer roleType = ShiroKit.getUser().getRoleType();
+        model.addAttribute("roleType",roleType);
+        if (2 == roleType){
+            List<TCompany> franchiseeList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 3).eq("superiorId",ShiroKit.getUser().getObjectId()));
+            model.addAttribute("franchiseeList",franchiseeList);
+        }else{
+            model.addAttribute("franchiseeList",null);
+        }
+        //查询当前用户所属分公司/加盟商
+        model.addAttribute("objectName",tCompanyService.selectById(ShiroKit.getUser().getObjectId()).getName());
+
+        //车辆品牌
+        List<TCarBrand> brandList = tCarBrandService.selectList(new EntityWrapper<TCarBrand>().eq("state", 1));
+        model.addAttribute("brandList",brandList);
+        //车辆类型
+        /*List<TCarModel> modelList = tCarModelService.selectList(new EntityWrapper<TCarModel>().eq("state", 1));
+        model.addAttribute("modelList",modelList);*/
+
+        List<TServerCarmodel> zcModelList = itServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 1).eq("state", 1));
+        model.addAttribute("zcModelList",zcModelList);
+        List<TServerCarmodel> kcModelList = itServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 2).eq("state", 1));
+        model.addAttribute("kcModelList",kcModelList);
+        return PREFIX + "tCar_add.html";
+    }
+
+    /**
+     * 查询车辆类型
+     * @param carBrandId
+     * @return
+     */
+    @RequestMapping(value = "/brandChange")
+    @ResponseBody
+    public Object brandChange(@RequestParam Integer carBrandId) {
+        List<TCarModel> list = new ArrayList<>();
+        if (SinataUtil.isNotEmpty(carBrandId)){
+            list = tCarModelService.selectList(new EntityWrapper<TCarModel>().eq("state",1).eq("brandId", carBrandId));
+        }
+        return list;
+    }
+
+    /**
+     * 跳转到修改车辆管理
+     */
+    @RequestMapping("/tCar_update/{tCarId}")
+    public String tCarUpdate(@PathVariable Integer tCarId, Model model) {
+        TCar tCar = tCarService.selectById(tCarId);
+        model.addAttribute("item",tCar);
+        LogObjectHolder.me().set(tCar);
+
+        Integer roleType = ShiroKit.getUser().getRoleType();
+        model.addAttribute("roleType",roleType);
+        model.addAttribute("objectName",tCompanyService.selectById(ShiroKit.getUser().getObjectId()).getName());
+
+        if (1 == roleType){
+            List<TCompany> companyList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 2));
+            model.addAttribute("companyList",companyList);
+            List<TCompany> franchiseeList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 3).eq("superiorId",tCar.getCompanyId()));
+            model.addAttribute("franchiseeList",franchiseeList);
+        }else if (2 == roleType){
+            List<TCompany> franchiseeList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 3).eq("superiorId",ShiroKit.getUser().getObjectId()));
+            model.addAttribute("franchiseeList",franchiseeList);
+        }
+
+        //查询平台ID
+        TCompany company = tCompanyService.selectOne(new EntityWrapper<TCompany>().eq("type", 1));
+        //判断是平台司机还是加盟司机
+        if ((SinataUtil.isEmpty(tCar.getCompanyId()) || tCar.getCompanyId() == 0 || tCar.getCompanyId() == company.getId()) && (SinataUtil.isEmpty(tCar.getFranchiseeId()) || tCar.getFranchiseeId() == 0)){
+            model.addAttribute("companyType",1);
+        }else{
+            model.addAttribute("companyType",2);
+        }
+
+        //获取经营业务
+        List<TCarService> serviceList = tCarServiceService.selectList(new EntityWrapper<TCarService>().eq("carId", tCar.getId()));
+        Integer one = 1;
+        Integer two = 1;
+        Integer three = 1;
+        Integer four = 1;
+        Integer five = 1;
+        Integer six = 1;
+        Integer zcModel = 0;
+        Integer kcModel = 0;
+        for (TCarService obj : serviceList){
+            if (obj.getType() == 1){
+                one = 2;
+                zcModel = obj.getServerCarModelId();
+            }
+            if (obj.getType() == 2){
+                two = 2;
+            }
+            if (obj.getType() == 3){
+                three = 2;
+                kcModel = obj.getServerCarModelId();
+            }
+            if (obj.getType() == 4){
+                four = 2;
+            }
+            if (obj.getType() == 5){
+                five = 2;
+            }
+            if (obj.getType() == 6){
+                six = 2;
+            }
+        }
+        model.addAttribute("one",one);
+        model.addAttribute("two",two);
+        model.addAttribute("three",three);
+        model.addAttribute("four",four);
+        model.addAttribute("five",five);
+        model.addAttribute("six",six);
+        model.addAttribute("zcModel",zcModel);
+        model.addAttribute("kcModel",kcModel);
+
+        List<TServerCarmodel> zcModelList = itServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 1).eq("state", 1));
+        model.addAttribute("zcModelList",zcModelList);
+        List<TServerCarmodel> kcModelList = itServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 2).eq("state", 1));
+        model.addAttribute("kcModelList",kcModelList);
+
+        //车辆品牌
+        List<TCarBrand> brandList = tCarBrandService.selectList(new EntityWrapper<TCarBrand>().eq("state", 1));
+        model.addAttribute("brandList",brandList);
+        //车辆类型
+        List<TCarModel> modelList = tCarModelService.selectList(new EntityWrapper<TCarModel>().eq("brandId",tCar.getCarBrandId()).eq("state", 1));
+        model.addAttribute("modelList",modelList);
+        return PREFIX + "tCar_edit.html";
+    }
+
+
+    /**
+     * 跳转到保险列表页
+     * @param carId
+     * @param model
+     * @return
+     */
+    @RequestMapping("/carInsurance")
+    public String carInsurance(Integer carId, Model model){
+        model.addAttribute("carId", carId);
+        return PREFIX + "carInsurance.html";
+    }
+
+    /**
+     * 跳转到添加页面
+     * @param carId
+     * @param model
+     * @return
+     */
+    @RequestMapping("/showAddCarInsurance")
+    public String showAddCarInsurance(Integer carId, Model model){
+        model.addAttribute("carId", carId);
+        model.addAttribute("id", "");
+        return PREFIX + "carInsuranceInfo.html";
+    }
+
+    /**
+     * 跳转到编辑页
+     * @param id
+     * @param carId
+     * @param model
+     * @return
+     */
+    @RequestMapping("/showEditCarInsurance")
+    public String showEditCarInsurance(Integer id, Integer carId, Model model){
+        model.addAttribute("carId", carId);
+        model.addAttribute("id", id);
+        return PREFIX + "carInsuranceInfo.html";
+    }
+
+    /**
+     * 添加保险数据
+     * @param carInsurance
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/saveCarInsurance", method = RequestMethod.POST)
+    public ResultUtil saveCarInsurance(CarInsurance carInsurance){
+        if(carInsurance.getId() == null){
+            carInsuranceMapper.insert(carInsurance);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){//上传数据
+                        pushMinistryOfTransportUtil.baseInfoVehicleInsurance(carInsurance.getId(), 1);
+                    }
+                }
+            }).start();
+        }else{
+            carInsuranceMapper.updateById(carInsurance);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){//上传数据
+                        pushMinistryOfTransportUtil.baseInfoVehicleInsurance(carInsurance.getId(), 2);
+                    }
+                }
+            }).start();
+        }
+
+        return ResultUtil.success();
+    }
+
+    /**
+     * 获取保险详情
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryCarInsurance", method = RequestMethod.POST)
+    public ResultUtil queryCarInsurance(Integer id){
+        CarInsurance carInsurance = carInsuranceMapper.selectById(id);
+        return ResultUtil.success(carInsurance);
+    }
+
+
+    /**
+     * 获取保险列表
+     * @param carId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryInsuranceList", method = RequestMethod.POST)
+    public Object queryInsuranceList(Integer carId, Integer offset,Integer limit){
+        try {
+            Map<String, Object> map = new HashMap<>();
+            List<Map<String, Object>> list = carInsuranceMapper.queryInsuranceList(carId, offset, limit);
+            int i = carInsuranceMapper.queryInsuranceListCount(carId);
+            map.put("rows", list);
+            map.put("total", i);
+            return map;
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 删除保险
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/delCarInsurance", method = RequestMethod.POST)
+    public ResultUtil delCarInsurance(Integer id){
+        carInsuranceMapper.deleteById(id);
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport){//上传数据
+                    pushMinistryOfTransportUtil.baseInfoVehicleInsurance(id, 3);
+                }
+            }
+        }).start();
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取车辆管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime,
+                       String id,
+                       String brandName,
+                       String modelName,
+                       String carColor,
+                       String serverStr,
+                       String carLicensePlate,
+                       String driverName,
+                       String companyName,
+                       String franchiseeName) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tCarService.getCarList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),beginTime,endTime,id,brandName,modelName,carColor,serverStr,carLicensePlate,driverName,companyName,franchiseeName));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增车辆管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TCar tCar,@RequestParam String serverBox,Integer roleType,Integer companyType,Integer oneId,Integer twoId,Integer franchiseeId,String zcModel,String kcModel) {
+        if (1 == roleType){  //平台
+            if (2 == companyType.intValue()){
+                if (SinataUtil.isNotEmpty(oneId)){
+                    tCar.setCompanyId(oneId);
+                }
+                if (SinataUtil.isNotEmpty(twoId)){
+                    tCar.setFranchiseeId(twoId);
+                }
+            }else if (1 == companyType.intValue()){
+                TCompany company = tCompanyService.selectOne(new EntityWrapper<TCompany>().eq("type", 1));
+                tCar.setCompanyId(company.getId());
+                tCar.setFranchiseeId(0);
+            }
+            tCar.setAddType(2);
+            tCar.setIsPlatCar(1);
+        }else if (2 == roleType){  //分公司
+            if (SinataUtil.isNotEmpty(ShiroKit.getUser().getObjectId())){
+                tCar.setCompanyId(ShiroKit.getUser().getObjectId());
+            }
+            if (SinataUtil.isNotEmpty(franchiseeId)){
+                tCar.setFranchiseeId(franchiseeId);
+            }
+            tCar.setIsPlatCar(2);
+            tCar.setAddType(3);
+            tCar.setAddObjectId(ShiroKit.getUser().getObjectId());
+        }else if (3 == roleType){  //加盟商
+            TCompany tCompany = tCompanyService.selectById(ShiroKit.getUser().getObjectId());
+            if (SinataUtil.isNotEmpty(tCompany)){
+                tCar.setCompanyId(tCompany.getSuperiorId());
+            }
+            if (SinataUtil.isNotEmpty(ShiroKit.getUser().getObjectId())){
+                tCar.setFranchiseeId(ShiroKit.getUser().getObjectId());
+            }
+            tCar.setIsPlatCar(2);
+            tCar.setAddType(4);
+            tCar.setAddObjectId(ShiroKit.getUser().getObjectId());
+        }
+        tCar.setInsertTime(new Date());
+        tCar.setState(1);
+        tCarService.insert(tCar);
+
+        //添加经营业务
+        String[] serverArray = serverBox.split(",");
+        for (int i=0;i<serverArray.length;i++){
+            TCarService service = new TCarService();
+            service.setCarId(tCar.getId());
+            service.setType(Integer.valueOf(serverArray[i]));
+            if (1 == service.getType()){
+                service.setServerCarModelId(Integer.valueOf(zcModel));
+            }else if (3 == service.getType()){
+                service.setServerCarModelId(Integer.valueOf(kcModel));
+            }
+            tCarServiceService.insert(service);
+        }
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport){//上传数据
+                    pushMinistryOfTransportUtil.baseInfoCompanyStat();
+                    pushMinistryOfTransportUtil.baseInfoVehicle(tCar.getId());
+                }
+            }
+        }).start();
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除车辆管理
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tCarId) {
+        TCar tCar = tCarService.selectById(tCarId);
+        tCar.setState(2);
+        tCarService.updateById(tCar);
+
+        //清除相对应的司机关联车辆ID
+        List<TDriver> list = tDriverService.selectList(new EntityWrapper<TDriver>().eq("carId", tCarId));
+        for (TDriver obj : list){
+            obj.setCarId(null);
+            tDriverService.updateById(obj);
+        }
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport){//上传数据
+                    pushMinistryOfTransportUtil.baseInfoCompanyStat();
+                    pushMinistryOfTransportUtil.baseInfoVehicle(tCar.getId());
+                }
+            }
+        }).start();
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改车辆管理
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TCar tCar,@RequestParam String serverBox,Integer roleType,Integer companyType,Integer oneId,Integer twoId,Integer franchiseeId,String zcModel,String kcModel) {
+        if (1 == roleType){  //平台
+            if (2 == companyType.intValue()){
+                if (SinataUtil.isNotEmpty(oneId)){
+                    tCar.setCompanyId(oneId);
+                }
+                if (SinataUtil.isNotEmpty(twoId)){
+                    tCar.setFranchiseeId(twoId);
+                }
+            }else if (1 == companyType.intValue()){
+                TCompany company = tCompanyService.selectOne(new EntityWrapper<TCompany>().eq("type", 1));
+                tCar.setCompanyId(company.getId());
+                tCar.setFranchiseeId(0);
+            }
+        }else if (2 == roleType){  //分公司
+            if (SinataUtil.isNotEmpty(ShiroKit.getUser().getObjectId())){
+                tCar.setCompanyId(ShiroKit.getUser().getObjectId());
+            }
+            if (SinataUtil.isNotEmpty(franchiseeId)){
+                tCar.setFranchiseeId(franchiseeId);
+            }
+        }else if (3 == roleType){  //加盟商
+            TCompany tCompany = tCompanyService.selectById(ShiroKit.getUser().getObjectId());
+            if (SinataUtil.isNotEmpty(tCompany)){
+                tCar.setCompanyId(tCompany.getSuperiorId());
+            }
+            if (SinataUtil.isNotEmpty(ShiroKit.getUser().getObjectId())){
+                tCar.setFranchiseeId(ShiroKit.getUser().getObjectId());
+            }
+        }
+
+        //删除业务
+        tCarServiceService.delete(new EntityWrapper<TCarService>().eq("carId",tCar.getId()));
+
+        //添加经营业务
+        String[] serverArray = serverBox.split(",");
+        for (int i=0;i<serverArray.length;i++){
+            TCarService service = new TCarService();
+            service.setCarId(tCar.getId());
+            service.setType(Integer.valueOf(serverArray[i]));
+            if (1 == service.getType()){
+                service.setServerCarModelId(Integer.valueOf(zcModel));
+            }else if (3 == service.getType()){
+                service.setServerCarModelId(Integer.valueOf(kcModel));
+            }
+            tCarServiceService.insert(service);
+        }
+
+        tCarService.updateById(tCar);
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport){
+                    pushMinistryOfTransportUtil.baseInfoVehicle(tCar.getId());
+                }
+            }
+        }).start();
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 车辆管理详情
+     */
+    @RequestMapping(value = "/detail/{tCarId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tCarId") Integer tCarId) {
+        return tCarService.selectById(tCarId);
+    }
+
+    /**
+     * 下载模板
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/uploadCarModel")
+    public void uploadCarModel(HttpServletRequest request, HttpServletResponse response) {
+        // 表格数据【封装】
+        List<List<String>> dataList = new ArrayList<List<String>>();
+
+        // 首行【封装】
+        List<String> shellList = new ArrayList<String>();
+        shellList.add("所属机构[平台车辆/加盟车辆]");
+        shellList.add("所属分公司[提示:加盟车辆选填]");
+        shellList.add("所属加盟商[提示:加盟车辆选填]");
+        shellList.add("服务模式:专车[是/否]");
+        shellList.add("服务模式:出租车[是/否]");
+        shellList.add("服务模式:跨城出行[是/否]");
+        shellList.add("服务模式:小件同城物流[是/否]");
+        shellList.add("服务模式:小件跨城物流[是/否]");
+        shellList.add("服务模式:包车[是/否]");
+        shellList.add("车辆品牌");
+        shellList.add("车辆类型");
+        shellList.add("车辆颜色[黑色/银色/白色/红色/黄色/橙色/蓝色]");
+        shellList.add("车牌号");
+        shellList.add("行驶证编号");
+        shellList.add("年检到期时间[例如 2020-02-02]");
+        shellList.add("商业保险到期时间[例如 2020-02-02]");
+        dataList.add(shellList);
+
+        try {
+            // 调用工具类进行导出
+            ExcelExportUtil.easySheet("平台导入车辆模板"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "平台导入车辆模板", dataList, request, response);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 导入操作
+     * @param request
+     * @return
+     */
+    @RequestMapping(value="/exportCar",method = RequestMethod.POST)
+    @ResponseBody
+    public Object exportCar(HttpServletRequest request){
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        MultipartFile file = (MultipartFile) multipartRequest.getFile("myfile");
+        try {
+            //定时五秒后执行
+            /*Map<String,Object> maps=new HashMap<>();
+            Workbook book = WoUtil.ImportFile(file);
+            maps.put("book",book);
+            QuartzManager.addJob(AddContract.class, (AddContract.name+new Date().getTime()).toUpperCase(), TimeJobType.ADMIN,DateUtil.getDate_strYMdHms(new Date().getTime() + 1*1000) , maps);*/
+
+            Workbook book = WoUtil.ImportFile(file);
+            Sheet sh = book.getSheetAt(0);   //获取到第一个表
+            for (int i = 1; i <= sh.getLastRowNum(); i++) {
+                Row row = sh.getRow(i);
+
+                Cell cell0 = row.getCell(0);  //所属机构[平台车辆/加盟车辆]
+                String zero = null;
+                if (SinataUtil.isNotEmpty(cell0)){
+                    zero = String.valueOf(cell0.getStringCellValue()).trim();
+                }
+
+                Cell cell1 = row.getCell(1);  //所属分公司[提示:加盟车辆选填]
+                String one = null;
+                if (SinataUtil.isNotEmpty(cell1)){
+                    one = String.valueOf(cell1.getStringCellValue()).trim();
+                }
+
+                Cell cell2 = row.getCell(2);  //所属加盟商[提示:加盟车辆选填]
+                String two = null;
+                if (SinataUtil.isNotEmpty(cell2)){
+                    two = String.valueOf(cell2.getStringCellValue()).trim();
+                }
+
+                Cell cell3 = row.getCell(3);  //服务模式:专车[是/否]
+                String three = null;
+                if (SinataUtil.isNotEmpty(cell3)){
+                    three = String.valueOf(cell3.getStringCellValue()).trim();
+                }
+
+                Cell cell4 = row.getCell(4);  //服务模式:出租车[是/否]
+                String four = null;
+                if (SinataUtil.isNotEmpty(cell4)){
+                    four = String.valueOf(cell4.getStringCellValue()).trim();
+                }
+
+                Cell cell5 = row.getCell(5);  //服务模式:跨城出行[是/否]
+                String five = null;
+                if (SinataUtil.isNotEmpty(cell5)){
+                    five = String.valueOf(cell5.getStringCellValue()).trim();
+                }
+
+                Cell cell6 = row.getCell(6);  //服务模式:小件跨城物流[是/否]
+                String six = null;
+                if (SinataUtil.isNotEmpty(cell6)){
+                    six = String.valueOf(cell6.getStringCellValue()).trim();
+                }
+
+                Cell cell7 = row.getCell(7);  //服务模式:小件跨城物流[是/否]
+                String seven = null;
+                if (SinataUtil.isNotEmpty(cell7)){
+                    seven = String.valueOf(cell7.getStringCellValue()).trim();
+                }
+
+                Cell cell8 = row.getCell(8);  //服务模式:包车[是/否]
+                String eight = null;
+                if (SinataUtil.isNotEmpty(cell8)){
+                    eight = String.valueOf(cell8.getStringCellValue()).trim();
+                }
+
+                Cell cell9 = row.getCell(9);  //车辆品牌
+                String nine = null;
+                if (SinataUtil.isNotEmpty(cell9)){
+                    nine = String.valueOf(cell9.getStringCellValue()).trim();
+                }
+
+                Cell cell10 = row.getCell(10);  //车辆类型
+                String ten = null;
+                if (SinataUtil.isNotEmpty(cell10)){
+                    ten = String.valueOf(cell10.getStringCellValue()).trim();
+                }
+
+                Cell cell11 = row.getCell(11);  //车辆颜色[黑色/银色/白色/红色/黄色/橙色/蓝色]
+                String eleven = null;
+                if (SinataUtil.isNotEmpty(cell11)){
+                    eleven = String.valueOf(cell11.getStringCellValue()).trim();
+                }
+
+                Cell cell12 = row.getCell(12);  //车牌号
+                String twelve = null;
+                if (SinataUtil.isNotEmpty(cell12)){
+                    twelve = String.valueOf(cell12.getStringCellValue()).trim();
+                }
+
+                Cell cell13 = row.getCell(13);  //行驶证编号
+                String thirteen = null;
+                if (SinataUtil.isNotEmpty(cell13)){
+                    thirteen = String.valueOf(cell13.getStringCellValue()).trim();
+                }
+
+                Cell cell14 = row.getCell(14);  //年检到期时间
+                String fourteen = null;
+                if (SinataUtil.isNotEmpty(cell14)){
+                    fourteen = String.valueOf(cell14.getStringCellValue()).trim();
+                }
+
+                Cell cell15 = row.getCell(15);  //商业保险到期时间
+                String fifteen = null;
+                if (SinataUtil.isNotEmpty(cell15)){
+                    fifteen = String.valueOf(cell15.getStringCellValue()).trim();
+                }
+
+                if (SinataUtil.isEmpty(zero) || SinataUtil.isEmpty(three) || SinataUtil.isEmpty(four)
+                        || SinataUtil.isEmpty(five) || SinataUtil.isEmpty(six) || SinataUtil.isEmpty(seven)
+                        || SinataUtil.isEmpty(eight) || SinataUtil.isEmpty(nine) || SinataUtil.isEmpty(ten)
+                        || SinataUtil.isEmpty(eleven) || SinataUtil.isEmpty(twelve) || SinataUtil.isEmpty(thirteen)
+                        || SinataUtil.isEmpty(fourteen) || SinataUtil.isEmpty(fifteen)){
+                    return new ErrorTip(500, "单元格不能为空");
+                }else{
+                    //判断所属机构
+                    if (!zero.equals("平台车辆") && !zero.equals("加盟车辆")){
+                        return new ErrorTip(500, "所属机构内容不正确");
+                    }
+                    //判断服务模式【专车】
+                    if (!three.equals("是") && !three.equals("否")){
+                        return new ErrorTip(500, "服务模式【专车】内容不正确");
+                    }
+                    //判断服务模式【出租车】
+                    if (!four.equals("是") && !four.equals("否")){
+                        return new ErrorTip(500, "服务模式【出租车】内容不正确");
+                    }
+                    //判断服务模式【跨城出行】
+                    if (!five.equals("是") && !five.equals("否")){
+                        return new ErrorTip(500, "服务模式【跨城出行】内容不正确");
+                    }
+                    //判断服务模式【小件同城物流】
+                    if (!six.equals("是") && !six.equals("否")){
+                        return new ErrorTip(500, "服务模式【小件同城物流】内容不正确");
+                    }
+                    //判断服务模式【小件跨城物流】
+                    if (!seven.equals("是") && !seven.equals("否")){
+                        return new ErrorTip(500, "服务模式【小件跨城物流】内容不正确");
+                    }
+                    //判断服务模式【包车】
+                    if (!eight.equals("是") && !eight.equals("否")){
+                        return new ErrorTip(500, "服务模式【包车】内容不正确");
+                    }
+                    //判断车辆颜色
+                    if (!eleven.equals("黑色") && !eleven.equals("银色") && !eleven.equals("白色") && !eleven.equals("红色") && !eleven.equals("黄色") && !eleven.equals("橙色") && !eleven.equals("蓝色")){
+                        return new ErrorTip(500, "车辆颜色内容不正确");
+                    }
+                    //判断年检到期时间格式是否正确
+                    try {
+                        if (!isValidDate(fourteen)) {
+                            fourteen = importByExcelForDate(fourteen);
+                        }
+                    }catch (Exception e){
+                        return new ErrorTip(500, "年检到期时间格式不正确");
+                    }
+                    //判断商业保险到期时间格式是否正确
+                    try {
+                        if (!isValidDate(fifteen)) {
+                            fifteen = importByExcelForDate(fifteen);
+                        }
+                    }catch (Exception e){
+                        return new ErrorTip(500, "商业保险到期时间格式不正确");
+                    }
+
+                    //查找平台公司
+                    TCompany platCompany = itCompanyService.selectOne(new EntityWrapper<TCompany>().eq("type", 1).notIn("flag", "3").last(" limit 1"));
+                    Integer companyId = platCompany.getId();
+                    Integer franchiseeId = 0;
+                    if ("加盟车辆".equals(zero)){
+                        //判断所属分公司是否存在
+                        if (SinataUtil.isNotEmpty(one)){
+                            TCompany company = itCompanyService.selectOne(new EntityWrapper<TCompany>().eq("name", one).eq("type", 2).notIn("flag", "3").last(" limit 1"));
+                            if (SinataUtil.isNotEmpty(company)){
+                                companyId = company.getId();
+                                //判断加盟商是否存在
+                                if (SinataUtil.isNotEmpty(two)){
+                                    TCompany franchisee = itCompanyService.selectOne(new EntityWrapper<TCompany>().eq("superiorId",company.getId()).eq("name", two).eq("type", 3).notIn("flag", "3").last(" limit 1"));
+                                    if (SinataUtil.isNotEmpty(franchisee)){
+                                        franchiseeId = franchisee.getId();
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    Integer carBrandId = null;
+                    Integer carModelId = null;
+                    //查找品牌
+                    if (SinataUtil.isNotEmpty(nine)){
+                        TCarBrand carBrand = tCarBrandService.selectOne(new EntityWrapper<TCarBrand>().eq("name", nine).eq("state", 1).last(" limit 1"));
+                        if (SinataUtil.isNotEmpty(carBrand)){
+                            carBrandId = carBrand.getId();
+                            if (SinataUtil.isNotEmpty(ten)){
+                                //查找类型
+                                TCarModel carModel = tCarModelService.selectOne(new EntityWrapper<TCarModel>().eq("brandId", carBrand.getId()).eq("name", ten).eq("state", 1).last(" limit 1"));
+                                if (SinataUtil.isNotEmpty(carModel)){
+                                    carModelId = carModel.getId();
+                                }
+                            }
+                        }
+                    }
+
+                    //添加车辆对象
+                    TCar car = new TCar();
+                    if ("平台车辆".equals(zero)){
+                        car.setIsPlatCar(1);
+                    }else if ("加盟车辆".equals(zero)){
+                        car.setIsPlatCar(2);
+                    }
+                    car.setCompanyId(companyId);
+                    car.setFranchiseeId(franchiseeId);
+                    car.setCarColor(eleven);
+                    car.setCarBrandId(carBrandId);
+                    car.setCarModelId(carModelId);
+                    car.setCarLicensePlate(twelve);
+                    car.setDrivingLicenseNumber(thirteen);
+                    car.setAnnualInspectionTime(DateUtil.parseDate(fourteen));
+                    car.setCommercialInsuranceTime(DateUtil.parseDate(fifteen));
+                    car.setInsertTime(new Date());
+                    car.setState(1);
+                    if (ShiroKit.getUser().getRoleType() == 1){
+                        car.setAddType(2);
+                    }else if (ShiroKit.getUser().getRoleType() == 2){
+                        car.setAddType(3);
+                        car.setAddObjectId(ShiroKit.getUser().getObjectId());
+                    }else if (ShiroKit.getUser().getRoleType() == 3){
+                        car.setAddType(4);
+                        car.setAddObjectId(ShiroKit.getUser().getObjectId());
+                    }
+                    tCarService.insert(car);
+
+                    //添加专车服务模式
+                    if ("是".equals(three)){
+                        TCarService service = new TCarService();
+                        service.setCarId(car.getId());
+                        service.setType(1);
+                        tCarServiceService.insert(service);
+                    }
+                    //添加出租车服务模式
+                    if ("是".equals(four)){
+                        TCarService service = new TCarService();
+                        service.setCarId(car.getId());
+                        service.setType(2);
+                        tCarServiceService.insert(service);
+                    }
+                    //添加跨城出行服务模式
+                    if ("是".equals(five)){
+                        TCarService service = new TCarService();
+                        service.setCarId(car.getId());
+                        service.setType(3);
+                        tCarServiceService.insert(service);
+                    }
+                    //添加小件同城物流服务模式
+                    if ("是".equals(six)){
+                        TCarService service = new TCarService();
+                        service.setCarId(car.getId());
+                        service.setType(4);
+                        tCarServiceService.insert(service);
+                    }
+                    //添加小件跨城物流服务模式
+                    if ("是".equals(seven)){
+                        TCarService service = new TCarService();
+                        service.setCarId(car.getId());
+                        service.setType(5);
+                        tCarServiceService.insert(service);
+                    }
+                    //添加包车服务模式
+                    if ("是".equals(eight)){
+                        TCarService service = new TCarService();
+                        service.setCarId(car.getId());
+                        service.setType(6);
+                        tCarServiceService.insert(service);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 判断日期是否满足yyyy-MM-dd格式
+     * @param str
+     * @return
+     */
+    public static boolean isValidDate(String str) {
+        boolean convertSuccess=true;
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            format.setLenient(false);
+            format.parse(str);
+        } catch (Exception e) {
+            convertSuccess=false;
+        }
+        return convertSuccess;
+    }
+
+
+    /**
+     * 转换日期
+     * @return
+     */
+    public static String importByExcelForDate(String value) {//value就是它的天数
+        String currentCellValue = "";
+        if(value != null && !value.equals("")){
+            Calendar calendar = new GregorianCalendar(1900,0,-1);
+            Date d = calendar.getTime();
+            Date dd = DateUtils.addDays(d,Integer.valueOf(value));
+            DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
+            currentCellValue = formater.format(dd);
+        }
+        return currentCellValue;
+    }
+
+    /**
+     *  导出车辆信息
+     */
+    @RequestMapping(value = "/outCar")
+    public void outCar(HttpServletRequest request, HttpServletResponse response) {
+        List<Map<String,Object>> listMap = tCarService.getCarListNoPage(ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId());
+
+        // 表格数据【封装】
+        List<List<String>> dataList = new ArrayList<>();
+
+        //第一行显示【封装】
+        List<String> twoList = new ArrayList<String>();
+        twoList.add("总计:");
+        twoList.add(String.valueOf(listMap.size())+"条");
+        dataList.add(twoList);
+
+        // 列【封装】
+        List<String> shellList = new ArrayList<String>();
+        shellList.add("添加时间");
+        shellList.add("车辆ID");
+        shellList.add("所属分公司");
+        shellList.add("所属加盟商");
+        shellList.add("车辆品牌");
+        shellList.add("车辆类型");
+        shellList.add("颜色");
+        shellList.add("服务模式");
+        shellList.add("车牌号");
+        shellList.add("行驶证号码");
+        shellList.add("座位数");
+        shellList.add("关联司机");
+        shellList.add("年检到期时间");
+        shellList.add("商业保险到期时间");
+        dataList.add(shellList);
+
+        for (Map<String,Object> object : listMap){
+            // 详细数据列【封装】
+            shellList = new ArrayList<String>();
+            if(SinataUtil.isNotEmpty(object.get("insertTime"))){
+                shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("insertTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss"));
+            }else{
+                shellList.add("-");
+            }
+            shellList.add(String.valueOf(object.get("id")));
+            if(SinataUtil.isNotEmpty(object.get("companyName"))){
+                shellList.add(object.get("companyName").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("franchiseeName"))){
+                shellList.add(object.get("franchiseeName").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("brandName"))){
+                shellList.add(object.get("brandName").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("modelName"))){
+                shellList.add(object.get("modelName").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("carColor"))){
+                shellList.add(object.get("carColor").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("serverStr"))){
+                shellList.add(object.get("serverStr").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("carLicensePlate"))){
+                shellList.add(object.get("carLicensePlate").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("drivingLicenseNumber"))){
+                shellList.add(object.get("drivingLicenseNumber").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("seat"))){
+                shellList.add(object.get("seat").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("driverName"))){
+                shellList.add(object.get("driverName").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("annualInspectionTime"))){
+                shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("annualInspectionTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss"));
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("commercialInsuranceTime"))){
+                shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("commercialInsuranceTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss"));
+            }else{
+                shellList.add("-");
+            }
+            dataList.add(shellList);
+        }
+        try {
+            // 调用工具类进行导出
+            ExcelExportUtil.easySheet("车辆信息导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "车辆信息导出记录", dataList,request, response);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarModelController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarModelController.java
new file mode 100644
index 0000000..549c3f2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarModelController.java
@@ -0,0 +1,128 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TCarBrand;
+import com.stylefeng.guns.modular.system.service.ITCarBrandService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TCarModel;
+import com.stylefeng.guns.modular.system.service.ITCarModelService;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 车辆类型管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-05 14:31:28
+ */
+@Controller
+@RequestMapping("/tCarModel")
+public class TCarModelController extends BaseController {
+
+    private String PREFIX = "/system/tCarModel/";
+
+    @Autowired
+    private ITCarModelService tCarModelService;
+
+    @Autowired
+    private ITCarBrandService tCarBrandService;
+
+    /**
+     * 跳转到车辆类型管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tCarModel.html";
+    }
+
+    /**
+     * 跳转到添加车辆类型管理
+     */
+    @RequestMapping("/tCarModel_add")
+    public String tCarModelAdd(Model model) {
+        List<TCarBrand> brandList = tCarBrandService.selectList(new EntityWrapper<TCarBrand>().eq("state", 1).orderBy("insertTime", false));
+        model.addAttribute("brandList",brandList);
+        return PREFIX + "tCarModel_add.html";
+    }
+
+    /**
+     * 跳转到修改车辆类型管理
+     */
+    @RequestMapping("/tCarModel_update/{tCarModelId}")
+    public String tCarModelUpdate(@PathVariable Integer tCarModelId, Model model) {
+        TCarModel tCarModel = tCarModelService.selectById(tCarModelId);
+        model.addAttribute("item",tCarModel);
+        LogObjectHolder.me().set(tCarModel);
+
+        List<TCarBrand> brandList = tCarBrandService.selectList(new EntityWrapper<TCarBrand>().eq("state", 1).orderBy("insertTime", false));
+        model.addAttribute("brandList",brandList);
+        return PREFIX + "tCarModel_edit.html";
+    }
+
+    /**
+     * 获取车辆类型管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime,
+                       String name) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tCarModelService.getCarModelList(page,beginTime,endTime,name));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增车辆类型管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TCarModel tCarModel) {
+        tCarModel.setInsertTime(new Date());
+        tCarModel.setState(1);
+        tCarModelService.insert(tCarModel);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除车辆类型管理
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tCarModelId) {
+        TCarModel tCarModel = tCarModelService.selectById(tCarModelId);
+        tCarModel.setState(2);
+        tCarModelService.updateById(tCarModel);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改车辆类型管理
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TCarModel tCarModel) {
+        tCarModelService.updateById(tCarModel);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java
new file mode 100644
index 0000000..d1251e9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java
@@ -0,0 +1,476 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.ITCompanyCityService;
+import com.stylefeng.guns.modular.system.service.ITRegionService;
+import com.stylefeng.guns.modular.system.service.IUserService;
+import com.stylefeng.guns.modular.system.util.PushMinistryOfTransportUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.service.ITCompanyService;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 分公司管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-06 09:15:48
+ */
+@Controller
+@RequestMapping("/tCompany")
+public class TCompanyController extends BaseController {
+
+    private String PREFIX = "/system/tCompany/";
+
+    @Autowired
+    private ITCompanyService tCompanyService;
+
+    @Autowired
+    private ITRegionService tRegionService;
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private ITCompanyCityService tCompanyCityService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+    /**
+     * 跳转到修改平台信息
+     */
+    @RequestMapping("/admin_update")
+    public String tCompanyUpdate(Model model) {
+        TCompany tCompany = tCompanyService.selectOne(new EntityWrapper<TCompany>().eq("type",1).notIn("flag",3));
+        model.addAttribute("item",tCompany);
+        LogObjectHolder.me().set(tCompany);
+
+        //省
+        List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("provinceList",provinceList);
+
+        //系统用户对象
+        User user = userService.selectOne(new EntityWrapper<User>().eq("roleType", 1).eq("objectId", tCompany.getId()));
+        model.addAttribute("user",user);
+
+        //经营区域
+        List<Map<String, Object>> scopeList = tCompanyService.getCompanyScopeById(tCompany.getId());
+        model.addAttribute("scopeList",scopeList);
+        return PREFIX + "platformEdit.html";
+    }
+
+    /**
+     * 跳转到分公司管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tCompany.html";
+    }
+
+    /**
+     * 跳转到加盟商管理首页
+     */
+    @RequestMapping("/franchisee")
+    public String franchisee() {
+        return PREFIX + "franchisee.html";
+    }
+
+    /**
+     * 跳转到添加分公司管理
+     */
+    @RequestMapping("/tCompany_add")
+    public String tCompanyAdd(Model model) {
+        List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("provinceList",provinceList);
+        return PREFIX + "tCompany_add.html";
+    }
+
+    /**
+     * 跳转到添加加盟商司管理
+     */
+    @RequestMapping("/tCompany_addFranchisee")
+    public String tCompany_addFranchisee(Model model) {
+        Integer roleType = ShiroKit.getUser().getRoleType();
+        if (1 == roleType){
+            //查询分公司
+            List<TCompany> companyList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 2));
+            model.addAttribute("companyList",companyList);
+        }else if (2 == roleType){
+            TCompany tCompany = tCompanyService.selectById(ShiroKit.getUser().getObjectId());
+            model.addAttribute("company",tCompany);
+        }
+        model.addAttribute("roleType",roleType);
+        return PREFIX + "tCompany_addFranchisee.html";
+    }
+
+    /**
+     * 跳转到查看分公司详情
+     */
+    @RequestMapping("/tCompany_detail/{tCompanyId}")
+    public String tCompany_detail(@PathVariable Integer tCompanyId, Model model) {
+        TCompany tCompany = tCompanyService.selectById(tCompanyId);
+        model.addAttribute("item",tCompany);
+        LogObjectHolder.me().set(tCompany);
+
+        //省
+        List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("provinceList",provinceList);
+
+        //系统用户对象
+        User user = userService.selectOne(new EntityWrapper<User>().eq("roleType", 2).eq("objectId", tCompanyId));
+        model.addAttribute("user",user);
+
+        //经营区域
+        List<Map<String, Object>> scopeList = tCompanyService.getCompanyScopeById(tCompanyId);
+        model.addAttribute("scopeList",scopeList);
+
+        return PREFIX + "tCompany_detail.html";
+    }
+
+    /**
+     * 跳转到修改分公司管理
+     */
+    @RequestMapping("/tCompany_update/{tCompanyId}")
+    public String tCompanyUpdate(@PathVariable Integer tCompanyId, Model model) {
+        TCompany tCompany = tCompanyService.selectById(tCompanyId);
+        model.addAttribute("item",tCompany);
+        LogObjectHolder.me().set(tCompany);
+
+        //省
+        List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("provinceList",provinceList);
+
+        //系统用户对象
+        User user = userService.selectOne(new EntityWrapper<User>().eq("roleType", 2).eq("objectId", tCompanyId));
+        model.addAttribute("user",user);
+
+        //经营区域
+        List<Map<String, Object>> scopeList = tCompanyService.getCompanyScopeById(tCompanyId);
+        model.addAttribute("scopeList",scopeList);
+        return PREFIX + "tCompany_edit.html";
+    }
+
+    /**
+     * 跳转到查看加盟商
+     */
+    @RequestMapping("/tCompany_detailFranchisee/{tCompanyId}")
+    public String tCompany_detailFranchisee(@PathVariable Integer tCompanyId, Model model) {
+        TCompany tCompany = tCompanyService.selectById(tCompanyId);
+        model.addAttribute("item",tCompany);
+        LogObjectHolder.me().set(tCompany);
+
+        Integer roleType = ShiroKit.getUser().getRoleType();
+        model.addAttribute("roleType",roleType);
+
+        TCompany obj = tCompanyService.selectById(tCompany.getSuperiorId());
+        if (SinataUtil.isNotEmpty(obj)){
+            model.addAttribute("companyName",obj.getName());
+        }else {
+            model.addAttribute("companyName","平台");
+        }
+
+
+        //系统用户对象
+        User user = userService.selectOne(new EntityWrapper<User>().eq("roleType", 3).eq("objectId", tCompanyId));
+        model.addAttribute("user",user);
+        return PREFIX + "tCompany_detailFranchisee.html";
+    }
+
+    /**
+     * 跳转到修改分公司管理
+     */
+    @RequestMapping("/tCompany_updateFranchisee/{tCompanyId}")
+    public String tCompany_updateFranchisee(@PathVariable Integer tCompanyId, Model model) {
+        TCompany tCompany = tCompanyService.selectById(tCompanyId);
+        model.addAttribute("item",tCompany);
+        LogObjectHolder.me().set(tCompany);
+
+        Integer roleType = ShiroKit.getUser().getRoleType();
+        if (1 == roleType){
+            //查询分公司
+            List<TCompany> companyList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 2));
+            model.addAttribute("companyList",companyList);
+        }else if (2 == roleType){
+            TCompany obj = tCompanyService.selectById(ShiroKit.getUser().getObjectId());
+            model.addAttribute("company",obj);
+        }
+        model.addAttribute("roleType",roleType);
+
+        //系统用户对象
+        User user = userService.selectOne(new EntityWrapper<User>().eq("roleType", 3).eq("objectId", tCompanyId));
+        model.addAttribute("user",user);
+
+        return PREFIX + "tCompany_updateFranchisee.html";
+    }
+
+    @RequestMapping(value = "/change")
+    @ResponseBody
+    public Object change(@RequestParam Integer code) {
+        List<TRegion> list = new ArrayList<>();
+        if (SinataUtil.isNotEmpty(code)){
+            TRegion region = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", code));
+            list = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", region.getId()));
+        }
+        return list;
+    }
+
+    /**
+     * 获取分公司管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String name,
+                       String principalName,
+                       String principalPhone,
+                       String adminName,
+                       String adminPhone,
+                       String serviceStr,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tCompanyService.getCompanyList(page,beginTime,endTime,name,principalName,principalPhone,adminName,adminPhone,serviceStr,state));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 获取分公司管理列表
+     */
+    @RequestMapping(value = "/listFranchisee")
+    @ResponseBody
+    public Object listFranchisee(String insertTime,
+                       String name,
+                       String account,
+                       String principalName,
+                       String principalPhone,
+                       String serviceStr,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() == 3){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tCompanyService.getFranchiseeList(page,beginTime,endTime,name,account,principalName,principalPhone,serviceStr,state,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId()));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增分公司管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TCompany tCompany,@RequestParam String subArr,String account,String password) {
+        //判断账号是否已存在
+        int count = userService.selectCount(new EntityWrapper<User>().eq("account", account));
+        if (count > 0){
+            return "error";
+        }
+        tCompany.setType(2);  //2:分公司
+        tCompany.setState(0); //0:正常
+        tCompany.setInsertTime(new Date());
+        tCompanyService.insert(tCompany);
+
+        //添加User对象
+        User user = new User();
+        user.setAccount(account);
+        user.setSalt(ShiroKit.getRandomSalt(5));
+        user.setPassword(ShiroKit.md5(password, user.getSalt()));
+        user.setRoleid("2");
+        user.setDeptid(25);
+        user.setStatus(1);
+        user.setCreatetime(new Date());
+        user.setRoleType(2);
+        user.setObjectId(tCompany.getId());
+        user.setName(tCompany.getName());
+        user.setSex(1);
+        userService.insert(user);
+
+        //添加经营区域
+        addSocpe(subArr,tCompany.getId());
+        return SUCCESS_TIP;
+    }
+    //添加经营区域
+    public void addSocpe(String subArr,Integer id){
+        JSONArray jsonArray = JSON.parseArray(subArr);
+        tCompanyCityService.delete(new EntityWrapper<TCompanyCity>().eq("companyId", id));
+        int size = jsonArray.size();
+        for (int i = 0; i < size; i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            TCompanyCity tCompanyCity = tCompanyCityService.selectOne(new EntityWrapper<TCompanyCity>().eq("id", jsonObject.getInteger("recordId")).eq("companyId", id));
+            if (SinataUtil.isEmpty(tCompanyCity)){
+                tCompanyCity = new TCompanyCity();
+                tCompanyCity.setProvinceCode(jsonObject.getInteger("provinceCode"));
+                tCompanyCity.setCityCode(jsonObject.getInteger("cityCode"));
+                tCompanyCity.setAreaCode(jsonObject.getInteger("areaCode"));
+                tCompanyCity.setCompanyId(id);
+                tCompanyCity.setState(1);
+                tCompanyCityService.insert(tCompanyCity);
+            }else{
+                tCompanyCity.setProvinceCode(jsonObject.getInteger("provinceCode"));
+                tCompanyCity.setCityCode(jsonObject.getInteger("cityCode"));
+                tCompanyCity.setAreaCode(jsonObject.getInteger("areaCode"));
+                tCompanyCityService.updateById(tCompanyCity);
+            }
+        }
+    }
+
+    /**
+     * 新增加盟商管理
+     */
+    @RequestMapping(value = "/addFranchisee")
+    @ResponseBody
+    public Object addFranchisee(TCompany tCompany,String account,String password) {
+        //判断账号是否已存在
+        int count = userService.selectCount(new EntityWrapper<User>().eq("account", account));
+        if (count > 0){
+            return "error";
+        }
+        tCompany.setType(3);  //2:分公司
+        if (ShiroKit.getUser().getRoleType() == 2){
+            tCompany.setSuperiorId(ShiroKit.getUser().getObjectId());
+        }
+        tCompany.setState(0); //0:正常
+        tCompany.setInsertTime(new Date());
+        tCompanyService.insert(tCompany);
+
+        //添加User对象
+        User user = new User();
+        user.setAccount(account);
+        user.setSalt(ShiroKit.getRandomSalt(5));
+        user.setPassword(ShiroKit.md5(password, user.getSalt()));
+        user.setRoleid("3");
+        user.setDeptid(26);
+        user.setStatus(1);
+        user.setCreatetime(new Date());
+        user.setRoleType(3);
+        user.setObjectId(tCompany.getId());
+        user.setName(tCompany.getName());
+        user.setSex(1);
+        userService.insert(user);
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除分公司管理
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tCompanyId) {
+        TCompany tCompany = tCompanyService.selectById(tCompanyId);
+        tCompany.setFlag("3");
+        tCompanyService.updateById(tCompany);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改分公司管理
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TCompany tCompany,@RequestParam String subArr,String account,String password,Integer userId) {
+        //判断账号
+        User user = userService.selectById(userId);
+        if (SinataUtil.isNotEmpty(account) && SinataUtil.isNotEmpty(password)){
+            if (!user.getAccount().equals(account)){
+                //判断账号是否已存在
+                int count = userService.selectCount(new EntityWrapper<User>().eq("account", account));
+                if (count > 0){
+                    return "error";
+                }
+            }
+            //修改账号密码
+            user.setAccount(account);
+            user.setSalt(ShiroKit.getRandomSalt(5));
+            user.setPassword(ShiroKit.md5(password, user.getSalt()));
+        }
+        tCompanyService.updateById(tCompany);
+        user.setName(tCompany.getName());
+        userService.updateById(user);
+
+        //添加经营区域
+        addSocpe(subArr,tCompany.getId());
+
+        TCompany tCompany1 = tCompanyService.selectById(tCompany.getId());
+        if(tCompany1.getType() == 1){
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){//上传平台数据
+                        pushMinistryOfTransportUtil.baseInfoCompanyPay();//上传网约车平台公司支付信息
+                        pushMinistryOfTransportUtil.baseInfoCompany(tCompany.getId());
+                        pushMinistryOfTransportUtil.baseInfoCompanyService();
+                        pushMinistryOfTransportUtil.baseInfoCompanyPermit(tCompany.getId());
+                    }
+                }
+            }).start();
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改加盟商管理
+     */
+    @RequestMapping(value = "/updateFranchisee")
+    @ResponseBody
+    public Object updateFranchisee(TCompany tCompany,String account,String password,Integer userId) {
+        //判断账号
+        User user = userService.selectById(userId);
+        if (!user.getAccount().equals(account)){
+            //判断账号是否已存在
+            int count = userService.selectCount(new EntityWrapper<User>().eq("account", account));
+            if (count > 0){
+                return "error";
+            }
+        }
+        tCompanyService.updateById(tCompany);
+
+        //修改账号密码
+        user.setAccount(account);
+        user.setSalt(ShiroKit.getRandomSalt(5));
+        user.setPassword(ShiroKit.md5(password, user.getSalt()));
+        user.setName(tCompany.getName());
+        userService.updateById(user);
+
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TComplaintController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TComplaintController.java
new file mode 100644
index 0000000..b5589db
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TComplaintController.java
@@ -0,0 +1,186 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TProblem;
+import com.stylefeng.guns.modular.system.model.TSystemNotice;
+import com.stylefeng.guns.modular.system.service.ITSystemNoticeService;
+import com.stylefeng.guns.modular.system.util.PushMinistryOfTransportUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TComplaint;
+import com.stylefeng.guns.modular.system.service.ITComplaintService;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 投诉列表控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-09 17:31:24
+ */
+@Controller
+@RequestMapping("/tComplaint")
+public class TComplaintController extends BaseController {
+
+    private String PREFIX = "/system/tComplaint/";
+
+    @Autowired
+    private ITComplaintService tComplaintService;
+
+    @Autowired
+    private ITSystemNoticeService tSystemNoticeService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+
+
+    /**
+     * 跳转到投诉列表首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tComplaint.html";
+    }
+
+    /**
+     * 跳转到查看详情
+     */
+    @RequestMapping("/lookDetail/{id}/{type}")
+    public String lookDetail(@PathVariable Integer id, @PathVariable Integer type, Model model) {
+        TComplaint tComplaint = tComplaintService.selectById(id);
+        String str = "";
+        if (1 == type){
+            str = tComplaint.getReason();
+        }else if (2 == type){
+            str = tComplaint.getDescription();
+        }else if (3 == type){
+            str = tComplaint.getHandleResult();
+        }
+        model.addAttribute("str",str);
+        return "/system/tComplaint/lookDetail.html";
+    }
+
+    /**
+     * 跳转到立即处理页面
+     */
+    @RequestMapping("/tComplaint_immediately/{tComplaintId}")
+    public String tComplaintUpdate(@PathVariable Integer tComplaintId, Model model) {
+        model.addAttribute("tComplaintId",tComplaintId);
+        return PREFIX + "tComplaint_immediately.html";
+    }
+
+    /**
+     * 跳转到查看详情
+     */
+    @RequestMapping("/lookDetail/{str}")
+    public String lookDetail(@PathVariable String str, Model model) {
+        System.out.println(str);
+        model.addAttribute("str",str);
+        return PREFIX + "lookDetail.html";
+    }
+
+    /**
+     * 获取投诉列表列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String userName,
+                       String userPhone,
+                       String driverPhone,
+                       Integer isHandle) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tComplaintService.getComplaintList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),beginTime,endTime,userName,userPhone,driverPhone,isHandle));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 删除投诉列表
+     */
+    @RequestMapping(value = "/immediately")
+    @ResponseBody
+    public Object immediately(@RequestParam Integer id,@RequestParam String handleResult) {
+        TComplaint tComplaint = tComplaintService.selectById(id);
+        if(SinataUtil.isNotEmpty(tComplaint)){
+            tComplaint.setHandleResult(handleResult);
+            tComplaint.setHandleUserId(ShiroKit.getUser().getId());
+            tComplaint.setIsHandle(1);
+            tComplaint.setHandleTime(new Date());
+            tComplaintService.updateById(tComplaint);
+
+            //增加系统消息
+            TSystemNotice notice = new TSystemNotice();
+            notice.setType(2);
+            notice.setUserType(1);
+            notice.setContent("投诉处理结果:【"+handleResult+"】。");
+            notice.setUserId(tComplaint.getUserId());
+            notice.setInsertTime(new Date());
+            notice.setRead(1);
+            tSystemNoticeService.insert(notice);
+
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    if(pushMinistryOfTransport){//上传数据
+                        pushMinistryOfTransportUtil.ratedPassengerComplaint(tComplaint.getId());
+                    }
+                }
+            }).start();
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除投诉
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(Integer tComplaintId) {
+        tComplaintService.deleteById(tComplaintId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改投诉列表
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TComplaint tComplaint) {
+        tComplaintService.updateById(tComplaint);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 投诉列表详情
+     */
+    @RequestMapping(value = "/detail/{tComplaintId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tComplaintId") Integer tComplaintId) {
+        return tComplaintService.selectById(tComplaintId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java
new file mode 100644
index 0000000..55adaa4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java
@@ -0,0 +1,1904 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.*;
+import com.stylefeng.guns.modular.system.dao.DriverPunishMapper;
+import com.stylefeng.guns.modular.system.dao.DriverTrainMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
+import com.stylefeng.guns.modular.system.util.PushMinistryOfTransportUtil;
+import com.stylefeng.guns.modular.system.util.PushURL;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.apache.commons.lang.time.DateUtils;
+import org.apache.poi.hdf.extractor.TC;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.ui.Model;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 司机审核列表控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-04 17:35:28
+ */
+@Controller
+@RequestMapping("/tDriver")
+public class TDriverController extends BaseController {
+
+    private String PREFIX = "/system/tDriver/";
+
+    @Autowired
+    private ITDriverService tDriverService;
+
+    @Autowired
+    private ITCompanyService tCompanyService;
+
+    @Autowired
+    private ITDriverServiceService tDriverServiceService;
+
+    @Autowired
+    private ITDriverLineService tDriverLineService;
+
+    @Autowired
+    private ITLineService itLineService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Resource
+    private DriverTrainMapper driverTrainMapper;
+
+    @Resource
+    private DriverPunishMapper driverPunishMapper;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+
+
+    /**
+     * 跳转到司机审核列表首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tDriver.html";
+    }
+
+    /**
+     * 跳转到审核通过司机首页
+     */
+    @RequestMapping("/yesDriver")
+    public String yesDriver() {
+        return PREFIX + "yesDriver.html";
+    }
+
+    /**
+     * 跳转到添加司机
+     */
+    @RequestMapping("/tDriver_add")
+    public String tDriverAdd(Model model) {
+        List<TCompany> companyList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 2));
+        model.addAttribute("companyList",companyList);
+
+        Integer roleType = ShiroKit.getUser().getRoleType();
+        model.addAttribute("roleType",roleType);
+        if (2 == roleType){
+            List<TCompany> franchiseeList = tCompanyService.selectList(new EntityWrapper<TCompany>()
+                    .eq("type", 3)
+                    .eq("superiorId",ShiroKit.getUser().getObjectId())
+                    .notIn("state",1)
+                    .notIn("flag",3));
+            model.addAttribute("franchiseeList",franchiseeList);
+        }else{
+            model.addAttribute("franchiseeList",null);
+        }
+        //查询当前用户所属分公司/加盟商
+        model.addAttribute("objectName",tCompanyService.selectById(ShiroKit.getUser().getObjectId()).getName());
+
+        //查询线路列表
+        List<TLine> lineList = itLineService.selectList(new EntityWrapper<TLine>().eq("state", 1));
+        model.addAttribute("lineList",lineList);
+        return PREFIX + "tDriver_add.html";
+    }
+
+    /**
+     * 跳转到修改审核司机
+     */
+    @RequestMapping("/tDriver_immediately/{tDriverId}")
+    public String tDriver_immediately(@PathVariable Integer tDriverId, Model model) {
+        Map<String, Object> tDriver = tDriverService.getDriverById(tDriverId);
+        model.addAttribute("item",tDriver);
+        LogObjectHolder.me().set(tDriver);
+        return PREFIX + "tDriver_immediately.html";
+    }
+
+    /**
+     * 跳转到选择车辆页面
+     */
+    @RequestMapping("/tDriver_changeCar/{tDriverId}")
+    public String tDriver_changeCar(@PathVariable Integer tDriverId, Model model) {
+        model.addAttribute("tDriverId",tDriverId);
+        return PREFIX + "tDriver_changeCar.html";
+    }
+
+    /**
+     * 跳转到冻结/解冻司机页面
+     */
+    @RequestMapping("/tDriver_optDriver/{tDriverId}/{optType}")
+    public String tDriver_optDriver(@PathVariable Integer tDriverId,@PathVariable Integer optType, Model model) {
+        model.addAttribute("tDriverId",tDriverId);
+        model.addAttribute("optType",optType);
+        return PREFIX + "tDriver_optDriver.html";
+    }
+
+    /**
+     * 跳转到查看司机详情
+     */
+    @RequestMapping("/tDriver_look/{tDriverId}")
+    public String tDriver_look(@PathVariable Integer tDriverId, Model model) {
+        Map<String, Object> tDriver = tDriverService.getDriverById(tDriverId);
+        model.addAttribute("item",tDriver);
+        LogObjectHolder.me().set(tDriver);
+        return PREFIX + "tDriver_look.html";
+    }
+
+    /**
+     * 跳转到修改司机
+     */
+    @RequestMapping("/tDriver_update/{tDriverId}")
+    public String tDriverUpdate(@PathVariable Integer tDriverId, Model model) {
+        TDriver tDriver = tDriverService.selectById(tDriverId);
+        model.addAttribute("item",tDriver);
+        LogObjectHolder.me().set(tDriver);
+
+        Integer roleType = ShiroKit.getUser().getRoleType();
+        model.addAttribute("roleType",roleType);
+        model.addAttribute("objectName",tCompanyService.selectById(ShiroKit.getUser().getObjectId()).getName());
+
+        if (1 == roleType){
+            List<TCompany> companyList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 2));
+            model.addAttribute("companyList",companyList);
+            List<TCompany> franchiseeList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 3).eq("superiorId",tDriver.getCompanyId()));
+            model.addAttribute("franchiseeList",franchiseeList);
+        }else if (2 == roleType){
+            List<TCompany> franchiseeList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 3).eq("superiorId",ShiroKit.getUser().getObjectId()));
+            model.addAttribute("franchiseeList",franchiseeList);
+        }
+
+        //查询平台ID
+        TCompany company = tCompanyService.selectOne(new EntityWrapper<TCompany>().eq("type", 1));
+        //判断是平台司机还是加盟司机
+        if ((SinataUtil.isEmpty(tDriver.getCompanyId()) || tDriver.getCompanyId() == 0 || tDriver.getCompanyId() == company.getId()) && (SinataUtil.isEmpty(tDriver.getFranchiseeId()) || tDriver.getFranchiseeId() == 0)){
+            model.addAttribute("companyType",1);
+        }else{
+            model.addAttribute("companyType",2);
+        }
+
+        //获取经营业务
+        List<TDriverService> serviceList = tDriverServiceService.selectList(new EntityWrapper<TDriverService>().eq("driverId", tDriverId));
+        Integer one = 1;
+        Integer two = 1;
+        Integer three = 1;
+        Integer four = 1;
+        Integer five = 1;
+        Integer six = 1;
+        for (TDriverService obj : serviceList){
+            if (obj.getType() == 1){
+                one = 2;
+            }
+            if (obj.getType() == 2){
+                two = 2;
+            }
+            if (obj.getType() == 3){
+                three = 2;
+            }
+            if (obj.getType() == 4){
+                four = 2;
+            }
+            if (obj.getType() == 5){
+                five = 2;
+            }
+            if (obj.getType() == 6){
+                six = 2;
+            }
+        }
+        model.addAttribute("one",one);
+        model.addAttribute("two",two);
+        model.addAttribute("three",three);
+        model.addAttribute("four",four);
+        model.addAttribute("five",five);
+        model.addAttribute("six",six);
+
+        //查询线路列表
+        List<TLine> lineList = itLineService.selectList(new EntityWrapper<TLine>().eq("state", 1));
+        model.addAttribute("lineList",lineList);
+        //查询驾驶员已添加的线路列表
+        List<Map<String, Object>> driverLineList = tDriverLineService.getDriverLineListByDriverId(tDriverId);
+        model.addAttribute("driverLineList",driverLineList);
+        return PREFIX + "tDriver_edit.html";
+    }
+
+    /**
+     * 跳转到添加培训页
+     * @param id
+     * @param model
+     * @return
+     */
+    @RequestMapping("/showTraining")
+    public String showTraining(Integer id, Model model){
+        model.addAttribute("id", id);
+        return PREFIX + "training.html";
+    }
+
+
+    /**
+     * 保存培训数据
+     * @param train
+     * @param driverId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/saveTrain", method = RequestMethod.POST)
+    public ResultUtil saveTrain(String train, Integer driverId){
+        if(ToolUtil.isEmpty(train)){
+            return ResultUtil.error("请添加有效的培训记录");
+        }
+        String[] split = train.split(",");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            List<DriverTrain> update = new ArrayList<>();
+            List<DriverTrain> add = new ArrayList<>();
+            for(String s : split){
+                String[] s1 = s.split("_");
+                if(ToolUtil.isNotEmpty(s1[0])){//修改
+                    DriverTrain driverTrain = driverTrainMapper.selectById(s1[0]);
+                    driverTrain.setDriverId(driverId);
+                    driverTrain.setCourseName(s1[1]);
+                    driverTrain.setCourseDate(sdf.parse(s1[2]));
+                    driverTrain.setStartTime(s1[3]);
+                    driverTrain.setStopTime(s1[4]);
+                    driverTrain.setDuration(Integer.valueOf(s1[5]));
+                    update.add(driverTrain);
+                }else{//添加
+                    DriverTrain driverTrain = new DriverTrain();
+                    driverTrain.setDriverId(driverId);
+                    driverTrain.setCourseName(s1[1]);
+                    driverTrain.setCourseDate(sdf.parse(s1[2]));
+                    driverTrain.setStartTime(s1[3]);
+                    driverTrain.setStopTime(s1[4]);
+                    driverTrain.setDuration(Integer.valueOf(s1[5]));
+                    add.add(driverTrain);
+                }
+            }
+            List<DriverTrain> driverTrains = driverTrainMapper.queryAllTrain(driverId);
+            for(DriverTrain driverTrain : driverTrains){
+                boolean b = true;
+                for(String s : split){
+                    String[] s1 = s.split("_");
+                    if(ToolUtil.isNotEmpty(s1[0]) && driverTrain.getId() == Integer.valueOf(s1[0])){
+                        b = false;
+                        break;
+                    }
+                }
+                if(b){
+                    driverTrainMapper.deleteById(driverTrain.getId());
+                    new Thread(new Runnable() {
+                        @Override
+                        public void run() {
+                            if(pushMinistryOfTransport){//上传数据
+                                pushMinistryOfTransportUtil.baseInfoDriverEducate(driverTrain.getId(), 3);
+                            }
+                        }
+                    }).start();
+                }
+            }
+            if(update.size() > 0){
+                for(DriverTrain driverTrain : update){
+                    driverTrainMapper.updateById(driverTrain);
+                    new Thread(new Runnable() {
+                        @Override
+                        public void run() {
+                            if(pushMinistryOfTransport){//上传数据
+                                pushMinistryOfTransportUtil.baseInfoDriverEducate(driverTrain.getId(), 2);
+                            }
+                        }
+                    }).start();
+                }
+            }
+            if(add.size() > 0){
+                for(DriverTrain driverTrain : add){
+                    driverTrainMapper.insert(driverTrain);
+                    new Thread(new Runnable() {
+                        @Override
+                        public void run() {
+                            if(pushMinistryOfTransport){//上传数据
+                                pushMinistryOfTransportUtil.baseInfoDriverEducate(driverTrain.getId(), 1);
+                            }
+                        }
+                    }).start();
+                }
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+        return ResultUtil.success();
+    }
+
+    /**
+     * 获取司机的所有培训数据
+     * @param driverId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryAllTrain", method = RequestMethod.POST)
+    public ResultUtil queryAllTrain(Integer driverId){
+        List<DriverTrain> driverTrains = driverTrainMapper.queryAllTrain(driverId);
+        return ResultUtil.success(driverTrains);
+    }
+
+
+    /**
+     * 跳转到处罚页
+     * @param id
+     * @param model
+     * @return
+     */
+    @RequestMapping("/showPunish")
+    public String showPunish(Integer id, Model model){
+        model.addAttribute("id", id);
+        return PREFIX + "punish.html";
+    }
+
+
+    /**
+     * 保存处罚数据
+     * @param punish
+     * @param driverId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/savePunish", method = RequestMethod.POST)
+    public ResultUtil savePunish(String punish, Integer driverId){
+        if(ToolUtil.isEmpty(punish)){
+            return ResultUtil.error("请添加有效的培训记录");
+        }
+        String[] split = punish.split(",");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            List<DriverPunish> update = new ArrayList<>();
+            List<DriverPunish> add = new ArrayList<>();
+            for(String s : split){
+                String[] s1 = s.split("_");
+                if(ToolUtil.isNotEmpty(s1[0])){//修改
+                    DriverPunish driverPunish = driverPunishMapper.selectById(s1[0]);
+                    driverPunish.setDriverId(driverId);
+                    driverPunish.setPunishTime(sdf.parse(s1[1]));
+                    driverPunish.setPunishReason(s1[2]);
+                    driverPunish.setPunishReault(s1[3]);
+                    update.add(driverPunish);
+                }else{//添加
+                    DriverPunish driverPunish = new DriverPunish();
+                    driverPunish.setDriverId(driverId);
+                    driverPunish.setPunishTime(sdf.parse(s1[1]));
+                    driverPunish.setPunishReason(s1[2]);
+                    driverPunish.setPunishReault(s1[3]);
+                    add.add(driverPunish);
+                }
+            }
+            List<DriverPunish> driverPunishes = driverPunishMapper.queryAllPunish(driverId);
+            for(DriverPunish driverTrain : driverPunishes){
+                boolean b = true;
+                for(String s : split){
+                    String[] s1 = s.split("_");
+                    if(ToolUtil.isNotEmpty(s1[0]) && driverTrain.getId() == Integer.valueOf(s1[0])){
+                        b = false;
+                        break;
+                    }
+                }
+                if(b){
+                    driverTrainMapper.deleteById(driverTrain.getId());
+                }
+            }
+            if(update.size() > 0){
+                for(DriverPunish driverTrain : update){
+                    driverPunishMapper.updateById(driverTrain);
+                }
+            }
+            if(add.size() > 0){
+                for(DriverPunish driverTrain : add){
+                    driverPunishMapper.insert(driverTrain);
+                    new Thread(new Runnable() {
+                        @Override
+                        public void run() {
+                            if(pushMinistryOfTransport){//上传数据
+                                pushMinistryOfTransportUtil.ratedDriverPunish(driverTrain.getId());
+                            }
+                        }
+                    }).start();
+                }
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+        return ResultUtil.success();
+    }
+
+
+    /**
+     * 获取所有处罚数据
+     * @param driverId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/queryAllPunish", method = RequestMethod.POST)
+    public ResultUtil queryAllPunish(Integer driverId){
+        List<DriverPunish> driverPunishes = driverPunishMapper.queryAllPunish(driverId);
+        return ResultUtil.success(driverPunishes);
+    }
+
+
+    /**
+     * 根据分公司ID获取加盟商
+     * @param oneId
+     * @return
+     */
+    @RequestMapping(value = "/oneChange")
+    @ResponseBody
+    public Object oneChange(@RequestParam Integer oneId) {
+        List<TCompany> list = new ArrayList<>();
+        if (SinataUtil.isNotEmpty(oneId)){
+            list = tCompanyService.selectList(new EntityWrapper<TCompany>()
+                    .eq("type", 3)
+                    .eq("superiorId", oneId)
+                    .notIn("flag",3)
+                    .notIn("state",1));
+        }
+        return list;
+    }
+
+    /**
+     * 获取司机审核列表列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String companyName,
+                       String phone,
+                       String account,
+                       Integer addType,
+                       Integer authState) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tDriverService.getAuthDriverList(page,beginTime,endTime,companyName,phone,account,addType,authState));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 获取审核通过的司机列表
+     */
+    @RequestMapping(value = "/listYesDriver")
+    @ResponseBody
+    public Object listYesDriver(String insertTime,
+                       String companyName,
+                       String phone,
+                       String name,
+                       Integer addType,
+                       Integer authState) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tDriverService.getDriverList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),beginTime,endTime,companyName,phone,name,addType,authState));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 获取可被选择的车辆列表
+     */
+    @RequestMapping(value = "/selectCarList/{tDriverId}")
+    @ResponseBody
+    public Object selectCarList(@PathVariable Integer tDriverId,
+                                String carLicensePlate,
+                                String brandName,
+                                String modelName,
+                                String color,
+                                String serverStr) {
+        TDriver driver = tDriverService.selectById(tDriverId);
+        /*String useCarIdStr = null;
+        //查询已被使用的车辆ID
+        if (SinataUtil.isNotEmpty(driver.getCarId())){
+            useCarIdStr = tDriverService.getUseCarIdStr(driver.getCarId());
+        }else{
+            useCarIdStr = tDriverService.getUseCarIdStr(null);
+        }*/
+        //2020-08-21:新需求,已被绑定的车辆可以被继续绑定
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tDriverService.getCanSelectCarList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),null,carLicensePlate,brandName,modelName,color,serverStr));
+        return super.packForBT(page);
+
+    }
+
+    /**
+     * 审核操作  1=通过 2=不通过
+     */
+    @RequestMapping(value = "/authOpt")
+    @ResponseBody
+    public Object authOpt(Integer id,Integer authState) {
+        if (SinataUtil.isNotEmpty(id) && SinataUtil.isNotEmpty(authState)){
+            TDriver tDriver = tDriverService.selectById(id);
+            Integer type = 0;
+            if (1 == authState){
+                type = 5;
+                tDriver.setAuthState(2);
+
+                new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        if(pushMinistryOfTransport){//上传数据
+                            pushMinistryOfTransportUtil.baseInfoCompanyStat();
+                            pushMinistryOfTransportUtil.baseInfoDriver(id);
+                            pushMinistryOfTransportUtil.baseInfoDriverApp(id);
+                        }
+                    }
+                }).start();
+            }else{
+                type = 6;
+                tDriver.setAuthState(4);
+            }
+
+            Map<String,String> map = new HashMap<>();
+            map.put("uid", String.valueOf(tDriver.getId()));
+            map.put("type", String.valueOf(type));
+            String result = HttpRequestUtil.postRequest(PushURL.driver_auth_url, map);
+            System.out.println("司机注册审核发送短信 :【driverId="+tDriver.getId().toString()+"】,调用接口:"+result);
+
+            tDriverService.updateById(tDriver);
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 更换车辆操作
+     */
+    @RequestMapping(value = "/selectCarOpt")
+    @ResponseBody
+    public Object selectCarOpt(Integer tDriverId,Integer carId) {
+        if (SinataUtil.isNotEmpty(tDriverId) && SinataUtil.isNotEmpty(carId)){
+            TDriver tDriver = tDriverService.selectById(tDriverId);
+            tDriver.setCarId(carId);
+            tDriverService.updateById(tDriver);
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 新增司机审核列表
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TDriver tDriver,@RequestParam String serverBox,@RequestParam String lineStr,Integer roleType,Integer companyType,Integer oneId,Integer twoId,Integer franchiseeId) {
+        //判断登录账户是否重复
+        int count = tDriverService.selectCount(new EntityWrapper<TDriver>().eq("phone", tDriver.getPhone()).in("authState", "1,2,3").ne("flag", 3));
+        if (count > 0){
+            return "error";
+        }
+        if (1 == roleType){  //平台
+            if (2 == companyType.intValue()){
+                if (SinataUtil.isNotEmpty(oneId)){
+                    tDriver.setCompanyId(oneId);
+                }
+                if (SinataUtil.isNotEmpty(twoId)){
+                    tDriver.setFranchiseeId(twoId);
+                }
+            }else if (1 == companyType.intValue()){
+                TCompany company = tCompanyService.selectOne(new EntityWrapper<TCompany>().eq("type", 1));
+                tDriver.setCompanyId(company.getId());
+                tDriver.setFranchiseeId(franchiseeId);
+            }
+            tDriver.setAddType(2);
+            tDriver.setIsPlatCar(1);
+            tDriver.setAuthState(2);
+        }else if (2 == roleType){  //分公司
+            if (SinataUtil.isNotEmpty(ShiroKit.getUser().getObjectId())){
+                tDriver.setCompanyId(ShiroKit.getUser().getObjectId());
+            }
+            if (SinataUtil.isNotEmpty(franchiseeId)){
+                tDriver.setFranchiseeId(franchiseeId);
+            }
+            tDriver.setAddType(3);
+            tDriver.setIsPlatCar(2);
+            tDriver.setAuthState(1);
+            tDriver.setAddObjectId(ShiroKit.getUser().getObjectId());
+        }else if (3 == roleType){  //加盟商
+            TCompany tCompany = tCompanyService.selectById(ShiroKit.getUser().getObjectId());
+            if (SinataUtil.isNotEmpty(tCompany)){
+                tDriver.setCompanyId(tCompany.getSuperiorId());
+            }
+            if (SinataUtil.isNotEmpty(ShiroKit.getUser().getObjectId())){
+                tDriver.setFranchiseeId(ShiroKit.getUser().getObjectId());
+            }
+            tDriver.setAddType(4);
+            tDriver.setIsPlatCar(2);
+            tDriver.setAuthState(1);
+            tDriver.setAddObjectId(ShiroKit.getUser().getObjectId());
+        }
+        tDriver.setInsertTime(new Date());
+        tDriver.setInsertUser(ShiroKit.getUser().getId());
+//        tDriver.setPassword(MD5Util.encrypt(tDriver.getPassword()));
+
+        tDriver.setPassword(ShiroKit.md5(tDriver.getPassword(), "SA;d5#"));
+
+        tDriverService.insert(tDriver);
+
+        //添加经营业务
+        String[] serverArray = serverBox.split(",");
+        for (int i=0;i<serverArray.length;i++){
+            TDriverService service = new TDriverService();
+            service.setDriverId(tDriver.getId());
+            service.setType(Integer.valueOf(serverArray[i]));
+            tDriverServiceService.insert(service);
+
+            if (3 == Integer.valueOf(serverArray[i])){
+                //添加线路
+                if (SinataUtil.isNotEmpty(lineStr)){
+                    addLine(lineStr,tDriver.getId());
+                }
+            }
+        }
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 添加线路
+     * @param subArr
+     * @param id
+     */
+    public void addLine(String subArr,Integer id){
+        JSONArray jsonArray = JSON.parseArray(subArr);
+        int size = jsonArray.size();
+        for (int i = 0; i < size; i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            TDriverLine line = new TDriverLine();
+            line.setCreateTime(new Date());
+            line.setAddTime(jsonObject.getString("time"));
+            line.setLineId(jsonObject.getInteger("lineId"));
+            line.setDriverId(id);
+            tDriverLineService.insert(line);
+        }
+    }
+
+
+    /**
+     * 删除司机审核列表
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tDriverId) {
+        TDriver driver = tDriverService.selectById(tDriverId);
+        driver.setFlag("3");
+        tDriverService.updateById(driver);
+        return SUCCESS_TIP;
+    }
+    /**
+     * 操作司机状态
+     */
+    @RequestMapping(value = "/optDriver")
+    @ResponseBody
+    public Object optDriver(@RequestParam Integer driverId,@RequestParam String remark,@RequestParam Integer optType) {
+        if (SinataUtil.isNotEmpty(driverId) && SinataUtil.isNotEmpty(optType)){
+            TDriver tDriver = tDriverService.selectById(driverId);
+            if (1 == optType){  //解冻
+                tDriver.setAuthState(2);
+                new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        if(pushMinistryOfTransport){//上传数据
+                            pushMinistryOfTransportUtil.baseInfoCompanyStat();
+                            pushMinistryOfTransportUtil.baseInfoDriver(driverId);
+                        }
+                    }
+                }).start();
+            }else if (2 == optType){  //冻结
+                tDriver.setAuthState(3);
+                new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        if(pushMinistryOfTransport){//上传数据
+                            pushMinistryOfTransportUtil.baseInfoCompanyStat();
+                            pushMinistryOfTransportUtil.baseInfoDriver(driverId);
+                        }
+                    }
+                }).start();
+            }
+            tDriver.setRemark(remark);
+            tDriverService.updateById(tDriver);
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改司机审核列表
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TDriver tDriver,@RequestParam String serverBox,@RequestParam String lineStr,Integer roleType,Integer companyType,Integer oneId,Integer twoId,Integer franchiseeId) {
+        TDriver obj = tDriverService.selectById(tDriver.getId());
+        if (!obj.getPhone().equals(tDriver.getPhone())){
+            //判断登录账户是否重复
+            int count = tDriverService.selectCount(new EntityWrapper<TDriver>().eq("phone", tDriver.getPhone()).in("authState", "1,2,3"));
+            if (count > 0){
+                return "error";
+            }
+        }
+        if (1 == roleType){  //平台
+            if (2 == companyType.intValue()){
+                if (SinataUtil.isNotEmpty(oneId)){
+                    tDriver.setCompanyId(oneId);
+                }
+                if (SinataUtil.isNotEmpty(twoId)){
+                    tDriver.setFranchiseeId(twoId);
+                }
+            }else if (1 == companyType.intValue()){
+                TCompany company = tCompanyService.selectOne(new EntityWrapper<TCompany>().eq("type", 1));
+                tDriver.setCompanyId(company.getId());
+                tDriver.setFranchiseeId(franchiseeId);
+            }
+        }else if (2 == roleType){  //分公司
+            if (SinataUtil.isNotEmpty(ShiroKit.getUser().getObjectId())){
+                tDriver.setCompanyId(ShiroKit.getUser().getObjectId());
+            }
+            if (SinataUtil.isNotEmpty(franchiseeId)){
+                tDriver.setFranchiseeId(franchiseeId);
+            }
+        }else if (3 == roleType){  //加盟商
+            TCompany tCompany = tCompanyService.selectById(ShiroKit.getUser().getObjectId());
+            if (SinataUtil.isNotEmpty(tCompany)){
+                tDriver.setCompanyId(tCompany.getSuperiorId());
+            }
+            if (SinataUtil.isNotEmpty(ShiroKit.getUser().getObjectId())){
+                tDriver.setFranchiseeId(ShiroKit.getUser().getObjectId());
+            }
+        }
+        tDriver.setUpdateTime(new Date());
+        tDriver.setUpdateUser(ShiroKit.getUser().getId());
+//        tDriver.setPassword(MD5Util.encrypt(tDriver.getPassword()));
+        tDriver.setPassword(ShiroKit.md5(tDriver.getPassword(), "SA;d5#"));
+        tDriverService.updateById(tDriver);
+
+        //删除业务
+        tDriverServiceService.delete(new EntityWrapper<TDriverService>().eq("driverId",tDriver.getId()));
+
+        //删除线路
+        tDriverLineService.delete(new EntityWrapper<TDriverLine>().eq("driverId",tDriver.getId()));
+
+        //添加经营业务
+        String[] serverArray = serverBox.split(",");
+        for (int i=0;i<serverArray.length;i++){
+            TDriverService service = new TDriverService();
+            service.setDriverId(tDriver.getId());
+            service.setType(Integer.valueOf(serverArray[i]));
+            tDriverServiceService.insert(service);
+
+            if (3 == Integer.valueOf(serverArray[i])){
+                //添加线路
+                if (SinataUtil.isNotEmpty(lineStr)){
+                    addLine(lineStr,tDriver.getId());
+                }
+            }
+        }
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport){//上传数据
+                    pushMinistryOfTransportUtil.baseInfoDriver(tDriver.getId());
+                }
+            }
+        }).start();
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 下载模板
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/uploadDriverModel")
+    public void uploadDriverModel(HttpServletRequest request, HttpServletResponse response) {
+        // 表格数据【封装】
+        List<List<String>> dataList = new ArrayList<List<String>>();
+
+        String title = "";
+
+        // 首行【封装】
+        List<String> shellList = new ArrayList<String>();
+        if (ShiroKit.getUser().getRoleType() == 1){
+            title = "平台导入司机模板";
+
+            shellList.add("司机名称");
+            shellList.add("所属机构[平台司机/加盟司机]");
+            shellList.add("所属分公司[提示:加盟司机选填]");
+            shellList.add("所属加盟商[提示:加盟司机选填]");
+            shellList.add("性别[男/女]");
+            shellList.add("驾驶证号码");
+            shellList.add("驾龄");
+            shellList.add("身份证号");
+            shellList.add("居住地址");
+            shellList.add("出租车资格证号");
+            shellList.add("工号[选填]");
+            shellList.add("经营业务:专车[是/否]");
+            shellList.add("经营业务:出租车[是/否]");
+            shellList.add("经营业务:跨城出行[是/否]");
+            shellList.add("经营业务:小件同城物流[是/否]");
+            shellList.add("经营业务:小件跨城物流[是/否]");
+            shellList.add("经营业务:包车[是/否]");
+            shellList.add("登录账号[手机号]");
+            shellList.add("登录密码[密码长度为6-18]");
+        }else if (ShiroKit.getUser().getRoleType() == 2){
+            title = "分公司导入司机模板";
+
+            shellList.add("司机名称");
+            shellList.add("所属加盟商[选填]");
+            shellList.add("性别[男/女]");
+            shellList.add("驾驶证号码");
+            shellList.add("驾龄");
+            shellList.add("身份证号");
+            shellList.add("居住地址");
+            shellList.add("出租车资格证号");
+            shellList.add("工号[选填]");
+            shellList.add("经营业务:专车[是/否]");
+            shellList.add("经营业务:出租车[是/否]");
+            shellList.add("经营业务:跨城出行[是/否]");
+            shellList.add("经营业务:小件同城物流[是/否]");
+            shellList.add("经营业务:小件跨城物流[是/否]");
+            shellList.add("经营业务:包车[是/否]");
+            shellList.add("登录账号[手机号]");
+            shellList.add("登录密码[密码长度为6-18]");
+        }else if (ShiroKit.getUser().getRoleType() == 3){
+            title = "加盟商导入司机模板";
+
+            shellList.add("司机名称");
+            shellList.add("性别[男/女]");
+            shellList.add("驾驶证号码");
+            shellList.add("驾龄");
+            shellList.add("身份证号");
+            shellList.add("居住地址");
+            shellList.add("出租车资格证号");
+            shellList.add("工号[选填]");
+            shellList.add("经营业务:专车[是/否]");
+            shellList.add("经营业务:出租车[是/否]");
+            shellList.add("经营业务:跨城出行[是/否]");
+            shellList.add("经营业务:小件同城物流[是/否]");
+            shellList.add("经营业务:小件跨城物流[是/否]");
+            shellList.add("经营业务:包车[是/否]");
+            shellList.add("登录账号[手机号]");
+            shellList.add("登录密码[密码长度为6-18]");
+        }
+        dataList.add(shellList);
+
+        try {
+            // 调用工具类进行导出
+            ExcelExportUtil.easySheet(title+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), title, dataList, request, response);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 导入操作
+     * @param request
+     * @return
+     */
+    @RequestMapping(value="/exportDriver",method = RequestMethod.POST)
+    @ResponseBody
+    public Object exportDriver(HttpServletRequest request){
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        MultipartFile file = (MultipartFile) multipartRequest.getFile("myfile");
+        try {
+            if (ShiroKit.getUser().getRoleType() == 1){
+                Workbook book = WoUtil.ImportFile(file);
+                Sheet sh = book.getSheetAt(0);   //获取到第一个表
+                for (int i = 1; i <= sh.getLastRowNum(); i++) {
+                    Row row = sh.getRow(i);
+
+                    Cell cell0 = row.getCell(0);  //司机名称
+                    String zero = null;
+                    if (SinataUtil.isNotEmpty(cell0)){
+                        zero = String.valueOf(cell0.getStringCellValue()).trim();
+                    }
+
+                    Cell cell1 = row.getCell(1);  //所属机构[平台司机/加盟司机]
+                    String one = null;
+                    if (SinataUtil.isNotEmpty(cell1)){
+                        one = String.valueOf(cell1.getStringCellValue()).trim();
+                    }
+
+                    Cell cell2 = row.getCell(2);  //所属分公司[提示:加盟司机选填]
+                    String two = null;
+                    if (SinataUtil.isNotEmpty(cell2)){
+                        two = String.valueOf(cell2.getStringCellValue()).trim();
+                    }
+
+                    Cell cell3 = row.getCell(3);  //所属加盟商[提示:加盟司机选填]
+                    String three = null;
+                    if (SinataUtil.isNotEmpty(cell3)){
+                        three = String.valueOf(cell3.getStringCellValue()).trim();
+                    }
+
+                    Cell cell4 = row.getCell(4);  //性别[男/女]
+                    String four = null;
+                    if (SinataUtil.isNotEmpty(cell4)){
+                        four = String.valueOf(cell4.getStringCellValue()).trim();
+                    }
+
+                    Cell cell5 = row.getCell(5);  //驾驶证号码
+                    String five = null;
+                    if (SinataUtil.isNotEmpty(cell5)){
+                        five = String.valueOf(cell5.getStringCellValue()).trim();
+                    }
+
+                    Cell cell6 = row.getCell(6);  //驾龄
+                    String six = null;
+                    if (SinataUtil.isNotEmpty(cell6)){
+                        six = String.valueOf(cell6.getStringCellValue()).trim();
+                    }
+
+                    Cell cell7 = row.getCell(7);  //身份证号
+                    String seven = null;
+                    if (SinataUtil.isNotEmpty(cell7)){
+                        seven = String.valueOf(cell7.getStringCellValue()).trim();
+                    }
+
+                    Cell cell8 = row.getCell(8);  //居住地址
+                    String eight = null;
+                    if (SinataUtil.isNotEmpty(cell8)){
+                        eight = String.valueOf(cell8.getStringCellValue()).trim();
+                    }
+
+                    Cell cell9 = row.getCell(9);  //出租车资格证号
+                    String nine = null;
+                    if (SinataUtil.isNotEmpty(cell9)){
+                        nine = String.valueOf(cell9.getStringCellValue()).trim();
+                    }
+
+                    Cell cell10 = row.getCell(10);  //工号[选填]
+                    String ten = null;
+                    if (SinataUtil.isNotEmpty(cell10)){
+                        ten = String.valueOf(cell10.getStringCellValue()).trim();
+                    }
+
+                    Cell cell11 = row.getCell(11);  //经营业务:专车[是/否]
+                    String eleven = null;
+                    if (SinataUtil.isNotEmpty(cell11)){
+                        eleven = String.valueOf(cell11.getStringCellValue()).trim();
+                    }
+
+                    Cell cell12 = row.getCell(12);  //经营业务:专车[是/否]
+                    String twelve = null;
+                    if (SinataUtil.isNotEmpty(cell12)){
+                        twelve = String.valueOf(cell12.getStringCellValue()).trim();
+                    }
+
+                    Cell cell13 = row.getCell(13);  //经营业务:跨城出行[是/否]
+                    String thirteen = null;
+                    if (SinataUtil.isNotEmpty(cell13)){
+                        thirteen = String.valueOf(cell13.getStringCellValue()).trim();
+                    }
+
+                    Cell cell14 = row.getCell(14);  //经营业务:小件同城物流[是/否]
+                    String fourteen = null;
+                    if (SinataUtil.isNotEmpty(cell14)){
+                        fourteen = String.valueOf(cell14.getStringCellValue()).trim();
+                    }
+
+                    Cell cell15 = row.getCell(15);  //经营业务:小件跨城物流[是/否]
+                    String fifteen = null;
+                    if (SinataUtil.isNotEmpty(cell15)){
+                        fifteen = String.valueOf(cell15.getStringCellValue()).trim();
+                    }
+
+                    Cell cell16 = row.getCell(16);  //经营业务:包车[是/否]
+                    String sixteen = null;
+                    if (SinataUtil.isNotEmpty(cell16)){
+                        sixteen = String.valueOf(cell16.getStringCellValue()).trim();
+                    }
+
+                    Cell cell17 = row.getCell(17);  //登录账号[手机号]
+                    String seventeen = null;
+                    if (SinataUtil.isNotEmpty(cell17)){
+                        seventeen = String.valueOf(cell17.getStringCellValue()).trim();
+                    }
+
+                    Cell cell18 = row.getCell(18);  //登录密码[密码长度为6-18]
+                    String eighteen = null;
+                    if (SinataUtil.isNotEmpty(cell18)){
+                        eighteen = String.valueOf(cell18.getStringCellValue()).trim();
+                    }
+
+                    if (SinataUtil.isEmpty(zero) || SinataUtil.isEmpty(one) || SinataUtil.isEmpty(four)
+                            || SinataUtil.isEmpty(five) || SinataUtil.isEmpty(six) || SinataUtil.isEmpty(nine)
+                            || SinataUtil.isEmpty(eleven) || SinataUtil.isEmpty(twelve) || SinataUtil.isEmpty(thirteen)
+                            || SinataUtil.isEmpty(fourteen) || SinataUtil.isEmpty(fifteen) || SinataUtil.isEmpty(sixteen)
+                            || SinataUtil.isEmpty(seventeen)|| SinataUtil.isEmpty(eighteen)){
+                        return new ErrorTip(500, "单元格不能为空");
+                    }else{
+                        //判断账号是否存在
+                        int count = tDriverService.selectCount(new EntityWrapper<TDriver>().eq("phone", seventeen).in("authState", "1,2,3").ne("flag", 3));
+                        if (count > 0){
+                            continue;
+                        }
+
+                        //判断所属机构
+                        if (!one.equals("平台司机") && !one.equals("加盟司机")){
+                            return new ErrorTip(500, "所属机构内容不正确");
+                        }
+                        //判断性别
+                        if (!four.equals("男") && !four.equals("女")){
+                            return new ErrorTip(500, "性别内容不正确");
+                        }
+                        //判断经营业务【专车】
+                        if (!eleven.equals("是") && !eleven.equals("否")){
+                            return new ErrorTip(500, "经营业务【专车】内容不正确");
+                        }
+                        //判断经营业务【出租车】
+                        if (!twelve.equals("是") && !twelve.equals("否")){
+                            return new ErrorTip(500, "经营业务【出租车】内容不正确");
+                        }
+                        //判断经营业务【跨城出行】
+                        if (!thirteen.equals("是") && !thirteen.equals("否")){
+                            return new ErrorTip(500, "经营业务【跨城出行】内容不正确");
+                        }
+                        //判断经营业务【小件同城物流】
+                        if (!fourteen.equals("是") && !fourteen.equals("否")){
+                            return new ErrorTip(500, "经营业务【小件同城物流】内容不正确");
+                        }
+                        //判断经营业务【小件跨城物流】
+                        if (!fifteen.equals("是") && !fifteen.equals("否")){
+                            return new ErrorTip(500, "经营业务【小件跨城物流】内容不正确");
+                        }
+                        //判断经营业务【包车】
+                        if (!sixteen.equals("是") && !sixteen.equals("否")){
+                            return new ErrorTip(500, "经营业务【包车】内容不正确");
+                        }
+                        //判断驾龄
+                        if (!isInteger(six)){
+                            return new ErrorTip(500, "驾龄格式不正确");
+                        }
+                        //判断手机号
+                        if (!isPhone(seventeen)){
+                            return new ErrorTip(500, "登录账号[手机号]格式不正确");
+                        }
+                        //判断登录密码
+                        if (!isPassword(eighteen)){
+                            return new ErrorTip(500, "登录密码格式不正确");
+                        }
+
+                        //查找平台公司
+                        TCompany platCompany = itCompanyService.selectOne(new EntityWrapper<TCompany>().eq("type", 1).notIn("flag", "3").last(" limit 1"));
+                        Integer companyId = platCompany.getId();
+                        Integer franchiseeId = 0;
+                        if ("加盟司机".equals(one)){
+                            //判断所属分公司是否存在
+                            if (SinataUtil.isNotEmpty(two)){
+                                TCompany company = itCompanyService.selectOne(new EntityWrapper<TCompany>().eq("name", two).eq("type", 2).notIn("flag", "3").last(" limit 1"));
+                                if (SinataUtil.isNotEmpty(company)){
+                                    companyId = company.getId();
+                                    //判断加盟商是否存在
+                                    if (SinataUtil.isNotEmpty(three)){
+                                        TCompany franchisee = itCompanyService.selectOne(new EntityWrapper<TCompany>().eq("superiorId",company.getId()).eq("name", three).eq("type", 3).notIn("flag", "3").last(" limit 1"));
+                                        if (SinataUtil.isNotEmpty(franchisee)){
+                                            franchiseeId = franchisee.getId();
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                        TDriver driver = new TDriver();
+                        driver.setAccount(seventeen);
+                        driver.setJobNumber(ten);
+                        driver.setPhone(seventeen);
+                        driver.setPassword(ShiroKit.md5(eighteen, "SA;d5#"));
+                        driver.setName(zero);
+                        if ("男".equals(four)){
+                            driver.setSex(1);
+                        }else if ("女".equals(four)){
+                            driver.setSex(2);
+                        }
+                        driver.setIdCard(seven);
+                        driver.setDriverAge(Integer.valueOf(six));
+                        driver.setDriveCard(five);
+                        driver.setTaxiAptitudeCard(nine);
+                        if ("平台司机".equals(one)){
+                            driver.setIsPlatCar(1);
+                        }else if ("加盟司机".equals(one)){
+                            driver.setIsPlatCar(2);
+                        }
+                        driver.setCompanyId(companyId);
+                        driver.setFranchiseeId(franchiseeId);
+                        driver.setState(2);
+                        driver.setAuthState(2);
+                        driver.setFlag("1");
+                        driver.setInsertUser(ShiroKit.getUser().getId());
+                        driver.setInsertTime(new Date());
+                        driver.setAddType(2);
+                        driver.setAddObjectId(ShiroKit.getUser().getObjectId());
+                        if(SinataUtil.isNotEmpty(eight)){
+                            driver.setDriverAddress(eight);
+                        }
+                        tDriverService.insert(driver);
+
+
+                        //添加专车服务模式
+                        if ("是".equals(eleven)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(1);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加出租车服务模式
+                        if ("是".equals(twelve)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(2);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加跨城出行服务模式
+                        if ("是".equals(thirteen)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(3);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加小件同城物流服务模式
+                        if ("是".equals(fourteen)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(4);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加小件跨城物流服务模式
+                        if ("是".equals(fifteen)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(5);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加包车服务模式
+                        if ("是".equals(sixteen)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(6);
+                            itDriverServiceService.insert(service);
+                        }
+                    }
+                }
+            }else if (ShiroKit.getUser().getRoleType() == 2){
+                Workbook book = WoUtil.ImportFile(file);
+                Sheet sh = book.getSheetAt(0);   //获取到第一个表
+                for (int i = 1; i <= sh.getLastRowNum(); i++) {
+                    Row row = sh.getRow(i);
+
+                    Cell cell0 = row.getCell(0);  //司机名称
+                    String zero = null;
+                    if (SinataUtil.isNotEmpty(cell0)){
+                        zero = String.valueOf(cell0.getStringCellValue()).trim();
+                    }
+
+                    Cell cell1 = row.getCell(1);  //所属加盟商[选填]
+                    String one = null;
+                    if (SinataUtil.isNotEmpty(cell1)){
+                        one = String.valueOf(cell1.getStringCellValue()).trim();
+                    }
+
+                    Cell cell2 = row.getCell(2);  //性别[男/女]
+                    String two = null;
+                    if (SinataUtil.isNotEmpty(cell2)){
+                        two = String.valueOf(cell2.getStringCellValue()).trim();
+                    }
+
+                    Cell cell3 = row.getCell(3);  //驾驶证号码
+                    String three = null;
+                    if (SinataUtil.isNotEmpty(cell3)){
+                        three = String.valueOf(cell3.getStringCellValue()).trim();
+                    }
+
+                    Cell cell4 = row.getCell(4);  //驾龄
+                    String four = null;
+                    if (SinataUtil.isNotEmpty(cell4)){
+                        four = String.valueOf(cell4.getStringCellValue()).trim();
+                    }
+
+                    Cell cell5 = row.getCell(5);  //身份证号
+                    String five = null;
+                    if (SinataUtil.isNotEmpty(cell5)){
+                        five = String.valueOf(cell5.getStringCellValue()).trim();
+                    }
+
+                    Cell cell6 = row.getCell(6);  //居住地址
+                    String six = null;
+                    if (SinataUtil.isNotEmpty(cell6)){
+                        six = String.valueOf(cell6.getStringCellValue()).trim();
+                    }
+
+                    Cell cell7 = row.getCell(7);  //出租车资格证号
+                    String seven = null;
+                    if (SinataUtil.isNotEmpty(cell7)){
+                        seven = String.valueOf(cell7.getStringCellValue()).trim();
+                    }
+
+                    Cell cell8 = row.getCell(8);  //工号[选填]
+                    String eight = null;
+                    if (SinataUtil.isNotEmpty(cell8)){
+                        eight = String.valueOf(cell8.getStringCellValue()).trim();
+                    }
+
+                    Cell cell9 = row.getCell(9);  //经营业务:专车[是/否]
+                    String nine = null;
+                    if (SinataUtil.isNotEmpty(cell9)){
+                        nine = String.valueOf(cell9.getStringCellValue()).trim();
+                    }
+
+                    Cell cell10 = row.getCell(10);  //经营业务:出租车[是/否]
+                    String ten = null;
+                    if (SinataUtil.isNotEmpty(cell10)){
+                        ten = String.valueOf(cell10.getStringCellValue()).trim();
+                    }
+
+                    Cell cell11 = row.getCell(11);  //经营业务:跨城出行[是/否]
+                    String eleven = null;
+                    if (SinataUtil.isNotEmpty(cell11)){
+                        eleven = String.valueOf(cell11.getStringCellValue()).trim();
+                    }
+
+                    Cell cell12 = row.getCell(12);  //经营业务:小件同城物流[是/否]
+                    String twelve = null;
+                    if (SinataUtil.isNotEmpty(cell12)){
+                        twelve = String.valueOf(cell12.getStringCellValue()).trim();
+                    }
+
+                    Cell cell13 = row.getCell(13);  //经营业务:小件跨城物流[是/否]
+                    String thirteen = null;
+                    if (SinataUtil.isNotEmpty(cell13)){
+                        thirteen = String.valueOf(cell13.getStringCellValue()).trim();
+                    }
+
+                    Cell cell14 = row.getCell(14);  //经营业务:包车[是/否]
+                    String fourteen = null;
+                    if (SinataUtil.isNotEmpty(cell14)){
+                        fourteen = String.valueOf(cell14.getStringCellValue()).trim();
+                    }
+
+                    Cell cell15 = row.getCell(15);  //登录账号[手机号]
+                    String fifteen = null;
+                    if (SinataUtil.isNotEmpty(cell15)){
+                        fifteen = String.valueOf(cell15.getStringCellValue()).trim();
+                    }
+
+                    Cell cell16 = row.getCell(16);  //登录密码[密码长度为6-18]
+                    String sixteen = null;
+                    if (SinataUtil.isNotEmpty(cell16)){
+                        sixteen = String.valueOf(cell16.getStringCellValue()).trim();
+                    }
+                    if (SinataUtil.isEmpty(zero) || SinataUtil.isEmpty(two) || SinataUtil.isEmpty(three) || SinataUtil.isEmpty(four)
+                            || SinataUtil.isEmpty(five) || SinataUtil.isEmpty(seven)
+                            || SinataUtil.isEmpty(nine) || SinataUtil.isEmpty(ten)
+                            || SinataUtil.isEmpty(eleven) || SinataUtil.isEmpty(twelve) || SinataUtil.isEmpty(thirteen)
+                            || SinataUtil.isEmpty(fourteen) || SinataUtil.isEmpty(fifteen) || SinataUtil.isEmpty(sixteen)){
+                        return new ErrorTip(500, "单元格不能为空");
+                    }else{
+                        //判断账号是否存在
+                        int count = tDriverService.selectCount(new EntityWrapper<TDriver>().eq("phone", fifteen).in("authState", "1,2,3").ne("flag", 3));
+                        if (count > 0){
+                            continue;
+                        }
+                        //判断性别
+                        if (!two.equals("男") && !two.equals("女")){
+                            return new ErrorTip(500, "性别内容不正确");
+                        }
+                        //判断经营业务【专车】
+                        if (!nine.equals("是") && !nine.equals("否")){
+                            return new ErrorTip(500, "经营业务【专车】内容不正确");
+                        }
+                        //判断经营业务【出租车】
+                        if (!ten.equals("是") && !ten.equals("否")){
+                            return new ErrorTip(500, "经营业务【出租车】内容不正确");
+                        }
+                        //判断经营业务【跨城出行】
+                        if (!eleven.equals("是") && !eleven.equals("否")){
+                            return new ErrorTip(500, "经营业务【跨城出行】内容不正确");
+                        }
+                        //判断经营业务【小件同城物流】
+                        if (!twelve.equals("是") && !twelve.equals("否")){
+                            return new ErrorTip(500, "经营业务【小件同城物流】内容不正确");
+                        }
+                        //判断经营业务【小件跨城物流】
+                        if (!thirteen.equals("是") && !thirteen.equals("否")){
+                            return new ErrorTip(500, "经营业务【小件跨城物流】内容不正确");
+                        }
+                        //判断经营业务【包车】
+                        if (!fourteen.equals("是") && !fourteen.equals("否")){
+                            return new ErrorTip(500, "经营业务【包车】内容不正确");
+                        }
+                        //判断驾龄
+                        if (!isInteger(four)){
+                            return new ErrorTip(500, "驾龄格式不正确");
+                        }
+                        //判断手机号
+                        if (!isPhone(fifteen)){
+                            return new ErrorTip(500, "登录账号[手机号]格式不正确");
+                        }
+                        //判断登录密码
+                        if (!isPassword(sixteen)){
+                            return new ErrorTip(500, "登录密码格式不正确");
+                        }
+                        //查找平台公司
+                        Integer companyId = ShiroKit.getUser().getObjectId();
+                        Integer franchiseeId = 0;
+                        //判断所属分公司是否存在
+                        if (SinataUtil.isNotEmpty(one)){
+                            TCompany franchisee = itCompanyService.selectOne(new EntityWrapper<TCompany>().eq("superiorId",companyId).eq("name", one).eq("type", 3).notIn("flag", "3").last(" limit 1"));
+                            if (SinataUtil.isNotEmpty(franchisee)){
+                                franchiseeId = franchisee.getId();
+                            }
+                        }
+
+                        TDriver driver = new TDriver();
+                        driver.setAccount(fifteen);
+                        driver.setJobNumber(eight);
+                        driver.setPhone(fifteen);
+                        driver.setPassword(ShiroKit.md5(sixteen, "SA;d5#"));
+                        driver.setName(zero);
+                        if ("男".equals(two)){
+                            driver.setSex(1);
+                        }else if ("女".equals(two)){
+                            driver.setSex(2);
+                        }
+                        driver.setIdCard(five);
+                        driver.setDriverAge(Integer.valueOf(four));
+                        driver.setDriveCard(three);
+                        driver.setTaxiAptitudeCard(seven);
+                        driver.setIsPlatCar(2);
+                        driver.setCompanyId(companyId);
+                        driver.setFranchiseeId(franchiseeId);
+                        driver.setState(1);
+                        driver.setAuthState(1);
+                        driver.setFlag("1");
+                        driver.setInsertUser(ShiroKit.getUser().getId());
+                        driver.setInsertTime(new Date());
+                        driver.setAddType(3);
+                        driver.setAddObjectId(ShiroKit.getUser().getObjectId());
+                        if (SinataUtil.isNotEmpty(six)){
+                            driver.setDriverAddress(six);
+                        }
+                        tDriverService.insert(driver);
+
+                        //添加专车服务模式
+                        if ("是".equals(nine)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(1);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加出租车服务模式
+                        if ("是".equals(ten)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(2);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加跨城出行服务模式
+                        if ("是".equals(eleven)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(3);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加小件同城物流服务模式
+                        if ("是".equals(twelve)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(4);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加小件跨城物流服务模式
+                        if ("是".equals(thirteen)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(5);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加包车服务模式
+                        if ("是".equals(fourteen)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(6);
+                            itDriverServiceService.insert(service);
+                        }
+
+                    }
+                }
+            }else if (ShiroKit.getUser().getRoleType() == 3){
+                Workbook book = WoUtil.ImportFile(file);
+                Sheet sh = book.getSheetAt(0);   //获取到第一个表
+                for (int i = 1; i <= sh.getLastRowNum(); i++) {
+                    Row row = sh.getRow(i);
+
+                    Cell cell0 = row.getCell(0);  //司机名称
+                    String zero = null;
+                    if (SinataUtil.isNotEmpty(cell0)){
+                        zero = String.valueOf(cell0.getStringCellValue()).trim();
+                    }
+
+                    Cell cell2 = row.getCell(1);  //性别[男/女]
+                    String one = null;
+                    if (SinataUtil.isNotEmpty(cell2)){
+                        one = String.valueOf(cell2.getStringCellValue()).trim();
+                    }
+
+                    Cell cell3 = row.getCell(2);  //驾驶证号码
+                    String two = null;
+                    if (SinataUtil.isNotEmpty(cell3)){
+                        two = String.valueOf(cell3.getStringCellValue()).trim();
+                    }
+
+                    Cell cell4 = row.getCell(3);  //驾龄
+                    String three = null;
+                    if (SinataUtil.isNotEmpty(cell4)){
+                        three = String.valueOf(cell4.getStringCellValue()).trim();
+                    }
+
+                    Cell cell5 = row.getCell(4);  //身份证号
+                    String four = null;
+                    if (SinataUtil.isNotEmpty(cell5)){
+                        four = String.valueOf(cell5.getStringCellValue()).trim();
+                    }
+
+                    Cell cell6 = row.getCell(5);  //居住地址
+                    String five = null;
+                    if (SinataUtil.isNotEmpty(cell6)){
+                        five = String.valueOf(cell6.getStringCellValue()).trim();
+                    }
+
+                    Cell cell7 = row.getCell(6);  //出租车资格证号
+                    String six = null;
+                    if (SinataUtil.isNotEmpty(cell7)){
+                        six = String.valueOf(cell7.getStringCellValue()).trim();
+                    }
+
+                    Cell cell8 = row.getCell(7);  //工号[选填]
+                    String seven = null;
+                    if (SinataUtil.isNotEmpty(cell8)){
+                        seven = String.valueOf(cell8.getStringCellValue()).trim();
+                    }
+
+                    Cell cell9 = row.getCell(8);  //经营业务:专车[是/否]
+                    String eight = null;
+                    if (SinataUtil.isNotEmpty(cell9)){
+                        eight = String.valueOf(cell9.getStringCellValue()).trim();
+                    }
+
+                    Cell cell10 = row.getCell(9);  //经营业务:出租车[是/否]
+                    String nine = null;
+                    if (SinataUtil.isNotEmpty(cell10)){
+                        nine = String.valueOf(cell10.getStringCellValue()).trim();
+                    }
+
+                    Cell cell11 = row.getCell(10);  //经营业务:跨城出行[是/否]
+                    String ten = null;
+                    if (SinataUtil.isNotEmpty(cell11)){
+                        ten = String.valueOf(cell11.getStringCellValue()).trim();
+                    }
+
+                    Cell cell12 = row.getCell(11);  //经营业务:小件同城物流[是/否]
+                    String eleven = null;
+                    if (SinataUtil.isNotEmpty(cell12)){
+                        eleven = String.valueOf(cell12.getStringCellValue()).trim();
+                    }
+
+                    Cell cell13 = row.getCell(12);  //经营业务:小件跨城物流[是/否]
+                    String twelve = null;
+                    if (SinataUtil.isNotEmpty(cell13)){
+                        twelve = String.valueOf(cell13.getStringCellValue()).trim();
+                    }
+
+                    Cell cell14 = row.getCell(13);  //经营业务:包车[是/否]
+                    String thirteen = null;
+                    if (SinataUtil.isNotEmpty(cell14)){
+                        thirteen = String.valueOf(cell14.getStringCellValue()).trim();
+                    }
+
+                    Cell cell15 = row.getCell(14);  //登录账号[手机号]
+                    String fourteen = null;
+                    if (SinataUtil.isNotEmpty(cell15)){
+                        fourteen = String.valueOf(cell15.getStringCellValue()).trim();
+                    }
+
+                    Cell cell16 = row.getCell(15);  //登录密码[密码长度为6-18]
+                    String fifteen = null;
+                    if (SinataUtil.isNotEmpty(cell16)){
+                        fifteen = String.valueOf(cell16.getStringCellValue()).trim();
+                    }
+                    if (SinataUtil.isEmpty(zero) || SinataUtil.isEmpty(one)  || SinataUtil.isEmpty(two) || SinataUtil.isEmpty(three) || SinataUtil.isEmpty(four)
+                            || SinataUtil.isEmpty(six) || SinataUtil.isEmpty(eight)
+                            || SinataUtil.isEmpty(nine) || SinataUtil.isEmpty(ten)
+                            || SinataUtil.isEmpty(eleven) || SinataUtil.isEmpty(twelve) || SinataUtil.isEmpty(thirteen)
+                            || SinataUtil.isEmpty(fourteen) || SinataUtil.isEmpty(fifteen) ){
+                        return new ErrorTip(500, "单元格不能为空");
+                    }else{
+                        //判断账号是否存在
+                        int count = tDriverService.selectCount(new EntityWrapper<TDriver>().eq("phone", fourteen).in("authState", "1,2,3").ne("flag", 3));
+                        if (count > 0){
+                            continue;
+                        }
+                        //判断性别
+                        if (!one.equals("男") && !one.equals("女")){
+                            return new ErrorTip(500, "性别内容不正确");
+                        }
+                        //判断经营业务【专车】
+                        if (!eight.equals("是") && !eight.equals("否")){
+                            return new ErrorTip(500, "经营业务【专车】内容不正确");
+                        }
+                        //判断经营业务【出租车】
+                        if (!nine.equals("是") && !nine.equals("否")){
+                            return new ErrorTip(500, "经营业务【出租车】内容不正确");
+                        }
+                        //判断经营业务【跨城出行】
+                        if (!ten.equals("是") && !ten.equals("否")){
+                            return new ErrorTip(500, "经营业务【跨城出行】内容不正确");
+                        }
+                        //判断经营业务【小件同城物流】
+                        if (!eleven.equals("是") && !eleven.equals("否")){
+                            return new ErrorTip(500, "经营业务【小件同城物流】内容不正确");
+                        }
+                        //判断经营业务【小件跨城物流】
+                        if (!twelve.equals("是") && !twelve.equals("否")){
+                            return new ErrorTip(500, "经营业务【小件跨城物流】内容不正确");
+                        }
+                        //判断经营业务【包车】
+                        if (!thirteen.equals("是") && !thirteen.equals("否")){
+                            return new ErrorTip(500, "经营业务【包车】内容不正确");
+                        }
+                        //判断驾龄
+                        if (!isInteger(three)){
+                            return new ErrorTip(500, "驾龄格式不正确");
+                        }
+                        //判断手机号
+                        if (!isPhone(fourteen)){
+                            return new ErrorTip(500, "登录账号[手机号]格式不正确");
+                        }
+                        //判断登录密码
+                        if (!isPassword(fifteen)){
+                            return new ErrorTip(500, "登录密码格式不正确");
+                        }
+                        //查找平台公司
+                        Integer companyId = 0;
+                        Integer franchiseeId = 0;
+                        TCompany franchisee = itCompanyService.selectById(ShiroKit.getUser().getObjectId());
+                        if (SinataUtil.isNotEmpty(franchisee)){
+                            companyId = franchisee.getSuperiorId();
+                            franchiseeId = franchisee.getId();
+                        }
+                        if (companyId == 0 && franchiseeId == 0){
+                            return new ErrorTip(500, "当前登录账户上级分公司不能为空");
+                        }
+
+                        TDriver driver = new TDriver();
+                        driver.setAccount(fourteen);
+                        driver.setJobNumber(seven);
+                        driver.setPhone(fourteen);
+                        driver.setPassword(ShiroKit.md5(fifteen, "SA;d5#"));
+                        driver.setName(zero);
+                        if ("男".equals(one)){
+                            driver.setSex(1);
+                        }else if ("女".equals(one)){
+                            driver.setSex(2);
+                        }
+                        driver.setIdCard(four);
+                        driver.setDriverAge(Integer.valueOf(three));
+                        driver.setDriveCard(two);
+                        driver.setTaxiAptitudeCard(six);
+                        driver.setIsPlatCar(2);
+                        driver.setCompanyId(companyId);
+                        driver.setFranchiseeId(franchiseeId);
+                        driver.setState(1);
+                        driver.setAuthState(1);
+                        driver.setFlag("1");
+                        driver.setInsertUser(ShiroKit.getUser().getId());
+                        driver.setInsertTime(new Date());
+                        driver.setAddType(4);
+                        driver.setAddObjectId(ShiroKit.getUser().getObjectId());
+                        if (SinataUtil.isNotEmpty(five)){
+                            driver.setDriverAddress(five);
+                        }
+                        tDriverService.insert(driver);
+
+                        //添加专车服务模式
+                        if ("是".equals(eight)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(1);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加出租车服务模式
+                        if ("是".equals(nine)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(2);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加跨城出行服务模式
+                        if ("是".equals(ten)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(3);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加小件同城物流服务模式
+                        if ("是".equals(eleven)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(4);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加小件跨城物流服务模式
+                        if ("是".equals(twelve)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(5);
+                            itDriverServiceService.insert(service);
+                        }
+                        //添加包车服务模式
+                        if ("是".equals(thirteen)){
+                            TDriverService service = new TDriverService();
+                            service.setDriverId(driver.getId());
+                            service.setType(6);
+                            itDriverServiceService.insert(service);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return SUCCESS_TIP;
+    }
+
+
+
+
+    @Autowired
+    private ITCompanyService itCompanyService;
+
+    @Autowired
+    private ITDriverServiceService itDriverServiceService;
+
+    /**
+     * 验证是否可以字符转为整数
+     * @param str
+     * @return
+     */
+    public static boolean isInteger(String str) {
+        try{
+            String reg = "^[0-9]\\d*$";
+            boolean flag = str.matches(reg);
+            return flag;
+        }catch(NumberFormatException e) {
+            System.out.println("异常:\"" + str + "\"...");
+            return false;
+        }
+    }
+    /**
+     * 验证手机号格式是否正确
+     * @param str
+     * @return
+     */
+    public static boolean isPhone(String str) {
+        try{
+            String reg = "^1\\d{10}$";
+            boolean flag = str.matches(reg);
+            return flag;
+        }catch(NumberFormatException e) {
+            System.out.println("异常:\"" + str + "\"...");
+            return false;
+        }
+    }
+    /**
+     * 验证密码长度是否正确
+     * @param str
+     * @return
+     */
+    public static boolean isPassword(String str) {
+        try{
+            String reg = "^.{6,18}$";
+            boolean flag = str.matches(reg);
+            return flag;
+        }catch(NumberFormatException e) {
+            System.out.println("异常:\"" + str + "\"...");
+            return false;
+        }
+    }
+
+    /**
+     *  导出司机信息
+     */
+    @RequestMapping(value = "/outDriver")
+    public void outDriver(HttpServletRequest request, HttpServletResponse response) {
+        List<Map<String,Object>> listMap = tDriverService.getDriverListNoPage(ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId());
+
+        // 表格数据【封装】
+        List<List<String>> dataList = new ArrayList<>();
+
+        //第一行显示【封装】
+        List<String> twoList = new ArrayList<String>();
+        twoList.add("总计:");
+        twoList.add(String.valueOf(listMap.size())+"条");
+        dataList.add(twoList);
+
+        // 列【封装】
+        List<String> shellList = new ArrayList<String>();
+        shellList.add("添加时间");
+        shellList.add("姓名");
+        shellList.add("登录账号【手机号】");
+        shellList.add("性别");
+        shellList.add("司机来源");
+        shellList.add("所属分公司");
+        shellList.add("所属加盟商");
+        shellList.add("当前车辆");
+        shellList.add("服务模式");
+        shellList.add("关联线路");
+        shellList.add("评分");
+        shellList.add("历史接单数");
+        shellList.add("历史订单总金额");
+        shellList.add("当前钱包余额");
+        shellList.add("钱包活动余额");
+        shellList.add("钱包收入余额");
+        shellList.add("状态");
+        dataList.add(shellList);
+
+        for (Map<String,Object> object : listMap){
+            // 详细数据列【封装】
+            shellList = new ArrayList<String>();
+            if(SinataUtil.isNotEmpty(object.get("insertTime"))){
+                shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("insertTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss"));
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("name"))){
+                shellList.add(object.get("name").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("phone"))){
+                shellList.add(object.get("phone").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("sex"))){
+                shellList.add(object.get("sex").toString() == "1"?"男":"女");
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("addType"))){
+
+                shellList.add(object.get("addType").toString().equals("1")?"司机注册":(object.get("addType").toString().equals("2")?"平台添加":(object.get("addType").toString().equals("3")?"分公司添加":(object.get("addType").toString().equals("4")?"加盟商添加":""))));
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("companyName"))){
+                shellList.add(object.get("companyName").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("franchiseeName"))){
+                shellList.add(object.get("franchiseeName").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("carLicensePlate"))){
+                shellList.add(object.get("carLicensePlate").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("serverStr"))){
+                shellList.add(object.get("serverStr").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("lineStr"))){
+                shellList.add(object.get("lineStr").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("evaluateNum"))){
+                shellList.add(object.get("evaluateNum").toString());
+            }else{
+                shellList.add("0");
+            }
+            if(SinataUtil.isNotEmpty(object.get("historyNum"))){
+                shellList.add(object.get("historyNum").toString());
+            }else{
+                shellList.add("0");
+            }
+            if(SinataUtil.isNotEmpty(object.get("historyMoney"))){
+                shellList.add(object.get("historyMoney").toString());
+            }else{
+                shellList.add("0");
+            }
+            if(SinataUtil.isNotEmpty(object.get("balance"))){
+                shellList.add(object.get("balance").toString());
+            }else{
+                shellList.add("0");
+            }
+            if(SinataUtil.isNotEmpty(object.get("laveActivityMoney"))){
+                shellList.add(object.get("laveActivityMoney").toString());
+            }else{
+                shellList.add("0");
+            }
+            if(SinataUtil.isNotEmpty(object.get("laveBusinessMoney"))){
+                shellList.add(object.get("laveBusinessMoney").toString());
+            }else{
+                shellList.add("0");
+            }
+            if(SinataUtil.isNotEmpty(object.get("authState"))){
+                shellList.add(object.get("authState").toString().equals("1")?"待审核":(object.get("authState").toString().equals("2")?"正常":(object.get("authState").toString().equals("3")?"冻结":(object.get("authState").toString().equals("4")?"已拒绝":""))));
+
+                shellList.add(object.get("authState").toString());
+            }else{
+                shellList.add("-");
+            }
+            dataList.add(shellList);
+        }
+        try {
+            // 调用工具类进行导出
+            ExcelExportUtil.easySheet("司机信息导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "司机信息导出记录", dataList,request, response);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TFeedbackController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TFeedbackController.java
new file mode 100644
index 0000000..d92249a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TFeedbackController.java
@@ -0,0 +1,169 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TSystemNotice;
+import com.stylefeng.guns.modular.system.service.ITSystemNoticeService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TFeedback;
+import com.stylefeng.guns.modular.system.service.ITFeedbackService;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 反馈管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-10 10:24:59
+ */
+@Controller
+@RequestMapping("/tFeedback")
+public class TFeedbackController extends BaseController {
+
+    private String PREFIX = "/system/tFeedback/";
+
+    @Autowired
+    private ITFeedbackService tFeedbackService;
+
+    @Autowired
+    private ITSystemNoticeService tSystemNoticeService;
+
+    /**
+     * 跳转到司机反馈管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tFeedback.html";
+    }
+
+    /**
+     * 跳转到用户反馈管理首页
+     */
+    @RequestMapping("/userFeedback")
+    public String userFeedback() {
+        return PREFIX + "userFeedback.html";
+    }
+
+    /**
+     * 跳转到添加反馈管理
+     */
+    @RequestMapping("/tFeedback_add")
+    public String tFeedbackAdd() {
+        return PREFIX + "tFeedback_add.html";
+    }
+
+    /**
+     * 跳转到修改反馈管理
+     */
+    @RequestMapping("/tFeedback_immediately/{tFeedbackId}/{type}")
+    public String tFeedbackUpdate(@PathVariable Integer tFeedbackId, @PathVariable Integer type, Model model) {
+        model.addAttribute("tFeedbackId",tFeedbackId);
+        model.addAttribute("type",type);
+        return PREFIX + "tFeedback_immediately.html";
+    }
+
+    /**
+     * 跳转到查看详情
+     */
+    @RequestMapping("/lookDetail/{id}/{type}")
+    public String lookDetail(@PathVariable Integer id, @PathVariable Integer type, Model model) {
+        TFeedback tFeedback = tFeedbackService.selectById(id);
+        String str = "";
+        if (1 == type){
+            str = tFeedback.getContent();
+        }else if (2 == type){
+            str = tFeedback.getRemark();
+        }
+        model.addAttribute("str",str);
+        return "/system/tComplaint/lookDetail.html";
+    }
+
+    /**
+     * 获取司机反馈管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String driverName,
+                       String driverPhone,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tFeedbackService.getFeedbackList(page,beginTime,endTime,2,driverName,driverPhone,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 获取用户反馈管理列表
+     */
+    @RequestMapping(value = "/listUser")
+    @ResponseBody
+    public Object listUser(String insertTime,
+                           String userName,
+                           String userPhone,
+                           Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tFeedbackService.getFeedbackList(page,beginTime,endTime,1,userName,userPhone,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 立即处理操作
+     */
+    @RequestMapping(value = "/immediately")
+    @ResponseBody
+    public Object immediately(@RequestParam Integer id,@RequestParam String remark) {
+        TFeedback tFeedback = tFeedbackService.selectById(id);
+        if (SinataUtil.isNotEmpty(tFeedback)){
+            tFeedback.setCldate(new Date());
+            tFeedback.setRemark(remark);
+            tFeedback.setHandleUserId(ShiroKit.getUser().getId());
+            tFeedback.setState(2);
+            tFeedbackService.updateById(tFeedback);
+
+            //增加系统消息
+            TSystemNotice notice = new TSystemNotice();
+            notice.setType(2);
+            notice.setUserType(tFeedback.getType());
+            notice.setContent("反馈处理结果:【"+remark+"】。");
+            notice.setUserId(tFeedback.getUserId());
+            notice.setInsertTime(new Date());
+            notice.setRead(1);
+            tSystemNoticeService.insert(notice);
+        }
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TInvoiceController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TInvoiceController.java
new file mode 100644
index 0000000..5a32eb0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TInvoiceController.java
@@ -0,0 +1,125 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TComplaint;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TInvoice;
+import com.stylefeng.guns.modular.system.service.ITInvoiceService;
+
+import java.util.Map;
+
+/**
+ * 开发票列表控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-09 10:55:26
+ */
+@Controller
+@RequestMapping("/tInvoice")
+public class TInvoiceController extends BaseController {
+
+    private String PREFIX = "/system/tInvoice/";
+
+    @Autowired
+    private ITInvoiceService tInvoiceService;
+
+    /**
+     * 跳转到开发票列表首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tInvoice.html";
+    }
+
+    /**
+     * 跳转到查看详情
+     */
+    @RequestMapping("/lookDetail/{id}/{type}")
+    public String lookDetail(@PathVariable Integer id, @PathVariable Integer type, Model model) {
+        TInvoice tInvoice = tInvoiceService.selectById(id);
+        String str = "";
+        if (1 == type){
+            str = tInvoice.getContent();
+        }
+        model.addAttribute("str",str);
+        return "/system/tComplaint/lookDetail.html";
+    }
+
+    /**
+     * 跳转到添加开发票列表
+     */
+    @RequestMapping("/tInvoice_add")
+    public String tInvoiceAdd() {
+        return PREFIX + "tInvoice_add.html";
+    }
+
+    /**
+     * 跳转到修改开发票列表
+     */
+    @RequestMapping("/tInvoice_update/{tInvoiceId}")
+    public String tInvoiceUpdate(@PathVariable Integer tInvoiceId, Model model) {
+        TInvoice tInvoice = tInvoiceService.selectById(tInvoiceId);
+        model.addAttribute("item",tInvoice);
+        LogObjectHolder.me().set(tInvoice);
+        return PREFIX + "tInvoice_edit.html";
+    }
+
+    /**
+     * 获取开发票列表列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String email,
+                       String name,
+                       Integer type,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tInvoiceService.getInvoiceList(page,beginTime,endTime,email,name,type,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 重新开发票
+     */
+    @RequestMapping(value = "/again")
+    @ResponseBody
+    public Object again(@RequestParam Integer tInvoiceId) {
+        TInvoice tInvoice = tInvoiceService.selectById(tInvoiceId);
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除开发票列表
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tInvoiceId) {
+        tInvoiceService.deleteById(tInvoiceId);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TNoticesController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TNoticesController.java
new file mode 100644
index 0000000..89f1547
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TNoticesController.java
@@ -0,0 +1,241 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.util.task.base.QuartzManager;
+import com.stylefeng.guns.modular.system.util.task.base.TimeJobType;
+import com.stylefeng.guns.modular.system.util.task.jobs.AddNotice;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TNotices;
+import com.stylefeng.guns.modular.system.service.ITNoticesService;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 滚动消息设置控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-10 15:21:25
+ */
+@Controller
+@RequestMapping("/tNotices")
+public class TNoticesController extends BaseController {
+
+    private String PREFIX = "/system/tNotices/";
+
+    @Autowired
+    private ITNoticesService tNoticesService;
+
+    /**
+     * 跳转到滚动消息设置首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tNotices.html";
+    }
+
+    /**
+     * 跳转到系统公告设置首页
+     */
+    @RequestMapping("/system")
+    public String system() {
+        return PREFIX + "system.html";
+    }
+
+    /**
+     * 跳转到添加滚动消息设置
+     */
+    @RequestMapping("/tNotices_add")
+    public String tNoticesAdd() {
+        return PREFIX + "tNotices_add.html";
+    }
+
+    /**
+     * 跳转到添加系统公告
+     */
+    @RequestMapping("/system_add")
+    public String system_add() {
+        return PREFIX + "system_add.html";
+    }
+
+    /**
+     * 跳转到修改滚动消息设置
+     */
+    @RequestMapping("/tNotices_update/{tNoticesId}")
+    public String tNoticesUpdate(@PathVariable Integer tNoticesId, Model model) {
+        TNotices tNotices = tNoticesService.selectById(tNoticesId);
+        model.addAttribute("item",tNotices);
+        LogObjectHolder.me().set(tNotices);
+        return PREFIX + "tNotices_edit.html";
+    }
+
+    /**
+     * 跳转到修改系统公告
+     */
+    @RequestMapping("/system_update/{tNoticesId}")
+    public String system_update(@PathVariable Integer tNoticesId, Model model) {
+        TNotices tNotices = tNoticesService.selectById(tNoticesId);
+        model.addAttribute("item",tNotices);
+        LogObjectHolder.me().set(tNotices);
+        return PREFIX + "system_update.html";
+    }
+
+    /**
+     * 获取滚动消息设置列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,String content) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tNoticesService.getRollingNoticeList(page,beginTime,endTime,1,content));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 获取系统公告设置列表
+     */
+    @RequestMapping(value = "/listSystem")
+    @ResponseBody
+    public Object listSystem(String insertTime,String content) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tNoticesService.getRollingNoticeList(page,beginTime,endTime,2,content));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增滚动消息设置
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TNotices tNotices) {
+        tNotices.setIsDelete(1);
+        tNotices.setInsertTime(new Date());
+        tNotices.setInsertUser(ShiroKit.getUser().getId());
+        tNotices.setType(1);
+        tNoticesService.insert(tNotices);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 新增系统公告
+     */
+    @RequestMapping(value = "/addSystem")
+    @ResponseBody
+    public Object addSystem(TNotices tNotices) {
+        tNotices.setIsDelete(1);
+        tNotices.setInsertTime(new Date());
+        tNotices.setInsertUser(ShiroKit.getUser().getId());
+        tNotices.setType(2);
+        tNoticesService.insert(tNotices);
+
+        if (tNotices.getIsShow() == 1){  //发布
+            //定时1秒后执行
+            Map<String,Object> maps=new HashMap<>();
+            maps.put("noticeId",tNotices.getId());
+            QuartzManager.addJob(AddNotice.class, (AddNotice.name+tNotices.getId()).toUpperCase(), TimeJobType.UNLOCK,DateUtil.getDate_strYMdHms(new Date().getTime() + 1*1000) , maps);
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 发布系统公告
+     */
+    @RequestMapping(value = "/sendSystem")
+    @ResponseBody
+    public Object sendSystem(@RequestParam Integer tNoticesId) {
+        TNotices tNotices = tNoticesService.selectById(tNoticesId);
+        if (tNotices.getIsShow() == 2){
+            //定时1秒后执行
+            Map<String,Object> maps=new HashMap<>();
+            maps.put("noticeId",tNotices.getId());
+            QuartzManager.addJob(AddNotice.class, (AddNotice.name+tNotices.getId()).toUpperCase(), TimeJobType.UNLOCK,DateUtil.getDate_strYMdHms(new Date().getTime() + 1*1000) , maps);
+        }
+        tNotices.setIsShow(1);
+        tNotices.setUpdateTime(new Date());
+        tNotices.setUpdateUser(ShiroKit.getUser().getId());
+        tNoticesService.updateById(tNotices);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tNoticesId) {
+        TNotices tNotices = tNoticesService.selectById(tNoticesId);
+        tNotices.setIsDelete(2);
+        tNotices.setFlag("3");
+        tNotices.setUpdateTime(new Date());
+        tNotices.setUpdateUser(ShiroKit.getUser().getId());
+        tNoticesService.updateById(tNotices);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改滚动消息设置
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TNotices tNotices) {
+        tNotices.setUpdateUser(ShiroKit.getUser().getId());
+        tNotices.setUpdateTime(new Date());
+        tNoticesService.updateById(tNotices);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改系统公告
+     */
+    @RequestMapping(value = "/updateSystem")
+    @ResponseBody
+    public Object updateSystem(TNotices tNotices) {
+        tNotices.setUpdateUser(ShiroKit.getUser().getId());
+        tNotices.setUpdateTime(new Date());
+        tNoticesService.updateById(tNotices);
+
+        if (tNotices.getIsShow() == 1){  //发布
+            //定时1秒后执行
+            Map<String,Object> maps=new HashMap<>();
+            maps.put("noticeId",tNotices.getId());
+            QuartzManager.addJob(AddNotice.class, (AddNotice.name+tNotices.getId()).toUpperCase(), TimeJobType.UNLOCK,DateUtil.getDate_strYMdHms(new Date().getTime() + 1*1000) , maps);
+        }
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOpenCityController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOpenCityController.java
new file mode 100644
index 0000000..f61070e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOpenCityController.java
@@ -0,0 +1,293 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TOpenCityBusiness;
+import com.stylefeng.guns.modular.system.model.TRegion;
+import com.stylefeng.guns.modular.system.service.ITOpenCityBusinessService;
+import com.stylefeng.guns.modular.system.service.ITRegionService;
+import com.stylefeng.guns.modular.system.util.GaoDeMapUtil;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TOpenCity;
+import com.stylefeng.guns.modular.system.service.ITOpenCityService;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 城市管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-02 11:40:31
+ */
+@Controller
+@RequestMapping("/tOpenCity")
+public class TOpenCityController extends BaseController {
+
+    private String PREFIX = "/system/tOpenCity/";
+
+    @Autowired
+    private ITOpenCityService tOpenCityService;
+
+    @Autowired
+    private ITRegionService tRegionService;
+
+    @Autowired
+    private ITOpenCityBusinessService tOpenCityBusinessService;
+
+    /**
+     * 跳转到城市管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tOpenCity.html";
+    }
+
+    /**
+     * 跳转到添加城市管理
+     */
+    @RequestMapping("/tOpenCity_add")
+    public String tOpenCityAdd(Model model) {
+        List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("provinceList",provinceList);
+        return PREFIX + "tOpenCity_add.html";
+    }
+
+    /**
+     * 跳转到修改城市管理
+     */
+    @RequestMapping("/tOpenCity_update/{tOpenCityId}")
+    public String tOpenCityUpdate(@PathVariable Integer tOpenCityId, Model model) {
+        TOpenCity tOpenCity = tOpenCityService.selectById(tOpenCityId);
+        model.addAttribute("item",tOpenCity);
+        LogObjectHolder.me().set(tOpenCity);
+
+        //省
+        List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("provinceList",provinceList);
+        //市
+        List<TRegion> cityList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", tOpenCity.getAreaId()));
+        model.addAttribute("cityList",cityList);
+        //区
+        List<TRegion> areaList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", tOpenCity.getCityId()));
+        model.addAttribute("areaList",areaList);
+        //经营业务
+        List<Map<String,Object>> businessList = tOpenCityService.getBusinessByCityId(tOpenCityId);
+        model.addAttribute("businessList",businessList);
+        return PREFIX + "tOpenCity_edit.html";
+    }
+
+    @RequestMapping(value = "/change")
+    @ResponseBody
+    public Object change(@RequestParam Integer id) {
+        List<TRegion> list = new ArrayList<>();
+        if (SinataUtil.isNotEmpty(id)){
+            list = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", id));
+        }
+        return list;
+    }
+
+    /**
+     * 获取城市管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,String condition) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tOpenCityService.getOpenCityList(page,beginTime,endTime,condition));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增城市管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TOpenCity tOpenCity,@RequestParam String businessTypeStr,Integer areaId,Integer cityId,Integer provinceId) {
+        //获取code
+        if (SinataUtil.isNotEmpty(areaId)){
+            TRegion area = tRegionService.selectById(areaId);
+            tOpenCity.setCode(area.getCode());
+        }
+        if (SinataUtil.isNotEmpty(cityId)){
+            TRegion city = tRegionService.selectById(cityId);
+            tOpenCity.setCode(city.getCode());
+        }
+        if (SinataUtil.isNotEmpty(provinceId)){
+            TRegion province = tRegionService.selectById(provinceId);
+            tOpenCity.setCode(province.getCode());
+        }
+        tOpenCity.setAreaId(areaId);
+        tOpenCity.setCityId(cityId);
+        tOpenCity.setProvinceId(provinceId);
+        //获取经纬度
+        String address = tOpenCity.getAreaName();
+        if (SinataUtil.isNotEmpty(tOpenCity.getCityName())){
+            address+=tOpenCity.getCityName();
+        }
+        if (SinataUtil.isNotEmpty(tOpenCity.getProvinceName())){
+            address+=tOpenCity.getProvinceName();
+        }
+        JSONObject positionObj = GaoDeMapUtil.getLngAndLat(address);
+        String longitude = positionObj.getString("longitude");
+        String latitude = positionObj.getString("latitude");
+        tOpenCity.setLon(Double.valueOf(longitude));
+        tOpenCity.setLat(Double.valueOf(latitude));
+        tOpenCity.setInsertTime(new Date());
+        tOpenCity.setInsertUser(ShiroKit.getUser().getId());
+        tOpenCityService.insert(tOpenCity);
+
+        //添加经营业务
+        testJSONStrToJSONArray(businessTypeStr,tOpenCity.getId());
+        return SUCCESS_TIP;
+    }
+
+    public void testJSONStrToJSONArray(String subArr,Integer tOpenCityId){
+        JSONArray jsonArray = JSON.parseArray(subArr);
+        int size = jsonArray.size();
+        for (int i = 0; i < size; i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            TOpenCityBusiness business = new TOpenCityBusiness();
+            if (SinataUtil.isNotEmpty(jsonObject.getInteger("busId")) && jsonObject.getInteger("busId") != 0){
+                business = tOpenCityBusinessService.selectById(jsonObject.getInteger("busId"));
+                business.setUpdateTime(new Date());
+                business.setUpdateUser(ShiroKit.getUser().getId());
+                business.setFlag("2");
+            }else{
+                business.setInsertTime(DateUtil.parse(jsonObject.getString("time")+" 00:00:00","yyyy-MM-dd HH:mm:ss"));
+                business.setInsertUser(ShiroKit.getUser().getId());
+            }
+            business.setOpenCityId(tOpenCityId);
+            String type = jsonObject.getString("type");
+            Integer businessType = 0;
+            if ("专车".equals(type)){
+                businessType = 1;
+            }else if ("出租车".equals(type)){
+                businessType = 2;
+            }else if ("跨城出行".equals(type)){
+                businessType = 3;
+            }else if ("跨城小件物流".equals(type)){
+                businessType = 4;
+            }else if ("同城小件物流".equals(type)){
+                businessType = 5;
+            }else if ("包车".equals(type)){
+                businessType = 6;
+            }
+            business.setBusinessType(businessType);
+            business.setSort(jsonObject.getInteger("sort"));
+            if (SinataUtil.isNotEmpty(jsonObject.getInteger("busId")) && jsonObject.getInteger("busId") != 0){
+                tOpenCityBusinessService.updateById(business);
+            }else{
+                tOpenCityBusinessService.insert(business);
+            }
+        }
+    }
+
+    /**
+     * 删除城市管理
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tOpenCityId) {
+        TOpenCity tOpenCity = tOpenCityService.selectById(tOpenCityId);
+        tOpenCity.setFlag("3");
+        tOpenCityService.updateById(tOpenCity);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改城市管理
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TOpenCity tOpenCity,@RequestParam String businessTypeStr,Integer areaId,Integer cityId,Integer provinceId) {
+        if (SinataUtil.isNotEmpty(areaId)){
+            TRegion area = tRegionService.selectById(areaId);
+            tOpenCity.setCode(area.getCode());
+        }
+        if (SinataUtil.isNotEmpty(cityId)){
+            TRegion city = tRegionService.selectById(cityId);
+            tOpenCity.setCode(city.getCode());
+        }
+        if (SinataUtil.isNotEmpty(provinceId)){
+            TRegion province = tRegionService.selectById(provinceId);
+            tOpenCity.setCode(province.getCode());
+        }
+        if (SinataUtil.isEmpty(areaId)){
+            tOpenCity.setAreaId(0);
+            tOpenCity.setAreaName("");
+        }else{
+            tOpenCity.setAreaId(areaId);
+        }
+        if (SinataUtil.isEmpty(cityId)){
+            tOpenCity.setCityId(0);
+            tOpenCity.setCityName("");
+        }else{
+            tOpenCity.setCityId(cityId);
+        }
+        if (SinataUtil.isEmpty(provinceId)){
+            tOpenCity.setProvinceId(0);
+            tOpenCity.setProvinceName("");
+        }else{
+            tOpenCity.setProvinceId(provinceId);
+        }
+
+        //获取经纬度
+        String address = tOpenCity.getAreaName();
+        if (SinataUtil.isNotEmpty(tOpenCity.getCityName())){
+            address+=tOpenCity.getCityName();
+        }
+        if (SinataUtil.isNotEmpty(tOpenCity.getProvinceName())){
+            address+=tOpenCity.getProvinceName();
+        }
+        JSONObject positionObj = GaoDeMapUtil.getLngAndLat(address);
+        String longitude = positionObj.getString("longitude");
+        String latitude = positionObj.getString("latitude");
+        tOpenCity.setLon(Double.valueOf(longitude));
+        tOpenCity.setLat(Double.valueOf(latitude));
+        tOpenCity.setUpdateTime(new Date());
+        tOpenCity.setUpdateUser(ShiroKit.getUser().getId());
+        tOpenCityService.updateById(tOpenCity);
+
+        //删除经营业务
+        TOpenCityBusiness business = new TOpenCityBusiness();
+        business.setFlag("3");
+        tOpenCityBusinessService.update(business,new EntityWrapper<TOpenCityBusiness>().eq("openCityId",tOpenCity.getId()));
+        //添加经营业务
+        testJSONStrToJSONArray(businessTypeStr,tOpenCity.getId());
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 城市管理详情
+     */
+    @RequestMapping(value = "/detail/{tOpenCityId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tOpenCityId") Integer tOpenCityId) {
+        return tOpenCityService.selectById(tOpenCityId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderEvaluateController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderEvaluateController.java
new file mode 100644
index 0000000..1a57ba1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderEvaluateController.java
@@ -0,0 +1,140 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TComplaint;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TOrderEvaluate;
+import com.stylefeng.guns.modular.system.service.ITOrderEvaluateService;
+
+import java.util.Map;
+
+/**
+ * 评价列表控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-09 11:44:36
+ */
+@Controller
+@RequestMapping("/tOrderEvaluate")
+public class TOrderEvaluateController extends BaseController {
+
+    private String PREFIX = "/system/tOrderEvaluate/";
+
+    @Autowired
+    private ITOrderEvaluateService tOrderEvaluateService;
+
+    /**
+     * 跳转到评价列表首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tOrderEvaluate.html";
+    }
+
+    /**
+     * 跳转到查看详情
+     */
+    @RequestMapping("/lookDetail/{id}/{type}")
+    public String lookDetail(@PathVariable Integer id, @PathVariable Integer type, Model model) {
+        TOrderEvaluate tOrderEvaluate = tOrderEvaluateService.selectById(id);
+        String str = "";
+        if (1 == type){
+            str = tOrderEvaluate.getContent();
+        }
+        model.addAttribute("str",str);
+        return "/system/tComplaint/lookDetail.html";
+    }
+
+    /**
+     * 跳转到添加评价列表
+     */
+    @RequestMapping("/tOrderEvaluate_add")
+    public String tOrderEvaluateAdd() {
+        return PREFIX + "tOrderEvaluate_add.html";
+    }
+
+    /**
+     * 跳转到修改评价列表
+     */
+    @RequestMapping("/tOrderEvaluate_update/{tOrderEvaluateId}")
+    public String tOrderEvaluateUpdate(@PathVariable Integer tOrderEvaluateId, Model model) {
+        TOrderEvaluate tOrderEvaluate = tOrderEvaluateService.selectById(tOrderEvaluateId);
+        model.addAttribute("item",tOrderEvaluate);
+        LogObjectHolder.me().set(tOrderEvaluate);
+        return PREFIX + "tOrderEvaluate_edit.html";
+    }
+
+    /**
+     * 获取评价列表列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String userName,
+                       String userPhone,
+                       String driverName,
+                       String driverPhone,
+                       String fraction,
+                       Integer orderType) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tOrderEvaluateService.getOrderEvaluateList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),beginTime,endTime,userName,userPhone,driverName,driverPhone,fraction,orderType));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增评价列表
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TOrderEvaluate tOrderEvaluate) {
+        tOrderEvaluateService.insert(tOrderEvaluate);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除评价列表
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tOrderEvaluateId) {
+        tOrderEvaluateService.deleteById(tOrderEvaluateId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改评价列表
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TOrderEvaluate tOrderEvaluate) {
+        tOrderEvaluateService.updateById(tOrderEvaluate);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 评价列表详情
+     */
+    @RequestMapping(value = "/detail/{tOrderEvaluateId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tOrderEvaluateId") Integer tOrderEvaluateId) {
+        return tOrderEvaluateService.selectById(tOrderEvaluateId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TProblemController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TProblemController.java
new file mode 100644
index 0000000..399da27
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TProblemController.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TFeedback;
+import com.stylefeng.guns.modular.system.model.TSystemNotice;
+import com.stylefeng.guns.modular.system.service.ITSystemNoticeService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TProblem;
+import com.stylefeng.guns.modular.system.service.ITProblemService;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 用户留言管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-24 11:20:23
+ */
+@Controller
+@RequestMapping("/tProblem")
+public class TProblemController extends BaseController {
+
+    private String PREFIX = "/system/tProblem/";
+
+    @Autowired
+    private ITProblemService tProblemService;
+
+    @Autowired
+    private ITSystemNoticeService itSystemNoticeService;
+
+    /**
+     * 跳转到用户留言管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tProblem.html";
+    }
+
+    /**
+     * 跳转到查看详情
+     */
+    @RequestMapping("/lookDetail/{id}/{type}")
+    public String lookDetail(@PathVariable Integer id, @PathVariable Integer type, Model model) {
+        TProblem tProblem = tProblemService.selectById(id);
+        String str = "";
+        if (1 == type){
+            str = tProblem.getContent();
+        }else if (2 == type){
+            str = tProblem.getAnswer();
+        }
+        model.addAttribute("str",str);
+        return "/system/tComplaint/lookDetail.html";
+    }
+
+    /**
+     * 跳转到立即处理页面
+     */
+    @RequestMapping("/tProblem_immediately/{tProblemId}")
+    public String tProblemUpdate(@PathVariable Integer tProblemId, Model model) {
+        model.addAttribute("tProblemId",tProblemId);
+        return PREFIX + "tProblem_immediately.html";
+    }
+
+    /**
+     * 获取用户留言管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String userName,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tProblemService.getProblemList(page,beginTime,endTime,userName,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 立即处理
+     */
+    @RequestMapping(value = "/immediately")
+    @ResponseBody
+    public Object immediately(@RequestParam Integer tProblemId,@RequestParam String answer) {
+        TProblem tProblem = tProblemService.selectById(tProblemId);
+        if (SinataUtil.isNotEmpty(tProblem)){
+            tProblem.setAnswer(answer);
+            tProblem.setHandleTime(new Date());
+            tProblem.setHandleUserId(ShiroKit.getUser().getId());
+            tProblem.setState(2);
+            tProblemService.updateById(tProblem);
+
+            //增加系统消息
+            TSystemNotice notice = new TSystemNotice();
+            notice.setType(2);
+            notice.setUserType(1);
+            notice.setContent("您的留言被回复啦:【"+answer+"】");
+            notice.setUserId(tProblem.getUserId());
+            notice.setInsertTime(new Date());
+            notice.setRead(1);
+            itSystemNoticeService.insert(notice);
+        }
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TPubWithdrawalController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TPubWithdrawalController.java
new file mode 100644
index 0000000..49b1d4b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TPubWithdrawalController.java
@@ -0,0 +1,168 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TComplaint;
+import com.stylefeng.guns.modular.system.model.TSystemNotice;
+import com.stylefeng.guns.modular.system.service.ITSystemNoticeService;
+import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
+import com.stylefeng.guns.modular.system.util.PushURL;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TPubWithdrawal;
+import com.stylefeng.guns.modular.system.service.ITPubWithdrawalService;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 提现列表控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-09 09:30:59
+ */
+@Controller
+@RequestMapping("/tPubWithdrawal")
+public class TPubWithdrawalController extends BaseController {
+
+    private String PREFIX = "/system/tPubWithdrawal/";
+
+    @Autowired
+    private ITPubWithdrawalService tPubWithdrawalService;
+
+    @Autowired
+    private ITSystemNoticeService tSystemNoticeService;
+
+    /**
+     * 跳转到提现列表首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tPubWithdrawal.html";
+    }
+
+    /**
+     * 跳转到查看详情
+     */
+    @RequestMapping("/lookDetail/{id}/{type}")
+    public String lookDetail(@PathVariable Integer id, @PathVariable Integer type, Model model) {
+        TPubWithdrawal tPubWithdrawal = tPubWithdrawalService.selectById(id);
+        String str = "";
+        if (1 == type){
+            str = tPubWithdrawal.getRemark();
+        }
+        model.addAttribute("str",str);
+        return "/system/tComplaint/lookDetail.html";
+    }
+
+    /**
+     * 跳转到立即处理页面
+     */
+    @RequestMapping("/tPubWithdrawal_immediately/{tPubWithdrawalId}")
+    public String tPubWithdrawalUpdate(@PathVariable Integer tPubWithdrawalId, Model model) {
+        model.addAttribute("tPubWithdrawalId",tPubWithdrawalId);
+        return PREFIX + "tPubWithdrawal_immediately.html";
+    }
+
+    /**
+     * 获取提现列表列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String name,
+                       Integer withdrawalType) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tPubWithdrawalService.getWithdrawalList(page,beginTime,endTime,name,withdrawalType));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增提现列表
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TPubWithdrawal tPubWithdrawal) {
+        tPubWithdrawalService.insert(tPubWithdrawal);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 立即处理操作
+     */
+    @RequestMapping(value = "/immediately")
+    @ResponseBody
+    public Object immediately(@RequestParam Integer id,@RequestParam Integer state,@RequestParam String remark) {
+        TPubWithdrawal tPubWithdrawal = tPubWithdrawalService.selectById(id);
+        if (SinataUtil.isNotEmpty(tPubWithdrawal)){
+//            tPubWithdrawal.setState(state);  //调用接口修改状态
+            tPubWithdrawal.setRemark(remark);
+            tPubWithdrawal.setHandleTime(new Date());
+
+            Integer stateObj = 1;
+            if (2 == state){   //同意提现
+                stateObj = 1;
+            }else if (3 == state){  //拒绝提现
+                stateObj = 2;
+            }
+            tPubWithdrawalService.updateById(tPubWithdrawal);
+
+            Map<String,String> map = new HashMap<>();
+            map.put("id", String.valueOf(tPubWithdrawal.getId()));
+            map.put("state", String.valueOf(stateObj));
+            String result = HttpRequestUtil.postRequest(PushURL.withdraw_auth_url, map);
+            System.out.println("提现审核接口 :【recordId="+tPubWithdrawal.getId().toString()+"】,调用接口:"+result);
+
+            //增加系统消息
+            TSystemNotice notice = new TSystemNotice();
+            notice.setType(2);
+            notice.setUserType(tPubWithdrawal.getUserType());
+            notice.setContent("提现处理结果:【"+remark+"】。");
+            notice.setUserId(tPubWithdrawal.getUserId());
+            notice.setInsertTime(new Date());
+            notice.setRead(1);
+            tSystemNoticeService.insert(notice);
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改提现列表
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TPubWithdrawal tPubWithdrawal) {
+        tPubWithdrawalService.updateById(tPubWithdrawal);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 提现列表详情
+     */
+    @RequestMapping(value = "/detail/{tPubWithdrawalId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tPubWithdrawalId") Integer tPubWithdrawalId) {
+        return tPubWithdrawalService.selectById(tPubWithdrawalId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSmsrecordController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSmsrecordController.java
new file mode 100644
index 0000000..63d659c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSmsrecordController.java
@@ -0,0 +1,84 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TComplaint;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TSmsrecord;
+import com.stylefeng.guns.modular.system.service.ITSmsrecordService;
+
+import java.util.Map;
+
+/**
+ * 短信记录控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-10 19:43:13
+ */
+@Controller
+@RequestMapping("/tSmsrecord")
+public class TSmsrecordController extends BaseController {
+
+    private String PREFIX = "/system/tSmsrecord/";
+
+    @Autowired
+    private ITSmsrecordService tSmsrecordService;
+
+    /**
+     * 跳转到短信记录首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tSmsrecord.html";
+    }
+
+    /**
+     * 跳转到查看详情
+     */
+    @RequestMapping("/lookDetail/{id}/{type}")
+    public String lookDetail(@PathVariable Integer id, @PathVariable Integer type, Model model) {
+        TSmsrecord tSmsrecord = tSmsrecordService.selectById(id);
+        String str = "";
+        if (1 == type){
+            str = tSmsrecord.getContent();
+        }
+        model.addAttribute("str",str);
+        return "/system/tComplaint/lookDetail.html";
+    }
+
+    /**
+     * 获取短信记录列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String phone) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tSmsrecordService.getSmsCodeList(page,beginTime,endTime,phone));
+        }
+        return super.packForBT(page);
+    }
+
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSysReformistController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSysReformistController.java
new file mode 100644
index 0000000..e9fe3e2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSysReformistController.java
@@ -0,0 +1,413 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.math.BigDecimal;
+
+/**
+ * 系统设置控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-09 13:43:44
+ */
+@Controller
+@RequestMapping("/tSysReformist")
+public class TSysReformistController extends BaseController {
+
+    private String PREFIX = "/system/tSysReformist/";
+
+    @Autowired
+    private ITSysReformistService tSysReformistService;
+
+    @Autowired
+    private ITSysIntegralService tSysIntegralService;
+
+    @Autowired
+    private ITSysFaceDistinguishService tSysFaceDistinguishService;
+
+    @Autowired
+    private ITSysPushOrderService tSysPushOrderService;
+
+    @Autowired
+    private ITSysCancleOrderService tSysCancleOrderService;
+
+    @Autowired
+    private ITPhoneService tPhoneService;
+
+
+    /**
+     * 跳转到系统设置首页
+     */
+    @RequestMapping("")
+    public String index(Model model) {
+        //改派设置
+        TSysReformist reformist = tSysReformistService.selectOne(new EntityWrapper<TSysReformist>().eq("companyId", ShiroKit.getUser().getObjectId()));
+        model.addAttribute("reformist",reformist);
+        //积分设置
+        TSysIntegral integral = tSysIntegralService.selectOne(new EntityWrapper<TSysIntegral>().eq("companyId", ShiroKit.getUser().getObjectId()));
+        model.addAttribute("integral",integral);
+        //人脸识别
+        TSysFaceDistinguish faceDistinguish = tSysFaceDistinguishService.selectOne(new EntityWrapper<TSysFaceDistinguish>().eq("companyId", ShiroKit.getUser().getObjectId()));
+        model.addAttribute("faceDistinguish",faceDistinguish);
+
+        //专车推单(第一轮)
+        TSysPushOrder zcOne = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 1).eq("type", 1));
+        model.addAttribute("zcOne",zcOne);
+        //专车推单(第二轮)
+        TSysPushOrder zcTwo = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 1).eq("type", 2));
+        model.addAttribute("zcTwo",zcTwo);
+        //专车推单(第三轮)
+        TSysPushOrder zcThree = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 1).eq("type", 3));
+        model.addAttribute("zcThree",zcThree);
+
+        //出租车推单(第一轮)
+        TSysPushOrder czcOne = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 2).eq("type", 1));
+        model.addAttribute("czcOne",czcOne);
+        //出租车推单(第二轮)
+        TSysPushOrder czcTwo = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 2).eq("type", 2));
+        model.addAttribute("czcTwo",czcTwo);
+        //出租车推单(第三轮)
+        TSysPushOrder czcThree = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 2).eq("type", 3));
+        model.addAttribute("czcThree",czcThree);
+
+        //普通取消设置(专车)
+        TSysCancleOrder ptCancel1 = tSysCancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 1).eq("orderType", 1));
+        model.addAttribute("ptCancel1",ptCancel1);
+        //普通取消设置(出租车)
+        TSysCancleOrder ptCancel2 = tSysCancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 1).eq("orderType", 2));
+        model.addAttribute("ptCancel2",ptCancel2);
+        //普通取消设置(跨城出行)
+        TSysCancleOrder ptCancel3 = tSysCancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 1).eq("orderType", 3));
+        model.addAttribute("ptCancel3",ptCancel3);
+
+        //预约取消设置(专车)
+        TSysCancleOrder yyCancel1 = tSysCancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 2).eq("orderType", 1));
+        model.addAttribute("yyCancel1",yyCancel1);
+        //预约取消设置(出租车)
+        TSysCancleOrder yyCancel2 = tSysCancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 2).eq("orderType", 2));
+        model.addAttribute("yyCancel2",yyCancel2);
+
+        //报警电话
+        TPhone phone1 = tPhoneService.selectOne(new EntityWrapper<TPhone>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 1));
+        model.addAttribute("phone1",phone1);
+        //客服电话
+        TPhone phone2 = tPhoneService.selectOne(new EntityWrapper<TPhone>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 2));
+        model.addAttribute("phone2",phone2);
+        //客服电话
+        TPhone phone3 = tPhoneService.selectOne(new EntityWrapper<TPhone>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 3));
+        model.addAttribute("phone3",phone3);
+        return PREFIX + "tSysReformist.html";
+    }
+
+
+    /**
+     * 删除系统设置
+     */
+    @RequestMapping(value = "/setUp")
+    @ResponseBody
+    public Object setUp(@RequestParam BigDecimal one, @RequestParam Integer two, @RequestParam Integer three, @RequestParam Integer openValue,
+                        @RequestParam Integer isSpecialCar,@RequestParam Integer isTaxiCar,
+                        @RequestParam Double zc1,@RequestParam Integer zc2,@RequestParam Double zc3,
+                        @RequestParam Double zc4,@RequestParam Integer zc5,@RequestParam Double zc6,
+                        @RequestParam Double zc7,@RequestParam Integer zc8,@RequestParam Double zc9,
+                        @RequestParam Double czc1,@RequestParam Integer czc2,@RequestParam Double czc3,
+                        @RequestParam Double czc4,@RequestParam Integer czc5,@RequestParam Double czc6,
+                        @RequestParam Double czc7,@RequestParam Integer czc8,@RequestParam Double czc9,
+                        @RequestParam Integer ptCancel1,@RequestParam BigDecimal ptCancel2,@RequestParam Integer ptCancel3,@RequestParam BigDecimal ptCancel4,@RequestParam Integer ptCancel5,@RequestParam BigDecimal ptCancel6,
+                        @RequestParam Integer yyCancel1,@RequestParam BigDecimal yyCancel2,@RequestParam Integer yyCancel3,@RequestParam BigDecimal yyCancel4,
+                        @RequestParam String phone1,@RequestParam String phone2,@RequestParam String phone3) {
+        //改派设置
+        TSysReformist reformist = tSysReformistService.selectOne(new EntityWrapper<TSysReformist>().eq("companyId", ShiroKit.getUser().getObjectId()));
+        if (SinataUtil.isNotEmpty(reformist)){
+            reformist.setMoney(one);
+            reformist.setIsSpecialCar(isSpecialCar);
+            reformist.setIsTaxiCar(isTaxiCar);
+            tSysReformistService.updateById(reformist);
+        }else{
+            reformist = new TSysReformist();
+            reformist.setCompanyId(ShiroKit.getUser().getObjectId());
+            reformist.setMoney(one);
+            reformist.setIsSpecialCar(isSpecialCar);
+            reformist.setIsTaxiCar(isTaxiCar);
+            tSysReformistService.insert(reformist);
+        }
+
+        //积分设置
+        TSysIntegral integral = tSysIntegralService.selectOne(new EntityWrapper<TSysIntegral>().eq("companyId", ShiroKit.getUser().getObjectId()));
+        if (SinataUtil.isNotEmpty(integral)){
+            integral.setIntegral(two);
+            tSysIntegralService.updateById(integral);
+        }else{
+            integral = new TSysIntegral();
+            integral.setCompanyId(ShiroKit.getUser().getObjectId());
+            integral.setIntegral(two);
+            tSysIntegralService.insert(integral);
+        }
+
+        //人脸识别
+        TSysFaceDistinguish faceDistinguish = tSysFaceDistinguishService.selectOne(new EntityWrapper<TSysFaceDistinguish>().eq("companyId", ShiroKit.getUser().getObjectId()));
+        if (SinataUtil.isNotEmpty(faceDistinguish)){
+            faceDistinguish.setIsOpen(three);
+            faceDistinguish.setMinuteNum(openValue);
+            tSysFaceDistinguishService.updateById(faceDistinguish);
+        }else{
+            faceDistinguish = new TSysFaceDistinguish();
+            faceDistinguish.setIsOpen(three);
+            faceDistinguish.setMinuteNum(openValue);
+            faceDistinguish.setCompanyId(ShiroKit.getUser().getObjectId());
+            tSysFaceDistinguishService.insert(faceDistinguish);
+        }
+
+        //专车推单(第一轮)
+        TSysPushOrder zcOne = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 1).eq("type", 1));
+        if (SinataUtil.isNotEmpty(zcOne)){
+            zcOne.setPushDistance(zc1);
+            zcOne.setPushTime(zc2);
+            zcOne.setDriverProportion(zc3);
+            tSysPushOrderService.updateById(zcOne);
+        }else{
+            zcOne = new TSysPushOrder();
+            zcOne.setPushDistance(zc1);
+            zcOne.setPushTime(zc2);
+            zcOne.setDriverProportion(zc3);
+            zcOne.setCompanyId(ShiroKit.getUser().getObjectId());
+            zcOne.setPushType(1);
+            zcOne.setType(1);
+            tSysPushOrderService.insert(zcOne);
+        }
+        //专车推单(第二轮)
+        TSysPushOrder zcTwo = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 1).eq("type", 2));
+        if (SinataUtil.isNotEmpty(zcTwo)){
+            zcTwo.setPushDistance(zc4);
+            zcTwo.setPushTime(zc5);
+            zcTwo.setDriverProportion(zc6);
+            tSysPushOrderService.updateById(zcTwo);
+        }else{
+            zcTwo = new TSysPushOrder();
+            zcTwo.setPushDistance(zc4);
+            zcTwo.setPushTime(zc5);
+            zcTwo.setDriverProportion(zc6);
+            zcTwo.setCompanyId(ShiroKit.getUser().getObjectId());
+            zcTwo.setPushType(1);
+            zcTwo.setType(2);
+            tSysPushOrderService.insert(zcTwo);
+        }
+        //专车推单(第三轮)
+        TSysPushOrder zcThree = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 1).eq("type", 3));
+        if (SinataUtil.isNotEmpty(zcThree)){
+            zcThree.setPushDistance(zc7);
+            zcThree.setPushTime(zc8);
+            zcThree.setDriverProportion(zc9);
+            tSysPushOrderService.updateById(zcThree);
+        }else{
+            zcThree = new TSysPushOrder();
+            zcThree.setPushDistance(zc7);
+            zcThree.setPushTime(zc8);
+            zcThree.setDriverProportion(zc9);
+            zcThree.setCompanyId(ShiroKit.getUser().getObjectId());
+            zcThree.setPushType(1);
+            zcThree.setType(3);
+            tSysPushOrderService.insert(zcThree);
+        }
+
+        //出租车推单(第一轮)
+        TSysPushOrder czcOne = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 2).eq("type", 1));
+        if (SinataUtil.isNotEmpty(czcOne)){
+            czcOne.setPushDistance(czc1);
+            czcOne.setPushTime(czc2);
+            czcOne.setDriverProportion(czc3);
+            tSysPushOrderService.updateById(czcOne);
+        }else{
+            czcOne = new TSysPushOrder();
+            czcOne.setPushDistance(czc1);
+            czcOne.setPushTime(czc2);
+            czcOne.setDriverProportion(czc3);
+            czcOne.setCompanyId(ShiroKit.getUser().getObjectId());
+            czcOne.setPushType(2);
+            czcOne.setType(1);
+            tSysPushOrderService.insert(czcOne);
+        }
+        //出租车推单(第二轮)
+        TSysPushOrder czcTwo = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 2).eq("type", 2));
+        if (SinataUtil.isNotEmpty(czcTwo)){
+            czcTwo.setPushDistance(czc4);
+            czcTwo.setPushTime(czc5);
+            czcTwo.setDriverProportion(czc6);
+            tSysPushOrderService.updateById(czcTwo);
+        }else{
+            czcTwo = new TSysPushOrder();
+            czcTwo.setPushDistance(czc4);
+            czcTwo.setPushTime(czc5);
+            czcTwo.setDriverProportion(czc6);
+            czcTwo.setCompanyId(ShiroKit.getUser().getObjectId());
+            czcTwo.setPushType(2);
+            czcTwo.setType(2);
+            tSysPushOrderService.insert(czcTwo);
+        }
+        //出租车推单(第三轮)
+        TSysPushOrder czcThree = tSysPushOrderService.selectOne(new EntityWrapper<TSysPushOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("pushType", 2).eq("type", 3));
+        if (SinataUtil.isNotEmpty(czcThree)){
+            czcThree.setPushDistance(czc7);
+            czcThree.setPushTime(czc8);
+            czcThree.setDriverProportion(czc9);
+            tSysPushOrderService.updateById(czcThree);
+        }else{
+            czcThree = new TSysPushOrder();
+            czcThree.setPushDistance(czc7);
+            czcThree.setPushTime(czc8);
+            czcThree.setDriverProportion(czc9);
+            czcThree.setCompanyId(ShiroKit.getUser().getObjectId());
+            czcThree.setPushType(2);
+            czcThree.setType(3);
+            tSysPushOrderService.insert(czcThree);
+        }
+
+        //普通取消设置(专车)
+        TSysCancleOrder ptCancelOne = tSysCancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 1).eq("orderType", 1));
+        if (SinataUtil.isNotEmpty(ptCancelOne)){
+            ptCancelOne.setMinuteNum(ptCancel1);
+            ptCancelOne.setMoney(ptCancel2);
+            tSysCancleOrderService.updateById(ptCancelOne);
+        }else{
+            ptCancelOne = new TSysCancleOrder();
+            ptCancelOne.setMinuteNum(ptCancel1);
+            ptCancelOne.setMoney(ptCancel2);
+            ptCancelOne.setCompanyId(ShiroKit.getUser().getObjectId());
+            ptCancelOne.setType(1);
+            ptCancelOne.setOrderType(1);
+            tSysCancleOrderService.insert(ptCancelOne);
+        }
+
+        //普通取消设置(出租车)
+        TSysCancleOrder ptCancelTwo = tSysCancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 1).eq("orderType", 2));
+        if (SinataUtil.isNotEmpty(ptCancelTwo)){
+            ptCancelTwo.setMinuteNum(ptCancel3);
+            ptCancelTwo.setMoney(ptCancel4);
+            tSysCancleOrderService.updateById(ptCancelTwo);
+        }else{
+            ptCancelTwo = new TSysCancleOrder();
+            ptCancelTwo.setMinuteNum(ptCancel3);
+            ptCancelTwo.setMoney(ptCancel4);
+            ptCancelTwo.setCompanyId(ShiroKit.getUser().getObjectId());
+            ptCancelTwo.setType(1);
+            ptCancelTwo.setOrderType(2);
+            tSysCancleOrderService.insert(ptCancelTwo);
+        }
+
+        //普通取消设置(跨城出行)
+        TSysCancleOrder ptCancelThree = tSysCancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 1).eq("orderType", 3));
+        if (SinataUtil.isNotEmpty(ptCancelThree)){
+            ptCancelThree.setMinuteNum(ptCancel5);
+            ptCancelThree.setMoney(ptCancel6);
+            tSysCancleOrderService.updateById(ptCancelThree);
+        }else{
+            ptCancelThree = new TSysCancleOrder();
+            ptCancelThree.setMinuteNum(ptCancel5);
+            ptCancelThree.setMoney(ptCancel6);
+            ptCancelThree.setCompanyId(ShiroKit.getUser().getObjectId());
+            ptCancelThree.setType(1);
+            ptCancelThree.setOrderType(3);
+            tSysCancleOrderService.insert(ptCancelThree);
+        }
+
+        //预约取消设置(专车)
+        TSysCancleOrder yyCancelOne = tSysCancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 2).eq("orderType", 1));
+        if (SinataUtil.isNotEmpty(yyCancelOne)){
+            yyCancelOne.setMinuteNum(yyCancel1);
+            yyCancelOne.setMoney(yyCancel2);
+            tSysCancleOrderService.updateById(yyCancelOne);
+        }else{
+            yyCancelOne = new TSysCancleOrder();
+            yyCancelOne.setMinuteNum(yyCancel1);
+            yyCancelOne.setMoney(yyCancel2);
+            yyCancelOne.setCompanyId(ShiroKit.getUser().getObjectId());
+            yyCancelOne.setType(2);
+            yyCancelOne.setOrderType(1);
+            tSysCancleOrderService.insert(yyCancelOne);
+        }
+        //预约取消设置(出租车)
+        TSysCancleOrder yyCancelTwo = tSysCancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 2).eq("orderType", 2));
+        if (SinataUtil.isNotEmpty(yyCancelTwo)){
+            yyCancelTwo.setMinuteNum(yyCancel3);
+            yyCancelTwo.setMoney(yyCancel4);
+            tSysCancleOrderService.updateById(yyCancelTwo);
+        }else{
+            yyCancelTwo = new TSysCancleOrder();
+            yyCancelTwo.setMinuteNum(yyCancel3);
+            yyCancelTwo.setMoney(yyCancel4);
+            yyCancelTwo.setCompanyId(ShiroKit.getUser().getObjectId());
+            yyCancelTwo.setType(2);
+            yyCancelTwo.setOrderType(2);
+            tSysCancleOrderService.insert(yyCancelTwo);
+        }
+
+        //报警电话
+        TPhone phoneOne = tPhoneService.selectOne(new EntityWrapper<TPhone>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 1));
+        if (SinataUtil.isNotEmpty(phoneOne)){
+            phoneOne.setPhone(phone1);
+            tPhoneService.updateById(phoneOne);
+        }else{
+            phoneOne = new TPhone();
+            phoneOne.setPhone(phone1);
+            phoneOne.setCompanyId(ShiroKit.getUser().getObjectId());
+            phoneOne.setType(1);
+            if (ShiroKit.getUser().getRoleType() == 1){
+                phoneOne.setPlatform(1);
+            }else{
+                phoneOne.setPlatform(2);
+            }
+            tPhoneService.insert(phoneOne);
+        }
+        //客服电话
+        TPhone phoneTwo = tPhoneService.selectOne(new EntityWrapper<TPhone>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 2));
+        if (SinataUtil.isNotEmpty(phoneTwo)){
+            phoneTwo.setPhone(phone2);
+            tPhoneService.updateById(phoneTwo);
+        }else{
+            phoneTwo = new TPhone();
+            phoneTwo.setPhone(phone2);
+            phoneTwo.setCompanyId(ShiroKit.getUser().getObjectId());
+            phoneTwo.setType(2);
+            if (ShiroKit.getUser().getRoleType() == 1){
+                phoneTwo.setPlatform(1);
+            }else{
+                phoneTwo.setPlatform(2);
+            }
+            tPhoneService.insert(phoneTwo);
+        }
+
+        //客服电话
+        TPhone phone = tPhoneService.selectOne(new EntityWrapper<TPhone>().eq("companyId", ShiroKit.getUser().getObjectId()).eq("type", 3));
+        if (SinataUtil.isNotEmpty(phone)){
+            phone.setPhone(phone3);
+            tPhoneService.updateById(phone);
+        }else{
+            phone = new TPhone();
+            phone.setPhone(phone3);
+            phone.setCompanyId(ShiroKit.getUser().getObjectId());
+            phone.setType(3);
+            if (ShiroKit.getUser().getRoleType() == 1){
+                phone.setPlatform(1);
+            }else{
+                phone.setPlatform(2);
+            }
+            tPhoneService.insert(phone);
+        }
+        return SUCCESS_TIP;
+    }
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSysSensitiveWordsController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSysSensitiveWordsController.java
new file mode 100644
index 0000000..e5b3281
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSysSensitiveWordsController.java
@@ -0,0 +1,97 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TSysSensitiveWords;
+import com.stylefeng.guns.modular.system.service.ITSysSensitiveWordsService;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 敏感词管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-09 19:45:29
+ */
+@Controller
+@RequestMapping("/tSysSensitiveWords")
+public class TSysSensitiveWordsController extends BaseController {
+
+    private String PREFIX = "/system/tSysSensitiveWords/";
+
+    @Autowired
+    private ITSysSensitiveWordsService tSysSensitiveWordsService;
+
+    /**
+     * 跳转到敏感词管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tSysSensitiveWords.html";
+    }
+
+    /**
+     * 跳转到添加敏感词管理
+     */
+    @RequestMapping("/tSysSensitiveWords_add")
+    public String tSysSensitiveWordsAdd() {
+        return PREFIX + "tSysSensitiveWords_add.html";
+    }
+
+    /**
+     * 获取敏感词管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime,
+                       String content) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tSysSensitiveWordsService.getSensitiveWordList(page,beginTime,endTime,content));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增敏感词管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TSysSensitiveWords tSysSensitiveWords) {
+        tSysSensitiveWords.setCreateTime(new Date());
+        tSysSensitiveWordsService.insert(tSysSensitiveWords);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除敏感词管理
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tSysSensitiveWordsId) {
+        tSysSensitiveWordsService.deleteById(tSysSensitiveWordsId);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TUserController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TUserController.java
new file mode 100644
index 0000000..43b860b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TUserController.java
@@ -0,0 +1,588 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.*;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.ITCompanyService;
+import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
+import com.stylefeng.guns.modular.system.util.PushURL;
+import org.apache.commons.lang.time.DateUtils;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.ui.Model;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.modular.system.service.ITUserService;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 用户管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-01 15:47:58
+ */
+@Controller
+@RequestMapping("/tUser")
+public class TUserController extends BaseController {
+
+    private String PREFIX = "/system/tUser/";
+
+    @Autowired
+    private ITUserService tUserService;
+
+    /**
+     * 跳转到用户管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tUser.html";
+    }
+
+    /**
+     * 跳转到修改用户管理
+     */
+    @RequestMapping("/tUser_userDetail/{tUserId}")
+    public String tUser_userDetail(@PathVariable Integer tUserId, Model model) {
+        Map<String,Object> tUser = tUserService.getUserDetailById(tUserId);
+        model.addAttribute("item",tUser);
+        return PREFIX + "tUser_userDetail.html";
+    }
+
+    /**
+     * 跳转到修改用户余额页面
+     */
+    @RequestMapping("/tUser_updateBalance/{tUserId}")
+    public String tUser_updateBalance(@PathVariable Integer tUserId, Model model) {
+        model.addAttribute("tUserId",tUserId);
+        return PREFIX + "tUser_updateBalance.html";
+    }
+
+    /**
+     * 跳转到修改用户密码页面
+     */
+    @RequestMapping("/tUser_updatePassword/{tUserId}")
+    public String tUser_updatePassword(@PathVariable Integer tUserId, Model model) {
+        model.addAttribute("tUserId",tUserId);
+        return PREFIX + "tUser_updatePassword.html";
+    }
+
+    /**
+     * 跳转到修改用户状态页面
+     */
+    @RequestMapping("/tUser_optUser/{tUserId}/{optType}")
+    public String tUser_optUser(@PathVariable Integer tUserId,@PathVariable Integer optType, Model model) {
+        model.addAttribute("tUserId",tUserId);
+        model.addAttribute("optType",optType);
+        return PREFIX + "tUser_optUser.html";
+    }
+
+    /**
+     * 获取用户管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String id,
+                       String nickName,
+                       String phone,
+                       Integer isAuth,
+                       Integer state,String companyName) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tUserService.getUserList(page,beginTime,endTime,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),isAuth,state,id,nickName,phone,companyName));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 修改余额操作
+     */
+    @RequestMapping(value = "/updateBalance")
+    @ResponseBody
+    public Object updateBalance(@RequestParam Integer tUserId,
+                                @RequestParam Integer updateType,
+                                @RequestParam BigDecimal money) {
+        TUser tUser = tUserService.selectById(tUserId);
+        if (SinataUtil.isNotEmpty(tUser)){
+            if (1 == updateType.intValue()){  //增加
+                tUser.setBalance(tUser.getBalance().add(money));
+            }else if (2 == updateType.intValue()){  //减少
+                if((tUser.getBalance().subtract(money)).compareTo(new BigDecimal(0)) == -1){
+                    tUser.setBalance(new BigDecimal(0));
+                }else{
+                    tUser.setBalance(tUser.getBalance().subtract(money));
+                }
+            }
+            tUser.setUpdateTime(new Date());
+            tUser.setUpdateUser(ShiroKit.getUser().getId());
+            tUserService.updateById(tUser);
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改密码操作
+     */
+    @RequestMapping(value = "/updatePassword")
+    @ResponseBody
+    public Object updatePassword(@RequestParam Integer tUserId,
+                                @RequestParam String password) {
+        TUser tUser = tUserService.selectById(tUserId);
+        if (SinataUtil.isNotEmpty(tUser)){
+//            tUser.setPassWord(MD5Util.encrypt(password));
+            tUser.setPassWord(ShiroKit.md5(password, "&a.s"));
+            tUser.setUpdateTime(new Date());
+            tUser.setUpdateUser(ShiroKit.getUser().getId());
+            tUserService.updateById(tUser);
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 操作用户
+     */
+    @RequestMapping(value = "/optUser")
+    @ResponseBody
+    public Object optUser(@RequestParam Integer tUserId,@RequestParam Integer optType,@RequestParam String remark) {
+        TUser tUser = tUserService.selectById(tUserId);
+        if (SinataUtil.isNotEmpty(tUser)){
+            if (1 == optType.intValue()){   //冻结
+                tUser.setState(2);
+                tUser.setRemark(remark);
+
+                //增加推送
+                Map<String,String> map = new HashMap<>();
+                map.put("uid", tUser.getId().toString());
+                String result = HttpRequestUtil.postRequest(PushURL.freeze_user_url, map);
+                System.out.println("冻结用户:【userId="+tUser.getId().toString()+"】,调用接口:"+result);
+
+            }else if (2 == optType.intValue()){  //解冻
+                tUser.setState(1);
+                tUser.setRemark(remark);
+            }
+            tUser.setUpdateTime(new Date());
+            tUser.setUpdateUser(ShiroKit.getUser().getId());
+            tUserService.updateById(tUser);
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 下载模板
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/uploadUserModel")
+    public void uploadUserModel(HttpServletRequest request, HttpServletResponse response) {
+        // 表格数据【封装】
+        List<List<String>> dataList = new ArrayList<List<String>>();
+
+        // 首行【封装】
+        List<String> shellList = new ArrayList<String>();
+        shellList.add("昵称");
+        shellList.add("手机号");
+        shellList.add("生日[例如:1995-09-09]");
+        shellList.add("性别[男/女]");
+        shellList.add("紧急联系人[选填]");
+        shellList.add("紧急联系电话[选填]");
+        shellList.add("是否实名认证[是/否]");
+        shellList.add("真实姓名");
+        shellList.add("身份证号");
+        shellList.add("余额");
+        shellList.add("密码[6-18个长度]");
+        dataList.add(shellList);
+
+        try {
+            // 调用工具类进行导出
+            ExcelExportUtil.easySheet("平台导入用户模板"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "平台导入用户模板", dataList, request, response);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 导入操作
+     * @param request
+     * @return
+     */
+    @RequestMapping(value="/exportUser",method = RequestMethod.POST)
+    @ResponseBody
+    public Object exportUser(HttpServletRequest request){
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        MultipartFile file = (MultipartFile) multipartRequest.getFile("myfile");
+        try {
+            //定时五秒后执行
+            /*Map<String,Object> maps=new HashMap<>();
+            Workbook book = WoUtil.ImportFile(file);
+            maps.put("book",book);
+            QuartzManager.addJob(AddContract.class, (AddContract.name+new Date().getTime()).toUpperCase(), TimeJobType.ADMIN,DateUtil.getDate_strYMdHms(new Date().getTime() + 1*1000) , maps);*/
+
+            Workbook book = WoUtil.ImportFile(file);
+            Sheet sh = book.getSheetAt(0);   //获取到第一个表
+            for (int i = 1; i <= sh.getLastRowNum(); i++) {
+                Row row = sh.getRow(i);
+
+                Cell cell0 = row.getCell(0);  //昵称
+                String nickName = null;
+                if (SinataUtil.isNotEmpty(cell0)){
+                    nickName = String.valueOf(cell0.getStringCellValue()).trim();
+                }
+
+                Cell cell1 = row.getCell(1);  //手机号
+                String phone = null;
+                if (SinataUtil.isNotEmpty(cell1)){
+                    phone = String.valueOf(cell1.getStringCellValue()).trim();
+                }
+
+                Cell cell2 = row.getCell(2);  //生日[例如:1995-09-09]
+                String birthday = null;
+                if (SinataUtil.isNotEmpty(cell2)){
+                    birthday = String.valueOf(cell2.getStringCellValue()).trim();
+                }
+
+                Cell cell3 = row.getCell(3);  //性别[男/女]
+                String sex = null;
+                if (SinataUtil.isNotEmpty(cell3)){
+                    sex = String.valueOf(cell3.getStringCellValue()).trim();
+                }
+
+                Cell cell4 = row.getCell(4);  //紧急联系人[选填]
+                String emergencyContact = null;
+                if (SinataUtil.isNotEmpty(cell4)){
+                    emergencyContact = String.valueOf(cell4.getStringCellValue()).trim();
+                }
+
+                Cell cell5 = row.getCell(5);  //紧急联系电话[选填]
+                String emergencyContactNumber = null;
+                if (SinataUtil.isNotEmpty(cell5)){
+                    emergencyContactNumber = String.valueOf(cell5.getStringCellValue()).trim();
+                }
+
+                Cell cell6 = row.getCell(6);  //是否实名认证[是/否]
+                String isAuth = null;
+                if (SinataUtil.isNotEmpty(cell6)){
+                    isAuth = String.valueOf(cell6.getStringCellValue()).trim();
+                }
+
+                Cell cell7 = row.getCell(7);  //真实姓名
+                String name = null;
+                if (SinataUtil.isNotEmpty(cell7)){
+                    name = String.valueOf(cell7.getStringCellValue()).trim();
+                }
+
+                Cell cell8 = row.getCell(8);  //身份证号
+                String idCard = null;
+                if (SinataUtil.isNotEmpty(cell8)){
+                    idCard = String.valueOf(cell8.getStringCellValue()).trim();
+                }
+
+                Cell cell9 = row.getCell(9);  //余额
+                String balance = null;
+                if (SinataUtil.isNotEmpty(cell9)){
+                    balance = String.valueOf(cell9.getStringCellValue()).trim();
+                }
+
+                Cell cell10 = row.getCell(10);  //密码
+                String passWord = null;
+                if (SinataUtil.isNotEmpty(cell10)){
+                    passWord = String.valueOf(cell10.getStringCellValue()).trim();
+                }
+
+                if (SinataUtil.isEmpty(nickName) || SinataUtil.isEmpty(phone) || SinataUtil.isEmpty(birthday)
+                        || SinataUtil.isEmpty(sex) || SinataUtil.isEmpty(isAuth) || SinataUtil.isEmpty(balance)
+                        || SinataUtil.isEmpty(passWord) ){
+                    return new ErrorTip(500, "单元格不能为空");
+                }else{
+                    int count = tUserService.selectCount(new EntityWrapper<TUser>().eq("phone", phone).notIn("flag", 3));
+                    if (count > 0){
+                        return new ErrorTip(500, "手机号已存在,请重新填写");
+                    }
+                    //判断性别
+                    if (!sex.equals("男") && !sex.equals("女")){
+                        return new ErrorTip(500, "性别内容不正确");
+                    }
+                    //判断是否实名认证
+                    if (!isAuth.equals("是") && !isAuth.equals("否")){
+                        return new ErrorTip(500, "是否实名认证内容不正确");
+                    }
+                    if ("是".equals(isAuth)){
+                        //判断紧急联系电话
+                        if (SinataUtil.isNotEmpty(emergencyContactNumber)){
+                            if (!isPhone(emergencyContactNumber)){
+                                return new ErrorTip(500, "紧急联系电话格式不正确");
+                            }
+                        }
+                    }
+                    //判断生日格式
+                    try {
+                        if (!isValidDate(birthday)) {
+                            birthday = importByExcelForDate(birthday);
+                        }
+                    }catch (Exception e){
+                        return new ErrorTip(500, "年检到期时间格式不正确");
+                    }
+                    //判断手机号
+                    if (!isPhone(phone)){
+                        return new ErrorTip(500, "手机号格式不正确");
+                    }
+                    //判断余额
+                    if (!isDouble(balance)){
+                        return new ErrorTip(500, "余额格式不正确");
+                    }
+                    //判断登录密码
+                    if (!isPassword(passWord)){
+                        return new ErrorTip(500, "登录密码格式不正确");
+                    }
+                    TUser user = new TUser();
+                    TCompany company = itCompanyService.selectOne(new EntityWrapper<TCompany>().eq("type", 1).notIn("flag", 3).last(" limit 1"));
+                    user.setCompanyId(company.getId());
+                    user.setPhone(phone);
+                    user.setNickName(nickName);
+                    user.setBirthday(DateUtil.parseDate(birthday));
+                    if (sex.equals("男")){
+                        user.setSex(1);
+                    }else if (sex.equals("女")){
+                        user.setSex(2);
+                    }
+                    user.setEmergencyContact(emergencyContact);
+                    user.setEmergencyContactNumber(emergencyContactNumber);
+                    if ("是".equals(isAuth)){
+                        user.setIsAuth(2);
+                    }else if ("否".equals(isAuth)){
+                        user.setIsAuth(1);
+                    }
+                    user.setName(name);
+                    user.setIdCard(idCard);
+                    user.setBalance(new BigDecimal(balance));
+                    user.setPassWord(ShiroKit.md5(passWord, "&a.s"));
+                    user.setState(1);
+                    user.setFlag("1");
+                    user.setInsertTime(new Date());
+                    user.setInsertUser(ShiroKit.getUser().getId());
+                    tUserService.insert(user);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return SUCCESS_TIP;
+    }
+
+    @Autowired
+    private ITCompanyService itCompanyService;
+
+    /**
+     * 判断日期是否满足yyyy-MM-dd格式
+     * @param str
+     * @return
+     */
+    public static boolean isValidDate(String str) {
+        boolean convertSuccess=true;
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            format.setLenient(false);
+            format.parse(str);
+        } catch (Exception e) {
+            convertSuccess=false;
+        }
+        return convertSuccess;
+    }
+
+
+    /**
+     * 转换日期
+     * @return
+     */
+    public static String importByExcelForDate(String value) {//value就是它的天数
+        String currentCellValue = "";
+        if(value != null && !value.equals("")){
+            Calendar calendar = new GregorianCalendar(1900,0,-1);
+            Date d = calendar.getTime();
+            Date dd = DateUtils.addDays(d,Integer.valueOf(value));
+            DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
+            currentCellValue = formater.format(dd);
+        }
+        return currentCellValue;
+    }
+
+    /**
+     * 验证手机号格式是否正确
+     * @param str
+     * @return
+     */
+    public static boolean isPhone(String str) {
+        try{
+            String reg = "^1\\d{10}$";
+            boolean flag = str.matches(reg);
+            return flag;
+        }catch(NumberFormatException e) {
+            System.out.println("异常:\"" + str + "\"...");
+            return false;
+        }
+    }
+
+    /**
+     * 验证密码长度是否正确
+     * @param str
+     * @return
+     */
+    public static boolean isPassword(String str) {
+        try{
+            String reg = "^.{6,18}$";
+            boolean flag = str.matches(reg);
+            return flag;
+        }catch(NumberFormatException e) {
+            System.out.println("异常:\"" + str + "\"...");
+            return false;
+        }
+    }
+
+    /**
+     * 验证是否可以字符转为金额值
+     * @param str
+     * @return
+     */
+    public static boolean isDouble(String str) {
+        try{
+            Double.parseDouble(str);
+            return true;
+        }catch(NumberFormatException e) {
+            System.out.println("异常:\"" + str + "\"不是数字/整数/小数...");
+            return false;
+        }
+    }
+
+    /**
+     *  导出用户信息
+     */
+    @RequestMapping(value = "/outUser")
+    public void outUser(HttpServletRequest request, HttpServletResponse response) {
+        List<Map<String,Object>> listMap = tUserService.getUserListNoPage(ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId());
+
+        // 表格数据【封装】
+        List<List<String>> dataList = new ArrayList<>();
+
+        //第一行显示【封装】
+        List<String> twoList = new ArrayList<String>();
+        twoList.add("总计:");
+        twoList.add(String.valueOf(listMap.size())+"条");
+        dataList.add(twoList);
+
+        // 列【封装】
+        List<String> shellList = new ArrayList<String>();
+        shellList.add("注册时间");
+        shellList.add("用户ID");
+        shellList.add("注册地所属分公司");
+        shellList.add("昵称");
+        shellList.add("手机号");
+        shellList.add("紧急联系人姓名");
+        shellList.add("紧急联系人电话");
+        shellList.add("是否实名认证");
+        shellList.add("历史出行次数");
+        shellList.add("历史消费");
+        shellList.add("积分");
+        shellList.add("备注");
+        shellList.add("状态");
+        dataList.add(shellList);
+
+        for (Map<String,Object> object : listMap){
+            // 详细数据列【封装】
+            shellList = new ArrayList<String>();
+            if(SinataUtil.isNotEmpty(object.get("insertTime"))){
+                shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("insertTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss"));
+            }else{
+                shellList.add("-");
+            }
+            shellList.add(String.valueOf(object.get("id")));
+            if(SinataUtil.isNotEmpty(object.get("companyName"))){
+                shellList.add(object.get("companyName").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("nickName"))){
+                shellList.add(object.get("nickName").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("phone"))){
+                shellList.add(object.get("phone").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("emergencyContact"))){
+                shellList.add(object.get("emergencyContact").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("emergencyContactNumber"))){
+                shellList.add(object.get("emergencyContactNumber").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("isAuth"))){
+                shellList.add(object.get("isAuth").toString().equals("是")?"是":"否");
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("historyNum"))){
+                shellList.add(object.get("historyNum").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("consumptionNum"))){
+                shellList.add(object.get("consumptionNum").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("integral"))){
+                shellList.add(object.get("integral").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("remark"))){
+                shellList.add(object.get("remark").toString());
+            }else{
+                shellList.add("-");
+            }
+            if(SinataUtil.isNotEmpty(object.get("state"))){
+                shellList.add(Integer.valueOf(object.get("state").toString()) == 1?"正常":"冻结");
+            }else{
+                shellList.add("-");
+            }
+            dataList.add(shellList);
+        }
+        try {
+            // 调用工具类进行导出
+            ExcelExportUtil.easySheet("用户信息导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "用户信息导出记录", dataList,request, response);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TUserRedPacketRecordController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TUserRedPacketRecordController.java
new file mode 100644
index 0000000..b23ca3a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TUserRedPacketRecordController.java
@@ -0,0 +1,123 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.service.IUserCouponRecordService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TUserRedPacketRecord;
+import com.stylefeng.guns.modular.system.service.ITUserRedPacketRecordService;
+
+import java.util.Map;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-07-10 15:33:49
+ */
+@Controller
+@RequestMapping("/tUserRedPacketRecord")
+public class TUserRedPacketRecordController extends BaseController {
+
+    private String PREFIX = "/system/tUserRedPacketRecord/";
+
+    @Autowired
+    private ITUserRedPacketRecordService tUserRedPacketRecordService;
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index(Model model,Integer couponActivityId) {
+        model.addAttribute("couponActivityId",couponActivityId);
+        return PREFIX + "tUserRedPacketRecord.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/tUserRedPacketRecord_add")
+    public String tUserRedPacketRecordAdd() {
+        return PREFIX + "tUserRedPacketRecord_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/tUserRedPacketRecord_update/{tUserRedPacketRecordId}")
+    public String tUserRedPacketRecordUpdate(@PathVariable Integer tUserRedPacketRecordId, Model model) {
+        TUserRedPacketRecord tUserRedPacketRecord = tUserRedPacketRecordService.selectById(tUserRedPacketRecordId);
+        model.addAttribute("item",tUserRedPacketRecord);
+        LogObjectHolder.me().set(tUserRedPacketRecord);
+        return PREFIX + "tUserRedPacketRecord_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime,String userName,String userPhone,Integer couponActivityId,Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(userCouponRecordService.getRedList(page,beginTime,endTime,userName,userPhone,couponActivityId,state));
+        return super.packForBT(page);
+    }
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TUserRedPacketRecord tUserRedPacketRecord) {
+        tUserRedPacketRecordService.insert(tUserRedPacketRecord);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tUserRedPacketRecordId) {
+        tUserRedPacketRecordService.deleteById(tUserRedPacketRecordId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TUserRedPacketRecord tUserRedPacketRecord) {
+        tUserRedPacketRecordService.updateById(tUserRedPacketRecord);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{tUserRedPacketRecordId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tUserRedPacketRecordId") Integer tUserRedPacketRecordId) {
+        return tUserRedPacketRecordService.selectById(tUserRedPacketRecordId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TVerifiedController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TVerifiedController.java
new file mode 100644
index 0000000..ba0088b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TVerifiedController.java
@@ -0,0 +1,136 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TSystemNotice;
+import com.stylefeng.guns.modular.system.model.TUser;
+import com.stylefeng.guns.modular.system.service.ITSystemNoticeService;
+import com.stylefeng.guns.modular.system.service.ITUserService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TVerified;
+import com.stylefeng.guns.modular.system.service.ITVerifiedService;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 实名认证列表控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-09 08:46:44
+ */
+@Controller
+@RequestMapping("/tVerified")
+public class TVerifiedController extends BaseController {
+
+    private String PREFIX = "/system/tVerified/";
+
+    @Autowired
+    private ITVerifiedService tVerifiedService;
+
+    @Autowired
+    private ITSystemNoticeService tSystemNoticeService;
+
+    @Autowired
+    private ITUserService tUserService;
+
+    /**
+     * 跳转到实名认证列表首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tVerified.html";
+    }
+
+    /**
+     * 跳转到添加实名认证列表
+     */
+    @RequestMapping("/tVerified_add")
+    public String tVerifiedAdd() {
+        return PREFIX + "tVerified_add.html";
+    }
+
+    /**
+     * 跳转到修改实名认证列表
+     */
+    @RequestMapping("/tVerified_immediately/{tVerifiedId}")
+    public String tVerifiedUpdate(@PathVariable Integer tVerifiedId, Model model) {
+        model.addAttribute("tVerifiedId",tVerifiedId);
+        return PREFIX + "tVerified_immediately.html";
+    }
+
+    /**
+     * 获取实名认证列表列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String userName,
+                       String userPhone,
+                       String name,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tVerifiedService.getVerifiedList(page,beginTime,endTime,userName,userPhone,name,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 立即审核操作
+     */
+    @RequestMapping(value = "/immediately")
+    @ResponseBody
+    public Object immediately(@RequestParam Integer id,@RequestParam Integer state) {
+        if (SinataUtil.isNotEmpty(id) && SinataUtil.isNotEmpty(state)){
+            TVerified tVerified = tVerifiedService.selectById(id);
+            tVerified.setState(state);
+            tVerifiedService.updateById(tVerified);
+
+            //增加系统消息
+            /*TSystemNotice notice = new TSystemNotice();
+            notice.setType(2);
+            notice.setUserType(2); //todo
+            if (2 == state){
+                notice.setContent("实名认证处理结果:【您的实名认证申请已通过审核】。");
+            }else if (3 == state){
+                notice.setContent("实名认证处理结果:【您的实名认证申请未通过审核】。");
+            }
+            notice.setUserId(tVerified.getUserId());
+            notice.setInsertTime(new Date());
+            notice.setRead(1);
+            tSystemNoticeService.insert(notice);*/
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除实名认证列表
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tVerifiedId) {
+        tVerifiedService.deleteById(tVerifiedId);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TVersionManagementController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TVersionManagementController.java
new file mode 100644
index 0000000..f687a33
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TVersionManagementController.java
@@ -0,0 +1,208 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.TPubWithdrawal;
+import com.stylefeng.guns.modular.system.util.OssUploadUtil;
+import com.stylefeng.guns.modular.system.util.PushMinistryOfTransportUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.ui.Model;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.modular.system.model.TVersionManagement;
+import com.stylefeng.guns.modular.system.service.ITVersionManagementService;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 版本管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-10 18:43:26
+ */
+@Controller
+@RequestMapping("/tVersionManagement")
+public class TVersionManagementController extends BaseController {
+
+    private String PREFIX = "/system/tVersionManagement/";
+
+    @Autowired
+    private ITVersionManagementService tVersionManagementService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+    /**
+     * 跳转到版本管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tVersionManagement.html";
+    }
+
+    /**
+     * 跳转到查看详情
+     */
+    @RequestMapping("/lookDetail/{id}/{type}")
+    public String lookDetail(@PathVariable Integer id, @PathVariable Integer type, Model model) {
+        TVersionManagement tVersionManagement = tVersionManagementService.selectById(id);
+        String str = "";
+        if (1 == type){
+            str = tVersionManagement.getContent();
+        }
+        model.addAttribute("str",str);
+        return "/system/tComplaint/lookDetail.html";
+    }
+
+    /**
+     * 跳转到添加版本管理
+     */
+    @RequestMapping("/tVersionManagement_add")
+    public String tVersionManagementAdd() {
+        return PREFIX + "tVersionManagement_add.html";
+    }
+
+    /**
+     * 跳转到修改版本管理
+     */
+    @RequestMapping("/tVersionManagement_update/{tVersionManagementId}")
+    public String tVersionManagementUpdate(@PathVariable Integer tVersionManagementId, Model model) {
+        TVersionManagement tVersionManagement = tVersionManagementService.selectById(tVersionManagementId);
+        model.addAttribute("item",tVersionManagement);
+        LogObjectHolder.me().set(tVersionManagement);
+        return PREFIX + "tVersionManagement_edit.html";
+    }
+
+    /**
+     * 获取版本管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String version) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tVersionManagementService.getVersionList(page,beginTime,endTime,version));
+        }
+        return super.packForBT(page);
+    }
+
+    @Autowired
+    private GunsProperties gunsProperties;
+
+    /**
+     * 异步上传包
+     * @param myfile
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/saveApk")
+    public Map<String, Object> saveApk(@RequestPart("myfile") MultipartFile myfile, HttpServletRequest request){
+        Map<String, Object> m = new HashMap<>();
+        /*try {
+            String pictureName = UUID.randomUUID().toString() + "." + ToolUtil.getFileSuffix(file.getOriginalFilename());
+            try {
+                String fileSavePath = gunsProperties.getFileUploadPath()+"apk\\";
+                file.transferTo(new File(fileSavePath + pictureName));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            m.put("imgUrl", gunsProperties.getPictureServerAddress()+"apk/"+pictureName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }*/
+        try {
+            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+            MultipartFile file = (MultipartFile) myfile;
+
+            String pictureName = OssUploadUtil.ossUpload(request, file);
+            m.put("imgUrl", pictureName);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return m;
+    }
+
+    /**
+     * 新增版本管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TVersionManagement tVersionManagement) {
+        //判断版本号是否相同
+        int count = tVersionManagementService.selectCount(
+                new EntityWrapper<TVersionManagement>()
+                        .eq("version", tVersionManagement.getVersion())
+                        .eq("type", tVersionManagement.getType()));
+        if (count > 0){
+            return "error";
+        }
+
+        tVersionManagement.setInsertTime(new Date());
+        tVersionManagementService.insert(tVersionManagement);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除版本管理
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tVersionManagementId) {
+        tVersionManagementService.deleteById(tVersionManagementId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改版本管理
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TVersionManagement tVersionManagement) {
+        int count = tVersionManagementService.selectCount(
+                new EntityWrapper<TVersionManagement>()
+                        .eq("version", tVersionManagement.getVersion())
+                        .eq("type", tVersionManagement.getType()));
+        if (count > 0){
+            return "error";
+        }
+        tVersionManagementService.updateById(tVersionManagement);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 版本管理详情
+     */
+    @RequestMapping(value = "/detail/{tVersionManagementId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tVersionManagementId") Integer tVersionManagementId) {
+        return tVersionManagementService.selectById(tVersionManagementId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityBalanceController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityBalanceController.java
new file mode 100644
index 0000000..61e66f9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityBalanceController.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.UserActivityBalance;
+import com.stylefeng.guns.modular.system.service.IUserActivityBalanceService;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-19 14:32:36
+ */
+@Controller
+@RequestMapping("/userActivityBalance")
+public class UserActivityBalanceController extends BaseController {
+
+    private String PREFIX = "/system/userActivityBalance/";
+
+    @Autowired
+    private IUserActivityBalanceService userActivityBalanceService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "userActivityBalance.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/userActivityBalance_add")
+    public String userActivityBalanceAdd() {
+        return PREFIX + "userActivityBalance_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/userActivityBalance_update/{userActivityBalanceId}")
+    public String userActivityBalanceUpdate(@PathVariable Integer userActivityBalanceId, Model model) {
+        UserActivityBalance userActivityBalance = userActivityBalanceService.selectById(userActivityBalanceId);
+        model.addAttribute("item",userActivityBalance);
+        LogObjectHolder.me().set(userActivityBalance);
+        return PREFIX + "userActivityBalance_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        return userActivityBalanceService.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(UserActivityBalance userActivityBalance) {
+        userActivityBalanceService.insert(userActivityBalance);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer userActivityBalanceId) {
+        userActivityBalanceService.deleteById(userActivityBalanceId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(UserActivityBalance userActivityBalance) {
+        userActivityBalanceService.updateById(userActivityBalance);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{userActivityBalanceId}")
+    @ResponseBody
+    public Object detail(@PathVariable("userActivityBalanceId") Integer userActivityBalanceId) {
+        return userActivityBalanceService.selectById(userActivityBalanceId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityController.java
new file mode 100644
index 0000000..51d1c3e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityController.java
@@ -0,0 +1,447 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.page.PageInfoBT;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-19 14:32:29
+ */
+@Controller
+@RequestMapping("/userActivity")
+public class UserActivityController extends BaseController {
+
+    private String PREFIX = "/system/userActivity/";
+
+    @Autowired
+    private IUserActivityService userActivityService;
+
+    @Autowired
+    private IUserActivityBalanceService userActivityBalanceService;
+
+    @Autowired
+    private IUserActivityDiscount1Service userActivityDiscount1Service;
+
+    @Autowired
+    private IUserActivityInviteService userActivityInviteService;
+
+    @Autowired
+    private IUserActivityRedenvelopeService userActivityRedenvelopeService;
+
+    @Autowired
+    private IUserActivityRegisteredService userActivityRegisteredService;
+
+    @Autowired
+    private ISysCouponRecordService sysCouponRecordService;
+
+    @Autowired
+    private ISysRedPacketRecordService sysRedPacketRecordService;
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+    @Autowired
+    private ITUserRedPacketRecordService redPacketRecordService;
+
+    /**
+     * 跳转领取统计
+     * @return
+     */
+    @RequestMapping("/receiveRecord")
+    public String receiveRecord(Model model,Integer activityId){
+        model.addAttribute("activityId",activityId);
+        UserActivity userActivity = userActivityService.selectById(activityId);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        model.addAttribute("startTime", sdf.format(userActivity.getStartTime()));
+        model.addAttribute("endTime", sdf.format(userActivity.getEndTime()));
+        UserActivityRegistered userActivityRegistered = userActivityRegisteredService.selectOne(new EntityWrapper<UserActivityRegistered>().eq("userActivityId",activityId));
+        UserActivityInvite userActivityInvite = userActivityInviteService.selectOne(new EntityWrapper<UserActivityInvite>().eq("userActivityId",activityId));
+        UserActivityDiscount1 userActivityDiscount1 = userActivityDiscount1Service.selectOne(new EntityWrapper<UserActivityDiscount1>().eq("userActivityId",activityId));
+        UserActivityRedenvelope userActivityRedenvelope = userActivityRedenvelopeService.selectOne(new EntityWrapper<UserActivityRedenvelope>().eq("userActivityId",activityId));
+        if(SinataUtil.isNotEmpty(userActivityRegistered)){
+            model.addAttribute("userActivityRegisteredId",userActivityRegistered.getId());
+        }else{
+            model.addAttribute("userActivityRegisteredId",0);
+        }
+        if(SinataUtil.isNotEmpty(userActivityInvite)){
+            model.addAttribute("userActivityInviteId",userActivityInvite.getId());
+        }else{
+            model.addAttribute("userActivityInviteId",0);
+        }
+        if(SinataUtil.isNotEmpty(userActivityDiscount1)){
+            model.addAttribute("userActivityDiscount1Id",userActivityDiscount1.getId());
+        }else{
+            model.addAttribute("userActivityDiscount1Id",0);
+        }
+        if(SinataUtil.isNotEmpty(userActivityRedenvelope)){
+            model.addAttribute("userActivityRedenvelopeId",userActivityRedenvelope.getId());
+        }else{
+            model.addAttribute("userActivityRedenvelopeId",0);
+        }
+        return PREFIX + "receiveRecord.html";
+    }
+
+    @RequestMapping(value = "/receiveRecordDetail")
+    @ResponseBody
+    public Object receiveRecordDetail(String createTime,Integer activityId) {
+        String startTimes = null;
+        String endTimes = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            startTimes = timeArray[0];
+            endTimes = timeArray[1];
+        }else{
+            UserActivity userActivity = userActivityService.selectById(activityId);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            startTimes=sdf.format(userActivity.getStartTime());
+            endTimes=sdf.format(userActivity.getEndTime());
+        }
+        Map<String,Object> map = new HashMap<>();
+        Double totalMOney=0d;
+        UserActivityRegistered userActivityRegistered = userActivityRegisteredService.selectOne(new EntityWrapper<UserActivityRegistered>().eq("userActivityId",activityId));
+        UserActivityInvite userActivityInvite = userActivityInviteService.selectOne(new EntityWrapper<UserActivityInvite>().eq("userActivityId",activityId));
+        UserActivityDiscount1 userActivityDiscount1 = userActivityDiscount1Service.selectOne(new EntityWrapper<UserActivityDiscount1>().eq("userActivityId",activityId));
+        UserActivityRedenvelope userActivityRedenvelope = userActivityRedenvelopeService.selectOne(new EntityWrapper<UserActivityRedenvelope>().eq("userActivityId",activityId));
+        if(SinataUtil.isNotEmpty(userActivityRegistered)){
+            Map<String,Object> resultMap = userCouponRecordService.getCouponStatic(startTimes,endTimes,userActivityRegistered.getId(),2);
+            totalMOney+=Double.parseDouble(resultMap.get("money").toString());
+            map.put("userActivityRegisteredMoney",resultMap.get("money"));
+            map.put("userActivityRegisteredNumber",resultMap.get("number"));
+            map.put("userActivityRegisteredUseMoney",resultMap.get("useMoney"));
+        }else{
+            map.put("userActivityRegisteredMoney",0);
+            map.put("userActivityRegisteredNumber",0);
+            map.put("userActivityRegisteredUseMoney",0);
+        }
+        if(SinataUtil.isNotEmpty(userActivityInvite)){
+            Map<String,Object> resultMap = userCouponRecordService.getCouponStatic(startTimes,endTimes,userActivityInvite.getId(),3);
+            totalMOney+=Double.parseDouble(resultMap.get("money").toString());
+            map.put("userActivityInviteMoney",resultMap.get("money"));
+            map.put("userActivityInviteNumber",resultMap.get("number"));
+            map.put("userActivityInviteUseMoney",resultMap.get("useMoney"));
+        }else{
+            map.put("userActivityInviteMoney",0);
+            map.put("userActivityInviteNumber",0);
+            map.put("userActivityInviteUseMoney",0);
+        }
+        if(SinataUtil.isNotEmpty(userActivityDiscount1)){
+            Map<String,Object> resultMap = userCouponRecordService.getDiscountStatic(startTimes,endTimes,userActivityDiscount1.getId());
+            map.put("userActivityDiscount1Money",resultMap.get("money"));
+            map.put("userActivityDiscount1Number",resultMap.get("number"));
+        }else{
+            map.put("userActivityDiscount1Money",0);
+            map.put("userActivityDiscount1Number",0);
+        }
+        if(SinataUtil.isNotEmpty(userActivityRedenvelope)){
+            Map<String,Object> resultMap = userCouponRecordService.getRedStatic(startTimes,endTimes,userActivityRedenvelope.getId());
+            totalMOney+=Double.parseDouble(resultMap.get("money").toString());
+            map.put("userActivityRedenvelopeMoney",resultMap.get("money"));
+            map.put("userActivityRedenvelopeNumber",resultMap.get("number"));
+            map.put("userActivityRedenvelopeUseMoney",resultMap.get("useMoney"));
+        }else{
+            map.put("userActivityRedenvelopeMoney",0);
+            map.put("userActivityRedenvelopeNumber",0);
+            map.put("userActivityRedenvelopeUseMoney",0);
+        }
+        Map<String,Object> resultMap = userCouponRecordService.getRegStatic(startTimes,endTimes,activityId);
+
+        totalMOney+=Double.parseDouble(resultMap.get("money").toString());
+        map.put("totalMOney",totalMOney);
+        return map;
+    }
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "userActivity.html";
+    }
+    /**
+     * 跳转添加注册送优惠券页面
+     * @return
+     */
+    @RequestMapping("addRegist")
+    public String addRegist() {
+        return PREFIX + "addRegist.html";
+    }
+    /**
+     * 跳转红包选择页面
+     * @return
+     */
+    @RequestMapping("/sysRedPacketRecord")
+    public String sysRedPacketRecord() {
+        return PREFIX + "sysRedPacketRecord.html";
+    }
+    /**
+     * 跳转到选择优惠券页面
+     * @return
+     */
+    @RequestMapping("/sysCouponRecord")
+    public String sysCouponRecord() {
+        return PREFIX + "sysCouponRecord.html";
+    }
+
+    @RequestMapping("/sysCouponRecord1")
+    public String sysCouponRecord1() {
+        return PREFIX + "sysCouponRecord1.html";
+    }
+    @RequestMapping("/sysCouponRecord2")
+    public String sysCouponRecord2(Model model,Integer type) {
+        model.addAttribute("type",type);
+        return PREFIX + "sysCouponRecord2.html";
+    }
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/userActivity_add")
+    public String userActivityAdd() {
+        return PREFIX + "userActivity_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/userActivity_update/{userActivityId}")
+    public String userActivityUpdate(@PathVariable Integer userActivityId, Model model) {
+        UserActivity userActivity = userActivityService.selectById(userActivityId);
+        model.addAttribute("item",userActivity);
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        model.addAttribute("startTime", sdf.format(userActivity.getStartTime()));
+        model.addAttribute("endTime", sdf.format(userActivity.getEndTime()));
+        UserActivityRegistered userActivityRegistered = userActivityRegisteredService.selectOne(new EntityWrapper<UserActivityRegistered>().eq("userActivityId",userActivity.getId()));
+        model.addAttribute("item1",userActivityRegistered);
+        if(userActivityRegistered!=null){
+            model.addAttribute("item1Coupon",sysCouponRecordService.selectById(userActivityRegistered.getCouponId()));
+        }
+        UserActivityInvite userActivityInvite = userActivityInviteService.selectOne(new EntityWrapper<UserActivityInvite>().eq("userActivityId",userActivity.getId()));
+        model.addAttribute("item2",userActivityInvite);
+        if(userActivityInvite!=null){
+            model.addAttribute("item2Coupon",sysCouponRecordService.selectById(userActivityInvite.getCouponId()));
+        }
+        List<UserActivityBalance> balanceInfoList = userActivityBalanceService.selectList(new EntityWrapper<UserActivityBalance>().eq("userActivityId",userActivity.getId()));
+        model.addAttribute("balanceInfoList",balanceInfoList);
+        model.addAttribute("item4",userActivityDiscount1Service.selectOne(new EntityWrapper<UserActivityDiscount1>().eq("userActivityId",userActivity.getId())));
+        UserActivityRedenvelope userActivityRedenvelope = userActivityRedenvelopeService.selectOne(new EntityWrapper<UserActivityRedenvelope>().eq("userActivityId",userActivity.getId()));
+        model.addAttribute("item5",userActivityRedenvelope);
+        if(userActivityRedenvelope!=null){
+            model.addAttribute("item5Red",sysRedPacketRecordService.selectById(userActivityRedenvelope.getRedEnvelopeId()));
+        }
+        LogObjectHolder.me().set(userActivity);
+        return PREFIX + "userActivity_edit.html";
+    }
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/blanceList")
+    @ResponseBody
+    public Object blanceList(String createTime,Integer activityId) {
+        ShiroUser user = ShiroKit.getUser();
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(userCouponRecordService.getBlanceList(page,beginTime,endTime,activityId));
+        return super.packForBT(page);
+    }
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime,String name,Integer status, Integer offset, Integer limit) {
+        Date startTimes = null;
+        Date endTimes = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            startTimes = DateUtil.getDate_str3(timeArray[0]+" 00:00:00");
+            endTimes = DateUtil.getDate_str3(timeArray[1]+" 23:59:59");
+        }
+        Integer uid = ShiroKit.getUser().getId();
+        return userActivityService.queryUserActivityList(uid, startTimes, endTimes, name, status, offset, limit);
+    }
+
+    /**
+     *
+     * @param name 活动时间
+     * @param startTime  时间区间
+     * @param registCouponId 注册活动-优惠券id
+     * @param registEnable 注册活动-是否启动(1=不启动,2=启动)
+     * @param registNumber 注册活动-优惠券数量
+     * @param registEffective 注册活动-优惠券有效期
+     * @param inviteCouponId 邀请活动-优惠券id
+     * @param inviteEnable 邀请活动-是否启动(1=不启动,2=启动)
+     * @param inviteNumber 邀请活动-优惠券数量
+     * @param inviteEffective 邀请活动-优惠券有效期
+     * @param balanceEnable 充值活动-是否启动(1=不启动,2=启动)
+     * @param balanceInfo 充值活动-详情
+     * @param discountEnable 折扣活动-是否启动(1=不启动,2=启动)
+     * @param discountSpecial 折扣活动-专车
+     * @param discountTaxi 折扣活动-出租车
+     * @param discountLogistics 折扣活动-小件物流
+     * @param redenvelopeId -红包活动-红包id
+     * @param redenvelopeEnable 红包活动-是否启动(1=不启动,2=启动)
+     * @return
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(String name,String startTime,Integer registCouponId,
+                      Integer registEnable,Integer registNumber,Integer registEffective,
+                      Integer inviteCouponId,Integer inviteEnable,Integer inviteNumber,Integer inviteEffective,
+                      Integer balanceEnable,String balanceInfo,
+                      Integer discountEnable,Double discountSpecial,Double discountTaxi,Double discountLogistics,
+                      Integer redenvelopeId,Integer redenvelopeEnable, Double registerPrice, Double invitationPrice, Double redPrice) {
+        userActivityService.insertOrUpdate(null,name,startTime, registCouponId,
+                 registEnable, registNumber, registEffective,
+                 inviteCouponId, inviteEnable, inviteNumber, inviteEffective,
+                 balanceEnable, balanceInfo,
+                 discountEnable, discountSpecial, discountTaxi, discountLogistics,
+                 redenvelopeId, redenvelopeEnable, registerPrice, invitationPrice, redPrice);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer userActivityId) {
+        userActivityService.deleteById(userActivityId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     *
+     * @param name 活动时间
+     * @param startTime  时间区间
+     * @param registCouponId 注册活动-优惠券id
+     * @param registEnable 注册活动-是否启动(1=不启动,2=启动)
+     * @param registNumber 注册活动-优惠券数量
+     * @param registEffective 注册活动-优惠券有效期
+     * @param inviteCouponId 邀请活动-优惠券id
+     * @param inviteEnable 邀请活动-是否启动(1=不启动,2=启动)
+     * @param inviteNumber 邀请活动-优惠券数量
+     * @param inviteEffective 邀请活动-优惠券有效期
+     * @param balanceEnable 充值活动-是否启动(1=不启动,2=启动)
+     * @param balanceInfo 充值活动-详情
+     * @param discountEnable 折扣活动-是否启动(1=不启动,2=启动)
+     * @param discountSpecial 折扣活动-专车
+     * @param discountTaxi 折扣活动-出租车
+     * @param discountLogistics 折扣活动-小件物流
+     * @param redenvelopeId -红包活动-红包id
+     * @param redenvelopeEnable 红包活动-是否启动(1=不启动,2=启动)
+     * @return
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(Integer id,String name,String startTime,Integer registCouponId,
+                         Integer registEnable,Integer registNumber,Integer registEffective,
+                         Integer inviteCouponId,Integer inviteEnable,Integer inviteNumber,Integer inviteEffective,
+                         Integer balanceEnable,String balanceInfo,
+                         Integer discountEnable,Double discountSpecial,Double discountTaxi,Double discountLogistics,
+                         Integer redenvelopeId,Integer redenvelopeEnable, Double registerPrice, Double invitationPrice, Double redPrice) {
+        userActivityService.insertOrUpdate(id,name,startTime, registCouponId,
+                registEnable, registNumber, registEffective,
+                inviteCouponId, inviteEnable, inviteNumber, inviteEffective,
+                balanceEnable, balanceInfo,
+                discountEnable, discountSpecial, discountTaxi, discountLogistics,
+                redenvelopeId, redenvelopeEnable, registerPrice, invitationPrice, redPrice);
+        return SUCCESS_TIP;
+    }
+    /**
+     * 修改状态
+     * @param driverActivity
+     * @return
+     */
+    @RequestMapping(value = "/updateStatus")
+    @ResponseBody
+    public Object updateStatus(UserActivity driverActivity) {
+        userActivityService.updateById(driverActivity);
+        return SUCCESS_TIP;
+    }
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/userActivity_detail/{userActivityId}")
+    public Object detail(@PathVariable("userActivityId") Integer userActivityId,Model model) {
+        UserActivity userActivity = userActivityService.selectById(userActivityId);
+        model.addAttribute("item",userActivity);
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        model.addAttribute("startTime", sdf.format(userActivity.getStartTime()));
+        model.addAttribute("endTime", sdf.format(userActivity.getEndTime()));
+        UserActivityRegistered userActivityRegistered = userActivityRegisteredService.selectOne(new EntityWrapper<UserActivityRegistered>().eq("userActivityId",userActivity.getId()));
+        model.addAttribute("item1",userActivityRegistered);
+        if(userActivityRegistered!=null){
+            model.addAttribute("item1Coupon",sysCouponRecordService.selectById(userActivityRegistered.getCouponId()));
+        }
+        UserActivityInvite userActivityInvite = userActivityInviteService.selectOne(new EntityWrapper<UserActivityInvite>().eq("userActivityId",userActivity.getId()));
+        model.addAttribute("item2",userActivityInvite);
+        if(userActivityInvite!=null){
+            model.addAttribute("item2Coupon",sysCouponRecordService.selectById(userActivityInvite.getCouponId()));
+        }
+        List<UserActivityBalance> balanceInfoList = userActivityBalanceService.selectList(new EntityWrapper<UserActivityBalance>().eq("userActivityId",userActivity.getId()));
+        model.addAttribute("balanceInfoList",balanceInfoList);
+        model.addAttribute("item4",userActivityDiscount1Service.selectOne(new EntityWrapper<UserActivityDiscount1>().eq("userActivityId",userActivity.getId())));
+        UserActivityRedenvelope userActivityRedenvelope = userActivityRedenvelopeService.selectOne(new EntityWrapper<UserActivityRedenvelope>().eq("userActivityId",userActivity.getId()));
+        model.addAttribute("item5",userActivityRedenvelope);
+        if(userActivityRedenvelope!=null){
+            model.addAttribute("item5Red",sysRedPacketRecordService.selectById(userActivityRedenvelope.getRedEnvelopeId()));
+        }
+        return PREFIX + "userActivity_detail.html";
+    }
+
+    /**
+     * 跳转到立即处理页面
+     */
+    @RequestMapping("/userActivity_immediately/{id}")
+    public String userActivityImmediately(@PathVariable Integer id, Model model) {
+        model.addAttribute("id",id);
+        return PREFIX + "userActivity_immediately.html";
+    }
+    /**
+     * 立即处理操作
+     */
+    @RequestMapping(value = "/immediately")
+    @ResponseBody
+    public Object immediately(@RequestParam Integer id,@RequestParam Integer state,@RequestParam String remark) {
+        UserActivity userActivity = userActivityService.selectById(id);
+        if (SinataUtil.isNotEmpty(userActivity)){
+            userActivity.setStatus(state);
+            userActivity.setRemark(remark);
+            userActivityService.updateById(userActivity);
+        }
+        return SUCCESS_TIP;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityDiscount1Controller.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityDiscount1Controller.java
new file mode 100644
index 0000000..de92f23
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityDiscount1Controller.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.UserActivityDiscount1;
+import com.stylefeng.guns.modular.system.service.IUserActivityDiscount1Service;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-19 14:32:41
+ */
+@Controller
+@RequestMapping("/userActivityDiscount1")
+public class UserActivityDiscount1Controller extends BaseController {
+
+    private String PREFIX = "/system/userActivityDiscount1/";
+
+    @Autowired
+    private IUserActivityDiscount1Service userActivityDiscount1Service;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "userActivityDiscount1.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/userActivityDiscount1_add")
+    public String userActivityDiscount1Add() {
+        return PREFIX + "userActivityDiscount1_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/userActivityDiscount1_update/{userActivityDiscount1Id}")
+    public String userActivityDiscount1Update(@PathVariable Integer userActivityDiscount1Id, Model model) {
+        UserActivityDiscount1 userActivityDiscount1 = userActivityDiscount1Service.selectById(userActivityDiscount1Id);
+        model.addAttribute("item",userActivityDiscount1);
+        LogObjectHolder.me().set(userActivityDiscount1);
+        return PREFIX + "userActivityDiscount1_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        return userActivityDiscount1Service.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(UserActivityDiscount1 userActivityDiscount1) {
+        userActivityDiscount1Service.insert(userActivityDiscount1);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer userActivityDiscount1Id) {
+        userActivityDiscount1Service.deleteById(userActivityDiscount1Id);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(UserActivityDiscount1 userActivityDiscount1) {
+        userActivityDiscount1Service.updateById(userActivityDiscount1);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{userActivityDiscount1Id}")
+    @ResponseBody
+    public Object detail(@PathVariable("userActivityDiscount1Id") Integer userActivityDiscount1Id) {
+        return userActivityDiscount1Service.selectById(userActivityDiscount1Id);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityDiscount2Controller.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityDiscount2Controller.java
new file mode 100644
index 0000000..440bdf1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityDiscount2Controller.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.UserActivityDiscount2;
+import com.stylefeng.guns.modular.system.service.IUserActivityDiscount2Service;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-19 14:32:46
+ */
+@Controller
+@RequestMapping("/userActivityDiscount2")
+public class UserActivityDiscount2Controller extends BaseController {
+
+    private String PREFIX = "/system/userActivityDiscount2/";
+
+    @Autowired
+    private IUserActivityDiscount2Service userActivityDiscount2Service;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "userActivityDiscount2.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/userActivityDiscount2_add")
+    public String userActivityDiscount2Add() {
+        return PREFIX + "userActivityDiscount2_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/userActivityDiscount2_update/{userActivityDiscount2Id}")
+    public String userActivityDiscount2Update(@PathVariable Integer userActivityDiscount2Id, Model model) {
+        UserActivityDiscount2 userActivityDiscount2 = userActivityDiscount2Service.selectById(userActivityDiscount2Id);
+        model.addAttribute("item",userActivityDiscount2);
+        LogObjectHolder.me().set(userActivityDiscount2);
+        return PREFIX + "userActivityDiscount2_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        return userActivityDiscount2Service.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(UserActivityDiscount2 userActivityDiscount2) {
+        userActivityDiscount2Service.insert(userActivityDiscount2);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer userActivityDiscount2Id) {
+        userActivityDiscount2Service.deleteById(userActivityDiscount2Id);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(UserActivityDiscount2 userActivityDiscount2) {
+        userActivityDiscount2Service.updateById(userActivityDiscount2);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{userActivityDiscount2Id}")
+    @ResponseBody
+    public Object detail(@PathVariable("userActivityDiscount2Id") Integer userActivityDiscount2Id) {
+        return userActivityDiscount2Service.selectById(userActivityDiscount2Id);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityInviteController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityInviteController.java
new file mode 100644
index 0000000..337d8d2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityInviteController.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.UserActivityInvite;
+import com.stylefeng.guns.modular.system.service.IUserActivityInviteService;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-19 14:32:57
+ */
+@Controller
+@RequestMapping("/userActivityInvite")
+public class UserActivityInviteController extends BaseController {
+
+    private String PREFIX = "/system/userActivityInvite/";
+
+    @Autowired
+    private IUserActivityInviteService userActivityInviteService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "userActivityInvite.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/userActivityInvite_add")
+    public String userActivityInviteAdd() {
+        return PREFIX + "userActivityInvite_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/userActivityInvite_update/{userActivityInviteId}")
+    public String userActivityInviteUpdate(@PathVariable Integer userActivityInviteId, Model model) {
+        UserActivityInvite userActivityInvite = userActivityInviteService.selectById(userActivityInviteId);
+        model.addAttribute("item",userActivityInvite);
+        LogObjectHolder.me().set(userActivityInvite);
+        return PREFIX + "userActivityInvite_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        return userActivityInviteService.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(UserActivityInvite userActivityInvite) {
+        userActivityInviteService.insert(userActivityInvite);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer userActivityInviteId) {
+        userActivityInviteService.deleteById(userActivityInviteId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(UserActivityInvite userActivityInvite) {
+        userActivityInviteService.updateById(userActivityInvite);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{userActivityInviteId}")
+    @ResponseBody
+    public Object detail(@PathVariable("userActivityInviteId") Integer userActivityInviteId) {
+        return userActivityInviteService.selectById(userActivityInviteId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityRedenvelopeController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityRedenvelopeController.java
new file mode 100644
index 0000000..b7b65ff
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityRedenvelopeController.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.UserActivityRedenvelope;
+import com.stylefeng.guns.modular.system.service.IUserActivityRedenvelopeService;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-19 14:33:03
+ */
+@Controller
+@RequestMapping("/userActivityRedenvelope")
+public class UserActivityRedenvelopeController extends BaseController {
+
+    private String PREFIX = "/system/userActivityRedenvelope/";
+
+    @Autowired
+    private IUserActivityRedenvelopeService userActivityRedenvelopeService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "userActivityRedenvelope.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/userActivityRedenvelope_add")
+    public String userActivityRedenvelopeAdd() {
+        return PREFIX + "userActivityRedenvelope_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/userActivityRedenvelope_update/{userActivityRedenvelopeId}")
+    public String userActivityRedenvelopeUpdate(@PathVariable Integer userActivityRedenvelopeId, Model model) {
+        UserActivityRedenvelope userActivityRedenvelope = userActivityRedenvelopeService.selectById(userActivityRedenvelopeId);
+        model.addAttribute("item",userActivityRedenvelope);
+        LogObjectHolder.me().set(userActivityRedenvelope);
+        return PREFIX + "userActivityRedenvelope_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        return userActivityRedenvelopeService.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(UserActivityRedenvelope userActivityRedenvelope) {
+        userActivityRedenvelopeService.insert(userActivityRedenvelope);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer userActivityRedenvelopeId) {
+        userActivityRedenvelopeService.deleteById(userActivityRedenvelopeId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(UserActivityRedenvelope userActivityRedenvelope) {
+        userActivityRedenvelopeService.updateById(userActivityRedenvelope);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{userActivityRedenvelopeId}")
+    @ResponseBody
+    public Object detail(@PathVariable("userActivityRedenvelopeId") Integer userActivityRedenvelopeId) {
+        return userActivityRedenvelopeService.selectById(userActivityRedenvelopeId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityRegisteredController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityRegisteredController.java
new file mode 100644
index 0000000..763d642
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserActivityRegisteredController.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.UserActivityRegistered;
+import com.stylefeng.guns.modular.system.service.IUserActivityRegisteredService;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-19 14:33:09
+ */
+@Controller
+@RequestMapping("/userActivityRegistered")
+public class UserActivityRegisteredController extends BaseController {
+
+    private String PREFIX = "/system/userActivityRegistered/";
+
+    @Autowired
+    private IUserActivityRegisteredService userActivityRegisteredService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "userActivityRegistered.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/userActivityRegistered_add")
+    public String userActivityRegisteredAdd() {
+        return PREFIX + "userActivityRegistered_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/userActivityRegistered_update/{userActivityRegisteredId}")
+    public String userActivityRegisteredUpdate(@PathVariable Integer userActivityRegisteredId, Model model) {
+        UserActivityRegistered userActivityRegistered = userActivityRegisteredService.selectById(userActivityRegisteredId);
+        model.addAttribute("item",userActivityRegistered);
+        LogObjectHolder.me().set(userActivityRegistered);
+        return PREFIX + "userActivityRegistered_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        return userActivityRegisteredService.selectList(null);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(UserActivityRegistered userActivityRegistered) {
+        userActivityRegisteredService.insert(userActivityRegistered);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer userActivityRegisteredId) {
+        userActivityRegisteredService.deleteById(userActivityRegisteredId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(UserActivityRegistered userActivityRegistered) {
+        userActivityRegisteredService.updateById(userActivityRegistered);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{userActivityRegisteredId}")
+    @ResponseBody
+    public Object detail(@PathVariable("userActivityRegisteredId") Integer userActivityRegisteredId) {
+        return userActivityRegisteredService.selectById(userActivityRegisteredId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserCouponRecordController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserCouponRecordController.java
new file mode 100644
index 0000000..f1087c3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/UserCouponRecordController.java
@@ -0,0 +1,121 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.UserCouponRecord;
+import com.stylefeng.guns.modular.system.service.IUserCouponRecordService;
+
+import java.util.Map;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-17 09:15:18
+ */
+@Controller
+@RequestMapping("/userCouponRecord")
+public class UserCouponRecordController extends BaseController {
+
+    private String PREFIX = "/system/userCouponRecord/";
+
+    @Autowired
+    private IUserCouponRecordService userCouponRecordService;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index( Model model,Integer couponActivityId,Integer activityType) {
+        model.addAttribute("activityType",activityType);
+        model.addAttribute("couponActivityId",couponActivityId);
+        return PREFIX + "userCouponRecord.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/userCouponRecord_add")
+    public String userCouponRecordAdd() {
+        return PREFIX + "userCouponRecord_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/userCouponRecord_update/{userCouponRecordId}")
+    public String userCouponRecordUpdate(@PathVariable Integer userCouponRecordId, Model model) {
+        UserCouponRecord userCouponRecord = userCouponRecordService.selectById(userCouponRecordId);
+        model.addAttribute("item",userCouponRecord);
+        LogObjectHolder.me().set(userCouponRecord);
+        return PREFIX + "userCouponRecord_edit.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime,String userName,String userPhone,Integer couponActivityId,Integer activityType,Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(userCouponRecordService.getList(page,beginTime,endTime,userName,userPhone,couponActivityId,activityType,state));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(UserCouponRecord userCouponRecord) {
+        userCouponRecordService.insert(userCouponRecord);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer userCouponRecordId) {
+        userCouponRecordService.deleteById(userCouponRecordId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(UserCouponRecord userCouponRecord) {
+        userCouponRecordService.updateById(userCouponRecord);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{userCouponRecordId}")
+    @ResponseBody
+    public Object detail(@PathVariable("userCouponRecordId") Integer userCouponRecordId) {
+        return userCouponRecordService.selectById(userCouponRecordId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDispatchController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDispatchController.java
new file mode 100644
index 0000000..9d79d0d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDispatchController.java
@@ -0,0 +1,233 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TCompany;
+import com.stylefeng.guns.modular.system.service.ITCompanyService;
+import com.stylefeng.guns.modular.system.service.IUserService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TDispatch;
+import com.stylefeng.guns.modular.system.service.ITDispatchService;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 调度管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-01 16:00:16
+ */
+@Controller
+@RequestMapping("/tDispatch")
+public class TDispatchController extends BaseController {
+
+    private String PREFIX = "/system/tDispatch/";
+
+    @Autowired
+    private ITDispatchService tDispatchService;
+
+    @Autowired
+    private ITCompanyService tCompanyService;
+
+    @Autowired
+    private IUserService userService;
+
+    /**
+     * 跳转到调度管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tDispatch.html";
+    }
+
+    /**
+     * 跳转到添加调度管理
+     */
+    @RequestMapping("/tDispatch_add")
+    public String tDispatchAdd(Model model) {
+        model.addAttribute("roleType",ShiroKit.getUser().getRoleType());
+
+        List<TCompany> companyList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 2)
+                .eq("isCross", 1)
+                .last(" and state != 1 and FIND_IN_SET(flag,'1,2')"));
+        model.addAttribute("companyList",companyList);
+
+        if (2 == ShiroKit.getUser().getRoleType()){
+            List<TCompany> franchiseeList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 3)
+                    .eq("superiorId",ShiroKit.getUser().getObjectId()));
+            model.addAttribute("franchiseeList",franchiseeList);
+        }else{
+            model.addAttribute("franchiseeList",null);
+        }
+        return PREFIX + "tDispatch_add.html";
+    }
+
+    /**
+     * 根据分公司ID获取加盟商
+     * @param oneId
+     * @return
+     */
+    @RequestMapping(value = "/companyChange")
+    @ResponseBody
+    public Object companyChange(@RequestParam Integer oneId) {
+        List<TCompany> list = new ArrayList<>();
+        if (SinataUtil.isNotEmpty(oneId)){
+            list = tCompanyService.selectList(new EntityWrapper<TCompany>()
+                    .eq("type", 3)
+                    .eq("isCross", 1)
+                    .eq("superiorId", oneId)
+                    .last(" and state != 1 and FIND_IN_SET(flag,'1,2')"));
+        }
+        return list;
+    }
+
+    /**
+     * 跳转到修改调度管理
+     */
+    @RequestMapping("/tDispatch_update/{tDispatchId}")
+    public String tDispatchUpdate(@PathVariable Integer tDispatchId, Model model) {
+        TDispatch tDispatch = tDispatchService.selectById(tDispatchId);
+        model.addAttribute("item",tDispatch);
+        LogObjectHolder.me().set(tDispatch);
+
+        Integer roleType = ShiroKit.getUser().getRoleType();
+        model.addAttribute("roleType",roleType);
+        if (1 == roleType){
+            List<TCompany> companyList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 2)
+                    .eq("isCross", 1)
+                    .last(" and state != 1 and FIND_IN_SET(flag,'1,2')"));
+            model.addAttribute("companyList",companyList);
+
+            List<TCompany> franchiseeList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 3)
+                    .eq("superiorId",tDispatch.getCompanyId())
+                    .eq("isCross", 1)
+                    .last(" and state != 1 and FIND_IN_SET(flag,'1,2')"));
+            model.addAttribute("franchiseeList",franchiseeList);
+        }else if (2 == roleType){
+            List<TCompany> franchiseeList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("type", 3)
+                    .eq("superiorId",ShiroKit.getUser().getObjectId())
+                    .eq("isCross", 1)
+                    .last(" and state != 1 and FIND_IN_SET(flag,'1,2')"));
+            model.addAttribute("franchiseeList",franchiseeList);
+        }
+        return PREFIX + "tDispatch_edit.html";
+    }
+
+    /**
+     * 获取调度管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,String name,String companyName,String franchiseeName,String account,Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tDispatchService.getDispatchList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),beginTime,endTime,name,companyName,franchiseeName,account,state));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增调度管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TDispatch tDispatch) {
+        //判断账号是否存在
+        int count = tDispatchService.selectCount(new EntityWrapper<TDispatch>().eq("account",tDispatch.getAccount()).last(" and FIND_IN_SET(state,'1,2')"));
+        if (count > 0){
+            return new ErrorTip(500,"账号已存在,请重新输入");
+        }
+        Integer roleType = ShiroKit.getUser().getRoleType();
+        Integer objectId = ShiroKit.getUser().getObjectId();
+        if (2 == roleType){
+            tDispatch.setCompanyId(objectId);
+        }else if (3 == roleType){
+            TCompany company = tCompanyService.selectById(objectId);
+            tDispatch.setCompanyId(company.getSuperiorId());
+            tDispatch.setFranchiseeId(objectId);
+        }
+        tDispatch.setInsertTime(new Date());
+        tDispatch.setInsertUserId(ShiroKit.getUser().getId());
+        tDispatch.setInsertUserRole(roleType);
+        tDispatch.setState(1);
+        if(tDispatch.getCompanyId() == null){
+            Integer objectId1 = userService.selectById(ShiroKit.getUser().getId()).getObjectId();
+            tDispatch.setCompanyId(objectId1);
+        }
+        tDispatch.setPassword(ShiroKit.md5(tDispatch.getPassword(), "WL:x9#"));
+        tDispatchService.insert(tDispatch);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除调度管理
+     * @param tDispatchId
+     * @param optType  1=删除  2=冻结  3=解冻
+     * @return
+     */
+    @RequestMapping(value = "/opt")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tDispatchId,@RequestParam Integer optType) {
+        TDispatch dispatch = tDispatchService.selectById(tDispatchId);
+        if (1 == optType){
+            dispatch.setState(3);
+        }else if (2 == optType){
+            dispatch.setState(2);
+        }else if (3 == optType){
+            dispatch.setState(1);
+        }
+        tDispatchService.updateById(dispatch);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改调度管理
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TDispatch tDispatch) {
+        TDispatch obj = tDispatchService.selectById(tDispatch.getId());
+        if (!obj.getAccount().equals(tDispatch.getAccount())){
+            //判断账号是否存在
+            int count = tDispatchService.selectCount(new EntityWrapper<TDispatch>().eq("account",tDispatch.getAccount()).last(" and FIND_IN_SET(state,'1,2')"));
+            if (count > 0){
+                return new ErrorTip(500,"账号已存在,请重新输入");
+            }
+        }
+        Integer roleType = ShiroKit.getUser().getRoleType();
+        Integer objectId = ShiroKit.getUser().getObjectId();
+        if (2 == roleType){
+            tDispatch.setCompanyId(objectId);
+        }else if (3 == roleType){
+            TCompany company = tCompanyService.selectById(objectId);
+            tDispatch.setCompanyId(company.getSuperiorId());
+            tDispatch.setFranchiseeId(objectId);
+        }
+        if (SinataUtil.isNotEmpty(tDispatch.getPassword())){
+            tDispatch.setPassword(ShiroKit.md5(tDispatch.getPassword(), "WL:x9#"));
+        }
+        tDispatchService.updateById(tDispatch);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TIntegralGoodsController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TIntegralGoodsController.java
new file mode 100644
index 0000000..707aebc
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TIntegralGoodsController.java
@@ -0,0 +1,131 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TIntegralGoods;
+import com.stylefeng.guns.modular.system.service.ITIntegralGoodsService;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 商品管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-02 11:28:36
+ */
+@Controller
+@RequestMapping("/tIntegralGoods")
+public class TIntegralGoodsController extends BaseController {
+
+    private String PREFIX = "/system/tIntegralGoods/";
+
+    @Autowired
+    private ITIntegralGoodsService tIntegralGoodsService;
+
+    /**
+     * 跳转到商品管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tIntegralGoods.html";
+    }
+
+    /**
+     * 跳转到添加商品管理
+     */
+    @RequestMapping("/tIntegralGoods_add")
+    public String tIntegralGoodsAdd() {
+        return PREFIX + "tIntegralGoods_add.html";
+    }
+
+    /**
+     * 跳转到修改商品管理
+     */
+    @RequestMapping("/tIntegralGoods_update/{tIntegralGoodsId}")
+    public String tIntegralGoodsUpdate(@PathVariable Integer tIntegralGoodsId, Model model) {
+        TIntegralGoods tIntegralGoods = tIntegralGoodsService.selectById(tIntegralGoodsId);
+        model.addAttribute("item",tIntegralGoods);
+        LogObjectHolder.me().set(tIntegralGoods);
+        return PREFIX + "tIntegralGoods_edit.html";
+    }
+
+    /**
+     * 获取商品管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,String name,Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tIntegralGoodsService.getIntegralGoodsList(page,beginTime,endTime,name,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增商品管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TIntegralGoods tIntegralGoods) {
+        tIntegralGoods.setInsertTime(new Date());
+        tIntegralGoods.setInsertUserId(ShiroKit.getUser().getId());
+        tIntegralGoods.setInsertUserRole(ShiroKit.getUser().getRoleType());
+        tIntegralGoods.setState(1);
+        tIntegralGoodsService.insert(tIntegralGoods);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * c操作商品
+     * @param tIntegralGoodsId
+     * @param optType  1=上架  2=下架  3=删除
+     * @return
+     */
+    @RequestMapping(value = "/opt")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tIntegralGoodsId,@RequestParam Integer optType) {
+        TIntegralGoods tIntegralGoods = tIntegralGoodsService.selectById(tIntegralGoodsId);
+        if (1 == optType){
+            tIntegralGoods.setState(1);
+        }else if (2 == optType){
+            tIntegralGoods.setState(2);
+        }else if (3 == optType){
+            tIntegralGoods.setState(3);
+        }
+        tIntegralGoodsService.updateById(tIntegralGoods);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改商品管理
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TIntegralGoods tIntegralGoods) {
+        tIntegralGoodsService.updateById(tIntegralGoods);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TIntegralOrderController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TIntegralOrderController.java
new file mode 100644
index 0000000..6259cfc
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TIntegralOrderController.java
@@ -0,0 +1,109 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TOrderCharter;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TIntegralOrder;
+import com.stylefeng.guns.modular.system.service.ITIntegralOrderService;
+
+import java.util.Map;
+
+/**
+ * 积分兑换订单控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-02 15:22:24
+ */
+@Controller
+@RequestMapping("/tIntegralOrder")
+public class TIntegralOrderController extends BaseController {
+
+    private String PREFIX = "/system/tIntegralOrder/";
+
+    @Autowired
+    private ITIntegralOrderService tIntegralOrderService;
+
+    /**
+     * 跳转到积分兑换订单首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tIntegralOrder.html";
+    }
+
+    /**
+     * 跳转到查看详情
+     */
+    @RequestMapping("/lookDetail/{id}")
+    public String lookDetail(@PathVariable Integer id, Model model) {
+        TIntegralOrder tIntegralOrder = tIntegralOrderService.selectById(id);
+        model.addAttribute("str",tIntegralOrder.getRemark());
+        return "/system/tComplaint/lookDetail.html";
+    }
+
+    /**
+     * 跳转至立即处理页面
+     */
+    @RequestMapping("/tIntegralOrder_immediately/{tIntegralOrderId}")
+    public String tIntegralOrder_immediately(@PathVariable Integer tIntegralOrderId, Model model) {
+        model.addAttribute("id",tIntegralOrderId);
+        return PREFIX + "tIntegralOrder_immediately.html";
+    }
+
+    /**
+     * 获取积分兑换订单列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,String userName,String goodsName,String consigneeName,String consigneePhone,Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tIntegralOrderService.getIntegralOrderList(page,beginTime,endTime,userName,goodsName,consigneeName,consigneePhone,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 立即处理
+     */
+    @RequestMapping(value = "/immediately")
+    @ResponseBody
+    public Object immediately(TIntegralOrder tIntegralOrder) {
+        tIntegralOrder.setState(2);
+        tIntegralOrderService.updateById(tIntegralOrder);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除积分兑换订单
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tIntegralOrderId) {
+        TIntegralOrder tIntegralOrder = tIntegralOrderService.selectById(tIntegralOrderId);
+        tIntegralOrder.setState(3);
+        tIntegralOrderService.updateById(tIntegralOrder);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TLineController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TLineController.java
new file mode 100644
index 0000000..335e4bd
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TLineController.java
@@ -0,0 +1,378 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 跨城线路管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-15 16:17:29
+ */
+@Controller
+@RequestMapping("/tLine")
+public class TLineController extends BaseController {
+
+    private String PREFIX = "/system/tLine/";
+
+    @Autowired
+    private ITLineService tLineService;
+
+    @Autowired
+    private ITSiteService itSiteService;
+
+    @Autowired
+    private ITServerCarmodelService itServerCarmodelService;
+
+    @Autowired
+    private ITLineSiteService itLineSiteService;
+
+    @Autowired
+    private ITLinePriceService itLinePriceService;
+
+    @Autowired
+    private ITLineShiftService itLineShiftService;
+
+    @Autowired
+    private ITCompanyService itCompanyService;
+
+    @Autowired
+    private ITLineCompanyService itLineCompanyService;
+
+    /**
+     * 跳转到跨城站点管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tLine.html";
+    }
+
+    /**
+     * 跳转到添加跨城站点管理
+     */
+    @RequestMapping("/tLine_add")
+    public String tLineAdd(Model model) {
+        //站点
+        List<TSite> siteList = itSiteService.selectList(new EntityWrapper<TSite>().eq("state", 1));
+        model.addAttribute("siteList",siteList);
+        //跨城车型
+        List<TServerCarmodel> carmodelList = itServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 2).eq("state", 1));
+        model.addAttribute("carmodelList",carmodelList);
+        return PREFIX + "tLine_add.html";
+    }
+
+    /**
+     * 分配企业页面
+     */
+    @RequestMapping("/tLine_addCompany/{tLineId}")
+    public String tLine_addCompany(@PathVariable Integer tLineId,Model model) {
+        TLine tLine = tLineService.selectById(tLineId);
+        model.addAttribute("tLine",tLine);
+        //查询所有企业
+        List<TCompany> companyList = itCompanyService.selectList(new EntityWrapper<TCompany>().last(" where not FIND_IN_SET(state,'1') and not FIND_IN_SET(flag,'3')"));
+        model.addAttribute("companyList",companyList);
+        //查询已分配企业
+        List<Map<String, Object>> lineCompanyList = tLineService.getLineCompanyList(tLineId);
+        model.addAttribute("lineCompanyList",lineCompanyList);
+        return PREFIX + "tLine_addCompany.html";
+    }
+
+    /**
+     * 跳转到修改跨城站点管理
+     */
+    @RequestMapping("/tLine_update/{tLineId}")
+    public String tLineUpdate(@PathVariable Integer tLineId, Model model) {
+        TLine tLine = tLineService.selectById(tLineId);
+        model.addAttribute("item",tLine);
+        LogObjectHolder.me().set(tLine);
+
+        //查找站点起点+终点
+        TLineSite start = itLineSiteService.selectOne(new EntityWrapper<TLineSite>().eq("lineId", tLineId).eq("type", 1));
+        model.addAttribute("start",start);
+        TLineSite end = itLineSiteService.selectOne(new EntityWrapper<TLineSite>().eq("lineId", tLineId).eq("type", 2));
+        model.addAttribute("end",end);
+        //站点
+        List<TSite> siteList = itSiteService.selectList(new EntityWrapper<TSite>().eq("state", 1));
+        model.addAttribute("siteList",siteList);
+        //跨城车型
+        List<TServerCarmodel> carmodelList = itServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 2).eq("state", 1));
+        model.addAttribute("carmodelList",carmodelList);
+        //查询所有站点
+        List<Map<String, Object>> linePriceList = tLineService.getLinePriceList(tLineId);
+        model.addAttribute("linePriceList",linePriceList);
+        //查询所有班次
+        List<TLineShift> lineShiftList = itLineShiftService.selectList(new EntityWrapper<TLineShift>().eq("lineId", tLineId).last(" and not FIND_IN_SET(state,'3')"));
+        model.addAttribute("lineShiftList",lineShiftList);
+        return PREFIX + "tLine_edit.html";
+    }
+
+    /**
+     * 获取跨城站点管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,String name,String insertUser,String modelStr,Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tLineService.getLineList(page,beginTime,endTime,name,insertUser,modelStr,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增跨城站点管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public ResultUtil add(TLine tLine,Integer startSiteId,Integer endSiteId,@RequestParam String subArr,@RequestParam String shuArr) {
+        String name = tLine.getName();
+        name = name.replaceAll("& lt;", "<");
+        name = name.replaceAll("& gt;", ">");
+        name = name.replaceAll("& #40;", "(");
+        name = name.replaceAll("& #41;", ")");
+        tLine.setName(name);
+        tLine.setState(1);
+        tLine.setInsertTime(new Date());
+        tLine.setInsertUserId(ShiroKit.getUser().getId());
+        tLineService.insert(tLine);
+
+        //添加线路站点起点+终点
+        TLineSite start = new TLineSite();
+        start.setLineId(tLine.getId());
+        start.setSiteId(startSiteId);
+        start.setType(1);
+        itLineSiteService.insert(start);
+        TLineSite end = new TLineSite();
+        end.setLineId(tLine.getId());
+        end.setSiteId(endSiteId);
+        end.setType(2);
+        itLineSiteService.insert(end);
+
+        //添加价格设置
+        addPrice(tLine.getId(), subArr);
+
+        //添加班次设置
+        return addShift(tLine.getId(), shuArr);
+    }
+
+    /**
+     * 添加线路班次
+     * @param lineId
+     * @param shuArr
+     */
+    private ResultUtil addShift(Integer lineId, @RequestParam String shuArr) {
+        try {
+            JSONArray jsonArray1 = JSON.parseArray(shuArr);
+            int size1 = jsonArray1.size();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            List<String> list = new ArrayList<>();
+            for (int i = 0; i < size1; i++) {
+                List<TLineShift> tLineShifts = itLineShiftService.selectList(new EntityWrapper<TLineShift>().eq("lineId", lineId).ne("state", 3).orderBy("startTime"));
+                JSONObject jsonObject = jsonArray1.getJSONObject(i);
+                TLineShift shift = new TLineShift();
+                shift.setLineId(lineId);
+                String shiftTime = jsonObject.getString("shiftTime");
+                String startTime = null;
+                String endTime = null;
+                if (SinataUtil.isNotEmpty(shiftTime)){
+                    String[] timeArray = shiftTime.split(" - ");
+                    startTime = timeArray[0];
+                    endTime = timeArray[1];
+                }
+                Date s1 = sdf.parse("2020-11-11 " + startTime + ":00");
+                Date e1 = sdf.parse("2020-11-11 " + endTime + ":00");
+                boolean b = false;
+                for(TLineShift lineShift : tLineShifts){
+                    Date s2 = sdf.parse("2020-11-11 " + lineShift.getStartTime() + ":00");
+                    Date e2 = sdf.parse("2020-11-11 " + lineShift.getEndTime() + ":00");
+                    if(s2.getTime() <= s1.getTime() && e1.getTime() <= e2.getTime()){
+                        list.add(startTime + " - " + endTime);
+                        b = true;
+                        break;
+                    }
+                    if(s1.getTime() <= s2.getTime() && s1.getTime() <= e2.getTime() && e1.getTime() >= s2.getTime()){
+                        list.add(startTime + " - " + endTime);
+                        b = true;
+                        break;
+                    }
+                    if(s1.getTime() >= s2.getTime() && s1.getTime() <= e2.getTime() && e1.getTime() >= e2.getTime()){
+                        list.add(startTime + " - " + endTime);
+                        b = true;
+                        break;
+                    }
+                }
+                if(b){
+                    continue;
+                }
+                shift.setStartTime(startTime);
+                shift.setEndTime(endTime);
+                shift.setCarNum(jsonObject.getInteger("carNum"));
+                shift.setInsertTime(new Date());
+                shift.setAddTime(jsonObject.getString("time2"));
+                shift.setState(1);
+                itLineShiftService.insert(shift);
+            }
+            if(list.size() > 0){
+                return ResultUtil.error("【" + JSON.toJSONString(list) + "】时间段与现存时间段重合,添加失败!");
+            }
+            return ResultUtil.success();
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+
+    /**
+     * 添加线路价格
+     * @param lineId
+     * @param subArr
+     */
+    private void addPrice(Integer lineId, @RequestParam String subArr) {
+        JSONArray jsonArray = JSON.parseArray(subArr);
+        int size = jsonArray.size();
+        for (int i = 0; i < size; i++) {
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            TLinePrice price = new TLinePrice();
+            price.setLineId(lineId);
+            price.setServerCarModelId(jsonObject.getInteger("serverModelId"));
+            price.setType(jsonObject.getInteger("type"));
+            price.setContent(jsonObject.getString("content"));
+            price.setContentStr(jsonObject.getString("contentStr"));
+            price.setState(1);
+            price.setInsertTime(new Date());
+            price.setAddTime(jsonObject.getString("time"));
+            itLinePriceService.insert(price);
+        }
+    }
+
+    /**
+     * 操作跨城站点管理
+     * optType 1=删除 2=冻结 3=解冻
+     */
+    @RequestMapping(value = "/opt")
+    @ResponseBody
+    public Object opt(@RequestParam Integer tLineId,@RequestParam Integer optType) {
+        TLine tLine = tLineService.selectById(tLineId);
+        if (1 == optType){
+            tLine.setState(3);
+        }else if (2 == optType){
+            tLine.setState(2);
+        }else if (3 == optType){
+            tLine.setState(1);
+        }
+        tLineService.updateById(tLine);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 分配企业操作
+     */
+    @RequestMapping(value = "/addCompany")
+    @ResponseBody
+    public Object addCompany(Integer lineId,@RequestParam String comArr) {
+        //删除分配企业
+        itLineCompanyService.delete(new EntityWrapper<TLineCompany>().eq("lineId",lineId));
+        //添加企业
+        if (SinataUtil.isNotEmpty(comArr)){
+            JSONArray jsonArray = JSON.parseArray(comArr);
+            int size = jsonArray.size();
+            for (int i = 0; i < size; i++) {
+                JSONObject jsonObject = jsonArray.getJSONObject(i);
+                TLineCompany lineCompany = new TLineCompany();
+                lineCompany.setLineId(lineId);
+                lineCompany.setCompanyId(jsonObject.getInteger("companyId"));
+                lineCompany.setInsertTime(new Date());
+                lineCompany.setInsertUserId(ShiroKit.getUser().getId());
+                itLineCompanyService.insert(lineCompany);
+            }
+        }
+        return SUCCESS_TIP;
+    }
+    /**
+     * 修改跨城站点管理
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public ResultUtil update(TLine tLine,Integer startSiteId,Integer endSiteId,@RequestParam String subArr,@RequestParam String shuArr) {
+        String name = tLine.getName();
+        name = name.replaceAll("& lt;", "<");
+        name = name.replaceAll("& gt;", ">");
+        name = name.replaceAll("& #40;", "(");
+        name = name.replaceAll("& #41;", ")");
+        tLine.setName(name);
+        tLineService.updateById(tLine);
+
+        //修改站点起点
+        TLineSite start = itLineSiteService.selectOne(new EntityWrapper<TLineSite>().eq("lineId", tLine.getId()).eq("type", 1));
+        if (SinataUtil.isNotEmpty(start)){
+            if (start.getSiteId().intValue() != startSiteId.intValue()){
+                start.setSiteId(startSiteId);
+                itLineSiteService.updateById(start);
+            }
+        }else{
+            start = new TLineSite();
+            start.setLineId(tLine.getId());
+            start.setSiteId(startSiteId);
+            start.setType(1);
+            itLineSiteService.insert(start);
+        }
+        //修改站点终点
+        TLineSite end = itLineSiteService.selectOne(new EntityWrapper<TLineSite>().eq("lineId", tLine.getId()).eq("type", 2));
+        if (SinataUtil.isNotEmpty(end)){
+            if (end.getSiteId().intValue() != endSiteId.intValue()){
+                end.setSiteId(endSiteId);
+                itLineSiteService.updateById(end);
+            }
+        }else{
+            end = new TLineSite();
+            end.setLineId(tLine.getId());
+            end.setSiteId(endSiteId);
+            end.setType(2);
+            itLineSiteService.insert(end);
+        }
+
+        //删除线路价格
+        itLinePriceService.delete(new EntityWrapper<TLinePrice>().eq("lineId",tLine.getId()));
+        //添加价格设置
+        addPrice(tLine.getId(), subArr);
+        //删除线路班次
+        itLineShiftService.delete(new EntityWrapper<TLineShift>().eq("lineId",tLine.getId()));
+        //添加班次设置
+        return addShift(tLine.getId(), shuArr);
+
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCharterController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCharterController.java
new file mode 100644
index 0000000..84e5fb9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCharterController.java
@@ -0,0 +1,109 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TOrderEvaluate;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TOrderCharter;
+import com.stylefeng.guns.modular.system.service.ITOrderCharterService;
+
+import java.util.Map;
+
+/**
+ * 旅游包车订单控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-02 10:39:00
+ */
+@Controller
+@RequestMapping("/tOrderCharter")
+public class TOrderCharterController extends BaseController {
+
+    private String PREFIX = "/system/tOrderCharter/";
+
+    @Autowired
+    private ITOrderCharterService tOrderCharterService;
+
+    /**
+     * 跳转到旅游包车订单首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tOrderCharter.html";
+    }
+
+    /**
+     * 跳转到查看详情
+     */
+    @RequestMapping("/lookDetail/{id}")
+    public String lookDetail(@PathVariable Integer id, Model model) {
+        TOrderCharter tOrderCharter = tOrderCharterService.selectById(id);
+        model.addAttribute("str",tOrderCharter.getRemark());
+        return "/system/tComplaint/lookDetail.html";
+    }
+
+    /**
+     * 跳转到修改旅游包车订单
+     */
+    @RequestMapping("/tOrderCharter_immediately/{tOrderCharterId}")
+    public String tOrderCharterUpdate(@PathVariable Integer tOrderCharterId, Model model) {
+        model.addAttribute("id",tOrderCharterId);
+        return PREFIX + "tOrderCharter_immediately.html";
+    }
+
+    /**
+     * 获取旅游包车订单列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,String userName,String contactName,String contactPhone,String useDemand,Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tOrderCharterService.getCharterOrderList(page,beginTime,endTime,userName,contactName,contactPhone,useDemand,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 立即处理
+     */
+    @RequestMapping(value = "/immediately")
+    @ResponseBody
+    public Object immediately(TOrderCharter tOrderCharter) {
+        tOrderCharter.setState(2);
+        tOrderCharterService.updateById(tOrderCharter);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除旅游包车订单
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tOrderCharterId) {
+        TOrderCharter tOrderCharter = tOrderCharterService.selectById(tOrderCharterId);
+        tOrderCharter.setState(3);
+        tOrderCharterService.updateById(tOrderCharter);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCharteredCarController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCharteredCarController.java
new file mode 100644
index 0000000..24e50fd
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCharteredCarController.java
@@ -0,0 +1,108 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TOrderCharter;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TOrderCharteredCar;
+import com.stylefeng.guns.modular.system.service.ITOrderCharteredCarService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 旅游包车订单控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-24 11:08:23
+ */
+@Controller
+@RequestMapping("/tOrderCharteredCar")
+public class TOrderCharteredCarController extends BaseController {
+
+    private String PREFIX = "/system/tOrderCharteredCar/";
+
+    @Autowired
+    private ITOrderCharteredCarService tOrderCharteredCarService;
+
+    /**
+     * 跳转到旅游包车订单首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tOrderCharteredCar.html";
+    }
+
+    /**
+     * 跳转到修改旅游包车订单
+     */
+    @RequestMapping("/tOrderCharteredCar_immediately/{tOrderCharteredCarId}")
+    public String tOrderCharteredCarUpdate(@PathVariable Integer tOrderCharteredCarId, Model model) {
+        model.addAttribute("id",tOrderCharteredCarId);
+        return PREFIX + "tOrderCharteredCar_immediately.html";
+    }
+
+    /**
+     * 获取旅游包车订单列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,String userName,String contactPerson,String contactPhone,String modelUse,Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            List<Map<String, Object>> charterCarOrderList = tOrderCharteredCarService.getCharterCarOrderList(page, beginTime, endTime, userName, contactPerson, contactPhone, modelUse, state, ShiroKit.getUser().getRoleType(), ShiroKit.getUser().getObjectId());
+            for(Map<String, Object> map : charterCarOrderList){
+                String[] prices = map.get("price").toString().split("-");
+                String p = Double.valueOf(prices[0]) * Integer.valueOf(map.get("peopleNumber").toString()) + "-" + Double.valueOf(prices[1]) * Integer.valueOf(map.get("peopleNumber").toString());
+                map.put("price", p);
+
+            }
+            page.setRecords(charterCarOrderList);
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 立即处理
+     */
+    @RequestMapping(value = "/immediately")
+    @ResponseBody
+    public Object immediately(Integer id, String remark) {
+        TOrderCharteredCar tOrderCharteredCar = tOrderCharteredCarService.selectById(id);
+        tOrderCharteredCar.setState(2);
+        tOrderCharteredCar.setRemark(remark);
+        tOrderCharteredCarService.updateById(tOrderCharteredCar);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除旅游包车订单
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tOrderCharterId) {
+        TOrderCharteredCar tOrderCharter = tOrderCharteredCarService.selectById(tOrderCharterId);
+        tOrderCharter.setIsDelete(2);
+        tOrderCharteredCarService.updateById(tOrderCharter);
+        return SUCCESS_TIP;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java
new file mode 100644
index 0000000..882c620
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java
@@ -0,0 +1,301 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper;
+import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
+import com.stylefeng.guns.modular.system.util.PushURL;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.ui.Model;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+
+import javax.annotation.Resource;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 跨城出行订单控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-16 14:56:46
+ */
+@Controller
+@RequestMapping("/tOrderCrossCity")
+public class TOrderCrossCityController extends BaseController {
+
+    private String PREFIX = "/system/tOrderCrossCity/";
+
+    @Autowired
+    private ITOrderCrossCityService tOrderCrossCityService;
+
+    @Autowired
+    private ITServerCarmodelService tServerCarmodelService;
+
+    @Autowired
+    private ITLineService itLineService;
+
+    @Autowired
+    private ITOrderPositionService tOrderPositionService;
+
+    private ResultUtil resultUtil;
+
+    @Value("${filePath}")
+    private String filePath;
+
+    /**
+     * 跳转到跨城出行订单首页
+     */
+    @RequestMapping("")
+    public String index(Model model) {
+        //服务专车车型
+        List<TServerCarmodel> carmodelList = tServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 2).eq("state", 1));
+        model.addAttribute("carmodelList",carmodelList);
+        //线路
+        List<TLine> lineList = itLineService.selectList(new EntityWrapper<TLine>().last(" where not FIND_IN_SET(state,'3')"));
+        model.addAttribute("lineList",lineList);
+        return PREFIX + "tOrderCrossCity.html";
+    }
+
+    /**
+     * 跳转到查看跨城出行订单详情页面
+     */
+    @RequestMapping("/tOrderCrossCity_detail/{tOrderCrossCityId}")
+    public String tOrderCrossCityUpdate(@PathVariable Integer tOrderCrossCityId, Model model) {
+        Map<String, Object> item = tOrderCrossCityService.getCrossCityOrderDetailById(tOrderCrossCityId);
+        model.addAttribute("item",item);
+        return PREFIX + "tOrderCrossCity_detail.html";
+    }
+
+    /**
+     * 跳转到跨城出行订单轨迹页面
+     */
+    @RequestMapping("/tOrderCrossCity_track/{tOrderCrossCityId}")
+    public String tOrderCrossCity_track(@PathVariable Integer tOrderCrossCityId, Model model) {
+        model.addAttribute("tOrderCrossCityId",tOrderCrossCityId);
+        return PREFIX + "tOrderCrossCity_track.html";
+    }
+
+    /**
+     * 获取订单轨迹
+     * @param orderDetailId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getOrderTrack", method = RequestMethod.POST)
+    public ResultUtil getOrderTrack(String orderDetailId){
+        if(ToolUtil.isNotEmpty(orderDetailId)){
+            try {
+                //将数据存储到文件中
+                File file = new File(filePath + orderDetailId + "_3.txt");
+                if(!file.exists()){
+                    return ResultUtil.success(new ArrayList<>());
+                }
+                //读取文件(字符流)
+                BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
+                //循环取出数据
+                String str = null;
+                StringBuffer sb = new StringBuffer();
+                while ((str = in.readLine()) != null) {
+                    sb.append(str);
+                }
+                List<TOrderPosition> list = JSONArray.parseArray(sb.toString(), TOrderPosition.class);
+//                List<TOrderPosition> list = tOrderPositionService.selectList(new EntityWrapper<TOrderPosition>().eq("orderType", 3).eq("orderId", orderDetailId).orderBy("insertTime"));
+                /*if(list.size() == 0){
+                    return ResultUtil.error("该订单没有运行轨迹");
+                }*/
+                resultUtil = ResultUtil.success(list);
+            }catch (Exception e){
+                e.printStackTrace();
+                resultUtil = ResultUtil.runErr();
+            }
+        }else {
+            resultUtil = ResultUtil.paranErr();
+        }
+        return resultUtil;
+    }
+
+    /**
+     * 获取跨城出行订单列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String orderNum,
+                       Integer orderSource,
+                       String userName,
+                       String userPhone,
+                       String passengers,
+                       String passengersPhone,
+                       Integer serverCarModelId,
+                       String driver,
+                       Integer lineId,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tOrderCrossCityService.getCrossCityOrderList(page,beginTime,endTime,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),orderNum,orderSource,userName,userPhone,passengers,passengersPhone,serverCarModelId,driver,lineId,state));
+        return super.packForBT(page);
+    }
+
+    @Autowired
+    private ITDriverService tDriverService;
+
+    @Resource
+    private LineShiftDriverMapper lineShiftDriverMapper;
+
+    @Autowired
+    private ITUserService userService;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+
+    @Resource
+    private OrderCancelMapper orderCancelMapper;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+
+
+
+    /**
+     * 取消跨城出行订单
+     */
+    @RequestMapping(value = "/cancel")
+    @ResponseBody
+    public Object cancel(@RequestParam Integer tOrderCrossCityId) throws Exception {
+        TOrderCrossCity tOrderCrossCity = tOrderCrossCityService.selectById(tOrderCrossCityId);
+        ShiroUser user = ShiroKit.getUser();
+
+        TOrderCrossCity orderCrossCity = tOrderCrossCityService.selectById(tOrderCrossCityId);
+        if(orderCrossCity.getState() > 5 && orderCrossCity.getState() != 11 && orderCrossCity.getState() != 7){
+            return ResultUtil.error("订单状态不在可取消范围内");
+        }
+        orderCrossCity.setState(10);
+        tOrderCrossCityService.updateById(orderCrossCity);
+
+        if(orderCrossCity.getDriverId() != null){
+            //修改司机信息
+            LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
+            lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat() ?
+                    lineShiftDriver.getTotalSeat() : lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
+            String seat = "";
+            String[] split = orderCrossCity.getSeatNumber().split(",");
+            for(String s : split){
+                seat += s + ",";
+            }
+            seat = lineShiftDriver.getLaveSeatNumber() + "," + seat.substring(0, seat.length() - 1);
+
+            //总和大于总座位数的情况
+            if(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat()){
+                seat = "";
+                for(int i = 1; i <= lineShiftDriver.getTotalSeat(); i++){
+                    seat += i + ",";
+                }
+                seat = seat.substring(0, seat.length() - 1);
+            }
+            lineShiftDriver.setLaveSeatNumber(seat);
+            lineShiftDriverMapper.updateById(lineShiftDriver);
+            if(lineShiftDriver.getLaveSeat() >= lineShiftDriver.getTotalSeat()){
+                TDriver driver = tDriverService.selectById(orderCrossCity.getDriverId());
+                driver.setState(2);
+                tDriverService.updateById(driver);
+            }
+        }
+
+
+        //已支付的情况下进行退款操作
+        if(null != orderCrossCity.getPayType() && null != orderCrossCity.getPayMoney()) {
+            if (orderCrossCity.getPayType() == 3) {//余额支付
+                TUser tUser = userService.selectById(orderCrossCity.getUserId());
+                tUser.setBalance(tUser.getBalance().add(orderCrossCity.getPayMoney()));
+                userService.updateById(tUser);
+                //添加交易明细
+                transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城订单取消退款", orderCrossCity.getPayMoney().doubleValue(), 1, 1, 1, 3, tOrderCrossCityId);
+            } else {
+                PaymentRecord query = paymentRecordService.query(1, null, null, tOrderCrossCityId, 3, null, 2).get(0);
+                if (null == query) {
+                    return ResultUtil.error("订单还未进行支付");
+                }
+            }
+
+            //添加负的收入明细
+            List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", tOrderCrossCityId).eq("orderType", 3));
+            for(Income income : incomes){
+                if(income.getUserType() == 2){//处理司机的收入
+                    TDriver driver = tDriverService.selectById(income.getObjectId());
+                    driver.setBalance(driver.getBalance().subtract(new BigDecimal(income.getMoney())));
+                    driver.setLaveBusinessMoney(new BigDecimal(driver.getLaveBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue());
+                    driver.setBusinessMoney(new BigDecimal(driver.getBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue());
+                    tDriverService.updateById(driver);
+                }
+                Income income1 = new Income();
+                BeanUtils.copyProperties(income, income1);
+                income1.setMoney(income.getMoney() * -1);
+                income1.setId(null);
+                income1.setInsertTime(new Date());
+                incomeService.insert(income1);
+            }
+        }
+        //添加取消记录
+        OrderCancel orderCancel = new OrderCancel();
+        orderCancel.setOrderId(tOrderCrossCityId);
+        orderCancel.setOrderType(3);
+        orderCancel.setReason("调度端取消订单");
+        orderCancel.setRemark("调度“" + user.getName() + "-" + user.getId() + "”执行取消操作");
+        orderCancel.setState(2);
+        orderCancel.setInsertTime(new Date());
+        orderCancel.setUserType(3);
+        orderCancel.setUserId(user.getId());
+        orderCancelMapper.insert(orderCancel);
+
+
+        //增加推送
+        Map<String,String> map1 = new HashMap<>();
+        map1.put("id", tOrderCrossCity.getId().toString());
+        map1.put("orderType", "3");
+        String result1 = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map1);
+        System.out.println("跨城出行取消:【orderId="+tOrderCrossCity.getId().toString()+"】,调用接口:"+result1);
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除跨城出行订单
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tOrderCrossCityId) {
+        TOrderCrossCity tOrderCrossCity = tOrderCrossCityService.selectById(tOrderCrossCityId);
+        tOrderCrossCity.setIsDelete(2);
+        tOrderCrossCityService.updateById(tOrderCrossCity);
+        return SUCCESS_TIP;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java
new file mode 100644
index 0000000..5c006b4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java
@@ -0,0 +1,211 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
+import com.stylefeng.guns.modular.system.util.PushURL;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 小件物流订单控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-24 14:20:41
+ */
+@Controller
+@RequestMapping("/tOrderLogistics")
+public class TOrderLogisticsController extends BaseController {
+
+    private String PREFIX = "/system/tOrderLogistics/";
+
+    @Autowired
+    private ITOrderLogisticsService tOrderLogisticsService;
+
+    @Resource
+    private OrderCancelMapper orderCancelMapper;
+
+    @Autowired
+    private ITUserService userService;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @Autowired
+    private ITDriverService tDriverService;
+
+
+
+
+    /**
+     * 跳转到小件物流订单首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tOrderLogistics.html";
+    }
+
+    /**
+     * 跳转到添加小件物流订单
+     */
+    @RequestMapping("/tOrderLogistics_add")
+    public String tOrderLogisticsAdd() {
+        return PREFIX + "tOrderLogistics_add.html";
+    }
+
+    /**
+     * 跳转到查看小件物流订单
+     */
+    @RequestMapping("/tOrderLogistics_detail/{tOrderLogisticsId}")
+    public String tOrderLogistics_detail(@PathVariable Integer tOrderLogisticsId, Model model) {
+        Map<String,Object> tOrderLogistics = tOrderLogisticsService.getLogisticsOrderDetailById(tOrderLogisticsId);
+        model.addAttribute("item",tOrderLogistics);
+        return PREFIX + "tOrderLogistics_detail.html";
+    }
+
+    /**
+     * 获取小件物流订单列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String orderNum,
+                       Integer type,
+                       Integer orderSource,
+                       String userName,
+                       String userPhone,
+                       String recipient,
+                       String recipientPhone,
+                       String driver,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tOrderLogisticsService.getLogisticsOrderList(page,beginTime,endTime,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),
+                orderNum,orderSource,type,userName,userPhone,recipient,recipientPhone,driver,state));
+        return super.packForBT(page);
+    }
+
+    @Autowired
+    private ITDriverService itDriverService;
+
+    /**
+     * 取消小件物流订单
+     */
+    @RequestMapping(value = "/cancel")
+    @ResponseBody
+    public Object cancel(@RequestParam Integer tOrderLogisticsId) {
+        try{
+            ShiroUser user = ShiroKit.getUser();
+            TOrderLogistics tOrderLogistics = tOrderLogisticsService.selectById(tOrderLogisticsId);
+            tOrderLogistics.setState(10);
+
+            //已支付的情况下进行退款操作
+            if(null != tOrderLogistics.getPayType() && null != tOrderLogistics.getPayMoney()) {
+                if (tOrderLogistics.getPayType() == 3) {//余额支付
+                    TUser tUser = userService.selectById(tOrderLogistics.getUserId());
+                    tUser.setBalance(tUser.getBalance().add(tOrderLogistics.getPayMoney()));
+                    userService.updateById(tUser);
+                } else {
+                    List<PaymentRecord> paymentRecords = paymentRecordService.query(1, null, null, tOrderLogisticsId, tOrderLogistics.getType(), null, 2);
+                    if (paymentRecords.size() == 0) {
+                        return ResultUtil.error("订单还未进行支付");
+                    }
+                    boolean b = false;
+
+                }
+
+                transactionDetailsService.saveData(tOrderLogistics.getUserId(), "小件订单取消退款", tOrderLogistics.getPayMoney().doubleValue(), 1, 1, 1, 4, tOrderLogistics.getId());
+
+                //添加负的收入明细
+                List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", tOrderLogistics.getId()).eq("orderType", tOrderLogistics.getType()));
+                for(Income income : incomes){
+                    if(income.getUserType() == 2){//处理司机的收入
+                        TDriver driver = tDriverService.selectById(income.getObjectId());
+                        driver.setBalance(driver.getBalance().subtract(new BigDecimal(income.getMoney())));
+                        driver.setLaveBusinessMoney(new BigDecimal(driver.getLaveBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue());
+                        driver.setBusinessMoney(new BigDecimal(driver.getBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue());
+                        tDriverService.updateById(driver);
+                    }
+                    Income income1 = new Income();
+                    BeanUtils.copyProperties(income, income1);
+                    income1.setMoney(income.getMoney() * -1);
+                    income1.setId(null);
+                    income1.setInsertTime(new Date());
+                    incomeService.insert(income1);
+                }
+            }
+            tOrderLogisticsService.updateById(tOrderLogistics);
+
+            //添加取消记录
+            OrderCancel orderCancel = new OrderCancel();
+            orderCancel.setOrderId(tOrderLogistics.getId());
+            orderCancel.setOrderType(tOrderLogistics.getType());
+            orderCancel.setReason("调度端取消订单");
+            orderCancel.setRemark("调度“" + user.getName() + "-" + user.getId() + "”执行取消操作");
+            orderCancel.setState(2);
+            orderCancel.setInsertTime(new Date());
+            orderCancel.setUserType(3);
+            orderCancel.setUserId(user.getId());
+            orderCancelMapper.insert(orderCancel);
+
+            //增加推送
+            Map<String,String> map = new HashMap<>();
+            map.put("id", tOrderLogistics.getId().toString());
+            map.put("orderType", tOrderLogistics.getType().toString());
+            String result = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map);
+            System.out.println("小件物流取消:【orderId="+tOrderLogistics.getId().toString()+"】,调用接口:"+result);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除小件物流订单
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tOrderLogisticsId) {
+        TOrderLogistics tOrderLogistics = tOrderLogisticsService.selectById(tOrderLogisticsId);
+        tOrderLogistics.setIsDelete(2);
+        tOrderLogisticsService.updateById(tOrderLogistics);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java
new file mode 100644
index 0000000..c01ce17
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java
@@ -0,0 +1,227 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
+import com.stylefeng.guns.modular.system.util.PushMinistryOfTransportUtil;
+import com.stylefeng.guns.modular.system.util.PushURL;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.ui.Model;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+
+import javax.annotation.Resource;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.util.*;
+
+/**
+ * 专车订单控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-02 17:28:59
+ */
+@Controller
+@RequestMapping("/tOrderPrivateCar")
+public class TOrderPrivateCarController extends BaseController {
+
+    private String PREFIX = "/system/tOrderPrivateCar/";
+
+    @Autowired
+    private ITOrderPrivateCarService tOrderPrivateCarService;
+
+    @Autowired
+    private ITServerCarmodelService tServerCarmodelService;
+
+    @Autowired
+    private ITOrderPositionService tOrderPositionService;
+
+    @Autowired
+    private ITDriverService tDriverService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Resource
+    private OrderCancelMapper orderCancelMapper;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+    @Value("${filePath}")
+    private String filePath;
+
+
+
+
+    /**
+     * 跳转到专车订单首页
+     */
+    @RequestMapping("")
+    public String index(Model model) {
+        //服务专车车型
+        List<TServerCarmodel> carmodelList = tServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 1).eq("state", 1));
+        model.addAttribute("carmodelList",carmodelList);
+        return PREFIX + "tOrderPrivateCar.html";
+    }
+
+    /**
+     * 跳转到修改专车订单
+     */
+    @RequestMapping("/tOrderPrivateCar_orderDetail/{tOrderPrivateCarId}")
+    public String tOrderPrivateCarUpdate(@PathVariable Integer tOrderPrivateCarId, Model model) {
+        Map<String, Object> item = tOrderPrivateCarService.getPrivateCarOrderDetailById(tOrderPrivateCarId);
+        model.addAttribute("item",item);
+        return PREFIX + "tOrderPrivateCar_orderDetail.html";
+    }
+
+    /**
+     * 跳转到出租车订单轨迹页面
+     */
+    @RequestMapping("/tOrderPrivateCar_trajectory/{tOrderPrivateCarId}")
+    public String tOrderTaxi_trajectory(@PathVariable Integer tOrderPrivateCarId, Model model) {
+        model.addAttribute("tOrderPrivateCarId",tOrderPrivateCarId);
+        return PREFIX + "tOrderPrivateCar_trajectory.html";
+    }
+
+    /**
+     * 获取专车订单列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String orderNum,
+                       Integer orderSource,
+                       String userName,
+                       String userPhone,
+                       String passengers,
+                       String passengersPhone,
+                       Integer serverCarModelId,
+                       String driver,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tOrderPrivateCarService.getPrivateCarOrderList(page,beginTime,endTime,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),orderNum,orderSource,userName,userPhone,passengers,passengersPhone,serverCarModelId,driver,state));
+        return super.packForBT(page);
+    }
+
+    private ResultUtil resultUtil;
+
+    /**
+     * 获取订单轨迹
+     * @param orderDetailId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getOrderTrack", method = RequestMethod.POST)
+    public ResultUtil getOrderTrack(String orderDetailId){
+        if(ToolUtil.isNotEmpty(orderDetailId)){
+            try {
+//                List<TOrderPosition> list = tOrderPositionService.selectList(new EntityWrapper<TOrderPosition>().eq("orderType", 1).eq("orderId", orderDetailId).orderBy("insertTime"));
+                /*if(list.size() == 0){
+                    return ResultUtil.error("该订单没有运行轨迹");
+                }*/
+                //将数据存储到文件中
+                File file = new File(filePath + orderDetailId + "_1.txt");
+                if(!file.exists()){
+                    return ResultUtil.success(new ArrayList<>());
+                }
+                //读取文件(字符流)
+                BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
+                //循环取出数据
+                String str = null;
+                StringBuffer sb = new StringBuffer();
+                while ((str = in.readLine()) != null) {
+                    sb.append(str);
+                }
+                List<TOrderPosition> list = JSONArray.parseArray(sb.toString(), TOrderPosition.class);
+                resultUtil = ResultUtil.success(list);
+            }catch (Exception e){
+                e.printStackTrace();
+                resultUtil = ResultUtil.runErr();
+            }
+        }else {
+            resultUtil = ResultUtil.paranErr();
+        }
+        return resultUtil;
+    }
+
+    /**
+     * 取消专车订单
+     */
+    @RequestMapping(value = "/cancel")
+    @ResponseBody
+    public Object cancel(@RequestParam Integer tOrderPrivateCarId) {
+        TOrderPrivateCar tOrderPrivateCar = tOrderPrivateCarService.selectById(tOrderPrivateCarId);
+
+        //修改之前司机状态 -- 空闲
+        if(null != tOrderPrivateCar.getDriverId()){
+            TDriver driver = tDriverService.selectById(tOrderPrivateCar.getDriverId());
+            driver.setState(2);
+            tDriverService.updateById(driver);
+        }
+
+        tOrderPrivateCar.setState(10);
+        tOrderPrivateCarService.updateById(tOrderPrivateCar);
+
+        OrderCancel orderCancel = new OrderCancel();
+        orderCancel.setOrderId(tOrderPrivateCarId);
+        orderCancel.setOrderType(1);
+        orderCancel.setReason("平台取消订单");
+        orderCancel.setRemark("平台取消订单");
+        orderCancel.setUserType(2);
+        orderCancel.setState(2);
+        orderCancel.setInsertTime(new Date());
+        orderCancelMapper.insert(orderCancel);
+
+        //增加推送
+        Map<String,String> map = new HashMap<>();
+        map.put("id", tOrderPrivateCar.getId().toString());
+        map.put("orderType", "1");
+        String result = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map);
+        System.out.println("专车取消:【orderId="+tOrderPrivateCar.getId().toString()+"】,调用接口:"+result);
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport){//上传数据
+                    pushMinistryOfTransportUtil.orderCancel(tOrderPrivateCarId);
+                }
+            }
+        }).start();
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除专车订单
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tOrderPrivateCarId) {
+        TOrderPrivateCar tOrderPrivateCar = tOrderPrivateCarService.selectById(tOrderPrivateCarId);
+        tOrderPrivateCar.setIsDelete(2);
+        tOrderPrivateCarService.updateById(tOrderPrivateCar);
+        return SUCCESS_TIP;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java
new file mode 100644
index 0000000..f21ab1b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java
@@ -0,0 +1,798 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper;
+import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
+import com.stylefeng.guns.modular.system.util.PushURL;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 专车改派管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-03 14:20:27
+ */
+@Controller
+@RequestMapping("/tReassign")
+public class TReassignController extends BaseController {
+
+    private String PREFIX = "/system/tReassign/";
+
+    @Autowired
+    private ITReassignService tReassignService;
+
+    @Autowired
+    private ITOrderPrivateCarService itOrderPrivateCarService;
+
+    @Autowired
+    private ITOrderCrossCityService itOrderCrossCityService;
+
+    @Autowired
+    private ITDriverService itDriverService;
+
+    @Resource
+    private LineShiftDriverMapper lineShiftDriverMapper;
+
+    @Autowired
+    private  ITDispatchService dispatchService;
+
+    @Resource
+    private OrderCancelMapper orderCancelMapper;
+
+    @Autowired
+    private ITUserService userService;
+
+    @Autowired
+    private ITransactionDetailsService transactionDetailsService;
+
+    @Autowired
+    private IPaymentRecordService paymentRecordService;
+
+    @Autowired
+    private IIncomeService incomeService;
+
+    @Autowired
+    private ITOrderLogisticsService orderLogisticsService;
+
+
+
+    /**
+     * 跳转到专车改派管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tReassign.html";
+    }
+
+    /**
+     * 跳转到跨城出行改派管理首页
+     */
+    @RequestMapping("/cross")
+    public String corse() {
+        return PREFIX + "cross.html";
+    }
+
+
+    /**
+     * 跳转到小件物流改派管理首页
+     */
+    @RequestMapping("/smallPieceLogistics")
+    public String smallPieceLogistics() {
+        return PREFIX + "smallPieceLogistics.html";
+    }
+
+
+    /**
+     * 跳转到添加专车改派管理
+     */
+    @RequestMapping("/tReassign_add")
+    public String tReassignAdd() {
+        return PREFIX + "tReassign_add.html";
+    }
+
+    /**
+     * 跳转到修改专车改派管理
+     */
+    @RequestMapping("/tReassign_update/{tReassignId}")
+    public String tReassignUpdate(@PathVariable Integer tReassignId, Model model) {
+        TReassign tReassign = tReassignService.selectById(tReassignId);
+        model.addAttribute("item",tReassign);
+        LogObjectHolder.me().set(tReassign);
+        return PREFIX + "tReassign_edit.html";
+    }
+
+    /**
+     * 跳转到修改专车改派管理
+     */
+    @RequestMapping("/tReassign_reassignment/{tReassignId}")
+    public String tReassign_reassignment(@PathVariable Integer tReassignId, Model model) {
+        model.addAttribute("tReassignId",tReassignId);
+        return PREFIX + "tReassign_reassignment.html";
+    }
+
+    /**
+     * 跳转到修改跨城改派管理
+     */
+    @RequestMapping("/tReassign_reassignmentCross/{tReassignId}")
+    public String tReassign_reassignmentCross(@PathVariable Integer tReassignId, Model model) {
+        model.addAttribute("tReassignId",tReassignId);
+        return PREFIX + "tReassign_reassignmentCross.html";
+    }
+
+    /**
+     * 跳转到修改跨城改派管理
+     */
+    @RequestMapping("/tReassign_reassignmentSmall/{tReassignId}")
+    public String tReassign_reassignmentSmall(@PathVariable Integer tReassignId, Model model) {
+        model.addAttribute("tReassignId",tReassignId);
+        return PREFIX + "tReassign_reassignmentSmall.html";
+    }
+
+    /**
+     * 获取专车改派管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String originalDriverName,
+                       String originalDriverPhone,
+                       String orderNum,
+                       String nowDriverName,
+                       String nowDriverPhone,
+                       Integer orderState,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tReassignService.getPrivateCarReassignOrderList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),beginTime,endTime,originalDriverName,originalDriverPhone,orderNum,nowDriverName,nowDriverPhone,orderState,state));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 获取跨城改派管理列表
+     */
+    @RequestMapping(value = "/listCross")
+    @ResponseBody
+    public Object listCross(String insertTime,
+                       String originalDriverName,
+                       String originalDriverPhone,
+                       String orderNum,
+                       String nowDriverName,
+                       String nowDriverPhone,
+                       Integer orderState,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tReassignService.getCrossReassignOrderList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),beginTime,endTime,originalDriverName,originalDriverPhone,orderNum,nowDriverName,nowDriverPhone,orderState,state));
+        return super.packForBT(page);
+    }
+
+
+    /**
+     * 获取跨城改派管理列表
+     */
+    @RequestMapping(value = "/listSmallPieceLogistics")
+    @ResponseBody
+    public Object listSmallPieceLogistics(String insertTime,
+                            String originalDriverName,
+                            String originalDriverPhone,
+                            String orderNum,
+                            String nowDriverName,
+                            String nowDriverPhone,
+                            Integer orderState,
+                            Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tReassignService.getSmallPieceLogisticsList(page,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),beginTime,endTime,originalDriverName,originalDriverPhone,orderNum,nowDriverName,nowDriverPhone,orderState,state));
+        return super.packForBT(page);
+    }
+
+
+    /**
+     * 选择司机列表
+     */
+    @RequestMapping(value = "/selectDriver/{orderId}")
+    @ResponseBody
+    public Object selectDriver(@PathVariable Integer orderId,
+                               String name,
+                               String phone) {
+        TReassign reassign = tReassignService.selectById(orderId);
+        TOrderPrivateCar privateCar = itOrderPrivateCarService.selectById(reassign.getOrderId());
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tReassignService.getCanSelectPrivateCarDriverList(page,privateCar.getCompanyId(),name,phone));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 选择司机列表
+     */
+    @RequestMapping(value = "/selectCrossDriver/{orderId}")
+    @ResponseBody
+    public Object selectCrossDriver(@PathVariable Integer orderId,
+                                    String name,
+                                    String phone) {
+        TReassign reassign = tReassignService.selectById(orderId);
+        TOrderCrossCity tOrderCrossCity = itOrderCrossCityService.selectById(reassign.getOrderId());
+        LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(tOrderCrossCity.getLineShiftDriverId());
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tReassignService.getCanSelectCrossDriverList(page, tOrderCrossCity.getCompanyId(), tOrderCrossCity.getServerCarModelId(),
+                tOrderCrossCity.getLineId(), lineShiftDriver.getLineShiftId(), tOrderCrossCity.getTravelTime(), tOrderCrossCity.getPeopleNumber(), name, phone, tOrderCrossCity.getDriverId()));
+        return super.packForBT(page);
+    }
+
+
+    /**
+     * 选择司机列表
+     */
+    @RequestMapping(value = "/selectSmallDriver/{orderId}")
+    @ResponseBody
+    public Object selectSmallDriver(@PathVariable Integer orderId,
+                               String name,
+                               String phone) {
+        TReassign reassign = tReassignService.selectById(orderId);
+        TOrderLogistics tOrderLogistics = orderLogisticsService.selectById(reassign.getOrderId());
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tReassignService.getCanSelectSmallDriverList(page,tOrderLogistics.getCompanyId(), tOrderLogistics.getType(),name,phone));
+        return super.packForBT(page);
+    }
+
+
+    /**
+     * 操作专车改派管理
+     * optType 1=拒绝 2=取消
+     */
+    @RequestMapping(value = "/opt")
+    @ResponseBody
+    public Object opt(@RequestParam Integer tReassignId,@RequestParam Integer optType) {
+        ShiroUser user = ShiroKit.getUser();
+        TReassign tReassign = tReassignService.selectById(tReassignId);
+        if (1 == optType){
+            tReassign.setState(5);
+            tReassignService.updateById(tReassign);
+
+            //还原订单状态
+            TOrderPrivateCar tOrderPrivateCar = itOrderPrivateCarService.selectById(tReassign.getOrderId());
+            tOrderPrivateCar.setState(tOrderPrivateCar.getOldState());
+            itOrderPrivateCarService.updateById(tOrderPrivateCar);
+        }else if (2 == optType){
+            tReassign.setState(4);
+            tReassignService.updateById(tReassign);
+
+            //修改订单状态"已取消"
+            TOrderPrivateCar tOrderPrivateCar = itOrderPrivateCarService.selectById(tReassign.getOrderId());
+            tOrderPrivateCar.setState(10);
+            itOrderPrivateCarService.updateById(tOrderPrivateCar);
+
+            //修改司机状态"空闲"
+            TDriver driver = itDriverService.selectById(tReassign.getOriginalDriverId());
+            driver.setState(2);
+            itDriverService.updateById(driver);
+
+            //添加取消记录
+            OrderCancel orderCancel = new OrderCancel();
+            orderCancel.setOrderId(tReassign.getOrderId());
+            orderCancel.setOrderType(tReassign.getOrderType());
+            orderCancel.setReason("调度端取消订单");
+            orderCancel.setRemark("调度“" + user.getName() + "-" + user.getId() + "”执行取消操作");
+            orderCancel.setState(2);
+            orderCancel.setInsertTime(new Date());
+            orderCancel.setUserType(3);
+            orderCancel.setUserId(user.getId());
+            orderCancelMapper.insert(orderCancel);
+
+            //调用推送
+            Map<String,String> map = new HashMap<>();
+            map.put("id", tOrderPrivateCar.getId().toString());
+            map.put("orderType", "1");
+            String result = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map);
+            System.out.println("专车取消:【orderId="+tOrderPrivateCar.getId().toString()+"】,调用接口:"+result);
+        }
+
+        //返回驾驶员处罚金
+        TDriver originalDriver = itDriverService.selectById(tReassign.getOriginalDriverId());
+
+        //增加交易明细
+        TPubTransactionDetails details = new TPubTransactionDetails();
+        details.setUserId(originalDriver.getId());
+        details.setInsertTime(new Date());
+        details.setRemark("【专车改派】:改派失败或订单取消");
+        details.setMoney(new BigDecimal(tReassign.getMoney()));
+        details.setState(1);
+        details.setType(1);
+        details.setUserType(2);
+        details.setOrderType(3);
+        details.setOrderId(tReassign.getOrderId());
+        itPubTransactionDetailsService.insert(details);
+        return SUCCESS_TIP;
+    }
+
+    @Autowired
+    private ITPubTransactionDetailsService itPubTransactionDetailsService;
+
+    /**
+     * 操作跨城改派管理
+     * optType 1=拒绝 2=取消
+     */
+    @RequestMapping(value = "/optCross")
+    @ResponseBody
+    public Object optCross(@RequestParam Integer tReassignId,@RequestParam Integer optType) {
+        try {
+            TReassign tReassign = tReassignService.selectById(tReassignId);
+            ShiroUser user = ShiroKit.getUser();
+            if (1 == optType){
+                tReassign.setState(5);
+                tReassign.setReviewer(user.getId());
+                tReassign.setReviewerType(2);
+                tReassignService.updateById(tReassign);
+
+                //还原订单状态
+                TOrderCrossCity tOrderCrossCity = itOrderCrossCityService.selectById(tReassign.getOrderId());
+                tOrderCrossCity.setState(tOrderCrossCity.getOldState());
+                itOrderCrossCityService.updateById(tOrderCrossCity);
+            }else if (2 == optType){
+                tReassign.setState(4);
+                tReassign.setReviewer(user.getId());
+                tReassign.setReviewerType(2);
+                tReassignService.updateById(tReassign);
+
+                TOrderCrossCity orderCrossCity = itOrderCrossCityService.selectById(tReassign.getOrderId());
+                if(orderCrossCity.getState() > 5 && orderCrossCity.getState() != 11){
+                    return ResultUtil.error("订单状态不在可取消范围内");
+                }
+                orderCrossCity.setState(10);
+                itOrderCrossCityService.updateById(orderCrossCity);
+
+                //修改司机信息
+                LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(orderCrossCity.getLineShiftDriverId());
+                lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat() ?
+                        lineShiftDriver.getTotalSeat() : lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber());
+                String seat = "";
+                String[] split = orderCrossCity.getSeatNumber().split(",");
+                for(String s : split){
+                    seat += s + ",";
+                }
+                seat = lineShiftDriver.getLaveSeatNumber() + "," + seat.substring(0, seat.length() - 1);
+
+                //总和大于总座位数的情况
+                if(lineShiftDriver.getLaveSeat() + orderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat()){
+                    seat = "";
+                    for(int i = 1; i <= lineShiftDriver.getTotalSeat(); i++){
+                        seat += i + ",";
+                    }
+                    seat = seat.substring(0, seat.length() - 1);
+                }
+                lineShiftDriver.setLaveSeatNumber(seat);
+                lineShiftDriverMapper.updateById(lineShiftDriver);
+                if(lineShiftDriver.getLaveSeat() >= lineShiftDriver.getTotalSeat()){
+                    TDriver driver = itDriverService.selectById(tReassign.getOriginalDriverId());
+                    driver.setState(2);
+                    itDriverService.updateById(driver);
+                }
+
+                //调用推送
+                Map<String,String> map = new HashMap<>();
+                map.put("id", orderCrossCity.getId().toString());
+                map.put("orderType", "3");
+                String result = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map);
+                System.out.println("跨城出行取消:【orderId="+orderCrossCity.getId().toString()+"】,调用接口:"+result);
+
+
+                //已支付的情况下进行退款操作
+                if(null != orderCrossCity.getPayType() && null != orderCrossCity.getPayMoney()){
+                    if(orderCrossCity.getPayType() == 3){//余额支付
+                        TUser tUser = userService.selectById(orderCrossCity.getUserId());
+                        tUser.setBalance(tUser.getBalance().add(orderCrossCity.getPayMoney()));
+                        userService.updateById(tUser);
+                        //添加交易明细
+                        transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城订单取消退款", orderCrossCity.getPayMoney().doubleValue(), 1, 1, 1, 3, tReassign.getOrderId());
+                    }else{
+                        PaymentRecord query = paymentRecordService.query(1, null, null, tReassign.getOrderId(), 3, null, 2).get(0);
+                        if(null == query){
+                            return ResultUtil.error("订单还未进行支付");
+                        }
+                    }
+
+                    //添加负的收入明细
+                    List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", tReassign.getOrderId()).eq("orderType", 3));
+                    for(Income income : incomes){
+                        if(income.getUserType() == 2){//处理司机的收入
+                            TDriver driver = itDriverService.selectById(income.getObjectId());
+                            driver.setBalance(driver.getBalance().subtract(new BigDecimal(income.getMoney())));
+                            driver.setLaveBusinessMoney(new BigDecimal(driver.getLaveBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue());
+                            driver.setBusinessMoney(new BigDecimal(driver.getBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue());
+                            itDriverService.updateById(driver);
+                        }
+                        Income income1 = new Income();
+                        BeanUtils.copyProperties(income, income1);
+                        income1.setMoney(income.getMoney() * -1);
+                        income1.setId(null);
+                        income1.setInsertTime(new Date());
+                        incomeService.insert(income1);
+                    }
+                }
+
+                //添加取消记录
+                OrderCancel orderCancel = new OrderCancel();
+                orderCancel.setOrderId(tReassign.getOrderId());
+                orderCancel.setOrderType(tReassign.getOrderType());
+                orderCancel.setReason("调度端取消订单");
+                orderCancel.setRemark("调度“" + user.getName() + "-" + user.getId() + "”执行取消操作");
+                orderCancel.setState(2);
+                orderCancel.setInsertTime(new Date());
+                orderCancel.setUserType(3);
+                orderCancel.setUserId(user.getId());
+                orderCancelMapper.insert(orderCancel);
+            }
+
+            //返回驾驶员处罚金
+            TDriver originalDriver = itDriverService.selectById(tReassign.getOriginalDriverId());
+
+            //增加交易明细
+            TPubTransactionDetails details = new TPubTransactionDetails();
+            details.setUserId(originalDriver.getId());
+            details.setInsertTime(new Date());
+            details.setRemark("【跨城改派】:改派失败或订单取消");
+            details.setMoney(new BigDecimal(tReassign.getMoney()));
+            details.setState(1);
+            details.setType(1);
+            details.setUserType(2);
+            details.setOrderType(3);
+            details.setOrderId(tReassign.getOrderId());
+            itPubTransactionDetailsService.insert(details);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return SUCCESS_TIP;
+    }
+
+
+
+    /**
+     * 操作专车改派管理
+     * optType 1=拒绝 2=取消
+     */
+    @RequestMapping(value = "/optSmall")
+    @ResponseBody
+    public Object optSmall(@RequestParam Integer tReassignId,@RequestParam Integer optType) {
+        try {
+            ShiroUser user = ShiroKit.getUser();
+            TReassign tReassign = tReassignService.selectById(tReassignId);
+            if (1 == optType){
+                tReassign.setState(5);
+                tReassignService.updateById(tReassign);
+
+                //还原订单状态
+                TOrderLogistics tOrderLogistics = orderLogisticsService.selectById(tReassign.getOrderId());
+                tOrderLogistics.setState(tOrderLogistics.getOldState());
+                orderLogisticsService.updateById(tOrderLogistics);
+            }else if (2 == optType){
+                tReassign.setState(4);
+                tReassignService.updateById(tReassign);
+
+                //修改订单状态"已取消"
+                TOrderLogistics tOrderLogistics = orderLogisticsService.selectById(tReassign.getOrderId());
+                tOrderLogistics.setState(10);
+                orderLogisticsService.updateById(tOrderLogistics);
+
+                //添加取消记录
+                OrderCancel orderCancel = new OrderCancel();
+                orderCancel.setOrderId(tReassign.getOrderId());
+                orderCancel.setOrderType(tReassign.getOrderType());
+                orderCancel.setReason("调度端取消订单");
+                orderCancel.setRemark("调度“" + user.getName() + "-" + user.getId() + "”执行取消操作");
+                orderCancel.setState(2);
+                orderCancel.setInsertTime(new Date());
+                orderCancel.setUserType(3);
+                orderCancel.setUserId(user.getId());
+                orderCancelMapper.insert(orderCancel);
+
+                //调用推送
+                Map<String,String> map = new HashMap<>();
+                map.put("id", tOrderLogistics.getId().toString());
+                map.put("orderType", tOrderLogistics.getType().toString());
+                String result = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map);
+                System.out.println("小件物流取消:【orderId="+tOrderLogistics.getId().toString()+"】,调用接口:"+result);
+
+                //已支付的情况下进行退款操作
+                if(null != tOrderLogistics.getPayType() && null != tOrderLogistics.getPayMoney()) {
+                    if (tOrderLogistics.getPayType() == 3) {//余额支付
+                        TUser tUser = userService.selectById(tOrderLogistics.getUserId());
+                        tUser.setBalance(tUser.getBalance().add(tOrderLogistics.getPayMoney()));
+                        userService.updateById(tUser);
+                    } else {
+                        List<PaymentRecord> paymentRecords = paymentRecordService.query(1, null, null, tOrderLogistics.getId(), tOrderLogistics.getType(), null, 2);
+                        if (paymentRecords.size() == 0) {
+                            return ResultUtil.error("订单还未进行支付");
+                        }
+
+                    }
+
+                    transactionDetailsService.saveData(tOrderLogistics.getUserId(), "小件订单取消退款", tOrderLogistics.getPayMoney().doubleValue(), 1, 1, 1, 4, tOrderLogistics.getId());
+
+                    //添加负的收入明细
+                    List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("type", 2).eq("incomeId", tOrderLogistics.getId()).eq("orderType", tOrderLogistics.getType()));
+                    for(Income income : incomes){
+                        if(income.getUserType() == 2){//处理司机的收入
+                            TDriver driver = itDriverService.selectById(income.getObjectId());
+                            driver.setBalance(driver.getBalance().subtract(new BigDecimal(income.getMoney())));
+                            driver.setLaveBusinessMoney(new BigDecimal(driver.getLaveBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue());
+                            driver.setBusinessMoney(new BigDecimal(driver.getBusinessMoney()).subtract(new BigDecimal(income.getMoney())).doubleValue());
+                            itDriverService.updateById(driver);
+                        }
+                        Income income1 = new Income();
+                        BeanUtils.copyProperties(income, income1);
+                        income1.setMoney(income.getMoney() * -1);
+                        income1.setId(null);
+                        income1.setInsertTime(new Date());
+                        incomeService.insert(income1);
+                    }
+                }
+            }
+            //返回驾驶员处罚金
+            TDriver originalDriver = itDriverService.selectById(tReassign.getOriginalDriverId());
+
+            //增加交易明细
+            TPubTransactionDetails details = new TPubTransactionDetails();
+            details.setUserId(originalDriver.getId());
+            details.setInsertTime(new Date());
+            details.setRemark("【小件物流】:改派失败或订单取消");
+            details.setMoney(new BigDecimal(tReassign.getMoney()));
+            details.setState(1);
+            details.setType(1);
+            details.setUserType(2);
+            details.setOrderType(tReassign.getOrderType());
+            details.setOrderId(tReassign.getOrderId());
+            itPubTransactionDetailsService.insert(details);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return SUCCESS_TIP;
+    }
+
+
+    /**
+     * 专车订单改派司机
+     */
+    @RequestMapping(value = "/selectDriver")
+    @ResponseBody
+    public Object selectDriver(@RequestParam Integer orderId,@RequestParam Integer driverId) {
+        //修改订单
+        TReassign tReassign = tReassignService.selectById(orderId);
+        TOrderPrivateCar tOrderPrivateCar = itOrderPrivateCarService.selectById(tReassign.getOrderId());
+
+        //修改之前司机状态 -- 空闲
+        TDriver oldDriver = itDriverService.selectById(tReassign.getOriginalDriverId());
+        oldDriver.setState(2);
+        itDriverService.updateById(oldDriver);
+
+        //查找司机对象
+        TDriver nowDriver = itDriverService.selectById(driverId);
+        nowDriver.setState(3);
+        itDriverService.updateById(nowDriver);
+
+        //修改专车订单
+        tOrderPrivateCar.setState(tOrderPrivateCar.getOldState());
+        tOrderPrivateCar.setDriverId(driverId);
+        tOrderPrivateCar.setCarId(nowDriver.getCarId());
+        itOrderPrivateCarService.updateById(tOrderPrivateCar);
+
+        //修改专车改派订单
+        tReassign.setNowDriverId(driverId);
+        tReassign.setNowCarId(nowDriver.getCarId());
+        tReassign.setState(3);
+        tReassign.setCompleteTime(new Date());
+        tReassignService.updateById(tReassign);
+
+        //增加推送
+        Map<String,String> map = new HashMap<>();
+        map.put("orderId", tOrderPrivateCar.getId().toString());
+        map.put("orderType", "1");
+        String result = HttpRequestUtil.postRequest(PushURL.order_push_url, map);
+        System.out.println("专车改派:【orderId="+tOrderPrivateCar.getId().toString()+"】,调用接口:"+result);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 跨城出行订单改派司机
+     */
+    @RequestMapping(value = "/selectCrossDriver")
+    @ResponseBody
+    public Object selectCrossDriver(@RequestParam Integer orderId,@RequestParam Integer driverId) {
+        //修改原司机信息
+        //修改订单
+        TReassign tReassign = tReassignService.selectById(orderId);
+        TOrderCrossCity tOrderCrossCity = itOrderCrossCityService.selectById(tReassign.getOrderId());
+        TDriver oldDriver = itDriverService.selectById(tReassign.getOriginalDriverId());
+        LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(tOrderCrossCity.getLineShiftDriverId());
+        lineShiftDriver.setLaveSeat(lineShiftDriver.getLaveSeat() + tOrderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat() ?
+                lineShiftDriver.getTotalSeat() : lineShiftDriver.getLaveSeat() + tOrderCrossCity.getPeopleNumber());
+        String seat = "";
+        String[] split = tOrderCrossCity.getSeatNumber().split(",");
+        for(String s : split){
+            seat += s + ",";
+        }
+        seat = lineShiftDriver.getLaveSeatNumber() + "," + seat.substring(0, seat.length() - 1);
+
+        //总和大于总座位数的情况
+        if(lineShiftDriver.getLaveSeat() + tOrderCrossCity.getPeopleNumber() > lineShiftDriver.getTotalSeat()){
+            seat = "";
+            for(int i = 1; i <= lineShiftDriver.getTotalSeat(); i++){
+                seat += i + ",";
+            }
+            seat = seat.substring(0, seat.length() - 1);
+        }
+        lineShiftDriver.setLaveSeatNumber(seat);
+        lineShiftDriverMapper.updateById(lineShiftDriver);
+        if(lineShiftDriver.getLaveSeat() >= lineShiftDriver.getTotalSeat()){
+            oldDriver.setState(2);
+            itDriverService.updateById(oldDriver);
+        }
+
+        //修改新司机数据
+        List<LineShiftDriver> query = lineShiftDriverMapper.query(lineShiftDriver.getLineShiftId(), driverId, tOrderCrossCity.getTravelTime());
+        if(query.size() == 0){
+            return ResultUtil.error("司机没有预约班次");
+        }
+        LineShiftDriver lineShiftDriver1 = query.get(0);
+        if(lineShiftDriver1.getLaveSeat() < tOrderCrossCity.getPeopleNumber()){
+            return ResultUtil.runErr("司机车辆剩余座位数不足");
+        }
+        lineShiftDriver1.setLaveSeat(lineShiftDriver1.getLaveSeat() - tOrderCrossCity.getPeopleNumber());
+        String[] split1 = lineShiftDriver1.getLaveSeatNumber().split(",");
+        String seat1 = "";//使用
+        String seat2 = "";//未使用
+        for(int i = 0; i < tOrderCrossCity.getPeopleNumber(); i++){
+            seat1 += split1[i] + ",";
+        }
+        for(int i = tOrderCrossCity.getPeopleNumber(); i < split.length; i++){
+            seat2 += split1[i] + ",";
+        }
+        lineShiftDriver1.setLaveSeatNumber(seat2);
+        lineShiftDriverMapper.updateById(lineShiftDriver1);
+        TDriver driver = itDriverService.selectById(driverId);
+        if(driver.getState() == 1){
+            return ResultUtil.error("司机还未上班呢");
+        }
+        if(driver.getState() == 2){
+            driver.setState(3);
+        }
+
+        //修改订单数据
+        tOrderCrossCity.setDriverId(driverId);
+        tOrderCrossCity.setCarId(driver.getCarId());
+        tOrderCrossCity.setSeatNumber(seat1);
+        tOrderCrossCity.setState(tOrderCrossCity.getOldState());
+        tOrderCrossCity.setLineShiftDriverId(lineShiftDriver1.getId());
+        tOrderCrossCity.setOldState(null);
+        tOrderCrossCity.setIsReassign(2);
+        try {
+            tOrderCrossCity.setOrderNum(itOrderCrossCityService.getOrderNum(driverId, tOrderCrossCity.getLineShiftDriverId()));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        itOrderCrossCityService.updateAllColumnById(tOrderCrossCity);
+
+        //修改专车改派订单
+        tReassign.setNowDriverId(driverId);
+        tReassign.setNowCarId(driver.getCarId());
+        tReassign.setState(3);
+        tReassign.setCompleteTime(new Date());
+        tReassignService.updateById(tReassign);
+
+        //修改收入明细,转给新司机(因为是先支付金额)
+        List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("userType", 2).eq("objectId", oldDriver.getId()).eq("type", 2).eq("incomeId", tReassign.getOrderId()).eq("orderType", 3));
+        if(incomes.size() > 0){
+            Income income = incomes.get(0);
+            income.setObjectId(driverId);
+            incomeService.updateById(income);
+
+            oldDriver.setBusinessMoney(oldDriver.getBusinessMoney() - income.getMoney());
+            oldDriver.setLaveBusinessMoney(oldDriver.getLaveBusinessMoney() - income.getMoney());
+            oldDriver.setBalance(oldDriver.getBalance().subtract(new BigDecimal(income.getMoney())));
+
+            driver.setBusinessMoney(driver.getBusinessMoney() + income.getMoney());
+            driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() + income.getMoney());
+            driver.setBalance(driver.getBalance().add(new BigDecimal(income.getMoney())));
+
+        }
+        itDriverService.updateById(oldDriver);
+        itDriverService.updateById(driver);
+        //增加推送
+        Map<String,String> map = new HashMap<>();
+        map.put("orderId", tOrderCrossCity.getId().toString());
+        map.put("orderType", "3");
+        String result = HttpRequestUtil.postRequest(PushURL.order_push_url, map);
+        System.out.println("跨城出行改派:【orderId="+tOrderCrossCity.getId().toString()+"】,调用接口:"+result);
+        return SUCCESS_TIP;
+    }
+
+
+    /**
+     * 专车订单改派司机
+     */
+    @RequestMapping(value = "/selectSmallDriver")
+    @ResponseBody
+    public Object selectSmallDriver(@RequestParam Integer orderId,@RequestParam Integer driverId) {
+        //修改订单
+        TReassign tReassign = tReassignService.selectById(orderId);
+        TOrderLogistics tOrderLogistics = orderLogisticsService.selectById(tReassign.getOrderId());
+
+        TDriver nowDriver = itDriverService.selectById(driverId);
+        //修改专车订单
+        tOrderLogistics.setState(tOrderLogistics.getOldState());
+        tOrderLogistics.setDriverId(driverId);
+        tOrderLogistics.setCarId(nowDriver.getCarId());
+        orderLogisticsService.updateById(tOrderLogistics);
+
+        tReassign.setNowDriverId(driverId);
+        tReassign.setNowCarId(nowDriver.getCarId());
+        tReassign.setState(3);
+        tReassign.setCompleteTime(new Date());
+        tReassignService.updateById(tReassign);
+
+        List<Income> incomes = incomeService.selectList(new EntityWrapper<Income>().eq("userType", 2).eq("type", 2).eq("incomeId", tOrderLogistics.getId()).eq("orderType", tOrderLogistics.getType()));
+        for(Income income : incomes){
+            income.setObjectId(driverId);
+            incomeService.updateById(income);
+
+            TDriver driver = itDriverService.selectById(tReassign.getOriginalDriverId());
+            driver.setBalance(driver.getBalance().subtract(new BigDecimal(income.getMoney())));
+            driver.setBusinessMoney(driver.getBusinessMoney() - income.getMoney());
+            driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() - income.getMoney());
+            itDriverService.updateById(driver);
+
+            driver = itDriverService.selectById(driverId);
+            driver.setBalance(driver.getBalance().add(new BigDecimal(income.getMoney())));
+            driver.setBusinessMoney(driver.getBusinessMoney() + income.getMoney());
+            driver.setLaveBusinessMoney(driver.getLaveBusinessMoney() + income.getMoney());
+            itDriverService.updateById(driver);
+        }
+
+        //增加推送
+        Map<String,String> map = new HashMap<>();
+        map.put("orderId", tOrderLogistics.getId().toString());
+        map.put("orderType", tOrderLogistics.getType().toString());
+        String result = HttpRequestUtil.postRequest(PushURL.order_push_url, map);
+        System.out.println("小件物流改派:【orderId="+tOrderLogistics.getId().toString()+"】,调用接口:"+result);
+        return SUCCESS_TIP;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TServerCarmodelController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TServerCarmodelController.java
new file mode 100644
index 0000000..4844438
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TServerCarmodelController.java
@@ -0,0 +1,285 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TServerCarmodel;
+import com.stylefeng.guns.modular.system.service.ITServerCarmodelService;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 专车车型设置控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-08-29 09:06:02
+ */
+@Controller
+@RequestMapping("/tServerCarmodel")
+public class TServerCarmodelController extends BaseController {
+
+    private String PREFIX = "/system/tServerCarmodel/";
+
+    @Autowired
+    private ITServerCarmodelService tServerCarmodelService;
+
+    /**
+     * 跳转到专车车型设置首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tServerCarmodel.html";
+    }
+
+    /**
+     * 跳转到跨城车型设置首页
+     */
+    @RequestMapping("/acrossCity")
+    public String acrossCity() {
+        return PREFIX + "acrossCity.html";
+    }
+
+    /**
+     * 跳转到包车车型设置首页
+     */
+    @RequestMapping("/charter")
+    public String charter() {
+        return PREFIX + "charter.html";
+    }
+
+    /**
+     * 跳转到添加专车车型设置
+     */
+    @RequestMapping("/tServerCarmodel_add")
+    public String tServerCarmodelAdd() {
+        return PREFIX + "tServerCarmodel_add.html";
+    }
+
+
+    /**
+     * 跳转到添加专车车型设置
+     */
+    @RequestMapping("/tServerCarmodel_edit")
+    public String tServerCarmodelAddEdit(Integer id, Model model) {
+        TServerCarmodel tServerCarmodel = tServerCarmodelService.selectById(id);
+        model.addAttribute("data", tServerCarmodel);
+        return PREFIX + "tServerCarmodel_edit.html";
+    }
+
+    /**
+     * 跳转到添加跨城车型设置
+     */
+    @RequestMapping("/acrossCity_add")
+    public String acrossCity_add() {
+        return PREFIX + "acrossCity_add.html";
+    }
+
+
+    /**
+     * 跳转到添加跨城车型设置
+     */
+    @RequestMapping("/acrossCity_edit")
+    public String acrossCity_update(Integer id, Model model) {
+        TServerCarmodel tServerCarmodel = tServerCarmodelService.selectById(id);
+        model.addAttribute("data", tServerCarmodel);
+        return PREFIX + "acrossCity_edit.html";
+    }
+
+
+    /**
+     * 跳转到添加包车车型设置
+     */
+    @RequestMapping("/charter_add")
+    public String charter_add() {
+        return PREFIX + "charter_add.html";
+    }
+
+
+    /**
+     * 跳转到添加包车车型设置
+     */
+    @RequestMapping("/charter_edit")
+    public String charter_edit(Integer id, Model model) {
+        TServerCarmodel tServerCarmodel = tServerCarmodelService.selectById(id);
+        model.addAttribute("data", tServerCarmodel);
+        model.addAttribute("price1", tServerCarmodel.getPrice().split("-")[0]);
+        model.addAttribute("price2", tServerCarmodel.getPrice().split("-")[1]);
+        return PREFIX + "charter_edit.html";
+    }
+
+
+    /**
+     * 获取专车车型设置列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String name,Integer state) {
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tServerCarmodelService.getServerCarModelList(page,1,name,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 获取跨城车型设置列表
+     */
+    @RequestMapping(value = "/listAcrossCity")
+    @ResponseBody
+    public Object listAcrossCity(String name,Integer state) {
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tServerCarmodelService.getServerCarModelList(page,2,name,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 获取包车车型设置列表
+     */
+    @RequestMapping(value = "/listCharter")
+    @ResponseBody
+    public Object listCharter(String name,Integer state) {
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tServerCarmodelService.getServerCarModelList(page,3,name,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增专车车型设置
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TServerCarmodel tServerCarmodel) {
+        int count = tServerCarmodelService.selectCount(new EntityWrapper<TServerCarmodel>().eq("type", 1)
+                .eq("name", tServerCarmodel.getName()).last(" and not FIND_IN_SET(state,'3')"));
+        if (count > 0){
+            return new ErrorTip(500, "【"+tServerCarmodel.getName()+"】已存在,请重新输入");
+        }
+        tServerCarmodel.setInsertTime(new Date());
+        tServerCarmodel.setState(1);
+        tServerCarmodel.setType(1);
+        tServerCarmodelService.insert(tServerCarmodel);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改专车型设置
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TServerCarmodel tServerCarmodel) {
+        tServerCarmodel.setInsertTime(new Date());
+        tServerCarmodel.setState(1);
+        tServerCarmodel.setType(1);
+        tServerCarmodelService.updateById(tServerCarmodel);
+        return SUCCESS_TIP;
+    }
+
+
+
+    /**
+     * 新增跨城车型设置
+     */
+    @RequestMapping(value = "/addAcrossCity")
+    @ResponseBody
+    public Object addAcrossCity(TServerCarmodel tServerCarmodel) {
+        int count = tServerCarmodelService.selectCount(new EntityWrapper<TServerCarmodel>().eq("type", 2)
+                .eq("name", tServerCarmodel.getName()).last(" and not FIND_IN_SET(state,'3')"));
+        if (count > 0){
+            return new ErrorTip(500, "【"+tServerCarmodel.getName()+"】已存在,请重新输入");
+        }
+        tServerCarmodel.setInsertTime(new Date());
+        tServerCarmodel.setState(1);
+        tServerCarmodel.setType(2);
+        tServerCarmodelService.insert(tServerCarmodel);
+        return SUCCESS_TIP;
+    }
+
+
+    /**
+     * 修改跨城车型设置
+     */
+    @RequestMapping(value = "/editAcrossCity")
+    @ResponseBody
+    public Object editAcrossCity(TServerCarmodel tServerCarmodel) {
+        tServerCarmodel.setInsertTime(new Date());
+        tServerCarmodel.setState(1);
+        tServerCarmodel.setType(2);
+        tServerCarmodelService.updateById(tServerCarmodel);
+        return SUCCESS_TIP;
+    }
+
+
+
+    /**
+     * 新增包车车型设置
+     */
+    @RequestMapping(value = "/addCharter")
+    @ResponseBody
+    public Object addCharter(TServerCarmodel tServerCarmodel) {
+        int count = tServerCarmodelService.selectCount(new EntityWrapper<TServerCarmodel>().eq("type", 3)
+                .eq("name", tServerCarmodel.getName()).last(" and not FIND_IN_SET(state,'3')"));
+        if (count > 0){
+            return new ErrorTip(500, "【"+tServerCarmodel.getName()+"】已存在,请重新输入");
+        }
+        tServerCarmodel.setInsertTime(new Date());
+        tServerCarmodel.setState(1);
+        tServerCarmodel.setType(3);
+        tServerCarmodelService.insert(tServerCarmodel);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 新增包车车型设置
+     */
+    @RequestMapping(value = "/editCharter")
+    @ResponseBody
+    public Object editCharter(TServerCarmodel tServerCarmodel) {
+        tServerCarmodel.setInsertTime(new Date());
+        tServerCarmodel.setState(1);
+        tServerCarmodel.setType(3);
+        tServerCarmodelService.updateById(tServerCarmodel);
+        return SUCCESS_TIP;
+    }
+
+
+
+    /**
+     * 禁用/启用
+     */
+    @RequestMapping(value = "/opt")
+    @ResponseBody
+    public Object opt(@RequestParam Integer optType,@RequestParam Integer tServerCarmodelId) {
+        TServerCarmodel one = tServerCarmodelService.selectById(tServerCarmodelId);
+        if (1 == optType){  //禁用
+            one.setState(2);
+        }else if (2 == optType){  //启用
+            one.setState(1);
+        }
+        tServerCarmodelService.updateById(one);
+        return SUCCESS_TIP;
+    }
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TSiteController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TSiteController.java
new file mode 100644
index 0000000..a44d3f5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TSiteController.java
@@ -0,0 +1,285 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.TDriverLine;
+import com.stylefeng.guns.modular.system.model.TLocation;
+import com.stylefeng.guns.modular.system.model.TRegion;
+import com.stylefeng.guns.modular.system.service.ITLocationService;
+import com.stylefeng.guns.modular.system.service.ITRegionService;
+import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TSite;
+import com.stylefeng.guns.modular.system.service.ITSiteService;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 跨城站点管理控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-04 10:35:51
+ */
+@Controller
+@RequestMapping("/tSite")
+public class TSiteController extends BaseController {
+
+    private String PREFIX = "/system/tSite/";
+
+    @Autowired
+    private ITSiteService tSiteService;
+
+    @Autowired
+    private ITRegionService tRegionService;
+
+    @Autowired
+    private ITLocationService itLocationService;
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+
+
+    /**
+     * 跳转到跨城站点管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tSite.html";
+    }
+
+    /**
+     * 跳转到添加跨城站点管理
+     */
+    @RequestMapping("/tSite_add")
+    public String tSiteAdd(Model model) {
+        //省
+        List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("provinceList",provinceList);
+        return PREFIX + "tSite_add.html";
+    }
+
+    /**
+     * 跳转到修改跨城站点管理
+     */
+    @RequestMapping("/tSite_update/{tSiteId}")
+    public String tSiteUpdate(@PathVariable Integer tSiteId, Model model) {
+        TSite tSite = tSiteService.selectById(tSiteId);
+        model.addAttribute("item",tSite);
+        LogObjectHolder.me().set(tSite);
+
+        //省
+        List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("provinceList",provinceList);
+
+        TRegion province = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", tSite.getProvinceCode()));
+        //市
+        List<TRegion> cityList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", province.getId()));
+        model.addAttribute("cityList",cityList);
+
+        if (SinataUtil.isNotEmpty(tSite.getCityCode())){
+            TRegion city = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", tSite.getCityCode()));
+            //区
+            List<TRegion> areaList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", city.getId()));
+            model.addAttribute("areaList",areaList);
+        }else{
+            model.addAttribute("areaList",null);
+        }
+
+        //查询所有的站点区域
+        List<TLocation> locationList = itLocationService.selectList(new EntityWrapper<TLocation>().eq("siteId", tSite.getId()).ne("state", 3));
+        model.addAttribute("locationList",locationList);
+        model.addAttribute("disabled","disabled");
+
+        Integer type = itLocationService.selectList(new EntityWrapper<TLocation>().eq("siteId", tSite.getId())).get(0).getType();
+        model.addAttribute("type1", type == 1 ? "block" : "none");
+        model.addAttribute("type2", type == 1 ? "none" : "block");
+        model.addAttribute("checked1", type == 1 ? "checked" : "");
+        model.addAttribute("checked2", type == 1 ? "" : "checked");
+        return PREFIX + "tSite_edit.html";
+    }
+
+    /**
+     * 获取跨城站点管理列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,String name,String insertUser,String city,Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        if (ShiroKit.getUser().getRoleType() != 1){
+            page.setRecords(null);
+        }else{
+            page.setRecords(tSiteService.getSiteList(page,beginTime,endTime,name,insertUser,city,state));
+        }
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增跨城站点管理
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TSite tSite,@RequestParam String subArr) {
+        tSite.setInsertTime(new Date());
+        tSite.setInsertUserId(ShiroKit.getUser().getId());
+        tSite.setState(1);
+        tSiteService.insert(tSite);
+
+        //添加站点区域
+        addLocation(subArr,tSite.getId());
+        return ResultUtil.success();
+    }
+
+    /**
+     * 添加站点区域
+     * @param subArr
+     * @param id
+     */
+    public void addLocation(String subArr,Integer id){
+        JSONArray jsonArray = JSON.parseArray(subArr);
+        int size = jsonArray.size();
+        for (int i = 0; i < size; i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            TLocation location = new TLocation();
+            location.setSiteId(id);
+            location.setName(jsonObject.getString("name"));
+            location.setInsertTime(new Date());
+            location.setAddTime(jsonObject.getString("time"));
+            location.setState(1);
+            location.setUpdateTime(new Date());
+            Integer type = jsonObject.getInteger("areaType");
+            location.setType(type);
+            if (1 == type){
+                if (SinataUtil.isNotEmpty(jsonObject.getString("provinceCode"))){
+                    location.setProvince(jsonObject.getString("province"));
+                    location.setProvinceCode(jsonObject.getString("provinceCode"));
+                }
+                if (SinataUtil.isNotEmpty(jsonObject.getString("cityCode"))){
+                    location.setCity(jsonObject.getString("city"));
+                    location.setCityCode(jsonObject.getString("cityCode"));
+                }
+                if (SinataUtil.isNotEmpty(jsonObject.getString("districtCode"))){
+                    location.setDistrict(jsonObject.getString("district"));
+                    location.setDistrictCode(jsonObject.getString("districtCode"));
+                }
+            }else if (2 == type){
+                String coordinate = jsonObject.getString("coordinate");
+                coordinate = coordinate.substring(0, coordinate.length() - 1);
+                location.setCoordinate(coordinate);
+            }
+            itLocationService.insert(location);
+
+            if(type == 2){
+                List<String> fence = gdMapElectricFenceUtil.createFence(location.getId().toString(), location.getCoordinate());
+                TLocation location1 = itLocationService.selectById(location.getId());
+                String s = "";
+                for(String gid : fence){
+                    s += gid + "_";
+                }
+                location1.setGid(s.substring(0, s.length() - 1));
+                location1.setUpdateTime(new Date());
+                itLocationService.updateById(location1);
+            }
+        }
+    }
+
+    /**
+     * 操作跨城站点管理
+     * optType 1=删除 2=冻结 3=解冻
+     */
+    @RequestMapping(value = "/opt")
+    @ResponseBody
+    public Object opt(@RequestParam Integer tSiteId,@RequestParam Integer optType) {
+        TSite tSite = tSiteService.selectById(tSiteId);
+        if (1 == optType){
+            tSite.setState(3);
+        }else if (2 == optType){
+            tSite.setState(2);
+        }else if (3 == optType){
+            tSite.setState(1);
+        }
+        tSiteService.updateById(tSite);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改跨城站点管理
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TSite tSite,@RequestParam String subArr) {
+        tSiteService.updateById(tSite);
+
+        //删除站点区域
+        JSONArray jsonArray = JSON.parseArray(subArr);
+        List<TLocation> siteId = itLocationService.selectList(new EntityWrapper<TLocation>().eq("siteId", tSite.getId()));
+        List<TLocation> del = new ArrayList<>();
+        List<Object> add = new ArrayList<>();
+        for(TLocation location : siteId){
+            boolean b = true;
+            for(int i = 0; i < jsonArray.size(); i++){
+                if(jsonArray.getJSONObject(i).getIntValue("id") == location.getId()){
+                    b = false;
+                }
+            }
+            if(b){
+                del.add(location);
+                continue;
+            }
+        }
+        for(int i = 0; i < jsonArray.size(); i++){
+            if(jsonArray.getJSONObject(i).getInteger("id") == null){
+                add.add(jsonArray.get(i));
+            }
+        }
+        for(TLocation location : del){
+            if(location.getType() == 2){
+                String[] s = location.getGid().split("_");
+                for(String gid : s){
+                    gdMapElectricFenceUtil.deleteElectricFenc(gid);
+                }
+            }
+            itLocationService.deleteById(location.getId());
+        }
+
+        //添加站点区域
+        addLocation(JSON.toJSONString(add),tSite.getId());
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 跨城站点管理详情
+     */
+    @RequestMapping(value = "/detail/{tSiteId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tSiteId") Integer tSiteId) {
+        return tSiteService.selectById(tSiteId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TSystemPriceController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TSystemPriceController.java
new file mode 100644
index 0000000..454b087
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TSystemPriceController.java
@@ -0,0 +1,274 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TServerCarmodel;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.service.ITServerCarmodelService;
+import com.stylefeng.guns.modular.system.service.IUserService;
+import com.stylefeng.guns.modular.system.util.PushMinistryOfTransportUtil;
+import net.sf.json.JSONObject;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.stylefeng.guns.modular.system.model.TSystemPrice;
+import com.stylefeng.guns.modular.system.service.ITSystemPriceService;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 专车价格设置控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-08-29 10:50:13
+ */
+@Controller
+@RequestMapping("/tSystemPrice")
+public class TSystemPriceController extends BaseController {
+
+    private String PREFIX = "/system/tSystemPrice/";
+
+    @Autowired
+    private ITSystemPriceService tSystemPriceService;
+
+    @Autowired
+    private ITServerCarmodelService tServerCarmodelService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Autowired
+    private IUserService userService;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+
+
+
+    /**
+     * 跳转到专车价格设置首页
+     */
+    @RequestMapping("/special")
+    public String index() {
+        return PREFIX + "tSystemPrice.html";
+    }
+
+    /**
+     * 跳转到小件物流价格设置首页
+     */
+    @RequestMapping("/small")
+    public String small(Model model) {
+        //跨城小件物流
+        TSystemPrice one = tSystemPriceService.selectOne(new EntityWrapper<TSystemPrice>().eq("type", 5).eq("companyId", ShiroKit.getUser().getObjectId()));
+        if (SinataUtil.isNotEmpty(one)){
+            JSONObject json1 = JSONObject.fromObject(one.getContent());
+            model.addAttribute("json1",json1);
+        }
+        //同城小件物流
+        TSystemPrice two = tSystemPriceService.selectOne(new EntityWrapper<TSystemPrice>().eq("type", 4).eq("companyId", ShiroKit.getUser().getObjectId()));
+        if (SinataUtil.isNotEmpty(two)){
+            JSONObject json2 = JSONObject.fromObject(two.getContent());
+            model.addAttribute("json2",json2);
+        }
+        return PREFIX + "small.html";
+    }
+
+    /**
+     * 跳转到添加专车价格设置
+     */
+    @RequestMapping("/tSystemPrice_add")
+    public String tSystemPriceAdd(Model model) {
+        //查询所有专车车型
+        List<TSystemPrice> tSystemPrices = tSystemPriceService.selectList(new EntityWrapper<TSystemPrice>().eq("type", 1).eq("companyId", ShiroKit.getUser().getObjectId()).ne("state", 3));
+        List<TServerCarmodel> modelList = tServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 1).eq("state", 1));
+        List<TServerCarmodel> serverCarmodels = new ArrayList<>();
+        for(TServerCarmodel tsc : modelList){
+            boolean b = true;
+            for(TSystemPrice tsp : tSystemPrices){
+                if(tsc.getId() == tsp.getServerCarModelId()){
+                    b = false;
+                    break;
+                }
+            }
+            if(b){
+                serverCarmodels.add(tsc);
+            }
+        }
+        model.addAttribute("modelList",serverCarmodels);
+        return PREFIX + "tSystemPrice_add.html";
+    }
+
+    /**
+     * 跳转到修改专车价格设置
+     */
+    @RequestMapping("/tSystemPrice_update/{tSystemPriceId}")
+    public String tSystemPriceUpdate(@PathVariable Integer tSystemPriceId, Model model) {
+        TSystemPrice tSystemPrice = tSystemPriceService.selectById(tSystemPriceId);
+        model.addAttribute("item",tSystemPrice);
+        LogObjectHolder.me().set(tSystemPrice);
+
+        JSONObject json = JSONObject.fromObject(tSystemPrice.getContent());
+        model.addAttribute("json",json);
+
+        //查询所有专车车型
+        List<TSystemPrice> tSystemPrices = tSystemPriceService.selectList(new EntityWrapper<TSystemPrice>().eq("type", 1).ne("state", 3));
+        List<TServerCarmodel> modelList = tServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 1).eq("state", 1));
+        List<TServerCarmodel> serverCarmodels = new ArrayList<>();
+        for(TServerCarmodel tsc : modelList){
+            boolean b = true;
+            for(TSystemPrice tsp : tSystemPrices){
+                if(tsc.getId() == tsp.getServerCarModelId() && tsc.getId() != tSystemPriceId){
+                    b = false;
+                    break;
+                }
+            }
+            if(b){
+                serverCarmodels.add(tsc);
+            }
+        }
+        model.addAttribute("modelList",serverCarmodels);
+
+        return PREFIX + "tSystemPrice_edit.html";
+    }
+
+    /**
+     * 获取专车价格设置列表
+     */
+    @RequestMapping(value = "/listSpecial")
+    @ResponseBody
+    public Object list(String name,Integer state) {
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tSystemPriceService.getSpecialPriceList(page,ShiroKit.getUser().getObjectId(),name,state));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增专车价格设置
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TSystemPrice tSystemPrice) {
+        //判断当前公司是否添加过该专车车型价格配置
+        int count = tSystemPriceService.selectCount(new EntityWrapper<TSystemPrice>()
+                .eq("type", 1)
+                .eq("serverCarModelId", tSystemPrice.getServerCarModelId())
+                .eq("companyId",ShiroKit.getUser().getObjectId())
+                .last(" and not FIND_IN_SET(state,'3')"));
+        if (count > 0){
+            TServerCarmodel one = tServerCarmodelService.selectById(tSystemPrice.getServerCarModelId());
+            return new ErrorTip(500, "【"+one.getName()+"】已存在,请重新选择");
+        }
+        tSystemPrice.setCompanyId(ShiroKit.getUser().getObjectId());
+        tSystemPrice.setType(1);
+        tSystemPrice.setState(1);
+        tSystemPriceService.insert(tSystemPrice);
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport){//上传数据
+                    pushMinistryOfTransportUtil.baseInfoCompanyFare(tSystemPrice.getId());
+                }
+            }
+        }).start();
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改专车价格设置
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TSystemPrice tSystemPrice) {
+        TSystemPrice obj = tSystemPriceService.selectById(tSystemPrice.getId());
+        if (obj.getServerCarModelId() != tSystemPrice.getServerCarModelId()){
+            //判断当前公司是否添加过该专车车型价格配置
+            int count = tSystemPriceService.selectCount(new EntityWrapper<TSystemPrice>()
+                    .eq("type", 1)
+                    .eq("serverCarModelId", tSystemPrice.getServerCarModelId())
+                    .eq("companyId",ShiroKit.getUser().getObjectId())
+                    .last(" and not FIND_IN_SET(state,'3')"));
+            if (count > 0){
+                TServerCarmodel one = tServerCarmodelService.selectById(tSystemPrice.getServerCarModelId());
+                return new ErrorTip(500, "【"+one.getName()+"】已存在,请重新选择");
+            }
+        }
+        tSystemPriceService.updateById(tSystemPrice);
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport) {//上传数据
+                    pushMinistryOfTransportUtil.baseInfoCompanyFare(tSystemPrice.getId());
+                }
+            }
+        }).start();
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改状态
+     */
+    @RequestMapping(value = "/opt")
+    @ResponseBody
+    public Object opt(Integer optType,Integer tSystemPriceId) {
+        TSystemPrice systemPrice = new TSystemPrice();
+        if (1 == optType){  //冻结
+            systemPrice.setState(2);
+        }else if (2 == optType){  //解冻
+            systemPrice.setState(1);
+        }else if (3 == optType){  //删除
+            systemPrice.setState(3);
+        }
+        tSystemPriceService.update(systemPrice,new EntityWrapper<TSystemPrice>().eq("id",tSystemPriceId));
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 小件物流价格设置
+     */
+    @RequestMapping(value = "/smallSubmit")
+    @ResponseBody
+    public Object smallSubmit(String json1,String json2) {
+        //跨城小件物流
+        TSystemPrice one = tSystemPriceService.selectOne(new EntityWrapper<TSystemPrice>().eq("type", 5).eq("companyId", ShiroKit.getUser().getObjectId()));
+        if (SinataUtil.isNotEmpty(one)){
+            one.setContent(json1);
+            tSystemPriceService.updateById(one);
+        }else{
+            one = new TSystemPrice();
+            one.setState(1);
+            one.setType(5);
+            one.setCompanyId(ShiroKit.getUser().getObjectId());
+            one.setContent(json1);
+            tSystemPriceService.insert(one);
+        }
+        //同城小件物流
+        TSystemPrice two = tSystemPriceService.selectOne(new EntityWrapper<TSystemPrice>().eq("type", 4).eq("companyId", ShiroKit.getUser().getObjectId()));
+        if (SinataUtil.isNotEmpty(two)){
+            two.setContent(json2);
+            tSystemPriceService.updateById(two);
+        }else{
+            two = new TSystemPrice();
+            two.setState(1);
+            two.setType(4);
+            two.setCompanyId(ShiroKit.getUser().getObjectId());
+            two.setContent(json2);
+            tSystemPriceService.insert(two);
+        }
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/BlackboardController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/BlackboardController.java
new file mode 100644
index 0000000..4e8a24a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/BlackboardController.java
@@ -0,0 +1,96 @@
+package com.stylefeng.guns.modular.system.controller.system;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 总览信息
+ *
+ * @author fengshuonan
+ * @Date 2017年3月4日23:05:54
+ */
+@Controller
+@RequestMapping("/blackboard")
+public class BlackboardController extends BaseController {
+
+    @Autowired
+    private ILoginLogService loginLogService;
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private IRoleService roleService;
+
+    @Autowired
+    private IDeptService deptService;
+
+    @Autowired
+    private ITCompanyService companyService;
+
+    private ResultUtil resultUtil;
+
+    /**
+     * 跳转到黑板
+     */
+    @RequestMapping("")
+    public String blackboard(Model model,Integer type) {
+        //查询当前用户是否有"首页"菜单的权限
+        Integer id = ShiroKit.getUser().getId();
+        User user = userService.selectById(id);
+        Integer menuNum = userService.getMenuNumByRole(user.getRoleid());
+        if (menuNum > 0){
+            return "/home.html";
+        } else {
+            //查询登录次数
+            int count = loginLogService.selectCount(new EntityWrapper<LoginLog>().eq("userid", ShiroKit.getUser().getId()));
+            model.addAttribute("loginNum", count);
+
+            Role role = roleService.selectById(user.getRoleid());
+            Dept dept = deptService.selectById(user.getDeptid());
+
+            model.addAttribute("deptName",dept==null?"顶级":dept.getFullname());
+            model.addAttribute("roleName", role.getName());
+            model.addAttribute("userName", user.getName());
+            model.addAttribute("date", DateUtil.getTime(new Date()));
+            model.addAttribute("user", user);
+            return "/blackboardBlank.html";
+        }
+    }
+
+    /**
+     * 根据当前登录账户id获取对应公司详细信息
+     * @param uid
+     * @return
+     */
+    @RequestMapping(value = "/getCompanyInfoByUserId", method = RequestMethod.POST)
+    @ResponseBody
+    public ResultUtil getCompanyInfoByUserId(String uid){
+        try {
+            User user = userService.selectById(uid);
+//            resultUtil = companyService.selectCompanyInfoById(user.getObjectId().toString());
+        }catch (Exception e){
+            e.printStackTrace();
+            resultUtil = ResultUtil.runErr();
+        }
+        return resultUtil;
+    }
+
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/DeptController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/DeptController.java
new file mode 100644
index 0000000..ff10f07
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/DeptController.java
@@ -0,0 +1,169 @@
+package com.stylefeng.guns.modular.system.controller.system;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.dictmap.DeptDict;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.Dept;
+import com.stylefeng.guns.modular.system.service.IDeptService;
+import com.stylefeng.guns.modular.system.warpper.DeptWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 部门控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年2月17日20:27:22
+ */
+@Controller
+@RequestMapping("/dept")
+public class DeptController extends BaseController {
+
+    private String PREFIX = "/system/dept/";
+
+    @Autowired
+    private IDeptService deptService;
+
+
+    /**
+     * 跳转到部门管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "dept.html";
+    }
+
+    /**
+     * 跳转到添加部门
+     */
+    @RequestMapping("/dept_add")
+    public String deptAdd() {
+        return PREFIX + "dept_add.html";
+    }
+
+    /**
+     * 跳转到修改部门
+     */
+    @Permission
+    @RequestMapping("/dept_update/{deptId}")
+    public String deptUpdate(@PathVariable Integer deptId, Model model) {
+        Dept dept = deptService.selectById(deptId);
+        model.addAttribute(dept);
+        model.addAttribute("pName", ConstantFactory.me().getDeptName(dept.getPid()));
+        LogObjectHolder.me().set(dept);
+        return PREFIX + "dept_edit.html";
+    }
+
+    /**
+     * 获取部门的tree列表
+     */
+    @RequestMapping(value = "/tree")
+    @ResponseBody
+    public List<ZTreeNode> tree() {
+        List<ZTreeNode> tree = this.deptService.tree();
+        tree.add(ZTreeNode.createParent());
+        return tree;
+    }
+
+    /**
+     * 新增部门
+     */
+    @BussinessLog(value = "添加部门", key = "simplename", dict = DeptDict.class)
+    @RequestMapping(value = "/add")
+    @Permission
+    @ResponseBody
+    public Object add(Dept dept) {
+        if (ToolUtil.isOneEmpty(dept, dept.getSimplename())) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        //完善pids,根据pid拿到pid的pids
+        deptSetPids(dept);
+
+
+        return this.deptService.insert(dept);
+    }
+
+    /**
+     * 获取所有部门列表
+     */
+    @RequestMapping(value = "/list")
+    @Permission
+    @ResponseBody
+    public Object list(String condition) {
+        List<Map<String, Object>> list = this.deptService.list(condition);
+        return super.warpObject(new DeptWarpper(list));
+    }
+
+    /**
+     * 部门详情
+     */
+    @RequestMapping(value = "/detail/{deptId}")
+    @Permission
+    @ResponseBody
+    public Object detail(@PathVariable("deptId") Integer deptId) {
+        return deptService.selectById(deptId);
+    }
+
+    /**
+     * 修改部门
+     */
+    @BussinessLog(value = "修改部门", key = "simplename", dict = DeptDict.class)
+    @RequestMapping(value = "/update")
+    @Permission
+    @ResponseBody
+    public Object update(Dept dept) {
+        if (ToolUtil.isEmpty(dept) || dept.getId() == null) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        deptSetPids(dept);
+        deptService.updateById(dept);
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除部门
+     */
+    @BussinessLog(value = "删除部门", key = "deptId", dict = DeptDict.class)
+    @RequestMapping(value = "/delete")
+    @Permission
+    @ResponseBody
+    public Object delete(@RequestParam Integer deptId) {
+
+
+        //缓存被删除的部门名称
+        LogObjectHolder.me().set(ConstantFactory.me().getDeptName(deptId));
+
+        deptService.deleteDept(deptId);
+
+        return SUCCESS_TIP;
+    }
+
+    private void deptSetPids(Dept dept) {
+        if (ToolUtil.isEmpty(dept.getPid()) || dept.getPid().equals(0)) {
+            dept.setPid(0);
+            dept.setPids("[0],");
+        } else {
+            int pid = dept.getPid();
+            Dept temp = deptService.selectById(pid);
+            String pids = temp.getPids();
+            dept.setPid(pid);
+            dept.setPids(pids + "[" + pid + "],");
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/DictController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/DictController.java
new file mode 100644
index 0000000..5eb8fac
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/DictController.java
@@ -0,0 +1,142 @@
+package com.stylefeng.guns.modular.system.controller.system;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.dictmap.DictMap;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.Dict;
+import com.stylefeng.guns.modular.system.service.IDictService;
+import com.stylefeng.guns.modular.system.warpper.DictWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年4月26日 12:55:31
+ */
+@Controller
+@RequestMapping("/dict")
+public class DictController extends BaseController {
+
+    private String PREFIX = "/system/dict/";
+
+    @Autowired
+    private IDictService dictService;
+
+    /**
+     * 跳转到字典管理首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "dict.html";
+    }
+
+    /**
+     * 跳转到添加字典
+     */
+    @RequestMapping("/dict_add")
+    public String deptAdd() {
+        return PREFIX + "dict_add.html";
+    }
+
+    /**
+     * 跳转到修改字典
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping("/dict_edit/{dictId}")
+    public String deptUpdate(@PathVariable Integer dictId, Model model) {
+        Dict dict = dictService.selectById(dictId);
+        model.addAttribute("dict", dict);
+        List<Dict> subDicts = dictService.selectList(new EntityWrapper<Dict>().eq("pid", dictId));
+        model.addAttribute("subDicts", subDicts);
+        LogObjectHolder.me().set(dict);
+        return PREFIX + "dict_edit.html";
+    }
+
+    /**
+     * 新增字典
+     *
+     * @param dictValues 格式例如   "1:启用;2:禁用;3:冻结"
+     */
+    @BussinessLog(value = "添加字典记录", key = "dictName,dictValues", dict = DictMap.class)
+    @RequestMapping(value = "/add")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object add(String dictCode,String dictTips,String dictName, String dictValues) {
+        if (ToolUtil.isOneEmpty(dictCode,dictName, dictValues)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        this.dictService.addDict(dictCode,dictName,dictTips,dictValues);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 获取所有字典列表
+     */
+    @RequestMapping(value = "/list")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object list(String condition) {
+        List<Map<String, Object>> list = this.dictService.list(condition);
+        return super.warpObject(new DictWarpper(list));
+    }
+
+    /**
+     * 字典详情
+     */
+    @RequestMapping(value = "/detail/{dictId}")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object detail(@PathVariable("dictId") Integer dictId) {
+        return dictService.selectById(dictId);
+    }
+
+    /**
+     * 修改字典
+     */
+    @BussinessLog(value = "修改字典", key = "dictName,dictValues", dict = DictMap.class)
+    @RequestMapping(value = "/update")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object update(Integer dictId,String dictCode,String dictName, String dictTips,String dictValues) {
+        if (ToolUtil.isOneEmpty(dictId, dictCode, dictName, dictValues)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        dictService.editDict(dictId, dictCode,dictName, dictTips,dictValues);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除字典记录
+     */
+    @BussinessLog(value = "删除字典记录", key = "dictId", dict = DictMap.class)
+    @RequestMapping(value = "/delete")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object delete(@RequestParam Integer dictId) {
+
+        //缓存被删除的名称
+        LogObjectHolder.me().set(ConstantFactory.me().getDictName(dictId));
+
+        this.dictService.delteDict(dictId);
+        return SUCCESS_TIP;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/KaptchaController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/KaptchaController.java
new file mode 100644
index 0000000..ee1cfac
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/KaptchaController.java
@@ -0,0 +1,114 @@
+package com.stylefeng.guns.modular.system.controller.system;
+
+import com.google.code.kaptcha.Constants;
+import com.google.code.kaptcha.Producer;
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.util.FileUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+
+/**
+ * 验证码生成
+ *
+ * @author fengshuonan
+ * @date 2017-05-05 23:10
+ */
+@Controller
+@RequestMapping("/kaptcha")
+public class KaptchaController {
+
+    @Autowired
+    private GunsProperties gunsProperties;
+
+    @Autowired
+    private Producer producer;
+
+    /**
+     * 生成验证码
+     */
+    @RequestMapping("")
+    public void index(HttpServletRequest request, HttpServletResponse response) {
+        HttpSession session = request.getSession();
+
+        response.setDateHeader("Expires", 0);
+
+        // Set standard HTTP/1.1 no-cache headers.
+        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
+
+        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
+        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
+
+        // Set standard HTTP/1.0 no-cache header.
+        response.setHeader("Pragma", "no-cache");
+
+        // return a jpeg
+        response.setContentType("image/jpeg");
+
+        // create the text for the image
+        String capText = producer.createText();
+
+        // store the text in the session
+        session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
+
+        // create the image with the text
+        BufferedImage bi = producer.createImage(capText);
+        ServletOutputStream out = null;
+        try {
+            out = response.getOutputStream();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        // write the data out
+        try {
+            ImageIO.write(bi, "jpg", out);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        try {
+            try {
+                out.flush();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        } finally {
+            try {
+                out.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 返回图片
+     *
+     * @author stylefeng
+     * @Date 2017/5/24 23:00
+     */
+    @RequestMapping("/{pictureId}")
+    public void renderPicture(@PathVariable("pictureId") String pictureId, HttpServletResponse response) {
+        String path = gunsProperties.getFileUploadPath() + pictureId;
+        try {
+            byte[] bytes = FileUtil.toByteArray(path);
+            response.getOutputStream().write(bytes);
+        } catch (Exception e) {
+            //如果找不到图片就返回一个默认图片
+            try {
+                response.sendRedirect("/static/img/NoPIC.png");
+            } catch (IOException e1) {
+                e1.printStackTrace();
+            }
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LogController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LogController.java
new file mode 100644
index 0000000..ef4d1c8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LogController.java
@@ -0,0 +1,84 @@
+package com.stylefeng.guns.modular.system.controller.system;
+
+import com.baomidou.mybatisplus.mapper.SqlRunner;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.common.constant.state.BizLogType;
+import com.stylefeng.guns.core.support.BeanKit;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+import com.stylefeng.guns.modular.system.service.IOperationLogService;
+import com.stylefeng.guns.modular.system.warpper.LogWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 日志管理的控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年4月5日 19:45:36
+ */
+@Controller
+@RequestMapping("/log")
+public class LogController extends BaseController {
+
+    private static String PREFIX = "/system/log/";
+
+    @Autowired
+    private IOperationLogService operationLogService;
+
+    /**
+     * 跳转到日志管理的首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "log.html";
+    }
+
+    /**
+     * 查询操作日志列表
+     */
+    @RequestMapping("/list")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object list(@RequestParam(required = false) String beginTime, @RequestParam(required = false) String endTime, @RequestParam(required = false) String logName, @RequestParam(required = false) Integer logType) {
+        Page<OperationLog> page = new PageFactory<OperationLog>().defaultPage();
+        List<Map<String, Object>> result = operationLogService.getOperationLogs(page, beginTime, endTime, logName, BizLogType.valueOf(logType), page.getOrderByField(), page.isAsc());
+        page.setRecords((List<OperationLog>) new LogWarpper(result).warp());
+        return super.packForBT(page);
+    }
+
+    /**
+     * 查询操作日志详情
+     */
+    @RequestMapping("/detail/{id}")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object detail(@PathVariable Integer id) {
+        OperationLog operationLog = operationLogService.selectById(id);
+        Map<String, Object> stringObjectMap = BeanKit.beanToMap(operationLog);
+        return super.warpObject(new LogWarpper(stringObjectMap));
+    }
+
+    /**
+     * 清空日志
+     */
+    @BussinessLog(value = "清空业务日志")
+    @RequestMapping("/delLog")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object delLog() {
+        SqlRunner.db().delete("delete from sys_operation_log");
+        return SUCCESS_TIP;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
new file mode 100644
index 0000000..3965c83
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
@@ -0,0 +1,207 @@
+package com.stylefeng.guns.modular.system.controller.system;
+
+import com.google.code.kaptcha.Constants;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.exception.InvalidKaptchaException;
+import com.stylefeng.guns.core.log.LogManager;
+import com.stylefeng.guns.core.log.factory.LogTaskFactory;
+import com.stylefeng.guns.core.node.MenuNode;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.ApiMenuFilter;
+import com.stylefeng.guns.core.util.KaptchaUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.service.IMenuService;
+import com.stylefeng.guns.modular.system.service.IUserService;
+import com.stylefeng.guns.modular.system.util.AESUtils;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+import static com.stylefeng.guns.core.support.HttpKit.getIp;
+
+/**
+ * 登录控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年1月10日 下午8:25:24
+ */
+@Controller
+public class LoginController extends BaseController {
+
+    @Autowired
+    private IMenuService menuService;
+
+    @Autowired
+    private IUserService userService;
+
+    private Map<String, Long> loginTime = new HashMap<>();
+
+    private Map<String, Integer> loginFailures = new HashMap<>();
+
+    private List<String> ips = Arrays.asList("127.0.0.1");
+
+
+
+    /**
+     * 跳转到主页
+     */
+    @RequestMapping(value = "/", method = RequestMethod.GET)
+    public String index(Model model) {
+        //获取菜单列表
+        List<Integer> roleList = ShiroKit.getUser().getRoleList();
+        if (roleList == null || roleList.size() == 0) {
+            ShiroKit.getSubject().logout();
+            model.addAttribute("tips", "该用户没有角色,无法登陆");
+            return "/login.html";
+        }
+        List<MenuNode> menus = menuService.getMenusByRoleIds(roleList);
+        List<MenuNode> titles = MenuNode.buildTitle(menus);
+        titles = ApiMenuFilter.build(titles);
+
+
+        Integer id = ShiroKit.getUser().getId();
+        User user = userService.selectById(id);
+        if (SinataUtil.isEmpty(user)){
+            ShiroKit.getSubject().logout();
+            model.addAttribute("tips", "请重新登录");
+            return "/login.html";
+        }
+        //设置上级ID
+        if (SinataUtil.isNotEmpty(user.getObjectId())){
+            ShiroKit.getUser().setObjectId(user.getObjectId());
+        }
+        //设置角色
+        ShiroKit.getUser().setRoleType(user.getRoleType());
+
+        model.addAttribute("titles", titles);
+
+        //获取用户头像
+        String avatar = user.getAvatar();
+        model.addAttribute("avatar", avatar);
+        model.addAttribute("userName", user.getName());
+        model.addAttribute("type", 0);
+        model.addAttribute("passwordHint",
+                null == user.getPassWordUpdate()
+                        || user.getPassWordUpdate().getTime() + 7776000000L <= System.currentTimeMillis()
+                        ? "您的密码已经90天未更换了,请及时更换密码!!!" : "");
+        return "/index.html";
+    }
+
+    /**
+     * 跳转到登录页面
+     */
+    @RequestMapping(value = "/login", method = RequestMethod.GET)
+    public String login() {
+        if (ShiroKit.isAuthenticated() || ShiroKit.getUser() != null) {
+            return REDIRECT + "/";
+        } else {
+            return "/login.html";
+        }
+    }
+
+    /**
+     * 点击登录执行的动作
+     */
+    @RequestMapping(value = "/login", method = RequestMethod.POST)
+    public String loginVali(String username, String password, String remember, Model model, HttpServletRequest request) {
+        String ip = request.getHeader("x-forwarded-for");
+        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
+            // 多次反向代理后会有多个ip值,第一个ip才是真实ip
+            if (ip.indexOf(",") != -1) {
+                ip = ip.split(",")[0];
+            }
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("X-Real-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+        if(!ips.contains(ip)){
+            model.addAttribute("tips", "请在特定的网络下使用系统");
+            return "/login.html";
+        }
+
+        Integer f = loginFailures.get(username);
+        f = f == null ? 0 : f;
+        Long t = loginTime.get(username);
+        t = null == t ? 0 : t;
+        if(System.currentTimeMillis() - t > (30 * 60 * 1000)){
+            loginFailures.put(username, f = 1);
+            loginTime.put(username, System.currentTimeMillis());
+        }else{
+            f++;
+            loginFailures.put(username, f);
+        }
+
+        if(f > 5 && (System.currentTimeMillis() - t) <= (30 * 60 * 1000)){
+            model.addAttribute("tips", "登录次数过多,请等30分钟再试!");
+            return "/login.html";
+        }
+        //验证验证码是否正确
+        if (KaptchaUtil.getKaptchaOnOff()) {
+            String kaptcha = super.getPara("kaptcha").trim();
+            String code = (String) super.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
+            if (ToolUtil.isEmpty(kaptcha) || !kaptcha.equalsIgnoreCase(code)) {
+                throw new InvalidKaptchaException();
+            }
+        }
+        password = AESUtils.decrypt(password);
+        Subject currentUser = ShiroKit.getSubject();
+        UsernamePasswordToken token = new UsernamePasswordToken(username, password.toCharArray());
+
+//        if ("on".equals(remember)) {
+//            token.setRememberMe(true);
+//        } else {
+//            token.setRememberMe(false);
+//        }
+
+        token.setRememberMe(false);//关闭记住我功能
+
+        currentUser.login(token);
+
+        ShiroUser shiroUser = ShiroKit.getUser();
+        super.getSession().setAttribute("shiroUser", shiroUser);
+        super.getSession().setAttribute("username", shiroUser.getAccount());
+
+        LogManager.me().executeLog(LogTaskFactory.loginLog(shiroUser.getId(), getIp()));
+
+        ShiroKit.getSession().setAttribute("sessionFlag", true);
+        return REDIRECT + "/";
+    }
+
+    /**
+     * 退出登录
+     */
+    @RequestMapping(value = "/logout", method = RequestMethod.GET)
+    public String logOut() {
+        LogManager.me().executeLog(LogTaskFactory.exitLog(ShiroKit.getUser().getId(), getIp()));
+        ShiroKit.getSubject().logout();
+        deleteAllCookie();
+        return REDIRECT + "/login";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginLogController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginLogController.java
new file mode 100644
index 0000000..6cb2ee7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginLogController.java
@@ -0,0 +1,69 @@
+package com.stylefeng.guns.modular.system.controller.system;
+
+import com.baomidou.mybatisplus.mapper.SqlRunner;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+import com.stylefeng.guns.modular.system.service.ILoginLogService;
+import com.stylefeng.guns.modular.system.warpper.LogWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 日志管理的控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年4月5日 19:45:36
+ */
+@Controller
+@RequestMapping("/loginLog")
+public class LoginLogController extends BaseController {
+
+    private static String PREFIX = "/system/log/";
+
+    @Autowired
+    private ILoginLogService loginLogService;
+
+    /**
+     * 跳转到日志管理的首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "login_log.html";
+    }
+
+    /**
+     * 查询登录日志列表
+     */
+    @RequestMapping("/list")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object list(@RequestParam(required = false) String beginTime, @RequestParam(required = false) String endTime, @RequestParam(required = false) String logName) {
+        Page<LoginLog> page = new PageFactory<LoginLog>().defaultPage();
+        List<Map<String, Object>> result = loginLogService.getLoginLogs(page, beginTime, endTime, logName, page.getOrderByField(), page.isAsc());
+        page.setRecords((List<LoginLog>) new LogWarpper(result).warp());
+        return super.packForBT(page);
+    }
+
+    /**
+     * 清空日志
+     */
+    @BussinessLog("清空登录日志")
+    @RequestMapping("/delLoginLog")
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Object delLog() {
+        SqlRunner.db().delete("delete from sys_login_log");
+        return SUCCESS_TIP;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/MenuController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/MenuController.java
new file mode 100644
index 0000000..9857aae
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/MenuController.java
@@ -0,0 +1,251 @@
+package com.stylefeng.guns.modular.system.controller.system;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.Tip;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.dictmap.MenuDict;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.constant.state.MenuStatus;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.core.support.BeanKit;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.Menu;
+import com.stylefeng.guns.modular.system.service.IMenuService;
+import com.stylefeng.guns.modular.system.warpper.MenuWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 菜单控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年2月12日21:59:14
+ */
+@Controller
+@RequestMapping("/menu")
+public class MenuController extends BaseController {
+
+    private static String PREFIX = "/system/menu/";
+
+    @Autowired
+    private IMenuService menuService;
+
+
+    /**
+     * 跳转到菜单列表列表页面
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "menu.html";
+    }
+
+    /**
+     * 跳转到菜单列表列表页面
+     */
+    @RequestMapping(value = "/menu_add")
+    public String menuAdd() {
+        return PREFIX + "menu_add.html";
+    }
+
+    /**
+     * 跳转到菜单详情列表页面
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping(value = "/menu_edit/{menuId}")
+    public String menuEdit(@PathVariable Long menuId, Model model) {
+        if (ToolUtil.isEmpty(menuId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        Menu menu = this.menuService.selectById(menuId);
+
+        //获取父级菜单的id
+        Menu temp = new Menu();
+        temp.setCode(menu.getPcode());
+        Menu pMenu = this.menuService.selectOne(new EntityWrapper<>(temp));
+
+        //如果父级是顶级菜单
+        if (pMenu == null) {
+            menu.setPcode("0");
+        } else {
+            //设置父级菜单的code为父级菜单的id
+            menu.setPcode(String.valueOf(pMenu.getId()));
+        }
+
+        Map<String, Object> menuMap = BeanKit.beanToMap(menu);
+        menuMap.put("pcodeName", ConstantFactory.me().getMenuNameByCode(temp.getCode()));
+        model.addAttribute("menu", menuMap);
+        LogObjectHolder.me().set(menu);
+        return PREFIX + "menu_edit.html";
+    }
+
+    /**
+     * 修该菜单
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping(value = "/edit")
+    @BussinessLog(value = "修改菜单", key = "name", dict = MenuDict.class)
+    @ResponseBody
+    public Tip edit(@Valid Menu menu, BindingResult result) {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        //设置父级菜单编号
+        menuSetPcode(menu);
+
+        this.menuService.updateById(menu);
+
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 获取菜单列表
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(@RequestParam(required = false) String menuName, @RequestParam(required = false) String level) {
+        List<Map<String, Object>> menus = this.menuService.selectMenus(menuName, level);
+        return super.warpObject(new MenuWarpper(menus));
+    }
+
+    /**
+     * 新增菜单
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping(value = "/add")
+    @BussinessLog(value = "菜单新增", key = "name", dict = MenuDict.class)
+    @ResponseBody
+    public Tip add(@Valid Menu menu, BindingResult result) {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+
+        //判断是否存在该编号
+        String existedMenuName = ConstantFactory.me().getMenuNameByCode(menu.getCode());
+        if (ToolUtil.isNotEmpty(existedMenuName)) {
+            throw new GunsException(BizExceptionEnum.EXISTED_THE_MENU);
+        }
+
+        //设置父级菜单编号
+        menuSetPcode(menu);
+
+        menu.setStatus(MenuStatus.ENABLE.getCode());
+        this.menuService.insert(menu);
+
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除菜单
+     */
+    @Permission(Const.ADMIN_NAME)
+    @RequestMapping(value = "/remove")
+    @BussinessLog(value = "删除菜单", key = "menuId", dict = MenuDict.class)
+    @ResponseBody
+    public Tip remove(@RequestParam Long menuId) {
+        if (ToolUtil.isEmpty(menuId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+
+
+        //缓存菜单的名称
+        LogObjectHolder.me().set(ConstantFactory.me().getMenuName(menuId));
+
+        this.menuService.delMenuContainSubMenus(menuId);
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 查看菜单
+     */
+    @RequestMapping(value = "/view/{menuId}")
+    @ResponseBody
+    public Tip view(@PathVariable Long menuId) {
+        if (ToolUtil.isEmpty(menuId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        this.menuService.selectById(menuId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 获取菜单列表(首页用)
+     */
+    @RequestMapping(value = "/menuTreeList")
+    @ResponseBody
+    public List<ZTreeNode> menuTreeList() {
+        List<ZTreeNode> roleTreeList = this.menuService.menuTreeList();
+        return roleTreeList;
+    }
+
+    /**
+     * 获取菜单列表(选择父级菜单用)
+     */
+    @RequestMapping(value = "/selectMenuTreeList")
+    @ResponseBody
+    public List<ZTreeNode> selectMenuTreeList() {
+        List<ZTreeNode> roleTreeList = this.menuService.menuTreeList();
+        roleTreeList.add(ZTreeNode.createParent());
+        return roleTreeList;
+    }
+
+    /**
+     * 获取角色列表
+     */
+    @RequestMapping(value = "/menuTreeListByRoleId/{roleId}")
+    @ResponseBody
+    public List<ZTreeNode> menuTreeListByRoleId(@PathVariable Integer roleId) {
+        List<Long> menuIds = this.menuService.getMenuIdsByRoleId(roleId);
+        if (ToolUtil.isEmpty(menuIds)) {
+            List<ZTreeNode> roleTreeList = this.menuService.menuTreeList();
+            return roleTreeList;
+        } else {
+            List<ZTreeNode> roleTreeListByUserId = this.menuService.menuTreeListByMenuIds(menuIds);
+            return roleTreeListByUserId;
+        }
+    }
+
+    /**
+     * 根据请求的父级菜单编号设置pcode和层级
+     */
+    private void menuSetPcode(@Valid Menu menu) {
+        if (ToolUtil.isEmpty(menu.getPcode()) || menu.getPcode().equals("0")) {
+            menu.setPcode("0");
+            menu.setPcodes("[0],");
+            menu.setLevels(1);
+        } else {
+            long code = Long.parseLong(menu.getPcode());
+            Menu pMenu = menuService.selectById(code);
+            Integer pLevels = pMenu.getLevels();
+            menu.setPcode(pMenu.getCode());
+
+            //如果编号和父编号一致会导致无限递归
+            if (menu.getCode().equals(menu.getPcode())) {
+                throw new GunsException(BizExceptionEnum.MENU_PCODE_COINCIDENCE);
+            }
+
+            menu.setLevels(pLevels + 1);
+            menu.setPcodes(pMenu.getPcodes() + "[" + pMenu.getCode() + "],");
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/RoleController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/RoleController.java
new file mode 100644
index 0000000..287755f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/RoleController.java
@@ -0,0 +1,237 @@
+package com.stylefeng.guns.modular.system.controller.system;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.Tip;
+import com.stylefeng.guns.core.cache.CacheKit;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.cache.Cache;
+import com.stylefeng.guns.core.common.constant.dictmap.RoleDict;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.core.util.Convert;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.Role;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.service.IRoleService;
+import com.stylefeng.guns.modular.system.service.IUserService;
+import com.stylefeng.guns.modular.system.warpper.RoleWarpper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 角色控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年2月12日21:59:14
+ */
+@Controller
+@RequestMapping("/role")
+public class RoleController extends BaseController {
+
+    private static String PREFIX = "/system/role";
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private IRoleService roleService;
+
+
+    /**
+     * 跳转到角色列表页面
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "/role.html";
+    }
+
+    /**
+     * 跳转到添加角色
+     */
+    @RequestMapping(value = "/role_add")
+    public String roleAdd() {
+        return PREFIX + "/role_add.html";
+    }
+
+    /**
+     * 跳转到修改角色
+     */
+    @Permission
+    @RequestMapping(value = "/role_edit/{roleId}")
+    public String roleEdit(@PathVariable Integer roleId, Model model) {
+        if (ToolUtil.isEmpty(roleId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        Role role = this.roleService.selectById(roleId);
+        model.addAttribute(role);
+        model.addAttribute("pName", ConstantFactory.me().getSingleRoleName(role.getPid()));
+        model.addAttribute("deptName", ConstantFactory.me().getDeptName(role.getDeptid()));
+        LogObjectHolder.me().set(role);
+        return PREFIX + "/role_edit.html";
+    }
+
+    /**
+     * 跳转到角色分配
+     */
+    @Permission
+    @RequestMapping(value = "/role_assign/{roleId}")
+    public String roleAssign(@PathVariable("roleId") Integer roleId, Model model) {
+        if (ToolUtil.isEmpty(roleId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        model.addAttribute("roleId", roleId);
+        model.addAttribute("roleName", ConstantFactory.me().getSingleRoleName(roleId));
+        return PREFIX + "/role_assign.html";
+    }
+
+    /**
+     * 获取角色列表
+     */
+    @Permission
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(@RequestParam(required = false) String roleName) {
+        List<Map<String, Object>> roles = this.roleService.selectRoles(super.getPara("roleName"));
+        return super.warpObject(new RoleWarpper(roles));
+    }
+
+    /**
+     * 角色新增
+     */
+    @RequestMapping(value = "/add")
+    @BussinessLog(value = "添加角色", key = "name", dict = RoleDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip add(@Valid Role role, BindingResult result) {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        role.setId(null);
+        this.roleService.insert(role);
+
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 角色修改
+     */
+    @RequestMapping(value = "/edit")
+    @BussinessLog(value = "修改角色", key = "name", dict = RoleDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip edit(@Valid Role role, BindingResult result) {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        this.roleService.updateById(role);
+
+        //删除缓存
+        CacheKit.removeAll(Cache.CONSTANT);
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除角色
+     */
+    @RequestMapping(value = "/remove")
+    @BussinessLog(value = "删除角色", key = "roleId", dict = RoleDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip remove(@RequestParam Integer roleId) {
+        if (ToolUtil.isEmpty(roleId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+
+        Role role = this.roleService.selectById(roleId);
+
+        //不能删除超级管理员角色
+        if (roleId.equals(Const.ADMIN_ROLE_ID)) {
+            throw new GunsException(BizExceptionEnum.CANT_DELETE_ADMIN);
+        }
+
+        //缓存被删除的角色名称
+        LogObjectHolder.me().set(ConstantFactory.me().getSingleRoleName(roleId));
+
+        this.roleService.delRoleById(roleId);
+
+        //删除缓存
+        CacheKit.removeAll(Cache.CONSTANT);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 查看角色
+     */
+    @RequestMapping(value = "/view/{roleId}")
+    @ResponseBody
+    public Tip view(@PathVariable Integer roleId) {
+        if (ToolUtil.isEmpty(roleId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        this.roleService.selectById(roleId);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 配置权限
+     */
+    @RequestMapping("/setAuthority")
+    @BussinessLog(value = "配置权限", key = "roleId,ids", dict = RoleDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip setAuthority(@RequestParam("roleId") Integer roleId, @RequestParam("ids") String ids) {
+        if (ToolUtil.isOneEmpty(roleId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        this.roleService.setAuthority(roleId, ids);
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 获取角色列表
+     */
+    @RequestMapping(value = "/roleTreeList")
+    @ResponseBody
+    public List<ZTreeNode> roleTreeList() {
+        List<ZTreeNode> roleTreeList = this.roleService.roleTreeList();
+        roleTreeList.add(ZTreeNode.createParent());
+        return roleTreeList;
+    }
+
+    /**
+     * 获取角色列表
+     */
+    @RequestMapping(value = "/roleTreeListByUserId/{userId}")
+    @ResponseBody
+    public List<ZTreeNode> roleTreeListByUserId(@PathVariable Integer userId) {
+        User theUser = this.userService.selectById(userId);
+        String roleid = theUser.getRoleid();
+        if (ToolUtil.isEmpty(roleid)) {
+            List<ZTreeNode> roleTreeList = this.roleService.roleTreeList();
+            return roleTreeList;
+        } else {
+            String[] strArray = Convert.toStrArray(",", roleid);
+            List<ZTreeNode> roleTreeListByUserId = this.roleService.roleTreeListByRoleId(strArray);
+            return roleTreeListByUserId;
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/UediterController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/UediterController.java
new file mode 100644
index 0000000..ea492a3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/UediterController.java
@@ -0,0 +1,125 @@
+package com.stylefeng.guns.modular.system.controller.system;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.stylefeng.guns.modular.system.util.OssUploadUtil ;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import com.alibaba.fastjson.JSON;
+ 
+@Controller
+public class UediterController {
+	/*@RequestMapping("/config")
+    public String getConfigInfo(HttpServletRequest request,HttpServletResponse response){
+        return "redirect:/static/js/ueditor/jsp/jsp/config.json";
+    }*/
+    public final static String UEDITOR_CONFIG = "{\n" +
+            "    \"imageActionName\": \"uploadimage\",\n" +
+            "    \"imageFieldName\": \"upfile\",\n" +
+            "    \"imageMaxSize\": 2048000,\n" +
+            "    \"imageAllowFiles\": [\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\"],\n" +
+            "    \"imageCompressEnable\": true,\n" +
+            "    \"imageCompressBorder\": 1600,\n" +
+            "    \"imageInsertAlign\": \"none\",\n" +
+            "    \"imageUrlPrefix\": \"\",\n" +
+            "    \"imagePathFormat\": \"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}\",\n" +
+            "\n" +
+            "    \"scrawlActionName\": \"uploadscrawl\",\n" +
+            "    \"scrawlFieldName\": \"upfile\",\n" +
+            "    \"scrawlPathFormat\": \"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}\",\n" +
+            "    \"scrawlMaxSize\": 2048000,\n" +
+            "    \"scrawlUrlPrefix\": \"\",\n" +
+            "    \"scrawlInsertAlign\": \"none\",\n" +
+            "\n" +
+            "    \"snapscreenActionName\": \"uploadimage\",\n" +
+            "    \"snapscreenPathFormat\": \"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}\",\n" +
+            "    \"snapscreenUrlPrefix\": \"\",\n" +
+            "    \"snapscreenInsertAlign\": \"none\",\n" +
+            "\n" +
+            "    \"catcherLocalDomain\": [\"127.0.0.1\", \"localhost\", \"img.baidu.com\"],\n" +
+            "    \"catcherActionName\": \"catchimage\",\n" +
+            "    \"catcherFieldName\": \"source\",\n" +
+            "    \"catcherPathFormat\": \"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}\",\n" +
+            "    \"catcherUrlPrefix\": \"\",\n" +
+            "    \"catcherMaxSize\": 2048000,\n" +
+            "    \"catcherAllowFiles\": [\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\"],\n" +
+            "\n" +
+            "    \"videoActionName\": \"uploadvideo\",\n" +
+            "    \"videoFieldName\": \"upfile\",\n" +
+            "    \"videoPathFormat\": \"/ueditor/jsp/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}\",\n" +
+            "    \"videoUrlPrefix\": \"\",\n" +
+            "    \"videoMaxSize\": 102400000,\n" +
+            "    \"videoAllowFiles\": [\n" +
+            "        \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n" +
+            "        \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\"],\n" +
+            "\n" +
+            "    \"fileActionName\": \"uploadfile\",\n" +
+            "    \"fileFieldName\": \"upfile\",\n" +
+            "    \"filePathFormat\": \"/ueditor/jsp/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}\",\n" +
+            "    \"fileUrlPrefix\": \"\",\n" +
+            "    \"fileMaxSize\": 51200000,\n" +
+            "    \"fileAllowFiles\": [\n" +
+            "        \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\",\n" +
+            "        \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n" +
+            "        \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\",\n" +
+            "        \".rar\", \".zip\", \".tar\", \".gz\", \".7z\", \".bz2\", \".cab\", \".iso\",\n" +
+            "        \".doc\", \".docx\", \".xls\", \".xlsx\", \".ppt\", \".pptx\", \".pdf\", \".txt\", \".md\", \".xml\"\n" +
+            "    ],\n" +
+            "\n" +
+            "    \"imageManagerActionName\": \"listimage\",\n" +
+            "    \"imageManagerListPath\": \"/ueditor/jsp/upload/image/\",\n" +
+            "    \"imageManagerListSize\": 20,\n" +
+            "    \"imageManagerUrlPrefix\": \"\",\n" +
+            "    \"imageManagerInsertAlign\": \"none\",\n" +
+            "    \"imageManagerAllowFiles\": [\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\"],\n" +
+            "\n" +
+            "    \"fileManagerActionName\": \"listfile\",\n" +
+            "    \"fileManagerListPath\": \"/ueditor/jsp/upload/file/\",\n" +
+            "    \"fileManagerUrlPrefix\": \"\",\n" +
+            "    \"fileManagerListSize\": 20,\n" +
+            "    \"fileManagerAllowFiles\": [\n" +
+            "        \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\",\n" +
+            "        \".flv\", \".swf\", \".mkv\", \".avi\", \".rm\", \".rmvb\", \".mpeg\", \".mpg\",\n" +
+            "        \".ogg\", \".ogv\", \".mov\", \".wmv\", \".mp4\", \".webm\", \".mp3\", \".wav\", \".mid\",\n" +
+            "        \".rar\", \".zip\", \".tar\", \".gz\", \".7z\", \".bz2\", \".cab\", \".iso\",\n" +
+            "        \".doc\", \".docx\", \".xls\", \".xlsx\", \".ppt\", \".pptx\", \".pdf\", \".txt\", \".md\", \".xml\"\n" +
+            "    ] \n" +
+            "\n" +
+            "}";
+    @RequestMapping(value = "/config")
+    @ResponseBody
+    public JSON config(String action, HttpServletRequest request, HttpServletResponse response) {
+        if(action.equals("config")){
+            return JSON.parseObject(UEDITOR_CONFIG);
+        }else{
+            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+            MultipartFile picture = multipartRequest.getFile("upfile");
+            String callback = request.getParameter("callback");
+            String pictureName = "";
+            try {
+            	//文件上传,具体根据实际替换
+                pictureName = OssUploadUtil.ossUpload(request, picture);
+ 
+                String result = "{'original': '" + picture.getOriginalFilename() + "', 'state': 'SUCCESS', 'url': '" + pictureName + "'}";
+                if (callback == null) {
+                    return JSON.parseObject(result);
+                } else {
+                    return JSON.parseObject("<script>" + callback + "(" + result + ")</script>");
+                }
+            } catch (Exception e) {
+                String result = "{'original': '', 'state': '文件上传失败','url': ''}";
+                if (callback == null) {
+                    return JSON.parseObject(result);
+                } else {
+                    return JSON.parseObject("<script>" + callback + "(" + result + ")</script>");
+                }
+            }
+        }
+ 
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/UserMgrController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/UserMgrController.java
new file mode 100644
index 0000000..1fa9b8b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/UserMgrController.java
@@ -0,0 +1,451 @@
+package com.stylefeng.guns.modular.system.controller.system;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.base.tips.Tip;
+import com.stylefeng.guns.core.common.annotion.BussinessLog;
+import com.stylefeng.guns.core.common.annotion.Permission;
+import com.stylefeng.guns.core.common.constant.Const;
+import com.stylefeng.guns.core.common.constant.dictmap.UserDict;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.common.constant.state.ManagerStatus;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.datascope.DataScope;
+import com.stylefeng.guns.core.db.Db;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.UserMapper;
+import com.stylefeng.guns.modular.system.factory.UserFactory;
+import com.stylefeng.guns.modular.system.model.TCompany;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.service.ITCompanyService;
+import com.stylefeng.guns.modular.system.service.ITDriverService;
+import com.stylefeng.guns.modular.system.service.IUserService;
+import com.stylefeng.guns.modular.system.transfer.UserDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.naming.NoPermissionException;
+import javax.validation.Valid;
+import java.io.File;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 系统管理员控制器
+ *
+ * @author fengshuonan
+ * @Date 2017年1月11日 下午1:08:17
+ */
+@Controller
+@RequestMapping("/mgr")
+public class UserMgrController extends BaseController {
+
+    private static String PREFIX = "/system/user/";
+
+    @Autowired
+    private GunsProperties gunsProperties;
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private ITDriverService itDriverService;
+
+
+    /**
+     * 跳转到查看管理员列表的页面
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "user.html";
+    }
+
+    /**
+     * 跳转到查看管理员列表的页面
+     */
+    @RequestMapping("/user_add")
+    public String addView() {
+        return PREFIX + "user_add.html";
+    }
+
+    /**
+     * 跳转到角色分配页面
+     */
+    //@RequiresPermissions("/mgr/role_assign")  //利用shiro自带的权限检查
+    @Permission
+    @RequestMapping("/role_assign/{userId}")
+    public String roleAssign(@PathVariable Integer userId, Model model) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        User user = (User) Db.create(UserMapper.class).selectOneByCon("id", userId);
+        model.addAttribute("userId", userId);
+        model.addAttribute("userAccount", user.getAccount());
+        return PREFIX + "user_roleassign.html";
+    }
+
+    /**
+     * 跳转到编辑管理员页面
+     */
+    @Permission
+    @RequestMapping("/user_edit/{userId}")
+    public String userEdit(@PathVariable Integer userId, Model model) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        assertAuth(userId);
+        User user = this.userService.selectById(userId);
+        model.addAttribute(user);
+        model.addAttribute("roleName", ConstantFactory.me().getRoleName(user.getRoleid()));
+        model.addAttribute("deptName", ConstantFactory.me().getDeptName(user.getDeptid()));
+        LogObjectHolder.me().set(user);
+        return PREFIX + "user_edit.html";
+    }
+
+    /**
+     * 跳转到查看用户详情页面
+     */
+    @RequestMapping("/user_info")
+    public String userInfo(Model model) {
+        Integer userId = ShiroKit.getUser().getId();
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        User user = this.userService.selectById(userId);
+        model.addAttribute(user);
+        model.addAttribute("roleName", ConstantFactory.me().getRoleName(user.getRoleid()));
+        model.addAttribute("deptName", user.getDeptid()==0?"顶级":ConstantFactory.me().getDeptName(user.getDeptid()));
+        LogObjectHolder.me().set(user);
+        return PREFIX + "user_view.html";
+    }
+
+    /**
+     * 跳转到修改密码界面
+     */
+    @RequestMapping("/user_chpwd")
+    public String chPwd() {
+        return PREFIX + "user_chpwd.html";
+    }
+
+    /**
+     * 修改当前用户的密码
+     */
+    @RequestMapping("/changePwd")
+    @ResponseBody
+    public Object changePwd(@RequestParam String oldPwd, @RequestParam String newPwd, @RequestParam String rePwd) {
+        if (!newPwd.equals(rePwd)) {
+            throw new GunsException(BizExceptionEnum.TWO_PWD_NOT_MATCH);
+        }
+        Integer userId = ShiroKit.getUser().getId();
+        User user = userService.selectById(userId);
+        String oldMd5 = ShiroKit.md5(oldPwd, user.getSalt());
+        if (user.getPassword().equals(oldMd5)) {
+            String newMd5 = ShiroKit.md5(newPwd, user.getSalt());
+            user.setPassword(newMd5);
+            user.setPassWordUpdate(new Date());
+            user.updateById();
+            return SUCCESS_TIP;
+        } else {
+            throw new GunsException(BizExceptionEnum.OLD_PWD_NOT_RIGHT);
+        }
+    }
+
+    /**
+     * 查询管理员列表
+     */
+    @RequestMapping("/list")
+    @Permission
+    @ResponseBody
+    public Object list(@RequestParam(required = false) String name, @RequestParam(required = false) String createTime, @RequestParam(required = false) Integer deptid) {
+        //创建日期
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        if (ShiroKit.isAdmin()) {
+            Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+            page.setRecords(userService.getUserListPage(page,null, name, beginTime, endTime, deptid));
+            return super.packForBT(page);
+        } else {
+            DataScope dataScope = new DataScope(ShiroKit.getDeptDataScope());
+            Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+            page.setRecords(userService.getUserListPage(page,dataScope, name, beginTime, endTime, deptid));
+            return super.packForBT(page);
+        }
+    }
+
+    /**
+     * 添加管理员
+     */
+    @RequestMapping("/add")
+    @BussinessLog(value = "添加管理员", key = "account", dict = UserDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip add(@Valid UserDto user, BindingResult result) {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+
+        // 判断账号是否重复
+        User theUser = userService.getByAccount(user.getAccount());
+        if (theUser != null) {
+            throw new GunsException(BizExceptionEnum.USER_ALREADY_REG);
+        }
+
+        // 完善账号信息
+        user.setSalt(ShiroKit.getRandomSalt(5));
+        user.setPassword(ShiroKit.md5(user.getPassword(), user.getSalt()));
+        user.setStatus(ManagerStatus.OK.getCode());
+        user.setCreatetime(new Date());
+
+        User objectUser = UserFactory.createUser(user);
+        //查找平台所属公司
+        TCompany company = itCompanyService.selectOne(new EntityWrapper<TCompany>().eq("type", 1).orderBy("id", true).last(" limit 1"));
+        if (SinataUtil.isNotEmpty(company)){
+            objectUser.setObjectId(company.getId());
+        }
+        objectUser.setPassWordUpdate(new Date());
+        this.userService.insert(objectUser);
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改管理员
+     *
+     * @throws NoPermissionException
+     */
+    @RequestMapping("/edit")
+    @BussinessLog(value = "修改管理员", key = "account", dict = UserDict.class)
+    @ResponseBody
+    public Tip edit(@Valid UserDto user, BindingResult result) throws NoPermissionException {
+        if (result.hasErrors()) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+
+
+        User oldUser = userService.selectById(user.getId());
+
+        if (ShiroKit.hasRole(Const.ADMIN_NAME)) {
+            this.userService.updateById(UserFactory.editUser(user, oldUser));
+            return SUCCESS_TIP;
+        } else {
+            assertAuth(user.getId());
+            ShiroUser shiroUser = ShiroKit.getUser();
+            if (shiroUser.getId().equals(user.getId())) {
+                this.userService.updateById(UserFactory.editUser(user, oldUser));
+                return SUCCESS_TIP;
+            } else {
+                throw new GunsException(BizExceptionEnum.NO_PERMITION);
+            }
+        }
+    }
+
+    /**
+     * 删除管理员(逻辑删除)
+     */
+    @RequestMapping("/delete")
+    @BussinessLog(value = "删除管理员", key = "userId", dict = UserDict.class)
+    @Permission
+    @ResponseBody
+    public Tip delete(@RequestParam Integer userId) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        //不能删除超级管理员
+        if (userId.equals(Const.ADMIN_ID)) {
+            throw new GunsException(BizExceptionEnum.CANT_DELETE_ADMIN);
+        }
+
+
+        assertAuth(userId);
+        this.userService.setStatus(userId, ManagerStatus.DELETED.getCode());
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 查看管理员详情
+     */
+    @RequestMapping("/view/{userId}")
+    @ResponseBody
+    public User view(@PathVariable Integer userId) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        assertAuth(userId);
+        return this.userService.selectById(userId);
+    }
+
+    /**
+     * 重置管理员的密码
+     */
+    @RequestMapping("/reset")
+    @BussinessLog(value = "重置管理员密码", key = "userId", dict = UserDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip reset(@RequestParam Integer userId) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        assertAuth(userId);
+        User user = this.userService.selectById(userId);
+        user.setSalt(ShiroKit.getRandomSalt(5));
+        user.setPassword(ShiroKit.md5(Const.DEFAULT_PWD, user.getSalt()));
+        this.userService.updateById(user);
+
+        return SUCCESS_TIP;
+    }
+
+    @Autowired
+    private ITCompanyService itCompanyService;
+
+    /**
+     * 冻结用户
+     */
+    @RequestMapping("/freeze")
+    @BussinessLog(value = "冻结用户", key = "userId", dict = UserDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip freeze(@RequestParam Integer userId) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        //不能冻结超级管理员
+        if (userId.equals(Const.ADMIN_ID)) {
+            throw new GunsException(BizExceptionEnum.CANT_FREEZE_ADMIN);
+        }
+        assertAuth(userId);
+        this.userService.setStatus(userId, ManagerStatus.FREEZED.getCode());
+
+        User user = userService.selectById(userId);
+        if (user.getRoleType() == 2){
+            //查询分公司
+            TCompany company = itCompanyService.selectById(user.getObjectId());
+            company.setState(1);
+            itCompanyService.updateById(company);
+
+            //设置该分公司下的所有司机状态
+            itDriverService.updateCompanyDriverState(3,company.getId());
+
+        }else if (user.getRoleType() == 3){
+            //查询加盟商
+            TCompany franchisee = itCompanyService.selectById(user.getObjectId());
+            franchisee.setState(1);
+            itCompanyService.updateById(franchisee);
+
+            //设置该加盟商下的所有司机状态
+            itDriverService.updateFranchiseeDriverState(3,franchisee.getId());
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 解除冻结用户
+     */
+    @RequestMapping("/unfreeze")
+    @BussinessLog(value = "解除冻结用户", key = "userId", dict = UserDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip unfreeze(@RequestParam Integer userId) {
+        if (ToolUtil.isEmpty(userId)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        assertAuth(userId);
+        this.userService.setStatus(userId, ManagerStatus.OK.getCode());
+
+        User user = userService.selectById(userId);
+        if (user.getRoleType() == 2){
+            //查询分公司
+            TCompany company = itCompanyService.selectById(user.getObjectId());
+            company.setState(0);
+            itCompanyService.updateById(company);
+
+            //设置该分公司下的所有司机状态
+            itDriverService.updateCompanyDriverState(2,company.getId());
+
+        }else if (user.getRoleType() == 3){
+            //查询加盟商
+            TCompany franchisee = itCompanyService.selectById(user.getObjectId());
+            franchisee.setState(0);
+            itCompanyService.updateById(franchisee);
+
+            //设置该加盟商下的所有司机状态
+            itDriverService.updateFranchiseeDriverState(2,franchisee.getId());
+        }
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 分配角色
+     */
+    @RequestMapping("/setRole")
+    @BussinessLog(value = "分配角色", key = "userId,roleIds", dict = UserDict.class)
+    @Permission(Const.ADMIN_NAME)
+    @ResponseBody
+    public Tip setRole(@RequestParam("userId") Integer userId, @RequestParam("roleIds") String roleIds) {
+        if (ToolUtil.isOneEmpty(userId, roleIds)) {
+            throw new GunsException(BizExceptionEnum.REQUEST_NULL);
+        }
+        //不能修改超级管理员
+        if (userId.equals(Const.ADMIN_ID)) {
+            throw new GunsException(BizExceptionEnum.CANT_CHANGE_ADMIN);
+        }
+        assertAuth(userId);
+        this.userService.setRoles(userId, roleIds);
+
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 上传图片
+     */
+    @RequestMapping(method = RequestMethod.POST, path = "/upload")
+    @ResponseBody
+    public String upload(@RequestPart("file") MultipartFile picture) {
+
+        String pictureName = UUID.randomUUID().toString() + "." + ToolUtil.getFileSuffix(picture.getOriginalFilename());
+        try {
+            String fileSavePath = gunsProperties.getFileUploadPath();
+            picture.transferTo(new File(fileSavePath + pictureName));
+        } catch (Exception e) {
+            throw new GunsException(BizExceptionEnum.UPLOAD_ERROR);
+        }
+        return pictureName;
+    }
+
+    /**
+     * 判断当前登录的用户是否有操作这个用户的权限
+     */
+    private void assertAuth(Integer userId) {
+        if (ShiroKit.isAdmin()) {
+            return;
+        }
+        List<Integer> deptDataScope = ShiroKit.getDeptDataScope();
+        User user = this.userService.selectById(userId);
+        Integer deptid = user.getDeptid();
+        if (deptDataScope.contains(deptid)) {
+            return;
+        } else {
+            throw new GunsException(BizExceptionEnum.NO_PERMITION);
+        }
+
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/taxi/TOrderTaxiController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/taxi/TOrderTaxiController.java
new file mode 100644
index 0000000..c721350
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/taxi/TOrderTaxiController.java
@@ -0,0 +1,278 @@
+package com.stylefeng.guns.modular.system.controller.taxi;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.TDriver;
+import com.stylefeng.guns.modular.system.model.TOrderPosition;
+import com.stylefeng.guns.modular.system.service.ITDriverService;
+import com.stylefeng.guns.modular.system.service.ITOrderPositionService;
+import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
+import com.stylefeng.guns.modular.system.util.PushURL;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.ui.Model;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.modular.system.model.TOrderTaxi;
+import com.stylefeng.guns.modular.system.service.ITOrderTaxiService;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 出租车订单控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-08 10:25:55
+ */
+@Controller
+@RequestMapping("/tOrderTaxi")
+public class TOrderTaxiController extends BaseController {
+
+    private String PREFIX = "/system/tOrderTaxi/";
+
+    @Autowired
+    private ITOrderTaxiService tOrderTaxiService;
+
+    @Autowired
+    private ITOrderPositionService tOrderPositionService;
+
+    @Autowired
+    private ITDriverService tDriverService;
+
+    @Value("${filePath}")
+    private String filePath;
+
+    /**
+     * 跳转到出租车订单首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tOrderTaxi.html";
+    }
+
+    /**
+     * 跳转到添加出租车订单
+     */
+    @RequestMapping("/tOrderTaxi_add")
+    public String tOrderTaxiAdd() {
+        return PREFIX + "tOrderTaxi_add.html";
+    }
+
+    /**
+     * 跳转到修改出租车订单
+     */
+    @RequestMapping("/tOrderTaxi_update/{tOrderTaxiId}")
+    public String tOrderTaxiUpdate(@PathVariable Integer tOrderTaxiId, Model model) {
+        Map<String, Object> tOrderTaxi = tOrderTaxiService.getTaxiOrderDetailById(tOrderTaxiId);
+        model.addAttribute("item",tOrderTaxi);
+        LogObjectHolder.me().set(tOrderTaxi);
+        return PREFIX + "tOrderTaxi_edit.html";
+    }
+
+    /**
+     * 跳转到改派出租车订单
+     */
+    @RequestMapping("/tOrderTaxi_changeOrder/{tOrderTaxiId}")
+    public String tOrderTaxi_changeOrder(@PathVariable Integer tOrderTaxiId, Model model) {
+        TOrderTaxi tOrderTaxi = tOrderTaxiService.selectById(tOrderTaxiId);
+        model.addAttribute("item",tOrderTaxi);
+        LogObjectHolder.me().set(tOrderTaxi);
+        return PREFIX + "tOrderTaxi_changeOrder.html";
+    }
+
+    /**
+     * 跳转到出租车订单轨迹页面
+     */
+    @RequestMapping("/tOrderTaxi_trajectory/{tOrderTaxiId}")
+    public String tOrderTaxi_trajectory(@PathVariable Integer tOrderTaxiId, Model model) {
+        model.addAttribute("tOrderTaxiId",tOrderTaxiId);
+        return PREFIX + "tOrderTaxi_trajectory.html";
+    }
+
+    /**
+     * 获取出租车订单列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String orderNum,
+                       Integer orderSource,
+                       String userName,
+                       String userPhone,
+                       String passengers,
+                       String passengersPhone,
+                       String driver,
+                       Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)){
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tOrderTaxiService.getTaxiOrderList(page,beginTime,endTime,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),orderNum,orderSource,userName,userPhone,passengers,passengersPhone,driver,state));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 选择司机列表
+     */
+    @RequestMapping(value = "/selectDriver/{orderId}")
+    @ResponseBody
+    public Object selectDriver(@PathVariable Integer orderId,
+                               String name,
+                               String phone) {
+        TOrderTaxi tOrderTaxi = tOrderTaxiService.selectById(orderId);
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tOrderTaxiService.getCanSelectTaxiDriverList(page,tOrderTaxi.getCompanyId(),name,phone));
+        return super.packForBT(page);
+    }
+
+    private ResultUtil resultUtil;
+
+    /**
+     * 获取订单轨迹
+     * @param orderDetailId
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getOrderTrack", method = RequestMethod.POST)
+    public ResultUtil getOrderTrack(String orderDetailId){
+        if(ToolUtil.isNotEmpty(orderDetailId)){
+            try {
+//                List<TOrderPosition> list = tOrderPositionService.selectList(new EntityWrapper<TOrderPosition>().eq("orderType", 2).eq("orderId", orderDetailId).orderBy("insertTime"));
+                /*if(list.size() == 0){
+                    return ResultUtil.error("该订单没有运行轨迹");
+                }*/
+                //将数据存储到文件中
+                File file = new File(filePath + orderDetailId + "_2.txt");
+                if(!file.exists()){
+                    return ResultUtil.success(new ArrayList<>());
+                }
+                //读取文件(字符流)
+                BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
+                //循环取出数据
+                String str = null;
+                StringBuffer sb = new StringBuffer();
+                while ((str = in.readLine()) != null) {
+                    sb.append(str);
+                }
+                List<TOrderPosition> list = JSONArray.parseArray(sb.toString(), TOrderPosition.class);
+                resultUtil = ResultUtil.success(list);
+            }catch (Exception e){
+                e.printStackTrace();
+                resultUtil = ResultUtil.runErr();
+            }
+        }else {
+            resultUtil = ResultUtil.paranErr();
+        }
+        return resultUtil;
+    }
+
+    /**
+     * 删除出租车订单
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tOrderTaxiId) {
+        TOrderTaxi tOrderTaxi = tOrderTaxiService.selectById(tOrderTaxiId);
+        tOrderTaxi.setIsDelete(2);
+        tOrderTaxiService.updateById(tOrderTaxi);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 出租车订单改派司机
+     */
+    @RequestMapping(value = "/selectDriver")
+    @ResponseBody
+    public Object selectDriver(@RequestParam Integer orderId,@RequestParam Integer driverId) {
+        //修改订单
+        TOrderTaxi tOrderTaxi = tOrderTaxiService.selectById(orderId);
+        
+        //修改之前司机状态 -- 空闲
+        TDriver oldDriver = tDriverService.selectById(tOrderTaxi.getDriverId());
+        oldDriver.setState(2);
+        tDriverService.updateById(oldDriver);
+
+        //查找司机对象
+        TDriver nowDriver = tDriverService.selectById(driverId);
+        nowDriver.setState(3);
+        tDriverService.updateById(nowDriver);
+
+        //修改出租车订单
+        tOrderTaxi.setState(tOrderTaxi.getOldState());
+        tOrderTaxi.setDriverId(driverId);
+        tOrderTaxi.setCarId(nowDriver.getCarId());
+        tOrderTaxiService.updateById(tOrderTaxi);
+
+        //增加推送
+        Map<String,String> map = new HashMap<>();
+        map.put("orderId", tOrderTaxi.getId().toString());
+        map.put("orderType", "2");
+        String result = HttpRequestUtil.postRequest(PushURL.order_push_url, map);
+        System.out.println("出租车改派:【orderId="+tOrderTaxi.getId().toString()+"】,调用接口:"+result);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 取消出租车订单
+     */
+    @RequestMapping(value = "/cancel")
+    @ResponseBody
+    public Object cancel(@RequestParam Integer tOrderTaxiId) {
+        TOrderTaxi tOrderTaxi = tOrderTaxiService.selectById(tOrderTaxiId);
+
+        //修改之前司机状态 -- 空闲
+        TDriver driver = tDriverService.selectById(tOrderTaxi.getDriverId());
+        driver.setState(2);
+        tDriverService.updateById(driver);
+
+        tOrderTaxi.setState(10);
+        tOrderTaxiService.updateById(tOrderTaxi);
+
+        //增加推送
+        Map<String,String> map = new HashMap<>();
+        map.put("id", tOrderTaxi.getId().toString());
+        map.put("orderType", "2");
+        String result = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map);
+        System.out.println("出租车取消:【orderId="+tOrderTaxi.getId().toString()+"】,调用接口:"+result);
+
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改出租车订单
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TOrderTaxi tOrderTaxi) {
+        tOrderTaxiService.updateById(tOrderTaxi);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 出租车订单详情
+     */
+    @RequestMapping(value = "/detail/{tOrderTaxiId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tOrderTaxiId") Integer tOrderTaxiId) {
+        return tOrderTaxiService.selectById(tOrderTaxiId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/MD5.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/MD5.java
new file mode 100644
index 0000000..c320048
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/MD5.java
@@ -0,0 +1,119 @@
+package com.stylefeng.guns.modular.system.controller.util;
+
+import java.io.*;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * MD5编码相关的类
+ * 
+ * @author wangjingtao
+ * 
+ */
+public class MD5 {
+	// 首先初始化一个字符数组,用来存放每个16进制字符
+	private static final char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
+			'f' };
+
+	/**
+	 * 获得一个字符串的MD5值
+	 * 
+	 * @param input
+	 *            输入的字符串
+	 * @return 输入字符串的MD5值
+	 * @throws UnsupportedEncodingException
+	 * 
+	 */
+	public static String md5(String input) throws UnsupportedEncodingException {
+		if (input == null)
+			return null;
+
+		try {
+			// 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)
+			MessageDigest messageDigest = MessageDigest.getInstance("MD5");
+			// 输入的字符串转换成字节数组
+			byte[] inputByteArray = input.getBytes("utf-8");
+			// inputByteArray是输入字符串转换得到的字节数组
+			messageDigest.update(inputByteArray);
+			// 转换并返回结果,也是字节数组,包含16个元素
+			byte[] resultByteArray = messageDigest.digest();
+			// 字符数组转换成字符串返回
+			return byteArrayToHex(resultByteArray);
+		} catch (NoSuchAlgorithmException e) {
+			return null;
+		}
+	}
+
+	/**
+	 * 获取文件的MD5值
+	 * 
+	 * @param file
+	 * @return
+	 */
+	public static String md5(File file) {
+		try {
+			if (!file.isFile()) {
+				System.err.println("文件" + file.getAbsolutePath() + "不存在或者不是文件");
+				return null;
+			}
+
+			FileInputStream in = new FileInputStream(file);
+
+			String result = md5(in);
+
+			in.close();
+
+			return result;
+
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+		return null;
+	}
+
+	public static String md5(InputStream in) {
+
+		try {
+			MessageDigest messagedigest = MessageDigest.getInstance("MD5");
+
+			byte[] buffer = new byte[1024];
+			int read = 0;
+			while ((read = in.read(buffer)) != -1) {
+				messagedigest.update(buffer, 0, read);
+			}
+
+			in.close();
+
+			String result = byteArrayToHex(messagedigest.digest());
+
+			return result;
+		} catch (NoSuchAlgorithmException e) {
+			e.printStackTrace();
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+		return null;
+	}
+
+	private static String byteArrayToHex(byte[] byteArray) {
+		// new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
+		char[] resultCharArray = new char[byteArray.length * 2];
+		// 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
+		int index = 0;
+		for (byte b : byteArray) {
+			resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
+			resultCharArray[index++] = hexDigits[b & 0xf];
+		}
+
+		// 字符数组组合成字符串返回
+		return new String(resultCharArray);
+
+	}
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/SendSms.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/SendSms.java
new file mode 100644
index 0000000..9b85834
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/SendSms.java
@@ -0,0 +1,263 @@
+package com.stylefeng.guns.modular.system.controller.util;
+
+
+import javax.net.ssl.*;
+import java.io.*;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+//如果JDK版本是1.8,可使用原生Base64类
+
+//如果JDK版本低于1.8,请使用三方库提供Base64类
+//import org.apache.commons.codec.binary.Base64;
+
+public class SendSms {
+
+    //无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值
+    private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"";
+    //无需修改,用于格式化鉴权头域,给"Authorization"参数赋值
+    private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\"";
+    //必填,请参考"开发准备"获取如下数据,替换为实际值
+    private static String  url = "https://api.rtc.huaweicloud.com:10443/sms/batchSendSms/v1"; //APP接入地址+接口访问URI//https://api.rtc.huaweicloud.com:10443
+    private static String appKey = "77lVYXy28011Ia6r43L6180kvdTv"; //APP_Key
+    private static String appSecret = "8heBt1YBCL71AF1G9UkxZpoUFqIY"; //APP_Secret
+    private static String sender1 = "881907307922"; //国内短信签名通道号或国际/港澳台短信通道号 (验证码类)
+    private static String sender2 = "8819073039050"; //国内短信签名通道号或国际/港澳台短信通道号(通知类)
+    private static String templateId1 = "6090edbdbd7e4550aae87bea35454d61"; //模板ID(验证码类)
+    private static String templateId2 = "18134ace828144f4bec31fa326e4de86"; //模板ID(通知类)
+    //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称
+    //国际/港澳台短信不用关注该参数
+    private static String signature = "全客通"; //签名名称
+
+    //必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔
+    String receiver = "+8615123456789,+8615234567890"; //短信接收人号码
+
+    //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
+    private static String statusCallBack = "";
+
+    /** 发送短信成功之后的回调信息
+     * {"result":[{"originTo":"13981969442","createTime":"2019-08-01T01:13:21Z","from":"8819073039050","smsMsgId":"f69b2293-9285-4f48-933e-6bcba1ea5710_579546688","status":"000000"}],"code":"000000","description":"Success"}
+     */
+
+    /**
+     * 选填,使用无变量模板时请赋空值 String templateParas = "";
+     * 单变量模板示例:模板内容为"您的验证码是${NUM_6}"时,templateParas可填写为"[\"369751\"]"
+     * 双变量模板示例:模板内容为"您有${NUM_2}件快递请到${TXT_32}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]"
+     * 查看更多模板格式规范:常见问题>业务规则>短信模板内容审核标准
+     */
+    String templateParas = "[\"369751\"]"; //模板变量
+
+    public static String send (String receiver,String templateParas,Integer type) throws Exception {
+
+        //请求Body,不携带签名名称时,signature请填null
+
+        String body="";
+
+        if(type==1){
+            //验证码类
+            body =buildRequestBody(sender1, receiver, templateId1,templateParas , statusCallBack, signature);
+        }else if(type==2){
+            //通知类
+            body =buildRequestBody(sender2, receiver, templateId2,templateParas , statusCallBack, signature);
+        }
+
+        if (null == body || body.isEmpty()) {
+            System.out.println("body is null.");
+            return null;
+        }
+
+        //请求Headers中的X-WSSE参数值
+        String wsseHeader = buildWsseHeader(appKey, appSecret);
+        if (null == wsseHeader || wsseHeader.isEmpty()) {
+            System.out.println("wsse header is null.");
+            return null;
+        }
+
+        DataOutputStream out = null;
+        BufferedReader in = null;
+        StringBuffer result = new StringBuffer();
+        HttpsURLConnection connection = null;
+        InputStream is = null;
+
+        //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
+        HostnameVerifier hv = new HostnameVerifier() {
+
+            @Override
+            public boolean verify(String hostname, SSLSession session) {
+                return true;
+            }
+        };
+        trustAllHttpsCertificates();
+
+        try {
+            URL realUrl = new URL(url);
+            connection = (HttpsURLConnection) realUrl.openConnection();
+
+            connection.setHostnameVerifier(hv);
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(true);
+            //请求方法
+            connection.setRequestMethod("POST");
+            //请求Headers参数
+            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+            connection.setRequestProperty("Authorization", AUTH_HEADER_VALUE);
+            connection.setRequestProperty("X-WSSE", wsseHeader);
+
+            connection.connect();
+            out = new DataOutputStream(connection.getOutputStream());
+            out.writeBytes(body); //发送请求Body参数
+            out.flush();
+            out.close();
+
+            int status = connection.getResponseCode();
+            if (200 == status) { //200
+                is = connection.getInputStream();
+            } else { //400/401
+                is = connection.getErrorStream();
+            }
+            in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+            String line = "";
+            while ((line = in.readLine()) != null) {
+                result.append(line);
+            }
+            System.out.println(result.toString()); //打印响应消息实体
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (null != out) {
+                    out.close();
+                }
+                if (null != is) {
+                    is.close();
+                }
+                if (null != in) {
+                    in.close();
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return result.toString();
+    }
+
+    /**
+     * 构造请求Body体
+     * @param sender
+     * @param receiver
+     * @param templateId
+     * @param templateParas
+     * @param statusCallBack
+     * @param signature | 签名名称,使用国内短信通用模板时填写
+     * @return
+     */
+    static String buildRequestBody(String sender, String receiver, String templateId, String templateParas,
+                                   String statusCallBack, String signature) {
+        if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty()
+                || templateId.isEmpty()) {
+            System.out.println("buildRequestBody(): sender, receiver or templateId is null.");
+            return null;
+        }
+        Map<String, String> map = new HashMap<String, String>();
+
+        map.put("from", sender);
+        map.put("to", receiver);
+        map.put("templateId", templateId);
+        if (null != templateParas && !templateParas.isEmpty()) {
+            map.put("templateParas", templateParas);
+        }
+        if (null != statusCallBack && !statusCallBack.isEmpty()) {
+            map.put("statusCallback", statusCallBack);
+        }
+        if (null != signature && !signature.isEmpty()) {
+            map.put("signature", signature);
+        }
+
+        StringBuilder sb = new StringBuilder();
+        String temp = "";
+
+        for (String s : map.keySet()) {
+            try {
+                temp = URLEncoder.encode(map.get(s), "UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+            }
+            sb.append(s).append("=").append(temp).append("&");
+        }
+
+        return sb.deleteCharAt(sb.length()-1).toString();
+    }
+
+    /**
+     * 构造X-WSSE参数值
+     * @param appKey
+     * @param appSecret
+     * @return
+     */
+    static String buildWsseHeader(String appKey, String appSecret) {
+        if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) {
+            System.out.println("buildWsseHeader(): appKey or appSecret is null.");
+            return null;
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+        String time = sdf.format(new Date()); //Created
+        String nonce = UUID.randomUUID().toString().replace("-", ""); //Nonce
+
+        MessageDigest md;
+        byte[] passwordDigest = null;
+
+        try {
+            md = MessageDigest.getInstance("SHA-256");
+            md.update((nonce + time + appSecret).getBytes());
+            passwordDigest = md.digest();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+
+        //如果JDK版本是1.8,请加载原生Base64类,并使用如下代码
+        String passwordDigestBase64Str = Base64.getEncoder().encodeToString(passwordDigest); //PasswordDigest
+        //如果JDK版本低于1.8,请加载三方库提供Base64类,并使用如下代码
+        //String passwordDigestBase64Str = Base64.encodeBase64String(passwordDigest); //PasswordDigest
+        //若passwordDigestBase64Str中包含换行符,请执行如下代码进行修正
+        //passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", "");
+        return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time);
+    }
+
+    /**
+     * 忽略证书信任问题
+     * @throws Exception
+     */
+    static void trustAllHttpsCertificates() throws Exception {
+        TrustManager[] trustAllCerts = new TrustManager[] {
+                new X509TrustManager() {
+                    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+                        return;
+                    }
+                    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+                        return;
+                    }
+                    public X509Certificate[] getAcceptedIssuers() {
+                        return null;
+                    }
+                }
+        };
+        SSLContext sc = SSLContext.getInstance("SSL");
+        sc.init(null, trustAllCerts, null);
+        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
+    }
+    /*测试发送短信*/
+    public static void main(String[] args) throws Exception{
+/*
+        //String  res = send("13981969442","[\"123456\"]",1);//验证码测试
+        JSONObject object = new JSONObject("{\"result\":[{\"originTo\":\"13981969442\",\"createTime\":\"2019-08-01T11:23:52Z\",\"from\":\"881907307922\",\"smsMsgId\":\"f9a397a3-8e36-479a-834c-a20a7a466d8c_606422718\",\"status\":\"000000\"}],\"code\":\"000000\",\"description\":\"Success\"}");
+        String code=object.getString("code");
+        //String  res1 = send("13981969442","[\"2017/07/16\",\"成都北\",\"14:30\",\"3\"]",2);//通知类测试  日期格式只能是2017/07/16这种的*/
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/SignUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/SignUtil.java
new file mode 100644
index 0000000..a1078a6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/SignUtil.java
@@ -0,0 +1,119 @@
+package com.stylefeng.guns.modular.system.controller.util;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+/**
+ * 曹操接口请求签名工具包
+ * @author 吕雪
+ * @createDate 2020年01月15日
+ * client_id:f168c651bf86f2c1
+ * sign_key:6d2c6566598949478bef1b5d91451e9f
+ */
+public class SignUtil {
+
+    /**
+     * 获取签名
+     * @param params
+     * @return
+     */
+    public static String sign(Map<String, Object> params){
+        params.put("sign_key", "6d2c6566598949478bef1b5d91451e9f");
+        Map<String, String> needVerify = new HashMap<>();
+        for (Map.Entry<String, Object> entry : params.entrySet()) {
+            needVerify.put(entry.getKey(), String.valueOf(entry.getValue()));
+        }
+        List<Map.Entry<String, String>> entryList = new ArrayList<>(needVerify.entrySet());
+        //排序
+        Collections.sort(entryList, (o1, o2) -> o1.getKey().compareTo(o2.getKey()));
+        StringBuilder buffer = new StringBuilder();
+        for (Map.Entry<String, String> entry : entryList) {
+            buffer.append(entry.getKey()).append(entry.getValue());
+        }
+        System.out.println("sha1 签名参数:"+buffer.toString());
+        try {
+            return encodeBySHA(buffer.toString(),"utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 使用SHA算法加密
+     * @param str
+     * @param charset
+     * @return
+     * @throws Exception
+     */
+    public static String encodeBySHA(String str,String charset) throws Exception {
+        MessageDigest messageDigest = null;
+        try {
+            messageDigest = MessageDigest.getInstance("SHA");
+            messageDigest.reset();
+            messageDigest.update(str.getBytes(charset));
+
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+            throw new Exception("不能调用指定的加密算法。");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+            throw new Exception("字符串不支持"+ charset +"的转换。");
+        }
+        return byteArrayToString(messageDigest.digest());
+    }
+
+    /**
+     * 将byte数组转化为16进制字符串
+     * @param byteArray
+     * @return
+     */
+    private static String byteArrayToString(byte[] byteArray){
+        StringBuilder strBuilder = new StringBuilder();
+        for (int i = 0; i < byteArray.length; i++) {
+            if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
+                strBuilder.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
+            else
+                strBuilder.append(Integer.toHexString(0xFF & byteArray[i]));
+        }
+        return strBuilder.toString();
+    }
+
+    public static void main(String[] args) {
+        //Get
+        /*Long time = new Date().getTime();
+        Map<String, Object> map = new HashMap<>();
+        map.put("client_id","f168c651bf86f2c1");
+        map.put("timestamp",time);
+        map.put("longitude","120.10");
+        map.put("latitude","30.19");
+        String url = "https://sandbox-cop.caocaokeji.cn/v2/common/queryCity";
+        String response = PlatformUtil.doGet(url,"client_id=f168c651bf86f2c1&timestamp="+time+"&sign="+SignUtil.sign(map)+"&longitude=120.10&latitude=30.19",null,100000);
+        com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(response);
+        System.out.println(jsonObject.toJSONString());*/
+        //Post
+       /* Map<String,Object> map = new HashMap<>();
+        map.put("client_id","f168c651bf86f2c1");
+        map.put("timestamp",new Date().getTime());
+        map.put("order_id",1);
+        map.put("score","3");
+        map.put("content","测试数据");
+        map.put("sign",SignUtil.sign(map));
+        String jsonMsg =JSONObject.toJSONString(map);
+        String url = "/v2/common/evaluateOrder";
+        TokenUtil.RequestEntity req = new TokenUtil.RequestEntity();
+        req.setReqMethod(TokenUtil.REQ_METHOD_POST);
+        req.setUri(url);
+        req.setContent(jsonMsg);
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        req.setReqTime(dateFormat.format(new Date()));
+        String response = PlatformUtil.doPostJson1("https://sandbox-cop.caocaokeji.cn"+url,req.getContent(),null);
+        System.out.println(JSONObject.parseObject(response));*/
+
+        System.out.println(new Date().getTime());
+
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/UploadUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/UploadUtil.java
new file mode 100644
index 0000000..467992f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/UploadUtil.java
@@ -0,0 +1,170 @@
+package com.stylefeng.guns.modular.system.controller.util;
+
+import com.stylefeng.guns.config.properties.GunsProperties;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.util.ObsUploadUtil;
+import com.stylefeng.guns.modular.system.util.OssUploadUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 上传文件
+ */
+@RestController
+@RequestMapping("/upload")
+public class UploadUtil extends BaseController {
+    private final static Logger log = LoggerFactory.getLogger(UploadUtil.class);
+
+    @Autowired
+    private GunsProperties gunsProperties;
+
+    /**
+     * 上传图片(上传到项目的webapp/static/img)
+     */
+   /* @RequestMapping("/image")
+    public String image(@RequestPart("file") MultipartFile picture) {
+        String pictureName = UUID.randomUUID().toString() + ".jpg";
+        try {
+            // 文件目录路径
+            String fileSavePath = gunsProperties.getFileUploadPath();
+            picture.transferTo(new File(fileSavePath + pictureName));
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            throw new GunsException(BizExceptionEnum.UPLOAD_ERROR);
+        }
+        return pictureName;
+    }*/
+
+    /**
+     * 多图片上传使用
+     * @param request
+     * @return
+     */
+    @RequestMapping( "/uploadPhoto")
+    @ResponseBody
+    public Map<String, Object> saveimg(HttpServletRequest request) {
+        Map<String, Object> m = new HashMap<>();
+        try {
+
+            String ossUpload = null;
+            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+            MultipartFile file = (MultipartFile) multipartRequest.getFile("myfile");
+            if (file.getSize() != 0) {
+                ossUpload = OssUploadUtil.ossUpload(request, file);
+//                ossUpload = ObsUploadUtil.obsUpload(super.getHttpServletRequest(), file);
+                m.put("imgUrl", ossUpload);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return m;
+    }
+
+    @RequestMapping("/image")
+    @ResponseBody
+    public String image(@RequestPart("file") MultipartFile picture, HttpServletRequest request) {
+        try {
+            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+            MultipartFile file = (MultipartFile) picture;
+            String name = file.getOriginalFilename();
+            String s = name.substring(name.lastIndexOf(".") + 1).toLowerCase();
+            if(!s.equals("jpg") && !s.equals("png") && !s.equals("jpeg")){
+                return null;
+            }
+            long size = file.getSize();
+            if(size > 524288000L){//500M限制
+                return "请上传500M以内的文件";
+            }
+            String pictureName = OssUploadUtil.ossUpload(request, file);
+//            String pictureName = ObsUploadUtil.obsUpload(super.getHttpServletRequest(), picture);
+            return pictureName;
+        } catch (IOException e1) {
+            return null;
+        }
+    }
+
+    /**
+     * 上传文件
+     */
+    @RequestMapping("/file")
+    public String file(@RequestPart("file") MultipartFile picture) {
+        long size = picture.getSize();
+        if(size > 524288000L){//500M限制
+            return "请上传500M以内的文件";
+        }
+        //获取文件名后缀
+        String suffix = picture.getOriginalFilename().substring(picture.getOriginalFilename().lastIndexOf("."));
+        String pictureName = UUID.randomUUID().toString() + suffix;
+        try {
+            // 文件目录路径
+            String fileSavePath = gunsProperties.getFileUploadPath();
+            File file = new File(fileSavePath + pictureName);
+            picture.transferTo(file);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            throw new GunsException(BizExceptionEnum.UPLOAD_ERROR);
+        }
+        return pictureName;
+    }
+
+    /**
+     * UEditor编辑器上传图片
+     */
+    @RequestMapping("/imageUp")
+    public String imageUp(@RequestPart("upfile") MultipartFile picture, HttpServletRequest request) {
+        long size = picture.getSize();
+        if(size > 524288000L){//500M限制
+            return "请上传500M以内的文件";
+        }
+        String callback = request.getParameter("callback");
+        String pictureName = UUID.randomUUID().toString() + ".jpg";
+        try {
+            // 上传文件目录
+            //String fileSavePath = gunsProperties.getFileUploadPath();
+            //picture.transferTo(new File(fileSavePath + pictureName));
+            // 文件全路径
+            //pictureName = gunsProperties.getPictureServerAddress() + pictureName;
+//           pictureName = ObsUploadUtil.obsUpload(super.getHttpServletRequest(), picture);
+
+            String name = picture.getOriginalFilename();
+            String s = name.substring(name.lastIndexOf(".") + 1).toLowerCase();
+            if(!s.equals("jpg") && !s.equals("png") && !s.equals("jpeg")){
+                return null;
+            }
+
+            pictureName = OssUploadUtil.ossUpload(super.getHttpServletRequest(), picture);
+
+            String result = "{'original': '" + picture.getOriginalFilename() + "', 'state': 'SUCCESS', 'url': '" + pictureName + "'}";
+            if (callback == null) {
+                return result;
+            } else {
+                return "<script>" + callback + "(" + result + ")</script>";
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            String result = "{'original': '', 'state': '文件上传失败','url': ''}";
+            if (callback == null) {
+                return result;
+            } else {
+                return "<script>" + callback + "(" + result + ")</script>";
+            }
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/VenueLatVo.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/VenueLatVo.java
new file mode 100644
index 0000000..a7e4d65
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/VenueLatVo.java
@@ -0,0 +1,25 @@
+package com.stylefeng.guns.modular.system.controller.util;
+public class VenueLatVo {
+	private String lat;
+	private String lon;
+	private String sort;
+	public String getLat() {
+		return lat;
+	}
+	public void setLat(String lat) {
+		this.lat = lat;
+	}
+	public String getLon() {
+		return lon;
+	}
+	public void setLon(String lon) {
+		this.lon = lon;
+	}
+	public String getSort() {
+		return sort;
+	}
+	public void setSort(String sort) {
+		this.sort = sort;
+	}
+	
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WoUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WoUtil.java
new file mode 100644
index 0000000..452b4e5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WoUtil.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.controller.util;
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+public class WoUtil {
+    public static Workbook ImportFile(MultipartFile importFile) {
+        Workbook book = null;
+        if(importFile == null)
+        {
+            //throw new WoException(SysConstant.ERR_EXCEL_NULL);
+        }
+        String fileName = importFile.getOriginalFilename();
+        try {
+            if(fileName.endsWith(".xlsx"))    //当表格的后缀是".xlsx时"
+            {
+                book = new XSSFWorkbook(importFile.getInputStream());
+            }else
+            {
+                book = new HSSFWorkbook(importFile.getInputStream());
+            }
+        } catch (IOException e) {
+            //throw new WoException(e,SysConstant.ERR_EXCEL_NO);
+        }
+        return book;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WrapperUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WrapperUtil.java
new file mode 100644
index 0000000..a9955b6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/WrapperUtil.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.controller.util;
+
+import java.util.List;
+
+import org.springframework.stereotype.Controller;
+
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.modular.system.model.User;
+
+/**
+ * 条件查询封装工具类
+ */
+@Controller
+public class WrapperUtil extends BaseController {
+    /**
+     * 封装查询用户ID组
+     */
+    public static Wrapper getWrapperAndInUserId(List<User> list, Wrapper wrapper) {
+        Integer[] ids = new Integer[]{0};
+        if (ids != null && list.size() > 0) {
+            ids = new Integer[list.size()];
+            for (int i = 0; i < list.size(); i++) {
+                ids[i] = list.get(i).getId();
+            }
+        }
+        return wrapper.and().in("userId", ids);
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarInsuranceMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarInsuranceMapper.java
new file mode 100644
index 0000000..df37eea
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarInsuranceMapper.java
@@ -0,0 +1,24 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.CarInsurance;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface CarInsuranceMapper extends BaseMapper<CarInsurance> {
+
+
+    /**
+     * 获取列表数据
+     * @param carId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    List<Map<String, Object>> queryInsuranceList(@Param("carId") Integer carId, @Param("offset") Integer offset,
+                                                 @Param("limit") Integer limit);
+
+    int queryInsuranceListCount(@Param("carId") Integer carId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DeptMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DeptMapper.java
new file mode 100644
index 0000000..c2e34bb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DeptMapper.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.system.dao;
+
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Dept;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 部门表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface DeptMapper extends BaseMapper<Dept> {
+
+    /**
+     * 获取ztree的节点列表
+     */
+    List<ZTreeNode> tree();
+
+    /**
+     * 获取所有部门列表
+     */
+    List<Map<String, Object>> list(@Param("condition") String condition);
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DictMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DictMapper.java
new file mode 100644
index 0000000..55677f1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DictMapper.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Dict;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 字典表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface DictMapper extends BaseMapper<Dict> {
+
+    /**
+     * 根据编码获取词典列表
+     */
+    List<Dict> selectByCode(@Param("code") String code);
+
+    /**
+     * 查询字典列表
+     */
+    List<Map<String, Object>> list(@Param("condition") String conditiion);
+
+    /**
+     * 根据父类编码获取词典列表
+     */
+    List<Dict> selectByParentCode(@Param("code") String code);
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityHistoryMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityHistoryMapper.java
new file mode 100644
index 0000000..1048e8c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityHistoryMapper.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.DriverActivityHistory;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机完成活动记录 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface DriverActivityHistoryMapper extends BaseMapper<DriverActivityHistory> {
+    /**
+     * 获取领取记录列表
+     * @param page
+     * @param activityId
+     * @param type
+     * @return
+     */
+    List<Map<String,Object>> getList(@Param("page") Page<Map<String, Object>> page,@Param("activityId")Integer activityId,@Param("type")Integer type);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityMapper.java
new file mode 100644
index 0000000..18ef074
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityMapper.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.DriverActivity;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机活动主表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface DriverActivityMapper extends BaseMapper<DriverActivity> {
+    List<Map<String,Object>> getList(@Param("page") Page<Map<String, Object>> page,
+                                     @Param("beginTime") String beginTime,
+                                     @Param("endTime") String endTime,
+                                     @Param("name") String name,
+                                     @Param("companyType") Integer companyType,
+                                     @Param("companyId") Integer companyId);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityOnlineMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityOnlineMapper.java
new file mode 100644
index 0000000..12c03f1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityOnlineMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.DriverActivityOnline;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 司机活动-在线 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface DriverActivityOnlineMapper extends BaseMapper<DriverActivityOnline> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityOrderMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityOrderMapper.java
new file mode 100644
index 0000000..4b0b270
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityOrderMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.DriverActivityOrder;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 司机活动-订单 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface DriverActivityOrderMapper extends BaseMapper<DriverActivityOrder> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityRegisteredMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityRegisteredMapper.java
new file mode 100644
index 0000000..bb2c8e2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverActivityRegisteredMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.DriverActivityRegistered;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 司机活动-注册 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface DriverActivityRegisteredMapper extends BaseMapper<DriverActivityRegistered> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverOnlineMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverOnlineMapper.java
new file mode 100644
index 0000000..e099d20
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverOnlineMapper.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.DriverOnline;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface DriverOnlineMapper extends BaseMapper<DriverOnline> {
+
+
+    /**
+     * 获取列表数据
+     * @param name
+     * @param phone
+     * @param offset
+     * @param limit
+     * @return
+     */
+    List<Map<String, Object>> queryOnlineDriver(@Param("name") String name, @Param("phone") String phone,
+                                                @Param("offset") Integer offset, @Param("limit") Integer limit);
+
+
+    int queryOnlineDriverCount(@Param("name") String name, @Param("phone") String phone);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverPunishMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverPunishMapper.java
new file mode 100644
index 0000000..722ba62
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverPunishMapper.java
@@ -0,0 +1,13 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.DriverPunish;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DriverPunishMapper extends BaseMapper<DriverPunish> {
+
+
+    List<DriverPunish> queryAllPunish(@Param("driverId") Integer driverId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverTrainMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverTrainMapper.java
new file mode 100644
index 0000000..3a31cda
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/DriverTrainMapper.java
@@ -0,0 +1,15 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.DriverTrain;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DriverTrainMapper extends BaseMapper<DriverTrain> {
+
+    void deleteByDriverId(@Param("driverId") Integer driverId);
+
+
+    List<DriverTrain> queryAllTrain(@Param("driverId") Integer driverId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/GDInterfaceMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/GDInterfaceMapper.java
new file mode 100644
index 0000000..67bfb34
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/GDInterfaceMapper.java
@@ -0,0 +1,12 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.GDInterface;
+import org.apache.ibatis.annotations.Param;
+
+public interface GDInterfaceMapper extends BaseMapper<GDInterface> {
+
+
+    GDInterface query(@Param("name") String name, @Param("explanation") String explanation,
+                      @Param("time") String time);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IncomeMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IncomeMapper.java
new file mode 100644
index 0000000..e8b8cfa
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/IncomeMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Income;
+
+public interface IncomeMapper extends BaseMapper<Income> {
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftDriverMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftDriverMapper.java
new file mode 100644
index 0000000..ccd953c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LineShiftDriverMapper.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.LineShiftDriver;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface LineShiftDriverMapper extends BaseMapper<LineShiftDriver> {
+
+    /**
+     * 获取预约数据
+     * @param lineShiftId
+     * @param driverId
+     * @param time
+     * @return
+     */
+    List<LineShiftDriver> query(@Param("lineShiftId") Integer lineShiftId, @Param("driverId") Integer driverId,
+                                @Param("time") Date time) ;
+
+
+    /**
+     * 获取没有预约给定日期班次的司机
+     * @param lineShiftId
+     * @param time
+     * @return
+     */
+    List<Map<String, Object>> queryNotInLineShiftDriver(@Param("lineShiftId") Integer lineShiftId, @Param("time") Date time);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LoginLogMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LoginLogMapper.java
new file mode 100644
index 0000000..2e55025
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/LoginLogMapper.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 登录记录 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface LoginLogMapper extends BaseMapper<LoginLog> {
+
+    /**
+     * 获取登录日志
+     */
+    List<Map<String, Object>> getLoginLogs(@Param("page") Page<LoginLog> page, @Param("beginTime") String beginTime,
+                                           @Param("endTime") String endTime, @Param("logName") String logName, @Param("orderByField") String orderByField, @Param("isAsc") boolean isAsc);
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/MenuMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/MenuMapper.java
new file mode 100644
index 0000000..ea0232d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/MenuMapper.java
@@ -0,0 +1,80 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.core.node.MenuNode;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Menu;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+  * 菜单表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface MenuMapper extends BaseMapper<Menu> {
+
+    /**
+     * 根据条件查询菜单
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Map<String, Object>> selectMenus(@Param("condition") String condition, @Param("level") String level);
+
+    /**
+     * 根据条件查询菜单
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Long> getMenuIdsByRoleId(@Param("roleId") Integer roleId);
+
+    /**
+     * 获取菜单列表树
+     *
+     * @return
+     * @date 2017年2月19日 下午1:33:51
+     */
+    List<ZTreeNode> menuTreeList();
+
+    /**
+     * 获取菜单列表树
+     *
+     * @return
+     * @date 2017年2月19日 下午1:33:51
+     */
+    List<ZTreeNode> menuTreeListByMenuIds(List<Long> menuIds);
+
+    /**
+     * 删除menu关联的relation
+     *
+     * @param menuId
+     * @return
+     * @date 2017年2月19日 下午4:10:59
+     */
+    int deleteRelationByMenu(Long menuId);
+
+    /**
+     * 获取资源url通过角色id
+     *
+     * @param roleId
+     * @return
+     * @date 2017年2月19日 下午7:12:38
+     */
+    List<String> getResUrlsByRoleId(Integer roleId);
+
+    /**
+     * 根据角色获取菜单
+     *
+     * @param roleIds
+     * @return
+     * @date 2017年2月19日 下午10:35:40
+     */
+    List<MenuNode> getMenusByRoleIds(List<Integer> roleIds);
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/NoticeMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/NoticeMapper.java
new file mode 100644
index 0000000..5638129
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/NoticeMapper.java
@@ -0,0 +1,25 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Notice;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 通知表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface NoticeMapper extends BaseMapper<Notice> {
+
+    /**
+     * 获取通知列表
+     */
+    List<Map<String, Object>> list(@Param("condition") String condition);
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OperationLogMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OperationLogMapper.java
new file mode 100644
index 0000000..eaf5760
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OperationLogMapper.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 操作日志 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface OperationLogMapper extends BaseMapper<OperationLog> {
+
+    /**
+     * 获取操作日志
+     */
+    List<Map<String, Object>> getOperationLogs(@Param("page") Page<OperationLog> page, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("logName") String logName, @Param("logType") String logType, @Param("orderByField") String orderByField, @Param("isAsc") boolean isAsc);
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.java
new file mode 100644
index 0000000..eead6f5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/OrderCancelMapper.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.OrderCancel;
+import org.apache.ibatis.annotations.Param;
+
+public interface OrderCancelMapper extends BaseMapper<OrderCancel> {
+
+
+    /**
+     * 获取数据
+     * @param orderId
+     * @param orderType
+     * @param money
+     * @param payType
+     * @param state
+     * @return
+     */
+    OrderCancel query(@Param("orderId") Integer orderId, @Param("orderType") Integer orderType,
+                      @Param("money") Double money, @Param("payType") Integer payType,
+                      @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PaymentRecordMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PaymentRecordMapper.java
new file mode 100644
index 0000000..4271c79
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/PaymentRecordMapper.java
@@ -0,0 +1,23 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.PaymentRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface PaymentRecordMapper extends BaseMapper<PaymentRecord> {
+
+
+    /**
+     * 获取数据
+     * @param orderId
+     * @param payType
+     * @param state
+     * @return
+     */
+    List<PaymentRecord> query(@Param("category") Integer category, @Param("userId") Integer userId,
+               @Param("type") Integer type, @Param("orderId") Integer orderId,
+               @Param("orderType") Integer orderType, @Param("payType") Integer payType,
+               @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.java
new file mode 100644
index 0000000..4150d63
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RegionMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.Region;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 省市区三级联动 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2019-12-30
+ */
+public interface RegionMapper extends BaseMapper<Region> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RelationMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RelationMapper.java
new file mode 100644
index 0000000..828a596
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RelationMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.Relation;
+
+/**
+ * <p>
+  * 角色和菜单关联表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface RelationMapper extends BaseMapper<Relation> {
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RoleMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RoleMapper.java
new file mode 100644
index 0000000..d95d87f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/RoleMapper.java
@@ -0,0 +1,53 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Role;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+  * 角色表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface RoleMapper extends BaseMapper<Role> {
+
+    /**
+     * 根据条件查询角色列表
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Map<String, Object>> selectRoles(@Param("condition") String condition);
+
+    /**
+     * 删除某个角色的所有权限
+     *
+     * @param roleId 角色id
+     * @return
+     * @date 2017年2月13日 下午7:57:51
+     */
+    int deleteRolesById(@Param("roleId") Integer roleId);
+
+    /**
+     * 获取角色列表树
+     *
+     * @return
+     * @date 2017年2月18日 上午10:32:04
+     */
+    List<ZTreeNode> roleTreeList();
+
+    /**
+     * 获取角色列表树
+     *
+     * @return
+     * @date 2017年2月18日 上午10:32:04
+     */
+    List<ZTreeNode> roleTreeListByRoleId(String[] roleId);
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponActivityMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponActivityMapper.java
new file mode 100644
index 0000000..6f9f61e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponActivityMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.SysCouponActivity;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 系统设置-优惠券活动 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface SysCouponActivityMapper extends BaseMapper<SysCouponActivity> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponRecordMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponRecordMapper.java
new file mode 100644
index 0000000..9f88de1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysCouponRecordMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.SysCouponRecord;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 系统设置-优惠券记录 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-15
+ */
+public interface SysCouponRecordMapper extends BaseMapper<SysCouponRecord> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysRedPacketRecordMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysRedPacketRecordMapper.java
new file mode 100644
index 0000000..6178336
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysRedPacketRecordMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.SysRedPacketRecord;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 系统设置-红包记录 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-13
+ */
+public interface SysRedPacketRecordMapper extends BaseMapper<SysRedPacketRecord> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAdvertisementMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAdvertisementMapper.java
new file mode 100644
index 0000000..cafb7b3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAdvertisementMapper.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TAdvertisement;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 广告 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+public interface TAdvertisementMapper extends BaseMapper<TAdvertisement> {
+
+    /**
+     * 根据条件查询广告列表
+     * @param page      分页
+     * @param beginTime 开始时间
+     * @param endTime   结束时间
+     * @param type      类型
+     * @param name      名称
+     * @return
+     */
+    List<Map<String,Object>> getAdvertisementList(@Param("page") Page<Map<String, Object>> page,
+                                         @Param("beginTime") String beginTime,
+                                         @Param("endTime") String endTime,
+                                         @Param("type") Integer type,
+                                         @Param("name") String name);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAgreementMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAgreementMapper.java
new file mode 100644
index 0000000..4c0260d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TAgreementMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TAgreement;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 平台协议 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-01
+ */
+public interface TAgreementMapper extends BaseMapper<TAgreement> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarBrandMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarBrandMapper.java
new file mode 100644
index 0000000..32f56ea
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarBrandMapper.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCarBrand;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 车辆品牌 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface TCarBrandMapper extends BaseMapper<TCarBrand> {
+
+    /**
+     * 根据条件查询车辆品牌列表
+     * @return
+     */
+    List<Map<String,Object>> getCarBrandList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("name") String name);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarMapper.java
new file mode 100644
index 0000000..c584ed2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarMapper.java
@@ -0,0 +1,47 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCar;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 车辆 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface TCarMapper extends BaseMapper<TCar> {
+
+    /**
+     * 根据条件查询车辆列表
+     * @param page
+     * @return
+     */
+    List<Map<String,Object>> getCarList(@Param("page") Page<Map<String, Object>> page,
+                                           @Param("roleType") Integer roleType,
+                                           @Param("nowUserId") Integer nowUserId,
+                                           @Param("beginTime") String beginTime,
+                                           @Param("endTime") String endTime,
+                                           @Param("id") String id,
+                                           @Param("brandName") String brandName,
+                                           @Param("modelName") String modelName,
+                                           @Param("carColor") String carColor,
+                                           @Param("serverStr") String serverStr,
+                                           @Param("carLicensePlate") String carLicensePlate,
+                                           @Param("driverName") String driverName,
+                                           @Param("companyName") String companyName,
+                                           @Param("franchiseeName") String franchiseeName);
+
+    /**
+     * 根据条件查询车辆列表不分页
+     * @return
+     */
+    List<Map<String,Object>> getCarListNoPage(@Param("roleType") Integer roleType,
+                                              @Param("nowUserId") Integer nowUserId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarModelMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarModelMapper.java
new file mode 100644
index 0000000..a226df6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarModelMapper.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCarModel;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 车辆车型 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface TCarModelMapper extends BaseMapper<TCarModel> {
+
+    /**
+     * 根据条件查询车辆车型列表
+     * @return
+     */
+    List<Map<String,Object>> getCarModelList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("name") String name);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarServiceMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarServiceMapper.java
new file mode 100644
index 0000000..79cc9e8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCarServiceMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TCarService;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 车辆经营业务 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface TCarServiceMapper extends BaseMapper<TCarService> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCompanyCityMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCompanyCityMapper.java
new file mode 100644
index 0000000..ef7d90b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCompanyCityMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TCompanyCity;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 公司经营地区 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-06
+ */
+public interface TCompanyCityMapper extends BaseMapper<TCompanyCity> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCompanyMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCompanyMapper.java
new file mode 100644
index 0000000..335d3bf
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TCompanyMapper.java
@@ -0,0 +1,77 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCompany;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 公司信息表 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-06
+ */
+public interface TCompanyMapper extends BaseMapper<TCompany> {
+
+    /**
+     * 根据条件查询分公司列表
+     * @return
+     */
+    List<Map<String,Object>> getCompanyList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("name") String name,
+                                             @Param("principalName") String principalName,
+                                             @Param("principalPhone") String principalPhone,
+                                             @Param("adminName") String adminName,
+                                             @Param("adminPhone") String adminPhone,
+                                             @Param("serviceStr") String serviceStr,
+                                             @Param("state") Integer state);
+
+    /**
+     * 根据公司ID获取公司经营区域
+     * @param id
+     * @return
+     */
+    List<Map<String,Object>> getCompanyScopeById(@Param("id") Integer id);
+
+    /**
+     * 根据条件查询加盟商列表
+     * @return
+     */
+    List<Map<String,Object>> getFranchiseeList(@Param("page") Page<Map<String, Object>> page,
+                                            @Param("beginTime") String beginTime,
+                                            @Param("endTime") String endTime,
+                                            @Param("name") String name,
+                                            @Param("account") String account,
+                                            @Param("principalName") String principalName,
+                                            @Param("principalPhone") String principalPhone,
+                                            @Param("serviceStr") String serviceStr,
+                                            @Param("state") Integer state,
+                                            @Param("roleType") Integer roleType,
+                                            @Param("nowUserId") Integer nowUserId);
+
+
+    /**
+     * 获取运营汇总数据
+     * @param type
+     * @param start
+     * @param end
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    List<Map<String, Object>> queryOperationalData(@Param("type") Integer type, @Param("start") String start,
+                                                   @Param("end") String end, @Param("companyId") Integer companyId,
+                                                   @Param("offset") Integer offset, @Param("limit") Integer limit);
+
+
+    int queryOperationalDataCount(@Param("type") Integer type, @Param("start") String start,
+                                  @Param("end") String end, @Param("companyId") Integer companyId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TComplaintMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TComplaintMapper.java
new file mode 100644
index 0000000..bca3029
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TComplaintMapper.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TComplaint;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 投诉管理 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TComplaintMapper extends BaseMapper<TComplaint> {
+
+    /**
+     * 根据条件查询投诉列表
+     * @return
+     */
+    List<Map<String,Object>> getComplaintList(@Param("page") Page<Map<String, Object>> page,
+                                              @Param("roleType") Integer roleType,
+                                              @Param("nowUserId") Integer nowUserId,
+                                              @Param("beginTime") String beginTime,
+                                              @Param("endTime") String endTime,
+                                              @Param("userName") String userName,
+                                              @Param("userPhone") String userPhone,
+                                              @Param("driverPhone") String driverPhone,
+                                              @Param("isHandle") Integer isHandle);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDispatchMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDispatchMapper.java
new file mode 100644
index 0000000..9b89fdd
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDispatchMapper.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TDispatch;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 调度管理 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-01
+ */
+public interface TDispatchMapper extends BaseMapper<TDispatch> {
+
+    /**
+     * 根据条件查询调度列表
+     * @return
+     */
+    List<Map<String,Object>> getDispatchList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("roleType") Integer roleType,
+                                             @Param("nowUserId") Integer nowUserId,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("name") String name,
+                                             @Param("companyName") String companyName,
+                                             @Param("franchiseeName") String franchiseeName,
+                                             @Param("account") String account,
+                                             @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverLineMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverLineMapper.java
new file mode 100644
index 0000000..0811c05
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverLineMapper.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TDriverLine;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机关联线路 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface TDriverLineMapper extends BaseMapper<TDriverLine> {
+
+    /**
+     * 根据司机ID查询司机关联线路列表
+     * @param driverId
+     * @return
+     */
+    List<Map<String,Object>> getDriverLineListByDriverId(@Param("driverId") Integer driverId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverMapper.java
new file mode 100644
index 0000000..792fb27
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverMapper.java
@@ -0,0 +1,94 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TDriver;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机表 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-04
+ */
+public interface TDriverMapper extends BaseMapper<TDriver> {
+
+    /**
+     * 根据条件查询待审核司机列表
+     * @return
+     */
+    List<Map<String,Object>> getAuthDriverList(@Param("page") Page<Map<String, Object>> page,
+                                         @Param("beginTime") String beginTime,
+                                         @Param("endTime") String endTime,
+                                         @Param("companyName") String companyName,
+                                         @Param("phone") String phone,
+                                         @Param("account") String account,
+                                         @Param("addType") Integer addType,
+                                         @Param("authState") Integer authState);
+
+    /**
+     * 根据用户ID获取用户详情
+     * @param driverId
+     * @return
+     */
+    Map<String,Object> getDriverById(@Param("driverId") Integer driverId);
+
+    /**
+     * 根据审核通过的司机列表
+     * @return
+     */
+    List<Map<String,Object>> getDriverList(@Param("page") Page<Map<String, Object>> page,
+                                               @Param("roleType") Integer roleType,
+                                               @Param("nowUserId") Integer nowUserId,
+                                               @Param("beginTime") String beginTime,
+                                               @Param("endTime") String endTime,
+                                               @Param("companyName") String companyName,
+                                               @Param("phone") String phone,
+                                               @Param("name") String name,
+                                               @Param("addType") Integer addType,
+                                               @Param("authState") Integer authState);
+
+    /**
+     * 查询已被使用的车辆ID
+     * @return
+     */
+    String getUseCarIdStr(@Param("carId") Integer carId);
+
+    /**
+     * 查询当前可被选择的车辆列表
+     * @return
+     */
+    List<Map<String,Object>> getCanSelectCarList(@Param("page") Page<Map<String, Object>> page,
+                                           @Param("roleType") Integer roleType,
+                                           @Param("nowUserId") Integer nowUserId,
+                                           @Param("carIdStr") String carIdStr,
+                                           @Param("carLicensePlate") String carLicensePlate,
+                                           @Param("brandName") String brandName,
+                                           @Param("modelName") String modelName,
+                                           @Param("color") String color,
+                                           @Param("serverStr") String serverStr);
+
+    /**
+     * 修改分公司司机的状态
+     */
+    void updateCompanyDriverState( @Param("authState") Integer authState, @Param("companyId") Integer companyId);
+
+    /**
+     * 修改加盟商司机的状态
+     */
+    void updateFranchiseeDriverState( @Param("authState") Integer authState, @Param("franchiseeId") Integer franchiseeId);
+
+    /**
+     * 根据审核通过的司机列表无分页
+     * @return
+     * @return
+     */
+    List<Map<String,Object>> getDriverListNoPage(@Param("roleType") Integer roleType,
+                                                 @Param("nowUserId") Integer nowUserId);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverServiceMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverServiceMapper.java
new file mode 100644
index 0000000..59b21b5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverServiceMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TDriverService;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 司机经营业务 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface TDriverServiceMapper extends BaseMapper<TDriverService> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TFeedbackMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TFeedbackMapper.java
new file mode 100644
index 0000000..6b62168
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TFeedbackMapper.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TFeedback;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 反馈管理 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+public interface TFeedbackMapper extends BaseMapper<TFeedback> {
+
+    /**
+     * 根据条件查询用反馈记录列表
+     * @return
+     */
+    List<Map<String,Object>> getFeedbackList(@Param("page") Page<Map<String, Object>> page,
+                                            @Param("beginTime") String beginTime,
+                                            @Param("endTime") String endTime,
+                                            @Param("type") Integer type,
+                                            @Param("name") String name,
+                                            @Param("phone") String phone,
+                                            @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TIntegralGoodsMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TIntegralGoodsMapper.java
new file mode 100644
index 0000000..4c2bdff
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TIntegralGoodsMapper.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TIntegralGoods;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 积分商品管理 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+public interface TIntegralGoodsMapper extends BaseMapper<TIntegralGoods> {
+
+    /**
+     * 根据条件查询积分商品列表
+     * @return
+     */
+    List<Map<String,Object>> getIntegralGoodsList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("name") String name,
+                                                  @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TIntegralOrderMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TIntegralOrderMapper.java
new file mode 100644
index 0000000..3f53c5d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TIntegralOrderMapper.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TIntegralOrder;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 积分订单管理 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+public interface TIntegralOrderMapper extends BaseMapper<TIntegralOrder> {
+
+    /**
+     * 根据条件查询兑换订单列表
+     * @return
+     */
+    List<Map<String,Object>> getIntegralOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("userName") String userName,
+                                                  @Param("goodsName") String goodsName,
+                                                  @Param("consigneeName") String consigneeName,
+                                                  @Param("consigneePhone") String consigneePhone,
+                                                  @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TInvoiceMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TInvoiceMapper.java
new file mode 100644
index 0000000..56d2a37
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TInvoiceMapper.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TInvoice;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 发票 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TInvoiceMapper extends BaseMapper<TInvoice> {
+
+    /**
+     * 根据条件查询用开发票记录列表
+     * @return
+     */
+    List<Map<String,Object>> getInvoiceList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("email") String email,
+                                             @Param("name") String name,
+                                             @Param("type") Integer type,
+                                             @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineCompanyMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineCompanyMapper.java
new file mode 100644
index 0000000..d0c1379
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineCompanyMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TLineCompany;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 企业-线路关系表 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface TLineCompanyMapper extends BaseMapper<TLineCompany> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineMapper.java
new file mode 100644
index 0000000..8108a00
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineMapper.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TLine;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 跨城线路 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-15
+ */
+public interface TLineMapper extends BaseMapper<TLine> {
+
+    /**
+     * 根据条件查询线路列表
+     * @return
+     */
+    List<Map<String,Object>> getLineList(@Param("page") Page<Map<String, Object>> page,
+                                         @Param("beginTime") String beginTime,
+                                         @Param("endTime") String endTime,
+                                         @Param("name") String name,
+                                         @Param("insertUser") String insertUser,
+                                         @Param("modelStr") String modelStr,
+                                         @Param("state") Integer state);
+
+    /**
+     * 根据线路ID查询线路价格
+     * @param lineId
+     * @return
+     */
+    List<Map<String,Object>> getLinePriceList(@Param("lineId") Integer lineId);
+
+    /**
+     * 根据线路ID查询线路已分配公司
+     * @param lineId
+     * @return
+     */
+    List<Map<String,Object>> getLineCompanyList(@Param("lineId") Integer lineId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLinePriceMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLinePriceMapper.java
new file mode 100644
index 0000000..9843888
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLinePriceMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TLinePrice;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 跨城线路价格规则 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface TLinePriceMapper extends BaseMapper<TLinePrice> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineShiftMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineShiftMapper.java
new file mode 100644
index 0000000..9f70007
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineShiftMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TLineShift;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 线路班次 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface TLineShiftMapper extends BaseMapper<TLineShift> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineSiteMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineSiteMapper.java
new file mode 100644
index 0000000..03ab4f0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLineSiteMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TLineSite;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 线路-站点关系表 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface TLineSiteMapper extends BaseMapper<TLineSite> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLocationMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLocationMapper.java
new file mode 100644
index 0000000..646dc48
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TLocationMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TLocation;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 地点 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-04
+ */
+public interface TLocationMapper extends BaseMapper<TLocation> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TNoticesMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TNoticesMapper.java
new file mode 100644
index 0000000..eaadfa2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TNoticesMapper.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TNotices;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 发布公告和滚动消息 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+public interface TNoticesMapper extends BaseMapper<TNotices> {
+
+    /**
+     * 根据条件查询滚动消息列表
+     * @return
+     */
+    List<Map<String,Object>> getRollingNoticeList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("typeValue") Integer typeValue,
+                                             @Param("content") String content);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCityBusinessMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCityBusinessMapper.java
new file mode 100644
index 0000000..21f3cac
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCityBusinessMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TOpenCityBusiness;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 开通城市经营业务 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+public interface TOpenCityBusinessMapper extends BaseMapper<TOpenCityBusiness> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCityMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCityMapper.java
new file mode 100644
index 0000000..f61ed6a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCityMapper.java
@@ -0,0 +1,40 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOpenCity;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 开通城市表 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+public interface TOpenCityMapper extends BaseMapper<TOpenCity> {
+
+    /**
+     * 根据条件查询开通城市列表
+     * @param page      分页
+     * @param beginTime 开始时间
+     * @param endTime   结束时间
+     * @param condition 省/市/区
+     * @return
+     */
+    List<Map<String,Object>> getOpenCityList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("condition") String condition);
+
+    /**
+     * 根据城市ID获取经营业务
+     * @param openCityId
+     * @return
+     */
+    List<Map<String,Object>> getBusinessByCityId(@Param("openCityId") Integer openCityId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCharterMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCharterMapper.java
new file mode 100644
index 0000000..7d6b8f9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCharterMapper.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderCharter;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 包车订单 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+public interface TOrderCharterMapper extends BaseMapper<TOrderCharter> {
+
+    /**
+     * 根据条件查询包车订单列表
+     * @return
+     */
+    List<Map<String,Object>> getCharterOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                 @Param("beginTime") String beginTime,
+                                                 @Param("endTime") String endTime,
+                                                 @Param("userName") String userName,
+                                                 @Param("contactName") String contactName,
+                                                 @Param("contactPhone") String contactPhone,
+                                                 @Param("useDemand") String useDemand,
+                                                 @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCharteredCarMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCharteredCarMapper.java
new file mode 100644
index 0000000..98e9162
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCharteredCarMapper.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderCharteredCar;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-包车 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-24
+ */
+public interface TOrderCharteredCarMapper extends BaseMapper<TOrderCharteredCar> {
+
+    /**
+     * 根据条件查询包车订单列表
+     * @return
+     */
+    List<Map<String,Object>> getCharterCarOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                    @Param("beginTime") String beginTime,
+                                                    @Param("endTime") String endTime,
+                                                    @Param("userName") String userName,
+                                                    @Param("contactPerson") String contactPerson,
+                                                    @Param("contactPhone") String contactPhone,
+                                                    @Param("modelUse") String modelUse,
+                                                    @Param("state") Integer state,
+                                                    @Param("roleType") Integer roleType,
+                                                    @Param("nowUserId") Integer nowUserId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCrossCityMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCrossCityMapper.java
new file mode 100644
index 0000000..ab327bb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderCrossCityMapper.java
@@ -0,0 +1,51 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderCrossCity;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-跨城 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface TOrderCrossCityMapper extends BaseMapper<TOrderCrossCity> {
+
+    /**
+     * 根据条件查询跨城出行订单列表
+     * @return
+     */
+    List<Map<String,Object>> getCrossCityOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                   @Param("beginTime") String beginTime,
+                                                   @Param("endTime") String endTime,
+                                                   @Param("roleType") Integer roleType,
+                                                   @Param("nowUserId") Integer nowUserId,
+                                                   @Param("orderNum") String orderNum,
+                                                   @Param("orderSource") Integer orderSource,
+                                                   @Param("userName") String userName,
+                                                   @Param("userPhone") String userPhone,
+                                                   @Param("passengers") String passengers,
+                                                   @Param("passengersPhone") String passengersPhone,
+                                                   @Param("serverCarModelId") Integer serverCarModelId,
+                                                   @Param("driver") String driver,
+                                                   @Param("lineId") Integer lineId,
+                                                   @Param("state") Integer state);
+
+    /**
+     * 根据跨城出行订单ID获取跨城出行订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String,Object> getCrossCityOrderDetailById(@Param("orderId") Integer orderId);
+
+
+    List<TOrderCrossCity> queryOrders(@Param("driverId") Integer driverId, @Param("lineShiftDriverId") Integer lineShiftDriverId,
+                                     @Param("state") List<Integer> state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderEvaluateMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderEvaluateMapper.java
new file mode 100644
index 0000000..a620ca4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderEvaluateMapper.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderEvaluate;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单评价 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TOrderEvaluateMapper extends BaseMapper<TOrderEvaluate> {
+
+    /**
+     * 根据条件查询评价列表
+     * @return
+     */
+    List<Map<String,Object>> getOrderEvaluateList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("roleType") Integer roleType,
+                                                  @Param("nowUserId") Integer nowUserId,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("userName") String userName,
+                                                  @Param("userPhone") String userPhone,
+                                                  @Param("driverName") String driverName,
+                                                  @Param("driverPhone") String driverPhone,
+                                                  @Param("fraction") String fraction,
+                                                  @Param("orderType") Integer orderType);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderLogisticsMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderLogisticsMapper.java
new file mode 100644
index 0000000..87b3e7d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderLogisticsMapper.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderLogistics;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-小件物流 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-24
+ */
+public interface TOrderLogisticsMapper extends BaseMapper<TOrderLogistics> {
+
+    /**
+     * 根据条件查询小件物流订单列表
+     * @return
+     */
+    List<Map<String,Object>> getLogisticsOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                    @Param("beginTime") String beginTime,
+                                                    @Param("endTime") String endTime,
+                                                    @Param("roleType") Integer roleType,
+                                                    @Param("nowUserId") Integer nowUserId,
+                                                    @Param("orderNum") String orderNum,
+                                                    @Param("orderSource") Integer orderSource,
+                                                    @Param("type") Integer type,
+                                                    @Param("userName") String userName,
+                                                    @Param("userPhone") String userPhone,
+                                                    @Param("recipient") String recipient,
+                                                    @Param("recipientPhone") String recipientPhone,
+                                                    @Param("driver") String driver,
+                                                    @Param("state") Integer state);
+
+    /**
+     * 根据专车订单ID获取小件物流订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String,Object> getLogisticsOrderDetailById(@Param("orderId") Integer orderId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPositionMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPositionMapper.java
new file mode 100644
index 0000000..9cfe41c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPositionMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TOrderPosition;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 订单坐标信息表 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-08
+ */
+public interface TOrderPositionMapper extends BaseMapper<TOrderPosition> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java
new file mode 100644
index 0000000..96b324d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderPrivateCar;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-专车 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+public interface TOrderPrivateCarMapper extends BaseMapper<TOrderPrivateCar> {
+
+    /**
+     * 根据条件查询专车订单列表
+     * @return
+     */
+    List<Map<String,Object>> getPrivateCarOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                    @Param("beginTime") String beginTime,
+                                                    @Param("endTime") String endTime,
+                                                    @Param("roleType") Integer roleType,
+                                                    @Param("nowUserId") Integer nowUserId,
+                                                    @Param("orderNum") String orderNum,
+                                                    @Param("orderSource") Integer orderSource,
+                                                    @Param("userName") String userName,
+                                                    @Param("userPhone") String userPhone,
+                                                    @Param("passengers") String passengers,
+                                                    @Param("passengersPhone") String passengersPhone,
+                                                    @Param("serverCarModelId") Integer serverCarModelId,
+                                                    @Param("driver") String driver,
+                                                    @Param("state") Integer state);
+
+    /**
+     * 根据专车订单ID获取专车订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String,Object> getPrivateCarOrderDetailById(@Param("orderId") Integer orderId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTaxiMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTaxiMapper.java
new file mode 100644
index 0000000..41c9a48
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTaxiMapper.java
@@ -0,0 +1,79 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderTaxi;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-出租车 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-08
+ */
+public interface TOrderTaxiMapper extends BaseMapper<TOrderTaxi> {
+
+    /**
+     * 根据条件查询出租车订单列表
+     * @return
+     */
+    List<Map<String,Object>> getTaxiOrderList(@Param("page") Page<Map<String, Object>> page,
+                                               @Param("beginTime") String beginTime,
+                                               @Param("endTime") String endTime,
+                                              @Param("roleType") Integer roleType,
+                                              @Param("nowUserId") Integer nowUserId,
+                                               @Param("orderNum") String orderNum,
+                                               @Param("orderSource") Integer orderSource,
+                                               @Param("userName") String userName,
+                                               @Param("userPhone") String userPhone,
+                                               @Param("passengers") String passengers,
+                                               @Param("passengersPhone") String passengersPhone,
+                                               @Param("driver") String driver,
+                                               @Param("state") Integer state);
+
+    /**
+     * 根据出租车订单ID获取出租车订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String,Object> getTaxiOrderDetailById(@Param("orderId") Integer orderId);
+
+    /**
+     * 根据条件查询可被选择的出租车司机列表
+     * @return
+     */
+    List<Map<String,Object>> getCanSelectTaxiDriverList(@Param("page") Page<Map<String, Object>> page,
+                                                        @Param("companyId") Integer companyId,
+                                                        @Param("name") String name,
+                                                        @Param("phone") String phone);
+
+    /**
+     * 查询所有订单条数
+     * @param companyId
+     * @return
+     */
+    Integer getAllOrderNum(@Param("companyId") Integer companyId,@Param("beginTime") String beginTime,@Param("endTime") String endTime);
+
+    /**
+     * 查询所有总交易金额
+     * @param companyId
+     * @param beginTime
+     * @param endTime
+     * @return
+     */
+    Double getAllTradeMoney(@Param("companyId") Integer companyId,@Param("beginTime") String beginTime,@Param("endTime") String endTime);
+
+    /**
+     * 查询所有总收益
+     * @param companyId
+     * @param beginTime
+     * @param endTime
+     * @return
+     */
+    Double getAllIncomeMoney(@Param("companyId") Integer companyId,@Param("beginTime") String beginTime,@Param("endTime") String endTime);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPhoneMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPhoneMapper.java
new file mode 100644
index 0000000..ac62edf
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPhoneMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TPhone;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 系统电话设置 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TPhoneMapper extends BaseMapper<TPhone> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TProblemMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TProblemMapper.java
new file mode 100644
index 0000000..25e5818
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TProblemMapper.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TProblem;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 在线客服 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-24
+ */
+public interface TProblemMapper extends BaseMapper<TProblem> {
+
+    /**
+     * 根据条件查询用户留言列表
+     * @return
+     */
+    List<Map<String,Object>> getProblemList(@Param("page") Page<Map<String, Object>> page,
+                                            @Param("beginTime") String beginTime,
+                                            @Param("endTime") String endTime,
+                                            @Param("userName") String userName,
+                                            @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPubTransactionDetailsMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPubTransactionDetailsMapper.java
new file mode 100644
index 0000000..ff941ff
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPubTransactionDetailsMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TPubTransactionDetails;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 交易明细(司机/用户) Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface TPubTransactionDetailsMapper extends BaseMapper<TPubTransactionDetails> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPubWithdrawalMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPubWithdrawalMapper.java
new file mode 100644
index 0000000..d9a1f4d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TPubWithdrawalMapper.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TPubWithdrawal;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 提现记录表(司机/用户) Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TPubWithdrawalMapper extends BaseMapper<TPubWithdrawal> {
+
+    /**
+     * 根据条件查询提现列表
+     * @return
+     */
+    List<Map<String,Object>> getWithdrawalList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("name") String name,
+                                             @Param("withdrawalType") Integer withdrawalType);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java
new file mode 100644
index 0000000..658c15a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java
@@ -0,0 +1,107 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TReassign;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单改派 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-03
+ */
+public interface TReassignMapper extends BaseMapper<TReassign> {
+
+    /**
+     * 根据条件查询专车改派订单列表
+     */
+    List<Map<String,Object>> getPrivateCarReassignOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                            @Param("roleType") Integer roleType,
+                                                            @Param("nowUserId") Integer nowUserId,
+                                                            @Param("beginTime") String beginTime,
+                                                            @Param("endTime") String endTime,
+                                                            @Param("originalDriverName") String originalDriverName,
+                                                            @Param("originalDriverPhone") String originalDriverPhone,
+                                                            @Param("orderNum") String orderNum,
+                                                            @Param("nowDriverName") String nowDriverName,
+                                                            @Param("nowDriverPhone") String nowDriverPhone,
+                                                            @Param("orderState") Integer orderState,
+                                                            @Param("state") Integer state);
+
+
+    /**
+     * 根据条件查询可被选择的专车司机列表
+     * @return
+     */
+    List<Map<String,Object>> getCanSelectPrivateCarDriverList(@Param("page") Page<Map<String, Object>> page,
+                                                              @Param("companyId") Integer companyId,
+                                                              @Param("name") String name,
+                                                              @Param("phone") String phone);
+
+
+
+    /**
+     * 根据条件查询可被选择的专车司机列表
+     * @return
+     */
+    List<Map<String,Object>> getCanSelectSmallDriverList(@Param("page") Page<Map<String, Object>> page,
+                                                         @Param("companyId") Integer companyId,
+                                                         @Param("type") Integer type,
+                                                         @Param("name") String name,
+                                                         @Param("phone") String phone);
+
+    /**
+     * 根据条件查询跨城改派订单列表
+     */
+    List<Map<String,Object>> getCrossReassignOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                       @Param("roleType") Integer roleType,
+                                                       @Param("nowUserId") Integer nowUserId,
+                                                       @Param("beginTime") String beginTime,
+                                                       @Param("endTime") String endTime,
+                                                       @Param("originalDriverName") String originalDriverName,
+                                                       @Param("originalDriverPhone") String originalDriverPhone,
+                                                       @Param("orderNum") String orderNum,
+                                                       @Param("nowDriverName") String nowDriverName,
+                                                       @Param("nowDriverPhone") String nowDriverPhone,
+                                                       @Param("orderState") Integer orderState,
+                                                       @Param("state") Integer state);
+
+
+    /**
+     * 根据条件查询跨城改派订单列表
+     */
+    List<Map<String,Object>> getSmallPieceLogisticsList(@Param("page") Page<Map<String, Object>> page,
+                                                       @Param("roleType") Integer roleType,
+                                                       @Param("nowUserId") Integer nowUserId,
+                                                       @Param("beginTime") String beginTime,
+                                                       @Param("endTime") String endTime,
+                                                       @Param("originalDriverName") String originalDriverName,
+                                                       @Param("originalDriverPhone") String originalDriverPhone,
+                                                       @Param("orderNum") String orderNum,
+                                                       @Param("nowDriverName") String nowDriverName,
+                                                       @Param("nowDriverPhone") String nowDriverPhone,
+                                                       @Param("orderState") Integer orderState,
+                                                       @Param("state") Integer state);
+
+    /**
+     * 根据条件查询可被选择的跨城司机列表
+     * @return
+     */
+    List<Map<String,Object>> getCanSelectCrossDriverList(@Param("page") Page<Map<String, Object>> page,
+                                                         @Param("companyId") Integer companyId,
+                                                         @Param("serverCarModelId") Integer serverCarModelId,
+                                                         @Param("lineId") Integer lineId,
+                                                         @Param("lineShiftId") Integer lineShiftId,
+                                                         @Param("time") Date time,
+                                                         @Param("num") Integer num,
+                                                         @Param("name") String name,
+                                                         @Param("phone") String phone,
+                                                         @Param("driverId") Integer driverId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TRegionMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TRegionMapper.java
new file mode 100644
index 0000000..358db98
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TRegionMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TRegion;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 省市区三级联动 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+public interface TRegionMapper extends BaseMapper<TRegion> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TServerCarmodelMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TServerCarmodelMapper.java
new file mode 100644
index 0000000..7553801
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TServerCarmodelMapper.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TServerCarmodel;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务车型设置 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-08-29
+ */
+public interface TServerCarmodelMapper extends BaseMapper<TServerCarmodel> {
+
+    /**
+     * 根据条件查询服务车型列表
+     */
+    List<Map<String,Object>> getServerCarModelList(@Param("page") Page<Map<String, Object>> page,
+                                                   @Param("type") Integer type,
+                                                   @Param("name") String name,
+                                                   @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSiteMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSiteMapper.java
new file mode 100644
index 0000000..6469de0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSiteMapper.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSite;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 线路站点 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-04
+ */
+public interface TSiteMapper extends BaseMapper<TSite> {
+
+    /**
+     * 根据条件查询站点列表
+     * @return
+     */
+    List<Map<String,Object>> getSiteList(@Param("page") Page<Map<String, Object>> page,
+                                         @Param("beginTime") String beginTime,
+                                         @Param("endTime") String endTime,
+                                         @Param("name") String name,
+                                         @Param("insertUser") String insertUser,
+                                         @Param("city") String city,
+                                         @Param("state") Integer state);
+
+
+    List<TSite> query(@Param("provinceCode") String provinceCode, @Param("cityCode")String cityCode,
+                @Param("districtCode")String districtCode);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSmsrecordMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSmsrecordMapper.java
new file mode 100644
index 0000000..888b53b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSmsrecordMapper.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSmsrecord;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 验证码 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+public interface TSmsrecordMapper extends BaseMapper<TSmsrecord> {
+
+    /**
+     * 根据条件查询验证码记录列表
+     * @return
+     */
+    List<Map<String,Object>> getSmsCodeList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("phone") String phone);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysCancleOrderMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysCancleOrderMapper.java
new file mode 100644
index 0000000..5f5f51b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysCancleOrderMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TSysCancleOrder;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 系统设置-取消订单 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TSysCancleOrderMapper extends BaseMapper<TSysCancleOrder> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysFaceDistinguishMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysFaceDistinguishMapper.java
new file mode 100644
index 0000000..abcbda9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysFaceDistinguishMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TSysFaceDistinguish;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 系统设置-人脸识别 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TSysFaceDistinguishMapper extends BaseMapper<TSysFaceDistinguish> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysIntegralMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysIntegralMapper.java
new file mode 100644
index 0000000..3356379
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysIntegralMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TSysIntegral;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 系统设置-积分 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TSysIntegralMapper extends BaseMapper<TSysIntegral> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysPushOrderMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysPushOrderMapper.java
new file mode 100644
index 0000000..979fef9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysPushOrderMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TSysPushOrder;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 系统设置-推单 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TSysPushOrderMapper extends BaseMapper<TSysPushOrder> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysReformistMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysReformistMapper.java
new file mode 100644
index 0000000..a870747
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysReformistMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TSysReformist;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 系统设置-改派 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TSysReformistMapper extends BaseMapper<TSysReformist> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysSensitiveWordsMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysSensitiveWordsMapper.java
new file mode 100644
index 0000000..fd20f56
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSysSensitiveWordsMapper.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSysSensitiveWords;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 系统设置-敏感词 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TSysSensitiveWordsMapper extends BaseMapper<TSysSensitiveWords> {
+
+    /**
+     * 根据条件查询敏感词列表
+     * @return
+     */
+    List<Map<String,Object>> getSensitiveWordList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("content") String content);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSystemNoticeMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSystemNoticeMapper.java
new file mode 100644
index 0000000..9f2f60a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSystemNoticeMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TSystemNotice;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 系统通知 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+public interface TSystemNoticeMapper extends BaseMapper<TSystemNotice> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSystemPriceMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSystemPriceMapper.java
new file mode 100644
index 0000000..af7ac0e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TSystemPriceMapper.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSystemPrice;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务价格规则 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-08-29
+ */
+public interface TSystemPriceMapper extends BaseMapper<TSystemPrice> {
+
+    /**
+     * 查询专车价格设置
+     */
+    List<Map<String,Object>> getSpecialPriceList(@Param("page") Page<Map<String, Object>> page,
+                                                 @Param("companyId") Integer companyId,
+                                                 @Param("name") String name,
+                                                 @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TUserMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TUserMapper.java
new file mode 100644
index 0000000..bb8547d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TUserMapper.java
@@ -0,0 +1,58 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TUser;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户信息 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-01
+ */
+public interface TUserMapper extends BaseMapper<TUser> {
+
+    /**
+     * 根据条件查询用户列表
+     * @param page      分页
+     * @param beginTime 开始时间
+     * @param endTime   结束时间
+     * @param isAuth    是否实名认证
+     * @param state     状态
+     * @param id        用户ID
+     * @param nickName  用户昵称
+     * @return
+     */
+    List<Map<String,Object>> getUserList(@Param("page") Page<Map<String, Object>> page,
+                                         @Param("beginTime") String beginTime,
+                                         @Param("endTime") String endTime,
+                                         @Param("roleType") Integer roleType,
+                                         @Param("nowUserId") Integer nowUserId,
+                                         @Param("isAuth") Integer isAuth,
+                                         @Param("state") Integer state,
+                                         @Param("id") String id,
+                                         @Param("nickName") String nickName,
+                                         @Param("phone") String phone,
+                                         @Param("companyName") String companyName);
+
+    /**
+     * 根据用户ID获取用户详情
+     * @param userId
+     * @return
+     */
+    Map<String,Object> getUserDetailById(@Param("userId") Integer userId);
+
+    /**
+     * 根据条件查询用户列表-无分页
+     * @return
+     */
+    List<Map<String,Object>> getUserListNoPage(@Param("roleType") Integer roleType,
+                                               @Param("nowUserId") Integer nowUserId);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TUserRedPacketRecordMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TUserRedPacketRecordMapper.java
new file mode 100644
index 0000000..0025d75
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TUserRedPacketRecordMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TUserRedPacketRecord;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 用户红包记录 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-07-10
+ */
+public interface TUserRedPacketRecordMapper extends BaseMapper<TUserRedPacketRecord> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TVerifiedMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TVerifiedMapper.java
new file mode 100644
index 0000000..8b3129f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TVerifiedMapper.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TVerified;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 实名认证 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface TVerifiedMapper extends BaseMapper<TVerified> {
+
+    /**
+     * 根据条件查询用户实名认证列表
+     * @return
+     */
+    List<Map<String,Object>> getVerifiedList(@Param("page") Page<Map<String, Object>> page,
+                                            @Param("beginTime") String beginTime,
+                                            @Param("endTime") String endTime,
+                                            @Param("userName") String userName,
+                                            @Param("userPhone") String userPhone,
+                                            @Param("name") String name,
+                                            @Param("state") Integer state);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TVersionManagementMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TVersionManagementMapper.java
new file mode 100644
index 0000000..0d4df71
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TVersionManagementMapper.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TVersionManagement;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 版本管理 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+public interface TVersionManagementMapper extends BaseMapper<TVersionManagement> {
+
+    /**
+     * 根据条件查询版本列表
+     * @return
+     */
+    List<Map<String,Object>> getVersionList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("version") String version);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TransactionDetailsMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TransactionDetailsMapper.java
new file mode 100644
index 0000000..47dabfe
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TransactionDetailsMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.TransactionDetails;
+
+public interface TransactionDetailsMapper extends BaseMapper<TransactionDetails> {
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityBalanceMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityBalanceMapper.java
new file mode 100644
index 0000000..c72cf06
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityBalanceMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.UserActivityBalance;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 用户活动-充值 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface UserActivityBalanceMapper extends BaseMapper<UserActivityBalance> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount1Mapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount1Mapper.java
new file mode 100644
index 0000000..261d717
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount1Mapper.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.UserActivityDiscount1;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户活动-折扣1 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface UserActivityDiscount1Mapper extends BaseMapper<UserActivityDiscount1> {
+
+
+    /**
+     * 获取折扣统计
+     * @param name
+     * @param start
+     * @param end
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    List<Map<String, Object>> queryDiscount1(@Param("name") String name, @Param("start") String start,
+                                             @Param("end") String end, @Param("companyId") Integer companyId,
+                                             @Param("offset") Integer offset, @Param("limit") Integer limit);
+
+
+    int queryDiscount1Count(@Param("name") String name, @Param("start") String start,
+                            @Param("end") String end, @Param("companyId") Integer companyId);
+
+
+    List<Map<String, Object>> queryDiscountInfo(@Param("name") String name, @Param("start") String start,
+                                                @Param("end") String end, @Param("companyId") Integer companyId,
+                                                @Param("offset") Integer offset, @Param("limit") Integer limit);
+
+    int queryDiscountInfoCount(@Param("name") String name, @Param("start") String start,
+                               @Param("end") String end, @Param("companyId") Integer companyId);
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount2Mapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount2Mapper.java
new file mode 100644
index 0000000..cfb8a30
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityDiscount2Mapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.UserActivityDiscount2;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 用户活动-折扣2(跨城) Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface UserActivityDiscount2Mapper extends BaseMapper<UserActivityDiscount2> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityInviteMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityInviteMapper.java
new file mode 100644
index 0000000..ed97a7f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityInviteMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.UserActivityInvite;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 用户活动-邀请 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface UserActivityInviteMapper extends BaseMapper<UserActivityInvite> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityMapper.java
new file mode 100644
index 0000000..ceb6758
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityMapper.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.UserActivity;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户活动主表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface UserActivityMapper extends BaseMapper<UserActivity> {
+
+
+
+    List<Map<String, Object>> queryUserActivityList(@Param("companyId") Integer companyId, @Param("start") Date start,
+                                                    @Param("end") Date end, @Param("name") String name,
+                                                    @Param("status") Integer status, @Param("offset") Integer offset,
+                                                    @Param("limit") Integer limit);
+
+
+    int queryUserActivityListCount(@Param("companyId") Integer companyId, @Param("start") Date start,
+                                   @Param("end") Date end, @Param("name") String name,
+                                   @Param("status") Integer status);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRedenvelopeMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRedenvelopeMapper.java
new file mode 100644
index 0000000..a3d8b04
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRedenvelopeMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.UserActivityRedenvelope;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 用户活动-红包 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface UserActivityRedenvelopeMapper extends BaseMapper<UserActivityRedenvelope> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRegisteredMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRegisteredMapper.java
new file mode 100644
index 0000000..72ba7c8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserActivityRegisteredMapper.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.UserActivityRegistered;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 用户活动-注册 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface UserActivityRegisteredMapper extends BaseMapper<UserActivityRegistered> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserCouponRecordMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserCouponRecordMapper.java
new file mode 100644
index 0000000..80b3ba2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserCouponRecordMapper.java
@@ -0,0 +1,93 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.UserCouponRecord;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户优惠券记录 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface UserCouponRecordMapper extends BaseMapper<UserCouponRecord> {
+    List<Map<String,Object>> getList(@Param("page") Page<Map<String, Object>> page,
+                                     @Param("beginTime") String beginTime,
+                                     @Param("endTime") String endTime,
+                                     @Param("userName") String userName,
+                                     @Param("userPhone") String userPhone,
+                                     @Param("couponActivityId") Integer couponActivityId,
+                                     @Param("activityType") Integer activityType,
+                                     @Param("state") Integer state);
+
+    List<Map<String,Object>> getRedList(@Param("page") Page<Map<String, Object>> page,
+                                     @Param("beginTime") String beginTime,
+                                     @Param("endTime") String endTime,
+                                     @Param("userName") String userName,
+                                     @Param("userPhone") String userPhone,
+                                     @Param("couponActivityId") Integer couponActivityId,
+                                     @Param("state") Integer state);
+
+    Map<String,Object> getCouponStatic(
+                                     @Param("beginTime") String beginTime,
+                                     @Param("endTime") String endTime,
+                                     @Param("activityId") Integer activityId,
+                                     @Param("activityType") Integer activityType);
+
+    Map<String,Object> getRedStatic(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("activityId") Integer activityId);
+
+    Map<String,Object> getRegStatic(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("activityId") Integer activityId);
+
+    Map<String,Object> getDiscountStatic(
+            @Param("beginTime") String beginTime,
+            @Param("endTime") String endTime,
+            @Param("activityId") Integer activityId);
+
+    List<Map<String,Object>> getBlanceList(@Param("page") Page<Map<String, Object>> page,
+                                     @Param("beginTime") String beginTime,
+                                     @Param("endTime") String endTime,
+                                     @Param("activityId") Integer activityId);
+
+
+    List<Map<String, Object>> queryCouponRegister(@Param("type") Integer type, @Param("name") String name,
+                                                  @Param("start") String start, @Param("end") String end,
+                                                  @Param("companyId") Integer companyId, @Param("offset") Integer offset,
+                                                  @Param("limit") Integer limit);
+
+    int queryCouponRegisterCount(@Param("type") Integer type, @Param("name") String name,
+                                 @Param("start") String start, @Param("end") String end,
+                                 @Param("companyId") Integer companyId);
+
+
+
+    List<Map<String, Object>> queryCouponRegisterInfo(@Param("type") Integer type, @Param("name") String name,
+                                                      @Param("start") String start, @Param("end") String end,
+                                                      @Param("companyId") Integer companyId, @Param("offset") Integer offset,
+                                                      @Param("limit") Integer limit);
+
+    int queryCouponRegisterInfoCount(@Param("type") Integer type, @Param("name") String name,
+                                     @Param("start") String start, @Param("end") String end,
+                                     @Param("companyId") Integer companyId);
+
+
+    List<Map<String, Object>> queryCouponRegisterInfo1(@Param("name") String name, @Param("start") String start,
+                                                       @Param("end") String end, @Param("companyId") Integer companyId,
+                                                       @Param("offset") Integer offset, @Param("limit") Integer limit);
+
+    int queryCouponRegisterInfo1Count(@Param("name") String name, @Param("start") String start,
+                                      @Param("end") String end, @Param("companyId") Integer companyId);
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserMapper.java
new file mode 100644
index 0000000..338a8b3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserMapper.java
@@ -0,0 +1,61 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.datascope.DataScope;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 管理员表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public interface UserMapper extends BaseMapper<User> {
+
+    /**
+     * 修改用户状态
+     */
+    int setStatus(@Param("userId") Integer userId, @Param("status") int status);
+
+    /**
+     * 修改密码
+     */
+    int changePwd(@Param("userId") Integer userId, @Param("pwd") String pwd);
+
+    /**
+     * 根据条件查询用户列表
+     */
+    List<Map<String, Object>> selectUsers(@Param("dataScope") DataScope dataScope, @Param("name") String name, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("deptid") Integer deptid);
+
+    /**
+     * 设置用户的角色
+     */
+    int setRoles(@Param("userId") Integer userId, @Param("roleIds") String roleIds);
+
+    /**
+     * 通过账号获取用户
+     */
+    User getByAccount(@Param("account") String account);
+
+    /**
+     * 根据角色判断菜单有"首页"的数量
+     * @param roleStr
+     * @return
+     */
+    Integer getMenuNumByRole(@Param("roleStr") String roleStr);
+
+    List<Map<String,Object>> getUserListPage(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("dataScope") DataScope dataScope,
+                                             @Param("name") String name,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("deptid") Integer deptid);
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserRedPacketRecordMapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserRedPacketRecordMapper.java
new file mode 100644
index 0000000..a661e54
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserRedPacketRecordMapper.java
@@ -0,0 +1,39 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.UserRedPacketRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface UserRedPacketRecordMapper extends BaseMapper<UserRedPacketRecord> {
+
+
+    /**
+     * 获取红包统计
+     * @param name
+     * @param start
+     * @param end
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     */
+    List<Map<String, Object>> queryRedEnvelopes(@Param("name") String name, @Param("start") String start,
+                                                @Param("end") String end, @Param("companyId") Integer companyId,
+                                                @Param("offset") Integer offset, @Param("limit") Integer limit);
+
+    int queryRedEnvelopesCount(@Param("name") String name, @Param("start") String start,
+                               @Param("end") String end, @Param("companyId") Integer companyId);
+
+
+
+    List<Map<String, Object>> queryRedEnvelopesInfo(@Param("name") String name, @Param("start") String start,
+                                                    @Param("end") String end, @Param("companyId") Integer companyId,
+                                                    @Param("offset") Integer offset, @Param("limit") Integer limit);
+
+    int queryRedEnvelopesInfoCount(@Param("name") String name, @Param("start") String start,
+                                   @Param("end") String end, @Param("companyId") Integer companyId);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarInsuranceMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarInsuranceMapper.xml
new file mode 100644
index 0000000..4ff65b5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarInsuranceMapper.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.CarInsuranceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.CarInsurance">
+        <id column="id" property="id"/>
+        <result column="carId" property="carId"/>
+        <result column="insurCom" property="insurCom"/>
+        <result column="insurNum" property="insurNum"/>
+        <result column="insurType" property="insurType"/>
+        <result column="insurCount" property="insurCount"/>
+        <result column="insurEff" property="insurEff"/>
+        <result column="insurExp" property="insurExp"/>
+    </resultMap>
+
+
+    <select id="queryInsuranceList" resultType="map">
+        select
+        id as id,
+        insurCom as insurCom,
+        insurNum as insurNum,
+        insurType as insurType,
+        insurCount as insurCount,
+        DATE_FORMAT(insurEff, '%Y-%m-%d') as insurEff,
+        DATE_FORMAT(insurExp, '%Y-%m-%d') as insurExp
+        from t_car_insurance where carId = #{carId} order by insurEff desc limit #{offset}, #{limit}
+    </select>
+
+
+
+    <select id="queryInsuranceListCount" resultType="int">
+        select
+        count(id)
+        from t_car_insurance where carId = #{carId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DeptMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DeptMapper.xml
new file mode 100644
index 0000000..c89d952
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DeptMapper.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DeptMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Dept">
+        <id column="id" property="id"/>
+        <result column="num" property="num"/>
+        <result column="pid" property="pid"/>
+        <result column="pids" property="pids"/>
+        <result column="simplename" property="simplename"/>
+        <result column="fullname" property="fullname"/>
+        <result column="tips" property="tips"/>
+        <result column="version" property="version"/>
+    </resultMap>
+
+    <select id="tree" resultType="com.stylefeng.guns.core.node.ZTreeNode">
+		select id,pid as pId,simplename as name,
+		(
+		CASE
+		WHEN (pId = 0 OR pId IS NULL) THEN
+		'true'
+		ELSE
+		'false'
+		END
+		) as isOpen from sys_dept
+	</select>
+
+    <select id="list" resultType="map">
+        select * from sys_dept
+        <if test="condition != null and condition != ''">
+            where simplename like CONCAT('%',#{condition},'%') or fullname like CONCAT('%',#{condition},'%')
+        </if>
+        order by num ASC
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DictMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DictMapper.xml
new file mode 100644
index 0000000..54742bd
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DictMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DictMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Dict">
+        <id column="id" property="id"/>
+        <result column="num" property="num"/>
+        <result column="pid" property="pid"/>
+        <result column="name" property="name"/>
+        <result column="code" property="code"/>
+        <result column="tips" property="tips"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+		id, num, pid, name,code,tips
+	</sql>
+
+    <select id="selectByCode" resultType="dict">
+        select
+        <include refid="Base_Column_List"/>
+        from sys_dict
+        where code = #{code}
+    </select>
+
+    <select id="selectByParentCode" resultType="dict">
+        select
+        <include refid="Base_Column_List"/>
+        from sys_dict
+        where pid in(select id  from sys_dict where code = #{code}) order by num asc
+    </select>
+
+    <select id="list" resultType="map">
+        select * from sys_dict
+        where pid = 0
+        <if test="condition != null and condition != ''">
+            AND name like CONCAT('%',#{condition},'%')
+        </if>
+        order by id ASC
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityHistoryMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityHistoryMapper.xml
new file mode 100644
index 0000000..9b7bb3a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityHistoryMapper.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverActivityHistoryMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverActivityHistory">
+        <id column="id" property="id" />
+        <result column="day" property="day" />
+        <result column="driverId" property="driverId" />
+        <result column="type" property="type" />
+        <result column="activityId" property="activityId" />
+        <result column="carryOut" property="carryOut" />
+        <result column="money" property="money" />
+        <result column="collectionTime" property="collectionTime"/>
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, day, driverId, type, activityId, carryOut, money, insertTime
+    </sql>
+    <select id="getList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT
+            d.`name`,d.phone,h.insertTime,h.money,h.collectionTime
+        FROM
+            t_driver_activity_history h
+        LEFT JOIN t_driver d ON h.driverId = d.id
+        WHERE h.type=#{type} AND h.activityId=#{activityId} and carryOut=2
+    </select>
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityMapper.xml
new file mode 100644
index 0000000..d20a264
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityMapper.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverActivityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverActivity">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="companyId" property="companyId" />
+        <result column="insertTime" property="insertTime" />
+        <result column="status" property="status" />
+        <result column="remark" property="remark" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, companyId, insertTime, status, remark, startTime, endTime
+    </sql>
+    <select  id="getList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT
+            a.*, IFNULL(o1.number, 0) + IFNULL(o2.number, 0) + IFNULL(o3.number, 0) number
+        FROM
+            t_driver_activity a
+        LEFT JOIN (
+            SELECT
+                COUNT(h.id) number,
+                o.driverActivityId
+            FROM
+                t_driver_activity_history h
+            LEFT JOIN t_driver_activity_online o ON h.activityId = o.id
+            WHERE
+                h.type = 3
+                AND h.carryOut=2
+            GROUP BY
+                o.driverActivityId
+        ) o1 ON o1.driverActivityId = a.id
+        LEFT JOIN (
+            SELECT
+                COUNT(h.id) number,
+                o.driverActivityId
+            FROM
+                t_driver_activity_history h
+            LEFT JOIN t_driver_activity_order o ON h.activityId = o.id
+            WHERE
+                h.type = 4
+                AND h.carryOut=2
+            GROUP BY
+                o.driverActivityId
+        ) o2 ON o2.driverActivityId = a.id
+        LEFT JOIN (
+            SELECT
+                COUNT(h.id) number,
+                o.driverActivityId
+            FROM
+                t_driver_activity_history h
+            LEFT JOIN t_driver_activity_registered o ON h.activityId = o.id
+            WHERE
+                h.type != 3
+            AND h.type != 4
+            AND h.carryOut=2
+            GROUP BY
+                o.driverActivityId
+        ) o3 ON o3.driverActivityId = a.id
+        WHERE 1=1
+        <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+            and (a.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        <if test="name != null and name !=''">
+            and a.name like CONCAT('%',#{name},'%')
+        </if>
+        <if test="companyType != null and companyType !='' and companyType!=1">
+            and a.companyType=#{companyType}
+        </if>
+        <if test="companyId != null and companyId !='' and companyType!=1">
+            and a.companyId=#{companyId}
+        </if>
+        order by a.id desc
+    </select>
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityOnlineMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityOnlineMapper.xml
new file mode 100644
index 0000000..1cc8e21
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityOnlineMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverActivityOnlineMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverActivityOnline">
+        <id column="id" property="id" />
+        <result column="companyId" property="companyId" />
+        <result column="driverActivityId" property="driverActivityId" />
+        <result column="type" property="type" />
+        <result column="online" property="online" />
+        <result column="money" property="money" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, companyId, driverActivityId, type, online, money, startTime, endTime, insertTime
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityOrderMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityOrderMapper.xml
new file mode 100644
index 0000000..ad8823d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityOrderMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverActivityOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverActivityOrder">
+        <id column="id" property="id" />
+        <result column="companyId" property="companyId" />
+        <result column="driverActivityId" property="driverActivityId" />
+        <result column="start" property="start" />
+        <result column="end" property="end" />
+        <result column="orderNum" property="orderNum" />
+        <result column="money" property="money" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, companyId, driverActivityId, start, end, orderNum, money, startTime, endTime, insertTime
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityRegisteredMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityRegisteredMapper.xml
new file mode 100644
index 0000000..dcad653
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverActivityRegisteredMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverActivityRegisteredMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverActivityRegistered">
+        <id column="id" property="id" />
+        <result column="companyId" property="companyId" />
+        <result column="driverActivityId" property="driverActivityId" />
+        <result column="type" property="type" />
+        <result column="money" property="money" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, companyId, driverActivityId, type, money, startTime, endTime, insertTime
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverOnlineMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverOnlineMapper.xml
new file mode 100644
index 0000000..8350e61
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverOnlineMapper.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverOnlineMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverOnline">
+        <id column="id" property="id" />
+        <result column="driverId" property="driverId" />
+        <result column="device" property="device" />
+        <result column="version" property="version"/>
+        <result column="insertTime" property="insertTime" />
+        <result column="lastTime" property="lastTime"/>
+    </resultMap>
+
+
+
+    <select id="queryOnlineDriver" resultType="map">
+        select
+        b.id as id,
+        b.headImgUrl as headImgUrl,
+        b.`name` as `name`,
+        b.phone as phone,
+        if(a.device = 1, '手机端', '车载端') as device,
+        a.version as version,
+        DATE_FORMAT(a.lastTime, '%Y-%m-%d %H:%i:%s') as insertTime
+        from t_driver_online a
+        left join t_driver b on (a.driverId = b.id)
+        where UNIX_TIMESTAMP(a.lastTime) > (UNIX_TIMESTAMP(now()) - 30)
+        <if test="null != name and '' != name">
+            and b.`name` like CONCAT('%', #{name}, '%')
+        </if>
+        <if test="null != phone and '' != phone">
+            and b.phone like CONCAT('%', #{phone}, '%')
+        </if>
+        order by a.insertTime desc
+        <if test="null != offset and null != limit">
+            limit #{offset}, #{limit}
+        </if>
+    </select>
+
+
+    <select id="queryOnlineDriverCount" resultType="int">
+        select
+        COUNT(a.id)
+        from t_driver_online a
+        left join t_driver b on (a.driverId = b.id)
+        where UNIX_TIMESTAMP(a.lastTime) > (UNIX_TIMESTAMP(now()) - 30)
+        <if test="null != name and '' != name">
+            and b.`name` like CONCAT('%', #{name}, '%')
+        </if>
+        <if test="null != phone and '' != phone">
+            and b.phone like CONCAT('%', #{phone}, '%')
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverPunishMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverPunishMapper.xml
new file mode 100644
index 0000000..2a26c3f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverPunishMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverPunishMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverPunish">
+        <id column="id" property="id"/>
+        <result column="driverId" property="driverId"/>
+        <result column="punishTime" property="punishTime"/>
+        <result column="punishReason" property="punishReason"/>
+        <result column="punishReault" property="punishReault"/>
+    </resultMap>
+
+
+    <select id="queryAllPunish" resultType="DriverPunish">
+        select
+         id as id,
+         driverId as driverId,
+         punishTime as punishTime,
+         punishReason as punishReason,
+         punishReault as punishReault
+         from t_driver_punish where driverId = #{driverId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverTrainMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverTrainMapper.xml
new file mode 100644
index 0000000..1c61dfb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverTrainMapper.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.DriverTrainMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.DriverTrain">
+        <id column="id" property="id"/>
+        <result column="driverId" property="driverId"/>
+        <result column="courseName" property="courseName"/>
+        <result column="courseDate" property="courseDate"/>
+        <result column="startTime" property="startTime"/>
+        <result column="stopTime" property="stopTime"/>
+        <result column="duration" property="duration"/>
+    </resultMap>
+
+
+    <delete id="deleteByDriverId">
+        delete from t_driver_train where driverId = #{driverId}
+    </delete>
+
+
+    <select id="queryAllTrain" resultType="DriverTrain">
+        select
+        id as id,
+        driverId as driverId,
+        courseName as courseName,
+        courseDate as courseDate,
+        startTime as startTime,
+        stopTime as stopTime,
+        duration as duration
+        from t_driver_train where driverId = #{driverId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/GDInterfaceMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/GDInterfaceMapper.xml
new file mode 100644
index 0000000..9f9cf25
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/GDInterfaceMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.GDInterfaceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.GDInterface">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="explanation" property="explanation"/>
+        <result column="num" property="num"/>
+        <result column="time" property="time"/>
+    </resultMap>
+    
+    
+    <select id="query" resultType="GDInterface">
+        select * from t_gdinterface where `name` like #{name} and explanation like #{explanation} and `time` = #{time}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IncomeMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IncomeMapper.xml
new file mode 100644
index 0000000..c672369
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/IncomeMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.IncomeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Income">
+        <id column="id" property="id"/>
+        <result column="userType" property="userType"/>
+        <result column="objectId" property="objectId"/>
+        <result column="type" property="type"/>
+        <result column="incomeId" property="incomeId"/>
+        <result column="orderType" property="orderType"/>
+        <result column="money" property="money"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftDriverMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftDriverMapper.xml
new file mode 100644
index 0000000..7bf58a9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LineShiftDriverMapper.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.LineShiftDriver">
+        <id column="id" property="id"/>
+        <result column="lineShiftId" property="lineShiftId"/>
+        <result column="driverId" property="driverId"/>
+        <result column="day" property="day"/>
+        <result column="laveSeat" property="laveSeat"/>
+        <result column="laveSeatNumber" property="laveSeatNumber"/>
+        <result column="totalSeat" property="totalSeat"/>
+        <result column="inserTime" property="inserTime"/>
+    </resultMap>
+
+
+
+    <select id="query" resultType="LineShiftDriver">
+        select
+        id as id,
+        lineShiftId as lineShiftId,
+        driverId as driverId,
+        `day` as `day`,
+        laveSeat as laveSeat,
+        laveSeatNumber as laveSeatNumber,
+        totalSeat as totalSeat,
+        inserTime as inserTime
+        from t_line_shift_driver where 1 = 1
+        <if test="null != lineShiftId">
+            and lineShiftId = #{lineShiftId}
+        </if>
+        <if test="null != driverId">
+            and driverId = #{driverId}
+        </if>
+        <if test="null != time">
+            and DATE_FORMAT(`day`, '%Y-%m-%d') = DATE_FORMAT(#{time}, '%Y-%m-%d')
+        </if>
+        order by `day`
+    </select>
+
+
+    <select id="queryNotInLineShiftDriver" resultType="map">
+        select
+        d.id as id,
+        CONCAT(d.`name`, '-', d.phone) as `name`
+        from t_driver d
+        left join t_driver_line dl on (d.id = dl.driverId)
+        where d.authState = 2 and d.flag != 3 and dl.lineId in
+        (
+            select lineId from t_line_shift where id = #{lineShiftId}
+        )
+        and d.id not in
+        (
+            select lsd.driverId
+            from t_line_shift_driver lsd
+            left join t_line_shift ls on (lsd.lineShiftId = ls.id)
+            where ls.id = #{lineShiftId} and DATE_FORMAT(lsd.`day`, '%Y-%m-%d') = DATE_FORMAT(#{time}, '%Y-%m-%d')
+        )
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LoginLogMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LoginLogMapper.xml
new file mode 100644
index 0000000..8c2e99d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/LoginLogMapper.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.LoginLogMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.LoginLog">
+		<id column="id" property="id" />
+		<result column="logname" property="logname" />
+		<result column="userid" property="userid" />
+		<result column="createtime" property="createtime" />
+		<result column="succeed" property="succeed" />
+		<result column="message" property="message" />
+		<result column="ip" property="ip" />
+	</resultMap>
+
+	<select id="getLoginLogs" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+		select l.*,u.`name` as  userName from sys_login_log l
+		left join sys_user u on l.userid=u.id
+		where 1 = 1
+		<if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+			and (l.createTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+		</if>
+		<if test="logName != null and logName !=''">
+			and u.`name` like CONCAT('%',#{logName},'%')
+		</if>
+		<choose>
+			<when test="orderByField != null and orderByField !=''">
+				<choose>
+					<when test="isAsc == true">
+						order by ${orderByField} ASC
+					</when>
+					<otherwise>
+						order by ${orderByField} DESC
+					</otherwise>
+				</choose>
+			</when>
+			<otherwise>
+				order by createtime DESC
+			</otherwise>
+		</choose>
+	</select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/MenuMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/MenuMapper.xml
new file mode 100644
index 0000000..77e9729
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/MenuMapper.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.MenuMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Menu">
+		<id column="id" property="id" />
+		<result column="code" property="code" />
+		<result column="pcode" property="pcode" />
+		<result column="pcodes" property="pcodes" />
+		<result column="name" property="name" />
+		<result column="icon" property="icon" />
+		<result column="url" property="url" />
+		<result column="num" property="num" />
+		<result column="levels" property="levels" />
+		<result column="ismenu" property="ismenu" />
+		<result column="tips" property="tips" />
+		<result column="status" property="status" />
+		<result column="isopen" property="isopen" />
+	</resultMap>
+
+    <sql id="Base_Column_List">
+        id, code, pcode, name, icon, url, num, levels,pcodes,
+        tips, status,isopen,ismenu
+    </sql>
+
+    <select id="selectMenus" resultType="map">
+        select
+        <include refid="Base_Column_List" />
+        from sys_menu
+        where status = 1
+        <if test="condition != null and condition != ''">
+            and (name like CONCAT('%',#{condition},'%') or code like CONCAT('%',#{condition},'%'))
+        </if>
+        <if test="level != null and level != ''">
+            and levels = #{level}
+        </if>
+    </select>
+
+    <select id="getMenuIdsByRoleId" resultType="long">
+        select menuid from
+        sys_relation where roleid = #{roleId}
+    </select>
+
+    <select id="menuTreeList" resultType="com.stylefeng.guns.core.node.ZTreeNode">
+        SELECT
+        m1.id AS id,
+        (
+        CASE
+        WHEN (m2.id = 0 OR m2.id IS NULL) THEN
+        0
+        ELSE
+        m2.id
+        END
+        ) AS pId,
+        m1. NAME
+        AS NAME,
+        (
+        CASE
+        WHEN (m2.id = 0 OR m2.id IS NULL) THEN
+        'true'
+        ELSE
+        'false'
+        END
+        ) as isOpen
+        FROM
+        sys_menu m1
+        LEFT join sys_menu m2 ON m1.pcode = m2. CODE
+        where m1.`status` = 1
+        ORDER BY
+        m1.id ASC
+    </select>
+
+    <select id="menuTreeListByMenuIds" resultType="com.stylefeng.guns.core.node.ZTreeNode">
+        SELECT
+        m1.id AS id,
+        (
+        CASE
+        WHEN (m2.id = 0 OR m2.id IS NULL) THEN
+        0
+        ELSE
+        m2.id
+        END
+        ) AS pId,
+        m1. NAME AS NAME,
+        (
+        CASE
+        WHEN (m2.id = 0 OR m2.id IS
+        NULL) THEN
+        'true'
+        ELSE
+        'false'
+        END
+        ) as isOpen,
+        (
+        CASE
+        WHEN (m3.ID = 0 OR m3.ID
+        IS NULL) THEN
+        'false'
+        ELSE
+        'true'
+        END
+        ) "checked"
+        FROM
+        sys_menu m1
+        LEFT JOIN
+        sys_menu m2
+        ON m1.pcode = m2. CODE
+        left join (
+        SELECT
+        ID
+        FROM
+        sys_menu
+        WHERE
+        ID IN
+        <foreach collection="list" index="index" item="i" open="("
+                 separator="," close=")">
+            #{i}
+        </foreach>
+        ) m3 on m1.id = m3.id
+        where m1.`status` = 1
+        ORDER BY
+        m1.id ASC
+    </select>
+
+    <delete id="deleteRelationByMenu">
+        delete from sys_relation where menuid = #{menuId}
+    </delete>
+
+    <select id="getResUrlsByRoleId" resultType="string">
+        select url from
+        sys_relation rel
+        inner join sys_menu m on rel.menuid = m.id
+        where rel.roleid = #{roleId}
+    </select>
+
+    <select id="getMenusByRoleIds" resultType="com.stylefeng.guns.core.node.MenuNode">
+        SELECT
+        m1.id AS id,
+        m1.icon AS icon,
+        (
+        CASE
+        WHEN (m2.id = 0 OR m2.id IS NULL) THEN
+        0
+        ELSE
+        m2.id
+        END
+        ) AS parentId,
+        m1.NAME as name,
+        m1.url as url,
+        m1.levels as levels,
+        m1.ismenu as ismenu,
+        m1.num as num
+        FROM
+        sys_menu m1
+        LEFT join sys_menu m2 ON m1.pcode = m2. CODE
+        INNER JOIN (
+        SELECT
+        ID
+        FROM
+        sys_menu
+        WHERE
+        ID IN (
+        SELECT
+        menuid
+        FROM
+        sys_relation rela
+        WHERE
+        rela.roleid IN
+        <foreach collection="list" index="index" item="i" open="(" separator="," close=")">
+            #{i}
+        </foreach>
+        )
+        ) m3 ON m1.id = m3.id
+        where m1.ismenu = 1
+        order by levels,num asc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/NoticeMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/NoticeMapper.xml
new file mode 100644
index 0000000..6d4ba33
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/NoticeMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.NoticeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Notice">
+        <id column="id" property="id"/>
+        <result column="title" property="title"/>
+        <result column="type" property="type"/>
+        <result column="content" property="content"/>
+        <result column="createtime" property="createtime"/>
+        <result column="creater" property="creater"/>
+    </resultMap>
+
+    <select id="list" resultType="map">
+        select * from sys_notice
+        <if test="condition != null and condition != ''">
+            where title like CONCAT('%',#{condition},'%') or content like CONCAT('%',#{condition},'%')
+        </if>
+        order by createtime DESC
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OperationLogMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OperationLogMapper.xml
new file mode 100644
index 0000000..23613ed
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OperationLogMapper.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.OperationLogMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.OperationLog">
+		<id column="id" property="id" />
+		<result column="logtype" property="logtype" />
+		<result column="logname" property="logname" />
+		<result column="userid" property="userid" />
+		<result column="classname" property="classname" />
+		<result column="method" property="method" />
+		<result column="createtime" property="createtime" />
+		<result column="succeed" property="succeed" />
+		<result column="message" property="message" />
+	</resultMap>
+
+	<select id="getOperationLogs" resultType="map">
+		select l.*,u.`name` as userName from sys_operation_log l
+		left join sys_user u on l.userid=u.id
+		where l.logtype = '业务日志'
+		<if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+			and (l.createTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+		</if>
+		<if test="logName != null and logName !=''">
+			and u.name like CONCAT('%',#{logName},'%')
+		</if>
+		<if test="logType != null and logType !=''">
+			and logtype like CONCAT('%',#{logType},'%')
+		</if>
+		<choose>
+			<when test="orderByField != null and orderByField !=''">
+				<choose>
+					<when test="isAsc == true">
+						order by ${orderByField} ASC
+					</when>
+					<otherwise>
+						order by ${orderByField} DESC
+					</otherwise>
+				</choose>
+			</when>
+			<otherwise>
+				order by createtime DESC
+			</otherwise>
+		</choose>
+	</select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml
new file mode 100644
index 0000000..0d69378
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/OrderCancelMapper.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.OrderCancelMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.OrderCancel">
+        <id column="id" property="id"/>
+        <result column="orderId" property="orderId"/>
+        <result column="orderType" property="orderType"/>
+        <result column="reason" property="reason"/>
+        <result column="remark" property="remark"/>
+        <result column="payType" property="payType"/>
+        <result column="money" property="money"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="userType" property="userType"/>
+        <result column="userId" property="userId"/>
+    </resultMap>
+
+
+    <select id="query" resultType="OrderCancel">
+        select
+        id as id,
+        orderId as orderId,
+        orderType as orderType,
+        reason as reason,
+        remark as remark,
+        payType as payType,
+        money as money,
+        state as state,
+        insertTime as insertTime,
+        userType as userType
+        from t_order_cancel where 1 = 1
+        <if test="null != orderId">
+            and orderId = #{orderId}
+        </if>
+        <if test="null != orderType">
+            and orderType = #{orderType}
+        </if>
+        <if test="null != money">
+            and money = #{money}
+        </if>
+        <if test="null != payType">
+            and payType = #{payType}
+        </if>
+        <if test="null != state">
+            and state = #{state}
+        </if>
+        order by insertTime desc limit 0,1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PaymentRecordMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PaymentRecordMapper.xml
new file mode 100644
index 0000000..7a3b0f1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/PaymentRecordMapper.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.PaymentRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.PaymentRecord">
+        <id column="id" property="id"/>
+        <result column="category" property="category"/>
+        <result column="userId" property="userId"/>
+        <result column="type" property="type"/>
+        <result column="orderId" property="orderId"/>
+        <result column="orderType" property="orderType"/>
+        <result column="payType" property="payType"/>
+        <result column="amount" property="amount"/>
+        <result column="code" property="code"/>
+        <result column="state" property="state"/>
+        <result column="insertTime" property="insertTime"/>
+    </resultMap>
+
+
+    <select id="query" resultType="PaymentRecord">
+        select
+        id as id,
+        category as category,
+        userId as userId,
+        `type` as `type`,
+        orderId as orderId,
+        orderType as orderType,
+        payType as payType,
+        amount as amount,
+        code as code,
+        state as state,
+        insertTime as insertTime
+        from t_payment_record where category = #{category}
+        <if test="null != userId">
+            and userId = #{userId}
+        </if>
+        <if test="null != type">
+            and type = #{type}
+        </if>
+        <if test="null != orderId">
+            and orderId = #{orderId}
+        </if>
+        <if test="null != orderType">
+            and orderType = #{orderType}
+        </if>
+        <if test="null != payType">
+            and payType = #{payType}
+        </if>
+        <if test="null != state">
+            and state = #{state}
+        </if>
+        order by insertTime desc limit 0,1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.xml
new file mode 100644
index 0000000..ddbc626
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RegionMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.RegionMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Region">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="code" property="code" />
+        <result column="citycode" property="citycode" />
+        <result column="parent_id" property="parentId" />
+        <result column="english" property="english" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, code, citycode, parent_id, english
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RelationMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RelationMapper.xml
new file mode 100644
index 0000000..2f4be0a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RelationMapper.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.RelationMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Relation">
+		<id column="id" property="id" />
+		<result column="menuid" property="menuid" />
+		<result column="roleid" property="roleid" />
+	</resultMap>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RoleMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RoleMapper.xml
new file mode 100644
index 0000000..c0afcd5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/RoleMapper.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.RoleMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.Role">
+		<id column="id" property="id" />
+		<result column="num" property="num" />
+		<result column="pid" property="pid" />
+		<result column="name" property="name" />
+		<result column="deptid" property="deptid" />
+		<result column="tips" property="tips" />
+		<result column="version" property="version" />
+	</resultMap>
+
+	<sql id="Base_Column_List">
+		id, num, pid, name, deptid, tips, version
+	</sql>
+
+	<select id="selectRoles" resultType="map">
+		select rr.*,(SELECT COUNT(id) from sys_user where FIND_IN_SET(rr.id,roleid)) as userCount
+		from sys_role as rr
+		<if test="condition != null">
+			where rr.name like CONCAT('%',#{condition},'%')
+		</if>
+	</select>
+
+	<delete id="deleteRolesById">
+		delete from sys_relation where roleid = #{roleId}
+	</delete>
+
+	<select id="roleTreeList" resultType="com.stylefeng.guns.core.node.ZTreeNode">
+		select id "id",pId
+		"pId",name as "name",(case when (pId=0 or pId is null) then 'true'
+		else 'false' end) "open" from sys_role
+	</select>
+
+	<select id="roleTreeListByRoleId" resultType="com.stylefeng.guns.core.node.ZTreeNode">
+		SELECT
+		r.id "id",
+		pId "pId",
+		NAME AS "name",
+		(
+		CASE
+		WHEN (pId = 0 OR pId IS NULL) THEN
+		'true'
+		ELSE
+		'false'
+		END
+		) "open",
+		(
+		CASE
+		WHEN (r1.ID = 0 OR r1.ID IS NULL) THEN
+		'false'
+		ELSE
+		'true'
+		END
+		) "checked"
+		FROM
+		sys_role r
+		LEFT JOIN (
+		SELECT
+		ID
+		FROM
+		sys_role
+		WHERE
+		ID IN
+
+		<foreach collection="array" index="index" item="i" open="(" separator="," close=")">
+			#{i}
+		</foreach>
+
+		) r1 ON r.ID = r1.ID
+		ORDER BY
+		pId,
+		num ASC
+	</select>
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysCouponActivityMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysCouponActivityMapper.xml
new file mode 100644
index 0000000..ffe0652
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysCouponActivityMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.SysCouponActivityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.SysCouponActivity">
+        <id column="id" property="id" />
+        <result column="money" property="money" />
+        <result column="fullMoney" property="fullMoney" />
+        <result column="insertTime" property="insertTime" />
+        <result column="companyId" property="companyId" />
+        <result column="couponUseType" property="couponUseType" />
+        <result column="couponType" property="couponType" />
+        <result column="name" property="name" />
+        <result column="effective" property="effective" />
+        <result column="companyType" property="companyType" />
+        <result column="status" property="status" />
+        <result column="remark" property="remark" />
+        <result column="sendType" property="sendType" />
+        <result column="sendUserId" property="sendUserId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, money, fullMoney, insertTime, companyId, couponUseType, couponType, name, effective, companyType, status, remark, sendType, sendUserId
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysCouponRecordMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysCouponRecordMapper.xml
new file mode 100644
index 0000000..5308c5a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysCouponRecordMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.SysCouponRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.SysCouponRecord">
+        <id column="id" property="id" />
+        <result column="money" property="money" />
+        <result column="fullMoney" property="fullMoney" />
+        <result column="insertTime" property="insertTime" />
+        <result column="companyId" property="companyId" />
+        <result column="couponUseType" property="couponUseType" />
+        <result column="couponType" property="couponType" />
+        <result column="name" property="name" />
+        <result column="effective" property="effective" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, money, fullMoney, insertTime, companyId, couponUseType, couponType, name, effective
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysRedPacketRecordMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysRedPacketRecordMapper.xml
new file mode 100644
index 0000000..4376c9d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysRedPacketRecordMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.SysRedPacketRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.SysRedPacketRecord">
+        <id column="id" property="id" />
+        <result column="money" property="money" />
+        <result column="insertTime" property="insertTime" />
+        <result column="companyId" property="companyId" />
+        <result column="name" property="name" />
+        <result column="type" property="type" />
+        <result column="totalMoney" property="totalMoney" />
+        <result column="laveMoney" property="laveMoney" />
+        <result column="startMoney" property="startMoney" />
+        <result column="endMoney" property="endMoney" />
+        <result column="effective" property="effective" />
+        <result column="companyType" property="companyType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, money, insertTime, companyId, name, type, totalMoney, laveMoney, startMoney, endMoney, effective, companyType
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAdvertisementMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAdvertisementMapper.xml
new file mode 100644
index 0000000..49d8dc5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAdvertisementMapper.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TAdvertisementMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TAdvertisement">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="imgUrl" property="imgUrl" />
+        <result column="type" property="type" />
+        <result column="isJump" property="isJump" />
+        <result column="jumpType" property="jumpType" />
+        <result column="jumpUrl" property="jumpUrl" />
+        <result column="content" property="content" />
+        <result column="flag" property="flag" />
+        <result column="insertTime" property="insertTime" />
+        <result column="insertUser" property="insertUser" />
+        <result column="updateTime" property="updateTime" />
+        <result column="updateUser" property="updateUser" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, imgUrl, type, isJump, jumpType, jumpUrl, content, flag, insertTime, insertUser, updateTime, updateUser
+    </sql>
+
+    <!--根据条件查询广告列表-->
+    <select id="getAdvertisementList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT rr.`name` as provinceName,aa.* FROM t_advertisement as aa
+        LEFT JOIN t_region as rr on rr.id = aa.provinceId) as o
+        <where>
+            1=1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="type != null and type != ''">
+                and o.type = #{type}
+            </if>
+            <if test="name != null and name != ''">
+                and o.name  LIKE CONCAT('%',#{name},'%')
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAgreementMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAgreementMapper.xml
new file mode 100644
index 0000000..a7420de
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TAgreementMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TAgreementMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TAgreement">
+        <id column="id" property="id" />
+        <result column="useType" property="useType" />
+        <result column="content" property="content" />
+        <result column="type" property="type" />
+        <result column="flag" property="flag" />
+        <result column="insertTime" property="insertTime" />
+        <result column="insertUser" property="insertUser" />
+        <result column="updateTime" property="updateTime" />
+        <result column="updateUser" property="updateUser" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, useType, content, type, flag, insertTime, insertUser, updateTime, updateUser
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarBrandMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarBrandMapper.xml
new file mode 100644
index 0000000..5b536bf
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarBrandMapper.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TCarBrandMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TCarBrand">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="imgUrl" property="imgUrl" />
+        <result column="remark" property="remark" />
+        <result column="createTime" property="createTime" />
+        <result column="state" property="state" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, imgUrl, remark, insertTime, state
+    </sql>
+
+    <!--根据条件查询车辆品牌列表-->
+    <select id="getCarBrandList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT IFNULL(cm.num,0) as modelNum,IFNULL(cc.num,0) as carNum,cb.* FROM t_car_brand as cb
+        LEFT JOIN (SELECT COUNT(id) as num,brandId FROM t_car_model WHERE state = 1 GROUP BY brandId) as cm on cm.brandId = cb.id
+        LEFT JOIN (SELECT COUNT(id) as num,carBrandId FROM t_car WHERE state = 1 GROUP BY carBrandId) as cc on cc.carBrandId = cb.id) as o
+        <where>
+            o.state = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="name != null and name != ''">
+                and o.name  LIKE CONCAT('%',#{name},'%')
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarMapper.xml
new file mode 100644
index 0000000..dfe5234
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarMapper.xml
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TCarMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TCar">
+        <id column="id" property="id" />
+        <result column="isPlatCar" property="isPlatCar" />
+        <result column="companyId" property="companyId" />
+        <result column="franchiseeId" property="franchiseeId" />
+        <result column="carColor" property="carColor" />
+        <result column="carModelId" property="carModelId" />
+        <result column="carBrandId" property="carBrandId" />
+        <result column="carLicensePlate" property="carLicensePlate" />
+        <result column="carPhoto" property="carPhoto" />
+        <result column="drivingLicenseNumber" property="drivingLicenseNumber" />
+        <result column="drivingLicensePhoto" property="drivingLicensePhoto" />
+        <result column="annualInspectionTime" property="annualInspectionTime" />
+        <result column="commercialInsuranceTime" property="commercialInsuranceTime" />
+        <result column="createTime" property="createTime" />
+        <result column="state" property="state" />
+        <result column="addType" property="addType" />
+        <result column="addObjectId" property="addObjectId" />
+        <result column="plateColor" property="plateColor"/>
+        <result column="vehicleType" property="vehicleType"/>
+        <result column="ownerName" property="ownerName"/>
+        <result column="engineId" property="engineId"/>
+        <result column="VIN" property="VIN"/>
+        <result column="certifyDateA" property="certifyDateA"/>
+        <result column="fuelType" property="fuelType"/>
+        <result column="engineDisplace" property="engineDisplace"/>
+        <result column="certificate" property="certificate"/>
+        <result column="transAgency" property="transAgency"/>
+        <result column="transArea" property="transArea"/>
+        <result column="transDateStart" property="transDateStart"/>
+        <result column="transDateStop" property="transDateStop"/>
+        <result column="certifyDateB" property="certifyDateB"/>
+        <result column="fixState" property="fixState"/>
+        <result column="nextFixDate" property="nextFixDate"/>
+        <result column="checkState" property="checkState"/>
+        <result column="feePrintId" property="feePrintId"/>
+        <result column="GPSBrand" property="GPSBrand"/>
+        <result column="GPSModel" property="GPSModel"/>
+        <result column="GPSIMEI" property="GPSIMEI"/>
+        <result column="GPSInstallDate" property="GPSInstallDate"/>
+        <result column="registerDate" property="registerDate"/>
+        <result column="commercialType" property="commercialType"/>
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, isPlatCar, companyId, franchiseeId, carColor, carModelId, carBrandId, carLicensePlate, carPhoto, drivingLicenseNumber, drivingLicensePhoto, annualInspectionTime, commercialInsuranceTime, createTime, state, addType, addObjectId
+    </sql>
+
+    <!--根据条件查询车辆列表-->
+    <select id="getCarList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT ds.serverStr,cb.`name` as brandName,cm.`name` as modelName,c1.`name` as companyName,c2.`name` as franchiseeName,cm.seat,dd.`name` as driverName,cc.* from t_car as cc
+        LEFT JOIN (select * from t_car_brand where state = 1) as cb on cb.id = cc.carBrandId
+        LEFT JOIN (select * from t_car_model where state = 1) as cm on cm.id = cc.carModelId
+        LEFT JOIN (select * from t_company where type = 2 and flag != 3) as c1 on c1.id = cc.companyId
+        LEFT JOIN (select * from t_company where type = 3 and flag != 3) as c2 on c2.id = cc.franchiseeId
+        LEFT JOIN (
+        SELECT
+        GROUP_CONCAT(case when type = 1 then '专车'
+        when type = 2 then '出租车'
+        when type = 3 then '跨城出行'
+        when type = 4 then '小件物流-同城'
+        when type = 5 then '小件物流-跨城'
+        when type = 6 then '包车'
+        else '' end ) as serverStr,carId from t_car_service GROUP BY carId) as ds on ds.carId = cc.id
+        LEFT JOIN (select * from t_driver where flag != 3) AS dd on dd.carId = cc.id) as o
+        <where>
+            o.state = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="id != null and id != ''">
+                and o.id  LIKE CONCAT('%',#{id},'%')
+            </if>
+            <if test="brandName != null and brandName != ''">
+                and o.brandName  LIKE CONCAT('%',#{brandName},'%')
+            </if>
+            <if test="modelName != null and modelName != ''">
+                and o.modelName  LIKE CONCAT('%',#{modelName},'%')
+            </if>
+            <if test="carColor != null and carColor != ''">
+                and o.carColor  LIKE CONCAT('%',#{carColor},'%')
+            </if>
+            <if test="serverStr != null and serverStr != ''">
+                and o.serverStr  LIKE CONCAT('%',#{serverStr},'%')
+            </if>
+            <if test="carLicensePlate != null and carLicensePlate != ''">
+                and o.carLicensePlate  LIKE CONCAT('%',#{carLicensePlate},'%')
+            </if>
+            <if test="driverName != null and driverName != ''">
+                and o.driverName  LIKE CONCAT('%',#{driverName},'%')
+            </if>
+            <if test="companyName != null and companyName != ''">
+                and o.companyName  LIKE CONCAT('%',#{companyName},'%')
+            </if>
+            <if test="franchiseeName != null and franchiseeName != ''">
+                and o.franchiseeName  LIKE CONCAT('%',#{franchiseeName},'%')
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.franchiseeId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.franchiseeId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+
+    <!--根据条件查询车辆列表不分页-->
+    <select id="getCarListNoPage" resultType="map">
+        SELECT * FROM (SELECT ds.serverStr,cb.`name` as brandName,cm.`name` as modelName,c1.`name` as companyName,c2.`name` as franchiseeName,cm.seat,dd.`name` as driverName,cc.* from t_car as cc
+        LEFT JOIN (select * from t_car_brand where state = 1) as cb on cb.id = cc.carBrandId
+        LEFT JOIN (select * from t_car_model where state = 1) as cm on cm.id = cc.carModelId
+        LEFT JOIN (select * from t_company where type = 2 and flag != 3) as c1 on c1.id = cc.companyId
+        LEFT JOIN (select * from t_company where type = 3 and flag != 3) as c2 on c2.id = cc.franchiseeId
+        LEFT JOIN (
+        SELECT
+        GROUP_CONCAT(case when type = 1 then '专车'
+        when type = 2 then '出租车'
+        when type = 3 then '跨城出行'
+        when type = 4 then '小件物流-同城'
+        when type = 5 then '小件物流-跨城'
+        when type = 6 then '包车'
+        else '' end ) as serverStr,carId from t_car_service GROUP BY carId) as ds on ds.carId = cc.id
+        LEFT JOIN (select * from t_driver where flag != 3) AS dd on dd.carId = cc.id) as o
+        <where>
+            o.state = 1
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.franchiseeId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.franchiseeId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarModelMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarModelMapper.xml
new file mode 100644
index 0000000..1923f05
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarModelMapper.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TCarModelMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TCarModel">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="remark" property="remark" />
+        <result column="insertTime" property="insertTime" />
+        <result column="state" property="state" />
+        <result column="seat" property="seat" />
+        <result column="brandId" property="brandId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, remark, insertTime, state, seat, brandId
+    </sql>
+
+    <!--根据条件查询车辆车型列表-->
+    <select id="getCarModelList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT cb.`name` as brandName,IFNULL(cc.num,0) as carNum,cm.* FROM t_car_model as cm
+        LEFT JOIN (select * from t_car_brand where state = 1) as cb on cb.id = cm.brandId
+        LEFT JOIN (SELECT COUNT(id) as num,carModelId from t_car where state = 1 GROUP BY carModelId) as cc on cc.carModelId = cm.id) as o
+        <where>
+            o.state = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="name != null and name != ''">
+                and o.name  LIKE CONCAT('%',#{name},'%')
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarServiceMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarServiceMapper.xml
new file mode 100644
index 0000000..45b3d0e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCarServiceMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TCarServiceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TCarService">
+        <id column="id" property="id" />
+        <result column="carId" property="carId" />
+        <result column="type" property="type" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, carId, type
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCompanyCityMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCompanyCityMapper.xml
new file mode 100644
index 0000000..85309e5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCompanyCityMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TCompanyCityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TCompanyCity">
+        <id column="id" property="id" />
+        <result column="companyId" property="companyId" />
+        <result column="provinceCode" property="provinceCode" />
+        <result column="cityCode" property="cityCode" />
+        <result column="areaCode" property="areaCode" />
+        <result column="state" property="state" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, companyId, provinceCode, cityCode, areaCode, state
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCompanyMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCompanyMapper.xml
new file mode 100644
index 0000000..974bde6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TCompanyMapper.xml
@@ -0,0 +1,635 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TCompanyMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TCompany">
+        <id column="id" property="id" />
+        <result column="isSpe" property="isSpe" />
+        <result column="isTaxi" property="isTaxi" />
+        <result column="isCross" property="isCross" />
+        <result column="isCrossLogistics" property="isCrossLogistics" />
+        <result column="isSameLogistics" property="isSameLogistics" />
+        <result column="isCharter" property="isCharter" />
+        <result column="isSpeFixedOrProportional" property="isSpeFixedOrProportional" />
+        <result column="isTaxiFixedOrProportional" property="isTaxiFixedOrProportional" />
+        <result column="isCrossLogisticsFixedOrProportional" property="isCrossLogisticsFixedOrProportional" />
+        <result column="isSameLogisticsFixedOrProportional" property="isSameLogisticsFixedOrProportional" />
+        <result column="speMoney" property="speMoney" />
+        <result column="taxiMoney" property="taxiMoney" />
+        <result column="crossLogisticsMoney" property="crossLogisticsMoney" />
+        <result column="sameLogisticsMoney" property="sameLogisticsMoney" />
+        <result column="isNeedFerry" property="isNeedFerry" />
+        <result column="name" property="name" />
+        <result column="type" property="type" />
+        <result column="superiorId" property="superiorId" />
+        <result column="principalName" property="principalName" />
+        <result column="principalPhone" property="principalPhone" />
+        <result column="adminName" property="adminName" />
+        <result column="adminPhone" property="adminPhone" />
+        <result column="urgentPhoen" property="urgentPhoen" />
+        <result column="setupTime" property="setupTime" />
+        <result column="identifier" property="identifier" />
+        <result column="addressCode" property="addressCode" />
+        <result column="businessScope" property="businessScope" />
+        <result column="contactAddress" property="contactAddress" />
+        <result column="documentAddress" property="documentAddress" />
+        <result column="economicType" property="economicType" />
+        <result column="regCapital" property="regCapital" />
+        <result column="legalName" property="legalName" />
+        <result column="legalId" property="legalId" />
+        <result column="legalPhone" property="legalPhone" />
+        <result column="legalPhotoUrl" property="legalPhotoUrl" />
+        <result column="licensingAgency" property="licensingAgency" />
+        <result column="licenseTime" property="licenseTime" />
+        <result column="licenseStartTime" property="licenseStartTime" />
+        <result column="licenseEndTime" property="licenseEndTime" />
+        <result column="licenseNumber" property="licenseNumber" />
+        <result column="carNum" property="carNum" />
+        <result column="driverNum" property="driverNum" />
+        <result column="mac" property="mac" />
+        <result column="state" property="state" />
+        <result column="flag" property="flag" />
+        <result column="upload" property="upload" />
+        <result column="insertTime" property="insertTime" />
+        <result column="detailAddress" property="detailAddress" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, isSpe, isTaxi, isCross, isCrossLogistics, isSameLogistics, isCharter, isSpeFixedOrProportional, isTaxiFixedOrProportional, isCrossLogisticsFixedOrProportional, isSameLogisticsFixedOrProportional, speMoney, taxiMoney, crossLogisticsMoney, sameLogisticsMoney, isNeedFerry, name, type, superiorId, principalName, principalPhone, adminName, adminPhone, urgentPhoen, setupTime, identifier, addressCode, businessScope, contactAddress, documentAddress, economicType, regCapital, legalName, legalId, legalPhone, legalPhotoUrl, licensingAgency, licenseTime, licenseStartTime, licenseEndTime, licenseNumber, carNum, driverNum, mac, state, flag, upload, insertTime, detailAddress
+    </sql>
+
+
+    <!--根据条件查询分公司列表-->
+    <select id="getCompanyList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT ui.account,IFNULL(ci.num,0) as franchiseeNum,IFNULL(ca.num,0) as carNumber,IFNULL(di.num,0) as driverNumber,
+        CONCAT(case when cc.isSpe = 1 then '专车,' else '' end,
+        case when cc.isTaxi = 1 then '出租车,' else '' end,
+        case when cc.isCross = 1 then '跨城出行,' else '' end,
+        case when cc.isCrossLogistics = 1 then '跨城小件物流,' else '' end,
+        case when cc.isSameLogistics = 1 then '同城小件物流,' else '' end,
+        case when cc.isCharter = 1 then '包车,' else '' end) as serverStr,
+        cc.* FROM t_company as cc
+        LEFT JOIN (SELECT * FROM sys_user where roleType = 2) as ui on ui.objectId = cc.id
+        LEFT JOIN (SELECT COUNT(id) as num,superiorId FROM t_company where type = 3 and flag != 3 GROUP BY superiorId) as ci on ci.superiorId = cc.id
+        LEFT JOIN (SELECT COUNT(id) as num,companyId FROM t_car where state = 1 GROUP BY companyId) as ca on ca.companyId = cc.id
+        LEFT JOIN (SELECT COUNT(id) as num,companyId FROM t_driver where flag != 3 GROUP BY companyId) as di on di.companyId = cc.id
+        ) as o
+        <where>
+            o.type = 2 and o.flag != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="name != null and name != ''">
+                and o.name  LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="principalName != null and principalName != ''">
+                and o.principalName  LIKE CONCAT('%',#{principalName},'%')
+            </if>
+            <if test="principalPhone != null and principalPhone != ''">
+                and o.principalPhone  LIKE CONCAT('%',#{principalPhone},'%')
+            </if>
+            <if test="adminName != null and adminName != ''">
+                and o.adminName  LIKE CONCAT('%',#{adminName},'%')
+            </if>
+            <if test="adminPhone != null and adminPhone != ''">
+                and o.adminPhone  LIKE CONCAT('%',#{adminPhone},'%')
+            </if>
+            <if test="serviceStr != null and serviceStr != ''">
+                and o.serverStr  LIKE CONCAT('%',#{serviceStr},'%')
+            </if>
+            <if test="state != null and state != '' and state == 1">
+                and o.state  = 1
+            </if>
+            <if test="state != null and state != '' and state == 2">
+                and o.state  = 0
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--根据公司ID获取公司经营区域-->
+    <select id="getCompanyScopeById" resultType="map">
+        SELECT CONCAT(case when r1.`name` is not null then r1.`name` else '' end,
+        case when r2.`name` is not null then r2.`name` else '' end,
+        case when r3.`name` is not null then r3.`name` else '' end) as value,cc.* FROM t_company_city as cc
+        LEFT JOIN t_region as r1 on r1.code = cc.provinceCode
+        LEFT JOIN t_region as r2 on r2.code = cc.cityCode
+        LEFT JOIN t_region as r3 on r3.code = cc.areaCode
+        where cc.companyId = #{id} and cc.state = 1 order by id asc
+    </select>
+
+    <!--根据条件查询加盟商列表-->
+    <select id="getFranchiseeList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT ui.account,ci.`name` as companyName,IFNULL(ca.num,0) as carNumber,IFNULL(di.num,0) as driverNumber,
+        CONCAT(case when cc.isSpe = 1 then '专车,' else '' end,
+        case when cc.isTaxi = 1 then '出租车,' else '' end,
+        case when cc.isCross = 1 then '跨城出行,' else '' end,
+        case when cc.isCrossLogistics = 1 then '跨城小件物流,' else '' end,
+        case when cc.isSameLogistics = 1 then '同城小件物流,' else '' end,
+        case when cc.isCharter = 1 then '包车,' else '' end) as serverStr,
+        cc.* FROM t_company as cc
+        LEFT JOIN (SELECT * FROM sys_user where roleType = 3) as ui on ui.objectId = cc.id
+        LEFT JOIN (select * from t_company where type = 2 and flag != 3) as ci on ci.id = cc.superiorId
+        LEFT JOIN (SELECT COUNT(id) as num,franchiseeId FROM t_car where state = 1 GROUP BY franchiseeId) as ca on ca.franchiseeId = cc.id
+        LEFT JOIN (SELECT COUNT(id) as num,franchiseeId FROM t_driver where flag != 3 GROUP BY franchiseeId) as di on di.franchiseeId = cc.id) as o
+        <where>
+            o.type = 3 and o.flag != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="name != null and name != ''">
+                and o.name  LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="account != null and account != ''">
+                and o.account  LIKE CONCAT('%',#{account},'%')
+            </if>
+            <if test="principalName != null and principalName != ''">
+                and o.principalName  LIKE CONCAT('%',#{principalName},'%')
+            </if>
+            <if test="principalPhone != null and principalPhone != ''">
+                and o.principalPhone  LIKE CONCAT('%',#{principalPhone},'%')
+            </if>
+            <if test="serviceStr != null and serviceStr != ''">
+                and o.serverStr  LIKE CONCAT('%',#{serviceStr},'%')
+            </if>
+            <if test="state != null and state != '' and state == 1">
+                and o.state  = 1
+            </if>
+            <if test="state != null and state != '' and state == 2">
+                and o.state  = 0
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and o.superiorId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+
+    <select id="queryOperationalData" resultType="map">
+
+        select
+        *,
+        ROUND(if(orderNum != 0, cancelNum / orderNum, 0) * 100, 2) as cancelProportion,
+        (onlinePay + offlinePay) as total,
+        ROUND((onlinePay / (onlinePay + offlinePay)) * 100, 2) as payProportion
+        from (
+            select
+            aa.time,
+            sum(aa.register) as register,
+            sum(aa.`online`) as `online`,
+            sum(aa.orderNum) as orderNum,
+            sum(aa.cancelNum) as cancelNum,
+            sum(aa.onlinePay) as onlinePay,
+            sum(aa.offlinePay) as offlinePay,
+            sum(aa.money) as money,
+            sum(aa.complaint) as complaint
+            from (
+            select DATE_FORMAT(insertTime, '%Y-%m-%d') as time, count(id) as register, 0 as `online`, 0 as orderNum, 0 as cancelNum, 0 as onlinePay, 0 as offlinePay, 0 as money, 0 as complaint
+            from t_user
+            where flag != 3 and state = 1
+            <if test="null != companyId">
+                and companyId = #{companyId}
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            group by DATE_FORMAT(insertTime, '%Y-%m-%d')
+            union all
+            select DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time, 0, count(a.id) as `online`, 0 as orderNum, 0 as cancelNum, 0 as onlinePay, 0 as offlinePay, 0 as money, 0 as complaint
+            from t_driver_online a
+            left join t_driver b on (a.driverId = b.id)
+            where 1 = 1
+            <if test="null != companyId">
+                and if(b.franchiseeId is null or b.franchiseeId = 0, b.companyId = #{companyId}, b.franchiseeId = #{companyId})
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            group by DATE_FORMAT(a.insertTime, '%Y-%m-%d')
+            union all
+            <if test="1 == type">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_private_car where isDelete = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="2 == type">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_taxi where isDelete = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="3 == type">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_cross_city where isDelete = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="4 == type">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_logistics where isDelete = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 1">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_private_car where isDelete = 1 and state in (10, 12)
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 2">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_taxi where isDelete = 1 and state in (10, 12)
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 3">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_cross_city where isDelete = 1 and state in (10, 12)
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 4">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_logistics where isDelete = 1 and state in (10, 12)
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 1">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_private_car where isDelete = 1 and payManner = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 2">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_taxi where isDelete = 1 and payManner = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 3">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_cross_city where isDelete = 1 and payManner = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 4">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_logistics where isDelete = 1 and payManner = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 1">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_private_car where isDelete = 1 and payManner = 2
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 2">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_taxi where isDelete = 1 and payManner = 2
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 3">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_cross_city where isDelete = 1 and payManner = 2
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 4">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_logistics where isDelete = 1 and payManner = 2
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            select DATE_FORMAT(a.insert_time, '%Y-%m-%d'), 0, 0, 0, 0, 0, 0, 0, count(a.id) from t_complaint a
+            left join t_driver b on (a.driverId = b.id)
+            where 1 = 1
+            <if test="null != companyId">
+                and if(b.franchiseeId is null or b.franchiseeId = 0, b.companyId = #{companyId}, b.franchiseeId = #{companyId})
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insert_time, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            group by DATE_FORMAT(a.insert_time, '%Y-%m-%d')
+            ) as aa group by aa.time
+        ) as da order by `time` desc
+        <if test="null != offset and null != limit">
+            limit #{offset}, #{limit}
+        </if>
+    </select>
+
+
+
+    <select id="queryOperationalDataCount" resultType="int">
+
+        select
+        count(`time`)
+        from (
+            select
+            aa.time,
+            sum(aa.register) as register,
+            sum(aa.`online`) as `online`,
+            sum(aa.orderNum) as orderNum,
+            sum(aa.cancelNum) as cancelNum,
+            sum(aa.onlinePay) as onlinePay,
+            sum(aa.offlinePay) as offlinePay,
+            sum(aa.money) as money,
+            sum(aa.complaint) as complaint
+            from (
+            select DATE_FORMAT(insertTime, '%Y-%m-%d') as time, count(id) as register, 0 as `online`, 0 as orderNum, 0 as cancelNum, 0 as onlinePay, 0 as offlinePay, 0 as money, 0 as complaint
+            from t_user
+            where flag != 3 and state = 1
+            <if test="null != companyId">
+                and companyId = #{companyId}
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            group by DATE_FORMAT(insertTime, '%Y-%m-%d')
+            union all
+            select DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time, 0, count(a.id) as `online`, 0 as orderNum, 0 as cancelNum, 0 as onlinePay, 0 as offlinePay, 0 as money, 0 as complaint from t_driver_online a
+            left join t_driver b on (a.driverId = b.id)
+            where 1 = 1
+            <if test="null != companyId">
+                and if(b.franchiseeId is null or b.franchiseeId = 0, b.companyId = #{companyId}, b.franchiseeId = #{companyId})
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            group by DATE_FORMAT(a.insertTime, '%Y-%m-%d')
+            union all
+            <if test="1 == type">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_private_car where isDelete = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="2 == type">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_taxi where isDelete = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="3 == type">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_cross_city where isDelete = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="4 == type">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_logistics where isDelete = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 1">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_private_car where isDelete = 1 and state in (10, 12)
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 2">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_taxi where isDelete = 1 and state in (10, 12)
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 3">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_cross_city where isDelete = 1 and state in (10, 12)
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 4">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_logistics where isDelete = 1 and state in (10, 12)
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 1">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_private_car where isDelete = 1 and payManner = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 2">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_taxi where isDelete = 1 and payManner = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 3">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_cross_city where isDelete = 1 and payManner = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 4">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_logistics where isDelete = 1 and payManner = 1
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 1">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_private_car where isDelete = 1 and payManner = 2
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 2">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_taxi where isDelete = 1 and payManner = 2
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 3">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_cross_city where isDelete = 1 and payManner = 2
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            <if test="type == 4">
+                select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_logistics where isDelete = 1 and payManner = 2
+                <if test="null != companyId">
+                    and companyId = #{companyId}
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                group by DATE_FORMAT(travelTime, '%Y-%m-%d')
+                union all
+            </if>
+            select DATE_FORMAT(a.insert_time, '%Y-%m-%d'), 0, 0, 0, 0, 0, 0, 0, count(a.id) from t_complaint a
+            left join t_driver b on (a.driverId = b.id)
+            where 1 = 1
+            <if test="null != companyId">
+                and if(b.franchiseeId is null or b.franchiseeId = 0, b.companyId = #{companyId}, b.franchiseeId = #{companyId})
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insert_time, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            group by DATE_FORMAT(a.insert_time, '%Y-%m-%d')
+            ) as aa group by aa.time
+        ) as da order by `time` desc
+    </select>
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TComplaintMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TComplaintMapper.xml
new file mode 100644
index 0000000..2c882fe
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TComplaintMapper.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TComplaintMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TComplaint">
+        <id column="id" property="id" />
+        <result column="userId" property="userId" />
+        <result column="reason" property="reason" />
+        <result column="driverId" property="driverId" />
+        <result column="description" property="description" />
+        <result column="isHandle" property="isHandle" />
+        <result column="insert_time" property="insertTime" />
+        <result column="handleResult" property="handleResult" />
+        <result column="handleUserId" property="handleUserId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userId, reason, driverId, description, isHandle, insert_time, handleResult, handleUserId
+    </sql>
+
+    <!--根据条件查询投诉列表-->
+    <select id="getComplaintList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT di.companyId,di.franchiseeId,ui.nickName as userName,ui.phone as userPhone,di.`name` as driverName,di.phone as driverPhone,si.`name` as handleUserName,cc.* FROM t_complaint as cc
+        LEFT JOIN (select * from t_user where flag != 3) as ui on ui.id = cc.userId
+        LEFT JOIN (select * from t_driver where flag != 3) as di on di.id = cc.driverId
+        LEFT JOIN sys_user as si on si.id = cc.handleUserId
+        ) as o
+        <where>
+            1 = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insert_time between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="userName != null and userName != ''">
+                and o.userName  LIKE CONCAT('%',#{userName},'%')
+            </if>
+            <if test="userPhone != null and userPhone != ''">
+                and o.userPhone  LIKE CONCAT('%',#{userPhone},'%')
+            </if>
+            <if test="driverPhone != null and driverPhone != ''">
+                and o.driverPhone  LIKE CONCAT('%',#{driverPhone},'%')
+            </if>
+            <if test="isHandle != null and isHandle != '' and isHandle == 2">
+                and o.isHandle = 0
+            </if>
+            <if test="isHandle != null and isHandle != '' and isHandle == 1">
+                and o.isHandle = 1
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and o.companyId = #{nowUserId} and (o.franchiseeId = 0 or o.franchiseeId is null)
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.franchiseeId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDispatchMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDispatchMapper.xml
new file mode 100644
index 0000000..fd5433c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDispatchMapper.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TDispatchMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TDispatch">
+        <id column="id" property="id" />
+        <result column="insertTime" property="insertTime" />
+        <result column="name" property="name" />
+        <result column="companyId" property="companyId" />
+        <result column="franchiseeId" property="franchiseeId" />
+        <result column="phone" property="phone" />
+        <result column="account" property="account" />
+        <result column="password" property="password" />
+        <result column="insertUserId" property="insertUserId" />
+        <result column="insertUserRole" property="insertUserRole" />
+        <result column="state" property="state" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, insertTime, name, companyId, franchiseeId, phone, account, password, insertUserId, insertUserRole, state
+    </sql>
+
+    <!--根据条件查询调度列表-->
+    <select id="getDispatchList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT c1.name as companyName,c2.name as franchiseeName,dd.* FROM t_dispatch as dd
+        LEFT JOIN (select * from t_company where type = 2 and flag != 3) as c1 on c1.id = dd.companyId
+        LEFT JOIN (select * from t_company where type = 3 and flag != 3) as c2 on c2.id = dd.franchiseeId) as o
+        <where>
+            o.state != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="name != null and name != ''">
+                and o.name  LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="companyName != null and companyName != ''">
+                and o.companyName  LIKE CONCAT('%',#{companyName},'%')
+            </if>
+            <if test="franchiseeName != null and franchiseeName != ''">
+                and o.franchiseeName  LIKE CONCAT('%',#{franchiseeName},'%')
+            </if>
+            <if test="account != null and account != ''">
+                and o.account  LIKE CONCAT('%',#{account},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.franchiseeId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.franchiseeId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverLineMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverLineMapper.xml
new file mode 100644
index 0000000..058240a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverLineMapper.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TDriverLineMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TDriverLine">
+        <id column="id" property="id" />
+        <result column="driverId" property="driverId" />
+        <result column="lineId" property="lineId" />
+        <result column="createTime" property="createTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, driverId, lineId, createTime
+    </sql>
+
+    <!--根据司机ID查询司机关联线路列表-->
+    <select id="getDriverLineListByDriverId" resultType="java.util.Map">
+        SELECT ll.`name` as lineName,dl.* FROM t_driver_line as dl
+        LEFT JOIN t_line as ll on ll.id = dl.lineId
+        where dl.driverId = #{driverId}
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverMapper.xml
new file mode 100644
index 0000000..de77126
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverMapper.xml
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TDriverMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TDriver">
+        <id column="id" property="id" />
+        <result column="account" property="account" />
+        <result column="jobNumber" property="jobNumber" />
+        <result column="phone" property="phone" />
+        <result column="password" property="password" />
+        <result column="name" property="name" />
+        <result column="sex" property="sex" />
+        <result column="idCard" property="idCard" />
+        <result column="companyId" property="companyId" />
+        <result column="headImgUrl" property="headImgUrl" />
+        <result column="faceImgUrl" property="faceImgUrl" />
+        <result column="idCardImgUrl1" property="idCardImgUrl1" />
+        <result column="idCardImgUrl2" property="idCardImgUrl2" />
+        <result column="placeOfEmployment" property="placeOfEmployment" />
+        <result column="birthday" property="birthday" />
+        <result column="bankCardNumber" property="bankCardNumber" />
+        <result column="driverNationality" property="driverNationality" />
+        <result column="driverNation" property="driverNation" />
+        <result column="driverMaritalStatus" property="driverMaritalStatus" />
+        <result column="driverLanguageLevel" property="driverLanguageLevel" />
+        <result column="driverEducation" property="driverEducation" />
+        <result column="driverCensus" property="driverCensus" />
+        <result column="driverAddress" property="driverAddress" />
+        <result column="driverContactAddress" property="driverContactAddress" />
+        <result column="driverAge" property="driverAge" />
+        <result column="driveCard" property="driveCard" />
+        <result column="driveCardImgUrl" property="driveCardImgUrl" />
+        <result column="driverType" property="driverType" />
+        <result column="getDriverLicenseDate" property="getDriverLicenseDate" />
+        <result column="driverLicenseOn" property="driverLicenseOn" />
+        <result column="driverLicenseOff" property="driverLicenseOff" />
+        <result column="taxiDriver" property="taxiDriver" />
+        <result column="taxiAptitudeCard" property="taxiAptitudeCard" />
+        <result column="networkCarlssueImg" property="networkCarlssueImg" />
+        <result column="networkCarlssueOrganization" property="networkCarlssueOrganization" />
+        <result column="networkCarlssueDate" property="networkCarlssueDate" />
+        <result column="getNetworkCarProofDate" property="getNetworkCarProofDate" />
+        <result column="networkCarProofOn" property="networkCarProofOn" />
+        <result column="networkCarProofOff" property="networkCarProofOff" />
+        <result column="registerDate" property="registerDate" />
+        <result column="fullTimeDriver" property="fullTimeDriver" />
+        <result column="inDriverBlacklist" property="inDriverBlacklist" />
+        <result column="commercialType" property="commercialType" />
+        <result column="contractCompany" property="contractCompany" />
+        <result column="contractOn" property="contractOn" />
+        <result column="contractOff" property="contractOff" />
+        <result column="emergencyContact" property="emergencyContact" />
+        <result column="emergencyContactPhone" property="emergencyContactPhone" />
+        <result column="emergencyContactAddress" property="emergencyContactAddress" />
+        <result column="remark" property="remark" />
+        <result column="isPlatCar" property="isPlatCar" />
+        <result column="carId" property="carId" />
+        <result column="authState" property="authState" />
+        <result column="state" property="state" />
+        <result column="flag" property="flag" />
+        <result column="insertTime" property="insertTime" />
+        <result column="insertUser" property="insertUser" />
+        <result column="updateTime" property="updateTime" />
+        <result column="updateUser" property="updateUser" />
+        <result column="addType" property="addType" />
+        <result column="laveBusinessMoney" property="laveBusinessMoney"/>
+        <result column="businessMoney" property="businessMoney"/>
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, account, jobNumber, phone, password, name, sex, idCard, companyId, headImgUrl, faceImgUrl, idCardImgUrl1, idCardImgUrl2, placeOfEmployment, birthday, bankCardNumber, driverNationality, driverNation, driverMaritalStatus, driverLanguageLevel, driverEducation, driverCensus, driverAddress, driverContactAddress, licenseCode, licenselImgUrl, driverAge, driveCard, driveCardImgUrl, driverType, getDriverLicenseDate, driverLicenseOn, driverLicenseOff, taxiDriver, taxiAptitudeCard, networkCarlssueImg, networkCarlssueOrganization, networkCarlssueDate, getNetworkCarProofDate, networkCarProofOn, networkCarProofOff, registerDate, fullTimeDriver, inDriverBlacklist, commercialType, contractCompany, contractOn, contractOff, emergencyContact, emergencyContactPhone, emergencyContactAddress, remark, isPlatCar, carId, authState, state, flag, insertTime, insertUser, updateTime, updateUser, addType
+    </sql>
+
+    <!--根据条件查询待审核司机列表-->
+    <select id="getAuthDriverList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT cc1.`name` as companyName,cc2.`name` as franchiseeName,ds.serverStr,dd.* from t_driver as dd
+        LEFT JOIN (select * from t_company where type = 2 and flag != 3) as cc1 on cc1.id = dd.companyId
+        LEFT JOIN (select * from t_company where type = 3 and flag != 3) as cc2 on cc2.id = dd.franchiseeId
+        LEFT JOIN (
+        SELECT
+        GROUP_CONCAT(case when type = 1 then '专车'
+        when type = 2 then '出租车'
+        when type = 3 then '跨城出行'
+        when type = 4 then '小件物流-同城'
+        when type = 5 then '小件物流-跨城'
+        when type = 6 then '包车'
+        else '' end ) as serverStr,driverId from t_driver_service GROUP BY driverId) as ds on ds.driverId = dd.id
+        ) as o
+        <where>
+            FIND_IN_SET(o.authState,'1,4') and o.flag != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="companyName != null and companyName != ''">
+                and (o.companyName  LIKE CONCAT('%',#{companyName},'%') or o.franchiseeName  LIKE CONCAT('%',#{companyName},'%'))
+            </if>
+            <if test="phone != null and phone != ''">
+                and o.phone  LIKE CONCAT('%',#{phone},'%')
+            </if>
+            <if test="account != null and account != ''">
+                and o.account  LIKE CONCAT('%',#{account},'%')
+            </if>
+            <if test="addType != null and addType != ''">
+                and o.addType = #{addType}
+            </if>
+            <if test="authState != null and authState != ''">
+                and o.authState = #{authState}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--根据用户ID获取用户详情-->
+    <select id="getDriverById" resultType="map">
+        SELECT cc.`name` as companyName,ds.serverStr,
+        case when dd.addType = 1 then '司机注册' when dd.addType = 2 then '平台添加' when dd.addType = 3 then '分公司添加' when dd.addType = 4 then '加盟商添加' else '' end as addTypeStr,
+        case when dd.sex = 1 then '男' when dd.sex = 2 then '女' else '' end as sexStr,
+        case when dd.authState = 1 then '待审核' when dd.authState = 2 then '正常' when dd.authState = 3 then '冻结' when dd.authState = 4 then '已拒绝' end as authStateStr,
+        dd.* from t_driver as dd
+        LEFT JOIN (select * from t_company where flag != 3) as cc on cc.id = dd.companyId
+        LEFT JOIN (
+        SELECT
+        GROUP_CONCAT(case when type = 1 then '专车'
+        when type = 2 then '出租车'
+        when type = 3 then '跨城出行'
+        when type = 4 then '小件物流-同城'
+        when type = 5 then '小件物流-跨城'
+        when type = 6 then '包车'
+        else '' end SEPARATOR '、') as serverStr,driverId from t_driver_service GROUP BY driverId) as ds on ds.driverId = dd.id
+        where dd.id = #{driverId}
+    </select>
+
+    <!--根据审核通过的司机列表-->
+    <select id="getDriverList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT cc1.`name` as companyName,cc2.`name` as franchiseeName,ci.carLicensePlate,ds.serverStr,IFNULL(oe.evaluateNum,0) as evaluateNum,
+        (IFNULL(ot1.taxiNum, 0) + IFNULL(ot3.num, 0) + IFNULL(ot5.num, 0) + IFNULL(ot7.num, 0)) as historyNum,(IFNULL(ot2.taxiMoney, 0)+ IFNULL(ot4.money, 0) + IFNULL(ot6.money, 0) + IFNULL(ot8.money, 0)) as historyMoney,dd.* from t_driver as dd
+        LEFT JOIN (select * from t_company where type = 2 and flag != 3) as cc1 on cc1.id = dd.companyId
+        LEFT JOIN (select * from t_company where type = 3 and flag != 3) as cc2 on cc2.id = dd.franchiseeId
+        LEFT JOIN (select * from t_car where state = 1) as ci on ci.id = dd.carId
+        LEFT JOIN (
+        SELECT
+        GROUP_CONCAT(case when type = 1 then '专车'
+        when type = 2 then '出租车'
+        when type = 3 then '跨城出行'
+        when type = 4 then '小件物流-同城'
+        when type = 5 then '小件物流-跨城'
+        when type = 6 then '包车'
+        else '' end ) as serverStr,driverId from t_driver_service GROUP BY driverId) as ds on ds.driverId = dd.id
+        LEFT JOIN (SELECT IFNULL(SUM(fraction)/COUNT(id),0) as evaluateNum,driverId FROM t_order_evaluate GROUP BY driverId) as oe on oe.driverId = dd.id
+        LEFT JOIN (SELECT COUNT(id) as taxiNum,driverId FROM t_order_taxi where FIND_IN_SET(state,'7,8,9') GROUP BY driverId) as ot1 on ot1.driverId = dd.id
+        LEFT JOIN (SELECT SUM(orderMoney) as taxiMoney,driverId FROM t_order_taxi where FIND_IN_SET(state,'7,8,9') GROUP BY driverId) as ot2 on ot2.driverId = dd.id
+        LEFT JOIN (SELECT COUNT(id) as num,driverId FROM t_order_private_car where FIND_IN_SET(state,'7,8,9') GROUP BY driverId) as ot3 on ot3.driverId = dd.id
+        LEFT JOIN (SELECT SUM(orderMoney) as money,driverId FROM t_order_private_car where FIND_IN_SET(state,'7,8,9') GROUP BY driverId) as ot4 on ot4.driverId = dd.id
+        LEFT JOIN (SELECT COUNT(id) as num,driverId FROM t_order_cross_city where FIND_IN_SET(state,'6,8,9') GROUP BY driverId) as ot5 on ot5.driverId = dd.id
+        LEFT JOIN (SELECT SUM(orderMoney) as money,driverId FROM t_order_cross_city where FIND_IN_SET(state,'6,8,9') GROUP BY driverId) as ot6 on ot6.driverId = dd.id
+        LEFT JOIN (SELECT COUNT(id) as num,driverId FROM t_order_logistics where FIND_IN_SET(state,'6,9') GROUP BY driverId) as ot7 on ot7.driverId = dd.id
+        LEFT JOIN (SELECT SUM(orderMoney) as money,driverId FROM t_order_logistics where FIND_IN_SET(state,'6,9') GROUP BY driverId) as ot8 on ot8.driverId = dd.id) as o
+        <where>
+            o.flag != 3
+            <if test="roleType != null and roleType != '' and roleType == 1">
+                and FIND_IN_SET(o.authState,'2,3')
+            </if>
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="companyName != null and companyName != ''">
+                and (o.companyName  LIKE CONCAT('%',#{companyName},'%') or o.franchiseeName  LIKE CONCAT('%',#{companyName},'%'))
+            </if>
+            <if test="phone != null and phone != ''">
+                and o.phone  LIKE CONCAT('%',#{phone},'%')
+            </if>
+            <if test="name != null and name != ''">
+                and o.name  LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="addType != null and addType != ''">
+                and o.addType = #{addType}
+            </if>
+            <if test="authState != null and authState != ''">
+                and o.authState = #{authState}
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.franchiseeId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.franchiseeId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--查询已被使用的车辆ID-->
+    <select id="getUseCarIdStr" resultType="java.lang.String">
+        SELECT GROUP_CONCAT(dd.carId) as carIdStr from t_driver as dd where dd.authState = 2 and dd.flag != 3
+        <if test="carId != null and carId != '' and carId != 0">
+            and dd.carId != #{carId}
+        </if>
+    </select>
+
+    <!--查询当前可被选择的车辆列表-->
+    <select id="getCanSelectCarList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT cm.`name` as modelName,cb.`name` as brandName,ds.serverStr,ci.* from t_car as ci
+        LEFT JOIN (select * from t_car_model where state = 1) as cm on cm.id = ci.carModelId
+        LEFT JOIN (select * from t_car_brand where state = 1) as cb on cb.id = ci.carBrandId
+        LEFT JOIN (
+        SELECT
+        GROUP_CONCAT(case when type = 1 then '专车'
+        when type = 2 then '出租车'
+        when type = 3 then '跨城出行'
+        when type = 4 then '小件物流-同城'
+        when type = 5 then '小件物流-跨城'
+        when type = 6 then '包车'
+        else '' end ) as serverStr,carId from t_car_service GROUP BY carId) as ds on ds.carId = ci.id) as o
+        <where>
+            o.state = 1
+            <if test="carIdStr != null and carIdStr != ''">
+                and not FIND_IN_SET(o.id,#{carIdStr})
+            </if>
+            <if test="carLicensePlate != null and carLicensePlate != ''">
+                and o.carLicensePlate  LIKE CONCAT('%',#{carLicensePlate},'%')
+            </if>
+            <if test="brandName != null and brandName != ''">
+                and o.brandName  LIKE CONCAT('%',#{brandName},'%')
+            </if>
+            <if test="modelName != null and modelName != ''">
+                and o.modelName  LIKE CONCAT('%',#{modelName},'%')
+            </if>
+            <if test="color != null and color != ''">
+                and o.carColor  LIKE CONCAT('%',#{color},'%')
+            </if>
+            <if test="serverStr != null and serverStr != ''">
+                and o.serverStr  LIKE CONCAT('%',#{serverStr},'%')
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.franchiseeId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where type = 3 and superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.franchiseeId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--修改分公司司机的状态-->
+    <update id="updateCompanyDriverState" parameterType="java.lang.Integer">
+        update t_driver
+        <set>
+            <if test="authState != null"> authState = #{authState} </if>
+        </set>
+        where companyId = #{companyId} and (franchiseeId = 0 or franchiseeId is null)
+    </update>
+
+    <!--修改加盟商司机的状态-->
+    <update id="updateFranchiseeDriverState" parameterType="java.lang.Integer">
+        update t_driver
+        <set>
+            <if test="authState != null"> authState = #{authState} </if>
+        </set>
+        where franchiseeId = #{franchiseeId}
+    </update>
+
+    <!--根据审核通过的司机列表无分页-->
+    <select id="getDriverListNoPage" resultType="map">
+        SELECT * FROM (SELECT cc1.`name` as companyName,cc2.`name` as franchiseeName,ci.carLicensePlate,ds.serverStr,IFNULL(oe.evaluateNum,0) as evaluateNum,
+        (IFNULL(ot1.taxiNum, 0) + IFNULL(ot3.num, 0) + IFNULL(ot5.num, 0)) as historyNum,(IFNULL(ot2.taxiMoney, 0)+ IFNULL(ot4.money, 0) + IFNULL(ot6.money, 0)) as historyMoney,dd.* from t_driver as dd
+        LEFT JOIN (select * from t_company where type = 2 and flag != 3) as cc1 on cc1.id = dd.companyId
+        LEFT JOIN (select * from t_company where type = 3 and flag != 3) as cc2 on cc2.id = dd.franchiseeId
+        LEFT JOIN (select * from t_car where state = 1) as ci on ci.id = dd.carId
+        LEFT JOIN (
+        SELECT
+        GROUP_CONCAT(case when type = 1 then '专车'
+        when type = 2 then '出租车'
+        when type = 3 then '跨城出行'
+        when type = 4 then '小件物流-同城'
+        when type = 5 then '小件物流-跨城'
+        when type = 6 then '包车'
+        else '' end ) as serverStr,driverId from t_driver_service GROUP BY driverId) as ds on ds.driverId = dd.id
+        LEFT JOIN (SELECT IFNULL(SUM(fraction)/COUNT(id),0) as evaluateNum,driverId FROM t_order_evaluate GROUP BY driverId) as oe on oe.driverId = dd.id
+        LEFT JOIN (SELECT COUNT(id) as taxiNum,driverId FROM t_order_taxi where FIND_IN_SET(state,'7,8,9') GROUP BY driverId) as ot1 on ot1.driverId = dd.id
+        LEFT JOIN (SELECT SUM(orderMoney) as taxiMoney,driverId FROM t_order_taxi where FIND_IN_SET(state,'8,9') GROUP BY driverId) as ot2 on ot2.driverId = dd.id
+        LEFT JOIN (SELECT COUNT(id) as num,driverId FROM t_order_private_car where FIND_IN_SET(state,'7,8,9') GROUP BY driverId) as ot3 on ot3.driverId = dd.id
+        LEFT JOIN (SELECT SUM(orderMoney) as money,driverId FROM t_order_private_car where FIND_IN_SET(state,'7,8,9') GROUP BY driverId) as ot4 on ot4.driverId = dd.id
+        LEFT JOIN (SELECT COUNT(id) as num,driverId FROM t_order_cross_city where FIND_IN_SET(state,'6,7,8') GROUP BY driverId) as ot5 on ot5.driverId = dd.id
+        LEFT JOIN (SELECT SUM(orderMoney) as money,driverId FROM t_order_cross_city where FIND_IN_SET(state,'6,7,8') GROUP BY driverId) as ot6 on ot6.driverId = dd.id
+        ) as o
+        <where>
+            o.flag != 3
+            <if test="roleType != null and roleType != '' and roleType == 1">
+                and FIND_IN_SET(o.authState,'2,3')
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.franchiseeId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.franchiseeId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverServiceMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverServiceMapper.xml
new file mode 100644
index 0000000..65793d6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverServiceMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TDriverServiceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TDriverService">
+        <id column="id" property="id" />
+        <result column="driverId" property="driverId" />
+        <result column="type" property="type" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, driverId, type
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TFeedbackMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TFeedbackMapper.xml
new file mode 100644
index 0000000..a7474d4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TFeedbackMapper.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TFeedbackMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TFeedback">
+        <id column="id" property="id" />
+        <result column="userId" property="userId" />
+        <result column="handleUserId" property="handleUserId" />
+        <result column="content" property="content" />
+        <result column="insertTime" property="insertTime" />
+        <result column="imgUrl" property="imgUrl" />
+        <result column="flag" property="flag" />
+        <result column="state" property="state" />
+        <result column="cldate" property="cldate" />
+        <result column="remark" property="remark" />
+        <result column="type" property="type" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userId, handleUserId, content, insertTime, imgUrl, flag, state, cldate, remark, type
+    </sql>
+
+    <!--根据条件查询用反馈记录列表-->
+    <select id="getFeedbackList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT dd.`name` as driverName,dd.phone as driverPhone,uu.`name` as userName,uu.phone as userPhone,su.`name` as handleUserName,
+        fb.* FROM t_feedback as fb
+        LEFT JOIN t_driver as dd on dd.id = fb.userId
+        LEFT JOIN t_user as uu on uu.id = fb.userId
+        LEFT JOIN sys_user as su on su.id = fb.handleUserId
+        ) as o
+        <where>
+            o.flag = 1
+            <if test="type != null and type != '' and type == 1">
+                and o.type = 1
+            </if>
+            <if test="type != null and type != '' and type == 2">
+                and o.type = 2
+            </if>
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="type != null and type != '' and type == 1">
+                <if test="name != null and name != ''">
+                    and o.userName  LIKE CONCAT('%',#{name},'%')
+                </if>
+                <if test="phone != null and phone != ''">
+                    and o.userPhone  LIKE CONCAT('%',#{phone},'%')
+                </if>
+            </if>
+            <if test="type != null and type != '' and type == 2">
+                <if test="name != null and name != ''">
+                    and o.driverName  LIKE CONCAT('%',#{name},'%')
+                </if>
+                <if test="phone != null and phone != ''">
+                    and o.driverPhone  LIKE CONCAT('%',#{phone},'%')
+                </if>
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TIntegralGoodsMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TIntegralGoodsMapper.xml
new file mode 100644
index 0000000..bfac1ed
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TIntegralGoodsMapper.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TIntegralGoodsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TIntegralGoods">
+        <id column="id" property="id" />
+        <result column="insertTime" property="insertTime" />
+        <result column="name" property="name" />
+        <result column="imgUrl" property="imgUrl" />
+        <result column="integral" property="integral" />
+        <result column="instructions" property="instructions" />
+        <result column="state" property="state" />
+        <result column="insertUserId" property="insertUserId" />
+        <result column="insertUserRole" property="insertUserRole" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, insertTime, name, imgUrl, integral, instructions, state, insertUserId, insertUserRole
+    </sql>
+
+    <!--根据条件查询积分商品列表-->
+    <select id="getIntegralGoodsList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM t_integral_goods as o
+        <where>
+            o.state != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="name != null and name != ''">
+                and o.name LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TIntegralOrderMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TIntegralOrderMapper.xml
new file mode 100644
index 0000000..f276866
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TIntegralOrderMapper.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TIntegralOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TIntegralOrder">
+        <id column="id" property="id" />
+        <result column="insertTime" property="insertTime" />
+        <result column="userId" property="userId" />
+        <result column="goodsId" property="goodsId" />
+        <result column="num" property="num" />
+        <result column="consigneeName" property="consigneeName" />
+        <result column="consigneePhone" property="consigneePhone" />
+        <result column="consigneeAddress" property="consigneeAddress" />
+        <result column="remark" property="remark" />
+        <result column="state" property="state" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, insertTime, userId, goodsId, num, consigneeName, consigneePhone, consigneeAddress, remark, state
+    </sql>
+
+    <!--根据条件查询兑换订单列表-->
+    <select id="getIntegralOrderList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT ui.nickName as userName,ig.`name` as goodsName,io.* FROM t_integral_order as io
+        LEFT JOIN t_user as ui on ui.id = io.userId
+        LEFT JOIN t_integral_goods as ig on ig.id = io.goodsId) as o
+        <where>
+            o.state != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="userName != null and userName != ''">
+                and o.userName LIKE CONCAT('%',#{userName},'%')
+            </if>
+            <if test="goodsName != null and goodsName != ''">
+                and o.goodsName LIKE CONCAT('%',#{goodsName},'%')
+            </if>
+            <if test="consigneeName != null and consigneeName != ''">
+                and o.consigneeName LIKE CONCAT('%',#{consigneeName},'%')
+            </if>
+            <if test="consigneePhone != null and consigneePhone != ''">
+                and o.consigneePhone LIKE CONCAT('%',#{consigneePhone},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TInvoiceMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TInvoiceMapper.xml
new file mode 100644
index 0000000..dbf4efd
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TInvoiceMapper.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TInvoiceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TInvoice">
+        <id column="id" property="id" />
+        <result column="money" property="money" />
+        <result column="orderNum" property="orderNum" />
+        <result column="type" property="type" />
+        <result column="name" property="name" />
+        <result column="code" property="code" />
+        <result column="content" property="content" />
+        <result column="remark" property="remark" />
+        <result column="address" property="address" />
+        <result column="bank" property="bank" />
+        <result column="email" property="email" />
+        <result column="userId" property="userId" />
+        <result column="state" property="state" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, money, orderNum, type, name, code, content, remark, address, bank, email, userId, state, insertTime
+    </sql>
+
+    <!--根据条件查询用开发票记录列表-->
+    <select id="getInvoiceList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM t_invoice as o
+        <where>
+            1 = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="email != null and email != ''">
+                and o.email  LIKE CONCAT('%',#{email},'%')
+            </if>
+            <if test="name != null and name != ''">
+                and o.name  LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="type != null and type != ''">
+                and o.type = #{type}
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineCompanyMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineCompanyMapper.xml
new file mode 100644
index 0000000..44edba5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineCompanyMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TLineCompanyMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TLineCompany">
+        <id column="id" property="id" />
+        <result column="lineId" property="lineId" />
+        <result column="companyId" property="companyId" />
+        <result column="insertTime" property="insertTime" />
+        <result column="insertUserId" property="insertUserId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, lineId, companyId, insertTime, insertUserId
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineMapper.xml
new file mode 100644
index 0000000..52db9f7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineMapper.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TLineMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TLine">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="shiftInterval" property="shiftInterval" />
+        <result column="rakeRate" property="rakeRate" />
+        <result column="state" property="state" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, shiftInterval, rakeRate, state, insertTime
+    </sql>
+
+    <!--根据条件查询线路列表-->
+    <select id="getLineList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT model.modelStr,IFNULL(ls.num,0) as shiftNum,su.`name` as insertUser,IFNULL(lc.num,0) as companyNum,ll.* FROM t_line as ll
+        LEFT JOIN (
+        SELECT GROUP_CONCAT(sc.`name` SEPARATOR '、') as modelStr,lp.lineId FROM t_line_price as lp
+        LEFT JOIN t_server_carmodel as sc on sc.id = lp.serverCarModelId
+        where sc.type = 2 and lp.state != 3 GROUP BY lp.lineId) as model on model.lineId = ll.id
+        LEFT JOIN (SELECT COUNT(id) as num,lineId FROM t_line_shift where state != 3 GROUP BY lineId) as ls on ls.lineId = ll.id
+        LEFT JOIN sys_user as su on su.id = ll.insertUserId
+        LEFT JOIN (SELECT COUNT(id) as num,lineId FROM t_line_company GROUP BY lineId) as lc on lc.lineId = ll.id
+        ) as o
+        <where>
+            o.state != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="name != null and name != ''">
+                and o.name LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="insertUser != null and insertUser != ''">
+                and o.insertUser LIKE CONCAT('%',#{insertUser},'%')
+            </if>
+            <if test="modelStr != null and modelStr != ''">
+                and o.modelStr LIKE CONCAT('%',#{modelStr},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--根据线路ID查询线路价格-->
+    <select id="getLinePriceList" resultType="java.util.Map">
+        SELECT sc.`name`,lp.* FROM t_line_price as lp
+        LEFT JOIN t_server_carmodel as sc on sc.id = lp.serverCarModelId
+        where lp.lineId = #{lineId} and lp.state != 3
+    </select>
+
+    <!--根据线路ID查询线路已分配公司-->
+    <select id="getLineCompanyList" resultType="java.util.Map">
+        SELECT cc.`name` as companyName,lc.* FROM t_line_company as lc
+        LEFT JOIN t_company as cc on cc.id = lc.companyId
+        where lc.lineId = #{lineId}
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLinePriceMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLinePriceMapper.xml
new file mode 100644
index 0000000..951c819
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLinePriceMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TLinePriceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TLinePrice">
+        <id column="id" property="id" />
+        <result column="lineId" property="lineId" />
+        <result column="serverCarModelId" property="serverCarModelId" />
+        <result column="type" property="type" />
+        <result column="content" property="content" />
+        <result column="contentStr" property="contentStr" />
+        <result column="state" property="state" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, lineId, serverCarModelId, type, content, contentStr, state, insertTime
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineShiftMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineShiftMapper.xml
new file mode 100644
index 0000000..e8ccd39
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineShiftMapper.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TLineShiftMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TLineShift">
+        <id column="id" property="id" />
+        <result column="lineId" property="lineId" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="carNum" property="carNum" />
+        <result column="state" property="state" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, lineId, startTime, endTime, carNum, state, insertTime
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineSiteMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineSiteMapper.xml
new file mode 100644
index 0000000..54778cb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLineSiteMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TLineSiteMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TLineSite">
+        <id column="id" property="id" />
+        <result column="lineId" property="lineId" />
+        <result column="siteId" property="siteId" />
+        <result column="type" property="type" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, lineId, siteId, type
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLocationMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLocationMapper.xml
new file mode 100644
index 0000000..b750328
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TLocationMapper.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TLocationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TLocation">
+        <id column="id" property="id" />
+        <result column="siteId" property="siteId" />
+        <result column="name" property="name" />
+        <result column="type" property="type" />
+        <result column="province" property="province" />
+        <result column="provinceCode" property="provinceCode" />
+        <result column="city" property="city" />
+        <result column="cityCode" property="cityCode" />
+        <result column="district" property="district" />
+        <result column="districtCode" property="districtCode" />
+        <result column="coordinate" property="coordinate" />
+        <result column="gid" property="gid"/>
+        <result column="updateTime" property="updateTime"/>
+        <result column="state" property="state" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, siteId, name, type, province, provinceCode, city, cityCode, district, districtCode, coordinate, state, insertTime
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TNoticesMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TNoticesMapper.xml
new file mode 100644
index 0000000..04bda1e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TNoticesMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TNoticesMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TNotices">
+        <id column="id" property="id" />
+        <result column="title" property="title" />
+        <result column="content" property="content" />
+        <result column="sort" property="sort" />
+        <result column="isShow" property="isShow" />
+        <result column="isBroadcast" property="isBroadcast" />
+        <result column="type" property="type" />
+        <result column="imgUrl" property="imgUrl" />
+        <result column="flag" property="flag" />
+        <result column="insertTime" property="insertTime" />
+        <result column="insertUser" property="insertUser" />
+        <result column="updateTime" property="updateTime" />
+        <result column="updateUser" property="updateUser" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, title, content, sort, isShow, isBroadcast, type, imgUrl, flag, insertTime, insertUser, updateTime, updateUser
+    </sql>
+
+    <!--根据条件查询滚动消息列表-->
+    <select id="getRollingNoticeList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM t_notices as o
+        <where>
+            o.type = #{typeValue} and o.isDelete = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="content != null and content != ''">
+                and o.content LIKE CONCAT('%',#{content},'%')
+            </if>
+        </where>
+        order by o.sort asc,o.insertTime desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCityBusinessMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCityBusinessMapper.xml
new file mode 100644
index 0000000..fff7e83
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCityBusinessMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TOpenCityBusinessMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TOpenCityBusiness">
+        <id column="id" property="id" />
+        <result column="openCityId" property="openCityId" />
+        <result column="businessType" property="businessType" />
+        <result column="sort" property="sort" />
+        <result column="flag" property="flag" />
+        <result column="insertTime" property="insertTime" />
+        <result column="insertUser" property="insertUser" />
+        <result column="updateTime" property="updateTime" />
+        <result column="updateUser" property="updateUser" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, openCityId, businessType, sort, flag, insertTime, insertUser, updateTime, updateUser
+    </sql>
+
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCityMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCityMapper.xml
new file mode 100644
index 0000000..d435fbb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCityMapper.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TOpenCityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TOpenCity">
+        <id column="id" property="id" />
+        <result column="code" property="code" />
+        <result column="lon" property="lon" />
+        <result column="lat" property="lat" />
+        <result column="isQualifications" property="isQualifications" />
+        <result column="areaName" property="areaName" />
+        <result column="cityName" property="cityName" />
+        <result column="provinceName" property="provinceName" />
+        <result column="flag" property="flag" />
+        <result column="insertTime" property="insertTime" />
+        <result column="insertUser" property="insertUser" />
+        <result column="updateTime" property="updateTime" />
+        <result column="updateUser" property="updateUser" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, code, lon, lat, isQualifications, areaName, cityName, provinceName, flag, insertTime, insertUser, updateTime, updateUser
+    </sql>
+
+    <!--根据条件查询开通城市列表-->
+    <select id="getOpenCityList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT ocb.str as business,oc.* FROM t_open_city as oc
+        LEFT JOIN (
+        SELECT GROUP_CONCAT(
+        CONCAT((case when businessType = 1 then '专车'
+        when businessType = 2 then '出租车'
+        when businessType = 3 then '跨城出行'
+        when businessType = 4 then '同城小件物流'
+        when businessType = 5 then '跨城小件物流'
+        when businessType = 6 then '包车'
+        else '' end),' :',sort)) as str,openCityId from t_open_city_business where flag != 3 GROUP BY openCityId
+        ) as ocb on ocb.openCityId = oc.id) as o
+        <where>
+            o.flag != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="condition != null and condition != ''">
+                and (o.areaName LIKE CONCAT('%',#{condition},'%') or o.cityName LIKE CONCAT('%',#{condition},'%') or o.provinceName LIKE CONCAT('%',#{condition},'%'))
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--根据城市ID获取经营业务-->
+    <select id="getBusinessByCityId" resultType="map">
+        SELECT DATE_FORMAT(bb.insertTime,'%Y-%m-%d') as insertTimeStr,
+        case when bb.businessType = 1 then '专车'
+        when bb.businessType = 2 then '出租车'
+        when bb.businessType = 3 then '跨城出行'
+        when bb.businessType = 4 then '同城小件物流'
+        when bb.businessType = 5 then '跨城小件物流'
+        when bb.businessType = 6 then '包车'
+        else '' end as businessTypeStr,bb.*
+        FROM t_open_city_business as bb where bb.openCityId = #{openCityId} and bb.flag != 3
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCharterMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCharterMapper.xml
new file mode 100644
index 0000000..df330fd
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCharterMapper.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TOrderCharterMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TOrderCharter">
+        <id column="id" property="id" />
+        <result column="insertTime" property="insertTime" />
+        <result column="userId" property="userId" />
+        <result column="useTime" property="useTime" />
+        <result column="useDuration" property="useDuration" />
+        <result column="useDemand" property="useDemand" />
+        <result column="contactName" property="contactName" />
+        <result column="contactPhone" property="contactPhone" />
+        <result column="remark" property="remark" />
+        <result column="state" property="state" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, insertTime, userId, useTime, useDuration, useDemand, contactName, contactPhone, remark, state
+    </sql>
+
+    <!--根据条件查询包车订单列表-->
+    <select id="getCharterOrderList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT ui.nickName as userName,ui.phone as userPhone,oc.* FROM t_order_charter as oc
+        LEFT JOIN t_user as ui on ui.id = oc.userId) as o
+        <where>
+            o.state != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="userName != null and userName != ''">
+                and o.userName  LIKE CONCAT('%',#{userName},'%')
+            </if>
+            <if test="contactName != null and contactName != ''">
+                and o.contactName  LIKE CONCAT('%',#{contactName},'%')
+            </if>
+            <if test="contactPhone != null and contactPhone != ''">
+                and o.contactPhone  LIKE CONCAT('%',#{contactPhone},'%')
+            </if>
+            <if test="useDemand != null and useDemand != ''">
+                and o.useDemand  LIKE CONCAT('%',#{useDemand},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCharteredCarMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCharteredCarMapper.xml
new file mode 100644
index 0000000..13208e0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCharteredCarMapper.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TOrderCharteredCarMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TOrderCharteredCar">
+        <id column="id" property="id" />
+        <result column="userId" property="userId" />
+        <result column="companyId" property="companyId" />
+        <result column="orderNumber" property="orderNumber" />
+        <result column="traveltime" property="traveltime" />
+        <result column="carTime" property="carTime" />
+        <result column="serverCarModelId" property="serverCarModelId" />
+        <result column="modelUse" property="modelUse" />
+        <result column="peopleNumber" property="peopleNumber" />
+        <result column="contactPerson" property="contactPerson" />
+        <result column="contactPhone" property="contactPhone" />
+        <result column="state" property="state" />
+        <result column="remark" property="remark" />
+        <result column="isDelete" property="isDelete" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userId, companyId, orderNumber, traveltime, carTime, serverCarModelId, modelUse, peopleNumber, contactPerson, contactPhone, state, remark, isDelete, insertTime
+    </sql>
+
+    <!--根据条件查询包车订单列表-->
+    <select id="getCharterCarOrderList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (
+        SELECT
+        ui.nickName as userName,
+        ui.phone as userPhone,
+        oc.* ,
+        sc.`name` as serverCarModel,
+        sc.price as price
+        FROM t_order_chartered_car as oc
+        LEFT JOIN t_user as ui on ui.id = oc.userId
+        LEFT JOIN t_server_carmodel as sc on (oc.serverCarModelId = sc.id)
+        ) as o
+        <where>
+            o.isDelete = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="userName != null and userName != ''">
+                and o.userName  LIKE CONCAT('%',#{userName},'%')
+            </if>
+            <if test="contactPerson != null and contactPerson != ''">
+                and o.contactPerson  LIKE CONCAT('%',#{contactPerson},'%')
+            </if>
+            <if test="contactPhone != null and contactPhone != ''">
+                and o.contactPhone  LIKE CONCAT('%',#{contactPhone},'%')
+            </if>
+            <if test="modelUse != null and modelUse != ''">
+                and o.modelUse  LIKE CONCAT('%',#{modelUse},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.companyId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.companyId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCrossCityMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCrossCityMapper.xml
new file mode 100644
index 0000000..74d2fe5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderCrossCityMapper.xml
@@ -0,0 +1,240 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TOrderCrossCityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TOrderCrossCity">
+        <id column="id" property="id" />
+        <result column="userId" property="userId" />
+        <result column="driverId" property="driverId" />
+        <result column="lineId" property="lineId" />
+        <result column="lineShiftDriverId" property="lineShiftDriverId"/>
+        <result column="carId" property="carId" />
+        <result column="serverCarModelId" property="serverCarModelId" />
+        <result column="orderNum" property="orderNum" />
+        <result column="placementLon" property="placementLon" />
+        <result column="placementLat" property="placementLat" />
+        <result column="placementAddress" property="placementAddress" />
+        <result column="startLon" property="startLon" />
+        <result column="startLat" property="startLat" />
+        <result column="endLon" property="endLon" />
+        <result column="startAddress" property="startAddress" />
+        <result column="endLat" property="endLat" />
+        <result column="endAddress" property="endAddress" />
+        <result column="boardingLon" property="boardingLon" />
+        <result column="boardingLat" property="boardingLat" />
+        <result column="boardingAddress" property="boardingAddress" />
+        <result column="boardingTime" property="boardingTime" />
+        <result column="getoffLon" property="getoffLon" />
+        <result column="getoffLat" property="getoffLat" />
+        <result column="getoffAddress" property="getoffAddress" />
+        <result column="getoffTime" property="getoffTime" />
+        <result column="mileage" property="mileage" />
+        <result column="payManner" property="payManner" />
+        <result column="payType" property="payType" />
+        <result column="orderMoney" property="orderMoney" />
+        <result column="redPacketMoney" property="redPacketMoney" />
+        <result column="couponMoney" property="couponMoney" />
+        <result column="redPacketId" property="redPacketId" />
+        <result column="couponId" property="couponId" />
+        <result column="discount" property="discount" />
+        <result column="discountMoney" property="discountMoney" />
+        <result column="activityId" property="activityId" />
+        <result column="companyId" property="companyId" />
+        <result column="payMoney" property="payMoney" />
+        <result column="passengers" property="passengers" />
+        <result column="passengersPhone" property="passengersPhone" />
+        <result column="sort" property="sort" />
+        <result column="insertTime" property="insertTime" />
+        <result column="travelTime" property="travelTime" />
+        <result column="snatchOrderTime" property="snatchOrderTime" />
+        <result column="setOutTime" property="setOutTime" />
+        <result column="arriveTime" property="arriveTime" />
+        <result column="startServiceTime" property="startServiceTime" />
+        <result column="endServiceTime" property="endServiceTime" />
+        <result column="travelMode" property="travelMode" />
+        <result column="orderSource" property="orderSource" />
+        <result column="invoiceId" property="invoiceId" />
+        <result column="trackId" property="trackId" />
+        <result column="state" property="state" />
+        <result column="isReassign" property="isReassign"/>
+        <result column="isDelete" property="isDelete" />
+        <result column="telX" property="telX" />
+        <result column="bindId" property="bindId" />
+        <result column="peopleNumber" property="peopleNumber"/>
+        <result column="seatNumber" property="seatNumber"/>
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userId, driverId, lineId, carId, serverCarModelId, orderNum, placementLon, placementLat, placementAddress, startLon, startLat, endLon, startAddress, endLat, endAddress, boardingLon, boardingLat, boardingAddress, boardingTime, getoffLon, getoffLat, getoffAddress, getoffTime, mileage, payManner, payType, orderMoney, redPacketMoney, couponMoney, redPacketId, couponId, discount, discountMoney, activityId, companyId, payMoney, passengers, passengersPhone, sort, insertTime, travelTime, snatchOrderTime, setOutTime, arriveTime, startServiceTime, endServiceTime, travelMode, orderSource, invoiceId, trackId, state, isDelete, telX, bindId
+    </sql>
+
+    <!--根据条件查询跨城出行订单列表-->
+    <select id="getCrossCityOrderList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (
+        SELECT ui.nickName as userName,ui.phone as userPhone,CONCAT(di.`name`,'-',di.phone) as driver,CONCAT(cb.`name`,'-',ci.carLicensePlate) as car,
+        sc.`name` as serverCarModel,ll.`name` as lineName,ot.* FROM t_order_cross_city as ot
+        LEFT JOIN t_user as ui on ui.id = ot.userId
+        LEFT JOIN t_driver as di on di.id = ot.driverId
+        LEFT JOIN t_car as ci on ci.id= ot.carId
+        LEFT JOIN t_car_brand as cb on cb.id = ci.carBrandId
+        LEFT JOIN t_server_carmodel as sc on sc.id = ot.serverCarModelId
+        LEFT JOIN t_line as ll on ll.id = ot.lineId
+        ) as o
+        <where>
+            o.isDelete = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="orderNum != null and orderNum != ''">
+                and o.orderNum  LIKE CONCAT('%',#{orderNum},'%')
+            </if>
+            <if test="orderSource != null and orderSource != ''">
+                and o.orderSource = #{orderSource}
+            </if>
+            <if test="userName != null and userName != ''">
+                and o.userName  LIKE CONCAT('%',#{userName},'%')
+            </if>
+            <if test="userPhone != null and userPhone != ''">
+                and o.userPhone  LIKE CONCAT('%',#{userPhone},'%')
+            </if>
+            <if test="passengers != null and passengers != ''">
+                and o.passengers  LIKE CONCAT('%',#{passengers},'%')
+            </if>
+            <if test="passengersPhone != null and passengersPhone != ''">
+                and o.passengersPhone  LIKE CONCAT('%',#{passengersPhone},'%')
+            </if>
+            <if test="serverCarModelId != null and serverCarModelId != ''">
+                and o.serverCarModelId  = #{serverCarModelId}
+            </if>
+            <if test="driver != null and driver != ''">
+                and o.driver  LIKE CONCAT('%',#{driver},'%')
+            </if>
+            <if test="lineId != null and lineId != ''">
+                and o.lineId = #{lineId}
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.companyId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.companyId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--根据跨城出行订单ID获取跨城出行订单详情-->
+    <select id="getCrossCityOrderDetailById" resultType="map">
+        SELECT
+        DATE_FORMAT(ot.insertTime,'%Y-%m-%d %H:%i') as insertTimeStr,
+        DATE_FORMAT(ot.travelTime,'%Y-%m-%d %H:%i') as travelTimeStr,
+        DATE_FORMAT(ot.boardingTime,'%Y-%m-%d %H:%i') as boardingTimeStr,
+        DATE_FORMAT(ot.getoffTime,'%Y-%m-%d %H:%i') as getoffTimeStr,
+        case when ot.orderSource = 1 then 'APP下单'
+        when ot.orderSource = 2 then '扫码下单'
+        when ot.orderSource = 3 then '小程序下单'
+        when ot.orderSource = 4 then '司机下单'
+        when ot.orderSource = 5 then '调度下单' else '' end orderSourceStr,
+        ui.nickName as userName,ui.phone as userPhone,
+        case when ot.payType = 1 then '微信'
+        when ot.payType = 2 then '支付宝'
+        when ot.payType = 3 then '余额' else '' end as payTypeStr,
+        sc.`name` as serverCarModel,
+        CONCAT(di.`name`,'-',di.phone) as driver,
+        CONCAT(cb.`name`,'-',ci.carLicensePlate) as car,
+		ll.`name` as lineName,
+        cc.`name` as companyName,ot.*
+        FROM t_order_cross_city as ot
+        LEFT JOIN t_user as ui on ui.id = ot.userId
+        LEFT JOIN t_driver as di on di.id = ot.driverId
+        LEFT JOIN t_car as ci on ci.id= ot.carId
+        LEFT JOIN t_car_brand as cb on cb.id = ci.carBrandId
+        LEFT JOIN t_company as cc on cc.id = ot.companyId
+        LEFT JOIN t_server_carmodel as sc on sc.id = ot.serverCarModelId
+		LEFT JOIN t_line as ll on ll.id = ot.lineId
+        where ot.id = #{orderId}
+    </select>
+
+
+    <select id="queryOrders" resultType="TOrderCrossCity">
+        select
+        id as id,
+        userId as userId,
+        serverCarModelId as serverCarModelId,
+        driverId as driverId,
+        lineId as lineId,
+        lineShiftDriverId as lineShiftDriverId,
+        carId as carId,
+        orderNum as orderNum,
+        placementLon as placementLon,
+        placementLat as placementLat,
+        placementAddress as placementAddress,
+        startLon as startLon,
+        startLat as startLat,
+        startAddress as startAddress,
+        endLon as endLon,
+        endLat as endLat,
+        endAddress as endAddress,
+        boardingLon as boardingLon,
+        boardingLat as boardingLat,
+        boardingAddress as boardingAddress,
+        boardingTime as boardingTime,
+        getoffLon as getoffLon,
+        getoffLat as getoffLat,
+        getoffAddress as getoffAddress,
+        getoffTime as getoffTime,
+        mileage as mileage,
+        payManner as payManner,
+        payType as payType,
+        orderMoney as orderMoney,
+        redPacketMoney as redPacketMoney,
+        couponMoney as couponMoney,
+        redPacketId as redPacketId,
+        couponId as couponId,
+        discount as discount,
+        discountMoney as discountMoney,
+        activityId as activityId,
+        companyId as companyId,
+        payMoney as payMoney,
+        passengers as passengers,
+        passengersPhone as passengersPhone,
+        peopleNumber as peopleNumber,
+        seatNumber as seatNumber,
+        sort as sort,
+        state as state,
+        insertTime as insertTime,
+        travelTime as travelTime,
+        snatchOrderTime as snatchOrderTime,
+        setOutTime as setOutTime,
+        arriveTime as arriveTime,
+        startServiceTime as startServiceTime,
+        endServiceTime as endServiceTime,
+        travelMode as travelMode,
+        orderSource as orderSource,
+        isReassign as isReassign,
+        reassignNotice as reassignNotice,
+        invoiceId as invoiceId,
+        trackId as trackId,
+        isDelete as isDelete,
+        oldState as oldState,
+        telX as telX,
+        bindId as bindId
+        from t_order_cross_city where isDelete = 1
+        <if test="null != driverId">
+            and driverId = #{driverId}
+        </if>
+        <if test="null != lineShiftDriverId">
+            and lineShiftDriverId = #{lineShiftDriverId}
+        </if>
+        <if test="null != state">
+            and state in
+            <foreach collection="state" item="item" index="index" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderEvaluateMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderEvaluateMapper.xml
new file mode 100644
index 0000000..982c99b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderEvaluateMapper.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TOrderEvaluateMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TOrderEvaluate">
+        <id column="id" property="id" />
+        <result column="orderId" property="orderId" />
+        <result column="driverId" property="driverId" />
+        <result column="orderType" property="orderType" />
+        <result column="fraction" property="fraction" />
+        <result column="content" property="content" />
+        <result column="insertTime" property="insertTime" />
+        <result column="userId" property="userId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, orderId, driverId, orderType, fraction, content, insertTime, userId
+    </sql>
+
+    <!--根据条件查询评价列表-->
+    <select id="getOrderEvaluateList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT di.companyId,di.franchiseeId,ui.nickName as userName,ui.phone as userPhone,di.`name` as driverName,di.phone as driverPhone,oe.* FROM t_order_evaluate as oe
+        LEFT JOIN t_user as ui on ui.id = oe.userId
+        LEFT JOIN t_driver as di on di.id = oe.driverId) as o
+        <where>
+            1 = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="userName != null and userName != ''">
+                and o.userName  LIKE CONCAT('%',#{userName},'%')
+            </if>
+            <if test="userPhone != null and userPhone != ''">
+                and o.userPhone  LIKE CONCAT('%',#{userPhone},'%')
+            </if>
+            <if test="driverName != null and driverName != ''">
+                and o.driverName  LIKE CONCAT('%',#{driverName},'%')
+            </if>
+            <if test="driverPhone != null and driverPhone != ''">
+                and o.driverPhone  LIKE CONCAT('%',#{driverPhone},'%')
+            </if>
+            <if test="fraction != null and fraction != ''">
+                and o.fraction  LIKE CONCAT('%',#{fraction},'%')
+            </if>
+            <if test="orderType != null and orderType != ''">
+                and o.orderType = #{orderType}
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and o.companyId = #{nowUserId} and (o.franchiseeId = 0 or o.franchiseeId is null)
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.franchiseeId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderLogisticsMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderLogisticsMapper.xml
new file mode 100644
index 0000000..26c25ae
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderLogisticsMapper.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TOrderLogisticsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TOrderLogistics">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="userId" property="userId" />
+        <result column="driverId" property="driverId" />
+        <result column="carId" property="carId" />
+        <result column="orderNum" property="orderNum" />
+        <result column="cargoType" property="cargoType" />
+        <result column="cargoNumber" property="cargoNumber" />
+        <result column="remark" property="remark" />
+        <result column="placementLon" property="placementLon" />
+        <result column="placementLat" property="placementLat" />
+        <result column="placementAddress" property="placementAddress" />
+        <result column="startLon" property="startLon" />
+        <result column="startLat" property="startLat" />
+        <result column="startAddress" property="startAddress" />
+        <result column="endLon" property="endLon" />
+        <result column="endLat" property="endLat" />
+        <result column="endAddress" property="endAddress" />
+        <result column="recipient" property="recipient" />
+        <result column="recipientPhone" property="recipientPhone" />
+        <result column="boardingLon" property="boardingLon" />
+        <result column="boardingLat" property="boardingLat" />
+        <result column="boardingAddress" property="boardingAddress" />
+        <result column="boardingTime" property="boardingTime" />
+        <result column="getoffLon" property="getoffLon" />
+        <result column="getoffLat" property="getoffLat" />
+        <result column="getoffAddress" property="getoffAddress" />
+        <result column="getoffTime" property="getoffTime" />
+        <result column="mileage" property="mileage" />
+        <result column="payManner" property="payManner" />
+        <result column="payType" property="payType" />
+        <result column="orderMoney" property="orderMoney" />
+        <result column="travelMoney" property="travelMoney" />
+        <result column="tipMoney" property="tipMoney" />
+        <result column="redPacketMoney" property="redPacketMoney" />
+        <result column="couponMoney" property="couponMoney" />
+        <result column="redPacketId" property="redPacketId" />
+        <result column="couponId" property="couponId" />
+        <result column="discount" property="discount" />
+        <result column="discountMoney" property="discountMoney" />
+        <result column="activityId" property="activityId" />
+        <result column="companyId" property="companyId" />
+        <result column="payMoney" property="payMoney" />
+        <result column="state" property="state" />
+        <result column="insertTime" property="insertTime" />
+        <result column="travelTime" property="travelTime" />
+        <result column="snatchOrderTime" property="snatchOrderTime" />
+        <result column="setOutTime" property="setOutTime" />
+        <result column="arriveTime" property="arriveTime" />
+        <result column="startServiceTime" property="startServiceTime" />
+        <result column="endServiceTime" property="endServiceTime" />
+        <result column="orderSource" property="orderSource" />
+        <result column="invoiceId" property="invoiceId" />
+        <result column="trackId" property="trackId" />
+        <result column="isDelete" property="isDelete" />
+        <result column="oldState" property="oldState"/>
+        <result column="telX" property="telX" />
+        <result column="bindId" property="bindId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, type, userId, driverId, carId, orderNum, cargoType, cargoNumber, remark, placementLon, placementLat, placementAddress, startLon, startLat, startAddress, endLon, endLat, endAddress, recipient, recipientPhone, boardingLon, boardingLat, boardingAddress, boardingTime, getoffLon, getoffLat, getoffAddress, getoffTime, mileage, payManner, payType, orderMoney, travelMoney, tipMoney, redPacketMoney, couponMoney, redPacketId, couponId, discount, discountMoney, activityId, companyId, payMoney, state, insertTime, travelTime, snatchOrderTime, setOutTime, arriveTime, startServiceTime, endServiceTime, orderSource, invoiceId, trackId, isDelete, telX, bindId
+    </sql>
+
+    <!--根据条件查询小件物流订单列表-->
+    <select id="getLogisticsOrderList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT ui.nickName as userName,ui.phone as userPhone,CONCAT(di.`name`,'-',di.phone) as driver,CONCAT(cb.`name`,'-',ci.carLicensePlate) as car,
+        ot.* FROM t_order_logistics as ot
+        LEFT JOIN t_user as ui on ui.id = ot.userId
+        LEFT JOIN t_driver as di on di.id = ot.driverId
+        LEFT JOIN t_car as ci on ci.id= ot.carId
+        LEFT JOIN t_car_brand as cb on cb.id = ci.carBrandId) as o
+        <where>
+            o.isDelete = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="orderNum != null and orderNum != ''">
+                and o.orderNum  LIKE CONCAT('%',#{orderNum},'%')
+            </if>
+            <if test="orderSource != null and orderSource != ''">
+                and o.orderSource = #{orderSource}
+            </if>
+            <if test="type != null and type != ''">
+                and o.type = #{type}
+            </if>
+            <if test="userName != null and userName != ''">
+                and o.userName  LIKE CONCAT('%',#{userName},'%')
+            </if>
+            <if test="userPhone != null and userPhone != ''">
+                and o.userPhone  LIKE CONCAT('%',#{userPhone},'%')
+            </if>
+            <if test="recipient != null and recipient != ''">
+                and o.recipient  LIKE CONCAT('%',#{recipient},'%')
+            </if>
+            <if test="recipientPhone != null and recipientPhone != ''">
+                and o.recipientPhone  LIKE CONCAT('%',#{recipientPhone},'%')
+            </if>
+            <if test="driver != null and driver != ''">
+                and o.driver  LIKE CONCAT('%',#{driver},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.companyId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.companyId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--根据专车订单ID获取小件物流订单详情-->
+    <select id="getLogisticsOrderDetailById" resultType="map">
+        SELECT
+        DATE_FORMAT(ot.insertTime,'%Y-%m-%d %H:%i') as insertTimeStr,
+        DATE_FORMAT(ot.travelTime,'%Y-%m-%d %H:%i') as travelTimeStr,
+        case when ot.orderSource = 1 then 'APP下单'
+        when ot.orderSource = 2 then '扫码下单'
+        when ot.orderSource = 3 then '小程序下单'
+        when ot.orderSource = 4 then '司机下单'
+        when ot.orderSource = 5 then '调度下单' else '' end orderSourceStr,
+        case when ot.payType = 1 then '微信'
+        when ot.payType = 2 then '支付宝'
+        when ot.payType = 3 then '余额' else '' end as payTypeStr,
+        ui.nickName as userName,ui.phone as userPhone,
+        CONCAT(di.`name`,'-',di.phone) as driver,CONCAT(cb.`name`,'-',ci.carLicensePlate) as car,
+        ot.* FROM t_order_logistics as ot
+        LEFT JOIN t_user as ui on ui.id = ot.userId
+        LEFT JOIN t_driver as di on di.id = ot.driverId
+        LEFT JOIN t_car as ci on ci.id= ot.carId
+        LEFT JOIN t_car_brand as cb on cb.id = ci.carBrandId
+        LEFT JOIN t_company as cc on cc.id = ot.companyId
+        where ot.id = #{orderId}
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPositionMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPositionMapper.xml
new file mode 100644
index 0000000..7a48175
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPositionMapper.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TOrderPositionMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TOrderPosition">
+        <id column="id" property="id" />
+        <result column="orderType" property="orderType" />
+        <result column="orderId" property="orderId" />
+        <result column="driverId" property="driverId" />
+        <result column="lon" property="lon" />
+        <result column="lat" property="lat" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, orderType, orderId, driverId, lon, lat, insertTime
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml
new file mode 100644
index 0000000..ac20118
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TOrderPrivateCarMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TOrderPrivateCar">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="userId" property="userId" />
+        <result column="driverId" property="driverId" />
+        <result column="carId" property="carId" />
+        <result column="orderNum" property="orderNum" />
+        <result column="placementLon" property="placementLon" />
+        <result column="placementLat" property="placementLat" />
+        <result column="placementAddress" property="placementAddress" />
+        <result column="startLon" property="startLon" />
+        <result column="startLat" property="startLat" />
+        <result column="endLon" property="endLon" />
+        <result column="startAddress" property="startAddress" />
+        <result column="endLat" property="endLat" />
+        <result column="endAddress" property="endAddress" />
+        <result column="boardingLon" property="boardingLon" />
+        <result column="boardingLat" property="boardingLat" />
+        <result column="boardingAddress" property="boardingAddress" />
+        <result column="boardingTime" property="boardingTime" />
+        <result column="getoffLon" property="getoffLon" />
+        <result column="getoffLat" property="getoffLat" />
+        <result column="getoffAddress" property="getoffAddress" />
+        <result column="getoffTime" property="getoffTime" />
+        <result column="mileage" property="mileage" />
+        <result column="payManner" property="payManner" />
+        <result column="payType" property="payType" />
+        <result column="orderMoney" property="orderMoney" />
+        <result column="startMoney" property="startMoney" />
+        <result column="mileageMoney" property="mileageMoney" />
+        <result column="durationMoney" property="durationMoney" />
+        <result column="longDistanceMoney" property="longDistanceMoney" />
+        <result column="parkMoney" property="parkMoney" />
+        <result column="roadTollMoney" property="roadTollMoney" />
+        <result column="redPacketMoney" property="redPacketMoney" />
+        <result column="couponMoney" property="couponMoney" />
+        <result column="redPacketId" property="redPacketId" />
+        <result column="couponId" property="couponId" />
+        <result column="discount" property="discount" />
+        <result column="discountMoney" property="discountMoney" />
+        <result column="activityId" property="activityId" />
+        <result column="companyId" property="companyId" />
+        <result column="payMoney" property="payMoney" />
+        <result column="substitute" property="substitute" />
+        <result column="passengers" property="passengers" />
+        <result column="passengersPhone" property="passengersPhone" />
+        <result column="state" property="state" />
+        <result column="insertTime" property="insertTime" />
+        <result column="travelTime" property="travelTime" />
+        <result column="snatchOrderTime" property="snatchOrderTime" />
+        <result column="setOutTime" property="setOutTime" />
+        <result column="arriveTime" property="arriveTime" />
+        <result column="startServiceTime" property="startServiceTime" />
+        <result column="endServiceTime" property="endServiceTime" />
+        <result column="orderType" property="orderType" />
+        <result column="orderSource" property="orderSource" />
+        <result column="invoiceId" property="invoiceId" />
+        <result column="isReassign" property="isReassign" />
+        <result column="reassignNotice" property="reassignNotice" />
+        <result column="trackId" property="trackId" />
+        <result column="isDelete" property="isDelete" />
+        <result column="oldState" property="oldState" />
+        <result column="telX" property="telX" />
+        <result column="bindId" property="bindId" />
+        <result column="serverCarModelId" property="serverCarModelId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, type, userId, driverId, carId, orderNum, placementLon, placementLat, placementAddress, startLon, startLat, endLon, startAddress, endLat, endAddress, boardingLon, boardingLat, boardingAddress, boardingTime, getoffLon, getoffLat, getoffAddress, getoffTime, mileage, payManner, payType, orderMoney, startMoney, mileageMoney, durationMoney, longDistanceMoney, parkMoney, roadTollMoney, redPacketMoney, couponMoney, redPacketId, couponId, discount, discountMoney, activityId, companyId, payMoney, substitute, passengers, passengersPhone, state, insertTime, travelTime, snatchOrderTime, setOutTime, arriveTime, startServiceTime, endServiceTime, orderType, orderSource, invoiceId, isReassign, reassignNotice, trackId, isDelete, oldState, telX, bindId, serverCarModelId
+    </sql>
+
+    <!--根据条件查询专车订单列表-->
+    <select id="getPrivateCarOrderList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT ui.nickName as userName,ui.phone as userPhone,CONCAT(di.`name`,'-',di.phone) as driver,CONCAT(cb.`name`,'-',ci.carLicensePlate) as car,
+        sc.`name` as serverCarModel,ot.* FROM t_order_private_car as ot
+        LEFT JOIN t_user as ui on ui.id = ot.userId
+        LEFT JOIN t_driver as di on di.id = ot.driverId
+        LEFT JOIN t_car as ci on ci.id= ot.carId
+        LEFT JOIN t_car_brand as cb on cb.id = ci.carBrandId
+        LEFT JOIN t_server_carmodel as sc on sc.id = ot.serverCarModelId
+        ) as o
+        <where>
+            o.isDelete = 1 and o.type = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="orderNum != null and orderNum != ''">
+                and o.orderNum  LIKE CONCAT('%',#{orderNum},'%')
+            </if>
+            <if test="orderSource != null and orderSource != ''">
+                and o.orderSource = #{orderSource}
+            </if>
+            <if test="userName != null and userName != ''">
+                and o.userName  LIKE CONCAT('%',#{userName},'%')
+            </if>
+            <if test="userPhone != null and userPhone != ''">
+                and o.userPhone  LIKE CONCAT('%',#{userPhone},'%')
+            </if>
+            <if test="passengers != null and passengers != ''">
+                and o.passengers  LIKE CONCAT('%',#{passengers},'%')
+            </if>
+            <if test="passengersPhone != null and passengersPhone != ''">
+                and o.passengersPhone  LIKE CONCAT('%',#{passengersPhone},'%')
+            </if>
+            <if test="serverCarModelId != null and serverCarModelId != ''">
+                and o.serverCarModelId  = #{serverCarModelId}
+            </if>
+            <if test="driver != null and driver != ''">
+                and o.driver  LIKE CONCAT('%',#{driver},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.companyId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.companyId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--根据专车订单ID获取专车订单详情-->
+    <select id="getPrivateCarOrderDetailById" resultType="map">
+        SELECT
+        DATE_FORMAT(ot.insertTime,'%Y-%m-%d %H:%i') as insertTimeStr,
+        DATE_FORMAT(ot.travelTime,'%Y-%m-%d %H:%i') as travelTimeStr,
+        DATE_FORMAT(ot.boardingTime,'%Y-%m-%d %H:%i') as boardingTimeStr,
+        DATE_FORMAT(ot.getoffTime,'%Y-%m-%d %H:%i') as getoffTimeStr,
+        case when ot.orderSource = 1 then 'APP下单'
+        when ot.orderSource = 2 then '扫码下单'
+        when ot.orderSource = 3 then '小程序下单'
+        when ot.orderSource = 4 then '司机下单'
+        when ot.orderSource = 5 then '调度下单' else '' end orderSourceStr,
+        ui.nickName as userName,ui.phone as userPhone,
+        case when ot.payType = 1 then '微信'
+        when ot.payType = 2 then '支付宝'
+        when ot.payType = 3 then '余额' else '' end as payTypeStr,
+        sc.`name` as serverCarModel,
+        case when income1.type = 1 then income1.money else 0 end as platIncome,
+        case when income1.type = 2 then income1.money else 0 end as companyIncome,
+        case when income1.type = 3 then income1.money else 0 end as franchiseeIncome,
+        IFNULL(income2.money,0) as driverIncome,
+        CONCAT(di.`name`,'-',di.phone) as driver,
+        CONCAT(cb.`name`,'-',ci.carLicensePlate) as car,
+        cc.`name` as companyName,ot.*
+         FROM t_order_private_car as ot
+        LEFT JOIN t_user as ui on ui.id = ot.userId
+        LEFT JOIN t_driver as di on di.id = ot.driverId
+        LEFT JOIN t_car as ci on ci.id= ot.carId
+        LEFT JOIN t_car_brand as cb on cb.id = ci.carBrandId
+        LEFT JOIN t_company as cc on cc.id = ot.companyId
+        LEFT JOIN t_server_carmodel as sc on sc.id = ot.serverCarModelId
+        LEFT JOIN (SELECT ii.money,ii.incomeId,cc.type FROM t_income as ii
+        LEFT JOIN t_company as cc on ii.objectId = cc.id
+        where ii.userType = 1 and ii.type = 2 and ii.orderType = 1 GROUP BY ii.incomeId) as income1 on income1.incomeId = ot.id
+        LEFT JOIN (SELECT * FROM t_income where userType = 2 and type = 2 and orderType = 1 GROUP BY incomeId) as income2 on income2.incomeId = ot.id
+        where ot.id = #{orderId}
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTaxiMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTaxiMapper.xml
new file mode 100644
index 0000000..47a81a8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTaxiMapper.xml
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TOrderTaxiMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TOrderTaxi">
+        <id column="id" property="id" />
+        <result column="userId" property="userId" />
+        <result column="driverId" property="driverId" />
+        <result column="carId" property="carId" />
+        <result column="orderNum" property="orderNum" />
+        <result column="placementLon" property="placementLon" />
+        <result column="placementLat" property="placementLat" />
+        <result column="placementAddress" property="placementAddress" />
+        <result column="startLon" property="startLon" />
+        <result column="startLat" property="startLat" />
+        <result column="endLon" property="endLon" />
+        <result column="startAddress" property="startAddress" />
+        <result column="endLat" property="endLat" />
+        <result column="endAddress" property="endAddress" />
+        <result column="boardingLon" property="boardingLon" />
+        <result column="boardingLat" property="boardingLat" />
+        <result column="boardingAddress" property="boardingAddress" />
+        <result column="boardingTime" property="boardingTime" />
+        <result column="getoffLon" property="getoffLon" />
+        <result column="getoffLat" property="getoffLat" />
+        <result column="getoffAddress" property="getoffAddress" />
+        <result column="getoffTime" property="getoffTime" />
+        <result column="mileage" property="mileage" />
+        <result column="payManner" property="payManner" />
+        <result column="payType" property="payType" />
+        <result column="orderMoney" property="orderMoney" />
+        <result column="travelMoney" property="travelMoney" />
+        <result column="parkMoney" property="parkMoney" />
+        <result column="roadTollMoney" property="roadTollMoney" />
+        <result column="tipMoney" property="tipMoney" />
+        <result column="redPacketMoney" property="redPacketMoney" />
+        <result column="couponMoney" property="couponMoney" />
+        <result column="redPacketId" property="redPacketId" />
+        <result column="couponId" property="couponId" />
+        <result column="companyId" property="companyId" />
+        <result column="payMoney" property="payMoney" />
+        <result column="substitute" property="substitute" />
+        <result column="passengers" property="passengers" />
+        <result column="passengersPhone" property="passengersPhone" />
+        <result column="state" property="state" />
+        <result column="insertTime" property="insertTime" />
+        <result column="travelTime" property="travelTime" />
+        <result column="snatchOrderTime" property="snatchOrderTime" />
+        <result column="setOutTime" property="setOutTime" />
+        <result column="arriveTime" property="arriveTime" />
+        <result column="startServiceTime" property="startServiceTime" />
+        <result column="endServiceTime" property="endServiceTime" />
+        <result column="orderType" property="orderType" />
+        <result column="orderSource" property="orderSource" />
+        <result column="invoiceId" property="invoiceId" />
+        <result column="isReassign" property="isReassign" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userId, driverId, carId, orderNum, placementLon, placementLat, placementAddress, startLon, startLat, endLon, startAddress, endLat, endAddress, boardingLon, boardingLat, boardingAddress, boardingTime, getoffLon, getoffLat, getoffAddress, getoffTime, mileage, payManner, payType, orderMoney, travelMoney, parkMoney, roadTollMoney, tipMoney, redPacketMoney, couponMoney, redPacketId, couponId, companyId, payMoney, substitute, passengers, passengersPhone, state, insertTime, travelTime, snatchOrderTime, setOutTime, arriveTime, startServiceTime, endServiceTime, orderType, orderSource, invoiceId, isReassign
+    </sql>
+
+    <!--根据条件查询出租车订单列表-->
+    <select id="getTaxiOrderList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT ui.nickName as userName,ui.phone as userPhone,CONCAT(di.`name`,'-',di.phone) as driver,CONCAT(cb.`name`,'-',ci.carLicensePlate) as car,
+        ot.* FROM t_order_taxi as ot
+        LEFT JOIN t_user as ui on ui.id = ot.userId
+        LEFT JOIN t_driver as di on di.id = ot.driverId
+        LEFT JOIN t_car as ci on ci.id= ot.carId
+        LEFT JOIN t_car_brand as cb on cb.id = ci.carBrandId) as o
+        <where>
+            o.isDelete = 1 and o.type = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="orderNum != null and orderNum != ''">
+                and o.orderNum  LIKE CONCAT('%',#{orderNum},'%')
+            </if>
+            <if test="orderSource != null and orderSource != ''">
+                and o.orderSource = #{orderSource}
+            </if>
+            <if test="userName != null and userName != ''">
+                and o.userName  LIKE CONCAT('%',#{userName},'%')
+            </if>
+            <if test="userPhone != null and userPhone != ''">
+                and o.userPhone  LIKE CONCAT('%',#{userPhone},'%')
+            </if>
+            <if test="passengers != null and passengers != ''">
+                and o.passengers  LIKE CONCAT('%',#{passengers},'%')
+            </if>
+            <if test="passengersPhone != null and passengersPhone != ''">
+                and o.passengersPhone  LIKE CONCAT('%',#{passengersPhone},'%')
+            </if>
+            <if test="driver != null and driver != ''">
+                and o.driver  LIKE CONCAT('%',#{driver},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.companyId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.companyId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--根据出租车订单ID获取出租车订单详情-->
+    <select id="getTaxiOrderDetailById" resultType="map">
+        SELECT
+        DATE_FORMAT(ot.insertTime,'%Y-%m-%d %H:%i') as insertTimeStr,
+        DATE_FORMAT(ot.travelTime,'%Y-%m-%d %H:%i') as travelTimeStr,
+        DATE_FORMAT(ot.boardingTime,'%Y-%m-%d %H:%i') as boardingTimeStr,
+        DATE_FORMAT(ot.getoffTime,'%Y-%m-%d %H:%i') as getoffTimeStr,
+        case when ot.orderSource = 1 then 'APP下单'
+        when ot.orderSource = 2 then '扫码下单'
+        when ot.orderSource = 3 then '小程序下单'
+        when ot.orderSource = 4 then '司机下单'
+        when ot.orderSource = 5 then '调度下单'
+        when ot.orderSource = 6 then '道行龙城下单' else '' end orderSourceStr,
+        ui.nickName as userName,ui.phone as userPhone,
+        case when ot.payType = 1 then '微信'
+        when ot.payType = 2 then '支付宝'
+        when ot.payType = 3 then '余额' else '' end as payTypeStr,
+        CONCAT(di.`name`,'-',di.phone) as driver,
+        CONCAT(cb.`name`,'-',ci.carLicensePlate) as car,
+        cc.`name` as companyName,ot.*
+         FROM t_order_taxi as ot
+        LEFT JOIN t_user as ui on ui.id = ot.userId
+        LEFT JOIN t_driver as di on di.id = ot.driverId
+        LEFT JOIN t_car as ci on ci.id= ot.carId
+        LEFT JOIN t_car_brand as cb on cb.id = ci.carBrandId
+        LEFT JOIN t_company as cc on cc.id = ot.companyId
+        where ot.id = #{orderId}
+    </select>
+
+    <!--根据条件查询可被选择的出租车司机列表-->
+    <select id="getCanSelectTaxiDriverList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT dd.*,c1.name as companyName,c2.name as franchiseeName from t_driver AS dd
+        LEFT JOIN t_company as c1 on c1.id = dd.companyId
+        LEFT JOIN t_company as c2 on c2.id = dd.franchiseeId
+        LEFT JOIN (SELECT * from t_driver_service where type = 2) as ds on ds.driverId = dd.id
+        <where>
+            (dd.companyId = #{companyId} or dd.franchiseeId = #{companyId}) and dd.authState = 2 and dd.state = 2 and (ds.id is not null ) and (dd.carId is not null)
+            <if test="name != null and name != ''">
+                and dd.name LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="phone != null and phone != ''">
+                and dd.phone LIKE CONCAT('%',#{phone},'%')
+            </if>
+        </where>
+        order by dd.id desc
+    </select>
+
+    <!--查询所有订单条数-->
+    <select id="getAllOrderNum" resultType="java.lang.Integer">
+        SELECT IFNULL(SUM(num),0) as value FROM (
+        (SELECT IFNULL(COUNT(id),0) as num FROM t_order_taxi where FIND_IN_SET(state,'8,9')
+        <if test="companyId != null and companyId != ''">
+            and companyId = #{companyId}
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            AND (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        )
+        union all
+        (SELECT IFNULL(COUNT(id),0) as num FROM t_order_chartered_car where FIND_IN_SET(state,'2')
+        <if test="companyId != null and companyId != ''">
+            and companyId = #{companyId}
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            AND (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        )
+        union all
+        (SELECT IFNULL(COUNT(id),0) as num FROM t_order_cross_city where FIND_IN_SET(state,'8,9')
+        <if test="companyId != null and companyId != ''">
+            and companyId = #{companyId}
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            AND (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        )
+        union all
+        (SELECT IFNULL(COUNT(id),0) as num FROM t_order_logistics where FIND_IN_SET(state,'8,9')
+        <if test="companyId != null and companyId != ''">
+            and companyId = #{companyId}
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            AND (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        )
+        union all
+        (SELECT IFNULL(COUNT(id),0) as num FROM t_order_private_car where FIND_IN_SET(state,'8,9')
+        <if test="companyId != null and companyId != ''">
+            and companyId = #{companyId}
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            AND (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        )
+        ) as o
+    </select>
+
+    <!--查询所有总交易金额-->
+    <select id="getAllTradeMoney" resultType="java.lang.Double">
+        SELECT IFNULL(SUM(num),0) as value FROM (
+        (SELECT IFNULL(SUM(payMoney),0) as num FROM t_order_taxi where FIND_IN_SET(state,'8,9')
+        <if test="companyId != null and companyId != ''">
+            and companyId = #{companyId}
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            AND (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        )
+        union all
+        (SELECT IFNULL(SUM(payMoney),0) as num FROM t_order_cross_city where FIND_IN_SET(state,'8,9')
+        <if test="companyId != null and companyId != ''">
+            and companyId = #{companyId}
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            AND (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        )
+        union all
+        (SELECT IFNULL(SUM(payMoney),0) as num FROM t_order_logistics where FIND_IN_SET(state,'8,9')
+        <if test="companyId != null and companyId != ''">
+            and companyId = #{companyId}
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            AND (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        )
+        union all
+        (SELECT IFNULL(SUM(payMoney),0) as num FROM t_order_private_car where FIND_IN_SET(state,'8,9')
+        <if test="companyId != null and companyId != ''">
+            and companyId = #{companyId}
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            AND (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        )
+        ) as o
+    </select>
+
+    <!--查询所有总收益-->
+    <select id="getAllIncomeMoney" resultType="java.lang.Double">
+        SELECT IFNULL(SUM(money),0) as value FROM t_income where userType = 1
+        <if test="companyId != null and companyId != ''">
+            and objectId = #{companyId}
+        </if>
+        <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+            AND (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+    </select>
+
+
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPhoneMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPhoneMapper.xml
new file mode 100644
index 0000000..6dc300f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPhoneMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TPhoneMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TPhone">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="platform" property="platform" />
+        <result column="phone" property="phone" />
+        <result column="companyId" property="companyId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, type, platform, phone, companyId
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TProblemMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TProblemMapper.xml
new file mode 100644
index 0000000..0b7c6a6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TProblemMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TProblemMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TProblem">
+        <id column="id" property="id" />
+        <result column="userId" property="userId" />
+        <result column="content" property="content" />
+        <result column="answer" property="answer" />
+        <result column="handleUserId" property="handleUserId" />
+        <result column="handleTime" property="handleTime" />
+        <result column="insertTime" property="insertTime" />
+        <result column="state" property="state" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userId, content, answer, handleUserId, handleTime, insertTime, state
+    </sql>
+
+    <!--根据条件查询用户留言列表-->
+    <select id="getProblemList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT ui.nickName as userName,ui.phone as userPhone,su.`name` as handleUserName,pp.* FROM t_problem as pp
+        LEFT JOIN t_user as ui on ui.id = pp.userId
+        LEFT JOIN sys_user as su on su.id = pp.handleUserId) as o
+        <where>
+            1=1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="userName != null and userName != ''">
+                and o.userName  LIKE CONCAT('%',#{userName},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPubTransactionDetailsMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPubTransactionDetailsMapper.xml
new file mode 100644
index 0000000..e41a1d7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPubTransactionDetailsMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TPubTransactionDetailsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TPubTransactionDetails">
+        <id column="id" property="id" />
+        <result column="userId" property="userId" />
+        <result column="insertTime" property="insertTime" />
+        <result column="remark" property="remark" />
+        <result column="money" property="money" />
+        <result column="state" property="state" />
+        <result column="type" property="type" />
+        <result column="userType" property="userType" />
+        <result column="orderType" property="orderType" />
+        <result column="orderId" property="orderId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userId, insertTime, remark, money, state, type, userType, orderType, orderId
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPubWithdrawalMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPubWithdrawalMapper.xml
new file mode 100644
index 0000000..e6327c8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TPubWithdrawalMapper.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TPubWithdrawalMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TPubWithdrawal">
+        <id column="id" property="id" />
+        <result column="userId" property="userId" />
+        <result column="handleTime" property="handleTime" />
+        <result column="balance" property="balance" />
+        <result column="money" property="money" />
+        <result column="state" property="state" />
+        <result column="remark" property="remark" />
+        <result column="code" property="code" />
+        <result column="name" property="name" />
+        <result column="userType" property="userType" />
+        <result column="insertTime" property="insertTime" />
+        <result column="flag" property="flag" />
+        <result column="withdrawalType" property="withdrawalType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userId, handleTime, balance, money, state, remark, code, name, userType, insertTime, flag, withdrawalType
+    </sql>
+
+    <!--根据条件查询提现列表-->
+    <select id="getWithdrawalList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT
+        case when pw.userType = 1 then uu.nickName when pw.userType = 2 then dd.`name` else '' end as userName,
+        case when pw.userType = 1 then uu.phone when pw.userType = 2 then dd.phone else '' end as userPhone,
+        pw.*
+        FROM t_pub_withdrawal as pw
+        LEFT JOIN t_user as uu on uu.id = pw.userId
+        LEFT JOIN t_driver as dd on dd.id = pw.userId) as o
+        <where>
+            o.flag != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="name != null and name != ''">
+                and o.name  LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="withdrawalType != null and withdrawalType != ''">
+                and o.withdrawalType = #{withdrawalType}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TReassignMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TReassignMapper.xml
new file mode 100644
index 0000000..3d5137c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TReassignMapper.xml
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TReassignMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TReassign">
+        <id column="id" property="id" />
+        <result column="orderType" property="orderType" />
+        <result column="orderId" property="orderId" />
+        <result column="originalDriverId" property="originalDriverId" />
+        <result column="originalCarId" property="originalCarId" />
+        <result column="insertTime" property="insertTime" />
+        <result column="nowDriverId" property="nowDriverId" />
+        <result column="nowCarId" property="nowCarId" />
+        <result column="money" property="money" />
+        <result column="payType" property="payType" />
+        <result column="payTime" property="payTime" />
+        <result column="payOrder" property="payOrder" />
+        <result column="state" property="state" />
+        <result column="reason" property="reason" />
+        <result column="remark" property="remark" />
+        <result column="reviewer" property="reviewer"/>
+        <result column="reviewerType" property="reviewerType"/>
+        <result column="completeTime" property="completeTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, orderType, orderId, originalDriverId, originalCarId, insertTime, nowDriverId, nowCarId, money, payType, payTime, payOrder, state, reason, remark, completeTime
+    </sql>
+
+    <!--根据条件查询专车改派订单列表-->
+    <select id="getPrivateCarReassignOrderList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT rr.id,rr.insertTime,
+        dd1.name as originalDriverName,dd1.phone as originalDriverPhone,
+        CONCAT(dd1.name,'-',dd1.phone) as originalDriver,rr.reason,opc.orderNum,
+        CONCAT(uu1.nickName,'-',uu1.phone) as addOrderUser,opc.travelTime,opc.startAddress,opc.endAddress,
+        CONCAT(cb1.`name`,'-',cc1.carLicensePlate) as originalCar,rr.money,opc.state as orderState,
+        dd2.name as nowDriverName,dd2.phone as nowDriverPhone,
+        CONCAT(dd2.name,'-',dd2.phone) as nowDriver,CONCAT(cb2.`name`,'-',cc2.carLicensePlate) as nowCar,
+        opc.companyId,rr.state,rr.orderType FROM t_reassign as rr
+        LEFT JOIN t_driver as dd1 on dd1.id = rr.originalDriverId
+        LEFT JOIN t_order_private_car as opc on opc.id = rr.orderId
+        LEFT JOIN t_user as uu1 on uu1.id = opc.userId
+        LEFT JOIN t_car as cc1 on cc1.id= rr.originalCarId
+        LEFT JOIN t_car_brand as cb1 on cb1.id = cc1.carBrandId
+        LEFT JOIN t_driver as dd2 on dd2.id = rr.nowDriverId
+        LEFT JOIN t_car as cc2 on cc2.id= rr.nowCarId
+        LEFT JOIN t_car_brand as cb2 on cb2.id = cc2.carBrandId) as o
+        <where>
+            o.orderType = 1 and o.state != 6
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="originalDriverName != null and originalDriverName != ''">
+                and o.originalDriverName  LIKE CONCAT('%',#{originalDriverName},'%')
+            </if>
+            <if test="originalDriverPhone != null and originalDriverPhone != ''">
+                and o.originalDriverPhone  LIKE CONCAT('%',#{originalDriverPhone},'%')
+            </if>
+            <if test="orderNum != null and orderNum != ''">
+                and o.orderNum  LIKE CONCAT('%',#{orderNum},'%')
+            </if>
+            <if test="nowDriverName != null and nowDriverName != ''">
+                and o.nowDriverName = #{nowDriverName}
+            </if>
+            <if test="nowDriverPhone != null and nowDriverPhone != ''">
+                and o.nowDriverPhone  LIKE CONCAT('%',#{nowDriverPhone},'%')
+            </if>
+            <if test="orderState != null and orderState != ''">
+                and o.orderState = #{orderState}
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.companyId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.companyId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--根据条件查询可被选择的专车司机列表-->
+    <select id="getCanSelectPrivateCarDriverList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT dd.*,c1.name as companyName,c2.name as franchiseeName from t_driver AS dd
+        LEFT JOIN t_company as c1 on c1.id = dd.companyId
+        LEFT JOIN t_company as c2 on c2.id = dd.franchiseeId
+        LEFT JOIN (SELECT * from t_driver_service where type = 1) as ds on ds.driverId = dd.id
+        <where>
+            (dd.companyId = #{companyId} or dd.franchiseeId = #{companyId}) and dd.authState = 2 and dd.state = 2 and (ds.id is not null ) and (dd.carId is not null)
+            <if test="name != null and name != ''">
+                and dd.name LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="phone != null and phone != ''">
+                and dd.phone LIKE CONCAT('%',#{phone},'%')
+            </if>
+        </where>
+        order by dd.id desc
+    </select>
+
+
+    <!--根据条件查询可被选择的专车司机列表-->
+    <select id="getCanSelectSmallDriverList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT dd.*,c1.name as companyName,c2.name as franchiseeName from t_driver AS dd
+        LEFT JOIN t_company as c1 on c1.id = dd.companyId
+        LEFT JOIN t_company as c2 on c2.id = dd.franchiseeId
+        LEFT JOIN (SELECT * from t_driver_service where type = #{type}) as ds on ds.driverId = dd.id
+        <where>
+            (dd.companyId = #{companyId} or dd.franchiseeId = #{companyId}) and dd.authState = 2 and dd.state = 2 and (ds.id is not null ) and (dd.carId is not null)
+            <if test="name != null and name != ''">
+                and dd.name LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="phone != null and phone != ''">
+                and dd.phone LIKE CONCAT('%',#{phone},'%')
+            </if>
+        </where>
+        order by dd.id desc
+    </select>
+
+
+    <!--根据条件查询跨城改派订单列表-->
+    <select id="getCrossReassignOrderList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT rr.id,rr.insertTime,
+        dd1.name as originalDriverName,dd1.phone as originalDriverPhone,
+        CONCAT(dd1.name,'-',dd1.phone) as originalDriver,rr.reason,opc.orderNum,
+        CONCAT(uu1.nickName,'-',uu1.phone) as addOrderUser,opc.travelTime,opc.startAddress,opc.endAddress,
+        CONCAT(cb1.`name`,'-',cc1.carLicensePlate) as originalCar,rr.money,opc.state as orderState,
+        dd2.name as nowDriverName,dd2.phone as nowDriverPhone,
+        CONCAT(dd2.name,'-',dd2.phone) as nowDriver,CONCAT(cb2.`name`,'-',cc2.carLicensePlate) as nowCar,
+        opc.companyId,rr.state,rr.orderType FROM t_reassign as rr
+        LEFT JOIN t_driver as dd1 on dd1.id = rr.originalDriverId
+        LEFT JOIN t_order_cross_city as opc on opc.id = rr.orderId
+        LEFT JOIN t_user as uu1 on uu1.id = opc.userId
+        LEFT JOIN t_car as cc1 on cc1.id= rr.originalCarId
+        LEFT JOIN t_car_brand as cb1 on cb1.id = cc1.carBrandId
+        LEFT JOIN t_driver as dd2 on dd2.id = rr.nowDriverId
+        LEFT JOIN t_car as cc2 on cc2.id= rr.nowCarId
+        LEFT JOIN t_car_brand as cb2 on cb2.id = cc2.carBrandId) as o
+        <where>
+            o.orderType = 3 and o.state != 6
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="originalDriverName != null and originalDriverName != ''">
+                and o.originalDriverName  LIKE CONCAT('%',#{originalDriverName},'%')
+            </if>
+            <if test="originalDriverPhone != null and originalDriverPhone != ''">
+                and o.originalDriverPhone  LIKE CONCAT('%',#{originalDriverPhone},'%')
+            </if>
+            <if test="orderNum != null and orderNum != ''">
+                and o.orderNum  LIKE CONCAT('%',#{orderNum},'%')
+            </if>
+            <if test="nowDriverName != null and nowDriverName != ''">
+                and o.nowDriverName = #{nowDriverName}
+            </if>
+            <if test="nowDriverPhone != null and nowDriverPhone != ''">
+                and o.nowDriverPhone  LIKE CONCAT('%',#{nowDriverPhone},'%')
+            </if>
+            <if test="orderState != null and orderState != ''">
+                and o.orderState = #{orderState}
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.companyId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.companyId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+
+
+    <!--根据条件查询跨城改派订单列表-->
+    <select id="getSmallPieceLogisticsList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT rr.id,rr.insertTime,
+        dd1.name as originalDriverName,dd1.phone as originalDriverPhone,
+        CONCAT(dd1.name,'-',dd1.phone) as originalDriver,rr.reason,opc.orderNum,
+        CONCAT(uu1.nickName,'-',uu1.phone) as addOrderUser,opc.travelTime,opc.startAddress,opc.endAddress,
+        CONCAT(cb1.`name`,'-',cc1.carLicensePlate) as originalCar,rr.money,opc.state as orderState,
+        dd2.name as nowDriverName,dd2.phone as nowDriverPhone,
+        CONCAT(dd2.name,'-',dd2.phone) as nowDriver,CONCAT(cb2.`name`,'-',cc2.carLicensePlate) as nowCar,
+        opc.companyId,rr.state,rr.orderType FROM t_reassign as rr
+        LEFT JOIN t_driver as dd1 on dd1.id = rr.originalDriverId
+        LEFT JOIN t_order_logistics as opc on opc.id = rr.orderId
+        LEFT JOIN t_user as uu1 on uu1.id = opc.userId
+        LEFT JOIN t_car as cc1 on cc1.id= rr.originalCarId
+        LEFT JOIN t_car_brand as cb1 on cb1.id = cc1.carBrandId
+        LEFT JOIN t_driver as dd2 on dd2.id = rr.nowDriverId
+        LEFT JOIN t_car as cc2 on cc2.id= rr.nowCarId
+        LEFT JOIN t_car_brand as cb2 on cb2.id = cc2.carBrandId) as o
+        <where>
+            o.orderType in (4, 5) and o.state != 6
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="originalDriverName != null and originalDriverName != ''">
+                and o.originalDriverName  LIKE CONCAT('%',#{originalDriverName},'%')
+            </if>
+            <if test="originalDriverPhone != null and originalDriverPhone != ''">
+                and o.originalDriverPhone  LIKE CONCAT('%',#{originalDriverPhone},'%')
+            </if>
+            <if test="orderNum != null and orderNum != ''">
+                and o.orderNum  LIKE CONCAT('%',#{orderNum},'%')
+            </if>
+            <if test="nowDriverName != null and nowDriverName != ''">
+                and o.nowDriverName = #{nowDriverName}
+            </if>
+            <if test="nowDriverPhone != null and nowDriverPhone != ''">
+                and o.nowDriverPhone  LIKE CONCAT('%',#{nowDriverPhone},'%')
+            </if>
+            <if test="orderState != null and orderState != ''">
+                and o.orderState = #{orderState}
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.companyId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.companyId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+
+    <!--根据条件查询可被选择的跨城司机列表-->
+    <select id="getCanSelectCrossDriverList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        select
+        a.*,
+        h.name as companyName,
+        i.name as franchiseeName
+        from t_driver a
+        left join t_driver_service b on (a.id = b.driverId)
+        left join t_driver_orders c on (a.id = c.driverId)
+        left join t_car d on (a.carId = d.id)
+        left join t_car_service e on (d.id = e.carId)
+        left join t_driver_line f on (a.id = f.driverId)
+        left join t_line_shift g on (f.lineId = g.lineId)
+        left join t_company as h on (h.id = a.companyId)
+        left join t_company as i on (i.id = a.franchiseeId)
+        where a.authState = 2 and a.state != 1 and a.flag != 3 and if(a.franchiseeId is null or a.franchiseeId = 0, a.companyId = #{companyId}, a.franchiseeId = #{companyId})
+        and a.id in (select driverId from t_driver_work where state = 1 and type like '%3%')
+        and b.type = 3 and c.type = 3 and e.type = 3 and e.serverCarModelId = #{serverCarModelId} and f.lineId = #{lineId} and g.id = #{lineShiftId}
+        and a.id in (select driverId from t_line_shift_driver where lineShiftId = #{lineShiftId} and DATE_FORMAT(`day`, '%Y-%m-%d') = DATE_FORMAT(#{time}, '%Y-%m-%d') and laveSeat >= #{num})
+        and a.id != #{driverId}
+        <if test="name != null and name != ''">
+            and a.name LIKE CONCAT('%',#{name},'%')
+        </if>
+        <if test="phone != null and phone != ''">
+            and a.phone LIKE CONCAT('%',#{phone},'%')
+        </if>
+        order by a.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TRegionMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TRegionMapper.xml
new file mode 100644
index 0000000..2436774
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TRegionMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TRegionMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TRegion">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="code" property="code" />
+        <result column="citycode" property="citycode" />
+        <result column="parent_id" property="parentId" />
+        <result column="english" property="english" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, code, citycode, parent_id, english
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TServerCarmodelMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TServerCarmodelMapper.xml
new file mode 100644
index 0000000..7e07b10
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TServerCarmodelMapper.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TServerCarmodelMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TServerCarmodel">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="name" property="name" />
+        <result column="img" property="img" />
+        <result column="state" property="state" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, type, name, img, state, insertTime
+    </sql>
+
+    <!--根据条件查询服务车型列表-->
+    <select id="getServerCarModelList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM t_server_carmodel as o
+        <where>
+            o.type = #{type} and not FIND_IN_SET(o.state,'3')
+            <if test="name != null and name != ''">
+                and o.name LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSiteMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSiteMapper.xml
new file mode 100644
index 0000000..8749905
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSiteMapper.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TSiteMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TSite">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="province" property="province" />
+        <result column="provinceCode" property="provinceCode" />
+        <result column="city" property="city" />
+        <result column="cityCode" property="cityCode" />
+        <result column="district" property="district" />
+        <result column="districtCode" property="districtCode" />
+        <result column="state" property="state" />
+        <result column="insertTime" property="insertTime" />
+        <result column="insertUserId" property="insertUserId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, province, provinceCode, city, cityCode, district, districtCode, state, insertTime, insertUserId
+    </sql>
+
+    <!--根据条件查询站点列表-->
+    <select id="getSiteList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT uu.`name` as insertUser,IFNULL(ls.num,0) as lineNum,ss.* FROM t_site as ss
+        LEFT JOIN sys_user as uu on uu.id = ss.insertUserId
+        LEFT JOIN (SELECT COUNT(a.id) as num,siteId FROM t_line_site a left join t_line b on (a.lineId = b.id) where b.state != 3 GROUP BY a.siteId) as ls on ls.siteId = ss.id) as o
+        <where>
+            o.state != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="name != null and name != ''">
+                and o.name LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="insertUser != null and insertUser != ''">
+                and o.insertUser LIKE CONCAT('%',#{insertUser},'%')
+            </if>
+            <if test="city != null and city != ''">
+                and (o.province LIKE CONCAT('%',#{city},'%') or o.city LIKE CONCAT('%',#{city},'%') or o.district LIKE CONCAT('%',#{city},'%'))
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+
+    <select id="query" resultType="TSite">
+        select
+        id as id,
+        name as name,
+        province as province,
+        provinceCode as provinceCode,
+        city as city,
+        cityCode as cityCode,
+        district as district,
+        districtCode as districtCode,
+        state as state,
+        insertTime as insertTime,
+        insertUserId as insertUserId
+        from t_site where state != 3
+        <choose>
+            <when test="null != provinceCode">
+                and provinceCode = #{provinceCode}
+            </when>
+            <otherwise>
+                and provinceCode is null
+            </otherwise>
+        </choose>
+        <choose>
+            <when test="null != cityCode">
+                and cityCode = #{cityCode}
+            </when>
+            <otherwise>
+                and cityCode is null
+            </otherwise>
+        </choose>
+        <choose>
+            <when test="null != districtCode">
+                and districtCode = #{districtCode}
+            </when>
+            <otherwise>
+                and districtCode is null
+            </otherwise>
+        </choose>
+    </select>
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSmsrecordMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSmsrecordMapper.xml
new file mode 100644
index 0000000..aaef62d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSmsrecordMapper.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TSmsrecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TSmsrecord">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="phone" property="phone" />
+        <result column="code" property="code" />
+        <result column="content" property="content" />
+        <result column="createTime" property="createTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, type, phone, code, content, insertTime
+    </sql>
+
+    <!--根据条件查询验证码记录列表-->
+    <select id="getSmsCodeList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM t_smsrecord as o
+        <where>
+            1 = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="phone != null and phone != ''">
+                and o.phone  LIKE CONCAT('%',#{phone},'%')
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysCancleOrderMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysCancleOrderMapper.xml
new file mode 100644
index 0000000..06a4e8c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysCancleOrderMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TSysCancleOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TSysCancleOrder">
+        <id column="id" property="id" />
+        <result column="companyId" property="companyId" />
+        <result column="minuteNum" property="minuteNum" />
+        <result column="money" property="money" />
+        <result column="type" property="type" />
+        <result column="orderType" property="orderType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, companyId, minuteNum, money, type, orderType
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysFaceDistinguishMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysFaceDistinguishMapper.xml
new file mode 100644
index 0000000..dd2b4ae
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysFaceDistinguishMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TSysFaceDistinguishMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TSysFaceDistinguish">
+        <id column="id" property="id" />
+        <result column="company" property="company" />
+        <result column="isOpen" property="isOpen" />
+        <result column="minuteNum" property="minuteNum" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company, isOpen, minuteNum
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysIntegralMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysIntegralMapper.xml
new file mode 100644
index 0000000..d8d035c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysIntegralMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TSysIntegralMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TSysIntegral">
+        <id column="id" property="id" />
+        <result column="company" property="company" />
+        <result column="integral" property="integral" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company, integral
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysPushOrderMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysPushOrderMapper.xml
new file mode 100644
index 0000000..4988ff2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysPushOrderMapper.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TSysPushOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TSysPushOrder">
+        <id column="id" property="id" />
+        <result column="companyId" property="companyId" />
+        <result column="pushDistance" property="pushDistance" />
+        <result column="pushTime" property="pushTime" />
+        <result column="driverProportion" property="driverProportion" />
+        <result column="type" property="type" />
+        <result column="pushType" property="pushType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, companyId, pushDistance, pushTime, driverProportion, type, pushType
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysReformistMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysReformistMapper.xml
new file mode 100644
index 0000000..2cd81c3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysReformistMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TSysReformistMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TSysReformist">
+        <id column="id" property="id" />
+        <result column="companyId" property="companyId" />
+        <result column="money" property="money" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, companyId, money
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysSensitiveWordsMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysSensitiveWordsMapper.xml
new file mode 100644
index 0000000..f2edc76
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSysSensitiveWordsMapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TSysSensitiveWordsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TSysSensitiveWords">
+        <id column="id" property="id" />
+        <result column="createTime" property="createTime" />
+        <result column="content" property="content" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, createTime, content
+    </sql>
+
+    <!--根据条件查询敏感词列表-->
+    <select id="getSensitiveWordList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM t_sys_sensitive_words as o
+        <where>
+            1 = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.createTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="content != null and content != ''">
+                and o.content  LIKE CONCAT('%',#{content},'%')
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSystemNoticeMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSystemNoticeMapper.xml
new file mode 100644
index 0000000..beecb11
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSystemNoticeMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TSystemNoticeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TSystemNotice">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="userType" property="userType" />
+        <result column="noticesId" property="noticesId" />
+        <result column="content" property="content" />
+        <result column="userId" property="userId" />
+        <result column="insertTime" property="insertTime" />
+        <result column="read" property="read" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, type, userType, noticesId, content, userId, insertTime, read
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSystemPriceMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSystemPriceMapper.xml
new file mode 100644
index 0000000..08d30cb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TSystemPriceMapper.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TSystemPriceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TSystemPrice">
+        <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="companyId" property="companyId" />
+        <result column="serverCarModelId" property="serverCarModelId" />
+        <result column="content" property="content" />
+        <result column="fareTypeNote" property="fareTypeNote"/>
+        <result column="state" property="state"/>
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, type, companyId, serverCarModelId, content
+    </sql>
+
+    <!--查询专车价格设置-->
+    <select id="getSpecialPriceList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT sp.id,sp.type,sp.companyId,sc.`name`,sc.img,sp.state from t_system_price as sp
+        LEFT JOIN t_server_carmodel as sc on sc.id = sp.serverCarModelId) as o
+        <where>
+            o.type = 1 and o.state != 3 and o.companyId = #{companyId}
+            <if test="name != null and name != ''">
+                and o.name LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TUserMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TUserMapper.xml
new file mode 100644
index 0000000..4f2ae88
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TUserMapper.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TUserMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TUser">
+        <id column="id" property="id" />
+        <result column="companyId" property="companyId" />
+        <result column="registIp" property="registIp" />
+        <result column="registAreaCode" property="registAreaCode" />
+        <result column="phone" property="phone" />
+        <result column="nickName" property="nickName" />
+        <result column="avatar" property="avatar" />
+        <result column="birthday" property="birthday" />
+        <result column="sex" property="sex" />
+        <result column="emergencyContact" property="emergencyContact" />
+        <result column="emergencyContactNumber" property="emergencyContactNumber" />
+        <result column="isAuth" property="isAuth" />
+        <result column="name" property="name" />
+        <result column="idCard" property="idCard" />
+        <result column="idCardFront" property="idCardFront" />
+        <result column="idCardReverse" property="idCardReverse" />
+        <result column="consumption" property="consumption" />
+        <result column="balance" property="balance" />
+        <result column="integral" property="integral" />
+        <result column="passWord" property="passWord" />
+        <result column="openId" property="openId" />
+        <result column="unionid" property="unionid" />
+        <result column="remark" property="remark" />
+        <result column="state" property="state" />
+        <result column="flag" property="flag" />
+        <result column="insertTime" property="insertTime" />
+        <result column="insertUser" property="insertUser" />
+        <result column="updateTime" property="updateTime" />
+        <result column="updateUser" property="updateUser" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, companyId, registIp, registAreaCode, phone, nickName, avatar, birthday, sex, emergencyContact, emergencyContactNumber, isAuth, name, idCard, idCardFront, idCardReverse, consumption, balance, integral, passWord, openId, unionid, remark, state, flag, insertTime, insertUser, updateTime, updateUser
+    </sql>
+
+    <!--根据条件查询用户列表-->
+    <select id="getUserList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT ci.`name` as companyName,IFNULL(ot.num,0) as historyNum,IFNULL(td.num,0) as consumptionNum,ui.* from t_user as ui
+        LEFT JOIN (select * from t_company where flag != 3) as ci on ci.id = ui.companyId
+        LEFT JOIN (SELECT COUNT(id) as num,userId from t_order_taxi where FIND_IN_SET(state,'8,9') GROUP BY userId) as ot on ot.userId = ui.id
+        LEFT JOIN (SELECT sum(money) as num,userId from t_pub_transaction_details where userType = 1 and type = 1 and state = 2 GROUP BY userId) as td on td.userId = ui.id
+        ) as o
+        <where>
+            o.flag != 3
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="isAuth != null and isAuth != ''">
+                and o.isAuth = #{isAuth}
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+            <if test="id != null and id != ''">
+                and o.id  LIKE CONCAT('%',#{id},'%')
+            </if>
+            <if test="nickName != null and nickName != ''">
+                and o.nickName  LIKE CONCAT('%',#{nickName},'%')
+            </if>
+            <if test="phone != null and phone != ''">
+                and o.phone  LIKE CONCAT('%',#{phone},'%')
+            </if>
+            <if test="companyName != null and companyName != ''">
+                and o.companyName  LIKE CONCAT('%',#{companyName},'%')
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.companyId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.companyId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+    <!--根据用户ID获取用户详情-->
+    <select id="getUserDetailById" resultType="java.util.Map">
+        SELECT DATE_FORMAT(ui.insertTime,'%Y-%m-%d %H:%i') as insertTimeStr,ci.`name` as companyName,
+        case when ui.isAuth = 1 then '否' else '是' end as isAuthStr,
+        IFNULL(0,0) as zcNum,
+        IFNULL(ot.num,0) as czNum,
+        IFNULL(0,0) as kcNum,
+        IFNULL(0,0) as wlNum,
+        IFNULL(td.num,0) as consumptionNum,
+        IFNULL(ui.balance,0) as balanceStr,
+        ui.* from t_user as ui
+        LEFT JOIN (select * from t_company where flag != 3) as ci on ci.id = ui.companyId
+        LEFT JOIN (SELECT sum(money) as num,userId from t_pub_transaction_details where userType = 1 and type = 1 and state = 2 GROUP BY userId) as td on td.userId = ui.id
+        LEFT JOIN (SELECT COUNT(id) as num,userId from t_order_taxi where FIND_IN_SET(state,'8,9') GROUP BY userId) as ot on ot.userId = ui.id
+        where ui.id = #{userId}
+    </select>
+
+    <!--根据条件查询用户列表-无分页-->
+    <select id="getUserListNoPage" resultType="map" >
+        SELECT * FROM (SELECT ci.`name` as companyName,IFNULL(ot.num,0) as historyNum,IFNULL(td.num,0) as consumptionNum,ui.* from t_user as ui
+        LEFT JOIN (select * from t_company where flag != 3) as ci on ci.id = ui.companyId
+        LEFT JOIN (SELECT COUNT(id) as num,userId from t_order_taxi where FIND_IN_SET(state,'8,9') GROUP BY userId) as ot on ot.userId = ui.id
+        LEFT JOIN (SELECT sum(money) as num,userId from t_pub_transaction_details where userType = 1 and type = 1 and state = 2 GROUP BY userId) as td on td.userId = ui.id
+        ) as o
+        <where>
+            o.flag != 3
+            <if test="roleType != null and roleType != '' and roleType == 2">
+                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.companyId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
+            </if>
+            <if test="roleType != null and roleType != '' and roleType == 3">
+                and o.companyId = #{nowUserId}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TUserRedPacketRecordMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TUserRedPacketRecordMapper.xml
new file mode 100644
index 0000000..84a93b3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TUserRedPacketRecordMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TUserRedPacketRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TUserRedPacketRecord">
+        <id column="id" property="id" />
+        <result column="money" property="money" />
+        <result column="expirationTime" property="expirationTime" />
+        <result column="insertTime" property="insertTime" />
+        <result column="companyId" property="companyId" />
+        <result column="state" property="state" />
+        <result column="orderId" property="orderId" />
+        <result column="orderType" property="orderType" />
+        <result column="userId" property="userId" />
+        <result column="redPacketActivityId" property="redPacketActivityId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, money, expirationTime, insertTime, companyId, state, orderId, orderType, userId, redPacketActivityId
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TVerifiedMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TVerifiedMapper.xml
new file mode 100644
index 0000000..d675cfa
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TVerifiedMapper.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TVerifiedMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TVerified">
+        <id column="id" property="id" />
+        <result column="userId" property="userId" />
+        <result column="name" property="name" />
+        <result column="idcode" property="idcode" />
+        <result column="img1" property="img1" />
+        <result column="img2" property="img2" />
+        <result column="state" property="state" />
+        <result column="insertTime" property="insertTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userId, name, idcode, img1, img2, state, insertTime
+    </sql>
+
+    <!--根据条件查询用户实名认证列表-->
+    <select id="getVerifiedList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM (SELECT uu.nickName as userName,uu.phone as userPhone,vv.* FROM t_verified as vv
+        LEFT JOIN t_user as uu on uu.id = vv.userId) as o
+        <where>
+            1 = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="userName != null and userName != ''">
+                and o.userName  LIKE CONCAT('%',#{userName},'%')
+            </if>
+            <if test="userPhone != null and userPhone != ''">
+                and o.userPhone  LIKE CONCAT('%',#{userPhone},'%')
+            </if>
+            <if test="name != null and name != ''">
+                and o.name  LIKE CONCAT('%',#{name},'%')
+            </if>
+            <if test="state != null and state != ''">
+                and o.state = #{state}
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TVersionManagementMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TVersionManagementMapper.xml
new file mode 100644
index 0000000..40f7807
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TVersionManagementMapper.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TVersionManagementMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TVersionManagement">
+        <id column="id" property="id" />
+        <result column="url" property="url" />
+        <result column="version" property="version" />
+        <result column="content" property="content" />
+        <result column="mandatory" property="mandatory" />
+        <result column="insertTime" property="insertTime" />
+        <result column="type" property="type" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, url, version, content, mandatory, insertTime, type
+    </sql>
+
+    <!--根据条件查询版本列表-->
+    <select id="getVersionList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT * FROM t_version_management as o
+        <where>
+            1 = 1
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+            </if>
+            <if test="version != null and version != ''">
+                and o.version  LIKE CONCAT('%',#{version},'%')
+            </if>
+        </where>
+        order by o.id desc
+    </select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TransactionDetailsMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TransactionDetailsMapper.xml
new file mode 100644
index 0000000..391ca70
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TransactionDetailsMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TransactionDetailsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TransactionDetails">
+        <id column="id" property="id"/>
+        <result column="userId" property="userId"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="remark" property="remark"/>
+        <result column="money" property="money"/>
+        <result column="state" property="state"/>
+        <result column="type" property="type"/>
+        <result column="userType" property="userType"/>
+        <result column="orderType" property="orderType"/>
+        <result column="orderId" property="orderId"/>
+    </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityBalanceMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityBalanceMapper.xml
new file mode 100644
index 0000000..61d5663
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityBalanceMapper.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityBalanceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivityBalance">
+        <id column="id" property="id" />
+        <result column="enable" property="enable" />
+        <result column="userActivityId" property="userActivityId" />
+        <result column="money" property="money" />
+        <result column="generalNum" property="generalNum" />
+        <result column="generalCouponId" property="generalCouponId" />
+        <result column="specialNum" property="specialNum" />
+        <result column="specialCouponId" property="specialCouponId" />
+        <result column="taxiNum" property="taxiNum" />
+        <result column="taxiCouponId" property="taxiCouponId" />
+        <result column="intercityNum" property="intercityNum" />
+        <result column="intercityCouponId" property="intercityCouponId" />
+        <result column="insertTime" property="insertTime" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="totalPrice" property="totalPrice" />
+        <result column="lavePrice" property="lavePrice" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, enable, userActivityId, money, generalNum, generalCouponId, specialNum, specialCouponId, taxiNum, taxiCouponId, intercityNum, intercityCouponId, insertTime, startTime, endTime
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount1Mapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount1Mapper.xml
new file mode 100644
index 0000000..835617b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount1Mapper.xml
@@ -0,0 +1,310 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityDiscount1Mapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivityDiscount1">
+        <id column="id" property="id" />
+        <result column="userActivityId" property="userActivityId" />
+        <result column="special" property="special" />
+        <result column="taxi" property="taxi" />
+        <result column="logistics" property="logistics" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="enable" property="enable" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userActivityId, special, taxi, logistics, startTime, endTime, enable
+    </sql>
+
+
+    <select id="queryDiscount1" resultType="map">
+        select
+        qa.time,
+        count(qa.userId) as userNum,
+        sum(qa.discountMoney) as discountMoney
+        from (
+            select
+            aa.time,
+            aa.userId as userId,
+            sum(aa.discountMoney) as discountMoney
+            from (
+                select DATE_FORMAT(a.travelTime, '%Y-%m-%d') as time, a.userId,a.discountMoney
+                from t_order_private_car a
+                left join t_user_activity_discount1 b on (a.activityId = b.id)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                where a.activityId is not null
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+
+                union all
+
+                select DATE_FORMAT(a.travelTime, '%Y-%m-%d') as time,a.userId,a.discountMoney
+                from t_order_taxi a
+                left join t_user_activity_discount1 b on (a.activityId = b.id)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                where a.activityId is not null
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+
+                union all
+
+                select DATE_FORMAT(a.travelTime, '%Y-%m-%d') as time,a.userId,a.discountMoney
+                from t_order_logistics a
+                left join t_user_activity_discount1 b on (a.activityId = b.id)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                where a.activityId is not null
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+            ) as aa GROUP BY aa.time, aa.userId
+        ) as qa GROUP BY qa.time order by qa.time desc
+        <if test="null != offset and null != limit">
+            limit #{offset}, #{limit}
+        </if>
+    </select>
+
+
+
+    <select id="queryDiscount1Count" resultType="int">
+        select count(time) from (
+            select
+            qa.time as time
+            from (
+                select
+                aa.time,
+                aa.userId as userId,
+                sum(aa.discountMoney) as discountMoney
+                from (
+                    select DATE_FORMAT(a.travelTime, '%Y-%m-%d') as time, a.userId,a.discountMoney
+                    from t_order_private_car a
+                    left join t_user_activity_discount1 b on (a.activityId = b.id)
+                    left join t_user_activity c on (b.userActivityId = c.id)
+                    where a.activityId is not null
+                    <if test="null != name and '' != name">
+                        and c.`name` like CONCAT('%', #{name}, '%')
+                    </if>
+                    <if test="null != start and '' != start and null != end and '' != end">
+                        and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                    </if>
+                    <if test="null != companyId">
+                        and c.companyId = #{companyId}
+                    </if>
+
+                    union all
+
+                    select DATE_FORMAT(a.travelTime, '%Y-%m-%d') as time,a.userId,a.discountMoney
+                    from t_order_taxi a
+                    left join t_user_activity_discount1 b on (a.activityId = b.id)
+                    left join t_user_activity c on (b.userActivityId = c.id)
+                    where a.activityId is not null
+                    <if test="null != name and '' != name">
+                        and c.`name` like CONCAT('%', #{name}, '%')
+                    </if>
+                    <if test="null != start and '' != start and null != end and '' != end">
+                        and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                    </if>
+                    <if test="null != companyId">
+                        and c.companyId = #{companyId}
+                    </if>
+
+                    union all
+
+                    select DATE_FORMAT(a.travelTime, '%Y-%m-%d') as time,a.userId,a.discountMoney
+                    from t_order_logistics a
+                    left join t_user_activity_discount1 b on (a.activityId = b.id)
+                    left join t_user_activity c on (b.userActivityId = c.id)
+                    where a.activityId is not null
+                    <if test="null != name and '' != name">
+                        and c.`name` like CONCAT('%', #{name}, '%')
+                    </if>
+                    <if test="null != start and '' != start and null != end and '' != end">
+                        and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                    </if>
+                    <if test="null != companyId">
+                        and c.companyId = #{companyId}
+                    </if>
+                ) as aa GROUP BY aa.time, aa.userId
+            ) as qa GROUP BY qa.time
+        ) as da
+    </select>
+
+
+    <select id="queryDiscountInfo" resultType="map">
+        select
+        aa.time,
+        aa.`name`,
+        aa.phone,
+        sum(aa.discountMoney) as discountMoney
+        from (
+            select
+            DATE_FORMAT(a.endServiceTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            b.nickName as `name`,
+            b.phone as phone,
+            a.discountMoney as discountMoney
+            from t_order_private_car a
+            left join t_user b on (a.userId = b.id)
+            left join t_user_activity_discount1 c on (a.activityId = c.id)
+            left join t_user_activity d on (c.userActivityId = d.id)
+            where a.state in (8, 9) and activityId is not null
+            <if test="null != name and '' != name">
+                and d.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.endServiceTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and a.companyId = #{companyId}
+            </if>
+
+            union all
+
+            select
+            DATE_FORMAT(a.endServiceTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            b.nickName as `name`,
+            b.phone as phone,
+            a.discountMoney as discountMoney
+            from t_order_taxi a
+            left join t_user b on (a.userId = b.id)
+            left join t_user_activity_discount1 c on (a.activityId = c.id)
+            left join t_user_activity d on (c.userActivityId = d.id)
+            where a.state in (8, 9) and activityId is not null
+            <if test="null != name and '' != name">
+                and d.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.endServiceTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and a.companyId = #{companyId}
+            </if>
+
+            union all
+
+            select
+            DATE_FORMAT(a.endServiceTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            b.nickName as `name`,
+            b.phone as phone,
+            a.discountMoney as discountMoney
+            from t_order_logistics a
+            left join t_user b on (a.userId = b.id)
+            left join t_user_activity_discount1 c on (a.activityId = c.id)
+            left join t_user_activity d on (c.userActivityId = d.id)
+            where a.state in (9) and activityId is not null
+            <if test="null != name and '' != name">
+                and d.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.endServiceTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and a.companyId = #{companyId}
+            </if>
+        ) as aa group by aa.time, userId order by aa.time desc
+        <if test="null != offset and null != limit">
+            limit #{offset}, #{limit}
+        </if>
+    </select>
+
+
+    <select id="queryDiscountInfoCount" resultType="int">
+        select count(w.time) from (
+            select
+            aa.time as time
+            from (
+            select
+            DATE_FORMAT(a.endServiceTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            b.nickName as `name`,
+            b.phone as phone,
+            a.discountMoney as discountMoney
+            from t_order_private_car a
+            left join t_user b on (a.userId = b.id)
+            left join t_user_activity_discount1 c on (a.activityId = c.id)
+            left join t_user_activity d on (c.userActivityId = d.id)
+            where a.state in (8, 9) and activityId is not null
+            <if test="null != name and '' != name">
+                and d.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.endServiceTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and a.companyId = #{companyId}
+            </if>
+
+            union all
+
+            select
+            DATE_FORMAT(a.endServiceTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            b.nickName as `name`,
+            b.phone as phone,
+            a.discountMoney as discountMoney
+            from t_order_taxi a
+            left join t_user b on (a.userId = b.id)
+            left join t_user_activity_discount1 c on (a.activityId = c.id)
+            left join t_user_activity d on (c.userActivityId = d.id)
+            where a.state in (8, 9) and activityId is not null
+            <if test="null != name and '' != name">
+                and d.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.endServiceTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and a.companyId = #{companyId}
+            </if>
+
+            union all
+
+            select
+            DATE_FORMAT(a.endServiceTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            b.nickName as `name`,
+            b.phone as phone,
+            a.discountMoney as discountMoney
+            from t_order_logistics a
+            left join t_user b on (a.userId = b.id)
+            left join t_user_activity_discount1 c on (a.activityId = c.id)
+            left join t_user_activity d on (c.userActivityId = d.id)
+            where a.state in (9) and activityId is not null
+            <if test="null != name and '' != name">
+                and d.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.endServiceTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and a.companyId = #{companyId}
+            </if>
+            ) as aa group by aa.time, userId
+
+        ) as w
+    </select>
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount2Mapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount2Mapper.xml
new file mode 100644
index 0000000..4cd802b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityDiscount2Mapper.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityDiscount2Mapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivityDiscount2">
+        <id column="id" property="id" />
+        <result column="userActivityId" property="userActivityId" />
+        <result column="lineId" property="lineId" />
+        <result column="discount" property="discount" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="enable" property="enable" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userActivityId, lineId, discount, startTime, endTime, enable
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityInviteMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityInviteMapper.xml
new file mode 100644
index 0000000..27cdc69
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityInviteMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityInviteMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivityInvite">
+        <id column="id" property="id" />
+        <result column="userActivityId" property="userActivityId" />
+        <result column="couponId" property="couponId" />
+        <result column="totalNum" property="totalNum" />
+        <result column="laveNum" property="laveNum" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="enable" property="enable" />
+        <result column="totalPrice" property="totalPrice" />
+        <result column="lavePrice" property="lavePrice" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userActivityId, couponId, totalNum, laveNum, startTime, endTime, enable
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityMapper.xml
new file mode 100644
index 0000000..b3a966d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityMapper.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivity">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="insertTime" property="insertTime" />
+        <result column="status" property="status" />
+        <result column="remark" property="remark" />
+        <result column="companyType" property="companyType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, startTime, endTime, insertTime, status, remark, companyType
+    </sql>
+
+
+
+    <select id="queryUserActivityList" resultType="map">
+        select
+        a.id as id,
+        a.insertTime as insertTime,
+        a.`name` as `name`,
+        a.startTime as startTime,
+        a.endTime as endTime,
+        a.remark as remark,
+        a.`status` as `status`,
+        (
+        (select count(aa.id) from t_user_red_packet_record aa left join t_user_activity_redenvelope bb on (aa.redPacketActivityId = bb.id) where aa.state = 2 and bb.userActivityId = a.id) +
+        (select count(aa.id) from t_user_coupon_record aa left join t_user_activity_registered bb on (aa.couponActivityId = bb.id and aa.activityType = 2) where aa.state = 2 and bb.userActivityId = a.id) +
+        (select count(aa.id) from t_user_coupon_record aa left join t_user_activity_invite bb on (aa.couponActivityId = bb.id and aa.activityType = 3) where aa.state = 2 and bb.userActivityId = a.id) +
+        (select count(aa.id) from t_user_coupon_record aa left join t_user_activity_balance bb on (aa.couponActivityId = bb.id and aa.activityType = 4) where aa.state = 2 and bb.userActivityId = a.id) +
+        (select count(id) from t_order_private_car where state in (7,8,9) and activityId = a.id) +
+        (select count(id) from t_order_taxi where state in (7,8,9) and activityId = a.id) +
+        (select count(id) from t_order_cross_city where state in (6,8,9) and activityId = a.id)
+        ) as number
+        from t_user_activity a
+        where a.companyId = #{companyId}
+        <if test="null != start and null != end">
+            and a.insertTime between #{start} and #{end}
+        </if>
+        <if test="null != name and '' != name">
+            and a.`name` like CONCAT('%', #{name}, '%')
+        </if>
+        <if test="null != status">
+            and a.`status` = #{status}
+        </if>
+        order by a.insertTime desc
+        <if test="null != offset and null != limit">
+            limit #{offset}, #{limit}
+        </if>
+    </select>
+
+
+    <select id="queryUserActivityListCount" resultType="int">
+        select
+        count(a.id)
+        from t_user_activity a
+        where a.companyId = #{companyId}
+        <if test="null != start and null != end">
+            and a.insertTime between #{start} and #{end}
+        </if>
+        <if test="null != name and '' != name">
+            and a.`name` like CONCAT('%', #{name}, '%')
+        </if>
+        <if test="null != status">
+            and a.`status` = #{status}
+        </if>
+    </select>
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRedenvelopeMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRedenvelopeMapper.xml
new file mode 100644
index 0000000..cdc0278
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRedenvelopeMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityRedenvelopeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivityRedenvelope">
+        <id column="id" property="id" />
+        <result column="userActivityId" property="userActivityId" />
+        <result column="redEnvelopeId" property="redEnvelopeId" />
+        <result column="totalMoney" property="totalMoney" />
+        <result column="laveMoney" property="laveMoney" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="enable" property="enable" />
+        <result column="totalPrice" property="totalPrice" />
+        <result column="lavePrice" property="lavePrice" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userActivityId, redEnvelopeId, totalMoney, laveMoney, startTime, endTime, enable
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRegisteredMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRegisteredMapper.xml
new file mode 100644
index 0000000..6ca3782
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserActivityRegisteredMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserActivityRegisteredMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserActivityRegistered">
+        <id column="id" property="id" />
+        <result column="userActivityId" property="userActivityId" />
+        <result column="couponId" property="couponId" />
+        <result column="totalNum" property="totalNum" />
+        <result column="laveNum" property="laveNum" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="enable" property="enable" />
+        <result column="totalPrice" property="totalPrice" />
+        <result column="lavePrice" property="lavePrice" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, userActivityId, couponId, totalNum, laveNum, startTime, endTime, enable
+    </sql>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserCouponRecordMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserCouponRecordMapper.xml
new file mode 100644
index 0000000..87b5a1c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserCouponRecordMapper.xml
@@ -0,0 +1,1291 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserCouponRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserCouponRecord">
+        <id column="id" property="id" />
+        <result column="money" property="money" />
+        <result column="fullMoney" property="fullMoney" />
+        <result column="expirationTime" property="expirationTime" />
+        <result column="insertTime" property="insertTime" />
+        <result column="companyId" property="companyId" />
+        <result column="state" property="state" />
+        <result column="endTime" property="endTime"/>
+        <result column="couponUseType" property="couponUseType" />
+        <result column="couponType" property="couponType" />
+        <result column="userId" property="userId" />
+        <result column="couponId" property="couponId" />
+        <result column="couponActivityId" property="couponActivityId" />
+        <result column="activityType" property="activityType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, money, fullMoney, expirationTime, insertTime, companyId, state, couponUseType, couponType, userId, couponId, couponActivityId, activityType
+    </sql>
+
+    <select id="getList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT
+            c.id,
+            c.money,
+            c.fullMoney,
+            c.expirationTime,
+            c.insertTime,
+            c.companyId,
+            c.state,
+            c.couponUseType,
+            c.couponType,
+            c.userId,
+            c.couponId,
+            c.couponActivityId,
+            c.activityType,
+            u.nickName,
+            u.phone,
+            if(a.id is null, if(b.id is null, if(d.id is null, if(e.id is null, '', e.endServiceTime), d.endServiceTime), b.endServiceTime), a.endServiceTime) as useTime
+        FROM
+            t_user_coupon_record c
+        LEFT JOIN t_user u ON c.userId = u.id
+        left join t_order_private_car a on (a.couponId = c.id)
+        left join t_order_taxi b on (b.couponId = c.id)
+        left join t_order_cross_city d on (d.couponId = c.id)
+        left join t_order_logistics e on (e.couponId = c.id)
+        WHERE 1=1
+        <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+            and (c.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        <if test="userName != null and userName !=''">
+            and u.nickName like CONCAT('%',#{userName},'%')
+        </if>
+        <if test="activityType != null and activityType !=''">
+            and c.activityType=#{activityType}
+        </if>
+        <if test="userPhone != null and userPhone !=''">
+            and u.phone like CONCAT('%',#{userPhone},'%')
+        </if>
+        <if test="couponActivityId != null and couponActivityId !=''">
+            and c.couponActivityId=#{couponActivityId}
+        </if>
+        <if test="state != null and state !=''">
+            and c.state=#{state}
+        </if>
+    </select>
+    <select  id="getRedList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT
+            c.id,
+            c.money,
+            c.expirationTime,
+            c.insertTime,
+            c.companyId,
+            c.state,
+            c.userId,
+            c.redPacketActivityId,
+            u.nickName,
+            u.phone,
+          if(a.id is null, if(b.id is null, if(d.id is null, if(e.id is null, '', e.endServiceTime), d.endServiceTime), b.endServiceTime), a.endServiceTime) as useTime
+        FROM
+            t_user_red_packet_record c
+        LEFT JOIN t_user u ON c.userId = u.id
+        left join t_order_private_car a on (a.redPacketId = c.id)
+        left join t_order_taxi b on (b.redPacketId = c.id)
+        left join t_order_cross_city d on (d.redPacketId = c.id)
+        left join t_order_logistics e on (e.redPacketId = c.id)
+        WHERE 1=1
+        <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+            and (c.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        <if test="userName != null and userName !=''">
+            and u.nickName like CONCAT('%',#{userName},'%')
+        </if>
+        <if test="userPhone != null and userPhone !=''">
+            and u.phone like CONCAT('%',#{userPhone},'%')
+        </if>
+        <if test="couponActivityId != null and couponActivityId !=''">
+            and c.redPacketActivityId=#{couponActivityId}
+        </if>
+        <if test="state != null and state !=''">
+            and c.state=#{state}
+        </if>
+    </select>
+    <select id="getCouponStatic" resultType="map">
+        SELECT
+            IFNULL(SUM(money), 0) money,
+            IFNULL(
+                SUM(
+                    CASE
+                    WHEN state = 2 THEN
+                        money
+                    ELSE
+                        0
+                    END
+                ),
+                0
+            ) useMoney,
+            (
+            select count(c.userId) from (select userId from t_user_coupon_record where activityType = #{activityType} and couponActivityId = #{activityId}
+                <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+                    and (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+                </if>
+                group by userId) as c
+            ) number
+        FROM
+            t_user_coupon_record
+        WHERE
+            activityType = #{activityType}
+        AND couponActivityId = #{activityId}
+        <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+            and (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+    </select>
+    <select id="getRedStatic" resultType="map">
+        SELECT
+            IFNULL(SUM(money), 0) money,
+            IFNULL(
+                SUM(
+                    CASE
+                    WHEN state = 2 THEN
+                        money
+                    ELSE
+                        0
+                    END
+                ),
+                0
+            ) useMoney,
+            COUNT(id) number
+        FROM
+            t_user_red_packet_record
+        WHERE
+         redPacketActivityId = #{activityId}
+        <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+            and (insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+    </select>
+    <select id="getDiscountStatic" resultType="map">
+        SELECT IFNULL(SUM(discountMoney),0) money,COUNT(id) number FROM t_order_taxi WHERE activityId=#{activityId}
+    </select>
+    <select id="getRegStatic" resultType="map">
+        SELECT
+            IFNULL(SUM(r.money), 0) money,
+            IFNULL(
+                SUM(
+                    CASE
+                    WHEN r.state = 2 THEN
+                        r.money
+                    ELSE
+                        0
+                    END
+                ),
+                0
+            ) useMoney,
+            COUNT(r.id) number
+        FROM
+            t_user_coupon_record r
+        LEFT JOIN t_user_activity_balance u ON u.id = r.couponActivityId
+        WHERE
+            u.userActivityId = #{activityId} and r.activityType =4
+        <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+            and (r.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+    </select>
+    <select id="getBlanceList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+        SELECT
+            b.id,
+            b.money,
+            c1.number,c1.useMoney,c1.useNumber,
+            c2.number speNumber,c2.useMoney speUserMoney,c2.useNumber speUseNumber,
+            c3.number taxiNumber,c3.useMoney taxiUserMoney,c3.useNumber taxiUseNumber,
+            c4.number intercityNumber,c4.useMoney intercityUserMoney,c4.useNumber intercityUseNumber
+        FROM
+            t_user_activity_balance b
+        LEFT JOIN (
+            SELECT
+                couponActivityId,
+                IFNULL(
+                    SUM(
+                        CASE
+                        WHEN r.state = 2 THEN
+                            r.money
+                        ELSE
+                            0
+                        END
+                    ),
+                    0
+                ) useMoney,
+                IFNULL(
+                    SUM(
+                        CASE
+                        WHEN r.state = 2 THEN
+                            1
+                        ELSE
+                            0
+                        END
+                    ),
+                    0
+                ) useNumber,
+                COUNT(r.id) number
+            FROM
+                t_user_coupon_record r
+            WHERE
+                r.activityType = 4 AND r.couponUseType=0
+                <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+                    and (r.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+                </if>
+                GROUP BY couponActivityId
+        ) c1 ON c1.couponActivityId=b.id
+        LEFT JOIN (
+            SELECT
+                couponActivityId,
+                IFNULL(
+                    SUM(
+                        CASE
+                        WHEN r.state = 2 THEN
+                            r.money
+                        ELSE
+                            0
+                        END
+                    ),
+                    0
+                ) useMoney,
+                IFNULL(
+                    SUM(
+                        CASE
+                        WHEN r.state = 2 THEN
+                            1
+                        ELSE
+                            0
+                        END
+                    ),
+                    0
+                ) useNumber,
+                COUNT(r.id) number
+            FROM
+                t_user_coupon_record r
+            WHERE
+                r.activityType = 4 AND r.couponUseType=1
+        <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+            and (r.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        GROUP BY couponActivityId
+        ) c2 ON c2.couponActivityId=b.id
+        LEFT JOIN (
+            SELECT
+                couponActivityId,
+                IFNULL(
+                    SUM(
+                        CASE
+                        WHEN r.state = 2 THEN
+                            r.money
+                        ELSE
+                            0
+                        END
+                    ),
+                    0
+                ) useMoney,
+                IFNULL(
+                    SUM(
+                        CASE
+                        WHEN r.state = 2 THEN
+                            1
+                        ELSE
+                            0
+                        END
+                    ),
+                    0
+                ) useNumber,
+                COUNT(r.id) number
+            FROM
+                t_user_coupon_record r
+            WHERE
+                r.activityType = 4 AND r.couponUseType=2
+        <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+            and (r.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        GROUP BY couponActivityId
+        ) c3 ON c3.couponActivityId=b.id
+        LEFT JOIN (
+            SELECT
+                couponActivityId,
+                IFNULL(
+                    SUM(
+                        CASE
+                        WHEN r.state = 2 THEN
+                            r.money
+                        ELSE
+                            0
+                        END
+                    ),
+                    0
+                ) useMoney,
+                IFNULL(
+                    SUM(
+                        CASE
+                        WHEN r.state = 2 THEN
+                            1
+                        ELSE
+                            0
+                        END
+                    ),
+                    0
+                ) useNumber,
+                COUNT(r.id) number
+            FROM
+                t_user_coupon_record r
+            WHERE
+                r.activityType = 4 AND r.couponUseType=3
+        <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+            and (r.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        GROUP BY couponActivityId
+        ) c4 ON c4.couponActivityId=b.id
+        WHERE
+            b.userActivityId = #{activityId}
+    </select>
+
+
+    <select id="queryCouponRegister" resultType="map">
+        select
+        da.time,
+        sum(da.receivePeople) as receivePeople,
+        sum(da.giving) as giving,
+        (sum(da.receivePeople) + sum(da.giving)) as receive,
+        sum(da.receiveMoney) as receiveMoney,
+        sum(da.usePeople) as usePeople,
+        sum(da.`use`) as `use`,
+        sum(da.useMoney) as useMoney
+        from (
+            select
+            aa.time,
+            count(aa.userId) as receivePeople,
+            0 as giving,
+            sum(aa.receiveMoney) as receiveMoney,
+            0 as usePeople,
+            0 as `use`,
+            0 as useMoney
+            from (
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time,
+                a.userId,
+                count(a.id) as receive,
+                sum(a.money) as receiveMoney
+                from t_user_coupon_record a
+                <if test="2 == type">
+                    left join t_user_activity_registered b on (a.couponActivityId = b.id and a.activityType = 2)
+                    left join t_user_activity c on (b.userActivityId = c.id)
+                </if>
+                <if test="3 == type">
+                    left join t_user_activity_invite b on (a.couponActivityId = b.id and a.activityType = 3)
+                    left join t_user_activity c on (b.userActivityId = c.id)
+                </if>
+                <if test="4 == type">
+                    left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                    left join t_user_activity c on (b.userActivityId = c.id)
+                </if>
+                where activityType = #{type}
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(insertTime, '%Y-%m-%d'),userId
+            ) as aa GROUP BY aa.time
+
+            union all
+
+            select
+            aa.time,
+            0,
+            0,
+            0,
+            count(aa.userId) as usePeople,
+            sum(aa.receive) as `use`,
+            sum(aa.receiveMoney) as useMoney
+            from (
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time,
+                a.userId,
+                count(a.id) as receive,
+                sum(a.money) as receiveMoney
+                from t_user_coupon_record a
+                <if test="2 == type">
+                    left join t_user_activity_registered b on (a.couponActivityId = b.id and a.activityType = 2)
+                    left join t_user_activity c on (b.userActivityId = c.id)
+                </if>
+                <if test="3 == type">
+                    left join t_user_activity_invite b on (a.couponActivityId = b.id and a.activityType = 3)
+                    left join t_user_activity c on (b.userActivityId = c.id)
+                </if>
+                <if test="4 == type">
+                    left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                    left join t_user_activity c on (b.userActivityId = c.id)
+                </if>
+                where a.activityType = #{type} and a.state = 2
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(insertTime, '%Y-%m-%d'),userId
+            ) as aa GROUP BY aa.time
+
+            <if test="2 == type">
+                union all
+
+                select
+                aa.time,
+                0,
+                count(aa.userId) as giving,
+                sum(aa.receiveMoney) as receiveMoney,
+                0 as usePeople,
+                0 as `use`,
+                0 as useMoney
+                from (
+                    select
+                    DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time,
+                    a.userId,
+                    count(a.id) as receive,
+                    sum(a.money) as receiveMoney
+                    from t_user_coupon_record a
+                    left join t_sys_coupon_record b on (a.couponActivityId = b.id and a.activityType = 1)
+                    where a.activityType = 1
+                    <if test="null != name and '' != name">
+                        and b.`name` like CONCAT('%', #{name}, '%')
+                    </if>
+                    <if test="null != start and '' != start and null != end and '' != end">
+                        and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                    </if>
+                    <if test="null != companyId">
+                        and b.companyId = #{companyId}
+                    </if>
+                    GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d'),userId
+                ) as aa GROUP BY aa.time
+            </if>
+          ) as da GROUP BY da.time order by da.time desc
+        <if test="null != offset and null != limit">
+            limit #{offset}, #{limit}
+        </if>
+    </select>
+
+
+    <select id="queryCouponRegisterCount" resultType="int">
+        select count(time) from (
+            select
+            count(da.time) as time
+            from (
+                select
+                aa.time,
+                count(aa.userId) as receivePeople,
+                0 as giving,
+                sum(aa.receiveMoney) as receiveMoney,
+                0 as usePeople,
+                0 as `use`,
+                0 as useMoney
+                from (
+                    select
+                    DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time,
+                    a.userId,
+                    count(a.id) as receive,
+                    sum(a.money) as receiveMoney
+                    from t_user_coupon_record a
+                    <if test="2 == type">
+                        left join t_user_activity_registered b on (a.couponActivityId = b.id and a.activityType = 2)
+                        left join t_user_activity c on (b.userActivityId = c.id)
+                    </if>
+                    <if test="3 == type">
+                        left join t_user_activity_invite b on (a.couponActivityId = b.id and a.activityType = 3)
+                        left join t_user_activity c on (b.userActivityId = c.id)
+                    </if>
+                    <if test="4 == type">
+                        left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                        left join t_user_activity c on (b.userActivityId = c.id)
+                    </if>
+                    where activityType = #{type}
+                    <if test="null != name and '' != name">
+                        and c.`name` like CONCAT('%', #{name}, '%')
+                    </if>
+                    <if test="null != start and '' != start and null != end and '' != end">
+                        and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                    </if>
+                    <if test="null != companyId">
+                        and c.companyId = #{companyId}
+                    </if>
+                    GROUP BY DATE_FORMAT(insertTime, '%Y-%m-%d'),userId
+                ) as aa GROUP BY aa.time
+
+                union all
+
+                select
+                aa.time,
+                0,
+                0,
+                0,
+                count(aa.userId) as usePeople,
+                sum(aa.receive) as `use`,
+                sum(aa.receiveMoney) as useMoney
+                from (
+                    select
+                    DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time,
+                    a.userId,
+                    count(a.id) as receive,
+                    sum(a.money) as receiveMoney
+                    from t_user_coupon_record a
+                    <if test="2 == type">
+                        left join t_user_activity_registered b on (a.couponActivityId = b.id and a.activityType = 2)
+                        left join t_user_activity c on (b.userActivityId = c.id)
+                    </if>
+                    <if test="3 == type">
+                        left join t_user_activity_invite b on (a.couponActivityId = b.id and a.activityType = 3)
+                        left join t_user_activity c on (b.userActivityId = c.id)
+                    </if>
+                    <if test="4 == type">
+                        left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                        left join t_user_activity c on (b.userActivityId = c.id)
+                    </if>
+                    where a.activityType = #{type} and a.state = 2
+                    <if test="null != name and '' != name">
+                        and c.`name` like CONCAT('%', #{name}, '%')
+                    </if>
+                    <if test="null != start and '' != start and null != end and '' != end">
+                        and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                    </if>
+                    <if test="null != companyId">
+                        and c.companyId = #{companyId}
+                    </if>
+                    GROUP BY DATE_FORMAT(insertTime, '%Y-%m-%d'),userId
+                ) as aa GROUP BY aa.time
+
+                <if test="2 == type">
+                    union all
+
+                    select
+                    aa.time,
+                    0,
+                    count(aa.userId) as giving,
+                    sum(aa.receiveMoney) as receiveMoney,
+                    0 as usePeople,
+                    0 as `use`,
+                    0 as useMoney
+                    from (
+                        select
+                        DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time,
+                        a.userId,
+                        count(a.id) as receive,
+                        sum(a.money) as receiveMoney
+                        from t_user_coupon_record a
+                        left join t_sys_coupon_record b on (a.couponActivityId = b.id and a.activityType = 1)
+                        where a.activityType = 1
+                        <if test="null != name and '' != name">
+                            and b.`name` like CONCAT('%', #{name}, '%')
+                        </if>
+                        <if test="null != start and '' != start and null != end and '' != end">
+                            and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                        </if>
+                        <if test="null != companyId">
+                            and b.companyId = #{companyId}
+                        </if>
+                        GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d'),userId
+                    ) as aa GROUP BY aa.time
+                </if>
+            ) as da GROUP BY da.time
+        ) as w
+    </select>
+
+
+    <select id="queryCouponRegisterInfo" resultType="map">
+        select
+        a.id as id,
+        DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+        d.nickName as userName,
+        d.phone as phone,
+        a.money as money,
+        DATE_FORMAT(a.expirationTime, '%Y-%m-%d %H:%i:%s') as expirationTime,
+        if(a.couponType = 1, '抵扣券', '满减券') as couponType,
+        if(a.state = 1, '未使用', if(a.state = 2, '已使用', '已过期')) as state,
+        DATE_FORMAT(a.endTime, '%Y-%m-%d %H:%i:%s') as endTime
+        from t_user_coupon_record a
+        <if test="2 == type">
+            left join t_user_activity_registered b on (a.couponActivityId = b.id and a.activityType = 2)
+            left join t_user_activity c on (b.userActivityId = c.id)
+        </if>
+        <if test="3 == type">
+            left join t_user_activity_invite b on (a.couponActivityId = b.id and a.activityType = 3)
+            left join t_user_activity c on (b.userActivityId = c.id)
+        </if>
+        left join t_user d on (a.userId = d.id)
+        where a.activityType = #{type}
+        <if test="null != name and '' != name">
+            and c.`name` like CONCAT('%', #{name}, '%')
+        </if>
+        <if test="null != start and '' != start and null != end and '' != end">
+            and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+        </if>
+        <if test="null != companyId">
+            and c.companyId = #{companyId}
+        </if>
+        order by a.insertTime desc
+        <if test="null != offset and null != limit">
+            limit #{offset}, #{limit}
+        </if>
+    </select>
+
+
+    <select id="queryCouponRegisterInfoCount" resultType="int">
+        select
+        count(a.id)
+        from t_user_coupon_record a
+        <if test="2 == type">
+            left join t_user_activity_registered b on (a.couponActivityId = b.id and a.activityType = 2)
+            left join t_user_activity c on (b.userActivityId = c.id)
+        </if>
+        <if test="3 == type">
+            left join t_user_activity_invite b on (a.couponActivityId = b.id and a.activityType = 3)
+            left join t_user_activity c on (b.userActivityId = c.id)
+        </if>
+        left join t_user d on (a.userId = d.id)
+        where a.activityType = #{type}
+        <if test="null != name and '' != name">
+            and c.`name` like CONCAT('%', #{name}, '%')
+        </if>
+        <if test="null != start and '' != start and null != end and '' != end">
+            and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+        </if>
+        <if test="null != companyId">
+            and c.companyId = #{companyId}
+        </if>
+    </select>
+
+
+
+    <select id="queryCouponRegisterInfo1" resultType="map">
+        select
+        aa.time,
+        aa.userId,
+        aa.userName,
+        aa.phone,
+        sum(aa.amount) as amount,
+        sum(aa.tyNum) as tyNum,
+        sum(aa.tyUseNum) as tyUseNum,
+        sum(aa.tyUseMoney) as tyUseMoney,
+        sum(aa.zcNum) as zcNum,
+        sum(aa.zcUseNum) as zcUseNum,
+        sum(aa.zcUseMoney) as zcUseMoney,
+        sum(aa.czcNum) as czcNum,
+        sum(aa.czcUseNum) as czcUseNum,
+        sum(aa.czcUseMoney) as czcUseMoney,
+        sum(aa.kcNum) as kcNum,
+        sum(aa.kcUseNum) as kcUseNum,
+        sum(aa.kcUseMoney) as kcUseMoney
+        from (
+            select
+            DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            d.nickName as userName,
+            d.phone as phone,
+            sum(e.amount) as amount,
+            count(a.id) as tyNum,
+            0 as tyUseNum,
+            0 as tyUseMoney,
+            0 as zcNum,
+            0 as zcUseNum,
+            0 as zcUseMoney,
+            0 as czcNum,
+            0 as czcUseNum,
+            0 as czcUseMoney,
+            0 as kcNum,
+            0 as kcUseNum,
+            0 as kcUseMoney
+            from t_user_coupon_record a
+            left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+            left join t_user_activity c on (b.userActivityId = c.id)
+            left join t_user d on (a.userId = d.id)
+            left join t_payment_record e on (a.paymentRecordId = e.id)
+            where a.activityType = 4 and a.couponUseType = 0
+            <if test="null != name and '' != name">
+                and c.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and c.companyId = #{companyId}
+            </if>
+            GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+            union all
+
+            select
+            DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            d.nickName as userName,
+            d.phone as phone,
+            0 as amount,
+            0 as tyNum,
+            count(a.id) as tyUseNum,
+            sum(a.money) as tyUseMoney,
+            0 as zcNum,
+            0 as zcUseNum,
+            0 as zcUseMoney,
+            0 as czcNum,
+            0 as czcUseNum,
+            0 as czcUseMoney,
+            0 as kcNum,
+            0 as kcUseNum,
+            0 as kcUseMoney
+            from t_user_coupon_record a
+            left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+            left join t_user_activity c on (b.userActivityId = c.id)
+            left join t_user d on (a.userId = d.id)
+            left join t_payment_record e on (a.paymentRecordId = e.id)
+            where a.activityType = 4 and a.couponUseType = 0 and a.state = 2
+            <if test="null != name and '' != name">
+                and c.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and c.companyId = #{companyId}
+            </if>
+            GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+
+            union all
+
+            select
+            DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            d.nickName as userName,
+            d.phone as phone,
+            0 as amount,
+            0 as tyNum,
+            0 as tyUseNum,
+            0 as tyUseMoney,
+            count(a.id) as zcNum,
+            0 as zcUseNum,
+            0 as zcUseMoney,
+            0 as czcNum,
+            0 as czcUseNum,
+            0 as czcUseMoney,
+            0 as kcNum,
+            0 as kcUseNum,
+            0 as kcUseMoney
+            from t_user_coupon_record a
+            left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+            left join t_user_activity c on (b.userActivityId = c.id)
+            left join t_user d on (a.userId = d.id)
+            left join t_payment_record e on (a.paymentRecordId = e.id)
+            where a.activityType = 4 and a.couponUseType = 1
+            <if test="null != name and '' != name">
+                and c.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and c.companyId = #{companyId}
+            </if>
+            GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+            union all
+
+            select
+            DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            d.nickName as userName,
+            d.phone as phone,
+            0 as amount,
+            0 as tyNum,
+            0 as tyUseNum,
+            0 as tyUseMoney,
+            0 as zcNum,
+            count(a.id) as zcUseNum,
+            sum(a.money) as zcUseMoney,
+            0 as czcNum,
+            0 as czcUseNum,
+            0 as czcUseMoney,
+            0 as kcNum,
+            0 as kcUseNum,
+            0 as kcUseMoney
+            from t_user_coupon_record a
+            left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+            left join t_user_activity c on (b.userActivityId = c.id)
+            left join t_user d on (a.userId = d.id)
+            left join t_payment_record e on (a.paymentRecordId = e.id)
+            where a.activityType = 4 and a.couponUseType = 1 and a.state = 2
+            <if test="null != name and '' != name">
+                and c.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and c.companyId = #{companyId}
+            </if>
+            GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+            union all
+
+            select
+            DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            d.nickName as userName,
+            d.phone as phone,
+            0 as amount,
+            0 as tyNum,
+            0 as tyUseNum,
+            0 as tyUseMoney,
+            0 as zcNum,
+            0 as zcUseNum,
+            0 as zcUseMoney,
+            count(a.id) as czcNum,
+            0 as czcUseNum,
+            0 as czcUseMoney,
+            0 as kcNum,
+            0 as kcUseNum,
+            0 as kcUseMoney
+            from t_user_coupon_record a
+            left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+            left join t_user_activity c on (b.userActivityId = c.id)
+            left join t_user d on (a.userId = d.id)
+            left join t_payment_record e on (a.paymentRecordId = e.id)
+            where a.activityType = 4 and a.couponUseType = 2
+            <if test="null != name and '' != name">
+                and c.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and c.companyId = #{companyId}
+            </if>
+            GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+            union all
+
+            select
+            DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            d.nickName as userName,
+            d.phone as phone,
+            0 as amount,
+            0 as tyNum,
+            0 as tyUseNum,
+            0 as tyUseMoney,
+            0 as zcNum,
+            0 as zcUseNum,
+            0 as zcUseMoney,
+            0 as czcNum,
+            count(a.id) as czcUseNum,
+            sum(a.money) as czcUseMoney,
+            0 as kcNum,
+            0 as kcUseNum,
+            0 as kcUseMoney
+            from t_user_coupon_record a
+            left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+            left join t_user_activity c on (b.userActivityId = c.id)
+            left join t_user d on (a.userId = d.id)
+            left join t_payment_record e on (a.paymentRecordId = e.id)
+            where a.activityType = 4 and a.couponUseType = 2 and a.state = 2
+            <if test="null != name and '' != name">
+                and c.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and c.companyId = #{companyId}
+            </if>
+            GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+            union all
+
+            select
+            DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            d.nickName as userName,
+            d.phone as phone,
+            0 as amount,
+            0 as tyNum,
+            0 as tyUseNum,
+            0 as tyUseMoney,
+            0 as zcNum,
+            0 as zcUseNum,
+            0 as zcUseMoney,
+            0 as czcNum,
+            0 as czcUseNum,
+            0 as czcUseMoney,
+            count(a.id) as kcNum,
+            0 as kcUseNum,
+            0 as kcUseMoney
+            from t_user_coupon_record a
+            left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+            left join t_user_activity c on (b.userActivityId = c.id)
+            left join t_user d on (a.userId = d.id)
+            left join t_payment_record e on (a.paymentRecordId = e.id)
+            where a.activityType = 4 and a.couponUseType = 3
+            <if test="null != name and '' != name">
+                and c.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and c.companyId = #{companyId}
+            </if>
+            GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+            union all
+
+            select
+            DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+            a.userId as userId,
+            d.nickName as userName,
+            d.phone as phone,
+            0 as amount,
+            0 as tyNum,
+            0 as tyUseNum,
+            0 as tyUseMoney,
+            0 as zcNum,
+            0 as zcUseNum,
+            0 as zcUseMoney,
+            0 as czcNum,
+            0 as czcUseNum,
+            0 as czcUseMoney,
+            0 as kcNum,
+            count(a.id) as kcUseNum,
+            sum(a.money) as kcUseMoney
+            from t_user_coupon_record a
+            left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+            left join t_user_activity c on (b.userActivityId = c.id)
+            left join t_user d on (a.userId = d.id)
+            left join t_payment_record e on (a.paymentRecordId = e.id)
+            where a.activityType = 4 and a.couponUseType = 3 and a.state = 2
+            <if test="null != name and '' != name">
+                and c.`name` like CONCAT('%', #{name}, '%')
+            </if>
+            <if test="null != start and '' != start and null != end and '' != end">
+                and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+            </if>
+            <if test="null != companyId">
+                and c.companyId = #{companyId}
+            </if>
+            GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+        ) as aa GROUP BY aa.time,aa.userId order by aa.time desc
+        <if test="null != offset and null != limit">
+            limit #{offset}, #{limit}
+        </if>
+    </select>
+
+
+    <select id="queryCouponRegisterInfo1Count" resultType="int">
+        select
+        count(w.time)
+        from (
+            select
+            aa.time as time
+            from (
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+                a.userId as userId,
+                d.nickName as userName,
+                d.phone as phone,
+                sum(e.amount) as amount,
+                count(a.id) as tyNum,
+                0 as tyUseNum,
+                0 as tyUseMoney,
+                0 as zcNum,
+                0 as zcUseNum,
+                0 as zcUseMoney,
+                0 as czcNum,
+                0 as czcUseNum,
+                0 as czcUseMoney,
+                0 as kcNum,
+                0 as kcUseNum,
+                0 as kcUseMoney
+                from t_user_coupon_record a
+                left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                left join t_user d on (a.userId = d.id)
+                left join t_payment_record e on (a.paymentRecordId = e.id)
+                where a.activityType = 4 and a.couponUseType = 0
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+                union all
+
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+                a.userId as userId,
+                d.nickName as userName,
+                d.phone as phone,
+                0 as amount,
+                0 as tyNum,
+                count(a.id) as tyUseNum,
+                sum(a.money) as tyUseMoney,
+                0 as zcNum,
+                0 as zcUseNum,
+                0 as zcUseMoney,
+                0 as czcNum,
+                0 as czcUseNum,
+                0 as czcUseMoney,
+                0 as kcNum,
+                0 as kcUseNum,
+                0 as kcUseMoney
+                from t_user_coupon_record a
+                left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                left join t_user d on (a.userId = d.id)
+                left join t_payment_record e on (a.paymentRecordId = e.id)
+                where a.activityType = 4 and a.couponUseType = 0 and a.state = 2
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+
+                union all
+
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+                a.userId as userId,
+                d.nickName as userName,
+                d.phone as phone,
+                0 as amount,
+                0 as tyNum,
+                0 as tyUseNum,
+                0 as tyUseMoney,
+                count(a.id) as zcNum,
+                0 as zcUseNum,
+                0 as zcUseMoney,
+                0 as czcNum,
+                0 as czcUseNum,
+                0 as czcUseMoney,
+                0 as kcNum,
+                0 as kcUseNum,
+                0 as kcUseMoney
+                from t_user_coupon_record a
+                left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                left join t_user d on (a.userId = d.id)
+                left join t_payment_record e on (a.paymentRecordId = e.id)
+                where a.activityType = 4 and a.couponUseType = 1
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+                union all
+
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+                a.userId as userId,
+                d.nickName as userName,
+                d.phone as phone,
+                0 as amount,
+                0 as tyNum,
+                0 as tyUseNum,
+                0 as tyUseMoney,
+                0 as zcNum,
+                count(a.id) as zcUseNum,
+                sum(a.money) as zcUseMoney,
+                0 as czcNum,
+                0 as czcUseNum,
+                0 as czcUseMoney,
+                0 as kcNum,
+                0 as kcUseNum,
+                0 as kcUseMoney
+                from t_user_coupon_record a
+                left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                left join t_user d on (a.userId = d.id)
+                left join t_payment_record e on (a.paymentRecordId = e.id)
+                where a.activityType = 4 and a.couponUseType = 1 and a.state = 2
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+                union all
+
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+                a.userId as userId,
+                d.nickName as userName,
+                d.phone as phone,
+                0 as amount,
+                0 as tyNum,
+                0 as tyUseNum,
+                0 as tyUseMoney,
+                0 as zcNum,
+                0 as zcUseNum,
+                0 as zcUseMoney,
+                count(a.id) as czcNum,
+                0 as czcUseNum,
+                0 as czcUseMoney,
+                0 as kcNum,
+                0 as kcUseNum,
+                0 as kcUseMoney
+                from t_user_coupon_record a
+                left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                left join t_user d on (a.userId = d.id)
+                left join t_payment_record e on (a.paymentRecordId = e.id)
+                where a.activityType = 4 and a.couponUseType = 2
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+                union all
+
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+                a.userId as userId,
+                d.nickName as userName,
+                d.phone as phone,
+                0 as amount,
+                0 as tyNum,
+                0 as tyUseNum,
+                0 as tyUseMoney,
+                0 as zcNum,
+                0 as zcUseNum,
+                0 as zcUseMoney,
+                0 as czcNum,
+                count(a.id) as czcUseNum,
+                sum(a.money) as czcUseMoney,
+                0 as kcNum,
+                0 as kcUseNum,
+                0 as kcUseMoney
+                from t_user_coupon_record a
+                left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                left join t_user d on (a.userId = d.id)
+                left join t_payment_record e on (a.paymentRecordId = e.id)
+                where a.activityType = 4 and a.couponUseType = 2 and a.state = 2
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+                union all
+
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+                a.userId as userId,
+                d.nickName as userName,
+                d.phone as phone,
+                0 as amount,
+                0 as tyNum,
+                0 as tyUseNum,
+                0 as tyUseMoney,
+                0 as zcNum,
+                0 as zcUseNum,
+                0 as zcUseMoney,
+                0 as czcNum,
+                0 as czcUseNum,
+                0 as czcUseMoney,
+                count(a.id) as kcNum,
+                0 as kcUseNum,
+                0 as kcUseMoney
+                from t_user_coupon_record a
+                left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                left join t_user d on (a.userId = d.id)
+                left join t_payment_record e on (a.paymentRecordId = e.id)
+                where a.activityType = 4 and a.couponUseType = 3
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+
+                union all
+
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+                a.userId as userId,
+                d.nickName as userName,
+                d.phone as phone,
+                0 as amount,
+                0 as tyNum,
+                0 as tyUseNum,
+                0 as tyUseMoney,
+                0 as zcNum,
+                0 as zcUseNum,
+                0 as zcUseMoney,
+                0 as czcNum,
+                0 as czcUseNum,
+                0 as czcUseMoney,
+                0 as kcNum,
+                count(a.id) as kcUseNum,
+                sum(a.money) as kcUseMoney
+                from t_user_coupon_record a
+                left join t_user_activity_balance b on (a.couponActivityId = b.id and a.activityType = 4)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                left join t_user d on (a.userId = d.id)
+                left join t_payment_record e on (a.paymentRecordId = e.id)
+                where a.activityType = 4 and a.couponUseType = 3 and a.state = 2
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s'),a.userId
+            ) as aa GROUP BY aa.time,aa.userId
+        ) w
+    </select>
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml
new file mode 100644
index 0000000..39c0cf3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserMapper.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserMapper">
+
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.User">
+		<id column="id" property="id" />
+		<result column="avatar" property="avatar" />
+		<result column="account" property="account" />
+		<result column="password" property="password" />
+		<result column="passWordUpdate" property="passWordUpdate"/>
+		<result column="salt" property="salt" />
+		<result column="name" property="name" />
+		<result column="birthday" property="birthday" />
+		<result column="sex" property="sex" />
+		<result column="email" property="email" />
+		<result column="phone" property="phone" />
+		<result column="roleid" property="roleid" />
+		<result column="deptid" property="deptid" />
+		<result column="status" property="status" />
+		<result column="createtime" property="createtime" />
+		<result column="version" property="version" />
+	</resultMap>
+
+	<sql id="Base_Column_List">
+		id, account, name, birthday, sex, email, avatar,
+		phone, roleid,
+		deptid, status,
+		createtime, version
+	</sql>
+
+	<sql id="Base_Column_List_With_Pwd">
+		id, account, name, birthday,password, sex, email, avatar,
+		phone, roleid,salt,
+		deptid, status,
+		createtime, version
+	</sql>
+
+	<select id="selectUsers" resultType="map">
+		select
+		<include refid="Base_Column_List" />
+		from sys_user
+		where status != 3
+		<if test="name != null and name != ''">
+			and (phone like CONCAT('%',#{name},'%')
+			or account like CONCAT('%',#{name},'%')
+			or name like CONCAT('%',#{name},'%'))
+		</if>
+		<if test="deptid != null and deptid != 0">
+			and (deptid = #{deptid} or deptid in ( select id from sys_dept where pids like CONCAT('%[', #{deptid}, ']%') ))
+		</if>
+		<if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+			and (createTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+		</if>
+	</select>
+
+	<update id="setStatus">
+		update sys_user set status = #{status} where id =
+		#{userId}
+	</update>
+
+	<update id="changePwd">
+		update sys_user set password = #{pwd} where id =
+		#{userId}
+	</update>
+
+	<update id="setRoles">
+		update sys_user set roleid = #{roleIds} where id =
+		#{userId}
+	</update>
+
+	<select id="getByAccount" resultType="user">
+		select
+		<include refid="Base_Column_List_With_Pwd" />
+		from sys_user where account = #{account} and status != 3
+	</select>
+
+	<!--根据角色判断菜单有"首页"的数量-->
+	<select id="getMenuNumByRole" resultType="java.lang.Integer">
+		SELECT IFNULL(COUNT(menuid),0) as num from sys_relation where roleid in (#{roleStr}) and menuid = 2
+	</select>
+
+	<select id="getUserListPage" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
+		SELECT * FROM (select CASE when d2.simplename is null then d1.simplename else d2.simplename end as parentName,
+		case when uu.sex = 1 then '男' when uu.sex = 2 then '女' else '' end as sexName,
+		d1.simplename as deptName,case when uu.status = 1 then '启用' when uu.status = 2 then '冻结' when uu.status = 3 then '删除' else '' end as statusName,
+		rr.roleName,
+		uu.* from sys_user as uu
+		LEFT JOIN sys_dept as d1 on d1.id = uu.deptid
+		LEFT JOIN sys_dept as d2 on d2.id = d1.pid
+		LEFT JOIN (select s.id,s.name,GROUP_CONCAT(r.name) as roleName from sys_user s
+		left join sys_role r on find_in_set(r.id,s.roleid) group by s.id) as rr on rr.id = uu.id
+		) as o
+		<where>
+			o.status != 3
+			<if test="name != null and name != ''">
+				and (o.phone like CONCAT('%',#{name},'%')
+				or o.account like CONCAT('%',#{name},'%')
+				or o.name like CONCAT('%',#{name},'%'))
+			</if>
+			<if test="deptid != null and deptid != 0">
+				and (o.deptid = #{deptid} or o.deptid in ( select id from sys_dept where pids like CONCAT('%[', #{deptid}, ']%') ))
+			</if>
+			<if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+				and (o.createTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+			</if>
+		</where>
+		order by o.id desc
+	</select>
+
+</mapper>
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserRedPacketRecordMapper.xml b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserRedPacketRecordMapper.xml
new file mode 100644
index 0000000..39cd2c7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserRedPacketRecordMapper.xml
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.UserRedPacketRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.UserRedPacketRecord">
+        <id column="id" property="id"/>
+        <result column="money" property="money"/>
+        <result column="expirationTime" property="expirationTime"/>
+        <result column="insertTime" property="insertTime"/>
+        <result column="companyId" property="companyId"/>
+        <result column="state" property="state"/>
+        <result column="endTime" property="endTime"/>
+        <result column="orderId" property="orderId"/>
+        <result column="orderType" property="orderType"/>
+        <result column="userId" property="userId"/>
+        <result column="redPacketActivityId" property="redPacketActivityId"/>
+    </resultMap>
+
+
+
+    <select id="queryRedEnvelopes" resultType="map">
+        select
+        da.time,
+        sum(da.receivePeople) as receivePeople,
+        sum(da.receive) as receive,
+        sum(da.receiveMoney) as receiveMoney,
+        sum(da.usePeople) as usePeople,
+        sum(da.`use`) as `use`,
+        sum(da.useMoney) as useMoney
+        from (
+            select
+            aa.time,
+            count(aa.userId) as receivePeople,
+            sum(aa.receive) as receive,
+            sum(aa.receiveMoney) as receiveMoney,
+            0 as usePeople,
+            0 as `use`,
+            0 as useMoney
+            from (
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time,
+                a.userId,
+                count(a.id) as receive,
+                sum(a.money) as receiveMoney
+                from t_user_red_packet_record a
+                left join t_user_activity_redenvelope b on (a.redPacketActivityId = b.id)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                where 1 = 1
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d'), a.userId
+            ) as aa GROUP BY aa.time
+
+            union all
+
+            select
+            aa.time,
+            0,
+            0,
+            0,
+            count(aa.userId) as usePeople,
+            sum(aa.`use`) as `use`,
+            sum(aa.useMoney) as useMoney
+            from (
+                select
+                DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time,
+                a.userId,
+                count(a.id) as `use`,
+                sum(a.money) as useMoney
+                from t_user_red_packet_record a
+                left join t_user_activity_redenvelope b on (a.redPacketActivityId = b.id)
+                left join t_user_activity c on (b.userActivityId = c.id)
+                where a.state=  2
+                <if test="null != name and '' != name">
+                    and c.`name` like CONCAT('%', #{name}, '%')
+                </if>
+                <if test="null != start and '' != start and null != end and '' != end">
+                    and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                </if>
+                <if test="null != companyId">
+                    and c.companyId = #{companyId}
+                </if>
+                GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d'), a.userId
+            ) as aa GROUP BY aa.time
+        ) as da GROUP BY da.time order by da.time desc
+        <if test="null != offset and null != limit">
+            limit #{offset}, #{limit}
+        </if>
+    </select>
+
+
+
+    <select id="queryRedEnvelopesCount" resultType="int">
+        select count(time) from (
+            select
+            count(da.time) as time
+            from (
+                select
+                aa.time,
+                sum(aa.userId) as receivePeople,
+                sum(aa.receive) as receive,
+                sum(aa.receiveMoney) as receiveMoney,
+                0 as usePeople,
+                0 as `use`,
+                0 as useMoney
+                from (
+                    select
+                    DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time,
+                    a.userId,
+                    count(a.id) as receive,
+                    sum(a.money) as receiveMoney
+                    from t_user_red_packet_record a
+                    left join t_user_activity_redenvelope b on (a.redPacketActivityId = b.id)
+                    left join t_user_activity c on (b.userActivityId = c.id)
+                    where 1 = 1
+                    <if test="null != name and '' != name">
+                        and c.`name` like CONCAT('%', #{name}, '%')
+                    </if>
+                    <if test="null != start and '' != start and null != end and '' != end">
+                        and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                    </if>
+                    <if test="null != companyId">
+                        and c.companyId = #{companyId}
+                    </if>
+                    GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d'), a.userId
+                ) as aa GROUP BY aa.time
+
+                union all
+
+                select
+                aa.time,
+                0,
+                0,
+                0,
+                count(aa.userId) as usePeople,
+                sum(aa.`use`) as `use`,
+                sum(aa.useMoney) as useMoney
+                from (
+                    select
+                    DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time,
+                    a.userId,
+                    count(a.id) as `use`,
+                    sum(a.money) as useMoney
+                    from t_user_red_packet_record a
+                    left join t_user_activity_redenvelope b on (a.redPacketActivityId = b.id)
+                    left join t_user_activity c on (b.userActivityId = c.id)
+                    where a.state=  2
+                    <if test="null != name and '' != name">
+                        and c.`name` like CONCAT('%', #{name}, '%')
+                    </if>
+                    <if test="null != start and '' != start and null != end and '' != end">
+                        and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+                    </if>
+                    <if test="null != companyId">
+                        and c.companyId = #{companyId}
+                    </if>
+                    GROUP BY DATE_FORMAT(a.insertTime, '%Y-%m-%d'), a.userId
+                ) as aa GROUP BY aa.time
+            ) as da GROUP BY da.time
+        ) as w
+    </select>
+
+
+    <select id="queryRedEnvelopesInfo" resultType="map">
+        select
+        DATE_FORMAT(a.insertTime, '%Y-%m-%d %H:%i:%s') as time,
+        a.userId as userId,
+        d.nickName as `name`,
+        d.phone as phone,
+        a.money as money,
+        DATE_FORMAT(a.expirationTime, '%Y-%m-%d %H:%i:%s') as expirationTime,
+        if(a.state = 1, '未使用', if(a.state = 2, '已使用', '已过期')) as state,
+        DATE_FORMAT(a.endTime, '%Y-%m-%d %H:%i:%s') as endTime
+        from t_user_red_packet_record a
+        left join t_user_activity_redenvelope b on (a.redPacketActivityId = b.id)
+        left join t_user_activity c on (b.userActivityId = c.id)
+        left join t_user d on (a.userId = d.id)
+        <if test="null != name and '' != name">
+            and c.`name` like CONCAT('%', #{name}, '%')
+        </if>
+        <if test="null != start and '' != start and null != end and '' != end">
+            and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+        </if>
+        <if test="null != companyId">
+            and c.companyId = #{companyId}
+        </if>
+        order by a.insertTime desc
+        <if test="null != offset and null != limit">
+            limit #{offset}, #{limit}
+        </if>
+    </select>
+
+    <select id="queryRedEnvelopesInfoCount" resultType="int">
+        select
+        count(a.id)
+        from t_user_red_packet_record a
+        left join t_user_activity_redenvelope b on (a.redPacketActivityId = b.id)
+        left join t_user_activity c on (b.userActivityId = c.id)
+        left join t_user d on (a.userId = d.id)
+        <if test="null != name and '' != name">
+            and c.`name` like CONCAT('%', #{name}, '%')
+        </if>
+        <if test="null != start and '' != start and null != end and '' != end">
+            and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end}
+        </if>
+        <if test="null != companyId">
+            and c.companyId = #{companyId}
+        </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/factory/UserFactory.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/factory/UserFactory.java
new file mode 100644
index 0000000..508b65d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/factory/UserFactory.java
@@ -0,0 +1,54 @@
+package com.stylefeng.guns.modular.system.factory;
+
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.transfer.UserDto;
+import org.springframework.beans.BeanUtils;
+
+/**
+ * 用户创建工厂
+ *
+ * @author fengshuonan
+ * @date 2017-05-05 22:43
+ */
+public class UserFactory {
+
+    public static User createUser(UserDto userDto) {
+        if (userDto == null) {
+            return null;
+        } else {
+            User user = new User();
+            BeanUtils.copyProperties(userDto, user);
+            return user;
+        }
+    }
+
+    public static User editUser(UserDto newUser, User oldUser) {
+        if (newUser == null || oldUser == null) {
+            return oldUser;
+        } else {
+            if (ToolUtil.isNotEmpty(newUser.getAvatar())) {
+                oldUser.setAvatar(newUser.getAvatar());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getName())) {
+                oldUser.setName(newUser.getName());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getBirthday())) {
+                oldUser.setBirthday(newUser.getBirthday());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getDeptid())) {
+                oldUser.setDeptid(newUser.getDeptid());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getSex())) {
+                oldUser.setSex(newUser.getSex());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getEmail())) {
+                oldUser.setEmail(newUser.getEmail());
+            }
+            if (ToolUtil.isNotEmpty(newUser.getPhone())) {
+                oldUser.setPhone(newUser.getPhone());
+            }
+            return oldUser;
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarInsurance.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarInsurance.java
new file mode 100644
index 0000000..86c27a9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarInsurance.java
@@ -0,0 +1,134 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 车辆保险
+ */
+@TableName("t_car_insurance")
+public class CarInsurance {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 车辆id
+     */
+    @TableField("carId")
+    private Integer carId;
+    /**
+     * 保险公司名称
+     */
+    @TableField("insurCom")
+    private String insurCom;
+    /**
+     * 保险号
+     */
+    @TableField("insurNum")
+    private String insurNum;
+    /**
+     * 保险类型
+     */
+    @TableField("insurType")
+    private String insurType;
+    /**
+     * 保险金额
+     */
+    @TableField("insurCount")
+    private Double insurCount;
+    /**
+     * 保险生效日期
+     */
+    @TableField("insurEff")
+    private Date insurEff;
+    /**
+     * 保险到期日期
+     */
+    @TableField("insurExp")
+    private Date insurExp;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getInsurCom() {
+        return insurCom;
+    }
+
+    public void setInsurCom(String insurCom) {
+        this.insurCom = insurCom;
+    }
+
+    public String getInsurNum() {
+        return insurNum;
+    }
+
+    public void setInsurNum(String insurNum) {
+        this.insurNum = insurNum;
+    }
+
+    public String getInsurType() {
+        return insurType;
+    }
+
+    public void setInsurType(String insurType) {
+        this.insurType = insurType;
+    }
+
+    public Double getInsurCount() {
+        return insurCount;
+    }
+
+    public void setInsurCount(Double insurCount) {
+        this.insurCount = insurCount;
+    }
+
+    public Date getInsurEff() {
+        return insurEff;
+    }
+
+    public void setInsurEff(Date insurEff) {
+        this.insurEff = insurEff;
+    }
+
+    public Date getInsurExp() {
+        return insurExp;
+    }
+
+    public void setInsurExp(Date insurExp) {
+        this.insurExp = insurExp;
+    }
+
+    @Override
+    public String toString() {
+        return "CarInsurance{" +
+                "id=" + id +
+                ", carId=" + carId +
+                ", insurCom='" + insurCom + '\'' +
+                ", insurNum='" + insurNum + '\'' +
+                ", insurType='" + insurType + '\'' +
+                ", insurCount=" + insurCount +
+                ", insurEff=" + insurEff +
+                ", insurExp=" + insurExp +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dept.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dept.java
new file mode 100644
index 0000000..0790865
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dept.java
@@ -0,0 +1,140 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 部门表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_dept")
+public class Dept extends Model<Dept> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 排序
+     */
+	private Integer num;
+    /**
+     * 父部门id
+     */
+	private Integer pid;
+    /**
+     * 父级ids
+     */
+	private String pids;
+    /**
+     * 简称
+     */
+	private String simplename;
+    /**
+     * 全称
+     */
+	private String fullname;
+    /**
+     * 提示
+     */
+	private String tips;
+    /**
+     * 版本(乐观锁保留字段)
+     */
+	private Integer version;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getNum() {
+		return num;
+	}
+
+	public void setNum(Integer num) {
+		this.num = num;
+	}
+
+	public Integer getPid() {
+		return pid;
+	}
+
+	public void setPid(Integer pid) {
+		this.pid = pid;
+	}
+
+	public String getPids() {
+		return pids;
+	}
+
+	public void setPids(String pids) {
+		this.pids = pids;
+	}
+
+	public String getSimplename() {
+		return simplename;
+	}
+
+	public void setSimplename(String simplename) {
+		this.simplename = simplename;
+	}
+
+	public String getFullname() {
+		return fullname;
+	}
+
+	public void setFullname(String fullname) {
+		this.fullname = fullname;
+	}
+
+	public String getTips() {
+		return tips;
+	}
+
+	public void setTips(String tips) {
+		this.tips = tips;
+	}
+
+	public Integer getVersion() {
+		return version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "Dept{" +
+			"id=" + id +
+			", num=" + num +
+			", pid=" + pid +
+			", pids=" + pids +
+			", simplename=" + simplename +
+			", fullname=" + fullname +
+			", tips=" + tips +
+			", version=" + version +
+			"}";
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dict.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dict.java
new file mode 100644
index 0000000..b021b4b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Dict.java
@@ -0,0 +1,116 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 字典表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_dict")
+public class Dict extends Model<Dict> {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 主键id
+	 */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+	/**
+	 * 排序
+	 */
+	private Integer num;
+	/**
+	 * 父级字典
+	 */
+	private Integer pid;
+	/**
+	 * 名称
+	 */
+	private String name;
+
+	/**
+	 * 编码
+	 */
+	private String code;
+	/**
+	 * 提示
+	 */
+	private String tips;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getNum() {
+		return num;
+	}
+
+	public void setNum(Integer num) {
+		this.num = num;
+	}
+
+	public Integer getPid() {
+		return pid;
+	}
+
+	public void setPid(Integer pid) {
+		this.pid = pid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getTips() {
+		return tips;
+	}
+
+	public void setTips(String tips) {
+		this.tips = tips;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	@Override
+	public String toString() {
+		return "Dict{" +
+				"id=" + id +
+				", num=" + num +
+				", pid=" + pid +
+				", name='" + name + '\'' +
+				", code='" + code + '\'' +
+				", tips='" + tips + '\'' +
+				'}';
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivity.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivity.java
new file mode 100644
index 0000000..d959fa8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivity.java
@@ -0,0 +1,146 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 司机活动主表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@TableName("t_driver_activity")
+public class DriverActivity extends Model<DriverActivity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 活动名称
+     */
+    private String name;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 状态(1=待审核,2=驳回,3=通过)
+     */
+    private Integer status;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    private Date endTime;
+
+    private Integer companyType;
+
+    public Integer getCompanyType() {
+        return companyType;
+    }
+
+    public void setCompanyType(Integer companyType) {
+        this.companyType = companyType;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverActivity{" +
+        "id=" + id +
+        ", name=" + name +
+        ", companyId=" + companyId +
+        ", insertTime=" + insertTime +
+        ", status=" + status +
+        ", remark=" + remark +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityHistory.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityHistory.java
new file mode 100644
index 0000000..374d76f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityHistory.java
@@ -0,0 +1,151 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 司机完成活动记录
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@TableName("t_driver_activity_history")
+public class DriverActivityHistory extends Model<DriverActivityHistory> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 活动日期
+     */
+    private Date day;
+    /**
+     * 司机id
+     */
+    private Integer driverId;
+    /**
+     * 活动类型(1=邀请司机注册,2=邀请用户注册,3=累计在线,4=订单量)
+     */
+    private Integer type;
+    /**
+     * 活动id
+     */
+    private Integer activityId;
+    /**
+     * 是否完成(1=未完成,2=已完成)
+     */
+    private Integer carryOut;
+    /**
+     * 奖励金额
+     */
+    private Double money;
+    //领取时间
+    private Date collectionTime;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getDay() {
+        return day;
+    }
+
+    public void setDay(Date day) {
+        this.day = day;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public Integer getCarryOut() {
+        return carryOut;
+    }
+
+    public void setCarryOut(Integer carryOut) {
+        this.carryOut = carryOut;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Date getCollectionTime() {
+        return collectionTime;
+    }
+
+    public void setCollectionTime(Date collectionTime) {
+        this.collectionTime = collectionTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverActivityHistory{" +
+        "id=" + id +
+        ", day=" + day +
+        ", driverId=" + driverId +
+        ", type=" + type +
+        ", activityId=" + activityId +
+        ", carryOut=" + carryOut +
+        ", money=" + money +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityOnline.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityOnline.java
new file mode 100644
index 0000000..cbcadac
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityOnline.java
@@ -0,0 +1,150 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 司机活动-在线
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@TableName("t_driver_activity_online")
+public class DriverActivityOnline extends Model<DriverActivityOnline> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 司机活动id
+     */
+    private Integer driverActivityId;
+    /**
+     * 1=专车,2=出租车,3=城际
+     */
+    private Integer type;
+    /**
+     * 在线小时
+     */
+    private Integer online;
+    /**
+     * 奖励金额
+     */
+    private Double money;
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    private Date endTime;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getDriverActivityId() {
+        return driverActivityId;
+    }
+
+    public void setDriverActivityId(Integer driverActivityId) {
+        this.driverActivityId = driverActivityId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getOnline() {
+        return online;
+    }
+
+    public void setOnline(Integer online) {
+        this.online = online;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverActivityOnline{" +
+        "id=" + id +
+        ", companyId=" + companyId +
+        ", driverActivityId=" + driverActivityId +
+        ", type=" + type +
+        ", online=" + online +
+        ", money=" + money +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityOrder.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityOrder.java
new file mode 100644
index 0000000..e7125d0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityOrder.java
@@ -0,0 +1,163 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 司机活动-订单
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@TableName("t_driver_activity_order")
+public class DriverActivityOrder extends Model<DriverActivityOrder> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 司机活动id
+     */
+    private Integer driverActivityId;
+    /**
+     * 每天开始时间(08:00)
+     */
+    private String start;
+    /**
+     * 每天结束时间(17:00)
+     */
+    private String end;
+    /**
+     * 订单数量
+     */
+    private Integer orderNum;
+    /**
+     * 奖励金额
+     */
+    private Double money;
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    private Date endTime;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getDriverActivityId() {
+        return driverActivityId;
+    }
+
+    public void setDriverActivityId(Integer driverActivityId) {
+        this.driverActivityId = driverActivityId;
+    }
+
+    public String getStart() {
+        return start;
+    }
+
+    public void setStart(String start) {
+        this.start = start;
+    }
+
+    public String getEnd() {
+        return end;
+    }
+
+    public void setEnd(String end) {
+        this.end = end;
+    }
+
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverActivityOrder{" +
+        "id=" + id +
+        ", companyId=" + companyId +
+        ", driverActivityId=" + driverActivityId +
+        ", start=" + start +
+        ", end=" + end +
+        ", orderNum=" + orderNum +
+        ", money=" + money +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityRegistered.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityRegistered.java
new file mode 100644
index 0000000..e3d8fbb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverActivityRegistered.java
@@ -0,0 +1,137 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 司机活动-注册
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@TableName("t_driver_activity_registered")
+public class DriverActivityRegistered extends Model<DriverActivityRegistered> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 司机活动主表id
+     */
+    private Integer driverActivityId;
+    /**
+     * 1=邀请司机注册奖励,2=邀请用户注册奖励
+     */
+    private Integer type;
+    /**
+     * 奖励金额
+     */
+    private Double money;
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    private Date endTime;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getDriverActivityId() {
+        return driverActivityId;
+    }
+
+    public void setDriverActivityId(Integer driverActivityId) {
+        this.driverActivityId = driverActivityId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverActivityRegistered{" +
+        "id=" + id +
+        ", companyId=" + companyId +
+        ", driverActivityId=" + driverActivityId +
+        ", type=" + type +
+        ", money=" + money +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverOnline.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverOnline.java
new file mode 100644
index 0000000..14e363e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverOnline.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 司机在线记录
+ */
+@TableName("t_driver_online")
+public class DriverOnline {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 设备(1=APP,2=车载端)
+     */
+    @TableField("device")
+    private Integer device;
+    /**
+     * 版本号
+     */
+    @TableField("version")
+    private String version;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 最后在线时间
+     */
+    @TableField("lastTime")
+    private Date lastTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getDevice() {
+        return device;
+    }
+
+    public void setDevice(Integer device) {
+        this.device = device;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getLastTime() {
+        return lastTime;
+    }
+
+    public void setLastTime(Date lastTime) {
+        this.lastTime = lastTime;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverOnline{" +
+                "id=" + id +
+                ", driverId=" + driverId +
+                ", device=" + device +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverPunish.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverPunish.java
new file mode 100644
index 0000000..284f29e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverPunish.java
@@ -0,0 +1,92 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 司机处罚
+ */
+@TableName("t_driver_punish")
+public class DriverPunish {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 处罚时间
+     */
+    @TableField("punishTime")
+    private Date punishTime;
+    /**
+     * 处罚原因
+     */
+    @TableField("punishReason")
+    private String punishReason;
+    /**
+     * 处罚结果
+     */
+    @TableField("punishReault")
+    private String punishReault;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Date getPunishTime() {
+        return punishTime;
+    }
+
+    public void setPunishTime(Date punishTime) {
+        this.punishTime = punishTime;
+    }
+
+    public String getPunishReason() {
+        return punishReason;
+    }
+
+    public void setPunishReason(String punishReason) {
+        this.punishReason = punishReason;
+    }
+
+    public String getPunishReault() {
+        return punishReault;
+    }
+
+    public void setPunishReault(String punishReault) {
+        this.punishReault = punishReault;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverPunish{" +
+                "id=" + id +
+                ", driverId=" + driverId +
+                ", punishTime=" + punishTime +
+                ", punishReason='" + punishReason + '\'' +
+                ", punishReault='" + punishReault + '\'' +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverTrain.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverTrain.java
new file mode 100644
index 0000000..cf4e865
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverTrain.java
@@ -0,0 +1,120 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 司机培训
+ */
+@TableName("t_driver_train")
+public class DriverTrain {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 课程名称
+     */
+    @TableField("courseName")
+    private String courseName;
+    /**
+     * 培训时间
+     */
+    @TableField("courseDate")
+    private Date courseDate;
+    /**
+     * 开始时间
+     */
+    @TableField("startTime")
+    private String startTime;
+    /**
+     * 结束时间
+     */
+    @TableField("stopTime")
+    private String stopTime;
+    /**
+     * 培训时长
+     */
+    @TableField("duration")
+    private Integer duration;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public Date getCourseDate() {
+        return courseDate;
+    }
+
+    public void setCourseDate(Date courseDate) {
+        this.courseDate = courseDate;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getStopTime() {
+        return stopTime;
+    }
+
+    public void setStopTime(String stopTime) {
+        this.stopTime = stopTime;
+    }
+
+    public Integer getDuration() {
+        return duration;
+    }
+
+    public void setDuration(Integer duration) {
+        this.duration = duration;
+    }
+
+    @Override
+    public String toString() {
+        return "DriverTrain{" +
+                "id=" + id +
+                ", driverId=" + driverId +
+                ", courseName='" + courseName + '\'' +
+                ", courseDate=" + courseDate +
+                ", startTime='" + startTime + '\'' +
+                ", stopTime='" + stopTime + '\'' +
+                ", duration=" + duration +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java
new file mode 100644
index 0000000..80dffbc
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/GDInterface.java
@@ -0,0 +1,91 @@
+package com.stylefeng.guns.modular.system.model;
+
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+/**
+ * 高德接口统计
+ */
+@TableName("t_gdinterface")
+public class GDInterface {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 接口名称
+     */
+    @TableField("name")
+    private String name;
+    /**
+     * 接口说明
+     */
+    @TableField("explanation")
+    private String explanation;
+    /**
+     * 调用次数
+     */
+    @TableField("num")
+    private Integer num;
+    /**
+     * 调用日期
+     */
+    @TableField("time")
+    private String time;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getExplanation() {
+        return explanation;
+    }
+
+    public void setExplanation(String explanation) {
+        this.explanation = explanation;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    @Override
+    public String toString() {
+        return "GDInterface{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", explanation='" + explanation + '\'' +
+                ", num=" + num +
+                ", time=" + time +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Income.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Income.java
new file mode 100644
index 0000000..cae5522
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Income.java
@@ -0,0 +1,134 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 收入明细
+ */
+@TableName("t_income")
+public class Income {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 收入方类型(1=公司,2=司机)
+     */
+    @TableField("userType")
+    private Integer userType;
+    /**
+     * 收入对象id
+     */
+    @TableField("objectId")
+    private Integer objectId;
+    /**
+     * 收入类型(1=活动,2=业务)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 收入类型id
+     */
+    @TableField("incomeId")
+    private Integer incomeId;
+    /**
+     * 订单类型
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 收入金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Integer getObjectId() {
+        return objectId;
+    }
+
+    public void setObjectId(Integer objectId) {
+        this.objectId = objectId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getIncomeId() {
+        return incomeId;
+    }
+
+    public void setIncomeId(Integer incomeId) {
+        this.incomeId = incomeId;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    @Override
+    public String toString() {
+        return "Income{" +
+                "id=" + id +
+                ", userType=" + userType +
+                ", objectId=" + objectId +
+                ", type=" + type +
+                ", incomeId=" + incomeId +
+                ", orderType=" + orderType +
+                ", money=" + money +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShiftDriver.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShiftDriver.java
new file mode 100644
index 0000000..1d89b94
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LineShiftDriver.java
@@ -0,0 +1,134 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 司机预约排班记录
+ */
+@TableName("t_line_shift_driver")
+public class LineShiftDriver {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 线路班次id
+     */
+    @TableField("lineShiftId")
+    private Integer lineShiftId;
+    /**
+     * 司机id
+     */
+    @TableField("driverId")
+    private Integer driverId;
+    /**
+     * 预约日期
+     */
+    @TableField("day")
+    private Date day;
+    /**
+     * 剩余座位数
+     */
+    @TableField("laveSeat")
+    private Integer laveSeat;
+    /**
+     * 剩余座位号(多个以逗号分隔)
+     */
+    @TableField("laveSeatNumber")
+    private String laveSeatNumber;
+    /**
+     * 总座位数
+     */
+    @TableField("totalSeat")
+    private Integer totalSeat;
+    /**
+     * 添加时间
+     */
+    @TableField("inserTime")
+    private Date inserTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLineShiftId() {
+        return lineShiftId;
+    }
+
+    public void setLineShiftId(Integer lineShiftId) {
+        this.lineShiftId = lineShiftId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Date getDay() {
+        return day;
+    }
+
+    public void setDay(Date day) {
+        this.day = day;
+    }
+
+    public Integer getLaveSeat() {
+        return laveSeat;
+    }
+
+    public void setLaveSeat(Integer laveSeat) {
+        this.laveSeat = laveSeat;
+    }
+
+    public String getLaveSeatNumber() {
+        return laveSeatNumber;
+    }
+
+    public void setLaveSeatNumber(String laveSeatNumber) {
+        this.laveSeatNumber = laveSeatNumber;
+    }
+
+    public Integer getTotalSeat() {
+        return totalSeat;
+    }
+
+    public void setTotalSeat(Integer totalSeat) {
+        this.totalSeat = totalSeat;
+    }
+
+    public Date getInserTime() {
+        return inserTime;
+    }
+
+    public void setInserTime(Date inserTime) {
+        this.inserTime = inserTime;
+    }
+
+    @Override
+    public String toString() {
+        return "LineShiftDriver{" +
+                "id=" + id +
+                ", lineShiftId=" + lineShiftId +
+                ", driverId=" + driverId +
+                ", day=" + day +
+                ", laveSeat=" + laveSeat +
+                ", laveSeatNumber='" + laveSeatNumber + '\'' +
+                ", totalSeat=" + totalSeat +
+                ", inserTime=" + inserTime +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LoginLog.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LoginLog.java
new file mode 100644
index 0000000..10135f8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/LoginLog.java
@@ -0,0 +1,128 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 登录记录
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_login_log")
+public class LoginLog extends Model<LoginLog> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 日志名称
+     */
+	private String logname;
+    /**
+     * 管理员id
+     */
+	private Integer userid;
+    /**
+     * 创建时间
+     */
+	private Date createtime;
+    /**
+     * 是否执行成功
+     */
+	private String succeed;
+    /**
+     * 具体消息
+     */
+	private String message;
+    /**
+     * 登录ip
+     */
+	private String ip;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getLogname() {
+		return logname;
+	}
+
+	public void setLogname(String logname) {
+		this.logname = logname;
+	}
+
+	public Integer getUserid() {
+		return userid;
+	}
+
+	public void setUserid(Integer userid) {
+		this.userid = userid;
+	}
+
+	public Date getCreatetime() {
+		return createtime;
+	}
+
+	public void setCreatetime(Date createtime) {
+		this.createtime = createtime;
+	}
+
+	public String getSucceed() {
+		return succeed;
+	}
+
+	public void setSucceed(String succeed) {
+		this.succeed = succeed;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	public String getIp() {
+		return ip;
+	}
+
+	public void setIp(String ip) {
+		this.ip = ip;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "LoginLog{" +
+			"id=" + id +
+			", logname=" + logname +
+			", userid=" + userid +
+			", createtime=" + createtime +
+			", succeed=" + succeed +
+			", message=" + message +
+			", ip=" + ip +
+			"}";
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Menu.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Menu.java
new file mode 100644
index 0000000..6df6215
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Menu.java
@@ -0,0 +1,208 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import org.hibernate.validator.constraints.NotBlank;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 菜单表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_menu")
+public class Menu extends Model<Menu> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 菜单编号
+     */
+    private String code;
+    /**
+     * 菜单父编号
+     */
+    private String pcode;
+    /**
+     * 当前菜单的所有父菜单编号
+     */
+    private String pcodes;
+    /**
+     * 菜单名称
+     */
+    @NotBlank
+    private String name;
+    /**
+     * 菜单图标
+     */
+    private String icon;
+    /**
+     * url地址
+     */
+    @NotBlank
+    private String url;
+    /**
+     * 菜单排序号
+     */
+    private Integer num;
+    /**
+     * 菜单层级
+     */
+    private Integer levels;
+    /**
+     * 是否是菜单(1:是  0:不是)
+     */
+    private Integer ismenu;
+    /**
+     * 备注
+     */
+    private String tips;
+    /**
+     * 菜单状态 :  1:启用   0:不启用
+     */
+    private Integer status;
+    /**
+     * 是否打开:    1:打开   0:不打开
+     */
+    private Integer isopen;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getPcode() {
+        return pcode;
+    }
+
+    public void setPcode(String pcode) {
+        this.pcode = pcode;
+    }
+
+    public String getPcodes() {
+        return pcodes;
+    }
+
+    public void setPcodes(String pcodes) {
+        this.pcodes = pcodes;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public Integer getLevels() {
+        return levels;
+    }
+
+    public void setLevels(Integer levels) {
+        this.levels = levels;
+    }
+
+    public Integer getIsmenu() {
+        return ismenu;
+    }
+
+    public void setIsmenu(Integer ismenu) {
+        this.ismenu = ismenu;
+    }
+
+    public String getTips() {
+        return tips;
+    }
+
+    public void setTips(String tips) {
+        this.tips = tips;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getIsopen() {
+        return isopen;
+    }
+
+    public void setIsopen(Integer isopen) {
+        this.isopen = isopen;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Menu{" +
+                "id=" + id +
+                ", code=" + code +
+                ", pcode=" + pcode +
+                ", pcodes=" + pcodes +
+                ", name=" + name +
+                ", icon=" + icon +
+                ", url=" + url +
+                ", num=" + num +
+                ", levels=" + levels +
+                ", ismenu=" + ismenu +
+                ", tips=" + tips +
+                ", status=" + status +
+                ", isopen=" + isopen +
+                "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Notice.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Notice.java
new file mode 100644
index 0000000..6967223
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Notice.java
@@ -0,0 +1,115 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 通知表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_notice")
+public class Notice extends Model<Notice> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 标题
+     */
+	private String title;
+    /**
+     * 类型
+     */
+	private Integer type;
+    /**
+     * 内容
+     */
+	private String content;
+    /**
+     * 创建时间
+     */
+	private Date createtime;
+    /**
+     * 创建人
+     */
+	private Integer creater;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public Integer getType() {
+		return type;
+	}
+
+	public void setType(Integer type) {
+		this.type = type;
+	}
+
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+	public Date getCreatetime() {
+		return createtime;
+	}
+
+	public void setCreatetime(Date createtime) {
+		this.createtime = createtime;
+	}
+
+	public Integer getCreater() {
+		return creater;
+	}
+
+	public void setCreater(Integer creater) {
+		this.creater = creater;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "Notice{" +
+			"id=" + id +
+			", title=" + title +
+			", type=" + type +
+			", content=" + content +
+			", createtime=" + createtime +
+			", creater=" + creater +
+			"}";
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OperationLog.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OperationLog.java
new file mode 100644
index 0000000..7851475
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OperationLog.java
@@ -0,0 +1,154 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 操作日志
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_operation_log")
+public class OperationLog extends Model<OperationLog> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 日志类型
+     */
+	private String logtype;
+    /**
+     * 日志名称
+     */
+	private String logname;
+    /**
+     * 用户id
+     */
+	private Integer userid;
+    /**
+     * 类名称
+     */
+	private String classname;
+    /**
+     * 方法名称
+     */
+	private String method;
+    /**
+     * 创建时间
+     */
+	private Date createtime;
+    /**
+     * 是否成功
+     */
+	private String succeed;
+    /**
+     * 备注
+     */
+	private String message;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getLogtype() {
+		return logtype;
+	}
+
+	public void setLogtype(String logtype) {
+		this.logtype = logtype;
+	}
+
+	public String getLogname() {
+		return logname;
+	}
+
+	public void setLogname(String logname) {
+		this.logname = logname;
+	}
+
+	public Integer getUserid() {
+		return userid;
+	}
+
+	public void setUserid(Integer userid) {
+		this.userid = userid;
+	}
+
+	public String getClassname() {
+		return classname;
+	}
+
+	public void setClassname(String classname) {
+		this.classname = classname;
+	}
+
+	public String getMethod() {
+		return method;
+	}
+
+	public void setMethod(String method) {
+		this.method = method;
+	}
+
+	public Date getCreatetime() {
+		return createtime;
+	}
+
+	public void setCreatetime(Date createtime) {
+		this.createtime = createtime;
+	}
+
+	public String getSucceed() {
+		return succeed;
+	}
+
+	public void setSucceed(String succeed) {
+		this.succeed = succeed;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "OperationLog{" +
+			"id=" + id +
+			", logtype=" + logtype +
+			", logname=" + logname +
+			", userid=" + userid +
+			", classname=" + classname +
+			", method=" + method +
+			", createtime=" + createtime +
+			", succeed=" + succeed +
+			", message=" + message +
+			"}";
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCancel.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCancel.java
new file mode 100644
index 0000000..e47d4e5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderCancel.java
@@ -0,0 +1,178 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 取消订单
+ */
+@TableName("t_order_cancel")
+public class OrderCancel {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 订单id
+     */
+    @TableField("orderId")
+    private Integer orderId;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 取消原因
+     */
+    @TableField("reason")
+    private String reason;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=余额)
+     */
+    @TableField("payType")
+    private Integer payType;
+    /**
+     * 支付金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 状态(1=临时,2=正式)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     * @return
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 取消人员类型(1=用户,2=后台)
+     * @return
+     */
+    @TableField("userType")
+    private Integer userType;
+    /**
+     * 操作人员id
+     * @return
+     */
+    @TableField("userId")
+    private Integer userId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderCancel{" +
+                "id=" + id +
+                ", orderId=" + orderId +
+                ", orderType=" + orderType +
+                ", reason='" + reason + '\'' +
+                ", remark='" + remark + '\'' +
+                ", payType=" + payType +
+                ", money=" + money +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                ", userType=" + userType +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PaymentRecord.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PaymentRecord.java
new file mode 100644
index 0000000..e2bab92
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/PaymentRecord.java
@@ -0,0 +1,176 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 第三方支付记录
+ */
+@TableName("t_payment_record")
+public class PaymentRecord {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 支付类别(1=订单相关支付,2=其他支付)
+     */
+    @TableField("category")
+    private Integer category;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 用户类型(1=用户,2=司机)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 订单id
+     */
+    @TableField("orderId")
+    private Integer orderId;
+    /**
+     * 订单类型
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 支付方式(1=微信,2=支付宝)
+     */
+    @TableField("payType")
+    private Integer payType;
+    /**
+     * 支付金额
+     */
+    @TableField("amount")
+    private Double amount;
+    /**
+     * 第三方支付订单号
+     */
+    @TableField("code")
+    private String code;
+    /**
+     * 支付状态(1=未支付,2=已支付)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCategory() {
+        return category;
+    }
+
+    public void setCategory(Integer category) {
+        this.category = category;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Double getAmount() {
+        return amount;
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    public String toString() {
+        return "PaymentRecord{" +
+                "id=" + id +
+                ", category=" + category +
+                ", userId=" + userId +
+                ", type=" + type +
+                ", orderId=" + orderId +
+                ", orderType=" + orderType +
+                ", payType=" + payType +
+                ", amount=" + amount +
+                ", code='" + code + '\'' +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java
new file mode 100644
index 0000000..4680a6a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Region.java
@@ -0,0 +1,109 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 省市区三级联动
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2019-12-30
+ */
+@TableName("region")
+public class Region extends Model<Region> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 城市名称
+     */
+    private String name;
+    private String code;
+    private String citycode;
+    /**
+     * 父级ID
+     */
+    @TableField("parent_id")
+    private Integer parentId;
+    /**
+     * 英文名称
+     */
+    private String english;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getCitycode() {
+        return citycode;
+    }
+
+    public void setCitycode(String citycode) {
+        this.citycode = citycode;
+    }
+
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getEnglish() {
+        return english;
+    }
+
+    public void setEnglish(String english) {
+        this.english = english;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Region{" +
+        "id=" + id +
+        ", name=" + name +
+        ", code=" + code +
+        ", citycode=" + citycode +
+        ", parentId=" + parentId +
+        ", english=" + english +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Relation.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Relation.java
new file mode 100644
index 0000000..48c2df6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Relation.java
@@ -0,0 +1,75 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 角色和菜单关联表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_relation")
+public class Relation extends Model<Relation> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 菜单id
+     */
+    private Long menuid;
+    /**
+     * 角色id
+     */
+    private Integer roleid;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Long getMenuid() {
+        return menuid;
+    }
+
+    public void setMenuid(Long menuid) {
+        this.menuid = menuid;
+    }
+
+    public Integer getRoleid() {
+        return roleid;
+    }
+
+    public void setRoleid(Integer roleid) {
+        this.roleid = roleid;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Relation{" +
+                "id=" + id +
+                ", menuid=" + menuid +
+                ", roleid=" + roleid +
+                "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Role.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Role.java
new file mode 100644
index 0000000..70ae563
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/Role.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 角色表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_role")
+public class Role extends Model<Role> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 序号
+     */
+	private Integer num;
+    /**
+     * 父角色id
+     */
+	private Integer pid;
+    /**
+     * 角色名称
+     */
+	private String name;
+    /**
+     * 部门名称
+     */
+	private Integer deptid;
+    /**
+     * 提示
+     */
+	private String tips;
+    /**
+     * 保留字段(暂时没用)
+     */
+	private Integer version;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getNum() {
+		return num;
+	}
+
+	public void setNum(Integer num) {
+		this.num = num;
+	}
+
+	public Integer getPid() {
+		return pid;
+	}
+
+	public void setPid(Integer pid) {
+		this.pid = pid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Integer getDeptid() {
+		return deptid;
+	}
+
+	public void setDeptid(Integer deptid) {
+		this.deptid = deptid;
+	}
+
+	public String getTips() {
+		return tips;
+	}
+
+	public void setTips(String tips) {
+		this.tips = tips;
+	}
+
+	public Integer getVersion() {
+		return version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "Role{" +
+			"id=" + id +
+			", num=" + num +
+			", pid=" + pid +
+			", name=" + name +
+			", deptid=" + deptid +
+			", tips=" + tips +
+			", version=" + version +
+			"}";
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponActivity.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponActivity.java
new file mode 100644
index 0000000..a9966f7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponActivity.java
@@ -0,0 +1,249 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置-优惠券活动
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@TableName("t_sys_coupon_activity")
+public class SysCouponActivity extends Model<SysCouponActivity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 金额
+     */
+    private BigDecimal money;
+    /**
+     * 满减金额
+     */
+    private BigDecimal fullMoney;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 优惠券使用类型(0=通用,1=专车,2=出租车,3=城际,4=小件物流)
+     */
+    private Integer couponUseType;
+    /**
+     * 优惠券类型(1=抵扣,2=满减)
+     */
+    private Integer couponType;
+    /**
+     * 活动名称
+     */
+    private String name;
+    /**
+     * 有效天数
+     */
+    private Integer effective;
+    /**
+     * 1=平台 2=分公司 3=加盟商
+     */
+    private Integer companyType;
+    /**
+     * 状态(1=待审核,2=驳回,3=通过)
+     */
+    private Integer status;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 发送类型(1=全部用户,2=部分)
+     */
+    private Integer sendType;
+    /**
+     * 发送用户id
+     */
+    private String sendUserId;
+    /**
+     * 张数
+     */
+    private Integer number;
+    /**
+     * 领取人数
+     */
+    private Integer sendUserNum;
+
+    private  Integer couponId;
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getSendUserNum() {
+        return sendUserNum;
+    }
+
+    public void setSendUserNum(Integer sendUserNum) {
+        this.sendUserNum = sendUserNum;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    public BigDecimal getFullMoney() {
+        return fullMoney;
+    }
+
+    public void setFullMoney(BigDecimal fullMoney) {
+        this.fullMoney = fullMoney;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getCouponUseType() {
+        return couponUseType;
+    }
+
+    public void setCouponUseType(Integer couponUseType) {
+        this.couponUseType = couponUseType;
+    }
+
+    public Integer getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(Integer couponType) {
+        this.couponType = couponType;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getEffective() {
+        return effective;
+    }
+
+    public void setEffective(Integer effective) {
+        this.effective = effective;
+    }
+
+    public Integer getCompanyType() {
+        return companyType;
+    }
+
+    public void setCompanyType(Integer companyType) {
+        this.companyType = companyType;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getSendType() {
+        return sendType;
+    }
+
+    public void setSendType(Integer sendType) {
+        this.sendType = sendType;
+    }
+
+    public String getSendUserId() {
+        return sendUserId;
+    }
+
+    public void setSendUserId(String sendUserId) {
+        this.sendUserId = sendUserId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "SysCouponActivity{" +
+        "id=" + id +
+        ", money=" + money +
+        ", fullMoney=" + fullMoney +
+        ", insertTime=" + insertTime +
+        ", companyId=" + companyId +
+        ", couponUseType=" + couponUseType +
+        ", couponType=" + couponType +
+        ", name=" + name +
+        ", effective=" + effective +
+        ", companyType=" + companyType +
+        ", status=" + status +
+        ", remark=" + remark +
+        ", sendType=" + sendType +
+        ", sendUserId=" + sendUserId +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponRecord.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponRecord.java
new file mode 100644
index 0000000..d88df58
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysCouponRecord.java
@@ -0,0 +1,162 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置-优惠券记录
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-15
+ */
+@TableName("t_sys_coupon_record")
+public class SysCouponRecord extends Model<SysCouponRecord> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 金额
+     */
+    private BigDecimal money;
+    /**
+     * 满减金额
+     */
+    private BigDecimal fullMoney;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 优惠券使用类型(0=通用,1=专车,2=出租车,3=城际,4=小件物流)
+     */
+    private Integer couponUseType;
+    /**
+     * 优惠券类型(1=抵扣,2=满减)
+     */
+    private Integer couponType;
+    /**
+     * 优惠券名称
+     */
+    private String name;
+    /**
+     * 有效天数
+     */
+    private Integer effective;
+    /**
+     * 1=平台 2=分公司 3=加盟商
+     */
+    private Integer companyType;
+
+    public Integer getCompanyType() {
+        return companyType;
+    }
+
+    public void setCompanyType(Integer companyType) {
+        this.companyType = companyType;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    public BigDecimal getFullMoney() {
+        return fullMoney;
+    }
+
+    public void setFullMoney(BigDecimal fullMoney) {
+        this.fullMoney = fullMoney;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getCouponUseType() {
+        return couponUseType;
+    }
+
+    public void setCouponUseType(Integer couponUseType) {
+        this.couponUseType = couponUseType;
+    }
+
+    public Integer getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(Integer couponType) {
+        this.couponType = couponType;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getEffective() {
+        return effective;
+    }
+
+    public void setEffective(Integer effective) {
+        this.effective = effective;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "SysCouponRecord{" +
+        "id=" + id +
+        ", money=" + money +
+        ", fullMoney=" + fullMoney +
+        ", insertTime=" + insertTime +
+        ", companyId=" + companyId +
+        ", couponUseType=" + couponUseType +
+        ", couponType=" + couponType +
+        ", name=" + name +
+        ", effective=" + effective +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysRedPacketRecord.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysRedPacketRecord.java
new file mode 100644
index 0000000..452a992
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysRedPacketRecord.java
@@ -0,0 +1,190 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置-红包记录
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-13
+ */
+@TableName("t_sys_red_packet_record")
+public class SysRedPacketRecord extends Model<SysRedPacketRecord> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 金额
+     */
+    private BigDecimal money;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 红包名称
+     */
+    private String name;
+    /**
+     * 类型(1=固定金额,2=随机金额)
+     */
+    private Integer type;
+    /**
+     * 总金额
+     */
+    private BigDecimal totalMoney;
+    /**
+     * 剩余金额
+     */
+    private Double laveMoney;
+    /**
+     * 开始金额
+     */
+    private BigDecimal startMoney;
+    /**
+     * 结束金额
+     */
+    private BigDecimal endMoney;
+    /**
+     * 有效天数
+     */
+    private Integer effective;
+    /**
+     * 1=平台 2=分公司 3=加盟商
+     */
+    private Integer companyType;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public BigDecimal getTotalMoney() {
+        return totalMoney;
+    }
+
+    public void setTotalMoney(BigDecimal totalMoney) {
+        this.totalMoney = totalMoney;
+    }
+
+    public Double getLaveMoney() {
+        return laveMoney;
+    }
+
+    public void setLaveMoney(Double laveMoney) {
+        this.laveMoney = laveMoney;
+    }
+
+    public BigDecimal getStartMoney() {
+        return startMoney;
+    }
+
+    public void setStartMoney(BigDecimal startMoney) {
+        this.startMoney = startMoney;
+    }
+
+    public BigDecimal getEndMoney() {
+        return endMoney;
+    }
+
+    public void setEndMoney(BigDecimal endMoney) {
+        this.endMoney = endMoney;
+    }
+
+    public Integer getEffective() {
+        return effective;
+    }
+
+    public void setEffective(Integer effective) {
+        this.effective = effective;
+    }
+
+    public Integer getCompanyType() {
+        return companyType;
+    }
+
+    public void setCompanyType(Integer companyType) {
+        this.companyType = companyType;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "SysRedPacketRecord{" +
+        "id=" + id +
+        ", money=" + money +
+        ", insertTime=" + insertTime +
+        ", companyId=" + companyId +
+        ", name=" + name +
+        ", type=" + type +
+        ", totalMoney=" + totalMoney +
+        ", laveMoney=" + laveMoney +
+        ", startMoney=" + startMoney +
+        ", endMoney=" + endMoney +
+        ", effective=" + effective +
+        ", companyType=" + companyType +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAdvertisement.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAdvertisement.java
new file mode 100644
index 0000000..d158a2e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAdvertisement.java
@@ -0,0 +1,216 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 广告
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+@TableName("t_advertisement")
+public class TAdvertisement extends Model<TAdvertisement> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 图片路径
+     */
+    private String imgUrl;
+    /**
+     * 类型(1=弹窗,2=首页底部)
+     */
+    private Integer type;
+    /**
+     * 是否跳转(1=是,2=否)
+     */
+    private Integer isJump;
+    /**
+     * 跳转类型(1=外部,2=内部)
+     */
+    private Integer jumpType;
+    /**
+     * 跳转路径
+     */
+    private String jumpUrl;
+    /**
+     * 文本编辑器内容
+     */
+    private String content;
+    /**
+     * 1:创建,2:修改,3:删除
+     */
+    private Integer flag;
+    private Date insertTime;
+    private Integer insertUser;
+    private Date updateTime;
+    private Integer updateUser;
+    /**
+     * 状态  1=已上线  2=已下线
+     */
+    private Integer state;
+    /**
+     * 所属省Id
+     */
+    private Integer provinceId;
+
+    public Integer getProvinceId() {
+        return provinceId;
+    }
+
+    public void setProvinceId(Integer provinceId) {
+        this.provinceId = provinceId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getIsJump() {
+        return isJump;
+    }
+
+    public void setIsJump(Integer isJump) {
+        this.isJump = isJump;
+    }
+
+    public Integer getJumpType() {
+        return jumpType;
+    }
+
+    public void setJumpType(Integer jumpType) {
+        this.jumpType = jumpType;
+    }
+
+    public String getJumpUrl() {
+        return jumpUrl;
+    }
+
+    public void setJumpUrl(String jumpUrl) {
+        this.jumpUrl = jumpUrl;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getFlag() {
+        return flag;
+    }
+
+    public void setFlag(Integer flag) {
+        this.flag = flag;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getInsertUser() {
+        return insertUser;
+    }
+
+    public void setInsertUser(Integer insertUser) {
+        this.insertUser = insertUser;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getUpdateUser() {
+        return updateUser;
+    }
+
+    public void setUpdateUser(Integer updateUser) {
+        this.updateUser = updateUser;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TAdvertisement{" +
+        "id=" + id +
+        ", name=" + name +
+        ", imgUrl=" + imgUrl +
+        ", type=" + type +
+        ", isJump=" + isJump +
+        ", jumpType=" + jumpType +
+        ", jumpUrl=" + jumpUrl +
+        ", content=" + content +
+        ", flag=" + flag +
+        ", insertTime=" + insertTime +
+        ", insertUser=" + insertUser +
+        ", updateTime=" + updateTime +
+        ", updateUser=" + updateUser +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAgreement.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAgreement.java
new file mode 100644
index 0000000..a7cb139
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TAgreement.java
@@ -0,0 +1,141 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 平台协议
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-01
+ */
+@TableName("t_agreement")
+public class TAgreement extends Model<TAgreement> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 1=用户,2=司机
+     */
+    private Integer useType;
+    /**
+     * 协议内容
+     */
+    private String content;
+    /**
+     * 类型(1:隐私协议,2:用户协议,3:用户指南,4:法律条款,5:关于我们,6=注册协议)
+     */
+    private Integer type;
+    /**
+     * 1:创建,2:修改,3:删除
+     */
+    private String flag;
+    private Date insertTime;
+    private String insertUser;
+    private Date updateTime;
+    private Integer updateUser;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUseType() {
+        return useType;
+    }
+
+    public void setUseType(Integer useType) {
+        this.useType = useType;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getFlag() {
+        return flag;
+    }
+
+    public void setFlag(String flag) {
+        this.flag = flag;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getInsertUser() {
+        return insertUser;
+    }
+
+    public void setInsertUser(String insertUser) {
+        this.insertUser = insertUser;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getUpdateUser() {
+        return updateUser;
+    }
+
+    public void setUpdateUser(Integer updateUser) {
+        this.updateUser = updateUser;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TAgreement{" +
+        "id=" + id +
+        ", useType=" + useType +
+        ", content=" + content +
+        ", type=" + type +
+        ", flag=" + flag +
+        ", insertTime=" + insertTime +
+        ", insertUser=" + insertUser +
+        ", updateTime=" + updateTime +
+        ", updateUser=" + updateUser +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCar.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCar.java
new file mode 100644
index 0000000..9f1f783
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCar.java
@@ -0,0 +1,566 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 车辆
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@TableName("t_car")
+public class TCar extends Model<TCar> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 是否是平台车辆(1=是,2=否)
+     */
+    private Integer isPlatCar;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 加盟商id
+     */
+    private Integer franchiseeId;
+    /**
+     * 车辆颜色
+     */
+    private String carColor;
+    /**
+     * 车型id
+     */
+    private Integer carModelId;
+    /**
+     * 车辆品牌ID
+     */
+    private Integer carBrandId;
+    /**
+     * 车牌号
+     */
+    private String carLicensePlate;
+    /**
+     * 车牌颜色
+     */
+    private String plateColor;
+    /**
+     * 车辆照片
+     */
+    private String carPhoto;
+    /**
+     * 车辆类型
+     */
+    private String vehicleType;
+    /**
+     * 车辆所有人
+     */
+    private String ownerName;
+    /**
+     * 发送机号
+     */
+    private String engineId;
+    /**
+     * 车辆VIN码
+     */
+    private String VIN;
+    /**
+     * 车辆注册日期
+     */
+    private Date certifyDateA;
+    /**
+     * 车辆燃料类型
+     */
+    private String fuelType;
+    /**
+     * 发动机排量
+     */
+    private String engineDisplace;
+    /**
+     * 运输证字号
+     */
+    private String certificate;
+    /**
+     * 车辆运输证发证机构
+     */
+    private String transAgency;
+    /**
+     * 车辆经营区域
+     */
+    private String transArea;
+    /**
+     * 车辆运输证有效期起
+     */
+    private Date transDateStart;
+    /**
+     * 车辆运输证有效期止
+     */
+    private Date transDateStop;
+    /**
+     * 车辆初次登记日期
+     */
+    private Date certifyDateB;
+    /**
+     * 车辆维修状态(0:未检修,1:已检修,2:未知)
+     */
+    private Integer fixState;
+    /**
+     * 车辆下次年检时间
+     */
+    private Date nextFixDate;
+    /**
+     * 车辆年度审核状态
+     */
+    private String checkState;
+    /**
+     * 发票打印设备序列号
+     */
+    private String feePrintId;
+    /**
+     * 卫星定位装置品牌
+     */
+    private String GPSBrand;
+    /**
+     * 卫星定位装置型号
+     */
+    private String GPSModel;
+    /**
+     * 卫星定位装置IMEI号
+     */
+    private String GPSIMEI;
+    /**
+     * 卫星定位装置安装时间
+     */
+    private Date GPSInstallDate;
+    /**
+     * 车辆报备日期
+     */
+    private Date registerDate;
+    /**
+     * 服务类型(1:网络预约出租车,2:巡游出租汽车,3:私人小客车合乘)
+     */
+    private Integer commercialType;
+    /**
+     * 行驶证号
+     */
+    private String drivingLicenseNumber;
+    /**
+     * 行驶证照片
+     */
+    private String drivingLicensePhoto;
+    /**
+     * 年检到期时间
+     */
+    private Date annualInspectionTime;
+    /**
+     * 商业保险到期时间
+     */
+    private Date commercialInsuranceTime;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 状态(1=正常,2=删除)
+     */
+    private Integer state;
+    /**
+     * 司机来源方式 1=司机注册 2=平台添加 3=分公司添加 4=加盟商添加
+     */
+    private Integer addType;
+    /**
+     * 添加司机的分公司/加盟商ID
+     */
+    private Integer addObjectId;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getIsPlatCar() {
+        return isPlatCar;
+    }
+
+    public void setIsPlatCar(Integer isPlatCar) {
+        this.isPlatCar = isPlatCar;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getFranchiseeId() {
+        return franchiseeId;
+    }
+
+    public void setFranchiseeId(Integer franchiseeId) {
+        this.franchiseeId = franchiseeId;
+    }
+
+    public String getCarColor() {
+        return carColor;
+    }
+
+    public void setCarColor(String carColor) {
+        this.carColor = carColor;
+    }
+
+    public Integer getCarModelId() {
+        return carModelId;
+    }
+
+    public void setCarModelId(Integer carModelId) {
+        this.carModelId = carModelId;
+    }
+
+    public Integer getCarBrandId() {
+        return carBrandId;
+    }
+
+    public void setCarBrandId(Integer carBrandId) {
+        this.carBrandId = carBrandId;
+    }
+
+    public String getCarLicensePlate() {
+        return carLicensePlate;
+    }
+
+    public void setCarLicensePlate(String carLicensePlate) {
+        this.carLicensePlate = carLicensePlate;
+    }
+
+    public String getCarPhoto() {
+        return carPhoto;
+    }
+
+    public void setCarPhoto(String carPhoto) {
+        this.carPhoto = carPhoto;
+    }
+
+    public String getDrivingLicenseNumber() {
+        return drivingLicenseNumber;
+    }
+
+    public void setDrivingLicenseNumber(String drivingLicenseNumber) {
+        this.drivingLicenseNumber = drivingLicenseNumber;
+    }
+
+    public String getDrivingLicensePhoto() {
+        return drivingLicensePhoto;
+    }
+
+    public void setDrivingLicensePhoto(String drivingLicensePhoto) {
+        this.drivingLicensePhoto = drivingLicensePhoto;
+    }
+
+    public Date getAnnualInspectionTime() {
+        return annualInspectionTime;
+    }
+
+    public void setAnnualInspectionTime(Date annualInspectionTime) {
+        this.annualInspectionTime = annualInspectionTime;
+    }
+
+    public Date getCommercialInsuranceTime() {
+        return commercialInsuranceTime;
+    }
+
+    public void setCommercialInsuranceTime(Date commercialInsuranceTime) {
+        this.commercialInsuranceTime = commercialInsuranceTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getAddType() {
+        return addType;
+    }
+
+    public void setAddType(Integer addType) {
+        this.addType = addType;
+    }
+
+    public Integer getAddObjectId() {
+        return addObjectId;
+    }
+
+    public void setAddObjectId(Integer addObjectId) {
+        this.addObjectId = addObjectId;
+    }
+
+    public String getPlateColor() {
+        return plateColor;
+    }
+
+    public void setPlateColor(String plateColor) {
+        this.plateColor = plateColor;
+    }
+
+    public String getVehicleType() {
+        return vehicleType;
+    }
+
+    public void setVehicleType(String vehicleType) {
+        this.vehicleType = vehicleType;
+    }
+
+    public String getOwnerName() {
+        return ownerName;
+    }
+
+    public void setOwnerName(String ownerName) {
+        this.ownerName = ownerName;
+    }
+
+    public String getEngineId() {
+        return engineId;
+    }
+
+    public void setEngineId(String engineId) {
+        this.engineId = engineId;
+    }
+
+    public String getVIN() {
+        return VIN;
+    }
+
+    public void setVIN(String VIN) {
+        this.VIN = VIN;
+    }
+
+    public Date getCertifyDateA() {
+        return certifyDateA;
+    }
+
+    public void setCertifyDateA(Date certifyDateA) {
+        this.certifyDateA = certifyDateA;
+    }
+
+    public String getFuelType() {
+        return fuelType;
+    }
+
+    public void setFuelType(String fuelType) {
+        this.fuelType = fuelType;
+    }
+
+    public String getEngineDisplace() {
+        return engineDisplace;
+    }
+
+    public void setEngineDisplace(String engineDisplace) {
+        this.engineDisplace = engineDisplace;
+    }
+
+    public String getCertificate() {
+        return certificate;
+    }
+
+    public void setCertificate(String certificate) {
+        this.certificate = certificate;
+    }
+
+    public String getTransAgency() {
+        return transAgency;
+    }
+
+    public void setTransAgency(String transAgency) {
+        this.transAgency = transAgency;
+    }
+
+    public String getTransArea() {
+        return transArea;
+    }
+
+    public void setTransArea(String transArea) {
+        this.transArea = transArea;
+    }
+
+    public Date getTransDateStart() {
+        return transDateStart;
+    }
+
+    public void setTransDateStart(Date transDateStart) {
+        this.transDateStart = transDateStart;
+    }
+
+    public Date getTransDateStop() {
+        return transDateStop;
+    }
+
+    public void setTransDateStop(Date transDateStop) {
+        this.transDateStop = transDateStop;
+    }
+
+    public Date getCertifyDateB() {
+        return certifyDateB;
+    }
+
+    public void setCertifyDateB(Date certifyDateB) {
+        this.certifyDateB = certifyDateB;
+    }
+
+    public Integer getFixState() {
+        return fixState;
+    }
+
+    public void setFixState(Integer fixState) {
+        this.fixState = fixState;
+    }
+
+    public Date getNextFixDate() {
+        return nextFixDate;
+    }
+
+    public void setNextFixDate(Date nextFixDate) {
+        this.nextFixDate = nextFixDate;
+    }
+
+    public String getCheckState() {
+        return checkState;
+    }
+
+    public void setCheckState(String checkState) {
+        this.checkState = checkState;
+    }
+
+    public String getFeePrintId() {
+        return feePrintId;
+    }
+
+    public void setFeePrintId(String feePrintId) {
+        this.feePrintId = feePrintId;
+    }
+
+    public String getGPSBrand() {
+        return GPSBrand;
+    }
+
+    public void setGPSBrand(String GPSBrand) {
+        this.GPSBrand = GPSBrand;
+    }
+
+    public String getGPSModel() {
+        return GPSModel;
+    }
+
+    public void setGPSModel(String GPSModel) {
+        this.GPSModel = GPSModel;
+    }
+
+    public String getGPSIMEI() {
+        return GPSIMEI;
+    }
+
+    public void setGPSIMEI(String GPSIMEI) {
+        this.GPSIMEI = GPSIMEI;
+    }
+
+    public Date getGPSInstallDate() {
+        return GPSInstallDate;
+    }
+
+    public void setGPSInstallDate(Date GPSInstallDate) {
+        this.GPSInstallDate = GPSInstallDate;
+    }
+
+    public Date getRegisterDate() {
+        return registerDate;
+    }
+
+    public void setRegisterDate(Date registerDate) {
+        this.registerDate = registerDate;
+    }
+
+    public Integer getCommercialType() {
+        return commercialType;
+    }
+
+    public void setCommercialType(Integer commercialType) {
+        this.commercialType = commercialType;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TCar{" +
+                "id=" + id +
+                ", isPlatCar=" + isPlatCar +
+                ", companyId=" + companyId +
+                ", franchiseeId=" + franchiseeId +
+                ", carColor='" + carColor + '\'' +
+                ", carModelId=" + carModelId +
+                ", carBrandId=" + carBrandId +
+                ", carLicensePlate='" + carLicensePlate + '\'' +
+                ", plateColor='" + plateColor + '\'' +
+                ", carPhoto='" + carPhoto + '\'' +
+                ", vehicleType='" + vehicleType + '\'' +
+                ", ownerName='" + ownerName + '\'' +
+                ", engineId='" + engineId + '\'' +
+                ", VIN='" + VIN + '\'' +
+                ", certifyDateA=" + certifyDateA +
+                ", fuelType='" + fuelType + '\'' +
+                ", engineDisplace='" + engineDisplace + '\'' +
+                ", certificate='" + certificate + '\'' +
+                ", transAgency='" + transAgency + '\'' +
+                ", transArea='" + transArea + '\'' +
+                ", transDateStart=" + transDateStart +
+                ", transDateStop=" + transDateStop +
+                ", certifyDateB=" + certifyDateB +
+                ", fixState=" + fixState +
+                ", nextFixDate=" + nextFixDate +
+                ", checkState='" + checkState + '\'' +
+                ", feePrintId='" + feePrintId + '\'' +
+                ", GPSBrand='" + GPSBrand + '\'' +
+                ", GPSModel='" + GPSModel + '\'' +
+                ", GPSIMEI='" + GPSIMEI + '\'' +
+                ", GPSInstallDate=" + GPSInstallDate +
+                ", registerDate=" + registerDate +
+                ", commercialType=" + commercialType +
+                ", drivingLicenseNumber='" + drivingLicenseNumber + '\'' +
+                ", drivingLicensePhoto='" + drivingLicensePhoto + '\'' +
+                ", annualInspectionTime=" + annualInspectionTime +
+                ", commercialInsuranceTime=" + commercialInsuranceTime +
+                ", insertTime=" + insertTime +
+                ", state=" + state +
+                ", addType=" + addType +
+                ", addObjectId=" + addObjectId +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarBrand.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarBrand.java
new file mode 100644
index 0000000..b05af36
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarBrand.java
@@ -0,0 +1,114 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 车辆品牌
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@TableName("t_car_brand")
+public class TCarBrand extends Model<TCarBrand> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 图片
+     */
+    private String imgUrl;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建时间
+     */
+    private Date insertTime;
+    /**
+     * 状态(1=正常,2=删除)
+     */
+    private Integer state;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TCarBrand{" +
+        "id=" + id +
+        ", name=" + name +
+        ", imgUrl=" + imgUrl +
+        ", remark=" + remark +
+        ", insertTime=" + insertTime +
+        ", state=" + state +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarModel.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarModel.java
new file mode 100644
index 0000000..f0a4501
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarModel.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 车辆车型
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@TableName("t_car_model")
+public class TCarModel extends Model<TCarModel> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建时间
+     */
+    private Date insertTime;
+    /**
+     * 状态(1=正常,2=删除)
+     */
+    private Integer state;
+    /**
+     * 座位数
+     */
+    private Integer seat;
+    /**
+     * 品牌id
+     */
+    private Integer brandId;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getSeat() {
+        return seat;
+    }
+
+    public void setSeat(Integer seat) {
+        this.seat = seat;
+    }
+
+    public Integer getBrandId() {
+        return brandId;
+    }
+
+    public void setBrandId(Integer brandId) {
+        this.brandId = brandId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TCarModel{" +
+        "id=" + id +
+        ", name=" + name +
+        ", remark=" + remark +
+        ", insertTime=" + insertTime +
+        ", state=" + state +
+        ", seat=" + seat +
+        ", brandId=" + brandId +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarService.java
new file mode 100644
index 0000000..c7fce8b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCarService.java
@@ -0,0 +1,85 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 车辆经营业务
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@TableName("t_car_service")
+public class TCarService extends Model<TCarService> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 车辆id
+     */
+    private Integer carId;
+    /**
+     * 类型(1=专车,2=出租车,3=城际(跨城出行),4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    private Integer type;
+    /**
+     * 服务车型id
+     */
+    private Integer serverCarModelId;
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TCarService{" +
+        "id=" + id +
+        ", carId=" + carId +
+        ", type=" + type +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCompany.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCompany.java
new file mode 100644
index 0000000..fb97a7c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCompany.java
@@ -0,0 +1,736 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 公司信息表
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-06
+ */
+@TableName("t_company")
+public class TCompany extends Model<TCompany> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 是否经营专车(1=是,2=否)
+     */
+    private Integer isSpe;
+    /**
+     * 是否经营出租车(1=是,2=否)
+     */
+    private Integer isTaxi;
+    /**
+     * 是否经营跨城(1=是,2=否)
+     */
+    private Integer isCross;
+    /**
+     * 是否经营跨城物流(1=是,2=否)
+     */
+    private Integer isCrossLogistics;
+    /**
+     * 是否经营同城物流(1=是,2=否)
+     */
+    private Integer isSameLogistics;
+    /**
+     * 是否经营包车(1=是,2=否)
+     */
+    private Integer isCharter;
+    /**
+     * 专车提成方式(1=比例,2=固定)
+     */
+    private Integer isSpeFixedOrProportional;
+    /**
+     * 出租车提成方式(1=比例,2=固定)
+     */
+    private Integer isTaxiFixedOrProportional;
+    /**
+     * 跨城物流提成方式(1=比例,2=固定)
+     */
+    private Integer isCrossLogisticsFixedOrProportional;
+    /**
+     * 同城物流提成方式(1=比例,2=固定)
+     */
+    private Integer isSameLogisticsFixedOrProportional;
+    /**
+     * 专车提成数值
+     */
+    private BigDecimal speMoney;
+    /**
+     * 出租车提成数值
+     */
+    private BigDecimal taxiMoney;
+    /**
+     * 跨城物流提成数值
+     */
+    private BigDecimal crossLogisticsMoney;
+    /**
+     * 同城物流
+     */
+    private BigDecimal sameLogisticsMoney;
+    /**
+     * 是否需要摆渡车(1=是,2=否)
+     */
+    private Integer isNeedFerry;
+    /**
+     * 企业名称
+     */
+    private String name;
+    /**
+     * 企业类型(1:平台,2:分公司,3:加盟商)
+     */
+    private Integer type;
+    /**
+     * 上级企业id
+     */
+    private Integer superiorId;
+    /**
+     * 负责人姓名
+     */
+    private String principalName;
+    /**
+     * 负责人电话
+     */
+    private String principalPhone;
+    /**
+     * 管理员姓名
+     */
+    private String adminName;
+    /**
+     * 管理员电话
+     */
+    private String adminPhone;
+    /**
+     * 紧急联系电话
+     */
+    private String urgentPhoen;
+    /**
+     * 服务机构设立日期
+     */
+    @DateTimeFormat
+    private Date setupTime;
+    /**
+     * 统一社会信用代码
+     */
+    private String identifier;
+    /**
+     * 注册地行政区划分代码
+     */
+    private String addressCode;
+    /**
+     * 经营范围
+     */
+    private String businessScope;
+    /**
+     * 通信地址
+     */
+    private String contactAddress;
+    /**
+     * 行政文书送达地址
+     */
+    private String documentAddress;
+    /**
+     * 经营业户经济类型
+     */
+    private String economicType;
+    /**
+     * 注册资本
+     */
+    private String regCapital;
+    /**
+     * 法人代表姓名
+     */
+    private String legalName;
+    /**
+     * 法人代表身份证号
+     */
+    private String legalId;
+    /**
+     * 法人代表电话
+     */
+    private String legalPhone;
+    /**
+     * 法人代表身份证扫描件文件地址
+     */
+    private String legalPhotoUrl;
+    /**
+     * 经营许可证发证机构
+     */
+    private String licensingAgency;
+    /**
+     * 经营许可证初次发证日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date licenseTime;
+    /**
+     * 经营许可证有效期起
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date licenseStartTime;
+    /**
+     * 经营许可证有效期止
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date licenseEndTime;
+    /**
+     * 网络预约车经营许可证号
+     */
+    private String licenseNumber;
+    /**
+     * 注册网络预约车辆数
+     */
+    private Integer carNum;
+    /**
+     * 注册网络预约车驾驶员数量
+     */
+    private Integer driverNum;
+    /**
+     * 登录MAC地址(多个以逗号分隔)
+     */
+    private String mac;
+    /**
+     * 当前状态(0:正常,1:禁用)
+     */
+    private Integer state;
+    /**
+     * 操作标识(1:新增,2:修改,3:删除)
+     */
+    private String flag;
+    /**
+     * 上传标识(1:未上传,2:已上传)
+     */
+    private String upload;
+    /**
+     * 创建时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date insertTime;
+    /**
+     * 具体地址
+     */
+    private String detailAddress;
+    /**
+     * 分公司代码
+     */
+    private String code;
+    /**
+     * 分公司区划代码
+     */
+    private String scopeCode;
+    /**
+     * 经营区域
+     */
+    private String serviceScope;
+    //身份证正面
+    private String idCardPositive;
+    //身份证反面
+    private String idCardReverse;
+
+    public String getIdCardPositive() {
+        return idCardPositive;
+    }
+
+    public void setIdCardPositive(String idCardPositive) {
+        this.idCardPositive = idCardPositive;
+    }
+
+    public String getIdCardReverse() {
+        return idCardReverse;
+    }
+
+    public void setIdCardReverse(String idCardReverse) {
+        this.idCardReverse = idCardReverse;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getScopeCode() {
+        return scopeCode;
+    }
+
+    public void setScopeCode(String scopeCode) {
+        this.scopeCode = scopeCode;
+    }
+
+    public String getServiceScope() {
+        return serviceScope;
+    }
+
+    public void setServiceScope(String serviceScope) {
+        this.serviceScope = serviceScope;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getIsSpe() {
+        return isSpe;
+    }
+
+    public void setIsSpe(Integer isSpe) {
+        this.isSpe = isSpe;
+    }
+
+    public Integer getIsTaxi() {
+        return isTaxi;
+    }
+
+    public void setIsTaxi(Integer isTaxi) {
+        this.isTaxi = isTaxi;
+    }
+
+    public Integer getIsCross() {
+        return isCross;
+    }
+
+    public void setIsCross(Integer isCross) {
+        this.isCross = isCross;
+    }
+
+    public Integer getIsCrossLogistics() {
+        return isCrossLogistics;
+    }
+
+    public void setIsCrossLogistics(Integer isCrossLogistics) {
+        this.isCrossLogistics = isCrossLogistics;
+    }
+
+    public Integer getIsSameLogistics() {
+        return isSameLogistics;
+    }
+
+    public void setIsSameLogistics(Integer isSameLogistics) {
+        this.isSameLogistics = isSameLogistics;
+    }
+
+    public Integer getIsCharter() {
+        return isCharter;
+    }
+
+    public void setIsCharter(Integer isCharter) {
+        this.isCharter = isCharter;
+    }
+
+    public Integer getIsSpeFixedOrProportional() {
+        return isSpeFixedOrProportional;
+    }
+
+    public void setIsSpeFixedOrProportional(Integer isSpeFixedOrProportional) {
+        this.isSpeFixedOrProportional = isSpeFixedOrProportional;
+    }
+
+    public Integer getIsTaxiFixedOrProportional() {
+        return isTaxiFixedOrProportional;
+    }
+
+    public void setIsTaxiFixedOrProportional(Integer isTaxiFixedOrProportional) {
+        this.isTaxiFixedOrProportional = isTaxiFixedOrProportional;
+    }
+
+    public Integer getIsCrossLogisticsFixedOrProportional() {
+        return isCrossLogisticsFixedOrProportional;
+    }
+
+    public void setIsCrossLogisticsFixedOrProportional(Integer isCrossLogisticsFixedOrProportional) {
+        this.isCrossLogisticsFixedOrProportional = isCrossLogisticsFixedOrProportional;
+    }
+
+    public Integer getIsSameLogisticsFixedOrProportional() {
+        return isSameLogisticsFixedOrProportional;
+    }
+
+    public void setIsSameLogisticsFixedOrProportional(Integer isSameLogisticsFixedOrProportional) {
+        this.isSameLogisticsFixedOrProportional = isSameLogisticsFixedOrProportional;
+    }
+
+    public BigDecimal getSpeMoney() {
+        return speMoney;
+    }
+
+    public void setSpeMoney(BigDecimal speMoney) {
+        this.speMoney = speMoney;
+    }
+
+    public BigDecimal getTaxiMoney() {
+        return taxiMoney;
+    }
+
+    public void setTaxiMoney(BigDecimal taxiMoney) {
+        this.taxiMoney = taxiMoney;
+    }
+
+    public BigDecimal getCrossLogisticsMoney() {
+        return crossLogisticsMoney;
+    }
+
+    public void setCrossLogisticsMoney(BigDecimal crossLogisticsMoney) {
+        this.crossLogisticsMoney = crossLogisticsMoney;
+    }
+
+    public BigDecimal getSameLogisticsMoney() {
+        return sameLogisticsMoney;
+    }
+
+    public void setSameLogisticsMoney(BigDecimal sameLogisticsMoney) {
+        this.sameLogisticsMoney = sameLogisticsMoney;
+    }
+
+    public Integer getIsNeedFerry() {
+        return isNeedFerry;
+    }
+
+    public void setIsNeedFerry(Integer isNeedFerry) {
+        this.isNeedFerry = isNeedFerry;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getSuperiorId() {
+        return superiorId;
+    }
+
+    public void setSuperiorId(Integer superiorId) {
+        this.superiorId = superiorId;
+    }
+
+    public String getPrincipalName() {
+        return principalName;
+    }
+
+    public void setPrincipalName(String principalName) {
+        this.principalName = principalName;
+    }
+
+    public String getPrincipalPhone() {
+        return principalPhone;
+    }
+
+    public void setPrincipalPhone(String principalPhone) {
+        this.principalPhone = principalPhone;
+    }
+
+    public String getAdminName() {
+        return adminName;
+    }
+
+    public void setAdminName(String adminName) {
+        this.adminName = adminName;
+    }
+
+    public String getAdminPhone() {
+        return adminPhone;
+    }
+
+    public void setAdminPhone(String adminPhone) {
+        this.adminPhone = adminPhone;
+    }
+
+    public String getUrgentPhoen() {
+        return urgentPhoen;
+    }
+
+    public void setUrgentPhoen(String urgentPhoen) {
+        this.urgentPhoen = urgentPhoen;
+    }
+
+    public Date getSetupTime() {
+        return setupTime;
+    }
+
+    public void setSetupTime(Date setupTime) {
+        this.setupTime = setupTime;
+    }
+
+    public String getIdentifier() {
+        return identifier;
+    }
+
+    public void setIdentifier(String identifier) {
+        this.identifier = identifier;
+    }
+
+    public String getAddressCode() {
+        return addressCode;
+    }
+
+    public void setAddressCode(String addressCode) {
+        this.addressCode = addressCode;
+    }
+
+    public String getBusinessScope() {
+        return businessScope;
+    }
+
+    public void setBusinessScope(String businessScope) {
+        this.businessScope = businessScope;
+    }
+
+    public String getContactAddress() {
+        return contactAddress;
+    }
+
+    public void setContactAddress(String contactAddress) {
+        this.contactAddress = contactAddress;
+    }
+
+    public String getDocumentAddress() {
+        return documentAddress;
+    }
+
+    public void setDocumentAddress(String documentAddress) {
+        this.documentAddress = documentAddress;
+    }
+
+    public String getEconomicType() {
+        return economicType;
+    }
+
+    public void setEconomicType(String economicType) {
+        this.economicType = economicType;
+    }
+
+    public String getRegCapital() {
+        return regCapital;
+    }
+
+    public void setRegCapital(String regCapital) {
+        this.regCapital = regCapital;
+    }
+
+    public String getLegalName() {
+        return legalName;
+    }
+
+    public void setLegalName(String legalName) {
+        this.legalName = legalName;
+    }
+
+    public String getLegalId() {
+        return legalId;
+    }
+
+    public void setLegalId(String legalId) {
+        this.legalId = legalId;
+    }
+
+    public String getLegalPhone() {
+        return legalPhone;
+    }
+
+    public void setLegalPhone(String legalPhone) {
+        this.legalPhone = legalPhone;
+    }
+
+    public String getLegalPhotoUrl() {
+        return legalPhotoUrl;
+    }
+
+    public void setLegalPhotoUrl(String legalPhotoUrl) {
+        this.legalPhotoUrl = legalPhotoUrl;
+    }
+
+    public String getLicensingAgency() {
+        return licensingAgency;
+    }
+
+    public void setLicensingAgency(String licensingAgency) {
+        this.licensingAgency = licensingAgency;
+    }
+
+    public Date getLicenseTime() {
+        return licenseTime;
+    }
+
+    public void setLicenseTime(Date licenseTime) {
+        this.licenseTime = licenseTime;
+    }
+
+    public Date getLicenseStartTime() {
+        return licenseStartTime;
+    }
+
+    public void setLicenseStartTime(Date licenseStartTime) {
+        this.licenseStartTime = licenseStartTime;
+    }
+
+    public Date getLicenseEndTime() {
+        return licenseEndTime;
+    }
+
+    public void setLicenseEndTime(Date licenseEndTime) {
+        this.licenseEndTime = licenseEndTime;
+    }
+
+    public String getLicenseNumber() {
+        return licenseNumber;
+    }
+
+    public void setLicenseNumber(String licenseNumber) {
+        this.licenseNumber = licenseNumber;
+    }
+
+    public Integer getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(Integer carNum) {
+        this.carNum = carNum;
+    }
+
+    public Integer getDriverNum() {
+        return driverNum;
+    }
+
+    public void setDriverNum(Integer driverNum) {
+        this.driverNum = driverNum;
+    }
+
+    public String getMac() {
+        return mac;
+    }
+
+    public void setMac(String mac) {
+        this.mac = mac;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getFlag() {
+        return flag;
+    }
+
+    public void setFlag(String flag) {
+        this.flag = flag;
+    }
+
+    public String getUpload() {
+        return upload;
+    }
+
+    public void setUpload(String upload) {
+        this.upload = upload;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getDetailAddress() {
+        return detailAddress;
+    }
+
+    public void setDetailAddress(String detailAddress) {
+        this.detailAddress = detailAddress;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TCompany{" +
+        "id=" + id +
+        ", isSpe=" + isSpe +
+        ", isTaxi=" + isTaxi +
+        ", isCross=" + isCross +
+        ", isCrossLogistics=" + isCrossLogistics +
+        ", isSameLogistics=" + isSameLogistics +
+        ", isCharter=" + isCharter +
+        ", isSpeFixedOrProportional=" + isSpeFixedOrProportional +
+        ", isTaxiFixedOrProportional=" + isTaxiFixedOrProportional +
+        ", isCrossLogisticsFixedOrProportional=" + isCrossLogisticsFixedOrProportional +
+        ", isSameLogisticsFixedOrProportional=" + isSameLogisticsFixedOrProportional +
+        ", speMoney=" + speMoney +
+        ", taxiMoney=" + taxiMoney +
+        ", crossLogisticsMoney=" + crossLogisticsMoney +
+        ", sameLogisticsMoney=" + sameLogisticsMoney +
+        ", isNeedFerry=" + isNeedFerry +
+        ", name=" + name +
+        ", type=" + type +
+        ", superiorId=" + superiorId +
+        ", principalName=" + principalName +
+        ", principalPhone=" + principalPhone +
+        ", adminName=" + adminName +
+        ", adminPhone=" + adminPhone +
+        ", urgentPhoen=" + urgentPhoen +
+        ", setupTime=" + setupTime +
+        ", identifier=" + identifier +
+        ", addressCode=" + addressCode +
+        ", businessScope=" + businessScope +
+        ", contactAddress=" + contactAddress +
+        ", documentAddress=" + documentAddress +
+        ", economicType=" + economicType +
+        ", regCapital=" + regCapital +
+        ", legalName=" + legalName +
+        ", legalId=" + legalId +
+        ", legalPhone=" + legalPhone +
+        ", legalPhotoUrl=" + legalPhotoUrl +
+        ", licensingAgency=" + licensingAgency +
+        ", licenseTime=" + licenseTime +
+        ", licenseStartTime=" + licenseStartTime +
+        ", licenseEndTime=" + licenseEndTime +
+        ", licenseNumber=" + licenseNumber +
+        ", carNum=" + carNum +
+        ", driverNum=" + driverNum +
+        ", mac=" + mac +
+        ", state=" + state +
+        ", flag=" + flag +
+        ", upload=" + upload +
+        ", insertTime=" + insertTime +
+        ", detailAddress=" + detailAddress +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCompanyCity.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCompanyCity.java
new file mode 100644
index 0000000..d1cce29
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TCompanyCity.java
@@ -0,0 +1,110 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 公司经营地区
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-06
+ */
+@TableName("t_company_city")
+public class TCompanyCity extends Model<TCompanyCity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 省Code
+     */
+    private Integer provinceCode;
+    /**
+     * 市Code
+     */
+    private Integer cityCode;
+    /**
+     * 区Code
+     */
+    private Integer areaCode;
+    /**
+     * 1=正常,2=删除
+     */
+    private Integer state;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getProvinceCode() {
+        return provinceCode;
+    }
+
+    public void setProvinceCode(Integer provinceCode) {
+        this.provinceCode = provinceCode;
+    }
+
+    public Integer getCityCode() {
+        return cityCode;
+    }
+
+    public void setCityCode(Integer cityCode) {
+        this.cityCode = cityCode;
+    }
+
+    public Integer getAreaCode() {
+        return areaCode;
+    }
+
+    public void setAreaCode(Integer areaCode) {
+        this.areaCode = areaCode;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TCompanyCity{" +
+        "id=" + id +
+        ", companyId=" + companyId +
+        ", provinceCode=" + provinceCode +
+        ", cityCode=" + cityCode +
+        ", areaCode=" + areaCode +
+        ", state=" + state +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TComplaint.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TComplaint.java
new file mode 100644
index 0000000..12c78ec
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TComplaint.java
@@ -0,0 +1,166 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 投诉管理
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_complaint")
+public class TComplaint extends Model<TComplaint> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户Id
+     */
+    private Integer userId;
+    /**
+     * 投诉原因
+     */
+    private String reason;
+    /**
+     * 被投诉人Id
+     */
+    private Long driverId;
+    /**
+     * 描述
+     */
+    private String description;
+    /**
+     * 是否处理(0:未处理,1:已处理)
+     */
+    private Integer isHandle;
+    /**
+     * 投诉时间
+     */
+    @TableField("insert_time")
+    private Date insertTime;
+    /**
+     * 处理结果
+     */
+    private String handleResult;
+    /**
+     * 处理人id
+     */
+    private Integer handleUserId;
+    /**
+     * 处理时间
+     */
+    private Date handleTime;
+
+    public Date getHandleTime() {
+        return handleTime;
+    }
+
+    public void setHandleTime(Date handleTime) {
+        this.handleTime = handleTime;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public Long getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Long driverId) {
+        this.driverId = driverId;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Integer getIsHandle() {
+        return isHandle;
+    }
+
+    public void setIsHandle(Integer isHandle) {
+        this.isHandle = isHandle;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getHandleResult() {
+        return handleResult;
+    }
+
+    public void setHandleResult(String handleResult) {
+        this.handleResult = handleResult;
+    }
+
+    public Integer getHandleUserId() {
+        return handleUserId;
+    }
+
+    public void setHandleUserId(Integer handleUserId) {
+        this.handleUserId = handleUserId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TComplaint{" +
+        "id=" + id +
+        ", userId=" + userId +
+        ", reason=" + reason +
+        ", driverId=" + driverId +
+        ", description=" + description +
+        ", isHandle=" + isHandle +
+        ", insertTime=" + insertTime +
+        ", handleResult=" + handleResult +
+        ", handleUserId=" + handleUserId +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDispatch.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDispatch.java
new file mode 100644
index 0000000..f765df7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDispatch.java
@@ -0,0 +1,176 @@
+package com.stylefeng.guns.modular.system.model;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 调度管理
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-01
+ */
+@TableName("t_dispatch")
+public class TDispatch extends Model<TDispatch> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    private Integer id;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 调度名称
+     */
+    private String name;
+    /**
+     * 所属分公司ID
+     */
+    private Integer companyId;
+    /**
+     * 加盟商ID
+     */
+    private Integer franchiseeId;
+    /**
+     * 联系电话
+     */
+    private String phone;
+    /**
+     * 登录账号
+     */
+    private String account;
+    /**
+     * 登录密码  加密方式:MD5  加盐:WL:x9#
+     */
+    private String password;
+    /**
+     * 添加用户ID
+     */
+    private Integer insertUserId;
+    /**
+     * 添加用户角色
+     */
+    private Integer insertUserRole;
+    /**
+     * 状态 1=正常 2=冻结 3=删除
+     */
+    private Integer state;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getFranchiseeId() {
+        return franchiseeId;
+    }
+
+    public void setFranchiseeId(Integer franchiseeId) {
+        this.franchiseeId = franchiseeId;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getAccount() {
+        return account;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public Integer getInsertUserId() {
+        return insertUserId;
+    }
+
+    public void setInsertUserId(Integer insertUserId) {
+        this.insertUserId = insertUserId;
+    }
+
+    public Integer getInsertUserRole() {
+        return insertUserRole;
+    }
+
+    public void setInsertUserRole(Integer insertUserRole) {
+        this.insertUserRole = insertUserRole;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TDispatch{" +
+        "id=" + id +
+        ", insertTime=" + insertTime +
+        ", name=" + name +
+        ", companyId=" + companyId +
+        ", franchiseeId=" + franchiseeId +
+        ", phone=" + phone +
+        ", account=" + account +
+        ", password=" + password +
+        ", insertUserId=" + insertUserId +
+        ", insertUserRole=" + insertUserRole +
+        ", state=" + state +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriver.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriver.java
new file mode 100644
index 0000000..211bdef
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriver.java
@@ -0,0 +1,870 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 司机表
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-04
+ */
+@TableName("t_driver")
+public class TDriver extends Model<TDriver> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 登录账号
+     */
+    private String account;
+    /**
+     * 工号
+     */
+    private String jobNumber;
+    /**
+     * 手机号
+     */
+    private String phone;
+    /**
+     * 密码
+     */
+    private String password;
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 性别(1=男,2=女)
+     */
+    private Integer sex;
+    /**
+     * 身份证号
+     */
+    private String idCard;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 加盟商ID
+     */
+    private Integer franchiseeId;
+    /**
+     * 头像照片
+     */
+    private String headImgUrl;
+    /**
+     * 人脸识别照片
+     */
+    private String faceImgUrl;
+    /**
+     * 身份证正面照片
+     */
+    private String idCardImgUrl1;
+    /**
+     * 身份证背面照片
+     */
+    private String idCardImgUrl2;
+    /**
+     * 网约车司机注册地行政区域
+     */
+    private String placeOfEmployment;
+    /**
+     * 生日
+     */
+    private Date birthday;
+    /**
+     * 银行卡号
+     */
+    private String bankCardNumber;
+    /**
+     * 国籍
+     */
+    private String driverNationality;
+    /**
+     * 民族
+     */
+    private String driverNation;
+    /**
+     * 婚姻状况(1:未婚,2:已婚,3:离异)
+     */
+    private Integer driverMaritalStatus;
+    /**
+     * 外语能力
+     */
+    private String driverLanguageLevel;
+    /**
+     * 学历
+     */
+    private String driverEducation;
+    /**
+     * 户口登记机关名称
+     */
+    private String driverCensus;
+    /**
+     * 户口地址或常住地址
+     */
+    private String driverAddress;
+    /**
+     * 通信地址
+     */
+    private String driverContactAddress;
+    /**
+     * 驾龄
+     */
+    private Integer driverAge;
+    /**
+     * 驾驶证号
+     */
+    private String driveCard;
+    /**
+     * 驾驶证照片
+     */
+    private String driveCardImgUrl;
+    /**
+     * 准驾车型
+     */
+    private String driverType;
+    /**
+     * 初次领取驾驶证日期
+     */
+    private Date getDriverLicenseDate;
+    /**
+     * 驾驶证有效期限起
+     */
+    private Date driverLicenseOn;
+    /**
+     * 驾驶证有效期限止
+     */
+    private Date driverLicenseOff;
+    /**
+     * 是否巡游出租车驾驶员(0:否,1:是)
+     */
+    private Integer taxiDriver;
+    /**
+     * 出租车资格证号
+     */
+    private String taxiAptitudeCard;
+    /**
+     * 网约车资格证照片
+     */
+    private String networkCarlssueImg;
+    /**
+     * 网络预约出租车驾驶员证发证机构
+     */
+    private String networkCarlssueOrganization;
+    /**
+     * 资格证发证日期
+     */
+    private Date networkCarlssueDate;
+    /**
+     * 初次认领资格证日期
+     */
+    private Date getNetworkCarProofDate;
+    /**
+     * 资格证有效起始日期
+     */
+    private Date networkCarProofOn;
+    /**
+     * 资格证有效截至日期
+     */
+    private Date networkCarProofOff;
+    /**
+     * 报备日期
+     */
+    private Date registerDate;
+    /**
+     * 是否专职驾驶员(0:否,1:是)
+     */
+    private Integer fullTimeDriver;
+    /**
+     * 是否在驾驶员黑名单内(0:否,1:是)
+     */
+    private Integer inDriverBlacklist;
+    /**
+     * 服务类型(1:网络预约出租汽车,2:巡游出租汽车,3:私人小客车合乘)
+     */
+    private Integer commercialType;
+    /**
+     * 驾驶员合同签署公司
+     */
+    private String contractCompany;
+    /**
+     * 合同有效期起
+     */
+    private Date contractOn;
+    /**
+     * 合同有效期止
+     */
+    private Date contractOff;
+    /**
+     * 紧急联系人
+     */
+    private String emergencyContact;
+    /**
+     * 紧急联系电话
+     */
+    private String emergencyContactPhone;
+    /**
+     * 紧急联系地址
+     */
+    private String emergencyContactAddress;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 是否是平台车辆(1=是,2=否)
+     */
+    private Integer isPlatCar;
+    /**
+     * 司机管理车辆id
+     */
+    private Integer carId;
+    /**
+     * 状态(1=待审核,2=正常,3=冻结,4=拒绝)
+     */
+    private Integer authState;
+    /**
+     * 司机状态(1=离线,2=空闲,3=服务中)
+     */
+    private Integer state;
+    /**
+     * 1:创建,2:修改,3:删除
+     */
+    private String flag;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    private Integer insertUser;
+    private Date updateTime;
+    private Integer updateUser;
+    /**
+     * 司机来源方式 1=司机注册 2=平台添加 3=分公司添加 4=加盟商添加
+     */
+    private Integer addType;
+    /**
+     * 余额
+     */
+    private BigDecimal balance;
+    /**
+     * 业务总收入
+     * @return
+     */
+    @TableField("businessMoney")
+    private Double businessMoney;
+    /**
+     * 剩余未提现业务总收入
+     * @return
+     */
+    @TableField("laveBusinessMoney")
+    private Double laveBusinessMoney;
+    /**
+     * 添加司机的分公司/加盟商ID
+     */
+    private Integer addObjectId;
+
+    public BigDecimal getBalance() {
+        return balance;
+    }
+
+    public void setBalance(BigDecimal balance) {
+        this.balance = balance;
+    }
+
+    public Integer getAddObjectId() {
+        return addObjectId;
+    }
+
+    public void setAddObjectId(Integer addObjectId) {
+        this.addObjectId = addObjectId;
+    }
+
+    public Integer getFranchiseeId() {
+        return franchiseeId;
+    }
+
+    public void setFranchiseeId(Integer franchiseeId) {
+        this.franchiseeId = franchiseeId;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getAccount() {
+        return account;
+    }
+
+    public void setAccount(String account) {
+        this.account = account;
+    }
+
+    public String getJobNumber() {
+        return jobNumber;
+    }
+
+    public void setJobNumber(String jobNumber) {
+        this.jobNumber = jobNumber;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getSex() {
+        return sex;
+    }
+
+    public void setSex(Integer sex) {
+        this.sex = sex;
+    }
+
+    public String getIdCard() {
+        return idCard;
+    }
+
+    public void setIdCard(String idCard) {
+        this.idCard = idCard;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getHeadImgUrl() {
+        return headImgUrl;
+    }
+
+    public void setHeadImgUrl(String headImgUrl) {
+        this.headImgUrl = headImgUrl;
+    }
+
+    public String getFaceImgUrl() {
+        return faceImgUrl;
+    }
+
+    public void setFaceImgUrl(String faceImgUrl) {
+        this.faceImgUrl = faceImgUrl;
+    }
+
+    public String getIdCardImgUrl1() {
+        return idCardImgUrl1;
+    }
+
+    public void setIdCardImgUrl1(String idCardImgUrl1) {
+        this.idCardImgUrl1 = idCardImgUrl1;
+    }
+
+    public String getIdCardImgUrl2() {
+        return idCardImgUrl2;
+    }
+
+    public void setIdCardImgUrl2(String idCardImgUrl2) {
+        this.idCardImgUrl2 = idCardImgUrl2;
+    }
+
+    public String getPlaceOfEmployment() {
+        return placeOfEmployment;
+    }
+
+    public void setPlaceOfEmployment(String placeOfEmployment) {
+        this.placeOfEmployment = placeOfEmployment;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public String getBankCardNumber() {
+        return bankCardNumber;
+    }
+
+    public void setBankCardNumber(String bankCardNumber) {
+        this.bankCardNumber = bankCardNumber;
+    }
+
+    public String getDriverNationality() {
+        return driverNationality;
+    }
+
+    public void setDriverNationality(String driverNationality) {
+        this.driverNationality = driverNationality;
+    }
+
+    public String getDriverNation() {
+        return driverNation;
+    }
+
+    public void setDriverNation(String driverNation) {
+        this.driverNation = driverNation;
+    }
+
+    public Integer getDriverMaritalStatus() {
+        return driverMaritalStatus;
+    }
+
+    public void setDriverMaritalStatus(Integer driverMaritalStatus) {
+        this.driverMaritalStatus = driverMaritalStatus;
+    }
+
+    public String getDriverLanguageLevel() {
+        return driverLanguageLevel;
+    }
+
+    public void setDriverLanguageLevel(String driverLanguageLevel) {
+        this.driverLanguageLevel = driverLanguageLevel;
+    }
+
+    public String getDriverEducation() {
+        return driverEducation;
+    }
+
+    public void setDriverEducation(String driverEducation) {
+        this.driverEducation = driverEducation;
+    }
+
+    public String getDriverCensus() {
+        return driverCensus;
+    }
+
+    public void setDriverCensus(String driverCensus) {
+        this.driverCensus = driverCensus;
+    }
+
+    public String getDriverAddress() {
+        return driverAddress;
+    }
+
+    public void setDriverAddress(String driverAddress) {
+        this.driverAddress = driverAddress;
+    }
+
+    public String getDriverContactAddress() {
+        return driverContactAddress;
+    }
+
+    public void setDriverContactAddress(String driverContactAddress) {
+        this.driverContactAddress = driverContactAddress;
+    }
+
+    public Integer getDriverAge() {
+        return driverAge;
+    }
+
+    public void setDriverAge(Integer driverAge) {
+        this.driverAge = driverAge;
+    }
+
+    public String getDriveCard() {
+        return driveCard;
+    }
+
+    public void setDriveCard(String driveCard) {
+        this.driveCard = driveCard;
+    }
+
+    public String getDriveCardImgUrl() {
+        return driveCardImgUrl;
+    }
+
+    public void setDriveCardImgUrl(String driveCardImgUrl) {
+        this.driveCardImgUrl = driveCardImgUrl;
+    }
+
+    public String getDriverType() {
+        return driverType;
+    }
+
+    public void setDriverType(String driverType) {
+        this.driverType = driverType;
+    }
+
+    public Date getGetDriverLicenseDate() {
+        return getDriverLicenseDate;
+    }
+
+    public void setGetDriverLicenseDate(Date getDriverLicenseDate) {
+        this.getDriverLicenseDate = getDriverLicenseDate;
+    }
+
+    public Date getDriverLicenseOn() {
+        return driverLicenseOn;
+    }
+
+    public void setDriverLicenseOn(Date driverLicenseOn) {
+        this.driverLicenseOn = driverLicenseOn;
+    }
+
+    public Date getDriverLicenseOff() {
+        return driverLicenseOff;
+    }
+
+    public void setDriverLicenseOff(Date driverLicenseOff) {
+        this.driverLicenseOff = driverLicenseOff;
+    }
+
+    public Integer getTaxiDriver() {
+        return taxiDriver;
+    }
+
+    public void setTaxiDriver(Integer taxiDriver) {
+        this.taxiDriver = taxiDriver;
+    }
+
+    public String getTaxiAptitudeCard() {
+        return taxiAptitudeCard;
+    }
+
+    public void setTaxiAptitudeCard(String taxiAptitudeCard) {
+        this.taxiAptitudeCard = taxiAptitudeCard;
+    }
+
+    public String getNetworkCarlssueImg() {
+        return networkCarlssueImg;
+    }
+
+    public void setNetworkCarlssueImg(String networkCarlssueImg) {
+        this.networkCarlssueImg = networkCarlssueImg;
+    }
+
+    public String getNetworkCarlssueOrganization() {
+        return networkCarlssueOrganization;
+    }
+
+    public void setNetworkCarlssueOrganization(String networkCarlssueOrganization) {
+        this.networkCarlssueOrganization = networkCarlssueOrganization;
+    }
+
+    public Date getNetworkCarlssueDate() {
+        return networkCarlssueDate;
+    }
+
+    public void setNetworkCarlssueDate(Date networkCarlssueDate) {
+        this.networkCarlssueDate = networkCarlssueDate;
+    }
+
+    public Date getGetNetworkCarProofDate() {
+        return getNetworkCarProofDate;
+    }
+
+    public void setGetNetworkCarProofDate(Date getNetworkCarProofDate) {
+        this.getNetworkCarProofDate = getNetworkCarProofDate;
+    }
+
+    public Date getNetworkCarProofOn() {
+        return networkCarProofOn;
+    }
+
+    public void setNetworkCarProofOn(Date networkCarProofOn) {
+        this.networkCarProofOn = networkCarProofOn;
+    }
+
+    public Date getNetworkCarProofOff() {
+        return networkCarProofOff;
+    }
+
+    public void setNetworkCarProofOff(Date networkCarProofOff) {
+        this.networkCarProofOff = networkCarProofOff;
+    }
+
+    public Date getRegisterDate() {
+        return registerDate;
+    }
+
+    public void setRegisterDate(Date registerDate) {
+        this.registerDate = registerDate;
+    }
+
+    public Integer getFullTimeDriver() {
+        return fullTimeDriver;
+    }
+
+    public void setFullTimeDriver(Integer fullTimeDriver) {
+        this.fullTimeDriver = fullTimeDriver;
+    }
+
+    public Integer getInDriverBlacklist() {
+        return inDriverBlacklist;
+    }
+
+    public void setInDriverBlacklist(Integer inDriverBlacklist) {
+        this.inDriverBlacklist = inDriverBlacklist;
+    }
+
+    public Integer getCommercialType() {
+        return commercialType;
+    }
+
+    public void setCommercialType(Integer commercialType) {
+        this.commercialType = commercialType;
+    }
+
+    public String getContractCompany() {
+        return contractCompany;
+    }
+
+    public void setContractCompany(String contractCompany) {
+        this.contractCompany = contractCompany;
+    }
+
+    public Date getContractOn() {
+        return contractOn;
+    }
+
+    public void setContractOn(Date contractOn) {
+        this.contractOn = contractOn;
+    }
+
+    public Date getContractOff() {
+        return contractOff;
+    }
+
+    public void setContractOff(Date contractOff) {
+        this.contractOff = contractOff;
+    }
+
+    public String getEmergencyContact() {
+        return emergencyContact;
+    }
+
+    public void setEmergencyContact(String emergencyContact) {
+        this.emergencyContact = emergencyContact;
+    }
+
+    public String getEmergencyContactPhone() {
+        return emergencyContactPhone;
+    }
+
+    public void setEmergencyContactPhone(String emergencyContactPhone) {
+        this.emergencyContactPhone = emergencyContactPhone;
+    }
+
+    public String getEmergencyContactAddress() {
+        return emergencyContactAddress;
+    }
+
+    public void setEmergencyContactAddress(String emergencyContactAddress) {
+        this.emergencyContactAddress = emergencyContactAddress;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getIsPlatCar() {
+        return isPlatCar;
+    }
+
+    public void setIsPlatCar(Integer isPlatCar) {
+        this.isPlatCar = isPlatCar;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public Integer getAuthState() {
+        return authState;
+    }
+
+    public void setAuthState(Integer authState) {
+        this.authState = authState;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getFlag() {
+        return flag;
+    }
+
+    public void setFlag(String flag) {
+        this.flag = flag;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getInsertUser() {
+        return insertUser;
+    }
+
+    public void setInsertUser(Integer insertUser) {
+        this.insertUser = insertUser;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getUpdateUser() {
+        return updateUser;
+    }
+
+    public void setUpdateUser(Integer updateUser) {
+        this.updateUser = updateUser;
+    }
+
+    public Integer getAddType() {
+        return addType;
+    }
+
+    public void setAddType(Integer addType) {
+        this.addType = addType;
+    }
+
+    public Double getLaveBusinessMoney() {
+        return laveBusinessMoney;
+    }
+
+    public void setLaveBusinessMoney(Double laveBusinessMoney) {
+        this.laveBusinessMoney = laveBusinessMoney;
+    }
+
+    public Double getBusinessMoney() {
+        return businessMoney;
+    }
+
+    public void setBusinessMoney(Double businessMoney) {
+        this.businessMoney = businessMoney;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TDriver{" +
+        "id=" + id +
+        ", account=" + account +
+        ", jobNumber=" + jobNumber +
+        ", phone=" + phone +
+        ", password=" + password +
+        ", name=" + name +
+        ", sex=" + sex +
+        ", idCard=" + idCard +
+        ", companyId=" + companyId +
+        ", headImgUrl=" + headImgUrl +
+        ", faceImgUrl=" + faceImgUrl +
+        ", idCardImgUrl1=" + idCardImgUrl1 +
+        ", idCardImgUrl2=" + idCardImgUrl2 +
+        ", placeOfEmployment=" + placeOfEmployment +
+        ", birthday=" + birthday +
+        ", bankCardNumber=" + bankCardNumber +
+        ", driverNationality=" + driverNationality +
+        ", driverNation=" + driverNation +
+        ", driverMaritalStatus=" + driverMaritalStatus +
+        ", driverLanguageLevel=" + driverLanguageLevel +
+        ", driverEducation=" + driverEducation +
+        ", driverCensus=" + driverCensus +
+        ", driverAddress=" + driverAddress +
+        ", driverContactAddress=" + driverContactAddress +
+        ", driverAge=" + driverAge +
+        ", driveCard=" + driveCard +
+        ", driveCardImgUrl=" + driveCardImgUrl +
+        ", driverType=" + driverType +
+        ", getDriverLicenseDate=" + getDriverLicenseDate +
+        ", driverLicenseOn=" + driverLicenseOn +
+        ", driverLicenseOff=" + driverLicenseOff +
+        ", taxiDriver=" + taxiDriver +
+        ", taxiAptitudeCard=" + taxiAptitudeCard +
+        ", networkCarlssueImg=" + networkCarlssueImg +
+        ", networkCarlssueOrganization=" + networkCarlssueOrganization +
+        ", networkCarlssueDate=" + networkCarlssueDate +
+        ", getNetworkCarProofDate=" + getNetworkCarProofDate +
+        ", networkCarProofOn=" + networkCarProofOn +
+        ", networkCarProofOff=" + networkCarProofOff +
+        ", registerDate=" + registerDate +
+        ", fullTimeDriver=" + fullTimeDriver +
+        ", inDriverBlacklist=" + inDriverBlacklist +
+        ", commercialType=" + commercialType +
+        ", contractCompany=" + contractCompany +
+        ", contractOn=" + contractOn +
+        ", contractOff=" + contractOff +
+        ", emergencyContact=" + emergencyContact +
+        ", emergencyContactPhone=" + emergencyContactPhone +
+        ", emergencyContactAddress=" + emergencyContactAddress +
+        ", remark=" + remark +
+        ", isPlatCar=" + isPlatCar +
+        ", carId=" + carId +
+        ", authState=" + authState +
+        ", state=" + state +
+        ", flag=" + flag +
+        ", insertTime=" + insertTime +
+        ", insertUser=" + insertUser +
+        ", updateTime=" + updateTime +
+        ", updateUser=" + updateUser +
+        ", addType=" + addType +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverLine.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverLine.java
new file mode 100644
index 0000000..51ac9d4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverLine.java
@@ -0,0 +1,93 @@
+package com.stylefeng.guns.modular.system.model;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 司机关联线路
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@TableName("t_driver_line")
+public class TDriverLine extends Model<TDriverLine> {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    /**
+     * 司机id
+     */
+    private Integer driverId;
+    /**
+     * 线路id
+     */
+    private Integer lineId;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 添加时间【后台使用】
+     */
+    private String addTime;
+
+    public String getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(String addTime) {
+        this.addTime = addTime;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TDriverLine{" +
+        "id=" + id +
+        ", driverId=" + driverId +
+        ", lineId=" + lineId +
+        ", createTime=" + createTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverService.java
new file mode 100644
index 0000000..04a6423
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverService.java
@@ -0,0 +1,74 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 司机经营业务
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@TableName("t_driver_service")
+public class TDriverService extends Model<TDriverService> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 司机id
+     */
+    private Integer driverId;
+    /**
+     * 类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    private Integer type;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TDriverService{" +
+        "id=" + id +
+        ", driverId=" + driverId +
+        ", type=" + type +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TFeedback.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TFeedback.java
new file mode 100644
index 0000000..e0a1b2d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TFeedback.java
@@ -0,0 +1,176 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 反馈管理
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+@TableName("t_feedback")
+public class TFeedback extends Model<TFeedback> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 反馈人ID
+     */
+    private Integer userId;
+    /**
+     * 处理人Id
+     */
+    private Integer handleUserId;
+    /**
+     * 反馈内容
+     */
+    private String content;
+    /**
+     * 反馈时间
+     */
+    private Date insertTime;
+    /**
+     * 图片
+     */
+    private String imgUrl;
+    /**
+     * 状态(1=正常,2=删除)
+     */
+    private Integer flag;
+    /**
+     * 处理状态 1=未处理 2=已处理
+     */
+    private Integer state;
+    /**
+     * 处理时间
+     */
+    private Date cldate;
+    /**
+     * 处理备注
+     */
+    private String remark;
+    /**
+     * 1=用户,2=司机
+     */
+    private Integer type;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getHandleUserId() {
+        return handleUserId;
+    }
+
+    public void setHandleUserId(Integer handleUserId) {
+        this.handleUserId = handleUserId;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Integer getFlag() {
+        return flag;
+    }
+
+    public void setFlag(Integer flag) {
+        this.flag = flag;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getCldate() {
+        return cldate;
+    }
+
+    public void setCldate(Date cldate) {
+        this.cldate = cldate;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TFeedback{" +
+        "id=" + id +
+        ", userId=" + userId +
+        ", handleUserId=" + handleUserId +
+        ", content=" + content +
+        ", insertTime=" + insertTime +
+        ", imgUrl=" + imgUrl +
+        ", flag=" + flag +
+        ", state=" + state +
+        ", cldate=" + cldate +
+        ", remark=" + remark +
+        ", type=" + type +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TIntegralGoods.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TIntegralGoods.java
new file mode 100644
index 0000000..055b19d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TIntegralGoods.java
@@ -0,0 +1,153 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 积分商品管理
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+@TableName("t_integral_goods")
+public class TIntegralGoods extends Model<TIntegralGoods> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 商品名称
+     */
+    private String name;
+    /**
+     * 商品图片
+     */
+    private String imgUrl;
+    /**
+     * 兑换积分
+     */
+    private Integer integral;
+    /**
+     * 商品说明
+     */
+    private String instructions;
+    /**
+     * 状态  1=正常  2=已下架  3=删除
+     */
+    private Integer state;
+    /**
+     * 添加用户ID
+     */
+    private Integer insertUserId;
+    /**
+     * 添加用户角色
+     */
+    private Integer insertUserRole;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Integer getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Integer integral) {
+        this.integral = integral;
+    }
+
+    public String getInstructions() {
+        return instructions;
+    }
+
+    public void setInstructions(String instructions) {
+        this.instructions = instructions;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getInsertUserId() {
+        return insertUserId;
+    }
+
+    public void setInsertUserId(Integer insertUserId) {
+        this.insertUserId = insertUserId;
+    }
+
+    public Integer getInsertUserRole() {
+        return insertUserRole;
+    }
+
+    public void setInsertUserRole(Integer insertUserRole) {
+        this.insertUserRole = insertUserRole;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TIntegralGoods{" +
+        "id=" + id +
+        ", insertTime=" + insertTime +
+        ", name=" + name +
+        ", imgUrl=" + imgUrl +
+        ", integral=" + integral +
+        ", instructions=" + instructions +
+        ", state=" + state +
+        ", insertUserId=" + insertUserId +
+        ", insertUserRole=" + insertUserRole +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TIntegralOrder.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TIntegralOrder.java
new file mode 100644
index 0000000..04d9472
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TIntegralOrder.java
@@ -0,0 +1,166 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 积分订单管理
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+@TableName("t_integral_order")
+public class TIntegralOrder extends Model<TIntegralOrder> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 兑换时间
+     */
+    private Date insertTime;
+    /**
+     * 兑换用户ID
+     */
+    private Integer userId;
+    /**
+     * 兑换商品ID
+     */
+    private Integer goodsId;
+    /**
+     * 兑换数量
+     */
+    private Integer num;
+    /**
+     * 收货人
+     */
+    private String consigneeName;
+    /**
+     * 收货人联系电话
+     */
+    private String consigneePhone;
+    /**
+     * 收货人收货地址
+     */
+    private String consigneeAddress;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 状态 1=未处理 2=已处理 3=已删除
+     */
+    private Integer state;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getGoodsId() {
+        return goodsId;
+    }
+
+    public void setGoodsId(Integer goodsId) {
+        this.goodsId = goodsId;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public String getConsigneeName() {
+        return consigneeName;
+    }
+
+    public void setConsigneeName(String consigneeName) {
+        this.consigneeName = consigneeName;
+    }
+
+    public String getConsigneePhone() {
+        return consigneePhone;
+    }
+
+    public void setConsigneePhone(String consigneePhone) {
+        this.consigneePhone = consigneePhone;
+    }
+
+    public String getConsigneeAddress() {
+        return consigneeAddress;
+    }
+
+    public void setConsigneeAddress(String consigneeAddress) {
+        this.consigneeAddress = consigneeAddress;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TIntegralOrder{" +
+        "id=" + id +
+        ", insertTime=" + insertTime +
+        ", userId=" + userId +
+        ", goodsId=" + goodsId +
+        ", num=" + num +
+        ", consigneeName=" + consigneeName +
+        ", consigneePhone=" + consigneePhone +
+        ", consigneeAddress=" + consigneeAddress +
+        ", remark=" + remark +
+        ", state=" + state +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TInvoice.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TInvoice.java
new file mode 100644
index 0000000..89ec877
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TInvoice.java
@@ -0,0 +1,212 @@
+package com.stylefeng.guns.modular.system.model;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 发票
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_invoice")
+public class TInvoice extends Model<TInvoice> {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    /**
+     * 开票金额
+     */
+    private Double money;
+    /**
+     * 开票订单数量
+     */
+    private Integer orderNum;
+    /**
+     * 开票类型(1=个人发票,2=单位发票)
+     */
+    private Integer type;
+    /**
+     * 抬头名称(公司名称/个人姓名)
+     */
+    private String name;
+    /**
+     * 税号
+     */
+    private String code;
+    /**
+     * 发票内容
+     */
+    private String content;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 地址+电话
+     */
+    private String address;
+    /**
+     * 开户行+账号
+     */
+    private String bank;
+    /**
+     * 邮箱
+     */
+    private String email;
+    /**
+     * 开票用户id
+     */
+    private Integer userId;
+    /**
+     * 状态(1=待开票,2=成功,3=失败)
+     */
+    private Integer state;
+    /**
+     * 申请时间
+     */
+    private Date insertTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getBank() {
+        return bank;
+    }
+
+    public void setBank(String bank) {
+        this.bank = bank;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TInvoice{" +
+        "id=" + id +
+        ", money=" + money +
+        ", orderNum=" + orderNum +
+        ", type=" + type +
+        ", name=" + name +
+        ", code=" + code +
+        ", content=" + content +
+        ", remark=" + remark +
+        ", address=" + address +
+        ", bank=" + bank +
+        ", email=" + email +
+        ", userId=" + userId +
+        ", state=" + state +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLine.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLine.java
new file mode 100644
index 0000000..f443a19
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLine.java
@@ -0,0 +1,125 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 跨城线路
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-15
+ */
+@TableName("t_line")
+public class TLine extends Model<TLine> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 线路名称
+     */
+    private String name;
+    /**
+     * 排班申请间隔(分钟)
+     */
+    private Integer shiftInterval;
+    /**
+     * 抽成比例(80)
+     */
+    private Integer rakeRate;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 创建者ID
+     */
+    private Integer insertUserId;
+
+    public Integer getInsertUserId() {
+        return insertUserId;
+    }
+
+    public void setInsertUserId(Integer insertUserId) {
+        this.insertUserId = insertUserId;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getShiftInterval() {
+        return shiftInterval;
+    }
+
+    public void setShiftInterval(Integer shiftInterval) {
+        this.shiftInterval = shiftInterval;
+    }
+
+    public Integer getRakeRate() {
+        return rakeRate;
+    }
+
+    public void setRakeRate(Integer rakeRate) {
+        this.rakeRate = rakeRate;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TLine{" +
+        "id=" + id +
+        ", name=" + name +
+        ", shiftInterval=" + shiftInterval +
+        ", rakeRate=" + rakeRate +
+        ", state=" + state +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineCompany.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineCompany.java
new file mode 100644
index 0000000..414cb76
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineCompany.java
@@ -0,0 +1,101 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 企业-线路关系表
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@TableName("t_line_company")
+public class TLineCompany extends Model<TLineCompany> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 线路ID
+     */
+    private Integer lineId;
+    /**
+     * 企业ID
+     */
+    private Integer companyId;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 添加用户ID
+     */
+    private Integer insertUserId;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getInsertUserId() {
+        return insertUserId;
+    }
+
+    public void setInsertUserId(Integer insertUserId) {
+        this.insertUserId = insertUserId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TLineCompany{" +
+        "id=" + id +
+        ", lineId=" + lineId +
+        ", companyId=" + companyId +
+        ", insertTime=" + insertTime +
+        ", insertUserId=" + insertUserId +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLinePrice.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLinePrice.java
new file mode 100644
index 0000000..50d6bc9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLinePrice.java
@@ -0,0 +1,151 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 跨城线路价格规则
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@TableName("t_line_price")
+public class TLinePrice extends Model<TLinePrice> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 线路id
+     */
+    private Integer lineId;
+    /**
+     * 服务车型id
+     */
+    private Integer serverCarModelId;
+    /**
+     * 价格类型(1=固定金额,2=浮动金额)
+     */
+    private Integer type;
+    /**
+     * 价格规则json对象字符串{“num1”:1,"num2":1.3}
+     */
+    private String content;
+    /**
+     * 封装内容【后台使用】
+     */
+    private String contentStr;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 添加时间【后端使用】
+     */
+    private String addTime;
+
+    public String getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(String addTime) {
+        this.addTime = addTime;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getContentStr() {
+        return contentStr;
+    }
+
+    public void setContentStr(String contentStr) {
+        this.contentStr = contentStr;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TLinePrice{" +
+        "id=" + id +
+        ", lineId=" + lineId +
+        ", serverCarModelId=" + serverCarModelId +
+        ", type=" + type +
+        ", content=" + content +
+        ", contentStr=" + contentStr +
+        ", state=" + state +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineShift.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineShift.java
new file mode 100644
index 0000000..f0e9da4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineShift.java
@@ -0,0 +1,138 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 线路班次
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@TableName("t_line_shift")
+public class TLineShift extends Model<TLineShift> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 线路id
+     */
+    private Integer lineId;
+    /**
+     * 开始时间段(12:00)
+     */
+    private String startTime;
+    /**
+     * 结束时间段(14:00)
+     */
+    private String endTime;
+    /**
+     * 车次数
+     */
+    private Integer carNum;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 添加时间【后端使用】
+     */
+    private String addTime;
+
+    public String getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(String addTime) {
+        this.addTime = addTime;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getCarNum() {
+        return carNum;
+    }
+
+    public void setCarNum(Integer carNum) {
+        this.carNum = carNum;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TLineShift{" +
+        "id=" + id +
+        ", lineId=" + lineId +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        ", carNum=" + carNum +
+        ", state=" + state +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineSite.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineSite.java
new file mode 100644
index 0000000..7ee09d5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLineSite.java
@@ -0,0 +1,87 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 线路-站点关系表
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@TableName("t_line_site")
+public class TLineSite extends Model<TLineSite> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 线路id
+     */
+    private Integer lineId;
+    /**
+     * 站点id
+     */
+    private Integer siteId;
+    /**
+     * 类型(1=起点,2=终点)
+     */
+    private Integer type;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Integer getSiteId() {
+        return siteId;
+    }
+
+    public void setSiteId(Integer siteId) {
+        this.siteId = siteId;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TLineSite{" +
+        "id=" + id +
+        ", lineId=" + lineId +
+        ", siteId=" + siteId +
+        ", type=" + type +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLocation.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLocation.java
new file mode 100644
index 0000000..26498b7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TLocation.java
@@ -0,0 +1,243 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 地点
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-04
+ */
+@TableName("t_location")
+public class TLocation extends Model<TLocation> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 站点id
+     */
+    private Integer siteId;
+    /**
+     * 区域名称
+     */
+    private String name;
+    /**
+     * 地点类型(1=行政区域,2=电子围栏)
+     */
+    private Integer type;
+    /**
+     * 省名称
+     */
+    private String province;
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市名称
+     */
+    private String city;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 区县名称
+     */
+    private String district;
+    /**
+     * 区县编号
+     */
+    private String districtCode;
+    /**
+     * 电子围栏坐标,多组以下划线分隔;
+     */
+    private String coordinate;
+    /**
+     * 电子围栏gid,多组以下划线分隔
+     */
+    private String gid;
+    /**
+     * 电子围栏更新时间
+     */
+    private Date updateTime;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 添加时间【后端使用】
+     */
+    private String addTime;
+
+    public String getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(String addTime) {
+        this.addTime = addTime;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getSiteId() {
+        return siteId;
+    }
+
+    public void setSiteId(Integer siteId) {
+        this.siteId = siteId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getProvinceCode() {
+        return provinceCode;
+    }
+
+    public void setProvinceCode(String provinceCode) {
+        this.provinceCode = provinceCode;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getCityCode() {
+        return cityCode;
+    }
+
+    public void setCityCode(String cityCode) {
+        this.cityCode = cityCode;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public String getDistrictCode() {
+        return districtCode;
+    }
+
+    public void setDistrictCode(String districtCode) {
+        this.districtCode = districtCode;
+    }
+
+    public String getCoordinate() {
+        return coordinate;
+    }
+
+    public void setCoordinate(String coordinate) {
+        this.coordinate = coordinate;
+    }
+
+    public String getGid() {
+        return gid;
+    }
+
+    public void setGid(String gid) {
+        this.gid = gid;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TLocation{" +
+                "id=" + id +
+                ", siteId=" + siteId +
+                ", name='" + name + '\'' +
+                ", type=" + type +
+                ", province='" + province + '\'' +
+                ", provinceCode='" + provinceCode + '\'' +
+                ", city='" + city + '\'' +
+                ", cityCode='" + cityCode + '\'' +
+                ", district='" + district + '\'' +
+                ", districtCode='" + districtCode + '\'' +
+                ", coordinate='" + coordinate + '\'' +
+                ", gid='" + gid + '\'' +
+                ", updateTime=" + updateTime +
+                ", state=" + state +
+                ", insertTime=" + insertTime +
+                ", addTime='" + addTime + '\'' +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TNotices.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TNotices.java
new file mode 100644
index 0000000..2efcc96
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TNotices.java
@@ -0,0 +1,228 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 发布公告和滚动消息
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+@TableName("t_notices")
+public class TNotices extends Model<TNotices> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 标题
+     */
+    private String title;
+    /**
+     * 内容
+     */
+    private String content;
+    /**
+     * 排序
+     */
+    private Integer sort;
+    /**
+     * 是否显示/发布(1=是,2=否)
+     */
+    private Integer isShow;
+    /**
+     * 是否播报(1=是,2=否)
+     */
+    private Integer isBroadcast;
+    /**
+     * 公告类型(1=滚动消息,2=公告)
+     */
+    private Integer type;
+    /**
+     * 图片路径
+     */
+    private String imgUrl;
+    /**
+     * 1:创建,2:修改,3:删除
+     */
+    private String flag;
+    private Date insertTime;
+    private Integer insertUser;
+    private Date updateTime;
+    private Integer updateUser;
+    /**
+     * 是否删除 1=否 2=是
+     */
+    private Integer isDelete;
+    /**
+     * 是否发布用户 1=否  2=是
+     */
+    private Integer isUser;
+    /**
+     * 是否发布司机  1=否  2=是
+     */
+    private Integer isDriver;
+
+    public Integer getIsUser() {
+        return isUser;
+    }
+
+    public void setIsUser(Integer isUser) {
+        this.isUser = isUser;
+    }
+
+    public Integer getIsDriver() {
+        return isDriver;
+    }
+
+    public void setIsDriver(Integer isDriver) {
+        this.isDriver = isDriver;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public Integer getIsShow() {
+        return isShow;
+    }
+
+    public void setIsShow(Integer isShow) {
+        this.isShow = isShow;
+    }
+
+    public Integer getIsBroadcast() {
+        return isBroadcast;
+    }
+
+    public void setIsBroadcast(Integer isBroadcast) {
+        this.isBroadcast = isBroadcast;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public String getFlag() {
+        return flag;
+    }
+
+    public void setFlag(String flag) {
+        this.flag = flag;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getInsertUser() {
+        return insertUser;
+    }
+
+    public void setInsertUser(Integer insertUser) {
+        this.insertUser = insertUser;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getUpdateUser() {
+        return updateUser;
+    }
+
+    public void setUpdateUser(Integer updateUser) {
+        this.updateUser = updateUser;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TNotices{" +
+        "id=" + id +
+        ", title=" + title +
+        ", content=" + content +
+        ", sort=" + sort +
+        ", isShow=" + isShow +
+        ", isBroadcast=" + isBroadcast +
+        ", type=" + type +
+        ", imgUrl=" + imgUrl +
+        ", flag=" + flag +
+        ", insertTime=" + insertTime +
+        ", insertUser=" + insertUser +
+        ", updateTime=" + updateTime +
+        ", updateUser=" + updateUser +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCity.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCity.java
new file mode 100644
index 0000000..674f3fe
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCity.java
@@ -0,0 +1,219 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 开通城市表
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+@TableName("t_open_city")
+public class TOpenCity extends Model<TOpenCity> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 城市code(6位)
+     */
+    private String code;
+    /**
+     * 经度
+     */
+    private Double lon;
+    /**
+     * 纬度
+     */
+    private Double lat;
+    /**
+     * 是否需要网约车资格(1=是,2=否)
+     */
+    private Integer isQualifications;
+    /**
+     * 省份名称
+     */
+    private Integer areaId;
+    private String areaName;
+    /**
+     * 市名称
+     */
+    private Integer cityId;
+    private String cityName;
+    /**
+     * 区县名称
+     */
+    private Integer provinceId;
+    private String provinceName;
+    /**
+     * 1:创建,2:修改,3:删除
+     */
+    private String flag;
+    private Date insertTime;
+    private Integer insertUser;
+    private Date updateTime;
+    private Integer updateUser;
+
+    public Integer getAreaId() {
+        return areaId;
+    }
+
+    public void setAreaId(Integer areaId) {
+        this.areaId = areaId;
+    }
+
+    public Integer getCityId() {
+        return cityId;
+    }
+
+    public void setCityId(Integer cityId) {
+        this.cityId = cityId;
+    }
+
+    public Integer getProvinceId() {
+        return provinceId;
+    }
+
+    public void setProvinceId(Integer provinceId) {
+        this.provinceId = provinceId;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Double getLon() {
+        return lon;
+    }
+
+    public void setLon(Double lon) {
+        this.lon = lon;
+    }
+
+    public Double getLat() {
+        return lat;
+    }
+
+    public void setLat(Double lat) {
+        this.lat = lat;
+    }
+
+    public Integer getIsQualifications() {
+        return isQualifications;
+    }
+
+    public void setIsQualifications(Integer isQualifications) {
+        this.isQualifications = isQualifications;
+    }
+
+    public String getAreaName() {
+        return areaName;
+    }
+
+    public void setAreaName(String areaName) {
+        this.areaName = areaName;
+    }
+
+    public String getCityName() {
+        return cityName;
+    }
+
+    public void setCityName(String cityName) {
+        this.cityName = cityName;
+    }
+
+    public String getProvinceName() {
+        return provinceName;
+    }
+
+    public void setProvinceName(String provinceName) {
+        this.provinceName = provinceName;
+    }
+
+    public String getFlag() {
+        return flag;
+    }
+
+    public void setFlag(String flag) {
+        this.flag = flag;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getInsertUser() {
+        return insertUser;
+    }
+
+    public void setInsertUser(Integer insertUser) {
+        this.insertUser = insertUser;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getUpdateUser() {
+        return updateUser;
+    }
+
+    public void setUpdateUser(Integer updateUser) {
+        this.updateUser = updateUser;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TOpenCity{" +
+        "id=" + id +
+        ", code=" + code +
+        ", lon=" + lon +
+        ", lat=" + lat +
+        ", isQualifications=" + isQualifications +
+        ", areaName=" + areaName +
+        ", cityName=" + cityName +
+        ", provinceName=" + provinceName +
+        ", flag=" + flag +
+        ", insertTime=" + insertTime +
+        ", insertUser=" + insertUser +
+        ", updateTime=" + updateTime +
+        ", updateUser=" + updateUser +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCityBusiness.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCityBusiness.java
new file mode 100644
index 0000000..ca775f8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCityBusiness.java
@@ -0,0 +1,141 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 开通城市经营业务
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+@TableName("t_open_city_business")
+public class TOpenCityBusiness extends Model<TOpenCityBusiness> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 开通城市id
+     */
+    private Integer openCityId;
+    /**
+     * 业务类型(1=专车,2=出租车,3=跨城出行,4=同城小件物流,5=跨城小件物流,6=包车)
+     */
+    private Integer businessType;
+    /**
+     * 排序
+     */
+    private Integer sort;
+    /**
+     * 1:创建,2:修改,3:删除
+     */
+    private String flag;
+    private Date insertTime;
+    private Integer insertUser;
+    private Date updateTime;
+    private Integer updateUser;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOpenCityId() {
+        return openCityId;
+    }
+
+    public void setOpenCityId(Integer openCityId) {
+        this.openCityId = openCityId;
+    }
+
+    public Integer getBusinessType() {
+        return businessType;
+    }
+
+    public void setBusinessType(Integer businessType) {
+        this.businessType = businessType;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public String getFlag() {
+        return flag;
+    }
+
+    public void setFlag(String flag) {
+        this.flag = flag;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getInsertUser() {
+        return insertUser;
+    }
+
+    public void setInsertUser(Integer insertUser) {
+        this.insertUser = insertUser;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getUpdateUser() {
+        return updateUser;
+    }
+
+    public void setUpdateUser(Integer updateUser) {
+        this.updateUser = updateUser;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TOpenCityBusiness{" +
+        "id=" + id +
+        ", openCityId=" + openCityId +
+        ", businessType=" + businessType +
+        ", sort=" + sort +
+        ", flag=" + flag +
+        ", insertTime=" + insertTime +
+        ", insertUser=" + insertUser +
+        ", updateTime=" + updateTime +
+        ", updateUser=" + updateUser +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCharter.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCharter.java
new file mode 100644
index 0000000..f6fdf74
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCharter.java
@@ -0,0 +1,166 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 包车订单
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+@TableName("t_order_charter")
+public class TOrderCharter extends Model<TOrderCharter> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 提交时间
+     */
+    private Date insertTime;
+    /**
+     * 用户ID
+     */
+    private Integer userId;
+    /**
+     * 用车时间
+     */
+    private Date useTime;
+    /**
+     * 用车时长
+     */
+    private String useDuration;
+    /**
+     * 用车需求
+     */
+    private String useDemand;
+    /**
+     * 联系人
+     */
+    private String contactName;
+    /**
+     * 联系电话
+     */
+    private String contactPhone;
+    /**
+     * 处理备注
+     */
+    private String remark;
+    /**
+     * 状态 1=未处理  2=已处理  3=已删除
+     */
+    private Integer state;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getUseTime() {
+        return useTime;
+    }
+
+    public void setUseTime(Date useTime) {
+        this.useTime = useTime;
+    }
+
+    public String getUseDuration() {
+        return useDuration;
+    }
+
+    public void setUseDuration(String useDuration) {
+        this.useDuration = useDuration;
+    }
+
+    public String getUseDemand() {
+        return useDemand;
+    }
+
+    public void setUseDemand(String useDemand) {
+        this.useDemand = useDemand;
+    }
+
+    public String getContactName() {
+        return contactName;
+    }
+
+    public void setContactName(String contactName) {
+        this.contactName = contactName;
+    }
+
+    public String getContactPhone() {
+        return contactPhone;
+    }
+
+    public void setContactPhone(String contactPhone) {
+        this.contactPhone = contactPhone;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TOrderCharter{" +
+        "id=" + id +
+        ", insertTime=" + insertTime +
+        ", userId=" + userId +
+        ", useTime=" + useTime +
+        ", useDuration=" + useDuration +
+        ", useDemand=" + useDemand +
+        ", contactName=" + contactName +
+        ", contactPhone=" + contactPhone +
+        ", remark=" + remark +
+        ", state=" + state +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCharteredCar.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCharteredCar.java
new file mode 100644
index 0000000..2ff78a0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCharteredCar.java
@@ -0,0 +1,225 @@
+package com.stylefeng.guns.modular.system.model;
+
+import java.util.Date;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 订单-包车
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-24
+ */
+@TableName("t_order_chartered_car")
+public class TOrderCharteredCar extends Model<TOrderCharteredCar> {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 企业id
+     */
+    private Integer companyId;
+    /**
+     * 订单编号
+     */
+    private String orderNumber;
+    /**
+     * 出行时间
+     */
+    private Date traveltime;
+    /**
+     * 用车时长(天)
+     */
+    private Integer carTime;
+    /**
+     * 服务车型id
+     */
+    private Integer serverCarModelId;
+    /**
+     * 车型用途
+     */
+    private String modelUse;
+    /**
+     * 乘车人数
+     */
+    private Integer peopleNumber;
+    /**
+     * 联系人
+     */
+    private String contactPerson;
+    /**
+     * 联系电话
+     */
+    private String contactPhone;
+    /**
+     * 订单状态(1=待处理,2=已处理)
+     */
+    private Integer state;
+    /**
+     * 处理备注
+     */
+    private String remark;
+    /**
+     * 删除状态(1=否,2=是)
+     */
+    private Integer isDelete;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getOrderNumber() {
+        return orderNumber;
+    }
+
+    public void setOrderNumber(String orderNumber) {
+        this.orderNumber = orderNumber;
+    }
+
+    public Date getTraveltime() {
+        return traveltime;
+    }
+
+    public void setTraveltime(Date traveltime) {
+        this.traveltime = traveltime;
+    }
+
+    public Integer getCarTime() {
+        return carTime;
+    }
+
+    public void setCarTime(Integer carTime) {
+        this.carTime = carTime;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public String getModelUse() {
+        return modelUse;
+    }
+
+    public void setModelUse(String modelUse) {
+        this.modelUse = modelUse;
+    }
+
+    public Integer getPeopleNumber() {
+        return peopleNumber;
+    }
+
+    public void setPeopleNumber(Integer peopleNumber) {
+        this.peopleNumber = peopleNumber;
+    }
+
+    public String getContactPerson() {
+        return contactPerson;
+    }
+
+    public void setContactPerson(String contactPerson) {
+        this.contactPerson = contactPerson;
+    }
+
+    public String getContactPhone() {
+        return contactPhone;
+    }
+
+    public void setContactPhone(String contactPhone) {
+        this.contactPhone = contactPhone;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TOrderCharteredCar{" +
+        "id=" + id +
+        ", userId=" + userId +
+        ", companyId=" + companyId +
+        ", orderNumber=" + orderNumber +
+        ", traveltime=" + traveltime +
+        ", carTime=" + carTime +
+        ", serverCarModelId=" + serverCarModelId +
+        ", modelUse=" + modelUse +
+        ", peopleNumber=" + peopleNumber +
+        ", contactPerson=" + contactPerson +
+        ", contactPhone=" + contactPhone +
+        ", state=" + state +
+        ", remark=" + remark +
+        ", isDelete=" + isDelete +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java
new file mode 100644
index 0000000..6780793
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java
@@ -0,0 +1,818 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 订单-跨城
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@TableName("t_order_cross_city")
+public class TOrderCrossCity extends Model<TOrderCrossCity> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 接单司机ID
+     */
+    private Integer driverId;
+    /**
+     * 线路id
+     */
+    private Integer lineId;
+    /**
+     * 预约班次的id
+     */
+    @TableField("lineShiftDriverId")
+    private Integer lineShiftDriverId;
+    /**
+     * 车辆id
+     */
+    private Integer carId;
+    /**
+     * 服务车型id关联t_server_carmodel表
+     */
+    private Integer serverCarModelId;
+    /**
+     * 订单号
+     */
+    private String orderNum;
+    /**
+     * 下单地点经度
+     */
+    private Double placementLon;
+    /**
+     * 下单地点纬度
+     */
+    private Double placementLat;
+    /**
+     * 下单地点
+     */
+    private String placementAddress;
+    /**
+     * 出发地经度值
+     */
+    private Double startLon;
+    /**
+     * 出发地纬度值
+     */
+    private Double startLat;
+    /**
+     * 目的地经度
+     */
+    private Double endLon;
+    /**
+     * 出发地地点
+     */
+    private String startAddress;
+    /**
+     * 目的地纬度
+     */
+    private Double endLat;
+    /**
+     * 目的地地点
+     */
+    private String endAddress;
+    /**
+     * 上车点经度
+     */
+    private Double boardingLon;
+    /**
+     * 上车点纬度
+     */
+    private Double boardingLat;
+    /**
+     * 上车点
+     */
+    private String boardingAddress;
+    /**
+     * 上车时间
+     */
+    private Date boardingTime;
+    /**
+     * 下车点经度
+     */
+    private Double getoffLon;
+    /**
+     * 下车点纬度
+     */
+    private Double getoffLat;
+    /**
+     * 下车地点
+     */
+    private String getoffAddress;
+    /**
+     * 下车时间
+     */
+    private Date getoffTime;
+    /**
+     * 行驶里程数(米)
+     */
+    private Double mileage;
+    /**
+     * 支付方式(1=OK平台支付,2=其他方式支付)
+     */
+    private Integer payManner;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=其他)
+     */
+    private Integer payType;
+    /**
+     * 订单金额
+     */
+    private BigDecimal orderMoney;
+    /**
+     * 红包抵扣金额
+     */
+    private BigDecimal redPacketMoney;
+    /**
+     * 优惠券抵扣金额
+     */
+    private BigDecimal couponMoney;
+    /**
+     * 红包记录id
+     */
+    private Integer redPacketId;
+    /**
+     * 优惠券id
+     */
+    private Integer couponId;
+    /**
+     * 折扣
+     */
+    private Double discount;
+    /**
+     * 折扣优惠金额
+     */
+    private Double discountMoney;
+    /**
+     * 折扣活动id
+     */
+    private Integer activityId;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 支付金额
+     */
+    private BigDecimal payMoney;
+    /**
+     * 出行人数
+     */
+    @TableField("peopleNumber")
+    private Integer peopleNumber;
+    /**
+     * 座位编号
+     */
+    @TableField("seatNumber")
+    private String seatNumber;
+    /**
+     * 乘车人
+     */
+    private String passengers;
+    /**
+     * 乘车人电话
+     */
+    private String passengersPhone;
+    /**
+     * 排序
+     */
+    private Integer sort;
+    /**
+     * 下单时间
+     */
+    private Date insertTime;
+    /**
+     * 出行时间
+     */
+    private Date travelTime;
+    /**
+     * 抢单时间
+     */
+    private Date snatchOrderTime;
+    /**
+     * 司机点出发时间
+     */
+    private Date setOutTime;
+    /**
+     * 司机到达预约地点时间
+     */
+    private Date arriveTime;
+    /**
+     * 开始服务时间
+     */
+    private Date startServiceTime;
+    /**
+     * 结束服务时间
+     */
+    private Date endServiceTime;
+    /**
+     * 出行方式(1=拼车,2=包车)
+     */
+    private Integer travelMode;
+    /**
+     * 下单方式(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)
+     */
+    private Integer orderSource;
+    /**
+     * 发票id
+     */
+    private Integer invoiceId;
+    /**
+     * 高德猎鹰上的轨迹id
+     */
+    private String trackId;
+    /**
+     * 状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)
+     */
+    private Integer state;
+    /**
+     * 是否是改派订单(1=否,2=是)
+     */
+    private Integer isReassign;
+    /**
+     * 是否删除  1=否 2=是
+     */
+    private Integer isDelete;
+    /**
+     * 状态(改派前订单状态)
+     */
+    private Integer oldState;
+    /**
+     * 移动小号
+     */
+    private String telX;
+    /**
+     * 移动小号绑定关系id
+     */
+    private String bindId;
+
+    public Integer getOldState() {
+        return oldState;
+    }
+
+    public void setOldState(Integer oldState) {
+        this.oldState = oldState;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Integer getLineShiftDriverId() {
+        return lineShiftDriverId;
+    }
+
+    public void setLineShiftDriverId(Integer lineShiftDriverId) {
+        this.lineShiftDriverId = lineShiftDriverId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Double getPlacementLon() {
+        return placementLon;
+    }
+
+    public void setPlacementLon(Double placementLon) {
+        this.placementLon = placementLon;
+    }
+
+    public Double getPlacementLat() {
+        return placementLat;
+    }
+
+    public void setPlacementLat(Double placementLat) {
+        this.placementLat = placementLat;
+    }
+
+    public String getPlacementAddress() {
+        return placementAddress;
+    }
+
+    public void setPlacementAddress(String placementAddress) {
+        this.placementAddress = placementAddress;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public Double getBoardingLon() {
+        return boardingLon;
+    }
+
+    public void setBoardingLon(Double boardingLon) {
+        this.boardingLon = boardingLon;
+    }
+
+    public Double getBoardingLat() {
+        return boardingLat;
+    }
+
+    public void setBoardingLat(Double boardingLat) {
+        this.boardingLat = boardingLat;
+    }
+
+    public String getBoardingAddress() {
+        return boardingAddress;
+    }
+
+    public void setBoardingAddress(String boardingAddress) {
+        this.boardingAddress = boardingAddress;
+    }
+
+    public Date getBoardingTime() {
+        return boardingTime;
+    }
+
+    public void setBoardingTime(Date boardingTime) {
+        this.boardingTime = boardingTime;
+    }
+
+    public Double getGetoffLon() {
+        return getoffLon;
+    }
+
+    public void setGetoffLon(Double getoffLon) {
+        this.getoffLon = getoffLon;
+    }
+
+    public Double getGetoffLat() {
+        return getoffLat;
+    }
+
+    public void setGetoffLat(Double getoffLat) {
+        this.getoffLat = getoffLat;
+    }
+
+    public String getGetoffAddress() {
+        return getoffAddress;
+    }
+
+    public void setGetoffAddress(String getoffAddress) {
+        this.getoffAddress = getoffAddress;
+    }
+
+    public Date getGetoffTime() {
+        return getoffTime;
+    }
+
+    public void setGetoffTime(Date getoffTime) {
+        this.getoffTime = getoffTime;
+    }
+
+    public Double getMileage() {
+        return mileage;
+    }
+
+    public void setMileage(Double mileage) {
+        this.mileage = mileage;
+    }
+
+    public Integer getPayManner() {
+        return payManner;
+    }
+
+    public void setPayManner(Integer payManner) {
+        this.payManner = payManner;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public BigDecimal getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(BigDecimal orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public BigDecimal getRedPacketMoney() {
+        return redPacketMoney;
+    }
+
+    public void setRedPacketMoney(BigDecimal redPacketMoney) {
+        this.redPacketMoney = redPacketMoney;
+    }
+
+    public BigDecimal getCouponMoney() {
+        return couponMoney;
+    }
+
+    public void setCouponMoney(BigDecimal couponMoney) {
+        this.couponMoney = couponMoney;
+    }
+
+    public Integer getRedPacketId() {
+        return redPacketId;
+    }
+
+    public void setRedPacketId(Integer redPacketId) {
+        this.redPacketId = redPacketId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
+
+    public Double getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(Double discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public BigDecimal getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(BigDecimal payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public String getPassengers() {
+        return passengers;
+    }
+
+    public void setPassengers(String passengers) {
+        this.passengers = passengers;
+    }
+
+    public String getPassengersPhone() {
+        return passengersPhone;
+    }
+
+    public void setPassengersPhone(String passengersPhone) {
+        this.passengersPhone = passengersPhone;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(Date travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    public Date getSnatchOrderTime() {
+        return snatchOrderTime;
+    }
+
+    public void setSnatchOrderTime(Date snatchOrderTime) {
+        this.snatchOrderTime = snatchOrderTime;
+    }
+
+    public Date getSetOutTime() {
+        return setOutTime;
+    }
+
+    public void setSetOutTime(Date setOutTime) {
+        this.setOutTime = setOutTime;
+    }
+
+    public Date getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(Date arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Date getStartServiceTime() {
+        return startServiceTime;
+    }
+
+    public void setStartServiceTime(Date startServiceTime) {
+        this.startServiceTime = startServiceTime;
+    }
+
+    public Date getEndServiceTime() {
+        return endServiceTime;
+    }
+
+    public void setEndServiceTime(Date endServiceTime) {
+        this.endServiceTime = endServiceTime;
+    }
+
+    public Integer getTravelMode() {
+        return travelMode;
+    }
+
+    public void setTravelMode(Integer travelMode) {
+        this.travelMode = travelMode;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+    public Integer getInvoiceId() {
+        return invoiceId;
+    }
+
+    public void setInvoiceId(Integer invoiceId) {
+        this.invoiceId = invoiceId;
+    }
+
+    public String getTrackId() {
+        return trackId;
+    }
+
+    public void setTrackId(String trackId) {
+        this.trackId = trackId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public String getTelX() {
+        return telX;
+    }
+
+    public void setTelX(String telX) {
+        this.telX = telX;
+    }
+
+    public String getBindId() {
+        return bindId;
+    }
+
+    public void setBindId(String bindId) {
+        this.bindId = bindId;
+    }
+
+    public Integer getIsReassign() {
+        return isReassign;
+    }
+
+    public void setIsReassign(Integer isReassign) {
+        this.isReassign = isReassign;
+    }
+
+    public Integer getPeopleNumber() {
+        return peopleNumber;
+    }
+
+    public void setPeopleNumber(Integer peopleNumber) {
+        this.peopleNumber = peopleNumber;
+    }
+
+    public String getSeatNumber() {
+        return seatNumber;
+    }
+
+    public void setSeatNumber(String seatNumber) {
+        this.seatNumber = seatNumber;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TOrderCrossCity{" +
+                "id=" + id +
+                ", userId=" + userId +
+                ", driverId=" + driverId +
+                ", lineId=" + lineId +
+                ", lineShiftDriverId=" + lineShiftDriverId +
+                ", carId=" + carId +
+                ", serverCarModelId=" + serverCarModelId +
+                ", orderNum='" + orderNum + '\'' +
+                ", placementLon=" + placementLon +
+                ", placementLat=" + placementLat +
+                ", placementAddress='" + placementAddress + '\'' +
+                ", startLon=" + startLon +
+                ", startLat=" + startLat +
+                ", endLon=" + endLon +
+                ", startAddress='" + startAddress + '\'' +
+                ", endLat=" + endLat +
+                ", endAddress='" + endAddress + '\'' +
+                ", boardingLon=" + boardingLon +
+                ", boardingLat=" + boardingLat +
+                ", boardingAddress='" + boardingAddress + '\'' +
+                ", boardingTime=" + boardingTime +
+                ", getoffLon=" + getoffLon +
+                ", getoffLat=" + getoffLat +
+                ", getoffAddress='" + getoffAddress + '\'' +
+                ", getoffTime=" + getoffTime +
+                ", mileage=" + mileage +
+                ", payManner=" + payManner +
+                ", payType=" + payType +
+                ", orderMoney=" + orderMoney +
+                ", redPacketMoney=" + redPacketMoney +
+                ", couponMoney=" + couponMoney +
+                ", redPacketId=" + redPacketId +
+                ", couponId=" + couponId +
+                ", discount=" + discount +
+                ", discountMoney=" + discountMoney +
+                ", activityId=" + activityId +
+                ", companyId=" + companyId +
+                ", payMoney=" + payMoney +
+                ", passengers='" + passengers + '\'' +
+                ", passengersPhone='" + passengersPhone + '\'' +
+                ", sort=" + sort +
+                ", insertTime=" + insertTime +
+                ", travelTime=" + travelTime +
+                ", snatchOrderTime=" + snatchOrderTime +
+                ", setOutTime=" + setOutTime +
+                ", arriveTime=" + arriveTime +
+                ", startServiceTime=" + startServiceTime +
+                ", endServiceTime=" + endServiceTime +
+                ", travelMode=" + travelMode +
+                ", orderSource=" + orderSource +
+                ", invoiceId=" + invoiceId +
+                ", trackId='" + trackId + '\'' +
+                ", state=" + state +
+                ", isReassign=" + isReassign +
+                ", isDelete=" + isDelete +
+                ", oldState=" + oldState +
+                ", telX='" + telX + '\'' +
+                ", bindId='" + bindId + '\'' +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderEvaluate.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderEvaluate.java
new file mode 100644
index 0000000..e243760
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderEvaluate.java
@@ -0,0 +1,137 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 订单评价
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_order_evaluate")
+public class TOrderEvaluate extends Model<TOrderEvaluate> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+    /**
+     * 司机id
+     */
+    private Integer driverId;
+    /**
+     * 1=专车,2=出租车,3=跨城出行,4=同城小件物流,5=跨城小件物流,6=包车
+     */
+    private Integer orderType;
+    /**
+     * 评分  0-5
+     */
+    private Double fraction;
+    /**
+     * 评价内容
+     */
+    private String content;
+    /**
+     * 评价时间
+     */
+    private Date insertTime;
+    /**
+     * 评价用户ID
+     */
+    private Integer userId;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Double getFraction() {
+        return fraction;
+    }
+
+    public void setFraction(Double fraction) {
+        this.fraction = fraction;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TOrderEvaluate{" +
+        "id=" + id +
+        ", orderId=" + orderId +
+        ", driverId=" + driverId +
+        ", orderType=" + orderType +
+        ", fraction=" + fraction +
+        ", content=" + content +
+        ", insertTime=" + insertTime +
+        ", userId=" + userId +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java
new file mode 100644
index 0000000..27b0be7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java
@@ -0,0 +1,789 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 订单-小件物流
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-24
+ */
+@TableName("t_order_logistics")
+public class TOrderLogistics extends Model<TOrderLogistics> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 订单类型(4=同城物流,5=跨城物流)
+     */
+    private Integer type;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 接单司机ID
+     */
+    private Integer driverId;
+    /**
+     * 车辆id
+     */
+    private Integer carId;
+    /**
+     * 订单号
+     */
+    private String orderNum;
+    /**
+     * 货物类型(1=普通货物,2=贵重货物)
+     */
+    private Integer cargoType;
+    /**
+     * 货物数量
+     */
+    private Integer cargoNumber;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 下单地点经度
+     */
+    private Double placementLon;
+    /**
+     * 下单地点纬度
+     */
+    private Double placementLat;
+    /**
+     * 下单地点
+     */
+    private String placementAddress;
+    /**
+     * 出发地经度值
+     */
+    private Double startLon;
+    /**
+     * 出发地纬度值
+     */
+    private Double startLat;
+    /**
+     * 出发地地点
+     */
+    private String startAddress;
+    /**
+     * 目的地经度
+     */
+    private Double endLon;
+    /**
+     * 目的地纬度
+     */
+    private Double endLat;
+    /**
+     * 目的地地点
+     */
+    private String endAddress;
+    /**
+     * 收件人姓名
+     */
+    private String recipient;
+    /**
+     * 收件人电话
+     */
+    private String recipientPhone;
+    /**
+     * 上车点经度
+     */
+    private Double boardingLon;
+    /**
+     * 上车点纬度
+     */
+    private Double boardingLat;
+    /**
+     * 上车点
+     */
+    private String boardingAddress;
+    /**
+     * 上车时间
+     */
+    private Date boardingTime;
+    /**
+     * 下车点经度
+     */
+    private Double getoffLon;
+    /**
+     * 下车点纬度
+     */
+    private Double getoffLat;
+    /**
+     * 下车地点
+     */
+    private String getoffAddress;
+    /**
+     * 下车时间
+     */
+    private Date getoffTime;
+    /**
+     * 行驶里程数(米)
+     */
+    private Double mileage;
+    /**
+     * 支付方式(1=OK平台支付,2=其他方式支付)
+     */
+    private Integer payManner;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=其他)
+     */
+    private Integer payType;
+    /**
+     * 订单金额
+     */
+    private BigDecimal orderMoney;
+    /**
+     * 行程费
+     */
+    private BigDecimal travelMoney;
+    /**
+     * 小费
+     */
+    private BigDecimal tipMoney;
+    /**
+     * 红包抵扣金额
+     */
+    private BigDecimal redPacketMoney;
+    /**
+     * 优惠券抵扣金额
+     */
+    private BigDecimal couponMoney;
+    /**
+     * 红包记录id
+     */
+    private Integer redPacketId;
+    /**
+     * 优惠券id
+     */
+    private Integer couponId;
+    /**
+     * 折扣
+     */
+    private Double discount;
+    /**
+     * 折扣优惠金额
+     */
+    private Double discountMoney;
+    /**
+     * 折扣活动id
+     */
+    private Integer activityId;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 支付金额
+     */
+    private BigDecimal payMoney;
+    /**
+     * 状态(1=待接单,2=待出发,3=待到达预约地点,4=待取货,5=服务中,6=完成服务,7=待支付,9=已完成,10=已取消)
+     */
+    private Integer state;
+    /**
+     * 下单时间
+     */
+    private Date insertTime;
+    /**
+     * 出行时间
+     */
+    private Date travelTime;
+    /**
+     * 抢单时间
+     */
+    private Date snatchOrderTime;
+    /**
+     * 司机点出发时间
+     */
+    private Date setOutTime;
+    /**
+     * 司机到达预约地点时间
+     */
+    private Date arriveTime;
+    /**
+     * 开始服务时间
+     */
+    private Date startServiceTime;
+    /**
+     * 结束服务时间
+     */
+    private Date endServiceTime;
+    /**
+     * 下单方式(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)
+     */
+    private Integer orderSource;
+    /**
+     * 发票id
+     */
+    private Integer invoiceId;
+    /**
+     * 高德猎鹰上的轨迹id
+     */
+    private String trackId;
+    /**
+     * 是否删除  1=否 2=是
+     */
+    private Integer isDelete;
+    /**
+     * 改派之前的订单状态
+     */
+    private Integer oldState;
+    /**
+     * 移动小号
+     */
+    private String telX;
+    /**
+     * 移动小号绑定关系id
+     */
+    private String bindId;
+
+    public Integer getOldState() {
+        return oldState;
+    }
+
+    public void setOldState(Integer oldState) {
+        this.oldState = oldState;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Integer getCargoType() {
+        return cargoType;
+    }
+
+    public void setCargoType(Integer cargoType) {
+        this.cargoType = cargoType;
+    }
+
+    public Integer getCargoNumber() {
+        return cargoNumber;
+    }
+
+    public void setCargoNumber(Integer cargoNumber) {
+        this.cargoNumber = cargoNumber;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Double getPlacementLon() {
+        return placementLon;
+    }
+
+    public void setPlacementLon(Double placementLon) {
+        this.placementLon = placementLon;
+    }
+
+    public Double getPlacementLat() {
+        return placementLat;
+    }
+
+    public void setPlacementLat(Double placementLat) {
+        this.placementLat = placementLat;
+    }
+
+    public String getPlacementAddress() {
+        return placementAddress;
+    }
+
+    public void setPlacementAddress(String placementAddress) {
+        this.placementAddress = placementAddress;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public String getRecipient() {
+        return recipient;
+    }
+
+    public void setRecipient(String recipient) {
+        this.recipient = recipient;
+    }
+
+    public String getRecipientPhone() {
+        return recipientPhone;
+    }
+
+    public void setRecipientPhone(String recipientPhone) {
+        this.recipientPhone = recipientPhone;
+    }
+
+    public Double getBoardingLon() {
+        return boardingLon;
+    }
+
+    public void setBoardingLon(Double boardingLon) {
+        this.boardingLon = boardingLon;
+    }
+
+    public Double getBoardingLat() {
+        return boardingLat;
+    }
+
+    public void setBoardingLat(Double boardingLat) {
+        this.boardingLat = boardingLat;
+    }
+
+    public String getBoardingAddress() {
+        return boardingAddress;
+    }
+
+    public void setBoardingAddress(String boardingAddress) {
+        this.boardingAddress = boardingAddress;
+    }
+
+    public Date getBoardingTime() {
+        return boardingTime;
+    }
+
+    public void setBoardingTime(Date boardingTime) {
+        this.boardingTime = boardingTime;
+    }
+
+    public Double getGetoffLon() {
+        return getoffLon;
+    }
+
+    public void setGetoffLon(Double getoffLon) {
+        this.getoffLon = getoffLon;
+    }
+
+    public Double getGetoffLat() {
+        return getoffLat;
+    }
+
+    public void setGetoffLat(Double getoffLat) {
+        this.getoffLat = getoffLat;
+    }
+
+    public String getGetoffAddress() {
+        return getoffAddress;
+    }
+
+    public void setGetoffAddress(String getoffAddress) {
+        this.getoffAddress = getoffAddress;
+    }
+
+    public Date getGetoffTime() {
+        return getoffTime;
+    }
+
+    public void setGetoffTime(Date getoffTime) {
+        this.getoffTime = getoffTime;
+    }
+
+    public Double getMileage() {
+        return mileage;
+    }
+
+    public void setMileage(Double mileage) {
+        this.mileage = mileage;
+    }
+
+    public Integer getPayManner() {
+        return payManner;
+    }
+
+    public void setPayManner(Integer payManner) {
+        this.payManner = payManner;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public BigDecimal getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(BigDecimal orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public BigDecimal getTravelMoney() {
+        return travelMoney;
+    }
+
+    public void setTravelMoney(BigDecimal travelMoney) {
+        this.travelMoney = travelMoney;
+    }
+
+    public BigDecimal getTipMoney() {
+        return tipMoney;
+    }
+
+    public void setTipMoney(BigDecimal tipMoney) {
+        this.tipMoney = tipMoney;
+    }
+
+    public BigDecimal getRedPacketMoney() {
+        return redPacketMoney;
+    }
+
+    public void setRedPacketMoney(BigDecimal redPacketMoney) {
+        this.redPacketMoney = redPacketMoney;
+    }
+
+    public BigDecimal getCouponMoney() {
+        return couponMoney;
+    }
+
+    public void setCouponMoney(BigDecimal couponMoney) {
+        this.couponMoney = couponMoney;
+    }
+
+    public Integer getRedPacketId() {
+        return redPacketId;
+    }
+
+    public void setRedPacketId(Integer redPacketId) {
+        this.redPacketId = redPacketId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
+
+    public Double getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(Double discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public BigDecimal getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(BigDecimal payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(Date travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    public Date getSnatchOrderTime() {
+        return snatchOrderTime;
+    }
+
+    public void setSnatchOrderTime(Date snatchOrderTime) {
+        this.snatchOrderTime = snatchOrderTime;
+    }
+
+    public Date getSetOutTime() {
+        return setOutTime;
+    }
+
+    public void setSetOutTime(Date setOutTime) {
+        this.setOutTime = setOutTime;
+    }
+
+    public Date getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(Date arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Date getStartServiceTime() {
+        return startServiceTime;
+    }
+
+    public void setStartServiceTime(Date startServiceTime) {
+        this.startServiceTime = startServiceTime;
+    }
+
+    public Date getEndServiceTime() {
+        return endServiceTime;
+    }
+
+    public void setEndServiceTime(Date endServiceTime) {
+        this.endServiceTime = endServiceTime;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+    public Integer getInvoiceId() {
+        return invoiceId;
+    }
+
+    public void setInvoiceId(Integer invoiceId) {
+        this.invoiceId = invoiceId;
+    }
+
+    public String getTrackId() {
+        return trackId;
+    }
+
+    public void setTrackId(String trackId) {
+        this.trackId = trackId;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public String getTelX() {
+        return telX;
+    }
+
+    public void setTelX(String telX) {
+        this.telX = telX;
+    }
+
+    public String getBindId() {
+        return bindId;
+    }
+
+    public void setBindId(String bindId) {
+        this.bindId = bindId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TOrderLogistics{" +
+        "id=" + id +
+        ", type=" + type +
+        ", userId=" + userId +
+        ", driverId=" + driverId +
+        ", carId=" + carId +
+        ", orderNum=" + orderNum +
+        ", cargoType=" + cargoType +
+        ", cargoNumber=" + cargoNumber +
+        ", remark=" + remark +
+        ", placementLon=" + placementLon +
+        ", placementLat=" + placementLat +
+        ", placementAddress=" + placementAddress +
+        ", startLon=" + startLon +
+        ", startLat=" + startLat +
+        ", startAddress=" + startAddress +
+        ", endLon=" + endLon +
+        ", endLat=" + endLat +
+        ", endAddress=" + endAddress +
+        ", recipient=" + recipient +
+        ", recipientPhone=" + recipientPhone +
+        ", boardingLon=" + boardingLon +
+        ", boardingLat=" + boardingLat +
+        ", boardingAddress=" + boardingAddress +
+        ", boardingTime=" + boardingTime +
+        ", getoffLon=" + getoffLon +
+        ", getoffLat=" + getoffLat +
+        ", getoffAddress=" + getoffAddress +
+        ", getoffTime=" + getoffTime +
+        ", mileage=" + mileage +
+        ", payManner=" + payManner +
+        ", payType=" + payType +
+        ", orderMoney=" + orderMoney +
+        ", travelMoney=" + travelMoney +
+        ", tipMoney=" + tipMoney +
+        ", redPacketMoney=" + redPacketMoney +
+        ", couponMoney=" + couponMoney +
+        ", redPacketId=" + redPacketId +
+        ", couponId=" + couponId +
+        ", discount=" + discount +
+        ", discountMoney=" + discountMoney +
+        ", activityId=" + activityId +
+        ", companyId=" + companyId +
+        ", payMoney=" + payMoney +
+        ", state=" + state +
+        ", insertTime=" + insertTime +
+        ", travelTime=" + travelTime +
+        ", snatchOrderTime=" + snatchOrderTime +
+        ", setOutTime=" + setOutTime +
+        ", arriveTime=" + arriveTime +
+        ", startServiceTime=" + startServiceTime +
+        ", endServiceTime=" + endServiceTime +
+        ", orderSource=" + orderSource +
+        ", invoiceId=" + invoiceId +
+        ", trackId=" + trackId +
+        ", isDelete=" + isDelete +
+        ", telX=" + telX +
+        ", bindId=" + bindId +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPosition.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPosition.java
new file mode 100644
index 0000000..40bc1ba
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPosition.java
@@ -0,0 +1,124 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 订单坐标信息表
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-08
+ */
+@TableName("t_order_position")
+public class TOrderPosition extends Model<TOrderPosition> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    private Integer orderType;
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+    /**
+     * 司机id
+     */
+    private Integer driverId;
+    /**
+     * 经度
+     */
+    private String lon;
+    /**
+     * 纬度
+     */
+    private String lat;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public String getLon() {
+        return lon;
+    }
+
+    public void setLon(String lon) {
+        this.lon = lon;
+    }
+
+    public String getLat() {
+        return lat;
+    }
+
+    public void setLat(String lat) {
+        this.lat = lat;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TOrderPosition{" +
+        "id=" + id +
+        ", orderType=" + orderType +
+        ", orderId=" + orderId +
+        ", driverId=" + driverId +
+        ", lon=" + lon +
+        ", lat=" + lat +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java
new file mode 100644
index 0000000..205edda
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java
@@ -0,0 +1,869 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 订单-专车
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+@TableName("t_order_private_car")
+public class TOrderPrivateCar extends Model<TOrderPrivateCar> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 类型(1=普通订单,2=摆渡订单)
+     */
+    private Integer type;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 接单司机ID
+     */
+    private Integer driverId;
+    /**
+     * 车辆id
+     */
+    private Integer carId;
+    /**
+     * 订单号
+     */
+    private String orderNum;
+    /**
+     * 下单地点经度
+     */
+    private Double placementLon;
+    /**
+     * 下单地点纬度
+     */
+    private Double placementLat;
+    /**
+     * 下单地点
+     */
+    private String placementAddress;
+    /**
+     * 出发地经度值
+     */
+    private Double startLon;
+    /**
+     * 出发地纬度值
+     */
+    private Double startLat;
+    /**
+     * 目的地经度
+     */
+    private Double endLon;
+    /**
+     * 出发地地点
+     */
+    private String startAddress;
+    /**
+     * 目的地纬度
+     */
+    private Double endLat;
+    /**
+     * 目的地地点
+     */
+    private String endAddress;
+    /**
+     * 上车点经度
+     */
+    private Double boardingLon;
+    /**
+     * 上车点纬度
+     */
+    private Double boardingLat;
+    /**
+     * 上车点
+     */
+    private String boardingAddress;
+    /**
+     * 上车时间
+     */
+    private Date boardingTime;
+    /**
+     * 下车点经度
+     */
+    private Double getoffLon;
+    /**
+     * 下车点纬度
+     */
+    private Double getoffLat;
+    /**
+     * 下车地点
+     */
+    private String getoffAddress;
+    /**
+     * 下车时间
+     */
+    private Date getoffTime;
+    /**
+     * 行驶里程数(米)
+     */
+    private Double mileage;
+    /**
+     * 支付方式(1=OK平台支付,2=其他方式支付)
+     */
+    private Integer payManner;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=其他)
+     */
+    private Integer payType;
+    /**
+     * 订单金额
+     */
+    private BigDecimal orderMoney;
+    /**
+     * 起步价
+     */
+    private BigDecimal startMoney;
+    /**
+     * 里程费
+     */
+    private BigDecimal mileageMoney;
+    /**
+     * 时长费
+     */
+    private BigDecimal durationMoney;
+    /**
+     * 远途费
+     */
+    private BigDecimal longDistanceMoney;
+    /**
+     * 停车费
+     */
+    private BigDecimal parkMoney;
+    /**
+     * 过路费
+     */
+    private BigDecimal roadTollMoney;
+    /**
+     * 红包抵扣金额
+     */
+    private BigDecimal redPacketMoney;
+    /**
+     * 优惠券抵扣金额
+     */
+    private BigDecimal couponMoney;
+    /**
+     * 红包记录id
+     */
+    private Integer redPacketId;
+    /**
+     * 优惠券id
+     */
+    private Integer couponId;
+    /**
+     * 折扣
+     */
+    private Double discount;
+    /**
+     * 折扣优惠金额
+     */
+    private Double discountMoney;
+    /**
+     * 折扣活动id
+     */
+    private Integer activityId;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 支付金额
+     */
+    private BigDecimal payMoney;
+    /**
+     * 是否是代下单(0:否,1:是)
+     */
+    private Integer substitute;
+    /**
+     * 乘车人
+     */
+    private String passengers;
+    /**
+     * 乘车人电话
+     */
+    private String passengersPhone;
+    /**
+     * 状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)
+     */
+    private Integer state;
+    /**
+     * 下单时间
+     */
+    private Date insertTime;
+    /**
+     * 出行时间
+     */
+    private Date travelTime;
+    /**
+     * 抢单时间
+     */
+    private Date snatchOrderTime;
+    /**
+     * 司机点出发时间
+     */
+    private Date setOutTime;
+    /**
+     * 司机到达预约地点时间
+     */
+    private Date arriveTime;
+    /**
+     * 开始服务时间
+     */
+    private Date startServiceTime;
+    /**
+     * 结束服务时间
+     */
+    private Date endServiceTime;
+    /**
+     * 订单类型(1=普通,2=预约)
+     */
+    private Integer orderType;
+    /**
+     * 下单方式(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)
+     */
+    private Integer orderSource;
+    /**
+     * 发票id
+     */
+    private Integer invoiceId;
+    /**
+     * 是否是改派单(1=否,2=是)
+     */
+    private Integer isReassign;
+    /**
+     * 改派通知(0=没有改派,1=改派中,2=已改派)
+     */
+    private Integer reassignNotice;
+    /**
+     * 高德猎鹰上的轨迹id
+     */
+    private String trackId;
+    /**
+     * 是否删除  1=否 2=是
+     */
+    private Integer isDelete;
+    /**
+     * 状态(改派前订单状态)
+     */
+    private Integer oldState;
+    /**
+     * 移动小号
+     */
+    private String telX;
+    /**
+     * 移动小号绑定关系id
+     */
+    private String bindId;
+    /**
+     * 专车车型ID  关联t_server_carmodel表
+     */
+    private Integer serverCarModelId;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Double getPlacementLon() {
+        return placementLon;
+    }
+
+    public void setPlacementLon(Double placementLon) {
+        this.placementLon = placementLon;
+    }
+
+    public Double getPlacementLat() {
+        return placementLat;
+    }
+
+    public void setPlacementLat(Double placementLat) {
+        this.placementLat = placementLat;
+    }
+
+    public String getPlacementAddress() {
+        return placementAddress;
+    }
+
+    public void setPlacementAddress(String placementAddress) {
+        this.placementAddress = placementAddress;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public Double getBoardingLon() {
+        return boardingLon;
+    }
+
+    public void setBoardingLon(Double boardingLon) {
+        this.boardingLon = boardingLon;
+    }
+
+    public Double getBoardingLat() {
+        return boardingLat;
+    }
+
+    public void setBoardingLat(Double boardingLat) {
+        this.boardingLat = boardingLat;
+    }
+
+    public String getBoardingAddress() {
+        return boardingAddress;
+    }
+
+    public void setBoardingAddress(String boardingAddress) {
+        this.boardingAddress = boardingAddress;
+    }
+
+    public Date getBoardingTime() {
+        return boardingTime;
+    }
+
+    public void setBoardingTime(Date boardingTime) {
+        this.boardingTime = boardingTime;
+    }
+
+    public Double getGetoffLon() {
+        return getoffLon;
+    }
+
+    public void setGetoffLon(Double getoffLon) {
+        this.getoffLon = getoffLon;
+    }
+
+    public Double getGetoffLat() {
+        return getoffLat;
+    }
+
+    public void setGetoffLat(Double getoffLat) {
+        this.getoffLat = getoffLat;
+    }
+
+    public String getGetoffAddress() {
+        return getoffAddress;
+    }
+
+    public void setGetoffAddress(String getoffAddress) {
+        this.getoffAddress = getoffAddress;
+    }
+
+    public Date getGetoffTime() {
+        return getoffTime;
+    }
+
+    public void setGetoffTime(Date getoffTime) {
+        this.getoffTime = getoffTime;
+    }
+
+    public Double getMileage() {
+        return mileage;
+    }
+
+    public void setMileage(Double mileage) {
+        this.mileage = mileage;
+    }
+
+    public Integer getPayManner() {
+        return payManner;
+    }
+
+    public void setPayManner(Integer payManner) {
+        this.payManner = payManner;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public BigDecimal getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(BigDecimal orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public BigDecimal getStartMoney() {
+        return startMoney;
+    }
+
+    public void setStartMoney(BigDecimal startMoney) {
+        this.startMoney = startMoney;
+    }
+
+    public BigDecimal getMileageMoney() {
+        return mileageMoney;
+    }
+
+    public void setMileageMoney(BigDecimal mileageMoney) {
+        this.mileageMoney = mileageMoney;
+    }
+
+    public BigDecimal getDurationMoney() {
+        return durationMoney;
+    }
+
+    public void setDurationMoney(BigDecimal durationMoney) {
+        this.durationMoney = durationMoney;
+    }
+
+    public BigDecimal getLongDistanceMoney() {
+        return longDistanceMoney;
+    }
+
+    public void setLongDistanceMoney(BigDecimal longDistanceMoney) {
+        this.longDistanceMoney = longDistanceMoney;
+    }
+
+    public BigDecimal getParkMoney() {
+        return parkMoney;
+    }
+
+    public void setParkMoney(BigDecimal parkMoney) {
+        this.parkMoney = parkMoney;
+    }
+
+    public BigDecimal getRoadTollMoney() {
+        return roadTollMoney;
+    }
+
+    public void setRoadTollMoney(BigDecimal roadTollMoney) {
+        this.roadTollMoney = roadTollMoney;
+    }
+
+    public BigDecimal getRedPacketMoney() {
+        return redPacketMoney;
+    }
+
+    public void setRedPacketMoney(BigDecimal redPacketMoney) {
+        this.redPacketMoney = redPacketMoney;
+    }
+
+    public BigDecimal getCouponMoney() {
+        return couponMoney;
+    }
+
+    public void setCouponMoney(BigDecimal couponMoney) {
+        this.couponMoney = couponMoney;
+    }
+
+    public Integer getRedPacketId() {
+        return redPacketId;
+    }
+
+    public void setRedPacketId(Integer redPacketId) {
+        this.redPacketId = redPacketId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
+
+    public Double getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(Double discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public Integer getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Integer activityId) {
+        this.activityId = activityId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public BigDecimal getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(BigDecimal payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public Integer getSubstitute() {
+        return substitute;
+    }
+
+    public void setSubstitute(Integer substitute) {
+        this.substitute = substitute;
+    }
+
+    public String getPassengers() {
+        return passengers;
+    }
+
+    public void setPassengers(String passengers) {
+        this.passengers = passengers;
+    }
+
+    public String getPassengersPhone() {
+        return passengersPhone;
+    }
+
+    public void setPassengersPhone(String passengersPhone) {
+        this.passengersPhone = passengersPhone;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(Date travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    public Date getSnatchOrderTime() {
+        return snatchOrderTime;
+    }
+
+    public void setSnatchOrderTime(Date snatchOrderTime) {
+        this.snatchOrderTime = snatchOrderTime;
+    }
+
+    public Date getSetOutTime() {
+        return setOutTime;
+    }
+
+    public void setSetOutTime(Date setOutTime) {
+        this.setOutTime = setOutTime;
+    }
+
+    public Date getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(Date arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Date getStartServiceTime() {
+        return startServiceTime;
+    }
+
+    public void setStartServiceTime(Date startServiceTime) {
+        this.startServiceTime = startServiceTime;
+    }
+
+    public Date getEndServiceTime() {
+        return endServiceTime;
+    }
+
+    public void setEndServiceTime(Date endServiceTime) {
+        this.endServiceTime = endServiceTime;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+    public Integer getInvoiceId() {
+        return invoiceId;
+    }
+
+    public void setInvoiceId(Integer invoiceId) {
+        this.invoiceId = invoiceId;
+    }
+
+    public Integer getIsReassign() {
+        return isReassign;
+    }
+
+    public void setIsReassign(Integer isReassign) {
+        this.isReassign = isReassign;
+    }
+
+    public Integer getReassignNotice() {
+        return reassignNotice;
+    }
+
+    public void setReassignNotice(Integer reassignNotice) {
+        this.reassignNotice = reassignNotice;
+    }
+
+    public String getTrackId() {
+        return trackId;
+    }
+
+    public void setTrackId(String trackId) {
+        this.trackId = trackId;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getOldState() {
+        return oldState;
+    }
+
+    public void setOldState(Integer oldState) {
+        this.oldState = oldState;
+    }
+
+    public String getTelX() {
+        return telX;
+    }
+
+    public void setTelX(String telX) {
+        this.telX = telX;
+    }
+
+    public String getBindId() {
+        return bindId;
+    }
+
+    public void setBindId(String bindId) {
+        this.bindId = bindId;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TOrderPrivateCar{" +
+        "id=" + id +
+        ", type=" + type +
+        ", userId=" + userId +
+        ", driverId=" + driverId +
+        ", carId=" + carId +
+        ", orderNum=" + orderNum +
+        ", placementLon=" + placementLon +
+        ", placementLat=" + placementLat +
+        ", placementAddress=" + placementAddress +
+        ", startLon=" + startLon +
+        ", startLat=" + startLat +
+        ", endLon=" + endLon +
+        ", startAddress=" + startAddress +
+        ", endLat=" + endLat +
+        ", endAddress=" + endAddress +
+        ", boardingLon=" + boardingLon +
+        ", boardingLat=" + boardingLat +
+        ", boardingAddress=" + boardingAddress +
+        ", boardingTime=" + boardingTime +
+        ", getoffLon=" + getoffLon +
+        ", getoffLat=" + getoffLat +
+        ", getoffAddress=" + getoffAddress +
+        ", getoffTime=" + getoffTime +
+        ", mileage=" + mileage +
+        ", payManner=" + payManner +
+        ", payType=" + payType +
+        ", orderMoney=" + orderMoney +
+        ", startMoney=" + startMoney +
+        ", mileageMoney=" + mileageMoney +
+        ", durationMoney=" + durationMoney +
+        ", longDistanceMoney=" + longDistanceMoney +
+        ", parkMoney=" + parkMoney +
+        ", roadTollMoney=" + roadTollMoney +
+        ", redPacketMoney=" + redPacketMoney +
+        ", couponMoney=" + couponMoney +
+        ", redPacketId=" + redPacketId +
+        ", couponId=" + couponId +
+        ", discount=" + discount +
+        ", discountMoney=" + discountMoney +
+        ", activityId=" + activityId +
+        ", companyId=" + companyId +
+        ", payMoney=" + payMoney +
+        ", substitute=" + substitute +
+        ", passengers=" + passengers +
+        ", passengersPhone=" + passengersPhone +
+        ", state=" + state +
+        ", insertTime=" + insertTime +
+        ", travelTime=" + travelTime +
+        ", snatchOrderTime=" + snatchOrderTime +
+        ", setOutTime=" + setOutTime +
+        ", arriveTime=" + arriveTime +
+        ", startServiceTime=" + startServiceTime +
+        ", endServiceTime=" + endServiceTime +
+        ", orderType=" + orderType +
+        ", orderSource=" + orderSource +
+        ", invoiceId=" + invoiceId +
+        ", isReassign=" + isReassign +
+        ", reassignNotice=" + reassignNotice +
+        ", trackId=" + trackId +
+        ", isDelete=" + isDelete +
+        ", oldState=" + oldState +
+        ", telX=" + telX +
+        ", bindId=" + bindId +
+        ", serverCarModelId=" + serverCarModelId +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java
new file mode 100644
index 0000000..402391b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java
@@ -0,0 +1,723 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 订单-出租车
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-08
+ */
+@TableName("t_order_taxi")
+public class TOrderTaxi extends Model<TOrderTaxi> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 接单司机ID
+     */
+    private Integer driverId;
+    /**
+     * 车辆id
+     */
+    private Integer carId;
+    /**
+     * 订单号
+     */
+    private String orderNum;
+    /**
+     * 下单地点经度
+     */
+    private Double placementLon;
+    /**
+     * 下单地点纬度
+     */
+    private Double placementLat;
+    /**
+     * 下单地点
+     */
+    private String placementAddress;
+    /**
+     * 出发地经度值
+     */
+    private Double startLon;
+    /**
+     * 出发地纬度值
+     */
+    private Double startLat;
+    /**
+     * 目的地经度
+     */
+    private Double endLon;
+    /**
+     * 出发地地点
+     */
+    private String startAddress;
+    /**
+     * 目的地纬度
+     */
+    private Double endLat;
+    /**
+     * 目的地地点
+     */
+    private String endAddress;
+    /**
+     * 上车点经度
+     */
+    private Double boardingLon;
+    /**
+     * 上车点纬度
+     */
+    private Double boardingLat;
+    /**
+     * 上车点
+     */
+    private String boardingAddress;
+    /**
+     * 上车时间
+     */
+    private Date boardingTime;
+    /**
+     * 下车点经度
+     */
+    private Double getoffLon;
+    /**
+     * 下车点纬度
+     */
+    private Double getoffLat;
+    /**
+     * 下车地点
+     */
+    private String getoffAddress;
+    /**
+     * 下车时间
+     */
+    private Date getoffTime;
+    /**
+     * 行驶里程数(米)
+     */
+    private Double mileage;
+    /**
+     * 支付方式(1=OK平台支付,2=其他方式支付)
+     */
+    private Integer payManner;
+    /**
+     * 支付方式(1=微信,2=支付宝,3=其他)
+     */
+    private Integer payType;
+    /**
+     * 订单金额
+     */
+    private BigDecimal orderMoney;
+    /**
+     * 行程费
+     */
+    private BigDecimal travelMoney;
+    /**
+     * 停车费
+     */
+    private BigDecimal parkMoney;
+    /**
+     * 过路费
+     */
+    private BigDecimal roadTollMoney;
+    /**
+     * 小费
+     */
+    private BigDecimal tipMoney;
+    /**
+     * 红包抵扣金额
+     */
+    private BigDecimal redPacketMoney;
+    /**
+     * 优惠券抵扣金额
+     */
+    private BigDecimal couponMoney;
+    /**
+     * 红包记录id
+     */
+    private Integer redPacketId;
+    /**
+     * 优惠券id
+     */
+    private Integer couponId;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 支付金额
+     */
+    private BigDecimal payMoney;
+    /**
+     * 是否是代下单(0:否,1:是)
+     */
+    private Integer substitute;
+    /**
+     * 乘车人
+     */
+    private String passengers;
+    /**
+     * 乘车人电话
+     */
+    private String passengersPhone;
+    /**
+     * 状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中)
+     */
+    private Integer state;
+    /**
+     * 状态(改派前订单状态)
+     */
+    private Integer oldState;
+    /**
+     * 下单时间
+     */
+    private Date insertTime;
+    /**
+     * 出行时间
+     */
+    private Date travelTime;
+    /**
+     * 抢单时间
+     */
+    private Date snatchOrderTime;
+    /**
+     * 司机点出发时间
+     */
+    private Date setOutTime;
+    /**
+     * 司机到达预约地点时间
+     */
+    private Date arriveTime;
+    /**
+     * 开始服务时间
+     */
+    private Date startServiceTime;
+    /**
+     * 结束服务时间
+     */
+    private Date endServiceTime;
+    /**
+     * 订单类型(1=普通,2=预约)
+     */
+    private Integer orderType;
+    /**
+     * 下单方式(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)
+     */
+    private Integer orderSource;
+    /**
+     * 发票id
+     */
+    private Integer invoiceId;
+    /**
+     * 是否是改派单(1=否,2=是)
+     */
+    private Integer isReassign;
+    /**
+     * 是否删除  1=否 2=是
+     */
+    private Integer isDelete;
+
+    public Integer getOldState() {
+        return oldState;
+    }
+
+    public void setOldState(Integer oldState) {
+        this.oldState = oldState;
+    }
+
+    public Integer getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getDriverId() {
+        return driverId;
+    }
+
+    public void setDriverId(Integer driverId) {
+        this.driverId = driverId;
+    }
+
+    public Integer getCarId() {
+        return carId;
+    }
+
+    public void setCarId(Integer carId) {
+        this.carId = carId;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public Double getPlacementLon() {
+        return placementLon;
+    }
+
+    public void setPlacementLon(Double placementLon) {
+        this.placementLon = placementLon;
+    }
+
+    public Double getPlacementLat() {
+        return placementLat;
+    }
+
+    public void setPlacementLat(Double placementLat) {
+        this.placementLat = placementLat;
+    }
+
+    public String getPlacementAddress() {
+        return placementAddress;
+    }
+
+    public void setPlacementAddress(String placementAddress) {
+        this.placementAddress = placementAddress;
+    }
+
+    public Double getStartLon() {
+        return startLon;
+    }
+
+    public void setStartLon(Double startLon) {
+        this.startLon = startLon;
+    }
+
+    public Double getStartLat() {
+        return startLat;
+    }
+
+    public void setStartLat(Double startLat) {
+        this.startLat = startLat;
+    }
+
+    public Double getEndLon() {
+        return endLon;
+    }
+
+    public void setEndLon(Double endLon) {
+        this.endLon = endLon;
+    }
+
+    public String getStartAddress() {
+        return startAddress;
+    }
+
+    public void setStartAddress(String startAddress) {
+        this.startAddress = startAddress;
+    }
+
+    public Double getEndLat() {
+        return endLat;
+    }
+
+    public void setEndLat(Double endLat) {
+        this.endLat = endLat;
+    }
+
+    public String getEndAddress() {
+        return endAddress;
+    }
+
+    public void setEndAddress(String endAddress) {
+        this.endAddress = endAddress;
+    }
+
+    public Double getBoardingLon() {
+        return boardingLon;
+    }
+
+    public void setBoardingLon(Double boardingLon) {
+        this.boardingLon = boardingLon;
+    }
+
+    public Double getBoardingLat() {
+        return boardingLat;
+    }
+
+    public void setBoardingLat(Double boardingLat) {
+        this.boardingLat = boardingLat;
+    }
+
+    public String getBoardingAddress() {
+        return boardingAddress;
+    }
+
+    public void setBoardingAddress(String boardingAddress) {
+        this.boardingAddress = boardingAddress;
+    }
+
+    public Date getBoardingTime() {
+        return boardingTime;
+    }
+
+    public void setBoardingTime(Date boardingTime) {
+        this.boardingTime = boardingTime;
+    }
+
+    public Double getGetoffLon() {
+        return getoffLon;
+    }
+
+    public void setGetoffLon(Double getoffLon) {
+        this.getoffLon = getoffLon;
+    }
+
+    public Double getGetoffLat() {
+        return getoffLat;
+    }
+
+    public void setGetoffLat(Double getoffLat) {
+        this.getoffLat = getoffLat;
+    }
+
+    public String getGetoffAddress() {
+        return getoffAddress;
+    }
+
+    public void setGetoffAddress(String getoffAddress) {
+        this.getoffAddress = getoffAddress;
+    }
+
+    public Date getGetoffTime() {
+        return getoffTime;
+    }
+
+    public void setGetoffTime(Date getoffTime) {
+        this.getoffTime = getoffTime;
+    }
+
+    public Double getMileage() {
+        return mileage;
+    }
+
+    public void setMileage(Double mileage) {
+        this.mileage = mileage;
+    }
+
+    public Integer getPayManner() {
+        return payManner;
+    }
+
+    public void setPayManner(Integer payManner) {
+        this.payManner = payManner;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public BigDecimal getOrderMoney() {
+        return orderMoney;
+    }
+
+    public void setOrderMoney(BigDecimal orderMoney) {
+        this.orderMoney = orderMoney;
+    }
+
+    public BigDecimal getTravelMoney() {
+        return travelMoney;
+    }
+
+    public void setTravelMoney(BigDecimal travelMoney) {
+        this.travelMoney = travelMoney;
+    }
+
+    public BigDecimal getParkMoney() {
+        return parkMoney;
+    }
+
+    public void setParkMoney(BigDecimal parkMoney) {
+        this.parkMoney = parkMoney;
+    }
+
+    public BigDecimal getRoadTollMoney() {
+        return roadTollMoney;
+    }
+
+    public void setRoadTollMoney(BigDecimal roadTollMoney) {
+        this.roadTollMoney = roadTollMoney;
+    }
+
+    public BigDecimal getTipMoney() {
+        return tipMoney;
+    }
+
+    public void setTipMoney(BigDecimal tipMoney) {
+        this.tipMoney = tipMoney;
+    }
+
+    public BigDecimal getRedPacketMoney() {
+        return redPacketMoney;
+    }
+
+    public void setRedPacketMoney(BigDecimal redPacketMoney) {
+        this.redPacketMoney = redPacketMoney;
+    }
+
+    public BigDecimal getCouponMoney() {
+        return couponMoney;
+    }
+
+    public void setCouponMoney(BigDecimal couponMoney) {
+        this.couponMoney = couponMoney;
+    }
+
+    public Integer getRedPacketId() {
+        return redPacketId;
+    }
+
+    public void setRedPacketId(Integer redPacketId) {
+        this.redPacketId = redPacketId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public BigDecimal getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(BigDecimal payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public Integer getSubstitute() {
+        return substitute;
+    }
+
+    public void setSubstitute(Integer substitute) {
+        this.substitute = substitute;
+    }
+
+    public String getPassengers() {
+        return passengers;
+    }
+
+    public void setPassengers(String passengers) {
+        this.passengers = passengers;
+    }
+
+    public String getPassengersPhone() {
+        return passengersPhone;
+    }
+
+    public void setPassengersPhone(String passengersPhone) {
+        this.passengersPhone = passengersPhone;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getTravelTime() {
+        return travelTime;
+    }
+
+    public void setTravelTime(Date travelTime) {
+        this.travelTime = travelTime;
+    }
+
+    public Date getSnatchOrderTime() {
+        return snatchOrderTime;
+    }
+
+    public void setSnatchOrderTime(Date snatchOrderTime) {
+        this.snatchOrderTime = snatchOrderTime;
+    }
+
+    public Date getSetOutTime() {
+        return setOutTime;
+    }
+
+    public void setSetOutTime(Date setOutTime) {
+        this.setOutTime = setOutTime;
+    }
+
+    public Date getArriveTime() {
+        return arriveTime;
+    }
+
+    public void setArriveTime(Date arriveTime) {
+        this.arriveTime = arriveTime;
+    }
+
+    public Date getStartServiceTime() {
+        return startServiceTime;
+    }
+
+    public void setStartServiceTime(Date startServiceTime) {
+        this.startServiceTime = startServiceTime;
+    }
+
+    public Date getEndServiceTime() {
+        return endServiceTime;
+    }
+
+    public void setEndServiceTime(Date endServiceTime) {
+        this.endServiceTime = endServiceTime;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderSource() {
+        return orderSource;
+    }
+
+    public void setOrderSource(Integer orderSource) {
+        this.orderSource = orderSource;
+    }
+
+    public Integer getInvoiceId() {
+        return invoiceId;
+    }
+
+    public void setInvoiceId(Integer invoiceId) {
+        this.invoiceId = invoiceId;
+    }
+
+    public Integer getIsReassign() {
+        return isReassign;
+    }
+
+    public void setIsReassign(Integer isReassign) {
+        this.isReassign = isReassign;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TOrderTaxi{" +
+        "id=" + id +
+        ", userId=" + userId +
+        ", driverId=" + driverId +
+        ", carId=" + carId +
+        ", orderNum=" + orderNum +
+        ", placementLon=" + placementLon +
+        ", placementLat=" + placementLat +
+        ", placementAddress=" + placementAddress +
+        ", startLon=" + startLon +
+        ", startLat=" + startLat +
+        ", endLon=" + endLon +
+        ", startAddress=" + startAddress +
+        ", endLat=" + endLat +
+        ", endAddress=" + endAddress +
+        ", boardingLon=" + boardingLon +
+        ", boardingLat=" + boardingLat +
+        ", boardingAddress=" + boardingAddress +
+        ", boardingTime=" + boardingTime +
+        ", getoffLon=" + getoffLon +
+        ", getoffLat=" + getoffLat +
+        ", getoffAddress=" + getoffAddress +
+        ", getoffTime=" + getoffTime +
+        ", mileage=" + mileage +
+        ", payManner=" + payManner +
+        ", payType=" + payType +
+        ", orderMoney=" + orderMoney +
+        ", travelMoney=" + travelMoney +
+        ", parkMoney=" + parkMoney +
+        ", roadTollMoney=" + roadTollMoney +
+        ", tipMoney=" + tipMoney +
+        ", redPacketMoney=" + redPacketMoney +
+        ", couponMoney=" + couponMoney +
+        ", redPacketId=" + redPacketId +
+        ", couponId=" + couponId +
+        ", companyId=" + companyId +
+        ", payMoney=" + payMoney +
+        ", substitute=" + substitute +
+        ", passengers=" + passengers +
+        ", passengersPhone=" + passengersPhone +
+        ", state=" + state +
+        ", insertTime=" + insertTime +
+        ", travelTime=" + travelTime +
+        ", snatchOrderTime=" + snatchOrderTime +
+        ", setOutTime=" + setOutTime +
+        ", arriveTime=" + arriveTime +
+        ", startServiceTime=" + startServiceTime +
+        ", endServiceTime=" + endServiceTime +
+        ", orderType=" + orderType +
+        ", orderSource=" + orderSource +
+        ", invoiceId=" + invoiceId +
+        ", isReassign=" + isReassign +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPhone.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPhone.java
new file mode 100644
index 0000000..2a7786f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPhone.java
@@ -0,0 +1,94 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统电话设置
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_phone")
+public class TPhone extends Model<TPhone> {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    /**
+     * 数据类型(1:报警电话,2:客服电话)
+     */
+    private Integer type;
+    /**
+     * 是否是平台(1=是,2=否)
+     */
+    private Integer platform;
+    /**
+     * 电话号码
+     */
+    private String phone;
+    /**
+     * 企业id
+     */
+    private Integer companyId;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getPlatform() {
+        return platform;
+    }
+
+    public void setPlatform(Integer platform) {
+        this.platform = platform;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TPhone{" +
+        "id=" + id +
+        ", type=" + type +
+        ", platform=" + platform +
+        ", phone=" + phone +
+        ", companyId=" + companyId +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TProblem.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TProblem.java
new file mode 100644
index 0000000..1e607bb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TProblem.java
@@ -0,0 +1,137 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 在线客服
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-24
+ */
+@TableName("t_problem")
+public class TProblem extends Model<TProblem> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 提问内容
+     */
+    private String content;
+    /**
+     * 回答内容
+     */
+    private String answer;
+    /**
+     * 处理人id
+     */
+    private Integer handleUserId;
+    /**
+     * 处理时间
+     */
+    private Date handleTime;
+    /**
+     * 提问时间
+     */
+    private Date insertTime;
+    /**
+     * 状态(1=待处理,2=已处理)
+     */
+    private Integer state;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public Integer getHandleUserId() {
+        return handleUserId;
+    }
+
+    public void setHandleUserId(Integer handleUserId) {
+        this.handleUserId = handleUserId;
+    }
+
+    public Date getHandleTime() {
+        return handleTime;
+    }
+
+    public void setHandleTime(Date handleTime) {
+        this.handleTime = handleTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TProblem{" +
+        "id=" + id +
+        ", userId=" + userId +
+        ", content=" + content +
+        ", answer=" + answer +
+        ", handleUserId=" + handleUserId +
+        ", handleTime=" + handleTime +
+        ", insertTime=" + insertTime +
+        ", state=" + state +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPubTransactionDetails.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPubTransactionDetails.java
new file mode 100644
index 0000000..90b830b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPubTransactionDetails.java
@@ -0,0 +1,167 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 交易明细(司机/用户)
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@TableName("t_pub_transaction_details")
+public class TPubTransactionDetails extends Model<TPubTransactionDetails> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 创建时间
+     */
+    private Date insertTime;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 金额/积分
+     */
+    private BigDecimal money;
+    /**
+     * 状态(1=增加,2=减少)
+     */
+    private Integer state;
+    /**
+     * 类型(1=金额,2=积分)
+     */
+    private Integer type;
+    /**
+     * 类型(1=用户,2=司机)
+     */
+    private Integer userType;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流,5=余额充值)
+     */
+    private Integer orderType;
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TPubTransactionDetails{" +
+        "id=" + id +
+        ", userId=" + userId +
+        ", insertTime=" + insertTime +
+        ", remark=" + remark +
+        ", money=" + money +
+        ", state=" + state +
+        ", type=" + type +
+        ", userType=" + userType +
+        ", orderType=" + orderType +
+        ", orderId=" + orderId +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPubWithdrawal.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPubWithdrawal.java
new file mode 100644
index 0000000..4f469e7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TPubWithdrawal.java
@@ -0,0 +1,206 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 提现记录表(司机/用户)
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_pub_withdrawal")
+public class TPubWithdrawal extends Model<TPubWithdrawal> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 处理时间
+     */
+    private Date handleTime;
+    /**
+     * 原钱包余额
+     */
+    private BigDecimal balance;
+    /**
+     * 提现金额
+     */
+    private BigDecimal money;
+    /**
+     * 状态(1=待处理,2=成功,3=失败)
+     */
+    private Integer state;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 银行账号
+     */
+    private String code;
+    /**
+     * 账户持有人姓名
+     */
+    private String name;
+    /**
+     * 用户类型(1=用户,2=司机)
+     */
+    private Integer userType;
+    /**
+     * 申请时间
+     */
+    private Date insertTime;
+    /**
+     * 1:创建,2:修改,3:删除
+     */
+    private Integer flag;
+    /**
+     * 提现方式 1=银行卡  2=线下
+     */
+    private Integer withdrawalType;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getHandleTime() {
+        return handleTime;
+    }
+
+    public void setHandleTime(Date handleTime) {
+        this.handleTime = handleTime;
+    }
+
+    public BigDecimal getBalance() {
+        return balance;
+    }
+
+    public void setBalance(BigDecimal balance) {
+        this.balance = balance;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getFlag() {
+        return flag;
+    }
+
+    public void setFlag(Integer flag) {
+        this.flag = flag;
+    }
+
+    public Integer getWithdrawalType() {
+        return withdrawalType;
+    }
+
+    public void setWithdrawalType(Integer withdrawalType) {
+        this.withdrawalType = withdrawalType;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TPubWithdrawal{" +
+        "id=" + id +
+        ", userId=" + userId +
+        ", handleTime=" + handleTime +
+        ", balance=" + balance +
+        ", money=" + money +
+        ", state=" + state +
+        ", remark=" + remark +
+        ", code=" + code +
+        ", name=" + name +
+        ", userType=" + userType +
+        ", insertTime=" + insertTime +
+        ", flag=" + flag +
+        ", withdrawalType=" + withdrawalType +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TReassign.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TReassign.java
new file mode 100644
index 0000000..e71ba0b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TReassign.java
@@ -0,0 +1,268 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 订单改派
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-03
+ */
+@TableName("t_reassign")
+public class TReassign extends Model<TReassign> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    private Integer orderType;
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+    /**
+     * 申请司机id
+     */
+    private Integer originalDriverId;
+    /**
+     * 原始车辆id
+     */
+    private Integer originalCarId;
+    /**
+     * 申请时间
+     */
+    private Date insertTime;
+    /**
+     * 改派后的司机id
+     */
+    private Integer nowDriverId;
+    /**
+     * 改派后的车辆id
+     */
+    private Integer nowCarId;
+    /**
+     * 改派支付金额
+     */
+    private Double money;
+    /**
+     * 改派支付方式(1=微信,2=支付宝,3=余额)
+     */
+    private Integer payType;
+    /**
+     * 支付完成时间
+     */
+    private Date payTime;
+    /**
+     * 第三方支付订单号
+     */
+    private String payOrder;
+    /**
+     * 1=提交申请,2=已支付,3=已改派,4=已取消,5=已拒绝
+     */
+    private Integer state;
+    /**
+     * 改派原因
+     */
+    private String reason;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 处理人
+     */
+    @TableField("reviewer")
+    private Integer reviewer;
+    /**
+     * 处理人类型(1=调度,2=后台管理员)
+     */
+    @TableField("reviewerType")
+    private Integer reviewerType;
+    /**
+     * 改派完成时间
+     */
+    private Date completeTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOriginalDriverId() {
+        return originalDriverId;
+    }
+
+    public void setOriginalDriverId(Integer originalDriverId) {
+        this.originalDriverId = originalDriverId;
+    }
+
+    public Integer getOriginalCarId() {
+        return originalCarId;
+    }
+
+    public void setOriginalCarId(Integer originalCarId) {
+        this.originalCarId = originalCarId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getNowDriverId() {
+        return nowDriverId;
+    }
+
+    public void setNowDriverId(Integer nowDriverId) {
+        this.nowDriverId = nowDriverId;
+    }
+
+    public Integer getNowCarId() {
+        return nowCarId;
+    }
+
+    public void setNowCarId(Integer nowCarId) {
+        this.nowCarId = nowCarId;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public Date getPayTime() {
+        return payTime;
+    }
+
+    public void setPayTime(Date payTime) {
+        this.payTime = payTime;
+    }
+
+    public String getPayOrder() {
+        return payOrder;
+    }
+
+    public void setPayOrder(String payOrder) {
+        this.payOrder = payOrder;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Date getCompleteTime() {
+        return completeTime;
+    }
+
+    public void setCompleteTime(Date completeTime) {
+        this.completeTime = completeTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    public Integer getReviewer() {
+        return reviewer;
+    }
+
+    public void setReviewer(Integer reviewer) {
+        this.reviewer = reviewer;
+    }
+
+    public Integer getReviewerType() {
+        return reviewerType;
+    }
+
+    public void setReviewerType(Integer reviewerType) {
+        this.reviewerType = reviewerType;
+    }
+
+    @Override
+    public String toString() {
+        return "TReassign{" +
+        "id=" + id +
+        ", orderType=" + orderType +
+        ", orderId=" + orderId +
+        ", originalDriverId=" + originalDriverId +
+        ", originalCarId=" + originalCarId +
+        ", insertTime=" + insertTime +
+        ", nowDriverId=" + nowDriverId +
+        ", nowCarId=" + nowCarId +
+        ", money=" + money +
+        ", payType=" + payType +
+        ", payTime=" + payTime +
+        ", payOrder=" + payOrder +
+        ", state=" + state +
+        ", reason=" + reason +
+        ", remark=" + remark +
+        ", completeTime=" + completeTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TRegion.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TRegion.java
new file mode 100644
index 0000000..6ff4628
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TRegion.java
@@ -0,0 +1,109 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 省市区三级联动
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+@TableName("t_region")
+public class TRegion extends Model<TRegion> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 城市名称
+     */
+    private String name;
+    private String code;
+    private String citycode;
+    /**
+     * 父级ID
+     */
+    @TableField("parent_id")
+    private Integer parentId;
+    /**
+     * 英文名称
+     */
+    private String english;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getCitycode() {
+        return citycode;
+    }
+
+    public void setCitycode(String citycode) {
+        this.citycode = citycode;
+    }
+
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getEnglish() {
+        return english;
+    }
+
+    public void setEnglish(String english) {
+        this.english = english;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TRegion{" +
+        "id=" + id +
+        ", name=" + name +
+        ", code=" + code +
+        ", citycode=" + citycode +
+        ", parentId=" + parentId +
+        ", english=" + english +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TServerCarmodel.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TServerCarmodel.java
new file mode 100644
index 0000000..61f6770
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TServerCarmodel.java
@@ -0,0 +1,125 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 服务车型设置
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-08-29
+ */
+@TableName("t_server_carmodel")
+public class TServerCarmodel extends Model<TServerCarmodel> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 业务类型(1=专车,2=城际,3=包车)
+     */
+    private Integer type;
+    /**
+     * 车型名称
+     */
+    private String name;
+    /**
+     * 车型图片
+     */
+    private String img;
+    /**
+     * 包车价格(100-300)
+     */
+    private String price;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+
+    public String getPrice() {
+        return price;
+    }
+
+    public void setPrice(String price) {
+        this.price = price;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TServerCarmodel{" +
+        "id=" + id +
+        ", type=" + type +
+        ", name=" + name +
+        ", img=" + img +
+        ", state=" + state +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSite.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSite.java
new file mode 100644
index 0000000..6427c01
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSite.java
@@ -0,0 +1,179 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 线路站点
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-04
+ */
+@TableName("t_site")
+public class TSite extends Model<TSite> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 站点名称
+     */
+    private String name;
+    /**
+     * 省名称
+     */
+    private String province;
+    /**
+     * 省编号
+     */
+    private String provinceCode;
+    /**
+     * 市名称
+     */
+    private String city;
+    /**
+     * 市编号
+     */
+    private String cityCode;
+    /**
+     * 区县名称
+     */
+    private String district;
+    /**
+     * 区县编号
+     */
+    private String districtCode;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 添加人id
+     */
+    private Integer insertUserId;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getProvinceCode() {
+        return provinceCode;
+    }
+
+    public void setProvinceCode(String provinceCode) {
+        this.provinceCode = provinceCode;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getCityCode() {
+        return cityCode;
+    }
+
+    public void setCityCode(String cityCode) {
+        this.cityCode = cityCode;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public String getDistrictCode() {
+        return districtCode;
+    }
+
+    public void setDistrictCode(String districtCode) {
+        this.districtCode = districtCode;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getInsertUserId() {
+        return insertUserId;
+    }
+
+    public void setInsertUserId(Integer insertUserId) {
+        this.insertUserId = insertUserId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TSite{" +
+        "id=" + id +
+        ", name=" + name +
+        ", province=" + province +
+        ", provinceCode=" + provinceCode +
+        ", city=" + city +
+        ", cityCode=" + cityCode +
+        ", district=" + district +
+        ", districtCode=" + districtCode +
+        ", state=" + state +
+        ", insertTime=" + insertTime +
+        ", insertUserId=" + insertUserId +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSmsrecord.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSmsrecord.java
new file mode 100644
index 0000000..1f84b40
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSmsrecord.java
@@ -0,0 +1,114 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 验证码
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+@TableName("t_smsrecord")
+public class TSmsrecord extends Model<TSmsrecord> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 类型:1=用户端注册/登录,2=用户端更换手机,3=用户端忘记密码,4=用户修改密码,5=司机注册,6=司机忘记密码,7=司机修改手机号,8=司机修改密码
+     */
+    private Integer type;
+    /**
+     * 电话 
+     */
+    private String phone;
+    /**
+     * 验证码
+     */
+    private String code;
+    /**
+     * 短信内容
+     */
+    private String content;
+    /**
+     * 添加时间 
+     */
+    private Date createTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TSmsrecord{" +
+        "id=" + id +
+        ", type=" + type +
+        ", phone=" + phone +
+        ", code=" + code +
+        ", content=" + content +
+        ", createTime=" + createTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysCancleOrder.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysCancleOrder.java
new file mode 100644
index 0000000..ddf12d4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysCancleOrder.java
@@ -0,0 +1,114 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置-取消订单
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_sys_cancle_order")
+public class TSysCancleOrder extends Model<TSysCancleOrder> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 企业id
+     */
+    private Integer companyId;
+    /**
+     * 时间(分钟)
+     */
+    private Integer minuteNum;
+    /**
+     * 金额
+     */
+    private BigDecimal money;
+    /**
+     * 1=普通单取消,2=预约单取消
+     */
+    private Integer type;
+    /**
+     * 1=专车,2=出租车,3=跨城出行
+     */
+    private Integer orderType;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getMinuteNum() {
+        return minuteNum;
+    }
+
+    public void setMinuteNum(Integer minuteNum) {
+        this.minuteNum = minuteNum;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TSysCancleOrder{" +
+        "id=" + id +
+        ", companyId=" + companyId +
+        ", minuteNum=" + minuteNum +
+        ", money=" + money +
+        ", type=" + type +
+        ", orderType=" + orderType +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysFaceDistinguish.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysFaceDistinguish.java
new file mode 100644
index 0000000..4da14ac
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysFaceDistinguish.java
@@ -0,0 +1,87 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置-人脸识别
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_sys_face_distinguish")
+public class TSysFaceDistinguish extends Model<TSysFaceDistinguish> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 企业id
+     */
+    private Integer companyId;
+    /**
+     * 是否打开(1=是,2=否)
+     */
+    private Integer isOpen;
+    /**
+     * 间隔分钟数
+     */
+    private Integer minuteNum;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getIsOpen() {
+        return isOpen;
+    }
+
+    public void setIsOpen(Integer isOpen) {
+        this.isOpen = isOpen;
+    }
+
+    public Integer getMinuteNum() {
+        return minuteNum;
+    }
+
+    public void setMinuteNum(Integer minuteNum) {
+        this.minuteNum = minuteNum;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TSysFaceDistinguish{" +
+        "id=" + id +
+        ", companyId=" + companyId +
+        ", isOpen=" + isOpen +
+        ", minuteNum=" + minuteNum +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysIntegral.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysIntegral.java
new file mode 100644
index 0000000..58f3298
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysIntegral.java
@@ -0,0 +1,74 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置-积分
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_sys_integral")
+public class TSysIntegral extends Model<TSysIntegral> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 企业id
+     */
+    private Integer companyId;
+    /**
+     * 积分
+     */
+    private Integer integral;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Integer integral) {
+        this.integral = integral;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TSysIntegral{" +
+        "id=" + id +
+        ", companyId=" + companyId +
+        ", integral=" + integral +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysPushOrder.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysPushOrder.java
new file mode 100644
index 0000000..dc4c94f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysPushOrder.java
@@ -0,0 +1,126 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置-推单
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_sys_push_order")
+public class TSysPushOrder extends Model<TSysPushOrder> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 企业id
+     */
+    private Integer companyId;
+    /**
+     * 推单距离(公里)
+     */
+    private Double pushDistance;
+    /**
+     * 推单时间(秒)
+     */
+    private Integer pushTime;
+    /**
+     * 推单占所有司机百分比
+     */
+    private Double driverProportion;
+    /**
+     * 1=第一轮,2=第二轮,3=第三轮
+     */
+    private Integer type;
+    /**
+     * 1=专车,2=出租车
+     */
+    private Integer pushType;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Double getPushDistance() {
+        return pushDistance;
+    }
+
+    public void setPushDistance(Double pushDistance) {
+        this.pushDistance = pushDistance;
+    }
+
+    public Integer getPushTime() {
+        return pushTime;
+    }
+
+    public void setPushTime(Integer pushTime) {
+        this.pushTime = pushTime;
+    }
+
+    public Double getDriverProportion() {
+        return driverProportion;
+    }
+
+    public void setDriverProportion(Double driverProportion) {
+        this.driverProportion = driverProportion;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getPushType() {
+        return pushType;
+    }
+
+    public void setPushType(Integer pushType) {
+        this.pushType = pushType;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TSysPushOrder{" +
+        "id=" + id +
+        ", companyId=" + companyId +
+        ", pushDistance=" + pushDistance +
+        ", pushTime=" + pushTime +
+        ", driverProportion=" + driverProportion +
+        ", type=" + type +
+        ", pushType=" + pushType +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysReformist.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysReformist.java
new file mode 100644
index 0000000..22b47d4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysReformist.java
@@ -0,0 +1,98 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置-改派
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_sys_reformist")
+public class TSysReformist extends Model<TSysReformist> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 企业id
+     */
+    private Integer companyId;
+    /**
+     * 金额
+     */
+    private BigDecimal money;
+    /**
+     * 专车改派 1=否 2=是
+     */
+    private Integer isSpecialCar;
+    /**
+     * 出租车改派  1=否 2=是
+     */
+    private Integer isTaxiCar;
+
+    public Integer getIsSpecialCar() {
+        return isSpecialCar;
+    }
+
+    public void setIsSpecialCar(Integer isSpecialCar) {
+        this.isSpecialCar = isSpecialCar;
+    }
+
+    public Integer getIsTaxiCar() {
+        return isTaxiCar;
+    }
+
+    public void setIsTaxiCar(Integer isTaxiCar) {
+        this.isTaxiCar = isTaxiCar;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TSysReformist{" +
+        "id=" + id +
+        ", companyId=" + companyId +
+        ", money=" + money +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysSensitiveWords.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysSensitiveWords.java
new file mode 100644
index 0000000..4ab3436
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysSensitiveWords.java
@@ -0,0 +1,75 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统设置-敏感词
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_sys_sensitive_words")
+public class TSysSensitiveWords extends Model<TSysSensitiveWords> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 敏感词
+     */
+    private String content;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TSysSensitiveWords{" +
+        "id=" + id +
+        ", createTime=" + createTime +
+        ", content=" + content +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSystemNotice.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSystemNotice.java
new file mode 100644
index 0000000..f9db3d9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSystemNotice.java
@@ -0,0 +1,137 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 系统通知
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+@TableName("t_system_notice")
+public class TSystemNotice extends Model<TSystemNotice> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 1=公告,2=系统消息
+     */
+    private Integer type;
+    /**
+     * 1=用户,2=司机
+     */
+    private Integer userType;
+    /**
+     * 公告id
+     */
+    private Integer noticesId;
+    /**
+     * 消息内容
+     */
+    private String content;
+    /**
+     * 接收对象id
+     */
+    private Integer userId;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 1=未读,2=已读
+     */
+    private Integer read;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Integer getNoticesId() {
+        return noticesId;
+    }
+
+    public void setNoticesId(Integer noticesId) {
+        this.noticesId = noticesId;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getRead() {
+        return read;
+    }
+
+    public void setRead(Integer read) {
+        this.read = read;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TSystemNotice{" +
+        "id=" + id +
+        ", type=" + type +
+        ", userType=" + userType +
+        ", noticesId=" + noticesId +
+        ", content=" + content +
+        ", userId=" + userId +
+        ", insertTime=" + insertTime +
+        ", read=" + read +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSystemPrice.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSystemPrice.java
new file mode 100644
index 0000000..49f39b0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSystemPrice.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 服务价格规则
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-08-29
+ */
+@TableName("t_system_price")
+public class TSystemPrice extends Model<TSystemPrice> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 业务类型(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)
+     */
+    private Integer type;
+    /**
+     * 企业id
+     */
+    private Integer companyId;
+    /**
+     * 服务车型id
+     */
+    private Integer serverCarModelId;
+    /**
+     * 价格规则,每个输入框为一个参数{"num1":1,"num2":2.3}
+     */
+    private String content;
+    /**
+     * 运价类型说明
+     */
+    @TableField("fareTypeNote")
+    private String fareTypeNote;
+    /**
+     * 状态(1=正常,2=冻结,3=删除)
+     */
+    private Integer state;
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getServerCarModelId() {
+        return serverCarModelId;
+    }
+
+    public void setServerCarModelId(Integer serverCarModelId) {
+        this.serverCarModelId = serverCarModelId;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getFareTypeNote() {
+        return fareTypeNote;
+    }
+
+    public void setFareTypeNote(String fareTypeNote) {
+        this.fareTypeNote = fareTypeNote;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TSystemPrice{" +
+                "id=" + id +
+                ", type=" + type +
+                ", companyId=" + companyId +
+                ", serverCarModelId=" + serverCarModelId +
+                ", content='" + content + '\'' +
+                ", fareTypeNote='" + fareTypeNote + '\'' +
+                ", state=" + state +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java
new file mode 100644
index 0000000..78249f9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java
@@ -0,0 +1,402 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户信息
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-01
+ */
+@TableName("t_user")
+public class TUser extends Model<TUser> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 企业id
+     */
+    private Integer companyId;
+    /**
+     * 注册ip
+     */
+    private String registIp;
+    /**
+     * 注册地区县code
+     */
+    private String registAreaCode;
+    /**
+     * 手机号
+     */
+    private String phone;
+    /**
+     * 昵称
+     */
+    private String nickName;
+    /**
+     * 头像
+     */
+    private String avatar;
+    /**
+     * 生日
+     */
+    private Date birthday;
+    /**
+     * 性别(1:男,2:女)
+     */
+    private Integer sex;
+    /**
+     * 紧急联系人
+     */
+    private String emergencyContact;
+    /**
+     * 紧急联系电话
+     */
+    private String emergencyContactNumber;
+    /**
+     * 是否实名认证(1=否,2=是)
+     */
+    private Integer isAuth;
+    /**
+     * 真实姓名
+     */
+    private String name;
+    /**
+     * 身份证号
+     */
+    private String idCard;
+    /**
+     * 身份证正面
+     */
+    private String idCardFront;
+    /**
+     * 身份证反面
+     */
+    private String idCardReverse;
+    /**
+     * 历史消费
+     */
+    private BigDecimal consumption;
+    /**
+     * 余额
+     */
+    private BigDecimal balance;
+    /**
+     * 积分
+     */
+    private Integer integral;
+    /**
+     * 密码
+     */
+    private String passWord;
+    /**
+     * 微信openid
+     */
+    private String openId;
+    /**
+     * 微信unionid
+     */
+    private String unionid;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 1=正常,2=冻结
+     */
+    private Integer state;
+    /**
+     * 1:创建,2:修改,3:删除
+     */
+    private String flag;
+    private Date insertTime;
+    private Integer insertUser;
+    private Date updateTime;
+    private Integer updateUser;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getRegistIp() {
+        return registIp;
+    }
+
+    public void setRegistIp(String registIp) {
+        this.registIp = registIp;
+    }
+
+    public String getRegistAreaCode() {
+        return registAreaCode;
+    }
+
+    public void setRegistAreaCode(String registAreaCode) {
+        this.registAreaCode = registAreaCode;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getNickName() {
+        return nickName;
+    }
+
+    public void setNickName(String nickName) {
+        this.nickName = nickName;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public Integer getSex() {
+        return sex;
+    }
+
+    public void setSex(Integer sex) {
+        this.sex = sex;
+    }
+
+    public String getEmergencyContact() {
+        return emergencyContact;
+    }
+
+    public void setEmergencyContact(String emergencyContact) {
+        this.emergencyContact = emergencyContact;
+    }
+
+    public String getEmergencyContactNumber() {
+        return emergencyContactNumber;
+    }
+
+    public void setEmergencyContactNumber(String emergencyContactNumber) {
+        this.emergencyContactNumber = emergencyContactNumber;
+    }
+
+    public Integer getIsAuth() {
+        return isAuth;
+    }
+
+    public void setIsAuth(Integer isAuth) {
+        this.isAuth = isAuth;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIdCard() {
+        return idCard;
+    }
+
+    public void setIdCard(String idCard) {
+        this.idCard = idCard;
+    }
+
+    public String getIdCardFront() {
+        return idCardFront;
+    }
+
+    public void setIdCardFront(String idCardFront) {
+        this.idCardFront = idCardFront;
+    }
+
+    public String getIdCardReverse() {
+        return idCardReverse;
+    }
+
+    public void setIdCardReverse(String idCardReverse) {
+        this.idCardReverse = idCardReverse;
+    }
+
+    public BigDecimal getConsumption() {
+        return consumption;
+    }
+
+    public void setConsumption(BigDecimal consumption) {
+        this.consumption = consumption;
+    }
+
+    public BigDecimal getBalance() {
+        return balance;
+    }
+
+    public void setBalance(BigDecimal balance) {
+        this.balance = balance;
+    }
+
+    public Integer getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Integer integral) {
+        this.integral = integral;
+    }
+
+    public String getPassWord() {
+        return passWord;
+    }
+
+    public void setPassWord(String passWord) {
+        this.passWord = passWord;
+    }
+
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
+    public String getUnionid() {
+        return unionid;
+    }
+
+    public void setUnionid(String unionid) {
+        this.unionid = unionid;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getFlag() {
+        return flag;
+    }
+
+    public void setFlag(String flag) {
+        this.flag = flag;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getInsertUser() {
+        return insertUser;
+    }
+
+    public void setInsertUser(Integer insertUser) {
+        this.insertUser = insertUser;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Integer getUpdateUser() {
+        return updateUser;
+    }
+
+    public void setUpdateUser(Integer updateUser) {
+        this.updateUser = updateUser;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TUser{" +
+        "id=" + id +
+        ", companyId=" + companyId +
+        ", registIp=" + registIp +
+        ", registAreaCode=" + registAreaCode +
+        ", phone=" + phone +
+        ", nickName=" + nickName +
+        ", avatar=" + avatar +
+        ", birthday=" + birthday +
+        ", sex=" + sex +
+        ", emergencyContact=" + emergencyContact +
+        ", emergencyContactNumber=" + emergencyContactNumber +
+        ", isAuth=" + isAuth +
+        ", name=" + name +
+        ", idCard=" + idCard +
+        ", idCardFront=" + idCardFront +
+        ", idCardReverse=" + idCardReverse +
+        ", consumption=" + consumption +
+        ", balance=" + balance +
+        ", integral=" + integral +
+        ", passWord=" + passWord +
+        ", openId=" + openId +
+        ", unionid=" + unionid +
+        ", remark=" + remark +
+        ", state=" + state +
+        ", flag=" + flag +
+        ", insertTime=" + insertTime +
+        ", insertUser=" + insertUser +
+        ", updateTime=" + updateTime +
+        ", updateUser=" + updateUser +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUserRedPacketRecord.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUserRedPacketRecord.java
new file mode 100644
index 0000000..4a7ffd5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUserRedPacketRecord.java
@@ -0,0 +1,164 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户红包记录
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-07-10
+ */
+@TableName("t_user_red_packet_record")
+public class TUserRedPacketRecord extends Model<TUserRedPacketRecord> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 金额
+     */
+    private BigDecimal money;
+    /**
+     * 过期时间
+     */
+    private Date expirationTime;
+    /**
+     * 获取时间
+     */
+    private Date insertTime;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 状态(0=临时,1=未使用,2=已使用,3=已过期)
+     */
+    private Integer state;
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流)
+     */
+    private Integer orderType;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 活动id
+     */
+    private Integer redPacketActivityId;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    public Date getExpirationTime() {
+        return expirationTime;
+    }
+
+    public void setExpirationTime(Date expirationTime) {
+        this.expirationTime = expirationTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getRedPacketActivityId() {
+        return redPacketActivityId;
+    }
+
+    public void setRedPacketActivityId(Integer redPacketActivityId) {
+        this.redPacketActivityId = redPacketActivityId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TUserRedPacketRecord{" +
+        "id=" + id +
+        ", money=" + money +
+        ", expirationTime=" + expirationTime +
+        ", insertTime=" + insertTime +
+        ", companyId=" + companyId +
+        ", state=" + state +
+        ", orderId=" + orderId +
+        ", orderType=" + orderType +
+        ", userId=" + userId +
+        ", redPacketActivityId=" + redPacketActivityId +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TVerified.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TVerified.java
new file mode 100644
index 0000000..2437731
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TVerified.java
@@ -0,0 +1,137 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 实名认证
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@TableName("t_verified")
+public class TVerified extends Model<TVerified> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 认证姓名
+     */
+    private String name;
+    /**
+     * 身份证号码
+     */
+    private String idcode;
+    /**
+     * 身份证正面照
+     */
+    private String img1;
+    /**
+     * 身份证背面照
+     */
+    private String img2;
+    /**
+     * 认证结果(1=待认证,2=认证通过,3=认证失败)
+     */
+    private Integer state;
+    /**
+     * 请求时间
+     */
+    private Date insertTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIdcode() {
+        return idcode;
+    }
+
+    public void setIdcode(String idcode) {
+        this.idcode = idcode;
+    }
+
+    public String getImg1() {
+        return img1;
+    }
+
+    public void setImg1(String img1) {
+        this.img1 = img1;
+    }
+
+    public String getImg2() {
+        return img2;
+    }
+
+    public void setImg2(String img2) {
+        this.img2 = img2;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TVerified{" +
+        "id=" + id +
+        ", userId=" + userId +
+        ", name=" + name +
+        ", idcode=" + idcode +
+        ", img1=" + img1 +
+        ", img2=" + img2 +
+        ", state=" + state +
+        ", insertTime=" + insertTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TVersionManagement.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TVersionManagement.java
new file mode 100644
index 0000000..e66ac39
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TVersionManagement.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 版本管理
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+@TableName("t_version_management")
+public class TVersionManagement extends Model<TVersionManagement> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 包路径
+     */
+    private String url;
+    /**
+     * 版本号
+     */
+    private String version;
+    /**
+     * 更新公告
+     */
+    private String content;
+    /**
+     * 是否强制升级(1=是  2=否)
+     */
+    private Integer mandatory;
+    /**
+     * 更新时间
+     */
+    private Date insertTime;
+    /**
+     * 类型(1=安卓,2=ios)
+     */
+    private Integer type;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Integer getMandatory() {
+        return mandatory;
+    }
+
+    public void setMandatory(Integer mandatory) {
+        this.mandatory = mandatory;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "TVersionManagement{" +
+        "id=" + id +
+        ", url=" + url +
+        ", version=" + version +
+        ", content=" + content +
+        ", mandatory=" + mandatory +
+        ", insertTime=" + insertTime +
+        ", type=" + type +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TransactionDetails.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TransactionDetails.java
new file mode 100644
index 0000000..3f1ee5c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TransactionDetails.java
@@ -0,0 +1,164 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 交易明细
+ */
+@TableName("t_pub_transaction_details")
+public class TransactionDetails {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 对象id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+    /**
+     * 金额/积分
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 状态(1=增加,2=减少)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 类型(1=金额,2:积分)
+     */
+    @TableField("type")
+    private Integer type;
+    /**
+     * 类型(1=用户,2=司机)
+     */
+    @TableField("userType")
+    private Integer userType;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 订单id
+     */
+    @TableField("orderId")
+    private Integer orderId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getUserType() {
+        return userType;
+    }
+
+    public void setUserType(Integer userType) {
+        this.userType = userType;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    @Override
+    public String toString() {
+        return "TransactionDetails{" +
+                "id=" + id +
+                ", userId=" + userId +
+                ", insertTime=" + insertTime +
+                ", remark='" + remark + '\'' +
+                ", money=" + money +
+                ", state=" + state +
+                ", type=" + type +
+                ", userType=" + userType +
+                ", orderType=" + orderType +
+                ", orderId=" + orderId +
+                '}';
+    }
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java
new file mode 100644
index 0000000..64b5373
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/User.java
@@ -0,0 +1,268 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 管理员表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+@TableName("sys_user")
+public class User extends Model<User> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+	@TableId(value="id", type= IdType.AUTO)
+	private Integer id;
+    /**
+     * 头像
+     */
+	private String avatar;
+    /**
+     * 账号
+     */
+	private String account;
+    /**
+     * 密码
+     */
+	private String password;
+	/**
+	 * 密码修改时间
+	 */
+	private Date passWordUpdate;
+    /**
+     * md5密码盐
+     */
+	private String salt;
+    /**
+     * 名字
+     */
+	private String name;
+    /**
+     * 生日
+     */
+	private Date birthday;
+    /**
+     * 性别(1:男 2:女)
+     */
+	private Integer sex;
+    /**
+     * 电子邮件
+     */
+	private String email;
+    /**
+     * 电话
+     */
+	private String phone;
+    /**
+     * 角色id
+     */
+	private String roleid;
+    /**
+     * 部门id
+     */
+	private Integer deptid;
+    /**
+     * 状态(1:启用  2:冻结  3:删除)
+     */
+	private Integer status;
+    /**
+     * 创建时间
+     */
+	private Date createtime;
+    /**
+     * 保留字段
+     */
+	private Integer version;
+	/**
+	 * 角色类型 1=平台 2=分公司 3=加盟商
+	 */
+	private Integer roleType;
+	/**
+	 * 对象ID
+	 */
+	private Integer objectId;
+
+	public Integer getRoleType() {
+		return roleType;
+	}
+
+	public void setRoleType(Integer roleType) {
+		this.roleType = roleType;
+	}
+
+	public Integer getObjectId() {
+		return objectId;
+	}
+
+	public void setObjectId(Integer objectId) {
+		this.objectId = objectId;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getAvatar() {
+		return avatar;
+	}
+
+	public void setAvatar(String avatar) {
+		this.avatar = avatar;
+	}
+
+	public String getAccount() {
+		return account;
+	}
+
+	public void setAccount(String account) {
+		this.account = account;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public Date getPassWordUpdate() {
+		return passWordUpdate;
+	}
+
+	public void setPassWordUpdate(Date passWordUpdate) {
+		this.passWordUpdate = passWordUpdate;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getSalt() {
+		return salt;
+	}
+
+	public void setSalt(String salt) {
+		this.salt = salt;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Date getBirthday() {
+		return birthday;
+	}
+
+	public void setBirthday(Date birthday) {
+		this.birthday = birthday;
+	}
+
+	public Integer getSex() {
+		return sex;
+	}
+
+	public void setSex(Integer sex) {
+		this.sex = sex;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public String getPhone() {
+		return phone;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public String getRoleid() {
+		return roleid;
+	}
+
+	public void setRoleid(String roleid) {
+		this.roleid = roleid;
+	}
+
+	public Integer getDeptid() {
+		return deptid;
+	}
+
+	public void setDeptid(Integer deptid) {
+		this.deptid = deptid;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public Date getCreatetime() {
+		return createtime;
+	}
+
+	public void setCreatetime(Date createtime) {
+		this.createtime = createtime;
+	}
+
+	public Integer getVersion() {
+		return version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	@Override
+	protected Serializable pkVal() {
+		return this.id;
+	}
+
+	@Override
+	public String toString() {
+		return "User{" +
+			"id=" + id +
+			", avatar=" + avatar +
+			", account=" + account +
+			", password=" + password +
+			", salt=" + salt +
+			", name=" + name +
+			", birthday=" + birthday +
+			", sex=" + sex +
+			", email=" + email +
+			", phone=" + phone +
+			", roleid=" + roleid +
+			", deptid=" + deptid +
+			", status=" + status +
+			", createtime=" + createtime +
+			", version=" + version +
+			"}";
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivity.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivity.java
new file mode 100644
index 0000000..29708b4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivity.java
@@ -0,0 +1,146 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户活动主表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@TableName("t_user_activity")
+public class UserActivity extends Model<UserActivity> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 活动名称
+     */
+    private String name;
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    private Date endTime;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 状态(1=待审核,2=驳回,3=通过,)
+     */
+    private Integer status;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 1=平台 2=分公司 3=加盟商
+     */
+    private Integer companyType;
+
+    private Integer companyId;
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getCompanyType() {
+        return companyType;
+    }
+
+    public void setCompanyType(Integer companyType) {
+        this.companyType = companyType;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivity{" +
+        "id=" + id +
+        ", name=" + name +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        ", insertTime=" + insertTime +
+        ", status=" + status +
+        ", remark=" + remark +
+        ", companyType=" + companyType +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityBalance.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityBalance.java
new file mode 100644
index 0000000..361ce53
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityBalance.java
@@ -0,0 +1,313 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户活动-充值
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@TableName("t_user_activity_balance")
+public class UserActivityBalance extends Model<UserActivityBalance> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 1=不启用,2=启用
+     */
+    private Integer enable;
+    /**
+     * 用户活动主表id
+     */
+    private Integer userActivityId;
+    /**
+     * 充值金额
+     */
+    private Double money;
+    /**
+     * 通用优惠券数量
+     */
+    private Integer generalNum;
+    /**
+     * 通用优惠券id
+     */
+    private Integer generalCouponId;
+    /**
+     * 专车优惠券数量
+     */
+    private Integer specialNum;
+    /**
+     * 专车优惠券id
+     */
+    private Integer specialCouponId;
+    /**
+     * 出租车优惠券数量
+     */
+    private Integer taxiNum;
+    /**
+     * 出租车优惠券id
+     */
+    private Integer taxiCouponId;
+    /**
+     * 城际优惠券数量
+     */
+    private Integer intercityNum;
+    /**
+     * 城际优惠券id
+     */
+    private Integer intercityCouponId;
+    /**
+     * 添加时间
+     */
+    private Date insertTime;
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    private Date endTime;
+    /**
+     * 有效天数
+     */
+    private  Integer effective;
+    /**
+     * 通用券金额
+     */
+    private Double generalCouponMoney;
+    /**
+     * 专车券金额
+     */
+    private Double specialCouponMoney;
+    /**
+     * 出租车券金额
+     */
+    private Double taxiCouponMoney;
+    /**
+     * 城际券金额
+     */
+    private Double intercityCouponMoney;
+    /**
+     * 总金额上限
+     * @return
+     */
+    private Double totalPrice;
+    /**
+     * 剩余总金额上限
+     * @return
+     */
+    private Double lavePrice;
+
+    public Integer getEffective() {
+        return effective;
+    }
+
+    public void setEffective(Integer effective) {
+        this.effective = effective;
+    }
+
+    public Double getGeneralCouponMoney() {
+        return generalCouponMoney;
+    }
+
+    public void setGeneralCouponMoney(Double generalCouponMoney) {
+        this.generalCouponMoney = generalCouponMoney;
+    }
+
+    public Double getSpecialCouponMoney() {
+        return specialCouponMoney;
+    }
+
+    public void setSpecialCouponMoney(Double specialCouponMoney) {
+        this.specialCouponMoney = specialCouponMoney;
+    }
+
+    public Double getTaxiCouponMoney() {
+        return taxiCouponMoney;
+    }
+
+    public void setTaxiCouponMoney(Double taxiCouponMoney) {
+        this.taxiCouponMoney = taxiCouponMoney;
+    }
+
+    public Double getIntercityCouponMoney() {
+        return intercityCouponMoney;
+    }
+
+    public void setIntercityCouponMoney(Double intercityCouponMoney) {
+        this.intercityCouponMoney = intercityCouponMoney;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    public Integer getUserActivityId() {
+        return userActivityId;
+    }
+
+    public void setUserActivityId(Integer userActivityId) {
+        this.userActivityId = userActivityId;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Integer getGeneralNum() {
+        return generalNum;
+    }
+
+    public void setGeneralNum(Integer generalNum) {
+        this.generalNum = generalNum;
+    }
+
+    public Integer getGeneralCouponId() {
+        return generalCouponId;
+    }
+
+    public void setGeneralCouponId(Integer generalCouponId) {
+        this.generalCouponId = generalCouponId;
+    }
+
+    public Integer getSpecialNum() {
+        return specialNum;
+    }
+
+    public void setSpecialNum(Integer specialNum) {
+        this.specialNum = specialNum;
+    }
+
+    public Integer getSpecialCouponId() {
+        return specialCouponId;
+    }
+
+    public void setSpecialCouponId(Integer specialCouponId) {
+        this.specialCouponId = specialCouponId;
+    }
+
+    public Integer getTaxiNum() {
+        return taxiNum;
+    }
+
+    public void setTaxiNum(Integer taxiNum) {
+        this.taxiNum = taxiNum;
+    }
+
+    public Integer getTaxiCouponId() {
+        return taxiCouponId;
+    }
+
+    public void setTaxiCouponId(Integer taxiCouponId) {
+        this.taxiCouponId = taxiCouponId;
+    }
+
+    public Integer getIntercityNum() {
+        return intercityNum;
+    }
+
+    public void setIntercityNum(Integer intercityNum) {
+        this.intercityNum = intercityNum;
+    }
+
+    public Integer getIntercityCouponId() {
+        return intercityCouponId;
+    }
+
+    public void setIntercityCouponId(Integer intercityCouponId) {
+        this.intercityCouponId = intercityCouponId;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Double getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(Double totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    public Double getLavePrice() {
+        return lavePrice;
+    }
+
+    public void setLavePrice(Double lavePrice) {
+        this.lavePrice = lavePrice;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivityBalance{" +
+        "id=" + id +
+        ", enable=" + enable +
+        ", userActivityId=" + userActivityId +
+        ", money=" + money +
+        ", generalNum=" + generalNum +
+        ", generalCouponId=" + generalCouponId +
+        ", specialNum=" + specialNum +
+        ", specialCouponId=" + specialCouponId +
+        ", taxiNum=" + taxiNum +
+        ", taxiCouponId=" + taxiCouponId +
+        ", intercityNum=" + intercityNum +
+        ", intercityCouponId=" + intercityCouponId +
+        ", insertTime=" + insertTime +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount1.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount1.java
new file mode 100644
index 0000000..e109b13
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount1.java
@@ -0,0 +1,137 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户活动-折扣1
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@TableName("t_user_activity_discount1")
+public class UserActivityDiscount1 extends Model<UserActivityDiscount1> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户活动主表id
+     */
+    private Integer userActivityId;
+    /**
+     * 专车打折(8.5)
+     */
+    private Double special;
+    /**
+     * 出租车打折(8.5)
+     */
+    private Double taxi;
+    /**
+     * 小件物流打折(8.5)
+     */
+    private Double logistics;
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    private Date endTime;
+    /**
+     * 1=不启用,2=启用
+     */
+    private Integer enable;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserActivityId() {
+        return userActivityId;
+    }
+
+    public void setUserActivityId(Integer userActivityId) {
+        this.userActivityId = userActivityId;
+    }
+
+    public Double getSpecial() {
+        return special;
+    }
+
+    public void setSpecial(Double special) {
+        this.special = special;
+    }
+
+    public Double getTaxi() {
+        return taxi;
+    }
+
+    public void setTaxi(Double taxi) {
+        this.taxi = taxi;
+    }
+
+    public Double getLogistics() {
+        return logistics;
+    }
+
+    public void setLogistics(Double logistics) {
+        this.logistics = logistics;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivityDiscount1{" +
+        "id=" + id +
+        ", userActivityId=" + userActivityId +
+        ", special=" + special +
+        ", taxi=" + taxi +
+        ", logistics=" + logistics +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        ", enable=" + enable +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount2.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount2.java
new file mode 100644
index 0000000..abce17c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityDiscount2.java
@@ -0,0 +1,124 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户活动-折扣2(跨城)
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@TableName("t_user_activity_discount2")
+public class UserActivityDiscount2 extends Model<UserActivityDiscount2> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户活动主表id
+     */
+    private Integer userActivityId;
+    /**
+     * 跨城线路id
+     */
+    private Integer lineId;
+    /**
+     * 折扣(8.5)
+     */
+    private Double discount;
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    private Date endTime;
+    /**
+     * 1=不启用,2=启用
+     */
+    private Integer enable;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserActivityId() {
+        return userActivityId;
+    }
+
+    public void setUserActivityId(Integer userActivityId) {
+        this.userActivityId = userActivityId;
+    }
+
+    public Integer getLineId() {
+        return lineId;
+    }
+
+    public void setLineId(Integer lineId) {
+        this.lineId = lineId;
+    }
+
+    public Double getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(Double discount) {
+        this.discount = discount;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivityDiscount2{" +
+        "id=" + id +
+        ", userActivityId=" + userActivityId +
+        ", lineId=" + lineId +
+        ", discount=" + discount +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        ", enable=" + enable +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityInvite.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityInvite.java
new file mode 100644
index 0000000..865c1f5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityInvite.java
@@ -0,0 +1,174 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户活动-邀请
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@TableName("t_user_activity_invite")
+public class UserActivityInvite extends Model<UserActivityInvite> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户活动主表id
+     */
+    private Integer userActivityId;
+    /**
+     * 优惠券id
+     */
+    private Integer couponId;
+    /**
+     * 优惠券总数量
+     */
+    private Integer totalNum;
+    /**
+     * 剩余数量
+     */
+    private Integer laveNum;
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    private Date endTime;
+    /**
+     * 1=不启用,2=启用
+     */
+    private Integer enable;
+    /**
+     * 有效天数
+     */
+    private Integer effective;
+    /**
+     * 总金额上限
+     * @return
+     */
+    private Double totalPrice;
+    /**
+     * 剩余总金额上限
+     * @return
+     */
+    private Double lavePrice;
+
+    public Integer getEffective() {
+        return effective;
+    }
+
+    public void setEffective(Integer effective) {
+        this.effective = effective;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserActivityId() {
+        return userActivityId;
+    }
+
+    public void setUserActivityId(Integer userActivityId) {
+        this.userActivityId = userActivityId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getTotalNum() {
+        return totalNum;
+    }
+
+    public void setTotalNum(Integer totalNum) {
+        this.totalNum = totalNum;
+    }
+
+    public Integer getLaveNum() {
+        return laveNum;
+    }
+
+    public void setLaveNum(Integer laveNum) {
+        this.laveNum = laveNum;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    public Double getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(Double totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    public Double getLavePrice() {
+        return lavePrice;
+    }
+
+    public void setLavePrice(Double lavePrice) {
+        this.lavePrice = lavePrice;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivityInvite{" +
+        "id=" + id +
+        ", userActivityId=" + userActivityId +
+        ", couponId=" + couponId +
+        ", totalNum=" + totalNum +
+        ", laveNum=" + laveNum +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        ", enable=" + enable +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRedenvelope.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRedenvelope.java
new file mode 100644
index 0000000..51809fb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRedenvelope.java
@@ -0,0 +1,163 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户活动-红包
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@TableName("t_user_activity_redenvelope")
+public class UserActivityRedenvelope extends Model<UserActivityRedenvelope> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户活动主表id
+     */
+    private Integer userActivityId;
+    /**
+     * 红包id
+     */
+    private Integer redEnvelopeId;
+    /**
+     * 总金额
+     */
+    private Double totalMoney;
+    /**
+     * 剩余金额
+     */
+    private Double laveMoney;
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    private Date endTime;
+    /**
+     * 1=不启用,2=启用
+     */
+    private Integer enable;
+    /**
+     * 总金额上限
+     * @return
+     */
+    private Double totalPrice;
+    /**
+     * 剩余总金额上限
+     * @return
+     */
+    private Double lavePrice;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserActivityId() {
+        return userActivityId;
+    }
+
+    public void setUserActivityId(Integer userActivityId) {
+        this.userActivityId = userActivityId;
+    }
+
+    public Integer getRedEnvelopeId() {
+        return redEnvelopeId;
+    }
+
+    public void setRedEnvelopeId(Integer redEnvelopeId) {
+        this.redEnvelopeId = redEnvelopeId;
+    }
+
+    public Double getTotalMoney() {
+        return totalMoney;
+    }
+
+    public void setTotalMoney(Double totalMoney) {
+        this.totalMoney = totalMoney;
+    }
+
+    public Double getLaveMoney() {
+        return laveMoney;
+    }
+
+    public void setLaveMoney(Double laveMoney) {
+        this.laveMoney = laveMoney;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    public Double getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(Double totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    public Double getLavePrice() {
+        return lavePrice;
+    }
+
+    public void setLavePrice(Double lavePrice) {
+        this.lavePrice = lavePrice;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivityRedenvelope{" +
+        "id=" + id +
+        ", userActivityId=" + userActivityId +
+        ", redEnvelopeId=" + redEnvelopeId +
+        ", totalMoney=" + totalMoney +
+        ", laveMoney=" + laveMoney +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        ", enable=" + enable +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRegistered.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRegistered.java
new file mode 100644
index 0000000..dd0ee52
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserActivityRegistered.java
@@ -0,0 +1,174 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户活动-注册
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@TableName("t_user_activity_registered")
+public class UserActivityRegistered extends Model<UserActivityRegistered> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 用户活动id
+     */
+    private Integer userActivityId;
+    /**
+     * 优惠券id
+     */
+    private Integer couponId;
+    /**
+     * 优惠券总数
+     */
+    private Integer totalNum;
+    /**
+     * 剩余数量
+     */
+    private Integer laveNum;
+    /**
+     * 有效期开始时间
+     */
+    private Date startTime;
+    /**
+     * 有效期结束时间
+     */
+    private Date endTime;
+    /**
+     * 1=不启用,2=启用
+     */
+    private Integer enable;
+    /**
+     * 有效天数
+     */
+    private Integer effective;
+    /**
+     * 总金额上限
+     * @return
+     */
+    private Double totalPrice;
+    /**
+     * 剩余总金额上限
+     * @return
+     */
+    private Double lavePrice;
+
+    public Integer getEffective() {
+        return effective;
+    }
+
+    public void setEffective(Integer effective) {
+        this.effective = effective;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserActivityId() {
+        return userActivityId;
+    }
+
+    public void setUserActivityId(Integer userActivityId) {
+        this.userActivityId = userActivityId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getTotalNum() {
+        return totalNum;
+    }
+
+    public void setTotalNum(Integer totalNum) {
+        this.totalNum = totalNum;
+    }
+
+    public Integer getLaveNum() {
+        return laveNum;
+    }
+
+    public void setLaveNum(Integer laveNum) {
+        this.laveNum = laveNum;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Integer enable) {
+        this.enable = enable;
+    }
+
+    public Double getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(Double totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    public Double getLavePrice() {
+        return lavePrice;
+    }
+
+    public void setLavePrice(Double lavePrice) {
+        this.lavePrice = lavePrice;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "UserActivityRegistered{" +
+        "id=" + id +
+        ", userActivityId=" + userActivityId +
+        ", couponId=" + couponId +
+        ", totalNum=" + totalNum +
+        ", laveNum=" + laveNum +
+        ", startTime=" + startTime +
+        ", endTime=" + endTime +
+        ", enable=" + enable +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserCouponRecord.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserCouponRecord.java
new file mode 100644
index 0000000..7150c73
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserCouponRecord.java
@@ -0,0 +1,215 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 用户优惠券记录
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@TableName("t_user_coupon_record")
+public class UserCouponRecord extends Model<UserCouponRecord> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 金额
+     */
+    private BigDecimal money;
+    /**
+     * 满减金额
+     */
+    private BigDecimal fullMoney;
+    /**
+     * 过期时间
+     */
+    private Date expirationTime;
+    /**
+     * 获取时间
+     */
+    private Date insertTime;
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+    /**
+     * 状态(1=未使用,2=已使用,3=已过期)
+     */
+    private Integer state;
+    /**
+     * 使用结束时间
+     */
+    private Date endTime;
+    /**
+     * 优惠券使用类型(0=通用,1=专车,2=出租车,3=城际,4=小件物流)
+     */
+    private Integer couponUseType;
+    /**
+     * 优惠券类型(1=抵扣,2=满减)
+     */
+    private Integer couponType;
+    /**
+     * 用户id
+     */
+    private Integer userId;
+    /**
+     * 优惠券发放id
+     */
+    private Integer couponId;
+    /**
+     * 活动id
+     */
+    private Integer couponActivityId;
+    /**
+     * 活动类型(1=赠送活动,2=注册,3=邀请,4=充值)
+     */
+    private Integer activityType;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public BigDecimal getMoney() {
+        return money;
+    }
+
+    public void setMoney(BigDecimal money) {
+        this.money = money;
+    }
+
+    public BigDecimal getFullMoney() {
+        return fullMoney;
+    }
+
+    public void setFullMoney(BigDecimal fullMoney) {
+        this.fullMoney = fullMoney;
+    }
+
+    public Date getExpirationTime() {
+        return expirationTime;
+    }
+
+    public void setExpirationTime(Date expirationTime) {
+        this.expirationTime = expirationTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getCouponUseType() {
+        return couponUseType;
+    }
+
+    public void setCouponUseType(Integer couponUseType) {
+        this.couponUseType = couponUseType;
+    }
+
+    public Integer getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(Integer couponType) {
+        this.couponType = couponType;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getCouponActivityId() {
+        return couponActivityId;
+    }
+
+    public void setCouponActivityId(Integer couponActivityId) {
+        this.couponActivityId = couponActivityId;
+    }
+
+    public Integer getActivityType() {
+        return activityType;
+    }
+
+    public void setActivityType(Integer activityType) {
+        this.activityType = activityType;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "UserCouponRecord{" +
+        "id=" + id +
+        ", money=" + money +
+        ", fullMoney=" + fullMoney +
+        ", expirationTime=" + expirationTime +
+        ", insertTime=" + insertTime +
+        ", companyId=" + companyId +
+        ", state=" + state +
+        ", couponUseType=" + couponUseType +
+        ", couponType=" + couponType +
+        ", userId=" + userId +
+        ", couponId=" + couponId +
+        ", couponActivityId=" + couponActivityId +
+        ", activityType=" + activityType +
+        "}";
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserRedPacketRecord.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserRedPacketRecord.java
new file mode 100644
index 0000000..5f2fa60
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserRedPacketRecord.java
@@ -0,0 +1,175 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 用户红包记录
+ */
+@TableName("t_user_red_packet_record")
+public class UserRedPacketRecord {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    @TableField("id")
+    private Integer id;
+    /**
+     * 金额
+     */
+    @TableField("money")
+    private Double money;
+    /**
+     * 过期时间
+     */
+    @TableField("expirationTime")
+    private Date expirationTime;
+    /**
+     * 添加时间
+     */
+    @TableField("insertTime")
+    private Date insertTime;
+    /**
+     * 企业id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+    /**
+     * 状态(0=临时,1=未使用,2=已使用,3=已过期)
+     */
+    @TableField("state")
+    private Integer state;
+    /**
+     * 使用结束时间
+     */
+    private Date endTime;
+    /**
+     * 订单id(获取红包的订单)
+     */
+    @TableField("orderId")
+    private Integer orderId;
+    /**
+     * 订单类型(1=专车,2=出租车,3=城际,4=小件物流)
+     */
+    @TableField("orderType")
+    private Integer orderType;
+    /**
+     * 用户id
+     */
+    @TableField("userId")
+    private Integer userId;
+    /**
+     * 活动id
+     * @return
+     */
+    @TableField("redPacketActivityId")
+    private Integer redPacketActivityId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Double getMoney() {
+        return money;
+    }
+
+    public void setMoney(Double money) {
+        this.money = money;
+    }
+
+    public Date getExpirationTime() {
+        return expirationTime;
+    }
+
+    public void setExpirationTime(Date expirationTime) {
+        this.expirationTime = expirationTime;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public Integer getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Integer orderId) {
+        this.orderId = orderId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getRedPacketActivityId() {
+        return redPacketActivityId;
+    }
+
+    public void setRedPacketActivityId(Integer redPacketActivityId) {
+        this.redPacketActivityId = redPacketActivityId;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    @Override
+    public String toString() {
+        return "UserRedPacketRecord{" +
+                "id=" + id +
+                ", money=" + money +
+                ", expirationTime=" + expirationTime +
+                ", insertTime=" + insertTime +
+                ", companyId=" + companyId +
+                ", state=" + state +
+                ", orderId=" + orderId +
+                ", orderType=" + orderType +
+                ", userId=" + userId +
+                ", redPacketActivityId=" + redPacketActivityId +
+                '}';
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDeptService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDeptService.java
new file mode 100644
index 0000000..fb02331
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDeptService.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Dept;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 部门服务
+ *
+ * @author fengshuonan
+ * @date 2017-04-27 17:00
+ */
+public interface IDeptService extends IService<Dept> {
+
+    /**
+     * 删除部门
+     */
+    void deleteDept(Integer deptId);
+
+    /**
+     * 获取ztree的节点列表
+     */
+    List<ZTreeNode> tree();
+
+    /**
+     * 获取所有部门列表
+     */
+    List<Map<String, Object>> list(@Param("condition") String condition);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDictService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDictService.java
new file mode 100644
index 0000000..6e3c3c4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDictService.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Dict;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典服务
+ *
+ * @author fengshuonan
+ * @date 2017-04-27 17:00
+ */
+public interface IDictService extends IService<Dict> {
+
+    /**
+     * 添加字典
+     */
+    void addDict(String dictCode,String dictName,String dictTips, String dictValues);
+
+    /**
+     * 编辑字典
+     */
+    void editDict(Integer dictId,String dictCode, String dictName,String dictTips, String dicts);
+
+    /**
+     * 删除字典
+     */
+    void delteDict(Integer dictId);
+
+    /**
+     * 根据编码获取词典列表
+     */
+    List<Dict> selectByCode(@Param("code") String code);
+
+    /**
+     * 根据父类编码获取词典列表
+     */
+    List<Dict> selectByParentCode(@Param("code") String code);
+
+    /**
+     * 查询字典列表
+     */
+    List<Map<String, Object>> list(@Param("condition") String conditiion);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityHistoryService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityHistoryService.java
new file mode 100644
index 0000000..e52bfd7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityHistoryService.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.DriverActivityHistory;
+import com.baomidou.mybatisplus.service.IService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机完成活动记录 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface IDriverActivityHistoryService extends IService<DriverActivityHistory> {
+    /**
+     * 获取领取记录列表
+     * @param page
+     * @param activityId
+     * @param type
+     * @return
+     */
+    List<Map<String,Object>> getList(Page<Map<String, Object>> page,Integer activityId,Integer type);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityOnlineService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityOnlineService.java
new file mode 100644
index 0000000..37fc3cf
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityOnlineService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.DriverActivityOnline;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 司机活动-在线 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface IDriverActivityOnlineService extends IService<DriverActivityOnline> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityOrderService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityOrderService.java
new file mode 100644
index 0000000..452b295
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityOrderService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.DriverActivityOrder;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 司机活动-订单 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface IDriverActivityOrderService extends IService<DriverActivityOrder> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityRegisteredService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityRegisteredService.java
new file mode 100644
index 0000000..ee3cc1d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityRegisteredService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.DriverActivityRegistered;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 司机活动-注册 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface IDriverActivityRegisteredService extends IService<DriverActivityRegistered> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityService.java
new file mode 100644
index 0000000..eefcc58
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverActivityService.java
@@ -0,0 +1,45 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.DriverActivity;
+import com.baomidou.mybatisplus.service.IService;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机活动主表 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface IDriverActivityService extends IService<DriverActivity> {
+    /**
+     * 获取司机活动列表
+     * @param page
+     * @param beginTime
+     * @param endTime
+     * @param name
+     * @return
+     */
+    List<Map<String,Object>> getList(Page<Map<String, Object>> page,
+                                     String beginTime,
+                                     String endTime,
+                                     String name,
+                                     Integer companyType,
+                                     Integer companyId);
+
+    void insertOrUpdate(Integer id,String staTime, String startTime, String num1, Double num2
+            , Double num3
+            , Integer num4
+            , Double num5
+            , Integer num6
+            , Double num7
+            , Integer num8
+            , Double num9
+            , Integer num10
+            , Double num11);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverOnlineService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverOnlineService.java
new file mode 100644
index 0000000..4c91b67
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IDriverOnlineService.java
@@ -0,0 +1,24 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.DriverOnline;
+
+import java.util.Map;
+
+public interface IDriverOnlineService extends IService<DriverOnline> {
+
+
+    /**
+     * 获取列表数据
+     * @param name
+     * @param phone
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryOnlineDriver(String name, String phone, Integer offset, Integer limit) throws Exception;
+
+
+    int queryOnlineDriverCount(String name, String phone);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IGDInterfaceService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IGDInterfaceService.java
new file mode 100644
index 0000000..e40f4c2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IGDInterfaceService.java
@@ -0,0 +1,10 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.GDInterface;
+
+public interface IGDInterfaceService extends IService<GDInterface> {
+
+
+    void saveData(String name, String explanation);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIncomeService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIncomeService.java
new file mode 100644
index 0000000..e1a2fd3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IIncomeService.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Income;
+
+public interface IIncomeService extends IService<Income> {
+
+
+    /**
+     * 添加数据
+     * @param userType
+     * @param objectId
+     * @param type
+     * @param incomeId
+     * @param money
+     * @throws Exception
+     */
+    void saveData(Integer userType, Integer objectId, Integer type, Integer incomeId, Integer orderType, Double money) throws Exception;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILoginLogService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILoginLogService.java
new file mode 100644
index 0000000..d0f4290
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ILoginLogService.java
@@ -0,0 +1,24 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 登录记录 服务类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+public interface ILoginLogService extends IService<LoginLog> {
+
+    /**
+     * 获取登录日志列表
+     */
+    List<Map<String, Object>> getLoginLogs(Page<LoginLog> page, String beginTime, String endTime, String logName, String orderByField, boolean asc);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IMenuService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IMenuService.java
new file mode 100644
index 0000000..b976165
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IMenuService.java
@@ -0,0 +1,94 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.core.node.MenuNode;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Menu;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 菜单服务
+ *
+ * @author fengshuonan
+ * @date 2017-05-05 22:19
+ */
+public interface IMenuService extends IService<Menu> {
+
+    /**
+     * 删除菜单
+     *
+     * @author stylefeng
+     * @Date 2017/5/5 22:20
+     */
+    void delMenu(Long menuId);
+
+    /**
+     * 删除菜单包含所有子菜单
+     *
+     * @author stylefeng
+     * @Date 2017/6/13 22:02
+     */
+    void delMenuContainSubMenus(Long menuId);
+
+    /**
+     * 根据条件查询菜单
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Map<String, Object>> selectMenus(@Param("condition") String condition, @Param("level") String level);
+
+    /**
+     * 根据条件查询菜单
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Long> getMenuIdsByRoleId(@Param("roleId") Integer roleId);
+
+    /**
+     * 获取菜单列表树
+     *
+     * @return
+     * @date 2017年2月19日 下午1:33:51
+     */
+    List<ZTreeNode> menuTreeList();
+
+    /**
+     * 获取菜单列表树
+     *
+     * @return
+     * @date 2017年2月19日 下午1:33:51
+     */
+    List<ZTreeNode> menuTreeListByMenuIds(List<Long> menuIds);
+
+    /**
+     * 删除menu关联的relation
+     *
+     * @param menuId
+     * @return
+     * @date 2017年2月19日 下午4:10:59
+     */
+    int deleteRelationByMenu(Long menuId);
+
+    /**
+     * 获取资源url通过角色id
+     *
+     * @param roleId
+     * @return
+     * @date 2017年2月19日 下午7:12:38
+     */
+    List<String> getResUrlsByRoleId(Integer roleId);
+
+    /**
+     * 根据角色获取菜单
+     *
+     * @param roleIds
+     * @return
+     * @date 2017年2月19日 下午10:35:40
+     */
+    List<MenuNode> getMenusByRoleIds(List<Integer> roleIds);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INoticeService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INoticeService.java
new file mode 100644
index 0000000..ced40b4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/INoticeService.java
@@ -0,0 +1,23 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Notice;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 通知表 服务类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+public interface INoticeService extends IService<Notice> {
+
+    /**
+     * 获取通知列表
+     */
+    List<Map<String, Object>> list(String condition);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOperationLogService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOperationLogService.java
new file mode 100644
index 0000000..9c37b6b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IOperationLogService.java
@@ -0,0 +1,24 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 操作日志 服务类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+public interface IOperationLogService extends IService<OperationLog> {
+
+    /**
+     * 获取操作日志列表
+     */
+    List<Map<String, Object>> getOperationLogs(Page<OperationLog> page, String beginTime, String endTime, String logName, String s, String orderByField, boolean asc);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPaymentRecordService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPaymentRecordService.java
new file mode 100644
index 0000000..3eba161
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IPaymentRecordService.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.PaymentRecord;
+
+import java.util.List;
+
+public interface IPaymentRecordService extends IService<PaymentRecord> {
+
+
+    /**
+     * 添加数据
+     * @param orderId       订单id
+     * @param orderType     订单类型
+     * @param payType       支付方式(1=微信,2=支付宝)
+     * @param amount        支付金额
+     * @param code          第三方支付单号
+     * @param state         支付状态(1=待支付,2=已支付)
+     * @throws Exception
+     */
+    Integer saveData(Integer category, Integer userId, Integer type, Integer orderId, Integer orderType, Integer payType,
+                     Double amount, String code, Integer state) throws Exception;
+
+
+    /**
+     * 获取数据
+     * @param orderId
+     * @param payType
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    List<PaymentRecord> query(Integer category, Integer userId, Integer type, Integer orderId, Integer orderType,
+               Integer payType, Integer state) throws Exception;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRelationService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRelationService.java
new file mode 100644
index 0000000..4214359
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRelationService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.Relation;
+
+/**
+ * <p>
+ * 角色和菜单关联表 服务类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+public interface IRelationService extends IService<Relation> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRoleService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRoleService.java
new file mode 100644
index 0000000..cc7332d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IRoleService.java
@@ -0,0 +1,68 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.model.Role;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 角色相关业务
+ *
+ * @author fengshuonan
+ * @Date 2017年1月10日 下午9:11:57
+ */
+public interface IRoleService extends IService<Role> {
+
+    /**
+     * 设置某个角色的权限
+     *
+     * @param roleId 角色id
+     * @param ids    权限的id
+     * @date 2017年2月13日 下午8:26:53
+     */
+    void setAuthority(Integer roleId, String ids);
+
+    /**
+     * 删除角色
+     *
+     * @author stylefeng
+     * @Date 2017/5/5 22:24
+     */
+    void delRoleById(Integer roleId);
+
+    /**
+     * 根据条件查询角色列表
+     *
+     * @return
+     * @date 2017年2月12日 下午9:14:34
+     */
+    List<Map<String, Object>> selectRoles(@Param("condition") String condition);
+
+    /**
+     * 删除某个角色的所有权限
+     *
+     * @param roleId 角色id
+     * @return
+     * @date 2017年2月13日 下午7:57:51
+     */
+    int deleteRolesById(@Param("roleId") Integer roleId);
+
+    /**
+     * 获取角色列表树
+     *
+     * @return
+     * @date 2017年2月18日 上午10:32:04
+     */
+    List<ZTreeNode> roleTreeList();
+
+    /**
+     * 获取角色列表树
+     *
+     * @return
+     * @date 2017年2月18日 上午10:32:04
+     */
+    List<ZTreeNode> roleTreeListByRoleId(String[] roleId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponActivityService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponActivityService.java
new file mode 100644
index 0000000..39cf8c5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponActivityService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.SysCouponActivity;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 系统设置-优惠券活动 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface ISysCouponActivityService extends IService<SysCouponActivity> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponRecordService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponRecordService.java
new file mode 100644
index 0000000..b1b65a7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysCouponRecordService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.SysCouponRecord;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 系统设置-优惠券记录 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-15
+ */
+public interface ISysCouponRecordService extends IService<SysCouponRecord> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysRedPacketRecordService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysRedPacketRecordService.java
new file mode 100644
index 0000000..94a73a2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysRedPacketRecordService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.SysRedPacketRecord;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 系统设置-红包记录 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-13
+ */
+public interface ISysRedPacketRecordService extends IService<SysRedPacketRecord> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAdvertisementService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAdvertisementService.java
new file mode 100644
index 0000000..a34e6d7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAdvertisementService.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TAdvertisement;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 广告 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+public interface ITAdvertisementService extends IService<TAdvertisement> {
+
+    /**
+     * 根据条件查询广告列表
+     * @param page      分页
+     * @param beginTime 开始时间
+     * @param endTime   结束时间
+     * @param type      类型
+     * @param name      名称
+     * @return
+     */
+    List<Map<String,Object>> getAdvertisementList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("type") Integer type,
+                                                  @Param("name") String name);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAgreementService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAgreementService.java
new file mode 100644
index 0000000..74bb705
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITAgreementService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TAgreement;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 平台协议 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-01
+ */
+public interface ITAgreementService extends IService<TAgreement> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarBrandService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarBrandService.java
new file mode 100644
index 0000000..d3409cc
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarBrandService.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCarBrand;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 车辆品牌 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface ITCarBrandService extends IService<TCarBrand> {
+
+    /**
+     * 根据条件查询车辆品牌列表
+     * @return
+     */
+    List<Map<String,Object>> getCarBrandList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("name") String name);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarModelService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarModelService.java
new file mode 100644
index 0000000..061687c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarModelService.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCarModel;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 车辆车型 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface ITCarModelService extends IService<TCarModel> {
+
+    /**
+     * 根据条件查询车辆车型列表
+     * @return
+     */
+    List<Map<String,Object>> getCarModelList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("name") String name);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarService.java
new file mode 100644
index 0000000..29f4fcf
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarService.java
@@ -0,0 +1,47 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCar;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 车辆 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface ITCarService extends IService<TCar> {
+
+    /**
+     * 根据条件查询车辆列表
+     * @param page
+     * @return
+     */
+    List<Map<String,Object>> getCarList(@Param("page") Page<Map<String, Object>> page,
+                                        @Param("roleType") Integer roleType,
+                                        @Param("nowUserId") Integer nowUserId,
+                                        @Param("beginTime") String beginTime,
+                                        @Param("endTime") String endTime,
+                                        @Param("id") String id,
+                                        @Param("brandName") String brandName,
+                                        @Param("modelName") String modelName,
+                                        @Param("carColor") String carColor,
+                                        @Param("serverStr") String serverStr,
+                                        @Param("carLicensePlate") String carLicensePlate,
+                                        @Param("driverName") String driverName,
+                                        @Param("companyName") String companyName,
+                                        @Param("franchiseeName") String franchiseeName);
+
+    /**
+     * 根据条件查询车辆列表不分页
+     * @return
+     */
+    List<Map<String,Object>> getCarListNoPage(@Param("roleType") Integer roleType,
+                                              @Param("nowUserId") Integer nowUserId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarServiceService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarServiceService.java
new file mode 100644
index 0000000..d06f838
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCarServiceService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TCarService;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 车辆经营业务 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface ITCarServiceService extends IService<TCarService> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCompanyCityService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCompanyCityService.java
new file mode 100644
index 0000000..b03f68f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCompanyCityService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TCompanyCity;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 公司经营地区 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-06
+ */
+public interface ITCompanyCityService extends IService<TCompanyCity> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCompanyService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCompanyService.java
new file mode 100644
index 0000000..f27c79f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITCompanyService.java
@@ -0,0 +1,92 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCompany;
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.apache.ibatis.annotations.Param;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 公司信息表 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-06
+ */
+public interface ITCompanyService extends IService<TCompany> {
+
+    /**
+     * 根据条件查询分公司列表
+     * @return
+     */
+    List<Map<String,Object>> getCompanyList(@Param("page") Page<Map<String, Object>> page,
+                                            @Param("beginTime") String beginTime,
+                                            @Param("endTime") String endTime,
+                                            @Param("name") String name,
+                                            @Param("principalName") String principalName,
+                                            @Param("principalPhone") String principalPhone,
+                                            @Param("adminName") String adminName,
+                                            @Param("adminPhone") String adminPhone,
+                                            @Param("serviceStr") String serviceStr,
+                                            @Param("state") Integer state);
+
+    /**
+     * 根据公司ID获取公司经营区域
+     * @param id
+     * @return
+     */
+    List<Map<String,Object>> getCompanyScopeById(@Param("id") Integer id);
+
+    /**
+     * 根据条件查询加盟商列表
+     * @return
+     */
+    List<Map<String,Object>> getFranchiseeList(@Param("page") Page<Map<String, Object>> page,
+                                               @Param("beginTime") String beginTime,
+                                               @Param("endTime") String endTime,
+                                               @Param("name") String name,
+                                               @Param("account") String account,
+                                               @Param("principalName") String principalName,
+                                               @Param("principalPhone") String principalPhone,
+                                               @Param("serviceStr") String serviceStr,
+                                               @Param("state") Integer state,
+                                               @Param("roleType") Integer roleType,
+                                               @Param("nowUserId") Integer nowUserId);
+
+    /**
+     * 根据企业id查询详情
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    ResultUtil selectCompanyInfoById(String id) throws Exception;
+
+
+    /**
+     * 获取运营汇总数据
+     * @param type
+     * @param start
+     * @param end
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryOperationalData(Integer type, String start, String end, Integer companyId, Integer offset, Integer limit) throws Exception;
+
+
+    /**
+     * 下载运营汇总数据
+     * @param type
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    HSSFWorkbook downloadOperationalData(Integer type, String start, String end, Integer companyId) throws Exception;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITComplaintService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITComplaintService.java
new file mode 100644
index 0000000..0f0a33c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITComplaintService.java
@@ -0,0 +1,34 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TComplaint;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 投诉管理 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITComplaintService extends IService<TComplaint> {
+
+    /**
+     * 根据条件查询投诉列表
+     * @return
+     */
+    List<Map<String,Object>> getComplaintList(@Param("page") Page<Map<String, Object>> page,
+                                              @Param("roleType") Integer roleType,
+                                              @Param("nowUserId") Integer nowUserId,
+                                              @Param("beginTime") String beginTime,
+                                              @Param("endTime") String endTime,
+                                              @Param("userName") String userName,
+                                              @Param("userPhone") String userPhone,
+                                              @Param("driverPhone") String driverPhone,
+                                              @Param("isHandle") Integer isHandle);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDispatchService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDispatchService.java
new file mode 100644
index 0000000..56cf77c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDispatchService.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TDispatch;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 调度管理 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-01
+ */
+public interface ITDispatchService extends IService<TDispatch> {
+
+    /**
+     * 根据条件查询调度列表
+     * @return
+     */
+    List<Map<String,Object>> getDispatchList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("roleType") Integer roleType,
+                                             @Param("nowUserId") Integer nowUserId,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("name") String name,
+                                             @Param("companyName") String companyName,
+                                             @Param("franchiseeName") String franchiseeName,
+                                             @Param("account") String account,
+                                             @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverLineService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverLineService.java
new file mode 100644
index 0000000..6e769ec
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverLineService.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TDriverLine;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机关联线路 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface ITDriverLineService extends IService<TDriverLine> {
+
+    /**
+     * 根据司机ID查询司机关联线路列表
+     * @param driverId
+     * @return
+     */
+    List<Map<String,Object>> getDriverLineListByDriverId(@Param("driverId") Integer driverId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverService.java
new file mode 100644
index 0000000..385fd22
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverService.java
@@ -0,0 +1,94 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TDriver;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机表 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-04
+ */
+public interface ITDriverService extends IService<TDriver> {
+
+    /**
+     * 根据条件查询待审核司机列表
+     * @return
+     */
+    List<Map<String,Object>> getAuthDriverList(@Param("page") Page<Map<String, Object>> page,
+                                               @Param("beginTime") String beginTime,
+                                               @Param("endTime") String endTime,
+                                               @Param("companyName") String companyName,
+                                               @Param("phone") String phone,
+                                               @Param("account") String account,
+                                               @Param("addType") Integer addType,
+                                               @Param("authState") Integer authState);
+
+    /**
+     * 根据用户ID获取用户详情
+     * @param driverId
+     * @return
+     */
+    Map<String,Object> getDriverById(@Param("driverId") Integer driverId);
+
+    /**
+     * 根据审核通过的司机列表
+     * @return
+     */
+    List<Map<String,Object>> getDriverList(@Param("page") Page<Map<String, Object>> page,
+                                           @Param("roleType") Integer roleType,
+                                           @Param("nowUserId") Integer nowUserId,
+                                           @Param("beginTime") String beginTime,
+                                           @Param("endTime") String endTime,
+                                           @Param("companyName") String companyName,
+                                           @Param("phone") String phone,
+                                           @Param("name") String name,
+                                           @Param("addType") Integer addType,
+                                           @Param("authState") Integer authState);
+
+    /**
+     * 查询已被使用的车辆ID
+     * @return
+     */
+    String getUseCarIdStr(@Param("carId") Integer carId);
+
+    /**
+     * 查询当前可被选择的车辆列表
+     * @return
+     */
+    List<Map<String,Object>> getCanSelectCarList(@Param("page") Page<Map<String, Object>> page,
+                                                 @Param("roleType") Integer roleType,
+                                                 @Param("nowUserId") Integer nowUserId,
+                                                 @Param("carIdStr") String carIdStr,
+                                                 @Param("carLicensePlate") String carLicensePlate,
+                                                 @Param("brandName") String brandName,
+                                                 @Param("modelName") String modelName,
+                                                 @Param("color") String color,
+                                                 @Param("serverStr") String serverStr);
+
+    /**
+     * 修改分公司司机的状态
+     */
+    void updateCompanyDriverState( @Param("authState") Integer authState, @Param("companyId") Integer companyId);
+
+    /**
+     * 修改加盟商司机的状态
+     */
+    void updateFranchiseeDriverState( @Param("authState") Integer authState, @Param("franchiseeId") Integer franchiseeId);
+
+    /**
+     * 根据审核通过的司机列表无分页
+     * @return
+     * @return
+     */
+    List<Map<String,Object>> getDriverListNoPage(@Param("roleType") Integer roleType,
+                                                 @Param("nowUserId") Integer nowUserId);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverServiceService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverServiceService.java
new file mode 100644
index 0000000..eb806a8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverServiceService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TDriverService;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 司机经营业务 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+public interface ITDriverServiceService extends IService<TDriverService> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITFeedbackService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITFeedbackService.java
new file mode 100644
index 0000000..38d4615
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITFeedbackService.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TFeedback;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 反馈管理 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+public interface ITFeedbackService extends IService<TFeedback> {
+
+    /**
+     * 根据条件查询用反馈记录列表
+     * @return
+     */
+    List<Map<String,Object>> getFeedbackList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("type") Integer type,
+                                             @Param("name") String name,
+                                             @Param("phone") String phone,
+                                             @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITIntegralGoodsService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITIntegralGoodsService.java
new file mode 100644
index 0000000..c465481
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITIntegralGoodsService.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TIntegralGoods;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 积分商品管理 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+public interface ITIntegralGoodsService extends IService<TIntegralGoods> {
+
+    /**
+     * 根据条件查询积分商品列表
+     * @return
+     */
+    List<Map<String,Object>> getIntegralGoodsList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("name") String name,
+                                                  @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITIntegralOrderService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITIntegralOrderService.java
new file mode 100644
index 0000000..ae12339
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITIntegralOrderService.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TIntegralOrder;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 积分订单管理 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+public interface ITIntegralOrderService extends IService<TIntegralOrder> {
+
+    /**
+     * 根据条件查询兑换订单列表
+     * @return
+     */
+    List<Map<String,Object>> getIntegralOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("userName") String userName,
+                                                  @Param("goodsName") String goodsName,
+                                                  @Param("consigneeName") String consigneeName,
+                                                  @Param("consigneePhone") String consigneePhone,
+                                                  @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITInvoiceService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITInvoiceService.java
new file mode 100644
index 0000000..34df7a0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITInvoiceService.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TInvoice;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 发票 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITInvoiceService extends IService<TInvoice> {
+
+    /**
+     * 根据条件查询用开发票记录列表
+     * @return
+     */
+    List<Map<String,Object>> getInvoiceList(@Param("page") Page<Map<String, Object>> page,
+                                            @Param("beginTime") String beginTime,
+                                            @Param("endTime") String endTime,
+                                            @Param("email") String email,
+                                            @Param("name") String name,
+                                            @Param("type") Integer type,
+                                            @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineCompanyService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineCompanyService.java
new file mode 100644
index 0000000..7635095
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineCompanyService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TLineCompany;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 企业-线路关系表 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface ITLineCompanyService extends IService<TLineCompany> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLinePriceService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLinePriceService.java
new file mode 100644
index 0000000..06c15b1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLinePriceService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TLinePrice;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 跨城线路价格规则 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface ITLinePriceService extends IService<TLinePrice> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineService.java
new file mode 100644
index 0000000..afb0bd6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineService.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TLine;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 跨城线路 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-15
+ */
+public interface ITLineService extends IService<TLine> {
+
+    /**
+     * 根据条件查询线路列表
+     * @return
+     */
+    List<Map<String,Object>> getLineList(@Param("page") Page<Map<String, Object>> page,
+                                         @Param("beginTime") String beginTime,
+                                         @Param("endTime") String endTime,
+                                         @Param("name") String name,
+                                         @Param("insertUser") String insertUser,
+                                         @Param("modelStr") String modelStr,
+                                         @Param("state") Integer state);
+
+    /**
+     * 根据线路ID查询线路价格
+     * @param lineId
+     * @return
+     */
+    List<Map<String,Object>> getLinePriceList(@Param("lineId") Integer lineId);
+
+    /**
+     * 根据线路ID查询线路已分配公司
+     * @param lineId
+     * @return
+     */
+    List<Map<String,Object>> getLineCompanyList(@Param("lineId") Integer lineId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineShiftService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineShiftService.java
new file mode 100644
index 0000000..b338124
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineShiftService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TLineShift;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 线路班次 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface ITLineShiftService extends IService<TLineShift> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineSiteService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineSiteService.java
new file mode 100644
index 0000000..d5006c3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLineSiteService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TLineSite;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 线路-站点关系表 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface ITLineSiteService extends IService<TLineSite> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLocationService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLocationService.java
new file mode 100644
index 0000000..4a059ef
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITLocationService.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TLocation;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 地点 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-04
+ */
+public interface ITLocationService extends IService<TLocation> {
+
+
+    /**
+     * 定时任务更新线上围栏的有效时间
+     * @throws Exception
+     */
+    void updateFence() throws Exception;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITNoticesService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITNoticesService.java
new file mode 100644
index 0000000..6afd752
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITNoticesService.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TNotices;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 发布公告和滚动消息 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+public interface ITNoticesService extends IService<TNotices> {
+
+    /**
+     * 根据条件查询滚动消息列表
+     * @return
+     */
+    List<Map<String,Object>> getRollingNoticeList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("typeValue") Integer typeValue,
+                                                  @Param("content") String content);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOpenCityBusinessService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOpenCityBusinessService.java
new file mode 100644
index 0000000..a4dcdd1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOpenCityBusinessService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TOpenCityBusiness;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 开通城市经营业务 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+public interface ITOpenCityBusinessService extends IService<TOpenCityBusiness> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOpenCityService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOpenCityService.java
new file mode 100644
index 0000000..8381119
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOpenCityService.java
@@ -0,0 +1,40 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOpenCity;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 开通城市表 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+public interface ITOpenCityService extends IService<TOpenCity> {
+
+    /**
+     * 根据条件查询开通城市列表
+     * @param page      分页
+     * @param beginTime 开始时间
+     * @param endTime   结束时间
+     * @param condition 省/市/区
+     * @return
+     */
+    List<Map<String,Object>> getOpenCityList(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("condition") String condition);
+
+    /**
+     * 根据城市ID获取经营业务
+     * @param openCityId
+     * @return
+     */
+    List<Map<String,Object>> getBusinessByCityId(@Param("openCityId") Integer openCityId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCharterService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCharterService.java
new file mode 100644
index 0000000..1f66e36
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCharterService.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderCharter;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 包车订单 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+public interface ITOrderCharterService extends IService<TOrderCharter> {
+
+    /**
+     * 根据条件查询包车订单列表
+     * @return
+     */
+    List<Map<String,Object>> getCharterOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                 @Param("beginTime") String beginTime,
+                                                 @Param("endTime") String endTime,
+                                                 @Param("userName") String userName,
+                                                 @Param("contactName") String contactName,
+                                                 @Param("contactPhone") String contactPhone,
+                                                 @Param("useDemand") String useDemand,
+                                                 @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCharteredCarService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCharteredCarService.java
new file mode 100644
index 0000000..4e6cc89
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCharteredCarService.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderCharteredCar;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-包车 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-24
+ */
+public interface ITOrderCharteredCarService extends IService<TOrderCharteredCar> {
+
+    /**
+     * 根据条件查询包车订单列表
+     * @return
+     */
+    List<Map<String,Object>> getCharterCarOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                    @Param("beginTime") String beginTime,
+                                                    @Param("endTime") String endTime,
+                                                    @Param("userName") String userName,
+                                                    @Param("contactPerson") String contactPerson,
+                                                    @Param("contactPhone") String contactPhone,
+                                                    @Param("modelUse") String modelUse,
+                                                    @Param("state") Integer state,
+                                                    @Param("roleType") Integer roleType,
+                                                    @Param("nowUserId") Integer nowUserId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCrossCityService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCrossCityService.java
new file mode 100644
index 0000000..668551f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderCrossCityService.java
@@ -0,0 +1,54 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderCrossCity;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-跨城 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface ITOrderCrossCityService extends IService<TOrderCrossCity> {
+
+    /**
+     * 根据条件查询跨城出行订单列表
+     * @return
+     */
+    List<Map<String,Object>> getCrossCityOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                   @Param("beginTime") String beginTime,
+                                                   @Param("endTime") String endTime,
+                                                   @Param("roleType") Integer roleType,
+                                                   @Param("nowUserId") Integer nowUserId,
+                                                   @Param("orderNum") String orderNum,
+                                                   @Param("orderSource") Integer orderSource,
+                                                   @Param("userName") String userName,
+                                                   @Param("userPhone") String userPhone,
+                                                   @Param("passengers") String passengers,
+                                                   @Param("passengersPhone") String passengersPhone,
+                                                   @Param("serverCarModelId") Integer serverCarModelId,
+                                                   @Param("driver") String driver,
+                                                   @Param("lineId") Integer lineId,
+                                                   @Param("state") Integer state);
+
+    /**
+     * 根据跨城出行订单ID获取跨城出行订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String,Object> getCrossCityOrderDetailById(@Param("orderId") Integer orderId);
+
+
+    List<TOrderCrossCity> queryOrders(@Param("driverId") Integer driverId, @Param("lineShiftDriverId") Integer lineShiftDriverId,
+                                     @Param("state") List<Integer> state);
+
+
+    String getOrderNum(Integer driverId, Integer lineShiftDriverId) throws Exception;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderEvaluateService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderEvaluateService.java
new file mode 100644
index 0000000..d36c4c4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderEvaluateService.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderEvaluate;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单评价 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITOrderEvaluateService extends IService<TOrderEvaluate> {
+
+    /**
+     * 根据条件查询评价列表
+     * @return
+     */
+    List<Map<String,Object>> getOrderEvaluateList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("roleType") Integer roleType,
+                                                  @Param("nowUserId") Integer nowUserId,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("userName") String userName,
+                                                  @Param("userPhone") String userPhone,
+                                                  @Param("driverName") String driverName,
+                                                  @Param("driverPhone") String driverPhone,
+                                                  @Param("fraction") String fraction,
+                                                  @Param("orderType") Integer orderType);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderLogisticsService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderLogisticsService.java
new file mode 100644
index 0000000..99f051b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderLogisticsService.java
@@ -0,0 +1,47 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderLogistics;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-小件物流 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-24
+ */
+public interface ITOrderLogisticsService extends IService<TOrderLogistics> {
+
+    /**
+     * 根据条件查询小件物流订单列表
+     * @return
+     */
+    List<Map<String,Object>> getLogisticsOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                   @Param("beginTime") String beginTime,
+                                                   @Param("endTime") String endTime,
+                                                   @Param("roleType") Integer roleType,
+                                                   @Param("nowUserId") Integer nowUserId,
+                                                   @Param("orderNum") String orderNum,
+                                                   @Param("orderSource") Integer orderSource,
+                                                   @Param("type") Integer type,
+                                                   @Param("userName") String userName,
+                                                   @Param("userPhone") String userPhone,
+                                                   @Param("recipient") String recipient,
+                                                   @Param("recipientPhone") String recipientPhone,
+                                                   @Param("driver") String driver,
+                                                   @Param("state") Integer state);
+
+    /**
+     * 根据专车订单ID获取小件物流订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String,Object> getLogisticsOrderDetailById(@Param("orderId") Integer orderId);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPositionService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPositionService.java
new file mode 100644
index 0000000..ae92c1f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPositionService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TOrderPosition;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 订单坐标信息表 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-08
+ */
+public interface ITOrderPositionService extends IService<TOrderPosition> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java
new file mode 100644
index 0000000..d4aad0f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderPrivateCar;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-专车 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+public interface ITOrderPrivateCarService extends IService<TOrderPrivateCar> {
+
+    /**
+     * 根据条件查询专车订单列表
+     * @return
+     */
+    List<Map<String,Object>> getPrivateCarOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                    @Param("beginTime") String beginTime,
+                                                    @Param("endTime") String endTime,
+                                                    @Param("roleType") Integer roleType,
+                                                    @Param("nowUserId") Integer nowUserId,
+                                                    @Param("orderNum") String orderNum,
+                                                    @Param("orderSource") Integer orderSource,
+                                                    @Param("userName") String userName,
+                                                    @Param("userPhone") String userPhone,
+                                                    @Param("passengers") String passengers,
+                                                    @Param("passengersPhone") String passengersPhone,
+                                                    @Param("serverCarModelId") Integer serverCarModelId,
+                                                    @Param("driver") String driver,
+                                                    @Param("state") Integer state);
+
+    /**
+     * 根据专车订单ID获取专车订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String,Object> getPrivateCarOrderDetailById(@Param("orderId") Integer orderId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderTaxiService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderTaxiService.java
new file mode 100644
index 0000000..f73bd6e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderTaxiService.java
@@ -0,0 +1,81 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderTaxi;
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-出租车 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-08
+ */
+public interface ITOrderTaxiService extends IService<TOrderTaxi> {
+
+    /**
+     * 根据条件查询出租车订单列表
+     * @return
+     */
+    List<Map<String,Object>> getTaxiOrderList(@Param("page") Page<Map<String, Object>> page,
+                                              @Param("beginTime") String beginTime,
+                                              @Param("endTime") String endTime,
+                                              @Param("roleType") Integer roleType,
+                                              @Param("nowUserId") Integer nowUserId,
+                                              @Param("orderNum") String orderNum,
+                                              @Param("orderSource") Integer orderSource,
+                                              @Param("userName") String userName,
+                                              @Param("userPhone") String userPhone,
+                                              @Param("passengers") String passengers,
+                                              @Param("passengersPhone") String passengersPhone,
+                                              @Param("driver") String driver,
+                                              @Param("state") Integer state);
+
+    /**
+     * 根据出租车订单ID获取出租车订单详情
+     * @param orderId
+     * @return
+     */
+    Map<String,Object> getTaxiOrderDetailById(@Param("orderId") Integer orderId);
+
+    /**
+     * 根据条件查询可被选择的出租车司机列表
+     * @return
+     */
+    List<Map<String,Object>> getCanSelectTaxiDriverList(@Param("page") Page<Map<String, Object>> page,
+                                                        @Param("companyId") Integer companyId,
+                                                        @Param("name") String name,
+                                                        @Param("phone") String phone);
+
+    /**
+     * 查询所有订单条数
+     * @param companyId
+     * @return
+     */
+    Integer getAllOrderNum(@Param("companyId") Integer companyId,@Param("beginTime") String beginTime,@Param("endTime") String endTime);
+
+    /**
+     * 查询所有总交易金额
+     * @param companyId
+     * @param beginTime
+     * @param endTime
+     * @return
+     */
+    Double getAllTradeMoney(@Param("companyId") Integer companyId,@Param("beginTime") String beginTime,@Param("endTime") String endTime);
+
+    /**
+     * 查询所有总收益
+     * @param companyId
+     * @param beginTime
+     * @param endTime
+     * @return
+     */
+    Double getAllIncomeMoney(@Param("companyId") Integer companyId,@Param("beginTime") String beginTime,@Param("endTime") String endTime);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPhoneService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPhoneService.java
new file mode 100644
index 0000000..3fde1aa
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPhoneService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TPhone;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 系统电话设置 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITPhoneService extends IService<TPhone> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITProblemService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITProblemService.java
new file mode 100644
index 0000000..8e7f56c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITProblemService.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TProblem;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 在线客服 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-24
+ */
+public interface ITProblemService extends IService<TProblem> {
+
+    /**
+     * 根据条件查询用户留言列表
+     * @return
+     */
+    List<Map<String,Object>> getProblemList(@Param("page") Page<Map<String, Object>> page,
+                                            @Param("beginTime") String beginTime,
+                                            @Param("endTime") String endTime,
+                                            @Param("userName") String userName,
+                                            @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPubTransactionDetailsService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPubTransactionDetailsService.java
new file mode 100644
index 0000000..4bac33f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPubTransactionDetailsService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TPubTransactionDetails;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 交易明细(司机/用户) 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+public interface ITPubTransactionDetailsService extends IService<TPubTransactionDetails> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPubWithdrawalService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPubWithdrawalService.java
new file mode 100644
index 0000000..9675a4b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITPubWithdrawalService.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TPubWithdrawal;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 提现记录表(司机/用户) 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITPubWithdrawalService extends IService<TPubWithdrawal> {
+
+    /**
+     * 根据条件查询提现列表
+     * @return
+     */
+    List<Map<String,Object>> getWithdrawalList(@Param("page") Page<Map<String, Object>> page,
+                                               @Param("beginTime") String beginTime,
+                                               @Param("endTime") String endTime,
+                                               @Param("name") String name,
+                                               @Param("withdrawalType") Integer withdrawalType);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITReassignService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITReassignService.java
new file mode 100644
index 0000000..354bc96
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITReassignService.java
@@ -0,0 +1,108 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TReassign;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单改派 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-03
+ */
+public interface ITReassignService extends IService<TReassign> {
+
+    /**
+     * 根据条件查询专车改派订单列表
+     */
+    List<Map<String,Object>> getPrivateCarReassignOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                            @Param("roleType") Integer roleType,
+                                                            @Param("nowUserId") Integer nowUserId,
+                                                            @Param("beginTime") String beginTime,
+                                                            @Param("endTime") String endTime,
+                                                            @Param("originalDriverName") String originalDriverName,
+                                                            @Param("originalDriverPhone") String originalDriverPhone,
+                                                            @Param("orderNum") String orderNum,
+                                                            @Param("nowDriverName") String nowDriverName,
+                                                            @Param("nowDriverPhone") String nowDriverPhone,
+                                                            @Param("orderState") Integer orderState,
+                                                            @Param("state") Integer state);
+
+    /**
+     * 根据条件查询可被选择的专车司机列表
+     * @return
+     */
+    List<Map<String,Object>> getCanSelectPrivateCarDriverList(@Param("page") Page<Map<String, Object>> page,
+                                                              @Param("companyId") Integer companyId,
+                                                              @Param("name") String name,
+                                                              @Param("phone") String phone);
+
+
+    /**
+     * 根据条件查询可被选择的专车司机列表
+     * @return
+     */
+    List<Map<String,Object>> getCanSelectSmallDriverList(@Param("page") Page<Map<String, Object>> page,
+                                                              @Param("companyId") Integer companyId,
+                                                         @Param("type") Integer type,
+                                                              @Param("name") String name,
+                                                              @Param("phone") String phone);
+
+
+    /**
+     * 根据条件查询跨城改派订单列表
+     */
+    List<Map<String,Object>> getCrossReassignOrderList(@Param("page") Page<Map<String, Object>> page,
+                                                       @Param("roleType") Integer roleType,
+                                                       @Param("nowUserId") Integer nowUserId,
+                                                       @Param("beginTime") String beginTime,
+                                                       @Param("endTime") String endTime,
+                                                       @Param("originalDriverName") String originalDriverName,
+                                                       @Param("originalDriverPhone") String originalDriverPhone,
+                                                       @Param("orderNum") String orderNum,
+                                                       @Param("nowDriverName") String nowDriverName,
+                                                       @Param("nowDriverPhone") String nowDriverPhone,
+                                                       @Param("orderState") Integer orderState,
+                                                       @Param("state") Integer state);
+
+    /**
+     * 根据条件查询可被选择的跨城司机列表
+     * @return
+     */
+    List<Map<String,Object>> getCanSelectCrossDriverList(@Param("page") Page<Map<String, Object>> page,
+                                                         @Param("companyId") Integer companyId,
+                                                         @Param("serverCarModelId") Integer serverCarModelId,
+                                                         @Param("lineId") Integer lineId,
+                                                         @Param("lineShiftId") Integer lineShiftId,
+                                                         @Param("time") Date time,
+                                                         @Param("num") Integer num,
+                                                         @Param("name") String name,
+                                                         @Param("phone") String phone,
+                                                         @Param("driverId") Integer driverId);
+
+
+
+    /**
+     * 根据条件查询跨城改派订单列表
+     */
+    List<Map<String,Object>> getSmallPieceLogisticsList(@Param("page") Page<Map<String, Object>> page,
+                                                       @Param("roleType") Integer roleType,
+                                                       @Param("nowUserId") Integer nowUserId,
+                                                       @Param("beginTime") String beginTime,
+                                                       @Param("endTime") String endTime,
+                                                       @Param("originalDriverName") String originalDriverName,
+                                                       @Param("originalDriverPhone") String originalDriverPhone,
+                                                       @Param("orderNum") String orderNum,
+                                                       @Param("nowDriverName") String nowDriverName,
+                                                       @Param("nowDriverPhone") String nowDriverPhone,
+                                                       @Param("orderState") Integer orderState,
+                                                       @Param("state") Integer state);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITRegionService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITRegionService.java
new file mode 100644
index 0000000..4230d25
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITRegionService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TRegion;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 省市区三级联动 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+public interface ITRegionService extends IService<TRegion> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITServerCarmodelService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITServerCarmodelService.java
new file mode 100644
index 0000000..3ecc7f9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITServerCarmodelService.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TServerCarmodel;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务车型设置 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-08-29
+ */
+public interface ITServerCarmodelService extends IService<TServerCarmodel> {
+
+    /**
+     * 根据条件查询服务车型列表
+     */
+    List<Map<String,Object>> getServerCarModelList(@Param("page") Page<Map<String, Object>> page,
+                                                   @Param("type") Integer type,
+                                                   @Param("name") String name,
+                                                   @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSiteService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSiteService.java
new file mode 100644
index 0000000..88e38ca
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSiteService.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSite;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 线路站点 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-04
+ */
+public interface ITSiteService extends IService<TSite> {
+
+    /**
+     * 根据条件查询站点列表
+     * @return
+     */
+    List<Map<String,Object>> getSiteList(@Param("page") Page<Map<String, Object>> page,
+                                         @Param("beginTime") String beginTime,
+                                         @Param("endTime") String endTime,
+                                         @Param("name") String name,
+                                         @Param("insertUser") String insertUser,
+                                         @Param("city") String city,
+                                         @Param("state") Integer state);
+
+
+
+    List<TSite> query(@Param("provinceCode") String provinceCode, @Param("cityCode")String cityCode,
+                @Param("districtCode")String districtCode);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSmsrecordService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSmsrecordService.java
new file mode 100644
index 0000000..67b716b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSmsrecordService.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSmsrecord;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 验证码 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+public interface ITSmsrecordService extends IService<TSmsrecord> {
+
+    /**
+     * 根据条件查询验证码记录列表
+     * @return
+     */
+    List<Map<String,Object>> getSmsCodeList(@Param("page") Page<Map<String, Object>> page,
+                                            @Param("beginTime") String beginTime,
+                                            @Param("endTime") String endTime,
+                                            @Param("phone") String phone);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysCancleOrderService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysCancleOrderService.java
new file mode 100644
index 0000000..b3b307a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysCancleOrderService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TSysCancleOrder;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 系统设置-取消订单 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITSysCancleOrderService extends IService<TSysCancleOrder> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysFaceDistinguishService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysFaceDistinguishService.java
new file mode 100644
index 0000000..dfb4f16
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysFaceDistinguishService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TSysFaceDistinguish;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 系统设置-人脸识别 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITSysFaceDistinguishService extends IService<TSysFaceDistinguish> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysIntegralService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysIntegralService.java
new file mode 100644
index 0000000..9eee237
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysIntegralService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TSysIntegral;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 系统设置-积分 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITSysIntegralService extends IService<TSysIntegral> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysPushOrderService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysPushOrderService.java
new file mode 100644
index 0000000..e4a5cbe
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysPushOrderService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TSysPushOrder;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 系统设置-推单 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITSysPushOrderService extends IService<TSysPushOrder> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysReformistService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysReformistService.java
new file mode 100644
index 0000000..027a875
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysReformistService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TSysReformist;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 系统设置-改派 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITSysReformistService extends IService<TSysReformist> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysSensitiveWordsService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysSensitiveWordsService.java
new file mode 100644
index 0000000..2e7d740
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSysSensitiveWordsService.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSysSensitiveWords;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 系统设置-敏感词 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITSysSensitiveWordsService extends IService<TSysSensitiveWords> {
+
+    /**
+     * 根据条件查询敏感词列表
+     * @return
+     */
+    List<Map<String,Object>> getSensitiveWordList(@Param("page") Page<Map<String, Object>> page,
+                                                  @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime,
+                                                  @Param("content") String content);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java
new file mode 100644
index 0000000..8867c65
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TSystemNotice;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 系统通知 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+public interface ITSystemNoticeService extends IService<TSystemNotice> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemPriceService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemPriceService.java
new file mode 100644
index 0000000..03fdca8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemPriceService.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSystemPrice;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务价格规则 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-08-29
+ */
+public interface ITSystemPriceService extends IService<TSystemPrice> {
+
+    /**
+     * 查询专车价格设置
+     */
+    List<Map<String,Object>> getSpecialPriceList(@Param("page") Page<Map<String, Object>> page,
+                                                 @Param("companyId") Integer companyId,
+                                                 @Param("name") String name,
+                                                 @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITUserRedPacketRecordService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITUserRedPacketRecordService.java
new file mode 100644
index 0000000..eb20795
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITUserRedPacketRecordService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.TUserRedPacketRecord;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 用户红包记录 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-07-10
+ */
+public interface ITUserRedPacketRecordService extends IService<TUserRedPacketRecord> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITUserService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITUserService.java
new file mode 100644
index 0000000..5b19558
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITUserService.java
@@ -0,0 +1,57 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TUser;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户信息 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-01
+ */
+public interface ITUserService extends IService<TUser> {
+
+    /**
+     * 根据条件查询用户列表
+     * @param page      分页
+     * @param beginTime 开始时间
+     * @param endTime   结束时间
+     * @param isAuth    是否实名认证
+     * @param state     状态
+     * @param id        用户ID
+     * @param nickName  用户昵称
+     * @return
+     */
+    List<Map<String,Object>> getUserList(@Param("page") Page<Map<String, Object>> page,
+                                         @Param("beginTime") String beginTime,
+                                         @Param("endTime") String endTime,
+                                         @Param("roleType") Integer roleType,
+                                         @Param("nowUserId") Integer nowUserId,
+                                         @Param("isAuth") Integer isAuth,
+                                         @Param("state") Integer state,
+                                         @Param("id") String id,
+                                         @Param("nickName") String nickName,
+                                         @Param("phone") String phone,
+                                         @Param("companyName") String companyName);
+
+    /**
+     * 根据用户ID获取用户详情
+     * @param userId
+     * @return
+     */
+    Map<String,Object> getUserDetailById(@Param("userId") Integer userId);
+
+    /**
+     * 根据条件查询用户列表-无分页
+     * @return
+     */
+    List<Map<String,Object>> getUserListNoPage(@Param("roleType") Integer roleType,
+                                               @Param("nowUserId") Integer nowUserId);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITVerifiedService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITVerifiedService.java
new file mode 100644
index 0000000..9b11daf
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITVerifiedService.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TVerified;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 实名认证 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+public interface ITVerifiedService extends IService<TVerified> {
+
+    /**
+     * 根据条件查询用户实名认证列表
+     * @return
+     */
+    List<Map<String,Object>> getVerifiedList(@Param("page") Page<Map<String, Object>> page,
+                                            @Param("beginTime") String beginTime,
+                                            @Param("endTime") String endTime,
+                                            @Param("userName") String userName,
+                                            @Param("userPhone") String userPhone,
+                                            @Param("name") String name,
+                                            @Param("state") Integer state);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITVersionManagementService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITVersionManagementService.java
new file mode 100644
index 0000000..9fc4411
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITVersionManagementService.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TVersionManagement;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 版本管理 服务类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+public interface ITVersionManagementService extends IService<TVersionManagement> {
+
+    /**
+     * 根据条件查询版本列表
+     * @return
+     */
+    List<Map<String,Object>> getVersionList(@Param("page") Page<Map<String, Object>> page,
+                                            @Param("beginTime") String beginTime,
+                                            @Param("endTime") String endTime,
+                                            @Param("version") String version);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITransactionDetailsService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITransactionDetailsService.java
new file mode 100644
index 0000000..04ed3d9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITransactionDetailsService.java
@@ -0,0 +1,23 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.TransactionDetails;
+
+public interface ITransactionDetailsService extends IService<TransactionDetails> {
+
+
+    /**
+     * 添加数据
+     * @param userId    对象id
+     * @param remark    备注
+     * @param money     金额
+     * @param state     状态(1=添加,2=减少)
+     * @param type      类型(1=金额,2=积分)
+     * @param userType  用户类型(1=用户,2=司机)
+     * @param orderType 订单类型(1=专车,2=出租车,3=城际,4=小件物流,5=余额充值,6=余额提现)
+     * @param orderId
+     * @throws Exception
+     */
+    void saveData(Integer userId, String remark, Double money, Integer state,
+                  Integer type, Integer userType, Integer orderType, Integer orderId) throws Exception;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityBalanceService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityBalanceService.java
new file mode 100644
index 0000000..2e67172
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityBalanceService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.UserActivityBalance;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 用户活动-充值 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface IUserActivityBalanceService extends IService<UserActivityBalance> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityDiscount1Service.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityDiscount1Service.java
new file mode 100644
index 0000000..7cf3894
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityDiscount1Service.java
@@ -0,0 +1,65 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.UserActivityDiscount1;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户活动-折扣1 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface IUserActivityDiscount1Service extends IService<UserActivityDiscount1> {
+
+
+    /**
+     * 获取折扣
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryDiscount1(String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception;
+
+
+    /**
+     * 下载折扣优惠
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    HSSFWorkbook downloadDiscount1(String name, String time, Integer companyId) throws Exception;
+
+
+    /**
+     * 获取折扣优惠券详情
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryDiscountInfo(String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception;
+
+
+    /**
+     * 下载折扣优惠详情
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    HSSFWorkbook downloadDiscountInfo(String name, String time, Integer companyId) throws Exception;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityDiscount2Service.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityDiscount2Service.java
new file mode 100644
index 0000000..a3057fa
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityDiscount2Service.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.UserActivityDiscount2;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 用户活动-折扣2(跨城) 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface IUserActivityDiscount2Service extends IService<UserActivityDiscount2> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityInviteService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityInviteService.java
new file mode 100644
index 0000000..4c118b2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityInviteService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.UserActivityInvite;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 用户活动-邀请 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface IUserActivityInviteService extends IService<UserActivityInvite> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRedenvelopeService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRedenvelopeService.java
new file mode 100644
index 0000000..69da36a
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRedenvelopeService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.UserActivityRedenvelope;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 用户活动-红包 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface IUserActivityRedenvelopeService extends IService<UserActivityRedenvelope> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRegisteredService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRegisteredService.java
new file mode 100644
index 0000000..dee26f0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityRegisteredService.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.UserActivityRegistered;
+import com.baomidou.mybatisplus.service.IService;
+
+/**
+ * <p>
+ * 用户活动-注册 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface IUserActivityRegisteredService extends IService<UserActivityRegistered> {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityService.java
new file mode 100644
index 0000000..3d13fa6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserActivityService.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.UserActivity;
+import com.baomidou.mybatisplus.service.IService;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户活动主表 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+public interface IUserActivityService extends IService<UserActivity> {
+    public void insertOrUpdate(Integer id,String name,String startTime,Integer registCouponId,
+                               Integer registEnable,Integer registNumber,Integer registEffective,
+                               Integer inviteCouponId,Integer inviteEnable,Integer inviteNumber,Integer inviteEffective,
+                               Integer balanceEnable,String balanceInfo,
+                               Integer discountEnable,Double discountSpecial,Double discountTaxi,Double discountLogistics,
+                               Integer redenvelopeId,Integer redenvelopeEnable, Double registerPrice, Double invitationPrice, Double redPrice);
+
+
+    /**
+     * 获取列表 数据
+     * @param name
+     * @param status
+     * @param offset
+     * @param limit
+     * @return
+     */
+    Map<String, Object> queryUserActivityList(Integer uid, Date start, Date end, String name, Integer status, Integer offset, Integer limit);
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserCouponRecordService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserCouponRecordService.java
new file mode 100644
index 0000000..d739e27
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserCouponRecordService.java
@@ -0,0 +1,175 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.UserCouponRecord;
+import com.baomidou.mybatisplus.service.IService;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户优惠券记录 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+public interface IUserCouponRecordService extends IService<UserCouponRecord> {
+
+    List<Map<String,Object>> getList(Page<Map<String, Object>> page,
+                                     String beginTime,
+                                     String endTime,
+                                     String userName,
+                                     String userPhone,
+                                     Integer couponActivityId,
+                                     Integer activityType,Integer state);
+
+    List<Map<String,Object>> getRedList(Page<Map<String, Object>> page,
+                                     String beginTime,
+                                     String endTime,
+                                     String userName,
+                                     String userPhone,
+                                     Integer couponActivityId,Integer state);
+
+    /**
+     * 统计优惠券
+     * @param beginTime
+     * @param endTime
+     * @param activityId
+     * @param activityType
+     * @return
+     */
+    Map<String,Object> getCouponStatic(
+            String beginTime,
+            String endTime,
+            Integer activityId,
+            Integer activityType);
+
+    /**
+     * 统计红包
+     * @param beginTime
+     * @param endTime
+     * @param activityId
+     * @return
+     */
+    Map<String,Object> getRedStatic(
+            String beginTime,
+            String endTime,
+            Integer activityId);
+
+
+    /**
+     * 获取充值统计
+     * @param beginTime
+     * @param endTime
+     * @param activityId
+     * @return
+     */
+    Map<String,Object> getRegStatic(
+             String beginTime,
+             String endTime,
+             Integer activityId);
+
+    /**
+     * 获取打折统计
+     * @param beginTime
+     * @param endTime
+     * @param activityId
+     * @return
+     */
+    Map<String,Object> getDiscountStatic(
+             String beginTime,
+             String endTime,
+             Integer activityId);
+
+    /**
+     * 获取充值记录
+      * @param page
+     * @param beginTime
+     * @param endTime
+     * @param activityId
+     * @return
+     */
+    List<Map<String,Object>> getBlanceList( Page<Map<String, Object>> page,
+                                            String beginTime,
+                                            String endTime,
+                                            Integer activityId);
+
+
+    /**
+     * 获取优惠券领取数据
+     * @param type
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryCouponRegister(Integer type, String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception;
+
+
+    /**
+     * 下载优惠券领取数据
+     * @param type
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    HSSFWorkbook downloadCouponRegister(Integer type, String name, String time, Integer companyId) throws Exception;
+
+
+    /**
+     * 获取优惠券统计明细
+     * @param type
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryCouponRegisterInfo(Integer type, String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception;
+
+
+    /**
+     * 下载优惠券统计明细
+     * @param type
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     */
+    HSSFWorkbook downloadCouponRegisterInfo(Integer type, String name, String time, Integer companyId);
+
+
+
+    /**
+     * 获取充值优惠券明细
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryCouponRegisterInfo1(String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception;
+
+
+    /**
+     * 下载充值优惠券明细
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     */
+    HSSFWorkbook downloadCouponRegisterInfo1(String name, String time, Integer companyId);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserRedPacketRecordService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserRedPacketRecordService.java
new file mode 100644
index 0000000..b858e07
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserRedPacketRecordService.java
@@ -0,0 +1,59 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.UserRedPacketRecord;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IUserRedPacketRecordService extends IService<UserRedPacketRecord> {
+
+
+    /**
+     * 获取红包统计数据
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryRedEnvelopes(String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception;
+
+
+    /**
+     * 下载红包统计数据
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    HSSFWorkbook downloadRedEnvelopes(String name, String time, Integer companyId) throws Exception;
+
+
+    /**
+     * 获取红包统计明细
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    Map<String, Object> queryRedEnvelopesInfo(String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception;
+
+
+    /**
+     * 下载红包统计明细
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    HSSFWorkbook downloadRedEnvelopesInfo(String name, String time, Integer companyId) throws Exception;
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserService.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserService.java
new file mode 100644
index 0000000..ccaf6bd
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/IUserService.java
@@ -0,0 +1,62 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+
+import com.stylefeng.guns.core.datascope.DataScope;
+import com.stylefeng.guns.modular.system.model.User;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 管理员表 服务类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+public interface IUserService extends IService<User> {
+
+    /**
+     * 修改用户状态
+     */
+    int setStatus(@Param("userId") Integer userId, @Param("status") int status);
+
+    /**
+     * 修改密码
+     */
+    int changePwd(@Param("userId") Integer userId, @Param("pwd") String pwd);
+
+    /**
+     * 根据条件查询用户列表
+     */
+    List<Map<String, Object>> selectUsers(@Param("dataScope") DataScope dataScope, @Param("name") String name, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("deptid") Integer deptid);
+
+    /**
+     * 设置用户的角色
+     */
+    int setRoles(@Param("userId") Integer userId, @Param("roleIds") String roleIds);
+
+    /**
+     * 通过账号获取用户
+     */
+    User getByAccount(@Param("account") String account);
+
+    /**
+     * 根据角色判断菜单有"首页"的数量
+     * @param roleStr
+     * @return
+     */
+    Integer getMenuNumByRole(@Param("roleStr") String roleStr);
+
+    List<Map<String,Object>> getUserListPage(@Param("page") Page<Map<String, Object>> page,
+                                             @Param("dataScope") DataScope dataScope,
+                                             @Param("name") String name,
+                                             @Param("beginTime") String beginTime,
+                                             @Param("endTime") String endTime,
+                                             @Param("deptid") Integer deptid);
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DeptServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DeptServiceImpl.java
new file mode 100644
index 0000000..e970d12
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DeptServiceImpl.java
@@ -0,0 +1,49 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.dao.DeptMapper;
+import com.stylefeng.guns.modular.system.model.Dept;
+import com.stylefeng.guns.modular.system.service.IDeptService;
+
+@Service
+@Transactional
+public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements IDeptService {
+
+    @Resource
+    private DeptMapper deptMapper;
+
+    @Override
+    public void deleteDept(Integer deptId) {
+        Dept dept = deptMapper.selectById(deptId);
+
+        Wrapper<Dept> wrapper = new EntityWrapper<>();
+        wrapper = wrapper.like("pids", "%[" + dept.getId() + "]%");
+        List<Dept> subDepts = deptMapper.selectList(wrapper);
+        for (Dept temp : subDepts) {
+            temp.deleteById();
+        }
+
+        dept.deleteById();
+    }
+
+    @Override
+    public List<ZTreeNode> tree() {
+        return this.baseMapper.tree();
+    }
+
+    @Override
+    public List<Map<String, Object>> list(String condition) {
+        return this.baseMapper.list(condition);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DictServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DictServiceImpl.java
new file mode 100644
index 0000000..edb0c7e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DictServiceImpl.java
@@ -0,0 +1,106 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import static com.stylefeng.guns.core.common.constant.factory.MutiStrFactory.MUTI_STR_CODE;
+import static com.stylefeng.guns.core.common.constant.factory.MutiStrFactory.MUTI_STR_NAME;
+import static com.stylefeng.guns.core.common.constant.factory.MutiStrFactory.MUTI_STR_NUM;
+import static com.stylefeng.guns.core.common.constant.factory.MutiStrFactory.parseKeyValue;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.common.exception.BizExceptionEnum;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.modular.system.dao.DictMapper;
+import com.stylefeng.guns.modular.system.model.Dict;
+import com.stylefeng.guns.modular.system.service.IDictService;
+
+@Service
+@Transactional
+public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements IDictService {
+
+    @Resource
+    private DictMapper dictMapper;
+
+    @Override
+    public void addDict(String dictCode,String dictName,String dictTips, String dictValues) {
+        //判断有没有该字典
+        List<Dict> dicts = dictMapper.selectList(new EntityWrapper<Dict>().eq("code", dictCode).and().eq("pid", 0));
+        if (dicts != null && dicts.size() > 0) {
+            throw new GunsException(BizExceptionEnum.DICT_EXISTED);
+        }
+
+        //解析dictValues
+        List<Map<String, String>> items = parseKeyValue(dictValues);
+
+        //添加字典
+        Dict dict = new Dict();
+        dict.setName(dictName);
+        dict.setCode(dictCode);
+        dict.setTips(dictTips);
+        dict.setNum(0);
+        dict.setPid(0);
+        this.dictMapper.insert(dict);
+
+        //添加字典条目
+        for (Map<String, String> item : items) {
+            String code = item.get(MUTI_STR_CODE);
+            String name = item.get(MUTI_STR_NAME);
+            String num = item.get(MUTI_STR_NUM);
+            Dict itemDict = new Dict();
+            itemDict.setPid(dict.getId());
+            itemDict.setCode(code);
+            itemDict.setName(name);
+
+            try {
+                itemDict.setNum(Integer.valueOf(num));
+            } catch (NumberFormatException e) {
+                throw new GunsException(BizExceptionEnum.DICT_MUST_BE_NUMBER);
+            }
+            this.dictMapper.insert(itemDict);
+        }
+    }
+
+    @Override
+    public void editDict(Integer dictId,String dictCode, String dictName,String dictTips, String dicts) {
+        //删除之前的字典
+        this.delteDict(dictId);
+
+        //重新添加新的字典
+        this.addDict(dictCode,dictName,dictTips, dicts);
+    }
+
+    @Override
+    public void delteDict(Integer dictId) {
+        //删除这个字典的子词典
+        Wrapper<Dict> dictEntityWrapper = new EntityWrapper<>();
+        dictEntityWrapper = dictEntityWrapper.eq("pid", dictId);
+        dictMapper.delete(dictEntityWrapper);
+
+        //删除这个词典
+        dictMapper.deleteById(dictId);
+    }
+
+    @Override
+    public List<Dict> selectByCode(String code) {
+        return this.baseMapper.selectByCode(code);
+    }
+
+    @Override
+    public List<Dict> selectByParentCode(String code) {
+        return this.baseMapper.selectByParentCode(code);
+    }
+
+
+    @Override
+    public List<Map<String, Object>> list(String conditiion) {
+        return this.baseMapper.list(conditiion);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityHistoryServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityHistoryServiceImpl.java
new file mode 100644
index 0000000..df4008f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityHistoryServiceImpl.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.DriverActivityHistory;
+import com.stylefeng.guns.modular.system.dao.DriverActivityHistoryMapper;
+import com.stylefeng.guns.modular.system.service.IDriverActivityHistoryService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机完成活动记录 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@Service
+public class DriverActivityHistoryServiceImpl extends ServiceImpl<DriverActivityHistoryMapper, DriverActivityHistory> implements IDriverActivityHistoryService {
+    @Override
+    public List<Map<String, Object>> getList(Page<Map<String, Object>> page, Integer activityId, Integer type) {
+        return this.baseMapper.getList(page,activityId,type);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityOnlineServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityOnlineServiceImpl.java
new file mode 100644
index 0000000..a08d9df
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityOnlineServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.DriverActivityOnline;
+import com.stylefeng.guns.modular.system.dao.DriverActivityOnlineMapper;
+import com.stylefeng.guns.modular.system.service.IDriverActivityOnlineService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 司机活动-在线 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@Service
+public class DriverActivityOnlineServiceImpl extends ServiceImpl<DriverActivityOnlineMapper, DriverActivityOnline> implements IDriverActivityOnlineService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityOrderServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityOrderServiceImpl.java
new file mode 100644
index 0000000..8f54e77
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityOrderServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.DriverActivityOrder;
+import com.stylefeng.guns.modular.system.dao.DriverActivityOrderMapper;
+import com.stylefeng.guns.modular.system.service.IDriverActivityOrderService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 司机活动-订单 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@Service
+public class DriverActivityOrderServiceImpl extends ServiceImpl<DriverActivityOrderMapper, DriverActivityOrder> implements IDriverActivityOrderService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityRegisteredServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityRegisteredServiceImpl.java
new file mode 100644
index 0000000..c8bc3a0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityRegisteredServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.DriverActivityRegistered;
+import com.stylefeng.guns.modular.system.dao.DriverActivityRegisteredMapper;
+import com.stylefeng.guns.modular.system.service.IDriverActivityRegisteredService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 司机活动-注册 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@Service
+public class DriverActivityRegisteredServiceImpl extends ServiceImpl<DriverActivityRegisteredMapper, DriverActivityRegistered> implements IDriverActivityRegisteredService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityServiceImpl.java
new file mode 100644
index 0000000..06d4769
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverActivityServiceImpl.java
@@ -0,0 +1,241 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.modular.system.model.DriverActivity;
+import com.stylefeng.guns.modular.system.dao.DriverActivityMapper;
+import com.stylefeng.guns.modular.system.model.DriverActivityOnline;
+import com.stylefeng.guns.modular.system.model.DriverActivityOrder;
+import com.stylefeng.guns.modular.system.model.DriverActivityRegistered;
+import com.stylefeng.guns.modular.system.service.IDriverActivityOnlineService;
+import com.stylefeng.guns.modular.system.service.IDriverActivityOrderService;
+import com.stylefeng.guns.modular.system.service.IDriverActivityRegisteredService;
+import com.stylefeng.guns.modular.system.service.IDriverActivityService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机活动主表 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@Service
+public class DriverActivityServiceImpl extends ServiceImpl<DriverActivityMapper, DriverActivity> implements IDriverActivityService {
+
+
+    @Autowired
+    private IDriverActivityOnlineService driverActivityOnlineService;
+
+    @Autowired
+    private IDriverActivityOrderService driverActivityOrderService;
+
+    @Autowired
+    private IDriverActivityRegisteredService driverActivityRegisteredService;
+
+    @Override
+    public List<Map<String, Object>> getList(Page<Map<String, Object>> page, String beginTime, String endTime, String name,
+                                             Integer companyType,
+                                             Integer companyId) {
+        return this.baseMapper.getList(page,beginTime,endTime,name,companyType,companyId);
+    }
+
+    @Override
+    public void insertOrUpdate(Integer id, String staTime, String startTime, String num1, Double num2, Double num3, Integer num4, Double num5, Integer num6, Double num7, Integer num8, Double num9, Integer num10, Double num11) {
+        //判断id是否为空,为空执行添加,或者执行修改
+        if(id==null){
+            String[] timeArray = startTime.split(" - ");
+            Date startTimes = DateUtil.getDate_str3(timeArray[0]);
+            Date endTimes = DateUtil.getDate_str3(timeArray[1]);
+            ShiroUser user = ShiroKit.getUser();
+            Date nowDay = new Date();
+            //添加活动
+            DriverActivity driverActivity = new DriverActivity();
+            driverActivity.setInsertTime(nowDay);
+            driverActivity.setCompanyId(ShiroKit.getUser().getObjectId());
+            driverActivity.setCompanyType(ShiroKit.getUser().getRoleType());
+            driverActivity.setStatus(driverActivity.getCompanyType()==1?3:1);
+            driverActivity.setName(num1);
+            driverActivity.setStartTime(startTimes);
+            driverActivity.setEndTime(endTimes);
+            driverActivity.insertOrUpdate();
+            //添加在线活动-专车
+            DriverActivityOnline driverActivityOnline = new DriverActivityOnline();
+            driverActivityOnline.setCompanyId(driverActivity.getCompanyId());
+            driverActivityOnline.setDriverActivityId(driverActivity.getId());
+            driverActivityOnline.setStartTime(startTimes);
+            driverActivityOnline.setEndTime(endTimes);
+            driverActivityOnline.setInsertTime(nowDay);
+            driverActivityOnline.setType(1);
+            driverActivityOnline.setOnline(num4);
+            driverActivityOnline.setMoney(num5);
+            driverActivityOnline.insertOrUpdate();
+            //添加在线活动-出租车
+            driverActivityOnline = new DriverActivityOnline();
+            driverActivityOnline.setCompanyId(driverActivity.getCompanyId());
+            driverActivityOnline.setDriverActivityId(driverActivity.getId());
+            driverActivityOnline.setStartTime(startTimes);
+            driverActivityOnline.setEndTime(endTimes);
+            driverActivityOnline.setInsertTime(nowDay);
+            driverActivityOnline.setType(2);
+            driverActivityOnline.setOnline(num6);
+            driverActivityOnline.setMoney(num7);
+            driverActivityOnline.insertOrUpdate();
+            //添加在线活动-城际
+            driverActivityOnline = new DriverActivityOnline();
+            driverActivityOnline.setCompanyId(driverActivity.getCompanyId());
+            driverActivityOnline.setDriverActivityId(driverActivity.getId());
+            driverActivityOnline.setStartTime(startTimes);
+            driverActivityOnline.setEndTime(endTimes);
+            driverActivityOnline.setInsertTime(nowDay);
+            driverActivityOnline.setType(3);
+            driverActivityOnline.setOnline(num8);
+            driverActivityOnline.setMoney(num9);
+            driverActivityOnline.insertOrUpdate();
+            //添加订单活动
+            DriverActivityOrder driverActivityOrder = new DriverActivityOrder();
+            driverActivityOrder.setCompanyId(driverActivity.getCompanyId());
+            driverActivityOrder.setDriverActivityId(driverActivity.getId());
+            driverActivityOrder.setStartTime(startTimes);
+            driverActivityOrder.setEndTime(endTimes);
+            driverActivityOrder.setInsertTime(nowDay);
+            driverActivityOrder.setStart(staTime.split(" - ")[0]);
+            driverActivityOrder.setEnd(staTime.split(" - ")[1]);
+            driverActivityOrder.setOrderNum(num10);
+            driverActivityOrder.setMoney(num11);
+            driverActivityOrder.insertOrUpdate();
+            //添加活动-邀请司机注册奖励
+            DriverActivityRegistered driverActivityRegistered = new DriverActivityRegistered();
+            driverActivityRegistered.setCompanyId(driverActivity.getCompanyId());
+            driverActivityRegistered.setDriverActivityId(driverActivity.getId());
+            driverActivityRegistered.setStartTime(startTimes);
+            driverActivityRegistered.setEndTime(endTimes);
+            driverActivityRegistered.setInsertTime(nowDay);
+            driverActivityRegistered.setType(1);
+            driverActivityRegistered.setMoney(num2);
+            driverActivityRegistered.insertOrUpdate();
+            //添加活动-邀请用户注册奖励
+            driverActivityRegistered = new DriverActivityRegistered();
+            driverActivityRegistered.setCompanyId(driverActivity.getCompanyId());
+            driverActivityRegistered.setDriverActivityId(driverActivity.getId());
+            driverActivityRegistered.setStartTime(startTimes);
+            driverActivityRegistered.setEndTime(endTimes);
+            driverActivityRegistered.setInsertTime(nowDay);
+            driverActivityRegistered.setType(2);
+            driverActivityRegistered.setMoney(num3);
+            driverActivityRegistered.insertOrUpdate();
+        }else{
+            String[] timeArray = startTime.split(" - ");
+            Date startTimes = DateUtil.getDate_str3(timeArray[0]);
+            Date endTimes = DateUtil.getDate_str3(timeArray[1]);
+            ShiroUser user = ShiroKit.getUser();
+
+            Date nowDay = new Date();
+            //添加活动
+            DriverActivity driverActivity = new DriverActivity();
+            driverActivity.setId(id);
+            driverActivity.setCompanyId(ShiroKit.getUser().getObjectId());
+            driverActivity.setCompanyType(ShiroKit.getUser().getRoleType());
+            driverActivity.setStatus(driverActivity.getCompanyType()==1?3:1);
+            driverActivity.setName(num1);
+            driverActivity.setStartTime(startTimes);
+            driverActivity.setEndTime(endTimes);
+            driverActivity.insertOrUpdate();
+
+            //添加在线活动-专车
+            DriverActivityOnline driverActivityOnline = driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",id).eq("type",1));
+            if(driverActivityOnline==null){
+                driverActivityOnline = new DriverActivityOnline();
+                driverActivityOnline.setInsertTime(nowDay);
+            }
+            driverActivityOnline.setCompanyId(driverActivity.getCompanyId());
+            driverActivityOnline.setDriverActivityId(driverActivity.getId());
+            driverActivityOnline.setStartTime(startTimes);
+            driverActivityOnline.setEndTime(endTimes);
+            driverActivityOnline.setType(1);
+            driverActivityOnline.setOnline(num4);
+            driverActivityOnline.setMoney(num5);
+            driverActivityOnline.insertOrUpdate();
+            //添加在线活动-出租车
+            driverActivityOnline = driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",id).eq("type",2));
+            if(driverActivityOnline==null){
+                driverActivityOnline = new DriverActivityOnline();
+                driverActivityOnline.setInsertTime(nowDay);
+            }
+            driverActivityOnline.setCompanyId(driverActivity.getCompanyId());
+            driverActivityOnline.setDriverActivityId(driverActivity.getId());
+            driverActivityOnline.setStartTime(startTimes);
+            driverActivityOnline.setEndTime(endTimes);
+            driverActivityOnline.setType(2);
+            driverActivityOnline.setOnline(num6);
+            driverActivityOnline.setMoney(num7);
+            driverActivityOnline.insertOrUpdate();
+            //添加在线活动-城际
+            driverActivityOnline =driverActivityOnlineService.selectOne(new EntityWrapper<DriverActivityOnline>().eq("driverActivityId",id).eq("type",3));
+            if(driverActivityOnline==null){
+                driverActivityOnline = new DriverActivityOnline();
+                driverActivityOnline.setInsertTime(nowDay);
+            }
+            driverActivityOnline.setCompanyId(driverActivity.getCompanyId());
+            driverActivityOnline.setDriverActivityId(driverActivity.getId());
+            driverActivityOnline.setStartTime(startTimes);
+            driverActivityOnline.setEndTime(endTimes);
+            driverActivityOnline.setType(3);
+            driverActivityOnline.setOnline(num8);
+            driverActivityOnline.setMoney(num9);
+            driverActivityOnline.insertOrUpdate();
+            //添加订单活动
+            DriverActivityOrder driverActivityOrder = driverActivityOrderService.selectOne(new EntityWrapper<DriverActivityOrder>().eq("driverActivityId",id));
+            if(driverActivityOrder==null){
+                driverActivityOrder = new DriverActivityOrder();
+                driverActivityOrder.setInsertTime(nowDay);
+            }
+            driverActivityOrder.setCompanyId(driverActivity.getCompanyId());
+            driverActivityOrder.setDriverActivityId(driverActivity.getId());
+            driverActivityOrder.setStartTime(startTimes);
+            driverActivityOrder.setEndTime(endTimes);
+            driverActivityOrder.setStart(staTime.split(" - ")[0]);
+            driverActivityOrder.setEnd(staTime.split(" - ")[1]);
+            driverActivityOrder.setOrderNum(num10);
+            driverActivityOrder.setMoney(num11);
+            driverActivityOrder.insertOrUpdate();
+            //添加活动-邀请司机注册奖励
+            DriverActivityRegistered driverActivityRegistered = driverActivityRegisteredService.selectOne(new EntityWrapper<DriverActivityRegistered>().eq("driverActivityId",id).eq("type",1));
+            if(driverActivityRegistered==null){
+                driverActivityRegistered = new DriverActivityRegistered();
+                driverActivityRegistered.setInsertTime(nowDay);
+            }
+            driverActivityRegistered.setCompanyId(driverActivity.getCompanyId());
+            driverActivityRegistered.setDriverActivityId(driverActivity.getId());
+            driverActivityRegistered.setStartTime(startTimes);
+            driverActivityRegistered.setEndTime(endTimes);
+            driverActivityRegistered.setType(1);
+            driverActivityRegistered.setMoney(num2);
+            driverActivityRegistered.insertOrUpdate();
+            //添加活动-邀请用户注册奖励
+            driverActivityRegistered = driverActivityRegisteredService.selectOne(new EntityWrapper<DriverActivityRegistered>().eq("driverActivityId",id).eq("type",2));
+            if(driverActivityRegistered==null){
+                driverActivityRegistered = new DriverActivityRegistered();
+                driverActivityRegistered.setInsertTime(nowDay);
+            }
+            driverActivityRegistered.setCompanyId(driverActivity.getCompanyId());
+            driverActivityRegistered.setDriverActivityId(driverActivity.getId());
+            driverActivityRegistered.setStartTime(startTimes);
+            driverActivityRegistered.setEndTime(endTimes);
+            driverActivityRegistered.setType(2);
+            driverActivityRegistered.setMoney(num3);
+            driverActivityRegistered.insertOrUpdate();
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOnlineServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOnlineServiceImpl.java
new file mode 100644
index 0000000..57336d2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverOnlineServiceImpl.java
@@ -0,0 +1,47 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.DriverOnlineMapper;
+import com.stylefeng.guns.modular.system.model.DriverOnline;
+import com.stylefeng.guns.modular.system.service.IDriverOnlineService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class DriverOnlineServiceImpl extends ServiceImpl<DriverOnlineMapper, DriverOnline> implements IDriverOnlineService {
+
+    @Resource
+    private DriverOnlineMapper driverOnlineMapper;
+
+
+
+
+    /**
+     * 获取列表数据
+     * @param name
+     * @param phone
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryOnlineDriver(String name, String phone, Integer offset, Integer limit) throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        List<Map<String, Object>> list = driverOnlineMapper.queryOnlineDriver(name, phone, offset, limit);
+        int i = driverOnlineMapper.queryOnlineDriverCount(name, phone);
+        map.put("rows", list);
+        map.put("total", i);
+        return map;
+    }
+
+    @Override
+    public int queryOnlineDriverCount(String name, String phone) {
+        return driverOnlineMapper.queryOnlineDriverCount(name, phone);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/GDInterfaceServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/GDInterfaceServiceImpl.java
new file mode 100644
index 0000000..95e4438
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/GDInterfaceServiceImpl.java
@@ -0,0 +1,39 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.GDInterfaceMapper;
+import com.stylefeng.guns.modular.system.model.GDInterface;
+import com.stylefeng.guns.modular.system.service.IGDInterfaceService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+@Service
+public class GDInterfaceServiceImpl extends ServiceImpl<GDInterfaceMapper, GDInterface> implements IGDInterfaceService {
+
+    @Resource
+    private GDInterfaceMapper gdInterfaceMapper;
+
+
+
+    @Override
+    public void saveData(String name, String explanation) {
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd");
+        GDInterface query = gdInterfaceMapper.query(name, explanation, sdf.format(date));
+        if(null == query){
+            query = new GDInterface();
+            query.setName(name);
+            query.setExplanation(explanation);
+            query.setTime(sdf.format(date));
+            query.setNum(1);
+            this.insert(query);
+        }else{
+            query.setNum(query.getNum() + 1);
+            this.updateById(query);
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IncomeServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IncomeServiceImpl.java
new file mode 100644
index 0000000..2fa2538
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/IncomeServiceImpl.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.IncomeMapper;
+import com.stylefeng.guns.modular.system.model.Income;
+import com.stylefeng.guns.modular.system.service.IIncomeService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+
+@Service
+public class IncomeServiceImpl extends ServiceImpl<IncomeMapper, Income> implements IIncomeService {
+
+
+    /**
+     * 添加数据
+     * @param userType
+     * @param objectId
+     * @param type
+     * @param incomeId
+     * @param money
+     * @throws Exception
+     */
+    @Override
+    public void saveData(Integer userType, Integer objectId, Integer type, Integer incomeId, Integer orderType, Double money) throws Exception {
+        Income income = new Income();
+        income.setUserType(userType);
+        income.setObjectId(objectId);
+        income.setType(type);
+        income.setIncomeId(incomeId);
+        income.setOrderType(orderType);
+        income.setMoney(money);
+        income.setInsertTime(new Date());
+        this.insert(income);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LoginLogServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LoginLogServiceImpl.java
new file mode 100644
index 0000000..f0d4fcd
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/LoginLogServiceImpl.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.LoginLogMapper;
+import com.stylefeng.guns.modular.system.model.LoginLog;
+import com.stylefeng.guns.modular.system.service.ILoginLogService;
+
+/**
+ * <p>
+ * 登录记录 服务实现类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+@Service
+public class LoginLogServiceImpl extends ServiceImpl<LoginLogMapper, LoginLog> implements ILoginLogService {
+
+    @Override
+    public List<Map<String, Object>> getLoginLogs(Page<LoginLog> page, String beginTime, String endTime, String logName, String orderByField, boolean asc) {
+        return this.baseMapper.getLoginLogs(page, beginTime, endTime, logName, orderByField, asc);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/MenuServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/MenuServiceImpl.java
new file mode 100644
index 0000000..2ee46fc
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/MenuServiceImpl.java
@@ -0,0 +1,92 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.node.MenuNode;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.modular.system.dao.MenuMapper;
+import com.stylefeng.guns.modular.system.model.Menu;
+import com.stylefeng.guns.modular.system.service.IMenuService;
+
+/**
+ * 菜单服务
+ *
+ * @author fengshuonan
+ * @date 2017-05-05 22:20
+ */
+@Service
+public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {
+
+    @Resource
+    private MenuMapper menuMapper;
+
+    @Override
+    public void delMenu(Long menuId) {
+
+        //删除菜单
+        this.menuMapper.deleteById(menuId);
+
+        //删除关联的relation
+        this.menuMapper.deleteRelationByMenu(menuId);
+    }
+
+    @Override
+    public void delMenuContainSubMenus(Long menuId) {
+
+        Menu menu = menuMapper.selectById(menuId);
+
+        //删除当前菜单
+        delMenu(menuId);
+
+        //删除所有子菜单
+        Wrapper<Menu> wrapper = new EntityWrapper<>();
+        wrapper = wrapper.like("pcodes", "%[" + menu.getCode() + "]%");
+        List<Menu> menus = menuMapper.selectList(wrapper);
+        for (Menu temp : menus) {
+            delMenu(temp.getId());
+        }
+    }
+
+    @Override
+    public List<Map<String, Object>> selectMenus(String condition, String level) {
+        return this.baseMapper.selectMenus(condition, level);
+    }
+
+    @Override
+    public List<Long> getMenuIdsByRoleId(Integer roleId) {
+        return this.baseMapper.getMenuIdsByRoleId(roleId);
+    }
+
+    @Override
+    public List<ZTreeNode> menuTreeList() {
+        return this.baseMapper.menuTreeList();
+    }
+
+    @Override
+    public List<ZTreeNode> menuTreeListByMenuIds(List<Long> menuIds) {
+        return this.baseMapper.menuTreeListByMenuIds(menuIds);
+    }
+
+    @Override
+    public int deleteRelationByMenu(Long menuId) {
+        return this.baseMapper.deleteRelationByMenu(menuId);
+    }
+
+    @Override
+    public List<String> getResUrlsByRoleId(Integer roleId) {
+        return this.baseMapper.getResUrlsByRoleId(roleId);
+    }
+
+    @Override
+    public List<MenuNode> getMenusByRoleIds(List<Integer> roleIds) {
+        return this.baseMapper.getMenusByRoleIds(roleIds);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NoticeServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NoticeServiceImpl.java
new file mode 100644
index 0000000..7c80666
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/NoticeServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.NoticeMapper;
+import com.stylefeng.guns.modular.system.model.Notice;
+import com.stylefeng.guns.modular.system.service.INoticeService;
+
+/**
+ * <p>
+ * 通知表 服务实现类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+@Service
+public class NoticeServiceImpl extends ServiceImpl<NoticeMapper, Notice> implements INoticeService {
+
+    @Override
+    public List<Map<String, Object>> list(String condition) {
+        return this.baseMapper.list(condition);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OperationLogServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OperationLogServiceImpl.java
new file mode 100644
index 0000000..820a8af
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OperationLogServiceImpl.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.OperationLogMapper;
+import com.stylefeng.guns.modular.system.model.OperationLog;
+import com.stylefeng.guns.modular.system.service.IOperationLogService;
+
+/**
+ * <p>
+ * 操作日志 服务实现类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+@Service
+public class OperationLogServiceImpl extends ServiceImpl<OperationLogMapper, OperationLog> implements IOperationLogService {
+
+    @Override
+    public List<Map<String, Object>> getOperationLogs(Page<OperationLog> page, String beginTime, String endTime, String logName, String s, String orderByField, boolean asc) {
+        return this.baseMapper.getOperationLogs(page, beginTime, endTime, logName, s, orderByField, asc);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PaymentRecordServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PaymentRecordServiceImpl.java
new file mode 100644
index 0000000..6f1936d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/PaymentRecordServiceImpl.java
@@ -0,0 +1,64 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.PaymentRecordMapper;
+import com.stylefeng.guns.modular.system.model.PaymentRecord;
+import com.stylefeng.guns.modular.system.service.IPaymentRecordService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+
+@Service
+public class PaymentRecordServiceImpl extends ServiceImpl<PaymentRecordMapper, PaymentRecord> implements IPaymentRecordService {
+
+    @Resource
+    private PaymentRecordMapper paymentRecordMapper;
+
+
+
+
+    /**
+     * 添加数据
+     * @param orderId       订单id
+     * @param payType       支付方式(1=微信,2=支付宝)
+     * @param amount        支付金额
+     * @param code          第三方支付单号
+     * @param state         支付状态(1=待支付,2=已支付)
+     * @throws Exception
+     */
+    @Override
+    public Integer saveData(Integer category, Integer userId, Integer type, Integer orderId, Integer orderType, Integer payType,
+                         Double amount, String code, Integer state) throws Exception {
+        PaymentRecord paymentRecord = new PaymentRecord();
+        paymentRecord.setCategory(category);
+        paymentRecord.setUserId(userId);
+        paymentRecord.setType(type);
+        paymentRecord.setOrderId(orderId);
+        paymentRecord.setOrderType(orderType);
+        paymentRecord.setPayType(payType);
+        paymentRecord.setAmount(amount);
+        paymentRecord.setCode(code);
+        paymentRecord.setState(state);
+        paymentRecord.setInsertTime(new Date());
+        this.insert(paymentRecord);
+        return paymentRecord.getId();
+    }
+
+
+    /**
+     * 获取数据
+     * @param orderId
+     * @param payType
+     * @param state
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<PaymentRecord> query(Integer category, Integer userId, Integer type, Integer orderId, Integer orderType,
+                      Integer payType, Integer state) throws Exception {
+        return paymentRecordMapper.query(category, userId, type, orderId, orderType, payType, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RelationServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RelationServiceImpl.java
new file mode 100644
index 0000000..b378b2d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RelationServiceImpl.java
@@ -0,0 +1,21 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.RelationMapper;
+import com.stylefeng.guns.modular.system.model.Relation;
+import com.stylefeng.guns.modular.system.service.IRelationService;
+
+/**
+ * <p>
+ * 角色和菜单关联表 服务实现类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+@Service
+public class RelationServiceImpl extends ServiceImpl<RelationMapper, Relation> implements IRelationService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RoleServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RoleServiceImpl.java
new file mode 100644
index 0000000..34a0875
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/RoleServiceImpl.java
@@ -0,0 +1,75 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.node.ZTreeNode;
+import com.stylefeng.guns.core.util.Convert;
+import com.stylefeng.guns.modular.system.dao.RelationMapper;
+import com.stylefeng.guns.modular.system.dao.RoleMapper;
+import com.stylefeng.guns.modular.system.model.Relation;
+import com.stylefeng.guns.modular.system.model.Role;
+import com.stylefeng.guns.modular.system.service.IRoleService;
+
+@Service
+public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IRoleService {
+
+    @Resource
+    private RoleMapper roleMapper;
+
+    @Resource
+    private RelationMapper relationMapper;
+
+    @Override
+    @Transactional(readOnly = false)
+    public void setAuthority(Integer roleId, String ids) {
+
+        // 删除该角色所有的权限
+        this.roleMapper.deleteRolesById(roleId);
+
+        // 添加新的权限
+        for (Long id : Convert.toLongArray(true, Convert.toStrArray(",", ids))) {
+            Relation relation = new Relation();
+            relation.setRoleid(roleId);
+            relation.setMenuid(id);
+            this.relationMapper.insert(relation);
+        }
+    }
+
+    @Override
+    @Transactional(readOnly = false)
+    public void delRoleById(Integer roleId) {
+        //删除角色
+        this.roleMapper.deleteById(roleId);
+
+        // 删除该角色所有的权限
+        this.roleMapper.deleteRolesById(roleId);
+    }
+
+    @Override
+    public List<Map<String, Object>> selectRoles(String condition) {
+        return this.baseMapper.selectRoles(condition);
+    }
+
+    @Override
+    public int deleteRolesById(Integer roleId) {
+        return this.baseMapper.deleteRolesById(roleId);
+    }
+
+    @Override
+    public List<ZTreeNode> roleTreeList() {
+        return this.baseMapper.roleTreeList();
+    }
+
+    @Override
+    public List<ZTreeNode> roleTreeListByRoleId(String[] roleId) {
+        return this.baseMapper.roleTreeListByRoleId(roleId);
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponActivityServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponActivityServiceImpl.java
new file mode 100644
index 0000000..98bc00e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponActivityServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.SysCouponActivity;
+import com.stylefeng.guns.modular.system.dao.SysCouponActivityMapper;
+import com.stylefeng.guns.modular.system.service.ISysCouponActivityService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统设置-优惠券活动 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@Service
+public class SysCouponActivityServiceImpl extends ServiceImpl<SysCouponActivityMapper, SysCouponActivity> implements ISysCouponActivityService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponRecordServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponRecordServiceImpl.java
new file mode 100644
index 0000000..d8f2f31
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysCouponRecordServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.SysCouponRecord;
+import com.stylefeng.guns.modular.system.dao.SysCouponRecordMapper;
+import com.stylefeng.guns.modular.system.service.ISysCouponRecordService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统设置-优惠券记录 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-15
+ */
+@Service
+public class SysCouponRecordServiceImpl extends ServiceImpl<SysCouponRecordMapper, SysCouponRecord> implements ISysCouponRecordService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysRedPacketRecordServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysRedPacketRecordServiceImpl.java
new file mode 100644
index 0000000..f79e94e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysRedPacketRecordServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.SysRedPacketRecord;
+import com.stylefeng.guns.modular.system.dao.SysRedPacketRecordMapper;
+import com.stylefeng.guns.modular.system.service.ISysRedPacketRecordService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统设置-红包记录 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-13
+ */
+@Service
+public class SysRedPacketRecordServiceImpl extends ServiceImpl<SysRedPacketRecordMapper, SysRedPacketRecord> implements ISysRedPacketRecordService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAdvertisementServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAdvertisementServiceImpl.java
new file mode 100644
index 0000000..8b2a2ec
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAdvertisementServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TAdvertisement;
+import com.stylefeng.guns.modular.system.dao.TAdvertisementMapper;
+import com.stylefeng.guns.modular.system.service.ITAdvertisementService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 广告 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+@Service
+public class TAdvertisementServiceImpl extends ServiceImpl<TAdvertisementMapper, TAdvertisement> implements ITAdvertisementService {
+
+    @Override
+    public List<Map<String, Object>> getAdvertisementList(Page<Map<String, Object>> page, String beginTime, String endTime, Integer type, String name) {
+        return this.baseMapper.getAdvertisementList(page, beginTime, endTime, type, name);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAgreementServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAgreementServiceImpl.java
new file mode 100644
index 0000000..1462340
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TAgreementServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TAgreement;
+import com.stylefeng.guns.modular.system.dao.TAgreementMapper;
+import com.stylefeng.guns.modular.system.service.ITAgreementService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 平台协议 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-01
+ */
+@Service
+public class TAgreementServiceImpl extends ServiceImpl<TAgreementMapper, TAgreement> implements ITAgreementService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarBrandServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarBrandServiceImpl.java
new file mode 100644
index 0000000..e0cdb92
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarBrandServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCarBrand;
+import com.stylefeng.guns.modular.system.dao.TCarBrandMapper;
+import com.stylefeng.guns.modular.system.service.ITCarBrandService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 车辆品牌 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@Service
+public class TCarBrandServiceImpl extends ServiceImpl<TCarBrandMapper, TCarBrand> implements ITCarBrandService {
+
+    @Override
+    public List<Map<String, Object>> getCarBrandList(Page<Map<String, Object>> page, String beginTime, String endTime, String name) {
+        return this.baseMapper.getCarBrandList(page, beginTime, endTime, name);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarModelServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarModelServiceImpl.java
new file mode 100644
index 0000000..8ad1604
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarModelServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCarModel;
+import com.stylefeng.guns.modular.system.dao.TCarModelMapper;
+import com.stylefeng.guns.modular.system.service.ITCarModelService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 车辆车型 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@Service
+public class TCarModelServiceImpl extends ServiceImpl<TCarModelMapper, TCarModel> implements ITCarModelService {
+
+    @Override
+    public List<Map<String, Object>> getCarModelList(Page<Map<String, Object>> page, String beginTime, String endTime, String name) {
+        return this.baseMapper.getCarModelList(page, beginTime, endTime, name);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarServiceImpl.java
new file mode 100644
index 0000000..e2d68d7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarServiceImpl.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TCar;
+import com.stylefeng.guns.modular.system.dao.TCarMapper;
+import com.stylefeng.guns.modular.system.service.ITCarService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 车辆 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@Service
+public class TCarServiceImpl extends ServiceImpl<TCarMapper, TCar> implements ITCarService {
+
+    @Override
+    public List<Map<String, Object>> getCarList(Page<Map<String, Object>> page, Integer roleType, Integer nowUserId, String beginTime, String endTime, String id, String brandName, String modelName, String carColor, String serverStr, String carLicensePlate, String driverName, String companyName, String franchiseeName) {
+        return this.baseMapper.getCarList(page, roleType, nowUserId, beginTime, endTime, id, brandName, modelName, carColor, serverStr, carLicensePlate, driverName, companyName, franchiseeName);
+    }
+
+    @Override
+    public List<Map<String, Object>> getCarListNoPage(Integer roleType, Integer nowUserId) {
+        return this.baseMapper.getCarListNoPage(roleType, nowUserId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarServiceServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarServiceServiceImpl.java
new file mode 100644
index 0000000..bc01d89
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCarServiceServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TCarService;
+import com.stylefeng.guns.modular.system.dao.TCarServiceMapper;
+import com.stylefeng.guns.modular.system.service.ITCarServiceService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 车辆经营业务 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@Service
+public class TCarServiceServiceImpl extends ServiceImpl<TCarServiceMapper, TCarService> implements ITCarServiceService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCompanyCityServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCompanyCityServiceImpl.java
new file mode 100644
index 0000000..eb825e4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCompanyCityServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TCompanyCity;
+import com.stylefeng.guns.modular.system.dao.TCompanyCityMapper;
+import com.stylefeng.guns.modular.system.service.ITCompanyCityService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 公司经营地区 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-06
+ */
+@Service
+public class TCompanyCityServiceImpl extends ServiceImpl<TCompanyCityMapper, TCompanyCity> implements ITCompanyCityService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCompanyServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCompanyServiceImpl.java
new file mode 100644
index 0000000..654f690
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TCompanyServiceImpl.java
@@ -0,0 +1,237 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.Region;
+import com.stylefeng.guns.modular.system.model.TCompany;
+import com.stylefeng.guns.modular.system.dao.TCompanyMapper;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.service.ITCompanyService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 公司信息表 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-06
+ */
+@Service
+public class TCompanyServiceImpl extends ServiceImpl<TCompanyMapper, TCompany> implements ITCompanyService {
+
+
+    @Resource
+    private TCompanyMapper companyMapper;
+
+
+
+
+    @Override
+    public List<Map<String, Object>> getCompanyList(Page<Map<String, Object>> page, String beginTime, String endTime, String name, String principalName, String principalPhone, String adminName, String adminPhone, String serviceStr, Integer state) {
+        return this.baseMapper.getCompanyList(page, beginTime, endTime, name, principalName, principalPhone, adminName, adminPhone, serviceStr, state);
+    }
+
+    @Override
+    public List<Map<String, Object>> getCompanyScopeById(Integer id) {
+        return this.baseMapper.getCompanyScopeById(id);
+    }
+
+    @Override
+    public List<Map<String, Object>> getFranchiseeList(Page<Map<String, Object>> page, String beginTime, String endTime, String name, String account, String principalName, String principalPhone, String serviceStr, Integer state, Integer roleType, Integer nowUserId) {
+        return this.baseMapper.getFranchiseeList(page, beginTime, endTime, name, account, principalName, principalPhone, serviceStr, state, roleType, nowUserId);
+    }
+
+    @Override
+    public ResultUtil selectCompanyInfoById(String id) throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        TCompany companyInfo = this.selectById(id);
+        /*Address address = addressService.selectById((String) companyInfo.getDetailAddress());
+        companyInfo.setAddressId(address);
+        Map<String, List<Region>> regions = null;
+        if(null != address){
+            //查询注册地址对应的行政数据
+            regions = regionService.getRegions(address.getProvince(), address.getCity());
+        }
+        //查询企业的超级管理员
+        EntityWrapper<User> entityWrapper = new EntityWrapper<>();
+        entityWrapper.eq("is_admin", "0");
+        entityWrapper.eq("company_info_id", companyInfo.getCompanyId());
+        entityWrapper.ne("status", 3);
+        User user = userService.selectOne(entityWrapper);
+
+        //查询企业的经营范围
+        List<OperateRegion> OperateRegions = operateRegionService.getDataByCompanyInfoId(companyInfo.getCompanyId());
+
+        map.put("companyInfo", companyInfo);
+        map.put("region", regions);
+        map.put("OperateRegion", OperateRegions);
+        map.put("admin", user);*/
+        return ResultUtil.success(map);
+    }
+
+
+    /**
+     * 获取运营汇总数据
+     * @param type
+     * @param start
+     * @param end
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryOperationalData(Integer type, String start, String end, Integer companyId, Integer offset, Integer limit) throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        List<Map<String, Object>> list = companyMapper.queryOperationalData(type, start, end, companyId, offset, limit);
+        int i = companyMapper.queryOperationalDataCount(type, start, end, companyId);
+        map.put("rows", list);
+        map.put("total", i);
+        return map;
+    }
+
+
+    /**
+     * 下载运营汇总数据
+     * @param type
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public HSSFWorkbook downloadOperationalData(Integer type, String start, String end, Integer companyId) throws Exception {
+        List<Map<String, Object>> list = companyMapper.queryOperationalData(type, start, end, companyId, null, null);
+
+        List<List<String>> lists = new ArrayList<>();
+        List<String> list1 = new ArrayList<>();
+        list1.add("类别:");
+        list1.add(type == 1 ? "专车" : type == 2 ? "出租车" : type == 3 ? "城际" : "小件物流");
+        list1.add("");
+        list1.add("");
+        list1.add("起止时间:");
+        list1.add(null == start || "".equals(start) ? "" : start + " ~ " + end);
+        list1.add("");
+        list1.add("");
+        list1.add("运营商:");
+        String company = "";
+        if(null != companyId){
+            company = companyMapper.selectById(companyId).getName();
+        }
+        list1.add(company);
+        list1.add("");
+        list1.add("");
+        lists.add(list1);
+        list1 = new ArrayList<>();
+        list1.add("日期");
+        list1.add("用户注册数量");
+        list1.add("在线司机数");
+        list1.add("订单情况");
+        list1.add("");
+        list1.add("");
+        list1.add("支付情况");
+        list1.add("");
+        list1.add("");
+        list1.add("");
+        list1.add("");
+        list1.add("投诉数量");
+        lists.add(list1);
+        list1 = new ArrayList<>();
+        list1.add("");
+        list1.add("");
+        list1.add("");
+        list1.add("下单数量");
+        list1.add("乘客取消数量");
+        list1.add("取消占比");
+        list1.add("通过平台支付(单)");
+        list1.add("通过其它支付(单)");
+        list1.add("合计");
+        list1.add("平台支付占比%");
+        list1.add("金额");
+        list1.add("");
+        lists.add(list1);
+
+        List<List<List<String>>> lists1 = new ArrayList<>();
+        List<List<String>> lists2 = new ArrayList<>();
+        for(Map<String, Object> map : list){
+            List<String> list2 = new ArrayList<>();
+            list2.add(null != map.get("time") ? map.get("time").toString() : "");
+            list2.add(null != map.get("register") ? map.get("register").toString() : "");
+            list2.add(null != map.get("online") ? map.get("online").toString() : "");
+            list2.add(null != map.get("orderNum") ? map.get("orderNum").toString() : "");
+            list2.add(null != map.get("cancelNum") ? map.get("cancelNum").toString() : "");
+            list2.add(null != map.get("cancelProportion") ? map.get("cancelProportion").toString() : "");
+            list2.add(null != map.get("onlinePay") ? map.get("onlinePay").toString() : "");
+            list2.add(null != map.get("offlinePay") ? map.get("offlinePay").toString() : "");
+            list2.add(null != map.get("total") ? map.get("total").toString() : "");
+            list2.add(null != map.get("payProportion") ? map.get("payProportion").toString() : "");
+            list2.add(null != map.get("money") ? map.get("money").toString() : "");
+            list2.add(null != map.get("complaint") ? map.get("complaint").toString() : "");
+            lists2.add(list2);
+        }
+        lists1.add(lists2);
+        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
+        HSSFSheet hssfSheet = hssfWorkbook.createSheet();
+        hssfSheet.setColumnWidth(0, 6 * 256);
+        hssfSheet.setDefaultRowHeightInPoints(20f);
+        for(int i = 0; i < lists.size(); i++){
+            HSSFRow hssfRow = hssfSheet.createRow(i);//设置第一行数据(标题)
+            HSSFCellStyle style = hssfWorkbook.createCellStyle();
+            HSSFFont font = hssfWorkbook.createFont();
+            font.setBold(true);
+            style.setFont(font);
+            style.setAlignment(HorizontalAlignment.CENTER);
+            for (int l = 0; l < lists.get(i).size(); l++) {
+                HSSFCell hssfCell = hssfRow.createCell(l);
+                hssfCell.setCellType(CellType.STRING);//设置表格类型
+                hssfCell.setCellValue(lists.get(i).get(l));
+                hssfCell.setCellStyle(style);
+                if(l > 0) {
+                    hssfSheet.setColumnWidth(l , 20 * 256);
+                }
+
+            }
+        }
+        //这个就是合并单元格
+        //参数说明:1:开始行 2:结束行  3:开始列 4:结束列
+        //比如我要合并 第二行到第四行的    第六列到第八列     sheet.addMergedRegion(new CellRangeAddress(1,3,5,7));
+        hssfSheet.addMergedRegion(new CellRangeAddress(0,0,1,3));
+        hssfSheet.addMergedRegion(new CellRangeAddress(0,0,5,7));
+        hssfSheet.addMergedRegion(new CellRangeAddress(0,0,9,10));
+        hssfSheet.addMergedRegion(new CellRangeAddress(1,2,0,0));
+        hssfSheet.addMergedRegion(new CellRangeAddress(1,2,1,1));
+        hssfSheet.addMergedRegion(new CellRangeAddress(1,2,2,2));
+        hssfSheet.addMergedRegion(new CellRangeAddress(1,1,3,5));
+        hssfSheet.addMergedRegion(new CellRangeAddress(1,1,6,10));
+        hssfSheet.addMergedRegion(new CellRangeAddress(1,2,11,11));
+
+
+        for(int i = 0; i < lists1.size(); i++){
+            //将数据添加到表格中
+            List<String> data = null;
+            for (int l = 0; l < lists1.get(i).size(); l++) {
+                HSSFRow row = hssfSheet.createRow(l + 3);
+                data = lists1.get(i).get(l);
+                for (int j = 0; j < data.size(); j++) {
+                    HSSFCell hssfCell = row.createCell(j);
+                    hssfCell.setCellType(CellType.STRING);//设置表格类型
+                    hssfCell.setCellValue(data.get(j));
+                }
+            }
+        }
+        return hssfWorkbook;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TComplaintServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TComplaintServiceImpl.java
new file mode 100644
index 0000000..1574c0d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TComplaintServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TComplaint;
+import com.stylefeng.guns.modular.system.dao.TComplaintMapper;
+import com.stylefeng.guns.modular.system.service.ITComplaintService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 投诉管理 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TComplaintServiceImpl extends ServiceImpl<TComplaintMapper, TComplaint> implements ITComplaintService {
+
+    @Override
+    public List<Map<String, Object>> getComplaintList(Page<Map<String, Object>> page, Integer roleType, Integer nowUserId, String beginTime, String endTime, String userName, String userPhone, String driverPhone, Integer isHandle) {
+        return this.baseMapper.getComplaintList(page, roleType, nowUserId, beginTime, endTime, userName, userPhone, driverPhone, isHandle);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDispatchServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDispatchServiceImpl.java
new file mode 100644
index 0000000..ee6ce98
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDispatchServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TDispatch;
+import com.stylefeng.guns.modular.system.dao.TDispatchMapper;
+import com.stylefeng.guns.modular.system.service.ITDispatchService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 调度管理 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-01
+ */
+@Service
+public class TDispatchServiceImpl extends ServiceImpl<TDispatchMapper, TDispatch> implements ITDispatchService {
+
+    @Override
+    public List<Map<String, Object>> getDispatchList(Page<Map<String, Object>> page, Integer roleType, Integer nowUserId, String beginTime, String endTime, String name, String companyName, String franchiseeName, String account, Integer state) {
+        return this.baseMapper.getDispatchList(page, roleType, nowUserId, beginTime, endTime, name, companyName, franchiseeName, account, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverLineServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverLineServiceImpl.java
new file mode 100644
index 0000000..c36e642
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverLineServiceImpl.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TDriverLine;
+import com.stylefeng.guns.modular.system.dao.TDriverLineMapper;
+import com.stylefeng.guns.modular.system.service.ITDriverLineService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机关联线路 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@Service
+public class TDriverLineServiceImpl extends ServiceImpl<TDriverLineMapper, TDriverLine> implements ITDriverLineService {
+
+    @Override
+    public List<Map<String, Object>> getDriverLineListByDriverId(Integer driverId) {
+        return this.baseMapper.getDriverLineListByDriverId(driverId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverServiceImpl.java
new file mode 100644
index 0000000..a47b5e0
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverServiceImpl.java
@@ -0,0 +1,64 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TDriver;
+import com.stylefeng.guns.modular.system.dao.TDriverMapper;
+import com.stylefeng.guns.modular.system.service.ITDriverService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机表 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-04
+ */
+@Service
+public class TDriverServiceImpl extends ServiceImpl<TDriverMapper, TDriver> implements ITDriverService {
+
+    @Override
+    public List<Map<String, Object>> getAuthDriverList(Page<Map<String, Object>> page, String beginTime, String endTime, String companyName, String phone, String account, Integer addType, Integer authState) {
+        return this.baseMapper.getAuthDriverList(page, beginTime, endTime, companyName, phone, account, addType, authState);
+    }
+
+    @Override
+    public Map<String, Object> getDriverById(Integer driverId) {
+        return this.baseMapper.getDriverById(driverId);
+    }
+
+    @Override
+    public List<Map<String, Object>> getDriverList(Page<Map<String, Object>> page, Integer roleType,Integer nowUserId,String beginTime, String endTime, String companyName, String phone, String name, Integer addType, Integer authState) {
+        return this.baseMapper.getDriverList(page,roleType,nowUserId, beginTime, endTime, companyName, phone, name, addType, authState);
+    }
+
+    @Override
+    public String getUseCarIdStr(Integer carId) {
+        return this.baseMapper.getUseCarIdStr(carId);
+    }
+
+    @Override
+    public List<Map<String, Object>> getCanSelectCarList(Page<Map<String, Object>> page, Integer roleType, Integer nowUserId, String carIdStr, String carLicensePlate, String brandName, String modelName, String color, String serverStr) {
+        return this.baseMapper.getCanSelectCarList(page, roleType, nowUserId, carIdStr, carLicensePlate, brandName, modelName, color, serverStr);
+    }
+
+    @Override
+    public void updateCompanyDriverState(Integer authState, Integer companyId) {
+        this.baseMapper.updateCompanyDriverState(authState, companyId);
+    }
+
+    @Override
+    public void updateFranchiseeDriverState(Integer authState, Integer franchiseeId) {
+        this.baseMapper.updateFranchiseeDriverState(authState, franchiseeId);
+    }
+
+    @Override
+    public List<Map<String, Object>> getDriverListNoPage(Integer roleType, Integer nowUserId) {
+        return this.baseMapper.getDriverListNoPage(roleType, nowUserId);
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverServiceServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverServiceServiceImpl.java
new file mode 100644
index 0000000..8db7271
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverServiceServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TDriverService;
+import com.stylefeng.guns.modular.system.dao.TDriverServiceMapper;
+import com.stylefeng.guns.modular.system.service.ITDriverServiceService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 司机经营业务 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-05
+ */
+@Service
+public class TDriverServiceServiceImpl extends ServiceImpl<TDriverServiceMapper, TDriverService> implements ITDriverServiceService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TFeedbackServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TFeedbackServiceImpl.java
new file mode 100644
index 0000000..01befe7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TFeedbackServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TFeedback;
+import com.stylefeng.guns.modular.system.dao.TFeedbackMapper;
+import com.stylefeng.guns.modular.system.service.ITFeedbackService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 反馈管理 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+@Service
+public class TFeedbackServiceImpl extends ServiceImpl<TFeedbackMapper, TFeedback> implements ITFeedbackService {
+
+    @Override
+    public List<Map<String, Object>> getFeedbackList(Page<Map<String, Object>> page, String beginTime, String endTime, Integer type, String name, String phone, Integer state) {
+        return this.baseMapper.getFeedbackList(page, beginTime, endTime, type, name, phone, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TIntegralGoodsServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TIntegralGoodsServiceImpl.java
new file mode 100644
index 0000000..041b1f3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TIntegralGoodsServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TIntegralGoods;
+import com.stylefeng.guns.modular.system.dao.TIntegralGoodsMapper;
+import com.stylefeng.guns.modular.system.service.ITIntegralGoodsService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 积分商品管理 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+@Service
+public class TIntegralGoodsServiceImpl extends ServiceImpl<TIntegralGoodsMapper, TIntegralGoods> implements ITIntegralGoodsService {
+
+    @Override
+    public List<Map<String, Object>> getIntegralGoodsList(Page<Map<String, Object>> page, String beginTime, String endTime, String name, Integer state) {
+        return this.baseMapper.getIntegralGoodsList(page, beginTime, endTime, name, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TIntegralOrderServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TIntegralOrderServiceImpl.java
new file mode 100644
index 0000000..1470b74
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TIntegralOrderServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TIntegralOrder;
+import com.stylefeng.guns.modular.system.dao.TIntegralOrderMapper;
+import com.stylefeng.guns.modular.system.service.ITIntegralOrderService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 积分订单管理 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+@Service
+public class TIntegralOrderServiceImpl extends ServiceImpl<TIntegralOrderMapper, TIntegralOrder> implements ITIntegralOrderService {
+
+    @Override
+    public List<Map<String, Object>> getIntegralOrderList(Page<Map<String, Object>> page, String beginTime, String endTime, String userName, String goodsName, String consigneeName, String consigneePhone, Integer state) {
+        return this.baseMapper.getIntegralOrderList(page, beginTime, endTime, userName, goodsName, consigneeName, consigneePhone, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TInvoiceServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TInvoiceServiceImpl.java
new file mode 100644
index 0000000..d3aca8e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TInvoiceServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TInvoice;
+import com.stylefeng.guns.modular.system.dao.TInvoiceMapper;
+import com.stylefeng.guns.modular.system.service.ITInvoiceService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 发票 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TInvoiceServiceImpl extends ServiceImpl<TInvoiceMapper, TInvoice> implements ITInvoiceService {
+
+    @Override
+    public List<Map<String, Object>> getInvoiceList(Page<Map<String, Object>> page, String beginTime, String endTime, String email, String name, Integer type, Integer state) {
+        return this.baseMapper.getInvoiceList(page, beginTime, endTime, email, name, type, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineCompanyServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineCompanyServiceImpl.java
new file mode 100644
index 0000000..bcc4a64
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineCompanyServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TLineCompany;
+import com.stylefeng.guns.modular.system.dao.TLineCompanyMapper;
+import com.stylefeng.guns.modular.system.service.ITLineCompanyService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 企业-线路关系表 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@Service
+public class TLineCompanyServiceImpl extends ServiceImpl<TLineCompanyMapper, TLineCompany> implements ITLineCompanyService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLinePriceServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLinePriceServiceImpl.java
new file mode 100644
index 0000000..c444d0f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLinePriceServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TLinePrice;
+import com.stylefeng.guns.modular.system.dao.TLinePriceMapper;
+import com.stylefeng.guns.modular.system.service.ITLinePriceService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 跨城线路价格规则 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@Service
+public class TLinePriceServiceImpl extends ServiceImpl<TLinePriceMapper, TLinePrice> implements ITLinePriceService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineServiceImpl.java
new file mode 100644
index 0000000..14b72b8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineServiceImpl.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TLine;
+import com.stylefeng.guns.modular.system.dao.TLineMapper;
+import com.stylefeng.guns.modular.system.service.ITLineService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 跨城线路 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-15
+ */
+@Service
+public class TLineServiceImpl extends ServiceImpl<TLineMapper, TLine> implements ITLineService {
+
+    @Override
+    public List<Map<String, Object>> getLineList(Page<Map<String, Object>> page, String beginTime, String endTime, String name, String insertUser, String modelStr, Integer state) {
+        return this.baseMapper.getLineList(page, beginTime, endTime, name, insertUser, modelStr, state);
+    }
+
+    @Override
+    public List<Map<String, Object>> getLinePriceList(Integer lineId) {
+        return this.baseMapper.getLinePriceList(lineId);
+    }
+
+    @Override
+    public List<Map<String, Object>> getLineCompanyList(Integer lineId) {
+        return this.baseMapper.getLineCompanyList(lineId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineShiftServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineShiftServiceImpl.java
new file mode 100644
index 0000000..cfb7e48
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineShiftServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TLineShift;
+import com.stylefeng.guns.modular.system.dao.TLineShiftMapper;
+import com.stylefeng.guns.modular.system.service.ITLineShiftService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 线路班次 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@Service
+public class TLineShiftServiceImpl extends ServiceImpl<TLineShiftMapper, TLineShift> implements ITLineShiftService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineSiteServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineSiteServiceImpl.java
new file mode 100644
index 0000000..ee56fee
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLineSiteServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TLineSite;
+import com.stylefeng.guns.modular.system.dao.TLineSiteMapper;
+import com.stylefeng.guns.modular.system.service.ITLineSiteService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 线路-站点关系表 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@Service
+public class TLineSiteServiceImpl extends ServiceImpl<TLineSiteMapper, TLineSite> implements ITLineSiteService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLocationServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLocationServiceImpl.java
new file mode 100644
index 0000000..67d9d01
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TLocationServiceImpl.java
@@ -0,0 +1,58 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.modular.system.model.TLocation;
+import com.stylefeng.guns.modular.system.dao.TLocationMapper;
+import com.stylefeng.guns.modular.system.service.ITLocationService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 地点 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-04
+ */
+@Service
+public class TLocationServiceImpl extends ServiceImpl<TLocationMapper, TLocation> implements ITLocationService {
+
+    @Autowired
+    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+
+
+    /**
+     * 定时任务更新线上围栏的有效时间
+     * @throws Exception
+     */
+    @Override
+    public void updateFence() throws Exception {
+        Date date = new Date();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 35);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        List<TLocation> type = this.selectList(new EntityWrapper<TLocation>().eq("type", 2));
+        for(TLocation location : type){
+            if((date.getTime() - location.getUpdateTime().getTime()) > 30 * 24 * 60 * 60 * 1000){//更新一个月之前的数据
+                String[] s = location.getGid().split("_");
+                String[] s1 = location.getCoordinate().split("_");
+                for(int i = 0; i < s.length; i++){
+                    String[] split = s1[i].split(";");
+                    gdMapElectricFenceUtil.updateElectricFenc(s[i], "location_" + location.getId(),
+                            (split.length > 2 ? "" : split[0]), (split.length > 2 ? "" : split[1]),
+                            (split.length > 2 ? s1[i] : ""), sdf.format(calendar.getTime()));
+                }
+
+            }
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TNoticesServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TNoticesServiceImpl.java
new file mode 100644
index 0000000..fb3ad53
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TNoticesServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TNotices;
+import com.stylefeng.guns.modular.system.dao.TNoticesMapper;
+import com.stylefeng.guns.modular.system.service.ITNoticesService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 发布公告和滚动消息 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+@Service
+public class TNoticesServiceImpl extends ServiceImpl<TNoticesMapper, TNotices> implements ITNoticesService {
+
+    @Override
+    public List<Map<String, Object>> getRollingNoticeList(Page<Map<String, Object>> page, String beginTime, String endTime,Integer typeValue, String content) {
+        return this.baseMapper.getRollingNoticeList(page, beginTime, endTime,typeValue, content);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOpenCityBusinessServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOpenCityBusinessServiceImpl.java
new file mode 100644
index 0000000..2d76a5e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOpenCityBusinessServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TOpenCityBusiness;
+import com.stylefeng.guns.modular.system.dao.TOpenCityBusinessMapper;
+import com.stylefeng.guns.modular.system.service.ITOpenCityBusinessService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 开通城市经营业务 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+@Service
+public class TOpenCityBusinessServiceImpl extends ServiceImpl<TOpenCityBusinessMapper, TOpenCityBusiness> implements ITOpenCityBusinessService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOpenCityServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOpenCityServiceImpl.java
new file mode 100644
index 0000000..a106fde
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOpenCityServiceImpl.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOpenCity;
+import com.stylefeng.guns.modular.system.dao.TOpenCityMapper;
+import com.stylefeng.guns.modular.system.service.ITOpenCityService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 开通城市表 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+@Service
+public class TOpenCityServiceImpl extends ServiceImpl<TOpenCityMapper, TOpenCity> implements ITOpenCityService {
+
+    @Override
+    public List<Map<String, Object>> getOpenCityList(Page<Map<String, Object>> page, String beginTime, String endTime, String condition) {
+        return this.baseMapper.getOpenCityList(page, beginTime, endTime, condition);
+    }
+
+    @Override
+    public List<Map<String,Object>> getBusinessByCityId(Integer openCityId) {
+        return this.baseMapper.getBusinessByCityId(openCityId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCharterServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCharterServiceImpl.java
new file mode 100644
index 0000000..2791e45
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCharterServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderCharter;
+import com.stylefeng.guns.modular.system.dao.TOrderCharterMapper;
+import com.stylefeng.guns.modular.system.service.ITOrderCharterService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 包车订单 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+@Service
+public class TOrderCharterServiceImpl extends ServiceImpl<TOrderCharterMapper, TOrderCharter> implements ITOrderCharterService {
+
+    @Override
+    public List<Map<String, Object>> getCharterOrderList(Page<Map<String, Object>> page, String beginTime, String endTime, String userName, String contactName, String contactPhone, String useDemand, Integer state) {
+        return this.baseMapper.getCharterOrderList(page, beginTime, endTime, userName, contactName, contactPhone, useDemand, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCharteredCarServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCharteredCarServiceImpl.java
new file mode 100644
index 0000000..bd6f670
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCharteredCarServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderCharteredCar;
+import com.stylefeng.guns.modular.system.dao.TOrderCharteredCarMapper;
+import com.stylefeng.guns.modular.system.service.ITOrderCharteredCarService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-包车 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-24
+ */
+@Service
+public class TOrderCharteredCarServiceImpl extends ServiceImpl<TOrderCharteredCarMapper, TOrderCharteredCar> implements ITOrderCharteredCarService {
+
+    @Override
+    public List<Map<String, Object>> getCharterCarOrderList(Page<Map<String, Object>> page, String beginTime, String endTime, String userName, String contactPerson, String contactPhone, String modelUse, Integer state, Integer roleType, Integer nowUserId) {
+        return this.baseMapper.getCharterCarOrderList(page, beginTime, endTime, userName, contactPerson, contactPhone, modelUse, state, roleType, nowUserId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCrossCityServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCrossCityServiceImpl.java
new file mode 100644
index 0000000..248b9bb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderCrossCityServiceImpl.java
@@ -0,0 +1,58 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderCrossCity;
+import com.stylefeng.guns.modular.system.dao.TOrderCrossCityMapper;
+import com.stylefeng.guns.modular.system.service.ITOrderCrossCityService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-跨城 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@Service
+public class TOrderCrossCityServiceImpl extends ServiceImpl<TOrderCrossCityMapper, TOrderCrossCity> implements ITOrderCrossCityService {
+
+    @Resource
+    private TOrderCrossCityMapper orderCrossCityMapper;
+
+    @Override
+    public List<Map<String, Object>> getCrossCityOrderList(Page<Map<String, Object>> page, String beginTime, String endTime, Integer roleType, Integer nowUserId, String orderNum, Integer orderSource, String userName, String userPhone, String passengers, String passengersPhone, Integer serverCarModelId, String driver, Integer lineId, Integer state) {
+        return this.baseMapper.getCrossCityOrderList(page, beginTime, endTime, roleType, nowUserId, orderNum, orderSource, userName, userPhone, passengers, passengersPhone, serverCarModelId, driver, lineId, state);
+    }
+
+    @Override
+    public Map<String, Object> getCrossCityOrderDetailById(Integer orderId) {
+        return this.baseMapper.getCrossCityOrderDetailById(orderId);
+    }
+
+    @Override
+    public List<TOrderCrossCity> queryOrders(Integer driverId, Integer lineShiftDriverId, List<Integer> state) {
+        return orderCrossCityMapper.queryOrders(driverId, lineShiftDriverId, state);
+    }
+
+    /**
+     * 获取订单编号
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public synchronized String getOrderNum(Integer driverId, Integer lineShiftDriverId) throws Exception{
+        List<TOrderCrossCity> orderCrossCities = orderCrossCityMapper.queryOrders(driverId, lineShiftDriverId, Arrays.asList(2, 3, 4, 7));
+        if(orderCrossCities.size() > 0){
+            return orderCrossCities.get(0).getOrderNum();
+        }
+        int size = this.selectCount(null);
+        return "CROSS" + String.valueOf(1000000 + size + 1).substring(1);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderEvaluateServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderEvaluateServiceImpl.java
new file mode 100644
index 0000000..040b372
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderEvaluateServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderEvaluate;
+import com.stylefeng.guns.modular.system.dao.TOrderEvaluateMapper;
+import com.stylefeng.guns.modular.system.service.ITOrderEvaluateService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单评价 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TOrderEvaluateServiceImpl extends ServiceImpl<TOrderEvaluateMapper, TOrderEvaluate> implements ITOrderEvaluateService {
+
+    @Override
+    public List<Map<String, Object>> getOrderEvaluateList(Page<Map<String, Object>> page, Integer roleType, Integer nowUserId, String beginTime, String endTime, String userName, String userPhone, String driverName, String driverPhone, String fraction, Integer orderType) {
+        return this.baseMapper.getOrderEvaluateList(page, roleType, nowUserId, beginTime, endTime, userName, userPhone, driverName, driverPhone, fraction, orderType);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderLogisticsServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderLogisticsServiceImpl.java
new file mode 100644
index 0000000..01810cf
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderLogisticsServiceImpl.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderLogistics;
+import com.stylefeng.guns.modular.system.dao.TOrderLogisticsMapper;
+import com.stylefeng.guns.modular.system.service.ITOrderLogisticsService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-小件物流 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-24
+ */
+@Service
+public class TOrderLogisticsServiceImpl extends ServiceImpl<TOrderLogisticsMapper, TOrderLogistics> implements ITOrderLogisticsService {
+
+    @Override
+    public List<Map<String, Object>> getLogisticsOrderList(Page<Map<String, Object>> page, String beginTime, String endTime, Integer roleType, Integer nowUserId, String orderNum, Integer orderSource, Integer type, String userName, String userPhone, String recipient, String recipientPhone, String driver, Integer state) {
+        return this.baseMapper.getLogisticsOrderList(page, beginTime, endTime, roleType, nowUserId, orderNum, orderSource, type, userName, userPhone, recipient, recipientPhone, driver, state);
+    }
+
+    @Override
+    public Map<String, Object> getLogisticsOrderDetailById(Integer orderId) {
+        return this.baseMapper.getLogisticsOrderDetailById(orderId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPositionServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPositionServiceImpl.java
new file mode 100644
index 0000000..5d57d5d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPositionServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TOrderPosition;
+import com.stylefeng.guns.modular.system.dao.TOrderPositionMapper;
+import com.stylefeng.guns.modular.system.service.ITOrderPositionService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 订单坐标信息表 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-08
+ */
+@Service
+public class TOrderPositionServiceImpl extends ServiceImpl<TOrderPositionMapper, TOrderPosition> implements ITOrderPositionService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java
new file mode 100644
index 0000000..8144e9d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderPrivateCar;
+import com.stylefeng.guns.modular.system.dao.TOrderPrivateCarMapper;
+import com.stylefeng.guns.modular.system.service.ITOrderPrivateCarService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-专车 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-02
+ */
+@Service
+public class TOrderPrivateCarServiceImpl extends ServiceImpl<TOrderPrivateCarMapper, TOrderPrivateCar> implements ITOrderPrivateCarService {
+
+    @Override
+    public List<Map<String, Object>> getPrivateCarOrderList(Page<Map<String, Object>> page, String beginTime, String endTime, Integer roleType, Integer nowUserId, String orderNum, Integer orderSource, String userName, String userPhone, String passengers, String passengersPhone, Integer serverCarModelId, String driver, Integer state) {
+        return this.baseMapper.getPrivateCarOrderList(page, beginTime, endTime, roleType, nowUserId, orderNum, orderSource, userName, userPhone, passengers, passengersPhone, serverCarModelId, driver, state);
+    }
+
+    @Override
+    public Map<String, Object> getPrivateCarOrderDetailById(Integer orderId) {
+        return this.baseMapper.getPrivateCarOrderDetailById(orderId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderTaxiServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderTaxiServiceImpl.java
new file mode 100644
index 0000000..3dcf708
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderTaxiServiceImpl.java
@@ -0,0 +1,56 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TOrderPosition;
+import com.stylefeng.guns.modular.system.model.TOrderTaxi;
+import com.stylefeng.guns.modular.system.dao.TOrderTaxiMapper;
+import com.stylefeng.guns.modular.system.service.ITOrderTaxiService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单-出租车 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-08
+ */
+@Service
+public class TOrderTaxiServiceImpl extends ServiceImpl<TOrderTaxiMapper, TOrderTaxi> implements ITOrderTaxiService {
+
+    @Override
+    public List<Map<String, Object>> getTaxiOrderList(Page<Map<String, Object>> page, String beginTime, String endTime, Integer roleType, Integer nowUserId, String orderNum, Integer orderSource, String userName, String userPhone, String passengers, String passengersPhone, String driver, Integer state) {
+        return this.baseMapper.getTaxiOrderList(page, beginTime, endTime, roleType, nowUserId, orderNum, orderSource, userName, userPhone, passengers, passengersPhone, driver, state);
+    }
+
+    @Override
+    public Map<String, Object> getTaxiOrderDetailById(Integer orderId) {
+        return this.baseMapper.getTaxiOrderDetailById(orderId);
+    }
+
+    @Override
+    public List<Map<String, Object>> getCanSelectTaxiDriverList(Page<Map<String, Object>> page,Integer companyId, String name, String phone) {
+        return this.baseMapper.getCanSelectTaxiDriverList(page,companyId, name, phone);
+    }
+
+    @Override
+    public Integer getAllOrderNum(Integer companyId, String beginTime, String endTime) {
+        return this.baseMapper.getAllOrderNum(companyId, beginTime, endTime);
+    }
+
+    @Override
+    public Double getAllTradeMoney(Integer companyId, String beginTime, String endTime) {
+        return this.baseMapper.getAllTradeMoney(companyId, beginTime, endTime);
+    }
+
+    @Override
+    public Double getAllIncomeMoney(Integer companyId, String beginTime, String endTime) {
+        return this.baseMapper.getAllIncomeMoney(companyId, beginTime, endTime);
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPhoneServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPhoneServiceImpl.java
new file mode 100644
index 0000000..c8f505b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPhoneServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TPhone;
+import com.stylefeng.guns.modular.system.dao.TPhoneMapper;
+import com.stylefeng.guns.modular.system.service.ITPhoneService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统电话设置 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TPhoneServiceImpl extends ServiceImpl<TPhoneMapper, TPhone> implements ITPhoneService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TProblemServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TProblemServiceImpl.java
new file mode 100644
index 0000000..5382b4f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TProblemServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TProblem;
+import com.stylefeng.guns.modular.system.dao.TProblemMapper;
+import com.stylefeng.guns.modular.system.service.ITProblemService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 在线客服 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-24
+ */
+@Service
+public class TProblemServiceImpl extends ServiceImpl<TProblemMapper, TProblem> implements ITProblemService {
+
+    @Override
+    public List<Map<String, Object>> getProblemList(Page<Map<String, Object>> page, String beginTime, String endTime, String userName, Integer state) {
+        return this.baseMapper.getProblemList(page, beginTime, endTime, userName, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPubTransactionDetailsServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPubTransactionDetailsServiceImpl.java
new file mode 100644
index 0000000..70ac626
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPubTransactionDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TPubTransactionDetails;
+import com.stylefeng.guns.modular.system.dao.TPubTransactionDetailsMapper;
+import com.stylefeng.guns.modular.system.service.ITPubTransactionDetailsService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 交易明细(司机/用户) 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-16
+ */
+@Service
+public class TPubTransactionDetailsServiceImpl extends ServiceImpl<TPubTransactionDetailsMapper, TPubTransactionDetails> implements ITPubTransactionDetailsService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPubWithdrawalServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPubWithdrawalServiceImpl.java
new file mode 100644
index 0000000..9efc967
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TPubWithdrawalServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TPubWithdrawal;
+import com.stylefeng.guns.modular.system.dao.TPubWithdrawalMapper;
+import com.stylefeng.guns.modular.system.service.ITPubWithdrawalService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 提现记录表(司机/用户) 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TPubWithdrawalServiceImpl extends ServiceImpl<TPubWithdrawalMapper, TPubWithdrawal> implements ITPubWithdrawalService {
+
+    @Override
+    public List<Map<String, Object>> getWithdrawalList(Page<Map<String, Object>> page, String beginTime, String endTime, String name, Integer withdrawalType) {
+        return this.baseMapper.getWithdrawalList(page, beginTime, endTime, name, withdrawalType);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java
new file mode 100644
index 0000000..0440f96
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java
@@ -0,0 +1,55 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TReassign;
+import com.stylefeng.guns.modular.system.dao.TReassignMapper;
+import com.stylefeng.guns.modular.system.service.ITReassignService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 订单改派 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-03
+ */
+@Service
+public class TReassignServiceImpl extends ServiceImpl<TReassignMapper, TReassign> implements ITReassignService {
+
+    @Override
+    public List<Map<String, Object>> getPrivateCarReassignOrderList(Page<Map<String, Object>> page, Integer roleType, Integer nowUserId, String beginTime, String endTime, String originalDriverName, String originalDriverPhone, String orderNum, String nowDriverName, String nowDriverPhone, Integer orderState, Integer state) {
+        return this.baseMapper.getPrivateCarReassignOrderList(page, roleType, nowUserId, beginTime, endTime, originalDriverName, originalDriverPhone, orderNum, nowDriverName, nowDriverPhone, orderState, state);
+    }
+
+    @Override
+    public List<Map<String, Object>> getCanSelectPrivateCarDriverList(Page<Map<String, Object>> page, Integer companyId, String name, String phone) {
+        return this.baseMapper.getCanSelectPrivateCarDriverList(page, companyId, name, phone);
+    }
+
+    @Override
+    public List<Map<String, Object>> getCanSelectSmallDriverList(Page<Map<String, Object>> page, Integer companyId, Integer type, String name, String phone) {
+        return this.baseMapper.getCanSelectSmallDriverList(page, companyId, type, name, phone);
+    }
+
+
+    @Override
+    public List<Map<String, Object>> getCrossReassignOrderList(Page<Map<String, Object>> page, Integer roleType, Integer nowUserId, String beginTime, String endTime, String originalDriverName, String originalDriverPhone, String orderNum, String nowDriverName, String nowDriverPhone, Integer orderState, Integer state) {
+        return this.baseMapper.getCrossReassignOrderList(page, roleType, nowUserId, beginTime, endTime, originalDriverName, originalDriverPhone, orderNum, nowDriverName, nowDriverPhone, orderState, state);
+    }
+
+    @Override
+    public List<Map<String, Object>> getCanSelectCrossDriverList(Page<Map<String, Object>> page, Integer companyId, Integer serverCarModelId, Integer lineId, Integer lineShiftId, Date time, Integer num, String name, String phone, Integer driverId) {
+        return this.baseMapper.getCanSelectCrossDriverList(page, companyId, serverCarModelId, lineId, lineShiftId, time, num, name, phone, driverId);
+    }
+
+    @Override
+    public List<Map<String, Object>> getSmallPieceLogisticsList(Page<Map<String, Object>> page, Integer roleType, Integer nowUserId, String beginTime, String endTime, String originalDriverName, String originalDriverPhone, String orderNum, String nowDriverName, String nowDriverPhone, Integer orderState, Integer state) {
+        return this.baseMapper.getSmallPieceLogisticsList(page, roleType, nowUserId, beginTime, endTime, originalDriverName, originalDriverPhone, orderNum, nowDriverName, nowDriverPhone, orderState, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TRegionServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TRegionServiceImpl.java
new file mode 100644
index 0000000..4820c3c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TRegionServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TRegion;
+import com.stylefeng.guns.modular.system.dao.TRegionMapper;
+import com.stylefeng.guns.modular.system.service.ITRegionService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 省市区三级联动 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+@Service
+public class TRegionServiceImpl extends ServiceImpl<TRegionMapper, TRegion> implements ITRegionService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TServerCarmodelServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TServerCarmodelServiceImpl.java
new file mode 100644
index 0000000..0cb05bb
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TServerCarmodelServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TServerCarmodel;
+import com.stylefeng.guns.modular.system.dao.TServerCarmodelMapper;
+import com.stylefeng.guns.modular.system.service.ITServerCarmodelService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务车型设置 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-08-29
+ */
+@Service
+public class TServerCarmodelServiceImpl extends ServiceImpl<TServerCarmodelMapper, TServerCarmodel> implements ITServerCarmodelService {
+
+    @Override
+    public List<Map<String, Object>> getServerCarModelList(Page<Map<String, Object>> page, Integer type, String name, Integer state) {
+        return this.baseMapper.getServerCarModelList(page, type, name, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSiteServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSiteServiceImpl.java
new file mode 100644
index 0000000..49d458c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSiteServiceImpl.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSite;
+import com.stylefeng.guns.modular.system.dao.TSiteMapper;
+import com.stylefeng.guns.modular.system.service.ITSiteService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 线路站点 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-09-04
+ */
+@Service
+public class TSiteServiceImpl extends ServiceImpl<TSiteMapper, TSite> implements ITSiteService {
+
+    @Resource
+    private TSiteMapper siteMapper;
+
+    @Override
+    public List<Map<String, Object>> getSiteList(Page<Map<String, Object>> page, String beginTime, String endTime, String name, String insertUser, String city, Integer state) {
+        return this.baseMapper.getSiteList(page, beginTime, endTime, name, insertUser, city, state);
+    }
+
+    @Override
+    public List<TSite> query(String provinceCode, String cityCode, String districtCode) {
+        return siteMapper.query(provinceCode, cityCode, districtCode);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSmsrecordServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSmsrecordServiceImpl.java
new file mode 100644
index 0000000..865e62d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSmsrecordServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSmsrecord;
+import com.stylefeng.guns.modular.system.dao.TSmsrecordMapper;
+import com.stylefeng.guns.modular.system.service.ITSmsrecordService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 验证码 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+@Service
+public class TSmsrecordServiceImpl extends ServiceImpl<TSmsrecordMapper, TSmsrecord> implements ITSmsrecordService {
+
+    @Override
+    public List<Map<String, Object>> getSmsCodeList(Page<Map<String, Object>> page, String beginTime, String endTime, String phone) {
+        return this.baseMapper.getSmsCodeList(page, beginTime, endTime, phone);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysCancleOrderServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysCancleOrderServiceImpl.java
new file mode 100644
index 0000000..f50090f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysCancleOrderServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TSysCancleOrder;
+import com.stylefeng.guns.modular.system.dao.TSysCancleOrderMapper;
+import com.stylefeng.guns.modular.system.service.ITSysCancleOrderService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统设置-取消订单 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TSysCancleOrderServiceImpl extends ServiceImpl<TSysCancleOrderMapper, TSysCancleOrder> implements ITSysCancleOrderService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysFaceDistinguishServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysFaceDistinguishServiceImpl.java
new file mode 100644
index 0000000..3ddbbce
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysFaceDistinguishServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TSysFaceDistinguish;
+import com.stylefeng.guns.modular.system.dao.TSysFaceDistinguishMapper;
+import com.stylefeng.guns.modular.system.service.ITSysFaceDistinguishService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统设置-人脸识别 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TSysFaceDistinguishServiceImpl extends ServiceImpl<TSysFaceDistinguishMapper, TSysFaceDistinguish> implements ITSysFaceDistinguishService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysIntegralServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysIntegralServiceImpl.java
new file mode 100644
index 0000000..382f991
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysIntegralServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TSysIntegral;
+import com.stylefeng.guns.modular.system.dao.TSysIntegralMapper;
+import com.stylefeng.guns.modular.system.service.ITSysIntegralService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统设置-积分 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TSysIntegralServiceImpl extends ServiceImpl<TSysIntegralMapper, TSysIntegral> implements ITSysIntegralService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysPushOrderServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysPushOrderServiceImpl.java
new file mode 100644
index 0000000..787ffed
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysPushOrderServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TSysPushOrder;
+import com.stylefeng.guns.modular.system.dao.TSysPushOrderMapper;
+import com.stylefeng.guns.modular.system.service.ITSysPushOrderService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统设置-推单 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TSysPushOrderServiceImpl extends ServiceImpl<TSysPushOrderMapper, TSysPushOrder> implements ITSysPushOrderService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysReformistServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysReformistServiceImpl.java
new file mode 100644
index 0000000..ae656aa
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysReformistServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TSysReformist;
+import com.stylefeng.guns.modular.system.dao.TSysReformistMapper;
+import com.stylefeng.guns.modular.system.service.ITSysReformistService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统设置-改派 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TSysReformistServiceImpl extends ServiceImpl<TSysReformistMapper, TSysReformist> implements ITSysReformistService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysSensitiveWordsServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysSensitiveWordsServiceImpl.java
new file mode 100644
index 0000000..0b4cc48
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSysSensitiveWordsServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSysSensitiveWords;
+import com.stylefeng.guns.modular.system.dao.TSysSensitiveWordsMapper;
+import com.stylefeng.guns.modular.system.service.ITSysSensitiveWordsService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 系统设置-敏感词 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TSysSensitiveWordsServiceImpl extends ServiceImpl<TSysSensitiveWordsMapper, TSysSensitiveWords> implements ITSysSensitiveWordsService {
+
+    @Override
+    public List<Map<String, Object>> getSensitiveWordList(Page<Map<String, Object>> page, String beginTime, String endTime, String content) {
+        return this.baseMapper.getSensitiveWordList(page, beginTime, endTime, content);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java
new file mode 100644
index 0000000..55a2301
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TSystemNotice;
+import com.stylefeng.guns.modular.system.dao.TSystemNoticeMapper;
+import com.stylefeng.guns.modular.system.service.ITSystemNoticeService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统通知 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+@Service
+public class TSystemNoticeServiceImpl extends ServiceImpl<TSystemNoticeMapper, TSystemNotice> implements ITSystemNoticeService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemPriceServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemPriceServiceImpl.java
new file mode 100644
index 0000000..06c8caa
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemPriceServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TSystemPrice;
+import com.stylefeng.guns.modular.system.dao.TSystemPriceMapper;
+import com.stylefeng.guns.modular.system.service.ITSystemPriceService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务价格规则 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-08-29
+ */
+@Service
+public class TSystemPriceServiceImpl extends ServiceImpl<TSystemPriceMapper, TSystemPrice> implements ITSystemPriceService {
+
+    @Override
+    public List<Map<String, Object>> getSpecialPriceList(Page<Map<String, Object>> page, Integer companyId, String name, Integer state) {
+        return this.baseMapper.getSpecialPriceList(page, companyId, name, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TUserRedPacketRecordServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TUserRedPacketRecordServiceImpl.java
new file mode 100644
index 0000000..64fd315
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TUserRedPacketRecordServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.TUserRedPacketRecord;
+import com.stylefeng.guns.modular.system.dao.TUserRedPacketRecordMapper;
+import com.stylefeng.guns.modular.system.service.ITUserRedPacketRecordService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户红包记录 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-07-10
+ */
+@Service
+public class TUserRedPacketRecordServiceImpl extends ServiceImpl<TUserRedPacketRecordMapper, TUserRedPacketRecord> implements ITUserRedPacketRecordService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TUserServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TUserServiceImpl.java
new file mode 100644
index 0000000..07176db
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TUserServiceImpl.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TUser;
+import com.stylefeng.guns.modular.system.dao.TUserMapper;
+import com.stylefeng.guns.modular.system.service.ITUserService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户信息 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-01
+ */
+@Service
+public class TUserServiceImpl extends ServiceImpl<TUserMapper, TUser> implements ITUserService {
+
+    @Override
+    public List<Map<String, Object>> getUserList(Page<Map<String, Object>> page, String beginTime, String endTime,Integer roleType,Integer nowUserId, Integer isAuth, Integer state, String id, String nickName,String phone,String companyName) {
+        return this.baseMapper.getUserList(page, beginTime, endTime,roleType,nowUserId, isAuth, state, id, nickName,phone,companyName);
+    }
+
+    @Override
+    public Map<String, Object> getUserDetailById(Integer userId) {
+        return this.baseMapper.getUserDetailById(userId);
+    }
+
+    @Override
+    public List<Map<String, Object>> getUserListNoPage(Integer roleType, Integer nowUserId) {
+        return this.baseMapper.getUserListNoPage(roleType, nowUserId);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TVerifiedServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TVerifiedServiceImpl.java
new file mode 100644
index 0000000..a8d20d8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TVerifiedServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TVerified;
+import com.stylefeng.guns.modular.system.dao.TVerifiedMapper;
+import com.stylefeng.guns.modular.system.service.ITVerifiedService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 实名认证 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-09
+ */
+@Service
+public class TVerifiedServiceImpl extends ServiceImpl<TVerifiedMapper, TVerified> implements ITVerifiedService {
+
+    @Override
+    public List<Map<String, Object>> getVerifiedList(Page<Map<String, Object>> page, String beginTime, String endTime, String userName, String userPhone, String name, Integer state) {
+        return this.baseMapper.getVerifiedList(page, beginTime, endTime, userName, userPhone, name, state);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TVersionManagementServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TVersionManagementServiceImpl.java
new file mode 100644
index 0000000..501eeef
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TVersionManagementServiceImpl.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.modular.system.model.TVersionManagement;
+import com.stylefeng.guns.modular.system.dao.TVersionManagementMapper;
+import com.stylefeng.guns.modular.system.service.ITVersionManagementService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 版本管理 服务实现类
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-10
+ */
+@Service
+public class TVersionManagementServiceImpl extends ServiceImpl<TVersionManagementMapper, TVersionManagement> implements ITVersionManagementService {
+
+    @Override
+    public List<Map<String, Object>> getVersionList(Page<Map<String, Object>> page, String beginTime, String endTime, String version) {
+        return this.baseMapper.getVersionList(page, beginTime, endTime, version);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TransactionDetailsServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TransactionDetailsServiceImpl.java
new file mode 100644
index 0000000..85d7001
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TransactionDetailsServiceImpl.java
@@ -0,0 +1,48 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.TransactionDetailsMapper;
+import com.stylefeng.guns.modular.system.model.TransactionDetails;
+import com.stylefeng.guns.modular.system.service.ITransactionDetailsService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+
+
+@Service
+@Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+public class TransactionDetailsServiceImpl extends ServiceImpl<TransactionDetailsMapper, TransactionDetails> implements ITransactionDetailsService {
+
+
+    /**
+     * 添加数据
+     * @param userId    对象id
+     * @param remark    备注
+     * @param money     金额
+     * @param state     状态(1=添加,2=减少)
+     * @param type      类型(1=金额,2=积分)
+     * @param userType  用户类型(1=用户,2=司机)
+     * @param orderType 订单类型(1=专车,2=出租车,3=城际,4=小件物流)
+     * @param orderId
+     * @throws Exception
+     */
+    @Override
+    public void saveData(Integer userId, String remark, Double money, Integer state, Integer type, Integer userType,
+                         Integer orderType, Integer orderId) throws Exception {
+
+        TransactionDetails transactionDetails = new TransactionDetails();
+        transactionDetails.setInsertTime(new Date());
+        transactionDetails.setMoney(money);
+        transactionDetails.setOrderId(orderId);
+        transactionDetails.setOrderType(orderType);
+        transactionDetails.setRemark(remark);
+        transactionDetails.setState(state);
+        transactionDetails.setType(type);
+        transactionDetails.setUserId(userId);
+        transactionDetails.setUserType(userType);
+        this.insert(transactionDetails);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityBalanceServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityBalanceServiceImpl.java
new file mode 100644
index 0000000..58789de
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityBalanceServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.UserActivityBalance;
+import com.stylefeng.guns.modular.system.dao.UserActivityBalanceMapper;
+import com.stylefeng.guns.modular.system.service.IUserActivityBalanceService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户活动-充值 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@Service
+public class UserActivityBalanceServiceImpl extends ServiceImpl<UserActivityBalanceMapper, UserActivityBalance> implements IUserActivityBalanceService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityDiscount1ServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityDiscount1ServiceImpl.java
new file mode 100644
index 0000000..e7a8078
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityDiscount1ServiceImpl.java
@@ -0,0 +1,268 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.UserActivityDiscount1;
+import com.stylefeng.guns.modular.system.dao.UserActivityDiscount1Mapper;
+import com.stylefeng.guns.modular.system.service.ITCompanyService;
+import com.stylefeng.guns.modular.system.service.IUserActivityDiscount1Service;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户活动-折扣1 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@Service
+public class UserActivityDiscount1ServiceImpl extends ServiceImpl<UserActivityDiscount1Mapper, UserActivityDiscount1> implements IUserActivityDiscount1Service {
+
+    @Resource
+    private UserActivityDiscount1Mapper userActivityDiscount1Mapper;
+
+    @Autowired
+    private ITCompanyService companyService;
+
+
+    /**
+     * 获取折扣统计
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryDiscount1(String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> list = userActivityDiscount1Mapper.queryDiscount1(name, start, end, companyId, offset, limit);
+        int i = userActivityDiscount1Mapper.queryDiscount1Count(name, start, end, companyId);
+        Map<String, Object> map = new HashMap<>();
+        map.put("rows", list);
+        map.put("total", i);
+        return map;
+    }
+
+
+    /**
+     * 下载折扣优惠
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public HSSFWorkbook downloadDiscount1(String name, String time, Integer companyId) throws Exception {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> maps = userActivityDiscount1Mapper.queryDiscount1(name, start, end, companyId, null, null);
+
+        List<List<String>> lists = new ArrayList<>();
+        List<String> list = new ArrayList<>();
+        list.add("活动名称:" + name);
+        list.add("起止时间:" + time);
+        list.add("运营商:" + (null != companyId ? companyService.selectById(companyId).getName() : ""));
+        lists.add(list);
+        list = new ArrayList<>();
+        list.add("时间");
+        list.add("使用情况");
+        list.add("");
+        lists.add(list);
+        list = new ArrayList<>();
+        list.add("");
+        list.add("折扣参与人数");
+        list.add("折扣金额");
+        lists.add(list);
+
+        List<List<List<String>>> lists1 = new ArrayList<>();
+        List<List<String>> lists2 = new ArrayList<>();
+        for(Map<String, Object> map : maps){
+            List<String> list2 = new ArrayList<>();
+            list2.add(null != map.get("time") ? map.get("time").toString() : "");
+            list2.add(null != map.get("userNum") ? map.get("userNum").toString() : "");
+            list2.add(null != map.get("discountMoney") ? map.get("discountMoney").toString() : "");
+            lists2.add(list2);
+        }
+        lists1.add(lists2);
+
+        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
+        HSSFSheet hssfSheet = hssfWorkbook.createSheet();
+        hssfSheet.setColumnWidth(0, 6 * 256);
+        hssfSheet.setDefaultRowHeightInPoints(20f);
+        for(int i = 0; i < lists.size(); i++){
+            HSSFRow hssfRow = hssfSheet.createRow(i);//设置第一行数据(标题)
+            HSSFCellStyle style = hssfWorkbook.createCellStyle();
+            HSSFFont font = hssfWorkbook.createFont();
+            font.setBold(true);
+            style.setFont(font);
+            style.setAlignment(HorizontalAlignment.CENTER);
+            for (int l = 0; l < lists.get(i).size(); l++) {
+                HSSFCell hssfCell = hssfRow.createCell(l);
+                hssfCell.setCellType(CellType.STRING);//设置表格类型
+                hssfCell.setCellValue(lists.get(i).get(l));
+                hssfCell.setCellStyle(style);
+                if(l > 0) {
+                    hssfSheet.setColumnWidth(l , 20 * 256);
+                }
+
+            }
+        }
+        //这个就是合并单元格
+        //参数说明:1:开始行 2:结束行  3:开始列 4:结束列
+        //比如我要合并 第二行到第四行的    第六列到第八列     sheet.addMergedRegion(new CellRangeAddress(1,3,5,7));
+        hssfSheet.addMergedRegion(new CellRangeAddress(1,2,0,0));
+        hssfSheet.addMergedRegion(new CellRangeAddress(1,1,1,2));
+
+
+        for(int i = 0; i < lists1.size(); i++){
+            //将数据添加到表格中
+            List<String> data = null;
+            for (int l = 0; l < lists1.get(i).size(); l++) {
+                HSSFRow row = hssfSheet.createRow(l + 3);
+                data = lists1.get(i).get(l);
+                for (int j = 0; j < data.size(); j++) {
+                    HSSFCell hssfCell = row.createCell(j);
+                    hssfCell.setCellType(CellType.STRING);//设置表格类型
+                    hssfCell.setCellValue(data.get(j));
+                }
+            }
+        }
+        return hssfWorkbook;
+    }
+
+
+    /**
+     * 获取折扣优惠详情
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryDiscountInfo(String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> list = userActivityDiscount1Mapper.queryDiscountInfo(name, start, end, companyId, offset, limit);
+        int i = userActivityDiscount1Mapper.queryDiscountInfoCount(name, start, end, companyId);
+        Map<String, Object> map = new HashMap<>();
+        map.put("rows", list);
+        map.put("total", i);
+        return map;
+    }
+
+
+    /**
+     * 下载折扣优惠详情
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public HSSFWorkbook downloadDiscountInfo(String name, String time, Integer companyId) throws Exception {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> maps = userActivityDiscount1Mapper.queryDiscountInfo(name, start, end, companyId, null, null);
+
+        List<List<String>> lists = new ArrayList<>();
+        List<String> list = new ArrayList<>();
+        list.add("活动名称:" + name);
+        list.add("起止时间:" + time);
+        list.add("运营商:");
+        list.add(null != companyId ? companyService.selectById(companyId).getName() : "");
+        lists.add(list);
+        list = new ArrayList<>();
+        list.add("打折时间");
+        list.add("打折使用人");
+        list.add("打折使用人电话");
+        list.add("打折金额");
+        lists.add(list);
+
+        List<List<List<String>>> lists1 = new ArrayList<>();
+        List<List<String>> lists2 = new ArrayList<>();
+        for(Map<String, Object> map : maps){
+            List<String> list2 = new ArrayList<>();
+            list2.add(null != map.get("time") ? map.get("time").toString() : "");
+            list2.add(null != map.get("name") ? map.get("name").toString() : "");
+            list2.add(null != map.get("phone") ? map.get("phone").toString() : "");
+            list2.add(null != map.get("discountMoney") ? map.get("discountMoney").toString() : "");
+            lists2.add(list2);
+        }
+        lists1.add(lists2);
+
+        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
+        HSSFSheet hssfSheet = hssfWorkbook.createSheet();
+        hssfSheet.setColumnWidth(0, 6 * 256);
+        hssfSheet.setDefaultRowHeightInPoints(20f);
+        for(int i = 0; i < lists.size(); i++){
+            HSSFRow hssfRow = hssfSheet.createRow(i);//设置第一行数据(标题)
+            HSSFCellStyle style = hssfWorkbook.createCellStyle();
+            HSSFFont font = hssfWorkbook.createFont();
+            font.setBold(true);
+            style.setFont(font);
+            style.setAlignment(HorizontalAlignment.CENTER);
+            for (int l = 0; l < lists.get(i).size(); l++) {
+                HSSFCell hssfCell = hssfRow.createCell(l);
+                hssfCell.setCellType(CellType.STRING);//设置表格类型
+                hssfCell.setCellValue(lists.get(i).get(l));
+                hssfCell.setCellStyle(style);
+                if(l > 0) {
+                    hssfSheet.setColumnWidth(l , 20 * 256);
+                }
+
+            }
+        }
+
+        for(int i = 0; i < lists1.size(); i++){
+            //将数据添加到表格中
+            List<String> data = null;
+            for (int l = 0; l < lists1.get(i).size(); l++) {
+                HSSFRow row = hssfSheet.createRow(l + 2);
+                data = lists1.get(i).get(l);
+                for (int j = 0; j < data.size(); j++) {
+                    HSSFCell hssfCell = row.createCell(j);
+                    hssfCell.setCellType(CellType.STRING);//设置表格类型
+                    hssfCell.setCellValue(data.get(j));
+                }
+            }
+        }
+        return hssfWorkbook;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityDiscount2ServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityDiscount2ServiceImpl.java
new file mode 100644
index 0000000..f4aebc6
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityDiscount2ServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.UserActivityDiscount2;
+import com.stylefeng.guns.modular.system.dao.UserActivityDiscount2Mapper;
+import com.stylefeng.guns.modular.system.service.IUserActivityDiscount2Service;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户活动-折扣2(跨城) 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@Service
+public class UserActivityDiscount2ServiceImpl extends ServiceImpl<UserActivityDiscount2Mapper, UserActivityDiscount2> implements IUserActivityDiscount2Service {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityInviteServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityInviteServiceImpl.java
new file mode 100644
index 0000000..2546d6c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityInviteServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.UserActivityInvite;
+import com.stylefeng.guns.modular.system.dao.UserActivityInviteMapper;
+import com.stylefeng.guns.modular.system.service.IUserActivityInviteService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户活动-邀请 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@Service
+public class UserActivityInviteServiceImpl extends ServiceImpl<UserActivityInviteMapper, UserActivityInvite> implements IUserActivityInviteService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRedenvelopeServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRedenvelopeServiceImpl.java
new file mode 100644
index 0000000..f70fcf7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRedenvelopeServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.UserActivityRedenvelope;
+import com.stylefeng.guns.modular.system.dao.UserActivityRedenvelopeMapper;
+import com.stylefeng.guns.modular.system.service.IUserActivityRedenvelopeService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户活动-红包 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@Service
+public class UserActivityRedenvelopeServiceImpl extends ServiceImpl<UserActivityRedenvelopeMapper, UserActivityRedenvelope> implements IUserActivityRedenvelopeService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRegisteredServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRegisteredServiceImpl.java
new file mode 100644
index 0000000..44b2ace
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityRegisteredServiceImpl.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.stylefeng.guns.modular.system.model.UserActivityRegistered;
+import com.stylefeng.guns.modular.system.dao.UserActivityRegisteredMapper;
+import com.stylefeng.guns.modular.system.service.IUserActivityRegisteredService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户活动-注册 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@Service
+public class UserActivityRegisteredServiceImpl extends ServiceImpl<UserActivityRegisteredMapper, UserActivityRegistered> implements IUserActivityRegisteredService {
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityServiceImpl.java
new file mode 100644
index 0000000..caf80bc
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserActivityServiceImpl.java
@@ -0,0 +1,293 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.shiro.ShiroUser;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.dao.UserActivityMapper;
+import com.stylefeng.guns.modular.system.service.*;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户活动主表 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-19
+ */
+@Service
+public class UserActivityServiceImpl extends ServiceImpl<UserActivityMapper, UserActivity> implements IUserActivityService {
+    @Resource
+    private UserActivityMapper userActivityMapper;
+
+    @Autowired
+    private ISysRedPacketRecordService redPacketRecordService;
+
+    @Autowired
+    private IUserActivityBalanceService userActivityBalanceService;
+
+    @Autowired
+    private IUserActivityDiscount1Service userActivityDiscount1Service;
+
+    @Autowired
+    private IUserActivityInviteService userActivityInviteService;
+
+    @Autowired
+    private IUserActivityRedenvelopeService userActivityRedenvelopeService;
+
+    @Autowired
+    private IUserActivityRegisteredService userActivityRegisteredService;
+
+    @Autowired
+    private IUserService userService;
+
+    @Override
+    public void insertOrUpdate(Integer id, String name, String startTime, Integer registCouponId, Integer registEnable, Integer registNumber, Integer registEffective,
+                               Integer inviteCouponId, Integer inviteEnable, Integer inviteNumber, Integer inviteEffective, Integer balanceEnable, String balanceInfo,
+                               Integer discountEnable, Double discountSpecial, Double discountTaxi, Double discountLogistics, Integer redenvelopeId, Integer redenvelopeEnable,
+                               Double registerPrice, Double invitationPrice, Double redPrice) {
+        if(id==null){
+            String[] timeArray = startTime.split(" - ");
+            Date startTimes = DateUtil.getDate_str3(timeArray[0]);
+            Date endTimes = DateUtil.getDate_str3(timeArray[1]);
+            ShiroUser user = ShiroKit.getUser();
+            Date nowDay = new Date();
+            UserActivity userActivity = new UserActivity();
+            userActivity.setInsertTime(nowDay);
+            userActivity.setCompanyId(ShiroKit.getUser().getObjectId());
+            userActivity.setCompanyType(ShiroKit.getUser().getRoleType());
+            userActivity.setStatus(userActivity.getCompanyType()==1?3:1);
+            userActivity.setName(name);
+            userActivity.setStartTime(startTimes);
+            userActivity.setEndTime(endTimes);
+            userActivity.insertOrUpdate();
+            //添加注册奖励
+            if(registCouponId!=null){
+                UserActivityRegistered userActivityRegistered = new UserActivityRegistered();
+                userActivityRegistered.setCouponId(registCouponId);
+                userActivityRegistered.setEnable(registEnable);
+                userActivityRegistered.setEndTime(endTimes);
+                userActivityRegistered.setStartTime(startTimes);
+                userActivityRegistered.setTotalNum(registNumber);
+                userActivityRegistered.setLaveNum(registNumber);
+                userActivityRegistered.setUserActivityId(userActivity.getId());
+                userActivityRegistered.setEffective(registEffective);
+                userActivityRegistered.setTotalPrice(registerPrice);
+                userActivityRegistered.setLavePrice(registerPrice);
+                userActivityRegistered.insertOrUpdate();
+            }
+            //添加邀请奖励
+            if(inviteCouponId!=null){
+                UserActivityInvite userActivityInvite = new UserActivityInvite();
+                userActivityInvite.setCouponId(inviteCouponId);
+                userActivityInvite.setEnable(inviteEnable);
+                userActivityInvite.setEndTime(endTimes);
+                userActivityInvite.setStartTime(startTimes);
+                userActivityInvite.setTotalNum(inviteNumber);
+                userActivityInvite.setLaveNum(inviteNumber);
+                userActivityInvite.setUserActivityId(userActivity.getId());
+                userActivityInvite.setEffective(inviteEffective);
+                userActivityInvite.setTotalPrice(invitationPrice);
+                userActivityInvite.setLavePrice(invitationPrice);
+                userActivityInvite.insertOrUpdate();
+            }
+            //添加充值赠送
+            JSONArray jsonArray = JSON.parseArray(balanceInfo);
+            if(jsonArray.size()>0){
+                for(int i=0;i<jsonArray.size();i++){
+                    JSONObject jsonObject = jsonArray.getJSONObject(i);
+                    UserActivityBalance userActivityBalance = new UserActivityBalance();
+                    userActivityBalance.setEnable(balanceEnable);
+                    userActivityBalance.setUserActivityId(userActivity.getId());
+                    userActivityBalance.setInsertTime(nowDay);
+                    userActivityBalance.setStartTime(startTimes);
+                    userActivityBalance.setEndTime(endTimes);
+                    userActivityBalance.setGeneralCouponId(jsonObject.getInteger("id1"));
+                    userActivityBalance.setSpecialCouponId(jsonObject.getInteger("id2"));
+                    userActivityBalance.setTaxiCouponId(jsonObject.getInteger("id3"));
+                    userActivityBalance.setIntercityCouponId(jsonObject.getInteger("id4"));
+                    userActivityBalance.setEffective(jsonObject.getInteger("num10"));
+                    userActivityBalance.setMoney(jsonObject.getDouble("num1"));
+                    userActivityBalance.setGeneralNum(jsonObject.getInteger("num2"));
+                    userActivityBalance.setGeneralCouponMoney(jsonObject.getDouble("num3"));
+                    userActivityBalance.setSpecialNum(jsonObject.getInteger("num4"));
+                    userActivityBalance.setSpecialCouponMoney(jsonObject.getDouble("num5"));
+                    userActivityBalance.setTaxiNum(jsonObject.getInteger("num6"));
+                    userActivityBalance.setTaxiCouponMoney(jsonObject.getDouble("num7"));
+                    userActivityBalance.setIntercityNum(jsonObject.getInteger("num8"));
+                    userActivityBalance.setIntercityCouponMoney(jsonObject.getDouble("num9"));
+                    userActivityBalance.setTotalPrice(jsonObject.getDouble("num11"));
+                    userActivityBalance.setLavePrice(jsonObject.getDouble("num11"));
+                    userActivityBalance.insertOrUpdate();
+                }
+            }
+            //添加打折活动
+            if(SinataUtil.isNotEmpty(discountSpecial) ||
+                    SinataUtil.isNotEmpty(discountTaxi) ||
+                    SinataUtil.isNotEmpty(discountLogistics)){
+                UserActivityDiscount1 userActivityDiscount1 = new UserActivityDiscount1();
+                userActivityDiscount1.setUserActivityId(userActivity.getId());
+                userActivityDiscount1.setStartTime(startTimes);
+                userActivityDiscount1.setEndTime(endTimes);
+                userActivityDiscount1.setEnable(discountEnable);
+                userActivityDiscount1.setSpecial(SinataUtil.isEmpty(discountSpecial) ?10:discountSpecial);
+                userActivityDiscount1.setTaxi(SinataUtil.isEmpty(discountTaxi) ?10:discountTaxi);
+                userActivityDiscount1.setLogistics(SinataUtil.isEmpty(discountLogistics) ?10:discountLogistics);
+                userActivityDiscount1.insertOrUpdate();
+            }
+            //添加红包活动
+            if(redenvelopeId!=null){
+                UserActivityRedenvelope userActivityRedenvelope = new UserActivityRedenvelope();
+                userActivityRedenvelope.setUserActivityId(userActivity.getId());
+                userActivityRedenvelope.setStartTime(startTimes);
+                userActivityRedenvelope.setEndTime(endTimes);
+                userActivityRedenvelope.setEnable(redenvelopeEnable);
+                userActivityRedenvelope.setRedEnvelopeId(redenvelopeId);
+                SysRedPacketRecord redPacketRecord = redPacketRecordService.selectById(redenvelopeId);
+                userActivityRedenvelope.setTotalMoney(redPacketRecord.getTotalMoney().doubleValue());
+                userActivityRedenvelope.setLaveMoney(redPacketRecord.getTotalMoney().doubleValue());
+                userActivityRedenvelope.setTotalPrice(redPrice);
+                userActivityRedenvelope.setLavePrice(redPrice);
+                userActivityRedenvelope.insertOrUpdate();
+            }
+        }else{
+            String[] timeArray = startTime.split(" - ");
+            Date startTimes = DateUtil.getDate_str3(timeArray[0]);
+            Date endTimes = DateUtil.getDate_str3(timeArray[1]);
+            ShiroUser user = ShiroKit.getUser();
+            Date nowDay = new Date();
+            UserActivity userActivity = new UserActivity();
+            userActivity.setId(id);
+            userActivity.setInsertTime(nowDay);
+            userActivity.setCompanyId(ShiroKit.getUser().getObjectId());
+            userActivity.setCompanyType(ShiroKit.getUser().getRoleType());
+            userActivity.setStatus(userActivity.getCompanyType()==1?3:1);
+            userActivity.setName(name);
+            userActivity.setStartTime(startTimes);
+            userActivity.setEndTime(endTimes);
+            userActivity.insertOrUpdate();
+            userActivityBalanceService.delete(new EntityWrapper<UserActivityBalance>().eq("userActivityId",id));
+            userActivityDiscount1Service.delete(new EntityWrapper<UserActivityDiscount1>().eq("userActivityId",id));
+            userActivityInviteService.delete(new EntityWrapper<UserActivityInvite>().eq("userActivityId",id));
+            userActivityRedenvelopeService.delete(new EntityWrapper<UserActivityRedenvelope>().eq("userActivityId",id));
+            userActivityRegisteredService.delete(new EntityWrapper<UserActivityRegistered>().eq("userActivityId",id));
+            //添加注册奖励
+            if(registCouponId!=null){
+                UserActivityRegistered userActivityRegistered = new UserActivityRegistered();
+                userActivityRegistered.setCouponId(registCouponId);
+                userActivityRegistered.setEnable(registEnable);
+                userActivityRegistered.setEndTime(endTimes);
+                userActivityRegistered.setStartTime(startTimes);
+                userActivityRegistered.setTotalNum(registNumber);
+                userActivityRegistered.setLaveNum(registNumber);
+                userActivityRegistered.setUserActivityId(userActivity.getId());
+                userActivityRegistered.setEffective(registEffective);
+                userActivityRegistered.setTotalPrice(registerPrice);
+                userActivityRegistered.setLavePrice(registerPrice);
+                userActivityRegistered.insertOrUpdate();
+            }
+            //添加邀请奖励
+            if(inviteCouponId!=null){
+                UserActivityInvite userActivityInvite = new UserActivityInvite();
+                userActivityInvite.setCouponId(inviteCouponId);
+                userActivityInvite.setEnable(inviteEnable);
+                userActivityInvite.setEndTime(endTimes);
+                userActivityInvite.setStartTime(startTimes);
+                userActivityInvite.setTotalNum(inviteNumber);
+                userActivityInvite.setLaveNum(inviteNumber);
+                userActivityInvite.setUserActivityId(userActivity.getId());
+                userActivityInvite.setEffective(inviteEffective);
+                userActivityInvite.setTotalPrice(invitationPrice);
+                userActivityInvite.setLavePrice(invitationPrice);
+                userActivityInvite.insertOrUpdate();
+            }
+            //添加充值赠送
+            JSONArray jsonArray = JSON.parseArray(balanceInfo);
+            if(jsonArray.size()>0){
+                for(int i=0;i<jsonArray.size();i++){
+                    JSONObject jsonObject = jsonArray.getJSONObject(i);
+                    UserActivityBalance userActivityBalance = new UserActivityBalance();
+                    userActivityBalance.setEnable(balanceEnable);
+                    userActivityBalance.setUserActivityId(userActivity.getId());
+                    userActivityBalance.setInsertTime(nowDay);
+                    userActivityBalance.setStartTime(startTimes);
+                    userActivityBalance.setEndTime(endTimes);
+                    userActivityBalance.setEffective(jsonObject.getInteger("num10"));
+                    userActivityBalance.setMoney(jsonObject.getDouble("num1"));
+                    userActivityBalance.setGeneralNum(jsonObject.getInteger("num2"));
+                    userActivityBalance.setGeneralCouponMoney(jsonObject.getDouble("num3"));
+                    userActivityBalance.setSpecialNum(jsonObject.getInteger("num4"));
+                    userActivityBalance.setSpecialCouponMoney(jsonObject.getDouble("num5"));
+                    userActivityBalance.setTaxiNum(jsonObject.getInteger("num6"));
+                    userActivityBalance.setTaxiCouponMoney(jsonObject.getDouble("num7"));
+                    userActivityBalance.setIntercityNum(jsonObject.getInteger("num8"));
+                    userActivityBalance.setIntercityCouponMoney(jsonObject.getDouble("num9"));
+                    userActivityBalance.setTotalPrice(jsonObject.getDouble("num11"));
+                    userActivityBalance.setLavePrice(jsonObject.getDouble("num11"));
+                    userActivityBalance.insertOrUpdate();
+
+                }
+            }
+            //添加打折活动
+            UserActivityDiscount1 userActivityDiscount1 = new UserActivityDiscount1();
+            userActivityDiscount1.setUserActivityId(userActivity.getId());
+            userActivityDiscount1.setStartTime(startTimes);
+            userActivityDiscount1.setEndTime(endTimes);
+            userActivityDiscount1.setEnable(discountEnable);
+            userActivityDiscount1.setSpecial(SinataUtil.isEmpty(discountSpecial) ?10d:discountSpecial);
+            userActivityDiscount1.setTaxi(SinataUtil.isEmpty(discountTaxi) ?10d:discountTaxi);
+            userActivityDiscount1.setLogistics(SinataUtil.isEmpty(discountLogistics) ?10d:discountLogistics);
+            userActivityDiscount1.insertOrUpdate();
+            //添加红包活动
+            if(redenvelopeId!=null){
+                UserActivityRedenvelope userActivityRedenvelope = new UserActivityRedenvelope();
+                userActivityRedenvelope.setUserActivityId(userActivity.getId());
+                userActivityRedenvelope.setStartTime(startTimes);
+                userActivityRedenvelope.setEndTime(endTimes);
+                userActivityRedenvelope.setEnable(redenvelopeEnable);
+                userActivityRedenvelope.setRedEnvelopeId(redenvelopeId);
+                SysRedPacketRecord redPacketRecord = redPacketRecordService.selectById(redenvelopeId);
+                userActivityRedenvelope.setTotalMoney(redPacketRecord.getTotalMoney().doubleValue());
+                userActivityRedenvelope.setLaveMoney(redPacketRecord.getTotalMoney().doubleValue());
+                userActivityRedenvelope.setTotalPrice(redPrice);
+                userActivityRedenvelope.setLavePrice(redPrice);
+                userActivityRedenvelope.insertOrUpdate();
+            }
+        }
+    }
+
+    /**
+     * 获取列表数据
+     * @param start
+     * @param end
+     * @param name
+     * @param status
+     * @param offset
+     * @param limit
+     * @return
+     */
+    @Override
+    public Map<String, Object> queryUserActivityList(Integer uid, Date start, Date end, String name, Integer status, Integer offset, Integer limit) {
+        Map<String, Object> map = new HashMap<>();
+        Integer objectId = userService.selectById(uid).getObjectId();
+        List<Map<String, Object>> list = userActivityMapper.queryUserActivityList(objectId, start, end, name, status, offset, limit);
+        int i = userActivityMapper.queryUserActivityListCount(objectId, start, end, name, status);
+        map.put("rows", list);
+        map.put("total", i);
+        return map;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserCouponRecordServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserCouponRecordServiceImpl.java
new file mode 100644
index 0000000..8dd09b3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserCouponRecordServiceImpl.java
@@ -0,0 +1,483 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.UserCouponRecord;
+import com.stylefeng.guns.modular.system.dao.UserCouponRecordMapper;
+import com.stylefeng.guns.modular.system.service.ITCompanyService;
+import com.stylefeng.guns.modular.system.service.IUserCouponRecordService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 用户优惠券记录 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2020-06-17
+ */
+@Service
+public class UserCouponRecordServiceImpl extends ServiceImpl<UserCouponRecordMapper, UserCouponRecord> implements IUserCouponRecordService {
+
+    @Autowired
+    private ITCompanyService companyService;
+
+
+
+
+
+    @Override
+    public List<Map<String, Object>> getList(Page<Map<String, Object>> page, String beginTime, String endTime, String userName, String userPhone, Integer couponActivityId, Integer activityType,Integer state) {
+        return this.baseMapper.getList(page,beginTime,endTime,userName,userPhone,couponActivityId,activityType,state);
+    }
+    @Override
+    public List<Map<String, Object>> getRedList(Page<Map<String, Object>> page, String beginTime, String endTime, String userName, String userPhone, Integer couponActivityId,Integer state) {
+        return this.baseMapper.getRedList(page,beginTime,endTime,userName,userPhone,couponActivityId,state);
+    }
+    @Override
+    public Map<String, Object> getCouponStatic(String beginTime, String endTime, Integer activityId, Integer activityType) {
+        return this.baseMapper.getCouponStatic(beginTime,endTime,activityId,activityType);
+    }
+
+    @Override
+    public Map<String, Object> getRedStatic(String beginTime, String endTime, Integer activityId) {
+        return this.baseMapper.getRedStatic(beginTime,endTime,activityId);
+    }
+
+    @Override
+    public Map<String, Object> getRegStatic(String beginTime, String endTime, Integer activityId) {
+        return this.baseMapper.getRegStatic(beginTime,endTime,activityId);
+    }
+
+    @Override
+    public Map<String, Object> getDiscountStatic(String beginTime, String endTime, Integer activityId) {
+        return this.baseMapper.getDiscountStatic(beginTime,endTime,activityId);
+    }
+
+    @Override
+    public List<Map<String, Object>> getBlanceList(Page<Map<String, Object>> page, String beginTime, String endTime, Integer activityId) {
+        return this.baseMapper.getBlanceList(page,beginTime,endTime,activityId);
+    }
+
+
+    /**
+     * 获取优惠券领取统计
+     * @param type
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryCouponRegister(Integer type, String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> list = this.baseMapper.queryCouponRegister(type, name, start, end, companyId, offset, limit);
+        int i = this.baseMapper.queryCouponRegisterCount(type, name, start, end, companyId);
+        map.put("rows", list);
+        map.put("total", i);
+        return map;
+    }
+
+    /**
+     * 下载优惠券领取数据
+     * @param type
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public HSSFWorkbook downloadCouponRegister(Integer type, String name, String time, Integer companyId) throws Exception {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> maps = this.baseMapper.queryCouponRegister(type, name, start, end, companyId, null, null);
+        List<List<String>> lists = new ArrayList<>();
+        List<String> list = new ArrayList<>();
+        list.add("活动名称:");
+        list.add(name);
+        if(type == 2){
+            list.add("");
+        }
+        list.add("起止时间:");
+        list.add(time);
+        list.add("");
+        list.add("运营商:");
+        list.add(null != companyId ? companyService.selectById(companyId).getName() : "");
+        lists.add(list);
+        list = new ArrayList<>();
+        list.add("时间");
+        list.add("领取情况");
+        if(type == 2){
+            list.add("");
+        }
+        list.add("");
+        list.add("");
+        list.add("使用情况");
+        list.add("");
+        list.add("");
+        lists.add(list);
+        list = new ArrayList<>();
+        list.add("");
+        list.add("注册领取人数");
+        if(type == 2){
+            list.add("赠送派发人数");
+        }
+        list.add("合计");
+        list.add("领取金额");
+        list.add("使用人数");
+        list.add("使用张数");
+        list.add("使用金额");
+        lists.add(list);
+
+        List<List<List<String>>> lists1 = new ArrayList<>();
+        List<List<String>> lists2 = new ArrayList<>();
+        for(Map<String, Object> map : maps){
+            List<String> list2 = new ArrayList<>();
+            list2.add(null != map.get("time") ? map.get("time").toString() : "");
+            list2.add(null != map.get("receivePeople") ? map.get("receivePeople").toString() : "");
+            if(type == 2){
+                list2.add(null != map.get("giving") ? map.get("giving").toString() : "");
+            }
+            list2.add(null != map.get("receive") ? map.get("receive").toString() : "");
+            list2.add(null != map.get("receiveMoney") ? map.get("receiveMoney").toString() : "");
+            list2.add(null != map.get("usePeople") ? map.get("usePeople").toString() : "");
+            list2.add(null != map.get("use") ? map.get("use").toString() : "");
+            list2.add(null != map.get("useMoney") ? map.get("useMoney").toString() : "");
+            lists2.add(list2);
+        }
+        lists1.add(lists2);
+
+        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
+        HSSFSheet hssfSheet = hssfWorkbook.createSheet();
+        hssfSheet.setColumnWidth(0, 6 * 256);
+        hssfSheet.setDefaultRowHeightInPoints(20f);
+        for(int i = 0; i < lists.size(); i++){
+            HSSFRow hssfRow = hssfSheet.createRow(i);//设置第一行数据(标题)
+            HSSFCellStyle style = hssfWorkbook.createCellStyle();
+            HSSFFont font = hssfWorkbook.createFont();
+            font.setBold(true);
+            style.setFont(font);
+            style.setAlignment(HorizontalAlignment.CENTER);
+            for (int l = 0; l < lists.get(i).size(); l++) {
+                HSSFCell hssfCell = hssfRow.createCell(l);
+                hssfCell.setCellType(CellType.STRING);//设置表格类型
+                hssfCell.setCellValue(lists.get(i).get(l));
+                hssfCell.setCellStyle(style);
+                if(l > 0) {
+                    hssfSheet.setColumnWidth(l , 20 * 256);
+                }
+
+            }
+        }
+        //这个就是合并单元格
+        //参数说明:1:开始行 2:结束行  3:开始列 4:结束列
+        //比如我要合并 第二行到第四行的    第六列到第八列     sheet.addMergedRegion(new CellRangeAddress(1,3,5,7));
+        if(type == 2){
+            hssfSheet.addMergedRegion(new CellRangeAddress(0,0,1,2));
+            hssfSheet.addMergedRegion(new CellRangeAddress(0,0,4,5));
+            hssfSheet.addMergedRegion(new CellRangeAddress(1,2,0,0));
+            hssfSheet.addMergedRegion(new CellRangeAddress(1,1,1,4));
+            hssfSheet.addMergedRegion(new CellRangeAddress(1,1,5,7));
+        }else{
+            hssfSheet.addMergedRegion(new CellRangeAddress(0,0,3,4));
+            hssfSheet.addMergedRegion(new CellRangeAddress(1,2,0,0));
+            hssfSheet.addMergedRegion(new CellRangeAddress(1,1,1,3));
+            hssfSheet.addMergedRegion(new CellRangeAddress(1,1,4,6));
+        }
+
+
+
+        for(int i = 0; i < lists1.size(); i++){
+            //将数据添加到表格中
+            List<String> data = null;
+            for (int l = 0; l < lists1.get(i).size(); l++) {
+                HSSFRow row = hssfSheet.createRow(l + 3);
+                data = lists1.get(i).get(l);
+                for (int j = 0; j < data.size(); j++) {
+                    HSSFCell hssfCell = row.createCell(j);
+                    hssfCell.setCellType(CellType.STRING);//设置表格类型
+                    hssfCell.setCellValue(data.get(j));
+                }
+            }
+        }
+        return hssfWorkbook;
+    }
+
+
+    /**
+     * 获取优惠券统计明细
+     * @param type
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryCouponRegisterInfo(Integer type, String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> list = this.baseMapper.queryCouponRegisterInfo(type, name, start, end, companyId, offset, limit);
+        int i = this.baseMapper.queryCouponRegisterInfoCount(type, name, start, end, companyId);
+        Map<String, Object> map = new HashMap<>();
+        map.put("rows", list);
+        map.put("total", i);
+        return map;
+    }
+
+    @Override
+    public HSSFWorkbook downloadCouponRegisterInfo(Integer type, String name, String time, Integer companyId) {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> maps = this.baseMapper.queryCouponRegisterInfo(type, name, start, end, companyId, null, null);
+
+        List<List<String>> lists = new ArrayList<>();
+        List<String> list = new ArrayList<>();
+        list.add("活动名称:");
+        list.add(name);
+        list.add("");
+        list.add("起止时间:");
+        list.add(time);
+        list.add("");
+        list.add("运营商:");
+        list.add(null != companyId ? companyService.selectById(companyId).getName() : "");
+        lists.add(list);
+        list = new ArrayList<>();
+        list.add("领取时间");
+        list.add("领取人");
+        list.add("领取人电话");
+        list.add("领取金额");
+        list.add("到期时间");
+        list.add("领取类型");
+        list.add("状态");
+        list.add("使用时间");
+        lists.add(list);
+
+        List<List<List<String>>> lists1 = new ArrayList<>();
+        List<List<String>> lists2 = new ArrayList<>();
+        for(Map<String, Object> map : maps){
+            List<String> list2 = new ArrayList<>();
+            list2.add(null != map.get("time") ? map.get("time").toString() : "");
+            list2.add(null != map.get("userName") ? map.get("userName").toString() : "");
+            list2.add(null != map.get("phone") ? map.get("phone").toString() : "");
+            list2.add(null != map.get("money") ? map.get("money").toString() : "");
+            list2.add(null != map.get("expirationTime") ? map.get("expirationTime").toString() : "");
+            list2.add(null != map.get("couponType") ? map.get("couponType").toString() : "");
+            list2.add(null != map.get("state") ? map.get("state").toString() : "");
+            list2.add(null != map.get("endTime") ? map.get("endTime").toString() : "");
+            lists2.add(list2);
+        }
+        lists1.add(lists2);
+
+        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
+        HSSFSheet hssfSheet = hssfWorkbook.createSheet();
+        hssfSheet.setColumnWidth(0, 6 * 256);
+        hssfSheet.setDefaultRowHeightInPoints(20f);
+        for(int i = 0; i < lists.size(); i++){
+            HSSFRow hssfRow = hssfSheet.createRow(i);//设置第一行数据(标题)
+            HSSFCellStyle style = hssfWorkbook.createCellStyle();
+            HSSFFont font = hssfWorkbook.createFont();
+            font.setBold(true);
+            style.setFont(font);
+            style.setAlignment(HorizontalAlignment.CENTER);
+            for (int l = 0; l < lists.get(i).size(); l++) {
+                HSSFCell hssfCell = hssfRow.createCell(l);
+                hssfCell.setCellType(CellType.STRING);//设置表格类型
+                hssfCell.setCellValue(lists.get(i).get(l));
+                hssfCell.setCellStyle(style);
+                if(l > 0) {
+                    hssfSheet.setColumnWidth(l , 20 * 256);
+                }
+
+            }
+        }
+        //这个就是合并单元格
+        //参数说明:1:开始行 2:结束行  3:开始列 4:结束列
+        //比如我要合并 第二行到第四行的    第六列到第八列     sheet.addMergedRegion(new CellRangeAddress(1,3,5,7));
+        hssfSheet.addMergedRegion(new CellRangeAddress(0,0,1,2));
+        hssfSheet.addMergedRegion(new CellRangeAddress(0,0,4,5));
+
+        for(int i = 0; i < lists1.size(); i++){
+            //将数据添加到表格中
+            List<String> data = null;
+            for (int l = 0; l < lists1.get(i).size(); l++) {
+                HSSFRow row = hssfSheet.createRow(l + 2);
+                data = lists1.get(i).get(l);
+                for (int j = 0; j < data.size(); j++) {
+                    HSSFCell hssfCell = row.createCell(j);
+                    hssfCell.setCellType(CellType.STRING);//设置表格类型
+                    hssfCell.setCellValue(data.get(j));
+                }
+            }
+        }
+        return hssfWorkbook;
+    }
+
+    @Override
+    public HSSFWorkbook downloadCouponRegisterInfo1(String name, String time, Integer companyId) {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> maps = this.baseMapper.queryCouponRegisterInfo1(name, start, end, companyId, null, null);
+
+        List<List<String>> lists = new ArrayList<>();
+        List<String> list = new ArrayList<>();
+        list.add("活动名称:");
+        list.add(name);
+        list.add("");
+        list.add("起止时间:");
+        list.add(time);
+        list.add("");
+        list.add("运营商:");
+        list.add(null != companyId ? companyService.selectById(companyId).getName() : "");
+        list.add("");
+        list.add("");
+        list.add("");
+        list.add("");
+        list.add("");
+        list.add("");
+        list.add("");
+        list.add("");
+        lists.add(list);
+        list = new ArrayList<>();
+        list.add("充值时间");
+        list.add("充值人");
+        list.add("充值人电话");
+        list.add("充值金额");
+        list.add("通用券领取总数");
+        list.add("通用券使用总数");
+        list.add("通用券使用总金额");
+        list.add("专车券领取总数");
+        list.add("专车券使用总数");
+        list.add("专车券使用总金额");
+        list.add("出租车券领取总数");
+        list.add("出租车券使用总数");
+        list.add("出租车券使用总金额");
+        list.add("跨城券领取总数");
+        list.add("跨城券使用总数");
+        list.add("跨城券使用总金额");
+        lists.add(list);
+
+        List<List<List<String>>> lists1 = new ArrayList<>();
+        List<List<String>> lists2 = new ArrayList<>();
+        for(Map<String, Object> map : maps){
+            List<String> list2 = new ArrayList<>();
+            list2.add(null != map.get("time") ? map.get("time").toString() : "");
+            list2.add(null != map.get("userName") ? map.get("userName").toString() : "");
+            list2.add(null != map.get("phone") ? map.get("phone").toString() : "");
+            list2.add(null != map.get("amount") ? map.get("amount").toString() : "");
+            list2.add(null != map.get("tyNum") ? map.get("tyNum").toString() : "");
+            list2.add(null != map.get("tyUseNum") ? map.get("tyUseNum").toString() : "");
+            list2.add(null != map.get("tyUseMoney") ? map.get("tyUseMoney").toString() : "");
+            list2.add(null != map.get("zcNum") ? map.get("zcNum").toString() : "");
+            list2.add(null != map.get("zcUseNum") ? map.get("zcUseNum").toString() : "");
+            list2.add(null != map.get("zcUseMoney") ? map.get("zcUseMoney").toString() : "");
+            list2.add(null != map.get("czcNum") ? map.get("czcNum").toString() : "");
+            list2.add(null != map.get("czcUseNum") ? map.get("czcUseNum").toString() : "");
+            list2.add(null != map.get("czcUseMoney") ? map.get("czcUseMoney").toString() : "");
+            list2.add(null != map.get("kcNum") ? map.get("kcNum").toString() : "");
+            list2.add(null != map.get("kcUseNum") ? map.get("kcUseNum").toString() : "");
+            list2.add(null != map.get("kcUseMoney") ? map.get("kcUseMoney").toString() : "");
+            lists2.add(list2);
+        }
+        lists1.add(lists2);
+
+        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
+        HSSFSheet hssfSheet = hssfWorkbook.createSheet();
+        hssfSheet.setColumnWidth(0, 6 * 256);
+        hssfSheet.setDefaultRowHeightInPoints(20f);
+        for(int i = 0; i < lists.size(); i++){
+            HSSFRow hssfRow = hssfSheet.createRow(i);//设置第一行数据(标题)
+            HSSFCellStyle style = hssfWorkbook.createCellStyle();
+            HSSFFont font = hssfWorkbook.createFont();
+            font.setBold(true);
+            style.setFont(font);
+            style.setAlignment(HorizontalAlignment.CENTER);
+            for (int l = 0; l < lists.get(i).size(); l++) {
+                HSSFCell hssfCell = hssfRow.createCell(l);
+                hssfCell.setCellType(CellType.STRING);//设置表格类型
+                hssfCell.setCellValue(lists.get(i).get(l));
+                hssfCell.setCellStyle(style);
+                if(l > 0) {
+                    hssfSheet.setColumnWidth(l , 20 * 256);
+                }
+
+            }
+        }
+        //这个就是合并单元格
+        //参数说明:1:开始行 2:结束行  3:开始列 4:结束列
+        //比如我要合并 第二行到第四行的    第六列到第八列     sheet.addMergedRegion(new CellRangeAddress(1,3,5,7));
+        hssfSheet.addMergedRegion(new CellRangeAddress(0,0,1,2));
+        hssfSheet.addMergedRegion(new CellRangeAddress(0,0,4,5));
+        hssfSheet.addMergedRegion(new CellRangeAddress(0,0,7,8));
+
+        for(int i = 0; i < lists1.size(); i++){
+            //将数据添加到表格中
+            List<String> data = null;
+            for (int l = 0; l < lists1.get(i).size(); l++) {
+                HSSFRow row = hssfSheet.createRow(l + 2);
+                data = lists1.get(i).get(l);
+                for (int j = 0; j < data.size(); j++) {
+                    HSSFCell hssfCell = row.createCell(j);
+                    hssfCell.setCellType(CellType.STRING);//设置表格类型
+                    hssfCell.setCellValue(data.get(j));
+                }
+            }
+        }
+        return hssfWorkbook;
+    }
+
+    @Override
+    public Map<String, Object> queryCouponRegisterInfo1(String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> list = this.baseMapper.queryCouponRegisterInfo1(name, start, end, companyId, offset, limit);
+        int i = this.baseMapper.queryCouponRegisterInfo1Count(name, start, end, companyId);
+        Map<String, Object> map = new HashMap<>();
+        map.put("rows", list);
+        map.put("total", i);
+        return map;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserRedPacketRecordServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserRedPacketRecordServiceImpl.java
new file mode 100644
index 0000000..c277960
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserRedPacketRecordServiceImpl.java
@@ -0,0 +1,294 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.UserRedPacketRecordMapper;
+import com.stylefeng.guns.modular.system.model.UserRedPacketRecord;
+import com.stylefeng.guns.modular.system.service.ITCompanyService;
+import com.stylefeng.guns.modular.system.service.IUserRedPacketRecordService;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class UserRedPacketRecordServiceImpl extends ServiceImpl<UserRedPacketRecordMapper, UserRedPacketRecord> implements IUserRedPacketRecordService {
+
+    @Resource
+    private UserRedPacketRecordMapper userRedPacketRecordMapper;
+
+    @Autowired
+    private ITCompanyService companyService;
+
+
+    /**
+     * 获取红包统计数据
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryRedEnvelopes(String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> list = userRedPacketRecordMapper.queryRedEnvelopes(name, start, end, companyId, offset, limit);
+        int i = userRedPacketRecordMapper.queryRedEnvelopesCount(name, start, end, companyId);
+        Map<String, Object> map = new HashMap<>();
+        map.put("rows", list);
+        map.put("total", i);
+        return map;
+    }
+
+    /**
+     * 下载红包统计数据
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public HSSFWorkbook downloadRedEnvelopes(String name, String time, Integer companyId) throws Exception {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> maps = userRedPacketRecordMapper.queryRedEnvelopes(name, start, end, companyId, null, null);
+        List<List<String>> lists = new ArrayList<>();
+        List<String> list = new ArrayList<>();
+        list.add("活动名称:");
+        list.add(name);
+        list.add("");
+        list.add("起止时间:");
+        list.add(time);
+        list.add("");
+        list.add("运营商:");
+        list.add(null != companyId ? companyService.selectById(companyId).getName() : "");
+        lists.add(list);
+        list = new ArrayList<>();
+        list.add("时间");
+        list.add("领取情况");
+        list.add("");
+        list.add("");
+        list.add("");
+        list.add("使用情况");
+        list.add("");
+        list.add("");
+        lists.add(list);
+        list = new ArrayList<>();
+        list.add("");
+        list.add("注册领取人数");
+        list.add("系统派发人数");
+        list.add("合计");
+        list.add("领取金额");
+        list.add("使用人数");
+        list.add("使用张数");
+        list.add("使用金额");
+        lists.add(list);
+
+        List<List<List<String>>> lists1 = new ArrayList<>();
+        List<List<String>> lists2 = new ArrayList<>();
+        for(Map<String, Object> map : maps){
+            List<String> list2 = new ArrayList<>();
+            list2.add(null != map.get("time") ? map.get("time").toString() : "");
+            list2.add(null != map.get("receivePeople") ? map.get("receivePeople").toString() : "");
+            list2.add(null != map.get("receivePeople") ? map.get("receivePeople").toString() : "");
+            list2.add(null != map.get("receive") ? map.get("receive").toString() : "");
+            list2.add(null != map.get("receiveMoney") ? map.get("receiveMoney").toString() : "");
+            list2.add(null != map.get("usePeople") ? map.get("usePeople").toString() : "");
+            list2.add(null != map.get("use") ? map.get("use").toString() : "");
+            list2.add(null != map.get("useMoney") ? map.get("useMoney").toString() : "");
+            lists2.add(list2);
+        }
+        lists1.add(lists2);
+
+        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
+        HSSFSheet hssfSheet = hssfWorkbook.createSheet();
+        hssfSheet.setColumnWidth(0, 6 * 256);
+        hssfSheet.setDefaultRowHeightInPoints(20f);
+        for(int i = 0; i < lists.size(); i++){
+            HSSFRow hssfRow = hssfSheet.createRow(i);//设置第一行数据(标题)
+            HSSFCellStyle style = hssfWorkbook.createCellStyle();
+            HSSFFont font = hssfWorkbook.createFont();
+            font.setBold(true);
+            style.setFont(font);
+            style.setAlignment(HorizontalAlignment.CENTER);
+            for (int l = 0; l < lists.get(i).size(); l++) {
+                HSSFCell hssfCell = hssfRow.createCell(l);
+                hssfCell.setCellType(CellType.STRING);//设置表格类型
+                hssfCell.setCellValue(lists.get(i).get(l));
+                hssfCell.setCellStyle(style);
+                if(l > 0) {
+                    hssfSheet.setColumnWidth(l , 20 * 256);
+                }
+
+            }
+        }
+        //这个就是合并单元格
+        //参数说明:1:开始行 2:结束行  3:开始列 4:结束列
+        //比如我要合并 第二行到第四行的    第六列到第八列     sheet.addMergedRegion(new CellRangeAddress(1,3,5,7));
+        hssfSheet.addMergedRegion(new CellRangeAddress(0,0,1,2));
+        hssfSheet.addMergedRegion(new CellRangeAddress(0,0,4,5));
+        hssfSheet.addMergedRegion(new CellRangeAddress(1,2,0,0));
+        hssfSheet.addMergedRegion(new CellRangeAddress(1,1,1,4));
+        hssfSheet.addMergedRegion(new CellRangeAddress(1,1,5,7));
+
+
+        for(int i = 0; i < lists1.size(); i++){
+            //将数据添加到表格中
+            List<String> data = null;
+            for (int l = 0; l < lists1.get(i).size(); l++) {
+                HSSFRow row = hssfSheet.createRow(l + 3);
+                data = lists1.get(i).get(l);
+                for (int j = 0; j < data.size(); j++) {
+                    HSSFCell hssfCell = row.createCell(j);
+                    hssfCell.setCellType(CellType.STRING);//设置表格类型
+                    hssfCell.setCellValue(data.get(j));
+                }
+            }
+        }
+        return hssfWorkbook;
+    }
+
+
+    /**
+     * 获取红包统计明细
+     * @param name
+     * @param time
+     * @param companyId
+     * @param offset
+     * @param limit
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> queryRedEnvelopesInfo(String name, String time, Integer companyId, Integer offset, Integer limit) throws Exception {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> list = userRedPacketRecordMapper.queryRedEnvelopesInfo(name, start, end, companyId, offset, limit);
+        int i = userRedPacketRecordMapper.queryRedEnvelopesInfoCount(name, start, end, companyId);
+        Map<String, Object> map = new HashMap<>();
+        map.put("rows", list);
+        map.put("total", i);
+        return map;
+    }
+
+    /**
+     * 下载红包统计明细
+     * @param name
+     * @param time
+     * @param companyId
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public HSSFWorkbook downloadRedEnvelopesInfo(String name, String time, Integer companyId) throws Exception {
+        String start = null;
+        String end = null;
+        if(ToolUtil.isNotEmpty(time)){
+            start = time.split(" - ")[0];
+            end = time.split(" - ")[1];
+        }
+        List<Map<String, Object>> maps = userRedPacketRecordMapper.queryRedEnvelopesInfo(name, start, end, companyId, null, null);
+        List<List<String>> lists = new ArrayList<>();
+        List<String> list = new ArrayList<>();
+        list.add("活动名称:");
+        list.add(name);
+        list.add("");
+        list.add("起止时间:");
+        list.add(time);
+        list.add("运营商:");
+        list.add(null != companyId ? companyService.selectById(companyId).getName() : "");
+        lists.add(list);
+        list = new ArrayList<>();
+        list.add("领取时间");
+        list.add("领取人");
+        list.add("领取人电话");
+        list.add("领取金额");
+        list.add("到期时间");
+        list.add("状态");
+        list.add("使用时间");
+        lists.add(list);
+
+        List<List<List<String>>> lists1 = new ArrayList<>();
+        List<List<String>> lists2 = new ArrayList<>();
+        for(Map<String, Object> map : maps){
+            List<String> list2 = new ArrayList<>();
+            list2.add(null != map.get("time") ? map.get("time").toString() : "");
+            list2.add(null != map.get("name") ? map.get("name").toString() : "");
+            list2.add(null != map.get("phone") ? map.get("phone").toString() : "");
+            list2.add(null != map.get("money") ? map.get("money").toString() : "");
+            list2.add(null != map.get("expirationTime") ? map.get("expirationTime").toString() : "");
+            list2.add(null != map.get("state") ? map.get("state").toString() : "");
+            list2.add(null != map.get("endTime") ? map.get("endTime").toString() : "");
+            lists2.add(list2);
+        }
+        lists1.add(lists2);
+
+        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
+        HSSFSheet hssfSheet = hssfWorkbook.createSheet();
+        hssfSheet.setColumnWidth(0, 6 * 256);
+        hssfSheet.setDefaultRowHeightInPoints(20f);
+        for(int i = 0; i < lists.size(); i++){
+            HSSFRow hssfRow = hssfSheet.createRow(i);//设置第一行数据(标题)
+            HSSFCellStyle style = hssfWorkbook.createCellStyle();
+            HSSFFont font = hssfWorkbook.createFont();
+            font.setBold(true);
+            style.setFont(font);
+            style.setAlignment(HorizontalAlignment.CENTER);
+            for (int l = 0; l < lists.get(i).size(); l++) {
+                HSSFCell hssfCell = hssfRow.createCell(l);
+                hssfCell.setCellType(CellType.STRING);//设置表格类型
+                hssfCell.setCellValue(lists.get(i).get(l));
+                hssfCell.setCellStyle(style);
+                if(l > 0) {
+                    hssfSheet.setColumnWidth(l , 20 * 256);
+                }
+
+            }
+        }
+        //这个就是合并单元格
+        //参数说明:1:开始行 2:结束行  3:开始列 4:结束列
+        //比如我要合并 第二行到第四行的    第六列到第八列     sheet.addMergedRegion(new CellRangeAddress(1,3,5,7));
+        hssfSheet.addMergedRegion(new CellRangeAddress(0,0,1,2));
+
+
+        for(int i = 0; i < lists1.size(); i++){
+            //将数据添加到表格中
+            List<String> data = null;
+            for (int l = 0; l < lists1.get(i).size(); l++) {
+                HSSFRow row = hssfSheet.createRow(l + 2);
+                data = lists1.get(i).get(l);
+                for (int j = 0; j < data.size(); j++) {
+                    HSSFCell hssfCell = row.createCell(j);
+                    hssfCell.setCellType(CellType.STRING);//设置表格类型
+                    hssfCell.setCellValue(data.get(j));
+                }
+            }
+        }
+        return hssfWorkbook;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000..c44b83b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserServiceImpl.java
@@ -0,0 +1,61 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import java.util.List;
+
+import java.util.Map;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.core.datascope.DataScope;
+import com.stylefeng.guns.modular.system.dao.UserMapper;
+import com.stylefeng.guns.modular.system.model.User;
+import com.stylefeng.guns.modular.system.service.IUserService;
+
+/**
+ * <p>
+ * 管理员表 服务实现类
+ * </p>
+ *
+ * @author stylefeng123
+ * @since 2018-02-22
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
+
+    @Override
+    public int setStatus(Integer userId, int status) {
+        return this.baseMapper.setStatus(userId, status);
+    }
+
+    @Override
+    public int changePwd(Integer userId, String pwd) {
+        return this.baseMapper.changePwd(userId, pwd);
+    }
+
+    @Override
+    public List<Map<String, Object>> selectUsers(DataScope dataScope, String name, String beginTime, String endTime, Integer deptid) {
+        return this.baseMapper.selectUsers(dataScope, name, beginTime, endTime, deptid);
+    }
+
+    @Override
+    public int setRoles(Integer userId, String roleIds) {
+        return this.baseMapper.setRoles(userId, roleIds);
+    }
+
+    @Override
+    public User getByAccount(String account) {
+        return this.baseMapper.getByAccount(account);
+    }
+
+    @Override
+    public Integer getMenuNumByRole(String roleStr) {
+        return this.baseMapper.getMenuNumByRole(roleStr);
+    }
+
+    @Override
+    public List<Map<String, Object>> getUserListPage(Page<Map<String, Object>> page, DataScope dataScope, String name, String beginTime, String endTime, Integer deptid) {
+        return this.baseMapper.getUserListPage(page, dataScope, name, beginTime, endTime, deptid);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ManagerUser.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ManagerUser.java
new file mode 100644
index 0000000..0e16e16
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ManagerUser.java
@@ -0,0 +1,97 @@
+package com.stylefeng.guns.modular.system.transfer;
+
+import java.util.Date;
+
+/**
+ * 管理员的信息封装
+ *
+ * @author fengshuonan
+ * @Date 2017年1月11日 下午7:46:53
+ */
+public class ManagerUser {
+
+    private String userId;
+
+    /* 用户账号 */
+    private String userNo;
+
+    /* 用户姓名 */
+    private String userName;
+
+    private String userPhone;
+
+    //1:超级管理员  2:管理员
+    private String userRole;
+
+    /* 1:登录状态 2:退出状态 3:停用状态 */
+    private Integer userStatus;
+
+    private Date createTime;
+
+    private Date loginTime;
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserNo() {
+        return userNo;
+    }
+
+    public void setUserNo(String userNo) {
+        this.userNo = userNo;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserPhone() {
+        return userPhone;
+    }
+
+    public void setUserPhone(String userPhone) {
+        this.userPhone = userPhone;
+    }
+
+    public String getUserRole() {
+        return userRole;
+    }
+
+    public void setUserRole(String userRole) {
+        this.userRole = userRole;
+    }
+
+    public Integer getUserStatus() {
+        return userStatus;
+    }
+
+    public void setUserStatus(Integer userStatus) {
+        this.userStatus = userStatus;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(Date loginTime) {
+        this.loginTime = loginTime;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqAddManager.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqAddManager.java
new file mode 100644
index 0000000..6e28801
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqAddManager.java
@@ -0,0 +1,76 @@
+package com.stylefeng.guns.modular.system.transfer;
+
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 添加管理员的请求bean
+ *
+ * @author fengshuonan
+ * @Date 2017年1月12日 下午6:46:24
+ */
+public class ReqAddManager {
+
+    // 用户姓名
+    @NotNull
+    private String userName;
+
+    // 用户账号
+    @NotNull
+    private String userNo;
+
+    // 手机号
+    @NotNull
+    @Length(min = 11, max = 11)
+    private String userPhone;
+
+    // 1:超级管理员 2:管理员
+    @NotNull
+    private String userRole;
+
+    // 密码
+    @NotNull
+    private String userPassword;
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserNo() {
+        return userNo;
+    }
+
+    public void setUserNo(String userNo) {
+        this.userNo = userNo;
+    }
+
+    public String getUserPhone() {
+        return userPhone;
+    }
+
+    public void setUserPhone(String userPhone) {
+        this.userPhone = userPhone;
+    }
+
+    public String getUserRole() {
+        return userRole;
+    }
+
+    public void setUserRole(String userRole) {
+        this.userRole = userRole;
+    }
+
+    public String getUserPassword() {
+        return userPassword;
+    }
+
+    public void setUserPassword(String userPassword) {
+        this.userPassword = userPassword;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqEditManager.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqEditManager.java
new file mode 100644
index 0000000..394d4b4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/ReqEditManager.java
@@ -0,0 +1,60 @@
+package com.stylefeng.guns.modular.system.transfer;
+
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 编辑管理员的请求
+ *
+ * @author fengshuonan
+ * @Date 2017年1月15日 下午10:29:16
+ */
+public class ReqEditManager {
+
+    @NotNull
+    private String userId;
+
+    /* 用户姓名 */
+    @NotNull
+    private String userName;
+
+    private String userPassword;
+
+    @NotNull
+    @Length(min = 11, max = 11)
+    private String userPhone;
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getUserPassword() {
+        return userPassword;
+    }
+
+    public void setUserPassword(String userPassword) {
+        this.userPassword = userPassword;
+    }
+
+    public String getUserPhone() {
+        return userPhone;
+    }
+
+    public void setUserPhone(String userPhone) {
+        this.userPhone = userPhone;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/UserDto.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/UserDto.java
new file mode 100644
index 0000000..d45f320
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/transfer/UserDto.java
@@ -0,0 +1,153 @@
+package com.stylefeng.guns.modular.system.transfer;
+
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 用户传输bean
+ * 
+ * @author stylefeng
+ * @Date 2017/5/5 22:40
+ */
+public class UserDto{
+
+	private Integer id;
+	private String account;
+	private String password;
+	private String salt;
+	private String name;
+
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private Date birthday;
+	private Integer sex;
+	private String email;
+	private String phone;
+	private String roleid;
+	private Integer deptid;
+	private Integer status;
+	private Date createtime;
+	private Integer version;
+	private String avatar;
+
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getAccount() {
+		return account;
+	}
+
+	public void setAccount(String account) {
+		this.account = account;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public String getSalt() {
+		return salt;
+	}
+
+	public void setSalt(String salt) {
+		this.salt = salt;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Date getBirthday() {
+		return birthday;
+	}
+
+	public void setBirthday(Date birthday) {
+		this.birthday = birthday;
+	}
+
+	public Integer getSex() {
+		return sex;
+	}
+
+	public void setSex(Integer sex) {
+		this.sex = sex;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+
+	public String getPhone() {
+		return phone;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public String getRoleid() {
+		return roleid;
+	}
+
+	public void setRoleid(String roleid) {
+		this.roleid = roleid;
+	}
+
+	public Integer getDeptid() {
+		return deptid;
+	}
+
+	public void setDeptid(Integer deptid) {
+		this.deptid = deptid;
+	}
+
+	public Integer getStatus() {
+		return status;
+	}
+
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+
+	public Date getCreatetime() {
+		return createtime;
+	}
+
+	public void setCreatetime(Date createtime) {
+		this.createtime = createtime;
+	}
+
+	public Integer getVersion() {
+		return version;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	public String getAvatar() {
+		return avatar;
+	}
+
+	public void setAvatar(String avatar) {
+		this.avatar = avatar;
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AESUtils.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AESUtils.java
new file mode 100644
index 0000000..040d6a4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AESUtils.java
@@ -0,0 +1,104 @@
+package com.stylefeng.guns.modular.system.util;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.Key;
+import java.security.spec.AlgorithmParameterSpec;
+import java.util.Base64;
+
+public class AESUtils {
+    private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
+    private static final String ALGORITHM = "AES";
+    private static final String CHARSET = "utf-8";
+    /**
+     * 建议为16位或32位
+     */
+    private static final String KEY = "c53fd327353a09a1";
+    /**
+     * 必须16位
+     * 初始化向量IV不可以为32位,否则异常java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long
+     */
+    private static final String IV = "3a0565e3b1d8ae3d";
+
+    /**
+     * 加密
+     *
+     * @param context
+     * @return
+     */
+    public static String encrypt(String context) {
+        try {
+            byte[] decode = context.getBytes(CHARSET);
+            byte[] bytes = createKeyAndIv(decode, Cipher.ENCRYPT_MODE);
+            return Base64.getEncoder().encodeToString(bytes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 解密
+     *
+     * @param context
+     * @return
+     */
+    public static String decrypt(String context) {
+        try {
+            Base64.Decoder decoder = Base64.getDecoder();
+            byte[] decode = decoder.decode(context);
+            byte[] bytes = createKeyAndIv(decode, Cipher.DECRYPT_MODE);
+            return new String(bytes, CHARSET);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 获取key & iv
+     *
+     * @param context
+     * @param opmode
+     * @return
+     * @throws Exception
+     */
+    public static byte[] createKeyAndIv(byte[] context, int opmode) throws Exception {
+        byte[] key = KEY.getBytes(CHARSET);
+        byte[] iv = IV.getBytes(CHARSET);
+        return cipherFilter(context, opmode, key, iv);
+    }
+
+    /**
+     * 执行操作
+     *
+     * @param context
+     * @param opmode
+     * @param key
+     * @param iv
+     * @return
+     * @throws Exception
+     */
+    public static byte[] cipherFilter(byte[] context, int opmode, byte[] key, byte[] iv) throws Exception {
+        Key secretKeySpec = new SecretKeySpec(key, ALGORITHM);
+        AlgorithmParameterSpec ivParameterSpec = new IvParameterSpec(iv);
+        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+        cipher.init(opmode, secretKeySpec, ivParameterSpec);
+        return cipher.doFinal(context);
+    }
+
+    /**
+     * 主方法测试
+     *
+     * @param args
+     */
+    public static void main(String[] args) {
+        String context = "zhaors";
+        System.out.println("元数据" + context);
+        String encrypt = encrypt(context);
+        System.out.println("加密之后:" + encrypt);
+        String decrypt = decrypt(encrypt);
+        System.out.println("解密之后:" + decrypt);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AddAdminLogUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AddAdminLogUtil.java
new file mode 100644
index 0000000..98cf3a1
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AddAdminLogUtil.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+
+import java.util.Date;
+
+/**
+ * 添加操作日志工具包
+ */
+public class AddAdminLogUtil extends BaseController {
+
+    /**
+     * 添加
+     * @param content  操作内容
+     */
+//    public static AppAdminLog addAdminLog(String content){
+//        AppAdminLog log = new AppAdminLog();
+//        log.setAddTime(new Date());
+//        log.setContent(content);
+//        log.setSysUserId(ShiroKit.getUser().getId());
+//        return log;
+//    }
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ConstellationUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ConstellationUtil.java
new file mode 100644
index 0000000..bc1a3c7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ConstellationUtil.java
@@ -0,0 +1,68 @@
+package com.stylefeng.guns.modular.system.util;
+
+import java.util.Date;
+import java.util.Scanner;
+
+/**
+ * 根据出生日期获取星座
+ */
+public class ConstellationUtil {
+
+    /**
+     * 根据出生日期获取星座
+     * @param birthday  例如:2020-02-02
+     * @return
+     */
+    public static String getConstellation(String birthday) {
+        Date parse = DateUtil.parseDate(birthday);
+        String mMdd = DateUtil.format(parse, "MMdd");
+        Scanner sc = new Scanner(mMdd);
+        int monthday = sc.nextInt();
+        int month = monthday / 100;
+        int day = monthday % 100;
+        String xingzuo = "";
+        switch (month) {
+            case 1:
+                xingzuo = day < 21 ? "摩羯座" : "水瓶座";
+                break;
+            case 2:
+                xingzuo = day < 20 ? "水瓶座" : "双鱼座";
+                break;
+            case 3:
+                xingzuo = day < 21 ? "双鱼座" : "白羊座";
+                break;
+            case 4:
+                xingzuo = day < 21 ? "白羊座" : "金牛座";
+                break;
+            case 5:
+                xingzuo = day < 22 ? "金牛座" : "双子座";
+                break;
+            case 6:
+                xingzuo = day < 22 ? "双子座" : "巨蟹座";
+                break;
+            case 7:
+                xingzuo = day < 23 ? "巨蟹座" : "狮子座";
+                break;
+            case 8:
+                xingzuo = day < 24 ? "狮子座" : "处女座";
+                break;
+            case 9:
+                xingzuo = day < 24 ? "处女座" : "天秤座";
+                break;
+            case 10:
+                xingzuo = day < 24 ? "天秤座" : "天蝎座";
+                break;
+            case 11:
+                xingzuo = day < 23 ? "天蝎座" : "射手座";
+                break;
+            case 12:
+                xingzuo = day < 22 ? "射手座" : "摩羯座";
+                break;
+        }
+        return xingzuo;
+    }
+
+    public static void main(String[] args) {
+        System.out.println(ConstellationUtil.getConstellation("1995-09-07"));
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DateUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DateUtil.java
new file mode 100644
index 0000000..e2a19ea
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DateUtil.java
@@ -0,0 +1,1130 @@
+package com.stylefeng.guns.modular.system.util;
+
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+/**
+ * <h3>处理时间的工具类</h3>
+ */
+public class DateUtil {
+
+	
+	
+	
+	private static TimeZone tz = TimeZone.getTimeZone("GMT+8");
+
+	// private static TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
+
+	/**
+	 * 格式化日期
+	 */
+	public static Date parse(String date, String pattern) {
+		try {
+			return DateUtils.parseDate(date, pattern);
+		} catch (ParseException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+
+	/**
+	 * 格式化日期
+	 */
+	public static Date parseDate(String date) {
+		return parse(date, "yyyy-MM-dd");
+	}
+
+	/**
+	 * 格式化日期
+	 */
+	public static String format(Date date, String pattern) {
+		return DateFormatUtils.format(date, pattern);
+	}
+
+	public static boolean hourMinuteBetween(String nowDate, String startDate, String endDate) throws Exception{
+		
+		SimpleDateFormat format = new SimpleDateFormat("HH:mm");
+		
+		Date now = format.parse(nowDate);
+		Date start = format.parse(startDate);
+		Date end = format.parse(endDate);
+		
+		long nowTime = now.getTime();
+		long startTime = start.getTime();
+		long endTime = end.getTime();
+		
+		return nowTime >= startTime && nowTime <= endTime;
+	}
+
+	/**
+	 * 得到系统日期
+	 * 
+	 * @return
+	 */
+	public static Date getDate() {
+		TimeZone.setDefault(tz);
+		return new Date();
+	}
+
+	/**
+	 * 获取当然凌晨的时间
+	 * 
+	 * @return Date
+	 */
+	public static Date getZero() {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(new Date());
+		calendar.set(Calendar.HOUR_OF_DAY, 0);
+		calendar.set(Calendar.MINUTE, 0);
+		calendar.set(Calendar.SECOND, 0);
+		return calendar.getTime();
+	}
+
+	/**
+	 * 判断日期是否在from,to之内 "yyyy-MM-dd" 格式
+	 * 
+	 * @param time
+	 *            指定日期
+	 * @param from
+	 *            开始日期
+	 * @param to
+	 *            结束日期
+	 * @return true 在之间 false 不在之间
+	 */
+	public static boolean belongCalendar(Date time, Date from, Date to) {
+		Calendar date = Calendar.getInstance();
+		date.setTime(time);
+
+		Calendar after = Calendar.getInstance();
+		after.setTime(from);
+
+		Calendar before = Calendar.getInstance();
+		before.setTime(to);
+
+		if ((date.after(after) && date.before(before)) || (time.compareTo(from) == 0 || time.compareTo(to) == 0)) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * 两个时间之差
+	 * 
+	 * @param startTime
+	 * @param endTime
+	 * @param format
+	 * @return
+	 * @throws ParseException
+	 */
+	public static String dateDiff(String startTime, String endTime, String format) throws ParseException {
+		// 按照传入的格式生成一个simpledateformate对象
+		SimpleDateFormat sd = new SimpleDateFormat(format);
+		long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
+		long nh = 1000 * 60 * 60;// 一小时的毫秒数
+		long nm = 1000 * 60;// 一分钟的毫秒数
+		long ns = 1000;// 一秒钟的毫秒数
+		long diff;
+		long day = 0;
+		long hour = 0;
+		long min = 0;
+		long sec = 0;
+		// long time=0;
+		String strTime = "";
+		// 获得两个时间的毫秒时间差异
+		diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
+		day = diff / nd;// 计算差多少天
+		hour = diff % nd / nh + day * 24;// 计算差多少小时
+		min = diff % nd % nh / nm + day * 24 * 60;// 计算差多少分钟
+		sec = diff % nd % nh % nm / ns;// 计算差多少秒
+		// 输出结果
+		/*
+		 * System.out.println("时间相差:" + day + "天" + (hour - day * 24) + "小时" +
+		 * (min - day * 24 * 60) + "分钟" + sec + "秒。");
+		 * System.out.println("hour=" + hour + ",min=" + min);
+		 */
+		if (day == 1) {
+			strTime = "昨天";
+		} else if (day > 1) {
+			// strTime=day+"天前";
+			strTime = startTime.substring(0, 10);
+		} else if (hour >= 1 && hour < 24) {
+			strTime = hour + "小时前";
+		} else {
+			if (min == 0) {
+				strTime = sec + "秒钟前";
+			} else {
+				strTime = min + "分钟前";
+			}
+
+		}
+		// if (str.equalsIgnoreCase("h")) {
+		// return hour;
+		// } else {
+		// return min;
+		// }
+
+		// if (str.equalsIgnoreCase("h")) {
+		// return hour;
+		// } else {
+		// return min;
+		// }
+		return strTime;
+	}
+
+	/**
+	 * 得到系统Calendar日期
+	 * 
+	 * @return
+	 */
+	public static Calendar getCalendar() {
+		TimeZone.setDefault(tz);
+		Calendar cal = Calendar.getInstance();
+		return cal;
+	}
+
+	/**
+	 * 获取当前时间
+	 * 
+	 * @return
+	 */
+	public static long getMillisecond() {
+		long millisecond = 0;
+		TimeZone.setDefault(tz);
+		Calendar cal = Calendar.getInstance();
+		millisecond = cal.getTimeInMillis();
+		return millisecond;
+	}
+
+	/**
+	 * 获取本月1号的时间戳
+	 * 
+	 * @return
+	 */
+	public static long getMillisecond_MONTH() {
+		long millisecond = 0;
+		TimeZone.setDefault(tz);
+		Calendar cal = Calendar.getInstance();
+		cal.set(Calendar.DAY_OF_MONTH, 1);
+		millisecond = cal.getTimeInMillis();
+		return millisecond;
+	}
+
+	
+	/**
+	 * 获取上个月1号的时间戳
+	 * 
+	 * @return
+	 */
+	public static long getMillisecond_FRONTMONTH() {
+		long millisecond = 0;
+		Calendar cal = getCalendar();
+		cal.set(Calendar.DAY_OF_MONTH, 1);
+		cal.set(Calendar.MONTH, Calendar.MONTH - 2);
+		millisecond = cal.getTimeInMillis();
+		return millisecond;
+	}
+
+	/**
+	 * 获取当前毫秒数
+	 * 
+	 * @return long
+	 */
+	public static long getCurMilli() {
+		long millisecond = 0;
+		Calendar cal = Calendar.getInstance();
+		millisecond = cal.getTimeInMillis();
+		return millisecond;
+	}
+
+	/**
+	 * 日期转毫秒
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond(Date date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if (!"".equals(date)) {
+			newDate = sdf.format(date);
+		} else {
+			newDate = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 0;
+		try {
+			millisecond = sdf.parse(newDate).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 日期转毫秒(加24小时,yyyy-MM-dd HH:mm:ss)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_24h(Date date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if (!"".equals(date)) {
+			newDate = sdf.format(date);
+		} else {
+			newDate = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 24 * 3600 * 1000;
+		try {
+			millisecond += sdf.parse(newDate).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 日期转毫秒(加N年)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_year(String date, Integer year) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if ("".equals(date)) {
+			newDate = sdf.format(DateUtil.getDate());
+		} else {
+			newDate = getDateTime(Long.parseLong(date));
+		}
+		Date dt = null;
+		try {
+			dt = sdf.parse(newDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		Calendar rightNow = Calendar.getInstance();
+		rightNow.setTime(dt);
+		rightNow.add(Calendar.YEAR, year);
+		Date dt1 = rightNow.getTime();
+		return dt1.getTime();
+	}
+
+	/**
+	 * 日期转毫秒(加N天)
+	 * 
+	 * @param date
+	 *            毫秒字符串
+	 * @return
+	 */
+	public static Date getMillisecond_day(String date, Integer day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if ("".equals(date)) {
+			newDate = sdf.format(DateUtil.getDate());
+		} else {
+			newDate = date;
+		}
+		Date dt = null;
+		try {
+			dt = sdf.parse(newDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		Calendar rightNow = Calendar.getInstance();
+		rightNow.setTime(dt);
+		rightNow.add(Calendar.DATE, day);
+		Date dt1 = rightNow.getTime();
+		Date dates = new Date(dt1.getTime());
+		return dates;
+	}
+
+	/**
+	 * 日期转毫秒(加N月)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_month(String date, Integer day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if ("".equals(date)) {
+			newDate = sdf.format(DateUtil.getDate());
+		} else {
+			newDate = getDateTime(Long.parseLong(date));
+		}
+		Date dt = null;
+		try {
+			dt = sdf.parse(newDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		Calendar rightNow = Calendar.getInstance();
+		rightNow.setTime(dt);
+		rightNow.add(Calendar.MONTH, day);
+		Date dt1 = rightNow.getTime();
+		return dt1.getTime();
+	}
+	
+	/**
+	 * 日期转毫秒(加分钟)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_fz(String date, Integer day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if ("".equals(date)) {
+			newDate = sdf.format(DateUtil.getDate());
+		} else {
+			newDate = getDateTime(Long.parseLong(date));
+		}
+		Date dt = null;
+		try {
+			dt = sdf.parse(newDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		Calendar rightNow = Calendar.getInstance();
+		rightNow.setTime(dt);
+		rightNow.add(Calendar.MINUTE, day);
+		Date dt1 = rightNow.getTime();
+		return dt1.getTime();
+	}
+	
+	public static Date getMillisecond_fz1(String date, Integer day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		Date dt = null;
+		try {
+			dt = sdf.parse(date);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		Calendar rightNow = Calendar.getInstance();
+		rightNow.setTime(dt);
+		rightNow.add(Calendar.MINUTE, day);
+		Date dt1 = rightNow.getTime();
+		return dt1;
+	}
+
+	/**
+	 * 字符串日期转毫秒
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_str(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		if ("".equals(date)) {
+			date = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 0;
+		try {
+			millisecond = sdf.parse(date).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 字符串日期转毫秒
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_strYmd(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		if ("".equals(date)) {
+			date = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 0;
+		try {
+			millisecond = sdf.parse(date).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 字符串日期转Date
+	 * 
+	 * @param string
+	 * @return date
+	 * @throws ParseException
+	 */
+	public static Date getStrToDate(String dateString) throws ParseException {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date date = sdf.parse(dateString);
+		return date;
+	}
+
+	/**
+	 * 字符串日期转Date
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_str(String dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		sdf.setTimeZone(tz);
+		if ("".equals(dateStr)) {
+			dateStr = sdf.format(DateUtil.getDate());
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(dateStr);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 字符串日期转Date yyyy-MM-dd HH:mm
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_str2(String dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+		sdf.setTimeZone(tz);
+		if ("".equals(dateStr)) {
+			dateStr = sdf.format(DateUtil.getDate());
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(dateStr);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 字符串日期转Date yyyy-MM-dd HH:mm:ss
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_str3(String dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		sdf.setTimeZone(tz);
+		if ("".equals(dateStr)) {
+			dateStr = sdf.format(DateUtil.getDate());
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(dateStr);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 字符串日期转Date
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_strYMd(Long dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		if (dateStr == null) {
+			dateStr = DateUtil.getCurMilli();
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(sdf.format(new Date(dateStr)));
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 毫秒转Date
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_strYMdHms(Long dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		if (dateStr == null) {
+			dateStr = DateUtil.getCurMilli();
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(sdf.format(new Date(dateStr)));
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 字符串日期转Date
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static Date getDate_strYMdHm(Long dateStr) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+		if (dateStr == null) {
+			dateStr = DateUtil.getCurMilli();
+		}
+		Date date = null;
+		try {
+			date = sdf.parse(sdf.format(new Date(dateStr)));
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return date;
+	}
+
+	/**
+	 * 字符串日期转毫秒
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_strDmy(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
+		if ("".equals(date)) {
+			date = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 0;
+		try {
+			millisecond = sdf.parse(date).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 字符串日期转毫秒转毫秒(加24小时)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_str_24h(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		if ("".equals(date)) {
+			date = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 24 * 3600 * 1000;
+		try {
+			millisecond += sdf.parse(date).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 字符串日期转毫秒转毫秒(加24小时)
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getMillisecond_strYmd_24h(String date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		if ("".equals(date)) {
+			date = sdf.format(DateUtil.getDate());
+		}
+		long millisecond = 24 * 3600 * 1000;
+		try {
+			millisecond += sdf.parse(date).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return millisecond;
+	}
+
+	/**
+	 * 毫秒转日期
+	 * 
+	 * @param millisecond
+	 * @return
+	 */
+	public static String getDate(long millisecond) {
+		if (millisecond == 0) {
+			millisecond = getCurMilli();
+		}
+		SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar calendar = getCalendar();
+		calendar.setTimeInMillis(millisecond);
+		return dateformat.format(calendar.getTime());
+	}
+
+	/**
+	 * 转换为指定格式的时间
+	 * 
+	 * @return Date
+	 */
+	public static Date getDate(String date, String pattern) {
+		SimpleDateFormat format = new SimpleDateFormat(pattern);
+		Date d = null;
+		try {
+			d = format.parse(date);
+		} catch (ParseException ex) {
+			return null;
+		}
+		return d;
+	}
+
+	/**
+	 * 毫秒转日期
+	 * 
+	 * @param millisecond
+	 * @return
+	 */
+	public static String getDate_HH(long millisecond) {
+		if (millisecond == 0) {
+			millisecond = getCurMilli();
+		}
+		SimpleDateFormat dateformat = new SimpleDateFormat("HH");
+		Calendar calendar = getCalendar();
+		calendar.setTimeInMillis(millisecond);
+		return dateformat.format(calendar.getTime());
+	}
+
+	/**
+	 * 毫秒转日期时间
+	 * 
+	 * @param millisecond
+	 * @return
+	 */
+	public static String getDateTime(long millisecond) {
+		if (millisecond == 0) {
+			millisecond = getCurMilli();
+		}
+		SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		Calendar calendar = getCalendar();
+		calendar.setTimeInMillis(millisecond);
+		return dateformat.format(calendar.getTime());
+	}
+
+	/**
+	 * 毫秒转年月日
+	 * 
+	 * @param millisecond
+	 * @return
+	 */
+	public static String getDateYMD(long millisecond) {
+		if (millisecond == 0) {
+			millisecond = getCurMilli();
+		}
+		SimpleDateFormat dateformat = new SimpleDateFormat("yyyy年MM月dd日");
+		Calendar calendar = getCalendar();
+		calendar.setTimeInMillis(millisecond);
+		return dateformat.format(calendar.getTime());
+	}
+
+	/**
+	 * 两日期相差毫秒
+	 * 
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 */
+	public static long getMinusMillisecond(Date startDate, Date endDate) {
+		long startMillisecond = getMillisecond(startDate);
+		long endMillisecond = getMillisecond(endDate);
+		long minusMillisecond = endMillisecond - startMillisecond;
+		if (minusMillisecond < 0) {
+			minusMillisecond = 0;
+		}
+		return minusMillisecond;
+	}
+
+	/**
+	 * 两日期相差天数
+	 * 
+	 * @param startDate
+	 * @param endDate
+	 * @return
+	 */
+	public static long getMinusDay(Date startDate, Date endDate) {
+		long startMillisecond = getMillisecond(startDate);
+		long endMillisecond = getMillisecond(endDate);
+		long minusMillisecond = endMillisecond - startMillisecond;
+		long day = 0;
+		if (minusMillisecond < 0) {
+			day = 0;
+		} else {
+			day = minusMillisecond / (24 * 3600 * 1000);
+		}
+		return day;
+	}
+
+	/**
+	 * 前N天毫秒
+	 * 
+	 * @param day
+	 * @return
+	 */
+	public static long getRetreatDay_millisecond(int day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		long nowMillisecond = 0;
+		try {
+			nowMillisecond = sdf.parse(sdf.format(DateUtil.getDate())).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		nowMillisecond += 24 * 3600 * 1000;
+		long retreatMillisecond = 24 * 3600 * 1000 * day;
+		return nowMillisecond - retreatMillisecond;
+	}
+
+	/**
+	 * 前N天时间
+	 * 
+	 * @param day
+	 * @return
+	 */
+	public static String getRetreatDay_millisecond1(int day) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		long nowMillisecond = 0;
+		try {
+			nowMillisecond = sdf.parse(sdf.format(DateUtil.getDate())).getTime();
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		nowMillisecond += 24 * 3600 * 1000;
+		long retreatMillisecond = 24 * 3600 * 1000 * day;
+		long s = nowMillisecond - retreatMillisecond;
+		Date date = new Date(s);
+		String res = sdf.format(date);
+		return res;
+	}
+
+	// 当前时间前30天
+	public static String getRetreatDay_millisecond2() {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Date today = new Date();
+		String endDate = sdf.format(today);// 当前日期
+		// 获取三十天前日期
+		Calendar theCa = Calendar.getInstance();
+		theCa.setTime(today);
+		theCa.add(theCa.DATE, -30);// 最后一个数字30可改,30天的意思
+		Date start = theCa.getTime();
+		String startDate = sdf.format(start);// 三十天之前日期
+		return startDate;
+	}
+
+	/**
+	 * 日期转秒
+	 * 
+	 * @param date
+	 * @return
+	 */
+	public static long getDecond(Date date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String newDate = "";
+		if (!"".equals(date)) {
+			newDate = sdf.format(date);
+		} else {
+			newDate = sdf.format(DateUtil.getDate());
+		}
+		long second = 0;
+		try {
+			second = sdf.parse(newDate).getTime() / 1000;
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return second;
+	}
+
+	/**
+	 * 日期转String
+	 * 
+	 * @param date
+	 * @return
+	 * @throws ParseException
+	 */
+	public static String getDateToString(Date date,String pattern) throws ParseException {
+		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+		String newDate = sdf.format(date);
+		long millisecond = sdf.parse(newDate).getTime();
+		Calendar calendar = getCalendar();
+		calendar.setTimeInMillis(millisecond);
+		return sdf.format(calendar.getTime());
+	}
+
+
+	/**
+	 * 毫秒转星期XX
+	 * 
+	 * @param millisecond
+	 * @return
+	 */
+	public static int getDate_week(Long millisecond) {
+		if (millisecond == null) {
+			millisecond = getCurMilli();
+		}
+		Calendar cal = getCalendar();
+		cal.setTimeInMillis(millisecond);
+		return cal.get(Calendar.DAY_OF_WEEK) - 1;
+
+	}
+
+	/**
+	 * 获取当前系统时间已yyyy-MM-dd HH:mm:ss格式化的字符串
+	 */
+	public static String nowStr() {
+
+		SimpleDateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
+		return dateFormat.format(getDate());
+	}
+
+	/**
+	 * 
+	 * 获取之前几天日期
+	 * 
+	 * @param pattern
+	 *            yyyy-MM-dd(默认)
+	 * @param few
+	 *            之前几天
+	 */
+	public static String beforeFewDayStr(String pattern, Integer few) {
+
+		if (pattern == null || "".equals(pattern)) {
+			pattern = "yyyy-MM-dd";
+		}
+		Calendar c = getCalendar();
+		c.add(Calendar.DATE, -few);
+		return new SimpleDateFormat(pattern).format(c.getTime());
+	}
+	
+	
+	/**
+	 * 得到几天后的时间
+	 *
+	 * @param d
+	 * @param day
+	 * @return
+	 */
+	public static Date getDateAfter(Date d, int day) {
+	    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+	    Calendar now = Calendar.getInstance();
+	    now.setTime(d);
+	    now.set(Calendar.DATE, now.get(Calendar.DATE) - day);//+后 -前
+	    return now.getTime();
+	}
+	
+
+	/**
+	 * 获取今天日期
+	 * 
+	 * @param pattern
+	 *            yyyy-MM-dd(默认)
+	 */
+	public static String todayStr(String pattern) {
+
+		if (pattern == null || "".equals(pattern)) {
+			pattern = "yyyy-MM-dd";
+		}
+		return new SimpleDateFormat(pattern).format(getDate());
+	}
+
+	/**
+	 * 获取当前系统时间戳字符串
+	 */
+	public static String nowDateLongStr() {
+
+		return getDate().getTime() + "";
+	}
+
+	/**
+	 * 获取当前系统时间
+	 * 
+	 * @return
+	 */
+	public static Date now() {
+
+		return getDate();
+	}
+
+	/*public static void main(String[] args) throws ParseException {
+		// 打印测试日期包含
+		Date time1 = getDate_str("2017-3-11");
+		Date time2 = getDate_str("2017-3-15");
+		Date time3 = getDate_str("2017-3-17");
+		Date time4 = getDate_str("2017-3-12");
+		Date time5 = getDate_str("2017-3-16");
+		Date from = getDate_str("2017-3-12");
+		Date to = getDate_str("2017-3-16");
+		System.out.println(belongCalendar(time1, from, to));
+		System.out.println(belongCalendar(time2, from, to));
+		System.out.println(belongCalendar(time3, from, to));
+		System.out.println(belongCalendar(time4, from, to));
+		System.out.println(belongCalendar(time5, from, to));
+		System.out.println(nowStr());
+
+	}
+*/
+	/**
+	 * 把日期往后增加一天. 正数往后推,负数往前移动
+	 * 
+	 * @param day
+	 * @return
+	 */
+	public static String getString(int day) {
+		Date date = new Date();// 取时间
+		Calendar calendar = new GregorianCalendar();
+		calendar.setTime(date);
+		calendar.add(calendar.DATE, day);// 把日期往后增加一天.整数往后推,负数往前移动
+		date = calendar.getTime(); // 这个时间就是日期往后推一天的结果
+		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+		String dateString = formatter.format(date);
+		return dateString;
+	}
+
+	/**
+	 * 根据当前日期获得所在周的日期区间(周一和周日日期)
+	 * 
+	 * @return
+	 * @author zhaoxuepu
+	 * @throws ParseException
+	 */
+	public static String getTimeInterval(Date date) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		// 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
+		int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
+		if (1 == dayWeek) {
+			cal.add(Calendar.DAY_OF_MONTH, -1);
+		}
+		// System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期
+		// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
+		cal.setFirstDayOfWeek(Calendar.MONDAY);
+		// 获得当前日期是一个星期的第几天
+		int day = cal.get(Calendar.DAY_OF_WEEK);
+		// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
+		cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
+		String imptimeBegin = sdf.format(cal.getTime());
+		// System.out.println("所在周星期一的日期:" + imptimeBegin);
+		cal.add(Calendar.DATE, 6);
+		String imptimeEnd = sdf.format(cal.getTime());
+		// System.out.println("所在周星期日的日期:" + imptimeEnd);
+		return imptimeBegin + "," + imptimeEnd;
+	}
+
+	/**
+	 * 根据当前日期获得上周的日期区间(上周周一和周日日期)
+	 * 
+	 * @return
+	 * @author zhaoxuepu
+	 */
+	public static String getLastTimeInterval() {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar calendar1 = Calendar.getInstance();
+		Calendar calendar2 = Calendar.getInstance();
+		int dayOfWeek = calendar1.get(Calendar.DAY_OF_WEEK) - 1;
+		int offset1 = 1 - dayOfWeek;
+		int offset2 = 7 - dayOfWeek;
+		calendar1.add(Calendar.DATE, offset1 - 7);
+		calendar2.add(Calendar.DATE, offset2 - 7);
+		// System.out.println(sdf.format(calendar1.getTime()));// last Monday
+		String lastBeginDate = sdf.format(calendar1.getTime());
+		// System.out.println(sdf.format(calendar2.getTime()));// last Sunday
+		String lastEndDate = sdf.format(calendar2.getTime());
+		return lastBeginDate + "," + lastEndDate;
+	}
+
+	public static String DateYUE() {
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar c = Calendar.getInstance();
+		c.add(Calendar.MONTH, 0);
+		c.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
+		String first = format.format(c.getTime());
+
+		// 获取当前月最后一天
+		Calendar ca = Calendar.getInstance();
+		ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
+		String last = format.format(ca.getTime());
+		return first + "," + last;
+	}
+
+	public static String getBeforeFirstMonthdate() {
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar calendar = Calendar.getInstance();
+		Calendar calendar1 = Calendar.getInstance();
+		calendar.add(Calendar.MONTH, -1);
+		calendar.set(Calendar.DAY_OF_MONTH, 1);
+
+		int month = calendar1.get(Calendar.MONTH);
+		calendar1.set(Calendar.MONTH, month - 1);
+		calendar1.set(Calendar.DAY_OF_MONTH, calendar1.getActualMaximum(Calendar.DAY_OF_MONTH));
+		String str = format.format(calendar.getTime());
+		String str1 = format.format(calendar1.getTime());
+
+		return str + "," + str1;
+	}
+
+	/**
+	 * 获取某年第一天和最后一天日期
+	 * 
+	 * @param year
+	 *            年份
+	 * @return Date
+	 */
+
+	public static String getYearFirst(int year) {
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar calendar = Calendar.getInstance();
+		calendar.clear();
+		calendar.set(Calendar.YEAR, year);
+
+		Calendar calendar1 = Calendar.getInstance();
+		calendar1.clear();
+		calendar1.set(Calendar.YEAR, year);
+		calendar1.roll(Calendar.DAY_OF_YEAR, -1);
+
+		String str = format.format(calendar.getTime());
+		String str1 = format.format(calendar1.getTime());
+
+		return str + "," + str1;
+	}
+
+	/**
+	 * 在指定日期上增加N天
+	 */
+	public static Date addDate(Date date,long day) throws ParseException {
+		 long time = date.getTime(); // 得到指定日期的毫秒数
+		 day = day*24*60*60*1000; // 要加上的天数转换成毫秒数
+		 time+=day; // 相加得到新的毫秒数
+		 return new Date(time); // 将毫秒数转换成日期
+	}
+
+	
+	// 获取一天开始和结束
+	public static String getDay() {
+		Date dBefore = new Date();
+		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
+		String defaultStartDate = sdf.format(dBefore); //格式化前一天
+		defaultStartDate = defaultStartDate+" 00:00:00";
+		String defaultEndDate = defaultStartDate.substring(0,10)+" 23:59:59";
+
+		return defaultStartDate + "," + defaultEndDate;
+	}
+	
+	
+	
+	public static void main(String[] args) throws ParseException {
+        System.out.println(getDay());
+	}
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java
new file mode 100644
index 0000000..9579ee5
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java
@@ -0,0 +1,405 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.service.IGDInterfaceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+//import com.stylefeng.guns.modular.system.model.GDFence;
+//import com.stylefeng.guns.modular.system.service.IGDFenceService;
+
+/**
+ * 电子围栏工具类
+ */
+@Component
+public class GDMapElectricFenceUtil {
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private IGDInterfaceService gdInterfaceService;
+
+    private String key = "e17d799b2506d05faf7f88320a266803";
+
+    private JSONArray jsonArray = new JSONArray();
+
+
+    @Bean
+    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
+//       SimpleClientHttpRequestFactory factory=new SimpleClientHttpRequestFactory();
+//      上一行被注释掉的是Spring自己的实现,下面是依赖了httpclient包后的实现
+        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
+        factory.setConnectTimeout(5000);
+        factory.setReadTimeout(5000);
+        return factory;
+    }
+
+    /**
+     * 创建电子围栏
+     * @param id
+     * @param points
+     * @return
+     */
+    public List<String> createFence(String id, String points){
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 35);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        String format = simpleDateFormat.format(calendar.getTime());
+
+
+        //开始调用高德接口创建围栏
+        String[] s = points.split("_");
+        List<String> resoult = new ArrayList<>();
+        for(int i = 0; i < s.length; i++){
+            String[] split = s[i].split(";");
+            JSONObject json = new JSONObject();
+            json.put("name", "location_" + id);
+            if(split.length == 2){
+                json.put("center", split[0]);
+                json.put("radius", split[1]);
+            }else{
+                json.put("points", s[i]);
+            }
+            json.put("enable", "true");
+            json.put("valid_time", format);
+            json.put("repeat", "Mon,Tues,Wed,Thur,Fri,Sat,Sun");
+            json.put("alert_condition", "enter;leave");
+            json.put("desc", id);
+
+            HttpHeaders headers = new HttpHeaders();
+            MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+            headers.setContentType(type);
+            headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+            HttpEntity<String> formEntity = new HttpEntity<>(json.toString(), headers);
+
+            String url = "https://restapi.amap.com/v4/geofence/meta?key=" + key;
+            String js = restTemplate.postForObject(url, formEntity, String.class);
+            JSONObject jsonObject = JSON.parseObject(js);
+            JSONObject data = jsonObject.getJSONObject("data");
+            String status = data.getString("status");
+
+            gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "创建电子围栏");
+
+            if(status.equals("0")){//创建成功
+                resoult.add(data.getString("gid"));
+            }
+        }
+        return resoult;
+    }
+
+
+
+
+    /**
+     * 创建电子围栏
+     * @param id        围栏名称----绘制的数据id值
+     * @param points    多边形围栏坐标
+     */
+    public List<String> createElectricFenc(String id, String points){
+        List<String> fence = this.createFence(id, points);
+        List<String> gids = new ArrayList<>();
+        for(String f : fence){
+            JSONObject jsonObject = JSON.parseObject(f);
+            JSONObject data = jsonObject.getJSONObject("data");
+            String status = data.getString("status");
+            if(status.equals("0")){
+                gids.add(data.getString("gid"));
+            }
+        }
+        return gids;
+    }
+
+
+    /**
+     * 查询
+     * @param gid
+     * @return
+     */
+    public String findElectricFenc(String gid){
+        String url = "https://restapi.amap.com/v4/geofence/meta?key=" + key + "&gid=" + gid;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        JSONObject data = jsonObject.getJSONObject("data");
+        JSONArray rs_list = data.getJSONArray("rs_list");
+        if(rs_list.size() > 0){
+            return rs_list.getJSONObject(0).getString("gid");
+        }
+        return "";
+    }
+
+
+
+    /**
+     * 查询以创建的所有电子围栏
+     */
+    public String findElectricFenc(String center, String radius, String points){
+        String url = "https://restapi.amap.com/v4/geofence/meta?key=" + key;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        JSONObject data = jsonObject.getJSONObject("data");
+
+        gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏");
+
+        if(ToolUtil.isNotEmpty(center)){//圆形电子围栏
+            JSONArray rs_list = data.getJSONArray("rs_list");
+            for(int i = 0; i < rs_list.size(); i++){
+                String c = rs_list.getJSONObject(i).getString("center");
+                Double r = rs_list.getJSONObject(i).getDouble("radius");
+                if(c.equals(center) && radius.equals(String.valueOf(r))){
+                    return rs_list.getJSONObject(i).getString("gid");
+                }
+            }
+        }else{
+            JSONArray rs_list = data.getJSONArray("rs_list");
+            for(int i = 0; i < rs_list.size(); i++){
+                String p = rs_list.getJSONObject(i).getString("points");
+                if(points.equals(p)){
+                    return rs_list.getJSONObject(i).getString("gid");
+                }
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * 查询所有绘制好的电子围栏
+     * @return
+     */
+    public JSONArray findAllElectricFenc(int page){
+        if(page == 1){
+            jsonArray = new JSONArray();
+        }
+        String url = "https://restapi.amap.com/v4/geofence/meta?key=" + key + "&page_no=" + page + "&page_size=" + 30;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        JSONObject data = jsonObject.getJSONObject("data");
+        JSONArray rs_list = data.getJSONArray("rs_list");
+        jsonArray.addAll(rs_list);
+
+        gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "查询电子围栏");
+
+        //判断是否有分页
+        int total_record = data.getIntValue("total_record");
+        if(total_record > jsonArray.size()){
+            //有分页,递归调用自己
+            page++;
+            this.findAllElectricFenc(page);
+        }
+        return jsonArray;
+    }
+
+
+    /**
+     * 批量更新电子围栏(失效的数据)
+     * @param jsonArray
+     * @throws ParseException
+     */
+    public void updateElectricFenc(JSONArray jsonArray) throws ParseException{
+        //批量更新查询出的失效的电子围栏,围栏失效日期在当前日期之后的数据
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        for(int i = 0; i < jsonArray.size(); i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(new Date());
+            calendar.set(Calendar.HOUR_OF_DAY, 8);
+            calendar.set(Calendar.MINUTE, 0);
+            calendar.set(Calendar.SECOND, 0);
+            calendar.set(Calendar.MILLISECOND, 0);
+            long timeInMillis1 = calendar.getTimeInMillis();
+
+            String valid_time = jsonObject.getString("valid_time");
+            Date parse = sdf.parse(valid_time);
+            Calendar cale = Calendar.getInstance();
+            cale.setTime(parse);
+            cale.set(Calendar.HOUR_OF_DAY, 8);
+            cale.set(Calendar.MINUTE, 0);
+            cale.set(Calendar.SECOND, 0);
+            cale.set(Calendar.MILLISECOND, 0);
+            long timeInMillis = cale.getTimeInMillis();
+            if(timeInMillis1 >= timeInMillis){
+                String gid = jsonObject.getString("gid");
+                String id = jsonObject.getString("name");
+                String center = jsonObject.getString("center");
+                String radius = jsonObject.getString("radius");
+                String points = jsonObject.getString("points");
+                calendar = Calendar.getInstance();
+                calendar.setTime(new Date());
+                calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 35);
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+                String format = simpleDateFormat.format(calendar.getTime());
+                this.updateElectricFenc(gid, id, center, radius, points, format);
+            }
+
+        }
+    }
+
+
+
+    /**
+     * 更新电子围栏
+     * @param gid
+     * @param id
+     * @param center
+     * @param radius
+     * @param points
+     */
+    public void updateElectricFenc(String gid, String id, String center, String radius, String points, String valid_time) throws ParseException {
+        //开始调用高德接口创建围栏
+        JSONObject json = new JSONObject();
+        json.put("name", id);
+        if(ToolUtil.isNotEmpty(center)){
+            json.put("center", center);
+            json.put("radius", radius);
+        }else{
+            json.put("points", points);
+        }
+        json.put("valid_time", valid_time);
+        json.put("repeat", "Mon,Tues,Wed,Thur,Fri,Sat,Sun");
+        json.put("alert_condition", "enter;leave");
+        json.put("desc", id + "围栏更新描述");
+
+        HttpHeaders headers = new HttpHeaders();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        HttpEntity<String> formEntity = new HttpEntity<>(json.toString(), headers);
+
+        String url = "https://restapi.amap.com/v4/geofence/meta?key=" + key + "&gid=" + gid;
+        String s = restTemplate.patchForObject(url, formEntity, String.class);
+        System.out.println(s);
+
+        gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "更新电子围栏");
+    }
+
+
+    /**
+     * 电子围栏监控
+     * @param diu       设备唯一标识符,作为记录依据,不影响判断结果。Android设备一般使用imei号码,iOS一般使用idfv号,其余设备可根据业务自定义。
+     * @param locations 数据为坐标数据和坐标产生的时间戳数据,至少包含一个坐标对和时间戳。
+     *                  1、传入1个点时,直接判断交互关系。
+     *                  2、当传入多个点时,可以通过前后时间判断动态交互关系。
+     *                  格式: x1,y1,unix_ts1;x2,y2,unix_ts2
+     *                  动态交互判断方法:第一个点作为当前时间的点,然后从其余点中选出在当前点之前10s~1小时范围内的最早点,用这两个时间点的位置判断设备与围栏的动态交互关系。若数据无效交互关系默认返回leave。
+     * @return
+     */
+    public List<String> monitorElectricFenc(String diu, String locations){
+        if(ToolUtil.isEmpty(diu)){
+            diu = "B78F99DD-2496-4A43-843B-172CDA2D9798";
+        }
+        locations = locations + "," + (new Date().getTime() / 1000);
+        String url = "https://restapi.amap.com/v4/geofence/status?key=" + key + "&diu=" + diu + "&locations=" + locations;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        List<String> ids = new ArrayList<>();
+        JSONObject data = jsonObject.getJSONObject("data");
+        int status = data.getIntValue("status");
+        if(0 == status){
+            JSONArray fencingEventList = data.getJSONArray("fencing_event_list");
+            for(int i = 0; i < fencingEventList.size(); i++){
+                String clientStatus = fencingEventList.getJSONObject(i).getString("client_status");
+                if(clientStatus.equals("in")){//包含给定坐标的电子围栏
+                    JSONObject fence_info = fencingEventList.getJSONObject(i).getJSONObject("fence_info");//获取电子围栏信息
+                    String gid = fence_info.getString("fence_gid");
+                    ids.add(gid);
+                }
+            }
+        }
+        System.out.println("检测:" + forObject);
+
+        gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/status", "电子围栏监控");
+        return ids;
+    }
+
+
+    /**
+     * 删除电子围栏
+     * @param gid
+     * @return
+     */
+    public boolean deleteElectricFenc(String gid){
+        restTemplate.delete("https://restapi.amap.com/v4/geofence/meta?key={1}&gid={2}", key, gid);
+        System.out.println("删除:" );
+
+        gdInterfaceService.saveData("https://restapi.amap.com/v4/geofence/meta", "删除电子围栏");
+
+        return true;
+    }
+
+
+    /**
+     * 获取两点的距离
+     * @param origins       起点坐标
+     * @param destination   终点坐标
+     * @param type          计算类型:0:直线距离 1:驾车导航距离(仅支持国内坐标)。
+     * @return
+     */
+    public Map<String, String> getDistance(String origins, String destination, Integer type){
+        String url = "https://restapi.amap.com/v3/distance?key=" + key + "&origins=" + origins + "&destination=" + destination +
+                "&type=" + type;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        String status = jsonObject.getString("status");
+
+        gdInterfaceService.saveData("https://restapi.amap.com/v3/distance", "查询两点间的距离");
+
+        if(status.equals("1")){
+            JSONArray results = jsonObject.getJSONArray("results");
+            JSONObject jsonObject1 = results.getJSONObject(0);
+            Map<String, String> map = new HashMap<>();
+            map.put("distance", jsonObject1.getString("distance"));//距离(米)
+            map.put("duration", jsonObject1.getString("duration"));//预计时间(秒)
+            return map;
+        }else{
+            System.err.println(forObject);
+        }
+        return null;
+    }
+
+
+    /**
+     * 获取路径规划
+     * @param origins       起点坐标
+     * @param destination   终点坐标
+     * @param waypoints     途经点
+     * @return
+     */
+    public Map<String, String> getDriving(String origins, String destination, String waypoints){
+        String url = "https://restapi.amap.com/v3/direction/driving?key=" + key + "&origin=" + origins + "&destination=" + destination +
+                "&waypoints=" + waypoints + "&extensions=base&strategy=0";
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        String status = jsonObject.getString("status");
+
+        gdInterfaceService.saveData("https://restapi.amap.com/v3/direction/driving", "获取路径规划");
+
+        if(status.equals("1")){
+            JSONObject route = jsonObject.getJSONObject("route");
+            JSONArray results = route.getJSONArray("paths");
+            JSONObject jsonObject1 = results.getJSONObject(0);
+            Map<String, String> map = new HashMap<>();
+            map.put("distance", jsonObject1.getString("distance"));//距离(米)
+            map.put("duration", jsonObject1.getString("duration"));//预计时间(秒)
+            return map;
+        }
+        return null;
+    }
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java
new file mode 100644
index 0000000..c488e51
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java
@@ -0,0 +1,138 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.service.IGDInterfaceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 高德地图的地理编码工具类
+ */
+@Component
+public class GDMapGeocodingUtil {
+
+    private String key = "e17d799b2506d05faf7f88320a266803";
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private IGDInterfaceService gdInterfaceService;
+
+
+    /**
+     * 将行政区域名称转化为坐标
+     * @param province
+     * @param city
+     * @param county
+     * @param address
+     * @return
+     */
+    public Map<String, Object> geocoding(String province, String city, String county, String address){
+        Map<String, Object> map = new HashMap<>();
+        if(ToolUtil.isEmpty(province)){
+            map.put("status", -1);
+            map.put("data", "省不能为空");
+            return map;
+        }
+        if((ToolUtil.isEmpty(city) && ToolUtil.isNotEmpty(county)) || (ToolUtil.isEmpty(city) && ToolUtil.isNotEmpty(address))){
+            map.put("status", -1);
+            map.put("data", "市不能为空");
+            return map;
+        }
+        if((ToolUtil.isEmpty(county) && ToolUtil.isNotEmpty(address))){
+            map.put("status", -1);
+            map.put("data", "县/区不能为空");
+            return map;
+        }
+
+        String url = "https://restapi.amap.com/v3/geocode/geo?key=" + key + "&output=JSON";
+        url += "&address=" + province + (ToolUtil.isNotEmpty(city) ? city : "") + (ToolUtil.isNotEmpty(county) ? county : "") + (ToolUtil.isNotEmpty(address) ? address : "");
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        String status = jsonObject.getString("status");
+        List<String> list = new ArrayList<>();
+
+        gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/geo", "行政区域转经纬度");
+
+        if(status.equals("1")){
+            JSONArray geocodes = jsonObject.getJSONArray("geocodes");
+            for(int i = 0; i < geocodes.size(); i++){
+                String location = geocodes.getJSONObject(i).getString("location");
+                list.add(location);
+            }
+        }
+        map.put("status", 0);
+        map.put("data", list);
+        return map;
+    }
+
+
+
+    public Map<String, Object> geocoding(String address){
+        Map<String, Object> map = new HashMap<>();
+        String url = "https://restapi.amap.com/v3/geocode/geo?key=" + key + "&output=JSON&address=" + address;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        String status = jsonObject.getString("status");
+        List<String> list = new ArrayList<>();
+
+        gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/geo", "行政区域转经纬度");
+
+        if(status.equals("1")){
+            JSONArray geocodes = jsonObject.getJSONArray("geocodes");
+            for(int i = 0; i < geocodes.size(); i++){
+                String location = geocodes.getJSONObject(i).getString("location");
+                list.add(location);
+            }
+        }
+        map.put("status", 0);
+        map.put("data", list);
+        return map;
+    }
+
+
+
+    /**
+     * 根据经纬度获取行政区域信息
+     * @param lon
+     * @param lan
+     * @return
+     * @throws Exception
+     */
+    public Map<String, String> geocode(String lon, String lan) throws Exception{
+        String url = "https://restapi.amap.com/v3/geocode/regeo?key=" + key + "&location=" + lon + "," + lan;
+        String forObject = restTemplate.getForObject(url, String.class);
+        JSONObject jsonObject = JSON.parseObject(forObject);
+        Map<String, String> map = new HashMap<>();
+
+        gdInterfaceService.saveData("https://restapi.amap.com/v3/geocode/regeo", "经纬度转行政区域");
+
+        if(jsonObject.getString("status").equals("1")){
+            JSONObject regeocode = jsonObject.getJSONObject("regeocode");
+            JSONObject addressComponent = regeocode.getJSONObject("addressComponent");
+            String address = regeocode.getString("formatted_address");
+            map.put("address", address);
+            String code = addressComponent.getString("adcode");
+            String province = addressComponent.getString("province");
+            String city = addressComponent.getString("city");
+            String district = addressComponent.getString("district");
+            map.put("province", province);
+            map.put("provinceCode", code.substring(0, 2) + "0000");
+            map.put("city", city);
+            map.put("cityCode", code.substring(0, 4) + "00");
+            map.put("district", district);
+            map.put("districtCode", code);
+        }
+        return map;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDeMapUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDeMapUtil.java
new file mode 100644
index 0000000..c263393
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDeMapUtil.java
@@ -0,0 +1,85 @@
+package com.stylefeng.guns.modular.system.util;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+public class GaoDeMapUtil {
+
+    public static void main(String[] args) {
+        // 地址名称
+        String address = "深圳市";
+        // 调用自己写好的封装方法
+        JSONObject positionObj = getLngAndLat(address);
+        String longitude = positionObj.getString("longitude");
+        String latitude = positionObj.getString("latitude");
+        System.out.println("经度:" + longitude);
+        System.out.println("纬度:" + latitude);
+
+    }
+
+    /**
+     * 根据地址查询经纬度
+     *
+     * @param address
+     * @return
+     */
+    public static JSONObject getLngAndLat(String address) {
+        JSONObject positionObj = new JSONObject();
+
+        try {
+            // 拼接请求高德的url
+            String url = "http://restapi.amap.com/v3/geocode/geo?address=" + address + "&output=JSON&key=" + "e17d799b2506d05faf7f88320a266803";
+            // 请求高德接口
+            String result = sendHttpGet(url);
+            JSONObject resultJOSN = JSONObject.parseObject(result);
+            System.out.println("高德接口返回原始数据:");
+            System.out.println(resultJOSN);
+            JSONArray geocodesArray = resultJOSN.getJSONArray("geocodes");
+            if (geocodesArray.size() > 0) {
+                String position = geocodesArray.getJSONObject(0).getString("location");
+                String[] lngAndLat = position.split(",");
+                String longitude = lngAndLat[0];
+                String latitude = lngAndLat[1];
+                positionObj.put("longitude", longitude);
+                positionObj.put("latitude", latitude);
+            }
+            geocodesArray.getJSONObject(0).getString("location");
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return positionObj;
+    }
+
+    /**
+     * 发送Get请求
+     *
+     * @param url
+     * @return
+     */
+    public static String sendHttpGet(String url) {
+        HttpGet httpGet = new HttpGet(url);
+        RequestConfig defaultRequestConfig = RequestConfig.custom()
+                .setConnectTimeout(3000)
+                .setSocketTimeout(10000)
+                .build();
+        CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();
+        String result = "";
+        try {
+            CloseableHttpResponse closeableHttpResponse = httpClient.execute(httpGet);
+            HttpEntity entity = closeableHttpResponse.getEntity();
+            result = EntityUtils.toString(entity, "UTF-8");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpRequestUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpRequestUtil.java
new file mode 100644
index 0000000..25245b9
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HttpRequestUtil.java
@@ -0,0 +1,182 @@
+package com.stylefeng.guns.modular.system.util;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.SimpleHttpConnectionManager;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+public class HttpRequestUtil {
+	
+	public static String postRequest(String url, Map<String, String> params) {
+		// 构造HttpClient的实例
+		HttpClient httpClient = new HttpClient();
+		// 创建POST方法的实例
+		PostMethod postMethod = new PostMethod(url);
+		// 设置请求头信息
+		postMethod.setRequestHeader("Connection", "close");
+		postMethod.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
+		// 添加参数
+		for (Map.Entry<String, String> entry : params.entrySet()) {
+			postMethod.addParameter(entry.getKey(), entry.getValue());
+		}
+		// 使用系统提供的默认的恢复策略,设置请求重试处理,用的是默认的重试处理:请求三次
+		httpClient.getParams().setBooleanParameter("http.protocol.expect-continue", false);
+		// 接收处理结果
+		String result = null;
+		try {
+			// 执行Http Post请求
+			httpClient.executeMethod(postMethod);
+			// 返回处理结果
+			result = postMethod.getResponseBodyAsString();
+		} catch (HttpException e) {
+			// 发生致命的异常,可能是协议不对或者返回的内容有问题
+			System.out.println("请检查输入的URL!");
+			e.printStackTrace();
+		} catch (IOException e) {
+			// 发生网络异常
+			System.out.println("发生网络异常!");
+			e.printStackTrace();
+		} finally {
+			// 释放链接
+			postMethod.releaseConnection();
+			// 关闭HttpClient实例
+			if (httpClient != null) {
+				((SimpleHttpConnectionManager) httpClient.getHttpConnectionManager()).shutdown();
+				httpClient = null;
+			}
+		}
+		return result;
+	}
+
+	public static String getRequest(String url, Map<String, String> params) {
+		// 构造HttpClient实例
+		HttpClient client = new HttpClient();
+		// 拼接参数
+		String paramStr = "";
+		for (String key : params.keySet()) {
+			paramStr = paramStr + "&" + key + "=" + params.get(key);
+		}
+		paramStr = paramStr.substring(1);
+		// 创建GET方法的实例
+		GetMethod method = new GetMethod(url + "?" + paramStr);
+		// 接收返回结果
+		String result = null;
+		try {
+			// 执行HTTP GET方法请求
+			client.executeMethod(method);
+			// 返回处理结果
+			result = method.getResponseBodyAsString();
+		} catch (HttpException e) {
+			// 发生致命的异常,可能是协议不对或者返回的内容有问题
+			System.out.println("请检查输入的URL!");
+			e.printStackTrace();
+		} catch (IOException e) {
+			// 发生网络异常
+			System.out.println("发生网络异常!");
+			e.printStackTrace();
+		} finally {
+			// 释放链接
+			method.releaseConnection();
+			// 关闭HttpClient实例
+			if (client != null) {
+				((SimpleHttpConnectionManager) client
+						.getHttpConnectionManager()).shutdown();
+				client = null;
+			}
+		}
+		return result;
+	}
+	
+	
+	/**
+	 * 发送网络请求
+	 * @param url
+	 * @return
+	 */
+	public static String sendNetRequest(String url, Map<String, String> params) {
+		// 构造HttpClient实例
+		HttpClient client = new HttpClient();
+		String paramStr = "";
+		for (String key : params.keySet()) {
+			paramStr = paramStr + "&" + key + "=" + params.get(key);
+		}
+		paramStr = paramStr.substring(1);
+		System.err.println(url + "?" + paramStr);
+		// 创建GET方法的实例
+		GetMethod method = new GetMethod(url + "?" + paramStr);
+		// 接收返回结果
+		String result = null;
+		try {
+			// 执行HTTP GET方法请求
+			client.executeMethod(method);
+			// 返回处理结果
+			result = method.getResponseBodyAsString();
+		} catch (HttpException e) {
+			// 发生致命的异常,可能是协议不对或者返回的内容有问题
+			System.out.println("请检查输入的URL!");
+			e.printStackTrace();
+		} catch (IOException e) {
+			// 发生网络异常
+			System.out.println("发生网络异常!");
+			e.printStackTrace();
+		} finally {
+			// 释放链接
+			method.releaseConnection();
+			// 关闭HttpClient实例
+			if (client != null) {
+				((SimpleHttpConnectionManager) client.getHttpConnectionManager()).shutdown();
+				client = null;
+			}
+		}
+		return result;
+	}
+	
+	
+	
+	/**
+	 * jsonp跨域请求数据响应<br/>
+	 * 方法名:responsejsonpData<br/>
+	 * @author:Mryang<br/>
+	 * @createTime:2016年7月31日-下午11:17:31 <br/>
+	 * @tel: 15198268054<br/>
+	 * @param request
+	 * @param response
+	 * @param map void<br/>
+	 * @exception <br/>
+	 * @since  1.0.0
+	 */
+	public void responsejsonpData(HttpServletRequest request, HttpServletResponse response, Map<String, Object> map) {
+		 response.setCharacterEncoding("UTF-8");
+		 response.setHeader("Content-Type", "text/html;Charset=utf-8");
+		try {
+			PrintWriter writer = response.getWriter();
+		    String params = request.getParameter("callback");
+		    String json = JSONObject.toJSONString(map);
+			writer.print(params+ "("+json+")");
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HuaWeiSMSUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HuaWeiSMSUtil.java
new file mode 100644
index 0000000..daf0a94
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/HuaWeiSMSUtil.java
@@ -0,0 +1,171 @@
+package com.stylefeng.guns.modular.system.util;
+
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.http.HttpHeaders;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.methods.RequestBuilder;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.util.EntityUtils;
+
+import java.nio.charset.Charset;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+//如果JDK版本是1.8,可使用原生Base64类
+
+public class HuaWeiSMSUtil {
+
+    //无需修改,用于格式化鉴权头域,给"X-WSSE"参数赋值
+    private static final String WSSE_HEADER_FORMAT = "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"";
+    //无需修改,用于格式化鉴权头域,给"Authorization"参数赋值
+    private static final String AUTH_HEADER_VALUE = "WSSE realm=\"SDP\",profile=\"UsernameToken\",type=\"Appkey\"";
+
+    public static void main(String[] args) throws Exception{
+
+//        sendSms("[\""+1235+"\"]","17623778642","10690400999303617","d8f8f781b6e04c848f8148f4d6604bcd");
+//        sendSms("[\"17623778642\",\"蓉A-7823\"]","17623778642","8819122535459","6c848255000c4619833ab690e393f906");
+        sendSms("[\"17623778642\",\"蓉A-7823\",\"2019/12/27\",\"14:00\"]","17623778642","8819122535459","bb13d00d11e043659001a89c72d54cab");
+    }
+
+    public static void sendSms(String code,String phone,String sender,String templateId) throws Exception{
+        //必填,请参考"开发准备"获取如下数据,替换为实际值
+        String url = "https://rtcsms.cn-north-1.myhuaweicloud.com:10743/sms/batchSendSms/v1"; //APP接入地址+接口访问URI
+        String appKey = "qnay92s7V0K7719H10m7X4yo3fl3"; //APP_Key
+        String appSecret = "6nSHQzZ3o18JeW6UtS448BbblOa0"; //APP_Secret
+//        String sender = "10690400999303617"; //国内短信签名通道号或国际/港澳台短信通道号
+//        String templateId = "d8f8f781b6e04c848f8148f4d6604bcd"; //模板ID
+
+        //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称
+        //国际/港澳台短信不用关注该参数
+        String signature = "超级过客"; //签名名称
+
+        //必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔
+        String receiver = "+86"+phone; //短信接收人号码
+
+        //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
+        String statusCallBack = "";
+
+        /**
+         * 选填,使用无变量模板时请赋空值 String templateParas = "";
+         * 单变量模板示例:模板内容为"您的验证码是${NUM_6}"时,templateParas可填写为"[\"369751\"]"
+         * 双变量模板示例:模板内容为"您有${NUM_2}件快递请到${TXT_20}领取"时,templateParas可填写为"[\"3\",\"人民公园正门\"]"
+         * ${DATE}${TIME}变量不允许取值为空,${TXT_20}变量可以使用英文空格或点号替代空值,${NUM_6}变量可以使用0替代空值
+         * 查看更多模板和变量规范:产品介绍>模板和变量规范
+         */
+//        String templateParas = "[\""+code+"\"]"; //模板变量
+        String templateParas = code; //模板变量
+
+        //请求Body,不携带签名名称时,signature请填null
+        String body = buildRequestBody(sender, receiver, templateId, templateParas, statusCallBack, signature);
+        if (null == body || body.isEmpty()) {
+            System.out.println("body is null.");
+            return;
+        }
+
+        //请求Headers中的X-WSSE参数值
+        String wsseHeader = buildWsseHeader(appKey, appSecret);
+        if (null == wsseHeader || wsseHeader.isEmpty()) {
+            System.out.println("wsse header is null.");
+            return;
+        }
+
+        //如果JDK版本低于1.8,可使用如下代码
+        //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
+        //CloseableHttpClient client = HttpClients.custom()
+        //        .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+        //            @Override
+        //            public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+        //                return true;
+        //            }
+        //        }).build()).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build();
+
+        //如果JDK版本是1.8,可使用如下代码
+        //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
+        CloseableHttpClient client = HttpClients.custom()
+                .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null,
+                        (x509CertChain, authType) -> true).build())
+                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
+                .build();
+
+        HttpResponse response = client.execute(RequestBuilder.create("POST")//请求方法POST
+                .setUri(url)
+                .addHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded")
+                .addHeader(HttpHeaders.AUTHORIZATION, AUTH_HEADER_VALUE)
+                .addHeader("X-WSSE", wsseHeader)
+                .setEntity(new StringEntity(body)).build());
+
+        System.out.println(response.toString()); //打印响应头域信息
+        System.out.println(EntityUtils.toString(response.getEntity())); //打印响应消息实体
+    }
+
+    /**
+     * 构造请求Body体
+     * @param sender
+     * @param receiver
+     * @param templateId
+     * @param templateParas
+     * @param statusCallbackUrl
+     * @param signature | 签名名称,使用国内短信通用模板时填写
+     * @return
+     */
+    static String buildRequestBody(String sender, String receiver, String templateId, String templateParas,
+                                   String statusCallbackUrl, String signature) {
+        if (null == sender || null == receiver || null == templateId || sender.isEmpty() || receiver.isEmpty()
+                || templateId.isEmpty()) {
+            System.out.println("buildRequestBody(): sender, receiver or templateId is null.");
+            return null;
+        }
+        List<NameValuePair> keyValues = new ArrayList<NameValuePair>();
+
+        keyValues.add(new BasicNameValuePair("from", sender));
+        keyValues.add(new BasicNameValuePair("to", receiver));
+        keyValues.add(new BasicNameValuePair("templateId", templateId));
+        if (null != templateParas && !templateParas.isEmpty()) {
+            keyValues.add(new BasicNameValuePair("templateParas", templateParas));
+        }
+        if (null != statusCallbackUrl && !statusCallbackUrl.isEmpty()) {
+            keyValues.add(new BasicNameValuePair("statusCallback", statusCallbackUrl));
+        }
+        if (null != signature && !signature.isEmpty()) {
+            keyValues.add(new BasicNameValuePair("signature", signature));
+        }
+
+        return URLEncodedUtils.format(keyValues, Charset.forName("UTF-8"));
+    }
+
+    /**
+     * 构造X-WSSE参数值
+     * @param appKey
+     * @param appSecret
+     * @return
+     */
+    static String buildWsseHeader(String appKey, String appSecret) {
+        if (null == appKey || null == appSecret || appKey.isEmpty() || appSecret.isEmpty()) {
+            System.out.println("buildWsseHeader(): appKey or appSecret is null.");
+            return null;
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+        String time = sdf.format(new Date()); //Created
+        String nonce = UUID.randomUUID().toString().replace("-", ""); //Nonce
+
+        byte[] passwordDigest = DigestUtils.sha256(nonce + time + appSecret);
+        String hexDigest = Hex.encodeHexString(passwordDigest);
+
+        //如果JDK版本是1.8,请加载原生Base64类,并使用如下代码
+        String passwordDigestBase64Str = Base64.getEncoder().encodeToString(hexDigest.getBytes()); //PasswordDigest
+        //如果JDK版本低于1.8,请加载三方库提供Base64类,并使用如下代码
+        //String passwordDigestBase64Str = Base64.encodeBase64String(hexDigest.getBytes(Charset.forName("utf-8"))); //PasswordDigest
+        //若passwordDigestBase64Str中包含换行符,请执行如下代码进行修正
+        //passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", "");
+
+        return String.format(WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time);
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JpushUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JpushUtil.java
new file mode 100644
index 0000000..b16af6c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/JpushUtil.java
@@ -0,0 +1,256 @@
+package com.stylefeng.guns.modular.system.util;
+
+import cn.jiguang.common.ClientConfig;
+import cn.jiguang.common.resp.APIConnectionException;
+import cn.jiguang.common.resp.APIRequestException;
+import cn.jpush.api.JPushClient;
+import cn.jpush.api.push.PushResult;
+import cn.jpush.api.push.model.Message;
+import cn.jpush.api.push.model.Options;
+import cn.jpush.api.push.model.Platform;
+import cn.jpush.api.push.model.PushPayload;
+import cn.jpush.api.push.model.audience.Audience;
+import cn.jpush.api.push.model.audience.AudienceTarget;
+import cn.jpush.api.push.model.notification.AndroidNotification;
+import cn.jpush.api.push.model.notification.IosNotification;
+import cn.jpush.api.push.model.notification.Notification;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.util.EntityUtils;
+import sun.misc.BASE64Encoder;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 极光推送
+ * @author suen
+ * 2017年3月23日-上午11:00:57
+ * version 1.0 
+ * jdk 1.8
+ */
+public class JpushUtil {
+
+	/**
+	 * AppKey
+	 */
+	private static String masterSecret = "e4f6f435faefad29db6ba9b2";
+
+	/**
+	 * Master Secret
+	 */
+	private static String appKey = "93204c35ded9ba377a14af19";
+    private static String pushUrl = "https://api.jpush.cn/v3/push";   
+    private static boolean apns_production = true;    
+    private static int time_to_live = 86400;  
+
+	/**
+	 * 推送
+	 */
+	private static JPushClient jpushClient = new JPushClient(masterSecret, appKey);
+
+	public static void main(String[] args) throws APIConnectionException, APIRequestException {
+		Map<String, Object> map=new HashMap<String, Object>();
+		map.put("sound", 1);   //是否有声音  1=否 2=是
+		map.put("vibrate", 1); //是否有震动  1=否 2=是
+		map.put("type", 1);    //消息类型 1=互动  2=公告
+		map.put("id", 1);      //对象ID
+		//SendPushWithCustomForSh("1", "收到通知了11111!", "反馈", JSON.toJSONString(map));
+//		String result = push(pushUrl,"121",JSON.toJSONString(map),appKey,masterSecret,apns_production,time_to_live);
+        SendPushWithCustomForTransmission("1","测试极光自定义消息","自定义消息",map);
+	}
+
+    /**
+     * 系统消息
+     * @param alias
+     * @param alert
+     * @param androidTitle
+     * @param value
+     */
+	 public static void SendPushWithCustomForSh(String alias, String alert, String androidTitle, String value) {
+	    ClientConfig config = ClientConfig.getInstance();
+	    config.setPushHostName("https://api.jpush.cn");
+	    JPushClient jpushClient = new JPushClient(masterSecret, appKey, 3, null, config);
+	    PushPayload payload = PushPayload.newBuilder()
+                 .setPlatform(Platform.android_ios())
+                 .setAudience(Audience.alias(alias))
+                 .setNotification(Notification.newBuilder()
+                         .setAlert(alert)
+                         .addPlatformNotification(AndroidNotification.newBuilder()
+                                 .setTitle(androidTitle)
+                                 .addExtra("action", value)
+                                 .build())
+                         .addPlatformNotification(IosNotification.newBuilder()
+                                 .incrBadge(1)
+                                 .setSound("default").setBadge(+1)
+                                 .addExtra("action", value).build())
+                         .build())
+                 .setOptions(Options.newBuilder().setApnsProduction(false).build())
+                 .build();
+	    try {
+             PushResult result = jpushClient.sendPush(payload);
+             System.out.println(result);
+	    } catch (APIConnectionException e) {
+
+        } catch (APIRequestException e) {
+
+        }
+     }
+     /**
+     * 透传消息
+     * @param alias  别名
+     * @param alert  内容
+     * @param title  标题
+     * @param map    参数
+     */
+	 public static void SendPushWithCustomForTransmission(String alias, String alert, String title, Map<String, Object> map) {
+	    ClientConfig config = ClientConfig.getInstance();
+	    config.setPushHostName("https://api.jpush.cn");
+	    JPushClient jpushClient = new JPushClient(masterSecret, appKey, 3, null, config);
+	    PushPayload payload = PushPayload.newBuilder()
+
+                 .setPlatform(Platform.android_ios())
+
+                 .setAudience(Audience.alias(alias))
+
+                 .setMessage(Message.newBuilder()
+                         .setMsgContent(alert)
+                         .setContentType("text")
+                         .setTitle(title)
+                         .addExtra("sound",String.valueOf(map.get("sound")))
+                         .addExtra("vibrate",String.valueOf(map.get("vibrate")))
+                         .addExtra("type",String.valueOf(map.get("type")))
+                         .addExtra("id",String.valueOf(map.get("id")))
+                         .build())
+
+                 .setOptions(Options.newBuilder().setApnsProduction(false).build())
+                 .build();
+	    try {
+             PushResult result = jpushClient.sendPush(payload);
+             System.out.println(result);
+	    } catch (APIConnectionException e) {
+
+        } catch (APIRequestException e) {
+
+        }
+     }
+	/**
+	 * 内容推送
+	 * @param registrationId 注册用户ID
+	 * @param content 推送内容
+	 * @param extra 附加域
+	 * @return
+	 * @throws APIConnectionException
+	 * @throws APIRequestException
+	 */
+	public static PushResult buildPushObject_ios_audienceMore_messageWithExtras(String registrationId, String content, String extra)
+			throws APIConnectionException, APIRequestException {
+		return jpushClient.sendPush(PushPayload.newBuilder().setPlatform(Platform.android_ios())
+				.setAudience(Audience.newBuilder().addAudienceTarget(AudienceTarget.alias(registrationId)).build())
+				.setMessage(Message.newBuilder().setMsgContent(content).addExtra("from", extra).build())
+				.setOptions(Options.newBuilder().setApnsProduction(false).build())
+				.build());
+
+	}
+	 /**
+     * 组装极光推送专用json串
+     * @param alias
+     * @param alert
+     * @return json
+     */
+    public static JSONObject generateJson(String alias,String alert,boolean apns_production,int time_to_live){
+        JSONObject json = new JSONObject();
+        JSONArray platform = new JSONArray();//平台
+        platform.add("android");
+        platform.add("ios");
+        
+        JSONObject audience = new JSONObject();//推送目标
+        JSONArray alias1 = new JSONArray();
+        alias1.add(alias);
+        audience.put("alias", alias1);
+        
+        JSONObject notification = new JSONObject();//通知内容
+        JSONObject android = new JSONObject();//android通知内容
+        android.put("alert", alert);
+        android.put("builder_id", 1);
+        JSONObject android_extras = new JSONObject();//android额外参数
+        android_extras.put("type", "infomation");
+        android.put("extras", android_extras);
+        
+        JSONObject ios = new JSONObject();//ios通知内容
+        ios.put("alert", alert);
+        ios.put("sound", "default");
+        ios.put("badge", "+1");
+        JSONObject ios_extras = new JSONObject();//ios额外参数
+        ios_extras.put("type", "infomation");
+        ios.put("extras", ios_extras);
+        notification.put("android", android);
+        notification.put("ios", ios);
+        
+        JSONObject options = new JSONObject();//设置参数
+        options.put("time_to_live", Integer.valueOf(time_to_live));
+        options.put("apns_production", apns_production);
+        
+        json.put("platform", platform);
+        json.put("audience", audience);
+        json.put("notification", notification);
+        json.put("options", options);
+        return json;
+        
+    }
+    
+    /**
+     * 推送方法-调用极光API
+     * @param reqUrl
+     * @param alias
+     * @param alert
+     * @return result
+     */
+    public static String push(String reqUrl,String alias,String alert,String appKey,String masterSecret,boolean apns_production,int time_to_live){
+        String base64_auth_string = encryptBASE64(appKey + ":" + masterSecret);
+        String authorization = "Basic " + base64_auth_string;
+        return sendPostRequest(reqUrl,generateJson(alias,alert,apns_production,time_to_live).toString(),"UTF-8",authorization);
+    }
+    
+    /**
+     * 发送Post请求(json格式)
+     * @param reqURL
+     * @param data
+     * @param encodeCharset
+     * @param authorization
+     * @return result
+     */
+    @SuppressWarnings({ "resource" })
+    public static String sendPostRequest(String reqURL, String data, String encodeCharset,String authorization){
+        HttpPost httpPost = new HttpPost(reqURL);
+        HttpClient client = new DefaultHttpClient();
+        HttpResponse response = null;
+        String result = "";
+        try {
+             StringEntity entity = new StringEntity(data, encodeCharset);
+             entity.setContentType("application/json");
+             httpPost.setEntity(entity);
+             httpPost.setHeader("Authorization",authorization.trim());
+             response = client.execute(httpPost);
+             result = EntityUtils.toString(response.getEntity(), encodeCharset);
+        } catch (Exception e) {
+        }finally{
+            client.getConnectionManager().shutdown();
+        }
+        return result;
+    }
+     /** 
+    * BASE64加密工具
+    */
+     public static String encryptBASE64(String str) {
+         byte[] key = str.getBytes();
+       BASE64Encoder base64Encoder = new BASE64Encoder();
+       String strs = base64Encoder.encodeBuffer(key);
+         return strs;
+     }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OrderUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OrderUtil.java
new file mode 100644
index 0000000..c49e50c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OrderUtil.java
@@ -0,0 +1,57 @@
+package com.stylefeng.guns.modular.system.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 订单处理工具类
+ * @author taonb
+ * @createDate 2016年5月27日
+ * @version 1.0
+ */
+public class OrderUtil {
+	
+	/* 订单号 */
+	private static long orderNum = 0l;
+	
+	/* 日期 */
+	private static String date;
+	
+	/**
+	 * 生成不重复的订单号 【纯数字】
+	 * @return
+	 */
+	public static synchronized String getOrderNo() {
+		String str = new SimpleDateFormat("yyMMddHHmmss").format(new Date());
+		if (date == null || !date.equals(str)) {
+			date = str;
+			orderNum = 0l;
+		}
+		orderNum++;
+		long orderNo = Long.parseLong((date)) * 1000000;
+		orderNo += orderNum;
+		return orderNo + "";
+	}
+	
+	/**
+	 * 生成不重复的订单号 【含前缀】
+	 * @param prefix
+	 * @return
+	 */
+	public static synchronized String getOrderNoForPrefix(String prefix) {
+		return prefix + getOrderNo();
+	}
+	
+	/**
+	 * 生成不重复的订单号 【含后缀】
+	 * @param suffix
+	 * @return
+	 */
+	public static synchronized String getOrderNoForSuffix(String suffix) {
+		return getOrderNo() + suffix;
+	}
+	
+	public static void main(String[] args) {
+		System.out.println(getOrderNo());
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java
new file mode 100644
index 0000000..90dbe31
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java
@@ -0,0 +1,39 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.aliyun.oss.OSSClient;
+import com.aliyun.oss.model.ObjectMetadata;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+
+public class OssUploadUtil {
+	//OSS图片访问域名
+	public static String oss_domain = "https://newok.oss-cn-shenzhen.aliyuncs.com/";
+	public static String accessKeyId = "LTAI4G9Zez9H4B36vakPXGy4";
+	public static String accessKeySecret = "BOVPUeZndKVbrPOq6Ef5j6oiydB3XZ";
+	public static String bucketName="newok";
+	public static String endpoint = "oss-cn-shenzhen.aliyuncs.com";
+	
+	public static OSSClient ossClient = new OSSClient(endpoint, accessKeyId,accessKeySecret);
+	
+	public static String ossUpload(HttpServletRequest request, MultipartFile file) throws IOException{
+		//CommonsMultipartFile file = (CommonsMultipartFile)multipartFile;
+		String fileName = "";
+			if(file!=null && !"".equals(file.getOriginalFilename()) && file.getOriginalFilename()!=null){
+				InputStream content = file.getInputStream();//获得指定文件的输入流
+				ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata
+				meta.setContentLength(file.getSize());  // 必须设置ContentLength
+				String originalFilename = file.getOriginalFilename();
+				fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
+				ossClient.putObject(bucketName,"img/"+fileName,content,meta);// 上传Object.
+				if(fileName != null && !"".equals(fileName)){
+					System.out.println(fileName);
+					fileName = oss_domain+"img/"+fileName;
+				}
+			}
+		return fileName;
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java
new file mode 100644
index 0000000..8ba6338
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushMinistryOfTransportUtil.java
@@ -0,0 +1,609 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.modular.system.dao.CarInsuranceMapper;
+import com.stylefeng.guns.modular.system.dao.DriverPunishMapper;
+import com.stylefeng.guns.modular.system.dao.DriverTrainMapper;
+import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * 上传安全平台数据
+ */
+@Component
+public class PushMinistryOfTransportUtil {
+
+    @Autowired
+    private ITCarService carService;
+
+    @Autowired
+    private ITDriverService driverService;
+
+    @Autowired
+    private ITCompanyService companyService;
+
+    @Autowired
+    private ITSystemPriceService systemPriceService;
+
+    @Autowired
+    private ITCarModelService carModelService;
+
+    @Autowired
+    private ITCarBrandService carBrandService;
+
+    @Autowired
+    private ITCarServiceService carServiceService;
+
+    @Autowired
+    private ITVersionManagementService versionManagementService;
+
+    @Autowired
+    private ITOrderPrivateCarService orderPrivateCarService;
+
+    @Autowired
+    private ITComplaintService complaintService;
+
+    @Resource
+    private OrderCancelMapper orderCancelMapper;
+
+    @Autowired
+    private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+    @Resource
+    private CarInsuranceMapper carInsuranceMapper;
+
+    @Resource
+    private DriverTrainMapper driverTrainMapper;
+
+    @Resource
+    private DriverPunishMapper driverPunishMapper;
+
+
+    /**
+     * 上传企业基础信息
+     */
+    public void baseInfoCompany(Integer id){
+        TCompany tCompany = companyService.selectById(id);
+        String fileName = System.currentTimeMillis() + ".jpg";
+        //上传图片文件
+        Map<String, String> file = new HashMap<>();
+        file.put("path", "/tmp");
+        file.put("fileName", fileName);
+        file.put("url", tCompany.getLegalPhotoUrl());
+        file.put("newFilePath", "/swapfiles");
+        String result_ = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_ftp + "/uploadAndMoveFile", file);
+        System.out.println("上传图片文件:" + result_);
+
+        //上传数据
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("CompanyName", tCompany.getName());//公司名称
+        jsonObject.put("Identifier", tCompany.getIdentifier());//统一社会信用代码
+        jsonObject.put("Address", Integer.valueOf(tCompany.getAddressCode()));//注册地行政区划代码
+        jsonObject.put("BusinessScope", tCompany.getBusinessScope());//经营范围
+        jsonObject.put("ContactAddress", tCompany.getContactAddress());//通信地址
+        jsonObject.put("EconomicType", tCompany.getEconomicType());//经营业户经济类型
+        jsonObject.put("RegCapital", tCompany.getRegCapital());//注册资本
+        jsonObject.put("LegalName", tCompany.getLegalName());//法人代表姓名
+        jsonObject.put("LegalID", tCompany.getLegalId());//法人代表身份证号
+        jsonObject.put("LegalPhone", tCompany.getLegalPhone());//法人代表电话
+        jsonObject.put("LegalPhoto", fileName);//法人代表身份证扫描件文件编号(.jpg)
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoCompany", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoCompany", map);
+        System.out.println("上传企业基础信息:" + result);
+    }
+
+
+
+
+    /**
+     * 上传网约车平台公司营运规模信息
+     */
+    public void baseInfoCompanyStat(){
+        int state = carService.selectCount(new EntityWrapper<TCar>().eq("state", 1));
+        int i = driverService.selectCount(new EntityWrapper<TDriver>().eq("authState", 2).ne("flag", 3));
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("VehicleNum", state);
+        jsonObject.put("DriverNum", i);
+        jsonObject.put("Flag", 1);
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoCompanyStat", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoCompanyStat", map);
+        System.out.println("上传网约车平台公司营运规模信息:" + result);
+
+    }
+
+
+    /**
+     * 上传网约车平台公司支付信息
+     */
+    public void baseInfoCompanyPay(){
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("PayName", "支付宝(中国)网络技术有限公司");//银行或者非银行支付机构名称
+        jsonObject.put("PayId", "2000133000019");//非银行支付机构支付业务许可证编号
+        jsonObject.put("PayType", "1");//支付业务类型
+        jsonObject.put("PayScope", "全国");//业务覆盖范围
+        jsonObject.put("PrepareBank", "中国工商银行");//备付金存管银行
+        jsonObject.put("CountDate", 15);//结算周期
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoCompanyPay", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoCompanyPay", map);
+        System.out.println("上传网约车平台公司支付信息:" + result);
+    }
+
+
+    /**
+     * 网约车平台公司服务机构
+     */
+    public void baseInfoCompanyService(){
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", 450204);//行政区划代码
+        jsonObject.put("ServiceName", "广西云森科技有限公司");//服务机构名称
+        jsonObject.put("ServiceNo", "45020401");//服务机构代码
+        jsonObject.put("DetailAddress", "柳州市柳邕路新翔小区二区6栋11号");//服务机构地址
+        jsonObject.put("ResponsibleName", "翁克顺");//服务机构负责人姓名
+        jsonObject.put("ResponsiblePhone", "13907728585");//负责人联系电话
+        jsonObject.put("ManagerName", "吴志武");//服务机构管理人姓名
+        jsonObject.put("ManagerPhone", "15907720083");//管理人联系电话
+        jsonObject.put("ContactPhone", "0772-3633333");//服务机构紧急联系电话
+        jsonObject.put("MailAddress", "柳州市城中区滨江西路15栋2号OK充电站");//行政文书送达邮寄地址
+        jsonObject.put("CreateDate", "2015年09月18日");//服务机构设立日期
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoCompanyService", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoCompanyService", map);
+        System.out.println("网约车平台公司服务机构:" + result);
+    }
+
+
+    /**
+     * 网约车平台公司经营许可
+     * @param id
+     */
+    public void baseInfoCompanyPermit(Integer id){
+        TCompany tCompany = companyService.selectById(id);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", tCompany.getAddressCode());//许可地行政区划代码
+        jsonObject.put("Certificate", tCompany.getLicenseNumber());//网络预约出租车经营许可证号
+        jsonObject.put("OperationArea", "广西壮族自治区柳州市城区");//经营区域
+        jsonObject.put("OwnerName", tCompany.getName());//公司名称
+        jsonObject.put("Organization", tCompany.getLicensingAgency());//发证机构名称
+        jsonObject.put("StartDate", tCompany.getLicenseStartTime());//有效期起YYYYMMDD
+        jsonObject.put("StopDate", tCompany.getLicenseEndTime());//有效期止YYYYMMDD
+        jsonObject.put("CertifyDate", tCompany.getLicenseTime());//初次发证日期YYYYMMDD
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoCompanyPermit", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoCompanyPermit", map);
+        System.out.println("网约车平台公司经营许可:" + result);
+    }
+
+
+
+    /**
+     * 网约车平台公司运价信息
+     */
+    public void baseInfoCompanyFare(Integer id){
+        TSystemPrice tSystemPrice = systemPriceService.selectById(id);
+        String content = tSystemPrice.getContent();
+        JSONObject price = JSON.parseObject(content);
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", 450204);//运价适用地行政区划代码
+        jsonObject.put("FareType", id);//运价类型编码(由网约车平台公司统一编码,应确保唯一性)
+        jsonObject.put("FareTypeNote", tSystemPrice.getFareTypeNote());//运价类型说明
+        jsonObject.put("FareValidOn", new Date());//运价有效期起YYYYMMDDhhmmss
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) +1);
+        jsonObject.put("FareValidOff", calendar.getTime());//运价有效止YYYYMMDDhhmmss
+        jsonObject.put("StartFare", Double.valueOf(price.get("num1").toString()));//起步价(元)
+        jsonObject.put("StartMile", Double.valueOf(price.get("num2").toString()));//起步里程(km)
+        jsonObject.put("UnitPricePerMile", Double.valueOf(price.get("num4").toString()));//计程单价(按公里/元)
+        jsonObject.put("UnitPricePerMinute", Double.valueOf(price.get("num5").toString()));//计时单价(按分钟/元)
+        jsonObject.put("UpPrice", Double.valueOf(price.get("num10").toString()));//单程加价单价(元)
+        jsonObject.put("UpPriceStartMile", Double.valueOf(price.get("num8").toString()));//单程加价公里(km)
+        String[] num23s = price.get("num23").toString().split(" - ");
+        jsonObject.put("MorningPeakTimeOn", num23s[0]);//营运早高峰时间起(HHmm 24小时)
+        jsonObject.put("MorningPeakTimeOff", num23s[1]);//营运早高峰时间止(HHmm 24小时)
+        String[] num24s = price.get("num24").toString().split(" - ");
+        jsonObject.put("EveningPeakTimeOn", num24s[0]);//营运晚高峰时间起(HHmm 24小时)
+        jsonObject.put("EveningPeakTimeOff", num24s[1]);//营运晚高峰时间止(HHmm 24小时)
+        jsonObject.put("OtherPeakTimeOn", "");//其他营运高峰时间起(HHmm 24小时)
+        jsonObject.put("OtherPeakTineOff", "");//其他营运高峰时间止(HHmm 24小时)
+        jsonObject.put("PeakUnitPrice", Double.valueOf(price.get("num28").toString()));//高峰时间单程加价单价(元)
+        jsonObject.put("PeakPriceStartMile", Double.valueOf(price.get("num8").toString()));//高峰时间单程加价公里(km)
+        jsonObject.put("LowSpeedPriceMinute", 0);//低速计时加价(按分钟 元)
+        jsonObject.put("NightPricePerMile", Double.valueOf(price.get("num18").toString()));//夜间费(按公里 元)
+        jsonObject.put("NightPricePerMinute", Double.valueOf(price.get("num19").toString()));//夜间费(按分钟 元)
+        jsonObject.put("OtherPrice", 0);//其它加价金额(元)
+
+        jsonObject.put("State", tSystemPrice.getState() != 1 ? 1 : 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoCompanyFare", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoCompanyFare", map);
+        System.out.println("网约车平台公司运价信息:" + result);
+    }
+
+
+    /**
+     * 车辆基本信息
+     * @param id
+     */
+    public void baseInfoVehicle(Integer id){
+        TCar tCar = carService.selectById(id);
+        TCarModel tCarModel = carModelService.selectById(tCar.getCarModelId());
+        TCarBrand tCarBrand = carBrandService.selectById(tCar.getCarBrandId());
+        TCarService tCarService = carServiceService.selectOne(new EntityWrapper<TCarService>().eq("carId", id).eq("type", 1));
+        TSystemPrice tSystemPrice = systemPriceService.selectOne(new EntityWrapper<TSystemPrice>()
+                .eq("type", 1)
+                .eq("serverCarModelId", tCarService.getServerCarModelId())
+                .eq("companyId", (tCar.getFranchiseeId() == null || tCar.getFranchiseeId() == 0) ? tCar.getCompanyId() : tCar.getFranchiseeId()).eq("state", 1));
+
+        String fileName = System.currentTimeMillis() + ".jpg";
+        //上传图片文件
+        Map<String, String> file = new HashMap<>();
+        file.put("path", "/tmp");
+        file.put("fileName", fileName);
+        file.put("url", tCar.getCarPhoto());
+        file.put("newFilePath", "/swapfiles");
+        String result_ = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_ftp + "/uploadAndMoveFile", file);
+        System.out.println("上传图片文件:" + result_);
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", 450204);//车辆所在城市行政区划代码
+        jsonObject.put("VehicleNo", tCar.getCarLicensePlate());//车辆号牌
+        jsonObject.put("PlateColor", tCar.getPlateColor());//车牌颜色
+        jsonObject.put("Seats", tCarModel.getSeat());//核定载客位
+        jsonObject.put("Brand", tCarBrand.getName());//车辆厂牌
+        jsonObject.put("Model", tCarModel.getName());//车辆型号
+        jsonObject.put("VehicleType", tCar.getVehicleType());//车辆类型(以机动车行驶证为准)
+        jsonObject.put("OwnerName", tCar.getOwnerName());//车辆所有人(以机动车行驶证为准)
+        jsonObject.put("VehicleColor", tCar.getCarColor());//车身颜色
+        jsonObject.put("EngineId", tCar.getEngineId());//发动机号(以机动车行驶证为准)
+        jsonObject.put("VIN", tCar.getVIN());//车辆VIN码(以机动车行驶证为准)
+        jsonObject.put("CertifyDateA", tCar.getCertifyDateA());//车辆注册日期(以机动车行驶证为准)YYYY-MM-DD
+        jsonObject.put("FuelType", tCar.getFuelType());//车辆燃料类型
+        jsonObject.put("EngineDisplace", tCar.getEngineDisplace());//发送机排量(毫升)
+        jsonObject.put("PhotoId", fileName);//车辆照片文件编号
+        jsonObject.put("Certificate", tCar.getCertificate());//运输证字号
+        jsonObject.put("TransAgency", tCar.getTransAgency());//车辆运输证发证机构
+        jsonObject.put("TransArea", tCar.getTransArea());//车辆经营区域
+        jsonObject.put("TransDateStart", tCar.getTransDateStart());//车辆运输证有效期起YYYYMMDD
+        jsonObject.put("TransDateStop", tCar.getTransDateStop());//车辆运输证有效期止YYYYMMDD
+        jsonObject.put("CertifyDateB", tCar.getCertifyDateB());//车辆初次登记日期YYYY-MM-DD
+        jsonObject.put("FixState", tCar.getFixState());//车辆维修状态(0:未检修,1:已检修,2:未知)
+        jsonObject.put("NextFixDate", tCar.getNextFixDate());//车辆下次年检时间YYYY-MM-DD
+        jsonObject.put("CheckState", tCar.getCheckState());//车辆年度审验状态
+        jsonObject.put("FeePrintId", tCar.getFeePrintId());//发票打印设备序列号
+        jsonObject.put("GPSBrand", tCar.getGPSBrand());//卫星定位装置品牌
+        jsonObject.put("GPSModel", tCar.getGPSModel());//卫星定位装置型号
+        jsonObject.put("GPSIMEI", tCar.getGPSIMEI());//卫星定位装置IMEI号
+        jsonObject.put("GPSInstallDate", tCar.getGPSInstallDate());//卫星定位设备安装日期YYYYMMDD
+        jsonObject.put("RegisterDate", tCar.getRegisterDate());//报备日期(车辆信息向服务所在地出租车行政主管部门报备日期YYYYMMDD)
+        jsonObject.put("CommercialType", Integer.valueOf(tCar.getCommercialType()));//服务类型(1:网络预约出租车,2:巡游出租汽车,3:私人小客车合乘)
+        jsonObject.put("FareType", null == tSystemPrice ? "" : tSystemPrice.getId());//运价类型编码(与运价信息中一一对应)
+        jsonObject.put("State", tCar.getState() == 1 ? 0 : 1);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());//YYYYMMDDhhmmss
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoVehicle", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoVehicle", map);
+        System.out.println("车辆基本信息:" + result);
+    }
+
+
+    /**
+     * 车辆保险信息
+     */
+    public void baseInfoVehicleInsurance(Integer id, Integer flag){
+        CarInsurance carInsurance = carInsuranceMapper.selectById(id);
+        TCar tCar = carService.selectById(carInsurance.getCarId());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("VehicleNo", tCar.getCarLicensePlate());//车辆号牌
+        jsonObject.put("InsurCom", carInsurance.getInsurCom());//保险公司名称
+        jsonObject.put("InsurNum", carInsurance.getInsurNum());//保险号
+        jsonObject.put("InsurType", carInsurance.getInsurType());//保险类型
+        jsonObject.put("InsurCount", carInsurance.getInsurCount());//保险金额(元)
+        jsonObject.put("InsurEff", carInsurance.getInsurEff());//保险生效时间YYYYMMDD
+        jsonObject.put("InsurExp", carInsurance.getInsurExp());//保险到期时间YYYYMMDD
+        jsonObject.put("Flag", flag);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoVehicleInsurance", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoVehicleInsurance", map);
+        System.out.println("车辆保险信息:" + result);
+    }
+
+
+    /**
+     * 驾驶员基本信息
+     * @param driverId
+     */
+    public void baseInfoDriver(Integer driverId){
+        TDriver tDriver = driverService.selectById(driverId);
+
+        //上传图片文件
+        String fileName = System.currentTimeMillis() + ".jpg";
+        Map<String, String> file = new HashMap<>();
+        file.put("path", "/tmp");
+        file.put("fileName", fileName);
+        file.put("url", tDriver.getHeadImgUrl());
+        file.put("newFilePath", "/swapfiles");
+        String result_ = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_ftp + "/uploadAndMoveFile", file);
+        System.out.println("上传图片文件:" + result_);
+
+        String fileName1 = System.currentTimeMillis() + ".jpg";
+        Map<String, String> file1 = new HashMap<>();
+        file1.put("path", "/tmp");
+        file1.put("fileName", fileName1);
+        file1.put("url", tDriver.getDriveCardImgUrl());
+        file1.put("newFilePath", "/swapfiles");
+        String result1_ = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_ftp + "/uploadAndMoveFile", file1);
+        System.out.println("上传图片文件:" + result1_);
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", 450204);//注册地行政区划代码
+        jsonObject.put("DriverName", tDriver.getName());//机动车驾驶员姓名
+        jsonObject.put("DriverPhone", tDriver.getPhone());//驾驶员手机号
+        jsonObject.put("DriverGender", (tDriver.getSex() == 1 ? "男" : "女"));//驾驶员性别
+        jsonObject.put("DriverBirthday", tDriver.getBirthday());//出生日期YYYYMMDD
+        jsonObject.put("DriverNationality", tDriver.getDriverNationality());//国籍
+        jsonObject.put("DriverNation", tDriver.getDriverNation());//驾驶员民族
+        jsonObject.put("DriverMaritalStatus", (tDriver.getDriverMaritalStatus() == 1 ? "未婚" : tDriver.getDriverMaritalStatus() == 2 ? "已婚" : "离异"));//驾驶员婚姻状况(未婚,已婚,离异)
+        jsonObject.put("DriverLanguageLevel", tDriver.getDriverLanguageLevel());//驾驶员外语能力
+        jsonObject.put("DriverEducation", tDriver.getDriverEducation());//驾驶员学历
+        jsonObject.put("DriverCensus", tDriver.getDriverCensus());//户口登记机关名称
+        jsonObject.put("DriverAddress", tDriver.getDriverAddress());//户口住址或长住地址
+        jsonObject.put("DriverContactAddress", tDriver.getDriverContactAddress());//驾驶员通信地址
+        jsonObject.put("PhotoId", fileName);//驾驶员照片文件编号
+        jsonObject.put("LicenseId", tDriver.getDriveCard());//机动车驾驶证号
+        jsonObject.put("LicensePhotoId", fileName1);//机动车驾驶证扫描件文件编号
+        jsonObject.put("DriverType", tDriver.getDriverType());//准驾车型
+        jsonObject.put("GetDriverLicenseDate", tDriver.getGetDriverLicenseDate());//初次领取驾驶证日期YYYYMMDD
+        jsonObject.put("DriverLicenseOn", tDriver.getDriverLicenseOn());//驾驶证有效期限起YYYYMMDD
+        jsonObject.put("DriverLicenseOff", tDriver.getDriverLicenseOff());//驾驶证有效期限止YYYYMMDD
+        jsonObject.put("TaxiDriver", tDriver.getTaxiDriver() == 0 ? 2 : 1);//是否巡游出租汽车驾驶员(1:是,2:否)
+        jsonObject.put("CertificateNo", tDriver.getTaxiAptitudeCard());//网络预约出租汽车驾驶员资格证号
+        jsonObject.put("NetworkCarIssueOrganization", tDriver.getNetworkCarlssueOrganization());//网络预约出租汽车驾驶员证发证机构
+        jsonObject.put("NetworkCarIssueDate", tDriver.getNetworkCarlssueDate());//资格证发证日期YYYYMMDD
+        jsonObject.put("GetNetworkCarProofDate", tDriver.getGetNetworkCarProofDate());//初次领取资格证日期YYYYMMDD
+        jsonObject.put("NetworkCarProofOn", tDriver.getNetworkCarProofOn());//资格证有效起始日期YYYYMMDD
+        jsonObject.put("NetworkCarProofOff", tDriver.getNetworkCarProofOff());//资格证有截止日期YYYYMMDD
+        jsonObject.put("RegisterDate", tDriver.getRegisterDate());//报备日期(驾驶员信息向服务所在地出租车行政主管部门报备日期)
+        jsonObject.put("FullTimeDriver", tDriver.getFullTimeDriver());//是否专职驾驶员(1:是,0:否)
+        jsonObject.put("InDriverBlacklist", tDriver.getInDriverBlacklist());//是否在驾驶员黑名单内(1:是,0:否)
+        jsonObject.put("CommercialType", tDriver.getCommercialType());//服务类型(1:网络预约出租汽车,2:巡游出租汽车,3:私人小客车合乘)
+        jsonObject.put("ContractCompany", tDriver.getContractCompany());//驾驶员合同签署公司
+        jsonObject.put("ContractOn", tDriver.getContractOn());//合同有效期起YYYYMMDD
+        jsonObject.put("ContractOff", tDriver.getContractOff());//合同有效期止YYYYMMDD
+        jsonObject.put("EmergencyContact", tDriver.getEmergencyContact());//紧急情况联系人
+        jsonObject.put("EmergencyContactPhone", tDriver.getEmergencyContactPhone());//紧急情况联系人电话
+        jsonObject.put("EmergencyContactAddress", tDriver.getEmergencyContactAddress());//紧急情况联系人通信地址
+
+        jsonObject.put("State", tDriver.getAuthState() == 2 ? 0 : 1);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", tDriver.getFlag());//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoDriver", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoDriver", map);
+        System.out.println("驾驶员基本信息:" + result);
+    }
+
+
+    /**
+     * 网约车驾驶员培训信息
+     * @param id
+     * @param id
+     */
+    public void baseInfoDriverEducate(Integer id, Integer flag){
+        DriverTrain driverTrain = driverTrainMapper.selectById(id);
+        TDriver driver = driverService.selectById(driverTrain.getDriverId());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", 450204);//注册地行政区划代码
+        jsonObject.put("LicenseId", driver.getDriveCard());//机动车驾驶证号
+        jsonObject.put("CourseName", driverTrain.getCourseName());//驾驶员培训课程名称
+        jsonObject.put("CourseDate", driverTrain.getCourseDate());//培训课程日期YYYYMMDD
+        jsonObject.put("StartTime", driverTrain.getStartTime());//培训开始时间
+        jsonObject.put("StopTime", driverTrain.getStopTime());//培训结束时间
+        jsonObject.put("Duration", driverTrain.getDuration());//培训时长
+        jsonObject.put("Flag", flag);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoDriverEducate", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoDriverEducate", map);
+        System.out.println("网约车驾驶员培训信息:" + result);
+    }
+
+
+    /**
+     * 驾驶员移动终端信息
+     * @param driverId
+     */
+    public void baseInfoDriverApp(Integer driverId){
+        TDriver tDriver = driverService.selectById(driverId);
+        TVersionManagement type = versionManagementService.selectOne(new EntityWrapper<TVersionManagement>().eq("type", 2).orderBy("insertTime desc limit 0, 1"));
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", 450204);//注册地行政区划代码
+        jsonObject.put("LicenseId", tDriver.getDriveCard());//机动车驾驶证号
+        jsonObject.put("DriverPhone", tDriver.getPhone());//驾驶员手机号
+        jsonObject.put("NetType", phoneExp(tDriver.getPhone()));//手机运营商(1:中国联通,2:中国移动,3:中国电信,4:其他)
+        jsonObject.put("AppVersion", type.getVersion());//使用APP版本号
+        jsonObject.put("MapType", 2);//使用地图类型(1:百度地图,2:高德地图,3:其他)
+        jsonObject.put("State", 0);//状态(0:有效,1:失效)
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoDriverApp", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoDriverApp", map);
+        System.out.println("驾驶员移动终端信息:" + result);
+    }
+
+
+    /**
+     * 驾驶员统计信息
+     * @param driverId
+     */
+    public void baseInfoDriverStat(Integer driverId){
+        TDriver tDriver = driverService.selectById(driverId);
+        Calendar s = Calendar.getInstance();
+        s.setTime(new Date());
+        s.set(s.get(Calendar.YEAR), s.get(Calendar.MONTH) - 1, 1, 0, 0, 0);
+
+        Calendar e = Calendar.getInstance();
+        e.setTime(new Date());
+        e.set(e.get(Calendar.YEAR), e.get(Calendar.MONTH) - 1, e.getActualMaximum(Calendar.DAY_OF_MONTH), 23, 59, 59);
+
+        int i = orderPrivateCarService.selectCount(
+                new EntityWrapper<TOrderPrivateCar>()
+                        .eq("driverId", driverId)
+                        .in("state", Arrays.asList(6, 7, 8, 9))
+                        .between("travelTime", s.getTime(), e.getTime())
+        );
+        int i1 = complaintService.selectCount(
+                new EntityWrapper<TComplaint>()
+                        .eq("driverId", driverId)
+                        .between("insert_time", s.getTime(), e.getTime())
+        );
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", 450204);//注册地行政区划代码
+        jsonObject.put("LicenseId", tDriver.getDriveCard());//机动车驾驶证号
+        jsonObject.put("Cycle", s.getTime());//统计周期(统计周期按月,内容填写统计月份YYYYMM)
+        jsonObject.put("OrderCount", i);//完成订单次数
+        jsonObject.put("TrafficViolationCount", 0);//交通违章次数
+        jsonObject.put("ComplainedCount", i1);//被投诉次数
+        jsonObject.put("Flag", 1);//操作标识(1:新增,2:更新,3:删除)
+        jsonObject.put("UpdateTime", new Date());
+        Map<String, String> map = new HashMap<>();
+        map.put("baseInfoDriverStat", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/baseInfoDriverStat", map);
+        System.out.println("驾驶员统计信息:" + result);
+    }
+
+
+    /**
+     * 订单撤销接口
+     * @param orderId
+     */
+    public void orderCancel(Integer orderId){
+        TOrderPrivateCar tOrderPrivateCar = orderPrivateCarService.selectById(orderId);
+        TDriver driver = driverService.selectById(tOrderPrivateCar.getDriverId());
+        OrderCancel query = orderCancelMapper.query(orderId, 1, null, null, 2);
+        Map<String, String> geocode = null;
+        try {
+            geocode = gdMapGeocodingUtil.geocode(tOrderPrivateCar.getBoardingLon().toString(),
+                    tOrderPrivateCar.getBoardingLat().toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("Address", Integer.valueOf(geocode.get("districtCode")));//上车地点行政区划代码
+        jsonObject.put("OrderId", tOrderPrivateCar.getOrderNum());//订单编号
+        jsonObject.put("OrderTime", tOrderPrivateCar.getOrderNum());//订单时间YYYYMMDDhhmmss
+        jsonObject.put("CancelTime", query.getInsertTime());//订单撤销时间YYYYMMDDhhmmss
+        jsonObject.put("Operator", "3");//撤销发起方(1:乘客,2:驾驶员,3:平台公司)
+        jsonObject.put("CancelTypeCode", null != driver ? driver.getDriveCard() : "");//机动车驾驶证编号
+        jsonObject.put("CancelReason", query.getReason());//撤销或违约原因
+        Map<String, String> map = new HashMap<>();
+        map.put("orderCancel", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/orderCancel", map);
+        System.out.println("订单撤销接口:" + result);
+    }
+
+
+    /**
+     * 乘客投诉信息
+     * @param id
+     */
+    public void ratedPassengerComplaint(Integer id){
+        TComplaint tComplaint = complaintService.selectById(id);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("OrderId", "");//订单号
+        jsonObject.put("ComplaintTime", tComplaint.getInsertTime());//投诉时间YYYYMMDDhhmms
+        jsonObject.put("Detail", tComplaint.getReason());//投诉内容
+        jsonObject.put("Result", tComplaint.getHandleResult());//处理结果
+        Map<String, String> map = new HashMap<>();
+        map.put("ratedPassengerComplaint", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/ratedPassengerComplaint", map);
+        System.out.println("乘客投诉信息:" + result);
+    }
+
+
+    /**
+     * 驾驶员处罚信息
+     * @param id
+     */
+    public void ratedDriverPunish(Integer id){
+        DriverPunish driverPunish = driverPunishMapper.selectById(id);
+        TDriver driver = driverService.selectById(driverPunish.getDriverId());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("LicenseId", driver.getDriveCard());//机动车驾驶证编号
+        jsonObject.put("PunishTime", driverPunish.getPunishTime());//处罚时间YYYYMMDDhhmms
+        jsonObject.put("PunishReason", driverPunish.getPunishReason());//处罚原因
+        jsonObject.put("PunishReault", driverPunish.getPunishReault());//处罚结果
+        Map<String, String> map = new HashMap<>();
+        map.put("ratedDriverPunish", jsonObject.toJSONString());
+        String result = HttpRequestUtil.postRequest(PushURL.ministry_of_transport_data + "/ratedDriverPunish", map);
+        System.out.println("驾驶员处罚信息:" + result);
+    }
+
+
+
+
+
+
+    private int phoneExp(String phone){
+        /**
+         * 中国移动号码正则
+         * 139、138、137、136、135、134、147、150、151、152、157、158、159、178、182、183、184、187、188、198、195
+         * 虚拟运营商号段: 1703、1705、1706、165
+         **/
+         String MOBILE_PATTERN = "(^1(3[4-9]|47|5[0-27-9]|65|78|8[2-478]|98)\\d{8}$)|(^170[356]\\d{7}$)";
+
+        /**
+         * 中国电信号码正则
+         * 133、149、153、173、177、180、181、189、199、191
+         * 虚拟运营商号段: 162、1700、1701、1702
+         **/
+         String TELECOM_PATTERN = "(^1(33|49|53|62|7[37]|8[019]|9[19])\\d{8}$)|(^170[012]\\d{7}$)";
+
+        /**
+         * 中国联通号码正则
+         * 130、131、132、155、156、185、186、145、175、176、166、140
+         * 虚拟运营商号段: 171、1707、1708、1709、167
+         **/
+         String UNICOM_PATTERN = "(^1(3[0-2]|4[05]|5[56]|6[67]|7[156]|8[56])\\d{8}$)|(^170[7-9]\\d{7}$)";
+        if(Pattern.matches(UNICOM_PATTERN, phone)){
+           return 1;
+        }
+        if(Pattern.matches(MOBILE_PATTERN, phone)){
+            return 2;
+        }
+        if(Pattern.matches(TELECOM_PATTERN, phone)){
+            return 3;
+        }
+        return 4;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushURL.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushURL.java
new file mode 100644
index 0000000..411a367
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushURL.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.util;
+
+public class PushURL {
+    public static String zull_user_url = "https://okyueche.com:443";
+    public static String order_push_url =  zull_user_url + "/driver/base/order/pushOrderState";
+    public static String driver_auth_url =  zull_user_url + "/driver/base/driver/sendsms";
+    public static String withdraw_auth_url =  zull_user_url + "/driver/base/withdrawal/withdrawalAudit";
+    public static String cancel_order_url =  zull_user_url + "/user/base/order/sendOrderState";
+    public static String freeze_user_url =  zull_user_url + "/user/base/user/freeze";
+    public static String ministry_of_transport_data = "http://120.77.11.218:8868/ministryOfTransport";
+    public static String ministry_of_transport_ftp = "http://120.77.11.218:8868/ftp";
+
+
+//    public static String zull_user_url = "http://127.0.0.1:80";
+//    public static String order_push_url =  zull_user_url + "/driver/base/order/pushOrderState";
+//    public static String driver_auth_url =  zull_user_url + "/driver/base/driver/sendsms";
+//    public static String withdraw_auth_url =  zull_user_url + "/driver/base/withdrawal/withdrawalAudit";
+//    public static String cancel_order_url =  zull_user_url + "/user/base/order/sendOrderState";
+//    public static String freeze_user_url =  zull_user_url + "/user/base/user/freeze";
+//    public static String ministry_of_transport_data = "http://120.77.11.218:8868/ministryOfTransport";
+//    public static String ministry_of_transport_ftp = "http://120.77.11.218:8868/ftp";
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
new file mode 100644
index 0000000..ce51f7f
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
@@ -0,0 +1,129 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * Redis工具类
+ */
+@Component
+public class RedisUtil {
+
+
+
+    /**
+     * 向redis中存储字符串没有过期时间
+     * @param key
+     * @param value
+     */
+    public void setStrValue(String key, String value){
+        if(ToolUtil.isNotEmpty(key)){
+            //将请求头部和参数合成一个请求
+            Map<String,String> map = new HashMap<>();
+            map.put("key", key);
+            map.put("value", value);
+            String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/setValue_", map);
+            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+            if(jsonObject.getIntValue("code") != 200){
+                System.err.println("调用redis出错了");
+            }
+        }
+
+    }
+
+
+    /**
+     * 以分钟为单位设置存储值(设置过期时间)
+     * @param key
+     * @param value
+     * @param time 秒
+     */
+    public void setStrValue(String key, String value, int time){
+        if(ToolUtil.isNotEmpty(key)){
+            Map<String,String> map = new HashMap<>();
+            map.put("key", key);
+            map.put("value", value);
+            map.put("time", String.valueOf(time));
+            String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/setValue", map);
+            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+            if(jsonObject.getIntValue("code") != 200){
+                System.err.println("调用redis出错了");
+            }
+        }
+    }
+
+
+    /**
+     * 从redis中获取值
+     * @param key
+     * @return
+     */
+    public String getValue(String key){
+        if(ToolUtil.isNotEmpty(key)){
+            Map<String,String> map = new HashMap<>();
+            map.put("key", key);
+            String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/getValue", map);
+            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+            if(jsonObject.getIntValue("code") != 200){
+                System.err.println("调用redis出错了");
+            }
+            return jsonObject.getString("data");
+        }
+        return null;
+    }
+
+
+
+    /**
+     * 从redis中获取值
+     * @param key
+     * @return
+     */
+    public String getValues(String key){
+        if(ToolUtil.isNotEmpty(key)){
+            Map<String,String> map = new HashMap<>();
+            map.put("keys", key);
+            String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/getValues", map);
+            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+            if(jsonObject.getIntValue("code") != 200){
+                System.err.println("调用redis出错了");
+            }
+            return jsonObject.getString("data");
+        }
+        return null;
+    }
+
+
+    /**
+     * 删除key
+     * @param key
+     */
+    public String remove(String key){
+        if(ToolUtil.isNotEmpty(key)){
+            Map<String,String> map = new HashMap<>();
+            map.put("key", key);
+            String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/getValue", map);
+            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+            if(jsonObject.getIntValue("code") != 200){
+                System.err.println("调用redis出错了");
+            }
+            return jsonObject.getString("data");
+        }
+        return null;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ResultUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ResultUtil.java
new file mode 100644
index 0000000..75dfbc8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/ResultUtil.java
@@ -0,0 +1,195 @@
+package com.stylefeng.guns.modular.system.util;
+
+/**
+ * 定义统一返回对象
+ */
+public class ResultUtil<T> {
+
+    public static final Integer SUCCESS = 200;
+
+    public static final Integer PARAM_ERROR = 300;
+
+    public static final Integer RUNTIME_ERROR = 400;
+
+    public static final Integer ERROR = 500;
+
+    public static final String Token = "Token失效";
+
+    private Integer status;//状态码
+
+    private Integer code;//备用状态码
+
+    private String msg;//返回说明
+
+    private T data;//返回数据
+
+    private String str;//存储单个字符串值
+
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public String getStr() {
+        return str;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    private ResultUtil(Integer status, Integer code, String msg) {
+        this.status = status;
+        this.code = code;
+        this.msg = msg;
+    }
+
+    private ResultUtil(Integer status, Integer code, String msg, T data) {
+        this.status = status;
+        this.code = code;
+        this.msg = msg;
+        this.data = data;
+    }
+
+    private ResultUtil(Integer status, Integer code, String msg, T data, String str) {
+        this.status = status;
+        this.code = code;
+        this.msg = msg;
+        this.data = data;
+        this.str = str;
+    }
+
+    private ResultUtil(Integer status, Integer code, String msg, String str) {
+        this.status = status;
+        this.code = code;
+        this.msg = msg;
+        this.str = str;
+    }
+
+
+    public static <T> ResultUtil<T> getResult(Integer status, Integer code, String msg){
+        return new ResultUtil<>(status, code, msg);
+    }
+
+    public static <T> ResultUtil<T> getResult(Integer status, Integer code, String msg, T data){
+        return new ResultUtil<>(status, code, msg, data);
+    }
+
+    public static <T> ResultUtil<T> getResult(Integer status, Integer code, String msg, T data, String str){
+        return new ResultUtil<>(status, code, msg, data, str);
+    }
+
+    /**
+     * 错误信息
+     * @return
+     */
+    public static ResultUtil error(String mag){
+        return ResultUtil.getResult(ResultUtil.ERROR, ResultUtil.ERROR, mag);
+    }
+
+    /**
+     * 错误信息
+     * @return
+     */
+    public static <T> ResultUtil <T> error(String mag, T obj){
+        return ResultUtil.getResult(ResultUtil.ERROR, ResultUtil.ERROR, mag, obj);
+    }
+
+    /**
+     * token失效
+     * @return
+     */
+    public static ResultUtil tokenErr(){
+        return ResultUtil.getResult(ResultUtil.ERROR, ResultUtil.ERROR, ResultUtil.Token);
+    }
+
+    /**
+     * token失效
+     * @return
+     */
+    public static ResultUtil tokenErr(String msg){
+        return ResultUtil.getResult(ResultUtil.ERROR, ResultUtil.ERROR, msg);
+    }
+
+    /**
+     * 参数异常
+     * @return
+     */
+    public static  ResultUtil paranErr(){
+        return ResultUtil.getResult(ResultUtil.PARAM_ERROR, ResultUtil.PARAM_ERROR, "参数异常");
+    }
+
+    /**
+     * 参数异常
+     * @return
+     */
+    public static <T> ResultUtil<T> paranErr(T data){
+        return ResultUtil.getResult(ResultUtil.PARAM_ERROR, ResultUtil.PARAM_ERROR, "参数异常", data);
+    }
+
+    /**
+     * 运行异常
+     * @return
+     */
+    public static ResultUtil runErr(){
+        return ResultUtil.getResult(ResultUtil.RUNTIME_ERROR, ResultUtil.RUNTIME_ERROR, "服务器运行异常");
+    }
+
+
+    /**
+     * 运行异常
+     * @return
+     */
+    public static <T>ResultUtil<T> runErr(T data){
+        return ResultUtil.getResult(ResultUtil.RUNTIME_ERROR, ResultUtil.RUNTIME_ERROR, "服务器运行异常", data);
+    }
+
+
+    /**
+     * 返回成功
+     * @param
+     * @return
+     */
+    public static ResultUtil success(){
+        return ResultUtil.getResult(ResultUtil.SUCCESS, ResultUtil.SUCCESS, "成功");
+    }
+
+
+    /**
+     * 返回成功
+     * @param data
+     * @param <T>
+     * @return
+     */
+    public static <T> ResultUtil<T> success(T data){
+        return ResultUtil.getResult(ResultUtil.SUCCESS, ResultUtil.SUCCESS, "成功", data);
+    }
+
+    /**
+     * 返回成功
+     * @param data
+     * @param str
+     * @param <T>
+     * @return
+     */
+    public static <T> ResultUtil<T> success(T data, String str){
+        return ResultUtil.getResult(ResultUtil.SUCCESS, ResultUtil.SUCCESS, "成功", data, str);
+    }
+
+    public static <T> ResultUtil<T> success(String msg, T data){
+        return ResultUtil.getResult(ResultUtil.SUCCESS, ResultUtil.SUCCESS, msg, data);
+    }
+
+    public static <T> ResultUtil<T> success(String msg, T data, String str){
+        return ResultUtil.getResult(ResultUtil.SUCCESS, ResultUtil.SUCCESS, msg, data, str);
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RongCloudUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RongCloudUtil.java
new file mode 100644
index 0000000..04f11ef
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RongCloudUtil.java
@@ -0,0 +1,148 @@
+package com.stylefeng.guns.modular.system.util;
+
+import io.rong.RongCloud;
+import io.rong.methods.push.Push;
+import io.rong.methods.user.User;
+import io.rong.models.Result;
+import io.rong.models.push.Audience;
+import io.rong.models.push.Notification;
+import io.rong.models.push.PlatformNotification;
+import io.rong.models.push.PushModel;
+import io.rong.models.response.PushResult;
+import io.rong.models.response.TokenResult;
+import io.rong.models.user.UserModel;
+import io.rong.util.HostType;
+import io.rong.util.HttpUtil;
+
+import java.net.HttpURLConnection;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 融云
+ */
+public class RongCloudUtil {
+	private static String appKey = "25wehl3u20ddw";
+	private static String appSecret = "gG3IjHADkAK";
+	       
+	private static RongCloud rongCloud = RongCloud.getInstance(appKey, appSecret);
+	/**
+	 * 融云注册
+	 * @param id
+	 * @param name
+	 * @param portrait
+	 * @return
+	 * @throws Exception
+	 */
+	public static TokenResult getToken(String id,String name,String portrait) throws Exception{
+		User user = rongCloud.user;
+	    UserModel userModel = new UserModel()
+	            .setId(id)
+	            .setName(name)
+	            .setPortrait(portrait);
+	    TokenResult result = user.register(userModel);
+	    return result;
+	}
+	/**
+	 * 修改
+	 * @param id
+	 * @param name
+	 * @param portrait
+	 * @return
+	 * @throws Exception
+	 */
+	public static Result update(String id,String name,String portrait) throws Exception{
+		User user = rongCloud.user;
+	    UserModel userModel = new UserModel()
+	            .setId(id)
+	            .setName(name)
+	            .setPortrait(portrait);
+	    Result result = user.update(userModel);
+	    return result;
+	}
+
+	/**
+	 * 推送
+	 * @param userId
+	 * @param content
+	 * @param extras
+	 * @return
+	 * @throws Exception
+	 */
+	public static String push( String userId, String content,String extras) throws Exception {
+		String platform="[\"ios\",\"android\"]";
+		String audience="{\"userid\":"+"[\""+userId+"\"]"+",\"is_to_all\":false}";
+		String notification="{\"alert\":\""+content+"\",\"ios\":"+extras+",\"android\":"+extras+"}";
+		String[] tag = {"10"};
+		StringBuilder sb = new StringBuilder();
+		sb.append("platform=").append(platform);
+		sb.append("&tag=").append(tag.toString());
+		sb.append("&audience=").append(audience);
+		sb.append("&notification=").append(notification);
+		/*sb.append(",");
+		sb.append("\"extras\":").append(extras);*/
+		HostType apiHostType = new HostType("https://api-cn.ronghub.com/message/system");
+		HttpURLConnection conn = HttpUtil.CreatePostHttpConnection(apiHostType, appKey, appSecret, "/publish.json", "application/json");
+		HttpUtil.setBodyParameter(sb, conn);
+		return HttpUtil.returnResult(conn);
+	}
+
+	/**
+	 * 发送推送信息
+	 *
+	 * @param alert 消息内容
+	 * @param fromUserId 1
+	 * @param toUserId  userId
+//	 * @param objectName  RC:TxtMsg
+//	 * @param pushContent 消息标题
+//	 * @param pushData 空-安卓  非空:苹果
+	 * @throws Exception
+	 */
+	public static PushResult pushSystemMessage(String alert, String fromUserId, String[] toUserId,Map<String, String> extras) throws Exception {
+
+		//请求路径
+		Push push = rongCloud.push;
+		//推送条件
+		Audience audience = new Audience();
+		audience.setIs_to_all(false);
+		audience.setUserid(toUserId);
+
+		////按操作系统类型推送消息内容
+		Notification notification = new Notification();
+		notification.setAlert(alert);
+
+		//IOS内容
+		PlatformNotification ios = new PlatformNotification();
+		ios.setAlert(alert);
+		ios.setExtras(extras);
+		notification.setIos(ios);
+
+		//Android内容
+		PlatformNotification android = new PlatformNotification();
+		android.setAlert(alert);
+		android.setExtras(extras);
+		notification.setAndroid(android);
+
+		PushModel  pushModel = new PushModel();
+		//目标操作系统
+		String[] platform="ios,android".split(",");
+		pushModel.setPlatform(platform);
+		pushModel.setAudience(audience);
+		pushModel.setNotification(notification);
+		//推送消息
+		PushResult result = push.push(pushModel);
+		return result;
+	}
+
+
+	public static void main(String[] args) {
+		try {
+			Map<String,String> extras = new HashMap<>();
+			extras.put("state","1");
+            PushResult pushResult = pushSystemMessage("您的账号已重置密码为123456,请修改密码后重新登录,如有问题,请联系平台客服。", "1", new String[]{"122"}, extras);
+            System.out.println(pushResult);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/SpringContextsUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/SpringContextsUtil.java
new file mode 100644
index 0000000..fc674da
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/SpringContextsUtil.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.modular.system.util;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SpringContextsUtil implements ApplicationContextAware{
+
+	private static ApplicationContext applicationContext;
+	 
+	@Override	
+	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {		
+		if (SpringContextsUtil.applicationContext == null) {			
+			SpringContextsUtil.applicationContext = applicationContext;		
+		}	
+	} 	
+	// 获取applicationContext	
+	public static ApplicationContext getApplicationContext() {		
+		return applicationContext;	
+	} 	
+	// 通过name获取 Bean.	
+	public static Object getBean(String name) {		
+		return getApplicationContext().getBean(name);	
+	} 	
+	// 通过class获取Bean.	
+	public static <T> T getBean(Class<T> clazz) {		
+		return getApplicationContext().getBean(clazz);	
+	} 	
+	// 通过name,以及Clazz返回指定的Bean	
+	public static <T> T getBean(String name, Class<T> clazz) {	
+		System.out.println(getApplicationContext().getBean(name, clazz));
+		return getApplicationContext().getBean(name, clazz);	
+	}
+    
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java
new file mode 100644
index 0000000..fe42e7e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java
@@ -0,0 +1,79 @@
+package com.stylefeng.guns.modular.system.util;
+
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.modular.system.model.TDriver;
+import com.stylefeng.guns.modular.system.service.ITDriverService;
+import com.stylefeng.guns.modular.system.service.ITLocationService;
+import com.stylefeng.guns.modular.system.service.IUserCouponRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+
+/**
+ * 定时任务工具类
+ */
+@Component
+public class TaskUtil {
+
+    @Autowired
+    private ITLocationService locationService;
+
+    @Autowired
+    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
+
+    @Value("${pushMinistryOfTransport}")
+    private boolean pushMinistryOfTransport;
+
+    @Autowired
+    private ITDriverService driverService;
+
+
+
+    /**
+     * 每隔一分钟去处理的定时任务
+     */
+    @Scheduled(fixedRate = 1000 * 60)
+    public void taskMinute(){
+        try {
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 每天的凌晨执行的任务
+     */
+    @Scheduled(cron = "0 0 0 * * *")
+    public void taskDay(){
+        try {
+            locationService.updateFence();//更新线上电子围栏
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+
+    /**
+     * 每月第一天的1点执行的任务
+     */
+    @Scheduled(cron = "0 0 1 1 * *")
+    public void taskMonth(){
+        try {
+            if(pushMinistryOfTransport){
+                List<TDriver> tDrivers = driverService.selectList(new EntityWrapper<TDriver>().eq("authState", 2).ne("flag", 3));
+                for(TDriver driver : tDrivers){
+                    pushMinistryOfTransportUtil.baseInfoDriverStat(driver.getId());
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WoUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WoUtil.java
new file mode 100644
index 0000000..a5849d2
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WoUtil.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.util;
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+public class WoUtil {
+    public static Workbook ImportFile(MultipartFile importFile) {
+        Workbook book = null;
+        if(importFile == null)
+        {
+            //throw new WoException(SysConstant.ERR_EXCEL_NULL);
+        }
+        String fileName = importFile.getOriginalFilename();
+        try {
+            if(fileName.endsWith(".xlsx"))    //当表格的后缀是".xlsx时"
+            {
+                book = new XSSFWorkbook(importFile.getInputStream());
+            }else
+            {
+                book = new HSSFWorkbook(importFile.getInputStream());
+            }
+        } catch (IOException e) {
+            //throw new WoException(e,SysConstant.ERR_EXCEL_NO);
+        }
+        return book;
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/QuartzTest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/QuartzTest.java
new file mode 100644
index 0000000..dcd730d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/QuartzTest.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.util.task;
+
+import java.util.Map;
+
+import org.quartz.SchedulerException;
+
+import com.google.common.collect.ImmutableMap;
+
+public class QuartzTest {
+
+	public static void main(String[] args) throws SchedulerException {
+		Map<String, ? extends Object> maps =  ImmutableMap
+				.of("id", 1) ;
+		//QuartzManager.addJob(ActivityStartJob.class, (ActivityStartJob.FROZEN_JOB_NAME_PREFIX+1).toUpperCase(), TimeJobType.ACTIVITYSTART, new Date() , maps);
+
+	}
+	
+	
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/TestJob.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/TestJob.java
new file mode 100644
index 0000000..fa471a3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/TestJob.java
@@ -0,0 +1,23 @@
+package com.stylefeng.guns.modular.system.util.task;
+
+import java.util.Date;
+
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import com.stylefeng.guns.modular.system.util.task.base.AbstractJob;
+
+public class TestJob extends AbstractJob{
+
+	@Override
+	public void execute(JobExecutionContext context) throws JobExecutionException {
+			logger.debug("Start >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
+		 	Integer serial = (Integer) context.get("serialize");
+			Integer keys = context.getMergedJobDataMap().getIntValue("keys");
+			System.out.println(">>>>>>>>>>> serial:"+serial);
+			System.out.println(">>>>>>>>>>> keys:"+keys);
+			
+			System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>"+DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/ThreadTes.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/ThreadTes.java
new file mode 100644
index 0000000..5a525e3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/ThreadTes.java
@@ -0,0 +1,25 @@
+package com.stylefeng.guns.modular.system.util.task;
+
+
+public class ThreadTes implements Runnable{
+	@Override
+	public void run() {
+		try {
+			System.out.println(">>>>>>>>>>>>>>>>>>> start ");
+			Thread.sleep(2000);
+			System.out.println(">>>>>>>>>>>>>>>>>>> remove job 5 ");
+			/*QuartzManager.removeJob(String.valueOf(5), 
+					TimeJobType.NEWS);*/
+			System.out.println(">>>>>>>>>>>>>>>>>>> stop");
+			
+			
+			Thread.sleep(2000);
+			System.out.println(">>>>>>>>>>>>>>>>>>> modify job 10 ");
+			//QuartzManager.modifyJobTime(String.valueOf(10), TimeJobType.NEWS, new Date(Calendar.getInstance().getTimeInMillis() + 20*1000));
+			System.out.println(">>>>>>>>>>>>>>>>>>> stop");
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/AbstractJob.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/AbstractJob.java
new file mode 100644
index 0000000..f0969ba
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/AbstractJob.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.modular.system.util.task.base;
+
+import com.stylefeng.guns.core.util.SpringContextHolder;
+import com.stylefeng.guns.modular.system.service.ITDriverService;
+import com.stylefeng.guns.modular.system.service.ITNoticesService;
+import com.stylefeng.guns.modular.system.service.ITSystemNoticeService;
+import com.stylefeng.guns.modular.system.service.ITUserService;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractJob implements Job{
+	protected Logger logger = LoggerFactory.getLogger(getClass());
+	
+	@Override
+	public abstract void execute(JobExecutionContext context) throws JobExecutionException;
+	
+	protected ITUserService tUserService;  //用户
+	protected ITNoticesService tNoticesService;  //公告
+	protected ITSystemNoticeService tSystemNoticeService;  //公告记录
+	protected ITDriverService tDriverService;  //司机
+
+	public AbstractJob(){
+		//this.exhibitionService = SpringContextsUtil.getBean("exhibitionService", IExhibitionService.class);
+		this.tUserService = SpringContextHolder.getBean( ITUserService.class);
+		this.tNoticesService = SpringContextHolder.getBean( ITNoticesService.class);
+		this.tSystemNoticeService = SpringContextHolder.getBean( ITSystemNoticeService.class);
+		this.tDriverService = SpringContextHolder.getBean( ITDriverService.class);
+
+
+	}
+	
+	 
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/QuartzManager.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/QuartzManager.java
new file mode 100644
index 0000000..7533872
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/QuartzManager.java
@@ -0,0 +1,141 @@
+package com.stylefeng.guns.modular.system.util.task.base;
+
+import java.util.Date;
+import java.util.Map;
+
+import org.quartz.Job;
+import org.quartz.JobBuilder;
+import org.quartz.JobDataMap;
+import org.quartz.JobDetail;
+import org.quartz.JobKey;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerFactory;
+import org.quartz.SimpleTrigger;
+import org.quartz.TriggerBuilder;
+import org.quartz.TriggerKey;
+import org.quartz.impl.StdSchedulerFactory;
+
+public class QuartzManager {
+	private static SchedulerFactory factory = new StdSchedulerFactory();
+	private static final String TRIGGER_NAME_PREFIX = "TRIGGER_PREFIX_";
+	private static final String JOB_NAME_PREFIX = "JOB_PREFIX_";
+	
+	/**
+	 * 添加定时任务:具体某个时间点执行一次的任务,如:在某个2015-06-01 12:00发送一条消息
+	 * 
+	 * @param class1
+	 * @param jobName
+	 *            具体的任务名+ID标识唯一
+	 * @param jobType
+	 * @param date
+	 * @param jp
+	 */
+	public synchronized static void addJob(Class<? extends Job> jobClass, String jobName, TimeJobType jobType, Date date,
+			Map<String,  ? extends Object> jp) {
+		//logger.debug("ADD JOB {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
+		try {
+			Scheduler sched = factory.getScheduler();
+			JobDetail job = JobBuilder.newJob(jobClass).withIdentity(JOB_NAME_PREFIX + jobName, jobType.getType())
+					.setJobData(new JobDataMap(jp)).build();
+
+			SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
+					.withIdentity(TRIGGER_NAME_PREFIX + jobName, jobType.getType()).startAt(date).build();
+			removeJob(jobName, jobType);
+			
+			sched.scheduleJob(job, trigger);
+
+			if (!sched.isShutdown()) {
+				sched.start();
+			}
+		} catch (Exception e) {
+			//logger.error("ADD JOB exception {},jobName={},jobTyep={},jobDate={},",jobClass.getName(),jobName,jobType,date);
+		}
+	}
+	
+	   /**
+	    * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) 
+	    * @param jobName 
+	    * @param time 
+	    */  
+	    public synchronized static void modifyJobTime(String jobName,TimeJobType jobType, Date time) {  
+	    	 //logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
+	        try {  
+	        	JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
+				TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
+				
+				
+	            Scheduler sched = factory.getScheduler();  
+	            SimpleTrigger trigger = (SimpleTrigger) sched.getTrigger(key);  
+	            if(trigger == null) {  
+	                return;  
+	            }  
+	            Date oldTime = trigger.getStartTime();
+	          
+	            if (oldTime.getTime() != time.getTime()) {  
+	                JobDetail jobDetail = sched.getJobDetail(jobKey);  
+	                Class<? extends Job> objJobClass = jobDetail.getJobClass();  
+	                removeJob(jobName,jobType);  
+	                Map<String, Object> jp = jobDetail.getJobDataMap();
+	                addJob(objJobClass, jobName, jobType, time, jp); 
+	            }  
+	        } catch (Exception e) {  
+	           // logger.error("Update JOB exception,jobName={},jobTyep={},jobDate={}," ,jobName,jobType,time);
+	        }  
+	    }
+
+	/**
+	 * 移除一个任务
+	 * 
+	 * @param jobName
+	 * @param jobGroupName
+	 * @param triggerName
+	 * @param triggerGroupName
+	 */
+	public synchronized static void removeJob(String jobName, TimeJobType jobType) {
+		try {
+			JobKey jobKey = new JobKey(JOB_NAME_PREFIX + jobName, jobType.getType());
+			TriggerKey key = new TriggerKey(TRIGGER_NAME_PREFIX + jobName, jobType.getType());
+			Scheduler sched = factory.getScheduler();
+
+			JobDetail detail = sched.getJobDetail(jobKey);
+			if (detail != null) {
+				sched.pauseJob(jobKey);
+				sched.pauseTrigger(key);// 停止触发器
+				sched.unscheduleJob(key);// 移除触发器
+				sched.deleteJob(jobKey);// 删除任务
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 启动所有定时任务
+	 */
+	public synchronized static void startJobs() {
+		try {
+			Scheduler sched = factory.getScheduler();
+			sched.start();
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 关闭所有定时任务
+	 */
+	public synchronized static void shutdownJobs() {
+		try {
+			Scheduler sched = factory.getScheduler();
+			if (!sched.isShutdown()) {
+				sched.shutdown();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException(e);
+		}
+	}
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/TimeJobType.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/TimeJobType.java
new file mode 100644
index 0000000..3e8594e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/base/TimeJobType.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.modular.system.util.task.base;
+
+/**
+ * @Description 按时间点发布的任务类型
+ * @author Leeyns
+ * @date 2016年5月17日 下午7:22:28
+ */
+public enum TimeJobType {
+	EXHIBITION("EXHIBITION","展会定时"),
+	UNLOCK("UNLOCK","是否过期");
+	private String type;
+	private String desc;
+	private TimeJobType(String type, String desc) {
+		this.type = type;
+		this.desc = desc;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getDesc() {
+		return desc;
+	}
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+	
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/exceptions/TimeException.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/exceptions/TimeException.java
new file mode 100644
index 0000000..92b4f49
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/exceptions/TimeException.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.modular.system.util.task.exceptions;
+
+/** 
+ * @文件说明:定时器任务执行异常 
+ * @版权所有:成都喜来达
+ * @项目名称: fengsheng
+ * @创建者: Leeyns 
+ * @创建日期: 2016年5月18日
+ * @最近修改者:Leeyns 
+ * @最近修改日期:2016年5月18日
+ */ 
+public class TimeException extends Exception {
+
+	/**
+	 *  TODO
+	 */
+	private static final long serialVersionUID = 5703430073981692250L;
+
+	private String message;
+	
+	public TimeException() {
+		super();
+	}
+	
+	public TimeException(String message) {
+		super(message);
+		this.message = message;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddMachine.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddMachine.java
new file mode 100644
index 0000000..8c81329
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddMachine.java
@@ -0,0 +1,185 @@
+package com.stylefeng.guns.modular.system.util.task.jobs;
+
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.util.ConstellationUtil;
+import com.stylefeng.guns.modular.system.util.task.base.AbstractJob;
+import org.apache.commons.lang.time.DateUtils;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 定时1秒后导出用户详情记录
+ */
+public class AddMachine extends AbstractJob {
+
+    public static final String name = "addMachineJob";
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        JobDataMap maps = context.getMergedJobDataMap();
+        Workbook book = (Workbook) maps.get("book");
+
+        try {
+            System.out.println("----定时2秒后导入机器人-----");
+            Sheet sh = book.getSheetAt(0);   //获取到第一个表
+            for (int i = 1; i <= sh.getLastRowNum(); i++) {
+                Row row = sh.getRow(i);
+
+                Cell cell0 = row.getCell(0);  //用户昵称
+                String nickname = null;
+                if (SinataUtil.isNotEmpty(cell0)){
+                    nickname = String.valueOf(cell0.getStringCellValue()).trim();
+                }
+
+                Cell cell1 = row.getCell(1); //性别
+                String sex = null;
+                if (SinataUtil.isNotEmpty(cell1)){
+                    sex = String.valueOf(cell1.getStringCellValue()).trim();
+                }
+
+                Cell cell2 = row.getCell(2);  //认证
+                String authType = null;
+                if (SinataUtil.isNotEmpty(cell2)){
+                    authType = String.valueOf(cell2.getStringCellValue()).trim();
+                }
+
+                Cell cell3 = row.getCell(3);  //女神认证
+                String isGoddess = null;
+                if (SinataUtil.isNotEmpty(cell3)){
+                    isGoddess = String.valueOf(cell3.getStringCellValue()).trim();
+                }
+
+                Cell cell4 = row.getCell(4);  //会员
+                String isVip = null;
+                if (SinataUtil.isNotEmpty(cell4)){
+                    isVip = String.valueOf(cell4.getStringCellValue()).trim();
+                }
+
+                Cell cell5 = row.getCell(5);  //生日
+                String birthday = null;
+                if (SinataUtil.isNotEmpty(cell5)){
+                    birthday = String.valueOf(cell5.getStringCellValue()).trim();
+                }
+
+                Cell cell6 = row.getCell(6);  //爱好
+                String hobbyStr = null;
+                if (SinataUtil.isNotEmpty(cell6)){
+                    hobbyStr = String.valueOf(cell6.getStringCellValue()).trim();
+                }
+
+                Cell cell7 = row.getCell(7);  //交友原则
+                String principleStr = null;
+                if (SinataUtil.isNotEmpty(cell7)){
+                    principleStr = String.valueOf(cell7.getStringCellValue()).trim();
+                }
+
+                Cell cell8 = row.getCell(8);  //身高cm
+                String height = null;
+                if (SinataUtil.isNotEmpty(cell8)){
+                    height = String.valueOf(cell8.getStringCellValue()).trim();
+                }
+
+                Cell cell9 = row.getCell(9);  //体重kg
+                String weight = null;
+                if (SinataUtil.isNotEmpty(cell9)){
+                    weight = String.valueOf(cell9.getStringCellValue()).trim();
+                }
+
+                Cell cell10 = row.getCell(10);  //个人简介
+                String introduction = null;
+                if (SinataUtil.isNotEmpty(cell10)){
+                    introduction = String.valueOf(cell10.getStringCellValue()).trim();
+                }
+
+                if (SinataUtil.isEmpty(nickname) || SinataUtil.isEmpty(sex) || SinataUtil.isEmpty(authType)
+                        || SinataUtil.isEmpty(isGoddess) || SinataUtil.isEmpty(isVip) || SinataUtil.isEmpty(birthday)
+                        || SinataUtil.isEmpty(hobbyStr) || SinataUtil.isEmpty(principleStr)){
+                    continue;
+                }else{
+                    if (SinataUtil.isNotEmpty(height)){
+                        if (!isDouble(height)){
+                            continue;
+                        }
+                    }
+                    if (SinataUtil.isNotEmpty(weight)){
+                        if (!isDouble(weight)){
+                            continue;
+                        }
+                    }
+                    String constellation = null;
+                    try {
+                        String time = importByExcelForDate(birthday);
+                        constellation = ConstellationUtil.getConstellation(time);
+                    }catch (Exception e){
+                        continue;
+                    }
+                    /*AppUserInfo user = new AppUserInfo();
+                    user.setAddTime(new Date());
+                    user.setConstellation(constellation);
+                    user.setNickname(nickname);
+                    user.setSex(Integer.valueOf(sex));
+                    user.setIsGoddess(Integer.valueOf(isGoddess));
+                    user.setAuthType(Integer.valueOf(authType));
+                    user.setIsVip(Integer.valueOf(isVip));
+                    user.setState(1);
+                    user.setBirthday(birthday);
+                    user.setHobbyStr(hobbyStr);
+                    user.setPrincipleStr(principleStr);
+                    if (SinataUtil.isNotEmpty(height))
+                        user.setHeight(Double.valueOf(height));
+                    if (SinataUtil.isNotEmpty(weight))
+                        user.setWeight(Double.valueOf(weight));
+                    if (SinataUtil.isNotEmpty(introduction))
+                        user.setIntroduction(introduction);
+                    user.setIsComplete(1);
+                    user.setIsMachine(2);
+                    appUserInfoService.insert(user);*/
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 转换日期
+     * @return
+     */
+    public static String importByExcelForDate(String value) {//value就是它的天数
+        String currentCellValue = "";
+        if(value != null && !value.equals("")){
+            Calendar calendar = new GregorianCalendar(1900,0,-1);
+            Date d = calendar.getTime();
+            Date dd = DateUtils.addDays(d,Integer.valueOf(value));
+            DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
+            currentCellValue = formater.format(dd);
+        }
+        return currentCellValue;
+    }
+
+    /**
+     * 验证是否可以字符转为金额值
+     * @param str
+     * @return
+     */
+    public static boolean isDouble(String str)
+    {
+        try{
+            Double.parseDouble(str);
+            return true;
+        }catch(NumberFormatException e)
+        {
+            System.out.println("异常:\"" + str + "\"不是数字/整数/小数...");
+            return false;
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddNotice.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddNotice.java
new file mode 100644
index 0000000..b22e3d7
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddNotice.java
@@ -0,0 +1,91 @@
+package com.stylefeng.guns.modular.system.util.task.jobs;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.model.TDriver;
+import com.stylefeng.guns.modular.system.model.TNotices;
+import com.stylefeng.guns.modular.system.model.TSystemNotice;
+import com.stylefeng.guns.modular.system.model.TUser;
+import com.stylefeng.guns.modular.system.util.JpushUtil;
+import com.stylefeng.guns.modular.system.util.task.base.AbstractJob;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 添加公告记录
+ */
+public class AddNotice extends AbstractJob {
+
+    public static final String name = "addNoticeJob";
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        JobDataMap maps = context.getMergedJobDataMap();
+        Integer noticeId = maps.getIntValue("noticeId");
+
+        try {
+            System.out.println("----定时1秒后生成公告记录-----");
+            TNotices tNotices = tNoticesService.selectById(noticeId);
+            if (SinataUtil.isNotEmpty(tNotices)){
+                if (tNotices.getIsUser() == 2){
+                    List<TUser> tUsers = tUserService.selectList(new EntityWrapper<TUser>().eq("state",1));
+                    //发送公告给用户
+                    for (TUser user : tUsers){
+                        TSystemNotice notice = new TSystemNotice();
+                        notice.setType(1);
+                        notice.setUserType(1);
+                        notice.setNoticesId(noticeId);
+                        notice.setContent(tNotices.getContent());
+                        notice.setUserId(user.getId());
+                        notice.setInsertTime(new Date());
+                        notice.setRead(1);
+                        tSystemNoticeService.insert(notice);
+
+                    /*Map<String,Object> map = new HashMap<String,Object>();
+                    map.put("sound", userInfo.getIsVoice());   //是否有声音  1=否 2=是
+                    map.put("vibrate", userInfo.getIsShake()); //是否有震动  1=否 2=是
+                    map.put("type", 2);    //消息类型 1=互动  2=公告
+                    map.put("id", record.getId()); //对象ID
+                    JpushUtil.SendPushWithCustomForTransmission(String.valueOf(userInfo.getId()),"【超级过客】提醒您,您有一条新的公告消息。","通知消息",map);*/
+                    }
+                }
+                if (tNotices.getIsDriver() == 2){
+                    List<TDriver> tDrivers = tDriverService.selectList(new EntityWrapper<TDriver>().eq("authState",2));
+                    //发送公告给用户
+                    for (TDriver driver : tDrivers){
+                        TSystemNotice notice = new TSystemNotice();
+                        notice.setType(1);
+                        notice.setUserType(2);
+                        notice.setNoticesId(noticeId);
+                        notice.setContent(tNotices.getContent());
+                        notice.setUserId(driver.getId());
+                        notice.setInsertTime(new Date());
+                        notice.setRead(1);
+                        tSystemNoticeService.insert(notice);
+
+                        /*Map<String,Object> map = new HashMap<String,Object>();
+                        map.put("sound", userInfo.getIsVoice());   //是否有声音  1=否 2=是
+                        map.put("vibrate", userInfo.getIsShake()); //是否有震动  1=否 2=是
+                        map.put("type", 2);    //消息类型 1=互动  2=公告
+                        map.put("id", record.getId()); //对象ID
+                        JpushUtil.SendPushWithCustomForTransmission(String.valueOf(userInfo.getId()),"【超级过客】提醒您,您有一条新的公告消息。","通知消息",map);*/
+
+                        if (tNotices.getIsBroadcast() == 1){
+                            //增加极光推送
+                            JpushUtil.SendPushWithCustomForSh("DRIVER"+driver.getId().toString(),tNotices.getTitle(),"通知消息",null);
+                        }
+
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddSensitiveWord.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddSensitiveWord.java
new file mode 100644
index 0000000..fb0274d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/AddSensitiveWord.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.modular.system.util.task.jobs;
+
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.util.task.base.AbstractJob;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.util.Date;
+
+/**
+ * 添加敏感词
+ */
+public class AddSensitiveWord extends AbstractJob {
+
+    public static final String name = "addSensitiveWordJob";
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        JobDataMap maps = context.getMergedJobDataMap();
+        Workbook book = (Workbook) maps.get("book");
+        try {
+            System.out.println("----定时1秒后添加敏感词-----");
+            Sheet sh = book.getSheetAt(0);   //获取到第一个表
+            for (int i = 1; i <= sh.getLastRowNum(); i++) {
+                Row row = sh.getRow(i);
+
+                Cell cell0 = row.getCell(0);  //第一大类名称
+                String name = null;
+                if (SinataUtil.isNotEmpty(cell0)) {
+                    name = String.valueOf(cell0.getStringCellValue()).trim();
+                }
+                if (SinataUtil.isEmpty(name)){
+                    continue;
+                }else{
+                   /* AppSensitiveWord word = new AppSensitiveWord();
+                    word.setAddTime(new Date());
+                    word.setName(name.trim());
+                    appSensitiveWordService.insert(word);*/
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/SendSms.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/SendSms.java
new file mode 100644
index 0000000..098eb1b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/jobs/SendSms.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.util.task.jobs;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.util.HuaWeiSMSUtil;
+import com.stylefeng.guns.modular.system.util.task.base.AbstractJob;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.util.List;
+
+/**
+ * 发送短信
+ */
+public class SendSms extends AbstractJob {
+
+    public static final String name = "sendSmsJob";
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        JobDataMap maps = context.getMergedJobDataMap();
+
+        try {
+            System.out.println("----定时1秒后发送短信-----");
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/start/TimerServerStartJob.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/start/TimerServerStartJob.java
new file mode 100644
index 0000000..554ca09
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/task/start/TimerServerStartJob.java
@@ -0,0 +1,39 @@
+package com.stylefeng.guns.modular.system.util.task.start;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 主要用于定时任务在服务器重新启动时添加任务
+ * @author Leeyns
+ *
+ */
+@Component
+public class TimerServerStartJob {
+	
+	
+	private Logger logger = LoggerFactory.getLogger(TimerServerStartJob.class);
+	
+	public TimerServerStartJob(){
+		//服务器重新启动时,重新加载定时任务
+//		start();
+	}
+	
+	public void start(){
+		new Thread(new Runnable() {
+			@Override
+			public void run() {
+				logger.debug("==>> Start timer job.");
+				try {
+					Thread.sleep(15000);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+				System.out.println("定时启动了");
+				logger.debug("==>> Stop all timer job.");
+			}
+		}).start();
+	}
+	
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/Base64Coder.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/Base64Coder.java
new file mode 100644
index 0000000..902eb7c
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/Base64Coder.java
@@ -0,0 +1,125 @@
+package com.stylefeng.guns.modular.system.util.three;
+
+public class Base64Coder {
+	public final static char[] base64_alphabet = new char[] { 'A', 'B', 'C',
+			'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+			'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c',
+			'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
+			'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2',
+			'3', '4', '5', '6', '7', '8', '9', '+', '/', '=' };
+
+	public static String encode(byte[] data) {
+		int length = data.length;
+		byte[] char_array_3 = new byte[] { 0, 0, 0 };
+		byte[] char_array_4 = new byte[] { '=', '=', '=', '=' };
+		String retContent = "";
+		int i = 0;
+		int j = 0;
+		int reversePos = 0;
+		while (length > 0) {
+			length--;
+			char_array_3[i++] = data[reversePos++];
+			if (i == 3) {
+				char_array_4[0] = (byte) ((char_array_3[0] & 0xfc) >> 2); // convert
+																			// the
+																			// char
+				char_array_4[1] = (byte) (((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4));
+				char_array_4[2] = (byte) (((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6));
+				char_array_4[3] = (byte) (char_array_3[2] & 0x3f);
+				for (i = 0; (i < 4); i++)
+					retContent += base64_alphabet[char_array_4[i]];
+				i = 0;
+			}
+		}
+
+		// handling the last input content
+		if (i > 0) {
+			for (j = i; j < 3; j++)
+				char_array_3[j] = 0; // padding of zero
+
+			char_array_4[0] = (byte) ((char_array_3[0] & 0xfc) >> 2); // right
+																		// shift
+			char_array_4[1] = (byte) (((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4));
+			char_array_4[2] = (byte) (((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6));
+			char_array_4[3] = (byte) (char_array_3[2] & 0x3f);
+
+			for (j = 0; (j < i + 1); j++)
+				retContent += base64_alphabet[char_array_4[j]];
+
+			while ((i++ < 3))
+				// padding of '=' of output string
+				retContent += '=';
+
+		}
+		return retContent;
+	}
+
+	public static String decode(String enContent) {
+		byte[] data = enContent.getBytes();
+		int i = 0, j = 0, enCode = 0;
+		int mLength = data.length;
+		byte[] char_array_4 = new byte[4];
+		byte[] char_array_3 = new byte[3];
+		String retContent = "";
+
+		// filter out the padding '=' chars
+		while (mLength > 0 && (((char) data[enCode]) != '=')
+				&& isBase64((char) data[enCode])) {
+			mLength--;
+			char_array_4[i++] = data[enCode++];
+			if (i == 4) {
+				for (i = 0; i < 4; i++)
+					char_array_4[i] = findChar((char) char_array_4[i]);
+
+				char_array_3[0] = (byte) ((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4));
+				char_array_3[1] = (byte) (((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2));
+				char_array_3[2] = (byte) (((char_array_4[2] & 0x3) << 6) + char_array_4[3]);
+
+				for (i = 0; (i < 3); i++)
+					retContent += (char) char_array_3[i];
+				i = 0;
+			}
+		}
+
+		// last content handling
+		if (i > 0) {
+			for (j = i; j < 4; j++)
+				char_array_4[j] = 0;
+
+			for (j = 0; j < 4; j++)
+				char_array_4[j] = findChar((char) char_array_4[j]);
+
+			char_array_3[0] = (byte) ((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4));
+			char_array_3[1] = (byte) (((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2));
+			char_array_3[2] = (byte) (((char_array_4[2] & 0x3) << 6) + char_array_4[3]);
+
+			for (j = 0; (j < i - 1); j++)
+				retContent += (char) char_array_3[j];
+		}
+
+		return retContent;
+	}
+
+	public static boolean isBase64(char c) {
+		boolean base64 = false;
+		for (int i = 0; i < 64; i++) {
+			if (c == base64_alphabet[i]) {
+				base64 = true;
+				break;
+			}
+		}
+		return base64;
+	}
+
+	public static byte findChar(char x) {
+		byte index = 64; // 65th char '='
+		for (int i = 0; i < 64; i++) {
+			if (x == base64_alphabet[i]) {
+				index = (byte) i;
+				break;
+			}
+		}
+		return index;
+	}
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/HMACSHA1Util.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/HMACSHA1Util.java
new file mode 100644
index 0000000..c560ea3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/HMACSHA1Util.java
@@ -0,0 +1,31 @@
+package com.stylefeng.guns.modular.system.util.three;
+
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+
+public class HMACSHA1Util {
+	private static final String MAC_NAME = "HmacSHA1";    
+    private static final String ENCODING = "UTF-8";    
+      
+    /**  
+     * 使用 HMAC-SHA1 签名方法对对encryptText进行签名  
+     * @param encryptText 被签名的字符串  
+     * @param encryptKey  密钥  
+     * @return  
+     * @throws Exception  
+     */    
+    public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception     
+    {           
+        byte[] data=encryptKey.getBytes(ENCODING);  
+        //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称  
+        SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);   
+        //生成一个指定 Mac 算法 的 Mac 对象
+        Mac mac = Mac.getInstance(MAC_NAME);   
+        //用给定密钥初始化 Mac 对象  
+        mac.init(secretKey);    
+        byte[] text = encryptText.getBytes(ENCODING);    
+        //完成 Mac 操作  
+        return mac.doFinal(text);    
+    }    
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/PlatformUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/PlatformUtil.java
new file mode 100644
index 0000000..92f681e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/PlatformUtil.java
@@ -0,0 +1,374 @@
+package com.stylefeng.guns.modular.system.util.three;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URI;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class PlatformUtil {
+	public static String doGet(String url, Map<String, String> param) {
+		// 创建Httpclient对象
+		CloseableHttpClient httpclient = HttpClients.createDefault();
+		String resultString = "";
+		CloseableHttpResponse response = null;
+		try {
+			// 创建uri
+			URIBuilder builder = new URIBuilder(url);
+			if (param != null) {
+				for (String key : param.keySet()) {
+					builder.addParameter(key, param.get(key));
+				}
+			}
+			URI uri = builder.build();
+
+			// 创建http GET请求
+			HttpGet httpGet = new HttpGet(uri);
+
+			// 执行请求
+			response = httpclient.execute(httpGet);
+			// 判断返回状态是否为200
+			if (response.getStatusLine().getStatusCode() == 200) {
+				resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				if (response != null) {
+					response.close();
+				}
+				httpclient.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return resultString;
+	}
+
+	public static String doGet(String url) {
+		return doGet(url, null);
+	}
+
+	public static String doPost(String url, Map<String, String> param) {
+		// 创建Httpclient对象
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		CloseableHttpResponse response = null;
+		String resultString = "";
+		try {
+			// 创建Http Post请求
+			HttpPost httpPost = new HttpPost(url);
+			// 创建参数列表
+			if (param != null) {
+				List<NameValuePair> paramList = new ArrayList<NameValuePair>();
+				for (String key : param.keySet()) {
+					paramList.add(new BasicNameValuePair(key, param.get(key)));
+				}
+				// 模拟表单
+				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
+				httpPost.setEntity(entity);
+			}
+			// 执行http请求
+			response = httpClient.execute(httpPost);
+			resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				response.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+
+		return resultString;
+	}
+
+	public static String doPost(String url) {
+		return doPost(url, null);
+	}
+	
+	public static String doPostJson(String url, String json,Map<String, String> headers) {
+		// 创建Httpclient对象
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		CloseableHttpResponse response = null;
+		String resultString = "";
+
+		try {
+			// 创建Http Post请求
+			HttpPost httpPost = new HttpPost(url);
+			// 添加http headers
+			if (headers != null && headers.size() > 0) {
+				for (String key : headers.keySet()) {
+					httpPost.addHeader(key, headers.get(key));
+				}
+			}
+			// 创建请求内容
+			StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
+			httpPost.setEntity(entity);
+			// 执行http请求
+			response = httpClient.execute(httpPost);
+			resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				response.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+
+		return resultString;
+	}
+	public static String doPostJson1(String url, String json,Map<String, String> headers) {
+		// 创建Httpclient对象
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		CloseableHttpResponse response = null;
+		String resultString = "";
+
+		try {
+			// 创建Http Post请求
+			HttpPost httpPost = new HttpPost(url);
+			// 添加http headers
+			if (headers != null && headers.size() > 0) {
+				for (String key : headers.keySet()) {
+					httpPost.addHeader(key, headers.get(key));
+				}
+			}
+			// 创建请求内容
+			StringEntity entity = new StringEntity(json, ContentType.create("application/x-www-form-urlencoded","UTF-8"));
+			httpPost.setEntity(entity);
+			// 执行http请求
+			response = httpClient.execute(httpPost);
+			resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				response.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return resultString;
+	}
+
+	public static String doGet(String url, String param, Map<String, String> headers, int timeout) {
+		String result = "";
+		BufferedReader in = null;
+		String reqUrl = url + "?" + param;
+		try {
+			// 构造httprequest设置
+			RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout)
+					.setConnectionRequestTimeout(timeout).build();
+			HttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
+			HttpGet htGet = new HttpGet(reqUrl);
+			// 添加http headers
+			if (headers != null && headers.size() > 0) {
+				for (String key : headers.keySet()) {
+					htGet.addHeader(key, headers.get(key));
+				}
+			}
+			// 读取数据
+			HttpResponse r = client.execute(htGet);
+			in = new BufferedReader(new InputStreamReader(r.getEntity().getContent(), "UTF-8"));
+			String line;
+			while ((line = in.readLine()) != null) {
+				result += line;
+			}
+		} catch (Exception e) {
+			System.out.println("发送GET请求出现异常!" + e);
+			e.printStackTrace();
+		} finally {
+			try {
+				if (in != null) {
+					in = null;
+				}
+			} catch (Exception e2) {
+				e2.printStackTrace();
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * 价格预估
+	 * @param host 访问路径
+	 * @param appkey 秘钥
+	 * @param appId 用户id
+	 * @param startLat 起点纬度
+	 * @param startLng 起点经度
+	 * @param startName 起点名称
+	 * @param endLat 终点纬度
+	 * @param endLng 终点经度
+	 * @param endName 终点名称
+	 * @param rideType 运力类型
+	 * @param departureTime 出行时间
+	 * @return
+	 */
+	public static JSONObject estimatesPrices(String host,String appkey,String appId,String startLat
+	,String startLng,String startName,String endLat,String endLng,String endName,String rideType,String departureTime){
+		Map<String,Object> map = new HashMap<>();
+		map.put("startLat", startLat);
+		map.put("startLng", startLng);
+		map.put("startName", startName);
+		map.put("endLat", endLat);
+		map.put("endLng", endLng);
+		map.put("endName", endName);
+		map.put("rideType", rideType);
+		map.put("departureTime", departureTime);
+        String jsonMsg =JSONObject.toJSONString(map);
+        String signature = null;
+        String url = "/api/platform/estimatesPrices";
+        TokenUtil.RequestEntity req = new TokenUtil.RequestEntity();
+        req.setReqMethod(TokenUtil.REQ_METHOD_GET);
+        req.setUri(url);
+        req.setContent(jsonMsg);
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String time = dateFormat.format(new Date());
+        req.setReqTime(time);
+        req.setEncryptKey(appkey);
+        try {
+            signature = TokenUtil.generateToken(req);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        Map<String,String> headers = new HashMap<String, String>();
+        headers.put("appId", appId);
+        headers.put("reqTime",time);
+        headers.put("token",signature);
+
+        String response = PlatformUtil.doPostJson(host+url,req.getContent(),headers);
+        return JSONObject.parseObject(response);
+	}
+
+	/**
+	 * 取消订单
+	 * @param host 访问路径
+	 * @param appkey 秘钥
+	 * @param appId 用户id
+	 * @param oid 订单id
+	 * @param passengerPhone 乘客手机号(用于判断该手机号下订单唯一)
+	 * @return
+	 */
+	public static JSONObject cancleOrder(String host,String appkey,String appId,String oid
+			,String passengerPhone){
+		Map<String,Object> map = new HashMap<>();
+		map.put("startLat", oid);
+		map.put("startLng", passengerPhone);
+		String jsonMsg =JSONObject.toJSONString(map);
+		String signature = null;
+		String url = "/api/platform/cancleOrder";
+		TokenUtil.RequestEntity req = new TokenUtil.RequestEntity();
+		req.setReqMethod(TokenUtil.REQ_METHOD_POST);
+		req.setUri(url);
+		req.setContent(jsonMsg);
+		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String time = dateFormat.format(new Date());
+		req.setReqTime(time);
+		req.setEncryptKey(appkey);
+		try {
+			signature = TokenUtil.generateToken(req);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		Map<String,String> headers = new HashMap<String, String>();
+		headers.put("appId", appId);
+		headers.put("reqTime",time);
+		headers.put("token",signature);
+
+		String response = PlatformUtil.doPostJson(host+url,req.getContent(),headers);
+		return JSONObject.parseObject(response);
+	}
+
+	/**
+	 * 叫单
+	 * @param host 访问路径
+	 * @param appkey 秘钥
+	 * @param appId 用户id
+	 * @param startLat 起点纬度
+	 * @param startLng 起点经度
+	 * @param startName 起点名称
+	 * @param endLat 终点纬度
+	 * @param endLng 终点经度
+	 * @param endName 终点名称
+	 * @param rideType 运力类型
+	 * @param departureTime 出行时间
+	 * @param oid 订单id
+	 * @param passengerName 乘客手机号
+	 * @param passengerPhone 乘客名称
+	 * @param userId 第三方平台用户Id
+	 * @param userPhone 用户电话(与乘客电话相同可以不填)
+	 * @param userName 用户姓名(与乘客姓名相同可以不填)
+	 * @return
+	 */
+	public static JSONObject sendOrder(String host,String appkey,String appId,String startLat
+			,String startLng,String startName,String endLat,String endLng,String endName,String rideType,String departureTime,String oid
+	,String passengerName,String passengerPhone,String userId,String userPhone,String userName){
+		Map<String,Object> map = new HashMap<>();
+		map.put("oid", oid);
+		map.put("passengerPhone", passengerPhone);
+		map.put("userId", userId);
+		map.put("passengerName", passengerName);
+		map.put("userName", userName);
+		map.put("userPhone", userPhone);
+		map.put("startLat", startLat);
+		map.put("startLng", startLng);
+		map.put("startName", startName);
+		map.put("endLat", endLat);
+		map.put("endLng", endLng);
+		map.put("endName", endName);
+		map.put("rideType", rideType);
+		map.put("departureTime", departureTime);
+		String jsonMsg =JSONObject.toJSONString(map);
+		String signature = null;
+		String url = "/api/platform/estimatesPrices";
+		TokenUtil.RequestEntity req = new TokenUtil.RequestEntity();
+		req.setReqMethod(TokenUtil.REQ_METHOD_POST);
+		req.setUri(url);
+		req.setContent(jsonMsg);
+		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		String time = dateFormat.format(new Date());
+		req.setReqTime(time);
+		req.setEncryptKey(appkey);
+		try {
+			signature = TokenUtil.generateToken(req);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		Map<String,String> headers = new HashMap<String, String>();
+		headers.put("appId", appId);
+		headers.put("reqTime",time);
+		headers.put("token",signature);
+
+		String response = PlatformUtil.doPostJson(host+url,req.getContent(),headers);
+		return JSONObject.parseObject(response);
+	}
+	public static void main(String[] args) {
+	}
+}
+
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/TokenUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/TokenUtil.java
new file mode 100644
index 0000000..d3d9814
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/three/TokenUtil.java
@@ -0,0 +1,95 @@
+package com.stylefeng.guns.modular.system.util.three;
+
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 生成测试签名工具类
+ * @author 271755
+ *
+ */
+public class TokenUtil {
+	public static final String REQ_METHOD_GET = "GET";
+	public static final String REQ_METHOD_POST = "POST";
+	public static final String REQ_METHOD_PUT = "PUT";
+	public static final String REQ_METHOD_DELETE = "DELETE";
+	public static void main(String[] args) throws Exception {
+		RequestEntity req = new RequestEntity();
+		req.setReqMethod(REQ_METHOD_POST);
+		req.setUri("/open-web/rs/order/v1/add");
+		req.setReqTime("2015-04-14 13:21:00");
+		req.setContent("{\"senderProvince\":\"上海市\",\"senderCity\":\"上海市\",\"senderCounty\":\"闵行区\",\"senderAddress\":\"华翔路2239号\"}");
+		req.setEncryptKey("asd123");
+		System.out.println(generateToken(req));
+	}
+	public static String generateToken(RequestEntity req) throws Exception{
+		/**
+		 * 将请求方式+uri+请求时间+请求参数进行签名生成token 1.对请求方式+uri+请求时间+请求参数进行HMAC-SHA1加密
+		 * 2.对加密后的byte数组进行Base64编码
+		 */
+		StringBuffer signatureStr = new StringBuffer();
+		signatureStr.append(req.getReqMethod())
+				.append("&");
+		signatureStr.append(req.getUri()).append("&");
+		signatureStr.append(req.getReqTime())
+				.append("&");
+		signatureStr.append(StringUtils.isEmpty(req.getContent()) ? "" : req.getContent());
+		String signature = Base64Coder.encode(HMACSHA1Util.HmacSHA1Encrypt(
+				signatureStr.toString(), req.getEncryptKey()));
+		return signature;
+	}
+	public static class RequestEntity{
+		/**
+		 * 请求方式
+		 */
+		private String reqMethod;
+		/**
+		 * 请求uri
+		 */
+		private String uri;
+		/**
+		 * 请求时间
+		 */
+		private String reqTime;
+		/**
+		 * 请求参数
+		 */
+		private String content;
+		/**
+		 * 秘钥
+		 */
+		private String encryptKey;
+		public String getReqMethod() {
+			return reqMethod;
+		}
+		public void setReqMethod(String reqMethod) {
+			this.reqMethod = reqMethod;
+		}
+		public String getUri() {
+			return uri;
+		}
+		public void setUri(String uri) {
+			this.uri = uri;
+		}
+		public String getReqTime() {
+			return reqTime;
+		}
+		public void setReqTime(String reqTime) {
+			this.reqTime = reqTime;
+		}
+		public String getContent() {
+			return content;
+		}
+		public void setContent(String content) {
+			this.content = content;
+		}
+		public String getEncryptKey() {
+			return encryptKey;
+		}
+		public void setEncryptKey(String encryptKey) {
+			this.encryptKey = encryptKey;
+		}
+		
+	}
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CustomWarpper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CustomWarpper.java
new file mode 100644
index 0000000..9893e2d
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/CustomWarpper.java
@@ -0,0 +1,6 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+public class CustomWarpper {
+
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DeptWarpper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DeptWarpper.java
new file mode 100644
index 0000000..d1cb1a8
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DeptWarpper.java
@@ -0,0 +1,33 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import java.util.Map;
+
+/**
+ * 部门列表的包装
+ *
+ * @author fengshuonan
+ * @date 2017年4月25日 18:10:31
+ */
+public class DeptWarpper extends BaseControllerWarpper {
+
+    public DeptWarpper(Object list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+
+        Integer pid = (Integer) map.get("pid");
+
+        if (ToolUtil.isEmpty(pid) || pid.equals(0)) {
+            map.put("pName", "--");
+        } else {
+            map.put("pName", ConstantFactory.me().getDeptName(pid));
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DictWarpper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DictWarpper.java
new file mode 100644
index 0000000..c56a1e4
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/DictWarpper.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.modular.system.model.Dict;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典列表的包装
+ *
+ * @author fengshuonan
+ * @date 2017年4月25日 18:10:31
+ */
+public class DictWarpper extends BaseControllerWarpper {
+
+    public DictWarpper(Object list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        StringBuffer detail = new StringBuffer();
+        Integer id = Integer.valueOf(map.get("id").toString());
+        List<Dict> dicts = ConstantFactory.me().findInDict(id);
+        if(dicts != null){
+            for (Dict dict : dicts) {
+                detail.append(dict.getCode() + ":" +dict.getName() + ",");
+            }
+            map.put("detail", ToolUtil.removeSuffix(detail.toString(),","));
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LogWarpper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LogWarpper.java
new file mode 100644
index 0000000..4026c14
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LogWarpper.java
@@ -0,0 +1,40 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+import com.stylefeng.guns.core.util.Contrast;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import java.util.Map;
+
+/**
+ * 日志列表的包装类
+ *
+ * @author fengshuonan
+ * @date 2017年4月5日22:56:24
+ */
+public class LogWarpper extends BaseControllerWarpper {
+
+    public LogWarpper(Object list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        String message = (String) map.get("message");
+
+        //如果信息过长,则只截取前100位字符串
+        if (ToolUtil.isNotEmpty(message) && message.length() >= 100) {
+            String subMessage = message.substring(0, 100) + "...";
+            map.put("message", subMessage);
+        }
+
+        //如果信息中包含分割符号;;;   则分割字符串返给前台
+        if (ToolUtil.isNotEmpty(message) && message.indexOf(Contrast.separator) != -1) {
+            String[] msgs = message.split(Contrast.separator);
+            map.put("regularMessage",msgs);
+        }else{
+            map.put("regularMessage",message);
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/MenuWarpper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/MenuWarpper.java
new file mode 100644
index 0000000..3503f3e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/MenuWarpper.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.constant.IsMenu;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 菜单列表的包装类
+ *
+ * @author fengshuonan
+ * @date 2017年2月19日15:07:29
+ */
+public class MenuWarpper extends BaseControllerWarpper {
+
+    public MenuWarpper(List<Map<String, Object>> list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        map.put("statusName", ConstantFactory.me().getMenuStatusName((Integer) map.get("status")));
+        map.put("isMenuName", IsMenu.valueOf((Integer) map.get("ismenu")));
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/NoticeWrapper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/NoticeWrapper.java
new file mode 100644
index 0000000..6e5cc76
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/NoticeWrapper.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+
+import java.util.Map;
+
+/**
+ * 部门列表的包装
+ *
+ * @author fengshuonan
+ * @date 2017年4月25日 18:10:31
+ */
+public class NoticeWrapper extends BaseControllerWarpper {
+
+    public NoticeWrapper(Object list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        Integer creater = (Integer) map.get("creater");
+        map.put("createrName", ConstantFactory.me().getUserNameById(creater));
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RoleWarpper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RoleWarpper.java
new file mode 100644
index 0000000..172961b
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RoleWarpper.java
@@ -0,0 +1,27 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 角色列表的包装类
+ *
+ * @author fengshuonan
+ * @date 2017年2月19日10:59:02
+ */
+public class RoleWarpper extends BaseControllerWarpper {
+
+    public RoleWarpper(List<Map<String, Object>> list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        map.put("pName", ConstantFactory.me().getSingleRoleName((Integer) map.get("pid")));
+        map.put("deptName", ConstantFactory.me().getDeptName((Integer) map.get("deptid")));
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TFeedbackWarpper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TFeedbackWarpper.java
new file mode 100644
index 0000000..654ddd3
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/TFeedbackWarpper.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import java.util.Map;
+
+/**
+ * 意见反馈列表的包装
+ */
+public class TFeedbackWarpper extends BaseControllerWarpper {
+
+    public TFeedbackWarpper(Object list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        Integer userId = (Integer) map.get("userId");
+        if (ToolUtil.isEmpty(userId) || userId.equals(0)) {
+            map.put("userId", "--");
+        } else {
+            map.put("userId", ConstantFactory.me().getTUserNickNameById(userId));
+        }
+    }
+
+}
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserWarpper.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserWarpper.java
new file mode 100644
index 0000000..643677e
--- /dev/null
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/UserWarpper.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.modular.system.warpper;
+
+import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户管理的包装类
+ *
+ * @author fengshuonan
+ * @date 2017年2月13日 下午10:47:03
+ */
+public class UserWarpper extends BaseControllerWarpper {
+
+    public UserWarpper(List<Map<String, Object>> list) {
+        super(list);
+    }
+
+    @Override
+    public void warpTheMap(Map<String, Object> map) {
+        map.put("sexName", ConstantFactory.me().getSexName((Integer) map.get("sex")));
+        map.put("roleName", ConstantFactory.me().getRoleName((String) map.get("roleid")));
+        map.put("deptName", ConstantFactory.me().getDeptName((Integer) map.get("deptid")));
+        map.put("statusName", ConstantFactory.me().getStatusName((Integer) map.get("status")));
+    }
+
+}
diff --git a/management/guns-admin/src/main/resources/META-INF/spring-devtools.properties b/management/guns-admin/src/main/resources/META-INF/spring-devtools.properties
new file mode 100644
index 0000000..3e72835
--- /dev/null
+++ b/management/guns-admin/src/main/resources/META-INF/spring-devtools.properties
@@ -0,0 +1 @@
+restart.include.beetl=/beetl-2.8.5.jar
\ No newline at end of file
diff --git a/management/guns-admin/src/main/resources/application.yml b/management/guns-admin/src/main/resources/application.yml
new file mode 100644
index 0000000..2671d7b
--- /dev/null
+++ b/management/guns-admin/src/main/resources/application.yml
@@ -0,0 +1,104 @@
+server:
+  port: 8010
+
+guns:
+  swagger-open: true              #是否开启swagger (true/false)
+  kaptcha-open: false             #是否开启登录时验证码 (true/false)
+  spring-session-open: false      #是否开启spring session,如果是多机环境需要开启(true/false)
+  session-invalidate-time: 1800     #session失效时间(只在单机环境下生效,多机环境在SpringSessionConfig类中配置) 单位:秒
+  session-validation-interval: 900  #多久检测一次失效的session(只在单机环境下生效) 单位:秒
+#  file-upload-path: C:\Users\hi\Desktop\ #文件上传目录(不配置的话为java.io.tmpdir目录)
+#  picture-server-address: http://192.168.0.43/resources/  #图片服务器地址
+  file-upload-path: C:\Users\Administrator\Desktop\apache-tomcat-8.0.33\webapps\ROOT\upload\ #文件上传目录(不配置的话为java.io.tmpdir目录)
+  picture-server-address: http://139.9.249.67:8080/upload/  #图片服务器地址
+  rest-url: http://139.9.249.67:8080/rest/    #前端接口调用基础路径
+
+spring:
+  profiles:
+    active: local
+  mvc:
+    static-path-pattern: /static/**
+    view:
+      prefix: /WEB-INF/view
+  devtools:
+    restart:
+      enabled: false
+      additional-paths: src/main/java
+      exclude: static/**,WEB-INF/view/**
+  servlet:
+    multipart:
+      max-request-size: 100MB
+      max-file-size: 100MB
+
+mybatis-plus:
+  type-aliases-package: com.stylefeng.guns.modular.system.model
+  global-config:
+    id-type: 0  #0:数据库ID自增   1:用户输入id  2:全局唯一id(IdWorker)  3:全局唯一ID(uuid)
+    db-column-underline: false
+  configuration:
+    configuration.map-underscore-to-camel-case: true #是否开启自动驼峰命名规则(camel case)映射
+    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl #输出Sql,如需打印Sql注释该配置
+
+
+
+#eureka:
+#  client:
+#    service-url: #注册中心地址
+#      defaultZone: http://sinata:sinata@139.9.249.67:8000/eureka #启用身份验证的方式连接
+#    register-with-eureka: true #在注册中心进行注册
+#    fetch-registry: true #从Eureka中获取注册信息。
+
+
+---
+
+#spring:
+#  profiles: local
+#  datasource:
+#    url: jdbc:mysql://Rm-wz9rpe0t74ys3b1h8go.mysql.rds.aliyuncs.com:3306/oktravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
+#    username: root
+#    password: Root2020!
+#    db-name: guns #用来搜集数据库的所有表
+#    filters: wall,mergeStat
+
+
+spring:
+  profiles: local
+  datasource:
+    url: jdbc:mysql://192.168.0.80:3306/super_save_driving?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8
+    username: root
+    password: 123456
+    db-name: oktravel #用来搜集数据库的所有表
+    filters: wall,mergeStat
+
+
+
+#多数据源情况的配置
+guns:
+  muti-datasource:
+    open: false
+    url: jdbc:mysql://120.24.34.190:3306/mask?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8
+    username: root
+    password: Root2020!
+    dataSourceNames:
+      - dataSourceGuns
+      - dataSourceBiz
+
+---
+
+spring:
+  profiles: produce
+  datasource:
+      url: jdbc:mysql://120.24.34.190:3306/mask?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8
+      username: root
+      password: Root2020!
+      db-name: mask #用来搜集数据库的所有表
+      filters: wall,mergeStat
+
+---
+
+filePath: /usr/local/server/orderPostionFile/ #存储订单轨迹文件路径
+#filePath: C:/orderPostionFile/  #存储订单轨迹文件路径
+
+
+#交通部推送数据功能开关
+pushMinistryOfTransport: true
\ No newline at end of file
diff --git a/management/guns-admin/src/main/resources/ehcache.xml b/management/guns-admin/src/main/resources/ehcache.xml
new file mode 100644
index 0000000..1e47379
--- /dev/null
+++ b/management/guns-admin/src/main/resources/ehcache.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="ehcache.xsd"
+         updateCheck="false" monitoring="autodetect"
+         dynamicConfig="true" >
+         
+    <diskStore path="java.io.tmpdir/ehcache"/>
+
+    <defaultCache
+            maxElementsInMemory="50000"
+            eternal="false"
+            timeToIdleSeconds="3600"
+            timeToLiveSeconds="3600"
+            overflowToDisk="true"
+            diskPersistent="false"
+            diskExpiryThreadIntervalSeconds="120"
+    />
+
+    <!-- 全局变量:永不过期-->
+    <cache name="CONSTANT"
+    	   maxElementsInMemory="50000"
+           eternal="true"
+    	   clearOnFlush="false"
+           overflowToDisk="true"
+           diskSpoolBufferSizeMB="1024"
+           maxElementsOnDisk="100000"
+           diskPersistent="false"
+           diskExpiryThreadIntervalSeconds="120"
+           memoryStoreEvictionPolicy="LFU"
+           transactionalMode="off">
+    </cache>
+
+</ehcache>
+
+    <!--
+	    maxElementsInMemory="10000" 	//Cache中最多允许保存的数据对象的数量
+		external="false" 				//缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期 	
+		timeToLiveSeconds="3600"  		//缓存的存活时间,从开始创建的时间算起
+		timeToIdleSeconds="3600"  		//多长时间不访问该缓存,那么ehcache 就会清除该缓存  
+		
+		这两个参数很容易误解,看文档根本没用,我仔细分析了ehcache的代码。结论如下:
+		1、timeToLiveSeconds的定义是:以创建时间为基准开始计算的超时时长;
+		2、timeToIdleSeconds的定义是:在创建时间和最近访问时间中取出离现在最近的时间作为基准计算的超时时长;
+		3、如果仅设置了timeToLiveSeconds,则该对象的超时时间=创建时间+timeToLiveSeconds,假设为A;
+		4、如果没设置timeToLiveSeconds,则该对象的超时时间=min(创建时间,最近访问时间)+timeToIdleSeconds,假设为B;
+		5、如果两者都设置了,则取出A、B最少的值,即min(A,B),表示只要有一个超时成立即算超时。
+		
+		overflowToDisk="true"    		//内存不足时,是否启用磁盘缓存  	
+		diskSpoolBufferSizeMB	//设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
+		maxElementsOnDisk		//硬盘最大缓存个数
+		diskPersistent			//是否缓存虚拟机重启期数据The default value is false	
+		diskExpiryThreadIntervalSeconds	//磁盘失效线程运行时间间隔,默认是120秒。
+		memoryStoreEvictionPolicy="LRU" //当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
+        clearOnFlush	//内存数量最大时是否清除
+        maxEntriesLocalHeap="0"  //堆内存中最大缓存对象数,0没有限制
+        maxEntriesLocalDisk="1000" //硬盘最大缓存个数。
+    -->
diff --git a/management/guns-admin/src/main/resources/logback-spring.xml b/management/guns-admin/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..894a46b
--- /dev/null
+++ b/management/guns-admin/src/main/resources/logback-spring.xml
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+    <!--定义日志存放的位置-->
+    <springProperty scope="context" name="gunsLogPath" source="log.path" defaultValue="guns-logs"/>
+
+    <!-- ****************************************************************************************** -->
+    <!-- ****************************** 本地开发只在控制台打印日志 ******************************** -->
+    <!-- ****************************************************************************************** -->
+    <springProfile name="local">
+
+        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+            <!--encoder 默认配置为PatternLayoutEncoder-->
+            <encoder>
+                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %logger Line:%-3L - %msg%n</pattern>
+                <charset>utf-8</charset>
+            </encoder>
+        </appender>
+
+        <!-- 日志记录器,日期滚动记录 -->
+        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+            <!-- 正在记录的日志文件的路径及文件名 -->
+            <file>${gunsLogPath}/log_error.log</file>
+            <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+                而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+                <fileNamePattern>${gunsLogPath}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+                <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+                命名日志文件,例如log-error-2013-12-21.0.log -->
+                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                    <maxFileSize>2MB</maxFileSize>
+                </timeBasedFileNamingAndTriggeringPolicy>
+            </rollingPolicy>
+            <!-- 追加方式记录日志 -->
+            <append>true</append>
+            <!-- 日志文件的格式 -->
+            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
+                <charset>utf-8</charset>
+            </encoder>
+            <!-- 日志文件记录级别配置。
+                日志级别:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
+                onMatch="ACCEPT" 表示匹配该级别及以上
+                onMatch="DENY" 表示不匹配该级别及以上
+                onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
+                onMismatch="ACCEPT" 表示匹配该级别以下
+                onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
+                onMismatch="DENY" 表示不匹配该级别以下的
+             -->
+            <filter class="ch.qos.logback.classic.filter.LevelFilter">
+                <level>ERROR</level>
+                <onMatch>ACCEPT</onMatch>
+                <onMismatch>DENY</onMismatch>
+            </filter>
+        </appender>
+
+        <root level="INFO">
+            <appender-ref ref="STDOUT"/>
+            <appender-ref ref="FILE"/>
+        </root>
+    </springProfile>
+
+    <!-- ****************************************************************************************** -->
+    <!-- ********************** 放到服务器上不管在什么环境都只在文件记录日志 ********************** -->
+    <!-- ****************************************************************************************** -->
+    <springProfile name="!local">
+
+        <!-- 日志记录器,日期滚动记录 -->
+        <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+            <!-- 正在记录的日志文件的路径及文件名 -->
+            <file>${gunsLogPath}/log_error.log</file>
+            <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+                而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+                <fileNamePattern>${gunsLogPath}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+                <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+                命名日志文件,例如log-error-2013-12-21.0.log -->
+                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                    <maxFileSize>2MB</maxFileSize>
+                </timeBasedFileNamingAndTriggeringPolicy>
+            </rollingPolicy>
+            <!-- 追加方式记录日志 -->
+            <append>true</append>
+            <!-- 日志文件的格式 -->
+            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+                <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
+                <charset>utf-8</charset>
+            </encoder>
+            <!-- 此日志文件只记录error级别的 -->
+            <filter class="ch.qos.logback.classic.filter.LevelFilter">
+                <level>error</level>
+                <onMatch>ACCEPT</onMatch>
+                <onMismatch>DENY</onMismatch>
+            </filter>
+        </appender>
+
+        <!-- 日志记录器,日期滚动记录 -->
+        <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+            <!-- 正在记录的日志文件的路径及文件名 -->
+            <file>${gunsLogPath}/log_total.log</file>
+            <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+                而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+                <fileNamePattern>${gunsLogPath}/total/log-total-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+                <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
+                命名日志文件,例如log-error-2013-12-21.0.log -->
+                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                    <maxFileSize>2MB</maxFileSize>
+                </timeBasedFileNamingAndTriggeringPolicy>
+            </rollingPolicy>
+            <!-- 追加方式记录日志 -->
+            <append>true</append>
+            <!-- 日志文件的格式 -->
+            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+                <pattern>===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
+                <charset>utf-8</charset>
+            </encoder>
+        </appender>
+
+        <root level="INFO">
+            <appender-ref ref="FILE_ERROR"/>
+            <appender-ref ref="FILE_ALL"/>
+        </root>
+
+    </springProfile>
+
+</configuration>
+
+
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/404.html b/management/guns-admin/src/main/webapp/WEB-INF/view/404.html
new file mode 100644
index 0000000..7c3e291
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/404.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+
+    <title>OK出行 - 404 页面</title>
+    <link rel="shortcut icon" href="${ctxPath}/static/favicon1.ico"> <link href="${ctxPath}/static/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="${ctxPath}/static/css/font-awesome.css?v=4.4.0" rel="stylesheet">
+    <link href="${ctxPath}/static/css/style.css?v=4.1.0" rel="stylesheet">
+
+</head>
+
+<body class="gray-bg">
+
+
+    <div class="middle-box text-center">
+        <h1>404</h1>
+        <h3 class="font-bold">页面未找到!</h3>
+
+        <div class="error-desc">
+            抱歉,页面好像去火星了~
+            <!--<form class="form-inline m-t" role="form">
+                <div class="form-group">
+                    <input type="email" class="form-control" placeholder="请输入您需要查找的内容 …">
+                </div>
+                <button type="submit" class="btn btn-primary">搜索</button>
+            </form>-->
+        </div>
+    </div>
+
+    <!-- 全局js -->
+    <script src="${ctxPath}/static/js/jquery.min.js?v=2.1.4"></script>
+    <script src="${ctxPath}/static/js/bootstrap.min.js?v=3.3.6"></script>
+
+</body>
+
+</html>
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/blackboard.html b/management/guns-admin/src/main/webapp/WEB-INF/view/blackboard.html
new file mode 100644
index 0000000..f3710fe
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/blackboard.html
@@ -0,0 +1,634 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+	.ztree li span.button.add {margin-left:4px; margin-right: -1px; background-position:-144px 0; vertical-align:top; *vertical-align:middle}
+	.titleDiv{
+		overflow: hidden;
+	}
+	.titleItem{
+		float: left;text-align: center;width: 180px;
+		line-height: 40px;border-top:1px solid #E7EBEE;border-bottom: 1px solid #E7EBEE;
+		border-left:1px solid #E7EBEE;font-size: 16px;
+	}
+	.titleItemCk{
+		color: #fff !important;background: #1AB395 !important;
+	}
+	.titleItem:last-child{
+		border-right: 1px solid #E7EBEE;
+	}
+	.ibox-title{
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+	}
+	.ibox-title div span{
+		cursor: pointer;
+	}
+	.ibox-title div span.active{
+		color:white;
+		background: #3d91d9;
+		border-radius: 4px;
+	}
+	.ibox-content{
+		min-height: 130px;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+	}
+	.sp-item{
+		padding:2px 8px;
+
+	}
+	.sp-col{
+		font-size: 18px;
+	}
+	.sp-hidden{
+		visibility: hidden !important;
+	}
+	.flex-div{
+		display: flex;
+		align-items: center;
+		position: relative;
+		flex-wrap: nowrap;
+	}
+	\@media screen and (min-width: 1200px) {
+		.sp-width {
+			width:260px;
+		}
+	}
+	\@media screen and (max-width: 1200px) {
+		.sp-width {
+			width: 180px;
+		}
+	}
+
+</style>
+<div class="container-fluid" style="padding: 0 !important;">
+	<div class="row content">
+		<div class="col-sm-12">
+			<div class="col-sm-3">
+				<div class="ibox float-e-margins">
+					<div class="ibox-title">
+						<h3>待处理</h3>
+					</div>
+					<a class="J_menuItem" href="javascript:void(0);" onclick="goddess()" name="tabMenuItem" data-index="27">
+						<div class="ibox-content">
+							<h1 class="no-margins">${goddessCount}</h1>
+							<small>待处理女神认证</small>
+						</div>
+					</a>
+					<a class="J_menuItem" href="javascript:void(0);" onclick="withdrawal()" name="tabMenuItem" data-index="27">
+						<div class="ibox-content">
+							<h1 class="no-margins">${withdrawalCount}</h1>
+							<small>待处理提现申请</small>
+						</div>
+					</a>
+					<a class="J_menuItem" href="javascript:void(0);" onclick="report()" name="tabMenuItem" data-index="27">
+						<div class="ibox-content">
+							<h1 class="no-margins">${reportCount}</h1>
+							<small>待处理用户举报</small>
+						</div>
+					</a>
+					<a class="J_menuItem" href="javascript:void(0);" onclick="feedback()" name="tabMenuItem" data-index="27">
+						<div class="ibox-content">
+							<h1 class="no-margins">${feedbackCount}</h1>
+							<small>待处理用户反馈</small>
+						</div>
+					</a>
+				</div>
+			</div>
+			<div class="col-sm-9">
+				<div class="col-sm-4 ">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<h3>非会员付费解锁</h3>
+							<div id="noVipUnlockDiv" class="flex-div">
+								<div class="sp-hidden flex-div noVipUnlockTimess sp-width" style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);">
+									<input type="text" id="noVipUnlockTime" class="form-control layer-date " >
+									<#button style="margin: 0;" btnCs="info" name="搜索" id="ensure" icon="fa-check" clickFun="noVipUnlockSubmit()"/>
+								</div>
+								<div class="noVipUnlockTimes flex-div"  style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);width: 180px;justify-content: flex-end;">
+									<span class="active sp-item">今日</span>
+									<span class="sp-item">本周</span>
+									<span class="sp-item">本月</span>
+								</div>
+								<div class="noVipUnlockSpan" onclick="noVipUnlockTime()" style="margin-left: 20px;"><i class="fa fa-calendar-plus-o"></i></div>
+							</div>
+						</div>
+						<div class="ibox-content">
+							<h1 class="sp-col" style="width: 100%;">订单数<span style="margin-left: 50px;font-size: 28px;" id="noVipUnlockNum">${noVipUnlockNumToDay}</span>单</h1>
+							<h1 class="sp-col" style="width: 100%;">成交额<span style="margin-left: 50px;font-size: 28px;" id="noVipUnlockMoney">${noVipUnlockMoneyToDay}</span>元</h1>
+						</div>
+					</div>
+				</div>
+				<div class="col-sm-4">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<h3>会员付费解锁</h3>
+							<div id="vipUnlockDiv" class="flex-div">
+								<div class="sp-hidden flex-div vipUnlockTimess sp-width" style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);">
+									<input type="text" id="vipUnlockTime" class="form-control layer-date " >
+									<#button style="margin: 0;" btnCs="info" name="搜索" id="ensure" icon="fa-check" clickFun="vipUnlockSubmit()"/>
+								</div>
+								<div class="vipUnlockTimes flex-div"  style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);width: 180px;justify-content: flex-end;">
+									<span class="active sp-item">今日</span>
+									<span class="sp-item">本周</span>
+									<span class="sp-item">本月</span>
+								</div>
+								<div class="vipUnlockSpan" onclick="vipUnlockTime()" style="margin-left: 20px;"><i class="fa fa-calendar-plus-o"></i></div>
+							</div>
+						</div>
+						<div class="ibox-content">
+							<h1 class="sp-col" style="width: 100%;">订单数<span style="margin-left: 50px;font-size: 28px;" id="vipUnlockNum">${vipUnlockNumToDay}</span>单</h1>
+							<h1 class="sp-col" style="width: 100%;">成交额<span style="margin-left: 50px;font-size: 28px;" id="vipUnlockMoney">${vipUnlockMoneyToDay}</span>元</h1>
+						</div>
+					</div>
+				</div>
+				<div class="col-sm-4">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<h3>总营收</h3>
+							<div id="allIncomeDiv" class="flex-div">
+								<div class="sp-hidden flex-div allIncomeTimess sp-width" style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);">
+									<input type="text" id="allIncomeTime" class="form-control layer-date " >
+									<#button style="margin: 0;" btnCs="info" name="搜索" id="ensure" icon="fa-check" clickFun="allIncomeSubmit()"/>
+								</div>
+								<div class="allIncomeTimes flex-div"  style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);width: 180px;justify-content: flex-end;">
+									<span class="active sp-item">今日</span>
+									<span class="sp-item">本周</span>
+									<span class="sp-item">本月</span>
+								</div>
+								<div class="allIncomeSpan" onclick="allIncomeTime()" style="margin-left: 20px;"><i class="fa fa-calendar-plus-o"></i></div>
+							</div>
+						</div>
+						<div class="ibox-content">
+							<h1 class="sp-col" style="width: 100%;">订单数<span style="margin-left: 50px;font-size: 28px;" id="allIncomeNum">${allIncomeNumToDay}</span>单</h1>
+							<h1 class="sp-col" style="width: 100%;">成交额<span style="margin-left: 50px;font-size: 28px;" id="allIncomeMoney">${allIncomeMoneyToDay}</span>元</h1>
+						</div>
+					</div>
+				</div>
+				<div class="col-sm-4">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<h3>新增会员</h3>
+							<div id="addVipDiv" class="flex-div">
+								<div class="sp-hidden flex-div addVipTimess sp-width" style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);">
+									<input type="text" id="addVipTime" class="form-control layer-date " >
+									<#button style="margin: 0;" btnCs="info" name="搜索" id="ensure" icon="fa-check" clickFun="addVipSubmit()"/>
+								</div>
+								<div class="addVipTimes flex-div"  style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);width: 180px;justify-content: flex-end;">
+									<span class="active sp-item">今日</span>
+									<span class="sp-item">本周</span>
+									<span class="sp-item">本月</span>
+								</div>
+								<div class="addVipSpan" onclick="addVipTime()" style="margin-left: 20px;"><i class="fa fa-calendar-plus-o"></i></div>
+							</div>
+						</div>
+						<div class="ibox-content">
+							<h1 class="sp-col" style="width: 100%;">新增数<span style="margin-left: 50px;font-size: 28px;" id="addVipNum">${addVipNumToDay}</span>位</h1>
+							<h1 class="sp-col" style="width: 100%;">新增收益<span style="margin-left: 50px;font-size: 28px;" id="addVipMoney">${addVipMoneyToDay}</span>元</h1>
+						</div>
+					</div>
+				</div>
+				<div class="col-sm-4">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<h3>发布活动付费</h3>
+							<div id="sendActiveDiv" class="flex-div">
+								<div class="sp-hidden flex-div sendActiveTimess sp-width" style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);">
+									<input type="text" id="sendActiveTime" class="form-control layer-date " >
+									<#button style="margin: 0;" btnCs="info" name="搜索" id="ensure" icon="fa-check" clickFun="sendActiveSubmit()"/>
+								</div>
+								<div class="sendActiveTimes flex-div"  style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);width: 180px;justify-content: flex-end;">
+									<span class="active sp-item">今日</span>
+									<span class="sp-item">本周</span>
+									<span class="sp-item">本月</span>
+								</div>
+								<div class="sendActiveSpan" onclick="sendActiveTime()" style="margin-left: 20px;"><i class="fa fa-calendar-plus-o"></i></div>
+							</div>
+						</div>
+						<div class="ibox-content">
+							<h1 class="sp-col" style="width: 100%;">订单数<span style="margin-left: 50px;font-size: 28px;" id="sendActiveNum">${sendActiveNumDay}</span>单</h1>
+							<h1 class="sp-col" style="width: 100%;">成交额<span style="margin-left: 50px;font-size: 28px;" id="sendActiveMoney">${sendActiveMoneyToDay}</span>元</h1>
+						</div>
+					</div>
+				</div>
+				<div class="col-sm-4">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<h3>历史总营收</h3>
+						</div>
+						<div class="ibox-content">
+							<h1 class="sp-col" style="text-align: center;"><span style="font-size: 28px;">${historyIncomeMoney}</span>元</h1>
+						</div>
+					</div>
+				</div>
+				<div class="col-sm-4">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<h4>新增用户</h4>
+							<div id="userDiv" class="flex-div">
+								<div class="sp-hidden flex-div userTimess sp-width" style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);">
+									<input type="text" id="userTime" class="form-control layer-date " >
+									<#button style="margin: 0;" btnCs="info" name="搜索" id="ensure" icon="fa-check" clickFun="userSubmit()"/>
+								</div>
+								<div class="userTimes flex-div"  style="position: absolute;right: 40px;top: 50%;transform: translateY(-50%);width: 180px;justify-content: flex-end;">
+									<span class="active sp-item">今日</span>
+									<span class="sp-item">本周</span>
+									<span class="sp-item">本月</span>
+								</div>
+								<div class="userSpan" onclick="userTime()" style="margin-left: 20px;"><i class="fa fa-calendar-plus-o"></i></div>
+							</div>
+						</div>
+						<div class="ibox-content">
+							<h1 class="sp-col" style="text-align: center;"><span style="font-size: 28px;" id="userNum">${userNumToDay}</span>位</h1>
+							<div class="sp-col" style="display: flex;justify-content: space-between;width: 100%;">
+								<div style="text-align: center;display: inline-block;">男<span style="font-size: 28px;margin: 0 10px" id="maleUserNum">${maleUserNumToDay}</span>位</div>
+								<div style="text-align: center;display: inline-block;">女<span style="font-size: 28px;margin: 0 10px" id="femaleUserNum">${femaleUserNumToDay}</span>位</div>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="col-sm-4">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<h3>总用户数</h3>
+						</div>
+						<div class="ibox-content">
+							<h1 class="sp-col" style="text-align: center;"><span style="font-size: 28px;" >${userNum}</span>位</h1>
+							<div class="sp-col" style="display: flex;justify-content: space-between;width: 100%;">
+								<div style="text-align: center;display: inline-block;">男<span style="font-size: 28px;margin: 0 10px" >${maleUserNum}</span>位</div>
+								<div style="text-align: center;display: inline-block;">女<span style="font-size: 28px;margin: 0 10px" >${femaleUserNum}</span>位</div>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="col-sm-4">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<h3>总会员数</h3>
+						</div>
+						<div class="ibox-content">
+							<h1 class="sp-col" style="text-align: center;"><span style="font-size: 28px;">${allVipNum}</span>位</h1>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<link rel="icon" href="https://static.jianshukeji.com/highcharts/images/favicon1.ico">
+<script>
+    laydate.render({
+        elem: '#noVipUnlockTime'
+        ,range: true
+    });
+    laydate.render({
+        elem: '#vipUnlockTime'
+        ,range: true
+    });
+    laydate.render({
+        elem: '#allIncomeTime'
+        ,range: true
+    });
+    laydate.render({
+        elem: '#addVipTime'
+        ,range: true
+    });
+    laydate.render({
+        elem: '#sendActiveTime'
+        ,range: true
+    });
+    laydate.render({
+        elem: '#userTime'
+        ,range: true
+    });
+</script>
+<script type="text/javascript">
+    $(function () {
+        //非会员解锁
+        $("#noVipUnlockDiv span").click(function () {
+            $(this).addClass("active").siblings().removeClass("active");
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/noVipUnlock", function (data) {
+                $("#noVipUnlockNum").html(data.noVipUnlockNum);
+                $("#noVipUnlockMoney").html(data.noVipUnlockMoney);
+            }, function (data) {
+            });
+            ajax.set("active",$(this).html());
+            ajax.start();
+        });
+        //会员解锁
+        $("#vipUnlockDiv span").click(function () {
+            $(this).addClass("active").siblings().removeClass("active");
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/vipUnlock", function (data) {
+                $("#vipUnlockNum").html(data.vipUnlockNum);
+                $("#vipUnlockMoney").html(data.vipUnlockMoney);
+            }, function (data) {
+            });
+            ajax.set("active",$(this).html());
+            ajax.start();
+        });
+        //总营收
+        $("#allIncomeDiv span").click(function () {
+            $(this).addClass("active").siblings().removeClass("active");
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/allIncome", function (data) {
+                $("#allIncomeNum").html(data.allIncomeNum);
+                $("#allIncomeMoney").html(data.allIncomeMoney);
+            }, function (data) {
+            });
+            ajax.set("active",$(this).html());
+            ajax.start();
+        });
+        //新增会员
+        $("#addVipDiv span").click(function () {
+            $(this).addClass("active").siblings().removeClass("active");
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/addVip", function (data) {
+                $("#addVipNum").html(data.addVipNum);
+                $("#addVipMoney").html(data.addVipMoney);
+            }, function (data) {
+            });
+            ajax.set("active",$(this).html());
+            ajax.start();
+        });
+        //发布活动付费
+        $("#sendActiveDiv span").click(function () {
+            $(this).addClass("active").siblings().removeClass("active");
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/sendActive", function (data) {
+                $("#sendActiveNum").html(data.sendActiveNum);
+                $("#sendActiveMoney").html(data.sendActiveMoney);
+            }, function (data) {
+            });
+            ajax.set("active",$(this).html());
+            ajax.start();
+        });
+        //新增用户
+        $("#userDiv span").click(function () {
+            $(this).addClass("active").siblings().removeClass("active");
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/user", function (data) {
+                $("#userNum").html(data.userNum);
+                $("#maleUserNum").html(data.maleUserNum);
+                $("#femaleUserNum").html(data.femaleUserNum);
+            }, function (data) {
+            });
+            ajax.set("active",$(this).html());
+            ajax.start();
+        });
+    });
+
+    function goddess() {
+        var index = layer.open({
+            type: 2,
+            title: '待处理女神认证',
+            area: ['80%', '80%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/appUserAuth'
+        });
+        this.layerIndex = index;
+    }
+    function withdrawal() {
+        var index = layer.open({
+            type: 2,
+            title: '待处理提现申请',
+            area: ['80%', '80%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/appUserWithdrawal'
+        });
+        this.layerIndex = index;
+    }
+    function report() {
+        var index = layer.open({
+            type: 2,
+            title: '待处理用户举报',
+            area: ['80%', '80%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/appUserReport'
+        });
+        this.layerIndex = index;
+    }
+    function feedback() {
+        var index = layer.open({
+            type: 2,
+            title: '待处理用户反馈',
+            area: ['80%', '80%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/appUserFeedback'
+        });
+        this.layerIndex = index;
+    }
+
+	//非会员解锁日期选择切换
+    function noVipUnlockTime() {
+        $('.noVipUnlockSpan').toggleClass("active");
+        $('.noVipUnlockTimess').toggleClass("sp-hidden");
+        $('.noVipUnlockTimes').toggleClass('sp-hidden');
+        $("#noVipUnlockNum").html("0");
+        $("#noVipUnlockMoney").html("0");
+        $("#noVipUnlockTime").val("");
+        if ($(".noVipUnlockTimess").hasClass('sp-hidden')){
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/noVipUnlock", function (data) {
+                $("#noVipUnlockNum").html(data.noVipUnlockNum);
+                $("#noVipUnlockMoney").html(data.noVipUnlockMoney);
+            }, function (data) {
+            });
+            ajax.set("active",$("#noVipUnlockDiv .active").html());
+            ajax.start();
+        }
+    }
+	//非会员解锁日期选择提交
+    function  noVipUnlockSubmit(){
+        var time = $("#noVipUnlockTime").val();
+        if ("" == time) {
+            Feng.info("请选择查询时间");
+            return;
+        }
+        var ajax = new $ax(Feng.ctxPath + "/blackboard/noVipUnlockSubmit", function (data) {
+            $("#noVipUnlockNum").html(data.noVipUnlockNum);
+            $("#noVipUnlockMoney").html(data.noVipUnlockMoney);
+        }, function (data) {
+        });
+        ajax.set("time",time);
+        ajax.start();
+    }
+
+    // 会员解锁日期选择切换
+	function vipUnlockTime() {
+        $('.vipUnlockSpan').toggleClass("active");
+		$('.vipUnlockTimess').toggleClass("sp-hidden");
+		$('.vipUnlockTimes').toggleClass('sp-hidden');
+        $("#vipUnlockNum").html("0");
+        $("#vipUnlockMoney").html("0");
+        $("#vipUnlockTime").val("");
+        if ($(".vipUnlockTimess").hasClass('sp-hidden')){
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/vipUnlock", function (data) {
+                $("#vipUnlockNum").html(data.vipUnlockNum);
+                $("#vipUnlockMoney").html(data.vipUnlockMoney);
+            }, function (data) {
+            });
+            ajax.set("active",$("#vipUnlockDiv .active").html());
+            ajax.start();
+		}
+    }
+	// 会员解锁日期选择提交
+    function vipUnlockSubmit(){
+		var time = $("#vipUnlockTime").val();
+		if ("" == time) {
+		    Feng.info("请选择查询时间");
+		    return;
+		}
+        var ajax = new $ax(Feng.ctxPath + "/blackboard/vipUnlockSubmit", function (data) {
+            $("#vipUnlockNum").html(data.vipUnlockNum);
+            $("#vipUnlockMoney").html(data.vipUnlockMoney);
+        }, function (data) {
+        });
+        ajax.set("time",time);
+        ajax.start();
+    }
+
+
+    // 总营收日期选择切换
+	function allIncomeTime() {
+        $('.allIncomeSpan').toggleClass("active");
+		$('.allIncomeTimess').toggleClass("sp-hidden");
+		$('.allIncomeTimes').toggleClass('sp-hidden');
+        $("#allIncomeNum").html("0");
+        $("#allIncomeMoney").html("0");
+        $("#allIncomeTime").val("");
+        if ($(".allIncomeTimess").hasClass('sp-hidden')){
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/allIncome", function (data) {
+                $("#allIncomeNum").html(data.allIncomeNum);
+                $("#allIncomeMoney").html(data.allIncomeMoney);
+            }, function (data) {
+            });
+            ajax.set("active",$("#allIncomeDiv .active").html());
+            ajax.start();
+		}
+    }
+	// 总营收日期选择提交
+    function allIncomeSubmit(){
+		var time = $("#allIncomeTime").val();
+		if ("" == time) {
+		    Feng.info("请选择查询时间");
+		    return;
+		}
+        var ajax = new $ax(Feng.ctxPath + "/blackboard/allIncomeSubmit", function (data) {
+            $("#allIncomeNum").html(data.allIncomeNum);
+            $("#allIncomeMoney").html(data.allIncomeMoney);
+        }, function (data) {
+        });
+        ajax.set("time",time);
+        ajax.start();
+    }
+
+
+    // 新增会员日期选择切换
+	function addVipTime() {
+        $('.addVipSpan').toggleClass("active");
+		$('.addVipTimess').toggleClass("sp-hidden");
+		$('.addVipTimes').toggleClass('sp-hidden');
+        $("#addVipNum").html("0");
+        $("#addVipMoney").html("0");
+        $("#addVipTime").val("");
+        if ($(".addVipTimess").hasClass('sp-hidden')){
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/addVip", function (data) {
+                $("#addVipNum").html(data.addVipNum);
+                $("#addVipMoney").html(data.addVipMoney);
+            }, function (data) {
+            });
+            ajax.set("active",$("#addVipDiv .active").html());
+            ajax.start();
+		}
+    }
+	// 新增会员日期选择提交
+    function addVipSubmit(){
+		var time = $("#addVipTime").val();
+		if ("" == time) {
+		    Feng.info("请选择查询时间");
+		    return;
+		}
+        var ajax = new $ax(Feng.ctxPath + "/blackboard/addVipSubmit", function (data) {
+            $("#addVipNum").html(data.addVipNum);
+            $("#addVipMoney").html(data.addVipMoney);
+        }, function (data) {
+        });
+        ajax.set("time",time);
+        ajax.start();
+    }
+
+
+    // 发布活动付费日期选择切换
+	function sendActiveTime() {
+        $('.sendActiveSpan').toggleClass("active");
+		$('.sendActiveTimess').toggleClass("sp-hidden");
+		$('.sendActiveTimes').toggleClass('sp-hidden');
+        $("#sendActiveNum").html("0");
+        $("#sendActiveMoney").html("0");
+        $("#sendActiveTime").val("");
+        if ($(".sendActiveTimess").hasClass('sp-hidden')){
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/sendActive", function (data) {
+                $("#sendActiveNum").html(data.sendActiveNum);
+                $("#sendActiveMoney").html(data.sendActiveMoney);
+            }, function (data) {
+            });
+            ajax.set("active",$("#sendActiveDiv .active").html());
+            ajax.start();
+		}
+    }
+	// 发布活动付费日期选择提交
+    function sendActiveSubmit(){
+		var time = $("#sendActiveTime").val();
+		if ("" == time) {
+		    Feng.info("请选择查询时间");
+		    return;
+		}
+        var ajax = new $ax(Feng.ctxPath + "/blackboard/sendActiveSubmit", function (data) {
+            $("#sendActiveNum").html(data.sendActiveNum);
+            $("#sendActiveMoney").html(data.sendActiveMoney);
+        }, function (data) {
+        });
+        ajax.set("time",time);
+        ajax.start();
+    }
+
+    // 用户日期选择切换
+    function userTime() {
+        $('.userSpan').toggleClass("active");
+        $('.userTimess').toggleClass("sp-hidden");
+        $('.userTimes').toggleClass('sp-hidden');
+        $("#userNum").html("0");
+        $("#maleUserNum").html("0");
+        $("#femaleUserNum").html("0");
+        $("#userTime").val("");
+        if ($(".userTimess").hasClass('sp-hidden')){
+            var ajax = new $ax(Feng.ctxPath + "/blackboard/user", function (data) {
+                $("#userNum").html(data.userNum);
+                $("#maleUserNum").html(data.maleUserNum);
+                $("#femaleUserNum").html(data.femaleUserNum);
+            }, function (data) {
+            });
+            ajax.set("active",$("#userDiv .active").html());
+            ajax.start();
+        }
+    }
+    // 用户日期选择提交
+    function  userSubmit(){
+        var time = $("#userTime").val();
+        if ("" == time) {
+            Feng.info("请选择查询时间");
+            return;
+        }
+        var ajax = new $ax(Feng.ctxPath + "/blackboard/userSubmit", function (data) {
+            $("#userNum").html(data.userNum);
+            $("#maleUserNum").html(data.maleUserNum);
+            $("#femaleUserNum").html(data.femaleUserNum);
+        }, function (data) {
+        });
+        ajax.set("time",time);
+        ajax.start();
+    }
+</script>
+@}
+
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/blackboardBlank.html b/management/guns-admin/src/main/webapp/WEB-INF/view/blackboardBlank.html
new file mode 100644
index 0000000..816af83
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/blackboardBlank.html
@@ -0,0 +1,59 @@
+@layout("/common/_container.html"){
+<style>
+	.contact-box {
+		background: unset;
+		border: unset;
+	}
+	strong{
+		line-height: 23px;
+	}
+</style>
+
+<div class="wrapper wrapper-content animated fadeInRight">
+	<div class="row">
+		<div class="col-sm-6">
+			<div class="contact-box">
+				<div class="col-sm-4">
+					<div class="text-center">
+						@if(user.avatar!=null){
+							<img alt="image" class="img-circle " src="${user.avatar}" style="width: 120px;height: 120px " >
+						@}
+						@if(user.avatar==null){
+							<img alt="image" class="img-circle " src="${ctxPath}/static/img/login-background.jpg" style="width: 120px;height: 120px" >
+						@}
+
+						<div class="m-t-xs font-bold">${deptName}</div>
+					</div>
+				</div>
+				<div class="col-sm-8">
+					<h3><strong>${user.name}</strong></h3>
+					<p><i class="fa fa-user-secret"></i> ${roleName}</p>
+					<address>
+						<strong>E-mail:${user.email}</strong><br>
+						<strong>Tel:${user.phone}</strong><br>
+						<strong>登录次数:${loginNum}次</strong><br>
+						<strong>登录时间:${date}</strong><br>
+					</address>
+				</div>
+				<div class="clearfix"></div>
+			</div>
+		</div>
+	</div>
+</div>
+<script>
+    $(document).ready(function () {
+        $('.contact-box').each(function () {
+            animationHover(this, 'pulse');
+        });
+        $(".row").css({
+            height: window.innerHeight+"px",
+            display:"flex",
+            alignItems: "center",
+            justifyContent: "center",
+        })
+    });
+</script>
+
+<script type="text/javascript" src="http://tajs.qq.com/stats?sId=9051096" charset="UTF-8"></script>
+@}
+
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/code/code.html b/management/guns-admin/src/main/webapp/WEB-INF/view/code/code.html
new file mode 100644
index 0000000..6cececb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/code/code.html
@@ -0,0 +1,101 @@
+@layout("/common/_container.html"){
+<div class="row" xmlns="">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>代码生成</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="form-horizontal" id="generate">
+                            <div class="row">
+                                <div class="col-sm-4">
+                                    <#input id="projectPath" name="项目路径" value="${params.projectPath}"/>
+                                </div>
+                                <div class="col-sm-4">
+                                    <#input id="projectPackage" name="项目的包" value="${params.projectPackage}"/>
+                                </div>
+                                <div class="col-sm-4">
+                                    <#input id="corePackage" name="核心包" value="${params.corePackage}"/>
+                                </div>
+                            </div>
+
+                            <div class="row">
+                                <div class="col-sm-3">
+                                    <#input id="author" name="作者" value="${params.author!}"/>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#input id="bizName" name="业务名称" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#input id="moduleName" name="模块名称" value="${params.moduleName}"/>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#input id="parentMenuName" name="父级菜单名称" underline="false" value="${params.parentMenuName}"
+                                            hidden="pid" readonly="readonly"
+                                            clickFun="Code.showMenuSelectTree(); return false;"
+                                            style="background-color: #ffffff !important;"
+                                            selectFlag="true" selectId="pcodeTreeDiv" selectTreeId="pcodeTree" selectStyle=""/>
+                                </div>
+                            </div>
+
+                            <div class="row">
+                                <div class="col-sm-3">
+                                    <#input id="tableName" name="表名称" disabled="disabled"/>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#input id="ignoreTabelPrefix" name="表前缀" value="${params.ignoreTabelPrefix}"/>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#input id="className" name="类名" disabled="disabled"/>
+                                </div>
+                            </div>
+                            <div class="row">
+                                <div class="col-sm-6">
+                                    <button id="genBtn" type="button" class="btn btn-primary mr10"
+                                            onclick="Code.generate()">
+                                        <span style="padding: 5px 20px;">生成</span>
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+                        <div style="padding-top: 10px; overflow: hidden"
+                             class="container-fluid">
+                            <div class="col-md-12">
+                                <div class="row admin-form">
+                                    <div class="col-md-3 col-md-offset-3">
+                                        <h2>数据表</h2>
+                                        <div class="list-group" id="tableList"
+                                             data-bind="foreach: tables"
+                                             style="height: 500px; overflow-y: scroll">
+                                            @for(table in tables!){
+                                                <a href="javascript:void(0)" class="list-group-item" tableName="${table.tableName}" onclick="Code.selectTable('${table.tableName}')">${table.tableName}-${table.tableComment}</a>
+                                            @}
+                                        </div>
+                                    </div>
+                                    <div class="col-md-3">
+                                        <span><h2>模板</h2></span>
+                                        <div class="list-group" id="templateList"
+                                             style="height: 500px; overflow-y: scroll">
+                                            @for(template in templates!){
+                                                <a href="javascript:void(0)" class="list-group-item" key="${template.key}" onclick="Code.selectTemplate('${template.key}')">${template.desc}</a>
+                                            @}
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <ul class="nav nav-list">
+                            <li class="divider"></li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/js/common/select-list-object.js"></script>
+<script src="${ctxPath}/static/modular/code/gen.js"></script>
+@}
+
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/_container.html b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_container.html
new file mode 100644
index 0000000..61ac26d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_container.html
@@ -0,0 +1,194 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta name="renderer" content="webkit"/><!-- 让360浏览器默认选择webkit内核 -->
+
+    <!--地图-->
+    <script src="https://webapi.amap.com/maps?v=1.4.8&key=e17d799b2506d05faf7f88320a266803"></script>
+    <!--<script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=IRKL4FLGKZUFr6T3gFk3t9X6kKarKu1K"></script>-->
+
+    <!-- 全局css -->
+    <link rel="shortcut icon" href="${ctxPath}/static/favicon1.ico">
+    <link href="${ctxPath}/static/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="${ctxPath}/static/css/plugins/switchery/switchery.css" rel="stylesheet">
+    <link href="${ctxPath}/static/css/font-awesome.css?v=4.4.0" rel="stylesheet">
+    <link href="${ctxPath}/static/css/plugins/chosen/chosen.css" rel="stylesheet">
+    <link href="${ctxPath}/static/css/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
+    <link href="${ctxPath}/static/css/plugins/validate/bootstrapValidator.min.css" rel="stylesheet">
+    <link href="${ctxPath}/static/css/style.css?v=4.1.0" rel="stylesheet">
+    <link href="${ctxPath}/static/css/_fstyle.css" rel="stylesheet">
+    <link href="${ctxPath}/static/css/plugins/iCheck/custom.css" rel="stylesheet">
+    <link href="${ctxPath}/static/css/plugins/webuploader/webuploader.css" rel="stylesheet">
+    <link href="${ctxPath}/static/css/plugins/ztree/zTreeStyle.css" rel="stylesheet">
+    <link href="${ctxPath}/static/css/plugins/bootstrap-treetable/bootstrap-treetable.css" rel="stylesheet"/>
+    <!-- <link href="${ctxPath}/static/css/plugins/ztree/demo.css" rel="stylesheet"> -->
+    <link href="${ctxPath}/static/css/plugins/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css" rel="stylesheet">
+    <link href="${ctxPath}/static/css/plugins/sweetalert/sweetalert.css" rel="stylesheet">
+    <link href="${ctxPath}/static/layui/css/layui.css" rel="stylesheet">
+
+    <!--富文本编辑器 css-->
+    <link type="text/css" rel="stylesheet" href="${ctxPath}/static/js/ueditor/jsp/themes/default/css/ueditor.css">
+
+    <!-- 全局js -->
+    <script src="${ctxPath}/static/js/jquery.min.js?v=2.1.4"></script>
+    <script src="${ctxPath}/static/js/bootstrap.min.js?v=3.3.6"></script>
+    <script src="${ctxPath}/static/js/plugins/ztree/jquery.ztree.all.min.js"></script>
+    <script src="${ctxPath}/static/js/plugins/bootstrap-table/bootstrap-table.min.js"></script>
+    <script src="${ctxPath}/static/js/plugins/validate/bootstrapValidator.min.js"></script>
+    <script src="${ctxPath}/static/js/plugins/validate/zh_CN.js"></script>
+    <script src="${ctxPath}/static/js/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
+    <script src="${ctxPath}/static/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
+    <script src="${ctxPath}/static/js/plugins/bootstrap-treetable/bootstrap-treetable.js"></script>
+    <script src="${ctxPath}/static/js/plugins/layer/layer.js"></script>
+    <script src="${ctxPath}/static/js/plugins/switchery/switchery.js"></script>
+    <script src="${ctxPath}/static/js/plugins/chosen/chosen.jquery.js"></script>
+    <script src="${ctxPath}/static/js/plugins/iCheck/icheck.min.js"></script>
+    <script src="${ctxPath}/static/js/plugins/laydate/laydate.js"></script>
+    <script src="${ctxPath}/static/js/common/laydateChoose.js"></script>
+    <script src="${ctxPath}/static/js/plugins/webuploader/webuploader.min.js"></script>
+    <script src="${ctxPath}/static/js/common/ajax-object.js"></script>
+    <script src="${ctxPath}/static/js/common/bootstrap-table-object.js"></script>
+    <script src="${ctxPath}/static/js/common/tree-table-object.js"></script>
+    <script src="${ctxPath}/static/js/common/web-upload-object.js"></script>
+    <script src="${ctxPath}/static/js/common/web-upload-image.js"></script>
+    <script src="${ctxPath}/static/js/common/ztree-object.js"></script>
+    <script src="${ctxPath}/static/js/common/Feng.js"></script>
+    <script src="${ctxPath}/static/js/plugins/sweetalert/sweetalert.min.js"></script>
+    <script src="${ctxPath}/static/layui/layui.js"></script>
+
+    <!--富文本编辑器 js-->
+   <!-- <script type="text/javascript" charset="utf-8" src="${ctxPath}/static/js/plugins/umeditor/umeditor.config.js"></script>
+    <script type="text/javascript" charset="utf-8" src="${ctxPath}/static/js/plugins/umeditor/umeditor.js"></script>
+    <script type="text/javascript" charset="utf-8" src="${ctxPath}/static/js/plugins/umeditor/lang/zh-cn/zh-cn.js"></script>-->
+    <script type="text/javascript" charset="utf-8" src="${ctxPath}/static/js/ueditor/jsp/ueditor.config.js"></script>
+    <script type="text/javascript" charset="utf-8" src="${ctxPath}/static/js/ueditor/jsp/ueditor.all.js"></script>
+    <script type="text/javascript" charset="utf-8" src="${ctxPath}/static/js/ueditor/jsp/lang/zh-cn/zh-cn.js"></script>
+    <!--<style type="text/css">
+        table{  
+            width:100px;  
+            table-layout:fixed;/* 只有定义了表格的布局算法为fixed,下面td的定义才能起作用。 */  
+        }
+        td{  
+            width:100%;  
+            word-break:keep-all;/* 不换行 */  
+            white-space:nowrap;/* 不换行 */  
+            overflow:hidden;/* 内容超出宽度时隐藏超出部分的内容 */  
+            text-overflow:ellipsis;/* 当对象内文本溢出时显示省略标记(...) ;需与overflow:hidden;一起使用*/  
+        }
+    </style>-->
+
+    <script type="text/javascript">
+        Feng.addCtx("${ctxPath}");
+        Feng.sessionTimeoutRegistry();
+        //验证电话号码
+        var phoneReg = /^1(3|4|5|7|8|9)\d{9}$/;
+        //验证是否输入正整数
+        var reg = /^[0-9]\d*$/;
+        //6-12位正整数
+        var regSix = /^[0-9]{6,12}$/;
+        //验证是否输入小数
+        var regDouble = /^(([1-9]{1}\d*)|(0{1}))(\.\d{0,2})?$/;
+        //保留一位小数
+        var regDoubleOne = /^(([1-9]{1}\d*)|(0{1}))(\.\d{0,1})?$/;
+        /**
+         * 图片弹出预览框(可选)
+         */
+        window.operateEvents = {
+            'click .view': function (e, value, row) {
+                // 设置图片路径
+                var imgUrl = value;
+                if(imgUrl != "") {
+                    imgUrl = imgUrl;// 设置图片路径
+                } else {
+                    imgUrl = Feng.ctxPath + '/static/img/NoPIC.png';// 默认无图
+                }
+                layer.open({
+                    type: 1,
+                    title: false,
+                    closeBtn: 0,
+                    area: 'auto',
+                    skin: 'layui-layer-nobg', //没有背景色
+                    shadeClose: true,
+                    content: '<img src="' + imgUrl + '" height="100%" width="100%" />'
+                });
+            },
+        };
+        /**
+         * 查看大图
+         */
+        function lookBigImg(obj){
+            // 设置图片路径
+            var imgUrl = obj;
+            if(imgUrl != "") {
+                imgUrl = imgUrl;// 设置图片路径
+            } else {
+                imgUrl = Feng.ctxPath + '/static/img/NoPIC.png';// 默认无图
+            }
+            layer.open({
+                type: 1,
+                title: false,
+                closeBtn: 0,
+                area: 'auto',
+                skin: 'layui-layer-nobg', //没有背景色
+                shadeClose: true,
+                content: '<img src="' + imgUrl + '" height="100%" width="100%" />'
+            });
+        }
+        /*表单验证错误点击叉叉可以清除文本框内容*/
+        $(function () {
+            $(".form-control:input").each(function () {
+                $(this).click(function () {
+                    if($(this).next().hasClass("glyphicon-remove")){
+                        $(this).val("");
+                    }
+                })
+            })
+        })
+        /*验证输入字符*/
+        function checkField(value) {
+            var newvalue = value.replace(/[^\x00-\xff]/g, "**");
+            var length = newvalue.length;
+            return length;
+        }
+        //字符串操作函数 往指定位置插入字符 删除指定位置字符 替换指定位置字符
+        function insert_flg(str,flg,sn){
+            var newstr="";
+            for(var i=0;i<str.length;i+=sn){
+                var tmp=str.substring(i, i+sn);
+                if(sn==i){
+                    newstr+=flg;
+                }
+                newstr+=tmp;
+            }
+            return newstr;
+        }
+
+        //获取当前时间,格式YYYY-MM-DD
+        function getNowFormatDate() {
+            var date = new Date();
+            var seperator1 = "-";
+            var year = date.getFullYear();
+            var month = date.getMonth() + 1;
+            var strDate = date.getDate();
+            if (month >= 1 && month <= 9) {
+                month = "0" + month;
+            }
+            if (strDate >= 0 && strDate <= 9) {
+                strDate = "0" + strDate;
+            }
+            var currentdate = year + seperator1 + month + seperator1 + strDate;
+            return currentdate;
+        }
+
+    </script>
+</head>
+
+<body class="gray-bg">
+<div class="wrapper wrapper-content">
+    ${layoutContent}
+</div>
+<script src="${ctxPath}/static/js/content.js?v=1.0.0"></script>
+</body>
+</html>
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/_right.html b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_right.html
new file mode 100644
index 0000000..795564a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_right.html
@@ -0,0 +1,59 @@
+<div id="page-wrapper" class="gray-bg dashbard-1">
+            <div class="row border-bottom">
+                <nav class="navbar navbar-static-top" role="navigation" style="margin-bottom: 0">
+            <div class="navbar-header"><a class="navbar-minimalize minimalize-styl-2 btn btn-primary " href="#"><i class="fa fa-bars"></i> </a>
+                <form role="search" class="navbar-form-custom" method="post" action="search_results.html">
+                    <div class="form-group">
+                        <input type="text" placeholder="OK出行后台管理系统 …" class="form-control" name="top-search" id="top-search" value="OK出行后台管理系统" disabled>
+                    </div>
+                </form>
+                <h3 style="float: right;line-height: 50px;color: red;">${passwordHint}</h3>
+            </div>
+            <ul class="nav navbar-top-links navbar-right">
+                <li class="dropdown hidden-xs">
+                    <a class="right-sidebar-toggle" aria-expanded="false">
+                        <i class="fa fa-tasks"></i> 主题
+                    </a>
+                </li>
+            </ul>
+        </nav>
+    </div>
+    <div class="row content-tabs">
+        <button class="roll-nav roll-left J_tabLeft"><i class="fa fa-backward"></i>
+        </button>
+        <nav class="page-tabs J_menuTabs">
+            <div class="page-tabs-content">
+                <a href="javascript:;" class="active J_menuTab" data-id="${ctxPath}/blackboard">首页</a>
+            </div>
+        </nav>
+        <!--<nav class="page-tabs J_menuTabs">
+            <div class="page-tabs-content">
+                <a href="javascript:;" class="active J_menuTab" data-id="${ctxPath}/blackboard?type=0"></a>
+            </div>
+        </nav>-->
+        <button class="roll-nav roll-right J_tabRight"><i class="fa fa-forward"></i>
+        </button>
+        <div class="btn-group roll-nav roll-right">
+            <button class="dropdown J_tabClose" data-toggle="dropdown">关闭操作<span class="caret"></span>
+
+            </button>
+            <ul role="menu" class="dropdown-menu dropdown-menu-right">
+                <li class="J_tabShowActive"><a>定位当前选项卡</a>
+                </li>
+                <li class="divider"></li>
+                <li class="J_tabCloseAll"><a>关闭全部选项卡</a>
+                </li>
+                <li class="J_tabCloseOther"><a>关闭其他选项卡</a>
+                </li>
+            </ul>
+        </div>
+        <a href="logout" class="roll-nav roll-right J_tabExit"><i class="fa fa fa-sign-out"></i> 退出</a>
+    </div>
+    <div class="row J_mainContent" id="content-main">
+        <iframe class="J_iframe" name="iframe0" width="100%" height="100%" src="${ctxPath}/blackboard?type=${type}" frameborder="0" data-id="${ctxPath}/blackboard" seamless></iframe>
+    </div>
+    <div class="footer">
+        <div class="pull-right">&copy; 2019-2021 <a href="#" onclick="return false" target="_blank">OK出行</a>
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/_tab.html b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_tab.html
new file mode 100644
index 0000000..79b3def
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_tab.html
@@ -0,0 +1,74 @@
+<nav class="navbar-default navbar-static-side" role="navigation">
+    <div class="nav-close"><i class="fa fa-times-circle"></i>
+    </div>
+    <div class="sidebar-collapse">
+        <ul class="nav" id="side-menu">
+            <li class="nav-header">
+                <div class="dropdown profile-element">
+                    <span><img alt="image" class="img-circle"
+                               @if(isEmpty(avatar)){
+                                    src="${ctxPath}/static/img/NoPIC.png"
+                               @}else{
+                                    src="${avatar}"
+                               @}
+                               width="64px" height="64px"/></span>
+                    <a data-toggle="dropdown" class="dropdown-toggle" href="#">
+                        <span class="clear">
+                       <span class="block m-t-xs"><strong class="font-bold" id="userNameTab">${userName}</strong></span>
+                        <span class="text-muted text-xs block">${shiro.getUser().roleNames[0]}<b class="caret"></b></span>
+                        </span>
+                    </a>
+                    <ul class="dropdown-menu m-t-xs">
+                        <li><a class="J_menuItem" href="${ctxPath}/mgr/user_info">个人资料</a></li>
+                        <li><a class="J_menuItem" href="${ctxPath}/mgr/user_chpwd">修改密码</a></li>
+                        <li class="divider"></li>
+                        <li><a href="${ctxPath}/logout">安全退出</a>
+                        </li>
+                    </ul>
+                </div>
+                <div class="logo-element">MS
+                </div>
+            </li>
+            
+            @for(title in titles){
+                @if(tool.isEmpty(title.children)){
+                    <li>
+                        <a class="J_menuItem" href="${ctxPath}${title.url}" name="tabMenuItem">
+                            <i class="fa ${title.icon}"></i>
+                            <span class="nav-label">${title.name}</span>
+                        </a>
+                    </li>
+                @}else{
+                    <li>
+                        <a href="#">
+                            <i class="fa ${title.icon}"></i>
+                            <span class="nav-label">${title.name}</span>
+                            <span class="fa arrow"></span>
+                        </a>
+                        <ul class="nav nav-second-level">
+                            @for(subTitle in title.children){
+                                @if(tool.isEmpty(subTitle.children)){
+                                    <li>
+                                        <a class="J_menuItem" href="${ctxPath}${subTitle.url}" name="tabMenuItem">${subTitle.name}</a>
+                                    </li>
+                                @}else{
+                                    <li>
+                                        <a href="#">${subTitle.name} <span class="fa arrow"></span></a>
+                                        <ul class="nav nav-third-level">
+                                            @for(thirdTitle in subTitle.children){
+                                            <li>
+                                                <a class="J_menuItem" href="${ctxPath}${thirdTitle.url}" name="tabMenuItem">${thirdTitle.name}</a>
+                                            </li>
+                                            @}
+                                        </ul>
+                                    </li>
+                                @}
+                            @}
+                        </ul>
+                    </li>
+                @}
+            @}
+
+        </ul>
+    </div>
+</nav>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/_theme.html b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_theme.html
new file mode 100644
index 0000000..4c093d8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_theme.html
@@ -0,0 +1,84 @@
+<div id="right-sidebar">
+	<div class="sidebar-container">
+
+		<ul class="nav nav-tabs navs-3">
+			<li class="active"><a data-toggle="tab" href="#tab-1"> <i
+					class="fa fa-gear"></i> 主题
+			</a></li>
+		</ul>
+
+		<div class="tab-content">
+			<div id="tab-1" class="tab-pane active">
+				<div class="sidebar-title">
+					<h3>
+						<i class="fa fa-comments-o"></i> 主题设置
+					</h3>
+					<small><i class="fa fa-tim"></i>
+						你可以从这里选择和预览主题的布局和样式,这些设置会被保存在本地,下次打开的时候会直接应用这些设置。</small>
+				</div>
+				<div class="skin-setttings">
+					<div class="title">主题设置</div>
+					<div class="setings-item">
+						<span>收起左侧菜单</span>
+						<div class="switch">
+							<div class="onoffswitch">
+								<input type="checkbox" name="collapsemenu"
+									class="onoffswitch-checkbox" id="collapsemenu"> <label
+									class="onoffswitch-label" for="collapsemenu"> <span
+									class="onoffswitch-inner"></span> <span
+									class="onoffswitch-switch"></span>
+								</label>
+							</div>
+						</div>
+					</div>
+					<div class="setings-item">
+						<span>固定顶部</span>
+
+						<div class="switch">
+							<div class="onoffswitch">
+								<input type="checkbox" name="fixednavbar"
+									class="onoffswitch-checkbox" id="fixednavbar"> <label
+									class="onoffswitch-label" for="fixednavbar"> <span
+									class="onoffswitch-inner"></span> <span
+									class="onoffswitch-switch"></span>
+								</label>
+							</div>
+						</div>
+					</div>
+					<div class="setings-item">
+						<span> 固定宽度 </span>
+
+						<div class="switch">
+							<div class="onoffswitch">
+								<input type="checkbox" name="boxedlayout"
+									class="onoffswitch-checkbox" id="boxedlayout"> <label
+									class="onoffswitch-label" for="boxedlayout"> <span
+									class="onoffswitch-inner"></span> <span
+									class="onoffswitch-switch"></span>
+								</label>
+							</div>
+						</div>
+					</div>
+					<div class="title">皮肤选择</div>
+					<div class="setings-item default-skin nb">
+						<span class="skin-name "> <a href="#" class="s-skin-0">
+								默认皮肤 </a>
+						</span>
+					</div>
+					<div class="setings-item blue-skin nb">
+						<span class="skin-name "> <a href="#" class="s-skin-1">
+								蓝色主题 </a>
+						</span>
+					</div>
+					<div class="setings-item yellow-skin nb">
+						<span class="skin-name "> <a href="#" class="s-skin-3">
+								黄色/紫色主题 </a>
+						</span>
+					</div>
+				</div>
+			</div>
+
+		</div>
+
+	</div>
+</div>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/NameCon.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/NameCon.tag
new file mode 100644
index 0000000..37cbe1d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/NameCon.tag
@@ -0,0 +1,14 @@
+@/*
+    名称查询条件标签的参数说明:
+
+    name : 查询条件的名称
+    id : 查询内容的input框id
+@*/
+<div class="input-group">
+    <div class="input-group-btn">
+        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle"
+                type="button">${name}
+        </button>
+    </div>
+    <input type="text" class="form-control" id="${id}" placeholder="${placeholder!}" />
+</div>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/SelectCon.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/SelectCon.tag
new file mode 100644
index 0000000..a350fc9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/SelectCon.tag
@@ -0,0 +1,16 @@
+@/*
+    选择查询条件标签的参数说明:
+
+    name : 查询条件的名称
+    id : 查询内容的input框id
+@*/
+<div class="input-group">
+    <div class="input-group-btn">
+        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">
+            ${name}
+        </button>
+    </div>
+    <select class="form-control" id="${id}">
+        ${tagBody!}
+    </select>
+</div>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/TimeCon.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/TimeCon.tag
new file mode 100644
index 0000000..a1fb8a3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/TimeCon.tag
@@ -0,0 +1,15 @@
+@/*
+    时间查询条件标签的参数说明:
+
+    name : 查询条件的名称
+    id : 查询内容的input框id
+    isTime : 日期是否带有小时和分钟(true/false)
+@*/
+<div class="input-group">
+    <div class="input-group-btn">
+        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle"
+                type="button">${name}
+        </button>
+    </div>
+    <input type="text" class="form-control layer-date" id="${id}"/>
+</div>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/avatar.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/avatar.tag
new file mode 100644
index 0000000..b7f7608
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/avatar.tag
@@ -0,0 +1,29 @@
+@/*
+    头像参数的说明:
+    name : 名称
+    id : 头像的id
+@*/
+<div class="form-group">
+    <label class="col-sm-3 control-label head-scu-label">${name}</label>
+    <div class="col-sm-4">
+        <div id="${id}PreId">
+            <div><img width="100px" height="100px"
+                @if(isEmpty(avatarImg)){
+                      src="${ctxPath}/static/img/NoPIC.png"></div>
+                @}else{
+                      src="${avatarImg}"></div>
+                @}
+        </div>
+    </div>
+    <div class="col-sm-2">
+        <div class="head-scu-btn upload-btn" id="${id}BtnId">
+            <i class="fa fa-upload"></i>&nbsp;上传
+        </div>
+    </div>
+    <input type="hidden" id="${id}" value="${avatarImg!}"/>
+</div>
+@if(isNotEmpty(underline) && underline == 'true'){
+    <div class="hr-line-dashed"></div>
+@}
+
+
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/button.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/button.tag
new file mode 100644
index 0000000..86def81
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/button.tag
@@ -0,0 +1,30 @@
+@/*
+    按钮标签中各个参数的说明:
+
+    btnType : 按钮的类型决定了颜色(default-灰色,primary-绿色,success-蓝色,info-淡蓝色,warning-黄色,danger-红色,white-白色)
+    space : 按钮左侧是否有间隔(true/false)
+    clickFun : 点击按钮所执行的方法
+    icon : 按钮上的图标的样式
+    name : 按钮名称
+@*/
+
+@var spaceCss = "";
+@var btnType = "";
+@if(isEmpty(space) || space == "false"){
+@   spaceCss = "";
+@}else{
+@   spaceCss = "button-margin";
+@}
+@if(isEmpty(btnCss)){
+@   btnType = "primary";
+@}else{
+@   btnType = btnCss;
+@}
+<button type="button" class="btn btn-${btnType} ${spaceCss}" onclick="${clickFun!}" id="${id!}"
+        @if(isNotEmpty(style)){
+        style="${style}"
+        @}
+>
+    <i class="fa ${icon}"></i>&nbsp;${name}
+</button>
+
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/input.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/input.tag
new file mode 100644
index 0000000..371ce9e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/input.tag
@@ -0,0 +1,54 @@
+@/*
+    表单中input框标签中各个参数的说明:
+
+    hidden : input hidden框的id
+    id : input框id
+    name : input框名称
+    readonly : readonly属性
+    clickFun : 点击事件的方法名
+    style : 附加的css属性
+@*/
+<div class="form-group">
+    <label class="col-sm-3 control-label">${name}:</label>
+    <div class="col-sm-9">
+        <input class="form-control" id="${id}" name="${id}"
+               @if(isNotEmpty(value)){
+                    value="${tool.dateType(value)}"
+               @}
+               @if(isNotEmpty(type)){
+                    type="${type}"
+               @}else{
+                    type="text"
+               @}
+               @if(isNotEmpty(readonly)){
+                    readonly="${readonly}"
+               @}
+               @if(isNotEmpty(clickFun)){
+                    onclick="${clickFun}"
+               @}
+               @if(isNotEmpty(style)){
+                    style="${style}"
+               @}
+               @if(isNotEmpty(disabled)){
+                    disabled="${disabled}"
+               @}
+               @if(isNotEmpty(placeholder)){
+                    placeholder="${placeholder}"
+               @}
+        >
+        @if(isNotEmpty(hidden)){
+            <input class="form-control" type="hidden" id="${hidden}" value="${hiddenValue!}">
+        @}
+
+        @if(isNotEmpty(selectFlag)){
+            <div id="${selectId}" style="display: none; position: absolute; z-index: 200;">
+                <ul id="${selectTreeId}" class="ztree tree-box" style="${selectStyle!}"></ul>
+            </div>
+        @}
+    </div>
+</div>
+@if(isNotEmpty(underline) && underline == 'true'){
+    <div class="hr-line-dashed"></div>
+@}
+
+
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/inputRequired.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/inputRequired.tag
new file mode 100644
index 0000000..6ff1d2a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/inputRequired.tag
@@ -0,0 +1,51 @@
+@/*
+    表单中input框标签中各个参数的说明:
+
+    hidden : input hidden框的id
+    id : input框id
+    name : input框名称
+    readonly : readonly属性
+    clickFun : 点击事件的方法名
+    style : 附加的css属性
+@*/
+<div class="form-group">
+    <label class="col-sm-3 control-label"><span style="color:red">*</span>&nbsp;&nbsp;${name}:</label>
+    <div class="col-sm-9">
+        <input class="form-control" id="${id}" name="${id}"
+               @if(isNotEmpty(value)){
+                    value="${tool.dateType(value)}"
+               @}
+               @if(isNotEmpty(type)){
+                    type="${type}"
+               @}else{
+                    type="text"
+               @}
+               @if(isNotEmpty(readonly)){
+                    readonly="${readonly}"
+               @}
+               @if(isNotEmpty(clickFun)){
+                    onclick="${clickFun}"
+               @}
+               @if(isNotEmpty(style)){
+                    style="${style}"
+               @}
+               @if(isNotEmpty(disabled)){
+                    disabled="${disabled}"
+               @}
+        >
+        @if(isNotEmpty(hidden)){
+            <input class="form-control" type="hidden" id="${hidden}" value="${hiddenValue!}">
+        @}
+
+        @if(isNotEmpty(selectFlag)){
+            <div id="${selectId}" style="display: none; position: absolute; z-index: 200;">
+                <ul id="${selectTreeId}" class="ztree tree-box" style="${selectStyle!}"></ul>
+            </div>
+        @}
+    </div>
+</div>
+@if(isNotEmpty(underline) && underline == 'true'){
+    <div class="hr-line-dashed"></div>
+@}
+
+
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/label.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/label.tag
new file mode 100644
index 0000000..2221b95
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/label.tag
@@ -0,0 +1,31 @@
+@/*
+    表单中input框标签中各个参数的说明:
+
+    hidden : input hidden框的id
+    id : input框id
+    name : input框名称
+    readonly : readonly属性
+    clickFun : 点击事件的方法名
+    style : 附加的css属性
+@*/
+<div class="form-group">
+    <label class="col-sm-3 control-label">${name}:</label>
+    <div class="col-sm-9">
+        <label class="control-label" id="${id}" name="${id}"
+               @if(isNotEmpty(style)){
+                    style="${style};text-align: left;"
+               @}else{
+                    style="text-align: left;"
+               @}
+        >
+            @if(isNotEmpty(value)){
+                ${tool.dateType(value)}
+            @}
+        </label>
+    </div>
+</div>
+@if(isNotEmpty(underline) && underline == 'true'){
+    <div class="hr-line-dashed"></div>
+@}
+
+
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/select.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/select.tag
new file mode 100644
index 0000000..7072de1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/select.tag
@@ -0,0 +1,26 @@
+@/*
+    select标签中各个参数的说明:
+    name : select的名称
+    id : select的id
+    underline : 是否带分割线
+@*/
+<div class="form-group">
+    <label class="col-sm-3 control-label">${name}</label>
+    <div class="col-sm-9">
+        <select class="form-control" id="${id}" name="${id}"
+                @if(isNotEmpty(onchange)){
+                onchange="${onchange}"
+                @}
+        >
+            ${tagBody!}
+        </select>
+        @if(isNotEmpty(hidden)){
+            <input class="form-control" type="hidden" id="${hidden}" value="${hiddenValue!}">
+        @}
+    </div>
+</div>
+@if(isNotEmpty(underline) && underline == 'true'){
+    <div class="hr-line-dashed"></div>
+@}
+
+
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/table.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/table.tag
new file mode 100644
index 0000000..3760417
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/table.tag
@@ -0,0 +1,12 @@
+@/*
+    表格标签的参数说明:
+
+    id : table表格的id
+@*/
+<table id="${id}" data-mobile-responsive="true" data-click-to-select="true">
+    <thead>
+        <tr>
+            <th data-field="selectItem" data-checkbox="true"></th>
+        </tr>
+    </thead>
+</table>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/tag_tips b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/tag_tips
new file mode 100644
index 0000000..3a5d5d4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/tag_tips
@@ -0,0 +1,22 @@
+1 dictSelector(字典选择器)
+    此标签是为了方便在前台form表单中使用系统中维护的字典而开发的,具体说明如下:
+1.1 标签样例
+    <#dictSelector id="sex" name ="sex" code="sys_sex" readonly="readonly" label="性别"  underline="true"  value="${user.sex}" />
+1.2 属性说明
+    id: (非必须) 控件的id
+    name: (非必须) 控件的name
+    code:(必须) 字典类型编码,根据code的值去后台查询该类型的字典。
+    type:(非必须) 控件类型,可选项为[select,radio,checkbox],标签会根据填写的类型,生成不同的控件。
+    searchnum:(非必须)下拉框达到多少个,开启搜索框,默认10个,type为select起效。
+    label:(非必须) 字典属性名称
+    width:(非必须) 控件的宽度单位为px,type为select起效。
+    value: (非必须) 控件默认值,多选时值要用,分隔。
+    placeholder:(非必须) 控件提示信息,type为select起效。
+    multiple:(非必须) 是否开启多选,可选值[true,false],默认为false,type为select起效。
+    underline:(非必须) 是否显示分割线,可选值[true,false],默认为false。
+    onchange:(非必须) onchange事件方法名称,会传入更改后的值作为参数,例:onchange="myOnChange" function myOnChange(newVal){}。
+    readonly:(非必须)只读控件,可选值[true,false],默认false
+    disabled:(非必须) 禁用控件,可选值[true,false],默认false
+
+
+
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/uploadFile.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/uploadFile.tag
new file mode 100644
index 0000000..793cd19
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/uploadFile.tag
@@ -0,0 +1,13 @@
+<div class="form-group">
+    <label class="col-sm-2 control-label">上传文件</label>
+    <div class="col-sm-6">
+        <input type="file" class="form-control" id="upFile" name="upFile">
+        <input type="hidden" id="${id}" name="${id}"/>
+    </div>
+    <div class="col-sm-2">
+        <button class="btn btn-outline btn-success" type="button" onclick="UploadFileFn()"><i class="fa fa-upload"></i>上传文件</button>
+    </div>
+</div>
+<div class="col-sm-12 progress progress-striped" style="margin-top: 10px;">
+    <div id="progressBarFile" style="width: 0%" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" role="progressbar" class="progress-bar progress-bar-info"></div>
+</div>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/uploadImg.tag b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/uploadImg.tag
new file mode 100644
index 0000000..8a0c521
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/tags/uploadImg.tag
@@ -0,0 +1,26 @@
+@/*
+    上传文件参数的说明:
+    id : 文件的id
+@*/
+<div class="form-group">
+    <div class="col-sm-4">
+        <div id="${id}PreId">
+            <div><img width="100px" height="100px"
+                @if(isEmpty(fileImg)){
+                      src="${ctxPath}/static/img/NoPIC.png">
+                @}else{
+                      src="${fileImg}">
+                @}
+            </div>
+        </div>
+    </div>
+    <div class="col-sm-2">
+        <div class="head-scu-btn upload-btn" id="${id}BtnId">
+            <i class="fa fa-upload"></i>&nbsp;上传
+        </div>
+    </div>
+    <input type="hidden" id="${id}" value="${fileImg!}"/>
+</div>
+@if(isNotEmpty(underline) && underline == 'true'){
+    <div class="hr-line-dashed"></div>
+@}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/driverOnline.html b/management/guns-admin/src/main/webapp/WEB-INF/view/driverOnline.html
new file mode 100644
index 0000000..9299d76
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/driverOnline.html
@@ -0,0 +1,33 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>在线司机</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="司机姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="Home.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="Home.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="HomeTableToolbar" role="group">
+                        </div>
+                        <#table id="HomeTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/home.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/home.html b/management/guns-admin/src/main/webapp/WEB-INF/view/home.html
new file mode 100644
index 0000000..07cce38
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/home.html
@@ -0,0 +1,264 @@
+@layout("/common/_container.html"){
+<div class="container-fluid" style="padding: 0 !important;">
+	<div class="row">
+		<div class="col-sm-12">
+			<div class="row" style="border-style: none none solid; border-color: #e7eaec; border-width: 1px 0px;">
+				<ul class="breadcrumb" style="height: 45px; line-height: 45px; padding-left: 20px;">
+					<li><a href="#" class="statistics">运营数据总览</a></li>
+					<li><a href="#" class="map">车辆地图总览</a></li>
+					<li><a href="#" class="order">订单热点图</a></li>
+				</ul>
+			</div>
+
+			<div class="row content" id="statisticsDiv">
+				<div class="form-group" style="height: 80px; padding-top: 20px; background-color: #FFFFFF;margin-bottom: 8px;">
+					<div class="col-sm-3">
+						<div class="input-group">
+							<div class="input-group-btn">
+								<button data-toggle="dropdown" class="btn btn-white dropdown-toggle"
+										type="button">选择查看范围
+								</button>
+							</div>
+							<div style="padding-left: 0px;">
+								<select class="form-control" id="branchOffice">
+									<option value="">----请选择----</option>
+								</select>
+							</div>
+						</div>
+					</div>
+					<div class="col-sm-2">
+						<#button name="搜索" icon="fa-search" clickFun="getData()"/>
+					</div>
+				</div>
+				<div class="col-sm-3">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<div class="pull-right" style="margin-top: -10px;">
+								<input type="text" class="layui-input form-control" id="addDate">
+							</div>
+							<h5>今日运行情况</h5>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="newPassengerInfo">0</h1>
+							<small>新增用户</small>
+						</div>
+						<div class="ibox-content" onclick="Home.onlineDriver()">
+							<h1 class="no-margins" id="newNetcardriver">0</h1>
+							<small>在线司机</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="orderDetail1">0</h1>
+							<small>专车订单数</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="orderDetail2">0</h1>
+							<small>出租车订单</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="orderDetail3">0</h1>
+							<small>跨城出行订单</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="orderDetail4">0</h1>
+							<small>同城小件物流订单</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="orderDetail5">0</h1>
+							<small>跨城小件物流订单</small>
+						</div>
+					</div>
+				</div>
+				<div class="col-sm-3">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<span class="label label-info pull-right">全部</span>
+							<h5>运营总数据</h5>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="passengerInfoSum">0</h1>
+							<small>总用户</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="netcarDriverSum">0</h1>
+							<small>总司机</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="netCarSum">0</h1>
+							<small>总车辆</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="orderDetailSum">0</h1>
+							<small>总订单</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="paiceSum">0</h1>
+							<small>交易总金额</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="paySum">0</h1>
+							<small>总收益</small>
+						</div>
+					</div>
+				</div>
+				<div class="col-sm-3">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<div class="pull-right" style="margin-top: -10px;">
+								<input type="text" class="layui-input form-control" id="rangeDate">
+							</div>
+							<h5>运营数据增长查询</h5>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="passengerInfoSum1">0</h1>
+							<small>用户增长数</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="netcarDriverSum1">0</h1>
+							<small>新增司机</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="orderDetail11">0</h1>
+							<small>专车订单数</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="orderDetail21">0</h1>
+							<small>出租车订单数</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="orderDetail31">0</h1>
+							<small>跨城出行订单数</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="orderDetail41">0</h1>
+							<small>同城小件物流订单数</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="orderDetail51">0</h1>
+							<small>跨城小件物流订单数</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="paiceSum1">0</h1>
+							<small>交易总金额</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins" id="paySum1">0</h1>
+							<small>总收益</small>
+						</div>
+					</div>
+				</div>
+				<div class="col-sm-3">
+					<div class="ibox float-e-margins">
+						<div class="ibox-title">
+							<span class="label label-danger pull-right">最近30天</span>
+							<h5>运营总趋势</h5>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins">
+								<span class="dynamicsparkline" id="orderDetailSum1">Loading..</span>
+							</h1>
+							<small>订单数趋势图</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins">
+								<span class="dynamicsparkline" id="passengerInfoSum2">Loading..</span>
+							</h1>
+							<small>用户注册趋势图</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins">
+								<span class="dynamicsparkline" id="orderDetail12">Loading..</span>
+							</h1>
+							<small>专车订单趋势图</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins">
+								<span class="dynamicsparkline" id="orderDetail22">Loading..</span>
+							</h1>
+							<small>出租车订单趋势图</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins">
+								<span class="dynamicsparkline" id="orderDetail32">Loading..</span>
+							</h1>
+							<small>跨城出行订单趋势图</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins">
+								<span class="dynamicsparkline" id="orderDetail42">Loading..</span>
+							</h1>
+							<small>同城小件物流订单趋势图</small>
+						</div>
+						<div class="ibox-content">
+							<h1 class="no-margins">
+								<span class="dynamicsparkline" id="orderDetail52">Loading..</span>
+							</h1>
+							<small>跨城小件物流订单趋势图</small>
+						</div>
+					</div>
+				</div>
+			</div>
+
+			<div class="row content" id="mapDiv">
+				<div class="form-group" style="height: 80px; padding-top: 20px; background-color: #FFFFFF;margin-bottom: 8px;">
+					<div class="col-sm-8">
+						<div class="input-group">
+							<div class="input-group-btn">
+								<button data-toggle="dropdown" class="btn btn-white dropdown-toggle"
+										type="button">选择查看范围
+								</button>
+							</div>
+							<div class="col-sm-4" style="padding-left: 0px;">
+								<select class="form-control" id="branchOffice1">
+									<option value="">----请选择----</option>
+								</select>
+							</div>
+						</div>
+					</div>
+					<div class="col-sm-2">
+						<#button name="搜索" icon="fa-search" clickFun="getData1()"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<div class="col-sm-2" style="padding: 0px; height: 47em; overflow: auto">
+						<div class="form-group" style="padding: 0px 5px;">
+							<div class="col-sm-12">
+								<ul class="list-group" id="netcardriver">
+
+								</ul>
+							</div>
+						</div>
+					</div>
+					<div class="col-sm-8" style="padding: 0px;">
+						<div class="form-group" style="padding: 0px 5px;">
+							<div id="container" style="height: 47em;"></div>
+						</div>
+					</div>
+					<div class="col-sm-2" style="padding: 0px; height: 47em; overflow: auto">
+						<div class="form-group">
+							<div class="col-sm-12" style="padding: 0px 5px;">
+								<ul class="list-group" id="order">
+
+								</ul>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+
+			<div class="row content" id="orderDiv">
+				<div class="form-group" style="height: 80px; padding-top: 20px; background-color: #FFFFFF;margin-bottom: 8px;">
+					<div class="col-sm-12">
+						<div id="container_" style="height: 47em;"></div>
+					</div>
+				</div>
+			</div>
+
+		</div>
+	</div>
+</div>
+<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=c59c0ec8058a8305009eb315584e07d1"></script>
+<script src="https://webapi.amap.com/maps?v=1.4.15&key=c59c0ec8058a8305009eb315584e07d1&plugin=AMap.MouseTool"></script>
+<script type="text/javascript" src='https://a.amap.com/jsapi_demos/static/citys.js'></script>
+<script src="${ctxPath}/static/home.js"></script>
+<script src="${ctxPath}/static/js/jquery.sparkline 2.1.2.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/index.html b/management/guns-admin/src/main/webapp/WEB-INF/view/index.html
new file mode 100644
index 0000000..3202f8e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/index.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta name="renderer" content="webkit">
+    <title>OK出行 - 主页</title>
+    <link rel="shortcut icon" href="${ctxPath}/static/favicon1.ico">
+    <link href="${ctxPath}/static/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="${ctxPath}/static/css/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="${ctxPath}/static/css/style.css?v=4.1.0" rel="stylesheet">
+</head>
+
+<body class="fixed-sidebar full-height-layout gray-bg" style="overflow:hidden">
+    <div id="wrapper">
+    
+        <!--左侧导航开始-->
+        	@include("/common/_tab.html"){}
+        <!--左侧导航结束-->
+        
+        <!--右侧部分开始-->
+        	@include("/common/_right.html"){}
+        <!--右侧部分结束-->
+        
+        <!--右侧边栏开始-->
+        	@include("/common/_theme.html"){}
+        <!--右侧边栏结束-->
+       
+    </div>
+
+    <!-- 全局js -->
+    <script src="${ctxPath}/static/js/jquery.min.js?v=2.1.4"></script>
+    <script src="${ctxPath}/static/js/bootstrap.min.js?v=3.3.6"></script>
+    <script src="${ctxPath}/static/js/plugins/metisMenu/jquery.metisMenu.js"></script>
+    <script src="${ctxPath}/static/js/plugins/slimscroll/jquery.slimscroll.min.js"></script>
+    <script src="${ctxPath}/static/js/plugins/layer/layer.js"></script>
+
+    <!-- 自定义js -->
+    <script src="${ctxPath}/static/js/hplus.js?v=4.1.0"></script>
+    <script type="text/javascript" src="${ctxPath}/static/js/contabs.js"></script>
+
+    <!-- 第三方插件 -->
+    <script src="${ctxPath}/static/js/plugins/pace/pace.min.js"></script>
+
+</body>
+
+</html>
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/login.html b/management/guns-admin/src/main/webapp/WEB-INF/view/login.html
new file mode 100644
index 0000000..e853409
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/login.html
@@ -0,0 +1,234 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <title>OK出行 - 登录</title>
+
+    <link rel="shortcut icon" href="${ctxPath}/static/favicon1.ico">
+    <link href="${ctxPath}/static/css/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="${ctxPath}/static/css/font-awesome.css?v=4.4.0" rel="stylesheet">
+    <link href="${ctxPath}/static/css/style.css?v=4.1.0" rel="stylesheet">
+    <script>if (window.top !== window.self) {
+        window.top.location = window.location;
+    }</script>
+    <script src="${ctxPath}/static/js/jquery.min.js?v=2.1.4"></script>
+    <script src="${ctxPath}/static/js/bootstrap.min.js?v=3.3.6"></script>
+    <style>
+        .item{
+            display: flex;
+            align-items: center;
+            /*border: 1px solid red !important;*/
+            margin: 24px 0;
+            position: relative;
+        }
+        .item>img{
+            position: absolute;
+            left: 8px;
+            /*bottom: 50%;*/
+        }
+        .itemInput{
+            background:none;
+            outline:none;
+            border:0px;
+            border-bottom:1px solid grey ;
+            padding-left: 30px;
+            height: 34px;
+            width: 100%;
+        }
+        .itemInput[type="text"]{
+
+            background: #fff;
+            outline: none;
+        }
+
+        .itemInput:-webkit-autofill {
+            -webkit-box-shadow: 0 0 0 1000px white inset; // 背景设为白色
+            -webkit-text-fill-color: #fff; // 字体颜色
+        }
+    </style>
+</head>
+
+<body class="gray-bg" style="background:url(${ctxPath}/static/img/index1.png) no-repeat; background-size:cover;">
+
+<div style="display: flex;align-items: center;justify-content: center;height: 100%">
+
+
+<img src="${ctxPath}/static/img/index4.png" style="width: 300px;height: 400px;z-index: 1000">
+<div  style="position: relative;left: -20px; max-width: 300px;min-height: 300px;background: white;border-radius: 8px;box-sizing: border-box;padding: 0 30px 0 50px;display: flex;align-items: center;justify-content: center;">
+    <div style="max-height: 100%">
+        <h3 style="color: black;"><img src="${ctxPath}/static/img/logo.png" width="30px" height="30px"/>&nbsp;OK出行管理后台</h3>
+        <br/>
+        <h4 style="color: red;">${tips!}</h4>
+        <form class="m-t" role="form" action="${ctxPath}/login" method="post">
+            <div class="item">
+                <img src="${ctxPath}/static/img/account.png" />
+                <input class="itemInput" type="text" name="username" id="username"  placeholder="请输入您的账号" required="" value="">
+            </div>
+            <div  class="item">
+                <img src="${ctxPath}/static/img/password.png" />
+                <input class="itemInput" type="password" name="password" id="password"  placeholder="请输入您的密码" required="" value="">
+            </div>
+            @if(kaptcha.getKaptchaOnOff() == true){
+            <div class="form-group" style="float: left;">
+                <div class="col-sm-8" style="padding-left: 0px; padding-right: 0px;">
+                    <input class="form-control" type="text" name="kaptcha" placeholder="验证码" required="">
+                </div>
+                <div class="col-sm-4" style="padding-left: 0px; padding-right: 0px;">
+                    <img src="${ctxPath}/kaptcha" id="kaptcha" width="100%" height="100%"/>
+                </div>
+            </div>
+            @}
+            <div class="form-group" style="float: left;">
+                <div class="checkbox" style="text-align: left">
+                    <!--<label>
+                        <input type="checkbox" name="remember" style="margin-top: 2px;">记住我
+                    </label>-->
+                </div>
+            </div>
+            <button onclick="login()" class="btn full-width m-b" style="background-color: #d56b29;color: black;">登 录</button>
+            <button type="submit" id="submit" style="display: none;"></button>
+            </p>
+        </form>
+    </div>
+</div></div>
+</body>
+<script src="${ctxPath}/static/js/jquery.min.js?v=2.1.4"></script>
+<script src="${ctxPath}/static/js/common/ajax-object.js"></script>
+<script src="${ctxPath}/static/js/common/Feng.js"></script>
+<script src="${ctxPath}/static/crypto-js/crypto-js.js"></script>
+<script>
+    $(function () {
+        $("#kaptcha").on('click', function () {
+            $("#kaptcha").attr('src', '${ctxPath}/kaptcha?' + Math.floor(Math.random() * 100)).fadeIn();
+        });
+    });
+    var key = CryptoJS.enc.Utf8.parse("c53fd327353a09a1");
+    var iv = CryptoJS.enc.Utf8.parse("3a0565e3b1d8ae3d");
+
+    //aes加密
+    function encrypt(context) {
+        var encrypted = '';
+        if (typeof(context) == 'string') {
+
+        }else if(typeof(context) == 'object'){
+            context = JSON.stringify(context);
+        }
+        var srcs = CryptoJS.enc.Utf8.parse(context);
+        encrypted = CryptoJS.AES.encrypt(srcs, key, {
+            iv: iv,
+            mode: CryptoJS.mode.CBC,
+            padding: CryptoJS.pad.Pkcs7
+        });
+        return encrypted.toString();
+    }
+    // aes解密
+    function decrypt(context) {
+        var decrypt = CryptoJS.AES.decrypt(context, key, {
+            iv: iv,
+            mode: CryptoJS.mode.CBC,
+            padding: CryptoJS.pad.Pkcs7
+        });
+        var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
+        return decryptedStr.toString();
+    }
+    function login(){
+        let password = $('#password').val();
+        password = encrypt(password);
+        $('#password').val(password);
+        $('#submit').submit();
+    }
+
+
+    window.addEventListener(
+        "mousewheel",
+        function(event) {
+            if (event.ctrlKey === true || event.metaKey) {
+                event.preventDefault();
+            }
+        },
+        { passive: false }
+    );
+
+    //firefox
+    window.addEventListener(
+        "DOMMouseScroll",
+        function(event) {
+            if (event.ctrlKey === true || event.metaKey) {
+                event.preventDefault();
+            }
+        },
+        { passive: false }
+    );
+
+
+    function fontSize(designWidth, maxWidth, minWidth) {
+        var doc = document,
+            win = window,
+            docEl = doc.documentElement,
+            remStyle = document.createElement("style"),
+            tid;
+
+        function refreshRem() {
+            var width = docEl.getBoundingClientRect().width;
+            maxWidth = maxWidth || 540;
+            width > maxWidth && (width = maxWidth);
+            var rem = (width * 100) / designWidth;
+            remStyle.innerHTML = "html{font-size:" + rem + "px;}";
+        }
+
+        if (docEl.firstElementChild) {
+            docEl.firstElementChild.appendChild(remStyle);
+        } else {
+            var wrap = doc.createElement("div");
+            wrap.appendChild(remStyle);
+            doc.write(wrap.innerHTML);
+            wrap = null;
+        }
+        // 要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次;
+        refreshRem();
+
+        win.addEventListener(
+            "resize",
+            function(res) {
+                // console.log(res);
+                if (minWidth < res.currentTarget.innerWidth) {
+                    clearTimeout(tid); //防止执行两次
+                    return;
+                }
+
+                tid = setTimeout(refreshRem, 10);
+            },
+            false
+        );
+
+        win.addEventListener(
+            "pageshow",
+            function(e) {
+                if (e.persisted) {
+                    // 浏览器后退的时候重新计算
+                    clearTimeout(tid);
+                    tid = setTimeout(refreshRem, 300);
+                }
+            },
+            false
+        );
+
+        if (doc.readyState === "complete") {
+            doc.body.style.fontSize = "16px";
+        } else {
+            doc.addEventListener(
+                "DOMContentLoaded",
+                function(e) {
+                    doc.body.style.fontSize = "16px";
+                },
+                false
+            );
+        }
+    }
+    fontSize(768, 1920);
+</script>
+</body>
+
+</html>
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/netCarInfo.html b/management/guns-admin/src/main/webapp/WEB-INF/view/netCarInfo.html
new file mode 100644
index 0000000..76a4e05
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/netCarInfo.html
@@ -0,0 +1,25 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    tr{
+        height: 40px;
+    }
+    td{
+        width: 200px;
+    }
+    h4{
+        color: #1AB394;
+    }
+    img{
+        height: 80px;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <input type="hidden" id="driverId" value="${id}">
+        <div class="form-horizontal" id="content">
+
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/netCarInfo.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/code/code.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/code/code.html
new file mode 100644
index 0000000..cacd239
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/code/code.html
@@ -0,0 +1,47 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-6  col-sm-offset-3">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>代码生成</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="form-horizontal">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">模块英文名称</label>
+                        <div class="col-sm-10">
+                            <input type="text" class="form-control" id="moduleName"> <span class="help-block m-b-none">例如:system</span>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">业务名称</label>
+                        <div class="col-sm-10">
+                            <input type="text" class="form-control" id="bizChName"> <span class="help-block m-b-none">例如:测试</span>
+                        </div>
+                    </div>
+                    <div class="hr-line-dashed"></div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">业务英文名称</label>
+                        <div class="col-sm-10">
+                            <input type="text" class="form-control" id="bizEnName"> <span class="help-block m-b-none">例如:test</span>
+                        </div>
+                    </div>
+                    <div class="hr-line-dashed"></div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">输出路径</label>
+                        <div class="col-sm-10">
+                            <input type="text" class="form-control" id="path"> <span class="help-block m-b-none">默认路径为D:\ideaSpace\guns,可修改为您的项目的路径</span>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <div class="col-sm-4 col-sm-offset-2">
+                            <button class="btn btn-primary" onclick="Code.generate()">代码生成</button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/code/code.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept.html
new file mode 100644
index 0000000..a0570a2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept.html
@@ -0,0 +1,38 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>部门管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="condition" name="名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="Dept.search()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="DeptTableToolbar" role="group">
+                            @if(shiro.hasPermission("/dept/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="Dept.openAddDept()"/>
+                            @}
+                            @if(shiro.hasPermission("/dept/update")){
+                                <#button name="修改" icon="fa-plus" clickFun="Dept.openDeptDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/dept/delete")){
+                                <#button name="删除" icon="fa-plus" clickFun="Dept.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="DeptTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/dept/dept.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept_add.html
new file mode 100644
index 0000000..2be4b89
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept_add.html
@@ -0,0 +1,42 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="deptInfoForm">
+
+            <input type="hidden" id="id" value="">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#input id="simplename" name="部门名称" underline="true"/>
+
+                    <#input id="fullname" name="部门全称" underline="true"/>
+
+                    <#input id="tips" name="备注" underline="true"/>
+                </div>
+                <div class="col-sm-6">
+                    <#input id="num" name="排序" underline="true"/>
+
+                    <#input id="pName" name="上级部门" readonly="readonly" hidden="pid"
+                            clickFun="DeptInfoDlg.showDeptSelectTree(); return false;"
+                            style="background-color: #ffffff !important;"/>
+                </div>
+            </div>
+
+            <!-- 父级部门的选择框 -->
+            <div id="parentDeptMenu" class="menuContent"
+                 style="display: none; position: absolute; z-index: 200;">
+                <ul id="parentDeptMenuTree" class="ztree tree-box" style="width: 245px !important;"></ul>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DeptInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="DeptInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/dept/dept_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept_edit.html
new file mode 100644
index 0000000..c805552
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dept/dept_edit.html
@@ -0,0 +1,44 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="deptInfoForm">
+
+            <input type="hidden" id="id" value="${dept.id}">
+            <input type="hidden" id="pid" value="${dept.pid}">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#input id="simplename" name="部门名称" underline="true" value="${dept.simplename}"/>
+
+                    <#input id="fullname" name="部门全称" underline="true" value="${dept.fullname}"/>
+
+                    <#input id="tips" name="备注" underline="true" value="${dept.tips}"/>
+                </div>
+                <div class="col-sm-6">
+                    <#input id="num" name="排序" underline="true" value="${dept.num}"/>
+
+                    <#input id="pName" name="上级部门" readonly="readonly" hidden="pid"
+                            hiddenValue="${dept.pid}" value="${pName}"
+                            clickFun="DeptInfoDlg.showDeptSelectTree(); return false;"
+                            style="background-color: #ffffff !important;"/>
+                </div>
+            </div>
+
+            <!-- 父级部门的选择框 -->
+            <div id="parentDeptMenu" class="menuContent"
+                 style="display: none; position: absolute; z-index: 200;">
+                <ul id="parentDeptMenuTree" class="ztree tree-box" style="width: 245px !important;"></ul>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DeptInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="DeptInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/dept/dept_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict.html
new file mode 100644
index 0000000..2bf81ee
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict.html
@@ -0,0 +1,38 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>字典管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="condition" name="名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="Dict.search()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="DictTableToolbar" role="group">
+                            @if(shiro.hasPermission("/dict/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="Dict.openAddDict()"/>
+                            @}
+                            @if(shiro.hasPermission("/dict/update")){
+                                <#button name="修改" icon="fa-plus" clickFun="Dict.openDictDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/dict/delete")){
+                                <#button name="删除" icon="fa-plus" clickFun="Dict.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="DictTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/dict/dict.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict_add.html
new file mode 100644
index 0000000..f3d51f3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict_add.html
@@ -0,0 +1,64 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <input type="hidden" id="id" value="">
+
+            <div class="row">
+                <div class="col-sm-12" id="itemsArea">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">类型编码</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" id="dictCode" type="text">
+                        </div>
+                        <label class="col-sm-2 control-label">类型名称</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" id="dictName" type="text">
+                        </div>
+
+                        <div class="col-sm-2">
+                            <#button btnCss="info" name="增加" icon="fa-plus" clickFun="DictInfoDlg.addItem()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">备注</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" id="dictTips" type="text">
+                        </div>
+                    </div>
+                    <div class="hr-line-dashed"></div>
+
+                </div>
+            </div>
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DictInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="DictInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <script type="text/template" id="itemTemplate">
+        <div class="form-group" name="dictItem" id="dictItem">
+            <label class="col-sm-1 control-label">值</label>
+            <div class="col-sm-2">
+                <input class="form-control" type="text" name="itemCode">
+            </div>
+            <label class="col-sm-1 control-label" >名称</label>
+            <div class="col-sm-2">
+                <input class="form-control" type="text" name="itemName">
+            </div>
+            <label class="col-sm-1 control-label" >序号</label>
+            <div class="col-sm-2">
+                <input class="form-control" type="text" name="itemNum">
+            </div>
+            <div class="col-sm-2">
+                <#button btnCss="danger" name="删除" id="cancel" icon="fa-remove" clickFun="DictInfoDlg.deleteItem(event)"/>
+            </div>
+        </div>
+    </script>
+
+    <script src="${ctxPath}/static/modular/system/dict/dict_info.js"></script>
+    @}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict_edit.html
new file mode 100644
index 0000000..84027c5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/dict/dict_edit.html
@@ -0,0 +1,86 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <input type="hidden" id="id" value="">
+
+            <div class="row">
+                <div class="col-sm-12" id="itemsArea">
+                    <input type="hidden" id="itemSize" value="${subDicts.~size!0}" />
+                    <div class="form-group">
+
+                        <label class="col-sm-2 control-label">类型编码</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" id="dictCode" type="text" value="${dict.code}">
+                        </div>
+
+                        <label class="col-sm-2 control-label">类型名称</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" id="dictName" type="text" value="${dict.name}">
+                            <input type="hidden" id="dictId" value="${dict.id}">
+                        </div>
+
+                        <div class="col-sm-2">
+                            <#button btnCss="info" name="增加" icon="fa-plus" clickFun="DictInfoDlg.addItem()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">备注</label>
+                        <div class="col-sm-8">
+                            <input class="form-control" id="dictTips" type="text" value="${dict.tips}">
+                        </div>
+                    </div>
+                    <div class="hr-line-dashed"></div>
+                    @for(item in subDicts){
+                    <div class="form-group" name="dictItem" id="dictItem${itemLP.index}">
+                        <label class="col-sm-1 control-label">值</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" type="text" name="itemCode" value="${item.code}">
+                        </div>
+                        <label class="col-sm-1 control-label" >名称</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" type="text" name="itemName" value="${item.name}">
+                        </div>
+                        <label class="col-sm-1 control-label" >序号</label>
+                        <div class="col-sm-2">
+                            <input class="form-control" type="text" name="itemNum" value="${item.num}">
+                        </div>
+                        <div class="col-sm-2">
+                            <#button btnCss="danger" name="删除" id="cancel" icon="fa-remove" clickFun="DictInfoDlg.deleteItem(event)"/>
+                        </div>
+                    </div>
+                    @}
+                    </input>
+                </div>
+                <div class="row btn-group-m-t">
+                    <div class="col-sm-10 col-sm-offset-5">
+                        <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DictInfoDlg.editSubmit()"/>
+                        <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="DictInfoDlg.close()"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <script type="text/template" id="itemTemplate">
+            <div class="form-group" name="dictItem" id="dictItem">
+                <label class="col-sm-1 control-label">值</label>
+                <div class="col-sm-2">
+                    <input class="form-control" type="text" name="itemCode">
+                </div>
+                <label class="col-sm-1 control-label" >名称</label>
+                <div class="col-sm-2">
+                    <input class="form-control" type="text" name="itemName">
+                </div>
+                <label class="col-sm-1 control-label" >序号</label>
+                <div class="col-sm-2">
+                    <input class="form-control" type="text" name="itemNum">
+                </div>
+                <div class="col-sm-2">
+                    <#button btnCss="danger" name="删除" id="cancel" icon="fa-remove" clickFun="DictInfoDlg.deleteItem(event)"/>
+                </div>
+            </div>
+        </script>
+
+        <script src="${ctxPath}/static/modular/system/dict/dict_info.js"></script>
+        @}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity.html
new file mode 100644
index 0000000..5707610
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity.html
@@ -0,0 +1,57 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="DriverActivity.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="DriverActivity.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="DriverActivityTableToolbar" role="group">
+                            @if(shiro.hasPermission("/driverActivity/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="DriverActivity.openAddDriverActivity()"/>
+                            @}
+                            @if(shiro.hasPermission("/driverActivity/update")){
+                                <#button name="编辑" icon="fa-edit" clickFun="DriverActivity.openUpdateDriverActivity()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/driverActivity/updateStatus")){
+                            <#button name="启动/暂停" icon="" clickFun="DriverActivity.updateStatus()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/driverActivity/detail")){
+                            <#button name="详情" icon="" clickFun="DriverActivity.openDriverActivityDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/driverActivity/receiveRecord")){
+                            <#button name="领取记录" icon="" clickFun="DriverActivity.receiveRecord()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/driverActivity/immediately")){
+                            <#button name="审核" icon="" clickFun="DriverActivity.immediately()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="DriverActivityTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/driverActivity/driverActivity.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_add.html
new file mode 100644
index 0000000..0350c90
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_add.html
@@ -0,0 +1,85 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <div class="col-sm-10">
+                            活动名称:&nbsp;<input type="text"  name="zc1" id="num1" class="form-control newWidth" />&nbsp;
+                            <br/>
+                            <br/>
+                            司机邀请司机注册
+                            <br/>
+                            <br/>
+
+                            司机注册既赠送&nbsp;<input type="text"    id="num2" class="form-control newWidth" />&nbsp;元
+                            <br/>
+                            <br/>
+                            司机邀请用户注册
+                            <br/>
+                            <br/>
+                            用户注册既赠送&nbsp;<input type="text"   id="num3" class="form-control newWidth" />&nbsp;元
+                            <br/>
+                            <br/>
+                            司机APP每天累计在线奖励
+                            <br/>
+                            <br/>
+                            专车累计在线&nbsp;<input type="text"   id="num4" class="form-control newWidth" />&nbsp;小时奖励
+                            &nbsp;<input type="text"   id="num5" class="form-control newWidth" />&nbsp;元
+                            <br/>
+                            <br/>
+                            出租车累计在线&nbsp;<input type="text"  id="num6" class="form-control newWidth" />&nbsp;小时奖励
+                            &nbsp;<input type="text"  id="num7" class="form-control newWidth" />&nbsp;元
+                            <br/>
+                            <br/>
+                            跨城出行累计在线&nbsp;<input type="text"   id="num8" class="form-control newWidth" />&nbsp;小时奖励
+                            &nbsp;<input type="text"   id="num9" class="form-control newWidth" />&nbsp;元
+                            <br/>
+                            <br/>
+                            司机累计达到规定订单数奖励
+                            <br/>
+                            <br/>
+                            每天&nbsp;<input type="text"  id="staTime" class="form-control newWidth" />&nbsp;司机接单达到
+                            &nbsp;<input type="text"  id="num10" class="form-control newWidth" />&nbsp;单既奖励
+                            &nbsp;<input type="text"  id="num11" class="form-control newWidth" />&nbsp;元
+                            <br/>
+                            <br/>
+                            有效期为&nbsp;<input type="text" id="startTime"  name="zc7" class="form-control" style="max-width:300px !important;display: initial !important;" />
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DriverActivityInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="DriverActivityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/driverActivity/driverActivity_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#startTime'
+        ,type: 'datetime'
+        ,range: true
+        ,min: 'new Date()' //最小值今天
+    });
+    laydate.render({
+        elem: '#staTime',
+        range: true,
+        type:'time',
+        format: 'HH:mm'
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_detail.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_detail.html
new file mode 100644
index 0000000..d23f29f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_detail.html
@@ -0,0 +1,132 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <div class="col-sm-10">
+                            活动名称:&nbsp;<input type="text" value="${item.name}"  name="zc1" id="zc1" class="form-control newWidth" readonly />&nbsp;
+                            <br/>
+                            <br/>
+                            司机邀请司机注册
+                            <br/>
+                            <br/>
+
+                            司机注册既赠送&nbsp;<input type="text"  @if(isNotEmpty(regist1)){
+                                                value="${regist1.money}"
+                                                @}else{
+                                                value=""
+                                                @}
+                                                name="zc7" class="form-control newWidth" readonly/>&nbsp;元
+                            <br/>
+                            <br/>
+                            司机邀请用户注册
+                            <br/>
+                            <br/>
+                            用户注册既赠送&nbsp;<input type="text" @if(isNotEmpty(regist2)){
+                                                value="${regist2.money}"
+                                                @}else{
+                                                value=""
+                                                @}
+                                                name="zc7" class="form-control newWidth" readonly/>&nbsp;元
+                            <br/>
+                            <br/>
+                            司机APP每天累计在线奖励
+                            <br/>
+                            <br/>
+                            专车累计在线&nbsp;<input type="text" @if(isNotEmpty(online1)){
+                                               value="${online1.online}"
+                                               @}else{
+                                               value=""
+                                               @}
+                                               name="zc7" class="form-control newWidth" readonly/>&nbsp;小时奖励
+                            &nbsp;<input type="text" @if(isNotEmpty(online1)){
+                                         value="${online1.money}"
+                                         @}else{
+                                         value=""
+                                         @}
+                                         name="zc7" class="form-control newWidth" readonly/>&nbsp;元
+                            <br/>
+                            <br/>
+                            出租车累计在线&nbsp;<input type="text" @if(isNotEmpty(online2)){
+                                                value="${online2.online}"
+                                                @}else{
+                                                value=""
+                                                @}
+                                                name="zc7" class="form-control newWidth" readonly/>&nbsp;小时奖励
+                            &nbsp;<input type="text" @if(isNotEmpty(online2)){
+                                         value="${online2.money}"
+                                         @}else{
+                                         value=""
+                                         @}
+                                         name="zc7" class="form-control newWidth" readonly/>&nbsp;元
+                            <br/>
+                            <br/>
+                            跨城出行累计在线&nbsp;<input type="text" @if(isNotEmpty(online3)){
+                                                 value="${online3.online}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc7" class="form-control newWidth" readonly/>&nbsp;小时奖励
+                            &nbsp;<input type="text" @if(isNotEmpty(online3)){
+                                         value="${online3.money}"
+                                         @}else{
+                                         value=""
+                                         @}
+                                         name="zc7" class="form-control newWidth" readonly/>&nbsp;元
+                            <br/>
+                            <br/>
+                            司机累计达到规定订单数奖励
+                            <br/>
+                            <br/>
+                            每天&nbsp;<input type="text" @if(isNotEmpty(order)){
+                                           value="${order.start}"
+                                           @}else{
+                                           value=""
+                                           @}
+                                           name="zc7" class="form-control newWidth" readonly/>-
+                            &nbsp;<input type="text" @if(isNotEmpty(order)){
+                                         value="${order.end}"
+                                         @}else{
+                                         value=""
+                                         @}
+                                         name="zc7" class="form-control newWidth" readonly/>&nbsp;司机接单达到
+                            &nbsp;<input type="text" @if(isNotEmpty(order)){
+                                         value="${order.orderNum}"
+                                         @}else{
+                                         value=""
+                                         @}
+                                         name="zc7" class="form-control newWidth" readonly/>&nbsp;单既奖励
+                            &nbsp;<input type="text" @if(isNotEmpty(order)){
+                                         value="${order.money}"
+                                         @}else{
+                                         value=""
+                                         @}
+                                         name="zc7" class="form-control newWidth" readonly/>&nbsp;元
+                            <br/>
+                            <br/>
+                            有效期为&nbsp;<input type="text" value="${startTime}" name="zc7" class="form-control newWidth" readonly/>-
+                            &nbsp;<input type="text" value="${endTime}" name="zc7" class="form-control newWidth" readonly/>&nbsp;
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="DriverActivityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/driverActivity/driverActivity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_edit.html
new file mode 100644
index 0000000..eaad672
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_edit.html
@@ -0,0 +1,138 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <input type="hidden" id="id" value="${item.id}">
+                        <div class="col-sm-10">
+                            活动名称:&nbsp;<input type="text" value="${item.name}"  name="zc1" id="num1" class="form-control newWidth" />&nbsp;
+                            <br/>
+                            <br/>
+                            司机邀请司机注册
+                            <br/>
+                            <br/>
+
+                            司机注册既赠送&nbsp;<input type="text"  @if(isNotEmpty(regist1)){
+                                                value="${regist1.money}"
+                                                @}else{
+                                                value=""
+                                                @}
+                                                name="zc7" id="num2" class="form-control newWidth"/>&nbsp;元
+                            <br/>
+                            <br/>
+                            司机邀请用户注册
+                            <br/>
+                            <br/>
+                            用户注册既赠送&nbsp;<input type="text" @if(isNotEmpty(regist2)){
+                                                value="${regist2.money}"
+                                                @}else{
+                                                value=""
+                                                @}
+                                                name="zc7" id="num3" class="form-control newWidth"/>&nbsp;元
+                            <br/>
+                            <br/>
+                            司机APP每天累计在线奖励
+                            <br/>
+                            <br/>
+                            专车累计在线&nbsp;<input type="text" @if(isNotEmpty(online1)){
+                                               value="${online1.online}"
+                                               @}else{
+                                               value=""
+                                               @}
+                                               name="zc7" id="num4" class="form-control newWidth"/>&nbsp;小时奖励
+                            &nbsp;<input type="text" @if(isNotEmpty(online1)){
+                                         value="${online1.money}"
+                                         @}else{
+                                         value=""
+                                         @}
+                                         name="zc7" id="num5" class="form-control newWidth"/>&nbsp;元
+                            <br/>
+                            <br/>
+                            出租车累计在线&nbsp;<input type="text" @if(isNotEmpty(online2)){
+                                                value="${online2.online}"
+                                                @}else{
+                                                value=""
+                                                @}
+                                                name="zc7" id="num6" class="form-control newWidth"/>&nbsp;小时奖励
+                            &nbsp;<input type="text" @if(isNotEmpty(online2)){
+                                         value="${online2.money}"
+                                         @}else{
+                                         value=""
+                                         @}
+                                         name="zc7" id="num7" class="form-control newWidth"/>&nbsp;元
+                            <br/>
+                            <br/>
+                            跨城出行累计在线&nbsp;<input type="text" @if(isNotEmpty(online3)){
+                                                 value="${online3.online}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc7" id="num8" class="form-control newWidth"/>&nbsp;小时奖励
+                            &nbsp;<input type="text" @if(isNotEmpty(online3)){
+                                         value="${online3.money}"
+                                         @}else{
+                                         value=""
+                                         @}
+                                         name="zc7" id="num9" class="form-control newWidth"/>&nbsp;元
+                            <br/>
+                            <br/>
+                            司机累计达到规定订单数奖励
+                            <br/>
+                            <br/>
+                            每天&nbsp;<input type="text"  id="staTime" class="form-control newWidth" />&nbsp;司机接单达到
+                            &nbsp;<input type="text" @if(isNotEmpty(order)){
+                                         value="${order.orderNum}"
+                                         @}else{
+                                         value=""
+                                         @}
+                                         name="zc7" id="num10" class="form-control newWidth"/>&nbsp;单既奖励
+                            &nbsp;<input type="text" @if(isNotEmpty(order)){
+                                         value="${order.money}"
+                                         @}else{
+                                         value=""
+                                         @}
+                                         name="zc7" id="num11" class="form-control newWidth"/>&nbsp;元
+                            <br/>
+                            <br/>
+                            有效期为&nbsp;<input type="text" id="startTime"  name="zc7" class="form-control" style="max-width:300px !important;display: initial !important;" />
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DriverActivityInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="DriverActivityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/driverActivity/driverActivity_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#startTime'
+        ,type: 'datetime'
+        ,range: true
+        ,min: 'new Date()' //最小值今天
+    });
+    laydate.render({
+        elem: '#staTime'
+        ,range: true,
+        type:'time',
+        format: 'HH:mm'
+    });
+    $("#startTime").val("${startTime} - ${endTime}")
+    $("#staTime").val("${startTime1}")
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_immediately.html
new file mode 100644
index 0000000..80af27d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/driverActivity_immediately.html
@@ -0,0 +1,41 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="sysCouponActivityInfoForm">
+            <input type="hidden" id="id" name="id" value="${id}">
+            <div class="row">
+                <div class="col-sm-10">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">处理意见:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="state2" value="3" name="state" checked="" >
+                                <label for="state2"> 同意 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="state3" value="2" name="state" >
+                                <label for="state3"> 拒绝 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">填写备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DriverActivityInfoDlg.immediately()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="DriverActivityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/driverActivity/driverActivity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/receiveRecord.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/receiveRecord.html
new file mode 100644
index 0000000..823247d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivity/receiveRecord.html
@@ -0,0 +1,226 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+
+    ztree li span. {
+        margin-left: 4px;
+        margin-right: -1px;
+        background-position: -144px 0;
+        vertical-align: top;
+        *vertical-align: middle
+    }
+
+    .titleDiv {
+        overflow: hidden;
+    }
+
+    .titleItem {
+        float: left;
+        text-align: center;
+        width: 180px;
+        line-height: 40px;
+        border-top: 1px solid #E7EBEE;
+        border-bottom: 1px solid #E7EBEE;
+        border-left: 1px solid #E7EBEE;
+        font-size: 16px;
+    }
+
+    .titleItem1 {
+        float: left;
+        text-align: center;
+        width: 180px;
+        line-height: 40px;
+        border-bottom: 1px solid #E7EBEE;
+        border-left: 1px solid #E7EBEE;
+        font-size: 16px;
+    }
+
+    .titleItemCk {
+        color: #fff !important;
+        background: #1AB395 !important;
+    }
+
+    .titleItem:last-child {
+        border-right: 1px solid #E7EBEE;
+    }
+
+    /* 订单分析 */
+    ul {
+        list-style-type: none;
+    }
+
+    .orderFenxiBox {
+        width: 100%;
+        display: flex;
+        align-items: center;
+        background-color: white;
+    }
+
+    .orderFenxiItem {
+        flex: 1;
+        padding: 20px 0;
+    }
+
+    .orderFenxiItem:last-child  .orderFenxiItem_number {
+        border-right: 0 none;
+    }
+
+    .orderFenxiItem_number {
+        width: 80%;
+        height: 80%;
+        line-height: 90px;
+        padding: 20px 0;
+        font-size: 32px;
+        color: #1AB394;
+        text-align: center;
+        border-right: 1px solid #eaeaea;
+    }
+
+    .orderFenxiItem_title, .orderFenxiItem_last {
+        line-height: 40px;
+        font-size: 14px;
+    }
+</style>
+
+<div class="row" style="margin-left: 2%;">
+    <div class="col-sm-3">
+        <input id="activityId" value="${activityId}" type="hidden">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>活动时间:<input type="text" id="startTime"  name="zc7" class="form-control" style="max-width:250px !important;display: initial !important;" onchange="receiveRecordDetail()"/></h3>
+            </div>
+            <div class="ibox-title">
+                <h3>领取总金额<span id="totalMOney"></span></h3>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<div class="row" style="margin-left: 2%;">
+    <div class="col-sm-3">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>邀请司机注册</h3>
+            </div>
+            <div class="ibox-content">
+                <h1 class="no-margins text-navy">领取人数:<span id="number1"></span></h1>
+                <h1 class="no-margins text-navy">领取金额:<span id="money1"></span></h1>
+            </div>
+            <h4><a href="#" onclick="driverActivityHistory(1,${id1})">领取列表</a></h4>
+        </div>
+    </div>
+    <div class="col-sm-3">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>邀请用户注册</h3>
+            </div>
+            <div class="ibox-content">
+                <h1 class="no-margins text-navy">领取人数:<span id="number2"></span></h1>
+                <h1 class="no-margins text-navy">领取金额:<span id="money2"></span></h1>
+            </div>
+            <h4><a href="#" onclick="driverActivityHistory(2,${id2})">领取列表</a></h4>
+        </div>
+    </div>
+    <div class="col-sm-3">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>专车累计在线</h3>
+            </div>
+            <div class="ibox-content">
+                <h1 class="no-margins text-navy">领取人数:<span id="number3"></span></h1>
+                <h1 class="no-margins text-navy">领取金额:<span id="money3"></span></h1>
+            </div>
+            <h4><a href="#" onclick="driverActivityHistory(3,${id3})">领取列表</a></h4>
+        </div>
+    </div>
+    <div class="col-sm-3">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>出租车累计在线</h3>
+            </div>
+            <div class="ibox-content">
+                <h1 class="no-margins text-navy">领取人数:<span id="number4"></span></h1>
+                <h1 class="no-margins text-navy">领取金额:<span id="money4"></span></h1>
+            </div>
+            <h4><a href="#" onclick="driverActivityHistory(3,${id4})">领取列表</a></h4>
+        </div>
+    </div>
+    <div class="col-sm-3">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>跨城累计在线</h3>
+            </div>
+            <div class="ibox-content">
+                <h1 class="no-margins text-navy">领取人数:<span id="number5"></span></h1>
+                <h1 class="no-margins text-navy">领取金额:<span id="money5"></span></h1>
+            </div>
+            <h4><a href="#" onclick="driverActivityHistory(3,${id5})">领取列表</a></h4>
+        </div>
+    </div>
+    <div class="col-sm-3">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>订单数奖励</h3>
+            </div>
+            <div class="ibox-content">
+                <h1 class="no-margins text-navy">领取人数:<span id="number6"></span></h1>
+                <h1 class="no-margins text-navy">领取金额:<span id="money6"></span></h1>
+            </div>
+            <h4><a href="#" onclick="driverActivityHistory(4,${id6})">领取列表</a></h4>
+        </div>
+    </div>
+</div>
+
+
+<!-- ChartJS-->
+<script type="text/javascript">
+    $(function () {
+        $("#startTime").val("${startTime} - ${endTime}")
+        receiveRecordDetail("${startTime} - ${endTime}");
+    })
+    laydate.render({
+        elem: '#startTime'
+        ,range: true
+        ,done: function(value, date, endDate){
+            // 回调函数
+            receiveRecordDetail(value);
+        }
+    });
+
+    function receiveRecordDetail(times){
+        var ajax = new $ax(Feng.ctxPath + "/driverActivity/receiveRecordDetail", function (data) {
+            $("#totalMOney").html(data.totalMOney);
+            $("#money1").html(data.money1);
+            $("#number1").html(data.number1);
+            $("#money2").html(data.money2);
+            $("#number2").html(data.number2);
+            $("#money3").html(data.money3);
+            $("#number3").html(data.number3);
+            $("#money4").html(data.money4);
+            $("#number4").html(data.number4);
+            $("#money5").html(data.money5);
+            $("#number5").html(data.number5);
+            $("#money6").html(data.money6);
+            $("#number6").html(data.number6);
+        }, function (data) {
+            Feng.error("操作失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("createTime",times);
+        ajax.set("activityId",$("#activityId").val());
+        ajax.start();
+    }
+    /**
+     * 领取记录
+     */
+    function driverActivityHistory(type,id) {
+        layer.open({
+            type: 2,
+            title: '领取记录',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/driverActivityHistory?activityId='+ id+"&type="+type
+        });
+    };
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivityHistory/driverActivityHistory.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivityHistory/driverActivityHistory.html
new file mode 100644
index 0000000..1dda419
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/driverActivityHistory/driverActivityHistory.html
@@ -0,0 +1,25 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>领取记录</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <input type="hidden" id="type" value="${type}">
+                    <input type="hidden" id="activityId" value="${activityId}">
+                    <div class="col-sm-12">
+
+                        <div class="hidden-xs" id="DriverActivityHistoryTableToolbar" role="group">
+
+                        </div>
+                        <#table id="DriverActivityHistoryTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/driverActivityHistory/driverActivityHistory.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/log/log.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/log/log.html
new file mode 100644
index 0000000..a9b7f48
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/log/log.html
@@ -0,0 +1,48 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>业务日志</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-2">
+                                <#NameCon id="beginTime" name="开始时间" isTime="false" pattern="YYYY-MM-DD" />
+                            </div>
+                            <div class="col-sm-2">
+                                <#NameCon id="endTime" name="结束时间" isTime="false" pattern="YYYY-MM-DD" />
+                            </div>
+                            <div class="col-sm-2">
+                                <#NameCon id="logName" name="用户名称" />
+                            </div>
+                            <div class="col-sm-2">
+                                <#button name="搜索" icon="fa-search" clickFun="OptLog.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="OptLog.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="OptLogTableToolbar" role="group">
+                            <#button name="查看详情" icon="fa-plus" clickFun="OptLog.detail()"/>
+                            @if(shiro.hasPermission("/log/delLog")){
+                                <#button name="清空日志" icon="fa-plus" clickFun="OptLog.delLog()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="OptLogTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/log/log.js"></script>
+<script>
+    laydate.render({
+        elem: '#beginTime',
+    });
+    laydate.render({
+        elem: '#endTime',
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/log/login_log.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/log/login_log.html
new file mode 100644
index 0000000..8d38ac9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/log/login_log.html
@@ -0,0 +1,47 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>登录日志</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="beginTime" name="开始时间" isTime="false" pattern="YYYY-MM-DD" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="endTime" name="结束时间" isTime="false" pattern="YYYY-MM-DD" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="logName" name="用户名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="LoginLog.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="LoginLog.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="LoginLogTableToolbar" role="group">
+                            @if(shiro.hasPermission("/loginLog/delLoginLog")){
+                            <#button name="清空日志" icon="fa-plus" clickFun="LoginLog.delLog()"/>
+                            @}
+                        </div>
+                        <#table id="LoginLogTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/log/login_log.js"></script>
+<script>
+    laydate.render({
+        elem: '#beginTime',
+    });
+    laydate.render({
+        elem: '#endTime',
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu.html
new file mode 100644
index 0000000..b0e89a7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu.html
@@ -0,0 +1,41 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>菜单管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="menuName" name="菜单名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="level" name="层级" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="Menu.search()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="menuTableToolbar" role="group">
+                            @if(shiro.hasPermission("/menu/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="Menu.openAddMenu()"/>
+                            @}
+                            @if(shiro.hasPermission("/menu/edit")){
+                                <#button name="修改" icon="fa-edit" clickFun="Menu.openChangeMenu()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/menu/remove")){
+                                <#button name="删除" icon="fa-remove" clickFun="Menu.delMenu()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="menuTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/menu/menu.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu_add.html
new file mode 100644
index 0000000..aef8ae7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu_add.html
@@ -0,0 +1,40 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+	<div class="ibox-content">
+		<div class="form-horizontal" id="menuInfoForm">
+		
+			<input type="hidden" id="id" value="">
+
+			<div class="row">
+				<div class="col-sm-6 b-r">
+					<#input id="name" name="名称" underline="true" />
+					<#input id="code" name="菜单编号" underline="true" />
+					<#input id="pcodeName" name="父级编号" underline="true"
+							hidden="pcode" readonly="readonly"
+							clickFun="MenuInfoDlg.showMenuSelectTree(); return false;"
+							style="background-color: #ffffff !important;"
+							selectFlag="true" selectId="pcodeTreeDiv" selectTreeId="pcodeTree" selectStyle="width:244px !important;"/>
+					<#select id="ismenu" name="是否是菜单">
+						<option value="1">是</option>
+						<option value="0">不是</option>
+					</#select>
+				</div>
+				<div class="col-sm-6">
+					<#input id="url" name="请求地址" underline="true" />
+					<#input id="num" name="排序" underline="true" />
+					<#input id="icon" name="图标" underline="false" value="fa-bars" />
+				</div>
+			</div>
+
+			<div class="row btn-group-m-t">
+				<div class="col-sm-10 col-sm-offset-5">
+					<#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="MenuInfoDlg.addSubmit()"/>
+					<#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="MenuInfoDlg.close()"/>
+				</div>
+			</div>
+		</div>
+
+	</div>
+</div>
+<script src="${ctxPath}/static/modular/system/menu/menu_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu_edit.html
new file mode 100644
index 0000000..608a280
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/menu/menu_edit.html
@@ -0,0 +1,42 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="menuInfoForm">
+
+            <input type="hidden" id="id" value="${menu.id}">
+            <input type="hidden" id="ismenuValue" value="${menu.ismenu}">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#input id="name" name="名称" value="${menu.name}" underline="true" />
+                    <#input id="code" name="菜单编号" value="${menu.code}" underline="true" />
+                    <#input id="pcodeName" name="父级编号" value="${menu.pcodeName}" underline="true"
+                            hidden="pcode" readonly="readonly" hiddenValue="${menu.pcode}"
+                            clickFun="MenuInfoDlg.showMenuSelectTree(); return false;"
+                            style="background-color: #ffffff !important;"
+                            selectFlag="true" selectId="pcodeTreeDiv" selectTreeId="pcodeTree" selectStyle="width:244px !important;"/>
+                    <#select id="ismenu" name="是否是菜单">
+                        <option value="1">是</option>
+                        <option value="0">不是</option>
+                    </#select>
+
+                </div>
+                <div class="col-sm-6">
+                    <#input id="url" name="请求地址" value="${menu.url}" underline="true" />
+                    <#input id="num" name="排序" value="${menu.num}" underline="true" />
+                    <#input id="icon" name="图标" underline="false" value="${menu.icon}"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="MenuInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="MenuInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/menu/menu_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice.html
new file mode 100644
index 0000000..f373984
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice.html
@@ -0,0 +1,38 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>通知管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="condition" name="名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="Notice.search()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="NoticeTableToolbar" role="group">
+                            @if(shiro.hasPermission("/notice/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="Notice.openAddNotice()"/>
+                            @}
+                            @if(shiro.hasPermission("/notice/update")){
+                                <#button name="修改" icon="fa-plus" clickFun="Notice.openNoticeDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/notice/delete")){
+                                <#button name="删除" icon="fa-plus" clickFun="Notice.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="NoticeTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/notice/notice.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice_add.html
new file mode 100644
index 0000000..037ebdc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice_add.html
@@ -0,0 +1,39 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="noticeInfoForm">
+
+            <input type="hidden" id="id" value="">
+
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label">标题</label>
+                        <div class="col-sm-11">
+                            <input class="form-control" id="title" name="title" type="text">
+
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label">内容</label>
+                        <div class="col-sm-11">
+                            <div id="editor" class="editorHeight">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="NoticeInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="NoticeInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script type="text/javascript" src="//unpkg.com/wangeditor/release/wangEditor.min.js"></script>
+<script src="${ctxPath}/static/modular/system/notice/notice_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice_edit.html
new file mode 100644
index 0000000..1d5de30
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/notice/notice_edit.html
@@ -0,0 +1,39 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="noticeInfoForm">
+
+            <input type="hidden" id="id" value="${notice.id}">
+            <input type="hidden" id="contentVal" value='${notice.content}'>
+
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label">标题</label>
+                        <div class="col-sm-11">
+                            <input class="form-control" id="title" name="title" type="text" value="${notice.title}">
+
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label">内容</label>
+                        <div class="col-sm-11">
+                            <div id="editor" class="editorHeight">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="NoticeInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="NoticeInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="${ctxPath}/static/js/plugins/wangEditor/wangEditor.js"></script>
+<script src="${ctxPath}/static/modular/system/notice/notice_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/report/couponStatistics.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/report/couponStatistics.html
new file mode 100644
index 0000000..1742b48
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/report/couponStatistics.html
@@ -0,0 +1,184 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>优惠券管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row" style="margin-bottom: 20px;">
+                            <ul class="nav nav-tabs">
+                                <li class="active" onclick="CouponStatistics.cutover(1, this)"><a href="#">注册奖励</a></li>
+                                <li onclick="CouponStatistics.cutover(2, this)"><a href="#">邀请奖励</a></li>
+                                <li onclick="CouponStatistics.cutover(3, this)"><a href="#">充值奖励</a></li>
+                                <li onclick="CouponStatistics.cutover(4, this)"><a href="#">打折活动</a></li>
+                                <li onclick="CouponStatistics.cutover(5, this)"><a href="#">红包活动</a></li>
+                            </ul>
+                        </div>
+                        <div id="panel1">
+                            <div class="row">
+                                <div class="col-sm-3">
+                                    <#NameCon id="name1" name="活动名称" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#TimeCon id="time1" name="起止时间" isTime="false"/>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="company1" name="运营商" >
+                                        <option value="">全部</option>
+                                        @for(c in company!){
+                                        <option value="${c.id}">${c.name}</option>
+                                        @}
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#button name="搜索" icon="fa-search" clickFun="CouponStatistics.search1()"/>
+                                    <#button name="重置" icon="fa-search" clickFun="CouponStatistics.resetSearch1()"/>
+                                    <#button name="下载" icon="fa-download" clickFun="CouponStatistics.downloadExcel1()"/>
+                                </div>
+                            </div>
+                            <div class="hidden-xs" id="TCarBrandTable1Toolbar" role="group">
+                                <#button name="注册奖励详情" icon="fa-plus" clickFun="CouponStatistics.openCouponStatisticsInfo1(1)"/>
+                            </div>
+                            <#table id="TCarBrandTable1"/>
+                        </div>
+                        <div id="panel2" style="display: none;">
+                            <div class="row">
+                                <div class="col-sm-3">
+                                    <#NameCon id="name2" name="活动名称" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#TimeCon id="time2" name="起止时间" isTime="false"/>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="company2" name="运营商" >
+                                        <option value="">全部</option>
+                                        @for(c in company!){
+                                        <option value="${c.id}">${c.name}</option>
+                                        @}
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#button name="搜索" icon="fa-search" clickFun="CouponStatistics.search2()"/>
+                                    <#button name="重置" icon="fa-search" clickFun="CouponStatistics.resetSearch2()"/>
+                                    <#button name="下载" icon="fa-download" clickFun="CouponStatistics.downloadExcel2()"/>
+                                </div>
+                            </div>
+                            <div class="hidden-xs" id="TCarBrandTable2Toolbar" role="group">
+                                <#button name="邀请奖励详情" icon="fa-plus" clickFun="CouponStatistics.openCouponStatisticsInfo2(2)"/>
+                            </div>
+                            <#table id="TCarBrandTable2"/>
+                        </div>
+                        <div id="panel3" style="display: none;">
+                            <div class="row">
+                                <div class="col-sm-3">
+                                    <#NameCon id="name3" name="活动名称" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#TimeCon id="time3" name="起止时间" isTime="false"/>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="company3" name="运营商" >
+                                        <option value="">全部</option>
+                                        @for(c in company!){
+                                        <option value="${c.id}">${c.name}</option>
+                                        @}
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#button name="搜索" icon="fa-search" clickFun="CouponStatistics.search3()"/>
+                                    <#button name="重置" icon="fa-search" clickFun="CouponStatistics.resetSearch3()"/>
+                                    <#button name="下载" icon="fa-download" clickFun="CouponStatistics.downloadExcel3()"/>
+                                </div>
+                            </div>
+                            <div class="hidden-xs" id="TCarBrandTable3Toolbar" role="group">
+                                <#button name="充值奖励详情" icon="fa-plus" clickFun="CouponStatistics.openCouponStatisticsInfo3(3)"/>
+                            </div>
+                            <#table id="TCarBrandTable3"/>
+                        </div>
+                        <div id="panel4" style="display: none;">
+                            <div class="row">
+                                <div class="col-sm-3">
+                                    <#NameCon id="name4" name="活动名称" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#TimeCon id="time4" name="起止时间" isTime="false"/>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="company4" name="运营商" >
+                                        <option value="">全部</option>
+                                        @for(c in company!){
+                                        <option value="${c.id}">${c.name}</option>
+                                        @}
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#button name="搜索" icon="fa-search" clickFun="CouponStatistics.search4()"/>
+                                    <#button name="重置" icon="fa-search" clickFun="CouponStatistics.resetSearch4()"/>
+                                    <#button name="下载" icon="fa-download" clickFun="CouponStatistics.downloadExcel4()"/>
+                                </div>
+                            </div>
+                            <div class="hidden-xs" id="TCarBrandTable4Toolbar" role="group">
+                                <#button name="折扣优惠详情" icon="fa-plus" clickFun="CouponStatistics.openCouponStatisticsInfo4(4)"/>
+                            </div>
+                            <#table id="TCarBrandTable4"/>
+                        </div>
+                        <div id="panel5" style="display: none;">
+                            <div class="row">
+                                <div class="col-sm-3">
+                                    <#NameCon id="name5" name="活动名称" />
+                                </div>
+                                <div class="col-sm-3">
+                                    <#TimeCon id="time5" name="起止时间" isTime="false"/>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#SelectCon id="company5" name="运营商" >
+                                        <option value="">全部</option>
+                                        @for(c in company!){
+                                        <option value="${c.id}">${c.name}</option>
+                                        @}
+                                    </#SelectCon>
+                                </div>
+                                <div class="col-sm-3">
+                                    <#button name="搜索" icon="fa-search" clickFun="CouponStatistics.search5()"/>
+                                    <#button name="重置" icon="fa-search" clickFun="CouponStatistics.resetSearch5()"/>
+                                    <#button name="下载" icon="fa-download" clickFun="CouponStatistics.downloadExcel5()"/>
+                                </div>
+                            </div>
+                            <div class="hidden-xs" id="TCarBrandTable5Toolbar" role="group">
+                                <#button name="红包奖励详情" icon="fa-plus" clickFun="CouponStatistics.openCouponStatisticsInfo5(5)"/>
+                            </div>
+                            <#table id="TCarBrandTable5"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/report/couponStatistics.js"></script>
+<script>
+    laydate.render({
+        elem: '#time1'
+        ,range: true
+    });
+    laydate.render({
+        elem: '#time2'
+        ,range: true
+    });
+    laydate.render({
+        elem: '#time3'
+        ,range: true
+    });
+    laydate.render({
+        elem: '#time4'
+        ,range: true
+    });
+    laydate.render({
+        elem: '#time5'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/report/couponStatisticsInfo.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/report/couponStatisticsInfo.html
new file mode 100644
index 0000000..f98ec0f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/report/couponStatisticsInfo.html
@@ -0,0 +1,46 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <input type="hidden" id="type" value="${type}">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="活动名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#TimeCon id="time" name="起止时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="company" name="运营商" >
+                                    <option value="">全部</option>
+                                    @for(c in company!){
+                                    <option value="${c.id}">${c.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="CouponStatisticsInfo.search()"/>
+                                <#button name="重置" icon="fa-search" clickFun="CouponStatisticsInfo.resetSearch()"/>
+                                <#button name="下载" icon="fa-download" clickFun="CouponStatisticsInfo.downloadExcel()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TCarBrandTableToolbar" role="group">
+                        </div>
+                        <#table id="TCarBrandTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/report/couponStatisticsInfo.js"></script>
+<script>
+    laydate.render({
+        elem: '#time'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/report/operationalData.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/report/operationalData.html
new file mode 100644
index 0000000..8cc397d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/report/operationalData.html
@@ -0,0 +1,53 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>优惠券管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#SelectCon id="type" name="类别" >
+                                    <option value="2">出租车</option>
+                                    <option value="1">专车</option>
+                                    <option value="3">跨城</option>
+                                    <option value="4">小件物流</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#TimeCon id="time" name="起止时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="company" name="运营商" >
+                                    <option value="">全部</option>
+                                    @for(c in company!){
+                                    <option value="${c.id}">${c.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="OperationalData.search()"/>
+                                <#button name="重置" icon="fa-search" clickFun="OperationalData.resetSearch()"/>
+                                <#button name="下载" icon="fa-download" clickFun="OperationalData.downloadExcel()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TCarBrandTableToolbar" role="group">
+                        </div>
+                        <#table id="TCarBrandTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/report/operationalData.js"></script>
+<script>
+    laydate.render({
+        elem: '#time'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role.html
new file mode 100644
index 0000000..316cf85
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role.html
@@ -0,0 +1,41 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>角色管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="roleName" name="角色名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="Role.search()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="roleTableToolbar" role="group">
+                            @if(shiro.hasPermission("/role/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="Role.openAddRole()" />
+                            @}
+                            @if(shiro.hasPermission("/role/edit")){
+                                <#button name="修改" icon="fa-edit" clickFun="Role.openChangeRole()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/role/remove")){
+                                <#button name="删除" icon="fa-remove" clickFun="Role.delRole()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/role/setAuthority")){
+                                <#button name="权限配置" icon="fa-user-secret" clickFun="Role.assign()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="roleTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/role/role.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_add.html
new file mode 100644
index 0000000..1d576cc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_add.html
@@ -0,0 +1,47 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+	<div class="ibox-content">
+		<div class="form-horizontal" id="roleInfoForm">
+		
+			<input type="hidden" id="id" value="">
+
+			<div class="row">
+				<div class="col-sm-6 b-r">
+					<#input id="name" name="角色名称" underline="true"/>
+					<#input id="pName" name="上级名称" underline="true" hidden="pid" readonly="readonly"
+							clickFun="RolInfoDlg.showPNameSelectTree(); return false;"
+							style="background-color: #ffffff !important;"/>
+					<#input id="deptName" name="部门名称" hidden="deptid" readonly="readonly"
+							clickFun="RolInfoDlg.showDeptSelectTree(); return false;"
+							style="background-color: #ffffff !important;"/>
+				</div>
+				<div class="col-sm-6">
+					<#input id="tips" name="别名" underline="true"/>
+					<#input id="num" name="排序"/>
+				</div>
+			</div>
+
+			<!-- 这是部门下拉框 -->
+			<div id="deptContent" class="menuContent"
+				style="display: none; position: absolute; z-index: 200;">
+				<ul id="deptTree" class="ztree tree-box" style="width: 250px !important;"></ul>
+			</div>
+			
+			<!-- 这是父级菜单下拉框 -->
+			<div id="pNameContent" class="menuContent"
+				style="display: none; position: absolute; z-index: 200;">
+				<ul id="pNameTree" class="ztree tree-box" style="width: 250px !important;"></ul>
+			</div>
+
+			<div class="row btn-group-m-t">
+				<div class="col-sm-10 col-sm-offset-5">
+					<#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="RolInfoDlg.addSubmit()"/>
+					<#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="RolInfoDlg.close()"/>
+				</div>
+			</div>
+		</div>
+
+	</div>
+</div>
+<script src="${ctxPath}/static/modular/system/role/role_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_assign.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_assign.html
new file mode 100644
index 0000000..6eee434
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_assign.html
@@ -0,0 +1,78 @@
+@layout("/common/_container.html"){
+
+
+<script type="text/javascript">
+    $(function () {
+        var index = parent.layer.getFrameIndex(window.name); //获取窗口索引
+
+        $("#btn_close").bind("click", function () {
+            parent.layer.close(index);
+        });
+
+        $("#btn_save").bind("click", function () {
+            var ids = Feng.zTreeCheckedNodes("zTree");
+            var index = parent.layer.load(0, {shade: false});// 加载动画层,0代表加载的风格,支持0-2
+            var ajax = new $ax(Feng.ctxPath + "/role/setAuthority", function (data) {
+                parent.layer.close(index);// 关闭加载动画层
+                Feng.success("分配角色成功!");
+                window.parent.Role.table.refresh();
+                parent.layer.close(index);
+                parent.layer.close(window.parent.Role.layerIndex);
+            }, function (data) {
+                Feng.error("分配角色失败!"
+                    + data.responseJSON.message + "!");
+            });
+            ajax.set("roleId", "${roleId}");
+            ajax.set("ids", ids);
+            ajax.start();
+        });
+
+        initZtree();
+    });
+
+    function initZtree() {
+        var setting = {
+            check: {
+                enable: true,
+                chkboxType: { "Y": "ps", "N": "ps" }
+            },
+            data: {
+                simpleData: {
+                    enable: true
+                }
+            }
+        };
+
+        var ztree = new $ZTree("zTree", "/menu/menuTreeListByRoleId/"
+            + "${roleId}");
+        ztree.setSettings(setting);
+        ztree.init();
+    }
+</script>
+
+
+<!-- 配置grid -->
+<div class="container" style="padding:  0px 10px !important;margin-top: -10px;text-align: center !important;">
+    <div class="row">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>${roleName!}</h5>
+            </div>
+            <div class="ibox-content">
+                <ul id="zTree" class="ztree"></ul>
+            </div>
+        </div>
+    </div>
+    <div class="row">
+        <div class="col-md-12">
+            <button class="btn btn-sm btn-info" type="button" id="btn_save">
+                <i class="ace-icon fa fa-check bigger-110"></i>保存
+            </button>
+            &nbsp;
+            <button class="btn btn-sm btn-danger" type="button" id="btn_close">
+                <i class="ace-icon fa fa-close bigger-110"></i>关闭
+            </button>
+        </div>
+    </div>
+</div>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_edit.html
new file mode 100644
index 0000000..ae538ac
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/role/role_edit.html
@@ -0,0 +1,47 @@
+ @layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+	<div class="ibox-content">
+		<div class="form-horizontal" id="roleInfoForm">
+		
+			<input type="hidden" id="id" value="${role.id}">
+
+			<div class="row">
+				<div class="col-sm-6 b-r">
+					<#input id="name" name="角色名称" underline="true" value="${role.name}"/>
+					<#input id="pName" name="上级名称" underline="true" hidden="pid" hiddenValue="${role.pid}" readonly="readonly" value="${pName}"
+							clickFun="RolInfoDlg.showPNameSelectTree(); return false;"
+							style="background-color: #ffffff !important;"/>
+					<#input id="deptName" name="部门名称" hidden="deptid" hiddenValue="${role.deptid}" readonly="readonly" value="${deptName}"
+							clickFun="RolInfoDlg.showDeptSelectTree(); return false;"
+							style="background-color: #ffffff !important;"/>
+				</div>
+				<div class="col-sm-6">
+					<#input id="tips" name="别名" underline="true" value="${role.tips}"/>
+					<#input id="num" name="排序" value="${role.num}"/>
+				</div>
+			</div>
+
+			<!-- 这是部门下拉框 -->
+			<div id="deptContent" class="menuContent"
+				style="display: none; position: absolute; z-index: 200;">
+				<ul id="deptTree" class="ztree tree-box" style="width: 250px !important;"></ul>
+			</div>
+			
+			<!-- 这是父级菜单下拉框 -->
+			<div id="pNameContent" class="menuContent"
+				style="display: none; position: absolute; z-index: 200;">
+				<ul id="pNameTree" class="ztree tree-box" style="width: 250px !important;"></ul>
+			</div>
+
+			<div class="row btn-group-m-t">
+				<div class="col-sm-10 col-sm-offset-5">
+					<#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="RolInfoDlg.editSubmit()"/>
+					<#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="RolInfoDlg.close()"/>
+				</div>
+			</div>
+		</div>
+
+	</div>
+</div>
+<script src="${ctxPath}/static/modular/system/role/role_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity.html
new file mode 100644
index 0000000..7cdc6ff
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity.html
@@ -0,0 +1,68 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>赠送活动管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="couponUseType" name="优惠券类型" >
+                                    <option value="">全部</option>
+                                    <option value="0">通用券</option>
+                                    <option value="1">专车券</option>
+                                    <option value="2">出租车券</option>
+                                    <option value="3">跨城出行券</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="status" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待审核</option>
+                                    <option value="2">已驳回</option>
+                                    <option value="3">已发送</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SysCouponActivity.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="SysCouponActivity.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="SysCouponActivityTableToolbar" role="group">
+                            @if(shiro.hasPermission("/sysCouponActivity/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="SysCouponActivity.openAddSysCouponActivity()"/>
+                            @}
+                            @if(shiro.hasPermission("/sysCouponActivity/update")){
+                                <#button name="编辑" icon="fa-edit" clickFun="SysCouponActivity.openSysCouponActivityDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/sysCouponActivity/delete")){
+                                <#button name="删除记录" icon="fa-remove" clickFun="SysCouponActivity.delete()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/sysCouponActivity/userCouponRecord")){
+                                <#button name="领取记录" icon="fa-remove" clickFun="SysCouponActivity.userCouponRecord()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/sysCouponActivity/immediately")){
+                                <#button name="审核" icon="fa-edit" clickFun="SysCouponActivity.immediately()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="SysCouponActivityTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysCouponActivity/sysCouponActivity.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_add.html
new file mode 100644
index 0000000..fcc93ae
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_add.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="sysCouponActivityInfoForm">
+            <input type="hidden" id="activityId">
+            <div class="row">
+                <div class="col-sm-6">
+                    <#input id="name" name="活动标题" underline="true"/>
+                    <#button name="选择优惠券" icon="fa-plus" clickFun="SysCouponActivityInfoDlg.toSelectCouponOpt()" style="margin-left: 12%;"/>
+                    <#input id="couponType" name="优惠券类型" readonly="true" />
+                    <#input id="couponUseType" name="服务类型" underline="true" readonly="true" />
+                    <#input id="money" name="金额" underline="true" readonly="true" />
+                    <#input id="effective" name="有效天数" underline="true"/>
+                    <#input id="number" name="张数" underline="true"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">赠送用户:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="sendType1" value="1" name="sendType" checked="" >
+                                <label for="sendType1"> 全部用户 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="sendType2" value="2" name="sendType" >
+                                <label for="sendType2"> 选择用户 </label>
+                            </div>
+                            <#button name="选择" icon="fa-plus" clickFun="SysCouponActivityInfoDlg.toSelectUserOpt()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">已添加用户</label>
+                        <div class="col-sm-9">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;">用户昵称</th>
+                                        <th style="width: 300px;">手机号</th>
+                                        <th style="width: 300px;">注册地所属分公司</th>
+                                        <th style="width: 100px;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="coun">
+
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="SysCouponActivityInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysCouponActivityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysCouponActivity/sysCouponActivity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_edit.html
new file mode 100644
index 0000000..5c4d49c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_edit.html
@@ -0,0 +1,81 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="sysCouponActivityInfoForm">
+
+            <input type="hidden" id="id" value="${item.id}"/>
+            <input type="hidden" id="activityId" value="${item.couponId}">
+            <div class="row">
+                <div class="col-sm-6">
+                    <#input id="name" name="活动标题" underline="true" value="${item.name}"/>
+                    <#button name="选择优惠券" icon="fa-plus" clickFun="SysCouponActivityInfoDlg.toSelectCouponOpt()" style="margin-left: 12%;"/>
+                    <#input id="couponType" name="优惠券类型" readonly="true" value="${item.couponType==1?'抵扣':'满减'}"/>
+                    <#input id="couponUseType" name="服务类型" underline="true" readonly="true"  value="${item.couponUseType==0?'通用券':item.couponUseType==1?'专车券':item.couponUseType==2?'出租券':'跨城出行券'}"/>
+                    <#input id="money" name="金额" underline="true" readonly="true"  value="${item.money}"/>
+                    <#input id="effective" name="有效天数" underline="true"  value="${item.effective}"/>
+                    <#input id="number" name="张数" underline="true"  value="${item.number}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">赠送用户:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="sendType1" value="1" name="sendType" checked="${item.sendType==1?'checked':''}" >
+                                <label for="sendType1"> 全部用户 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="sendType2" value="2" name="sendType"  checked="${item.sendType==2?'checked':''}">
+                                <label for="sendType2"> 选择用户 </label>
+                            </div>
+                            <#button name="选择" icon="fa-plus" clickFun="SysCouponActivityInfoDlg.toSelectUserOpt()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">已添加用户</label>
+                        <div class="col-sm-9">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;">用户昵称</th>
+                                        <th style="width: 300px;">手机号</th>
+                                        <th style="width: 300px;">注册地所属分公司</th>
+                                        <th style="width: 100px;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="coun">
+                                        @for(obj in sendUserInfoList){
+                                            <tr class="timeClass">
+                                                <td>
+                                                    <input type="hidden" id="userId" name="userId" value="${obj.userId}">
+                                                    <input type="hidden" id="nickName" name="nickName" value="${obj.nickName}">${obj.nickName}
+                                                </td>
+                                                <td>
+                                                    <input type="hidden" id="phone" name="phone" value="${obj.phone}">${obj.nickName}
+                                                </td>
+                                                <td>
+                                                    <input type="hidden" id="companyName" name="companyName" value="${obj.companyName}">${obj.nickName}
+                                                </td>
+                                                <td>
+                                                    <button onclick="deleteSub(this)">移除</button>
+                                                </td>
+                                            </tr>
+                                        @}
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="SysCouponActivityInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysCouponActivityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysCouponActivity/sysCouponActivity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_immediately.html
new file mode 100644
index 0000000..3079469
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponActivity_immediately.html
@@ -0,0 +1,41 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="sysCouponActivityInfoForm">
+            <input type="hidden" id="id" name="id" value="${id}">
+            <div class="row">
+                <div class="col-sm-10">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">处理意见:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="state2" value="3" name="state" checked="" >
+                                <label for="state2"> 同意 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="state3" value="2" name="state" >
+                                <label for="state3"> 拒绝 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">填写备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="SysCouponActivityInfoDlg.immediately()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysCouponActivityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysCouponActivity/sysCouponActivity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponRecord.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponRecord.html
new file mode 100644
index 0000000..196d277
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/sysCouponRecord.html
@@ -0,0 +1,37 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>优惠券管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SysCouponRecord.search()"/>
+                                <#button name="重置" icon="fa-search" clickFun="SysCouponRecord.resetSearch()"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="SysCouponRecord.selectCouponOpt()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysCouponRecord.close()" space="true"/>
+
+                            </div>
+                        </div>
+                        <#table id="SysCouponRecordTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysCouponActivity/sysCouponRecord.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/tUser.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/tUser.html
new file mode 100644
index 0000000..2027607
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponActivity/tUser.html
@@ -0,0 +1,63 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>用户管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="注册时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="id" name="用户ID" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="nickName" name="昵称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="isAuth" name="是否实名认证" >
+                                    <option value="">全部</option>
+                                    <option value="1">否</option>
+                                    <option value="2">是</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">冻结</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="companyName" name="注册地所在分公司" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TUser.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TUser.resetSearch()" space="true"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="TUser.selectUserOpt()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TUser.close()" space="true"/>
+
+                            </div>
+                        </div>
+                        <#table id="TUserTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysCouponActivity/tUser.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord.html
new file mode 100644
index 0000000..64de3fe
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord.html
@@ -0,0 +1,61 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>优惠券管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="couponUseType" name="优惠券类型" >
+                                    <option value="">全部</option>
+                                    <option value="0">通用券</option>
+                                    <option value="1">专车券</option>
+                                    <option value="2">出租车券</option>
+                                    <option value="3">跨城出行券</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="couponType" name="服务类型" >
+                                    <option value="">全部</option>
+                                    <option value="1">抵扣</option>
+                                    <option value="2">满减</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SysCouponRecord.search()"/>
+                                <#button name="重置" icon="fa-search" clickFun="SysCouponRecord.resetSearch()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="SysCouponRecordTableToolbar" role="group">
+                            @if(shiro.hasPermission("/sysCouponRecord/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="SysCouponRecord.openAddSysCouponRecord()"/>
+                            @}
+                            @if(shiro.hasPermission("/sysCouponRecord/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="SysCouponRecord.openSysCouponRecordDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/sysCouponRecord/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="SysCouponRecord.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="SysCouponRecordTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysCouponRecord/sysCouponRecord.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_add.html
new file mode 100644
index 0000000..aae3c66
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_add.html
@@ -0,0 +1,57 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal"id="sysCouponRecordInfoForm">
+
+            <div class="row">
+                <div class="col-sm-6">
+                    <#input id="name" name="名称" underline="true" placeholder="最多20个字"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">优惠券类型</label>
+                        <div class="col-sm-9">
+                            <select class="form-control" id="couponType" name="couponType"
+                                    onchange="changeType()"
+                            >
+                                <option value="1">抵扣券</option>
+                                <option value="2">满减券</option>
+                            </select>
+                        </div>
+                    </div>
+                    <#select id="couponUseType" name="服务类型" underline="true">
+                        <option value="1">专车券</option>
+                        <option value="2">出租车券</option>
+                        <option value="3">跨城出行券</option>
+                        <option value="0">通用券</option>
+                    </#select>
+                    <#input id="money" name="金额" underline="true" placeholder="最多4位数字"/>
+                    <div class="form-group" id="fullMoneys" style="display: none">
+                        <label class="col-sm-3 control-label">条件金额:</label>
+                        <div class="col-sm-9">
+                            <input class="form-control" id="fullMoney" name="fullMoney" >
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="SysCouponRecordInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysCouponRecordInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysCouponRecord/sysCouponRecord_info.js"></script>
+<script>
+    function changeType(){
+        if($("#couponType").val()==2){
+            $("#fullMoneys").show();
+        }else{
+            $("#fullMoneys").hide();
+        }
+
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_edit.html
new file mode 100644
index 0000000..3dc5f02
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_edit.html
@@ -0,0 +1,34 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" value="${item.id}" underline="true"/>
+                            <#input id="money" name="金额" value="${item.money}" underline="true"/>
+                            <#input id="fullMoney" name="满减金额" value="${item.fullMoney}" underline="true"/>
+                            <#input id="insertTime" name="添加时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="companyId" name="公司id" value="${item.companyId}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="couponUseType" name="优惠券使用类型(0=通用,1=专车,2=出租车,3=城际,4=小件物流)" value="${item.couponUseType}" underline="true"/>
+                            <#input id="couponType" name="优惠券类型(1=抵扣,2=满减)" value="${item.couponType}" underline="true"/>
+                            <#input id="name" name="优惠券名称" value="${item.name}" underline="true"/>
+                            <#input id="effective" name="有效天数" value="${item.effective}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="SysCouponRecordInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysCouponRecordInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysCouponRecord/sysCouponRecord_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord.html
new file mode 100644
index 0000000..4752c82
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord.html
@@ -0,0 +1,45 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>红包管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SysRedPacketRecord.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="SysRedPacketRecord.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="SysRedPacketRecordTableToolbar" role="group">
+                            @if(shiro.hasPermission("/sysRedPacketRecord/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="SysRedPacketRecord.openAddSysRedPacketRecord()"/>
+                            @}
+                            @if(shiro.hasPermission("/sysRedPacketRecord/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="SysRedPacketRecord.openSysRedPacketRecordDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/sysRedPacketRecord/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="SysRedPacketRecord.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="SysRedPacketRecordTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysRedPacketRecord/sysRedPacketRecord.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord_add.html
new file mode 100644
index 0000000..44f02c6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord_add.html
@@ -0,0 +1,82 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="sysRedPacketRecordInfoForm">
+
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">红包名称</label>
+                        <div class="col-sm-5">
+                            <input id="name" style="width: 170px;height: 35px;"  placeholder="最多15个字">
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">红包金额类型</label>
+                        <div class="col-sm-5">
+                            <label style="margin: 0 10px"><input type="radio" checked="checked" name="type" value="1" onclick="changeDiv(1)">固定金额</label>
+                            <label style="margin: 0 10px"><input type="radio" name="type" value="2" onclick="changeDiv(2)" >随机金额</label>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">总金额</label>
+                        <div class="col-sm-5">
+                            <input id="totalMoney" style="width: 170px;height: 35px;"  placeholder="最多8位数">&nbsp;元
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-12" id="moneyDiv">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">每个红包金额</label>
+                        <div class="col-sm-5">
+                            <input id="money" style="width: 170px;height: 35px;" placeholder="最多3位数">&nbsp;元
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-12" id="moneySectionDiv" style="display: none;">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">每个红包金额范围</label>
+                        <div class="col-sm-5">
+                            <input id="startMoney" style="width: 80px;height: 35px;">&nbsp;-&nbsp;
+                            <input id="endMoney"  style="width: 80px;height: 35px;">&nbsp;元
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">有效天数</label>
+                        <div class="col-sm-5">
+                            <input id="effective" style="width: 170px;height: 35px;">&nbsp;天
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="SysRedPacketRecordInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysRedPacketRecordInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysRedPacketRecord/sysRedPacketRecord_info.js"></script>
+<script>
+    function changeDiv(type){
+        if(type==1){
+            $("#moneySectionDiv").hide();
+            $("#moneyDiv").show();
+        }else{
+            $("#moneySectionDiv").show();
+            $("#moneyDiv").hide();
+        }
+    }
+
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord_edit.html
new file mode 100644
index 0000000..e66baa3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/sysRedPacketRecord/sysRedPacketRecord_edit.html
@@ -0,0 +1,34 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" value="${item.id}" underline="true"/>
+                            <#input id="money" name="金额" value="${item.money}" underline="true"/>
+                            <#input id="name" name="红包名称" value="${item.name}" underline="true"/>
+                            <#input id="type" name="类型(1=固定金额,2=随机金额)" value="${item.type}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="totalMoney" name="总金额" value="${item.totalMoney}" underline="true"/>
+                            <#input id="laveMoney" name="剩余金额" value="${item.laveMoney}" underline="true"/>
+                            <#input id="startMoney" name="开始金额" value="${item.startMoney}" underline="true"/>
+                            <#input id="endMoney" name="结束金额" value="${item.endMoney}" underline="true"/>
+                            <#input id="effective" name="有效天数" value="${item.effective}" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="SysRedPacketRecordInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysRedPacketRecordInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/sysRedPacketRecord/sysRedPacketRecord_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement.html
new file mode 100644
index 0000000..5547e7f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement.html
@@ -0,0 +1,61 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>广告设置管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="广告名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="type" name="广告类型" >
+                                    <option value="">全部</option>
+                                    <option value="1">弹窗广告</option>
+                                    <option value="2">首页底部广告</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TAdvertisement.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TAdvertisement.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TAdvertisementTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tAdvertisement/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TAdvertisement.openAddTAdvertisement()"/>
+                            @}
+                            @if(shiro.hasPermission("/tAdvertisement/update")){
+                                <#button name="编辑" icon="fa-edit" clickFun="TAdvertisement.openTAdvertisementDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tAdvertisement/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TAdvertisement.delete()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tAdvertisement/up")){
+                                <#button name="上线" icon="fa-remove" clickFun="TAdvertisement.up()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tAdvertisement/down")){
+                                <#button name="下线" icon="fa-remove" clickFun="TAdvertisement.down()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TAdvertisementTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tAdvertisement/tAdvertisement.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement_add.html
new file mode 100644
index 0000000..34f542d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement_add.html
@@ -0,0 +1,58 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="advertisementInfoForm">
+
+            <div class="row">
+                <div class="col-sm-10">
+                    <#input id="name" name="广告图名称"/>
+                    <#avatar id="imgUrl" name="广告图图片:" />
+                    <#select id="type" name="广告类型:">
+                        <option value="">选择广告类型</option>
+                        <option value="1">弹窗广告</option>
+                        <option value="2">首页底部广告</option>
+                    </#select>
+                    <#select id="provinceId" name="所属省:">
+                        <option value="">选择所属省</option>
+                        @for(province in list){
+                        <option value="${province.id}"> ${province.name} </option>
+                        @}
+                    </#select>
+                    <#select id="isJump" name="是否跳转:" onchange="TAdvertisementInfoDlg.isJump()">
+                        <option value="">选择是否跳转</option>
+                        <option value="1">是</option>
+                        <option value="2">否</option>
+                    </#select>
+                    <div id="yesDiv" style="display: none;">
+                        <#select id="jumpType" name="跳转类型:" onchange="TAdvertisementInfoDlg.jumpType()">
+                            <option value="">选择跳转类型</option>
+                            <option value="1">外部</option>
+                            <option value="2">内部</option>
+                        </#select>
+                        <div id="internalDiv" style="display: none;">
+                            <#input id="jumpUrl" name="跳转路径"/>
+                        </div>
+                        <div id="externalDiv" style="display: none;">
+                            <div class="form-group" id="contentDiv">
+                                <label class="col-sm-3 control-label">跳转内容:</label>
+                                <div class="col-sm-9">
+                                    <textarea type="text/plain" id="editor" style="width:100%;height:350px;"></textarea>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TAdvertisementInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TAdvertisementInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tAdvertisement/tAdvertisement_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement_edit.html
new file mode 100644
index 0000000..70b2fa1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAdvertisement/tAdvertisement_edit.html
@@ -0,0 +1,79 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="advertisementInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-10">
+                    <#input id="name" name="广告图名称" value="${item.name}"/>
+                    <#avatar id="imgUrl" name="广告图图片:" avatarImg="${item.imgUrl}"/>
+                    <#select id="type" name="广告类型:">
+                        <option value="">选择广告类型</option>
+                        <option value="1" ${1 == item.type ? 'selected=selected' : ''}>弹窗广告</option>
+                        <option value="2" ${2 == item.type ? 'selected=selected' : ''}>首页底部广告</option>
+                    </#select>
+                    <#select id="provinceId" name="所属省:">
+                        <option value="">选择所属省</option>
+                        @for(province in list){
+                            <option value="${province.id}" ${province.id == item.provinceId ? 'selected=selected' : ''}> ${province.name} </option>
+                        @}
+                    </#select>
+                    <#select id="isJump" name="是否跳转:" onchange="TAdvertisementInfoDlg.isJump()">
+                        <option value="">选择是否跳转</option>
+                        <option value="1" ${1 == item.isJump ? 'selected=selected' : ''}>是</option>
+                        <option value="2" ${2 == item.isJump ? 'selected=selected' : ''}>否</option>
+                    </#select>
+                    <div id="yesDiv" style="display: none;">
+                        <#select id="jumpType" name="跳转类型:" onchange="TAdvertisementInfoDlg.jumpType()">
+                            <option value="">选择跳转类型</option>
+                            <option value="1" ${1 == item.jumpType ? 'selected=selected' : ''}>外部</option>
+                            <option value="2" ${2 == item.jumpType ? 'selected=selected' : ''}>内部</option>
+                        </#select>
+                        <div id="internalDiv" style="display: none;">
+                            <#input id="jumpUrl" name="跳转路径" value="${item.jumpUrl}"/>
+                        </div>
+                        <div id="externalDiv" style="display: none;">
+                            <div class="form-group" id="contentDiv">
+                                <label class="col-sm-3 control-label">跳转内容:</label>
+                                <div class="col-sm-9">
+                                    <textarea type="text/plain" id="editor" style="width:100%;height:350px;">${item.content}</textarea>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TAdvertisementInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TAdvertisementInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tAdvertisement/tAdvertisement_info.js"></script>
+<script type="text/javascript">
+    $(function() {
+        var isJump = $("#isJump").val();
+        if (1 == isJump){
+            $("#yesDiv").show();
+        }else{
+            $("#yesDiv").hide();
+        }
+        var jumpType = $("#jumpType").val();
+        if (1 == jumpType){
+            $("#internalDiv").show();
+            $("#externalDiv").hide();
+        } else if (2 == jumpType) {
+            $("#internalDiv").hide();
+            $("#externalDiv").show();
+        } else {
+            $("#internalDiv").hide();
+            $("#externalDiv").hide();
+        }
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/commonProblem.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/commonProblem.html
new file mode 100644
index 0000000..0b4a77a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/commonProblem.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">常见问题设置</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/corssHtml.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/corssHtml.html
new file mode 100644
index 0000000..263e853
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/corssHtml.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">跨城出行乘车须知</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/driverRegister.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/driverRegister.html
new file mode 100644
index 0000000..daa009c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/driverRegister.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">司机注册协议设置</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContentTxt(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/instructions.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/instructions.html
new file mode 100644
index 0000000..10c0580
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/instructions.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">改派说明设置</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/pricingRules.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/pricingRules.html
new file mode 100644
index 0000000..939359b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/pricingRules.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">计价规则设置</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreement.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreement.html
new file mode 100644
index 0000000..4a47ce4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreement.html
@@ -0,0 +1,105 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">注册协议</a></li>
+                                <li class=""><a data-toggle="tab" href="#tab-2" aria-expanded="false">用户协议</a></li>
+                                <li class=""><a data-toggle="tab" href="#tab-3" aria-expanded="false">隐私协议</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div id="tab-2" class="tab-pane">
+                                    <div class="panel-body">
+                                        <textarea type="text/plain" id="editor_2" style="width:1200px;height:400px;">${two.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_2(${two.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div id="tab-3" class="tab-pane">
+                                    <div class="panel-body">
+                                        <textarea type="text/plain" id="editor_3" style="width:1200px;height:400px;">${three.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_3(${three.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    var editor_2 = null;
+    var editor_3 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+        editor_2 = UE.getEditor('editor_2');
+        editor_3 = UE.getEditor('editor_3');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+    function update_2(id){
+        if (editor_2.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_2.getContent(),id);
+    }
+    function update_3(id){
+        if (editor_3.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_3.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementCharterCar.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementCharterCar.html
new file mode 100644
index 0000000..1cdbaa0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementCharterCar.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">包车协议设置</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementDriver.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementDriver.html
new file mode 100644
index 0000000..4a47ce4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementDriver.html
@@ -0,0 +1,105 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">注册协议</a></li>
+                                <li class=""><a data-toggle="tab" href="#tab-2" aria-expanded="false">用户协议</a></li>
+                                <li class=""><a data-toggle="tab" href="#tab-3" aria-expanded="false">隐私协议</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div id="tab-2" class="tab-pane">
+                                    <div class="panel-body">
+                                        <textarea type="text/plain" id="editor_2" style="width:1200px;height:400px;">${two.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_2(${two.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div id="tab-3" class="tab-pane">
+                                    <div class="panel-body">
+                                        <textarea type="text/plain" id="editor_3" style="width:1200px;height:400px;">${three.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_3(${three.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    var editor_2 = null;
+    var editor_3 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+        editor_2 = UE.getEditor('editor_2');
+        editor_3 = UE.getEditor('editor_3');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+    function update_2(id){
+        if (editor_2.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_2.getContent(),id);
+    }
+    function update_3(id){
+        if (editor_3.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_3.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementLaw.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementLaw.html
new file mode 100644
index 0000000..0a28fd1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementLaw.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">法律法规设置</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementMe.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementMe.html
new file mode 100644
index 0000000..afc7dbc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementMe.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">关于我们设置</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementOrder.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementOrder.html
new file mode 100644
index 0000000..2177676
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementOrder.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">取消订单说明</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementRecharge.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementRecharge.html
new file mode 100644
index 0000000..88ee69d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementRecharge.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">充值领券规则设置</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementSmallPieceLogistics.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementSmallPieceLogistics.html
new file mode 100644
index 0000000..da1ab70
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementSmallPieceLogistics.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">小件物流协议设置</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementUser.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementUser.html
new file mode 100644
index 0000000..d7625bf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tAgreement/tAgreementUser.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:350px !important;display: initial !important;
+    }
+</style>
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="tabs-container">
+                            <ul class="nav nav-tabs">
+                                <li class="active"><a data-toggle="tab" href="#tab-1" aria-expanded="true">用户指南设置</a></li>
+                            </ul>
+                            <div class="tab-content">
+                                <div id="tab-1" class="tab-pane active">
+                                    <div class="panel-body">
+                                        <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;">${one.content}</textarea>
+                                        <div class="row btn-group-m-t">
+                                            <div class="col-sm-10 col-sm-offset-5">
+                                                <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="update_1(${one.id});"/>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+
+    function update_1(id){
+        if (editor_1.getContentTxt() == ""){
+            Feng.error("内容不能为空!");
+            return;
+        }
+        submitData(editor_1.getContent(),id);
+    }
+
+    function submitData(content,id) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/updateAppParam", function(data){
+            Feng.success("编辑成功!");
+        },function(data){
+            Feng.error("编辑失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("context", content);
+        ajax.set("id", id);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/carInsurance.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/carInsurance.html
new file mode 100644
index 0000000..aa23eeb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/carInsurance.html
@@ -0,0 +1,31 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>车辆保险管理</h5>
+            </div>
+            <div class="ibox-content">
+                <input type="hidden" id="carId" value="${carId}">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="hidden-xs" id="TCarTableToolbar" role="group">
+                            @if(shiro.hasPermission("/CarInsurance/openAddCarInsurance")){
+                            <#button name="添加" icon="fa-plus" clickFun="CarInsurance.openAddCarInsurance()"/>
+                            @}
+                            @if(shiro.hasPermission("/CarInsurance/openCarInsuranceDetail")){
+                            <#button name="修改" icon="fa-edit" clickFun="CarInsurance.openCarInsuranceDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/CarInsurance/delete")){
+                            <#button name="删除" icon="fa-remove" clickFun="CarInsurance.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TCarTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCar/carInsurance.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/carInsuranceInfo.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/carInsuranceInfo.html
new file mode 100644
index 0000000..c34faf8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/carInsuranceInfo.html
@@ -0,0 +1,35 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            <input type="hidden" id="carId" value="${carId}">
+            <input type="hidden" id="id" value="${id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="insurCom" name="保险公司名称"/>
+                    <#input id="insurNum" name="保险号" />
+                    <#input id="insurType" name="保险类型"/>
+                    <#input id="insurCount" name="保险金额" type="number"/>
+                    <#input id="insurEff" name="保险生效日期" type="text" />
+                    <#input id="insurExp" name="保险到期日期" type="text" />
+                </div>
+            </div>
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="CarInsuranceInfo.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="CarInsuranceInfo.close()"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCar/carInsuranceInfo.js"></script>
+<script>
+    laydate.render({
+        elem: '#insurEff'
+    });
+    laydate.render({
+        elem: '#insurExp'
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar.html
new file mode 100644
index 0000000..bdcfe5a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar.html
@@ -0,0 +1,90 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>车辆管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="id" name="车辆ID" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="brandName" name="车辆品牌" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="modelName" name="车辆类型" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="carColor" name="车辆颜色" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="serverStr" name="服务模式" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="carLicensePlate" name="车牌号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="driverName" name="关联司机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="companyName" name="所属分公司" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="franchiseeName" name="所属加盟商" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TCar.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TCar.resetSearch()" space="true"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <input type="file" name="file" style="width:0px;height:0px;" id="uploadEventFile" onchange="TCar.exportCar()">
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TCarTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tCar/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TCar.openAddTCar()"/>
+                            @}
+                            @if(shiro.hasPermission("/tCar/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="TCar.openTCarDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tCar/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TCar.delete()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tCar/inCar")){
+                                <#button btnCss="info" name="下载模板" id="uploadModel" icon="fa fa-level-down" clickFun="TCar.uploadCarModel()" space="true"/>
+                                <#button btnCss="danger" name="导入" id="uploadEventBtn" icon="fa fa-level-up" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tCar/outCar")){
+                                <#button name="导出" icon="fa-remove" clickFun="TCar.outCar()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tCar/carInsurance")){
+                            <#button name="车辆保险" icon="fa-remove" clickFun="TCar.carInsurance()" space="true"/>
+                            @}
+                        </div>
+                        <!--<div style="width: 100%;overflow-y: auto">
+                            <div style="width:1920px">
+                                <#table id="TCarTable"/>
+                            </div>
+                        </div>-->
+                        <#table id="TCarTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCar/tCar.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar_add.html
new file mode 100644
index 0000000..a3836a4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar_add.html
@@ -0,0 +1,198 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            <input type="hidden" id="roleType" name="roleType" value="${roleType}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">所属机构:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            @if(roleType == 1){
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="companyType1" value="1" name="companyType" checked="" onclick="TCarInfoDlg.companyTypeClick(1)">
+                                <label for="companyType1"> 平台车辆 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="companyTyp2" value="2" name="companyType" onclick="TCarInfoDlg.companyTypeClick(2)">
+                                <label for="companyTyp2"> 加盟车辆 </label>
+                            </div>
+                            <!--<div id="companyDiv">-->
+                                <select class="form-control companyDiv" id="oneId" onchange="TCarInfoDlg.oneChange(this)" style="width: 200px;display: none;">
+                                    <option value="">选择所属分公司</option>
+                                    @for(obj in companyList!){
+                                    <option value="${obj.id}">${obj.name}</option>
+                                    @}
+                                </select>
+                                <select class="form-control companyDiv" id="twoId"  style="width: 200px;margin-left: 30px;display: none;">
+                                    <option value="">选择所属加盟商</option>
+                                </select>
+                            <!--</div>-->
+                            @}else if(roleType == 2){
+                            <span class="control-label">${objectName!}</span>
+                            <select class="form-control" id="franchiseeId"  style="width: 200px;margin-left: 30px;">
+                                <option value="">选择所属加盟商</option>
+                                @for(obj in franchiseeList!){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                            @}else if(roleType == 3){
+                            <span class="control-label">${objectName!}</span>
+                            @}
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <fieldset>
+                            <label class="col-sm-3 control-label">服务模式:</label>
+                            <div class="col-sm-9">
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox1" value="1" onclick="TCarInfoDlg.zcServerClick()">
+                                    <label for="serverBox1"> 专车 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox2" value="2">
+                                    <label for="serverBox2"> 出租车 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox3" value="3" onclick="TCarInfoDlg.kcServerClick()">
+                                    <label for="serverBox3"> 跨城出行 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox4" value="4">
+                                    <label for="serverBox4"> 小件物流-同城 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox5" value="5">
+                                    <label for="serverBox5"> 小件物流-跨城 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox6" value="6">
+                                    <label for="serverBox6"> 包车 </label>
+                                </div>
+                            </div>
+                        </fieldset>
+                    </div>
+                    <div class="form-group" style="display: none;" id="zcModelDiv">
+                        <label class="col-sm-3 control-label">专车车型:</label>
+                        <div class="col-sm-9">
+                            <select class="form-control" id="zcModel" name="zcModel">
+                                <option value="">选择车型</option>
+                                @for(obj in zcModelList){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group" style="display: none;" id="kcModelDiv">
+                        <label class="col-sm-3 control-label">跨城出行车型:</label>
+                        <div class="col-sm-9">
+                            <select class="form-control" id="kcModel" name="kcModel">
+                                <option value="">选择车型</option>
+                                @for(obj in kcModelList){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+
+                    <#select id="carBrandId" name="车辆品牌:" onchange="TCarInfoDlg.brandChange(this)">
+                        <option value="">选择车辆品牌</option>
+                        @for(obj in brandList){
+                        <option value="${obj.id}">${obj.name}</option>
+                        @}
+                    </#select>
+                    <#select id="carModelId" name="车辆类型:">
+                        <option value="">选择车辆类型</option>
+                    </#select>
+                    <#select id="carColor" name="车辆颜色:">
+                        <option value="">选择车辆颜色</option>
+                        <option value="黑色">黑色</option>
+                        <option value="银色">银色</option>
+                        <option value="白色">白色</option>
+                        <option value="红色">红色</option>
+                        <option value="黄色">黄色</option>
+                        <option value="橙色">橙色</option>
+                        <option value="蓝色">蓝色</option>
+                    </#select>
+                    <#input id="carLicensePlate" name="车牌号" />
+                    <#avatar id="carPhoto" name="车辆照片:" />
+                    <#input id="drivingLicenseNumber" name="行驶证编号" />
+                    <#avatar id="drivingLicensePhoto" name="行驶证照片:" />
+                    <#input id="annualInspectionTime" name="年检到期时间" type="text"/>
+                    <#input id="commercialInsuranceTime" name="商业保险到期时间" type="text"/>
+                    <#input id="plateColor" name="车牌颜色" />
+                    <#input id="vehicleType" name="车辆类型" />
+                    <#input id="ownerName" name="车辆所有人" />
+                    <#input id="engineId" name="发动机号" />
+                    <#input id="VIN" name="车辆VIN码" />
+                    <#input id="certifyDateA" name="车辆注册日期" type="text"/>
+                    <#input id="fuelType" name="车辆燃料类型" />
+                    <#input id="engineDisplace" name="发动机排量" />
+                    <#input id="certificate" name="运输证字号" />
+                    <#input id="transAgency" name="车辆运输证发证机构" />
+                    <#input id="transArea" name="车辆经营区域" />
+                    <#input id="transDateStart" name="车辆运输证有效期起" type="text"/>
+                    <#input id="transDateStop" name="车辆运输证有效期止" type="text"/>
+                    <#input id="certifyDateB" name="车辆初次登记日期" type="text"/>
+                    <#select id="fixState" name="车辆维修状态:">
+                        <option value="0">未检修</option>
+                        <option value="1">已检修</option>
+                        <option value="2">未知</option>
+                    </#select>
+                    <#input id="nextFixDate" name="车辆下次年检时间" type="text"/>
+                    <#input id="checkState" name="车辆年度审核状态" />
+                    <#input id="feePrintId" name="发票打印设备序列号" />
+                    <#input id="GPSBrand" name="卫星定位装置品牌" />
+                    <#input id="GPSModel" name="卫星定位装置型号" />
+                    <#input id="GPSIMEI" name="卫星定位装置IMEI号" />
+                    <#input id="GPSInstallDate" name="卫星定位装置安装时间" type="text"/>
+                    <#input id="registerDate" name="车辆报备日期" type="text"/>
+                    <#select id="commercialType" name="服务类型:">
+                        <option value="1">网络预约出租车</option>
+                        <option value="2">巡游出租汽车</option>
+                        <option value="3">私人小客车合乘</option>
+                    </#select>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCar/tCar_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#annualInspectionTime'
+    });
+    laydate.render({
+        elem: '#commercialInsuranceTime'
+    });
+    laydate.render({
+        elem: '#certifyDateA'
+    });
+    laydate.render({
+        elem: '#transDateStart'
+    });
+    laydate.render({
+        elem: '#transDateStop'
+    });
+    laydate.render({
+        elem: '#certifyDateB'
+    });
+    laydate.render({
+        elem: '#nextFixDate'
+    });
+    laydate.render({
+        elem: '#GPSInstallDate'
+    });
+    laydate.render({
+        elem: '#registerDate'
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar_edit.html
new file mode 100644
index 0000000..e76e39b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCar/tCar_edit.html
@@ -0,0 +1,216 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <input type="hidden" id="roleType" name="roleType" value="${roleType}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">所属机构:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            @if(roleType == 1){
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="companyType1" value="1" name="companyType" ${1 == companyType ? 'checked=checked' : ''} onclick="TCarInfoDlg.companyTypeClick(1)">
+                                <label for="companyType1"> 平台车辆 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="companyTyp2" value="2" name="companyType" ${2 == companyType ? 'checked=checked' : ''} onclick="TCarInfoDlg.companyTypeClick(2)">
+                                <label for="companyTyp2"> 加盟车辆 </label>
+                            </div>
+                            <select class="form-control companyDiv" id="oneId" onchange="TCarInfoDlg.oneChange(this)" style="width: 200px">
+                                <option value="">选择所属分公司</option>
+                                @for(obj in companyList!){
+                                <option value="${obj.id}" ${obj.id == item.companyId ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                            <select class="form-control companyDiv" id="twoId"  style="width: 200px;margin-left: 30px;">
+                                <option value="">选择所属加盟商</option>
+                                @for(obj in franchiseeList!){
+                                <option value="${obj.id}" ${obj.id == item.franchiseeId ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                            @}else if(roleType == 2){
+                            <span class="control-label">${objectName!}</span>
+                            <select class="form-control" id="franchiseeId"  style="width: 200px;margin-left: 30px;">
+                                <option value="">选择所属加盟商</option>
+                                @for(obj in franchiseeList!){
+                                <option value="${obj.id}" ${obj.id == item.franchiseeId ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                            @}else if(roleType == 3){
+                            <span class="control-label">${objectName!}</span>
+                            @}
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <fieldset>
+                            <label class="col-sm-3 control-label">服务模式:</label>
+                            <div class="col-sm-9">
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox1" value="1" ${2 == one ? 'checked=checked' : ''} onclick="TCarInfoDlg.zcServerClick()">
+                                    <label for="serverBox1"> 专车 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox2" value="2" ${2 == two ? 'checked=checked' : ''}>
+                                    <label for="serverBox2"> 出租车 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox3" value="3" ${2 == three ? 'checked=checked' : ''} onclick="TCarInfoDlg.kcServerClick()">
+                                    <label for="serverBox3"> 跨城出行 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox4" value="4" ${2 == four ? 'checked=checked' : ''}>
+                                    <label for="serverBox4"> 小件物流-同城 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox5" value="5" ${2 == five ? 'checked=checked' : ''}>
+                                    <label for="serverBox5"> 小件物流-跨城 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox6" value="6" ${2 == six ? 'checked=checked' : ''}>
+                                    <label for="serverBox6"> 包车 </label>
+                                </div>
+                            </div>
+                        </fieldset>
+                    </div>
+                    <div class="form-group" id="zcModelDiv">
+                        <label class="col-sm-3 control-label">专车车型:</label>
+                        <div class="col-sm-9">
+                            <select class="form-control" id="zcModel" name="zcModel">
+                                <option value="">选择车型</option>
+                                @for(obj in zcModelList){
+                                <option value="${obj.id}" ${obj.id == zcModel ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group" id="kcModelDiv">
+                        <label class="col-sm-3 control-label">跨城出行车型:</label>
+                        <div class="col-sm-9">
+                            <select class="form-control" id="kcModel" name="kcModel">
+                                <option value="">选择车型</option>
+                                @for(obj in kcModelList){
+                                <option value="${obj.id}" ${obj.id == kcModel ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+                    <#select id="carBrandId" name="车辆品牌:" onchange="TCarInfoDlg.brandChange(this)">
+                        <option value="">选择车辆品牌</option>
+                        @for(obj in brandList){
+                        <option value="${obj.id}" ${obj.id == item.carBrandId ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </#select>
+                    <#select id="carModelId" name="车辆类型:">
+                        <option value="">选择车辆类型</option>
+                        @for(obj in modelList){
+                        <option value="${obj.id}" ${obj.id == item.carModelId ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </#select>
+                    <#select id="carColor" name="车辆颜色:">
+                        <option value="">选择车辆颜色</option>
+                        <option value="黑色" ${'黑色' == item.carColor ? 'selected=selected' : ''}>黑色</option>
+                        <option value="银色" ${'银色' == item.carColor ? 'selected=selected' : ''}>银色</option>
+                        <option value="白色" ${'白色' == item.carColor ? 'selected=selected' : ''}>白色</option>
+                        <option value="红色" ${'红色' == item.carColor ? 'selected=selected' : ''}>红色</option>
+                        <option value="黄色" ${'黄色' == item.carColor ? 'selected=selected' : ''}>黄色</option>
+                        <option value="橙色" ${'橙色' == item.carColor ? 'selected=selected' : ''}>橙色</option>
+                        <option value="蓝色" ${'蓝色' == item.carColor ? 'selected=selected' : ''}>蓝色</option>
+                    </#select>
+                    <#input id="carLicensePlate" name="车牌号" value="${item.carLicensePlate}"/>
+                    <#avatar id="carPhoto" name="车辆照片:" avatarImg="${item.carPhoto}"/>
+                    <#input id="drivingLicenseNumber" name="行驶证编号" value="${item.drivingLicenseNumber}"/>
+                    <#avatar id="drivingLicensePhoto" name="行驶证照片:" avatarImg="${item.drivingLicensePhoto}"/>
+                    <#input id="annualInspectionTime" name="年检到期时间" type="text" value="${item.annualInspectionTime}"/>
+                    <#input id="commercialInsuranceTime" name="商业保险到期时间" type="text" value="${item.commercialInsuranceTime}"/>
+                    <#input id="plateColor" name="车牌颜色" value="${item.plateColor}"/>
+                    <#input id="vehicleType" name="车辆类型" value="${item.vehicleType}"/>
+                    <#input id="ownerName" name="车辆所有人" value="${item.ownerName}"/>
+                    <#input id="engineId" name="发动机号" value="${item.engineId}"/>
+                    <#input id="VIN" name="车辆VIN码" value="${item.VIN}"/>
+                    <#input id="certifyDateA" name="车辆注册日期" type="text" value="${item.certifyDateA}"/>
+                    <#input id="fuelType" name="车辆燃料类型" value="${item.fuelType}"/>
+                    <#input id="engineDisplace" name="发动机排量" value="${item.engineDisplace}"/>
+                    <#input id="certificate" name="运输证字号" value="${item.certificate}"/>
+                    <#input id="transAgency" name="车辆运输证发证机构" value="${item.transAgency}"/>
+                    <#input id="transArea" name="车辆经营区域" value="${item.transArea}"/>
+                    <#input id="transDateStart" name="车辆运输证有效期起" type="text" value="${item.transDateStart}"/>
+                    <#input id="transDateStop" name="车辆运输证有效期止" type="text" value="${item.transDateStop}"/>
+                    <#input id="certifyDateB" name="车辆初次登记日期" type="text" value="${item.certifyDateB}"/>
+                    <#select id="fixState" name="车辆维修状态:">
+                        <option value="0" ${'0' == item.fixState ? 'selected=selected' : ''}>未检修</option>
+                        <option value="1" ${'1' == item.fixState ? 'selected=selected' : ''}>已检修</option>
+                        <option value="2" ${'2' == item.fixState ? 'selected=selected' : ''}>未知</option>
+                    </#select>
+                    <#input id="nextFixDate" name="车辆下次年检时间" type="text" value="${item.nextFixDate}"/>
+                    <#input id="checkState" name="车辆年度审核状态" value="${item.checkState}"/>
+                    <#input id="feePrintId" name="发票打印设备序列号" value="${item.feePrintId}"/>
+                    <#input id="GPSBrand" name="卫星定位装置品牌" value="${item.GPSBrand}"/>
+                    <#input id="GPSModel" name="卫星定位装置型号" value="${item.GPSModel}"/>
+                    <#input id="GPSIMEI" name="卫星定位装置IMEI号" value="${item.GPSIMEI}"/>
+                    <#input id="GPSInstallDate" name="卫星定位装置安装时间" type="text" value="${item.GPSInstallDate}"/>
+                    <#input id="registerDate" name="车辆报备日期" type="text" value="${item.registerDate}"/>
+                    <#select id="commercialType" name="服务类型:">
+                        <option value="1" ${'1' == item.commercialType ? 'selected=selected' : ''}>网络预约出租车</option>
+                        <option value="2" ${'2' == item.commercialType ? 'selected=selected' : ''}>巡游出租汽车</option>
+                        <option value="3" ${'3' == item.commercialType ? 'selected=selected' : ''}>私人小客车合乘</option>
+                    </#select>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCar/tCar_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#annualInspectionTime'
+    });
+    laydate.render({
+        elem: '#commercialInsuranceTime'
+    });
+    laydate.render({
+        elem: '#certifyDateA'
+    });
+    laydate.render({
+        elem: '#transDateStart'
+    });
+    laydate.render({
+        elem: '#transDateStop'
+    });
+    laydate.render({
+        elem: '#certifyDateB'
+    });
+    laydate.render({
+        elem: '#nextFixDate'
+    });
+    laydate.render({
+        elem: '#GPSInstallDate'
+    });
+    laydate.render({
+        elem: '#registerDate'
+    });
+</script>
+<script type="application/javascript">
+    $(function() {
+        var companyType = $("input[name='companyType']:checked").val();
+        if (1 == companyType){
+            $(".companyDiv").hide();
+        } else if (2 == companyType){
+            $(".companyDiv").show();
+        }
+
+        TCarInfoDlg.zcServerClick();
+        TCarInfoDlg.kcServerClick();
+
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand.html
new file mode 100644
index 0000000..9355e97
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand.html
@@ -0,0 +1,48 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>车辆品牌管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TCarBrand.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TCarBrand.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TCarBrandTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tCarBrand/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TCarBrand.openAddTCarBrand()"/>
+                            @}
+                            @if(shiro.hasPermission("/tCarBrand/update")){
+                                <#button name="编辑" icon="fa-edit" clickFun="TCarBrand.openTCarBrandDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tCarBrand/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TCarBrand.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TCarBrandTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCarBrand/tCarBrand.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand_add.html
new file mode 100644
index 0000000..308916e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand_add.html
@@ -0,0 +1,30 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carBrandInfoForm">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="品牌名称"/>
+                    <#avatar id="imgUrl" name="品牌图标:" />
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarBrandInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarBrandInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCarBrand/tCarBrand_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand_edit.html
new file mode 100644
index 0000000..7904907
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarBrand/tCarBrand_edit.html
@@ -0,0 +1,30 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carBrandInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="名称" value="${item.name}"/>
+                    <#avatar id="imgUrl" name="品牌图标:" avatarImg="${item.imgUrl}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;">${item.remark}</textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarBrandInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarBrandInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCarBrand/tCarBrand_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel.html
new file mode 100644
index 0000000..4158d58
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel.html
@@ -0,0 +1,48 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>车辆类型管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TCarModel.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TCarModel.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TCarModelTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tCarModel/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TCarModel.openAddTCarModel()"/>
+                            @}
+                            @if(shiro.hasPermission("/tCarModel/update")){
+                                <#button name="编辑" icon="fa-edit" clickFun="TCarModel.openTCarModelDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tCarModel/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TCarModel.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TCarModelTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCarModel/tCarModel.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel_add.html
new file mode 100644
index 0000000..57105bc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel_add.html
@@ -0,0 +1,38 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carModelInfoForm">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="类型名称" />
+                    <#select id="seat" name="座位数:">
+                        <option value="5">5座</option>
+                        <option value="7">7座</option>
+                    </#select>
+                    <#select id="brandId" name="所属车辆品牌:" >
+                        <option value="">选择所属车辆品牌</option>
+                        @for(obj in brandList){
+                        <option value="${obj.id}">${obj.name}</option>
+                        @}
+                    </#select>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarModelInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarModelInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCarModel/tCarModel_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel_edit.html
new file mode 100644
index 0000000..d6c7db8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel_edit.html
@@ -0,0 +1,39 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="carModelInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="类型名称" value="${item.name}"/>
+                    <#select id="seat" name="座位数:">
+                        <option value="5" ${5 == item.seat ? 'selected=selected' : ''}>5座</option>
+                        <option value="7" ${7 == item.seat ? 'selected=selected' : ''}>7座</option>
+                    </#select>
+                    <#select id="brandId" name="所属车辆品牌:" >
+                        <option value="">选择所属车辆品牌</option>
+                        @for(obj in brandList){
+                        <option value="${obj.id}" ${obj.id == item.brandId ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </#select>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;">${item.remark}</textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCarModelInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCarModelInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCarModel/tCarModel_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/franchisee.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/franchisee.html
new file mode 100644
index 0000000..ccfe69f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/franchisee.html
@@ -0,0 +1,70 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>加盟商管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="加盟商名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="account" name="账号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="principalName" name="联系人" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="principalPhone" name="联系电话" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="serviceStr" name="经营业务" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="2">正常</option>
+                                    <option value="1">禁用</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="Franchisee.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="Franchisee.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="FranchiseeTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tCompany/addFranchisee")){
+                            <#button name="添加" icon="fa-plus" clickFun="Franchisee.addFranchisee()"/>
+                            @}
+                            @if(shiro.hasPermission("/tCompany/updateFranchisee")){
+                            <#button name="修改" icon="fa-edit" clickFun="Franchisee.updateFranchisee()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tCompany/deleteFranchisee")){
+                            <#button name="删除" icon="fa-remove" clickFun="Franchisee.deleteFranchisee()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tCompany/detailFranchisee")){
+                            <#button name="查看详情" icon="fa-remove" clickFun="Franchisee.detailFranchisee()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="FranchiseeTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCompany/franchisee.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/platformEdit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/platformEdit.html
new file mode 100644
index 0000000..a63dc5f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/platformEdit.html
@@ -0,0 +1,371 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="companyInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <input type="hidden" id="userId" name="userId" value="${user.id}">
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#input id="name" name="分公司名称" value="${item.name}" />
+                    <#input id="code" name="分公司代码" value="${item.code}" />
+                    <#input id="principalName" name="分公司负责人" value="${item.principalName}" />
+                    <#input id="adminName" name="分公司管理人" value="${item.adminName}" />
+                    <#input id="documentAddress" name="行政文书送达地址" value="${item.documentAddress}" />
+                    <#input id="setupTime" name="服务机构设立日期" value="${item.setupTime}" />
+                    <#input id="licenseNumber" name="网络预约出租汽<br>车经营许可证号" value="${item.licenseNumber}" />
+                    <#input id="addressCode" name="注册地行政区域划<br>分代码" value="${item.addressCode}" />
+                    <#input id="licenseTime" name="经营许可证初次发证日期" value="${item.licenseTime}" />
+                    <#input id="licenseEndTime" name="经营许可证有效期止" value="${item.licenseEndTime}" />
+                    <#input id="regCapital" name="注册资本" value="${item.regCapital}" />
+                    <#input id="driverNum" name="注册网络预约车驾驶员数量" value="${item.driverNum}" />
+                    <#input id="legalId" name="法人代表身份证号" value="${item.legalId}" />
+                    <#avatar id="idCardPositive" name="法定代表人身份<br>证照片(正面):" avatarImg="${item.idCardPositive}"/>
+                    <#input id="contactAddress" name="通信地址" value="${item.contactAddress}"/>
+                </div>
+
+                <div class="col-sm-6">
+                    <#input id="scopeCode" name="分公司区划代码" value="${item.scopeCode}"/>
+                    <#input id="detailAddress" name="分公司具体地址" value="${item.detailAddress}"/>
+                    <#input id="principalPhone" name="负责人电话" value="${item.principalPhone}"/>
+                    <#input id="adminPhone" name="管理员电话" value="${item.adminPhone}"/>
+                    <#input id="urgentPhoen" name="紧急联系电话" value="${item.urgentPhoen}"/>
+                    <#input id="identifier" name="统一社会信用代码" value="${item.identifier}"/>
+                    <#input id="serviceScope" name="经营区域" value="${item.serviceScope}"/>
+                    <#input id="licensingAgency" name="经营许可证发证机构" value="${item.licensingAgency}"/>
+                    <#input id="licenseStartTime" name="经营许可证有效期起" value="${item.licenseStartTime}"/>
+                    <#input id="economicType" name="经营业户经济类型" value="${item.economicType}"/>
+                    <#input id="carNum" name="注册网络预约出租车<br>车辆数" value="${item.carNum}"/>
+                    <#input id="legalName" name="法人代表姓名" value="${item.legalName}"/>
+                    <#input id="legalPhone" name="法人代表电话" value="${item.legalPhone}"/>
+                    <#avatar id="idCardReverse" name="法定代表人身份<br>证照片(反面):" avatarImg="${item.idCardReverse}"/>
+                    <#input id="businessScope" name="经营范围" value="${item.businessScope}"/>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">经营业务:</label>
+                        <div class="col-sm-10">
+                            <fieldset>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox1" type="checkbox" value="1" ${1 == item.isSpe ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox1()">
+                                    <label for="checkbox1">
+                                        专车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="zcDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="zc" id="zc1" value="1" ${1 == item.isSpeFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="zc1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="zcPercent" name="zcPercent"
+                                                                   @if(1 == item.isSpeFixedOrProportional){
+                                                                   value="${item.speMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="zc" id="zc2" value="2" ${2 == item.isSpeFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="zc2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="zcMoney" name="zcMoney"
+                                                                   @if(2 == item.isSpeFixedOrProportional){
+                                                                   value="${item.speMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-primary">
+                                    <input name="checkbox" id="checkbox2" type="checkbox" value="2" ${1 == item.isTaxi ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox2()">
+                                    <label for="checkbox2">
+                                        出租车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="czDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz1" value="1" ${1 == item.isTaxiFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="cz1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="czPercent" name="czPercent"
+                                                                   @if(1 == item.isTaxiFixedOrProportional){
+                                                                   value="${item.taxiMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz2" value="2" ${2 == item.isTaxiFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="cz2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="czMoney" name="czMoney"
+                                                                   @if(2 == item.isTaxiFixedOrProportional){
+                                                                   value="${item.taxiMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox3" type="checkbox" value="3" ${1 == item.isCross ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox3()">
+                                    <label for="checkbox3">
+                                        跨城出行
+                                    </label>
+                                </div>
+                                <div class="checkbox checkbox-info">
+                                    <input name="checkbox" id="checkbox4" type="checkbox" value="4" ${1 == item.isSameLogistics ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox4()">
+                                    <label for="checkbox4">
+                                        同城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="tcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx1" value="1" ${1 == item.isSameLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="tcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="tcxPercent" name="tcxPercent"
+                                                                   @if(1 == item.isSameLogisticsFixedOrProportional){
+                                                                   value="${item.sameLogisticsMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx2" value="2" ${2 == item.isSameLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="tcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="tcxMoney" name="tcxMoney"
+                                                                   @if(2 == item.isSameLogisticsFixedOrProportional){
+                                                                   value="${item.sameLogisticsMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-warning">
+                                    <input name="checkbox" id="checkbox5" type="checkbox" value="5" ${1 == item.isCrossLogistics ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox5()">
+                                    <label for="checkbox5">
+                                        跨城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="kcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" id="kcx1" value="1" ${1 == item.isCrossLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="kcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="kcxPercent" name="kcxPercent"
+                                                                   @if(1 == item.isCrossLogisticsFixedOrProportional){
+                                                                   value="${item.crossLogisticsMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" id="kcx2" value="2" ${2 == item.isCrossLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="kcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="kcxMoney" name="kcxMoney"
+                                                                   @if(2 == item.isCrossLogisticsFixedOrProportional){
+                                                                   value="${item.crossLogisticsMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-danger">
+                                    <input name="checkbox" id="checkbox6" type="checkbox" value="6" ${1 == item.isCharter ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox6()">
+                                    <label for="checkbox6">
+                                        包车
+                                    </label>
+                                </div>
+                            </fieldset>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">经营区域:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="province" onchange="TCompanyInfoDlg.provinceChange(this)">
+                                <option value="">选择省</option>
+                                @for(obj in provinceList){
+                                <option value="${obj.code}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="city" onchange="TCompanyInfoDlg.cityChage(this)">
+                                <option value="">选择市</option>
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="area">
+                                <option value="">选择区</option>
+                            </select>
+                        </div>
+                        <div class="col-sm-1">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TCompanyInfoDlg.addScope()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">添加区域</label>
+                        <div class="col-sm-9">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;">区域</th>
+                                        <th style="width: 200px;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="conn">
+                                    @for(obj in scopeList){
+                                    <tr class="timeClass">
+                                        <td><input type="hidden" id="recordId" name="recordId" value="${obj.id}">
+                                            <input type="hidden" id="provinceCode" name="provinceCode" value="${obj.provinceCode}">
+                                            <input type="hidden" id="cityCode" name="cityCode" value="${obj.cityCode}">
+                                            <input type="hidden" id="areaCode" name="areaCode" value="${obj.areaCode}">${obj.value}</td>
+                                        <td><button onclick="deleteSub(this)">移除</button></td>
+                                    </tr>
+                                    @}
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">是否需要摆渡车:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="isNeedFerry1" value="1" name="isNeedFerry" ${1 == item.isNeedFerry ? 'checked=checked' : ''} >
+                                <label for="isNeedFerry1"> 是 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="isNeedFerry2" value="2" name="isNeedFerry" ${2 == item.isNeedFerry ? 'checked=checked' : ''}>
+                                <label for="isNeedFerry2"> 否 </label>
+                            </div>
+                        </div>
+                    </div>
+                   <!-- <div class="form-group">
+                        <label class="col-sm-2 control-label">限登录MAC地址:</label>
+                        <div class="col-sm-9">
+                            <input type="text" class="form-control" id="mac" name="mac" value="${item.mac}">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">登录账号:</label>
+                        <div class="col-sm-9">
+                            <input type="text" class="form-control" id="account" name="account" value="${user.account}">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">登录密码:</label>
+                        <div class="col-sm-9">
+                            <input type="password" class="form-control" id="password" name="password" >
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">确认密码:</label>
+                        <div class="col-sm-9">
+                            <input type="password" class="form-control" id="rePassword" name="rePassword" >
+                        </div>
+                    </div>-->
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCompanyInfoDlg.editSubmit()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCompany/tCompany_info.js"></script>
+<script type="application/javascript">
+    laydate.render({
+        elem: '#setupTime'
+    });
+    laydate.render({
+        elem: '#licenseTime'
+    });
+    laydate.render({
+        elem: '#licenseStartTime'
+    });
+    laydate.render({
+        elem: '#licenseEndTime'
+    });
+
+    $(function() {
+        TCompanyInfoDlg.checkbox1();
+        TCompanyInfoDlg.checkbox2();
+        TCompanyInfoDlg.checkbox3();
+        TCompanyInfoDlg.checkbox4();
+        TCompanyInfoDlg.checkbox5();
+        TCompanyInfoDlg.checkbox6();
+
+        var zc = $("input[name='zc']:checked").val();
+        var cz = $("input[name='cz']:checked").val();
+        var tcx = $("input[name='tcx']:checked").val();
+        var kcx = $("input[name='kcx']:checked").val();
+        if (zc == "" || zc == null || zc == undefined){
+            $("#zc1").attr("checked","checked")
+        }
+        if (cz == "" || cz == null || cz == undefined){
+            $("#cz1").attr("checked","checked")
+        }
+        if (tcx == "" || tcx == null || tcx == undefined){
+            $("#tcx1").attr("checked","checked")
+        }
+        if (kcx == "" || kcx == null || kcx == undefined){
+            $("#kcx1").attr("checked","checked")
+        }
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany.html
new file mode 100644
index 0000000..677cd52
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany.html
@@ -0,0 +1,73 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>分公司管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="分公司名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="principalName" name="负责人名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="principalPhone" name="负责人电话" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="adminName" name="管理人名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="adminPhone" name="管理人电话" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="serviceStr" name="经营业务" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="2">正常</option>
+                                    <option value="1">禁用</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TCompany.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TCompany.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TCompanyTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tCompany/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TCompany.openAddTCompany()"/>
+                            @}
+                            @if(shiro.hasPermission("/tCompany/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="TCompany.openTCompanyDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tCompany/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TCompany.delete()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tCompany/detail")){
+                                <#button name="查看详情" icon="fa-remove" clickFun="TCompany.detail()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TCompanyTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCompany/tCompany.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_add.html
new file mode 100644
index 0000000..6d36708
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_add.html
@@ -0,0 +1,307 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="companyInfoForm">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#input id="name" name="分公司名称"/>
+                    <#input id="code" name="分公司代码"/>
+                    <#input id="principalName" name="分公司负责人" />
+                    <#input id="adminName" name="分公司管理人"/>
+                    <#input id="documentAddress" name="行政文书送达地址"/>
+                    <#input id="setupTime" name="服务机构设立日期"/>
+                    <#input id="licenseNumber" name="网络预约出租汽<br>车经营许可证号"/>
+                    <#input id="addressCode" name="注册地行政区域划<br>分代码"/>
+                    <#input id="licenseTime" name="经营许可证初次发证日期" />
+                    <#input id="licenseEndTime" name="经营许可证有效期止" />
+                    <#input id="regCapital" name="注册资本"/>
+                    <#input id="driverNum" name="注册网络预约车驾驶员数量" />
+                    <#input id="legalId" name="法人代表身份证号"/>
+                    <#avatar id="idCardPositive" name="法定代表人身份<br>证照片(正面):" />
+                    <#input id="contactAddress" name="通信地址"/>
+                </div>
+
+                <div class="col-sm-6">
+                    <#input id="scopeCode" name="分公司区划代码"/>
+                    <#input id="detailAddress" name="分公司具体地址" />
+                    <#input id="principalPhone" name="负责人电话" />
+                    <#input id="adminPhone" name="管理员电话" />
+                    <#input id="urgentPhoen" name="紧急联系电话" />
+                    <#input id="identifier" name="统一社会信用代码" />
+                    <#input id="serviceScope" name="经营区域" />
+                    <#input id="licensingAgency" name="经营许可证发证机构"/>
+                    <#input id="licenseStartTime" name="经营许可证有效期起"/>
+                    <#input id="economicType" name="经营业户经济类型"/>
+                    <#input id="carNum" name="注册网络预约出租车<br>车辆数"/>
+                    <#input id="legalName" name="法人代表姓名" />
+                    <#input id="legalPhone" name="法人代表电话" />
+                    <#avatar id="idCardReverse" name="法定代表人身份<br>证照片(反面):" />
+                    <#input id="businessScope" name="经营范围" />
+
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">经营业务:</label>
+                        <div class="col-sm-10">
+                            <fieldset>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox1" type="checkbox" value="1" onclick="TCompanyInfoDlg.checkbox1()">
+                                    <label for="checkbox1">
+                                        专车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="zcDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle" >
+                                                    <input type="radio" name="zc" id="zc1" value="1" checked="">
+                                                    <label for="zc1" >
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="zcPercent" name="zcPercent">
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="zc" id="zc2" value="2">
+                                                    <label for="zc2">
+                                                        <div style="position: relative;top: -8px;">
+                                                        <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="zcMoney" name="zcMoney">
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-primary">
+                                    <input name="checkbox" id="checkbox2" type="checkbox" value="2" onclick="TCompanyInfoDlg.checkbox2()">
+                                    <label for="checkbox2">
+                                        出租车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="czDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz1" value="1" checked="">
+                                                    <label for="cz1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="czPercent" name="czPercent">
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz2" value="2">
+                                                    <label for="cz2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="czMoney" name="czMoney">
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox3" type="checkbox" value="3" onclick="TCompanyInfoDlg.checkbox3()">
+                                    <label for="checkbox3">
+                                        跨城出行
+                                    </label>
+                                </div>
+                                <div class="checkbox checkbox-info">
+                                    <input name="checkbox" id="checkbox4" type="checkbox" value="4" onclick="TCompanyInfoDlg.checkbox4()">
+                                    <label for="checkbox4">
+                                        同城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="tcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx1" value="1" checked="">
+                                                    <label for="tcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="tcxPercent" name="tcxPercent">
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx2" value="2">
+                                                    <label for="tcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="tcxMoney" name="tcxMoney">
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-warning">
+                                    <input name="checkbox" id="checkbox5" type="checkbox" value="5" onclick="TCompanyInfoDlg.checkbox5()">
+                                    <label for="checkbox5">
+                                        跨城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="kcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" id="kcx1" value="1" checked="">
+                                                    <label for="kcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="kcxPercent" name="kcxPercent">
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" id="kcx2" value="2">
+                                                    <label for="kcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="kcxMoney" name="kcxMoney">
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-danger">
+                                    <input name="checkbox" id="checkbox6" type="checkbox" value="6" onclick="TCompanyInfoDlg.checkbox6()">
+                                    <label for="checkbox6">
+                                        包车
+                                    </label>
+                                </div>
+                            </fieldset>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">经营区域:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="province" onchange="TCompanyInfoDlg.provinceChange(this)">
+                                <option value="">选择省</option>
+                                @for(obj in provinceList){
+                                <option value="${obj.code}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="city" onchange="TCompanyInfoDlg.cityChage(this)">
+                                <option value="">选择市</option>
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="area">
+                                <option value="">选择区</option>
+                            </select>
+                        </div>
+                        <div class="col-sm-1">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TCompanyInfoDlg.addScope()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">添加区域</label>
+                        <div class="col-sm-9">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;">区域</th>
+                                        <th style="width: 200px;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="conn">
+
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">是否需要摆渡车:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="isNeedFerry1" value="1" name="isNeedFerry" checked="" >
+                                <label for="isNeedFerry1"> 是 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="isNeedFerry2" value="2" name="isNeedFerry" >
+                                <label for="isNeedFerry2"> 否 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">限登录MAC地址:</label>
+                        <div class="col-sm-9">
+                            <input type="text" class="form-control" id="mac" name="mac" >
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">登录账号:</label>
+                        <div class="col-sm-9">
+                            <input type="text" class="form-control" id="account" name="account" >
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">登录密码:</label>
+                        <div class="col-sm-9">
+                            <input type="password" class="form-control" id="password" name="password" >
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">确认密码:</label>
+                        <div class="col-sm-9">
+                            <input type="password" class="form-control" id="rePassword" name="rePassword" >
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCompanyInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCompanyInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCompany/tCompany_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#setupTime'
+    });
+    laydate.render({
+        elem: '#licenseTime'
+    });
+    laydate.render({
+        elem: '#licenseStartTime'
+    });
+    laydate.render({
+        elem: '#licenseEndTime'
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_addFranchisee.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_addFranchisee.html
new file mode 100644
index 0000000..10c4b12
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_addFranchisee.html
@@ -0,0 +1,221 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="franchiseeInfoForm">
+
+            <div class="row">
+                <div class="col-sm-10">
+                    @if(roleType == 1){
+                    <#select id="superiorId" name="所属分公司:" onchange="TOpenCityInfoDlg.provinceChange()">
+                        <option value="">选择所属分公司</option>
+                        @for(obj in companyList){
+                        <option value="${obj.id}">${obj.name}</option>
+                        @}
+                    </#select>
+                    @}else if(roleType == 2){
+                        <#label id="companyName" name="所属分公司" value="${company.name}"/>
+                    @}
+                    <#input id="name" name="加盟商名称"/>
+                    <#input id="detailAddress" name="加盟商地址"/>
+
+                    <#input id="principalName" name="联系人" />
+                    <#input id="principalPhone" name="联系电话" />
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-10">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">经营业务:</label>
+                        <div class="col-sm-9">
+                            <fieldset>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox1" type="checkbox" value="1" onclick="FranchiseeInfoDlg.checkbox1()">
+                                    <label for="checkbox1">
+                                        专车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="zcDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="zc" id="zc1" value="1" checked="">
+                                                    <label for="zc1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="zcPercent" name="zcPercent">
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="zc" id="zc2" value="2">
+                                                    <label for="zc2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="zcMoney" name="zcMoney">
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-primary">
+                                    <input name="checkbox" id="checkbox2" type="checkbox" value="2" onclick="FranchiseeInfoDlg.checkbox2()">
+                                    <label for="checkbox2">
+                                        出租车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="czDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz1" value="1" checked="">
+                                                    <label for="cz1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="czPercent" name="czPercent">
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz2" value="2">
+                                                    <label for="cz2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="czMoney" name="czMoney">
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox3" type="checkbox" value="3" onclick="FranchiseeInfoDlg.checkbox3()">
+                                    <label for="checkbox3">
+                                        跨城出行
+                                    </label>
+                                </div>
+                                <div class="checkbox checkbox-info">
+                                    <input name="checkbox" id="checkbox4" type="checkbox" value="4" onclick="FranchiseeInfoDlg.checkbox4()">
+                                    <label for="checkbox4">
+                                        同城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="tcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx1" value="1" checked="">
+                                                    <label for="tcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="tcxPercent" name="tcxPercent">
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx2" value="2">
+                                                    <label for="tcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="tcxMoney" name="tcxMoney">
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-warning">
+                                    <input name="checkbox" id="checkbox5" type="checkbox" value="5" onclick="FranchiseeInfoDlg.checkbox5()">
+                                    <label for="checkbox5">
+                                        跨城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="kcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" id="kcx1" value="1" checked="">
+                                                    <label for="kcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="kcxPercent" name="kcxPercent">
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" id="kcx2" value="2">
+                                                    <label for="kcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="kcxMoney" name="kcxMoney">
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-danger">
+                                    <input name="checkbox" id="checkbox6" type="checkbox" value="6" onclick="FranchiseeInfoDlg.checkbox6()">
+                                    <label for="checkbox6">
+                                        包车
+                                    </label>
+                                </div>
+                            </fieldset>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">是否需要摆渡车:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="isNeedFerry1" value="1" name="isNeedFerry" checked="" >
+                                <label for="isNeedFerry1"> 是 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="isNeedFerry2" value="2" name="isNeedFerry" >
+                                <label for="isNeedFerry2"> 否 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">登录账号:</label>
+                        <div class="col-sm-9">
+                            <input type="text" class="form-control" id="account" name="account" >
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">登录密码:</label>
+                        <div class="col-sm-9">
+                            <input type="password" class="form-control" id="password" name="password" >
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">确认密码:</label>
+                        <div class="col-sm-9">
+                            <input type="password" class="form-control" id="rePassword" name="rePassword" >
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="FranchiseeInfoDlg.addFranchisee()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="FranchiseeInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCompany/franchisee_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_detail.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_detail.html
new file mode 100644
index 0000000..77f004f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_detail.html
@@ -0,0 +1,346 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="companyInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <input type="hidden" id="userId" name="userId" value="${user.id}">
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#label id="account" name="登录账号" value="${user.account}"/>
+                    <#label id="name" name="分公司名称" value="${item.name}"/>
+                    <#label id="code" name="分公司代码" value="${item.code}"/>
+                    <#label id="principalName" name="分公司负责人" value="${item.principalName}"/>
+                    <#label id="adminName" name="分公司管理人" value="${item.adminName}"/>
+                    <#label id="documentAddress" name="行政文书送达地址" value="${item.documentAddress}"/>
+                    <#label id="setupTime" name="服务机构设立日期" value="${item.setupTime}"/>
+                    <#label id="licenseNumber" name="网络预约出租汽<br>车经营许可证号" value="${item.licenseNumber}"/>
+                    <#label id="addressCode" name="注册地行政区域划<br>分代码" value="${item.addressCode}"/>
+                    <#label id="licenseTime" name="经营许可证初次发证日期" value="${item.licenseTime}"/>
+                    <#label id="licenseEndTime" name="经营许可证有效期止" value="${item.licenseEndTime}"/>
+                    <#label id="regCapital" name="注册资本" value="${item.regCapital}"/>
+                    <#label id="driverNum" name="注册网络预约车驾驶员数量" value="${item.driverNum}"/>
+                    <#label id="legalId" name="法人代表身份证号" value="${item.legalId}"/>
+                    <#label id="contactAddress" name="通信地址" value="${item.contactAddress}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">法定代表人身份<br>证照片(正面):</label>
+                        <div class="col-sm-9">
+                            <div class="form-group">
+                                <div class="col-sm-6">
+                                    <div id="idCardPositivePreId">
+                                        <div>
+                                            @if(isEmpty(item.idCardPositive)){
+                                            <img onclick="lookBigImg('${ctxPath}/static/img/NoPIC.png')" src="${ctxPath}/static/img/NoPIC.png" style="max-width:150px;">
+                                            @}else{
+                                            <img onclick="lookBigImg('${item.idCardPositive}')" src="${item.idCardPositive}" style="max-width:250px;">
+                                            @}
+                                        </div>
+                                    </div>
+                                </div>
+                                <input type="hidden" id="idCardPositive" name="idCardPositive" value="${item.idCardPositive}"/>
+                            </div>
+                        </div>
+                    </div>
+
+
+                </div>
+
+                <div class="col-sm-6">
+                    <#label id="mac" name="限登录MAC地址" value="${item.mac}"/>
+                    <#label id="scopeCode" name="分公司区划代码" value="${item.scopeCode}"/>
+                    <#label id="detailAddress" name="分公司具体地址" value="${item.detailAddress}"/>
+                    <#label id="principalPhone" name="负责人电话" value="${item.principalPhone}"/>
+                    <#label id="adminPhone" name="管理员电话" value="${item.adminPhone}"/>
+                    <#label id="urgentPhoen" name="紧急联系电话" value="${item.urgentPhoen}"/>
+                    <#label id="identifier" name="统一社会信用代码" value="${item.identifier}"/>
+                    <#label id="serviceScope" name="经营区域" value="${item.serviceScope}"/>
+                    <#label id="licensingAgency" name="经营许可证发证机构" value="${item.licensingAgency}"/>
+                    <#label id="licenseStartTime" name="经营许可证有效期起" value="${item.licenseStartTime}"/>
+                    <#label id="economicType" name="经营业户经济类型" value="${item.economicType}"/>
+                    <#label id="carNum" name="注册网络预约出租车<br>车辆数" value="${item.carNum}"/>
+                    <#label id="legalName" name="法人代表姓名" value="${item.legalName}"/>
+                    <#label id="legalPhone" name="法人代表电话" value="${item.legalPhone}"/>
+                    <#label id="businessScope" name="经营范围" value="${item.businessScope}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">法定代表人身份<br>证照片(反面):</label>
+                        <div class="col-sm-9">
+                            <div class="form-group">
+                                <div class="col-sm-6">
+                                    <div id="idCardReversePreId">
+                                        <div>
+                                            @if(isEmpty(item.idCardReverse)){
+                                            <img onclick="lookBigImg('${ctxPath}/static/img/NoPIC.png')" src="${ctxPath}/static/img/NoPIC.png" style="max-width:150px;">
+                                            @}else{
+                                            <img onclick="lookBigImg('${item.idCardReverse}')" src="${item.idCardReverse}" style="max-width:250px;">
+                                            @}
+                                        </div>
+                                    </div>
+                                </div>
+                                <input type="hidden" id="idCardReverse" name="idCardReverse" value="${item.idCardReverse}"/>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">经营业务:</label>
+                        <div class="col-sm-10">
+                            <fieldset>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox1" type="checkbox" disabled value="1" ${1 == item.isSpe ? 'checked=checked' : ''} >
+                                    <label for="checkbox1">
+                                        专车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="zcDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="zc" id="zc1" disabled value="1" ${1 == item.isSpeFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="zc1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="zcPercent" name="zcPercent" disabled
+                                                                   @if(1 == item.isSpeFixedOrProportional){
+                                                                   value="${item.speMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="zc" id="zc2" disabled value="2" ${2 == item.isSpeFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="zc2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="zcMoney" name="zcMoney" disabled
+                                                                   @if(2 == item.isSpeFixedOrProportional){
+                                                                   value="${item.speMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-primary">
+                                    <input name="checkbox" id="checkbox2" type="checkbox" disabled value="2" ${1 == item.isTaxi ? 'checked=checked' : ''} >
+                                    <label for="checkbox2">
+                                        出租车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="czDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz1" disabled value="1" ${1 == item.isTaxiFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="cz1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="czPercent" name="czPercent" disabled
+                                                                   @if(1 == item.isTaxiFixedOrProportional){
+                                                                   value="${item.taxiMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz2" disabled value="2" ${2 == item.isTaxiFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="cz2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="czMoney" name="czMoney" disabled
+                                                                   @if(2 == item.isTaxiFixedOrProportional){
+                                                                   value="${item.taxiMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox3" type="checkbox" disabled value="3" ${1 == item.isCross ? 'checked=checked' : ''} >
+                                    <label for="checkbox3">
+                                        跨城出行
+                                    </label>
+                                </div>
+                                <div class="checkbox checkbox-info">
+                                    <input name="checkbox" id="checkbox4" type="checkbox" disabled value="4" ${1 == item.isSameLogistics ? 'checked=checked' : ''}>
+                                    <label for="checkbox4">
+                                        同城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="tcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx1" disabled value="1" ${1 == item.isSameLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="tcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="tcxPercent" name="tcxPercent" disabled
+                                                                   @if(1 == item.isSameLogisticsFixedOrProportional){
+                                                                   value="${item.sameLogisticsMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx2" disabled value="2" ${2 == item.isSameLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="tcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="tcxMoney" name="tcxMoney" disabled
+                                                                   @if(2 == item.isSameLogisticsFixedOrProportional){
+                                                                   value="${item.sameLogisticsMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-warning">
+                                    <input name="checkbox" id="checkbox5" type="checkbox" disabled value="5" ${1 == item.isCrossLogistics ? 'checked=checked' : ''} >
+                                    <label for="checkbox5">
+                                        跨城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="kcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" id="kcx1" disabled value="1" ${1 == item.isCrossLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="kcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="kcxPercent" name="kcxPercent" disabled
+                                                                   @if(1 == item.isCrossLogisticsFixedOrProportional){
+                                                                   value="${item.crossLogisticsMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" disabled id="kcx2" value="2" ${2 == item.isCrossLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="kcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="kcxMoney" name="kcxMoney" disabled
+                                                                   @if(2 == item.isCrossLogisticsFixedOrProportional){
+                                                                   value="${item.crossLogisticsMoney}"
+                                                                   @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-danger">
+                                    <input name="checkbox" id="checkbox6" disabled type="checkbox" value="6" ${1 == item.isCharter ? 'checked=checked' : ''} >
+                                    <label for="checkbox6">
+                                        包车
+                                    </label>
+                                </div>
+                            </fieldset>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">添加区域</label>
+                        <div class="col-sm-9">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;text-align: center;">区域</th>
+                                        <!--<th style="width: 200px;">操作</th>-->
+                                    </tr>
+                                    </thead>
+                                    <tbody id="conn">
+                                    @for(obj in scopeList){
+                                    <tr class="timeClass" style="text-align: center;">
+                                        <td><input type="hidden" id="recordId" name="recordId" value="${obj.id}">
+                                            <input type="hidden" id="provinceCode" name="provinceCode" value="${obj.provinceCode}">
+                                            <input type="hidden" id="cityCode" name="cityCode" value="${obj.cityCode}">
+                                            <input type="hidden" id="areaCode" name="areaCode" value="${obj.areaCode}">${obj.value}</td>
+                                        <!--<td><button onclick="deleteSub(this)">移除</button></td>-->
+                                    </tr>
+                                    @}
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">是否需要摆渡车:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="isNeedFerry1" value="1" disabled name="isNeedFerry" ${1 == item.isNeedFerry ? 'checked=checked' : ''} >
+                                <label for="isNeedFerry1"> 是 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="isNeedFerry2" value="2" disabled name="isNeedFerry" ${2 == item.isNeedFerry ? 'checked=checked' : ''}>
+                                <label for="isNeedFerry2"> 否 </label>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCompany/tCompany_info.js"></script>
+<script type="application/javascript">
+    $(function() {
+        TCompanyInfoDlg.checkbox1();
+        TCompanyInfoDlg.checkbox2();
+        TCompanyInfoDlg.checkbox3();
+        TCompanyInfoDlg.checkbox4();
+        TCompanyInfoDlg.checkbox5();
+        TCompanyInfoDlg.checkbox6();
+
+        var zc = $("input[name='zc']:checked").val();
+        var cz = $("input[name='cz']:checked").val();
+        var tcx = $("input[name='tcx']:checked").val();
+        var kcx = $("input[name='kcx']:checked").val();
+        if (zc == "" || zc == null || zc == undefined){
+            $("#zc1").attr("checked","checked")
+        }
+        if (cz == "" || cz == null || cz == undefined){
+            $("#cz1").attr("checked","checked")
+        }
+        if (tcx == "" || tcx == null || tcx == undefined){
+            $("#tcx1").attr("checked","checked")
+        }
+        if (kcx == "" || kcx == null || kcx == undefined){
+            $("#kcx1").attr("checked","checked")
+        }
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_detailFranchisee.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_detailFranchisee.html
new file mode 100644
index 0000000..48c238a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_detailFranchisee.html
@@ -0,0 +1,246 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="franchiseeInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <input type="hidden" id="userId" name="userId" value="${user.id}">
+            <div class="row">
+                <div class="col-sm-10">
+                    <#label id="account" name="登录账号" value="${user.account}"/>
+                    <#label id="companyName" name="所属分公司" value="${companyName}"/>
+                    <#label id="name" name="加盟商名称" value="${item.name}"/>
+                    <#label id="detailAddress" name="加盟商地址" value="${item.detailAddress}"/>
+                    <#label id="principalName" name="联系人" value="${item.principalName}"/>
+                    <#label id="principalPhone" name="联系电话" value="${item.principalPhone}"/>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-sm-10">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">经营业务:</label>
+                    <div class="col-sm-9">
+                        <fieldset>
+                            <div class="checkbox checkbox-success">
+                                <input name="checkbox" id="checkbox1" disabled type="checkbox" value="1" ${1 == item.isSpe ? 'checked=checked' : ''} >
+                                <label for="checkbox1">
+                                    专车
+                                </label>
+                                <fieldset>
+                                    <div class="row" style="display: none;" id="zcDiv">
+                                        <div class="col-sm-6">
+                                            <div class="checkbox checkbox-circle">
+                                                <input type="radio" disabled name="zc" id="zc1" value="1" ${1 == item.isSpeFixedOrProportional ? 'checked=checked' : ''}>
+                                                <label for="zc1">
+                                                    <div style="position: relative;top: -8px;">
+                                                        <span>按比例抽成,每笔订单抽取</span>
+                                                        <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="zcPercent" name="zcPercent"
+                                                               @if(1 == item.isSpeFixedOrProportional){
+                                                               value="${item.speMoney}"
+                                                               @}
+                                                        >
+                                                        <span>%</span>
+                                                    </div>
+                                                </label>
+                                            </div>
+                                            <div class="checkbox checkbox-circle">
+                                                <input type="radio" disabled name="zc" id="zc2" value="2" ${2 == item.isSpeFixedOrProportional ? 'checked=checked' : ''}>
+                                                <label for="zc2">
+                                                    <div style="position: relative;top: -8px;">
+                                                        <span>按固定金额抽成,每笔订单抽取</span>
+                                                        <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="zcMoney" name="zcMoney"
+                                                               @if(2 == item.isSpeFixedOrProportional){
+                                                               value="${item.speMoney}"
+                                                               @}
+                                                        >
+                                                        <span>元</span>
+                                                    </div>
+                                                </label>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </fieldset>
+                            </div>
+                            <div class="checkbox checkbox-primary">
+                                <input name="checkbox" id="checkbox2" type="checkbox" disabled value="2" ${1 == item.isTaxi ? 'checked=checked' : ''}>
+                                <label for="checkbox2">
+                                    出租车
+                                </label>
+                                <fieldset>
+                                    <div class="row" style="display: none;" id="czDiv">
+                                        <div class="col-sm-6">
+                                            <div class="checkbox checkbox-circle">
+                                                <input type="radio" disabled name="cz" id="cz1" value="1" ${1 == item.isTaxiFixedOrProportional ? 'checked=checked' : ''}>
+                                                <label for="cz1">
+                                                    <div style="position: relative;top: -8px;">
+                                                        <span>按比例抽成,每笔订单抽取</span>
+                                                        <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="czPercent" name="czPercent"
+                                                               @if(1 == item.isTaxiFixedOrProportional){
+                                                               value="${item.taxiMoney}"
+                                                               @}
+                                                        >
+                                                        <span>%</span>
+                                                    </div>
+                                                </label>
+                                            </div>
+                                            <div class="checkbox checkbox-circle">
+                                                <input type="radio" disabled name="cz" id="cz2" value="2" ${2 == item.isTaxiFixedOrProportional ? 'checked=checked' : ''}>
+                                                <label for="cz2">
+                                                    <div style="position: relative;top: -8px;">
+                                                        <span>按固定金额抽成,每笔订单抽取</span>
+                                                        <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="czMoney" name="czMoney"
+                                                               @if(2 == item.isTaxiFixedOrProportional){
+                                                               value="${item.taxiMoney}"
+                                                               @}
+                                                        >
+                                                        <span>元</span>
+                                                    </div>
+                                                </label>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </fieldset>
+                            </div>
+                            <div class="checkbox checkbox-success">
+                                <input name="checkbox" id="checkbox3" type="checkbox" disabled value="3" ${1 == item.isCross ? 'checked=checked' : ''} >
+                                <label for="checkbox3">
+                                    跨城出行
+                                </label>
+                            </div>
+                            <div class="checkbox checkbox-info">
+                                <input name="checkbox" id="checkbox4" type="checkbox" disabled value="4" ${1 == item.isSameLogistics ? 'checked=checked' : ''} >
+                                <label for="checkbox4">
+                                    同城小件物流
+                                </label>
+                                <fieldset>
+                                    <div class="row" style="display: none;" id="tcxDiv">
+                                        <div class="col-sm-6">
+                                            <div class="checkbox checkbox-circle">
+                                                <input type="radio" disabled name="tcx" id="tcx1" value="1" ${1 == item.isSameLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                <label for="tcx1">
+                                                    <div style="position: relative;top: -8px;">
+                                                        <span>按比例抽成,每笔订单抽取</span>
+                                                        <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="tcxPercent" name="tcxPercent"
+                                                               @if(1 == item.isSameLogisticsFixedOrProportional){
+                                                               value="${item.sameLogisticsMoney}"
+                                                               @}
+                                                        >
+                                                        <span>%</span>
+                                                    </div>
+                                                </label>
+                                            </div>
+                                            <div class="checkbox checkbox-circle">
+                                                <input type="radio" disabled name="tcx" id="tcx2" value="2" ${2 == item.isSameLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                <label for="tcx2">
+                                                    <div style="position: relative;top: -8px;">
+                                                        <span>按固定金额抽成,每笔订单抽取</span>
+                                                        <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="tcxMoney" name="tcxMoney"
+                                                               @if(2 == item.isSameLogisticsFixedOrProportional){
+                                                               value="${item.sameLogisticsMoney}"
+                                                               @}
+                                                        >
+                                                        <span>元</span>
+                                                    </div>
+                                                </label>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </fieldset>
+                            </div>
+                            <div class="checkbox checkbox-warning">
+                                <input name="checkbox" id="checkbox5" type="checkbox" disabled value="5" ${1 == item.isCrossLogistics ? 'checked=checked' : ''} >
+                                <label for="checkbox5">
+                                    跨城小件物流
+                                </label>
+                                <fieldset>
+                                    <div class="row" style="display: none;" id="kcxDiv">
+                                        <div class="col-sm-6">
+                                            <div class="checkbox checkbox-circle">
+                                                <input type="radio" disabled name="kcx" id="kcx1" value="1" ${1 == item.isCrossLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                <label for="kcx1">
+                                                    <div style="position: relative;top: -8px;">
+                                                        <span>按比例抽成,每笔订单抽取</span>
+                                                        <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="kcxPercent" name="kcxPercent"
+                                                               @if(1 == item.isCrossLogisticsFixedOrProportional){
+                                                               value="${item.crossLogisticsMoney}"
+                                                               @}
+                                                        >
+                                                        <span>%</span>
+                                                    </div>
+                                                </label>
+                                            </div>
+                                            <div class="checkbox checkbox-circle">
+                                                <input type="radio" name="kcx" disabled id="kcx2" value="2" ${2 == item.isCrossLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                <label for="kcx2">
+                                                    <div style="position: relative;top: -8px;">
+                                                        <span>按固定金额抽成,每笔订单抽取</span>
+                                                        <input style="width: 50%;display: inline-block;" type="text" disabled class="form-control" id="kcxMoney" name="kcxMoney"
+                                                               @if(2 == item.isCrossLogisticsFixedOrProportional){
+                                                               value="${item.crossLogisticsMoney}"
+                                                               @}
+                                                        >
+                                                        <span>元</span>
+                                                    </div>
+                                                </label>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </fieldset>
+                            </div>
+                            <div class="checkbox checkbox-danger">
+                                <input name="checkbox" id="checkbox6" type="checkbox" disabled value="6" ${1 == item.isCharter ? 'checked=checked' : ''} >
+                                <label for="checkbox6">
+                                    包车
+                                </label>
+                            </div>
+                        </fieldset>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">是否需要摆渡车:</label>
+                    <div class="col-sm-9"  style="display: flex;align-items: center;">
+                        <div class="radio radio-info radio-inline">
+                            <input type="radio" disabled id="isNeedFerry1" value="1" name="isNeedFerry" ${1 == item.isNeedFerry ? 'checked=checked' : ''} >
+                            <label for="isNeedFerry1"> 是 </label>
+                        </div>
+                        <div class="radio radio-success radio-inline">
+                            <input type="radio" disabled id="isNeedFerry2" value="2" name="isNeedFerry" ${2 == item.isNeedFerry ? 'checked=checked' : ''}>
+                            <label for="isNeedFerry2"> 否 </label>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+    </div>
+
+</div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCompany/franchisee_info.js"></script>
+<script type="application/javascript">
+    $(function() {
+        FranchiseeInfoDlg.checkbox1();
+        FranchiseeInfoDlg.checkbox2();
+        FranchiseeInfoDlg.checkbox3();
+        FranchiseeInfoDlg.checkbox4();
+        FranchiseeInfoDlg.checkbox5();
+        FranchiseeInfoDlg.checkbox6();
+
+        var zc = $("input[name='zc']:checked").val();
+        var cz = $("input[name='cz']:checked").val();
+        var tcx = $("input[name='tcx']:checked").val();
+        var kcx = $("input[name='kcx']:checked").val();
+        if (zc == "" || zc == null || zc == undefined){
+            $("#zc1").attr("checked","checked")
+        }
+        if (cz == "" || cz == null || cz == undefined){
+            $("#cz1").attr("checked","checked")
+        }
+        if (tcx == "" || tcx == null || tcx == undefined){
+            $("#tcx1").attr("checked","checked")
+        }
+        if (kcx == "" || kcx == null || kcx == undefined){
+            $("#kcx1").attr("checked","checked")
+        }
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_edit.html
new file mode 100644
index 0000000..a66685f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_edit.html
@@ -0,0 +1,372 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="companyInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <input type="hidden" id="userId" name="userId" value="${user.id}">
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#input id="name" name="分公司名称" value="${item.name}" />
+                    <#input id="code" name="分公司代码" value="${item.code}" />
+                    <#input id="principalName" name="分公司负责人" value="${item.principalName}" />
+                    <#input id="adminName" name="分公司管理人" value="${item.adminName}" />
+                    <#input id="documentAddress" name="行政文书送达地址" value="${item.documentAddress}" />
+                    <#input id="setupTime" name="服务机构设立日期" value="${item.setupTime}" />
+                    <#input id="licenseNumber" name="网络预约出租汽<br>车经营许可证号" value="${item.licenseNumber}" />
+                    <#input id="addressCode" name="注册地行政区域划<br>分代码" value="${item.addressCode}" />
+                    <#input id="licenseTime" name="经营许可证初次发证日期" value="${item.licenseTime}" />
+                    <#input id="licenseEndTime" name="经营许可证有效期止" value="${item.licenseEndTime}" />
+                    <#input id="regCapital" name="注册资本" value="${item.regCapital}" />
+                    <#input id="driverNum" name="注册网络预约车驾驶员数量" value="${item.driverNum}" />
+                    <#input id="legalId" name="法人代表身份证号" value="${item.legalId}" />
+                    <#avatar id="idCardPositive" name="法定代表人身份<br>证照片(正面):" avatarImg="${item.idCardPositive}"/>
+                    <#input id="contactAddress" name="通信地址" value="${item.contactAddress}"/>
+                </div>
+
+                <div class="col-sm-6">
+                    <#input id="scopeCode" name="分公司区划代码" value="${item.scopeCode}"/>
+                    <#input id="detailAddress" name="分公司具体地址" value="${item.detailAddress}"/>
+                    <#input id="principalPhone" name="负责人电话" value="${item.principalPhone}"/>
+                    <#input id="adminPhone" name="管理员电话" value="${item.adminPhone}"/>
+                    <#input id="urgentPhoen" name="紧急联系电话" value="${item.urgentPhoen}"/>
+                    <#input id="identifier" name="统一社会信用代码" value="${item.identifier}"/>
+                    <#input id="serviceScope" name="经营区域" value="${item.serviceScope}"/>
+                    <#input id="licensingAgency" name="经营许可证发证机构" value="${item.licensingAgency}"/>
+                    <#input id="licenseStartTime" name="经营许可证有效期起" value="${item.licenseStartTime}"/>
+                    <#input id="economicType" name="经营业户经济类型" value="${item.economicType}"/>
+                    <#input id="carNum" name="注册网络预约出租车<br>车辆数" value="${item.carNum}"/>
+                    <#input id="legalName" name="法人代表姓名" value="${item.legalName}"/>
+                    <#input id="legalPhone" name="法人代表电话" value="${item.legalPhone}"/>
+                    <#avatar id="idCardReverse" name="法定代表人身份<br>证照片(反面):" avatarImg="${item.idCardReverse}"/>
+                    <#input id="businessScope" name="经营范围" value="${item.businessScope}"/>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">经营业务:</label>
+                        <div class="col-sm-10">
+                            <fieldset>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox1" type="checkbox" value="1" ${1 == item.isSpe ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox1()">
+                                    <label for="checkbox1">
+                                        专车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="zcDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="zc" id="zc1" value="1" ${1 == item.isSpeFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="zc1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="zcPercent" name="zcPercent"
+                                                                            @if(1 == item.isSpeFixedOrProportional){
+                                                                                value="${item.speMoney}"
+                                                                            @}
+                                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="zc" id="zc2" value="2" ${2 == item.isSpeFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="zc2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="zcMoney" name="zcMoney"
+                                                                             @if(2 == item.isSpeFixedOrProportional){
+                                                                             value="${item.speMoney}"
+                                                                             @}
+                                                                             >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-primary">
+                                    <input name="checkbox" id="checkbox2" type="checkbox" value="2" ${1 == item.isTaxi ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox2()">
+                                    <label for="checkbox2">
+                                        出租车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="czDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz1" value="1" ${1 == item.isTaxiFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="cz1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="czPercent" name="czPercent"
+                                                                               @if(1 == item.isTaxiFixedOrProportional){
+                                                                               value="${item.taxiMoney}"
+                                                                               @}
+                                                                               >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz2" value="2" ${2 == item.isTaxiFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="cz2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="czMoney" name="czMoney"
+                                                                             @if(2 == item.isTaxiFixedOrProportional){
+                                                                             value="${item.taxiMoney}"
+                                                                             @}
+                                                                             >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox3" type="checkbox" value="3" ${1 == item.isCross ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox3()">
+                                    <label for="checkbox3">
+                                        跨城出行
+                                    </label>
+                                </div>
+                                <div class="checkbox checkbox-info">
+                                    <input name="checkbox" id="checkbox4" type="checkbox" value="4" ${1 == item.isSameLogistics ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox4()">
+                                    <label for="checkbox4">
+                                        同城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="tcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx1" value="1" ${1 == item.isSameLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="tcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="tcxPercent" name="tcxPercent"
+                                                                           @if(1 == item.isSameLogisticsFixedOrProportional){
+                                                                           value="${item.sameLogisticsMoney}"
+                                                                           @}
+                                                                           >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx2" value="2" ${2 == item.isSameLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="tcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="tcxMoney" name="tcxMoney"
+                                                                             @if(2 == item.isSameLogisticsFixedOrProportional){
+                                                                             value="${item.sameLogisticsMoney}"
+                                                                             @}
+                                                                             >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-warning">
+                                    <input name="checkbox" id="checkbox5" type="checkbox" value="5" ${1 == item.isCrossLogistics ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox5()">
+                                    <label for="checkbox5">
+                                        跨城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="kcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" id="kcx1" value="1" ${1 == item.isCrossLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="kcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="kcxPercent" name="kcxPercent"
+                                                                           @if(1 == item.isCrossLogisticsFixedOrProportional){
+                                                                           value="${item.crossLogisticsMoney}"
+                                                                           @}
+                                                                           >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" id="kcx2" value="2" ${2 == item.isCrossLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="kcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="kcxMoney" name="kcxMoney"
+                                                                             @if(2 == item.isCrossLogisticsFixedOrProportional){
+                                                                             value="${item.crossLogisticsMoney}"
+                                                                             @}
+                                                                             >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-danger">
+                                    <input name="checkbox" id="checkbox6" type="checkbox" value="6" ${1 == item.isCharter ? 'checked=checked' : ''} onclick="TCompanyInfoDlg.checkbox6()">
+                                    <label for="checkbox6">
+                                        包车
+                                    </label>
+                                </div>
+                            </fieldset>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">经营区域:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="province" onchange="TCompanyInfoDlg.provinceChange(this)">
+                                <option value="">选择省</option>
+                                @for(obj in provinceList){
+                                <option value="${obj.code}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="city" onchange="TCompanyInfoDlg.cityChage(this)">
+                                <option value="">选择市</option>
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="area">
+                                <option value="">选择区</option>
+                            </select>
+                        </div>
+                        <div class="col-sm-1">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TCompanyInfoDlg.addScope()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">添加区域</label>
+                        <div class="col-sm-9">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;">区域</th>
+                                        <th style="width: 200px;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="conn">
+                                    @for(obj in scopeList){
+                                    <tr class="timeClass">
+                                        <td><input type="hidden" id="recordId" name="recordId" value="${obj.id}">
+                                            <input type="hidden" id="provinceCode" name="provinceCode" value="${obj.provinceCode}">
+                                            <input type="hidden" id="cityCode" name="cityCode" value="${obj.cityCode}">
+                                            <input type="hidden" id="areaCode" name="areaCode" value="${obj.areaCode}">${obj.value}</td>
+                                        <td><button onclick="deleteSub(this)">移除</button></td>
+                                    </tr>
+                                    @}
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">是否需要摆渡车:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="isNeedFerry1" value="1" name="isNeedFerry" ${1 == item.isNeedFerry ? 'checked=checked' : ''} >
+                                <label for="isNeedFerry1"> 是 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="isNeedFerry2" value="2" name="isNeedFerry" ${2 == item.isNeedFerry ? 'checked=checked' : ''}>
+                                <label for="isNeedFerry2"> 否 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">限登录MAC地址:</label>
+                        <div class="col-sm-9">
+                            <input type="text" class="form-control" id="mac" name="mac" value="${item.mac}">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">登录账号:</label>
+                        <div class="col-sm-9">
+                            <input type="text" class="form-control" id="account" name="account" value="${user.account}">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">登录密码:</label>
+                        <div class="col-sm-9">
+                            <input type="password" class="form-control" id="password" name="password" >
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">确认密码:</label>
+                        <div class="col-sm-9">
+                            <input type="password" class="form-control" id="rePassword" name="rePassword" >
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCompanyInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCompanyInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCompany/tCompany_info.js"></script>
+<script type="application/javascript">
+    laydate.render({
+        elem: '#setupTime'
+    });
+    laydate.render({
+        elem: '#licenseTime'
+    });
+    laydate.render({
+        elem: '#licenseStartTime'
+    });
+    laydate.render({
+        elem: '#licenseEndTime'
+    });
+
+    $(function() {
+        TCompanyInfoDlg.checkbox1();
+        TCompanyInfoDlg.checkbox2();
+        TCompanyInfoDlg.checkbox3();
+        TCompanyInfoDlg.checkbox4();
+        TCompanyInfoDlg.checkbox5();
+        TCompanyInfoDlg.checkbox6();
+
+        var zc = $("input[name='zc']:checked").val();
+        var cz = $("input[name='cz']:checked").val();
+        var tcx = $("input[name='tcx']:checked").val();
+        var kcx = $("input[name='kcx']:checked").val();
+        if (zc == "" || zc == null || zc == undefined){
+            $("#zc1").attr("checked","checked")
+        }
+        if (cz == "" || cz == null || cz == undefined){
+            $("#cz1").attr("checked","checked")
+        }
+        if (tcx == "" || tcx == null || tcx == undefined){
+            $("#tcx1").attr("checked","checked")
+        }
+        if (kcx == "" || kcx == null || kcx == undefined){
+            $("#kcx1").attr("checked","checked")
+        }
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_updateFranchisee.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_updateFranchisee.html
new file mode 100644
index 0000000..fbadeed
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tCompany/tCompany_updateFranchisee.html
@@ -0,0 +1,278 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="franchiseeInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <input type="hidden" id="userId" name="userId" value="${user.id}">
+            <div class="row">
+                <div class="col-sm-10">
+                    @if(roleType == 1){
+                    <#select id="superiorId" name="所属分公司:" onchange="TOpenCityInfoDlg.provinceChange()">
+                        <option value="">选择所属分公司</option>
+                        @for(obj in companyList){
+                        <option value="${obj.id}" ${obj.id == item.superiorId ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </#select>
+                    @}else if(roleType == 2){
+                    <#label id="companyName" name="所属分公司" value="${company.name}"/>
+                    @}
+                    <#input id="name" name="加盟商名称" value="${item.name}"/>
+                    <#input id="detailAddress" name="加盟商地址" value="${item.detailAddress}"/>
+                    <#input id="principalName" name="联系人" value="${item.principalName}"/>
+                    <#input id="principalPhone" name="联系电话" value="${item.principalPhone}" />
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-10">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">经营业务:</label>
+                        <div class="col-sm-9">
+                            <fieldset>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox1" type="checkbox" value="1" ${1 == item.isSpe ? 'checked=checked' : ''} onclick="FranchiseeInfoDlg.checkbox1()">
+                                    <label for="checkbox1">
+                                        专车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="zcDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="zc" id="zc1" value="1" ${1 == item.isSpeFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="zc1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="zcPercent" name="zcPercent"
+                                                                           @if(1 == item.isSpeFixedOrProportional){
+                                                                           value="${item.speMoney}"
+                                                                           @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="zc" id="zc2" value="2" ${2 == item.isSpeFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="zc2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="zcMoney" name="zcMoney"
+                                                                             @if(2 == item.isSpeFixedOrProportional){
+                                                                             value="${item.speMoney}"
+                                                                             @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-primary">
+                                    <input name="checkbox" id="checkbox2" type="checkbox" value="2" ${1 == item.isTaxi ? 'checked=checked' : ''} onclick="FranchiseeInfoDlg.checkbox2()">
+                                    <label for="checkbox2">
+                                        出租车
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="czDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz1" value="1" ${1 == item.isTaxiFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="cz1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="czPercent" name="czPercent"
+                                                                           @if(1 == item.isTaxiFixedOrProportional){
+                                                                           value="${item.taxiMoney}"
+                                                                           @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="cz" id="cz2" value="2" ${2 == item.isTaxiFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="cz2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="czMoney" name="czMoney"
+                                                                             @if(2 == item.isTaxiFixedOrProportional){
+                                                                             value="${item.taxiMoney}"
+                                                                             @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-success">
+                                    <input name="checkbox" id="checkbox3" type="checkbox" value="3" ${1 == item.isCross ? 'checked=checked' : ''} onclick="FranchiseeInfoDlg.checkbox3()">
+                                    <label for="checkbox3">
+                                        跨城出行
+                                    </label>
+                                </div>
+                                <div class="checkbox checkbox-info">
+                                    <input name="checkbox" id="checkbox4" type="checkbox" value="4" ${1 == item.isSameLogistics ? 'checked=checked' : ''} onclick="FranchiseeInfoDlg.checkbox4()">
+                                    <label for="checkbox4">
+                                        同城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="tcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx1" value="1" ${1 == item.isSameLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="tcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="tcxPercent" name="tcxPercent"
+                                                                           @if(1 == item.isSameLogisticsFixedOrProportional){
+                                                                           value="${item.sameLogisticsMoney}"
+                                                                           @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="tcx" id="tcx2" value="2" ${2 == item.isSameLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="tcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="tcxMoney" name="tcxMoney"
+                                                                             @if(2 == item.isSameLogisticsFixedOrProportional){
+                                                                             value="${item.sameLogisticsMoney}"
+                                                                             @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-warning">
+                                    <input name="checkbox" id="checkbox5" type="checkbox" value="5" ${1 == item.isCrossLogistics ? 'checked=checked' : ''} onclick="FranchiseeInfoDlg.checkbox5()">
+                                    <label for="checkbox5">
+                                        跨城小件物流
+                                    </label>
+                                    <fieldset>
+                                        <div class="row" style="display: none;" id="kcxDiv">
+                                            <div class="col-sm-6">
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" id="kcx1" value="1" ${1 == item.isCrossLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="kcx1">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按比例抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="kcxPercent" name="kcxPercent"
+                                                                           @if(1 == item.isCrossLogisticsFixedOrProportional){
+                                                                           value="${item.crossLogisticsMoney}"
+                                                                           @}
+                                                            >
+                                                            <span>%</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                                <div class="checkbox checkbox-circle">
+                                                    <input type="radio" name="kcx" id="kcx2" value="2" ${2 == item.isCrossLogisticsFixedOrProportional ? 'checked=checked' : ''}>
+                                                    <label for="kcx2">
+                                                        <div style="position: relative;top: -8px;">
+                                                            <span>按固定金额抽成,每笔订单抽取</span>
+                                                            <input style="width: 50%;display: inline-block;" type="text" class="form-control" id="kcxMoney" name="kcxMoney"
+                                                                             @if(2 == item.isCrossLogisticsFixedOrProportional){
+                                                                             value="${item.crossLogisticsMoney}"
+                                                                             @}
+                                                            >
+                                                            <span>元</span>
+                                                        </div>
+                                                    </label>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                                <div class="checkbox checkbox-danger">
+                                    <input name="checkbox" id="checkbox6" type="checkbox" value="6" ${1 == item.isCharter ? 'checked=checked' : ''} onclick="FranchiseeInfoDlg.checkbox6()">
+                                    <label for="checkbox6">
+                                        包车
+                                    </label>
+                                </div>
+                            </fieldset>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">是否需要摆渡车:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="isNeedFerry1" value="1" name="isNeedFerry" ${1 == item.isNeedFerry ? 'checked=checked' : ''} >
+                                <label for="isNeedFerry1"> 是 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="isNeedFerry2" value="2" name="isNeedFerry" ${2 == item.isNeedFerry ? 'checked=checked' : ''}>
+                                <label for="isNeedFerry2"> 否 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">登录账号:</label>
+                        <div class="col-sm-9">
+                            <input type="text" class="form-control" id="account" name="account" value="${user.account}">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">登录密码:</label>
+                        <div class="col-sm-9">
+                            <input type="password" class="form-control" id="password" name="password" >
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">确认密码:</label>
+                        <div class="col-sm-9">
+                            <input type="password" class="form-control" id="rePassword" name="rePassword" >
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="FranchiseeInfoDlg.updateFranchisee()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="FranchiseeInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tCompany/franchisee_info.js"></script>
+<script type="application/javascript">
+    $(function() {
+        FranchiseeInfoDlg.checkbox1();
+        FranchiseeInfoDlg.checkbox2();
+        FranchiseeInfoDlg.checkbox3();
+        FranchiseeInfoDlg.checkbox4();
+        FranchiseeInfoDlg.checkbox5();
+        FranchiseeInfoDlg.checkbox6();
+
+        var zc = $("input[name='zc']:checked").val();
+        var cz = $("input[name='cz']:checked").val();
+        var tcx = $("input[name='tcx']:checked").val();
+        var kcx = $("input[name='kcx']:checked").val();
+        if (zc == "" || zc == null || zc == undefined){
+            $("#zc1").attr("checked","checked")
+        }
+        if (cz == "" || cz == null || cz == undefined){
+            $("#cz1").attr("checked","checked")
+        }
+        if (tcx == "" || tcx == null || tcx == undefined){
+            $("#tcx1").attr("checked","checked")
+        }
+        if (kcx == "" || kcx == null || kcx == undefined){
+            $("#kcx1").attr("checked","checked")
+        }
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/lookDetail.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/lookDetail.html
new file mode 100644
index 0000000..e9a69a5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/lookDetail.html
@@ -0,0 +1,29 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="ibox-content">
+                        <div class="alert alert-success">
+                            ${str}
+                        </div>
+                        <!--<div class="alert alert-info">
+                            ${str}
+                        </div>
+                        <div class="alert alert-warning">
+                            ${str}
+                        </div>
+                        <div class="alert alert-danger">
+                            ${str}
+                        </div>-->
+                    </div>
+                </div>
+            </div>
+
+        </div>
+
+    </div>
+</div>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint.html
new file mode 100644
index 0000000..2eebeb2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint.html
@@ -0,0 +1,58 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>投诉列表管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="投诉时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="投诉人昵称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userPhone" name="投诉人电话" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="driverPhone" name="投诉司机电话" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="isHandle" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="2">未处理</option>
+                                    <option value="1">已处理</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TComplaint.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TComplaint.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TComplaintTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tComplaint/immediately")){
+                                <#button name="立即处理" icon="fa-edit" clickFun="TComplaint.immediately()"/>
+                            @}
+                            @if(shiro.hasPermission("/tComplaint/delete")){
+                                <#button name="删除记录" icon="fa-remove" clickFun="TComplaint.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TComplaintTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tComplaint/tComplaint.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_add.html
new file mode 100644
index 0000000..2b53ab9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_add.html
@@ -0,0 +1,34 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键" underline="true"/>
+                            <#input id="userId" name="用户Id" underline="true"/>
+                            <#input id="reason" name="投诉原因" underline="true"/>
+                            <#input id="driverId" name="被投诉人Id" underline="true"/>
+                            <#input id="description" name="描述"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="isHandle" name="是否处理(0:未处理,1:已处理)" underline="true"/>
+                            <#input id="insertTime" name="投诉时间" underline="true"/>
+                            <#input id="handleResult" name="处理结果" underline="true"/>
+                            <#input id="handleUserId" name="处理人id" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TComplaintInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TComplaintInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tComplaint/tComplaint_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_edit.html
new file mode 100644
index 0000000..2affa4e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_edit.html
@@ -0,0 +1,34 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键" value="${item.id}" underline="true"/>
+                            <#input id="userId" name="用户Id" value="${item.userId}" underline="true"/>
+                            <#input id="reason" name="投诉原因" value="${item.reason}" underline="true"/>
+                            <#input id="driverId" name="被投诉人Id" value="${item.driverId}" underline="true"/>
+                            <#input id="description" name="描述" value="${item.description}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="isHandle" name="是否处理(0:未处理,1:已处理)" value="${item.isHandle}" underline="true"/>
+                            <#input id="insertTime" name="投诉时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="handleResult" name="处理结果" value="${item.handleResult}" underline="true"/>
+                            <#input id="handleUserId" name="处理人id" value="${item.handleUserId}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TComplaintInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TComplaintInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tComplaint/tComplaint_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_immediately.html
new file mode 100644
index 0000000..906ce24
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tComplaint/tComplaint_immediately.html
@@ -0,0 +1,28 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="complaintFormInfo">
+            <input type="hidden" id="id" name="id" value="${tComplaintId}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">填写备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="handleResult" id="handleResult" placeholder="多行输入,最多500字" style="width:100%;height:150px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TComplaintInfoDlg.immediately()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TComplaintInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tComplaint/tComplaint_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch.html
new file mode 100644
index 0000000..ce876ec
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch.html
@@ -0,0 +1,70 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>调度管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="调度名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="companyName" name="所属分公司" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="franchiseeName" name="所属加盟商" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="account" name="账号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">冻结</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TDispatch.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TDispatch.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TDispatchTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tDispatch/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TDispatch.openAddTDispatch()"/>
+                            @}
+                            @if(shiro.hasPermission("/tDispatch/update")){
+                                <#button name="编辑" icon="fa-edit" clickFun="TDispatch.openTDispatchDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDispatch/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TDispatch.opt(1)" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDispatch/freeze")){
+                                <#button name="冻结" icon="fa-remove" clickFun="TDispatch.opt(2)" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDispatch/thaw")){
+                                <#button name="解冻" icon="fa-remove" clickFun="TDispatch.opt(3)" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TDispatchTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDispatch/tDispatch.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch_add.html
new file mode 100644
index 0000000..47924fa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch_add.html
@@ -0,0 +1,47 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="dispatchInfoForm">
+            <input type="hidden" id="roleType" name="roleType" value="${roleType}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="调度名称"/>
+
+                    @if(roleType == 1){
+                    <#select id="oneId" name="所属分公司:" onchange="TDispatchInfoDlg.companyChange(this)">
+                        <option value="">选择所属分公司</option>
+                        @for(obj in companyList){
+                        <option value="${obj.id}">${obj.name}</option>
+                        @}
+                    </#select>
+                    <#select id="twoId" name="所属加盟商:" >
+                        <option value="">选择所属加盟商</option>
+                    </#select>
+                    @}
+                    @if(roleType == 2){
+                    <#select id="franchiseeId" name="所属加盟商:" >
+                        <option value="">选择所属加盟商</option>
+                        @for(obj in franchiseeList){
+                        <option value="${obj.id}">${obj.name}</option>
+                        @}
+                    </#select>
+                    @}
+                    <#input id="phone" name="联系电话"/>
+                    <#input id="account" name="登录账号"/>
+                    <#input id="password" name="登录密码" type="password"/>
+                    <#input id="rePassword" name="确认密码" type="password"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TDispatchInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TDispatchInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDispatch/tDispatch_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch_edit.html
new file mode 100644
index 0000000..1a36c30
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDispatch/tDispatch_edit.html
@@ -0,0 +1,51 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="dispatchInfoForm">
+            <input type="hidden" id="roleType" name="roleType" value="${roleType}">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="调度名称" value="${item.name}"/>
+
+                    @if(roleType == 1){
+                        <#select id="oneId" name="所属分公司:" onchange="TDispatchInfoDlg.companyChange(this)">
+                        <option value="">选择所属分公司</option>
+                        @for(obj in companyList){
+                        <option value="${obj.id}" ${obj.id == item.companyId ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                        </#select>
+                        <#select id="twoId" name="所属加盟商:" >
+                            <option value="">选择所属加盟商</option>
+                            @for(obj in franchiseeList){
+                            <option value="${obj.id}" ${obj.id == item.franchiseeId ? 'selected=selected' : ''}>${obj.name}</option>
+                            @}
+                        </#select>
+                    @}
+                    @if(roleType == 2){
+                        <#select id="franchiseeId" name="所属加盟商:" >
+                            <option value="">选择所属加盟商</option>
+                            @for(obj in franchiseeList){
+                            <option value="${obj.id}" ${obj.id == item.franchiseeId ? 'selected=selected' : ''}>${obj.name}</option>
+                            @}
+                        </#select>
+                    @}
+                    <#input id="phone" name="联系电话" value="${item.phone}" />
+                    <#input id="account" name="登录账号" value="${item.account}"/>
+                    <#input id="password" name="登录密码" value="" type="password"/>
+                    <#input id="rePassword" name="确认密码" value="" type="password"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TDispatchInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TDispatchInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDispatch/tDispatch_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/punish.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/punish.html
new file mode 100644
index 0000000..dcc440b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/punish.html
@@ -0,0 +1,62 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <input type="hidden" id="netCarDriverId" value="${id}">
+    <input type="hidden" id="id">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="hr-line-dashed"></div>
+            <div class="form-group">
+                <label class="col-sm-2 control-label">课程日期</label>
+                <div class="col-sm-9">
+                    <input type="text" class="layui-input form-control" id="punishTime">
+                </div>
+            </div>
+            <div class="hr-line-dashed"></div>
+            <div class="form-group">
+                <label class="col-sm-2 control-label">处罚原因</label>
+                <div class="col-sm-8">
+                    <textarea type="text" class="form-control" id="punishReason"></textarea>
+                </div>
+            </div>
+            <div class="hr-line-dashed"></div>
+            <div class="form-group">
+                <label class="col-sm-2 control-label">处罚结果</label>
+                <div class="col-sm-8">
+                    <textarea type="text" class="form-control" id="punishReault"></textarea>
+                </div>
+                <button type="button" class="btn btn-default btn-sm" id="add" onclick="add()">添加</button>
+            </div>
+            <div class="hr-line-dashed"></div>
+            <div class="form-group">
+                <label class="col-sm-2 control-label">已添加的培训记录</label>
+                <div class="col-sm-9">
+                    <div style="height: 150px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                        <table class="table table-striped table-bordered table-hover table-condensed">
+                            <thead>
+                            <tr>
+                                <th style="width: 50px; text-align: center;">序号</th>
+                                <th style="width: 200px; text-align: center;">处罚时间</th>
+                                <th style="width: 200px; text-align: center;">处罚原因</th>
+                                <th style="width: 200px; text-align: center;">处罚结果</th>
+                                <th style="width: 200px; text-align: center;">操作</th>
+                            </tr>
+                            </thead>
+                            <tbody id="transAreaAdd">
+
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+            <div class="form-group">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="save()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="Training.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriver/punish.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver.html
new file mode 100644
index 0000000..cedbd84
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver.html
@@ -0,0 +1,70 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>司机审核列表管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="注册时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="companyName" name="所属分公司/加盟商" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="account" name="账号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="addType" name="司机来源" >
+                                    <option value="">全部</option>
+                                    <option value="1">司机注册</option>
+                                    <option value="2">平台添加</option>
+                                    <option value="3">分公司添加</option>
+                                    <option value="4">加盟商添加</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="authState" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待审核</option>
+                                    <option value="4">已拒绝</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TDriver.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TDriver.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TDriverTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tDriver/immediately")){
+                                <#button name="立即审核" icon="fa-plus" clickFun="TDriver.immediately()"/>
+                            @}
+                            @if(shiro.hasPermission("/tDriver/look")){
+                                <#button name="查看详情" icon="fa-edit" clickFun="TDriver.look()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDriver/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TDriver.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TDriverTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriver/tDriver.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_add.html
new file mode 100644
index 0000000..84b7d6f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_add.html
@@ -0,0 +1,257 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="yesDriverInfoForm">
+            <input type="hidden" id="roleType" name="roleType" value="${roleType}">
+            <div class="row">
+                <div class="col-sm-10">
+                    <#input id="name" name="司机姓名" />
+
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">所属机构:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            @if(roleType == 1){
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="companyType1" value="1" name="companyType" checked="" onclick="YesDriverInfoDlg.companyTypeClick(1)">
+                                <label for="companyType1"> 平台司机 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="companyTyp2" value="2" name="companyType" onclick="YesDriverInfoDlg.companyTypeClick(2)">
+                                <label for="companyTyp2"> 加盟司机 </label>
+                            </div>
+                            <select class="form-control companyDiv" id="oneId" onchange="YesDriverInfoDlg.oneChange(this)" style="width: 200px;display: none;" >
+                                <option value="">选择所属分公司</option>
+                                @for(obj in companyList!){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                            <select class="form-control companyDiv" id="twoId"  style="width: 200px;margin-left: 30px;display: none;">
+                                <option value="">选择所属加盟商</option>
+                            </select>
+                            @}else if(roleType == 2){
+                            <span class="control-label">${objectName!}</span>
+                            <select class="form-control" id="franchiseeId"  style="width: 200px;margin-left: 30px;">
+                                <option value="">选择所属加盟商</option>
+                                @for(obj in franchiseeList!){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                            @}else if(roleType == 3){
+                            <span class="control-label">${objectName!}</span>
+                            @}
+                        </div>
+                    </div>
+
+                    <#avatar id="headImgUrl" name="头像:" />
+                    <#avatar id="faceImgUrl" name="人脸识别照片:" />
+                    <!--<#input id="phone" name="手机号" />-->
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">性别:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="sex1" value="1" name="sex" checked="" >
+                                <label for="sex1"> 男 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="sex2" value="2" name="sex" >
+                                <label for="sex2"> 女 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <#input id="driveCard" name="驾驶证号码"/>
+                    <#avatar id="driveCardImgUrl" name="驾驶证照片:" />
+                    <#input id="driverAge" name="驾龄" />
+                    <#input id="idCard" name="身份证号" />
+                    <#input id="driverAddress" name="居住地址" />
+                    <#input id="taxiAptitudeCard" name="出租车资格证号" />
+                    <#avatar id="networkCarlssueImg" name="网约车资格证照片:" />
+                    <#input id="jobNumber" name="工号(选填)" />
+                    <div class="form-group">
+                        <fieldset>
+                            <label class="col-sm-3 control-label">经营业务:</label>
+                            <div class="col-sm-9">
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox1" value="1">
+                                    <label for="serverBox1"> 专车 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox2" value="2">
+                                    <label for="serverBox2"> 出租车 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox3" value="3" onclick="YesDriverInfoDlg.checkBox()" >
+                                    <label for="serverBox3"> 跨城出行 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox4" value="4">
+                                    <label for="serverBox4"> 小件物流-同城 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox5" value="5">
+                                    <label for="serverBox5"> 小件物流-跨城 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox6" value="6">
+                                    <label for="serverBox6"> 包车 </label>
+                                </div>
+                            </div>
+                        </fieldset>
+                    </div>
+                <div id="lineDiv" style="display: none;">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">关联线路:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="selectLineId">
+                                <option value="">选择关联线路</option>
+                                @for(obj in lineList){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="YesDriverInfoDlg.addLine()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">已添加线路</label>
+                        <div class="col-sm-9">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;text-align: center;">关联时间</th>
+                                        <th style="width: 300px;text-align: center;">线路名称</th>
+                                        <th style="width: 100px;text-align: center;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="line">
+
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+
+                    <#input id="phone" name="登录账号【手机号】" />
+                    <#input id="password" name="密码" type="password"/>
+                    <#input id="rePassword" name="确认密码" type="password"/>
+
+                    <#input id="driverNationality" name="国籍"/>
+                    <#input id="driverNation" name="民族"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">婚姻状况:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="driverMaritalStatus">
+                                <option value="1">已婚</option>
+                                <option value="2">未婚</option>
+                                <option value="3">离异</option>
+                            </select>
+                        </div>
+                    </div>
+                    <#input id="driverLanguageLevel" name="外语能力"/>
+                    <#input id="driverEducation" name="学历"/>
+                    <#input id="driverCensus" name="户口登记机关名称"/>
+                    <#input id="driverAddress" name="户口地址"/>
+                    <#input id="driverContactAddress" name="通信地址"/>
+                    <#input id="getDriverLicenseDate" name="初次领取驾驶证日期"/>
+                    <#input id="driverLicenseOn" name="驾驶证有效期限起"/>
+                    <#input id="driverLicenseOff" name="驾驶证有效期限止"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">是否巡游出租车驾驶员:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="taxiDriver">
+                                <option value="0">否</option>
+                                <option value="1">是</option>
+                            </select>
+                        </div>
+                    </div>
+                    <#input id="networkCarlssueOrganization" name="网络预约出租车驾驶员证发证机构"/>
+                    <#input id="networkCarlssueDate" name="资格证发证日期"/>
+                    <#input id="getNetworkCarProofDate" name="初次认领资格证日期"/>
+                    <#input id="networkCarProofOn" name="资格证有效起始日期"/>
+                    <#input id="networkCarProofOff" name="资格证有效截至日期"/>
+                    <#input id="registerDate" name="报备日期"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">是否是专职驾驶员:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="fullTimeDriver">
+                                <option value="0">否</option>
+                                <option value="1">是</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">是否在驾驶员黑名单内:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="inDriverBlacklist">
+                                <option value="0">否</option>
+                                <option value="1">是</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">服务类型:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="commercialType">
+                                <option value="1">网络预约出租汽车</option>
+                                <option value="2">巡游出租汽车</option>
+                                <option value="3">私人小客车合乘</option>
+                            </select>
+                        </div>
+                    </div>
+                    <#input id="contractCompany" name="驾驶员合同签署公司"/>
+                    <#input id="contractOn" name="合同有效期起"/>
+                    <#input id="contractOff" name="合同有效期止"/>
+                    <#input id="emergencyContact" name="紧急联系人"/>
+                    <#input id="emergencyContactPhone" name="紧急联系电话"/>
+                    <#input id="emergencyContactAddress" name="紧急联系地址"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="YesDriverInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="YesDriverInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriver/yesDriver_info.js"></script>
+
+<script>
+    laydate.render({
+        elem: '#getDriverLicenseDate'
+    });
+    laydate.render({
+        elem: '#driverLicenseOn'
+    });
+    laydate.render({
+        elem: '#driverLicenseOff'
+    });
+    laydate.render({
+        elem: '#networkCarlssueDate'
+    });
+    laydate.render({
+        elem: '#getNetworkCarProofDate'
+    });
+    laydate.render({
+        elem: '#networkCarProofOn'
+    });
+    laydate.render({
+        elem: '#networkCarProofOff'
+    });
+    laydate.render({
+        elem: '#contractOn'
+    });
+    laydate.render({
+        elem: '#contractOff'
+    });
+    laydate.render({
+        elem: '#registerDate'
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_changeCar.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_changeCar.html
new file mode 100644
index 0000000..e831775
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_changeCar.html
@@ -0,0 +1,46 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-content">
+                <input type="hidden" id="tDriverId" name="tDriverId" value="${tDriverId}">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="carLicensePlate" name="车牌号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="brandName" name="车辆品牌" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="modelName" name="车辆类型" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="color" name="车辆颜色" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="serverStr" name="服务模式" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SelectCar.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="SelectCar.resetSearch()" space="true"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="SelectCar.selectCarOpt()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SelectCar.close()" space="true"/>
+                            </div>
+                        </div>
+                        <#table id="SelectCarTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriver/yesDriver_selectCar.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_edit.html
new file mode 100644
index 0000000..fff2374
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_edit.html
@@ -0,0 +1,283 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="yesDriverInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <input type="hidden" id="roleType" name="roleType" value="${roleType}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="司机姓名" value="${item.name}"/>
+
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">所属机构:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            @if(roleType == 1){
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="companyType1" value="1" name="companyType" ${1 == companyType ? 'checked=checked' : ''} onclick="YesDriverInfoDlg.companyTypeClick(1)">
+                                <label for="companyType1"> 平台司机 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="companyTyp2" value="2" name="companyType" ${2 == companyType ? 'checked=checked' : ''} onclick="YesDriverInfoDlg.companyTypeClick(2)">
+                                <label for="companyTyp2"> 加盟司机 </label>
+                            </div>
+                            <select class="form-control companyDiv" id="oneId" onchange="YesDriverInfoDlg.oneChange(this)" style="width: 200px">
+                                <option value="">选择所属分公司</option>
+                                @for(obj in companyList!){
+                                <option value="${obj.id}" ${obj.id == item.companyId ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                            <select class="form-control companyDiv" id="twoId"  style="width: 200px;margin-left: 30px;">
+                                <option value="">选择所属加盟商</option>
+                                @for(obj in franchiseeList!){
+                                <option value="${obj.id}" ${obj.id == item.franchiseeId ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                            @}else if(roleType == 2){
+                            <span class="control-label">${objectName!}</span>
+                            <select class="form-control" id="franchiseeId"  style="width: 200px;margin-left: 30px;">
+                                <option value="">选择所属加盟商</option>
+                                @for(obj in franchiseeList!){
+                                <option value="${obj.id}" ${obj.id == item.franchiseeId ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                            @}else if(roleType == 3){
+                            <span class="control-label">${objectName!}</span>
+                            @}
+                        </div>
+                    </div>
+
+                    <#avatar id="headImgUrl" name="头像:" avatarImg="${item.headImgUrl}"/>
+                    <#avatar id="faceImgUrl" name="人脸识别照片:" avatarImg="${item.faceImgUrl}"/>
+                    <!--<#input id="phone" name="手机号" value="${item.phone}"/>-->
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">性别:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="sex1" value="1" name="sex" ${1 == item.sex ? 'checked=checked' : ''}  >
+                                <label for="sex1"> 男 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="sex2" value="2" name="sex" ${2 == item.sex ? 'checked=checked' : ''} >
+                                <label for="sex2"> 女 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <#input id="driveCard" name="驾驶证号码" value="${item.driveCard}"/>
+                    <#avatar id="driveCardImgUrl" name="驾驶证照片:" avatarImg="${item.driveCardImgUrl}"/>
+                    <#input id="driverAge" name="驾龄"  value="${item.driverAge}"/>
+                    <#input id="idCard" name="身份证号" value="${item.idCard}"/>
+                    <#input id="driverAddress" name="居住地址" value="${item.driverAddress}"/>
+                    <#input id="taxiAptitudeCard" name="出租车资格证号" value="${item.taxiAptitudeCard}"/>
+                    <#input id="jobNumber" name="工号(选填)" value="${item.jobNumber}"/>
+                    <div class="form-group">
+                        <fieldset>
+                            <label class="col-sm-3 control-label">经营业务:</label>
+                            <div class="col-sm-9">
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox1" value="1" ${2 == one ? 'checked=checked' : ''}>
+                                    <label for="serverBox1"> 专车 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox2" value="2" ${2 == two ? 'checked=checked' : ''}>
+                                    <label for="serverBox2"> 出租车 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox3" value="3" ${2 == three ? 'checked=checked' : ''} onclick="YesDriverInfoDlg.checkBox()" >
+                                    <label for="serverBox3"> 跨城出行 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox4" value="4" ${2 == four ? 'checked=checked' : ''}>
+                                    <label for="serverBox4"> 小件物流-同城 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox5" value="5" ${2 == five ? 'checked=checked' : ''}>
+                                    <label for="serverBox5"> 小件物流-跨城 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox6" value="6" ${2 == six ? 'checked=checked' : ''}>
+                                    <label for="serverBox6"> 包车 </label>
+                                </div>
+                            </div>
+                        </fieldset>
+                    </div>
+
+                    <div id="lineDiv" style="display: none;">
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">关联线路:</label>
+                            <div class="col-sm-3">
+                                <select class="form-control" id="selectLineId">
+                                    <option value="">选择关联线路</option>
+                                    @for(obj in lineList){
+                                    <option value="${obj.id}">${obj.name}</option>
+                                    @}
+                                </select>
+                            </div>
+                            <div class="col-sm-2">
+                                <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="YesDriverInfoDlg.addLine()"/>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">已添加线路</label>
+                            <div class="col-sm-9">
+                                <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                    <table class="table table-striped table-bordered table-hover table-condensed">
+                                        <thead>
+                                        <tr>
+                                            <th style="width: 300px;">关联时间</th>
+                                            <th style="width: 300px;">项目名称</th>
+                                            <th style="width: 100px;">操作</th>
+                                        </tr>
+                                        </thead>
+                                        <tbody id="line">
+                                        @for(line in driverLineList!){
+                                        <tr class="lineClass">
+                                            <td><input type="hidden" id="lineId" name="lineId" value="${line.lineId}">
+                                                <input type="hidden" id="time" name="time" value="${line.addTime}">${line.addTime}</td>
+                                            <td>${line.lineName}</td>
+                                            <td><button onclick="deleteSub(this)">移除</button></td>
+                                        </tr>
+                                        @}
+                                        </tbody>
+                                    </table>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    <#input id="phone" name="登录账号【手机号】" value="${item.phone}"/>
+                    <#input id="password" name="密码" type="password" />
+                    <#input id="rePassword" name="确认密码" type="password"  />
+
+                    <#input id="driverNationality" name="国籍" value="${item.driverNationality}"/>
+                    <#input id="driverNation" name="民族" value="${item.driverNation}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">婚姻状况:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="driverMaritalStatus">
+                                <option value="1" ${item.driverMaritalStatus == 1 ? 'selected' : ''}>已婚</option>
+                                <option value="2" ${item.driverMaritalStatus == 2 ? 'selected' : ''}>未婚</option>
+                                <option value="3" ${item.driverMaritalStatus == 3 ? 'selected' : ''}>离异</option>
+                            </select>
+                        </div>
+                    </div>
+                    <#input id="driverLanguageLevel" name="外语能力" value="${item.driverLanguageLevel}"/>
+                    <#input id="driverEducation" name="学历" value="${item.driverEducation}"/>
+                    <#input id="driverCensus" name="户口登记机关名称" value="${item.driverCensus}"/>
+                    <#input id="driverAddress" name="户口地址" value="${item.driverAddress}"/>
+                    <#input id="driverContactAddress" name="通信地址" value="${item.driverContactAddress}"/>
+                    <#input id="getDriverLicenseDate" name="初次领取驾驶证日期" value="${item.getDriverLicenseDate}"/>
+                    <#input id="driverLicenseOn" name="驾驶证有效期限起" value="${item.driverLicenseOn}"/>
+                    <#input id="driverLicenseOff" name="驾驶证有效期限止" value="${item.driverLicenseOff}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">是否巡游出租车驾驶员:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="taxiDriver">
+                                <option value="0" ${item.taxiDriver == 0 ? 'selected' : ''}>否</option>
+                                <option value="1" ${item.taxiDriver == 1 ? 'selected' : ''}>是</option>
+                            </select>
+                        </div>
+                    </div>
+                    <#input id="networkCarlssueOrganization" name="网络预约出租车驾驶员证发证机构" value="${item.networkCarlssueOrganization}"/>
+                    <#input id="networkCarlssueDate" name="资格证发证日期" value="${item.networkCarlssueDate}"/>
+                    <#input id="getNetworkCarProofDate" name="初次认领资格证日期" value="${item.getNetworkCarProofDate}"/>
+                    <#input id="networkCarProofOn" name="资格证有效起始日期" value="${item.networkCarProofOn}"/>
+                    <#input id="networkCarProofOff" name="资格证有效截至日期" value="${item.networkCarProofOff}"/>
+                    <#input id="registerDate" name="报备日期" value="${item.registerDate}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">是否是专职驾驶员:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="fullTimeDriver">
+                                <option value="0" ${item.fullTimeDriver == 0 ? 'selected' : ''}>否</option>
+                                <option value="1" ${item.fullTimeDriver == 1 ? 'selected' : ''}>是</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">是否在驾驶员黑名单内:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="inDriverBlacklist">
+                                <option value="0" ${item.inDriverBlacklist == 0 ? 'selected' : ''}>否</option>
+                                <option value="1" ${item.inDriverBlacklist == 1 ? 'selected' : ''}>是</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">服务类型:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="commercialType">
+                                <option value="1" ${item.commercialType == 1 ? 'selected' : ''}>网络预约出租汽车</option>
+                                <option value="2" ${item.commercialType == 2 ? 'selected' : ''}>巡游出租汽车</option>
+                                <option value="3" ${item.commercialType == 3 ? 'selected' : ''}>私人小客车合乘</option>
+                            </select>
+                        </div>
+                    </div>
+                    <#input id="contractCompany" name="驾驶员合同签署公司" value="${item.contractCompany}"/>
+                    <#input id="contractOn" name="合同有效期起" value="${item.contractOn}"/>
+                    <#input id="contractOff" name="合同有效期止" value="${item.contractOff}"/>
+                    <#input id="emergencyContact" name="紧急联系人" value="${item.emergencyContact}"/>
+                    <#input id="emergencyContactPhone" name="紧急联系电话" value="${item.emergencyContactPhone}"/>
+                    <#input id="emergencyContactAddress" name="紧急联系地址" value="${item.emergencyContactAddress}"/>
+
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="YesDriverInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="YesDriverInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriver/yesDriver_info.js"></script>
+<script type="application/javascript">
+    laydate.render({
+        elem: '#getDriverLicenseDate'
+    });
+    laydate.render({
+        elem: '#driverLicenseOn'
+    });
+    laydate.render({
+        elem: '#driverLicenseOff'
+    });
+    laydate.render({
+        elem: '#networkCarlssueDate'
+    });
+    laydate.render({
+        elem: '#getNetworkCarProofDate'
+    });
+    laydate.render({
+        elem: '#networkCarProofOn'
+    });
+    laydate.render({
+        elem: '#networkCarProofOff'
+    });
+    laydate.render({
+        elem: '#contractOn'
+    });
+    laydate.render({
+        elem: '#contractOff'
+    });
+    laydate.render({
+        elem: '#registerDate'
+    });
+
+    $(function() {
+        var serverBox3 = $('#serverBox3').prop('checked');
+        if (serverBox3){
+            $("#lineDiv").show();
+        } else {
+            $("#lineDiv").hide();
+        }
+        var companyType = $("input[name='companyType']:checked").val();
+        if (1 == companyType){
+            $(".companyDiv").hide();
+        } else if (2 == companyType){
+            $(".companyDiv").show();
+        }
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_immediately.html
new file mode 100644
index 0000000..df85e92
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_immediately.html
@@ -0,0 +1,87 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#label id="name" name="姓名" value="${item.name}"/>
+                    <#label id="phone" name="手机号" value="${item.phone}"/>
+                    <#label id="sexStr" name="性别" value="${item.sexStr}"/>
+                    <#label id="addTypeStr" name="司机来源" value="${item.addTypeStr}"/>
+                    <#label id="driveCard" name="驾驶证号码" value="${item.driveCard}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">驾驶证照片:</label>
+                        <div class="col-sm-9">
+                            <div class="form-group">
+                                <div class="col-sm-6">
+                                    <div id="driveCardImgUrlPreId">
+                                        <div>
+                                            @if(isEmpty(item.driveCardImgUrl)){
+                                            <img onclick="lookBigImg('${ctxPath}/static/img/NoPIC.png')" src="${ctxPath}/static/img/NoPIC.png" style="max-width:150px;">
+                                            @}else{
+                                            <img onclick="lookBigImg('${item.driveCardImgUrl}')" src="${item.driveCardImgUrl}" style="max-width:250px;">
+                                            @}
+                                        </div>
+                                    </div>
+                                </div>
+                                <input type="hidden" id="driveCardImgUrl" name="driveCardImgUrl" value="${item.driveCardImgUrl}"/>
+                            </div>
+                        </div>
+                    </div>
+                    <#label id="idCard" name="身份证号码" value="${item.idCard}"/>
+                    <#label id="driverAddress" name="居住地址" value="${item.driverAddress}"/>
+                    <#label id="taxiAptitudeCard" name="出租车资格证号" value="${item.taxiAptitudeCard}"/>
+                    <#label id="serverStr" name="服务模式" value="${item.serverStr}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">审核结果:</label>
+                        <div class="col-sm-9">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="authState1" value="1" name="authState" checked="" >
+                                <label for="authState1"> 审核通过 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="authState4" value="4" name="authState" >
+                                <label for="authState4"> 审核不通过 </label>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">头像:</label>
+                        <div class="col-sm-9">
+                            <div class="form-group">
+                                <div class="col-sm-6">
+                                    <div id="headImgUrlPreId">
+                                        <div>
+                                            @if(isEmpty(item.headImgUrl)){
+                                            <img onclick="lookBigImg('${ctxPath}/static/img/NoPIC.png')" src="${ctxPath}/static/img/NoPIC.png" style="max-width:150px;">
+                                            @}else{
+                                            <img onclick="lookBigImg('${item.headImgUrl}')" src="${item.headImgUrl}" style="max-width:250px;">
+                                            @}
+                                        </div>
+                                    </div>
+                                </div>
+                                <input type="hidden" id="headImgUrl" name="headImgUrl" value="${item.headImgUrl}"/>
+                            </div>
+                        </div>
+                    </div>
+                    <#label id="companyName" name="所属机构" value="${item.companyName}"/>
+                    <#label id="driverAge" name="驾龄" value="${item.driverAge}"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="TDriverInfoDlg.authOpt()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TDriverInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriver/tDriver_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_look.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_look.html
new file mode 100644
index 0000000..e05878b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_look.html
@@ -0,0 +1,70 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#label id="name" name="姓名" value="${item.name}"/>
+                    <#label id="phone" name="手机号" value="${item.phone}"/>
+                    <#label id="sexStr" name="性别" value="${item.sexStr}"/>
+                    <#label id="addTypeStr" name="司机来源" value="${item.addTypeStr}"/>
+                    <#label id="driveCard" name="驾驶证号码" value="${item.driveCard}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">驾驶证照片:</label>
+                        <div class="col-sm-9">
+                            <div class="form-group">
+                                <div class="col-sm-6">
+                                    <div id="driveCardImgUrlPreId">
+                                        <div>
+                                            @if(isEmpty(item.driveCardImgUrl)){
+                                            <img onclick="lookBigImg('${ctxPath}/static/img/NoPIC.png')" src="${ctxPath}/static/img/NoPIC.png" style="max-width:150px;">
+                                            @}else{
+                                            <img onclick="lookBigImg('${item.driveCardImgUrl}')" src="${item.driveCardImgUrl}" style="max-width:250px;">
+                                            @}
+                                        </div>
+                                    </div>
+                                </div>
+                                <input type="hidden" id="driveCardImgUrl" name="driveCardImgUrl" value="${item.driveCardImgUrl}"/>
+                            </div>
+                        </div>
+                    </div>
+                    <#label id="idCard" name="身份证号码" value="${item.idCard}"/>
+                    <#label id="driverAddress" name="居住地址" value="${item.driverAddress}"/>
+                    <#label id="taxiAptitudeCard" name="出租车资格证号" value="${item.taxiAptitudeCard}"/>
+                    <#label id="serverStr" name="服务模式" value="${item.serverStr}"/>
+                    <#label id="authStateStr" name="审核结果" value="${item.authStateStr}"/>
+                </div>
+
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">头像:</label>
+                        <div class="col-sm-9">
+                            <div class="form-group">
+                                <div class="col-sm-6">
+                                    <div id="headImgUrlPreId">
+                                        <div>
+                                            @if(isEmpty(item.headImgUrl)){
+                                            <img onclick="lookBigImg('${ctxPath}/static/img/NoPIC.png')" src="${ctxPath}/static/img/NoPIC.png" style="max-width:150px;">
+                                            @}else{
+                                            <img onclick="lookBigImg('${item.headImgUrl}')" src="${item.headImgUrl}" style="max-width:250px;">
+                                            @}
+                                        </div>
+                                    </div>
+                                </div>
+                                <input type="hidden" id="headImgUrl" name="headImgUrl" value="${item.headImgUrl}"/>
+                            </div>
+                        </div>
+                    </div>
+                    <#label id="companyName" name="所属机构" value="${item.companyName}"/>
+                    <#label id="driverAge" name="驾龄" value="${item.driverAge}"/>
+                </div>
+            </div>
+
+
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriver/tDriver_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_optDriver.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_optDriver.html
new file mode 100644
index 0000000..415a59f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/tDriver_optDriver.html
@@ -0,0 +1,29 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="yesDriverInfoForm">
+            <input type="hidden" id="tDriverId" name="tDriverId" value="${tDriverId}">
+            <input type="hidden" id="optType" name="optType" value="${optType}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">操作备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t" style="text-align: center;">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="YesDriverInfoDlg.optDriver()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="YesDriverInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriver/yesDriver_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/training.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/training.html
new file mode 100644
index 0000000..30739cc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/training.html
@@ -0,0 +1,75 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <input type="hidden" id="netCarDriverId" value="${id}">
+    <input type="hidden" id="id">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="form-group">
+                <label class="col-sm-2 control-label">课程名称</label>
+                <div class="col-sm-9">
+                    <input type="text" class="layui-input form-control" id="courseName">
+                </div>
+            </div>
+            <div class="hr-line-dashed"></div>
+            <div class="form-group">
+                <label class="col-sm-2 control-label">课程日期</label>
+                <div class="col-sm-9">
+                    <input type="text" class="layui-input form-control" id="courseTime">
+                </div>
+            </div>
+            <div class="hr-line-dashed"></div>
+            <div class="form-group">
+                <label class="col-sm-2 control-label">课程时间</label>
+                <div class="col-sm-4">
+                    <input type="text" class="layui-input form-control" id="startTime">
+                </div>
+                <div class="col-sm-1">
+                    ~
+                </div>
+                <div class="col-sm-4">
+                    <input type="text" class="layui-input form-control" id="endTime">
+                </div>
+            </div>
+            <div class="hr-line-dashed"></div>
+            <div class="form-group">
+                <label class="col-sm-2 control-label">时长</label>
+                <div class="col-sm-8">
+                    <input type="number" class="layui-input form-control" id="duration" min="0">
+                </div>
+                <button type="button" class="btn btn-default btn-sm" id="add" onclick="add()">添加</button>
+            </div>
+            <div class="form-group">
+                <label class="col-sm-2 control-label">已添加的培训记录</label>
+                <div class="col-sm-9">
+                    <div style="height: 150px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                        <table class="table table-striped table-bordered table-hover table-condensed">
+                            <thead>
+                            <tr>
+                                <th style="width: 50px; text-align: center;">序号</th>
+                                <th style="width: 200px; text-align: center;">课程名称</th>
+                                <th style="width: 200px; text-align: center;">课程日期</th>
+                                <th style="width: 200px; text-align: center;">开始时间</th>
+                                <th style="width: 200px; text-align: center;">结束时间</th>
+                                <th style="width: 80px; text-align: center;">时长</th>
+                                <th style="width: 200px; text-align: center;">操作</th>
+                            </tr>
+                            </thead>
+                            <tbody id="transAreaAdd">
+
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+            <div class="form-group">
+                <div class="col-sm-10">
+                <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="save()"/>
+                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="Training.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriver/training.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/yesDriver.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/yesDriver.html
new file mode 100644
index 0000000..7e280e5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tDriver/yesDriver.html
@@ -0,0 +1,95 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>司机列表管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="注册时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="companyName" name="所属分公司/加盟商" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="addType" name="司机来源" >
+                                    <option value="">全部</option>
+                                    <option value="1">司机注册</option>
+                                    <option value="2">平台添加</option>
+                                    <option value="3">分公司添加</option>
+                                    <option value="4">加盟商添加</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="authState" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="2">正常</option>
+                                    <option value="3">冻结</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="YesDriver.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="YesDriver.resetSearch()" space="true"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <input type="file" name="file" style="width:0px;height:0px;" id="uploadEventFile" onchange="YesDriver.exportDriver()">
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="YesDriverTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tDriver/add")){
+                            <#button name="添加司机" icon="fa-plus" clickFun="YesDriver.add()"/>
+                            @}
+                            @if(shiro.hasPermission("/tDriver/update")){
+                            <#button name="编辑司机" icon="fa-edit" clickFun="YesDriver.update()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDriver/deleteDriver")){
+                            <#button name="删除司机" icon="fa-edit" clickFun="YesDriver.deleteDriver()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDriver/freeze")){
+                            <#button name="冻结司机" icon="fa-remove" clickFun="YesDriver.freeze()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDriver/thaw")){
+                            <#button name="解冻司机" icon="fa-remove" clickFun="YesDriver.thaw()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDriver/training")){
+                            <#button name="添加培训记录" icon="fa-remove" clickFun="YesDriver.training()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDriver/illegal")){
+                            <#button name="添加处罚记录" icon="fa-remove" clickFun="YesDriver.punish()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDriver/import")){
+                            <#button btnCss="info" name="下载模板" id="uploadModel" icon="fa fa-level-down" clickFun="YesDriver.uploadDriverModel()" space="true"/>
+                            <#button btnCss="danger" name="导入" id="uploadEventBtn" icon="fa fa-level-up" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDriver/export")){
+                            <#button name="导出司机" icon="fa-remove" clickFun="YesDriver.outDriver()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tDriver/changeCar")){
+                            <#button name="更换/绑定车辆" icon="fa-remove" clickFun="YesDriver.changeCar()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="YesDriverTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriver/yesDriver.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback.html
new file mode 100644
index 0000000..7303056
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback.html
@@ -0,0 +1,52 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>司机反馈管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="反馈时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="driverName" name="反馈人" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="driverPhone" name="反馈人手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">未处理</option>
+                                    <option value="2">已处理</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TFeedback.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TFeedback.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TFeedbackTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tFeedback/immediately")){
+                                <#button name="立即处理" icon="fa-edit" clickFun="TFeedback.immediately()"/>
+                            @}
+                        </div>
+                        <#table id="TFeedbackTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tFeedback/tFeedback.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_add.html
new file mode 100644
index 0000000..8ef6e4b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_add.html
@@ -0,0 +1,36 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" underline="true"/>
+                            <#input id="userId" name="反馈人ID" underline="true"/>
+                            <#input id="handleUserId" name="处理人Id" underline="true"/>
+                            <#input id="content" name="反馈内容" underline="true"/>
+                            <#input id="insertTime" name="反馈时间" underline="true"/>
+                            <#input id="imgUrl" name="图片"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="flag" name="状态(1=正常,2=删除)" underline="true"/>
+                            <#input id="state" name="处理状态 1=未处理 2=已处理" underline="true"/>
+                            <#input id="cldate" name="处理时间" underline="true"/>
+                            <#input id="remark" name="处理备注" underline="true"/>
+                            <#input id="type" name="1=用户,2=司机" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TFeedbackInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TFeedbackInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tFeedback/tFeedback_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_edit.html
new file mode 100644
index 0000000..ab2343a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_edit.html
@@ -0,0 +1,36 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" value="${item.id}" underline="true"/>
+                            <#input id="userId" name="反馈人ID" value="${item.userId}" underline="true"/>
+                            <#input id="handleUserId" name="处理人Id" value="${item.handleUserId}" underline="true"/>
+                            <#input id="content" name="反馈内容" value="${item.content}" underline="true"/>
+                            <#input id="insertTime" name="反馈时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="imgUrl" name="图片" value="${item.imgUrl}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="flag" name="状态(1=正常,2=删除)" value="${item.flag}" underline="true"/>
+                            <#input id="state" name="处理状态 1=未处理 2=已处理" value="${item.state}" underline="true"/>
+                            <#input id="cldate" name="处理时间" value="${item.cldate}" underline="true"/>
+                            <#input id="remark" name="处理备注" value="${item.remark}" underline="true"/>
+                            <#input id="type" name="1=用户,2=司机" value="${item.type}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TFeedbackInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TFeedbackInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tFeedback/tFeedback_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_immediately.html
new file mode 100644
index 0000000..a902b13
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/tFeedback_immediately.html
@@ -0,0 +1,29 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content" >
+        <div class="form-horizontal" id="feedbackInfoForm">
+            <input type="hidden" id="id" name="id" value="${tFeedbackId}">
+            <input type="hidden" id="type" name="type" value="${type}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" placeholder="多行输入,最多500字" style="width:100%;height:150px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TFeedbackInfoDlg.immediately()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TFeedbackInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tFeedback/tFeedback_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/userFeedback.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/userFeedback.html
new file mode 100644
index 0000000..ea7f094
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tFeedback/userFeedback.html
@@ -0,0 +1,52 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>用户反馈管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="反馈时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="反馈人" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userPhone" name="反馈人手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                <option value="">全部</option>
+                                <option value="1">未处理</option>
+                                <option value="2">已处理</option>
+                            </#SelectCon>
+                        </div>
+                        <div class="col-sm-3">
+                            <#button name="搜索" icon="fa-search" clickFun="TUserFeedback.search()"/>
+                            <#button name="重置" icon="fa-trash" clickFun="TUserFeedback.resetSearch()" space="true"/>
+                        </div>
+                    </div>
+                    <div class="hidden-xs" id="TUserFeedbackTableToolbar" role="group">
+                        @if(shiro.hasPermission("/tFeedback/immediatelyUser")){
+                        <#button name="立即处理" icon="fa-edit" clickFun="TUserFeedback.immediately()"/>
+                        @}
+                    </div>
+                    <#table id="TUserFeedbackTable"/>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+<script src="${ctxPath}/static/modular/system/tFeedback/userFeedback.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods.html
new file mode 100644
index 0000000..55468ff
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods.html
@@ -0,0 +1,61 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>商品管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="商品名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">已下架</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TIntegralGoods.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TIntegralGoods.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TIntegralGoodsTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tIntegralGoods/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TIntegralGoods.openAddTIntegralGoods()"/>
+                            @}
+                            @if(shiro.hasPermission("/tIntegralGoods/update")){
+                                <#button name="编辑" icon="fa-edit" clickFun="TIntegralGoods.openTIntegralGoodsDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tIntegralGoods/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TIntegralGoods.opt(3)" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tIntegralGoods/up")){
+                                <#button name="上架" icon="fa-remove" clickFun="TIntegralGoods.opt(1)" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tIntegralGoods/down")){
+                                <#button name="下架" icon="fa-remove" clickFun="TIntegralGoods.opt(2)" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TIntegralGoodsTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tIntegralGoods/tIntegralGoods.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods_add.html
new file mode 100644
index 0000000..9c113eb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods_add.html
@@ -0,0 +1,31 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="integralGoodsInfoForm">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="商品名称"/>
+                    <#avatar id="imgUrl" name="商品图片:" />
+                    <#input id="integral" name="兑换积分"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">商品说明:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" id="editor" style="width:100%;height:350px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TIntegralGoodsInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TIntegralGoodsInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tIntegralGoods/tIntegralGoods_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods_edit.html
new file mode 100644
index 0000000..c05bc99
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralGoods/tIntegralGoods_edit.html
@@ -0,0 +1,31 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="integralGoodsInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="商品名称" value="${item.name}"/>
+                    <#avatar id="imgUrl" name="商品图片:" avatarImg="${item.imgUrl}"/>
+                    <#input id="integral" name="兑换积分" value="${item.integral}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">商品说明:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" id="editor" style="width:100%;height:350px;">${item.instructions}</textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TIntegralGoodsInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TIntegralGoodsInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tIntegralGoods/tIntegralGoods_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder.html
new file mode 100644
index 0000000..8d1842e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder.html
@@ -0,0 +1,61 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>积分兑换订单管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="兑换时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="兑换用户" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="goodsName" name="兑换商品" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="consigneeName" name="收货人" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="consigneePhone" name="联系电话" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待处理</option>
+                                    <option value="2">已处理</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TIntegralOrder.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TIntegralOrder.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TIntegralOrderTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tIntegralOrder/immediately")){
+                                <#button name="立即处理" icon="fa-edit" clickFun="TIntegralOrder.immediately()"/>
+                            @}
+                            @if(shiro.hasPermission("/tIntegralOrder/delete")){
+                                <#button name="删除记录" icon="fa-remove" clickFun="TIntegralOrder.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TIntegralOrderTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tIntegralOrder/tIntegralOrder.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_add.html
new file mode 100644
index 0000000..57fbd7c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_add.html
@@ -0,0 +1,35 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键ID" underline="true"/>
+                            <#input id="insertTime" name="兑换时间" underline="true"/>
+                            <#input id="userId" name="兑换用户ID" underline="true"/>
+                            <#input id="goodsId" name="兑换商品ID" underline="true"/>
+                            <#input id="num" name="兑换数量"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="consigneeName" name="收货人" underline="true"/>
+                            <#input id="consigneePhone" name="收货人联系电话" underline="true"/>
+                            <#input id="consigneeAddress" name="收货人收货地址" underline="true"/>
+                            <#input id="remark" name="备注" underline="true"/>
+                            <#input id="state" name="状态 1=未处理 2=已处理 3=已删除" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TIntegralOrderInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TIntegralOrderInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tIntegralOrder/tIntegralOrder_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_edit.html
new file mode 100644
index 0000000..49d4252
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_edit.html
@@ -0,0 +1,35 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键ID" value="${item.id}" underline="true"/>
+                            <#input id="insertTime" name="兑换时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="userId" name="兑换用户ID" value="${item.userId}" underline="true"/>
+                            <#input id="goodsId" name="兑换商品ID" value="${item.goodsId}" underline="true"/>
+                            <#input id="num" name="兑换数量" value="${item.num}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="consigneeName" name="收货人" value="${item.consigneeName}" underline="true"/>
+                            <#input id="consigneePhone" name="收货人联系电话" value="${item.consigneePhone}" underline="true"/>
+                            <#input id="consigneeAddress" name="收货人收货地址" value="${item.consigneeAddress}" underline="true"/>
+                            <#input id="remark" name="备注" value="${item.remark}" underline="true"/>
+                            <#input id="state" name="状态 1=未处理 2=已处理 3=已删除" value="${item.state}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TIntegralOrderInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TIntegralOrderInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tIntegralOrder/tIntegralOrder_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_immediately.html
new file mode 100644
index 0000000..8e7ce0b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tIntegralOrder/tIntegralOrder_immediately.html
@@ -0,0 +1,28 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="integralOrderInfoForm">
+            <input type="hidden" id="id" name="id" value="${id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">处理备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;" placeholder="多行输入"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TIntegralOrderInfoDlg.immediately()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TIntegralOrderInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tIntegralOrder/tIntegralOrder_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice.html
new file mode 100644
index 0000000..d17d306
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice.html
@@ -0,0 +1,63 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>开发票列表管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="申请时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="email" name="邮箱" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="发票抬头" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="type" name="抬头类型" >
+                                    <option value="">全部</option>
+                                    <option value="1">个人发票</option>
+                                    <option value="2">单位发票</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待开票</option>
+                                    <option value="2">开票成功</option>
+                                    <option value="3">开票失败</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TInvoice.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TInvoice.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TInvoiceTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tInvoice/again")){
+                                <#button name="重新开票" icon="fa-edit" clickFun="TInvoice.again()"/>
+                            @}
+                            @if(shiro.hasPermission("/tInvoice/delete")){
+                                <#button name="删除记录" icon="fa-remove" clickFun="TInvoice.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TInvoiceTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tInvoice/tInvoice.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice_add.html
new file mode 100644
index 0000000..ab8a523
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice_add.html
@@ -0,0 +1,39 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" underline="true"/>
+                            <#input id="money" name="开票金额" underline="true"/>
+                            <#input id="orderNum" name="开票订单数量" underline="true"/>
+                            <#input id="type" name="开票类型(1=个人发票,2=单位发票)" underline="true"/>
+                            <#input id="name" name="抬头名称(公司名称/个人姓名)" underline="true"/>
+                            <#input id="code" name="税号" underline="true"/>
+                            <#input id="content" name="发票内容"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="remark" name="备注" underline="true"/>
+                            <#input id="address" name="地址+电话" underline="true"/>
+                            <#input id="bank" name="开户行+账号" underline="true"/>
+                            <#input id="email" name="邮箱" underline="true"/>
+                            <#input id="userId" name="开票用户id" underline="true"/>
+                            <#input id="state" name="状态(1=待开票,2=成功,3=失败)" underline="true"/>
+                            <#input id="insertTime" name="申请时间" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TInvoiceInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TInvoiceInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tInvoice/tInvoice_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice_edit.html
new file mode 100644
index 0000000..093e97f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tInvoice/tInvoice_edit.html
@@ -0,0 +1,39 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" value="${item.id}" underline="true"/>
+                            <#input id="money" name="开票金额" value="${item.money}" underline="true"/>
+                            <#input id="orderNum" name="开票订单数量" value="${item.orderNum}" underline="true"/>
+                            <#input id="type" name="开票类型(1=个人发票,2=单位发票)" value="${item.type}" underline="true"/>
+                            <#input id="name" name="抬头名称(公司名称/个人姓名)" value="${item.name}" underline="true"/>
+                            <#input id="code" name="税号" value="${item.code}" underline="true"/>
+                            <#input id="content" name="发票内容" value="${item.content}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="remark" name="备注" value="${item.remark}" underline="true"/>
+                            <#input id="address" name="地址+电话" value="${item.address}" underline="true"/>
+                            <#input id="bank" name="开户行+账号" value="${item.bank}" underline="true"/>
+                            <#input id="email" name="邮箱" value="${item.email}" underline="true"/>
+                            <#input id="userId" name="开票用户id" value="${item.userId}" underline="true"/>
+                            <#input id="state" name="状态(1=待开票,2=成功,3=失败)" value="${item.state}" underline="true"/>
+                            <#input id="insertTime" name="申请时间" value="${item.insertTime}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TInvoiceInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TInvoiceInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tInvoice/tInvoice_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine.html
new file mode 100644
index 0000000..c450377
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine.html
@@ -0,0 +1,70 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>跨城线路管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="线路名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="insertUser" name="创建者" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="modelStr" name="关联车型" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">冻结</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TLine.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TLine.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TLineTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tLine/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TLine.openAddTLine()"/>
+                            @}
+                            @if(shiro.hasPermission("/tLine/update")){
+                                <#button name="编辑" icon="fa-edit" clickFun="TLine.openTLineDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tLine/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TLine.opt(1)" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tLine/freeze")){
+                                <#button name="冻结" icon="fa-remove" clickFun="TLine.opt(2)" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tLine/thaw")){
+                                <#button name="解冻" icon="fa-remove" clickFun="TLine.opt(3)" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tLine/addCompany")){
+                                <#button name="分配企业" icon="fa-plus" clickFun="TLine.addCompany()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TLineTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tLine/tLine.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_add.html
new file mode 100644
index 0000000..da95513
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_add.html
@@ -0,0 +1,243 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+    .newWidth1, .single-line{
+        max-width:200px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="lineInfoForm">
+            <div class="row" style="margin-top: 15px;">
+                <div class="col-sm-4">
+                    <h2 style="font-weight: 700;">基础设置</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">线路名称:</label>
+                        <div class="col-sm-5">
+                            <input type="text" class="form-control" id="name" name="name">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">起点:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="startSiteId" >
+                                <option value="">选择站点</option>
+                                @for(obj in siteList){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">终点:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="endSiteId" >
+                                <option value="">选择站点</option>
+                                @for(obj in siteList){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">司机申请限制:</label>
+                        <div class="col-sm-6">
+                            司机申请班次的最小时间间隔为&nbsp;<input type="text" oninput="checkIsMinute(this)" class="form-control newWidth" id="shiftInterval" name="shiftInterval">&nbsp;分钟
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">抽成比例:</label>
+                        <div class="col-sm-6">
+                            <input type="text" oninput="checkIsBiLi(this)" class="form-control newWidth" id="rakeRate" name="rakeRate">&nbsp;%
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 style="font-weight: 700;">价格设置</h2>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">选择车型:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="serverModelId" >
+                                <option value="">选择车型</option>
+                                @for(obj in carmodelList){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">选择车型:</label>
+                        <div class="col-sm-2"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="type1" value="1" name="type" checked="" onclick="TLineInfoDlg.typeClick(1)">
+                                <label for="type1"> 固定计价 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="type2" value="2" name="type" onclick="TLineInfoDlg.typeClick(2)">
+                                <label for="type2"> 浮动计价 </label>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="form-group" id="fixedDiv">
+                        <label class="col-sm-2 control-label">固定计价:</label>
+                        <div class="col-sm-10">
+                            单人价格:&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num1" id="num1" class="form-control newWidth" />&nbsp;元;
+                            包车价格:&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num2" id="num2" class="form-control newWidth" />&nbsp;元;<br><br>
+                            五座系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num3" id="num3" class="form-control newWidth" />&nbsp;;
+                            七座系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num4" id="num4" class="form-control newWidth" />&nbsp;;
+                        </div>
+                    </div>
+
+                    <div class="form-group" id="floatDiv" style="display: none;">
+                        <label class="col-sm-2 control-label">浮动计价:</label>
+                        <div class="col-sm-10">
+                            参考费用:&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num11" id="num11" class="form-control newWidth" />&nbsp;元;
+                            参考里程:&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num12" id="num12" class="form-control newWidth" />&nbsp;公里;<br><br>
+                            基础单价:&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num13" id="num13" class="form-control newWidth" />&nbsp;元;
+                            优惠系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num14" id="num14" class="form-control newWidth" />&nbsp;;<br><br>
+                            包车系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num15" id="num15" class="form-control newWidth" />&nbsp;;
+                            五座系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num16" id="num16" class="form-control newWidth" />&nbsp;;<br><br>
+                            七座系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num17" id="num17" class="form-control newWidth" />&nbsp;;
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label"></label>
+                        <div class="col-sm-10">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.addPrice()"/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">已添加价格</label>
+                        <div class="col-sm-6">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;text-align: center;">添加时间</th>
+                                        <th style="width: 300px;text-align: center;">车型名称</th>
+                                        <th style="width: 300px;text-align: center;">价格设置</th>
+                                        <th style="width: 100px;text-align: center;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="priceValue">
+
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 style="font-weight: 700;">班次设置</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">班次时间:</label>
+                        <div class="col-sm-2">
+                            <input type="text" name="shiftTime" id="shiftTime" class="form-control" placeholder="选择时间"/>
+                        </div>
+                        <label class="col-sm-1 control-label">车次数:</label>
+                        <div class="col-sm-2">
+                            <input type="text" name="carNum" id="carNum" class="form-control" />
+                        </div>
+                        <div class="col-sm-2">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.addShift()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">已添加班次</label>
+                        <div class="col-sm-6">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;text-align: center;">添加时间</th>
+                                        <th style="width: 300px;text-align: center;">班次时间</th>
+                                        <th style="width: 300px;text-align: center;">车次数</th>
+                                        <th style="width: 100px;text-align: center;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="shiftValue">
+
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+
+
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TLineInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tLine/tLine_info.js"></script>
+<script type="text/javascript">
+    laydate.render({
+        elem: '#shiftTime'
+        ,type: 'time'
+        ,range: '-'
+        ,format: 'HH:mm'
+    });
+    var regDouble = /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/;
+    var regXiShu = /^(0(\.\d{1,2})?|1(\.0{1,2})?)$/;
+    var regBiLi = /^([0-9]{1,2}$)|(^[0-9]{1,2}\.[0-9]{1,2}$)|100$/;
+    var regInt = /^[0-9]{0,3}$/;
+    function checkIsYuan(obj){
+        var num = $(obj).val();
+        if(!regDouble.test(num)){
+            layer.msg("【元】输入框不能超过3位数,保留两位小数");
+        }
+    }
+    function checkIsXiShu(obj){
+        var num = $(obj).val();
+        if(!regXiShu.test(num)){
+            layer.msg("【系数】输入框大于0小于1,保留两位小数");
+        }
+    }
+    function checkIsBiLi(obj){
+        var num = $(obj).val();
+        if(!regBiLi.test(num)){
+            layer.msg("【比例】输入框大于等于0小于100");
+        }
+    }
+    function checkIsMinute(obj){
+        var num = $(obj).val();
+        if(!regInt.test(num)){
+            layer.msg("【分钟】输入框不能超过3位数");
+        }
+    }
+
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_addCompany.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_addCompany.html
new file mode 100644
index 0000000..9564a26
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_addCompany.html
@@ -0,0 +1,65 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="lineInfoForm">
+            <div class="row">
+                <input type="hidden" id="lineId" name="lineId" value="${tLine.id}">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">线路名称:</label>
+                        <div class="col-sm-9">
+                            <label class="control-label" id="name" name="name">${tLine.name}</label>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">选择企业:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="companyId" >
+                                <option value="">选择企业</option>
+                                @for(obj in companyList){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.addCompany()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">已分配企业</label>
+                        <div class="col-sm-6">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;text-align: center;">公司名称</th>
+                                        <th style="width: 100px;text-align: center;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="companyValue">
+                                    @for(obj in lineCompanyList!){
+                                    <tr class="companyValueClass">
+                                        <td style="text-align: center;"><input type="hidden" id="companyIdValue" name="companyIdValue" value="${obj.companyId}">${obj.companyName}</td>
+                                        <td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td>
+                                    </tr>
+                                    @}
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.addCompanySubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TLineInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tLine/tLine_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_edit.html
new file mode 100644
index 0000000..3835e4f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_edit.html
@@ -0,0 +1,257 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+    .newWidth1, .single-line{
+        max-width:200px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="lineInfoForm">
+            <div class="row" style="margin-top: 15px;">
+                <div class="col-sm-4">
+                    <h2 style="font-weight: 700;">基础设置</h2>
+                </div>
+            </div>
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">线路名称:</label>
+                        <div class="col-sm-5">
+                            <input type="text" class="form-control" id="name" name="name" value="${item.name}">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">起点:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="startSiteId" >
+                                <option value="">选择站点</option>
+                                @for(obj in siteList){
+                                <option value="${obj.id}" ${obj.id == start.siteId ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">终点:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="endSiteId" >
+                                <option value="">选择站点</option>
+                                @for(obj in siteList){
+                                <option value="${obj.id}" ${obj.id == end.siteId ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">司机申请限制:</label>
+                        <div class="col-sm-6">
+                            司机申请班次的最小时间间隔为&nbsp;<input type="text" oninput="checkIsMinute(this)" class="form-control newWidth" id="shiftInterval" name="shiftInterval" value="${item.shiftInterval}" >&nbsp;分钟
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">抽成比例:</label>
+                        <div class="col-sm-6">
+                            <input type="text" oninput="checkIsBiLi(this)" class="form-control newWidth" id="rakeRate" name="rakeRate" value="${item.rakeRate}">&nbsp;%
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 style="font-weight: 700;">价格设置</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">选择车型:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="serverModelId" >
+                                <option value="">选择车型</option>
+                                @for(obj in carmodelList){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">选择车型:</label>
+                        <div class="col-sm-2"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="type1" value="1" name="type" checked="" onclick="TLineInfoDlg.typeClick(1)">
+                                <label for="type1"> 固定计价 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="type2" value="2" name="type" onclick="TLineInfoDlg.typeClick(2)">
+                                <label for="type2"> 浮动计价 </label>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="form-group" id="fixedDiv">
+                        <label class="col-sm-2 control-label">固定计价:</label>
+                        <div class="col-sm-10">
+                            单人价格:&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num1" id="num1" class="form-control newWidth" />&nbsp;元;
+                            包车价格:&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num2" id="num2" class="form-control newWidth" />&nbsp;元;<br><br>
+                            五座系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num3" id="num3" class="form-control newWidth" />&nbsp;;
+                            七座系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num4" id="num4" class="form-control newWidth" />&nbsp;;
+                        </div>
+                    </div>
+
+                    <div class="form-group" id="floatDiv" style="display: none;">
+                        <label class="col-sm-2 control-label">浮动计价:</label>
+                        <div class="col-sm-10">
+                            参考费用:&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num11" id="num11" class="form-control newWidth" />&nbsp;元;
+                            参考里程:&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num12" id="num12" class="form-control newWidth" />&nbsp;公里;<br><br>
+                            基础单价:&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num13" id="num13" class="form-control newWidth" />&nbsp;元;
+                            优惠系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num14" id="num14" class="form-control newWidth" />&nbsp;;<br><br>
+                            包车系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num15" id="num15" class="form-control newWidth" />&nbsp;;
+                            五座系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num16" id="num16" class="form-control newWidth" />&nbsp;;<br><br>
+                            七座系数:&nbsp;<input type="text" oninput="checkIsXiShu(this)" name="num17" id="num17" class="form-control newWidth" />&nbsp;;
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label"></label>
+                        <div class="col-sm-10">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.addPrice()"/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">已添加价格</label>
+                        <div class="col-sm-6">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;text-align: center;">添加时间</th>
+                                        <th style="width: 300px;text-align: center;">车型名称</th>
+                                        <th style="width: 300px;text-align: center;">价格设置</th>
+                                        <th style="width: 100px;text-align: center;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="priceValue">
+                                    @for(obj in linePriceList!){
+                                    <tr class="typeValueClass">
+                                        <td style="text-align: center;"><input type="hidden" id="timeValue" name="timeValue" value="${obj.addTime}">${obj.addTime}</td>
+                                        <td style="text-align: center;"><input type="hidden" id="serverModelIdValue" name="serverModelIdValue" value="${obj.serverCarModelId}">${obj.name}</td>
+                                        <td style="text-align: center;"><input type="hidden" id="typeValue" name="typeValue" value="${obj.type}">
+                                            <input type="hidden" id="contentValue" name="contentValue" value='${obj.content}'>
+                                            <input type="hidden" id="contentStrValue" name="contentStrValue" value="${obj.contentStr}">${obj.contentStr}</td>
+                                        <td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td>
+                                    </tr>
+                                    @}
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 style="font-weight: 700;">班次设置</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">班次时间:</label>
+                        <div class="col-sm-2">
+                            <input type="text" name="shiftTime" id="shiftTime" class="form-control" placeholder="选择时间"/>
+                        </div>
+                        <label class="col-sm-1 control-label">车次数:</label>
+                        <div class="col-sm-2">
+                            <input type="text" name="carNum" id="carNum" class="form-control" />
+                        </div>
+                        <div class="col-sm-2">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.addShift()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">已添加班次</label>
+                        <div class="col-sm-6">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;text-align: center;">添加时间</th>
+                                        <th style="width: 300px;text-align: center;">班次时间</th>
+                                        <th style="width: 300px;text-align: center;">车次数</th>
+                                        <th style="width: 100px;text-align: center;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="shiftValue">
+                                    @for(obj in lineShiftList!){
+                                    <tr class="shiftValueClass">
+                                        <td style="text-align: center;"><input type="hidden" id="time2Value" name="time2Value" value="${obj.addTime}">${obj.addTime}</td>
+                                        <td style="text-align: center;"><input type="hidden" id="shiftTimeValue" name="shiftTimeValue" value="${obj.startTime} - ${obj.endTime}">${obj.startTime} - ${obj.endTime}</td>
+                                        <td style="text-align: center;"><input type="hidden" id="carNumValue" name="carNumValue" value="${obj.carNum}">${obj.carNum}</td>
+                                        <td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td>
+                                    </tr>
+                                    @}
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TLineInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tLine/tLine_info.js"></script>
+<script type="text/javascript">
+    laydate.render({
+        elem: '#shiftTime'
+        ,type: 'time'
+        ,range: '-'
+        ,format: 'HH:mm'
+    });
+    var regDouble = /^(([1-9]{1}\d*)|(0{1}))(\.\d{0,2})?$/;
+    var regXiShu = /^(0(\.\d{1,2})?|1(\.0{1,2})?)$/;
+    var regBiLi = /^([0-9]{1,2}$)|(^[0-9]{1,2}\.[0-9]{1,2}$)|100$/;
+    var regInt = /^[0-9]{0,3}$/;
+    function checkIsYuan(obj){
+        var num = $(obj).val();
+        if(!regDouble.test(num)){
+            layer.msg("【元】输入框不能超过3位数,保留两位小数");
+        }
+    }
+    function checkIsXiShu(obj){
+        var num = $(obj).val();
+        if(!regXiShu.test(num)){
+            layer.msg("【系数】输入框大于0小于1,保留两位小数");
+        }
+    }
+    function checkIsBiLi(obj){
+        var num = $(obj).val();
+        if(!regBiLi.test(num)){
+            layer.msg("【比例】输入框大于等于0小于100");
+        }
+    }
+    function checkIsMinute(obj){
+        var num = $(obj).val();
+        if(!regInt.test(num)){
+            layer.msg("【分钟】输入框不能超过3位数");
+        }
+    }
+
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system.html
new file mode 100644
index 0000000..e7c74a4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system.html
@@ -0,0 +1,51 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>系统公告设置管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="content" name="消息内容" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="System.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="System.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="SystemTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tNotices/addSystem")){
+                            <#button name="添加" icon="fa-plus" clickFun="System.addSystem()"/>
+                            @}
+                            @if(shiro.hasPermission("/tNotices/updateSystem")){
+                            <#button name="编辑" icon="fa-edit" clickFun="System.updateSystem()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tNotices/deleteSystem")){
+                            <#button name="删除" icon="fa-remove" clickFun="System.deleteSystem()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tNotices/sendSystem")){
+                            <#button name="发布" icon="fa-remove" clickFun="System.sendSystem()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="SystemTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tNotices/system.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system_add.html
new file mode 100644
index 0000000..d562f9b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system_add.html
@@ -0,0 +1,55 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="systemInfoForm">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <fieldset>
+                            <label class="col-sm-3 control-label">发布对象:</label>
+                            <div class="col-sm-9">
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox1" checked="checked" value="1">
+                                    <label for="serverBox1"> 用户 </label>
+                                </div>
+                                <div class="checkbox checkbox-success  checkbox-inline">
+                                    <input type="checkbox" name="serverBox" id="serverBox2" value="2">
+                                    <label for="serverBox2"> 司机 </label>
+                                </div>
+                            </div>
+                        </fieldset>
+                    </div>
+                    <#avatar id="imgUrl" name="封面:" />
+                    <#input id="title" name="标题"/>
+                    <#select id="isBroadcast" name="是否播报:" >
+                        <option value="">选择是否播报</option>
+                        <option value="1">是</option>
+                        <option value="2">否</option>
+                    </#select>
+                    <div class="form-group" id="contentDiv">
+                        <label class="col-sm-3 control-label">公告内容:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" id="editor" style="width:100%;height:350px;"></textarea>
+                        </div>
+                    </div>
+                    <#select id="isShow" name="是否发布:" >
+                        <option value="">选择是否发布</option>
+                        <option value="1">是</option>
+                        <option value="2">否</option>
+                    </#select>
+            </div>
+        </div>
+
+        <div class="row btn-group-m-t">
+            <div class="col-sm-10 col-sm-offset-5">
+                <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="SystemInfoDlg.addSubmit()"/>
+                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SystemInfoDlg.close()"/>
+            </div>
+        </div>
+    </div>
+
+</div>
+</div>
+<script src="${ctxPath}/static/modular/system/tNotices/system_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system_update.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system_update.html
new file mode 100644
index 0000000..8243e79
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/system_update.html
@@ -0,0 +1,40 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="systemInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#avatar id="imgUrl" name="封面:" avatarImg="${item.imgUrl}"/>
+                    <#input id="title" name="标题" value="${item.title}"/>
+                    <#select id="isBroadcast" name="是否播报:" >
+                    <option value="">选择是否播报</option>
+                    <option value="1" ${1 == item.isBroadcast ? 'selected=selected' : ''}>是</option>
+                    <option value="2" ${2 == item.isBroadcast ? 'selected=selected' : ''}>否</option>
+                </#select>
+                <div class="form-group" id="contentDiv">
+                    <label class="col-sm-3 control-label">公告内容:</label>
+                    <div class="col-sm-9">
+                        <textarea type="text/plain" id="editor" style="width:100%;height:350px;">${item.content}</textarea>
+                    </div>
+                </div>
+                <#select id="isShow" name="是否发布:" >
+                <option value="">选择是否发布</option>
+                <option value="1" ${1 == item.isShow ? 'selected=selected' : ''}>是</option>
+                <option value="2" ${2 == item.isShow ? 'selected=selected' : ''}>否</option>
+            </#select>
+        </div>
+    </div>
+
+    <div class="row btn-group-m-t">
+        <div class="col-sm-10 col-sm-offset-5">
+            <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="SystemInfoDlg.editSubmit()"/>
+            <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SystemInfoDlg.close()"/>
+        </div>
+    </div>
+</div>
+
+</div>
+</div>
+<script src="${ctxPath}/static/modular/system/tNotices/system_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices.html
new file mode 100644
index 0000000..fbf8f2a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices.html
@@ -0,0 +1,48 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>滚动消息设置管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="content" name="消息内容" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TNotices.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TNotices.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TNoticesTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tNotices/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TNotices.openAddTNotices()"/>
+                            @}
+                            @if(shiro.hasPermission("/tNotices/update")){
+                                <#button name="编辑" icon="fa-edit" clickFun="TNotices.openTNoticesDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tNotices/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TNotices.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TNoticesTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tNotices/tNotices.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices_add.html
new file mode 100644
index 0000000..b8d2f90
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices_add.html
@@ -0,0 +1,29 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="noticeInfoForm">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="content" name="消息内容" />
+                    <#input id="sort" name="排序"/>
+                    <#select id="isShow" name="是否显示:" >
+                        <option value="">选择是否显示</option>
+                        <option value="1">是</option>
+                        <option value="2">否</option>
+                    </#select>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TNoticesInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TNoticesInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tNotices/tNotices_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices_edit.html
new file mode 100644
index 0000000..0b13d67
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tNotices/tNotices_edit.html
@@ -0,0 +1,29 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="noticeInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="content" name="消息内容" value="${item.content}"/>
+                    <#input id="sort" name="排序" value="${item.sort}"/>
+                    <#select id="isShow" name="是否显示:" >
+                        <option value="">选择是否显示</option>
+                        <option value="1" ${1 == item.isShow ? 'selected=selected' : ''}>是</option>
+                        <option value="2" ${2 == item.isShow ? 'selected=selected' : ''}>否</option>
+                    </#select>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TNoticesInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TNoticesInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tNotices/tNotices_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity.html
new file mode 100644
index 0000000..48eea26
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity.html
@@ -0,0 +1,48 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>城市管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="condition" name="省/市/区名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TOpenCity.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TOpenCity.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TOpenCityTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tOpenCity/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TOpenCity.openAddTOpenCity()"/>
+                            @}
+                            @if(shiro.hasPermission("/tOpenCity/update")){
+                                <#button name="编辑" icon="fa-edit" clickFun="TOpenCity.openTOpenCityDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tOpenCity/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TOpenCity.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TOpenCityTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOpenCity/tOpenCity.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_add.html
new file mode 100644
index 0000000..b20a892
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_add.html
@@ -0,0 +1,79 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="openCityForm">
+            <div class="row">
+                <div class="col-sm-10">
+                    <#select id="provinceId" name="省:" onchange="TOpenCityInfoDlg.provinceChange()">
+                        <option value="">选择省</option>
+                        @for(province in provinceList){
+                        <option value="${province.id}">${province.name}</option>
+                        @}
+                    </#select>
+                    <#select id="cityId" name="市:" onchange="TOpenCityInfoDlg.cityChange()">
+                        <option value="">选择市</option>
+                    </#select>
+                    <#select id="areaId" name="区:">
+                        <option value="">选择区</option>
+                    </#select>
+                    <#select id="isQualifications" name="是否需要网约车资格证:">
+                        <option value="">选择是否需要网约车资格证</option>
+                        <option value="1">是</option>
+                        <option value="2">否</option>
+                    </#select>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">经营业务:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="businessType">
+                                <option value="">选择经营业务</option>
+                                <option value="1">专车</option>
+                                <option value="2">出租车</option>
+                                <option value="3">跨城出行</option>
+                                <option value="4">跨城小件物流</option>
+                                <option value="5">同城小件物流</option>
+                                <option value="6">包车</option>
+                            </select>
+                        </div>
+                        <div class="col-sm-3" >
+                            <#input id="businessSort" name="排序" value="" />
+                        </div>
+                        <div class="col-sm-2">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="addBusinessType()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">已添加经营业务</label>
+                        <div class="col-sm-9">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;">添加时间</th>
+                                        <th style="width: 300px;">经营业务</th>
+                                        <th style="width: 300px;">排序</th>
+                                        <th style="width: 100px;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="coun">
+
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOpenCityInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOpenCityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOpenCity/tOpenCity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_edit.html
new file mode 100644
index 0000000..844d9f1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_edit.html
@@ -0,0 +1,95 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="openCityForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-10">
+                    <#select id="provinceId" name="省:" onchange="TOpenCityInfoDlg.provinceChange()">
+                    <option value="">选择省</option>
+                        @for(province in provinceList){
+                        <option value="${province.id}" ${province.id == item.areaId ? 'selected=selected' : ''}>${province.name}</option>
+                        @}
+                    </#select>
+                    <#select id="cityId" name="市:" onchange="TOpenCityInfoDlg.cityChange()">
+                        <option value="">选择市</option>
+                        @for(city in cityList){
+                        <option value="${city.id}" ${city.id == item.cityId ? 'selected=selected' : ''}>${city.name}</option>
+                        @}
+                    </#select>
+                    <#select id="areaId" name="区:">
+                        <option value="">选择区</option>
+                        @for(area in areaList){
+                        <option value="${area.id}" ${area.id == item.provinceId ? 'selected=selected' : ''}>${area.name}</option>
+                        @}
+                    </#select>
+                    <#select id="isQualifications" name="是否需要网约车资格证:">
+                        <option value="">选择是否需要网约车资格证</option>
+                        <option value="1" ${1 == item.isQualifications ? 'selected=selected' : ''}>是</option>
+                        <option value="2" ${2 == item.isQualifications ? 'selected=selected' : ''}>否</option>
+                    </#select>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">经营业务:</label>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="businessType">
+                                <option value="">选择经营业务</option>
+                                <option value="1">专车</option>
+                                <option value="2">出租车</option>
+                                <option value="3">跨城出行</option>
+                                <option value="4">跨城小件物流</option>
+                                <option value="5">同城小件物流</option>
+                                <option value="6">包车</option>
+                            </select>
+                        </div>
+                        <div class="col-sm-3" >
+                            <#input id="businessSort" name="排序" value="" />
+                        </div>
+                        <div class="col-sm-2">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="addBusinessType()"/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">已添加经营业务</label>
+                        <div class="col-sm-9">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;">添加时间</th>
+                                        <th style="width: 300px;">经营业务</th>
+                                        <th style="width: 300px;">排序</th>
+                                        <th style="width: 100px;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="coun">
+                                    @for(obj in businessList){
+                                    <tr class="timeClass">
+                                        <td>
+                                            <input type="hidden" id="busId" name="busId" value="${obj.id}">
+                                            <input type="hidden" id="time" name="time" value="${obj.insertTimeStr}">${obj.insertTimeStr}</td>
+                                        <td><input type="hidden" id="type" name="type" value="${obj.businessTypeStr}">${obj.businessTypeStr}</td>
+                                        <td><input type="hidden" id="sort" name="sort" value="${obj.sort}">${obj.sort}</td>
+                                        <td><button onclick="deleteSub(this)">移除</button></td></td>
+                                    </tr>
+                                    @}
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOpenCityInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOpenCityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOpenCity/tOpenCity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter.html
new file mode 100644
index 0000000..69948d4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter.html
@@ -0,0 +1,61 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>旅游包车订单管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="提交用户" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="contactName" name="联系人" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="contactPhone" name="联系电话" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="useDemand" name="用车需求" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待处理</option>
+                                    <option value="2">已处理</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TOrderCharter.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TOrderCharter.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TOrderCharterTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tOrderCharter/immediately")){
+                                <#button name="立即处理" icon="fa-edit" clickFun="TOrderCharter.immediately()"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderCharter/delete")){
+                                <#button name="删除记录" icon="fa-remove" clickFun="TOrderCharter.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TOrderCharterTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderCharter/tOrderCharter.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_add.html
new file mode 100644
index 0000000..546f8a7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_add.html
@@ -0,0 +1,35 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键ID" underline="true"/>
+                            <#input id="insertTime" name="提交时间" underline="true"/>
+                            <#input id="userId" name="用户ID" underline="true"/>
+                            <#input id="useTime" name="用车时间" underline="true"/>
+                            <#input id="useDuration" name="用车时长"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="useDemand" name="用车需求" underline="true"/>
+                            <#input id="contactName" name="联系人" underline="true"/>
+                            <#input id="contactPhone" name="联系电话" underline="true"/>
+                            <#input id="remark" name="处理备注" underline="true"/>
+                            <#input id="state" name="状态 1=未处理  2=已处理  3=已删除" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderCharterInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderCharterInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderCharter/tOrderCharter_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_edit.html
new file mode 100644
index 0000000..1d8eecb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_edit.html
@@ -0,0 +1,35 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键ID" value="${item.id}" underline="true"/>
+                            <#input id="insertTime" name="提交时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="userId" name="用户ID" value="${item.userId}" underline="true"/>
+                            <#input id="useTime" name="用车时间" value="${item.useTime}" underline="true"/>
+                            <#input id="useDuration" name="用车时长" value="${item.useDuration}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="useDemand" name="用车需求" value="${item.useDemand}" underline="true"/>
+                            <#input id="contactName" name="联系人" value="${item.contactName}" underline="true"/>
+                            <#input id="contactPhone" name="联系电话" value="${item.contactPhone}" underline="true"/>
+                            <#input id="remark" name="处理备注" value="${item.remark}" underline="true"/>
+                            <#input id="state" name="状态 1=未处理  2=已处理  3=已删除" value="${item.state}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderCharterInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderCharterInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderCharter/tOrderCharter_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_immediately.html
new file mode 100644
index 0000000..3abd254
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharter/tOrderCharter_immediately.html
@@ -0,0 +1,28 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="orderCharterInfoForm">
+            <input type="hidden" id="id" name="id" value="${id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">处理备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;" placeholder="多行输入"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderCharterInfoDlg.immediately()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderCharterInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderCharter/tOrderCharter_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar.html
new file mode 100644
index 0000000..533d084
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar.html
@@ -0,0 +1,61 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>旅游包车订单管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="提交时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="提交用户" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="contactPerson" name="联系人" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="contactPhone" name="联系电话" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="modelUse" name="用车需求" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待处理</option>
+                                    <option value="2">已处理</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TOrderCharteredCar.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TOrderCharter.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TOrderCharteredCarTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tOrderCharteredCar/immediately")){
+                            <#button name="立即处理" icon="fa-edit" clickFun="TOrderCharteredCar.immediately()"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderCharteredCar/delete")){
+                            <#button name="删除记录" icon="fa-remove" clickFun="TOrderCharteredCar.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TOrderCharteredCarTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderCharteredCar/tOrderCharteredCar.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_add.html
new file mode 100644
index 0000000..0e5eedd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_add.html
@@ -0,0 +1,40 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" underline="true"/>
+                            <#input id="userId" name="用户id" underline="true"/>
+                            <#input id="companyId" name="企业id" underline="true"/>
+                            <#input id="orderNumber" name="订单编号" underline="true"/>
+                            <#input id="traveltime" name="出行时间" underline="true"/>
+                            <#input id="carTime" name="用车时长(天)" underline="true"/>
+                            <#input id="serverCarModelId" name="服务车型id" underline="true"/>
+                            <#input id="modelUse" name="车型用途"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="peopleNumber" name="乘车人数" underline="true"/>
+                            <#input id="contactPerson" name="联系人" underline="true"/>
+                            <#input id="contactPhone" name="联系电话" underline="true"/>
+                            <#input id="state" name="订单状态(1=待处理,2=已处理)" underline="true"/>
+                            <#input id="remark" name="处理备注" underline="true"/>
+                            <#input id="isDelete" name="删除状态(1=否,2=是)" underline="true"/>
+                            <#input id="insertTime" name="添加时间" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderCharteredCarInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderCharteredCarInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderCharteredCar/tOrderCharteredCar_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_edit.html
new file mode 100644
index 0000000..fa6e2a4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_edit.html
@@ -0,0 +1,40 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" value="${item.id}" underline="true"/>
+                            <#input id="userId" name="用户id" value="${item.userId}" underline="true"/>
+                            <#input id="companyId" name="企业id" value="${item.companyId}" underline="true"/>
+                            <#input id="orderNumber" name="订单编号" value="${item.orderNumber}" underline="true"/>
+                            <#input id="traveltime" name="出行时间" value="${item.traveltime}" underline="true"/>
+                            <#input id="carTime" name="用车时长(天)" value="${item.carTime}" underline="true"/>
+                            <#input id="serverCarModelId" name="服务车型id" value="${item.serverCarModelId}" underline="true"/>
+                            <#input id="modelUse" name="车型用途" value="${item.modelUse}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="peopleNumber" name="乘车人数" value="${item.peopleNumber}" underline="true"/>
+                            <#input id="contactPerson" name="联系人" value="${item.contactPerson}" underline="true"/>
+                            <#input id="contactPhone" name="联系电话" value="${item.contactPhone}" underline="true"/>
+                            <#input id="state" name="订单状态(1=待处理,2=已处理)" value="${item.state}" underline="true"/>
+                            <#input id="remark" name="处理备注" value="${item.remark}" underline="true"/>
+                            <#input id="isDelete" name="删除状态(1=否,2=是)" value="${item.isDelete}" underline="true"/>
+                            <#input id="insertTime" name="添加时间" value="${item.insertTime}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderCharteredCarInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderCharteredCarInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderCharteredCar/tOrderCharteredCar_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_immediately.html
new file mode 100644
index 0000000..18978c9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCharteredCar/tOrderCharteredCar_immediately.html
@@ -0,0 +1,28 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="orderCharterCarInfoForm">
+            <input type="hidden" id="id" name="id" value="${id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">处理备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;" placeholder="多行输入"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderCharteredCarInfoDlg.immediately()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderCharteredCarInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderCharteredCar/tOrderCharteredCar_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity.html
new file mode 100644
index 0000000..e3a09d2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity.html
@@ -0,0 +1,109 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>跨城出行订单管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="订单时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="orderNum" name="订单编号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="orderSource" name="订单来源" >
+                                    <option value="">全部</option>
+                                    <option value="1">APP下单</option>
+                                    <option value="2">扫码下单</option>
+                                    <option value="3">小程序下单</option>
+                                    <option value="4">司机下单</option>
+                                    <option value="5">调度下单</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="下单用户昵称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userPhone" name="下单用户手机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="passengers" name="乘车用户姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="passengersPhone" name="乘车用户手机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="serverCarModelId" name="车型" >
+                                    <option value="">全部</option>
+                                    @for(obj in carmodelList){
+                                    <option value="${obj.id}">${obj.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="driver" name="接单司机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="lineId" name="线路" >
+                                    <option value="">全部</option>
+                                    @for(obj in lineList){
+                                    <option value="${obj.id}">${obj.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待接单</option>
+                                    <option value="2">待出发</option>
+                                    <option value="3">待到达预约地点</option>
+                                    <option value="4">待乘客上车</option>
+                                    <option value="5">服务中</option>
+                                    <option value="6">完成服务</option>
+                                    <option value="7">待支付</option>
+                                    <option value="8">待评价</option>
+                                    <option value="9">已完成</option>
+                                    <option value="10">已取消</option>
+                                    <option value="11">改派中</option>
+                                    <option value="12">取消待支付</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TOrderCrossCity.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TOrderCrossCity.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TOrderCrossCityTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tOrderCrossCity/detail")){
+                                <#button name="订单详情" icon="fa-plus" clickFun="TOrderCrossCity.detail()"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderCrossCity/cancel")){
+                                <#button name="取消订单" icon="fa-edit" clickFun="TOrderCrossCity.cancel()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderCrossCity/track")){
+                                <#button name="订单轨迹" icon="fa-remove" clickFun="TOrderCrossCity.track()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderCrossCity/delete")){
+                                <#button name="删除记录" icon="fa-remove" clickFun="TOrderCrossCity.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TOrderCrossCityTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderCrossCity/tOrderCrossCity.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_detail.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_detail.html
new file mode 100644
index 0000000..991ca55
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_detail.html
@@ -0,0 +1,107 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    html, body, #container {
+        height: 100%;
+        width: 100%;
+    }
+
+    .input-card .btn{
+        margin-right: 1.2rem;
+        width: 9rem;
+    }
+
+    .input-card .btn:last-child{
+        margin-right: 0;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">订单详情</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#label id="insertTimeStr" name="下单时间" value="${item.insertTimeStr}"/>
+                    <#label id="orderSourceStr" name="订单来源" value="${item.orderSourceStr}"/>
+                    <#label id="userName" name="下单用户昵称" value="${item.userName}"/>
+                    <#label id="passengers" name="乘车用户昵称" value="${item.passengers}"/>
+                    <#label id="placementAddress" name="起点" value="${item.startAddress}"/>
+                    <#label id="driver" name="接单司机" value="${item.driver}"/>
+                    <#label id="car" name="接单车辆" value="${item.car}"/>
+                    <#label id="boardingAddress" name="上车地点" value="${item.boardingAddress}"/>
+                    <#label id="getoffAddress" name="下车地点" value="${item.getoffAddress}"/>
+                    <#label id="serverCarModel" name="选择车型" value="${item.serverCarModel}"/>
+                </div>
+
+                <div class="col-sm-6">
+                    <#label id="orderNum" name="订单编号" value="${item.orderNum}"/>
+                    <#label id="travelTimeStr" name="乘车时间" value="${item.travelTimeStr}"/>
+                    <#label id="userPhone" name="下单用户手机号" value="${item.userPhone}"/>
+                    <#label id="passengersPhone" name="乘车用户手机号" value="${item.passengersPhone}"/>
+                    <#label id="endAddress" name="终点" value="${item.endAddress}"/>
+                    <#label id="companyName" name="车辆所属机构" value="${item.companyName}"/>
+                    <#label id="boardingTimeStr" name="上车时间" value="${item.boardingTimeStr}"/>
+                    <#label id="getoffTimeStr" name="下车时间" value="${item.getoffTimeStr}"/>
+                    <#label id="lineName" name="线路" value="${item.lineName}"/>
+                </div>
+            </div>
+
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">费用明细</h2>
+                </div>
+            </div>
+            <div class="row">
+                @if(isNotEmpty(item.orderMoney) && item.orderMoney > 0){
+                <div class="col-sm-6 b-r">
+                    <#label id="orderMoney" name="订单总价" value="${item.orderMoney}元"/>
+                    <#label id="couponMoney" name="优惠券抵扣费用" value="${item.couponMoney}元"/>
+                </div>
+                <div class="col-sm-6">
+                    @if(isNotEmpty(item.payMoney)){
+                    <#label id="payMoney" name="实际支付费用" value="${item.payMoney}元"/>
+                    @}else{
+                    <#label id="payMoney" name="实际支付费用" value="0.00元"/>
+                    @}
+                    <#label id="payTypeStr" name="支付方式" value="${item.payTypeStr}"/>
+                </div>
+                @}else{
+                <h4 style="margin-left: 10%">暂无费用明细</h4>
+                @}
+            </div>
+
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">线路轨迹</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-10">
+                    <div class="form-horizontal" id="container" style="margin-left: 50px;width: 100%; height: 500px;"></div>
+                    <div class="input-card" style="margin-left: 50px;">
+                        <h4>轨迹回放控制</h4>
+                        <div class="input-item">
+                            <input type="button" class="btn" value="开始动画" id="start" onclick="startAnimation()"/>
+                            <input type="button" class="btn" value="暂停动画" id="pause" onclick="pauseAnimation()"/>
+                            <input type="button" class="btn" value="继续动画" id="resume" onclick="resumeAnimation()"/>
+                            <input type="button" class="btn" value="停止动画" id="stop" onclick="stopAnimation()"/>
+                        </div>
+                        <div class="input-item">
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
+<script src="https://webapi.amap.com/maps?v=1.4.8&key=e17d799b2506d05faf7f88320a266803"></script>
+<script src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
+<script src="${ctxPath}/static/modular/system/tOrderCrossCity/tOrderCrossCity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_track.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_track.html
new file mode 100644
index 0000000..f749bb9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_track.html
@@ -0,0 +1,52 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    html, body, #container {
+        height: 100%;
+        width: 100%;
+    }
+
+    .input-card .btn{
+        margin-right: 1.2rem;
+        width: 9rem;
+    }
+
+    .input-card .btn:last-child{
+        margin-right: 0;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <input type="hidden" id="id" name="id" value="${tOrderCrossCityId}">
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">线路轨迹</h2>
+                </div>
+            </div>
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-10">
+                    <div class="form-horizontal" id="container" style="margin-left: 50px;width: 100%; height: 500px;"></div>
+                    <div class="input-card" style="margin-left: 50px;">
+                        <h4>轨迹回放控制</h4>
+                        <div class="input-item">
+                            <input type="button" class="btn" value="开始动画" id="start" onclick="startAnimation()"/>
+                            <input type="button" class="btn" value="暂停动画" id="pause" onclick="pauseAnimation()"/>
+                            <input type="button" class="btn" value="继续动画" id="resume" onclick="resumeAnimation()"/>
+                            <input type="button" class="btn" value="停止动画" id="stop" onclick="stopAnimation()"/>
+                        </div>
+                        <div class="input-item">
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+
+    </div>
+</div>
+<script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
+<script src="https://webapi.amap.com/maps?v=1.4.8&key=e17d799b2506d05faf7f88320a266803"></script>
+<script src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
+<script src="${ctxPath}/static/modular/system/tOrderCrossCity/tOrderCrossCity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate.html
new file mode 100644
index 0000000..4f9968a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate.html
@@ -0,0 +1,71 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>评价列表管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="评论时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="评论用户" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userPhone" name="评论用户手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="driverName" name="评论司机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="driverPhone" name="评论司机手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="fraction" name="评分分数" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="orderType" name="订单类型" >
+                                    <option value="">全部</option>
+                                    <option value="1">专车</option>
+                                    <option value="2">出租车</option>
+                                    <option value="3">跨城出行</option>
+                                    <option value="4">跨城小件物流</option>
+                                    <option value="5">同城小件物流</option>
+                                    <option value="6">包车</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TOrderEvaluate.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TOrderEvaluate.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TOrderEvaluateTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tOrderEvaluate/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TOrderEvaluate.openAddTOrderEvaluate()"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderEvaluate/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="TOrderEvaluate.openTOrderEvaluateDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderEvaluate/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TOrderEvaluate.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TOrderEvaluateTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderEvaluate/tOrderEvaluate.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate_add.html
new file mode 100644
index 0000000..7506902
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate_add.html
@@ -0,0 +1,33 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" underline="true"/>
+                            <#input id="orderId" name="订单id" underline="true"/>
+                            <#input id="driverId" name="司机id" underline="true"/>
+                            <#input id="orderType" name="1=专车,2=出租车,3=跨城出行,4=跨城小件物流,5=同城小件物流,6=包车"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="fraction" name="评分  0-5" underline="true"/>
+                            <#input id="content" name="评价内容" underline="true"/>
+                            <#input id="insertTime" name="评价时间" underline="true"/>
+                            <#input id="userId" name="评价用户ID" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderEvaluateInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderEvaluateInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderEvaluate/tOrderEvaluate_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate_edit.html
new file mode 100644
index 0000000..28b8bb2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderEvaluate/tOrderEvaluate_edit.html
@@ -0,0 +1,33 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" value="${item.id}" underline="true"/>
+                            <#input id="orderId" name="订单id" value="${item.orderId}" underline="true"/>
+                            <#input id="driverId" name="司机id" value="${item.driverId}" underline="true"/>
+                            <#input id="orderType" name="1=专车,2=出租车,3=跨城出行,4=跨城小件物流,5=同城小件物流,6=包车" value="${item.orderType}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="fraction" name="评分  0-5" value="${item.fraction}" underline="true"/>
+                            <#input id="content" name="评价内容" value="${item.content}" underline="true"/>
+                            <#input id="insertTime" name="评价时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="userId" name="评价用户ID" value="${item.userId}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderEvaluateInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderEvaluateInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderEvaluate/tOrderEvaluate_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics.html
new file mode 100644
index 0000000..047e4a8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics.html
@@ -0,0 +1,94 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>小件物流订单管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="订单时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="orderNum" name="订单编号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="type" name="订单类型" >
+                                    <option value="">全部</option>
+                                    <option value="4">同城物流</option>
+                                    <option value="5">跨城物流</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="orderSource" name="订单来源" >
+                                    <option value="">全部</option>
+                                    <option value="1">APP下单</option>
+                                    <option value="2">扫码下单</option>
+                                    <option value="3">小程序下单</option>
+                                    <option value="4">司机下单</option>
+                                    <option value="5">调度下单</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="下单用户昵称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userPhone" name="下单用户手机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="recipient" name="收货人姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="recipientPhone" name="收货人手机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="driver" name="接单司机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待接单</option>
+                                    <option value="2">待出发</option>
+                                    <option value="3">待到达预约地点</option>
+                                    <option value="4">待取货</option>
+                                    <option value="5">服务中</option>
+                                    <option value="6">完成服务</option>
+                                    <option value="7">待支付</option>
+                                    <option value="9">已完成</option>
+                                    <option value="10">已取消</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TOrderLogistics.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TOrderLogistics.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TOrderLogisticsTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tOrderLogistics/detail")){
+                                <#button name="订单详情" icon="fa-plus" clickFun="TOrderLogistics.detail()"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderLogistics/cancel")){
+                                <#button name="取消订单" icon="fa-edit" clickFun="TOrderLogistics.cancel()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderLogistics/delete")){
+                                <#button name="删除记录" icon="fa-remove" clickFun="TOrderLogistics.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TOrderLogisticsTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderLogistics/tOrderLogistics.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_add.html
new file mode 100644
index 0000000..c033fa7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_add.html
@@ -0,0 +1,82 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键id" underline="true"/>
+                            <#input id="type" name="订单类型(4=同城物流,5=跨城物流)" underline="true"/>
+                            <#input id="userId" name="用户id" underline="true"/>
+                            <#input id="driverId" name="接单司机ID" underline="true"/>
+                            <#input id="carId" name="车辆id" underline="true"/>
+                            <#input id="orderNum" name="订单号" underline="true"/>
+                            <#input id="cargoType" name="货物类型(1=普通货物,2=贵重货物)" underline="true"/>
+                            <#input id="cargoNumber" name="货物数量" underline="true"/>
+                            <#input id="remark" name="备注" underline="true"/>
+                            <#input id="placementLon" name="下单地点经度" underline="true"/>
+                            <#input id="placementLat" name="下单地点纬度" underline="true"/>
+                            <#input id="placementAddress" name="下单地点" underline="true"/>
+                            <#input id="startLon" name="出发地经度值" underline="true"/>
+                            <#input id="startLat" name="出发地纬度值" underline="true"/>
+                            <#input id="startAddress" name="出发地地点" underline="true"/>
+                            <#input id="endLon" name="目的地经度" underline="true"/>
+                            <#input id="endLat" name="目的地纬度" underline="true"/>
+                            <#input id="endAddress" name="目的地地点" underline="true"/>
+                            <#input id="recipient" name="收件人姓名" underline="true"/>
+                            <#input id="recipientPhone" name="收件人电话" underline="true"/>
+                            <#input id="boardingLon" name="上车点经度" underline="true"/>
+                            <#input id="boardingLat" name="上车点纬度" underline="true"/>
+                            <#input id="boardingAddress" name="上车点" underline="true"/>
+                            <#input id="boardingTime" name="上车时间" underline="true"/>
+                            <#input id="getoffLon" name="下车点经度" underline="true"/>
+                            <#input id="getoffLat" name="下车点纬度" underline="true"/>
+                            <#input id="getoffAddress" name="下车地点" underline="true"/>
+                            <#input id="getoffTime" name="下车时间" underline="true"/>
+                            <#input id="mileage" name="行驶里程数(米)"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="payManner" name="支付方式(1=OK平台支付,2=其他方式支付)" underline="true"/>
+                            <#input id="payType" name="支付方式(1=微信,2=支付宝,3=其他)" underline="true"/>
+                            <#input id="orderMoney" name="订单金额" underline="true"/>
+                            <#input id="travelMoney" name="行程费" underline="true"/>
+                            <#input id="tipMoney" name="小费" underline="true"/>
+                            <#input id="redPacketMoney" name="红包抵扣金额" underline="true"/>
+                            <#input id="couponMoney" name="优惠券抵扣金额" underline="true"/>
+                            <#input id="redPacketId" name="红包记录id" underline="true"/>
+                            <#input id="couponId" name="优惠券id" underline="true"/>
+                            <#input id="discount" name="折扣" underline="true"/>
+                            <#input id="discountMoney" name="折扣优惠金额" underline="true"/>
+                            <#input id="activityId" name="折扣活动id" underline="true"/>
+                            <#input id="companyId" name="公司id" underline="true"/>
+                            <#input id="payMoney" name="支付金额" underline="true"/>
+                            <#input id="state" name="状态(1=待接单,2=待出发,3=待到达预约地点,4=待取货,5=服务中,6=完成服务,7=待支付,9=已完成,10=已取消)" underline="true"/>
+                            <#input id="insertTime" name="下单时间" underline="true"/>
+                            <#input id="travelTime" name="出行时间" underline="true"/>
+                            <#input id="snatchOrderTime" name="抢单时间" underline="true"/>
+                            <#input id="setOutTime" name="司机点出发时间" underline="true"/>
+                            <#input id="arriveTime" name="司机到达预约地点时间" underline="true"/>
+                            <#input id="startServiceTime" name="开始服务时间" underline="true"/>
+                            <#input id="endServiceTime" name="结束服务时间" underline="true"/>
+                            <#input id="orderSource" name="下单方式(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)" underline="true"/>
+                            <#input id="invoiceId" name="发票id" underline="true"/>
+                            <#input id="trackId" name="高德猎鹰上的轨迹id" underline="true"/>
+                            <#input id="isDelete" name="是否删除  1=否 2=是" underline="true"/>
+                            <#input id="telX" name="移动小号" underline="true"/>
+                            <#input id="bindId" name="移动小号绑定关系id" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderLogisticsInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderLogisticsInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderLogistics/tOrderLogistics_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_detail.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_detail.html
new file mode 100644
index 0000000..b6cb775
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_detail.html
@@ -0,0 +1,63 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">订单详情</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#label id="insertTimeStr" name="下单时间" value="${item.insertTimeStr}"/>
+                    <#label id="orderSourceStr" name="订单来源" value="${item.orderSourceStr}"/>
+                    <#label id="userName" name="下单用户昵称" value="${item.userName}"/>
+                    <#label id="recipient" name="收货人昵称" value="${item.recipient}"/>
+                    <#label id="startAddress" name="起点" value="${item.startAddress}"/>
+                    <#label id="driver" name="接单司机" value="${item.driver}"/>
+                    <#label id="companyName" name="车辆所属机构" value="${item.companyName}"/>
+                </div>
+
+                <div class="col-sm-6">
+                    <#label id="typeStr" name="订单类型" value="${item.typeStr}"/>
+                    <#label id="orderNum" name="订单编号" value="${item.orderNum}"/>
+                    <#label id="travelTimeStr" name="乘车时间" value="${item.travelTimeStr}"/>
+                    <#label id="userPhone" name="下单用户手机号" value="${item.userPhone}"/>
+                    <#label id="passengersPhone" name="收货人手机号" value="${item.passengersPhone}"/>
+                    <#label id="endAddress" name="终点" value="${item.endAddress}"/>
+                    <#label id="car" name="接单车辆" value="${item.car}"/>
+                </div>
+            </div>
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">费用明细</h2>
+                </div>
+            </div>
+            <div class="row">
+                @if(isNotEmpty(item.orderMoney) && item.orderMoney > 0){
+                <div class="col-sm-6 b-r">
+                    <#label id="orderMoney" name="订单总价" value="${item.orderMoney}元"/>
+                    @if(isNotEmpty(item.payMoney)){
+                    <#label id="payMoney" name="实际支付费用" value="${item.payMoney}元"/>
+                    @}else{
+                    <#label id="payMoney" name="实际支付费用" value="0.00元"/>
+                    @}
+                    @if(isNotEmpty(item.couponMoney)){
+                    <#label id="couponMoney" name="优惠券抵扣费用" value="${item.couponMoney}元"/>
+                    @}else{
+                    <#label id="couponMoney" name="优惠券抵扣费用" value="0.00元"/>
+                    @}
+                </div>
+                <div class="col-sm-6">
+                    <#label id="payTypeStr" name="支付方式" value="${item.payTypeStr}"/>
+                </div>
+                @}else{
+                <h4 style="margin-left: 10%">暂无费用明细</h4>
+                @}
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderLogistics/tOrderLogistics_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_edit.html
new file mode 100644
index 0000000..46b7cb9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderLogistics/tOrderLogistics_edit.html
@@ -0,0 +1,82 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键id" value="${item.id}" underline="true"/>
+                            <#input id="type" name="订单类型(4=同城物流,5=跨城物流)" value="${item.type}" underline="true"/>
+                            <#input id="userId" name="用户id" value="${item.userId}" underline="true"/>
+                            <#input id="driverId" name="接单司机ID" value="${item.driverId}" underline="true"/>
+                            <#input id="carId" name="车辆id" value="${item.carId}" underline="true"/>
+                            <#input id="orderNum" name="订单号" value="${item.orderNum}" underline="true"/>
+                            <#input id="cargoType" name="货物类型(1=普通货物,2=贵重货物)" value="${item.cargoType}" underline="true"/>
+                            <#input id="cargoNumber" name="货物数量" value="${item.cargoNumber}" underline="true"/>
+                            <#input id="remark" name="备注" value="${item.remark}" underline="true"/>
+                            <#input id="placementLon" name="下单地点经度" value="${item.placementLon}" underline="true"/>
+                            <#input id="placementLat" name="下单地点纬度" value="${item.placementLat}" underline="true"/>
+                            <#input id="placementAddress" name="下单地点" value="${item.placementAddress}" underline="true"/>
+                            <#input id="startLon" name="出发地经度值" value="${item.startLon}" underline="true"/>
+                            <#input id="startLat" name="出发地纬度值" value="${item.startLat}" underline="true"/>
+                            <#input id="startAddress" name="出发地地点" value="${item.startAddress}" underline="true"/>
+                            <#input id="endLon" name="目的地经度" value="${item.endLon}" underline="true"/>
+                            <#input id="endLat" name="目的地纬度" value="${item.endLat}" underline="true"/>
+                            <#input id="endAddress" name="目的地地点" value="${item.endAddress}" underline="true"/>
+                            <#input id="recipient" name="收件人姓名" value="${item.recipient}" underline="true"/>
+                            <#input id="recipientPhone" name="收件人电话" value="${item.recipientPhone}" underline="true"/>
+                            <#input id="boardingLon" name="上车点经度" value="${item.boardingLon}" underline="true"/>
+                            <#input id="boardingLat" name="上车点纬度" value="${item.boardingLat}" underline="true"/>
+                            <#input id="boardingAddress" name="上车点" value="${item.boardingAddress}" underline="true"/>
+                            <#input id="boardingTime" name="上车时间" value="${item.boardingTime}" underline="true"/>
+                            <#input id="getoffLon" name="下车点经度" value="${item.getoffLon}" underline="true"/>
+                            <#input id="getoffLat" name="下车点纬度" value="${item.getoffLat}" underline="true"/>
+                            <#input id="getoffAddress" name="下车地点" value="${item.getoffAddress}" underline="true"/>
+                            <#input id="getoffTime" name="下车时间" value="${item.getoffTime}" underline="true"/>
+                            <#input id="mileage" name="行驶里程数(米)" value="${item.mileage}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="payManner" name="支付方式(1=OK平台支付,2=其他方式支付)" value="${item.payManner}" underline="true"/>
+                            <#input id="payType" name="支付方式(1=微信,2=支付宝,3=其他)" value="${item.payType}" underline="true"/>
+                            <#input id="orderMoney" name="订单金额" value="${item.orderMoney}" underline="true"/>
+                            <#input id="travelMoney" name="行程费" value="${item.travelMoney}" underline="true"/>
+                            <#input id="tipMoney" name="小费" value="${item.tipMoney}" underline="true"/>
+                            <#input id="redPacketMoney" name="红包抵扣金额" value="${item.redPacketMoney}" underline="true"/>
+                            <#input id="couponMoney" name="优惠券抵扣金额" value="${item.couponMoney}" underline="true"/>
+                            <#input id="redPacketId" name="红包记录id" value="${item.redPacketId}" underline="true"/>
+                            <#input id="couponId" name="优惠券id" value="${item.couponId}" underline="true"/>
+                            <#input id="discount" name="折扣" value="${item.discount}" underline="true"/>
+                            <#input id="discountMoney" name="折扣优惠金额" value="${item.discountMoney}" underline="true"/>
+                            <#input id="activityId" name="折扣活动id" value="${item.activityId}" underline="true"/>
+                            <#input id="companyId" name="公司id" value="${item.companyId}" underline="true"/>
+                            <#input id="payMoney" name="支付金额" value="${item.payMoney}" underline="true"/>
+                            <#input id="state" name="状态(1=待接单,2=待出发,3=待到达预约地点,4=待取货,5=服务中,6=完成服务,7=待支付,9=已完成,10=已取消)" value="${item.state}" underline="true"/>
+                            <#input id="insertTime" name="下单时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="travelTime" name="出行时间" value="${item.travelTime}" underline="true"/>
+                            <#input id="snatchOrderTime" name="抢单时间" value="${item.snatchOrderTime}" underline="true"/>
+                            <#input id="setOutTime" name="司机点出发时间" value="${item.setOutTime}" underline="true"/>
+                            <#input id="arriveTime" name="司机到达预约地点时间" value="${item.arriveTime}" underline="true"/>
+                            <#input id="startServiceTime" name="开始服务时间" value="${item.startServiceTime}" underline="true"/>
+                            <#input id="endServiceTime" name="结束服务时间" value="${item.endServiceTime}" underline="true"/>
+                            <#input id="orderSource" name="下单方式(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)" value="${item.orderSource}" underline="true"/>
+                            <#input id="invoiceId" name="发票id" value="${item.invoiceId}" underline="true"/>
+                            <#input id="trackId" name="高德猎鹰上的轨迹id" value="${item.trackId}" underline="true"/>
+                            <#input id="isDelete" name="是否删除  1=否 2=是" value="${item.isDelete}" underline="true"/>
+                            <#input id="telX" name="移动小号" value="${item.telX}" underline="true"/>
+                            <#input id="bindId" name="移动小号绑定关系id" value="${item.bindId}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderLogisticsInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderLogisticsInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderLogistics/tOrderLogistics_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar.html
new file mode 100644
index 0000000..1ff3203
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar.html
@@ -0,0 +1,101 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>专车订单管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="订单时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="orderNum" name="订单编号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="orderSource" name="订单来源" >
+                                    <option value="">全部</option>
+                                    <option value="1">APP下单</option>
+                                    <option value="2">扫码下单</option>
+                                    <option value="3">小程序下单</option>
+                                    <option value="4">司机下单</option>
+                                    <option value="5">调度下单</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="下单用户昵称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userPhone" name="下单用户手机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="passengers" name="乘车用户姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="passengersPhone" name="乘车用户手机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="serverCarModelId" name="车型" >
+                                    <option value="">全部</option>
+                                    @for(obj in carmodelList){
+                                    <option value="${obj.id}">${obj.name}</option>
+                                    @}
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="driver" name="接单司机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待接单</option>
+                                    <option value="2">待出发</option>
+                                    <option value="3">待到达预约地点</option>
+                                    <option value="4">待乘客上车</option>
+                                    <option value="5">服务中</option>
+                                    <option value="6">完成服务</option>
+                                    <option value="7">待支付</option>
+                                    <option value="8">待评价</option>
+                                    <option value="9">已完成</option>
+                                    <option value="10">已取消</option>
+                                    <option value="11">改派中</option>
+                                    <option value="12">取消待支付</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TOrderPrivateCar.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TOrderPrivateCar.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TOrderPrivateCarTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tOrderPrivateCar/orderDetail")){
+                                <#button name="订单详情" icon="fa-plus" clickFun="TOrderPrivateCar.orderDetail()"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderPrivateCar/cancelOrder")){
+                                <#button name="取消订单" icon="fa-edit" clickFun="TOrderPrivateCar.cancelOrder()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderPrivateCar/orderTrack")){
+                                <#button name="订单轨迹" icon="fa-edit" clickFun="TOrderPrivateCar.trajectory()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderPrivateCar/deleteOrder")){
+                                <#button name="删除记录" icon="fa-remove" clickFun="TOrderPrivateCar.deleteOrder()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TOrderPrivateCarTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderPrivateCar/tOrderPrivateCar.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_add.html
new file mode 100644
index 0000000..e5b17b4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_add.html
@@ -0,0 +1,89 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键id" underline="true"/>
+                            <#input id="type" name="类型(1=普通订单,2=摆渡订单)" underline="true"/>
+                            <#input id="userId" name="用户id" underline="true"/>
+                            <#input id="driverId" name="接单司机ID" underline="true"/>
+                            <#input id="carId" name="车辆id" underline="true"/>
+                            <#input id="orderNum" name="订单号" underline="true"/>
+                            <#input id="placementLon" name="下单地点经度" underline="true"/>
+                            <#input id="placementLat" name="下单地点纬度" underline="true"/>
+                            <#input id="placementAddress" name="下单地点" underline="true"/>
+                            <#input id="startLon" name="出发地经度值" underline="true"/>
+                            <#input id="startLat" name="出发地纬度值" underline="true"/>
+                            <#input id="endLon" name="目的地经度" underline="true"/>
+                            <#input id="startAddress" name="出发地地点" underline="true"/>
+                            <#input id="endLat" name="目的地纬度" underline="true"/>
+                            <#input id="endAddress" name="目的地地点" underline="true"/>
+                            <#input id="boardingLon" name="上车点经度" underline="true"/>
+                            <#input id="boardingLat" name="上车点纬度" underline="true"/>
+                            <#input id="boardingAddress" name="上车点" underline="true"/>
+                            <#input id="boardingTime" name="上车时间" underline="true"/>
+                            <#input id="getoffLon" name="下车点经度" underline="true"/>
+                            <#input id="getoffLat" name="下车点纬度" underline="true"/>
+                            <#input id="getoffAddress" name="下车地点" underline="true"/>
+                            <#input id="getoffTime" name="下车时间" underline="true"/>
+                            <#input id="mileage" name="行驶里程数(米)" underline="true"/>
+                            <#input id="payManner" name="支付方式(1=OK平台支付,2=其他方式支付)" underline="true"/>
+                            <#input id="payType" name="支付方式(1=微信,2=支付宝,3=其他)" underline="true"/>
+                            <#input id="orderMoney" name="订单金额" underline="true"/>
+                            <#input id="startMoney" name="起步价" underline="true"/>
+                            <#input id="mileageMoney" name="里程费" underline="true"/>
+                            <#input id="durationMoney" name="时长费" underline="true"/>
+                            <#input id="longDistanceMoney" name="远途费" underline="true"/>
+                            <#input id="parkMoney" name="停车费"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="roadTollMoney" name="过路费" underline="true"/>
+                            <#input id="redPacketMoney" name="红包抵扣金额" underline="true"/>
+                            <#input id="couponMoney" name="优惠券抵扣金额" underline="true"/>
+                            <#input id="redPacketId" name="红包记录id" underline="true"/>
+                            <#input id="couponId" name="优惠券id" underline="true"/>
+                            <#input id="discount" name="折扣" underline="true"/>
+                            <#input id="discountMoney" name="折扣优惠金额" underline="true"/>
+                            <#input id="activityId" name="折扣活动id" underline="true"/>
+                            <#input id="companyId" name="公司id" underline="true"/>
+                            <#input id="payMoney" name="支付金额" underline="true"/>
+                            <#input id="substitute" name="是否是代下单(0:否,1:是)" underline="true"/>
+                            <#input id="passengers" name="乘车人" underline="true"/>
+                            <#input id="passengersPhone" name="乘车人电话" underline="true"/>
+                            <#input id="state" name="状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)" underline="true"/>
+                            <#input id="insertTime" name="下单时间" underline="true"/>
+                            <#input id="travelTime" name="出行时间" underline="true"/>
+                            <#input id="snatchOrderTime" name="抢单时间" underline="true"/>
+                            <#input id="setOutTime" name="司机点出发时间" underline="true"/>
+                            <#input id="arriveTime" name="司机到达预约地点时间" underline="true"/>
+                            <#input id="startServiceTime" name="开始服务时间" underline="true"/>
+                            <#input id="endServiceTime" name="结束服务时间" underline="true"/>
+                            <#input id="orderType" name="订单类型(1=普通,2=预约)" underline="true"/>
+                            <#input id="orderSource" name="下单方式(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)" underline="true"/>
+                            <#input id="invoiceId" name="发票id" underline="true"/>
+                            <#input id="isReassign" name="是否是改派单(1=否,2=是)" underline="true"/>
+                            <#input id="reassignNotice" name="改派通知(0=没有改派,1=改派中,2=已改派)" underline="true"/>
+                            <#input id="trackId" name="高德猎鹰上的轨迹id" underline="true"/>
+                            <#input id="isDelete" name="是否删除  1=否 2=是" underline="true"/>
+                            <#input id="oldState" name="状态(改派前订单状态)" underline="true"/>
+                            <#input id="telX" name="移动小号" underline="true"/>
+                            <#input id="bindId" name="移动小号绑定关系id" underline="true"/>
+                            <#input id="serverCarModelId" name="专车车型ID  关联t_server_carmodel表" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderPrivateCarInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderPrivateCarInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderPrivateCar/tOrderPrivateCar_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_orderDetail.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_orderDetail.html
new file mode 100644
index 0000000..f5acceb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_orderDetail.html
@@ -0,0 +1,115 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    html, body, #container {
+        height: 100%;
+        width: 100%;
+    }
+
+    .input-card .btn{
+        margin-right: 1.2rem;
+        width: 9rem;
+    }
+
+    .input-card .btn:last-child{
+        margin-right: 0;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">订单详情</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#label id="insertTimeStr" name="下单时间" value="${item.insertTimeStr}"/>
+                    <#label id="orderSourceStr" name="订单来源" value="${item.orderSourceStr}"/>
+                    <#label id="userName" name="下单用户昵称" value="${item.userName}"/>
+                    <#label id="passengers" name="乘车用户昵称" value="${item.passengers}"/>
+                    <#label id="placementAddress" name="起点" value="${item.startAddress}"/>
+                    <#label id="serverCarModel" name="选择车型" value="${item.serverCarModel}"/>
+                    <#label id="car" name="接单车辆" value="${item.car}"/>
+                    <#label id="boardingAddress" name="上车地点" value="${item.boardingAddress}"/>
+                    <#label id="getoffAddress" name="下车地点" value="${item.getoffAddress}"/>
+                </div>
+
+                <div class="col-sm-6">
+                    <#label id="orderNum" name="订单编号" value="${item.orderNum}"/>
+                    <#label id="travelTimeStr" name="乘车时间" value="${item.travelTimeStr}"/>
+                    <#label id="userPhone" name="下单用户手机号" value="${item.userPhone}"/>
+                    <#label id="passengersPhone" name="乘车用户手机号" value="${item.passengersPhone}"/>
+                    <#label id="endAddress" name="终点" value="${item.endAddress}"/>
+                    <#label id="driver" name="接单司机" value="${item.driver}"/>
+                    <#label id="companyName" name="车辆所属机构" value="${item.companyName}"/>
+                    <#label id="boardingTimeStr" name="上车时间" value="${item.boardingTimeStr}"/>
+                    <#label id="getoffTimeStr" name="下车时间" value="${item.getoffTimeStr}"/>
+                </div>
+            </div>
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">费用明细</h2>
+                </div>
+            </div>
+            <div class="row">
+                @if(isNotEmpty(item.orderMoney) && item.orderMoney > 0){
+                    <div class="col-sm-6 b-r">
+                        <#label id="orderMoney" name="订单总价" value="${item.orderMoney}元"/>
+                        <#label id="travelMoney" name="行程费" value="${item.travelMoney}元"/>
+                        <#label id="parkMoney" name="停车费" value="${item.parkMoney}元"/>
+                        <#label id="roadTollMoney" name="过路费" value="${item.roadTollMoney}元"/>
+                        <#label id="tipMoney" name="小费" value="${item.tipMoney}元"/>
+
+                        @if(isNotEmpty(item.payMoney)){
+                        <#label id="payMoney" name="实际支付费用" value="${item.payMoney}元"/>
+                        @}else{
+                        <#label id="payMoney" name="实际支付费用" value="0.00元"/>
+                        @}
+
+                        <#label id="payTypeStr" name="支付方式" value="${item.payTypeStr}"/>
+                        <#label id="couponMoney" name="优惠券抵扣费用" value="${item.couponMoney}元"/>
+                        <#label id="redPacketMoney" name="红包抵扣金额" value="${item.redPacketMoney}元"/>
+                    </div>
+                    <div class="col-sm-6">
+                        <#label id="platIncome" name="平台收益" value="${item.platIncome}元"/>
+                        <#label id="companyIncome" name="分公司收益" value="${item.companyIncome}元"/>
+                        <#label id="franchiseeIncome" name="加盟商收益" value="${item.franchiseeIncome}元"/>
+                        <#label id="driverIncome" name="司机收益" value="${item.driverIncome}元"/>
+                    </div>
+                @}else{
+                <h4 style="margin-left: 10%">暂无费用明细</h4>
+                @}
+            </div>
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">线路轨迹</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-10">
+                    <div class="form-horizontal" id="container" style="margin-left: 50px;width: 100%; height: 500px;"></div>
+                    <div class="input-card" style="margin-left: 50px;">
+                        <h4>轨迹回放控制</h4>
+                        <div class="input-item">
+                            <input type="button" class="btn" value="开始动画" id="start" onclick="startAnimation()"/>
+                            <input type="button" class="btn" value="暂停动画" id="pause" onclick="pauseAnimation()"/>
+                            <input type="button" class="btn" value="继续动画" id="resume" onclick="resumeAnimation()"/>
+                            <input type="button" class="btn" value="停止动画" id="stop" onclick="stopAnimation()"/>
+                        </div>
+                        <div class="input-item">
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
+<script src="https://webapi.amap.com/maps?v=1.4.8&key=e17d799b2506d05faf7f88320a266803"></script>
+<script src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
+<script src="${ctxPath}/static/modular/system/tOrderPrivateCar/tOrderPrivateCar_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_trajectory.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_trajectory.html
new file mode 100644
index 0000000..308863e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_trajectory.html
@@ -0,0 +1,52 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    html, body, #container {
+        height: 100%;
+        width: 100%;
+    }
+
+    .input-card .btn{
+        margin-right: 1.2rem;
+        width: 9rem;
+    }
+
+    .input-card .btn:last-child{
+        margin-right: 0;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <input type="hidden" id="id" name="id" value="${tOrderPrivateCarId}">
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">线路轨迹</h2>
+                </div>
+            </div>
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-10">
+                    <div class="form-horizontal" id="container" style="margin-left: 50px;width: 100%; height: 500px;"></div>
+                    <div class="input-card" style="margin-left: 50px;">
+                        <h4>轨迹回放控制</h4>
+                        <div class="input-item">
+                            <input type="button" class="btn" value="开始动画" id="start" onclick="startAnimation()"/>
+                            <input type="button" class="btn" value="暂停动画" id="pause" onclick="pauseAnimation()"/>
+                            <input type="button" class="btn" value="继续动画" id="resume" onclick="resumeAnimation()"/>
+                            <input type="button" class="btn" value="停止动画" id="stop" onclick="stopAnimation()"/>
+                        </div>
+                        <div class="input-item">
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+
+    </div>
+</div>
+<script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
+<script src="https://webapi.amap.com/maps?v=1.4.8&key=e17d799b2506d05faf7f88320a266803"></script>
+<script src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
+<script src="${ctxPath}/static/modular/system/tOrderPrivateCar/tOrderPrivateCar_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi.html
new file mode 100644
index 0000000..47ec8b9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi.html
@@ -0,0 +1,97 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>出租车订单管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="下单时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="orderNum" name="订单编号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="orderSource" name="订单来源" >
+                                    <option value="">全部</option>
+                                    <option value="1">APP下单</option>
+                                    <option value="2">扫码下单</option>
+                                    <option value="3">小程序下单</option>
+                                    <option value="4">司机下单</option>
+                                    <option value="5">调度下单</option>
+                                    <option value="6">道行龙城下单</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="下单用户昵称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userPhone" name="下单用户手机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="passengers" name="乘车用户姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="passengersPhone" name="乘车用户手机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="driver" name="接单司机" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待接单</option>
+                                    <option value="2">待出发</option>
+                                    <option value="3">待到达预约地点</option>
+                                    <option value="4">待乘客上车</option>
+                                    <option value="5">服务中</option>
+                                    <option value="6">完成服务</option>
+                                    <option value="7">待支付</option>
+                                    <option value="8">待评价</option>
+                                    <option value="9">已完成</option>
+                                    <option value="10">已取消</option>
+                                    <option value="11">改派中</option>
+                                    <option value="12">取消待支付</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TOrderTaxi.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TOrderTaxi.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TOrderTaxiTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tOrderTaxi/detail")){
+                                <#button name="订单详情" icon="fa-plus" clickFun="TOrderTaxi.detail()"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderTaxi/cancel")){
+                                <#button name="取消订单" icon="fa-edit" clickFun="TOrderTaxi.cancel()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderTaxi/trajectory")){
+                                <#button name="订单轨迹" icon="fa-remove" clickFun="TOrderTaxi.trajectory()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderTaxi/delete")){
+                                <#button name="删除记录" icon="fa-remove" clickFun="TOrderTaxi.delete()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tOrderTaxi/changeOrder")){
+                                <#button name="改派订单" icon="fa-remove" clickFun="TOrderTaxi.changeOrder()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TOrderTaxiTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderTaxi/tOrderTaxi.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_add.html
new file mode 100644
index 0000000..d293fd0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_add.html
@@ -0,0 +1,76 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键id" underline="true"/>
+                            <#input id="userId" name="用户id" underline="true"/>
+                            <#input id="driverId" name="接单司机ID" underline="true"/>
+                            <#input id="carId" name="车辆id" underline="true"/>
+                            <#input id="orderNum" name="订单号" underline="true"/>
+                            <#input id="placementLon" name="下单地点经度" underline="true"/>
+                            <#input id="placementLat" name="下单地点纬度" underline="true"/>
+                            <#input id="placementAddress" name="下单地点" underline="true"/>
+                            <#input id="startLon" name="出发地经度值" underline="true"/>
+                            <#input id="startLat" name="出发地纬度值" underline="true"/>
+                            <#input id="endLon" name="目的地经度" underline="true"/>
+                            <#input id="startAddress" name="出发地地点" underline="true"/>
+                            <#input id="endLat" name="目的地纬度" underline="true"/>
+                            <#input id="endAddress" name="目的地地点" underline="true"/>
+                            <#input id="boardingLon" name="上车点经度" underline="true"/>
+                            <#input id="boardingLat" name="上车点纬度" underline="true"/>
+                            <#input id="boardingAddress" name="上车点" underline="true"/>
+                            <#input id="boardingTime" name="上车时间" underline="true"/>
+                            <#input id="getoffLon" name="下车点经度" underline="true"/>
+                            <#input id="getoffLat" name="下车点纬度" underline="true"/>
+                            <#input id="getoffAddress" name="下车地点" underline="true"/>
+                            <#input id="getoffTime" name="下车时间" underline="true"/>
+                            <#input id="mileage" name="行驶里程数(米)" underline="true"/>
+                            <#input id="payManner" name="支付方式(1=OK平台支付,2=其他方式支付)" underline="true"/>
+                            <#input id="payType" name="支付方式(1=微信,2=支付宝,3=其他)" underline="true"/>
+                            <#input id="orderMoney" name="订单金额"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="travelMoney" name="行程费" underline="true"/>
+                            <#input id="parkMoney" name="停车费" underline="true"/>
+                            <#input id="roadTollMoney" name="过路费" underline="true"/>
+                            <#input id="tipMoney" name="小费" underline="true"/>
+                            <#input id="redPacketMoney" name="红包抵扣金额" underline="true"/>
+                            <#input id="couponMoney" name="优惠券抵扣金额" underline="true"/>
+                            <#input id="redPacketId" name="红包记录id" underline="true"/>
+                            <#input id="couponId" name="优惠券id" underline="true"/>
+                            <#input id="companyId" name="公司id" underline="true"/>
+                            <#input id="payMoney" name="支付金额" underline="true"/>
+                            <#input id="substitute" name="是否是代下单(0:否,1:是)" underline="true"/>
+                            <#input id="passengers" name="乘车人" underline="true"/>
+                            <#input id="passengersPhone" name="乘车人电话" underline="true"/>
+                            <#input id="state" name="状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中)" underline="true"/>
+                            <#input id="insertTime" name="下单时间" underline="true"/>
+                            <#input id="travelTime" name="出行时间" underline="true"/>
+                            <#input id="snatchOrderTime" name="抢单时间" underline="true"/>
+                            <#input id="setOutTime" name="司机点出发时间" underline="true"/>
+                            <#input id="arriveTime" name="司机到达预约地点时间" underline="true"/>
+                            <#input id="startServiceTime" name="开始服务时间" underline="true"/>
+                            <#input id="endServiceTime" name="结束服务时间" underline="true"/>
+                            <#input id="orderType" name="订单类型(1=普通,2=预约)" underline="true"/>
+                            <#input id="orderSource" name="下单方式(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)" underline="true"/>
+                            <#input id="invoiceId" name="发票id" underline="true"/>
+                            <#input id="isReassign" name="是否是改派单(1=否,2=是)" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderTaxiInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderTaxiInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderTaxi/tOrderTaxi_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_changeOrder.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_changeOrder.html
new file mode 100644
index 0000000..055996b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_changeOrder.html
@@ -0,0 +1,35 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>选择改派司机</h5>
+            </div>
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <input type="hidden" id="companyId" name="companyId" value="${item.companyId}">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="司机姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="司机手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SelectDriver.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="SelectDriver.resetSearch()" space="true"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="SelectDriver.selectDriver()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SelectDriver.close()" space="true"/>
+                            </div>
+                        </div>
+                        <#table id="SelectDriverTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tOrderTaxi/selectDriver.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_edit.html
new file mode 100644
index 0000000..d72664d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_edit.html
@@ -0,0 +1,108 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    html, body, #container {
+        height: 100%;
+        width: 100%;
+    }
+
+    .input-card .btn{
+        margin-right: 1.2rem;
+        width: 9rem;
+    }
+
+    .input-card .btn:last-child{
+        margin-right: 0;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">订单详情</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#label id="insertTimeStr" name="下单时间" value="${item.insertTimeStr}"/>
+                    <#label id="orderSourceStr" name="订单来源" value="${item.orderSourceStr}"/>
+                    <#label id="userName" name="下单用户昵称" value="${item.userName}"/>
+                    <#label id="passengers" name="乘车用户昵称" value="${item.passengers}"/>
+                    <#label id="placementAddress" name="起点" value="${item.startAddress}"/>
+                    <#label id="driver" name="接单司机" value="${item.driver}"/>
+                    <#label id="car" name="接单车辆" value="${item.car}"/>
+                    <#label id="boardingAddress" name="上车地点" value="${item.boardingAddress}"/>
+                    <#label id="getoffAddress" name="下车地点" value="${item.getoffAddress}"/>
+                </div>
+
+                <div class="col-sm-6">
+                    <#label id="orderNum" name="订单编号" value="${item.orderNum}"/>
+                    <#label id="travelTimeStr" name="乘车时间" value="${item.travelTimeStr}"/>
+                    <#label id="userPhone" name="下单用户手机号" value="${item.userPhone}"/>
+                    <#label id="passengersPhone" name="乘车用户手机号" value="${item.passengersPhone}"/>
+                    <#label id="endAddress" name="终点" value="${item.endAddress}"/>
+                    <#label id="companyName" name="车辆所属机构" value="${item.companyName}"/>
+                    <#label id="boardingTimeStr" name="上车时间" value="${item.boardingTimeStr}"/>
+                    <#label id="getoffTimeStr" name="下车时间" value="${item.getoffTimeStr}"/>
+                </div>
+            </div>
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">费用明细</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6">
+                    @if(isNotEmpty(item.orderMoney) && item.orderMoney > 0){
+                        <#label id="orderMoney" name="订单总价" value="${item.orderMoney}元"/>
+
+                        <#label id="travelMoney" name="行程费" value="${item.travelMoney}元"/>
+                        <#label id="parkMoney" name="停车费" value="${item.parkMoney}元"/>
+                        <#label id="roadTollMoney" name="过路费" value="${item.roadTollMoney}元"/>
+                        <#label id="tipMoney" name="小费" value="${item.tipMoney}元"/>
+                        @if(isNotEmpty(item.payMoney)){
+                        <#label id="payMoney" name="实际支付费用" value="${item.payMoney}元"/>
+                        @}else{
+                        <#label id="payMoney" name="实际支付费用" value="0.00元"/>
+                        @}
+                        <#label id="payTypeStr" name="支付方式" value="${item.payTypeStr}"/>
+                        <#label id="couponMoney" name="优惠券抵扣费用" value="${item.couponMoney}元"/>
+                        <#label id="redPacketMoney" name="红包抵扣金额" value="${item.redPacketMoney}元"/>
+                    @}else{
+                        <h4 style="margin-left: 10%">暂无费用明细</h4>
+                    @}
+                </div>
+            </div>
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">线路轨迹</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-10">
+                    <div class="form-horizontal" id="container" style="margin-left: 50px;width: 100%; height: 500px;"></div>
+                    <div class="input-card" style="margin-left: 50px;">
+                        <h4>轨迹回放控制</h4>
+                        <div class="input-item">
+                            <input type="button" class="btn" value="开始动画" id="start" onclick="startAnimation()"/>
+                            <input type="button" class="btn" value="暂停动画" id="pause" onclick="pauseAnimation()"/>
+                            <input type="button" class="btn" value="继续动画" id="resume" onclick="resumeAnimation()"/>
+                            <input type="button" class="btn" value="停止动画" id="stop" onclick="stopAnimation()"/>
+                        </div>
+                        <div class="input-item">
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+
+    </div>
+</div>
+<script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
+<script src="https://webapi.amap.com/maps?v=1.4.8&key=e17d799b2506d05faf7f88320a266803"></script>
+<script src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
+<script src="${ctxPath}/static/modular/system/tOrderTaxi/tOrderTaxi_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_trajectory.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_trajectory.html
new file mode 100644
index 0000000..6bdd85e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTaxi/tOrderTaxi_trajectory.html
@@ -0,0 +1,52 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+    html, body, #container {
+        height: 100%;
+        width: 100%;
+    }
+
+    .input-card .btn{
+        margin-right: 1.2rem;
+        width: 9rem;
+    }
+
+    .input-card .btn:last-child{
+        margin-right: 0;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <input type="hidden" id="id" name="id" value="${tOrderTaxiId}">
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">线路轨迹</h2>
+                </div>
+            </div>
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-10">
+                    <div class="form-horizontal" id="container" style="margin-left: 50px;width: 100%; height: 500px;"></div>
+                    <div class="input-card" style="margin-left: 50px;">
+                        <h4>轨迹回放控制</h4>
+                        <div class="input-item">
+                            <input type="button" class="btn" value="开始动画" id="start" onclick="startAnimation()"/>
+                            <input type="button" class="btn" value="暂停动画" id="pause" onclick="pauseAnimation()"/>
+                            <input type="button" class="btn" value="继续动画" id="resume" onclick="resumeAnimation()"/>
+                            <input type="button" class="btn" value="停止动画" id="stop" onclick="stopAnimation()"/>
+                        </div>
+                        <div class="input-item">
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+
+    </div>
+</div>
+<script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
+<script src="https://webapi.amap.com/maps?v=1.4.8&key=e17d799b2506d05faf7f88320a266803"></script>
+<script src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
+<script src="${ctxPath}/static/modular/system/tOrderTaxi/tOrderTaxi_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem.html
new file mode 100644
index 0000000..23ccd05
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem.html
@@ -0,0 +1,49 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>用户留言管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="提问时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="留言用户" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="处理状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待处理</option>
+                                    <option value="2">已处理</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TProblem.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TProblem.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TProblemTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tProblem/immediately")){
+                                <#button name="立即处理" icon="fa-plus" clickFun="TProblem.immediately()"/>
+                            @}
+                        </div>
+                        <#table id="TProblemTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tProblem/tProblem.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_add.html
new file mode 100644
index 0000000..df5620a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_add.html
@@ -0,0 +1,33 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" underline="true"/>
+                            <#input id="userId" name="用户id" underline="true"/>
+                            <#input id="content" name="提问内容" underline="true"/>
+                            <#input id="answer" name="回答内容"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="handleUserId" name="处理人id" underline="true"/>
+                            <#input id="handleTime" name="处理时间" underline="true"/>
+                            <#input id="insertTime" name="提问时间" underline="true"/>
+                            <#input id="state" name="状态(1=待处理,2=已处理)" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TProblemInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TProblemInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tProblem/tProblem_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_edit.html
new file mode 100644
index 0000000..09cb49c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_edit.html
@@ -0,0 +1,33 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" value="${item.id}" underline="true"/>
+                            <#input id="userId" name="用户id" value="${item.userId}" underline="true"/>
+                            <#input id="content" name="提问内容" value="${item.content}" underline="true"/>
+                            <#input id="answer" name="回答内容" value="${item.answer}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="handleUserId" name="处理人id" value="${item.handleUserId}" underline="true"/>
+                            <#input id="handleTime" name="处理时间" value="${item.handleTime}" underline="true"/>
+                            <#input id="insertTime" name="提问时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="state" name="状态(1=待处理,2=已处理)" value="${item.state}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TProblemInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TProblemInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tProblem/tProblem_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_immediately.html
new file mode 100644
index 0000000..bf912ed
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tProblem/tProblem_immediately.html
@@ -0,0 +1,28 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="problemInfoForm">
+            <input type="hidden" id="tProblemId" name="tProblemId" value="${tProblemId}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">回复内容:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="answer" id="answer" style="width:100%;height:150px;" placeholder="多行输入,最多500字"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TProblemInfoDlg.immediately()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TProblemInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tProblem/tProblem_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal.html
new file mode 100644
index 0000000..317fb0f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal.html
@@ -0,0 +1,49 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>提现列表管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="申请时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="提现人" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="withdrawalType" name="提现方式" >
+                                    <option value="">全部</option>
+                                    <option value="1">银行卡</option>
+                                    <option value="2">线下</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TPubWithdrawal.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TPubWithdrawal.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TPubWithdrawalTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tPubWithdrawal/immediately")){
+                                <#button name="立即处理" icon="fa-edit" clickFun="TPubWithdrawal.immediately()"/>
+                            @}
+                        </div>
+                        <#table id="TPubWithdrawalTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tPubWithdrawal/tPubWithdrawal.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_add.html
new file mode 100644
index 0000000..c23416c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_add.html
@@ -0,0 +1,38 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键id" underline="true"/>
+                            <#input id="userId" name="用户id" underline="true"/>
+                            <#input id="handleTime" name="处理时间" underline="true"/>
+                            <#input id="balance" name="原钱包余额" underline="true"/>
+                            <#input id="money" name="提现金额" underline="true"/>
+                            <#input id="state" name="状态(1=待处理,2=成功,3=失败)" underline="true"/>
+                            <#input id="remark" name="备注"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="code" name="银行账号" underline="true"/>
+                            <#input id="name" name="账户持有人姓名" underline="true"/>
+                            <#input id="userType" name="用户类型(1=用户,2=司机)" underline="true"/>
+                            <#input id="insertTime" name="申请时间" underline="true"/>
+                            <#input id="flag" name="1:创建,2:修改,3:删除" underline="true"/>
+                            <#input id="withdrawalType" name="提现方式 1=银行卡  2=线下" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TPubWithdrawalInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TPubWithdrawalInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tPubWithdrawal/tPubWithdrawal_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_edit.html
new file mode 100644
index 0000000..2b01284
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_edit.html
@@ -0,0 +1,38 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键id" value="${item.id}" underline="true"/>
+                            <#input id="userId" name="用户id" value="${item.userId}" underline="true"/>
+                            <#input id="handleTime" name="处理时间" value="${item.handleTime}" underline="true"/>
+                            <#input id="balance" name="原钱包余额" value="${item.balance}" underline="true"/>
+                            <#input id="money" name="提现金额" value="${item.money}" underline="true"/>
+                            <#input id="state" name="状态(1=待处理,2=成功,3=失败)" value="${item.state}" underline="true"/>
+                            <#input id="remark" name="备注" value="${item.remark}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="code" name="银行账号" value="${item.code}" underline="true"/>
+                            <#input id="name" name="账户持有人姓名" value="${item.name}" underline="true"/>
+                            <#input id="userType" name="用户类型(1=用户,2=司机)" value="${item.userType}" underline="true"/>
+                            <#input id="insertTime" name="申请时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="flag" name="1:创建,2:修改,3:删除" value="${item.flag}" underline="true"/>
+                            <#input id="withdrawalType" name="提现方式 1=银行卡  2=线下" value="${item.withdrawalType}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TPubWithdrawalInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TPubWithdrawalInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tPubWithdrawal/tPubWithdrawal_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_immediately.html
new file mode 100644
index 0000000..16d1d49
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tPubWithdrawal/tPubWithdrawal_immediately.html
@@ -0,0 +1,41 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="withdrawalInfoForm">
+            <input type="hidden" id="id" name="id" value="${tPubWithdrawalId}">
+            <div class="row">
+                <div class="col-sm-10">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">处理意见:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="state2" value="2" name="state" checked="" >
+                                <label for="state2"> 同意 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="state3" value="3" name="state" >
+                                <label for="state3"> 拒绝 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">填写备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TPubWithdrawalInfoDlg.immediately()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TPubWithdrawalInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tPubWithdrawal/tPubWithdrawal_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/cross.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/cross.html
new file mode 100644
index 0000000..b7b5faa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/cross.html
@@ -0,0 +1,87 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>跨城改派管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="申请改派时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="originalDriverName" name="申请司机姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="originalDriverPhone" name="申请司机手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="orderNum" name="订单编号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="nowDriverName" name="改派服务司机姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="nowDriverPhone" name="改派服务司机手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="orderState" name="订单当前状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待接单</option>
+                                    <option value="2">待出发</option>
+                                    <option value="3">待到达预约地点</option>
+                                    <option value="4">待乘客上车</option>
+                                    <option value="5">服务中</option>
+                                    <option value="6">完成服务</option>
+                                    <option value="7">待支付</option>
+                                    <option value="8">待评价</option>
+                                    <option value="9">已完成</option>
+                                    <option value="10">已取消</option>
+                                    <option value="11">改派中</option>
+                                    <option value="12">取消待支付</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="改派状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">提交申请</option>
+                                    <option value="2">已支付</option>
+                                    <option value="3">已改派</option>
+                                    <option value="4">已取消</option>
+                                    <option value="5">已拒绝</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TCross.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TCross.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TCrossTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tReassign/refusedCross")){
+                            <#button name="拒绝改派" icon="fa-plus" clickFun="TCross.opt(1)"/>
+                            @}
+                            @if(shiro.hasPermission("/tReassign/reassignmentCross")){
+                            <#button name="立即改派" icon="fa-edit" clickFun="TCross.reassignmentCross()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tReassign/cancelCross")){
+                            <#button name="取消订单" icon="fa-remove" clickFun="TCross.opt(2)" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TCrossTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tReassign/tCross.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/smallPieceLogistics.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/smallPieceLogistics.html
new file mode 100644
index 0000000..259c40f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/smallPieceLogistics.html
@@ -0,0 +1,86 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>小件物流改派管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="申请改派时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="originalDriverName" name="申请司机姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="originalDriverPhone" name="申请司机手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="orderNum" name="订单编号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="nowDriverName" name="改派服务司机姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="nowDriverPhone" name="改派服务司机手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="orderState" name="订单当前状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待接单</option>
+                                    <option value="2">待出发</option>
+                                    <option value="3">待到达预约地点</option>
+                                    <option value="4">待取件</option>
+                                    <option value="5">送件中</option>
+                                    <option value="6">已送达</option>
+                                    <option value="7">待支付</option>
+                                    <option value="8">需补差价</option>
+                                    <option value="9">已取货</option>
+                                    <option value="10">已取消</option>
+                                    <option value="11">已支付差价</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="改派状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">提交申请</option>
+                                    <option value="2">已支付</option>
+                                    <option value="3">已改派</option>
+                                    <option value="4">已取消</option>
+                                    <option value="5">已拒绝</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TReassign.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TReassign.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TReassignTableToolbar" role="group">
+                            @if(shiro.hasPermission("/smallPieceLogistics/refused")){
+                                <#button name="拒绝改派" icon="fa-plus" clickFun="TReassign.opt(1)"/>
+                            @}
+                            @if(shiro.hasPermission("/smallPieceLogistics/reassignment")){
+                                <#button name="立即改派" icon="fa-edit" clickFun="TReassign.reassignment()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/smallPieceLogistics/cancel")){
+                                <#button name="取消订单" icon="fa-remove" clickFun="TReassign.opt(2)" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TReassignTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tReassign/smallPieceLogistics.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign.html
new file mode 100644
index 0000000..e5fbcb1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign.html
@@ -0,0 +1,87 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>专车改派管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="申请改派时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="originalDriverName" name="申请司机姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="originalDriverPhone" name="申请司机手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="orderNum" name="订单编号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="nowDriverName" name="改派服务司机姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="nowDriverPhone" name="改派服务司机手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="orderState" name="订单当前状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待接单</option>
+                                    <option value="2">待出发</option>
+                                    <option value="3">待到达预约地点</option>
+                                    <option value="4">待乘客上车</option>
+                                    <option value="5">服务中</option>
+                                    <option value="6">完成服务</option>
+                                    <option value="7">待支付</option>
+                                    <option value="8">待评价</option>
+                                    <option value="9">已完成</option>
+                                    <option value="10">已取消</option>
+                                    <option value="11">改派中</option>
+                                    <option value="12">取消待支付</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="改派状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">提交申请</option>
+                                    <option value="2">已支付</option>
+                                    <option value="3">已改派</option>
+                                    <option value="4">已取消</option>
+                                    <option value="5">已拒绝</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TReassign.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TReassign.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TReassignTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tReassign/refused")){
+                                <#button name="拒绝改派" icon="fa-plus" clickFun="TReassign.opt(1)"/>
+                            @}
+                            @if(shiro.hasPermission("/tReassign/reassignment")){
+                                <#button name="立即改派" icon="fa-edit" clickFun="TReassign.reassignment()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tReassign/cancel")){
+                                <#button name="取消订单" icon="fa-remove" clickFun="TReassign.opt(2)" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TReassignTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tReassign/tReassign.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignment.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignment.html
new file mode 100644
index 0000000..62241b2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignment.html
@@ -0,0 +1,34 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>选择改派司机</h5>
+            </div>
+            <input type="hidden" id="id" name="id" value="${tReassignId}">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="司机姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="司机手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SelectPrivateCarDriver.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="SelectPrivateCarDriver.resetSearch()" space="true"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="SelectPrivateCarDriver.selectDriver()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SelectPrivateCarDriver.close()" space="true"/>
+                            </div>
+                        </div>
+                        <#table id="SelectPrivateCarDriverTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tReassign/selectPrivateCarDriver.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignmentCross.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignmentCross.html
new file mode 100644
index 0000000..a4a739b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignmentCross.html
@@ -0,0 +1,34 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>选择改派司机</h5>
+            </div>
+            <input type="hidden" id="id" name="id" value="${tReassignId}">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="司机姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="司机手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SelectCrossDriver.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="SelectCrossDriver.resetSearch()" space="true"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="SelectCrossDriver.selectDriver()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SelectCrossDriver.close()" space="true"/>
+                            </div>
+                        </div>
+                        <#table id="SelectCrossDriverTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tReassign/selectCrossDriver.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignmentSmall.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignmentSmall.html
new file mode 100644
index 0000000..6af6c90
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tReassign/tReassign_reassignmentSmall.html
@@ -0,0 +1,34 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>选择改派司机</h5>
+            </div>
+            <input type="hidden" id="id" name="id" value="${tReassignId}">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="司机姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="司机手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SelectPrivateCarDriver.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="SelectPrivateCarDriver.resetSearch()" space="true"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="SelectPrivateCarDriver.selectDriver()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SelectPrivateCarDriver.close()" space="true"/>
+                            </div>
+                        </div>
+                        <#table id="SelectPrivateCarDriverTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tReassign/selectSmallDriver.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity.html
new file mode 100644
index 0000000..a821e59
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity.html
@@ -0,0 +1,49 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>跨城车型设置管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="车型名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">禁用</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TAcrossCity.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TAcrossCity.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TAcrossCityTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tServerCarmodel/addAcrossCity")){
+                            <#button name="添加" icon="fa-plus" clickFun="TAcrossCity.addAcrossCity()"/>
+                            @}
+                            @if(shiro.hasPermission("/tServerCarmodel/updateServerCarmodel")){
+                            <#button name="修改" icon="fa-edit" clickFun="TAcrossCity.updateServerCarmodel()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tServerCarmodel/noAcrossCity")){
+                            <#button name="禁用" icon="fa-edit" clickFun="TAcrossCity.noAcrossCity()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tServerCarmodel/yesAcrossCity")){
+                            <#button name="启用" icon="fa-remove" clickFun="TAcrossCity.yesAcrossCity()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TAcrossCityTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tServerCarmodel/acrossCity.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity_add.html
new file mode 100644
index 0000000..0a5a200
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity_add.html
@@ -0,0 +1,24 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="acrossCityInfoForm">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="车型名称"/>
+                    <#avatar id="img" name="车型图片:" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TAcrossCityInfoDlg.addAcrossCity()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TAcrossCityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tServerCarmodel/acrossCity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity_edit.html
new file mode 100644
index 0000000..1ff94c8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/acrossCity_edit.html
@@ -0,0 +1,24 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="acrossCityInfoForm">
+            <input type="hidden" id="id" value="${data.id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="车型名称" value="${data.name}"/>
+                    <#avatar id="img" name="车型图片:" avatarImg="${data.img}"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TAcrossCityInfoDlg.editAcrossCity()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TAcrossCityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tServerCarmodel/acrossCity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter.html
new file mode 100644
index 0000000..09f6d97
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter.html
@@ -0,0 +1,49 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>包车车型设置管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="车型名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">禁用</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TCharter.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TCharter.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TCharterTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tServerCarmodel/addCharter")){
+                            <#button name="添加" icon="fa-plus" clickFun="TCharter.addCharter()"/>
+                            @}
+                            @if(shiro.hasPermission("/tServerCarmodel/update")){
+                            <#button name="修改" icon="fa-edit" clickFun="TCharter.editCharter()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tServerCarmodel/noCharter")){
+                            <#button name="禁用" icon="fa-edit" clickFun="TCharter.noCharter()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tServerCarmodel/yesCharter")){
+                            <#button name="启用" icon="fa-remove" clickFun="TCharter.yesCharter()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TCharterTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tServerCarmodel/charter.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter_add.html
new file mode 100644
index 0000000..3e6c009
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter_add.html
@@ -0,0 +1,47 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="charterInfoForm">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="车型名称"/>
+
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">车型价格范围为:</label>
+                        <div class="col-sm-9">
+                            &nbsp;<input type="text" oninput="checkIsYuan(this)" name="one" id="one" class="form-control newWidth" />&nbsp;
+                            至&nbsp;<input type="text" oninput="checkIsYuan(this)" name="two" id="two" class="form-control newWidth" />&nbsp;元
+                        </div>
+                    </div>
+
+                    <#avatar id="img" name="车型图片:" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCharterInfoDlg.addCharter()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCharterInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tServerCarmodel/charter_info.js"></script>
+<script type="text/javascript">
+    var regDouble = /^(([1-9]{1}\d*)|(0{1}))(\.\d{0,2})?$/;
+    function checkIsYuan(obj){
+        var num = $(obj).val();
+        if(!regDouble.test(num)){
+            layer.msg("【元】格式不正确,保留两位小数");
+        }
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter_edit.html
new file mode 100644
index 0000000..00db466
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/charter_edit.html
@@ -0,0 +1,47 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="charterInfoForm">
+            <input type="hidden" id="id" value="${data.id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="车型名称" value="${data.name}"/>
+
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">车型价格范围为:</label>
+                        <div class="col-sm-9">
+                            &nbsp;<input type="text" oninput="checkIsYuan(this)" name="one" id="one" class="form-control newWidth" value="${price1}"/>&nbsp;
+                            至&nbsp;<input type="text" oninput="checkIsYuan(this)" name="two" id="two" class="form-control newWidth" value="${price2}"/>&nbsp;元
+                        </div>
+                    </div>
+
+                    <#avatar id="img" name="车型图片:" avatarImg="${data.img}"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TCharterInfoDlg.editCharter()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TCharterInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tServerCarmodel/charter_info.js"></script>
+<script type="text/javascript">
+    var regDouble = /^(([1-9]{1}\d*)|(0{1}))(\.\d{0,2})?$/;
+    function checkIsYuan(obj){
+        var num = $(obj).val();
+        if(!regDouble.test(num)){
+            layer.msg("【元】格式不正确,保留两位小数");
+        }
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel.html
new file mode 100644
index 0000000..0d7ea20
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel.html
@@ -0,0 +1,49 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>专车车型设置管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="车型名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">禁用</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TServerCarmodel.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TServerCarmodel.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TServerCarmodelTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tServerCarmodel/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TServerCarmodel.openAddTServerCarmodel()"/>
+                            @}
+                            @if(shiro.hasPermission("/tServerCarmodel/update")){
+                            <#button name="修改" icon="fa-edit" clickFun="TServerCarmodel.updateTOrderEvaluateDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tServerCarmodel/no")){
+                                <#button name="禁用" icon="fa-edit" clickFun="TServerCarmodel.no()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tServerCarmodel/yes")){
+                                <#button name="启用" icon="fa-remove" clickFun="TServerCarmodel.yes()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TServerCarmodelTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tServerCarmodel/tServerCarmodel.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel_add.html
new file mode 100644
index 0000000..b650cf8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel_add.html
@@ -0,0 +1,24 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="serverCarModelInfoForm">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="车型名称"/>
+                    <#avatar id="img" name="车型图片:" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TServerCarmodelInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TServerCarmodelInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tServerCarmodel/tServerCarmodel_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel_edit.html
new file mode 100644
index 0000000..587aa9c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tServerCarmodel/tServerCarmodel_edit.html
@@ -0,0 +1,24 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="serverCarModelInfoForm">
+            <input type="hidden" id="id" value="${data.id}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="name" name="车型名称" value="${data.name}"/>
+                    <#avatar id="img" name="车型图片:"  avatarImg="${data.img}"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TServerCarmodelInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TServerCarmodelInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tServerCarmodel/tServerCarmodel_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite.html
new file mode 100644
index 0000000..20a8dd3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite.html
@@ -0,0 +1,67 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>跨城站点管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="站点名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="insertUser" name="创建者" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="city" name="所属城市" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">冻结</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TSite.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TSite.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TSiteTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tSite/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TSite.openAddTSite()"/>
+                            @}
+                            @if(shiro.hasPermission("/tSite/update")){
+                                <#button name="编辑" icon="fa-edit" clickFun="TSite.openTSiteDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tSite/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TSite.opt(1)" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tSite/freeze")){
+                                <#button name="冻结" icon="fa-remove" clickFun="TSite.opt(2)" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tSite/thaw")){
+                                <#button name="解冻" icon="fa-remove" clickFun="TSite.opt(3)" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TSiteTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tSite/tSite.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite_add.html
new file mode 100644
index 0000000..284514e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite_add.html
@@ -0,0 +1,170 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="siteInfoForm">
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="">
+                        <h3 style="margin-left: 100px;">站点信息</h3>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">站点名称:</label>
+                        <div class="col-sm-6">
+                            <input type="text" class="form-control" id="name" name="name">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">所属城市:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="provinceCode" onchange="TSiteInfoDlg.provinceChange(this)">
+                                <option value="">选择省</option>
+                                @for(obj in provinceList){
+                                <option value="${obj.code}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="cityCode" onchange="TSiteInfoDlg.cityChange(this)">
+                                <option value="">选择市</option>
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="districtCode">
+                                <option value="">选择区</option>
+                            </select>
+                        </div>
+                    </div>
+
+                    <div class="">
+                        <h3 style="margin-left: 100px;margin-top: 70px;">站点区域</h3>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">区域名称:</label>
+                        <div class="col-sm-2">
+                            <input type="text" class="form-control" id="areaName" name="areaName">
+                        </div>
+                        <label class="col-sm-1 control-label">类型:</label>
+                        <div class="col-sm-2"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="areaType1" value="1" name="areaType" checked="" onclick="TSiteInfoDlg.areaTypeClick(1)">
+                                <label for="areaType1"> 行政区域 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="areaType2" value="2" name="areaType" onclick="TSiteInfoDlg.areaTypeClick(2)">
+                                <label for="areaType2"> 电子围栏 </label>
+                            </div>
+                        </div>
+                        <div class="col-sm-2">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TSiteInfoDlg.addArea()"/>
+                        </div>
+                    </div>
+                    <div class="form-group" id="areaType1Div">
+                        <label class="col-sm-2 control-label">行政区域:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="provinceCode1" onchange="TSiteInfoDlg.provinceChange1(this)">
+                                <option value="">选择省</option>
+                                @for(obj in provinceList){
+                                <option value="${obj.code}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="cityCode1" onchange="TSiteInfoDlg.cityChange1(this)">
+                                <option value="">选择市</option>
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="districtCode1">
+                                <option value="">选择区</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group" id="areaType2Div" style="display: none;">
+                        <label class="col-sm-2 control-label">电子围栏:</label>
+                        <div class="col-sm-8">
+                            <div id="container" style="height: 350px;width: 1000px;"></div>
+                            <div class='info' style="margin-top:10px;position: absolute; z-index: 999; left: 20px; width: 450px;">操作说明:圆和矩形通过拖拽来绘制,其他覆盖物通过点击来绘制</div>
+                            <div class="input-card" style='margin-top:28px;width: 100rem; z-index: 999; bottom: 20px;'>
+                                <div class="input-item">
+                                    <!--<input type="radio" name='func' checked="" value='marker'><span class="input-text">画点</span>-->
+                                    <!--<input type="radio" name='func' value='polyline'><span class="input-text">画折线</span>&nbsp;&nbsp;-->
+                                    <input type="radio" name='func' value='polygon'><span class="input-text" style='width:5rem;'>画多边形</span>&nbsp;&nbsp;
+                                    <!--<input type="radio" name='func' value='rectangle'><span class="input-text" style='width:5rem;'>画矩形</span>&nbsp;&nbsp;-->
+                                    <input type="radio" name='func' value='circle'><span class="input-text" style='width:5rem;'>画圆</span>
+                                </div>
+                                <div class="input-item">
+                                    <input id="clear" type="button" class="btn" value="清除" />
+                                    <input id="close" type="button" class="btn" value="关闭绘图" />
+                                    <input type="button" class="btn" value="开始编辑" onclick="editAll()" />
+                                    <input type="button" class="btn" value="结束编辑" onclick="closeEdit()" />
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-sm-2">
+                            <div class="form-group">
+                                <label style='color:grey'>行政区边界查询</label>
+                                <div class="input-group">
+                                    <div class="input-group-btn">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle"
+                                                type="button">行政级别
+                                        </button>
+                                    </div>
+                                    <select id="level" class="form-control">
+                                        <option value="district">区</option>
+                                        <option value="city">市</option>
+                                        <option value="province">省</option>
+                                    </select>
+
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <div class="input-group">
+                                    <div class="input-group-btn">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle"
+                                                type="button">名称/adcode
+                                        </button>
+                                    </div>
+                                    <input id='district' class="layui-input form-control" type="text" value=''>
+                                </div>
+                            </div>
+                            <input id="find" type="button" class="btn btn-primary btn-sm" value="查询" />
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">已添加区域</label>
+                        <div class="col-sm-6">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;text-align: center;">添加时间</th>
+                                        <th style="width: 300px;text-align: center;">区域名称</th>
+                                        <th style="width: 100px;text-align: center;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="areaValue">
+
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSiteInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSiteInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="https://webapi.amap.com/maps?v=1.4.15&key=c59c0ec8058a8305009eb315584e07d1&plugin=AMap.MouseTool,AMap.DistrictSearch,AMap.PolyEditor,AMap.RectangleEditor,AMap.CircleEditor"></script>
+<script src="${ctxPath}/static/modular/system/tSite/electricFence.js"></script>
+<script src="${ctxPath}/static/modular/system/tSite/tSite_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite_edit.html
new file mode 100644
index 0000000..319a285
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSite/tSite_edit.html
@@ -0,0 +1,193 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="siteInfoForm">
+            <input type="hidden" id="id" name="id" value="${item.id}">
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="">
+                        <h3 style="margin-left: 100px;">站点信息</h3>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">站点名称:</label>
+                        <div class="col-sm-6">
+                            <input type="text" class="form-control" id="name" name="name" value="${item.name}">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">所属城市:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="provinceCode" onchange="TSiteInfoDlg.provinceChange(this)">
+                                <option value="">选择省</option>
+                                @for(obj in provinceList){
+                                <option value="${obj.code}" ${obj.code == item.provinceCode ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="cityCode" onchange="TSiteInfoDlg.cityChange(this)">
+                                <option value="">选择市</option>
+                                @for(obj in cityList){
+                                <option value="${obj.code}" ${obj.code == item.cityCode ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="districtCode">
+                                <option value="">选择区</option>
+                                @for(obj in areaList){
+                                <option value="${obj.code}" ${obj.code == item.districtCode ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+
+                    <div class="">
+                        <h3 style="margin-left: 100px;margin-top: 70px;">站点区域</h3>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">区域名称:</label>
+                        <div class="col-sm-2">
+                            <input type="text" class="form-control" id="areaName" name="areaName">
+                        </div>
+                        <label class="col-sm-1 control-label">类型:</label>
+                        <div class="col-sm-2"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="areaType1" value="1" name="areaType" ${checked1} disabled onclick="TSiteInfoDlg.areaTypeClick(1)">
+                                <label for="areaType1"> 行政区域 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="areaType2" value="2" name="areaType" ${checked2} disabled onclick="TSiteInfoDlg.areaTypeClick(2)">
+                                <label for="areaType2"> 电子围栏 </label>
+                            </div>
+                        </div>
+                        <div class="col-sm-2">
+                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TSiteInfoDlg.addArea()"/>
+                        </div>
+                    </div>
+                    <div class="form-group" id="areaType1Div" style="display: ${type1};">
+                        <label class="col-sm-2 control-label">行政区域:</label>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="provinceCode1" onchange="TSiteInfoDlg.provinceChange1(this)">
+                                <option value="">选择省</option>
+                                @for(obj in provinceList){
+                                <option value="${obj.code}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="cityCode1" onchange="TSiteInfoDlg.cityChange1(this)">
+                                <option value="">选择市</option>
+                            </select>
+                        </div>
+                        <div class="col-sm-2">
+                            <select class="form-control" id="districtCode1">
+                                <option value="">选择区</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group" id="areaType2Div" style="display: ${type2};">
+                        <label class="col-sm-2 control-label">电子围栏:</label>
+                        <div class="col-sm-8">
+                            <div id="container" style="height: 350px;width: 1000px;"></div>
+                            <div class='info' style="margin-top:10px;position: absolute; z-index: 999; left: 20px; width: 450px;">操作说明:圆和矩形通过拖拽来绘制,其他覆盖物通过点击来绘制</div>
+                            <div class="input-card" style='margin-top:28px;width: 100rem; z-index: 999; bottom: 20px;'>
+                                <div class="input-item">
+                                    <!--<input type="radio" name='func' checked="" value='marker'><span class="input-text">画点</span>-->
+                                    <!--<input type="radio" name='func' value='polyline'><span class="input-text">画折线</span>&nbsp;&nbsp;-->
+                                    <input type="radio" name='func' value='polygon'><span class="input-text" style='width:5rem;'>画多边形</span>&nbsp;&nbsp;
+                                    <!--<input type="radio" name='func' value='rectangle'><span class="input-text" style='width:5rem;'>画矩形</span>&nbsp;&nbsp;-->
+                                    <input type="radio" name='func' value='circle'><span class="input-text" style='width:5rem;'>画圆</span>
+                                </div>
+                                <div class="input-item">
+                                    <input id="clear" type="button" class="btn" value="清除" />
+                                    <input id="close" type="button" class="btn" value="关闭绘图" />
+                                    <input type="button" class="btn" value="开始编辑" onclick="editAll()" />
+                                    <input type="button" class="btn" value="结束编辑" onclick="closeEdit()" />
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-sm-2">
+                            <div class="form-group">
+                                <label style='color:grey'>行政区边界查询</label>
+                                <div class="input-group">
+                                    <div class="input-group-btn">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle"
+                                                type="button">行政级别
+                                        </button>
+                                    </div>
+                                    <select id="level" class="form-control">
+                                        <option value="district">区</option>
+                                        <option value="city">市</option>
+                                        <option value="province">省</option>
+                                    </select>
+
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <div class="input-group">
+                                    <div class="input-group-btn">
+                                        <button data-toggle="dropdown" class="btn btn-white dropdown-toggle"
+                                                type="button">名称/adcode
+                                        </button>
+                                    </div>
+                                    <input id='district' class="layui-input form-control" type="text" value=''>
+                                </div>
+                            </div>
+                            <input id="find" type="button" class="btn btn-primary btn-sm" value="查询" />
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">已添加区域</label>
+                        <div class="col-sm-6">
+                            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                <table class="table table-striped table-bordered table-hover table-condensed">
+                                    <thead>
+                                    <tr>
+                                        <th style="width: 300px;text-align: center;">添加时间</th>
+                                        <th style="width: 300px;text-align: center;">区域名称</th>
+                                        <th style="width: 100px;text-align: center;">操作</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="areaValue">
+                                    @for(obj in locationList!){
+                                    <tr class="areaValueClass">
+                                        <td style="text-align: center;"><input type="hidden" id="areaType1" name="areaType1" value="${obj.type}">
+                                            <input type="hidden" id="time" name="time" value="${obj.addTime}">${obj.addTime}</td>
+                                        <td style="text-align: center;">
+                                            <input type="hidden" id="id" name="id" value="${obj.id}">
+                                            <input type="hidden" id="name" name="name" value="${obj.name}">
+                                            <input type="hidden" id="provinceCode1" name="provinceCode1" value="${obj.provinceCode}">
+                                            <input type="hidden" id="province1" name="province1" value="${obj.province}">
+                                            <input type="hidden" id="cityCode1" name="cityCode1" value="${obj.cityCode}">
+                                            <input type="hidden" id="city1" name="city1" value="${obj.city}">
+                                            <input type="hidden" id="districtCode1" name="districtCode1" value="${obj.districtCode}">
+                                            <input type="hidden" id="district1" name="district1" value="${obj.district}">
+                                            <input type="hidden" id="coordinate1" name="coordinate1" value="${obj.coordinate}">
+                                            ${obj.name}</td>
+                                        <td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td>
+                                    </tr>
+                                    @}
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSiteInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSiteInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="https://webapi.amap.com/maps?v=1.4.15&key=c59c0ec8058a8305009eb315584e07d1&plugin=AMap.MouseTool,AMap.DistrictSearch,AMap.PolyEditor,AMap.RectangleEditor,AMap.CircleEditor"></script>
+<script src="${ctxPath}/static/modular/system/tSite/electricFence.js"></script>
+<script src="${ctxPath}/static/modular/system/tSite/tSite_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord.html
new file mode 100644
index 0000000..4514c5e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord.html
@@ -0,0 +1,48 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>短信记录管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="发送时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TSmsrecord.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TSmsrecord.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TSmsrecordTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tSmsrecord/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TSmsrecord.openAddTSmsrecord()"/>
+                            @}
+                            @if(shiro.hasPermission("/tSmsrecord/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="TSmsrecord.openTSmsrecordDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tSmsrecord/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TSmsrecord.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TSmsrecordTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tSmsrecord/tSmsrecord.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord_add.html
new file mode 100644
index 0000000..1bffdff
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord_add.html
@@ -0,0 +1,31 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键ID" underline="true"/>
+                            <#input id="type" name="类型:1=用户端注册/登录,2=用户端更换手机,3=用户端忘记密码,4=用户修改密码,5=司机注册,6=司机忘记密码,7=司机修改手机号,8=司机修改密码" underline="true"/>
+                            <#input id="phone" name="电话 "/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="code" name="验证码" underline="true"/>
+                            <#input id="content" name="短信内容" underline="true"/>
+                            <#input id="createTime" name="添加时间 " underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSmsrecordInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSmsrecordInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tSmsrecord/tSmsrecord_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord_edit.html
new file mode 100644
index 0000000..63926d0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSmsrecord/tSmsrecord_edit.html
@@ -0,0 +1,31 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键ID" value="${item.id}" underline="true"/>
+                            <#input id="type" name="类型:1=用户端注册/登录,2=用户端更换手机,3=用户端忘记密码,4=用户修改密码,5=司机注册,6=司机忘记密码,7=司机修改手机号,8=司机修改密码" value="${item.type}" underline="true"/>
+                            <#input id="phone" name="电话 " value="${item.phone}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="code" name="验证码" value="${item.code}" underline="true"/>
+                            <#input id="content" name="短信内容" value="${item.content}" underline="true"/>
+                            <#input id="createTime" name="添加时间 " value="${item.createTime}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSmsrecordInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSmsrecordInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tSmsrecord/tSmsrecord_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html
new file mode 100644
index 0000000..8f11299
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html
@@ -0,0 +1,554 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="ibox-title">
+                        <h3>系统设置:</h3>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">改派设置:</label>
+                        <div class="col-sm-10">
+                            改派费用为&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                              @if(isNotEmpty(reformist)){
+                                              value="${reformist.money}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="one" id="one" class="form-control newWidth" />&nbsp;元;<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">积分设置:</label>
+                        <div class="col-sm-10">
+                            消费一元积&nbsp;<input type="text" oninput="checkIsInt(this)"
+                                              @if(isNotEmpty(integral)){
+                                              value="${integral.integral}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="two" id="two" class="form-control newWidth" />&nbsp;积分;<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group" style="height: 70px;">
+                        <label class="col-sm-2 control-label">人脸识别:</label>
+                        <div class="col-sm-10">
+                            <div class="radio radio-danger">
+                                <input type="radio" name="three" id="three1" value="2"
+                                       ${isNotEmpty(faceDistinguish) && 2 == faceDistinguish.isOpen  ? 'checked=checked' : ''}
+                                       onclick="threeClick(2)">
+                                <label for="three1">
+                                    关闭
+                                </label>
+                            </div>
+                            <div class="radio radio-danger">
+                                <input type="radio" name="three" id="three2" value="1"
+                                       ${isNotEmpty(faceDistinguish) && 1 == faceDistinguish.isOpen  ? 'checked=checked' : ''}
+                                       onclick="threeClick(1)">
+                                <label for="three2">
+                                    打开
+                                    <div id="openDiv" style="position: relative;top: -26px;margin-left: 50px;display: none;">
+                                        <span style="margin-left: 20px;">上班中每隔</span>
+                                        <input type="text" oninput="checkIsInt(this)" class="form-control newWidth"
+                                               ${isNotEmpty(faceDistinguish) && 1 == faceDistinguish.isOpen  ? 'value='+faceDistinguish.minuteNum : ''}
+                                               id="openValue" name="openValue">
+                                        <span>分钟,进行一次人脸识别;</span>
+                                    </div>
+                                </label>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">专车改派:</label>
+                        <div class="col-sm-10">
+                            <div class="form-group">
+                                <div class="col-sm-9">
+                                    <input type="checkbox" class="js-switch" id="isSpecialCar"
+                                           @if(isNotEmpty(reformist)){
+                                           ${1 == reformist.isSpecialCar ? '' : 'checked=checked'}
+                                           @}
+                                    />
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">出租车改派:</label>
+                        <div class="col-sm-10">
+                            <div class="form-group">
+                                <div class="col-sm-9">
+                                    <input type="checkbox" class="js-switch1" id="isTaxiCar"
+                                           @if(isNotEmpty(reformist)){
+                                           ${1 == reformist.isTaxiCar ? '' : 'checked=checked'}
+                                    @}
+                                    />
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="ibox-title" >
+                        <h3>推单设置:</h3>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">专车推单:</label>
+                        <div class="col-sm-10">
+                            第一轮推单:推单距离为&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                    @if(isNotEmpty(zcOne)){
+                                                    value="${zcOne.pushDistance}"
+                                                    @}else{
+                                                    value=""
+                                                    @}
+                                                    name="zc1" id="zc1" class="form-control newWidth" />&nbsp;公里,
+                            推单时间为&nbsp;<input type="text" oninput="checkIsInt(this)"
+                                              @if(isNotEmpty(zcOne)){
+                                              value="${zcOne.pushTime}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="zc2" id="zc2" class="form-control newWidth" />&nbsp;秒钟;
+                            每次推所有司机的&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                 @if(isNotEmpty(zcOne)){
+                                                 value="${zcOne.driverProportion}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc3" id="zc3" class="form-control newWidth" />&nbsp;%
+                            <br/>
+                            <br/>
+                            第二轮推单:推单距离为&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                    @if(isNotEmpty(zcTwo)){
+                                                    value="${zcTwo.pushDistance}"
+                                                    @}else{
+                                                    value=""
+                                                    @}
+                                                    name="zc4" id="zc4" class="form-control newWidth" />&nbsp;公里,
+                            推单时间为&nbsp;<input type="text" oninput="checkIsInt(this)"
+                                              @if(isNotEmpty(zcTwo)){
+                                              value="${zcTwo.pushTime}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="zc5" id="zc5" class="form-control newWidth" />&nbsp;秒钟;
+                            每次推所有司机的&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                 @if(isNotEmpty(zcTwo)){
+                                                 value="${zcTwo.driverProportion}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc6" id="zc6" class="form-control newWidth" />&nbsp;%
+                            <br/>
+                            <br/>
+                            第三轮推单:推单距离为&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                    @if(isNotEmpty(zcThree)){
+                                                    value="${zcThree.pushDistance}"
+                                                    @}else{
+                                                    value=""
+                                                    @}
+                                                    name="zc7" id="zc7" class="form-control newWidth" />&nbsp;公里,
+                            推单时间为&nbsp;<input type="text" oninput="checkIsInt(this)"
+                                              @if(isNotEmpty(zcThree)){
+                                              value="${zcThree.pushTime}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="zc8" id="zc8" class="form-control newWidth" />&nbsp;秒钟;
+                            每次推所有司机的&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                 @if(isNotEmpty(zcThree)){
+                                                 value="${zcThree.driverProportion}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc9" id="zc9" class="form-control newWidth" />&nbsp;%
+                            <br/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">出租车推单:</label>
+                        <div class="col-sm-10">
+                            第一轮推单:推单距离为&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                    @if(isNotEmpty(czcOne)){
+                                                    value="${czcOne.pushDistance}"
+                                                    @}else{
+                                                    value=""
+                                                    @}
+                                                    name="czc1" id="czc1" class="form-control newWidth" />&nbsp;公里,
+                            推单时间为&nbsp;<input type="text" oninput="checkIsInt(this)"
+                                              @if(isNotEmpty(czcOne)){
+                                              value="${czcOne.pushTime}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="czc2" id="czc2" class="form-control newWidth" />&nbsp;秒钟;
+                            每次推所有司机的&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                 @if(isNotEmpty(czcOne)){
+                                                 value="${czcOne.driverProportion}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="czc3" id="czc3" class="form-control newWidth" />&nbsp;%
+                            <br/>
+                            <br/>
+                            第二轮推单:推单距离为&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                    @if(isNotEmpty(czcTwo)){
+                                                    value="${czcTwo.pushDistance}"
+                                                    @}else{
+                                                    value=""
+                                                    @}
+                                                    name="czc4" id="czc4" class="form-control newWidth" />&nbsp;公里,
+                            推单时间为&nbsp;<input type="text" oninput="checkIsInt(this)"
+                                              @if(isNotEmpty(czcTwo)){
+                                              value="${czcTwo.pushTime}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="czc5" id="czc5" class="form-control newWidth" />&nbsp;秒钟;
+                            每次推所有司机的&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                 @if(isNotEmpty(czcTwo)){
+                                                 value="${czcTwo.driverProportion}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="czc6" id="czc6" class="form-control newWidth" />&nbsp;%
+                            <br/>
+                            <br/>
+                            第三轮推单:推单距离为&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                    @if(isNotEmpty(czcThree)){
+                                                    value="${czcThree.pushDistance}"
+                                                    @}else{
+                                                    value=""
+                                                    @}
+                                                    name="czc7" id="czc7" class="form-control newWidth" />&nbsp;公里,
+                            推单时间为&nbsp;<input type="text" oninput="checkIsInt(this)"
+                                              @if(isNotEmpty(czcThree)){
+                                              value="${czcThree.pushTime}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="czc8" id="czc8" class="form-control newWidth" />&nbsp;秒钟;
+                            每次推所有司机的&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                                 @if(isNotEmpty(czcThree)){
+                                                 value="${czcThree.driverProportion}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="czc9" id="czc9" class="form-control newWidth" />&nbsp;%
+                            <br/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">取消设置:</label>
+                        <div class="col-sm-10">
+                            专车订单取消规则:专车订单在司机接单&nbsp;<input type="text" oninput="checkIsInt(this)"
+                                                           @if(isNotEmpty(ptCancel1)){
+                                                           value="${ptCancel1.minuteNum}"
+                                                           @}else{
+                                                           value=""
+                                                           @}
+                                                           name="ptCancel1" id="ptCancel1" class="form-control newWidth" />&nbsp;分钟后,
+                            取消订单收取&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                               @if(isNotEmpty(ptCancel1)){
+                                               value="${ptCancel1.money}"
+                                               @}else{
+                                               value=""
+                                               @}
+                                               name="ptCancel2" id="ptCancel2" class="form-control newWidth" />&nbsp;元取消费用;
+                            <br/>
+                            <br/>
+                            出租车订单取消规则:出租车订单在司机接单&nbsp;<input type="text" oninput="checkIsInt(this)"
+                                                             @if(isNotEmpty(ptCancel2)){
+                                                             value="${ptCancel2.minuteNum}"
+                                                             @}else{
+                                                             value=""
+                                                             @}
+                                                             name="ptCancel3" id="ptCancel3" class="form-control newWidth" />&nbsp;分钟后,
+                            取消订单收取&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                               @if(isNotEmpty(ptCancel2)){
+                                               value="${ptCancel2.money}"
+                                               @}else{
+                                               value=""
+                                               @}
+                                               name="ptCancel4" id="ptCancel4" class="form-control newWidth" />&nbsp;元取消费用;
+                            <br/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">预约单取消设置:</label>
+                        <div class="col-sm-10">
+                            专车订单取消规则:专车订单在司机接单&nbsp;<input type="text" oninput="checkIsInt(this)"
+                                                           @if(isNotEmpty(yyCancel1)){
+                                                           value="${yyCancel1.minuteNum}"
+                                                           @}else{
+                                                           value=""
+                                                           @}
+                                                           name="yyCancel1" id="yyCancel1" class="form-control newWidth" />&nbsp;分钟后,
+                            取消订单收取&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                               @if(isNotEmpty(yyCancel1)){
+                                               value="${yyCancel1.money}"
+                                               @}else{
+                                               value=""
+                                               @}
+                                               name="yyCancel2" id="yyCancel2" class="form-control newWidth" />&nbsp;元取消费用;
+                            <br/>
+                            <br/>
+                            出租车订单取消规则:出租车订单在司机接单&nbsp;<input type="text" oninput="checkIsInt(this)"
+                                                             @if(isNotEmpty(yyCancel2)){
+                                                             value="${yyCancel2.minuteNum}"
+                                                             @}else{
+                                                             value=""
+                                                             @}
+                                                             name="yyCancel3" id="yyCancel3" class="form-control newWidth" />&nbsp;分钟后,
+                            取消订单收取&nbsp;<input type="text" oninput="checkIsDouble(this)"
+                                               @if(isNotEmpty(yyCancel2)){
+                                               value="${yyCancel2.money}"
+                                               @}else{
+                                               value=""
+                                               @}
+                                               name="yyCancel4" id="yyCancel4" class="form-control newWidth" />&nbsp;元取消费用;
+                            <br/>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">电话设置:</label>
+                        <div class="col-sm-10">
+                            报警电话:&nbsp;<input type="text"
+                                              @if(isNotEmpty(phone1)){
+                                              value="${phone1.phone}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="phone1" id="phone1" class="form-control newWidth" />&nbsp;
+                            <br/>
+                            <br/>
+                            客服电话:&nbsp;<input type="text"
+                                              @if(isNotEmpty(phone2)){
+                                              value="${phone2.phone}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="phone2" id="phone2" class="form-control newWidth" />&nbsp;
+                            <br/>
+                            <br/>
+                            包车调度电话:&nbsp;<input type="text"
+                                              @if(isNotEmpty(phone3)){
+                                              value="${phone3.phone}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="phone3" id="phone3" class="form-control newWidth" />&nbsp;
+                            <br/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="setUp()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script type="text/javascript">
+    $(function() {
+        var elem = document.querySelector(".js-switch");
+        var init = new Switchery(elem);
+        var elem1 = document.querySelector(".js-switch1");
+        var init1 = new Switchery(elem1);
+
+        var three = $("input[name='three']:checked").val();
+        if (three == "" || three == null || three == undefined){
+            $("#three1").attr("checked","checked");
+        }
+        threeClick($("input[name='three']:checked").val());
+    });
+
+    //人脸识别打开按钮被点击
+    function threeClick(obj) {
+        if (obj == 1){
+            $("#openDiv").show();
+        } else {
+            $("#openDiv").hide();
+        }
+    }
+
+    var regDouble = /^[0-9]\d*(\.\d*[0-9])?$/;
+    function checkIsDouble(obj){
+        var num = $(obj).val();
+        if(!regDouble.test(num)){
+            layer.msg("小数/正整数格式");
+        }
+    }
+
+    //验证是否输入正整数
+    var regInt = /^[0-9]\d*$/;
+    function checkIsInt(obj){
+        var num = $(obj).val();
+        if(!regInt.test(num)){
+            layer.msg("正整数格式");
+        }
+    }
+
+    /**
+     * 提交操作
+     */
+    function setUp() {
+        var one = $("#one").val().trim();
+        var two = $("#two").val().trim();
+        var three = $("input[name='three']:checked").val();
+        var openValue = $("#openValue").val();
+
+        var isSpecialCar = $("#isSpecialCar").is(":checked");
+        if (isSpecialCar){
+            isSpecialCar = 2;
+        } else {
+            isSpecialCar = 1;
+        }
+        var isTaxiCar = $("#isTaxiCar").is(":checked");
+        if (isTaxiCar){
+            isTaxiCar = 2;
+        } else {
+            isTaxiCar = 1;
+        }
+
+        var zc1 = $("#zc1").val().trim();
+        var zc2 = $("#zc2").val().trim();
+        var zc3 = $("#zc3").val().trim();
+        var zc4 = $("#zc4").val().trim();
+        var zc5 = $("#zc5").val().trim();
+        var zc6 = $("#zc6").val().trim();
+        var zc7 = $("#zc7").val().trim();
+        var zc8 = $("#zc8").val().trim();
+        var zc9 = $("#zc9").val().trim();
+
+        var czc1 = $("#czc1").val().trim();
+        var czc2 = $("#czc2").val().trim();
+        var czc3 = $("#czc3").val().trim();
+        var czc4 = $("#czc4").val().trim();
+        var czc5 = $("#czc5").val().trim();
+        var czc6 = $("#czc6").val().trim();
+        var czc7 = $("#czc7").val().trim();
+        var czc8 = $("#czc8").val().trim();
+        var czc9 = $("#czc9").val().trim();
+
+        var ptCancel1 = $("#ptCancel1").val().trim();
+        var ptCancel2 = $("#ptCancel2").val().trim();
+        var ptCancel3 = $("#ptCancel3").val().trim();
+        var ptCancel4 = $("#ptCancel4").val().trim();
+        // var ptCancel5 = $("#ptCancel5").val().trim();
+        // var ptCancel6 = $("#ptCancel6").val().trim();
+
+        var yyCancel1 = $("#yyCancel1").val().trim();
+        var yyCancel2 = $("#yyCancel2").val().trim();
+        var yyCancel3 = $("#yyCancel3").val().trim();
+        var yyCancel4 = $("#yyCancel4").val().trim();
+
+        var phone1 = $("#phone1").val().trim();
+        var phone2 = $("#phone2").val().trim();
+        var phone3 = $("#phone3").val().trim();
+
+        if ("" == one || "" == two || "" == three
+            || "" == zc1 || "" == zc2 || "" == zc3 || "" == zc4 || "" == zc5 || "" == zc6 || "" == zc7 || "" == zc8 || "" == zc9
+            || "" == czc1 || "" == czc2 || "" == czc3 || "" == czc4 || "" == czc5 || "" == czc6 || "" == czc7 || "" == czc8 || "" == czc9
+            || "" == ptCancel1 || "" == ptCancel2 || "" == ptCancel3 || "" == ptCancel4 /*|| "" == ptCancel5 || "" == ptCancel6*/
+            || "" == yyCancel1 || "" == yyCancel2 || "" == yyCancel3 || "" == yyCancel4
+            || "" == phone1 || "" == phone2 ) {
+            Feng.info("输入框不能为空!");
+            return;
+        }else if (1 == three){
+            if ("" == openValue || null == openValue || undefined == openValue){
+                Feng.info("人脸识别分钟数不能为空!");
+                return;
+            }else if (!regInt.test(openValue)) {
+                Feng.info("人脸识别分钟数格式不正确!");
+                return;
+            }
+        } else if (!regDouble.test(one) || !regInt.test(two)
+
+            || !regDouble.test(zc1) || !regInt.test(zc2) || !regDouble.test(zc3)
+            || !regDouble.test(zc4) || !regInt.test(zc5) || !regDouble.test(zc6)
+            || !regDouble.test(zc7) || !regInt.test(zc8) || !regDouble.test(zc9)
+
+            || !regDouble.test(czc1) || !regInt.test(czc2) || !regDouble.test(czc3)
+            || !regDouble.test(czc4) || !regInt.test(czc5) || !regDouble.test(czc6)
+            || !regDouble.test(czc7) || !regInt.test(czc8) || !regDouble.test(czc9)
+
+            || !regInt.test(ptCancel1) || !regDouble.test(ptCancel2) || !regInt.test(ptCancel3) || !regDouble.test(ptCancel4) /*|| !regInt.test(ptCancel5) || !regDouble.test(ptCancel6)*/
+            || !regInt.test(yyCancel1) || !regDouble.test(yyCancel2) || !regInt.test(yyCancel3) || !regDouble.test(yyCancel4)) {
+            Feng.info("格式不正确!");
+            return ;
+        }
+
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tSysReformist/setUp", function(data){
+            Feng.success("操作成功!");
+            location.reload();
+        },function(data){
+            Feng.error("操作失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("one", one);
+        ajax.set("two", two);
+        ajax.set("three", three);
+        if (1 == three){
+            ajax.set("openValue",openValue);
+        } else if (2 == three){
+            ajax.set("openValue",0);
+        }
+
+        ajax.set("isSpecialCar", isSpecialCar);
+        ajax.set("isTaxiCar", isTaxiCar);
+
+        ajax.set("zc1", zc1);
+        ajax.set("zc2", zc2);
+        ajax.set("zc3", zc3);
+        ajax.set("zc4", zc4);
+        ajax.set("zc5", zc5);
+        ajax.set("zc6", zc6);
+        ajax.set("zc7", zc7);
+        ajax.set("zc8", zc8);
+        ajax.set("zc9", zc9);
+
+        ajax.set("czc1", czc1);
+        ajax.set("czc2", czc2);
+        ajax.set("czc3", czc3);
+        ajax.set("czc4", czc4);
+        ajax.set("czc5", czc5);
+        ajax.set("czc6", czc6);
+        ajax.set("czc7", czc7);
+        ajax.set("czc8", czc8);
+        ajax.set("czc9", czc9);
+
+        ajax.set("ptCancel1", ptCancel1);
+        ajax.set("ptCancel2", ptCancel2);
+        ajax.set("ptCancel3", ptCancel3);
+        ajax.set("ptCancel4", ptCancel4);
+        ajax.set("ptCancel5", 0);
+        ajax.set("ptCancel6", 0);
+
+        ajax.set("yyCancel1", yyCancel1);
+        ajax.set("yyCancel2", yyCancel2);
+        ajax.set("yyCancel3", yyCancel3);
+        ajax.set("yyCancel4", yyCancel4);
+
+        ajax.set("phone1", phone1);
+        ajax.set("phone2", phone2);
+        ajax.set("phone3", phone3);
+        ajax.start();
+
+    }
+
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords.html
new file mode 100644
index 0000000..f3cf3bf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords.html
@@ -0,0 +1,48 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>敏感词管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="创建时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="content" name="敏感词" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TSysSensitiveWords.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TSysSensitiveWords.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TSysSensitiveWordsTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tSysSensitiveWords/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TSysSensitiveWords.openAddTSysSensitiveWords()"/>
+                            @}
+                            @if(shiro.hasPermission("/tSysSensitiveWords/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="TSysSensitiveWords.openTSysSensitiveWordsDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tSysSensitiveWords/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TSysSensitiveWords.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TSysSensitiveWordsTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tSysSensitiveWords/tSysSensitiveWords.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords_add.html
new file mode 100644
index 0000000..f154a18
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords_add.html
@@ -0,0 +1,22 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="sysSensitiveWordsForm">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="content" name="敏感词" placeholder="敏感词最多15个字"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSysSensitiveWordsInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSysSensitiveWordsInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tSysSensitiveWords/tSysSensitiveWords_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords_edit.html
new file mode 100644
index 0000000..0099bfe
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSysSensitiveWords/tSysSensitiveWords_edit.html
@@ -0,0 +1,28 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键id" value="${item.id}" underline="true"/>
+                            <#input id="createTime" name="创建时间" value="${item.createTime}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="content" name="敏感词" value="${item.content}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSysSensitiveWordsInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSysSensitiveWordsInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tSysSensitiveWords/tSysSensitiveWords_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/small.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/small.html
new file mode 100644
index 0000000..c84815f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/small.html
@@ -0,0 +1,397 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" >
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="ibox-title">
+                        <h3>跨城小件物流价格设置:</h3>
+                    </div>
+                    <input type="hidden" id="kcId" name="kcId"
+                           @if(isNotEmpty(kcId)){
+                           value="${kcId}"
+                           @}else{
+                           value=""
+                           @}
+                    >
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            普通小件价格为&nbsp;<input type="text" oninput="checkIsYuan(this)"
+                                              @if(isNotEmpty(json1)){
+                                              value="${json1.num1}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="num101" id="num101" class="form-control newWidth" />&nbsp;元/件<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            贵重物品价格为&nbsp;<input type="text" oninput="checkIsYuan(this)"
+                                              @if(isNotEmpty(json1)){
+                                              value="${json1.num2}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="num102" id="num102" class="form-control newWidth" />&nbsp;元/件<br/>
+                        </div>
+                    </div>
+
+                    <div class="ibox-title">
+                        <h3>同城小件物流价格设置:</h3>
+                    </div>
+                    <input type="hidden" id="tcId" name="tcId"
+                           @if(isNotEmpty(tcId)){
+                           value="${tcId}"
+                           @}else{
+                           value=""
+                           @}
+                    >
+
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            普通小件价格为(根据起点终点距离收费):<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            0&nbsp;-&nbsp;<input type="text" oninput="checkIsGongLi(this)"
+                                                @if(isNotEmpty(json2)){
+                                                value="${json2.num1}"
+                                                @}else{
+                                                value=""
+                                                @}
+                                                name="num1" id="num1" class="form-control newWidth" />&nbsp;公里时,
+                            为&nbsp;<input type="text" oninput="checkIsYuan(this)"
+                                              @if(isNotEmpty(json2)){
+                                              value="${json2.num2}"
+                                              @}else{
+                                              value=""
+                                              @}
+                                              name="num2" id="num2" class="form-control newWidth" />元/件&nbsp;<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            <input type="text" disabled oninput="checkIsGongLi(this)"
+                                   @if(isNotEmpty(json2)){
+                                   value="${json2.num3}"
+                                   @}else{
+                                   value=""
+                                   @}
+                                   name="num3" id="num3" class="form-control newWidth" />&nbsp;
+                            -&nbsp;<input type="text" oninput="checkIsGongLi(this)"
+                                                 @if(isNotEmpty(json2)){
+                                                 value="${json2.num4}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="num4" id="num4" class="form-control newWidth" />&nbsp;公里时,
+                            为&nbsp;<input type="text" oninput="checkIsYuan(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num5}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num5" id="num5" class="form-control newWidth" />元/件&nbsp;<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            <input type="text" disabled oninput="checkIsGongLi(this)"
+                                   @if(isNotEmpty(json2)){
+                                   value="${json2.num6}"
+                                   @}else{
+                                   value=""
+                                   @}
+                                   name="num6" id="num6" class="form-control newWidth" />&nbsp;
+                            -&nbsp;<input type="text" oninput="checkIsGongLi(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num7}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num7" id="num7" class="form-control newWidth" />&nbsp;公里时,
+                            为&nbsp;<input type="text" oninput="checkIsYuan(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num8}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num8" id="num8" class="form-control newWidth" />元/件&nbsp;<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            <input type="text" disabled oninput="checkIsGongLi(this)"
+                                   @if(isNotEmpty(json2)){
+                                   value="${json2.num9}"
+                                   @}else{
+                                   value=""
+                                   @}
+                                   name="num9" id="num9" class="form-control newWidth" />&nbsp;
+                            -&nbsp;<input type="text" oninput="checkIsGongLi(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num10}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num10" id="num10" class="form-control newWidth" />&nbsp;公里时,
+                            为&nbsp;<input type="text" oninput="checkIsYuan(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num11}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num11" id="num11" class="form-control newWidth" />元/件&nbsp;<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            贵重物品价格为(根据起点终点距离收费):<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            0&nbsp;-&nbsp;<input type="text" oninput="checkIsGongLi(this)"
+                                                 @if(isNotEmpty(json2)){
+                                                 value="${json2.num12}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="num12" id="num12" class="form-control newWidth" />&nbsp;公里时,
+                            为&nbsp;<input type="text" oninput="checkIsYuan(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num13}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num13" id="num13" class="form-control newWidth" />元/件&nbsp;<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            <input type="text" disabled oninput="checkIsGongLi(this)"
+                                   @if(isNotEmpty(json2)){
+                                   value="${json2.num14}"
+                                   @}else{
+                                   value=""
+                                   @}
+                                   name="num14" id="num14" class="form-control newWidth" />&nbsp;
+                            -&nbsp;<input type="text" oninput="checkIsGongLi(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num15}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num15" id="num15" class="form-control newWidth" />&nbsp;公里时,
+                            为&nbsp;<input type="text" oninput="checkIsYuan(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num16}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num16" id="num16" class="form-control newWidth" />元/件&nbsp;<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            <input type="text" disabled oninput="checkIsGongLi(this)"
+                                   @if(isNotEmpty(json2)){
+                                   value="${json2.num17}"
+                                   @}else{
+                                   value=""
+                                   @}
+                                   name="num17" id="num17" class="form-control newWidth" />&nbsp;
+                            -&nbsp;<input type="text" oninput="checkIsGongLi(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num18}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num18" id="num18" class="form-control newWidth" />&nbsp;公里时,
+                            为&nbsp;<input type="text" oninput="checkIsYuan(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num19}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num19" id="num19" class="form-control newWidth" />元/件&nbsp;<br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-1 control-label"></label>
+                        <div class="col-sm-10">
+                            <input type="text" disabled oninput="checkIsGongLi(this)"
+                                   @if(isNotEmpty(json2)){
+                                   value="${json2.num20}"
+                                   @}else{
+                                   value=""
+                                   @}
+                                   name="num20" id="num20" class="form-control newWidth" />&nbsp;
+                            -&nbsp;<input type="text" oninput="checkIsGongLi(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num21}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num21" id="num21" class="form-control newWidth" />&nbsp;公里时,
+                            为&nbsp;<input type="text" oninput="checkIsYuan(this)"
+                                          @if(isNotEmpty(json2)){
+                                          value="${json2.num22}"
+                                          @}else{
+                                          value=""
+                                          @}
+                                          name="num22" id="num22" class="form-control newWidth" />元/件&nbsp;<br/>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-1">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="addSubmit()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tSystemPrice/tSystemPrice_info.js"></script>
+<script type="text/javascript">
+    var regDouble = /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/;
+    var regInt = /^[0-9]{0,3}$/;
+    function checkIsYuan(obj){
+        var num = $(obj).val();
+        if(!regDouble.test(num)){
+            layer.msg("【元】输入框不能超过3位数,保留两位小数");
+        }
+    }
+    function checkIsGongLi(obj){
+        var num = $(obj).val();
+        if(!regDouble.test(num)){
+            layer.msg("【公里】输入框不能超过3位数,保留两位小数");
+        }
+        if (obj.id == "num1"){
+            $("#num3").val(num);
+        }else if (obj.id == "num4"){
+            $("#num6").val(num);
+        }else if (obj.id == "num7"){
+            $("#num9").val(num);
+        }else if (obj.id == "num12"){
+            $("#num14").val(num);
+        }else if (obj.id == "num15"){
+            $("#num17").val(num);
+        }else if (obj.id == "num18"){
+            $("#num20").val(num);
+        }
+    }
+    function checkIsMinute(obj){
+        var num = $(obj).val();
+        if(!regInt.test(num)){
+            layer.msg("【分钟】输入框不能超过3位数");
+        }
+    }
+
+    //提交数据
+    function addSubmit() {
+        //验证数据格式-跨城小件物流价格设置
+        var kcId = $("#kcId").val();
+        var num101 = $("#num101").val();
+        var num102 = $("#num102").val();
+        if ("" == num101 || "" == num102){
+            Feng.error("【跨城小件物流价格设置】输入框不能为空");
+            return;
+        }else if (!regDouble.test(num101) || !regDouble.test(num102)){
+            Feng.error("【跨城小件物流价格设置】输入框格式不正确");
+            return;
+        }
+        //验证数据格式-同城小件物流价格设置
+        var tcId = $("#tcId").val();
+        var num1 = $("#num1").val();
+        var num2 = $("#num2").val();
+        var num3 = $("#num3").val();
+        var num4 = $("#num4").val();
+        var num5 = $("#num5").val();
+        var num6 = $("#num6").val();
+        var num7 = $("#num7").val();
+        var num8 = $("#num8").val();
+        var num9 = $("#num9").val();
+        var num10 = $("#num10").val();
+        var num11 = $("#num11").val();
+        var num12 = $("#num12").val();
+        var num13 = $("#num13").val();
+        var num14 = $("#num14").val();
+        var num15 = $("#num15").val();
+        var num16 = $("#num16").val();
+        var num17 = $("#num17").val();
+        var num18 = $("#num18").val();
+        var num19 = $("#num19").val();
+        var num20 = $("#num20").val();
+        var num21 = $("#num21").val();
+        var num22 = $("#num22").val();
+
+        if ("" == num1 || "" == num2 || "" == num3 || "" == num4 || "" == num5 || "" == num6 || "" == num7 || "" == num8 || "" == num9 || "" == num10
+            || "" == num11 || "" == num12 || "" == num13 || "" == num14 || "" == num15 || "" == num16 || "" == num17 || "" == num18 || "" == num19 || "" == num20
+            || "" == num21 || "" == num22 ){
+            Feng.error("【同城小件物流价格设置】输入框不能为空");
+            return;
+        }else if (!regDouble.test(num1) || !regDouble.test(num2) || !regDouble.test(num3) || !regDouble.test(num4) || !regDouble.test(num5) || !regDouble.test(num6)
+            || !regDouble.test(num7) || !regDouble.test(num8) || !regDouble.test(num9) || !regDouble.test(num10) || !regDouble.test(num11) || !regDouble.test(num12)
+            || !regDouble.test(num13) || !regDouble.test(num14) || !regDouble.test(num15) || !regDouble.test(num16) || !regDouble.test(num17) || !regDouble.test(num18)
+            || !regDouble.test(num19) || !regDouble.test(num20) || !regDouble.test(num21) || !regDouble.test(num22) ){
+            Feng.error("【同城小件物流价格设置】输入框格式不正确");
+            return;
+        }
+        //封装数据
+        var json1 = '{"num1":"'+num101+'","num2":"'+num102+'"}';
+        var json2 = '{"num1":"'+num1+'","num2":"'+num2+'","num3":"'+num3+'","num4":"'+num4+'","num5":"'+num5+'","num6":"'+num6+'"' +
+            ',"num7":"'+num7+'","num8":"'+num8+'","num9":"'+num9+'","num10":"'+num10+'","num11":"'+num11+'","num12":"'+num12+'"' +
+            ',"num13":"'+num13+'","num14":"'+num14+'","num15":"'+num15+'","num16":"'+num16+'","num17":"'+num17+'","num18":"'+num18+'"' +
+            ',"num19":"'+num19+'","num20":"'+num20+'","num21":"'+num21+'","num22":"'+num22+'"}';
+
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tSystemPrice/smallSubmit", function(data){
+            Feng.success("操作成功!");
+            location.reload();
+        },function(data){
+            Feng.error("操作失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("kcId", kcId);
+        ajax.set("json1", json1);
+        ajax.set("tcId", tcId);
+        ajax.set("json2", json2);
+        ajax.start();
+    }
+
+
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice.html
new file mode 100644
index 0000000..3d98984
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice.html
@@ -0,0 +1,52 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>专车价格设置管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="车型名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">冻结</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TSystemPrice.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TSystemPrice.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TSystemPriceTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tSystemPrice/addSpecial")){
+                                <#button name="添加" icon="fa-plus" clickFun="TSystemPrice.addSpecial()"/>
+                            @}
+                            @if(shiro.hasPermission("/tSystemPrice/updateSpecial")){
+                                <#button name="修改" icon="fa-edit" clickFun="TSystemPrice.updateSpecial()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tSystemPrice/deleteSpecial")){
+                                <#button name="删除" icon="fa-remove" clickFun="TSystemPrice.deleteSpecial()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tSystemPrice/freezeSpecial")){
+                                <#button name="冻结" icon="fa-remove" clickFun="TSystemPrice.freezeSpecial()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tSystemPrice/thawSpecial")){
+                                <#button name="解冻" icon="fa-remove" clickFun="TSystemPrice.thawSpecial()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TSystemPriceTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tSystemPrice/tSystemPrice.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice_add.html
new file mode 100644
index 0000000..41ed804
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice_add.html
@@ -0,0 +1,182 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="specialPriceInfoForm">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">选择车型:</label>
+                        <div class="col-sm-10">
+                            <select class="form-control" id="serverCarModelId" name="serverCarModelId"  style="width: 200px;">
+                                <option value="">选择车型</option>
+                                @for(obj in modelList!){
+                                <option value="${obj.id}">${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">运价类型说明:</label>
+                        <div class="col-sm-10">
+                            <textarea class="form-control" id="fareTypeNote" name="fareTypeNote" style="height: 100px;"></textarea>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">起步价设置:</label>
+                        <div class="col-sm-10">
+                            起步价为&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num1" id="num1" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元,
+                            起步包含&nbsp;<input type="text" oninput="checkIsGongLi(this)" name="num2" id="num2" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里,
+                            &nbsp;<input type="text" oninput="checkIsMinute(this)" name="num3" id="num3" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;分钟
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">里程费设置:</label>
+                        <div class="col-sm-10">
+                            超过起步里程后每公里&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num4" id="num4" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">时长费设置:</label>
+                        <div class="col-sm-10">
+                            超过起步时长后每分钟&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num5" id="num5" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">等待费设置:</label>
+                        <div class="col-sm-10">
+                            司机到达预约地点&nbsp;<input type="text" oninput="checkIsMinute(this)" name="num6" id="num6" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;分钟过后开始收取等待费,
+                            为&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num7" id="num7" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元/分,不足一分钟按照一分钟计算
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">远途费设置:</label>
+                        <div class="col-sm-10">
+                            总里程超过&nbsp;<input type="text" oninput="checkIsGongLi(this)" name="num8" id="num8" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里
+                            不足&nbsp;<input type="text" oninput="checkIsGongLi(this)" name="num9" id="num9" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里,
+                            超出部分每公里加收&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num10" id="num10" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br>
+                            <br>
+                            超过&nbsp;<input type="text" disabled oninput="checkIsGongLi(this)" name="num11" id="num11" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里
+                            不足&nbsp;<input type="text" oninput="checkIsGongLi(this)" name="num12" id="num12" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里时,
+                            超出部分每公里加收&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num13" id="num13" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                            <br>
+                            超过&nbsp;<input type="text" disabled oninput="checkIsGongLi(this)" name="num14" id="num14" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里以后,
+                            超出部分每公里加收&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num15" id="num15" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">夜间行驶费用设置:</label>
+                        <div class="col-sm-10">
+                            <input type="text" name="num16" id="num16" class="form-control newWidth" placeholder="选择时间"/>&nbsp;点为夜间行驶时间,
+                            起步价变为&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num17" id="num17" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br>
+                            <br>
+                            里程费为每公里&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num18" id="num18" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元,
+                            时长费为每分钟&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num19" id="num19" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br>
+                            <br>
+                            远途费为每公里加收&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num20" id="num20" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;
+                            、&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num21" id="num21" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;
+                            、&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num22" id="num22" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">高峰期费用设置:</label>
+                        <div class="col-sm-10">
+                            <input type="text" name="num23" id="num23" class="form-control newWidth" placeholder="选择时间段"/>&nbsp;
+                            和&nbsp;&nbsp;<input type="text" name="num24" id="num24" class="form-control newWidth" placeholder="选择时间段"/>&nbsp;为高峰期行车时间,
+                            起步价变为&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num25" id="num25" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br>
+                            <br>
+                            里程费为每公里&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num26" id="num26" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元,
+                            时长费为每分钟&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num27" id="num27" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br>
+                            <br>
+                            远途费为每公里加收&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num28" id="num28" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;
+                            、&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num29" id="num29" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;
+                            、&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num30" id="num30" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSystemPriceInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSystemPriceInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tSystemPrice/tSystemPrice_info.js"></script>
+<script type="text/javascript">
+    laydate.render({
+        elem: '#num16'
+        ,type: 'time'
+        ,range: '-'
+        ,format: 'HH:mm'
+    });
+    laydate.render({
+        elem: '#num23'
+        ,type: 'time'
+        ,range: '-'
+        ,format: 'HH:mm'
+    });
+    laydate.render({
+        elem: '#num24'
+        ,type: 'time'
+        ,range: '-'
+        ,format: 'HH:mm'
+    });
+
+    var regDouble = /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/;
+    var regInt = /^[0-9]{0,3}$/;
+    function checkIsYuan(obj){
+        var num = $(obj).val();
+        if(!regDouble.test(num)){
+            layer.msg("【元】输入框不能超过3位数,保留两位小数");
+        }
+    }
+    function checkIsGongLi(obj){
+        var num = $(obj).val();
+        if(!regDouble.test(num)){
+            layer.msg("【公里】输入框不能超过3位数,保留两位小数");
+        }
+        if (obj.id == "num9"){
+            $("#num11").val(num);
+        }else if (obj.id == "num12"){
+            $("#num14").val(num);
+        }
+    }
+    function checkIsMinute(obj){
+        var num = $(obj).val();
+        if(!regInt.test(num)){
+            layer.msg("【分钟】输入框不能超过3位数");
+        }
+    }
+
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice_edit.html
new file mode 100644
index 0000000..d7a30f4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tSystemPrice/tSystemPrice_edit.html
@@ -0,0 +1,182 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="specialPriceInfoForm">
+            <label style="display: none;" id="id">${item.id}</label>
+            <div class="row">
+                <div class="col-sm-111">
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">选择车型:</label>
+                        <div class="col-sm-10">
+                            <select class="form-control" id="serverCarModelId" name="serverCarModelId"  style="width: 200px;">
+                                <option value="">选择车型</option>
+                                @for(obj in modelList!){
+                                <option value="${obj.id}" ${obj.id == item.serverCarModelId ? 'selected=selected' : ''}>${obj.name}</option>
+                                @}
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">运价类型说明:</label>
+                        <div class="col-sm-10">
+                            <textarea class="form-control" id="fareTypeNote" name="fareTypeNote" style="height: 100px;">${item.fareTypeNote}</textarea>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">起步价设置:</label>
+                        <div class="col-sm-10">
+                            起步价为&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num1" id="num1" value="${json.num1}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元,
+                            起步包含&nbsp;<input type="text" oninput="checkIsGongLi(this)" name="num2" id="num2" value="${json.num2}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里,
+                            &nbsp;<input type="text" oninput="checkIsMinute(this)" name="num3" id="num3" value="${json.num3}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;分钟
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">里程费设置:</label>
+                        <div class="col-sm-10">
+                            超过起步里程后每公里&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num4" id="num4" value="${json.num4}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">时长费设置:</label>
+                        <div class="col-sm-10">
+                            超过起步时长后每分钟&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num5" id="num5" value="${json.num5}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">等待费设置:</label>
+                        <div class="col-sm-10">
+                            司机到达预约地点&nbsp;<input type="text" oninput="checkIsMinute(this)" name="num6" id="num6" value="${json.num6}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;分钟过后开始收取等待费,
+                            为&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num7" id="num7" value="${json.num7}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元/分,不足一分钟按照一分钟计算
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">远途费设置:</label>
+                        <div class="col-sm-10">
+                            总里程超过&nbsp;<input type="text" oninput="checkIsGongLi(this)" name="num8" id="num8" value="${json.num8}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里
+                            不足&nbsp;<input type="text" oninput="checkIsGongLi(this)" name="num9" id="num9" value="${json.num9}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里,
+                            超出部分每公里加收&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num10" id="num10" value="${json.num10}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br>
+                            <br>
+                            超过&nbsp;<input type="text" disabled oninput="checkIsGongLi(this)" name="num11" id="num11" value="${json.num11}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里
+                            不足&nbsp;<input type="text" oninput="checkIsGongLi(this)" name="num12" id="num12" value="${json.num12}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里时,
+                            超出部分每公里加收&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num13" value="${json.num13}" id="num13" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                            <br>
+                            超过&nbsp;<input type="text" disabled oninput="checkIsGongLi(this)" name="num14" id="num14" value="${json.num14}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;公里以后,
+                            超出部分每公里加收&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num15" id="num15" value="${json.num15}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">夜间行驶费用设置:</label>
+                        <div class="col-sm-10">
+                            <input type="text" name="num16" id="num16" value="${json.num16}" class="form-control newWidth" placeholder="选择时间"/>&nbsp;点为夜间行驶时间,
+                            起步价变为&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num17" id="num17" value="${json.num17}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br>
+                            <br>
+                            里程费为每公里&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num18" id="num18" value="${json.num18}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元,
+                            时长费为每分钟&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num19" id="num19" value="${json.num19}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br>
+                            <br>
+                            远途费为每公里加收&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num20" id="num20" value="${json.num20}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;
+                            、&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num21" id="num21" value="${json.num21}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;
+                            、&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num22" id="num22" value="${json.num22}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label">高峰期费用设置:</label>
+                        <div class="col-sm-10">
+                            <input type="text" name="num23" id="num23" value="${json.num23}" class="form-control newWidth" placeholder="选择时间段"/>&nbsp;
+                            和&nbsp;&nbsp;<input type="text" name="num24" id="num24" value="${json.num24}" class="form-control newWidth" placeholder="选择时间段"/>&nbsp;为高峰期行车时间,
+                            起步价变为&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num25" id="num25" value="${json.num25}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br>
+                            <br>
+                            里程费为每公里&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num26" id="num26" value="${json.num26}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元,
+                            时长费为每分钟&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num27" id="num27" value="${json.num27}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br>
+                            <br>
+                            远途费为每公里加收&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num28" id="num28" value="${json.num28}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;
+                            、&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num29" id="num29" value="${json.num29}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;
+                            、&nbsp;<input type="text" oninput="checkIsYuan(this)" name="num30" id="num30" value="${json.num30}" class="form-control newWidth" placeholder="最多3位数"/>&nbsp;元
+                            <br/>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TSystemPriceInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TSystemPriceInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tSystemPrice/tSystemPrice_info.js"></script>
+<script type="text/javascript">
+    laydate.render({
+        elem: '#num16'
+        ,type: 'time'
+        ,range: '-'
+        ,format: 'HH:mm'
+    });
+    laydate.render({
+        elem: '#num23'
+        ,type: 'time'
+        ,range: '-'
+        ,format: 'HH:mm'
+    });
+    laydate.render({
+        elem: '#num24'
+        ,type: 'time'
+        ,range: '-'
+        ,format: 'HH:mm'
+    });
+
+    var regDouble = /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/;
+    var regInt = /^[0-9]{0,3}$/;
+    function checkIsYuan(obj){
+        var num = $(obj).val();
+        if(!regDouble.test(num)){
+            layer.msg("【元】输入框不能超过3位数,保留两位小数");
+        }
+    }
+    function checkIsGongLi(obj){
+        var num = $(obj).val();
+        if(!regDouble.test(num)){
+            layer.msg("【公里】输入框不能超过3位数,保留两位小数");
+        }
+        if (obj.id == "num9"){
+            $("#num11").val(num);
+        }else if (obj.id == "num12"){
+            $("#num14").val(num);
+        }
+    }
+    function checkIsMinute(obj){
+        var num = $(obj).val();
+        if(!regInt.test(num)){
+            layer.msg("【分钟】输入框不能超过3位数");
+        }
+    }
+
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser.html
new file mode 100644
index 0000000..a6e9ced
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser.html
@@ -0,0 +1,84 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>用户管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="注册时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="id" name="用户ID" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="nickName" name="昵称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="phone" name="手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="isAuth" name="是否实名认证" >
+                                    <option value="">全部</option>
+                                    <option value="1">否</option>
+                                    <option value="2">是</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">正常</option>
+                                    <option value="2">冻结</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TUser.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TUser.resetSearch()" space="true"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <input type="file" name="file" style="width:0px;height:0px;" id="uploadEventFile" onchange="TUser.exportUser()">
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TUserTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tUser/userDetail")){
+                                <#button name="用户详情" icon="fa-plus" clickFun="TUser.userDetail()"/>
+                            @}
+                            @if(shiro.hasPermission("/tUser/updateBalance")){
+                                <#button name="修改余额" icon="fa-edit" clickFun="TUser.updateBalance()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tUser/updatePassword")){
+                                <#button name="修改密码" icon="fa-remove" clickFun="TUser.updatePassword()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tUser/freezeUser")){
+                                <#button name="冻结" icon="fa-remove" clickFun="TUser.freezeUser()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tUser/trawUser")){
+                                <#button name="解冻" icon="fa-remove" clickFun="TUser.trawUser()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tUser/inUser")){
+                                <#button btnCss="info" name="下载模板" id="uploadModel" icon="fa fa-level-down" clickFun="TUser.uploadUserModel()" space="true"/>
+                                <#button btnCss="danger" name="导入" id="uploadEventBtn" icon="fa fa-level-up" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tUser/outUser")){
+                                <#button name="导出" icon="fa-remove" clickFun="TUser.outUser()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TUserTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tUser/tUser.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_add.html
new file mode 100644
index 0000000..b239da4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_add.html
@@ -0,0 +1,54 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键id" underline="true"/>
+                            <#input id="companyId" name="企业id" underline="true"/>
+                            <#input id="registIp" name="注册ip" underline="true"/>
+                            <#input id="registAreaCode" name="注册地区县code" underline="true"/>
+                            <#input id="phone" name="手机号" underline="true"/>
+                            <#input id="nickName" name="昵称" underline="true"/>
+                            <#input id="avatar" name="头像" underline="true"/>
+                            <#input id="birthday" name="生日" underline="true"/>
+                            <#input id="sex" name="性别(1:男,2:女)" underline="true"/>
+                            <#input id="emergencyContact" name="紧急联系人" underline="true"/>
+                            <#input id="emergencyContactNumber" name="紧急联系电话" underline="true"/>
+                            <#input id="isAuth" name="是否实名认证(1=否,2=是)" underline="true"/>
+                            <#input id="name" name="真实姓名" underline="true"/>
+                            <#input id="idCard" name="身份证号" underline="true"/>
+                            <#input id="idCardFront" name="身份证正面"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="idCardReverse" name="身份证反面" underline="true"/>
+                            <#input id="consumption" name="历史消费" underline="true"/>
+                            <#input id="balance" name="余额" underline="true"/>
+                            <#input id="integral" name="积分" underline="true"/>
+                            <#input id="passWord" name="密码" underline="true"/>
+                            <#input id="openId" name="微信openid" underline="true"/>
+                            <#input id="unionid" name="微信unionid" underline="true"/>
+                            <#input id="remark" name="备注" underline="true"/>
+                            <#input id="state" name="1=正常,2=冻结" underline="true"/>
+                            <#input id="flag" name="1:创建,2:修改,3:删除" underline="true"/>
+                            <#input id="insertTime" name="" underline="true"/>
+                            <#input id="insertUser" name="" underline="true"/>
+                            <#input id="updateTime" name="" underline="true"/>
+                            <#input id="updateUser" name="" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TUserInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TUserInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tUser/tUser_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_edit.html
new file mode 100644
index 0000000..ae6955d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_edit.html
@@ -0,0 +1,54 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键id" value="${item.id}" underline="true"/>
+                            <#input id="companyId" name="企业id" value="${item.companyId}" underline="true"/>
+                            <#input id="registIp" name="注册ip" value="${item.registIp}" underline="true"/>
+                            <#input id="registAreaCode" name="注册地区县code" value="${item.registAreaCode}" underline="true"/>
+                            <#input id="phone" name="手机号" value="${item.phone}" underline="true"/>
+                            <#input id="nickName" name="昵称" value="${item.nickName}" underline="true"/>
+                            <#input id="avatar" name="头像" value="${item.avatar}" underline="true"/>
+                            <#input id="birthday" name="生日" value="${item.birthday}" underline="true"/>
+                            <#input id="sex" name="性别(1:男,2:女)" value="${item.sex}" underline="true"/>
+                            <#input id="emergencyContact" name="紧急联系人" value="${item.emergencyContact}" underline="true"/>
+                            <#input id="emergencyContactNumber" name="紧急联系电话" value="${item.emergencyContactNumber}" underline="true"/>
+                            <#input id="isAuth" name="是否实名认证(1=否,2=是)" value="${item.isAuth}" underline="true"/>
+                            <#input id="name" name="真实姓名" value="${item.name}" underline="true"/>
+                            <#input id="idCard" name="身份证号" value="${item.idCard}" underline="true"/>
+                            <#input id="idCardFront" name="身份证正面" value="${item.idCardFront}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="idCardReverse" name="身份证反面" value="${item.idCardReverse}" underline="true"/>
+                            <#input id="consumption" name="历史消费" value="${item.consumption}" underline="true"/>
+                            <#input id="balance" name="余额" value="${item.balance}" underline="true"/>
+                            <#input id="integral" name="积分" value="${item.integral}" underline="true"/>
+                            <#input id="passWord" name="密码" value="${item.passWord}" underline="true"/>
+                            <#input id="openId" name="微信openid" value="${item.openId}" underline="true"/>
+                            <#input id="unionid" name="微信unionid" value="${item.unionid}" underline="true"/>
+                            <#input id="remark" name="备注" value="${item.remark}" underline="true"/>
+                            <#input id="state" name="1=正常,2=冻结" value="${item.state}" underline="true"/>
+                            <#input id="flag" name="1:创建,2:修改,3:删除" value="${item.flag}" underline="true"/>
+                            <#input id="insertTime" name="" value="${item.insertTime}" underline="true"/>
+                            <#input id="insertUser" name="" value="${item.insertUser}" underline="true"/>
+                            <#input id="updateTime" name="" value="${item.updateTime}" underline="true"/>
+                            <#input id="updateUser" name="" value="${item.updateUser}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TUserInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TUserInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tUser/tUser_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_optUser.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_optUser.html
new file mode 100644
index 0000000..918c7bc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_optUser.html
@@ -0,0 +1,29 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="userInfoForm">
+            <input type="hidden" id="tUserId" name="tUserId" value="${tUserId}">
+            <input type="hidden" id="optType" name="optType" value="${optType}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">备注</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t" style="text-align: center;">
+                <div class="col-sm-12">
+                    <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="TUserInfoDlg.optUser()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TUserInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tUser/tUser_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_updateBalance.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_updateBalance.html
new file mode 100644
index 0000000..9b01dad
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_updateBalance.html
@@ -0,0 +1,28 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="userInfoForm">
+            <input type="hidden" id="tUserId" name="tUserId" value="${tUserId}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#select id="updateType" name="修改类型:">
+                        <option value="">请选择</option>
+                        <option value="1">增加</option>
+                        <option value="2">减少</option>
+                    </#select>
+                    <#input id="money" name="修改值" value=""/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t" style="text-align: center;">
+                <div class="col-sm-12">
+                    <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="TUserInfoDlg.updateBalance()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TUserInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tUser/tUser_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_updatePassword.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_updatePassword.html
new file mode 100644
index 0000000..7c641f3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_updatePassword.html
@@ -0,0 +1,24 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="userInfoForm">
+            <input type="hidden" id="tUserId" name="tUserId" value="${tUserId}">
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="password" name="密码" type="password"/>
+                    <#input id="rePassword" name="确认密码" type="password"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t" style="text-align: center;">
+                <div class="col-sm-12">
+                    <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="TUserInfoDlg.updatePassword()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TUserInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tUser/tUser_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_userDetail.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_userDetail.html
new file mode 100644
index 0000000..adc6932
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUser/tUser_userDetail.html
@@ -0,0 +1,108 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">用户详情</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <#label id="insertTimeStr" name="注册时间" value="${item.insertTimeStr}"/>
+                    <#label id="registIp" name="注册地IP" value="${item.registIp}"/>
+                    <#label id="phone" name="手机号" value="${item.phone}"/>
+                    <#label id="emergencyContact" name="紧急联系人姓名" value="${item.emergencyContact}"/>
+                    <#label id="isAuthStr" name="是否实名认证" value="${item.isAuthStr}"/>
+
+                </div>
+                <div class="col-sm-6">
+                    <#label id="id" name="用户ID" value="${item.id}"/>
+                    <#label id="companyName" name="注册地分公司" value="${item.companyName}"/>
+                    <#label id="nickName" name="昵称" value="${item.nickName}"/>
+                    <#label id="emergencyContactNumber" name="紧急联系人电话" value="${item.emergencyContactNumber}"/>
+                </div>
+            </div>
+
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">认证资料</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6">
+                    <#label id="name" name="姓名" value="${item.name}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">身份证正面照:</label>
+                        <div class="col-sm-9">
+                            <div class="form-group">
+                                <div class="col-sm-6">
+                                    <div id="idCardFrontPreId">
+                                        <div>
+                                            @if(isEmpty(item.idCardFront)){
+                                            <img onclick="lookBigImg('${ctxPath}/static/img/NoPIC.png')" src="${ctxPath}/static/img/NoPIC.png" style="max-width:150px;">
+                                            @}else{
+                                            <img onclick="lookBigImg('${item.idCardFront}')" src="${item.idCardFront}" style="max-width:250px;">
+                                            @}
+                                        </div>
+                                    </div>
+                                </div>
+                                <input type="hidden" id="idCardFront" name="idCardFront" value="${item.idCardFront}"/>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-6">
+                    <#label id="idCard" name="身份证号" value="${item.idCard}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">身份证正面照:</label>
+                        <div class="col-sm-9">
+                            <div class="form-group">
+                                <div class="col-sm-6">
+                                    <div id="idCardReversePreId">
+                                        <div>
+                                            @if(isEmpty(item.idCardReverse)){
+                                            <img onclick="lookBigImg('${ctxPath}/static/img/NoPIC.png')" src="${ctxPath}/static/img/NoPIC.png" style="max-width:150px;">
+                                            @}else{
+                                            <img onclick="lookBigImg('${item.idCardReverse}')" src="${item.idCardReverse}" style="max-width:250px;">
+                                            @}
+                                        </div>
+                                    </div>
+                                </div>
+                                <input type="hidden" id="idCardReverse" name="idCardReverse" value="${item.idCardReverse}"/>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row" style="margin-top: 30px;">
+                <div class="col-sm-4">
+                    <h2 class="h3Class" style="font-weight: 700;">历史出行次数</h2>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6">
+                    <#label id="zcNum" name="专车" value="${item.zcNum}"/>
+                    <#label id="czNum" name="出租车" value="${item.czNum}"/>
+                    <#label id="consumptionStr" name="历史消费" value="¥${item.consumptionNum}"/>
+                    <#label id="integral" name="积分" value="${item.integral}"/>
+                </div>
+                <div class="col-sm-6">
+                    <#label id="kcNum" name="跨城出行" value="${item.kcNum}"/>
+                    <#label id="wlNum" name="小件物流" value="${item.wlNum}"/>
+                    <#label id="balance" name="钱包余额" value="¥${item.balanceStr}"/>
+                    @if(item.state == 1){
+                    <#label id="state" name="状态" value="正常" style="color: #0d8ddb;"/>
+                    @}else if(item.state == 2){
+                    <#label id="state" name="状态" value="冻结" style="color: red;"/>
+                    @}
+                </div>
+            </div>
+
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tUser/tUser_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord.html
new file mode 100644
index 0000000..96f063e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord.html
@@ -0,0 +1,61 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <input type="hidden" id="couponActivityId" value="${couponActivityId}">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="领取时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="领取人" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userPhone" name="领取人电话" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">未使用</option>
+                                    <option value="2">已使用</option>
+                                    <option value="3">已过期</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TUserRedPacketRecord.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TUserRedPacketRecord.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+
+                        <div class="hidden-xs" id="TUserRedPacketRecordTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tUserRedPacketRecord/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TUserRedPacketRecord.openAddTUserRedPacketRecord()"/>
+                            @}
+                            @if(shiro.hasPermission("/tUserRedPacketRecord/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="TUserRedPacketRecord.openTUserRedPacketRecordDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tUserRedPacketRecord/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TUserRedPacketRecord.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TUserRedPacketRecordTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tUserRedPacketRecord/tUserRedPacketRecord.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord_add.html
new file mode 100644
index 0000000..979bddc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord_add.html
@@ -0,0 +1,35 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" underline="true"/>
+                            <#input id="money" name="金额" underline="true"/>
+                            <#input id="expirationTime" name="过期时间" underline="true"/>
+                            <#input id="insertTime" name="获取时间" underline="true"/>
+                            <#input id="companyId" name="公司id"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="state" name="状态(0=临时,1=未使用,2=已使用,3=已过期)" underline="true"/>
+                            <#input id="orderId" name="订单id" underline="true"/>
+                            <#input id="orderType" name="订单类型(1=专车,2=出租车,3=城际,4=小件物流)" underline="true"/>
+                            <#input id="userId" name="用户id" underline="true"/>
+                            <#input id="redPacketActivityId" name="活动id" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TUserRedPacketRecordInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TUserRedPacketRecordInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tUserRedPacketRecord/tUserRedPacketRecord_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord_edit.html
new file mode 100644
index 0000000..5b092c2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tUserRedPacketRecord/tUserRedPacketRecord_edit.html
@@ -0,0 +1,35 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" value="${item.id}" underline="true"/>
+                            <#input id="money" name="金额" value="${item.money}" underline="true"/>
+                            <#input id="expirationTime" name="过期时间" value="${item.expirationTime}" underline="true"/>
+                            <#input id="insertTime" name="获取时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="companyId" name="公司id" value="${item.companyId}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="state" name="状态(0=临时,1=未使用,2=已使用,3=已过期)" value="${item.state}" underline="true"/>
+                            <#input id="orderId" name="订单id" value="${item.orderId}" underline="true"/>
+                            <#input id="orderType" name="订单类型(1=专车,2=出租车,3=城际,4=小件物流)" value="${item.orderType}" underline="true"/>
+                            <#input id="userId" name="用户id" value="${item.userId}" underline="true"/>
+                            <#input id="redPacketActivityId" name="活动id" value="${item.redPacketActivityId}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TUserRedPacketRecordInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TUserRedPacketRecordInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tUserRedPacketRecord/tUserRedPacketRecord_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified.html
new file mode 100644
index 0000000..7c32649
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified.html
@@ -0,0 +1,59 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>实名认证列表管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="提交时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="用户昵称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userPhone" name="手机号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">待认证</option>
+                                    <option value="2">认证通过</option>
+                                    <option value="3">认证失败</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TVerified.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TVerified.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TVerifiedTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tVerified/immediately")){
+                                <#button name="立即审核" icon="fa-edit" clickFun="TVerified.immediately()"/>
+                            @}
+                            @if(shiro.hasPermission("/tVerified/delete")){
+                                <#button name="删除记录" icon="fa-remove" clickFun="TVerified.delete()"/>
+                            @}
+                        </div>
+                        <#table id="TVerifiedTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tVerified/tVerified.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_add.html
new file mode 100644
index 0000000..5fb3278
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_add.html
@@ -0,0 +1,33 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" underline="true"/>
+                            <#input id="userId" name="用户id" underline="true"/>
+                            <#input id="name" name="认证姓名" underline="true"/>
+                            <#input id="idcode" name="身份证号码"/>
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="img1" name="身份证正面照" underline="true"/>
+                            <#input id="img2" name="身份证背面照" underline="true"/>
+                            <#input id="state" name="认证结果(1=待认证,2=认证通过,3=认证失败)" underline="true"/>
+                            <#input id="insertTime" name="请求时间" underline="true"/>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TVerifiedInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TVerifiedInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tVerified/tVerified_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_edit.html
new file mode 100644
index 0000000..7ce2271
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_edit.html
@@ -0,0 +1,33 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="" value="${item.id}" underline="true"/>
+                            <#input id="userId" name="用户id" value="${item.userId}" underline="true"/>
+                            <#input id="name" name="认证姓名" value="${item.name}" underline="true"/>
+                            <#input id="idcode" name="身份证号码" value="${item.idcode}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="img1" name="身份证正面照" value="${item.img1}" underline="true"/>
+                            <#input id="img2" name="身份证背面照" value="${item.img2}" underline="true"/>
+                            <#input id="state" name="认证结果(1=待认证,2=认证通过,3=认证失败)" value="${item.state}" underline="true"/>
+                            <#input id="insertTime" name="请求时间" value="${item.insertTime}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TVerifiedInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TVerifiedInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tVerified/tVerified_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_immediately.html
new file mode 100644
index 0000000..3c7b069
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVerified/tVerified_immediately.html
@@ -0,0 +1,35 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <input type="hidden" id="id" name="id" value="${tVerifiedId}">
+            <div class="row">
+                <div class="col-sm-10">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">处理意见:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="state2" value="2" name="state" checked="" >
+                                <label for="state2"> 审核成功 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="state3" value="3" name="state" >
+                                <label for="state3"> 审核失败 </label>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TVerifiedInfoDlg.immediately()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TVerifiedInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tVerified/tVerified_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement.html
new file mode 100644
index 0000000..1af1137
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement.html
@@ -0,0 +1,49 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>版本管理</h5>
+            </div>
+            <input style="position: fixed;left: -50000%;top: 0;" id="input" name="input">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="version" name="版本编号" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TVersionManagement.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TVersionManagement.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TVersionManagementTableToolbar" role="group">
+                            @if(shiro.hasPermission("/tVersionManagement/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="TVersionManagement.openAddTVersionManagement()"/>
+                            @}
+                            @if(shiro.hasPermission("/tVersionManagement/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="TVersionManagement.openTVersionManagementDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/tVersionManagement/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="TVersionManagement.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="TVersionManagementTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tVersionManagement/tVersionManagement.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement_add.html
new file mode 100644
index 0000000..92c41a8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement_add.html
@@ -0,0 +1,72 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="versionInfoForm">
+
+            <div class="row">
+                <div class="col-sm-11">
+                    <#input id="version" name="版本编号" />
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">端口类型:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="type1" value="1" name="type" checked="" >
+                                <label for="type1"> 用户端 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="type2" value="2" name="type" >
+                                <label for="type2"> 司机端 </label>
+                            </div>
+                            <div class="radio radio-primary radio-inline">
+                                <input type="radio" id="type3" value="3" name="type" >
+                                <label for="type3"> 车载端 </label>
+                            </div>
+                            <div class="radio radio-primary radio-inline">
+                                <input type="radio" id="type4" value="4" name="type" >
+                                <label for="type4"> 调度端 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <div id="androidDiv">
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">上传apk文件:</label>
+                            <div class="col-sm-9">
+                                <input type="file" name="images" onchange="TVersionManagementInfoDlg.previewFile()">
+                            </div>
+                        </div>
+                    </div>
+                    <#input id="url" name="版本链接" disabled="disabled"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">是否强制更新:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="mandatory1" value="1" name="mandatory" checked="" >
+                                <label for="mandatory1"> 是 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="mandatory2" value="2" name="mandatory" >
+                                <label for="mandatory2"> 否 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">版本公告:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="content" id="content" placeholder="多行输入" style="width:100%;height:150px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TVersionManagementInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TVersionManagementInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tVersionManagement/tVersionManagement_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement_edit.html
new file mode 100644
index 0000000..e87955b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tVersionManagement/tVersionManagement_edit.html
@@ -0,0 +1,32 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                            <#input id="id" name="主键id" value="${item.id}" underline="true"/>
+                            <#input id="url" name="包路径" value="${item.url}" underline="true"/>
+                            <#input id="version" name="版本号" value="${item.version}" underline="true"/>
+                            <#input id="content" name="更新公告" value="${item.content}" />
+                </div>
+
+                <div class="col-sm-6">
+                            <#input id="mandatory" name="是否强制升级(1=是  2=否)" value="${item.mandatory}" underline="true"/>
+                            <#input id="insertTime" name="更新时间" value="${item.insertTime}" underline="true"/>
+                            <#input id="type" name="类型(1=安卓,2=ios)" value="${item.type}" />
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TVersionManagementInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TVersionManagementInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tVersionManagement/tVersionManagement_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user.html
new file mode 100644
index 0000000..b444d0f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user.html
@@ -0,0 +1,80 @@
+@layout("/common/_container.html"){
+<div class="row">
+	<div class="col-sm-12">
+		<div class="ibox float-e-margins">
+			<div class="ibox-title">
+				<h5>用户管理</h5>
+			</div>
+			<div class="ibox-content">
+				<div class="row row-lg">
+					<div class="col-sm-12">
+						<div class="row">
+							<div class="col-lg-2 col-sm-3">
+								<div class="panel panel-default">
+									<div class="panel-heading">组织机构</div>
+									<div class="panel-body dept-tree">
+										<ul id="deptTree" class="ztree"></ul>
+									</div>
+								</div>
+							</div>
+							<div class="col-lg-10 col-sm-9">
+								<div class="row">
+									<div class="col-lg-10 col-sm-9">
+										<div class="row">
+											<div class="col-lg-4 col-sm-6">
+												<#TimeCon id="createTime" name="创建时间" isTime="false"/>
+											</div>
+											<div class="col-lg-4 col-sm-12">
+												<#NameCon id="name" name="用户名称" placeholder="帐号/姓名/手机号"/>
+											</div>
+										</div>
+									</div>
+									<div class="col-lg-2 col-sm-3">
+										<div class="row">
+											<div class="col-lg-12 col-sm-12">
+												<#button name="搜索" icon="fa-search" clickFun="MgrUser.search()"/>
+												<#button name="重置" icon="fa-trash" clickFun="MgrUser.resetSearch()" space="true"/>
+											</div>
+										</div>
+									</div>
+								</div>
+								<div class="hidden-xs" id="managerTableToolbar" role="group">
+									@if(shiro.hasPermission("/mgr/add")){
+									<#button name="添加" icon="fa-plus" clickFun="MgrUser.openAddMgr()"/>
+									@}
+									@if(shiro.hasPermission("/mgr/edit")){
+									<#button name="修改" icon="fa-edit" clickFun="MgrUser.openChangeUser()" space="true"/>
+									@}
+									@if(shiro.hasPermission("/mgr/delete")){
+									<#button name="删除" icon="fa-remove" clickFun="MgrUser.delMgrUser()" space="true"/>
+									@}
+									@if(shiro.hasPermission("/mgr/reset")){
+									<#button name="重置密码" icon="fa-refresh" clickFun="MgrUser.resetPwd()" space="true"/>
+									@}
+									@if(shiro.hasPermission("/mgr/freeze")){
+									<#button name="冻结" icon="fa-warning" clickFun="MgrUser.freezeAccount()" space="true"/>
+									@}
+									@if(shiro.hasPermission("/mgr/unfreeze")){
+									<#button name="解除冻结" icon="fa-check-circle" clickFun="MgrUser.unfreeze()" space="true"/>
+									@}
+									@if(shiro.hasPermission("/mgr/setRole")){
+									<#button name="角色分配" icon="fa-user-secret" clickFun="MgrUser.roleAssign()" space="true"/>
+									@}
+								</div>
+								<#table id="managerTable"/>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+<script src="${ctxPath}/static/modular/system/user/user.js"></script>
+<script type="text/javascript">
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_add.html
new file mode 100644
index 0000000..ed9ba50
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_add.html
@@ -0,0 +1,62 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+	<div class="ibox-content">
+		<div class="form-horizontal" id="userInfoForm">
+
+			<input type="hidden" id="id" value="">
+
+			<div class="row">
+				<div class="col-sm-6 b-r">
+					<#input id="account" name="账户" underline="true"/>
+
+					<#select id="sex" name="性别:" underline="true">
+						<option value="1">男</option>
+						<option value="2">女</option>
+					</#select>
+
+					<#input id="password" name="密码" underline="true" type="password"/>
+					<#input id="rePassword" name="确认密码" type="password"/>
+
+					<#input id="email" name="邮箱" type="email"/>
+					<!--<#input id="roleid" name="角色" underline="true" type="hidden" disabled="disabled"/>-->
+				</div>
+				<div class="col-sm-6">
+					<div id="driverInfoContent">
+						<#input id="name" name="姓名" underline="true"/>
+
+						<#input id="birthday" name="出生日期" underline="true" type="text"/>
+
+						<#input id="citySel" name="部门" underline="true" readonly="readonly" hidden="deptid"
+						clickFun="UserInfoDlg.showDeptSelectTree(); return false;"
+						style="background-color: #ffffff !important;"/>
+
+						<#input id="phone" name="电话"/>
+
+
+					</div>
+				</div>
+			</div>
+
+			<!-- 这是部门选择的下拉框 -->
+			<div id="menuContent" class="menuContent"
+				 style="display: none; position: absolute; z-index: 200;">
+				<ul id="treeDemo" class="ztree tree-box" style="width: 249px !important;"></ul>
+			</div>
+
+			<div class="row btn-group-m-t">
+				<div class="col-sm-10 col-sm-offset-4">
+					<#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="UserInfoDlg.addSubmit()"/>
+					<#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="UserInfoDlg.close()"/>
+				</div>
+			</div>
+		</div>
+
+	</div>
+</div>
+<script src="${ctxPath}/static/modular/system/user/user_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#birthday'
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_chpwd.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_chpwd.html
new file mode 100644
index 0000000..06372ae
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_chpwd.html
@@ -0,0 +1,34 @@
+@layout("/common/_container.html"){
+<div class="col-sm-4  col-sm-offset-4">
+    <div class="ibox float-e-margins">
+        <div class="ibox-title">
+            <h5>修改密码</h5>
+        </div>
+        <div class="ibox-content">
+            <div class="row row-lg">
+                <div class="col-sm-12">
+                    <div class="ibox float-e-margins">
+                        <div class="ibox-content" style="border:none !important; ">
+                            <div class="form-horizontal">
+                                <div class="row">
+                                    <div class="col-sm-12">
+                                        <#input id="oldPwd" name="原密码" underline="true" type="password"/>
+                                        <#input id="newPwd" name="新密码" underline="true" type="password"/>
+                                        <#input id="rePwd" name="新密码验证" type="password"/>
+                                    </div>
+                                </div>
+                                <div class="row btn-group-m-t">
+                                    <div class="col-sm-10 col-sm-offset-5">
+                                        <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="UserInfoDlg.chPwd()"/>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/user/user_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_edit.html
new file mode 100644
index 0000000..4271878
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_edit.html
@@ -0,0 +1,58 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+	<div class="ibox-content">
+		<div class="form-horizontal" id="userInfoForm">
+
+			<input type="hidden" id="id" value="${user.id}">
+			<input type="hidden" id="sexValue" value="${user.sex}">
+
+			<div class="row">
+				<div class="col-sm-6 b-r">
+					<#input id="account" name="账户" underline="true" value="${user.account}"/>
+
+					<#select id="sex" name="性别:" underline="true">
+						<option value="1">男</option>
+						<option value="2">女</option>
+					</#select>
+
+					<#input id="citySel" name="部门" underline="false" readonly="readonly" hidden="deptid" hiddenValue="${user.deptid}" value="${deptName}" clickFun="UserInfoDlg.showDeptSelectTree(); return false;" style="background-color: #ffffff !important;"/>
+
+				<!--<#input id="roleid" name="角色" underline="true" value="${roleName}" disabled="disabled"/>-->
+				<#input id="email" name="邮箱" type="email" value="${user.email}"/>
+				</div>
+				<div class="col-sm-6">
+					<div id="driverInfoContent">
+						<#input id="name" name="姓名" underline="true" value="${user.name}"/>
+
+						<#input id="birthday" name="出生日期" underline="true" type="text"
+						value="${user.birthday}"/>
+
+						<#input id="phone" name="电话" value="${user.phone}"/>
+
+					</div>
+				</div>
+			</div>
+
+			<!-- 这是部门选择的下拉框 -->
+			<div id="menuContent" class="menuContent"
+				 style="display: none; position: absolute; z-index: 200;">
+				<ul id="treeDemo" class="ztree tree-box" style="width: 249px !important;"></ul>
+			</div>
+
+			<div class="row btn-group-m-t">
+				<div class="col-sm-10 col-sm-offset-4">
+					<#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="UserInfoDlg.editSubmit()"/>
+					<#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="UserInfoDlg.close()"/>
+				</div>
+			</div>
+		</div>
+
+	</div>
+</div>
+<script src="${ctxPath}/static/modular/system/user/user_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#birthday'
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_roleassign.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_roleassign.html
new file mode 100644
index 0000000..8131bc8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_roleassign.html
@@ -0,0 +1,79 @@
+@layout("/common/_container.html"){
+
+
+<script type="text/javascript">
+    $(function () {
+
+        var index = parent.layer.getFrameIndex(window.name); //获取窗口索引
+
+        $("#btn_close").bind("click", function () {
+            parent.layer.close(index);
+        });
+
+        $("#btn_save").bind("click", function () {
+            var ids = Feng.zTreeCheckedNodes("zTree");
+            var ajax = new $ax(Feng.ctxPath + "/mgr/setRole", function (data) {
+                Feng.success("分配角色成功!");
+                window.parent.MgrUser.table.refresh();
+                parent.layer.close(index);
+            }, function (data) {
+                Feng.error("分配角色失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("roleIds", ids);
+            ajax.set("userId", "${userId}");
+            ajax.start();
+        });
+
+        initZtree();
+    });
+
+    function initZtree() {
+        var setting = {
+            check: {
+                enable: true,
+                chkboxType: {
+                    "Y": "",
+                    "N": ""
+                }
+            },
+            data: {
+                simpleData: {
+                    enable: true
+                }
+            }
+        };
+
+        var ztree = new $ZTree("zTree", "/role/roleTreeListByUserId/${userId}");
+        ztree.setSettings(setting);
+        ztree.init();
+    }
+</script>
+
+
+<!-- 配置grid -->
+<div class="container"
+     style="padding:  0px 10px !important; margin-top: -10px; text-align: center !important;">
+    <div class="row">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>${userAccount!}</h5>
+            </div>
+            <div class="ibox-content">
+                <ul id="zTree" class="ztree"></ul>
+            </div>
+        </div>
+    </div>
+    <div class="row">
+        <div class="col-md-12">
+            <button class="btn btn-sm btn-info" type="button" id="btn_save">
+                <i class="ace-icon fa fa-check bigger-110"></i> 保存
+            </button>
+            &nbsp;
+            <button class="btn btn-sm btn-danger" type="button" id="btn_close">
+                <i class="ace-icon fa fa-close bigger-110"></i> 关闭
+            </button>
+        </div>
+    </div>
+</div>
+
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_view.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_view.html
new file mode 100644
index 0000000..280c7e9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/user/user_view.html
@@ -0,0 +1,75 @@
+@layout("/common/_container.html"){
+<div class="col-sm-6  col-sm-offset-3">
+    <div class="ibox float-e-margins">
+        <div class="ibox-title">
+            <h5>用户管理</h5>
+        </div>
+        <div class="ibox-content">
+            <div class="row row-lg">
+                <div class="col-sm-12">
+                    <div class="ibox float-e-margins">
+                        <div class="ibox-content" style="border:none !important; ">
+                            <div class="form-horizontal" id="userInfoForm">
+
+                                <input type="hidden" id="id" value="${user.id}">
+                                <input type="hidden" id="sexValue" value="${user.sex}">
+
+                                <div class="row">
+                                    <div class="col-sm-6 b-r">
+                                        <#avatar id="avatar" name="头像" underline="true" avatarImg="${user.avatar}"/>
+
+                                        <#input id="account" name="账户" underline="true" value="${user.account}" disabled="disabled" />
+
+                                        <#select id="sex" name="性别" underline="true" value="${user.sex}">
+                                            <option value="1">男</option>
+                                            <option value="2">女</option>
+                                        </#select>
+
+                                        <#input id="roleid" name="角色" underline="true" value="${roleName}" disabled="disabled"/>
+
+                                        <#input id="email" name="邮箱" type="email" value="${user.email}"/>
+                                    </div>
+
+                                    <div class="col-sm-6">
+                                        <div id="driverInfoContent">
+                                            <#input id="name" name="姓名" underline="true" value="${user.name}"/>
+
+                                            <#input id="birthday" name="出生日期" underline="true" type="text"
+                                                    value="${user.birthday}"/>
+
+                                            <#input id="citySel" name="部门" underline="true" readonly="readonly" value="${deptName}"
+                                                    hidden="deptid" hiddenValue="${user.deptid}"
+                                                    clickFun="UserInfoDlg.showInfoDeptSelectTree(); return false;"
+                                                    style="background-color: #ffffff !important;"
+                                                    selectFlag="true" selectId="menuContent" selectTreeId="treeDemo" selectStyle="width:250px !important;"/>
+
+                                            <#input id="phone" name="电话" value="${user.phone}"/>
+                                        </div>
+                                    </div>
+                                </div>
+
+                                <div class="progress progress-striped" id="progressTipArea" style="margin-top: 20px;">
+                                    <div id="progressBar" style="width: 0%" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" role="progressbar" class="progress-bar progress-bar-info">
+                                    </div>
+                                </div>
+
+                                <div class="row btn-group-m-t">
+                                    <div class="col-sm-10 col-sm-offset-5">
+                                        <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="UserInfoDlg.editSubmit()"/>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/user/user_info.js"></script>
+<script>
+    laydate.render({
+        elem: '#birthday'
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/addRegist.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/addRegist.html
new file mode 100644
index 0000000..0efdcf4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/addRegist.html
@@ -0,0 +1,78 @@
+@layout("/common/_container.html"){
+<style>
+    .table{
+        display: inline;
+        width: 16.6666666%;
+        float:left;
+        text-align:center;
+        border-collapse:collapse;
+        font-size: 18px;
+    }
+    .table:hover{
+        background-color: rgba(255,0,0,.3);
+    }
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="sysCouponActivityInfoForm">
+            <input type="hidden" id="activityId">
+            <div class="row">
+                <div class="col-sm-7">
+                    <div class="row" id="content5" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <input type="hidden" id="id1">
+                                    <input type="hidden" id="id2">
+                                    <input type="hidden" id="id3">
+                                    <input type="hidden" id="id4">
+                                    充值:&nbsp;<input type="text"  name="zc1" id="num1" class="form-control newWidth" />&nbsp;元
+                                    <br/>
+                                    <br/>
+                                    送
+                                    &nbsp;<input type="text"  name="zc1" id="num2" class="form-control newWidth" />&nbsp;张
+                                    &nbsp;<input type="text"  name="zc1" id="num3" class="form-control newWidth" placeholder="请选择" readonly="readonly" onclick="RegistInfoDlg.selecteCoupon(0)"/>&nbsp;元通用优惠券
+                                    <br/>
+                                    <br/>
+                                    送
+                                    &nbsp;<input type="text"  name="zc1" id="num4" class="form-control newWidth" />&nbsp;张
+                                    &nbsp;<input type="text"  name="zc1" id="num5" class="form-control newWidth"  placeholder="请选择" readonly="readonly" onclick="RegistInfoDlg.selecteCoupon(1)"/>&nbsp;元专车优惠券
+                                    <br/>
+                                    <br/>
+                                    送
+                                    &nbsp;<input type="text"  name="zc1" id="num6" class="form-control newWidth" />&nbsp;张
+                                    &nbsp;<input type="text"  name="zc1" id="num7" class="form-control newWidth"  placeholder="请选择" readonly="readonly" onclick="RegistInfoDlg.selecteCoupon(2)"/>&nbsp;元出租车优惠券
+                                    <br/>
+                                    <br/>
+                                    送
+                                    &nbsp;<input type="text"  name="zc1" id="num8" class="form-control newWidth" />&nbsp;张
+                                    &nbsp;<input type="text"  name="zc1" id="num9" class="form-control newWidth"  placeholder="请选择" readonly="readonly" onclick="RegistInfoDlg.selecteCoupon(3)"/>&nbsp;元城际优惠券
+                                    <br/>
+                                    <br/>
+                                    有效期
+                                    &nbsp;<input type="text"  name="zc1" id="num10" class="form-control newWidth" />&nbsp;天,
+                                    最高金额
+                                    &nbsp;<input type="text"  name="zc1" id="num11" class="form-control newWidth" />&nbsp;元
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="addSubmit()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/userActivity/addRegist.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/receiveRecord.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/receiveRecord.html
new file mode 100644
index 0000000..8b35875
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/receiveRecord.html
@@ -0,0 +1,296 @@
+@layout("/common/_container.html"){
+<style type="text/css">
+
+    ztree li span. {
+        margin-left: 4px;
+        margin-right: -1px;
+        background-position: -144px 0;
+        vertical-align: top;
+        *vertical-align: middle
+    }
+
+    .titleDiv {
+        overflow: hidden;
+    }
+
+    .titleItem {
+        float: left;
+        text-align: center;
+        width: 180px;
+        line-height: 40px;
+        border-top: 1px solid #E7EBEE;
+        border-bottom: 1px solid #E7EBEE;
+        border-left: 1px solid #E7EBEE;
+        font-size: 16px;
+    }
+
+    .titleItem1 {
+        float: left;
+        text-align: center;
+        width: 180px;
+        line-height: 40px;
+        border-bottom: 1px solid #E7EBEE;
+        border-left: 1px solid #E7EBEE;
+        font-size: 16px;
+    }
+
+    .titleItemCk {
+        color: #fff !important;
+        background: #1AB395 !important;
+    }
+
+    .titleItem:last-child {
+        border-right: 1px solid #E7EBEE;
+    }
+
+    /* 订单分析 */
+    ul {
+        list-style-type: none;
+    }
+
+    .orderFenxiBox {
+        width: 100%;
+        display: flex;
+        align-items: center;
+        background-color: white;
+    }
+
+    .orderFenxiItem {
+        flex: 1;
+        padding: 20px 0;
+    }
+
+    .orderFenxiItem:last-child  .orderFenxiItem_number {
+        border-right: 0 none;
+    }
+
+    .orderFenxiItem_number {
+        width: 80%;
+        height: 80%;
+        line-height: 90px;
+        padding: 20px 0;
+        font-size: 32px;
+        color: #1AB394;
+        text-align: center;
+        border-right: 1px solid #eaeaea;
+    }
+
+    .orderFenxiItem_title, .orderFenxiItem_last {
+        line-height: 40px;
+        font-size: 14px;
+    }
+</style>
+
+<div class="row" style="margin-left: 2%;">
+    <div class="col-sm-3">
+        <input id="activityId" value="${activityId}" type="hidden">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>活动时间:<input type="text" id="startTime"  name="zc7" class="form-control" style="max-width:250px !important;display: initial !important;" onchange="receiveRecordDetail()"/></h3>
+            </div>
+            <div class="ibox-title">
+                <h3>领取总金额<span id="totalMOney"></span></h3>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<div class="row" style="margin-left: 2%;">
+    <div class="col-sm-3">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>注册奖励</h3>
+            </div>
+            <div class="ibox-content">
+                <h1 class="no-margins text-navy">领取人数:<span id="userActivityRegisteredNumber"></span></h1>
+                <h1 class="no-margins text-navy">领取总金额:<span id="userActivityRegisteredMoney"></span></h1>
+                <h1 class="no-margins text-navy">使用总金额:<span id="userActivityRegisteredUseMoney"></span></h1>
+            </div>
+            <h4><a href="#" onclick="driverActivityHistory(1,${userActivityRegisteredId})">领取列表</a></h4>
+        </div>
+    </div>
+    <div class="col-sm-3">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>邀请奖励</h3>
+            </div>
+            <div class="ibox-content">
+                <h1 class="no-margins text-navy">领取人数:<span id="userActivityInviteNumber"></span></h1>
+                <h1 class="no-margins text-navy">领取总金额:<span id="userActivityInviteMoney"></span></h1>
+                <h1 class="no-margins text-navy">使用总金额:<span id="userActivityInviteUseMoney"></span></h1>
+            </div>
+            <h4><a href="#" onclick="driverActivityHistory(2,${userActivityInviteId})">领取列表</a></h4>
+        </div>
+    </div>
+    <div class="col-sm-3">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>打折活动</h3>
+            </div>
+            <div class="ibox-content">
+                <h1 class="no-margins text-navy">使用人数:<span id="userActivityDiscount1Number"></span></h1>
+                <h1 class="no-margins text-navy">折扣总金额:<span id="userActivityDiscount1Money"></span></h1>
+            </div>
+        </div>
+    </div>
+    <div class="col-sm-3">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h3>红包活动</h3>
+            </div>
+            <div class="ibox-content">
+                <h1 class="no-margins text-navy">领取人数:<span id="userActivityRedenvelopeNumber"></span></h1>
+                <h1 class="no-margins text-navy">领取总金额:<span id="userActivityRedenvelopeMoney"></span></h1>
+                <h1 class="no-margins text-navy">使用总金额:<span id="userActivityRedenvelopeUseMoney"></span></h1>
+            </div>
+            <h4><a href="#" onclick="driverActivityHistory(4,${userActivityRedenvelopeId})">领取列表</a></h4>
+        </div>
+    </div>
+</div>
+
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>充值活动</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <#table id="DriverActivityTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- ChartJS-->
+<script type="text/javascript">
+    $(function () {
+        $("#startTime").val("${startTime} - ${endTime}")
+        receiveRecordDetail("${startTime} - ${endTime}");
+        var defaultColunms = DriverActivity.initColumn();
+        var table = new BSTable(DriverActivity.id, "/userActivity/blanceList", defaultColunms);
+        table.setPaginationType("server");
+        DriverActivity.table = table.init();
+    })
+    laydate.render({
+        elem: '#startTime'
+        ,range: true
+        ,done: function(value, date, endDate){
+            // 回调函数
+            receiveRecordDetail(value);
+            var queryData = {};
+            queryData['createTime'] = value;
+            queryData['activityId'] = $("#activityId").val();
+            DriverActivity.table.refresh({query: queryData});
+        }
+    });
+
+    function receiveRecordDetail(times){
+        var ajax = new $ax(Feng.ctxPath + "/userActivity/receiveRecordDetail", function (data) {
+            $("#totalMOney").html(data.totalMOney);
+            $("#userActivityRegisteredUseMoney").html(data.userActivityRegisteredUseMoney);
+            $("#userActivityRegisteredMoney").html(data.userActivityRegisteredMoney);
+            $("#userActivityRegisteredNumber").html(data.userActivityRegisteredNumber);
+            $("#userActivityInviteUseMoney").html(data.userActivityInviteUseMoney);
+            $("#userActivityInviteMoney").html(data.userActivityInviteMoney);
+            $("#userActivityInviteNumber").html(data.userActivityInviteNumber);
+            $("#userActivityDiscount1Money").html(data.userActivityDiscount1Money);
+            $("#userActivityDiscount1Number").html(data.userActivityDiscount1Number);
+            $("#userActivityRedenvelopeUseMoney").html(data.userActivityRedenvelopeUseMoney);
+            $("#userActivityRedenvelopeMoney").html(data.userActivityRedenvelopeMoney);
+            $("#userActivityRedenvelopeNumber").html(data.userActivityRedenvelopeNumber);
+        }, function (data) {
+            Feng.error("操作失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("createTime",times);
+        ajax.set("activityId",$("#activityId").val());
+        ajax.start();
+    }
+    /**
+     * 领取记录
+     */
+    function driverActivityHistory(type,id) {
+        if(type==1){
+            layer.open({
+                type: 2,
+                title: '领取记录',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/userCouponRecord?couponActivityId='+ id+"&activityType=2"
+            });
+        }else if(type==2){
+            layer.open({
+                type: 2,
+                title: '领取记录',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/userCouponRecord?couponActivityId='+ id+"&activityType=3"
+            });
+        }else if(type==4){
+            layer.open({
+                type: 2,
+                title: '领取记录',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/tUserRedPacketRecord?couponActivityId='+ id
+            });
+        }else{
+            layer.open({
+                type: 2,
+                title: '领取记录',
+                area: ['100%', '100%'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/userCouponRecord?couponActivityId='+ id+"&activityType=4"
+            });
+        }
+
+    };
+
+    /**
+     * 管理初始化
+     */
+    var DriverActivity = {
+        id: "DriverActivityTable",	//表格id
+        seItem: null,		//选中的条目
+        table: null,
+        layerIndex: -1
+    };
+
+    /**
+     * 初始化表格的列
+     */
+    DriverActivity.initColumn = function () {
+        return [
+            {field: 'selectItem', radio: true},
+            {title: '', field: 'id', visible: false, align: 'center', valign: 'middle'},
+            {title: '充值金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+            {title: '通用券领取总数', field: 'number', visible: true, align: 'center', valign: 'middle'},
+            {title: '通用券使用总数', field: 'useNumber', visible: true, align: 'center', valign: 'middle'},
+            {title: '通用券使用总金额', field: 'useMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '专车券领取总数', field: 'speNumber', visible: true, align: 'center', valign: 'middle'},
+            {title: '专车券使用总数', field: 'speUseNumber', visible: true, align: 'center', valign: 'middle'},
+            {title: '专车券使用总金额', field: 'speUserMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '出租车券领取总数', field: 'taxiNumber', visible: true, align: 'center', valign: 'middle'},
+            {title: '出租车券使用总数', field: 'taxiUseNumber', visible: true, align: 'center', valign: 'middle'},
+            {title: '出租车券使用总金额', field: 'taxiUserMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '城际券领取总数', field: 'intercityNumber', visible: true, align: 'center', valign: 'middle'},
+            {title: '城际券使用总数', field: 'intercityUseNumber', visible: true, align: 'center', valign: 'middle'},
+            {title: '城际券使用总金额', field: 'intercityUserMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '', field: 'insertTime', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    var btn = '';
+                    btn+='<a href="javascript:void(0);"  onclick="driverActivityHistory(5,'+row.id+')">领取记录</a>'
+                    return [btn];
+                }
+            },
+        ];
+    };
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord.html
new file mode 100644
index 0000000..7fa06a1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord.html
@@ -0,0 +1,37 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>优惠券管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="领取时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SysCouponRecord.search()"/>
+                                <#button name="重置" icon="fa-search" clickFun="SysCouponRecord.resetSearch()"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="SysCouponRecord.selectCouponOpt()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysCouponRecord.close()" space="true"/>
+
+                            </div>
+                        </div>
+                        <#table id="SysCouponRecordTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/userActivity/sysCouponRecord.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord1.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord1.html
new file mode 100644
index 0000000..7356035
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord1.html
@@ -0,0 +1,37 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>优惠券管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="领取时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SysCouponRecord.search()"/>
+                                <#button name="重置" icon="fa-search" clickFun="SysCouponRecord.resetSearch()"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="SysCouponRecord.selectCouponOpt1()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysCouponRecord.close()" space="true"/>
+
+                            </div>
+                        </div>
+                        <#table id="SysCouponRecordTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/userActivity/sysCouponRecord.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord2.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord2.html
new file mode 100644
index 0000000..bcb6ea8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysCouponRecord2.html
@@ -0,0 +1,38 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>优惠券管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <input type="hidden" id="couponUseType" value="${type}">
+                                <#TimeCon id="createTime" name="领取时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SysCouponRecord.search()"/>
+                                <#button name="重置" icon="fa-search" clickFun="SysCouponRecord.resetSearch()"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="SysCouponRecord.selectCouponOpt2()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysCouponRecord.close1()" space="true"/>
+
+                            </div>
+                        </div>
+                        <#table id="SysCouponRecordTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/userActivity/sysCouponRecord.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysRedPacketRecord.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysRedPacketRecord.html
new file mode 100644
index 0000000..f1bf16c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/sysRedPacketRecord.html
@@ -0,0 +1,36 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>红包管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="领取时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SysRedPacketRecord.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="SysRedPacketRecord.resetSearch()" space="true"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="SysRedPacketRecord.selectRedOpt()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysRedPacketRecord.close()" space="true"/>
+                            </div>
+                        </div>
+                        <#table id="SysRedPacketRecordTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/userActivity/sysRedPacketRecord.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity.html
new file mode 100644
index 0000000..8630871
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity.html
@@ -0,0 +1,68 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="status" name="状态" >
+                                <option value="">全部</option>
+                                <option value="1">待审核</option>
+                                <option value="2">已驳回</option>
+                                <option value="4">已暂停</option>
+                                <option value="3">未开始</option>
+                                <option value="5">进行中</option>
+                                <option value="6">已结束</option>
+                            </#SelectCon>
+                        </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="UserActivity.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="UserActivity.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="UserActivityTableToolbar" role="group">
+                            @if(shiro.hasPermission("/userActivity/add")){
+                            <#button name="添加" icon="fa-plus" clickFun="UserActivity.openAddUserActivity()"/>
+                            @}
+                            @if(shiro.hasPermission("/userActivity/update")){
+                            <#button name="编辑" icon="fa-edit" clickFun="UserActivity.openUpdateUserActivity()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/userActivity/updateStatus")){
+                            <#button name="启动/暂停" icon="" clickFun="UserActivity.updateStatus()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/userActivity/detail")){
+                            <#button name="详情" icon="" clickFun="UserActivity.openUserActivityDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/userActivity/receiveRecord")){
+                            <#button name="领取记录" icon="" clickFun="UserActivity.receiveRecord()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/userActivity/immediately")){
+                            <#button name="审核" icon="" clickFun="UserActivity.immediately()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="UserActivityTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/userActivity/userActivity.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_add.html
new file mode 100644
index 0000000..03ac1ca
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_add.html
@@ -0,0 +1,309 @@
+@layout("/common/_container.html"){
+<link href="${ctxPath}/static/css/plugins/switchery/switchery.css" rel="stylesheet">
+<style>
+    .table1{
+        display: inline;
+        width: 16.6666666%;
+        float:left;
+        text-align:center;
+        border-collapse:collapse;
+        font-size: 18px;
+    }
+    .table1:hover{
+        background-color: rgba(255,0,0,.3);
+    }
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <div class="col-sm-10">
+                    <div style="height: 50px;box-sizing: border-box;background:#f3f3f4;line-height: 50px;border:1px solid;margin-bottom: 20px;">
+                        <div id="div1" class='table1' onclick="getContent(1)" style="border-right: 1px solid #333;background-color: rgb(26, 179, 148);color: white;">活动设置</div>
+                        <div id="div2" class='table1' onclick="getContent(2)" style="border-right: 1px solid #333;">注册奖励</div>
+                        <div id="div3" class='table1' onclick="getContent(3)" style="border-right: 1px solid #333;">邀请奖励</div>
+                        <div id="div4" class='table1' onclick="getContent(4)" style="border-right: 1px solid #333;">充值赠送</div>
+                        <div id="div5" class='table1' onclick="getContent(5)" style="border-right: 1px solid #333;">打折活动</div>
+                        <div id="div6" class='table1' onclick="getContent(6)" style="border-right: 1px solid #333;">红包活动</div>
+                    </div>
+                    <div class="row" id="content1" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <h1>添加活动</h1>
+                                    <br/>
+                                    <br/>
+                                    活动名称:&nbsp;<input type="text"  name="zc1" id="name" class="form-control newWidth" />&nbsp;
+                                    <br/>
+                                    <br/>
+                                    活动时间:&nbsp;<input type="text" id="startTime"  name="zc7" class="form-control" style="max-width:300px !important;display: initial !important;" />
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content2" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-15">
+                                    <input type="hidden" id="content2CouponId">
+                                    <h1>用户注册既赠送优惠券</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input type="checkbox" class="js-switch" id="content2Check" checked="">
+                                    <br/>
+                                    <br/>
+                                    <#button name="选择优惠券" icon="fa-plus" clickFun="UserActivityInfoDlg.toSelectCouponOpt()"/>
+                                    <br/>
+                                    <br/>
+                                    优惠券名称:&nbsp;<input type="text"  name="zc1" id="content2Num1" class="form-control newWidth" readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    服务类型:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"  name="zc1" id="content2Num2" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    优惠券类型:&nbsp;<input type="text"  name="zc1" id="content2Num3" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    金额:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"  name="zc1" id="content2Num4" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    最高金额:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"  name="zc1" id="content2Num7" class="form-control newWidth" />&nbsp;
+                                    <br/>
+                                    <br/>
+                                    有效期:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"  name="zc1" id="content2Num5" class="form-control newWidth" />&nbsp;天
+                                    <br/>
+                                    <br/>
+                                    张数:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"  name="zc1" id="content2Num6" class="form-control newWidth" />&nbsp;
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content3" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <input type="hidden" id="content3CouponId">
+                                    <h1>用户邀请用户奖励</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input type="checkbox" id="content3Check"  class="js-switch1" checked="">
+                                    <br/>
+                                    <br/>
+                                    <#button name="选择优惠券" icon="fa-plus" clickFun="UserActivityInfoDlg.toSelectCouponOpt1()"/>
+                                    <br/>
+                                    <br/>
+                                    优惠券名称:&nbsp;<input type="text"  name="zc1" id="content3Num1" class="form-control newWidth" readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    服务类型:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"  name="zc1" id="content3Num2" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    优惠券类型:&nbsp;<input type="text"  name="zc1" id="content3Num3" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    金额:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"  name="zc1" id="content3Num4" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    最高金额:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"  name="zc1" id="content3Num7" class="form-control newWidth" />&nbsp;
+                                    <br/>
+                                    <br/>
+                                    有效期:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"  name="zc1" id="content3Num5" class="form-control newWidth" />&nbsp;天
+                                    <br/>
+                                    <br/>
+                                    张数:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"  name="zc1" id="content3Num6" class="form-control newWidth" />&nbsp;
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content4" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <h1>充值赠送奖励</h1>
+                            <br/>
+                            <br/>
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <#button name="添加" icon="fa-plus" clickFun="UserActivityInfoDlg.toAddRegistOpt()"/>&nbsp;&nbsp;&nbsp;&nbsp;启用:&nbsp;<input type="checkbox" id="content4Check"  class="js-switch4" checked="">
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <div class="col-sm-15">
+                                    <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                        <table class="table table-striped table-bordered table-hover table-condensed">
+                                            <thead>
+                                            <tr>
+                                                <th style="width: 250px;">充值金额</th>
+                                                <th style="width: 250px;">有效天数</th>
+                                                <th style="width: 300px;">最高金额</th>
+                                                <th style="width: 300px;">通用券金额</th>
+                                                <th style="width: 300px;">通用券数量</th>
+                                                <th style="width: 300px;">专车券金额</th>
+                                                <th style="width: 300px;">专车券数量</th>
+                                                <th style="width: 400px;">出租车券金额</th>
+                                                <th style="width: 400px;">出租车券数量</th>
+                                                <th style="width: 300px;">城际金额</th>
+                                                <th style="width: 300px;">城际券数量</th>
+                                                <th style="width: 100px;">操作</th>
+                                            </tr>
+                                            </thead>
+                                            <tbody id="coun">
+
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content5" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <h1>打折活动奖励</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input type="checkbox" id="content5Check"  class="js-switch2" checked="">
+                                    <br/>
+                                    <br/>
+                                    专车活动打折:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"  name="zc1" id="content5Num1" class="form-control newWidth" />&nbsp;折
+                                    <br/>
+                                    <br/>
+                                    出租车活动打折:
+                                    &nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"  name="zc1" id="content5Num2" class="form-control newWidth" />&nbsp;折
+                                    <br/>
+                                    <br/>
+                                    小件物流活动打折:
+                                    &nbsp;<input type="text"  name="zc1" id="content5Num3" class="form-control newWidth" />&nbsp;折
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="row" id="content6" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <input type="hidden" id="content6RedId">
+                                    <h1>红包活动奖励</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input type="checkbox" id="content6Check"  class="js-switch3" checked="">
+                                    <br/>
+                                    <br/>
+                                    <#button name="选择红包" icon="fa-plus" clickFun="UserActivityInfoDlg.toSelectRedOpt()"/>
+                                    <br/>
+                                    <br/>
+                                    红包类型:
+                                    &nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"  name="zc1" id="content6Num1" class="form-control newWidth" readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    总金额:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"  name="zc1" id="content6Num2" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    每个红包金额:&nbsp;<input type="text"  name="zc1" id="content6Num3" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    有效期:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"  name="zc1" id="content6Num4" class="form-control newWidth" readonly/>&nbsp;天
+                                    <br/>
+                                    <br/>
+                                    最高金额:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"  name="zc1" id="content6Num5" class="form-control newWidth" />&nbsp;
+                                    <br/>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <input type="hidden" id="type" value="1">
+                    <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="UserActivityInfoDlg.addSubmit()"/>
+                    <#button btnCss="info" name="下一步" icon="fa-check" id="nextB" clickFun="nextContent()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/js/plugins/switchery/switchery.js"></script>
+<script src="${ctxPath}/static/modular/system/userActivity/userActivity_info.js"></script>
+<script>
+    var elem = document.querySelector('.js-switch');
+    var switchery = new Switchery(elem,{size:"large"});
+    var elem1 = document.querySelector('.js-switch1');
+    var switchery1 = new Switchery(elem1,{size:"large"});
+    var elem2 = document.querySelector('.js-switch2');
+    var switchery2 = new Switchery(elem2,{size:"large"});
+    var elem3 = document.querySelector('.js-switch3');
+    var switchery3 = new Switchery(elem3,{size:"large"});
+    var elem4 = document.querySelector('.js-switch4');
+    var switchery4 = new Switchery(elem4,{size:"large"});
+
+    laydate.render({
+        elem: '#startTime'
+        ,type: 'datetime'
+        ,range: true
+        ,min: 'new Date()' //最小值今天
+    });
+    $(function(){
+        getContent(1);
+    });
+    function getContent(type){
+        //设置点击字体颜色效果
+        for(var i=1;i<7;i++){
+            document.getElementById("div"+i).style.color="#888888";//
+            document.getElementById("div"+i).style.backgroundColor ="";
+            $("#content"+i).hide();
+        }
+        //设置点击背景颜色效果
+        document.getElementById("div"+type).style.color="white";//
+        document.getElementById("div"+type).style.backgroundColor ="rgb(26, 179, 148)";
+        $("#type").val(type);
+        $("#content"+type).show();
+        if(type!=6){
+            $("#ensure").hide();
+            $("#nextB").show();
+        }else{
+            $("#ensure").show();
+            $("#nextB").hide();
+        }
+    }
+    function nextContent(){
+        var type = $("#type").val();
+        getContent(parseInt(type)+1);
+        if(parseInt(type)+1==6){
+            $("#ensure").show();
+            $("#nextB").hide();
+        }
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_detail.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_detail.html
new file mode 100644
index 0000000..a81ec06
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_detail.html
@@ -0,0 +1,496 @@
+@layout("/common/_container.html"){
+<link href="${ctxPath}/static/css/plugins/switchery/switchery.css" rel="stylesheet">
+<style>
+    .table1{
+        display: inline;
+        width: 16.6666666%;
+        float:left;
+        text-align:center;
+        border-collapse:collapse;
+        font-size: 18px;
+    }
+    .table1:hover{
+        background-color: rgba(255,0,0,.3);
+    }
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <input type="hidden" id="id" id="${item.id}">
+                <div class="col-sm-10">
+                    <div style="height: 50px;box-sizing: border-box;background:#f3f3f4;line-height: 50px;border:1px solid;margin-bottom: 20px;">
+                        <div id="div1" class='table1' onclick="getContent(1)" style="border-right: 1px solid #333;background-color: rgb(26, 179, 148);color: white;">活动设置</div>
+                        <div id="div2" class='table1' onclick="getContent(2)" style="border-right: 1px solid #333;">注册奖励</div>
+                        <div id="div3" class='table1' onclick="getContent(3)" style="border-right: 1px solid #333;">邀请奖励</div>
+                        <div id="div4" class='table1' onclick="getContent(4)" style="border-right: 1px solid #333;">充值赠送</div>
+                        <div id="div5" class='table1' onclick="getContent(5)" style="border-right: 1px solid #333;">打折活动</div>
+                        <div id="div6" class='table1' onclick="getContent(6)" style="border-right: 1px solid #333;">红包活动</div>
+                    </div>
+                    <div class="row" id="content1" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <h1>活动详情</h1>
+                                    <br/>
+                                    <br/>
+                                    活动名称:&nbsp;<input type="text"  name="zc1" id="name" value="${item.name}" class="form-control newWidth" readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    活动时间:&nbsp;<input type="text" id="startTime"  name="zc7" class="form-control"  style="max-width:300px !important;display: initial !important;"  readonly/>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content2" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-15">
+                                    <input type="hidden"
+                                           @if(isNotEmpty(item1)){
+                                           value="${item1.couponId}"
+                                           @}else{
+                                           value=""
+                                           @}
+                                           id="content2CouponId">
+
+                                    <h1>用户注册既赠送优惠券</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input type="checkbox"
+                                                    @if(isNotEmpty(item1) && item1.enable==2){
+                                                    checked=""
+                                                    @}
+                                                    class="js-switch" id="content2Check">
+                                    <br/>
+                                    <br/>
+                                    优惠券名称:&nbsp;<input type="text"
+                                                       @if(isNotEmpty(item1Coupon)){
+                                                       value="${item1Coupon.name}"
+                                                       @}else{
+                                                       value=""
+                                                       @}
+                                                       name="zc1" id="content2Num1" class="form-control newWidth" readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    服务类型:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"
+                                                                              @if(isNotEmpty(item1Coupon)){
+                                                                              value="${item1Coupon.couponUseType==0?'通用券':
+                                                                              item1Coupon.couponUseType==1?'专车券':
+                                                                              item1Coupon.couponUseType==2?'出租券':'跨城出行券'}"
+                                                                              @}else{
+                                                                              value=""
+                                                                              @}
+                                                                              name="zc1" id="content2Num2" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    优惠券类型:&nbsp;<input type="text"
+                                                       @if(isNotEmpty(item1Coupon)){
+                                                       value="${item1Coupon.couponType==1?'抵扣':'满减'}"
+                                                       @}else{
+                                                       value=""
+                                                       @}
+                                                       name="zc1" id="content2Num3" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    金额:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item1Coupon)){
+                                                 value="${item1Coupon.money}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content2Num4" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    最高金额:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"
+                                                                              @if(isNotEmpty(item1)){
+                                                                              value="${item1.totalPrice}"
+                                                                              @}else{
+                                                                              value=""
+                                                                              @}
+                                                                              name="zc1" id="content2Num7" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    有效期:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item1)){
+                                                 value="${item1.effective}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content2Num5" class="form-control newWidth"  readonly/>&nbsp;天
+                                    <br/>
+                                    <br/>
+                                    张数:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item1)){
+                                                 value="${item1.totalNum}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content2Num6" class="form-control newWidth"  readonly/>&nbsp;
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content3" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <input type="hidden"
+                                           @if(isNotEmpty(item2)){
+                                           value="${item2.couponId}"
+                                           @}else{
+                                           value=""
+                                           @}
+                                           id="content3CouponId">
+
+                                    <h1>用户邀请用户奖励</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input
+                                        @if(isNotEmpty(item2) && item2.enable==2){
+                                        checked=""
+                                        @}
+                                        type="checkbox" id="content3Check"  class="js-switch1">
+                                    <br/>
+                                    <br/>
+                                    优惠券名称:&nbsp;<input type="text"
+                                                       @if(isNotEmpty(item2Coupon)){
+                                                       value="${item2Coupon.name}"
+                                                       @}else{
+                                                       value=""
+                                                       @}
+                                                       name="zc1" id="content3Num1" class="form-control newWidth" readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    服务类型:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"
+
+                                                                              @if(isNotEmpty(item2Coupon)){
+                                                                              value="${item2Coupon.couponUseType==0?'通用券':
+                                                                              item2Coupon.couponUseType==1?'专车券':
+                                                                              item2Coupon.couponUseType==2?'出租券':'跨城出行券'}"
+                                                                              @}else{
+                                                                              value=""
+                                                                              @}
+                                                                              name="zc1" id="content3Num2" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    优惠券类型:&nbsp;<input type="text"
+                                                       @if(isNotEmpty(item2Coupon)){
+                                                       value="${item2Coupon.couponType==1?'抵扣':'满减'}"
+                                                       @}else{
+                                                       value=""
+                                                       @}
+                                                       name="zc1" id="content3Num3" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    金额:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item2Coupon)){
+                                                 value="${item2Coupon.money}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content3Num4" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    最高金额:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"
+                                                                              @if(isNotEmpty(item2)){
+                                                                              value="${item2.totalPrice}"
+                                                                              @}else{
+                                                                              value=""
+                                                                              @}
+                                                                              name="zc1" id="content3Num7" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    有效期:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item2)){
+                                                 value="${item2.effective}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content3Num5" class="form-control newWidth"  readonly/>&nbsp;天
+                                    <br/>
+                                    <br/>
+                                    张数:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item2)){
+                                                 value="${item2.totalNum}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content3Num6" class="form-control newWidth"  readonly/>&nbsp;
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content4" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <h1>充值赠送奖励</h1>
+                            <br/>
+                            <br/>
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    &nbsp;&nbsp;&nbsp;&nbsp;启用:&nbsp;
+                                    <input type="checkbox"
+                                           @if(isNotEmpty(balanceInfoList) && balanceInfoList[0].enable==2){
+                                           checked=""
+                                           @}
+                                           id="content4Check"  class="js-switch4">
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <div class="col-sm-15">
+                                    <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                        <table class="table table-striped table-bordered table-hover table-condensed">
+                                            <thead>
+                                            <tr>
+                                                <th style="width: 250px;">充值金额</th>
+                                                <th style="width: 250px;">有效天数</th>
+                                                <th style="width: 300px;">最高金额</th>
+                                                <th style="width: 300px;">通用券金额</th>
+                                                <th style="width: 300px;">通用券数量</th>
+                                                <th style="width: 300px;">专车券金额</th>
+                                                <th style="width: 300px;">专车券数量</th>
+                                                <th style="width: 400px;">出租车券金额</th>
+                                                <th style="width: 400px;">出租车券数量</th>
+                                                <th style="width: 300px;">城际金额</th>
+                                                <th style="width: 300px;">城际券数量</th>
+                                            </tr>
+                                            </thead>
+                                            <tbody id="coun">
+                                                @for(obj in balanceInfoList){
+                                                    <tr class="timeClass">' +
+                                                        <td><input type="hidden" id="num1" name="num1" value="${obj.money}">${obj.money}</td>
+                                                        <td><input type="hidden" id="num10" name="num10" value="${obj.effective}">${obj.effective}</td>
+                                                        <td><input type="hidden" id="num11" name="num3" value="${obj.totalPrice}">${obj.totalPrice}</td>
+                                                        <td><input type="hidden" id="num3" name="num3" value="${obj.generalCouponMoney}">${obj.generalCouponMoney}</td>
+                                                        <td><input type="hidden" id="num2" name="num2" value="${obj.generalNum}">${obj.generalNum}</td>
+
+                                                        <td><input type="hidden" id="num5" name="num5" value="${obj.specialCouponMoney}">${obj.specialCouponMoney}</td>
+                                                        <td><input type="hidden" id="num4" name="num4" value="${obj.specialNum}">${obj.specialNum}</td>
+
+                                                        <td><input type="hidden" id="num7" name="num7" value="${obj.taxiCouponMoney}">${obj.taxiCouponMoney}</td>
+                                                        <td><input type="hidden" id="num6" name="num6" value="${obj.taxiNum}">${obj.taxiNum}</td>
+
+                                                        <td><input type="hidden" id="num9" name="num9" value="${obj.intercityCouponMoney}">${obj.intercityCouponMoney}</td>
+                                                        <td><input type="hidden" id="num8" name="num8" value="${obj.intercityNum}">${obj.intercityNum}</td>
+                                                    </tr>
+                                                @}
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content5" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <h1>打折活动奖励</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input
+                                        @if(isNotEmpty(item4) && item4.enable==2){
+                                        checked=""
+                                        @}
+                                        type="checkbox" id="content5Check"  class="js-switch2">
+                                    <br/>
+                                    <br/>
+                                    专车活动打折:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item4)){
+                                                 value="${item4.special}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content5Num1" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    出租车活动打折:
+                                    &nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item4)){
+                                                 value="${item4.taxi}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content5Num2" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    小件物流活动打折:
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item4)){
+                                                 value="${item4.logistics}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content5Num3" class="form-control newWidth" readonly />&nbsp;
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="row" id="content6" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <input type="hidden"
+                                           @if(isNotEmpty(item5)){
+                                           value="${item5.redEnvelopeId}"
+                                           @}else{
+                                           value=""
+                                           @}
+                                           id="content6RedId">
+
+                                    <h1>红包活动奖励</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input type="checkbox"
+                                                    @if(isNotEmpty(item5) && item5.enable==2){
+                                                    checked=""
+                                                    @}
+                                                    id="content6Check"  class="js-switch3">
+                                    <br/>
+                                    <br/>
+                                    红包类型:
+                                    &nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item5Red)){
+                                                 value="${item5Red.type==1?'固定金额':'随机金额'}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content6Num1" class="form-control newWidth" readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    总金额:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+
+                                                 @if(isNotEmpty(item5Red)){
+                                                 value="${item5Red.totalMoney}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content6Num2" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    每个红包金额:&nbsp;<input type="text"
+                                                        @if(isNotEmpty(item5Red)){
+                                                        value="${item5Red.type==1?item5Red.money:item5Red.startMoney+'-'+item5Red.endMoney}"
+                                                        @}else{
+                                                        value=""
+                                                        @}
+                                                        name="zc1" id="content6Num3" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    有效期:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+
+                                                 @if(isNotEmpty(item5Red)){
+                                                 value="${item5Red.effective}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content6Num4" class="form-control newWidth" readonly/>&nbsp;天,
+                                    最高金额:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"
+                                                                              @if(isNotEmpty(item5)){
+                                                                              value="${item5.totalPrice}"
+                                                                              @}else{
+                                                                              value=""
+                                                                              @}
+                                                                              name="zc1" id="content6Num5" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <input type="hidden" id="type" value="1">
+                    <#button btnCss="info" name="关闭" id="ensure" icon="fa-check" clickFun="UserActivityInfoDlg.close()"/>
+                    <#button btnCss="info" name="下一步" icon="fa-check" id="nextB" clickFun="nextContent()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/js/plugins/switchery/switchery.js"></script>
+<script src="${ctxPath}/static/modular/system/userActivity/userActivity_info.js"></script>
+<script>
+    var elem = document.querySelector('.js-switch');
+    var switchery = new Switchery(elem,{size:"large"});
+    var elem1 = document.querySelector('.js-switch1');
+    var switchery1 = new Switchery(elem1,{size:"large"});
+    var elem2 = document.querySelector('.js-switch2');
+    var switchery2 = new Switchery(elem2,{size:"large"});
+    var elem3 = document.querySelector('.js-switch3');
+    var switchery3 = new Switchery(elem3,{size:"large"});
+    var elem4 = document.querySelector('.js-switch4');
+    var switchery4 = new Switchery(elem4,{size:"large"});
+
+    laydate.render({
+        elem: '#startTime'
+        ,type: 'datetime'
+        ,range: true
+    });
+    $("#startTime").val("${startTime} - ${endTime}")
+    $(function(){
+        getContent(1);
+    });
+    function getContent(type){
+        //设置点击字体颜色效果
+        for(var i=1;i<7;i++){
+            document.getElementById("div"+i).style.color="#888888";//
+            document.getElementById("div"+i).style.backgroundColor ="";
+            $("#content"+i).hide();
+        }
+        //设置点击背景颜色效果
+        document.getElementById("div"+type).style.color="white";//
+        document.getElementById("div"+type).style.backgroundColor ="rgb(26, 179, 148)";
+        $("#type").val(type);
+        $("#content"+type).show();
+        if(type!=6){
+            $("#ensure").hide();
+            $("#nextB").show();
+        }else{
+            $("#ensure").show();
+            $("#nextB").hide();
+        }
+    }
+    function nextContent(){
+        var type = $("#type").val();
+        getContent(parseInt(type)+1);
+        if(parseInt(type)+1==6){
+            $("#ensure").show();
+            $("#nextB").hide();
+        }
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_edit.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_edit.html
new file mode 100644
index 0000000..46e2c07
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_edit.html
@@ -0,0 +1,509 @@
+@layout("/common/_container.html"){
+<link href="${ctxPath}/static/css/plugins/switchery/switchery.css" rel="stylesheet">
+<style>
+    .table1{
+        display: inline;
+        width: 16.6666666%;
+        float:left;
+        text-align:center;
+        border-collapse:collapse;
+        font-size: 18px;
+    }
+    .table1:hover{
+        background-color: rgba(255,0,0,.3);
+    }
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <div class="row">
+                <input type="hidden" id="id" value="${item.id}">
+                <div class="col-sm-10">
+                    <div style="height: 50px;box-sizing: border-box;background:#f3f3f4;line-height: 50px;border:1px solid;margin-bottom: 20px;">
+                        <div id="div1" class='table1' onclick="getContent(1)" style="border-right: 1px solid #333;background-color: rgb(26, 179, 148);color: white;">活动设置</div>
+                        <div id="div2" class='table1' onclick="getContent(2)" style="border-right: 1px solid #333;">注册奖励</div>
+                        <div id="div3" class='table1' onclick="getContent(3)" style="border-right: 1px solid #333;">邀请奖励</div>
+                        <div id="div4" class='table1' onclick="getContent(4)" style="border-right: 1px solid #333;">充值赠送</div>
+                        <div id="div5" class='table1' onclick="getContent(5)" style="border-right: 1px solid #333;">打折活动</div>
+                        <div id="div6" class='table1' onclick="getContent(6)" style="border-right: 1px solid #333;">红包活动</div>
+                    </div>
+                    <div class="row" id="content1" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <h1>编辑活动</h1>
+                                    <br/>
+                                    <br/>
+                                    活动名称:&nbsp;<input type="text"  name="zc1" id="name" value="${item.name}" class="form-control newWidth" />&nbsp;
+                                    <br/>
+                                    <br/>
+                                    活动时间:&nbsp;<input type="text" id="startTime"  name="zc7" class="form-control" style="max-width:300px !important;display: initial !important;"/>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content2" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-15">
+                                    <input type="hidden"
+                                           @if(isNotEmpty(item1)){
+                                           value="${item1.couponId}"
+                                           @}else{
+                                           value=""
+                                           @}
+                                           id="content2CouponId">
+
+                                    <h1>用户注册既赠送优惠券</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input type="checkbox"
+                                                    @if(isNotEmpty(item1) && item1.enable==2){
+                                                    checked=""
+                                                    @}
+                                                    class="js-switch" id="content2Check">
+                                    <br/>
+                                    <br/>
+                                    <#button name="选择优惠券" icon="fa-plus" clickFun="UserActivityInfoDlg.toSelectCouponOpt()"/>
+                                    <br/>
+                                    <br/>
+                                    优惠券名称:&nbsp;<input type="text"
+                                                       @if(isNotEmpty(item1Coupon)){
+                                                       value="${item1Coupon.name}"
+                                                       @}else{
+                                                       value=""
+                                                       @}
+                                                       name="zc1" id="content2Num1" class="form-control newWidth" readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    服务类型:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"
+                                                                              @if(isNotEmpty(item1Coupon)){
+                                                                              value="${item1Coupon.couponUseType==0?'通用券':
+                                                                              item1Coupon.couponUseType==1?'专车券':
+                                                                              item1Coupon.couponUseType==2?'出租券':'跨城出行券'}"
+                                                                              @}else{
+                                                                              value=""
+                                                                              @}
+                                                                              name="zc1" id="content2Num2" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    优惠券类型:&nbsp;<input type="text"
+                                                       @if(isNotEmpty(item1Coupon)){
+                                                       value="${item1Coupon.couponType==1?'抵扣':'满减'}"
+                                                       @}else{
+                                                       value=""
+                                                       @}
+                                                       name="zc1" id="content2Num3" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    金额:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item1Coupon)){
+                                                 value="${item1Coupon.money}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content2Num4" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    最高金额:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"
+                                                                              @if(isNotEmpty(item1)){
+                                                                              value="${item1.totalPrice}"
+                                                                              @}else{
+                                                                              value=""
+                                                                              @}
+                                                                              name="zc1" id="content2Num7" class="form-control newWidth" />&nbsp;
+                                    <br/>
+                                    <br/>
+                                    有效期:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item1)){
+                                                 value="${item1.effective}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content2Num5" class="form-control newWidth" />&nbsp;天
+                                    <br/>
+                                    <br/>
+                                    张数:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item1)){
+                                                 value="${item1.totalNum}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content2Num6" class="form-control newWidth" />&nbsp;
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content3" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <input type="hidden"
+                                           @if(isNotEmpty(item2)){
+                                           value="${item2.couponId}"
+                                           @}else{
+                                           value=""
+                                           @}
+                                           id="content3CouponId">
+
+                                    <h1>用户邀请用户奖励</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input
+                                        @if(isNotEmpty(item2) && item2.enable==2){
+                                        checked=""
+                                        @}
+                                        type="checkbox" id="content3Check"  class="js-switch1">
+                                    <br/>
+                                    <br/>
+                                    <#button name="选择优惠券" icon="fa-plus" clickFun="UserActivityInfoDlg.toSelectCouponOpt1()"/>
+                                    <br/>
+                                    <br/>
+                                    优惠券名称:&nbsp;<input type="text"
+                                                       @if(isNotEmpty(item2Coupon)){
+                                                       value="${item2Coupon.name}"
+                                                       @}else{
+                                                       value=""
+                                                       @}
+                                                       name="zc1" id="content3Num1" class="form-control newWidth" readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    服务类型:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"
+
+                                                                              @if(isNotEmpty(item2Coupon)){
+                                                                              value="${item2Coupon.couponUseType==0?'通用券':
+                                                                              item2Coupon.couponUseType==1?'专车券':
+                                                                              item2Coupon.couponUseType==2?'出租券':'跨城出行券'}"
+                                                                              @}else{
+                                                                              value=""
+                                                                              @}
+                                                                              name="zc1" id="content3Num2" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    优惠券类型:&nbsp;<input type="text"
+                                                       @if(isNotEmpty(item2Coupon)){
+                                                       value="${item2Coupon.couponType==1?'抵扣':'满减'}"
+                                                       @}else{
+                                                       value=""
+                                                       @}
+                                                       name="zc1" id="content3Num3" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    金额:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item2Coupon)){
+                                                 value="${item2Coupon.money}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content3Num4" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    最高金额:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"
+                                                                              @if(isNotEmpty(item2)){
+                                                                              value="${item2.totalPrice}"
+                                                                              @}else{
+                                                                              value=""
+                                                                              @}
+                                                                              name="zc1" id="content3Num7" class="form-control newWidth" />&nbsp;
+                                    <br/>
+                                    <br/>
+                                    有效期:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item2)){
+                                                 value="${item2.effective}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content3Num5" class="form-control newWidth" />&nbsp;天
+                                    <br/>
+                                    <br/>
+                                    张数:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item2)){
+                                                 value="${item2.totalNum}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content3Num6" class="form-control newWidth" />&nbsp;
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content4" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <h1>充值赠送奖励</h1>
+                            <br/>
+                            <br/>
+
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <#button name="添加" icon="fa-plus" clickFun="UserActivityInfoDlg.toAddRegistOpt()"/>
+                                    &nbsp;&nbsp;&nbsp;&nbsp;启用:&nbsp;
+                                    <input type="checkbox"
+                                           @if(isNotEmpty(balanceInfoList) && balanceInfoList[0].enable==2){
+                                           checked=""
+                                           @}
+                                           id="content4Check"  class="js-switch4">
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <div class="col-sm-15">
+                                    <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                        <table class="table table-striped table-bordered table-hover table-condensed">
+                                            <thead>
+                                            <tr>
+                                                <th style="width: 250px;">充值金额</th>
+                                                <th style="width: 250px;">有效天数</th>
+                                                <th style="width: 300px;">最高金额</th>
+                                                <th style="width: 300px;">通用券金额</th>
+                                                <th style="width: 300px;">通用券数量</th>
+                                                <th style="width: 300px;">专车券金额</th>
+                                                <th style="width: 300px;">专车券数量</th>
+                                                <th style="width: 400px;">出租车券金额</th>
+                                                <th style="width: 400px;">出租车券数量</th>
+                                                <th style="width: 300px;">城际金额</th>
+                                                <th style="width: 300px;">城际券数量</th>
+                                                <th style="width: 100px;">操作</th>
+                                            </tr>
+                                            </thead>
+                                            <tbody id="coun">
+                                                @for(obj in balanceInfoList){
+                                                    <tr class="timeClass">' +
+                                                        <td><input type="hidden" id="id1" name="id1" value="${obj.generalCouponId}"><input type="hidden" id="num1" name="num1" value="${obj.money}">${obj.money}</td>
+                                                        <td><input type="hidden" id="id2" name="id2" value="${obj.specialCouponId}"><input type="hidden" id="num10" name="num10" value="${obj.effective}">${obj.effective}</td>
+                                                        <td><input type="hidden" id="num11" name="num11" value="${obj.totalPrice}">${obj.totalPrice}</td>
+                                                        <td><input type="hidden" id="id3" name="id3" value="${obj.taxiCouponId}"><input type="hidden" id="num3" name="num3" value="${obj.generalCouponMoney}">${obj.generalCouponMoney}</td>
+                                                        <td><input type="hidden" id="id4" name="id4" value="${obj.intercityCouponId}"><input type="hidden" id="num2" name="num2" value="${obj.generalNum}">${obj.generalNum}</td>
+
+                                                        <td><input type="hidden" id="num5" name="num5" value="${obj.specialCouponMoney}">${obj.specialCouponMoney}</td>
+                                                        <td><input type="hidden" id="num4" name="num4" value="${obj.specialNum}">${obj.specialNum}</td>
+
+                                                        <td><input type="hidden" id="num7" name="num7" value="${obj.taxiCouponMoney}">${obj.taxiCouponMoney}</td>
+                                                        <td><input type="hidden" id="num6" name="num6" value="${obj.taxiNum}">${obj.taxiNum}</td>
+
+                                                        <td><input type="hidden" id="num9" name="num9" value="${obj.intercityCouponMoney}">${obj.intercityCouponMoney}</td>
+                                                        <td><input type="hidden" id="num8" name="num8" value="${obj.intercityNum}">${obj.intercityNum}</td>
+                                                        <td><button onclick="deleteSub(this)">移除</button></td>
+                                                    </tr>
+                                                @}
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="row" id="content5" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <h1>打折活动奖励</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input
+                                        @if(isNotEmpty(item4) && item4.enable==2){
+                                        checked=""
+                                        @}
+                                        type="checkbox" id="content5Check"  class="js-switch2">
+                                    <br/>
+                                    <br/>
+                                    专车活动打折:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item4)){
+                                                 value="${item4.special}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content5Num1" class="form-control newWidth" />&nbsp;
+                                    <br/>
+                                    <br/>
+                                    出租车活动打折:
+                                    &nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item4)){
+                                                 value="${item4.taxi}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content5Num2" class="form-control newWidth" />&nbsp;
+                                    <br/>
+                                    <br/>
+                                    小件物流活动打折:
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item4)){
+                                                 value="${item4.logistics}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content5Num3" class="form-control newWidth" />&nbsp;
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="row" id="content6" style="margin-left: 100px;">
+                        <div class="col-sm-11">
+                            <div class="form-group">
+                                <div class="col-sm-10">
+                                    <input type="hidden"
+                                           @if(isNotEmpty(item5)){
+                                           value="${item5.redEnvelopeId}"
+                                           @}else{
+                                           value=""
+                                           @}
+                                           id="content6RedId">
+
+                                    <h1>红包活动奖励</h1>
+                                    <br/>
+                                    <br/>
+                                    启用:&nbsp;<input type="checkbox"
+                                                    @if(isNotEmpty(item5) && item5.enable==2){
+                                                    checked=""
+                                                    @}
+                                                    id="content6Check"  class="js-switch3">
+                                    <br/>
+                                    <br/>
+                                    <#button name="选择红包" icon="fa-plus" clickFun="UserActivityInfoDlg.toSelectRedOpt()"/>
+                                    <br/>
+                                    <br/>
+                                    红包类型:
+                                    &nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+                                                 @if(isNotEmpty(item5Red)){
+                                                 value="${item5Red.type==1?'固定金额':'随机金额'}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content6Num1" class="form-control newWidth" readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    总金额:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+
+                                                 @if(isNotEmpty(item5Red)){
+                                                 value="${item5Red.totalMoney}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content6Num2" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    每个红包金额:&nbsp;<input type="text"
+                                                        @if(isNotEmpty(item5Red)){
+                                                        value="${item5Red.type==1?item5Red.money:item5Red.startMoney+'-'+item5Red.endMoney}"
+                                                        @}else{
+                                                        value=""
+                                                        @}
+                                                        name="zc1" id="content6Num3" class="form-control newWidth"  readonly/>&nbsp;
+                                    <br/>
+                                    <br/>
+                                    有效期:
+                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                                    &nbsp;<input type="text"
+
+                                                 @if(isNotEmpty(item5Red)){
+                                                 value="${item5Red.effective}"
+                                                 @}else{
+                                                 value=""
+                                                 @}
+                                                 name="zc1" id="content6Num4" class="form-control newWidth" readonly/>&nbsp;天
+                                    最高金额:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text"
+                                                                              @if(isNotEmpty(item5)){
+                                                                              value="${item5.totalPrice}"
+                                                                              @}else{
+                                                                              value=""
+                                                                              @}
+                                                                              name="zc1" id="content6Num5" class="form-control newWidth" />&nbsp;
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <input type="hidden" id="type" value="1">
+                    <#button btnCss="info" name="保存" id="ensure" icon="fa-check" clickFun="UserActivityInfoDlg.editSubmit()"/>
+                    <#button btnCss="info" name="下一步" icon="fa-check" id="nextB" clickFun="nextContent()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/js/plugins/switchery/switchery.js"></script>
+<script src="${ctxPath}/static/modular/system/userActivity/userActivity_info.js"></script>
+<script>
+    var elem = document.querySelector('.js-switch');
+    var switchery = new Switchery(elem,{size:"large"});
+    var elem1 = document.querySelector('.js-switch1');
+    var switchery1 = new Switchery(elem1,{size:"large"});
+    var elem2 = document.querySelector('.js-switch2');
+    var switchery2 = new Switchery(elem2,{size:"large"});
+    var elem3 = document.querySelector('.js-switch3');
+    var switchery3 = new Switchery(elem3,{size:"large"});
+    var elem4 = document.querySelector('.js-switch4');
+    var switchery4 = new Switchery(elem4,{size:"large"});
+
+    laydate.render({
+        elem: '#startTime'
+        ,type: 'datetime'
+        ,range: true
+        ,min: 'new Date()' //最小值今天
+    });
+    $("#startTime").val("${startTime} - ${endTime}")
+    $(function(){
+        getContent(1);
+    });
+    function getContent(type){
+        //设置点击字体颜色效果
+        for(var i=1;i<7;i++){
+            document.getElementById("div"+i).style.color="#888888";//
+            document.getElementById("div"+i).style.backgroundColor ="";
+            $("#content"+i).hide();
+        }
+        //设置点击背景颜色效果
+        document.getElementById("div"+type).style.color="white";//
+        document.getElementById("div"+type).style.backgroundColor ="rgb(26, 179, 148)";
+        $("#type").val(type);
+        $("#content"+type).show();
+        if(type!=6){
+            $("#ensure").hide();
+            $("#nextB").show();
+        }else{
+            $("#ensure").show();
+            $("#nextB").hide();
+        }
+    }
+    function nextContent(){
+        var type = $("#type").val();
+        getContent(parseInt(type)+1);
+        if(parseInt(type)+1==6){
+            $("#ensure").show();
+            $("#nextB").hide();
+        }
+    }
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_immediately.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_immediately.html
new file mode 100644
index 0000000..72c3304
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userActivity/userActivity_immediately.html
@@ -0,0 +1,41 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal" id="userActivityInfoForm">
+            <input type="hidden" id="id" name="id" value="${id}">
+            <div class="row">
+                <div class="col-sm-10">
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">处理意见:</label>
+                        <div class="col-sm-9"  style="display: flex;align-items: center;">
+                            <div class="radio radio-info radio-inline">
+                                <input type="radio" id="state2" value="3" name="state" checked="" >
+                                <label for="state2"> 同意 </label>
+                            </div>
+                            <div class="radio radio-success radio-inline">
+                                <input type="radio" id="state3" value="2" name="state" >
+                                <label for="state3"> 拒绝 </label>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">填写备注:</label>
+                        <div class="col-sm-9">
+                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10 col-sm-offset-5">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="UserActivityInfoDlg.immediately()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="UserActivityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/userActivity/userActivity_info.js"></script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/userCouponRecord/userCouponRecord.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userCouponRecord/userCouponRecord.html
new file mode 100644
index 0000000..b0792f2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/userCouponRecord/userCouponRecord.html
@@ -0,0 +1,61 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <input type="hidden" id="activityType" value="${activityType}">
+                        <input type="hidden" id="couponActivityId" value="${couponActivityId}">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="createTime" name="领取时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="领取人" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userPhone" name="领取人电话" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">未使用</option>
+                                    <option value="2">已使用</option>
+                                    <option value="3">已过期</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="UserCouponRecord.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="UserCouponRecord.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="UserCouponRecordTableToolbar" role="group">
+                            @if(shiro.hasPermission("/userCouponRecord/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="UserCouponRecord.openAddUserCouponRecord()"/>
+                            @}
+                            @if(shiro.hasPermission("/userCouponRecord/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="UserCouponRecord.openUserCouponRecordDetail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/userCouponRecord/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="UserCouponRecord.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="UserCouponRecordTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/userCouponRecord/userCouponRecord.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/web.xml b/management/guns-admin/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..ee7c48d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
+  <display-name>guns-admin</display-name>
+  <welcome-file-list>
+    <welcome-file>index.html</welcome-file>
+    <welcome-file>index.htm</welcome-file>
+    <welcome-file>index.jsp</welcome-file>
+    <welcome-file>default.html</welcome-file>
+    <welcome-file>default.htm</welcome-file>
+    <welcome-file>default.jsp</welcome-file>
+  </welcome-file-list>
+</web-app>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/bitbug_favicon.ico b/management/guns-admin/src/main/webapp/static/bitbug_favicon.ico
new file mode 100644
index 0000000..2f64e7e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/bitbug_favicon.ico
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/car.png b/management/guns-admin/src/main/webapp/static/car.png
new file mode 100644
index 0000000..b10aec8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/car.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/aes.js b/management/guns-admin/src/main/webapp/static/crypto-js/aes.js
new file mode 100644
index 0000000..166e3ea
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/aes.js
@@ -0,0 +1,234 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var BlockCipher = C_lib.BlockCipher;
+	    var C_algo = C.algo;
+
+	    // Lookup tables
+	    var SBOX = [];
+	    var INV_SBOX = [];
+	    var SUB_MIX_0 = [];
+	    var SUB_MIX_1 = [];
+	    var SUB_MIX_2 = [];
+	    var SUB_MIX_3 = [];
+	    var INV_SUB_MIX_0 = [];
+	    var INV_SUB_MIX_1 = [];
+	    var INV_SUB_MIX_2 = [];
+	    var INV_SUB_MIX_3 = [];
+
+	    // Compute lookup tables
+	    (function () {
+	        // Compute double table
+	        var d = [];
+	        for (var i = 0; i < 256; i++) {
+	            if (i < 128) {
+	                d[i] = i << 1;
+	            } else {
+	                d[i] = (i << 1) ^ 0x11b;
+	            }
+	        }
+
+	        // Walk GF(2^8)
+	        var x = 0;
+	        var xi = 0;
+	        for (var i = 0; i < 256; i++) {
+	            // Compute sbox
+	            var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
+	            sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
+	            SBOX[x] = sx;
+	            INV_SBOX[sx] = x;
+
+	            // Compute multiplication
+	            var x2 = d[x];
+	            var x4 = d[x2];
+	            var x8 = d[x4];
+
+	            // Compute sub bytes, mix columns tables
+	            var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
+	            SUB_MIX_0[x] = (t << 24) | (t >>> 8);
+	            SUB_MIX_1[x] = (t << 16) | (t >>> 16);
+	            SUB_MIX_2[x] = (t << 8)  | (t >>> 24);
+	            SUB_MIX_3[x] = t;
+
+	            // Compute inv sub bytes, inv mix columns tables
+	            var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
+	            INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
+	            INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
+	            INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);
+	            INV_SUB_MIX_3[sx] = t;
+
+	            // Compute next counter
+	            if (!x) {
+	                x = xi = 1;
+	            } else {
+	                x = x2 ^ d[d[d[x8 ^ x2]]];
+	                xi ^= d[d[xi]];
+	            }
+	        }
+	    }());
+
+	    // Precomputed Rcon lookup
+	    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
+
+	    /**
+	     * AES block cipher algorithm.
+	     */
+	    var AES = C_algo.AES = BlockCipher.extend({
+	        _doReset: function () {
+	            var t;
+
+	            // Skip reset of nRounds has been set before and key did not change
+	            if (this._nRounds && this._keyPriorReset === this._key) {
+	                return;
+	            }
+
+	            // Shortcuts
+	            var key = this._keyPriorReset = this._key;
+	            var keyWords = key.words;
+	            var keySize = key.sigBytes / 4;
+
+	            // Compute number of rounds
+	            var nRounds = this._nRounds = keySize + 6;
+
+	            // Compute number of key schedule rows
+	            var ksRows = (nRounds + 1) * 4;
+
+	            // Compute key schedule
+	            var keySchedule = this._keySchedule = [];
+	            for (var ksRow = 0; ksRow < ksRows; ksRow++) {
+	                if (ksRow < keySize) {
+	                    keySchedule[ksRow] = keyWords[ksRow];
+	                } else {
+	                    t = keySchedule[ksRow - 1];
+
+	                    if (!(ksRow % keySize)) {
+	                        // Rot word
+	                        t = (t << 8) | (t >>> 24);
+
+	                        // Sub word
+	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+
+	                        // Mix Rcon
+	                        t ^= RCON[(ksRow / keySize) | 0] << 24;
+	                    } else if (keySize > 6 && ksRow % keySize == 4) {
+	                        // Sub word
+	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+	                    }
+
+	                    keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
+	                }
+	            }
+
+	            // Compute inv key schedule
+	            var invKeySchedule = this._invKeySchedule = [];
+	            for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
+	                var ksRow = ksRows - invKsRow;
+
+	                if (invKsRow % 4) {
+	                    var t = keySchedule[ksRow];
+	                } else {
+	                    var t = keySchedule[ksRow - 4];
+	                }
+
+	                if (invKsRow < 4 || ksRow <= 4) {
+	                    invKeySchedule[invKsRow] = t;
+	                } else {
+	                    invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
+	                                               INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
+	                }
+	            }
+	        },
+
+	        encryptBlock: function (M, offset) {
+	            this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
+	        },
+
+	        decryptBlock: function (M, offset) {
+	            // Swap 2nd and 4th rows
+	            var t = M[offset + 1];
+	            M[offset + 1] = M[offset + 3];
+	            M[offset + 3] = t;
+
+	            this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
+
+	            // Inv swap 2nd and 4th rows
+	            var t = M[offset + 1];
+	            M[offset + 1] = M[offset + 3];
+	            M[offset + 3] = t;
+	        },
+
+	        _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
+	            // Shortcut
+	            var nRounds = this._nRounds;
+
+	            // Get input, add round key
+	            var s0 = M[offset]     ^ keySchedule[0];
+	            var s1 = M[offset + 1] ^ keySchedule[1];
+	            var s2 = M[offset + 2] ^ keySchedule[2];
+	            var s3 = M[offset + 3] ^ keySchedule[3];
+
+	            // Key schedule row counter
+	            var ksRow = 4;
+
+	            // Rounds
+	            for (var round = 1; round < nRounds; round++) {
+	                // Shift rows, sub bytes, mix columns, add round key
+	                var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];
+	                var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];
+	                var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];
+	                var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];
+
+	                // Update state
+	                s0 = t0;
+	                s1 = t1;
+	                s2 = t2;
+	                s3 = t3;
+	            }
+
+	            // Shift rows, sub bytes, add round key
+	            var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
+	            var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
+	            var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
+	            var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
+
+	            // Set output
+	            M[offset]     = t0;
+	            M[offset + 1] = t1;
+	            M[offset + 2] = t2;
+	            M[offset + 3] = t3;
+	        },
+
+	        keySize: 256/32
+	    });
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);
+	     */
+	    C.AES = BlockCipher._createHelper(AES);
+	}());
+
+
+	return CryptoJS.AES;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/cipher-core.js b/management/guns-admin/src/main/webapp/static/crypto-js/cipher-core.js
new file mode 100644
index 0000000..c560c9e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/cipher-core.js
@@ -0,0 +1,890 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./evpkdf"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./evpkdf"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/**
+	 * Cipher core components.
+	 */
+	CryptoJS.lib.Cipher || (function (undefined) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Base = C_lib.Base;
+	    var WordArray = C_lib.WordArray;
+	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
+	    var C_enc = C.enc;
+	    var Utf8 = C_enc.Utf8;
+	    var Base64 = C_enc.Base64;
+	    var C_algo = C.algo;
+	    var EvpKDF = C_algo.EvpKDF;
+
+	    /**
+	     * Abstract base cipher template.
+	     *
+	     * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
+	     * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
+	     * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
+	     * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
+	     */
+	    var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {WordArray} iv The IV to use for this operation.
+	         */
+	        cfg: Base.extend(),
+
+	        /**
+	         * Creates this cipher in encryption mode.
+	         *
+	         * @param {WordArray} key The key.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {Cipher} A cipher instance.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
+	         */
+	        createEncryptor: function (key, cfg) {
+	            return this.create(this._ENC_XFORM_MODE, key, cfg);
+	        },
+
+	        /**
+	         * Creates this cipher in decryption mode.
+	         *
+	         * @param {WordArray} key The key.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {Cipher} A cipher instance.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
+	         */
+	        createDecryptor: function (key, cfg) {
+	            return this.create(this._DEC_XFORM_MODE, key, cfg);
+	        },
+
+	        /**
+	         * Initializes a newly created cipher.
+	         *
+	         * @param {number} xformMode Either the encryption or decryption transormation mode constant.
+	         * @param {WordArray} key The key.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @example
+	         *
+	         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
+	         */
+	        init: function (xformMode, key, cfg) {
+	            // Apply config defaults
+	            this.cfg = this.cfg.extend(cfg);
+
+	            // Store transform mode and key
+	            this._xformMode = xformMode;
+	            this._key = key;
+
+	            // Set initial values
+	            this.reset();
+	        },
+
+	        /**
+	         * Resets this cipher to its initial state.
+	         *
+	         * @example
+	         *
+	         *     cipher.reset();
+	         */
+	        reset: function () {
+	            // Reset data buffer
+	            BufferedBlockAlgorithm.reset.call(this);
+
+	            // Perform concrete-cipher logic
+	            this._doReset();
+	        },
+
+	        /**
+	         * Adds data to be encrypted or decrypted.
+	         *
+	         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
+	         *
+	         * @return {WordArray} The data after processing.
+	         *
+	         * @example
+	         *
+	         *     var encrypted = cipher.process('data');
+	         *     var encrypted = cipher.process(wordArray);
+	         */
+	        process: function (dataUpdate) {
+	            // Append
+	            this._append(dataUpdate);
+
+	            // Process available blocks
+	            return this._process();
+	        },
+
+	        /**
+	         * Finalizes the encryption or decryption process.
+	         * Note that the finalize operation is effectively a destructive, read-once operation.
+	         *
+	         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
+	         *
+	         * @return {WordArray} The data after final processing.
+	         *
+	         * @example
+	         *
+	         *     var encrypted = cipher.finalize();
+	         *     var encrypted = cipher.finalize('data');
+	         *     var encrypted = cipher.finalize(wordArray);
+	         */
+	        finalize: function (dataUpdate) {
+	            // Final data update
+	            if (dataUpdate) {
+	                this._append(dataUpdate);
+	            }
+
+	            // Perform concrete-cipher logic
+	            var finalProcessedData = this._doFinalize();
+
+	            return finalProcessedData;
+	        },
+
+	        keySize: 128/32,
+
+	        ivSize: 128/32,
+
+	        _ENC_XFORM_MODE: 1,
+
+	        _DEC_XFORM_MODE: 2,
+
+	        /**
+	         * Creates shortcut functions to a cipher's object interface.
+	         *
+	         * @param {Cipher} cipher The cipher to create a helper for.
+	         *
+	         * @return {Object} An object with encrypt and decrypt shortcut functions.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
+	         */
+	        _createHelper: (function () {
+	            function selectCipherStrategy(key) {
+	                if (typeof key == 'string') {
+	                    return PasswordBasedCipher;
+	                } else {
+	                    return SerializableCipher;
+	                }
+	            }
+
+	            return function (cipher) {
+	                return {
+	                    encrypt: function (message, key, cfg) {
+	                        return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
+	                    },
+
+	                    decrypt: function (ciphertext, key, cfg) {
+	                        return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
+	                    }
+	                };
+	            };
+	        }())
+	    });
+
+	    /**
+	     * Abstract base stream cipher template.
+	     *
+	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
+	     */
+	    var StreamCipher = C_lib.StreamCipher = Cipher.extend({
+	        _doFinalize: function () {
+	            // Process partial blocks
+	            var finalProcessedBlocks = this._process(!!'flush');
+
+	            return finalProcessedBlocks;
+	        },
+
+	        blockSize: 1
+	    });
+
+	    /**
+	     * Mode namespace.
+	     */
+	    var C_mode = C.mode = {};
+
+	    /**
+	     * Abstract base block cipher mode template.
+	     */
+	    var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
+	        /**
+	         * Creates this mode for encryption.
+	         *
+	         * @param {Cipher} cipher A block cipher instance.
+	         * @param {Array} iv The IV words.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
+	         */
+	        createEncryptor: function (cipher, iv) {
+	            return this.Encryptor.create(cipher, iv);
+	        },
+
+	        /**
+	         * Creates this mode for decryption.
+	         *
+	         * @param {Cipher} cipher A block cipher instance.
+	         * @param {Array} iv The IV words.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
+	         */
+	        createDecryptor: function (cipher, iv) {
+	            return this.Decryptor.create(cipher, iv);
+	        },
+
+	        /**
+	         * Initializes a newly created mode.
+	         *
+	         * @param {Cipher} cipher A block cipher instance.
+	         * @param {Array} iv The IV words.
+	         *
+	         * @example
+	         *
+	         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
+	         */
+	        init: function (cipher, iv) {
+	            this._cipher = cipher;
+	            this._iv = iv;
+	        }
+	    });
+
+	    /**
+	     * Cipher Block Chaining mode.
+	     */
+	    var CBC = C_mode.CBC = (function () {
+	        /**
+	         * Abstract base CBC mode.
+	         */
+	        var CBC = BlockCipherMode.extend();
+
+	        /**
+	         * CBC encryptor.
+	         */
+	        CBC.Encryptor = CBC.extend({
+	            /**
+	             * Processes the data block at offset.
+	             *
+	             * @param {Array} words The data words to operate on.
+	             * @param {number} offset The offset where the block starts.
+	             *
+	             * @example
+	             *
+	             *     mode.processBlock(data.words, offset);
+	             */
+	            processBlock: function (words, offset) {
+	                // Shortcuts
+	                var cipher = this._cipher;
+	                var blockSize = cipher.blockSize;
+
+	                // XOR and encrypt
+	                xorBlock.call(this, words, offset, blockSize);
+	                cipher.encryptBlock(words, offset);
+
+	                // Remember this block to use with next block
+	                this._prevBlock = words.slice(offset, offset + blockSize);
+	            }
+	        });
+
+	        /**
+	         * CBC decryptor.
+	         */
+	        CBC.Decryptor = CBC.extend({
+	            /**
+	             * Processes the data block at offset.
+	             *
+	             * @param {Array} words The data words to operate on.
+	             * @param {number} offset The offset where the block starts.
+	             *
+	             * @example
+	             *
+	             *     mode.processBlock(data.words, offset);
+	             */
+	            processBlock: function (words, offset) {
+	                // Shortcuts
+	                var cipher = this._cipher;
+	                var blockSize = cipher.blockSize;
+
+	                // Remember this block to use with next block
+	                var thisBlock = words.slice(offset, offset + blockSize);
+
+	                // Decrypt and XOR
+	                cipher.decryptBlock(words, offset);
+	                xorBlock.call(this, words, offset, blockSize);
+
+	                // This block becomes the previous block
+	                this._prevBlock = thisBlock;
+	            }
+	        });
+
+	        function xorBlock(words, offset, blockSize) {
+	            var block;
+
+	            // Shortcut
+	            var iv = this._iv;
+
+	            // Choose mixing block
+	            if (iv) {
+	                block = iv;
+
+	                // Remove IV for subsequent blocks
+	                this._iv = undefined;
+	            } else {
+	                block = this._prevBlock;
+	            }
+
+	            // XOR blocks
+	            for (var i = 0; i < blockSize; i++) {
+	                words[offset + i] ^= block[i];
+	            }
+	        }
+
+	        return CBC;
+	    }());
+
+	    /**
+	     * Padding namespace.
+	     */
+	    var C_pad = C.pad = {};
+
+	    /**
+	     * PKCS #5/7 padding strategy.
+	     */
+	    var Pkcs7 = C_pad.Pkcs7 = {
+	        /**
+	         * Pads data using the algorithm defined in PKCS #5/7.
+	         *
+	         * @param {WordArray} data The data to pad.
+	         * @param {number} blockSize The multiple that the data should be padded to.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);
+	         */
+	        pad: function (data, blockSize) {
+	            // Shortcut
+	            var blockSizeBytes = blockSize * 4;
+
+	            // Count padding bytes
+	            var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+	            // Create padding word
+	            var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
+
+	            // Create padding
+	            var paddingWords = [];
+	            for (var i = 0; i < nPaddingBytes; i += 4) {
+	                paddingWords.push(paddingWord);
+	            }
+	            var padding = WordArray.create(paddingWords, nPaddingBytes);
+
+	            // Add padding
+	            data.concat(padding);
+	        },
+
+	        /**
+	         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
+	         *
+	         * @param {WordArray} data The data to unpad.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     CryptoJS.pad.Pkcs7.unpad(wordArray);
+	         */
+	        unpad: function (data) {
+	            // Get number of padding bytes from last byte
+	            var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+	            // Remove padding
+	            data.sigBytes -= nPaddingBytes;
+	        }
+	    };
+
+	    /**
+	     * Abstract base block cipher template.
+	     *
+	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
+	     */
+	    var BlockCipher = C_lib.BlockCipher = Cipher.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {Mode} mode The block mode to use. Default: CBC
+	         * @property {Padding} padding The padding strategy to use. Default: Pkcs7
+	         */
+	        cfg: Cipher.cfg.extend({
+	            mode: CBC,
+	            padding: Pkcs7
+	        }),
+
+	        reset: function () {
+	            var modeCreator;
+
+	            // Reset cipher
+	            Cipher.reset.call(this);
+
+	            // Shortcuts
+	            var cfg = this.cfg;
+	            var iv = cfg.iv;
+	            var mode = cfg.mode;
+
+	            // Reset block mode
+	            if (this._xformMode == this._ENC_XFORM_MODE) {
+	                modeCreator = mode.createEncryptor;
+	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+	                modeCreator = mode.createDecryptor;
+	                // Keep at least one block in the buffer for unpadding
+	                this._minBufferSize = 1;
+	            }
+
+	            if (this._mode && this._mode.__creator == modeCreator) {
+	                this._mode.init(this, iv && iv.words);
+	            } else {
+	                this._mode = modeCreator.call(mode, this, iv && iv.words);
+	                this._mode.__creator = modeCreator;
+	            }
+	        },
+
+	        _doProcessBlock: function (words, offset) {
+	            this._mode.processBlock(words, offset);
+	        },
+
+	        _doFinalize: function () {
+	            var finalProcessedBlocks;
+
+	            // Shortcut
+	            var padding = this.cfg.padding;
+
+	            // Finalize
+	            if (this._xformMode == this._ENC_XFORM_MODE) {
+	                // Pad data
+	                padding.pad(this._data, this.blockSize);
+
+	                // Process final blocks
+	                finalProcessedBlocks = this._process(!!'flush');
+	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+	                // Process final blocks
+	                finalProcessedBlocks = this._process(!!'flush');
+
+	                // Unpad data
+	                padding.unpad(finalProcessedBlocks);
+	            }
+
+	            return finalProcessedBlocks;
+	        },
+
+	        blockSize: 128/32
+	    });
+
+	    /**
+	     * A collection of cipher parameters.
+	     *
+	     * @property {WordArray} ciphertext The raw ciphertext.
+	     * @property {WordArray} key The key to this ciphertext.
+	     * @property {WordArray} iv The IV used in the ciphering operation.
+	     * @property {WordArray} salt The salt used with a key derivation function.
+	     * @property {Cipher} algorithm The cipher algorithm.
+	     * @property {Mode} mode The block mode used in the ciphering operation.
+	     * @property {Padding} padding The padding scheme used in the ciphering operation.
+	     * @property {number} blockSize The block size of the cipher.
+	     * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
+	     */
+	    var CipherParams = C_lib.CipherParams = Base.extend({
+	        /**
+	         * Initializes a newly created cipher params object.
+	         *
+	         * @param {Object} cipherParams An object with any of the possible cipher parameters.
+	         *
+	         * @example
+	         *
+	         *     var cipherParams = CryptoJS.lib.CipherParams.create({
+	         *         ciphertext: ciphertextWordArray,
+	         *         key: keyWordArray,
+	         *         iv: ivWordArray,
+	         *         salt: saltWordArray,
+	         *         algorithm: CryptoJS.algo.AES,
+	         *         mode: CryptoJS.mode.CBC,
+	         *         padding: CryptoJS.pad.PKCS7,
+	         *         blockSize: 4,
+	         *         formatter: CryptoJS.format.OpenSSL
+	         *     });
+	         */
+	        init: function (cipherParams) {
+	            this.mixIn(cipherParams);
+	        },
+
+	        /**
+	         * Converts this cipher params object to a string.
+	         *
+	         * @param {Format} formatter (Optional) The formatting strategy to use.
+	         *
+	         * @return {string} The stringified cipher params.
+	         *
+	         * @throws Error If neither the formatter nor the default formatter is set.
+	         *
+	         * @example
+	         *
+	         *     var string = cipherParams + '';
+	         *     var string = cipherParams.toString();
+	         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);
+	         */
+	        toString: function (formatter) {
+	            return (formatter || this.formatter).stringify(this);
+	        }
+	    });
+
+	    /**
+	     * Format namespace.
+	     */
+	    var C_format = C.format = {};
+
+	    /**
+	     * OpenSSL formatting strategy.
+	     */
+	    var OpenSSLFormatter = C_format.OpenSSL = {
+	        /**
+	         * Converts a cipher params object to an OpenSSL-compatible string.
+	         *
+	         * @param {CipherParams} cipherParams The cipher params object.
+	         *
+	         * @return {string} The OpenSSL-compatible string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
+	         */
+	        stringify: function (cipherParams) {
+	            var wordArray;
+
+	            // Shortcuts
+	            var ciphertext = cipherParams.ciphertext;
+	            var salt = cipherParams.salt;
+
+	            // Format
+	            if (salt) {
+	                wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
+	            } else {
+	                wordArray = ciphertext;
+	            }
+
+	            return wordArray.toString(Base64);
+	        },
+
+	        /**
+	         * Converts an OpenSSL-compatible string to a cipher params object.
+	         *
+	         * @param {string} openSSLStr The OpenSSL-compatible string.
+	         *
+	         * @return {CipherParams} The cipher params object.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
+	         */
+	        parse: function (openSSLStr) {
+	            var salt;
+
+	            // Parse base64
+	            var ciphertext = Base64.parse(openSSLStr);
+
+	            // Shortcut
+	            var ciphertextWords = ciphertext.words;
+
+	            // Test for salt
+	            if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
+	                // Extract salt
+	                salt = WordArray.create(ciphertextWords.slice(2, 4));
+
+	                // Remove salt from ciphertext
+	                ciphertextWords.splice(0, 4);
+	                ciphertext.sigBytes -= 16;
+	            }
+
+	            return CipherParams.create({ ciphertext: ciphertext, salt: salt });
+	        }
+	    };
+
+	    /**
+	     * A cipher wrapper that returns ciphertext as a serializable cipher params object.
+	     */
+	    var SerializableCipher = C_lib.SerializableCipher = Base.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
+	         */
+	        cfg: Base.extend({
+	            format: OpenSSLFormatter
+	        }),
+
+	        /**
+	         * Encrypts a message.
+	         *
+	         * @param {Cipher} cipher The cipher algorithm to use.
+	         * @param {WordArray|string} message The message to encrypt.
+	         * @param {WordArray} key The key.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {CipherParams} A cipher params object.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
+	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
+	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+	         */
+	        encrypt: function (cipher, message, key, cfg) {
+	            // Apply config defaults
+	            cfg = this.cfg.extend(cfg);
+
+	            // Encrypt
+	            var encryptor = cipher.createEncryptor(key, cfg);
+	            var ciphertext = encryptor.finalize(message);
+
+	            // Shortcut
+	            var cipherCfg = encryptor.cfg;
+
+	            // Create and return serializable cipher params
+	            return CipherParams.create({
+	                ciphertext: ciphertext,
+	                key: key,
+	                iv: cipherCfg.iv,
+	                algorithm: cipher,
+	                mode: cipherCfg.mode,
+	                padding: cipherCfg.padding,
+	                blockSize: cipher.blockSize,
+	                formatter: cfg.format
+	            });
+	        },
+
+	        /**
+	         * Decrypts serialized ciphertext.
+	         *
+	         * @param {Cipher} cipher The cipher algorithm to use.
+	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+	         * @param {WordArray} key The key.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {WordArray} The plaintext.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+	         */
+	        decrypt: function (cipher, ciphertext, key, cfg) {
+	            // Apply config defaults
+	            cfg = this.cfg.extend(cfg);
+
+	            // Convert string to CipherParams
+	            ciphertext = this._parse(ciphertext, cfg.format);
+
+	            // Decrypt
+	            var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
+
+	            return plaintext;
+	        },
+
+	        /**
+	         * Converts serialized ciphertext to CipherParams,
+	         * else assumed CipherParams already and returns ciphertext unchanged.
+	         *
+	         * @param {CipherParams|string} ciphertext The ciphertext.
+	         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
+	         *
+	         * @return {CipherParams} The unserialized ciphertext.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
+	         */
+	        _parse: function (ciphertext, format) {
+	            if (typeof ciphertext == 'string') {
+	                return format.parse(ciphertext, this);
+	            } else {
+	                return ciphertext;
+	            }
+	        }
+	    });
+
+	    /**
+	     * Key derivation function namespace.
+	     */
+	    var C_kdf = C.kdf = {};
+
+	    /**
+	     * OpenSSL key derivation function.
+	     */
+	    var OpenSSLKdf = C_kdf.OpenSSL = {
+	        /**
+	         * Derives a key and IV from a password.
+	         *
+	         * @param {string} password The password to derive from.
+	         * @param {number} keySize The size in words of the key to generate.
+	         * @param {number} ivSize The size in words of the IV to generate.
+	         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
+	         *
+	         * @return {CipherParams} A cipher params object with the key, IV, and salt.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
+	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
+	         */
+	        execute: function (password, keySize, ivSize, salt) {
+	            // Generate random salt
+	            if (!salt) {
+	                salt = WordArray.random(64/8);
+	            }
+
+	            // Derive key and IV
+	            var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
+
+	            // Separate key and IV
+	            var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
+	            key.sigBytes = keySize * 4;
+
+	            // Return params
+	            return CipherParams.create({ key: key, iv: iv, salt: salt });
+	        }
+	    };
+
+	    /**
+	     * A serializable cipher wrapper that derives the key from a password,
+	     * and returns ciphertext as a serializable cipher params object.
+	     */
+	    var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
+	         */
+	        cfg: SerializableCipher.cfg.extend({
+	            kdf: OpenSSLKdf
+	        }),
+
+	        /**
+	         * Encrypts a message using a password.
+	         *
+	         * @param {Cipher} cipher The cipher algorithm to use.
+	         * @param {WordArray|string} message The message to encrypt.
+	         * @param {string} password The password.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {CipherParams} A cipher params object.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
+	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
+	         */
+	        encrypt: function (cipher, message, password, cfg) {
+	            // Apply config defaults
+	            cfg = this.cfg.extend(cfg);
+
+	            // Derive key and other params
+	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
+
+	            // Add IV to config
+	            cfg.iv = derivedParams.iv;
+
+	            // Encrypt
+	            var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
+
+	            // Mix in derived params
+	            ciphertext.mixIn(derivedParams);
+
+	            return ciphertext;
+	        },
+
+	        /**
+	         * Decrypts serialized ciphertext using a password.
+	         *
+	         * @param {Cipher} cipher The cipher algorithm to use.
+	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+	         * @param {string} password The password.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {WordArray} The plaintext.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
+	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
+	         */
+	        decrypt: function (cipher, ciphertext, password, cfg) {
+	            // Apply config defaults
+	            cfg = this.cfg.extend(cfg);
+
+	            // Convert string to CipherParams
+	            ciphertext = this._parse(ciphertext, cfg.format);
+
+	            // Derive key and other params
+	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
+
+	            // Add IV to config
+	            cfg.iv = derivedParams.iv;
+
+	            // Decrypt
+	            var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
+
+	            return plaintext;
+	        }
+	    });
+	}());
+
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/core.js b/management/guns-admin/src/main/webapp/static/crypto-js/core.js
new file mode 100644
index 0000000..e3a498b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/core.js
@@ -0,0 +1,807 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory();
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define([], factory);
+	}
+	else {
+		// Global (browser)
+		root.CryptoJS = factory();
+	}
+}(this, function () {
+
+	/*globals window, global, require*/
+
+	/**
+	 * CryptoJS core components.
+	 */
+	var CryptoJS = CryptoJS || (function (Math, undefined) {
+
+	    var crypto;
+
+	    // Native crypto from window (Browser)
+	    if (typeof window !== 'undefined' && window.crypto) {
+	        crypto = window.crypto;
+	    }
+
+	    // Native crypto in web worker (Browser)
+	    if (typeof self !== 'undefined' && self.crypto) {
+	        crypto = self.crypto;
+	    }
+
+	    // Native crypto from worker
+	    if (typeof globalThis !== 'undefined' && globalThis.crypto) {
+	        crypto = globalThis.crypto;
+	    }
+
+	    // Native (experimental IE 11) crypto from window (Browser)
+	    if (!crypto && typeof window !== 'undefined' && window.msCrypto) {
+	        crypto = window.msCrypto;
+	    }
+
+	    // Native crypto from global (NodeJS)
+	    if (!crypto && typeof global !== 'undefined' && global.crypto) {
+	        crypto = global.crypto;
+	    }
+
+	    // Native crypto import via require (NodeJS)
+	    if (!crypto && typeof require === 'function') {
+	        try {
+	            crypto = require('crypto');
+	        } catch (err) {}
+	    }
+
+	    /*
+	     * Cryptographically secure pseudorandom number generator
+	     *
+	     * As Math.random() is cryptographically not safe to use
+	     */
+	    var cryptoSecureRandomInt = function () {
+	        if (crypto) {
+	            // Use getRandomValues method (Browser)
+	            if (typeof crypto.getRandomValues === 'function') {
+	                try {
+	                    return crypto.getRandomValues(new Uint32Array(1))[0];
+	                } catch (err) {}
+	            }
+
+	            // Use randomBytes method (NodeJS)
+	            if (typeof crypto.randomBytes === 'function') {
+	                try {
+	                    return crypto.randomBytes(4).readInt32LE();
+	                } catch (err) {}
+	            }
+	        }
+
+	        throw new Error('Native crypto module could not be used to get secure random number.');
+	    };
+
+	    /*
+	     * Local polyfill of Object.create
+
+	     */
+	    var create = Object.create || (function () {
+	        function F() {}
+
+	        return function (obj) {
+	            var subtype;
+
+	            F.prototype = obj;
+
+	            subtype = new F();
+
+	            F.prototype = null;
+
+	            return subtype;
+	        };
+	    }());
+
+	    /**
+	     * CryptoJS namespace.
+	     */
+	    var C = {};
+
+	    /**
+	     * Library namespace.
+	     */
+	    var C_lib = C.lib = {};
+
+	    /**
+	     * Base object for prototypal inheritance.
+	     */
+	    var Base = C_lib.Base = (function () {
+
+
+	        return {
+	            /**
+	             * Creates a new object that inherits from this object.
+	             *
+	             * @param {Object} overrides Properties to copy into the new object.
+	             *
+	             * @return {Object} The new object.
+	             *
+	             * @static
+	             *
+	             * @example
+	             *
+	             *     var MyType = CryptoJS.lib.Base.extend({
+	             *         field: 'value',
+	             *
+	             *         method: function () {
+	             *         }
+	             *     });
+	             */
+	            extend: function (overrides) {
+	                // Spawn
+	                var subtype = create(this);
+
+	                // Augment
+	                if (overrides) {
+	                    subtype.mixIn(overrides);
+	                }
+
+	                // Create default initializer
+	                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
+	                    subtype.init = function () {
+	                        subtype.$super.init.apply(this, arguments);
+	                    };
+	                }
+
+	                // Initializer's prototype is the subtype object
+	                subtype.init.prototype = subtype;
+
+	                // Reference supertype
+	                subtype.$super = this;
+
+	                return subtype;
+	            },
+
+	            /**
+	             * Extends this object and runs the init method.
+	             * Arguments to create() will be passed to init().
+	             *
+	             * @return {Object} The new object.
+	             *
+	             * @static
+	             *
+	             * @example
+	             *
+	             *     var instance = MyType.create();
+	             */
+	            create: function () {
+	                var instance = this.extend();
+	                instance.init.apply(instance, arguments);
+
+	                return instance;
+	            },
+
+	            /**
+	             * Initializes a newly created object.
+	             * Override this method to add some logic when your objects are created.
+	             *
+	             * @example
+	             *
+	             *     var MyType = CryptoJS.lib.Base.extend({
+	             *         init: function () {
+	             *             // ...
+	             *         }
+	             *     });
+	             */
+	            init: function () {
+	            },
+
+	            /**
+	             * Copies properties into this object.
+	             *
+	             * @param {Object} properties The properties to mix in.
+	             *
+	             * @example
+	             *
+	             *     MyType.mixIn({
+	             *         field: 'value'
+	             *     });
+	             */
+	            mixIn: function (properties) {
+	                for (var propertyName in properties) {
+	                    if (properties.hasOwnProperty(propertyName)) {
+	                        this[propertyName] = properties[propertyName];
+	                    }
+	                }
+
+	                // IE won't copy toString using the loop above
+	                if (properties.hasOwnProperty('toString')) {
+	                    this.toString = properties.toString;
+	                }
+	            },
+
+	            /**
+	             * Creates a copy of this object.
+	             *
+	             * @return {Object} The clone.
+	             *
+	             * @example
+	             *
+	             *     var clone = instance.clone();
+	             */
+	            clone: function () {
+	                return this.init.prototype.extend(this);
+	            }
+	        };
+	    }());
+
+	    /**
+	     * An array of 32-bit words.
+	     *
+	     * @property {Array} words The array of 32-bit words.
+	     * @property {number} sigBytes The number of significant bytes in this word array.
+	     */
+	    var WordArray = C_lib.WordArray = Base.extend({
+	        /**
+	         * Initializes a newly created word array.
+	         *
+	         * @param {Array} words (Optional) An array of 32-bit words.
+	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.lib.WordArray.create();
+	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
+	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
+	         */
+	        init: function (words, sigBytes) {
+	            words = this.words = words || [];
+
+	            if (sigBytes != undefined) {
+	                this.sigBytes = sigBytes;
+	            } else {
+	                this.sigBytes = words.length * 4;
+	            }
+	        },
+
+	        /**
+	         * Converts this word array to a string.
+	         *
+	         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
+	         *
+	         * @return {string} The stringified word array.
+	         *
+	         * @example
+	         *
+	         *     var string = wordArray + '';
+	         *     var string = wordArray.toString();
+	         *     var string = wordArray.toString(CryptoJS.enc.Utf8);
+	         */
+	        toString: function (encoder) {
+	            return (encoder || Hex).stringify(this);
+	        },
+
+	        /**
+	         * Concatenates a word array to this word array.
+	         *
+	         * @param {WordArray} wordArray The word array to append.
+	         *
+	         * @return {WordArray} This word array.
+	         *
+	         * @example
+	         *
+	         *     wordArray1.concat(wordArray2);
+	         */
+	        concat: function (wordArray) {
+	            // Shortcuts
+	            var thisWords = this.words;
+	            var thatWords = wordArray.words;
+	            var thisSigBytes = this.sigBytes;
+	            var thatSigBytes = wordArray.sigBytes;
+
+	            // Clamp excess bits
+	            this.clamp();
+
+	            // Concat
+	            if (thisSigBytes % 4) {
+	                // Copy one byte at a time
+	                for (var i = 0; i < thatSigBytes; i++) {
+	                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+	                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
+	                }
+	            } else {
+	                // Copy one word at a time
+	                for (var j = 0; j < thatSigBytes; j += 4) {
+	                    thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];
+	                }
+	            }
+	            this.sigBytes += thatSigBytes;
+
+	            // Chainable
+	            return this;
+	        },
+
+	        /**
+	         * Removes insignificant bits.
+	         *
+	         * @example
+	         *
+	         *     wordArray.clamp();
+	         */
+	        clamp: function () {
+	            // Shortcuts
+	            var words = this.words;
+	            var sigBytes = this.sigBytes;
+
+	            // Clamp
+	            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
+	            words.length = Math.ceil(sigBytes / 4);
+	        },
+
+	        /**
+	         * Creates a copy of this word array.
+	         *
+	         * @return {WordArray} The clone.
+	         *
+	         * @example
+	         *
+	         *     var clone = wordArray.clone();
+	         */
+	        clone: function () {
+	            var clone = Base.clone.call(this);
+	            clone.words = this.words.slice(0);
+
+	            return clone;
+	        },
+
+	        /**
+	         * Creates a word array filled with random bytes.
+	         *
+	         * @param {number} nBytes The number of random bytes to generate.
+	         *
+	         * @return {WordArray} The random word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.lib.WordArray.random(16);
+	         */
+	        random: function (nBytes) {
+	            var words = [];
+
+	            for (var i = 0; i < nBytes; i += 4) {
+	                words.push(cryptoSecureRandomInt());
+	            }
+
+	            return new WordArray.init(words, nBytes);
+	        }
+	    });
+
+	    /**
+	     * Encoder namespace.
+	     */
+	    var C_enc = C.enc = {};
+
+	    /**
+	     * Hex encoding strategy.
+	     */
+	    var Hex = C_enc.Hex = {
+	        /**
+	         * Converts a word array to a hex string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The hex string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+
+	            // Convert
+	            var hexChars = [];
+	            for (var i = 0; i < sigBytes; i++) {
+	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+	                hexChars.push((bite >>> 4).toString(16));
+	                hexChars.push((bite & 0x0f).toString(16));
+	            }
+
+	            return hexChars.join('');
+	        },
+
+	        /**
+	         * Converts a hex string to a word array.
+	         *
+	         * @param {string} hexStr The hex string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);
+	         */
+	        parse: function (hexStr) {
+	            // Shortcut
+	            var hexStrLength = hexStr.length;
+
+	            // Convert
+	            var words = [];
+	            for (var i = 0; i < hexStrLength; i += 2) {
+	                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
+	            }
+
+	            return new WordArray.init(words, hexStrLength / 2);
+	        }
+	    };
+
+	    /**
+	     * Latin1 encoding strategy.
+	     */
+	    var Latin1 = C_enc.Latin1 = {
+	        /**
+	         * Converts a word array to a Latin1 string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The Latin1 string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+
+	            // Convert
+	            var latin1Chars = [];
+	            for (var i = 0; i < sigBytes; i++) {
+	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+	                latin1Chars.push(String.fromCharCode(bite));
+	            }
+
+	            return latin1Chars.join('');
+	        },
+
+	        /**
+	         * Converts a Latin1 string to a word array.
+	         *
+	         * @param {string} latin1Str The Latin1 string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
+	         */
+	        parse: function (latin1Str) {
+	            // Shortcut
+	            var latin1StrLength = latin1Str.length;
+
+	            // Convert
+	            var words = [];
+	            for (var i = 0; i < latin1StrLength; i++) {
+	                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
+	            }
+
+	            return new WordArray.init(words, latin1StrLength);
+	        }
+	    };
+
+	    /**
+	     * UTF-8 encoding strategy.
+	     */
+	    var Utf8 = C_enc.Utf8 = {
+	        /**
+	         * Converts a word array to a UTF-8 string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The UTF-8 string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            try {
+	                return decodeURIComponent(escape(Latin1.stringify(wordArray)));
+	            } catch (e) {
+	                throw new Error('Malformed UTF-8 data');
+	            }
+	        },
+
+	        /**
+	         * Converts a UTF-8 string to a word array.
+	         *
+	         * @param {string} utf8Str The UTF-8 string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
+	         */
+	        parse: function (utf8Str) {
+	            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
+	        }
+	    };
+
+	    /**
+	     * Abstract buffered block algorithm template.
+	     *
+	     * The property blockSize must be implemented in a concrete subtype.
+	     *
+	     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
+	     */
+	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
+	        /**
+	         * Resets this block algorithm's data buffer to its initial state.
+	         *
+	         * @example
+	         *
+	         *     bufferedBlockAlgorithm.reset();
+	         */
+	        reset: function () {
+	            // Initial values
+	            this._data = new WordArray.init();
+	            this._nDataBytes = 0;
+	        },
+
+	        /**
+	         * Adds new data to this block algorithm's buffer.
+	         *
+	         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
+	         *
+	         * @example
+	         *
+	         *     bufferedBlockAlgorithm._append('data');
+	         *     bufferedBlockAlgorithm._append(wordArray);
+	         */
+	        _append: function (data) {
+	            // Convert string to WordArray, else assume WordArray already
+	            if (typeof data == 'string') {
+	                data = Utf8.parse(data);
+	            }
+
+	            // Append
+	            this._data.concat(data);
+	            this._nDataBytes += data.sigBytes;
+	        },
+
+	        /**
+	         * Processes available data blocks.
+	         *
+	         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
+	         *
+	         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
+	         *
+	         * @return {WordArray} The processed data.
+	         *
+	         * @example
+	         *
+	         *     var processedData = bufferedBlockAlgorithm._process();
+	         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');
+	         */
+	        _process: function (doFlush) {
+	            var processedWords;
+
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+	            var dataSigBytes = data.sigBytes;
+	            var blockSize = this.blockSize;
+	            var blockSizeBytes = blockSize * 4;
+
+	            // Count blocks ready
+	            var nBlocksReady = dataSigBytes / blockSizeBytes;
+	            if (doFlush) {
+	                // Round up to include partial blocks
+	                nBlocksReady = Math.ceil(nBlocksReady);
+	            } else {
+	                // Round down to include only full blocks,
+	                // less the number of blocks that must remain in the buffer
+	                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
+	            }
+
+	            // Count words ready
+	            var nWordsReady = nBlocksReady * blockSize;
+
+	            // Count bytes ready
+	            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
+
+	            // Process blocks
+	            if (nWordsReady) {
+	                for (var offset = 0; offset < nWordsReady; offset += blockSize) {
+	                    // Perform concrete-algorithm logic
+	                    this._doProcessBlock(dataWords, offset);
+	                }
+
+	                // Remove processed words
+	                processedWords = dataWords.splice(0, nWordsReady);
+	                data.sigBytes -= nBytesReady;
+	            }
+
+	            // Return processed words
+	            return new WordArray.init(processedWords, nBytesReady);
+	        },
+
+	        /**
+	         * Creates a copy of this object.
+	         *
+	         * @return {Object} The clone.
+	         *
+	         * @example
+	         *
+	         *     var clone = bufferedBlockAlgorithm.clone();
+	         */
+	        clone: function () {
+	            var clone = Base.clone.call(this);
+	            clone._data = this._data.clone();
+
+	            return clone;
+	        },
+
+	        _minBufferSize: 0
+	    });
+
+	    /**
+	     * Abstract hasher template.
+	     *
+	     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
+	     */
+	    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
+	        /**
+	         * Configuration options.
+	         */
+	        cfg: Base.extend(),
+
+	        /**
+	         * Initializes a newly created hasher.
+	         *
+	         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
+	         *
+	         * @example
+	         *
+	         *     var hasher = CryptoJS.algo.SHA256.create();
+	         */
+	        init: function (cfg) {
+	            // Apply config defaults
+	            this.cfg = this.cfg.extend(cfg);
+
+	            // Set initial values
+	            this.reset();
+	        },
+
+	        /**
+	         * Resets this hasher to its initial state.
+	         *
+	         * @example
+	         *
+	         *     hasher.reset();
+	         */
+	        reset: function () {
+	            // Reset data buffer
+	            BufferedBlockAlgorithm.reset.call(this);
+
+	            // Perform concrete-hasher logic
+	            this._doReset();
+	        },
+
+	        /**
+	         * Updates this hasher with a message.
+	         *
+	         * @param {WordArray|string} messageUpdate The message to append.
+	         *
+	         * @return {Hasher} This hasher.
+	         *
+	         * @example
+	         *
+	         *     hasher.update('message');
+	         *     hasher.update(wordArray);
+	         */
+	        update: function (messageUpdate) {
+	            // Append
+	            this._append(messageUpdate);
+
+	            // Update the hash
+	            this._process();
+
+	            // Chainable
+	            return this;
+	        },
+
+	        /**
+	         * Finalizes the hash computation.
+	         * Note that the finalize operation is effectively a destructive, read-once operation.
+	         *
+	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
+	         *
+	         * @return {WordArray} The hash.
+	         *
+	         * @example
+	         *
+	         *     var hash = hasher.finalize();
+	         *     var hash = hasher.finalize('message');
+	         *     var hash = hasher.finalize(wordArray);
+	         */
+	        finalize: function (messageUpdate) {
+	            // Final message update
+	            if (messageUpdate) {
+	                this._append(messageUpdate);
+	            }
+
+	            // Perform concrete-hasher logic
+	            var hash = this._doFinalize();
+
+	            return hash;
+	        },
+
+	        blockSize: 512/32,
+
+	        /**
+	         * Creates a shortcut function to a hasher's object interface.
+	         *
+	         * @param {Hasher} hasher The hasher to create a helper for.
+	         *
+	         * @return {Function} The shortcut function.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
+	         */
+	        _createHelper: function (hasher) {
+	            return function (message, cfg) {
+	                return new hasher.init(cfg).finalize(message);
+	            };
+	        },
+
+	        /**
+	         * Creates a shortcut function to the HMAC's object interface.
+	         *
+	         * @param {Hasher} hasher The hasher to use in this HMAC helper.
+	         *
+	         * @return {Function} The shortcut function.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
+	         */
+	        _createHmacHelper: function (hasher) {
+	            return function (message, key) {
+	                return new C_algo.HMAC.init(hasher, key).finalize(message);
+	            };
+	        }
+	    });
+
+	    /**
+	     * Algorithm namespace.
+	     */
+	    var C_algo = C.algo = {};
+
+	    return C;
+	}(Math));
+
+
+	return CryptoJS;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/crypto-js.js b/management/guns-admin/src/main/webapp/static/crypto-js/crypto-js.js
new file mode 100644
index 0000000..27f0a62
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/crypto-js.js
@@ -0,0 +1,6191 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory();
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define([], factory);
+	}
+	else {
+		// Global (browser)
+		root.CryptoJS = factory();
+	}
+}(this, function () {
+
+	/*globals window, global, require*/
+
+	/**
+	 * CryptoJS core components.
+	 */
+	var CryptoJS = CryptoJS || (function (Math, undefined) {
+
+	    var crypto;
+
+	    // Native crypto from window (Browser)
+	    if (typeof window !== 'undefined' && window.crypto) {
+	        crypto = window.crypto;
+	    }
+
+	    // Native crypto in web worker (Browser)
+	    if (typeof self !== 'undefined' && self.crypto) {
+	        crypto = self.crypto;
+	    }
+
+	    // Native crypto from worker
+	    if (typeof globalThis !== 'undefined' && globalThis.crypto) {
+	        crypto = globalThis.crypto;
+	    }
+
+	    // Native (experimental IE 11) crypto from window (Browser)
+	    if (!crypto && typeof window !== 'undefined' && window.msCrypto) {
+	        crypto = window.msCrypto;
+	    }
+
+	    // Native crypto from global (NodeJS)
+	    if (!crypto && typeof global !== 'undefined' && global.crypto) {
+	        crypto = global.crypto;
+	    }
+
+	    // Native crypto import via require (NodeJS)
+	    if (!crypto && typeof require === 'function') {
+	        try {
+	            crypto = require('crypto');
+	        } catch (err) {}
+	    }
+
+	    /*
+	     * Cryptographically secure pseudorandom number generator
+	     *
+	     * As Math.random() is cryptographically not safe to use
+	     */
+	    var cryptoSecureRandomInt = function () {
+	        if (crypto) {
+	            // Use getRandomValues method (Browser)
+	            if (typeof crypto.getRandomValues === 'function') {
+	                try {
+	                    return crypto.getRandomValues(new Uint32Array(1))[0];
+	                } catch (err) {}
+	            }
+
+	            // Use randomBytes method (NodeJS)
+	            if (typeof crypto.randomBytes === 'function') {
+	                try {
+	                    return crypto.randomBytes(4).readInt32LE();
+	                } catch (err) {}
+	            }
+	        }
+
+	        throw new Error('Native crypto module could not be used to get secure random number.');
+	    };
+
+	    /*
+	     * Local polyfill of Object.create
+
+	     */
+	    var create = Object.create || (function () {
+	        function F() {}
+
+	        return function (obj) {
+	            var subtype;
+
+	            F.prototype = obj;
+
+	            subtype = new F();
+
+	            F.prototype = null;
+
+	            return subtype;
+	        };
+	    }());
+
+	    /**
+	     * CryptoJS namespace.
+	     */
+	    var C = {};
+
+	    /**
+	     * Library namespace.
+	     */
+	    var C_lib = C.lib = {};
+
+	    /**
+	     * Base object for prototypal inheritance.
+	     */
+	    var Base = C_lib.Base = (function () {
+
+
+	        return {
+	            /**
+	             * Creates a new object that inherits from this object.
+	             *
+	             * @param {Object} overrides Properties to copy into the new object.
+	             *
+	             * @return {Object} The new object.
+	             *
+	             * @static
+	             *
+	             * @example
+	             *
+	             *     var MyType = CryptoJS.lib.Base.extend({
+	             *         field: 'value',
+	             *
+	             *         method: function () {
+	             *         }
+	             *     });
+	             */
+	            extend: function (overrides) {
+	                // Spawn
+	                var subtype = create(this);
+
+	                // Augment
+	                if (overrides) {
+	                    subtype.mixIn(overrides);
+	                }
+
+	                // Create default initializer
+	                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
+	                    subtype.init = function () {
+	                        subtype.$super.init.apply(this, arguments);
+	                    };
+	                }
+
+	                // Initializer's prototype is the subtype object
+	                subtype.init.prototype = subtype;
+
+	                // Reference supertype
+	                subtype.$super = this;
+
+	                return subtype;
+	            },
+
+	            /**
+	             * Extends this object and runs the init method.
+	             * Arguments to create() will be passed to init().
+	             *
+	             * @return {Object} The new object.
+	             *
+	             * @static
+	             *
+	             * @example
+	             *
+	             *     var instance = MyType.create();
+	             */
+	            create: function () {
+	                var instance = this.extend();
+	                instance.init.apply(instance, arguments);
+
+	                return instance;
+	            },
+
+	            /**
+	             * Initializes a newly created object.
+	             * Override this method to add some logic when your objects are created.
+	             *
+	             * @example
+	             *
+	             *     var MyType = CryptoJS.lib.Base.extend({
+	             *         init: function () {
+	             *             // ...
+	             *         }
+	             *     });
+	             */
+	            init: function () {
+	            },
+
+	            /**
+	             * Copies properties into this object.
+	             *
+	             * @param {Object} properties The properties to mix in.
+	             *
+	             * @example
+	             *
+	             *     MyType.mixIn({
+	             *         field: 'value'
+	             *     });
+	             */
+	            mixIn: function (properties) {
+	                for (var propertyName in properties) {
+	                    if (properties.hasOwnProperty(propertyName)) {
+	                        this[propertyName] = properties[propertyName];
+	                    }
+	                }
+
+	                // IE won't copy toString using the loop above
+	                if (properties.hasOwnProperty('toString')) {
+	                    this.toString = properties.toString;
+	                }
+	            },
+
+	            /**
+	             * Creates a copy of this object.
+	             *
+	             * @return {Object} The clone.
+	             *
+	             * @example
+	             *
+	             *     var clone = instance.clone();
+	             */
+	            clone: function () {
+	                return this.init.prototype.extend(this);
+	            }
+	        };
+	    }());
+
+	    /**
+	     * An array of 32-bit words.
+	     *
+	     * @property {Array} words The array of 32-bit words.
+	     * @property {number} sigBytes The number of significant bytes in this word array.
+	     */
+	    var WordArray = C_lib.WordArray = Base.extend({
+	        /**
+	         * Initializes a newly created word array.
+	         *
+	         * @param {Array} words (Optional) An array of 32-bit words.
+	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.lib.WordArray.create();
+	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
+	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
+	         */
+	        init: function (words, sigBytes) {
+	            words = this.words = words || [];
+
+	            if (sigBytes != undefined) {
+	                this.sigBytes = sigBytes;
+	            } else {
+	                this.sigBytes = words.length * 4;
+	            }
+	        },
+
+	        /**
+	         * Converts this word array to a string.
+	         *
+	         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
+	         *
+	         * @return {string} The stringified word array.
+	         *
+	         * @example
+	         *
+	         *     var string = wordArray + '';
+	         *     var string = wordArray.toString();
+	         *     var string = wordArray.toString(CryptoJS.enc.Utf8);
+	         */
+	        toString: function (encoder) {
+	            return (encoder || Hex).stringify(this);
+	        },
+
+	        /**
+	         * Concatenates a word array to this word array.
+	         *
+	         * @param {WordArray} wordArray The word array to append.
+	         *
+	         * @return {WordArray} This word array.
+	         *
+	         * @example
+	         *
+	         *     wordArray1.concat(wordArray2);
+	         */
+	        concat: function (wordArray) {
+	            // Shortcuts
+	            var thisWords = this.words;
+	            var thatWords = wordArray.words;
+	            var thisSigBytes = this.sigBytes;
+	            var thatSigBytes = wordArray.sigBytes;
+
+	            // Clamp excess bits
+	            this.clamp();
+
+	            // Concat
+	            if (thisSigBytes % 4) {
+	                // Copy one byte at a time
+	                for (var i = 0; i < thatSigBytes; i++) {
+	                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+	                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
+	                }
+	            } else {
+	                // Copy one word at a time
+	                for (var j = 0; j < thatSigBytes; j += 4) {
+	                    thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];
+	                }
+	            }
+	            this.sigBytes += thatSigBytes;
+
+	            // Chainable
+	            return this;
+	        },
+
+	        /**
+	         * Removes insignificant bits.
+	         *
+	         * @example
+	         *
+	         *     wordArray.clamp();
+	         */
+	        clamp: function () {
+	            // Shortcuts
+	            var words = this.words;
+	            var sigBytes = this.sigBytes;
+
+	            // Clamp
+	            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
+	            words.length = Math.ceil(sigBytes / 4);
+	        },
+
+	        /**
+	         * Creates a copy of this word array.
+	         *
+	         * @return {WordArray} The clone.
+	         *
+	         * @example
+	         *
+	         *     var clone = wordArray.clone();
+	         */
+	        clone: function () {
+	            var clone = Base.clone.call(this);
+	            clone.words = this.words.slice(0);
+
+	            return clone;
+	        },
+
+	        /**
+	         * Creates a word array filled with random bytes.
+	         *
+	         * @param {number} nBytes The number of random bytes to generate.
+	         *
+	         * @return {WordArray} The random word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.lib.WordArray.random(16);
+	         */
+	        random: function (nBytes) {
+	            var words = [];
+
+	            for (var i = 0; i < nBytes; i += 4) {
+	                words.push(cryptoSecureRandomInt());
+	            }
+
+	            return new WordArray.init(words, nBytes);
+	        }
+	    });
+
+	    /**
+	     * Encoder namespace.
+	     */
+	    var C_enc = C.enc = {};
+
+	    /**
+	     * Hex encoding strategy.
+	     */
+	    var Hex = C_enc.Hex = {
+	        /**
+	         * Converts a word array to a hex string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The hex string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+
+	            // Convert
+	            var hexChars = [];
+	            for (var i = 0; i < sigBytes; i++) {
+	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+	                hexChars.push((bite >>> 4).toString(16));
+	                hexChars.push((bite & 0x0f).toString(16));
+	            }
+
+	            return hexChars.join('');
+	        },
+
+	        /**
+	         * Converts a hex string to a word array.
+	         *
+	         * @param {string} hexStr The hex string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);
+	         */
+	        parse: function (hexStr) {
+	            // Shortcut
+	            var hexStrLength = hexStr.length;
+
+	            // Convert
+	            var words = [];
+	            for (var i = 0; i < hexStrLength; i += 2) {
+	                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
+	            }
+
+	            return new WordArray.init(words, hexStrLength / 2);
+	        }
+	    };
+
+	    /**
+	     * Latin1 encoding strategy.
+	     */
+	    var Latin1 = C_enc.Latin1 = {
+	        /**
+	         * Converts a word array to a Latin1 string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The Latin1 string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+
+	            // Convert
+	            var latin1Chars = [];
+	            for (var i = 0; i < sigBytes; i++) {
+	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+	                latin1Chars.push(String.fromCharCode(bite));
+	            }
+
+	            return latin1Chars.join('');
+	        },
+
+	        /**
+	         * Converts a Latin1 string to a word array.
+	         *
+	         * @param {string} latin1Str The Latin1 string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
+	         */
+	        parse: function (latin1Str) {
+	            // Shortcut
+	            var latin1StrLength = latin1Str.length;
+
+	            // Convert
+	            var words = [];
+	            for (var i = 0; i < latin1StrLength; i++) {
+	                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
+	            }
+
+	            return new WordArray.init(words, latin1StrLength);
+	        }
+	    };
+
+	    /**
+	     * UTF-8 encoding strategy.
+	     */
+	    var Utf8 = C_enc.Utf8 = {
+	        /**
+	         * Converts a word array to a UTF-8 string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The UTF-8 string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            try {
+	                return decodeURIComponent(escape(Latin1.stringify(wordArray)));
+	            } catch (e) {
+	                throw new Error('Malformed UTF-8 data');
+	            }
+	        },
+
+	        /**
+	         * Converts a UTF-8 string to a word array.
+	         *
+	         * @param {string} utf8Str The UTF-8 string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
+	         */
+	        parse: function (utf8Str) {
+	            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
+	        }
+	    };
+
+	    /**
+	     * Abstract buffered block algorithm template.
+	     *
+	     * The property blockSize must be implemented in a concrete subtype.
+	     *
+	     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
+	     */
+	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
+	        /**
+	         * Resets this block algorithm's data buffer to its initial state.
+	         *
+	         * @example
+	         *
+	         *     bufferedBlockAlgorithm.reset();
+	         */
+	        reset: function () {
+	            // Initial values
+	            this._data = new WordArray.init();
+	            this._nDataBytes = 0;
+	        },
+
+	        /**
+	         * Adds new data to this block algorithm's buffer.
+	         *
+	         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
+	         *
+	         * @example
+	         *
+	         *     bufferedBlockAlgorithm._append('data');
+	         *     bufferedBlockAlgorithm._append(wordArray);
+	         */
+	        _append: function (data) {
+	            // Convert string to WordArray, else assume WordArray already
+	            if (typeof data == 'string') {
+	                data = Utf8.parse(data);
+	            }
+
+	            // Append
+	            this._data.concat(data);
+	            this._nDataBytes += data.sigBytes;
+	        },
+
+	        /**
+	         * Processes available data blocks.
+	         *
+	         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
+	         *
+	         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
+	         *
+	         * @return {WordArray} The processed data.
+	         *
+	         * @example
+	         *
+	         *     var processedData = bufferedBlockAlgorithm._process();
+	         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');
+	         */
+	        _process: function (doFlush) {
+	            var processedWords;
+
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+	            var dataSigBytes = data.sigBytes;
+	            var blockSize = this.blockSize;
+	            var blockSizeBytes = blockSize * 4;
+
+	            // Count blocks ready
+	            var nBlocksReady = dataSigBytes / blockSizeBytes;
+	            if (doFlush) {
+	                // Round up to include partial blocks
+	                nBlocksReady = Math.ceil(nBlocksReady);
+	            } else {
+	                // Round down to include only full blocks,
+	                // less the number of blocks that must remain in the buffer
+	                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
+	            }
+
+	            // Count words ready
+	            var nWordsReady = nBlocksReady * blockSize;
+
+	            // Count bytes ready
+	            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
+
+	            // Process blocks
+	            if (nWordsReady) {
+	                for (var offset = 0; offset < nWordsReady; offset += blockSize) {
+	                    // Perform concrete-algorithm logic
+	                    this._doProcessBlock(dataWords, offset);
+	                }
+
+	                // Remove processed words
+	                processedWords = dataWords.splice(0, nWordsReady);
+	                data.sigBytes -= nBytesReady;
+	            }
+
+	            // Return processed words
+	            return new WordArray.init(processedWords, nBytesReady);
+	        },
+
+	        /**
+	         * Creates a copy of this object.
+	         *
+	         * @return {Object} The clone.
+	         *
+	         * @example
+	         *
+	         *     var clone = bufferedBlockAlgorithm.clone();
+	         */
+	        clone: function () {
+	            var clone = Base.clone.call(this);
+	            clone._data = this._data.clone();
+
+	            return clone;
+	        },
+
+	        _minBufferSize: 0
+	    });
+
+	    /**
+	     * Abstract hasher template.
+	     *
+	     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
+	     */
+	    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
+	        /**
+	         * Configuration options.
+	         */
+	        cfg: Base.extend(),
+
+	        /**
+	         * Initializes a newly created hasher.
+	         *
+	         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
+	         *
+	         * @example
+	         *
+	         *     var hasher = CryptoJS.algo.SHA256.create();
+	         */
+	        init: function (cfg) {
+	            // Apply config defaults
+	            this.cfg = this.cfg.extend(cfg);
+
+	            // Set initial values
+	            this.reset();
+	        },
+
+	        /**
+	         * Resets this hasher to its initial state.
+	         *
+	         * @example
+	         *
+	         *     hasher.reset();
+	         */
+	        reset: function () {
+	            // Reset data buffer
+	            BufferedBlockAlgorithm.reset.call(this);
+
+	            // Perform concrete-hasher logic
+	            this._doReset();
+	        },
+
+	        /**
+	         * Updates this hasher with a message.
+	         *
+	         * @param {WordArray|string} messageUpdate The message to append.
+	         *
+	         * @return {Hasher} This hasher.
+	         *
+	         * @example
+	         *
+	         *     hasher.update('message');
+	         *     hasher.update(wordArray);
+	         */
+	        update: function (messageUpdate) {
+	            // Append
+	            this._append(messageUpdate);
+
+	            // Update the hash
+	            this._process();
+
+	            // Chainable
+	            return this;
+	        },
+
+	        /**
+	         * Finalizes the hash computation.
+	         * Note that the finalize operation is effectively a destructive, read-once operation.
+	         *
+	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
+	         *
+	         * @return {WordArray} The hash.
+	         *
+	         * @example
+	         *
+	         *     var hash = hasher.finalize();
+	         *     var hash = hasher.finalize('message');
+	         *     var hash = hasher.finalize(wordArray);
+	         */
+	        finalize: function (messageUpdate) {
+	            // Final message update
+	            if (messageUpdate) {
+	                this._append(messageUpdate);
+	            }
+
+	            // Perform concrete-hasher logic
+	            var hash = this._doFinalize();
+
+	            return hash;
+	        },
+
+	        blockSize: 512/32,
+
+	        /**
+	         * Creates a shortcut function to a hasher's object interface.
+	         *
+	         * @param {Hasher} hasher The hasher to create a helper for.
+	         *
+	         * @return {Function} The shortcut function.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
+	         */
+	        _createHelper: function (hasher) {
+	            return function (message, cfg) {
+	                return new hasher.init(cfg).finalize(message);
+	            };
+	        },
+
+	        /**
+	         * Creates a shortcut function to the HMAC's object interface.
+	         *
+	         * @param {Hasher} hasher The hasher to use in this HMAC helper.
+	         *
+	         * @return {Function} The shortcut function.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
+	         */
+	        _createHmacHelper: function (hasher) {
+	            return function (message, key) {
+	                return new C_algo.HMAC.init(hasher, key).finalize(message);
+	            };
+	        }
+	    });
+
+	    /**
+	     * Algorithm namespace.
+	     */
+	    var C_algo = C.algo = {};
+
+	    return C;
+	}(Math));
+
+
+	(function (undefined) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Base = C_lib.Base;
+	    var X32WordArray = C_lib.WordArray;
+
+	    /**
+	     * x64 namespace.
+	     */
+	    var C_x64 = C.x64 = {};
+
+	    /**
+	     * A 64-bit word.
+	     */
+	    var X64Word = C_x64.Word = Base.extend({
+	        /**
+	         * Initializes a newly created 64-bit word.
+	         *
+	         * @param {number} high The high 32 bits.
+	         * @param {number} low The low 32 bits.
+	         *
+	         * @example
+	         *
+	         *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
+	         */
+	        init: function (high, low) {
+	            this.high = high;
+	            this.low = low;
+	        }
+
+	        /**
+	         * Bitwise NOTs this word.
+	         *
+	         * @return {X64Word} A new x64-Word object after negating.
+	         *
+	         * @example
+	         *
+	         *     var negated = x64Word.not();
+	         */
+	        // not: function () {
+	            // var high = ~this.high;
+	            // var low = ~this.low;
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Bitwise ANDs this word with the passed word.
+	         *
+	         * @param {X64Word} word The x64-Word to AND with this word.
+	         *
+	         * @return {X64Word} A new x64-Word object after ANDing.
+	         *
+	         * @example
+	         *
+	         *     var anded = x64Word.and(anotherX64Word);
+	         */
+	        // and: function (word) {
+	            // var high = this.high & word.high;
+	            // var low = this.low & word.low;
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Bitwise ORs this word with the passed word.
+	         *
+	         * @param {X64Word} word The x64-Word to OR with this word.
+	         *
+	         * @return {X64Word} A new x64-Word object after ORing.
+	         *
+	         * @example
+	         *
+	         *     var ored = x64Word.or(anotherX64Word);
+	         */
+	        // or: function (word) {
+	            // var high = this.high | word.high;
+	            // var low = this.low | word.low;
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Bitwise XORs this word with the passed word.
+	         *
+	         * @param {X64Word} word The x64-Word to XOR with this word.
+	         *
+	         * @return {X64Word} A new x64-Word object after XORing.
+	         *
+	         * @example
+	         *
+	         *     var xored = x64Word.xor(anotherX64Word);
+	         */
+	        // xor: function (word) {
+	            // var high = this.high ^ word.high;
+	            // var low = this.low ^ word.low;
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Shifts this word n bits to the left.
+	         *
+	         * @param {number} n The number of bits to shift.
+	         *
+	         * @return {X64Word} A new x64-Word object after shifting.
+	         *
+	         * @example
+	         *
+	         *     var shifted = x64Word.shiftL(25);
+	         */
+	        // shiftL: function (n) {
+	            // if (n < 32) {
+	                // var high = (this.high << n) | (this.low >>> (32 - n));
+	                // var low = this.low << n;
+	            // } else {
+	                // var high = this.low << (n - 32);
+	                // var low = 0;
+	            // }
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Shifts this word n bits to the right.
+	         *
+	         * @param {number} n The number of bits to shift.
+	         *
+	         * @return {X64Word} A new x64-Word object after shifting.
+	         *
+	         * @example
+	         *
+	         *     var shifted = x64Word.shiftR(7);
+	         */
+	        // shiftR: function (n) {
+	            // if (n < 32) {
+	                // var low = (this.low >>> n) | (this.high << (32 - n));
+	                // var high = this.high >>> n;
+	            // } else {
+	                // var low = this.high >>> (n - 32);
+	                // var high = 0;
+	            // }
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Rotates this word n bits to the left.
+	         *
+	         * @param {number} n The number of bits to rotate.
+	         *
+	         * @return {X64Word} A new x64-Word object after rotating.
+	         *
+	         * @example
+	         *
+	         *     var rotated = x64Word.rotL(25);
+	         */
+	        // rotL: function (n) {
+	            // return this.shiftL(n).or(this.shiftR(64 - n));
+	        // },
+
+	        /**
+	         * Rotates this word n bits to the right.
+	         *
+	         * @param {number} n The number of bits to rotate.
+	         *
+	         * @return {X64Word} A new x64-Word object after rotating.
+	         *
+	         * @example
+	         *
+	         *     var rotated = x64Word.rotR(7);
+	         */
+	        // rotR: function (n) {
+	            // return this.shiftR(n).or(this.shiftL(64 - n));
+	        // },
+
+	        /**
+	         * Adds this word with the passed word.
+	         *
+	         * @param {X64Word} word The x64-Word to add with this word.
+	         *
+	         * @return {X64Word} A new x64-Word object after adding.
+	         *
+	         * @example
+	         *
+	         *     var added = x64Word.add(anotherX64Word);
+	         */
+	        // add: function (word) {
+	            // var low = (this.low + word.low) | 0;
+	            // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
+	            // var high = (this.high + word.high + carry) | 0;
+
+	            // return X64Word.create(high, low);
+	        // }
+	    });
+
+	    /**
+	     * An array of 64-bit words.
+	     *
+	     * @property {Array} words The array of CryptoJS.x64.Word objects.
+	     * @property {number} sigBytes The number of significant bytes in this word array.
+	     */
+	    var X64WordArray = C_x64.WordArray = Base.extend({
+	        /**
+	         * Initializes a newly created word array.
+	         *
+	         * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
+	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.x64.WordArray.create();
+	         *
+	         *     var wordArray = CryptoJS.x64.WordArray.create([
+	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+	         *     ]);
+	         *
+	         *     var wordArray = CryptoJS.x64.WordArray.create([
+	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+	         *     ], 10);
+	         */
+	        init: function (words, sigBytes) {
+	            words = this.words = words || [];
+
+	            if (sigBytes != undefined) {
+	                this.sigBytes = sigBytes;
+	            } else {
+	                this.sigBytes = words.length * 8;
+	            }
+	        },
+
+	        /**
+	         * Converts this 64-bit word array to a 32-bit word array.
+	         *
+	         * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
+	         *
+	         * @example
+	         *
+	         *     var x32WordArray = x64WordArray.toX32();
+	         */
+	        toX32: function () {
+	            // Shortcuts
+	            var x64Words = this.words;
+	            var x64WordsLength = x64Words.length;
+
+	            // Convert
+	            var x32Words = [];
+	            for (var i = 0; i < x64WordsLength; i++) {
+	                var x64Word = x64Words[i];
+	                x32Words.push(x64Word.high);
+	                x32Words.push(x64Word.low);
+	            }
+
+	            return X32WordArray.create(x32Words, this.sigBytes);
+	        },
+
+	        /**
+	         * Creates a copy of this word array.
+	         *
+	         * @return {X64WordArray} The clone.
+	         *
+	         * @example
+	         *
+	         *     var clone = x64WordArray.clone();
+	         */
+	        clone: function () {
+	            var clone = Base.clone.call(this);
+
+	            // Clone "words" array
+	            var words = clone.words = this.words.slice(0);
+
+	            // Clone each X64Word object
+	            var wordsLength = words.length;
+	            for (var i = 0; i < wordsLength; i++) {
+	                words[i] = words[i].clone();
+	            }
+
+	            return clone;
+	        }
+	    });
+	}());
+
+
+	(function () {
+	    // Check if typed arrays are supported
+	    if (typeof ArrayBuffer != 'function') {
+	        return;
+	    }
+
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+
+	    // Reference original init
+	    var superInit = WordArray.init;
+
+	    // Augment WordArray.init to handle typed arrays
+	    var subInit = WordArray.init = function (typedArray) {
+	        // Convert buffers to uint8
+	        if (typedArray instanceof ArrayBuffer) {
+	            typedArray = new Uint8Array(typedArray);
+	        }
+
+	        // Convert other array views to uint8
+	        if (
+	            typedArray instanceof Int8Array ||
+	            (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) ||
+	            typedArray instanceof Int16Array ||
+	            typedArray instanceof Uint16Array ||
+	            typedArray instanceof Int32Array ||
+	            typedArray instanceof Uint32Array ||
+	            typedArray instanceof Float32Array ||
+	            typedArray instanceof Float64Array
+	        ) {
+	            typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
+	        }
+
+	        // Handle Uint8Array
+	        if (typedArray instanceof Uint8Array) {
+	            // Shortcut
+	            var typedArrayByteLength = typedArray.byteLength;
+
+	            // Extract bytes
+	            var words = [];
+	            for (var i = 0; i < typedArrayByteLength; i++) {
+	                words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
+	            }
+
+	            // Initialize this word array
+	            superInit.call(this, words, typedArrayByteLength);
+	        } else {
+	            // Else call normal init
+	            superInit.apply(this, arguments);
+	        }
+	    };
+
+	    subInit.prototype = WordArray;
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var C_enc = C.enc;
+
+	    /**
+	     * UTF-16 BE encoding strategy.
+	     */
+	    var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
+	        /**
+	         * Converts a word array to a UTF-16 BE string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The UTF-16 BE string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+
+	            // Convert
+	            var utf16Chars = [];
+	            for (var i = 0; i < sigBytes; i += 2) {
+	                var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
+	                utf16Chars.push(String.fromCharCode(codePoint));
+	            }
+
+	            return utf16Chars.join('');
+	        },
+
+	        /**
+	         * Converts a UTF-16 BE string to a word array.
+	         *
+	         * @param {string} utf16Str The UTF-16 BE string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
+	         */
+	        parse: function (utf16Str) {
+	            // Shortcut
+	            var utf16StrLength = utf16Str.length;
+
+	            // Convert
+	            var words = [];
+	            for (var i = 0; i < utf16StrLength; i++) {
+	                words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
+	            }
+
+	            return WordArray.create(words, utf16StrLength * 2);
+	        }
+	    };
+
+	    /**
+	     * UTF-16 LE encoding strategy.
+	     */
+	    C_enc.Utf16LE = {
+	        /**
+	         * Converts a word array to a UTF-16 LE string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The UTF-16 LE string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+
+	            // Convert
+	            var utf16Chars = [];
+	            for (var i = 0; i < sigBytes; i += 2) {
+	                var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
+	                utf16Chars.push(String.fromCharCode(codePoint));
+	            }
+
+	            return utf16Chars.join('');
+	        },
+
+	        /**
+	         * Converts a UTF-16 LE string to a word array.
+	         *
+	         * @param {string} utf16Str The UTF-16 LE string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
+	         */
+	        parse: function (utf16Str) {
+	            // Shortcut
+	            var utf16StrLength = utf16Str.length;
+
+	            // Convert
+	            var words = [];
+	            for (var i = 0; i < utf16StrLength; i++) {
+	                words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
+	            }
+
+	            return WordArray.create(words, utf16StrLength * 2);
+	        }
+	    };
+
+	    function swapEndian(word) {
+	        return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
+	    }
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var C_enc = C.enc;
+
+	    /**
+	     * Base64 encoding strategy.
+	     */
+	    var Base64 = C_enc.Base64 = {
+	        /**
+	         * Converts a word array to a Base64 string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The Base64 string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+	            var map = this._map;
+
+	            // Clamp excess bits
+	            wordArray.clamp();
+
+	            // Convert
+	            var base64Chars = [];
+	            for (var i = 0; i < sigBytes; i += 3) {
+	                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;
+	                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
+	                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
+
+	                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
+
+	                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
+	                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
+	                }
+	            }
+
+	            // Add padding
+	            var paddingChar = map.charAt(64);
+	            if (paddingChar) {
+	                while (base64Chars.length % 4) {
+	                    base64Chars.push(paddingChar);
+	                }
+	            }
+
+	            return base64Chars.join('');
+	        },
+
+	        /**
+	         * Converts a Base64 string to a word array.
+	         *
+	         * @param {string} base64Str The Base64 string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Base64.parse(base64String);
+	         */
+	        parse: function (base64Str) {
+	            // Shortcuts
+	            var base64StrLength = base64Str.length;
+	            var map = this._map;
+	            var reverseMap = this._reverseMap;
+
+	            if (!reverseMap) {
+	                    reverseMap = this._reverseMap = [];
+	                    for (var j = 0; j < map.length; j++) {
+	                        reverseMap[map.charCodeAt(j)] = j;
+	                    }
+	            }
+
+	            // Ignore padding
+	            var paddingChar = map.charAt(64);
+	            if (paddingChar) {
+	                var paddingIndex = base64Str.indexOf(paddingChar);
+	                if (paddingIndex !== -1) {
+	                    base64StrLength = paddingIndex;
+	                }
+	            }
+
+	            // Convert
+	            return parseLoop(base64Str, base64StrLength, reverseMap);
+
+	        },
+
+	        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
+	    };
+
+	    function parseLoop(base64Str, base64StrLength, reverseMap) {
+	      var words = [];
+	      var nBytes = 0;
+	      for (var i = 0; i < base64StrLength; i++) {
+	          if (i % 4) {
+	              var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
+	              var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
+	              var bitsCombined = bits1 | bits2;
+	              words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
+	              nBytes++;
+	          }
+	      }
+	      return WordArray.create(words, nBytes);
+	    }
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var C_enc = C.enc;
+
+	    /**
+	     * Base64url encoding strategy.
+	     */
+	    var Base64url = C_enc.Base64url = {
+	        /**
+	         * Converts a word array to a Base64url string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @param {boolean} urlSafe Whether to use url safe
+	         *
+	         * @return {string} The Base64url string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var base64String = CryptoJS.enc.Base64url.stringify(wordArray);
+	         */
+	        stringify: function (wordArray, urlSafe=true) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+	            var map = urlSafe ? this._safe_map : this._map;
+
+	            // Clamp excess bits
+	            wordArray.clamp();
+
+	            // Convert
+	            var base64Chars = [];
+	            for (var i = 0; i < sigBytes; i += 3) {
+	                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;
+	                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
+	                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
+
+	                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
+
+	                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
+	                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
+	                }
+	            }
+
+	            // Add padding
+	            var paddingChar = map.charAt(64);
+	            if (paddingChar) {
+	                while (base64Chars.length % 4) {
+	                    base64Chars.push(paddingChar);
+	                }
+	            }
+
+	            return base64Chars.join('');
+	        },
+
+	        /**
+	         * Converts a Base64url string to a word array.
+	         *
+	         * @param {string} base64Str The Base64url string.
+	         *
+	         * @param {boolean} urlSafe Whether to use url safe
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Base64url.parse(base64String);
+	         */
+	        parse: function (base64Str, urlSafe=true) {
+	            // Shortcuts
+	            var base64StrLength = base64Str.length;
+	            var map = urlSafe ? this._safe_map : this._map;
+	            var reverseMap = this._reverseMap;
+
+	            if (!reverseMap) {
+	                reverseMap = this._reverseMap = [];
+	                for (var j = 0; j < map.length; j++) {
+	                    reverseMap[map.charCodeAt(j)] = j;
+	                }
+	            }
+
+	            // Ignore padding
+	            var paddingChar = map.charAt(64);
+	            if (paddingChar) {
+	                var paddingIndex = base64Str.indexOf(paddingChar);
+	                if (paddingIndex !== -1) {
+	                    base64StrLength = paddingIndex;
+	                }
+	            }
+
+	            // Convert
+	            return parseLoop(base64Str, base64StrLength, reverseMap);
+
+	        },
+
+	        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
+	        _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
+	    };
+
+	    function parseLoop(base64Str, base64StrLength, reverseMap) {
+	        var words = [];
+	        var nBytes = 0;
+	        for (var i = 0; i < base64StrLength; i++) {
+	            if (i % 4) {
+	                var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
+	                var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
+	                var bitsCombined = bits1 | bits2;
+	                words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
+	                nBytes++;
+	            }
+	        }
+	        return WordArray.create(words, nBytes);
+	    }
+	}());
+
+	(function (Math) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var Hasher = C_lib.Hasher;
+	    var C_algo = C.algo;
+
+	    // Constants table
+	    var T = [];
+
+	    // Compute constants
+	    (function () {
+	        for (var i = 0; i < 64; i++) {
+	            T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
+	        }
+	    }());
+
+	    /**
+	     * MD5 hash algorithm.
+	     */
+	    var MD5 = C_algo.MD5 = Hasher.extend({
+	        _doReset: function () {
+	            this._hash = new WordArray.init([
+	                0x67452301, 0xefcdab89,
+	                0x98badcfe, 0x10325476
+	            ]);
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Swap endian
+	            for (var i = 0; i < 16; i++) {
+	                // Shortcuts
+	                var offset_i = offset + i;
+	                var M_offset_i = M[offset_i];
+
+	                M[offset_i] = (
+	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
+	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
+	                );
+	            }
+
+	            // Shortcuts
+	            var H = this._hash.words;
+
+	            var M_offset_0  = M[offset + 0];
+	            var M_offset_1  = M[offset + 1];
+	            var M_offset_2  = M[offset + 2];
+	            var M_offset_3  = M[offset + 3];
+	            var M_offset_4  = M[offset + 4];
+	            var M_offset_5  = M[offset + 5];
+	            var M_offset_6  = M[offset + 6];
+	            var M_offset_7  = M[offset + 7];
+	            var M_offset_8  = M[offset + 8];
+	            var M_offset_9  = M[offset + 9];
+	            var M_offset_10 = M[offset + 10];
+	            var M_offset_11 = M[offset + 11];
+	            var M_offset_12 = M[offset + 12];
+	            var M_offset_13 = M[offset + 13];
+	            var M_offset_14 = M[offset + 14];
+	            var M_offset_15 = M[offset + 15];
+
+	            // Working varialbes
+	            var a = H[0];
+	            var b = H[1];
+	            var c = H[2];
+	            var d = H[3];
+
+	            // Computation
+	            a = FF(a, b, c, d, M_offset_0,  7,  T[0]);
+	            d = FF(d, a, b, c, M_offset_1,  12, T[1]);
+	            c = FF(c, d, a, b, M_offset_2,  17, T[2]);
+	            b = FF(b, c, d, a, M_offset_3,  22, T[3]);
+	            a = FF(a, b, c, d, M_offset_4,  7,  T[4]);
+	            d = FF(d, a, b, c, M_offset_5,  12, T[5]);
+	            c = FF(c, d, a, b, M_offset_6,  17, T[6]);
+	            b = FF(b, c, d, a, M_offset_7,  22, T[7]);
+	            a = FF(a, b, c, d, M_offset_8,  7,  T[8]);
+	            d = FF(d, a, b, c, M_offset_9,  12, T[9]);
+	            c = FF(c, d, a, b, M_offset_10, 17, T[10]);
+	            b = FF(b, c, d, a, M_offset_11, 22, T[11]);
+	            a = FF(a, b, c, d, M_offset_12, 7,  T[12]);
+	            d = FF(d, a, b, c, M_offset_13, 12, T[13]);
+	            c = FF(c, d, a, b, M_offset_14, 17, T[14]);
+	            b = FF(b, c, d, a, M_offset_15, 22, T[15]);
+
+	            a = GG(a, b, c, d, M_offset_1,  5,  T[16]);
+	            d = GG(d, a, b, c, M_offset_6,  9,  T[17]);
+	            c = GG(c, d, a, b, M_offset_11, 14, T[18]);
+	            b = GG(b, c, d, a, M_offset_0,  20, T[19]);
+	            a = GG(a, b, c, d, M_offset_5,  5,  T[20]);
+	            d = GG(d, a, b, c, M_offset_10, 9,  T[21]);
+	            c = GG(c, d, a, b, M_offset_15, 14, T[22]);
+	            b = GG(b, c, d, a, M_offset_4,  20, T[23]);
+	            a = GG(a, b, c, d, M_offset_9,  5,  T[24]);
+	            d = GG(d, a, b, c, M_offset_14, 9,  T[25]);
+	            c = GG(c, d, a, b, M_offset_3,  14, T[26]);
+	            b = GG(b, c, d, a, M_offset_8,  20, T[27]);
+	            a = GG(a, b, c, d, M_offset_13, 5,  T[28]);
+	            d = GG(d, a, b, c, M_offset_2,  9,  T[29]);
+	            c = GG(c, d, a, b, M_offset_7,  14, T[30]);
+	            b = GG(b, c, d, a, M_offset_12, 20, T[31]);
+
+	            a = HH(a, b, c, d, M_offset_5,  4,  T[32]);
+	            d = HH(d, a, b, c, M_offset_8,  11, T[33]);
+	            c = HH(c, d, a, b, M_offset_11, 16, T[34]);
+	            b = HH(b, c, d, a, M_offset_14, 23, T[35]);
+	            a = HH(a, b, c, d, M_offset_1,  4,  T[36]);
+	            d = HH(d, a, b, c, M_offset_4,  11, T[37]);
+	            c = HH(c, d, a, b, M_offset_7,  16, T[38]);
+	            b = HH(b, c, d, a, M_offset_10, 23, T[39]);
+	            a = HH(a, b, c, d, M_offset_13, 4,  T[40]);
+	            d = HH(d, a, b, c, M_offset_0,  11, T[41]);
+	            c = HH(c, d, a, b, M_offset_3,  16, T[42]);
+	            b = HH(b, c, d, a, M_offset_6,  23, T[43]);
+	            a = HH(a, b, c, d, M_offset_9,  4,  T[44]);
+	            d = HH(d, a, b, c, M_offset_12, 11, T[45]);
+	            c = HH(c, d, a, b, M_offset_15, 16, T[46]);
+	            b = HH(b, c, d, a, M_offset_2,  23, T[47]);
+
+	            a = II(a, b, c, d, M_offset_0,  6,  T[48]);
+	            d = II(d, a, b, c, M_offset_7,  10, T[49]);
+	            c = II(c, d, a, b, M_offset_14, 15, T[50]);
+	            b = II(b, c, d, a, M_offset_5,  21, T[51]);
+	            a = II(a, b, c, d, M_offset_12, 6,  T[52]);
+	            d = II(d, a, b, c, M_offset_3,  10, T[53]);
+	            c = II(c, d, a, b, M_offset_10, 15, T[54]);
+	            b = II(b, c, d, a, M_offset_1,  21, T[55]);
+	            a = II(a, b, c, d, M_offset_8,  6,  T[56]);
+	            d = II(d, a, b, c, M_offset_15, 10, T[57]);
+	            c = II(c, d, a, b, M_offset_6,  15, T[58]);
+	            b = II(b, c, d, a, M_offset_13, 21, T[59]);
+	            a = II(a, b, c, d, M_offset_4,  6,  T[60]);
+	            d = II(d, a, b, c, M_offset_11, 10, T[61]);
+	            c = II(c, d, a, b, M_offset_2,  15, T[62]);
+	            b = II(b, c, d, a, M_offset_9,  21, T[63]);
+
+	            // Intermediate hash value
+	            H[0] = (H[0] + a) | 0;
+	            H[1] = (H[1] + b) | 0;
+	            H[2] = (H[2] + c) | 0;
+	            H[3] = (H[3] + d) | 0;
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+
+	            var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
+	            var nBitsTotalL = nBitsTotal;
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
+	                (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
+	                (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)
+	            );
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+	                (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
+	                (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)
+	            );
+
+	            data.sigBytes = (dataWords.length + 1) * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Shortcuts
+	            var hash = this._hash;
+	            var H = hash.words;
+
+	            // Swap endian
+	            for (var i = 0; i < 4; i++) {
+	                // Shortcut
+	                var H_i = H[i];
+
+	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
+	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
+	            }
+
+	            // Return final computed hash
+	            return hash;
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+	            clone._hash = this._hash.clone();
+
+	            return clone;
+	        }
+	    });
+
+	    function FF(a, b, c, d, x, s, t) {
+	        var n = a + ((b & c) | (~b & d)) + x + t;
+	        return ((n << s) | (n >>> (32 - s))) + b;
+	    }
+
+	    function GG(a, b, c, d, x, s, t) {
+	        var n = a + ((b & d) | (c & ~d)) + x + t;
+	        return ((n << s) | (n >>> (32 - s))) + b;
+	    }
+
+	    function HH(a, b, c, d, x, s, t) {
+	        var n = a + (b ^ c ^ d) + x + t;
+	        return ((n << s) | (n >>> (32 - s))) + b;
+	    }
+
+	    function II(a, b, c, d, x, s, t) {
+	        var n = a + (c ^ (b | ~d)) + x + t;
+	        return ((n << s) | (n >>> (32 - s))) + b;
+	    }
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.MD5('message');
+	     *     var hash = CryptoJS.MD5(wordArray);
+	     */
+	    C.MD5 = Hasher._createHelper(MD5);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacMD5(message, key);
+	     */
+	    C.HmacMD5 = Hasher._createHmacHelper(MD5);
+	}(Math));
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var Hasher = C_lib.Hasher;
+	    var C_algo = C.algo;
+
+	    // Reusable object
+	    var W = [];
+
+	    /**
+	     * SHA-1 hash algorithm.
+	     */
+	    var SHA1 = C_algo.SHA1 = Hasher.extend({
+	        _doReset: function () {
+	            this._hash = new WordArray.init([
+	                0x67452301, 0xefcdab89,
+	                0x98badcfe, 0x10325476,
+	                0xc3d2e1f0
+	            ]);
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcut
+	            var H = this._hash.words;
+
+	            // Working variables
+	            var a = H[0];
+	            var b = H[1];
+	            var c = H[2];
+	            var d = H[3];
+	            var e = H[4];
+
+	            // Computation
+	            for (var i = 0; i < 80; i++) {
+	                if (i < 16) {
+	                    W[i] = M[offset + i] | 0;
+	                } else {
+	                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
+	                    W[i] = (n << 1) | (n >>> 31);
+	                }
+
+	                var t = ((a << 5) | (a >>> 27)) + e + W[i];
+	                if (i < 20) {
+	                    t += ((b & c) | (~b & d)) + 0x5a827999;
+	                } else if (i < 40) {
+	                    t += (b ^ c ^ d) + 0x6ed9eba1;
+	                } else if (i < 60) {
+	                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
+	                } else /* if (i < 80) */ {
+	                    t += (b ^ c ^ d) - 0x359d3e2a;
+	                }
+
+	                e = d;
+	                d = c;
+	                c = (b << 30) | (b >>> 2);
+	                b = a;
+	                a = t;
+	            }
+
+	            // Intermediate hash value
+	            H[0] = (H[0] + a) | 0;
+	            H[1] = (H[1] + b) | 0;
+	            H[2] = (H[2] + c) | 0;
+	            H[3] = (H[3] + d) | 0;
+	            H[4] = (H[4] + e) | 0;
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+	            data.sigBytes = dataWords.length * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Return final computed hash
+	            return this._hash;
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+	            clone._hash = this._hash.clone();
+
+	            return clone;
+	        }
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA1('message');
+	     *     var hash = CryptoJS.SHA1(wordArray);
+	     */
+	    C.SHA1 = Hasher._createHelper(SHA1);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA1(message, key);
+	     */
+	    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
+	}());
+
+
+	(function (Math) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var Hasher = C_lib.Hasher;
+	    var C_algo = C.algo;
+
+	    // Initialization and round constants tables
+	    var H = [];
+	    var K = [];
+
+	    // Compute constants
+	    (function () {
+	        function isPrime(n) {
+	            var sqrtN = Math.sqrt(n);
+	            for (var factor = 2; factor <= sqrtN; factor++) {
+	                if (!(n % factor)) {
+	                    return false;
+	                }
+	            }
+
+	            return true;
+	        }
+
+	        function getFractionalBits(n) {
+	            return ((n - (n | 0)) * 0x100000000) | 0;
+	        }
+
+	        var n = 2;
+	        var nPrime = 0;
+	        while (nPrime < 64) {
+	            if (isPrime(n)) {
+	                if (nPrime < 8) {
+	                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
+	                }
+	                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
+
+	                nPrime++;
+	            }
+
+	            n++;
+	        }
+	    }());
+
+	    // Reusable object
+	    var W = [];
+
+	    /**
+	     * SHA-256 hash algorithm.
+	     */
+	    var SHA256 = C_algo.SHA256 = Hasher.extend({
+	        _doReset: function () {
+	            this._hash = new WordArray.init(H.slice(0));
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcut
+	            var H = this._hash.words;
+
+	            // Working variables
+	            var a = H[0];
+	            var b = H[1];
+	            var c = H[2];
+	            var d = H[3];
+	            var e = H[4];
+	            var f = H[5];
+	            var g = H[6];
+	            var h = H[7];
+
+	            // Computation
+	            for (var i = 0; i < 64; i++) {
+	                if (i < 16) {
+	                    W[i] = M[offset + i] | 0;
+	                } else {
+	                    var gamma0x = W[i - 15];
+	                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^
+	                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^
+	                                   (gamma0x >>> 3);
+
+	                    var gamma1x = W[i - 2];
+	                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^
+	                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^
+	                                   (gamma1x >>> 10);
+
+	                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
+	                }
+
+	                var ch  = (e & f) ^ (~e & g);
+	                var maj = (a & b) ^ (a & c) ^ (b & c);
+
+	                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
+	                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));
+
+	                var t1 = h + sigma1 + ch + K[i] + W[i];
+	                var t2 = sigma0 + maj;
+
+	                h = g;
+	                g = f;
+	                f = e;
+	                e = (d + t1) | 0;
+	                d = c;
+	                c = b;
+	                b = a;
+	                a = (t1 + t2) | 0;
+	            }
+
+	            // Intermediate hash value
+	            H[0] = (H[0] + a) | 0;
+	            H[1] = (H[1] + b) | 0;
+	            H[2] = (H[2] + c) | 0;
+	            H[3] = (H[3] + d) | 0;
+	            H[4] = (H[4] + e) | 0;
+	            H[5] = (H[5] + f) | 0;
+	            H[6] = (H[6] + g) | 0;
+	            H[7] = (H[7] + h) | 0;
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+	            data.sigBytes = dataWords.length * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Return final computed hash
+	            return this._hash;
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+	            clone._hash = this._hash.clone();
+
+	            return clone;
+	        }
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA256('message');
+	     *     var hash = CryptoJS.SHA256(wordArray);
+	     */
+	    C.SHA256 = Hasher._createHelper(SHA256);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA256(message, key);
+	     */
+	    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
+	}(Math));
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var C_algo = C.algo;
+	    var SHA256 = C_algo.SHA256;
+
+	    /**
+	     * SHA-224 hash algorithm.
+	     */
+	    var SHA224 = C_algo.SHA224 = SHA256.extend({
+	        _doReset: function () {
+	            this._hash = new WordArray.init([
+	                0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
+	                0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
+	            ]);
+	        },
+
+	        _doFinalize: function () {
+	            var hash = SHA256._doFinalize.call(this);
+
+	            hash.sigBytes -= 4;
+
+	            return hash;
+	        }
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA224('message');
+	     *     var hash = CryptoJS.SHA224(wordArray);
+	     */
+	    C.SHA224 = SHA256._createHelper(SHA224);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA224(message, key);
+	     */
+	    C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Hasher = C_lib.Hasher;
+	    var C_x64 = C.x64;
+	    var X64Word = C_x64.Word;
+	    var X64WordArray = C_x64.WordArray;
+	    var C_algo = C.algo;
+
+	    function X64Word_create() {
+	        return X64Word.create.apply(X64Word, arguments);
+	    }
+
+	    // Constants
+	    var K = [
+	        X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
+	        X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
+	        X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
+	        X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
+	        X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
+	        X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
+	        X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
+	        X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
+	        X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
+	        X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
+	        X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
+	        X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
+	        X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
+	        X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
+	        X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
+	        X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
+	        X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
+	        X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
+	        X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
+	        X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
+	        X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
+	        X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
+	        X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
+	        X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
+	        X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
+	        X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
+	        X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
+	        X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
+	        X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
+	        X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
+	        X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
+	        X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
+	        X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
+	        X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
+	        X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
+	        X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
+	        X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
+	        X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
+	        X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
+	        X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
+	    ];
+
+	    // Reusable objects
+	    var W = [];
+	    (function () {
+	        for (var i = 0; i < 80; i++) {
+	            W[i] = X64Word_create();
+	        }
+	    }());
+
+	    /**
+	     * SHA-512 hash algorithm.
+	     */
+	    var SHA512 = C_algo.SHA512 = Hasher.extend({
+	        _doReset: function () {
+	            this._hash = new X64WordArray.init([
+	                new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
+	                new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
+	                new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
+	                new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
+	            ]);
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcuts
+	            var H = this._hash.words;
+
+	            var H0 = H[0];
+	            var H1 = H[1];
+	            var H2 = H[2];
+	            var H3 = H[3];
+	            var H4 = H[4];
+	            var H5 = H[5];
+	            var H6 = H[6];
+	            var H7 = H[7];
+
+	            var H0h = H0.high;
+	            var H0l = H0.low;
+	            var H1h = H1.high;
+	            var H1l = H1.low;
+	            var H2h = H2.high;
+	            var H2l = H2.low;
+	            var H3h = H3.high;
+	            var H3l = H3.low;
+	            var H4h = H4.high;
+	            var H4l = H4.low;
+	            var H5h = H5.high;
+	            var H5l = H5.low;
+	            var H6h = H6.high;
+	            var H6l = H6.low;
+	            var H7h = H7.high;
+	            var H7l = H7.low;
+
+	            // Working variables
+	            var ah = H0h;
+	            var al = H0l;
+	            var bh = H1h;
+	            var bl = H1l;
+	            var ch = H2h;
+	            var cl = H2l;
+	            var dh = H3h;
+	            var dl = H3l;
+	            var eh = H4h;
+	            var el = H4l;
+	            var fh = H5h;
+	            var fl = H5l;
+	            var gh = H6h;
+	            var gl = H6l;
+	            var hh = H7h;
+	            var hl = H7l;
+
+	            // Rounds
+	            for (var i = 0; i < 80; i++) {
+	                var Wil;
+	                var Wih;
+
+	                // Shortcut
+	                var Wi = W[i];
+
+	                // Extend message
+	                if (i < 16) {
+	                    Wih = Wi.high = M[offset + i * 2]     | 0;
+	                    Wil = Wi.low  = M[offset + i * 2 + 1] | 0;
+	                } else {
+	                    // Gamma0
+	                    var gamma0x  = W[i - 15];
+	                    var gamma0xh = gamma0x.high;
+	                    var gamma0xl = gamma0x.low;
+	                    var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
+	                    var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
+
+	                    // Gamma1
+	                    var gamma1x  = W[i - 2];
+	                    var gamma1xh = gamma1x.high;
+	                    var gamma1xl = gamma1x.low;
+	                    var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
+	                    var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
+
+	                    // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
+	                    var Wi7  = W[i - 7];
+	                    var Wi7h = Wi7.high;
+	                    var Wi7l = Wi7.low;
+
+	                    var Wi16  = W[i - 16];
+	                    var Wi16h = Wi16.high;
+	                    var Wi16l = Wi16.low;
+
+	                    Wil = gamma0l + Wi7l;
+	                    Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
+	                    Wil = Wil + gamma1l;
+	                    Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
+	                    Wil = Wil + Wi16l;
+	                    Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
+
+	                    Wi.high = Wih;
+	                    Wi.low  = Wil;
+	                }
+
+	                var chh  = (eh & fh) ^ (~eh & gh);
+	                var chl  = (el & fl) ^ (~el & gl);
+	                var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
+	                var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
+
+	                var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
+	                var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
+	                var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
+	                var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
+
+	                // t1 = h + sigma1 + ch + K[i] + W[i]
+	                var Ki  = K[i];
+	                var Kih = Ki.high;
+	                var Kil = Ki.low;
+
+	                var t1l = hl + sigma1l;
+	                var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
+	                var t1l = t1l + chl;
+	                var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
+	                var t1l = t1l + Kil;
+	                var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
+	                var t1l = t1l + Wil;
+	                var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
+
+	                // t2 = sigma0 + maj
+	                var t2l = sigma0l + majl;
+	                var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
+
+	                // Update working variables
+	                hh = gh;
+	                hl = gl;
+	                gh = fh;
+	                gl = fl;
+	                fh = eh;
+	                fl = el;
+	                el = (dl + t1l) | 0;
+	                eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
+	                dh = ch;
+	                dl = cl;
+	                ch = bh;
+	                cl = bl;
+	                bh = ah;
+	                bl = al;
+	                al = (t1l + t2l) | 0;
+	                ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
+	            }
+
+	            // Intermediate hash value
+	            H0l = H0.low  = (H0l + al);
+	            H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
+	            H1l = H1.low  = (H1l + bl);
+	            H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
+	            H2l = H2.low  = (H2l + cl);
+	            H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
+	            H3l = H3.low  = (H3l + dl);
+	            H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
+	            H4l = H4.low  = (H4l + el);
+	            H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
+	            H5l = H5.low  = (H5l + fl);
+	            H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
+	            H6l = H6.low  = (H6l + gl);
+	            H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
+	            H7l = H7.low  = (H7l + hl);
+	            H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
+	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
+	            data.sigBytes = dataWords.length * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Convert hash to 32-bit word array before returning
+	            var hash = this._hash.toX32();
+
+	            // Return final computed hash
+	            return hash;
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+	            clone._hash = this._hash.clone();
+
+	            return clone;
+	        },
+
+	        blockSize: 1024/32
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA512('message');
+	     *     var hash = CryptoJS.SHA512(wordArray);
+	     */
+	    C.SHA512 = Hasher._createHelper(SHA512);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA512(message, key);
+	     */
+	    C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_x64 = C.x64;
+	    var X64Word = C_x64.Word;
+	    var X64WordArray = C_x64.WordArray;
+	    var C_algo = C.algo;
+	    var SHA512 = C_algo.SHA512;
+
+	    /**
+	     * SHA-384 hash algorithm.
+	     */
+	    var SHA384 = C_algo.SHA384 = SHA512.extend({
+	        _doReset: function () {
+	            this._hash = new X64WordArray.init([
+	                new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
+	                new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
+	                new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
+	                new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
+	            ]);
+	        },
+
+	        _doFinalize: function () {
+	            var hash = SHA512._doFinalize.call(this);
+
+	            hash.sigBytes -= 16;
+
+	            return hash;
+	        }
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA384('message');
+	     *     var hash = CryptoJS.SHA384(wordArray);
+	     */
+	    C.SHA384 = SHA512._createHelper(SHA384);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA384(message, key);
+	     */
+	    C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
+	}());
+
+
+	(function (Math) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var Hasher = C_lib.Hasher;
+	    var C_x64 = C.x64;
+	    var X64Word = C_x64.Word;
+	    var C_algo = C.algo;
+
+	    // Constants tables
+	    var RHO_OFFSETS = [];
+	    var PI_INDEXES  = [];
+	    var ROUND_CONSTANTS = [];
+
+	    // Compute Constants
+	    (function () {
+	        // Compute rho offset constants
+	        var x = 1, y = 0;
+	        for (var t = 0; t < 24; t++) {
+	            RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
+
+	            var newX = y % 5;
+	            var newY = (2 * x + 3 * y) % 5;
+	            x = newX;
+	            y = newY;
+	        }
+
+	        // Compute pi index constants
+	        for (var x = 0; x < 5; x++) {
+	            for (var y = 0; y < 5; y++) {
+	                PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
+	            }
+	        }
+
+	        // Compute round constants
+	        var LFSR = 0x01;
+	        for (var i = 0; i < 24; i++) {
+	            var roundConstantMsw = 0;
+	            var roundConstantLsw = 0;
+
+	            for (var j = 0; j < 7; j++) {
+	                if (LFSR & 0x01) {
+	                    var bitPosition = (1 << j) - 1;
+	                    if (bitPosition < 32) {
+	                        roundConstantLsw ^= 1 << bitPosition;
+	                    } else /* if (bitPosition >= 32) */ {
+	                        roundConstantMsw ^= 1 << (bitPosition - 32);
+	                    }
+	                }
+
+	                // Compute next LFSR
+	                if (LFSR & 0x80) {
+	                    // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
+	                    LFSR = (LFSR << 1) ^ 0x71;
+	                } else {
+	                    LFSR <<= 1;
+	                }
+	            }
+
+	            ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
+	        }
+	    }());
+
+	    // Reusable objects for temporary values
+	    var T = [];
+	    (function () {
+	        for (var i = 0; i < 25; i++) {
+	            T[i] = X64Word.create();
+	        }
+	    }());
+
+	    /**
+	     * SHA-3 hash algorithm.
+	     */
+	    var SHA3 = C_algo.SHA3 = Hasher.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {number} outputLength
+	         *   The desired number of bits in the output hash.
+	         *   Only values permitted are: 224, 256, 384, 512.
+	         *   Default: 512
+	         */
+	        cfg: Hasher.cfg.extend({
+	            outputLength: 512
+	        }),
+
+	        _doReset: function () {
+	            var state = this._state = []
+	            for (var i = 0; i < 25; i++) {
+	                state[i] = new X64Word.init();
+	            }
+
+	            this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcuts
+	            var state = this._state;
+	            var nBlockSizeLanes = this.blockSize / 2;
+
+	            // Absorb
+	            for (var i = 0; i < nBlockSizeLanes; i++) {
+	                // Shortcuts
+	                var M2i  = M[offset + 2 * i];
+	                var M2i1 = M[offset + 2 * i + 1];
+
+	                // Swap endian
+	                M2i = (
+	                    (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |
+	                    (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)
+	                );
+	                M2i1 = (
+	                    (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |
+	                    (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)
+	                );
+
+	                // Absorb message into state
+	                var lane = state[i];
+	                lane.high ^= M2i1;
+	                lane.low  ^= M2i;
+	            }
+
+	            // Rounds
+	            for (var round = 0; round < 24; round++) {
+	                // Theta
+	                for (var x = 0; x < 5; x++) {
+	                    // Mix column lanes
+	                    var tMsw = 0, tLsw = 0;
+	                    for (var y = 0; y < 5; y++) {
+	                        var lane = state[x + 5 * y];
+	                        tMsw ^= lane.high;
+	                        tLsw ^= lane.low;
+	                    }
+
+	                    // Temporary values
+	                    var Tx = T[x];
+	                    Tx.high = tMsw;
+	                    Tx.low  = tLsw;
+	                }
+	                for (var x = 0; x < 5; x++) {
+	                    // Shortcuts
+	                    var Tx4 = T[(x + 4) % 5];
+	                    var Tx1 = T[(x + 1) % 5];
+	                    var Tx1Msw = Tx1.high;
+	                    var Tx1Lsw = Tx1.low;
+
+	                    // Mix surrounding columns
+	                    var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
+	                    var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
+	                    for (var y = 0; y < 5; y++) {
+	                        var lane = state[x + 5 * y];
+	                        lane.high ^= tMsw;
+	                        lane.low  ^= tLsw;
+	                    }
+	                }
+
+	                // Rho Pi
+	                for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
+	                    var tMsw;
+	                    var tLsw;
+
+	                    // Shortcuts
+	                    var lane = state[laneIndex];
+	                    var laneMsw = lane.high;
+	                    var laneLsw = lane.low;
+	                    var rhoOffset = RHO_OFFSETS[laneIndex];
+
+	                    // Rotate lanes
+	                    if (rhoOffset < 32) {
+	                        tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
+	                        tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
+	                    } else /* if (rhoOffset >= 32) */ {
+	                        tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
+	                        tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
+	                    }
+
+	                    // Transpose lanes
+	                    var TPiLane = T[PI_INDEXES[laneIndex]];
+	                    TPiLane.high = tMsw;
+	                    TPiLane.low  = tLsw;
+	                }
+
+	                // Rho pi at x = y = 0
+	                var T0 = T[0];
+	                var state0 = state[0];
+	                T0.high = state0.high;
+	                T0.low  = state0.low;
+
+	                // Chi
+	                for (var x = 0; x < 5; x++) {
+	                    for (var y = 0; y < 5; y++) {
+	                        // Shortcuts
+	                        var laneIndex = x + 5 * y;
+	                        var lane = state[laneIndex];
+	                        var TLane = T[laneIndex];
+	                        var Tx1Lane = T[((x + 1) % 5) + 5 * y];
+	                        var Tx2Lane = T[((x + 2) % 5) + 5 * y];
+
+	                        // Mix rows
+	                        lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
+	                        lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);
+	                    }
+	                }
+
+	                // Iota
+	                var lane = state[0];
+	                var roundConstant = ROUND_CONSTANTS[round];
+	                lane.high ^= roundConstant.high;
+	                lane.low  ^= roundConstant.low;
+	            }
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+	            var blockSizeBits = this.blockSize * 32;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
+	            dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
+	            data.sigBytes = dataWords.length * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Shortcuts
+	            var state = this._state;
+	            var outputLengthBytes = this.cfg.outputLength / 8;
+	            var outputLengthLanes = outputLengthBytes / 8;
+
+	            // Squeeze
+	            var hashWords = [];
+	            for (var i = 0; i < outputLengthLanes; i++) {
+	                // Shortcuts
+	                var lane = state[i];
+	                var laneMsw = lane.high;
+	                var laneLsw = lane.low;
+
+	                // Swap endian
+	                laneMsw = (
+	                    (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |
+	                    (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)
+	                );
+	                laneLsw = (
+	                    (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |
+	                    (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)
+	                );
+
+	                // Squeeze state to retrieve hash
+	                hashWords.push(laneLsw);
+	                hashWords.push(laneMsw);
+	            }
+
+	            // Return final computed hash
+	            return new WordArray.init(hashWords, outputLengthBytes);
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+
+	            var state = clone._state = this._state.slice(0);
+	            for (var i = 0; i < 25; i++) {
+	                state[i] = state[i].clone();
+	            }
+
+	            return clone;
+	        }
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA3('message');
+	     *     var hash = CryptoJS.SHA3(wordArray);
+	     */
+	    C.SHA3 = Hasher._createHelper(SHA3);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA3(message, key);
+	     */
+	    C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
+	}(Math));
+
+
+	/** @preserve
+	(c) 2012 by Cédric Mesnil. All rights reserved.
+
+	Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+	    - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+	    - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+	*/
+
+	(function (Math) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var Hasher = C_lib.Hasher;
+	    var C_algo = C.algo;
+
+	    // Constants table
+	    var _zl = WordArray.create([
+	        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
+	        7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,
+	        3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,
+	        1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,
+	        4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);
+	    var _zr = WordArray.create([
+	        5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,
+	        6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,
+	        15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,
+	        8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,
+	        12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);
+	    var _sl = WordArray.create([
+	         11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,
+	        7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,
+	        11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,
+	          11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,
+	        9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);
+	    var _sr = WordArray.create([
+	        8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,
+	        9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,
+	        9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,
+	        15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,
+	        8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);
+
+	    var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
+	    var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
+
+	    /**
+	     * RIPEMD160 hash algorithm.
+	     */
+	    var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
+	        _doReset: function () {
+	            this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+
+	            // Swap endian
+	            for (var i = 0; i < 16; i++) {
+	                // Shortcuts
+	                var offset_i = offset + i;
+	                var M_offset_i = M[offset_i];
+
+	                // Swap
+	                M[offset_i] = (
+	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
+	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
+	                );
+	            }
+	            // Shortcut
+	            var H  = this._hash.words;
+	            var hl = _hl.words;
+	            var hr = _hr.words;
+	            var zl = _zl.words;
+	            var zr = _zr.words;
+	            var sl = _sl.words;
+	            var sr = _sr.words;
+
+	            // Working variables
+	            var al, bl, cl, dl, el;
+	            var ar, br, cr, dr, er;
+
+	            ar = al = H[0];
+	            br = bl = H[1];
+	            cr = cl = H[2];
+	            dr = dl = H[3];
+	            er = el = H[4];
+	            // Computation
+	            var t;
+	            for (var i = 0; i < 80; i += 1) {
+	                t = (al +  M[offset+zl[i]])|0;
+	                if (i<16){
+		            t +=  f1(bl,cl,dl) + hl[0];
+	                } else if (i<32) {
+		            t +=  f2(bl,cl,dl) + hl[1];
+	                } else if (i<48) {
+		            t +=  f3(bl,cl,dl) + hl[2];
+	                } else if (i<64) {
+		            t +=  f4(bl,cl,dl) + hl[3];
+	                } else {// if (i<80) {
+		            t +=  f5(bl,cl,dl) + hl[4];
+	                }
+	                t = t|0;
+	                t =  rotl(t,sl[i]);
+	                t = (t+el)|0;
+	                al = el;
+	                el = dl;
+	                dl = rotl(cl, 10);
+	                cl = bl;
+	                bl = t;
+
+	                t = (ar + M[offset+zr[i]])|0;
+	                if (i<16){
+		            t +=  f5(br,cr,dr) + hr[0];
+	                } else if (i<32) {
+		            t +=  f4(br,cr,dr) + hr[1];
+	                } else if (i<48) {
+		            t +=  f3(br,cr,dr) + hr[2];
+	                } else if (i<64) {
+		            t +=  f2(br,cr,dr) + hr[3];
+	                } else {// if (i<80) {
+		            t +=  f1(br,cr,dr) + hr[4];
+	                }
+	                t = t|0;
+	                t =  rotl(t,sr[i]) ;
+	                t = (t+er)|0;
+	                ar = er;
+	                er = dr;
+	                dr = rotl(cr, 10);
+	                cr = br;
+	                br = t;
+	            }
+	            // Intermediate hash value
+	            t    = (H[1] + cl + dr)|0;
+	            H[1] = (H[2] + dl + er)|0;
+	            H[2] = (H[3] + el + ar)|0;
+	            H[3] = (H[4] + al + br)|0;
+	            H[4] = (H[0] + bl + cr)|0;
+	            H[0] =  t;
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+	                (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |
+	                (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)
+	            );
+	            data.sigBytes = (dataWords.length + 1) * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Shortcuts
+	            var hash = this._hash;
+	            var H = hash.words;
+
+	            // Swap endian
+	            for (var i = 0; i < 5; i++) {
+	                // Shortcut
+	                var H_i = H[i];
+
+	                // Swap
+	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
+	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
+	            }
+
+	            // Return final computed hash
+	            return hash;
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+	            clone._hash = this._hash.clone();
+
+	            return clone;
+	        }
+	    });
+
+
+	    function f1(x, y, z) {
+	        return ((x) ^ (y) ^ (z));
+
+	    }
+
+	    function f2(x, y, z) {
+	        return (((x)&(y)) | ((~x)&(z)));
+	    }
+
+	    function f3(x, y, z) {
+	        return (((x) | (~(y))) ^ (z));
+	    }
+
+	    function f4(x, y, z) {
+	        return (((x) & (z)) | ((y)&(~(z))));
+	    }
+
+	    function f5(x, y, z) {
+	        return ((x) ^ ((y) |(~(z))));
+
+	    }
+
+	    function rotl(x,n) {
+	        return (x<<n) | (x>>>(32-n));
+	    }
+
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.RIPEMD160('message');
+	     *     var hash = CryptoJS.RIPEMD160(wordArray);
+	     */
+	    C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacRIPEMD160(message, key);
+	     */
+	    C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
+	}(Math));
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Base = C_lib.Base;
+	    var C_enc = C.enc;
+	    var Utf8 = C_enc.Utf8;
+	    var C_algo = C.algo;
+
+	    /**
+	     * HMAC algorithm.
+	     */
+	    var HMAC = C_algo.HMAC = Base.extend({
+	        /**
+	         * Initializes a newly created HMAC.
+	         *
+	         * @param {Hasher} hasher The hash algorithm to use.
+	         * @param {WordArray|string} key The secret key.
+	         *
+	         * @example
+	         *
+	         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
+	         */
+	        init: function (hasher, key) {
+	            // Init hasher
+	            hasher = this._hasher = new hasher.init();
+
+	            // Convert string to WordArray, else assume WordArray already
+	            if (typeof key == 'string') {
+	                key = Utf8.parse(key);
+	            }
+
+	            // Shortcuts
+	            var hasherBlockSize = hasher.blockSize;
+	            var hasherBlockSizeBytes = hasherBlockSize * 4;
+
+	            // Allow arbitrary length keys
+	            if (key.sigBytes > hasherBlockSizeBytes) {
+	                key = hasher.finalize(key);
+	            }
+
+	            // Clamp excess bits
+	            key.clamp();
+
+	            // Clone key for inner and outer pads
+	            var oKey = this._oKey = key.clone();
+	            var iKey = this._iKey = key.clone();
+
+	            // Shortcuts
+	            var oKeyWords = oKey.words;
+	            var iKeyWords = iKey.words;
+
+	            // XOR keys with pad constants
+	            for (var i = 0; i < hasherBlockSize; i++) {
+	                oKeyWords[i] ^= 0x5c5c5c5c;
+	                iKeyWords[i] ^= 0x36363636;
+	            }
+	            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
+
+	            // Set initial values
+	            this.reset();
+	        },
+
+	        /**
+	         * Resets this HMAC to its initial state.
+	         *
+	         * @example
+	         *
+	         *     hmacHasher.reset();
+	         */
+	        reset: function () {
+	            // Shortcut
+	            var hasher = this._hasher;
+
+	            // Reset
+	            hasher.reset();
+	            hasher.update(this._iKey);
+	        },
+
+	        /**
+	         * Updates this HMAC with a message.
+	         *
+	         * @param {WordArray|string} messageUpdate The message to append.
+	         *
+	         * @return {HMAC} This HMAC instance.
+	         *
+	         * @example
+	         *
+	         *     hmacHasher.update('message');
+	         *     hmacHasher.update(wordArray);
+	         */
+	        update: function (messageUpdate) {
+	            this._hasher.update(messageUpdate);
+
+	            // Chainable
+	            return this;
+	        },
+
+	        /**
+	         * Finalizes the HMAC computation.
+	         * Note that the finalize operation is effectively a destructive, read-once operation.
+	         *
+	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
+	         *
+	         * @return {WordArray} The HMAC.
+	         *
+	         * @example
+	         *
+	         *     var hmac = hmacHasher.finalize();
+	         *     var hmac = hmacHasher.finalize('message');
+	         *     var hmac = hmacHasher.finalize(wordArray);
+	         */
+	        finalize: function (messageUpdate) {
+	            // Shortcut
+	            var hasher = this._hasher;
+
+	            // Compute HMAC
+	            var innerHash = hasher.finalize(messageUpdate);
+	            hasher.reset();
+	            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
+
+	            return hmac;
+	        }
+	    });
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Base = C_lib.Base;
+	    var WordArray = C_lib.WordArray;
+	    var C_algo = C.algo;
+	    var SHA1 = C_algo.SHA1;
+	    var HMAC = C_algo.HMAC;
+
+	    /**
+	     * Password-Based Key Derivation Function 2 algorithm.
+	     */
+	    var PBKDF2 = C_algo.PBKDF2 = Base.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+	         * @property {Hasher} hasher The hasher to use. Default: SHA1
+	         * @property {number} iterations The number of iterations to perform. Default: 1
+	         */
+	        cfg: Base.extend({
+	            keySize: 128/32,
+	            hasher: SHA1,
+	            iterations: 1
+	        }),
+
+	        /**
+	         * Initializes a newly created key derivation function.
+	         *
+	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+	         *
+	         * @example
+	         *
+	         *     var kdf = CryptoJS.algo.PBKDF2.create();
+	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
+	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
+	         */
+	        init: function (cfg) {
+	            this.cfg = this.cfg.extend(cfg);
+	        },
+
+	        /**
+	         * Computes the Password-Based Key Derivation Function 2.
+	         *
+	         * @param {WordArray|string} password The password.
+	         * @param {WordArray|string} salt A salt.
+	         *
+	         * @return {WordArray} The derived key.
+	         *
+	         * @example
+	         *
+	         *     var key = kdf.compute(password, salt);
+	         */
+	        compute: function (password, salt) {
+	            // Shortcut
+	            var cfg = this.cfg;
+
+	            // Init HMAC
+	            var hmac = HMAC.create(cfg.hasher, password);
+
+	            // Initial values
+	            var derivedKey = WordArray.create();
+	            var blockIndex = WordArray.create([0x00000001]);
+
+	            // Shortcuts
+	            var derivedKeyWords = derivedKey.words;
+	            var blockIndexWords = blockIndex.words;
+	            var keySize = cfg.keySize;
+	            var iterations = cfg.iterations;
+
+	            // Generate key
+	            while (derivedKeyWords.length < keySize) {
+	                var block = hmac.update(salt).finalize(blockIndex);
+	                hmac.reset();
+
+	                // Shortcuts
+	                var blockWords = block.words;
+	                var blockWordsLength = blockWords.length;
+
+	                // Iterations
+	                var intermediate = block;
+	                for (var i = 1; i < iterations; i++) {
+	                    intermediate = hmac.finalize(intermediate);
+	                    hmac.reset();
+
+	                    // Shortcut
+	                    var intermediateWords = intermediate.words;
+
+	                    // XOR intermediate with block
+	                    for (var j = 0; j < blockWordsLength; j++) {
+	                        blockWords[j] ^= intermediateWords[j];
+	                    }
+	                }
+
+	                derivedKey.concat(block);
+	                blockIndexWords[0]++;
+	            }
+	            derivedKey.sigBytes = keySize * 4;
+
+	            return derivedKey;
+	        }
+	    });
+
+	    /**
+	     * Computes the Password-Based Key Derivation Function 2.
+	     *
+	     * @param {WordArray|string} password The password.
+	     * @param {WordArray|string} salt A salt.
+	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
+	     *
+	     * @return {WordArray} The derived key.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var key = CryptoJS.PBKDF2(password, salt);
+	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
+	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
+	     */
+	    C.PBKDF2 = function (password, salt, cfg) {
+	        return PBKDF2.create(cfg).compute(password, salt);
+	    };
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Base = C_lib.Base;
+	    var WordArray = C_lib.WordArray;
+	    var C_algo = C.algo;
+	    var MD5 = C_algo.MD5;
+
+	    /**
+	     * This key derivation function is meant to conform with EVP_BytesToKey.
+	     * www.openssl.org/docs/crypto/EVP_BytesToKey.html
+	     */
+	    var EvpKDF = C_algo.EvpKDF = Base.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+	         * @property {Hasher} hasher The hash algorithm to use. Default: MD5
+	         * @property {number} iterations The number of iterations to perform. Default: 1
+	         */
+	        cfg: Base.extend({
+	            keySize: 128/32,
+	            hasher: MD5,
+	            iterations: 1
+	        }),
+
+	        /**
+	         * Initializes a newly created key derivation function.
+	         *
+	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+	         *
+	         * @example
+	         *
+	         *     var kdf = CryptoJS.algo.EvpKDF.create();
+	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
+	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
+	         */
+	        init: function (cfg) {
+	            this.cfg = this.cfg.extend(cfg);
+	        },
+
+	        /**
+	         * Derives a key from a password.
+	         *
+	         * @param {WordArray|string} password The password.
+	         * @param {WordArray|string} salt A salt.
+	         *
+	         * @return {WordArray} The derived key.
+	         *
+	         * @example
+	         *
+	         *     var key = kdf.compute(password, salt);
+	         */
+	        compute: function (password, salt) {
+	            var block;
+
+	            // Shortcut
+	            var cfg = this.cfg;
+
+	            // Init hasher
+	            var hasher = cfg.hasher.create();
+
+	            // Initial values
+	            var derivedKey = WordArray.create();
+
+	            // Shortcuts
+	            var derivedKeyWords = derivedKey.words;
+	            var keySize = cfg.keySize;
+	            var iterations = cfg.iterations;
+
+	            // Generate key
+	            while (derivedKeyWords.length < keySize) {
+	                if (block) {
+	                    hasher.update(block);
+	                }
+	                block = hasher.update(password).finalize(salt);
+	                hasher.reset();
+
+	                // Iterations
+	                for (var i = 1; i < iterations; i++) {
+	                    block = hasher.finalize(block);
+	                    hasher.reset();
+	                }
+
+	                derivedKey.concat(block);
+	            }
+	            derivedKey.sigBytes = keySize * 4;
+
+	            return derivedKey;
+	        }
+	    });
+
+	    /**
+	     * Derives a key from a password.
+	     *
+	     * @param {WordArray|string} password The password.
+	     * @param {WordArray|string} salt A salt.
+	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
+	     *
+	     * @return {WordArray} The derived key.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var key = CryptoJS.EvpKDF(password, salt);
+	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
+	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
+	     */
+	    C.EvpKDF = function (password, salt, cfg) {
+	        return EvpKDF.create(cfg).compute(password, salt);
+	    };
+	}());
+
+
+	/**
+	 * Cipher core components.
+	 */
+	CryptoJS.lib.Cipher || (function (undefined) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Base = C_lib.Base;
+	    var WordArray = C_lib.WordArray;
+	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
+	    var C_enc = C.enc;
+	    var Utf8 = C_enc.Utf8;
+	    var Base64 = C_enc.Base64;
+	    var C_algo = C.algo;
+	    var EvpKDF = C_algo.EvpKDF;
+
+	    /**
+	     * Abstract base cipher template.
+	     *
+	     * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
+	     * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
+	     * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
+	     * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
+	     */
+	    var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {WordArray} iv The IV to use for this operation.
+	         */
+	        cfg: Base.extend(),
+
+	        /**
+	         * Creates this cipher in encryption mode.
+	         *
+	         * @param {WordArray} key The key.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {Cipher} A cipher instance.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
+	         */
+	        createEncryptor: function (key, cfg) {
+	            return this.create(this._ENC_XFORM_MODE, key, cfg);
+	        },
+
+	        /**
+	         * Creates this cipher in decryption mode.
+	         *
+	         * @param {WordArray} key The key.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {Cipher} A cipher instance.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
+	         */
+	        createDecryptor: function (key, cfg) {
+	            return this.create(this._DEC_XFORM_MODE, key, cfg);
+	        },
+
+	        /**
+	         * Initializes a newly created cipher.
+	         *
+	         * @param {number} xformMode Either the encryption or decryption transormation mode constant.
+	         * @param {WordArray} key The key.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @example
+	         *
+	         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
+	         */
+	        init: function (xformMode, key, cfg) {
+	            // Apply config defaults
+	            this.cfg = this.cfg.extend(cfg);
+
+	            // Store transform mode and key
+	            this._xformMode = xformMode;
+	            this._key = key;
+
+	            // Set initial values
+	            this.reset();
+	        },
+
+	        /**
+	         * Resets this cipher to its initial state.
+	         *
+	         * @example
+	         *
+	         *     cipher.reset();
+	         */
+	        reset: function () {
+	            // Reset data buffer
+	            BufferedBlockAlgorithm.reset.call(this);
+
+	            // Perform concrete-cipher logic
+	            this._doReset();
+	        },
+
+	        /**
+	         * Adds data to be encrypted or decrypted.
+	         *
+	         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
+	         *
+	         * @return {WordArray} The data after processing.
+	         *
+	         * @example
+	         *
+	         *     var encrypted = cipher.process('data');
+	         *     var encrypted = cipher.process(wordArray);
+	         */
+	        process: function (dataUpdate) {
+	            // Append
+	            this._append(dataUpdate);
+
+	            // Process available blocks
+	            return this._process();
+	        },
+
+	        /**
+	         * Finalizes the encryption or decryption process.
+	         * Note that the finalize operation is effectively a destructive, read-once operation.
+	         *
+	         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
+	         *
+	         * @return {WordArray} The data after final processing.
+	         *
+	         * @example
+	         *
+	         *     var encrypted = cipher.finalize();
+	         *     var encrypted = cipher.finalize('data');
+	         *     var encrypted = cipher.finalize(wordArray);
+	         */
+	        finalize: function (dataUpdate) {
+	            // Final data update
+	            if (dataUpdate) {
+	                this._append(dataUpdate);
+	            }
+
+	            // Perform concrete-cipher logic
+	            var finalProcessedData = this._doFinalize();
+
+	            return finalProcessedData;
+	        },
+
+	        keySize: 128/32,
+
+	        ivSize: 128/32,
+
+	        _ENC_XFORM_MODE: 1,
+
+	        _DEC_XFORM_MODE: 2,
+
+	        /**
+	         * Creates shortcut functions to a cipher's object interface.
+	         *
+	         * @param {Cipher} cipher The cipher to create a helper for.
+	         *
+	         * @return {Object} An object with encrypt and decrypt shortcut functions.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
+	         */
+	        _createHelper: (function () {
+	            function selectCipherStrategy(key) {
+	                if (typeof key == 'string') {
+	                    return PasswordBasedCipher;
+	                } else {
+	                    return SerializableCipher;
+	                }
+	            }
+
+	            return function (cipher) {
+	                return {
+	                    encrypt: function (message, key, cfg) {
+	                        return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
+	                    },
+
+	                    decrypt: function (ciphertext, key, cfg) {
+	                        return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
+	                    }
+	                };
+	            };
+	        }())
+	    });
+
+	    /**
+	     * Abstract base stream cipher template.
+	     *
+	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
+	     */
+	    var StreamCipher = C_lib.StreamCipher = Cipher.extend({
+	        _doFinalize: function () {
+	            // Process partial blocks
+	            var finalProcessedBlocks = this._process(!!'flush');
+
+	            return finalProcessedBlocks;
+	        },
+
+	        blockSize: 1
+	    });
+
+	    /**
+	     * Mode namespace.
+	     */
+	    var C_mode = C.mode = {};
+
+	    /**
+	     * Abstract base block cipher mode template.
+	     */
+	    var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
+	        /**
+	         * Creates this mode for encryption.
+	         *
+	         * @param {Cipher} cipher A block cipher instance.
+	         * @param {Array} iv The IV words.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
+	         */
+	        createEncryptor: function (cipher, iv) {
+	            return this.Encryptor.create(cipher, iv);
+	        },
+
+	        /**
+	         * Creates this mode for decryption.
+	         *
+	         * @param {Cipher} cipher A block cipher instance.
+	         * @param {Array} iv The IV words.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
+	         */
+	        createDecryptor: function (cipher, iv) {
+	            return this.Decryptor.create(cipher, iv);
+	        },
+
+	        /**
+	         * Initializes a newly created mode.
+	         *
+	         * @param {Cipher} cipher A block cipher instance.
+	         * @param {Array} iv The IV words.
+	         *
+	         * @example
+	         *
+	         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
+	         */
+	        init: function (cipher, iv) {
+	            this._cipher = cipher;
+	            this._iv = iv;
+	        }
+	    });
+
+	    /**
+	     * Cipher Block Chaining mode.
+	     */
+	    var CBC = C_mode.CBC = (function () {
+	        /**
+	         * Abstract base CBC mode.
+	         */
+	        var CBC = BlockCipherMode.extend();
+
+	        /**
+	         * CBC encryptor.
+	         */
+	        CBC.Encryptor = CBC.extend({
+	            /**
+	             * Processes the data block at offset.
+	             *
+	             * @param {Array} words The data words to operate on.
+	             * @param {number} offset The offset where the block starts.
+	             *
+	             * @example
+	             *
+	             *     mode.processBlock(data.words, offset);
+	             */
+	            processBlock: function (words, offset) {
+	                // Shortcuts
+	                var cipher = this._cipher;
+	                var blockSize = cipher.blockSize;
+
+	                // XOR and encrypt
+	                xorBlock.call(this, words, offset, blockSize);
+	                cipher.encryptBlock(words, offset);
+
+	                // Remember this block to use with next block
+	                this._prevBlock = words.slice(offset, offset + blockSize);
+	            }
+	        });
+
+	        /**
+	         * CBC decryptor.
+	         */
+	        CBC.Decryptor = CBC.extend({
+	            /**
+	             * Processes the data block at offset.
+	             *
+	             * @param {Array} words The data words to operate on.
+	             * @param {number} offset The offset where the block starts.
+	             *
+	             * @example
+	             *
+	             *     mode.processBlock(data.words, offset);
+	             */
+	            processBlock: function (words, offset) {
+	                // Shortcuts
+	                var cipher = this._cipher;
+	                var blockSize = cipher.blockSize;
+
+	                // Remember this block to use with next block
+	                var thisBlock = words.slice(offset, offset + blockSize);
+
+	                // Decrypt and XOR
+	                cipher.decryptBlock(words, offset);
+	                xorBlock.call(this, words, offset, blockSize);
+
+	                // This block becomes the previous block
+	                this._prevBlock = thisBlock;
+	            }
+	        });
+
+	        function xorBlock(words, offset, blockSize) {
+	            var block;
+
+	            // Shortcut
+	            var iv = this._iv;
+
+	            // Choose mixing block
+	            if (iv) {
+	                block = iv;
+
+	                // Remove IV for subsequent blocks
+	                this._iv = undefined;
+	            } else {
+	                block = this._prevBlock;
+	            }
+
+	            // XOR blocks
+	            for (var i = 0; i < blockSize; i++) {
+	                words[offset + i] ^= block[i];
+	            }
+	        }
+
+	        return CBC;
+	    }());
+
+	    /**
+	     * Padding namespace.
+	     */
+	    var C_pad = C.pad = {};
+
+	    /**
+	     * PKCS #5/7 padding strategy.
+	     */
+	    var Pkcs7 = C_pad.Pkcs7 = {
+	        /**
+	         * Pads data using the algorithm defined in PKCS #5/7.
+	         *
+	         * @param {WordArray} data The data to pad.
+	         * @param {number} blockSize The multiple that the data should be padded to.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);
+	         */
+	        pad: function (data, blockSize) {
+	            // Shortcut
+	            var blockSizeBytes = blockSize * 4;
+
+	            // Count padding bytes
+	            var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+	            // Create padding word
+	            var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
+
+	            // Create padding
+	            var paddingWords = [];
+	            for (var i = 0; i < nPaddingBytes; i += 4) {
+	                paddingWords.push(paddingWord);
+	            }
+	            var padding = WordArray.create(paddingWords, nPaddingBytes);
+
+	            // Add padding
+	            data.concat(padding);
+	        },
+
+	        /**
+	         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
+	         *
+	         * @param {WordArray} data The data to unpad.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     CryptoJS.pad.Pkcs7.unpad(wordArray);
+	         */
+	        unpad: function (data) {
+	            // Get number of padding bytes from last byte
+	            var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+	            // Remove padding
+	            data.sigBytes -= nPaddingBytes;
+	        }
+	    };
+
+	    /**
+	     * Abstract base block cipher template.
+	     *
+	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
+	     */
+	    var BlockCipher = C_lib.BlockCipher = Cipher.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {Mode} mode The block mode to use. Default: CBC
+	         * @property {Padding} padding The padding strategy to use. Default: Pkcs7
+	         */
+	        cfg: Cipher.cfg.extend({
+	            mode: CBC,
+	            padding: Pkcs7
+	        }),
+
+	        reset: function () {
+	            var modeCreator;
+
+	            // Reset cipher
+	            Cipher.reset.call(this);
+
+	            // Shortcuts
+	            var cfg = this.cfg;
+	            var iv = cfg.iv;
+	            var mode = cfg.mode;
+
+	            // Reset block mode
+	            if (this._xformMode == this._ENC_XFORM_MODE) {
+	                modeCreator = mode.createEncryptor;
+	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+	                modeCreator = mode.createDecryptor;
+	                // Keep at least one block in the buffer for unpadding
+	                this._minBufferSize = 1;
+	            }
+
+	            if (this._mode && this._mode.__creator == modeCreator) {
+	                this._mode.init(this, iv && iv.words);
+	            } else {
+	                this._mode = modeCreator.call(mode, this, iv && iv.words);
+	                this._mode.__creator = modeCreator;
+	            }
+	        },
+
+	        _doProcessBlock: function (words, offset) {
+	            this._mode.processBlock(words, offset);
+	        },
+
+	        _doFinalize: function () {
+	            var finalProcessedBlocks;
+
+	            // Shortcut
+	            var padding = this.cfg.padding;
+
+	            // Finalize
+	            if (this._xformMode == this._ENC_XFORM_MODE) {
+	                // Pad data
+	                padding.pad(this._data, this.blockSize);
+
+	                // Process final blocks
+	                finalProcessedBlocks = this._process(!!'flush');
+	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+	                // Process final blocks
+	                finalProcessedBlocks = this._process(!!'flush');
+
+	                // Unpad data
+	                padding.unpad(finalProcessedBlocks);
+	            }
+
+	            return finalProcessedBlocks;
+	        },
+
+	        blockSize: 128/32
+	    });
+
+	    /**
+	     * A collection of cipher parameters.
+	     *
+	     * @property {WordArray} ciphertext The raw ciphertext.
+	     * @property {WordArray} key The key to this ciphertext.
+	     * @property {WordArray} iv The IV used in the ciphering operation.
+	     * @property {WordArray} salt The salt used with a key derivation function.
+	     * @property {Cipher} algorithm The cipher algorithm.
+	     * @property {Mode} mode The block mode used in the ciphering operation.
+	     * @property {Padding} padding The padding scheme used in the ciphering operation.
+	     * @property {number} blockSize The block size of the cipher.
+	     * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
+	     */
+	    var CipherParams = C_lib.CipherParams = Base.extend({
+	        /**
+	         * Initializes a newly created cipher params object.
+	         *
+	         * @param {Object} cipherParams An object with any of the possible cipher parameters.
+	         *
+	         * @example
+	         *
+	         *     var cipherParams = CryptoJS.lib.CipherParams.create({
+	         *         ciphertext: ciphertextWordArray,
+	         *         key: keyWordArray,
+	         *         iv: ivWordArray,
+	         *         salt: saltWordArray,
+	         *         algorithm: CryptoJS.algo.AES,
+	         *         mode: CryptoJS.mode.CBC,
+	         *         padding: CryptoJS.pad.PKCS7,
+	         *         blockSize: 4,
+	         *         formatter: CryptoJS.format.OpenSSL
+	         *     });
+	         */
+	        init: function (cipherParams) {
+	            this.mixIn(cipherParams);
+	        },
+
+	        /**
+	         * Converts this cipher params object to a string.
+	         *
+	         * @param {Format} formatter (Optional) The formatting strategy to use.
+	         *
+	         * @return {string} The stringified cipher params.
+	         *
+	         * @throws Error If neither the formatter nor the default formatter is set.
+	         *
+	         * @example
+	         *
+	         *     var string = cipherParams + '';
+	         *     var string = cipherParams.toString();
+	         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);
+	         */
+	        toString: function (formatter) {
+	            return (formatter || this.formatter).stringify(this);
+	        }
+	    });
+
+	    /**
+	     * Format namespace.
+	     */
+	    var C_format = C.format = {};
+
+	    /**
+	     * OpenSSL formatting strategy.
+	     */
+	    var OpenSSLFormatter = C_format.OpenSSL = {
+	        /**
+	         * Converts a cipher params object to an OpenSSL-compatible string.
+	         *
+	         * @param {CipherParams} cipherParams The cipher params object.
+	         *
+	         * @return {string} The OpenSSL-compatible string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
+	         */
+	        stringify: function (cipherParams) {
+	            var wordArray;
+
+	            // Shortcuts
+	            var ciphertext = cipherParams.ciphertext;
+	            var salt = cipherParams.salt;
+
+	            // Format
+	            if (salt) {
+	                wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
+	            } else {
+	                wordArray = ciphertext;
+	            }
+
+	            return wordArray.toString(Base64);
+	        },
+
+	        /**
+	         * Converts an OpenSSL-compatible string to a cipher params object.
+	         *
+	         * @param {string} openSSLStr The OpenSSL-compatible string.
+	         *
+	         * @return {CipherParams} The cipher params object.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
+	         */
+	        parse: function (openSSLStr) {
+	            var salt;
+
+	            // Parse base64
+	            var ciphertext = Base64.parse(openSSLStr);
+
+	            // Shortcut
+	            var ciphertextWords = ciphertext.words;
+
+	            // Test for salt
+	            if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
+	                // Extract salt
+	                salt = WordArray.create(ciphertextWords.slice(2, 4));
+
+	                // Remove salt from ciphertext
+	                ciphertextWords.splice(0, 4);
+	                ciphertext.sigBytes -= 16;
+	            }
+
+	            return CipherParams.create({ ciphertext: ciphertext, salt: salt });
+	        }
+	    };
+
+	    /**
+	     * A cipher wrapper that returns ciphertext as a serializable cipher params object.
+	     */
+	    var SerializableCipher = C_lib.SerializableCipher = Base.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
+	         */
+	        cfg: Base.extend({
+	            format: OpenSSLFormatter
+	        }),
+
+	        /**
+	         * Encrypts a message.
+	         *
+	         * @param {Cipher} cipher The cipher algorithm to use.
+	         * @param {WordArray|string} message The message to encrypt.
+	         * @param {WordArray} key The key.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {CipherParams} A cipher params object.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
+	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
+	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+	         */
+	        encrypt: function (cipher, message, key, cfg) {
+	            // Apply config defaults
+	            cfg = this.cfg.extend(cfg);
+
+	            // Encrypt
+	            var encryptor = cipher.createEncryptor(key, cfg);
+	            var ciphertext = encryptor.finalize(message);
+
+	            // Shortcut
+	            var cipherCfg = encryptor.cfg;
+
+	            // Create and return serializable cipher params
+	            return CipherParams.create({
+	                ciphertext: ciphertext,
+	                key: key,
+	                iv: cipherCfg.iv,
+	                algorithm: cipher,
+	                mode: cipherCfg.mode,
+	                padding: cipherCfg.padding,
+	                blockSize: cipher.blockSize,
+	                formatter: cfg.format
+	            });
+	        },
+
+	        /**
+	         * Decrypts serialized ciphertext.
+	         *
+	         * @param {Cipher} cipher The cipher algorithm to use.
+	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+	         * @param {WordArray} key The key.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {WordArray} The plaintext.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+	         */
+	        decrypt: function (cipher, ciphertext, key, cfg) {
+	            // Apply config defaults
+	            cfg = this.cfg.extend(cfg);
+
+	            // Convert string to CipherParams
+	            ciphertext = this._parse(ciphertext, cfg.format);
+
+	            // Decrypt
+	            var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
+
+	            return plaintext;
+	        },
+
+	        /**
+	         * Converts serialized ciphertext to CipherParams,
+	         * else assumed CipherParams already and returns ciphertext unchanged.
+	         *
+	         * @param {CipherParams|string} ciphertext The ciphertext.
+	         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
+	         *
+	         * @return {CipherParams} The unserialized ciphertext.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
+	         */
+	        _parse: function (ciphertext, format) {
+	            if (typeof ciphertext == 'string') {
+	                return format.parse(ciphertext, this);
+	            } else {
+	                return ciphertext;
+	            }
+	        }
+	    });
+
+	    /**
+	     * Key derivation function namespace.
+	     */
+	    var C_kdf = C.kdf = {};
+
+	    /**
+	     * OpenSSL key derivation function.
+	     */
+	    var OpenSSLKdf = C_kdf.OpenSSL = {
+	        /**
+	         * Derives a key and IV from a password.
+	         *
+	         * @param {string} password The password to derive from.
+	         * @param {number} keySize The size in words of the key to generate.
+	         * @param {number} ivSize The size in words of the IV to generate.
+	         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
+	         *
+	         * @return {CipherParams} A cipher params object with the key, IV, and salt.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
+	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
+	         */
+	        execute: function (password, keySize, ivSize, salt) {
+	            // Generate random salt
+	            if (!salt) {
+	                salt = WordArray.random(64/8);
+	            }
+
+	            // Derive key and IV
+	            var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
+
+	            // Separate key and IV
+	            var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
+	            key.sigBytes = keySize * 4;
+
+	            // Return params
+	            return CipherParams.create({ key: key, iv: iv, salt: salt });
+	        }
+	    };
+
+	    /**
+	     * A serializable cipher wrapper that derives the key from a password,
+	     * and returns ciphertext as a serializable cipher params object.
+	     */
+	    var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
+	         */
+	        cfg: SerializableCipher.cfg.extend({
+	            kdf: OpenSSLKdf
+	        }),
+
+	        /**
+	         * Encrypts a message using a password.
+	         *
+	         * @param {Cipher} cipher The cipher algorithm to use.
+	         * @param {WordArray|string} message The message to encrypt.
+	         * @param {string} password The password.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {CipherParams} A cipher params object.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
+	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
+	         */
+	        encrypt: function (cipher, message, password, cfg) {
+	            // Apply config defaults
+	            cfg = this.cfg.extend(cfg);
+
+	            // Derive key and other params
+	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
+
+	            // Add IV to config
+	            cfg.iv = derivedParams.iv;
+
+	            // Encrypt
+	            var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
+
+	            // Mix in derived params
+	            ciphertext.mixIn(derivedParams);
+
+	            return ciphertext;
+	        },
+
+	        /**
+	         * Decrypts serialized ciphertext using a password.
+	         *
+	         * @param {Cipher} cipher The cipher algorithm to use.
+	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+	         * @param {string} password The password.
+	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
+	         *
+	         * @return {WordArray} The plaintext.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
+	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
+	         */
+	        decrypt: function (cipher, ciphertext, password, cfg) {
+	            // Apply config defaults
+	            cfg = this.cfg.extend(cfg);
+
+	            // Convert string to CipherParams
+	            ciphertext = this._parse(ciphertext, cfg.format);
+
+	            // Derive key and other params
+	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
+
+	            // Add IV to config
+	            cfg.iv = derivedParams.iv;
+
+	            // Decrypt
+	            var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
+
+	            return plaintext;
+	        }
+	    });
+	}());
+
+
+	/**
+	 * Cipher Feedback block mode.
+	 */
+	CryptoJS.mode.CFB = (function () {
+	    var CFB = CryptoJS.lib.BlockCipherMode.extend();
+
+	    CFB.Encryptor = CFB.extend({
+	        processBlock: function (words, offset) {
+	            // Shortcuts
+	            var cipher = this._cipher;
+	            var blockSize = cipher.blockSize;
+
+	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+	            // Remember this block to use with next block
+	            this._prevBlock = words.slice(offset, offset + blockSize);
+	        }
+	    });
+
+	    CFB.Decryptor = CFB.extend({
+	        processBlock: function (words, offset) {
+	            // Shortcuts
+	            var cipher = this._cipher;
+	            var blockSize = cipher.blockSize;
+
+	            // Remember this block to use with next block
+	            var thisBlock = words.slice(offset, offset + blockSize);
+
+	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+	            // This block becomes the previous block
+	            this._prevBlock = thisBlock;
+	        }
+	    });
+
+	    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
+	        var keystream;
+
+	        // Shortcut
+	        var iv = this._iv;
+
+	        // Generate keystream
+	        if (iv) {
+	            keystream = iv.slice(0);
+
+	            // Remove IV for subsequent blocks
+	            this._iv = undefined;
+	        } else {
+	            keystream = this._prevBlock;
+	        }
+	        cipher.encryptBlock(keystream, 0);
+
+	        // Encrypt
+	        for (var i = 0; i < blockSize; i++) {
+	            words[offset + i] ^= keystream[i];
+	        }
+	    }
+
+	    return CFB;
+	}());
+
+
+	/**
+	 * Counter block mode.
+	 */
+	CryptoJS.mode.CTR = (function () {
+	    var CTR = CryptoJS.lib.BlockCipherMode.extend();
+
+	    var Encryptor = CTR.Encryptor = CTR.extend({
+	        processBlock: function (words, offset) {
+	            // Shortcuts
+	            var cipher = this._cipher
+	            var blockSize = cipher.blockSize;
+	            var iv = this._iv;
+	            var counter = this._counter;
+
+	            // Generate keystream
+	            if (iv) {
+	                counter = this._counter = iv.slice(0);
+
+	                // Remove IV for subsequent blocks
+	                this._iv = undefined;
+	            }
+	            var keystream = counter.slice(0);
+	            cipher.encryptBlock(keystream, 0);
+
+	            // Increment counter
+	            counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
+
+	            // Encrypt
+	            for (var i = 0; i < blockSize; i++) {
+	                words[offset + i] ^= keystream[i];
+	            }
+	        }
+	    });
+
+	    CTR.Decryptor = Encryptor;
+
+	    return CTR;
+	}());
+
+
+	/** @preserve
+	 * Counter block mode compatible with  Dr Brian Gladman fileenc.c
+	 * derived from CryptoJS.mode.CTR
+	 * Jan Hruby jhruby.web@gmail.com
+	 */
+	CryptoJS.mode.CTRGladman = (function () {
+	    var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
+
+		function incWord(word)
+		{
+			if (((word >> 24) & 0xff) === 0xff) { //overflow
+			var b1 = (word >> 16)&0xff;
+			var b2 = (word >> 8)&0xff;
+			var b3 = word & 0xff;
+
+			if (b1 === 0xff) // overflow b1
+			{
+			b1 = 0;
+			if (b2 === 0xff)
+			{
+				b2 = 0;
+				if (b3 === 0xff)
+				{
+					b3 = 0;
+				}
+				else
+				{
+					++b3;
+				}
+			}
+			else
+			{
+				++b2;
+			}
+			}
+			else
+			{
+			++b1;
+			}
+
+			word = 0;
+			word += (b1 << 16);
+			word += (b2 << 8);
+			word += b3;
+			}
+			else
+			{
+			word += (0x01 << 24);
+			}
+			return word;
+		}
+
+		function incCounter(counter)
+		{
+			if ((counter[0] = incWord(counter[0])) === 0)
+			{
+				// encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8
+				counter[1] = incWord(counter[1]);
+			}
+			return counter;
+		}
+
+	    var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
+	        processBlock: function (words, offset) {
+	            // Shortcuts
+	            var cipher = this._cipher
+	            var blockSize = cipher.blockSize;
+	            var iv = this._iv;
+	            var counter = this._counter;
+
+	            // Generate keystream
+	            if (iv) {
+	                counter = this._counter = iv.slice(0);
+
+	                // Remove IV for subsequent blocks
+	                this._iv = undefined;
+	            }
+
+				incCounter(counter);
+
+				var keystream = counter.slice(0);
+	            cipher.encryptBlock(keystream, 0);
+
+	            // Encrypt
+	            for (var i = 0; i < blockSize; i++) {
+	                words[offset + i] ^= keystream[i];
+	            }
+	        }
+	    });
+
+	    CTRGladman.Decryptor = Encryptor;
+
+	    return CTRGladman;
+	}());
+
+
+
+
+	/**
+	 * Output Feedback block mode.
+	 */
+	CryptoJS.mode.OFB = (function () {
+	    var OFB = CryptoJS.lib.BlockCipherMode.extend();
+
+	    var Encryptor = OFB.Encryptor = OFB.extend({
+	        processBlock: function (words, offset) {
+	            // Shortcuts
+	            var cipher = this._cipher
+	            var blockSize = cipher.blockSize;
+	            var iv = this._iv;
+	            var keystream = this._keystream;
+
+	            // Generate keystream
+	            if (iv) {
+	                keystream = this._keystream = iv.slice(0);
+
+	                // Remove IV for subsequent blocks
+	                this._iv = undefined;
+	            }
+	            cipher.encryptBlock(keystream, 0);
+
+	            // Encrypt
+	            for (var i = 0; i < blockSize; i++) {
+	                words[offset + i] ^= keystream[i];
+	            }
+	        }
+	    });
+
+	    OFB.Decryptor = Encryptor;
+
+	    return OFB;
+	}());
+
+
+	/**
+	 * Electronic Codebook block mode.
+	 */
+	CryptoJS.mode.ECB = (function () {
+	    var ECB = CryptoJS.lib.BlockCipherMode.extend();
+
+	    ECB.Encryptor = ECB.extend({
+	        processBlock: function (words, offset) {
+	            this._cipher.encryptBlock(words, offset);
+	        }
+	    });
+
+	    ECB.Decryptor = ECB.extend({
+	        processBlock: function (words, offset) {
+	            this._cipher.decryptBlock(words, offset);
+	        }
+	    });
+
+	    return ECB;
+	}());
+
+
+	/**
+	 * ANSI X.923 padding strategy.
+	 */
+	CryptoJS.pad.AnsiX923 = {
+	    pad: function (data, blockSize) {
+	        // Shortcuts
+	        var dataSigBytes = data.sigBytes;
+	        var blockSizeBytes = blockSize * 4;
+
+	        // Count padding bytes
+	        var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
+
+	        // Compute last byte position
+	        var lastBytePos = dataSigBytes + nPaddingBytes - 1;
+
+	        // Pad
+	        data.clamp();
+	        data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
+	        data.sigBytes += nPaddingBytes;
+	    },
+
+	    unpad: function (data) {
+	        // Get number of padding bytes from last byte
+	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+	        // Remove padding
+	        data.sigBytes -= nPaddingBytes;
+	    }
+	};
+
+
+	/**
+	 * ISO 10126 padding strategy.
+	 */
+	CryptoJS.pad.Iso10126 = {
+	    pad: function (data, blockSize) {
+	        // Shortcut
+	        var blockSizeBytes = blockSize * 4;
+
+	        // Count padding bytes
+	        var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+	        // Pad
+	        data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
+	             concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
+	    },
+
+	    unpad: function (data) {
+	        // Get number of padding bytes from last byte
+	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+	        // Remove padding
+	        data.sigBytes -= nPaddingBytes;
+	    }
+	};
+
+
+	/**
+	 * ISO/IEC 9797-1 Padding Method 2.
+	 */
+	CryptoJS.pad.Iso97971 = {
+	    pad: function (data, blockSize) {
+	        // Add 0x80 byte
+	        data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
+
+	        // Zero pad the rest
+	        CryptoJS.pad.ZeroPadding.pad(data, blockSize);
+	    },
+
+	    unpad: function (data) {
+	        // Remove zero padding
+	        CryptoJS.pad.ZeroPadding.unpad(data);
+
+	        // Remove one more byte -- the 0x80 byte
+	        data.sigBytes--;
+	    }
+	};
+
+
+	/**
+	 * Zero padding strategy.
+	 */
+	CryptoJS.pad.ZeroPadding = {
+	    pad: function (data, blockSize) {
+	        // Shortcut
+	        var blockSizeBytes = blockSize * 4;
+
+	        // Pad
+	        data.clamp();
+	        data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
+	    },
+
+	    unpad: function (data) {
+	        // Shortcut
+	        var dataWords = data.words;
+
+	        // Unpad
+	        var i = data.sigBytes - 1;
+	        for (var i = data.sigBytes - 1; i >= 0; i--) {
+	            if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
+	                data.sigBytes = i + 1;
+	                break;
+	            }
+	        }
+	    }
+	};
+
+
+	/**
+	 * A noop padding strategy.
+	 */
+	CryptoJS.pad.NoPadding = {
+	    pad: function () {
+	    },
+
+	    unpad: function () {
+	    }
+	};
+
+
+	(function (undefined) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var CipherParams = C_lib.CipherParams;
+	    var C_enc = C.enc;
+	    var Hex = C_enc.Hex;
+	    var C_format = C.format;
+
+	    var HexFormatter = C_format.Hex = {
+	        /**
+	         * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
+	         *
+	         * @param {CipherParams} cipherParams The cipher params object.
+	         *
+	         * @return {string} The hexadecimally encoded string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);
+	         */
+	        stringify: function (cipherParams) {
+	            return cipherParams.ciphertext.toString(Hex);
+	        },
+
+	        /**
+	         * Converts a hexadecimally encoded ciphertext string to a cipher params object.
+	         *
+	         * @param {string} input The hexadecimally encoded string.
+	         *
+	         * @return {CipherParams} The cipher params object.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var cipherParams = CryptoJS.format.Hex.parse(hexString);
+	         */
+	        parse: function (input) {
+	            var ciphertext = Hex.parse(input);
+	            return CipherParams.create({ ciphertext: ciphertext });
+	        }
+	    };
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var BlockCipher = C_lib.BlockCipher;
+	    var C_algo = C.algo;
+
+	    // Lookup tables
+	    var SBOX = [];
+	    var INV_SBOX = [];
+	    var SUB_MIX_0 = [];
+	    var SUB_MIX_1 = [];
+	    var SUB_MIX_2 = [];
+	    var SUB_MIX_3 = [];
+	    var INV_SUB_MIX_0 = [];
+	    var INV_SUB_MIX_1 = [];
+	    var INV_SUB_MIX_2 = [];
+	    var INV_SUB_MIX_3 = [];
+
+	    // Compute lookup tables
+	    (function () {
+	        // Compute double table
+	        var d = [];
+	        for (var i = 0; i < 256; i++) {
+	            if (i < 128) {
+	                d[i] = i << 1;
+	            } else {
+	                d[i] = (i << 1) ^ 0x11b;
+	            }
+	        }
+
+	        // Walk GF(2^8)
+	        var x = 0;
+	        var xi = 0;
+	        for (var i = 0; i < 256; i++) {
+	            // Compute sbox
+	            var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
+	            sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
+	            SBOX[x] = sx;
+	            INV_SBOX[sx] = x;
+
+	            // Compute multiplication
+	            var x2 = d[x];
+	            var x4 = d[x2];
+	            var x8 = d[x4];
+
+	            // Compute sub bytes, mix columns tables
+	            var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
+	            SUB_MIX_0[x] = (t << 24) | (t >>> 8);
+	            SUB_MIX_1[x] = (t << 16) | (t >>> 16);
+	            SUB_MIX_2[x] = (t << 8)  | (t >>> 24);
+	            SUB_MIX_3[x] = t;
+
+	            // Compute inv sub bytes, inv mix columns tables
+	            var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
+	            INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
+	            INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
+	            INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);
+	            INV_SUB_MIX_3[sx] = t;
+
+	            // Compute next counter
+	            if (!x) {
+	                x = xi = 1;
+	            } else {
+	                x = x2 ^ d[d[d[x8 ^ x2]]];
+	                xi ^= d[d[xi]];
+	            }
+	        }
+	    }());
+
+	    // Precomputed Rcon lookup
+	    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
+
+	    /**
+	     * AES block cipher algorithm.
+	     */
+	    var AES = C_algo.AES = BlockCipher.extend({
+	        _doReset: function () {
+	            var t;
+
+	            // Skip reset of nRounds has been set before and key did not change
+	            if (this._nRounds && this._keyPriorReset === this._key) {
+	                return;
+	            }
+
+	            // Shortcuts
+	            var key = this._keyPriorReset = this._key;
+	            var keyWords = key.words;
+	            var keySize = key.sigBytes / 4;
+
+	            // Compute number of rounds
+	            var nRounds = this._nRounds = keySize + 6;
+
+	            // Compute number of key schedule rows
+	            var ksRows = (nRounds + 1) * 4;
+
+	            // Compute key schedule
+	            var keySchedule = this._keySchedule = [];
+	            for (var ksRow = 0; ksRow < ksRows; ksRow++) {
+	                if (ksRow < keySize) {
+	                    keySchedule[ksRow] = keyWords[ksRow];
+	                } else {
+	                    t = keySchedule[ksRow - 1];
+
+	                    if (!(ksRow % keySize)) {
+	                        // Rot word
+	                        t = (t << 8) | (t >>> 24);
+
+	                        // Sub word
+	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+
+	                        // Mix Rcon
+	                        t ^= RCON[(ksRow / keySize) | 0] << 24;
+	                    } else if (keySize > 6 && ksRow % keySize == 4) {
+	                        // Sub word
+	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+	                    }
+
+	                    keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
+	                }
+	            }
+
+	            // Compute inv key schedule
+	            var invKeySchedule = this._invKeySchedule = [];
+	            for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
+	                var ksRow = ksRows - invKsRow;
+
+	                if (invKsRow % 4) {
+	                    var t = keySchedule[ksRow];
+	                } else {
+	                    var t = keySchedule[ksRow - 4];
+	                }
+
+	                if (invKsRow < 4 || ksRow <= 4) {
+	                    invKeySchedule[invKsRow] = t;
+	                } else {
+	                    invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
+	                                               INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
+	                }
+	            }
+	        },
+
+	        encryptBlock: function (M, offset) {
+	            this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
+	        },
+
+	        decryptBlock: function (M, offset) {
+	            // Swap 2nd and 4th rows
+	            var t = M[offset + 1];
+	            M[offset + 1] = M[offset + 3];
+	            M[offset + 3] = t;
+
+	            this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
+
+	            // Inv swap 2nd and 4th rows
+	            var t = M[offset + 1];
+	            M[offset + 1] = M[offset + 3];
+	            M[offset + 3] = t;
+	        },
+
+	        _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
+	            // Shortcut
+	            var nRounds = this._nRounds;
+
+	            // Get input, add round key
+	            var s0 = M[offset]     ^ keySchedule[0];
+	            var s1 = M[offset + 1] ^ keySchedule[1];
+	            var s2 = M[offset + 2] ^ keySchedule[2];
+	            var s3 = M[offset + 3] ^ keySchedule[3];
+
+	            // Key schedule row counter
+	            var ksRow = 4;
+
+	            // Rounds
+	            for (var round = 1; round < nRounds; round++) {
+	                // Shift rows, sub bytes, mix columns, add round key
+	                var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];
+	                var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];
+	                var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];
+	                var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];
+
+	                // Update state
+	                s0 = t0;
+	                s1 = t1;
+	                s2 = t2;
+	                s3 = t3;
+	            }
+
+	            // Shift rows, sub bytes, add round key
+	            var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
+	            var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
+	            var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
+	            var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
+
+	            // Set output
+	            M[offset]     = t0;
+	            M[offset + 1] = t1;
+	            M[offset + 2] = t2;
+	            M[offset + 3] = t3;
+	        },
+
+	        keySize: 256/32
+	    });
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);
+	     */
+	    C.AES = BlockCipher._createHelper(AES);
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var BlockCipher = C_lib.BlockCipher;
+	    var C_algo = C.algo;
+
+	    // Permuted Choice 1 constants
+	    var PC1 = [
+	        57, 49, 41, 33, 25, 17, 9,  1,
+	        58, 50, 42, 34, 26, 18, 10, 2,
+	        59, 51, 43, 35, 27, 19, 11, 3,
+	        60, 52, 44, 36, 63, 55, 47, 39,
+	        31, 23, 15, 7,  62, 54, 46, 38,
+	        30, 22, 14, 6,  61, 53, 45, 37,
+	        29, 21, 13, 5,  28, 20, 12, 4
+	    ];
+
+	    // Permuted Choice 2 constants
+	    var PC2 = [
+	        14, 17, 11, 24, 1,  5,
+	        3,  28, 15, 6,  21, 10,
+	        23, 19, 12, 4,  26, 8,
+	        16, 7,  27, 20, 13, 2,
+	        41, 52, 31, 37, 47, 55,
+	        30, 40, 51, 45, 33, 48,
+	        44, 49, 39, 56, 34, 53,
+	        46, 42, 50, 36, 29, 32
+	    ];
+
+	    // Cumulative bit shift constants
+	    var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
+
+	    // SBOXes and round permutation constants
+	    var SBOX_P = [
+	        {
+	            0x0: 0x808200,
+	            0x10000000: 0x8000,
+	            0x20000000: 0x808002,
+	            0x30000000: 0x2,
+	            0x40000000: 0x200,
+	            0x50000000: 0x808202,
+	            0x60000000: 0x800202,
+	            0x70000000: 0x800000,
+	            0x80000000: 0x202,
+	            0x90000000: 0x800200,
+	            0xa0000000: 0x8200,
+	            0xb0000000: 0x808000,
+	            0xc0000000: 0x8002,
+	            0xd0000000: 0x800002,
+	            0xe0000000: 0x0,
+	            0xf0000000: 0x8202,
+	            0x8000000: 0x0,
+	            0x18000000: 0x808202,
+	            0x28000000: 0x8202,
+	            0x38000000: 0x8000,
+	            0x48000000: 0x808200,
+	            0x58000000: 0x200,
+	            0x68000000: 0x808002,
+	            0x78000000: 0x2,
+	            0x88000000: 0x800200,
+	            0x98000000: 0x8200,
+	            0xa8000000: 0x808000,
+	            0xb8000000: 0x800202,
+	            0xc8000000: 0x800002,
+	            0xd8000000: 0x8002,
+	            0xe8000000: 0x202,
+	            0xf8000000: 0x800000,
+	            0x1: 0x8000,
+	            0x10000001: 0x2,
+	            0x20000001: 0x808200,
+	            0x30000001: 0x800000,
+	            0x40000001: 0x808002,
+	            0x50000001: 0x8200,
+	            0x60000001: 0x200,
+	            0x70000001: 0x800202,
+	            0x80000001: 0x808202,
+	            0x90000001: 0x808000,
+	            0xa0000001: 0x800002,
+	            0xb0000001: 0x8202,
+	            0xc0000001: 0x202,
+	            0xd0000001: 0x800200,
+	            0xe0000001: 0x8002,
+	            0xf0000001: 0x0,
+	            0x8000001: 0x808202,
+	            0x18000001: 0x808000,
+	            0x28000001: 0x800000,
+	            0x38000001: 0x200,
+	            0x48000001: 0x8000,
+	            0x58000001: 0x800002,
+	            0x68000001: 0x2,
+	            0x78000001: 0x8202,
+	            0x88000001: 0x8002,
+	            0x98000001: 0x800202,
+	            0xa8000001: 0x202,
+	            0xb8000001: 0x808200,
+	            0xc8000001: 0x800200,
+	            0xd8000001: 0x0,
+	            0xe8000001: 0x8200,
+	            0xf8000001: 0x808002
+	        },
+	        {
+	            0x0: 0x40084010,
+	            0x1000000: 0x4000,
+	            0x2000000: 0x80000,
+	            0x3000000: 0x40080010,
+	            0x4000000: 0x40000010,
+	            0x5000000: 0x40084000,
+	            0x6000000: 0x40004000,
+	            0x7000000: 0x10,
+	            0x8000000: 0x84000,
+	            0x9000000: 0x40004010,
+	            0xa000000: 0x40000000,
+	            0xb000000: 0x84010,
+	            0xc000000: 0x80010,
+	            0xd000000: 0x0,
+	            0xe000000: 0x4010,
+	            0xf000000: 0x40080000,
+	            0x800000: 0x40004000,
+	            0x1800000: 0x84010,
+	            0x2800000: 0x10,
+	            0x3800000: 0x40004010,
+	            0x4800000: 0x40084010,
+	            0x5800000: 0x40000000,
+	            0x6800000: 0x80000,
+	            0x7800000: 0x40080010,
+	            0x8800000: 0x80010,
+	            0x9800000: 0x0,
+	            0xa800000: 0x4000,
+	            0xb800000: 0x40080000,
+	            0xc800000: 0x40000010,
+	            0xd800000: 0x84000,
+	            0xe800000: 0x40084000,
+	            0xf800000: 0x4010,
+	            0x10000000: 0x0,
+	            0x11000000: 0x40080010,
+	            0x12000000: 0x40004010,
+	            0x13000000: 0x40084000,
+	            0x14000000: 0x40080000,
+	            0x15000000: 0x10,
+	            0x16000000: 0x84010,
+	            0x17000000: 0x4000,
+	            0x18000000: 0x4010,
+	            0x19000000: 0x80000,
+	            0x1a000000: 0x80010,
+	            0x1b000000: 0x40000010,
+	            0x1c000000: 0x84000,
+	            0x1d000000: 0x40004000,
+	            0x1e000000: 0x40000000,
+	            0x1f000000: 0x40084010,
+	            0x10800000: 0x84010,
+	            0x11800000: 0x80000,
+	            0x12800000: 0x40080000,
+	            0x13800000: 0x4000,
+	            0x14800000: 0x40004000,
+	            0x15800000: 0x40084010,
+	            0x16800000: 0x10,
+	            0x17800000: 0x40000000,
+	            0x18800000: 0x40084000,
+	            0x19800000: 0x40000010,
+	            0x1a800000: 0x40004010,
+	            0x1b800000: 0x80010,
+	            0x1c800000: 0x0,
+	            0x1d800000: 0x4010,
+	            0x1e800000: 0x40080010,
+	            0x1f800000: 0x84000
+	        },
+	        {
+	            0x0: 0x104,
+	            0x100000: 0x0,
+	            0x200000: 0x4000100,
+	            0x300000: 0x10104,
+	            0x400000: 0x10004,
+	            0x500000: 0x4000004,
+	            0x600000: 0x4010104,
+	            0x700000: 0x4010000,
+	            0x800000: 0x4000000,
+	            0x900000: 0x4010100,
+	            0xa00000: 0x10100,
+	            0xb00000: 0x4010004,
+	            0xc00000: 0x4000104,
+	            0xd00000: 0x10000,
+	            0xe00000: 0x4,
+	            0xf00000: 0x100,
+	            0x80000: 0x4010100,
+	            0x180000: 0x4010004,
+	            0x280000: 0x0,
+	            0x380000: 0x4000100,
+	            0x480000: 0x4000004,
+	            0x580000: 0x10000,
+	            0x680000: 0x10004,
+	            0x780000: 0x104,
+	            0x880000: 0x4,
+	            0x980000: 0x100,
+	            0xa80000: 0x4010000,
+	            0xb80000: 0x10104,
+	            0xc80000: 0x10100,
+	            0xd80000: 0x4000104,
+	            0xe80000: 0x4010104,
+	            0xf80000: 0x4000000,
+	            0x1000000: 0x4010100,
+	            0x1100000: 0x10004,
+	            0x1200000: 0x10000,
+	            0x1300000: 0x4000100,
+	            0x1400000: 0x100,
+	            0x1500000: 0x4010104,
+	            0x1600000: 0x4000004,
+	            0x1700000: 0x0,
+	            0x1800000: 0x4000104,
+	            0x1900000: 0x4000000,
+	            0x1a00000: 0x4,
+	            0x1b00000: 0x10100,
+	            0x1c00000: 0x4010000,
+	            0x1d00000: 0x104,
+	            0x1e00000: 0x10104,
+	            0x1f00000: 0x4010004,
+	            0x1080000: 0x4000000,
+	            0x1180000: 0x104,
+	            0x1280000: 0x4010100,
+	            0x1380000: 0x0,
+	            0x1480000: 0x10004,
+	            0x1580000: 0x4000100,
+	            0x1680000: 0x100,
+	            0x1780000: 0x4010004,
+	            0x1880000: 0x10000,
+	            0x1980000: 0x4010104,
+	            0x1a80000: 0x10104,
+	            0x1b80000: 0x4000004,
+	            0x1c80000: 0x4000104,
+	            0x1d80000: 0x4010000,
+	            0x1e80000: 0x4,
+	            0x1f80000: 0x10100
+	        },
+	        {
+	            0x0: 0x80401000,
+	            0x10000: 0x80001040,
+	            0x20000: 0x401040,
+	            0x30000: 0x80400000,
+	            0x40000: 0x0,
+	            0x50000: 0x401000,
+	            0x60000: 0x80000040,
+	            0x70000: 0x400040,
+	            0x80000: 0x80000000,
+	            0x90000: 0x400000,
+	            0xa0000: 0x40,
+	            0xb0000: 0x80001000,
+	            0xc0000: 0x80400040,
+	            0xd0000: 0x1040,
+	            0xe0000: 0x1000,
+	            0xf0000: 0x80401040,
+	            0x8000: 0x80001040,
+	            0x18000: 0x40,
+	            0x28000: 0x80400040,
+	            0x38000: 0x80001000,
+	            0x48000: 0x401000,
+	            0x58000: 0x80401040,
+	            0x68000: 0x0,
+	            0x78000: 0x80400000,
+	            0x88000: 0x1000,
+	            0x98000: 0x80401000,
+	            0xa8000: 0x400000,
+	            0xb8000: 0x1040,
+	            0xc8000: 0x80000000,
+	            0xd8000: 0x400040,
+	            0xe8000: 0x401040,
+	            0xf8000: 0x80000040,
+	            0x100000: 0x400040,
+	            0x110000: 0x401000,
+	            0x120000: 0x80000040,
+	            0x130000: 0x0,
+	            0x140000: 0x1040,
+	            0x150000: 0x80400040,
+	            0x160000: 0x80401000,
+	            0x170000: 0x80001040,
+	            0x180000: 0x80401040,
+	            0x190000: 0x80000000,
+	            0x1a0000: 0x80400000,
+	            0x1b0000: 0x401040,
+	            0x1c0000: 0x80001000,
+	            0x1d0000: 0x400000,
+	            0x1e0000: 0x40,
+	            0x1f0000: 0x1000,
+	            0x108000: 0x80400000,
+	            0x118000: 0x80401040,
+	            0x128000: 0x0,
+	            0x138000: 0x401000,
+	            0x148000: 0x400040,
+	            0x158000: 0x80000000,
+	            0x168000: 0x80001040,
+	            0x178000: 0x40,
+	            0x188000: 0x80000040,
+	            0x198000: 0x1000,
+	            0x1a8000: 0x80001000,
+	            0x1b8000: 0x80400040,
+	            0x1c8000: 0x1040,
+	            0x1d8000: 0x80401000,
+	            0x1e8000: 0x400000,
+	            0x1f8000: 0x401040
+	        },
+	        {
+	            0x0: 0x80,
+	            0x1000: 0x1040000,
+	            0x2000: 0x40000,
+	            0x3000: 0x20000000,
+	            0x4000: 0x20040080,
+	            0x5000: 0x1000080,
+	            0x6000: 0x21000080,
+	            0x7000: 0x40080,
+	            0x8000: 0x1000000,
+	            0x9000: 0x20040000,
+	            0xa000: 0x20000080,
+	            0xb000: 0x21040080,
+	            0xc000: 0x21040000,
+	            0xd000: 0x0,
+	            0xe000: 0x1040080,
+	            0xf000: 0x21000000,
+	            0x800: 0x1040080,
+	            0x1800: 0x21000080,
+	            0x2800: 0x80,
+	            0x3800: 0x1040000,
+	            0x4800: 0x40000,
+	            0x5800: 0x20040080,
+	            0x6800: 0x21040000,
+	            0x7800: 0x20000000,
+	            0x8800: 0x20040000,
+	            0x9800: 0x0,
+	            0xa800: 0x21040080,
+	            0xb800: 0x1000080,
+	            0xc800: 0x20000080,
+	            0xd800: 0x21000000,
+	            0xe800: 0x1000000,
+	            0xf800: 0x40080,
+	            0x10000: 0x40000,
+	            0x11000: 0x80,
+	            0x12000: 0x20000000,
+	            0x13000: 0x21000080,
+	            0x14000: 0x1000080,
+	            0x15000: 0x21040000,
+	            0x16000: 0x20040080,
+	            0x17000: 0x1000000,
+	            0x18000: 0x21040080,
+	            0x19000: 0x21000000,
+	            0x1a000: 0x1040000,
+	            0x1b000: 0x20040000,
+	            0x1c000: 0x40080,
+	            0x1d000: 0x20000080,
+	            0x1e000: 0x0,
+	            0x1f000: 0x1040080,
+	            0x10800: 0x21000080,
+	            0x11800: 0x1000000,
+	            0x12800: 0x1040000,
+	            0x13800: 0x20040080,
+	            0x14800: 0x20000000,
+	            0x15800: 0x1040080,
+	            0x16800: 0x80,
+	            0x17800: 0x21040000,
+	            0x18800: 0x40080,
+	            0x19800: 0x21040080,
+	            0x1a800: 0x0,
+	            0x1b800: 0x21000000,
+	            0x1c800: 0x1000080,
+	            0x1d800: 0x40000,
+	            0x1e800: 0x20040000,
+	            0x1f800: 0x20000080
+	        },
+	        {
+	            0x0: 0x10000008,
+	            0x100: 0x2000,
+	            0x200: 0x10200000,
+	            0x300: 0x10202008,
+	            0x400: 0x10002000,
+	            0x500: 0x200000,
+	            0x600: 0x200008,
+	            0x700: 0x10000000,
+	            0x800: 0x0,
+	            0x900: 0x10002008,
+	            0xa00: 0x202000,
+	            0xb00: 0x8,
+	            0xc00: 0x10200008,
+	            0xd00: 0x202008,
+	            0xe00: 0x2008,
+	            0xf00: 0x10202000,
+	            0x80: 0x10200000,
+	            0x180: 0x10202008,
+	            0x280: 0x8,
+	            0x380: 0x200000,
+	            0x480: 0x202008,
+	            0x580: 0x10000008,
+	            0x680: 0x10002000,
+	            0x780: 0x2008,
+	            0x880: 0x200008,
+	            0x980: 0x2000,
+	            0xa80: 0x10002008,
+	            0xb80: 0x10200008,
+	            0xc80: 0x0,
+	            0xd80: 0x10202000,
+	            0xe80: 0x202000,
+	            0xf80: 0x10000000,
+	            0x1000: 0x10002000,
+	            0x1100: 0x10200008,
+	            0x1200: 0x10202008,
+	            0x1300: 0x2008,
+	            0x1400: 0x200000,
+	            0x1500: 0x10000000,
+	            0x1600: 0x10000008,
+	            0x1700: 0x202000,
+	            0x1800: 0x202008,
+	            0x1900: 0x0,
+	            0x1a00: 0x8,
+	            0x1b00: 0x10200000,
+	            0x1c00: 0x2000,
+	            0x1d00: 0x10002008,
+	            0x1e00: 0x10202000,
+	            0x1f00: 0x200008,
+	            0x1080: 0x8,
+	            0x1180: 0x202000,
+	            0x1280: 0x200000,
+	            0x1380: 0x10000008,
+	            0x1480: 0x10002000,
+	            0x1580: 0x2008,
+	            0x1680: 0x10202008,
+	            0x1780: 0x10200000,
+	            0x1880: 0x10202000,
+	            0x1980: 0x10200008,
+	            0x1a80: 0x2000,
+	            0x1b80: 0x202008,
+	            0x1c80: 0x200008,
+	            0x1d80: 0x0,
+	            0x1e80: 0x10000000,
+	            0x1f80: 0x10002008
+	        },
+	        {
+	            0x0: 0x100000,
+	            0x10: 0x2000401,
+	            0x20: 0x400,
+	            0x30: 0x100401,
+	            0x40: 0x2100401,
+	            0x50: 0x0,
+	            0x60: 0x1,
+	            0x70: 0x2100001,
+	            0x80: 0x2000400,
+	            0x90: 0x100001,
+	            0xa0: 0x2000001,
+	            0xb0: 0x2100400,
+	            0xc0: 0x2100000,
+	            0xd0: 0x401,
+	            0xe0: 0x100400,
+	            0xf0: 0x2000000,
+	            0x8: 0x2100001,
+	            0x18: 0x0,
+	            0x28: 0x2000401,
+	            0x38: 0x2100400,
+	            0x48: 0x100000,
+	            0x58: 0x2000001,
+	            0x68: 0x2000000,
+	            0x78: 0x401,
+	            0x88: 0x100401,
+	            0x98: 0x2000400,
+	            0xa8: 0x2100000,
+	            0xb8: 0x100001,
+	            0xc8: 0x400,
+	            0xd8: 0x2100401,
+	            0xe8: 0x1,
+	            0xf8: 0x100400,
+	            0x100: 0x2000000,
+	            0x110: 0x100000,
+	            0x120: 0x2000401,
+	            0x130: 0x2100001,
+	            0x140: 0x100001,
+	            0x150: 0x2000400,
+	            0x160: 0x2100400,
+	            0x170: 0x100401,
+	            0x180: 0x401,
+	            0x190: 0x2100401,
+	            0x1a0: 0x100400,
+	            0x1b0: 0x1,
+	            0x1c0: 0x0,
+	            0x1d0: 0x2100000,
+	            0x1e0: 0x2000001,
+	            0x1f0: 0x400,
+	            0x108: 0x100400,
+	            0x118: 0x2000401,
+	            0x128: 0x2100001,
+	            0x138: 0x1,
+	            0x148: 0x2000000,
+	            0x158: 0x100000,
+	            0x168: 0x401,
+	            0x178: 0x2100400,
+	            0x188: 0x2000001,
+	            0x198: 0x2100000,
+	            0x1a8: 0x0,
+	            0x1b8: 0x2100401,
+	            0x1c8: 0x100401,
+	            0x1d8: 0x400,
+	            0x1e8: 0x2000400,
+	            0x1f8: 0x100001
+	        },
+	        {
+	            0x0: 0x8000820,
+	            0x1: 0x20000,
+	            0x2: 0x8000000,
+	            0x3: 0x20,
+	            0x4: 0x20020,
+	            0x5: 0x8020820,
+	            0x6: 0x8020800,
+	            0x7: 0x800,
+	            0x8: 0x8020000,
+	            0x9: 0x8000800,
+	            0xa: 0x20800,
+	            0xb: 0x8020020,
+	            0xc: 0x820,
+	            0xd: 0x0,
+	            0xe: 0x8000020,
+	            0xf: 0x20820,
+	            0x80000000: 0x800,
+	            0x80000001: 0x8020820,
+	            0x80000002: 0x8000820,
+	            0x80000003: 0x8000000,
+	            0x80000004: 0x8020000,
+	            0x80000005: 0x20800,
+	            0x80000006: 0x20820,
+	            0x80000007: 0x20,
+	            0x80000008: 0x8000020,
+	            0x80000009: 0x820,
+	            0x8000000a: 0x20020,
+	            0x8000000b: 0x8020800,
+	            0x8000000c: 0x0,
+	            0x8000000d: 0x8020020,
+	            0x8000000e: 0x8000800,
+	            0x8000000f: 0x20000,
+	            0x10: 0x20820,
+	            0x11: 0x8020800,
+	            0x12: 0x20,
+	            0x13: 0x800,
+	            0x14: 0x8000800,
+	            0x15: 0x8000020,
+	            0x16: 0x8020020,
+	            0x17: 0x20000,
+	            0x18: 0x0,
+	            0x19: 0x20020,
+	            0x1a: 0x8020000,
+	            0x1b: 0x8000820,
+	            0x1c: 0x8020820,
+	            0x1d: 0x20800,
+	            0x1e: 0x820,
+	            0x1f: 0x8000000,
+	            0x80000010: 0x20000,
+	            0x80000011: 0x800,
+	            0x80000012: 0x8020020,
+	            0x80000013: 0x20820,
+	            0x80000014: 0x20,
+	            0x80000015: 0x8020000,
+	            0x80000016: 0x8000000,
+	            0x80000017: 0x8000820,
+	            0x80000018: 0x8020820,
+	            0x80000019: 0x8000020,
+	            0x8000001a: 0x8000800,
+	            0x8000001b: 0x0,
+	            0x8000001c: 0x20800,
+	            0x8000001d: 0x820,
+	            0x8000001e: 0x20020,
+	            0x8000001f: 0x8020800
+	        }
+	    ];
+
+	    // Masks that select the SBOX input
+	    var SBOX_MASK = [
+	        0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
+	        0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
+	    ];
+
+	    /**
+	     * DES block cipher algorithm.
+	     */
+	    var DES = C_algo.DES = BlockCipher.extend({
+	        _doReset: function () {
+	            // Shortcuts
+	            var key = this._key;
+	            var keyWords = key.words;
+
+	            // Select 56 bits according to PC1
+	            var keyBits = [];
+	            for (var i = 0; i < 56; i++) {
+	                var keyBitPos = PC1[i] - 1;
+	                keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
+	            }
+
+	            // Assemble 16 subkeys
+	            var subKeys = this._subKeys = [];
+	            for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
+	                // Create subkey
+	                var subKey = subKeys[nSubKey] = [];
+
+	                // Shortcut
+	                var bitShift = BIT_SHIFTS[nSubKey];
+
+	                // Select 48 bits according to PC2
+	                for (var i = 0; i < 24; i++) {
+	                    // Select from the left 28 key bits
+	                    subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
+
+	                    // Select from the right 28 key bits
+	                    subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
+	                }
+
+	                // Since each subkey is applied to an expanded 32-bit input,
+	                // the subkey can be broken into 8 values scaled to 32-bits,
+	                // which allows the key to be used without expansion
+	                subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
+	                for (var i = 1; i < 7; i++) {
+	                    subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
+	                }
+	                subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
+	            }
+
+	            // Compute inverse subkeys
+	            var invSubKeys = this._invSubKeys = [];
+	            for (var i = 0; i < 16; i++) {
+	                invSubKeys[i] = subKeys[15 - i];
+	            }
+	        },
+
+	        encryptBlock: function (M, offset) {
+	            this._doCryptBlock(M, offset, this._subKeys);
+	        },
+
+	        decryptBlock: function (M, offset) {
+	            this._doCryptBlock(M, offset, this._invSubKeys);
+	        },
+
+	        _doCryptBlock: function (M, offset, subKeys) {
+	            // Get input
+	            this._lBlock = M[offset];
+	            this._rBlock = M[offset + 1];
+
+	            // Initial permutation
+	            exchangeLR.call(this, 4,  0x0f0f0f0f);
+	            exchangeLR.call(this, 16, 0x0000ffff);
+	            exchangeRL.call(this, 2,  0x33333333);
+	            exchangeRL.call(this, 8,  0x00ff00ff);
+	            exchangeLR.call(this, 1,  0x55555555);
+
+	            // Rounds
+	            for (var round = 0; round < 16; round++) {
+	                // Shortcuts
+	                var subKey = subKeys[round];
+	                var lBlock = this._lBlock;
+	                var rBlock = this._rBlock;
+
+	                // Feistel function
+	                var f = 0;
+	                for (var i = 0; i < 8; i++) {
+	                    f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
+	                }
+	                this._lBlock = rBlock;
+	                this._rBlock = lBlock ^ f;
+	            }
+
+	            // Undo swap from last round
+	            var t = this._lBlock;
+	            this._lBlock = this._rBlock;
+	            this._rBlock = t;
+
+	            // Final permutation
+	            exchangeLR.call(this, 1,  0x55555555);
+	            exchangeRL.call(this, 8,  0x00ff00ff);
+	            exchangeRL.call(this, 2,  0x33333333);
+	            exchangeLR.call(this, 16, 0x0000ffff);
+	            exchangeLR.call(this, 4,  0x0f0f0f0f);
+
+	            // Set output
+	            M[offset] = this._lBlock;
+	            M[offset + 1] = this._rBlock;
+	        },
+
+	        keySize: 64/32,
+
+	        ivSize: 64/32,
+
+	        blockSize: 64/32
+	    });
+
+	    // Swap bits across the left and right words
+	    function exchangeLR(offset, mask) {
+	        var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
+	        this._rBlock ^= t;
+	        this._lBlock ^= t << offset;
+	    }
+
+	    function exchangeRL(offset, mask) {
+	        var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
+	        this._lBlock ^= t;
+	        this._rBlock ^= t << offset;
+	    }
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);
+	     */
+	    C.DES = BlockCipher._createHelper(DES);
+
+	    /**
+	     * Triple-DES block cipher algorithm.
+	     */
+	    var TripleDES = C_algo.TripleDES = BlockCipher.extend({
+	        _doReset: function () {
+	            // Shortcuts
+	            var key = this._key;
+	            var keyWords = key.words;
+	            // Make sure the key length is valid (64, 128 or >= 192 bit)
+	            if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {
+	                throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');
+	            }
+
+	            // Extend the key according to the keying options defined in 3DES standard
+	            var key1 = keyWords.slice(0, 2);
+	            var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);
+	            var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);
+
+	            // Create DES instances
+	            this._des1 = DES.createEncryptor(WordArray.create(key1));
+	            this._des2 = DES.createEncryptor(WordArray.create(key2));
+	            this._des3 = DES.createEncryptor(WordArray.create(key3));
+	        },
+
+	        encryptBlock: function (M, offset) {
+	            this._des1.encryptBlock(M, offset);
+	            this._des2.decryptBlock(M, offset);
+	            this._des3.encryptBlock(M, offset);
+	        },
+
+	        decryptBlock: function (M, offset) {
+	            this._des3.decryptBlock(M, offset);
+	            this._des2.encryptBlock(M, offset);
+	            this._des1.decryptBlock(M, offset);
+	        },
+
+	        keySize: 192/32,
+
+	        ivSize: 64/32,
+
+	        blockSize: 64/32
+	    });
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
+	     */
+	    C.TripleDES = BlockCipher._createHelper(TripleDES);
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var StreamCipher = C_lib.StreamCipher;
+	    var C_algo = C.algo;
+
+	    /**
+	     * RC4 stream cipher algorithm.
+	     */
+	    var RC4 = C_algo.RC4 = StreamCipher.extend({
+	        _doReset: function () {
+	            // Shortcuts
+	            var key = this._key;
+	            var keyWords = key.words;
+	            var keySigBytes = key.sigBytes;
+
+	            // Init sbox
+	            var S = this._S = [];
+	            for (var i = 0; i < 256; i++) {
+	                S[i] = i;
+	            }
+
+	            // Key setup
+	            for (var i = 0, j = 0; i < 256; i++) {
+	                var keyByteIndex = i % keySigBytes;
+	                var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
+
+	                j = (j + S[i] + keyByte) % 256;
+
+	                // Swap
+	                var t = S[i];
+	                S[i] = S[j];
+	                S[j] = t;
+	            }
+
+	            // Counters
+	            this._i = this._j = 0;
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            M[offset] ^= generateKeystreamWord.call(this);
+	        },
+
+	        keySize: 256/32,
+
+	        ivSize: 0
+	    });
+
+	    function generateKeystreamWord() {
+	        // Shortcuts
+	        var S = this._S;
+	        var i = this._i;
+	        var j = this._j;
+
+	        // Generate keystream word
+	        var keystreamWord = 0;
+	        for (var n = 0; n < 4; n++) {
+	            i = (i + 1) % 256;
+	            j = (j + S[i]) % 256;
+
+	            // Swap
+	            var t = S[i];
+	            S[i] = S[j];
+	            S[j] = t;
+
+	            keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
+	        }
+
+	        // Update counters
+	        this._i = i;
+	        this._j = j;
+
+	        return keystreamWord;
+	    }
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
+	     */
+	    C.RC4 = StreamCipher._createHelper(RC4);
+
+	    /**
+	     * Modified RC4 stream cipher algorithm.
+	     */
+	    var RC4Drop = C_algo.RC4Drop = RC4.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {number} drop The number of keystream words to drop. Default 192
+	         */
+	        cfg: RC4.cfg.extend({
+	            drop: 192
+	        }),
+
+	        _doReset: function () {
+	            RC4._doReset.call(this);
+
+	            // Drop
+	            for (var i = this.cfg.drop; i > 0; i--) {
+	                generateKeystreamWord.call(this);
+	            }
+	        }
+	    });
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
+	     */
+	    C.RC4Drop = StreamCipher._createHelper(RC4Drop);
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var StreamCipher = C_lib.StreamCipher;
+	    var C_algo = C.algo;
+
+	    // Reusable objects
+	    var S  = [];
+	    var C_ = [];
+	    var G  = [];
+
+	    /**
+	     * Rabbit stream cipher algorithm
+	     */
+	    var Rabbit = C_algo.Rabbit = StreamCipher.extend({
+	        _doReset: function () {
+	            // Shortcuts
+	            var K = this._key.words;
+	            var iv = this.cfg.iv;
+
+	            // Swap endian
+	            for (var i = 0; i < 4; i++) {
+	                K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |
+	                       (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);
+	            }
+
+	            // Generate initial state values
+	            var X = this._X = [
+	                K[0], (K[3] << 16) | (K[2] >>> 16),
+	                K[1], (K[0] << 16) | (K[3] >>> 16),
+	                K[2], (K[1] << 16) | (K[0] >>> 16),
+	                K[3], (K[2] << 16) | (K[1] >>> 16)
+	            ];
+
+	            // Generate initial counter values
+	            var C = this._C = [
+	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+	            ];
+
+	            // Carry bit
+	            this._b = 0;
+
+	            // Iterate the system four times
+	            for (var i = 0; i < 4; i++) {
+	                nextState.call(this);
+	            }
+
+	            // Modify the counters
+	            for (var i = 0; i < 8; i++) {
+	                C[i] ^= X[(i + 4) & 7];
+	            }
+
+	            // IV setup
+	            if (iv) {
+	                // Shortcuts
+	                var IV = iv.words;
+	                var IV_0 = IV[0];
+	                var IV_1 = IV[1];
+
+	                // Generate four subvectors
+	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
+
+	                // Modify counter values
+	                C[0] ^= i0;
+	                C[1] ^= i1;
+	                C[2] ^= i2;
+	                C[3] ^= i3;
+	                C[4] ^= i0;
+	                C[5] ^= i1;
+	                C[6] ^= i2;
+	                C[7] ^= i3;
+
+	                // Iterate the system four times
+	                for (var i = 0; i < 4; i++) {
+	                    nextState.call(this);
+	                }
+	            }
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcut
+	            var X = this._X;
+
+	            // Iterate the system
+	            nextState.call(this);
+
+	            // Generate four keystream words
+	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+	            for (var i = 0; i < 4; i++) {
+	                // Swap endian
+	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
+	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
+
+	                // Encrypt
+	                M[offset + i] ^= S[i];
+	            }
+	        },
+
+	        blockSize: 128/32,
+
+	        ivSize: 64/32
+	    });
+
+	    function nextState() {
+	        // Shortcuts
+	        var X = this._X;
+	        var C = this._C;
+
+	        // Save old counter values
+	        for (var i = 0; i < 8; i++) {
+	            C_[i] = C[i];
+	        }
+
+	        // Calculate new counter values
+	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+	        // Calculate the g-values
+	        for (var i = 0; i < 8; i++) {
+	            var gx = X[i] + C[i];
+
+	            // Construct high and low argument for squaring
+	            var ga = gx & 0xffff;
+	            var gb = gx >>> 16;
+
+	            // Calculate high and low result of squaring
+	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+	            // High XOR low
+	            G[i] = gh ^ gl;
+	        }
+
+	        // Calculate new state values
+	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
+	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
+	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
+	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
+	    }
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
+	     */
+	    C.Rabbit = StreamCipher._createHelper(Rabbit);
+	}());
+
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var StreamCipher = C_lib.StreamCipher;
+	    var C_algo = C.algo;
+
+	    // Reusable objects
+	    var S  = [];
+	    var C_ = [];
+	    var G  = [];
+
+	    /**
+	     * Rabbit stream cipher algorithm.
+	     *
+	     * This is a legacy version that neglected to convert the key to little-endian.
+	     * This error doesn't affect the cipher's security,
+	     * but it does affect its compatibility with other implementations.
+	     */
+	    var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
+	        _doReset: function () {
+	            // Shortcuts
+	            var K = this._key.words;
+	            var iv = this.cfg.iv;
+
+	            // Generate initial state values
+	            var X = this._X = [
+	                K[0], (K[3] << 16) | (K[2] >>> 16),
+	                K[1], (K[0] << 16) | (K[3] >>> 16),
+	                K[2], (K[1] << 16) | (K[0] >>> 16),
+	                K[3], (K[2] << 16) | (K[1] >>> 16)
+	            ];
+
+	            // Generate initial counter values
+	            var C = this._C = [
+	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+	            ];
+
+	            // Carry bit
+	            this._b = 0;
+
+	            // Iterate the system four times
+	            for (var i = 0; i < 4; i++) {
+	                nextState.call(this);
+	            }
+
+	            // Modify the counters
+	            for (var i = 0; i < 8; i++) {
+	                C[i] ^= X[(i + 4) & 7];
+	            }
+
+	            // IV setup
+	            if (iv) {
+	                // Shortcuts
+	                var IV = iv.words;
+	                var IV_0 = IV[0];
+	                var IV_1 = IV[1];
+
+	                // Generate four subvectors
+	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
+
+	                // Modify counter values
+	                C[0] ^= i0;
+	                C[1] ^= i1;
+	                C[2] ^= i2;
+	                C[3] ^= i3;
+	                C[4] ^= i0;
+	                C[5] ^= i1;
+	                C[6] ^= i2;
+	                C[7] ^= i3;
+
+	                // Iterate the system four times
+	                for (var i = 0; i < 4; i++) {
+	                    nextState.call(this);
+	                }
+	            }
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcut
+	            var X = this._X;
+
+	            // Iterate the system
+	            nextState.call(this);
+
+	            // Generate four keystream words
+	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+	            for (var i = 0; i < 4; i++) {
+	                // Swap endian
+	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
+	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
+
+	                // Encrypt
+	                M[offset + i] ^= S[i];
+	            }
+	        },
+
+	        blockSize: 128/32,
+
+	        ivSize: 64/32
+	    });
+
+	    function nextState() {
+	        // Shortcuts
+	        var X = this._X;
+	        var C = this._C;
+
+	        // Save old counter values
+	        for (var i = 0; i < 8; i++) {
+	            C_[i] = C[i];
+	        }
+
+	        // Calculate new counter values
+	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+	        // Calculate the g-values
+	        for (var i = 0; i < 8; i++) {
+	            var gx = X[i] + C[i];
+
+	            // Construct high and low argument for squaring
+	            var ga = gx & 0xffff;
+	            var gb = gx >>> 16;
+
+	            // Calculate high and low result of squaring
+	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+	            // High XOR low
+	            G[i] = gh ^ gl;
+	        }
+
+	        // Calculate new state values
+	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
+	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
+	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
+	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
+	    }
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
+	     */
+	    C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
+	}());
+
+
+	return CryptoJS;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/enc-base64.js b/management/guns-admin/src/main/webapp/static/crypto-js/enc-base64.js
new file mode 100644
index 0000000..0ffcd53
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/enc-base64.js
@@ -0,0 +1,136 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var C_enc = C.enc;
+
+	    /**
+	     * Base64 encoding strategy.
+	     */
+	    var Base64 = C_enc.Base64 = {
+	        /**
+	         * Converts a word array to a Base64 string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The Base64 string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+	            var map = this._map;
+
+	            // Clamp excess bits
+	            wordArray.clamp();
+
+	            // Convert
+	            var base64Chars = [];
+	            for (var i = 0; i < sigBytes; i += 3) {
+	                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;
+	                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
+	                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
+
+	                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
+
+	                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
+	                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
+	                }
+	            }
+
+	            // Add padding
+	            var paddingChar = map.charAt(64);
+	            if (paddingChar) {
+	                while (base64Chars.length % 4) {
+	                    base64Chars.push(paddingChar);
+	                }
+	            }
+
+	            return base64Chars.join('');
+	        },
+
+	        /**
+	         * Converts a Base64 string to a word array.
+	         *
+	         * @param {string} base64Str The Base64 string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Base64.parse(base64String);
+	         */
+	        parse: function (base64Str) {
+	            // Shortcuts
+	            var base64StrLength = base64Str.length;
+	            var map = this._map;
+	            var reverseMap = this._reverseMap;
+
+	            if (!reverseMap) {
+	                    reverseMap = this._reverseMap = [];
+	                    for (var j = 0; j < map.length; j++) {
+	                        reverseMap[map.charCodeAt(j)] = j;
+	                    }
+	            }
+
+	            // Ignore padding
+	            var paddingChar = map.charAt(64);
+	            if (paddingChar) {
+	                var paddingIndex = base64Str.indexOf(paddingChar);
+	                if (paddingIndex !== -1) {
+	                    base64StrLength = paddingIndex;
+	                }
+	            }
+
+	            // Convert
+	            return parseLoop(base64Str, base64StrLength, reverseMap);
+
+	        },
+
+	        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
+	    };
+
+	    function parseLoop(base64Str, base64StrLength, reverseMap) {
+	      var words = [];
+	      var nBytes = 0;
+	      for (var i = 0; i < base64StrLength; i++) {
+	          if (i % 4) {
+	              var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
+	              var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
+	              var bitsCombined = bits1 | bits2;
+	              words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
+	              nBytes++;
+	          }
+	      }
+	      return WordArray.create(words, nBytes);
+	    }
+	}());
+
+
+	return CryptoJS.enc.Base64;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/enc-base64url.js b/management/guns-admin/src/main/webapp/static/crypto-js/enc-base64url.js
new file mode 100644
index 0000000..2468912
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/enc-base64url.js
@@ -0,0 +1,140 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var C_enc = C.enc;
+
+	    /**
+	     * Base64url encoding strategy.
+	     */
+	    var Base64url = C_enc.Base64url = {
+	        /**
+	         * Converts a word array to a Base64url string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @param {boolean} urlSafe Whether to use url safe
+	         *
+	         * @return {string} The Base64url string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var base64String = CryptoJS.enc.Base64url.stringify(wordArray);
+	         */
+	        stringify: function (wordArray, urlSafe=true) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+	            var map = urlSafe ? this._safe_map : this._map;
+
+	            // Clamp excess bits
+	            wordArray.clamp();
+
+	            // Convert
+	            var base64Chars = [];
+	            for (var i = 0; i < sigBytes; i += 3) {
+	                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;
+	                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
+	                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
+
+	                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
+
+	                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
+	                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
+	                }
+	            }
+
+	            // Add padding
+	            var paddingChar = map.charAt(64);
+	            if (paddingChar) {
+	                while (base64Chars.length % 4) {
+	                    base64Chars.push(paddingChar);
+	                }
+	            }
+
+	            return base64Chars.join('');
+	        },
+
+	        /**
+	         * Converts a Base64url string to a word array.
+	         *
+	         * @param {string} base64Str The Base64url string.
+	         *
+	         * @param {boolean} urlSafe Whether to use url safe
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Base64url.parse(base64String);
+	         */
+	        parse: function (base64Str, urlSafe=true) {
+	            // Shortcuts
+	            var base64StrLength = base64Str.length;
+	            var map = urlSafe ? this._safe_map : this._map;
+	            var reverseMap = this._reverseMap;
+
+	            if (!reverseMap) {
+	                reverseMap = this._reverseMap = [];
+	                for (var j = 0; j < map.length; j++) {
+	                    reverseMap[map.charCodeAt(j)] = j;
+	                }
+	            }
+
+	            // Ignore padding
+	            var paddingChar = map.charAt(64);
+	            if (paddingChar) {
+	                var paddingIndex = base64Str.indexOf(paddingChar);
+	                if (paddingIndex !== -1) {
+	                    base64StrLength = paddingIndex;
+	                }
+	            }
+
+	            // Convert
+	            return parseLoop(base64Str, base64StrLength, reverseMap);
+
+	        },
+
+	        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
+	        _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
+	    };
+
+	    function parseLoop(base64Str, base64StrLength, reverseMap) {
+	        var words = [];
+	        var nBytes = 0;
+	        for (var i = 0; i < base64StrLength; i++) {
+	            if (i % 4) {
+	                var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
+	                var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
+	                var bitsCombined = bits1 | bits2;
+	                words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
+	                nBytes++;
+	            }
+	        }
+	        return WordArray.create(words, nBytes);
+	    }
+	}());
+
+	return CryptoJS.enc.Base64url;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/enc-hex.js b/management/guns-admin/src/main/webapp/static/crypto-js/enc-hex.js
new file mode 100644
index 0000000..88161ff
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/enc-hex.js
@@ -0,0 +1,18 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.enc.Hex;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/enc-latin1.js b/management/guns-admin/src/main/webapp/static/crypto-js/enc-latin1.js
new file mode 100644
index 0000000..ade56dc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/enc-latin1.js
@@ -0,0 +1,18 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.enc.Latin1;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/enc-utf16.js b/management/guns-admin/src/main/webapp/static/crypto-js/enc-utf16.js
new file mode 100644
index 0000000..7de6245
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/enc-utf16.js
@@ -0,0 +1,149 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var C_enc = C.enc;
+
+	    /**
+	     * UTF-16 BE encoding strategy.
+	     */
+	    var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
+	        /**
+	         * Converts a word array to a UTF-16 BE string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The UTF-16 BE string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+
+	            // Convert
+	            var utf16Chars = [];
+	            for (var i = 0; i < sigBytes; i += 2) {
+	                var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
+	                utf16Chars.push(String.fromCharCode(codePoint));
+	            }
+
+	            return utf16Chars.join('');
+	        },
+
+	        /**
+	         * Converts a UTF-16 BE string to a word array.
+	         *
+	         * @param {string} utf16Str The UTF-16 BE string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
+	         */
+	        parse: function (utf16Str) {
+	            // Shortcut
+	            var utf16StrLength = utf16Str.length;
+
+	            // Convert
+	            var words = [];
+	            for (var i = 0; i < utf16StrLength; i++) {
+	                words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
+	            }
+
+	            return WordArray.create(words, utf16StrLength * 2);
+	        }
+	    };
+
+	    /**
+	     * UTF-16 LE encoding strategy.
+	     */
+	    C_enc.Utf16LE = {
+	        /**
+	         * Converts a word array to a UTF-16 LE string.
+	         *
+	         * @param {WordArray} wordArray The word array.
+	         *
+	         * @return {string} The UTF-16 LE string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
+	         */
+	        stringify: function (wordArray) {
+	            // Shortcuts
+	            var words = wordArray.words;
+	            var sigBytes = wordArray.sigBytes;
+
+	            // Convert
+	            var utf16Chars = [];
+	            for (var i = 0; i < sigBytes; i += 2) {
+	                var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
+	                utf16Chars.push(String.fromCharCode(codePoint));
+	            }
+
+	            return utf16Chars.join('');
+	        },
+
+	        /**
+	         * Converts a UTF-16 LE string to a word array.
+	         *
+	         * @param {string} utf16Str The UTF-16 LE string.
+	         *
+	         * @return {WordArray} The word array.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
+	         */
+	        parse: function (utf16Str) {
+	            // Shortcut
+	            var utf16StrLength = utf16Str.length;
+
+	            // Convert
+	            var words = [];
+	            for (var i = 0; i < utf16StrLength; i++) {
+	                words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
+	            }
+
+	            return WordArray.create(words, utf16StrLength * 2);
+	        }
+	    };
+
+	    function swapEndian(word) {
+	        return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
+	    }
+	}());
+
+
+	return CryptoJS.enc.Utf16;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/enc-utf8.js b/management/guns-admin/src/main/webapp/static/crypto-js/enc-utf8.js
new file mode 100644
index 0000000..e7a251d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/enc-utf8.js
@@ -0,0 +1,18 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.enc.Utf8;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/evpkdf.js b/management/guns-admin/src/main/webapp/static/crypto-js/evpkdf.js
new file mode 100644
index 0000000..578974a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/evpkdf.js
@@ -0,0 +1,134 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./sha1", "./hmac"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Base = C_lib.Base;
+	    var WordArray = C_lib.WordArray;
+	    var C_algo = C.algo;
+	    var MD5 = C_algo.MD5;
+
+	    /**
+	     * This key derivation function is meant to conform with EVP_BytesToKey.
+	     * www.openssl.org/docs/crypto/EVP_BytesToKey.html
+	     */
+	    var EvpKDF = C_algo.EvpKDF = Base.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+	         * @property {Hasher} hasher The hash algorithm to use. Default: MD5
+	         * @property {number} iterations The number of iterations to perform. Default: 1
+	         */
+	        cfg: Base.extend({
+	            keySize: 128/32,
+	            hasher: MD5,
+	            iterations: 1
+	        }),
+
+	        /**
+	         * Initializes a newly created key derivation function.
+	         *
+	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+	         *
+	         * @example
+	         *
+	         *     var kdf = CryptoJS.algo.EvpKDF.create();
+	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
+	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
+	         */
+	        init: function (cfg) {
+	            this.cfg = this.cfg.extend(cfg);
+	        },
+
+	        /**
+	         * Derives a key from a password.
+	         *
+	         * @param {WordArray|string} password The password.
+	         * @param {WordArray|string} salt A salt.
+	         *
+	         * @return {WordArray} The derived key.
+	         *
+	         * @example
+	         *
+	         *     var key = kdf.compute(password, salt);
+	         */
+	        compute: function (password, salt) {
+	            var block;
+
+	            // Shortcut
+	            var cfg = this.cfg;
+
+	            // Init hasher
+	            var hasher = cfg.hasher.create();
+
+	            // Initial values
+	            var derivedKey = WordArray.create();
+
+	            // Shortcuts
+	            var derivedKeyWords = derivedKey.words;
+	            var keySize = cfg.keySize;
+	            var iterations = cfg.iterations;
+
+	            // Generate key
+	            while (derivedKeyWords.length < keySize) {
+	                if (block) {
+	                    hasher.update(block);
+	                }
+	                block = hasher.update(password).finalize(salt);
+	                hasher.reset();
+
+	                // Iterations
+	                for (var i = 1; i < iterations; i++) {
+	                    block = hasher.finalize(block);
+	                    hasher.reset();
+	                }
+
+	                derivedKey.concat(block);
+	            }
+	            derivedKey.sigBytes = keySize * 4;
+
+	            return derivedKey;
+	        }
+	    });
+
+	    /**
+	     * Derives a key from a password.
+	     *
+	     * @param {WordArray|string} password The password.
+	     * @param {WordArray|string} salt A salt.
+	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
+	     *
+	     * @return {WordArray} The derived key.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var key = CryptoJS.EvpKDF(password, salt);
+	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
+	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
+	     */
+	    C.EvpKDF = function (password, salt, cfg) {
+	        return EvpKDF.create(cfg).compute(password, salt);
+	    };
+	}());
+
+
+	return CryptoJS.EvpKDF;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/format-hex.js b/management/guns-admin/src/main/webapp/static/crypto-js/format-hex.js
new file mode 100644
index 0000000..2e9a861
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/format-hex.js
@@ -0,0 +1,66 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function (undefined) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var CipherParams = C_lib.CipherParams;
+	    var C_enc = C.enc;
+	    var Hex = C_enc.Hex;
+	    var C_format = C.format;
+
+	    var HexFormatter = C_format.Hex = {
+	        /**
+	         * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
+	         *
+	         * @param {CipherParams} cipherParams The cipher params object.
+	         *
+	         * @return {string} The hexadecimally encoded string.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);
+	         */
+	        stringify: function (cipherParams) {
+	            return cipherParams.ciphertext.toString(Hex);
+	        },
+
+	        /**
+	         * Converts a hexadecimally encoded ciphertext string to a cipher params object.
+	         *
+	         * @param {string} input The hexadecimally encoded string.
+	         *
+	         * @return {CipherParams} The cipher params object.
+	         *
+	         * @static
+	         *
+	         * @example
+	         *
+	         *     var cipherParams = CryptoJS.format.Hex.parse(hexString);
+	         */
+	        parse: function (input) {
+	            var ciphertext = Hex.parse(input);
+	            return CipherParams.create({ ciphertext: ciphertext });
+	        }
+	    };
+	}());
+
+
+	return CryptoJS.format.Hex;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/format-openssl.js b/management/guns-admin/src/main/webapp/static/crypto-js/format-openssl.js
new file mode 100644
index 0000000..3373edc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/format-openssl.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.format.OpenSSL;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/hmac-md5.js b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-md5.js
new file mode 100644
index 0000000..ad7a90a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-md5.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./md5"), require("./hmac"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./md5", "./hmac"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.HmacMD5;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/hmac-ripemd160.js b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-ripemd160.js
new file mode 100644
index 0000000..73d55a7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-ripemd160.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./ripemd160"), require("./hmac"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./ripemd160", "./hmac"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.HmacRIPEMD160;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha1.js b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha1.js
new file mode 100644
index 0000000..0b570cb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha1.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./sha1", "./hmac"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.HmacSHA1;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha224.js b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha224.js
new file mode 100644
index 0000000..3778863
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha224.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./sha256"), require("./sha224"), require("./hmac"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./sha256", "./sha224", "./hmac"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.HmacSHA224;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha256.js b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha256.js
new file mode 100644
index 0000000..33b0c9f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha256.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./sha256"), require("./hmac"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./sha256", "./hmac"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.HmacSHA256;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha3.js b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha3.js
new file mode 100644
index 0000000..1248804
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha3.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha3"), require("./hmac"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./x64-core", "./sha3", "./hmac"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.HmacSHA3;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha384.js b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha384.js
new file mode 100644
index 0000000..0036e2b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha384.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"), require("./sha384"), require("./hmac"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./x64-core", "./sha512", "./sha384", "./hmac"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.HmacSHA384;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha512.js b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha512.js
new file mode 100644
index 0000000..c1005b6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/hmac-sha512.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"), require("./hmac"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./x64-core", "./sha512", "./hmac"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.HmacSHA512;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/hmac.js b/management/guns-admin/src/main/webapp/static/crypto-js/hmac.js
new file mode 100644
index 0000000..8c09851
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/hmac.js
@@ -0,0 +1,143 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Base = C_lib.Base;
+	    var C_enc = C.enc;
+	    var Utf8 = C_enc.Utf8;
+	    var C_algo = C.algo;
+
+	    /**
+	     * HMAC algorithm.
+	     */
+	    var HMAC = C_algo.HMAC = Base.extend({
+	        /**
+	         * Initializes a newly created HMAC.
+	         *
+	         * @param {Hasher} hasher The hash algorithm to use.
+	         * @param {WordArray|string} key The secret key.
+	         *
+	         * @example
+	         *
+	         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
+	         */
+	        init: function (hasher, key) {
+	            // Init hasher
+	            hasher = this._hasher = new hasher.init();
+
+	            // Convert string to WordArray, else assume WordArray already
+	            if (typeof key == 'string') {
+	                key = Utf8.parse(key);
+	            }
+
+	            // Shortcuts
+	            var hasherBlockSize = hasher.blockSize;
+	            var hasherBlockSizeBytes = hasherBlockSize * 4;
+
+	            // Allow arbitrary length keys
+	            if (key.sigBytes > hasherBlockSizeBytes) {
+	                key = hasher.finalize(key);
+	            }
+
+	            // Clamp excess bits
+	            key.clamp();
+
+	            // Clone key for inner and outer pads
+	            var oKey = this._oKey = key.clone();
+	            var iKey = this._iKey = key.clone();
+
+	            // Shortcuts
+	            var oKeyWords = oKey.words;
+	            var iKeyWords = iKey.words;
+
+	            // XOR keys with pad constants
+	            for (var i = 0; i < hasherBlockSize; i++) {
+	                oKeyWords[i] ^= 0x5c5c5c5c;
+	                iKeyWords[i] ^= 0x36363636;
+	            }
+	            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
+
+	            // Set initial values
+	            this.reset();
+	        },
+
+	        /**
+	         * Resets this HMAC to its initial state.
+	         *
+	         * @example
+	         *
+	         *     hmacHasher.reset();
+	         */
+	        reset: function () {
+	            // Shortcut
+	            var hasher = this._hasher;
+
+	            // Reset
+	            hasher.reset();
+	            hasher.update(this._iKey);
+	        },
+
+	        /**
+	         * Updates this HMAC with a message.
+	         *
+	         * @param {WordArray|string} messageUpdate The message to append.
+	         *
+	         * @return {HMAC} This HMAC instance.
+	         *
+	         * @example
+	         *
+	         *     hmacHasher.update('message');
+	         *     hmacHasher.update(wordArray);
+	         */
+	        update: function (messageUpdate) {
+	            this._hasher.update(messageUpdate);
+
+	            // Chainable
+	            return this;
+	        },
+
+	        /**
+	         * Finalizes the HMAC computation.
+	         * Note that the finalize operation is effectively a destructive, read-once operation.
+	         *
+	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
+	         *
+	         * @return {WordArray} The HMAC.
+	         *
+	         * @example
+	         *
+	         *     var hmac = hmacHasher.finalize();
+	         *     var hmac = hmacHasher.finalize('message');
+	         *     var hmac = hmacHasher.finalize(wordArray);
+	         */
+	        finalize: function (messageUpdate) {
+	            // Shortcut
+	            var hasher = this._hasher;
+
+	            // Compute HMAC
+	            var innerHash = hasher.finalize(messageUpdate);
+	            hasher.reset();
+	            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
+
+	            return hmac;
+	        }
+	    });
+	}());
+
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/index.js b/management/guns-admin/src/main/webapp/static/crypto-js/index.js
new file mode 100644
index 0000000..7235391
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/index.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./lib-typedarrays"), require("./enc-utf16"), require("./enc-base64"), require("./enc-base64url"), require("./md5"), require("./sha1"), require("./sha256"), require("./sha224"), require("./sha512"), require("./sha384"), require("./sha3"), require("./ripemd160"), require("./hmac"), require("./pbkdf2"), require("./evpkdf"), require("./cipher-core"), require("./mode-cfb"), require("./mode-ctr"), require("./mode-ctr-gladman"), require("./mode-ofb"), require("./mode-ecb"), require("./pad-ansix923"), require("./pad-iso10126"), require("./pad-iso97971"), require("./pad-zeropadding"), require("./pad-nopadding"), require("./format-hex"), require("./aes"), require("./tripledes"), require("./rc4"), require("./rabbit"), require("./rabbit-legacy"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./x64-core", "./lib-typedarrays", "./enc-utf16", "./enc-base64", "./enc-base64url", "./md5", "./sha1", "./sha256", "./sha224", "./sha512", "./sha384", "./sha3", "./ripemd160", "./hmac", "./pbkdf2", "./evpkdf", "./cipher-core", "./mode-cfb", "./mode-ctr", "./mode-ctr-gladman", "./mode-ofb", "./mode-ecb", "./pad-ansix923", "./pad-iso10126", "./pad-iso97971", "./pad-zeropadding", "./pad-nopadding", "./format-hex", "./aes", "./tripledes", "./rc4", "./rabbit", "./rabbit-legacy"], factory);
+	}
+	else {
+		// Global (browser)
+		root.CryptoJS = factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/lib-typedarrays.js b/management/guns-admin/src/main/webapp/static/crypto-js/lib-typedarrays.js
new file mode 100644
index 0000000..264b210
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/lib-typedarrays.js
@@ -0,0 +1,76 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Check if typed arrays are supported
+	    if (typeof ArrayBuffer != 'function') {
+	        return;
+	    }
+
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+
+	    // Reference original init
+	    var superInit = WordArray.init;
+
+	    // Augment WordArray.init to handle typed arrays
+	    var subInit = WordArray.init = function (typedArray) {
+	        // Convert buffers to uint8
+	        if (typedArray instanceof ArrayBuffer) {
+	            typedArray = new Uint8Array(typedArray);
+	        }
+
+	        // Convert other array views to uint8
+	        if (
+	            typedArray instanceof Int8Array ||
+	            (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) ||
+	            typedArray instanceof Int16Array ||
+	            typedArray instanceof Uint16Array ||
+	            typedArray instanceof Int32Array ||
+	            typedArray instanceof Uint32Array ||
+	            typedArray instanceof Float32Array ||
+	            typedArray instanceof Float64Array
+	        ) {
+	            typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
+	        }
+
+	        // Handle Uint8Array
+	        if (typedArray instanceof Uint8Array) {
+	            // Shortcut
+	            var typedArrayByteLength = typedArray.byteLength;
+
+	            // Extract bytes
+	            var words = [];
+	            for (var i = 0; i < typedArrayByteLength; i++) {
+	                words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
+	            }
+
+	            // Initialize this word array
+	            superInit.call(this, words, typedArrayByteLength);
+	        } else {
+	            // Else call normal init
+	            superInit.apply(this, arguments);
+	        }
+	    };
+
+	    subInit.prototype = WordArray;
+	}());
+
+
+	return CryptoJS.lib.WordArray;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/md5.js b/management/guns-admin/src/main/webapp/static/crypto-js/md5.js
new file mode 100644
index 0000000..12b0fdd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/md5.js
@@ -0,0 +1,268 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function (Math) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var Hasher = C_lib.Hasher;
+	    var C_algo = C.algo;
+
+	    // Constants table
+	    var T = [];
+
+	    // Compute constants
+	    (function () {
+	        for (var i = 0; i < 64; i++) {
+	            T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
+	        }
+	    }());
+
+	    /**
+	     * MD5 hash algorithm.
+	     */
+	    var MD5 = C_algo.MD5 = Hasher.extend({
+	        _doReset: function () {
+	            this._hash = new WordArray.init([
+	                0x67452301, 0xefcdab89,
+	                0x98badcfe, 0x10325476
+	            ]);
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Swap endian
+	            for (var i = 0; i < 16; i++) {
+	                // Shortcuts
+	                var offset_i = offset + i;
+	                var M_offset_i = M[offset_i];
+
+	                M[offset_i] = (
+	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
+	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
+	                );
+	            }
+
+	            // Shortcuts
+	            var H = this._hash.words;
+
+	            var M_offset_0  = M[offset + 0];
+	            var M_offset_1  = M[offset + 1];
+	            var M_offset_2  = M[offset + 2];
+	            var M_offset_3  = M[offset + 3];
+	            var M_offset_4  = M[offset + 4];
+	            var M_offset_5  = M[offset + 5];
+	            var M_offset_6  = M[offset + 6];
+	            var M_offset_7  = M[offset + 7];
+	            var M_offset_8  = M[offset + 8];
+	            var M_offset_9  = M[offset + 9];
+	            var M_offset_10 = M[offset + 10];
+	            var M_offset_11 = M[offset + 11];
+	            var M_offset_12 = M[offset + 12];
+	            var M_offset_13 = M[offset + 13];
+	            var M_offset_14 = M[offset + 14];
+	            var M_offset_15 = M[offset + 15];
+
+	            // Working varialbes
+	            var a = H[0];
+	            var b = H[1];
+	            var c = H[2];
+	            var d = H[3];
+
+	            // Computation
+	            a = FF(a, b, c, d, M_offset_0,  7,  T[0]);
+	            d = FF(d, a, b, c, M_offset_1,  12, T[1]);
+	            c = FF(c, d, a, b, M_offset_2,  17, T[2]);
+	            b = FF(b, c, d, a, M_offset_3,  22, T[3]);
+	            a = FF(a, b, c, d, M_offset_4,  7,  T[4]);
+	            d = FF(d, a, b, c, M_offset_5,  12, T[5]);
+	            c = FF(c, d, a, b, M_offset_6,  17, T[6]);
+	            b = FF(b, c, d, a, M_offset_7,  22, T[7]);
+	            a = FF(a, b, c, d, M_offset_8,  7,  T[8]);
+	            d = FF(d, a, b, c, M_offset_9,  12, T[9]);
+	            c = FF(c, d, a, b, M_offset_10, 17, T[10]);
+	            b = FF(b, c, d, a, M_offset_11, 22, T[11]);
+	            a = FF(a, b, c, d, M_offset_12, 7,  T[12]);
+	            d = FF(d, a, b, c, M_offset_13, 12, T[13]);
+	            c = FF(c, d, a, b, M_offset_14, 17, T[14]);
+	            b = FF(b, c, d, a, M_offset_15, 22, T[15]);
+
+	            a = GG(a, b, c, d, M_offset_1,  5,  T[16]);
+	            d = GG(d, a, b, c, M_offset_6,  9,  T[17]);
+	            c = GG(c, d, a, b, M_offset_11, 14, T[18]);
+	            b = GG(b, c, d, a, M_offset_0,  20, T[19]);
+	            a = GG(a, b, c, d, M_offset_5,  5,  T[20]);
+	            d = GG(d, a, b, c, M_offset_10, 9,  T[21]);
+	            c = GG(c, d, a, b, M_offset_15, 14, T[22]);
+	            b = GG(b, c, d, a, M_offset_4,  20, T[23]);
+	            a = GG(a, b, c, d, M_offset_9,  5,  T[24]);
+	            d = GG(d, a, b, c, M_offset_14, 9,  T[25]);
+	            c = GG(c, d, a, b, M_offset_3,  14, T[26]);
+	            b = GG(b, c, d, a, M_offset_8,  20, T[27]);
+	            a = GG(a, b, c, d, M_offset_13, 5,  T[28]);
+	            d = GG(d, a, b, c, M_offset_2,  9,  T[29]);
+	            c = GG(c, d, a, b, M_offset_7,  14, T[30]);
+	            b = GG(b, c, d, a, M_offset_12, 20, T[31]);
+
+	            a = HH(a, b, c, d, M_offset_5,  4,  T[32]);
+	            d = HH(d, a, b, c, M_offset_8,  11, T[33]);
+	            c = HH(c, d, a, b, M_offset_11, 16, T[34]);
+	            b = HH(b, c, d, a, M_offset_14, 23, T[35]);
+	            a = HH(a, b, c, d, M_offset_1,  4,  T[36]);
+	            d = HH(d, a, b, c, M_offset_4,  11, T[37]);
+	            c = HH(c, d, a, b, M_offset_7,  16, T[38]);
+	            b = HH(b, c, d, a, M_offset_10, 23, T[39]);
+	            a = HH(a, b, c, d, M_offset_13, 4,  T[40]);
+	            d = HH(d, a, b, c, M_offset_0,  11, T[41]);
+	            c = HH(c, d, a, b, M_offset_3,  16, T[42]);
+	            b = HH(b, c, d, a, M_offset_6,  23, T[43]);
+	            a = HH(a, b, c, d, M_offset_9,  4,  T[44]);
+	            d = HH(d, a, b, c, M_offset_12, 11, T[45]);
+	            c = HH(c, d, a, b, M_offset_15, 16, T[46]);
+	            b = HH(b, c, d, a, M_offset_2,  23, T[47]);
+
+	            a = II(a, b, c, d, M_offset_0,  6,  T[48]);
+	            d = II(d, a, b, c, M_offset_7,  10, T[49]);
+	            c = II(c, d, a, b, M_offset_14, 15, T[50]);
+	            b = II(b, c, d, a, M_offset_5,  21, T[51]);
+	            a = II(a, b, c, d, M_offset_12, 6,  T[52]);
+	            d = II(d, a, b, c, M_offset_3,  10, T[53]);
+	            c = II(c, d, a, b, M_offset_10, 15, T[54]);
+	            b = II(b, c, d, a, M_offset_1,  21, T[55]);
+	            a = II(a, b, c, d, M_offset_8,  6,  T[56]);
+	            d = II(d, a, b, c, M_offset_15, 10, T[57]);
+	            c = II(c, d, a, b, M_offset_6,  15, T[58]);
+	            b = II(b, c, d, a, M_offset_13, 21, T[59]);
+	            a = II(a, b, c, d, M_offset_4,  6,  T[60]);
+	            d = II(d, a, b, c, M_offset_11, 10, T[61]);
+	            c = II(c, d, a, b, M_offset_2,  15, T[62]);
+	            b = II(b, c, d, a, M_offset_9,  21, T[63]);
+
+	            // Intermediate hash value
+	            H[0] = (H[0] + a) | 0;
+	            H[1] = (H[1] + b) | 0;
+	            H[2] = (H[2] + c) | 0;
+	            H[3] = (H[3] + d) | 0;
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+
+	            var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
+	            var nBitsTotalL = nBitsTotal;
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
+	                (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
+	                (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)
+	            );
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+	                (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
+	                (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)
+	            );
+
+	            data.sigBytes = (dataWords.length + 1) * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Shortcuts
+	            var hash = this._hash;
+	            var H = hash.words;
+
+	            // Swap endian
+	            for (var i = 0; i < 4; i++) {
+	                // Shortcut
+	                var H_i = H[i];
+
+	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
+	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
+	            }
+
+	            // Return final computed hash
+	            return hash;
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+	            clone._hash = this._hash.clone();
+
+	            return clone;
+	        }
+	    });
+
+	    function FF(a, b, c, d, x, s, t) {
+	        var n = a + ((b & c) | (~b & d)) + x + t;
+	        return ((n << s) | (n >>> (32 - s))) + b;
+	    }
+
+	    function GG(a, b, c, d, x, s, t) {
+	        var n = a + ((b & d) | (c & ~d)) + x + t;
+	        return ((n << s) | (n >>> (32 - s))) + b;
+	    }
+
+	    function HH(a, b, c, d, x, s, t) {
+	        var n = a + (b ^ c ^ d) + x + t;
+	        return ((n << s) | (n >>> (32 - s))) + b;
+	    }
+
+	    function II(a, b, c, d, x, s, t) {
+	        var n = a + (c ^ (b | ~d)) + x + t;
+	        return ((n << s) | (n >>> (32 - s))) + b;
+	    }
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.MD5('message');
+	     *     var hash = CryptoJS.MD5(wordArray);
+	     */
+	    C.MD5 = Hasher._createHelper(MD5);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacMD5(message, key);
+	     */
+	    C.HmacMD5 = Hasher._createHmacHelper(MD5);
+	}(Math));
+
+
+	return CryptoJS.MD5;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/mode-cfb.js b/management/guns-admin/src/main/webapp/static/crypto-js/mode-cfb.js
new file mode 100644
index 0000000..444c9cb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/mode-cfb.js
@@ -0,0 +1,80 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/**
+	 * Cipher Feedback block mode.
+	 */
+	CryptoJS.mode.CFB = (function () {
+	    var CFB = CryptoJS.lib.BlockCipherMode.extend();
+
+	    CFB.Encryptor = CFB.extend({
+	        processBlock: function (words, offset) {
+	            // Shortcuts
+	            var cipher = this._cipher;
+	            var blockSize = cipher.blockSize;
+
+	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+	            // Remember this block to use with next block
+	            this._prevBlock = words.slice(offset, offset + blockSize);
+	        }
+	    });
+
+	    CFB.Decryptor = CFB.extend({
+	        processBlock: function (words, offset) {
+	            // Shortcuts
+	            var cipher = this._cipher;
+	            var blockSize = cipher.blockSize;
+
+	            // Remember this block to use with next block
+	            var thisBlock = words.slice(offset, offset + blockSize);
+
+	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+	            // This block becomes the previous block
+	            this._prevBlock = thisBlock;
+	        }
+	    });
+
+	    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
+	        var keystream;
+
+	        // Shortcut
+	        var iv = this._iv;
+
+	        // Generate keystream
+	        if (iv) {
+	            keystream = iv.slice(0);
+
+	            // Remove IV for subsequent blocks
+	            this._iv = undefined;
+	        } else {
+	            keystream = this._prevBlock;
+	        }
+	        cipher.encryptBlock(keystream, 0);
+
+	        // Encrypt
+	        for (var i = 0; i < blockSize; i++) {
+	            words[offset + i] ^= keystream[i];
+	        }
+	    }
+
+	    return CFB;
+	}());
+
+
+	return CryptoJS.mode.CFB;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/mode-ctr-gladman.js b/management/guns-admin/src/main/webapp/static/crypto-js/mode-ctr-gladman.js
new file mode 100644
index 0000000..bbc5687
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/mode-ctr-gladman.js
@@ -0,0 +1,116 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/** @preserve
+	 * Counter block mode compatible with  Dr Brian Gladman fileenc.c
+	 * derived from CryptoJS.mode.CTR
+	 * Jan Hruby jhruby.web@gmail.com
+	 */
+	CryptoJS.mode.CTRGladman = (function () {
+	    var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
+
+		function incWord(word)
+		{
+			if (((word >> 24) & 0xff) === 0xff) { //overflow
+			var b1 = (word >> 16)&0xff;
+			var b2 = (word >> 8)&0xff;
+			var b3 = word & 0xff;
+
+			if (b1 === 0xff) // overflow b1
+			{
+			b1 = 0;
+			if (b2 === 0xff)
+			{
+				b2 = 0;
+				if (b3 === 0xff)
+				{
+					b3 = 0;
+				}
+				else
+				{
+					++b3;
+				}
+			}
+			else
+			{
+				++b2;
+			}
+			}
+			else
+			{
+			++b1;
+			}
+
+			word = 0;
+			word += (b1 << 16);
+			word += (b2 << 8);
+			word += b3;
+			}
+			else
+			{
+			word += (0x01 << 24);
+			}
+			return word;
+		}
+
+		function incCounter(counter)
+		{
+			if ((counter[0] = incWord(counter[0])) === 0)
+			{
+				// encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8
+				counter[1] = incWord(counter[1]);
+			}
+			return counter;
+		}
+
+	    var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
+	        processBlock: function (words, offset) {
+	            // Shortcuts
+	            var cipher = this._cipher
+	            var blockSize = cipher.blockSize;
+	            var iv = this._iv;
+	            var counter = this._counter;
+
+	            // Generate keystream
+	            if (iv) {
+	                counter = this._counter = iv.slice(0);
+
+	                // Remove IV for subsequent blocks
+	                this._iv = undefined;
+	            }
+
+				incCounter(counter);
+
+				var keystream = counter.slice(0);
+	            cipher.encryptBlock(keystream, 0);
+
+	            // Encrypt
+	            for (var i = 0; i < blockSize; i++) {
+	                words[offset + i] ^= keystream[i];
+	            }
+	        }
+	    });
+
+	    CTRGladman.Decryptor = Encryptor;
+
+	    return CTRGladman;
+	}());
+
+
+
+
+	return CryptoJS.mode.CTRGladman;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/mode-ctr.js b/management/guns-admin/src/main/webapp/static/crypto-js/mode-ctr.js
new file mode 100644
index 0000000..c3d470a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/mode-ctr.js
@@ -0,0 +1,58 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/**
+	 * Counter block mode.
+	 */
+	CryptoJS.mode.CTR = (function () {
+	    var CTR = CryptoJS.lib.BlockCipherMode.extend();
+
+	    var Encryptor = CTR.Encryptor = CTR.extend({
+	        processBlock: function (words, offset) {
+	            // Shortcuts
+	            var cipher = this._cipher
+	            var blockSize = cipher.blockSize;
+	            var iv = this._iv;
+	            var counter = this._counter;
+
+	            // Generate keystream
+	            if (iv) {
+	                counter = this._counter = iv.slice(0);
+
+	                // Remove IV for subsequent blocks
+	                this._iv = undefined;
+	            }
+	            var keystream = counter.slice(0);
+	            cipher.encryptBlock(keystream, 0);
+
+	            // Increment counter
+	            counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
+
+	            // Encrypt
+	            for (var i = 0; i < blockSize; i++) {
+	                words[offset + i] ^= keystream[i];
+	            }
+	        }
+	    });
+
+	    CTR.Decryptor = Encryptor;
+
+	    return CTR;
+	}());
+
+
+	return CryptoJS.mode.CTR;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/mode-ecb.js b/management/guns-admin/src/main/webapp/static/crypto-js/mode-ecb.js
new file mode 100644
index 0000000..ff06921
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/mode-ecb.js
@@ -0,0 +1,40 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/**
+	 * Electronic Codebook block mode.
+	 */
+	CryptoJS.mode.ECB = (function () {
+	    var ECB = CryptoJS.lib.BlockCipherMode.extend();
+
+	    ECB.Encryptor = ECB.extend({
+	        processBlock: function (words, offset) {
+	            this._cipher.encryptBlock(words, offset);
+	        }
+	    });
+
+	    ECB.Decryptor = ECB.extend({
+	        processBlock: function (words, offset) {
+	            this._cipher.decryptBlock(words, offset);
+	        }
+	    });
+
+	    return ECB;
+	}());
+
+
+	return CryptoJS.mode.ECB;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/mode-ofb.js b/management/guns-admin/src/main/webapp/static/crypto-js/mode-ofb.js
new file mode 100644
index 0000000..c01314c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/mode-ofb.js
@@ -0,0 +1,54 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/**
+	 * Output Feedback block mode.
+	 */
+	CryptoJS.mode.OFB = (function () {
+	    var OFB = CryptoJS.lib.BlockCipherMode.extend();
+
+	    var Encryptor = OFB.Encryptor = OFB.extend({
+	        processBlock: function (words, offset) {
+	            // Shortcuts
+	            var cipher = this._cipher
+	            var blockSize = cipher.blockSize;
+	            var iv = this._iv;
+	            var keystream = this._keystream;
+
+	            // Generate keystream
+	            if (iv) {
+	                keystream = this._keystream = iv.slice(0);
+
+	                // Remove IV for subsequent blocks
+	                this._iv = undefined;
+	            }
+	            cipher.encryptBlock(keystream, 0);
+
+	            // Encrypt
+	            for (var i = 0; i < blockSize; i++) {
+	                words[offset + i] ^= keystream[i];
+	            }
+	        }
+	    });
+
+	    OFB.Decryptor = Encryptor;
+
+	    return OFB;
+	}());
+
+
+	return CryptoJS.mode.OFB;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/pad-ansix923.js b/management/guns-admin/src/main/webapp/static/crypto-js/pad-ansix923.js
new file mode 100644
index 0000000..f01f21e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/pad-ansix923.js
@@ -0,0 +1,49 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/**
+	 * ANSI X.923 padding strategy.
+	 */
+	CryptoJS.pad.AnsiX923 = {
+	    pad: function (data, blockSize) {
+	        // Shortcuts
+	        var dataSigBytes = data.sigBytes;
+	        var blockSizeBytes = blockSize * 4;
+
+	        // Count padding bytes
+	        var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
+
+	        // Compute last byte position
+	        var lastBytePos = dataSigBytes + nPaddingBytes - 1;
+
+	        // Pad
+	        data.clamp();
+	        data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
+	        data.sigBytes += nPaddingBytes;
+	    },
+
+	    unpad: function (data) {
+	        // Get number of padding bytes from last byte
+	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+	        // Remove padding
+	        data.sigBytes -= nPaddingBytes;
+	    }
+	};
+
+
+	return CryptoJS.pad.Ansix923;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/pad-iso10126.js b/management/guns-admin/src/main/webapp/static/crypto-js/pad-iso10126.js
new file mode 100644
index 0000000..6e2aefd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/pad-iso10126.js
@@ -0,0 +1,44 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/**
+	 * ISO 10126 padding strategy.
+	 */
+	CryptoJS.pad.Iso10126 = {
+	    pad: function (data, blockSize) {
+	        // Shortcut
+	        var blockSizeBytes = blockSize * 4;
+
+	        // Count padding bytes
+	        var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+	        // Pad
+	        data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
+	             concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
+	    },
+
+	    unpad: function (data) {
+	        // Get number of padding bytes from last byte
+	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+	        // Remove padding
+	        data.sigBytes -= nPaddingBytes;
+	    }
+	};
+
+
+	return CryptoJS.pad.Iso10126;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/pad-iso97971.js b/management/guns-admin/src/main/webapp/static/crypto-js/pad-iso97971.js
new file mode 100644
index 0000000..41049b4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/pad-iso97971.js
@@ -0,0 +1,40 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/**
+	 * ISO/IEC 9797-1 Padding Method 2.
+	 */
+	CryptoJS.pad.Iso97971 = {
+	    pad: function (data, blockSize) {
+	        // Add 0x80 byte
+	        data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
+
+	        // Zero pad the rest
+	        CryptoJS.pad.ZeroPadding.pad(data, blockSize);
+	    },
+
+	    unpad: function (data) {
+	        // Remove zero padding
+	        CryptoJS.pad.ZeroPadding.unpad(data);
+
+	        // Remove one more byte -- the 0x80 byte
+	        data.sigBytes--;
+	    }
+	};
+
+
+	return CryptoJS.pad.Iso97971;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/pad-nopadding.js b/management/guns-admin/src/main/webapp/static/crypto-js/pad-nopadding.js
new file mode 100644
index 0000000..c7787c9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/pad-nopadding.js
@@ -0,0 +1,30 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/**
+	 * A noop padding strategy.
+	 */
+	CryptoJS.pad.NoPadding = {
+	    pad: function () {
+	    },
+
+	    unpad: function () {
+	    }
+	};
+
+
+	return CryptoJS.pad.NoPadding;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/pad-pkcs7.js b/management/guns-admin/src/main/webapp/static/crypto-js/pad-pkcs7.js
new file mode 100644
index 0000000..3555168
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/pad-pkcs7.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	return CryptoJS.pad.Pkcs7;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/pad-zeropadding.js b/management/guns-admin/src/main/webapp/static/crypto-js/pad-zeropadding.js
new file mode 100644
index 0000000..a1a459e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/pad-zeropadding.js
@@ -0,0 +1,47 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/**
+	 * Zero padding strategy.
+	 */
+	CryptoJS.pad.ZeroPadding = {
+	    pad: function (data, blockSize) {
+	        // Shortcut
+	        var blockSizeBytes = blockSize * 4;
+
+	        // Pad
+	        data.clamp();
+	        data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
+	    },
+
+	    unpad: function (data) {
+	        // Shortcut
+	        var dataWords = data.words;
+
+	        // Unpad
+	        var i = data.sigBytes - 1;
+	        for (var i = data.sigBytes - 1; i >= 0; i--) {
+	            if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
+	                data.sigBytes = i + 1;
+	                break;
+	            }
+	        }
+	    }
+	};
+
+
+	return CryptoJS.pad.ZeroPadding;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/pbkdf2.js b/management/guns-admin/src/main/webapp/static/crypto-js/pbkdf2.js
new file mode 100644
index 0000000..1258251
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/pbkdf2.js
@@ -0,0 +1,145 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./sha1", "./hmac"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Base = C_lib.Base;
+	    var WordArray = C_lib.WordArray;
+	    var C_algo = C.algo;
+	    var SHA1 = C_algo.SHA1;
+	    var HMAC = C_algo.HMAC;
+
+	    /**
+	     * Password-Based Key Derivation Function 2 algorithm.
+	     */
+	    var PBKDF2 = C_algo.PBKDF2 = Base.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+	         * @property {Hasher} hasher The hasher to use. Default: SHA1
+	         * @property {number} iterations The number of iterations to perform. Default: 1
+	         */
+	        cfg: Base.extend({
+	            keySize: 128/32,
+	            hasher: SHA1,
+	            iterations: 1
+	        }),
+
+	        /**
+	         * Initializes a newly created key derivation function.
+	         *
+	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+	         *
+	         * @example
+	         *
+	         *     var kdf = CryptoJS.algo.PBKDF2.create();
+	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
+	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
+	         */
+	        init: function (cfg) {
+	            this.cfg = this.cfg.extend(cfg);
+	        },
+
+	        /**
+	         * Computes the Password-Based Key Derivation Function 2.
+	         *
+	         * @param {WordArray|string} password The password.
+	         * @param {WordArray|string} salt A salt.
+	         *
+	         * @return {WordArray} The derived key.
+	         *
+	         * @example
+	         *
+	         *     var key = kdf.compute(password, salt);
+	         */
+	        compute: function (password, salt) {
+	            // Shortcut
+	            var cfg = this.cfg;
+
+	            // Init HMAC
+	            var hmac = HMAC.create(cfg.hasher, password);
+
+	            // Initial values
+	            var derivedKey = WordArray.create();
+	            var blockIndex = WordArray.create([0x00000001]);
+
+	            // Shortcuts
+	            var derivedKeyWords = derivedKey.words;
+	            var blockIndexWords = blockIndex.words;
+	            var keySize = cfg.keySize;
+	            var iterations = cfg.iterations;
+
+	            // Generate key
+	            while (derivedKeyWords.length < keySize) {
+	                var block = hmac.update(salt).finalize(blockIndex);
+	                hmac.reset();
+
+	                // Shortcuts
+	                var blockWords = block.words;
+	                var blockWordsLength = blockWords.length;
+
+	                // Iterations
+	                var intermediate = block;
+	                for (var i = 1; i < iterations; i++) {
+	                    intermediate = hmac.finalize(intermediate);
+	                    hmac.reset();
+
+	                    // Shortcut
+	                    var intermediateWords = intermediate.words;
+
+	                    // XOR intermediate with block
+	                    for (var j = 0; j < blockWordsLength; j++) {
+	                        blockWords[j] ^= intermediateWords[j];
+	                    }
+	                }
+
+	                derivedKey.concat(block);
+	                blockIndexWords[0]++;
+	            }
+	            derivedKey.sigBytes = keySize * 4;
+
+	            return derivedKey;
+	        }
+	    });
+
+	    /**
+	     * Computes the Password-Based Key Derivation Function 2.
+	     *
+	     * @param {WordArray|string} password The password.
+	     * @param {WordArray|string} salt A salt.
+	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
+	     *
+	     * @return {WordArray} The derived key.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var key = CryptoJS.PBKDF2(password, salt);
+	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
+	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
+	     */
+	    C.PBKDF2 = function (password, salt, cfg) {
+	        return PBKDF2.create(cfg).compute(password, salt);
+	    };
+	}());
+
+
+	return CryptoJS.PBKDF2;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/rabbit-legacy.js b/management/guns-admin/src/main/webapp/static/crypto-js/rabbit-legacy.js
new file mode 100644
index 0000000..e118b6b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/rabbit-legacy.js
@@ -0,0 +1,190 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var StreamCipher = C_lib.StreamCipher;
+	    var C_algo = C.algo;
+
+	    // Reusable objects
+	    var S  = [];
+	    var C_ = [];
+	    var G  = [];
+
+	    /**
+	     * Rabbit stream cipher algorithm.
+	     *
+	     * This is a legacy version that neglected to convert the key to little-endian.
+	     * This error doesn't affect the cipher's security,
+	     * but it does affect its compatibility with other implementations.
+	     */
+	    var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
+	        _doReset: function () {
+	            // Shortcuts
+	            var K = this._key.words;
+	            var iv = this.cfg.iv;
+
+	            // Generate initial state values
+	            var X = this._X = [
+	                K[0], (K[3] << 16) | (K[2] >>> 16),
+	                K[1], (K[0] << 16) | (K[3] >>> 16),
+	                K[2], (K[1] << 16) | (K[0] >>> 16),
+	                K[3], (K[2] << 16) | (K[1] >>> 16)
+	            ];
+
+	            // Generate initial counter values
+	            var C = this._C = [
+	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+	            ];
+
+	            // Carry bit
+	            this._b = 0;
+
+	            // Iterate the system four times
+	            for (var i = 0; i < 4; i++) {
+	                nextState.call(this);
+	            }
+
+	            // Modify the counters
+	            for (var i = 0; i < 8; i++) {
+	                C[i] ^= X[(i + 4) & 7];
+	            }
+
+	            // IV setup
+	            if (iv) {
+	                // Shortcuts
+	                var IV = iv.words;
+	                var IV_0 = IV[0];
+	                var IV_1 = IV[1];
+
+	                // Generate four subvectors
+	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
+
+	                // Modify counter values
+	                C[0] ^= i0;
+	                C[1] ^= i1;
+	                C[2] ^= i2;
+	                C[3] ^= i3;
+	                C[4] ^= i0;
+	                C[5] ^= i1;
+	                C[6] ^= i2;
+	                C[7] ^= i3;
+
+	                // Iterate the system four times
+	                for (var i = 0; i < 4; i++) {
+	                    nextState.call(this);
+	                }
+	            }
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcut
+	            var X = this._X;
+
+	            // Iterate the system
+	            nextState.call(this);
+
+	            // Generate four keystream words
+	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+	            for (var i = 0; i < 4; i++) {
+	                // Swap endian
+	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
+	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
+
+	                // Encrypt
+	                M[offset + i] ^= S[i];
+	            }
+	        },
+
+	        blockSize: 128/32,
+
+	        ivSize: 64/32
+	    });
+
+	    function nextState() {
+	        // Shortcuts
+	        var X = this._X;
+	        var C = this._C;
+
+	        // Save old counter values
+	        for (var i = 0; i < 8; i++) {
+	            C_[i] = C[i];
+	        }
+
+	        // Calculate new counter values
+	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+	        // Calculate the g-values
+	        for (var i = 0; i < 8; i++) {
+	            var gx = X[i] + C[i];
+
+	            // Construct high and low argument for squaring
+	            var ga = gx & 0xffff;
+	            var gb = gx >>> 16;
+
+	            // Calculate high and low result of squaring
+	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+	            // High XOR low
+	            G[i] = gh ^ gl;
+	        }
+
+	        // Calculate new state values
+	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
+	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
+	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
+	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
+	    }
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
+	     */
+	    C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
+	}());
+
+
+	return CryptoJS.RabbitLegacy;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/rabbit.js b/management/guns-admin/src/main/webapp/static/crypto-js/rabbit.js
new file mode 100644
index 0000000..1b06833
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/rabbit.js
@@ -0,0 +1,192 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var StreamCipher = C_lib.StreamCipher;
+	    var C_algo = C.algo;
+
+	    // Reusable objects
+	    var S  = [];
+	    var C_ = [];
+	    var G  = [];
+
+	    /**
+	     * Rabbit stream cipher algorithm
+	     */
+	    var Rabbit = C_algo.Rabbit = StreamCipher.extend({
+	        _doReset: function () {
+	            // Shortcuts
+	            var K = this._key.words;
+	            var iv = this.cfg.iv;
+
+	            // Swap endian
+	            for (var i = 0; i < 4; i++) {
+	                K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |
+	                       (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);
+	            }
+
+	            // Generate initial state values
+	            var X = this._X = [
+	                K[0], (K[3] << 16) | (K[2] >>> 16),
+	                K[1], (K[0] << 16) | (K[3] >>> 16),
+	                K[2], (K[1] << 16) | (K[0] >>> 16),
+	                K[3], (K[2] << 16) | (K[1] >>> 16)
+	            ];
+
+	            // Generate initial counter values
+	            var C = this._C = [
+	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+	            ];
+
+	            // Carry bit
+	            this._b = 0;
+
+	            // Iterate the system four times
+	            for (var i = 0; i < 4; i++) {
+	                nextState.call(this);
+	            }
+
+	            // Modify the counters
+	            for (var i = 0; i < 8; i++) {
+	                C[i] ^= X[(i + 4) & 7];
+	            }
+
+	            // IV setup
+	            if (iv) {
+	                // Shortcuts
+	                var IV = iv.words;
+	                var IV_0 = IV[0];
+	                var IV_1 = IV[1];
+
+	                // Generate four subvectors
+	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
+
+	                // Modify counter values
+	                C[0] ^= i0;
+	                C[1] ^= i1;
+	                C[2] ^= i2;
+	                C[3] ^= i3;
+	                C[4] ^= i0;
+	                C[5] ^= i1;
+	                C[6] ^= i2;
+	                C[7] ^= i3;
+
+	                // Iterate the system four times
+	                for (var i = 0; i < 4; i++) {
+	                    nextState.call(this);
+	                }
+	            }
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcut
+	            var X = this._X;
+
+	            // Iterate the system
+	            nextState.call(this);
+
+	            // Generate four keystream words
+	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+	            for (var i = 0; i < 4; i++) {
+	                // Swap endian
+	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
+	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
+
+	                // Encrypt
+	                M[offset + i] ^= S[i];
+	            }
+	        },
+
+	        blockSize: 128/32,
+
+	        ivSize: 64/32
+	    });
+
+	    function nextState() {
+	        // Shortcuts
+	        var X = this._X;
+	        var C = this._C;
+
+	        // Save old counter values
+	        for (var i = 0; i < 8; i++) {
+	            C_[i] = C[i];
+	        }
+
+	        // Calculate new counter values
+	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+	        // Calculate the g-values
+	        for (var i = 0; i < 8; i++) {
+	            var gx = X[i] + C[i];
+
+	            // Construct high and low argument for squaring
+	            var ga = gx & 0xffff;
+	            var gb = gx >>> 16;
+
+	            // Calculate high and low result of squaring
+	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+	            // High XOR low
+	            G[i] = gh ^ gl;
+	        }
+
+	        // Calculate new state values
+	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
+	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
+	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
+	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
+	    }
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
+	     */
+	    C.Rabbit = StreamCipher._createHelper(Rabbit);
+	}());
+
+
+	return CryptoJS.Rabbit;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/rc4.js b/management/guns-admin/src/main/webapp/static/crypto-js/rc4.js
new file mode 100644
index 0000000..0e4bdff
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/rc4.js
@@ -0,0 +1,139 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var StreamCipher = C_lib.StreamCipher;
+	    var C_algo = C.algo;
+
+	    /**
+	     * RC4 stream cipher algorithm.
+	     */
+	    var RC4 = C_algo.RC4 = StreamCipher.extend({
+	        _doReset: function () {
+	            // Shortcuts
+	            var key = this._key;
+	            var keyWords = key.words;
+	            var keySigBytes = key.sigBytes;
+
+	            // Init sbox
+	            var S = this._S = [];
+	            for (var i = 0; i < 256; i++) {
+	                S[i] = i;
+	            }
+
+	            // Key setup
+	            for (var i = 0, j = 0; i < 256; i++) {
+	                var keyByteIndex = i % keySigBytes;
+	                var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
+
+	                j = (j + S[i] + keyByte) % 256;
+
+	                // Swap
+	                var t = S[i];
+	                S[i] = S[j];
+	                S[j] = t;
+	            }
+
+	            // Counters
+	            this._i = this._j = 0;
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            M[offset] ^= generateKeystreamWord.call(this);
+	        },
+
+	        keySize: 256/32,
+
+	        ivSize: 0
+	    });
+
+	    function generateKeystreamWord() {
+	        // Shortcuts
+	        var S = this._S;
+	        var i = this._i;
+	        var j = this._j;
+
+	        // Generate keystream word
+	        var keystreamWord = 0;
+	        for (var n = 0; n < 4; n++) {
+	            i = (i + 1) % 256;
+	            j = (j + S[i]) % 256;
+
+	            // Swap
+	            var t = S[i];
+	            S[i] = S[j];
+	            S[j] = t;
+
+	            keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
+	        }
+
+	        // Update counters
+	        this._i = i;
+	        this._j = j;
+
+	        return keystreamWord;
+	    }
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
+	     */
+	    C.RC4 = StreamCipher._createHelper(RC4);
+
+	    /**
+	     * Modified RC4 stream cipher algorithm.
+	     */
+	    var RC4Drop = C_algo.RC4Drop = RC4.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {number} drop The number of keystream words to drop. Default 192
+	         */
+	        cfg: RC4.cfg.extend({
+	            drop: 192
+	        }),
+
+	        _doReset: function () {
+	            RC4._doReset.call(this);
+
+	            // Drop
+	            for (var i = this.cfg.drop; i > 0; i--) {
+	                generateKeystreamWord.call(this);
+	            }
+	        }
+	    });
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
+	     */
+	    C.RC4Drop = StreamCipher._createHelper(RC4Drop);
+	}());
+
+
+	return CryptoJS.RC4;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/ripemd160.js b/management/guns-admin/src/main/webapp/static/crypto-js/ripemd160.js
new file mode 100644
index 0000000..24feb47
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/ripemd160.js
@@ -0,0 +1,267 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	/** @preserve
+	(c) 2012 by Cédric Mesnil. All rights reserved.
+
+	Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+	    - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+	    - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+	*/
+
+	(function (Math) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var Hasher = C_lib.Hasher;
+	    var C_algo = C.algo;
+
+	    // Constants table
+	    var _zl = WordArray.create([
+	        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
+	        7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,
+	        3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,
+	        1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,
+	        4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);
+	    var _zr = WordArray.create([
+	        5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,
+	        6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,
+	        15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,
+	        8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,
+	        12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);
+	    var _sl = WordArray.create([
+	         11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,
+	        7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,
+	        11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,
+	          11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,
+	        9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);
+	    var _sr = WordArray.create([
+	        8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,
+	        9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,
+	        9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,
+	        15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,
+	        8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);
+
+	    var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
+	    var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
+
+	    /**
+	     * RIPEMD160 hash algorithm.
+	     */
+	    var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
+	        _doReset: function () {
+	            this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+
+	            // Swap endian
+	            for (var i = 0; i < 16; i++) {
+	                // Shortcuts
+	                var offset_i = offset + i;
+	                var M_offset_i = M[offset_i];
+
+	                // Swap
+	                M[offset_i] = (
+	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
+	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
+	                );
+	            }
+	            // Shortcut
+	            var H  = this._hash.words;
+	            var hl = _hl.words;
+	            var hr = _hr.words;
+	            var zl = _zl.words;
+	            var zr = _zr.words;
+	            var sl = _sl.words;
+	            var sr = _sr.words;
+
+	            // Working variables
+	            var al, bl, cl, dl, el;
+	            var ar, br, cr, dr, er;
+
+	            ar = al = H[0];
+	            br = bl = H[1];
+	            cr = cl = H[2];
+	            dr = dl = H[3];
+	            er = el = H[4];
+	            // Computation
+	            var t;
+	            for (var i = 0; i < 80; i += 1) {
+	                t = (al +  M[offset+zl[i]])|0;
+	                if (i<16){
+		            t +=  f1(bl,cl,dl) + hl[0];
+	                } else if (i<32) {
+		            t +=  f2(bl,cl,dl) + hl[1];
+	                } else if (i<48) {
+		            t +=  f3(bl,cl,dl) + hl[2];
+	                } else if (i<64) {
+		            t +=  f4(bl,cl,dl) + hl[3];
+	                } else {// if (i<80) {
+		            t +=  f5(bl,cl,dl) + hl[4];
+	                }
+	                t = t|0;
+	                t =  rotl(t,sl[i]);
+	                t = (t+el)|0;
+	                al = el;
+	                el = dl;
+	                dl = rotl(cl, 10);
+	                cl = bl;
+	                bl = t;
+
+	                t = (ar + M[offset+zr[i]])|0;
+	                if (i<16){
+		            t +=  f5(br,cr,dr) + hr[0];
+	                } else if (i<32) {
+		            t +=  f4(br,cr,dr) + hr[1];
+	                } else if (i<48) {
+		            t +=  f3(br,cr,dr) + hr[2];
+	                } else if (i<64) {
+		            t +=  f2(br,cr,dr) + hr[3];
+	                } else {// if (i<80) {
+		            t +=  f1(br,cr,dr) + hr[4];
+	                }
+	                t = t|0;
+	                t =  rotl(t,sr[i]) ;
+	                t = (t+er)|0;
+	                ar = er;
+	                er = dr;
+	                dr = rotl(cr, 10);
+	                cr = br;
+	                br = t;
+	            }
+	            // Intermediate hash value
+	            t    = (H[1] + cl + dr)|0;
+	            H[1] = (H[2] + dl + er)|0;
+	            H[2] = (H[3] + el + ar)|0;
+	            H[3] = (H[4] + al + br)|0;
+	            H[4] = (H[0] + bl + cr)|0;
+	            H[0] =  t;
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+	                (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |
+	                (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)
+	            );
+	            data.sigBytes = (dataWords.length + 1) * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Shortcuts
+	            var hash = this._hash;
+	            var H = hash.words;
+
+	            // Swap endian
+	            for (var i = 0; i < 5; i++) {
+	                // Shortcut
+	                var H_i = H[i];
+
+	                // Swap
+	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
+	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
+	            }
+
+	            // Return final computed hash
+	            return hash;
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+	            clone._hash = this._hash.clone();
+
+	            return clone;
+	        }
+	    });
+
+
+	    function f1(x, y, z) {
+	        return ((x) ^ (y) ^ (z));
+
+	    }
+
+	    function f2(x, y, z) {
+	        return (((x)&(y)) | ((~x)&(z)));
+	    }
+
+	    function f3(x, y, z) {
+	        return (((x) | (~(y))) ^ (z));
+	    }
+
+	    function f4(x, y, z) {
+	        return (((x) & (z)) | ((y)&(~(z))));
+	    }
+
+	    function f5(x, y, z) {
+	        return ((x) ^ ((y) |(~(z))));
+
+	    }
+
+	    function rotl(x,n) {
+	        return (x<<n) | (x>>>(32-n));
+	    }
+
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.RIPEMD160('message');
+	     *     var hash = CryptoJS.RIPEMD160(wordArray);
+	     */
+	    C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacRIPEMD160(message, key);
+	     */
+	    C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
+	}(Math));
+
+
+	return CryptoJS.RIPEMD160;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/sha1.js b/management/guns-admin/src/main/webapp/static/crypto-js/sha1.js
new file mode 100644
index 0000000..6691149
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/sha1.js
@@ -0,0 +1,150 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var Hasher = C_lib.Hasher;
+	    var C_algo = C.algo;
+
+	    // Reusable object
+	    var W = [];
+
+	    /**
+	     * SHA-1 hash algorithm.
+	     */
+	    var SHA1 = C_algo.SHA1 = Hasher.extend({
+	        _doReset: function () {
+	            this._hash = new WordArray.init([
+	                0x67452301, 0xefcdab89,
+	                0x98badcfe, 0x10325476,
+	                0xc3d2e1f0
+	            ]);
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcut
+	            var H = this._hash.words;
+
+	            // Working variables
+	            var a = H[0];
+	            var b = H[1];
+	            var c = H[2];
+	            var d = H[3];
+	            var e = H[4];
+
+	            // Computation
+	            for (var i = 0; i < 80; i++) {
+	                if (i < 16) {
+	                    W[i] = M[offset + i] | 0;
+	                } else {
+	                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
+	                    W[i] = (n << 1) | (n >>> 31);
+	                }
+
+	                var t = ((a << 5) | (a >>> 27)) + e + W[i];
+	                if (i < 20) {
+	                    t += ((b & c) | (~b & d)) + 0x5a827999;
+	                } else if (i < 40) {
+	                    t += (b ^ c ^ d) + 0x6ed9eba1;
+	                } else if (i < 60) {
+	                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
+	                } else /* if (i < 80) */ {
+	                    t += (b ^ c ^ d) - 0x359d3e2a;
+	                }
+
+	                e = d;
+	                d = c;
+	                c = (b << 30) | (b >>> 2);
+	                b = a;
+	                a = t;
+	            }
+
+	            // Intermediate hash value
+	            H[0] = (H[0] + a) | 0;
+	            H[1] = (H[1] + b) | 0;
+	            H[2] = (H[2] + c) | 0;
+	            H[3] = (H[3] + d) | 0;
+	            H[4] = (H[4] + e) | 0;
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+	            data.sigBytes = dataWords.length * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Return final computed hash
+	            return this._hash;
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+	            clone._hash = this._hash.clone();
+
+	            return clone;
+	        }
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA1('message');
+	     *     var hash = CryptoJS.SHA1(wordArray);
+	     */
+	    C.SHA1 = Hasher._createHelper(SHA1);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA1(message, key);
+	     */
+	    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
+	}());
+
+
+	return CryptoJS.SHA1;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/sha224.js b/management/guns-admin/src/main/webapp/static/crypto-js/sha224.js
new file mode 100644
index 0000000..d8ce988
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/sha224.js
@@ -0,0 +1,80 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./sha256"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./sha256"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var C_algo = C.algo;
+	    var SHA256 = C_algo.SHA256;
+
+	    /**
+	     * SHA-224 hash algorithm.
+	     */
+	    var SHA224 = C_algo.SHA224 = SHA256.extend({
+	        _doReset: function () {
+	            this._hash = new WordArray.init([
+	                0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
+	                0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
+	            ]);
+	        },
+
+	        _doFinalize: function () {
+	            var hash = SHA256._doFinalize.call(this);
+
+	            hash.sigBytes -= 4;
+
+	            return hash;
+	        }
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA224('message');
+	     *     var hash = CryptoJS.SHA224(wordArray);
+	     */
+	    C.SHA224 = SHA256._createHelper(SHA224);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA224(message, key);
+	     */
+	    C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
+	}());
+
+
+	return CryptoJS.SHA224;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/sha256.js b/management/guns-admin/src/main/webapp/static/crypto-js/sha256.js
new file mode 100644
index 0000000..de2d7fc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/sha256.js
@@ -0,0 +1,199 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function (Math) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var Hasher = C_lib.Hasher;
+	    var C_algo = C.algo;
+
+	    // Initialization and round constants tables
+	    var H = [];
+	    var K = [];
+
+	    // Compute constants
+	    (function () {
+	        function isPrime(n) {
+	            var sqrtN = Math.sqrt(n);
+	            for (var factor = 2; factor <= sqrtN; factor++) {
+	                if (!(n % factor)) {
+	                    return false;
+	                }
+	            }
+
+	            return true;
+	        }
+
+	        function getFractionalBits(n) {
+	            return ((n - (n | 0)) * 0x100000000) | 0;
+	        }
+
+	        var n = 2;
+	        var nPrime = 0;
+	        while (nPrime < 64) {
+	            if (isPrime(n)) {
+	                if (nPrime < 8) {
+	                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
+	                }
+	                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
+
+	                nPrime++;
+	            }
+
+	            n++;
+	        }
+	    }());
+
+	    // Reusable object
+	    var W = [];
+
+	    /**
+	     * SHA-256 hash algorithm.
+	     */
+	    var SHA256 = C_algo.SHA256 = Hasher.extend({
+	        _doReset: function () {
+	            this._hash = new WordArray.init(H.slice(0));
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcut
+	            var H = this._hash.words;
+
+	            // Working variables
+	            var a = H[0];
+	            var b = H[1];
+	            var c = H[2];
+	            var d = H[3];
+	            var e = H[4];
+	            var f = H[5];
+	            var g = H[6];
+	            var h = H[7];
+
+	            // Computation
+	            for (var i = 0; i < 64; i++) {
+	                if (i < 16) {
+	                    W[i] = M[offset + i] | 0;
+	                } else {
+	                    var gamma0x = W[i - 15];
+	                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^
+	                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^
+	                                   (gamma0x >>> 3);
+
+	                    var gamma1x = W[i - 2];
+	                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^
+	                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^
+	                                   (gamma1x >>> 10);
+
+	                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
+	                }
+
+	                var ch  = (e & f) ^ (~e & g);
+	                var maj = (a & b) ^ (a & c) ^ (b & c);
+
+	                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
+	                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));
+
+	                var t1 = h + sigma1 + ch + K[i] + W[i];
+	                var t2 = sigma0 + maj;
+
+	                h = g;
+	                g = f;
+	                f = e;
+	                e = (d + t1) | 0;
+	                d = c;
+	                c = b;
+	                b = a;
+	                a = (t1 + t2) | 0;
+	            }
+
+	            // Intermediate hash value
+	            H[0] = (H[0] + a) | 0;
+	            H[1] = (H[1] + b) | 0;
+	            H[2] = (H[2] + c) | 0;
+	            H[3] = (H[3] + d) | 0;
+	            H[4] = (H[4] + e) | 0;
+	            H[5] = (H[5] + f) | 0;
+	            H[6] = (H[6] + g) | 0;
+	            H[7] = (H[7] + h) | 0;
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+	            data.sigBytes = dataWords.length * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Return final computed hash
+	            return this._hash;
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+	            clone._hash = this._hash.clone();
+
+	            return clone;
+	        }
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA256('message');
+	     *     var hash = CryptoJS.SHA256(wordArray);
+	     */
+	    C.SHA256 = Hasher._createHelper(SHA256);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA256(message, key);
+	     */
+	    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
+	}(Math));
+
+
+	return CryptoJS.SHA256;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/sha3.js b/management/guns-admin/src/main/webapp/static/crypto-js/sha3.js
new file mode 100644
index 0000000..34ad86c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/sha3.js
@@ -0,0 +1,326 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./x64-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./x64-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function (Math) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var Hasher = C_lib.Hasher;
+	    var C_x64 = C.x64;
+	    var X64Word = C_x64.Word;
+	    var C_algo = C.algo;
+
+	    // Constants tables
+	    var RHO_OFFSETS = [];
+	    var PI_INDEXES  = [];
+	    var ROUND_CONSTANTS = [];
+
+	    // Compute Constants
+	    (function () {
+	        // Compute rho offset constants
+	        var x = 1, y = 0;
+	        for (var t = 0; t < 24; t++) {
+	            RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
+
+	            var newX = y % 5;
+	            var newY = (2 * x + 3 * y) % 5;
+	            x = newX;
+	            y = newY;
+	        }
+
+	        // Compute pi index constants
+	        for (var x = 0; x < 5; x++) {
+	            for (var y = 0; y < 5; y++) {
+	                PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
+	            }
+	        }
+
+	        // Compute round constants
+	        var LFSR = 0x01;
+	        for (var i = 0; i < 24; i++) {
+	            var roundConstantMsw = 0;
+	            var roundConstantLsw = 0;
+
+	            for (var j = 0; j < 7; j++) {
+	                if (LFSR & 0x01) {
+	                    var bitPosition = (1 << j) - 1;
+	                    if (bitPosition < 32) {
+	                        roundConstantLsw ^= 1 << bitPosition;
+	                    } else /* if (bitPosition >= 32) */ {
+	                        roundConstantMsw ^= 1 << (bitPosition - 32);
+	                    }
+	                }
+
+	                // Compute next LFSR
+	                if (LFSR & 0x80) {
+	                    // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
+	                    LFSR = (LFSR << 1) ^ 0x71;
+	                } else {
+	                    LFSR <<= 1;
+	                }
+	            }
+
+	            ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
+	        }
+	    }());
+
+	    // Reusable objects for temporary values
+	    var T = [];
+	    (function () {
+	        for (var i = 0; i < 25; i++) {
+	            T[i] = X64Word.create();
+	        }
+	    }());
+
+	    /**
+	     * SHA-3 hash algorithm.
+	     */
+	    var SHA3 = C_algo.SHA3 = Hasher.extend({
+	        /**
+	         * Configuration options.
+	         *
+	         * @property {number} outputLength
+	         *   The desired number of bits in the output hash.
+	         *   Only values permitted are: 224, 256, 384, 512.
+	         *   Default: 512
+	         */
+	        cfg: Hasher.cfg.extend({
+	            outputLength: 512
+	        }),
+
+	        _doReset: function () {
+	            var state = this._state = []
+	            for (var i = 0; i < 25; i++) {
+	                state[i] = new X64Word.init();
+	            }
+
+	            this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcuts
+	            var state = this._state;
+	            var nBlockSizeLanes = this.blockSize / 2;
+
+	            // Absorb
+	            for (var i = 0; i < nBlockSizeLanes; i++) {
+	                // Shortcuts
+	                var M2i  = M[offset + 2 * i];
+	                var M2i1 = M[offset + 2 * i + 1];
+
+	                // Swap endian
+	                M2i = (
+	                    (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |
+	                    (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)
+	                );
+	                M2i1 = (
+	                    (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |
+	                    (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)
+	                );
+
+	                // Absorb message into state
+	                var lane = state[i];
+	                lane.high ^= M2i1;
+	                lane.low  ^= M2i;
+	            }
+
+	            // Rounds
+	            for (var round = 0; round < 24; round++) {
+	                // Theta
+	                for (var x = 0; x < 5; x++) {
+	                    // Mix column lanes
+	                    var tMsw = 0, tLsw = 0;
+	                    for (var y = 0; y < 5; y++) {
+	                        var lane = state[x + 5 * y];
+	                        tMsw ^= lane.high;
+	                        tLsw ^= lane.low;
+	                    }
+
+	                    // Temporary values
+	                    var Tx = T[x];
+	                    Tx.high = tMsw;
+	                    Tx.low  = tLsw;
+	                }
+	                for (var x = 0; x < 5; x++) {
+	                    // Shortcuts
+	                    var Tx4 = T[(x + 4) % 5];
+	                    var Tx1 = T[(x + 1) % 5];
+	                    var Tx1Msw = Tx1.high;
+	                    var Tx1Lsw = Tx1.low;
+
+	                    // Mix surrounding columns
+	                    var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
+	                    var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
+	                    for (var y = 0; y < 5; y++) {
+	                        var lane = state[x + 5 * y];
+	                        lane.high ^= tMsw;
+	                        lane.low  ^= tLsw;
+	                    }
+	                }
+
+	                // Rho Pi
+	                for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
+	                    var tMsw;
+	                    var tLsw;
+
+	                    // Shortcuts
+	                    var lane = state[laneIndex];
+	                    var laneMsw = lane.high;
+	                    var laneLsw = lane.low;
+	                    var rhoOffset = RHO_OFFSETS[laneIndex];
+
+	                    // Rotate lanes
+	                    if (rhoOffset < 32) {
+	                        tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
+	                        tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
+	                    } else /* if (rhoOffset >= 32) */ {
+	                        tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
+	                        tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
+	                    }
+
+	                    // Transpose lanes
+	                    var TPiLane = T[PI_INDEXES[laneIndex]];
+	                    TPiLane.high = tMsw;
+	                    TPiLane.low  = tLsw;
+	                }
+
+	                // Rho pi at x = y = 0
+	                var T0 = T[0];
+	                var state0 = state[0];
+	                T0.high = state0.high;
+	                T0.low  = state0.low;
+
+	                // Chi
+	                for (var x = 0; x < 5; x++) {
+	                    for (var y = 0; y < 5; y++) {
+	                        // Shortcuts
+	                        var laneIndex = x + 5 * y;
+	                        var lane = state[laneIndex];
+	                        var TLane = T[laneIndex];
+	                        var Tx1Lane = T[((x + 1) % 5) + 5 * y];
+	                        var Tx2Lane = T[((x + 2) % 5) + 5 * y];
+
+	                        // Mix rows
+	                        lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
+	                        lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);
+	                    }
+	                }
+
+	                // Iota
+	                var lane = state[0];
+	                var roundConstant = ROUND_CONSTANTS[round];
+	                lane.high ^= roundConstant.high;
+	                lane.low  ^= roundConstant.low;
+	            }
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+	            var blockSizeBits = this.blockSize * 32;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
+	            dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
+	            data.sigBytes = dataWords.length * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Shortcuts
+	            var state = this._state;
+	            var outputLengthBytes = this.cfg.outputLength / 8;
+	            var outputLengthLanes = outputLengthBytes / 8;
+
+	            // Squeeze
+	            var hashWords = [];
+	            for (var i = 0; i < outputLengthLanes; i++) {
+	                // Shortcuts
+	                var lane = state[i];
+	                var laneMsw = lane.high;
+	                var laneLsw = lane.low;
+
+	                // Swap endian
+	                laneMsw = (
+	                    (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |
+	                    (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)
+	                );
+	                laneLsw = (
+	                    (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |
+	                    (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)
+	                );
+
+	                // Squeeze state to retrieve hash
+	                hashWords.push(laneLsw);
+	                hashWords.push(laneMsw);
+	            }
+
+	            // Return final computed hash
+	            return new WordArray.init(hashWords, outputLengthBytes);
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+
+	            var state = clone._state = this._state.slice(0);
+	            for (var i = 0; i < 25; i++) {
+	                state[i] = state[i].clone();
+	            }
+
+	            return clone;
+	        }
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA3('message');
+	     *     var hash = CryptoJS.SHA3(wordArray);
+	     */
+	    C.SHA3 = Hasher._createHelper(SHA3);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA3(message, key);
+	     */
+	    C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
+	}(Math));
+
+
+	return CryptoJS.SHA3;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/sha384.js b/management/guns-admin/src/main/webapp/static/crypto-js/sha384.js
new file mode 100644
index 0000000..a0b95bf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/sha384.js
@@ -0,0 +1,83 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./x64-core", "./sha512"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_x64 = C.x64;
+	    var X64Word = C_x64.Word;
+	    var X64WordArray = C_x64.WordArray;
+	    var C_algo = C.algo;
+	    var SHA512 = C_algo.SHA512;
+
+	    /**
+	     * SHA-384 hash algorithm.
+	     */
+	    var SHA384 = C_algo.SHA384 = SHA512.extend({
+	        _doReset: function () {
+	            this._hash = new X64WordArray.init([
+	                new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
+	                new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
+	                new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
+	                new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
+	            ]);
+	        },
+
+	        _doFinalize: function () {
+	            var hash = SHA512._doFinalize.call(this);
+
+	            hash.sigBytes -= 16;
+
+	            return hash;
+	        }
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA384('message');
+	     *     var hash = CryptoJS.SHA384(wordArray);
+	     */
+	    C.SHA384 = SHA512._createHelper(SHA384);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA384(message, key);
+	     */
+	    C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
+	}());
+
+
+	return CryptoJS.SHA384;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/sha512.js b/management/guns-admin/src/main/webapp/static/crypto-js/sha512.js
new file mode 100644
index 0000000..d274ab0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/sha512.js
@@ -0,0 +1,326 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./x64-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./x64-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Hasher = C_lib.Hasher;
+	    var C_x64 = C.x64;
+	    var X64Word = C_x64.Word;
+	    var X64WordArray = C_x64.WordArray;
+	    var C_algo = C.algo;
+
+	    function X64Word_create() {
+	        return X64Word.create.apply(X64Word, arguments);
+	    }
+
+	    // Constants
+	    var K = [
+	        X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
+	        X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
+	        X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
+	        X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
+	        X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
+	        X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
+	        X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
+	        X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
+	        X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
+	        X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
+	        X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
+	        X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
+	        X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
+	        X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
+	        X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
+	        X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
+	        X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
+	        X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
+	        X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
+	        X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
+	        X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
+	        X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
+	        X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
+	        X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
+	        X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
+	        X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
+	        X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
+	        X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
+	        X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
+	        X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
+	        X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
+	        X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
+	        X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
+	        X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
+	        X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
+	        X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
+	        X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
+	        X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
+	        X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
+	        X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
+	    ];
+
+	    // Reusable objects
+	    var W = [];
+	    (function () {
+	        for (var i = 0; i < 80; i++) {
+	            W[i] = X64Word_create();
+	        }
+	    }());
+
+	    /**
+	     * SHA-512 hash algorithm.
+	     */
+	    var SHA512 = C_algo.SHA512 = Hasher.extend({
+	        _doReset: function () {
+	            this._hash = new X64WordArray.init([
+	                new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
+	                new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
+	                new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
+	                new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
+	            ]);
+	        },
+
+	        _doProcessBlock: function (M, offset) {
+	            // Shortcuts
+	            var H = this._hash.words;
+
+	            var H0 = H[0];
+	            var H1 = H[1];
+	            var H2 = H[2];
+	            var H3 = H[3];
+	            var H4 = H[4];
+	            var H5 = H[5];
+	            var H6 = H[6];
+	            var H7 = H[7];
+
+	            var H0h = H0.high;
+	            var H0l = H0.low;
+	            var H1h = H1.high;
+	            var H1l = H1.low;
+	            var H2h = H2.high;
+	            var H2l = H2.low;
+	            var H3h = H3.high;
+	            var H3l = H3.low;
+	            var H4h = H4.high;
+	            var H4l = H4.low;
+	            var H5h = H5.high;
+	            var H5l = H5.low;
+	            var H6h = H6.high;
+	            var H6l = H6.low;
+	            var H7h = H7.high;
+	            var H7l = H7.low;
+
+	            // Working variables
+	            var ah = H0h;
+	            var al = H0l;
+	            var bh = H1h;
+	            var bl = H1l;
+	            var ch = H2h;
+	            var cl = H2l;
+	            var dh = H3h;
+	            var dl = H3l;
+	            var eh = H4h;
+	            var el = H4l;
+	            var fh = H5h;
+	            var fl = H5l;
+	            var gh = H6h;
+	            var gl = H6l;
+	            var hh = H7h;
+	            var hl = H7l;
+
+	            // Rounds
+	            for (var i = 0; i < 80; i++) {
+	                var Wil;
+	                var Wih;
+
+	                // Shortcut
+	                var Wi = W[i];
+
+	                // Extend message
+	                if (i < 16) {
+	                    Wih = Wi.high = M[offset + i * 2]     | 0;
+	                    Wil = Wi.low  = M[offset + i * 2 + 1] | 0;
+	                } else {
+	                    // Gamma0
+	                    var gamma0x  = W[i - 15];
+	                    var gamma0xh = gamma0x.high;
+	                    var gamma0xl = gamma0x.low;
+	                    var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
+	                    var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
+
+	                    // Gamma1
+	                    var gamma1x  = W[i - 2];
+	                    var gamma1xh = gamma1x.high;
+	                    var gamma1xl = gamma1x.low;
+	                    var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
+	                    var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
+
+	                    // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
+	                    var Wi7  = W[i - 7];
+	                    var Wi7h = Wi7.high;
+	                    var Wi7l = Wi7.low;
+
+	                    var Wi16  = W[i - 16];
+	                    var Wi16h = Wi16.high;
+	                    var Wi16l = Wi16.low;
+
+	                    Wil = gamma0l + Wi7l;
+	                    Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
+	                    Wil = Wil + gamma1l;
+	                    Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
+	                    Wil = Wil + Wi16l;
+	                    Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
+
+	                    Wi.high = Wih;
+	                    Wi.low  = Wil;
+	                }
+
+	                var chh  = (eh & fh) ^ (~eh & gh);
+	                var chl  = (el & fl) ^ (~el & gl);
+	                var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
+	                var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
+
+	                var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
+	                var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
+	                var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
+	                var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
+
+	                // t1 = h + sigma1 + ch + K[i] + W[i]
+	                var Ki  = K[i];
+	                var Kih = Ki.high;
+	                var Kil = Ki.low;
+
+	                var t1l = hl + sigma1l;
+	                var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
+	                var t1l = t1l + chl;
+	                var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
+	                var t1l = t1l + Kil;
+	                var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
+	                var t1l = t1l + Wil;
+	                var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
+
+	                // t2 = sigma0 + maj
+	                var t2l = sigma0l + majl;
+	                var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
+
+	                // Update working variables
+	                hh = gh;
+	                hl = gl;
+	                gh = fh;
+	                gl = fl;
+	                fh = eh;
+	                fl = el;
+	                el = (dl + t1l) | 0;
+	                eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
+	                dh = ch;
+	                dl = cl;
+	                ch = bh;
+	                cl = bl;
+	                bh = ah;
+	                bl = al;
+	                al = (t1l + t2l) | 0;
+	                ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
+	            }
+
+	            // Intermediate hash value
+	            H0l = H0.low  = (H0l + al);
+	            H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
+	            H1l = H1.low  = (H1l + bl);
+	            H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
+	            H2l = H2.low  = (H2l + cl);
+	            H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
+	            H3l = H3.low  = (H3l + dl);
+	            H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
+	            H4l = H4.low  = (H4l + el);
+	            H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
+	            H5l = H5.low  = (H5l + fl);
+	            H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
+	            H6l = H6.low  = (H6l + gl);
+	            H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
+	            H7l = H7.low  = (H7l + hl);
+	            H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
+	        },
+
+	        _doFinalize: function () {
+	            // Shortcuts
+	            var data = this._data;
+	            var dataWords = data.words;
+
+	            var nBitsTotal = this._nDataBytes * 8;
+	            var nBitsLeft = data.sigBytes * 8;
+
+	            // Add padding
+	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
+	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
+	            data.sigBytes = dataWords.length * 4;
+
+	            // Hash final blocks
+	            this._process();
+
+	            // Convert hash to 32-bit word array before returning
+	            var hash = this._hash.toX32();
+
+	            // Return final computed hash
+	            return hash;
+	        },
+
+	        clone: function () {
+	            var clone = Hasher.clone.call(this);
+	            clone._hash = this._hash.clone();
+
+	            return clone;
+	        },
+
+	        blockSize: 1024/32
+	    });
+
+	    /**
+	     * Shortcut function to the hasher's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     *
+	     * @return {WordArray} The hash.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hash = CryptoJS.SHA512('message');
+	     *     var hash = CryptoJS.SHA512(wordArray);
+	     */
+	    C.SHA512 = Hasher._createHelper(SHA512);
+
+	    /**
+	     * Shortcut function to the HMAC's object interface.
+	     *
+	     * @param {WordArray|string} message The message to hash.
+	     * @param {WordArray|string} key The secret key.
+	     *
+	     * @return {WordArray} The HMAC.
+	     *
+	     * @static
+	     *
+	     * @example
+	     *
+	     *     var hmac = CryptoJS.HmacSHA512(message, key);
+	     */
+	    C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
+	}());
+
+
+	return CryptoJS.SHA512;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/tripledes.js b/management/guns-admin/src/main/webapp/static/crypto-js/tripledes.js
new file mode 100644
index 0000000..1a92477
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/tripledes.js
@@ -0,0 +1,779 @@
+;(function (root, factory, undef) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function () {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var WordArray = C_lib.WordArray;
+	    var BlockCipher = C_lib.BlockCipher;
+	    var C_algo = C.algo;
+
+	    // Permuted Choice 1 constants
+	    var PC1 = [
+	        57, 49, 41, 33, 25, 17, 9,  1,
+	        58, 50, 42, 34, 26, 18, 10, 2,
+	        59, 51, 43, 35, 27, 19, 11, 3,
+	        60, 52, 44, 36, 63, 55, 47, 39,
+	        31, 23, 15, 7,  62, 54, 46, 38,
+	        30, 22, 14, 6,  61, 53, 45, 37,
+	        29, 21, 13, 5,  28, 20, 12, 4
+	    ];
+
+	    // Permuted Choice 2 constants
+	    var PC2 = [
+	        14, 17, 11, 24, 1,  5,
+	        3,  28, 15, 6,  21, 10,
+	        23, 19, 12, 4,  26, 8,
+	        16, 7,  27, 20, 13, 2,
+	        41, 52, 31, 37, 47, 55,
+	        30, 40, 51, 45, 33, 48,
+	        44, 49, 39, 56, 34, 53,
+	        46, 42, 50, 36, 29, 32
+	    ];
+
+	    // Cumulative bit shift constants
+	    var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
+
+	    // SBOXes and round permutation constants
+	    var SBOX_P = [
+	        {
+	            0x0: 0x808200,
+	            0x10000000: 0x8000,
+	            0x20000000: 0x808002,
+	            0x30000000: 0x2,
+	            0x40000000: 0x200,
+	            0x50000000: 0x808202,
+	            0x60000000: 0x800202,
+	            0x70000000: 0x800000,
+	            0x80000000: 0x202,
+	            0x90000000: 0x800200,
+	            0xa0000000: 0x8200,
+	            0xb0000000: 0x808000,
+	            0xc0000000: 0x8002,
+	            0xd0000000: 0x800002,
+	            0xe0000000: 0x0,
+	            0xf0000000: 0x8202,
+	            0x8000000: 0x0,
+	            0x18000000: 0x808202,
+	            0x28000000: 0x8202,
+	            0x38000000: 0x8000,
+	            0x48000000: 0x808200,
+	            0x58000000: 0x200,
+	            0x68000000: 0x808002,
+	            0x78000000: 0x2,
+	            0x88000000: 0x800200,
+	            0x98000000: 0x8200,
+	            0xa8000000: 0x808000,
+	            0xb8000000: 0x800202,
+	            0xc8000000: 0x800002,
+	            0xd8000000: 0x8002,
+	            0xe8000000: 0x202,
+	            0xf8000000: 0x800000,
+	            0x1: 0x8000,
+	            0x10000001: 0x2,
+	            0x20000001: 0x808200,
+	            0x30000001: 0x800000,
+	            0x40000001: 0x808002,
+	            0x50000001: 0x8200,
+	            0x60000001: 0x200,
+	            0x70000001: 0x800202,
+	            0x80000001: 0x808202,
+	            0x90000001: 0x808000,
+	            0xa0000001: 0x800002,
+	            0xb0000001: 0x8202,
+	            0xc0000001: 0x202,
+	            0xd0000001: 0x800200,
+	            0xe0000001: 0x8002,
+	            0xf0000001: 0x0,
+	            0x8000001: 0x808202,
+	            0x18000001: 0x808000,
+	            0x28000001: 0x800000,
+	            0x38000001: 0x200,
+	            0x48000001: 0x8000,
+	            0x58000001: 0x800002,
+	            0x68000001: 0x2,
+	            0x78000001: 0x8202,
+	            0x88000001: 0x8002,
+	            0x98000001: 0x800202,
+	            0xa8000001: 0x202,
+	            0xb8000001: 0x808200,
+	            0xc8000001: 0x800200,
+	            0xd8000001: 0x0,
+	            0xe8000001: 0x8200,
+	            0xf8000001: 0x808002
+	        },
+	        {
+	            0x0: 0x40084010,
+	            0x1000000: 0x4000,
+	            0x2000000: 0x80000,
+	            0x3000000: 0x40080010,
+	            0x4000000: 0x40000010,
+	            0x5000000: 0x40084000,
+	            0x6000000: 0x40004000,
+	            0x7000000: 0x10,
+	            0x8000000: 0x84000,
+	            0x9000000: 0x40004010,
+	            0xa000000: 0x40000000,
+	            0xb000000: 0x84010,
+	            0xc000000: 0x80010,
+	            0xd000000: 0x0,
+	            0xe000000: 0x4010,
+	            0xf000000: 0x40080000,
+	            0x800000: 0x40004000,
+	            0x1800000: 0x84010,
+	            0x2800000: 0x10,
+	            0x3800000: 0x40004010,
+	            0x4800000: 0x40084010,
+	            0x5800000: 0x40000000,
+	            0x6800000: 0x80000,
+	            0x7800000: 0x40080010,
+	            0x8800000: 0x80010,
+	            0x9800000: 0x0,
+	            0xa800000: 0x4000,
+	            0xb800000: 0x40080000,
+	            0xc800000: 0x40000010,
+	            0xd800000: 0x84000,
+	            0xe800000: 0x40084000,
+	            0xf800000: 0x4010,
+	            0x10000000: 0x0,
+	            0x11000000: 0x40080010,
+	            0x12000000: 0x40004010,
+	            0x13000000: 0x40084000,
+	            0x14000000: 0x40080000,
+	            0x15000000: 0x10,
+	            0x16000000: 0x84010,
+	            0x17000000: 0x4000,
+	            0x18000000: 0x4010,
+	            0x19000000: 0x80000,
+	            0x1a000000: 0x80010,
+	            0x1b000000: 0x40000010,
+	            0x1c000000: 0x84000,
+	            0x1d000000: 0x40004000,
+	            0x1e000000: 0x40000000,
+	            0x1f000000: 0x40084010,
+	            0x10800000: 0x84010,
+	            0x11800000: 0x80000,
+	            0x12800000: 0x40080000,
+	            0x13800000: 0x4000,
+	            0x14800000: 0x40004000,
+	            0x15800000: 0x40084010,
+	            0x16800000: 0x10,
+	            0x17800000: 0x40000000,
+	            0x18800000: 0x40084000,
+	            0x19800000: 0x40000010,
+	            0x1a800000: 0x40004010,
+	            0x1b800000: 0x80010,
+	            0x1c800000: 0x0,
+	            0x1d800000: 0x4010,
+	            0x1e800000: 0x40080010,
+	            0x1f800000: 0x84000
+	        },
+	        {
+	            0x0: 0x104,
+	            0x100000: 0x0,
+	            0x200000: 0x4000100,
+	            0x300000: 0x10104,
+	            0x400000: 0x10004,
+	            0x500000: 0x4000004,
+	            0x600000: 0x4010104,
+	            0x700000: 0x4010000,
+	            0x800000: 0x4000000,
+	            0x900000: 0x4010100,
+	            0xa00000: 0x10100,
+	            0xb00000: 0x4010004,
+	            0xc00000: 0x4000104,
+	            0xd00000: 0x10000,
+	            0xe00000: 0x4,
+	            0xf00000: 0x100,
+	            0x80000: 0x4010100,
+	            0x180000: 0x4010004,
+	            0x280000: 0x0,
+	            0x380000: 0x4000100,
+	            0x480000: 0x4000004,
+	            0x580000: 0x10000,
+	            0x680000: 0x10004,
+	            0x780000: 0x104,
+	            0x880000: 0x4,
+	            0x980000: 0x100,
+	            0xa80000: 0x4010000,
+	            0xb80000: 0x10104,
+	            0xc80000: 0x10100,
+	            0xd80000: 0x4000104,
+	            0xe80000: 0x4010104,
+	            0xf80000: 0x4000000,
+	            0x1000000: 0x4010100,
+	            0x1100000: 0x10004,
+	            0x1200000: 0x10000,
+	            0x1300000: 0x4000100,
+	            0x1400000: 0x100,
+	            0x1500000: 0x4010104,
+	            0x1600000: 0x4000004,
+	            0x1700000: 0x0,
+	            0x1800000: 0x4000104,
+	            0x1900000: 0x4000000,
+	            0x1a00000: 0x4,
+	            0x1b00000: 0x10100,
+	            0x1c00000: 0x4010000,
+	            0x1d00000: 0x104,
+	            0x1e00000: 0x10104,
+	            0x1f00000: 0x4010004,
+	            0x1080000: 0x4000000,
+	            0x1180000: 0x104,
+	            0x1280000: 0x4010100,
+	            0x1380000: 0x0,
+	            0x1480000: 0x10004,
+	            0x1580000: 0x4000100,
+	            0x1680000: 0x100,
+	            0x1780000: 0x4010004,
+	            0x1880000: 0x10000,
+	            0x1980000: 0x4010104,
+	            0x1a80000: 0x10104,
+	            0x1b80000: 0x4000004,
+	            0x1c80000: 0x4000104,
+	            0x1d80000: 0x4010000,
+	            0x1e80000: 0x4,
+	            0x1f80000: 0x10100
+	        },
+	        {
+	            0x0: 0x80401000,
+	            0x10000: 0x80001040,
+	            0x20000: 0x401040,
+	            0x30000: 0x80400000,
+	            0x40000: 0x0,
+	            0x50000: 0x401000,
+	            0x60000: 0x80000040,
+	            0x70000: 0x400040,
+	            0x80000: 0x80000000,
+	            0x90000: 0x400000,
+	            0xa0000: 0x40,
+	            0xb0000: 0x80001000,
+	            0xc0000: 0x80400040,
+	            0xd0000: 0x1040,
+	            0xe0000: 0x1000,
+	            0xf0000: 0x80401040,
+	            0x8000: 0x80001040,
+	            0x18000: 0x40,
+	            0x28000: 0x80400040,
+	            0x38000: 0x80001000,
+	            0x48000: 0x401000,
+	            0x58000: 0x80401040,
+	            0x68000: 0x0,
+	            0x78000: 0x80400000,
+	            0x88000: 0x1000,
+	            0x98000: 0x80401000,
+	            0xa8000: 0x400000,
+	            0xb8000: 0x1040,
+	            0xc8000: 0x80000000,
+	            0xd8000: 0x400040,
+	            0xe8000: 0x401040,
+	            0xf8000: 0x80000040,
+	            0x100000: 0x400040,
+	            0x110000: 0x401000,
+	            0x120000: 0x80000040,
+	            0x130000: 0x0,
+	            0x140000: 0x1040,
+	            0x150000: 0x80400040,
+	            0x160000: 0x80401000,
+	            0x170000: 0x80001040,
+	            0x180000: 0x80401040,
+	            0x190000: 0x80000000,
+	            0x1a0000: 0x80400000,
+	            0x1b0000: 0x401040,
+	            0x1c0000: 0x80001000,
+	            0x1d0000: 0x400000,
+	            0x1e0000: 0x40,
+	            0x1f0000: 0x1000,
+	            0x108000: 0x80400000,
+	            0x118000: 0x80401040,
+	            0x128000: 0x0,
+	            0x138000: 0x401000,
+	            0x148000: 0x400040,
+	            0x158000: 0x80000000,
+	            0x168000: 0x80001040,
+	            0x178000: 0x40,
+	            0x188000: 0x80000040,
+	            0x198000: 0x1000,
+	            0x1a8000: 0x80001000,
+	            0x1b8000: 0x80400040,
+	            0x1c8000: 0x1040,
+	            0x1d8000: 0x80401000,
+	            0x1e8000: 0x400000,
+	            0x1f8000: 0x401040
+	        },
+	        {
+	            0x0: 0x80,
+	            0x1000: 0x1040000,
+	            0x2000: 0x40000,
+	            0x3000: 0x20000000,
+	            0x4000: 0x20040080,
+	            0x5000: 0x1000080,
+	            0x6000: 0x21000080,
+	            0x7000: 0x40080,
+	            0x8000: 0x1000000,
+	            0x9000: 0x20040000,
+	            0xa000: 0x20000080,
+	            0xb000: 0x21040080,
+	            0xc000: 0x21040000,
+	            0xd000: 0x0,
+	            0xe000: 0x1040080,
+	            0xf000: 0x21000000,
+	            0x800: 0x1040080,
+	            0x1800: 0x21000080,
+	            0x2800: 0x80,
+	            0x3800: 0x1040000,
+	            0x4800: 0x40000,
+	            0x5800: 0x20040080,
+	            0x6800: 0x21040000,
+	            0x7800: 0x20000000,
+	            0x8800: 0x20040000,
+	            0x9800: 0x0,
+	            0xa800: 0x21040080,
+	            0xb800: 0x1000080,
+	            0xc800: 0x20000080,
+	            0xd800: 0x21000000,
+	            0xe800: 0x1000000,
+	            0xf800: 0x40080,
+	            0x10000: 0x40000,
+	            0x11000: 0x80,
+	            0x12000: 0x20000000,
+	            0x13000: 0x21000080,
+	            0x14000: 0x1000080,
+	            0x15000: 0x21040000,
+	            0x16000: 0x20040080,
+	            0x17000: 0x1000000,
+	            0x18000: 0x21040080,
+	            0x19000: 0x21000000,
+	            0x1a000: 0x1040000,
+	            0x1b000: 0x20040000,
+	            0x1c000: 0x40080,
+	            0x1d000: 0x20000080,
+	            0x1e000: 0x0,
+	            0x1f000: 0x1040080,
+	            0x10800: 0x21000080,
+	            0x11800: 0x1000000,
+	            0x12800: 0x1040000,
+	            0x13800: 0x20040080,
+	            0x14800: 0x20000000,
+	            0x15800: 0x1040080,
+	            0x16800: 0x80,
+	            0x17800: 0x21040000,
+	            0x18800: 0x40080,
+	            0x19800: 0x21040080,
+	            0x1a800: 0x0,
+	            0x1b800: 0x21000000,
+	            0x1c800: 0x1000080,
+	            0x1d800: 0x40000,
+	            0x1e800: 0x20040000,
+	            0x1f800: 0x20000080
+	        },
+	        {
+	            0x0: 0x10000008,
+	            0x100: 0x2000,
+	            0x200: 0x10200000,
+	            0x300: 0x10202008,
+	            0x400: 0x10002000,
+	            0x500: 0x200000,
+	            0x600: 0x200008,
+	            0x700: 0x10000000,
+	            0x800: 0x0,
+	            0x900: 0x10002008,
+	            0xa00: 0x202000,
+	            0xb00: 0x8,
+	            0xc00: 0x10200008,
+	            0xd00: 0x202008,
+	            0xe00: 0x2008,
+	            0xf00: 0x10202000,
+	            0x80: 0x10200000,
+	            0x180: 0x10202008,
+	            0x280: 0x8,
+	            0x380: 0x200000,
+	            0x480: 0x202008,
+	            0x580: 0x10000008,
+	            0x680: 0x10002000,
+	            0x780: 0x2008,
+	            0x880: 0x200008,
+	            0x980: 0x2000,
+	            0xa80: 0x10002008,
+	            0xb80: 0x10200008,
+	            0xc80: 0x0,
+	            0xd80: 0x10202000,
+	            0xe80: 0x202000,
+	            0xf80: 0x10000000,
+	            0x1000: 0x10002000,
+	            0x1100: 0x10200008,
+	            0x1200: 0x10202008,
+	            0x1300: 0x2008,
+	            0x1400: 0x200000,
+	            0x1500: 0x10000000,
+	            0x1600: 0x10000008,
+	            0x1700: 0x202000,
+	            0x1800: 0x202008,
+	            0x1900: 0x0,
+	            0x1a00: 0x8,
+	            0x1b00: 0x10200000,
+	            0x1c00: 0x2000,
+	            0x1d00: 0x10002008,
+	            0x1e00: 0x10202000,
+	            0x1f00: 0x200008,
+	            0x1080: 0x8,
+	            0x1180: 0x202000,
+	            0x1280: 0x200000,
+	            0x1380: 0x10000008,
+	            0x1480: 0x10002000,
+	            0x1580: 0x2008,
+	            0x1680: 0x10202008,
+	            0x1780: 0x10200000,
+	            0x1880: 0x10202000,
+	            0x1980: 0x10200008,
+	            0x1a80: 0x2000,
+	            0x1b80: 0x202008,
+	            0x1c80: 0x200008,
+	            0x1d80: 0x0,
+	            0x1e80: 0x10000000,
+	            0x1f80: 0x10002008
+	        },
+	        {
+	            0x0: 0x100000,
+	            0x10: 0x2000401,
+	            0x20: 0x400,
+	            0x30: 0x100401,
+	            0x40: 0x2100401,
+	            0x50: 0x0,
+	            0x60: 0x1,
+	            0x70: 0x2100001,
+	            0x80: 0x2000400,
+	            0x90: 0x100001,
+	            0xa0: 0x2000001,
+	            0xb0: 0x2100400,
+	            0xc0: 0x2100000,
+	            0xd0: 0x401,
+	            0xe0: 0x100400,
+	            0xf0: 0x2000000,
+	            0x8: 0x2100001,
+	            0x18: 0x0,
+	            0x28: 0x2000401,
+	            0x38: 0x2100400,
+	            0x48: 0x100000,
+	            0x58: 0x2000001,
+	            0x68: 0x2000000,
+	            0x78: 0x401,
+	            0x88: 0x100401,
+	            0x98: 0x2000400,
+	            0xa8: 0x2100000,
+	            0xb8: 0x100001,
+	            0xc8: 0x400,
+	            0xd8: 0x2100401,
+	            0xe8: 0x1,
+	            0xf8: 0x100400,
+	            0x100: 0x2000000,
+	            0x110: 0x100000,
+	            0x120: 0x2000401,
+	            0x130: 0x2100001,
+	            0x140: 0x100001,
+	            0x150: 0x2000400,
+	            0x160: 0x2100400,
+	            0x170: 0x100401,
+	            0x180: 0x401,
+	            0x190: 0x2100401,
+	            0x1a0: 0x100400,
+	            0x1b0: 0x1,
+	            0x1c0: 0x0,
+	            0x1d0: 0x2100000,
+	            0x1e0: 0x2000001,
+	            0x1f0: 0x400,
+	            0x108: 0x100400,
+	            0x118: 0x2000401,
+	            0x128: 0x2100001,
+	            0x138: 0x1,
+	            0x148: 0x2000000,
+	            0x158: 0x100000,
+	            0x168: 0x401,
+	            0x178: 0x2100400,
+	            0x188: 0x2000001,
+	            0x198: 0x2100000,
+	            0x1a8: 0x0,
+	            0x1b8: 0x2100401,
+	            0x1c8: 0x100401,
+	            0x1d8: 0x400,
+	            0x1e8: 0x2000400,
+	            0x1f8: 0x100001
+	        },
+	        {
+	            0x0: 0x8000820,
+	            0x1: 0x20000,
+	            0x2: 0x8000000,
+	            0x3: 0x20,
+	            0x4: 0x20020,
+	            0x5: 0x8020820,
+	            0x6: 0x8020800,
+	            0x7: 0x800,
+	            0x8: 0x8020000,
+	            0x9: 0x8000800,
+	            0xa: 0x20800,
+	            0xb: 0x8020020,
+	            0xc: 0x820,
+	            0xd: 0x0,
+	            0xe: 0x8000020,
+	            0xf: 0x20820,
+	            0x80000000: 0x800,
+	            0x80000001: 0x8020820,
+	            0x80000002: 0x8000820,
+	            0x80000003: 0x8000000,
+	            0x80000004: 0x8020000,
+	            0x80000005: 0x20800,
+	            0x80000006: 0x20820,
+	            0x80000007: 0x20,
+	            0x80000008: 0x8000020,
+	            0x80000009: 0x820,
+	            0x8000000a: 0x20020,
+	            0x8000000b: 0x8020800,
+	            0x8000000c: 0x0,
+	            0x8000000d: 0x8020020,
+	            0x8000000e: 0x8000800,
+	            0x8000000f: 0x20000,
+	            0x10: 0x20820,
+	            0x11: 0x8020800,
+	            0x12: 0x20,
+	            0x13: 0x800,
+	            0x14: 0x8000800,
+	            0x15: 0x8000020,
+	            0x16: 0x8020020,
+	            0x17: 0x20000,
+	            0x18: 0x0,
+	            0x19: 0x20020,
+	            0x1a: 0x8020000,
+	            0x1b: 0x8000820,
+	            0x1c: 0x8020820,
+	            0x1d: 0x20800,
+	            0x1e: 0x820,
+	            0x1f: 0x8000000,
+	            0x80000010: 0x20000,
+	            0x80000011: 0x800,
+	            0x80000012: 0x8020020,
+	            0x80000013: 0x20820,
+	            0x80000014: 0x20,
+	            0x80000015: 0x8020000,
+	            0x80000016: 0x8000000,
+	            0x80000017: 0x8000820,
+	            0x80000018: 0x8020820,
+	            0x80000019: 0x8000020,
+	            0x8000001a: 0x8000800,
+	            0x8000001b: 0x0,
+	            0x8000001c: 0x20800,
+	            0x8000001d: 0x820,
+	            0x8000001e: 0x20020,
+	            0x8000001f: 0x8020800
+	        }
+	    ];
+
+	    // Masks that select the SBOX input
+	    var SBOX_MASK = [
+	        0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
+	        0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
+	    ];
+
+	    /**
+	     * DES block cipher algorithm.
+	     */
+	    var DES = C_algo.DES = BlockCipher.extend({
+	        _doReset: function () {
+	            // Shortcuts
+	            var key = this._key;
+	            var keyWords = key.words;
+
+	            // Select 56 bits according to PC1
+	            var keyBits = [];
+	            for (var i = 0; i < 56; i++) {
+	                var keyBitPos = PC1[i] - 1;
+	                keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
+	            }
+
+	            // Assemble 16 subkeys
+	            var subKeys = this._subKeys = [];
+	            for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
+	                // Create subkey
+	                var subKey = subKeys[nSubKey] = [];
+
+	                // Shortcut
+	                var bitShift = BIT_SHIFTS[nSubKey];
+
+	                // Select 48 bits according to PC2
+	                for (var i = 0; i < 24; i++) {
+	                    // Select from the left 28 key bits
+	                    subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
+
+	                    // Select from the right 28 key bits
+	                    subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
+	                }
+
+	                // Since each subkey is applied to an expanded 32-bit input,
+	                // the subkey can be broken into 8 values scaled to 32-bits,
+	                // which allows the key to be used without expansion
+	                subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
+	                for (var i = 1; i < 7; i++) {
+	                    subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
+	                }
+	                subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
+	            }
+
+	            // Compute inverse subkeys
+	            var invSubKeys = this._invSubKeys = [];
+	            for (var i = 0; i < 16; i++) {
+	                invSubKeys[i] = subKeys[15 - i];
+	            }
+	        },
+
+	        encryptBlock: function (M, offset) {
+	            this._doCryptBlock(M, offset, this._subKeys);
+	        },
+
+	        decryptBlock: function (M, offset) {
+	            this._doCryptBlock(M, offset, this._invSubKeys);
+	        },
+
+	        _doCryptBlock: function (M, offset, subKeys) {
+	            // Get input
+	            this._lBlock = M[offset];
+	            this._rBlock = M[offset + 1];
+
+	            // Initial permutation
+	            exchangeLR.call(this, 4,  0x0f0f0f0f);
+	            exchangeLR.call(this, 16, 0x0000ffff);
+	            exchangeRL.call(this, 2,  0x33333333);
+	            exchangeRL.call(this, 8,  0x00ff00ff);
+	            exchangeLR.call(this, 1,  0x55555555);
+
+	            // Rounds
+	            for (var round = 0; round < 16; round++) {
+	                // Shortcuts
+	                var subKey = subKeys[round];
+	                var lBlock = this._lBlock;
+	                var rBlock = this._rBlock;
+
+	                // Feistel function
+	                var f = 0;
+	                for (var i = 0; i < 8; i++) {
+	                    f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
+	                }
+	                this._lBlock = rBlock;
+	                this._rBlock = lBlock ^ f;
+	            }
+
+	            // Undo swap from last round
+	            var t = this._lBlock;
+	            this._lBlock = this._rBlock;
+	            this._rBlock = t;
+
+	            // Final permutation
+	            exchangeLR.call(this, 1,  0x55555555);
+	            exchangeRL.call(this, 8,  0x00ff00ff);
+	            exchangeRL.call(this, 2,  0x33333333);
+	            exchangeLR.call(this, 16, 0x0000ffff);
+	            exchangeLR.call(this, 4,  0x0f0f0f0f);
+
+	            // Set output
+	            M[offset] = this._lBlock;
+	            M[offset + 1] = this._rBlock;
+	        },
+
+	        keySize: 64/32,
+
+	        ivSize: 64/32,
+
+	        blockSize: 64/32
+	    });
+
+	    // Swap bits across the left and right words
+	    function exchangeLR(offset, mask) {
+	        var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
+	        this._rBlock ^= t;
+	        this._lBlock ^= t << offset;
+	    }
+
+	    function exchangeRL(offset, mask) {
+	        var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
+	        this._lBlock ^= t;
+	        this._rBlock ^= t << offset;
+	    }
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);
+	     */
+	    C.DES = BlockCipher._createHelper(DES);
+
+	    /**
+	     * Triple-DES block cipher algorithm.
+	     */
+	    var TripleDES = C_algo.TripleDES = BlockCipher.extend({
+	        _doReset: function () {
+	            // Shortcuts
+	            var key = this._key;
+	            var keyWords = key.words;
+	            // Make sure the key length is valid (64, 128 or >= 192 bit)
+	            if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {
+	                throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');
+	            }
+
+	            // Extend the key according to the keying options defined in 3DES standard
+	            var key1 = keyWords.slice(0, 2);
+	            var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);
+	            var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);
+
+	            // Create DES instances
+	            this._des1 = DES.createEncryptor(WordArray.create(key1));
+	            this._des2 = DES.createEncryptor(WordArray.create(key2));
+	            this._des3 = DES.createEncryptor(WordArray.create(key3));
+	        },
+
+	        encryptBlock: function (M, offset) {
+	            this._des1.encryptBlock(M, offset);
+	            this._des2.decryptBlock(M, offset);
+	            this._des3.encryptBlock(M, offset);
+	        },
+
+	        decryptBlock: function (M, offset) {
+	            this._des3.decryptBlock(M, offset);
+	            this._des2.encryptBlock(M, offset);
+	            this._des1.decryptBlock(M, offset);
+	        },
+
+	        keySize: 192/32,
+
+	        ivSize: 64/32,
+
+	        blockSize: 64/32
+	    });
+
+	    /**
+	     * Shortcut functions to the cipher's object interface.
+	     *
+	     * @example
+	     *
+	     *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
+	     *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
+	     */
+	    C.TripleDES = BlockCipher._createHelper(TripleDES);
+	}());
+
+
+	return CryptoJS.TripleDES;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/crypto-js/x64-core.js b/management/guns-admin/src/main/webapp/static/crypto-js/x64-core.js
new file mode 100644
index 0000000..57dcc14
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/crypto-js/x64-core.js
@@ -0,0 +1,304 @@
+;(function (root, factory) {
+	if (typeof exports === "object") {
+		// CommonJS
+		module.exports = exports = factory(require("./core"));
+	}
+	else if (typeof define === "function" && define.amd) {
+		// AMD
+		define(["./core"], factory);
+	}
+	else {
+		// Global (browser)
+		factory(root.CryptoJS);
+	}
+}(this, function (CryptoJS) {
+
+	(function (undefined) {
+	    // Shortcuts
+	    var C = CryptoJS;
+	    var C_lib = C.lib;
+	    var Base = C_lib.Base;
+	    var X32WordArray = C_lib.WordArray;
+
+	    /**
+	     * x64 namespace.
+	     */
+	    var C_x64 = C.x64 = {};
+
+	    /**
+	     * A 64-bit word.
+	     */
+	    var X64Word = C_x64.Word = Base.extend({
+	        /**
+	         * Initializes a newly created 64-bit word.
+	         *
+	         * @param {number} high The high 32 bits.
+	         * @param {number} low The low 32 bits.
+	         *
+	         * @example
+	         *
+	         *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
+	         */
+	        init: function (high, low) {
+	            this.high = high;
+	            this.low = low;
+	        }
+
+	        /**
+	         * Bitwise NOTs this word.
+	         *
+	         * @return {X64Word} A new x64-Word object after negating.
+	         *
+	         * @example
+	         *
+	         *     var negated = x64Word.not();
+	         */
+	        // not: function () {
+	            // var high = ~this.high;
+	            // var low = ~this.low;
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Bitwise ANDs this word with the passed word.
+	         *
+	         * @param {X64Word} word The x64-Word to AND with this word.
+	         *
+	         * @return {X64Word} A new x64-Word object after ANDing.
+	         *
+	         * @example
+	         *
+	         *     var anded = x64Word.and(anotherX64Word);
+	         */
+	        // and: function (word) {
+	            // var high = this.high & word.high;
+	            // var low = this.low & word.low;
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Bitwise ORs this word with the passed word.
+	         *
+	         * @param {X64Word} word The x64-Word to OR with this word.
+	         *
+	         * @return {X64Word} A new x64-Word object after ORing.
+	         *
+	         * @example
+	         *
+	         *     var ored = x64Word.or(anotherX64Word);
+	         */
+	        // or: function (word) {
+	            // var high = this.high | word.high;
+	            // var low = this.low | word.low;
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Bitwise XORs this word with the passed word.
+	         *
+	         * @param {X64Word} word The x64-Word to XOR with this word.
+	         *
+	         * @return {X64Word} A new x64-Word object after XORing.
+	         *
+	         * @example
+	         *
+	         *     var xored = x64Word.xor(anotherX64Word);
+	         */
+	        // xor: function (word) {
+	            // var high = this.high ^ word.high;
+	            // var low = this.low ^ word.low;
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Shifts this word n bits to the left.
+	         *
+	         * @param {number} n The number of bits to shift.
+	         *
+	         * @return {X64Word} A new x64-Word object after shifting.
+	         *
+	         * @example
+	         *
+	         *     var shifted = x64Word.shiftL(25);
+	         */
+	        // shiftL: function (n) {
+	            // if (n < 32) {
+	                // var high = (this.high << n) | (this.low >>> (32 - n));
+	                // var low = this.low << n;
+	            // } else {
+	                // var high = this.low << (n - 32);
+	                // var low = 0;
+	            // }
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Shifts this word n bits to the right.
+	         *
+	         * @param {number} n The number of bits to shift.
+	         *
+	         * @return {X64Word} A new x64-Word object after shifting.
+	         *
+	         * @example
+	         *
+	         *     var shifted = x64Word.shiftR(7);
+	         */
+	        // shiftR: function (n) {
+	            // if (n < 32) {
+	                // var low = (this.low >>> n) | (this.high << (32 - n));
+	                // var high = this.high >>> n;
+	            // } else {
+	                // var low = this.high >>> (n - 32);
+	                // var high = 0;
+	            // }
+
+	            // return X64Word.create(high, low);
+	        // },
+
+	        /**
+	         * Rotates this word n bits to the left.
+	         *
+	         * @param {number} n The number of bits to rotate.
+	         *
+	         * @return {X64Word} A new x64-Word object after rotating.
+	         *
+	         * @example
+	         *
+	         *     var rotated = x64Word.rotL(25);
+	         */
+	        // rotL: function (n) {
+	            // return this.shiftL(n).or(this.shiftR(64 - n));
+	        // },
+
+	        /**
+	         * Rotates this word n bits to the right.
+	         *
+	         * @param {number} n The number of bits to rotate.
+	         *
+	         * @return {X64Word} A new x64-Word object after rotating.
+	         *
+	         * @example
+	         *
+	         *     var rotated = x64Word.rotR(7);
+	         */
+	        // rotR: function (n) {
+	            // return this.shiftR(n).or(this.shiftL(64 - n));
+	        // },
+
+	        /**
+	         * Adds this word with the passed word.
+	         *
+	         * @param {X64Word} word The x64-Word to add with this word.
+	         *
+	         * @return {X64Word} A new x64-Word object after adding.
+	         *
+	         * @example
+	         *
+	         *     var added = x64Word.add(anotherX64Word);
+	         */
+	        // add: function (word) {
+	            // var low = (this.low + word.low) | 0;
+	            // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
+	            // var high = (this.high + word.high + carry) | 0;
+
+	            // return X64Word.create(high, low);
+	        // }
+	    });
+
+	    /**
+	     * An array of 64-bit words.
+	     *
+	     * @property {Array} words The array of CryptoJS.x64.Word objects.
+	     * @property {number} sigBytes The number of significant bytes in this word array.
+	     */
+	    var X64WordArray = C_x64.WordArray = Base.extend({
+	        /**
+	         * Initializes a newly created word array.
+	         *
+	         * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
+	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+	         *
+	         * @example
+	         *
+	         *     var wordArray = CryptoJS.x64.WordArray.create();
+	         *
+	         *     var wordArray = CryptoJS.x64.WordArray.create([
+	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+	         *     ]);
+	         *
+	         *     var wordArray = CryptoJS.x64.WordArray.create([
+	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+	         *     ], 10);
+	         */
+	        init: function (words, sigBytes) {
+	            words = this.words = words || [];
+
+	            if (sigBytes != undefined) {
+	                this.sigBytes = sigBytes;
+	            } else {
+	                this.sigBytes = words.length * 8;
+	            }
+	        },
+
+	        /**
+	         * Converts this 64-bit word array to a 32-bit word array.
+	         *
+	         * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
+	         *
+	         * @example
+	         *
+	         *     var x32WordArray = x64WordArray.toX32();
+	         */
+	        toX32: function () {
+	            // Shortcuts
+	            var x64Words = this.words;
+	            var x64WordsLength = x64Words.length;
+
+	            // Convert
+	            var x32Words = [];
+	            for (var i = 0; i < x64WordsLength; i++) {
+	                var x64Word = x64Words[i];
+	                x32Words.push(x64Word.high);
+	                x32Words.push(x64Word.low);
+	            }
+
+	            return X32WordArray.create(x32Words, this.sigBytes);
+	        },
+
+	        /**
+	         * Creates a copy of this word array.
+	         *
+	         * @return {X64WordArray} The clone.
+	         *
+	         * @example
+	         *
+	         *     var clone = x64WordArray.clone();
+	         */
+	        clone: function () {
+	            var clone = Base.clone.call(this);
+
+	            // Clone "words" array
+	            var words = clone.words = this.words.slice(0);
+
+	            // Clone each X64Word object
+	            var wordsLength = words.length;
+	            for (var i = 0; i < wordsLength; i++) {
+	                words[i] = words[i].clone();
+	            }
+
+	            return clone;
+	        }
+	    });
+	}());
+
+
+	return CryptoJS;
+
+}));
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/css/_fstyle.css b/management/guns-admin/src/main/webapp/static/css/_fstyle.css
new file mode 100644
index 0000000..3b2ded1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/_fstyle.css
@@ -0,0 +1,65 @@
+.button-margin {
+	margin-left: 15px !important;
+}
+
+.input-none-margin {
+	margin: 0px !important;
+}
+
+.btn-margin-left {
+	margin-left: 15px !important;
+}
+
+.table-head {
+	float: left;
+	width: 100%;
+	height: auto;
+}
+
+.head-scu-label {
+	margin-top: 35px;
+}
+
+.head-scu-btn {
+	margin-top: 68px;
+}
+
+.line-margin {
+	margin: 8px 0 !important;
+}
+
+.be-driver-checkbox {
+	margin-top: 7px;
+}
+
+.btn-group-m-t {
+	margin-top: 20px;
+}
+
+.upload-btn {
+	white-space: nowrap;
+}
+
+.tree-box {
+	border-radius: 0px !important;
+	box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2) !important;
+	background: rgb(250, 250, 250) none repeat scroll 0% 0% !important;
+	border: 1px solid rgb(204, 204, 204) !important;
+	overflow-y: scroll !important;
+	overflow-x: auto !important;
+	margin-top: 0px !important;
+	width: 224px !important;
+	max-height: 160px !important;
+	-moz-user-select: none !important;
+}
+.dept-tree {
+	padding:10px
+}
+
+.w-e-text-container{
+	height: 150px !important;
+}
+
+.editorHeight{
+	height: 170px;
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/css/bootstrap-rtl.css b/management/guns-admin/src/main/webapp/static/css/bootstrap-rtl.css
new file mode 100644
index 0000000..30014e6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/bootstrap-rtl.css
@@ -0,0 +1,1468 @@
+/*******************************************************************************
+ *              bootstrap-rtl (version 3.3.1)
+ *      Author: Morteza Ansarinia (http://github.com/morteza)
+ *  Created on: January 21,2015
+ *     Project: bootstrap-rtl
+ *   Copyright: Unlicensed Public Domain
+ *******************************************************************************/
+
+html {
+  direction: rtl;
+}
+body {
+  direction: rtl;
+}
+.list-unstyled {
+  padding-right: 0;
+  padding-left: initial;
+}
+.list-inline {
+  padding-right: 0;
+  padding-left: initial;
+  margin-right: -5px;
+  margin-left: 0;
+}
+dd {
+  margin-right: 0;
+  margin-left: initial;
+}
+@media (min-width: 768px) {
+  .dl-horizontal dt {
+    float: right;
+    clear: right;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-right: 180px;
+    margin-left: 0;
+  }
+}
+blockquote {
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+}
+.blockquote-reverse,
+blockquote.pull-left {
+  padding-left: 15px;
+  padding-right: 0;
+  border-left: 5px solid #eeeeee;
+  border-right: 0;
+  text-align: left;
+}
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+  float: right;
+}
+.col-xs-12 {
+  width: 100%;
+}
+.col-xs-11 {
+  width: 91.66666667%;
+}
+.col-xs-10 {
+  width: 83.33333333%;
+}
+.col-xs-9 {
+  width: 75%;
+}
+.col-xs-8 {
+  width: 66.66666667%;
+}
+.col-xs-7 {
+  width: 58.33333333%;
+}
+.col-xs-6 {
+  width: 50%;
+}
+.col-xs-5 {
+  width: 41.66666667%;
+}
+.col-xs-4 {
+  width: 33.33333333%;
+}
+.col-xs-3 {
+  width: 25%;
+}
+.col-xs-2 {
+  width: 16.66666667%;
+}
+.col-xs-1 {
+  width: 8.33333333%;
+}
+.col-xs-pull-12 {
+  left: 100%;
+  right: auto;
+}
+.col-xs-pull-11 {
+  left: 91.66666667%;
+  right: auto;
+}
+.col-xs-pull-10 {
+  left: 83.33333333%;
+  right: auto;
+}
+.col-xs-pull-9 {
+  left: 75%;
+  right: auto;
+}
+.col-xs-pull-8 {
+  left: 66.66666667%;
+  right: auto;
+}
+.col-xs-pull-7 {
+  left: 58.33333333%;
+  right: auto;
+}
+.col-xs-pull-6 {
+  left: 50%;
+  right: auto;
+}
+.col-xs-pull-5 {
+  left: 41.66666667%;
+  right: auto;
+}
+.col-xs-pull-4 {
+  left: 33.33333333%;
+  right: auto;
+}
+.col-xs-pull-3 {
+  left: 25%;
+  right: auto;
+}
+.col-xs-pull-2 {
+  left: 16.66666667%;
+  right: auto;
+}
+.col-xs-pull-1 {
+  left: 8.33333333%;
+  right: auto;
+}
+.col-xs-pull-0 {
+  left: auto;
+  right: auto;
+}
+.col-xs-push-12 {
+  right: 100%;
+  left: 0;
+}
+.col-xs-push-11 {
+  right: 91.66666667%;
+  left: 0;
+}
+.col-xs-push-10 {
+  right: 83.33333333%;
+  left: 0;
+}
+.col-xs-push-9 {
+  right: 75%;
+  left: 0;
+}
+.col-xs-push-8 {
+  right: 66.66666667%;
+  left: 0;
+}
+.col-xs-push-7 {
+  right: 58.33333333%;
+  left: 0;
+}
+.col-xs-push-6 {
+  right: 50%;
+  left: 0;
+}
+.col-xs-push-5 {
+  right: 41.66666667%;
+  left: 0;
+}
+.col-xs-push-4 {
+  right: 33.33333333%;
+  left: 0;
+}
+.col-xs-push-3 {
+  right: 25%;
+  left: 0;
+}
+.col-xs-push-2 {
+  right: 16.66666667%;
+  left: 0;
+}
+.col-xs-push-1 {
+  right: 8.33333333%;
+  left: 0;
+}
+.col-xs-push-0 {
+  right: auto;
+  left: 0;
+}
+.col-xs-offset-12 {
+  margin-right: 100%;
+  margin-left: 0;
+}
+.col-xs-offset-11 {
+  margin-right: 91.66666667%;
+  margin-left: 0;
+}
+.col-xs-offset-10 {
+  margin-right: 83.33333333%;
+  margin-left: 0;
+}
+.col-xs-offset-9 {
+  margin-right: 75%;
+  margin-left: 0;
+}
+.col-xs-offset-8 {
+  margin-right: 66.66666667%;
+  margin-left: 0;
+}
+.col-xs-offset-7 {
+  margin-right: 58.33333333%;
+  margin-left: 0;
+}
+.col-xs-offset-6 {
+  margin-right: 50%;
+  margin-left: 0;
+}
+.col-xs-offset-5 {
+  margin-right: 41.66666667%;
+  margin-left: 0;
+}
+.col-xs-offset-4 {
+  margin-right: 33.33333333%;
+  margin-left: 0;
+}
+.col-xs-offset-3 {
+  margin-right: 25%;
+  margin-left: 0;
+}
+.col-xs-offset-2 {
+  margin-right: 16.66666667%;
+  margin-left: 0;
+}
+.col-xs-offset-1 {
+  margin-right: 8.33333333%;
+  margin-left: 0;
+}
+.col-xs-offset-0 {
+  margin-right: 0%;
+  margin-left: 0;
+}
+@media (min-width: 768px) {
+  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+    float: right;
+  }
+  .col-sm-12 {
+    width: 100%;
+  }
+  .col-sm-11 {
+    width: 91.66666667%;
+  }
+  .col-sm-10 {
+    width: 83.33333333%;
+  }
+  .col-sm-9 {
+    width: 75%;
+  }
+  .col-sm-8 {
+    width: 66.66666667%;
+  }
+  .col-sm-7 {
+    width: 58.33333333%;
+  }
+  .col-sm-6 {
+    width: 50%;
+  }
+  .col-sm-5 {
+    width: 41.66666667%;
+  }
+  .col-sm-4 {
+    width: 33.33333333%;
+  }
+  .col-sm-3 {
+    width: 25%;
+  }
+  .col-sm-2 {
+    width: 16.66666667%;
+  }
+  .col-sm-1 {
+    width: 8.33333333%;
+  }
+  .col-sm-pull-12 {
+    left: 100%;
+    right: auto;
+  }
+  .col-sm-pull-11 {
+    left: 91.66666667%;
+    right: auto;
+  }
+  .col-sm-pull-10 {
+    left: 83.33333333%;
+    right: auto;
+  }
+  .col-sm-pull-9 {
+    left: 75%;
+    right: auto;
+  }
+  .col-sm-pull-8 {
+    left: 66.66666667%;
+    right: auto;
+  }
+  .col-sm-pull-7 {
+    left: 58.33333333%;
+    right: auto;
+  }
+  .col-sm-pull-6 {
+    left: 50%;
+    right: auto;
+  }
+  .col-sm-pull-5 {
+    left: 41.66666667%;
+    right: auto;
+  }
+  .col-sm-pull-4 {
+    left: 33.33333333%;
+    right: auto;
+  }
+  .col-sm-pull-3 {
+    left: 25%;
+    right: auto;
+  }
+  .col-sm-pull-2 {
+    left: 16.66666667%;
+    right: auto;
+  }
+  .col-sm-pull-1 {
+    left: 8.33333333%;
+    right: auto;
+  }
+  .col-sm-pull-0 {
+    left: auto;
+    right: auto;
+  }
+  .col-sm-push-12 {
+    right: 100%;
+    left: 0;
+  }
+  .col-sm-push-11 {
+    right: 91.66666667%;
+    left: 0;
+  }
+  .col-sm-push-10 {
+    right: 83.33333333%;
+    left: 0;
+  }
+  .col-sm-push-9 {
+    right: 75%;
+    left: 0;
+  }
+  .col-sm-push-8 {
+    right: 66.66666667%;
+    left: 0;
+  }
+  .col-sm-push-7 {
+    right: 58.33333333%;
+    left: 0;
+  }
+  .col-sm-push-6 {
+    right: 50%;
+    left: 0;
+  }
+  .col-sm-push-5 {
+    right: 41.66666667%;
+    left: 0;
+  }
+  .col-sm-push-4 {
+    right: 33.33333333%;
+    left: 0;
+  }
+  .col-sm-push-3 {
+    right: 25%;
+    left: 0;
+  }
+  .col-sm-push-2 {
+    right: 16.66666667%;
+    left: 0;
+  }
+  .col-sm-push-1 {
+    right: 8.33333333%;
+    left: 0;
+  }
+  .col-sm-push-0 {
+    right: auto;
+    left: 0;
+  }
+  .col-sm-offset-12 {
+    margin-right: 100%;
+    margin-left: 0;
+  }
+  .col-sm-offset-11 {
+    margin-right: 91.66666667%;
+    margin-left: 0;
+  }
+  .col-sm-offset-10 {
+    margin-right: 83.33333333%;
+    margin-left: 0;
+  }
+  .col-sm-offset-9 {
+    margin-right: 75%;
+    margin-left: 0;
+  }
+  .col-sm-offset-8 {
+    margin-right: 66.66666667%;
+    margin-left: 0;
+  }
+  .col-sm-offset-7 {
+    margin-right: 58.33333333%;
+    margin-left: 0;
+  }
+  .col-sm-offset-6 {
+    margin-right: 50%;
+    margin-left: 0;
+  }
+  .col-sm-offset-5 {
+    margin-right: 41.66666667%;
+    margin-left: 0;
+  }
+  .col-sm-offset-4 {
+    margin-right: 33.33333333%;
+    margin-left: 0;
+  }
+  .col-sm-offset-3 {
+    margin-right: 25%;
+    margin-left: 0;
+  }
+  .col-sm-offset-2 {
+    margin-right: 16.66666667%;
+    margin-left: 0;
+  }
+  .col-sm-offset-1 {
+    margin-right: 8.33333333%;
+    margin-left: 0;
+  }
+  .col-sm-offset-0 {
+    margin-right: 0%;
+    margin-left: 0;
+  }
+}
+@media (min-width: 992px) {
+  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+    float: right;
+  }
+  .col-md-12 {
+    width: 100%;
+  }
+  .col-md-11 {
+    width: 91.66666667%;
+  }
+  .col-md-10 {
+    width: 83.33333333%;
+  }
+  .col-md-9 {
+    width: 75%;
+  }
+  .col-md-8 {
+    width: 66.66666667%;
+  }
+  .col-md-7 {
+    width: 58.33333333%;
+  }
+  .col-md-6 {
+    width: 50%;
+  }
+  .col-md-5 {
+    width: 41.66666667%;
+  }
+  .col-md-4 {
+    width: 33.33333333%;
+  }
+  .col-md-3 {
+    width: 25%;
+  }
+  .col-md-2 {
+    width: 16.66666667%;
+  }
+  .col-md-1 {
+    width: 8.33333333%;
+  }
+  .col-md-pull-12 {
+    left: 100%;
+    right: auto;
+  }
+  .col-md-pull-11 {
+    left: 91.66666667%;
+    right: auto;
+  }
+  .col-md-pull-10 {
+    left: 83.33333333%;
+    right: auto;
+  }
+  .col-md-pull-9 {
+    left: 75%;
+    right: auto;
+  }
+  .col-md-pull-8 {
+    left: 66.66666667%;
+    right: auto;
+  }
+  .col-md-pull-7 {
+    left: 58.33333333%;
+    right: auto;
+  }
+  .col-md-pull-6 {
+    left: 50%;
+    right: auto;
+  }
+  .col-md-pull-5 {
+    left: 41.66666667%;
+    right: auto;
+  }
+  .col-md-pull-4 {
+    left: 33.33333333%;
+    right: auto;
+  }
+  .col-md-pull-3 {
+    left: 25%;
+    right: auto;
+  }
+  .col-md-pull-2 {
+    left: 16.66666667%;
+    right: auto;
+  }
+  .col-md-pull-1 {
+    left: 8.33333333%;
+    right: auto;
+  }
+  .col-md-pull-0 {
+    left: auto;
+    right: auto;
+  }
+  .col-md-push-12 {
+    right: 100%;
+    left: 0;
+  }
+  .col-md-push-11 {
+    right: 91.66666667%;
+    left: 0;
+  }
+  .col-md-push-10 {
+    right: 83.33333333%;
+    left: 0;
+  }
+  .col-md-push-9 {
+    right: 75%;
+    left: 0;
+  }
+  .col-md-push-8 {
+    right: 66.66666667%;
+    left: 0;
+  }
+  .col-md-push-7 {
+    right: 58.33333333%;
+    left: 0;
+  }
+  .col-md-push-6 {
+    right: 50%;
+    left: 0;
+  }
+  .col-md-push-5 {
+    right: 41.66666667%;
+    left: 0;
+  }
+  .col-md-push-4 {
+    right: 33.33333333%;
+    left: 0;
+  }
+  .col-md-push-3 {
+    right: 25%;
+    left: 0;
+  }
+  .col-md-push-2 {
+    right: 16.66666667%;
+    left: 0;
+  }
+  .col-md-push-1 {
+    right: 8.33333333%;
+    left: 0;
+  }
+  .col-md-push-0 {
+    right: auto;
+    left: 0;
+  }
+  .col-md-offset-12 {
+    margin-right: 100%;
+    margin-left: 0;
+  }
+  .col-md-offset-11 {
+    margin-right: 91.66666667%;
+    margin-left: 0;
+  }
+  .col-md-offset-10 {
+    margin-right: 83.33333333%;
+    margin-left: 0;
+  }
+  .col-md-offset-9 {
+    margin-right: 75%;
+    margin-left: 0;
+  }
+  .col-md-offset-8 {
+    margin-right: 66.66666667%;
+    margin-left: 0;
+  }
+  .col-md-offset-7 {
+    margin-right: 58.33333333%;
+    margin-left: 0;
+  }
+  .col-md-offset-6 {
+    margin-right: 50%;
+    margin-left: 0;
+  }
+  .col-md-offset-5 {
+    margin-right: 41.66666667%;
+    margin-left: 0;
+  }
+  .col-md-offset-4 {
+    margin-right: 33.33333333%;
+    margin-left: 0;
+  }
+  .col-md-offset-3 {
+    margin-right: 25%;
+    margin-left: 0;
+  }
+  .col-md-offset-2 {
+    margin-right: 16.66666667%;
+    margin-left: 0;
+  }
+  .col-md-offset-1 {
+    margin-right: 8.33333333%;
+    margin-left: 0;
+  }
+  .col-md-offset-0 {
+    margin-right: 0%;
+    margin-left: 0;
+  }
+}
+@media (min-width: 1200px) {
+  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+    float: right;
+  }
+  .col-lg-12 {
+    width: 100%;
+  }
+  .col-lg-11 {
+    width: 91.66666667%;
+  }
+  .col-lg-10 {
+    width: 83.33333333%;
+  }
+  .col-lg-9 {
+    width: 75%;
+  }
+  .col-lg-8 {
+    width: 66.66666667%;
+  }
+  .col-lg-7 {
+    width: 58.33333333%;
+  }
+  .col-lg-6 {
+    width: 50%;
+  }
+  .col-lg-5 {
+    width: 41.66666667%;
+  }
+  .col-lg-4 {
+    width: 33.33333333%;
+  }
+  .col-lg-3 {
+    width: 25%;
+  }
+  .col-lg-2 {
+    width: 16.66666667%;
+  }
+  .col-lg-1 {
+    width: 8.33333333%;
+  }
+  .col-lg-pull-12 {
+    left: 100%;
+    right: auto;
+  }
+  .col-lg-pull-11 {
+    left: 91.66666667%;
+    right: auto;
+  }
+  .col-lg-pull-10 {
+    left: 83.33333333%;
+    right: auto;
+  }
+  .col-lg-pull-9 {
+    left: 75%;
+    right: auto;
+  }
+  .col-lg-pull-8 {
+    left: 66.66666667%;
+    right: auto;
+  }
+  .col-lg-pull-7 {
+    left: 58.33333333%;
+    right: auto;
+  }
+  .col-lg-pull-6 {
+    left: 50%;
+    right: auto;
+  }
+  .col-lg-pull-5 {
+    left: 41.66666667%;
+    right: auto;
+  }
+  .col-lg-pull-4 {
+    left: 33.33333333%;
+    right: auto;
+  }
+  .col-lg-pull-3 {
+    left: 25%;
+    right: auto;
+  }
+  .col-lg-pull-2 {
+    left: 16.66666667%;
+    right: auto;
+  }
+  .col-lg-pull-1 {
+    left: 8.33333333%;
+    right: auto;
+  }
+  .col-lg-pull-0 {
+    left: auto;
+    right: auto;
+  }
+  .col-lg-push-12 {
+    right: 100%;
+    left: 0;
+  }
+  .col-lg-push-11 {
+    right: 91.66666667%;
+    left: 0;
+  }
+  .col-lg-push-10 {
+    right: 83.33333333%;
+    left: 0;
+  }
+  .col-lg-push-9 {
+    right: 75%;
+    left: 0;
+  }
+  .col-lg-push-8 {
+    right: 66.66666667%;
+    left: 0;
+  }
+  .col-lg-push-7 {
+    right: 58.33333333%;
+    left: 0;
+  }
+  .col-lg-push-6 {
+    right: 50%;
+    left: 0;
+  }
+  .col-lg-push-5 {
+    right: 41.66666667%;
+    left: 0;
+  }
+  .col-lg-push-4 {
+    right: 33.33333333%;
+    left: 0;
+  }
+  .col-lg-push-3 {
+    right: 25%;
+    left: 0;
+  }
+  .col-lg-push-2 {
+    right: 16.66666667%;
+    left: 0;
+  }
+  .col-lg-push-1 {
+    right: 8.33333333%;
+    left: 0;
+  }
+  .col-lg-push-0 {
+    right: auto;
+    left: 0;
+  }
+  .col-lg-offset-12 {
+    margin-right: 100%;
+    margin-left: 0;
+  }
+  .col-lg-offset-11 {
+    margin-right: 91.66666667%;
+    margin-left: 0;
+  }
+  .col-lg-offset-10 {
+    margin-right: 83.33333333%;
+    margin-left: 0;
+  }
+  .col-lg-offset-9 {
+    margin-right: 75%;
+    margin-left: 0;
+  }
+  .col-lg-offset-8 {
+    margin-right: 66.66666667%;
+    margin-left: 0;
+  }
+  .col-lg-offset-7 {
+    margin-right: 58.33333333%;
+    margin-left: 0;
+  }
+  .col-lg-offset-6 {
+    margin-right: 50%;
+    margin-left: 0;
+  }
+  .col-lg-offset-5 {
+    margin-right: 41.66666667%;
+    margin-left: 0;
+  }
+  .col-lg-offset-4 {
+    margin-right: 33.33333333%;
+    margin-left: 0;
+  }
+  .col-lg-offset-3 {
+    margin-right: 25%;
+    margin-left: 0;
+  }
+  .col-lg-offset-2 {
+    margin-right: 16.66666667%;
+    margin-left: 0;
+  }
+  .col-lg-offset-1 {
+    margin-right: 8.33333333%;
+    margin-left: 0;
+  }
+  .col-lg-offset-0 {
+    margin-right: 0%;
+    margin-left: 0;
+  }
+}
+caption {
+  text-align: right;
+}
+th {
+  text-align: right;
+}
+@media screen and (max-width: 767px) {
+  .table-responsive > .table-bordered {
+    border: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:first-child,
+  .table-responsive > .table-bordered > tbody > tr > th:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+  .table-responsive > .table-bordered > thead > tr > td:first-child,
+  .table-responsive > .table-bordered > tbody > tr > td:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-right: 0;
+    border-left: initial;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:last-child,
+  .table-responsive > .table-bordered > tbody > tr > th:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+  .table-responsive > .table-bordered > thead > tr > td:last-child,
+  .table-responsive > .table-bordered > tbody > tr > td:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-left: 0;
+    border-right: initial;
+  }
+}
+.radio label,
+.checkbox label {
+  padding-right: 20px;
+  padding-left: initial;
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  margin-right: -20px;
+  margin-left: auto;
+}
+.radio-inline,
+.checkbox-inline {
+  padding-right: 20px;
+  padding-left: 0;
+}
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+  margin-right: 10px;
+  margin-left: 0;
+}
+.has-feedback .form-control {
+  padding-left: 42.5px;
+  padding-right: 12px;
+}
+.form-control-feedback {
+  left: 0;
+  right: auto;
+}
+@media (min-width: 768px) {
+  .form-inline label {
+    padding-right: 0;
+    padding-left: initial;
+  }
+  .form-inline .radio input[type="radio"],
+  .form-inline .checkbox input[type="checkbox"] {
+    margin-right: 0;
+    margin-left: auto;
+  }
+}
+@media (min-width: 768px) {
+  .form-horizontal .control-label {
+    text-align: left;
+  }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+  left: 15px;
+  right: auto;
+}
+.caret {
+  margin-right: 2px;
+  margin-left: 0;
+}
+.dropdown-menu {
+  right: 0;
+  left: auto;
+  float: left;
+  text-align: right;
+}
+.dropdown-menu.pull-right {
+  left: 0;
+  right: auto;
+  float: right;
+}
+.dropdown-menu-right {
+  left: auto;
+  right: 0;
+}
+.dropdown-menu-left {
+  left: 0;
+  right: auto;
+}
+@media (min-width: 768px) {
+  .navbar-right .dropdown-menu {
+    left: auto;
+    right: 0;
+  }
+  .navbar-right .dropdown-menu-left {
+    left: 0;
+    right: auto;
+  }
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  float: right;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-right: -1px;
+  margin-left: 0px;
+}
+.btn-toolbar {
+  margin-right: -5px;
+  margin-left: 0px;
+}
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+  float: right;
+}
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+  margin-right: 5px;
+  margin-left: 0px;
+}
+.btn-group > .btn:first-child {
+  margin-right: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn-group {
+  float: right;
+}
+.btn-group.btn-group-justified > .btn,
+.btn-group.btn-group-justified > .btn-group {
+  float: none;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn-group:last-child > .btn:first-child {
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn .caret {
+  margin-right: 0;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-right: 0;
+}
+.input-group .form-control {
+  float: right;
+}
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  border-bottom-right-radius: 4px;
+  border-top-right-radius: 4px;
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.input-group-addon:first-child {
+  border-right-width: 1px;
+  border-right-style: solid;
+  border-left: 0px;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  border-bottom-left-radius: 4px;
+  border-top-left-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.input-group-addon:last-child {
+  border-left-width: 1px;
+  border-left-style: solid;
+  border-right: 0px;
+}
+.input-group-btn > .btn + .btn {
+  margin-right: -1px;
+  margin-left: auto;
+}
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+  margin-left: -1px;
+  margin-right: auto;
+}
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+  margin-right: -1px;
+  margin-left: auto;
+}
+.nav {
+  padding-right: 0;
+  padding-left: initial;
+}
+.nav-tabs > li {
+  float: right;
+}
+.nav-tabs > li > a {
+  margin-left: auto;
+  margin-right: -2px;
+  border-radius: 4px 4px 0 0;
+}
+.nav-pills > li {
+  float: right;
+}
+.nav-pills > li > a {
+  border-radius: 4px;
+}
+.nav-pills > li + li {
+  margin-right: 2px;
+  margin-left: auto;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li + li {
+  margin-right: 0;
+  margin-left: auto;
+}
+.nav-justified > .dropdown .dropdown-menu {
+  right: auto;
+}
+.nav-tabs-justified > li > a {
+  margin-left: 0;
+  margin-right: auto;
+}
+@media (min-width: 768px) {
+  .nav-tabs-justified > li > a {
+    border-radius: 4px 4px 0 0;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-header {
+    float: right;
+  }
+}
+.navbar-collapse {
+  padding-right: 15px;
+  padding-left: 15px;
+}
+.navbar-brand {
+  float: right;
+}
+@media (min-width: 768px) {
+  .navbar > .container .navbar-brand,
+  .navbar > .container-fluid .navbar-brand {
+    margin-right: -15px;
+    margin-left: auto;
+  }
+}
+.navbar-toggle {
+  float: left;
+  margin-left: 15px;
+  margin-right: auto;
+}
+@media (max-width: 767px) {
+  .navbar-nav .open .dropdown-menu > li > a,
+  .navbar-nav .open .dropdown-menu .dropdown-header {
+    padding: 5px 25px 5px 15px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-nav {
+    float: right;
+  }
+  .navbar-nav > li {
+    float: right;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-left.flip {
+    float: right !important;
+  }
+  .navbar-right:last-child {
+    margin-left: -15px;
+    margin-right: auto;
+  }
+  .navbar-right.flip {
+    float: left !important;
+    margin-left: -15px;
+    margin-right: auto;
+  }
+  .navbar-right .dropdown-menu {
+    left: 0;
+    right: auto;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-text {
+    float: right;
+  }
+  .navbar-text.navbar-right:last-child {
+    margin-left: 0;
+    margin-right: auto;
+  }
+}
+.pagination {
+  padding-right: 0;
+}
+.pagination > li > a,
+.pagination > li > span {
+  float: right;
+  margin-right: -1px;
+  margin-left: 0px;
+}
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+  margin-left: 0;
+  border-bottom-right-radius: 4px;
+  border-top-right-radius: 4px;
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+  margin-right: -1px;
+  border-bottom-left-radius: 4px;
+  border-top-left-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.pager {
+  padding-right: 0;
+  padding-left: initial;
+}
+.pager .next > a,
+.pager .next > span {
+  float: left;
+}
+.pager .previous > a,
+.pager .previous > span {
+  float: right;
+}
+.nav-pills > li > a > .badge {
+  margin-left: 0px;
+  margin-right: 3px;
+}
+.list-group-item > .badge {
+  float: left;
+}
+.list-group-item > .badge + .badge {
+  margin-left: 5px;
+  margin-right: auto;
+}
+.alert-dismissable,
+.alert-dismissible {
+  padding-left: 35px;
+  padding-right: 15px;
+}
+.alert-dismissable .close,
+.alert-dismissible .close {
+  right: auto;
+  left: -21px;
+}
+.progress-bar {
+  float: right;
+}
+.media > .pull-left {
+  margin-right: 10px;
+}
+.media > .pull-left.flip {
+  margin-right: 0;
+  margin-left: 10px;
+}
+.media > .pull-right {
+  margin-left: 10px;
+}
+.media > .pull-right.flip {
+  margin-left: 0;
+  margin-right: 10px;
+}
+.media-right,
+.media > .pull-right {
+  padding-right: 10px;
+  padding-left: initial;
+}
+.media-left,
+.media > .pull-left {
+  padding-left: 10px;
+  padding-right: initial;
+}
+.media-list {
+  padding-right: 0;
+  padding-left: initial;
+  list-style: none;
+}
+.list-group {
+  padding-right: 0;
+  padding-left: initial;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+  border-top-right-radius: 3px;
+  border-top-left-radius: 0;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 0;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+  border-bottom-left-radius: 3px;
+  border-top-right-radius: 0;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+  border-bottom-right-radius: 3px;
+  border-top-left-radius: 0;
+}
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+  border-right: 0;
+  border-left: none;
+}
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+  border-right: none;
+  border-left: 0;
+}
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object {
+  right: 0;
+  left: auto;
+}
+.close {
+  float: left;
+}
+.modal-footer {
+  text-align: left;
+}
+.modal-footer .btn + .btn {
+  margin-left: auto;
+  margin-right: 5px;
+}
+.modal-footer .btn-group .btn + .btn {
+  margin-right: -1px;
+  margin-left: auto;
+}
+.modal-footer .btn-block + .btn-block {
+  margin-right: 0;
+  margin-left: auto;
+}
+.popover {
+  left: auto;
+  text-align: right;
+}
+.popover.top > .arrow {
+  right: 50%;
+  left: auto;
+  margin-right: -11px;
+  margin-left: auto;
+}
+.popover.top > .arrow:after {
+  margin-right: -10px;
+  margin-left: auto;
+}
+.popover.bottom > .arrow {
+  right: 50%;
+  left: auto;
+  margin-right: -11px;
+  margin-left: auto;
+}
+.popover.bottom > .arrow:after {
+  margin-right: -10px;
+  margin-left: auto;
+}
+.carousel-control {
+  right: 0;
+  bottom: 0;
+}
+.carousel-control.left {
+  right: auto;
+  left: 0;
+  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%));
+  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+}
+.carousel-control.right {
+  left: auto;
+  right: 0;
+  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%));
+  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+  left: 50%;
+  right: auto;
+  margin-right: -10px;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+  right: 50%;
+  left: auto;
+  margin-left: -10px;
+}
+.carousel-indicators {
+  right: 50%;
+  left: 0;
+  margin-right: -30%;
+  margin-left: 0;
+  padding-left: 0;
+}
+@media screen and (min-width: 768px) {
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .icon-prev {
+    margin-left: 0;
+    margin-right: -15px;
+  }
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-next {
+    margin-left: 0;
+    margin-right: -15px;
+  }
+  .carousel-caption {
+    left: 20%;
+    right: 20%;
+    padding-bottom: 30px;
+  }
+}
+.pull-right.flip {
+  float: left !important;
+}
+.pull-left.flip {
+  float: right !important;
+}
+/*# sourceMappingURL=bootstrap-rtl.css.map */
diff --git a/management/guns-admin/src/main/webapp/static/css/bootstrap.min.css b/management/guns-admin/src/main/webapp/static/css/bootstrap.min.css
new file mode 100644
index 0000000..1f0e4d5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/bootstrap.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;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,-webkit-box-shadow ease-in-out .15s;-o-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}.form-control: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)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
+
diff --git a/management/guns-admin/src/main/webapp/static/css/font-awesome.css b/management/guns-admin/src/main/webapp/static/css/font-awesome.css
new file mode 100644
index 0000000..880eb82
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/font-awesome.css
@@ -0,0 +1,2026 @@
+/*!
+ *  Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+  font-family: 'FontAwesome';
+  src: url('../fonts/fontawesome-webfont.eot?v=4.4.0');
+  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+.fa {
+  display: inline-block;
+  font: normal normal normal 14px/1 FontAwesome;
+  font-size: inherit;
+  text-rendering: auto;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+  font-size: 1.33333333em;
+  line-height: 0.75em;
+  vertical-align: -15%;
+}
+.fa-2x {
+  font-size: 2em;
+}
+.fa-3x {
+  font-size: 3em;
+}
+.fa-4x {
+  font-size: 4em;
+}
+.fa-5x {
+  font-size: 5em;
+}
+.fa-fw {
+  width: 1.28571429em;
+  text-align: center;
+}
+.fa-ul {
+  padding-left: 0;
+  margin-left: 2.14285714em;
+  list-style-type: none;
+}
+.fa-ul > li {
+  position: relative;
+}
+.fa-li {
+  position: absolute;
+  left: -2.14285714em;
+  width: 2.14285714em;
+  top: 0.14285714em;
+  text-align: center;
+}
+.fa-li.fa-lg {
+  left: -1.85714286em;
+}
+.fa-border {
+  padding: .2em .25em .15em;
+  border: solid 0.08em #eeeeee;
+  border-radius: .1em;
+}
+.fa-pull-left {
+  float: left;
+}
+.fa-pull-right {
+  float: right;
+}
+.fa.fa-pull-left {
+  margin-right: .3em;
+}
+.fa.fa-pull-right {
+  margin-left: .3em;
+}
+/* Deprecated as of 4.4.0 */
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+.fa.pull-left {
+  margin-right: .3em;
+}
+.fa.pull-right {
+  margin-left: .3em;
+}
+.fa-spin {
+  -webkit-animation: fa-spin 2s infinite linear;
+  animation: fa-spin 2s infinite linear;
+}
+.fa-pulse {
+  -webkit-animation: fa-spin 1s infinite steps(8);
+  animation: fa-spin 1s infinite steps(8);
+}
+@-webkit-keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+@keyframes fa-spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+.fa-rotate-90 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+}
+.fa-rotate-180 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+  -webkit-transform: rotate(180deg);
+  -ms-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+.fa-rotate-270 {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+  -webkit-transform: rotate(270deg);
+  -ms-transform: rotate(270deg);
+  transform: rotate(270deg);
+}
+.fa-flip-horizontal {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
+  -webkit-transform: scale(-1, 1);
+  -ms-transform: scale(-1, 1);
+  transform: scale(-1, 1);
+}
+.fa-flip-vertical {
+  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
+  -webkit-transform: scale(1, -1);
+  -ms-transform: scale(1, -1);
+  transform: scale(1, -1);
+}
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+  filter: none;
+}
+.fa-stack {
+  position: relative;
+  display: inline-block;
+  width: 2em;
+  height: 2em;
+  line-height: 2em;
+  vertical-align: middle;
+}
+.fa-stack-1x,
+.fa-stack-2x {
+  position: absolute;
+  left: 0;
+  width: 100%;
+  text-align: center;
+}
+.fa-stack-1x {
+  line-height: inherit;
+}
+.fa-stack-2x {
+  font-size: 2em;
+}
+.fa-inverse {
+  color: #ffffff;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+   readers do not read off random characters that represent icons */
+.fa-glass:before {
+  content: "\f000";
+}
+.fa-music:before {
+  content: "\f001";
+}
+.fa-search:before {
+  content: "\f002";
+}
+.fa-envelope-o:before {
+  content: "\f003";
+}
+.fa-heart:before {
+  content: "\f004";
+}
+.fa-star:before {
+  content: "\f005";
+}
+.fa-star-o:before {
+  content: "\f006";
+}
+.fa-user:before {
+  content: "\f007";
+}
+.fa-film:before {
+  content: "\f008";
+}
+.fa-th-large:before {
+  content: "\f009";
+}
+.fa-th:before {
+  content: "\f00a";
+}
+.fa-th-list:before {
+  content: "\f00b";
+}
+.fa-check:before {
+  content: "\f00c";
+}
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+  content: "\f00d";
+}
+.fa-search-plus:before {
+  content: "\f00e";
+}
+.fa-search-minus:before {
+  content: "\f010";
+}
+.fa-power-off:before {
+  content: "\f011";
+}
+.fa-signal:before {
+  content: "\f012";
+}
+.fa-gear:before,
+.fa-cog:before {
+  content: "\f013";
+}
+.fa-trash-o:before {
+  content: "\f014";
+}
+.fa-home:before {
+  content: "\f015";
+}
+.fa-file-o:before {
+  content: "\f016";
+}
+.fa-clock-o:before {
+  content: "\f017";
+}
+.fa-road:before {
+  content: "\f018";
+}
+.fa-download:before {
+  content: "\f019";
+}
+.fa-arrow-circle-o-down:before {
+  content: "\f01a";
+}
+.fa-arrow-circle-o-up:before {
+  content: "\f01b";
+}
+.fa-inbox:before {
+  content: "\f01c";
+}
+.fa-play-circle-o:before {
+  content: "\f01d";
+}
+.fa-rotate-right:before,
+.fa-repeat:before {
+  content: "\f01e";
+}
+.fa-refresh:before {
+  content: "\f021";
+}
+.fa-list-alt:before {
+  content: "\f022";
+}
+.fa-lock:before {
+  content: "\f023";
+}
+.fa-flag:before {
+  content: "\f024";
+}
+.fa-headphones:before {
+  content: "\f025";
+}
+.fa-volume-off:before {
+  content: "\f026";
+}
+.fa-volume-down:before {
+  content: "\f027";
+}
+.fa-volume-up:before {
+  content: "\f028";
+}
+.fa-qrcode:before {
+  content: "\f029";
+}
+.fa-barcode:before {
+  content: "\f02a";
+}
+.fa-tag:before {
+  content: "\f02b";
+}
+.fa-tags:before {
+  content: "\f02c";
+}
+.fa-book:before {
+  content: "\f02d";
+}
+.fa-bookmark:before {
+  content: "\f02e";
+}
+.fa-print:before {
+  content: "\f02f";
+}
+.fa-camera:before {
+  content: "\f030";
+}
+.fa-font:before {
+  content: "\f031";
+}
+.fa-bold:before {
+  content: "\f032";
+}
+.fa-italic:before {
+  content: "\f033";
+}
+.fa-text-height:before {
+  content: "\f034";
+}
+.fa-text-width:before {
+  content: "\f035";
+}
+.fa-align-left:before {
+  content: "\f036";
+}
+.fa-align-center:before {
+  content: "\f037";
+}
+.fa-align-right:before {
+  content: "\f038";
+}
+.fa-align-justify:before {
+  content: "\f039";
+}
+.fa-list:before {
+  content: "\f03a";
+}
+.fa-dedent:before,
+.fa-outdent:before {
+  content: "\f03b";
+}
+.fa-indent:before {
+  content: "\f03c";
+}
+.fa-video-camera:before {
+  content: "\f03d";
+}
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+  content: "\f03e";
+}
+.fa-pencil:before {
+  content: "\f040";
+}
+.fa-map-marker:before {
+  content: "\f041";
+}
+.fa-adjust:before {
+  content: "\f042";
+}
+.fa-tint:before {
+  content: "\f043";
+}
+.fa-edit:before,
+.fa-pencil-square-o:before {
+  content: "\f044";
+}
+.fa-share-square-o:before {
+  content: "\f045";
+}
+.fa-check-square-o:before {
+  content: "\f046";
+}
+.fa-arrows:before {
+  content: "\f047";
+}
+.fa-step-backward:before {
+  content: "\f048";
+}
+.fa-fast-backward:before {
+  content: "\f049";
+}
+.fa-backward:before {
+  content: "\f04a";
+}
+.fa-play:before {
+  content: "\f04b";
+}
+.fa-pause:before {
+  content: "\f04c";
+}
+.fa-stop:before {
+  content: "\f04d";
+}
+.fa-forward:before {
+  content: "\f04e";
+}
+.fa-fast-forward:before {
+  content: "\f050";
+}
+.fa-step-forward:before {
+  content: "\f051";
+}
+.fa-eject:before {
+  content: "\f052";
+}
+.fa-chevron-left:before {
+  content: "\f053";
+}
+.fa-chevron-right:before {
+  content: "\f054";
+}
+.fa-plus-circle:before {
+  content: "\f055";
+}
+.fa-minus-circle:before {
+  content: "\f056";
+}
+.fa-times-circle:before {
+  content: "\f057";
+}
+.fa-check-circle:before {
+  content: "\f058";
+}
+.fa-question-circle:before {
+  content: "\f059";
+}
+.fa-info-circle:before {
+  content: "\f05a";
+}
+.fa-crosshairs:before {
+  content: "\f05b";
+}
+.fa-times-circle-o:before {
+  content: "\f05c";
+}
+.fa-check-circle-o:before {
+  content: "\f05d";
+}
+.fa-ban:before {
+  content: "\f05e";
+}
+.fa-arrow-left:before {
+  content: "\f060";
+}
+.fa-arrow-right:before {
+  content: "\f061";
+}
+.fa-arrow-up:before {
+  content: "\f062";
+}
+.fa-arrow-down:before {
+  content: "\f063";
+}
+.fa-mail-forward:before,
+.fa-share:before {
+  content: "\f064";
+}
+.fa-expand:before {
+  content: "\f065";
+}
+.fa-compress:before {
+  content: "\f066";
+}
+.fa-plus:before {
+  content: "\f067";
+}
+.fa-minus:before {
+  content: "\f068";
+}
+.fa-asterisk:before {
+  content: "\f069";
+}
+.fa-exclamation-circle:before {
+  content: "\f06a";
+}
+.fa-gift:before {
+  content: "\f06b";
+}
+.fa-leaf:before {
+  content: "\f06c";
+}
+.fa-fire:before {
+  content: "\f06d";
+}
+.fa-eye:before {
+  content: "\f06e";
+}
+.fa-eye-slash:before {
+  content: "\f070";
+}
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+  content: "\f071";
+}
+.fa-plane:before {
+  content: "\f072";
+}
+.fa-calendar:before {
+  content: "\f073";
+}
+.fa-random:before {
+  content: "\f074";
+}
+.fa-comment:before {
+  content: "\f075";
+}
+.fa-magnet:before {
+  content: "\f076";
+}
+.fa-chevron-up:before {
+  content: "\f077";
+}
+.fa-chevron-down:before {
+  content: "\f078";
+}
+.fa-retweet:before {
+  content: "\f079";
+}
+.fa-shopping-cart:before {
+  content: "\f07a";
+}
+.fa-folder:before {
+  content: "\f07b";
+}
+.fa-folder-open:before {
+  content: "\f07c";
+}
+.fa-arrows-v:before {
+  content: "\f07d";
+}
+.fa-arrows-h:before {
+  content: "\f07e";
+}
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+  content: "\f080";
+}
+.fa-twitter-square:before {
+  content: "\f081";
+}
+.fa-facebook-square:before {
+  content: "\f082";
+}
+.fa-camera-retro:before {
+  content: "\f083";
+}
+.fa-key:before {
+  content: "\f084";
+}
+.fa-gears:before,
+.fa-cogs:before {
+  content: "\f085";
+}
+.fa-comments:before {
+  content: "\f086";
+}
+.fa-thumbs-o-up:before {
+  content: "\f087";
+}
+.fa-thumbs-o-down:before {
+  content: "\f088";
+}
+.fa-star-half:before {
+  content: "\f089";
+}
+.fa-heart-o:before {
+  content: "\f08a";
+}
+.fa-sign-out:before {
+  content: "\f08b";
+}
+.fa-linkedin-square:before {
+  content: "\f08c";
+}
+.fa-thumb-tack:before {
+  content: "\f08d";
+}
+.fa-external-link:before {
+  content: "\f08e";
+}
+.fa-sign-in:before {
+  content: "\f090";
+}
+.fa-trophy:before {
+  content: "\f091";
+}
+.fa-github-square:before {
+  content: "\f092";
+}
+.fa-upload:before {
+  content: "\f093";
+}
+.fa-lemon-o:before {
+  content: "\f094";
+}
+.fa-phone:before {
+  content: "\f095";
+}
+.fa-square-o:before {
+  content: "\f096";
+}
+.fa-bookmark-o:before {
+  content: "\f097";
+}
+.fa-phone-square:before {
+  content: "\f098";
+}
+.fa-twitter:before {
+  content: "\f099";
+}
+.fa-facebook-f:before,
+.fa-facebook:before {
+  content: "\f09a";
+}
+.fa-github:before {
+  content: "\f09b";
+}
+.fa-unlock:before {
+  content: "\f09c";
+}
+.fa-credit-card:before {
+  content: "\f09d";
+}
+.fa-feed:before,
+.fa-rss:before {
+  content: "\f09e";
+}
+.fa-hdd-o:before {
+  content: "\f0a0";
+}
+.fa-bullhorn:before {
+  content: "\f0a1";
+}
+.fa-bell:before {
+  content: "\f0f3";
+}
+.fa-certificate:before {
+  content: "\f0a3";
+}
+.fa-hand-o-right:before {
+  content: "\f0a4";
+}
+.fa-hand-o-left:before {
+  content: "\f0a5";
+}
+.fa-hand-o-up:before {
+  content: "\f0a6";
+}
+.fa-hand-o-down:before {
+  content: "\f0a7";
+}
+.fa-arrow-circle-left:before {
+  content: "\f0a8";
+}
+.fa-arrow-circle-right:before {
+  content: "\f0a9";
+}
+.fa-arrow-circle-up:before {
+  content: "\f0aa";
+}
+.fa-arrow-circle-down:before {
+  content: "\f0ab";
+}
+.fa-globe:before {
+  content: "\f0ac";
+}
+.fa-wrench:before {
+  content: "\f0ad";
+}
+.fa-tasks:before {
+  content: "\f0ae";
+}
+.fa-filter:before {
+  content: "\f0b0";
+}
+.fa-briefcase:before {
+  content: "\f0b1";
+}
+.fa-arrows-alt:before {
+  content: "\f0b2";
+}
+.fa-group:before,
+.fa-users:before {
+  content: "\f0c0";
+}
+.fa-chain:before,
+.fa-link:before {
+  content: "\f0c1";
+}
+.fa-cloud:before {
+  content: "\f0c2";
+}
+.fa-flask:before {
+  content: "\f0c3";
+}
+.fa-cut:before,
+.fa-scissors:before {
+  content: "\f0c4";
+}
+.fa-copy:before,
+.fa-files-o:before {
+  content: "\f0c5";
+}
+.fa-paperclip:before {
+  content: "\f0c6";
+}
+.fa-save:before,
+.fa-floppy-o:before {
+  content: "\f0c7";
+}
+.fa-square:before {
+  content: "\f0c8";
+}
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+  content: "\f0c9";
+}
+.fa-list-ul:before {
+  content: "\f0ca";
+}
+.fa-list-ol:before {
+  content: "\f0cb";
+}
+.fa-strikethrough:before {
+  content: "\f0cc";
+}
+.fa-underline:before {
+  content: "\f0cd";
+}
+.fa-table:before {
+  content: "\f0ce";
+}
+.fa-magic:before {
+  content: "\f0d0";
+}
+.fa-truck:before {
+  content: "\f0d1";
+}
+.fa-pinterest:before {
+  content: "\f0d2";
+}
+.fa-pinterest-square:before {
+  content: "\f0d3";
+}
+.fa-google-plus-square:before {
+  content: "\f0d4";
+}
+.fa-google-plus:before {
+  content: "\f0d5";
+}
+.fa-money:before {
+  content: "\f0d6";
+}
+.fa-caret-down:before {
+  content: "\f0d7";
+}
+.fa-caret-up:before {
+  content: "\f0d8";
+}
+.fa-caret-left:before {
+  content: "\f0d9";
+}
+.fa-caret-right:before {
+  content: "\f0da";
+}
+.fa-columns:before {
+  content: "\f0db";
+}
+.fa-unsorted:before,
+.fa-sort:before {
+  content: "\f0dc";
+}
+.fa-sort-down:before,
+.fa-sort-desc:before {
+  content: "\f0dd";
+}
+.fa-sort-up:before,
+.fa-sort-asc:before {
+  content: "\f0de";
+}
+.fa-envelope:before {
+  content: "\f0e0";
+}
+.fa-linkedin:before {
+  content: "\f0e1";
+}
+.fa-rotate-left:before,
+.fa-undo:before {
+  content: "\f0e2";
+}
+.fa-legal:before,
+.fa-gavel:before {
+  content: "\f0e3";
+}
+.fa-dashboard:before,
+.fa-tachometer:before {
+  content: "\f0e4";
+}
+.fa-comment-o:before {
+  content: "\f0e5";
+}
+.fa-comments-o:before {
+  content: "\f0e6";
+}
+.fa-flash:before,
+.fa-bolt:before {
+  content: "\f0e7";
+}
+.fa-sitemap:before {
+  content: "\f0e8";
+}
+.fa-umbrella:before {
+  content: "\f0e9";
+}
+.fa-paste:before,
+.fa-clipboard:before {
+  content: "\f0ea";
+}
+.fa-lightbulb-o:before {
+  content: "\f0eb";
+}
+.fa-exchange:before {
+  content: "\f0ec";
+}
+.fa-cloud-download:before {
+  content: "\f0ed";
+}
+.fa-cloud-upload:before {
+  content: "\f0ee";
+}
+.fa-user-md:before {
+  content: "\f0f0";
+}
+.fa-stethoscope:before {
+  content: "\f0f1";
+}
+.fa-suitcase:before {
+  content: "\f0f2";
+}
+.fa-bell-o:before {
+  content: "\f0a2";
+}
+.fa-coffee:before {
+  content: "\f0f4";
+}
+.fa-cutlery:before {
+  content: "\f0f5";
+}
+.fa-file-text-o:before {
+  content: "\f0f6";
+}
+.fa-building-o:before {
+  content: "\f0f7";
+}
+.fa-hospital-o:before {
+  content: "\f0f8";
+}
+.fa-ambulance:before {
+  content: "\f0f9";
+}
+.fa-medkit:before {
+  content: "\f0fa";
+}
+.fa-fighter-jet:before {
+  content: "\f0fb";
+}
+.fa-beer:before {
+  content: "\f0fc";
+}
+.fa-h-square:before {
+  content: "\f0fd";
+}
+.fa-plus-square:before {
+  content: "\f0fe";
+}
+.fa-angle-double-left:before {
+  content: "\f100";
+}
+.fa-angle-double-right:before {
+  content: "\f101";
+}
+.fa-angle-double-up:before {
+  content: "\f102";
+}
+.fa-angle-double-down:before {
+  content: "\f103";
+}
+.fa-angle-left:before {
+  content: "\f104";
+}
+.fa-angle-right:before {
+  content: "\f105";
+}
+.fa-angle-up:before {
+  content: "\f106";
+}
+.fa-angle-down:before {
+  content: "\f107";
+}
+.fa-desktop:before {
+  content: "\f108";
+}
+.fa-laptop:before {
+  content: "\f109";
+}
+.fa-tablet:before {
+  content: "\f10a";
+}
+.fa-mobile-phone:before,
+.fa-mobile:before {
+  content: "\f10b";
+}
+.fa-circle-o:before {
+  content: "\f10c";
+}
+.fa-quote-left:before {
+  content: "\f10d";
+}
+.fa-quote-right:before {
+  content: "\f10e";
+}
+.fa-spinner:before {
+  content: "\f110";
+}
+.fa-circle:before {
+  content: "\f111";
+}
+.fa-mail-reply:before,
+.fa-reply:before {
+  content: "\f112";
+}
+.fa-github-alt:before {
+  content: "\f113";
+}
+.fa-folder-o:before {
+  content: "\f114";
+}
+.fa-folder-open-o:before {
+  content: "\f115";
+}
+.fa-smile-o:before {
+  content: "\f118";
+}
+.fa-frown-o:before {
+  content: "\f119";
+}
+.fa-meh-o:before {
+  content: "\f11a";
+}
+.fa-gamepad:before {
+  content: "\f11b";
+}
+.fa-keyboard-o:before {
+  content: "\f11c";
+}
+.fa-flag-o:before {
+  content: "\f11d";
+}
+.fa-flag-checkered:before {
+  content: "\f11e";
+}
+.fa-terminal:before {
+  content: "\f120";
+}
+.fa-code:before {
+  content: "\f121";
+}
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+  content: "\f122";
+}
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+  content: "\f123";
+}
+.fa-location-arrow:before {
+  content: "\f124";
+}
+.fa-crop:before {
+  content: "\f125";
+}
+.fa-code-fork:before {
+  content: "\f126";
+}
+.fa-unlink:before,
+.fa-chain-broken:before {
+  content: "\f127";
+}
+.fa-question:before {
+  content: "\f128";
+}
+.fa-info:before {
+  content: "\f129";
+}
+.fa-exclamation:before {
+  content: "\f12a";
+}
+.fa-superscript:before {
+  content: "\f12b";
+}
+.fa-subscript:before {
+  content: "\f12c";
+}
+.fa-eraser:before {
+  content: "\f12d";
+}
+.fa-puzzle-piece:before {
+  content: "\f12e";
+}
+.fa-microphone:before {
+  content: "\f130";
+}
+.fa-microphone-slash:before {
+  content: "\f131";
+}
+.fa-shield:before {
+  content: "\f132";
+}
+.fa-calendar-o:before {
+  content: "\f133";
+}
+.fa-fire-extinguisher:before {
+  content: "\f134";
+}
+.fa-rocket:before {
+  content: "\f135";
+}
+.fa-maxcdn:before {
+  content: "\f136";
+}
+.fa-chevron-circle-left:before {
+  content: "\f137";
+}
+.fa-chevron-circle-right:before {
+  content: "\f138";
+}
+.fa-chevron-circle-up:before {
+  content: "\f139";
+}
+.fa-chevron-circle-down:before {
+  content: "\f13a";
+}
+.fa-html5:before {
+  content: "\f13b";
+}
+.fa-css3:before {
+  content: "\f13c";
+}
+.fa-anchor:before {
+  content: "\f13d";
+}
+.fa-unlock-alt:before {
+  content: "\f13e";
+}
+.fa-bullseye:before {
+  content: "\f140";
+}
+.fa-ellipsis-h:before {
+  content: "\f141";
+}
+.fa-ellipsis-v:before {
+  content: "\f142";
+}
+.fa-rss-square:before {
+  content: "\f143";
+}
+.fa-play-circle:before {
+  content: "\f144";
+}
+.fa-ticket:before {
+  content: "\f145";
+}
+.fa-minus-square:before {
+  content: "\f146";
+}
+.fa-minus-square-o:before {
+  content: "\f147";
+}
+.fa-level-up:before {
+  content: "\f148";
+}
+.fa-level-down:before {
+  content: "\f149";
+}
+.fa-check-square:before {
+  content: "\f14a";
+}
+.fa-pencil-square:before {
+  content: "\f14b";
+}
+.fa-external-link-square:before {
+  content: "\f14c";
+}
+.fa-share-square:before {
+  content: "\f14d";
+}
+.fa-compass:before {
+  content: "\f14e";
+}
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+  content: "\f150";
+}
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+  content: "\f151";
+}
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+  content: "\f152";
+}
+.fa-euro:before,
+.fa-eur:before {
+  content: "\f153";
+}
+.fa-gbp:before {
+  content: "\f154";
+}
+.fa-dollar:before,
+.fa-usd:before {
+  content: "\f155";
+}
+.fa-rupee:before,
+.fa-inr:before {
+  content: "\f156";
+}
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+  content: "\f157";
+}
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+  content: "\f158";
+}
+.fa-won:before,
+.fa-krw:before {
+  content: "\f159";
+}
+.fa-bitcoin:before,
+.fa-btc:before {
+  content: "\f15a";
+}
+.fa-file:before {
+  content: "\f15b";
+}
+.fa-file-text:before {
+  content: "\f15c";
+}
+.fa-sort-alpha-asc:before {
+  content: "\f15d";
+}
+.fa-sort-alpha-desc:before {
+  content: "\f15e";
+}
+.fa-sort-amount-asc:before {
+  content: "\f160";
+}
+.fa-sort-amount-desc:before {
+  content: "\f161";
+}
+.fa-sort-numeric-asc:before {
+  content: "\f162";
+}
+.fa-sort-numeric-desc:before {
+  content: "\f163";
+}
+.fa-thumbs-up:before {
+  content: "\f164";
+}
+.fa-thumbs-down:before {
+  content: "\f165";
+}
+.fa-youtube-square:before {
+  content: "\f166";
+}
+.fa-youtube:before {
+  content: "\f167";
+}
+.fa-xing:before {
+  content: "\f168";
+}
+.fa-xing-square:before {
+  content: "\f169";
+}
+.fa-youtube-play:before {
+  content: "\f16a";
+}
+.fa-dropbox:before {
+  content: "\f16b";
+}
+.fa-stack-overflow:before {
+  content: "\f16c";
+}
+.fa-instagram:before {
+  content: "\f16d";
+}
+.fa-flickr:before {
+  content: "\f16e";
+}
+.fa-adn:before {
+  content: "\f170";
+}
+.fa-bitbucket:before {
+  content: "\f171";
+}
+.fa-bitbucket-square:before {
+  content: "\f172";
+}
+.fa-tumblr:before {
+  content: "\f173";
+}
+.fa-tumblr-square:before {
+  content: "\f174";
+}
+.fa-long-arrow-down:before {
+  content: "\f175";
+}
+.fa-long-arrow-up:before {
+  content: "\f176";
+}
+.fa-long-arrow-left:before {
+  content: "\f177";
+}
+.fa-long-arrow-right:before {
+  content: "\f178";
+}
+.fa-apple:before {
+  content: "\f179";
+}
+.fa-windows:before {
+  content: "\f17a";
+}
+.fa-android:before {
+  content: "\f17b";
+}
+.fa-linux:before {
+  content: "\f17c";
+}
+.fa-dribbble:before {
+  content: "\f17d";
+}
+.fa-skype:before {
+  content: "\f17e";
+}
+.fa-foursquare:before {
+  content: "\f180";
+}
+.fa-trello:before {
+  content: "\f181";
+}
+.fa-female:before {
+  content: "\f182";
+}
+.fa-male:before {
+  content: "\f183";
+}
+.fa-gittip:before,
+.fa-gratipay:before {
+  content: "\f184";
+}
+.fa-sun-o:before {
+  content: "\f185";
+}
+.fa-moon-o:before {
+  content: "\f186";
+}
+.fa-archive:before {
+  content: "\f187";
+}
+.fa-bug:before {
+  content: "\f188";
+}
+.fa-vk:before {
+  content: "\f189";
+}
+.fa-weibo:before {
+  content: "\f18a";
+}
+.fa-renren:before {
+  content: "\f18b";
+}
+.fa-pagelines:before {
+  content: "\f18c";
+}
+.fa-stack-exchange:before {
+  content: "\f18d";
+}
+.fa-arrow-circle-o-right:before {
+  content: "\f18e";
+}
+.fa-arrow-circle-o-left:before {
+  content: "\f190";
+}
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+  content: "\f191";
+}
+.fa-dot-circle-o:before {
+  content: "\f192";
+}
+.fa-wheelchair:before {
+  content: "\f193";
+}
+.fa-vimeo-square:before {
+  content: "\f194";
+}
+.fa-turkish-lira:before,
+.fa-try:before {
+  content: "\f195";
+}
+.fa-plus-square-o:before {
+  content: "\f196";
+}
+.fa-space-shuttle:before {
+  content: "\f197";
+}
+.fa-slack:before {
+  content: "\f198";
+}
+.fa-envelope-square:before {
+  content: "\f199";
+}
+.fa-wordpress:before {
+  content: "\f19a";
+}
+.fa-openid:before {
+  content: "\f19b";
+}
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+  content: "\f19c";
+}
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+  content: "\f19d";
+}
+.fa-yahoo:before {
+  content: "\f19e";
+}
+.fa-google:before {
+  content: "\f1a0";
+}
+.fa-reddit:before {
+  content: "\f1a1";
+}
+.fa-reddit-square:before {
+  content: "\f1a2";
+}
+.fa-stumbleupon-circle:before {
+  content: "\f1a3";
+}
+.fa-stumbleupon:before {
+  content: "\f1a4";
+}
+.fa-delicious:before {
+  content: "\f1a5";
+}
+.fa-digg:before {
+  content: "\f1a6";
+}
+.fa-pied-piper:before {
+  content: "\f1a7";
+}
+.fa-pied-piper-alt:before {
+  content: "\f1a8";
+}
+.fa-drupal:before {
+  content: "\f1a9";
+}
+.fa-joomla:before {
+  content: "\f1aa";
+}
+.fa-language:before {
+  content: "\f1ab";
+}
+.fa-fax:before {
+  content: "\f1ac";
+}
+.fa-building:before {
+  content: "\f1ad";
+}
+.fa-child:before {
+  content: "\f1ae";
+}
+.fa-paw:before {
+  content: "\f1b0";
+}
+.fa-spoon:before {
+  content: "\f1b1";
+}
+.fa-cube:before {
+  content: "\f1b2";
+}
+.fa-cubes:before {
+  content: "\f1b3";
+}
+.fa-behance:before {
+  content: "\f1b4";
+}
+.fa-behance-square:before {
+  content: "\f1b5";
+}
+.fa-steam:before {
+  content: "\f1b6";
+}
+.fa-steam-square:before {
+  content: "\f1b7";
+}
+.fa-recycle:before {
+  content: "\f1b8";
+}
+.fa-automobile:before,
+.fa-car:before {
+  content: "\f1b9";
+}
+.fa-cab:before,
+.fa-taxi:before {
+  content: "\f1ba";
+}
+.fa-tree:before {
+  content: "\f1bb";
+}
+.fa-spotify:before {
+  content: "\f1bc";
+}
+.fa-deviantart:before {
+  content: "\f1bd";
+}
+.fa-soundcloud:before {
+  content: "\f1be";
+}
+.fa-database:before {
+  content: "\f1c0";
+}
+.fa-file-pdf-o:before {
+  content: "\f1c1";
+}
+.fa-file-word-o:before {
+  content: "\f1c2";
+}
+.fa-file-excel-o:before {
+  content: "\f1c3";
+}
+.fa-file-powerpoint-o:before {
+  content: "\f1c4";
+}
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+  content: "\f1c5";
+}
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+  content: "\f1c6";
+}
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+  content: "\f1c7";
+}
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+  content: "\f1c8";
+}
+.fa-file-code-o:before {
+  content: "\f1c9";
+}
+.fa-vine:before {
+  content: "\f1ca";
+}
+.fa-codepen:before {
+  content: "\f1cb";
+}
+.fa-jsfiddle:before {
+  content: "\f1cc";
+}
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+  content: "\f1cd";
+}
+.fa-circle-o-notch:before {
+  content: "\f1ce";
+}
+.fa-ra:before,
+.fa-rebel:before {
+  content: "\f1d0";
+}
+.fa-ge:before,
+.fa-empire:before {
+  content: "\f1d1";
+}
+.fa-git-square:before {
+  content: "\f1d2";
+}
+.fa-git:before {
+  content: "\f1d3";
+}
+.fa-y-combinator-square:before,
+.fa-yc-square:before,
+.fa-hacker-news:before {
+  content: "\f1d4";
+}
+.fa-tencent-weibo:before {
+  content: "\f1d5";
+}
+.fa-qq:before {
+  content: "\f1d6";
+}
+.fa-wechat:before,
+.fa-weixin:before {
+  content: "\f1d7";
+}
+.fa-send:before,
+.fa-paper-plane:before {
+  content: "\f1d8";
+}
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+  content: "\f1d9";
+}
+.fa-history:before {
+  content: "\f1da";
+}
+.fa-circle-thin:before {
+  content: "\f1db";
+}
+.fa-header:before {
+  content: "\f1dc";
+}
+.fa-paragraph:before {
+  content: "\f1dd";
+}
+.fa-sliders:before {
+  content: "\f1de";
+}
+.fa-share-alt:before {
+  content: "\f1e0";
+}
+.fa-share-alt-square:before {
+  content: "\f1e1";
+}
+.fa-bomb:before {
+  content: "\f1e2";
+}
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+  content: "\f1e3";
+}
+.fa-tty:before {
+  content: "\f1e4";
+}
+.fa-binoculars:before {
+  content: "\f1e5";
+}
+.fa-plug:before {
+  content: "\f1e6";
+}
+.fa-slideshare:before {
+  content: "\f1e7";
+}
+.fa-twitch:before {
+  content: "\f1e8";
+}
+.fa-yelp:before {
+  content: "\f1e9";
+}
+.fa-newspaper-o:before {
+  content: "\f1ea";
+}
+.fa-wifi:before {
+  content: "\f1eb";
+}
+.fa-calculator:before {
+  content: "\f1ec";
+}
+.fa-paypal:before {
+  content: "\f1ed";
+}
+.fa-google-wallet:before {
+  content: "\f1ee";
+}
+.fa-cc-visa:before {
+  content: "\f1f0";
+}
+.fa-cc-mastercard:before {
+  content: "\f1f1";
+}
+.fa-cc-discover:before {
+  content: "\f1f2";
+}
+.fa-cc-amex:before {
+  content: "\f1f3";
+}
+.fa-cc-paypal:before {
+  content: "\f1f4";
+}
+.fa-cc-stripe:before {
+  content: "\f1f5";
+}
+.fa-bell-slash:before {
+  content: "\f1f6";
+}
+.fa-bell-slash-o:before {
+  content: "\f1f7";
+}
+.fa-trash:before {
+  content: "\f1f8";
+}
+.fa-copyright:before {
+  content: "\f1f9";
+}
+.fa-at:before {
+  content: "\f1fa";
+}
+.fa-eyedropper:before {
+  content: "\f1fb";
+}
+.fa-paint-brush:before {
+  content: "\f1fc";
+}
+.fa-birthday-cake:before {
+  content: "\f1fd";
+}
+.fa-area-chart:before {
+  content: "\f1fe";
+}
+.fa-pie-chart:before {
+  content: "\f200";
+}
+.fa-line-chart:before {
+  content: "\f201";
+}
+.fa-lastfm:before {
+  content: "\f202";
+}
+.fa-lastfm-square:before {
+  content: "\f203";
+}
+.fa-toggle-off:before {
+  content: "\f204";
+}
+.fa-toggle-on:before {
+  content: "\f205";
+}
+.fa-bicycle:before {
+  content: "\f206";
+}
+.fa-bus:before {
+  content: "\f207";
+}
+.fa-ioxhost:before {
+  content: "\f208";
+}
+.fa-angellist:before {
+  content: "\f209";
+}
+.fa-cc:before {
+  content: "\f20a";
+}
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+  content: "\f20b";
+}
+.fa-meanpath:before {
+  content: "\f20c";
+}
+.fa-buysellads:before {
+  content: "\f20d";
+}
+.fa-connectdevelop:before {
+  content: "\f20e";
+}
+.fa-dashcube:before {
+  content: "\f210";
+}
+.fa-forumbee:before {
+  content: "\f211";
+}
+.fa-leanpub:before {
+  content: "\f212";
+}
+.fa-sellsy:before {
+  content: "\f213";
+}
+.fa-shirtsinbulk:before {
+  content: "\f214";
+}
+.fa-simplybuilt:before {
+  content: "\f215";
+}
+.fa-skyatlas:before {
+  content: "\f216";
+}
+.fa-cart-plus:before {
+  content: "\f217";
+}
+.fa-cart-arrow-down:before {
+  content: "\f218";
+}
+.fa-diamond:before {
+  content: "\f219";
+}
+.fa-ship:before {
+  content: "\f21a";
+}
+.fa-user-secret:before {
+  content: "\f21b";
+}
+.fa-motorcycle:before {
+  content: "\f21c";
+}
+.fa-street-view:before {
+  content: "\f21d";
+}
+.fa-heartbeat:before {
+  content: "\f21e";
+}
+.fa-venus:before {
+  content: "\f221";
+}
+.fa-mars:before {
+  content: "\f222";
+}
+.fa-mercury:before {
+  content: "\f223";
+}
+.fa-intersex:before,
+.fa-transgender:before {
+  content: "\f224";
+}
+.fa-transgender-alt:before {
+  content: "\f225";
+}
+.fa-venus-double:before {
+  content: "\f226";
+}
+.fa-mars-double:before {
+  content: "\f227";
+}
+.fa-venus-mars:before {
+  content: "\f228";
+}
+.fa-mars-stroke:before {
+  content: "\f229";
+}
+.fa-mars-stroke-v:before {
+  content: "\f22a";
+}
+.fa-mars-stroke-h:before {
+  content: "\f22b";
+}
+.fa-neuter:before {
+  content: "\f22c";
+}
+.fa-genderless:before {
+  content: "\f22d";
+}
+.fa-facebook-official:before {
+  content: "\f230";
+}
+.fa-pinterest-p:before {
+  content: "\f231";
+}
+.fa-whatsapp:before {
+  content: "\f232";
+}
+.fa-server:before {
+  content: "\f233";
+}
+.fa-user-plus:before {
+  content: "\f234";
+}
+.fa-user-times:before {
+  content: "\f235";
+}
+.fa-hotel:before,
+.fa-bed:before {
+  content: "\f236";
+}
+.fa-viacoin:before {
+  content: "\f237";
+}
+.fa-train:before {
+  content: "\f238";
+}
+.fa-subway:before {
+  content: "\f239";
+}
+.fa-medium:before {
+  content: "\f23a";
+}
+.fa-yc:before,
+.fa-y-combinator:before {
+  content: "\f23b";
+}
+.fa-optin-monster:before {
+  content: "\f23c";
+}
+.fa-opencart:before {
+  content: "\f23d";
+}
+.fa-expeditedssl:before {
+  content: "\f23e";
+}
+.fa-battery-4:before,
+.fa-battery-full:before {
+  content: "\f240";
+}
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+  content: "\f241";
+}
+.fa-battery-2:before,
+.fa-battery-half:before {
+  content: "\f242";
+}
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+  content: "\f243";
+}
+.fa-battery-0:before,
+.fa-battery-empty:before {
+  content: "\f244";
+}
+.fa-mouse-pointer:before {
+  content: "\f245";
+}
+.fa-i-cursor:before {
+  content: "\f246";
+}
+.fa-object-group:before {
+  content: "\f247";
+}
+.fa-object-ungroup:before {
+  content: "\f248";
+}
+.fa-sticky-note:before {
+  content: "\f249";
+}
+.fa-sticky-note-o:before {
+  content: "\f24a";
+}
+.fa-cc-jcb:before {
+  content: "\f24b";
+}
+.fa-cc-diners-club:before {
+  content: "\f24c";
+}
+.fa-clone:before {
+  content: "\f24d";
+}
+.fa-balance-scale:before {
+  content: "\f24e";
+}
+.fa-hourglass-o:before {
+  content: "\f250";
+}
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+  content: "\f251";
+}
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+  content: "\f252";
+}
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+  content: "\f253";
+}
+.fa-hourglass:before {
+  content: "\f254";
+}
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+  content: "\f255";
+}
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+  content: "\f256";
+}
+.fa-hand-scissors-o:before {
+  content: "\f257";
+}
+.fa-hand-lizard-o:before {
+  content: "\f258";
+}
+.fa-hand-spock-o:before {
+  content: "\f259";
+}
+.fa-hand-pointer-o:before {
+  content: "\f25a";
+}
+.fa-hand-peace-o:before {
+  content: "\f25b";
+}
+.fa-trademark:before {
+  content: "\f25c";
+}
+.fa-registered:before {
+  content: "\f25d";
+}
+.fa-creative-commons:before {
+  content: "\f25e";
+}
+.fa-gg:before {
+  content: "\f260";
+}
+.fa-gg-circle:before {
+  content: "\f261";
+}
+.fa-tripadvisor:before {
+  content: "\f262";
+}
+.fa-odnoklassniki:before {
+  content: "\f263";
+}
+.fa-odnoklassniki-square:before {
+  content: "\f264";
+}
+.fa-get-pocket:before {
+  content: "\f265";
+}
+.fa-wikipedia-w:before {
+  content: "\f266";
+}
+.fa-safari:before {
+  content: "\f267";
+}
+.fa-chrome:before {
+  content: "\f268";
+}
+.fa-firefox:before {
+  content: "\f269";
+}
+.fa-opera:before {
+  content: "\f26a";
+}
+.fa-internet-explorer:before {
+  content: "\f26b";
+}
+.fa-tv:before,
+.fa-television:before {
+  content: "\f26c";
+}
+.fa-contao:before {
+  content: "\f26d";
+}
+.fa-500px:before {
+  content: "\f26e";
+}
+.fa-amazon:before {
+  content: "\f270";
+}
+.fa-calendar-plus-o:before {
+  content: "\f271";
+}
+.fa-calendar-minus-o:before {
+  content: "\f272";
+}
+.fa-calendar-times-o:before {
+  content: "\f273";
+}
+.fa-calendar-check-o:before {
+  content: "\f274";
+}
+.fa-industry:before {
+  content: "\f275";
+}
+.fa-map-pin:before {
+  content: "\f276";
+}
+.fa-map-signs:before {
+  content: "\f277";
+}
+.fa-map-o:before {
+  content: "\f278";
+}
+.fa-map:before {
+  content: "\f279";
+}
+.fa-commenting:before {
+  content: "\f27a";
+}
+.fa-commenting-o:before {
+  content: "\f27b";
+}
+.fa-houzz:before {
+  content: "\f27c";
+}
+.fa-vimeo:before {
+  content: "\f27d";
+}
+.fa-black-tie:before {
+  content: "\f27e";
+}
+.fa-fonticons:before {
+  content: "\f280";
+}
diff --git a/management/guns-admin/src/main/webapp/static/css/font-awesome.min.css b/management/guns-admin/src/main/webapp/static/css/font-awesome.min.css
new file mode 100644
index 0000000..ee4e978
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ *  Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}
diff --git a/management/guns-admin/src/main/webapp/static/css/login.css b/management/guns-admin/src/main/webapp/static/css/login.css
new file mode 100644
index 0000000..bfe8cb6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/login.css
@@ -0,0 +1,93 @@
+html{height: 100%;}
+body.signin {
+    background: #18c8f6;
+    height: auto;
+    background:url("../img/login-background.jpg") no-repeat center fixed;
+    -webkit-background-size: cover;
+    -moz-background-size: cover;
+    -o-background-size: cover;
+    background-size: cover;
+    color: rgba(255,255,255,.95);
+}
+
+.signinpanel {
+    width: 750px;
+    margin: 10% auto 0 auto;
+}
+
+.signinpanel .logopanel {
+    float: none;
+    width: auto;
+    padding: 0;
+    background: none;
+}
+
+.signinpanel .signin-info ul {
+    list-style: none;
+    padding: 0;
+    margin: 20px 0;
+}
+
+.signinpanel .form-control {
+    display: block;
+    margin-top: 15px;
+}
+
+.signinpanel .uname {
+    background: #fff url(../img/user.png) no-repeat 95% center;color:#333;
+}
+
+.signinpanel .pword {
+    background: #fff url(../img/locked.png) no-repeat 95% center;color:#333;
+}
+
+.signinpanel .btn {
+    margin-top: 15px;
+}
+
+.signinpanel form {
+    background: rgba(255, 255, 255, 0.2);
+    border: 1px solid rgba(255,255,255,.3);
+    -moz-box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03);
+    -webkit-box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03);
+    box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03);
+    -moz-border-radius: 3px;
+    -webkit-border-radius: 3px;
+    border-radius: 3px;
+    padding: 30px;
+}
+
+.signup-footer{border-top: solid 1px rgba(255,255,255,.3);margin:20px 0;padding-top: 15px;}
+
+@media screen and (max-width: 768px) {
+    .signinpanel,
+    .signuppanel {
+        margin: 0 auto;
+        width: 420px!important;
+        padding: 20px;
+    }
+    .signinpanel form {
+        margin-top: 20px;
+    }
+    .signup-footer {
+        margin-bottom: 10px;
+    }
+    .signuppanel .form-control {
+        margin-bottom: 10px;
+    }
+    .signup-footer .pull-left,
+    .signup-footer .pull-right {
+        float: none !important;
+        text-align: center;
+    }
+    .signinpanel .signin-info ul {
+        display: none;
+    }
+}
+@media screen and (max-width: 320px) {
+    .signinpanel,
+    .signuppanel {
+        margin:0 20px;
+        width:auto;
+    }
+}
diff --git a/management/guns-admin/src/main/webapp/static/css/patterns/header-profile-skin-1.png b/management/guns-admin/src/main/webapp/static/css/patterns/header-profile-skin-1.png
new file mode 100644
index 0000000..41c5c08
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/patterns/header-profile-skin-1.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/patterns/header-profile-skin-3.png b/management/guns-admin/src/main/webapp/static/css/patterns/header-profile-skin-3.png
new file mode 100644
index 0000000..7a80132
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/patterns/header-profile-skin-3.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/patterns/header-profile.png b/management/guns-admin/src/main/webapp/static/css/patterns/header-profile.png
new file mode 100644
index 0000000..7dea7f2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/patterns/header-profile.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/patterns/shattered.png b/management/guns-admin/src/main/webapp/static/css/patterns/shattered.png
new file mode 100644
index 0000000..90ed42b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/patterns/shattered.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css b/management/guns-admin/src/main/webapp/static/css/plugins/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css
new file mode 100644
index 0000000..f4e6575
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css
@@ -0,0 +1,251 @@
+.checkbox {
+  padding-left: 20px;
+}
+.checkbox label {
+  display: inline-block;
+  vertical-align: middle;
+  position: relative;
+  padding-left: 5px;
+}
+.checkbox label::before {
+  content: "";
+  display: inline-block;
+  position: absolute;
+  width: 17px;
+  height: 17px;
+  left: 0;
+  margin-left: -20px;
+  border: 1px solid #cccccc;
+  border-radius: 3px;
+  background-color: #fff;
+  -webkit-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
+  -o-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
+  transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
+}
+.checkbox label::after {
+  display: inline-block;
+  position: absolute;
+  width: 16px;
+  height: 16px;
+  left: 0;
+  top: 0;
+  margin-left: -20px;
+  padding-left: 3px;
+  padding-top: 1px;
+  font-size: 11px;
+  color: #555555;
+}
+.checkbox input[type="checkbox"],
+.checkbox input[type="radio"] {
+  opacity: 0;
+  z-index: 1;
+}
+.checkbox input[type="checkbox"]:focus + label::before,
+.checkbox input[type="radio"]:focus + label::before {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.checkbox input[type="checkbox"]:checked + label::after,
+.checkbox input[type="radio"]:checked + label::after {
+  font-family: "FontAwesome";
+  content: "\f00c";
+}
+.checkbox input[type="checkbox"]:disabled + label,
+.checkbox input[type="radio"]:disabled + label {
+  opacity: 0.65;
+}
+.checkbox input[type="checkbox"]:disabled + label::before,
+.checkbox input[type="radio"]:disabled + label::before {
+  background-color: #eeeeee;
+  cursor: not-allowed;
+}
+.checkbox.checkbox-circle label::before {
+  border-radius: 50%;
+}
+.checkbox.checkbox-inline {
+  margin-top: 0;
+}
+
+.checkbox-primary input[type="checkbox"]:checked + label::before,
+.checkbox-primary input[type="radio"]:checked + label::before {
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.checkbox-primary input[type="checkbox"]:checked + label::after,
+.checkbox-primary input[type="radio"]:checked + label::after {
+  color: #fff;
+}
+
+.checkbox-danger input[type="checkbox"]:checked + label::before,
+.checkbox-danger input[type="radio"]:checked + label::before {
+  background-color: #d9534f;
+  border-color: #d9534f;
+}
+.checkbox-danger input[type="checkbox"]:checked + label::after,
+.checkbox-danger input[type="radio"]:checked + label::after {
+  color: #fff;
+}
+
+.checkbox-info input[type="checkbox"]:checked + label::before,
+.checkbox-info input[type="radio"]:checked + label::before {
+  background-color: #5bc0de;
+  border-color: #5bc0de;
+}
+.checkbox-info input[type="checkbox"]:checked + label::after,
+.checkbox-info input[type="radio"]:checked + label::after {
+  color: #fff;
+}
+
+.checkbox-warning input[type="checkbox"]:checked + label::before,
+.checkbox-warning input[type="radio"]:checked + label::before {
+  background-color: #f0ad4e;
+  border-color: #f0ad4e;
+}
+.checkbox-warning input[type="checkbox"]:checked + label::after,
+.checkbox-warning input[type="radio"]:checked + label::after {
+  color: #fff;
+}
+
+.checkbox-success input[type="checkbox"]:checked + label::before,
+.checkbox-success input[type="radio"]:checked + label::before {
+  background-color: #5cb85c;
+  border-color: #5cb85c;
+}
+.checkbox-success input[type="checkbox"]:checked + label::after,
+.checkbox-success input[type="radio"]:checked + label::after {
+  color: #fff;
+}
+
+.radio {
+  padding-left: 20px;
+}
+.radio label {
+  display: inline-block;
+  vertical-align: middle;
+  position: relative;
+  padding-left: 5px;
+}
+.radio label::before {
+  content: "";
+  display: inline-block;
+  position: absolute;
+  width: 17px;
+  height: 17px;
+  left: 0;
+  margin-left: -20px;
+  border: 1px solid #cccccc;
+  border-radius: 50%;
+  background-color: #fff;
+  -webkit-transition: border 0.15s ease-in-out;
+  -o-transition: border 0.15s ease-in-out;
+  transition: border 0.15s ease-in-out;
+}
+.radio label::after {
+  display: inline-block;
+  position: absolute;
+  content: " ";
+  width: 11px;
+  height: 11px;
+  left: 3px;
+  top: 3px;
+  margin-left: -20px;
+  border-radius: 50%;
+  background-color: #555555;
+  -webkit-transform: scale(0, 0);
+  -ms-transform: scale(0, 0);
+  -o-transform: scale(0, 0);
+  transform: scale(0, 0);
+  -webkit-transition: -webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
+  -moz-transition: -moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
+  -o-transition: -o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
+  transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
+}
+.radio input[type="radio"] {
+  opacity: 0;
+  z-index: 1;
+}
+.radio input[type="radio"]:focus + label::before {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.radio input[type="radio"]:checked + label::after {
+  -webkit-transform: scale(1, 1);
+  -ms-transform: scale(1, 1);
+  -o-transform: scale(1, 1);
+  transform: scale(1, 1);
+}
+.radio input[type="radio"]:disabled + label {
+  opacity: 0.65;
+}
+.radio input[type="radio"]:disabled + label::before {
+  cursor: not-allowed;
+}
+.radio.radio-inline {
+  margin-top: 0;
+}
+
+.radio-primary input[type="radio"] + label::after {
+  background-color: #337ab7;
+}
+.radio-primary input[type="radio"]:checked + label::before {
+  border-color: #337ab7;
+}
+.radio-primary input[type="radio"]:checked + label::after {
+  background-color: #337ab7;
+}
+
+.radio-danger input[type="radio"] + label::after {
+  background-color: #d9534f;
+}
+.radio-danger input[type="radio"]:checked + label::before {
+  border-color: #d9534f;
+}
+.radio-danger input[type="radio"]:checked + label::after {
+  background-color: #d9534f;
+}
+
+.radio-info input[type="radio"] + label::after {
+  background-color: #5bc0de;
+}
+.radio-info input[type="radio"]:checked + label::before {
+  border-color: #5bc0de;
+}
+.radio-info input[type="radio"]:checked + label::after {
+  background-color: #5bc0de;
+}
+
+.radio-warning input[type="radio"] + label::after {
+  background-color: #f0ad4e;
+}
+.radio-warning input[type="radio"]:checked + label::before {
+  border-color: #f0ad4e;
+}
+.radio-warning input[type="radio"]:checked + label::after {
+  background-color: #f0ad4e;
+}
+
+.radio-success input[type="radio"] + label::after {
+  background-color: #5cb85c;
+}
+.radio-success input[type="radio"]:checked + label::before {
+  border-color: #5cb85c;
+}
+.radio-success input[type="radio"]:checked + label::after {
+  background-color: #5cb85c;
+}
+
+input[type="checkbox"].styled:checked + label:after,
+input[type="radio"].styled:checked + label:after {
+  font-family: 'FontAwesome';
+  content: "\f00c";
+}
+input[type="checkbox"] .styled:checked + label::before,
+input[type="radio"] .styled:checked + label::before {
+  color: #fff;
+}
+input[type="checkbox"] .styled:checked + label::after,
+input[type="radio"] .styled:checked + label::after {
+  color: #fff;
+}
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/bootstrap-table/bootstrap-table.min.css b/management/guns-admin/src/main/webapp/static/css/plugins/bootstrap-table/bootstrap-table.min.css
new file mode 100644
index 0000000..f65b308
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/bootstrap-table/bootstrap-table.min.css
@@ -0,0 +1 @@
+.fixed-table-container .bs-checkbox,.fixed-table-container .no-records-found{text-align:center}.fixed-table-body thead th .th-inner,.table td,.table th{box-sizing:border-box}.bootstrap-table .table{margin-bottom:0!important;border-bottom:1px solid #ddd;border-collapse:collapse!important;border-radius:1px}.bootstrap-table .table:not(.table-condensed),.bootstrap-table .table:not(.table-condensed)>tbody>tr>td,.bootstrap-table .table:not(.table-condensed)>tbody>tr>th,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>td,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>th,.bootstrap-table .table:not(.table-condensed)>thead>tr>td{padding:8px}.bootstrap-table .table.table-no-bordered>tbody>tr>td,.bootstrap-table .table.table-no-bordered>thead>tr>th{border-right:2px solid transparent}.bootstrap-table .table.table-no-bordered>tbody>tr>td:last-child{border-right:none}.fixed-table-container{position:relative;clear:both;border:1px solid #ddd;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px}.fixed-table-container.table-no-bordered{border:1px solid transparent}.fixed-table-footer,.fixed-table-header{overflow:hidden}.fixed-table-footer{border-top:1px solid #ddd}.fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.fixed-table-container table{width:100%}.fixed-table-container thead th{height:0;padding:0;margin:0;border-left:1px solid #ddd}.fixed-table-container thead th:focus{outline:transparent solid 0}.fixed-table-container thead th:first-child{border-left:none;border-top-left-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px}.fixed-table-container tbody td .th-inner,.fixed-table-container thead th .th-inner{padding:8px;line-height:24px;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fixed-table-container thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px}.fixed-table-container thead th .both{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC')}.fixed-table-container thead th .asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}.fixed-table-container thead th .desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}.fixed-table-container th.detail{width:30px}.fixed-table-container tbody td{border-left:1px solid #ddd}.fixed-table-container tbody tr:first-child td{border-top:none}.fixed-table-container tbody td:first-child{border-left:none}.fixed-table-container tbody .selected td{background-color:#f5f5f5}.fixed-table-container .bs-checkbox .th-inner{padding:8px 0}.fixed-table-container input[type=radio],.fixed-table-container input[type=checkbox]{margin:0 auto!important}.fixed-table-pagination .pagination-detail,.fixed-table-pagination div.pagination{margin-top:10px;margin-bottom:10px}.fixed-table-pagination div.pagination .pagination{margin:0}.fixed-table-pagination .pagination a{padding:6px 12px;line-height:1.428571429}.fixed-table-pagination .pagination-info{line-height:34px;margin-right:5px}.fixed-table-pagination .btn-group{position:relative;display:inline-block;vertical-align:middle}.fixed-table-pagination .dropup .dropdown-menu{margin-bottom:0}.fixed-table-pagination .page-list{display:inline-block}.fixed-table-toolbar .columns-left{margin-right:5px}.fixed-table-toolbar .columns-right{margin-left:5px}.fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.fixed-table-toolbar .bs-bars,.fixed-table-toolbar .columns,.fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px;line-height:34px}.fixed-table-pagination li.disabled a{pointer-events:none;cursor:default}.fixed-table-loading{display:none;position:absolute;top:42px;right:0;bottom:0;left:0;z-index:99;background-color:#fff;text-align:center}.fixed-table-body .card-view .title{font-weight:700;display:inline-block;min-width:30%;text-align:left!important}.table td,.table th{vertical-align:middle}.fixed-table-toolbar .dropdown-menu{text-align:left;max-height:300px;overflow:auto}.fixed-table-toolbar .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.fixed-table-toolbar .btn-group>.btn-group>.btn{border-radius:0}.fixed-table-toolbar .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.fixed-table-toolbar .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .table>thead>tr>th{vertical-align:bottom;border-bottom:1px solid #ddd}.bootstrap-table .table thead>tr>th{padding:0;margin:0}.bootstrap-table .fixed-table-footer tbody>tr>td{padding:0!important}.bootstrap-table .fixed-table-footer .table{border-bottom:none;border-radius:0;padding:0!important}.bootstrap-table .pull-right .dropdown-menu{right:0;left:auto}p.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden}.fixed-table-pagination:after,.fixed-table-toolbar:after{content:"";display:block;clear:both}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/bootstrap-treetable/bootstrap-treetable.css b/management/guns-admin/src/main/webapp/static/css/plugins/bootstrap-treetable/bootstrap-treetable.css
new file mode 100644
index 0000000..ab08de5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/bootstrap-treetable/bootstrap-treetable.css
@@ -0,0 +1,10 @@
+.treetable-indent {width:16px; height: 16px; display: inline-block; position: relative;}
+.treetable-expander {width:16px; height: 16px; display: inline-block; position: relative; cursor: pointer;}
+.treetable-selected{background: #f5f5f5 !important;}
+.treetable-table{border:0 !important;margin-bottom:0}
+.treetable-table tbody {display:block;height:auto;overflow-y:auto;}
+.treetable-table thead, .treetable-table tbody tr {display:table;width:100%;table-layout:fixed;}
+.treetable-thead th{line-height:40px;border: 0 !important;background:#fff !important;border-radius: 4px;border-left:1px solid #e7eaec !important;border-bottom:2px solid #e7eaec !important;text-align: center;}
+.treetable-thead tr :first-child{border-left:0 !important}
+.treetable-tbody td{border: 0 !important;border-left:1px solid #e7eaec !important;border-bottom:1px solid #e7eaec !important;}
+.treetable-tbody tr :first-child{border-left:0 !important}
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen-sprite.png b/management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen-sprite.png
new file mode 100644
index 0000000..3611ae4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen-sprite.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen-sprite@2x.png b/management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen-sprite@2x.png
new file mode 100644
index 0000000..ffe4d7d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen-sprite@2x.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen.css b/management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen.css
new file mode 100644
index 0000000..edd6767
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/chosen/chosen.css
@@ -0,0 +1,423 @@
+/*!
+Chosen, a Select Box Enhancer for jQuery and Prototype
+by Patrick Filler for Harvest, http://getharvest.com
+
+Version 1.1.0
+Full source at https://github.com/harvesthq/chosen
+Copyright (c) 2011 Harvest http://getharvest.com
+
+MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+This file is generated by `grunt build`, do not edit it by hand.
+*/
+
+/* @group Base */
+.chosen-container {
+    position: relative;
+    display: inline-block;
+    vertical-align: middle;
+    font-size: 13px;
+    zoom: 1;
+    *display: inline;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    user-select: none;
+}
+.chosen-container .chosen-drop {
+    position: absolute;
+    top: 100%;
+    left: -9999px;
+    z-index: 1010;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    width: 100%;
+    border: 1px solid #aaa;
+    border-top: 0;
+    background: #fff;
+    box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
+}
+.chosen-container.chosen-with-drop .chosen-drop {
+    left: 0;
+}
+.chosen-container a {
+    cursor: pointer;
+}
+
+/* @end */
+/* @group Single Chosen */
+.chosen-container-single .chosen-single {
+    position: relative;
+    display: block;
+    overflow: hidden;
+    padding: 0 0 0 8px;
+    height: 23px;
+    border: 1px solid #aaa;
+    border-radius: 5px;
+    background-color: #fff;
+    background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
+    background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+    background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+    background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+    background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+    background-clip: padding-box;
+    box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1);
+    color: #444;
+    text-decoration: none;
+    white-space: nowrap;
+    line-height: 24px;
+}
+.chosen-container-single .chosen-default {
+    color: #999;
+}
+.chosen-container-single .chosen-single span {
+    display: block;
+    overflow: hidden;
+    margin-right: 26px;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+.chosen-container-single .chosen-single-with-deselect span {
+    margin-right: 38px;
+}
+.chosen-container-single .chosen-single abbr {
+    position: absolute;
+    top: 6px;
+    right: 26px;
+    display: block;
+    width: 12px;
+    height: 12px;
+    background: url('chosen-sprite.png') -42px 1px no-repeat;
+    font-size: 1px;
+}
+.chosen-container-single .chosen-single abbr:hover {
+    background-position: -42px -10px;
+}
+.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
+    background-position: -42px -10px;
+}
+.chosen-container-single .chosen-single div {
+    position: absolute;
+    top: 0;
+    right: 0;
+    display: block;
+    width: 18px;
+    height: 100%;
+}
+.chosen-container-single .chosen-single div b {
+    display: block;
+    width: 100%;
+    height: 100%;
+    background: url('chosen-sprite.png') no-repeat 0px 7px;
+}
+.chosen-container-single .chosen-search {
+    position: relative;
+    z-index: 1010;
+    margin: 0;
+    padding: 3px 4px;
+    white-space: nowrap;
+}
+.chosen-container-single .chosen-search input[type="text"] {
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    margin: 1px 0;
+    padding: 4px 20px 4px 5px;
+    width: 100%;
+    height: auto;
+    outline: 0;
+    border: 1px solid #aaa;
+    background: white url('chosen-sprite.png') no-repeat 100% -20px;
+    background: url('chosen-sprite.png') no-repeat 100% -20px;
+    font-size: 1em;
+    font-family: sans-serif;
+    line-height: normal;
+    border-radius: 0;
+}
+.chosen-container-single .chosen-drop {
+    margin-top: -1px;
+    border-radius: 0 0 4px 4px;
+    background-clip: padding-box;
+}
+.chosen-container-single.chosen-container-single-nosearch .chosen-search {
+    position: absolute;
+    left: -9999px;
+}
+
+/* @end */
+/* @group Results */
+.chosen-container .chosen-results {
+    position: relative;
+    overflow-x: hidden;
+    overflow-y: auto;
+    margin: 0 4px 4px 0;
+    padding: 0 0 0 4px;
+    max-height: 240px;
+    -webkit-overflow-scrolling: touch;
+}
+.chosen-container .chosen-results li {
+    display: none;
+    margin: 0;
+    padding: 5px 6px;
+    list-style: none;
+    line-height: 15px;
+    -webkit-touch-callout: none;
+}
+.chosen-container .chosen-results li.active-result {
+    display: list-item;
+    cursor: pointer;
+}
+.chosen-container .chosen-results li.disabled-result {
+    display: list-item;
+    color: #ccc;
+    cursor: default;
+}
+.chosen-container .chosen-results li.highlighted {
+    background-color: #3875d7;
+    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
+    background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%);
+    background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%);
+    background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%);
+    background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
+    color: #fff;
+}
+.chosen-container .chosen-results li.no-results {
+    display: list-item;
+    background: #f4f4f4;
+}
+.chosen-container .chosen-results li.group-result {
+    display: list-item;
+    font-weight: bold;
+    cursor: default;
+}
+.chosen-container .chosen-results li.group-option {
+    padding-left: 15px;
+}
+.chosen-container .chosen-results li em {
+    font-style: normal;
+    text-decoration: underline;
+}
+
+/* @end */
+/* @group Multi Chosen */
+.chosen-container-multi .chosen-choices {
+    -moz-box-sizing: border-box;
+    background-color: #FFFFFF;
+    border: 1px solid #CBD5DD;
+    border-radius: 2px;
+    cursor: text;
+    height: auto !important;
+    margin: 0;
+    min-height: 30px;
+    overflow: hidden;
+    padding: 2px;
+    position: relative;
+    width: 100%;
+}
+.chosen-container-multi .chosen-choices li {
+    float: left;
+    list-style: none;
+}
+.chosen-container-multi .chosen-choices li.search-field {
+    margin: 0;
+    padding: 0;
+    white-space: nowrap;
+}
+.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
+    margin: 1px 0;
+    padding: 5px;
+    height: 25px;
+    outline: 0;
+    border: 0 !important;
+    background: transparent !important;
+    box-shadow: none;
+    color: #666;
+    font-size: 100%;
+    font-family: sans-serif;
+    line-height: normal;
+    border-radius: 0;
+}
+.chosen-container-multi .chosen-choices li.search-field .default {
+    color: #999;
+}
+.chosen-container-multi .chosen-choices li.search-choice {
+    position: relative;
+    margin: 3px 0 3px 5px;
+    padding: 3px 20px 3px 5px;
+    border: 1px solid #aaa;
+    border-radius: 3px;
+    background-color: #e4e4e4;
+    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+    background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+    background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+    background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+    background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+    background-clip: padding-box;
+    box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);
+    color: #333;
+    line-height: 13px;
+    cursor: default;
+}
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
+    position: absolute;
+    top: 4px;
+    right: 3px;
+    display: block;
+    width: 12px;
+    height: 12px;
+    background: url('chosen-sprite.png') -42px 1px no-repeat;
+    font-size: 1px;
+}
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
+    background-position: -42px -10px;
+}
+.chosen-container-multi .chosen-choices li.search-choice-disabled {
+    padding-right: 5px;
+    border: 1px solid #ccc;
+    background-color: #e4e4e4;
+    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+    background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+    background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+    background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+    background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+    color: #666;
+}
+.chosen-container-multi .chosen-choices li.search-choice-focus {
+    background: #d4d4d4;
+}
+.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
+    background-position: -42px -10px;
+}
+.chosen-container-multi .chosen-results {
+    margin: 0;
+    padding: 0;
+}
+.chosen-container-multi .chosen-drop .result-selected {
+    display: list-item;
+    color: #ccc;
+    cursor: default;
+}
+
+/* @end */
+/* @group Active  */
+.chosen-container-active .chosen-single {
+    border: 1px solid #5897fb;
+    box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
+}
+.chosen-container-active.chosen-with-drop .chosen-single {
+    border: 1px solid #aaa;
+    -moz-border-radius-bottomright: 0;
+    border-bottom-right-radius: 0;
+    -moz-border-radius-bottomleft: 0;
+    border-bottom-left-radius: 0;
+}
+.chosen-container-active.chosen-with-drop .chosen-single div {
+    border-left: none;
+    background: transparent;
+}
+.chosen-container-active.chosen-with-drop .chosen-single div b {
+    background-position: -18px 7px;
+}
+.chosen-container-active .chosen-choices {
+    border: 1px solid #5897fb;
+    box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
+}
+.chosen-container-active .chosen-choices li.search-field input[type="text"] {
+    color: #111 !important;
+}
+
+/* @end */
+/* @group Disabled Support */
+.chosen-disabled {
+    opacity: 0.5 !important;
+    cursor: default;
+}
+.chosen-disabled .chosen-single {
+    cursor: default;
+}
+.chosen-disabled .chosen-choices .search-choice .search-choice-close {
+    cursor: default;
+}
+
+/* @end */
+/* @group Right to Left */
+.chosen-rtl {
+    text-align: right;
+}
+.chosen-rtl .chosen-single {
+    overflow: visible;
+    padding: 0 8px 0 0;
+}
+.chosen-rtl .chosen-single span {
+    margin-right: 0;
+    margin-left: 26px;
+    direction: rtl;
+}
+.chosen-rtl .chosen-single-with-deselect span {
+    margin-left: 38px;
+}
+.chosen-rtl .chosen-single div {
+    right: auto;
+    left: 3px;
+}
+.chosen-rtl .chosen-single abbr {
+    right: auto;
+    left: 26px;
+}
+.chosen-rtl .chosen-choices li {
+    float: right;
+}
+.chosen-rtl .chosen-choices li.search-field input[type="text"] {
+    direction: rtl;
+}
+.chosen-rtl .chosen-choices li.search-choice {
+    margin: 3px 5px 3px 0;
+    padding: 3px 5px 3px 19px;
+}
+.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
+    right: auto;
+    left: 4px;
+}
+.chosen-rtl.chosen-container-single-nosearch .chosen-search,
+.chosen-rtl .chosen-drop {
+    left: 9999px;
+}
+.chosen-rtl.chosen-container-single .chosen-results {
+    margin: 0 0 4px 4px;
+    padding: 0 4px 0 0;
+}
+.chosen-rtl .chosen-results li.group-option {
+    padding-right: 15px;
+    padding-left: 0;
+}
+.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
+    border-right: none;
+}
+.chosen-rtl .chosen-search input[type="text"] {
+    padding: 4px 5px 4px 20px;
+    background: white url('chosen-sprite.png') no-repeat -30px -20px;
+    background: url('chosen-sprite.png') no-repeat -30px -20px;
+    direction: rtl;
+}
+.chosen-rtl.chosen-container-single .chosen-single div b {
+    background-position: 6px 2px;
+}
+.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
+    background-position: -12px 2px;
+}
+
+/* @end */
+/* @group Retina compatibility */
+@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
+    .chosen-rtl .chosen-search input[type="text"],
+    .chosen-container-single .chosen-single abbr,
+    .chosen-container-single .chosen-single div b,
+    .chosen-container-single .chosen-search input[type="text"],
+    .chosen-container-multi .chosen-choices .search-choice .search-choice-close,
+    .chosen-container .chosen-results-scroll-down span,
+    .chosen-container .chosen-results-scroll-up span {
+        background-image: url('chosen-sprite@2x.png') !important;
+        background-size: 52px 37px !important;
+        background-repeat: no-repeat !important;
+    }
+}
+/* @end */
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/iCheck/custom.css b/management/guns-admin/src/main/webapp/static/css/plugins/iCheck/custom.css
new file mode 100644
index 0000000..84e950b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/iCheck/custom.css
@@ -0,0 +1,59 @@
+/* iCheck plugin Square skin, green
+----------------------------------- */
+.icheckbox_square-green,
+.iradio_square-green {
+    display: inline-block;
+    *display: inline;
+    vertical-align: middle;
+    margin: 0;
+    padding: 0;
+    width: 22px;
+    height: 22px;
+    background: url(green.png) no-repeat;
+    border: none;
+    cursor: pointer;
+}
+
+.icheckbox_square-green {
+    background-position: 0 0;
+}
+.icheckbox_square-green.hover {
+    background-position: -24px 0;
+}
+.icheckbox_square-green.checked {
+    background-position: -48px 0;
+}
+.icheckbox_square-green.disabled {
+    background-position: -72px 0;
+    cursor: default;
+}
+.icheckbox_square-green.checked.disabled {
+    background-position: -96px 0;
+}
+
+.iradio_square-green {
+    background-position: -120px 0;
+}
+.iradio_square-green.hover {
+    background-position: -144px 0;
+}
+.iradio_square-green.checked {
+    background-position: -168px 0;
+}
+.iradio_square-green.disabled {
+    background-position: -192px 0;
+    cursor: default;
+}
+.iradio_square-green.checked.disabled {
+    background-position: -216px 0;
+}
+
+/* HiDPI support */
+@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {
+    .icheckbox_square-green,
+    .iradio_square-green {
+        background-image: url(green@2x.png);
+        -webkit-background-size: 240px 24px;
+        background-size: 240px 24px;
+    }
+}
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/iCheck/green.png b/management/guns-admin/src/main/webapp/static/css/plugins/iCheck/green.png
new file mode 100644
index 0000000..cf62300
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/iCheck/green.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/iCheck/green@2x.png b/management/guns-admin/src/main/webapp/static/css/plugins/iCheck/green@2x.png
new file mode 100644
index 0000000..3bda5be
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/iCheck/green@2x.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/images/sprite-skin-flat.png b/management/guns-admin/src/main/webapp/static/css/plugins/images/sprite-skin-flat.png
new file mode 100644
index 0000000..8356fc5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/images/sprite-skin-flat.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/sweetalert/sweetalert.css b/management/guns-admin/src/main/webapp/static/css/plugins/sweetalert/sweetalert.css
new file mode 100644
index 0000000..4469aea
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/sweetalert/sweetalert.css
@@ -0,0 +1,715 @@
+body.stop-scrolling {
+  height: 100%;
+  overflow: hidden; }
+
+.sweet-overlay {
+  background-color: black;
+  /* IE8 */
+  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)";
+  /* IE8 */
+  background-color: rgba(0, 0, 0, 0.4);
+  position: fixed;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  display: none;
+  z-index: 10000; }
+
+.sweet-alert {
+  background-color: white;
+  font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+  width: 478px;
+  padding: 17px;
+  border-radius: 5px;
+  text-align: center;
+  position: fixed;
+  left: 50%;
+  top: 50%;
+  margin-left: -256px;
+  margin-top: -200px;
+  overflow: hidden;
+  display: none;
+  z-index: 99999; }
+  @media all and (max-width: 540px) {
+    .sweet-alert {
+      width: auto;
+      margin-left: 0;
+      margin-right: 0;
+      left: 15px;
+      right: 15px; } }
+  .sweet-alert h2 {
+    color: #575757;
+    font-size: 30px;
+    text-align: center;
+    font-weight: 600;
+    text-transform: none;
+    position: relative;
+    margin: 25px 0;
+    padding: 0;
+    line-height: 40px;
+    display: block; }
+  .sweet-alert p {
+    color: #797979;
+    font-size: 16px;
+    text-align: center;
+    font-weight: 300;
+    position: relative;
+    text-align: inherit;
+    float: none;
+    margin: 0;
+    padding: 0;
+    line-height: normal; }
+  .sweet-alert fieldset {
+    border: none;
+    position: relative; }
+  .sweet-alert .sa-error-container {
+    background-color: #f1f1f1;
+    margin-left: -17px;
+    margin-right: -17px;
+    overflow: hidden;
+    padding: 0 10px;
+    max-height: 0;
+    webkit-transition: padding 0.15s, max-height 0.15s;
+    transition: padding 0.15s, max-height 0.15s; }
+    .sweet-alert .sa-error-container.show {
+      padding: 10px 0;
+      max-height: 100px;
+      webkit-transition: padding 0.2s, max-height 0.2s;
+      transition: padding 0.25s, max-height 0.25s; }
+    .sweet-alert .sa-error-container .icon {
+      display: inline-block;
+      width: 24px;
+      height: 24px;
+      border-radius: 50%;
+      background-color: #ea7d7d;
+      color: white;
+      line-height: 24px;
+      text-align: center;
+      margin-right: 3px; }
+    .sweet-alert .sa-error-container p {
+      display: inline-block; }
+  .sweet-alert .sa-input-error {
+    position: absolute;
+    top: 29px;
+    right: 26px;
+    width: 20px;
+    height: 20px;
+    opacity: 0;
+    -webkit-transform: scale(0.5);
+    transform: scale(0.5);
+    -webkit-transform-origin: 50% 50%;
+    transform-origin: 50% 50%;
+    -webkit-transition: all 0.1s;
+    transition: all 0.1s; }
+    .sweet-alert .sa-input-error::before, .sweet-alert .sa-input-error::after {
+      content: "";
+      width: 20px;
+      height: 6px;
+      background-color: #f06e57;
+      border-radius: 3px;
+      position: absolute;
+      top: 50%;
+      margin-top: -4px;
+      left: 50%;
+      margin-left: -9px; }
+    .sweet-alert .sa-input-error::before {
+      -webkit-transform: rotate(-45deg);
+      transform: rotate(-45deg); }
+    .sweet-alert .sa-input-error::after {
+      -webkit-transform: rotate(45deg);
+      transform: rotate(45deg); }
+    .sweet-alert .sa-input-error.show {
+      opacity: 1;
+      -webkit-transform: scale(1);
+      transform: scale(1); }
+  .sweet-alert input {
+    width: 100%;
+    box-sizing: border-box;
+    border-radius: 3px;
+    border: 1px solid #d7d7d7;
+    height: 43px;
+    margin-top: 10px;
+    margin-bottom: 17px;
+    font-size: 18px;
+    box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.06);
+    padding: 0 12px;
+    display: none;
+    -webkit-transition: all 0.3s;
+    transition: all 0.3s; }
+    .sweet-alert input:focus {
+      outline: none;
+      box-shadow: 0px 0px 3px #c4e6f5;
+      border: 1px solid #b4dbed; }
+      .sweet-alert input:focus::-moz-placeholder {
+        transition: opacity 0.3s 0.03s ease;
+        opacity: 0.5; }
+      .sweet-alert input:focus:-ms-input-placeholder {
+        transition: opacity 0.3s 0.03s ease;
+        opacity: 0.5; }
+      .sweet-alert input:focus::-webkit-input-placeholder {
+        transition: opacity 0.3s 0.03s ease;
+        opacity: 0.5; }
+    .sweet-alert input::-moz-placeholder {
+      color: #bdbdbd; }
+    .sweet-alert input:-ms-input-placeholder {
+      color: #bdbdbd; }
+    .sweet-alert input::-webkit-input-placeholder {
+      color: #bdbdbd; }
+  .sweet-alert.show-input input {
+    display: block; }
+  .sweet-alert button {
+    background-color: #AEDEF4;
+    color: white;
+    border: none;
+    box-shadow: none;
+    font-size: 17px;
+    font-weight: 500;
+    -webkit-border-radius: 4px;
+    border-radius: 5px;
+    padding: 10px 32px;
+    margin: 26px 5px 0 5px;
+    cursor: pointer; }
+    .sweet-alert button:focus {
+      outline: none;
+      box-shadow: 0 0 2px rgba(128, 179, 235, 0.5), inset 0 0 0 1px rgba(0, 0, 0, 0.05); }
+    .sweet-alert button:hover {
+      background-color: #a1d9f2; }
+    .sweet-alert button:active {
+      background-color: #81ccee; }
+    .sweet-alert button.cancel {
+      background-color: #D0D0D0; }
+      .sweet-alert button.cancel:hover {
+        background-color: #c8c8c8; }
+      .sweet-alert button.cancel:active {
+        background-color: #b6b6b6; }
+      .sweet-alert button.cancel:focus {
+        box-shadow: rgba(197, 205, 211, 0.8) 0px 0px 2px, rgba(0, 0, 0, 0.0470588) 0px 0px 0px 1px inset !important; }
+    .sweet-alert button::-moz-focus-inner {
+      border: 0; }
+  .sweet-alert[data-has-cancel-button=false] button {
+    box-shadow: none !important; }
+  .sweet-alert[data-has-confirm-button=false][data-has-cancel-button=false] {
+    padding-bottom: 40px; }
+  .sweet-alert .sa-icon {
+    width: 80px;
+    height: 80px;
+    border: 4px solid gray;
+    -webkit-border-radius: 40px;
+    border-radius: 40px;
+    border-radius: 50%;
+    margin: 20px auto;
+    padding: 0;
+    position: relative;
+    box-sizing: content-box; }
+    .sweet-alert .sa-icon.sa-error {
+      border-color: #F27474; }
+      .sweet-alert .sa-icon.sa-error .sa-x-mark {
+        position: relative;
+        display: block; }
+      .sweet-alert .sa-icon.sa-error .sa-line {
+        position: absolute;
+        height: 5px;
+        width: 47px;
+        background-color: #F27474;
+        display: block;
+        top: 37px;
+        border-radius: 2px; }
+        .sweet-alert .sa-icon.sa-error .sa-line.sa-left {
+          -webkit-transform: rotate(45deg);
+          transform: rotate(45deg);
+          left: 17px; }
+        .sweet-alert .sa-icon.sa-error .sa-line.sa-right {
+          -webkit-transform: rotate(-45deg);
+          transform: rotate(-45deg);
+          right: 16px; }
+    .sweet-alert .sa-icon.sa-warning {
+      border-color: #F8BB86; }
+      .sweet-alert .sa-icon.sa-warning .sa-body {
+        position: absolute;
+        width: 5px;
+        height: 47px;
+        left: 50%;
+        top: 10px;
+        -webkit-border-radius: 2px;
+        border-radius: 2px;
+        margin-left: -2px;
+        background-color: #F8BB86; }
+      .sweet-alert .sa-icon.sa-warning .sa-dot {
+        position: absolute;
+        width: 7px;
+        height: 7px;
+        -webkit-border-radius: 50%;
+        border-radius: 50%;
+        margin-left: -3px;
+        left: 50%;
+        bottom: 10px;
+        background-color: #F8BB86; }
+    .sweet-alert .sa-icon.sa-info {
+      border-color: #C9DAE1; }
+      .sweet-alert .sa-icon.sa-info::before {
+        content: "";
+        position: absolute;
+        width: 5px;
+        height: 29px;
+        left: 50%;
+        bottom: 17px;
+        border-radius: 2px;
+        margin-left: -2px;
+        background-color: #C9DAE1; }
+      .sweet-alert .sa-icon.sa-info::after {
+        content: "";
+        position: absolute;
+        width: 7px;
+        height: 7px;
+        border-radius: 50%;
+        margin-left: -3px;
+        top: 19px;
+        background-color: #C9DAE1; }
+    .sweet-alert .sa-icon.sa-success {
+      border-color: #A5DC86; }
+      .sweet-alert .sa-icon.sa-success::before, .sweet-alert .sa-icon.sa-success::after {
+        content: '';
+        -webkit-border-radius: 40px;
+        border-radius: 40px;
+        border-radius: 50%;
+        position: absolute;
+        width: 60px;
+        height: 120px;
+        background: white;
+        -webkit-transform: rotate(45deg);
+        transform: rotate(45deg); }
+      .sweet-alert .sa-icon.sa-success::before {
+        -webkit-border-radius: 120px 0 0 120px;
+        border-radius: 120px 0 0 120px;
+        top: -7px;
+        left: -33px;
+        -webkit-transform: rotate(-45deg);
+        transform: rotate(-45deg);
+        -webkit-transform-origin: 60px 60px;
+        transform-origin: 60px 60px; }
+      .sweet-alert .sa-icon.sa-success::after {
+        -webkit-border-radius: 0 120px 120px 0;
+        border-radius: 0 120px 120px 0;
+        top: -11px;
+        left: 30px;
+        -webkit-transform: rotate(-45deg);
+        transform: rotate(-45deg);
+        -webkit-transform-origin: 0px 60px;
+        transform-origin: 0px 60px; }
+      .sweet-alert .sa-icon.sa-success .sa-placeholder {
+        width: 80px;
+        height: 80px;
+        border: 4px solid rgba(165, 220, 134, 0.2);
+        -webkit-border-radius: 40px;
+        border-radius: 40px;
+        border-radius: 50%;
+        box-sizing: content-box;
+        position: absolute;
+        left: -4px;
+        top: -4px;
+        z-index: 2; }
+      .sweet-alert .sa-icon.sa-success .sa-fix {
+        width: 5px;
+        height: 90px;
+        background-color: white;
+        position: absolute;
+        left: 28px;
+        top: 8px;
+        z-index: 1;
+        -webkit-transform: rotate(-45deg);
+        transform: rotate(-45deg); }
+      .sweet-alert .sa-icon.sa-success .sa-line {
+        height: 5px;
+        background-color: #A5DC86;
+        display: block;
+        border-radius: 2px;
+        position: absolute;
+        z-index: 2; }
+        .sweet-alert .sa-icon.sa-success .sa-line.sa-tip {
+          width: 25px;
+          left: 14px;
+          top: 46px;
+          -webkit-transform: rotate(45deg);
+          transform: rotate(45deg); }
+        .sweet-alert .sa-icon.sa-success .sa-line.sa-long {
+          width: 47px;
+          right: 8px;
+          top: 38px;
+          -webkit-transform: rotate(-45deg);
+          transform: rotate(-45deg); }
+    .sweet-alert .sa-icon.sa-custom {
+      background-size: contain;
+      border-radius: 0;
+      border: none;
+      background-position: center center;
+      background-repeat: no-repeat; }
+
+/*
+ * Animations
+ */
+@-webkit-keyframes showSweetAlert {
+  0% {
+    transform: scale(0.7);
+    -webkit-transform: scale(0.7); }
+  45% {
+    transform: scale(1.05);
+    -webkit-transform: scale(1.05); }
+  80% {
+    transform: scale(0.95);
+    -webkit-transform: scale(0.95); }
+  100% {
+    transform: scale(1);
+    -webkit-transform: scale(1); } }
+
+@keyframes showSweetAlert {
+  0% {
+    transform: scale(0.7);
+    -webkit-transform: scale(0.7); }
+  45% {
+    transform: scale(1.05);
+    -webkit-transform: scale(1.05); }
+  80% {
+    transform: scale(0.95);
+    -webkit-transform: scale(0.95); }
+  100% {
+    transform: scale(1);
+    -webkit-transform: scale(1); } }
+
+@-webkit-keyframes hideSweetAlert {
+  0% {
+    transform: scale(1);
+    -webkit-transform: scale(1); }
+  100% {
+    transform: scale(0.5);
+    -webkit-transform: scale(0.5); } }
+
+@keyframes hideSweetAlert {
+  0% {
+    transform: scale(1);
+    -webkit-transform: scale(1); }
+  100% {
+    transform: scale(0.5);
+    -webkit-transform: scale(0.5); } }
+
+@-webkit-keyframes slideFromTop {
+  0% {
+    top: 0%; }
+  100% {
+    top: 50%; } }
+
+@keyframes slideFromTop {
+  0% {
+    top: 0%; }
+  100% {
+    top: 50%; } }
+
+@-webkit-keyframes slideToTop {
+  0% {
+    top: 50%; }
+  100% {
+    top: 0%; } }
+
+@keyframes slideToTop {
+  0% {
+    top: 50%; }
+  100% {
+    top: 0%; } }
+
+@-webkit-keyframes slideFromBottom {
+  0% {
+    top: 70%; }
+  100% {
+    top: 50%; } }
+
+@keyframes slideFromBottom {
+  0% {
+    top: 70%; }
+  100% {
+    top: 50%; } }
+
+@-webkit-keyframes slideToBottom {
+  0% {
+    top: 50%; }
+  100% {
+    top: 70%; } }
+
+@keyframes slideToBottom {
+  0% {
+    top: 50%; }
+  100% {
+    top: 70%; } }
+
+.showSweetAlert[data-animation=pop] {
+  -webkit-animation: showSweetAlert 0.3s;
+  animation: showSweetAlert 0.3s; }
+
+.showSweetAlert[data-animation=none] {
+  -webkit-animation: none;
+  animation: none; }
+
+.showSweetAlert[data-animation=slide-from-top] {
+  -webkit-animation: slideFromTop 0.3s;
+  animation: slideFromTop 0.3s; }
+
+.showSweetAlert[data-animation=slide-from-bottom] {
+  -webkit-animation: slideFromBottom 0.3s;
+  animation: slideFromBottom 0.3s; }
+
+.hideSweetAlert[data-animation=pop] {
+  -webkit-animation: hideSweetAlert 0.2s;
+  animation: hideSweetAlert 0.2s; }
+
+.hideSweetAlert[data-animation=none] {
+  -webkit-animation: none;
+  animation: none; }
+
+.hideSweetAlert[data-animation=slide-from-top] {
+  -webkit-animation: slideToTop 0.4s;
+  animation: slideToTop 0.4s; }
+
+.hideSweetAlert[data-animation=slide-from-bottom] {
+  -webkit-animation: slideToBottom 0.3s;
+  animation: slideToBottom 0.3s; }
+
+@-webkit-keyframes animateSuccessTip {
+  0% {
+    width: 0;
+    left: 1px;
+    top: 19px; }
+  54% {
+    width: 0;
+    left: 1px;
+    top: 19px; }
+  70% {
+    width: 50px;
+    left: -8px;
+    top: 37px; }
+  84% {
+    width: 17px;
+    left: 21px;
+    top: 48px; }
+  100% {
+    width: 25px;
+    left: 14px;
+    top: 45px; } }
+
+@keyframes animateSuccessTip {
+  0% {
+    width: 0;
+    left: 1px;
+    top: 19px; }
+  54% {
+    width: 0;
+    left: 1px;
+    top: 19px; }
+  70% {
+    width: 50px;
+    left: -8px;
+    top: 37px; }
+  84% {
+    width: 17px;
+    left: 21px;
+    top: 48px; }
+  100% {
+    width: 25px;
+    left: 14px;
+    top: 45px; } }
+
+@-webkit-keyframes animateSuccessLong {
+  0% {
+    width: 0;
+    right: 46px;
+    top: 54px; }
+  65% {
+    width: 0;
+    right: 46px;
+    top: 54px; }
+  84% {
+    width: 55px;
+    right: 0px;
+    top: 35px; }
+  100% {
+    width: 47px;
+    right: 8px;
+    top: 38px; } }
+
+@keyframes animateSuccessLong {
+  0% {
+    width: 0;
+    right: 46px;
+    top: 54px; }
+  65% {
+    width: 0;
+    right: 46px;
+    top: 54px; }
+  84% {
+    width: 55px;
+    right: 0px;
+    top: 35px; }
+  100% {
+    width: 47px;
+    right: 8px;
+    top: 38px; } }
+
+@-webkit-keyframes rotatePlaceholder {
+  0% {
+    transform: rotate(-45deg);
+    -webkit-transform: rotate(-45deg); }
+  5% {
+    transform: rotate(-45deg);
+    -webkit-transform: rotate(-45deg); }
+  12% {
+    transform: rotate(-405deg);
+    -webkit-transform: rotate(-405deg); }
+  100% {
+    transform: rotate(-405deg);
+    -webkit-transform: rotate(-405deg); } }
+
+@keyframes rotatePlaceholder {
+  0% {
+    transform: rotate(-45deg);
+    -webkit-transform: rotate(-45deg); }
+  5% {
+    transform: rotate(-45deg);
+    -webkit-transform: rotate(-45deg); }
+  12% {
+    transform: rotate(-405deg);
+    -webkit-transform: rotate(-405deg); }
+  100% {
+    transform: rotate(-405deg);
+    -webkit-transform: rotate(-405deg); } }
+
+.animateSuccessTip {
+  -webkit-animation: animateSuccessTip 0.75s;
+  animation: animateSuccessTip 0.75s; }
+
+.animateSuccessLong {
+  -webkit-animation: animateSuccessLong 0.75s;
+  animation: animateSuccessLong 0.75s; }
+
+.sa-icon.sa-success.animate::after {
+  -webkit-animation: rotatePlaceholder 4.25s ease-in;
+  animation: rotatePlaceholder 4.25s ease-in; }
+
+@-webkit-keyframes animateErrorIcon {
+  0% {
+    transform: rotateX(100deg);
+    -webkit-transform: rotateX(100deg);
+    opacity: 0; }
+  100% {
+    transform: rotateX(0deg);
+    -webkit-transform: rotateX(0deg);
+    opacity: 1; } }
+
+@keyframes animateErrorIcon {
+  0% {
+    transform: rotateX(100deg);
+    -webkit-transform: rotateX(100deg);
+    opacity: 0; }
+  100% {
+    transform: rotateX(0deg);
+    -webkit-transform: rotateX(0deg);
+    opacity: 1; } }
+
+.animateErrorIcon {
+  -webkit-animation: animateErrorIcon 0.5s;
+  animation: animateErrorIcon 0.5s; }
+
+@-webkit-keyframes animateXMark {
+  0% {
+    transform: scale(0.4);
+    -webkit-transform: scale(0.4);
+    margin-top: 26px;
+    opacity: 0; }
+  50% {
+    transform: scale(0.4);
+    -webkit-transform: scale(0.4);
+    margin-top: 26px;
+    opacity: 0; }
+  80% {
+    transform: scale(1.15);
+    -webkit-transform: scale(1.15);
+    margin-top: -6px; }
+  100% {
+    transform: scale(1);
+    -webkit-transform: scale(1);
+    margin-top: 0;
+    opacity: 1; } }
+
+@keyframes animateXMark {
+  0% {
+    transform: scale(0.4);
+    -webkit-transform: scale(0.4);
+    margin-top: 26px;
+    opacity: 0; }
+  50% {
+    transform: scale(0.4);
+    -webkit-transform: scale(0.4);
+    margin-top: 26px;
+    opacity: 0; }
+  80% {
+    transform: scale(1.15);
+    -webkit-transform: scale(1.15);
+    margin-top: -6px; }
+  100% {
+    transform: scale(1);
+    -webkit-transform: scale(1);
+    margin-top: 0;
+    opacity: 1; } }
+
+.animateXMark {
+  -webkit-animation: animateXMark 0.5s;
+  animation: animateXMark 0.5s; }
+
+@-webkit-keyframes pulseWarning {
+  0% {
+    border-color: #F8D486; }
+  100% {
+    border-color: #F8BB86; } }
+
+@keyframes pulseWarning {
+  0% {
+    border-color: #F8D486; }
+  100% {
+    border-color: #F8BB86; } }
+
+.pulseWarning {
+  -webkit-animation: pulseWarning 0.75s infinite alternate;
+  animation: pulseWarning 0.75s infinite alternate; }
+
+@-webkit-keyframes pulseWarningIns {
+  0% {
+    background-color: #F8D486; }
+  100% {
+    background-color: #F8BB86; } }
+
+@keyframes pulseWarningIns {
+  0% {
+    background-color: #F8D486; }
+  100% {
+    background-color: #F8BB86; } }
+
+.pulseWarningIns {
+  -webkit-animation: pulseWarningIns 0.75s infinite alternate;
+  animation: pulseWarningIns 0.75s infinite alternate; }
+
+/* Internet Explorer 9 has some special quirks that are fixed here */
+/* The icons are not animated. */
+/* This file is automatically merged into sweet-alert.min.js through Gulp */
+/* Error icon */
+.sweet-alert .sa-icon.sa-error .sa-line.sa-left {
+  -ms-transform: rotate(45deg) \9; }
+
+.sweet-alert .sa-icon.sa-error .sa-line.sa-right {
+  -ms-transform: rotate(-45deg) \9; }
+
+/* Success icon */
+.sweet-alert .sa-icon.sa-success {
+  border-color: transparent\9; }
+
+.sweet-alert .sa-icon.sa-success .sa-line.sa-tip {
+  -ms-transform: rotate(45deg) \9; }
+
+.sweet-alert .sa-icon.sa-success .sa-line.sa-long {
+  -ms-transform: rotate(-45deg) \9; }
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/switchery/switchery.css b/management/guns-admin/src/main/webapp/static/css/plugins/switchery/switchery.css
new file mode 100644
index 0000000..b689c6b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/switchery/switchery.css
@@ -0,0 +1,32 @@
+/*
+ *
+ * Main stylesheet for Switchery.
+ * http://abpetkov.github.io/switchery/
+ *
+ */
+
+.switchery {
+    background-color: #fff;
+    border: 1px solid #dfdfdf;
+    border-radius: 20px;
+    cursor: pointer;
+    display: inline-block;
+    height: 30px;
+    position: relative;
+    vertical-align: middle;
+    width: 50px;
+
+    -webkit-box-sizing: content-box;
+    -moz-box-sizing: content-box;
+    box-sizing: content-box;
+}
+
+.switchery > small {
+    background: #fff;
+    border-radius: 100%;
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
+    height: 30px;
+    position: absolute;
+    top: 0;
+    width: 30px;
+}
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/validate/bootstrapValidator.min.css b/management/guns-admin/src/main/webapp/static/css/plugins/validate/bootstrapValidator.min.css
new file mode 100644
index 0000000..62d7b59
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/validate/bootstrapValidator.min.css
@@ -0,0 +1,12 @@
+/*!
+ * BootstrapValidator (http://bootstrapvalidator.com)
+ * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
+ *
+ * @version     v0.5.3, built on 2014-11-05 9:14:18 PM
+ * @author      https://twitter.com/nghuuphuoc
+ * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
+ * @license     Commercial: http://bootstrapvalidator.com/license/
+ *              Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0/
+ */
+
+.bv-form .help-block{margin-bottom:0}.bv-form .tooltip-inner{text-align:left}.nav-tabs li.bv-tab-success>a{color:#3c763d}.nav-tabs li.bv-tab-error>a{color:#a94442}.bv-form .bv-icon-no-label{top:0}.bv-form .bv-icon-input-group{top:0;z-index:100}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/webuploader/webuploader.css b/management/guns-admin/src/main/webapp/static/css/plugins/webuploader/webuploader.css
new file mode 100644
index 0000000..f445e0d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/webuploader/webuploader.css
@@ -0,0 +1,30 @@
+.webuploader-container {
+	position: relative;
+}
+.webuploader-element-invisible {
+	position: absolute !important;
+	clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
+    clip: rect(1px,1px,1px,1px);
+}
+.webuploader-pick {
+	position: relative;
+	display: inline-block;
+	cursor: pointer;
+	background: #1ab394;
+	padding: 6px 12px;
+	color: #fff;
+	text-align: center;
+	border-radius: 3px;
+	overflow: hidden;
+	font-size: 14px;
+    font-weight: 400;
+}
+.webuploader-pick-hover {
+	background: #18ab8d;
+}
+
+.webuploader-pick-disable {
+	opacity: 0.6;
+	pointer-events:none;
+}
+
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/demo.css b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/demo.css
new file mode 100644
index 0000000..f6dba0d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/demo.css
@@ -0,0 +1,33 @@
+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, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {
+	margin: 0;padding: 0;border: 0;outline: 0;font-weight: inherit;font-style: inherit;font-size: 100%;font-family: inherit;vertical-align: baseline;}
+body {color: #2f332a;font: 15px/21px Arial, Helvetica, simsun, sans-serif;background: #f0f6e4 \9;}
+h1, h2, h3, h4, h5, h6 {color: #2f332a;font-weight: bold;font-family: Helvetica, Arial, sans-serif;padding-bottom: 5px;}
+h1 {font-size: 24px;line-height: 34px;text-align: center;}
+h2 {font-size: 14px;line-height: 24px;padding-top: 5px;}
+h6 {font-weight: normal;font-size: 12px;letter-spacing: 1px;line-height: 24px;text-align: center;}
+a {color:#3C6E31;text-decoration: underline;}
+a:hover {background-color:#3C6E31;color:white;}
+input.radio {margin: 0 2px 0 8px;}
+input.radio.first {margin-left:0;}
+input.empty {color: lightgray;}
+code {color: #2f332a;}
+.highlight_red {color:#A60000;}
+.highlight_green {color:#A7F43D;}
+li {list-style: circle;font-size: 12px;}
+li.title {list-style: none;}
+ul.list {margin-left: 17px;}
+
+div.content_wrap {width: 600px;height:380px;}
+div.content_wrap div.left{float: left;width: 250px;}
+div.content_wrap div.right{float: right;width: 340px;}
+div.zTreeDemoBackground {width:250px;height:362px;text-align:left;}
+
+ul.ztree {margin-top: 10px;border: 1px solid #617775;background: #f0f6e4;width:220px;height:360px;overflow-y:scroll;overflow-x:auto;}
+ul.log {border: 1px solid #617775;background: #f0f6e4;width:300px;height:170px;overflow: hidden;}
+ul.log.small {height:45px;}
+ul.log li {color: #666666;list-style: none;padding-left: 10px;}
+ul.log li.dark {background-color: #E3E3E3;}
+
+/* ruler */
+div.ruler {height:20px; width:220px; background-color:#f0f6e4;border: 1px solid #333; margin-bottom: 5px; cursor: pointer}
+div.ruler div.cursor {height:20px; width:30px; background-color:#3C6E31; color:white; text-align: right; padding-right: 5px; cursor: pointer}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/1_close.png b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/1_close.png
new file mode 100644
index 0000000..68ccb3c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/1_close.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/1_open.png b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/1_open.png
new file mode 100644
index 0000000..d6ff36d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/1_open.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/2.png b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/2.png
new file mode 100644
index 0000000..9eff506
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/2.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/3.png b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/3.png
new file mode 100644
index 0000000..d7ba6d0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/3.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/4.png b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/4.png
new file mode 100644
index 0000000..753e2bf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/4.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/5.png b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/5.png
new file mode 100644
index 0000000..0c5eccd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/5.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/6.png b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/6.png
new file mode 100644
index 0000000..070b835
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/6.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/7.png b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/7.png
new file mode 100644
index 0000000..532b037
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/7.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/8.png b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/8.png
new file mode 100644
index 0000000..a8f3a86
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/8.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/9.png b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/9.png
new file mode 100644
index 0000000..4db73cd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/diy/9.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/line_conn.gif b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/line_conn.gif
new file mode 100644
index 0000000..d561d36
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/line_conn.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/loading.gif b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/loading.gif
new file mode 100644
index 0000000..e8c2892
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/loading.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/zTreeStandard.gif b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/zTreeStandard.gif
new file mode 100644
index 0000000..50c94fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/zTreeStandard.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/zTreeStandard.png b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/zTreeStandard.png
new file mode 100644
index 0000000..ffda01e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/img/zTreeStandard.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/css/plugins/ztree/zTreeStyle.css b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/zTreeStyle.css
new file mode 100644
index 0000000..4a1705b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/plugins/ztree/zTreeStyle.css
@@ -0,0 +1,97 @@
+/*-------------------------------------
+zTree Style
+
+version:	3.5.19
+author:		Hunter.z
+email:		hunter.z@263.net
+website:	http://code.google.com/p/jquerytree/
+
+-------------------------------------*/
+
+.ztree * {padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif}
+.ztree {margin:0; padding:5px; color:#333}
+.ztree li{padding:0; margin:0; list-style:none; line-height:14px; text-align:left; white-space:nowrap; outline:0}
+.ztree li ul{ margin:0; padding:0 0 0 18px}
+.ztree li ul.line{ background:url(./img/line_conn.gif) 0 0 repeat-y;}
+
+.ztree li a {padding:1px 3px 0 0; margin:0; cursor:pointer; height:17px; color:#333; background-color: transparent;
+	text-decoration:none; vertical-align:top; display: inline-block}
+.ztree li a:hover {text-decoration:underline}
+.ztree li a.curSelectedNode {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
+.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
+.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#316AC5; color:white; height:16px; border:1px #316AC5 solid;
+	opacity:0.8; filter:alpha(opacity=80)}
+.ztree li a.tmpTargetNode_prev {}
+.ztree li a.tmpTargetNode_next {}
+.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0;
+	font-size:12px; border:1px #7EC4CC solid; *border:0px}
+.ztree li span {line-height:16px; margin-right:2px}
+.ztree li span.button {line-height:0; margin:0; width:16px; height:16px; display: inline-block; vertical-align:middle;
+	border:0 none; cursor: pointer;outline:none;
+	background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+	background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
+
+.ztree li span.button.chk {width:13px; height:13px; margin:0 3px 0 0; cursor: auto}
+.ztree li span.button.chk.checkbox_false_full {background-position:0 0}
+.ztree li span.button.chk.checkbox_false_full_focus {background-position:0 -14px}
+.ztree li span.button.chk.checkbox_false_part {background-position:0 -28px}
+.ztree li span.button.chk.checkbox_false_part_focus {background-position:0 -42px}
+.ztree li span.button.chk.checkbox_false_disable {background-position:0 -56px}
+.ztree li span.button.chk.checkbox_true_full {background-position:-14px 0}
+.ztree li span.button.chk.checkbox_true_full_focus {background-position:-14px -14px}
+.ztree li span.button.chk.checkbox_true_part {background-position:-14px -28px}
+.ztree li span.button.chk.checkbox_true_part_focus {background-position:-14px -42px}
+.ztree li span.button.chk.checkbox_true_disable {background-position:-14px -56px}
+.ztree li span.button.chk.radio_false_full {background-position:-28px 0}
+.ztree li span.button.chk.radio_false_full_focus {background-position:-28px -14px}
+.ztree li span.button.chk.radio_false_part {background-position:-28px -28px}
+.ztree li span.button.chk.radio_false_part_focus {background-position:-28px -42px}
+.ztree li span.button.chk.radio_false_disable {background-position:-28px -56px}
+.ztree li span.button.chk.radio_true_full {background-position:-42px 0}
+.ztree li span.button.chk.radio_true_full_focus {background-position:-42px -14px}
+.ztree li span.button.chk.radio_true_part {background-position:-42px -28px}
+.ztree li span.button.chk.radio_true_part_focus {background-position:-42px -42px}
+.ztree li span.button.chk.radio_true_disable {background-position:-42px -56px}
+
+.ztree li span.button.switch {width:18px; height:18px}
+.ztree li span.button.root_open{background-position:-92px -54px}
+.ztree li span.button.root_close{background-position:-74px -54px}
+.ztree li span.button.roots_open{background-position:-92px 0}
+.ztree li span.button.roots_close{background-position:-74px 0}
+.ztree li span.button.center_open{background-position:-92px -18px}
+.ztree li span.button.center_close{background-position:-74px -18px}
+.ztree li span.button.bottom_open{background-position:-92px -36px}
+.ztree li span.button.bottom_close{background-position:-74px -36px}
+.ztree li span.button.noline_open{background-position:-92px -72px}
+.ztree li span.button.noline_close{background-position:-74px -72px}
+.ztree li span.button.root_docu{ background:none;}
+.ztree li span.button.roots_docu{background-position:-56px 0}
+.ztree li span.button.center_docu{background-position:-56px -18px}
+.ztree li span.button.bottom_docu{background-position:-56px -36px}
+.ztree li span.button.noline_docu{ background:none;}
+
+.ztree li span.button.ico_open{margin-right:2px; background-position:-110px -16px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_close{margin-right:2px; background-position:-110px 0; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_docu{margin-right:2px; background-position:-110px -32px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.edit {margin-right:2px; background-position:-110px -48px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.remove {margin-right:2px; background-position:-110px -64px; vertical-align:top; *vertical-align:middle}
+
+.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
+
+ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)}
+
+span.tmpzTreeMove_arrow {width:16px; height:16px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute;
+	background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+	background-position:-110px -80px; background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
+
+ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)}
+.zTreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute}
+
+/* level style*/
+/*.ztree li span.button.level0 {
+	display:none;
+}
+.ztree li ul.level0 {
+	padding:0;
+	background:none;
+}*/
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/css/style.css b/management/guns-admin/src/main/webapp/static/css/style.css
new file mode 100644
index 0000000..198d105
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/css/style.css
@@ -0,0 +1,7897 @@
+/*
+ *
+ *   H+ - 后台主题UI框架
+ *   version 4.0
+ *
+*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+    font-weight: 100;
+}
+
+h1 {
+    font-size: 30px;
+}
+
+h2 {
+    font-size: 24px;
+}
+
+h3 {
+    font-size: 16px;
+}
+
+h4 {
+    font-size: 14px;
+}
+
+h5 {
+    font-size: 12px;
+}
+
+h6 {
+    font-size: 10px;
+}
+
+h3,
+h4,
+h5 {
+    margin-top: 5px;
+    font-weight: 600;
+}
+
+a:focus {
+    outline: none;
+}
+
+.nav > li > a {
+    color: #a7b1c2;
+    font-weight: 600;
+    padding: 14px 20px 14px 25px;
+}
+
+.nav li>a {
+    display: block;
+    /*white-space: nowrap;*/
+}
+
+.nav.navbar-right > li > a {
+    color: #999c9e;
+}
+
+.nav > li.active > a {
+    color: #ffffff;
+}
+
+.navbar-default .nav > li > a:hover,
+.navbar-default .nav > li > a:focus {
+    background-color: #293846;
+    color: white;
+}
+
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+    background: #fff;
+}
+
+.nav > li > a i {
+    margin-right: 6px;
+}
+
+.navbar {
+    border: 0;
+}
+
+.navbar-default {
+    background-color: transparent;
+    border-color: #2f4050;
+    position: relative;
+}
+
+.navbar-top-links li {
+    display: inline-block;
+}
+
+.navbar-top-links li:last-child {
+    margin-right: 30px;
+}
+
+body.body-small .navbar-top-links li:last-child {
+    margin-right: 10px;
+}
+
+.navbar-top-links li a {
+    padding: 20px 10px;
+    min-height: 50px;
+}
+
+.dropdown-menu {
+    border: medium none;
+    display: none;
+    float: left;
+    font-size: 12px;
+    left: 0;
+    list-style: none outside none;
+    padding: 0;
+    position: absolute;
+    text-shadow: none;
+    top: 100%;
+    z-index: 1000;
+    border-radius: 0;
+    box-shadow: 0 0 3px rgba(86, 96, 117, 0.3);
+}
+
+.dropdown-menu > li > a {
+    border-radius: 3px;
+    color: inherit;
+    line-height: 25px;
+    margin: 4px;
+    text-align: left;
+    font-weight: normal;
+}
+
+.dropdown-menu > li > a.font-bold {
+    font-weight: 600;
+}
+
+.navbar-top-links .dropdown-menu li {
+    display: block;
+}
+
+.navbar-top-links .dropdown-menu li:last-child {
+    margin-right: 0;
+}
+
+.navbar-top-links .dropdown-menu li a {
+    padding: 3px 20px;
+    min-height: 0;
+}
+
+.navbar-top-links .dropdown-menu li a div {
+    white-space: normal;
+}
+
+.navbar-top-links .dropdown-messages,
+.navbar-top-links .dropdown-tasks,
+.navbar-top-links .dropdown-alerts {
+    width: 310px;
+    min-width: 0;
+}
+
+.navbar-top-links .dropdown-messages {
+    margin-left: 5px;
+}
+
+.navbar-top-links .dropdown-tasks {
+    margin-left: -59px;
+}
+
+.navbar-top-links .dropdown-alerts {
+    margin-left: -123px;
+}
+
+.navbar-top-links .dropdown-user {
+    right: 0;
+    left: auto;
+}
+
+.dropdown-messages,
+.dropdown-alerts {
+    padding: 10px 10px 10px 10px;
+}
+
+.dropdown-messages li a,
+.dropdown-alerts li a {
+    font-size: 12px;
+}
+
+.dropdown-messages li em,
+.dropdown-alerts li em {
+    font-size: 10px;
+}
+
+.nav.navbar-top-links .dropdown-alerts a {
+    font-size: 12px;
+}
+
+.nav-header {
+    padding: 33px 25px;
+    background: url("patterns/header-profile.png") no-repeat;
+}
+
+.pace-done .nav-header {
+    -webkit-transition: all 0.5s;
+    transition: all 0.5s;
+}
+
+.nav > li.active {
+    border-left: 4px solid #19aa8d;
+    background: #293846;
+}
+
+.nav.nav-second-level > li.active {
+    border: none;
+}
+
+.nav.nav-second-level.collapse[style] {
+    height: auto !important;
+}
+
+.nav-header a {
+    color: #DFE4ED;
+}
+
+.nav-header .text-muted {
+    color: #8095a8;
+}
+
+.minimalize-styl-2 {
+    padding: 4px 12px;
+    margin: 14px 5px 5px 20px;
+    font-size: 14px;
+    float: left;
+}
+
+.navbar-form-custom {
+    float: left;
+    height: 50px;
+    padding: 0;
+    width: 200px;
+    display: inline-table;
+}
+
+.navbar-form-custom .form-group {
+    margin-bottom: 0;
+}
+
+.nav.navbar-top-links a {
+    font-size: 14px;
+}
+
+.navbar-form-custom .form-control {
+    background: none repeat scroll 0 0 rgba(0, 0, 0, 0);
+    border: medium none;
+    font-size: 14px;
+    height: 60px;
+    margin: 0;
+    z-index: 2000;
+}
+
+.count-info .label {
+    line-height: 12px;
+    padding: 1px 5px;
+    position: absolute;
+    right: 6px;
+    top: 12px;
+}
+
+.arrow {
+    float: right;
+    margin-top: 2px;
+}
+
+.fa.arrow:before {
+    content: "\f104";
+}
+
+.active > a > .fa.arrow:before {
+    content: "\f107";
+}
+
+.nav-second-level li,
+.nav-third-level li {
+    border-bottom: none !important;
+}
+
+.nav-second-level li a {
+    padding: 7px 15px 7px 10px;
+    padding-left: 52px;
+}
+
+.nav-third-level li a {
+    padding-left: 62px;
+}
+
+.nav-second-level li:last-child {
+    margin-bottom: 10px;
+}
+
+body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav li:hover > .nav-second-level,
+.mini-navbar .nav li:focus > .nav-second-level {
+    display: block;
+    border-radius: 0 2px 2px 0;
+    min-width: 140px;
+    height: auto;
+}
+
+body.mini-navbar .navbar-default .nav > li > .nav-second-level li a {
+    font-size: 12px;
+    border-radius: 0 2px 2px 0;
+}
+
+.fixed-nav .slimScrollDiv #side-menu {
+    padding-bottom: 60px;
+    position: relative;
+}
+
+.slimScrollDiv >* {
+    overflow: hidden;
+}
+
+.mini-navbar .nav-second-level li a {
+    padding: 10px 10px 10px 15px;
+}
+
+.canvas-menu.mini-navbar .nav-second-level {
+    background: #293846;
+}
+
+.mini-navbar li.active .nav-second-level {
+    left: 65px;
+}
+
+.navbar-default .special_link a {
+    background: #1ab394;
+    color: white;
+}
+
+.navbar-default .special_link a:hover {
+    background: #17987e !important;
+    color: white;
+}
+
+.navbar-default .special_link a span.label {
+    background: #fff;
+    color: #1ab394;
+}
+
+.navbar-default .landing_link a {
+    background: #1cc09f;
+    color: white;
+}
+
+.navbar-default .landing_link a:hover {
+    background: #1ab394 !important;
+    color: white;
+}
+
+.navbar-default .landing_link a span.label {
+    background: #fff;
+    color: #1cc09f;
+}
+
+.logo-element {
+    text-align: center;
+    font-size: 18px;
+    font-weight: 600;
+    color: white;
+    display: none;
+    padding: 18px 0;
+}
+
+.pace-done .navbar-static-side,
+.pace-done .nav-header,
+.pace-done li.active,
+.pace-done #page-wrapper,
+.pace-done .footer {
+    -webkit-transition: all 0.5s;
+    transition: all 0.5s;
+}
+
+.navbar-fixed-top {
+    background: #fff;
+    -webkit-transition-duration: 0.5s;
+    transition-duration: 0.5s;
+    z-index: 2030;
+}
+
+.navbar-fixed-top,
+.navbar-static-top {
+    background: #f3f3f4;
+}
+
+.fixed-nav #wrapper {
+    padding-top: 60px;
+    box-sizing: border-box;
+}
+
+.fixed-nav .minimalize-styl-2 {
+    margin: 14px 5px 5px 15px;
+}
+
+.body-small .navbar-fixed-top {
+    margin-left: 0px;
+}
+
+body.mini-navbar .navbar-static-side {
+    width: 70px;
+}
+
+body.mini-navbar .profile-element,
+body.mini-navbar .nav-label,
+body.mini-navbar .navbar-default .nav li a span {
+    display: none;
+}
+
+body.canvas-menu .profile-element {
+    display: block;
+}
+
+body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav-second-level {
+    display: none;
+}
+
+body.mini-navbar .navbar-default .nav > li > a {
+    font-size: 16px;
+}
+
+body.mini-navbar .logo-element {
+    display: block;
+}
+
+body.canvas-menu .logo-element {
+    display: none;
+}
+
+body.mini-navbar .nav-header {
+    padding: 0;
+    background-color: #1ab394;
+}
+
+body.canvas-menu .nav-header {
+    padding: 33px 25px;
+}
+
+body.mini-navbar #page-wrapper {
+    margin: 0 0 0 70px;
+}
+
+body.canvas-menu.mini-navbar #page-wrapper,
+body.canvas-menu.mini-navbar .footer {
+    margin: 0 0 0 0;
+}
+
+body.fixed-sidebar .navbar-static-side,
+body.canvas-menu .navbar-static-side {
+    position: fixed;
+    width: 220px;
+    z-index: 2001;
+    height: 100%;
+}
+
+body.fixed-sidebar.mini-navbar .navbar-static-side {
+    width: 70px;
+}
+
+body.fixed-sidebar.mini-navbar #page-wrapper {
+    margin: 0 0 0 70px;
+}
+
+body.body-small.fixed-sidebar.mini-navbar #page-wrapper {
+    margin: 0 0 0 70px;
+}
+
+body.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
+    width: 70px;
+}
+
+.fixed-sidebar.mini-navbar .nav li> .nav-second-level {
+    display: none;
+}
+
+.fixed-sidebar.mini-navbar .nav li.active {
+    border-left-width: 0;
+}
+
+.fixed-sidebar.mini-navbar .nav li:hover > .nav-second-level,
+.canvas-menu.mini-navbar .nav li:hover > .nav-second-level {
+    position: absolute;
+    left: 70px;
+    top: 0px;
+    background-color: #2f4050;
+    padding: 10px 10px 0 10px;
+    font-size: 12px;
+    display: block;
+    min-width: 140px;
+    border-radius: 2px;
+}
+
+body.fixed-sidebar.mini-navbar .navbar-default .nav > li > .nav-second-level li a {
+    font-size: 12px;
+    border-radius: 3px;
+}
+
+body.canvas-menu.mini-navbar .navbar-default .nav > li > .nav-second-level li a {
+    font-size: 13px;
+    border-radius: 3px;
+}
+
+.fixed-sidebar.mini-navbar .nav-second-level li a,
+.canvas-menu.mini-navbar .nav-second-level li a {
+    padding: 10px 10px 10px 15px;
+}
+
+.fixed-sidebar.mini-navbar .nav-second-level,
+.canvas-menu.mini-navbar .nav-second-level {
+    position: relative;
+    padding: 0;
+    font-size: 13px;
+}
+
+.fixed-sidebar.mini-navbar li.active .nav-second-level,
+.canvas-menu.mini-navbar li.active .nav-second-level {
+    left: 0px;
+}
+
+body.canvas-menu nav.navbar-static-side {
+    z-index: 2001;
+    background: #2f4050;
+    height: 100%;
+    position: fixed;
+    display: none;
+}
+
+body.canvas-menu.mini-navbar nav.navbar-static-side {
+    display: block;
+    width: 70px;
+}
+
+.top-navigation #page-wrapper {
+    margin-left: 0;
+}
+
+.top-navigation .navbar-nav .dropdown-menu > .active > a {
+    background: white;
+    color: #1ab394;
+    font-weight: bold;
+}
+
+.white-bg .navbar-fixed-top,
+.white-bg .navbar-static-top {
+    background: #fff;
+}
+
+.top-navigation .navbar {
+    margin-bottom: 0;
+}
+
+.top-navigation .nav > li > a {
+    padding: 15px 20px;
+    color: #676a6c;
+}
+
+.top-navigation .nav > li a:hover,
+.top-navigation .nav > li a:focus {
+    background: #fff;
+    color: #1ab394;
+}
+
+.top-navigation .nav > li.active {
+    background: #fff;
+    border: none;
+}
+
+.top-navigation .nav > li.active > a {
+    color: #1ab394;
+}
+
+.top-navigation .navbar-right {
+    padding-right: 10px;
+}
+
+.top-navigation .navbar-nav .dropdown-menu {
+    box-shadow: none;
+    border: 1px solid #e7eaec;
+}
+
+.top-navigation .dropdown-menu > li > a {
+    margin: 0;
+    padding: 7px 20px;
+}
+
+.navbar .dropdown-menu {
+    margin-top: 0px;
+}
+
+.top-navigation .navbar-brand {
+    background: #1ab394;
+    color: #fff;
+    padding: 15px 25px;
+}
+
+.top-navigation .navbar-top-links li:last-child {
+    margin-right: 0;
+}
+
+.top-navigation.mini-navbar #page-wrapper,
+.top-navigation.body-small.fixed-sidebar.mini-navbar #page-wrapper,
+.mini-navbar .top-navigation #page-wrapper,
+.body-small.fixed-sidebar.mini-navbar .top-navigation #page-wrapper,
+.canvas-menu #page-wrapper {
+    margin: 0;
+}
+
+.top-navigation.fixed-nav #wrapper,
+.fixed-nav #wrapper.top-navigation {
+    margin-top: 50px;
+}
+
+.top-navigation .footer.fixed {
+    margin-left: 0 !important;
+}
+
+.top-navigation .wrapper.wrapper-content {
+    padding: 40px;
+}
+
+.top-navigation.body-small .wrapper.wrapper-content,
+.body-small .top-navigation .wrapper.wrapper-content {
+    padding: 40px 0px 40px 0px;
+}
+
+.navbar-toggle {
+    background-color: #1ab394;
+    color: #fff;
+    padding: 6px 12px;
+    font-size: 14px;
+}
+
+.top-navigation .navbar-nav .open .dropdown-menu > li > a,
+.top-navigation .navbar-nav .open .dropdown-menu .dropdown-header {
+    padding: 10px 15px 10px 20px;
+}
+
+@media (max-width: 768px) {
+    .top-navigation .navbar-header {
+        display: block;
+        float: none;
+    }
+}
+
+.menu-visible-lg,
+.menu-visible-md {
+    display: none !important;
+}
+
+@media (min-width: 1200px) {
+    .menu-visible-lg {
+        display: block !important;
+    }
+}
+
+@media (min-width: 992px) {
+    .menu-visible-md {
+        display: block !important;
+    }
+}
+
+@media (max-width: 767px) {
+    .menu-visible-md {
+        display: block !important;
+    }
+    .menu-visible-lg {
+        display: block !important;
+    }
+}
+
+.btn {
+    border-radius: 3px;
+}
+
+.float-e-margins .btn {
+    margin-bottom: 5px;
+}
+
+.btn-w-m {
+    min-width: 120px;
+}
+
+.btn-primary.btn-outline {
+    color: #1ab394;
+}
+
+.btn-success.btn-outline {
+    color: #1c84c6;
+}
+
+.btn-info.btn-outline {
+    color: #23c6c8;
+}
+
+.btn-warning.btn-outline {
+    color: #f8ac59;
+}
+
+.btn-danger.btn-outline {
+    color: #ed5565;
+}
+
+.btn-primary.btn-outline:hover,
+.btn-success.btn-outline:hover,
+.btn-info.btn-outline:hover,
+.btn-warning.btn-outline:hover,
+.btn-danger.btn-outline:hover {
+    color: #fff;
+}
+
+.btn-primary {
+    background-color: #1ab394;
+    border-color: #1ab394;
+    color: #FFFFFF;
+}
+
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+    background-color: #18a689;
+    border-color: #18a689;
+    color: #FFFFFF;
+}
+
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+    background-image: none;
+}
+
+.btn-primary.disabled,
+.btn-primary.disabled:hover,
+.btn-primary.disabled:focus,
+.btn-primary.disabled:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled],
+.btn-primary[disabled]:hover,
+.btn-primary[disabled]:focus,
+.btn-primary[disabled]:active,
+.btn-primary.active[disabled],
+fieldset[disabled] .btn-primary,
+fieldset[disabled] .btn-primary:hover,
+fieldset[disabled] .btn-primary:focus,
+fieldset[disabled] .btn-primary:active,
+fieldset[disabled] .btn-primary.active {
+    background-color: #1dc5a3;
+    border-color: #1dc5a3;
+}
+
+.btn-success {
+    background-color: #1c84c6;
+    border-color: #1c84c6;
+    color: #FFFFFF;
+}
+
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+    background-color: #1a7bb9;
+    border-color: #1a7bb9;
+    color: #FFFFFF;
+}
+
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+    background-image: none;
+}
+
+.btn-success.disabled,
+.btn-success.disabled:hover,
+.btn-success.disabled:focus,
+.btn-success.disabled:active,
+.btn-success.disabled.active,
+.btn-success[disabled],
+.btn-success[disabled]:hover,
+.btn-success[disabled]:focus,
+.btn-success[disabled]:active,
+.btn-success.active[disabled],
+fieldset[disabled] .btn-success,
+fieldset[disabled] .btn-success:hover,
+fieldset[disabled] .btn-success:focus,
+fieldset[disabled] .btn-success:active,
+fieldset[disabled] .btn-success.active {
+    background-color: #1f90d8;
+    border-color: #1f90d8;
+}
+
+.btn-info {
+    background-color: #23c6c8;
+    border-color: #23c6c8;
+    color: #FFFFFF;
+}
+
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+    background-color: #21b9bb;
+    border-color: #21b9bb;
+    color: #FFFFFF;
+}
+
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+    background-image: none;
+}
+
+.btn-info.disabled,
+.btn-info.disabled:hover,
+.btn-info.disabled:focus,
+.btn-info.disabled:active,
+.btn-info.disabled.active,
+.btn-info[disabled],
+.btn-info[disabled]:hover,
+.btn-info[disabled]:focus,
+.btn-info[disabled]:active,
+.btn-info.active[disabled],
+fieldset[disabled] .btn-info,
+fieldset[disabled] .btn-info:hover,
+fieldset[disabled] .btn-info:focus,
+fieldset[disabled] .btn-info:active,
+fieldset[disabled] .btn-info.active {
+    background-color: #26d7d9;
+    border-color: #26d7d9;
+}
+
+.btn-default {
+    background-color: #c2c2c2;
+    border-color: #c2c2c2;
+    color: #FFFFFF;
+}
+
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+    background-color: #bababa;
+    border-color: #bababa;
+    color: #FFFFFF;
+}
+
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+    background-image: none;
+}
+
+.btn-default.disabled,
+.btn-default.disabled:hover,
+.btn-default.disabled:focus,
+.btn-default.disabled:active,
+.btn-default.disabled.active,
+.btn-default[disabled],
+.btn-default[disabled]:hover,
+.btn-default[disabled]:focus,
+.btn-default[disabled]:active,
+.btn-default.active[disabled],
+fieldset[disabled] .btn-default,
+fieldset[disabled] .btn-default:hover,
+fieldset[disabled] .btn-default:focus,
+fieldset[disabled] .btn-default:active,
+fieldset[disabled] .btn-default.active {
+    background-color: #cccccc;
+    border-color: #cccccc;
+}
+
+.btn-warning {
+    background-color: #f8ac59;
+    border-color: #f8ac59;
+    color: #FFFFFF;
+}
+
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+    background-color: #f7a54a;
+    border-color: #f7a54a;
+    color: #FFFFFF;
+}
+
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+    background-image: none;
+}
+
+.btn-warning.disabled,
+.btn-warning.disabled:hover,
+.btn-warning.disabled:focus,
+.btn-warning.disabled:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled],
+.btn-warning[disabled]:hover,
+.btn-warning[disabled]:focus,
+.btn-warning[disabled]:active,
+.btn-warning.active[disabled],
+fieldset[disabled] .btn-warning,
+fieldset[disabled] .btn-warning:hover,
+fieldset[disabled] .btn-warning:focus,
+fieldset[disabled] .btn-warning:active,
+fieldset[disabled] .btn-warning.active {
+    background-color: #f9b66d;
+    border-color: #f9b66d;
+}
+
+.btn-danger {
+    background-color: #ed5565;
+    border-color: #ed5565;
+    color: #FFFFFF;
+}
+
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+    background-color: #ec4758;
+    border-color: #ec4758;
+    color: #FFFFFF;
+}
+
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+    background-image: none;
+}
+
+.btn-danger.disabled,
+.btn-danger.disabled:hover,
+.btn-danger.disabled:focus,
+.btn-danger.disabled:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled],
+.btn-danger[disabled]:hover,
+.btn-danger[disabled]:focus,
+.btn-danger[disabled]:active,
+.btn-danger.active[disabled],
+fieldset[disabled] .btn-danger,
+fieldset[disabled] .btn-danger:hover,
+fieldset[disabled] .btn-danger:focus,
+fieldset[disabled] .btn-danger:active,
+fieldset[disabled] .btn-danger.active {
+    background-color: #ef6776;
+    border-color: #ef6776;
+}
+
+.btn-link {
+    color: inherit;
+}
+
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active,
+.btn-link.active,
+.open .dropdown-toggle.btn-link {
+    color: #1ab394;
+    text-decoration: none;
+}
+
+.btn-link:active,
+.btn-link.active,
+.open .dropdown-toggle.btn-link {
+    background-image: none;
+}
+
+.btn-link.disabled,
+.btn-link.disabled:hover,
+.btn-link.disabled:focus,
+.btn-link.disabled:active,
+.btn-link.disabled.active,
+.btn-link[disabled],
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus,
+.btn-link[disabled]:active,
+.btn-link.active[disabled],
+fieldset[disabled] .btn-link,
+fieldset[disabled] .btn-link:hover,
+fieldset[disabled] .btn-link:focus,
+fieldset[disabled] .btn-link:active,
+fieldset[disabled] .btn-link.active {
+    color: #cacaca;
+}
+
+.btn-white {
+    color: inherit;
+    background: white;
+    border: 1px solid #e7eaec;
+}
+
+.btn-white:hover,
+.btn-white:focus,
+.btn-white:active,
+.btn-white.active,
+.open .dropdown-toggle.btn-white {
+    color: inherit;
+    border: 1px solid #d2d2d2;
+}
+
+.btn-white:active,
+.btn-white.active {
+    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15) inset;
+}
+
+.btn-white:active,
+.btn-white.active,
+.open .dropdown-toggle.btn-white {
+    background-image: none;
+}
+
+.btn-white.disabled,
+.btn-white.disabled:hover,
+.btn-white.disabled:focus,
+.btn-white.disabled:active,
+.btn-white.disabled.active,
+.btn-white[disabled],
+.btn-white[disabled]:hover,
+.btn-white[disabled]:focus,
+.btn-white[disabled]:active,
+.btn-white.active[disabled],
+fieldset[disabled] .btn-white,
+fieldset[disabled] .btn-white:hover,
+fieldset[disabled] .btn-white:focus,
+fieldset[disabled] .btn-white:active,
+fieldset[disabled] .btn-white.active {
+    color: #cacaca;
+}
+
+.form-control,
+.form-control:focus,
+.has-error .form-control:focus,
+.has-success .form-control:focus,
+.has-warning .form-control:focus,
+.navbar-collapse,
+.navbar-form,
+.navbar-form-custom .form-control:focus,
+.navbar-form-custom .form-control:hover,
+.open .btn.dropdown-toggle,
+.panel,
+.popover,
+.progress,
+.progress-bar {
+    box-shadow: none;
+}
+
+.btn-outline {
+    color: inherit;
+    background-color: transparent;
+    -webkit-transition: all .5s;
+    transition: all .5s;
+}
+
+.btn-rounded {
+    border-radius: 50px;
+}
+
+.btn-large-dim {
+    width: 90px;
+    height: 90px;
+    font-size: 42px;
+}
+
+button.dim {
+    display: inline-block;
+    color: #fff;
+    text-decoration: none;
+    text-transform: uppercase;
+    text-align: center;
+    padding-top: 6px;
+    margin-right: 10px;
+    position: relative;
+    cursor: pointer;
+    border-radius: 5px;
+    font-weight: 600;
+    margin-bottom: 20px !important;
+}
+
+button.dim:active {
+    top: 3px;
+}
+
+button.btn-primary.dim {
+    box-shadow: inset 0px 0px 0px #16987e, 0px 5px 0px 0px #16987e, 0px 10px 5px #999999;
+}
+
+button.btn-primary.dim:active {
+    box-shadow: inset 0px 0px 0px #16987e, 0px 2px 0px 0px #16987e, 0px 5px 3px #999999;
+}
+
+button.btn-default.dim {
+    box-shadow: inset 0px 0px 0px #b3b3b3, 0px 5px 0px 0px #b3b3b3, 0px 10px 5px #999999;
+}
+
+button.btn-default.dim:active {
+    box-shadow: inset 0px 0px 0px #b3b3b3, 0px 2px 0px 0px #b3b3b3, 0px 5px 3px #999999;
+}
+
+button.btn-warning.dim {
+    box-shadow: inset 0px 0px 0px #f79d3c, 0px 5px 0px 0px #f79d3c, 0px 10px 5px #999999;
+}
+
+button.btn-warning.dim:active {
+    box-shadow: inset 0px 0px 0px #f79d3c, 0px 2px 0px 0px #f79d3c, 0px 5px 3px #999999;
+}
+
+button.btn-info.dim {
+    box-shadow: inset 0px 0px 0px #1eacae, 0px 5px 0px 0px #1eacae, 0px 10px 5px #999999;
+}
+
+button.btn-info.dim:active {
+    box-shadow: inset 0px 0px 0px #1eacae, 0px 2px 0px 0px #1eacae, 0px 5px 3px #999999;
+}
+
+button.btn-success.dim {
+    box-shadow: inset 0px 0px 0px #1872ab, 0px 5px 0px 0px #1872ab, 0px 10px 5px #999999;
+}
+
+button.btn-success.dim:active {
+    box-shadow: inset 0px 0px 0px #1872ab, 0px 2px 0px 0px #1872ab, 0px 5px 3px #999999;
+}
+
+button.btn-danger.dim {
+    box-shadow: inset 0px 0px 0px #ea394c, 0px 5px 0px 0px #ea394c, 0px 10px 5px #999999;
+}
+
+button.btn-danger.dim:active {
+    box-shadow: inset 0px 0px 0px #ea394c, 0px 2px 0px 0px #ea394c, 0px 5px 3px #999999;
+}
+
+button.dim:before {
+    font-size: 50px;
+    line-height: 1em;
+    font-weight: normal;
+    color: #fff;
+    display: block;
+    padding-top: 10px;
+}
+
+button.dim:active:before {
+    top: 7px;
+    font-size: 50px;
+}
+
+.label {
+    background-color: #d1dade;
+    color: #5e5e5e;
+    font-size: 10px;
+    font-weight: 600;
+    padding: 3px 8px;
+    text-shadow: none;
+}
+
+.badge {
+    background-color: #d1dade;
+    color: #5e5e5e;
+    font-size: 11px;
+    font-weight: 600;
+    padding-bottom: 4px;
+    padding-left: 6px;
+    padding-right: 6px;
+    text-shadow: none;
+}
+
+.label-primary,
+.badge-primary {
+    background-color: #1ab394;
+    color: #FFFFFF;
+}
+
+.label-success,
+.badge-success {
+    background-color: #1c84c6;
+    color: #FFFFFF;
+}
+
+.label-warning,
+.badge-warning {
+    background-color: #f8ac59;
+    color: #FFFFFF;
+}
+
+.label-warning-light,
+.badge-warning-light {
+    background-color: #f8ac59;
+    color: #ffffff;
+}
+
+.label-danger,
+.badge-danger {
+    background-color: #ed5565;
+    color: #FFFFFF;
+}
+
+.label-info,
+.badge-info {
+    background-color: #23c6c8;
+    color: #FFFFFF;
+}
+
+.label-inverse,
+.badge-inverse {
+    background-color: #262626;
+    color: #FFFFFF;
+}
+
+.label-white,
+.badge-white {
+    background-color: #FFFFFF;
+    color: #5E5E5E;
+}
+
+.label-white,
+.badge-disable {
+    background-color: #2A2E36;
+    color: #8B91A0;
+}
+
+
+/* TOOGLE SWICH */
+
+.onoffswitch {
+    position: relative;
+    width: 64px;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+}
+
+.onoffswitch-checkbox {
+    display: none;
+}
+
+.onoffswitch-label {
+    display: block;
+    overflow: hidden;
+    cursor: pointer;
+    border: 2px solid #1ab394;
+    border-radius: 2px;
+}
+
+.onoffswitch-inner {
+    width: 200%;
+    margin-left: -100%;
+    -webkit-transition: margin 0.3s ease-in 0s;
+    transition: margin 0.3s ease-in 0s;
+}
+
+.onoffswitch-inner:before,
+.onoffswitch-inner:after {
+    float: left;
+    width: 50%;
+    height: 20px;
+    padding: 0;
+    line-height: 20px;
+    font-size: 12px;
+    color: white;
+    font-family: Trebuchet, Arial, sans-serif;
+    font-weight: bold;
+    box-sizing: border-box;
+}
+
+.onoffswitch-inner:before {
+    content: "ON";
+    padding-left: 10px;
+    background-color: #1ab394;
+    color: #FFFFFF;
+}
+
+.onoffswitch-inner:after {
+    content: "OFF";
+    padding-right: 10px;
+    background-color: #FFFFFF;
+    color: #999999;
+    text-align: right;
+}
+
+.onoffswitch-switch {
+    width: 20px;
+    margin: 0px;
+    background: #FFFFFF;
+    border: 2px solid #1ab394;
+    border-radius: 2px;
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    right: 44px;
+    -webkit-transition: all 0.3s ease-in 0s;
+    transition: all 0.3s ease-in 0s;
+}
+
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
+    margin-left: 0;
+}
+
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
+    right: 0px;
+}
+
+
+/* CHOSEN PLUGIN */
+
+.chosen-container-single .chosen-single {
+    background: #ffffff;
+    box-shadow: none;
+    -moz-box-sizing: border-box;
+    background-color: #FFFFFF;
+    border: 1px solid #CBD5DD;
+    border-radius: 2px;
+    cursor: text;
+    height: auto !important;
+    margin: 0;
+    min-height: 30px;
+    overflow: hidden;
+    padding: 4px 12px;
+    position: relative;
+    width: 100%;
+}
+
+.chosen-container-multi .chosen-choices li.search-choice {
+    background: #f1f1f1;
+    border: 1px solid #ededed;
+    border-radius: 2px;
+    box-shadow: none;
+    color: #333333;
+    cursor: default;
+    line-height: 13px;
+    margin: 3px 0 3px 5px;
+    padding: 3px 20px 3px 5px;
+    position: relative;
+}
+
+
+/* PAGINATIN */
+
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+    background-color: #f4f4f4;
+    border-color: #DDDDDD;
+    color: inherit;
+    cursor: default;
+    z-index: 2;
+}
+
+.pagination > li > a,
+.pagination > li > span {
+    background-color: #FFFFFF;
+    border: 1px solid #DDDDDD;
+    color: inherit;
+    float: left;
+    line-height: 1.42857;
+    margin-left: -1px;
+    padding: 4px 10px;
+    position: relative;
+    text-decoration: none;
+}
+
+
+/* TOOLTIPS */
+
+.tooltip-inner {
+    background-color: #2F4050;
+}
+
+.tooltip.top .tooltip-arrow {
+    border-top-color: #2F4050;
+}
+
+.tooltip.right .tooltip-arrow {
+    border-right-color: #2F4050;
+}
+
+.tooltip.bottom .tooltip-arrow {
+    border-bottom-color: #2F4050;
+}
+
+.tooltip.left .tooltip-arrow {
+    border-left-color: #2F4050;
+}
+
+
+/* EASY PIE CHART*/
+
+.easypiechart {
+    position: relative;
+    text-align: center;
+}
+
+.easypiechart .h2 {
+    margin-left: 10px;
+    margin-top: 10px;
+    display: inline-block;
+}
+
+.easypiechart canvas {
+    top: 0;
+    left: 0;
+}
+
+.easypiechart .easypie-text {
+    line-height: 1;
+    position: absolute;
+    top: 33px;
+    width: 100%;
+    z-index: 1;
+}
+
+.easypiechart img {
+    margin-top: -4px;
+}
+
+.jqstooltip {
+    box-sizing: content-box;
+}
+
+
+/* FULLCALENDAR */
+
+.fc-state-default {
+    background-color: #ffffff;
+    background-image: none;
+    background-repeat: repeat-x;
+    box-shadow: none;
+    color: #333333;
+    text-shadow: none;
+}
+
+.fc-state-default {
+    border: 1px solid;
+}
+
+.fc-button {
+    color: inherit;
+    border: 1px solid #e7eaec;
+    cursor: pointer;
+    display: inline-block;
+    height: 1.9em;
+    line-height: 1.9em;
+    overflow: hidden;
+    padding: 0 0.6em;
+    position: relative;
+    white-space: nowrap;
+}
+
+.fc-state-active {
+    background-color: #1ab394;
+    border-color: #1ab394;
+    color: #ffffff;
+}
+
+.fc-header-title h2 {
+    font-size: 16px;
+    font-weight: 600;
+    color: inherit;
+}
+
+.fc-content .fc-widget-header,
+.fc-content .fc-widget-content {
+    border-color: #e7eaec;
+    font-weight: normal;
+}
+
+.fc-border-separate tbody {
+    background-color: #F8F8F8;
+}
+
+.fc-state-highlight {
+    background: none repeat scroll 0 0 #FCF8E3;
+}
+
+.external-event {
+    padding: 5px 10px;
+    border-radius: 2px;
+    cursor: pointer;
+    margin-bottom: 5px;
+}
+
+.fc-ltr .fc-event-hori.fc-event-end,
+.fc-rtl .fc-event-hori.fc-event-start {
+    border-radius: 2px;
+}
+
+.fc-event,
+.fc-agenda .fc-event-time,
+.fc-event a {
+    padding: 4px 6px;
+    background-color: #1ab394;
+    /* background color */
+    border-color: #1ab394;
+    /* border color */
+}
+
+.fc-event-time,
+.fc-event-title {
+    color: #717171;
+    padding: 0 1px;
+}
+
+.ui-calendar .fc-event-time,
+.ui-calendar .fc-event-title {
+    color: #fff;
+}
+
+
+/* Chat */
+
+.chat-activity-list .chat-element {
+    border-bottom: 1px solid #e7eaec;
+}
+
+.chat-element:first-child {
+    margin-top: 0;
+}
+
+.chat-element {
+    padding-bottom: 15px;
+}
+
+.chat-element,
+.chat-element .media {
+    margin-top: 15px;
+}
+
+.chat-element,
+.media-body {
+    overflow: hidden;
+}
+
+.media-body {
+    display: block;
+    width: auto;
+}
+
+.chat-element > .pull-left {
+    margin-right: 10px;
+}
+
+.chat-element img.img-circle,
+.dropdown-messages-box img.img-circle {
+    width: 38px;
+    height: 38px;
+}
+
+.chat-element .well {
+    border: 1px solid #e7eaec;
+    box-shadow: none;
+    margin-top: 10px;
+    margin-bottom: 5px;
+    padding: 10px 20px;
+    font-size: 11px;
+    line-height: 16px;
+}
+
+.chat-element .actions {
+    margin-top: 10px;
+}
+
+.chat-element .photos {
+    margin: 10px 0;
+}
+
+.right.chat-element > .pull-right {
+    margin-left: 10px;
+}
+
+.chat-photo {
+    max-height: 180px;
+    border-radius: 4px;
+    overflow: hidden;
+    margin-right: 10px;
+    margin-bottom: 10px;
+}
+
+.chat {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+}
+
+.chat li {
+    margin-bottom: 10px;
+    padding-bottom: 5px;
+    border-bottom: 1px dotted #B3A9A9;
+}
+
+.chat li.left .chat-body {
+    margin-left: 60px;
+}
+
+.chat li.right .chat-body {
+    margin-right: 60px;
+}
+
+.chat li .chat-body p {
+    margin: 0;
+    color: #777777;
+}
+
+.panel .slidedown .glyphicon,
+.chat .glyphicon {
+    margin-right: 5px;
+}
+
+.chat-panel .panel-body {
+    height: 350px;
+    overflow-y: scroll;
+}
+
+
+/* LIST GROUP */
+
+a.list-group-item.active,
+a.list-group-item.active:hover,
+a.list-group-item.active:focus {
+    background-color: #1ab394;
+    border-color: #1ab394;
+    color: #FFFFFF;
+    z-index: 2;
+}
+
+.list-group-item-heading {
+    margin-top: 10px;
+}
+
+.list-group-item-text {
+    margin: 0 0 10px;
+    color: inherit;
+    font-size: 12px;
+    line-height: inherit;
+}
+
+.no-padding .list-group-item {
+    border-left: none;
+    border-right: none;
+    border-bottom: none;
+}
+
+.no-padding .list-group-item:first-child {
+    border-left: none;
+    border-right: none;
+    border-bottom: none;
+    border-top: none;
+}
+
+.no-padding .list-group {
+    margin-bottom: 0;
+}
+
+.list-group-item {
+    background-color: inherit;
+    border: 1px solid #e7eaec;
+    display: block;
+    margin-bottom: -1px;
+    padding: 10px 15px;
+    position: relative;
+}
+
+.elements-list .list-group-item {
+    border-left: none;
+    border-right: none;
+    /*border-top: none;*/
+    padding: 15px 25px;
+}
+
+.elements-list .list-group-item:first-child {
+    border-left: none;
+    border-right: none;
+    border-top: none !important;
+}
+
+.elements-list .list-group {
+    margin-bottom: 0;
+}
+
+.elements-list a {
+    color: inherit;
+}
+
+.elements-list .list-group-item.active,
+.elements-list .list-group-item:hover {
+    background: #f3f3f4;
+    color: inherit;
+    border-color: #e7eaec;
+    /*border-bottom: 1px solid #e7eaec;*/
+    /*border-top: 1px solid #e7eaec;*/
+    border-radius: 0;
+}
+
+.elements-list li.active {
+    -webkit-transition: none;
+    transition: none;
+}
+
+.element-detail-box {
+    padding: 25px;
+}
+
+
+/* FLOT CHART  */
+
+.flot-chart {
+    display: block;
+    height: 200px;
+}
+
+.widget .flot-chart.dashboard-chart {
+    display: block;
+    height: 120px;
+    margin-top: 40px;
+}
+
+.flot-chart.dashboard-chart {
+    display: block;
+    height: 180px;
+    margin-top: 40px;
+}
+
+.flot-chart-content {
+    width: 100%;
+    height: 100%;
+}
+
+.flot-chart-pie-content {
+    width: 200px;
+    height: 200px;
+    margin: auto;
+}
+
+.jqstooltip {
+    position: absolute;
+    display: block;
+    left: 0px;
+    top: 0px;
+    visibility: hidden;
+    background: #2b303a;
+    background-color: rgba(43, 48, 58, 0.8);
+    color: white;
+    text-align: left;
+    white-space: nowrap;
+    z-index: 10000;
+    padding: 5px 5px 5px 5px;
+    min-height: 22px;
+    border-radius: 3px;
+}
+
+.jqsfield {
+    color: white;
+    text-align: left;
+}
+
+.h-200 {
+    min-height: 200px;
+}
+
+.legendLabel {
+    padding-left: 5px;
+}
+
+.stat-list li:first-child {
+    margin-top: 0;
+}
+
+.stat-list {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+}
+
+.stat-percent {
+    float: right;
+}
+
+.stat-list li {
+    margin-top: 15px;
+    position: relative;
+}
+
+
+/* DATATABLES */
+
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+    background: transparent;
+}
+
+table.dataTable thead .sorting_asc:after {
+    float: right;
+    font-family: fontawesome;
+}
+
+table.dataTable thead .sorting_desc:after {
+    content: "\f0dd";
+    float: right;
+    font-family: fontawesome;
+}
+
+table.dataTable thead .sorting:after {
+    content: "\f0dc";
+    float: right;
+    font-family: fontawesome;
+    color: rgba(50, 50, 50, 0.5);
+}
+
+.dataTables_wrapper {
+    padding-bottom: 30px;
+}
+
+
+/* CIRCLE */
+
+.img-circle {
+    border-radius: 50%;
+}
+
+.btn-circle {
+    width: 30px;
+    height: 30px;
+    padding: 6px 0;
+    border-radius: 15px;
+    text-align: center;
+    font-size: 12px;
+    line-height: 1.428571429;
+}
+
+.btn-circle.btn-lg {
+    width: 50px;
+    height: 50px;
+    padding: 10px 16px;
+    border-radius: 25px;
+    font-size: 18px;
+    line-height: 1.33;
+}
+
+.btn-circle.btn-xl {
+    width: 70px;
+    height: 70px;
+    padding: 10px 16px;
+    border-radius: 35px;
+    font-size: 24px;
+    line-height: 1.33;
+}
+
+.show-grid [class^="col-"] {
+    padding-top: 10px;
+    padding-bottom: 10px;
+    border: 1px solid #ddd;
+    background-color: #eee !important;
+}
+
+.show-grid {
+    margin: 15px 0;
+}
+
+
+/* ANIMATION */
+
+.css-animation-box h1 {
+    font-size: 44px;
+}
+
+.animation-efect-links a {
+    padding: 4px 6px;
+    font-size: 12px;
+}
+
+#animation_box {
+    background-color: #f9f8f8;
+    border-radius: 16px;
+    width: 80%;
+    margin: 0 auto;
+    padding-top: 80px;
+}
+
+.animation-text-box {
+    position: absolute;
+    margin-top: 40px;
+    left: 50%;
+    margin-left: -100px;
+    width: 200px;
+}
+
+.animation-text-info {
+    position: absolute;
+    margin-top: -60px;
+    left: 50%;
+    margin-left: -100px;
+    width: 200px;
+    font-size: 10px;
+}
+
+.animation-text-box h2 {
+    font-size: 54px;
+    font-weight: 600;
+    margin-bottom: 5px;
+}
+
+.animation-text-box p {
+    font-size: 12px;
+    text-transform: uppercase;
+}
+
+
+/* PEACE */
+
+.pace {
+    -webkit-pointer-events: none;
+    pointer-events: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+.pace-inactive {
+    display: none;
+}
+
+.pace .pace-progress {
+    background: #1ab394;
+    position: fixed;
+    z-index: 2000;
+    top: 0;
+    width: 100%;
+    height: 2px;
+}
+
+.pace-inactive {
+    display: none;
+}
+
+
+/* WIDGETS */
+
+.widget {
+    border-radius: 5px;
+    padding: 15px 20px;
+    margin-bottom: 10px;
+    margin-top: 10px;
+}
+
+.widget.style1 h2 {
+    font-size: 30px;
+}
+
+.widget h2,
+.widget h3 {
+    margin-top: 5px;
+    margin-bottom: 0;
+}
+
+.widget-text-box {
+    padding: 20px;
+    border: 1px solid #e7eaec;
+    background: #ffffff;
+}
+
+.widget-head-color-box {
+    border-radius: 5px 5px 0px 0px;
+    margin-top: 10px;
+}
+
+.widget .flot-chart {
+    height: 100px;
+}
+
+.vertical-align div {
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.vertical-align h2,
+.vertical-align h3 {
+    margin: 0;
+}
+
+.todo-list {
+    list-style: none outside none;
+    margin: 0;
+    padding: 0;
+    font-size: 14px;
+}
+
+.todo-list.small-list {
+    font-size: 12px;
+}
+
+.todo-list.small-list > li {
+    background: #f3f3f4;
+    border-left: none;
+    border-right: none;
+    border-radius: 4px;
+    color: inherit;
+    margin-bottom: 2px;
+    padding: 6px 6px 6px 12px;
+}
+
+.todo-list.small-list .btn-xs,
+.todo-list.small-list .btn-group-xs > .btn {
+    border-radius: 5px;
+    font-size: 10px;
+    line-height: 1.5;
+    padding: 1px 2px 1px 5px;
+}
+
+.todo-list > li {
+    background: #f3f3f4;
+    border-left: 6px solid #e7eaec;
+    border-right: 6px solid #e7eaec;
+    border-radius: 4px;
+    color: inherit;
+    margin-bottom: 2px;
+    padding: 10px;
+}
+
+.todo-list .handle {
+    cursor: move;
+    display: inline-block;
+    font-size: 16px;
+    margin: 0 5px;
+}
+
+.todo-list > li .label {
+    font-size: 9px;
+    margin-left: 10px;
+}
+
+.check-link {
+    font-size: 16px;
+}
+
+.todo-completed {
+    text-decoration: line-through;
+}
+
+.geo-statistic h1 {
+    font-size: 36px;
+    margin-bottom: 0;
+}
+
+.glyphicon.fa {
+    font-family: "FontAwesome";
+}
+
+
+/* INPUTS */
+
+.inline {
+    display: inline-block !important;
+}
+
+.input-s-sm {
+    width: 120px;
+}
+
+.input-s {
+    width: 200px;
+}
+
+.input-s-lg {
+    width: 250px;
+}
+
+.i-checks {
+    padding-left: 0;
+}
+
+.form-control,
+.single-line {
+    background-color: #FFFFFF;
+    background-image: none;
+    border: 1px solid #e5e6e7;
+    border-radius: 1px;
+    color: inherit;
+    display: block;
+    padding: 6px 12px;
+    -webkit-transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
+    transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;
+    width: 100%;
+    font-size: 14px;
+}
+
+.form-control:focus,
+.single-line:focus {
+    border-color: #1ab394 !important;
+}
+
+.has-success .form-control {
+    border-color: #1ab394;
+}
+
+.has-warning .form-control {
+    border-color: #f8ac59;
+}
+
+.has-error .form-control {
+    border-color: #ed5565;
+}
+
+.has-success .control-label {
+    color: #1ab394;
+}
+
+.has-warning .control-label {
+    color: #f8ac59;
+}
+
+.has-error .control-label {
+    color: #ed5565;
+}
+
+.input-group-addon {
+    background-color: #fff;
+    border: 1px solid #E5E6E7;
+    border-radius: 1px;
+    color: inherit;
+    font-size: 14px;
+    font-weight: 400;
+    line-height: 1;
+    padding: 6px 12px;
+    text-align: center;
+}
+
+.spinner-buttons.input-group-btn .btn-xs {
+    line-height: 1.13;
+}
+
+.spinner-buttons.input-group-btn {
+    width: 20%;
+}
+
+.noUi-connect {
+    background: none repeat scroll 0 0 #1ab394;
+    box-shadow: none;
+}
+
+.slider_red .noUi-connect {
+    background: none repeat scroll 0 0 #ed5565;
+    box-shadow: none;
+}
+
+
+/* UI Sortable */
+
+.ui-sortable .ibox-title {
+    cursor: move;
+}
+
+.ui-sortable-placeholder {
+    border: 1px dashed #cecece !important;
+    visibility: visible !important;
+    background: #e7eaec;
+}
+
+.ibox.ui-sortable-placeholder {
+    margin: 0px 0px 23px !important;
+}
+
+
+/* Tabs */
+
+.tabs-container .panel-body {
+    background: #fff;
+    border: 1px solid #e7eaec;
+    border-radius: 2px;
+    padding: 20px;
+    position: relative;
+}
+
+.tabs-container .nav-tabs > li.active > a,
+.tabs-container .nav-tabs > li.active > a:hover,
+.tabs-container .nav-tabs > li.active > a:focus {
+    border: 1px solid #e7eaec;
+    border-bottom-color: transparent;
+    background-color: #fff;
+}
+
+.tabs-container .nav-tabs > li {
+    float: left;
+    margin-bottom: -1px;
+}
+
+.tabs-container .tab-pane .panel-body {
+    border-top: none;
+}
+
+.tabs-container .nav-tabs > li.active > a,
+.tabs-container .nav-tabs > li.active > a:hover,
+.tabs-container .nav-tabs > li.active > a:focus {
+    border: 1px solid #e7eaec;
+    border-bottom-color: transparent;
+}
+
+.tabs-container .nav-tabs {
+    border-bottom: 1px solid #e7eaec;
+}
+
+.tabs-container .tab-pane .panel-body {
+    border-top: none;
+}
+
+.tabs-container .tabs-left .tab-pane .panel-body,
+.tabs-container .tabs-right .tab-pane .panel-body {
+    border-top: 1px solid #e7eaec;
+}
+
+.tabs-container .nav-tabs > li a:hover {
+    background: transparent;
+    border-color: transparent;
+}
+
+.tabs-container .tabs-below > .nav-tabs,
+.tabs-container .tabs-right > .nav-tabs,
+.tabs-container .tabs-left > .nav-tabs {
+    border-bottom: 0;
+}
+
+.tabs-container .tabs-left .panel-body {
+    position: static;
+}
+
+.tabs-container .tabs-left > .nav-tabs,
+.tabs-container .tabs-right > .nav-tabs {
+    width: 20%;
+}
+
+.tabs-container .tabs-left .panel-body {
+    width: 80%;
+    margin-left: 20%;
+}
+
+.tabs-container .tabs-right .panel-body {
+    width: 80%;
+    margin-right: 20%;
+}
+
+.tabs-container .tab-content > .tab-pane,
+.tabs-container .pill-content > .pill-pane {
+    display: none;
+}
+
+.tabs-container .tab-content > .active,
+.tabs-container .pill-content > .active {
+    display: block;
+}
+
+.tabs-container .tabs-below > .nav-tabs {
+    border-top: 1px solid #e7eaec;
+}
+
+.tabs-container .tabs-below > .nav-tabs > li {
+    margin-top: -1px;
+    margin-bottom: 0;
+}
+
+.tabs-container .tabs-below > .nav-tabs > li > a {
+    border-radius: 0 0 4px 4px;
+}
+
+.tabs-container .tabs-below > .nav-tabs > li > a:hover,
+.tabs-container .tabs-below > .nav-tabs > li > a:focus {
+    border-top-color: #e7eaec;
+    border-bottom-color: transparent;
+}
+
+.tabs-container .tabs-left > .nav-tabs > li,
+.tabs-container .tabs-right > .nav-tabs > li {
+    float: none;
+}
+
+.tabs-container .tabs-left > .nav-tabs > li > a,
+.tabs-container .tabs-right > .nav-tabs > li > a {
+    min-width: 74px;
+    margin-right: 0;
+    margin-bottom: 3px;
+}
+
+.tabs-container .tabs-left > .nav-tabs {
+    float: left;
+    margin-right: 19px;
+}
+
+.tabs-container .tabs-left > .nav-tabs > li > a {
+    margin-right: -1px;
+    border-radius: 4px 0 0 4px;
+}
+
+.tabs-container .tabs-left > .nav-tabs .active > a,
+.tabs-container .tabs-left > .nav-tabs .active > a:hover,
+.tabs-container .tabs-left > .nav-tabs .active > a:focus {
+    border-color: #e7eaec transparent #e7eaec #e7eaec;
+    *border-right-color: #ffffff;
+}
+
+.tabs-container .tabs-right > .nav-tabs {
+    float: right;
+    margin-left: 19px;
+}
+
+.tabs-container .tabs-right > .nav-tabs > li > a {
+    margin-left: -1px;
+    border-radius: 0 4px 4px 0;
+}
+
+.tabs-container .tabs-right > .nav-tabs .active > a,
+.tabs-container .tabs-right > .nav-tabs .active > a:hover,
+.tabs-container .tabs-right > .nav-tabs .active > a:focus {
+    border-color: #e7eaec #e7eaec #e7eaec transparent;
+    *border-left-color: #ffffff;
+    z-index: 1;
+}
+
+
+/* SWITCHES */
+
+.onoffswitch {
+    position: relative;
+    width: 54px;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+}
+
+.onoffswitch-checkbox {
+    display: none;
+}
+
+.onoffswitch-label {
+    display: block;
+    overflow: hidden;
+    cursor: pointer;
+    border: 2px solid #1AB394;
+    border-radius: 3px;
+}
+
+.onoffswitch-inner {
+    display: block;
+    width: 200%;
+    margin-left: -100%;
+    -webkit-transition: margin 0.3s ease-in 0s;
+    transition: margin 0.3s ease-in 0s;
+}
+
+.onoffswitch-inner:before,
+.onoffswitch-inner:after {
+    display: block;
+    float: left;
+    width: 50%;
+    height: 16px;
+    padding: 0;
+    line-height: 16px;
+    font-size: 10px;
+    color: white;
+    font-family: Trebuchet, Arial, sans-serif;
+    font-weight: bold;
+    box-sizing: border-box;
+}
+
+.onoffswitch-inner:before {
+    content: "ON";
+    padding-left: 7px;
+    background-color: #1AB394;
+    color: #FFFFFF;
+}
+
+.onoffswitch-inner:after {
+    content: "OFF";
+    padding-right: 7px;
+    background-color: #FFFFFF;
+    color: #919191;
+    text-align: right;
+}
+
+.onoffswitch-switch {
+    display: block;
+    width: 18px;
+    margin: 0px;
+    background: #FFFFFF;
+    border: 2px solid #1AB394;
+    border-radius: 3px;
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    right: 36px;
+    -webkit-transition: all 0.3s ease-in 0s;
+    transition: all 0.3s ease-in 0s;
+}
+
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
+    margin-left: 0;
+}
+
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
+    right: 0px;
+}
+
+
+/* Nestable list */
+
+.dd {
+    position: relative;
+    display: block;
+    margin: 0;
+    padding: 0;
+    list-style: none;
+    font-size: 13px;
+    line-height: 20px;
+}
+
+.dd-list {
+    display: block;
+    position: relative;
+    margin: 0;
+    padding: 0;
+    list-style: none;
+}
+
+.dd-list .dd-list {
+    padding-left: 30px;
+}
+
+.dd-collapsed .dd-list {
+    display: none;
+}
+
+.dd-item,
+.dd-empty,
+.dd-placeholder {
+    display: block;
+    position: relative;
+    margin: 0;
+    padding: 0;
+    min-height: 20px;
+    font-size: 13px;
+    line-height: 20px;
+}
+
+.dd-handle {
+    display: block;
+    margin: 5px 0;
+    padding: 5px 10px;
+    color: #333;
+    text-decoration: none;
+    border: 1px solid #e7eaec;
+    background: #f5f5f5;
+    border-radius: 3px;
+    box-sizing: border-box;
+    -moz-box-sizing: border-box;
+}
+
+.dd-handle span {
+    font-weight: bold;
+}
+
+.dd-handle:hover {
+    background: #f0f0f0;
+    cursor: pointer;
+    font-weight: bold;
+}
+
+.dd-item > button {
+    display: block;
+    position: relative;
+    cursor: pointer;
+    float: left;
+    width: 25px;
+    height: 20px;
+    margin: 5px 0;
+    padding: 0;
+    text-indent: 100%;
+    white-space: nowrap;
+    overflow: hidden;
+    border: 0;
+    background: transparent;
+    font-size: 12px;
+    line-height: 1;
+    text-align: center;
+    font-weight: bold;
+}
+
+.dd-item > button:before {
+    content: '+';
+    display: block;
+    position: absolute;
+    width: 100%;
+    text-align: center;
+    text-indent: 0;
+}
+
+.dd-item > button[data-action="collapse"]:before {
+    content: '-';
+}
+
+#nestable2 .dd-item > button {
+    font-family: FontAwesome;
+    height: 34px;
+    width: 33px;
+    color: #c1c1c1;
+}
+
+#nestable2 .dd-item > button:before {
+    content: "\f067";
+}
+
+#nestable2 .dd-item > button[data-action="collapse"]:before {
+    content: "\f068";
+}
+
+.dd-placeholder,
+.dd-empty {
+    margin: 5px 0;
+    padding: 0;
+    min-height: 30px;
+    background: #f2fbff;
+    border: 1px dashed #b6bcbf;
+    box-sizing: border-box;
+    -moz-box-sizing: border-box;
+}
+
+.dd-empty {
+    border: 1px dashed #bbb;
+    min-height: 100px;
+    background-color: #e5e5e5;
+    background-image: -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
+    background-image: linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff);
+    background-size: 60px 60px;
+    background-position: 0 0, 30px 30px;
+}
+
+.dd-dragel {
+    position: absolute;
+    z-index: 9999;
+    pointer-events: none;
+}
+
+.dd-dragel > .dd-item .dd-handle {
+    margin-top: 0;
+}
+
+.dd-dragel .dd-handle {
+    box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, 0.1);
+}
+
+
+/**
+* Nestable Extras
+*/
+
+.nestable-lists {
+    display: block;
+    clear: both;
+    padding: 30px 0;
+    width: 100%;
+    border: 0;
+    border-top: 2px solid #ddd;
+    border-bottom: 2px solid #ddd;
+}
+
+#nestable-menu {
+    padding: 0;
+    margin: 10px 0 20px 0;
+}
+
+#nestable-output,
+#nestable2-output {
+    width: 100%;
+    font-size: 0.75em;
+    line-height: 1.333333em;
+    font-family: lucida grande, lucida sans unicode, helvetica, arial, sans-serif;
+    padding: 5px;
+    box-sizing: border-box;
+    -moz-box-sizing: border-box;
+}
+
+#nestable2 .dd-handle {
+    color: inherit;
+    border: 1px dashed #e7eaec;
+    background: #f3f3f4;
+    padding: 10px;
+}
+
+#nestable2 .dd-handle:hover {
+    /*background: #bbb;*/
+}
+
+#nestable2 span.label {
+    margin-right: 10px;
+}
+
+#nestable-output,
+#nestable2-output {
+    font-size: 12px;
+    padding: 25px;
+    box-sizing: border-box;
+    -moz-box-sizing: border-box;
+}
+
+
+/* CodeMirror */
+
+.CodeMirror {
+    border: 1px solid #eee;
+    height: auto;
+}
+
+.CodeMirror-scroll {
+    overflow-y: hidden;
+    overflow-x: auto;
+}
+
+
+/* Google Maps */
+
+.google-map {
+    height: 300px;
+}
+
+
+/* Validation */
+
+label.error {
+    color: #cc5965;
+    display: inline-block;
+    margin-left: 5px;
+}
+
+.form-control.error {
+    border: 1px dotted #cc5965;
+}
+
+
+/* ngGrid */
+
+.gridStyle {
+    border: 1px solid #d4d4d4;
+    width: 100%;
+    height: 400px;
+}
+
+.gridStyle2 {
+    border: 1px solid #d4d4d4;
+    width: 500px;
+    height: 300px;
+}
+
+.ngH eaderCell {
+    border-right: none;
+    border-bottom: 1px solid #e7eaec;
+}
+
+.ngCell {
+    border-right: none;
+}
+
+.ngTopPanel {
+    background: #F5F5F6;
+}
+
+.ngRow.even {
+    background: #f9f9f9;
+}
+
+.ngRow.selected {
+    background: #EBF2F1;
+}
+
+.ngRow {
+    border-bottom: 1px solid #e7eaec;
+}
+
+.ngCell {
+    background-color: transparent;
+}
+
+.ngHeaderCell {
+    border-right: none;
+}
+
+
+/* Toastr custom style */
+
+#toast-container > .toast {
+    background-image: none !important;
+}
+
+#toast-container > .toast:before {
+    position: fixed;
+    font-family: FontAwesome;
+    font-size: 24px;
+    line-height: 24px;
+    float: left;
+    color: #FFF;
+    padding-right: 0.5em;
+    margin: auto 0.5em auto -1.5em;
+}
+
+#toast-container > div {
+    box-shadow: 0 0 3px #999;
+    opacity: .9;
+    -ms-filter: alpha(opacity=90);
+    filter: alpha(opacity=90);
+}
+
+#toast-container >:hover {
+    box-shadow: 0 0 4px #999;
+    opacity: 1;
+    -ms-filter: alpha(opacity=100);
+    filter: alpha(opacity=100);
+    cursor: pointer;
+}
+
+.toast {
+    background-color: #1ab394;
+}
+
+.toast-success {
+    background-color: #1ab394;
+}
+
+.toast-error {
+    background-color: #ed5565;
+}
+
+.toast-info {
+    background-color: #23c6c8;
+}
+
+.toast-warning {
+    background-color: #f8ac59;
+}
+
+.toast-top-full-width {
+    margin-top: 20px;
+}
+
+.toast-bottom-full-width {
+    margin-bottom: 20px;
+}
+
+
+/* Image cropper style */
+
+.img-container,
+.img-preview {
+    overflow: hidden;
+    text-align: center;
+    width: 100%;
+}
+
+.img-preview-sm {
+    height: 130px;
+    width: 200px;
+}
+
+
+/* Forum styles  */
+
+.forum-post-container .media {
+    margin: 10px 10px 10px 10px;
+    padding: 20px 10px 20px 10px;
+    border-bottom: 1px solid #f1f1f1;
+}
+
+.forum-avatar {
+    float: left;
+    margin-right: 20px;
+    text-align: center;
+    width: 110px;
+}
+
+.forum-avatar .img-circle {
+    height: 48px;
+    width: 48px;
+}
+
+.author-info {
+    color: #676a6c;
+    font-size: 11px;
+    margin-top: 5px;
+    text-align: center;
+}
+
+.forum-post-info {
+    padding: 9px 12px 6px 12px;
+    background: #f9f9f9;
+    border: 1px solid #f1f1f1;
+}
+
+.media-body > .media {
+    background: #f9f9f9;
+    border-radius: 3px;
+    border: 1px solid #f1f1f1;
+}
+
+.forum-post-container .media-body .photos {
+    margin: 10px 0;
+}
+
+.forum-photo {
+    max-width: 140px;
+    border-radius: 3px;
+}
+
+.media-body > .media .forum-avatar {
+    width: 70px;
+    margin-right: 10px;
+}
+
+.media-body > .media .forum-avatar .img-circle {
+    height: 38px;
+    width: 38px;
+}
+
+.mid-icon {
+    font-size: 66px;
+}
+
+.forum-item {
+    margin: 10px 0;
+    padding: 10px 0 20px;
+    border-bottom: 1px solid #f1f1f1;
+}
+
+.views-number {
+    font-size: 24px;
+    line-height: 18px;
+    font-weight: 400;
+}
+
+.forum-container,
+.forum-post-container {
+    padding: 30px !important;
+}
+
+.forum-item small {
+    color: #999;
+}
+
+.forum-item .forum-sub-title {
+    color: #999;
+    margin-left: 50px;
+}
+
+.forum-title {
+    margin: 15px 0 15px 0;
+}
+
+.forum-info {
+    text-align: center;
+}
+
+.forum-desc {
+    color: #999;
+}
+
+.forum-icon {
+    float: left;
+    width: 30px;
+    margin-right: 20px;
+    text-align: center;
+}
+
+a.forum-item-title {
+    color: inherit;
+    display: block;
+    font-size: 18px;
+    font-weight: 600;
+}
+
+a.forum-item-title:hover {
+    color: inherit;
+}
+
+.forum-icon .fa {
+    font-size: 30px;
+    margin-top: 8px;
+    color: #9b9b9b;
+}
+
+.forum-item.active .fa {
+    color: #1ab394;
+}
+
+.forum-item.active a.forum-item-title {
+    color: #1ab394;
+}
+
+@media (max-width: 992px) {
+    .forum-info {
+        margin: 15px 0 10px 0px;
+        /* Comment this is you want to show forum info in small devices */
+        display: none;
+    }
+    .forum-desc {
+        float: none !important;
+    }
+}
+
+
+/* New Timeline style */
+
+.vertical-container {
+    /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */
+    width: 90%;
+    max-width: 1170px;
+    margin: 0 auto;
+}
+
+.vertical-container::after {
+    /* clearfix */
+    content: '';
+    display: table;
+    clear: both;
+}
+
+#vertical-timeline {
+    position: relative;
+    padding: 0;
+    margin-top: 2em;
+    margin-bottom: 2em;
+}
+
+#vertical-timeline::before {
+    content: '';
+    position: absolute;
+    top: 0;
+    left: 18px;
+    height: 100%;
+    width: 4px;
+    background: #f1f1f1;
+}
+
+.vertical-timeline-content .btn {
+    float: right;
+}
+
+#vertical-timeline.light-timeline:before {
+    background: #e7eaec;
+}
+
+.dark-timeline .vertical-timeline-content:before {
+    border-color: transparent #f5f5f5 transparent transparent;
+}
+
+.dark-timeline.center-orientation .vertical-timeline-content:before {
+    border-color: transparent transparent transparent #f5f5f5;
+}
+
+.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before,
+.dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before {
+    border-color: transparent #f5f5f5 transparent transparent;
+}
+
+.dark-timeline .vertical-timeline-content,
+.dark-timeline.center-orientation .vertical-timeline-content {
+    background: #f5f5f5;
+}
+
+@media only screen and (min-width: 1170px) {
+    #vertical-timeline.center-orientation {
+        margin-top: 3em;
+        margin-bottom: 3em;
+    }
+    #vertical-timeline.center-orientation:before {
+        left: 50%;
+        margin-left: -2px;
+    }
+}
+
+@media only screen and (max-width: 1170px) {
+    .center-orientation.dark-timeline .vertical-timeline-content:before {
+        border-color: transparent #f5f5f5 transparent transparent;
+    }
+}
+
+.vertical-timeline-block {
+    position: relative;
+    margin: 2em 0;
+}
+
+.vertical-timeline-block:after {
+    content: "";
+    display: table;
+    clear: both;
+}
+
+.vertical-timeline-block:first-child {
+    margin-top: 0;
+}
+
+.vertical-timeline-block:last-child {
+    margin-bottom: 0;
+}
+
+@media only screen and (min-width: 1170px) {
+    .center-orientation .vertical-timeline-block {
+        margin: 4em 0;
+    }
+    .center-orientation .vertical-timeline-block:first-child {
+        margin-top: 0;
+    }
+    .center-orientation .vertical-timeline-block:last-child {
+        margin-bottom: 0;
+    }
+}
+
+.vertical-timeline-icon {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 40px;
+    height: 40px;
+    border-radius: 50%;
+    font-size: 16px;
+    border: 3px solid #f1f1f1;
+    text-align: center;
+}
+
+.vertical-timeline-icon i {
+    display: block;
+    width: 24px;
+    height: 24px;
+    position: relative;
+    left: 50%;
+    top: 50%;
+    margin-left: -12px;
+    margin-top: -9px;
+}
+
+@media only screen and (min-width: 1170px) {
+    .center-orientation .vertical-timeline-icon {
+        width: 50px;
+        height: 50px;
+        left: 50%;
+        margin-left: -25px;
+        -webkit-transform: translateZ(0);
+        -webkit-backface-visibility: hidden;
+        font-size: 19px;
+    }
+    .center-orientation .vertical-timeline-icon i {
+        margin-left: -12px;
+        margin-top: -10px;
+    }
+    .center-orientation .cssanimations .vertical-timeline-icon.is-hidden {
+        visibility: hidden;
+    }
+}
+
+.vertical-timeline-content {
+    position: relative;
+    margin-left: 60px;
+    background: white;
+    border-radius: 0.25em;
+    padding: 1em;
+}
+
+.vertical-timeline-content:after {
+    content: "";
+    display: table;
+    clear: both;
+}
+
+.vertical-timeline-content h2 {
+    font-weight: 400;
+    margin-top: 4px;
+}
+
+.vertical-timeline-content p {
+    margin: 1em 0;
+    line-height: 1.6;
+}
+
+.vertical-timeline-content .vertical-date {
+    float: left;
+    font-weight: 500;
+}
+
+.vertical-date small {
+    color: #1ab394;
+    font-weight: 400;
+}
+
+.vertical-timeline-content::before {
+    content: '';
+    position: absolute;
+    top: 16px;
+    right: 100%;
+    height: 0;
+    width: 0;
+    border: 7px solid transparent;
+    border-right: 7px solid white;
+}
+
+@media only screen and (min-width: 768px) {
+    .vertical-timeline-content h2 {
+        font-size: 18px;
+    }
+    .vertical-timeline-content p {
+        font-size: 13px;
+    }
+}
+
+@media only screen and (min-width: 1170px) {
+    .center-orientation .vertical-timeline-content {
+        margin-left: 0;
+        padding: 1.6em;
+        width: 45%;
+    }
+    .center-orientation .vertical-timeline-content::before {
+        top: 24px;
+        left: 100%;
+        border-color: transparent;
+        border-left-color: white;
+    }
+    .center-orientation .vertical-timeline-content .btn {
+        float: left;
+    }
+    .center-orientation .vertical-timeline-content .vertical-date {
+        position: absolute;
+        width: 100%;
+        left: 122%;
+        top: 2px;
+        font-size: 14px;
+    }
+    .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content {
+        float: right;
+    }
+    .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before {
+        top: 24px;
+        left: auto;
+        right: 100%;
+        border-color: transparent;
+        border-right-color: white;
+    }
+    .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn {
+        float: right;
+    }
+    .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date {
+        left: auto;
+        right: 122%;
+        text-align: right;
+    }
+    .center-orientation .cssanimations .vertical-timeline-content.is-hidden {
+        visibility: hidden;
+    }
+}
+
+.sidebard-panel {
+    width: 220px;
+    background: #ebebed;
+    padding: 10px 20px;
+    position: absolute;
+    right: 0;
+}
+
+.sidebard-panel .feed-element img.img-circle {
+    width: 32px;
+    height: 32px;
+}
+
+.sidebard-panel .feed-element,
+.media-body,
+.sidebard-panel p {
+    font-size: 12px;
+}
+
+.sidebard-panel .feed-element {
+    margin-top: 20px;
+    padding-bottom: 0;
+}
+
+.sidebard-panel .list-group {
+    margin-bottom: 10px;
+}
+
+.sidebard-panel .list-group .list-group-item {
+    padding: 5px 0;
+    font-size: 12px;
+    border: 0;
+}
+
+.sidebar-content .wrapper,
+.wrapper.sidebar-content {
+    padding-right: 240px !important;
+}
+
+#right-sidebar {
+    background-color: #fff;
+    border-left: 1px solid #e7eaec;
+    border-top: 1px solid #e7eaec;
+    overflow: hidden;
+    position: fixed;
+    top: 60px;
+    width: 260px !important;
+    z-index: 1009;
+    bottom: 0;
+    right: -260px;
+}
+
+#right-sidebar.sidebar-open {
+    right: 0;
+}
+
+#right-sidebar.sidebar-open.sidebar-top {
+    top: 0;
+    border-top: none;
+}
+
+.sidebar-container ul.nav-tabs {
+    border: none;
+}
+
+.sidebar-container ul.nav-tabs.navs-4 li {
+    width: 25%;
+}
+
+.sidebar-container ul.nav-tabs.navs-3 li {
+    width: 33.3333%;
+}
+
+.sidebar-container ul.nav-tabs.navs-2 li {
+    width: 50%;
+}
+
+.sidebar-container ul.nav-tabs li {
+    border: none;
+}
+
+.sidebar-container ul.nav-tabs li a {
+    border: none;
+    padding: 12px 10px;
+    margin: 0;
+    border-radius: 0;
+    background: #2f4050;
+    color: #fff;
+    text-align: center;
+    border-right: 1px solid #334556;
+}
+
+.sidebar-container ul.nav-tabs li.active a {
+    border: none;
+    background: #f9f9f9;
+    color: #676a6c;
+    font-weight: bold;
+}
+
+.sidebar-container .nav-tabs > li.active > a:hover,
+.sidebar-container .nav-tabs > li.active > a:focus {
+    border: none;
+}
+
+.sidebar-container ul.sidebar-list {
+    margin: 0;
+    padding: 0;
+}
+
+.sidebar-container ul.sidebar-list li {
+    border-bottom: 1px solid #e7eaec;
+    padding: 15px 20px;
+    list-style: none;
+    font-size: 12px;
+}
+
+.sidebar-container .sidebar-message:nth-child(2n+2) {
+    background: #f9f9f9;
+}
+
+.sidebar-container ul.sidebar-list li a {
+    text-decoration: none;
+    color: inherit;
+}
+
+.sidebar-container .sidebar-content {
+    padding: 15px 20px;
+    font-size: 12px;
+}
+
+.sidebar-container .sidebar-title {
+    background: #f9f9f9;
+    padding: 20px;
+    border-bottom: 1px solid #e7eaec;
+}
+
+.sidebar-container .sidebar-title h3 {
+    margin-bottom: 3px;
+    padding-left: 2px;
+}
+
+.sidebar-container .tab-content h4 {
+    margin-bottom: 5px;
+}
+
+.sidebar-container .sidebar-message > a > .pull-left {
+    margin-right: 10px;
+}
+
+.sidebar-container .sidebar-message > a {
+    text-decoration: none;
+    color: inherit;
+}
+
+.sidebar-container .sidebar-message {
+    padding: 15px 20px;
+}
+
+.sidebar-container .sidebar-message .message-avatar {
+    height: 38px;
+    width: 38px;
+    border-radius: 50%;
+}
+
+.sidebar-container .setings-item {
+    padding: 15px 20px;
+    border-bottom: 1px solid #e7eaec;
+}
+
+body {
+    font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-size: 13px;
+    color: #676a6c;
+    overflow-x: hidden;
+}
+
+html,
+body {
+    height: 100%;
+}
+
+body.full-height-layout #wrapper,
+body.full-height-layout #page-wrapper {
+    height: 100%;
+}
+
+#page-wrapper {
+    min-height: auto;
+}
+
+body.boxed-layout {
+    background: url('patterns/shattered.png');
+}
+
+body.boxed-layout #wrapper {
+    background-color: #2f4050;
+    max-width: 1200px;
+    margin: 0 auto;
+}
+
+.top-navigation.boxed-layout #wrapper,
+.boxed-layout #wrapper.top-navigation {
+    max-width: 1300px !important;
+}
+
+.block {
+    display: block;
+}
+
+.clear {
+    display: block;
+    overflow: hidden;
+}
+
+a {
+    cursor: pointer;
+}
+
+a:hover,
+a:focus {
+    text-decoration: none;
+}
+
+.border-bottom {
+    border-bottom: 1px solid #e7eaec !important;
+}
+
+.font-bold {
+    font-weight: 600;
+}
+
+.font-noraml {
+    font-weight: 400;
+}
+
+.text-uppercase {
+    text-transform: uppercase;
+}
+
+.b-r {
+    border-right: 1px solid #e7eaec;
+}
+
+.hr-line-dashed {
+    border-top: 1px dashed #e7eaec;
+    color: #ffffff;
+    background-color: #ffffff;
+    height: 1px;
+    margin: 20px 0;
+}
+
+.hr-line-solid {
+    border-bottom: 1px solid #e7eaec;
+    background-color: rgba(0, 0, 0, 0);
+    border-style: solid !important;
+    margin-top: 15px;
+    margin-bottom: 15px;
+}
+
+video {
+    width: 100% !important;
+    height: auto !important;
+}
+
+
+/* GALLERY */
+
+.gallery > .row > div {
+    margin-bottom: 15px;
+}
+
+.fancybox img {
+    margin-bottom: 5px;
+    /* Only for demo */
+    width: 24%;
+}
+
+
+/* Summernote text editor  */
+
+.note-editor {
+    height: auto!important;
+    min-height: 100px;
+    border: solid 1px #e5e6e7;
+}
+
+
+/* MODAL */
+
+.modal-content {
+    background-clip: padding-box;
+    background-color: #FFFFFF;
+    border: 1px solid rgba(0, 0, 0, 0);
+    border-radius: 4px;
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+    outline: 0 none;
+}
+
+.modal-dialog {
+    z-index: 1200;
+}
+
+.modal-body {
+    padding: 20px 30px 30px 30px;
+}
+
+.inmodal .modal-body {
+    background: #f8fafb;
+}
+
+.inmodal .modal-header {
+    padding: 30px 15px;
+    text-align: center;
+}
+
+.animated.modal.fade .modal-dialog {
+    -webkit-transform: none;
+    -ms-transform: none;
+    transform: none;
+}
+
+.inmodal .modal-title {
+    font-size: 26px;
+}
+
+.inmodal .modal-icon {
+    font-size: 84px;
+    color: #e2e3e3;
+}
+
+.modal-footer {
+    margin-top: 0;
+}
+
+
+/* WRAPPERS */
+
+#wrapper {
+    width: 100%;
+    overflow-x: hidden;
+    background-color: #2f4050;
+}
+
+.wrapper {
+    padding: 0 20px;
+}
+
+.wrapper-content {
+    padding: 20px;
+}
+
+#page-wrapper {
+    padding: 0 15px;
+    position: inherit;
+    margin: 0 0 0 220px;
+}
+
+.title-action {
+    text-align: right;
+    padding-top: 30px;
+}
+
+.ibox-content h1,
+.ibox-content h2,
+.ibox-content h3,
+.ibox-content h4,
+.ibox-content h5,
+.ibox-title h1,
+.ibox-title h2,
+.ibox-title h3,
+.ibox-title h4,
+.ibox-title h5 {
+    margin-top: 5px;
+}
+
+ul.unstyled,
+ol.unstyled {
+    list-style: none outside none;
+    margin-left: 0;
+}
+
+.big-icon {
+    font-size: 160px;
+    color: #e5e6e7;
+}
+
+
+/* FOOTER */
+
+.footer {
+    background: none repeat scroll 0 0 white;
+    border-top: 1px solid #e7eaec;
+    overflow: hidden;
+    padding: 10px 20px;
+    margin: 0 -15px;
+    height: 36px;
+}
+
+.footer.fixed_full {
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    z-index: 1000;
+    padding: 10px 20px;
+    background: white;
+    border-top: 1px solid #e7eaec;
+}
+
+.footer.fixed {
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    z-index: 1000;
+    padding: 10px 20px;
+    background: white;
+    border-top: 1px solid #e7eaec;
+    margin-left: 220px;
+}
+
+body.mini-navbar .footer.fixed,
+body.body-small.mini-navbar .footer.fixed {
+    margin: 0 0 0 70px;
+}
+
+body.mini-navbar.canvas-menu .footer.fixed,
+body.canvas-menu .footer.fixed {
+    margin: 0 !important;
+}
+
+body.fixed-sidebar.body-small.mini-navbar .footer.fixed {
+    margin: 0 0 0 220px;
+}
+
+body.body-small .footer.fixed {
+    margin-left: 0px;
+}
+
+
+/* PANELS */
+
+.page-heading {
+    border-top: 0;
+    padding: 0px 20px 20px;
+}
+
+.panel-heading h1,
+.panel-heading h2 {
+    margin-bottom: 5px;
+}
+
+
+/*CONTENTTABS*/
+
+.content-tabs {
+    position: relative;
+    height: 42px;
+    background: #fafafa;
+    line-height: 40px;
+}
+
+.content-tabs .roll-nav,
+.page-tabs-list {
+    position: absolute;
+    width: 40px;
+    height: 40px;
+    text-align: center;
+    color: #999;
+    z-index: 2;
+    top: 0;
+}
+
+.content-tabs .roll-left {
+    left: 0;
+    border-right: solid 1px #eee;
+}
+
+.content-tabs .roll-right {
+    right: 0;
+    border-left: solid 1px #eee;
+}
+
+.content-tabs button {
+    background: #fff;
+    border: 0;
+    height: 40px;
+    width: 40px;
+    outline: none;
+}
+
+.content-tabs button:hover {
+    background: #fafafa;
+}
+
+nav.page-tabs {
+    margin-left: 40px;
+    width: 100000px;
+    height: 40px;
+    overflow: hidden;
+}
+
+nav.page-tabs .page-tabs-content {
+    float: left;
+}
+
+.page-tabs a {
+    display: block;
+    float: left;
+    border-right: solid 1px #eee;
+    padding: 0 15px;
+}
+
+.page-tabs a i:hover {
+    color: #c00;
+}
+
+.page-tabs a:hover,
+.content-tabs .roll-nav:hover {
+    color: #777;
+    background: #f2f2f2;
+    cursor: pointer;
+}
+
+.roll-right.J_tabRight {
+    right: 140px;
+}
+
+.roll-right.btn-group {
+    right: 60px;
+    width: 80px;
+    padding: 0;
+}
+
+.roll-right.btn-group button {
+    width: 80px;
+}
+
+.roll-right.J_tabExit {
+    background: #fff;
+    height: 40px;
+    width: 60px;
+    outline: none;
+}
+
+.dropdown-menu-right {
+    left: auto;
+}
+
+#content-main {
+    height: calc(100% - 140px);
+    overflow: hidden;
+}
+
+.fixed-nav #content-main {
+    height: calc(100% - 80px);
+    overflow: hidden;
+}
+
+
+/* TABLES */
+
+.table-bordered {
+    border: 1px solid #EBEBEB;
+}
+
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+    background-color: #F5F5F6;
+    border-bottom-width: 1px;
+}
+
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+    border: 1px solid #e7e7e7;
+}
+
+.table > thead > tr > th {
+    border-bottom: 1px solid #DDDDDD;
+    vertical-align: bottom;
+}
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+    border-top: 1px solid #e7eaec;
+    line-height: 1.42857;
+    padding: 8px;
+    vertical-align: middle;
+}
+
+
+/* PANELS */
+
+.panel.blank-panel {
+    background: none;
+    margin: 0;
+}
+
+.blank-panel .panel-heading {
+    padding-bottom: 0;
+}
+
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+    -moz-border-bottom-colors: none;
+    -moz-border-left-colors: none;
+    -moz-border-right-colors: none;
+    -moz-border-top-colors: none;
+    background: none;
+    border-color: #dddddd #dddddd rgba(0, 0, 0, 0);
+    border-bottom: #f3f3f4;
+    -webkit-border-image: none;
+    -o-border-image: none;
+    border-image: none;
+    border-style: solid;
+    border-width: 1px;
+    color: #555555;
+    cursor: default;
+}
+
+.nav.nav-tabs li {
+    background: none;
+    border: none;
+}
+
+.nav-tabs > li > a {
+    color: #A7B1C2;
+    font-weight: 600;
+    padding: 10px 20px 10px 25px;
+}
+
+.nav-tabs > li > a:hover,
+.nav-tabs > li > a:focus {
+    background-color: #e6e6e6;
+    color: #676a6c;
+}
+
+.ui-tab .tab-content {
+    padding: 20px 0px;
+}
+
+
+/* GLOBAL  */
+
+.no-padding {
+    padding: 0 !important;
+}
+
+.no-borders {
+    border: none !important;
+}
+
+.no-margins {
+    margin: 0 !important;
+}
+
+.no-top-border {
+    border-top: 0 !important;
+}
+
+.ibox-content.text-box {
+    padding-bottom: 0px;
+    padding-top: 15px;
+}
+
+.border-left-right {
+    border-left: 1px solid #e7eaec;
+    border-right: 1px solid #e7eaec;
+    border-top: none;
+    border-bottom: none;
+}
+
+.border-left {
+    border-left: 1px solid #e7eaec;
+    border-right: none;
+    border-top: none;
+    border-bottom: none;
+}
+
+.border-right {
+    border-left: none;
+    border-right: 1px solid #e7eaec;
+    border-top: none;
+    border-bottom: none;
+}
+
+.full-width {
+    width: 100% !important;
+}
+
+.link-block {
+    font-size: 12px;
+    padding: 10px;
+}
+
+.nav.navbar-top-links .link-block a {
+    font-size: 12px;
+}
+
+.link-block a {
+    font-size: 10px;
+    color: inherit;
+}
+
+body.mini-navbar .branding {
+    display: none;
+}
+
+img.circle-border {
+    border: 6px solid #FFFFFF;
+    border-radius: 50%;
+}
+
+.branding {
+    float: left;
+    color: #FFFFFF;
+    font-size: 18px;
+    font-weight: 600;
+    padding: 17px 20px;
+    text-align: center;
+    background-color: #1ab394;
+}
+
+.login-panel {
+    margin-top: 25%;
+}
+
+.page-header {
+    padding: 20px 0 9px;
+    margin: 0 0 20px;
+    border-bottom: 1px solid #eeeeee;
+}
+
+.fontawesome-icon-list {
+    margin-top: 22px;
+}
+
+.fontawesome-icon-list .fa-hover a {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    display: block;
+    color: #222222;
+    line-height: 32px;
+    height: 32px;
+    padding-left: 10px;
+    border-radius: 4px;
+}
+
+.fontawesome-icon-list .fa-hover a .fa {
+    width: 32px;
+    font-size: 14px;
+    display: inline-block;
+    text-align: right;
+    margin-right: 10px;
+}
+
+.fontawesome-icon-list .fa-hover a:hover {
+    background-color: #1d9d74;
+    color: #ffffff;
+    text-decoration: none;
+}
+
+.fontawesome-icon-list .fa-hover a:hover .fa {
+    font-size: 30px;
+    vertical-align: -6px;
+}
+
+.fontawesome-icon-list .fa-hover a:hover .text-muted {
+    color: #bbe2d5;
+}
+
+.feature-list .col-md-4 {
+    margin-bottom: 22px;
+}
+
+.feature-list h4 .fa:before {
+    vertical-align: -10%;
+    font-size: 28px;
+    display: inline-block;
+    width: 1.07142857em;
+    text-align: center;
+    margin-right: 5px;
+}
+
+.ui-draggable .ibox-title {
+    cursor: move;
+}
+
+.breadcrumb {
+    background-color: #ffffff;
+    padding: 0;
+    margin-bottom: 0;
+}
+
+.breadcrumb > li a {
+    color: inherit;
+}
+
+.breadcrumb > .active {
+    color: inherit;
+}
+
+code {
+    background-color: #F9F2F4;
+    border-radius: 4px;
+    color: #ca4440;
+    font-size: 90%;
+    padding: 2px 4px;
+    white-space: nowrap;
+}
+
+.ibox {
+    clear: both;
+    margin-bottom: 25px;
+    margin-top: 0;
+    padding: 0;
+}
+
+.ibox.collapsed .ibox-content {
+    display: none;
+}
+
+.ibox.collapsed .fa.fa-chevron-up:before {
+    content: "\f078";
+}
+
+.ibox.collapsed .fa.fa-chevron-down:before {
+    content: "\f077";
+}
+
+.ibox:after,
+.ibox:before {
+    display: table;
+}
+
+.ibox-title {
+    -moz-border-bottom-colors: none;
+    -moz-border-left-colors: none;
+    -moz-border-right-colors: none;
+    -moz-border-top-colors: none;
+    background-color: #ffffff;
+    border-color: #e7eaec;
+    -webkit-border-image: none;
+    -o-border-image: none;
+    border-image: none;
+    border-style: solid solid none;
+    border-width: 4px 0px 0;
+    color: inherit;
+    margin-bottom: 0;
+    padding: 14px 15px 7px;
+    min-height: 48px;
+}
+
+.ibox-content {
+    background-color: #ffffff;
+    color: inherit;
+    padding: 15px 20px 20px 20px;
+    border-color: #e7eaec;
+    -webkit-border-image: none;
+    -o-border-image: none;
+    border-image: none;
+    border-style: solid solid none;
+    border-width: 1px 0px;
+}
+
+table.table-mail tr td {
+    padding: 12px;
+}
+
+.table-mail .check-mail {
+    padding-left: 20px;
+}
+
+.table-mail .mail-date {
+    padding-right: 20px;
+}
+
+.star-mail,
+.check-mail {
+    width: 40px;
+}
+
+.unread td a,
+.unread td {
+    font-weight: 600;
+    color: inherit;
+}
+
+.read td a,
+.read td {
+    font-weight: normal;
+    color: inherit;
+}
+
+.unread td {
+    background-color: #f9f8f8;
+}
+
+.ibox-content {
+    clear: both;
+}
+
+.ibox-heading {
+    background-color: #f3f6fb;
+    border-bottom: none;
+}
+
+.ibox-heading h3 {
+    font-weight: 200;
+    font-size: 24px;
+}
+
+.ibox-title h5 {
+    display: inline-block;
+    font-size: 14px;
+    margin: 0 0 7px;
+    padding: 0;
+    text-overflow: ellipsis;
+    float: left;
+}
+
+.ibox-title .label {
+    float: left;
+    margin-left: 4px;
+}
+
+.ibox-tools {
+    display: inline-block;
+    float: right;
+    margin-top: 0;
+    position: relative;
+    padding: 0;
+}
+
+.ibox-tools a {
+    cursor: pointer;
+    margin-left: 5px;
+    color: #c4c4c4;
+}
+
+.ibox-tools a.btn-primary {
+    color: #fff;
+}
+
+.ibox-tools .dropdown-menu > li > a {
+    padding: 4px 10px;
+    font-size: 12px;
+}
+
+.ibox .open > .dropdown-menu {
+    left: auto;
+    right: 0;
+}
+
+
+/* BACKGROUNDS */
+
+.gray-bg {
+    background-color: #f3f3f4;
+}
+
+.white-bg {
+    background-color: #ffffff;
+}
+
+.navy-bg {
+    background-color: #1ab394;
+    color: #ffffff;
+}
+
+.blue-bg {
+    background-color: #1c84c6;
+    color: #ffffff;
+}
+
+.lazur-bg {
+    background-color: #23c6c8;
+    color: #ffffff;
+}
+
+.yellow-bg {
+    background-color: #f8ac59;
+    color: #ffffff;
+}
+
+.red-bg {
+    background-color: #ed5565;
+    color: #ffffff;
+}
+
+.black-bg {
+    background-color: #262626;
+}
+
+.panel-primary {
+    border-color: #1ab394;
+}
+
+.panel-primary > .panel-heading {
+    background-color: #1ab394;
+    border-color: #1ab394;
+}
+
+.panel-success {
+    border-color: #1c84c6;
+}
+
+.panel-success > .panel-heading {
+    background-color: #1c84c6;
+    border-color: #1c84c6;
+    color: #ffffff;
+}
+
+.panel-info {
+    border-color: #23c6c8;
+}
+
+.panel-info > .panel-heading {
+    background-color: #23c6c8;
+    border-color: #23c6c8;
+    color: #ffffff;
+}
+
+.panel-warning {
+    border-color: #f8ac59;
+}
+
+.panel-warning > .panel-heading {
+    background-color: #f8ac59;
+    border-color: #f8ac59;
+    color: #ffffff;
+}
+
+.panel-danger {
+    border-color: #ed5565;
+}
+
+.panel-danger > .panel-heading {
+    background-color: #ed5565;
+    border-color: #ed5565;
+    color: #ffffff;
+}
+
+.progress-bar {
+    background-color: #1ab394;
+}
+
+.progress-small,
+.progress-small .progress-bar {
+    height: 10px;
+}
+
+.progress-small,
+.progress-mini {
+    margin-top: 5px;
+}
+
+.progress-mini,
+.progress-mini .progress-bar {
+    height: 5px;
+    margin-bottom: 0px;
+}
+
+.progress-bar-navy-light {
+    background-color: #3dc7ab;
+}
+
+.progress-bar-success {
+    background-color: #1c84c6;
+}
+
+.progress-bar-info {
+    background-color: #23c6c8;
+}
+
+.progress-bar-warning {
+    background-color: #f8ac59;
+}
+
+.progress-bar-danger {
+    background-color: #ed5565;
+}
+
+.panel-title {
+    font-size: inherit;
+}
+
+.jumbotron {
+    border-radius: 6px;
+    padding: 40px;
+}
+
+.jumbotron h1 {
+    margin-top: 0;
+}
+
+
+/* COLORS */
+
+.text-navy {
+    color: #1ab394;
+}
+
+.text-primary {
+    color: inherit;
+}
+
+.text-success {
+    color: #1c84c6;
+}
+
+.text-info {
+    color: #23c6c8;
+}
+
+.text-warning {
+    color: #f8ac59;
+}
+
+.text-danger {
+    color: #ed5565;
+}
+
+.text-muted {
+    color: #888888;
+}
+
+.simple_tag {
+    background-color: #f3f3f4;
+    border: 1px solid #e7eaec;
+    border-radius: 2px;
+    color: inherit;
+    font-size: 10px;
+    margin-right: 5px;
+    margin-top: 5px;
+    padding: 5px 12px;
+    display: inline-block;
+}
+
+.img-shadow {
+    box-shadow: 0px 0px 3px 0px #919191;
+}
+
+
+/* For handle diferent bg color in AngularJS version */
+
+.dashboards\.dashboard_2 nav.navbar,
+.dashboards\.dashboard_3 nav.navbar,
+.mailbox\.inbox nav.navbar,
+.mailbox\.email_view nav.navbar,
+.mailbox\.email_compose nav.navbar,
+.dashboards\.dashboard_4_1 nav.navbar {
+    background: #fff;
+}
+
+
+/* For handle diferent bg color in MVC version */
+
+.Dashboard_2 .navbar.navbar-static-top,
+.Dashboard_3 .navbar.navbar-static-top,
+.Dashboard_4_1 .navbar.navbar-static-top,
+.ComposeEmail .navbar.navbar-static-top,
+.EmailView .navbar.navbar-static-top,
+.Inbox .navbar.navbar-static-top {
+    background: #fff;
+}
+
+a.close-canvas-menu {
+    position: absolute;
+    top: 10px;
+    right: 15px;
+    z-index: 1011;
+    color: #a7b1c2;
+}
+
+a.close-canvas-menu:hover {
+    color: #fff;
+}
+
+
+/* FULL HEIGHT */
+
+.full-height {
+    height: 100%;
+}
+
+.fh-breadcrumb {
+    height: calc(100% - 196px);
+    margin: 0 -15px;
+    position: relative;
+}
+
+.fh-no-breadcrumb {
+    height: calc(100% - 99px);
+    margin: 0 -15px;
+    position: relative;
+}
+
+.fh-column {
+    background: #fff;
+    height: 100%;
+    width: 240px;
+    float: left;
+}
+
+.modal-backdrop {
+    z-index: 2040 !important;
+}
+
+.modal {
+    z-index: 2050 !important;
+}
+
+.spiner-example {
+    height: 200px;
+    padding-top: 70px;
+}
+
+
+/* MARGINS & PADDINGS */
+
+.p-xxs {
+    padding: 5px;
+}
+
+.p-xs {
+    padding: 10px;
+}
+
+.p-sm {
+    padding: 15px;
+}
+
+.p-m {
+    padding: 20px;
+}
+
+.p-md {
+    padding: 25px;
+}
+
+.p-lg {
+    padding: 30px;
+}
+
+.p-xl {
+    padding: 40px;
+}
+
+.m-xxs {
+    margin: 2px 4px;
+}
+
+.m-xs {
+    margin: 5px;
+}
+
+.m-sm {
+    margin: 10px;
+}
+
+.m {
+    margin: 15px;
+}
+
+.m-md {
+    margin: 20px;
+}
+
+.m-lg {
+    margin: 30px;
+}
+
+.m-xl {
+    margin: 50px;
+}
+
+.m-n {
+    margin: 0 !important;
+}
+
+.m-l-none {
+    margin-left: 0;
+}
+
+.m-l-xs {
+    margin-left: 5px;
+}
+
+.m-l-sm {
+    margin-left: 10px;
+}
+
+.m-l {
+    margin-left: 15px;
+}
+
+.m-l-md {
+    margin-left: 20px;
+}
+
+.m-l-lg {
+    margin-left: 30px;
+}
+
+.m-l-xl {
+    margin-left: 40px;
+}
+
+.m-l-n-xxs {
+    margin-left: -1px;
+}
+
+.m-l-n-xs {
+    margin-left: -5px;
+}
+
+.m-l-n-sm {
+    margin-left: -10px;
+}
+
+.m-l-n {
+    margin-left: -15px;
+}
+
+.m-l-n-md {
+    margin-left: -20px;
+}
+
+.m-l-n-lg {
+    margin-left: -30px;
+}
+
+.m-l-n-xl {
+    margin-left: -40px;
+}
+
+.m-t-none {
+    margin-top: 0;
+}
+
+.m-t-xxs {
+    margin-top: 1px;
+}
+
+.m-t-xs {
+    margin-top: 5px;
+}
+
+.m-t-sm {
+    margin-top: 10px;
+}
+
+.m-t {
+    margin-top: 15px;
+}
+
+.m-t-md {
+    margin-top: 20px;
+}
+
+.m-t-lg {
+    margin-top: 30px;
+}
+
+.m-t-xl {
+    margin-top: 40px;
+}
+
+.m-t-n-xxs {
+    margin-top: -1px;
+}
+
+.m-t-n-xs {
+    margin-top: -5px;
+}
+
+.m-t-n-sm {
+    margin-top: -10px;
+}
+
+.m-t-n {
+    margin-top: -15px;
+}
+
+.m-t-n-md {
+    margin-top: -20px;
+}
+
+.m-t-n-lg {
+    margin-top: -30px;
+}
+
+.m-t-n-xl {
+    margin-top: -40px;
+}
+
+.m-r-none {
+    margin-right: 0;
+}
+
+.m-r-xxs {
+    margin-right: 1px;
+}
+
+.m-r-xs {
+    margin-right: 5px;
+}
+
+.m-r-sm {
+    margin-right: 10px;
+}
+
+.m-r {
+    margin-right: 15px;
+}
+
+.m-r-md {
+    margin-right: 20px;
+}
+
+.m-r-lg {
+    margin-right: 30px;
+}
+
+.m-r-xl {
+    margin-right: 40px;
+}
+
+.m-r-n-xxs {
+    margin-right: -1px;
+}
+
+.m-r-n-xs {
+    margin-right: -5px;
+}
+
+.m-r-n-sm {
+    margin-right: -10px;
+}
+
+.m-r-n {
+    margin-right: -15px;
+}
+
+.m-r-n-md {
+    margin-right: -20px;
+}
+
+.m-r-n-lg {
+    margin-right: -30px;
+}
+
+.m-r-n-xl {
+    margin-right: -40px;
+}
+
+.m-b-none {
+    margin-bottom: 0;
+}
+
+.m-b-xxs {
+    margin-bottom: 1px;
+}
+
+.m-b-xs {
+    margin-bottom: 5px;
+}
+
+.m-b-sm {
+    margin-bottom: 10px;
+}
+
+.m-b {
+    margin-bottom: 15px;
+}
+
+.m-b-md {
+    margin-bottom: 20px;
+}
+
+.m-b-lg {
+    margin-bottom: 30px;
+}
+
+.m-b-xl {
+    margin-bottom: 40px;
+}
+
+.m-b-n-xxs {
+    margin-bottom: -1px;
+}
+
+.m-b-n-xs {
+    margin-bottom: -5px;
+}
+
+.m-b-n-sm {
+    margin-bottom: -10px;
+}
+
+.m-b-n {
+    margin-bottom: -15px;
+}
+
+.m-b-n-md {
+    margin-bottom: -20px;
+}
+
+.m-b-n-lg {
+    margin-bottom: -30px;
+}
+
+.m-b-n-xl {
+    margin-bottom: -40px;
+}
+
+.space-15 {
+    margin: 15px 0;
+}
+
+.space-20 {
+    margin: 20px 0;
+}
+
+.space-25 {
+    margin: 25px 0;
+}
+
+.space-30 {
+    margin: 30px 0;
+}
+
+body.modal-open {
+    padding-right: inherit !important;
+}
+
+
+/* SEARCH PAGE */
+
+.search-form {
+    margin-top: 10px;
+}
+
+.search-result h3 {
+    margin-bottom: 0;
+    color: #1E0FBE;
+}
+
+.search-result .search-link {
+    color: #006621;
+}
+
+.search-result p {
+    font-size: 12px;
+    margin-top: 5px;
+}
+
+
+/* CONTACTS */
+
+.contact-box {
+    background-color: #ffffff;
+    border: 1px solid #e7eaec;
+    padding: 20px;
+    margin-bottom: 20px;
+}
+
+.contact-box a {
+    color: inherit;
+}
+
+
+/* INVOICE */
+
+.invoice-table tbody > tr > td:last-child,
+.invoice-table tbody > tr > td:nth-child(4),
+.invoice-table tbody > tr > td:nth-child(3),
+.invoice-table tbody > tr > td:nth-child(2) {
+    text-align: right;
+}
+
+.invoice-table thead > tr > th:last-child,
+.invoice-table thead > tr > th:nth-child(4),
+.invoice-table thead > tr > th:nth-child(3),
+.invoice-table thead > tr > th:nth-child(2) {
+    text-align: right;
+}
+
+.invoice-total > tbody > tr > td:first-child {
+    text-align: right;
+}
+
+.invoice-total > tbody > tr > td {
+    border: 0 none;
+}
+
+.invoice-total > tbody > tr > td:last-child {
+    border-bottom: 1px solid #DDDDDD;
+    text-align: right;
+    width: 15%;
+}
+
+
+/* ERROR & LOGIN & LOCKSCREEN*/
+
+.middle-box {
+    max-width: 400px;
+    z-index: 100;
+    margin: 0 auto;
+    padding-top: 40px;
+}
+
+.lockscreen.middle-box {
+    width: 200px;
+    padding-top: 110px;
+}
+
+.loginscreen.middle-box {
+    width: 300px;
+}
+
+.loginColumns {
+    max-width: 800px;
+    margin: 0 auto;
+    padding: 100px 20px 20px 20px;
+}
+
+.passwordBox {
+    max-width: 460px;
+    margin: 0 auto;
+    padding: 100px 20px 20px 20px;
+}
+
+.logo-name {
+    color: #e6e6e6;
+    font-size: 180px;
+    font-weight: 800;
+    letter-spacing: -10px;
+    margin-bottom: 0px;
+}
+
+.middle-box h1 {
+    font-size: 170px;
+}
+
+.wrapper .middle-box {
+    margin-top: 140px;
+}
+
+.lock-word {
+    z-index: 10;
+    position: absolute;
+    top: 110px;
+    left: 50%;
+    margin-left: -470px;
+}
+
+.lock-word span {
+    font-size: 100px;
+    font-weight: 600;
+    color: #e9e9e9;
+    display: inline-block;
+}
+
+.lock-word .first-word {
+    margin-right: 160px;
+}
+
+
+/* DASBOARD */
+
+.dashboard-header {
+    border-top: 0;
+    padding: 20px 20px 20px 20px;
+}
+
+.dashboard-header h2 {
+    margin-top: 10px;
+    font-size: 26px;
+}
+
+.fist-item {
+    border-top: none !important;
+}
+
+.statistic-box {
+    margin-top: 40px;
+}
+
+.dashboard-header .list-group-item span.label {
+    margin-right: 10px;
+}
+
+.list-group.clear-list .list-group-item {
+    border-top: 1px solid #e7eaec;
+    border-bottom: 0;
+    border-right: 0;
+    border-left: 0;
+    padding: 10px 0;
+}
+
+ul.clear-list:first-child {
+    border-top: none !important;
+}
+
+
+/* Intimeline */
+
+.timeline-item .date i {
+    position: absolute;
+    top: 0;
+    right: 0;
+    padding: 5px;
+    width: 30px;
+    text-align: center;
+    border-top: 1px solid #e7eaec;
+    border-bottom: 1px solid #e7eaec;
+    border-left: 1px solid #e7eaec;
+    background: #f8f8f8;
+}
+
+.timeline-item .date {
+    text-align: right;
+    width: 110px;
+    position: relative;
+    padding-top: 30px;
+}
+
+.timeline-item .content {
+    border-left: 1px solid #e7eaec;
+    border-top: 1px solid #e7eaec;
+    padding-top: 10px;
+    min-height: 100px;
+}
+
+.timeline-item .content:hover {
+    background: #f6f6f6;
+}
+
+
+/* PIN BOARD */
+
+ul.notes li,
+ul.tag-list li {
+    list-style: none;
+}
+
+ul.notes li h4 {
+    margin-top: 20px;
+    font-size: 16px;
+}
+
+ul.notes li div {
+    text-decoration: none;
+    color: #000;
+    background: #ffc;
+    display: block;
+    height: 140px;
+    width: 140px;
+    padding: 1em;
+    position: relative;
+}
+
+ul.notes li div small {
+    position: absolute;
+    top: 5px;
+    right: 5px;
+    font-size: 10px;
+}
+
+ul.notes li div a {
+    position: absolute;
+    right: 10px;
+    bottom: 10px;
+    color: inherit;
+}
+
+ul.notes li {
+    margin: 10px 40px 50px 0px;
+    float: left;
+}
+
+ul.notes li div p {
+    font-size: 12px;
+}
+
+ul.notes li div {
+    text-decoration: none;
+    color: #000;
+    background: #ffc;
+    display: block;
+    height: 140px;
+    width: 140px;
+    padding: 1em;
+    /* Firefox */
+    /* Safari+Chrome */
+    /* Opera */
+    box-shadow: 5px 5px 2px rgba(33, 33, 33, 0.7);
+}
+
+ul.notes li div {
+    -webkit-transform: rotate(-6deg);
+    -o-transform: rotate(-6deg);
+    -moz-transform: rotate(-6deg);
+}
+
+ul.notes li:nth-child(even) div {
+    -o-transform: rotate(4deg);
+    -webkit-transform: rotate(4deg);
+    -moz-transform: rotate(4deg);
+    position: relative;
+    top: 5px;
+}
+
+ul.notes li:nth-child(3n) div {
+    -o-transform: rotate(-3deg);
+    -webkit-transform: rotate(-3deg);
+    -moz-transform: rotate(-3deg);
+    position: relative;
+    top: -5px;
+}
+
+ul.notes li:nth-child(5n) div {
+    -o-transform: rotate(5deg);
+    -webkit-transform: rotate(5deg);
+    -moz-transform: rotate(5deg);
+    position: relative;
+    top: -10px;
+}
+
+ul.notes li div:hover,
+ul.notes li div:focus {
+    -webkit-transform: scale(1.1);
+    -moz-transform: scale(1.1);
+    -o-transform: scale(1.1);
+    position: relative;
+    z-index: 5;
+}
+
+ul.notes li div {
+    text-decoration: none;
+    color: #000;
+    background: #ffc;
+    display: block;
+    height: 210px;
+    width: 210px;
+    padding: 1em;
+    box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7);
+    -webkit-transition: -webkit-transform 0.15s linear;
+}
+
+
+/* FILE MANAGER */
+
+.file-box {
+    float: left;
+    width: 220px;
+}
+
+.file-manager h5 {
+    text-transform: uppercase;
+}
+
+.file-manager {
+    list-style: none outside none;
+    margin: 0;
+    padding: 0;
+}
+
+.folder-list li a {
+    color: #666666;
+    display: block;
+    padding: 5px 0;
+}
+
+.folder-list li {
+    border-bottom: 1px solid #e7eaec;
+    display: block;
+}
+
+.folder-list li i {
+    margin-right: 8px;
+    color: #3d4d5d;
+}
+
+.category-list li a {
+    color: #666666;
+    display: block;
+    padding: 5px 0;
+}
+
+.category-list li {
+    display: block;
+}
+
+.category-list li i {
+    margin-right: 8px;
+    color: #3d4d5d;
+}
+
+.category-list li a .text-navy {
+    color: #1ab394;
+}
+
+.category-list li a .text-primary {
+    color: #1c84c6;
+}
+
+.category-list li a .text-info {
+    color: #23c6c8;
+}
+
+.category-list li a .text-danger {
+    color: #EF5352;
+}
+
+.category-list li a .text-warning {
+    color: #F8AC59;
+}
+
+.file-manager h5.tag-title {
+    margin-top: 20px;
+}
+
+.tag-list li {
+    float: left;
+}
+
+.tag-list li a {
+    font-size: 10px;
+    background-color: #f3f3f4;
+    padding: 5px 12px;
+    color: inherit;
+    border-radius: 2px;
+    border: 1px solid #e7eaec;
+    margin-right: 5px;
+    margin-top: 5px;
+    display: block;
+}
+
+.file {
+    border: 1px solid #e7eaec;
+    padding: 0;
+    background-color: #ffffff;
+    position: relative;
+    margin-bottom: 20px;
+    margin-right: 20px;
+}
+
+.file-manager .hr-line-dashed {
+    margin: 15px 0;
+}
+
+.file .icon,
+.file .image {
+    height: 100px;
+    overflow: hidden;
+}
+
+.file .icon {
+    padding: 15px 10px;
+    text-align: center;
+}
+
+.file-control {
+    color: inherit;
+    font-size: 11px;
+    margin-right: 10px;
+}
+
+.file-control.active {
+    text-decoration: underline;
+}
+
+.file .icon i {
+    font-size: 70px;
+    color: #dadada;
+}
+
+.file .file-name {
+    padding: 10px;
+    background-color: #f8f8f8;
+    border-top: 1px solid #e7eaec;
+}
+
+.file-name small {
+    color: #676a6c;
+}
+
+.corner {
+    position: absolute;
+    display: inline-block;
+    width: 0;
+    height: 0;
+    line-height: 0;
+    border: 0.6em solid transparent;
+    border-right: 0.6em solid #f1f1f1;
+    border-bottom: 0.6em solid #f1f1f1;
+    right: 0em;
+    bottom: 0em;
+}
+
+a.compose-mail {
+    padding: 8px 10px;
+}
+
+.mail-search {
+    max-width: 300px;
+}
+
+
+/* PROFILE */
+
+.profile-content {
+    border-top: none !important;
+}
+
+.feed-activity-list .feed-element {
+    border-bottom: 1px solid #e7eaec;
+}
+
+.feed-element:first-child {
+    margin-top: 0;
+}
+
+.feed-element {
+    padding-bottom: 15px;
+}
+
+.feed-element,
+.feed-element .media {
+    margin-top: 15px;
+}
+
+.feed-element,
+.media-body {
+    overflow: hidden;
+}
+
+.feed-element > .pull-left {
+    margin-right: 10px;
+}
+
+.feed-element img.img-circle,
+.dropdown-messages-box img.img-circle {
+    width: 38px;
+    height: 38px;
+}
+
+.feed-element .well {
+    border: 1px solid #e7eaec;
+    box-shadow: none;
+    margin-top: 10px;
+    margin-bottom: 5px;
+    padding: 10px 20px;
+    font-size: 11px;
+    line-height: 16px;
+}
+
+.feed-element .actions {
+    margin-top: 10px;
+}
+
+.feed-element .photos {
+    margin: 10px 0;
+}
+
+.feed-photo {
+    max-height: 180px;
+    border-radius: 4px;
+    overflow: hidden;
+    margin-right: 10px;
+    margin-bottom: 10px;
+}
+
+
+/* MAILBOX */
+
+.mail-box {
+    background-color: #ffffff;
+    border: 1px solid #e7eaec;
+    border-top: 0;
+    padding: 0px;
+    margin-bottom: 20px;
+}
+
+.mail-box-header {
+    background-color: #ffffff;
+    border: 1px solid #e7eaec;
+    border-bottom: 0;
+    padding: 30px 20px 20px 20px;
+}
+
+.mail-box-header h2 {
+    margin-top: 0px;
+}
+
+.mailbox-content .tag-list li a {
+    background: #ffffff;
+}
+
+.mail-body {
+    border-top: 1px solid #e7eaec;
+    padding: 20px;
+}
+
+.mail-text {
+    border-top: 1px solid #e7eaec;
+}
+
+.mail-text .note-toolbar {
+    padding: 10px 15px;
+}
+
+.mail-body .form-group {
+    margin-bottom: 5px;
+}
+
+.mail-text .note-editor .note-toolbar {
+    background-color: #F9F8F8;
+}
+
+.mail-attachment {
+    border-top: 1px solid #e7eaec;
+    padding: 20px;
+    font-size: 12px;
+}
+
+.mailbox-content {
+    background: none;
+    border: none;
+    padding: 10px;
+}
+
+.mail-ontact {
+    width: 23%;
+}
+
+
+/* PROJECTS */
+
+.project-people,
+.project-actions {
+    text-align: right;
+    vertical-align: middle;
+}
+
+dd.project-people {
+    text-align: left;
+    margin-top: 5px;
+}
+
+.project-people img {
+    width: 32px;
+    height: 32px;
+}
+
+.project-title a {
+    font-size: 14px;
+    color: #676a6c;
+    font-weight: 600;
+}
+
+.project-list table tr td {
+    border-top: none;
+    border-bottom: 1px solid #e7eaec;
+    padding: 15px 10px;
+    vertical-align: middle;
+}
+
+.project-manager .tag-list li a {
+    font-size: 10px;
+    background-color: white;
+    padding: 5px 12px;
+    color: inherit;
+    border-radius: 2px;
+    border: 1px solid #e7eaec;
+    margin-right: 5px;
+    margin-top: 5px;
+    display: block;
+}
+
+.project-files li a {
+    font-size: 11px;
+    color: #676a6c;
+    margin-left: 10px;
+    line-height: 22px;
+}
+
+
+/* FAQ */
+
+.faq-item {
+    padding: 20px;
+    margin-bottom: 2px;
+    background: #fff;
+}
+
+.faq-question {
+    font-size: 18px;
+    font-weight: 600;
+    color: #1ab394;
+    display: block;
+}
+
+.faq-question:hover {
+    color: #179d82;
+}
+
+.faq-answer {
+    margin-top: 10px;
+    background: #f3f3f4;
+    border: 1px solid #e7eaec;
+    border-radius: 3px;
+    padding: 15px;
+}
+
+.faq-item .tag-item {
+    background: #f3f3f4;
+    padding: 2px 6px;
+    font-size: 10px;
+    text-transform: uppercase;
+}
+
+
+/* Chat view */
+
+.message-input {
+    height: 90px !important;
+}
+
+.chat-avatar {
+    white: 36px;
+    height: 36px;
+    float: left;
+    margin-right: 10px;
+}
+
+.chat-user-name {
+    padding: 10px;
+}
+
+.chat-user {
+    padding: 8px 10px;
+    border-bottom: 1px solid #e7eaec;
+}
+
+.chat-user a {
+    color: inherit;
+}
+
+.chat-view {
+    z-index: 20012;
+}
+
+.chat-users,
+.chat-statistic {
+    margin-left: -30px;
+}
+
+@media (max-width: 992px) {
+    .chat-users,
+    .chat-statistic {
+        margin-left: 0px;
+    }
+}
+
+.chat-view .ibox-content {
+    padding: 0;
+}
+
+.chat-message {
+    padding: 10px 20px;
+}
+
+.message-avatar {
+    height: 48px;
+    width: 48px;
+    border: 1px solid #e7eaec;
+    border-radius: 4px;
+    margin-top: 1px;
+}
+
+.chat-discussion .chat-message:nth-child(2n+1) .message-avatar {
+    float: left;
+    margin-right: 10px;
+}
+
+.chat-discussion .chat-message:nth-child(2n) .message-avatar {
+    float: right;
+    margin-left: 10px;
+}
+
+.message {
+    background-color: #fff;
+    border: 1px solid #e7eaec;
+    text-align: left;
+    display: block;
+    padding: 10px 20px;
+    position: relative;
+    border-radius: 4px;
+}
+
+.chat-discussion .chat-message:nth-child(2n+1) .message-date {
+    float: right;
+}
+
+.chat-discussion .chat-message:nth-child(2n) .message-date {
+    float: left;
+}
+
+.chat-discussion .chat-message:nth-child(2n+1) .message {
+    text-align: left;
+    margin-left: 55px;
+}
+
+.chat-discussion .chat-message:nth-child(2n) .message {
+    text-align: right;
+    margin-right: 55px;
+}
+
+.message-date {
+    font-size: 10px;
+    color: #888888;
+}
+
+.message-content {
+    display: block;
+}
+
+.chat-discussion {
+    background: #eee;
+    padding: 15px;
+    height: 400px;
+    overflow-y: auto;
+}
+
+.chat-users {
+    overflow-y: auto;
+    height: 400px;
+}
+
+.chat-message-form .form-group {
+    margin-bottom: 0;
+}
+
+
+/* jsTree */
+
+.jstree-open > .jstree-anchor > .fa-folder:before {
+    content: "\f07c";
+}
+
+.jstree-default .jstree-icon.none {
+    width: 0;
+}
+
+
+/* CLIENTS */
+
+.clients-list {
+    margin-top: 20px;
+}
+
+.clients-list .tab-pane {
+    position: relative;
+    height: 600px;
+}
+
+.client-detail {
+    position: relative;
+    height: 620px;
+}
+
+.clients-list table tr td {
+    height: 46px;
+    vertical-align: middle;
+    border: none;
+}
+
+.client-link {
+    font-weight: 600;
+    color: inherit;
+}
+
+.client-link:hover {
+    color: inherit;
+}
+
+.client-avatar {
+    width: 42px;
+}
+
+.client-avatar img {
+    width: 28px;
+    height: 28px;
+    border-radius: 50%;
+}
+
+.contact-type {
+    width: 20px;
+    color: #c1c3c4;
+}
+
+.client-status {
+    text-align: left;
+}
+
+.client-detail .vertical-timeline-content p {
+    margin: 0;
+}
+
+.client-detail .vertical-timeline-icon.gray-bg {
+    color: #a7aaab;
+}
+
+.clients-list .nav-tabs > li.active > a,
+.clients-list .nav-tabs > li.active > a:hover,
+.clients-list .nav-tabs > li.active > a:focus {
+    border-bottom: 1px solid #fff;
+}
+
+
+/* BLOG ARTICLE */
+
+.blog h2 {
+    font-weight: 700;
+}
+
+.blog h5 {
+    margin: 0 0 5px 0;
+}
+
+.blog .btn {
+    margin: 0 0 5px 0;
+}
+
+.article h1 {
+    font-size: 48px;
+    font-weight: 700;
+    color: #2F4050;
+}
+
+.article p {
+    font-size: 15px;
+    line-height: 26px;
+}
+
+.article-title {
+    text-align: center;
+    margin: 60px 0 40px 0;
+}
+
+.article .ibox-content {
+    padding: 40px;
+}
+
+
+/* ISSUE TRACKER */
+
+.issue-tracker .btn-link {
+    color: #1ab394;
+}
+
+table.issue-tracker tbody tr td {
+    vertical-align: middle;
+    height: 50px;
+}
+
+.issue-info {
+    width: 50%;
+}
+
+.issue-info a {
+    font-weight: 600;
+    color: #676a6c;
+}
+
+.issue-info small {
+    display: block;
+}
+
+
+/* TEAMS */
+
+.team-members {
+    margin: 10px 0;
+}
+
+.team-members img.img-circle {
+    width: 42px;
+    height: 42px;
+    margin-bottom: 5px;
+}
+
+
+/* AGILE BOARD */
+
+.sortable-list {
+    padding: 10px 0;
+}
+
+.agile-list {
+    list-style: none;
+    margin: 0;
+}
+
+.agile-list li {
+    background: #FAFAFB;
+    border: 1px solid #e7eaec;
+    margin: 0px 0 10px 0;
+    padding: 10px;
+    border-radius: 2px;
+}
+
+.agile-list li:hover {
+    cursor: pointer;
+    background: #fff;
+}
+
+.agile-list li.warning-element {
+    border-left: 3px solid #f8ac59;
+}
+
+.agile-list li.danger-element {
+    border-left: 3px solid #ed5565;
+}
+
+.agile-list li.info-element {
+    border-left: 3px solid #1c84c6;
+}
+
+.agile-list li.success-element {
+    border-left: 3px solid #1ab394;
+}
+
+.agile-detail {
+    margin-top: 5px;
+    font-size: 12px;
+}
+
+
+/* DIFF */
+
+ins {
+    background-color: #c6ffc6;
+    text-decoration: none;
+}
+
+del {
+    background-color: #ffc6c6;
+}
+
+#small-chat {
+    position: fixed;
+    bottom: 50px;
+    right: 26px;
+    z-index: 100;
+}
+
+#small-chat .badge {
+    position: absolute;
+    top: -3px;
+    right: -4px;
+}
+
+.open-small-chat {
+    height: 38px;
+    width: 38px;
+    display: block;
+    background: #1ab394;
+    padding: 9px 8px;
+    text-align: center;
+    color: #fff;
+    border-radius: 50%;
+}
+
+.open-small-chat:hover {
+    color: white;
+    background: #1ab394;
+}
+
+.small-chat-box {
+    display: none;
+    position: fixed;
+    bottom: 50px;
+    right: 80px;
+    background: #fff;
+    border: 1px solid #e7eaec;
+    width: 230px;
+    height: 320px;
+    border-radius: 4px;
+}
+
+.small-chat-box.ng-small-chat {
+    display: block;
+}
+
+.body-small .small-chat-box {
+    bottom: 70px;
+    right: 20px;
+}
+
+.small-chat-box.active {
+    display: block;
+}
+
+.small-chat-box .heading {
+    background: #2f4050;
+    padding: 8px 15px;
+    font-weight: bold;
+    color: #fff;
+}
+
+.small-chat-box .chat-date {
+    opacity: 0.6;
+    font-size: 10px;
+    font-weight: normal;
+}
+
+.small-chat-box .content {
+    padding: 15px 15px;
+}
+
+.small-chat-box .content .author-name {
+    font-weight: bold;
+    margin-bottom: 3px;
+    font-size: 11px;
+}
+
+.small-chat-box .content > div {
+    padding-bottom: 20px;
+}
+
+.small-chat-box .content .chat-message {
+    padding: 5px 10px;
+    border-radius: 6px;
+    font-size: 11px;
+    line-height: 14px;
+    max-width: 80%;
+    background: #f3f3f4;
+    margin-bottom: 10px;
+}
+
+.small-chat-box .content .chat-message.active {
+    background: #1ab394;
+    color: #fff;
+}
+
+.small-chat-box .content .left {
+    text-align: left;
+    clear: both;
+}
+
+.small-chat-box .content .left .chat-message {
+    float: left;
+}
+
+.small-chat-box .content .right {
+    text-align: right;
+    clear: both;
+}
+
+.small-chat-box .content .right .chat-message {
+    float: right;
+}
+
+.small-chat-box .form-chat {
+    padding: 10px 10px;
+}
+
+
+/*
+ *  Usage:
+ *
+ *    <div class="sk-spinner sk-spinner-rotating-plane"></div>
+ *
+ */
+
+.sk-spinner-rotating-plane.sk-spinner {
+    width: 30px;
+    height: 30px;
+    background-color: #1ab394;
+    margin: 0 auto;
+    -webkit-animation: sk-rotatePlane 1.2s infinite ease-in-out;
+    animation: sk-rotatePlane 1.2s infinite ease-in-out;
+}
+
+@-webkit-keyframes sk-rotatePlane {
+    0% {
+        -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+        transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+    }
+    50% {
+        -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+        transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+    }
+    100% {
+        -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+        transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+    }
+}
+
+@keyframes sk-rotatePlane {
+    0% {
+        -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+        transform: perspective(120px) rotateX(0deg) rotateY(0deg);
+    }
+    50% {
+        -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+        transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
+    }
+    100% {
+        -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+        transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
+    }
+}
+
+
+/*
+ *  Usage:
+ *
+ *    <div class="sk-spinner sk-spinner-double-bounce">
+ *      <div class="sk-double-bounce1"></div>
+ *      <div class="sk-double-bounce2"></div>
+ *    </div>
+ *
+ */
+
+.sk-spinner-double-bounce.sk-spinner {
+    width: 40px;
+    height: 40px;
+    position: relative;
+    margin: 0 auto;
+}
+
+.sk-spinner-double-bounce .sk-double-bounce1,
+.sk-spinner-double-bounce .sk-double-bounce2 {
+    width: 100%;
+    height: 100%;
+    border-radius: 50%;
+    background-color: #1ab394;
+    opacity: 0.6;
+    position: absolute;
+    top: 0;
+    left: 0;
+    -webkit-animation: sk-doubleBounce 2s infinite ease-in-out;
+    animation: sk-doubleBounce 2s infinite ease-in-out;
+}
+
+.sk-spinner-double-bounce .sk-double-bounce2 {
+    -webkit-animation-delay: -1s;
+    animation-delay: -1s;
+}
+
+@-webkit-keyframes sk-doubleBounce {
+    0%,
+    100% {
+        -webkit-transform: scale(0);
+        transform: scale(0);
+    }
+    50% {
+        -webkit-transform: scale(1);
+        transform: scale(1);
+    }
+}
+
+@keyframes sk-doubleBounce {
+    0%,
+    100% {
+        -webkit-transform: scale(0);
+        transform: scale(0);
+    }
+    50% {
+        -webkit-transform: scale(1);
+        transform: scale(1);
+    }
+}
+
+
+/*
+ *  Usage:
+ *
+ *    <div class="sk-spinner sk-spinner-wave">
+ *      <div class="sk-rect1"></div>
+ *      <div class="sk-rect2"></div>
+ *      <div class="sk-rect3"></div>
+ *      <div class="sk-rect4"></div>
+ *      <div class="sk-rect5"></div>
+ *    </div>
+ *
+ */
+
+.sk-spinner-wave.sk-spinner {
+    margin: 0 auto;
+    width: 50px;
+    height: 30px;
+    text-align: center;
+    font-size: 10px;
+}
+
+.sk-spinner-wave div {
+    background-color: #1ab394;
+    height: 100%;
+    width: 6px;
+    display: inline-block;
+    -webkit-animation: sk-waveStretchDelay 1.2s infinite ease-in-out;
+    animation: sk-waveStretchDelay 1.2s infinite ease-in-out;
+}
+
+.sk-spinner-wave .sk-rect2 {
+    -webkit-animation-delay: -1.1s;
+    animation-delay: -1.1s;
+}
+
+.sk-spinner-wave .sk-rect3 {
+    -webkit-animation-delay: -1s;
+    animation-delay: -1s;
+}
+
+.sk-spinner-wave .sk-rect4 {
+    -webkit-animation-delay: -0.9s;
+    animation-delay: -0.9s;
+}
+
+.sk-spinner-wave .sk-rect5 {
+    -webkit-animation-delay: -0.8s;
+    animation-delay: -0.8s;
+}
+
+@-webkit-keyframes sk-waveStretchDelay {
+    0%,
+    40%,
+    100% {
+        -webkit-transform: scaleY(0.4);
+        transform: scaleY(0.4);
+    }
+    20% {
+        -webkit-transform: scaleY(1);
+        transform: scaleY(1);
+    }
+}
+
+@keyframes sk-waveStretchDelay {
+    0%,
+    40%,
+    100% {
+        -webkit-transform: scaleY(0.4);
+        transform: scaleY(0.4);
+    }
+    20% {
+        -webkit-transform: scaleY(1);
+        transform: scaleY(1);
+    }
+}
+
+
+/*
+ *  Usage:
+ *
+ *    <div class="sk-spinner sk-spinner-wandering-cubes">
+ *      <div class="sk-cube1"></div>
+ *      <div class="sk-cube2"></div>
+ *    </div>
+ *
+ */
+
+.sk-spinner-wandering-cubes.sk-spinner {
+    margin: 0 auto;
+    width: 32px;
+    height: 32px;
+    position: relative;
+}
+
+.sk-spinner-wandering-cubes .sk-cube1,
+.sk-spinner-wandering-cubes .sk-cube2 {
+    background-color: #1ab394;
+    width: 10px;
+    height: 10px;
+    position: absolute;
+    top: 0;
+    left: 0;
+    -webkit-animation: sk-wanderingCubeMove 1.8s infinite ease-in-out;
+    animation: sk-wanderingCubeMove 1.8s infinite ease-in-out;
+}
+
+.sk-spinner-wandering-cubes .sk-cube2 {
+    -webkit-animation-delay: -0.9s;
+    animation-delay: -0.9s;
+}
+
+@-webkit-keyframes sk-wanderingCubeMove {
+    25% {
+        -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);
+        transform: translateX(42px) rotate(-90deg) scale(0.5);
+    }
+    50% {
+        /* Hack to make FF rotate in the right direction */
+        -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);
+        transform: translateX(42px) translateY(42px) rotate(-179deg);
+    }
+    50.1% {
+        -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);
+        transform: translateX(42px) translateY(42px) rotate(-180deg);
+    }
+    75% {
+        -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+        transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+    }
+    100% {
+        -webkit-transform: rotate(-360deg);
+        transform: rotate(-360deg);
+    }
+}
+
+@keyframes sk-wanderingCubeMove {
+    25% {
+        -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5);
+        transform: translateX(42px) rotate(-90deg) scale(0.5);
+    }
+    50% {
+        /* Hack to make FF rotate in the right direction */
+        -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg);
+        transform: translateX(42px) translateY(42px) rotate(-179deg);
+    }
+    50.1% {
+        -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);
+        transform: translateX(42px) translateY(42px) rotate(-180deg);
+    }
+    75% {
+        -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+        transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5);
+    }
+    100% {
+        -webkit-transform: rotate(-360deg);
+        transform: rotate(-360deg);
+    }
+}
+
+
+/*
+ *  Usage:
+ *
+ *    <div class="sk-spinner sk-spinner-pulse"></div>
+ *
+ */
+
+.sk-spinner-pulse.sk-spinner {
+    width: 40px;
+    height: 40px;
+    margin: 0 auto;
+    background-color: #1ab394;
+    border-radius: 100%;
+    -webkit-animation: sk-pulseScaleOut 1s infinite ease-in-out;
+    animation: sk-pulseScaleOut 1s infinite ease-in-out;
+}
+
+@-webkit-keyframes sk-pulseScaleOut {
+    0% {
+        -webkit-transform: scale(0);
+        transform: scale(0);
+    }
+    100% {
+        -webkit-transform: scale(1);
+        transform: scale(1);
+        opacity: 0;
+    }
+}
+
+@keyframes sk-pulseScaleOut {
+    0% {
+        -webkit-transform: scale(0);
+        transform: scale(0);
+    }
+    100% {
+        -webkit-transform: scale(1);
+        transform: scale(1);
+        opacity: 0;
+    }
+}
+
+
+/*
+ *  Usage:
+ *
+ *    <div class="sk-spinner sk-spinner-chasing-dots">
+ *      <div class="sk-dot1"></div>
+ *      <div class="sk-dot2"></div>
+ *    </div>
+ *
+ */
+
+.sk-spinner-chasing-dots.sk-spinner {
+    margin: 0 auto;
+    width: 40px;
+    height: 40px;
+    position: relative;
+    text-align: center;
+    -webkit-animation: sk-chasingDotsRotate 2s infinite linear;
+    animation: sk-chasingDotsRotate 2s infinite linear;
+}
+
+.sk-spinner-chasing-dots .sk-dot1,
+.sk-spinner-chasing-dots .sk-dot2 {
+    width: 60%;
+    height: 60%;
+    display: inline-block;
+    position: absolute;
+    top: 0;
+    background-color: #1ab394;
+    border-radius: 100%;
+    -webkit-animation: sk-chasingDotsBounce 2s infinite ease-in-out;
+    animation: sk-chasingDotsBounce 2s infinite ease-in-out;
+}
+
+.sk-spinner-chasing-dots .sk-dot2 {
+    top: auto;
+    bottom: 0px;
+    -webkit-animation-delay: -1s;
+    animation-delay: -1s;
+}
+
+@-webkit-keyframes sk-chasingDotsRotate {
+    100% {
+        -webkit-transform: rotate(360deg);
+        transform: rotate(360deg);
+    }
+}
+
+@keyframes sk-chasingDotsRotate {
+    100% {
+        -webkit-transform: rotate(360deg);
+        transform: rotate(360deg);
+    }
+}
+
+@-webkit-keyframes sk-chasingDotsBounce {
+    0%,
+    100% {
+        -webkit-transform: scale(0);
+        transform: scale(0);
+    }
+    50% {
+        -webkit-transform: scale(1);
+        transform: scale(1);
+    }
+}
+
+@keyframes sk-chasingDotsBounce {
+    0%,
+    100% {
+        -webkit-transform: scale(0);
+        transform: scale(0);
+    }
+    50% {
+        -webkit-transform: scale(1);
+        transform: scale(1);
+    }
+}
+
+
+/*
+ *  Usage:
+ *
+ *    <div class="sk-spinner sk-spinner-three-bounce">
+ *      <div class="sk-bounce1"></div>
+ *      <div class="sk-bounce2"></div>
+ *      <div class="sk-bounce3"></div>
+ *    </div>
+ *
+ */
+
+.sk-spinner-three-bounce.sk-spinner {
+    margin: 0 auto;
+    width: 70px;
+    text-align: center;
+}
+
+.sk-spinner-three-bounce div {
+    width: 18px;
+    height: 18px;
+    background-color: #1ab394;
+    border-radius: 100%;
+    display: inline-block;
+    -webkit-animation: sk-threeBounceDelay 1.4s infinite ease-in-out;
+    animation: sk-threeBounceDelay 1.4s infinite ease-in-out;
+    /* Prevent first frame from flickering when animation starts */
+    -webkit-animation-fill-mode: both;
+    animation-fill-mode: both;
+}
+
+.sk-spinner-three-bounce .sk-bounce1 {
+    -webkit-animation-delay: -0.32s;
+    animation-delay: -0.32s;
+}
+
+.sk-spinner-three-bounce .sk-bounce2 {
+    -webkit-animation-delay: -0.16s;
+    animation-delay: -0.16s;
+}
+
+@-webkit-keyframes sk-threeBounceDelay {
+    0%,
+    80%,
+    100% {
+        -webkit-transform: scale(0);
+        transform: scale(0);
+    }
+    40% {
+        -webkit-transform: scale(1);
+        transform: scale(1);
+    }
+}
+
+@keyframes sk-threeBounceDelay {
+    0%,
+    80%,
+    100% {
+        -webkit-transform: scale(0);
+        transform: scale(0);
+    }
+    40% {
+        -webkit-transform: scale(1);
+        transform: scale(1);
+    }
+}
+
+
+/*
+ *  Usage:
+ *
+ *    <div class="sk-spinner sk-spinner-circle">
+ *      <div class="sk-circle1 sk-circle"></div>
+ *      <div class="sk-circle2 sk-circle"></div>
+ *      <div class="sk-circle3 sk-circle"></div>
+ *      <div class="sk-circle4 sk-circle"></div>
+ *      <div class="sk-circle5 sk-circle"></div>
+ *      <div class="sk-circle6 sk-circle"></div>
+ *      <div class="sk-circle7 sk-circle"></div>
+ *      <div class="sk-circle8 sk-circle"></div>
+ *      <div class="sk-circle9 sk-circle"></div>
+ *      <div class="sk-circle10 sk-circle"></div>
+ *      <div class="sk-circle11 sk-circle"></div>
+ *      <div class="sk-circle12 sk-circle"></div>
+ *    </div>
+ *
+ */
+
+.sk-spinner-circle.sk-spinner {
+    margin: 0 auto;
+    width: 22px;
+    height: 22px;
+    position: relative;
+}
+
+.sk-spinner-circle .sk-circle {
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    left: 0;
+    top: 0;
+}
+
+.sk-spinner-circle .sk-circle:before {
+    content: '';
+    display: block;
+    margin: 0 auto;
+    width: 20%;
+    height: 20%;
+    background-color: #1ab394;
+    border-radius: 100%;
+    -webkit-animation: sk-circleBounceDelay 1.2s infinite ease-in-out;
+    animation: sk-circleBounceDelay 1.2s infinite ease-in-out;
+    /* Prevent first frame from flickering when animation starts */
+    -webkit-animation-fill-mode: both;
+    animation-fill-mode: both;
+}
+
+.sk-spinner-circle .sk-circle2 {
+    -webkit-transform: rotate(30deg);
+    -ms-transform: rotate(30deg);
+    transform: rotate(30deg);
+}
+
+.sk-spinner-circle .sk-circle3 {
+    -webkit-transform: rotate(60deg);
+    -ms-transform: rotate(60deg);
+    transform: rotate(60deg);
+}
+
+.sk-spinner-circle .sk-circle4 {
+    -webkit-transform: rotate(90deg);
+    -ms-transform: rotate(90deg);
+    transform: rotate(90deg);
+}
+
+.sk-spinner-circle .sk-circle5 {
+    -webkit-transform: rotate(120deg);
+    -ms-transform: rotate(120deg);
+    transform: rotate(120deg);
+}
+
+.sk-spinner-circle .sk-circle6 {
+    -webkit-transform: rotate(150deg);
+    -ms-transform: rotate(150deg);
+    transform: rotate(150deg);
+}
+
+.sk-spinner-circle .sk-circle7 {
+    -webkit-transform: rotate(180deg);
+    -ms-transform: rotate(180deg);
+    transform: rotate(180deg);
+}
+
+.sk-spinner-circle .sk-circle8 {
+    -webkit-transform: rotate(210deg);
+    -ms-transform: rotate(210deg);
+    transform: rotate(210deg);
+}
+
+.sk-spinner-circle .sk-circle9 {
+    -webkit-transform: rotate(240deg);
+    -ms-transform: rotate(240deg);
+    transform: rotate(240deg);
+}
+
+.sk-spinner-circle .sk-circle10 {
+    -webkit-transform: rotate(270deg);
+    -ms-transform: rotate(270deg);
+    transform: rotate(270deg);
+}
+
+.sk-spinner-circle .sk-circle11 {
+    -webkit-transform: rotate(300deg);
+    -ms-transform: rotate(300deg);
+    transform: rotate(300deg);
+}
+
+.sk-spinner-circle .sk-circle12 {
+    -webkit-transform: rotate(330deg);
+    -ms-transform: rotate(330deg);
+    transform: rotate(330deg);
+}
+
+.sk-spinner-circle .sk-circle2:before {
+    -webkit-animation-delay: -1.1s;
+    animation-delay: -1.1s;
+}
+
+.sk-spinner-circle .sk-circle3:before {
+    -webkit-animation-delay: -1s;
+    animation-delay: -1s;
+}
+
+.sk-spinner-circle .sk-circle4:before {
+    -webkit-animation-delay: -0.9s;
+    animation-delay: -0.9s;
+}
+
+.sk-spinner-circle .sk-circle5:before {
+    -webkit-animation-delay: -0.8s;
+    animation-delay: -0.8s;
+}
+
+.sk-spinner-circle .sk-circle6:before {
+    -webkit-animation-delay: -0.7s;
+    animation-delay: -0.7s;
+}
+
+.sk-spinner-circle .sk-circle7:before {
+    -webkit-animation-delay: -0.6s;
+    animation-delay: -0.6s;
+}
+
+.sk-spinner-circle .sk-circle8:before {
+    -webkit-animation-delay: -0.5s;
+    animation-delay: -0.5s;
+}
+
+.sk-spinner-circle .sk-circle9:before {
+    -webkit-animation-delay: -0.4s;
+    animation-delay: -0.4s;
+}
+
+.sk-spinner-circle .sk-circle10:before {
+    -webkit-animation-delay: -0.3s;
+    animation-delay: -0.3s;
+}
+
+.sk-spinner-circle .sk-circle11:before {
+    -webkit-animation-delay: -0.2s;
+    animation-delay: -0.2s;
+}
+
+.sk-spinner-circle .sk-circle12:before {
+    -webkit-animation-delay: -0.1s;
+    animation-delay: -0.1s;
+}
+
+@-webkit-keyframes sk-circleBounceDelay {
+    0%,
+    80%,
+    100% {
+        -webkit-transform: scale(0);
+        transform: scale(0);
+    }
+    40% {
+        -webkit-transform: scale(1);
+        transform: scale(1);
+    }
+}
+
+@keyframes sk-circleBounceDelay {
+    0%,
+    80%,
+    100% {
+        -webkit-transform: scale(0);
+        transform: scale(0);
+    }
+    40% {
+        -webkit-transform: scale(1);
+        transform: scale(1);
+    }
+}
+
+
+/*
+ *  Usage:
+ *
+ *    <div class="sk-spinner sk-spinner-cube-grid">
+ *      <div class="sk-cube"></div>
+ *      <div class="sk-cube"></div>
+ *      <div class="sk-cube"></div>
+ *      <div class="sk-cube"></div>
+ *      <div class="sk-cube"></div>
+ *      <div class="sk-cube"></div>
+ *      <div class="sk-cube"></div>
+ *      <div class="sk-cube"></div>
+ *      <div class="sk-cube"></div>
+ *    </div>
+ *
+ */
+
+.sk-spinner-cube-grid {
+    /*
+   * Spinner positions
+   * 1 2 3
+   * 4 5 6
+   * 7 8 9
+   */
+}
+
+.sk-spinner-cube-grid.sk-spinner {
+    width: 30px;
+    height: 30px;
+    margin: 0 auto;
+}
+
+.sk-spinner-cube-grid .sk-cube {
+    width: 33%;
+    height: 33%;
+    background-color: #1ab394;
+    float: left;
+    -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
+    animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out;
+}
+
+.sk-spinner-cube-grid .sk-cube:nth-child(1) {
+    -webkit-animation-delay: 0.2s;
+    animation-delay: 0.2s;
+}
+
+.sk-spinner-cube-grid .sk-cube:nth-child(2) {
+    -webkit-animation-delay: 0.3s;
+    animation-delay: 0.3s;
+}
+
+.sk-spinner-cube-grid .sk-cube:nth-child(3) {
+    -webkit-animation-delay: 0.4s;
+    animation-delay: 0.4s;
+}
+
+.sk-spinner-cube-grid .sk-cube:nth-child(4) {
+    -webkit-animation-delay: 0.1s;
+    animation-delay: 0.1s;
+}
+
+.sk-spinner-cube-grid .sk-cube:nth-child(5) {
+    -webkit-animation-delay: 0.2s;
+    animation-delay: 0.2s;
+}
+
+.sk-spinner-cube-grid .sk-cube:nth-child(6) {
+    -webkit-animation-delay: 0.3s;
+    animation-delay: 0.3s;
+}
+
+.sk-spinner-cube-grid .sk-cube:nth-child(7) {
+    -webkit-animation-delay: 0s;
+    animation-delay: 0s;
+}
+
+.sk-spinner-cube-grid .sk-cube:nth-child(8) {
+    -webkit-animation-delay: 0.1s;
+    animation-delay: 0.1s;
+}
+
+.sk-spinner-cube-grid .sk-cube:nth-child(9) {
+    -webkit-animation-delay: 0.2s;
+    animation-delay: 0.2s;
+}
+
+@-webkit-keyframes sk-cubeGridScaleDelay {
+    0%,
+    70%,
+    100% {
+        -webkit-transform: scale3D(1, 1, 1);
+        transform: scale3D(1, 1, 1);
+    }
+    35% {
+        -webkit-transform: scale3D(0, 0, 1);
+        transform: scale3D(0, 0, 1);
+    }
+}
+
+@keyframes sk-cubeGridScaleDelay {
+    0%,
+    70%,
+    100% {
+        -webkit-transform: scale3D(1, 1, 1);
+        transform: scale3D(1, 1, 1);
+    }
+    35% {
+        -webkit-transform: scale3D(0, 0, 1);
+        transform: scale3D(0, 0, 1);
+    }
+}
+
+
+/*
+ *  Usage:
+ *
+ *    <div class="sk-spinner sk-spinner-wordpress">
+ *      <span class="sk-inner-circle"></span>
+ *    </div>
+ *
+ */
+
+.sk-spinner-wordpress.sk-spinner {
+    background-color: #1ab394;
+    width: 30px;
+    height: 30px;
+    border-radius: 30px;
+    position: relative;
+    margin: 0 auto;
+    -webkit-animation: sk-innerCircle 1s linear infinite;
+    animation: sk-innerCircle 1s linear infinite;
+}
+
+.sk-spinner-wordpress .sk-inner-circle {
+    display: block;
+    background-color: #fff;
+    width: 8px;
+    height: 8px;
+    position: absolute;
+    border-radius: 8px;
+    top: 5px;
+    left: 5px;
+}
+
+@-webkit-keyframes sk-innerCircle {
+    0% {
+        -webkit-transform: rotate(0);
+        transform: rotate(0);
+    }
+    100% {
+        -webkit-transform: rotate(360deg);
+        transform: rotate(360deg);
+    }
+}
+
+@keyframes sk-innerCircle {
+    0% {
+        -webkit-transform: rotate(0);
+        transform: rotate(0);
+    }
+    100% {
+        -webkit-transform: rotate(360deg);
+        transform: rotate(360deg);
+    }
+}
+
+
+/*
+ *  Usage:
+ *
+ *    <div class="sk-spinner sk-spinner-fading-circle">
+ *      <div class="sk-circle1 sk-circle"></div>
+ *      <div class="sk-circle2 sk-circle"></div>
+ *      <div class="sk-circle3 sk-circle"></div>
+ *      <div class="sk-circle4 sk-circle"></div>
+ *      <div class="sk-circle5 sk-circle"></div>
+ *      <div class="sk-circle6 sk-circle"></div>
+ *      <div class="sk-circle7 sk-circle"></div>
+ *      <div class="sk-circle8 sk-circle"></div>
+ *      <div class="sk-circle9 sk-circle"></div>
+ *      <div class="sk-circle10 sk-circle"></div>
+ *      <div class="sk-circle11 sk-circle"></div>
+ *      <div class="sk-circle12 sk-circle"></div>
+ *    </div>
+ *
+ */
+
+.sk-spinner-fading-circle.sk-spinner {
+    margin: 0 auto;
+    width: 22px;
+    height: 22px;
+    position: relative;
+}
+
+.sk-spinner-fading-circle .sk-circle {
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    left: 0;
+    top: 0;
+}
+
+.sk-spinner-fading-circle .sk-circle:before {
+    content: '';
+    display: block;
+    margin: 0 auto;
+    width: 18%;
+    height: 18%;
+    background-color: #1ab394;
+    border-radius: 100%;
+    -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out;
+    animation: sk-circleFadeDelay 1.2s infinite ease-in-out;
+    /* Prevent first frame from flickering when animation starts */
+    -webkit-animation-fill-mode: both;
+    animation-fill-mode: both;
+}
+
+.sk-spinner-fading-circle .sk-circle2 {
+    -webkit-transform: rotate(30deg);
+    -ms-transform: rotate(30deg);
+    transform: rotate(30deg);
+}
+
+.sk-spinner-fading-circle .sk-circle3 {
+    -webkit-transform: rotate(60deg);
+    -ms-transform: rotate(60deg);
+    transform: rotate(60deg);
+}
+
+.sk-spinner-fading-circle .sk-circle4 {
+    -webkit-transform: rotate(90deg);
+    -ms-transform: rotate(90deg);
+    transform: rotate(90deg);
+}
+
+.sk-spinner-fading-circle .sk-circle5 {
+    -webkit-transform: rotate(120deg);
+    -ms-transform: rotate(120deg);
+    transform: rotate(120deg);
+}
+
+.sk-spinner-fading-circle .sk-circle6 {
+    -webkit-transform: rotate(150deg);
+    -ms-transform: rotate(150deg);
+    transform: rotate(150deg);
+}
+
+.sk-spinner-fading-circle .sk-circle7 {
+    -webkit-transform: rotate(180deg);
+    -ms-transform: rotate(180deg);
+    transform: rotate(180deg);
+}
+
+.sk-spinner-fading-circle .sk-circle8 {
+    -webkit-transform: rotate(210deg);
+    -ms-transform: rotate(210deg);
+    transform: rotate(210deg);
+}
+
+.sk-spinner-fading-circle .sk-circle9 {
+    -webkit-transform: rotate(240deg);
+    -ms-transform: rotate(240deg);
+    transform: rotate(240deg);
+}
+
+.sk-spinner-fading-circle .sk-circle10 {
+    -webkit-transform: rotate(270deg);
+    -ms-transform: rotate(270deg);
+    transform: rotate(270deg);
+}
+
+.sk-spinner-fading-circle .sk-circle11 {
+    -webkit-transform: rotate(300deg);
+    -ms-transform: rotate(300deg);
+    transform: rotate(300deg);
+}
+
+.sk-spinner-fading-circle .sk-circle12 {
+    -webkit-transform: rotate(330deg);
+    -ms-transform: rotate(330deg);
+    transform: rotate(330deg);
+}
+
+.sk-spinner-fading-circle .sk-circle2:before {
+    -webkit-animation-delay: -1.1s;
+    animation-delay: -1.1s;
+}
+
+.sk-spinner-fading-circle .sk-circle3:before {
+    -webkit-animation-delay: -1s;
+    animation-delay: -1s;
+}
+
+.sk-spinner-fading-circle .sk-circle4:before {
+    -webkit-animation-delay: -0.9s;
+    animation-delay: -0.9s;
+}
+
+.sk-spinner-fading-circle .sk-circle5:before {
+    -webkit-animation-delay: -0.8s;
+    animation-delay: -0.8s;
+}
+
+.sk-spinner-fading-circle .sk-circle6:before {
+    -webkit-animation-delay: -0.7s;
+    animation-delay: -0.7s;
+}
+
+.sk-spinner-fading-circle .sk-circle7:before {
+    -webkit-animation-delay: -0.6s;
+    animation-delay: -0.6s;
+}
+
+.sk-spinner-fading-circle .sk-circle8:before {
+    -webkit-animation-delay: -0.5s;
+    animation-delay: -0.5s;
+}
+
+.sk-spinner-fading-circle .sk-circle9:before {
+    -webkit-animation-delay: -0.4s;
+    animation-delay: -0.4s;
+}
+
+.sk-spinner-fading-circle .sk-circle10:before {
+    -webkit-animation-delay: -0.3s;
+    animation-delay: -0.3s;
+}
+
+.sk-spinner-fading-circle .sk-circle11:before {
+    -webkit-animation-delay: -0.2s;
+    animation-delay: -0.2s;
+}
+
+.sk-spinner-fading-circle .sk-circle12:before {
+    -webkit-animation-delay: -0.1s;
+    animation-delay: -0.1s;
+}
+
+@-webkit-keyframes sk-circleFadeDelay {
+    0%,
+    39%,
+    100% {
+        opacity: 0;
+    }
+    40% {
+        opacity: 1;
+    }
+}
+
+@keyframes sk-circleFadeDelay {
+    0%,
+    39%,
+    100% {
+        opacity: 0;
+    }
+    40% {
+        opacity: 1;
+    }
+}
+
+body.rtls {
+    /* Theme config */
+}
+
+body.rtls #page-wrapper {
+    margin: 0 220px 0 0;
+}
+
+body.rtls .nav-second-level li a {
+    padding: 7px 35px 7px 10px;
+}
+
+body.rtls .ibox-title h5 {
+    float: right;
+}
+
+body.rtls .pull-right {
+    float: left !important;
+}
+
+body.rtls .pull-left {
+    float: right !important;
+}
+
+body.rtls .ibox-tools {
+    float: left;
+}
+
+body.rtls .stat-percent {
+    float: left;
+}
+
+body.rtls .navbar-right {
+    float: left !important;
+}
+
+body.rtls .navbar-top-links li:last-child {
+    margin-left: 40px;
+    margin-right: 0;
+}
+
+body.rtls .minimalize-styl-2 {
+    float: right;
+    margin: 14px 20px 5px 5px;
+}
+
+body.rtls .feed-element > .pull-left {
+    margin-left: 10px;
+    margin-right: 0;
+}
+
+body.rtls .timeline-item .date {
+    text-align: left;
+}
+
+body.rtls .timeline-item .date i {
+    left: 0;
+    right: auto;
+}
+
+body.rtls .timeline-item .content {
+    border-right: 1px solid #e7eaec;
+    border-left: none;
+}
+
+body.rtls .toast-close-button {
+    float: left;
+}
+
+body.rtls #toast-container > .toast:before {
+    margin: auto -1.5em auto 0.5em;
+}
+
+body.rtls #toast-container > div {
+    padding: 15px 50px 15px 15px;
+}
+
+body.rtls .center-orientation .vertical-timeline-icon i {
+    margin-left: 0;
+    margin-right: -12px;
+}
+
+body.rtls .vertical-timeline-icon i {
+    right: 50%;
+    left: auto;
+    margin-left: auto;
+    margin-right: -12px;
+}
+
+body.rtls .file-box {
+    float: right;
+}
+
+body.rtls ul.notes li {
+    float: right;
+}
+
+body.rtls .chat-users,
+body.rtls .chat-statistic {
+    margin-right: -30px;
+    margin-left: auto;
+}
+
+body.rtls .dropdown-menu > li > a {
+    text-align: right;
+}
+
+body.rtls .b-r {
+    border-left: 1px solid #e7eaec;
+    border-right: none;
+}
+
+body.rtls .dd-list .dd-list {
+    padding-right: 30px;
+    padding-left: 0;
+}
+
+body.rtls .dd-item > button {
+    float: right;
+}
+
+body.rtls .skin-setttings {
+    margin-right: 40px;
+    margin-left: 0;
+}
+
+body.rtls .skin-setttings {
+    direction: ltr;
+}
+
+body.rtls .footer.fixed {
+    margin-right: 220px;
+    margin-left: 0;
+}
+
+@media (max-width: 992px) {
+    body.rtls .chat-users,
+    body.rtls .chat-statistic {
+        margin-right: 0px;
+    }
+}
+
+body.rtls.mini-navbar .footer.fixed,
+body.body-small.mini-navbar .footer.fixed {
+    margin: 0 70px 0 0;
+}
+
+body.rtls.mini-navbar.fixed-sidebar .footer.fixed,
+body.body-small.mini-navbar .footer.fixed {
+    margin: 0 0 0 0;
+}
+
+body.rtls.top-navigation .navbar-toggle {
+    float: right;
+    margin-left: 15px;
+    margin-right: 15px;
+}
+
+.body-small.rtls.top-navigation .navbar-header {
+    float: none;
+}
+
+body.rtls.top-navigation #page-wrapper {
+    margin: 0;
+}
+
+body.rtls.mini-navbar #page-wrapper {
+    margin: 0 70px 0 0;
+}
+
+body.rtls.mini-navbar.fixed-sidebar #page-wrapper {
+    margin: 0 0 0 0;
+}
+
+body.rtls.body-small.fixed-sidebar.mini-navbar #page-wrapper {
+    margin: 0 220px 0 0;
+}
+
+body.rtls.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
+    width: 220px;
+}
+
+.body-small.rtls .navbar-fixed-top {
+    margin-right: 0px;
+}
+
+.body-small.rtls .navbar-header {
+    float: right;
+}
+
+body.rtls .navbar-top-links li:last-child {
+    margin-left: 20px;
+}
+
+body.rtls .top-navigation #page-wrapper,
+body.rtls.mini-navbar .top-navigation #page-wrapper,
+body.rtls.mini-navbar.top-navigation #page-wrapper {
+    margin: 0;
+}
+
+body.rtls .top-navigation .footer.fixed,
+body.rtls.top-navigation .footer.fixed {
+    margin: 0;
+}
+
+@media (max-width: 768px) {
+    body.rtls .navbar-top-links li:last-child {
+        margin-left: 20px;
+    }
+    .body-small.rtls #page-wrapper {
+        position: inherit;
+        margin: 0 0 0 0px;
+        min-height: 1000px;
+    }
+    .body-small.rtls .navbar-static-side {
+        display: none;
+        z-index: 2001;
+        position: absolute;
+        width: 70px;
+    }
+    .body-small.rtls.mini-navbar .navbar-static-side {
+        display: block;
+    }
+    .rtls.fixed-sidebar.body-small .navbar-static-side {
+        display: none;
+        z-index: 2001;
+        position: fixed;
+        width: 220px;
+    }
+    .rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side {
+        display: block;
+    }
+}
+
+.rtls .ltr-support {
+    direction: ltr;
+}
+
+
+/*
+ *
+ *   This is style for skin config
+ *   Use only in demo theme
+ *
+*/
+
+.skin-setttings .title {
+    background: #efefef;
+    text-align: center;
+    text-transform: uppercase;
+    font-weight: 600;
+    display: block;
+    padding: 10px 15px;
+    font-size: 12px;
+}
+
+.setings-item {
+    padding: 10px 30px;
+}
+
+.setings-item.nb {
+    border: none;
+}
+
+.setings-item.skin {
+    text-align: center;
+}
+
+.setings-item .switch {
+    float: right;
+}
+
+.skin-name a {
+    text-transform: uppercase;
+}
+
+.setings-item a {
+    color: #fff;
+}
+
+.default-skin,
+.blue-skin,
+.ultra-skin,
+.yellow-skin {
+    text-align: center;
+}
+
+.default-skin {
+    font-weight: 600;
+    background: #1ab394;
+}
+
+.default-skin:hover {
+    background: #199d82;
+}
+
+.blue-skin {
+    font-weight: 600;
+    background: url("patterns/header-profile-skin-1.png") repeat scroll 0 0;
+}
+
+.blue-skin:hover {
+    background: #0d8ddb;
+}
+
+.yellow-skin {
+    font-weight: 600;
+    background: url("patterns/header-profile-skin-3.png") repeat scroll 0 100%;
+}
+
+.yellow-skin:hover {
+    background: #ce8735;
+}
+
+.content-tabs {
+    border-bottom: solid 2px #2f4050;
+}
+
+.page-tabs a {
+    color: #999;
+}
+
+.page-tabs a i {
+    color: #ccc;
+}
+
+.page-tabs a.active {
+    background: #2f4050;
+    color: #a7b1c2;
+}
+
+.page-tabs a.active:hover,
+.page-tabs a.active i:hover {
+    background: #293846;
+    color: #fff;
+}
+
+
+/*
+ *
+ *   SKIN 1 - H+ - 后台主题UI框架
+ *   NAME - Blue light
+ *
+*/
+
+.skin-1 .minimalize-styl-2 {
+    margin: 14px 5px 5px 30px;
+}
+
+.skin-1 .navbar-top-links li:last-child {
+    margin-right: 30px;
+}
+
+.skin-1.fixed-nav .minimalize-styl-2 {
+    margin: 14px 5px 5px 15px;
+}
+
+.skin-1 .spin-icon {
+    background: #0e9aef !important;
+}
+
+.skin-1 .nav-header {
+    background: #0e9aef;
+    background: url('patterns/header-profile-skin-1.png');
+}
+
+.skin-1.mini-navbar .nav-second-level {
+    background: #3e495f;
+}
+
+.skin-1 .breadcrumb {
+    background: transparent;
+}
+
+.skin-1 .page-heading {
+    border: none;
+}
+
+.skin-1 .nav > li.active {
+    background: #3a4459;
+}
+
+.skin-1 .nav > li > a {
+    color: #9ea6b9;
+}
+
+.skin-1 .nav > li.active > a {
+    color: #fff;
+}
+
+.skin-1 .navbar-minimalize {
+    background: #0e9aef;
+    border-color: #0e9aef;
+}
+
+body.skin-1 {
+    background: #3e495f;
+}
+
+.skin-1 .navbar-static-top {
+    background: #ffffff;
+}
+
+.skin-1 .dashboard-header {
+    background: transparent;
+    border-bottom: none !important;
+    border-top: none;
+    padding: 20px 30px 10px 30px;
+}
+
+.fixed-nav.skin-1 .navbar-fixed-top {
+    background: #fff;
+}
+
+.skin-1 .wrapper-content {
+    padding: 30px 15px;
+}
+
+.skin-1 #page-wrapper {
+    background: #f4f6fa;
+}
+
+.skin-1 .ibox-title,
+.skin-1 .ibox-content {
+    border-width: 1px;
+}
+
+.skin-1 .ibox-content:last-child {
+    border-style: solid solid solid solid;
+}
+
+.skin-1 .nav > li.active {
+    border: none;
+}
+
+.skin-1 .nav-header {
+    padding: 35px 25px 25px 25px;
+}
+
+.skin-1 .nav-header a.dropdown-toggle {
+    color: #fff;
+    margin-top: 10px;
+}
+
+.skin-1 .nav-header a.dropdown-toggle .text-muted {
+    color: #fff;
+    opacity: 0.8;
+}
+
+.skin-1 .profile-element {
+    text-align: center;
+}
+
+.skin-1 .img-circle {
+    border-radius: 5px;
+}
+
+.skin-1 .navbar-default .nav > li > a:hover,
+.skin-1 .navbar-default .nav > li > a:focus {
+    background: #39aef5;
+    color: #fff;
+}
+
+.skin-1 .nav.nav-tabs > li.active > a {
+    color: #555;
+}
+
+.skin-1 .content-tabs {
+    border-bottom: solid 2px #39aef5;
+}
+
+.skin-1 .nav.nav-tabs > li.active {
+    background: transparent;
+}
+
+.skin-1 .page-tabs a.active {
+    background: #39aef5;
+    color: #fff;
+}
+
+.skin-1 .page-tabs a.active:hover,
+.skin-1 .page-tabs a.active i:hover {
+    background: #0e9aef;
+    color: #fff;
+}
+
+
+/*
+ *
+ *   SKIN 3 - H+ - 后台主题UI框架
+ *   NAME - Yellow/purple
+ *
+*/
+
+.skin-3 .minimalize-styl-2 {
+    margin: 14px 5px 5px 30px;
+}
+
+.skin-3 .navbar-top-links li:last-child {
+    margin-right: 30px;
+}
+
+.skin-3.fixed-nav .minimalize-styl-2 {
+    margin: 14px 5px 5px 15px;
+}
+
+.skin-3 .spin-icon {
+    background: #ecba52 !important;
+}
+
+body.boxed-layout.skin-3 #wrapper {
+    background: #3e2c42;
+}
+
+.skin-3 .nav-header {
+    background: #ecba52;
+    background: url('patterns/header-profile-skin-3.png');
+}
+
+.skin-3.mini-navbar .nav-second-level {
+    background: #3e2c42;
+}
+
+.skin-3 .breadcrumb {
+    background: transparent;
+}
+
+.skin-3 .page-heading {
+    border: none;
+}
+
+.skin-3 .nav > li.active {
+    background: #38283c;
+}
+
+.fixed-nav.skin-3 .navbar-fixed-top {
+    background: #fff;
+}
+
+.skin-3 .nav > li > a {
+    color: #948b96;
+}
+
+.skin-3 .nav > li.active > a {
+    color: #fff;
+}
+
+.skin-3 .navbar-minimalize {
+    background: #ecba52;
+    border-color: #ecba52;
+}
+
+body.skin-3 {
+    background: #3e2c42;
+}
+
+.skin-3 .navbar-static-top {
+    background: #ffffff;
+}
+
+.skin-3 .dashboard-header {
+    background: transparent;
+    border-bottom: none !important;
+    border-top: none;
+    padding: 20px 30px 10px 30px;
+}
+
+.skin-3 .wrapper-content {
+    padding: 30px 15px;
+}
+
+.skin-3 #page-wrapper {
+    background: #f4f6fa;
+}
+
+.skin-3 .ibox-title,
+.skin-3 .ibox-content {
+    border-width: 1px;
+}
+
+.skin-3 .ibox-content:last-child {
+    border-style: solid solid solid solid;
+}
+
+.skin-3 .nav > li.active {
+    border: none;
+}
+
+.skin-3 .nav-header {
+    padding: 35px 25px 25px 25px;
+}
+
+.skin-3 .nav-header a.dropdown-toggle {
+    color: #fff;
+    margin-top: 10px;
+}
+
+.skin-3 .nav-header a.dropdown-toggle .text-muted {
+    color: #fff;
+    opacity: 0.8;
+}
+
+.skin-3 .profile-element {
+    text-align: center;
+}
+
+.skin-3 .img-circle {
+    border-radius: 5px;
+}
+
+.skin-3 .navbar-default .nav > li > a:hover,
+.skin-3 .navbar-default .nav > li > a:focus {
+    background: #38283c;
+    color: #fff;
+}
+
+.skin-3 .nav.nav-tabs > li.active > a {
+    color: #555;
+}
+
+.skin-3 .nav.nav-tabs > li.active {
+    background: transparent;
+}
+
+.skin-3 .content-tabs {
+    border-bottom: solid 2px #3e2c42;
+}
+
+.skin-3 .nav.nav-tabs > li.active {
+    background: transparent;
+}
+
+.skin-3 .page-tabs a.active {
+    background: #3e2c42;
+    color: #fff;
+}
+
+.skin-3 .page-tabs a.active:hover,
+.skin-3 .page-tabs a.active i:hover {
+    background: #38283c;
+    color: #fff;
+}
+
+@media (min-width: 768px) {
+    .navbar-top-links .dropdown-messages,
+    .navbar-top-links .dropdown-tasks,
+    .navbar-top-links .dropdown-alerts {
+        margin-left: auto;
+    }
+}
+
+@media (max-width: 768px) {
+    body.fixed-sidebar .navbar-static-side {
+        display: none;
+    }
+    body.fixed-sidebar.mini-navbar .navbar-static-side {
+        width: 70px;
+    }
+    .lock-word {
+        display: none;
+    }
+    .navbar-form-custom {
+        display: none;
+    }
+    .navbar-header {
+        display: inline;
+        float: left;
+    }
+    .sidebard-panel {
+        z-index: 2;
+        position: relative;
+        width: auto;
+        min-height: 100% !important;
+    }
+    .sidebar-content .wrapper {
+        padding-right: 0px;
+        z-index: 1;
+    }
+    .fixed-sidebar.body-small .navbar-static-side {
+        display: none;
+        z-index: 2001;
+        position: fixed;
+        width: 220px;
+    }
+    .fixed-sidebar.body-small.mini-navbar .navbar-static-side {
+        display: block;
+    }
+    .ibox-tools {
+        float: none;
+        text-align: right;
+        display: block;
+    }
+    .content-tabs {
+        display: none;
+    }
+    #content-main {
+        height: calc(100% - 100px);
+    }
+    .fixed-nav #content-main {
+        height: calc(100% - 38px);
+    }
+}
+
+.navbar-static-side {
+    background: #2f4050;
+}
+
+.nav-close {
+    padding: 10px;
+    display: block;
+    position: absolute;
+    right: 5px;
+    top: 5px;
+    font-size: 1.4em;
+    cursor: pointer;
+    z-index: 10;
+    display: none;
+    color: rgba(255, 255, 255, .3);
+}
+
+@media (max-width: 350px) {
+    body.fixed-sidebar.mini-navbar .navbar-static-side {
+        width: 0;
+    }
+    .nav-close {
+        display: block;
+    }
+    #page-wrapper {
+        margin-left: 0!important;
+    }
+    .timeline-item .date {
+        text-align: left;
+        width: 110px;
+        position: relative;
+        padding-top: 30px;
+    }
+    .timeline-item .date i {
+        position: absolute;
+        top: 0;
+        left: 15px;
+        padding: 5px;
+        width: 30px;
+        text-align: center;
+        border: 1px solid #e7eaec;
+        background: #f8f8f8;
+    }
+    .timeline-item .content {
+        border-left: none;
+        border-top: 1px solid #e7eaec;
+        padding-top: 10px;
+        min-height: 100px;
+    }
+    .nav.navbar-top-links li.dropdown {
+        display: none;
+    }
+    .ibox-tools {
+        float: none;
+        text-align: left;
+        display: inline-block;
+    }
+}
+
+
+/*JQGRID*/
+
+.ui-jqgrid-titlebar {
+    height: 40px;
+    line-height: 24px;
+    color: #676a6c;
+    background-color: #F9F9F9;
+    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.ui-jqgrid .ui-jqgrid-title {
+    float: left;
+    margin-left: 5px;
+    font-weight: 700;
+}
+
+.ui-jqgrid .ui-jqgrid-titlebar {
+    position: relative;
+    border-left: 0px solid;
+    border-right: 0px solid;
+    border-top: 0px solid;
+}
+
+
+/* Social feed */
+
+.social-feed-separated .social-feed-box {
+    margin-left: 62px;
+}
+
+.social-feed-separated .social-avatar {
+    float: left;
+    padding: 0;
+}
+
+.social-feed-separated .social-avatar img {
+    width: 52px;
+    height: 52px;
+    border: 1px solid #e7eaec;
+}
+
+.social-feed-separated .social-feed-box .social-avatar {
+    padding: 15px 15px 0 15px;
+    float: none;
+}
+
+.social-feed-box {
+    /*padding: 15px;*/
+    border: 1px solid #e7eaec;
+    background: #fff;
+    margin-bottom: 15px;
+}
+
+.article .social-feed-box {
+    margin-bottom: 0;
+    border-bottom: none;
+}
+
+.article .social-feed-box:last-child {
+    margin-bottom: 0;
+    border-bottom: 1px solid #e7eaec;
+}
+
+.article .social-feed-box p {
+    font-size: 13px;
+    line-height: 18px;
+}
+
+.social-action {
+    margin: 15px;
+}
+
+.social-avatar {
+    padding: 15px 15px 0 15px;
+}
+
+.social-comment .social-comment {
+    margin-left: 45px;
+}
+
+.social-avatar img {
+    height: 40px;
+    width: 40px;
+    margin-right: 10px;
+}
+
+.social-avatar .media-body a {
+    font-size: 14px;
+    display: block;
+}
+
+.social-body {
+    padding: 15px;
+}
+
+.social-body img {
+    margin-bottom: 10px;
+}
+
+.social-footer {
+    border-top: 1px solid #e7eaec;
+    padding: 10px 15px;
+    background: #f9f9f9;
+}
+
+.social-footer .social-comment img {
+    width: 32px;
+    margin-right: 10px;
+}
+
+.social-comment:first-child {
+    margin-top: 0;
+}
+
+.social-comment {
+    margin-top: 15px;
+}
+
+.social-comment textarea {
+    font-size: 12px;
+}
+
+.checkbox input[type=checkbox],
+.checkbox-inline input[type=checkbox],
+.radio input[type=radio],
+.radio-inline input[type=radio] {
+    margin-top: -4px;
+}
+
+
+/* Only demo */
+
+@media (max-width: 1000px) {
+    .welcome-message {
+        display: none;
+    }
+}
+
+
+/* ECHARTS  */
+
+.echarts {
+    height: 240px;
+}
+
+.checkbox-inline,
+.radio-inline,
+.checkbox-inline+.checkbox-inline,
+.radio-inline+.radio-inline {
+    margin: 0 15px 0 0;
+}
+
+.navbar-toggle {
+    background-color: #fff;
+}
+
+.J_menuTab {
+    -webkit-transition: all .3s ease-out 0s;
+    transition: all .3s ease-out 0s;
+}
+
+::-webkit-scrollbar-track {
+    background-color: #F5F5F5;
+}
+
+::-webkit-scrollbar {
+    width: 6px;
+    background-color: #F5F5F5;
+}
+
+::-webkit-scrollbar-thumb {
+    background-color: #999;
+}
+
+
+/*GO HOME*/
+
+.gohome {
+    position: fixed;
+    top: 20px;
+    right: 20px;
+    z-index: 100;
+}
+
+.gohome a {
+    height: 38px;
+    width: 38px;
+    display: block;
+    background: #2f4050;
+    padding: 9px 8px;
+    text-align: center;
+    color: #fff;
+    border-radius: 50%;
+    opacity: .5;
+}
+
+.gohome a:hover {
+    opacity: 1;
+}
+
+@media only screen and (-webkit-min-device-pixel-ratio : 2){
+    #content-main {
+        -webkit-overflow-scrolling: touch;
+    }
+}
+
+.navbar-header {
+    width: 60%;
+}
+
+.bs-glyphicons {
+    margin: 0 -10px 20px;
+    overflow: hidden
+}
+
+.bs-glyphicons-list {
+    padding-left: 0;
+    list-style: none
+}
+
+.bs-glyphicons li {
+    float: left;
+    width: 25%;
+    height: 115px;
+    padding: 10px;
+    font-size: 10px;
+    line-height: 1.4;
+    text-align: center;
+    background-color: #f9f9f9;
+    border: 1px solid #fff
+}
+
+.bs-glyphicons .glyphicon {
+    margin-top: 5px;
+    margin-bottom: 10px;
+    font-size: 24px
+}
+
+.bs-glyphicons .glyphicon-class {
+    display: block;
+    text-align: center;
+    word-wrap: break-word
+}
+
+.bs-glyphicons li:hover {
+    color: #fff;
+    background-color: #1ab394;
+}
+
+@media (min-width: 768px) {
+    .bs-glyphicons {
+        margin-right: 0;
+        margin-left: 0
+    }
+    .bs-glyphicons li {
+        width: 12.5%;
+        font-size: 12px
+    }
+}
+
+.tab-menu-selected {
+    background-color: #293846 !important;
+    color: white !important;
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/favicon.ico b/management/guns-admin/src/main/webapp/static/favicon.ico
new file mode 100644
index 0000000..a1a957e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/favicon.ico
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/favicon1.ico b/management/guns-admin/src/main/webapp/static/favicon1.ico
new file mode 100644
index 0000000..f628e5d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/favicon1.ico
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/fonts/FontAwesome.otf b/management/guns-admin/src/main/webapp/static/fonts/FontAwesome.otf
new file mode 100644
index 0000000..681bdd4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/fonts/FontAwesome.otf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.eot b/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..a30335d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.eot
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.svg b/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..6c5bb76
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.svg
@@ -0,0 +1,640 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
+<metadata></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" "  horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#xd8;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" horiz-adv-x="1537" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" horiz-adv-x="1537" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
+<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95 q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83zM1152 672h128v64h-128v128h-64v-128 h-128v-64h128v-160h64v160zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 43.5q53 57 53 159q0 58 -17 125t-48.5 129.5 t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26zM591 -37q58 0 111.5 13t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2 q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5zM1401 839h213v-108h-213v-219h-105v219h-212v108h212v217h105v-217z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1792" d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1792" />
+<glyph unicode="&#xf117;" horiz-adv-x="1792" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
+<glyph unicode="&#xf15c;" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" />
+<glyph unicode="&#xf174;" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
+<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
+<glyph unicode="&#xf194;" d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179 q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
+<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
+<glyph unicode="&#xf199;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
+<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" />
+<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
+<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
+<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
+<glyph unicode="&#xf19e;" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
+<glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5 t-59.5 -93t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5 t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32z" />
+<glyph unicode="&#xf1a1;" horiz-adv-x="1792" d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26 t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37 q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191 t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf1a2;" d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54 q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83 q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1a3;" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
+<glyph unicode="&#xf1a5;" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" />
+<glyph unicode="&#xf1a7;" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
+<glyph unicode="&#xf1a9;" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
+<glyph unicode="&#xf1aa;" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" />
+<glyph unicode="&#xf1ab;" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" />
+<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
+<glyph unicode="&#xf1ad;" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
+<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" />
+<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
+<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " />
+<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" />
+<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
+<glyph unicode="&#xf1b5;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
+<glyph unicode="&#xf1b6;" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
+<glyph unicode="&#xf1b7;" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " />
+<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
+<glyph unicode="&#xf1b9;" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1ba;" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
+<glyph unicode="&#xf1bb;" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
+<glyph unicode="&#xf1bc;" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1bd;" horiz-adv-x="1024" d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
+<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
+<glyph unicode="&#xf1c0;" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
+<glyph unicode="&#xf1c1;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
+<glyph unicode="&#xf1c2;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" />
+<glyph unicode="&#xf1c3;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" />
+<glyph unicode="&#xf1c4;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
+<glyph unicode="&#xf1c5;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
+<glyph unicode="&#xf1c6;" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
+<glyph unicode="&#xf1c7;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
+<glyph unicode="&#xf1c8;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
+<glyph unicode="&#xf1c9;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
+<glyph unicode="&#xf1ca;" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
+<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
+<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" />
+<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
+<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" />
+<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
+<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf1d2;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
+<glyph unicode="&#xf1d4;" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
+<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
+<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
+<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
+<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" />
+<glyph unicode="&#xf1da;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1db;" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" />
+<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
+<glyph unicode="&#xf1de;" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
+<glyph unicode="&#xf1e0;" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
+<glyph unicode="&#xf1e1;" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf1e3;" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
+<glyph unicode="&#xf1e4;" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
+<glyph unicode="&#xf1e5;" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1e6;" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" />
+<glyph unicode="&#xf1e7;" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
+<glyph unicode="&#xf1e8;" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+<glyph unicode="&#xf1e9;" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
+<glyph unicode="&#xf1ea;" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
+<glyph unicode="&#xf1eb;" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
+<glyph unicode="&#xf1ec;" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1ed;" d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246 q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598 q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" />
+<glyph unicode="&#xf1ee;" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" />
+<glyph unicode="&#xf1f0;" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f1;" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f2;" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
+<glyph unicode="&#xf1f3;" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
+<glyph unicode="&#xf1f4;" horiz-adv-x="2304" d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16 t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76 q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59 t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489 l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66 q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f5;" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f6;" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f7;" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f8;" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1f9;" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1fa;" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
+<glyph unicode="&#xf1fb;" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+<glyph unicode="&#xf1fc;" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
+<glyph unicode="&#xf1fd;" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
+<glyph unicode="&#xf1fe;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+<glyph unicode="&#xf200;" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf201;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf202;" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
+<glyph unicode="&#xf203;" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf204;" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
+<glyph unicode="&#xf205;" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+<glyph unicode="&#xf206;" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf207;" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
+<glyph unicode="&#xf208;" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
+<glyph unicode="&#xf209;" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
+<glyph unicode="&#xf20a;" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
+<glyph unicode="&#xf20b;" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf20c;" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
+<glyph unicode="&#xf20d;" d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
+<glyph unicode="&#xf20e;" horiz-adv-x="2048" d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360q2 0 4.5 -1t5.5 -2.5l5 -2.5l188 199v347l-187 194 q-13 -8 -29 -10zM986 1438h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13 zM552 226h402l64 66l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224 l213 -225zM1023 946l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196 l-48 -227l130 227h-82zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
+<glyph unicode="&#xf210;" d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
+<glyph unicode="&#xf211;" d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
+<glyph unicode="&#xf212;" horiz-adv-x="2048" d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 q209 0 374 -102q172 107 374 102z" />
+<glyph unicode="&#xf213;" horiz-adv-x="2048" d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
+<glyph unicode="&#xf214;" d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 t-43 -34t-16.5 -53.5z" />
+<glyph unicode="&#xf215;" horiz-adv-x="2048" d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
+<glyph unicode="&#xf216;" horiz-adv-x="2048" d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126.5t-103.5 132.5t-108.5 126t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
+<glyph unicode="&#xf217;" horiz-adv-x="1664" d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf218;" horiz-adv-x="1664" d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf219;" horiz-adv-x="2048" d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
+<glyph unicode="&#xf21a;" horiz-adv-x="2048" d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
+<glyph unicode="&#xf21b;" d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
+<glyph unicode="&#xf21c;" horiz-adv-x="2304" d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
+<glyph unicode="&#xf21d;" d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf21e;" horiz-adv-x="1792" d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 t127 -344z" />
+<glyph unicode="&#xf221;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+<glyph unicode="&#xf222;" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5 q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf223;" horiz-adv-x="1280" d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf224;" d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf225;" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf226;" horiz-adv-x="1792" d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 q0 -226 -154 -391q103 -57 218 -57z" />
+<glyph unicode="&#xf227;" horiz-adv-x="1920" d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -29 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
+<glyph unicode="&#xf228;" horiz-adv-x="2048" d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
+<glyph unicode="&#xf229;" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5 t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22a;" horiz-adv-x="1280" d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22b;" horiz-adv-x="2048" d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5 t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5 t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22c;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22d;" horiz-adv-x="1280" d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123 t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
+<glyph unicode="&#xf22e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf22f;" horiz-adv-x="1792" />
+<glyph unicode="&#xf230;" d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
+<glyph unicode="&#xf231;" horiz-adv-x="1280" d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
+<glyph unicode="&#xf232;" d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
+<glyph unicode="&#xf233;" horiz-adv-x="1792" d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
+<glyph unicode="&#xf234;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
+<glyph unicode="&#xf235;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
+<glyph unicode="&#xf236;" horiz-adv-x="2048" d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 q-26 0 -45 -19t-19 -45v-384h1152z" />
+<glyph unicode="&#xf237;" d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
+<glyph unicode="&#xf238;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
+<glyph unicode="&#xf239;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
+<glyph unicode="&#xf23a;" horiz-adv-x="1792" d="M1792 204v-209h-642v209h134v926h-6l-314 -1135h-243l-310 1135h-8v-926h135v-209h-538v209h69q21 0 43 19.5t22 37.5v881q0 18 -22 40t-43 22h-69v209h672l221 -821h6l223 821h670v-209h-71q-19 0 -41 -22t-22 -40v-881q0 -18 21.5 -37.5t41.5 -19.5h71z" />
+<glyph unicode="&#xf23b;" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
+<glyph unicode="&#xf23c;" horiz-adv-x="2296" d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5 q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5 q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42 q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37 q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5 q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139 q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 4 5 8q16 18 60 23h13q5 18 19 30t33 8 t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132 q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132 q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-106 2 -211 0v1q-1 -27 2.5 -86 t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103 q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34l3 9v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4l-10 -2.5t-12 -2 l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-2 0 -3 -0.5t-3 -0.5h-3q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130t-73 70 q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -2 -1 -5t-1 -4q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150 q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12 q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" />
+<glyph unicode="&#xf23d;" horiz-adv-x="2304" d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5 t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5 t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" />
+<glyph unicode="&#xf23e;" horiz-adv-x="1792" d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348 t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23 t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512 q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" />
+<glyph unicode="&#xf240;" horiz-adv-x="2304" d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113 v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf241;" horiz-adv-x="2304" d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf242;" horiz-adv-x="2304" d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf243;" horiz-adv-x="2304" d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf244;" horiz-adv-x="2304" d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23 v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf245;" horiz-adv-x="1280" d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
+<glyph unicode="&#xf246;" horiz-adv-x="1024" d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
+<glyph unicode="&#xf247;" horiz-adv-x="2048" d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128 h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
+<glyph unicode="&#xf248;" horiz-adv-x="2304" d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256 v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" />
+<glyph unicode="&#xf249;" d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
+<glyph unicode="&#xf24a;" d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf24b;" horiz-adv-x="2304" d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5 t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88 t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90 t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf24c;" horiz-adv-x="2304" d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294 t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf24d;" horiz-adv-x="1792" d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113 zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf24e;" horiz-adv-x="2304" d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64 q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91 t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5 t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" />
+<glyph unicode="&#xf250;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5 t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+<glyph unicode="&#xf251;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" />
+<glyph unicode="&#xf252;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
+<glyph unicode="&#xf253;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196 h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+<glyph unicode="&#xf254;" d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87 t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9 h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" />
+<glyph unicode="&#xf255;" d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25 q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27 t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21 q72 69 174 69z" />
+<glyph unicode="&#xf256;" horiz-adv-x="1792" d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33 t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52 h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" />
+<glyph unicode="&#xf257;" horiz-adv-x="1792" d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668 q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17 t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5 q0 -42 -23 -78t-61 -53l-310 -141h91z" />
+<glyph unicode="&#xf258;" horiz-adv-x="2048" d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32 q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68 q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" />
+<glyph unicode="&#xf259;" horiz-adv-x="2048" d="M816 1408q-48 0 -79.5 -34t-31.5 -82q0 -14 3 -28l150 -624h-26l-116 482q-9 38 -39.5 62t-69.5 24q-47 0 -79 -34t-32 -81q0 -11 4 -29q3 -13 39 -161t68 -282t32 -138v-227l-307 230q-34 26 -77 26q-52 0 -89.5 -36.5t-37.5 -88.5q0 -67 56 -110l507 -379 q34 -26 76 -26h694q33 0 59 20.5t34 52.5l100 401q8 30 10 88t9 86l116 478q3 12 3 26q0 46 -33 79t-80 33q-38 0 -69 -25.5t-40 -62.5l-99 -408h-26l132 547q3 14 3 28q0 47 -32 80t-80 33q-38 0 -68.5 -24t-39.5 -62l-145 -602h-127l-164 682q-9 38 -39.5 62t-68.5 24z M1461 -256h-694q-85 0 -153 51l-507 380q-50 38 -78.5 94t-28.5 118q0 105 75 179t180 74q25 0 49.5 -5.5t41.5 -11t41 -20.5t35 -23t38.5 -29.5t37.5 -28.5l-123 512q-7 35 -7 59q0 93 60 162t152 79q14 87 80.5 144.5t155.5 57.5q83 0 148 -51.5t85 -132.5l103 -428 l83 348q20 81 85 132.5t148 51.5q87 0 152.5 -54t82.5 -139q93 -10 155 -78t62 -161q0 -30 -7 -57l-116 -477q-5 -22 -5 -67q0 -51 -13 -108l-101 -401q-19 -75 -79.5 -122.5t-137.5 -47.5z" />
+<glyph unicode="&#xf25a;" horiz-adv-x="1792" d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5 q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5 v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32 v-384h32z" />
+<glyph unicode="&#xf25b;" d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181 v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46 q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5 q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308 q0 -53 37.5 -90.5t90.5 -37.5h668z" />
+<glyph unicode="&#xf25c;" horiz-adv-x="1973" d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5 t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141 q13 0 22 -8.5t10 -20.5z" />
+<glyph unicode="&#xf25d;" horiz-adv-x="1792" d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109 t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640 q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf25e;" horiz-adv-x="1792" d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13t-23.5 -14.5t-28.5 -13.5t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78 q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13t-23.5 -14.5t-28.5 -13.5t-33.5 -9.5 t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376 q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" />
+<glyph unicode="&#xf260;" horiz-adv-x="2048" d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
+<glyph unicode="&#xf261;" horiz-adv-x="1792" d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf262;" horiz-adv-x="2304" d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57 t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197 t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5 t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5 t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5 q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" />
+<glyph unicode="&#xf263;" horiz-adv-x="1280" d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5 t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94 q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" />
+<glyph unicode="&#xf264;" d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32 q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5 zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf265;" horiz-adv-x="1720" d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33 l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" />
+<glyph unicode="&#xf266;" horiz-adv-x="2304" d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540 q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81 l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" />
+<glyph unicode="&#xf267;" horiz-adv-x="1792" d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640 q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5 t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5 t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5 t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191 t191 -286t71 -348z" />
+<glyph unicode="&#xf268;" horiz-adv-x="1792" d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962 q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" />
+<glyph unicode="&#xf269;" horiz-adv-x="1792" d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5 q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5 q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" />
+<glyph unicode="&#xf26a;" d="M768 -92q77 0 139.5 63t100.5 166t59 234.5t21 268.5t-21 268.5t-59 234.5t-100.5 166t-139.5 63t-139.5 -63t-100.5 -166t-59 -234.5t-21 -268.5t21 -268.5t59 -234.5t100.5 -166t139.5 -63zM768 -256q-184 0 -333 77t-240 203t-141 287t-50 329t50 329t141 287t240 203 t333 77q148 0 274 -50t214.5 -136t151.5 -201t92.5 -244t29.5 -265t-29.5 -265t-92.5 -244t-151.5 -201t-214.5 -136t-274 -50z" />
+<glyph unicode="&#xf26b;" horiz-adv-x="1792" d="M716 -69q-143 35 -261.5 114t-197.5 191q-139 -300 -17 -398q26 -21 85 -24.5t127.5 9.5t141 41.5t122.5 66.5zM693 762h452q0 108 -61.5 169t-168.5 61q-103 0 -162.5 -62.5t-59.5 -167.5zM1724 1137h-34q26 102 22.5 170t-25 110t-63.5 57t-93.5 11t-115 -26.5 t-128.5 -56.5t-134 -79q129 -37 238.5 -113.5t185 -179t110 -231.5t15.5 -262h-1005q0 -60 10 -106t34 -85t69.5 -60t112.5 -21q87 0 142.5 44t72.5 122h540q-71 -230 -281.5 -377t-477.5 -147q-83 0 -159 15q-35 -40 -151 -94t-248 -78t-219 35q-78 60 -100 159t7 214 t88 242t143.5 248t173.5 226.5t177.5 183.5t156.5 112v24q-120 -37 -258.5 -137.5t-240.5 -207t-159 -195.5q4 106 34 201t80 169t118 135.5t147.5 100.5t168 65.5t180.5 29.5t185 -8q310 186 503 189h7q57 0 103 -18q80 -30 98 -132.5t-30 -248.5z" />
+<glyph unicode="&#xf26c;" horiz-adv-x="2048" d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23 v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf26d;" horiz-adv-x="1792" d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34 h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100 q-68 175 -180 287z" />
+<glyph unicode="&#xf26e;" horiz-adv-x="2304" d="M1391 390v0l-1 1q-15 18 -34.5 37.5t-62.5 57.5t-93.5 62t-95.5 24q-48 0 -83 -21.5t-51 -54t-23 -59t-7 -47.5v0v0q0 -21 7 -48t23 -59t51 -53.5t83 -21.5q45 0 95.5 24t94 62.5t62 57t34.5 37.5zM2103 390q0 21 -7 47.5t-23 59t-51 54t-83 21.5q-45 0 -95.5 -24 t-94 -62.5t-62 -57t-34.5 -37.5l-1 -1v0v0l1 -1q15 -18 34.5 -37.5t62.5 -57.5t93.5 -62t95.5 -24q48 0 83 21.5t51 53.5t23 59t7 48zM2304 393q0 -69 -24 -137.5t-68 -126t-116 -93.5t-159 -36q-68 0 -134 24t-113.5 58.5t-84.5 69.5t-59.5 59t-25.5 24t-22.5 -24 t-54.5 -58.5t-81.5 -69.5t-115 -59t-143.5 -24q-65 0 -123.5 22.5t-96.5 54t-66.5 66.5t-41 59.5t-12.5 32.5q0 -8 -8.5 -26.5t-25 -45.5t-47 -55t-69 -52.5t-96.5 -40t-125 -15.5q-71 0 -130 15.5t-98.5 39.5t-70.5 56.5t-48 63.5t-27.5 63.5t-14 54t-3.5 36.5h217 q0 -55 49 -107.5t126 -52.5q79 0 134.5 67t55.5 148q0 80 -52 136.5t-138 56.5q-5 0 -13 -0.5t-31 -5t-43 -12t-42 -24.5t-34 -40h-195l102 583h602v-174h-445q-27 -159 -41 -248q4 0 16.5 13t31.5 28.5t65 28.5t108 13t114 -20.5t82.5 -49.5t51.5 -58.5t31 -50t11 -20.5 t13 25t36.5 60.5t60.5 71.5t97 61t133 25t140.5 -25t115.5 -60.5t83.5 -71.5t56.5 -61t21 -25q2 0 22 25t56 60.5t83.5 71.5t115.5 61t140 25q92 0 164.5 -35t115.5 -93t65 -125t22 -137z" />
+<glyph unicode="&#xf270;" horiz-adv-x="1792" d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30 q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57 t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133 q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" />
+<glyph unicode="&#xf271;" horiz-adv-x="1792" d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9 h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224 v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" />
+<glyph unicode="&#xf272;" horiz-adv-x="1792" d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23 t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf273;" horiz-adv-x="1792" d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf274;" horiz-adv-x="1792" d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf275;" horiz-adv-x="1792" d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" />
+<glyph unicode="&#xf276;" horiz-adv-x="1024" d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q61 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249 q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" />
+<glyph unicode="&#xf277;" horiz-adv-x="1792" d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" />
+<glyph unicode="&#xf278;" horiz-adv-x="2048" d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173 v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
+<glyph unicode="&#xf279;" horiz-adv-x="1792" d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472 q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" />
+<glyph unicode="&#xf27a;" horiz-adv-x="1792" d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37 t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf27b;" horiz-adv-x="1792" d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5 t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51 t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" />
+<glyph unicode="&#xf27c;" horiz-adv-x="1024" d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
+<glyph unicode="&#xf27d;" horiz-adv-x="1792" d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246 q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" />
+<glyph unicode="&#xf27e;" d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
+<glyph unicode="&#xf280;" d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72 h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275 l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" />
+<glyph unicode="&#xf281;" horiz-adv-x="1792" />
+<glyph unicode="&#xf282;" horiz-adv-x="1792" />
+<glyph unicode="&#xf283;" horiz-adv-x="1792" />
+<glyph unicode="&#xf284;" horiz-adv-x="1792" />
+<glyph unicode="&#xf285;" horiz-adv-x="1792" />
+<glyph unicode="&#xf286;" horiz-adv-x="1792" />
+<glyph unicode="&#xf287;" horiz-adv-x="1792" />
+<glyph unicode="&#xf288;" horiz-adv-x="1792" />
+<glyph unicode="&#xf289;" horiz-adv-x="1792" />
+<glyph unicode="&#xf28a;" horiz-adv-x="1792" />
+<glyph unicode="&#xf28b;" horiz-adv-x="1792" />
+<glyph unicode="&#xf28c;" horiz-adv-x="1792" />
+<glyph unicode="&#xf28d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf28e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg>
diff --git a/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.ttf b/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..d7994e1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.ttf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.woff b/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..6fd4ede
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.woff
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.woff2 b/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..5560193
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/fonts/fontawesome-webfont.woff2
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.eot b/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000..b93a495
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.eot
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.svg b/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000..187805a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
+<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
+<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
+<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
+<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
+<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
+<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
+<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
+<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
+<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
+<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
+<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
+<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
+<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
+<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
+<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
+<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
+<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
+<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
+<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
+<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
+<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
+<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
+<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
+<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
+<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
+<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
+<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
+<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
+<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
+<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
+<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
+<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
+<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
+<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
+<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
+<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
+<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
+<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
+<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
+<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
+<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
+<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
+<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
+<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
+<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
+<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
+<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
+<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
+<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
+<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
+<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
+<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
+<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
+<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
+<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
+<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
+<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
+<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
+<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
+<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
+<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
+<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
+<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
+<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
+<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
+<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
+<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
+<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
+<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
+<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
+<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
+<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
+<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
+<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
+<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
+<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
+<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
+<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
+<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
+<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
+<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
+<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
+<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
+<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
+<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
+<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
+<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
+<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
+<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
+<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
+<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
+<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
+<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
+<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
+<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
+<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
+<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
+<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
+<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
+<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
+<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
+<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
+<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
+<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
+<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
+<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
+<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
+<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
+<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
+<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
+<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
+<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
+<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
+<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
+<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
+<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
+<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
+<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
+<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
+<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
+<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
+<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
+<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
+<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
+</font>
+</defs></svg>
diff --git a/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.ttf b/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..1413fc6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.ttf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.woff b/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..9e61285
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.woff
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.woff2 b/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000..64539b5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/fonts/glyphicons-halflings-regular.woff2
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/home.js b/management/guns-admin/src/main/webapp/static/home.js
new file mode 100644
index 0000000..b546552
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/home.js
@@ -0,0 +1,500 @@
+var uid = $("#3dnzNxplgTiHaddR",top.window.document).val();
+var markers = [];
+var companyId = '';
+
+var Home = {
+    id: "HomeTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1,
+    businessType:null,//存储企业信息
+};
+
+
+/**
+ * 初始化表格的列
+ */
+Home.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '最后在线时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '司机头像', field: 'headImgUrl', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                if (row.headImgUrl == null || row.headImgUrl == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.headImgUrl + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '司机姓名', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '司机电话', field: 'phone', visible: false, align: 'center', valign: 'middle'},
+        {title: '在线设备', field: 'device', visible: true, align: 'center', valign: 'middle'},
+        {title: '当前版本', field: 'version', visible: true, align: 'center', valign: 'middle'}
+    ];
+};
+
+
+
+/**
+ * 点击添加信息
+ */
+Home.openNetCarInfo = function (e) {
+    var id = e.getExtData()[0];
+    var index = layer.open({
+        type: 2,
+        title: '详细数据',
+        area: ['770px', '500px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/home/openNetCarInfo?id=' + id,
+    });
+    this.layerIndex = index;
+};
+
+
+
+Home.onlineDriver = function () {
+    var index = layer.open({
+        type: 2,
+        title: '在线司机',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/home/showDriverOnline',
+    });
+    this.layerIndex = index;
+};
+
+
+Home.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['phone'] = $("#phone").val();
+    Home.table.refresh({query: queryData});
+};
+Home.resetSearch = function () {
+    $("#name").val("");
+    $("#phone").val("");
+    Home.search();
+};
+
+
+$(function () {
+    var defaultColunms = Home.initColumn();
+    var table = new BSTable(Home.id, "/home/queryOnlineDriver", defaultColunms);
+    table.setPaginationType("server");
+    Home.table = table.init();
+
+    var first = $('.breadcrumb').children('li:first').children('a');
+    first.css({
+        'color': '#AB2626'
+    })
+    var className = first.attr('class');
+    $('.content').hide();
+    $('#' + className + 'Div').show();
+
+
+    $('.breadcrumb').find('a').on('click', function () {
+        $('.breadcrumb').children('li').each(function () {
+            $(this).children('a').removeAttr('style');
+        })
+
+        $(this).css({
+            'color': '#AB2626'
+        });
+        var className = $(this).attr('class');
+        $('.content').hide();
+        $('#' + className + "Div").show();
+        switch (className) {
+            case "statistics":
+                getData();
+                break;
+            case "map":
+                var companyId = $('#branchOffice1').val();
+                if(null != companyId && '' != companyId){
+                    Home.webSocketClient(companyId);
+                }else{
+                    Home.webSocketClient(null);
+                }
+                break;
+            case "order":
+                Home.getAllOrder();
+                break;
+        }
+
+    })
+
+
+
+    laydate.render({
+        elem: '#addDate', //指定元素
+        format: 'yyyy-MM-dd',//日期格式
+        value: new Date(),//默认值
+        zIndex: 99999999,//层叠顺序
+        trigger: 'click',
+        done: function(value, date, endDate){
+            getData();
+            console.log(value); //得到日期生成的值,如:2017-08-18
+        }
+    });
+    laydate.render({
+        elem: '#rangeDate', //指定元素
+        format: 'yyyy-MM-dd',//日期格式
+        range: true,
+        value: '',//默认值
+        zIndex: 99999999,//层叠顺序
+        trigger: 'click',
+        done: function(value, date, endDate){
+            getData();
+            console.log(value); //得到日期生成的值,如:2017-08-18
+        }
+    });
+    getData();
+    getCompanyByUid();
+    // setInterval(function () {
+    //     Home.webSocketClient(null);
+    // }, 60000 * 5);
+    // setInterval(function () {
+    //     Home.getAllOrder();
+    // }, 60000 * 5);
+});
+
+
+
+var map = new AMap.Map('container',{
+    resizeEnable: true,
+    zoom:10
+});
+
+
+var map_ = new AMap.Map('container_',{
+    resizeEnable: true,
+    mapStyle: 'amap://styles/1de318cbb8d12c02303a22c550b9ccc9',
+    zoom:10
+});
+
+var mouseTool = new AMap.MouseTool(map);
+//监听draw事件可获取画好的覆盖物
+var overlays = [];
+var name = null;
+var coordinate = '';//存储坐标
+mouseTool.on('draw',function(e){
+    overlays.push(e.obj);
+    console.log(e.obj.getPath());
+
+    switch (name) {
+        case 'polyline':{//折线图
+            var polyline = e.obj.getPath();
+            getCoordinate(polyline);
+            break;
+        }
+        case 'polygon':{//多边形
+            var polygon = e.obj.getPath();
+            getCoordinate(polygon);
+            break;
+        }
+        case 'rectangle':{//矩形
+            var rectangle = e.obj.getPath();
+            getCoordinate(rectangle);
+            break;
+        }
+        case 'circle':{//圆行
+            var center = e.obj.getCenter();
+            var radius = e.obj.getRadius();
+            if(radius > 5000){
+                Feng.error("创建电子围栏失败,圆半径不能大于5000米");
+                return;
+            }
+            coordinate = center.lng + ',' + center.lat + ';' + radius;
+            break;
+        }
+    }
+    console.log(coordinate);
+})
+
+
+function getCompanyByUid() {
+    $.ajax({
+        url: Feng.ctxPath + "/home/getCompanyInfoByUserId",
+        type: 'POST',
+        success: function (res) {
+            var str = '<option value="">----请选择----</option>';
+            for(var i in res){
+                str += '<option value="' + res[i].id + '">' + res[i].name + '</option>'
+            }
+            $('#branchOffice').html(str);
+            $('#branchOffice1').html(str);
+        }
+    });
+}
+
+
+
+
+
+
+function getData() {
+    var branchOffice = $('#branchOffice').val();
+    var addDate = $('#addDate').val();
+    var date = $('#rangeDate').val();
+    var data = new FormData();
+    if(null != branchOffice && '' != branchOffice){
+        data.append("companyId", branchOffice);
+    }
+    if(null != addDate && '' != addDate){
+        data.append("addDate", addDate);
+    }
+    if(null != date && date != ''){
+        data.append("start", date.split(' - ')[0]);
+        data.append("end", date.split(' - ')[1]);
+    }
+
+    $.ajax({
+        url: Feng.ctxPath + "/home/getSumData",
+        type: 'POST',
+        contentType: false,
+        processData: false,
+        data: data,
+        success: function (res) {
+            var operationStatus = res.operationStatus;
+            var operationSum = res.operationSum;
+            var operationGrow = res.operationGrow;
+            var operationTrend = res.operationTrend;
+
+            $('#newPassengerInfo').text(operationStatus.passengerInfo == null ? 0 : operationStatus.passengerInfo);
+            $('#newNetcardriver').text(operationStatus.netcardriver == null ? 0 : operationStatus.netcardriver);
+            $('#orderDetail1').text(operationStatus.orderDetail1 == null ? 0 : operationStatus.orderDetail1);
+            $('#orderDetail2').text(operationStatus.orderDetail2 == null ? 0 : operationStatus.orderDetail2);
+            $('#orderDetail3').text(operationStatus.orderDetail3 == null ? 0 : operationStatus.orderDetail3);
+            $('#orderDetail4').text(operationStatus.orderDetail4 == null ? 0 : operationStatus.orderDetail4);
+            $('#orderDetail5').text(operationStatus.orderDetail5 == null ? 0 : operationStatus.orderDetail5);
+
+            $('#passengerInfoSum').text(operationSum.passengerInfoSum == null ? 0 : operationSum.passengerInfoSum);
+            $('#netcarDriverSum').text(operationSum.netcarDriverSum == null ? 0 : operationSum.netcarDriverSum);
+            $('#netCarSum').text(operationSum.netCarSum == null ? 0 : operationSum.netCarSum);
+            $('#orderDetailSum').text(operationSum.orderDetailSum == null ? 0 : operationSum.orderDetailSum);
+            $('#paiceSum').text(operationSum.paiceSum == null ? 0 : operationSum.paiceSum);
+            $('#paySum').text(operationSum.paySum == null ? 0 : operationSum.paySum);
+
+            $('#passengerInfoSum1').text(operationGrow.passengerInfoSum == null ? 0 : operationGrow.passengerInfoSum);
+            $('#netcarDriverSum1').text(operationGrow.netcarDriverSum == null ? 0 : operationGrow.netcarDriverSum);
+            $('#orderDetail11').text(operationGrow.orderDetail1 == null ? 0 : operationGrow.orderDetail1);
+            $('#orderDetail21').text(operationGrow.orderDetail2 == null ? 0 : operationGrow.orderDetail2);
+            $('#orderDetail31').text(operationGrow.orderDetail3 == null ? 0 : operationGrow.orderDetail3);
+            $('#orderDetail41').text(operationGrow.orderDetail4 == null ? 0 : operationGrow.orderDetail4);
+            $('#orderDetail51').text(operationGrow.orderDetail5 == null ? 0 : operationGrow.orderDetail5);
+            $('#paySum1').text(operationGrow.paySum == null ? 0 : operationGrow.paySum);
+            $('#paiceSum1').text(operationGrow.paiceSum == null ? 0 : operationGrow.paiceSum);
+
+            $('#orderDetailSum1').sparkline(operationTrend.orderDetailSum, {
+                lineColor:'green',
+                width: '100%',
+                height: '33px'
+            });
+            $('#passengerInfoSum2').sparkline(operationTrend.passengerInfoSum, {
+                lineColor:'green',
+                width: '100%',
+                height: '33px'
+            });
+            $('#orderDetail12').sparkline(operationTrend.orderDetail1, {
+                lineColor:'green',
+                width: '100%',
+                height: '33px'
+            });
+            $('#orderDetail22').sparkline(operationTrend.orderDetail2, {
+                lineColor:'green',
+                width: '100%',
+                height: '33px'
+            });
+            $('#orderDetail32').sparkline(operationTrend.orderDetail3, {
+                lineColor:'green',
+                width: '100%',
+                height: '33px'
+            });
+            $('#orderDetail42').sparkline(operationTrend.orderDetail4, {
+                lineColor:'green',
+                width: '100%',
+                height: '33px'
+            });
+            $('#orderDetail52').sparkline(operationTrend.orderDetail5, {
+                lineColor:'green',
+                width: '100%',
+                height: '33px'
+            });
+        }
+    });
+}
+
+
+Home.webSocketClient = function (companyId) {
+    $.ajax({
+        url: Feng.ctxPath + '/home/getDriverPosition',
+        type: 'POST',
+        data: {
+            companyId: companyId
+        },
+        success: function (res) {
+            map.remove(markers);
+            markers = [];
+            var data = res.driver;
+            var order = res.order;
+            var d = '';
+            for(var i in data){
+                var driver = data[i].driver;
+                var driverId = driver.id;
+                d += '<li class="list-group-item" id="' + driverId + '">' + driver.name + '-' + driver.phone + '</li>';
+                if('' != data[i].lon){
+                    // 创建 AMap.Icon 实例:
+                    var icon = new AMap.Icon({
+                        size: new AMap.Size(40, 50),    // 图标尺寸
+                        image: '/static/car.png',  // Icon的图像
+                        // imageOffset: new AMap.Pixel(0, -60),  // 图像相对展示区域的偏移量,适于雪碧图等
+                        imageSize: new AMap.Size(40, 50),   // 根据所设置的大小拉伸或压缩图片
+                    });
+
+                    var marker = new AMap.Marker({
+                        position: new AMap.LngLat(data[i].lon, data[i].lat),   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
+                        offset: new AMap.Pixel(-10, -10),
+                        icon: icon, // 添加 Icon 实例
+                    });
+                    marker.setExtData([driverId])
+                    marker.on('click', function(){
+                        Home.openNetCarInfo(this);
+                    });
+                    markers.push(marker)
+                }
+            }
+            $('#netcardriver').html(d);
+            map.add(markers);
+
+            //订单数据
+            var zhuanche = order.zhuanche;
+            var kuacheng = order.kuacheng;
+            var chuzu = order.chuzu;
+            var kuahceng = order.kuahceng;
+            var o = '';
+            $('#order').html(o);
+            var zc = '<div class="list-group"><a href="#" class="list-group-item active">专车未接订单</a>'
+            for(var i in zhuanche){
+                zc += '<a href="#" class="list-group-item"><p class="list-group-item-text">起点:' + zhuanche[i].start + '</p><p class="list-group-item-text">终点:' + zhuanche[i].end + '</p>' +
+                    '<p class="list-group-item-text">下单时间:' + zhuanche[i].travelTime + '</p><p class="list-group-item-text">车型:' + zhuanche[i].carModel + '</p>' +
+                    '<p class="list-group-item-text">人数:' + zhuanche[i].num + '</p></a>';
+            }
+            zc += '</div>';
+            o += zc;
+
+            var kc = '<div class="list-group"><a href="#" class="list-group-item active">跨城出行未接订单</a>'
+            for(var i in kuacheng){
+                kc += '<a href="#" class="list-group-item"><p class="list-group-item-text">起点:' + kuacheng[i].start + '</p><p class="list-group-item-text">终点:' + kuacheng[i].end + '</p>' +
+                    '<p class="list-group-item-text">下单时间:' + kuacheng[i].travelTime + '</p><p class="list-group-item-text">车型:' + kuacheng[i].carModel + '</p>' +
+                    '<p class="list-group-item-text">人数:' + kuacheng[i].num + '</p></a>';
+            }
+            kc += '</div>';
+            o += kc;
+
+            var cz = '<div class="list-group"><a href="#" class="list-group-item active">出租车未接订单</a>'
+            for(var i in chuzu){
+                cz += '<a href="#" class="list-group-item"><p class="list-group-item-text">起点:' + chuzu[i].start + '</p><p class="list-group-item-text">终点:' + chuzu[i].end + '</p>' +
+                    '<p class="list-group-item-text">下单时间:' + chuzu[i].travelTime + '</p><p class="list-group-item-text">车型:' + chuzu[i].carModel + '</p>' +
+                    '<p class="list-group-item-text">人数:' + chuzu[i].num + '</p></a>';
+            }
+            cz += '</div>';
+            o += cz;
+
+            var cx = '<div class="list-group"><a href="#" class="list-group-item active">城乡出行未接订单</a>'
+            for(var i in kuahceng){
+                cx += '<a href="#" class="list-group-item"><p class="list-group-item-text">起点:' + kuahceng[i].start + '</p><p class="list-group-item-text">终点:' + kuahceng[i].end + '</p>' +
+                    '<p class="list-group-item-text">下单时间:' + kuahceng[i].travelTime + '</p><p class="list-group-item-text">车型:' + kuahceng[i].carModel + '</p>' +
+                    '<p class="list-group-item-text">人数:' + kuahceng[i].num + '</p></a>';
+            }
+            cx += '</div>';
+            o += cx;
+
+            $('#order').html(o);
+        }
+    })
+}
+
+
+
+Home.getAllOrder = function () {
+    $.ajax({
+        url: Feng.ctxPath + '/home/getAllOrder',
+        type: 'POST',
+        data: {
+            companyId: companyId,
+            uid: uid
+        },
+        success: function (res) {
+            var style = [{
+                url: 'https://a.amap.com/jsapi_demos/static/images/mass0.png',
+                anchor: new AMap.Pixel(6, 6),
+                size: new AMap.Size(11, 11)
+            }, {
+                url: 'https://a.amap.com/jsapi_demos/static/images/mass1.png',
+                anchor: new AMap.Pixel(4, 4),
+                size: new AMap.Size(7, 7)
+            }, {
+                url: 'https://a.amap.com/jsapi_demos/static/images/mass2.png',
+                anchor: new AMap.Pixel(3, 3),
+                size: new AMap.Size(5, 5)
+            }];
+
+            var mass = new AMap.MassMarks(citys, {
+                opacity: 0.8,
+                zIndex: 111,
+                cursor: 'pointer',
+                style: style
+            });
+
+            var marker = new AMap.Marker({content: ' ', map: map_});
+
+            mass.on('mouseover', function (e) {
+
+                marker.setPosition(e.data.lnglat);
+                marker.setLabel({content: e.data.name})
+            });
+
+            var data = [];
+            for(var i in res){
+                var obj = {
+                    lnglat: [res[i].lon, res[i].lat]
+                }
+                data.push(obj);
+            }
+            mass.setData(data);
+            mass.setMap(map_);
+        }
+    });
+}
+
+
+
+function getData1() {
+    var companyId = null;
+    var branchOffice1 = $('#branchOffice1').val();
+    if('' != branchOffice1  && null != branchOffice1){
+        companyId = branchOffice1;
+    }
+    Home.webSocketClient(companyId);
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/img/20210511-092352.JPG b/management/guns-admin/src/main/webapp/static/img/20210511-092352.JPG
new file mode 100644
index 0000000..de1fc76
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/20210511-092352.JPG
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/NoPIC.png b/management/guns-admin/src/main/webapp/static/img/NoPIC.png
new file mode 100644
index 0000000..a1a957e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/NoPIC.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/account.png b/management/guns-admin/src/main/webapp/static/img/account.png
new file mode 100644
index 0000000..764808e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/account.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/bg.png b/management/guns-admin/src/main/webapp/static/img/bg.png
new file mode 100644
index 0000000..73d102d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/boy.gif b/management/guns-admin/src/main/webapp/static/img/boy.gif
new file mode 100644
index 0000000..e1ba77e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/boy.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/girl.gif b/management/guns-admin/src/main/webapp/static/img/girl.gif
new file mode 100644
index 0000000..8ef9a59
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/girl.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/icon100.png b/management/guns-admin/src/main/webapp/static/img/icon100.png
new file mode 100644
index 0000000..adcfcb6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/icon100.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/icons.png b/management/guns-admin/src/main/webapp/static/img/icons.png
new file mode 100644
index 0000000..12e4700
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/index.png b/management/guns-admin/src/main/webapp/static/img/index.png
new file mode 100644
index 0000000..7d486ef
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/index.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/index1.png b/management/guns-admin/src/main/webapp/static/img/index1.png
new file mode 100644
index 0000000..7a76deb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/index1.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/index2.png b/management/guns-admin/src/main/webapp/static/img/index2.png
new file mode 100644
index 0000000..52bf8ba
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/index2.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/index4.png b/management/guns-admin/src/main/webapp/static/img/index4.png
new file mode 100644
index 0000000..ece22c7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/index4.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/loading-upload.gif b/management/guns-admin/src/main/webapp/static/img/loading-upload.gif
new file mode 100644
index 0000000..6fba776
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/loading-upload.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/locked.png b/management/guns-admin/src/main/webapp/static/img/locked.png
new file mode 100644
index 0000000..c831c1f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/locked.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/login-background.jpg b/management/guns-admin/src/main/webapp/static/img/login-background.jpg
new file mode 100644
index 0000000..adfa3f9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/login-background.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/logo.png b/management/guns-admin/src/main/webapp/static/img/logo.png
new file mode 100644
index 0000000..f628e5d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/logo.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/password.png b/management/guns-admin/src/main/webapp/static/img/password.png
new file mode 100644
index 0000000..5083b51
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/password.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/shangchuanpic.png b/management/guns-admin/src/main/webapp/static/img/shangchuanpic.png
new file mode 100644
index 0000000..bdc0e1c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/shangchuanpic.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/img/user.png b/management/guns-admin/src/main/webapp/static/img/user.png
new file mode 100644
index 0000000..7f77fd0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/img/user.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/bootstrap.min.js b/management/guns-admin/src/main/webapp/static/js/bootstrap.min.js
new file mode 100644
index 0000000..e364a13
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");
+d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
diff --git a/management/guns-admin/src/main/webapp/static/js/common/DateUtils.js b/management/guns-admin/src/main/webapp/static/js/common/DateUtils.js
new file mode 100644
index 0000000..c80481c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/common/DateUtils.js
@@ -0,0 +1,173 @@
+var DateUtils = {
+	/**
+     * 扩展Date 对象格式化方法
+     */
+    expandDate : function() {
+        Date.prototype.format = function(fmt)   
+        { //author: meizz   
+          var o = {   
+            "M+" : this.getMonth()+1,                 //月份   
+            "d+" : this.getDate(),                    //日   
+            "h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小时           
+            "H+" : this.getHours(),                   //小时 
+            "m+" : this.getMinutes(),                 //分   
+            "s+" : this.getSeconds(),                 //秒   
+            "q+" : Math.floor((this.getMonth()+3)/3), //季度   
+            "S"  : this.getMilliseconds()             //毫秒   
+          };   
+          if(/(y+)/.test(fmt))   
+            fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));   
+          for(var k in o)   
+            if(new RegExp("("+ k +")").test(fmt))   
+          fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));   
+          return fmt;   
+        }
+    },
+	/**
+	 * 获取具体年龄
+	 * @param {} beginStr
+	 * @param {} endStr
+	 * @return {}
+	 */
+	getAgeInfo: function (beginStr, endStr) {
+        var reg = new RegExp(/^(\d{1,4})(-|\/)(\d{1,2})(-|\/)(\d{1,2})(\s)(\d{1,2})(:)(\d{1,2})(:{0,1})(\d{0,2})$/);
+		var beginArr = beginStr.match(reg);
+		var endArr = endStr.match(reg);
+	
+		var days = 0;
+		var month = 0;
+		var year = 0;
+	
+		days = endArr[5] - beginArr[5];
+		if (days < 0) {
+			month = -1;
+			days = 30 + days;
+		}
+	
+		month = month + (endArr[3] - beginArr[3]);
+		if (month < 0) {
+			year = -1;
+			month = 12 + month;
+		}
+	
+		year = year + (endArr[1] - beginArr[1]);
+	
+		var yearString = year > 0 ? year + "岁" : "";
+		var mnthString = month > 0 ? month + "月" : "";
+		var dayString = days > 0 ? days + "天" : "";
+	
+		/*
+		 * 1 如果岁 大于等于1 那么年龄取 几岁 2 如果 岁等于0 但是月大于1 那么如果天等于0天小于3天 取小时 例如出生2天 就取 48小时
+		 */
+		var result = "";
+		if (year >= 1) {
+			result = yearString + mnthString;
+		} else {
+			if (month >= 1) {
+				result = days > 0 ? mnthString + dayString : mnthString;
+			} else {
+				var begDate = new Date(beginArr[1], beginArr[3] - 1, beginArr[5],
+						beginArr[7], beginArr[9], beginArr[11]);
+				var endDate = new Date(endArr[1], endArr[3] - 1, endArr[5],
+						endArr[7], endArr[9], endArr[11]);
+	
+				var between = (endDate.getTime() - begDate.getTime()) / 1000;
+				days = Math.floor(between / (24 * 3600));
+				var hours = Math.floor(between / 3600 - (days * 24));
+				var dayString = days > 0 ? days + "天" : "";
+				result = days >= 3 ? dayString : days * 24 + hours + "小时";
+			}
+		}
+	
+		return result;
+    },
+    /**
+     * 获取年龄,不满一天算天
+     * @param {} birthday
+     * @param {} today
+     * @return {}
+     */
+    getAge :function(birthday,today) {
+    	var reg = new RegExp(/^(\d{1,4})(-|\/)(\d{1,2})(-|\/)(\d{1,2})$/);
+    	var beginArr = birthday.match(reg);
+        var endArr = today.match(reg);
+    
+        var days = 0;
+        var month = 0;
+        var year = 0;
+    
+        days = endArr[5] - beginArr[5];
+        if (days < 0) {
+            month = -1;
+            days = 30 + days;
+        }
+    
+        month = month + (endArr[3] - beginArr[3]);
+        if (month < 0) {
+            year = -1;
+            month = 12 + month;
+        }
+    
+        year = year + (endArr[1] - beginArr[1]);
+    
+        var yearString = year > 0 ? year + "岁" : "";
+        var mnthString = month > 0 ? month + "月" : "";
+        var dayString = days > 0 ? days + "天" : "1天";
+        
+        /*
+         * 1 如果岁 大于等于1 那么年龄取 几岁 2 如果 岁等于0 但是月大于1 name取几月 3 如果不足月, 则取天数 4 不满一天算一天
+         */
+        var result = "";
+        if (year >= 1) {
+            result = yearString + mnthString + dayString;
+        } else {
+            if (month >= 1) {
+                result = days > 0 ? mnthString + dayString : mnthString;
+            } else {
+                result = dayString;
+            }
+        }
+        return result;
+    },
+    /**
+     * 获取月龄
+     * @param {} birthday
+     * @param {} today
+     * @return {}
+     */
+    getMonthage :function(birthday,today) {
+        var reg = new RegExp(/^(\d{1,4})(-|\/)(\d{1,2})(-|\/)(\d{1,2})$/);
+        var beginArr = birthday.match(reg);
+        var endArr = today.match(reg);
+    
+        var days = 0;
+        var month = 0;
+        var year = 0;
+    
+        days = endArr[5] - beginArr[5];
+        if (days < 0) {
+            month = -1;
+            days = 30 + days;
+        }
+    
+        month = month + (endArr[3] - beginArr[3]);
+        if (month < 0) {
+            year = -1;
+            month = 12 + month;
+        }
+    
+        year = year + (endArr[1] - beginArr[1]);
+    
+        var result = "";
+        if (year >= 1) {
+            result = (year * 12 + month + 1) + "个月";
+        } else {
+            if (month >= 1) {
+                result = (month + 1) + "个月";
+            } else {
+                result = "1个月";
+            }
+        }
+        return result;
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/common/Feng.js b/management/guns-admin/src/main/webapp/static/js/common/Feng.js
new file mode 100644
index 0000000..7af4423
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/common/Feng.js
@@ -0,0 +1,233 @@
+var Feng = {
+    ctxPath: "",
+    addCtx: function (ctx) {
+        if (this.ctxPath == "") {
+            this.ctxPath = ctx;
+        }
+    },
+    confirm: function (tip, ensure) {//询问框
+        parent.layer.confirm(tip, {
+            btn: ['确定', '取消']
+        }, function (index) {
+            ensure();
+            parent.layer.close(index);
+        }, function (index) {
+            parent.layer.close(index);
+        });
+    },
+    log: function (info) {
+        console.log(info);
+    },
+    alert: function (info, iconIndex) {
+        parent.layer.msg(info, {
+            icon: iconIndex
+        });
+    },
+    info: function (info) {
+        Feng.alert(info, 0);
+    },
+    success: function (info) {
+        Feng.alert(info, 1);
+    },
+    error: function (info) {
+        Feng.alert(info, 2);
+    },
+    infoDetail: function (title, info) {
+        var display = "";
+        if (typeof info == "string") {
+            display = info;
+        } else {
+            if (info instanceof Array) {
+                for (var x in info) {
+                    display = display + info[x] + "<br/>";
+                }
+            } else {
+                display = info;
+            }
+        }
+        parent.layer.open({
+            title: title,
+            type: 1,
+            skin: 'layui-layer-rim', //加上边框
+            area: ['950px', '600px'], //宽高
+            content: '<div style="padding: 20px;">' + display + '</div>'
+        });
+    },
+    writeObj: function (obj) {
+        var description = "";
+        for (var i in obj) {
+            var property = obj[i];
+            description += i + " = " + property + ",";
+        }
+        layer.alert(description, {
+            skin: 'layui-layer-molv',
+            closeBtn: 0
+        });
+    },
+    showInputTree: function (inputId, inputTreeContentId, leftOffset, rightOffset) {
+        var onBodyDown = function (event) {
+            if (!(event.target.id == "menuBtn" || event.target.id == inputTreeContentId || $(event.target).parents("#" + inputTreeContentId).length > 0)) {
+                $("#" + inputTreeContentId).fadeOut("fast");
+                $("body").unbind("mousedown", onBodyDown);// mousedown当鼠标按下就可以触发,不用弹起
+            }
+        };
+
+        if (leftOffset == undefined && rightOffset == undefined) {
+            var inputDiv = $("#" + inputId);
+            var inputDivOffset = $("#" + inputId).offset();
+            $("#" + inputTreeContentId).css({
+                left: inputDivOffset.left + "px",
+                top: inputDivOffset.top + inputDiv.outerHeight() + "px"
+            }).slideDown("fast");
+        } else {
+            $("#" + inputTreeContentId).css({
+                left: leftOffset + "px",
+                top: rightOffset + "px"
+            }).slideDown("fast");
+        }
+
+        $("body").bind("mousedown", onBodyDown);
+    },
+    baseAjax: function (url, tip) {
+        var ajax = new $ax(Feng.ctxPath + url, function (data) {
+            Feng.success(tip + "成功!");
+        }, function (data) {
+            Feng.error(tip + "失败!" + data.responseJSON.message + "!");
+        });
+        return ajax;
+    },
+    changeAjax: function (url) {
+        return Feng.baseAjax(url, "修改");
+    },
+    zTreeCheckedNodes: function (zTreeId) {
+        var zTree = $.fn.zTree.getZTreeObj(zTreeId);
+        var nodes = zTree.getCheckedNodes();
+        var ids = "";
+        for (var i = 0, l = nodes.length; i < l; i++) {
+            ids += "," + nodes[i].id;
+        }
+        return ids.substring(1);
+    },
+    eventParseObject: function (event) {//获取点击事件的源对象
+        event = event ? event : window.event;
+        var obj = event.srcElement ? event.srcElement : event.target;
+        return $(obj);
+    },
+    sessionTimeoutRegistry: function () {
+        $.ajaxSetup({
+            contentType: "application/x-www-form-urlencoded;charset=utf-8",
+            complete: function (XMLHttpRequest, textStatus) {
+                //通过XMLHttpRequest取得响应头,sessionstatus,
+                var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus");
+                if (sessionstatus == "timeout") {
+                    //如果超时就处理 ,指定要跳转的页面
+                    window.location = Feng.ctxPath + "/global/sessionError";
+                }
+            }
+        });
+    },
+    initValidator: function (formId, fields) {
+        $('#' + formId).bootstrapValidator({
+            feedbackIcons: {
+                valid: 'glyphicon glyphicon-ok',
+                invalid: 'glyphicon glyphicon-remove',
+                validating: 'glyphicon glyphicon-refresh'
+            },
+            fields: fields,
+            live: 'enabled',
+            message: '该字段不能为空'
+        });
+    },
+    underLineToCamel: function (str) {
+        var strArr = str.split('_');
+        for (var i = 1; i < strArr.length; i++) {
+            strArr[i] = strArr[i].charAt(0).toUpperCase() + strArr[i].substring(1);
+        }
+        var result = strArr.join('');
+        return result.charAt(0).toUpperCase() + result.substring(1);
+    },
+    randomNum: function (minNum, maxNum) {
+        switch (arguments.length) {
+            case 1:
+                return parseInt(Math.random() * minNum + 1, 10);
+                break;
+            case 2:
+                return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
+                break;
+            default:
+                return 0;
+                break;
+        }
+    },
+    newCrontab: function (href, menuName) {
+        var dataUrl = href;
+        var needCreateCrontab = true;
+
+        // 轮询已有的标签,判断是否已经存在标签
+        parent.$('.J_menuTab').each(function () {
+            if ($(this).data('id') == dataUrl) {
+                if (!$(this).hasClass('active')) {
+                    $(this).addClass('active').siblings('.J_menuTab').removeClass('active');
+                    parent.MyCrontab.scrollToTab(this);
+                    parent.MyCrontab.$('.J_mainContent .J_iframe').each(function () {
+                        if ($(this).data('id') == dataUrl) {
+                            $(this).show().siblings('.J_iframe').hide();
+                            $(this).attr('src', $(this).attr('src'));
+                            return false;
+                        }
+                    });
+                }
+                needCreateCrontab = false;
+                return false;
+            }
+        });
+
+        //创建标签
+        if (needCreateCrontab) {
+            var tabLink = '<a href="javascript:;" class="active J_menuTab" data-id="' + dataUrl + '">' + menuName + ' <i class="fa fa-times-circle"></i></a>';
+            parent.$('.J_menuTab').removeClass('active');
+            parent.$('.J_menuTabs .page-tabs-content').append(tabLink);
+
+            var iframeContent = '<iframe class="J_iframe" name="iframe' + Feng.randomNum(100,999) + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" seamless></iframe>';
+            parent.$('.J_mainContent').find('iframe.J_iframe').hide().parents('.J_mainContent').append(iframeContent);
+            parent.MyCrontab.scrollToTab($('.J_menuTab.active'));
+        }
+    },
+    /**
+     * 获取复选框选中值
+     */
+    checkBoxIds: function (tableId) {
+        var selected = $(tableId).bootstrapTable('getSelections');
+        var ids = '';
+        if (selected.length > 0) {
+            for (var i = 0; i < selected.length; i++) {
+                ids += selected[i]['id'] + ",";
+            }
+            ids = ids.substring(0, ids.length - 1);
+        }
+        return ids;
+    }
+};
+
+/**
+ * 图片弹出预览框(可选)
+ */
+window.operateEvents = {
+    'click .view': function (e, value, row) {
+        var imgUrl = value;
+        if(imgUrl != "") {
+            imgUrl = Feng.ctxPath + '/kaptcha/' + imgUrl;// 设置图片路径
+        } else {
+            imgUrl = Feng.ctxPath + '/static/img/NoPIC.png';// 默认无图
+        }
+        layer.open({
+            type: 1,
+            title: false,
+            closeBtn: 0,
+            area: 'auto',
+            skin: 'layui-layer-nobg', //没有背景色
+            shadeClose: true,
+            content: '<img src="' + imgUrl + '" height="100%" width="100%" />'
+        });
+    },
+};
diff --git a/management/guns-admin/src/main/webapp/static/js/common/ajax-object.js b/management/guns-admin/src/main/webapp/static/js/common/ajax-object.js
new file mode 100644
index 0000000..d3b88c0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/common/ajax-object.js
@@ -0,0 +1,66 @@
+(function () {
+	var $ax = function (url, success, error) {
+		this.url = url;
+		this.type = "post";
+		this.data = {};
+		this.dataType = "json";
+		this.async = false;
+		this.success = success;
+		this.error = error;
+	};
+	
+	$ax.prototype = {
+		start : function () {	
+			var me = this;
+			
+			if (this.url.indexOf("?") == -1) {
+				this.url = this.url + "?jstime=" + new Date().getTime();
+			} else {
+				this.url = this.url + "&jstime=" + new Date().getTime();
+			}
+			
+			$.ajax({
+		        type: this.type,
+		        url: this.url,
+		        dataType: this.dataType,
+		        async: this.async,
+		        data: this.data,
+				beforeSend: function(data) {
+					
+				},
+		        success: function(data) {
+		        	me.success(data);
+		        },
+		        error: function(data) {
+		        	me.error(data);
+		        }
+		    });
+		}, 
+		
+		set : function (key, value) {
+			if (typeof key == "object") {
+				for (var i in key) {
+					if (typeof i == "function")
+						continue;
+					this.data[i] = key[i];
+				}
+			} else {
+				this.data[key] = (typeof value == "undefined") ? $("#" + key).val() : value;
+			}
+			return this;
+		},
+		
+		setData : function(data){
+			this.data = data;
+			return this;
+		},
+		
+		clear : function () {
+			this.data = {};
+			return this;
+		}
+	};
+	
+	window.$ax = $ax;
+	
+} ());
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/common/bootstrap-table-object.js b/management/guns-admin/src/main/webapp/static/js/common/bootstrap-table-object.js
new file mode 100644
index 0000000..330280f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/common/bootstrap-table-object.js
@@ -0,0 +1,146 @@
+/**
+ * 初始化 BootStrap Table 的封装
+ *
+ * 约定:toolbar的id为 (bstableId + "Toolbar")
+ *  这两个参数可以获取到当前页的条数和页码
+ *  var pageSize=$('#tableId').bootstrapTable('getOptions').pageSize;
+ *  var pageNumber=$('#tableId').bootstrapTable('getOptions').pageNumber;
+ * @author fengshuonan
+ */
+(function () {
+    var BSTable = function (bstableId, url, columns) {
+        this.btInstance = null;					//jquery和BootStrapTable绑定的对象
+        this.bstableId = bstableId;
+        this.url = Feng.ctxPath + url;
+        this.method = "post";
+        this.paginationType = "server";			//默认分页方式是服务器分页,可选项"client"
+        this.toolbarId = bstableId + "Toolbar";
+        this.columns = columns;
+        this.height = 665;						//默认表格高度665
+        this.data = {};
+        this.queryParams = {}; // 向后台传递的自定义参数
+    };
+
+    BSTable.prototype = {
+        /**
+         * 初始化bootstrap table
+         */
+        init: function () {
+            var tableId = this.bstableId;
+            var me = this;
+            this.btInstance =
+                $('#' + tableId).bootstrapTable({
+                    contentType: "application/x-www-form-urlencoded",
+                    url: this.url,				//请求地址
+                    method: this.method,		//ajax方式,post还是get
+                    ajaxOptions: {				//ajax请求的附带参数
+                        data: this.data
+                    },
+                    toolbar: "#" + this.toolbarId,//顶部工具条
+                    striped: true,     			//是否显示行间隔色
+                    cache: false,      			//是否使用缓存,默认为true
+                    pagination: true,     		//是否显示分页(*)
+                    sortable: true,      		//是否启用排序
+                    sortOrder: "desc",     		//排序方式
+                    pageNumber: 1,      			//初始化加载第一页,默认第一页
+                    pageSize: 14,      			//每页的记录行数(*)
+                    pageList: [14, 50, 100],  	//可供选择的每页的行数(*)
+                    queryParamsType: 'limit', 	//默认值为 'limit' ,在默认情况下 传给服务端的参数为:offset,limit,sort
+                    queryParams: function (param) {
+                        return $.extend(me.queryParams, param);
+                    }, // 向后台传递的自定义参数
+                    sidePagination: this.paginationType,   //分页方式:client客户端分页,server服务端分页(*)
+                    search: false,      		//是否显示表格搜索,此搜索是客户端搜索,不会进服务端
+                    strictSearch: true,			//设置为 true启用 全匹配搜索,否则为模糊搜索
+                    showColumns: true,     		//是否显示所有的列
+                    showRefresh: true,     		//是否显示刷新按钮
+                    minimumCountColumns: 2,    	//最少允许的列数
+                    clickToSelect: true,    	//是否启用点击选中行
+                    searchOnEnterKey: true,		//设置为 true时,按回车触发搜索方法,否则自动触发搜索方法
+                    columns: this.columns,		//列数组
+                    pagination: true,			//是否显示分页条
+                    height: this.height,
+                    icons: {
+                        refresh: 'glyphicon-repeat',
+                        toggle: 'glyphicon-list-alt',
+                        columns: 'glyphicon-list'
+                    },
+                    iconSize: 'outline'
+                });
+            return this;
+        },
+        /**
+         * 向后台传递的自定义参数
+         * @param param
+         */
+        setQueryParams: function (param) {
+            this.queryParams = param;
+        },
+        /**
+         * 设置分页方式:server 或者 client
+         */
+        setPaginationType: function (type) {
+            this.paginationType = type;
+        },
+
+        /**
+         * 设置ajax post请求时候附带的参数
+         */
+        set: function (key, value) {
+            if (typeof key == "object") {
+                for (var i in key) {
+                    if (typeof i == "function")
+                        continue;
+                    this.data[i] = key[i];
+                }
+            } else {
+                this.data[key] = (typeof value == "undefined") ? $("#" + key).val() : value;
+            }
+            return this;
+        },
+
+        /**
+         * 设置ajax post请求时候附带的参数
+         */
+        setData: function (data) {
+            this.data = data;
+            return this;
+        },
+
+        /**
+         * 清空ajax post请求参数
+         */
+        clear: function () {
+            this.data = {};
+            return this;
+        },
+
+        /**
+         * 刷新 bootstrap 表格
+         * Refresh the remote server data,
+         * you can set {silent: true} to refresh the data silently,
+         * and set {url: newUrl} to change the url.
+         * To supply query params specific to this request, set {query: {foo: 'bar'}}
+         */
+        refresh: function (parms) {
+            if (typeof parms != "undefined") {
+                var startTime=parms['query']['beginTime'];
+                var endTime=parms['query']['endTime'];
+                if(startTime>endTime){
+                    Feng.info("搜索开始时间大于了结束时间");
+                }
+                var startTime_=parms['query']['beginTime_'];
+                var endTime_=parms['query']['endTime_'];
+                if(startTime_>endTime_){
+                    Feng.info("搜索开始时间大于了结束时间");
+                }
+                this.btInstance.bootstrapTable('refresh', parms);
+            } else {
+                this.btInstance.bootstrapTable('refresh');
+            }
+        }
+    };
+
+    window.BSTable = BSTable;
+
+}());
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/common/laydateChoose.js b/management/guns-admin/src/main/webapp/static/js/common/laydateChoose.js
new file mode 100644
index 0000000..2103855
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/common/laydateChoose.js
@@ -0,0 +1,30 @@
+var beginTime = laydate.render({
+    elem: '#beginTime',
+    // btns: ['confirm'],// 只要“确定”按钮,默认按钮的“现在、清空”和时间范围限制冲突
+    // done: function (value, date) {// 限制开始时间小于结束时间,取消注释
+    //     if (value != '') {
+    //         endTime.config.min.year = date.year;
+    //         endTime.config.min.month = date.month - 1;
+    //         endTime.config.min.date = date.date;
+    //     } else {
+    //         endTime.config.min.year = '';
+    //         endTime.config.min.month = '';
+    //         endTime.config.min.date = '';
+    //     }
+    // }
+});
+var endTime = laydate.render({
+    elem: '#endTime',
+    // btns: ['confirm'],// 只要“确定”按钮,默认按钮的“现在、清空”和时间范围限制冲突
+    // done: function (value, date) {// 限制结束时间大于开始时间,取消注释
+    //     if (value != '') {
+    //         beginTime.config.max.year = date.year;
+    //         beginTime.config.max.month = date.month - 1;
+    //         beginTime.config.max.date = date.date;
+    //     } else {
+    //         beginTime.config.max.year = '';
+    //         beginTime.config.max.month = '';
+    //         beginTime.config.max.date = '';
+    //     }
+    // }
+});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/common/select-list-object.js b/management/guns-admin/src/main/webapp/static/js/common/select-list-object.js
new file mode 100644
index 0000000..5ef2df1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/common/select-list-object.js
@@ -0,0 +1,36 @@
+var SelectList = {};
+SelectList.singelSelect = function (eleName, attr, data) {
+    var result = false;
+    $("#" + eleName).find("a").each(function (i, d) {
+        if ($(this).attr(attr) == data) {
+            if ($(this).hasClass('active')) {
+                $(this).removeClass('active');
+            } else {
+                $(this).addClass('active');
+                result = true;
+            }
+        } else {
+            $(this).removeClass('active');
+        }
+    });
+    return result;
+};
+SelectList.mutiSelect = function (eleName, attr, data) {
+    var result = false;
+    $("#" + eleName).find("a").each(function (i, d) {
+        if ($(this).attr(attr) == data) {
+            if ($(this).hasClass('active')) {
+                $(this).removeClass('active');
+            } else {
+                $(this).addClass('active');
+                result = true;
+            }
+        }
+    });
+    return result;
+};
+SelectList.clearSelect = function (eleName) {
+    $("#" + eleName).find("a").each(function (i, d) {
+        $(this).removeClass('active');
+    });
+};
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/common/tree-table-object.js b/management/guns-admin/src/main/webapp/static/js/common/tree-table-object.js
new file mode 100644
index 0000000..a67c6d9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/common/tree-table-object.js
@@ -0,0 +1,136 @@
+/**
+ * 初始化 Tree Table 的封装
+ *
+ * @author cyf
+ */
+(function () {
+    var BSTreeTable = function (bstableId, url, columns) {
+        this.btInstance = null;					//jquery和bootstrapTreeTable绑定的对象
+        this.bstableId = bstableId;
+        this.url = Feng.ctxPath + url;
+        this.method = "post";
+        this.columns = columns;
+        this.data = {};// ajax的参数
+        this.expandColumn = null;// 展开显示的列 
+        this.id = 'id';// 选取记录返回的值
+        this.code = 'code';// 用于设置父子关系
+        this.parentCode = 'pcode';// 用于设置父子关系
+        this.expandAll = false;// 是否默认全部展开
+        this.toolbarId = bstableId + "Toolbar";
+        this.height = 665;						//默认表格高度665
+    };
+
+    BSTreeTable.prototype = {
+        /**
+         * 初始化bootstrap table
+         */
+        init: function () {
+            var tableId = this.bstableId;
+            this.btInstance =
+                $('#'+tableId).bootstrapTreeTable({
+                    id: this.id,// 选取记录返回的值
+                    code: this.code,// 用于设置父子关系
+                    parentCode: this.parentCode,// 用于设置父子关系
+                    rootCodeValue: this.rootCodeValue,//设置根节点code值----可指定根节点,默认为null,"",0,"0"
+                    type: this.method, //请求数据的ajax类型
+                    url: this.url,   //请求数据的ajax的url
+                    ajaxParams: this.data, //请求数据的ajax的data属性
+                    expandColumn: this.expandColumn,//在哪一列上面显示展开按钮,从0开始
+                    striped: true,   //是否各行渐变色
+                    expandAll: this.expandAll,  //是否全部展开
+                    columns: this.columns,		//列数组
+                    toolbar: "#" + this.toolbarId,//顶部工具条
+                    height: this.height,
+                });
+            return this;
+        },
+
+        /**
+         * 设置在哪一列上面显示展开按钮,从0开始
+         */
+        setExpandColumn: function (expandColumn) {
+            this.expandColumn = expandColumn;
+        },
+        /**
+         * 设置记录返回的id值
+         */
+        setIdField: function (id) {
+            this.id = id;
+        },
+        /**
+         * 设置记录分级的字段
+         */
+        setCodeField: function (code) {
+            this.code = code;
+        },
+        /**
+         * 设置记录分级的父级字段
+         */
+        setParentCodeField: function (parentCode) {
+            this.parentCode = parentCode;
+        },
+        /**
+         * 设置根节点code值----可指定根节点,默认为null,"",0,"0"
+         */
+        setRootCodeValue: function (rootCodeValue) {
+            this.rootCodeValue = rootCodeValue;
+        },
+        /**
+         * 设置是否默认全部展开
+         */
+        setExpandAll: function (expandAll) {
+        	this.expandAll = expandAll;
+        },
+        /**
+         * 设置表格高度
+         */
+        setHeight: function (height) {
+        	this.height = height;
+        },
+        /**
+         * 设置ajax post请求时候附带的参数
+         */
+        set: function (key, value) {
+            if (typeof key == "object") {
+                for (var i in key) {
+                    if (typeof i == "function")
+                        continue;
+                    this.data[i] = key[i];
+                }
+            } else {
+                this.data[key] = (typeof value == "undefined") ? $("#" + key).val() : value;
+            }
+            return this;
+        },
+
+        /**
+         * 设置ajax post请求时候附带的参数
+         */
+        setData: function (data) {
+            this.data = data;
+            return this;
+        },
+
+        /**
+         * 清空ajax post请求参数
+         */
+        clear: function () {
+            this.data = {};
+            return this;
+        },
+
+        /**
+         * 刷新表格
+         */
+        refresh: function (parms) {
+            if (typeof parms != "undefined") {
+                this.btInstance.bootstrapTreeTable('refresh', parms.query);// 为了兼容bootstrap-table的写法
+            } else {
+                this.btInstance.bootstrapTreeTable('refresh');
+            }
+        }
+    };
+
+    window.BSTreeTable = BSTreeTable;
+
+}());
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/common/web-upload-file.js b/management/guns-admin/src/main/webapp/static/js/common/web-upload-file.js
new file mode 100644
index 0000000..2b714a5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/common/web-upload-file.js
@@ -0,0 +1,40 @@
+/**
+ * web-upload 工具类(上传文件+进度条)
+ */
+// 开始上传文件
+function UploadFileFn() {
+    $("#progressBarFile").html("0%").css("width", "0%");
+    var upFile = $("#upFile").get(0).files[0]; //input file标签
+    var formData = new FormData(); //创建FormData对象
+    var xhr = $.ajaxSettings.xhr(); //创建并返回XMLHttpRequest对象的回调函数(jQuery中$.ajax中的方法)
+    formData.append("file", upFile); //将上传name属性名(注意:一定要和 file元素中的name名相同),和file元素追加到FormData对象中去
+    $.ajax({
+        type: "POST",
+        url: Feng.ctxPath + "/upload/file", // 后端服务器上传地址
+        data: formData, // formData数据
+        cache: false, // 是否缓存
+        async: true, // 是否异步执行
+        processData: false, // 是否处理发送的数据  (必须false才会避开jQuery对 formdata 的默认处理)
+        contentType: false, // 是否设置Content-Type请求头
+        xhr: function () {
+            if (OnProgRess && xhr.upload) {
+                xhr.upload.addEventListener("progress", OnProgRess, false);
+                return xhr;
+            }
+        },
+        success: function (data) {
+            Feng.success("上传成功!");
+            $("#fileName").val(data);
+        },
+        error: function (data) {
+            Feng.error('上传失败!');
+        }
+    });
+};
+
+// 侦查附件上传情况 ,这个方法大概0.05-0.1秒执行一次
+function OnProgRess(event) {
+    var event = event || window.event;
+    var loaded = Math.floor(100 * (event.loaded / event.total)); //已经上传的百分比
+    $("#progressBarFile").html(loaded + "%").css("width", loaded + "%");
+};
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/common/web-upload-image.js b/management/guns-admin/src/main/webapp/static/js/common/web-upload-image.js
new file mode 100644
index 0000000..6356e46
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/common/web-upload-image.js
@@ -0,0 +1,124 @@
+/**
+ * web-upload 工具类(上传图片)
+ * 
+ * 约定:
+ * 上传按钮的id = 图片隐藏域id + 'BtnId'
+ * 图片预览框的id = 图片隐藏域id + 'PreId'
+ */
+(function() {
+	
+	var $WebUploadImage = function(pictureId) {
+		this.pictureId = pictureId;
+		this.uploadBtnId = pictureId + "BtnId";
+		this.uploadPreId = pictureId + "PreId";
+		this.uploadUrl = Feng.ctxPath + '/upload/image';
+		this.fileSizeLimit = 100 * 1024 * 1024;
+		this.picWidth = 800;
+		this.picHeight = 800;
+        this.uploadBarId = null;
+	};
+
+	$WebUploadImage.prototype = {
+		/**
+		 * 初始化webUploader
+		 */
+		init : function() {
+			var uploader = this.create();
+			this.bindEvent(uploader);
+			return uploader;
+		},
+		
+		/**
+		 * 创建webuploader对象
+		 */
+		create : function() {
+			var webUploader = WebUploader.create({
+				auto : true,
+				pick : {
+					id : '#' + this.uploadBtnId,
+					multiple : false,// 只上传一个
+				},
+				accept : {
+					title : 'Images',
+					extensions : 'gif,jpg,jpeg,bmp,png',
+                    mimeTypes : 'image/gif,image/jpg,image/jpeg,image/bmp,image/png'
+				},
+				swf : Feng.ctxPath
+						+ '/static/js/plugins/webuploader/Uploader.swf',
+				disableGlobalDnd : true,
+				duplicate : true,
+				server : this.uploadUrl,
+				fileSingleSizeLimit : this.fileSizeLimit
+			});
+			
+			return webUploader;
+		},
+
+		/**
+		 * 绑定事件
+		 */
+		bindEvent : function(bindedObj) {
+			var me =  this;
+			bindedObj.on('fileQueued', function(file) {
+				var $li = $('<div><img width="200px" height="200px"></div>');
+				var $img = $li.find('img');
+
+				$("#" + me.uploadPreId).html($li);
+
+				// 生成缩略图
+				bindedObj.makeThumb(file, function(error, src) {
+					if (error) {
+						$img.replaceWith('<span>不能预览</span>');
+						return;
+					}
+					$img.attr('src', src);
+				}, me.picWidth, me.picHeight);
+			});
+
+			// 文件上传过程中创建进度条实时显示。
+			bindedObj.on('uploadProgress', function(file, percentage) {
+                $("#"+me.uploadBarId).css("width",percentage * 100 + "%");
+			});
+
+			// 文件上传成功,给item添加成功class, 用样式标记上传成功。
+			bindedObj.on('uploadSuccess', function(file,response) {
+				Feng.success("上传成功");
+				$("#" + me.pictureId).val(response);
+			});
+
+			// 文件上传失败,显示上传出错。
+			bindedObj.on('uploadError', function(file) {
+				Feng.error("上传失败");
+			});
+
+			// 其他错误
+			bindedObj.on('error', function(type) {
+				if ("Q_EXCEED_SIZE_LIMIT" == type) {
+					Feng.error("文件大小超出了限制");
+				} else if ("Q_TYPE_DENIED" == type) {
+					Feng.error("文件类型不满足");
+				} else if ("Q_EXCEED_NUM_LIMIT" == type) {
+					Feng.error("上传数量超过限制");
+				} else if ("F_DUPLICATE" == type) {
+					Feng.error("图片选择重复");
+				} else {
+					Feng.error("上传过程中出错");
+				}
+			});
+
+			// 完成上传完了,成功或者失败
+			bindedObj.on('uploadComplete', function(file) {
+			});
+		},
+
+        /**
+         * 设置图片上传的进度条的id
+         */
+        setUploadBarId: function (id) {
+            this.uploadBarId = id;
+        }
+	};
+
+	window.$WebUploadImage = $WebUploadImage;
+
+}());
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/common/web-upload-object.js b/management/guns-admin/src/main/webapp/static/js/common/web-upload-object.js
new file mode 100644
index 0000000..1130036
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/common/web-upload-object.js
@@ -0,0 +1,126 @@
+/**
+ * web-upload 工具类(上传头像)
+ * 
+ * 约定:
+ * 上传按钮的id = 图片隐藏域id + 'BtnId'
+ * 图片预览框的id = 图片隐藏域id + 'PreId'
+ * 
+ * @author fengshuonan
+ */
+(function() {
+	
+	var $WebUpload = function(pictureId) {
+		this.pictureId = pictureId;
+		this.uploadBtnId = pictureId + "BtnId";
+		this.uploadPreId = pictureId + "PreId";
+		this.uploadUrl = Feng.ctxPath + '/upload/image';
+		this.fileSizeLimit = 100 * 1024 * 1024;
+		this.picWidth = 800;
+		this.picHeight = 800;
+        this.uploadBarId = null;
+	};
+
+	$WebUpload.prototype = {
+		/**
+		 * 初始化webUploader
+		 */
+		init : function() {
+			var uploader = this.create();
+			this.bindEvent(uploader);
+			return uploader;
+		},
+		
+		/**
+		 * 创建webuploader对象
+		 */
+		create : function() {
+			var webUploader = WebUploader.create({
+				auto : true,
+				pick : {
+					id : '#' + this.uploadBtnId,
+					multiple : false,// 只上传一个
+				},
+				accept : {
+					title : 'Images',
+					extensions : 'gif,jpg,jpeg,bmp,png',
+                    mimeTypes : 'image/gif,image/jpg,image/jpeg,image/bmp,image/png'
+				},
+				swf : Feng.ctxPath
+						+ '/static/js/plugins/webuploader/Uploader.swf',
+				disableGlobalDnd : true,
+				duplicate : true,
+				server : this.uploadUrl,
+				fileSingleSizeLimit : this.fileSizeLimit
+			});
+			
+			return webUploader;
+		},
+
+		/**
+		 * 绑定事件
+		 */
+		bindEvent : function(bindedObj) {
+			var me =  this;
+			bindedObj.on('fileQueued', function(file) {
+				var $li = $('<div><img width="100px" height="100px"></div>');
+				var $img = $li.find('img');
+
+				$("#" + me.uploadPreId).html($li);
+
+				// 生成缩略图
+				bindedObj.makeThumb(file, function(error, src) {
+					if (error) {
+						$img.replaceWith('<span>不能预览</span>');
+						return;
+					}
+					$img.attr('src', src);
+				}, me.picWidth, me.picHeight);
+			});
+
+			// 文件上传过程中创建进度条实时显示。
+			bindedObj.on('uploadProgress', function(file, percentage) {
+                $("#"+me.uploadBarId).css("width",percentage * 100 + "%");
+			});
+
+			// 文件上传成功,给item添加成功class, 用样式标记上传成功。
+			bindedObj.on('uploadSuccess', function(file,response) {
+				Feng.success("上传成功");
+				$("#" + me.pictureId).val(response);
+			});
+
+			// 文件上传失败,显示上传出错。
+			bindedObj.on('uploadError', function(file) {
+				Feng.error("上传失败");
+			});
+
+			// 其他错误
+			bindedObj.on('error', function(type) {
+				if ("Q_EXCEED_SIZE_LIMIT" == type) {
+					Feng.error("文件大小超出了限制");
+				} else if ("Q_TYPE_DENIED" == type) {
+					Feng.error("文件类型不满足");
+				} else if ("Q_EXCEED_NUM_LIMIT" == type) {
+					Feng.error("上传数量超过限制");
+				} else if ("F_DUPLICATE" == type) {
+					Feng.error("图片选择重复");
+				} else {
+					Feng.error("上传过程中出错");
+				}
+			});
+
+			// 完成上传完了,成功或者失败
+			bindedObj.on('uploadComplete', function(file) {
+			});
+		},
+
+        /**
+         * 设置图片上传的进度条的id
+         */
+        setUploadBarId: function (id) {
+            this.uploadBarId = id;
+        }
+	};
+
+	window.$WebUpload = $WebUpload;
+
+}());
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/common/ztree-object.js b/management/guns-admin/src/main/webapp/static/js/common/ztree-object.js
new file mode 100644
index 0000000..eee6cb2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/common/ztree-object.js
@@ -0,0 +1,94 @@
+/**
+ * ztree插件的封装
+ */
+(function() {
+
+	var $ZTree = function(id, url) {
+		this.id = id;
+		this.url = url;
+		this.onClick = null;
+		this.settings = null;
+		this.ondblclick=null;
+	};
+
+	$ZTree.prototype = {
+		/**
+		 * 初始化ztree的设置
+		 */
+		initSetting : function() {
+			var settings = {
+				view : {
+					dblClickExpand : true,
+					selectedMulti : false
+				},
+				data : {simpleData : {enable : true}},
+				callback : {
+					onClick : this.onClick,
+					onDblClick:this.ondblclick
+				}
+			};
+			return settings;
+		},
+
+		/**
+		 * 手动设置ztree的设置
+		 */
+		setSettings : function(val) {
+			this.settings = val;
+		},
+
+		/**
+		 * 初始化ztree
+		 */
+		init : function() {
+			var zNodeSeting = null;
+			if(this.settings != null){
+				zNodeSeting = this.settings;
+			}else{
+				zNodeSeting = this.initSetting();
+			}
+			var zNodes = this.loadNodes();
+			$.fn.zTree.init($("#" + this.id), zNodeSeting, zNodes);
+		},
+
+		/**
+		 * 绑定onclick事件
+		 */
+		bindOnClick : function(func) {
+			this.onClick = func;
+		},
+		/**
+		 * 绑定双击事件
+		 */
+		bindOnDblClick : function(func) {
+			this.ondblclick=func;
+		},
+
+
+		/**
+		 * 加载节点
+		 */
+		loadNodes : function() {
+			var zNodes = null;
+			var ajax = new $ax(Feng.ctxPath + this.url, function(data) {
+				zNodes = data;
+			}, function(data) {
+				Feng.error("加载ztree信息失败!");
+			});
+			ajax.start();
+			return zNodes;
+		},
+
+		/**
+		 * 获取选中的值
+		 */
+		getSelectedVal : function(){
+			var zTree = $.fn.zTree.getZTreeObj(this.id);
+			var nodes = zTree.getSelectedNodes();
+			return nodes[0].name;
+		}
+	};
+
+	window.$ZTree = $ZTree;
+
+}());
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/contabs.js b/management/guns-admin/src/main/webapp/static/js/contabs.js
new file mode 100644
index 0000000..1d4ebde
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/contabs.js
@@ -0,0 +1,339 @@
+var MyCrontab = {};
+
+
+/**
+ * 滚动到指定选项卡
+ */
+MyCrontab.scrollToTab = function (element) {
+    var marginLeftVal = MyCrontab.calSumWidth($(element).prevAll()),
+        marginRightVal = MyCrontab.calSumWidth($(element).nextAll());
+    // 可视区域非tab宽度
+    var tabOuterWidth = MyCrontab.calSumWidth($(".content-tabs").children().not(".J_menuTabs"));
+    //可视区域tab宽度
+    var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth;
+    //实际滚动宽度
+    var scrollVal = 0;
+    if ($(".page-tabs-content").outerWidth() < visibleWidth) {
+        scrollVal = 0;
+    } else if (marginRightVal <= (visibleWidth - $(element).outerWidth(true) - $(element).next().outerWidth(true))) {
+        if ((visibleWidth - $(element).next().outerWidth(true)) > marginRightVal) {
+            scrollVal = marginLeftVal;
+            var tabElement = element;
+            while ((scrollVal - $(tabElement).outerWidth()) > ($(".page-tabs-content").outerWidth() - visibleWidth)) {
+                scrollVal -= $(tabElement).prev().outerWidth();
+                tabElement = $(tabElement).prev();
+            }
+        }
+    } else if (marginLeftVal > (visibleWidth - $(element).outerWidth(true) - $(element).prev().outerWidth(true))) {
+        scrollVal = marginLeftVal - $(element).prev().outerWidth(true);
+    }
+    $('.page-tabs-content').animate({
+        marginLeft: 0 - scrollVal + 'px'
+    }, "fast");
+};
+
+
+/**
+ * 计算元素集合的总宽度
+ */
+MyCrontab.calSumWidth = function (elements) {
+    var width = 0;
+    $(elements).each(function () {
+        width += $(this).outerWidth(true);
+    });
+    return width;
+};
+
+
+$(function () {
+
+    //计算元素集合的总宽度
+    function calSumWidth(elements) {
+        MyCrontab.calSumWidth(elements);
+    }
+
+    //滚动到指定选项卡
+    function scrollToTab(element) {
+        MyCrontab.scrollToTab(element);
+    }
+
+    //查看左侧隐藏的选项卡
+    function scrollTabLeft() {
+        var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left')));
+        // 可视区域非tab宽度
+        var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".J_menuTabs"));
+        //可视区域tab宽度
+        var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth;
+        //实际滚动宽度
+        var scrollVal = 0;
+        if ($(".page-tabs-content").width() < visibleWidth) {
+            return false;
+        } else {
+            var tabElement = $(".J_menuTab:first");
+            var offsetVal = 0;
+            while ((offsetVal + $(tabElement).outerWidth(true)) <= marginLeftVal) {//找到离当前tab最近的元素
+                offsetVal += $(tabElement).outerWidth(true);
+                tabElement = $(tabElement).next();
+            }
+            offsetVal = 0;
+            if (calSumWidth($(tabElement).prevAll()) > visibleWidth) {
+                while ((offsetVal + $(tabElement).outerWidth(true)) < (visibleWidth) && tabElement.length > 0) {
+                    offsetVal += $(tabElement).outerWidth(true);
+                    tabElement = $(tabElement).prev();
+                }
+                scrollVal = calSumWidth($(tabElement).prevAll());
+            }
+        }
+        $('.page-tabs-content').animate({
+            marginLeft: 0 - scrollVal + 'px'
+        }, "fast");
+    }
+
+    //查看右侧隐藏的选项卡
+    function scrollTabRight() {
+        var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left')));
+        // 可视区域非tab宽度
+        var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".J_menuTabs"));
+        //可视区域tab宽度
+        var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth;
+        //实际滚动宽度
+        var scrollVal = 0;
+        if ($(".page-tabs-content").width() < visibleWidth) {
+            return false;
+        } else {
+            var tabElement = $(".J_menuTab:first");
+            var offsetVal = 0;
+            while ((offsetVal + $(tabElement).outerWidth(true)) <= marginLeftVal) {//找到离当前tab最近的元素
+                offsetVal += $(tabElement).outerWidth(true);
+                tabElement = $(tabElement).next();
+            }
+            offsetVal = 0;
+            while ((offsetVal + $(tabElement).outerWidth(true)) < (visibleWidth) && tabElement.length > 0) {
+                offsetVal += $(tabElement).outerWidth(true);
+                tabElement = $(tabElement).next();
+            }
+            scrollVal = calSumWidth($(tabElement).prevAll());
+            if (scrollVal > 0) {
+                $('.page-tabs-content').animate({
+                    marginLeft: 0 - scrollVal + 'px'
+                }, "fast");
+            }
+        }
+    }
+
+    //通过遍历给菜单项加上data-index属性
+    $(".J_menuItem").each(function (index) {
+        if (!$(this).attr('data-index')) {
+            $(this).attr('data-index', index);
+        }
+    });
+
+    function menuItem() {
+        // 获取标识数据
+        var dataUrl = $(this).attr('href'),
+            dataIndex = $(this).data('index'),
+            menuName = $.trim($(this).text()),
+            flag = true;
+        if (dataUrl == undefined || $.trim(dataUrl).length == 0) return false;
+
+        // 选项卡菜单已存在
+        $('.J_menuTab').each(function () {
+            if ($(this).data('id') == dataUrl) {
+                if (!$(this).hasClass('active')) {
+                    $(this).addClass('active').siblings('.J_menuTab').removeClass('active');
+                    scrollToTab(this);
+                    // 显示tab对应的内容区
+                    $('.J_mainContent .J_iframe').each(function () {
+                        if ($(this).data('id') == dataUrl) {
+                            $(this).show().siblings('.J_iframe').hide();
+                            $(this).attr('src', $(this).attr('src'));
+                            return false;
+                        }
+                    });
+                }
+                flag = false;
+                return false;
+            }
+        });
+
+        // 选项卡菜单不存在
+        if (flag) {
+            var str = '<a href="javascript:;" class="active J_menuTab" data-id="' + dataUrl + '">' + menuName + ' <i class="fa fa-times-circle"></i></a>';
+            $('.J_menuTab').removeClass('active');
+
+            // 添加选项卡对应的iframe
+            var str1 = '<iframe class="J_iframe" name="iframe' + dataIndex + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" seamless></iframe>';
+            $('.J_mainContent').find('iframe.J_iframe').hide().parents('.J_mainContent').append(str1);
+
+            //显示loading提示
+            var loading = layer.load();
+
+            $('.J_mainContent iframe:visible').load(function () {
+                //iframe加载完成后隐藏loading提示
+                layer.close(loading);
+            });
+            // 添加选项卡
+            $('.J_menuTabs .page-tabs-content').append(str);
+            scrollToTab($('.J_menuTab.active'));
+        }
+        return false;
+    }
+
+    $('.J_menuItem').on('click', menuItem);
+
+    // 关闭选项卡菜单
+    function closeTab() {
+        var closeTabId = $(this).parents('.J_menuTab').data('id');
+        var currentWidth = $(this).parents('.J_menuTab').width();
+
+        // 当前元素处于活动状态
+        if ($(this).parents('.J_menuTab').hasClass('active')) {
+
+            // 当前元素后面有同辈元素,使后面的一个元素处于活动状态
+            if ($(this).parents('.J_menuTab').next('.J_menuTab').size()) {
+
+                var activeId = $(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').data('id');
+                highLightMenuItem(activeId);  //高亮对应的tab菜单
+                $(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').addClass('active');
+
+                $('.J_mainContent .J_iframe').each(function () {
+                    if ($(this).data('id') == activeId) {
+                        $(this).show().siblings('.J_iframe').hide();
+                        return false;
+                    }
+                });
+
+                var marginLeftVal = parseInt($('.page-tabs-content').css('margin-left'));
+                if (marginLeftVal < 0) {
+                    $('.page-tabs-content').animate({
+                        marginLeft: (marginLeftVal + currentWidth) + 'px'
+                    }, "fast");
+                }
+
+                //  移除当前选项卡
+                $(this).parents('.J_menuTab').remove();
+
+                // 移除tab对应的内容区
+                $('.J_mainContent .J_iframe').each(function () {
+                    if ($(this).data('id') == closeTabId) {
+                        $(this).remove();
+                        return false;
+                    }
+                });
+            }
+
+            // 当前元素后面没有同辈元素,使当前元素的上一个元素处于活动状态
+            if ($(this).parents('.J_menuTab').prev('.J_menuTab').size()) {
+                var activeId = $(this).parents('.J_menuTab').prev('.J_menuTab:last').data('id');
+                $(this).parents('.J_menuTab').prev('.J_menuTab:last').addClass('active');
+                $('.J_mainContent .J_iframe').each(function () {
+                    if ($(this).data('id') == activeId) {
+                        $(this).show().siblings('.J_iframe').hide();
+                        return false;
+                    }
+                });
+
+                //  移除当前选项卡
+                $(this).parents('.J_menuTab').remove();
+
+                // 移除tab对应的内容区
+                $('.J_mainContent .J_iframe').each(function () {
+                    if ($(this).data('id') == closeTabId) {
+                        $(this).remove();
+                        return false;
+                    }
+                });
+                highLightMenuItem(activeId);//高亮对应的tab菜单
+            }
+        }
+        // 当前元素不处于活动状态
+        else {
+            //  移除当前选项卡
+            $(this).parents('.J_menuTab').remove();
+
+            // 移除相应tab对应的内容区
+            $('.J_mainContent .J_iframe').each(function () {
+                if ($(this).data('id') == closeTabId) {
+                    $(this).remove();
+                    return false;
+                }
+            });
+            scrollToTab($('.J_menuTab.active'));
+        }
+        return false;
+    }
+
+    $('.J_menuTabs').on('click', '.J_menuTab i', closeTab);
+
+    //关闭其他选项卡
+    function closeOtherTabs() {
+        $('.page-tabs-content').children("[data-id]").not(":first").not(".active").each(function () {
+            $('.J_iframe[data-id="' + $(this).data('id') + '"]').remove();
+            $(this).remove();
+        });
+        $('.page-tabs-content').css("margin-left", "0");
+    }
+
+    $('.J_tabCloseOther').on('click', closeOtherTabs);
+
+    //滚动到已激活的选项卡
+    function showActiveTab() {
+        scrollToTab($('.J_menuTab.active'));
+    }
+
+    $('.J_tabShowActive').on('click', showActiveTab);
+
+
+    // 点击选项卡菜单
+    function activeTab() {
+        if (!$(this).hasClass('active')) {
+            var currentId = $(this).data('id');
+            highLightMenuItem(currentId);  //高亮对应的tab菜单
+            // 显示tab对应的内容区
+            $('.J_mainContent .J_iframe').each(function () {
+                if ($(this).data('id') == currentId) {
+                    $(this).show().siblings('.J_iframe').hide();
+                    return false;
+                }
+            });
+            $(this).addClass('active').siblings('.J_menuTab').removeClass('active');
+            scrollToTab(this);
+        }
+    }
+
+    $('.J_menuTabs').on('click', '.J_menuTab', activeTab);
+
+    //刷新iframe
+    function refreshTab() {
+        var target = $('.J_iframe[data-id="' + $(this).data('id') + '"]');
+        var url = target.attr('src');
+        //显示loading提示
+        // var loading = layer.load();
+        // target.attr('src', url).load(function () {
+        //     //关闭loading提示
+        //     layer.close(loading);
+        // });
+    }
+
+    $('.J_menuTabs').on('dblclick', '.J_menuTab', refreshTab);
+
+    // 左移按扭
+    $('.J_tabLeft').on('click', scrollTabLeft);
+
+    // 右移按扭
+    $('.J_tabRight').on('click', scrollTabRight);
+
+    // 关闭全部
+    $('.J_tabCloseAll').on('click', function () {
+        $('.page-tabs-content').children("[data-id]").not(":first").each(function () {
+            $('.J_iframe[data-id="' + $(this).data('id') + '"]').remove();
+            $(this).remove();
+        });
+        $('.page-tabs-content').children("[data-id]:first").each(function () {
+            $('.J_iframe[data-id="' + $(this).data('id') + '"]').show();
+            $(this).addClass("active");
+        });
+        $('.page-tabs-content').css("margin-left", "0");
+    });
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/content.js b/management/guns-admin/src/main/webapp/static/js/content.js
new file mode 100644
index 0000000..8252e9f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/content.js
@@ -0,0 +1,98 @@
+var $parentNode = window.parent.document;
+
+function $childNode(name) {
+    return window.frames[name]
+}
+
+// tooltips
+$('.tooltip-demo').tooltip({
+    selector: "[data-toggle=tooltip]",
+    container: "body"
+});
+
+// 使用animation.css修改Bootstrap Modal
+$('.modal').appendTo("body");
+
+$("[data-toggle=popover]").popover();
+
+//折叠ibox
+$('.collapse-link').click(function () {
+    var ibox = $(this).closest('div.ibox');
+    var button = $(this).find('i');
+    var content = ibox.find('div.ibox-content');
+    content.slideToggle(200);
+    button.toggleClass('fa-chevron-up').toggleClass('fa-chevron-down');
+    ibox.toggleClass('').toggleClass('border-bottom');
+    setTimeout(function () {
+        ibox.resize();
+        ibox.find('[id^=map-]').resize();
+    }, 50);
+});
+
+//关闭ibox
+$('.close-link').click(function () {
+    var content = $(this).closest('div.ibox');
+    content.remove();
+});
+
+//判断当前页面是否在iframe中
+if (top == this) {
+    var gohome = '<div class="gohome"><a class="animated bounceInUp" href="' + Feng.ctxPath + '/" title="返回首页"><i class="fa fa-home"></i></a></div>';
+    $('body').append(gohome);
+}
+
+//animation.css
+function animationHover(element, animation) {
+    element = $(element);
+    element.hover(
+        function () {
+            element.addClass('animated ' + animation);
+        },
+        function () {
+            //动画完成之前移除class
+            window.setTimeout(function () {
+                element.removeClass('animated ' + animation);
+            }, 2000);
+        });
+}
+
+//拖动面板
+function WinMove() {
+    var element = "[class*=col]";
+    var handle = ".ibox-title";
+    var connect = "[class*=col]";
+    $(element).sortable({
+            handle: handle,
+            connectWith: connect,
+            tolerance: 'pointer',
+            forcePlaceholderSize: true,
+            opacity: 0.8,
+        })
+        .disableSelection();
+};
+
+$(function () {
+//初始化下拉框
+    var config = {
+        '.chosen-select': {},
+        '.chosen-select-deselect': {
+            allow_single_deselect: true
+        },
+        '.chosen-select-no-single': {
+            disable_search_threshold: 10
+        },
+        '.chosen-select-no-results': {
+            no_results_text: '没有要显示的数据!'
+        },
+        '.chosen-select-width': {
+            width: "95%"
+        }
+    }
+    for (var selector in config) {
+        $(selector).chosen(config[selector]);
+    }
+    $('.i-checks').iCheck({
+        checkboxClass: 'icheckbox_square-green',
+        radioClass: 'iradio_square-green',
+    });
+});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/hplus.js b/management/guns-admin/src/main/webapp/static/js/hplus.js
new file mode 100644
index 0000000..b639026
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/hplus.js
@@ -0,0 +1,294 @@
+//自定义js
+
+//公共配置
+
+
+$(document).ready(function () {
+
+    // MetsiMenu
+    $('#side-menu').metisMenu();
+    // 打开右侧边栏
+    $('.right-sidebar-toggle').click(function () {
+        $('#right-sidebar').toggleClass('sidebar-open');
+    });
+
+    // 右侧边栏使用slimscroll
+    $('.sidebar-container').slimScroll({
+        height: '100%',
+        railOpacity: 0.4,
+        wheelStep: 10
+    });
+
+    // 打开聊天窗口
+    $('.open-small-chat').click(function () {
+        $(this).children().toggleClass('fa-comments').toggleClass('fa-remove');
+        $('.small-chat-box').toggleClass('active');
+    });
+
+    // 聊天窗口使用slimscroll
+    $('.small-chat-box .content').slimScroll({
+        height: '234px',
+        railOpacity: 0.4
+    });
+
+    // Small todo handler
+    $('.check-link').click(function () {
+        var button = $(this).find('i');
+        var label = $(this).next('span');
+        button.toggleClass('fa-check-square').toggleClass('fa-square-o');
+        label.toggleClass('todo-completed');
+        return false;
+    });
+
+    //固定菜单栏
+    $(function () {
+        $('.sidebar-collapse').slimScroll({
+            height: '100%',
+            railOpacity: 0.9,
+            alwaysVisible: false
+        });
+    });
+
+
+    // 菜单切换
+    $('.navbar-minimalize').click(function () {
+        $("body").toggleClass("mini-navbar");
+        SmoothlyMenu();
+    });
+
+
+    // 侧边栏高度
+    function fix_height() {
+        var heightWithoutNavbar = $("body > #wrapper").height() - 61;
+        $(".sidebard-panel").css("min-height", heightWithoutNavbar + "px");
+    }
+    fix_height();
+
+    $(window).bind("load resize click scroll", function () {
+        if (!$("body").hasClass('body-small')) {
+            fix_height();
+        }
+    });
+
+    //侧边栏滚动
+    $(window).scroll(function () {
+        if ($(window).scrollTop() > 0 && !$('body').hasClass('fixed-nav')) {
+            $('#right-sidebar').addClass('sidebar-top');
+        } else {
+            $('#right-sidebar').removeClass('sidebar-top');
+        }
+    });
+
+    $('.full-height-scroll').slimScroll({
+        height: '100%'
+    });
+
+    $('#side-menu>li').click(function () {
+        if ($('body').hasClass('mini-navbar')) {
+            NavToggle();
+        }
+    });
+    $('#side-menu>li li a').click(function () {
+        if ($(window).width() < 769) {
+            NavToggle();
+        }
+    });
+
+    //点击菜单的时候高亮显示菜单
+    $("a[name='tabMenuItem']").click(function(){
+        clearTabMenuItem();
+        $(this).addClass("tab-menu-selected");
+    });
+
+    $('.nav-close').click(NavToggle);
+
+    //ios浏览器兼容性处理
+    if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
+        $('#content-main').css('overflow-y', 'auto');
+    }
+
+});
+
+$(window).bind("load resize", function () {
+    if ($(this).width() < 769) {
+        $('body').addClass('mini-navbar');
+        $('.navbar-static-side').fadeIn();
+    }
+});
+
+function clearTabMenuItem(){
+    $("a[name='tabMenuItem']").each(function(){
+        $(this).removeClass("tab-menu-selected");
+    });
+}
+
+function highLightMenuItem(hrefVal){
+    clearTabMenuItem();
+    $("a[href='" + hrefVal + "']").addClass("tab-menu-selected");
+}
+
+function NavToggle() {
+    $('.navbar-minimalize').trigger('click');
+}
+
+function SmoothlyMenu() {
+    if (!$('body').hasClass('mini-navbar')) {
+        $('#side-menu').hide();
+        setTimeout(
+            function () {
+                $('#side-menu').fadeIn(500);
+            }, 100);
+    } else if ($('body').hasClass('fixed-sidebar')) {
+        $('#side-menu').hide();
+        setTimeout(
+            function () {
+                $('#side-menu').fadeIn(500);
+            }, 300);
+    } else {
+        $('#side-menu').removeAttr('style');
+    }
+}
+
+
+//主题设置
+$(function () {
+
+    // 顶部菜单固定
+    $('#fixednavbar').click(function () {
+        if ($('#fixednavbar').is(':checked')) {
+            $(".navbar-static-top").removeClass('navbar-static-top').addClass('navbar-fixed-top');
+            $("body").removeClass('boxed-layout');
+            $("body").addClass('fixed-nav');
+            $('#boxedlayout').prop('checked', false);
+
+            if (localStorageSupport) {
+                localStorage.setItem("boxedlayout", 'off');
+            }
+
+            if (localStorageSupport) {
+                localStorage.setItem("fixednavbar", 'on');
+            }
+        } else {
+            $(".navbar-fixed-top").removeClass('navbar-fixed-top').addClass('navbar-static-top');
+            $("body").removeClass('fixed-nav');
+
+            if (localStorageSupport) {
+                localStorage.setItem("fixednavbar", 'off');
+            }
+        }
+    });
+
+
+    // 收起左侧菜单
+    $('#collapsemenu').click(function () {
+        if ($('#collapsemenu').is(':checked')) {
+            $("body").addClass('mini-navbar');
+            SmoothlyMenu();
+
+            if (localStorageSupport) {
+                localStorage.setItem("collapse_menu", 'on');
+            }
+
+        } else {
+            $("body").removeClass('mini-navbar');
+            SmoothlyMenu();
+
+            if (localStorageSupport) {
+                localStorage.setItem("collapse_menu", 'off');
+            }
+        }
+    });
+
+    // 固定宽度
+    $('#boxedlayout').click(function () {
+        if ($('#boxedlayout').is(':checked')) {
+            $("body").addClass('boxed-layout');
+            $('#fixednavbar').prop('checked', false);
+            $(".navbar-fixed-top").removeClass('navbar-fixed-top').addClass('navbar-static-top');
+            $("body").removeClass('fixed-nav');
+            if (localStorageSupport) {
+                localStorage.setItem("fixednavbar", 'off');
+            }
+
+
+            if (localStorageSupport) {
+                localStorage.setItem("boxedlayout", 'on');
+            }
+        } else {
+            $("body").removeClass('boxed-layout');
+
+            if (localStorageSupport) {
+                localStorage.setItem("boxedlayout", 'off');
+            }
+        }
+    });
+
+    // 默认主题
+    $('.s-skin-0').click(function () {
+        $("body").removeClass("skin-1");
+        $("body").removeClass("skin-2");
+        $("body").removeClass("skin-3");
+        return false;
+    });
+
+    // 蓝色主题
+    $('.s-skin-1').click(function () {
+        $("body").removeClass("skin-2");
+        $("body").removeClass("skin-3");
+        $("body").addClass("skin-1");
+        return false;
+    });
+
+    // 黄色主题
+    $('.s-skin-3').click(function () {
+        $("body").removeClass("skin-1");
+        $("body").removeClass("skin-2");
+        $("body").addClass("skin-3");
+        return false;
+    });
+
+    if (localStorageSupport) {
+        var collapse = localStorage.getItem("collapse_menu");
+        var fixednavbar = localStorage.getItem("fixednavbar");
+        var boxedlayout = localStorage.getItem("boxedlayout");
+
+        if (collapse == 'on') {
+            $('#collapsemenu').prop('checked', 'checked')
+        }
+        if (fixednavbar == 'on') {
+            $('#fixednavbar').prop('checked', 'checked')
+        }
+        if (boxedlayout == 'on') {
+            $('#boxedlayout').prop('checked', 'checked')
+        }
+    }
+
+    if (localStorageSupport) {
+
+        var collapse = localStorage.getItem("collapse_menu");
+        var fixednavbar = localStorage.getItem("fixednavbar");
+        var boxedlayout = localStorage.getItem("boxedlayout");
+
+        var body = $('body');
+
+        if (collapse == 'on') {
+            if (!body.hasClass('body-small')) {
+                body.addClass('mini-navbar');
+            }
+        }
+
+        if (fixednavbar == 'on') {
+            $(".navbar-static-top").removeClass('navbar-static-top').addClass('navbar-fixed-top');
+            body.addClass('fixed-nav');
+        }
+
+        if (boxedlayout == 'on') {
+            body.addClass('boxed-layout');
+        }
+    }
+});
+
+//判断浏览器是否支持html5本地存储
+function localStorageSupport() {
+    return (('localStorage' in window) && window['localStorage'] !== null)
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/jquery.min.js b/management/guns-admin/src/main/webapp/static/js/jquery.min.js
new file mode 100644
index 0000000..49990d6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
+return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},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(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{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":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
+void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.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(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});
diff --git a/management/guns-admin/src/main/webapp/static/js/jquery.min.map b/management/guns-admin/src/main/webapp/static/js/jquery.min.map
new file mode 100644
index 0000000..0056ad2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/jquery.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"jquery-2.1.4.min.js","sources":["jquery-2.1.4.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","support","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","call","get","num","pushStack","elems","ret","merge","prevObject","each","callback","args","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","options","name","src","copy","copyIsArray","clone","target","deep","isFunction","isPlainObject","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","Array","isWindow","isNumeric","parseFloat","nodeType","isEmptyObject","globalEval","code","script","indirect","eval","trim","createElement","text","head","appendChild","parentNode","removeChild","camelCase","string","nodeName","toLowerCase","value","isArraylike","makeArray","results","Object","inArray","second","grep","invert","callbackInverse","matches","callbackExpect","arg","guid","proxy","tmp","now","Date","split","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","MAX_NEGATIVE","pop","push_native","list","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","unloadHandler","childNodes","e","els","seed","match","m","groups","old","nid","newContext","newSelector","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","getAttribute","setAttribute","toSelector","testContext","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","div","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","parent","doc","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","div1","defaultValue","unique","isXMLDoc","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","is","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","next","prev","until","truncate","sibling","n","targets","l","closest","pos","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","siblings","contentDocument","reverse","rnotwhite","optionsCache","createOptions","object","flag","Callbacks","memory","fired","firing","firingStart","firingLength","firingIndex","stack","once","fire","data","stopOnFalse","disable","remove","lock","locked","fireWith","Deferred","func","tuples","state","promise","always","deferred","fail","then","fns","newDefer","tuple","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","resolveWith","progressContexts","resolveContexts","readyList","readyWait","holdReady","hold","wait","triggerHandler","off","completed","removeEventListener","readyState","setTimeout","access","chainable","emptyGet","raw","bulk","acceptData","owner","Data","defineProperty","uid","accepts","descriptor","unlock","defineProperties","set","prop","stored","camel","hasData","discard","data_priv","data_user","rbrace","rmultiDash","dataAttr","parseJSON","removeData","_data","_removeData","camelKey","queue","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","cssExpand","isHidden","el","css","rcheckableType","fragment","createDocumentFragment","checkClone","cloneNode","noCloneChecked","strundefined","focusinBubbles","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","event","types","handleObjIn","eventHandle","events","t","handleObj","special","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","trigger","onlyHandlers","bubbleType","ontype","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","props","fixHooks","keyHooks","original","which","charCode","keyCode","mouseHooks","eventDoc","body","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","originalEvent","fixHook","load","blur","click","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","timeStamp","stopImmediatePropagation","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","relatedTarget","attaches","on","one","origFn","rxhtmlTag","rtagName","rhtml","rnoInnerhtml","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","option","thead","col","tr","td","optgroup","tbody","tfoot","colgroup","caption","th","manipulationTarget","content","disableScript","restoreScript","setGlobalEval","refElements","cloneCopyEvent","dest","pdataOld","pdataCur","udataOld","udataCur","getAll","fixInput","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","buildFragment","scripts","selection","wrap","nodes","createTextNode","cleanData","append","domManip","prepend","insertBefore","before","after","keepData","html","replaceWith","replaceChild","detach","hasScripts","iNoClone","_evalUrl","appendTo","prependTo","insertAfter","replaceAll","insert","iframe","elemdisplay","actualDisplay","style","display","getDefaultComputedStyle","defaultDisplay","write","close","rmargin","rnumnonpx","getStyles","opener","getComputedStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","addGetHookIf","conditionFn","hookFn","pixelPositionVal","boxSizingReliableVal","container","backgroundClip","clearCloneStyle","cssText","computePixelPositionAndBoxSizingReliable","divStyle","pixelPosition","boxSizingReliable","reliableMarginRight","marginDiv","marginRight","swap","rdisplayswap","rnumsplit","rrelNum","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","vendorPropName","capName","origName","setPositiveNumber","subtract","max","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","offsetWidth","offsetHeight","showHide","show","hidden","cssHooks","opacity","cssNumber","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","order","orphans","widows","zIndex","zoom","cssProps","float","margin","padding","border","prefix","suffix","expand","expanded","parts","hide","toggle","Tween","easing","unit","propHooks","run","percent","eased","duration","step","tween","fx","linear","p","swing","cos","PI","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","*","createTween","scale","maxIterations","createFxNow","genFx","includeWidth","height","animation","collection","opts","oldfire","checkDisplay","anim","dataShow","unqueued","overflow","overflowX","overflowY","propFilter","specialEasing","Animation","properties","stopped","tick","currentTime","startTime","tweens","originalProperties","originalOptions","gotoEnd","rejectWith","timer","complete","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","clearInterval","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","optDisabled","radioValue","nodeHook","boolHook","removeAttr","nType","attrHooks","propName","attrNames","propFix","getter","rfocusable","removeProp","for","class","notxml","hasAttribute","rclass","addClass","classes","clazz","finalValue","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","rreturn","valHooks","optionSet","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","nonce","rquery","JSON","parse","parseXML","DOMParser","parseFromString","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","prefilters","transports","allTypes","ajaxLocation","ajaxLocParts","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","ajaxHandleResponses","s","responses","ct","finalDataType","firstDataType","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","active","lastModified","etag","url","isLocal","processData","async","contentType","json","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","fireGlobals","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","status","abort","statusText","finalText","success","method","crossDomain","param","traditional","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","modified","getJSON","getScript","throws","wrapAll","firstElementChild","wrapInner","unwrap","visible","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","v","encodeURIComponent","serialize","serializeArray","xhr","XMLHttpRequest","xhrId","xhrCallbacks","xhrSuccessStatus",1223,"xhrSupported","cors","open","username","xhrFields","onload","onerror","responseText","text script","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","parsed","_load","params","animated","getWindow","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","left","using","win","box","getBoundingClientRect","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAcC,SAAUA,EAAQC,GAEK,gBAAXC,SAAiD,gBAAnBA,QAAOC,QAQhDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,KAAM,IAAIE,OAAO,2CAElB,OAAOL,GAASI,IAGlBJ,EAASD,IAIS,mBAAXO,QAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAQnE,GAAIC,MAEAC,EAAQD,EAAIC,MAEZC,EAASF,EAAIE,OAEbC,EAAOH,EAAIG,KAEXC,EAAUJ,EAAII,QAEdC,KAEAC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,KAMHf,EAAWG,EAAOH,SAElBgB,EAAU,QAGVC,EAAS,SAAUC,EAAUC,GAG5B,MAAO,IAAIF,GAAOG,GAAGC,KAAMH,EAAUC,IAKtCG,EAAQ,qCAGRC,EAAY,QACZC,EAAa,eAGbC,EAAa,SAAUC,EAAKC,GAC3B,MAAOA,GAAOC,cAGhBX,GAAOG,GAAKH,EAAOY,WAElBC,OAAQd,EAERe,YAAad,EAGbC,SAAU,GAGVc,OAAQ,EAERC,QAAS,WACR,MAAO1B,GAAM2B,KAAM9B,OAKpB+B,IAAK,SAAUC,GACd,MAAc,OAAPA,EAGE,EAANA,EAAUhC,KAAMgC,EAAMhC,KAAK4B,QAAW5B,KAAMgC,GAG9C7B,EAAM2B,KAAM9B,OAKdiC,UAAW,SAAUC,GAGpB,GAAIC,GAAMtB,EAAOuB,MAAOpC,KAAK2B,cAAeO,EAO5C,OAJAC,GAAIE,WAAarC,KACjBmC,EAAIpB,QAAUf,KAAKe,QAGZoB,GAMRG,KAAM,SAAUC,EAAUC,GACzB,MAAO3B,GAAOyB,KAAMtC,KAAMuC,EAAUC,IAGrCC,IAAK,SAAUF,GACd,MAAOvC,MAAKiC,UAAWpB,EAAO4B,IAAIzC,KAAM,SAAU0C,EAAMC,GACvD,MAAOJ,GAAST,KAAMY,EAAMC,EAAGD,OAIjCvC,MAAO,WACN,MAAOH,MAAKiC,UAAW9B,EAAMyC,MAAO5C,KAAM6C,aAG3CC,MAAO,WACN,MAAO9C,MAAK+C,GAAI,IAGjBC,KAAM,WACL,MAAOhD,MAAK+C,GAAI,KAGjBA,GAAI,SAAUJ,GACb,GAAIM,GAAMjD,KAAK4B,OACdsB,GAAKP,GAAU,EAAJA,EAAQM,EAAM,EAC1B,OAAOjD,MAAKiC,UAAWiB,GAAK,GAASD,EAAJC,GAAYlD,KAAKkD,SAGnDC,IAAK,WACJ,MAAOnD,MAAKqC,YAAcrC,KAAK2B,YAAY,OAK5CtB,KAAMA,EACN+C,KAAMlD,EAAIkD,KACVC,OAAQnD,EAAImD,QAGbxC,EAAOyC,OAASzC,EAAOG,GAAGsC,OAAS,WAClC,GAAIC,GAASC,EAAMC,EAAKC,EAAMC,EAAaC,EAC1CC,EAAShB,UAAU,OACnBF,EAAI,EACJf,EAASiB,UAAUjB,OACnBkC,GAAO,CAsBR,KAnBuB,iBAAXD,KACXC,EAAOD,EAGPA,EAAShB,UAAWF,OACpBA,KAIsB,gBAAXkB,IAAwBhD,EAAOkD,WAAWF,KACrDA,MAIIlB,IAAMf,IACViC,EAAS7D,KACT2C,KAGWf,EAAJe,EAAYA,IAEnB,GAAmC,OAA7BY,EAAUV,UAAWF,IAE1B,IAAMa,IAAQD,GACbE,EAAMI,EAAQL,GACdE,EAAOH,EAASC,GAGXK,IAAWH,IAKXI,GAAQJ,IAAU7C,EAAOmD,cAAcN,KAAUC,EAAc9C,EAAOoD,QAAQP,MAC7EC,GACJA,GAAc,EACdC,EAAQH,GAAO5C,EAAOoD,QAAQR,GAAOA,MAGrCG,EAAQH,GAAO5C,EAAOmD,cAAcP,GAAOA,KAI5CI,EAAQL,GAAS3C,EAAOyC,OAAQQ,EAAMF,EAAOF,IAGzBQ,SAATR,IACXG,EAAQL,GAASE,GAOrB,OAAOG,IAGRhD,EAAOyC,QAENa,QAAS,UAAavD,EAAUwD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,KAAM,IAAI3E,OAAO2E,IAGlBC,KAAM,aAENX,WAAY,SAAUY,GACrB,MAA4B,aAArB9D,EAAO+D,KAAKD,IAGpBV,QAASY,MAAMZ,QAEfa,SAAU,SAAUH,GACnB,MAAc,OAAPA,GAAeA,IAAQA,EAAI5E,QAGnCgF,UAAW,SAAUJ,GAKpB,OAAQ9D,EAAOoD,QAASU,IAAUA,EAAMK,WAAYL,GAAQ,GAAM,GAGnEX,cAAe,SAAUW,GAKxB,MAA4B,WAAvB9D,EAAO+D,KAAMD,IAAsBA,EAAIM,UAAYpE,EAAOiE,SAAUH,IACjE,EAGHA,EAAIhD,cACNlB,EAAOqB,KAAM6C,EAAIhD,YAAYF,UAAW,kBACnC,GAKD,GAGRyD,cAAe,SAAUP,GACxB,GAAInB,EACJ,KAAMA,IAAQmB,GACb,OAAO,CAER,QAAO,GAGRC,KAAM,SAAUD,GACf,MAAY,OAAPA,EACGA,EAAM,GAGQ,gBAARA,IAAmC,kBAARA,GACxCpE,EAAYC,EAASsB,KAAK6C,KAAU,eAC7BA,IAITQ,WAAY,SAAUC,GACrB,GAAIC,GACHC,EAAWC,IAEZH,GAAOvE,EAAO2E,KAAMJ,GAEfA,IAIgC,IAA/BA,EAAK9E,QAAQ,eACjB+E,EAASzF,EAAS6F,cAAc,UAChCJ,EAAOK,KAAON,EACdxF,EAAS+F,KAAKC,YAAaP,GAASQ,WAAWC,YAAaT,IAI5DC,EAAUF,KAQbW,UAAW,SAAUC,GACpB,MAAOA,GAAO1B,QAASnD,EAAW,OAAQmD,QAASlD,EAAYC,IAGhE4E,SAAU,SAAUvD,EAAMc,GACzB,MAAOd,GAAKuD,UAAYvD,EAAKuD,SAASC,gBAAkB1C,EAAK0C,eAI9D5D,KAAM,SAAUqC,EAAKpC,EAAUC,GAC9B,GAAI2D,GACHxD,EAAI,EACJf,EAAS+C,EAAI/C,OACbqC,EAAUmC,EAAazB,EAExB,IAAKnC,GACJ,GAAKyB,GACJ,KAAYrC,EAAJe,EAAYA,IAGnB,GAFAwD,EAAQ5D,EAASK,MAAO+B,EAAKhC,GAAKH,GAE7B2D,KAAU,EACd,UAIF,KAAMxD,IAAKgC,GAGV,GAFAwB,EAAQ5D,EAASK,MAAO+B,EAAKhC,GAAKH,GAE7B2D,KAAU,EACd,UAOH,IAAKlC,GACJ,KAAYrC,EAAJe,EAAYA,IAGnB,GAFAwD,EAAQ5D,EAAST,KAAM6C,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpCwD,KAAU,EACd,UAIF,KAAMxD,IAAKgC,GAGV,GAFAwB,EAAQ5D,EAAST,KAAM6C,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpCwD,KAAU,EACd,KAMJ,OAAOxB,IAIRa,KAAM,SAAUE,GACf,MAAe,OAARA,EACN,IACEA,EAAO,IAAKpB,QAASpD,EAAO,KAIhCmF,UAAW,SAAUnG,EAAKoG,GACzB,GAAInE,GAAMmE,KAaV,OAXY,OAAPpG,IACCkG,EAAaG,OAAOrG,IACxBW,EAAOuB,MAAOD,EACE,gBAARjC,IACLA,GAAQA,GAGXG,EAAKyB,KAAMK,EAAKjC,IAIXiC,GAGRqE,QAAS,SAAU9D,EAAMxC,EAAKyC,GAC7B,MAAc,OAAPzC,EAAc,GAAKI,EAAQwB,KAAM5B,EAAKwC,EAAMC,IAGpDP,MAAO,SAAUU,EAAO2D,GAKvB,IAJA,GAAIxD,IAAOwD,EAAO7E,OACjBsB,EAAI,EACJP,EAAIG,EAAMlB,OAECqB,EAAJC,EAASA,IAChBJ,EAAOH,KAAQ8D,EAAQvD,EAKxB,OAFAJ,GAAMlB,OAASe,EAERG,GAGR4D,KAAM,SAAUxE,EAAOK,EAAUoE,GAShC,IARA,GAAIC,GACHC,KACAlE,EAAI,EACJf,EAASM,EAAMN,OACfkF,GAAkBH,EAIP/E,EAAJe,EAAYA,IACnBiE,GAAmBrE,EAAUL,EAAOS,GAAKA,GACpCiE,IAAoBE,GACxBD,EAAQxG,KAAM6B,EAAOS,GAIvB,OAAOkE,IAIRpE,IAAK,SAAUP,EAAOK,EAAUwE,GAC/B,GAAIZ,GACHxD,EAAI,EACJf,EAASM,EAAMN,OACfqC,EAAUmC,EAAalE,GACvBC,IAGD,IAAK8B,EACJ,KAAYrC,EAAJe,EAAYA,IACnBwD,EAAQ5D,EAAUL,EAAOS,GAAKA,EAAGoE,GAEnB,MAATZ,GACJhE,EAAI9B,KAAM8F,OAMZ,KAAMxD,IAAKT,GACViE,EAAQ5D,EAAUL,EAAOS,GAAKA,EAAGoE,GAEnB,MAATZ,GACJhE,EAAI9B,KAAM8F,EAMb,OAAO/F,GAAOwC,SAAWT,IAI1B6E,KAAM,EAINC,MAAO,SAAUjG,EAAID,GACpB,GAAImG,GAAK1E,EAAMyE,CAUf,OARwB,gBAAZlG,KACXmG,EAAMlG,EAAID,GACVA,EAAUC,EACVA,EAAKkG,GAKArG,EAAOkD,WAAY/C,IAKzBwB,EAAOrC,EAAM2B,KAAMe,UAAW,GAC9BoE,EAAQ,WACP,MAAOjG,GAAG4B,MAAO7B,GAAWf,KAAMwC,EAAKpC,OAAQD,EAAM2B,KAAMe,cAI5DoE,EAAMD,KAAOhG,EAAGgG,KAAOhG,EAAGgG,MAAQnG,EAAOmG,OAElCC,GAZC/C,QAeTiD,IAAKC,KAAKD,IAIVxG,QAASA,IAIVE,EAAOyB,KAAK,gEAAgE+E,MAAM,KAAM,SAAS1E,EAAGa,GACnGjD,EAAY,WAAaiD,EAAO,KAAQA,EAAK0C,eAG9C,SAASE,GAAazB,GAMrB,GAAI/C,GAAS,UAAY+C,IAAOA,EAAI/C,OACnCgD,EAAO/D,EAAO+D,KAAMD,EAErB,OAAc,aAATC,GAAuB/D,EAAOiE,SAAUH,IACrC,EAGc,IAAjBA,EAAIM,UAAkBrD,GACnB,EAGQ,UAATgD,GAA+B,IAAXhD,GACR,gBAAXA,IAAuBA,EAAS,GAAOA,EAAS,IAAO+C,GAEhE,GAAI2C,GAWJ,SAAWvH,GAEX,GAAI4C,GACHhC,EACA4G,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACApI,EACAqI,EACAC,EACAC,EACAC,EACAvB,EACAwB,EAGAlE,EAAU,SAAW,EAAI,GAAIiD,MAC7BkB,EAAevI,EAAOH,SACtB2I,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAY,SAAUC,EAAGC,GAIxB,MAHKD,KAAMC,IACVhB,GAAe,GAET,GAIRiB,EAAe,GAAK,GAGpBvI,KAAcC,eACdR,KACA+I,EAAM/I,EAAI+I,IACVC,EAAchJ,EAAIG,KAClBA,EAAOH,EAAIG,KACXF,EAAQD,EAAIC,MAGZG,EAAU,SAAU6I,EAAMzG,GAGzB,IAFA,GAAIC,GAAI,EACPM,EAAMkG,EAAKvH,OACAqB,EAAJN,EAASA,IAChB,GAAKwG,EAAKxG,KAAOD,EAChB,MAAOC,EAGT,OAAO,IAGRyG,EAAW,6HAKXC,EAAa,sBAEbC,EAAoB,mCAKpBC,EAAaD,EAAkBhF,QAAS,IAAK,MAG7CkF,EAAa,MAAQH,EAAa,KAAOC,EAAoB,OAASD,EAErE,gBAAkBA,EAElB,2DAA6DE,EAAa,OAASF,EACnF,OAEDI,EAAU,KAAOH,EAAoB,wFAKPE,EAAa,eAM3CE,EAAc,GAAIC,QAAQN,EAAa,IAAK,KAC5CnI,EAAQ,GAAIyI,QAAQ,IAAMN,EAAa,8BAAgCA,EAAa,KAAM,KAE1FO,EAAS,GAAID,QAAQ,IAAMN,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,GAAIF,QAAQ,IAAMN,EAAa,WAAaA,EAAa,IAAMA,EAAa,KAE3FS,EAAmB,GAAIH,QAAQ,IAAMN,EAAa,iBAAmBA,EAAa,OAAQ,KAE1FU,EAAU,GAAIJ,QAAQF,GACtBO,EAAc,GAAIL,QAAQ,IAAMJ,EAAa,KAE7CU,GACCC,GAAM,GAAIP,QAAQ,MAAQL,EAAoB,KAC9Ca,MAAS,GAAIR,QAAQ,QAAUL,EAAoB,KACnDc,IAAO,GAAIT,QAAQ,KAAOL,EAAkBhF,QAAS,IAAK,MAAS,KACnE+F,KAAQ,GAAIV,QAAQ,IAAMH,GAC1Bc,OAAU,GAAIX,QAAQ,IAAMF,GAC5Bc,MAAS,GAAIZ,QAAQ,yDAA2DN,EAC/E,+BAAiCA,EAAa,cAAgBA,EAC9D,aAAeA,EAAa,SAAU,KACvCmB,KAAQ,GAAIb,QAAQ,OAASP,EAAW,KAAM,KAG9CqB,aAAgB,GAAId,QAAQ,IAAMN,EAAa,mDAC9CA,EAAa,mBAAqBA,EAAa,mBAAoB,MAGrEqB,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OACXC,GAAU,QAGVC,GAAY,GAAIrB,QAAQ,qBAAuBN,EAAa,MAAQA,EAAa,OAAQ,MACzF4B,GAAY,SAAUC,EAAGC,EAASC,GACjC,GAAIC,GAAO,KAAOF,EAAU,KAI5B,OAAOE,KAASA,GAAQD,EACvBD,EACO,EAAPE,EAECC,OAAOC,aAAcF,EAAO,OAE5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,QAO5DG,GAAgB,WACfxD,IAIF,KACC3H,EAAKuC,MACH1C,EAAMC,EAAM2B,KAAMwG,EAAamD,YAChCnD,EAAamD,YAIdvL,EAAKoI,EAAamD,WAAW7J,QAASqD,SACrC,MAAQyG,IACTrL,GAASuC,MAAO1C,EAAI0B,OAGnB,SAAUiC,EAAQ8H,GACjBzC,EAAYtG,MAAOiB,EAAQ1D,EAAM2B,KAAK6J,KAKvC,SAAU9H,EAAQ8H,GACjB,GAAIzI,GAAIW,EAAOjC,OACde,EAAI,CAEL,OAASkB,EAAOX,KAAOyI,EAAIhJ,MAC3BkB,EAAOjC,OAASsB,EAAI,IAKvB,QAASoE,IAAQxG,EAAUC,EAASuF,EAASsF,GAC5C,GAAIC,GAAOnJ,EAAMoJ,EAAG7G,EAEnBtC,EAAGoJ,EAAQC,EAAKC,EAAKC,EAAYC,CAUlC,KAROpL,EAAUA,EAAQqL,eAAiBrL,EAAUuH,KAAmB1I,GACtEoI,EAAajH,GAGdA,EAAUA,GAAWnB,EACrB0G,EAAUA,MACVrB,EAAWlE,EAAQkE,SAEM,gBAAbnE,KAA0BA,GACxB,IAAbmE,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,MAAOqB,EAGR,KAAMsF,GAAQ1D,EAAiB,CAG9B,GAAkB,KAAbjD,IAAoB4G,EAAQhB,EAAWwB,KAAMvL,IAEjD,GAAMgL,EAAID,EAAM,IACf,GAAkB,IAAb5G,EAAiB,CAIrB,GAHAvC,EAAO3B,EAAQuL,eAAgBR,IAG1BpJ,IAAQA,EAAKmD,WAQjB,MAAOS,EALP,IAAK5D,EAAK6J,KAAOT,EAEhB,MADAxF,GAAQjG,KAAMqC,GACP4D,MAOT,IAAKvF,EAAQqL,gBAAkB1J,EAAO3B,EAAQqL,cAAcE,eAAgBR,KAC3EzD,EAAUtH,EAAS2B,IAAUA,EAAK6J,KAAOT,EAEzC,MADAxF,GAAQjG,KAAMqC,GACP4D,MAKH,CAAA,GAAKuF,EAAM,GAEjB,MADAxL,GAAKuC,MAAO0D,EAASvF,EAAQyL,qBAAsB1L,IAC5CwF,CAGD,KAAMwF,EAAID,EAAM,KAAOlL,EAAQ8L,uBAErC,MADApM,GAAKuC,MAAO0D,EAASvF,EAAQ0L,uBAAwBX,IAC9CxF,EAKT,GAAK3F,EAAQ+L,OAASvE,IAAcA,EAAUwE,KAAM7L,IAAc,CASjE,GARAmL,EAAMD,EAAM7H,EACZ+H,EAAanL,EACboL,EAA2B,IAAblH,GAAkBnE,EAMd,IAAbmE,GAAqD,WAAnClE,EAAQkF,SAASC,cAA6B,CACpE6F,EAASrE,EAAU5G,IAEbkL,EAAMjL,EAAQ6L,aAAa,OAChCX,EAAMD,EAAI1H,QAASyG,GAAS,QAE5BhK,EAAQ8L,aAAc,KAAMZ,GAE7BA,EAAM,QAAUA,EAAM,MAEtBtJ,EAAIoJ,EAAOnK,MACX,OAAQe,IACPoJ,EAAOpJ,GAAKsJ,EAAMa,GAAYf,EAAOpJ,GAEtCuJ,GAAapB,GAAS6B,KAAM7L,IAAciM,GAAahM,EAAQ8E,aAAgB9E,EAC/EoL,EAAcJ,EAAOiB,KAAK,KAG3B,GAAKb,EACJ,IAIC,MAHA9L,GAAKuC,MAAO0D,EACX4F,EAAWe,iBAAkBd,IAEvB7F,EACN,MAAM4G,IACN,QACKlB,GACLjL,EAAQoM,gBAAgB,QAQ7B,MAAOvF,GAAQ9G,EAASwD,QAASpD,EAAO,MAAQH,EAASuF,EAASsF,GASnE,QAASlD,MACR,GAAI0E,KAEJ,SAASC,GAAOC,EAAKnH,GAMpB,MAJKiH,GAAK/M,KAAMiN,EAAM,KAAQ/F,EAAKgG,mBAE3BF,GAAOD,EAAKI,SAEZH,EAAOC,EAAM,KAAQnH,EAE9B,MAAOkH,GAOR,QAASI,IAAczM,GAEtB,MADAA,GAAImD,IAAY,EACTnD,EAOR,QAAS0M,IAAQ1M,GAChB,GAAI2M,GAAM/N,EAAS6F,cAAc,MAEjC,KACC,QAASzE,EAAI2M,GACZ,MAAOjC,GACR,OAAO,EACN,QAEIiC,EAAI9H,YACR8H,EAAI9H,WAAWC,YAAa6H,GAG7BA,EAAM,MASR,QAASC,IAAWC,EAAOC,GAC1B,GAAI5N,GAAM2N,EAAMxG,MAAM,KACrB1E,EAAIkL,EAAMjM,MAEX,OAAQe,IACP4E,EAAKwG,WAAY7N,EAAIyC,IAAOmL,EAU9B,QAASE,IAAclF,EAAGC,GACzB,GAAIkF,GAAMlF,GAAKD,EACdoF,EAAOD,GAAsB,IAAfnF,EAAE7D,UAAiC,IAAf8D,EAAE9D,YAChC8D,EAAEoF,aAAenF,KACjBF,EAAEqF,aAAenF,EAGtB,IAAKkF,EACJ,MAAOA,EAIR,IAAKD,EACJ,MAASA,EAAMA,EAAIG,YAClB,GAAKH,IAAQlF,EACZ,MAAO,EAKV,OAAOD,GAAI,EAAI,GAOhB,QAASuF,IAAmBzJ,GAC3B,MAAO,UAAUlC,GAChB,GAAIc,GAAOd,EAAKuD,SAASC,aACzB,OAAgB,UAAT1C,GAAoBd,EAAKkC,OAASA,GAQ3C,QAAS0J,IAAoB1J,GAC5B,MAAO,UAAUlC,GAChB,GAAIc,GAAOd,EAAKuD,SAASC,aACzB,QAAiB,UAAT1C,GAA6B,WAATA,IAAsBd,EAAKkC,OAASA,GAQlE,QAAS2J,IAAwBvN,GAChC,MAAOyM,IAAa,SAAUe,GAE7B,MADAA,IAAYA,EACLf,GAAa,SAAU7B,EAAM/E,GACnC,GAAI3D,GACHuL,EAAezN,KAAQ4K,EAAKhK,OAAQ4M,GACpC7L,EAAI8L,EAAa7M,MAGlB,OAAQe,IACFiJ,EAAO1I,EAAIuL,EAAa9L,MAC5BiJ,EAAK1I,KAAO2D,EAAQ3D,GAAK0I,EAAK1I,SAYnC,QAAS6J,IAAahM,GACrB,MAAOA,IAAmD,mBAAjCA,GAAQyL,sBAAwCzL,EAI1EJ,EAAU2G,GAAO3G,WAOjB8G,EAAQH,GAAOG,MAAQ,SAAU/E,GAGhC,GAAIgM,GAAkBhM,IAASA,EAAK0J,eAAiB1J,GAAMgM,eAC3D,OAAOA,GAA+C,SAA7BA,EAAgBzI,UAAsB,GAQhE+B,EAAcV,GAAOU,YAAc,SAAU2G,GAC5C,GAAIC,GAAYC,EACfC,EAAMH,EAAOA,EAAKvC,eAAiBuC,EAAOrG,CAG3C,OAAKwG,KAAQlP,GAA6B,IAAjBkP,EAAI7J,UAAmB6J,EAAIJ,iBAKpD9O,EAAWkP,EACX7G,EAAU6G,EAAIJ,gBACdG,EAASC,EAAIC,YAMRF,GAAUA,IAAWA,EAAOG,MAE3BH,EAAOI,iBACXJ,EAAOI,iBAAkB,SAAUzD,IAAe,GACvCqD,EAAOK,aAClBL,EAAOK,YAAa,WAAY1D,KAMlCtD,GAAkBT,EAAOqH,GAQzBnO,EAAQ6I,WAAakE,GAAO,SAAUC,GAErC,MADAA,GAAIwB,UAAY,KACRxB,EAAIf,aAAa,eAO1BjM,EAAQ6L,qBAAuBkB,GAAO,SAAUC,GAE/C,MADAA,GAAI/H,YAAakJ,EAAIM,cAAc,MAC3BzB,EAAInB,qBAAqB,KAAK5K,SAIvCjB,EAAQ8L,uBAAyB7B,EAAQ+B,KAAMmC,EAAIrC,wBAMnD9L,EAAQ0O,QAAU3B,GAAO,SAAUC,GAElC,MADA1F,GAAQrC,YAAa+H,GAAMpB,GAAKpI,GACxB2K,EAAIQ,oBAAsBR,EAAIQ,kBAAmBnL,GAAUvC,SAI/DjB,EAAQ0O,SACZ9H,EAAKgI,KAAS,GAAI,SAAUhD,EAAIxL,GAC/B,GAAuC,mBAA3BA,GAAQuL,gBAAkCpE,EAAiB,CACtE,GAAI4D,GAAI/K,EAAQuL,eAAgBC,EAGhC,OAAOT,IAAKA,EAAEjG,YAAeiG,QAG/BvE,EAAKiI,OAAW,GAAI,SAAUjD,GAC7B,GAAIkD,GAASlD,EAAGjI,QAAS0G,GAAWC,GACpC,OAAO,UAAUvI,GAChB,MAAOA,GAAKkK,aAAa,QAAU6C,YAM9BlI,GAAKgI,KAAS,GAErBhI,EAAKiI,OAAW,GAAK,SAAUjD,GAC9B,GAAIkD,GAASlD,EAAGjI,QAAS0G,GAAWC,GACpC,OAAO,UAAUvI,GAChB,GAAIiM,GAAwC,mBAA1BjM,GAAKgN,kBAAoChN,EAAKgN,iBAAiB,KACjF,OAAOf,IAAQA,EAAKxI,QAAUsJ,KAMjClI,EAAKgI,KAAU,IAAI5O,EAAQ6L,qBAC1B,SAAUmD,EAAK5O,GACd,MAA6C,mBAAjCA,GAAQyL,qBACZzL,EAAQyL,qBAAsBmD,GAG1BhP,EAAQ+L,IACZ3L,EAAQkM,iBAAkB0C,GAD3B,QAKR,SAAUA,EAAK5O,GACd,GAAI2B,GACHwE,KACAvE,EAAI,EAEJ2D,EAAUvF,EAAQyL,qBAAsBmD,EAGzC,IAAa,MAARA,EAAc,CAClB,MAASjN,EAAO4D,EAAQ3D,KACA,IAAlBD,EAAKuC,UACTiC,EAAI7G,KAAMqC,EAIZ,OAAOwE,GAER,MAAOZ,IAITiB,EAAKgI,KAAY,MAAI5O,EAAQ8L,wBAA0B,SAAU0C,EAAWpO,GAC3E,MAAKmH,GACGnH,EAAQ0L,uBAAwB0C,GADxC,QAWD/G,KAOAD,MAEMxH,EAAQ+L,IAAM9B,EAAQ+B,KAAMmC,EAAI7B,qBAGrCS,GAAO,SAAUC,GAMhB1F,EAAQrC,YAAa+H,GAAMiC,UAAY,UAAYzL,EAAU,qBAC3CA,EAAU,iEAOvBwJ,EAAIV,iBAAiB,wBAAwBrL,QACjDuG,EAAU9H,KAAM,SAAWgJ,EAAa,gBAKnCsE,EAAIV,iBAAiB,cAAcrL,QACxCuG,EAAU9H,KAAM,MAAQgJ,EAAa,aAAeD,EAAW,KAI1DuE,EAAIV,iBAAkB,QAAU9I,EAAU,MAAOvC,QACtDuG,EAAU9H,KAAK,MAMVsN,EAAIV,iBAAiB,YAAYrL,QACtCuG,EAAU9H,KAAK,YAMVsN,EAAIV,iBAAkB,KAAO9I,EAAU,MAAOvC,QACnDuG,EAAU9H,KAAK,cAIjBqN,GAAO,SAAUC,GAGhB,GAAIkC,GAAQf,EAAIrJ,cAAc,QAC9BoK,GAAMhD,aAAc,OAAQ,UAC5Bc,EAAI/H,YAAaiK,GAAQhD,aAAc,OAAQ,KAI1Cc,EAAIV,iBAAiB,YAAYrL,QACrCuG,EAAU9H,KAAM,OAASgJ,EAAa,eAKjCsE,EAAIV,iBAAiB,YAAYrL,QACtCuG,EAAU9H,KAAM,WAAY,aAI7BsN,EAAIV,iBAAiB,QACrB9E,EAAU9H,KAAK,YAIXM,EAAQmP,gBAAkBlF,EAAQ+B,KAAO9F,EAAUoB,EAAQpB,SAChEoB,EAAQ8H,uBACR9H,EAAQ+H,oBACR/H,EAAQgI,kBACRhI,EAAQiI,qBAERxC,GAAO,SAAUC,GAGhBhN,EAAQwP,kBAAoBtJ,EAAQ/E,KAAM6L,EAAK,OAI/C9G,EAAQ/E,KAAM6L,EAAK,aACnBvF,EAAc/H,KAAM,KAAMoJ,KAI5BtB,EAAYA,EAAUvG,QAAU,GAAI+H,QAAQxB,EAAU6E,KAAK,MAC3D5E,EAAgBA,EAAcxG,QAAU,GAAI+H,QAAQvB,EAAc4E,KAAK,MAIvE4B,EAAahE,EAAQ+B,KAAM1E,EAAQmI,yBAKnC/H,EAAWuG,GAAchE,EAAQ+B,KAAM1E,EAAQI,UAC9C,SAAUS,EAAGC,GACZ,GAAIsH,GAAuB,IAAfvH,EAAE7D,SAAiB6D,EAAE4F,gBAAkB5F,EAClDwH,EAAMvH,GAAKA,EAAElD,UACd,OAAOiD,KAAMwH,MAAWA,GAAwB,IAAjBA,EAAIrL,YAClCoL,EAAMhI,SACLgI,EAAMhI,SAAUiI,GAChBxH,EAAEsH,yBAA8D,GAAnCtH,EAAEsH,wBAAyBE,MAG3D,SAAUxH,EAAGC,GACZ,GAAKA,EACJ,MAASA,EAAIA,EAAElD,WACd,GAAKkD,IAAMD,EACV,OAAO,CAIV,QAAO,GAOTD,EAAY+F,EACZ,SAAU9F,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAIR,IAAIwI,IAAWzH,EAAEsH,yBAA2BrH,EAAEqH,uBAC9C,OAAKG,GACGA,GAIRA,GAAYzH,EAAEsD,eAAiBtD,MAAUC,EAAEqD,eAAiBrD,GAC3DD,EAAEsH,wBAAyBrH,GAG3B,EAGc,EAAVwH,IACF5P,EAAQ6P,cAAgBzH,EAAEqH,wBAAyBtH,KAAQyH,EAGxDzH,IAAMgG,GAAOhG,EAAEsD,gBAAkB9D,GAAgBD,EAASC,EAAcQ,GACrE,GAEHC,IAAM+F,GAAO/F,EAAEqD,gBAAkB9D,GAAgBD,EAASC,EAAcS,GACrE,EAIDjB,EACJxH,EAASwH,EAAWgB,GAAMxI,EAASwH,EAAWiB,GAChD,EAGe,EAAVwH,EAAc,GAAK,IAE3B,SAAUzH,EAAGC,GAEZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAGR,IAAIkG,GACHtL,EAAI,EACJ8N,EAAM3H,EAAEjD,WACRyK,EAAMvH,EAAElD,WACR6K,GAAO5H,GACP6H,GAAO5H,EAGR,KAAM0H,IAAQH,EACb,MAAOxH,KAAMgG,EAAM,GAClB/F,IAAM+F,EAAM,EACZ2B,EAAM,GACNH,EAAM,EACNxI,EACExH,EAASwH,EAAWgB,GAAMxI,EAASwH,EAAWiB,GAChD,CAGK,IAAK0H,IAAQH,EACnB,MAAOtC,IAAclF,EAAGC,EAIzBkF,GAAMnF,CACN,OAASmF,EAAMA,EAAIpI,WAClB6K,EAAGE,QAAS3C,EAEbA,GAAMlF,CACN,OAASkF,EAAMA,EAAIpI,WAClB8K,EAAGC,QAAS3C,EAIb,OAAQyC,EAAG/N,KAAOgO,EAAGhO,GACpBA,GAGD,OAAOA,GAENqL,GAAc0C,EAAG/N,GAAIgO,EAAGhO,IAGxB+N,EAAG/N,KAAO2F,EAAe,GACzBqI,EAAGhO,KAAO2F,EAAe,EACzB,GAGKwG,GA1WClP,GA6WT0H,GAAOT,QAAU,SAAUgK,EAAMC,GAChC,MAAOxJ,IAAQuJ,EAAM,KAAM,KAAMC,IAGlCxJ,GAAOwI,gBAAkB,SAAUpN,EAAMmO,GASxC,IAPOnO,EAAK0J,eAAiB1J,KAAW9C,GACvCoI,EAAatF,GAIdmO,EAAOA,EAAKvM,QAASwF,EAAkB,aAElCnJ,EAAQmP,kBAAmB5H,GAC5BE,GAAkBA,EAAcuE,KAAMkE,IACtC1I,GAAkBA,EAAUwE,KAAMkE,IAErC,IACC,GAAI1O,GAAM0E,EAAQ/E,KAAMY,EAAMmO,EAG9B,IAAK1O,GAAOxB,EAAQwP,mBAGlBzN,EAAK9C,UAAuC,KAA3B8C,EAAK9C,SAASqF,SAChC,MAAO9C,GAEP,MAAOuJ,IAGV,MAAOpE,IAAQuJ,EAAMjR,EAAU,MAAQ8C,IAASd,OAAS,GAG1D0F,GAAOe,SAAW,SAAUtH,EAAS2B,GAKpC,OAHO3B,EAAQqL,eAAiBrL,KAAcnB,GAC7CoI,EAAajH,GAEPsH,EAAUtH,EAAS2B,IAG3B4E,GAAOyJ,KAAO,SAAUrO,EAAMc,IAEtBd,EAAK0J,eAAiB1J,KAAW9C,GACvCoI,EAAatF,EAGd,IAAI1B,GAAKuG,EAAKwG,WAAYvK,EAAK0C,eAE9B8K,EAAMhQ,GAAMP,EAAOqB,KAAMyF,EAAKwG,WAAYvK,EAAK0C,eAC9ClF,EAAI0B,EAAMc,GAAO0E,GACjBhE,MAEF,OAAeA,UAAR8M,EACNA,EACArQ,EAAQ6I,aAAetB,EACtBxF,EAAKkK,aAAcpJ,IAClBwN,EAAMtO,EAAKgN,iBAAiBlM,KAAUwN,EAAIC,UAC1CD,EAAI7K,MACJ,MAGJmB,GAAO9C,MAAQ,SAAUC,GACxB,KAAM,IAAI3E,OAAO,0CAA4C2E,IAO9D6C,GAAO4J,WAAa,SAAU5K,GAC7B,GAAI5D,GACHyO,KACAjO,EAAI,EACJP,EAAI,CAOL,IAJAoF,GAAgBpH,EAAQyQ,iBACxBtJ,GAAanH,EAAQ0Q,YAAc/K,EAAQnG,MAAO,GAClDmG,EAAQlD,KAAMyF,GAETd,EAAe,CACnB,MAASrF,EAAO4D,EAAQ3D,KAClBD,IAAS4D,EAAS3D,KACtBO,EAAIiO,EAAW9Q,KAAMsC,GAGvB,OAAQO,IACPoD,EAAQjD,OAAQ8N,EAAYjO,GAAK,GAQnC,MAFA4E,GAAY,KAELxB,GAORkB,EAAUF,GAAOE,QAAU,SAAU9E,GACpC,GAAIiM,GACHxM,EAAM,GACNQ,EAAI,EACJsC,EAAWvC,EAAKuC,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArBvC,GAAK4O,YAChB,MAAO5O,GAAK4O,WAGZ,KAAM5O,EAAOA,EAAK6O,WAAY7O,EAAMA,EAAOA,EAAK0L,YAC/CjM,GAAOqF,EAAS9E,OAGZ,IAAkB,IAAbuC,GAA+B,IAAbA,EAC7B,MAAOvC,GAAK8O,cAhBZ,OAAS7C,EAAOjM,EAAKC,KAEpBR,GAAOqF,EAASmH,EAkBlB,OAAOxM,IAGRoF,EAAOD,GAAOmK,WAGblE,YAAa,GAEbmE,aAAcjE,GAEd5B,MAAO5B,EAEP8D,cAEAwB,QAEAoC,UACCC,KAAOC,IAAK,aAAc/O,OAAO,GACjCgP,KAAOD,IAAK,cACZE,KAAOF,IAAK,kBAAmB/O,OAAO,GACtCkP,KAAOH,IAAK,oBAGbI,WACC5H,KAAQ,SAAUwB,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAGvH,QAAS0G,GAAWC,IAGxCY,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,IAAKvH,QAAS0G,GAAWC,IAExD,OAAbY,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAM1L,MAAO,EAAG,IAGxBoK,MAAS,SAAUsB,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAG3F,cAEY,QAA3B2F,EAAM,GAAG1L,MAAO,EAAG,IAEjB0L,EAAM,IACXvE,GAAO9C,MAAOqH,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjBvE,GAAO9C,MAAOqH,EAAM,IAGdA,GAGRvB,OAAU,SAAUuB,GACnB,GAAIqG,GACHC,GAAYtG,EAAM,IAAMA,EAAM,EAE/B,OAAK5B,GAAiB,MAAE0C,KAAMd,EAAM,IAC5B,MAIHA,EAAM,GACVA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAGxBsG,GAAYpI,EAAQ4C,KAAMwF,KAEpCD,EAASxK,EAAUyK,GAAU,MAE7BD,EAASC,EAAS7R,QAAS,IAAK6R,EAASvQ,OAASsQ,GAAWC,EAASvQ,UAGvEiK,EAAM,GAAKA,EAAM,GAAG1L,MAAO,EAAG+R,GAC9BrG,EAAM,GAAKsG,EAAShS,MAAO,EAAG+R,IAIxBrG,EAAM1L,MAAO,EAAG,MAIzBqP,QAECpF,IAAO,SAAUgI,GAChB,GAAInM,GAAWmM,EAAiB9N,QAAS0G,GAAWC,IAAY/E,aAChE,OAA4B,MAArBkM,EACN,WAAa,OAAO,GACpB,SAAU1P,GACT,MAAOA,GAAKuD,UAAYvD,EAAKuD,SAASC,gBAAkBD,IAI3DkE,MAAS,SAAUgF,GAClB,GAAIkD,GAAU5J,EAAY0G,EAAY,IAEtC,OAAOkD,KACLA,EAAU,GAAI1I,QAAQ,MAAQN,EAAa,IAAM8F,EAAY,IAAM9F,EAAa,SACjFZ,EAAY0G,EAAW,SAAUzM,GAChC,MAAO2P,GAAQ1F,KAAgC,gBAAnBjK,GAAKyM,WAA0BzM,EAAKyM,WAA0C,mBAAtBzM,GAAKkK,cAAgClK,EAAKkK,aAAa,UAAY,OAI1JvC,KAAQ,SAAU7G,EAAM8O,EAAUC,GACjC,MAAO,UAAU7P,GAChB,GAAI8P,GAASlL,GAAOyJ,KAAMrO,EAAMc,EAEhC,OAAe,OAAVgP,EACgB,OAAbF,EAEFA,GAINE,GAAU,GAEU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOlS,QAASiS,GAChC,OAAbD,EAAoBC,GAASC,EAAOlS,QAASiS,GAAU,GAC1C,OAAbD,EAAoBC,GAASC,EAAOrS,OAAQoS,EAAM3Q,UAAa2Q,EAClD,OAAbD,GAAsB,IAAME,EAAOlO,QAASoF,EAAa,KAAQ,KAAMpJ,QAASiS,GAAU,GAC7E,OAAbD,EAAoBE,IAAWD,GAASC,EAAOrS,MAAO,EAAGoS,EAAM3Q,OAAS,KAAQ2Q,EAAQ,KACxF,IAZO,IAgBVhI,MAAS,SAAU3F,EAAM6N,EAAMjE,EAAU1L,EAAOE,GAC/C,GAAI0P,GAAgC,QAAvB9N,EAAKzE,MAAO,EAAG,GAC3BwS,EAA+B,SAArB/N,EAAKzE,MAAO,IACtByS,EAAkB,YAATH,CAEV,OAAiB,KAAV3P,GAAwB,IAATE,EAGrB,SAAUN,GACT,QAASA,EAAKmD,YAGf,SAAUnD,EAAM3B,EAAS8R,GACxB,GAAIxF,GAAOyF,EAAYnE,EAAMT,EAAM6E,EAAWC,EAC7CnB,EAAMa,IAAWC,EAAU,cAAgB,kBAC3C9D,EAASnM,EAAKmD,WACdrC,EAAOoP,GAAUlQ,EAAKuD,SAASC,cAC/B+M,GAAYJ,IAAQD,CAErB,IAAK/D,EAAS,CAGb,GAAK6D,EAAS,CACb,MAAQb,EAAM,CACblD,EAAOjM,CACP,OAASiM,EAAOA,EAAMkD,GACrB,GAAKe,EAASjE,EAAK1I,SAASC,gBAAkB1C,EAAyB,IAAlBmL,EAAK1J,SACzD,OAAO,CAIT+N,GAAQnB,EAAe,SAATjN,IAAoBoO,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAUL,EAAU9D,EAAO0C,WAAa1C,EAAOqE,WAG1CP,GAAWM,EAAW,CAE1BH,EAAajE,EAAQ1K,KAAc0K,EAAQ1K,OAC3CkJ,EAAQyF,EAAYlO,OACpBmO,EAAY1F,EAAM,KAAO9E,GAAW8E,EAAM,GAC1Ca,EAAOb,EAAM,KAAO9E,GAAW8E,EAAM,GACrCsB,EAAOoE,GAAalE,EAAOpD,WAAYsH,EAEvC,OAASpE,IAASoE,GAAapE,GAAQA,EAAMkD,KAG3C3D,EAAO6E,EAAY,IAAMC,EAAM/J,MAGhC,GAAuB,IAAlB0F,EAAK1J,YAAoBiJ,GAAQS,IAASjM,EAAO,CACrDoQ,EAAYlO,IAAW2D,EAASwK,EAAW7E,EAC3C,YAKI,IAAK+E,IAAa5F,GAAS3K,EAAMyB,KAAczB,EAAMyB,QAAkBS,KAAWyI,EAAM,KAAO9E,EACrG2F,EAAOb,EAAM,OAKb,OAASsB,IAASoE,GAAapE,GAAQA,EAAMkD,KAC3C3D,EAAO6E,EAAY,IAAMC,EAAM/J,MAEhC,IAAO2J,EAASjE,EAAK1I,SAASC,gBAAkB1C,EAAyB,IAAlBmL,EAAK1J,aAAsBiJ,IAE5E+E,KACHtE,EAAMxK,KAAcwK,EAAMxK,QAAkBS,IAAW2D,EAAS2F,IAG7DS,IAASjM,GACb,KAQJ,OADAwL,IAAQlL,EACDkL,IAASpL,GAAWoL,EAAOpL,IAAU,GAAKoL,EAAOpL,GAAS,KAKrEwH,OAAU,SAAU6I,EAAQ3E,GAK3B,GAAIhM,GACHxB,EAAKuG,EAAKkC,QAAS0J,IAAY5L,EAAK6L,WAAYD,EAAOjN,gBACtDoB,GAAO9C,MAAO,uBAAyB2O,EAKzC,OAAKnS,GAAImD,GACDnD,EAAIwN,GAIPxN,EAAGY,OAAS,GAChBY,GAAS2Q,EAAQA,EAAQ,GAAI3E,GACtBjH,EAAK6L,WAAW1S,eAAgByS,EAAOjN,eAC7CuH,GAAa,SAAU7B,EAAM/E,GAC5B,GAAIwM,GACHC,EAAUtS,EAAI4K,EAAM4C,GACpB7L,EAAI2Q,EAAQ1R,MACb,OAAQe,IACP0Q,EAAM/S,EAASsL,EAAM0H,EAAQ3Q,IAC7BiJ,EAAMyH,KAAWxM,EAASwM,GAAQC,EAAQ3Q,MAG5C,SAAUD,GACT,MAAO1B,GAAI0B,EAAM,EAAGF,KAIhBxB,IAITyI,SAEC8J,IAAO9F,GAAa,SAAU3M,GAI7B,GAAI+O,MACHvJ,KACAkN,EAAU7L,EAAS7G,EAASwD,QAASpD,EAAO,MAE7C,OAAOsS,GAASrP,GACfsJ,GAAa,SAAU7B,EAAM/E,EAAS9F,EAAS8R,GAC9C,GAAInQ,GACH+Q,EAAYD,EAAS5H,EAAM,KAAMiH,MACjClQ,EAAIiJ,EAAKhK,MAGV,OAAQe,KACDD,EAAO+Q,EAAU9Q,MACtBiJ,EAAKjJ,KAAOkE,EAAQlE,GAAKD,MAI5B,SAAUA,EAAM3B,EAAS8R,GAKxB,MAJAhD,GAAM,GAAKnN,EACX8Q,EAAS3D,EAAO,KAAMgD,EAAKvM,GAE3BuJ,EAAM,GAAK,MACHvJ,EAAQ2C,SAInByK,IAAOjG,GAAa,SAAU3M,GAC7B,MAAO,UAAU4B,GAChB,MAAO4E,IAAQxG,EAAU4B,GAAOd,OAAS,KAI3CyG,SAAYoF,GAAa,SAAU/H,GAElC,MADAA,GAAOA,EAAKpB,QAAS0G,GAAWC,IACzB,SAAUvI,GAChB,OAASA,EAAK4O,aAAe5O,EAAKiR,WAAanM,EAAS9E,IAASpC,QAASoF,GAAS,MAWrFkO,KAAQnG,GAAc,SAAUmG,GAM/B,MAJM5J,GAAY2C,KAAKiH,GAAQ,KAC9BtM,GAAO9C,MAAO,qBAAuBoP,GAEtCA,EAAOA,EAAKtP,QAAS0G,GAAWC,IAAY/E,cACrC,SAAUxD,GAChB,GAAImR,EACJ,GACC,IAAMA,EAAW3L,EAChBxF,EAAKkR,KACLlR,EAAKkK,aAAa,aAAelK,EAAKkK,aAAa,QAGnD,MADAiH,GAAWA,EAAS3N,cACb2N,IAAaD,GAA2C,IAAnCC,EAASvT,QAASsT,EAAO,YAE5ClR,EAAOA,EAAKmD,aAAiC,IAAlBnD,EAAKuC,SAC3C,QAAO,KAKTpB,OAAU,SAAUnB,GACnB,GAAIoR,GAAO/T,EAAOgU,UAAYhU,EAAOgU,SAASD,IAC9C,OAAOA,IAAQA,EAAK3T,MAAO,KAAQuC,EAAK6J,IAGzCyH,KAAQ,SAAUtR,GACjB,MAAOA,KAASuF,GAGjBgM,MAAS,SAAUvR,GAClB,MAAOA,KAAS9C,EAASsU,iBAAmBtU,EAASuU,UAAYvU,EAASuU,gBAAkBzR,EAAKkC,MAAQlC,EAAK0R,OAAS1R,EAAK2R,WAI7HC,QAAW,SAAU5R,GACpB,MAAOA,GAAK6R,YAAa,GAG1BA,SAAY,SAAU7R,GACrB,MAAOA,GAAK6R,YAAa,GAG1BC,QAAW,SAAU9R,GAGpB,GAAIuD,GAAWvD,EAAKuD,SAASC,aAC7B,OAAqB,UAAbD,KAA0BvD,EAAK8R,SAA0B,WAAbvO,KAA2BvD,EAAK+R,UAGrFA,SAAY,SAAU/R,GAOrB,MAJKA,GAAKmD,YACTnD,EAAKmD,WAAW6O,cAGVhS,EAAK+R,YAAa,GAI1BE,MAAS,SAAUjS,GAKlB,IAAMA,EAAOA,EAAK6O,WAAY7O,EAAMA,EAAOA,EAAK0L,YAC/C,GAAK1L,EAAKuC,SAAW,EACpB,OAAO,CAGT,QAAO,GAGR4J,OAAU,SAAUnM,GACnB,OAAQ6E,EAAKkC,QAAe,MAAG/G,IAIhCkS,OAAU,SAAUlS,GACnB,MAAOiI,GAAQgC,KAAMjK,EAAKuD,WAG3B4J,MAAS,SAAUnN,GAClB,MAAOgI,GAAQiC,KAAMjK,EAAKuD,WAG3B4O,OAAU,SAAUnS,GACnB,GAAIc,GAAOd,EAAKuD,SAASC,aACzB,OAAgB,UAAT1C,GAAkC,WAAdd,EAAKkC,MAA8B,WAATpB,GAGtDkC,KAAQ,SAAUhD,GACjB,GAAIqO,EACJ,OAAuC,UAAhCrO,EAAKuD,SAASC,eACN,SAAdxD,EAAKkC,OAImC,OAArCmM,EAAOrO,EAAKkK,aAAa,UAA2C,SAAvBmE,EAAK7K,gBAIvDpD,MAASyL,GAAuB,WAC/B,OAAS,KAGVvL,KAAQuL,GAAuB,SAAUE,EAAc7M,GACtD,OAASA,EAAS,KAGnBmB,GAAMwL,GAAuB,SAAUE,EAAc7M,EAAQ4M,GAC5D,OAAoB,EAAXA,EAAeA,EAAW5M,EAAS4M,KAG7CsG,KAAQvG,GAAuB,SAAUE,EAAc7M,GAEtD,IADA,GAAIe,GAAI,EACIf,EAAJe,EAAYA,GAAK,EACxB8L,EAAapO,KAAMsC,EAEpB,OAAO8L,KAGRsG,IAAOxG,GAAuB,SAAUE,EAAc7M,GAErD,IADA,GAAIe,GAAI,EACIf,EAAJe,EAAYA,GAAK,EACxB8L,EAAapO,KAAMsC,EAEpB,OAAO8L,KAGRuG,GAAMzG,GAAuB,SAAUE,EAAc7M,EAAQ4M,GAE5D,IADA,GAAI7L,GAAe,EAAX6L,EAAeA,EAAW5M,EAAS4M,IACjC7L,GAAK,GACd8L,EAAapO,KAAMsC,EAEpB,OAAO8L,KAGRwG,GAAM1G,GAAuB,SAAUE,EAAc7M,EAAQ4M,GAE5D,IADA,GAAI7L,GAAe,EAAX6L,EAAeA,EAAW5M,EAAS4M,IACjC7L,EAAIf,GACb6M,EAAapO,KAAMsC,EAEpB,OAAO8L,OAKVlH,EAAKkC,QAAa,IAAIlC,EAAKkC,QAAY,EAGvC,KAAM9G,KAAOuS,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E/N,EAAKkC,QAAS9G,GAAM0L,GAAmB1L,EAExC,KAAMA,KAAO4S,QAAQ,EAAMC,OAAO,GACjCjO,EAAKkC,QAAS9G,GAAM2L,GAAoB3L,EAIzC,SAASyQ,OACTA,GAAW3R,UAAY8F,EAAKkO,QAAUlO,EAAKkC,QAC3ClC,EAAK6L,WAAa,GAAIA,IAEtB1L,EAAWJ,GAAOI,SAAW,SAAU5G,EAAU4U,GAChD,GAAIpC,GAASzH,EAAO8J,EAAQ/Q,EAC3BgR,EAAO7J,EAAQ8J,EACfC,EAASnN,EAAY7H,EAAW,IAEjC,IAAKgV,EACJ,MAAOJ,GAAY,EAAII,EAAO3V,MAAO,EAGtCyV,GAAQ9U,EACRiL,KACA8J,EAAatO,EAAK0K,SAElB,OAAQ2D,EAAQ,GAGTtC,IAAYzH,EAAQjC,EAAOyC,KAAMuJ,OACjC/J,IAEJ+J,EAAQA,EAAMzV,MAAO0L,EAAM,GAAGjK,SAAYgU,GAE3C7J,EAAO1L,KAAOsV,OAGfrC,GAAU,GAGJzH,EAAQhC,EAAawC,KAAMuJ,MAChCtC,EAAUzH,EAAM2B,QAChBmI,EAAOtV,MACN8F,MAAOmN,EAEP1O,KAAMiH,EAAM,GAAGvH,QAASpD,EAAO,OAEhC0U,EAAQA,EAAMzV,MAAOmT,EAAQ1R,QAI9B,KAAMgD,IAAQ2C,GAAKiI,SACZ3D,EAAQ5B,EAAWrF,GAAOyH,KAAMuJ,KAAcC,EAAYjR,MAC9DiH,EAAQgK,EAAYjR,GAAQiH,MAC7ByH,EAAUzH,EAAM2B,QAChBmI,EAAOtV,MACN8F,MAAOmN,EACP1O,KAAMA,EACNiC,QAASgF,IAEV+J,EAAQA,EAAMzV,MAAOmT,EAAQ1R,QAI/B,KAAM0R,EACL,MAOF,MAAOoC,GACNE,EAAMhU,OACNgU,EACCtO,GAAO9C,MAAO1D,GAEd6H,EAAY7H,EAAUiL,GAAS5L,MAAO,GAGzC,SAAS2M,IAAY6I,GAIpB,IAHA,GAAIhT,GAAI,EACPM,EAAM0S,EAAO/T,OACbd,EAAW,GACAmC,EAAJN,EAASA,IAChB7B,GAAY6U,EAAOhT,GAAGwD,KAEvB,OAAOrF,GAGR,QAASiV,IAAevC,EAASwC,EAAYC,GAC5C,GAAIpE,GAAMmE,EAAWnE,IACpBqE,EAAmBD,GAAgB,eAARpE,EAC3BsE,EAAW3N,GAEZ,OAAOwN,GAAWlT,MAEjB,SAAUJ,EAAM3B,EAAS8R,GACxB,MAASnQ,EAAOA,EAAMmP,GACrB,GAAuB,IAAlBnP,EAAKuC,UAAkBiR,EAC3B,MAAO1C,GAAS9Q,EAAM3B,EAAS8R,IAMlC,SAAUnQ,EAAM3B,EAAS8R,GACxB,GAAIuD,GAAUtD,EACbuD,GAAa9N,EAAS4N,EAGvB,IAAKtD,GACJ,MAASnQ,EAAOA,EAAMmP,GACrB,IAAuB,IAAlBnP,EAAKuC,UAAkBiR,IACtB1C,EAAS9Q,EAAM3B,EAAS8R,GAC5B,OAAO,MAKV,OAASnQ,EAAOA,EAAMmP,GACrB,GAAuB,IAAlBnP,EAAKuC,UAAkBiR,EAAmB,CAE9C,GADApD,EAAapQ,EAAMyB,KAAczB,EAAMyB,QACjCiS,EAAWtD,EAAYjB,KAC5BuE,EAAU,KAAQ7N,GAAW6N,EAAU,KAAQD,EAG/C,MAAQE,GAAU,GAAMD,EAAU,EAMlC,IAHAtD,EAAYjB,GAAQwE,EAGdA,EAAU,GAAM7C,EAAS9Q,EAAM3B,EAAS8R,GAC7C,OAAO,IASf,QAASyD,IAAgBC,GACxB,MAAOA,GAAS3U,OAAS,EACxB,SAAUc,EAAM3B,EAAS8R,GACxB,GAAIlQ,GAAI4T,EAAS3U,MACjB,OAAQe,IACP,IAAM4T,EAAS5T,GAAID,EAAM3B,EAAS8R,GACjC,OAAO,CAGT,QAAO,GAER0D,EAAS,GAGX,QAASC,IAAkB1V,EAAU2V,EAAUnQ,GAG9C,IAFA,GAAI3D,GAAI,EACPM,EAAMwT,EAAS7U,OACJqB,EAAJN,EAASA,IAChB2E,GAAQxG,EAAU2V,EAAS9T,GAAI2D,EAEhC,OAAOA,GAGR,QAASoQ,IAAUjD,EAAWhR,EAAK+M,EAAQzO,EAAS8R,GAOnD,IANA,GAAInQ,GACHiU,KACAhU,EAAI,EACJM,EAAMwQ,EAAU7R,OAChBgV,EAAgB,MAAPnU,EAEEQ,EAAJN,EAASA,KACVD,EAAO+Q,EAAU9Q,OAChB6M,GAAUA,EAAQ9M,EAAM3B,EAAS8R,MACtC8D,EAAatW,KAAMqC,GACdkU,GACJnU,EAAIpC,KAAMsC,GAMd,OAAOgU,GAGR,QAASE,IAAY5E,EAAWnR,EAAU0S,EAASsD,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAY3S,KAC/B2S,EAAaD,GAAYC,IAErBC,IAAeA,EAAY5S,KAC/B4S,EAAaF,GAAYE,EAAYC,IAE/BvJ,GAAa,SAAU7B,EAAMtF,EAASvF,EAAS8R,GACrD,GAAIoE,GAAMtU,EAAGD,EACZwU,KACAC,KACAC,EAAc9Q,EAAQ1E,OAGtBM,EAAQ0J,GAAQ4K,GAAkB1V,GAAY,IAAKC,EAAQkE,UAAalE,GAAYA,MAGpFsW,GAAYpF,IAAerG,GAAS9K,EAEnCoB,EADAwU,GAAUxU,EAAOgV,EAAQjF,EAAWlR,EAAS8R,GAG9CyE,EAAa9D,EAEZuD,IAAgBnL,EAAOqG,EAAYmF,GAAeN,MAMjDxQ,EACD+Q,CAQF,IALK7D,GACJA,EAAS6D,EAAWC,EAAYvW,EAAS8R,GAIrCiE,EAAa,CACjBG,EAAOP,GAAUY,EAAYH,GAC7BL,EAAYG,KAAUlW,EAAS8R,GAG/BlQ,EAAIsU,EAAKrV,MACT,OAAQe,KACDD,EAAOuU,EAAKtU,MACjB2U,EAAYH,EAAQxU,MAAS0U,EAAWF,EAAQxU,IAAOD,IAK1D,GAAKkJ,GACJ,GAAKmL,GAAc9E,EAAY,CAC9B,GAAK8E,EAAa,CAEjBE,KACAtU,EAAI2U,EAAW1V,MACf,OAAQe,KACDD,EAAO4U,EAAW3U,KAEvBsU,EAAK5W,KAAOgX,EAAU1U,GAAKD,EAG7BqU,GAAY,KAAOO,KAAkBL,EAAMpE,GAI5ClQ,EAAI2U,EAAW1V,MACf,OAAQe,KACDD,EAAO4U,EAAW3U,MACtBsU,EAAOF,EAAazW,EAASsL,EAAMlJ,GAASwU,EAAOvU,IAAM,KAE1DiJ,EAAKqL,KAAU3Q,EAAQ2Q,GAAQvU,SAOlC4U,GAAaZ,GACZY,IAAehR,EACdgR,EAAWjU,OAAQ+T,EAAaE,EAAW1V,QAC3C0V,GAEGP,EACJA,EAAY,KAAMzQ,EAASgR,EAAYzE,GAEvCxS,EAAKuC,MAAO0D,EAASgR,KAMzB,QAASC,IAAmB5B,GAwB3B,IAvBA,GAAI6B,GAAchE,EAAStQ,EAC1BD,EAAM0S,EAAO/T,OACb6V,EAAkBlQ,EAAKoK,SAAUgE,EAAO,GAAG/Q,MAC3C8S,EAAmBD,GAAmBlQ,EAAKoK,SAAS,KACpDhP,EAAI8U,EAAkB,EAAI,EAG1BE,EAAe5B,GAAe,SAAUrT,GACvC,MAAOA,KAAS8U,GACdE,GAAkB,GACrBE,EAAkB7B,GAAe,SAAUrT,GAC1C,MAAOpC,GAASkX,EAAc9U,GAAS,IACrCgV,GAAkB,GACrBnB,GAAa,SAAU7T,EAAM3B,EAAS8R,GACrC,GAAI1Q,IAASsV,IAAqB5E,GAAO9R,IAAY8G,MACnD2P,EAAezW,GAASkE,SACxB0S,EAAcjV,EAAM3B,EAAS8R,GAC7B+E,EAAiBlV,EAAM3B,EAAS8R,GAGlC,OADA2E,GAAe,KACRrV,IAGGc,EAAJN,EAASA,IAChB,GAAM6Q,EAAUjM,EAAKoK,SAAUgE,EAAOhT,GAAGiC,MACxC2R,GAAaR,GAAcO,GAAgBC,GAAY/C,QACjD,CAIN,GAHAA,EAAUjM,EAAKiI,OAAQmG,EAAOhT,GAAGiC,MAAOhC,MAAO,KAAM+S,EAAOhT,GAAGkE,SAG1D2M,EAASrP,GAAY,CAGzB,IADAjB,IAAMP,EACMM,EAAJC,EAASA,IAChB,GAAKqE,EAAKoK,SAAUgE,EAAOzS,GAAG0B,MAC7B,KAGF,OAAOiS,IACNlU,EAAI,GAAK2T,GAAgBC,GACzB5T,EAAI,GAAKmK,GAER6I,EAAOxV,MAAO,EAAGwC,EAAI,GAAIvC,QAAS+F,MAAgC,MAAzBwP,EAAQhT,EAAI,GAAIiC,KAAe,IAAM,MAC7EN,QAASpD,EAAO,MAClBsS,EACItQ,EAAJP,GAAS4U,GAAmB5B,EAAOxV,MAAOwC,EAAGO,IACzCD,EAAJC,GAAWqU,GAAoB5B,EAASA,EAAOxV,MAAO+C,IAClDD,EAAJC,GAAW4J,GAAY6I,IAGzBY,EAASlW,KAAMmT,GAIjB,MAAO8C,IAAgBC,GAGxB,QAASsB,IAA0BC,EAAiBC,GACnD,GAAIC,GAAQD,EAAYnW,OAAS,EAChCqW,EAAYH,EAAgBlW,OAAS,EACrCsW,EAAe,SAAUtM,EAAM7K,EAAS8R,EAAKvM,EAAS6R,GACrD,GAAIzV,GAAMQ,EAAGsQ,EACZ4E,EAAe,EACfzV,EAAI,IACJ8Q,EAAY7H,MACZyM,KACAC,EAAgBzQ,EAEhB3F,EAAQ0J,GAAQqM,GAAa1Q,EAAKgI,KAAU,IAAG,IAAK4I,GAEpDI,EAAiBhQ,GAA4B,MAAjB+P,EAAwB,EAAIlU,KAAKC,UAAY,GACzEpB,EAAMf,EAAMN,MAUb,KARKuW,IACJtQ,EAAmB9G,IAAYnB,GAAYmB,GAOpC4B,IAAMM,GAA4B,OAApBP,EAAOR,EAAMS,IAAaA,IAAM,CACrD,GAAKsV,GAAavV,EAAO,CACxBQ,EAAI,CACJ,OAASsQ,EAAUsE,EAAgB5U,KAClC,GAAKsQ,EAAS9Q,EAAM3B,EAAS8R,GAAQ,CACpCvM,EAAQjG,KAAMqC,EACd,OAGGyV,IACJ5P,EAAUgQ,GAKPP,KAEEtV,GAAQ8Q,GAAW9Q,IACxB0V,IAIIxM,GACJ6H,EAAUpT,KAAMqC,IAOnB,GADA0V,GAAgBzV,EACXqV,GAASrV,IAAMyV,EAAe,CAClClV,EAAI,CACJ,OAASsQ,EAAUuE,EAAY7U,KAC9BsQ,EAASC,EAAW4E,EAAYtX,EAAS8R,EAG1C,IAAKjH,EAAO,CAEX,GAAKwM,EAAe,EACnB,MAAQzV,IACA8Q,EAAU9Q,IAAM0V,EAAW1V,KACjC0V,EAAW1V,GAAKsG,EAAInH,KAAMwE,GAM7B+R,GAAa3B,GAAU2B,GAIxBhY,EAAKuC,MAAO0D,EAAS+R,GAGhBF,IAAcvM,GAAQyM,EAAWzW,OAAS,GAC5CwW,EAAeL,EAAYnW,OAAW,GAExC0F,GAAO4J,WAAY5K,GAUrB,MALK6R,KACJ5P,EAAUgQ,EACV1Q,EAAmByQ,GAGb7E,EAGT,OAAOuE,GACNvK,GAAcyK,GACdA,EA+KF,MA5KAvQ,GAAUL,GAAOK,QAAU,SAAU7G,EAAU+K,GAC9C,GAAIlJ,GACHoV,KACAD,KACAhC,EAASlN,EAAe9H,EAAW,IAEpC,KAAMgV,EAAS,CAERjK,IACLA,EAAQnE,EAAU5G,IAEnB6B,EAAIkJ,EAAMjK,MACV,OAAQe,IACPmT,EAASyB,GAAmB1L,EAAMlJ,IAC7BmT,EAAQ3R,GACZ4T,EAAY1X,KAAMyV,GAElBgC,EAAgBzX,KAAMyV,EAKxBA,GAASlN,EAAe9H,EAAU+W,GAA0BC,EAAiBC,IAG7EjC,EAAOhV,SAAWA,EAEnB,MAAOgV,IAYRlO,EAASN,GAAOM,OAAS,SAAU9G,EAAUC,EAASuF,EAASsF,GAC9D,GAAIjJ,GAAGgT,EAAQ6C,EAAO5T,EAAM2K,EAC3BkJ,EAA+B,kBAAb3X,IAA2BA,EAC7C+K,GAASD,GAAQlE,EAAW5G,EAAW2X,EAAS3X,UAAYA,EAK7D,IAHAwF,EAAUA,MAGY,IAAjBuF,EAAMjK,OAAe,CAIzB,GADA+T,EAAS9J,EAAM,GAAKA,EAAM,GAAG1L,MAAO,GAC/BwV,EAAO/T,OAAS,GAAkC,QAA5B4W,EAAQ7C,EAAO,IAAI/Q,MAC5CjE,EAAQ0O,SAAgC,IAArBtO,EAAQkE,UAAkBiD,GAC7CX,EAAKoK,SAAUgE,EAAO,GAAG/Q,MAAS,CAGnC,GADA7D,GAAYwG,EAAKgI,KAAS,GAAGiJ,EAAM3R,QAAQ,GAAGvC,QAAQ0G,GAAWC,IAAYlK,QAAkB,IACzFA,EACL,MAAOuF,EAGImS,KACX1X,EAAUA,EAAQ8E,YAGnB/E,EAAWA,EAASX,MAAOwV,EAAOnI,QAAQrH,MAAMvE,QAIjDe,EAAIsH,EAAwB,aAAE0C,KAAM7L,GAAa,EAAI6U,EAAO/T,MAC5D,OAAQe,IAAM,CAIb,GAHA6V,EAAQ7C,EAAOhT,GAGV4E,EAAKoK,SAAW/M,EAAO4T,EAAM5T,MACjC,KAED,KAAM2K,EAAOhI,EAAKgI,KAAM3K,MAEjBgH,EAAO2D,EACZiJ,EAAM3R,QAAQ,GAAGvC,QAAS0G,GAAWC,IACrCH,GAAS6B,KAAMgJ,EAAO,GAAG/Q,OAAUmI,GAAahM,EAAQ8E,aAAgB9E,IACpE,CAKJ,GAFA4U,EAAOtS,OAAQV,EAAG,GAClB7B,EAAW8K,EAAKhK,QAAUkL,GAAY6I,IAChC7U,EAEL,MADAT,GAAKuC,MAAO0D,EAASsF,GACdtF,CAGR,SAeJ,OAPEmS,GAAY9Q,EAAS7G,EAAU+K,IAChCD,EACA7K,GACCmH,EACD5B,EACAwE,GAAS6B,KAAM7L,IAAciM,GAAahM,EAAQ8E,aAAgB9E,GAE5DuF,GAMR3F,EAAQ0Q,WAAalN,EAAQkD,MAAM,IAAIjE,KAAMyF,GAAYmE,KAAK,MAAQ7I,EAItExD,EAAQyQ,mBAAqBrJ,EAG7BC,IAIArH,EAAQ6P,aAAe9C,GAAO,SAAUgL,GAEvC,MAAuE,GAAhEA,EAAKtI,wBAAyBxQ,EAAS6F,cAAc,UAMvDiI,GAAO,SAAUC,GAEtB,MADAA,GAAIiC,UAAY,mBAC+B,MAAxCjC,EAAI4D,WAAW3E,aAAa,WAEnCgB,GAAW,yBAA0B,SAAUlL,EAAMc,EAAMiE,GAC1D,MAAMA,GAAN,OACQ/E,EAAKkK,aAAcpJ,EAA6B,SAAvBA,EAAK0C,cAA2B,EAAI,KAOjEvF,EAAQ6I,YAAekE,GAAO,SAAUC,GAG7C,MAFAA,GAAIiC,UAAY,WAChBjC,EAAI4D,WAAW1E,aAAc,QAAS,IACY,KAA3Cc,EAAI4D,WAAW3E,aAAc,YAEpCgB,GAAW,QAAS,SAAUlL,EAAMc,EAAMiE,GACzC,MAAMA,IAAyC,UAAhC/E,EAAKuD,SAASC,cAA7B,OACQxD,EAAKiW,eAOTjL,GAAO,SAAUC,GACtB,MAAuC,OAAhCA,EAAIf,aAAa,eAExBgB,GAAWxE,EAAU,SAAU1G,EAAMc,EAAMiE,GAC1C,GAAIuJ,EACJ,OAAMvJ,GAAN,OACQ/E,EAAMc,MAAW,EAAOA,EAAK0C,eACjC8K,EAAMtO,EAAKgN,iBAAkBlM,KAAWwN,EAAIC,UAC7CD,EAAI7K,MACL,OAKGmB,IAEHvH,EAIJc,GAAO0O,KAAOjI,EACdzG,EAAOgQ,KAAOvJ,EAAOmK,UACrB5Q,EAAOgQ,KAAK,KAAOhQ,EAAOgQ,KAAKpH,QAC/B5I,EAAO+X,OAAStR,EAAO4J,WACvBrQ,EAAO6E,KAAO4B,EAAOE,QACrB3G,EAAOgY,SAAWvR,EAAOG,MACzB5G,EAAOwH,SAAWf,EAAOe,QAIzB,IAAIyQ,GAAgBjY,EAAOgQ,KAAKhF,MAAMpB,aAElCsO,EAAa,6BAIbC,EAAY,gBAGhB,SAASC,GAAQnI,EAAUoI,EAAW3F,GACrC,GAAK1S,EAAOkD,WAAYmV,GACvB,MAAOrY,GAAO6F,KAAMoK,EAAU,SAAUpO,EAAMC,GAE7C,QAASuW,EAAUpX,KAAMY,EAAMC,EAAGD,KAAW6Q,GAK/C,IAAK2F,EAAUjU,SACd,MAAOpE,GAAO6F,KAAMoK,EAAU,SAAUpO,GACvC,MAASA,KAASwW,IAAgB3F,GAKpC,IAA0B,gBAAd2F,GAAyB,CACpC,GAAKF,EAAUrM,KAAMuM,GACpB,MAAOrY,GAAO2O,OAAQ0J,EAAWpI,EAAUyC,EAG5C2F,GAAYrY,EAAO2O,OAAQ0J,EAAWpI,GAGvC,MAAOjQ,GAAO6F,KAAMoK,EAAU,SAAUpO,GACvC,MAASpC,GAAQwB,KAAMoX,EAAWxW,IAAU,IAAQ6Q,IAItD1S,EAAO2O,OAAS,SAAUqB,EAAM3O,EAAOqR,GACtC,GAAI7Q,GAAOR,EAAO,EAMlB,OAJKqR,KACJ1C,EAAO,QAAUA,EAAO,KAGD,IAAjB3O,EAAMN,QAAkC,IAAlBc,EAAKuC,SACjCpE,EAAO0O,KAAKO,gBAAiBpN,EAAMmO,IAAWnO,MAC9C7B,EAAO0O,KAAK1I,QAASgK,EAAMhQ,EAAO6F,KAAMxE,EAAO,SAAUQ,GACxD,MAAyB,KAAlBA,EAAKuC,aAIfpE,EAAOG,GAAGsC,QACTiM,KAAM,SAAUzO,GACf,GAAI6B,GACHM,EAAMjD,KAAK4B,OACXO,KACAgX,EAAOnZ,IAER,IAAyB,gBAAbc,GACX,MAAOd,MAAKiC,UAAWpB,EAAQC,GAAW0O,OAAO,WAChD,IAAM7M,EAAI,EAAOM,EAAJN,EAASA,IACrB,GAAK9B,EAAOwH,SAAU8Q,EAAMxW,GAAK3C,MAChC,OAAO,IAMX,KAAM2C,EAAI,EAAOM,EAAJN,EAASA,IACrB9B,EAAO0O,KAAMzO,EAAUqY,EAAMxW,GAAKR,EAMnC,OAFAA,GAAMnC,KAAKiC,UAAWgB,EAAM,EAAIpC,EAAO+X,OAAQzW,GAAQA,GACvDA,EAAIrB,SAAWd,KAAKc,SAAWd,KAAKc,SAAW,IAAMA,EAAWA,EACzDqB,GAERqN,OAAQ,SAAU1O,GACjB,MAAOd,MAAKiC,UAAWgX,EAAOjZ,KAAMc,OAAgB,KAErDyS,IAAK,SAAUzS,GACd,MAAOd,MAAKiC,UAAWgX,EAAOjZ,KAAMc,OAAgB,KAErDsY,GAAI,SAAUtY,GACb,QAASmY,EACRjZ,KAIoB,gBAAbc,IAAyBgY,EAAcnM,KAAM7L,GACnDD,EAAQC,GACRA,OACD,GACCc,SASJ,IAAIyX,GAKHxO,EAAa,sCAEb5J,EAAOJ,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,GAC3C,GAAI8K,GAAOnJ,CAGX,KAAM5B,EACL,MAAOd,KAIR,IAAyB,gBAAbc,GAAwB,CAUnC,GAPC+K,EAFoB,MAAhB/K,EAAS,IAAkD,MAApCA,EAAUA,EAASc,OAAS,IAAed,EAASc,QAAU,GAE/E,KAAMd,EAAU,MAGlB+J,EAAWwB,KAAMvL,IAIrB+K,IAAUA,EAAM,IAAO9K,EAgDrB,OAAMA,GAAWA,EAAQW,QACtBX,GAAWsY,GAAa9J,KAAMzO,GAKhCd,KAAK2B,YAAaZ,GAAUwO,KAAMzO,EAnDzC,IAAK+K,EAAM,GAAK,CAYf,GAXA9K,EAAUA,YAAmBF,GAASE,EAAQ,GAAKA,EAInDF,EAAOuB,MAAOpC,KAAMa,EAAOyY,UAC1BzN,EAAM,GACN9K,GAAWA,EAAQkE,SAAWlE,EAAQqL,eAAiBrL,EAAUnB,GACjE,IAIImZ,EAAWpM,KAAMd,EAAM,KAAQhL,EAAOmD,cAAejD,GACzD,IAAM8K,IAAS9K,GAETF,EAAOkD,WAAY/D,KAAM6L,IAC7B7L,KAAM6L,GAAS9K,EAAS8K,IAIxB7L,KAAK+Q,KAAMlF,EAAO9K,EAAS8K,GAK9B,OAAO7L,MAgBP,MAZA0C,GAAO9C,EAAS0M,eAAgBT,EAAM,IAIjCnJ,GAAQA,EAAKmD,aAEjB7F,KAAK4B,OAAS,EACd5B,KAAK,GAAK0C,GAGX1C,KAAKe,QAAUnB,EACfI,KAAKc,SAAWA,EACTd,KAcH,MAAKc,GAASmE,UACpBjF,KAAKe,QAAUf,KAAK,GAAKc,EACzBd,KAAK4B,OAAS,EACP5B,MAIIa,EAAOkD,WAAYjD,GACK,mBAArBuY,GAAWE,MACxBF,EAAWE,MAAOzY,GAElBA,EAAUD,IAGeqD,SAAtBpD,EAASA,WACbd,KAAKc,SAAWA,EAASA,SACzBd,KAAKe,QAAUD,EAASC,SAGlBF,EAAOwF,UAAWvF,EAAUd,OAIrCiB,GAAKQ,UAAYZ,EAAOG,GAGxBqY,EAAaxY,EAAQjB,EAGrB,IAAI4Z,GAAe,iCAElBC,GACCC,UAAU,EACVC,UAAU,EACVC,MAAM,EACNC,MAAM,EAGRhZ,GAAOyC,QACNuO,IAAK,SAAUnP,EAAMmP,EAAKiI,GACzB,GAAIxG,MACHyG,EAAqB7V,SAAV4V,CAEZ,QAASpX,EAAOA,EAAMmP,KAA4B,IAAlBnP,EAAKuC,SACpC,GAAuB,IAAlBvC,EAAKuC,SAAiB,CAC1B,GAAK8U,GAAYlZ,EAAQ6B,GAAO0W,GAAIU,GACnC,KAEDxG,GAAQjT,KAAMqC,GAGhB,MAAO4Q,IAGR0G,QAAS,SAAUC,EAAGvX,GAGrB,IAFA,GAAI4Q,MAEI2G,EAAGA,EAAIA,EAAE7L,YACI,IAAf6L,EAAEhV,UAAkBgV,IAAMvX,GAC9B4Q,EAAQjT,KAAM4Z,EAIhB,OAAO3G,MAITzS,EAAOG,GAAGsC,QACToQ,IAAK,SAAU7P,GACd,GAAIqW,GAAUrZ,EAAQgD,EAAQ7D,MAC7Bma,EAAID,EAAQtY,MAEb,OAAO5B,MAAKwP,OAAO,WAElB,IADA,GAAI7M,GAAI,EACIwX,EAAJxX,EAAOA,IACd,GAAK9B,EAAOwH,SAAUrI,KAAMka,EAAQvX,IACnC,OAAO,KAMXyX,QAAS,SAAU3I,EAAW1Q,GAS7B,IARA,GAAIkN,GACHtL,EAAI,EACJwX,EAAIna,KAAK4B,OACT0R,KACA+G,EAAMvB,EAAcnM,KAAM8E,IAAoC,gBAAdA,GAC/C5Q,EAAQ4Q,EAAW1Q,GAAWf,KAAKe,SACnC,EAEUoZ,EAAJxX,EAAOA,IACd,IAAMsL,EAAMjO,KAAK2C,GAAIsL,GAAOA,IAAQlN,EAASkN,EAAMA,EAAIpI,WAEtD,GAAKoI,EAAIhJ,SAAW,KAAOoV,EAC1BA,EAAIC,MAAMrM,GAAO,GAGA,IAAjBA,EAAIhJ,UACHpE,EAAO0O,KAAKO,gBAAgB7B,EAAKwD,IAAc,CAEhD6B,EAAQjT,KAAM4N,EACd,OAKH,MAAOjO,MAAKiC,UAAWqR,EAAQ1R,OAAS,EAAIf,EAAO+X,OAAQtF,GAAYA,IAIxEgH,MAAO,SAAU5X,GAGhB,MAAMA,GAKe,gBAATA,GACJpC,EAAQwB,KAAMjB,EAAQ6B,GAAQ1C,KAAM,IAIrCM,EAAQwB,KAAM9B,KAGpB0C,EAAKhB,OAASgB,EAAM,GAAMA,GAZjB1C,KAAM,IAAOA,KAAM,GAAI6F,WAAe7F,KAAK8C,QAAQyX,UAAU3Y,OAAS,IAgBjF4Y,IAAK,SAAU1Z,EAAUC,GACxB,MAAOf,MAAKiC,UACXpB,EAAO+X,OACN/X,EAAOuB,MAAOpC,KAAK+B,MAAOlB,EAAQC,EAAUC,OAK/C0Z,QAAS,SAAU3Z,GAClB,MAAOd,MAAKwa,IAAiB,MAAZ1Z,EAChBd,KAAKqC,WAAarC,KAAKqC,WAAWmN,OAAO1O,MAK5C,SAASkZ,GAAS/L,EAAK4D,GACtB,OAAS5D,EAAMA,EAAI4D,KAA0B,IAAjB5D,EAAIhJ,UAChC,MAAOgJ,GAGRpN,EAAOyB,MACNuM,OAAQ,SAAUnM,GACjB,GAAImM,GAASnM,EAAKmD,UAClB,OAAOgJ,IAA8B,KAApBA,EAAO5J,SAAkB4J,EAAS,MAEpD6L,QAAS,SAAUhY,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,eAE1BiY,aAAc,SAAUjY,EAAMC,EAAGmX,GAChC,MAAOjZ,GAAOgR,IAAKnP,EAAM,aAAcoX,IAExCF,KAAM,SAAUlX,GACf,MAAOsX,GAAStX,EAAM,gBAEvBmX,KAAM,SAAUnX,GACf,MAAOsX,GAAStX,EAAM,oBAEvBkY,QAAS,SAAUlY,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,gBAE1B6X,QAAS,SAAU7X,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,oBAE1BmY,UAAW,SAAUnY,EAAMC,EAAGmX,GAC7B,MAAOjZ,GAAOgR,IAAKnP,EAAM,cAAeoX,IAEzCgB,UAAW,SAAUpY,EAAMC,EAAGmX,GAC7B,MAAOjZ,GAAOgR,IAAKnP,EAAM,kBAAmBoX,IAE7CiB,SAAU,SAAUrY,GACnB,MAAO7B,GAAOmZ,SAAWtX,EAAKmD,gBAAmB0L,WAAY7O,IAE9DgX,SAAU,SAAUhX,GACnB,MAAO7B,GAAOmZ,QAAStX,EAAK6O,aAE7BoI,SAAU,SAAUjX,GACnB,MAAOA,GAAKsY,iBAAmBna,EAAOuB,SAAWM,EAAK+I,cAErD,SAAUjI,EAAMxC,GAClBH,EAAOG,GAAIwC,GAAS,SAAUsW,EAAOhZ,GACpC,GAAIwS,GAAUzS,EAAO4B,IAAKzC,KAAMgB,EAAI8Y,EAsBpC,OApB0B,UAArBtW,EAAKrD,MAAO,MAChBW,EAAWgZ,GAGPhZ,GAAgC,gBAAbA,KACvBwS,EAAUzS,EAAO2O,OAAQ1O,EAAUwS,IAG/BtT,KAAK4B,OAAS,IAEZ6X,EAAkBjW,IACvB3C,EAAO+X,OAAQtF,GAIXkG,EAAa7M,KAAMnJ,IACvB8P,EAAQ2H,WAIHjb,KAAKiC,UAAWqR,KAGzB,IAAI4H,GAAY,OAKZC,IAGJ,SAASC,GAAe7X,GACvB,GAAI8X,GAASF,EAAc5X,KAI3B,OAHA1C,GAAOyB,KAAMiB,EAAQsI,MAAOqP,OAAmB,SAAUhQ,EAAGoQ,GAC3DD,EAAQC,IAAS,IAEXD,EAyBRxa,EAAO0a,UAAY,SAAUhY,GAI5BA,EAA6B,gBAAZA,GACd4X,EAAc5X,IAAa6X,EAAe7X,GAC5C1C,EAAOyC,UAAYC,EAEpB,IACCiY,GAEAC,EAEAC,EAEAC,EAEAC,EAEAC,EAEA1S,KAEA2S,GAASvY,EAAQwY,SAEjBC,EAAO,SAAUC,GAOhB,IANAT,EAASjY,EAAQiY,QAAUS,EAC3BR,GAAQ,EACRI,EAAcF,GAAe,EAC7BA,EAAc,EACdC,EAAezS,EAAKvH,OACpB8Z,GAAS,EACDvS,GAAsByS,EAAdC,EAA4BA,IAC3C,GAAK1S,EAAM0S,GAAcjZ,MAAOqZ,EAAM,GAAKA,EAAM,OAAU,GAAS1Y,EAAQ2Y,YAAc,CACzFV,GAAS,CACT,OAGFE,GAAS,EACJvS,IACC2S,EACCA,EAAMla,QACVoa,EAAMF,EAAMtO,SAEFgO,EACXrS,KAEAgQ,EAAKgD,YAKRhD,GAECqB,IAAK,WACJ,GAAKrR,EAAO,CAEX,GAAI6J,GAAQ7J,EAAKvH,QACjB,QAAU4Y,GAAKhY,GACd3B,EAAOyB,KAAME,EAAM,SAAU0I,EAAGnE,GAC/B,GAAInC,GAAO/D,EAAO+D,KAAMmC,EACV,cAATnC,EACErB,EAAQqV,QAAWO,EAAKzF,IAAK3M,IAClCoC,EAAK9I,KAAM0G,GAEDA,GAAOA,EAAInF,QAAmB,WAATgD,GAEhC4V,EAAKzT,MAGJlE,WAGC6Y,EACJE,EAAezS,EAAKvH,OAGT4Z,IACXG,EAAc3I,EACdgJ,EAAMR,IAGR,MAAOxb,OAGRoc,OAAQ,WAkBP,MAjBKjT,IACJtI,EAAOyB,KAAMO,UAAW,SAAUqI,EAAGnE,GACpC,GAAIuT,EACJ,QAAUA,EAAQzZ,EAAO2F,QAASO,EAAKoC,EAAMmR,IAAY,GACxDnR,EAAK9F,OAAQiX,EAAO,GAEfoB,IACUE,GAATtB,GACJsB,IAEaC,GAATvB,GACJuB,OAME7b,MAIR0T,IAAK,SAAU1S,GACd,MAAOA,GAAKH,EAAO2F,QAASxF,EAAImI,GAAS,MAASA,IAAQA,EAAKvH,SAGhE+S,MAAO,WAGN,MAFAxL,MACAyS,EAAe,EACR5b,MAGRmc,QAAS,WAER,MADAhT,GAAO2S,EAAQN,EAAStX,OACjBlE,MAGRuU,SAAU,WACT,OAAQpL,GAGTkT,KAAM,WAKL,MAJAP,GAAQ5X,OACFsX,GACLrC,EAAKgD,UAECnc,MAGRsc,OAAQ,WACP,OAAQR,GAGTS,SAAU,SAAUxb,EAASyB,GAU5B,OATK2G,GAAWsS,IAASK,IACxBtZ,EAAOA,MACPA,GAASzB,EAASyB,EAAKrC,MAAQqC,EAAKrC,QAAUqC,GACzCkZ,EACJI,EAAMzb,KAAMmC,GAEZwZ,EAAMxZ,IAGDxC,MAGRgc,KAAM,WAEL,MADA7C,GAAKoD,SAAUvc,KAAM6C,WACd7C,MAGRyb,MAAO,WACN,QAASA,GAIZ,OAAOtC,IAIRtY,EAAOyC,QAENkZ,SAAU,SAAUC,GACnB,GAAIC,KAEA,UAAW,OAAQ7b,EAAO0a,UAAU,eAAgB,aACpD,SAAU,OAAQ1a,EAAO0a,UAAU,eAAgB,aACnD,SAAU,WAAY1a,EAAO0a,UAAU,YAE1CoB,EAAQ,UACRC,GACCD,MAAO,WACN,MAAOA,IAERE,OAAQ,WAEP,MADAC,GAAStU,KAAM3F,WAAYka,KAAMla,WAC1B7C,MAERgd,KAAM,WACL,GAAIC,GAAMpa,SACV,OAAOhC,GAAO2b,SAAS,SAAUU,GAChCrc,EAAOyB,KAAMoa,EAAQ,SAAU/Z,EAAGwa,GACjC,GAAInc,GAAKH,EAAOkD,WAAYkZ,EAAKta,KAASsa,EAAKta,EAE/Cma,GAAUK,EAAM,IAAK,WACpB,GAAIC,GAAWpc,GAAMA,EAAG4B,MAAO5C,KAAM6C,UAChCua,IAAYvc,EAAOkD,WAAYqZ,EAASR,SAC5CQ,EAASR,UACPpU,KAAM0U,EAASG,SACfN,KAAMG,EAASI,QACfC,SAAUL,EAASM,QAErBN,EAAUC,EAAO,GAAM,QAAUnd,OAAS4c,EAAUM,EAASN,UAAY5c,KAAMgB,GAAOoc,GAAava,eAItGoa,EAAM,OACJL,WAIJA,QAAS,SAAUjY,GAClB,MAAc,OAAPA,EAAc9D,EAAOyC,OAAQqB,EAAKiY,GAAYA,IAGvDE,IAwCD,OArCAF,GAAQa,KAAOb,EAAQI,KAGvBnc,EAAOyB,KAAMoa,EAAQ,SAAU/Z,EAAGwa,GACjC,GAAIhU,GAAOgU,EAAO,GACjBO,EAAcP,EAAO,EAGtBP,GAASO,EAAM,IAAOhU,EAAKqR,IAGtBkD,GACJvU,EAAKqR,IAAI,WAERmC,EAAQe,GAGNhB,EAAY,EAAJ/Z,GAAS,GAAIwZ,QAASO,EAAQ,GAAK,GAAIL,MAInDS,EAAUK,EAAM,IAAO,WAEtB,MADAL,GAAUK,EAAM,GAAK,QAAUnd,OAAS8c,EAAWF,EAAU5c,KAAM6C,WAC5D7C,MAER8c,EAAUK,EAAM,GAAK,QAAWhU,EAAKoT,WAItCK,EAAQA,QAASE,GAGZL,GACJA,EAAK3a,KAAMgb,EAAUA,GAIfA,GAIRa,KAAM,SAAUC,GACf,GAAIjb,GAAI,EACPkb,EAAgB1d,EAAM2B,KAAMe,WAC5BjB,EAASic,EAAcjc,OAGvBkc,EAAuB,IAAXlc,GAAkBgc,GAAe/c,EAAOkD,WAAY6Z,EAAYhB,SAAchb,EAAS,EAGnGkb,EAAyB,IAAdgB,EAAkBF,EAAc/c,EAAO2b,WAGlDuB,EAAa,SAAUpb,EAAG8T,EAAUuH,GACnC,MAAO,UAAU7X,GAChBsQ,EAAU9T,GAAM3C,KAChBge,EAAQrb,GAAME,UAAUjB,OAAS,EAAIzB,EAAM2B,KAAMe,WAAcsD,EAC1D6X,IAAWC,EACfnB,EAASoB,WAAYzH,EAAUuH,KACfF,GAChBhB,EAASqB,YAAa1H,EAAUuH,KAKnCC,EAAgBG,EAAkBC,CAGnC,IAAKzc,EAAS,EAIb,IAHAqc,EAAiB,GAAIpZ,OAAOjD,GAC5Bwc,EAAmB,GAAIvZ,OAAOjD,GAC9Byc,EAAkB,GAAIxZ,OAAOjD,GACjBA,EAAJe,EAAYA,IACdkb,EAAelb,IAAO9B,EAAOkD,WAAY8Z,EAAelb,GAAIia,SAChEiB,EAAelb,GAAIia,UACjBpU,KAAMuV,EAAYpb,EAAG0b,EAAiBR,IACtCd,KAAMD,EAASQ,QACfC,SAAUQ,EAAYpb,EAAGyb,EAAkBH,MAE3CH,CAUL,OAJMA,IACLhB,EAASqB,YAAaE,EAAiBR,GAGjCf,EAASF,YAMlB,IAAI0B,EAEJzd,GAAOG,GAAGuY,MAAQ,SAAUvY,GAI3B,MAFAH,GAAO0Y,MAAMqD,UAAUpU,KAAMxH,GAEtBhB,MAGRa,EAAOyC,QAENiB,SAAS,EAITga,UAAW,EAGXC,UAAW,SAAUC,GACfA,EACJ5d,EAAO0d,YAEP1d,EAAO0Y,OAAO,IAKhBA,MAAO,SAAUmF,IAGXA,KAAS,IAAS7d,EAAO0d,UAAY1d,EAAO0D,WAKjD1D,EAAO0D,SAAU,EAGZma,KAAS,KAAU7d,EAAO0d,UAAY,IAK3CD,EAAUH,YAAave,GAAYiB,IAG9BA,EAAOG,GAAG2d,iBACd9d,EAAQjB,GAAW+e,eAAgB,SACnC9d,EAAQjB,GAAWgf,IAAK,cAQ3B,SAASC,KACRjf,EAASkf,oBAAqB,mBAAoBD,GAAW,GAC7D9e,EAAO+e,oBAAqB,OAAQD,GAAW,GAC/Che,EAAO0Y,QAGR1Y,EAAO0Y,MAAMqD,QAAU,SAAUjY,GAqBhC,MApBM2Z,KAELA,EAAYzd,EAAO2b,WAKU,aAAxB5c,EAASmf,WAEbC,WAAYne,EAAO0Y,QAKnB3Z,EAASqP,iBAAkB,mBAAoB4P,GAAW,GAG1D9e,EAAOkP,iBAAkB,OAAQ4P,GAAW,KAGvCP,EAAU1B,QAASjY,IAI3B9D,EAAO0Y,MAAMqD,SAOb,IAAIqC,GAASpe,EAAOoe,OAAS,SAAU/c,EAAOlB,EAAIsM,EAAKnH,EAAO+Y,EAAWC,EAAUC,GAClF,GAAIzc,GAAI,EACPM,EAAMf,EAAMN,OACZyd,EAAc,MAAP/R,CAGR,IAA4B,WAAvBzM,EAAO+D,KAAM0I,GAAqB,CACtC4R,GAAY,CACZ,KAAMvc,IAAK2K,GACVzM,EAAOoe,OAAQ/c,EAAOlB,EAAI2B,EAAG2K,EAAI3K,IAAI,EAAMwc,EAAUC,OAIhD,IAAelb,SAAViC,IACX+Y,GAAY,EAENre,EAAOkD,WAAYoC,KACxBiZ,GAAM,GAGFC,IAECD,GACJpe,EAAGc,KAAMI,EAAOiE,GAChBnF,EAAK,OAILqe,EAAOre,EACPA,EAAK,SAAU0B,EAAM4K,EAAKnH,GACzB,MAAOkZ,GAAKvd,KAAMjB,EAAQ6B,GAAQyD,MAKhCnF,GACJ,KAAYiC,EAAJN,EAASA,IAChB3B,EAAIkB,EAAMS,GAAI2K,EAAK8R,EAAMjZ,EAAQA,EAAMrE,KAAMI,EAAMS,GAAIA,EAAG3B,EAAIkB,EAAMS,GAAI2K,IAK3E,OAAO4R,GACNhd,EAGAmd,EACCre,EAAGc,KAAMI,GACTe,EAAMjC,EAAIkB,EAAM,GAAIoL,GAAQ6R,EAO/Bte,GAAOye,WAAa,SAAUC,GAQ7B,MAA0B,KAAnBA,EAAMta,UAAqC,IAAnBsa,EAAMta,YAAsBsa,EAAMta,SAIlE,SAASua,KAIRjZ,OAAOkZ,eAAgBzf,KAAKqN,SAAY,GACvCtL,IAAK,WACJ,YAIF/B,KAAKmE,QAAUtD,EAAOsD,QAAUqb,EAAKE,MAGtCF,EAAKE,IAAM,EACXF,EAAKG,QAAU9e,EAAOye,WAEtBE,EAAK/d,WACJ6L,IAAK,SAAUiS,GAId,IAAMC,EAAKG,QAASJ,GACnB,MAAO,EAGR,IAAIK,MAEHC,EAASN,EAAOvf,KAAKmE,QAGtB,KAAM0b,EAAS,CACdA,EAASL,EAAKE,KAGd,KACCE,EAAY5f,KAAKmE,UAAcgC,MAAO0Z,GACtCtZ,OAAOuZ,iBAAkBP,EAAOK,GAI/B,MAAQlU,GACTkU,EAAY5f,KAAKmE,SAAY0b,EAC7Bhf,EAAOyC,OAAQic,EAAOK,IASxB,MAJM5f,MAAKqN,MAAOwS,KACjB7f,KAAKqN,MAAOwS,OAGNA,GAERE,IAAK,SAAUR,EAAOtD,EAAM9V,GAC3B,GAAI6Z,GAIHH,EAAS7f,KAAKsN,IAAKiS,GACnBlS,EAAQrN,KAAKqN,MAAOwS,EAGrB,IAAqB,gBAAT5D,GACX5O,EAAO4O,GAAS9V,MAKhB,IAAKtF,EAAOqE,cAAemI,GAC1BxM,EAAOyC,OAAQtD,KAAKqN,MAAOwS,GAAU5D,OAGrC,KAAM+D,IAAQ/D,GACb5O,EAAO2S,GAAS/D,EAAM+D,EAIzB,OAAO3S,IAERtL,IAAK,SAAUwd,EAAOjS,GAKrB,GAAID,GAAQrN,KAAKqN,MAAOrN,KAAKsN,IAAKiS,GAElC,OAAerb,UAARoJ,EACND,EAAQA,EAAOC,IAEjB2R,OAAQ,SAAUM,EAAOjS,EAAKnH,GAC7B,GAAI8Z,EAYJ,OAAa/b,UAARoJ,GACDA,GAAsB,gBAARA,IAA+BpJ,SAAViC,GAEtC8Z,EAASjgB,KAAK+B,IAAKwd,EAAOjS,GAERpJ,SAAX+b,EACNA,EAASjgB,KAAK+B,IAAKwd,EAAO1e,EAAOkF,UAAUuH,MAS7CtN,KAAK+f,IAAKR,EAAOjS,EAAKnH,GAILjC,SAAViC,EAAsBA,EAAQmH,IAEtC8O,OAAQ,SAAUmD,EAAOjS,GACxB,GAAI3K,GAAGa,EAAM0c,EACZL,EAAS7f,KAAKsN,IAAKiS,GACnBlS,EAAQrN,KAAKqN,MAAOwS,EAErB,IAAa3b,SAARoJ,EACJtN,KAAKqN,MAAOwS,UAEN,CAEDhf,EAAOoD,QAASqJ,GAOpB9J,EAAO8J,EAAIlN,OAAQkN,EAAI7K,IAAK5B,EAAOkF,aAEnCma,EAAQrf,EAAOkF,UAAWuH,GAErBA,IAAOD,GACX7J,GAAS8J,EAAK4S,IAId1c,EAAO0c,EACP1c,EAAOA,IAAQ6J,IACZ7J,GAAWA,EAAKqI,MAAOqP,SAI5BvY,EAAIa,EAAK5B,MACT,OAAQe,UACA0K,GAAO7J,EAAMb,MAIvBwd,QAAS,SAAUZ,GAClB,OAAQ1e,EAAOqE,cACdlF,KAAKqN,MAAOkS,EAAOvf,KAAKmE,gBAG1Bic,QAAS,SAAUb,GACbA,EAAOvf,KAAKmE,gBACTnE,MAAKqN,MAAOkS,EAAOvf,KAAKmE,WAIlC,IAAIkc,GAAY,GAAIb,GAEhBc,EAAY,GAAId,GAchBe,EAAS,gCACZC,EAAa,UAEd,SAASC,GAAU/d,EAAM4K,EAAK2O,GAC7B,GAAIzY,EAIJ,IAAcU,SAAT+X,GAAwC,IAAlBvZ,EAAKuC,SAI/B,GAHAzB,EAAO,QAAU8J,EAAIhJ,QAASkc,EAAY,OAAQta,cAClD+V,EAAOvZ,EAAKkK,aAAcpJ,GAEL,gBAATyY,GAAoB,CAC/B,IACCA,EAAgB,SAATA,GAAkB,EACf,UAATA,GAAmB,EACV,SAATA,EAAkB,MAEjBA,EAAO,KAAOA,GAAQA,EACvBsE,EAAO5T,KAAMsP,GAASpb,EAAO6f,UAAWzE,GACxCA,EACA,MAAOvQ,IAGT4U,EAAUP,IAAKrd,EAAM4K,EAAK2O,OAE1BA,GAAO/X,MAGT,OAAO+X,GAGRpb,EAAOyC,QACN6c,QAAS,SAAUzd,GAClB,MAAO4d,GAAUH,QAASzd,IAAU2d,EAAUF,QAASzd,IAGxDuZ,KAAM,SAAUvZ,EAAMc,EAAMyY;AAC3B,MAAOqE,GAAUrB,OAAQvc,EAAMc,EAAMyY,IAGtC0E,WAAY,SAAUje,EAAMc,GAC3B8c,EAAUlE,OAAQ1Z,EAAMc,IAKzBod,MAAO,SAAUle,EAAMc,EAAMyY,GAC5B,MAAOoE,GAAUpB,OAAQvc,EAAMc,EAAMyY,IAGtC4E,YAAa,SAAUne,EAAMc,GAC5B6c,EAAUjE,OAAQ1Z,EAAMc,MAI1B3C,EAAOG,GAAGsC,QACT2Y,KAAM,SAAU3O,EAAKnH,GACpB,GAAIxD,GAAGa,EAAMyY,EACZvZ,EAAO1C,KAAM,GACb6N,EAAQnL,GAAQA,EAAK8G,UAGtB,IAAatF,SAARoJ,EAAoB,CACxB,GAAKtN,KAAK4B,SACTqa,EAAOqE,EAAUve,IAAKW,GAEC,IAAlBA,EAAKuC,WAAmBob,EAAUte,IAAKW,EAAM,iBAAmB,CACpEC,EAAIkL,EAAMjM,MACV,OAAQe,IAIFkL,EAAOlL,KACXa,EAAOqK,EAAOlL,GAAIa,KACe,IAA5BA,EAAKlD,QAAS,WAClBkD,EAAO3C,EAAOkF,UAAWvC,EAAKrD,MAAM,IACpCsgB,EAAU/d,EAAMc,EAAMyY,EAAMzY,KAI/B6c,GAAUN,IAAKrd,EAAM,gBAAgB,GAIvC,MAAOuZ,GAIR,MAAoB,gBAAR3O,GACJtN,KAAKsC,KAAK,WAChBge,EAAUP,IAAK/f,KAAMsN,KAIhB2R,EAAQjf,KAAM,SAAUmG,GAC9B,GAAI8V,GACH6E,EAAWjgB,EAAOkF,UAAWuH,EAO9B,IAAK5K,GAAkBwB,SAAViC,EAAb,CAIC,GADA8V,EAAOqE,EAAUve,IAAKW,EAAM4K,GACdpJ,SAAT+X,EACJ,MAAOA,EAMR,IADAA,EAAOqE,EAAUve,IAAKW,EAAMoe,GACd5c,SAAT+X,EACJ,MAAOA,EAMR,IADAA,EAAOwE,EAAU/d,EAAMoe,EAAU5c,QACnBA,SAAT+X,EACJ,MAAOA,OAQTjc,MAAKsC,KAAK,WAGT,GAAI2Z,GAAOqE,EAAUve,IAAK/B,KAAM8gB,EAKhCR,GAAUP,IAAK/f,KAAM8gB,EAAU3a,GAKL,KAArBmH,EAAIhN,QAAQ,MAAwB4D,SAAT+X,GAC/BqE,EAAUP,IAAK/f,KAAMsN,EAAKnH,MAG1B,KAAMA,EAAOtD,UAAUjB,OAAS,EAAG,MAAM,IAG7C+e,WAAY,SAAUrT,GACrB,MAAOtN,MAAKsC,KAAK,WAChBge,EAAUlE,OAAQpc,KAAMsN,QAM3BzM,EAAOyC,QACNyd,MAAO,SAAUre,EAAMkC,EAAMqX,GAC5B,GAAI8E,EAEJ,OAAKre,IACJkC,GAASA,GAAQ,MAAS,QAC1Bmc,EAAQV,EAAUte,IAAKW,EAAMkC,GAGxBqX,KACE8E,GAASlgB,EAAOoD,QAASgY,GAC9B8E,EAAQV,EAAUpB,OAAQvc,EAAMkC,EAAM/D,EAAOwF,UAAU4V,IAEvD8E,EAAM1gB,KAAM4b,IAGP8E,OAZR,QAgBDC,QAAS,SAAUte,EAAMkC,GACxBA,EAAOA,GAAQ,IAEf,IAAImc,GAAQlgB,EAAOkgB,MAAOre,EAAMkC,GAC/Bqc,EAAcF,EAAMnf,OACpBZ,EAAK+f,EAAMvT,QACX0T,EAAQrgB,EAAOsgB,YAAaze,EAAMkC,GAClCgV,EAAO,WACN/Y,EAAOmgB,QAASte,EAAMkC,GAIZ,gBAAP5D,IACJA,EAAK+f,EAAMvT,QACXyT,KAGIjgB,IAIU,OAAT4D,GACJmc,EAAMnQ,QAAS,oBAITsQ,GAAME,KACbpgB,EAAGc,KAAMY,EAAMkX,EAAMsH,KAGhBD,GAAeC,GACpBA,EAAMvM,MAAMqH,QAKdmF,YAAa,SAAUze,EAAMkC,GAC5B,GAAI0I,GAAM1I,EAAO,YACjB,OAAOyb,GAAUte,IAAKW,EAAM4K,IAAS+S,EAAUpB,OAAQvc,EAAM4K,GAC5DqH,MAAO9T,EAAO0a,UAAU,eAAef,IAAI,WAC1C6F,EAAUjE,OAAQ1Z,GAAQkC,EAAO,QAAS0I,WAM9CzM,EAAOG,GAAGsC,QACTyd,MAAO,SAAUnc,EAAMqX,GACtB,GAAIoF,GAAS,CAQb,OANqB,gBAATzc,KACXqX,EAAOrX,EACPA,EAAO,KACPyc,KAGIxe,UAAUjB,OAASyf,EAChBxgB,EAAOkgB,MAAO/gB,KAAK,GAAI4E,GAGfV,SAAT+X,EACNjc,KACAA,KAAKsC,KAAK,WACT,GAAIye,GAAQlgB,EAAOkgB,MAAO/gB,KAAM4E,EAAMqX,EAGtCpb,GAAOsgB,YAAanhB,KAAM4E,GAEZ,OAATA,GAA8B,eAAbmc,EAAM,IAC3BlgB,EAAOmgB,QAAShhB,KAAM4E,MAI1Boc,QAAS,SAAUpc,GAClB,MAAO5E,MAAKsC,KAAK,WAChBzB,EAAOmgB,QAAShhB,KAAM4E,MAGxB0c,WAAY,SAAU1c,GACrB,MAAO5E,MAAK+gB,MAAOnc,GAAQ,UAI5BgY,QAAS,SAAUhY,EAAMD,GACxB,GAAIuC,GACHqa,EAAQ,EACRC,EAAQ3gB,EAAO2b,WACf1L,EAAW9Q,KACX2C,EAAI3C,KAAK4B,OACTyb,EAAU,aACCkE,GACTC,EAAMrD,YAAarN,GAAYA,IAIb,iBAATlM,KACXD,EAAMC,EACNA,EAAOV,QAERU,EAAOA,GAAQ,IAEf,OAAQjC,IACPuE,EAAMmZ,EAAUte,IAAK+O,EAAUnO,GAAKiC,EAAO,cACtCsC,GAAOA,EAAIyN,QACf4M,IACAra,EAAIyN,MAAM6F,IAAK6C,GAIjB,OADAA,KACOmE,EAAM5E,QAASjY,KAGxB,IAAI8c,GAAO,sCAAwCC,OAE/CC,GAAc,MAAO,QAAS,SAAU,QAExCC,EAAW,SAAUlf,EAAMmf,GAI7B,MADAnf,GAAOmf,GAAMnf,EAC4B,SAAlC7B,EAAOihB,IAAKpf,EAAM,aAA2B7B,EAAOwH,SAAU3F,EAAK0J,cAAe1J,IAGvFqf,EAAiB,yBAIrB,WACC,GAAIC,GAAWpiB,EAASqiB,yBACvBtU,EAAMqU,EAASpc,YAAahG,EAAS6F,cAAe,QACpDoK,EAAQjQ,EAAS6F,cAAe,QAMjCoK,GAAMhD,aAAc,OAAQ,SAC5BgD,EAAMhD,aAAc,UAAW,WAC/BgD,EAAMhD,aAAc,OAAQ,KAE5Bc,EAAI/H,YAAaiK,GAIjBlP,EAAQuhB,WAAavU,EAAIwU,WAAW,GAAOA,WAAW,GAAOjP,UAAUsB,QAIvE7G,EAAIiC,UAAY,yBAChBjP,EAAQyhB,iBAAmBzU,EAAIwU,WAAW,GAAOjP,UAAUyF,eAE5D,IAAI0J,GAAe,WAInB1hB,GAAQ2hB,eAAiB,aAAeviB,EAGxC,IACCwiB,GAAY,OACZC,EAAc,uCACdC,EAAc,kCACdC,EAAiB,sBAElB,SAASC,KACR,OAAO,EAGR,QAASC,KACR,OAAO,EAGR,QAASC,KACR,IACC,MAAOjjB,GAASsU,cACf,MAAQ4O,KAOXjiB,EAAOkiB,OAENvjB,UAEAgb,IAAK,SAAU9X,EAAMsgB,EAAOlV,EAASmO,EAAMnb,GAE1C,GAAImiB,GAAaC,EAAahc,EAC7Bic,EAAQC,EAAGC,EACXC,EAASC,EAAU3e,EAAM4e,EAAYC,EACrCC,EAAWrD,EAAUte,IAAKW,EAG3B,IAAMghB,EAAN,CAKK5V,EAAQA,UACZmV,EAAcnV,EACdA,EAAUmV,EAAYnV,QACtBhN,EAAWmiB,EAAYniB,UAIlBgN,EAAQ9G,OACb8G,EAAQ9G,KAAOnG,EAAOmG,SAIhBmc,EAASO,EAASP,UACxBA,EAASO,EAASP,YAEZD,EAAcQ,EAASC,UAC7BT,EAAcQ,EAASC,OAAS,SAAUjY,GAGzC,aAAc7K,KAAWwhB,GAAgBxhB,EAAOkiB,MAAMa,YAAclY,EAAE9G,KACrE/D,EAAOkiB,MAAMc,SAASjhB,MAAOF,EAAMG,WAAcqB,SAKpD8e,GAAUA,GAAS,IAAKnX,MAAOqP,KAAiB,IAChDkI,EAAIJ,EAAMphB,MACV,OAAQwhB,IACPlc,EAAMwb,EAAerW,KAAM2W,EAAMI,QACjCxe,EAAO6e,EAAWvc,EAAI,GACtBsc,GAAetc,EAAI,IAAM,IAAKG,MAAO,KAAMjE,OAGrCwB,IAKN0e,EAAUziB,EAAOkiB,MAAMO,QAAS1e,OAGhCA,GAAS9D,EAAWwiB,EAAQQ,aAAeR,EAAQS,WAAcnf,EAGjE0e,EAAUziB,EAAOkiB,MAAMO,QAAS1e,OAGhCye,EAAYxiB,EAAOyC,QAClBsB,KAAMA,EACN6e,SAAUA,EACVxH,KAAMA,EACNnO,QAASA,EACT9G,KAAM8G,EAAQ9G,KACdlG,SAAUA,EACV2J,aAAc3J,GAAYD,EAAOgQ,KAAKhF,MAAMpB,aAAakC,KAAM7L,GAC/DkjB,UAAWR,EAAWxW,KAAK,MACzBiW,IAGIM,EAAWJ,EAAQve,MACzB2e,EAAWJ,EAAQve,MACnB2e,EAASU,cAAgB,EAGnBX,EAAQY,OAASZ,EAAQY,MAAMpiB,KAAMY,EAAMuZ,EAAMuH,EAAYN,MAAkB,GAC/ExgB,EAAKuM,kBACTvM,EAAKuM,iBAAkBrK,EAAMse,GAAa,IAKxCI,EAAQ9I,MACZ8I,EAAQ9I,IAAI1Y,KAAMY,EAAM2gB,GAElBA,EAAUvV,QAAQ9G,OACvBqc,EAAUvV,QAAQ9G,KAAO8G,EAAQ9G,OAK9BlG,EACJyiB,EAASlgB,OAAQkgB,EAASU,gBAAiB,EAAGZ,GAE9CE,EAASljB,KAAMgjB,GAIhBxiB,EAAOkiB,MAAMvjB,OAAQoF,IAAS,KAMhCwX,OAAQ,SAAU1Z,EAAMsgB,EAAOlV,EAAShN,EAAUqjB,GAEjD,GAAIjhB,GAAGkhB,EAAWld,EACjBic,EAAQC,EAAGC,EACXC,EAASC,EAAU3e,EAAM4e,EAAYC,EACrCC,EAAWrD,EAAUF,QAASzd,IAAU2d,EAAUte,IAAKW,EAExD,IAAMghB,IAAcP,EAASO,EAASP,QAAtC,CAKAH,GAAUA,GAAS,IAAKnX,MAAOqP,KAAiB,IAChDkI,EAAIJ,EAAMphB,MACV,OAAQwhB,IAMP,GALAlc,EAAMwb,EAAerW,KAAM2W,EAAMI,QACjCxe,EAAO6e,EAAWvc,EAAI,GACtBsc,GAAetc,EAAI,IAAM,IAAKG,MAAO,KAAMjE,OAGrCwB,EAAN,CAOA0e,EAAUziB,EAAOkiB,MAAMO,QAAS1e,OAChCA,GAAS9D,EAAWwiB,EAAQQ,aAAeR,EAAQS,WAAcnf,EACjE2e,EAAWJ,EAAQve,OACnBsC,EAAMA,EAAI,IAAM,GAAIyC,QAAQ,UAAY6Z,EAAWxW,KAAK,iBAAmB,WAG3EoX,EAAYlhB,EAAIqgB,EAAS3hB,MACzB,OAAQsB,IACPmgB,EAAYE,EAAUrgB,IAEfihB,GAAeV,IAAaJ,EAAUI,UACzC3V,GAAWA,EAAQ9G,OAASqc,EAAUrc,MACtCE,IAAOA,EAAIyF,KAAM0W,EAAUW,YAC3BljB,GAAYA,IAAauiB,EAAUviB,WAAyB,OAAbA,IAAqBuiB,EAAUviB,YACjFyiB,EAASlgB,OAAQH,EAAG,GAEfmgB,EAAUviB,UACdyiB,EAASU,gBAELX,EAAQlH,QACZkH,EAAQlH,OAAOta,KAAMY,EAAM2gB,GAOzBe,KAAcb,EAAS3hB,SACrB0hB,EAAQe,UAAYf,EAAQe,SAASviB,KAAMY,EAAM8gB,EAAYE,EAASC,WAAa,GACxF9iB,EAAOyjB,YAAa5hB,EAAMkC,EAAM8e,EAASC,cAGnCR,GAAQve,QAtCf,KAAMA,IAAQue,GACbtiB,EAAOkiB,MAAM3G,OAAQ1Z,EAAMkC,EAAOoe,EAAOI,GAAKtV,EAAShN,GAAU,EA0C/DD,GAAOqE,cAAeie,WACnBO,GAASC,OAChBtD,EAAUjE,OAAQ1Z,EAAM,aAI1B6hB,QAAS,SAAUxB,EAAO9G,EAAMvZ,EAAM8hB,GAErC,GAAI7hB,GAAGsL,EAAK/G,EAAKud,EAAYC,EAAQf,EAAQL,EAC5CqB,GAAcjiB,GAAQ9C,GACtBgF,EAAOnE,EAAOqB,KAAMihB,EAAO,QAAWA,EAAMne,KAAOme,EACnDS,EAAa/iB,EAAOqB,KAAMihB,EAAO,aAAgBA,EAAMiB,UAAU3c,MAAM,OAKxE,IAHA4G,EAAM/G,EAAMxE,EAAOA,GAAQ9C,EAGJ,IAAlB8C,EAAKuC,UAAoC,IAAlBvC,EAAKuC,WAK5Bwd,EAAY9V,KAAM/H,EAAO/D,EAAOkiB,MAAMa,aAItChf,EAAKtE,QAAQ,MAAQ,IAEzBkjB,EAAa5e,EAAKyC,MAAM,KACxBzC,EAAO4e,EAAWhW,QAClBgW,EAAWpgB,QAEZshB,EAAS9f,EAAKtE,QAAQ,KAAO,GAAK,KAAOsE,EAGzCme,EAAQA,EAAOliB,EAAOsD,SACrB4e,EACA,GAAIliB,GAAO+jB,MAAOhgB,EAAuB,gBAAVme,IAAsBA,GAGtDA,EAAM8B,UAAYL,EAAe,EAAI,EACrCzB,EAAMiB,UAAYR,EAAWxW,KAAK,KAClC+V,EAAM+B,aAAe/B,EAAMiB,UAC1B,GAAIra,QAAQ,UAAY6Z,EAAWxW,KAAK,iBAAmB,WAC3D,KAGD+V,EAAMvQ,OAAStO,OACT6e,EAAMlf,SACXkf,EAAMlf,OAASnB,GAIhBuZ,EAAe,MAARA,GACJ8G,GACFliB,EAAOwF,UAAW4V,GAAQ8G,IAG3BO,EAAUziB,EAAOkiB,MAAMO,QAAS1e,OAC1B4f,IAAgBlB,EAAQiB,SAAWjB,EAAQiB,QAAQ3hB,MAAOF,EAAMuZ,MAAW,GAAjF,CAMA,IAAMuI,IAAiBlB,EAAQyB,WAAalkB,EAAOiE,SAAUpC,GAAS,CAMrE,IAJA+hB,EAAanB,EAAQQ,cAAgBlf,EAC/B6d,EAAY9V,KAAM8X,EAAa7f,KACpCqJ,EAAMA,EAAIpI,YAEHoI,EAAKA,EAAMA,EAAIpI,WACtB8e,EAAUtkB,KAAM4N,GAChB/G,EAAM+G,CAIF/G,MAASxE,EAAK0J,eAAiBxM,IACnC+kB,EAAUtkB,KAAM6G,EAAI6H,aAAe7H,EAAI8d,cAAgBjlB,GAKzD4C,EAAI,CACJ,QAASsL,EAAM0W,EAAUhiB,QAAUogB,EAAMkC,uBAExClC,EAAMne,KAAOjC,EAAI,EAChB8hB,EACAnB,EAAQS,UAAYnf,EAGrB+e,GAAWtD,EAAUte,IAAKkM,EAAK,eAAoB8U,EAAMne,OAAUyb,EAAUte,IAAKkM,EAAK,UAClF0V,GACJA,EAAO/gB,MAAOqL,EAAKgO,GAIpB0H,EAASe,GAAUzW,EAAKyW,GACnBf,GAAUA,EAAO/gB,OAAS/B,EAAOye,WAAYrR,KACjD8U,EAAMvQ,OAASmR,EAAO/gB,MAAOqL,EAAKgO,GAC7B8G,EAAMvQ,UAAW,GACrBuQ,EAAMmC,iBAmCT,OA/BAnC,GAAMne,KAAOA,EAGP4f,GAAiBzB,EAAMoC,sBAErB7B,EAAQ8B,UAAY9B,EAAQ8B,SAASxiB,MAAO+hB,EAAU1b,MAAOgT,MAAW,IAC9Epb,EAAOye,WAAY5c,IAIdgiB,GAAU7jB,EAAOkD,WAAYrB,EAAMkC,MAAa/D,EAAOiE,SAAUpC,KAGrEwE,EAAMxE,EAAMgiB,GAEPxd,IACJxE,EAAMgiB,GAAW,MAIlB7jB,EAAOkiB,MAAMa,UAAYhf,EACzBlC,EAAMkC,KACN/D,EAAOkiB,MAAMa,UAAY1f,OAEpBgD,IACJxE,EAAMgiB,GAAWxd,IAMd6b,EAAMvQ,SAGdqR,SAAU,SAAUd,GAGnBA,EAAQliB,EAAOkiB,MAAMsC,IAAKtC,EAE1B,IAAIpgB,GAAGO,EAAGf,EAAKmR,EAAS+P,EACvBiC,KACA9iB,EAAOrC,EAAM2B,KAAMe,WACnB0gB,GAAalD,EAAUte,IAAK/B,KAAM,eAAoB+iB,EAAMne,UAC5D0e,EAAUziB,EAAOkiB,MAAMO,QAASP,EAAMne,SAOvC,IAJApC,EAAK,GAAKugB,EACVA,EAAMwC,eAAiBvlB,MAGlBsjB,EAAQkC,aAAelC,EAAQkC,YAAY1jB,KAAM9B,KAAM+iB,MAAY,EAAxE,CAKAuC,EAAezkB,EAAOkiB,MAAMQ,SAASzhB,KAAM9B,KAAM+iB,EAAOQ,GAGxD5gB,EAAI,CACJ,QAAS2Q,EAAUgS,EAAc3iB,QAAWogB,EAAMkC,uBAAyB,CAC1ElC,EAAM0C,cAAgBnS,EAAQ5Q,KAE9BQ,EAAI,CACJ,QAASmgB,EAAY/P,EAAQiQ,SAAUrgB,QAAW6f,EAAM2C,kCAIjD3C,EAAM+B,cAAgB/B,EAAM+B,aAAanY,KAAM0W,EAAUW,cAE9DjB,EAAMM,UAAYA,EAClBN,EAAM9G,KAAOoH,EAAUpH,KAEvB9Z,IAAStB,EAAOkiB,MAAMO,QAASD,EAAUI,eAAkBE,QAAUN,EAAUvV,SAC5ElL,MAAO0Q,EAAQ5Q,KAAMF,GAEX0B,SAAR/B,IACE4gB,EAAMvQ,OAASrQ,MAAS,IAC7B4gB,EAAMmC,iBACNnC,EAAM4C,oBAYX,MAJKrC,GAAQsC,cACZtC,EAAQsC,aAAa9jB,KAAM9B,KAAM+iB,GAG3BA,EAAMvQ,SAGd+Q,SAAU,SAAUR,EAAOQ,GAC1B,GAAI5gB,GAAGkE,EAASgf,EAAKxC,EACpBiC,KACArB,EAAgBV,EAASU,cACzBhW,EAAM8U,EAAMlf,MAKb,IAAKogB,GAAiBhW,EAAIhJ,YAAc8d,EAAMlO,QAAyB,UAAfkO,EAAMne,MAE7D,KAAQqJ,IAAQjO,KAAMiO,EAAMA,EAAIpI,YAAc7F,KAG7C,GAAKiO,EAAIsG,YAAa,GAAuB,UAAfwO,EAAMne,KAAmB,CAEtD,IADAiC,KACMlE,EAAI,EAAOshB,EAAJthB,EAAmBA,IAC/B0gB,EAAYE,EAAU5gB,GAGtBkjB,EAAMxC,EAAUviB,SAAW,IAEHoD,SAAnB2C,EAASgf,KACbhf,EAASgf,GAAQxC,EAAU5Y,aAC1B5J,EAAQglB,EAAK7lB,MAAOsa,MAAOrM,IAAS,EACpCpN,EAAO0O,KAAMsW,EAAK7lB,KAAM,MAAQiO,IAAQrM,QAErCiF,EAASgf,IACbhf,EAAQxG,KAAMgjB,EAGXxc,GAAQjF,QACZ0jB,EAAajlB,MAAOqC,KAAMuL,EAAKsV,SAAU1c,IAW7C,MAJKod,GAAgBV,EAAS3hB,QAC7B0jB,EAAajlB,MAAOqC,KAAM1C,KAAMujB,SAAUA,EAASpjB,MAAO8jB,KAGpDqB,GAIRQ,MAAO,wHAAwHze,MAAM,KAErI0e,YAEAC,UACCF,MAAO,4BAA4Bze,MAAM,KACzCmI,OAAQ,SAAUuT,EAAOkD,GAOxB,MAJoB,OAAflD,EAAMmD,QACVnD,EAAMmD,MAA6B,MAArBD,EAASE,SAAmBF,EAASE,SAAWF,EAASG,SAGjErD,IAITsD,YACCP,MAAO,uFAAuFze,MAAM,KACpGmI,OAAQ,SAAUuT,EAAOkD,GACxB,GAAIK,GAAUxX,EAAKyX,EAClB1R,EAASoR,EAASpR,MAkBnB,OAfoB,OAAfkO,EAAMyD,OAAqC,MAApBP,EAASQ,UACpCH,EAAWvD,EAAMlf,OAAOuI,eAAiBxM,EACzCkP,EAAMwX,EAAS5X,gBACf6X,EAAOD,EAASC,KAEhBxD,EAAMyD,MAAQP,EAASQ,SAAY3X,GAAOA,EAAI4X,YAAcH,GAAQA,EAAKG,YAAc,IAAQ5X,GAAOA,EAAI6X,YAAcJ,GAAQA,EAAKI,YAAc,GACnJ5D,EAAM6D,MAAQX,EAASY,SAAY/X,GAAOA,EAAIgY,WAAcP,GAAQA,EAAKO,WAAc,IAAQhY,GAAOA,EAAIiY,WAAcR,GAAQA,EAAKQ,WAAc,IAK9IhE,EAAMmD,OAAoBhiB,SAAX2Q,IACpBkO,EAAMmD,MAAmB,EAATrR,EAAa,EAAe,EAATA,EAAa,EAAe,EAATA,EAAa,EAAI,GAGjEkO,IAITsC,IAAK,SAAUtC,GACd,GAAKA,EAAOliB,EAAOsD,SAClB,MAAO4e,EAIR,IAAIpgB,GAAGqd,EAAMtc,EACZkB,EAAOme,EAAMne,KACboiB,EAAgBjE,EAChBkE,EAAUjnB,KAAK+lB,SAAUnhB,EAEpBqiB,KACLjnB,KAAK+lB,SAAUnhB,GAASqiB,EACvBzE,EAAY7V,KAAM/H,GAAS5E,KAAKqmB,WAChC9D,EAAU5V,KAAM/H,GAAS5E,KAAKgmB,aAGhCtiB,EAAOujB,EAAQnB,MAAQ9lB,KAAK8lB,MAAM1lB,OAAQ6mB,EAAQnB,OAAU9lB,KAAK8lB,MAEjE/C,EAAQ,GAAIliB,GAAO+jB,MAAOoC,GAE1BrkB,EAAIe,EAAK9B,MACT,OAAQe,IACPqd,EAAOtc,EAAMf,GACbogB,EAAO/C,GAASgH,EAAehH,EAehC,OAVM+C,GAAMlf,SACXkf,EAAMlf,OAASjE,GAKe,IAA1BmjB,EAAMlf,OAAOoB,WACjB8d,EAAMlf,OAASkf,EAAMlf,OAAOgC,YAGtBohB,EAAQzX,OAASyX,EAAQzX,OAAQuT,EAAOiE,GAAkBjE,GAGlEO,SACC4D,MAECnC,UAAU,GAEX9Q,OAECsQ,QAAS,WACR,MAAKvkB,QAAS6iB,KAAuB7iB,KAAKiU,OACzCjU,KAAKiU,SACE,GAFR,QAKD6P,aAAc,WAEfqD,MACC5C,QAAS,WACR,MAAKvkB,QAAS6iB,KAAuB7iB,KAAKmnB,MACzCnnB,KAAKmnB,QACE,GAFR,QAKDrD,aAAc,YAEfsD,OAEC7C,QAAS,WACR,MAAmB,aAAdvkB,KAAK4E,MAAuB5E,KAAKonB,OAASvmB,EAAOoF,SAAUjG,KAAM,UACrEA,KAAKonB,SACE,GAFR,QAODhC,SAAU,SAAUrC,GACnB,MAAOliB,GAAOoF,SAAU8c,EAAMlf,OAAQ,OAIxCwjB,cACCzB,aAAc,SAAU7C,GAID7e,SAAjB6e,EAAMvQ,QAAwBuQ,EAAMiE,gBACxCjE,EAAMiE,cAAcM,YAAcvE,EAAMvQ,WAM5C+U,SAAU,SAAU3iB,EAAMlC,EAAMqgB,EAAOyE,GAItC,GAAI9b,GAAI7K,EAAOyC,OACd,GAAIzC,GAAO+jB,MACX7B,GAECne,KAAMA,EACN6iB,aAAa,EACbT,kBAGGQ,GACJ3mB,EAAOkiB,MAAMwB,QAAS7Y,EAAG,KAAMhJ,GAE/B7B,EAAOkiB,MAAMc,SAAS/hB,KAAMY,EAAMgJ,GAE9BA,EAAEyZ,sBACNpC,EAAMmC,mBAKTrkB,EAAOyjB,YAAc,SAAU5hB,EAAMkC,EAAM+e,GACrCjhB,EAAKoc,qBACTpc,EAAKoc,oBAAqBla,EAAM+e,GAAQ,IAI1C9iB,EAAO+jB,MAAQ,SAAUnhB,EAAKqiB,GAE7B,MAAO9lB,gBAAgBa,GAAO+jB,OAKzBnhB,GAAOA,EAAImB,MACf5E,KAAKgnB,cAAgBvjB,EACrBzD,KAAK4E,KAAOnB,EAAImB,KAIhB5E,KAAKmlB,mBAAqB1hB,EAAIikB,kBACHxjB,SAAzBT,EAAIikB,kBAEJjkB,EAAI6jB,eAAgB,EACrB3E,EACAC,GAID5iB,KAAK4E,KAAOnB,EAIRqiB,GACJjlB,EAAOyC,OAAQtD,KAAM8lB,GAItB9lB,KAAK2nB,UAAYlkB,GAAOA,EAAIkkB,WAAa9mB,EAAOsG,WAGhDnH,KAAMa,EAAOsD,UAAY,IA/BjB,GAAItD,GAAO+jB,MAAOnhB,EAAKqiB,IAoChCjlB,EAAO+jB,MAAMnjB,WACZ0jB,mBAAoBvC,EACpBqC,qBAAsBrC,EACtB8C,8BAA+B9C,EAE/BsC,eAAgB,WACf,GAAIxZ,GAAI1L,KAAKgnB,aAEbhnB,MAAKmlB,mBAAqBxC,EAErBjX,GAAKA,EAAEwZ,gBACXxZ,EAAEwZ,kBAGJS,gBAAiB,WAChB,GAAIja,GAAI1L,KAAKgnB,aAEbhnB,MAAKilB,qBAAuBtC,EAEvBjX,GAAKA,EAAEia,iBACXja,EAAEia,mBAGJiC,yBAA0B,WACzB,GAAIlc,GAAI1L,KAAKgnB,aAEbhnB,MAAK0lB,8BAAgC/C,EAEhCjX,GAAKA,EAAEkc,0BACXlc,EAAEkc,2BAGH5nB,KAAK2lB,oBAMP9kB,EAAOyB,MACNulB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAM5C,GAClBxkB,EAAOkiB,MAAMO,QAAS2E,IACrBnE,aAAcuB,EACdtB,SAAUsB,EAEV1B,OAAQ,SAAUZ,GACjB,GAAI5gB,GACH0B,EAAS7D,KACTkoB,EAAUnF,EAAMoF,cAChB9E,EAAYN,EAAMM,SASnB,SALM6E,GAAYA,IAAYrkB,IAAWhD,EAAOwH,SAAUxE,EAAQqkB,MACjEnF,EAAMne,KAAOye,EAAUI,SACvBthB,EAAMkhB,EAAUvV,QAAQlL,MAAO5C,KAAM6C,WACrCkgB,EAAMne,KAAOygB,GAEPljB,MAOJxB,EAAQ2hB,gBACbzhB,EAAOyB,MAAO2R,MAAO,UAAWkT,KAAM,YAAc,SAAUc,EAAM5C,GAGnE,GAAIvX,GAAU,SAAUiV,GACtBliB,EAAOkiB,MAAMwE,SAAUlC,EAAKtC,EAAMlf,OAAQhD,EAAOkiB,MAAMsC,IAAKtC,IAAS,GAGvEliB,GAAOkiB,MAAMO,QAAS+B,IACrBnB,MAAO,WACN,GAAIpV,GAAM9O,KAAKoM,eAAiBpM,KAC/BooB,EAAW/H,EAAUpB,OAAQnQ,EAAKuW,EAE7B+C,IACLtZ,EAAIG,iBAAkBgZ,EAAMna,GAAS,GAEtCuS,EAAUpB,OAAQnQ,EAAKuW,GAAO+C,GAAY,GAAM,IAEjD/D,SAAU,WACT,GAAIvV,GAAM9O,KAAKoM,eAAiBpM,KAC/BooB,EAAW/H,EAAUpB,OAAQnQ,EAAKuW,GAAQ,CAErC+C,GAKL/H,EAAUpB,OAAQnQ,EAAKuW,EAAK+C,IAJ5BtZ,EAAIgQ,oBAAqBmJ,EAAMna,GAAS,GACxCuS,EAAUjE,OAAQtN,EAAKuW,QAU5BxkB,EAAOG,GAAGsC,QAET+kB,GAAI,SAAUrF,EAAOliB,EAAUmb,EAAMjb,EAAiBsnB,GACrD,GAAIC,GAAQ3jB,CAGZ,IAAsB,gBAAVoe,GAAqB,CAEP,gBAAbliB,KAEXmb,EAAOA,GAAQnb,EACfA,EAAWoD,OAEZ,KAAMU,IAAQoe,GACbhjB,KAAKqoB,GAAIzjB,EAAM9D,EAAUmb,EAAM+G,EAAOpe,GAAQ0jB,EAE/C,OAAOtoB,MAmBR,GAhBa,MAARic,GAAsB,MAANjb,GAEpBA,EAAKF,EACLmb,EAAOnb,EAAWoD,QACD,MAANlD,IACc,gBAAbF,IAEXE,EAAKib,EACLA,EAAO/X,SAGPlD,EAAKib,EACLA,EAAOnb,EACPA,EAAWoD,SAGRlD,KAAO,EACXA,EAAK4hB,MACC,KAAM5hB,EACZ,MAAOhB,KAaR,OAVa,KAARsoB,IACJC,EAASvnB,EACTA,EAAK,SAAU+hB,GAGd,MADAliB,KAAS+d,IAAKmE,GACPwF,EAAO3lB,MAAO5C,KAAM6C,YAG5B7B,EAAGgG,KAAOuhB,EAAOvhB,OAAUuhB,EAAOvhB,KAAOnG,EAAOmG,SAE1ChH,KAAKsC,KAAM,WACjBzB,EAAOkiB,MAAMvI,IAAKxa,KAAMgjB,EAAOhiB,EAAIib,EAAMnb,MAG3CwnB,IAAK,SAAUtF,EAAOliB,EAAUmb,EAAMjb,GACrC,MAAOhB,MAAKqoB,GAAIrF,EAAOliB,EAAUmb,EAAMjb,EAAI,IAE5C4d,IAAK,SAAUoE,EAAOliB,EAAUE,GAC/B,GAAIqiB,GAAWze,CACf,IAAKoe,GAASA,EAAMkC,gBAAkBlC,EAAMK,UAQ3C,MANAA,GAAYL,EAAMK,UAClBxiB,EAAQmiB,EAAMuC,gBAAiB3G,IAC9ByE,EAAUW,UAAYX,EAAUI,SAAW,IAAMJ,EAAUW,UAAYX,EAAUI,SACjFJ,EAAUviB,SACVuiB,EAAUvV,SAEJ9N,IAER,IAAsB,gBAAVgjB,GAAqB,CAEhC,IAAMpe,IAAQoe,GACbhjB,KAAK4e,IAAKha,EAAM9D,EAAUkiB,EAAOpe,GAElC,OAAO5E,MAUR,OARKc,KAAa,GAA6B,kBAAbA,MAEjCE,EAAKF,EACLA,EAAWoD,QAEPlD,KAAO,IACXA,EAAK4hB,GAEC5iB,KAAKsC,KAAK,WAChBzB,EAAOkiB,MAAM3G,OAAQpc,KAAMgjB,EAAOhiB,EAAIF,MAIxCyjB,QAAS,SAAU3f,EAAMqX,GACxB,MAAOjc,MAAKsC,KAAK,WAChBzB,EAAOkiB,MAAMwB,QAAS3f,EAAMqX,EAAMjc,SAGpC2e,eAAgB,SAAU/Z,EAAMqX,GAC/B,GAAIvZ,GAAO1C,KAAK,EAChB,OAAK0C,GACG7B,EAAOkiB,MAAMwB,QAAS3f,EAAMqX,EAAMvZ,GAAM,GADhD,SAOF,IACC8lB,IAAY,0EACZC,GAAW,YACXC,GAAQ,YACRC,GAAe,0BAEfC,GAAW,oCACXC,GAAc,4BACdC,GAAoB,cACpBC,GAAe,2CAGfC,IAGCC,QAAU,EAAG,+BAAgC,aAE7CC,OAAS,EAAG,UAAW,YACvBC,KAAO,EAAG,oBAAqB,uBAC/BC,IAAM,EAAG,iBAAkB,oBAC3BC,IAAM,EAAG,qBAAsB,yBAE/BjE,UAAY,EAAG,GAAI,IAIrB4D,IAAQM,SAAWN,GAAQC,OAE3BD,GAAQO,MAAQP,GAAQQ,MAAQR,GAAQS,SAAWT,GAAQU,QAAUV,GAAQE,MAC7EF,GAAQW,GAAKX,GAAQK,EAIrB,SAASO,IAAoBlnB,EAAMmnB,GAClC,MAAOhpB,GAAOoF,SAAUvD,EAAM,UAC7B7B,EAAOoF,SAA+B,KAArB4jB,EAAQ5kB,SAAkB4kB,EAAUA,EAAQtY,WAAY,MAEzE7O,EAAK8J,qBAAqB,SAAS,IAClC9J,EAAKkD,YAAalD,EAAK0J,cAAc3G,cAAc,UACpD/C,EAIF,QAASonB,IAAepnB,GAEvB,MADAA,GAAKkC,MAAsC,OAA9BlC,EAAKkK,aAAa,SAAoB,IAAMlK,EAAKkC,KACvDlC,EAER,QAASqnB,IAAernB,GACvB,GAAImJ,GAAQid,GAAkBzc,KAAM3J,EAAKkC,KAQzC,OANKiH,GACJnJ,EAAKkC,KAAOiH,EAAO,GAEnBnJ,EAAKyK,gBAAgB,QAGfzK,EAIR,QAASsnB,IAAe9nB,EAAO+nB,GAI9B,IAHA,GAAItnB,GAAI,EACPwX,EAAIjY,EAAMN,OAECuY,EAAJxX,EAAOA,IACd0d,EAAUN,IACT7d,EAAOS,GAAK,cAAesnB,GAAe5J,EAAUte,IAAKkoB,EAAatnB,GAAK,eAK9E,QAASunB,IAAgBzmB,EAAK0mB,GAC7B,GAAIxnB,GAAGwX,EAAGvV,EAAMwlB,EAAUC,EAAUC,EAAUC,EAAUpH,CAExD,IAAuB,IAAlBgH,EAAKllB,SAAV,CAKA,GAAKob,EAAUF,QAAS1c,KACvB2mB,EAAW/J,EAAUpB,OAAQxb,GAC7B4mB,EAAWhK,EAAUN,IAAKoK,EAAMC,GAChCjH,EAASiH,EAASjH,QAEJ,OACNkH,GAAS1G,OAChB0G,EAASlH,SAET,KAAMve,IAAQue,GACb,IAAMxgB,EAAI,EAAGwX,EAAIgJ,EAAQve,GAAOhD,OAAYuY,EAAJxX,EAAOA,IAC9C9B,EAAOkiB,MAAMvI,IAAK2P,EAAMvlB,EAAMue,EAAQve,GAAQjC,IAO7C2d,EAAUH,QAAS1c,KACvB6mB,EAAWhK,EAAUrB,OAAQxb,GAC7B8mB,EAAW1pB,EAAOyC,UAAYgnB,GAE9BhK,EAAUP,IAAKoK,EAAMI,KAIvB,QAASC,IAAQzpB,EAAS4O,GACzB,GAAIxN,GAAMpB,EAAQyL,qBAAuBzL,EAAQyL,qBAAsBmD,GAAO,KAC5E5O,EAAQkM,iBAAmBlM,EAAQkM,iBAAkB0C,GAAO,OAG9D,OAAezL,UAARyL,GAAqBA,GAAO9O,EAAOoF,SAAUlF,EAAS4O,GAC5D9O,EAAOuB,OAASrB,GAAWoB,GAC3BA,EAIF,QAASsoB,IAAUhnB,EAAK0mB,GACvB,GAAIlkB,GAAWkkB,EAAKlkB,SAASC,aAGX,WAAbD,GAAwB8b,EAAepV,KAAMlJ,EAAImB,MACrDulB,EAAK3V,QAAU/Q,EAAI+Q,SAGK,UAAbvO,GAAqC,aAAbA,KACnCkkB,EAAKxR,aAAelV,EAAIkV,cAI1B9X,EAAOyC,QACNM,MAAO,SAAUlB,EAAMgoB,EAAeC,GACrC,GAAIhoB,GAAGwX,EAAGyQ,EAAaC,EACtBjnB,EAAQlB,EAAKyf,WAAW,GACxB2I,EAASjqB,EAAOwH,SAAU3F,EAAK0J,cAAe1J,EAG/C,MAAM/B,EAAQyhB,gBAAsC,IAAlB1f,EAAKuC,UAAoC,KAAlBvC,EAAKuC,UAC3DpE,EAAOgY,SAAUnW,IAMnB,IAHAmoB,EAAeL,GAAQ5mB,GACvBgnB,EAAcJ,GAAQ9nB,GAEhBC,EAAI,EAAGwX,EAAIyQ,EAAYhpB,OAAYuY,EAAJxX,EAAOA,IAC3C8nB,GAAUG,EAAajoB,GAAKkoB,EAAcloB,GAK5C,IAAK+nB,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAeJ,GAAQ9nB,GACrCmoB,EAAeA,GAAgBL,GAAQ5mB,GAEjCjB,EAAI,EAAGwX,EAAIyQ,EAAYhpB,OAAYuY,EAAJxX,EAAOA,IAC3CunB,GAAgBU,EAAajoB,GAAKkoB,EAAcloB,QAGjDunB,IAAgBxnB,EAAMkB,EAWxB,OANAinB,GAAeL,GAAQ5mB,EAAO,UACzBinB,EAAajpB,OAAS,GAC1BooB,GAAea,GAAeC,GAAUN,GAAQ9nB,EAAM,WAIhDkB,GAGRmnB,cAAe,SAAU7oB,EAAOnB,EAASiqB,EAASC,GAOjD,IANA,GAAIvoB,GAAMwE,EAAKyI,EAAKub,EAAM7iB,EAAUnF,EACnC8e,EAAWjhB,EAAQkhB,yBACnBkJ,KACAxoB,EAAI,EACJwX,EAAIjY,EAAMN,OAECuY,EAAJxX,EAAOA,IAGd,GAFAD,EAAOR,EAAOS,GAETD,GAAiB,IAATA,EAGZ,GAA6B,WAAxB7B,EAAO+D,KAAMlC,GAGjB7B,EAAOuB,MAAO+oB,EAAOzoB,EAAKuC,UAAavC,GAASA,OAG1C,IAAMgmB,GAAM/b,KAAMjK,GAIlB,CACNwE,EAAMA,GAAO8a,EAASpc,YAAa7E,EAAQ0E,cAAc,QAGzDkK,GAAQ8Y,GAASpc,KAAM3J,KAAY,GAAI,KAAQ,GAAIwD,cACnDglB,EAAOlC,GAASrZ,IAASqZ,GAAQ5D,SACjCle,EAAI0I,UAAYsb,EAAM,GAAMxoB,EAAK4B,QAASkkB,GAAW,aAAgB0C,EAAM,GAG3EhoB,EAAIgoB,EAAM,EACV,OAAQhoB,IACPgE,EAAMA,EAAIgM,SAKXrS,GAAOuB,MAAO+oB,EAAOjkB,EAAIuE,YAGzBvE,EAAM8a,EAASzQ,WAGfrK,EAAIoK,YAAc,OAzBlB6Z,GAAM9qB,KAAMU,EAAQqqB,eAAgB1oB,GA+BvCsf,GAAS1Q,YAAc,GAEvB3O,EAAI,CACJ,OAASD,EAAOyoB,EAAOxoB,KAItB,KAAKsoB,GAAmD,KAAtCpqB,EAAO2F,QAAS9D,EAAMuoB,MAIxC5iB,EAAWxH,EAAOwH,SAAU3F,EAAK0J,cAAe1J,GAGhDwE,EAAMsjB,GAAQxI,EAASpc,YAAalD,GAAQ,UAGvC2F,GACJ2hB,GAAe9iB,GAIX8jB,GAAU,CACd9nB,EAAI,CACJ,OAASR,EAAOwE,EAAKhE,KACf2lB,GAAYlc,KAAMjK,EAAKkC,MAAQ,KACnComB,EAAQ3qB,KAAMqC,GAMlB,MAAOsf,IAGRqJ,UAAW,SAAUnpB,GAKpB,IAJA,GAAI+Z,GAAMvZ,EAAMkC,EAAM0I,EACrBgW,EAAUziB,EAAOkiB,MAAMO,QACvB3gB,EAAI,EAE2BuB,UAAvBxB,EAAOR,EAAOS,IAAoBA,IAAM,CAChD,GAAK9B,EAAOye,WAAY5c,KACvB4K,EAAM5K,EAAM2d,EAAUlc,SAEjBmJ,IAAQ2O,EAAOoE,EAAUhT,MAAOC,KAAS,CAC7C,GAAK2O,EAAKkH,OACT,IAAMve,IAAQqX,GAAKkH,OACbG,EAAS1e,GACb/D,EAAOkiB,MAAM3G,OAAQ1Z,EAAMkC,GAI3B/D,EAAOyjB,YAAa5hB,EAAMkC,EAAMqX,EAAK0H,OAInCtD,GAAUhT,MAAOC,UAEd+S,GAAUhT,MAAOC,SAKpBgT,GAAUjT,MAAO3K,EAAM4d,EAAUnc,cAK3CtD,EAAOG,GAAGsC,QACToC,KAAM,SAAUS,GACf,MAAO8Y,GAAQjf,KAAM,SAAUmG,GAC9B,MAAiBjC,UAAViC,EACNtF,EAAO6E,KAAM1F,MACbA,KAAK2U,QAAQrS,KAAK,YACM,IAAlBtC,KAAKiF,UAAoC,KAAlBjF,KAAKiF,UAAqC,IAAlBjF,KAAKiF,YACxDjF,KAAKsR,YAAcnL,MAGpB,KAAMA,EAAOtD,UAAUjB,SAG3B0pB,OAAQ,WACP,MAAOtrB,MAAKurB,SAAU1oB,UAAW,SAAUH,GAC1C,GAAuB,IAAlB1C,KAAKiF,UAAoC,KAAlBjF,KAAKiF,UAAqC,IAAlBjF,KAAKiF,SAAiB,CACzE,GAAIpB,GAAS+lB,GAAoB5pB,KAAM0C,EACvCmB,GAAO+B,YAAalD,OAKvB8oB,QAAS,WACR,MAAOxrB,MAAKurB,SAAU1oB,UAAW,SAAUH,GAC1C,GAAuB,IAAlB1C,KAAKiF,UAAoC,KAAlBjF,KAAKiF,UAAqC,IAAlBjF,KAAKiF,SAAiB,CACzE,GAAIpB,GAAS+lB,GAAoB5pB,KAAM0C,EACvCmB,GAAO4nB,aAAc/oB,EAAMmB,EAAO0N,gBAKrCma,OAAQ,WACP,MAAO1rB,MAAKurB,SAAU1oB,UAAW,SAAUH,GACrC1C,KAAK6F,YACT7F,KAAK6F,WAAW4lB,aAAc/oB,EAAM1C,SAKvC2rB,MAAO,WACN,MAAO3rB,MAAKurB,SAAU1oB,UAAW,SAAUH,GACrC1C,KAAK6F,YACT7F,KAAK6F,WAAW4lB,aAAc/oB,EAAM1C,KAAKoO,gBAK5CgO,OAAQ,SAAUtb,EAAU8qB,GAK3B,IAJA,GAAIlpB,GACHR,EAAQpB,EAAWD,EAAO2O,OAAQ1O,EAAUd,MAASA,KACrD2C,EAAI,EAEwB,OAApBD,EAAOR,EAAMS,IAAaA,IAC5BipB,GAA8B,IAAlBlpB,EAAKuC,UACtBpE,EAAOwqB,UAAWb,GAAQ9nB,IAGtBA,EAAKmD,aACJ+lB,GAAY/qB,EAAOwH,SAAU3F,EAAK0J,cAAe1J,IACrDsnB,GAAeQ,GAAQ9nB,EAAM,WAE9BA,EAAKmD,WAAWC,YAAapD,GAI/B,OAAO1C,OAGR2U,MAAO,WAIN,IAHA,GAAIjS,GACHC,EAAI,EAEuB,OAAnBD,EAAO1C,KAAK2C,IAAaA,IACV,IAAlBD,EAAKuC,WAGTpE,EAAOwqB,UAAWb,GAAQ9nB,GAAM,IAGhCA,EAAK4O,YAAc,GAIrB,OAAOtR,OAGR4D,MAAO,SAAU8mB,EAAeC,GAI/B,MAHAD,GAAiC,MAAjBA,GAAwB,EAAQA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD3qB,KAAKyC,IAAI,WACf,MAAO5B,GAAO+C,MAAO5D,KAAM0qB,EAAeC,MAI5CkB,KAAM,SAAU1lB,GACf,MAAO8Y,GAAQjf,KAAM,SAAUmG,GAC9B,GAAIzD,GAAO1C,KAAM,OAChB2C,EAAI,EACJwX,EAAIna,KAAK4B,MAEV,IAAesC,SAAViC,GAAyC,IAAlBzD,EAAKuC,SAChC,MAAOvC,GAAKkN,SAIb,IAAsB,gBAAVzJ,KAAuBwiB,GAAahc,KAAMxG,KACpD6iB,IAAWP,GAASpc,KAAMlG,KAAa,GAAI,KAAQ,GAAID,eAAkB,CAE1EC,EAAQA,EAAM7B,QAASkkB,GAAW,YAElC,KACC,KAAYrO,EAAJxX,EAAOA,IACdD,EAAO1C,KAAM2C,OAGU,IAAlBD,EAAKuC,WACTpE,EAAOwqB,UAAWb,GAAQ9nB,GAAM,IAChCA,EAAKkN,UAAYzJ,EAInBzD,GAAO,EAGN,MAAOgJ,KAGLhJ,GACJ1C,KAAK2U,QAAQ2W,OAAQnlB,IAEpB,KAAMA,EAAOtD,UAAUjB,SAG3BkqB,YAAa,WACZ,GAAI/kB,GAAMlE,UAAW,EAcrB,OAXA7C,MAAKurB,SAAU1oB,UAAW,SAAUH,GACnCqE,EAAM/G,KAAK6F,WAEXhF,EAAOwqB,UAAWb,GAAQxqB,OAErB+G,GACJA,EAAIglB,aAAcrpB,EAAM1C,QAKnB+G,IAAQA,EAAInF,QAAUmF,EAAI9B,UAAYjF,KAAOA,KAAKoc,UAG1D4P,OAAQ,SAAUlrB,GACjB,MAAOd,MAAKoc,OAAQtb,GAAU,IAG/ByqB,SAAU,SAAU/oB,EAAMD,GAGzBC,EAAOpC,EAAOwC,SAAWJ,EAEzB,IAAIwf,GAAUlf,EAAOkoB,EAASiB,EAAYtd,EAAMG,EAC/CnM,EAAI,EACJwX,EAAIna,KAAK4B,OACTme,EAAM/f,KACNksB,EAAW/R,EAAI,EACfhU,EAAQ3D,EAAM,GACduB,EAAalD,EAAOkD,WAAYoC,EAGjC,IAAKpC,GACDoW,EAAI,GAAsB,gBAAVhU,KAChBxF,EAAQuhB,YAAc0G,GAASjc,KAAMxG,GACxC,MAAOnG,MAAKsC,KAAK,SAAUgY,GAC1B,GAAInB,GAAO4G,EAAIhd,GAAIuX,EACdvW,KACJvB,EAAM,GAAM2D,EAAMrE,KAAM9B,KAAMsa,EAAOnB,EAAK0S,SAE3C1S,EAAKoS,SAAU/oB,EAAMD,IAIvB,IAAK4X,IACJ6H,EAAWnhB,EAAOkqB,cAAevoB,EAAMxC,KAAM,GAAIoM,eAAe,EAAOpM,MACvE8C,EAAQkf,EAASzQ,WAEmB,IAA/ByQ,EAASvW,WAAW7J,SACxBogB,EAAWlf,GAGPA,GAAQ,CAMZ,IALAkoB,EAAUnqB,EAAO4B,IAAK+nB,GAAQxI,EAAU,UAAY8H,IACpDmC,EAAajB,EAAQppB,OAITuY,EAAJxX,EAAOA,IACdgM,EAAOqT,EAEFrf,IAAMupB,IACVvd,EAAO9N,EAAO+C,MAAO+K,GAAM,GAAM,GAG5Bsd,GAGJprB,EAAOuB,MAAO4oB,EAASR,GAAQ7b,EAAM,YAIvCpM,EAAST,KAAM9B,KAAM2C,GAAKgM,EAAMhM,EAGjC,IAAKspB,EAOJ,IANAnd,EAAMkc,EAASA,EAAQppB,OAAS,GAAIwK,cAGpCvL,EAAO4B,IAAKuoB,EAASjB,IAGfpnB,EAAI,EAAOspB,EAAJtpB,EAAgBA,IAC5BgM,EAAOqc,EAASroB,GACXkmB,GAAYlc,KAAMgC,EAAK/J,MAAQ,MAClCyb,EAAUpB,OAAQtQ,EAAM,eAAkB9N,EAAOwH,SAAUyG,EAAKH,KAE5DA,EAAKlL,IAEJ5C,EAAOsrB,UACXtrB,EAAOsrB,SAAUxd,EAAKlL,KAGvB5C,EAAOsE,WAAYwJ,EAAK2C,YAAYhN,QAASykB,GAAc,MAQjE,MAAO/oB,SAITa,EAAOyB,MACN8pB,SAAU,SACVC,UAAW,UACXZ,aAAc,SACda,YAAa,QACbC,WAAY,eACV,SAAU/oB,EAAMyiB,GAClBplB,EAAOG,GAAIwC,GAAS,SAAU1C,GAO7B,IANA,GAAIoB,GACHC,KACAqqB,EAAS3rB,EAAQC,GACjBkC,EAAOwpB,EAAO5qB,OAAS,EACvBe,EAAI,EAEQK,GAALL,EAAWA,IAClBT,EAAQS,IAAMK,EAAOhD,KAAOA,KAAK4D,OAAO,GACxC/C,EAAQ2rB,EAAQ7pB,IAAOsjB,GAAY/jB,GAInC7B,EAAKuC,MAAOT,EAAKD,EAAMH,MAGxB,OAAO/B,MAAKiC,UAAWE,KAKzB,IAAIsqB,IACHC,KAQD,SAASC,IAAenpB,EAAMsL,GAC7B,GAAI8d,GACHlqB,EAAO7B,EAAQiO,EAAIrJ,cAAejC,IAAS4oB,SAAUtd,EAAIyX,MAGzDsG,EAAU9sB,EAAO+sB,0BAA6BF,EAAQ7sB,EAAO+sB,wBAAyBpqB,EAAM,KAI3FkqB,EAAMC,QAAUhsB,EAAOihB,IAAKpf,EAAM,GAAK,UAMzC,OAFAA,GAAKspB,SAEEa,EAOR,QAASE,IAAgB9mB,GACxB,GAAI6I,GAAMlP,EACTitB,EAAUH,GAAazmB,EA0BxB,OAxBM4mB,KACLA,EAAUF,GAAe1mB,EAAU6I,GAGlB,SAAZ+d,GAAuBA,IAG3BJ,IAAUA,IAAU5rB,EAAQ,mDAAoDurB,SAAUtd,EAAIJ,iBAG9FI,EAAM2d,GAAQ,GAAIzR,gBAGlBlM,EAAIke,QACJle,EAAIme,QAEJJ,EAAUF,GAAe1mB,EAAU6I,GACnC2d,GAAOT,UAIRU,GAAazmB,GAAa4mB,GAGpBA,EAER,GAAIK,IAAU,UAEVC,GAAY,GAAIxjB,QAAQ,KAAO8X,EAAO,kBAAmB,KAEzD2L,GAAY,SAAU1qB,GAIxB,MAAKA,GAAK0J,cAAc2C,YAAYse,OAC5B3qB,EAAK0J,cAAc2C,YAAYue,iBAAkB5qB,EAAM,MAGxD3C,EAAOutB,iBAAkB5qB,EAAM,MAKxC,SAAS6qB,IAAQ7qB,EAAMc,EAAMgqB,GAC5B,GAAIC,GAAOC,EAAUC,EAAUxrB,EAC9ByqB,EAAQlqB,EAAKkqB,KAsCd,OApCAY,GAAWA,GAAYJ,GAAW1qB,GAI7B8qB,IACJrrB,EAAMqrB,EAASI,iBAAkBpqB,IAAUgqB,EAAUhqB,IAGjDgqB,IAES,KAARrrB,GAAetB,EAAOwH,SAAU3F,EAAK0J,cAAe1J,KACxDP,EAAMtB,EAAO+rB,MAAOlqB,EAAMc,IAOtB2pB,GAAUxgB,KAAMxK,IAAS+qB,GAAQvgB,KAAMnJ,KAG3CiqB,EAAQb,EAAMa,MACdC,EAAWd,EAAMc,SACjBC,EAAWf,EAAMe,SAGjBf,EAAMc,SAAWd,EAAMe,SAAWf,EAAMa,MAAQtrB,EAChDA,EAAMqrB,EAASC,MAGfb,EAAMa,MAAQA,EACdb,EAAMc,SAAWA,EACjBd,EAAMe,SAAWA,IAIJzpB,SAAR/B,EAGNA,EAAM,GACNA,EAIF,QAAS0rB,IAAcC,EAAaC,GAEnC,OACChsB,IAAK,WACJ,MAAK+rB,gBAGG9tB,MAAK+B,KAKL/B,KAAK+B,IAAMgsB,GAAQnrB,MAAO5C,KAAM6C,cAM3C,WACC,GAAImrB,GAAkBC,EACrBhmB,EAAUrI,EAAS8O,gBACnBwf,EAAYtuB,EAAS6F,cAAe,OACpCkI,EAAM/N,EAAS6F,cAAe,MAE/B,IAAMkI,EAAIif,MAAV,CAMAjf,EAAIif,MAAMuB,eAAiB,cAC3BxgB,EAAIwU,WAAW,GAAOyK,MAAMuB,eAAiB,GAC7CxtB,EAAQytB,gBAA+C,gBAA7BzgB,EAAIif,MAAMuB,eAEpCD,EAAUtB,MAAMyB,QAAU,gFAE1BH,EAAUtoB,YAAa+H,EAIvB,SAAS2gB,KACR3gB,EAAIif,MAAMyB,QAGT,uKAGD1gB,EAAIiC,UAAY,GAChB3H,EAAQrC,YAAasoB,EAErB,IAAIK,GAAWxuB,EAAOutB,iBAAkB3f,EAAK,KAC7CqgB,GAAoC,OAAjBO,EAASvf,IAC5Bif,EAA0C,QAAnBM,EAASd,MAEhCxlB,EAAQnC,YAAaooB,GAKjBnuB,EAAOutB,kBACXzsB,EAAOyC,OAAQ3C,GACd6tB,cAAe,WAMd,MADAF,KACON,GAERS,kBAAmB,WAIlB,MAH6B,OAAxBR,GACJK,IAEML,GAERS,oBAAqB,WAOpB,GAAIvsB,GACHwsB,EAAYhhB,EAAI/H,YAAahG,EAAS6F,cAAe,OAiBtD,OAdAkpB,GAAU/B,MAAMyB,QAAU1gB,EAAIif,MAAMyB,QAGnC,8HAEDM,EAAU/B,MAAMgC,YAAcD,EAAU/B,MAAMa,MAAQ,IACtD9f,EAAIif,MAAMa,MAAQ,MAClBxlB,EAAQrC,YAAasoB,GAErB/rB,GAAO6C,WAAYjF,EAAOutB,iBAAkBqB,EAAW,MAAOC,aAE9D3mB,EAAQnC,YAAaooB,GACrBvgB,EAAI7H,YAAa6oB,GAEVxsB,SAQXtB,EAAOguB,KAAO,SAAUnsB,EAAMa,EAAShB,EAAUC,GAChD,GAAIL,GAAKqB,EACRwI,IAGD,KAAMxI,IAAQD,GACbyI,EAAKxI,GAASd,EAAKkqB,MAAOppB,GAC1Bd,EAAKkqB,MAAOppB,GAASD,EAASC,EAG/BrB,GAAMI,EAASK,MAAOF,EAAMF,MAG5B,KAAMgB,IAAQD,GACbb,EAAKkqB,MAAOppB,GAASwI,EAAKxI,EAG3B,OAAOrB,GAIR,IAGC2sB,IAAe,4BACfC,GAAY,GAAIplB,QAAQ,KAAO8X,EAAO,SAAU,KAChDuN,GAAU,GAAIrlB,QAAQ,YAAc8X,EAAO,IAAK,KAEhDwN,IAAYC,SAAU,WAAYC,WAAY,SAAUtC,QAAS,SACjEuC,IACCC,cAAe,IACfC,WAAY,OAGbC,IAAgB,SAAU,IAAK,MAAO,KAGvC,SAASC,IAAgB5C,EAAOppB,GAG/B,GAAKA,IAAQopB,GACZ,MAAOppB,EAIR,IAAIisB,GAAUjsB,EAAK,GAAGhC,cAAgBgC,EAAKrD,MAAM,GAChDuvB,EAAWlsB,EACXb,EAAI4sB,GAAY3tB,MAEjB,OAAQe,IAEP,GADAa,EAAO+rB,GAAa5sB,GAAM8sB,EACrBjsB,IAAQopB,GACZ,MAAOppB,EAIT,OAAOksB,GAGR,QAASC,IAAmBjtB,EAAMyD,EAAOypB,GACxC,GAAI/oB,GAAUkoB,GAAU1iB,KAAMlG,EAC9B,OAAOU,GAENzC,KAAKyrB,IAAK,EAAGhpB,EAAS,IAAQ+oB,GAAY,KAAU/oB,EAAS,IAAO,MACpEV,EAGF,QAAS2pB,IAAsBptB,EAAMc,EAAMusB,EAAOC,EAAaC,GAS9D,IARA,GAAIttB,GAAIotB,KAAYC,EAAc,SAAW,WAE5C,EAES,UAATxsB,EAAmB,EAAI,EAEvBwN,EAAM,EAEK,EAAJrO,EAAOA,GAAK,EAEJ,WAAVotB,IACJ/e,GAAOnQ,EAAOihB,IAAKpf,EAAMqtB,EAAQpO,EAAWhf,IAAK,EAAMstB,IAGnDD,GAEW,YAAVD,IACJ/e,GAAOnQ,EAAOihB,IAAKpf,EAAM,UAAYif,EAAWhf,IAAK,EAAMstB,IAI7C,WAAVF,IACJ/e,GAAOnQ,EAAOihB,IAAKpf,EAAM,SAAWif,EAAWhf,GAAM,SAAS,EAAMstB,MAIrEjf,GAAOnQ,EAAOihB,IAAKpf,EAAM,UAAYif,EAAWhf,IAAK,EAAMstB,GAG5C,YAAVF,IACJ/e,GAAOnQ,EAAOihB,IAAKpf,EAAM,SAAWif,EAAWhf,GAAM,SAAS,EAAMstB,IAKvE,OAAOjf,GAGR,QAASkf,IAAkBxtB,EAAMc,EAAMusB,GAGtC,GAAII,IAAmB,EACtBnf,EAAe,UAATxN,EAAmBd,EAAK0tB,YAAc1tB,EAAK2tB,aACjDJ,EAAS7C,GAAW1qB,GACpBstB,EAAiE,eAAnDnvB,EAAOihB,IAAKpf,EAAM,aAAa,EAAOutB,EAKrD,IAAY,GAAPjf,GAAmB,MAAPA,EAAc,CAQ9B,GANAA,EAAMuc,GAAQ7qB,EAAMc,EAAMysB,IACf,EAANjf,GAAkB,MAAPA,KACfA,EAAMtO,EAAKkqB,MAAOppB,IAId2pB,GAAUxgB,KAAKqE,GACnB,MAAOA,EAKRmf,GAAmBH,IAChBrvB,EAAQ8tB,qBAAuBzd,IAAQtO,EAAKkqB,MAAOppB,IAGtDwN,EAAMhM,WAAYgM,IAAS,EAI5B,MAASA,GACR8e,GACCptB,EACAc,EACAusB,IAAWC,EAAc,SAAW,WACpCG,EACAF,GAEE,KAGL,QAASK,IAAUxf,EAAUyf,GAM5B,IALA,GAAI1D,GAASnqB,EAAM8tB,EAClBxS,KACA1D,EAAQ,EACR1Y,EAASkP,EAASlP,OAEHA,EAAR0Y,EAAgBA,IACvB5X,EAAOoO,EAAUwJ,GACX5X,EAAKkqB,QAIX5O,EAAQ1D,GAAU+F,EAAUte,IAAKW,EAAM,cACvCmqB,EAAUnqB,EAAKkqB,MAAMC,QAChB0D,GAGEvS,EAAQ1D,IAAuB,SAAZuS,IACxBnqB,EAAKkqB,MAAMC,QAAU,IAMM,KAAvBnqB,EAAKkqB,MAAMC,SAAkBjL,EAAUlf,KAC3Csb,EAAQ1D,GAAU+F,EAAUpB,OAAQvc,EAAM,aAAcqqB,GAAerqB,EAAKuD,cAG7EuqB,EAAS5O,EAAUlf,GAEF,SAAZmqB,GAAuB2D,GAC3BnQ,EAAUN,IAAKrd,EAAM,aAAc8tB,EAAS3D,EAAUhsB,EAAOihB,IAAKpf,EAAM,aAO3E,KAAM4X,EAAQ,EAAW1Y,EAAR0Y,EAAgBA,IAChC5X,EAAOoO,EAAUwJ,GACX5X,EAAKkqB,QAGL2D,GAA+B,SAAvB7tB,EAAKkqB,MAAMC,SAA6C,KAAvBnqB,EAAKkqB,MAAMC,UACzDnqB,EAAKkqB,MAAMC,QAAU0D,EAAOvS,EAAQ1D,IAAW,GAAK,QAItD,OAAOxJ,GAGRjQ,EAAOyC,QAINmtB,UACCC,SACC3uB,IAAK,SAAUW,EAAM8qB,GACpB,GAAKA,EAAW,CAGf,GAAIrrB,GAAMorB,GAAQ7qB,EAAM,UACxB,OAAe,KAARP,EAAa,IAAMA,MAO9BwuB,WACCC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdzB,YAAc,EACd0B,YAAc,EACdN,SAAW,EACXO,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKTC,UACCC,QAAS,YAIV3E,MAAO,SAAUlqB,EAAMc,EAAM2C,EAAO4pB,GAGnC,GAAMrtB,GAA0B,IAAlBA,EAAKuC,UAAoC,IAAlBvC,EAAKuC,UAAmBvC,EAAKkqB,MAAlE,CAKA,GAAIzqB,GAAKyC,EAAMsc,EACdwO,EAAW7uB,EAAOkF,UAAWvC,GAC7BopB,EAAQlqB,EAAKkqB,KAQd,OANAppB,GAAO3C,EAAOywB,SAAU5B,KAAgB7uB,EAAOywB,SAAU5B,GAAaF,GAAgB5C,EAAO8C,IAG7FxO,EAAQrgB,EAAO4vB,SAAUjtB,IAAU3C,EAAO4vB,SAAUf,GAGrCxrB,SAAViC,EAiCC+a,GAAS,OAASA,IAAqDhd,UAA3C/B,EAAM+e,EAAMnf,IAAKW,GAAM,EAAOqtB,IACvD5tB,EAIDyqB,EAAOppB,IArCdoB,QAAcuB,GAGA,WAATvB,IAAsBzC,EAAM6sB,GAAQ3iB,KAAMlG,MAC9CA,GAAUhE,EAAI,GAAK,GAAMA,EAAI,GAAK6C,WAAYnE,EAAOihB,IAAKpf,EAAMc,IAEhEoB,EAAO,UAIM,MAATuB,GAAiBA,IAAUA,IAKlB,WAATvB,GAAsB/D,EAAO8vB,UAAWjB,KAC5CvpB,GAAS,MAKJxF,EAAQytB,iBAA6B,KAAVjoB,GAAiD,IAAjC3C,EAAKlD,QAAS,gBAC9DssB,EAAOppB,GAAS,WAIX0d,GAAW,OAASA,IAAwDhd,UAA7CiC,EAAQ+a,EAAMnB,IAAKrd,EAAMyD,EAAO4pB,MACpEnD,EAAOppB,GAAS2C,IAjBjB,UA+BF2b,IAAK,SAAUpf,EAAMc,EAAMusB,EAAOE,GACjC,GAAIjf,GAAKhP,EAAKkf,EACbwO,EAAW7uB,EAAOkF,UAAWvC,EAwB9B,OArBAA,GAAO3C,EAAOywB,SAAU5B,KAAgB7uB,EAAOywB,SAAU5B,GAAaF,GAAgB9sB,EAAKkqB,MAAO8C,IAGlGxO,EAAQrgB,EAAO4vB,SAAUjtB,IAAU3C,EAAO4vB,SAAUf,GAG/CxO,GAAS,OAASA,KACtBlQ,EAAMkQ,EAAMnf,IAAKW,GAAM,EAAMqtB,IAIjB7rB,SAAR8M,IACJA,EAAMuc,GAAQ7qB,EAAMc,EAAMysB,IAId,WAARjf,GAAoBxN,IAAQ4rB,MAChCpe,EAAMoe,GAAoB5rB,IAIZ,KAAVusB,GAAgBA,GACpB/tB,EAAMgD,WAAYgM,GACX+e,KAAU,GAAQlvB,EAAOkE,UAAW/C,GAAQA,GAAO,EAAIgP,GAExDA,KAITnQ,EAAOyB,MAAO,SAAU,SAAW,SAAUK,EAAGa,GAC/C3C,EAAO4vB,SAAUjtB,IAChBzB,IAAK,SAAUW,EAAM8qB,EAAUuC,GAC9B,MAAKvC,GAIGsB,GAAaniB,KAAM9L,EAAOihB,IAAKpf,EAAM,aAAsC,IAArBA,EAAK0tB,YACjEvvB,EAAOguB,KAAMnsB,EAAMusB,GAAS,WAC3B,MAAOiB,IAAkBxtB,EAAMc,EAAMusB,KAEtCG,GAAkBxtB,EAAMc,EAAMusB,GARhC,QAYDhQ,IAAK,SAAUrd,EAAMyD,EAAO4pB,GAC3B,GAAIE,GAASF,GAAS3C,GAAW1qB,EACjC,OAAOitB,IAAmBjtB,EAAMyD,EAAO4pB,EACtCD,GACCptB,EACAc,EACAusB,EACmD,eAAnDlvB,EAAOihB,IAAKpf,EAAM,aAAa,EAAOutB,GACtCA,GACG,OAORpvB,EAAO4vB,SAAS7B,YAAcf,GAAcltB,EAAQ+tB,oBACnD,SAAUhsB,EAAM8qB,GACf,MAAKA,GACG3sB,EAAOguB,KAAMnsB,GAAQmqB,QAAW,gBACtCU,IAAU7qB,EAAM,gBAFlB,SAQF7B,EAAOyB,MACNkvB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpB/wB,EAAO4vB,SAAUkB,EAASC,IACzBC,OAAQ,SAAU1rB,GAOjB,IANA,GAAIxD,GAAI,EACPmvB,KAGAC,EAAyB,gBAAV5rB,GAAqBA,EAAMkB,MAAM,MAASlB,GAE9C,EAAJxD,EAAOA,IACdmvB,EAAUH,EAAShQ,EAAWhf,GAAMivB,GACnCG,EAAOpvB,IAAOovB,EAAOpvB,EAAI,IAAOovB,EAAO,EAGzC,OAAOD,KAIH5E,GAAQvgB,KAAMglB,KACnB9wB,EAAO4vB,SAAUkB,EAASC,GAAS7R,IAAM4P,MAI3C9uB,EAAOG,GAAGsC,QACTwe,IAAK,SAAUte,EAAM2C,GACpB,MAAO8Y,GAAQjf,KAAM,SAAU0C,EAAMc,EAAM2C,GAC1C,GAAI8pB,GAAQhtB,EACXR,KACAE,EAAI,CAEL,IAAK9B,EAAOoD,QAAST,GAAS,CAI7B,IAHAysB,EAAS7C,GAAW1qB,GACpBO,EAAMO,EAAK5B,OAECqB,EAAJN,EAASA,IAChBF,EAAKe,EAAMb,IAAQ9B,EAAOihB,IAAKpf,EAAMc,EAAMb,IAAK,EAAOstB,EAGxD,OAAOxtB,GAGR,MAAiByB,UAAViC,EACNtF,EAAO+rB,MAAOlqB,EAAMc,EAAM2C,GAC1BtF,EAAOihB,IAAKpf,EAAMc,IACjBA,EAAM2C,EAAOtD,UAAUjB,OAAS,IAEpC2uB,KAAM,WACL,MAAOD,IAAUtwB,MAAM,IAExBgyB,KAAM,WACL,MAAO1B,IAAUtwB,OAElBiyB,OAAQ,SAAUtV,GACjB,MAAsB,iBAAVA,GACJA,EAAQ3c,KAAKuwB,OAASvwB,KAAKgyB,OAG5BhyB,KAAKsC,KAAK,WACXsf,EAAU5hB,MACda,EAAQb,MAAOuwB,OAEf1vB,EAAQb,MAAOgyB,WAOnB,SAASE,IAAOxvB,EAAMa,EAASyc,EAAM7c,EAAKgvB,GACzC,MAAO,IAAID,IAAMzwB,UAAUR,KAAMyB,EAAMa,EAASyc,EAAM7c,EAAKgvB,GAE5DtxB,EAAOqxB,MAAQA,GAEfA,GAAMzwB,WACLE,YAAauwB,GACbjxB,KAAM,SAAUyB,EAAMa,EAASyc,EAAM7c,EAAKgvB,EAAQC,GACjDpyB,KAAK0C,KAAOA,EACZ1C,KAAKggB,KAAOA,EACZhgB,KAAKmyB,OAASA,GAAU,QACxBnyB,KAAKuD,QAAUA,EACfvD,KAAKgT,MAAQhT,KAAKmH,IAAMnH,KAAKiO,MAC7BjO,KAAKmD,IAAMA,EACXnD,KAAKoyB,KAAOA,IAAUvxB,EAAO8vB,UAAW3Q,GAAS,GAAK,OAEvD/R,IAAK,WACJ,GAAIiT,GAAQgR,GAAMG,UAAWryB,KAAKggB,KAElC,OAAOkB,IAASA,EAAMnf,IACrBmf,EAAMnf,IAAK/B,MACXkyB,GAAMG,UAAUjN,SAASrjB,IAAK/B,OAEhCsyB,IAAK,SAAUC,GACd,GAAIC,GACHtR,EAAQgR,GAAMG,UAAWryB,KAAKggB,KAoB/B,OAlBKhgB,MAAKuD,QAAQkvB,SACjBzyB,KAAKqa,IAAMmY,EAAQ3xB,EAAOsxB,OAAQnyB,KAAKmyB,QACtCI,EAASvyB,KAAKuD,QAAQkvB,SAAWF,EAAS,EAAG,EAAGvyB,KAAKuD,QAAQkvB,UAG9DzyB,KAAKqa,IAAMmY,EAAQD,EAEpBvyB,KAAKmH,KAAQnH,KAAKmD,IAAMnD,KAAKgT,OAAUwf,EAAQxyB,KAAKgT,MAE/ChT,KAAKuD,QAAQmvB,MACjB1yB,KAAKuD,QAAQmvB,KAAK5wB,KAAM9B,KAAK0C,KAAM1C,KAAKmH,IAAKnH,MAGzCkhB,GAASA,EAAMnB,IACnBmB,EAAMnB,IAAK/f,MAEXkyB,GAAMG,UAAUjN,SAASrF,IAAK/f,MAExBA,OAITkyB,GAAMzwB,UAAUR,KAAKQ,UAAYywB,GAAMzwB,UAEvCywB,GAAMG,WACLjN,UACCrjB,IAAK,SAAU4wB,GACd,GAAIngB,EAEJ,OAAiC,OAA5BmgB,EAAMjwB,KAAMiwB,EAAM3S,OACpB2S,EAAMjwB,KAAKkqB,OAA2C,MAAlC+F,EAAMjwB,KAAKkqB,MAAO+F,EAAM3S,OAQ/CxN,EAAS3R,EAAOihB,IAAK6Q,EAAMjwB,KAAMiwB,EAAM3S,KAAM,IAErCxN,GAAqB,SAAXA,EAAwBA,EAAJ,GAT9BmgB,EAAMjwB,KAAMiwB,EAAM3S,OAW3BD,IAAK,SAAU4S,GAIT9xB,EAAO+xB,GAAGF,KAAMC,EAAM3S,MAC1Bnf,EAAO+xB,GAAGF,KAAMC,EAAM3S,MAAQ2S,GACnBA,EAAMjwB,KAAKkqB,QAAgE,MAArD+F,EAAMjwB,KAAKkqB,MAAO/rB,EAAOywB,SAAUqB,EAAM3S,QAAoBnf,EAAO4vB,SAAUkC,EAAM3S,OACrHnf,EAAO+rB,MAAO+F,EAAMjwB,KAAMiwB,EAAM3S,KAAM2S,EAAMxrB,IAAMwrB,EAAMP,MAExDO,EAAMjwB,KAAMiwB,EAAM3S,MAAS2S,EAAMxrB,OAQrC+qB,GAAMG,UAAUvL,UAAYoL,GAAMG,UAAU3L,YAC3C3G,IAAK,SAAU4S,GACTA,EAAMjwB,KAAKuC,UAAY0tB,EAAMjwB,KAAKmD,aACtC8sB,EAAMjwB,KAAMiwB,EAAM3S,MAAS2S,EAAMxrB,OAKpCtG,EAAOsxB,QACNU,OAAQ,SAAUC,GACjB,MAAOA,IAERC,MAAO,SAAUD,GAChB,MAAO,GAAM1uB,KAAK4uB,IAAKF,EAAI1uB,KAAK6uB,IAAO,IAIzCpyB,EAAO+xB,GAAKV,GAAMzwB,UAAUR,KAG5BJ,EAAO+xB,GAAGF,OAKV,IACCQ,IAAOC,GACPC,GAAW,yBACXC,GAAS,GAAI1pB,QAAQ,iBAAmB8X,EAAO,cAAe,KAC9D6R,GAAO,cACPC,IAAwBC,IACxBC,IACCC,KAAO,SAAU1T,EAAM7Z,GACtB,GAAIwsB,GAAQ3yB,KAAK2zB,YAAa3T,EAAM7Z,GACnCtC,EAAS8uB,EAAM1kB,MACf8jB,EAAQsB,GAAOhnB,KAAMlG,GACrBisB,EAAOL,GAASA,EAAO,KAASlxB,EAAO8vB,UAAW3Q,GAAS,GAAK,MAGhEhN,GAAUnS,EAAO8vB,UAAW3Q,IAAmB,OAAToS,IAAkBvuB,IACvDwvB,GAAOhnB,KAAMxL,EAAOihB,IAAK6Q,EAAMjwB,KAAMsd,IACtC4T,EAAQ,EACRC,EAAgB,EAEjB,IAAK7gB,GAASA,EAAO,KAAQof,EAAO,CAEnCA,EAAOA,GAAQpf,EAAO,GAGtB+e,EAAQA,MAGR/e,GAASnP,GAAU,CAEnB,GAGC+vB,GAAQA,GAAS,KAGjB5gB,GAAgB4gB,EAChB/yB,EAAO+rB,MAAO+F,EAAMjwB,KAAMsd,EAAMhN,EAAQof,SAI/BwB,KAAWA,EAAQjB,EAAM1kB,MAAQpK,IAAqB,IAAV+vB,KAAiBC,GAaxE,MATK9B,KACJ/e,EAAQ2f,EAAM3f,OAASA,IAAUnP,GAAU,EAC3C8uB,EAAMP,KAAOA,EAEbO,EAAMxvB,IAAM4uB,EAAO,GAClB/e,GAAU+e,EAAO,GAAM,GAAMA,EAAO,IACnCA,EAAO,IAGHY,IAKV,SAASmB,MAIR,MAHA9U,YAAW,WACVkU,GAAQhvB,SAEAgvB,GAAQryB,EAAOsG,MAIzB,QAAS4sB,IAAOnvB,EAAMovB,GACrB,GAAI9N,GACHvjB,EAAI,EACJkL,GAAUomB,OAAQrvB,EAKnB,KADAovB,EAAeA,EAAe,EAAI,EACtB,EAAJrxB,EAAQA,GAAK,EAAIqxB,EACxB9N,EAAQvE,EAAWhf,GACnBkL,EAAO,SAAWqY,GAAUrY,EAAO,UAAYqY,GAAUthB,CAO1D,OAJKovB,KACJnmB,EAAM6iB,QAAU7iB,EAAM4f,MAAQ7oB,GAGxBiJ,EAGR,QAAS8lB,IAAaxtB,EAAO6Z,EAAMkU,GAKlC,IAJA,GAAIvB,GACHwB,GAAeV,GAAUzT,QAAe5f,OAAQqzB,GAAU,MAC1DnZ,EAAQ,EACR1Y,EAASuyB,EAAWvyB,OACLA,EAAR0Y,EAAgBA,IACvB,GAAMqY,EAAQwB,EAAY7Z,GAAQxY,KAAMoyB,EAAWlU,EAAM7Z,GAGxD,MAAOwsB,GAKV,QAASa,IAAkB9wB,EAAMojB,EAAOsO,GAEvC,GAAIpU,GAAM7Z,EAAO8rB,EAAQU,EAAOzR,EAAOmT,EAASxH,EAASyH,EACxDC,EAAOv0B,KACPioB,KACA2E,EAAQlqB,EAAKkqB,MACb4D,EAAS9tB,EAAKuC,UAAY2c,EAAUlf,GACpC8xB,EAAWnU,EAAUte,IAAKW,EAAM,SAG3B0xB,GAAKrT,QACVG,EAAQrgB,EAAOsgB,YAAaze,EAAM,MACX,MAAlBwe,EAAMuT,WACVvT,EAAMuT,SAAW,EACjBJ,EAAUnT,EAAMvM,MAAMqH,KACtBkF,EAAMvM,MAAMqH,KAAO,WACZkF,EAAMuT,UACXJ,MAIHnT,EAAMuT,WAENF,EAAK1X,OAAO,WAEX0X,EAAK1X,OAAO,WACXqE,EAAMuT,WACA5zB,EAAOkgB,MAAOre,EAAM,MAAOd,QAChCsf,EAAMvM,MAAMqH,YAOO,IAAlBtZ,EAAKuC,WAAoB,UAAY6gB,IAAS,SAAWA,MAK7DsO,EAAKM,UAAa9H,EAAM8H,SAAU9H,EAAM+H,UAAW/H,EAAMgI,WAIzD/H,EAAUhsB,EAAOihB,IAAKpf,EAAM,WAG5B4xB,EAA2B,SAAZzH,EACdxM,EAAUte,IAAKW,EAAM,eAAkBqqB,GAAgBrqB,EAAKuD,UAAa4mB,EAEpD,WAAjByH,GAA6D,SAAhCzzB,EAAOihB,IAAKpf,EAAM,WACnDkqB,EAAMC,QAAU,iBAIbuH,EAAKM,WACT9H,EAAM8H,SAAW,SACjBH,EAAK1X,OAAO,WACX+P,EAAM8H,SAAWN,EAAKM,SAAU,GAChC9H,EAAM+H,UAAYP,EAAKM,SAAU,GACjC9H,EAAMgI,UAAYR,EAAKM,SAAU,KAKnC,KAAM1U,IAAQ8F,GAEb,GADA3f,EAAQ2f,EAAO9F,GACVoT,GAAS/mB,KAAMlG,GAAU,CAG7B,SAFO2f,GAAO9F,GACdiS,EAASA,GAAoB,WAAV9rB,EACdA,KAAYqqB,EAAS,OAAS,QAAW,CAG7C,GAAe,SAAVrqB,IAAoBquB,GAAiCtwB,SAArBswB,EAAUxU,GAG9C,QAFAwQ,IAAS,EAKXvI,EAAMjI,GAASwU,GAAYA,EAAUxU,IAAUnf,EAAO+rB,MAAOlqB,EAAMsd,OAInE6M,GAAU3oB,MAIZ,IAAMrD,EAAOqE,cAAe+iB,GAyCqD,YAAxD,SAAZ4E,EAAqBE,GAAgBrqB,EAAKuD,UAAa4mB,KACnED,EAAMC,QAAUA,OA1CoB,CAC/B2H,EACC,UAAYA,KAChBhE,EAASgE,EAAShE,QAGnBgE,EAAWnU,EAAUpB,OAAQvc,EAAM,aAI/BuvB,IACJuC,EAAShE,QAAUA,GAEfA,EACJ3vB,EAAQ6B,GAAO6tB,OAEfgE,EAAK/rB,KAAK,WACT3H,EAAQ6B,GAAOsvB,SAGjBuC,EAAK/rB,KAAK,WACT,GAAIwX,EAEJK,GAAUjE,OAAQ1Z,EAAM,SACxB,KAAMsd,IAAQiI,GACbpnB,EAAO+rB,MAAOlqB,EAAMsd,EAAMiI,EAAMjI,KAGlC,KAAMA,IAAQiI,GACb0K,EAAQgB,GAAanD,EAASgE,EAAUxU,GAAS,EAAGA,EAAMuU,GAElDvU,IAAQwU,KACfA,EAAUxU,GAAS2S,EAAM3f,MACpBwd,IACJmC,EAAMxvB,IAAMwvB,EAAM3f,MAClB2f,EAAM3f,MAAiB,UAATgN,GAA6B,WAATA,EAAoB,EAAI,KAW/D,QAAS6U,IAAY/O,EAAOgP,GAC3B,GAAIxa,GAAO9W,EAAM2uB,EAAQhsB,EAAO+a,CAGhC,KAAM5G,IAASwL,GAed,GAdAtiB,EAAO3C,EAAOkF,UAAWuU,GACzB6X,EAAS2C,EAAetxB,GACxB2C,EAAQ2f,EAAOxL,GACVzZ,EAAOoD,QAASkC,KACpBgsB,EAAShsB,EAAO,GAChBA,EAAQ2f,EAAOxL,GAAUnU,EAAO,IAG5BmU,IAAU9W,IACdsiB,EAAOtiB,GAAS2C,QACT2f,GAAOxL,IAGf4G,EAAQrgB,EAAO4vB,SAAUjtB,GACpB0d,GAAS,UAAYA,GAAQ,CACjC/a,EAAQ+a,EAAM2Q,OAAQ1rB,SACf2f,GAAOtiB,EAId,KAAM8W,IAASnU,GACNmU,IAASwL,KAChBA,EAAOxL,GAAUnU,EAAOmU,GACxBwa,EAAexa,GAAU6X,OAI3B2C,GAAetxB,GAAS2uB,EAK3B,QAAS4C,IAAWryB,EAAMsyB,EAAYzxB,GACrC,GAAIiP,GACHyiB,EACA3a,EAAQ,EACR1Y,EAAS2xB,GAAoB3xB,OAC7Bkb,EAAWjc,EAAO2b,WAAWK,OAAQ,iBAE7BqY,GAAKxyB,OAEbwyB,EAAO,WACN,GAAKD,EACJ,OAAO,CAWR,KATA,GAAIE,GAAcjC,IAASY,KAC1BhW,EAAY1Z,KAAKyrB,IAAK,EAAGqE,EAAUkB,UAAYlB,EAAUzB,SAAW0C,GAGpEle,EAAO6G,EAAYoW,EAAUzB,UAAY,EACzCF,EAAU,EAAItb,EACdqD,EAAQ,EACR1Y,EAASsyB,EAAUmB,OAAOzzB,OAEXA,EAAR0Y,EAAiBA,IACxB4Z,EAAUmB,OAAQ/a,GAAQgY,IAAKC,EAKhC,OAFAzV,GAASoB,WAAYxb,GAAQwxB,EAAW3B,EAASzU,IAElC,EAAVyU,GAAe3wB,EACZkc,GAEPhB,EAASqB,YAAazb,GAAQwxB,KACvB,IAGTA,EAAYpX,EAASF,SACpBla,KAAMA,EACNojB,MAAOjlB,EAAOyC,UAAY0xB,GAC1BZ,KAAMvzB,EAAOyC,QAAQ,GAAQwxB,kBAAqBvxB,GAClD+xB,mBAAoBN,EACpBO,gBAAiBhyB,EACjB6xB,UAAWlC,IAASY,KACpBrB,SAAUlvB,EAAQkvB,SAClB4C,UACA1B,YAAa,SAAU3T,EAAM7c,GAC5B,GAAIwvB,GAAQ9xB,EAAOqxB,MAAOxvB,EAAMwxB,EAAUE,KAAMpU,EAAM7c,EACpD+wB,EAAUE,KAAKU,cAAe9U,IAAUkU,EAAUE,KAAKjC,OAEzD,OADA+B,GAAUmB,OAAOh1B,KAAMsyB,GAChBA,GAERvR,KAAM,SAAUoU,GACf,GAAIlb,GAAQ,EAGX1Y,EAAS4zB,EAAUtB,EAAUmB,OAAOzzB,OAAS,CAC9C,IAAKqzB,EACJ,MAAOj1B,KAGR,KADAi1B,GAAU,EACMrzB,EAAR0Y,EAAiBA,IACxB4Z,EAAUmB,OAAQ/a,GAAQgY,IAAK,EAShC,OALKkD,GACJ1Y,EAASqB,YAAazb,GAAQwxB,EAAWsB,IAEzC1Y,EAAS2Y,WAAY/yB,GAAQwxB,EAAWsB,IAElCx1B,QAGT8lB,EAAQoO,EAAUpO,KAInB,KAFA+O,GAAY/O,EAAOoO,EAAUE,KAAKU,eAElBlzB,EAAR0Y,EAAiBA,IAExB,GADA9H,EAAS+gB,GAAqBjZ,GAAQxY,KAAMoyB,EAAWxxB,EAAMojB,EAAOoO,EAAUE,MAE7E,MAAO5hB,EAmBT,OAfA3R,GAAO4B,IAAKqjB,EAAO6N,GAAaO,GAE3BrzB,EAAOkD,WAAYmwB,EAAUE,KAAKphB,QACtCkhB,EAAUE,KAAKphB,MAAMlR,KAAMY,EAAMwxB,GAGlCrzB,EAAO+xB,GAAG8C,MACT70B,EAAOyC,OAAQ4xB,GACdxyB,KAAMA,EACN6xB,KAAML,EACNnT,MAAOmT,EAAUE,KAAKrT,SAKjBmT,EAAU3W,SAAU2W,EAAUE,KAAK7W,UACxC/U,KAAM0rB,EAAUE,KAAK5rB,KAAM0rB,EAAUE,KAAKuB,UAC1C5Y,KAAMmX,EAAUE,KAAKrX,MACrBF,OAAQqX,EAAUE,KAAKvX,QAG1Bhc,EAAOk0B,UAAYl0B,EAAOyC,OAAQyxB,IAEjCa,QAAS,SAAU9P,EAAOvjB,GACpB1B,EAAOkD,WAAY+hB,IACvBvjB,EAAWujB,EACXA,GAAU,MAEVA,EAAQA,EAAMze,MAAM,IAOrB,KAJA,GAAI2Y,GACH1F,EAAQ,EACR1Y,EAASkkB,EAAMlkB,OAEAA,EAAR0Y,EAAiBA,IACxB0F,EAAO8F,EAAOxL,GACdmZ,GAAUzT,GAASyT,GAAUzT,OAC7ByT,GAAUzT,GAAOpP,QAASrO,IAI5BszB,UAAW,SAAUtzB,EAAUipB,GACzBA,EACJ+H,GAAoB3iB,QAASrO,GAE7BgxB,GAAoBlzB,KAAMkC,MAK7B1B,EAAOi1B,MAAQ,SAAUA,EAAO3D,EAAQnxB,GACvC,GAAI+0B,GAAMD,GAA0B,gBAAVA,GAAqBj1B,EAAOyC,UAAYwyB,IACjEH,SAAU30B,IAAOA,GAAMmxB,GACtBtxB,EAAOkD,WAAY+xB,IAAWA,EAC/BrD,SAAUqD,EACV3D,OAAQnxB,GAAMmxB,GAAUA,IAAWtxB,EAAOkD,WAAYouB,IAAYA,EAwBnE,OArBA4D,GAAItD,SAAW5xB,EAAO+xB,GAAGhU,IAAM,EAA4B,gBAAjBmX,GAAItD,SAAwBsD,EAAItD,SACzEsD,EAAItD,WAAY5xB,GAAO+xB,GAAGoD,OAASn1B,EAAO+xB,GAAGoD,OAAQD,EAAItD,UAAa5xB,EAAO+xB,GAAGoD,OAAO5Q,UAGtE,MAAb2Q,EAAIhV,OAAiBgV,EAAIhV,SAAU,KACvCgV,EAAIhV,MAAQ,MAIbgV,EAAI/pB,IAAM+pB,EAAIJ,SAEdI,EAAIJ,SAAW,WACT90B,EAAOkD,WAAYgyB,EAAI/pB,MAC3B+pB,EAAI/pB,IAAIlK,KAAM9B,MAGV+1B,EAAIhV,OACRlgB,EAAOmgB,QAAShhB,KAAM+1B,EAAIhV,QAIrBgV,GAGRl1B,EAAOG,GAAGsC,QACT2yB,OAAQ,SAAUH,EAAOI,EAAI/D,EAAQ5vB,GAGpC,MAAOvC,MAAKwP,OAAQoS,GAAWE,IAAK,UAAW,GAAIyO,OAGjDptB,MAAMgzB,SAAUzF,QAASwF,GAAMJ,EAAO3D,EAAQ5vB,IAEjD4zB,QAAS,SAAUnW,EAAM8V,EAAO3D,EAAQ5vB,GACvC,GAAIoS,GAAQ9T,EAAOqE,cAAe8a,GACjCoW,EAASv1B,EAAOi1B,MAAOA,EAAO3D,EAAQ5vB,GACtC8zB,EAAc,WAEb,GAAI9B,GAAOQ,GAAW/0B,KAAMa,EAAOyC,UAAY0c,GAAQoW,IAGlDzhB,GAAS0L,EAAUte,IAAK/B,KAAM,YAClCu0B,EAAKnT,MAAM,GAKd,OAFCiV,GAAYC,OAASD,EAEf1hB,GAASyhB,EAAOrV,SAAU,EAChC/gB,KAAKsC,KAAM+zB,GACXr2B,KAAK+gB,MAAOqV,EAAOrV,MAAOsV,IAE5BjV,KAAM,SAAUxc,EAAM0c,EAAYkU,GACjC,GAAIe,GAAY,SAAUrV,GACzB,GAAIE,GAAOF,EAAME,WACVF,GAAME,KACbA,EAAMoU,GAYP,OATqB,gBAAT5wB,KACX4wB,EAAUlU,EACVA,EAAa1c,EACbA,EAAOV,QAEHod,GAAc1c,KAAS,GAC3B5E,KAAK+gB,MAAOnc,GAAQ,SAGd5E,KAAKsC,KAAK,WAChB,GAAI0e,IAAU,EACb1G,EAAgB,MAAR1V,GAAgBA,EAAO,aAC/B4xB,EAAS31B,EAAO21B,OAChBva,EAAOoE,EAAUte,IAAK/B,KAEvB,IAAKsa,EACC2B,EAAM3B,IAAW2B,EAAM3B,GAAQ8G,MACnCmV,EAAWta,EAAM3B,QAGlB,KAAMA,IAAS2B,GACTA,EAAM3B,IAAW2B,EAAM3B,GAAQ8G,MAAQkS,GAAK3mB,KAAM2N,IACtDic,EAAWta,EAAM3B,GAKpB,KAAMA,EAAQkc,EAAO50B,OAAQ0Y,KACvBkc,EAAQlc,GAAQ5X,OAAS1C,MAAiB,MAAR4E,GAAgB4xB,EAAQlc,GAAQyG,QAAUnc,IAChF4xB,EAAQlc,GAAQia,KAAKnT,KAAMoU,GAC3BxU,GAAU,EACVwV,EAAOnzB,OAAQiX,EAAO,KAOnB0G,IAAYwU,IAChB30B,EAAOmgB,QAAShhB,KAAM4E,MAIzB0xB,OAAQ,SAAU1xB,GAIjB,MAHKA,MAAS,IACbA,EAAOA,GAAQ,MAET5E,KAAKsC,KAAK,WAChB,GAAIgY,GACH2B,EAAOoE,EAAUte,IAAK/B,MACtB+gB,EAAQ9E,EAAMrX,EAAO,SACrBsc,EAAQjF,EAAMrX,EAAO,cACrB4xB,EAAS31B,EAAO21B,OAChB50B,EAASmf,EAAQA,EAAMnf,OAAS,CAajC,KAVAqa,EAAKqa,QAAS,EAGdz1B,EAAOkgB,MAAO/gB,KAAM4E,MAEfsc,GAASA,EAAME,MACnBF,EAAME,KAAKtf,KAAM9B,MAAM,GAIlBsa,EAAQkc,EAAO50B,OAAQ0Y,KACvBkc,EAAQlc,GAAQ5X,OAAS1C,MAAQw2B,EAAQlc,GAAQyG,QAAUnc,IAC/D4xB,EAAQlc,GAAQia,KAAKnT,MAAM,GAC3BoV,EAAOnzB,OAAQiX,EAAO,GAKxB,KAAMA,EAAQ,EAAW1Y,EAAR0Y,EAAgBA,IAC3ByG,EAAOzG,IAAWyG,EAAOzG,GAAQgc,QACrCvV,EAAOzG,GAAQgc,OAAOx0B,KAAM9B,YAKvBic,GAAKqa,YAKfz1B,EAAOyB,MAAO,SAAU,OAAQ,QAAU,SAAUK,EAAGa,GACtD,GAAIizB,GAAQ51B,EAAOG,GAAIwC,EACvB3C,GAAOG,GAAIwC,GAAS,SAAUsyB,EAAO3D,EAAQ5vB,GAC5C,MAAgB,OAATuzB,GAAkC,iBAAVA,GAC9BW,EAAM7zB,MAAO5C,KAAM6C,WACnB7C,KAAKm2B,QAASpC,GAAOvwB,GAAM,GAAQsyB,EAAO3D,EAAQ5vB,MAKrD1B,EAAOyB,MACNo0B,UAAW3C,GAAM,QACjB4C,QAAS5C,GAAM,QACf6C,YAAa7C,GAAM,UACnB8C,QAAUnG,QAAS,QACnBoG,SAAWpG,QAAS,QACpBqG,YAAcrG,QAAS,WACrB,SAAUltB,EAAMsiB,GAClBjlB,EAAOG,GAAIwC,GAAS,SAAUsyB,EAAO3D,EAAQ5vB,GAC5C,MAAOvC,MAAKm2B,QAASrQ,EAAOgQ,EAAO3D,EAAQ5vB,MAI7C1B,EAAO21B,UACP31B,EAAO+xB,GAAGsC,KAAO,WAChB,GAAIQ,GACH/yB,EAAI,EACJ6zB,EAAS31B,EAAO21B,MAIjB,KAFAtD,GAAQryB,EAAOsG,MAEPxE,EAAI6zB,EAAO50B,OAAQe,IAC1B+yB,EAAQc,EAAQ7zB,GAEV+yB,KAAWc,EAAQ7zB,KAAQ+yB,GAChCc,EAAOnzB,OAAQV,IAAK,EAIhB6zB,GAAO50B,QACZf,EAAO+xB,GAAGxR,OAEX8R,GAAQhvB,QAGTrD,EAAO+xB,GAAG8C,MAAQ,SAAUA,GAC3B70B,EAAO21B,OAAOn2B,KAAMq1B,GACfA,IACJ70B,EAAO+xB,GAAG5f,QAEVnS,EAAO21B,OAAOvtB,OAIhBpI,EAAO+xB,GAAGoE,SAAW,GAErBn2B,EAAO+xB,GAAG5f,MAAQ,WACXmgB,KACLA,GAAU8D,YAAap2B,EAAO+xB,GAAGsC,KAAMr0B,EAAO+xB,GAAGoE,YAInDn2B,EAAO+xB,GAAGxR,KAAO,WAChB8V,cAAe/D,IACfA,GAAU,MAGXtyB,EAAO+xB,GAAGoD,QACTmB,KAAM,IACNC,KAAM,IAENhS,SAAU,KAMXvkB,EAAOG,GAAGq2B,MAAQ,SAAUC,EAAM1yB,GAIjC,MAHA0yB,GAAOz2B,EAAO+xB,GAAK/xB,EAAO+xB,GAAGoD,OAAQsB,IAAUA,EAAOA,EACtD1yB,EAAOA,GAAQ,KAER5E,KAAK+gB,MAAOnc,EAAM,SAAUgV,EAAMsH,GACxC,GAAIqW,GAAUvY,WAAYpF,EAAM0d,EAChCpW,GAAME,KAAO,WACZoW,aAAcD,OAMjB,WACC,GAAI1nB,GAAQjQ,EAAS6F,cAAe,SACnCmC,EAAShI,EAAS6F,cAAe,UACjCswB,EAAMnuB,EAAOhC,YAAahG,EAAS6F,cAAe,UAEnDoK,GAAMjL,KAAO,WAIbjE,EAAQ82B,QAA0B,KAAhB5nB,EAAM1J,MAIxBxF,EAAQ+2B,YAAc3B,EAAIthB,SAI1B7M,EAAO2M,UAAW,EAClB5T,EAAQg3B,aAAe5B,EAAIxhB,SAI3B1E,EAAQjQ,EAAS6F,cAAe,SAChCoK,EAAM1J,MAAQ,IACd0J,EAAMjL,KAAO,QACbjE,EAAQi3B,WAA6B,MAAhB/nB,EAAM1J,QAI5B,IAAI0xB,IAAUC,GACb/pB,GAAalN,EAAOgQ,KAAK9C,UAE1BlN,GAAOG,GAAGsC,QACTyN,KAAM,SAAUvN,EAAM2C,GACrB,MAAO8Y,GAAQjf,KAAMa,EAAOkQ,KAAMvN,EAAM2C,EAAOtD,UAAUjB,OAAS,IAGnEm2B,WAAY,SAAUv0B,GACrB,MAAOxD,MAAKsC,KAAK,WAChBzB,EAAOk3B,WAAY/3B,KAAMwD,QAK5B3C,EAAOyC,QACNyN,KAAM,SAAUrO,EAAMc,EAAM2C,GAC3B,GAAI+a,GAAO/e,EACV61B,EAAQt1B,EAAKuC,QAGd,IAAMvC,GAAkB,IAAVs1B,GAAyB,IAAVA,GAAyB,IAAVA,EAK5C,aAAYt1B,GAAKkK,eAAiByV,EAC1BxhB,EAAOmf,KAAMtd,EAAMc,EAAM2C,IAKlB,IAAV6xB,GAAgBn3B,EAAOgY,SAAUnW,KACrCc,EAAOA,EAAK0C,cACZgb,EAAQrgB,EAAOo3B,UAAWz0B,KACvB3C,EAAOgQ,KAAKhF,MAAMrB,KAAKmC,KAAMnJ,GAASs0B,GAAWD;AAGtC3zB,SAAViC,EAaO+a,GAAS,OAASA,IAA6C,QAAnC/e,EAAM+e,EAAMnf,IAAKW,EAAMc,IACvDrB,GAGPA,EAAMtB,EAAO0O,KAAKwB,KAAMrO,EAAMc,GAGhB,MAAPrB,EACN+B,OACA/B,GApBc,OAAVgE,EAGO+a,GAAS,OAASA,IAAoDhd,UAA1C/B,EAAM+e,EAAMnB,IAAKrd,EAAMyD,EAAO3C,IAC9DrB,GAGPO,EAAKmK,aAAcrJ,EAAM2C,EAAQ,IAC1BA,OAPPtF,GAAOk3B,WAAYr1B,EAAMc,KAuB5Bu0B,WAAY,SAAUr1B,EAAMyD,GAC3B,GAAI3C,GAAM00B,EACTv1B,EAAI,EACJw1B,EAAYhyB,GAASA,EAAM0F,MAAOqP,EAEnC,IAAKid,GAA+B,IAAlBz1B,EAAKuC,SACtB,MAASzB,EAAO20B,EAAUx1B,KACzBu1B,EAAWr3B,EAAOu3B,QAAS50B,IAAUA,EAGhC3C,EAAOgQ,KAAKhF,MAAMrB,KAAKmC,KAAMnJ,KAEjCd,EAAMw1B,IAAa,GAGpBx1B,EAAKyK,gBAAiB3J,IAKzBy0B,WACCrzB,MACCmb,IAAK,SAAUrd,EAAMyD,GACpB,IAAMxF,EAAQi3B,YAAwB,UAAVzxB,GAC3BtF,EAAOoF,SAAUvD,EAAM,SAAY,CACnC,GAAIsO,GAAMtO,EAAKyD,KAKf,OAJAzD,GAAKmK,aAAc,OAAQ1G,GACtB6K,IACJtO,EAAKyD,MAAQ6K,GAEP7K,QAQZ2xB,IACC/X,IAAK,SAAUrd,EAAMyD,EAAO3C,GAO3B,MANK2C,MAAU,EAEdtF,EAAOk3B,WAAYr1B,EAAMc,GAEzBd,EAAKmK,aAAcrJ,EAAMA,GAEnBA,IAGT3C,EAAOyB,KAAMzB,EAAOgQ,KAAKhF,MAAMrB,KAAKkX,OAAO7V,MAAO,QAAU,SAAUlJ,EAAGa,GACxE,GAAI60B,GAAStqB,GAAYvK,IAAU3C,EAAO0O,KAAKwB,IAE/ChD,IAAYvK,GAAS,SAAUd,EAAMc,EAAMiE,GAC1C,GAAItF,GAAKwhB,CAUT,OATMlc,KAELkc,EAAS5V,GAAYvK,GACrBuK,GAAYvK,GAASrB,EACrBA,EAAqC,MAA/Bk2B,EAAQ31B,EAAMc,EAAMiE,GACzBjE,EAAK0C,cACL,KACD6H,GAAYvK,GAASmgB,GAEfxhB,IAOT,IAAIm2B,IAAa,qCAEjBz3B,GAAOG,GAAGsC,QACT0c,KAAM,SAAUxc,EAAM2C,GACrB,MAAO8Y,GAAQjf,KAAMa,EAAOmf,KAAMxc,EAAM2C,EAAOtD,UAAUjB,OAAS,IAGnE22B,WAAY,SAAU/0B,GACrB,MAAOxD,MAAKsC,KAAK,iBACTtC,MAAMa,EAAOu3B,QAAS50B,IAAUA,QAK1C3C,EAAOyC,QACN80B,SACCI,MAAO,UACPC,QAAS,aAGVzY,KAAM,SAAUtd,EAAMc,EAAM2C,GAC3B,GAAIhE,GAAK+e,EAAOwX,EACfV,EAAQt1B,EAAKuC,QAGd,IAAMvC,GAAkB,IAAVs1B,GAAyB,IAAVA,GAAyB,IAAVA,EAY5C,MARAU,GAAmB,IAAVV,IAAgBn3B,EAAOgY,SAAUnW,GAErCg2B,IAEJl1B,EAAO3C,EAAOu3B,QAAS50B,IAAUA,EACjC0d,EAAQrgB,EAAOwxB,UAAW7uB,IAGZU,SAAViC,EACG+a,GAAS,OAASA,IAAoDhd,UAA1C/B,EAAM+e,EAAMnB,IAAKrd,EAAMyD,EAAO3C,IAChErB,EACEO,EAAMc,GAAS2C,EAGX+a,GAAS,OAASA,IAA6C,QAAnC/e,EAAM+e,EAAMnf,IAAKW,EAAMc,IACzDrB,EACAO,EAAMc,IAIT6uB,WACChe,UACCtS,IAAK,SAAUW,GACd,MAAOA,GAAKi2B,aAAc,aAAgBL,GAAW3rB,KAAMjK,EAAKuD,WAAcvD,EAAK0R,KAClF1R,EAAK2R,SACL,QAMC1T,EAAQ+2B,cACb72B,EAAOwxB,UAAU5d,UAChB1S,IAAK,SAAUW,GACd,GAAImM,GAASnM,EAAKmD,UAIlB,OAHKgJ,IAAUA,EAAOhJ,YACrBgJ,EAAOhJ,WAAW6O,cAEZ,QAKV7T,EAAOyB,MACN,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFzB,EAAOu3B,QAASp4B,KAAKkG,eAAkBlG,MAMxC,IAAI44B,IAAS,aAEb/3B,GAAOG,GAAGsC,QACTu1B,SAAU,SAAU1yB,GACnB,GAAI2yB,GAASp2B,EAAMuL,EAAK8qB,EAAO71B,EAAG81B,EACjCC,EAA2B,gBAAV9yB,IAAsBA,EACvCxD,EAAI,EACJM,EAAMjD,KAAK4B,MAEZ,IAAKf,EAAOkD,WAAYoC,GACvB,MAAOnG,MAAKsC,KAAK,SAAUY,GAC1BrC,EAAQb,MAAO64B,SAAU1yB,EAAMrE,KAAM9B,KAAMkD,EAAGlD,KAAKmP,aAIrD,IAAK8pB,EAIJ,IAFAH,GAAY3yB,GAAS,IAAK0F,MAAOqP,OAErBjY,EAAJN,EAASA,IAOhB,GANAD,EAAO1C,KAAM2C,GACbsL,EAAwB,IAAlBvL,EAAKuC,WAAoBvC,EAAKyM,WACjC,IAAMzM,EAAKyM,UAAY,KAAM7K,QAASs0B,GAAQ,KAChD,KAGU,CACV11B,EAAI,CACJ,OAAS61B,EAAQD,EAAQ51B,KACnB+K,EAAI3N,QAAS,IAAMy4B,EAAQ,KAAQ,IACvC9qB,GAAO8qB,EAAQ,IAKjBC,GAAan4B,EAAO2E,KAAMyI,GACrBvL,EAAKyM,YAAc6pB,IACvBt2B,EAAKyM,UAAY6pB,GAMrB,MAAOh5B,OAGRk5B,YAAa,SAAU/yB,GACtB,GAAI2yB,GAASp2B,EAAMuL,EAAK8qB,EAAO71B,EAAG81B,EACjCC,EAA+B,IAArBp2B,UAAUjB,QAAiC,gBAAVuE,IAAsBA,EACjExD,EAAI,EACJM,EAAMjD,KAAK4B,MAEZ,IAAKf,EAAOkD,WAAYoC,GACvB,MAAOnG,MAAKsC,KAAK,SAAUY,GAC1BrC,EAAQb,MAAOk5B,YAAa/yB,EAAMrE,KAAM9B,KAAMkD,EAAGlD,KAAKmP,aAGxD,IAAK8pB,EAGJ,IAFAH,GAAY3yB,GAAS,IAAK0F,MAAOqP,OAErBjY,EAAJN,EAASA,IAQhB,GAPAD,EAAO1C,KAAM2C,GAEbsL,EAAwB,IAAlBvL,EAAKuC,WAAoBvC,EAAKyM,WACjC,IAAMzM,EAAKyM,UAAY,KAAM7K,QAASs0B,GAAQ,KAChD,IAGU,CACV11B,EAAI,CACJ,OAAS61B,EAAQD,EAAQ51B,KAExB,MAAQ+K,EAAI3N,QAAS,IAAMy4B,EAAQ,MAAS,EAC3C9qB,EAAMA,EAAI3J,QAAS,IAAMy0B,EAAQ,IAAK,IAKxCC,GAAa7yB,EAAQtF,EAAO2E,KAAMyI,GAAQ,GACrCvL,EAAKyM,YAAc6pB,IACvBt2B,EAAKyM,UAAY6pB,GAMrB,MAAOh5B,OAGRm5B,YAAa,SAAUhzB,EAAOizB,GAC7B,GAAIx0B,SAAcuB,EAElB,OAAyB,iBAAbizB,IAAmC,WAATx0B,EAC9Bw0B,EAAWp5B,KAAK64B,SAAU1yB,GAAUnG,KAAKk5B,YAAa/yB,GAItDnG,KAAKsC,KADRzB,EAAOkD,WAAYoC,GACN,SAAUxD,GAC1B9B,EAAQb,MAAOm5B,YAAahzB,EAAMrE,KAAK9B,KAAM2C,EAAG3C,KAAKmP,UAAWiqB,GAAWA,IAI5D,WAChB,GAAc,WAATx0B,EAAoB,CAExB,GAAIuK,GACHxM,EAAI,EACJwW,EAAOtY,EAAQb,MACfq5B,EAAalzB,EAAM0F,MAAOqP,MAE3B,OAAS/L,EAAYkqB,EAAY12B,KAE3BwW,EAAKmgB,SAAUnqB,GACnBgK,EAAK+f,YAAa/pB,GAElBgK,EAAK0f,SAAU1pB,QAKNvK,IAASyd,GAAyB,YAATzd,KAC/B5E,KAAKmP,WAETkR,EAAUN,IAAK/f,KAAM,gBAAiBA,KAAKmP,WAO5CnP,KAAKmP,UAAYnP,KAAKmP,WAAahJ,KAAU,EAAQ,GAAKka,EAAUte,IAAK/B,KAAM,kBAAqB,OAKvGs5B,SAAU,SAAUx4B,GAInB,IAHA,GAAIqO,GAAY,IAAMrO,EAAW,IAChC6B,EAAI,EACJwX,EAAIna,KAAK4B,OACEuY,EAAJxX,EAAOA,IACd,GAA0B,IAArB3C,KAAK2C,GAAGsC,WAAmB,IAAMjF,KAAK2C,GAAGwM,UAAY,KAAK7K,QAAQs0B,GAAQ,KAAKt4B,QAAS6O,IAAe,EAC3G,OAAO,CAIT,QAAO,IAOT,IAAIoqB,IAAU,KAEd14B,GAAOG,GAAGsC,QACT0N,IAAK,SAAU7K,GACd,GAAI+a,GAAO/e,EAAK4B,EACfrB,EAAO1C,KAAK,EAEb,EAAA,GAAM6C,UAAUjB,OAsBhB,MAFAmC,GAAalD,EAAOkD,WAAYoC,GAEzBnG,KAAKsC,KAAK,SAAUK,GAC1B,GAAIqO,EAEmB,KAAlBhR,KAAKiF,WAKT+L,EADIjN,EACEoC,EAAMrE,KAAM9B,KAAM2C,EAAG9B,EAAQb,MAAOgR,OAEpC7K,EAIK,MAAP6K,EACJA,EAAM,GAEoB,gBAARA,GAClBA,GAAO,GAEInQ,EAAOoD,QAAS+M,KAC3BA,EAAMnQ,EAAO4B,IAAKuO,EAAK,SAAU7K,GAChC,MAAgB,OAATA,EAAgB,GAAKA,EAAQ,MAItC+a,EAAQrgB,EAAO24B,SAAUx5B,KAAK4E,OAAU/D,EAAO24B,SAAUx5B,KAAKiG,SAASC,eAGjEgb,GAAW,OAASA,IAA8Chd,SAApCgd,EAAMnB,IAAK/f,KAAMgR,EAAK,WACzDhR,KAAKmG,MAAQ6K,KAnDd,IAAKtO,EAGJ,MAFAwe,GAAQrgB,EAAO24B,SAAU92B,EAAKkC,OAAU/D,EAAO24B,SAAU92B,EAAKuD,SAASC,eAElEgb,GAAS,OAASA,IAAgDhd,UAAtC/B,EAAM+e,EAAMnf,IAAKW,EAAM,UAChDP,GAGRA,EAAMO,EAAKyD,MAEW,gBAARhE,GAEbA,EAAImC,QAAQi1B,GAAS,IAEd,MAAPp3B,EAAc,GAAKA,OA4CxBtB,EAAOyC,QACNk2B,UACCvQ,QACClnB,IAAK,SAAUW,GACd,GAAIsO,GAAMnQ,EAAO0O,KAAKwB,KAAMrO,EAAM,QAClC,OAAc,OAAPsO,EACNA,EAGAnQ,EAAO2E,KAAM3E,EAAO6E,KAAMhD,MAG7BkF,QACC7F,IAAK,SAAUW,GAYd,IAXA,GAAIyD,GAAO8iB,EACV1lB,EAAUb,EAAKa,QACf+W,EAAQ5X,EAAKgS,cACb4T,EAAoB,eAAd5lB,EAAKkC,MAAiC,EAAR0V,EACpC0D,EAASsK,EAAM,QACfuH,EAAMvH,EAAMhO,EAAQ,EAAI/W,EAAQ3B,OAChCe,EAAY,EAAR2X,EACHuV,EACAvH,EAAMhO,EAAQ,EAGJuV,EAAJltB,EAASA,IAIhB,GAHAsmB,EAAS1lB,EAASZ,MAGXsmB,EAAOxU,UAAY9R,IAAM2X,IAE5B3Z,EAAQg3B,YAAe1O,EAAO1U,SAAiD,OAAtC0U,EAAOrc,aAAc,cAC7Dqc,EAAOpjB,WAAW0O,UAAa1T,EAAOoF,SAAUgjB,EAAOpjB,WAAY,aAAiB,CAMxF,GAHAM,EAAQtF,EAAQooB,GAASjY,MAGpBsX,EACJ,MAAOniB,EAIR6X,GAAO3d,KAAM8F,GAIf,MAAO6X,IAGR+B,IAAK,SAAUrd,EAAMyD,GACpB,GAAIszB,GAAWxQ,EACd1lB,EAAUb,EAAKa,QACfya,EAASnd,EAAOwF,UAAWF,GAC3BxD,EAAIY,EAAQ3B,MAEb,OAAQe,IACPsmB,EAAS1lB,EAASZ,IACZsmB,EAAOxU,SAAW5T,EAAO2F,QAASyiB,EAAO9iB,MAAO6X,IAAY,KACjEyb,GAAY,EAQd,OAHMA,KACL/2B,EAAKgS,cAAgB,IAEfsJ,OAOXnd,EAAOyB,MAAO,QAAS,YAAc,WACpCzB,EAAO24B,SAAUx5B,OAChB+f,IAAK,SAAUrd,EAAMyD,GACpB,MAAKtF,GAAOoD,QAASkC,GACXzD,EAAK8R,QAAU3T,EAAO2F,QAAS3F,EAAO6B,GAAMsO,MAAO7K,IAAW,EADxE,SAKIxF,EAAQ82B,UACb52B,EAAO24B,SAAUx5B,MAAO+B,IAAM,SAAUW,GACvC,MAAsC,QAA/BA,EAAKkK,aAAa,SAAoB,KAAOlK,EAAKyD,UAW5DtF,EAAOyB,KAAM,0MAEqD+E,MAAM,KAAM,SAAU1E,EAAGa,GAG1F3C,EAAOG,GAAIwC,GAAS,SAAUyY,EAAMjb,GACnC,MAAO6B,WAAUjB,OAAS,EACzB5B,KAAKqoB,GAAI7kB,EAAM,KAAMyY,EAAMjb,GAC3BhB,KAAKukB,QAAS/gB,MAIjB3C,EAAOG,GAAGsC,QACTo2B,MAAO,SAAUC,EAAQC,GACxB,MAAO55B,MAAK6nB,WAAY8R,GAAS7R,WAAY8R,GAASD,IAGvDE,KAAM,SAAU7W,EAAO/G,EAAMjb,GAC5B,MAAOhB,MAAKqoB,GAAIrF,EAAO,KAAM/G,EAAMjb,IAEpC84B,OAAQ,SAAU9W,EAAOhiB,GACxB,MAAOhB,MAAK4e,IAAKoE,EAAO,KAAMhiB,IAG/B+4B,SAAU,SAAUj5B,EAAUkiB,EAAO/G,EAAMjb,GAC1C,MAAOhB,MAAKqoB,GAAIrF,EAAOliB,EAAUmb,EAAMjb,IAExCg5B,WAAY,SAAUl5B,EAAUkiB,EAAOhiB,GAEtC,MAA4B,KAArB6B,UAAUjB,OAAe5B,KAAK4e,IAAK9d,EAAU,MAASd,KAAK4e,IAAKoE,EAAOliB,GAAY,KAAME,KAKlG,IAAIi5B,IAAQp5B,EAAOsG,MAEf+yB,GAAS,IAMbr5B,GAAO6f,UAAY,SAAUzE,GAC5B,MAAOke,MAAKC,MAAOne,EAAO,KAK3Bpb,EAAOw5B,SAAW,SAAUpe,GAC3B,GAAIpJ,GAAK3L,CACT,KAAM+U,GAAwB,gBAATA,GACpB,MAAO,KAIR,KACC/U,EAAM,GAAIozB,WACVznB,EAAM3L,EAAIqzB,gBAAiBte,EAAM,YAChC,MAAQvQ,GACTmH,EAAM3O,OAMP,QAHM2O,GAAOA,EAAIrG,qBAAsB,eAAgB5K,SACtDf,EAAO2D,MAAO,gBAAkByX,GAE1BpJ,EAIR,IACC2nB,IAAQ,OACRC,GAAM,gBACNC,GAAW,6BAEXC,GAAiB,4DACjBC,GAAa,iBACbC,GAAY,QACZC,GAAO,4DAWPC,MAOAC,MAGAC,GAAW,KAAK76B,OAAQ,KAGxB86B,GAAen7B,EAAOgU,SAASK,KAG/B+mB,GAAeL,GAAKzuB,KAAM6uB,GAAah1B,kBAGxC,SAASk1B,IAA6BC,GAGrC,MAAO,UAAUC,EAAoB7e,GAED,gBAAvB6e,KACX7e,EAAO6e,EACPA,EAAqB,IAGtB,IAAIC,GACH54B,EAAI,EACJ64B,EAAYF,EAAmBp1B,cAAc2F,MAAOqP,MAErD,IAAKra,EAAOkD,WAAY0Y,GAEvB,MAAS8e,EAAWC,EAAU74B,KAER,MAAhB44B,EAAS,IACbA,EAAWA,EAASp7B,MAAO,IAAO,KACjCk7B,EAAWE,GAAaF,EAAWE,QAAkB3qB,QAAS6L,KAI9D4e,EAAWE,GAAaF,EAAWE,QAAkBl7B,KAAMoc,IAQjE,QAASgf,IAA+BJ,EAAW93B,EAASgyB,EAAiBmG,GAE5E,GAAIC,MACHC,EAAqBP,IAAcL,EAEpC,SAASa,GAASN,GACjB,GAAI9mB,EAYJ,OAXAknB,GAAWJ,IAAa,EACxB16B,EAAOyB,KAAM+4B,EAAWE,OAAkB,SAAUrwB,EAAG4wB,GACtD,GAAIC,GAAsBD,EAAoBv4B,EAASgyB,EAAiBmG,EACxE,OAAoC,gBAAxBK,IAAqCH,GAAqBD,EAAWI,GAIrEH,IACDnnB,EAAWsnB,GADf,QAHNx4B,EAAQi4B,UAAU5qB,QAASmrB,GAC3BF,EAASE,IACF,KAKFtnB,EAGR,MAAOonB,GAASt4B,EAAQi4B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,QAASG,IAAYn4B,EAAQJ,GAC5B,GAAI6J,GAAKxJ,EACRm4B,EAAcp7B,EAAOq7B,aAAaD,eAEnC,KAAM3uB,IAAO7J,GACQS,SAAfT,EAAK6J,MACP2uB,EAAa3uB,GAAQzJ,EAAWC,IAASA,OAAgBwJ,GAAQ7J,EAAK6J,GAO1E,OAJKxJ,IACJjD,EAAOyC,QAAQ,EAAMO,EAAQC,GAGvBD,EAOR,QAASs4B,IAAqBC,EAAGV,EAAOW,GAEvC,GAAIC,GAAI13B,EAAM23B,EAAeC,EAC5B7iB,EAAWyiB,EAAEziB,SACb6hB,EAAYY,EAAEZ,SAGf,OAA2B,MAAnBA,EAAW,GAClBA,EAAUhuB,QACEtJ,SAAPo4B,IACJA,EAAKF,EAAEK,UAAYf,EAAMgB,kBAAkB,gBAK7C,IAAKJ,EACJ,IAAM13B,IAAQ+U,GACb,GAAKA,EAAU/U,IAAU+U,EAAU/U,GAAO+H,KAAM2vB,GAAO,CACtDd,EAAU5qB,QAAShM,EACnB,OAMH,GAAK42B,EAAW,IAAOa,GACtBE,EAAgBf,EAAW,OACrB,CAEN,IAAM52B,IAAQy3B,GAAY,CACzB,IAAMb,EAAW,IAAOY,EAAEO,WAAY/3B,EAAO,IAAM42B,EAAU,IAAO,CACnEe,EAAgB33B,CAChB,OAEK43B,IACLA,EAAgB53B,GAIlB23B,EAAgBA,GAAiBC,EAMlC,MAAKD,IACCA,IAAkBf,EAAW,IACjCA,EAAU5qB,QAAS2rB,GAEbF,EAAWE,IAJnB,OAWD,QAASK,IAAaR,EAAGS,EAAUnB,EAAOoB,GACzC,GAAIC,GAAOC,EAASC,EAAM/1B,EAAK2S,EAC9B8iB,KAEAnB,EAAYY,EAAEZ,UAAUr7B,OAGzB,IAAKq7B,EAAW,GACf,IAAMyB,IAAQb,GAAEO,WACfA,EAAYM,EAAK/2B,eAAkBk2B,EAAEO,WAAYM,EAInDD,GAAUxB,EAAUhuB,OAGpB,OAAQwvB,EAcP,GAZKZ,EAAEc,eAAgBF,KACtBtB,EAAOU,EAAEc,eAAgBF,IAAcH,IAIlChjB,GAAQijB,GAAaV,EAAEe,aAC5BN,EAAWT,EAAEe,WAAYN,EAAUT,EAAEb,WAGtC1hB,EAAOmjB,EACPA,EAAUxB,EAAUhuB,QAKnB,GAAiB,MAAZwvB,EAEJA,EAAUnjB,MAGJ,IAAc,MAATA,GAAgBA,IAASmjB,EAAU,CAM9C,GAHAC,EAAON,EAAY9iB,EAAO,IAAMmjB,IAAaL,EAAY,KAAOK,IAG1DC,EACL,IAAMF,IAASJ,GAId,GADAz1B,EAAM61B,EAAM11B,MAAO,KACdH,EAAK,KAAQ81B,IAGjBC,EAAON,EAAY9iB,EAAO,IAAM3S,EAAK,KACpCy1B,EAAY,KAAOz1B,EAAK,KACb,CAEN+1B,KAAS,EACbA,EAAON,EAAYI,GAGRJ,EAAYI,MAAY,IACnCC,EAAU91B,EAAK,GACfs0B,EAAU5qB,QAAS1J,EAAK,IAEzB,OAOJ,GAAK+1B,KAAS,EAGb,GAAKA,GAAQb,EAAG,UACfS,EAAWI,EAAMJ,OAEjB,KACCA,EAAWI,EAAMJ,GAChB,MAAQnxB,GACT,OAASiR,MAAO,cAAenY,MAAOy4B,EAAOvxB,EAAI,sBAAwBmO,EAAO,OAASmjB,IAQ/F,OAASrgB,MAAO,UAAWV,KAAM4gB,GAGlCh8B,EAAOyC,QAGN85B,OAAQ,EAGRC,gBACAC,QAEApB,cACCqB,IAAKrC,GACLt2B,KAAM,MACN44B,QAAS7C,GAAehuB,KAAMwuB,GAAc,IAC5C37B,QAAQ,EACRi+B,aAAa,EACbC,OAAO,EACPC,YAAa,mDAabhe,SACC+T,IAAKuH,GACLv1B,KAAM,aACNmmB,KAAM,YACNhZ,IAAK,4BACL+qB,KAAM,qCAGPjkB,UACC9G,IAAK,MACLgZ,KAAM,OACN+R,KAAM,QAGPV,gBACCrqB,IAAK,cACLnN,KAAM,eACNk4B,KAAM,gBAKPjB,YAGCkB,SAAUvyB,OAGVwyB,aAAa,EAGbC,YAAal9B,EAAO6f,UAGpBsd,WAAYn9B,EAAOw5B,UAOpB4B,aACCsB,KAAK,EACLx8B,SAAS,IAOXk9B,UAAW,SAAUp6B,EAAQq6B,GAC5B,MAAOA,GAGNlC,GAAYA,GAAYn4B,EAAQhD,EAAOq7B,cAAgBgC,GAGvDlC,GAAYn7B,EAAOq7B,aAAcr4B,IAGnCs6B,cAAe/C,GAA6BL,IAC5CqD,cAAehD,GAA6BJ,IAG5CqD,KAAM,SAAUd,EAAKh6B,GAGA,gBAARg6B,KACXh6B,EAAUg6B,EACVA,EAAMr5B,QAIPX,EAAUA,KAEV,IAAI+6B,GAEHC,EAEAC,EACAC,EAEAC,EAEA3M,EAEA4M,EAEAh8B,EAEAy5B,EAAIv7B,EAAOo9B,aAAe16B,GAE1Bq7B,EAAkBxC,EAAEr7B,SAAWq7B,EAE/ByC,EAAqBzC,EAAEr7B,UAAa69B,EAAgB35B,UAAY25B,EAAgBl9B,QAC/Eb,EAAQ+9B,GACR/9B,EAAOkiB,MAERjG,EAAWjc,EAAO2b,WAClBsiB,EAAmBj+B,EAAO0a,UAAU,eAEpCwjB,EAAa3C,EAAE2C,eAEfC,KACAC,KAEAtiB,EAAQ,EAERuiB,EAAW,WAEXxD,GACC3c,WAAY,EAGZ2d,kBAAmB,SAAUpvB,GAC5B,GAAIzB,EACJ,IAAe,IAAV8Q,EAAc,CAClB,IAAM8hB,EAAkB,CACvBA,IACA,OAAS5yB,EAAQ6uB,GAASruB,KAAMmyB,GAC/BC,EAAiB5yB,EAAM,GAAG3F,eAAkB2F,EAAO,GAGrDA,EAAQ4yB,EAAiBnxB,EAAIpH,eAE9B,MAAgB,OAAT2F,EAAgB,KAAOA,GAI/BszB,sBAAuB,WACtB,MAAiB,KAAVxiB,EAAc6hB,EAAwB,MAI9CY,iBAAkB,SAAU57B,EAAM2C,GACjC,GAAIk5B,GAAQ77B,EAAK0C,aAKjB,OAJMyW,KACLnZ,EAAOy7B,EAAqBI,GAAUJ,EAAqBI,IAAW77B,EACtEw7B,EAAgBx7B,GAAS2C,GAEnBnG,MAIRs/B,iBAAkB,SAAU16B,GAI3B,MAHM+X,KACLyf,EAAEK,SAAW73B,GAEP5E,MAIR++B,WAAY,SAAUt8B,GACrB,GAAI2C,EACJ,IAAK3C,EACJ,GAAa,EAARka,EACJ,IAAMvX,IAAQ3C,GAEbs8B,EAAY35B,IAAW25B,EAAY35B,GAAQ3C,EAAK2C,QAIjDs2B,GAAM7e,OAAQpa,EAAKi5B,EAAM6D,QAG3B,OAAOv/B,OAIRw/B,MAAO,SAAUC,GAChB,GAAIC,GAAYD,GAAcP,CAK9B,OAJKZ,IACJA,EAAUkB,MAAOE,GAElBl3B,EAAM,EAAGk3B,GACF1/B,MAyCV,IApCA8c,EAASF,QAAS8e,GAAQ/F,SAAWmJ,EAAiBtkB,IACtDkhB,EAAMiE,QAAUjE,EAAMlzB,KACtBkzB,EAAMl3B,MAAQk3B,EAAM3e,KAMpBqf,EAAEmB,MAAUA,GAAOnB,EAAEmB,KAAOrC,IAAiB,IAAK52B,QAASk2B,GAAO,IAChEl2B,QAASu2B,GAAWM,GAAc,GAAM,MAG1CiB,EAAEx3B,KAAOrB,EAAQq8B,QAAUr8B,EAAQqB,MAAQw3B,EAAEwD,QAAUxD,EAAEx3B,KAGzDw3B,EAAEZ,UAAY36B,EAAO2E,KAAM42B,EAAEb,UAAY,KAAMr1B,cAAc2F,MAAOqP,KAAiB,IAG/D,MAAjBkhB,EAAEyD,cACN9N,EAAQ+I,GAAKzuB,KAAM+vB,EAAEmB,IAAIr3B,eACzBk2B,EAAEyD,eAAkB9N,GACjBA,EAAO,KAAQoJ,GAAc,IAAOpJ,EAAO,KAAQoJ,GAAc,KAChEpJ,EAAO,KAAwB,UAAfA,EAAO,GAAkB,KAAO,WAC/CoJ,GAAc,KAA+B,UAAtBA,GAAc,GAAkB,KAAO,UAK/DiB,EAAEngB,MAAQmgB,EAAEqB,aAAiC,gBAAXrB,GAAEngB,OACxCmgB,EAAEngB,KAAOpb,EAAOi/B,MAAO1D,EAAEngB,KAAMmgB,EAAE2D,cAIlCtE,GAA+BV,GAAYqB,EAAG74B,EAASm4B,GAGxC,IAAV/e,EACJ,MAAO+e,EAKRiD,GAAc99B,EAAOkiB,OAASqZ,EAAE58B,OAG3Bm/B,GAAmC,IAApB99B,EAAOu8B,UAC1Bv8B,EAAOkiB,MAAMwB,QAAQ,aAItB6X,EAAEx3B,KAAOw3B,EAAEx3B,KAAKpD,cAGhB46B,EAAE4D,YAAcpF,GAAWjuB,KAAMyvB,EAAEx3B,MAInC25B,EAAWnC,EAAEmB,IAGPnB,EAAE4D,aAGF5D,EAAEngB,OACNsiB,EAAanC,EAAEmB,MAASrD,GAAOvtB,KAAM4xB,GAAa,IAAM,KAAQnC,EAAEngB,WAE3DmgB,GAAEngB,MAILmgB,EAAE/uB,SAAU,IAChB+uB,EAAEmB,IAAM9C,GAAI9tB,KAAM4xB,GAGjBA,EAASj6B,QAASm2B,GAAK,OAASR,MAGhCsE,GAAarE,GAAOvtB,KAAM4xB,GAAa,IAAM,KAAQ,KAAOtE,OAK1DmC,EAAE6D,aACDp/B,EAAOw8B,aAAckB,IACzB7C,EAAM0D,iBAAkB,oBAAqBv+B,EAAOw8B,aAAckB,IAE9D19B,EAAOy8B,KAAMiB,IACjB7C,EAAM0D,iBAAkB,gBAAiBv+B,EAAOy8B,KAAMiB,MAKnDnC,EAAEngB,MAAQmgB,EAAE4D,YAAc5D,EAAEuB,eAAgB,GAASp6B,EAAQo6B,cACjEjC,EAAM0D,iBAAkB,eAAgBhD,EAAEuB,aAI3CjC,EAAM0D,iBACL,SACAhD,EAAEZ,UAAW,IAAOY,EAAEzc,QAASyc,EAAEZ,UAAU,IAC1CY,EAAEzc,QAASyc,EAAEZ,UAAU,KAA8B,MAArBY,EAAEZ,UAAW,GAAc,KAAOP,GAAW,WAAa,IAC1FmB,EAAEzc,QAAS,KAIb,KAAMhd,IAAKy5B,GAAE8D,QACZxE,EAAM0D,iBAAkBz8B,EAAGy5B,EAAE8D,QAASv9B,GAIvC,IAAKy5B,EAAE+D,aAAgB/D,EAAE+D,WAAWr+B,KAAM88B,EAAiBlD,EAAOU,MAAQ,GAAmB,IAAVzf,GAElF,MAAO+e,GAAM8D,OAIdN,GAAW,OAGX,KAAMv8B,KAAOg9B,QAAS,EAAGn7B,MAAO,EAAGmxB,SAAU,GAC5C+F,EAAO/4B,GAAKy5B,EAAGz5B,GAOhB,IAHA27B,EAAY7C,GAA+BT,GAAYoB,EAAG74B,EAASm4B,GAK5D,CACNA,EAAM3c,WAAa,EAGd4f,GACJE,EAAmBta,QAAS,YAAcmX,EAAOU,IAG7CA,EAAEsB,OAAStB,EAAE7E,QAAU,IAC3BmH,EAAe1f,WAAW,WACzB0c,EAAM8D,MAAM,YACVpD,EAAE7E,SAGN,KACC5a,EAAQ,EACR2hB,EAAU8B,KAAMpB,EAAgBx2B,GAC/B,MAAQkD,GAET,KAAa,EAARiR,GAIJ,KAAMjR,EAHNlD,GAAM,GAAIkD,QArBZlD,GAAM,GAAI,eA8BX,SAASA,GAAM+2B,EAAQc,EAAkBhE,EAAW6D,GACnD,GAAIpD,GAAW6C,EAASn7B,EAAOq4B,EAAUyD,EACxCb,EAAaY,CAGC,KAAV1jB,IAKLA,EAAQ,EAGH+hB,GACJlH,aAAckH,GAKfJ,EAAYp6B,OAGZs6B,EAAwB0B,GAAW,GAGnCxE,EAAM3c,WAAawgB,EAAS,EAAI,EAAI,EAGpCzC,EAAYyC,GAAU,KAAgB,IAATA,GAA2B,MAAXA,EAGxClD,IACJQ,EAAWV,GAAqBC,EAAGV,EAAOW,IAI3CQ,EAAWD,GAAaR,EAAGS,EAAUnB,EAAOoB,GAGvCA,GAGCV,EAAE6D,aACNK,EAAW5E,EAAMgB,kBAAkB,iBAC9B4D,IACJz/B,EAAOw8B,aAAckB,GAAa+B,GAEnCA,EAAW5E,EAAMgB,kBAAkB,QAC9B4D,IACJz/B,EAAOy8B,KAAMiB,GAAa+B,IAKZ,MAAXf,GAA6B,SAAXnD,EAAEx3B,KACxB66B,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAa5C,EAASlgB,MACtBgjB,EAAU9C,EAAS5gB,KACnBzX,EAAQq4B,EAASr4B,MACjBs4B,GAAat4B,KAIdA,EAAQi7B,GACHF,IAAWE,KACfA,EAAa,QACC,EAATF,IACJA,EAAS,KAMZ7D,EAAM6D,OAASA,EACf7D,EAAM+D,YAAeY,GAAoBZ,GAAe,GAGnD3C,EACJhgB,EAASqB,YAAaygB,GAAmBe,EAASF,EAAY/D,IAE9D5e,EAAS2Y,WAAYmJ,GAAmBlD,EAAO+D,EAAYj7B,IAI5Dk3B,EAAMqD,WAAYA,GAClBA,EAAa76B,OAERy6B,GACJE,EAAmBta,QAASuY,EAAY,cAAgB,aACrDpB,EAAOU,EAAGU,EAAY6C,EAAUn7B,IAIpCs6B,EAAiBviB,SAAUqiB,GAAmBlD,EAAO+D,IAEhDd,IACJE,EAAmBta,QAAS,gBAAkBmX,EAAOU,MAE3Cv7B,EAAOu8B,QAChBv8B,EAAOkiB,MAAMwB,QAAQ,cAKxB,MAAOmX,IAGR6E,QAAS,SAAUhD,EAAKthB,EAAM1Z,GAC7B,MAAO1B,GAAOkB,IAAKw7B,EAAKthB,EAAM1Z,EAAU,SAGzCi+B,UAAW,SAAUjD,EAAKh7B,GACzB,MAAO1B,GAAOkB,IAAKw7B,EAAKr5B,OAAW3B,EAAU,aAI/C1B,EAAOyB,MAAQ,MAAO,QAAU,SAAUK,EAAGi9B,GAC5C/+B,EAAQ++B,GAAW,SAAUrC,EAAKthB,EAAM1Z,EAAUqC,GAQjD,MANK/D,GAAOkD,WAAYkY,KACvBrX,EAAOA,GAAQrC,EACfA,EAAW0Z,EACXA,EAAO/X,QAGDrD,EAAOw9B,MACbd,IAAKA,EACL34B,KAAMg7B,EACNrE,SAAU32B,EACVqX,KAAMA,EACN0jB,QAASp9B,OAMZ1B,EAAOsrB,SAAW,SAAUoR,GAC3B,MAAO18B,GAAOw9B,MACbd,IAAKA,EACL34B,KAAM,MACN22B,SAAU,SACVmC,OAAO,EACPl+B,QAAQ,EACRihC,UAAU,KAKZ5/B,EAAOG,GAAGsC,QACTo9B,QAAS,SAAU7U,GAClB,GAAIX,EAEJ,OAAKrqB,GAAOkD,WAAY8nB,GAChB7rB,KAAKsC,KAAK,SAAUK,GAC1B9B,EAAQb,MAAO0gC,QAAS7U,EAAK/pB,KAAK9B,KAAM2C,OAIrC3C,KAAM,KAGVkrB,EAAOrqB,EAAQgrB,EAAM7rB,KAAM,GAAIoM,eAAgBrJ,GAAI,GAAIa,OAAO,GAEzD5D,KAAM,GAAI6F,YACdqlB,EAAKO,aAAczrB,KAAM,IAG1BkrB,EAAKzoB,IAAI,WACR,GAAIC,GAAO1C,IAEX,OAAQ0C,EAAKi+B,kBACZj+B,EAAOA,EAAKi+B,iBAGb,OAAOj+B,KACL4oB,OAAQtrB,OAGLA,OAGR4gC,UAAW,SAAU/U,GACpB,MACQ7rB,MAAKsC,KADRzB,EAAOkD,WAAY8nB,GACN,SAAUlpB,GAC1B9B,EAAQb,MAAO4gC,UAAW/U,EAAK/pB,KAAK9B,KAAM2C,KAI3B,WAChB,GAAIwW,GAAOtY,EAAQb,MAClB2Z,EAAWR,EAAKQ,UAEZA,GAAS/X,OACb+X,EAAS+mB,QAAS7U,GAGlB1S,EAAKmS,OAAQO,MAKhBX,KAAM,SAAUW,GACf,GAAI9nB,GAAalD,EAAOkD,WAAY8nB,EAEpC,OAAO7rB,MAAKsC,KAAK,SAAUK,GAC1B9B,EAAQb,MAAO0gC,QAAS38B,EAAa8nB,EAAK/pB,KAAK9B,KAAM2C,GAAKkpB,MAI5DgV,OAAQ,WACP,MAAO7gC,MAAK6O,SAASvM,KAAK,WACnBzB,EAAOoF,SAAUjG,KAAM,SAC5Ba,EAAQb,MAAO8rB,YAAa9rB,KAAKyL,cAEhCtI,SAKLtC,EAAOgQ,KAAK4E,QAAQ+a,OAAS,SAAU9tB,GAGtC,MAAOA,GAAK0tB,aAAe,GAAK1tB,EAAK2tB,cAAgB,GAEtDxvB,EAAOgQ,KAAK4E,QAAQqrB,QAAU,SAAUp+B,GACvC,OAAQ7B,EAAOgQ,KAAK4E,QAAQ+a,OAAQ9tB,GAMrC,IAAIq+B,IAAM,OACTC,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,oCAEhB,SAASC,IAAazP,EAAQhtB,EAAKo7B,EAAavlB,GAC/C,GAAIhX,EAEJ,IAAK3C,EAAOoD,QAASU,GAEpB9D,EAAOyB,KAAMqC,EAAK,SAAUhC,EAAG0+B,GACzBtB,GAAeiB,GAASr0B,KAAMglB,GAElCnX,EAAKmX,EAAQ0P,GAIbD,GAAazP,EAAS,KAAqB,gBAAN0P,GAAiB1+B,EAAI,IAAO,IAAK0+B,EAAGtB,EAAavlB,SAIlF,IAAMulB,GAAsC,WAAvBl/B,EAAO+D,KAAMD,GAQxC6V,EAAKmX,EAAQhtB,OANb,KAAMnB,IAAQmB,GACby8B,GAAazP,EAAS,IAAMnuB,EAAO,IAAKmB,EAAKnB,GAAQu8B,EAAavlB,GAWrE3Z,EAAOi/B,MAAQ,SAAUh3B,EAAGi3B,GAC3B,GAAIpO,GACHyK,KACA5hB,EAAM,SAAUlN,EAAKnH,GAEpBA,EAAQtF,EAAOkD,WAAYoC,GAAUA,IAAqB,MAATA,EAAgB,GAAKA,EACtEi2B,EAAGA,EAAEx6B,QAAW0/B,mBAAoBh0B,GAAQ,IAAMg0B,mBAAoBn7B,GASxE,IALqBjC,SAAhB67B,IACJA,EAAcl/B,EAAOq7B,cAAgBr7B,EAAOq7B,aAAa6D,aAIrDl/B,EAAOoD,QAAS6E,IAASA,EAAEpH,SAAWb,EAAOmD,cAAe8E,GAEhEjI,EAAOyB,KAAMwG,EAAG,WACf0R,EAAKxa,KAAKwD,KAAMxD,KAAKmG,aAMtB,KAAMwrB,IAAU7oB,GACfs4B,GAAazP,EAAQ7oB,EAAG6oB,GAAUoO,EAAavlB,EAKjD,OAAO4hB,GAAEpvB,KAAM,KAAM1I,QAASy8B,GAAK,MAGpClgC,EAAOG,GAAGsC,QACTi+B,UAAW,WACV,MAAO1gC,GAAOi/B,MAAO9/B,KAAKwhC,mBAE3BA,eAAgB,WACf,MAAOxhC,MAAKyC,IAAI,WAEf,GAAIqO,GAAWjQ,EAAOmf,KAAMhgB,KAAM,WAClC,OAAO8Q,GAAWjQ,EAAOwF,UAAWyK,GAAa9Q,OAEjDwP,OAAO,WACP,GAAI5K,GAAO5E,KAAK4E,IAGhB,OAAO5E,MAAKwD,OAAS3C,EAAQb,MAAOoZ,GAAI,cACvC+nB,GAAax0B,KAAM3M,KAAKiG,YAAei7B,GAAgBv0B,KAAM/H,KAC3D5E,KAAKwU,UAAYuN,EAAepV,KAAM/H,MAEzCnC,IAAI,SAAUE,EAAGD,GACjB,GAAIsO,GAAMnQ,EAAQb,MAAOgR,KAEzB,OAAc,OAAPA,EACN,KACAnQ,EAAOoD,QAAS+M,GACfnQ,EAAO4B,IAAKuO,EAAK,SAAUA,GAC1B,OAASxN,KAAMd,EAAKc,KAAM2C,MAAO6K,EAAI1M,QAAS28B,GAAO,YAEpDz9B,KAAMd,EAAKc,KAAM2C,MAAO6K,EAAI1M,QAAS28B,GAAO,WAC9Cl/B,SAKLlB,EAAOq7B,aAAauF,IAAM,WACzB,IACC,MAAO,IAAIC,gBACV,MAAOh2B,KAGV,IAAIi2B,IAAQ,EACXC,MACAC,IAEC,EAAG,IAGHC,KAAM,KAEPC,GAAelhC,EAAOq7B,aAAauF,KAK/B1hC,GAAOmP,aACXnP,EAAOmP,YAAa,WAAY,WAC/B,IAAM,GAAI5B,KAAOs0B,IAChBA,GAAct0B,OAKjB3M,EAAQqhC,OAASD,IAAkB,mBAAqBA,IACxDphC,EAAQ09B,KAAO0D,KAAiBA,GAEhClhC,EAAOu9B,cAAc,SAAU76B,GAC9B,GAAIhB,EAGJ,OAAK5B,GAAQqhC,MAAQD,KAAiBx+B,EAAQs8B,aAE5CO,KAAM,SAAUF,EAASvK,GACxB,GAAIhzB,GACH8+B,EAAMl+B,EAAQk+B,MACdl1B,IAAOo1B,EAKR,IAHAF,EAAIQ,KAAM1+B,EAAQqB,KAAMrB,EAAQg6B,IAAKh6B,EAAQm6B,MAAOn6B,EAAQ2+B,SAAU3+B,EAAQ8R,UAGzE9R,EAAQ4+B,UACZ,IAAMx/B,IAAKY,GAAQ4+B,UAClBV,EAAK9+B,GAAMY,EAAQ4+B,UAAWx/B,EAK3BY,GAAQk5B,UAAYgF,EAAInC,kBAC5BmC,EAAInC,iBAAkB/7B,EAAQk5B,UAQzBl5B,EAAQs8B,aAAgBK,EAAQ,sBACrCA,EAAQ,oBAAsB,iBAI/B,KAAMv9B,IAAKu9B,GACVuB,EAAIrC,iBAAkBz8B,EAAGu9B,EAASv9B,GAInCJ,GAAW,SAAUqC,GACpB,MAAO,YACDrC,UACGq/B,IAAcr1B,GACrBhK,EAAWk/B,EAAIW,OAASX,EAAIY,QAAU,KAExB,UAATz9B,EACJ68B,EAAIjC,QACgB,UAAT56B,EACX+wB,EAEC8L,EAAIlC,OACJkC,EAAIhC,YAGL9J,EACCkM,GAAkBJ,EAAIlC,SAAYkC,EAAIlC,OACtCkC,EAAIhC,WAIwB,gBAArBgC,GAAIa,cACV58B,KAAM+7B,EAAIa,cACPp+B,OACJu9B,EAAItC,4BAQTsC,EAAIW,OAAS7/B,IACbk/B,EAAIY,QAAU9/B,EAAS,SAGvBA,EAAWq/B,GAAcr1B,GAAOhK,EAAS,QAEzC,KAECk/B,EAAIrB,KAAM78B,EAAQy8B,YAAcz8B,EAAQ0Y,MAAQ,MAC/C,MAAQvQ,GAET,GAAKnJ,EACJ,KAAMmJ,KAKT8zB,MAAO,WACDj9B,GACJA,MAvFJ,SAkGD1B,EAAOo9B,WACNte,SACCta,OAAQ,6FAETsU,UACCtU,OAAQ,uBAETs3B,YACC4F,cAAe,SAAU78B,GAExB,MADA7E,GAAOsE,WAAYO,GACZA,MAMV7E,EAAOs9B,cAAe,SAAU,SAAU/B,GACxBl4B,SAAZk4B,EAAE/uB,QACN+uB,EAAE/uB,OAAQ,GAEN+uB,EAAEyD,cACNzD,EAAEx3B,KAAO,SAKX/D,EAAOu9B,cAAe,SAAU,SAAUhC,GAEzC,GAAKA,EAAEyD,YAAc,CACpB,GAAIx6B,GAAQ9C,CACZ,QACC69B,KAAM,SAAUl1B,EAAGyqB,GAClBtwB,EAASxE,EAAO,YAAYmf,MAC3B0d,OAAO,EACP8E,QAASpG,EAAEqG,cACXh/B,IAAK24B,EAAEmB,MACLlV,GACF,aACA9lB,EAAW,SAAUmgC,GACpBr9B,EAAO+W,SACP7Z,EAAW,KACNmgC,GACJ/M,EAAuB,UAAb+M,EAAI99B,KAAmB,IAAM,IAAK89B,EAAI99B,QAInDhF,EAAS+F,KAAKC,YAAaP,EAAQ,KAEpCm6B,MAAO,WACDj9B,GACJA,QAUL,IAAIogC,OACHC,GAAS,mBAGV/hC,GAAOo9B,WACN4E,MAAO,WACPC,cAAe,WACd,GAAIvgC,GAAWogC,GAAa15B,OAAWpI,EAAOsD,QAAU,IAAQ81B,IAEhE,OADAj6B,MAAMuC,IAAa,EACZA,KAKT1B,EAAOs9B,cAAe,aAAc,SAAU/B,EAAG2G,EAAkBrH,GAElE,GAAIsH,GAAcC,EAAaC,EAC9BC,EAAW/G,EAAEyG,SAAU,IAAWD,GAAOj2B,KAAMyvB,EAAEmB,KAChD,MACkB,gBAAXnB,GAAEngB,QAAwBmgB,EAAEuB,aAAe,IAAKr9B,QAAQ,sCAAwCsiC,GAAOj2B,KAAMyvB,EAAEngB,OAAU,OAIlI,OAAKknB,IAAiC,UAArB/G,EAAEZ,UAAW,IAG7BwH,EAAe5G,EAAE0G,cAAgBjiC,EAAOkD,WAAYq4B,EAAE0G,eACrD1G,EAAE0G,gBACF1G,EAAE0G,cAGEK,EACJ/G,EAAG+G,GAAa/G,EAAG+G,GAAW7+B,QAASs+B,GAAQ,KAAOI,GAC3C5G,EAAEyG,SAAU,IACvBzG,EAAEmB,MAASrD,GAAOvtB,KAAMyvB,EAAEmB,KAAQ,IAAM,KAAQnB,EAAEyG,MAAQ,IAAMG,GAIjE5G,EAAEO,WAAW,eAAiB,WAI7B,MAHMuG,IACLriC,EAAO2D,MAAOw+B,EAAe,mBAEvBE,EAAmB,IAI3B9G,EAAEZ,UAAW,GAAM,OAGnByH,EAAcljC,EAAQijC,GACtBjjC,EAAQijC,GAAiB,WACxBE,EAAoBrgC,WAIrB64B,EAAM7e,OAAO,WAEZ9c,EAAQijC,GAAiBC,EAGpB7G,EAAG4G,KAEP5G,EAAE0G,cAAgBC,EAAiBD,cAGnCH,GAAatiC,KAAM2iC,IAIfE,GAAqBriC,EAAOkD,WAAYk/B,IAC5CA,EAAaC,EAAmB,IAGjCA,EAAoBD,EAAc/+B,SAI5B,UAtDR,SAgEDrD,EAAOyY,UAAY,SAAU2C,EAAMlb,EAASqiC,GAC3C,IAAMnnB,GAAwB,gBAATA,GACpB,MAAO,KAEgB,kBAAZlb,KACXqiC,EAAcriC,EACdA,GAAU,GAEXA,EAAUA,GAAWnB,CAErB,IAAIyjC,GAAStqB,EAAW1M,KAAM4P,GAC7B+O,GAAWoY,KAGZ,OAAKC,IACKtiC,EAAQ0E,cAAe49B,EAAO,MAGxCA,EAASxiC,EAAOkqB,eAAiB9O,GAAQlb,EAASiqB,GAE7CA,GAAWA,EAAQppB,QACvBf,EAAQmqB,GAAU5O,SAGZvb,EAAOuB,SAAWihC,EAAO53B,aAKjC,IAAI63B,IAAQziC,EAAOG,GAAGkmB,IAKtBrmB,GAAOG,GAAGkmB,KAAO,SAAUqW,EAAKgG,EAAQhhC,GACvC,GAAoB,gBAARg7B,IAAoB+F,GAC/B,MAAOA,IAAM1gC,MAAO5C,KAAM6C,UAG3B,IAAI/B,GAAU8D,EAAMi4B,EACnB1jB,EAAOnZ,KACP4e,EAAM2e,EAAIj9B,QAAQ,IA+CnB,OA7CKse,IAAO,IACX9d,EAAWD,EAAO2E,KAAM+3B,EAAIp9B,MAAOye,IACnC2e,EAAMA,EAAIp9B,MAAO,EAAGye,IAIhB/d,EAAOkD,WAAYw/B,IAGvBhhC,EAAWghC,EACXA,EAASr/B,QAGEq/B,GAA4B,gBAAXA,KAC5B3+B,EAAO,QAIHuU,EAAKvX,OAAS,GAClBf,EAAOw9B,MACNd,IAAKA,EAGL34B,KAAMA,EACN22B,SAAU,OACVtf,KAAMsnB,IACJ/6B,KAAK,SAAU85B,GAGjBzF,EAAWh6B,UAEXsW,EAAK0S,KAAM/qB,EAIVD,EAAO,SAASyqB,OAAQzqB,EAAOyY,UAAWgpB,IAAiB/yB,KAAMzO,GAGjEwhC,KAEC3M,SAAUpzB,GAAY,SAAUm5B,EAAO6D,GACzCpmB,EAAK7W,KAAMC,EAAUs6B,IAAcnB,EAAM4G,aAAc/C,EAAQ7D,MAI1D17B,MAORa,EAAOyB,MAAQ,YAAa,WAAY,eAAgB,YAAa,cAAe,YAAc,SAAUK,EAAGiC,GAC9G/D,EAAOG,GAAI4D,GAAS,SAAU5D,GAC7B,MAAOhB,MAAKqoB,GAAIzjB,EAAM5D,MAOxBH,EAAOgQ,KAAK4E,QAAQ+tB,SAAW,SAAU9gC,GACxC,MAAO7B,GAAO6F,KAAK7F,EAAO21B,OAAQ,SAAUx1B,GAC3C,MAAO0B,KAAS1B,EAAG0B,OACjBd,OAMJ,IAAIqG,IAAUlI,EAAOH,SAAS8O,eAK9B,SAAS+0B,IAAW/gC,GACnB,MAAO7B,GAAOiE,SAAUpC,GAASA,EAAyB,IAAlBA,EAAKuC,UAAkBvC,EAAKqM,YAGrElO,EAAO6iC,QACNC,UAAW,SAAUjhC,EAAMa,EAASZ,GACnC,GAAIihC,GAAaC,EAASC,EAAWC,EAAQC,EAAWC,EAAYC,EACnEhV,EAAWruB,EAAOihB,IAAKpf,EAAM,YAC7ByhC,EAAUtjC,EAAQ6B,GAClBojB,IAGiB,YAAboJ,IACJxsB,EAAKkqB,MAAMsC,SAAW,YAGvB8U,EAAYG,EAAQT,SACpBI,EAAYjjC,EAAOihB,IAAKpf,EAAM,OAC9BuhC,EAAapjC,EAAOihB,IAAKpf,EAAM,QAC/BwhC,GAAmC,aAAbhV,GAAwC,UAAbA,KAC9C4U,EAAYG,GAAa3jC,QAAQ,QAAU,GAIzC4jC,GACJN,EAAcO,EAAQjV,WACtB6U,EAASH,EAAY50B,IACrB60B,EAAUD,EAAYQ,OAGtBL,EAAS/+B,WAAY8+B,IAAe,EACpCD,EAAU7+B,WAAYi/B,IAAgB,GAGlCpjC,EAAOkD,WAAYR,KACvBA,EAAUA,EAAQzB,KAAMY,EAAMC,EAAGqhC,IAGd,MAAfzgC,EAAQyL,MACZ8W,EAAM9W,IAAQzL,EAAQyL,IAAMg1B,EAAUh1B,IAAQ+0B,GAE1B,MAAhBxgC,EAAQ6gC,OACZte,EAAMse,KAAS7gC,EAAQ6gC,KAAOJ,EAAUI,KAASP,GAG7C,SAAWtgC,GACfA,EAAQ8gC,MAAMviC,KAAMY,EAAMojB,GAG1Bqe,EAAQriB,IAAKgE,KAKhBjlB,EAAOG,GAAGsC,QACTogC,OAAQ,SAAUngC,GACjB,GAAKV,UAAUjB,OACd,MAAmBsC,UAAZX,EACNvD,KACAA,KAAKsC,KAAK,SAAUK,GACnB9B,EAAO6iC,OAAOC,UAAW3jC,KAAMuD,EAASZ,IAI3C,IAAIsF,GAASq8B,EACZ5hC,EAAO1C,KAAM,GACbukC,GAAQv1B,IAAK,EAAGo1B,KAAM,GACtBt1B,EAAMpM,GAAQA,EAAK0J,aAEpB,IAAM0C,EAON,MAHA7G,GAAU6G,EAAIJ,gBAGR7N,EAAOwH,SAAUJ,EAASvF,UAMpBA,GAAK8hC,wBAA0BniB,IAC1CkiB,EAAM7hC,EAAK8hC,yBAEZF,EAAMb,GAAW30B,IAEhBE,IAAKu1B,EAAIv1B,IAAMs1B,EAAIG,YAAcx8B,EAAQ8e,UACzCqd,KAAMG,EAAIH,KAAOE,EAAII,YAAcz8B,EAAQ0e,aAXpC4d,GAeTrV,SAAU,WACT,GAAMlvB,KAAM,GAAZ,CAIA,GAAI2kC,GAAcjB,EACjBhhC,EAAO1C,KAAM,GACb4kC,GAAiB51B,IAAK,EAAGo1B,KAAM,EAuBhC,OApBwC,UAAnCvjC,EAAOihB,IAAKpf,EAAM,YAEtBghC,EAAShhC,EAAK8hC,yBAIdG,EAAe3kC,KAAK2kC,eAGpBjB,EAAS1jC,KAAK0jC,SACR7iC,EAAOoF,SAAU0+B,EAAc,GAAK,UACzCC,EAAeD,EAAajB,UAI7BkB,EAAa51B,KAAOnO,EAAOihB,IAAK6iB,EAAc,GAAK,kBAAkB,GACrEC,EAAaR,MAAQvjC,EAAOihB,IAAK6iB,EAAc,GAAK,mBAAmB,KAKvE31B,IAAK00B,EAAO10B,IAAM41B,EAAa51B,IAAMnO,EAAOihB,IAAKpf,EAAM,aAAa,GACpE0hC,KAAMV,EAAOU,KAAOQ,EAAaR,KAAOvjC,EAAOihB,IAAKpf,EAAM,cAAc,MAI1EiiC,aAAc,WACb,MAAO3kC,MAAKyC,IAAI,WACf,GAAIkiC,GAAe3kC,KAAK2kC,cAAgB18B,EAExC,OAAQ08B,IAAmB9jC,EAAOoF,SAAU0+B,EAAc,SAAuD,WAA3C9jC,EAAOihB,IAAK6iB,EAAc,YAC/FA,EAAeA,EAAaA,YAG7B,OAAOA,IAAgB18B,QAM1BpH,EAAOyB,MAAQokB,WAAY,cAAeI,UAAW,eAAiB,SAAU8Y,EAAQ5f,GACvF,GAAIhR,GAAM,gBAAkBgR,CAE5Bnf,GAAOG,GAAI4+B,GAAW,SAAU5uB,GAC/B,MAAOiO,GAAQjf,KAAM,SAAU0C,EAAMk9B,EAAQ5uB,GAC5C,GAAIszB,GAAMb,GAAW/gC,EAErB,OAAawB,UAAR8M,EACGszB,EAAMA,EAAKtkB,GAAStd,EAAMk9B,QAG7B0E,EACJA,EAAIO,SACF71B,EAAYjP,EAAO2kC,YAAb1zB,EACPhC,EAAMgC,EAAMjR,EAAO0kC,aAIpB/hC,EAAMk9B,GAAW5uB,IAEhB4uB,EAAQ5uB,EAAKnO,UAAUjB,OAAQ,SAUpCf,EAAOyB,MAAQ,MAAO,QAAU,SAAUK,EAAGqd,GAC5Cnf,EAAO4vB,SAAUzQ,GAAS6N,GAAcltB,EAAQ6tB,cAC/C,SAAU9rB,EAAM8qB,GACf,MAAKA,IACJA,EAAWD,GAAQ7qB,EAAMsd,GAElBmN,GAAUxgB,KAAM6gB,GACtB3sB,EAAQ6B,GAAOwsB,WAAYlP,GAAS,KACpCwN,GALF,WAaH3sB,EAAOyB,MAAQwiC,OAAQ,SAAUC,MAAO,SAAW,SAAUvhC,EAAMoB,GAClE/D,EAAOyB,MAAQmvB,QAAS,QAAUjuB,EAAMqmB,QAASjlB,EAAM,GAAI,QAAUpB,GAAQ,SAAUwhC,EAAcC,GAEpGpkC,EAAOG,GAAIikC,GAAa,SAAUzT,EAAQrrB,GACzC,GAAI+Y,GAAYrc,UAAUjB,SAAYojC,GAAkC,iBAAXxT,IAC5DzB,EAAQiV,IAAkBxT,KAAW,GAAQrrB,KAAU,EAAO,SAAW,SAE1E,OAAO8Y,GAAQjf,KAAM,SAAU0C,EAAMkC,EAAMuB,GAC1C,GAAI2I,EAEJ,OAAKjO,GAAOiE,SAAUpC,GAIdA,EAAK9C,SAAS8O,gBAAiB,SAAWlL,GAI3B,IAAlBd,EAAKuC,UACT6J,EAAMpM,EAAKgM,gBAIJtK,KAAKyrB,IACXntB,EAAK6jB,KAAM,SAAW/iB,GAAQsL,EAAK,SAAWtL,GAC9Cd,EAAK6jB,KAAM,SAAW/iB,GAAQsL,EAAK,SAAWtL,GAC9CsL,EAAK,SAAWtL,KAIDU,SAAViC,EAENtF,EAAOihB,IAAKpf,EAAMkC,EAAMmrB,GAGxBlvB,EAAO+rB,MAAOlqB,EAAMkC,EAAMuB,EAAO4pB,IAChCnrB,EAAMsa,EAAYsS,EAASttB,OAAWgb,EAAW,WAOvDre,EAAOG,GAAGkkC,KAAO,WAChB,MAAOllC,MAAK4B,QAGbf,EAAOG,GAAGmkC,QAAUtkC,EAAOG,GAAGyZ,QAkBP,kBAAX2qB,SAAyBA,OAAOC,KAC3CD,OAAQ,YAAc,WACrB,MAAOvkC,IAOT,IAECykC,IAAUvlC,EAAOc,OAGjB0kC,GAAKxlC,EAAOylC,CAwBb,OAtBA3kC,GAAO4kC,WAAa,SAAU3hC,GAS7B,MARK/D,GAAOylC,IAAM3kC,IACjBd,EAAOylC,EAAID,IAGPzhC,GAAQ/D,EAAOc,SAAWA,IAC9Bd,EAAOc,OAASykC,IAGVzkC,SAMIZ,KAAaoiB,IACxBtiB,EAAOc,OAASd,EAAOylC,EAAI3kC,GAMrBA"}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/jquery.sparkline 2.1.2.js b/management/guns-admin/src/main/webapp/static/js/jquery.sparkline 2.1.2.js
new file mode 100644
index 0000000..28542b0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/jquery.sparkline 2.1.2.js
@@ -0,0 +1,5 @@
+/* jquery.sparkline 2.1.2 - http://omnipotent.net/jquery.sparkline/
+** Licensed under the New BSD License - see above site for details */
+
+(function(a,b,c){(function(a){typeof define=="function"&&define.amd?define(["jquery"],a):jQuery&&!jQuery.fn.sparkline&&a(jQuery)})(function(d){"use strict";var e={},f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L=0;f=function(){return{common:{type:"line",lineColor:"#00f",fillColor:"#cdf",defaultPixelsPerValue:3,width:"auto",height:"auto",composite:!1,tagValuesAttribute:"values",tagOptionsPrefix:"spark",enableTagOptions:!1,enableHighlight:!0,highlightLighten:1.4,tooltipSkipNull:!0,tooltipPrefix:"",tooltipSuffix:"",disableHiddenCheck:!1,numberFormatter:!1,numberDigitGroupCount:3,numberDigitGroupSep:",",numberDecimalMark:".",disableTooltips:!1,disableInteraction:!1},line:{spotColor:"#f80",highlightSpotColor:"#5f5",highlightLineColor:"#f22",spotRadius:1.5,minSpotColor:"#f80",maxSpotColor:"#f80",lineWidth:1,normalRangeMin:c,normalRangeMax:c,normalRangeColor:"#ccc",drawNormalOnTop:!1,chartRangeMin:c,chartRangeMax:c,chartRangeMinX:c,chartRangeMaxX:c,tooltipFormat:new h('<span style="color: {{color}}">&#9679;</span> {{prefix}}{{y}}{{suffix}}')},bar:{barColor:"#3366cc",negBarColor:"#f44",stackedBarColor:["#3366cc","#dc3912","#ff9900","#109618","#66aa00","#dd4477","#0099c6","#990099"],zeroColor:c,nullColor:c,zeroAxis:!0,barWidth:4,barSpacing:1,chartRangeMax:c,chartRangeMin:c,chartRangeClip:!1,colorMap:c,tooltipFormat:new h('<span style="color: {{color}}">&#9679;</span> {{prefix}}{{value}}{{suffix}}')},tristate:{barWidth:4,barSpacing:1,posBarColor:"#6f6",negBarColor:"#f44",zeroBarColor:"#999",colorMap:{},tooltipFormat:new h('<span style="color: {{color}}">&#9679;</span> {{value:map}}'),tooltipValueLookups:{map:{"-1":"Loss",0:"Draw",1:"Win"}}},discrete:{lineHeight:"auto",thresholdColor:c,thresholdValue:0,chartRangeMax:c,chartRangeMin:c,chartRangeClip:!1,tooltipFormat:new h("{{prefix}}{{value}}{{suffix}}")},bullet:{targetColor:"#f33",targetWidth:3,performanceColor:"#33f",rangeColors:["#d3dafe","#a8b6ff","#7f94ff"],base:c,tooltipFormat:new h("{{fieldkey:fields}} - {{value}}"),tooltipValueLookups:{fields:{r:"Range",p:"Performance",t:"Target"}}},pie:{offset:0,sliceColors:["#3366cc","#dc3912","#ff9900","#109618","#66aa00","#dd4477","#0099c6","#990099"],borderWidth:0,borderColor:"#000",tooltipFormat:new h('<span style="color: {{color}}">&#9679;</span> {{value}} ({{percent.1}}%)')},box:{raw:!1,boxLineColor:"#000",boxFillColor:"#cdf",whiskerColor:"#000",outlierLineColor:"#333",outlierFillColor:"#fff",medianColor:"#f00",showOutliers:!0,outlierIQR:1.5,spotRadius:1.5,target:c,targetColor:"#4a2",chartRangeMax:c,chartRangeMin:c,tooltipFormat:new h("{{field:fields}}: {{value}}"),tooltipFormatFieldlistKey:"field",tooltipValueLookups:{fields:{lq:"Lower Quartile",med:"Median",uq:"Upper Quartile",lo:"Left Outlier",ro:"Right Outlier",lw:"Left Whisker",rw:"Right Whisker"}}}}},E='.jqstooltip { position: absolute;left: 0px;top: 0px;visibility: hidden;background: rgb(0, 0, 0) transparent;background-color: rgba(0,0,0,0.6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";color: white;font: 10px arial, san serif;text-align: left;white-space: nowrap;padding: 5px;border: 1px solid white;z-index: 10000;}.jqsfield { color: white;font: 10px arial, san serif;text-align: left;}',g=function(){var a,b;return a=function(){this.init.apply(this,arguments)},arguments.length>1?(arguments[0]?(a.prototype=d.extend(new arguments[0],arguments[arguments.length-1]),a._super=arguments[0].prototype):a.prototype=arguments[arguments.length-1],arguments.length>2&&(b=Array.prototype.slice.call(arguments,1,-1),b.unshift(a.prototype),d.extend.apply(d,b))):a.prototype=arguments[0],a.prototype.cls=a,a},d.SPFormatClass=h=g({fre:/\{\{([\w.]+?)(:(.+?))?\}\}/g,precre:/(\w+)\.(\d+)/,init:function(a,b){this.format=a,this.fclass=b},render:function(a,b,d){var e=this,f=a,g,h,i,j,k;return this.format.replace(this.fre,function(){var a;return h=arguments[1],i=arguments[3],g=e.precre.exec(h),g?(k=g[2],h=g[1]):k=!1,j=f[h],j===c?"":i&&b&&b[i]?(a=b[i],a.get?b[i].get(j)||j:b[i][j]||j):(n(j)&&(d.get("numberFormatter")?j=d.get("numberFormatter")(j):j=s(j,k,d.get("numberDigitGroupCount"),d.get("numberDigitGroupSep"),d.get("numberDecimalMark"))),j)})}}),d.spformat=function(a,b){return new h(a,b)},i=function(a,b,c){return a<b?b:a>c?c:a},j=function(a,c){var d;return c===2?(d=b.floor(a.length/2),a.length%2?a[d]:(a[d-1]+a[d])/2):a.length%2?(d=(a.length*c+c)/4,d%1?(a[b.floor(d)]+a[b.floor(d)-1])/2:a[d-1]):(d=(a.length*c+2)/4,d%1?(a[b.floor(d)]+a[b.floor(d)-1])/2:a[d-1])},k=function(a){var b;switch(a){case"undefined":a=c;break;case"null":a=null;break;case"true":a=!0;break;case"false":a=!1;break;default:b=parseFloat(a),a==b&&(a=b)}return a},l=function(a){var b,c=[];for(b=a.length;b--;)c[b]=k(a[b]);return c},m=function(a,b){var c,d,e=[];for(c=0,d=a.length;c<d;c++)a[c]!==b&&e.push(a[c]);return e},n=function(a){return!isNaN(parseFloat(a))&&isFinite(a)},s=function(a,b,c,e,f){var g,h;a=(b===!1?parseFloat(a).toString():a.toFixed(b)).split(""),g=(g=d.inArray(".",a))<0?a.length:g,g<a.length&&(a[g]=f);for(h=g-c;h>0;h-=c)a.splice(h,0,e);return a.join("")},o=function(a,b,c){var d;for(d=b.length;d--;){if(c&&b[d]===null)continue;if(b[d]!==a)return!1}return!0},p=function(a){var b=0,c;for(c=a.length;c--;)b+=typeof a[c]=="number"?a[c]:0;return b},r=function(a){return d.isArray(a)?a:[a]},q=function(b){var c;a.createStyleSheet?a.createStyleSheet().cssText=b:(c=a.createElement("style"),c.type="text/css",a.getElementsByTagName("head")[0].appendChild(c),c[typeof a.body.style.WebkitAppearance=="string"?"innerText":"innerHTML"]=b)},d.fn.simpledraw=function(b,e,f,g){var h,i;if(f&&(h=this.data("_jqs_vcanvas")))return h;if(d.fn.sparkline.canvas===!1)return!1;if(d.fn.sparkline.canvas===c){var j=a.createElement("canvas");if(!j.getContext||!j.getContext("2d")){if(!a.namespaces||!!a.namespaces.v)return d.fn.sparkline.canvas=!1,!1;a.namespaces.add("v","urn:schemas-microsoft-com:vml","#default#VML"),d.fn.sparkline.canvas=function(a,b,c,d){return new J(a,b,c)}}else d.fn.sparkline.canvas=function(a,b,c,d){return new I(a,b,c,d)}}return b===c&&(b=d(this).innerWidth()),e===c&&(e=d(this).innerHeight()),h=d.fn.sparkline.canvas(b,e,this,g),i=d(this).data("_jqs_mhandler"),i&&i.registerCanvas(h),h},d.fn.cleardraw=function(){var a=this.data("_jqs_vcanvas");a&&a.reset()},d.RangeMapClass=t=g({init:function(a){var b,c,d=[];for(b in a)a.hasOwnProperty(b)&&typeof b=="string"&&b.indexOf(":")>-1&&(c=b.split(":"),c[0]=c[0].length===0?-Infinity:parseFloat(c[0]),c[1]=c[1].length===0?Infinity:parseFloat(c[1]),c[2]=a[b],d.push(c));this.map=a,this.rangelist=d||!1},get:function(a){var b=this.rangelist,d,e,f;if((f=this.map[a])!==c)return f;if(b)for(d=b.length;d--;){e=b[d];if(e[0]<=a&&e[1]>=a)return e[2]}return c}}),d.range_map=function(a){return new t(a)},u=g({init:function(a,b){var c=d(a);this.$el=c,this.options=b,this.currentPageX=0,this.currentPageY=0,this.el=a,this.splist=[],this.tooltip=null,this.over=!1,this.displayTooltips=!b.get("disableTooltips"),this.highlightEnabled=!b.get("disableHighlight")},registerSparkline:function(a){this.splist.push(a),this.over&&this.updateDisplay()},registerCanvas:function(a){var b=d(a.canvas);this.canvas=a,this.$canvas=b,b.mouseenter(d.proxy(this.mouseenter,this)),b.mouseleave(d.proxy(this.mouseleave,this)),b.click(d.proxy(this.mouseclick,this))},reset:function(a){this.splist=[],this.tooltip&&a&&(this.tooltip.remove(),this.tooltip=c)},mouseclick:function(a){var b=d.Event("sparklineClick");b.originalEvent=a,b.sparklines=this.splist,this.$el.trigger(b)},mouseenter:function(b){d(a.body).unbind("mousemove.jqs"),d(a.body).bind("mousemove.jqs",d.proxy(this.mousemove,this)),this.over=!0,this.currentPageX=b.pageX,this.currentPageY=b.pageY,this.currentEl=b.target,!this.tooltip&&this.displayTooltips&&(this.tooltip=new v(this.options),this.tooltip.updatePosition(b.pageX,b.pageY)),this.updateDisplay()},mouseleave:function(){d(a.body).unbind("mousemove.jqs");var b=this.splist,c=b.length,e=!1,f,g;this.over=!1,this.currentEl=null,this.tooltip&&(this.tooltip.remove(),this.tooltip=null);for(g=0;g<c;g++)f=b[g],f.clearRegionHighlight()&&(e=!0);e&&this.canvas.render()},mousemove:function(a){this.currentPageX=a.pageX,this.currentPageY=a.pageY,this.currentEl=a.target,this.tooltip&&this.tooltip.updatePosition(a.pageX,a.pageY),this.updateDisplay()},updateDisplay:function(){var a=this.splist,b=a.length,c=!1,e=this.$canvas.offset(),f=this.currentPageX-e.left,g=this.currentPageY-e.top,h,i,j,k,l;if(!this.over)return;for(j=0;j<b;j++)i=a[j],k=i.setRegionHighlight(this.currentEl,f,g),k&&(c=!0);if(c){l=d.Event("sparklineRegionChange"),l.sparklines=this.splist,this.$el.trigger(l);if(this.tooltip){h="";for(j=0;j<b;j++)i=a[j],h+=i.getCurrentRegionTooltip();this.tooltip.setContent(h)}this.disableHighlight||this.canvas.render()}k===null&&this.mouseleave()}}),v=g({sizeStyle:"position: static !important;display: block !important;visibility: hidden !important;float: left !important;",init:function(b){var c=b.get("tooltipClassname","jqstooltip"),e=this.sizeStyle,f;this.container=b.get("tooltipContainer")||a.body,this.tooltipOffsetX=b.get("tooltipOffsetX",10),this.tooltipOffsetY=b.get("tooltipOffsetY",12),d("#jqssizetip").remove(),d("#jqstooltip").remove(),this.sizetip=d("<div/>",{id:"jqssizetip",style:e,"class":c}),this.tooltip=d("<div/>",{id:"jqstooltip","class":c}).appendTo(this.container),f=this.tooltip.offset(),this.offsetLeft=f.left,this.offsetTop=f.top,this.hidden=!0,d(window).unbind("resize.jqs scroll.jqs"),d(window).bind("resize.jqs scroll.jqs",d.proxy(this.updateWindowDims,this)),this.updateWindowDims()},updateWindowDims:function(){this.scrollTop=d(window).scrollTop(),this.scrollLeft=d(window).scrollLeft(),this.scrollRight=this.scrollLeft+d(window).width(),this.updatePosition()},getSize:function(a){this.sizetip.html(a).appendTo(this.container),this.width=this.sizetip.width()+1,this.height=this.sizetip.height(),this.sizetip.remove()},setContent:function(a){if(!a){this.tooltip.css("visibility","hidden"),this.hidden=!0;return}this.getSize(a),this.tooltip.html(a).css({width:this.width,height:this.height,visibility:"visible"}),this.hidden&&(this.hidden=!1,this.updatePosition())},updatePosition:function(a,b){if(a===c){if(this.mousex===c)return;a=this.mousex-this.offsetLeft,b=this.mousey-this.offsetTop}else this.mousex=a-=this.offsetLeft,this.mousey=b-=this.offsetTop;if(!this.height||!this.width||this.hidden)return;b-=this.height+this.tooltipOffsetY,a+=this.tooltipOffsetX,b<this.scrollTop&&(b=this.scrollTop),a<this.scrollLeft?a=this.scrollLeft:a+this.width>this.scrollRight&&(a=this.scrollRight-this.width),this.tooltip.css({left:a,top:b})},remove:function(){this.tooltip.remove(),this.sizetip.remove(),this.sizetip=this.tooltip=c,d(window).unbind("resize.jqs scroll.jqs")}}),F=function(){q(E)},d(F),K=[],d.fn.sparkline=function(b,e){return this.each(function(){var f=new d.fn.sparkline.options(this,e),g=d(this),h,i;h=function(){var e,h,i,j,k,l,m;if(b==="html"||b===c){m=this.getAttribute(f.get("tagValuesAttribute"));if(m===c||m===null)m=g.html();e=m.replace(/(^\s*<!--)|(-->\s*$)|\s+/g,"").split(",")}else e=b;h=f.get("width")==="auto"?e.length*f.get("defaultPixelsPerValue"):f.get("width");if(f.get("height")==="auto"){if(!f.get("composite")||!d.data(this,"_jqs_vcanvas"))j=a.createElement("span"),j.innerHTML="a",g.html(j),i=d(j).innerHeight()||d(j).height(),d(j).remove(),j=null}else i=f.get("height");f.get("disableInteraction")?k=!1:(k=d.data(this,"_jqs_mhandler"),k?f.get("composite")||k.reset():(k=new u(this,f),d.data(this,"_jqs_mhandler",k)));if(f.get("composite")&&!d.data(this,"_jqs_vcanvas")){d.data(this,"_jqs_errnotify")||(alert("Attempted to attach a composite sparkline to an element with no existing sparkline"),d.data(this,"_jqs_errnotify",!0));return}l=new(d.fn.sparkline[f.get("type")])(this,e,f,h,i),l.render(),k&&k.registerSparkline(l)};if(d(this).html()&&!f.get("disableHiddenCheck")&&d(this).is(":hidden")||!d(this).parents("body").length){if(!f.get("composite")&&d.data(this,"_jqs_pending"))for(i=K.length;i;i--)K[i-1][0]==this&&K.splice(i-1,1);K.push([this,h]),d.data(this,"_jqs_pending",!0)}else h.call(this)})},d.fn.sparkline.defaults=f(),d.sparkline_display_visible=function(){var a,b,c,e=[];for(b=0,c=K.length;b<c;b++)a=K[b][0],d(a).is(":visible")&&!d(a).parents().is(":hidden")?(K[b][1].call(a),d.data(K[b][0],"_jqs_pending",!1),e.push(b)):!d(a).closest("html").length&&!d.data(a,"_jqs_pending")&&(d.data(K[b][0],"_jqs_pending",!1),e.push(b));for(b=e.length;b;b--)K.splice(e[b-1],1)},d.fn.sparkline.options=g({init:function(a,b){var c,f,g,h;this.userOptions=b=b||{},this.tag=a,this.tagValCache={},f=d.fn.sparkline.defaults,g=f.common,this.tagOptionsPrefix=b.enableTagOptions&&(b.tagOptionsPrefix||g.tagOptionsPrefix),h=this.getTagSetting("type"),h===e?c=f[b.type||g.type]:c=f[h],this.mergedOptions=d.extend({},g,c,b)},getTagSetting:function(a){var b=this.tagOptionsPrefix,d,f,g,h;if(b===!1||b===c)return e;if(this.tagValCache.hasOwnProperty(a))d=this.tagValCache.key;else{d=this.tag.getAttribute(b+a);if(d===c||d===null)d=e;else if(d.substr(0,1)==="["){d=d.substr(1,d.length-2).split(",");for(f=d.length;f--;)d[f]=k(d[f].replace(/(^\s*)|(\s*$)/g,""))}else if(d.substr(0,1)==="{"){g=d.substr(1,d.length-2).split(","),d={};for(f=g.length;f--;)h=g[f].split(":",2),d[h[0].replace(/(^\s*)|(\s*$)/g,"")]=k(h[1].replace(/(^\s*)|(\s*$)/g,""))}else d=k(d);this.tagValCache.key=d}return d},get:function(a,b){var d=this.getTagSetting(a),f;return d!==e?d:(f=this.mergedOptions[a])===c?b:f}}),d.fn.sparkline._base=g({disabled:!1,init:function(a,b,e,f,g){this.el=a,this.$el=d(a),this.values=b,this.options=e,this.width=f,this.height=g,this.currentRegion=c},initTarget:function(){var a=!this.options.get("disableInteraction");(this.target=this.$el.simpledraw(this.width,this.height,this.options.get("composite"),a))?(this.canvasWidth=this.target.pixelWidth,this.canvasHeight=this.target.pixelHeight):this.disabled=!0},render:function(){return this.disabled?(this.el.innerHTML="",!1):!0},getRegion:function(a,b){},setRegionHighlight:function(a,b,d){var e=this.currentRegion,f=!this.options.get("disableHighlight"),g;return b>this.canvasWidth||d>this.canvasHeight||b<0||d<0?null:(g=this.getRegion(a,b,d),e!==g?(e!==c&&f&&this.removeHighlight(),this.currentRegion=g,g!==c&&f&&this.renderHighlight(),!0):!1)},clearRegionHighlight:function(){return this.currentRegion!==c?(this.removeHighlight(),this.currentRegion=c,!0):!1},renderHighlight:function(){this.changeHighlight(!0)},removeHighlight:function(){this.changeHighlight(!1)},changeHighlight:function(a){},getCurrentRegionTooltip:function(){var a=this.options,b="",e=[],f,g,i,j,k,l,m,n,o,p,q,r,s,t;if(this.currentRegion===c)return"";f=this.getCurrentRegionFields(),q=a.get("tooltipFormatter");if(q)return q(this,a,f);a.get("tooltipChartTitle")&&(b+='<div class="jqs jqstitle">'+a.get("tooltipChartTitle")+"</div>\n"),g=this.options.get("tooltipFormat");if(!g)return"";d.isArray(g)||(g=[g]),d.isArray(f)||(f=[f]),m=this.options.get("tooltipFormatFieldlist"),n=this.options.get("tooltipFormatFieldlistKey");if(m&&n){o=[];for(l=f.length;l--;)p=f[l][n],(t=d.inArray(p,m))!=-1&&(o[t]=f[l]);f=o}i=g.length,s=f.length;for(l=0;l<i;l++){r=g[l],typeof r=="string"&&(r=new h(r)),j=r.fclass||"jqsfield";for(t=0;t<s;t++)if(!f[t].isNull||!a.get("tooltipSkipNull"))d.extend(f[t],{prefix:a.get("tooltipPrefix"),suffix:a.get("tooltipSuffix")}),k=r.render(f[t],a.get("tooltipValueLookups"),a),e.push('<div class="'+j+'">'+k+"</div>")}return e.length?b+e.join("\n"):""},getCurrentRegionFields:function(){},calcHighlightColor:function(a,c){var d=c.get("highlightColor"),e=c.get("highlightLighten"),f,g,h,j;if(d)return d;if(e){f=/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(a)||/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(a);if(f){h=[],g=a.length===4?16:1;for(j=0;j<3;j++)h[j]=i(b.round(parseInt(f[j+1],16)*g*e),0,255);return"rgb("+h.join(",")+")"}}return a}}),w={changeHighlight:function(a){var b=this.currentRegion,c=this.target,e=this.regionShapes[b],f;e&&(f=this.renderRegion(b,a),d.isArray(f)||d.isArray(e)?(c.replaceWithShapes(e,f),this.regionShapes[b]=d.map(f,function(a){return a.id})):(c.replaceWithShape(e,f),this.regionShapes[b]=f.id))},render:function(){var a=this.values,b=this.target,c=this.regionShapes,e,f,g,h;if(!this.cls._super.render.call(this))return;for(g=a.length;g--;){e=this.renderRegion(g);if(e)if(d.isArray(e)){f=[];for(h=e.length;h--;)e[h].append(),f.push(e[h].id);c[g]=f}else e.append(),c[g]=e.id;else c[g]=null}b.render()}},d.fn.sparkline.line=x=g(d.fn.sparkline._base,{type:"line",init:function(a,b,c,d,e){x._super.init.call(this,a,b,c,d,e),this.vertices=[],this.regionMap=[],this.xvalues=[],this.yvalues=[],this.yminmax=[],this.hightlightSpotId=null,this.lastShapeId=null,this.initTarget()},getRegion:function(a,b,d){var e,f=this.regionMap;for(e=f.length;e--;)if(f[e]!==null&&b>=f[e][0]&&b<=f[e][1])return f[e][2];return c},getCurrentRegionFields:function(){var a=this.currentRegion;return{isNull:this.yvalues[a]===null,x:this.xvalues[a],y:this.yvalues[a],color:this.options.get("lineColor"),fillColor:this.options.get("fillColor"),offset:a}},renderHighlight:function(){var a=this.currentRegion,b=this.target,d=this.vertices[a],e=this.options,f=e.get("spotRadius"),g=e.get("highlightSpotColor"),h=e.get("highlightLineColor"),i,j;if(!d)return;f&&g&&(i=b.drawCircle(d[0],d[1],f,c,g),this.highlightSpotId=i.id,b.insertAfterShape(this.lastShapeId,i)),h&&(j=b.drawLine(d[0],this.canvasTop,d[0],this.canvasTop+this.canvasHeight,h),this.highlightLineId=j.id,b.insertAfterShape(this.lastShapeId,j))},removeHighlight:function(){var a=this.target;this.highlightSpotId&&(a.removeShapeId(this.highlightSpotId),this.highlightSpotId=null),this.highlightLineId&&(a.removeShapeId(this.highlightLineId),this.highlightLineId=null)},scanValues:function(){var a=this.values,c=a.length,d=this.xvalues,e=this.yvalues,f=this.yminmax,g,h,i,j,k;for(g=0;g<c;g++)h=a[g],i=typeof a[g]=="string",j=typeof a[g]=="object"&&a[g]instanceof Array,k=i&&a[g].split(":"),i&&k.length===2?(d.push(Number(k[0])),e.push(Number(k[1])),f.push(Number(k[1]))):j?(d.push(h[0]),e.push(h[1]),f.push(h[1])):(d.push(g),a[g]===null||a[g]==="null"?e.push(null):(e.push(Number(h)),f.push(Number(h))));this.options.get("xvalues")&&(d=this.options.get("xvalues")),this.maxy=this.maxyorg=b.max.apply(b,f),this.miny=this.minyorg=b.min.apply(b,f),this.maxx=b.max.apply(b,d),this.minx=b.min.apply(b,d),this.xvalues=d,this.yvalues=e,this.yminmax=f},processRangeOptions:function(){var a=this.options,b=a.get("normalRangeMin"),d=a.get("normalRangeMax");b!==c&&(b<this.miny&&(this.miny=b),d>this.maxy&&(this.maxy=d)),a.get("chartRangeMin")!==c&&(a.get("chartRangeClip")||a.get("chartRangeMin")<this.miny)&&(this.miny=a.get("chartRangeMin")),a.get("chartRangeMax")!==c&&(a.get("chartRangeClip")||a.get("chartRangeMax")>this.maxy)&&(this.maxy=a.get("chartRangeMax")),a.get("chartRangeMinX")!==c&&(a.get("chartRangeClipX")||a.get("chartRangeMinX")<this.minx)&&(this.minx=a.get("chartRangeMinX")),a.get("chartRangeMaxX")!==c&&(a.get("chartRangeClipX")||a.get("chartRangeMaxX")>this.maxx)&&(this.maxx=a.get("chartRangeMaxX"))},drawNormalRange:function(a,d,e,f,g){var h=this.options.get("normalRangeMin"),i=this.options.get("normalRangeMax"),j=d+b.round(e-e*((i-this.miny)/g)),k=b.round(e*(i-h)/g);this.target.drawRect(a,j,f,k,c,this.options.get("normalRangeColor")).append()},render:function(){var a=this.options,e=this.target,f=this.canvasWidth,g=this.canvasHeight,h=this.vertices,i=a.get("spotRadius"),j=this.regionMap,k,l,m,n,o,p,q,r,s,u,v,w,y,z,A,B,C,D,E,F,G,H,I,J,K;if(!x._super.render.call(this))return;this.scanValues(),this.processRangeOptions(),I=this.xvalues,J=this.yvalues;if(!this.yminmax.length||this.yvalues.length<2)return;n=o=0,k=this.maxx-this.minx===0?1:this.maxx-this.minx,l=this.maxy-this.miny===0?1:this.maxy-this.miny,m=this.yvalues.length-1,i&&(f<i*4||g<i*4)&&(i=0);if(i){G=a.get("highlightSpotColor")&&!a.get("disableInteraction");if(G||a.get("minSpotColor")||a.get("spotColor")&&J[m]===this.miny)g-=b.ceil(i);if(G||a.get("maxSpotColor")||a.get("spotColor")&&J[m]===this.maxy)g-=b.ceil(i),n+=b.ceil(i);if(G||(a.get("minSpotColor")||a.get("maxSpotColor"))&&(J[0]===this.miny||J[0]===this.maxy))o+=b.ceil(i),f-=b.ceil(i);if(G||a.get("spotColor")||a.get("minSpotColor")||a.get("maxSpotColor")&&(J[m]===this.miny||J[m]===this.maxy))f-=b.ceil(i)}g--,a.get("normalRangeMin")!==c&&!a.get("drawNormalOnTop")&&this.drawNormalRange(o,n,g,f,l),q=[],r=[q],z=A=null,B=J.length;for(K=0;K<B;K++)s=I[K],v=I[K+1],u=J[K],w=o+b.round((s-this.minx)*(f/k)),y=K<B-1?o+b.round((v-this.minx)*(f/k)):f,A=w+(y-w)/2,j[K]=[z||0,A,K],z=A,u===null?K&&(J[K-1]!==null&&(q=[],r.push(q)),h.push(null)):(u<this.miny&&(u=this.miny),u>this.maxy&&(u=this.maxy),q.length||q.push([w,n+g]),p=[w,n+b.round(g-g*((u-this.miny)/l))],q.push(p),h.push(p));C=[],D=[],E=r.length;for(K=0;K<E;K++)q=r[K],q.length&&(a.get("fillColor")&&(q.push([q[q.length-1][0],n+g]),D.push(q.slice(0)),q.pop()),q.length>2&&(q[0]=[q[0][0],q[1][1]]),C.push(q));E=D.length;for(K=0;K<E;K++)e.drawShape(D[K],a.get("fillColor"),a.get("fillColor")).append();a.get("normalRangeMin")!==c&&a.get("drawNormalOnTop")&&this.drawNormalRange(o,n,g,f,l),E=C.length;for(K=0;K<E;K++)e.drawShape(C[K],a.get("lineColor"),c,a.get("lineWidth")).append();if(i&&a.get("valueSpots")){F=a.get("valueSpots"),F.get===c&&(F=new t(F));for(K=0;K<B;K++)H=F.get(J[K]),H&&e.drawCircle(o+b.round((I[K]-this.minx)*(f/k)),n+b.round(g-g*((J[K]-this.miny)/l)),i,c,H).append()}i&&a.get("spotColor")&&J[m]!==null&&e.drawCircle(o+b.round((I[I.length-1]-this.minx)*(f/k)),n+b.round(g-g*((J[m]-this.miny)/l)),i,c,a.get("spotColor")).append(),this.maxy!==this.minyorg&&(i&&a.get("minSpotColor")&&(s=I[d.inArray(this.minyorg,J)],e.drawCircle(o+b.round((s-this.minx)*(f/k)),n+b.round(g-g*((this.minyorg-this.miny)/l)),i,c,a.get("minSpotColor")).append()),i&&a.get("maxSpotColor")&&(s=I[d.inArray(this.maxyorg,J)],e.drawCircle(o+b.round((s-this.minx)*(f/k)),n+b.round(g-g*((this.maxyorg-this.miny)/l)),i,c,a.get("maxSpotColor")).append())),this.lastShapeId=e.getLastShapeId(),this.canvasTop=n,e.render()}}),d.fn.sparkline.bar=y=g(d.fn.sparkline._base,w,{type:"bar",init:function(a,e,f,g,h){var j=parseInt(f.get("barWidth"),10),n=parseInt(f.get("barSpacing"),10),o=f.get("chartRangeMin"),p=f.get("chartRangeMax"),q=f.get("chartRangeClip"),r=Infinity,s=-Infinity,u,v,w,x,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R;y._super.init.call(this,a,e,f,g,h);for(A=0,B=e.length;A<B;A++){O=e[A],u=typeof O=="string"&&O.indexOf(":")>-1;if(u||d.isArray(O))J=!0,u&&(O=e[A]=l(O.split(":"))),O=m(O,null),v=b.min.apply(b,O),w=b.max.apply(b,O),v<r&&(r=v),w>s&&(s=w)}this.stacked=J,this.regionShapes={},this.barWidth=j,this.barSpacing=n,this.totalBarWidth=j+n,this.width=g=e.length*j+(e.length-1)*n,this.initTarget(),q&&(H=o===c?-Infinity:o,I=p===c?Infinity:p),z=[],x=J?[]:z;var S=[],T=[];for(A=0,B=e.length;A<B;A++)if(J){K=e[A],e[A]=N=[],S[A]=0,x[A]=T[A]=0;for(L=0,M=K.length;L<M;L++)O=N[L]=q?i(K[L],H,I):K[L],O!==null&&(O>0&&(S[A]+=O),r<0&&s>0?O<0?T[A]+=b.abs(O):x[A]+=O:x[A]+=b.abs(O-(O<0?s:r)),z.push(O))}else O=q?i(e[A],H,I):e[A],O=e[A]=k(O),O!==null&&z.push(O);this.max=G=b.max.apply(b,z),this.min=F=b.min.apply(b,z),this.stackMax=s=J?b.max.apply(b,S):G,this.stackMin=r=J?b.min.apply(b,z):F,f.get("chartRangeMin")!==c&&(f.get("chartRangeClip")||f.get("chartRangeMin")<F)&&(F=f.get("chartRangeMin")),f.get("chartRangeMax")!==c&&(f.get("chartRangeClip")||f.get("chartRangeMax")>G)&&(G=f.get("chartRangeMax")),this.zeroAxis=D=f.get("zeroAxis",!0),F<=0&&G>=0&&D?E=0:D==0?E=F:F>0?E=F:E=G,this.xaxisOffset=E,C=J?b.max.apply(b,x)+b.max.apply(b,T):G-F,this.canvasHeightEf=D&&F<0?this.canvasHeight-2:this.canvasHeight-1,F<E?(Q=J&&G>=0?s:G,P=(Q-E)/C*this.canvasHeight,P!==b.ceil(P)&&(this.canvasHeightEf-=2,P=b.ceil(P))):P=this.canvasHeight,this.yoffset=P,d.isArray(f.get("colorMap"))?(this.colorMapByIndex=f.get("colorMap"),this.colorMapByValue=null):(this.colorMapByIndex=null,this.colorMapByValue=f.get("colorMap"),this.colorMapByValue&&this.colorMapByValue.get===c&&(this.colorMapByValue=new t(this.colorMapByValue))),this.range=C},getRegion:function(a,d,e){var f=b.floor(d/this.totalBarWidth);return f<0||f>=this.values.length?c:f},getCurrentRegionFields:function(){var a=this.currentRegion,b=r(this.values[a]),c=[],d,e;for(e=b.length;e--;)d=b[e],c.push({isNull:d===null,value:d,color:this.calcColor(e,d,a),offset:a});return c},calcColor:function(a,b,e){var f=this.colorMapByIndex,g=this.colorMapByValue,h=this.options,i,j;return this.stacked?i=h.get("stackedBarColor"):i=b<0?h.get("negBarColor"):h.get("barColor"),b===0&&h.get("zeroColor")!==c&&(i=h.get("zeroColor")),g&&(j=g.get(b))?i=j:f&&f.length>e&&(i=f[e]),d.isArray(i)?i[a%i.length]:i},renderRegion:function(a,e){var f=this.values[a],g=this.options,h=this.xaxisOffset,i=[],j=this.range,k=this.stacked,l=this.target,m=a*this.totalBarWidth,n=this.canvasHeightEf,p=this.yoffset,q,r,s,t,u,v,w,x,y,z;f=d.isArray(f)?f:[f],w=f.length,x=f[0],t=o(null,f),z=o(h,f,!0);if(t)return g.get("nullColor")?(s=e?g.get("nullColor"):this.calcHighlightColor(g.get("nullColor"),g),q=p>0?p-1:p,l.drawRect(m,q,this.barWidth-1,0,s,s)):c;u=p;for(v=0;v<w;v++){x=f[v];if(k&&x===h){if(!z||y)continue;y=!0}j>0?r=b.floor(n*(b.abs(x-h)/j))+1:r=1,x<h||x===h&&p===0?(q=u,u+=r):(q=p-r,p-=r),s=this.calcColor(v,x,a),e&&(s=this.calcHighlightColor(s,g)),i.push(l.drawRect(m,q,this.barWidth-1,r-1,s,s))}return i.length===1?i[0]:i}}),d.fn.sparkline.tristate=z=g(d.fn.sparkline._base,w,{type:"tristate",init:function(a,b,e,f,g){var h=parseInt(e.get("barWidth"),10),i=parseInt(e.get("barSpacing"),10);z._super.init.call(this,a,b,e,f,g),this.regionShapes={},this.barWidth=h,this.barSpacing=i,this.totalBarWidth=h+i,this.values=d.map(b,Number),this.width=f=b.length*h+(b.length-1)*i,d.isArray(e.get("colorMap"))?(this.colorMapByIndex=e.get("colorMap"),this.colorMapByValue=null):(this.colorMapByIndex=null,this.colorMapByValue=e.get("colorMap"),this.colorMapByValue&&this.colorMapByValue.get===c&&(this.colorMapByValue=new t(this.colorMapByValue))),this.initTarget()},getRegion:function(a,c,d){return b.floor(c/this.totalBarWidth)},getCurrentRegionFields:function(){var a=this.currentRegion;return{isNull:this.values[a]===c,value:this.values[a],color:this.calcColor(this.values[a],a),offset:a}},calcColor:function(a,b){var c=this.values,d=this.options,e=this.colorMapByIndex,f=this.colorMapByValue,g,h;return f&&(h=f.get(a))?g=h:e&&e.length>b?g=e[b]:c[b]<0?g=d.get("negBarColor"):c[b]>0?g=d.get("posBarColor"):g=d.get("zeroBarColor"),g},renderRegion:function(a,c){var d=this.values,e=this.options,f=this.target,g,h,i,j,k,l;g=f.pixelHeight,i=b.round(g/2),j=a*this.totalBarWidth,d[a]<0?(k=i,h=i-1):d[a]>0?(k=0,h=i-1):(k=i-1,h=2),l=this.calcColor(d[a],a);if(l===null)return;return c&&(l=this.calcHighlightColor(l,e)),f.drawRect(j,k,this.barWidth-1,h-1,l,l)}}),d.fn.sparkline.discrete=A=g(d.fn.sparkline._base,w,{type:"discrete",init:function(a,e,f,g,h){A._super.init.call(this,a,e,f,g,h),this.regionShapes={},this.values=e=d.map(e,Number),this.min=b.min.apply(b,e),this.max=b.max.apply(b,e),this.range=this.max-this.min,this.width=g=f.get("width")==="auto"?e.length*2:this.width,this.interval=b.floor(g/e.length),this.itemWidth=g/e.length,f.get("chartRangeMin")!==c&&(f.get("chartRangeClip")||f.get("chartRangeMin")<this.min)&&(this.min=f.get("chartRangeMin")),f.get("chartRangeMax")!==c&&(f.get("chartRangeClip")||f.get("chartRangeMax")>this.max)&&(this.max=f.get("chartRangeMax")),this.initTarget(),this.target&&(this.lineHeight=f.get("lineHeight")==="auto"?b.round(this.canvasHeight*.3):f.get("lineHeight"))},getRegion:function(a,c,d){return b.floor(c/this.itemWidth)},getCurrentRegionFields:function(){var a=this.currentRegion;return{isNull:this.values[a]===c,value:this.values[a],offset:a}},renderRegion:function(a,c){var d=this.values,e=this.options,f=this.min,g=this.max,h=this.range,j=this.interval,k=this.target,l=this.canvasHeight,m=this.lineHeight,n=l-m,o,p,q,r;return p=i(d[a],f,g),r=a*j,o=b.round(n-n*((p-f)/h)),q=e.get("thresholdColor")&&p<e.get("thresholdValue")?e.get("thresholdColor"):e.get("lineColor"),c&&(q=this.calcHighlightColor(q,e)),k.drawLine(r,o,r,o+m,q)}}),d.fn.sparkline.bullet=B=g(d.fn.sparkline._base,{type:"bullet",init:function(a,d,e,f,g){var h,i,j;B._super.init.call(this,a,d,e,f,g),this.values=d=l(d),j=d.slice(),j[0]=j[0]===null?j[2]:j[0],j[1]=d[1]===null?j[2]:j[1],h=b.min.apply(b,d),i=b.max.apply(b,d),e.get("base")===c?h=h<0?h:0:h=e.get("base"),this.min=h,this.max=i,this.range=i-h,this.shapes={},this.valueShapes={},this.regiondata={},this.width=f=e.get("width")==="auto"?"4.0em":f,this.target=this.$el.simpledraw(f,g,e.get("composite")),d.length||(this.disabled=!0),this.initTarget()},getRegion:function(a,b,d){var e=this.target.getShapeAt(a,b,d);return e!==c&&this.shapes[e]!==c?this.shapes[e]:c},getCurrentRegionFields:function(){var a=this.currentRegion;return{fieldkey:a.substr(0,1),value:this.values[a.substr(1)],region:a}},changeHighlight:function(a){var b=this.currentRegion,c=this.valueShapes[b],d;delete this.shapes[c];switch(b.substr(0,1)){case"r":d=this.renderRange(b.substr(1),a);break;case"p":d=this.renderPerformance(a);break;case"t":d=this.renderTarget(a)}this.valueShapes[b]=d.id,this.shapes[d.id]=b,this.target.replaceWithShape(c,d)},renderRange:function(a,c){var d=this.values[a],e=b.round(this.canvasWidth*((d-this.min)/this.range)),f=this.options.get("rangeColors")[a-2];return c&&(f=this.calcHighlightColor(f,this.options)),this.target.drawRect(0,0,e-1,this.canvasHeight-1,f,f)},renderPerformance:function(a){var c=this.values[1],d=b.round(this.canvasWidth*((c-this.min)/this.range)),e=this.options.get("performanceColor");return a&&(e=this.calcHighlightColor(e,this.options)),this.target.drawRect(0,b.round(this.canvasHeight*.3),d-1,b.round(this.canvasHeight*.4)-1,e,e)},renderTarget:function(a){var c=this.values[0],d=b.round(this.canvasWidth*((c-this.min)/this.range)-this.options.get("targetWidth")/2),e=b.round(this.canvasHeight*.1),f=this.canvasHeight-e*2,g=this.options.get("targetColor");return a&&(g=this.calcHighlightColor(g,this.options)),this.target.drawRect(d,e,this.options.get("targetWidth")-1,f-1,g,g)},render:function(){var a=this.values.length,b=this.target,c,d;if(!B._super.render.call(this))return;for(c=2;c<a;c++)d=this.renderRange(c).append(),this.shapes[d.id]="r"+c,this.valueShapes["r"+c]=d.id;this.values[1]!==null&&(d=this.renderPerformance().append(),this.shapes[d.id]="p1",this.valueShapes.p1=d.id),this.values[0]!==null&&(d=this.renderTarget().append(),this.shapes[d.id]="t0",this.valueShapes.t0=d.id),b.render()}}),d.fn.sparkline.pie=C=g(d.fn.sparkline._base,{type:"pie",init:function(a,c,e,f,g){var h=0,i;C._super.init.call(this,a,c,e,f,g),this.shapes={},this.valueShapes={},this.values=c=d.map(c,Number),e.get("width")==="auto"&&(this.width=this.height);if(c.length>0)for(i=c.length;i--;)h+=c[i];this.total=h,this.initTarget(),this.radius=b.floor(b.min(this.canvasWidth,this.canvasHeight)/2)},getRegion:function(a,b,d){var e=this.target.getShapeAt(a,b,d);return e!==c&&this.shapes[e]!==c?this.shapes[e]:c},getCurrentRegionFields:function(){var a=this.currentRegion;return{isNull:this.values[a]===c,value:this.values[a],percent:this.values[a]/this.total*100,color:this.options.get("sliceColors")[a%this.options.get("sliceColors").length],offset:a}},changeHighlight:function(a){var b=this.currentRegion,c=this.renderSlice(b,a),d=this.valueShapes[b];delete this.shapes[d],this.target.replaceWithShape(d,c),this.valueShapes[b]=c.id,this.shapes[c.id]=b},renderSlice:function(a,d){var e=this.target,f=this.options,g=this.radius,h=f.get("borderWidth"),i=f.get("offset"),j=2*b.PI,k=this.values,l=this.total,m=i?2*b.PI*(i/360):0,n,o,p,q,r;q=k.length;for(p=0;p<q;p++){n=m,o=m,l>0&&(o=m+j*(k[p]/l));if(a===p)return r=f.get("sliceColors")[p%f.get("sliceColors").length],d&&(r=this.calcHighlightColor(r,f)),e.drawPieSlice(g,g,g-h,n,o,c,r);m=o}},render:function(){var a=this.target,d=this.values,e=this.options,f=this.radius,g=e.get("borderWidth"),h,i;if(!C._super.render.call(this))return;g&&a.drawCircle(f,f,b.floor(f-g/2),e.get("borderColor"),c,g).append();for(i=d.length;i--;)d[i]&&(h=this.renderSlice(i).append(),this.valueShapes[i]=h.id,this.shapes[h.id]=i);a.render()}}),d.fn.sparkline.box=D=g(d.fn.sparkline._base,{type:"box",init:function(a,b,c,e,f){D._super.init.call(this,a,b,c,e,f),this.values=d.map(b,Number),this.width=c.get("width")==="auto"?"4.0em":e,this.initTarget(),this.values.length||(this.disabled=1)},getRegion:function(){return 1},getCurrentRegionFields:function(){var a=[{field:"lq",value:this.quartiles[0]},{field:"med",value:this.quartiles
+            [1]},{field:"uq",value:this.quartiles[2]}];return this.loutlier!==c&&a.push({field:"lo",value:this.loutlier}),this.routlier!==c&&a.push({field:"ro",value:this.routlier}),this.lwhisker!==c&&a.push({field:"lw",value:this.lwhisker}),this.rwhisker!==c&&a.push({field:"rw",value:this.rwhisker}),a},render:function(){var a=this.target,d=this.values,e=d.length,f=this.options,g=this.canvasWidth,h=this.canvasHeight,i=f.get("chartRangeMin")===c?b.min.apply(b,d):f.get("chartRangeMin"),k=f.get("chartRangeMax")===c?b.max.apply(b,d):f.get("chartRangeMax"),l=0,m,n,o,p,q,r,s,t,u,v,w;if(!D._super.render.call(this))return;if(f.get("raw"))f.get("showOutliers")&&d.length>5?(n=d[0],m=d[1],p=d[2],q=d[3],r=d[4],s=d[5],t=d[6]):(m=d[0],p=d[1],q=d[2],r=d[3],s=d[4]);else{d.sort(function(a,b){return a-b}),p=j(d,1),q=j(d,2),r=j(d,3),o=r-p;if(f.get("showOutliers")){m=s=c;for(u=0;u<e;u++)m===c&&d[u]>p-o*f.get("outlierIQR")&&(m=d[u]),d[u]<r+o*f.get("outlierIQR")&&(s=d[u]);n=d[0],t=d[e-1]}else m=d[0],s=d[e-1]}this.quartiles=[p,q,r],this.lwhisker=m,this.rwhisker=s,this.loutlier=n,this.routlier=t,w=g/(k-i+1),f.get("showOutliers")&&(l=b.ceil(f.get("spotRadius")),g-=2*b.ceil(f.get("spotRadius")),w=g/(k-i+1),n<m&&a.drawCircle((n-i)*w+l,h/2,f.get("spotRadius"),f.get("outlierLineColor"),f.get("outlierFillColor")).append(),t>s&&a.drawCircle((t-i)*w+l,h/2,f.get("spotRadius"),f.get("outlierLineColor"),f.get("outlierFillColor")).append()),a.drawRect(b.round((p-i)*w+l),b.round(h*.1),b.round((r-p)*w),b.round(h*.8),f.get("boxLineColor"),f.get("boxFillColor")).append(),a.drawLine(b.round((m-i)*w+l),b.round(h/2),b.round((p-i)*w+l),b.round(h/2),f.get("lineColor")).append(),a.drawLine(b.round((m-i)*w+l),b.round(h/4),b.round((m-i)*w+l),b.round(h-h/4),f.get("whiskerColor")).append(),a.drawLine(b.round((s-i)*w+l),b.round(h/2),b.round((r-i)*w+l),b.round(h/2),f.get("lineColor")).append(),a.drawLine(b.round((s-i)*w+l),b.round(h/4),b.round((s-i)*w+l),b.round(h-h/4),f.get("whiskerColor")).append(),a.drawLine(b.round((q-i)*w+l),b.round(h*.1),b.round((q-i)*w+l),b.round(h*.9),f.get("medianColor")).append(),f.get("target")&&(v=b.ceil(f.get("spotRadius")),a.drawLine(b.round((f.get("target")-i)*w+l),b.round(h/2-v),b.round((f.get("target")-i)*w+l),b.round(h/2+v),f.get("targetColor")).append(),a.drawLine(b.round((f.get("target")-i)*w+l-v),b.round(h/2),b.round((f.get("target")-i)*w+l+v),b.round(h/2),f.get("targetColor")).append()),a.render()}}),G=g({init:function(a,b,c,d){this.target=a,this.id=b,this.type=c,this.args=d},append:function(){return this.target.appendShape(this),this}}),H=g({_pxregex:/(\d+)(px)?\s*$/i,init:function(a,b,c){if(!a)return;this.width=a,this.height=b,this.target=c,this.lastShapeId=null,c[0]&&(c=c[0]),d.data(c,"_jqs_vcanvas",this)},drawLine:function(a,b,c,d,e,f){return this.drawShape([[a,b],[c,d]],e,f)},drawShape:function(a,b,c,d){return this._genShape("Shape",[a,b,c,d])},drawCircle:function(a,b,c,d,e,f){return this._genShape("Circle",[a,b,c,d,e,f])},drawPieSlice:function(a,b,c,d,e,f,g){return this._genShape("PieSlice",[a,b,c,d,e,f,g])},drawRect:function(a,b,c,d,e,f){return this._genShape("Rect",[a,b,c,d,e,f])},getElement:function(){return this.canvas},getLastShapeId:function(){return this.lastShapeId},reset:function(){alert("reset not implemented")},_insert:function(a,b){d(b).html(a)},_calculatePixelDims:function(a,b,c){var e;e=this._pxregex.exec(b),e?this.pixelHeight=e[1]:this.pixelHeight=d(c).height(),e=this._pxregex.exec(a),e?this.pixelWidth=e[1]:this.pixelWidth=d(c).width()},_genShape:function(a,b){var c=L++;return b.unshift(c),new G(this,c,a,b)},appendShape:function(a){alert("appendShape not implemented")},replaceWithShape:function(a,b){alert("replaceWithShape not implemented")},insertAfterShape:function(a,b){alert("insertAfterShape not implemented")},removeShapeId:function(a){alert("removeShapeId not implemented")},getShapeAt:function(a,b,c){alert("getShapeAt not implemented")},render:function(){alert("render not implemented")}}),I=g(H,{init:function(b,e,f,g){I._super.init.call(this,b,e,f),this.canvas=a.createElement("canvas"),f[0]&&(f=f[0]),d.data(f,"_jqs_vcanvas",this),d(this.canvas).css({display:"inline-block",width:b,height:e,verticalAlign:"top"}),this._insert(this.canvas,f),this._calculatePixelDims(b,e,this.canvas),this.canvas.width=this.pixelWidth,this.canvas.height=this.pixelHeight,this.interact=g,this.shapes={},this.shapeseq=[],this.currentTargetShapeId=c,d(this.canvas).css({width:this.pixelWidth,height:this.pixelHeight})},_getContext:function(a,b,d){var e=this.canvas.getContext("2d");return a!==c&&(e.strokeStyle=a),e.lineWidth=d===c?1:d,b!==c&&(e.fillStyle=b),e},reset:function(){var a=this._getContext();a.clearRect(0,0,this.pixelWidth,this.pixelHeight),this.shapes={},this.shapeseq=[],this.currentTargetShapeId=c},_drawShape:function(a,b,d,e,f){var g=this._getContext(d,e,f),h,i;g.beginPath(),g.moveTo(b[0][0]+.5,b[0][1]+.5);for(h=1,i=b.length;h<i;h++)g.lineTo(b[h][0]+.5,b[h][1]+.5);d!==c&&g.stroke(),e!==c&&g.fill(),this.targetX!==c&&this.targetY!==c&&g.isPointInPath(this.targetX,this.targetY)&&(this.currentTargetShapeId=a)},_drawCircle:function(a,d,e,f,g,h,i){var j=this._getContext(g,h,i);j.beginPath(),j.arc(d,e,f,0,2*b.PI,!1),this.targetX!==c&&this.targetY!==c&&j.isPointInPath(this.targetX,this.targetY)&&(this.currentTargetShapeId=a),g!==c&&j.stroke(),h!==c&&j.fill()},_drawPieSlice:function(a,b,d,e,f,g,h,i){var j=this._getContext(h,i);j.beginPath(),j.moveTo(b,d),j.arc(b,d,e,f,g,!1),j.lineTo(b,d),j.closePath(),h!==c&&j.stroke(),i&&j.fill(),this.targetX!==c&&this.targetY!==c&&j.isPointInPath(this.targetX,this.targetY)&&(this.currentTargetShapeId=a)},_drawRect:function(a,b,c,d,e,f,g){return this._drawShape(a,[[b,c],[b+d,c],[b+d,c+e],[b,c+e],[b,c]],f,g)},appendShape:function(a){return this.shapes[a.id]=a,this.shapeseq.push(a.id),this.lastShapeId=a.id,a.id},replaceWithShape:function(a,b){var c=this.shapeseq,d;this.shapes[b.id]=b;for(d=c.length;d--;)c[d]==a&&(c[d]=b.id);delete this.shapes[a]},replaceWithShapes:function(a,b){var c=this.shapeseq,d={},e,f,g;for(f=a.length;f--;)d[a[f]]=!0;for(f=c.length;f--;)e=c[f],d[e]&&(c.splice(f,1),delete this.shapes[e],g=f);for(f=b.length;f--;)c.splice(g,0,b[f].id),this.shapes[b[f].id]=b[f]},insertAfterShape:function(a,b){var c=this.shapeseq,d;for(d=c.length;d--;)if(c[d]===a){c.splice(d+1,0,b.id),this.shapes[b.id]=b;return}},removeShapeId:function(a){var b=this.shapeseq,c;for(c=b.length;c--;)if(b[c]===a){b.splice(c,1);break}delete this.shapes[a]},getShapeAt:function(a,b,c){return this.targetX=b,this.targetY=c,this.render(),this.currentTargetShapeId},render:function(){var a=this.shapeseq,b=this.shapes,c=a.length,d=this._getContext(),e,f,g;d.clearRect(0,0,this.pixelWidth,this.pixelHeight);for(g=0;g<c;g++)e=a[g],f=b[e],this["_draw"+f.type].apply(this,f.args);this.interact||(this.shapes={},this.shapeseq=[])}}),J=g(H,{init:function(b,c,e){var f;J._super.init.call(this,b,c,e),e[0]&&(e=e[0]),d.data(e,"_jqs_vcanvas",this),this.canvas=a.createElement("span"),d(this.canvas).css({display:"inline-block",position:"relative",overflow:"hidden",width:b,height:c,margin:"0px",padding:"0px",verticalAlign:"top"}),this._insert(this.canvas,e),this._calculatePixelDims(b,c,this.canvas),this.canvas.width=this.pixelWidth,this.canvas.height=this.pixelHeight,f='<v:group coordorigin="0 0" coordsize="'+this.pixelWidth+" "+this.pixelHeight+'"'+' style="position:absolute;top:0;left:0;width:'+this.pixelWidth+"px;height="+this.pixelHeight+'px;"></v:group>',this.canvas.insertAdjacentHTML("beforeEnd",f),this.group=d(this.canvas).children()[0],this.rendered=!1,this.prerender=""},_drawShape:function(a,b,d,e,f){var g=[],h,i,j,k,l,m,n;for(n=0,m=b.length;n<m;n++)g[n]=""+b[n][0]+","+b[n][1];return h=g.splice(0,1),f=f===c?1:f,i=d===c?' stroked="false" ':' strokeWeight="'+f+'px" strokeColor="'+d+'" ',j=e===c?' filled="false"':' fillColor="'+e+'" filled="true" ',k=g[0]===g[g.length-1]?"x ":"",l='<v:shape coordorigin="0 0" coordsize="'+this.pixelWidth+" "+this.pixelHeight+'" '+' id="jqsshape'+a+'" '+i+j+' style="position:absolute;left:0px;top:0px;height:'+this.pixelHeight+"px;width:"+this.pixelWidth+'px;padding:0px;margin:0px;" '+' path="m '+h+" l "+g.join(", ")+" "+k+'e">'+" </v:shape>",l},_drawCircle:function(a,b,d,e,f,g,h){var i,j,k;return b-=e,d-=e,i=f===c?' stroked="false" ':' strokeWeight="'+h+'px" strokeColor="'+f+'" ',j=g===c?' filled="false"':' fillColor="'+g+'" filled="true" ',k='<v:oval  id="jqsshape'+a+'" '+i+j+' style="position:absolute;top:'+d+"px; left:"+b+"px; width:"+e*2+"px; height:"+e*2+'px"></v:oval>',k},_drawPieSlice:function(a,d,e,f,g,h,i,j){var k,l,m,n,o,p,q,r;if(g===h)return"";h-g===2*b.PI&&(g=0,h=2*b.PI),l=d+b.round(b.cos(g)*f),m=e+b.round(b.sin(g)*f),n=d+b.round(b.cos(h)*f),o=e+b.round(b.sin(h)*f);if(l===n&&m===o){if(h-g<b.PI)return"";l=n=d+f,m=o=e}return l===n&&m===o&&h-g<b.PI?"":(k=[d-f,e-f,d+f,e+f,l,m,n,o],p=i===c?' stroked="false" ':' strokeWeight="1px" strokeColor="'+i+'" ',q=j===c?' filled="false"':' fillColor="'+j+'" filled="true" ',r='<v:shape coordorigin="0 0" coordsize="'+this.pixelWidth+" "+this.pixelHeight+'" '+' id="jqsshape'+a+'" '+p+q+' style="position:absolute;left:0px;top:0px;height:'+this.pixelHeight+"px;width:"+this.pixelWidth+'px;padding:0px;margin:0px;" '+' path="m '+d+","+e+" wa "+k.join(", ")+' x e">'+" </v:shape>",r)},_drawRect:function(a,b,c,d,e,f,g){return this._drawShape(a,[[b,c],[b,c+e],[b+d,c+e],[b+d,c],[b,c]],f,g)},reset:function(){this.group.innerHTML=""},appendShape:function(a){var b=this["_draw"+a.type].apply(this,a.args);return this.rendered?this.group.insertAdjacentHTML("beforeEnd",b):this.prerender+=b,this.lastShapeId=a.id,a.id},replaceWithShape:function(a,b){var c=d("#jqsshape"+a),e=this["_draw"+b.type].apply(this,b.args);c[0].outerHTML=e},replaceWithShapes:function(a,b){var c=d("#jqsshape"+a[0]),e="",f=b.length,g;for(g=0;g<f;g++)e+=this["_draw"+b[g].type].apply(this,b[g].args);c[0].outerHTML=e;for(g=1;g<a.length;g++)d("#jqsshape"+a[g]).remove()},insertAfterShape:function(a,b){var c=d("#jqsshape"+a),e=this["_draw"+b.type].apply(this,b.args);c[0].insertAdjacentHTML("afterEnd",e)},removeShapeId:function(a){var b=d("#jqsshape"+a);this.group.removeChild(b[0])},getShapeAt:function(a,b,c){var d=a.id.substr(8);return d},render:function(){this.rendered||(this.group.innerHTML=this.prerender,this.rendered=!0)}})})})(document,Math);
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/md5.js b/management/guns-admin/src/main/webapp/static/js/md5.js
new file mode 100644
index 0000000..46d2aab
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/md5.js
@@ -0,0 +1,256 @@
+/*
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
+var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
+var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
+function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
+function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
+function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
+function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
+function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function md5_vm_test()
+{
+  return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
+}
+
+/*
+ * Calculate the MD5 of an array of little-endian words, and a bit length
+ */
+function core_md5(x, len)
+{
+  /* append padding */
+  x[len >> 5] |= 0x80 << ((len) % 32);
+  x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+  var a =  1732584193;
+  var b = -271733879;
+  var c = -1732584194;
+  var d =  271733878;
+
+  for(var i = 0; i < x.length; i += 16)
+  {
+    var olda = a;
+    var oldb = b;
+    var oldc = c;
+    var oldd = d;
+
+    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
+    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
+    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
+    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
+    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
+    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
+    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
+    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
+    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
+    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
+    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
+    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
+    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
+    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
+    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
+    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
+
+    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
+    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
+    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
+    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
+    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
+    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
+    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
+    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
+    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
+    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
+    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
+    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
+    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
+    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
+    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
+    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
+
+    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
+    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
+    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
+    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
+    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
+    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
+    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
+    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
+    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
+    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
+    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
+    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
+    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
+    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
+    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
+    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
+
+    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
+    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
+    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
+    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
+    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
+    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
+    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
+    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
+    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
+    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
+    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
+    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
+    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
+    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
+    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
+    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
+
+    a = safe_add(a, olda);
+    b = safe_add(b, oldb);
+    c = safe_add(c, oldc);
+    d = safe_add(d, oldd);
+  }
+  return Array(a, b, c, d);
+
+}
+
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+function md5_cmn(q, a, b, x, s, t)
+{
+  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
+}
+function md5_ff(a, b, c, d, x, s, t)
+{
+  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
+}
+function md5_gg(a, b, c, d, x, s, t)
+{
+  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
+}
+function md5_hh(a, b, c, d, x, s, t)
+{
+  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
+}
+function md5_ii(a, b, c, d, x, s, t)
+{
+  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
+}
+
+/*
+ * Calculate the HMAC-MD5, of a key and some data
+ */
+function core_hmac_md5(key, data)
+{
+  var bkey = str2binl(key);
+  if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
+
+  var ipad = Array(16), opad = Array(16);
+  for(var i = 0; i < 16; i++)
+  {
+    ipad[i] = bkey[i] ^ 0x36363636;
+    opad[i] = bkey[i] ^ 0x5C5C5C5C;
+  }
+
+  var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
+  return core_md5(opad.concat(hash), 512 + 128);
+}
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y)
+{
+  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+  return (msw << 16) | (lsw & 0xFFFF);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function bit_rol(num, cnt)
+{
+  return (num << cnt) | (num >>> (32 - cnt));
+}
+
+/*
+ * Convert a string to an array of little-endian words
+ * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
+ */
+function str2binl(str)
+{
+  var bin = Array();
+  var mask = (1 << chrsz) - 1;
+  for(var i = 0; i < str.length * chrsz; i += chrsz)
+    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
+  return bin;
+}
+
+/*
+ * Convert an array of little-endian words to a string
+ */
+function binl2str(bin)
+{
+  var str = "";
+  var mask = (1 << chrsz) - 1;
+  for(var i = 0; i < bin.length * 32; i += chrsz)
+    str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
+  return str;
+}
+
+/*
+ * Convert an array of little-endian words to a hex string.
+ */
+function binl2hex(binarray)
+{
+  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+  var str = "";
+  for(var i = 0; i < binarray.length * 4; i++)
+  {
+    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
+           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
+  }
+  return str;
+}
+
+/*
+ * Convert an array of little-endian words to a base-64 string
+ */
+function binl2b64(binarray)
+{
+  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+  var str = "";
+  for(var i = 0; i < binarray.length * 4; i += 3)
+  {
+    var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
+                | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
+                |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
+    for(var j = 0; j < 4; j++)
+    {
+      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
+      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
+    }
+  }
+  return str;
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/bootstrap-table-mobile.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/bootstrap-table-mobile.min.js
new file mode 100644
index 0000000..606b062
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/bootstrap-table-mobile.min.js
@@ -0,0 +1,7 @@
+/*
+* bootstrap-table - v1.11.1 - 2017-02-22
+* https://github.com/wenzhixin/bootstrap-table
+* Copyright (c) 2017 zhixin wen
+* Licensed MIT License
+*/
+!function(a){"use strict";var b=function(b,c){b.options.columnsHidden.length>0&&a.each(b.columns,function(d,e){-1!==b.options.columnsHidden.indexOf(e.field)&&e.visible!==c&&b.toggleColumn(a.fn.bootstrapTable.utils.getFieldIndex(b.columns,e.field),c,!0)})},c=function(a){(a.options.height||a.options.showFooter)&&setTimeout(function(){a.resetView.call(a)},1)},d=function(a,b,d){a.options.minHeight?b<=a.options.minWidth&&d<=a.options.minHeight?e(a):b>a.options.minWidth&&d>a.options.minHeight&&f(a):b<=a.options.minWidth?e(a):b>a.options.minWidth&&f(a),c(a)},e=function(a){g(a,!1),b(a,!1)},f=function(a){g(a,!0),b(a,!0)},g=function(a,b){a.options.cardView=b,a.toggleView()},h=function(a,b){var c;return function(){var d=this,e=arguments,f=function(){c=null,a.apply(d,e)};clearTimeout(c),c=setTimeout(f,b)}};a.extend(a.fn.bootstrapTable.defaults,{mobileResponsive:!1,minWidth:562,minHeight:void 0,heightThreshold:100,checkOnInit:!0,columnsHidden:[]});var i=a.fn.bootstrapTable.Constructor,j=i.prototype.init;i.prototype.init=function(){if(j.apply(this,Array.prototype.slice.apply(arguments)),this.options.mobileResponsive&&this.options.minWidth){this.options.minWidth<100&&this.options.resizable&&(console.log("The minWidth when the resizable extension is active should be greater or equal than 100"),this.options.minWidth=100);var b=this,c={width:a(window).width(),height:a(window).height()};if(a(window).on("resize orientationchange",h(function(){var e=a(this).height(),f=a(this).width();(Math.abs(c.height-e)>b.options.heightThreshold||c.width!=f)&&(d(b,f,e),c={width:f,height:e})},200)),this.options.checkOnInit){var e=a(window).height(),f=a(window).width();d(this,f,e),c={width:f,height:e}}}}}(jQuery);
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/bootstrap-table.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/bootstrap-table.min.js
new file mode 100644
index 0000000..e03a0a4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/bootstrap-table.min.js
@@ -0,0 +1,8 @@
+/*
+* bootstrap-table - v1.11.1 - 2017-02-22
+* https://github.com/wenzhixin/bootstrap-table
+* Copyright (c) 2017 zhixin wen
+* Licensed MIT License
+*/
+!function(a){"use strict";var b=null,c=function(a){var b=arguments,c=!0,d=1;return a=a.replace(/%s/g,function(){var a=b[d++];return"undefined"==typeof a?(c=!1,""):a}),c?a:""},d=function(b,c,d,e){var f="";return a.each(b,function(a,b){return b[c]===e?(f=b[d],!1):!0}),f},e=function(b,c){var d=-1;return a.each(b,function(a,b){return b.field===c?(d=a,!1):!0}),d},f=function(b){var c,d,e,f=0,g=[];for(c=0;c<b[0].length;c++)f+=b[0][c].colspan||1;for(c=0;c<b.length;c++)for(g[c]=[],d=0;f>d;d++)g[c][d]=!1;for(c=0;c<b.length;c++)for(d=0;d<b[c].length;d++){var h=b[c][d],i=h.rowspan||1,j=h.colspan||1,k=a.inArray(!1,g[c]);for(1===j&&(h.fieldIndex=k,"undefined"==typeof h.field&&(h.field=k)),e=0;i>e;e++)g[c+e][k]=!0;for(e=0;j>e;e++)g[c][k+e]=!0}},g=function(){if(null===b){var c,d,e=a("<p/>").addClass("fixed-table-scroll-inner"),f=a("<div/>").addClass("fixed-table-scroll-outer");f.append(e),a("body").append(f),c=e[0].offsetWidth,f.css("overflow","scroll"),d=e[0].offsetWidth,c===d&&(d=f[0].clientWidth),f.remove(),b=c-d}return b},h=function(b,d,e,f){var g=d;if("string"==typeof d){var h=d.split(".");h.length>1?(g=window,a.each(h,function(a,b){g=g[b]})):g=window[d]}return"object"==typeof g?g:"function"==typeof g?g.apply(b,e||[]):!g&&"string"==typeof d&&c.apply(this,[d].concat(e))?c.apply(this,[d].concat(e)):f},i=function(b,c,d){var e=Object.getOwnPropertyNames(b),f=Object.getOwnPropertyNames(c),g="";if(d&&e.length!==f.length)return!1;for(var h=0;h<e.length;h++)if(g=e[h],a.inArray(g,f)>-1&&b[g]!==c[g])return!1;return!0},j=function(a){return"string"==typeof a?a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;").replace(/`/g,"&#x60;"):a},k=function(a){for(var b in a){var c=b.split(/(?=[A-Z])/).join("-").toLowerCase();c!==b&&(a[c]=a[b],delete a[b])}return a},l=function(a,b,c){var d=a;if("string"!=typeof b||a.hasOwnProperty(b))return c?j(a[b]):a[b];var e=b.split(".");for(var f in e)e.hasOwnProperty(f)&&(d=d&&d[e[f]]);return c?j(d):d},m=function(){return!!(navigator.userAgent.indexOf("MSIE ")>0||navigator.userAgent.match(/Trident.*rv\:11\./))},n=function(){Object.keys||(Object.keys=function(){var a=Object.prototype.hasOwnProperty,b=!{toString:null}.propertyIsEnumerable("toString"),c=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],d=c.length;return function(e){if("object"!=typeof e&&("function"!=typeof e||null===e))throw new TypeError("Object.keys called on non-object");var f,g,h=[];for(f in e)a.call(e,f)&&h.push(f);if(b)for(g=0;d>g;g++)a.call(e,c[g])&&h.push(c[g]);return h}}())},o=function(b,c){this.options=c,this.$el=a(b),this.$el_=this.$el.clone(),this.timeoutId_=0,this.timeoutFooter_=0,this.init()};o.DEFAULTS={classes:"table table-hover",sortClass:void 0,locale:void 0,height:void 0,undefinedText:"-",sortName:void 0,sortOrder:"asc",sortStable:!1,striped:!1,columns:[[]],data:[],totalField:"total",dataField:"rows",method:"get",url:void 0,ajax:void 0,cache:!0,contentType:"application/json",dataType:"json",ajaxOptions:{},queryParams:function(a){return a},queryParamsType:"limit",responseHandler:function(a){return a},pagination:!1,onlyInfoPagination:!1,paginationLoop:!0,sidePagination:"client",totalRows:0,pageNumber:1,pageSize:10,pageList:[10,25,50,100],paginationHAlign:"right",paginationVAlign:"bottom",paginationDetailHAlign:"left",paginationPreText:"&lsaquo;",paginationNextText:"&rsaquo;",search:!1,searchOnEnterKey:!1,strictSearch:!1,searchAlign:"right",selectItemName:"btSelectItem",showHeader:!0,showFooter:!1,showColumns:!1,showPaginationSwitch:!1,showRefresh:!1,showToggle:!1,buttonsAlign:"right",smartDisplay:!0,escape:!1,minimumCountColumns:1,idField:void 0,uniqueId:void 0,cardView:!1,detailView:!1,detailFormatter:function(){return""},trimOnSearch:!0,clickToSelect:!1,singleSelect:!1,toolbar:void 0,toolbarAlign:"left",checkboxHeader:!0,sortable:!0,silentSort:!0,maintainSelected:!1,searchTimeOut:500,searchText:"",iconSize:void 0,buttonsClass:"default",iconsPrefix:"glyphicon",icons:{paginationSwitchDown:"glyphicon-collapse-down icon-chevron-down",paginationSwitchUp:"glyphicon-collapse-up icon-chevron-up",refresh:"glyphicon-refresh icon-refresh",toggle:"glyphicon-list-alt icon-list-alt",columns:"glyphicon-th icon-th",detailOpen:"glyphicon-plus icon-plus",detailClose:"glyphicon-minus icon-minus"},customSearch:a.noop,customSort:a.noop,rowStyle:function(){return{}},rowAttributes:function(){return{}},footerStyle:function(){return{}},onAll:function(){return!1},onClickCell:function(){return!1},onDblClickCell:function(){return!1},onClickRow:function(){return!1},onDblClickRow:function(){return!1},onSort:function(){return!1},onCheck:function(){return!1},onUncheck:function(){return!1},onCheckAll:function(){return!1},onUncheckAll:function(){return!1},onCheckSome:function(){return!1},onUncheckSome:function(){return!1},onLoadSuccess:function(){return!1},onLoadError:function(){return!1},onColumnSwitch:function(){return!1},onPageChange:function(){return!1},onSearch:function(){return!1},onToggle:function(){return!1},onPreBody:function(){return!1},onPostBody:function(){return!1},onPostHeader:function(){return!1},onExpandRow:function(){return!1},onCollapseRow:function(){return!1},onRefreshOptions:function(){return!1},onRefresh:function(){return!1},onResetView:function(){return!1}},o.LOCALES={},o.LOCALES["en-US"]=o.LOCALES.en={formatLoadingMessage:function(){return"Loading, please wait..."},formatRecordsPerPage:function(a){return c("%s rows per page",a)},formatShowingRows:function(a,b,d){return c("Showing %s to %s of %s rows",a,b,d)},formatDetailPagination:function(a){return c("Showing %s rows",a)},formatSearch:function(){return"Search"},formatNoMatches:function(){return"No matching records found"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatRefresh:function(){return"Refresh"},formatToggle:function(){return"Toggle"},formatColumns:function(){return"Columns"},formatAllRows:function(){return"All"}},a.extend(o.DEFAULTS,o.LOCALES["en-US"]),o.COLUMN_DEFAULTS={radio:!1,checkbox:!1,checkboxEnabled:!0,field:void 0,title:void 0,titleTooltip:void 0,"class":void 0,align:void 0,halign:void 0,falign:void 0,valign:void 0,width:void 0,sortable:!1,order:"asc",visible:!0,switchable:!0,clickToSelect:!0,formatter:void 0,footerFormatter:void 0,events:void 0,sorter:void 0,sortName:void 0,cellStyle:void 0,searchable:!0,searchFormatter:!0,cardVisible:!0,escape:!1},o.EVENTS={"all.bs.table":"onAll","click-cell.bs.table":"onClickCell","dbl-click-cell.bs.table":"onDblClickCell","click-row.bs.table":"onClickRow","dbl-click-row.bs.table":"onDblClickRow","sort.bs.table":"onSort","check.bs.table":"onCheck","uncheck.bs.table":"onUncheck","check-all.bs.table":"onCheckAll","uncheck-all.bs.table":"onUncheckAll","check-some.bs.table":"onCheckSome","uncheck-some.bs.table":"onUncheckSome","load-success.bs.table":"onLoadSuccess","load-error.bs.table":"onLoadError","column-switch.bs.table":"onColumnSwitch","page-change.bs.table":"onPageChange","search.bs.table":"onSearch","toggle.bs.table":"onToggle","pre-body.bs.table":"onPreBody","post-body.bs.table":"onPostBody","post-header.bs.table":"onPostHeader","expand-row.bs.table":"onExpandRow","collapse-row.bs.table":"onCollapseRow","refresh-options.bs.table":"onRefreshOptions","reset-view.bs.table":"onResetView","refresh.bs.table":"onRefresh"},o.prototype.init=function(){this.initLocale(),this.initContainer(),this.initTable(),this.initHeader(),this.initData(),this.initHiddenRows(),this.initFooter(),this.initToolbar(),this.initPagination(),this.initBody(),this.initSearchText(),this.initServer()},o.prototype.initLocale=function(){if(this.options.locale){var b=this.options.locale.split(/-|_/);b[0].toLowerCase(),b[1]&&b[1].toUpperCase(),a.fn.bootstrapTable.locales[this.options.locale]?a.extend(this.options,a.fn.bootstrapTable.locales[this.options.locale]):a.fn.bootstrapTable.locales[b.join("-")]?a.extend(this.options,a.fn.bootstrapTable.locales[b.join("-")]):a.fn.bootstrapTable.locales[b[0]]&&a.extend(this.options,a.fn.bootstrapTable.locales[b[0]])}},o.prototype.initContainer=function(){this.$container=a(['<div class="bootstrap-table">','<div class="fixed-table-toolbar"></div>',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'<div class="fixed-table-pagination" style="clear: both;"></div>':"",'<div class="fixed-table-container">','<div class="fixed-table-header"><table></table></div>','<div class="fixed-table-body">','<div class="fixed-table-loading">',this.options.formatLoadingMessage(),"</div>","</div>",'<div class="fixed-table-footer"><table><tr></tr></table></div>',"bottom"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'<div class="fixed-table-pagination"></div>':"","</div>","</div>"].join("")),this.$container.insertAfter(this.$el),this.$tableContainer=this.$container.find(".fixed-table-container"),this.$tableHeader=this.$container.find(".fixed-table-header"),this.$tableBody=this.$container.find(".fixed-table-body"),this.$tableLoading=this.$container.find(".fixed-table-loading"),this.$tableFooter=this.$container.find(".fixed-table-footer"),this.$toolbar=this.$container.find(".fixed-table-toolbar"),this.$pagination=this.$container.find(".fixed-table-pagination"),this.$tableBody.append(this.$el),this.$container.after('<div class="clearfix"></div>'),this.$el.addClass(this.options.classes),this.options.striped&&this.$el.addClass("table-striped"),-1!==a.inArray("table-no-bordered",this.options.classes.split(" "))&&this.$tableContainer.addClass("table-no-bordered")},o.prototype.initTable=function(){var b=this,c=[],d=[];if(this.$header=this.$el.find(">thead"),this.$header.length||(this.$header=a("<thead></thead>").appendTo(this.$el)),this.$header.find("tr").each(function(){var b=[];a(this).find("th").each(function(){"undefined"!=typeof a(this).data("field")&&a(this).data("field",a(this).data("field")+""),b.push(a.extend({},{title:a(this).html(),"class":a(this).attr("class"),titleTooltip:a(this).attr("title"),rowspan:a(this).attr("rowspan")?+a(this).attr("rowspan"):void 0,colspan:a(this).attr("colspan")?+a(this).attr("colspan"):void 0},a(this).data()))}),c.push(b)}),a.isArray(this.options.columns[0])||(this.options.columns=[this.options.columns]),this.options.columns=a.extend(!0,[],c,this.options.columns),this.columns=[],f(this.options.columns),a.each(this.options.columns,function(c,d){a.each(d,function(d,e){e=a.extend({},o.COLUMN_DEFAULTS,e),"undefined"!=typeof e.fieldIndex&&(b.columns[e.fieldIndex]=e),b.options.columns[c][d]=e})}),!this.options.data.length){var e=[];this.$el.find(">tbody>tr").each(function(c){var f={};f._id=a(this).attr("id"),f._class=a(this).attr("class"),f._data=k(a(this).data()),a(this).find(">td").each(function(d){for(var g,h,i=a(this),j=+i.attr("colspan")||1,l=+i.attr("rowspan")||1;e[c]&&e[c][d];d++);for(g=d;d+j>g;g++)for(h=c;c+l>h;h++)e[h]||(e[h]=[]),e[h][g]=!0;var m=b.columns[d].field;f[m]=a(this).html(),f["_"+m+"_id"]=a(this).attr("id"),f["_"+m+"_class"]=a(this).attr("class"),f["_"+m+"_rowspan"]=a(this).attr("rowspan"),f["_"+m+"_colspan"]=a(this).attr("colspan"),f["_"+m+"_title"]=a(this).attr("title"),f["_"+m+"_data"]=k(a(this).data())}),d.push(f)}),this.options.data=d,d.length&&(this.fromHtml=!0)}},o.prototype.initHeader=function(){var b=this,d={},e=[];this.header={fields:[],styles:[],classes:[],formatters:[],events:[],sorters:[],sortNames:[],cellStyles:[],searchables:[]},a.each(this.options.columns,function(f,g){e.push("<tr>"),0===f&&!b.options.cardView&&b.options.detailView&&e.push(c('<th class="detail" rowspan="%s"><div class="fht-cell"></div></th>',b.options.columns.length)),a.each(g,function(a,f){var g="",h="",i="",k="",l=c(' class="%s"',f["class"]),m=(b.options.sortOrder||f.order,"px"),n=f.width;if(void 0===f.width||b.options.cardView||"string"==typeof f.width&&-1!==f.width.indexOf("%")&&(m="%"),f.width&&"string"==typeof f.width&&(n=f.width.replace("%","").replace("px","")),h=c("text-align: %s; ",f.halign?f.halign:f.align),i=c("text-align: %s; ",f.align),k=c("vertical-align: %s; ",f.valign),k+=c("width: %s; ",!f.checkbox&&!f.radio||n?n?n+m:void 0:"36px"),"undefined"!=typeof f.fieldIndex){if(b.header.fields[f.fieldIndex]=f.field,b.header.styles[f.fieldIndex]=i+k,b.header.classes[f.fieldIndex]=l,b.header.formatters[f.fieldIndex]=f.formatter,b.header.events[f.fieldIndex]=f.events,b.header.sorters[f.fieldIndex]=f.sorter,b.header.sortNames[f.fieldIndex]=f.sortName,b.header.cellStyles[f.fieldIndex]=f.cellStyle,b.header.searchables[f.fieldIndex]=f.searchable,!f.visible)return;if(b.options.cardView&&!f.cardVisible)return;d[f.field]=f}e.push("<th"+c(' title="%s"',f.titleTooltip),f.checkbox||f.radio?c(' class="bs-checkbox %s"',f["class"]||""):l,c(' style="%s"',h+k),c(' rowspan="%s"',f.rowspan),c(' colspan="%s"',f.colspan),c(' data-field="%s"',f.field),">"),e.push(c('<div class="th-inner %s">',b.options.sortable&&f.sortable?"sortable both":"")),g=b.options.escape?j(f.title):f.title,f.checkbox&&(!b.options.singleSelect&&b.options.checkboxHeader&&(g='<input name="btSelectAll" type="checkbox" />'),b.header.stateField=f.field),f.radio&&(g="",b.header.stateField=f.field,b.options.singleSelect=!0),e.push(g),e.push("</div>"),e.push('<div class="fht-cell"></div>'),e.push("</div>"),e.push("</th>")}),e.push("</tr>")}),this.$header.html(e.join("")),this.$header.find("th[data-field]").each(function(){a(this).data(d[a(this).data("field")])}),this.$container.off("click",".th-inner").on("click",".th-inner",function(c){var d=a(this);return b.options.detailView&&d.closest(".bootstrap-table")[0]!==b.$container[0]?!1:void(b.options.sortable&&d.parent().data().sortable&&b.onSort(c))}),this.$header.children().children().off("keypress").on("keypress",function(c){if(b.options.sortable&&a(this).data().sortable){var d=c.keyCode||c.which;13==d&&b.onSort(c)}}),a(window).off("resize.bootstrap-table"),!this.options.showHeader||this.options.cardView?(this.$header.hide(),this.$tableHeader.hide(),this.$tableLoading.css("top",0)):(this.$header.show(),this.$tableHeader.show(),this.$tableLoading.css("top",this.$header.outerHeight()+1),this.getCaret(),a(window).on("resize.bootstrap-table",a.proxy(this.resetWidth,this))),this.$selectAll=this.$header.find('[name="btSelectAll"]'),this.$selectAll.off("click").on("click",function(){var c=a(this).prop("checked");b[c?"checkAll":"uncheckAll"](),b.updateSelected()})},o.prototype.initFooter=function(){!this.options.showFooter||this.options.cardView?this.$tableFooter.hide():this.$tableFooter.show()},o.prototype.initData=function(a,b){this.data="append"===b?this.data.concat(a):"prepend"===b?[].concat(a).concat(this.data):a||this.options.data,this.options.data="append"===b?this.options.data.concat(a):"prepend"===b?[].concat(a).concat(this.options.data):this.data,"server"!==this.options.sidePagination&&this.initSort()},o.prototype.initSort=function(){var b=this,d=this.options.sortName,e="desc"===this.options.sortOrder?-1:1,f=a.inArray(this.options.sortName,this.header.fields),g=0;return this.options.customSort!==a.noop?void this.options.customSort.apply(this,[this.options.sortName,this.options.sortOrder]):void(-1!==f&&(this.options.sortStable&&a.each(this.data,function(a,b){b.hasOwnProperty("_position")||(b._position=a)}),this.data.sort(function(c,g){b.header.sortNames[f]&&(d=b.header.sortNames[f]);var i=l(c,d,b.options.escape),j=l(g,d,b.options.escape),k=h(b.header,b.header.sorters[f],[i,j]);return void 0!==k?e*k:((void 0===i||null===i)&&(i=""),(void 0===j||null===j)&&(j=""),b.options.sortStable&&i===j&&(i=c._position,j=g._position),a.isNumeric(i)&&a.isNumeric(j)?(i=parseFloat(i),j=parseFloat(j),j>i?-1*e:e):i===j?0:("string"!=typeof i&&(i=i.toString()),-1===i.localeCompare(j)?-1*e:e))}),void 0!==this.options.sortClass&&(clearTimeout(g),g=setTimeout(function(){b.$el.removeClass(b.options.sortClass);var a=b.$header.find(c('[data-field="%s"]',b.options.sortName).index()+1);b.$el.find(c("tr td:nth-child(%s)",a)).addClass(b.options.sortClass)},250))))},o.prototype.onSort=function(b){var c="keypress"===b.type?a(b.currentTarget):a(b.currentTarget).parent(),d=this.$header.find("th").eq(c.index());return this.$header.add(this.$header_).find("span.order").remove(),this.options.sortName===c.data("field")?this.options.sortOrder="asc"===this.options.sortOrder?"desc":"asc":(this.options.sortName=c.data("field"),this.options.sortOrder="asc"===c.data("order")?"desc":"asc"),this.trigger("sort",this.options.sortName,this.options.sortOrder),c.add(d).data("order",this.options.sortOrder),this.getCaret(),"server"===this.options.sidePagination?void this.initServer(this.options.silentSort):(this.initSort(),void this.initBody())},o.prototype.initToolbar=function(){var b,d,e=this,f=[],g=0,i=0;this.$toolbar.find(".bs-bars").children().length&&a("body").append(a(this.options.toolbar)),this.$toolbar.html(""),("string"==typeof this.options.toolbar||"object"==typeof this.options.toolbar)&&a(c('<div class="bs-bars pull-%s"></div>',this.options.toolbarAlign)).appendTo(this.$toolbar).append(a(this.options.toolbar)),f=[c('<div class="columns columns-%s btn-group pull-%s">',this.options.buttonsAlign,this.options.buttonsAlign)],"string"==typeof this.options.icons&&(this.options.icons=h(null,this.options.icons)),this.options.showPaginationSwitch&&f.push(c('<button class="btn'+c(" btn-%s",this.options.buttonsClass)+c(" btn-%s",this.options.iconSize)+'" type="button" name="paginationSwitch" aria-label="pagination Switch" title="%s">',this.options.formatPaginationSwitch()),c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.paginationSwitchDown),"</button>"),this.options.showRefresh&&f.push(c('<button class="btn'+c(" btn-%s",this.options.buttonsClass)+c(" btn-%s",this.options.iconSize)+'" type="button" name="refresh" aria-label="refresh" title="%s">',this.options.formatRefresh()),c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.refresh),"</button>"),this.options.showToggle&&f.push(c('<button class="btn'+c(" btn-%s",this.options.buttonsClass)+c(" btn-%s",this.options.iconSize)+'" type="button" name="toggle" aria-label="toggle" title="%s">',this.options.formatToggle()),c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.toggle),"</button>"),this.options.showColumns&&(f.push(c('<div class="keep-open btn-group" title="%s">',this.options.formatColumns()),'<button type="button" aria-label="columns" class="btn'+c(" btn-%s",this.options.buttonsClass)+c(" btn-%s",this.options.iconSize)+' dropdown-toggle" data-toggle="dropdown">',c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.columns),' <span class="caret"></span>',"</button>",'<ul class="dropdown-menu" role="menu">'),a.each(this.columns,function(a,b){if(!(b.radio||b.checkbox||e.options.cardView&&!b.cardVisible)){var d=b.visible?' checked="checked"':"";b.switchable&&(f.push(c('<li role="menuitem"><label><input type="checkbox" data-field="%s" value="%s"%s> %s</label></li>',b.field,a,d,b.title)),i++)}}),f.push("</ul>","</div>")),f.push("</div>"),(this.showToolbar||f.length>2)&&this.$toolbar.append(f.join("")),this.options.showPaginationSwitch&&this.$toolbar.find('button[name="paginationSwitch"]').off("click").on("click",a.proxy(this.togglePagination,this)),this.options.showRefresh&&this.$toolbar.find('button[name="refresh"]').off("click").on("click",a.proxy(this.refresh,this)),this.options.showToggle&&this.$toolbar.find('button[name="toggle"]').off("click").on("click",function(){e.toggleView()}),this.options.showColumns&&(b=this.$toolbar.find(".keep-open"),i<=this.options.minimumCountColumns&&b.find("input").prop("disabled",!0),b.find("li").off("click").on("click",function(a){a.stopImmediatePropagation()}),b.find("input").off("click").on("click",function(){var b=a(this);e.toggleColumn(a(this).val(),b.prop("checked"),!1),e.trigger("column-switch",a(this).data("field"),b.prop("checked"))})),this.options.search&&(f=[],f.push('<div class="pull-'+this.options.searchAlign+' search">',c('<input class="form-control'+c(" input-%s",this.options.iconSize)+'" type="text" placeholder="%s">',this.options.formatSearch()),"</div>"),this.$toolbar.append(f.join("")),d=this.$toolbar.find(".search input"),d.off("keyup drop blur").on("keyup drop blur",function(b){e.options.searchOnEnterKey&&13!==b.keyCode||a.inArray(b.keyCode,[37,38,39,40])>-1||(clearTimeout(g),g=setTimeout(function(){e.onSearch(b)},e.options.searchTimeOut))}),m()&&d.off("mouseup").on("mouseup",function(a){clearTimeout(g),g=setTimeout(function(){e.onSearch(a)},e.options.searchTimeOut)}))},o.prototype.onSearch=function(b){var c=a.trim(a(b.currentTarget).val());this.options.trimOnSearch&&a(b.currentTarget).val()!==c&&a(b.currentTarget).val(c),c!==this.searchText&&(this.searchText=c,this.options.searchText=c,this.options.pageNumber=1,this.initSearch(),this.updatePagination(),this.trigger("search",c))},o.prototype.initSearch=function(){var b=this;if("server"!==this.options.sidePagination){if(this.options.customSearch!==a.noop)return void this.options.customSearch.apply(this,[this.searchText]);var c=this.searchText&&(this.options.escape?j(this.searchText):this.searchText).toLowerCase(),d=a.isEmptyObject(this.filterColumns)?null:this.filterColumns;this.data=d?a.grep(this.options.data,function(b){for(var c in d)if(a.isArray(d[c])&&-1===a.inArray(b[c],d[c])||!a.isArray(d[c])&&b[c]!==d[c])return!1;return!0}):this.options.data,this.data=c?a.grep(this.data,function(d,f){for(var g=0;g<b.header.fields.length;g++)if(b.header.searchables[g]){var i,j=a.isNumeric(b.header.fields[g])?parseInt(b.header.fields[g],10):b.header.fields[g],k=b.columns[e(b.columns,j)];if("string"==typeof j){i=d;for(var l=j.split("."),m=0;m<l.length;m++)i=i[l[m]];k&&k.searchFormatter&&(i=h(k,b.header.formatters[g],[i,d,f],i))}else i=d[j];if("string"==typeof i||"number"==typeof i)if(b.options.strictSearch){if((i+"").toLowerCase()===c)return!0}else if(-1!==(i+"").toLowerCase().indexOf(c))return!0}return!1}):this.data}},o.prototype.initPagination=function(){if(!this.options.pagination)return void this.$pagination.hide();this.$pagination.show();var b,d,e,f,g,h,i,j,k,l=this,m=[],n=!1,o=this.getData(),p=this.options.pageList;if("server"!==this.options.sidePagination&&(this.options.totalRows=o.length),this.totalPages=0,this.options.totalRows){if(this.options.pageSize===this.options.formatAllRows())this.options.pageSize=this.options.totalRows,n=!0;else if(this.options.pageSize===this.options.totalRows){var q="string"==typeof this.options.pageList?this.options.pageList.replace("[","").replace("]","").replace(/ /g,"").toLowerCase().split(","):this.options.pageList;a.inArray(this.options.formatAllRows().toLowerCase(),q)>-1&&(n=!0)}this.totalPages=~~((this.options.totalRows-1)/this.options.pageSize)+1,this.options.totalPages=this.totalPages}if(this.totalPages>0&&this.options.pageNumber>this.totalPages&&(this.options.pageNumber=this.totalPages),this.pageFrom=(this.options.pageNumber-1)*this.options.pageSize+1,this.pageTo=this.options.pageNumber*this.options.pageSize,this.pageTo>this.options.totalRows&&(this.pageTo=this.options.totalRows),m.push('<div class="pull-'+this.options.paginationDetailHAlign+' pagination-detail">','<span class="pagination-info">',this.options.onlyInfoPagination?this.options.formatDetailPagination(this.options.totalRows):this.options.formatShowingRows(this.pageFrom,this.pageTo,this.options.totalRows),"</span>"),!this.options.onlyInfoPagination){m.push('<span class="page-list">');var r=[c('<span class="btn-group %s">',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?"dropdown":"dropup"),'<button type="button" class="btn'+c(" btn-%s",this.options.buttonsClass)+c(" btn-%s",this.options.iconSize)+' dropdown-toggle" data-toggle="dropdown">','<span class="page-size">',n?this.options.formatAllRows():this.options.pageSize,"</span>",' <span class="caret"></span>',"</button>",'<ul class="dropdown-menu" role="menu">'];if("string"==typeof this.options.pageList){var s=this.options.pageList.replace("[","").replace("]","").replace(/ /g,"").split(",");p=[],a.each(s,function(a,b){p.push(b.toUpperCase()===l.options.formatAllRows().toUpperCase()?l.options.formatAllRows():+b)})}for(a.each(p,function(a,b){if(!l.options.smartDisplay||0===a||p[a-1]<l.options.totalRows){var d;d=n?b===l.options.formatAllRows()?' class="active"':"":b===l.options.pageSize?' class="active"':"",r.push(c('<li role="menuitem"%s><a href="#">%s</a></li>',d,b))}}),r.push("</ul></span>"),m.push(this.options.formatRecordsPerPage(r.join(""))),m.push("</span>"),m.push("</div>",'<div class="pull-'+this.options.paginationHAlign+' pagination">','<ul class="pagination'+c(" pagination-%s",this.options.iconSize)+'">','<li class="page-pre"><a href="#">'+this.options.paginationPreText+"</a></li>"),this.totalPages<5?(d=1,e=this.totalPages):(d=this.options.pageNumber-2,e=d+4,1>d&&(d=1,e=5),e>this.totalPages&&(e=this.totalPages,d=e-4)),this.totalPages>=6&&(this.options.pageNumber>=3&&(m.push('<li class="page-first'+(1===this.options.pageNumber?" active":"")+'">','<a href="#">',1,"</a>","</li>"),d++),this.options.pageNumber>=4&&(4==this.options.pageNumber||6==this.totalPages||7==this.totalPages?d--:m.push('<li class="page-first-separator disabled">','<a href="#">...</a>',"</li>"),e--)),this.totalPages>=7&&this.options.pageNumber>=this.totalPages-2&&d--,6==this.totalPages?this.options.pageNumber>=this.totalPages-2&&e++:this.totalPages>=7&&(7==this.totalPages||this.options.pageNumber>=this.totalPages-3)&&e++,b=d;e>=b;b++)m.push('<li class="page-number'+(b===this.options.pageNumber?" active":"")+'">','<a href="#">',b,"</a>","</li>");this.totalPages>=8&&this.options.pageNumber<=this.totalPages-4&&m.push('<li class="page-last-separator disabled">','<a href="#">...</a>',"</li>"),this.totalPages>=6&&this.options.pageNumber<=this.totalPages-3&&m.push('<li class="page-last'+(this.totalPages===this.options.pageNumber?" active":"")+'">','<a href="#">',this.totalPages,"</a>","</li>"),m.push('<li class="page-next"><a href="#">'+this.options.paginationNextText+"</a></li>","</ul>","</div>")}this.$pagination.html(m.join("")),this.options.onlyInfoPagination||(f=this.$pagination.find(".page-list a"),g=this.$pagination.find(".page-first"),h=this.$pagination.find(".page-pre"),i=this.$pagination.find(".page-next"),j=this.$pagination.find(".page-last"),k=this.$pagination.find(".page-number"),this.options.smartDisplay&&(this.totalPages<=1&&this.$pagination.find("div.pagination").hide(),(p.length<2||this.options.totalRows<=p[0])&&this.$pagination.find("span.page-list").hide(),this.$pagination[this.getData().length?"show":"hide"]()),this.options.paginationLoop||(1===this.options.pageNumber&&h.addClass("disabled"),this.options.pageNumber===this.totalPages&&i.addClass("disabled")),n&&(this.options.pageSize=this.options.formatAllRows()),f.off("click").on("click",a.proxy(this.onPageListChange,this)),g.off("click").on("click",a.proxy(this.onPageFirst,this)),h.off("click").on("click",a.proxy(this.onPagePre,this)),i.off("click").on("click",a.proxy(this.onPageNext,this)),j.off("click").on("click",a.proxy(this.onPageLast,this)),k.off("click").on("click",a.proxy(this.onPageNumber,this)))},o.prototype.updatePagination=function(b){b&&a(b.currentTarget).hasClass("disabled")||(this.options.maintainSelected||this.resetRows(),this.initPagination(),"server"===this.options.sidePagination?this.initServer():this.initBody(),this.trigger("page-change",this.options.pageNumber,this.options.pageSize))},o.prototype.onPageListChange=function(b){var c=a(b.currentTarget);return c.parent().addClass("active").siblings().removeClass("active"),this.options.pageSize=c.text().toUpperCase()===this.options.formatAllRows().toUpperCase()?this.options.formatAllRows():+c.text(),this.$toolbar.find(".page-size").text(this.options.pageSize),this.updatePagination(b),!1},o.prototype.onPageFirst=function(a){return this.options.pageNumber=1,this.updatePagination(a),!1},o.prototype.onPagePre=function(a){return this.options.pageNumber-1===0?this.options.pageNumber=this.options.totalPages:this.options.pageNumber--,this.updatePagination(a),!1},o.prototype.onPageNext=function(a){return this.options.pageNumber+1>this.options.totalPages?this.options.pageNumber=1:this.options.pageNumber++,this.updatePagination(a),!1},o.prototype.onPageLast=function(a){return this.options.pageNumber=this.totalPages,this.updatePagination(a),!1},o.prototype.onPageNumber=function(b){return this.options.pageNumber!==+a(b.currentTarget).text()?(this.options.pageNumber=+a(b.currentTarget).text(),this.updatePagination(b),!1):void 0},o.prototype.initRow=function(b,e){var f,g=this,i=[],k={},m=[],n="",o={},p=[];if(!(a.inArray(b,this.hiddenRows)>-1)){if(k=h(this.options,this.options.rowStyle,[b,e],k),k&&k.css)for(f in k.css)m.push(f+": "+k.css[f]);if(o=h(this.options,this.options.rowAttributes,[b,e],o))for(f in o)p.push(c('%s="%s"',f,j(o[f])));return b._data&&!a.isEmptyObject(b._data)&&a.each(b._data,function(a,b){"index"!==a&&(n+=c(' data-%s="%s"',a,b))}),i.push("<tr",c(" %s",p.join(" ")),c(' id="%s"',a.isArray(b)?void 0:b._id),c(' class="%s"',k.classes||(a.isArray(b)?void 0:b._class)),c(' data-index="%s"',e),c(' data-uniqueid="%s"',b[this.options.uniqueId]),c("%s",n),">"),this.options.cardView&&i.push(c('<td colspan="%s"><div class="card-views">',this.header.fields.length)),!this.options.cardView&&this.options.detailView&&i.push("<td>",'<a class="detail-icon" href="#">',c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.detailOpen),"</a>","</td>"),a.each(this.header.fields,function(f,n){var o="",p=l(b,n,g.options.escape),q="",r="",s={},t="",u=g.header.classes[f],v="",w="",x="",y="",z=g.columns[f];if(!(g.fromHtml&&"undefined"==typeof p||!z.visible||g.options.cardView&&!z.cardVisible)){if(z.escape&&(p=j(p)),k=c('style="%s"',m.concat(g.header.styles[f]).join("; ")),b["_"+n+"_id"]&&(t=c(' id="%s"',b["_"+n+"_id"])),b["_"+n+"_class"]&&(u=c(' class="%s"',b["_"+n+"_class"])),b["_"+n+"_rowspan"]&&(w=c(' rowspan="%s"',b["_"+n+"_rowspan"])),b["_"+n+"_colspan"]&&(x=c(' colspan="%s"',b["_"+n+"_colspan"])),b["_"+n+"_title"]&&(y=c(' title="%s"',b["_"+n+"_title"])),s=h(g.header,g.header.cellStyles[f],[p,b,e,n],s),s.classes&&(u=c(' class="%s"',s.classes)),s.css){var A=[];for(var B in s.css)A.push(B+": "+s.css[B]);k=c('style="%s"',A.concat(g.header.styles[f]).join("; "))}q=h(z,g.header.formatters[f],[p,b,e],p),b["_"+n+"_data"]&&!a.isEmptyObject(b["_"+n+"_data"])&&a.each(b["_"+n+"_data"],function(a,b){"index"!==a&&(v+=c(' data-%s="%s"',a,b))}),z.checkbox||z.radio?(r=z.checkbox?"checkbox":r,r=z.radio?"radio":r,o=[c(g.options.cardView?'<div class="card-view %s">':'<td class="bs-checkbox %s">',z["class"]||""),"<input"+c(' data-index="%s"',e)+c(' name="%s"',g.options.selectItemName)+c(' type="%s"',r)+c(' value="%s"',b[g.options.idField])+c(' checked="%s"',q===!0||p||q&&q.checked?"checked":void 0)+c(' disabled="%s"',!z.checkboxEnabled||q&&q.disabled?"disabled":void 0)+" />",g.header.formatters[f]&&"string"==typeof q?q:"",g.options.cardView?"</div>":"</td>"].join(""),b[g.header.stateField]=q===!0||q&&q.checked):(q="undefined"==typeof q||null===q?g.options.undefinedText:q,o=g.options.cardView?['<div class="card-view">',g.options.showHeader?c('<span class="title" %s>%s</span>',k,d(g.columns,"field","title",n)):"",c('<span class="value">%s</span>',q),"</div>"].join(""):[c("<td%s %s %s %s %s %s %s>",t,u,k,v,w,x,y),q,"</td>"].join(""),g.options.cardView&&g.options.smartDisplay&&""===q&&(o='<div class="card-view"></div>')),i.push(o)}}),this.options.cardView&&i.push("</div></td>"),i.push("</tr>"),i.join(" ")}},o.prototype.initBody=function(b){var d=this,f=this.getData();this.trigger("pre-body",f),this.$body=this.$el.find(">tbody"),this.$body.length||(this.$body=a("<tbody></tbody>").appendTo(this.$el)),this.options.pagination&&"server"!==this.options.sidePagination||(this.pageFrom=1,this.pageTo=f.length);for(var g,i=a(document.createDocumentFragment()),j=this.pageFrom-1;j<this.pageTo;j++){
+var k=f[j],m=this.initRow(k,j,f,i);g=g||!!m,m&&m!==!0&&i.append(m)}g||i.append('<tr class="no-records-found">'+c('<td colspan="%s">%s</td>',this.$header.find("th").length,this.options.formatNoMatches())+"</tr>"),this.$body.html(i),b||this.scrollTo(0),this.$body.find("> tr[data-index] > td").off("click dblclick").on("click dblclick",function(b){var f=a(this),g=f.parent(),h=d.data[g.data("index")],i=f[0].cellIndex,j=d.getVisibleFields(),k=j[d.options.detailView&&!d.options.cardView?i-1:i],m=d.columns[e(d.columns,k)],n=l(h,k,d.options.escape);if(!f.find(".detail-icon").length&&(d.trigger("click"===b.type?"click-cell":"dbl-click-cell",k,n,h,f),d.trigger("click"===b.type?"click-row":"dbl-click-row",h,g,k),"click"===b.type&&d.options.clickToSelect&&m.clickToSelect)){var o=g.find(c('[name="%s"]',d.options.selectItemName));o.length&&o[0].click()}}),this.$body.find("> tr[data-index] > td > .detail-icon").off("click").on("click",function(){var b=a(this),e=b.parent().parent(),g=e.data("index"),i=f[g];if(e.next().is("tr.detail-view"))b.find("i").attr("class",c("%s %s",d.options.iconsPrefix,d.options.icons.detailOpen)),d.trigger("collapse-row",g,i),e.next().remove();else{b.find("i").attr("class",c("%s %s",d.options.iconsPrefix,d.options.icons.detailClose)),e.after(c('<tr class="detail-view"><td colspan="%s"></td></tr>',e.find("td").length));var j=e.next().find("td"),k=h(d.options,d.options.detailFormatter,[g,i,j],"");1===j.length&&j.append(k),d.trigger("expand-row",g,i,j)}return d.resetView(),!1}),this.$selectItem=this.$body.find(c('[name="%s"]',this.options.selectItemName)),this.$selectItem.off("click").on("click",function(b){b.stopImmediatePropagation();var c=a(this),e=c.prop("checked"),f=d.data[c.data("index")];d.options.maintainSelected&&a(this).is(":radio")&&a.each(d.options.data,function(a,b){b[d.header.stateField]=!1}),f[d.header.stateField]=e,d.options.singleSelect&&(d.$selectItem.not(this).each(function(){d.data[a(this).data("index")][d.header.stateField]=!1}),d.$selectItem.filter(":checked").not(this).prop("checked",!1)),d.updateSelected(),d.trigger(e?"check":"uncheck",f,c)}),a.each(this.header.events,function(b,c){if(c){"string"==typeof c&&(c=h(null,c));var e=d.header.fields[b],f=a.inArray(e,d.getVisibleFields());d.options.detailView&&!d.options.cardView&&(f+=1);for(var g in c)d.$body.find(">tr:not(.no-records-found)").each(function(){var b=a(this),h=b.find(d.options.cardView?".card-view":"td").eq(f),i=g.indexOf(" "),j=g.substring(0,i),k=g.substring(i+1),l=c[g];h.find(k).off(j).on(j,function(a){var c=b.data("index"),f=d.data[c],g=f[e];l.apply(this,[a,g,f,c])})})}}),this.updateSelected(),this.resetView(),this.trigger("post-body",f)},o.prototype.initServer=function(b,c,d){var e,f=this,g={},i={searchText:this.searchText,sortName:this.options.sortName,sortOrder:this.options.sortOrder};this.options.pagination&&(i.pageSize=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,i.pageNumber=this.options.pageNumber),(d||this.options.url||this.options.ajax)&&("limit"===this.options.queryParamsType&&(i={search:i.searchText,sort:i.sortName,order:i.sortOrder},this.options.pagination&&(i.offset=this.options.pageSize===this.options.formatAllRows()?0:this.options.pageSize*(this.options.pageNumber-1),i.limit=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize)),a.isEmptyObject(this.filterColumnsPartial)||(i.filter=JSON.stringify(this.filterColumnsPartial,null)),g=h(this.options,this.options.queryParams,[i],g),a.extend(g,c||{}),g!==!1&&(b||this.$tableLoading.show(),e=a.extend({},h(null,this.options.ajaxOptions),{type:this.options.method,url:d||this.options.url,data:"application/json"===this.options.contentType&&"post"===this.options.method?JSON.stringify(g):g,cache:this.options.cache,contentType:this.options.contentType,dataType:this.options.dataType,success:function(a){a=h(f.options,f.options.responseHandler,[a],a),f.load(a),f.trigger("load-success",a),b||f.$tableLoading.hide()},error:function(a){f.trigger("load-error",a.status,a),b||f.$tableLoading.hide()}}),this.options.ajax?h(this,this.options.ajax,[e],null):(this._xhr&&4!==this._xhr.readyState&&this._xhr.abort(),this._xhr=a.ajax(e))))},o.prototype.initSearchText=function(){if(this.options.search&&""!==this.options.searchText){var a=this.$toolbar.find(".search input");a.val(this.options.searchText),this.onSearch({currentTarget:a})}},o.prototype.getCaret=function(){var b=this;a.each(this.$header.find("th"),function(c,d){a(d).find(".sortable").removeClass("desc asc").addClass(a(d).data("field")===b.options.sortName?b.options.sortOrder:"both")})},o.prototype.updateSelected=function(){var b=this.$selectItem.filter(":enabled").length&&this.$selectItem.filter(":enabled").length===this.$selectItem.filter(":enabled").filter(":checked").length;this.$selectAll.add(this.$selectAll_).prop("checked",b),this.$selectItem.each(function(){a(this).closest("tr")[a(this).prop("checked")?"addClass":"removeClass"]("selected")})},o.prototype.updateRows=function(){var b=this;this.$selectItem.each(function(){b.data[a(this).data("index")][b.header.stateField]=a(this).prop("checked")})},o.prototype.resetRows=function(){var b=this;a.each(this.data,function(a,c){b.$selectAll.prop("checked",!1),b.$selectItem.prop("checked",!1),b.header.stateField&&(c[b.header.stateField]=!1)}),this.initHiddenRows()},o.prototype.trigger=function(b){var c=Array.prototype.slice.call(arguments,1);b+=".bs.table",this.options[o.EVENTS[b]].apply(this.options,c),this.$el.trigger(a.Event(b),c),this.options.onAll(b,c),this.$el.trigger(a.Event("all.bs.table"),[b,c])},o.prototype.resetHeader=function(){clearTimeout(this.timeoutId_),this.timeoutId_=setTimeout(a.proxy(this.fitHeader,this),this.$el.is(":hidden")?100:0)},o.prototype.fitHeader=function(){var b,d,e,f,h=this;if(h.$el.is(":hidden"))return void(h.timeoutId_=setTimeout(a.proxy(h.fitHeader,h),100));if(b=this.$tableBody.get(0),d=b.scrollWidth>b.clientWidth&&b.scrollHeight>b.clientHeight+this.$header.outerHeight()?g():0,this.$el.css("margin-top",-this.$header.outerHeight()),e=a(":focus"),e.length>0){var i=e.parents("th");if(i.length>0){var j=i.attr("data-field");if(void 0!==j){var k=this.$header.find("[data-field='"+j+"']");k.length>0&&k.find(":input").addClass("focus-temp")}}}this.$header_=this.$header.clone(!0,!0),this.$selectAll_=this.$header_.find('[name="btSelectAll"]'),this.$tableHeader.css({"margin-right":d}).find("table").css("width",this.$el.outerWidth()).html("").attr("class",this.$el.attr("class")).append(this.$header_),f=a(".focus-temp:visible:eq(0)"),f.length>0&&(f.focus(),this.$header.find(".focus-temp").removeClass("focus-temp")),this.$header.find("th[data-field]").each(function(){h.$header_.find(c('th[data-field="%s"]',a(this).data("field"))).data(a(this).data())});var l=this.getVisibleFields(),m=this.$header_.find("th");this.$body.find(">tr:first-child:not(.no-records-found) > *").each(function(b){var d=a(this),e=b;h.options.detailView&&!h.options.cardView&&(0===b&&h.$header_.find("th.detail").find(".fht-cell").width(d.innerWidth()),e=b-1);var f=h.$header_.find(c('th[data-field="%s"]',l[e]));f.length>1&&(f=a(m[d[0].cellIndex])),f.find(".fht-cell").width(d.innerWidth())}),this.$tableBody.off("scroll").on("scroll",function(){h.$tableHeader.scrollLeft(a(this).scrollLeft()),h.options.showFooter&&!h.options.cardView&&h.$tableFooter.scrollLeft(a(this).scrollLeft())}),h.trigger("post-header")},o.prototype.resetFooter=function(){var b=this,d=b.getData(),e=[];this.options.showFooter&&!this.options.cardView&&(!this.options.cardView&&this.options.detailView&&e.push('<td><div class="th-inner">&nbsp;</div><div class="fht-cell"></div></td>'),a.each(this.columns,function(a,f){var g,i="",j="",k=[],l={},m=c(' class="%s"',f["class"]);if(f.visible&&(!b.options.cardView||f.cardVisible)){if(i=c("text-align: %s; ",f.falign?f.falign:f.align),j=c("vertical-align: %s; ",f.valign),l=h(null,b.options.footerStyle),l&&l.css)for(g in l.css)k.push(g+": "+l.css[g]);e.push("<td",m,c(' style="%s"',i+j+k.concat().join("; ")),">"),e.push('<div class="th-inner">'),e.push(h(f,f.footerFormatter,[d],"&nbsp;")||"&nbsp;"),e.push("</div>"),e.push('<div class="fht-cell"></div>'),e.push("</div>"),e.push("</td>")}}),this.$tableFooter.find("tr").html(e.join("")),this.$tableFooter.show(),clearTimeout(this.timeoutFooter_),this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),this.$el.is(":hidden")?100:0))},o.prototype.fitFooter=function(){var b,c,d;return clearTimeout(this.timeoutFooter_),this.$el.is(":hidden")?void(this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),100)):(c=this.$el.css("width"),d=c>this.$tableBody.width()?g():0,this.$tableFooter.css({"margin-right":d}).find("table").css("width",c).attr("class",this.$el.attr("class")),b=this.$tableFooter.find("td"),void this.$body.find(">tr:first-child:not(.no-records-found) > *").each(function(c){var d=a(this);b.eq(c).find(".fht-cell").width(d.innerWidth())}))},o.prototype.toggleColumn=function(a,b,d){if(-1!==a&&(this.columns[a].visible=b,this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns)){var e=this.$toolbar.find(".keep-open input").prop("disabled",!1);d&&e.filter(c('[value="%s"]',a)).prop("checked",b),e.filter(":checked").length<=this.options.minimumCountColumns&&e.filter(":checked").prop("disabled",!0)}},o.prototype.getVisibleFields=function(){var b=this,c=[];return a.each(this.header.fields,function(a,d){var f=b.columns[e(b.columns,d)];f.visible&&c.push(d)}),c},o.prototype.resetView=function(a){var b=0;if(a&&a.height&&(this.options.height=a.height),this.$selectAll.prop("checked",this.$selectItem.length>0&&this.$selectItem.length===this.$selectItem.filter(":checked").length),this.options.height){var c=this.$toolbar.outerHeight(!0),d=this.$pagination.outerHeight(!0),e=this.options.height-c-d;this.$tableContainer.css("height",e+"px")}return this.options.cardView?(this.$el.css("margin-top","0"),this.$tableContainer.css("padding-bottom","0"),void this.$tableFooter.hide()):(this.options.showHeader&&this.options.height?(this.$tableHeader.show()/*,this.resetHeader(),b+=this.$header.outerHeight()*/):(this.$tableHeader.hide(),this.trigger("post-header")),this.options.showFooter&&(this.resetFooter(),this.options.height&&(b+=this.$tableFooter.outerHeight()+1)),this.getCaret(),this.$tableContainer.css("padding-bottom",b+"px"),void this.trigger("reset-view"))},o.prototype.getData=function(b){return!this.searchText&&a.isEmptyObject(this.filterColumns)&&a.isEmptyObject(this.filterColumnsPartial)?b?this.options.data.slice(this.pageFrom-1,this.pageTo):this.options.data:b?this.data.slice(this.pageFrom-1,this.pageTo):this.data},o.prototype.load=function(b){var c=!1;"server"===this.options.sidePagination?(this.options.totalRows=b[this.options.totalField],c=b.fixedScroll,b=b[this.options.dataField]):a.isArray(b)||(c=b.fixedScroll,b=b.data),this.initData(b),this.initSearch(),this.initPagination(),this.initBody(c)},o.prototype.append=function(a){this.initData(a,"append"),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},o.prototype.prepend=function(a){this.initData(a,"prepend"),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},o.prototype.remove=function(b){var c,d,e=this.options.data.length;if(b.hasOwnProperty("field")&&b.hasOwnProperty("values")){for(c=e-1;c>=0;c--)d=this.options.data[c],d.hasOwnProperty(b.field)&&-1!==a.inArray(d[b.field],b.values)&&(this.options.data.splice(c,1),"server"===this.options.sidePagination&&(this.options.totalRows-=1));e!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))}},o.prototype.removeAll=function(){this.options.data.length>0&&(this.options.data.splice(0,this.options.data.length),this.initSearch(),this.initPagination(),this.initBody(!0))},o.prototype.getRowByUniqueId=function(a){var b,c,d,e=this.options.uniqueId,f=this.options.data.length,g=null;for(b=f-1;b>=0;b--){if(c=this.options.data[b],c.hasOwnProperty(e))d=c[e];else{if(!c._data.hasOwnProperty(e))continue;d=c._data[e]}if("string"==typeof d?a=a.toString():"number"==typeof d&&(Number(d)===d&&d%1===0?a=parseInt(a):d===Number(d)&&0!==d&&(a=parseFloat(a))),d===a){g=c;break}}return g},o.prototype.removeByUniqueId=function(a){var b=this.options.data.length,c=this.getRowByUniqueId(a);c&&this.options.data.splice(this.options.data.indexOf(c),1),b!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initBody(!0))},o.prototype.updateByUniqueId=function(b){var c=this,d=a.isArray(b)?b:[b];a.each(d,function(b,d){var e;d.hasOwnProperty("id")&&d.hasOwnProperty("row")&&(e=a.inArray(c.getRowByUniqueId(d.id),c.options.data),-1!==e&&a.extend(c.options.data[e],d.row))}),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},o.prototype.insertRow=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("row")&&(this.data.splice(a.index,0,a.row),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))},o.prototype.updateRow=function(b){var c=this,d=a.isArray(b)?b:[b];a.each(d,function(b,d){d.hasOwnProperty("index")&&d.hasOwnProperty("row")&&a.extend(c.options.data[d.index],d.row)}),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},o.prototype.initHiddenRows=function(){this.hiddenRows=[]},o.prototype.showRow=function(a){this.toggleRow(a,!0)},o.prototype.hideRow=function(a){this.toggleRow(a,!1)},o.prototype.toggleRow=function(b,c){var d,e;b.hasOwnProperty("index")?d=this.getData()[b.index]:b.hasOwnProperty("uniqueId")&&(d=this.getRowByUniqueId(b.uniqueId)),d&&(e=a.inArray(d,this.hiddenRows),c||-1!==e?c&&e>-1&&this.hiddenRows.splice(e,1):this.hiddenRows.push(d),this.initBody(!0))},o.prototype.getHiddenRows=function(){var b=this,c=this.getData(),d=[];return a.each(c,function(c,e){a.inArray(e,b.hiddenRows)>-1&&d.push(e)}),this.hiddenRows=d,d},o.prototype.mergeCells=function(b){var c,d,e,f=b.index,g=a.inArray(b.field,this.getVisibleFields()),h=b.rowspan||1,i=b.colspan||1,j=this.$body.find(">tr");if(this.options.detailView&&!this.options.cardView&&(g+=1),e=j.eq(f).find(">td").eq(g),!(0>f||0>g||f>=this.data.length)){for(c=f;f+h>c;c++)for(d=g;g+i>d;d++)j.eq(c).find(">td").eq(d).hide();e.attr("rowspan",h).attr("colspan",i).show()}},o.prototype.updateCell=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("field")&&a.hasOwnProperty("value")&&(this.data[a.index][a.field]=a.value,a.reinit!==!1&&(this.initSort(),this.initBody(!0)))},o.prototype.getOptions=function(){return this.options},o.prototype.getSelections=function(){var b=this;return a.grep(this.options.data,function(a){return a[b.header.stateField]===!0})},o.prototype.getAllSelections=function(){var b=this;return a.grep(this.options.data,function(a){return a[b.header.stateField]})},o.prototype.checkAll=function(){this.checkAll_(!0)},o.prototype.uncheckAll=function(){this.checkAll_(!1)},o.prototype.checkInvert=function(){var b=this,c=b.$selectItem.filter(":enabled"),d=c.filter(":checked");c.each(function(){a(this).prop("checked",!a(this).prop("checked"))}),b.updateRows(),b.updateSelected(),b.trigger("uncheck-some",d),d=b.getSelections(),b.trigger("check-some",d)},o.prototype.checkAll_=function(a){var b;a||(b=this.getSelections()),this.$selectAll.add(this.$selectAll_).prop("checked",a),this.$selectItem.filter(":enabled").prop("checked",a),this.updateRows(),a&&(b=this.getSelections()),this.trigger(a?"check-all":"uncheck-all",b)},o.prototype.check=function(a){this.check_(!0,a)},o.prototype.uncheck=function(a){this.check_(!1,a)},o.prototype.check_=function(a,b){var d=this.$selectItem.filter(c('[data-index="%s"]',b)).prop("checked",a);this.data[b][this.header.stateField]=a,this.updateSelected(),this.trigger(a?"check":"uncheck",this.data[b],d)},o.prototype.checkBy=function(a){this.checkBy_(!0,a)},o.prototype.uncheckBy=function(a){this.checkBy_(!1,a)},o.prototype.checkBy_=function(b,d){if(d.hasOwnProperty("field")&&d.hasOwnProperty("values")){var e=this,f=[];a.each(this.options.data,function(g,h){if(!h.hasOwnProperty(d.field))return!1;if(-1!==a.inArray(h[d.field],d.values)){var i=e.$selectItem.filter(":enabled").filter(c('[data-index="%s"]',g)).prop("checked",b);h[e.header.stateField]=b,f.push(h),e.trigger(b?"check":"uncheck",h,i)}}),this.updateSelected(),this.trigger(b?"check-some":"uncheck-some",f)}},o.prototype.destroy=function(){this.$el.insertBefore(this.$container),a(this.options.toolbar).insertBefore(this.$el),this.$container.next().remove(),this.$container.remove(),this.$el.html(this.$el_.html()).css("margin-top","0").attr("class",this.$el_.attr("class")||"")},o.prototype.showLoading=function(){this.$tableLoading.show()},o.prototype.hideLoading=function(){this.$tableLoading.hide()},o.prototype.togglePagination=function(){this.options.pagination=!this.options.pagination;var a=this.$toolbar.find('button[name="paginationSwitch"] i');this.options.pagination?a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchDown):a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchUp),this.updatePagination()},o.prototype.refresh=function(a){a&&a.url&&(this.options.url=a.url),a&&a.pageNumber&&(this.options.pageNumber=a.pageNumber),a&&a.pageSize&&(this.options.pageSize=a.pageSize),this.initServer(a&&a.silent,a&&a.query,a&&a.url),this.trigger("refresh",a)},o.prototype.resetWidth=function(){this.options.showHeader&&this.options.height&&this.fitHeader(),this.options.showFooter&&this.fitFooter()},o.prototype.showColumn=function(a){this.toggleColumn(e(this.columns,a),!0,!0)},o.prototype.hideColumn=function(a){this.toggleColumn(e(this.columns,a),!1,!0)},o.prototype.getHiddenColumns=function(){return a.grep(this.columns,function(a){return!a.visible})},o.prototype.getVisibleColumns=function(){return a.grep(this.columns,function(a){return a.visible})},o.prototype.toggleAllColumns=function(b){if(a.each(this.columns,function(a){this.columns[a].visible=b}),this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns){var c=this.$toolbar.find(".keep-open input").prop("disabled",!1);c.filter(":checked").length<=this.options.minimumCountColumns&&c.filter(":checked").prop("disabled",!0)}},o.prototype.showAllColumns=function(){this.toggleAllColumns(!0)},o.prototype.hideAllColumns=function(){this.toggleAllColumns(!1)},o.prototype.filterBy=function(b){this.filterColumns=a.isEmptyObject(b)?{}:b,this.options.pageNumber=1,this.initSearch(),this.updatePagination()},o.prototype.scrollTo=function(a){return"string"==typeof a&&(a="bottom"===a?this.$tableBody[0].scrollHeight:0),"number"==typeof a&&this.$tableBody.scrollTop(a),"undefined"==typeof a?this.$tableBody.scrollTop():void 0},o.prototype.getScrollPosition=function(){return this.scrollTo()},o.prototype.selectPage=function(a){a>0&&a<=this.options.totalPages&&(this.options.pageNumber=a,this.updatePagination())},o.prototype.prevPage=function(){this.options.pageNumber>1&&(this.options.pageNumber--,this.updatePagination())},o.prototype.nextPage=function(){this.options.pageNumber<this.options.totalPages&&(this.options.pageNumber++,this.updatePagination())},o.prototype.toggleView=function(){this.options.cardView=!this.options.cardView,this.initHeader(),this.initBody(),this.trigger("toggle",this.options.cardView)},o.prototype.refreshOptions=function(b){i(this.options,b,!0)||(this.options=a.extend(this.options,b),this.trigger("refresh-options",this.options),this.destroy(),this.init())},o.prototype.resetSearch=function(a){var b=this.$toolbar.find(".search input");b.val(a||""),this.onSearch({currentTarget:b})},o.prototype.expandRow_=function(a,b){var d=this.$body.find(c('> tr[data-index="%s"]',b));d.next().is("tr.detail-view")===(a?!1:!0)&&d.find("> td > .detail-icon").click()},o.prototype.expandRow=function(a){this.expandRow_(!0,a)},o.prototype.collapseRow=function(a){this.expandRow_(!1,a)},o.prototype.expandAllRows=function(b){if(b){var d=this.$body.find(c('> tr[data-index="%s"]',0)),e=this,f=null,g=!1,h=-1;if(d.next().is("tr.detail-view")?d.next().next().is("tr.detail-view")||(d.next().find(".detail-icon").click(),g=!0):(d.find("> td > .detail-icon").click(),g=!0),g)try{h=setInterval(function(){f=e.$body.find("tr.detail-view").last().find(".detail-icon"),f.length>0?f.click():clearInterval(h)},1)}catch(i){clearInterval(h)}}else for(var j=this.$body.children(),k=0;k<j.length;k++)this.expandRow_(!0,a(j[k]).data("index"))},o.prototype.collapseAllRows=function(b){if(b)this.expandRow_(!1,0);else for(var c=this.$body.children(),d=0;d<c.length;d++)this.expandRow_(!1,a(c[d]).data("index"))},o.prototype.updateFormatText=function(a,b){this.options[c("format%s",a)]&&("string"==typeof b?this.options[c("format%s",a)]=function(){return b}:"function"==typeof b&&(this.options[c("format%s",a)]=b)),this.initToolbar(),this.initPagination(),this.initBody()};var p=["getOptions","getSelections","getAllSelections","getData","load","append","prepend","remove","removeAll","insertRow","updateRow","updateCell","updateByUniqueId","removeByUniqueId","getRowByUniqueId","showRow","hideRow","getHiddenRows","mergeCells","checkAll","uncheckAll","checkInvert","check","uncheck","checkBy","uncheckBy","refresh","resetView","resetWidth","destroy","showLoading","hideLoading","showColumn","hideColumn","getHiddenColumns","getVisibleColumns","showAllColumns","hideAllColumns","filterBy","scrollTo","getScrollPosition","selectPage","prevPage","nextPage","togglePagination","toggleView","refreshOptions","resetSearch","expandRow","collapseRow","expandAllRows","collapseAllRows","updateFormatText"];a.fn.bootstrapTable=function(b){var c,d=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=a(this),f=e.data("bootstrap.table"),g=a.extend({},o.DEFAULTS,e.data(),"object"==typeof b&&b);if("string"==typeof b){if(a.inArray(b,p)<0)throw new Error("Unknown method: "+b);if(!f)return;c=f[b].apply(f,d),"destroy"===b&&e.removeData("bootstrap.table")}f||e.data("bootstrap.table",f=new o(this,g))}),"undefined"==typeof c?this:c},a.fn.bootstrapTable.Constructor=o,a.fn.bootstrapTable.defaults=o.DEFAULTS,a.fn.bootstrapTable.columnDefaults=o.COLUMN_DEFAULTS,a.fn.bootstrapTable.locales=o.LOCALES,a.fn.bootstrapTable.methods=p,a.fn.bootstrapTable.utils={sprintf:c,getFieldIndex:e,compareObjects:i,calculateObjectValue:h,getItemField:l,objectKeys:n,isIEBrowser:m},a(function(){a('[data-toggle="table"]').bootstrapTable()})}(jQuery);
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.js b/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.js
new file mode 100644
index 0000000..874f340
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.js
@@ -0,0 +1,46 @@
+/**
+ * Bootstrap Table Chinese translation
+ * Author: Zhixin Wen<wenzhixin2010@gmail.com>
+ */
+(function ($) {
+    'use strict';
+
+    $.fn.bootstrapTable.locales['zh-CN'] = {
+        formatLoadingMessage: function () {
+            return '正在努力地加载数据中,请稍候……';
+        },
+        formatRecordsPerPage: function (pageNumber) {
+            return '每页显示 ' + pageNumber + ' 条记录';
+        },
+        formatShowingRows: function (pageFrom, pageTo, totalRows) {
+            return '显示第 ' + pageFrom + ' 到第 ' + pageTo + ' 条记录,总共 ' + totalRows + ' 条记录';
+        },
+        formatSearch: function () {
+            return '搜索';
+        },
+        formatNoMatches: function () {
+            return '没有找到匹配的记录';
+        },
+        formatPaginationSwitch: function () {
+            return '隐藏/显示分页';
+        },
+        formatRefresh: function () {
+            return '刷新';
+        },
+        formatToggle: function () {
+            return '切换';
+        },
+        formatColumns: function () {
+            return '列';
+        },
+        formatExport: function () {
+            return '导出数据';
+        },
+        formatClearFilters: function () {
+            return '清空过滤';
+        }
+    };
+
+    $.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['zh-CN']);
+
+})(jQuery);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js
new file mode 100644
index 0000000..2fcd8d4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js
@@ -0,0 +1,7 @@
+/*
+* bootstrap-table - v1.11.1 - 2017-02-22
+* https://github.com/wenzhixin/bootstrap-table
+* Copyright (c) 2017 zhixin wen
+* Licensed MIT License
+*/
+!function(a){"use strict";a.fn.bootstrapTable.locales["zh-CN"]={formatLoadingMessage:function(){return"正在努力地加载数据中,请稍候……"},formatRecordsPerPage:function(a){return"每页显示 "+a+" 条记录"},formatShowingRows:function(a,b,c){return"显示第 "+a+" 到第 "+b+" 条记录,总共 "+c+" 条记录"},formatSearch:function(){return"搜索"},formatNoMatches:function(){return"没有找到匹配的记录"},formatPaginationSwitch:function(){return"隐藏/显示分页"},formatRefresh:function(){return"刷新"},formatToggle:function(){return"切换"},formatColumns:function(){return"列"},formatExport:function(){return"导出数据"},formatClearFilters:function(){return"清空过滤"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["zh-CN"])}(jQuery);
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-treetable/bootstrap-treetable.js b/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-treetable/bootstrap-treetable.js
new file mode 100644
index 0000000..8f090d9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/bootstrap-treetable/bootstrap-treetable.js
@@ -0,0 +1,353 @@
+/**
+ * 查找当前这个节点的所有节点(包含子节点),并进行折叠或者展开操作
+ *
+ * @param item 被点击条目的子一级条目
+ * @param target 整个bootstrap tree table实例
+ * @param globalCollapsedFlag 如果为true,则表示当前操作是收缩(折叠),如果是false,表示当前操作是展开
+ * @param options 存放了一些常量,例如展开和收缩的class
+ */
+function extracted($, item, target, globalCollapsedFlag, options) {
+    var itemCodeName = $(item).find("td[name='code']").text();
+    var subItems = target.find("tbody").find(".tg-" + itemCodeName);//下一级,改为下所有级别
+
+    if (subItems.size() > 0) {
+        $.each(subItems, function (nIndex, nItem) {
+            extracted($, nItem, target, globalCollapsedFlag, options);
+        });
+    }
+    $.each(subItems, function (pIndex, pItem) {
+
+        //如果是展开,判断当前箭头是开启还是关闭
+        var expander = $(item).find("td[name='name']").find(".treetable-expander");
+        if (!globalCollapsedFlag) {
+            var hasExpander = expander.hasClass(options.expanderExpandedClass);
+            if (hasExpander) {
+                $(pItem).css("display", "table");
+            } else {
+                $(pItem).css("display", "none");
+            }
+        } else {
+            //如果是折叠,就把当前开着的都折叠掉
+            $(pItem).css("display", "none");
+            expander.removeClass(options.expanderExpandedClass);
+            expander.addClass(options.expanderCollapsedClass);
+        }
+    });
+}
+
+(function ($) {
+    "use strict";
+
+    $.fn.bootstrapTreeTable = function (options, param) {
+        var allData = null;//用于存放格式化后的数据
+        // 如果是调用方法
+        if (typeof options == 'string') {
+            return $.fn.bootstrapTreeTable.methods[options](this, param);
+        }
+        // 如果是初始化组件
+        options = $.extend({}, $.fn.bootstrapTreeTable.defaults, options || {});
+        // 是否有radio或checkbox
+        var hasSelectItem = false;
+        var target = $(this);
+        // 在外层包装一下div,样式用的bootstrap-table的
+        var _main_div = $("<div class='bootstrap-tree-table fixed-table-container'></div>");
+        target.before(_main_div);
+        _main_div.append(target);
+        target.addClass("table table-hover treetable-table table-bordered");
+        if (options.striped) {
+            target.addClass('table-striped');
+        }
+        // 工具条在外层包装一下div,样式用的bootstrap-table的
+        if (options.toolbar) {
+            var _tool_div = $("<div class='fixed-table-toolbar'></div>");
+            var _tool_left_div = $("<div class='bs-bars pull-left'></div>");
+            _tool_left_div.append($(options.toolbar));
+            _tool_div.append(_tool_left_div);
+            _main_div.before(_tool_div);
+        }
+        // 格式化数据,优化性能
+        target.formatData = function (data) {
+            var _root = options.rootCodeValue ? options.rootCodeValue : null
+            $.each(data, function (index, item) {
+                // 添加一个默认属性,用来判断当前节点有没有被显示
+                item.isShow = false;
+                // 这里兼容几种常见Root节点写法
+                // 默认的几种判断
+                var _defaultRootFlag = item[options.parentCode] == '0'
+                    || item[options.parentCode] == 0
+                    || item[options.parentCode] == null
+                    || item[options.parentCode] == '';
+                if (!item[options.parentCode] || (_root ? (item[options.parentCode] == options.rootCodeValue) : _defaultRootFlag)) {
+                    if (!allData["_root_"]) {
+                        allData["_root_"] = [];
+                    }
+                    allData["_root_"].push(item);
+                } else {
+                    if (!allData["_n_" + item[options.parentCode]]) {
+                        allData["_n_" + item[options.parentCode]] = [];
+                    }
+                    allData["_n_" + item[options.parentCode]].push(item);
+                }
+            });
+        }
+        // 得到根节点
+        target.getRootNodes = function () {
+            return allData["_root_"];
+        };
+        // 递归获取子节点并且设置子节点
+        target.handleNode = function (parentNode, lv, tbody) {
+            var _ls = allData["_n_" + parentNode[options.code]];
+            var tr = target.renderRow(parentNode, _ls ? true : false, lv);
+            tbody.append(tr);
+            if (_ls) {
+                $.each(_ls, function (i, item) {
+                    target.handleNode(item, (lv + 1), tbody)
+                });
+            }
+        };
+        // 绘制行
+        target.renderRow = function (item, isP, lv) {
+            // 标记已显示
+            item.isShow = true;
+            var tr = $('<tr class="tg-' + item[options.parentCode] + '"></tr>');
+            var _icon = options.expanderCollapsedClass;
+            if (options.expandAll) {
+                tr.css("display", "table");
+                _icon = options.expanderExpandedClass;
+            } else if (options.expandFirst && lv <= 2) {
+                tr.css("display", "table");
+                _icon = (lv == 1) ? options.expanderExpandedClass : options.expanderCollapsedClass;
+            } else {
+                tr.css("display", "none");
+                _icon = options.expanderCollapsedClass;
+            }
+            $.each(options.columns, function (index, column) {
+                // 判断有没有选择列
+                if (index == 0 && column.field == 'selectItem') {
+                    hasSelectItem = true;
+                    var td = $('<td style="text-align:center;width:36px"></td>');
+                    if (column.radio) {
+                        var _ipt = $('<input name="select_item" type="radio" value="' + item[options.id] + '"></input>');
+                        td.append(_ipt);
+                    }
+                    if (column.checkbox) {
+                        var _ipt = $('<input name="select_item" type="checkbox" value="' + item[options.id] + '"></input>');
+                        td.append(_ipt);
+                    }
+                    tr.append(td);
+                } else {
+                    var td = $('<td title="' + item[column.field] + '" name="' + column.field + '" style="' + ((column.width) ? ('width:' + column.width) : '') + '"></td>');
+                    // 增加formatter渲染
+                    if (column.formatter) {
+                        td.html(column.formatter.call(this, item[column.field], item, index));
+                    } else {
+                        td.text(item[column.field]);
+                    }
+                    if (options.expandColumn == index) {
+                        if (!isP) {
+                            td.prepend('<span class="treetable-expander"></span>')
+                        } else {
+                            td.prepend('<span class="treetable-expander ' + _icon + '"></span>')
+                        }
+                        for (var int = 0; int < (lv - 1); int++) {
+                            td.prepend('<span class="treetable-indent"></span>')
+                        }
+                    }
+                    tr.append(td);
+                }
+            });
+            return tr;
+        }
+        // 加载数据
+        target.load = function (parms) {
+            // 加载数据前先清空
+            allData = {};
+            // 加载数据前先清空
+            target.html("");
+            // 构造表头
+            var thr = $('<tr></tr>');
+            $.each(options.columns, function (i, item) {
+                var th = null;
+                // 判断有没有选择列
+                if (i == 0 && item.field == 'selectItem') {
+                    hasSelectItem = true;
+                    th = $('<th style="width:36px"></th>');
+                } else {
+                    th = $('<th style="' + ((item.width) ? ('width:' + item.width) : '') + '"></th>');
+                }
+                th.text(item.title);
+                thr.append(th);
+            });
+            var thead = $('<thead class="treetable-thead"></thead>');
+            thead.append(thr);
+            target.append(thead);
+            // 构造表体
+            var tbody = $('<tbody class="treetable-tbody"></tbody>');
+            target.append(tbody);
+            // 添加加载loading
+            var _loading = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">正在努力地加载数据中,请稍候……</div></td></tr>'
+            tbody.html(_loading);
+            // 默认高度
+            if (options.height) {
+                tbody.css("height", options.height);
+            }
+            $.ajax({
+                type: options.type,
+                url: options.url,
+                data: parms ? parms : options.ajaxParams,
+                dataType: "JSON",
+                success: function (data, textStatus, jqXHR) {
+                    // 加载完数据先清空
+                    tbody.html("");
+                    if (!data || data.length <= 0) {
+                        var _empty = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">没有找到匹配的记录</div></td></tr>'
+                        tbody.html(_empty);
+                        return;
+                    }
+                    // 格式化数据
+                    target.formatData(data);
+                    // 开始绘制
+                    var rootNode = target.getRootNodes();
+                    if (rootNode) {
+                        $.each(rootNode, function (i, item) {
+                            target.handleNode(item, 1, tbody);
+                        });
+                    }
+                    // 下边的操作主要是为了查询时让一些没有根节点的节点显示
+                    $.each(data, function (i, item) {
+                        if (!item.isShow) {
+                            var tr = target.renderRow(item, false, 1);
+                            tbody.append(tr);
+                        }
+                    });
+                    target.append(tbody);
+                    //动态设置表头宽度
+                    thead.css("width", tbody.children(":first").css("width"));
+                    // 行点击选中事件
+                    target.find("tbody").find("tr").click(function () {
+                        if (hasSelectItem) {
+                            var _ipt = $(this).find("input[name='select_item']");
+                            if (_ipt.attr("type") == "radio") {
+                                _ipt.prop('checked', true);
+                                target.find("tbody").find("tr").removeClass("treetable-selected");
+                                $(this).addClass("treetable-selected");
+                            } else {
+                                if (_ipt.prop('checked')) {
+                                    _ipt.prop('checked', false);
+                                    $(this).removeClass("treetable-selected");
+                                } else {
+                                    _ipt.prop('checked', true);
+                                    $(this).addClass("treetable-selected");
+                                }
+                            }
+                        }
+                    });
+                    // 小图标点击事件--展开缩起
+                    target.find("tbody").find("tr").find(".treetable-expander").click(function () {
+                        var tr = $(this).parent().parent();
+                        var _code = tr.find("input[name='select_item']").val();
+                        if (options.id == options.code) {
+                            _code = tr.find("input[name='select_item']").val();
+                        } else {
+                            _code = tr.find("td[name='" + options.code + "']").text();
+                        }
+                        var _ls = target.find("tbody").find(".tg-" + _code);//下一级,改为下所有级别
+                        if (_ls && _ls.length > 0) {
+                            var _flag = $(this).hasClass(options.expanderExpandedClass);
+                            $.each(_ls, function (index, item) {
+
+                                //查找当前这个节点的所有节点(包含子节点),如果是折叠都显示为不显示,如果是展开,则根据当前节点的状态
+                                extracted($, item, target, _flag, options);
+
+                                $(item).css("display", _flag ? "none" : "table");
+                            });
+                            if (_flag) {
+                                $(this).removeClass(options.expanderExpandedClass)
+                                $(this).addClass(options.expanderCollapsedClass)
+                            } else {
+                                $(this).removeClass(options.expanderCollapsedClass)
+                                $(this).addClass(options.expanderExpandedClass)
+                            }
+                        }
+                    });
+                },
+                error: function (xhr, textStatus) {
+                    var _errorMsg = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">' + xhr.responseText + '</div></td></tr>'
+                    tbody.html(_errorMsg);
+                    debugger;
+                },
+            });
+        }
+        if (options.url) {
+            target.load();
+        } else {
+            // 也可以通过defaults里面的data属性通过传递一个数据集合进来对组件进行初始化....有兴趣可以自己实现,思路和上述类似
+        }
+
+        return target;
+    };
+
+    // 组件方法封装........
+    $.fn.bootstrapTreeTable.methods = {
+        // 返回选中记录的id(返回的id由配置中的id属性指定)
+        // 为了兼容bootstrap-table的写法,统一返回数组,这里只返回了指定的id
+        getSelections: function (target, data) {
+            // 所有被选中的记录input
+            var _ipt = target.find("tbody").find("tr").find("input[name='select_item']:checked");
+            var chk_value = [];
+            // 如果是radio
+            if (_ipt.attr("type") == "radio") {
+                var _data = {id: _ipt.val()};
+                var _tds = _ipt.parent().parent().find("td");
+                _tds.each(function (_i, _item) {
+                    if (_i != 0) {
+                        _data[$(_item).attr("name")] = $(_item).text();
+                    }
+                });
+                chk_value.push(_data);
+            } else {
+                _ipt.each(function (_i, _item) {
+                    var _data = {id: $(_item).val()};
+                    var _tds = $(_item).parent().parent().find("td");
+                    _tds.each(function (_ii, _iitem) {
+                        if (_ii != 0) {
+                            _data[$(_iitem).attr("name")] = $(_iitem).text();
+                        }
+                    });
+                    chk_value.push(_data);
+                });
+            }
+            return chk_value;
+        },
+        // 刷新记录
+        refresh: function (target, parms) {
+            if (parms) {
+                target.load(parms);
+            } else {
+                target.load();
+            }
+        },
+        // 组件的其他方法也可以进行类似封装........
+    };
+
+    $.fn.bootstrapTreeTable.defaults = {
+        id: 'id',// 选取记录返回的值
+        code: 'id',// 用于设置父子关系
+        parentCode: 'parentId',// 用于设置父子关系
+        rootCodeValue: null,//设置根节点code值----可指定根节点,默认为null,"",0,"0"
+        data: [], // 构造table的数据集合
+        type: "GET", // 请求数据的ajax类型
+        url: null, // 请求数据的ajax的url
+        ajaxParams: {}, // 请求数据的ajax的data属性
+        expandColumn: null,// 在哪一列上面显示展开按钮
+        expandAll: true, // 是否全部展开
+        expandFirst: false, // 是否默认第一级展开--expandAll为false时生效
+        striped: false, // 是否各行渐变色
+        columns: [],
+        toolbar: null,//顶部工具条
+        height: 0,
+        expanderExpandedClass: 'glyphicon glyphicon-chevron-down',// 展开的按钮的图标
+        expanderCollapsedClass: 'glyphicon glyphicon-chevron-right'// 缩起的按钮的图标
+
+    };
+})(jQuery);
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/chartJs/Chart.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/chartJs/Chart.min.js
new file mode 100644
index 0000000..644e7ad
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/chartJs/Chart.min.js
@@ -0,0 +1,11 @@
+/*!
+ * Chart.js
+ * http://chartjs.org/
+ * Version: 1.0.1-beta.4
+ *
+ * Copyright 2014 Nick Downie
+ * Released under the MIT license
+ * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md
+ */
+(function(){"use strict";var t=this,i=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;this.width=t.canvas.width,this.height=t.canvas.height;return this.aspectRatio=this.width/this.height,s.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= value %>",multiTooltipKeyBackground:"#fff",onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var s=e.helpers={},n=s.each=function(t,i,e){var s=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var n;for(n=0;n<t.length;n++)i.apply(e,[t[n],n].concat(s))}else for(var o in t)i.apply(e,[t[o],o].concat(s))},o=s.clone=function(t){var i={};return n(t,function(e,s){t.hasOwnProperty(s)&&(i[s]=e)}),i},a=s.extend=function(t){return n(Array.prototype.slice.call(arguments,1),function(i){n(i,function(e,s){i.hasOwnProperty(s)&&(t[s]=e)})}),t},h=s.merge=function(){var t=Array.prototype.slice.call(arguments,0);return t.unshift({}),a.apply(null,t)},l=s.indexOf=function(t,i){if(Array.prototype.indexOf)return t.indexOf(i);for(var e=0;e<t.length;e++)if(t[e]===i)return e;return-1},r=(s.where=function(t,i){var e=[];return s.each(t,function(t){i(t)&&e.push(t)}),e},s.findNextWhere=function(t,i,e){e||(e=-1);for(var s=e+1;s<t.length;s++){var n=t[s];if(i(n))return n}},s.findPreviousWhere=function(t,i,e){e||(e=t.length);for(var s=e-1;s>=0;s--){var n=t[s];if(i(n))return n}},s.inherits=function(t){var i=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return i.apply(this,arguments)},s=function(){this.constructor=e};return s.prototype=i.prototype,e.prototype=new s,e.extend=r,t&&a(e.prototype,t),e.__super__=i.prototype,e}),c=s.noop=function(){},u=s.uid=function(){var t=0;return function(){return"chart-"+t++}}(),d=s.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=s.amd="function"==typeof t.define&&t.define.amd,f=s.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},g=s.max=function(t){return Math.max.apply(Math,t)},m=s.min=function(t){return Math.min.apply(Math,t)},v=(s.cap=function(t,i,e){if(f(i)){if(t>i)return i}else if(f(e)&&e>t)return e;return t},s.getDecimalPlaces=function(t){return t%1!==0&&f(t)?t.toString().split(".")[1].length:0}),x=s.radians=function(t){return t*(Math.PI/180)},S=(s.getAngleFromPoint=function(t,i){var e=i.x-t.x,s=i.y-t.y,n=Math.sqrt(e*e+s*s),o=2*Math.PI+Math.atan2(s,e);return 0>e&&0>s&&(o+=2*Math.PI),{angle:o,distance:n}},s.aliasPixel=function(t){return t%2===0?0:.5}),y=(s.splineCurve=function(t,i,e,s){var n=Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2)),a=s*n/(n+o),h=s*o/(n+o);return{inner:{x:i.x-a*(e.x-t.x),y:i.y-a*(e.y-t.y)},outer:{x:i.x+h*(e.x-t.x),y:i.y+h*(e.y-t.y)}}},s.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),C=(s.calculateScaleRange=function(t,i,e,s,n){var o=2,a=Math.floor(i/(1.5*e)),h=o>=a,l=g(t),r=m(t);l===r&&(l+=.5,r>=.5&&!s?r-=.5:l+=.5);for(var c=Math.abs(l-r),u=y(c),d=Math.ceil(l/(1*Math.pow(10,u)))*Math.pow(10,u),p=s?0:Math.floor(r/(1*Math.pow(10,u)))*Math.pow(10,u),f=d-p,v=Math.pow(10,u),x=Math.round(f/v);(x>a||a>2*x)&&!h;)if(x>a)v*=2,x=Math.round(f/v),x%1!==0&&(h=!0);else if(n&&u>=0){if(v/2%1!==0)break;v/=2,x=Math.round(f/v)}else v/=2,x=Math.round(f/v);return h&&(x=o,v=f/x),{steps:x,stepValue:v,min:p,max:p+x*v}},s.template=function(t,i){function e(t,i){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join("	").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("	").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):s[t]=s[t];return i?e(i):e}if(t instanceof Function)return t(i);var s={};return e(t,i)}),b=(s.generateLabels=function(t,i,e,s){var o=new Array(i);return labelTemplateString&&n(o,function(i,n){o[n]=C(t,{value:e+s*(n+1)})}),o},s.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),s<Math.abs(1)?(s=1,i=e/4):i=e/(2*Math.PI)*Math.asin(1/s),-(s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)))},easeOutElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),s<Math.abs(1)?(s=1,i=e/4):i=e/(2*Math.PI)*Math.asin(1/s),s*Math.pow(2,-10*t)*Math.sin(2*(1*t-i)*Math.PI/e)+1)},easeInOutElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:2==(t/=.5)?1:(e||(e=.3*1.5),s<Math.abs(1)?(s=1,i=e/4):i=e/(2*Math.PI)*Math.asin(1/s),1>t?-.5*s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e):s*Math.pow(2,-10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)*.5+1)},easeInBack:function(t){var i=1.70158;return 1*(t/=1)*t*((i+1)*t-i)},easeOutBack:function(t){var i=1.70158;return 1*((t=t/1-1)*t*((i+1)*t+i)+1)},easeInOutBack:function(t){var i=1.70158;return(t/=.5)<1?.5*t*t*(((i*=1.525)+1)*t-i):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},easeInBounce:function(t){return 1-b.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?7.5625*t*t:2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*b.easeInBounce(2*t):.5*b.easeOutBounce(2*t-1)+.5}}),w=s.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),P=(s.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),s.animationLoop=function(t,i,e,s,n,o){var a=0,h=b[e]||b.linear,l=function(){a++;var e=a/i,r=h(e);t.call(o,r,e,a),s.call(o,r,e),i>a?o.animationFrame=w(l):n.apply(o)};w(l)},s.getRelativePosition=function(t){var i,e,s=t.originalEvent||t,n=t.currentTarget||t.srcElement,o=n.getBoundingClientRect();return s.touches?(i=s.touches[0].clientX-o.left,e=s.touches[0].clientY-o.top):(i=s.clientX-o.left,e=s.clientY-o.top),{x:i,y:e}},s.addEvent=function(t,i,e){t.addEventListener?t.addEventListener(i,e):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}),L=s.removeEvent=function(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=c},k=(s.bindEvents=function(t,i,e){t.events||(t.events={}),n(i,function(i){t.events[i]=function(){e.apply(t,arguments)},P(t.chart.canvas,i,t.events[i])})},s.unbindEvents=function(t,i){n(i,function(i,e){L(t.chart.canvas,e,i)})}),F=s.getMaximumWidth=function(t){var i=t.parentNode;return i.clientWidth},R=s.getMaximumHeight=function(t){var i=t.parentNode;return i.clientHeight},A=(s.getMaximumSize=s.getMaximumWidth,s.retinaScale=function(t){var i=t.ctx,e=t.canvas.width,s=t.canvas.height;window.devicePixelRatio&&(i.canvas.style.width=e+"px",i.canvas.style.height=s+"px",i.canvas.height=s*window.devicePixelRatio,i.canvas.width=e*window.devicePixelRatio,i.scale(window.devicePixelRatio,window.devicePixelRatio))}),T=s.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},M=s.fontString=function(t,i,e){return i+" "+t+"px "+e},W=s.longestText=function(t,i,e){t.font=i;var s=0;return n(e,function(i){var e=t.measureText(i).width;s=e>s?e:s}),s},z=s.drawRoundedRectangle=function(t,i,e,s,n,o){t.beginPath(),t.moveTo(i+o,e),t.lineTo(i+s-o,e),t.quadraticCurveTo(i+s,e,i+s,e+o),t.lineTo(i+s,e+n-o),t.quadraticCurveTo(i+s,e+n,i+s-o,e+n),t.lineTo(i+o,e+n),t.quadraticCurveTo(i,e+n,i,e+n-o),t.lineTo(i,e+o),t.quadraticCurveTo(i,e,i+o,e),t.closePath()};e.instances={},e.Type=function(t,i,s){this.options=i,this.chart=s,this.id=u(),e.instances[this.id]=this,i.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return T(this.chart),this},stop:function(){return s.cancelAnimFrame.call(t,this.animationFrame),this},resize:function(t){this.stop();var i=this.chart.canvas,e=F(this.chart.canvas),s=this.options.maintainAspectRatio?e/this.chart.aspectRatio:R(this.chart.canvas);return i.width=this.chart.width=e,i.height=this.chart.height=s,A(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){return t&&this.reflow(),this.options.animation&&!t?s.animationLoop(this.draw,this.options.animationSteps,this.options.animationEasing,this.options.onAnimationProgress,this.options.onAnimationComplete,this):(this.draw(),this.options.onAnimationComplete.call(this)),this},generateLegend:function(){return C(this.options.legendTemplate,this)},destroy:function(){this.clear(),k(this,this.events),delete e.instances[this.id]},showTooltip:function(t,i){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var i=!1;return t.length!==this.activeElements.length?i=!0:(n(t,function(t,e){t!==this.activeElements[e]&&(i=!0)},this),i)}.call(this,t);if(o||i){if(this.activeElements=t,this.draw(),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,h,r=this.datasets.length-1;r>=0&&(a=this.datasets[r].points||this.datasets[r].bars||this.datasets[r].segments,h=l(a,t[0]),-1===h);r--);var c=[],u=[],d=function(){var t,i,e,n,o,a=[],l=[],r=[];return s.each(this.datasets,function(i){t=i.points||i.bars||i.segments,t[h]&&t[h].hasValue()&&a.push(t[h])}),s.each(a,function(t){l.push(t.x),r.push(t.y),c.push(s.template(this.options.multiTooltipTemplate,t)),u.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),o=m(r),e=g(r),n=m(l),i=g(l),{x:n>this.chart.width/2?n:i,y:(o+e)/2}}.call(this,h);new e.MultiTooltip({x:d.x,y:d.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:u,legendColorBackground:this.options.multiTooltipKeyBackground,title:t[0].label,chart:this.chart,ctx:this.chart.ctx}).draw()}else n(t,function(t){var i=t.tooltipPosition();new e.Tooltip({x:Math.round(i.x),y:Math.round(i.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:C(this.options.tooltipTemplate,t),chart:this.chart}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var i=this,s=function(){return i.apply(this,arguments)};if(s.prototype=o(i.prototype),a(s.prototype,t),s.extend=e.Type.extend,t.name||i.prototype.name){var n=t.name||i.prototype.name,l=e.defaults[i.prototype.name]?o(e.defaults[i.prototype.name]):{};e.defaults[n]=a(l,t.defaults),e.types[n]=s,e.prototype[n]=function(t,i){var o=h(e.defaults.global,e.defaults[n],i||{});return new s(t,o,this)}}else d("Name not provided for this chart, so it hasn't been registered");return i},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?n(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return n(t,function(t,i){this._saved[i]=this[i],this[i]=t},this),this},transition:function(t,i){return n(t,function(t,e){this[e]=(t-this._saved[e])*i+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return f(this.value)}}),e.Element.extend=r,e.Point=e.Element.extend({display:!0,inRange:function(t,i){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(i-this.y,2)<Math.pow(e,2)},draw:function(){if(this.display){var t=this.ctx;t.beginPath(),t.arc(this.x,this.y,this.radius,0,2*Math.PI),t.closePath(),t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.fillStyle=this.fillColor,t.fill(),t.stroke()}}}),e.Arc=e.Element.extend({inRange:function(t,i){var e=s.getAngleFromPoint(this,{x:t,y:i}),n=e.angle>=this.startAngle&&e.angle<=this.endAngle,o=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return n&&o},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,i=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*i,y:this.y+Math.sin(t)*i}},draw:function(t){var i=this.ctx;i.beginPath(),i.arc(this.x,this.y,this.outerRadius,this.startAngle,this.endAngle),i.arc(this.x,this.y,this.innerRadius,this.endAngle,this.startAngle,!0),i.closePath(),i.strokeStyle=this.strokeColor,i.lineWidth=this.strokeWidth,i.fillStyle=this.fillColor,i.fill(),i.lineJoin="bevel",this.showStroke&&i.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,i=this.width/2,e=this.x-i,s=this.x+i,n=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,s-=o,n+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,n),t.lineTo(s,n),t.lineTo(s,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,i){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&i>=this.y&&i<=this.base}}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=M(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var i=2,e=t.measureText(this.text).width+2*this.xPadding,s=this.fontSize+2*this.yPadding,n=s+this.caretHeight+i;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-n<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-n;switch(t.fillStyle=this.fillColor,this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-i),t.lineTo(this.x+this.caretHeight,this.y-(i+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(i+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+i+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+i),t.lineTo(this.x+this.caretHeight,this.y+i+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+i+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}z(t,o,a,e,s,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+s/2)}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=M(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=M(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+1.5*this.titleFontSize,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,i=W(this.ctx,this.font,this.labels)+this.fontSize+3,e=g([i,t]);this.width=e+2*this.xPadding;var s=this.height/2;this.y-s<0?this.y=s:this.y+s>this.chart.height&&(this.y=this.chart.height-s),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var i=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?i+this.titleFontSize/2:i+(1.5*this.fontSize*e+this.fontSize/2)+1.5*this.titleFontSize},draw:function(){z(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,s.each(this.labels,function(i,e){t.fillStyle=this.textColor,t.fillText(i,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?W(this.ctx,this.font,this.yLabels):0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,i=this.endPoint-this.startPoint;for(this.calculateYRange(i),this.buildYLabels(),this.calculateXLabelRotation();i>this.endPoint-this.startPoint;)i=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(i),this.buildYLabels(),t<this.yLabelWidth&&this.calculateXLabelRotation()},calculateXLabelRotation:function(){this.ctx.font=this.font;var t,i,e=this.ctx.measureText(this.xLabels[0]).width,s=this.ctx.measureText(this.xLabels[this.xLabels.length-1]).width;if(this.xScalePaddingRight=s/2+3,this.xScalePaddingLeft=e/2>this.yLabelWidth+10?e/2:this.yLabelWidth+10,this.xLabelRotation=0,this.display){var n,o=W(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)n=Math.cos(x(this.xLabelRotation)),t=n*e,i=n*s,t+this.fontSize/2>this.yLabelWidth+8&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=n*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(x(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var i=this.drawingArea()/(this.min-this.max);return this.endPoint-i*(t-this.min)},calculateX:function(t){var i=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=i/(this.valuesCount-(this.offsetGridLines?0:1)),s=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(s+=e/2),Math.round(s)},update:function(t){s.extend(this,t),this.fit()},draw:function(){var t=this.ctx,i=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,n(this.yLabels,function(n,o){var a=this.endPoint-i*o,h=Math.round(a);t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(n,e-10,a),t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),h+=s.aliasPixel(t.lineWidth),t.moveTo(e,h),t.lineTo(this.width,h),t.stroke(),t.closePath(),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,h),t.lineTo(e,h),t.stroke(),t.closePath()},this),n(this.xLabels,function(i,e){var s=this.calculateX(e)+S(this.lineWidth),n=this.calculateX(e-(this.offsetGridLines?.5:0))+S(this.lineWidth),o=this.xLabelRotation>0;t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),t.moveTo(n,this.endPoint),t.lineTo(n,this.startPoint-3),t.stroke(),t.closePath(),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(n,this.endPoint),t.lineTo(n,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(s,o?this.endPoint+12:this.endPoint+8),t.rotate(-1*x(this.xLabelRotation)),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(i,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=m([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var i=this.drawingArea/(this.max-this.min);return(t-this.min)*i},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,i,e,s,n,o,a,h,l,r,c,u,d=m([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,g=0;for(this.ctx.font=M(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),i=0;i<this.valuesCount;i++)t=this.getPointPosition(i,d),e=this.ctx.measureText(C(this.templateString,{value:this.labels[i]})).width+5,0===i||i===this.valuesCount/2?(s=e/2,t.x+s>p&&(p=t.x+s,n=i),t.x-s<g&&(g=t.x-s,a=i)):i<this.valuesCount/2?t.x+e>p&&(p=t.x+e,n=i):i>this.valuesCount/2&&t.x-e<g&&(g=t.x-e,a=i);l=g,r=Math.ceil(p-this.width),o=this.getIndexAngle(n),h=this.getIndexAngle(a),c=r/Math.sin(o+Math.PI/2),u=l/Math.sin(h+Math.PI/2),c=f(c)?c:0,u=f(u)?u:0,this.drawingArea=d-(u+c)/2,this.setCenterPoint(u,c)},setCenterPoint:function(t,i){var e=this.width-i-this.drawingArea,s=t+this.drawingArea;this.xCenter=(s+e)/2,this.yCenter=this.height/2},getIndexAngle:function(t){var i=2*Math.PI/this.valuesCount;return t*i-Math.PI/2},getPointPosition:function(t,i){var e=this.getIndexAngle(t);return{x:Math.cos(e)*i+this.xCenter,y:Math.sin(e)*i+this.yCenter}},draw:function(){if(this.display){var t=this.ctx;if(n(this.yLabels,function(i,e){if(e>0){var s,n=e*(this.drawingArea/this.steps),o=this.yCenter-n;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a<this.valuesCount;a++)s=this.getPointPosition(a,this.calculateCenterOffset(this.min+e*this.stepValue)),0===a?t.moveTo(s.x,s.y):t.lineTo(s.x,s.y);t.closePath(),t.stroke()}if(this.showLabels){if(t.font=M(this.fontSize,this.fontStyle,this.fontFamily),this.showLabelBackdrop){var h=t.measureText(i).width;t.fillStyle=this.backdropColor,t.fillRect(this.xCenter-h/2-this.backdropPaddingX,o-this.fontSize/2-this.backdropPaddingY,h+2*this.backdropPaddingX,this.fontSize+2*this.backdropPaddingY)}t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.fontColor,t.fillText(i,this.xCenter,o)}}},this),!this.lineArc){t.lineWidth=this.angleLineWidth,t.strokeStyle=this.angleLineColor;for(var i=this.valuesCount-1;i>=0;i--){if(this.angleLineWidth>0){var e=this.getPointPosition(i,this.calculateCenterOffset(this.max));t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(e.x,e.y),t.stroke(),t.closePath()}var s=this.getPointPosition(i,this.calculateCenterOffset(this.max)+5);t.font=M(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var o=this.labels.length,a=this.labels.length/2,h=a/2,l=h>i||i>o-h,r=i===h||i===o-h;t.textAlign=0===i?"center":i===a?"center":a>i?"left":"right",t.textBaseline=r?"middle":l?"bottom":"top",t.fillText(this.labels[i],s.x,s.y)}}}}}),s.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){n(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define(function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=i,e}}).call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>'};i.Type.extend({name:"Bar",defaults:s,initialize:function(t){var s=this.options;this.ScaleClass=i.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,i,e){var n=this.calculateBaseWidth(),o=this.calculateX(e)-n/2,a=this.calculateBarWidth(t);return o+a*i+i*s.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*s.barValueSpacing},calculateBarWidth:function(t){var i=this.calculateBaseWidth()-(t-1)*s.barDatasetSpacing;return i/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),this.BarClass=i.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,bars:[]};this.datasets.push(s),e.each(i.data,function(e,n){s.bars.push(new this.BarClass({value:e,label:t.labels[n],datasetLabel:i.label,strokeColor:i.strokeColor,fillColor:i.fillColor,highlightFill:i.highlightFill||i.fillColor,highlightStroke:i.highlightStroke||i.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,i,s){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,s,i),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(i,s){e.each(i.bars,t,this,s)},this)},getBarsAtEvent:function(t){for(var i,s=[],n=e.getRelativePosition(t),o=function(t){s.push(t.bars[i])},a=0;a<this.datasets.length;a++)for(i=0;i<this.datasets[a].bars.length;i++)if(this.datasets[a].bars[i].inRange(n.x,n.y))return e.each(this.datasets,o),s;return s},buildScale:function(t){var i=this,s=function(){var t=[];return i.eachBars(function(i){t.push(i.value)}),t},n={templateString:this.options.scaleLabel,height:this.chart.height,width:this.chart.width,ctx:this.chart.ctx,textColor:this.options.scaleFontColor,fontSize:this.options.scaleFontSize,fontStyle:this.options.scaleFontStyle,fontFamily:this.options.scaleFontFamily,valuesCount:t.length,beginAtZero:this.options.scaleBeginAtZero,integersOnly:this.options.scaleIntegersOnly,calculateYRange:function(t){var i=e.calculateScaleRange(s(),t,this.fontSize,this.beginAtZero,this.integersOnly);e.extend(this,i)},xLabels:t,font:e.fontString(this.options.scaleFontSize,this.options.scaleFontStyle,this.options.scaleFontFamily),lineWidth:this.options.scaleLineWidth,lineColor:this.options.scaleLineColor,gridLineWidth:this.options.scaleShowGridLines?this.options.scaleGridLineWidth:0,gridLineColor:this.options.scaleShowGridLines?this.options.scaleGridLineColor:"rgba(0,0,0,0)",padding:this.options.showScale?0:this.options.barShowStroke?this.options.barStrokeWidth:0,showLabels:this.options.scaleShowLabels,display:this.options.showScale};this.options.scaleOverride&&e.extend(n,{calculateYRange:e.noop,steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}),this.scale=new this.ScaleClass(n)},addData:function(t,i){e.each(t,function(t,e){this.datasets[e].bars.push(new this.BarClass({value:t,label:i,x:this.scale.calculateBarX(this.datasets.length,e,this.scale.valuesCount+1),y:this.scale.endPoint,width:this.scale.calculateBarWidth(this.datasets.length),base:this.scale.endPoint,strokeColor:this.datasets[e].strokeColor,fillColor:this.datasets[e].fillColor}))},this),this.scale.addXLabel(i),this.update()},removeData:function(){this.scale.removeXLabel(),e.each(this.datasets,function(t){t.bars.shift()},this),this.update()},reflow:function(){e.extend(this.BarClass.prototype,{y:this.scale.endPoint,base:this.scale.endPoint});var t=e.extend({height:this.chart.height,width:this.chart.width});this.scale.update(t)},draw:function(t){var i=t||1;this.clear();this.chart.ctx;this.scale.draw(i),e.each(this.datasets,function(t,s){e.each(t.bars,function(t,e){t.hasValue()&&(t.base=this.scale.endPoint,t.transition({x:this.scale.calculateBarX(this.datasets.length,s,e),y:this.scale.calculateY(t.value),width:this.scale.calculateBarWidth(this.datasets.length)},i).draw())},this)},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,percentageInnerCutout:50,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span style="background-color:<%=segments[i].fillColor%>"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>'};
+    i.Type.extend({name:"Doughnut",defaults:s,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=i.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.calculateTotal(t),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),e||(this.reflow(),this.update())},calculateCircumference:function(t){return 2*Math.PI*(t/this.total)},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var i=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},i),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<this.segments.length-1&&(this.segments[e+1].startAngle=t.endAngle)},this)}}),i.types.Doughnut.extend({name:"Pie",defaults:e.merge(s,{percentageInnerCutout:0})})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,bezierCurve:!0,bezierCurveTension:.4,pointDot:!0,pointDotRadius:4,pointDotStrokeWidth:1,pointHitDetectionRadius:20,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].strokeColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>'};i.Type.extend({name:"Line",defaults:s,initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)<Math.pow(this.radius+this.hitDetectionRadius,2)}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this),this.buildScale(t.labels),this.eachPoints(function(t,i){e.extend(t,{x:this.scale.calculateX(i),y:this.scale.endPoint}),t.save()},this)},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachPoints(function(t){t.save()}),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.datasets,function(t){e.each(t.points,function(t){t.inRange(s.x,s.y)&&i.push(t)})},this),i},buildScale:function(t){var s=this,n=function(){var t=[];return s.eachPoints(function(i){t.push(i.value)}),t},o={templateString:this.options.scaleLabel,height:this.chart.height,width:this.chart.width,ctx:this.chart.ctx,textColor:this.options.scaleFontColor,fontSize:this.options.scaleFontSize,fontStyle:this.options.scaleFontStyle,fontFamily:this.options.scaleFontFamily,valuesCount:t.length,beginAtZero:this.options.scaleBeginAtZero,integersOnly:this.options.scaleIntegersOnly,calculateYRange:function(t){var i=e.calculateScaleRange(n(),t,this.fontSize,this.beginAtZero,this.integersOnly);e.extend(this,i)},xLabels:t,font:e.fontString(this.options.scaleFontSize,this.options.scaleFontStyle,this.options.scaleFontFamily),lineWidth:this.options.scaleLineWidth,lineColor:this.options.scaleLineColor,gridLineWidth:this.options.scaleShowGridLines?this.options.scaleGridLineWidth:0,gridLineColor:this.options.scaleShowGridLines?this.options.scaleGridLineColor:"rgba(0,0,0,0)",padding:this.options.showScale?0:this.options.pointDotRadius+this.options.pointDotStrokeWidth,showLabels:this.options.scaleShowLabels,display:this.options.showScale};this.options.scaleOverride&&e.extend(o,{calculateYRange:e.noop,steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}),this.scale=new i.Scale(o)},addData:function(t,i){e.each(t,function(t,e){this.datasets[e].points.push(new this.PointClass({value:t,label:i,x:this.scale.calculateX(this.scale.valuesCount+1),y:this.scale.endPoint,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.addXLabel(i),this.update()},removeData:function(){this.scale.removeXLabel(),e.each(this.datasets,function(t){t.points.shift()},this),this.update()},reflow:function(){var t=e.extend({height:this.chart.height,width:this.chart.width});this.scale.update(t)},draw:function(t){var i=t||1;this.clear();var s=this.chart.ctx,n=function(t){return null!==t.value},o=function(t,i,s){return e.findNextWhere(i,n,s)||t},a=function(t,i,s){return e.findPreviousWhere(i,n,s)||t};this.scale.draw(i),e.each(this.datasets,function(t){var h=e.where(t.points,n);e.each(t.points,function(t,e){t.hasValue()&&t.transition({y:this.scale.calculateY(t.value),x:this.scale.calculateX(e)},i)},this),this.options.bezierCurve&&e.each(h,function(t,i){var s=i>0&&i<h.length-1?this.options.bezierCurveTension:0;t.controlPoints=e.splineCurve(a(t,h,i),t,o(t,h,i),s),t.controlPoints.outer.y>this.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.y<this.scale.startPoint&&(t.controlPoints.outer.y=this.scale.startPoint),t.controlPoints.inner.y>this.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y<this.scale.startPoint&&(t.controlPoints.inner.y=this.scale.startPoint)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(h,function(t,i){if(0===i)s.moveTo(t.x,t.y);else if(this.options.bezierCurve){var e=a(t,h,i);s.bezierCurveTo(e.controlPoints.outer.x,e.controlPoints.outer.y,t.controlPoints.inner.x,t.controlPoints.inner.y,t.x,t.y)}else s.lineTo(t.x,t.y)},this),s.stroke(),this.options.datasetFill&&h.length>0&&(s.lineTo(h[h.length-1].x,this.scale.endPoint),s.lineTo(h[0].x,this.scale.endPoint),s.fillStyle=t.fillColor,s.closePath(),s.fill()),e.each(h,function(t){t.draw()})},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span style="background-color:<%=segments[i].fillColor%>"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>'};i.Type.extend({name:"PolarArea",defaults:s,initialize:function(t){this.segments=[],this.SegmentArc=i.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var i=[];e.each(t,function(t){i.push(t.value)});var s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var i=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},i),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<this.segments.length-1&&(this.segments[e+1].startAngle=t.endAngle),t.draw()},this),this.scale.draw()}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers;i.Type.extend({name:"Radar",defaults:{scaleShowLine:!0,angleShowLineOut:!0,scaleShowLabels:!1,scaleBeginAtZero:!0,angleLineColor:"rgba(0,0,0,.1)",angleLineWidth:1,pointLabelFontFamily:"'Arial'",pointLabelFontStyle:"normal",pointLabelFontSize:10,pointLabelFontColor:"#666",pointDot:!0,pointDotRadius:3,pointDotStrokeWidth:1,pointHitDetectionRadius:20,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].strokeColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>'},initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){var o;this.scale.animation||(o=this.scale.getPointPosition(n,this.scale.calculateCenterOffset(e))),s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=e.getRelativePosition(t),s=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},i),n=2*Math.PI/this.scale.valuesCount,o=Math.round((s.angle-1.5*Math.PI)/n),a=[];return(o>=this.scale.valuesCount||0>o)&&(o=0),s.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var i=function(){var i=[];return e.each(t,function(t){t.data?i=i.concat(t.data):e.each(t.points,function(t){i.push(t.value)})}),i}(),s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s)},addData:function(t,i){this.scale.valuesCount++,e.each(t,function(t,e){var s=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:i,x:s.x,y:s.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(i),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var i=t||1,s=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),i)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(t,i){0===i?s.moveTo(t.x,t.y):s.lineTo(t.x,t.y)},this),s.closePath(),s.stroke(),s.fillStyle=t.fillColor,s.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/chartJs/echarts.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/chartJs/echarts.min.js
new file mode 100644
index 0000000..f902db9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/chartJs/echarts.min.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.echarts={})}(this,function(t){"use strict";function e(t,e){"createCanvas"===t&&(Ox=null),kx[t]=e}function i(t){if(null==t||"object"!=typeof t)return t;var e=t,n=Mx.call(t);if("[object Array]"===n){if(!N(t)){e=[];for(var o=0,a=t.length;o<a;o++)e[o]=i(t[o])}}else if(Sx[n]){if(!N(t)){var r=t.constructor;if(t.constructor.from)e=r.from(t);else{e=new r(t.length);for(var o=0,a=t.length;o<a;o++)e[o]=i(t[o])}}}else if(!bx[n]&&!N(t)&&!M(t)){e={};for(var s in t)t.hasOwnProperty(s)&&(e[s]=i(t[s]))}return e}function n(t,e,o){if(!w(e)||!w(t))return o?i(e):t;for(var a in e)if(e.hasOwnProperty(a)){var r=t[a],s=e[a];!w(s)||!w(r)||y(s)||y(r)||M(s)||M(r)||b(s)||b(r)||N(s)||N(r)?!o&&a in t||(t[a]=i(e[a],!0)):n(r,s,o)}return t}function o(t,e){for(var i=t[0],o=1,a=t.length;o<a;o++)i=n(i,t[o],e);return i}function a(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function r(t,e,i){for(var n in e)e.hasOwnProperty(n)&&(i?null!=e[n]:null==t[n])&&(t[n]=e[n]);return t}function s(){return Ox||(Ox=Px().getContext("2d")),Ox}function l(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var i=0,n=t.length;i<n;i++)if(t[i]===e)return i}return-1}function h(t,e){function i(){}var n=t.prototype;i.prototype=e.prototype,t.prototype=new i;for(var o in n)t.prototype[o]=n[o];t.prototype.constructor=t,t.superClass=e}function u(t,e,i){r(t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,i)}function c(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function d(t,e,i){if(t&&e)if(t.forEach&&t.forEach===Tx)t.forEach(e,i);else if(t.length===+t.length)for(var n=0,o=t.length;n<o;n++)e.call(i,t[n],n,t);else for(var a in t)t.hasOwnProperty(a)&&e.call(i,t[a],a,t)}function f(t,e,i){if(t&&e){if(t.map&&t.map===Cx)return t.map(e,i);for(var n=[],o=0,a=t.length;o<a;o++)n.push(e.call(i,t[o],o,t));return n}}function p(t,e,i,n){if(t&&e){if(t.reduce&&t.reduce===Lx)return t.reduce(e,i,n);for(var o=0,a=t.length;o<a;o++)i=e.call(n,i,t[o],o,t);return i}}function g(t,e,i){if(t&&e){if(t.filter&&t.filter===Ax)return t.filter(e,i);for(var n=[],o=0,a=t.length;o<a;o++)e.call(i,t[o],o,t)&&n.push(t[o]);return n}}function m(t,e){var i=Dx.call(arguments,2);return function(){return t.apply(e,i.concat(Dx.call(arguments)))}}function v(t){var e=Dx.call(arguments,1);return function(){return t.apply(this,e.concat(Dx.call(arguments)))}}function y(t){return"[object Array]"===Mx.call(t)}function x(t){return"function"==typeof t}function _(t){return"[object String]"===Mx.call(t)}function w(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function b(t){return!!bx[Mx.call(t)]}function S(t){return!!Sx[Mx.call(t)]}function M(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function I(t){return t!==t}function T(t){for(var e=0,i=arguments.length;e<i;e++)if(null!=arguments[e])return arguments[e]}function A(t,e){return null!=t?t:e}function D(t,e,i){return null!=t?t:null!=e?e:i}function C(){return Function.call.apply(Dx,arguments)}function L(t){if("number"==typeof t)return[t,t,t,t];var e=t.length;return 2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function k(t,e){if(!t)throw new Error(e)}function P(t){return null==t?null:"function"==typeof t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}function O(t){t[Nx]=!0}function N(t){return t[Nx]}function E(t){function e(t,e){i?n.set(t,e):n.set(e,t)}var i=y(t),n=this;t instanceof E?t.each(e):t&&d(t,e)}function z(t){return new E(t)}function R(t,e){for(var i=new t.constructor(t.length+e.length),n=0;n<t.length;n++)i[n]=t[n];var o=t.length;for(n=0;n<e.length;n++)i[n+o]=e[n];return i}function B(){}function V(t,e){var i=new zx(2);return null==t&&(t=0),null==e&&(e=0),i[0]=t,i[1]=e,i}function G(t,e){return t[0]=e[0],t[1]=e[1],t}function W(t){var e=new zx(2);return e[0]=t[0],e[1]=t[1],e}function F(t,e,i){return t[0]=e,t[1]=i,t}function H(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t}function Z(t,e,i,n){return t[0]=e[0]+i[0]*n,t[1]=e[1]+i[1]*n,t}function U(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t}function j(t){return Math.sqrt(X(t))}function X(t){return t[0]*t[0]+t[1]*t[1]}function Y(t,e,i){return t[0]=e[0]*i,t[1]=e[1]*i,t}function q(t,e){var i=j(e);return 0===i?(t[0]=0,t[1]=0):(t[0]=e[0]/i,t[1]=e[1]/i),t}function $(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))}function K(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])}function J(t,e,i,n){return t[0]=e[0]+n*(i[0]-e[0]),t[1]=e[1]+n*(i[1]-e[1]),t}function Q(t,e,i){var n=e[0],o=e[1];return t[0]=i[0]*n+i[2]*o+i[4],t[1]=i[1]*n+i[3]*o+i[5],t}function tt(t,e,i){return t[0]=Math.min(e[0],i[0]),t[1]=Math.min(e[1],i[1]),t}function et(t,e,i){return t[0]=Math.max(e[0],i[0]),t[1]=Math.max(e[1],i[1]),t}function it(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function nt(t,e){return{target:t,topTarget:e&&e.topTarget}}function ot(t,e,i){return{type:t,event:i,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:i.zrX,offsetY:i.zrY,gestureEvent:i.gestureEvent,pinchX:i.pinchX,pinchY:i.pinchY,pinchScale:i.pinchScale,wheelDelta:i.zrDelta,zrByTouch:i.zrByTouch,which:i.which}}function at(){}function rt(t,e,i){if(t[t.rectHover?"rectContain":"contain"](e,i)){for(var n,o=t;o;){if(o.clipPath&&!o.clipPath.contain(e,i))return!1;o.silent&&(n=!0),o=o.parent}return!n||Zx}return!1}function st(){var t=new Xx(6);return lt(t),t}function lt(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function ht(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function ut(t,e,i){var n=e[0]*i[0]+e[2]*i[1],o=e[1]*i[0]+e[3]*i[1],a=e[0]*i[2]+e[2]*i[3],r=e[1]*i[2]+e[3]*i[3],s=e[0]*i[4]+e[2]*i[5]+e[4],l=e[1]*i[4]+e[3]*i[5]+e[5];return t[0]=n,t[1]=o,t[2]=a,t[3]=r,t[4]=s,t[5]=l,t}function ct(t,e,i){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+i[0],t[5]=e[5]+i[1],t}function dt(t,e,i){var n=e[0],o=e[2],a=e[4],r=e[1],s=e[3],l=e[5],h=Math.sin(i),u=Math.cos(i);return t[0]=n*u+r*h,t[1]=-n*h+r*u,t[2]=o*u+s*h,t[3]=-o*h+u*s,t[4]=u*a+h*l,t[5]=u*l-h*a,t}function ft(t,e,i){var n=i[0],o=i[1];return t[0]=e[0]*n,t[1]=e[1]*o,t[2]=e[2]*n,t[3]=e[3]*o,t[4]=e[4]*n,t[5]=e[5]*o,t}function pt(t,e){var i=e[0],n=e[2],o=e[4],a=e[1],r=e[3],s=e[5],l=i*r-a*n;return l?(l=1/l,t[0]=r*l,t[1]=-a*l,t[2]=-n*l,t[3]=i*l,t[4]=(n*s-r*o)*l,t[5]=(a*o-i*s)*l,t):null}function gt(t){var e=st();return ht(e,t),e}function mt(t){return t>$x||t<-$x}function vt(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}function yt(t){return(t=Math.round(t))<0?0:t>255?255:t}function xt(t){return(t=Math.round(t))<0?0:t>360?360:t}function _t(t){return t<0?0:t>1?1:t}function wt(t){return yt(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function bt(t){return _t(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function St(t,e,i){return i<0?i+=1:i>1&&(i-=1),6*i<1?t+(e-t)*i*6:2*i<1?e:3*i<2?t+(e-t)*(2/3-i)*6:t}function Mt(t,e,i){return t+(e-t)*i}function It(t,e,i,n,o){return t[0]=e,t[1]=i,t[2]=n,t[3]=o,t}function Tt(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function At(t,e){l_&&Tt(l_,e),l_=s_.put(t,l_||e.slice())}function Dt(t,e){if(t){e=e||[];var i=s_.get(t);if(i)return Tt(e,i);var n=(t+="").replace(/ /g,"").toLowerCase();if(n in r_)return Tt(e,r_[n]),At(t,e),e;if("#"!==n.charAt(0)){var o=n.indexOf("("),a=n.indexOf(")");if(-1!==o&&a+1===n.length){var r=n.substr(0,o),s=n.substr(o+1,a-(o+1)).split(","),l=1;switch(r){case"rgba":if(4!==s.length)return void It(e,0,0,0,1);l=bt(s.pop());case"rgb":return 3!==s.length?void It(e,0,0,0,1):(It(e,wt(s[0]),wt(s[1]),wt(s[2]),l),At(t,e),e);case"hsla":return 4!==s.length?void It(e,0,0,0,1):(s[3]=bt(s[3]),Ct(s,e),At(t,e),e);case"hsl":return 3!==s.length?void It(e,0,0,0,1):(Ct(s,e),At(t,e),e);default:return}}It(e,0,0,0,1)}else{if(4===n.length)return(h=parseInt(n.substr(1),16))>=0&&h<=4095?(It(e,(3840&h)>>4|(3840&h)>>8,240&h|(240&h)>>4,15&h|(15&h)<<4,1),At(t,e),e):void It(e,0,0,0,1);if(7===n.length){var h=parseInt(n.substr(1),16);return h>=0&&h<=16777215?(It(e,(16711680&h)>>16,(65280&h)>>8,255&h,1),At(t,e),e):void It(e,0,0,0,1)}}}}function Ct(t,e){var i=(parseFloat(t[0])%360+360)%360/360,n=bt(t[1]),o=bt(t[2]),a=o<=.5?o*(n+1):o+n-o*n,r=2*o-a;return e=e||[],It(e,yt(255*St(r,a,i+1/3)),yt(255*St(r,a,i)),yt(255*St(r,a,i-1/3)),1),4===t.length&&(e[3]=t[3]),e}function Lt(t){if(t){var e,i,n=t[0]/255,o=t[1]/255,a=t[2]/255,r=Math.min(n,o,a),s=Math.max(n,o,a),l=s-r,h=(s+r)/2;if(0===l)e=0,i=0;else{i=h<.5?l/(s+r):l/(2-s-r);var u=((s-n)/6+l/2)/l,c=((s-o)/6+l/2)/l,d=((s-a)/6+l/2)/l;n===s?e=d-c:o===s?e=1/3+u-d:a===s&&(e=2/3+c-u),e<0&&(e+=1),e>1&&(e-=1)}var f=[360*e,i,h];return null!=t[3]&&f.push(t[3]),f}}function kt(t,e){var i=Dt(t);if(i){for(var n=0;n<3;n++)i[n]=e<0?i[n]*(1-e)|0:(255-i[n])*e+i[n]|0;return Rt(i,4===i.length?"rgba":"rgb")}}function Pt(t){var e=Dt(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)}function Ot(t,e,i){if(e&&e.length&&t>=0&&t<=1){i=i||[];var n=t*(e.length-1),o=Math.floor(n),a=Math.ceil(n),r=e[o],s=e[a],l=n-o;return i[0]=yt(Mt(r[0],s[0],l)),i[1]=yt(Mt(r[1],s[1],l)),i[2]=yt(Mt(r[2],s[2],l)),i[3]=_t(Mt(r[3],s[3],l)),i}}function Nt(t,e,i){if(e&&e.length&&t>=0&&t<=1){var n=t*(e.length-1),o=Math.floor(n),a=Math.ceil(n),r=Dt(e[o]),s=Dt(e[a]),l=n-o,h=Rt([yt(Mt(r[0],s[0],l)),yt(Mt(r[1],s[1],l)),yt(Mt(r[2],s[2],l)),_t(Mt(r[3],s[3],l))],"rgba");return i?{color:h,leftIndex:o,rightIndex:a,value:n}:h}}function Et(t,e,i,n){if(t=Dt(t))return t=Lt(t),null!=e&&(t[0]=xt(e)),null!=i&&(t[1]=bt(i)),null!=n&&(t[2]=bt(n)),Rt(Ct(t),"rgba")}function zt(t,e){if((t=Dt(t))&&null!=e)return t[3]=_t(e),Rt(t,"rgba")}function Rt(t,e){if(t&&t.length){var i=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(i+=","+t[3]),e+"("+i+")"}}function Bt(t,e){return t[e]}function Vt(t,e,i){t[e]=i}function Gt(t,e,i){return(e-t)*i+t}function Wt(t,e,i){return i>.5?e:t}function Ft(t,e,i,n,o){var a=t.length;if(1==o)for(s=0;s<a;s++)n[s]=Gt(t[s],e[s],i);else for(var r=a&&t[0].length,s=0;s<a;s++)for(var l=0;l<r;l++)n[s][l]=Gt(t[s][l],e[s][l],i)}function Ht(t,e,i){var n=t.length,o=e.length;if(n!==o)if(n>o)t.length=o;else for(r=n;r<o;r++)t.push(1===i?e[r]:d_.call(e[r]));for(var a=t[0]&&t[0].length,r=0;r<t.length;r++)if(1===i)isNaN(t[r])&&(t[r]=e[r]);else for(var s=0;s<a;s++)isNaN(t[r][s])&&(t[r][s]=e[r][s])}function Zt(t,e,i){if(t===e)return!0;var n=t.length;if(n!==e.length)return!1;if(1===i){for(a=0;a<n;a++)if(t[a]!==e[a])return!1}else for(var o=t[0].length,a=0;a<n;a++)for(var r=0;r<o;r++)if(t[a][r]!==e[a][r])return!1;return!0}function Ut(t,e,i,n,o,a,r,s,l){var h=t.length;if(1==l)for(c=0;c<h;c++)s[c]=jt(t[c],e[c],i[c],n[c],o,a,r);else for(var u=t[0].length,c=0;c<h;c++)for(var d=0;d<u;d++)s[c][d]=jt(t[c][d],e[c][d],i[c][d],n[c][d],o,a,r)}function jt(t,e,i,n,o,a,r){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*r+(-3*(e-i)-2*s-l)*a+s*o+e}function Xt(t){if(c(t)){var e=t.length;if(c(t[0])){for(var i=[],n=0;n<e;n++)i.push(d_.call(t[n]));return i}return d_.call(t)}return t}function Yt(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function qt(t){var e=t[t.length-1].value;return c(e&&e[0])?2:1}function $t(t,e,i,n,o,a){var r=t._getter,s=t._setter,l="spline"===e,h=n.length;if(h){var u,d=c(n[0].value),f=!1,p=!1,g=d?qt(n):0;n.sort(function(t,e){return t.time-e.time}),u=n[h-1].time;for(var m=[],v=[],y=n[0].value,x=!0,_=0;_<h;_++){m.push(n[_].time/u);var w=n[_].value;if(d&&Zt(w,y,g)||!d&&w===y||(x=!1),y=w,"string"==typeof w){var b=Dt(w);b?(w=b,f=!0):p=!0}v.push(w)}if(a||!x){for(var S=v[h-1],_=0;_<h-1;_++)d?Ht(v[_],S,g):!isNaN(v[_])||isNaN(S)||p||f||(v[_]=S);d&&Ht(r(t._target,o),S,g);var M,I,T,A,D,C,L=0,k=0;if(f)var P=[0,0,0,0];var O=new vt({target:t._target,life:u,loop:t._loop,delay:t._delay,onframe:function(t,e){var i;if(e<0)i=0;else if(e<k){for(i=M=Math.min(L+1,h-1);i>=0&&!(m[i]<=e);i--);i=Math.min(i,h-2)}else{for(i=L;i<h&&!(m[i]>e);i++);i=Math.min(i-1,h-2)}L=i,k=e;var n=m[i+1]-m[i];if(0!==n)if(I=(e-m[i])/n,l)if(A=v[i],T=v[0===i?i:i-1],D=v[i>h-2?h-1:i+1],C=v[i>h-3?h-1:i+2],d)Ut(T,A,D,C,I,I*I,I*I*I,r(t,o),g);else{if(f)a=Ut(T,A,D,C,I,I*I,I*I*I,P,1),a=Yt(P);else{if(p)return Wt(A,D,I);a=jt(T,A,D,C,I,I*I,I*I*I)}s(t,o,a)}else if(d)Ft(v[i],v[i+1],I,r(t,o),g);else{var a;if(f)Ft(v[i],v[i+1],I,P,1),a=Yt(P);else{if(p)return Wt(v[i],v[i+1],I);a=Gt(v[i],v[i+1],I)}s(t,o,a)}},ondestroy:i});return e&&"spline"!==e&&(O.easing=e),O}}}function Kt(t,e,i,n){i<0&&(t+=i,i=-i),n<0&&(e+=n,n=-n),this.x=t,this.y=e,this.width=i,this.height=n}function Jt(t){for(var e=0;t>=M_;)e|=1&t,t>>=1;return t+e}function Qt(t,e,i,n){var o=e+1;if(o===i)return 1;if(n(t[o++],t[e])<0){for(;o<i&&n(t[o],t[o-1])<0;)o++;te(t,e,o)}else for(;o<i&&n(t[o],t[o-1])>=0;)o++;return o-e}function te(t,e,i){for(i--;e<i;){var n=t[e];t[e++]=t[i],t[i--]=n}}function ee(t,e,i,n,o){for(n===e&&n++;n<i;n++){for(var a,r=t[n],s=e,l=n;s<l;)o(r,t[a=s+l>>>1])<0?l=a:s=a+1;var h=n-s;switch(h){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;h>0;)t[s+h]=t[s+h-1],h--}t[s]=r}}function ie(t,e,i,n,o,a){var r=0,s=0,l=1;if(a(t,e[i+o])>0){for(s=n-o;l<s&&a(t,e[i+o+l])>0;)r=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),r+=o,l+=o}else{for(s=o+1;l<s&&a(t,e[i+o-l])<=0;)r=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var h=r;r=o-l,l=o-h}for(r++;r<l;){var u=r+(l-r>>>1);a(t,e[i+u])>0?r=u+1:l=u}return l}function ne(t,e,i,n,o,a){var r=0,s=0,l=1;if(a(t,e[i+o])<0){for(s=o+1;l<s&&a(t,e[i+o-l])<0;)r=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var h=r;r=o-l,l=o-h}else{for(s=n-o;l<s&&a(t,e[i+o+l])>=0;)r=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),r+=o,l+=o}for(r++;r<l;){var u=r+(l-r>>>1);a(t,e[i+u])<0?l=u:r=u+1}return l}function oe(t,e){function i(i){var s=a[i],h=r[i],u=a[i+1],c=r[i+1];r[i]=h+c,i===l-3&&(a[i+1]=a[i+2],r[i+1]=r[i+2]),l--;var d=ne(t[u],t,s,h,0,e);s+=d,0!==(h-=d)&&0!==(c=ie(t[s+h-1],t,u,c,c-1,e))&&(h<=c?n(s,h,u,c):o(s,h,u,c))}function n(i,n,o,a){var r=0;for(r=0;r<n;r++)h[r]=t[i+r];var l=0,u=o,c=i;if(t[c++]=t[u++],0!=--a)if(1!==n){for(var d,f,p,g=s;;){d=0,f=0,p=!1;do{if(e(t[u],h[l])<0){if(t[c++]=t[u++],f++,d=0,0==--a){p=!0;break}}else if(t[c++]=h[l++],d++,f=0,1==--n){p=!0;break}}while((d|f)<g);if(p)break;do{if(0!==(d=ne(t[u],h,l,n,0,e))){for(r=0;r<d;r++)t[c+r]=h[l+r];if(c+=d,l+=d,(n-=d)<=1){p=!0;break}}if(t[c++]=t[u++],0==--a){p=!0;break}if(0!==(f=ie(h[l],t,u,a,0,e))){for(r=0;r<f;r++)t[c+r]=t[u+r];if(c+=f,u+=f,0===(a-=f)){p=!0;break}}if(t[c++]=h[l++],1==--n){p=!0;break}g--}while(d>=I_||f>=I_);if(p)break;g<0&&(g=0),g+=2}if((s=g)<1&&(s=1),1===n){for(r=0;r<a;r++)t[c+r]=t[u+r];t[c+a]=h[l]}else{if(0===n)throw new Error;for(r=0;r<n;r++)t[c+r]=h[l+r]}}else{for(r=0;r<a;r++)t[c+r]=t[u+r];t[c+a]=h[l]}else for(r=0;r<n;r++)t[c+r]=h[l+r]}function o(i,n,o,a){var r=0;for(r=0;r<a;r++)h[r]=t[o+r];var l=i+n-1,u=a-1,c=o+a-1,d=0,f=0;if(t[c--]=t[l--],0!=--n)if(1!==a){for(var p=s;;){var g=0,m=0,v=!1;do{if(e(h[u],t[l])<0){if(t[c--]=t[l--],g++,m=0,0==--n){v=!0;break}}else if(t[c--]=h[u--],m++,g=0,1==--a){v=!0;break}}while((g|m)<p);if(v)break;do{if(0!=(g=n-ne(h[u],t,i,n,n-1,e))){for(n-=g,f=(c-=g)+1,d=(l-=g)+1,r=g-1;r>=0;r--)t[f+r]=t[d+r];if(0===n){v=!0;break}}if(t[c--]=h[u--],1==--a){v=!0;break}if(0!=(m=a-ie(t[l],h,0,a,a-1,e))){for(a-=m,f=(c-=m)+1,d=(u-=m)+1,r=0;r<m;r++)t[f+r]=h[d+r];if(a<=1){v=!0;break}}if(t[c--]=t[l--],0==--n){v=!0;break}p--}while(g>=I_||m>=I_);if(v)break;p<0&&(p=0),p+=2}if((s=p)<1&&(s=1),1===a){for(f=(c-=n)+1,d=(l-=n)+1,r=n-1;r>=0;r--)t[f+r]=t[d+r];t[c]=h[u]}else{if(0===a)throw new Error;for(d=c-(a-1),r=0;r<a;r++)t[d+r]=h[r]}}else{for(f=(c-=n)+1,d=(l-=n)+1,r=n-1;r>=0;r--)t[f+r]=t[d+r];t[c]=h[u]}else for(d=c-(a-1),r=0;r<a;r++)t[d+r]=h[r]}var a,r,s=I_,l=0,h=[];a=[],r=[],this.mergeRuns=function(){for(;l>1;){var t=l-2;if(t>=1&&r[t-1]<=r[t]+r[t+1]||t>=2&&r[t-2]<=r[t]+r[t-1])r[t-1]<r[t+1]&&t--;else if(r[t]>r[t+1])break;i(t)}},this.forceMergeRuns=function(){for(;l>1;){var t=l-2;t>0&&r[t-1]<r[t+1]&&t--,i(t)}},this.pushRun=function(t,e){a[l]=t,r[l]=e,l+=1}}function ae(t,e,i,n){i||(i=0),n||(n=t.length);var o=n-i;if(!(o<2)){var a=0;if(o<M_)return a=Qt(t,i,n,e),void ee(t,i,n,i+a,e);var r=new oe(t,e),s=Jt(o);do{if((a=Qt(t,i,n,e))<s){var l=o;l>s&&(l=s),ee(t,i,i+l,i+a,e),a=l}r.pushRun(i,a),r.mergeRuns(),o-=a,i+=a}while(0!==o);r.forceMergeRuns()}}function re(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}function se(t,e,i){var n=null==e.x?0:e.x,o=null==e.x2?1:e.x2,a=null==e.y?0:e.y,r=null==e.y2?0:e.y2;return e.global||(n=n*i.width+i.x,o=o*i.width+i.x,a=a*i.height+i.y,r=r*i.height+i.y),t.createLinearGradient(n,a,o,r)}function le(t,e,i){var n=i.width,o=i.height,a=Math.min(n,o),r=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;return e.global||(r=r*n+i.x,s=s*o+i.y,l*=a),t.createRadialGradient(r,s,0,r,s,l)}function he(){return!1}function ue(t,e,i){var n=Px(),o=e.getWidth(),a=e.getHeight(),r=n.style;return r&&(r.position="absolute",r.left=0,r.top=0,r.width=o+"px",r.height=a+"px",n.setAttribute("data-zr-dom-id",t)),n.width=o*i,n.height=a*i,n}function ce(t){if("string"==typeof t){var e=R_.get(t);return e&&e.image}return t}function de(t,e,i,n,o){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!i)return e;var a=R_.get(t),r={hostEl:i,cb:n,cbPayload:o};return a?!pe(e=a.image)&&a.pending.push(r):(!e&&(e=new Image),e.onload=fe,R_.put(t,e.__cachedImgObj={image:e,pending:[r]}),e.src=e.__zrImageSrc=t),e}return t}return e}function fe(){var t=this.__cachedImgObj;this.onload=this.__cachedImgObj=null;for(var e=0;e<t.pending.length;e++){var i=t.pending[e],n=i.cb;n&&n(this,i.cbPayload),i.hostEl.dirty()}t.pending.length=0}function pe(t){return t&&t.width&&t.height}function ge(t,e){var i=t+":"+(e=e||F_);if(B_[i])return B_[i];for(var n=(t+"").split("\n"),o=0,a=0,r=n.length;a<r;a++)o=Math.max(Ae(n[a],e).width,o);return V_>G_&&(V_=0,B_={}),V_++,B_[i]=o,o}function me(t,e,i,n,o,a,r){return a?ye(t,e,i,n,o,a,r):ve(t,e,i,n,o,r)}function ve(t,e,i,n,o,a){var r=De(t,e,o,a),s=ge(t,e);o&&(s+=o[1]+o[3]);var l=r.outerHeight,h=new Kt(xe(0,s,i),_e(0,l,n),s,l);return h.lineHeight=r.lineHeight,h}function ye(t,e,i,n,o,a,r){var s=Ce(t,{rich:a,truncate:r,font:e,textAlign:i,textPadding:o}),l=s.outerWidth,h=s.outerHeight;return new Kt(xe(0,l,i),_e(0,h,n),l,h)}function xe(t,e,i){return"right"===i?t-=e:"center"===i&&(t-=e/2),t}function _e(t,e,i){return"middle"===i?t-=e/2:"bottom"===i&&(t-=e),t}function we(t,e,i){var n=e.x,o=e.y,a=e.height,r=e.width,s=a/2,l="left",h="top";switch(t){case"left":n-=i,o+=s,l="right",h="middle";break;case"right":n+=i+r,o+=s,h="middle";break;case"top":n+=r/2,o-=i,l="center",h="bottom";break;case"bottom":n+=r/2,o+=a+i,l="center";break;case"inside":n+=r/2,o+=s,l="center",h="middle";break;case"insideLeft":n+=i,o+=s,h="middle";break;case"insideRight":n+=r-i,o+=s,l="right",h="middle";break;case"insideTop":n+=r/2,o+=i,l="center";break;case"insideBottom":n+=r/2,o+=a-i,l="center",h="bottom";break;case"insideTopLeft":n+=i,o+=i;break;case"insideTopRight":n+=r-i,o+=i,l="right";break;case"insideBottomLeft":n+=i,o+=a-i,h="bottom";break;case"insideBottomRight":n+=r-i,o+=a-i,l="right",h="bottom"}return{x:n,y:o,textAlign:l,textVerticalAlign:h}}function be(t,e,i,n,o){if(!e)return"";var a=(t+"").split("\n");o=Se(e,i,n,o);for(var r=0,s=a.length;r<s;r++)a[r]=Me(a[r],o);return a.join("\n")}function Se(t,e,i,n){(n=a({},n)).font=e;var i=A(i,"...");n.maxIterations=A(n.maxIterations,2);var o=n.minChar=A(n.minChar,0);n.cnCharWidth=ge("国",e);var r=n.ascCharWidth=ge("a",e);n.placeholder=A(n.placeholder,"");for(var s=t=Math.max(0,t-1),l=0;l<o&&s>=r;l++)s-=r;var h=ge(i);return h>s&&(i="",h=0),s=t-h,n.ellipsis=i,n.ellipsisWidth=h,n.contentWidth=s,n.containerWidth=t,n}function Me(t,e){var i=e.containerWidth,n=e.font,o=e.contentWidth;if(!i)return"";var a=ge(t,n);if(a<=i)return t;for(var r=0;;r++){if(a<=o||r>=e.maxIterations){t+=e.ellipsis;break}var s=0===r?Ie(t,o,e.ascCharWidth,e.cnCharWidth):a>0?Math.floor(t.length*o/a):0;a=ge(t=t.substr(0,s),n)}return""===t&&(t=e.placeholder),t}function Ie(t,e,i,n){for(var o=0,a=0,r=t.length;a<r&&o<e;a++){var s=t.charCodeAt(a);o+=0<=s&&s<=127?i:n}return a}function Te(t){return ge("国",t)}function Ae(t,e){return H_.measureText(t,e)}function De(t,e,i,n){null!=t&&(t+="");var o=Te(e),a=t?t.split("\n"):[],r=a.length*o,s=r;if(i&&(s+=i[0]+i[2]),t&&n){var l=n.outerHeight,h=n.outerWidth;if(null!=l&&s>l)t="",a=[];else if(null!=h)for(var u=Se(h-(i?i[1]+i[3]:0),e,n.ellipsis,{minChar:n.minChar,placeholder:n.placeholder}),c=0,d=a.length;c<d;c++)a[c]=Me(a[c],u)}return{lines:a,height:r,outerHeight:s,lineHeight:o}}function Ce(t,e){var i={lines:[],width:0,height:0};if(null!=t&&(t+=""),!t)return i;for(var n,o=W_.lastIndex=0;null!=(n=W_.exec(t));){var a=n.index;a>o&&Le(i,t.substring(o,a)),Le(i,n[2],n[1]),o=W_.lastIndex}o<t.length&&Le(i,t.substring(o,t.length));var r=i.lines,s=0,l=0,h=[],u=e.textPadding,c=e.truncate,d=c&&c.outerWidth,f=c&&c.outerHeight;u&&(null!=d&&(d-=u[1]+u[3]),null!=f&&(f-=u[0]+u[2]));for(L=0;L<r.length;L++){for(var p=r[L],g=0,m=0,v=0;v<p.tokens.length;v++){var y=(k=p.tokens[v]).styleName&&e.rich[k.styleName]||{},x=k.textPadding=y.textPadding,_=k.font=y.font||e.font,w=k.textHeight=A(y.textHeight,Te(_));if(x&&(w+=x[0]+x[2]),k.height=w,k.lineHeight=D(y.textLineHeight,e.textLineHeight,w),k.textAlign=y&&y.textAlign||e.textAlign,k.textVerticalAlign=y&&y.textVerticalAlign||"middle",null!=f&&s+k.lineHeight>f)return{lines:[],width:0,height:0};k.textWidth=ge(k.text,_);var b=y.textWidth,S=null==b||"auto"===b;if("string"==typeof b&&"%"===b.charAt(b.length-1))k.percentWidth=b,h.push(k),b=0;else{if(S){b=k.textWidth;var M=y.textBackgroundColor,I=M&&M.image;I&&pe(I=ce(I))&&(b=Math.max(b,I.width*w/I.height))}var T=x?x[1]+x[3]:0;b+=T;var C=null!=d?d-m:null;null!=C&&C<b&&(!S||C<T?(k.text="",k.textWidth=b=0):(k.text=be(k.text,C-T,_,c.ellipsis,{minChar:c.minChar}),k.textWidth=ge(k.text,_),b=k.textWidth+T))}m+=k.width=b,y&&(g=Math.max(g,k.lineHeight))}p.width=m,p.lineHeight=g,s+=g,l=Math.max(l,m)}i.outerWidth=i.width=A(e.textWidth,l),i.outerHeight=i.height=A(e.textHeight,s),u&&(i.outerWidth+=u[1]+u[3],i.outerHeight+=u[0]+u[2]);for(var L=0;L<h.length;L++){var k=h[L],P=k.percentWidth;k.width=parseInt(P,10)/100*l}return i}function Le(t,e,i){for(var n=""===e,o=e.split("\n"),a=t.lines,r=0;r<o.length;r++){var s=o[r],l={styleName:i,text:s,isLineHolder:!s&&!n};if(r)a.push({tokens:[l]});else{var h=(a[a.length-1]||(a[0]={tokens:[]})).tokens,u=h.length;1===u&&h[0].isLineHolder?h[0]=l:(s||!u||n)&&h.push(l)}}}function ke(t){var e=(t.fontSize||t.fontFamily)&&[t.fontStyle,t.fontWeight,(t.fontSize||12)+"px",t.fontFamily||"sans-serif"].join(" ");return e&&P(e)||t.textFont||t.font}function Pe(t,e){var i,n,o,a,r=e.x,s=e.y,l=e.width,h=e.height,u=e.r;l<0&&(r+=l,l=-l),h<0&&(s+=h,h=-h),"number"==typeof u?i=n=o=a=u:u instanceof Array?1===u.length?i=n=o=a=u[0]:2===u.length?(i=o=u[0],n=a=u[1]):3===u.length?(i=u[0],n=a=u[1],o=u[2]):(i=u[0],n=u[1],o=u[2],a=u[3]):i=n=o=a=0;var c;i+n>l&&(i*=l/(c=i+n),n*=l/c),o+a>l&&(o*=l/(c=o+a),a*=l/c),n+o>h&&(n*=h/(c=n+o),o*=h/c),i+a>h&&(i*=h/(c=i+a),a*=h/c),t.moveTo(r+i,s),t.lineTo(r+l-n,s),0!==n&&t.quadraticCurveTo(r+l,s,r+l,s+n),t.lineTo(r+l,s+h-o),0!==o&&t.quadraticCurveTo(r+l,s+h,r+l-o,s+h),t.lineTo(r+a,s+h),0!==a&&t.quadraticCurveTo(r,s+h,r,s+h-a),t.lineTo(r,s+i),0!==i&&t.quadraticCurveTo(r,s,r+i,s)}function Oe(t){return Ne(t),d(t.rich,Ne),t}function Ne(t){if(t){t.font=ke(t);var e=t.textAlign;"middle"===e&&(e="center"),t.textAlign=null==e||Z_[e]?e:"left";var i=t.textVerticalAlign||t.textBaseline;"center"===i&&(i="middle"),t.textVerticalAlign=null==i||U_[i]?i:"top",t.textPadding&&(t.textPadding=L(t.textPadding))}}function Ee(t,e,i,n,o){n.rich?Re(t,e,i,n,o):ze(t,e,i,n,o)}function ze(t,e,i,n,o){var a=Ue(e,"font",n.font||F_),r=n.textPadding,s=t.__textCotentBlock;s&&!t.__dirty||(s=t.__textCotentBlock=De(i,a,r,n.truncate));var l=s.outerHeight,h=s.lines,u=s.lineHeight,c=Ze(l,n,o),d=c.baseX,f=c.baseY,p=c.textAlign,g=c.textVerticalAlign;Ve(e,n,o,d,f);var m=_e(f,l,g),v=d,y=m,x=We(n);if(x||r){var _=ge(i,a);r&&(_+=r[1]+r[3]);var w=xe(d,_,p);x&&Fe(t,e,n,w,m,_,l),r&&(v=qe(d,p,r),y+=r[0])}Ue(e,"textAlign",p||"left"),Ue(e,"textBaseline","middle"),Ue(e,"shadowBlur",n.textShadowBlur||0),Ue(e,"shadowColor",n.textShadowColor||"transparent"),Ue(e,"shadowOffsetX",n.textShadowOffsetX||0),Ue(e,"shadowOffsetY",n.textShadowOffsetY||0),y+=u/2;var b=n.textStrokeWidth,S=je(n.textStroke,b),M=Xe(n.textFill);S&&(Ue(e,"lineWidth",b),Ue(e,"strokeStyle",S)),M&&Ue(e,"fillStyle",M);for(var I=0;I<h.length;I++)S&&e.strokeText(h[I],v,y),M&&e.fillText(h[I],v,y),y+=u}function Re(t,e,i,n,o){var a=t.__textCotentBlock;a&&!t.__dirty||(a=t.__textCotentBlock=Ce(i,n)),Be(t,e,a,n,o)}function Be(t,e,i,n,o){var a=i.width,r=i.outerWidth,s=i.outerHeight,l=n.textPadding,h=Ze(s,n,o),u=h.baseX,c=h.baseY,d=h.textAlign,f=h.textVerticalAlign;Ve(e,n,o,u,c);var p=xe(u,r,d),g=_e(c,s,f),m=p,v=g;l&&(m+=l[3],v+=l[0]);var y=m+a;We(n)&&Fe(t,e,n,p,g,r,s);for(var x=0;x<i.lines.length;x++){for(var _,w=i.lines[x],b=w.tokens,S=b.length,M=w.lineHeight,I=w.width,T=0,A=m,D=y,C=S-1;T<S&&(!(_=b[T]).textAlign||"left"===_.textAlign);)Ge(t,e,_,n,M,v,A,"left"),I-=_.width,A+=_.width,T++;for(;C>=0&&"right"===(_=b[C]).textAlign;)Ge(t,e,_,n,M,v,D,"right"),I-=_.width,D-=_.width,C--;for(A+=(a-(A-m)-(y-D)-I)/2;T<=C;)Ge(t,e,_=b[T],n,M,v,A+_.width/2,"center"),A+=_.width,T++;v+=M}}function Ve(t,e,i,n,o){if(i&&e.textRotation){var a=e.textOrigin;"center"===a?(n=i.width/2+i.x,o=i.height/2+i.y):a&&(n=a[0]+i.x,o=a[1]+i.y),t.translate(n,o),t.rotate(-e.textRotation),t.translate(-n,-o)}}function Ge(t,e,i,n,o,a,r,s){var l=n.rich[i.styleName]||{},h=i.textVerticalAlign,u=a+o/2;"top"===h?u=a+i.height/2:"bottom"===h&&(u=a+o-i.height/2),!i.isLineHolder&&We(l)&&Fe(t,e,l,"right"===s?r-i.width:"center"===s?r-i.width/2:r,u-i.height/2,i.width,i.height);var c=i.textPadding;c&&(r=qe(r,s,c),u-=i.height/2-c[2]-i.textHeight/2),Ue(e,"shadowBlur",D(l.textShadowBlur,n.textShadowBlur,0)),Ue(e,"shadowColor",l.textShadowColor||n.textShadowColor||"transparent"),Ue(e,"shadowOffsetX",D(l.textShadowOffsetX,n.textShadowOffsetX,0)),Ue(e,"shadowOffsetY",D(l.textShadowOffsetY,n.textShadowOffsetY,0)),Ue(e,"textAlign",s),Ue(e,"textBaseline","middle"),Ue(e,"font",i.font||F_);var d=je(l.textStroke||n.textStroke,p),f=Xe(l.textFill||n.textFill),p=A(l.textStrokeWidth,n.textStrokeWidth);d&&(Ue(e,"lineWidth",p),Ue(e,"strokeStyle",d),e.strokeText(i.text,r,u)),f&&(Ue(e,"fillStyle",f),e.fillText(i.text,r,u))}function We(t){return t.textBackgroundColor||t.textBorderWidth&&t.textBorderColor}function Fe(t,e,i,n,o,a,r){var s=i.textBackgroundColor,l=i.textBorderWidth,h=i.textBorderColor,u=_(s);if(Ue(e,"shadowBlur",i.textBoxShadowBlur||0),Ue(e,"shadowColor",i.textBoxShadowColor||"transparent"),Ue(e,"shadowOffsetX",i.textBoxShadowOffsetX||0),Ue(e,"shadowOffsetY",i.textBoxShadowOffsetY||0),u||l&&h){e.beginPath();var c=i.textBorderRadius;c?Pe(e,{x:n,y:o,width:a,height:r,r:c}):e.rect(n,o,a,r),e.closePath()}if(u)Ue(e,"fillStyle",s),e.fill();else if(w(s)){var d=s.image;(d=de(d,null,t,He,s))&&pe(d)&&e.drawImage(d,n,o,a,r)}l&&h&&(Ue(e,"lineWidth",l),Ue(e,"strokeStyle",h),e.stroke())}function He(t,e){e.image=t}function Ze(t,e,i){var n=e.x||0,o=e.y||0,a=e.textAlign,r=e.textVerticalAlign;if(i){var s=e.textPosition;if(s instanceof Array)n=i.x+Ye(s[0],i.width),o=i.y+Ye(s[1],i.height);else{var l=we(s,i,e.textDistance);n=l.x,o=l.y,a=a||l.textAlign,r=r||l.textVerticalAlign}var h=e.textOffset;h&&(n+=h[0],o+=h[1])}return{baseX:n,baseY:o,textAlign:a,textVerticalAlign:r}}function Ue(t,e,i){return t[e]=D_(t,e,i),t[e]}function je(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function Xe(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function Ye(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}function qe(t,e,i){return"right"===e?t-i[1]:"center"===e?t+i[3]/2-i[1]/2:t+i[3]}function $e(t,e){return null!=t&&(t||e.textBackgroundColor||e.textBorderWidth&&e.textBorderColor||e.textPadding)}function Ke(t){t=t||{},x_.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new L_(t.style,this),this._rect=null,this.__clipPaths=[]}function Je(t){Ke.call(this,t)}function Qe(t){return parseInt(t,10)}function ti(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}function ei(t,e,i){return Y_.copy(t.getBoundingRect()),t.transform&&Y_.applyTransform(t.transform),q_.width=e,q_.height=i,!Y_.intersect(q_)}function ii(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var i=0;i<t.length;i++)if(t[i]!==e[i])return!0}function ni(t,e){for(var i=0;i<t.length;i++){var n=t[i];n.setTransform(e),e.beginPath(),n.buildPath(e,n.shape),e.clip(),n.restoreTransform(e)}}function oi(t,e){var i=document.createElement("div");return i.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",i}function ai(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function ri(t,e,i,n){return i=i||{},n||!_x.canvasSupported?si(t,e,i):_x.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(i.zrX=e.layerX,i.zrY=e.layerY):null!=e.offsetX?(i.zrX=e.offsetX,i.zrY=e.offsetY):si(t,e,i),i}function si(t,e,i){var n=ai(t);i.zrX=e.clientX-n.left,i.zrY=e.clientY-n.top}function li(t,e,i){if(null!=(e=e||window.event).zrX)return e;var n=e.type;if(n&&n.indexOf("touch")>=0){var o="touchend"!=n?e.targetTouches[0]:e.changedTouches[0];o&&ri(t,o,e,i)}else ri(t,e,e,i),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;var a=e.button;return null==e.which&&void 0!==a&&J_.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function hi(t,e,i){K_?t.addEventListener(e,i):t.attachEvent("on"+e,i)}function ui(t,e,i){K_?t.removeEventListener(e,i):t.detachEvent("on"+e,i)}function ci(t){return t.which>1}function di(t){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1];return Math.sqrt(e*e+i*i)}function fi(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}function pi(t){return"mousewheel"===t&&_x.browser.firefox?"DOMMouseScroll":t}function gi(t,e,i){var n=t._gestureMgr;"start"===i&&n.clear();var o=n.recognize(e,t.handler.findHover(e.zrX,e.zrY,null).target,t.dom);if("end"===i&&n.clear(),o){var a=o.type;e.gestureEvent=a,t.handler.dispatchToElement({target:o.target},a,o.event)}}function mi(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function vi(t){var e=t.pointerType;return"pen"===e||"touch"===e}function yi(t){function e(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}d(ow,function(e){t._handlers[e]=m(sw[e],t)}),d(rw,function(e){t._handlers[e]=m(sw[e],t)}),d(nw,function(i){t._handlers[i]=e(sw[i],t)})}function xi(t){function e(e,i){d(e,function(e){hi(t,pi(e),i._handlers[e])},i)}Hx.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new ew,this._handlers={},yi(this),_x.pointerEventsSupported?e(rw,this):(_x.touchEventsSupported&&e(ow,this),e(nw,this))}function _i(t,e){var i=new dw(yx(),t,e);return cw[i.id]=i,i}function wi(t,e){uw[t]=e}function bi(t){delete cw[t]}function Si(t){return t instanceof Array?t:null==t?[]:[t]}function Mi(t,e,i){if(t){t[e]=t[e]||{},t.emphasis=t.emphasis||{},t.emphasis[e]=t.emphasis[e]||{};for(var n=0,o=i.length;n<o;n++){var a=i[n];!t.emphasis[e].hasOwnProperty(a)&&t[e].hasOwnProperty(a)&&(t.emphasis[e][a]=t[e][a])}}}function Ii(t){return!gw(t)||mw(t)||t instanceof Date?t:t.value}function Ti(t){return gw(t)&&!(t instanceof Array)}function Ai(t,e){e=(e||[]).slice();var i=f(t||[],function(t,e){return{exist:t}});return pw(e,function(t,n){if(gw(t)){for(o=0;o<i.length;o++)if(!i[o].option&&null!=t.id&&i[o].exist.id===t.id+"")return i[o].option=t,void(e[n]=null);for(var o=0;o<i.length;o++){var a=i[o].exist;if(!(i[o].option||null!=a.id&&null!=t.id||null==t.name||Ci(t)||Ci(a)||a.name!==t.name+""))return i[o].option=t,void(e[n]=null)}}}),pw(e,function(t,e){if(gw(t)){for(var n=0;n<i.length;n++){var o=i[n].exist;if(!i[n].option&&!Ci(o)&&null==t.id){i[n].option=t;break}}n>=i.length&&i.push({option:t})}}),i}function Di(t){var e=z();pw(t,function(t,i){var n=t.exist;n&&e.set(n.id,t)}),pw(t,function(t,i){var n=t.option;k(!n||null==n.id||!e.get(n.id)||e.get(n.id)===t,"id duplicates: "+(n&&n.id)),n&&null!=n.id&&e.set(n.id,t),!t.keyInfo&&(t.keyInfo={})}),pw(t,function(t,i){var n=t.exist,o=t.option,a=t.keyInfo;if(gw(o)){if(a.name=null!=o.name?o.name+"":n?n.name:vw,n)a.id=n.id;else if(null!=o.id)a.id=o.id+"";else{var r=0;do{a.id="\0"+a.name+"\0"+r++}while(e.get(a.id))}e.set(a.id,t)}})}function Ci(t){return gw(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")}function Li(t,e){function i(t,e,i){for(var n=0,o=t.length;n<o;n++)for(var a=t[n].seriesId,r=Si(t[n].dataIndex),s=i&&i[a],l=0,h=r.length;l<h;l++){var u=r[l];s&&s[u]?s[u]=null:(e[a]||(e[a]={}))[u]=1}}function n(t,e){var i=[];for(var o in t)if(t.hasOwnProperty(o)&&null!=t[o])if(e)i.push(+o);else{var a=n(t[o],!0);a.length&&i.push({seriesId:o,dataIndex:a})}return i}var o={},a={};return i(t||[],o),i(e||[],a,o),[n(o),n(a)]}function ki(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?y(e.dataIndex)?f(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?y(e.name)?f(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0}function Pi(){var t="__\0ec_inner_"+xw+++"_"+Math.random().toFixed(5);return function(e){return e[t]||(e[t]={})}}function Oi(t,e,i){if(_(e)){var n={};n[e+"Index"]=0,e=n}var o=i&&i.defaultMainType;!o||Ni(e,o+"Index")||Ni(e,o+"Id")||Ni(e,o+"Name")||(e[o+"Index"]=0);var a={};return pw(e,function(n,o){var n=e[o];if("dataIndex"!==o&&"dataIndexInside"!==o){var r=o.match(/^(\w+)(Index|Id|Name)$/)||[],s=r[1],h=(r[2]||"").toLowerCase();if(!(!s||!h||null==n||"index"===h&&"none"===n||i&&i.includeMainTypes&&l(i.includeMainTypes,s)<0)){var u={mainType:s};"index"===h&&"all"===n||(u[h]=n);var c=t.queryComponents(u);a[s+"Models"]=c,a[s+"Model"]=c[0]}}else a[o]=n}),a}function Ni(t,e){return t&&t.hasOwnProperty(e)}function Ei(t,e,i){t.setAttribute?t.setAttribute(e,i):t[e]=i}function zi(t,e){return t.getAttribute?t.getAttribute(e):t[e]}function Ri(t){var e={main:"",sub:""};return t&&(t=t.split(_w),e.main=t[0]||"",e.sub=t[1]||""),e}function Bi(t){k(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function Vi(t,e){t.$constructor=t,t.extend=function(t){var e=this,i=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return a(i.prototype,t),i.extend=this.extend,i.superCall=Wi,i.superApply=Fi,h(i,this),i.superClass=e,i}}function Gi(t){var e=["__\0is_clz",bw++,Math.random().toFixed(3)].join("_");t.prototype[e]=!0,t.isInstance=function(t){return!(!t||!t[e])}}function Wi(t,e){var i=C(arguments,2);return this.superClass.prototype[e].apply(t,i)}function Fi(t,e,i){return this.superClass.prototype[e].apply(t,i)}function Hi(t,e){function i(t){var e=n[t.main];return e&&e[ww]||((e=n[t.main]={})[ww]=!0),e}e=e||{};var n={};if(t.registerClass=function(t,e){return e&&(Bi(e),(e=Ri(e)).sub?e.sub!==ww&&(i(e)[e.sub]=t):n[e.main]=t),t},t.getClass=function(t,e,i){var o=n[t];if(o&&o[ww]&&(o=e?o[e]:null),i&&!o)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return o},t.getClassesByMainType=function(t){t=Ri(t);var e=[],i=n[t.main];return i&&i[ww]?d(i,function(t,i){i!==ww&&e.push(t)}):e.push(i),e},t.hasClass=function(t){return t=Ri(t),!!n[t.main]},t.getAllClassMainTypes=function(){var t=[];return d(n,function(e,i){t.push(i)}),t},t.hasSubTypes=function(t){t=Ri(t);var e=n[t.main];return e&&e[ww]},t.parseClassType=Ri,e.registerWhenExtend){var o=t.extend;o&&(t.extend=function(e){var i=o.call(this,e);return t.registerClass(i,e.type)})}return t}function Zi(t){return t>-Lw&&t<Lw}function Ui(t){return t>Lw||t<-Lw}function ji(t,e,i,n,o){var a=1-o;return a*a*(a*t+3*o*e)+o*o*(o*n+3*a*i)}function Xi(t,e,i,n,o){var a=1-o;return 3*(((e-t)*a+2*(i-e)*o)*a+(n-i)*o*o)}function Yi(t,e,i,n,o,a){var r=n+3*(e-i)-t,s=3*(i-2*e+t),l=3*(e-t),h=t-o,u=s*s-3*r*l,c=s*l-9*r*h,d=l*l-3*s*h,f=0;if(Zi(u)&&Zi(c))Zi(s)?a[0]=0:(M=-l/s)>=0&&M<=1&&(a[f++]=M);else{var p=c*c-4*u*d;if(Zi(p)){var g=c/u,m=-g/2;(M=-s/r+g)>=0&&M<=1&&(a[f++]=M),m>=0&&m<=1&&(a[f++]=m)}else if(p>0){var v=Cw(p),y=u*s+1.5*r*(-c+v),x=u*s+1.5*r*(-c-v);(M=(-s-((y=y<0?-Dw(-y,Ow):Dw(y,Ow))+(x=x<0?-Dw(-x,Ow):Dw(x,Ow))))/(3*r))>=0&&M<=1&&(a[f++]=M)}else{var _=(2*u*s-3*r*c)/(2*Cw(u*u*u)),w=Math.acos(_)/3,b=Cw(u),S=Math.cos(w),M=(-s-2*b*S)/(3*r),m=(-s+b*(S+Pw*Math.sin(w)))/(3*r),I=(-s+b*(S-Pw*Math.sin(w)))/(3*r);M>=0&&M<=1&&(a[f++]=M),m>=0&&m<=1&&(a[f++]=m),I>=0&&I<=1&&(a[f++]=I)}}return f}function qi(t,e,i,n,o){var a=6*i-12*e+6*t,r=9*e+3*n-3*t-9*i,s=3*e-3*t,l=0;if(Zi(r))Ui(a)&&(c=-s/a)>=0&&c<=1&&(o[l++]=c);else{var h=a*a-4*r*s;if(Zi(h))o[0]=-a/(2*r);else if(h>0){var u=Cw(h),c=(-a+u)/(2*r),d=(-a-u)/(2*r);c>=0&&c<=1&&(o[l++]=c),d>=0&&d<=1&&(o[l++]=d)}}return l}function $i(t,e,i,n,o,a){var r=(e-t)*o+t,s=(i-e)*o+e,l=(n-i)*o+i,h=(s-r)*o+r,u=(l-s)*o+s,c=(u-h)*o+h;a[0]=t,a[1]=r,a[2]=h,a[3]=c,a[4]=c,a[5]=u,a[6]=l,a[7]=n}function Ki(t,e,i,n,o,a,r,s,l,h,u){var c,d,f,p,g,m=.005,v=1/0;Nw[0]=l,Nw[1]=h;for(var y=0;y<1;y+=.05)Ew[0]=ji(t,i,o,r,y),Ew[1]=ji(e,n,a,s,y),(p=Gx(Nw,Ew))<v&&(c=y,v=p);v=1/0;for(var x=0;x<32&&!(m<kw);x++)d=c-m,f=c+m,Ew[0]=ji(t,i,o,r,d),Ew[1]=ji(e,n,a,s,d),p=Gx(Ew,Nw),d>=0&&p<v?(c=d,v=p):(zw[0]=ji(t,i,o,r,f),zw[1]=ji(e,n,a,s,f),g=Gx(zw,Nw),f<=1&&g<v?(c=f,v=g):m*=.5);return u&&(u[0]=ji(t,i,o,r,c),u[1]=ji(e,n,a,s,c)),Cw(v)}function Ji(t,e,i,n){var o=1-n;return o*(o*t+2*n*e)+n*n*i}function Qi(t,e,i,n){return 2*((1-n)*(e-t)+n*(i-e))}function tn(t,e,i,n,o){var a=t-2*e+i,r=2*(e-t),s=t-n,l=0;if(Zi(a))Ui(r)&&(c=-s/r)>=0&&c<=1&&(o[l++]=c);else{var h=r*r-4*a*s;if(Zi(h))(c=-r/(2*a))>=0&&c<=1&&(o[l++]=c);else if(h>0){var u=Cw(h),c=(-r+u)/(2*a),d=(-r-u)/(2*a);c>=0&&c<=1&&(o[l++]=c),d>=0&&d<=1&&(o[l++]=d)}}return l}function en(t,e,i){var n=t+i-2*e;return 0===n?.5:(t-e)/n}function nn(t,e,i,n,o){var a=(e-t)*n+t,r=(i-e)*n+e,s=(r-a)*n+a;o[0]=t,o[1]=a,o[2]=s,o[3]=s,o[4]=r,o[5]=i}function on(t,e,i,n,o,a,r,s,l){var h,u=.005,c=1/0;Nw[0]=r,Nw[1]=s;for(var d=0;d<1;d+=.05)Ew[0]=Ji(t,i,o,d),Ew[1]=Ji(e,n,a,d),(m=Gx(Nw,Ew))<c&&(h=d,c=m);c=1/0;for(var f=0;f<32&&!(u<kw);f++){var p=h-u,g=h+u;Ew[0]=Ji(t,i,o,p),Ew[1]=Ji(e,n,a,p);var m=Gx(Ew,Nw);if(p>=0&&m<c)h=p,c=m;else{zw[0]=Ji(t,i,o,g),zw[1]=Ji(e,n,a,g);var v=Gx(zw,Nw);g<=1&&v<c?(h=g,c=v):u*=.5}}return l&&(l[0]=Ji(t,i,o,h),l[1]=Ji(e,n,a,h)),Cw(c)}function an(t,e,i){if(0!==t.length){var n,o=t[0],a=o[0],r=o[0],s=o[1],l=o[1];for(n=1;n<t.length;n++)o=t[n],a=Rw(a,o[0]),r=Bw(r,o[0]),s=Rw(s,o[1]),l=Bw(l,o[1]);e[0]=a,e[1]=s,i[0]=r,i[1]=l}}function rn(t,e,i,n,o,a){o[0]=Rw(t,i),o[1]=Rw(e,n),a[0]=Bw(t,i),a[1]=Bw(e,n)}function sn(t,e,i,n,o,a,r,s,l,h){var u,c=qi,d=ji,f=c(t,i,o,r,Uw);for(l[0]=1/0,l[1]=1/0,h[0]=-1/0,h[1]=-1/0,u=0;u<f;u++){var p=d(t,i,o,r,Uw[u]);l[0]=Rw(p,l[0]),h[0]=Bw(p,h[0])}for(f=c(e,n,a,s,jw),u=0;u<f;u++){var g=d(e,n,a,s,jw[u]);l[1]=Rw(g,l[1]),h[1]=Bw(g,h[1])}l[0]=Rw(t,l[0]),h[0]=Bw(t,h[0]),l[0]=Rw(r,l[0]),h[0]=Bw(r,h[0]),l[1]=Rw(e,l[1]),h[1]=Bw(e,h[1]),l[1]=Rw(s,l[1]),h[1]=Bw(s,h[1])}function ln(t,e,i,n,o,a,r,s){var l=en,h=Ji,u=Bw(Rw(l(t,i,o),1),0),c=Bw(Rw(l(e,n,a),1),0),d=h(t,i,o,u),f=h(e,n,a,c);r[0]=Rw(t,o,d),r[1]=Rw(e,a,f),s[0]=Bw(t,o,d),s[1]=Bw(e,a,f)}function hn(t,e,i,n,o,a,r,s,l){var h=tt,u=et,c=Math.abs(o-a);if(c%Ww<1e-4&&c>1e-4)return s[0]=t-i,s[1]=e-n,l[0]=t+i,void(l[1]=e+n);if(Fw[0]=Gw(o)*i+t,Fw[1]=Vw(o)*n+e,Hw[0]=Gw(a)*i+t,Hw[1]=Vw(a)*n+e,h(s,Fw,Hw),u(l,Fw,Hw),(o%=Ww)<0&&(o+=Ww),(a%=Ww)<0&&(a+=Ww),o>a&&!r?a+=Ww:o<a&&r&&(o+=Ww),r){var d=a;a=o,o=d}for(var f=0;f<a;f+=Math.PI/2)f>o&&(Zw[0]=Gw(f)*i+t,Zw[1]=Vw(f)*n+e,h(s,Zw,s),u(l,Zw,l))}function un(t,e,i,n,o,a,r){if(0===o)return!1;var s=o,l=0,h=t;if(r>e+s&&r>n+s||r<e-s&&r<n-s||a>t+s&&a>i+s||a<t-s&&a<i-s)return!1;if(t===i)return Math.abs(a-t)<=s/2;var u=(l=(e-n)/(t-i))*a-r+(h=(t*n-i*e)/(t-i));return u*u/(l*l+1)<=s/2*s/2}function cn(t,e,i,n,o,a,r,s,l,h,u){if(0===l)return!1;var c=l;return!(u>e+c&&u>n+c&&u>a+c&&u>s+c||u<e-c&&u<n-c&&u<a-c&&u<s-c||h>t+c&&h>i+c&&h>o+c&&h>r+c||h<t-c&&h<i-c&&h<o-c&&h<r-c)&&Ki(t,e,i,n,o,a,r,s,h,u,null)<=c/2}function dn(t,e,i,n,o,a,r,s,l){if(0===r)return!1;var h=r;return!(l>e+h&&l>n+h&&l>a+h||l<e-h&&l<n-h&&l<a-h||s>t+h&&s>i+h&&s>o+h||s<t-h&&s<i-h&&s<o-h)&&on(t,e,i,n,o,a,s,l,null)<=h/2}function fn(t){return(t%=rb)<0&&(t+=rb),t}function pn(t,e,i,n,o,a,r,s,l){if(0===r)return!1;var h=r;s-=t,l-=e;var u=Math.sqrt(s*s+l*l);if(u-h>i||u+h<i)return!1;if(Math.abs(n-o)%sb<1e-4)return!0;if(a){var c=n;n=fn(o),o=fn(c)}else n=fn(n),o=fn(o);n>o&&(o+=sb);var d=Math.atan2(l,s);return d<0&&(d+=sb),d>=n&&d<=o||d+sb>=n&&d+sb<=o}function gn(t,e,i,n,o,a){if(a>e&&a>n||a<e&&a<n)return 0;if(n===e)return 0;var r=n<e?1:-1,s=(a-e)/(n-e);return 1!==s&&0!==s||(r=n<e?.5:-.5),s*(i-t)+t>o?r:0}function mn(t,e){return Math.abs(t-e)<ub}function vn(){var t=db[0];db[0]=db[1],db[1]=t}function yn(t,e,i,n,o,a,r,s,l,h){if(h>e&&h>n&&h>a&&h>s||h<e&&h<n&&h<a&&h<s)return 0;var u=Yi(e,n,a,s,h,cb);if(0===u)return 0;for(var c,d,f=0,p=-1,g=0;g<u;g++){var m=cb[g],v=0===m||1===m?.5:1;ji(t,i,o,r,m)<l||(p<0&&(p=qi(e,n,a,s,db),db[1]<db[0]&&p>1&&vn(),c=ji(e,n,a,s,db[0]),p>1&&(d=ji(e,n,a,s,db[1]))),2==p?m<db[0]?f+=c<e?v:-v:m<db[1]?f+=d<c?v:-v:f+=s<d?v:-v:m<db[0]?f+=c<e?v:-v:f+=s<c?v:-v)}return f}function xn(t,e,i,n,o,a,r,s){if(s>e&&s>n&&s>a||s<e&&s<n&&s<a)return 0;var l=tn(e,n,a,s,cb);if(0===l)return 0;var h=en(e,n,a);if(h>=0&&h<=1){for(var u=0,c=Ji(e,n,a,h),d=0;d<l;d++){f=0===cb[d]||1===cb[d]?.5:1;(p=Ji(t,i,o,cb[d]))<r||(cb[d]<h?u+=c<e?f:-f:u+=a<c?f:-f)}return u}var f=0===cb[0]||1===cb[0]?.5:1,p=Ji(t,i,o,cb[0]);return p<r?0:a<e?f:-f}function _n(t,e,i,n,o,a,r,s){if((s-=e)>i||s<-i)return 0;h=Math.sqrt(i*i-s*s);cb[0]=-h,cb[1]=h;var l=Math.abs(n-o);if(l<1e-4)return 0;if(l%hb<1e-4){n=0,o=hb;p=a?1:-1;return r>=cb[0]+t&&r<=cb[1]+t?p:0}if(a){var h=n;n=fn(o),o=fn(h)}else n=fn(n),o=fn(o);n>o&&(o+=hb);for(var u=0,c=0;c<2;c++){var d=cb[c];if(d+t>r){var f=Math.atan2(s,d),p=a?1:-1;f<0&&(f=hb+f),(f>=n&&f<=o||f+hb>=n&&f+hb<=o)&&(f>Math.PI/2&&f<1.5*Math.PI&&(p=-p),u+=p)}}return u}function wn(t,e,i,n,o){for(var a=0,r=0,s=0,l=0,h=0,u=0;u<t.length;){var c=t[u++];switch(c===lb.M&&u>1&&(i||(a+=gn(r,s,l,h,n,o))),1==u&&(l=r=t[u],h=s=t[u+1]),c){case lb.M:r=l=t[u++],s=h=t[u++];break;case lb.L:if(i){if(un(r,s,t[u],t[u+1],e,n,o))return!0}else a+=gn(r,s,t[u],t[u+1],n,o)||0;r=t[u++],s=t[u++];break;case lb.C:if(i){if(cn(r,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],e,n,o))return!0}else a+=yn(r,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],n,o)||0;r=t[u++],s=t[u++];break;case lb.Q:if(i){if(dn(r,s,t[u++],t[u++],t[u],t[u+1],e,n,o))return!0}else a+=xn(r,s,t[u++],t[u++],t[u],t[u+1],n,o)||0;r=t[u++],s=t[u++];break;case lb.A:var d=t[u++],f=t[u++],p=t[u++],g=t[u++],m=t[u++],v=t[u++],y=(t[u++],1-t[u++]),x=Math.cos(m)*p+d,_=Math.sin(m)*g+f;u>1?a+=gn(r,s,x,_,n,o):(l=x,h=_);var w=(n-d)*g/p+d;if(i){if(pn(d,f,g,m,m+v,y,e,w,o))return!0}else a+=_n(d,f,g,m,m+v,y,w,o);r=Math.cos(m+v)*p+d,s=Math.sin(m+v)*g+f;break;case lb.R:l=r=t[u++],h=s=t[u++];var x=l+t[u++],_=h+t[u++];if(i){if(un(l,h,x,h,e,n,o)||un(x,h,x,_,e,n,o)||un(x,_,l,_,e,n,o)||un(l,_,l,h,e,n,o))return!0}else a+=gn(x,h,x,_,n,o),a+=gn(l,_,l,h,n,o);break;case lb.Z:if(i){if(un(r,s,l,h,e,n,o))return!0}else a+=gn(r,s,l,h,n,o);r=l,s=h}}return i||mn(s,h)||(a+=gn(r,s,l,h,n,o)||0),0!==a}function bn(t,e,i){return wn(t,0,!1,e,i)}function Sn(t,e,i,n){return wn(t,e,!0,i,n)}function Mn(t){Ke.call(this,t),this.path=null}function In(t,e,i,n,o,a,r,s,l,h,u){var c=l*(Ib/180),d=Mb(c)*(t-i)/2+Sb(c)*(e-n)/2,f=-1*Sb(c)*(t-i)/2+Mb(c)*(e-n)/2,p=d*d/(r*r)+f*f/(s*s);p>1&&(r*=bb(p),s*=bb(p));var g=(o===a?-1:1)*bb((r*r*(s*s)-r*r*(f*f)-s*s*(d*d))/(r*r*(f*f)+s*s*(d*d)))||0,m=g*r*f/s,v=g*-s*d/r,y=(t+i)/2+Mb(c)*m-Sb(c)*v,x=(e+n)/2+Sb(c)*m+Mb(c)*v,_=Db([1,0],[(d-m)/r,(f-v)/s]),w=[(d-m)/r,(f-v)/s],b=[(-1*d-m)/r,(-1*f-v)/s],S=Db(w,b);Ab(w,b)<=-1&&(S=Ib),Ab(w,b)>=1&&(S=0),0===a&&S>0&&(S-=2*Ib),1===a&&S<0&&(S+=2*Ib),u.addData(h,y,x,r,s,_,S,c,a)}function Tn(t){if(!t)return[];var e,i=t.replace(/-/g," -").replace(/  /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e<wb.length;e++)i=i.replace(new RegExp(wb[e],"g"),"|"+wb[e]);var n,o=i.split("|"),a=0,r=0,s=new ab,l=ab.CMD;for(e=1;e<o.length;e++){var h,u=o[e],c=u.charAt(0),d=0,f=u.slice(1).replace(/e,-/g,"e-").split(",");f.length>0&&""===f[0]&&f.shift();for(var p=0;p<f.length;p++)f[p]=parseFloat(f[p]);for(;d<f.length&&!isNaN(f[d])&&!isNaN(f[0]);){var g,m,v,y,x,_,w,b=a,S=r;switch(c){case"l":a+=f[d++],r+=f[d++],h=l.L,s.addData(h,a,r);break;case"L":a=f[d++],r=f[d++],h=l.L,s.addData(h,a,r);break;case"m":a+=f[d++],r+=f[d++],h=l.M,s.addData(h,a,r),c="l";break;case"M":a=f[d++],r=f[d++],h=l.M,s.addData(h,a,r),c="L";break;case"h":a+=f[d++],h=l.L,s.addData(h,a,r);break;case"H":a=f[d++],h=l.L,s.addData(h,a,r);break;case"v":r+=f[d++],h=l.L,s.addData(h,a,r);break;case"V":r=f[d++],h=l.L,s.addData(h,a,r);break;case"C":h=l.C,s.addData(h,f[d++],f[d++],f[d++],f[d++],f[d++],f[d++]),a=f[d-2],r=f[d-1];break;case"c":h=l.C,s.addData(h,f[d++]+a,f[d++]+r,f[d++]+a,f[d++]+r,f[d++]+a,f[d++]+r),a+=f[d-2],r+=f[d-1];break;case"S":g=a,m=r;var M=s.len(),I=s.data;n===l.C&&(g+=a-I[M-4],m+=r-I[M-3]),h=l.C,b=f[d++],S=f[d++],a=f[d++],r=f[d++],s.addData(h,g,m,b,S,a,r);break;case"s":g=a,m=r;var M=s.len(),I=s.data;n===l.C&&(g+=a-I[M-4],m+=r-I[M-3]),h=l.C,b=a+f[d++],S=r+f[d++],a+=f[d++],r+=f[d++],s.addData(h,g,m,b,S,a,r);break;case"Q":b=f[d++],S=f[d++],a=f[d++],r=f[d++],h=l.Q,s.addData(h,b,S,a,r);break;case"q":b=f[d++]+a,S=f[d++]+r,a+=f[d++],r+=f[d++],h=l.Q,s.addData(h,b,S,a,r);break;case"T":g=a,m=r;var M=s.len(),I=s.data;n===l.Q&&(g+=a-I[M-4],m+=r-I[M-3]),a=f[d++],r=f[d++],h=l.Q,s.addData(h,g,m,a,r);break;case"t":g=a,m=r;var M=s.len(),I=s.data;n===l.Q&&(g+=a-I[M-4],m+=r-I[M-3]),a+=f[d++],r+=f[d++],h=l.Q,s.addData(h,g,m,a,r);break;case"A":v=f[d++],y=f[d++],x=f[d++],_=f[d++],w=f[d++],In(b=a,S=r,a=f[d++],r=f[d++],_,w,v,y,x,h=l.A,s);break;case"a":v=f[d++],y=f[d++],x=f[d++],_=f[d++],w=f[d++],In(b=a,S=r,a+=f[d++],r+=f[d++],_,w,v,y,x,h=l.A,s)}}"z"!==c&&"Z"!==c||(h=l.Z,s.addData(h)),n=h}return s.toStatic(),s}function An(t,e){var i=Tn(t);return e=e||{},e.buildPath=function(t){if(t.setData)t.setData(i.data),(e=t.getContext())&&t.rebuildPath(e);else{var e=t;i.rebuildPath(e)}},e.applyTransform=function(t){_b(i,t),this.dirty(!0)},e}function Dn(t,e){return new Mn(An(t,e))}function Cn(t,e){return Mn.extend(An(t,e))}function Ln(t,e,i,n,o,a,r){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*r+(-3*(e-i)-2*s-l)*a+s*o+e}function kn(t,e,i){var n=e.points,o=e.smooth;if(n&&n.length>=2){if(o&&"spline"!==o){var a=zb(n,o,i,e.smoothConstraint);t.moveTo(n[0][0],n[0][1]);for(var r=n.length,s=0;s<(i?r:r-1);s++){var l=a[2*s],h=a[2*s+1],u=n[(s+1)%r];t.bezierCurveTo(l[0],l[1],h[0],h[1],u[0],u[1])}}else{"spline"===o&&(n=Eb(n,i)),t.moveTo(n[0][0],n[0][1]);for(var s=1,c=n.length;s<c;s++)t.lineTo(n[s][0],n[s][1])}i&&t.closePath()}}function Pn(t,e,i){var n=t.cpx2,o=t.cpy2;return null===n||null===o?[(i?Xi:ji)(t.x1,t.cpx1,t.cpx2,t.x2,e),(i?Xi:ji)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(i?Qi:Ji)(t.x1,t.cpx1,t.x2,e),(i?Qi:Ji)(t.y1,t.cpy1,t.y2,e)]}function On(t){Ke.call(this,t),this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.notClear=!0}function Nn(t){return Mn.extend(t)}function En(t,e,i,n){var o=Dn(t,e),a=o.getBoundingRect();return i&&("center"===n&&(i=Rn(i,a)),Bn(o,i)),o}function zn(t,e,i){var n=new Je({style:{image:t,x:e.x,y:e.y,width:e.width,height:e.height},onload:function(t){if("center"===i){var o={width:t.width,height:t.height};n.setStyle(Rn(e,o))}}});return n}function Rn(t,e){var i,n=e.width/e.height,o=t.height*n;return i=o<=t.width?t.height:(o=t.width)/n,{x:t.x+t.width/2-o/2,y:t.y+t.height/2-i/2,width:o,height:i}}function Bn(t,e){if(t.applyTransform){var i=t.getBoundingRect().calculateTransform(e);t.applyTransform(i)}}function Vn(t){var e=t.shape,i=t.style.lineWidth;return qb(2*e.x1)===qb(2*e.x2)&&(e.x1=e.x2=Wn(e.x1,i,!0)),qb(2*e.y1)===qb(2*e.y2)&&(e.y1=e.y2=Wn(e.y1,i,!0)),t}function Gn(t){var e=t.shape,i=t.style.lineWidth,n=e.x,o=e.y,a=e.width,r=e.height;return e.x=Wn(e.x,i,!0),e.y=Wn(e.y,i,!0),e.width=Math.max(Wn(n+a,i,!1)-e.x,0===a?0:1),e.height=Math.max(Wn(o+r,i,!1)-e.y,0===r?0:1),t}function Wn(t,e,i){var n=qb(2*t);return(n+qb(e))%2==0?n/2:(n+(i?1:-1))/2}function Fn(t){return null!=t&&"none"!=t}function Hn(t){return"string"==typeof t?kt(t,-.1):t}function Zn(t){if(t.__hoverStlDirty){var e=t.style.stroke,i=t.style.fill,n=t.__hoverStl;n.fill=n.fill||(Fn(i)?Hn(i):null),n.stroke=n.stroke||(Fn(e)?Hn(e):null);var o={};for(var a in n)null!=n[a]&&(o[a]=t.style[a]);t.__normalStl=o,t.__hoverStlDirty=!1}}function Un(t){if(!t.__isHover){if(Zn(t),t.useHoverLayer)t.__zr&&t.__zr.addHover(t,t.__hoverStl);else{var e=t.style,i=e.insideRollbackOpt;i&&lo(e),e.extendFrom(t.__hoverStl),i&&(so(e,e.insideOriginalTextPosition,i),null==e.textFill&&(e.textFill=i.autoColor)),t.dirty(!1),t.z2+=1}t.__isHover=!0}}function jn(t){if(t.__isHover){var e=t.__normalStl;t.useHoverLayer?t.__zr&&t.__zr.removeHover(t):(e&&t.setStyle(e),t.z2-=1),t.__isHover=!1}}function Xn(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&Un(t)}):Un(t)}function Yn(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&jn(t)}):jn(t)}function qn(t,e){t.__hoverStl=t.hoverStyle||e||{},t.__hoverStlDirty=!0,t.__isHover&&Zn(t)}function $n(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&Xn(this)}function Kn(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&Yn(this)}function Jn(){this.__isEmphasis=!0,Xn(this)}function Qn(){this.__isEmphasis=!1,Yn(this)}function to(t,e,i){t.__hoverSilentOnTouch=i&&i.hoverSilentOnTouch,"group"===t.type?t.traverse(function(t){"group"!==t.type&&qn(t,e)}):qn(t,e),t.on("mouseover",$n).on("mouseout",Kn),t.on("emphasis",Jn).on("normal",Qn)}function eo(t,e,i,n,o,a,r){var s,l=(o=o||Jb).labelFetcher,h=o.labelDataIndex,u=o.labelDimIndex,c=i.getShallow("show"),d=n.getShallow("show");(c||d)&&(l&&(s=l.getFormattedLabel(h,"normal",null,u)),null==s&&(s=x(o.defaultText)?o.defaultText(h,o):o.defaultText));var f=c?s:null,p=d?A(l?l.getFormattedLabel(h,"emphasis",null,u):null,s):null;null==f&&null==p||(io(t,i,a,o),io(e,n,r,o,!0)),t.text=f,e.text=p}function io(t,e,i,n,o){return no(t,e,n,o),i&&a(t,i),t.host&&t.host.dirty&&t.host.dirty(!1),t}function no(t,e,i,n){if((i=i||Jb).isRectText){var o=e.getShallow("position")||(n?null:"inside");"outside"===o&&(o="top"),t.textPosition=o,t.textOffset=e.getShallow("offset");var a=e.getShallow("rotate");null!=a&&(a*=Math.PI/180),t.textRotation=a,t.textDistance=A(e.getShallow("distance"),n?null:5)}var r,s=e.ecModel,l=s&&s.option.textStyle,h=oo(e);if(h){r={};for(var u in h)if(h.hasOwnProperty(u)){var c=e.getModel(["rich",u]);ao(r[u]={},c,l,i,n)}}return t.rich=r,ao(t,e,l,i,n,!0),i.forceRich&&!i.textStyle&&(i.textStyle={}),t}function oo(t){for(var e;t&&t!==t.ecModel;){var i=(t.option||Jb).rich;if(i){e=e||{};for(var n in i)i.hasOwnProperty(n)&&(e[n]=1)}t=t.parentModel}return e}function ao(t,e,i,n,o,a){if(i=!o&&i||Jb,t.textFill=ro(e.getShallow("color"),n)||i.color,t.textStroke=ro(e.getShallow("textBorderColor"),n)||i.textBorderColor,t.textStrokeWidth=A(e.getShallow("textBorderWidth"),i.textBorderWidth),!o){if(a){var r=t.textPosition;t.insideRollback=so(t,r,n),t.insideOriginalTextPosition=r,t.insideRollbackOpt=n}null==t.textFill&&(t.textFill=n.autoColor)}t.fontStyle=e.getShallow("fontStyle")||i.fontStyle,t.fontWeight=e.getShallow("fontWeight")||i.fontWeight,t.fontSize=e.getShallow("fontSize")||i.fontSize,t.fontFamily=e.getShallow("fontFamily")||i.fontFamily,t.textAlign=e.getShallow("align"),t.textVerticalAlign=e.getShallow("verticalAlign")||e.getShallow("baseline"),t.textLineHeight=e.getShallow("lineHeight"),t.textWidth=e.getShallow("width"),t.textHeight=e.getShallow("height"),t.textTag=e.getShallow("tag"),a&&n.disableBox||(t.textBackgroundColor=ro(e.getShallow("backgroundColor"),n),t.textPadding=e.getShallow("padding"),t.textBorderColor=ro(e.getShallow("borderColor"),n),t.textBorderWidth=e.getShallow("borderWidth"),t.textBorderRadius=e.getShallow("borderRadius"),t.textBoxShadowColor=e.getShallow("shadowColor"),t.textBoxShadowBlur=e.getShallow("shadowBlur"),t.textBoxShadowOffsetX=e.getShallow("shadowOffsetX"),t.textBoxShadowOffsetY=e.getShallow("shadowOffsetY")),t.textShadowColor=e.getShallow("textShadowColor")||i.textShadowColor,t.textShadowBlur=e.getShallow("textShadowBlur")||i.textShadowBlur,t.textShadowOffsetX=e.getShallow("textShadowOffsetX")||i.textShadowOffsetX,t.textShadowOffsetY=e.getShallow("textShadowOffsetY")||i.textShadowOffsetY}function ro(t,e){return"auto"!==t?t:e&&e.autoColor?e.autoColor:null}function so(t,e,i){var n,o=i.useInsideStyle;return null==t.textFill&&!1!==o&&(!0===o||i.isRectText&&e&&"string"==typeof e&&e.indexOf("inside")>=0)&&(n={textFill:null,textStroke:t.textStroke,textStrokeWidth:t.textStrokeWidth},t.textFill="#fff",null==t.textStroke&&(t.textStroke=i.autoColor,null==t.textStrokeWidth&&(t.textStrokeWidth=2))),n}function lo(t){var e=t.insideRollback;e&&(t.textFill=e.textFill,t.textStroke=e.textStroke,t.textStrokeWidth=e.textStrokeWidth)}function ho(t,e){var i=e||e.getModel("textStyle");return P([t.fontStyle||i&&i.getShallow("fontStyle")||"",t.fontWeight||i&&i.getShallow("fontWeight")||"",(t.fontSize||i&&i.getShallow("fontSize")||12)+"px",t.fontFamily||i&&i.getShallow("fontFamily")||"sans-serif"].join(" "))}function uo(t,e,i,n,o,a){if("function"==typeof o&&(a=o,o=null),n&&n.isAnimationEnabled()){var r=t?"Update":"",s=n.getShallow("animationDuration"+r),l=n.getShallow("animationEasing"+r),h=n.getShallow("animationDelay"+r);"function"==typeof h&&(h=h(o,n.getAnimationDelayParams?n.getAnimationDelayParams(e,o):null)),"function"==typeof s&&(s=s(o)),s>0?e.animateTo(i,s,h||0,l,a,!!a):(e.stopAnimation(),e.attr(i),a&&a())}else e.stopAnimation(),e.attr(i),a&&a()}function co(t,e,i,n,o){uo(!0,t,e,i,n,o)}function fo(t,e,i,n,o){uo(!1,t,e,i,n,o)}function po(t,e){for(var i=lt([]);t&&t!==e;)ut(i,t.getLocalTransform(),i),t=t.parent;return i}function go(t,e,i){return e&&!c(e)&&(e=Kx.getLocalTransform(e)),i&&(e=pt([],e)),Q([],t,e)}function mo(t,e,i){var n=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),o=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-n:"right"===t?n:0,"top"===t?-o:"bottom"===t?o:0];return a=go(a,e,i),Math.abs(a[0])>Math.abs(a[1])?a[0]>0?"right":"left":a[1]>0?"bottom":"top"}function vo(t,e,i,n){function o(t){var e={position:W(t.position),rotation:t.rotation};return t.shape&&(e.shape=a({},t.shape)),e}if(t&&e){var r=function(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=r[t.anid];if(e){var n=o(t);t.attr(o(e)),co(t,n,i,t.dataIndex)}}})}}function yo(t,e){return f(t,function(t){var i=t[0];i=$b(i,e.x),i=Kb(i,e.x+e.width);var n=t[1];return n=$b(n,e.y),n=Kb(n,e.y+e.height),[i,n]})}function xo(t,e,i){var n=(e=a({rectHover:!0},e)).style={strokeNoScale:!0};if(i=i||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(n.image=t.slice(8),r(n,i),new Je(e)):En(t.replace("path://",""),e,i,"center")}function _o(t,e,i){this.parentModel=e,this.ecModel=i,this.option=t}function wo(t,e,i){for(var n=0;n<e.length&&(!e[n]||null!=(t=t&&"object"==typeof t?t[e[n]]:null));n++);return null==t&&i&&(t=i.get(e)),t}function bo(t,e){var i=rS(t).getParent;return i?i.call(t,e):t.parentModel}function So(t){return[t||"",sS++,Math.random().toFixed(5)].join("_")}function Mo(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function Io(t,e,i,n){var o=e[1]-e[0],a=i[1]-i[0];if(0===o)return 0===a?i[0]:(i[0]+i[1])/2;if(n)if(o>0){if(t<=e[0])return i[0];if(t>=e[1])return i[1]}else{if(t>=e[0])return i[0];if(t<=e[1])return i[1]}else{if(t===e[0])return i[0];if(t===e[1])return i[1]}return(t-e[0])/o*a+i[0]}function To(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?Mo(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function Ao(t,e,i){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),i?t:+t}function Do(t){return t.sort(function(t,e){return t-e}),t}function Co(t){if(t=+t,isNaN(t))return 0;for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i}function Lo(t){var e=t.toString(),i=e.indexOf("e");if(i>0){var n=+e.slice(i+1);return n<0?-n:0}var o=e.indexOf(".");return o<0?0:e.length-1-o}function ko(t,e){var i=Math.log,n=Math.LN10,o=Math.floor(i(t[1]-t[0])/n),a=Math.round(i(Math.abs(e[1]-e[0]))/n),r=Math.min(Math.max(-o+a,0),20);return isFinite(r)?r:20}function Po(t,e,i){if(!t[e])return 0;var n=p(t,function(t,e){return t+(isNaN(e)?0:e)},0);if(0===n)return 0;for(var o=Math.pow(10,i),a=f(t,function(t){return(isNaN(t)?0:t)/n*o*100}),r=100*o,s=f(a,function(t){return Math.floor(t)}),l=p(s,function(t,e){return t+e},0),h=f(a,function(t,e){return t-s[e]});l<r;){for(var u=Number.NEGATIVE_INFINITY,c=null,d=0,g=h.length;d<g;++d)h[d]>u&&(u=h[d],c=d);++s[c],h[c]=0,++l}return s[e]/o}function Oo(t){var e=2*Math.PI;return(t%e+e)%e}function No(t){return t>-lS&&t<lS}function Eo(t){if(t instanceof Date)return t;if("string"==typeof t){var e=uS.exec(t);if(!e)return new Date(NaN);if(e[8]){var i=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(i-=e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,i,+(e[5]||0),+e[6]||0,+e[7]||0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))}function zo(t){return Math.pow(10,Ro(t))}function Ro(t){return Math.floor(Math.log(t)/Math.LN10)}function Bo(t,e){var i,n=Ro(t),o=Math.pow(10,n),a=t/o;return i=e?a<1.5?1:a<2.5?2:a<4?3:a<7?5:10:a<1?1:a<2?2:a<3?3:a<5?5:10,t=i*o,n>=-20?+t.toFixed(n<0?-n:0):t}function Vo(t){function e(t,i,n){return t.interval[n]<i.interval[n]||t.interval[n]===i.interval[n]&&(t.close[n]-i.close[n]==(n?-1:1)||!n&&e(t,i,1))}t.sort(function(t,i){return e(t,i,0)?-1:1});for(var i=-1/0,n=1,o=0;o<t.length;){for(var a=t[o].interval,r=t[o].close,s=0;s<2;s++)a[s]<=i&&(a[s]=i,r[s]=s?1:1-n),i=a[s],n=r[s];a[0]===a[1]&&r[0]*r[1]!=1?t.splice(o,1):o++}return t}function Go(t){return t-parseFloat(t)>=0}function Wo(t){return isNaN(t)?"-":(t=(t+"").split("."))[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:"")}function Fo(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}function Ho(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Zo(t,e,i){y(e)||(e=[e]);var n=e.length;if(!n)return"";for(var o=e[0].$vars||[],a=0;a<o.length;a++){var r=fS[a];t=t.replace(pS(r),pS(r,0))}for(var s=0;s<n;s++)for(var l=0;l<o.length;l++){var h=e[s][o[l]];t=t.replace(pS(fS[l],s),i?Ho(h):h)}return t}function Uo(t,e,i){return d(e,function(e,n){t=t.replace("{"+n+"}",i?Ho(e):e)}),t}function jo(t,e){var i=(t=_(t)?{color:t,extraCssText:e}:t||{}).color,n=t.type,e=t.extraCssText;return i?"subItem"===n?'<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:'+Ho(i)+";"+(e||"")+'"></span>':'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:'+Ho(i)+";"+(e||"")+'"></span>':""}function Xo(t,e,i){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var n=Eo(e),o=i?"UTC":"",a=n["get"+o+"FullYear"](),r=n["get"+o+"Month"]()+1,s=n["get"+o+"Date"](),l=n["get"+o+"Hours"](),h=n["get"+o+"Minutes"](),u=n["get"+o+"Seconds"]();return t=t.replace("MM",gS(r)).replace("M",r).replace("yyyy",a).replace("yy",a%100).replace("dd",gS(s)).replace("d",s).replace("hh",gS(l)).replace("h",l).replace("mm",gS(h)).replace("m",h).replace("ss",gS(u)).replace("s",u)}function Yo(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t}function qo(t,e,i,n,o){var a=0,r=0;null==n&&(n=1/0),null==o&&(o=1/0);var s=0;e.eachChild(function(l,h){var u,c,d=l.position,f=l.getBoundingRect(),p=e.childAt(h+1),g=p&&p.getBoundingRect();if("horizontal"===t){var m=f.width+(g?-g.x+f.x:0);(u=a+m)>n||l.newline?(a=0,u=m,r+=s+i,s=f.height):s=Math.max(s,f.height)}else{var v=f.height+(g?-g.y+f.y:0);(c=r+v)>o||l.newline?(a+=s+i,r=0,c=v,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=a,d[1]=r,"horizontal"===t?a=u+i:r=c+i)})}function $o(t,e,i){var n=e.width,o=e.height,a=To(t.x,n),r=To(t.y,o),s=To(t.x2,n),l=To(t.y2,o);return(isNaN(a)||isNaN(parseFloat(t.x)))&&(a=0),(isNaN(s)||isNaN(parseFloat(t.x2)))&&(s=n),(isNaN(r)||isNaN(parseFloat(t.y)))&&(r=0),(isNaN(l)||isNaN(parseFloat(t.y2)))&&(l=o),i=dS(i||0),{width:Math.max(s-a-i[1]-i[3],0),height:Math.max(l-r-i[0]-i[2],0)}}function Ko(t,e,i){i=dS(i||0);var n=e.width,o=e.height,a=To(t.left,n),r=To(t.top,o),s=To(t.right,n),l=To(t.bottom,o),h=To(t.width,n),u=To(t.height,o),c=i[2]+i[0],d=i[1]+i[3],f=t.aspect;switch(isNaN(h)&&(h=n-s-d-a),isNaN(u)&&(u=o-l-c-r),null!=f&&(isNaN(h)&&isNaN(u)&&(f>n/o?h=.8*n:u=.8*o),isNaN(h)&&(h=f*u),isNaN(u)&&(u=h/f)),isNaN(a)&&(a=n-s-h-d),isNaN(r)&&(r=o-l-u-c),t.left||t.right){case"center":a=n/2-h/2-i[3];break;case"right":a=n-h-d}switch(t.top||t.bottom){case"middle":case"center":r=o/2-u/2-i[0];break;case"bottom":r=o-u-c}a=a||0,r=r||0,isNaN(h)&&(h=n-d-a-(s||0)),isNaN(u)&&(u=o-c-r-(l||0));var p=new Kt(a+i[3],r+i[0],h,u);return p.margin=i,p}function Jo(t,e,i,n,o){var a=!o||!o.hv||o.hv[0],s=!o||!o.hv||o.hv[1],l=o&&o.boundingMode||"all";if(a||s){var h;if("raw"===l)h="group"===t.type?new Kt(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(h=t.getBoundingRect(),t.needLocalTransform()){var u=t.getLocalTransform();(h=h.clone()).applyTransform(u)}e=Ko(r({width:h.width,height:h.height},e),i,n);var c=t.position,d=a?e.x-h.x:0,f=s?e.y-h.y:0;t.attr("position","raw"===l?[d,f]:[c[0]+d,c[1]+f])}}function Qo(t,e){return null!=t[wS[e][0]]||null!=t[wS[e][1]]&&null!=t[wS[e][2]]}function ta(t,e,i){function n(i,n){var r={},l=0,h={},u=0;if(xS(i,function(e){h[e]=t[e]}),xS(i,function(t){o(e,t)&&(r[t]=h[t]=e[t]),a(r,t)&&l++,a(h,t)&&u++}),s[n])return a(e,i[1])?h[i[2]]=null:a(e,i[2])&&(h[i[1]]=null),h;if(2!==u&&l){if(l>=2)return r;for(var c=0;c<i.length;c++){var d=i[c];if(!o(r,d)&&o(t,d)){r[d]=t[d];break}}return r}return h}function o(t,e){return t.hasOwnProperty(e)}function a(t,e){return null!=t[e]&&"auto"!==t[e]}function r(t,e,i){xS(t,function(t){e[t]=i[t]})}!w(i)&&(i={});var s=i.ignoreSize;!y(s)&&(s=[s,s]);var l=n(wS[0],0),h=n(wS[1],1);r(wS[0],t,l),r(wS[1],t,h)}function ea(t){return ia({},t)}function ia(t,e){return e&&t&&xS(_S,function(i){e.hasOwnProperty(i)&&(t[i]=e[i])}),t}function na(t,e){for(var i=t.length,n=0;n<i;n++)if(t[n].length>e)return t[n];return t[i-1]}function oa(t){var e=t.get("coordinateSystem"),i={coordSysName:e,coordSysDims:[],axisMap:z(),categoryAxisMap:z()},n=LS[e];if(n)return n(t,i,i.axisMap,i.categoryAxisMap),i}function aa(t){return"category"===t.get("type")}function ra(t){this.fromDataset=t.fromDataset,this.data=t.data||(t.sourceFormat===NS?{}:[]),this.sourceFormat=t.sourceFormat||ES,this.seriesLayoutBy=t.seriesLayoutBy||RS,this.dimensionsDefine=t.dimensionsDefine,this.encodeDefine=t.encodeDefine&&z(t.encodeDefine),this.startIndex=t.startIndex||0,this.dimensionsDetectCount=t.dimensionsDetectCount}function sa(t){var e=t.option.source,i=ES;if(S(e))i=zS;else if(y(e))for(var n=0,o=e.length;n<o;n++){var a=e[n];if(null!=a){if(y(a)){i=PS;break}if(w(a)){i=OS;break}}}else if(w(e)){for(var r in e)if(e.hasOwnProperty(r)&&c(e[r])){i=NS;break}}else if(null!=e)throw new Error("Invalid data");VS(t).sourceFormat=i}function la(t){return VS(t).source}function ha(t){VS(t).datasetMap=z()}function ua(t){var e=t.option,i=e.data,n=S(i)?zS:kS,o=!1,a=e.seriesLayoutBy,r=e.sourceHeader,s=e.dimensions,l=ma(t);if(l){var h=l.option;i=h.source,n=VS(l).sourceFormat,o=!0,a=a||h.seriesLayoutBy,null==r&&(r=h.sourceHeader),s=s||h.dimensions}var u=ca(i,n,a,r,s),c=e.encode;!c&&l&&(c=ga(t,l,i,n,a,u)),VS(t).source=new ra({data:i,fromDataset:o,seriesLayoutBy:a,sourceFormat:n,dimensionsDefine:u.dimensionsDefine,startIndex:u.startIndex,dimensionsDetectCount:u.dimensionsDetectCount,encodeDefine:c})}function ca(t,e,i,n,o){if(!t)return{dimensionsDefine:da(o)};var a,r,s;if(e===PS)"auto"===n||null==n?fa(function(t){null!=t&&"-"!==t&&(_(t)?null==r&&(r=1):r=0)},i,t,10):r=n?1:0,o||1!==r||(o=[],fa(function(t,e){o[e]=null!=t?t:""},i,t)),a=o?o.length:i===BS?t.length:t[0]?t[0].length:null;else if(e===OS)o||(o=pa(t),s=!0);else if(e===NS)o||(o=[],s=!0,d(t,function(t,e){o.push(e)}));else if(e===kS){var l=Ii(t[0]);a=y(l)&&l.length||1}var h;return s&&d(o,function(t,e){"name"===(w(t)?t.name:t)&&(h=e)}),{startIndex:r,dimensionsDefine:da(o),dimensionsDetectCount:a,potentialNameDimIndex:h}}function da(t){if(t){var e=z();return f(t,function(t,i){if(null==(t=a({},w(t)?t:{name:t})).name)return t;t.name+="",null==t.displayName&&(t.displayName=t.name);var n=e.get(t.name);return n?t.name+="-"+n.count++:e.set(t.name,{count:1}),t})}}function fa(t,e,i,n){if(null==n&&(n=1/0),e===BS)for(a=0;a<i.length&&a<n;a++)t(i[a]?i[a][0]:null,a);else for(var o=i[0]||[],a=0;a<o.length&&a<n;a++)t(o[a],a)}function pa(t){for(var e,i=0;i<t.length&&!(e=t[i++]););if(e){var n=[];return d(e,function(t,e){n.push(e)}),n}}function ga(t,e,i,n,o,a){var r=oa(t),s={},l=[],h=[],u=t.subType,c=z(["pie","map","funnel"]),f=z(["line","bar","pictorialBar","scatter","effectScatter","candlestick","boxplot"]);if(r&&null!=f.get(u)){var p=t.ecModel,g=VS(p).datasetMap,m=e.uid+"_"+o,v=g.get(m)||g.set(m,{categoryWayDim:1,valueWayDim:0});d(r.coordSysDims,function(t){if(null==r.firstCategoryDimIndex){e=v.valueWayDim++;s[t]=e,h.push(e)}else if(r.categoryAxisMap.get(t))s[t]=0,l.push(0);else{var e=v.categoryWayDim++;s[t]=e,h.push(e)}})}else if(null!=c.get(u)){for(var y,x=0;x<5&&null==y;x++)ya(i,n,o,a.dimensionsDefine,a.startIndex,x)||(y=x);if(null!=y){s.value=y;var _=a.potentialNameDimIndex||Math.max(y-1,0);h.push(_),l.push(_)}}return l.length&&(s.itemName=l),h.length&&(s.seriesName=h),s}function ma(t){var e=t.option;if(!e.data)return t.ecModel.getComponent("dataset",e.datasetIndex||0)}function va(t,e){return ya(t.data,t.sourceFormat,t.seriesLayoutBy,t.dimensionsDefine,t.startIndex,e)}function ya(t,e,i,n,o,a){function r(t){return(null==t||!isFinite(t)||""===t)&&(!(!_(t)||"-"===t)||void 0)}var s;if(S(t))return!1;var l;if(n&&(l=w(l=n[a])?l.name:l),e===PS)if(i===BS){for(var h=t[a],u=0;u<(h||[]).length&&u<5;u++)if(null!=(s=r(h[o+u])))return s}else for(u=0;u<t.length&&u<5;u++){var c=t[o+u];if(c&&null!=(s=r(c[a])))return s}else if(e===OS){if(!l)return;for(u=0;u<t.length&&u<5;u++)if((d=t[u])&&null!=(s=r(d[l])))return s}else if(e===NS){if(!l)return;if(!(h=t[l])||S(h))return!1;for(u=0;u<h.length&&u<5;u++)if(null!=(s=r(h[u])))return s}else if(e===kS)for(u=0;u<t.length&&u<5;u++){var d=t[u],f=Ii(d);if(!y(f))return!1;if(null!=(s=r(f[a])))return s}return!1}function xa(t,e){if(e){var i=e.seiresIndex,n=e.seriesId,o=e.seriesName;return null!=i&&t.componentIndex!==i||null!=n&&t.id!==n||null!=o&&t.name!==o}}function _a(t,e){d(e,function(e,o){IS.hasClass(o)||("object"==typeof e?t[o]=t[o]?n(t[o],e,!1):i(e):null==t[o]&&(t[o]=e))})}function wa(t){t=t,this.option={},this.option[GS]=1,this._componentsMap=z({series:[]}),this._seriesIndices,this._seriesIndicesMap,_a(t,this._theme.option),n(t,AS,!1),this.mergeOption(t)}function ba(t,e){y(e)||(e=e?[e]:[]);var i={};return d(e,function(e){i[e]=(t.get(e)||[]).slice()}),i}function Sa(t,e,i){return e.type?e.type:i?i.subType:IS.determineSubType(t,e)}function Ma(t,e){t._seriesIndicesMap=z(t._seriesIndices=f(e,function(t){return t.componentIndex})||[])}function Ia(t,e){return e.hasOwnProperty("subType")?g(t,function(t){return t.subType===e.subType}):t}function Ta(t){d(FS,function(e){this[e]=m(t[e],t)},this)}function Aa(){this._coordinateSystems=[]}function Da(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function Ca(t,e,i){var n,o,a=[],r=[],s=t.timeline;if(t.baseOption&&(o=t.baseOption),(s||t.options)&&(o=o||{},a=(t.options||[]).slice()),t.media){o=o||{};var l=t.media;ZS(l,function(t){t&&t.option&&(t.query?r.push(t):n||(n=t))})}return o||(o=t),o.timeline||(o.timeline=s),ZS([o].concat(a).concat(f(r,function(t){return t.option})),function(t){ZS(e,function(e){e(t,i)})}),{baseOption:o,timelineOptions:a,mediaDefault:n,mediaList:r}}function La(t,e,i){var n={width:e,height:i,aspectratio:e/i},o=!0;return d(t,function(t,e){var i=e.match(YS);if(i&&i[1]&&i[2]){var a=i[1],r=i[2].toLowerCase();ka(n[r],t,a)||(o=!1)}}),o}function ka(t,e,i){return"min"===i?t>=e:"max"===i?t<=e:t===e}function Pa(t,e){return t.join(",")===e.join(",")}function Oa(t,e){ZS(e=e||{},function(e,i){if(null!=e){var n=t[i];if(IS.hasClass(i)){e=Si(e);var o=Ai(n=Si(n),e);t[i]=jS(o,function(t){return t.option&&t.exist?XS(t.exist,t.option,!0):t.exist||t.option})}else t[i]=XS(n,e,!0)}})}function Na(t){var e=t&&t.itemStyle;if(e)for(var i=0,o=KS.length;i<o;i++){var a=KS[i],r=e.normal,s=e.emphasis;r&&r[a]&&(t[a]=t[a]||{},t[a].normal?n(t[a].normal,r[a]):t[a].normal=r[a],r[a]=null),s&&s[a]&&(t[a]=t[a]||{},t[a].emphasis?n(t[a].emphasis,s[a]):t[a].emphasis=s[a],s[a]=null)}}function Ea(t,e,i){if(t&&t[e]&&(t[e].normal||t[e].emphasis)){var n=t[e].normal,o=t[e].emphasis;n&&(i?(t[e].normal=t[e].emphasis=null,r(t[e],n)):t[e]=n),o&&(t.emphasis=t.emphasis||{},t.emphasis[e]=o)}}function za(t){Ea(t,"itemStyle"),Ea(t,"lineStyle"),Ea(t,"areaStyle"),Ea(t,"label"),Ea(t,"labelLine"),Ea(t,"upperLabel"),Ea(t,"edgeLabel")}function Ra(t){var e=$S(t)&&t.textStyle;if(e)for(var i=0,n=yw.length;i<n;i++){var o=yw[i];e.hasOwnProperty(o)&&(t[o]=e[o])}}function Ba(t){t&&(za(t),Ra(t.label),t.emphasis&&Ra(t.emphasis.label))}function Va(t){if($S(t)){Na(t),za(t),Ra(t.label),Ra(t.upperLabel),Ra(t.edgeLabel),t.emphasis&&(Ra(t.emphasis.label),Ra(t.emphasis.upperLabel),Ra(t.emphasis.edgeLabel));var e=t.markPoint;e&&(Na(e),Ba(e));var i=t.markLine;i&&(Na(i),Ba(i));var n=t.markArea;n&&Ba(n);var o=t.data;if("graph"===t.type){o=o||t.nodes;var a=t.links||t.edges;if(a&&!S(a))for(s=0;s<a.length;s++)Ba(a[s]);d(t.categories,function(t){za(t)})}if(o&&!S(o))for(s=0;s<o.length;s++)Ba(o[s]);if((e=t.markPoint)&&e.data)for(var r=e.data,s=0;s<r.length;s++)Ba(r[s]);if((i=t.markLine)&&i.data)for(var l=i.data,s=0;s<l.length;s++)y(l[s])?(Ba(l[s][0]),Ba(l[s][1])):Ba(l[s]);"gauge"===t.type?(Ra(t,"axisLabel"),Ra(t,"title"),Ra(t,"detail")):"treemap"===t.type&&(Ea(t.breadcrumb,"itemStyle"),d(t.levels,function(t){za(t)}))}}function Ga(t){return y(t)?t:t?[t]:[]}function Wa(t){return(y(t)?t[0]:t)||{}}function Fa(t,e){e=e.split(",");for(var i=t,n=0;n<e.length&&null!=(i=i&&i[e[n]]);n++);return i}function Ha(t,e,i,n){e=e.split(",");for(var o,a=t,r=0;r<e.length-1;r++)null==a[o=e[r]]&&(a[o]={}),a=a[o];(n||null==a[e[r]])&&(a[e[r]]=i)}function Za(t){d(QS,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}function Ua(t,e){ra.isInstance(t)||(t=ra.seriesDataToSource(t)),this._source=t;var i=this._data=t.data,n=t.sourceFormat;n===zS&&(this._offset=0,this._dimSize=e,this._data=i),a(this,nM[n===PS?n+"_"+t.seriesLayoutBy:n])}function ja(){return this._data.length}function Xa(t){return this._data[t]}function Ya(t){for(var e=0;e<t.length;e++)this._data.push(t[e])}function qa(t,e,i,n){return null!=i?t[i]:t}function $a(t,e,i,n){return Ka(t[n],this._dimensionInfos[e])}function Ka(t,e){var i=e&&e.type;if("ordinal"===i){var n=e&&e.ordinalMeta;return n?n.parseAndCollect(t):t}return"time"===i&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+Eo(t)),null==t||""===t?NaN:+t}function Ja(t,e,i){if(t){var n=t.getRawDataItem(e);if(null!=n){var o,a,r=t.getProvider().getSource().sourceFormat,s=t.getDimensionInfo(i);return s&&(o=s.name,a=s.index),oM[r](n,e,a,o)}}}function Qa(t,e,i){if(t){var n=t.getProvider().getSource().sourceFormat;if(n===kS||n===OS){var o=t.getRawDataItem(e);return n!==kS||w(o)||(o=null),o?o[i]:void 0}}}function tr(t){return new er(t)}function er(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0,this.context}function ir(t,e){t._dueIndex=t._outputDueEnd=t._dueEnd=0,t._settedOutputEnd=null,t._progress=!e&&t._reset&&t._reset(t.context);var i=t._downstream;i&&i.dirty()}function nr(t){var e=t.name;vw===e&&(t.name=or(t)||e)}function or(t){var e=t.getRawData(),i=[];return d(e.mapDimension("seriesName",!0),function(t){var n=e.getDimensionInfo(t);n.displayName&&i.push(n.displayName)}),i.join(" ")}function ar(t){return t.model.getRawData().count()}function rr(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),sr}function sr(t,e){t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function lr(t,e){d(t.CHANGABLE_METHODS,function(i){t.wrapMethod(i,v(hr,e))})}function hr(t){var e=ur(t);e&&e.setOutputEnd(this.count())}function ur(t){var e=(t.ecModel||{}).scheduler,i=e&&e.getPipeline(t.uid);if(i){var n=i.currentTask;if(n){var o=n.agentStubMap;o&&(n=o.get(t.uid))}return n}}function cr(){this.group=new S_,this.uid=So("viewChart"),this.renderTask=tr({plan:pr,reset:gr}),this.renderTask.context={view:this}}function dr(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var i=0;i<t.childCount();i++)dr(t.childAt(i),e)}function fr(t,e,i){var n=ki(t,e);null!=n?d(Si(n),function(e){dr(t.getItemGraphicEl(e),i)}):t.eachItemGraphicEl(function(t){dr(t,i)})}function pr(t){return gM(t.model)}function gr(t){var e=t.model,i=t.ecModel,n=t.api,o=t.payload,a=e.pipelineContext.incrementalRender,r=t.view,s=o&&pM(o).updateMethod;return r[a&&r.incrementalPrepareRender?"incrementalPrepareRender":s&&r[s]?s:"render"](e,i,n,o),a?mr:null}function mr(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}function vr(t,e,i){function n(){u=(new Date).getTime(),c=null,t.apply(r,s||[])}var o,a,r,s,l,h=0,u=0,c=null;e=e||0;var d=function(){o=(new Date).getTime(),r=this,s=arguments;var t=l||e,d=l||i;l=null,a=o-(d?h:u)-t,clearTimeout(c),d?c=setTimeout(n,t):a>=0?n():c=setTimeout(n,-a),h=o};return d.clear=function(){c&&(clearTimeout(c),c=null)},d.debounceNextCall=function(t){l=t},d}function yr(t,e,i,n){var o=t[e];if(o){var a=o[vM]||o,r=o[xM];if(o[yM]!==i||r!==n){if(null==i||!n)return t[e]=a;(o=t[e]=vr(a,i,"debounce"===n))[vM]=a,o[xM]=n,o[yM]=i}return o}}function xr(t,e){var i=t[e];i&&i[vM]&&(t[e]=i[vM])}function _r(t,e){this.ecInstance=t,this.api=e,this.unfinished,this._stageTaskMap=z()}function wr(t,e,i,n,o){function a(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}o=o||{};var r;d(e,function(e,s){if(!o.visualType||o.visualType===e.visualType){var l=t._stageTaskMap.get(e.uid),h=l.seriesTaskMap,u=l.overallTask;if(u){var c,d=u.agentStubMap;d.each(function(t){a(o,t)&&(t.dirty(),c=!0)}),c&&u.dirty(),IM(u,n);var f=t.getPerformArgs(u,o.block);d.each(function(t){t.perform(f)}),r|=u.perform(f)}else h&&h.each(function(s,l){a(o,s)&&s.dirty();var h=t.getPerformArgs(s,o.block);h.skip=!e.performRawSeries&&i.isSeriesFiltered(s.context.model),IM(s,n),r|=s.perform(h)})}}),t.unfinished|=r}function br(t,e,i,n,o){function a(i){var a=i.uid,s=r.get(a)||r.set(a,tr({plan:Dr,reset:Cr,count:kr}));s.context={model:i,ecModel:n,api:o,useClearVisual:e.isVisual&&!e.isLayout,plan:e.plan,reset:e.reset,scheduler:t},Pr(t,i,s)}var r=i.seriesTaskMap||(i.seriesTaskMap=z()),s=e.seriesType,l=e.getTargetSeries;e.createOnAllSeries?n.eachRawSeries(a):s?n.eachRawSeriesByType(s,a):l&&l(n,o).each(a);var h=t._pipelineMap;r.each(function(t,e){h.get(e)||(t.dispose(),r.removeKey(e))})}function Sr(t,e,i,n,o){function a(e){var i=e.uid,n=s.get(i)||s.set(i,tr({reset:Ir,onDirty:Ar}));n.context={model:e,overallProgress:u,isOverallFilter:c},n.agent=r,n.__block=u,Pr(t,e,n)}var r=i.overallTask=i.overallTask||tr({reset:Mr});r.context={ecModel:n,api:o,overallReset:e.overallReset,scheduler:t};var s=r.agentStubMap=r.agentStubMap||z(),l=e.seriesType,h=e.getTargetSeries,u=!0,c=e.isOverallFilter;l?n.eachRawSeriesByType(l,a):h?h(n,o).each(a):(u=!1,d(n.getSeries(),a));var f=t._pipelineMap;s.each(function(t,e){f.get(e)||(t.dispose(),s.removeKey(e))})}function Mr(t){t.overallReset(t.ecModel,t.api,t.payload)}function Ir(t,e){return t.overallProgress&&Tr}function Tr(){this.agent.dirty(),this.getDownstream().dirty()}function Ar(){this.agent&&this.agent.dirty()}function Dr(t){return t.plan&&t.plan(t.model,t.ecModel,t.api,t.payload)}function Cr(t){if(t.useClearVisual&&t.data.clearAllVisual(),(t.resetDefines=Si(t.reset(t.model,t.ecModel,t.api,t.payload))).length)return Lr}function Lr(t,e){for(var i=e.data,n=e.resetDefines,o=0;o<n.length;o++){var a=n[o];if(a&&a.dataEach)for(var r=t.start;r<t.end;r++)a.dataEach(i,r);else a&&a.progress&&a.progress(t,i)}}function kr(t){return t.data.count()}function Pr(t,e,i){var n=e.uid,o=t._pipelineMap.get(n);!o.head&&(o.head=i),o.tail&&o.tail.pipe(i),o.tail=i,i.__idxInPipeline=o.count++,i.__pipeline=o}function Or(t){TM=null;try{t(AM,DM)}catch(t){}return TM}function Nr(t,e){for(var i in e.prototype)t[i]=B}function Er(t){return function(e,i,n){e=e&&e.toLowerCase(),Hx.prototype[t].call(this,e,i,n)}}function zr(){Hx.call(this)}function Rr(t,e,n){function o(t,e){return t.__prio-e.__prio}n=n||{},"string"==typeof e&&(e=eI[e]),this.id,this.group,this._dom=t;var a=this._zr=_i(t,{renderer:n.renderer||"canvas",devicePixelRatio:n.devicePixelRatio,width:n.width,height:n.height});this._throttledZrFlush=vr(m(a.flush,a),17),(e=i(e))&&eM(e,!0),this._theme=e,this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new Aa;var r=this._api=is(this);this._scheduler=new _r(this,r),Hx.call(this),this._messageCenter=new zr,this._initEvents(),this.resize=m(this.resize,this),this._pendingActions=[],ae(tI,o),ae(KM,o),a.animation.on("frame",this._onframe,this),O(this)}function Br(t,e,i){var n,o=this._model,a=this._coordSysMgr.getCoordinateSystems();e=Oi(o,e);for(var r=0;r<a.length;r++){var s=a[r];if(s[t]&&null!=(n=s[t](o,e,i)))return n}}function Vr(t){var e=t._model,i=t._scheduler;i.restorePipelines(e),i.prepareStageTasks(KM),i.prepareStageTasks(tI),jr(t,"component",e,i),jr(t,"chart",e,i),i.plan()}function Gr(t,e,i,n,o){function a(n){n&&n.__alive&&n[e]&&n[e](n.__model,r,t._api,i)}var r=t._model;if(n){var s={};s[n+"Id"]=i[n+"Id"],s[n+"Index"]=i[n+"Index"],s[n+"Name"]=i[n+"Name"];var l={mainType:n,query:s};o&&(l.subType=o),r&&r.eachComponent(l,function(e,i){a(t["series"===n?"_chartsMap":"_componentsMap"][e.__viewId])},t)}else NM(t._componentsViews.concat(t._chartsViews),a)}function Wr(t,e,i){t[HM]=!0,e&&Vr(t),XM.update.call(t),t[HM]=!1,Zr.call(t,i),Ur.call(t,i)}function Fr(t,e){var i=t._chartsMap,n=t._scheduler;e.eachSeries(function(t){n.updateStreamModes(t,i[t.__viewId])})}function Hr(t,e){var i=t.type,n=t.escapeConnect,o=qM[i],s=o.actionInfo,l=(s.update||"update").split(":"),h=l.pop();l=null!=l[0]&&RM(l[0]),this[HM]=!0;var u=[t],c=!1;t.batch&&(c=!0,u=f(t.batch,function(e){return e=r(a({},e),t),e.batch=null,e}));var d,p=[],g="highlight"===i||"downplay"===i;NM(u,function(t){d=o.action(t,this._model,this._api),(d=d||a({},t)).type=s.event||d.type,p.push(d),g?Gr(this,h,t,"series"):l&&Gr(this,h,t,l.main,l.sub)},this),"none"===h||g||l||(this[ZM]?(Vr(this),XM.update.call(this,t),this[ZM]=!1):XM[h].call(this,t)),d=c?{type:s.event||i,escapeConnect:n,batch:p}:p[0],this[HM]=!1,!e&&this._messageCenter.trigger(d.type,d)}function Zr(t){for(var e=this._pendingActions;e.length;){var i=e.shift();Hr.call(this,i,t)}}function Ur(t){!t&&this.trigger("updated")}function jr(t,e,i,n){function o(t){var e="_ec_"+t.id+"_"+t.type,o=s[e];if(!o){var u=RM(t.type);(o=new(a?cM.getClass(u.main,u.sub):cr.getClass(u.sub))).init(i,h),s[e]=o,r.push(o),l.add(o.group)}t.__viewId=o.__id=e,o.__alive=!0,o.__model=t,o.group.__ecComponentInfo={mainType:t.mainType,index:t.componentIndex},!a&&n.prepareView(o,t,i,h)}for(var a="component"===e,r=a?t._componentsViews:t._chartsViews,s=a?t._componentsMap:t._chartsMap,l=t._zr,h=t._api,u=0;u<r.length;u++)r[u].__alive=!1;a?i.eachComponent(function(t,e){"series"!==t&&o(e)}):i.eachSeries(o);for(u=0;u<r.length;){var c=r[u];c.__alive?u++:(!a&&c.renderTask.dispose(),l.remove(c.group),c.dispose(i,h),r.splice(u,1),delete s[c.__id],c.__id=c.group.__ecComponentInfo=null)}}function Xr(t){var e={};t.eachSeries(function(t){var i=t.get("stack"),n=t.getData();if(i&&"list"===n.type){var o=e[i];e.hasOwnProperty(i)&&o&&(n.stackedOn=o),e[i]=n}})}function Yr(t){t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()})}function qr(t,e,i,n){$r(t,e,i,n),NM(t._chartsViews,function(t){t.__alive=!1}),Kr(t,e,i,n),NM(t._chartsViews,function(t){t.__alive||t.remove(e,i)})}function $r(t,e,i,n,o){NM(o||t._componentsViews,function(t){var o=t.__model;t.render(o,e,i,n),es(o,t)})}function Kr(t,e,i,n,o){var a,r=t._scheduler;e.eachSeries(function(e){var i=t._chartsMap[e.__viewId];i.__alive=!0;var s=i.renderTask;r.updatePayload(s,n),o&&o.get(e.uid)&&s.dirty(),a|=s.perform(r.getPerformArgs(s)),i.group.silent=!!e.get("silent"),es(e,i),ts(e,i)}),r.unfinished|=a,Qr(t._zr,e),bM(t._zr.dom,e)}function Jr(t,e){NM(QM,function(i){i(t,e)})}function Qr(t,e){var i=t.storage,n=0;i.traverse(function(t){t.isGroup||n++}),n>e.get("hoverLayerThreshold")&&!_x.node&&i.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function ts(t,e){var i=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.style.blend!==i&&t.setStyle("blend",i),t.eachPendingDisplayable&&t.eachPendingDisplayable(function(t){t.setStyle("blend",i)})})}function es(t,e){var i=t.get("z"),n=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=n&&(t.zlevel=n))})}function is(t){var e=t._coordSysMgr;return a(new Ta(t),{getCoordinateSystems:m(e.getCoordinateSystems,e),getComponentByElement:function(e){for(;e;){var i=e.__ecComponentInfo;if(null!=i)return t._model.getComponent(i.mainType,i.index);e=e.parent}}})}function ns(t){function e(t,e){for(var n=0;n<t.length;n++)t[n][i]=e}var i="__connectUpdateStatus";NM($M,function(n,o){t._messageCenter.on(o,function(n){if(oI[t.group]&&0!==t[i]){if(n&&n.escapeConnect)return;var o=t.makeActionFromEvent(n),a=[];NM(nI,function(e){e!==t&&e.group===t.group&&a.push(e)}),e(a,0),NM(a,function(t){1!==t[i]&&t.dispatchAction(o)}),e(a,2)}})})}function os(t){oI[t]=!1}function as(t){return nI[zi(t,sI)]}function rs(t,e){eI[t]=e}function ss(t){JM.push(t)}function ls(t,e){fs(KM,t,e,VM)}function hs(t,e,i){"function"==typeof e&&(i=e,e="");var n=zM(t)?t.type:[t,t={event:e}][0];t.event=(t.event||n).toLowerCase(),e=t.event,OM(UM.test(n)&&UM.test(e)),qM[n]||(qM[n]={action:i,actionInfo:t}),$M[e]=n}function us(t,e){Aa.register(t,e)}function cs(t,e){fs(tI,t,e,GM,"layout")}function ds(t,e){fs(tI,t,e,WM,"visual")}function fs(t,e,i,n,o){(EM(e)||zM(e))&&(i=e,e=n);var a=_r.wrapStageHandler(i,o);return a.__prio=e,a.__raw=i,t.push(a),a}function ps(t,e){iI[t]=e}function gs(t){return IS.extend(t)}function ms(t){return cM.extend(t)}function vs(t){return uM.extend(t)}function ys(t){return cr.extend(t)}function xs(t){return lI[t]}function _s(t){return t}function ws(t,e,i,n,o){this._old=t,this._new=e,this._oldKeyGetter=i||_s,this._newKeyGetter=n||_s,this.context=o}function bs(t,e,i,n,o){for(var a=0;a<t.length;a++){var r="_ec_"+o[n](t[a],a),s=e[r];null==s?(i.push(r),e[r]=a):(s.length||(e[r]=s=[s]),s.push(a))}}function Ss(t){var e={},i=e.encode={},n=e.coordDimMap=z(),o=[];d(t.dimensions,function(e){var a=t.getDimensionInfo(e),r=a.coordDim;if(r){var s=i[r];i.hasOwnProperty(r)||(s=i[r]=[]),s[a.coordDimIndex]=e,a.isSysCoord&&Is(a.type)&&(o[0]=e),n.set(r,1)}cI.each(function(t,e){var n=i[e];i.hasOwnProperty(e)||(n=i[e]=[]);var o=a.otherDims[e];null!=o&&!1!==o&&(n[o]=a.name)})});var a=[];n.each(function(t,e){a=a.concat(i[e])}),e.dataDimsOnCoord=a;var r=i.label;r&&r.length&&(o=r.slice());var s=o.slice(),l=i.tooltip;return l&&l.length&&(s=l.slice()),i.defaultedLabel=o,i.defaultedTooltip=s,e}function Ms(t){return"category"===t?"ordinal":"time"===t?"time":"float"}function Is(t){return!("ordinal"===t||"time"===t)}function Ts(t){var e=typeof pI.Uint32Array===fI?Array:pI.Uint32Array,i=typeof pI.Uint16Array===fI?Array:pI.Uint16Array;return t._rawCount>65535?e:i}function As(t){var e=t.constructor;return e===Array?t.slice():new e(t)}function Ds(t,e){d(vI.concat(e.__wrappedMethods||[]),function(i){e.hasOwnProperty(i)&&(t[i]=e[i])}),t.__wrappedMethods=e.__wrappedMethods}function Cs(t){return t}function Ls(t){return t<this._count&&t>=0?this._indices[t]:-1}function ks(t,e){var i=t._idList[e];return null==i&&(i=t._getIdFromStore(e)),null==i&&(i=gI+e),i}function Ps(t){return y(t)||(t=[t]),t}function Os(t,e){var i=t.dimensions,n=new yI(f(i,t.getDimensionInfo,t),t.hostModel);Ds(n,t);for(var o=n._storage={},a=t._storage,r=0;r<i.length;r++){var s=i[r];a[s]&&(o[s]=l(e,s)>=0?Ns(a[s]):a[s])}return n}function Ns(t){for(var e=new Array(t.length),i=0;i<t.length;i++)e[i]=As(t[i]);return e}function Es(t,e,n){function o(t,e,i){null!=cI.get(e)?t.otherDims[e]=i:(t.coordDim=e,t.coordDimIndex=i,u.set(e,!0))}ra.isInstance(e)||(e=ra.seriesDataToSource(e)),n=n||{},t=(t||[]).slice();for(var s=(n.dimsDef||[]).slice(),l=z(n.encodeDef),h=z(),u=z(),c=[],f=zs(e,t,s,n.dimCount),p=0;p<f;p++){var g=s[p]=a({},w(s[p])?s[p]:{name:s[p]}),m=g.name,v=c[p]={otherDims:{}};null!=m&&null==h.get(m)&&(v.name=v.displayName=m,h.set(m,p)),null!=g.type&&(v.type=g.type),null!=g.displayName&&(v.displayName=g.displayName)}l.each(function(t,e){t=Si(t).slice();var i=l.set(e,[]);d(t,function(t,n){_(t)&&(t=h.get(t)),null!=t&&t<f&&(i[n]=t,o(c[t],e,n))})});var y=0;d(t,function(t,e){var n,t,a,s;if(_(t))n=t,t={};else{n=t.name;var h=t.ordinalMeta;t.ordinalMeta=null,(t=i(t)).ordinalMeta=h,a=t.dimsDef,s=t.otherDims,t.name=t.coordDim=t.coordDimIndex=t.dimsDef=t.otherDims=null}var u=Si(l.get(n));if(!u.length)for(var f=0;f<(a&&a.length||1);f++){for(;y<c.length&&null!=c[y].coordDim;)y++;y<c.length&&u.push(y++)}d(u,function(e,i){var l=c[e];o(r(l,t),n,i),null==l.name&&a&&(l.name=l.displayName=a[i]),l.isSysCoord=!0,s&&r(l.otherDims,s)})});for(var x=n.extraPrefix||"value",b=0;b<f;b++)null==(v=c[b]=c[b]||{}).coordDim&&(v.coordDim=Rs(x,u,n.extraFromZero),v.coordDimIndex=0,v.isExtraCoord=!0),null==v.name&&(v.name=Rs(v.coordDim,h)),null==v.type&&va(e,b,v.name)&&(v.type="ordinal");return c}function zs(t,e,i,n){return null==n&&(n=Math.max(t.dimensionsDetectCount||1,e.length,i.length),d(e,function(t){var e=t.dimsDef;e&&(n=Math.max(n,e.length))})),n}function Rs(t,e,i){if(i||null!=e.get(t)){for(var n=0;null!=e.get(t+n);)n++;t+=n}return e.set(t,!0),t}function Bs(t,e){ra.isInstance(t)||(t=ra.seriesDataToSource(t));var i,n=e.get("coordinateSystem"),o=Aa.get(n),a=oa(e);a&&(i=f(a.coordSysDims,function(t){var e={name:t},i=a.axisMap.get(t);if(i){var n=i.get("type");e.type=Ms(n),e.stackable=Vs(n)}return e})),i||(i=o&&(o.getDimensionsInfo?o.getDimensionsInfo():o.dimensions.slice())||["x","y"]);var r,s,l=wI(t,{coordDimensions:i});a&&d(l,function(t,e){var i=t.coordDim,n=a.categoryAxisMap.get(i);n&&(null==r&&(r=e),t.ordinalMeta=n.getOrdinalMeta()),null!=t.otherDims.itemName&&(s=!0)}),s||null==r||(l[r].otherDims.itemName=0);var h=new yI(l,e),u=null!=r&&Gs(t)?function(t,e,i,n){return n===r?i:this.defaultDimValueGetter(t,e,i,n)}:null;return h.hasItemOption=!1,h.initData(t,null,u),h}function Vs(t){return"category"!==t&&"time"!==t}function Gs(t){if(t.sourceFormat===kS){var e=Ws(t.data||[]);return null!=e&&!y(Ii(e))}}function Ws(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}function Fs(t){this._setting=t||{},this._extent=[1/0,-1/0],this._interval=0,this.init&&this.init.apply(this,arguments)}function Hs(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this._map}function Zs(t){return t._map||(t._map=z(t.categories))}function Us(t){return w(t)&&null!=t.value?t.value:t+""}function js(t,e,i,n){var o={},a=t[1]-t[0],r=o.interval=Bo(a/e,!0);null!=i&&r<i&&(r=o.interval=i),null!=n&&r>n&&(r=o.interval=n);var s=o.intervalPrecision=Xs(r);return qs(o.niceTickExtent=[II(Math.ceil(t[0]/r)*r,s),II(Math.floor(t[1]/r)*r,s)],t),o}function Xs(t){return Lo(t)+2}function Ys(t,e,i){t[e]=Math.max(Math.min(t[e],i[1]),i[0])}function qs(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),Ys(t,0,e),Ys(t,1,e),t[0]>t[1]&&(t[0]=t[1])}function $s(t,e,i,n){var o=[];if(!t)return o;e[0]<i[0]&&o.push(e[0]);for(var a=i[0];a<=i[1]&&(o.push(a),(a=II(a+t,n))!==o[o.length-1]);)if(o.length>1e4)return[];return e[1]>(o.length?o[o.length-1]:i[1])&&o.push(e[1]),o}function Ks(t){return t.get("stack")||DI+t.seriesIndex}function Js(t){return t.dim+t.index}function Qs(t,e){var i=[],n=t.axis;if("category"===n.type){for(var o=n.getBandWidth(),a=0;a<t.count;a++)i.push(r({bandWidth:o,axisKey:"axis0",stackId:DI+a},t));for(var s=el(i,e),l=[],a=0;a<t.count;a++){var h=s.axis0[DI+a];h.offsetCenter=h.offset+h.width/2,l.push(h)}return l}}function tl(t,e){return el(f(t,function(t){var e=t.getData(),i=t.coordinateSystem.getBaseAxis(),n=i.getExtent(),o="category"===i.type?i.getBandWidth():Math.abs(n[1]-n[0])/e.count();return{bandWidth:o,barWidth:To(t.get("barWidth"),o),barMaxWidth:To(t.get("barMaxWidth"),o),barGap:t.get("barGap"),barCategoryGap:t.get("barCategoryGap"),axisKey:Js(i),stackId:Ks(t)}}),e)}function el(t,e){var i={};d(t,function(t,e){var n=t.axisKey,o=t.bandWidth,a=i[n]||{bandWidth:o,remainedWidth:o,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},r=a.stacks;i[n]=a;var s=t.stackId;r[s]||a.autoWidthCount++,r[s]=r[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!r[s].width&&(r[s].width=l,l=Math.min(a.remainedWidth,l),a.remainedWidth-=l);var h=t.barMaxWidth;h&&(r[s].maxWidth=h);var u=t.barGap;null!=u&&(a.gap=u);var c=t.barCategoryGap;null!=c&&(a.categoryGap=c)});var n={};return d(i,function(t,e){n[e]={};var i=t.stacks,o=t.bandWidth,a=To(t.categoryGap,o),r=To(t.gap,1),s=t.remainedWidth,l=t.autoWidthCount,h=(s-a)/(l+(l-1)*r);h=Math.max(h,0),d(i,function(t,e){var i=t.maxWidth;i&&i<h&&(i=Math.min(i,s),t.width&&(i=Math.min(i,t.width)),s-=i,t.width=i,l--)}),h=(s-a)/(l+(l-1)*r),h=Math.max(h,0);var u,c=0;d(i,function(t,e){t.width||(t.width=h),u=t,c+=t.width*(1+r)}),u&&(c-=u.width*r);var f=-c/2;d(i,function(t,i){n[e][i]=n[e][i]||{offset:f,width:t.width},f+=t.width*(1+r)})}),n}function il(t,e,i){var n=tl(g(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),o={},a={};e.eachSeriesByType(t,function(t){if("cartesian2d"===t.coordinateSystem.type){var e=t.getData(),i=t.coordinateSystem,r=i.getBaseAxis(),s=Ks(t),l=n[Js(r)][s],h=l.offset,u=l.width,c=i.getOtherAxis(r),d=t.get("barMinHeight")||0,f=r.onZero?c.toGlobalCoord(c.dataToCoord(0)):c.getGlobalExtent()[0],p=[e.mapDimension("x"),e.mapDimension("y")],g=e.mapArray(p,function(t,e){return i.dataToPoint([t,e])},!0);o[s]=o[s]||[],a[s]=a[s]||[],e.setLayout({offset:h,size:u}),e.each(e.mapDimension(c.dim),function(t,i){if(!isNaN(t)){o[s][i]||(o[s][i]={p:f,n:f},a[s][i]={p:f,n:f});var n,r,l,p,m=t>=0?"p":"n",v=g[i],y=o[s][i][m],x=a[s][i][m];c.isHorizontal()?(n=y,r=v[1]+h,l=v[0]-x,p=u,a[s][i][m]+=l,Math.abs(l)<d&&(l=(l<0?-1:1)*d),o[s][i][m]+=l):(n=v[0]+h,r=y,l=u,p=v[1]-x,a[s][i][m]+=p,Math.abs(p)<d&&(p=(p<=0?-1:1)*d),o[s][i][m]+=p),e.setItemLayout(i,{x:n,y:r,width:l,height:p})}},!0)}},this)}function nl(t,e){return BI(t,RI(e))}function ol(t,e){var i,n,o,a=t.type,r=e.getMin(),s=e.getMax(),l=null!=r,h=null!=s,u=t.getExtent();"ordinal"===a?i=e.getCategories().length:(y(n=e.get("boundaryGap"))||(n=[n||0,n||0]),"boolean"==typeof n[0]&&(n=[0,0]),n[0]=To(n[0],1),n[1]=To(n[1],1),o=u[1]-u[0]||Math.abs(u[0])),null==r&&(r="ordinal"===a?i?0:NaN:u[0]-n[0]*o),null==s&&(s="ordinal"===a?i?i-1:NaN:u[1]+n[1]*o),"dataMin"===r?r=u[0]:"function"==typeof r&&(r=r({min:u[0],max:u[1]})),"dataMax"===s?s=u[1]:"function"==typeof s&&(s=s({min:u[0],max:u[1]})),(null==r||!isFinite(r))&&(r=NaN),(null==s||!isFinite(s))&&(s=NaN),t.setBlank(I(r)||I(s)),e.getNeedCrossZero()&&(r>0&&s>0&&!l&&(r=0),r<0&&s<0&&!h&&(s=0));var c=e.ecModel;if(c){var d=g(c.getSeriesByType("bar"),function(t){return t.getBaseAxis()===e.axis}).length>0;if(("time"===a||"interval"===a)&&d){var f=al(r,s,e);r=f.min,s=f.max}}return[r,s]}function al(t,e,i){var n=i.ecModel,o=i.axis.getExtent(),a=o[1]-o[0],r=tl(g(n.getSeriesByType("bar"),function(t){return!n.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}))[i.axis.dim+i.axis.index];if(void 0===r)return{min:t,max:e};var s=1/0;d(r,function(t){s=Math.min(t.offset,s)});var l=-1/0;d(r,function(t){l=Math.max(t.offset+t.width,l)});var h=Math.abs(s)+l,u=e-t,c=u/(1-(s+l)/a)-u;return e+=c*(l/h),t-=c*(s/h),{min:t,max:e}}function rl(t,e){var i=ol(t,e),n=null!=e.getMin(),o=null!=e.getMax(),a=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase"));var r=t.type;t.setExtent(i[0],i[1]),t.niceExtent({splitNumber:a,fixMin:n,fixMax:o,minInterval:"interval"===r||"time"===r?e.get("minInterval"):null,maxInterval:"interval"===r||"time"===r?e.get("maxInterval"):null});var s=e.get("interval");null!=s&&t.setInterval&&t.setInterval(s)}function sl(t,e){if(e=e||t.get("type"))switch(e){case"category":return new MI(t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),[1/0,-1/0]);case"value":return new AI;default:return(Fs.getClass(e)||AI).create(t)}}function ll(t,e,i,n,o){var a,r=0,s=0,l=(n-o)/180*Math.PI,h=1;e.length>40&&(h=Math.floor(e.length/40));for(var u=0;u<t.length;u+=h){var c=t[u],d=me(e[u],i,"center","top");d.x+=c*Math.cos(l),d.y+=c*Math.sin(l),d.width*=1.3,d.height*=1.3,a?a.intersect(d)?(s++,r=Math.max(r,s)):(a.union(d),s=0):a=d.clone()}return 0===r&&h>1?h:(r+1)*h-1}function hl(t,e){var i=t.scale,n=i.getTicksLabels(),o=i.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",null!=e?e:"")}}(e),f(n,e)):"function"==typeof e?f(o,function(i,n){return e(ul(t,i),n)},this):n}function ul(t,e){return"category"===t.type?t.scale.getLabel(e):e}function cl(t,e){if("image"!==this.type){var i=this.style,n=this.shape;n&&"line"===n.symbolType?i.stroke=t:this.__isEmptyBrush?(i.stroke=t,i.fill=e||"#fff"):(i.fill&&(i.fill=t),i.stroke&&(i.stroke=t)),this.dirty(!1)}}function dl(t,e,i,n,o,a,r){var s=0===t.indexOf("empty");s&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var l;return l=0===t.indexOf("image://")?zn(t.slice(8),new Kt(e,i,n,o),r?"center":"cover"):0===t.indexOf("path://")?En(t.slice(7),{},new Kt(e,i,n,o),r?"center":"cover"):new KI({shape:{symbolType:t,x:e,y:i,width:n,height:o}}),l.__isEmptyBrush=s,l.setColor=cl,l.setColor(a),l}function fl(t,e){return Math.abs(t-e)<QI}function pl(t,e,i){var n=0,o=t[0];if(!o)return!1;for(var a=1;a<t.length;a++){var r=t[a];n+=gn(o[0],o[1],r[0],r[1],e,i),o=r}var s=t[0];return fl(o[0],s[0])&&fl(o[1],s[1])||(n+=gn(o[0],o[1],s[0],s[1],e,i)),0!==n}function gl(t,e,i){if(this.name=t,this.geometries=e,i)i=[i[0],i[1]];else{var n=this.getBoundingRect();i=[n.x+n.width/2,n.y+n.height/2]}this.center=i}function ml(t){if(!t.UTF8Encoding)return t;var e=t.UTF8Scale;null==e&&(e=1024);for(var i=t.features,n=0;n<i.length;n++)for(var o=i[n].geometry,a=o.coordinates,r=o.encodeOffsets,s=0;s<a.length;s++){var l=a[s];if("Polygon"===o.type)a[s]=vl(l,r[s],e);else if("MultiPolygon"===o.type)for(var h=0;h<l.length;h++){var u=l[h];l[h]=vl(u,r[s][h],e)}}return t.UTF8Encoding=!1,t}function vl(t,e,i){for(var n=[],o=e[0],a=e[1],r=0;r<t.length;r+=2){var s=t.charCodeAt(r)-64,l=t.charCodeAt(r+1)-64;s=s>>1^-(1&s),l=l>>1^-(1&l),o=s+=o,a=l+=a,n.push([s/i,l/i])}return n}function yl(t,e){var i=(t[1]-t[0])/e/2;t[0]+=i,t[1]-=i}function xl(t,e){var i=t.mapDimension("defaultedLabel",!0),n=i.length;if(1===n)return Ja(t,e,i[0]);if(n){for(var o=[],a=0;a<i.length;a++){var r=Ja(t,e,i[a]);o.push(r)}return o.join(" ")}}function _l(t,e){var i=t.getItemVisual(e,"symbolSize");return i instanceof Array?i.slice():[+i,+i]}function wl(t){return[t[0]/2,t[1]/2]}function bl(t,e,i){S_.call(this),this.updateData(t,e,i)}function Sl(t,e){this.parent.drift(t,e)}function Ml(t){this.group=new S_,this._symbolCtor=t||bl}function Il(t,e,i,n){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(n&&n(i))&&"none"!==t.getItemVisual(i,"symbol")}function Tl(t){var e=t.hostModel;return{itemStyle:e.getModel("itemStyle").getItemStyle(["color"]),hoverItemStyle:e.getModel("emphasis.itemStyle").getItemStyle(),symbolRotate:e.get("symbolRotate"),symbolOffset:e.get("symbolOffset"),hoverAnimation:e.get("hoverAnimation"),labelModel:e.getModel("label"),hoverLabelModel:e.getModel("emphasis.label"),cursorStyle:e.get("cursor")}}function Al(t){return t>=0?1:-1}function Dl(t,e,i){for(var n,o=t.getBaseAxis(),a=t.getOtherAxis(o),r=o.onZero?0:a.scale.getExtent()[0],s=a.dim,l="x"===s||"radius"===s?1:0,h=e.stackedOn,u=e.get(s,i);h&&Al(h.get(s,i))===Al(u);){n=h;break}var c=[];return c[l]=e.get(o.dim,i),c[1-l]=n?n.get(s,i,!0):r,t.dataToPoint(c)}function Cl(t,e){var i=[];return e.diff(t).add(function(t){i.push({cmd:"+",idx:t})}).update(function(t,e){i.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){i.push({cmd:"-",idx:t})}).execute(),i}function Ll(t){return isNaN(t[0])||isNaN(t[1])}function kl(t,e,i,n,o,a,r,s,l,h,u){for(var c=0,d=i,f=0;f<n;f++){var p=e[d];if(d>=o||d<0)break;if(Ll(p)){if(u){d+=a;continue}break}if(d===i)t[a>0?"moveTo":"lineTo"](p[0],p[1]),mT(yT,p);else if(l>0){var g=d+a,m=e[g];if(u)for(;m&&Ll(e[g]);)m=e[g+=a];var v=.5,y=e[c];if(!(m=e[g])||Ll(m))mT(xT,p);else{Ll(m)&&!u&&(m=p),U(vT,m,y);var x,_;if("x"===h||"y"===h){var w="x"===h?0:1;x=Math.abs(p[w]-y[w]),_=Math.abs(p[w]-m[w])}else x=Vx(p,y),_=Vx(p,m);gT(xT,p,vT,-l*(1-(v=_/(_+x))))}fT(yT,yT,s),pT(yT,yT,r),fT(xT,xT,s),pT(xT,xT,r),t.bezierCurveTo(yT[0],yT[1],xT[0],xT[1],p[0],p[1]),gT(yT,p,vT,l*v)}else t.lineTo(p[0],p[1]);c=d,d+=a}return f}function Pl(t,e){var i=[1/0,1/0],n=[-1/0,-1/0];if(e)for(var o=0;o<t.length;o++){var a=t[o];a[0]<i[0]&&(i[0]=a[0]),a[1]<i[1]&&(i[1]=a[1]),a[0]>n[0]&&(n[0]=a[0]),a[1]>n[1]&&(n[1]=a[1])}return{min:e?i:n,max:e?n:i}}function Ol(t,e){if(t.length===e.length){for(var i=0;i<t.length;i++){var n=t[i],o=e[i];if(n[0]!==o[0]||n[1]!==o[1])return}return!0}}function Nl(t){return"number"==typeof t?t:t?.3:0}function El(t){var e=t.getGlobalExtent();if(t.onBand){var i=t.getBandWidth()/2-1,n=e[1]>e[0]?1:-1;e[0]+=n*i,e[1]-=n*i}return e}function zl(t){return t>=0?1:-1}function Rl(t,e,i,n){var o=e.getBaseAxis(),a=e.getOtherAxis(o),r=0,s=a.scale.getExtent();"start"===n?r=s[0]:"end"===n?r=s[1]:(s=a.scale.getExtent())[0]>0?r=s[0]:s[1]<0&&(r=s[1]);var l=a.dim,h="x"===l||"radius"===l?1:0,u=i.mapDimension(l);return i.mapArray(u?[u]:[],function(t,n){for(var a,s=i.stackedOn;s&&zl(s.get(u,n))===zl(t);){a=s;break}var l=[];return l[h]=i.get(o.dim,n),l[1-h]=a?a.get(u,n,!0):r,e.dataToPoint(l)},!0)}function Bl(t,e,i){var n=El(t.getAxis("x")),o=El(t.getAxis("y")),a=t.getBaseAxis().isHorizontal(),r=Math.min(n[0],n[1]),s=Math.min(o[0],o[1]),l=Math.max(n[0],n[1])-r,h=Math.max(o[0],o[1])-s,u=i.get("lineStyle.width")||2,c=i.get("clipOverflow")?u/2:Math.max(l,h);a?(s-=c,h+=2*c):(r-=c,l+=2*c);var d=new Vb({shape:{x:r,y:s,width:l,height:h}});return e&&(d.shape[a?"width":"height"]=0,fo(d,{shape:{width:l,height:h}},i)),d}function Vl(t,e,i){var n=t.getAngleAxis(),o=t.getRadiusAxis().getExtent(),a=n.getExtent(),r=Math.PI/180,s=new Ob({shape:{cx:t.cx,cy:t.cy,r0:o[0],r:o[1],startAngle:-a[0]*r,endAngle:-a[1]*r,clockwise:n.inverse}});return e&&(s.shape.endAngle=-a[0]*r,fo(s,{shape:{endAngle:-a[1]*r}},i)),s}function Gl(t,e,i){return"polar"===t.type?Vl(t,e,i):Bl(t,e,i)}function Wl(t,e,i){for(var n=e.getBaseAxis(),o="x"===n.dim||"radius"===n.dim?0:1,a=[],r=0;r<t.length-1;r++){var s=t[r+1],l=t[r];a.push(l);var h=[];switch(i){case"end":h[o]=s[o],h[1-o]=l[1-o],a.push(h);break;case"middle":var u=(l[o]+s[o])/2,c=[];h[o]=c[o]=u,h[1-o]=l[1-o],c[1-o]=s[1-o],a.push(h),a.push(c);break;default:h[o]=l[o],h[1-o]=s[1-o],a.push(h)}}return t[r]&&a.push(t[r]),a}function Fl(t,e){var i=t.getVisual("visualMeta");if(i&&i.length&&t.count()){for(var n,o=i.length-1;o>=0;o--)if(i[o].dimension<2){n=i[o];break}if(n&&"cartesian2d"===e.type){var a=n.dimension,r=t.dimensions[a],s=e.getAxis(r),l=f(n.stops,function(t){return{coord:s.toGlobalCoord(s.dataToCoord(t.value)),color:t.color}}),h=l.length,u=n.outerColors.slice();h&&l[0].coord>l[h-1].coord&&(l.reverse(),u.reverse());var c=l[0].coord-10,p=l[h-1].coord+10,g=p-c;if(g<.001)return"transparent";d(l,function(t){t.offset=(t.coord-c)/g}),l.push({offset:h?l[h-1].offset:.5,color:u[1]||"transparent"}),l.unshift({offset:h?l[0].offset:.5,color:u[0]||"transparent"});var m=new jb(0,0,0,0,l,!0);return m[r]=c,m[r+"2"]=p,m}}}function Hl(t){return this._axes[t]}function Zl(t){TT.call(this,t)}function Ul(t,e){return e.type||(e.data?"category":"value")}function jl(t,e,i){return t.getCoordSysModel()===e}function Xl(t,e){var i=e*Math.PI/180,n=t.plain(),o=n.width,a=n.height,r=o*Math.cos(i)+a*Math.sin(i),s=o*Math.sin(i)+a*Math.cos(i);return new Kt(n.x,n.y,r,s)}function Yl(t){var e,i=t.model,n=i.get("axisLabel.show")?i.getFormattedLabels():[],o=i.getModel("axisLabel"),a=1,r=n.length;r>40&&(a=Math.ceil(r/40));for(var s=0;s<r;s+=a)if(!t.isLabelIgnored(s)){var l=Xl(o.getTextRect(n[s]),o.get("rotate")||0);e?e.union(l):e=l}return e}function ql(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,i),this.model=t}function $l(t,e,i){var n=t[e];if(i.onZero){var o=i.onZeroAxisIndex;if(null==o){for(var a in n)if(n.hasOwnProperty(a)){var r=n[a];if(r&&!Kl(r)){o=+a;break}}null==o&&(i.onZero=!1),i.onZeroAxisIndex=o}else(r=n[o])&&Kl(r)&&(i.onZero=!1)}}function Kl(t){return"category"===t.type||"time"===t.type||!ET(t)}function Jl(t,e){var i=t.getExtent(),n=i[0]+i[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return n-t+e}}function Ql(t,e){return f(BT,function(e){return t.getReferringComponents(e)[0]})}function th(t){return"cartesian2d"===t.get("coordinateSystem")}function eh(t){var e={componentType:t.mainType};return e[t.mainType+"Index"]=t.componentIndex,e}function ih(t,e,i,n){var o,a,r=Oo(i-t.rotation),s=n[0]>n[1],l="start"===e&&!s||"start"!==e&&s;return No(r-VT/2)?(a=l?"bottom":"top",o="center"):No(r-1.5*VT)?(a=l?"top":"bottom",o="center"):(a="middle",o=r<1.5*VT&&r>VT/2?l?"left":"right":l?"right":"left"),{rotation:r,textAlign:o,textVerticalAlign:a}}function nh(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}function oh(t,e,i){var n=t.get("axisLabel.showMinLabel"),o=t.get("axisLabel.showMaxLabel");e=e||[],i=i||[];var a=e[0],r=e[1],s=e[e.length-1],l=e[e.length-2],h=i[0],u=i[1],c=i[i.length-1],d=i[i.length-2];!1===n?(ah(a),ah(h)):rh(a,r)&&(n?(ah(r),ah(u)):(ah(a),ah(h))),!1===o?(ah(s),ah(c)):rh(l,s)&&(o?(ah(l),ah(d)):(ah(s),ah(c)))}function ah(t){t&&(t.ignore=!0)}function rh(t,e,i){var n=t&&t.getBoundingRect().clone(),o=e&&e.getBoundingRect().clone();if(n&&o){var a=lt([]);return dt(a,a,-t.rotation),n.applyTransform(ut([],a,t.getLocalTransform())),o.applyTransform(ut([],a,e.getLocalTransform())),n.intersect(o)}}function sh(t){return"middle"===t||"center"===t}function lh(t,e,i){var n=e.axis;if(e.get("axisTick.show")&&!n.scale.isBlank()){for(var o=e.getModel("axisTick"),a=o.getModel("lineStyle"),s=o.get("length"),l=ZT(o,i.labelInterval),h=n.getTicksCoords(o.get("alignWithLabel")),u=n.scale.getTicks(),c=e.get("axisLabel.showMinLabel"),d=e.get("axisLabel.showMaxLabel"),f=[],p=[],g=t._transform,m=[],v=h.length,y=0;y<v;y++)if(!HT(n,y,l,v,c,d)){var x=h[y];f[0]=x,f[1]=0,p[0]=x,p[1]=i.tickDirection*s,g&&(Q(f,f,g),Q(p,p,g));var _=new Gb(Vn({anid:"tick_"+u[y],shape:{x1:f[0],y1:f[1],x2:p[0],y2:p[1]},style:r(a.getLineStyle(),{stroke:e.get("axisLine.lineStyle.color")}),z2:2,silent:!0}));t.group.add(_),m.push(_)}return m}}function hh(t,e,i){var n=e.axis;if(T(i.axisLabelShow,e.get("axisLabel.show"))&&!n.scale.isBlank()){var o=e.getModel("axisLabel"),a=o.get("margin"),r=n.scale.getTicks(),s=e.getFormattedLabels(),l=(T(i.labelRotate,o.get("rotate"))||0)*VT/180,h=FT(i.rotation,l,i.labelDirection),u=e.getCategories(),c=[],f=nh(e),p=e.get("triggerEvent"),g=e.get("axisLabel.showMinLabel"),m=e.get("axisLabel.showMaxLabel");return d(r,function(l,d){if(!HT(n,d,i.labelInterval,r.length,g,m)){var v=o;u&&u[l]&&u[l].textStyle&&(v=new _o(u[l].textStyle,o,e.ecModel));var y=v.getTextColor()||e.get("axisLine.lineStyle.color"),x=[n.dataToCoord(l),i.labelOffset+i.labelDirection*a],_=n.scale.getLabel(l),w=new Cb({anid:"label_"+l,position:x,rotation:h.rotation,silent:f,z2:10});io(w.style,v,{text:s[d],textAlign:v.getShallow("align",!0)||h.textAlign,textVerticalAlign:v.getShallow("verticalAlign",!0)||v.getShallow("baseline",!0)||h.textVerticalAlign,textFill:"function"==typeof y?y("category"===n.type?_:"value"===n.type?l+"":l,d):y}),p&&(w.eventData=eh(e),w.eventData.targetType="axisLabel",w.eventData.value=_),t._dumbGroup.add(w),w.updateTransform(),c.push(w),t.group.add(w),w.decomposeTransform()}}),c}}function uh(t,e){var i={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return ch(i,t,e),i.seriesInvolved&&fh(i,t),i}function ch(t,e,i){var n=e.getComponent("tooltip"),o=e.getComponent("axisPointer"),a=o.get("link",!0)||[],r=[];UT(i.getCoordinateSystems(),function(i){function s(n,s,l){var c=l.model.getModel("axisPointer",o),d=c.get("show");if(d&&("auto"!==d||n||xh(c))){null==s&&(s=c.get("triggerTooltip"));var f=(c=n?dh(l,u,o,e,n,s):c).get("snap"),p=_h(l.model),g=s||f||"category"===l.type,m=t.axesInfo[p]={key:p,axis:l,coordSys:i,axisPointerModel:c,triggerTooltip:s,involveSeries:g,snap:f,useHandle:xh(c),seriesModels:[]};h[p]=m,t.seriesInvolved|=g;var v=ph(a,l);if(null!=v){var y=r[v]||(r[v]={axesInfo:{}});y.axesInfo[p]=m,y.mapper=a[v].mapper,m.linkGroup=y}}}if(i.axisPointerEnabled){var l=_h(i.model),h=t.coordSysAxesInfo[l]={};t.coordSysMap[l]=i;var u=i.model.getModel("tooltip",n);if(UT(i.getAxes(),jT(s,!1,null)),i.getTooltipAxes&&n&&u.get("show")){var c="axis"===u.get("trigger"),d="cross"===u.get("axisPointer.type"),f=i.getTooltipAxes(u.get("axisPointer.axis"));(c||d)&&UT(f.baseAxes,jT(s,!d||"cross",c)),d&&UT(f.otherAxes,jT(s,"cross",!1))}}})}function dh(t,e,n,o,a,s){var l=e.getModel("axisPointer"),h={};UT(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],function(t){h[t]=i(l.get(t))}),h.snap="category"!==t.type&&!!s,"cross"===l.get("type")&&(h.type="line");var u=h.label||(h.label={});if(null==u.show&&(u.show=!1),"cross"===a&&(u.show=!0,!s)){var c=h.lineStyle=l.get("crossStyle");c&&r(u,c.textStyle)}return t.model.getModel("axisPointer",new _o(h,n,o))}function fh(t,e){e.eachSeries(function(e){var i=e.coordinateSystem,n=e.get("tooltip.trigger",!0),o=e.get("tooltip.show",!0);i&&"none"!==n&&!1!==n&&"item"!==n&&!1!==o&&!1!==e.get("axisPointer.show",!0)&&UT(t.coordSysAxesInfo[_h(i.model)],function(t){var n=t.axis;i.getAxis(n.dim)===n&&(t.seriesModels.push(e),null==t.seriesDataCount&&(t.seriesDataCount=0),t.seriesDataCount+=e.getData().count())})},this)}function ph(t,e){for(var i=e.model,n=e.dim,o=0;o<t.length;o++){var a=t[o]||{};if(gh(a[n+"AxisId"],i.id)||gh(a[n+"AxisIndex"],i.componentIndex)||gh(a[n+"AxisName"],i.name))return o}}function gh(t,e){return"all"===t||y(t)&&l(t,e)>=0||t===e}function mh(t){var e=vh(t);if(e){var i=e.axisPointerModel,n=e.axis.scale,o=i.option,a=i.get("status"),r=i.get("value");null!=r&&(r=n.parse(r));var s=xh(i);null==a&&(o.status=s?"show":"hide");var l=n.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==r||r>l[1])&&(r=l[1]),r<l[0]&&(r=l[0]),o.value=r,s&&(o.status=e.axis.scale.isBlank()?"hide":"show")}}function vh(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[_h(t)]}function yh(t){var e=vh(t);return e&&e.axisPointerModel}function xh(t){return!!t.get("handle.show")}function _h(t){return t.type+"||"+t.id}function wh(t,e,i,n,o,a){var r=XT.getAxisPointerClass(t.axisPointerClass);if(r){var s=yh(e);s?(t._axisPointer||(t._axisPointer=new r)).render(e,s,n,a):bh(t,n)}}function bh(t,e,i){var n=t._axisPointer;n&&n.dispose(e,i),t._axisPointer=null}function Sh(t,e,i){i=i||{};var n=t.coordinateSystem,o=e.axis,a={},r=o.position,s=o.onZero?"onZero":r,l=o.dim,h=n.getRect(),u=[h.x,h.x+h.width,h.y,h.y+h.height],c={left:0,right:1,top:0,bottom:1,onZero:2},d=e.get("offset")||0,f="x"===l?[u[2]-d,u[3]+d]:[u[0]-d,u[1]+d];if(o.onZero){var p=n.getAxis("x"===l?"y":"x",o.onZeroAxisIndex),g=p.toGlobalCoord(p.dataToCoord(0));f[c.onZero]=Math.max(Math.min(g,f[1]),f[0])}a.position=["y"===l?f[c[s]]:u[0],"x"===l?f[c[s]]:u[3]],a.rotation=Math.PI/2*("x"===l?0:1);var m={top:-1,bottom:1,left:-1,right:1};a.labelDirection=a.tickDirection=a.nameDirection=m[r],a.labelOffset=o.onZero?f[c[r]]-f[c.onZero]:0,e.get("axisTick.inside")&&(a.tickDirection=-a.tickDirection),T(i.labelInside,e.get("axisLabel.inside"))&&(a.labelDirection=-a.labelDirection);var v=e.get("axisLabel.rotate");return a.labelRotate="top"===s?-v:v,a.labelInterval=o.getLabelInterval(),a.z2=1,a}function Mh(t,e,i,n,o,a,r){eo(t,e,i.getModel("label"),i.getModel("emphasis.label"),{labelFetcher:o,labelDataIndex:a,defaultText:xl(o.getData(),a),isRectText:!0,autoColor:n}),Ih(t),Ih(e)}function Ih(t,e){"outside"===t.textPosition&&(t.textPosition=e)}function Th(t,e,i){i.style.text=null,co(i,{shape:{width:0}},e,t,function(){i.parent&&i.parent.remove(i)})}function Ah(t,e,i){i.style.text=null,co(i,{shape:{r:i.shape.r0}},e,t,function(){i.parent&&i.parent.remove(i)})}function Dh(t,e,i,n,o,a,s,l){var h=e.getItemVisual(i,"color"),u=e.getItemVisual(i,"opacity"),c=n.getModel("itemStyle"),d=n.getModel("emphasis.itemStyle").getBarItemStyle();l||t.setShape("r",c.get("barBorderRadius")||0),t.useStyle(r({fill:h,opacity:u},c.getBarItemStyle()));var f=n.getShallow("cursor");f&&t.attr("cursor",f);var p=s?o.height>0?"bottom":"top":o.width>0?"left":"right";l||Mh(t.style,d,n,h,a,i,p),to(t,d)}function Ch(t,e){var i=t.get(nA)||0;return Math.min(i,Math.abs(e.width),Math.abs(e.height))}function Lh(t,e,i,n){var o=e.getData(),a=this.dataIndex,r=o.getName(a),s=e.get("selectedOffset");n.dispatchAction({type:"pieToggleSelect",from:t,name:r,seriesId:e.id}),o.each(function(t){kh(o.getItemGraphicEl(t),o.getItemLayout(t),e.isSelected(o.getName(t)),s,i)})}function kh(t,e,i,n,o){var a=(e.startAngle+e.endAngle)/2,r=Math.cos(a),s=Math.sin(a),l=i?n:0,h=[r*l,s*l];o?t.animate().when(200,{position:h}).start("bounceOut"):t.attr("position",h)}function Ph(t,e){function i(){a.ignore=a.hoverIgnore,r.ignore=r.hoverIgnore}function n(){a.ignore=a.normalIgnore,r.ignore=r.normalIgnore}S_.call(this);var o=new Ob({z2:2}),a=new Bb,r=new Cb;this.add(o),this.add(a),this.add(r),this.updateData(t,e,!0),this.on("emphasis",i).on("normal",n).on("mouseover",i).on("mouseout",n)}function Oh(t,e,i,n,o,a,r){function s(e,i){for(var n=e;n>=0&&(t[n].y-=i,!(n>0&&t[n].y>t[n-1].y+t[n-1].height));n--);}function l(t,e,i,n,o,a){for(var r=e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++)if("center"!==t[s].position){var h=Math.abs(t[s].y-n),u=t[s].len,c=t[s].len2,d=h<o+u?Math.sqrt((o+u+c)*(o+u+c)-h*h):Math.abs(t[s].x-i);e&&d>=r&&(d=r-10),!e&&d<=r&&(d=r+10),t[s].x=i+d*a,r=d}}t.sort(function(t,e){return t.y-e.y});for(var h,u=0,c=t.length,d=[],f=[],p=0;p<c;p++)(h=t[p].y-u)<0&&function(e,i,n,o){for(var a=e;a<i;a++)if(t[a].y+=n,a>e&&a+1<i&&t[a+1].y>t[a].y+t[a].height)return void s(a,n/2);s(i-1,n/2)}(p,c,-h),u=t[p].y+t[p].height;r-u<0&&s(c-1,u-r);for(p=0;p<c;p++)t[p].y>=i?f.push(t[p]):d.push(t[p]);l(d,!1,e,i,n,o),l(f,!0,e,i,n,o)}function Nh(t,e,i,n,o,a){for(var r=[],s=[],l=0;l<t.length;l++)t[l].x<e?r.push(t[l]):s.push(t[l]);Oh(s,e,i,n,1,o,a),Oh(r,e,i,n,-1,o,a);for(l=0;l<t.length;l++){var h=t[l].linePoints;if(h){var u=h[1][0]-h[2][0];t[l].x<e?h[2][0]=t[l].x+3:h[2][0]=t[l].x-3,h[1][1]=h[2][1]=t[l].y,h[1][0]=h[2][0]+u}}}function Eh(){this.group=new S_}function zh(t,e,i){nT.call(this,t,e,i),this.type="value",this.angle=0,this.name="",this.model}function Rh(t,e,i){this._model=t,this.dimensions=[],this._indicatorAxes=f(t.getIndicatorModels(),function(t,e){var i="indicator_"+e,n=new zh(i,new AI);return n.name=t.get("name"),n.model=t,t.axis=n,this.dimensions.push(i),n},this),this.resize(t,i),this.cx,this.cy,this.r,this.startAngle}function Bh(t,e){return r({show:e},t)}function Vh(t){return y(t)||(t=[+t,+t]),t}function Gh(t,e,i){Hh(t)[e]=i}function Wh(t,e,i){var n=Hh(t);n[e]===i&&(n[e]=null)}function Fh(t,e){return!!Hh(t)[e]}function Hh(t){return t[bA]||(t[bA]={})}function Zh(t){this.pointerChecker,this._zr=t,this._opt={};var e=m,n=e(Uh,this),o=e(jh,this),a=e(Xh,this),s=e(Yh,this),l=e(qh,this);Hx.call(this),this.setPointerChecker=function(t){this.pointerChecker=t},this.enable=function(e,h){this.disable(),this._opt=r(i(h)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,preventDefaultMouseMove:!0}),null==e&&(e=!0),!0!==e&&"move"!==e&&"pan"!==e||(t.on("mousedown",n),t.on("mousemove",o),t.on("mouseup",a)),!0!==e&&"scale"!==e&&"zoom"!==e||(t.on("mousewheel",s),t.on("pinch",l))},this.disable=function(){t.off("mousedown",n),t.off("mousemove",o),t.off("mouseup",a),t.off("mousewheel",s),t.off("pinch",l)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}function Uh(t){if(!(ci(t)||t.target&&t.target.draggable)){var e=t.offsetX,i=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,i)&&(this._x=e,this._y=i,this._dragging=!0)}}function jh(t){if(!ci(t)&&Kh(this,"moveOnMouseMove",t)&&this._dragging&&"pinch"!==t.gestureEvent&&!Fh(this._zr,"globalPan")){var e=t.offsetX,i=t.offsetY,n=this._x,o=this._y,a=e-n,r=i-o;this._x=e,this._y=i,this._opt.preventDefaultMouseMove&&Q_(t.event),this.trigger("pan",a,r,n,o,e,i)}}function Xh(t){ci(t)||(this._dragging=!1)}function Yh(t){if(Kh(this,"zoomOnMouseWheel",t)&&0!==t.wheelDelta){var e=t.wheelDelta>0?1.1:1/1.1;$h.call(this,t,e,t.offsetX,t.offsetY)}}function qh(t){if(!Fh(this._zr,"globalPan")){var e=t.pinchScale>1?1.1:1/1.1;$h.call(this,t,e,t.pinchX,t.pinchY)}}function $h(t,e,i,n){this.pointerChecker&&this.pointerChecker(t,i,n)&&(Q_(t.event),this.trigger("zoom",e,i,n))}function Kh(t,e,i){var n=t._opt[e];return n&&(!_(n)||i.event[n+"Key"])}function Jh(t,e,i){var n=t.target,o=n.position;o[0]+=e,o[1]+=i,n.dirty()}function Qh(t,e,i,n){var o=t.target,a=t.zoomLimit,r=o.position,s=o.scale,l=t.zoom=t.zoom||1;if(l*=e,a){var h=a.min||0,u=a.max||1/0;l=Math.max(Math.min(u,l),h)}var c=l/t.zoom;t.zoom=l,r[0]-=(i-r[0])*(c-1),r[1]-=(n-r[1])*(c-1),s[0]*=c,s[1]*=c,o.dirty()}function tu(t,e,i){var n=e.getComponentByElement(t.topTarget),o=n&&n.coordinateSystem;return n&&n!==i&&!SA[n.mainType]&&o&&o.model!==i}function eu(t,e){var i=t.getItemStyle(),n=t.get("areaColor");return null!=n&&(i.fill=n),i}function iu(t,e,i,n,o){i.off("click"),i.off("mousedown"),e.get("selectedMode")&&(i.on("mousedown",function(){t._mouseDownFlag=!0}),i.on("click",function(a){if(t._mouseDownFlag){t._mouseDownFlag=!1;for(var r=a.target;!r.__regions;)r=r.parent;if(r){var s={type:("geo"===e.mainType?"geo":"map")+"ToggleSelect",batch:f(r.__regions,function(t){return{name:t.name,from:o.uid}})};s[e.mainType+"Id"]=e.id,n.dispatchAction(s),nu(e,i)}}}))}function nu(t,e){e.eachChild(function(e){d(e.__regions,function(i){e.trigger(t.isSelected(i.name)?"emphasis":"normal")})})}function ou(t,e){var i=new S_;this._controller=new Zh(t.getZr()),this._controllerHost={target:e?i:null},this.group=i,this._updateGroup=e,this._mouseDownFlag}function au(t,e,i){var n=t.getZoom(),o=t.getCenter(),a=e.zoom,r=t.dataToPoint(o);if(null!=e.dx&&null!=e.dy){r[0]-=e.dx,r[1]-=e.dy;o=t.pointToData(r);t.setCenter(o)}if(null!=a){if(i){var s=i.min||0,l=i.max||1/0;a=Math.max(Math.min(n*a,l),s)/n}t.scale[0]*=a,t.scale[1]*=a;var h=t.position,u=(e.originX-h[0])*(a-1),c=(e.originY-h[1])*(a-1);h[0]-=u,h[1]-=c,t.updateTransform();o=t.pointToData(r);t.setCenter(o),t.setZoom(a*n)}return{center:t.getCenter(),zoom:t.getZoom()}}function ru(){Kx.call(this)}function su(t){this.name=t,this.zoomLimit,Kx.call(this),this._roamTransformable=new ru,this._rawTransformable=new ru,this._center,this._zoom}function lu(t,e,i,n){var o=i.seriesModel,a=o?o.coordinateSystem:null;return a===this?a[t](n):null}function hu(t,e,i,n,o){su.call(this,t),this.map=e,this._nameCoordMap=z(),this.loadGeoJson(i,n,o)}function uu(t,e,i,n){var o=i.geoModel,a=i.seriesModel,r=o?o.coordinateSystem:a?a.coordinateSystem||(a.getReferringComponents("geo")[0]||{}).coordinateSystem:null;return r===this?r[t](n):null}function cu(t,e){var i=t.get("boundingCoords");if(null!=i){var n=i[0],o=i[1];isNaN(n[0])||isNaN(n[1])||isNaN(o[0])||isNaN(o[1])||this.setBoundingRect(n[0],n[1],o[0]-n[0],o[1]-n[1])}var a,r=this.getBoundingRect(),s=t.get("layoutCenter"),l=t.get("layoutSize"),h=e.getWidth(),u=e.getHeight(),c=t.get("aspectScale")||.75,d=r.width/r.height*c,f=!1;s&&l&&(s=[To(s[0],h),To(s[1],u)],l=To(l,Math.min(h,u)),isNaN(s[0])||isNaN(s[1])||isNaN(l)||(f=!0));if(f){var p={};d>1?(p.width=l,p.height=l/d):(p.height=l,p.width=l*d),p.y=s[1]-p.height/2,p.x=s[0]-p.width/2}else(a=t.getBoxLayoutParams()).aspect=d,p=Ko(a,{width:h,height:u});this.setViewRect(p.x,p.y,p.width,p.height),this.setCenter(t.get("center")),this.setZoom(t.get("zoom"))}function du(t,e){d(e.get("geoCoord"),function(e,i){t.addGeoCoord(i,e)})}function fu(t,e){var i={};return d(t,function(t){t.each(t.mapDimension("value"),function(e,n){var o="ec-"+t.getName(n);i[o]=i[o]||[],isNaN(e)||i[o].push(e)})}),t[0].map(t[0].mapDimension("value"),function(n,o){for(var a="ec-"+t[0].getName(o),r=0,s=1/0,l=-1/0,h=i[a].length,u=0;u<h;u++)s=Math.min(s,i[a][u]),l=Math.max(l,i[a][u]),r+=i[a][u];var c;return c="min"===e?s:"max"===e?l:"average"===e?r/h:r,0===h?NaN:c})}function pu(t){var e=t.mainData,i=t.datas;i||(i={main:e},t.datasAttr={main:"data"}),t.datas=t.mainData=null,_u(e,i,t),NA(i,function(i){NA(e.TRANSFERABLE_METHODS,function(e){i.wrapMethod(e,v(gu,t))})}),e.wrapMethod("cloneShallow",v(vu,t)),NA(e.CHANGABLE_METHODS,function(i){e.wrapMethod(i,v(mu,t))}),k(i[e.dataType]===e)}function gu(t,e){if(xu(this)){var i=a({},this[EA]);i[this.dataType]=e,_u(e,i,t)}else wu(e,this.dataType,this[zA],t);return e}function mu(t,e){return t.struct&&t.struct.update(this),e}function vu(t,e){return NA(e[EA],function(i,n){i!==e&&wu(i.cloneShallow(),n,e,t)}),e}function yu(t){var e=this[zA];return null==t||null==e?e:e[EA][t]}function xu(t){return t[zA]===t}function _u(t,e,i){t[EA]={},NA(e,function(e,n){wu(e,n,t,i)})}function wu(t,e,i,n){i[EA][e]=t,t[zA]=i,t.dataType=e,n.struct&&(t[n.structAttr]=n.struct,n.struct[n.datasAttr[e]]=t),t.getLinkedData=yu}function bu(t,e,i){this.root,this.data,this._nodes=[],this.hostModel=t,this.levelModels=f(e||[],function(e){return new _o(e,t,t.ecModel)}),this.leavesModel=new _o(i||{},t,t.ecModel)}function Su(t,e){var i=e.children;t.parentNode!==e&&(i.push(t),t.parentNode=e)}function Mu(t){t.hierNode={defaultAncestor:null,ancestor:t,prelim:0,modifier:0,change:0,shift:0,i:0,thread:null};for(var e,i,n=[t];e=n.pop();)if(i=e.children,e.isExpand&&i.length)for(var o=i.length-1;o>=0;o--){var a=i[o];a.hierNode={defaultAncestor:null,ancestor:a,prelim:0,modifier:0,change:0,shift:0,i:o,thread:null},n.push(a)}}function Iu(t,e){var i=t.isExpand?t.children:[],n=t.parentNode.children,o=t.hierNode.i?n[t.hierNode.i-1]:null;if(i.length){Lu(t);var a=(i[0].hierNode.prelim+i[i.length-1].hierNode.prelim)/2;o?(t.hierNode.prelim=o.hierNode.prelim+e(t,o),t.hierNode.modifier=t.hierNode.prelim-a):t.hierNode.prelim=a}else o&&(t.hierNode.prelim=o.hierNode.prelim+e(t,o));t.parentNode.hierNode.defaultAncestor=ku(t,o,t.parentNode.hierNode.defaultAncestor||n[0],e)}function Tu(t){var e=t.hierNode.prelim+t.parentNode.hierNode.modifier;t.setLayout({x:e},!0),t.hierNode.modifier+=t.parentNode.hierNode.modifier}function Au(t){return arguments.length?t:zu}function Du(t,e){var i={};return t-=Math.PI/2,i.x=e*Math.cos(t),i.y=e*Math.sin(t),i}function Cu(t,e){return Ko(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function Lu(t){for(var e=t.children,i=e.length,n=0,o=0;--i>=0;){var a=e[i];a.hierNode.prelim+=n,a.hierNode.modifier+=n,o+=a.hierNode.change,n+=a.hierNode.shift+o}}function ku(t,e,i,n){if(e){for(var o=t,a=t,r=a.parentNode.children[0],s=e,l=o.hierNode.modifier,h=a.hierNode.modifier,u=r.hierNode.modifier,c=s.hierNode.modifier;s=Pu(s),a=Ou(a),s&&a;){o=Pu(o),r=Ou(r),o.hierNode.ancestor=t;var d=s.hierNode.prelim+c-a.hierNode.prelim-h+n(s,a);d>0&&(Eu(Nu(s,t,i),t,d),h+=d,l+=d),c+=s.hierNode.modifier,h+=a.hierNode.modifier,l+=o.hierNode.modifier,u+=r.hierNode.modifier}s&&!Pu(o)&&(o.hierNode.thread=s,o.hierNode.modifier+=c-l),a&&!Ou(r)&&(r.hierNode.thread=a,r.hierNode.modifier+=h-u,i=t)}return i}function Pu(t){var e=t.children;return e.length&&t.isExpand?e[e.length-1]:t.hierNode.thread}function Ou(t){var e=t.children;return e.length&&t.isExpand?e[0]:t.hierNode.thread}function Nu(t,e,i){return t.hierNode.ancestor.parentNode===e.parentNode?t.hierNode.ancestor:i}function Eu(t,e,i){var n=i/(e.hierNode.i-t.hierNode.i);e.hierNode.change-=n,e.hierNode.shift+=i,e.hierNode.modifier+=i,e.hierNode.prelim+=i,t.hierNode.change+=n}function zu(t,e){return t.parentNode===e.parentNode?1:2}function Ru(t,e){var i=t.getItemLayout(e);return i&&!isNaN(i.x)&&!isNaN(i.y)&&"none"!==t.getItemVisual(e,"symbol")}function Bu(t,e,i){return i.itemModel=e,i.itemStyle=e.getModel("itemStyle").getItemStyle(),i.hoverItemStyle=e.getModel("emphasis.itemStyle").getItemStyle(),i.lineStyle=e.getModel("lineStyle").getLineStyle(),i.labelModel=e.getModel("label"),i.hoverLabelModel=e.getModel("emphasis.label"),!1===t.isExpand&&0!==t.children.length?i.symbolInnerColor=i.itemStyle.fill:i.symbolInnerColor="#fff",i}function Vu(t,e,i,n,o,a){var s=!i,l=t.tree.getNodeByDataIndex(e),a=Bu(l,l.getModel(),a),h=t.tree.root,u=l.parentNode===h?l:l.parentNode||l,c=t.getItemGraphicEl(u.dataIndex),d=u.getLayout(),f=c?{x:c.position[0],y:c.position[1],rawX:c.__radialOldRawX,rawY:c.__radialOldRawY}:d,p=l.getLayout();s?(i=new bl(t,e,a)).attr("position",[f.x,f.y]):i.updateData(t,e,a),i.__radialOldRawX=i.__radialRawX,i.__radialOldRawY=i.__radialRawY,i.__radialRawX=p.rawX,i.__radialRawY=p.rawY,n.add(i),t.setItemGraphicEl(e,i),co(i,{position:[p.x,p.y]},o);var g=i.getSymbolPath();if("radial"===a.layout){var m,v,y=h.children[0],x=y.getLayout(),_=y.children.length;if(p.x===x.x&&!0===l.isExpand){var w={};w.x=(y.children[0].getLayout().x+y.children[_-1].getLayout().x)/2,w.y=(y.children[0].getLayout().y+y.children[_-1].getLayout().y)/2,(m=Math.atan2(w.y-x.y,w.x-x.x))<0&&(m=2*Math.PI+m),(v=w.x<x.x)&&(m-=Math.PI)}else(m=Math.atan2(p.y-x.y,p.x-x.x))<0&&(m=2*Math.PI+m),0===l.children.length||0!==l.children.length&&!1===l.isExpand?(v=p.x<x.x)&&(m-=Math.PI):(v=p.x>x.x)||(m-=Math.PI);var b=v?"left":"right";g.setStyle({textPosition:b,textRotation:-m,textOrigin:"center",verticalAlign:"middle"})}if(l.parentNode&&l.parentNode!==h){var S=i.__edge;S||(S=i.__edge=new Fb({shape:Wu(a,f,f),style:r({opacity:0},a.lineStyle)})),co(S,{shape:Wu(a,d,p),style:{opacity:1}},o),n.add(S)}}function Gu(t,e,i,n,o,a){for(var r,s=t.tree.getNodeByDataIndex(e),l=t.tree.root,a=Bu(s,s.getModel(),a),h=s.parentNode===l?s:s.parentNode||s;null==(r=h.getLayout());)h=h.parentNode===l?h:h.parentNode||h;co(i,{position:[r.x+1,r.y+1]},o,function(){n.remove(i),t.setItemGraphicEl(e,null)}),i.fadeOut(null,{keepLabel:!0});var u=i.__edge;u&&co(u,{shape:Wu(a,r,r),style:{opacity:0}},o,function(){n.remove(u)})}function Wu(t,e,i){var n,o,a,r,s=t.orient;if("radial"===t.layout){var l=e.rawX,h=e.rawY,u=i.rawX,c=i.rawY,d=Du(l,h),f=Du(l,h+(c-h)*t.curvature),p=Du(u,c+(h-c)*t.curvature),g=Du(u,c);return{x1:d.x,y1:d.y,x2:g.x,y2:g.y,cpx1:f.x,cpy1:f.y,cpx2:p.x,cpy2:p.y}}var l=e.x,h=e.y,u=i.x,c=i.y;return"horizontal"===s&&(n=l+(u-l)*t.curvature,o=h,a=u+(l-u)*t.curvature,r=c),"vertical"===s&&(n=l,o=h+(c-h)*t.curvature,a=u,r=c+(h-c)*t.curvature),{x1:l,y1:h,x2:u,y2:c,cpx1:n,cpy1:o,cpx2:a,cpy2:r}}function Fu(t,e,i){for(var n,o=[t],a=[];n=o.pop();)if(a.push(n),n.isExpand){var r=n.children;if(r.length)for(var s=0;s<r.length;s++)o.push(r[s])}for(;n=a.pop();)e(n,i)}function Hu(t,e){for(var i,n=[t];i=n.pop();)if(e(i),i.isExpand){var o=i.children;if(o.length)for(var a=o.length-1;a>=0;a--)n.push(o[a])}}function Zu(t,e,i){if(t&&l(e,t.type)>=0){var n=i.getData().tree.root,o=t.targetNode;if(o&&n.contains(o))return{node:o};var a=t.targetNodeId;if(null!=a&&(o=n.getNodeById(a)))return{node:o}}}function Uu(t){for(var e=[];t;)(t=t.parentNode)&&e.push(t);return e.reverse()}function ju(t,e){return l(Uu(t),e)>=0}function Xu(t,e){for(var i=[];t;){var n=t.dataIndex;i.push({name:t.name,dataIndex:n,value:e.getRawValue(n)}),t=t.parentNode}return i.reverse(),i}function Yu(t){var e=0;d(t.children,function(t){Yu(t);var i=t.value;y(i)&&(i=i[0]),e+=i});var i=t.value;y(i)&&(i=i[0]),(null==i||isNaN(i))&&(i=e),i<0&&(i=0),y(t.value)?t.value[0]=i:t.value=i}function qu(t,e){var i=e.get("color");if(i){var n;return d(t=t||[],function(t){var e=new _o(t),i=e.get("color");(e.get("itemStyle.color")||i&&"none"!==i)&&(n=!0)}),n||((t[0]||(t[0]={})).color=i.slice()),t}}function $u(t){this.group=new S_,t.add(this.group)}function Ku(t,e,i,n,o,a){var r=[[o?t:t-VA,e],[t+i,e],[t+i,e+n],[o?t:t-VA,e+n]];return!a&&r.splice(2,0,[t+i+VA,e+n/2]),!o&&r.push([t,e+n/2]),r}function Ju(t,e,i){t.eventData={componentType:"series",componentSubType:"treemap",seriesIndex:e.componentIndex,seriesName:e.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:i&&i.dataIndex,name:i&&i.name},treePathInfo:i&&Xu(i,e)}}function Qu(){var t,e=[],i={};return{add:function(t,n,o,a,r){return _(a)&&(r=a,a=0),!i[t.id]&&(i[t.id]=1,e.push({el:t,target:n,time:o,delay:a,easing:r}),!0)},done:function(e){return t=e,this},start:function(){for(var n=e.length,o=0,a=e.length;o<a;o++){var r=e[o];r.el.animateTo(r.target,r.time,r.delay,r.easing,function(){--n||(e.length=0,i={},t&&t())})}return this}}}function tc(t,e,n,o,r,s,l,h,u,c){function d(t,e){w?!t.invisible&&s.push(t):(e(),t.__tmWillVisible||(t.invisible=!1))}function f(e,n,o,a,r,s){var h=l.getModel(),u=T(t.getFormattedLabel(l.dataIndex,"normal",null,null,s?"upperLabel":"label"),h.get("name"));if(!s&&v.isLeafRoot){var c=t.get("drillDownIcon",!0);u=c?c+" "+u:u}var d=h.getModel(s?jA:ZA),f=h.getModel(s?XA:UA),p=d.getShallow("show");eo(e,n,d,f,{defaultText:p?u:null,autoColor:o,isRectText:!0}),s&&(e.textRect=i(s)),e.truncate=p&&d.get("ellipsis")?{outerWidth:a,outerHeight:r,minChar:2}:null}function p(t,i,o,a){var s=null!=S&&n[t][S],l=r[t];return s?(n[t][S]=null,g(l,s,t)):w||((s=new i({z:ec(o,a)})).__tmDepth=o,s.__tmStorageName=t,m(l,s,t)),e[t][b]=s}function g(t,e,i){(t[b]={}).old="nodeGroup"===i?e.position.slice():a({},e.shape)}function m(t,e,i){var n=t[b]={},a=l.parentNode;if(a&&(!o||"drillDown"===o.direction)){var s=0,h=0,u=r.background[a.getRawIndex()];!o&&u&&u.old&&(s=u.old.width,h=u.old.height),n.old="nodeGroup"===i?[0,h]:{x:s,y:h,width:0,height:0}}n.fadein="nodeGroup"!==i}if(l){var v=l.getLayout();if(v&&v.isInView){var y=v.width,x=v.height,_=v.borderWidth,w=v.invisible,b=l.getRawIndex(),S=h&&h.getRawIndex(),M=l.viewChildren,I=v.upperHeight,A=M&&M.length,D=l.getModel("itemStyle"),C=l.getModel("emphasis.itemStyle"),L=p("nodeGroup",WA);if(L){if(u.add(L),L.attr("position",[v.x||0,v.y||0]),L.__tmNodeWidth=y,L.__tmNodeHeight=x,v.isAboveViewRoot)return L;var k=p("background",FA,c,qA);if(k&&function(e,i,n){i.dataIndex=l.dataIndex,i.seriesIndex=t.seriesIndex,i.setShape({x:0,y:0,width:y,height:x});var o=l.getVisual("borderColor",!0),a=C.get("borderColor");d(i,function(){var t=JA(D);t.fill=o;var e=KA(C);if(e.fill=a,n){var r=y-2*_;f(t,e,o,r,I,{x:_,y:0,width:r,height:I})}else t.text=e.text=null;i.setStyle(t),to(i,e)}),e.add(i)}(L,k,A&&v.upperHeight),!A){var P=p("content",FA,c,$A);P&&function(e,i){i.dataIndex=l.dataIndex,i.seriesIndex=t.seriesIndex;var n=Math.max(y-2*_,0),o=Math.max(x-2*_,0);i.culling=!0,i.setShape({x:_,y:_,width:n,height:o});var a=l.getVisual("color",!0);d(i,function(){var t=JA(D);t.fill=a;var e=KA(C);f(t,e,a,n,o),i.setStyle(t),to(i,e)}),e.add(i)}(L,P)}return L}}}}function ec(t,e){var i=t*YA+e;return(i-1)/i}function ic(t){var e=t.pieceList;t.hasSpecialVisual=!1,d(e,function(e,i){e.originIndex=i,null!=e.visual&&(t.hasSpecialVisual=!0)})}function nc(t){var e=t.categories,i=t.visual,n=t.categoryMap={};if(eD(e,function(t,e){n[t]=e}),!y(i)){var o=[];w(i)?eD(i,function(t,e){var i=n[e];o[null!=i?i:nD]=t}):o[nD]=i,i=dc(t,o)}for(var a=e.length-1;a>=0;a--)null==i[a]&&(delete n[e[a]],e.pop())}function oc(t,e){var i=t.visual,n=[];w(i)?eD(i,function(t){n.push(t)}):null!=i&&n.push(i);var o={color:1,symbol:1};e||1!==n.length||o.hasOwnProperty(t.type)||(n[1]=n[0]),dc(t,n)}function ac(t){return{applyVisual:function(e,i,n){e=this.mapValueToVisual(e),n("color",t(i("color"),e))},_doMap:uc([0,1])}}function rc(t){var e=this.option.visual;return e[Math.round(Io(t,[0,1],[0,e.length-1],!0))]||{}}function sc(t){return function(e,i,n){n(t,this.mapValueToVisual(e))}}function lc(t){var e=this.option.visual;return e[this.option.loop&&t!==nD?t%e.length:t]}function hc(){return this.option.visual[0]}function uc(t){return{linear:function(e){return Io(e,t,this.option.visual,!0)},category:lc,piecewise:function(e,i){var n=cc.call(this,i);return null==n&&(n=Io(e,t,this.option.visual,!0)),n},fixed:hc}}function cc(t){var e=this.option,i=e.pieceList;if(e.hasSpecialVisual){var n=i[oD.findPieceIndex(t,i)];if(n&&n.visual)return n.visual[this.type]}}function dc(t,e){return t.visual=e,"color"===t.type&&(t.parsedVisual=f(e,function(t){return Dt(t)})),e}function fc(t,e,i){return t?e<=i:e<i}function pc(t,e,i,n,o,a){var r=t.getModel(),s=t.getLayout();if(s&&!s.invisible&&s.isInView){var l,h=t.getModel(lD),u=gc(h,e,i[t.depth],n),c=h.get("borderColor"),f=h.get("borderColorSaturation");null!=f&&(c=vc(f,l=mc(u))),t.setVisual("borderColor",c);var p=t.viewChildren;if(p&&p.length){var g=xc(t,r,s,h,u,p);d(p,function(t,e){(t.depth>=o.length||t===o[t.depth])&&pc(t,wc(r,u,t,e,g,a),i,n,o,a)})}else l=mc(u),t.setVisual("color",l)}}function gc(t,e,i,n){var o=a({},e);return d(["color","colorAlpha","colorSaturation"],function(a){var r=t.get(a,!0);null==r&&i&&(r=i[a]),null==r&&(r=e[a]),null==r&&(r=n.get(a)),null!=r&&(o[a]=r)}),o}function mc(t){var e=yc(t,"color");if(e){var i=yc(t,"colorAlpha"),n=yc(t,"colorSaturation");return n&&(e=Et(e,null,null,n)),i&&(e=zt(e,i)),e}}function vc(t,e){return null!=e?Et(e,null,null,t):null}function yc(t,e){var i=t[e];if(null!=i&&"none"!==i)return i}function xc(t,e,i,n,o,a){if(a&&a.length){var r=_c(e,"color")||null!=o.color&&"none"!==o.color&&(_c(e,"colorAlpha")||_c(e,"colorSaturation"));if(r){var s=e.get("visualMin"),l=e.get("visualMax"),h=i.dataExtent.slice();null!=s&&s<h[0]&&(h[0]=s),null!=l&&l>h[1]&&(h[1]=l);var u=e.get("colorMappingBy"),c={type:r.name,dataExtent:h,visual:r.range};"color"!==c.type||"index"!==u&&"id"!==u?c.mappingMethod="linear":(c.mappingMethod="category",c.loop=!0);var d=new oD(c);return d.__drColorMappingBy=u,d}}}function _c(t,e){var i=t.get(e);return sD(i)&&i.length?{name:e,range:i}:null}function wc(t,e,i,n,o,r){var s=a({},e);if(o){var l=o.type,h="color"===l&&o.__drColorMappingBy,u="index"===h?n:"id"===h?r.mapIdToIndex(i.getId()):i.getValue(t.get("visualDimension"));s[l]=o.mapValueToVisual(u)}return s}function bc(t,e,i,n){var o,a;if(!t.isRemoved()){var r=t.getLayout();o=r.width,a=r.height;var s=(f=t.getModel()).get(pD),l=f.get(gD)/2,h=Pc(f),u=Math.max(s,h),c=s-l,d=u-l,f=t.getModel();t.setLayout({borderWidth:s,upperHeight:u,upperLabelHeight:h},!0);var p=(o=uD(o-2*c,0))*(a=uD(a-c-d,0)),g=Sc(t,f,p,e,i,n);if(g.length){var m={x:c,y:d,width:o,height:a},v=cD(o,a),y=1/0,x=[];x.area=0;for(var _=0,w=g.length;_<w;){var b=g[_];x.push(b),x.area+=b.getLayout().area;var S=Ac(x,v,e.squareRatio);S<=y?(_++,y=S):(x.area-=x.pop().getLayout().area,Dc(x,v,m,l,!1),v=cD(m.width,m.height),x.length=x.area=0,y=1/0)}if(x.length&&Dc(x,v,m,l,!0),!i){var M=f.get("childrenVisibleMin");null!=M&&p<M&&(i=!0)}for(var _=0,w=g.length;_<w;_++)bc(g[_],e,i,n+1)}}}function Sc(t,e,i,n,o,a){var r=t.children||[],s=n.sort;"asc"!==s&&"desc"!==s&&(s=null);var l=null!=n.leafDepth&&n.leafDepth<=a;if(o&&!l)return t.viewChildren=[];Ic(r=g(r,function(t){return!t.isRemoved()}),s);var h=Tc(e,r,s);if(0===h.sum)return t.viewChildren=[];if(h.sum=Mc(e,i,h.sum,s,r),0===h.sum)return t.viewChildren=[];for(var u=0,c=r.length;u<c;u++){var d=r[u].getValue()/h.sum*i;r[u].setLayout({area:d})}return l&&(r.length&&t.setLayout({isLeafRoot:!0},!0),r.length=0),t.viewChildren=r,t.setLayout({dataExtent:h.dataExtent},!0),r}function Mc(t,e,i,n,o){if(!n)return i;for(var a=t.get("visibleMin"),r=o.length,s=r,l=r-1;l>=0;l--){var h=o["asc"===n?r-l-1:l].getValue();h/i*e<a&&(s=l,i-=h)}return"asc"===n?o.splice(0,r-s):o.splice(s,r-s),i}function Ic(t,e){return e&&t.sort(function(t,i){var n="asc"===e?t.getValue()-i.getValue():i.getValue()-t.getValue();return 0===n?"asc"===e?t.dataIndex-i.dataIndex:i.dataIndex-t.dataIndex:n}),t}function Tc(t,e,i){for(var n=0,o=0,a=e.length;o<a;o++)n+=e[o].getValue();var r=t.get("visualDimension");if(e&&e.length)if("value"===r&&i)s=[e[e.length-1].getValue(),e[0].getValue()],"asc"===i&&s.reverse();else{var s=[1/0,-1/0];fD(e,function(t){var e=t.getValue(r);e<s[0]&&(s[0]=e),e>s[1]&&(s[1]=e)})}else s=[NaN,NaN];return{sum:n,dataExtent:s}}function Ac(t,e,i){for(var n,o=0,a=1/0,r=0,s=t.length;r<s;r++)(n=t[r].getLayout().area)&&(n<a&&(a=n),n>o&&(o=n));var l=t.area*t.area,h=e*e*i;return l?uD(h*o/l,l/(h*a)):1/0}function Dc(t,e,i,n,o){var a=e===i.width?0:1,r=1-a,s=["x","y"],l=["width","height"],h=i[s[a]],u=e?t.area/e:0;(o||u>i[l[r]])&&(u=i[l[r]]);for(var c=0,d=t.length;c<d;c++){var f=t[c],p={},g=u?f.getLayout().area/u:0,m=p[l[r]]=uD(u-2*n,0),v=i[s[a]]+i[l[a]]-h,y=c===d-1||v<g?v:g,x=p[l[a]]=uD(y-2*n,0);p[s[r]]=i[s[r]]+cD(n,m/2),p[s[a]]=h+cD(n,x/2),h+=y,f.setLayout(p,!0)}i[s[r]]+=u,i[l[r]]-=u}function Cc(t,e,i,n,o){var a=(e||{}).node,r=[n,o];if(!a||a===i)return r;for(var s,l=n*o,h=l*t.option.zoomToNodeRatio;s=a.parentNode;){for(var u=0,c=s.children,d=0,f=c.length;d<f;d++)u+=c[d].getValue();var p=a.getValue();if(0===p)return r;h*=u/p;var g=s.getModel(),m=g.get(pD);(h+=4*m*m+(3*m+Math.max(m,Pc(g)))*Math.pow(h,.5))>hS&&(h=hS),a=s}h<l&&(h=l);var v=Math.pow(h/l,.5);return[n*v,o*v]}function Lc(t,e,i){if(e)return{x:e.x,y:e.y};var n={x:0,y:0};if(!i)return n;var o=i.node,a=o.getLayout();if(!a)return n;for(var r=[a.width/2,a.height/2],s=o;s;){var l=s.getLayout();r[0]+=l.x,r[1]+=l.y,s=s.parentNode}return{x:t.width/2-r[0],y:t.height/2-r[1]}}function kc(t,e,i,n,o){var a=t.getLayout(),r=i[o],s=r&&r===t;if(!(r&&!s||o===i.length&&t!==n)){t.setLayout({isInView:!0,invisible:!s&&!e.intersect(a),isAboveViewRoot:s},!0);var l=new Kt(e.x-a.x,e.y-a.y,e.width,e.height);fD(t.viewChildren||[],function(t){kc(t,l,i,n,o+1)})}}function Pc(t){return t.get(mD)?t.get(vD):0}function Oc(t){return"_EC_"+t}function Nc(t,e){this.id=null==t?"":t,this.inEdges=[],this.outEdges=[],this.edges=[],this.hostGraph,this.dataIndex=null==e?-1:e}function Ec(t,e,i){this.node1=t,this.node2=e,this.dataIndex=null==i?-1:i}function zc(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}function Rc(t){return"_"+t+"Type"}function Bc(t,e,i){var n=e.getItemVisual(i,"color"),o=e.getItemVisual(i,t),a=e.getItemVisual(i,t+"Size");if(o&&"none"!==o){y(a)||(a=[a,a]);var r=dl(o,-a[0]/2,-a[1]/2,a[0],a[1],n);return r.name=t,r}}function Vc(t){var e=new TD({name:"line"});return Gc(e.shape,t),e}function Gc(t,e){var i=e[0],n=e[1],o=e[2];t.x1=i[0],t.y1=i[1],t.x2=n[0],t.y2=n[1],t.percent=1,o?(t.cpx1=o[0],t.cpy1=o[1]):(t.cpx1=NaN,t.cpy1=NaN)}function Wc(t,e,i){S_.call(this),this._createLine(t,e,i)}function Fc(t){this._ctor=t||Wc,this.group=new S_}function Hc(t,e,i,n){if(Xc(e.getItemLayout(i))){var o=new t._ctor(e,i,n);e.setItemGraphicEl(i,o),t.group.add(o)}}function Zc(t,e,i,n,o,a){var r=e.getItemGraphicEl(n);Xc(i.getItemLayout(o))?(r?r.updateData(i,o,a):r=new t._ctor(i,o,a),i.setItemGraphicEl(o,r),t.group.add(r)):t.group.remove(r)}function Uc(t){var e=t.hostModel;return{lineStyle:e.getModel("lineStyle").getLineStyle(),hoverLineStyle:e.getModel("emphasis.lineStyle").getLineStyle(),labelModel:e.getModel("label"),hoverLabelModel:e.getModel("emphasis.label")}}function jc(t){return isNaN(t[0])||isNaN(t[1])}function Xc(t){return!jc(t[0])&&!jc(t[1])}function Yc(t,e,i){for(var n,o=t[0],a=t[1],r=t[2],s=1/0,l=i*i,h=.1,u=.1;u<=.9;u+=.1)LD[0]=OD(o[0],a[0],r[0],u),LD[1]=OD(o[1],a[1],r[1],u),(f=ED(ND(LD,e)-l))<s&&(s=f,n=u);for(var c=0;c<32;c++){var d=n+h;kD[0]=OD(o[0],a[0],r[0],n),kD[1]=OD(o[1],a[1],r[1],n),PD[0]=OD(o[0],a[0],r[0],d),PD[1]=OD(o[1],a[1],r[1],d);var f=ND(kD,e)-l;if(ED(f)<.01)break;var p=ND(PD,e)-l;h/=2,f<0?p>=0?n+=h:n-=h:p>=0?n-=h:n+=h}return n}function qc(t,e){return t.getVisual("opacity")||t.getModel().get(e)}function $c(t,e,i){var n=t.getGraphicEl(),o=qc(t,e);null!=i&&(null==o&&(o=1),o*=i),n.downplay&&n.downplay(),n.traverse(function(t){"group"!==t.type&&t.setStyle("opacity",o)})}function Kc(t,e){var i=qc(t,e),n=t.getGraphicEl();n.highlight&&n.highlight(),n.traverse(function(t){"group"!==t.type&&t.setStyle("opacity",i)})}function Jc(t){return t instanceof Array||(t=[t,t]),t}function Qc(t){var e=t.coordinateSystem;if(!e||"view"===e.type){var i=t.getGraph();i.eachNode(function(t){var e=t.getModel();t.setLayout([+e.get("x"),+e.get("y")])}),td(i)}}function td(t){t.eachEdge(function(t){var e=t.getModel().get("lineStyle.curveness")||0,i=W(t.node1.getLayout()),n=W(t.node2.getLayout()),o=[i,n];+e&&o.push([(i[0]+n[0])/2-(i[1]-n[1])*e,(i[1]+n[1])/2-(n[0]-i[0])*e]),t.setLayout(o)})}function ed(t){var e=t.coordinateSystem;if(!e||"view"===e.type){var i=e.getBoundingRect(),n=t.getData(),o=n.graph,a=0,r=n.getSum("value"),s=2*Math.PI/(r||n.count()),l=i.width/2+i.x,h=i.height/2+i.y,u=Math.min(i.width,i.height)/2;o.eachNode(function(t){var e=t.getValue("value");a+=s*(r?e:1)/2,t.setLayout([u*Math.cos(a)+l,u*Math.sin(a)+h]),a+=s*(r?e:1)/2}),n.setLayout({cx:l,cy:h}),o.eachEdge(function(t){var e,i=t.getModel().get("lineStyle.curveness")||0,n=W(t.node1.getLayout()),o=W(t.node2.getLayout()),a=(n[0]+o[0])/2,r=(n[1]+o[1])/2;+i&&(e=[l*(i*=3)+a*(1-i),h*i+r*(1-i)]),t.setLayout([n,o,e])})}}function id(t,e,i){for(var n=i.rect,o=n.width,a=n.height,r=[n.x+o/2,n.y+a/2],s=null==i.gravity?.1:i.gravity,l=0;l<t.length;l++){var h=t[l];h.p||(h.p=V(o*(Math.random()-.5)+r[0],a*(Math.random()-.5)+r[1])),h.pp=W(h.p),h.edges=null}var u=.6;return{warmUp:function(){u=.5},setFixed:function(e){t[e].fixed=!0},setUnfixed:function(e){t[e].fixed=!1},step:function(i){for(var n=[],o=t.length,a=0;a<e.length;a++){var l=e[a],h=l.n1;U(n,(p=l.n2).p,h.p);var c=j(n)-l.d,d=p.w/(h.w+p.w);isNaN(d)&&(d=0),q(n,n),!h.fixed&&VD(h.p,h.p,n,d*c*u),!p.fixed&&VD(p.p,p.p,n,-(1-d)*c*u)}for(a=0;a<o;a++)(v=t[a]).fixed||(U(n,r,v.p),VD(v.p,v.p,n,s*u));for(a=0;a<o;a++)for(var h=t[a],f=a+1;f<o;f++){var p=t[f];U(n,p.p,h.p),0===(c=j(n))&&(F(n,Math.random()-.5,Math.random()-.5),c=1);var g=(h.rep+p.rep)/c/c;!h.fixed&&VD(h.pp,h.pp,n,g),!p.fixed&&VD(p.pp,p.pp,n,-g)}for(var m=[],a=0;a<o;a++){var v=t[a];v.fixed||(U(m,v.p,v.pp),VD(v.p,v.p,m,u),G(v.pp,v.p))}u*=.992,i&&i(t,e,u<.01)}}}function nd(t,e,i){var n=t.getBoxLayoutParams();return n.aspect=i,Ko(n,{width:e.getWidth(),height:e.getHeight()})}function od(t,e){var i=t.get("center"),n=e.getWidth(),o=e.getHeight(),a=Math.min(n,o);return{cx:To(i[0],e.getWidth()),cy:To(i[1],e.getHeight()),r:To(t.get("radius"),a/2)}}function ad(t,e){return e&&("string"==typeof e?t=e.replace("{value}",null!=t?t:""):"function"==typeof e&&(t=e(t))),t}function rd(t,e){function i(){a.ignore=a.hoverIgnore,r.ignore=r.hoverIgnore}function n(){a.ignore=a.normalIgnore,r.ignore=r.normalIgnore}S_.call(this);var o=new Rb,a=new Bb,r=new Cb;this.add(o),this.add(a),this.add(r),this.updateData(t,e,!0),this.on("emphasis",i).on("normal",n).on("mouseover",i).on("mouseout",n)}function sd(t,e){return Ko(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function ld(t,e){for(var i=t.mapDimension("value"),n=t.mapArray(i,function(t){return t}),o=[],a="ascending"===e,r=0,s=t.count();r<s;r++)o[r]=r;return"function"==typeof e?o.sort(e):"none"!==e&&o.sort(function(t,e){return a?n[t]-n[e]:n[e]-n[t]}),o}function hd(t){t.each(function(e){var i,n,o,a,r=t.getItemModel(e),s=r.getModel("label").get("position"),l=r.getModel("labelLine"),h=t.getItemLayout(e),u=h.points,c="inner"===s||"inside"===s||"center"===s;if(c)i="center",a=[[n=(u[0][0]+u[1][0]+u[2][0]+u[3][0])/4,o=(u[0][1]+u[1][1]+u[2][1]+u[3][1])/4],[n,o]];else{var d,f,p,g=l.get("length");"left"===s?(d=(u[3][0]+u[0][0])/2,f=(u[3][1]+u[0][1])/2,n=(p=d-g)-5,i="right"):(d=(u[1][0]+u[2][0])/2,f=(u[1][1]+u[2][1])/2,n=(p=d+g)+5,i="left");var m=f;a=[[d,f],[p,m]],o=m}h.label={linePoints:a,x:n,y:o,verticalAlign:"middle",textAlign:i,inside:c}})}function ud(t){if(!t.parallel){var e=!1;d(t.series,function(t){t&&"parallel"===t.type&&(e=!0)}),e&&(t.parallel=[{}])}}function cd(t){d(Si(t.parallelAxis),function(e){if(w(e)){var i=e.parallelIndex||0,o=Si(t.parallel)[i];o&&o.parallelAxisDefault&&n(e,o.parallelAxisDefault,!1)}})}function dd(t,e){var i=t[e]-t[1-e];return{span:Math.abs(i),sign:i>0?-1:i<0?1:e?-1:1}}function fd(t,e){return Math.min(e[1],Math.max(e[0],t))}function pd(t,e,i){this._axesMap=z(),this._axesLayout={},this.dimensions=t.dimensions,this._rect,this._model=t,this._init(t,e,i)}function gd(t,e){return YD(qD(t,e[0]),e[1])}function md(t,e){var i=e.layoutLength/(e.axisCount-1);return{position:i*t,axisNameAvailableWidth:i,axisLabelShow:!0}}function vd(t,e){var i,n,o=e.layoutLength,a=e.axisExpandWidth,r=e.axisCount,s=e.axisCollapseWidth,l=e.winInnerIndices,h=s,u=!1;return t<l[0]?(i=t*s,n=s):t<=l[1]?(i=e.axisExpandWindow0Pos+t*a-e.axisExpandWindow[0],h=a,u=!0):(i=o-(r-1-t)*s,n=s),{position:i,axisNameAvailableWidth:h,axisLabelShow:u,nameTruncateMaxWidth:n}}function yd(t){Hx.call(this),this._zr=t,this.group=new S_,this._brushType,this._brushOption,this._panels,this._track=[],this._dragging,this._covers=[],this._creatingCover,this._creatingPanel,this._enableGlobalPan,this._uid="brushController_"+gC++,this._handlers={},nC(mC,function(t,e){this._handlers[e]=m(t,this)},this)}function xd(t,e){var o=t._zr;t._enableGlobalPan||Gh(o,cC,t._uid),nC(t._handlers,function(t,e){o.on(e,t)}),t._brushType=e.brushType,t._brushOption=n(i(pC),e,!0)}function _d(t){var e=t._zr;Wh(e,cC,t._uid),nC(t._handlers,function(t,i){e.off(i,t)}),t._brushType=t._brushOption=null}function wd(t,e){var i=vC[e.brushType].createCover(t,e);return i.__brushOption=e,Md(i,e),t.group.add(i),i}function bd(t,e){var i=Td(e);return i.endCreating&&(i.endCreating(t,e),Md(e,e.__brushOption)),e}function Sd(t,e){var i=e.__brushOption;Td(e).updateCoverShape(t,e,i.range,i)}function Md(t,e){var i=e.z;null==i&&(i=lC),t.traverse(function(t){t.z=i,t.z2=i})}function Id(t,e){Td(e).updateCommon(t,e),Sd(t,e)}function Td(t){return vC[t.__brushOption.brushType]}function Ad(t,e,i){var n=t._panels;if(!n)return!0;var o,a=t._transform;return nC(n,function(t){t.isTargetByCursor(e,i,a)&&(o=t)}),o}function Dd(t,e){var i=t._panels;if(!i)return!0;var n=e.__brushOption.panelId;return null==n||i[n]}function Cd(t){var e=t._covers,i=e.length;return nC(e,function(e){t.group.remove(e)},t),e.length=0,!!i}function Ld(t,e){var n=oC(t._covers,function(t){var e=t.__brushOption,n=i(e.range);return{brushType:e.brushType,panelId:e.panelId,range:n}});t.trigger("brush",n,{isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function kd(t){var e=t._track;if(!e.length)return!1;var i=e[e.length-1],n=e[0],o=i[0]-n[0],a=i[1]-n[1];return sC(o*o+a*a,.5)>hC}function Pd(t){var e=t.length-1;return e<0&&(e=0),[t[0],t[e]]}function Od(t,e,i,n){var o=new S_;return o.add(new Vb({name:"main",style:Rd(i),silent:!0,draggable:!0,cursor:"move",drift:iC(t,e,o,"nswe"),ondragend:iC(Ld,e,{isEnd:!0})})),nC(n,function(i){o.add(new Vb({name:i,style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:iC(t,e,o,i),ondragend:iC(Ld,e,{isEnd:!0})}))}),o}function Nd(t,e,i,n){var o=n.brushStyle.lineWidth||0,a=rC(o,uC),r=i[0][0],s=i[1][0],l=r-o/2,h=s-o/2,u=i[0][1],c=i[1][1],d=u-a+o/2,f=c-a+o/2,p=u-r,g=c-s,m=p+o,v=g+o;zd(t,e,"main",r,s,p,g),n.transformable&&(zd(t,e,"w",l,h,a,v),zd(t,e,"e",d,h,a,v),zd(t,e,"n",l,h,m,a),zd(t,e,"s",l,f,m,a),zd(t,e,"nw",l,h,a,a),zd(t,e,"ne",d,h,a,a),zd(t,e,"sw",l,f,a,a),zd(t,e,"se",d,f,a,a))}function Ed(t,e){var i=e.__brushOption,n=i.transformable,o=e.childAt(0);o.useStyle(Rd(i)),o.attr({silent:!n,cursor:n?"move":"default"}),nC(["w","e","n","s","se","sw","ne","nw"],function(i){var o=e.childOfName(i),a=Gd(t,i);o&&o.attr({silent:!n,invisible:!n,cursor:n?fC[a]+"-resize":null})})}function zd(t,e,i,n,o,a,r){var s=e.childOfName(i);s&&s.setShape(Ud(Zd(t,e,[[n,o],[n+a,o+r]])))}function Rd(t){return r({strokeNoScale:!0},t.brushStyle)}function Bd(t,e,i,n){var o=[aC(t,i),aC(e,n)],a=[rC(t,i),rC(e,n)];return[[o[0],a[0]],[o[1],a[1]]]}function Vd(t){return po(t.group)}function Gd(t,e){if(e.length>1)return("e"===(n=[Gd(t,(e=e.split(""))[0]),Gd(t,e[1])])[0]||"w"===n[0])&&n.reverse(),n.join("");var i={left:"w",right:"e",top:"n",bottom:"s"},n=mo({w:"left",e:"right",n:"top",s:"bottom"}[e],Vd(t));return i[n]}function Wd(t,e,i,n,o,a,r,s){var l=n.__brushOption,h=t(l.range),u=Hd(i,a,r);nC(o.split(""),function(t){var e=dC[t];h[e[0]][e[1]]+=u[e[0]]}),l.range=e(Bd(h[0][0],h[1][0],h[0][1],h[1][1])),Id(i,n),Ld(i,{isEnd:!1})}function Fd(t,e,i,n,o){var a=e.__brushOption.range,r=Hd(t,i,n);nC(a,function(t){t[0]+=r[0],t[1]+=r[1]}),Id(t,e),Ld(t,{isEnd:!1})}function Hd(t,e,i){var n=t.group,o=n.transformCoordToLocal(e,i),a=n.transformCoordToLocal(0,0);return[o[0]-a[0],o[1]-a[1]]}function Zd(t,e,n){var o=Dd(t,e);return o&&!0!==o?o.clipPath(n,t._transform):i(n)}function Ud(t){var e=aC(t[0][0],t[1][0]),i=aC(t[0][1],t[1][1]);return{x:e,y:i,width:rC(t[0][0],t[1][0])-e,height:rC(t[0][1],t[1][1])-i}}function jd(t,e,i){if(t._brushType){var n=t._zr,o=t._covers,a=Ad(t,e,i);if(!t._dragging)for(var r=0;r<o.length;r++){var s=o[r].__brushOption;if(a&&(!0===a||s.panelId===a.panelId)&&vC[s.brushType].contain(o[r],i[0],i[1]))return}a&&n.setCursorStyle("crosshair")}}function Xd(t){var e=t.event;e.preventDefault&&e.preventDefault()}function Yd(t,e,i){return t.childOfName("main").contain(e,i)}function qd(t,e,n,o){var a,r=t._creatingCover,s=t._creatingPanel,l=t._brushOption;if(t._track.push(n.slice()),kd(t)||r){if(s&&!r){"single"===l.brushMode&&Cd(t);var h=i(l);h.brushType=$d(h.brushType,s),h.panelId=!0===s?null:s.panelId,r=t._creatingCover=wd(t,h),t._covers.push(r)}if(r){var u=vC[$d(t._brushType,s)];r.__brushOption.range=u.getCreatingRange(Zd(t,r,t._track)),o&&(bd(t,r),u.updateCommon(t,r)),Sd(t,r),a={isEnd:o}}}else o&&"single"===l.brushMode&&l.removeOnClick&&Ad(t,e,n)&&Cd(t)&&(a={isEnd:o,removeOnClick:!0});return a}function $d(t,e){return"auto"===t?e.defaultBrushType:t}function Kd(t){if(this._dragging){Xd(t);var e=qd(this,t,this.group.transformCoordToLocal(t.offsetX,t.offsetY),!0);this._dragging=!1,this._track=[],this._creatingCover=null,e&&Ld(this,e)}}function Jd(t){return{createCover:function(e,i){return Od(iC(Wd,function(e){var i=[e,[0,100]];return t&&i.reverse(),i},function(e){return e[t]}),e,i,[["w","e"],["n","s"]][t])},getCreatingRange:function(e){var i=Pd(e);return[aC(i[0][t],i[1][t]),rC(i[0][t],i[1][t])]},updateCoverShape:function(e,i,n,o){var a,r=Dd(e,i);if(!0!==r&&r.getLinearBrushOtherExtent)a=r.getLinearBrushOtherExtent(t,e._transform);else{var s=e._zr;a=[0,[s.getWidth(),s.getHeight()][1-t]]}var l=[n,a];t&&l.reverse(),Nd(e,i,l,o)},updateCommon:Ed,contain:Yd}}function Qd(t){return t=nf(t),function(e,i){return yo(e,t)}}function tf(t,e){return t=nf(t),function(i){var n=null!=e?e:i,o=n?t.width:t.height,a=n?t.x:t.y;return[a,a+(o||0)]}}function ef(t,e,i){return t=nf(t),function(n,o,a){return t.contain(o[0],o[1])&&!tu(n,e,i)}}function nf(t){return Kt.create(t)}function of(t,e,i){return i&&"axisAreaSelect"===i.type&&e.findComponents({mainType:"parallelAxis",query:i})[0]===t}function af(t){var e=t.axis;return f(t.activeIntervals,function(t){return{brushType:"lineX",panelId:"pl",range:[e.dataToCoord(t[0],!0),e.dataToCoord(t[1],!0)]}})}function rf(t,e){return e.getComponent("parallel",t.get("parallelIndex"))}function sf(t,e){var i=t._model;return i.get("axisExpandable")&&i.get("axisExpandTriggerOn")===e}function lf(t,e){if(!t.encodeDefine){var i=e.ecModel.getComponent("parallel",e.get("parallelIndex"));if(i){var n=t.encodeDefine=z();d(i.dimensions,function(t){var e=hf(t);n.set(t,e)})}}}function hf(t){return+t.replace("dim","")}function uf(t,e,i){var n=t.model,o=t.getRect(),a=new Vb({shape:{x:o.x,y:o.y,width:o.width,height:o.height}}),r="horizontal"===n.get("layout")?"width":"height";return a.setShape(r,0),fo(a,{shape:{width:o.width,height:o.height}},e,i),a}function cf(t,e,i,n){for(var o=[],a=0;a<i.length;a++){var r=i[a],s=t.get(t.mapDimension(r),e);pf(s,n.getAxis(r).type)||o.push(n.dataToPoint(s,r))}return o}function df(t,e,i,n,o){var a=cf(t,i,n,o),r=new Bb({shape:{points:a},silent:!0,z2:10});e.add(r),t.setItemGraphicEl(i,r)}function ff(t,e){var i=t.hostModel.getModel("lineStyle"),n=i.getLineStyle();t.eachItemGraphicEl(function(o,r){if(t.hasItemOption){var s=t.getItemModel(r).getModel("lineStyle",i);n=s.getLineStyle(["color","stroke"])}o.useStyle(a(n,{fill:null,stroke:t.getItemVisual(r,"color"),opacity:t.getItemVisual(r,"opacity")})),o.shape.smooth=e})}function pf(t,e){return"category"===e?null==t:null==t||isNaN(t)}function gf(t,e,i){var n=new Vb({shape:{x:t.x-10,y:t.y-10,width:0,height:t.height+20}});return fo(n,{shape:{width:t.width+20,height:t.height+20}},e,i),n}function mf(){function t(e,n){if(n>=i.length)return e;for(var o=-1,a=e.length,r=i[n++],s={},l={};++o<a;){var h=r(e[o]),u=l[h];u?u.push(e[o]):l[h]=[e[o]]}return d(l,function(e,i){s[i]=t(e,n)}),s}function e(t,o){if(o>=i.length)return t;var a=[],r=n[o++];return d(t,function(t,i){a.push({key:i,values:e(t,o)})}),r?a.sort(function(t,e){return r(t.key,e.key)}):a}var i=[],n=[];return{key:function(t){return i.push(t),this},sortKeys:function(t){return n[i.length-1]=t,this},entries:function(i){return e(t(i,0),0)}}}function vf(t,e){return Ko(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function yf(t,e,i,n,o,a,r){_f(t,i,o),Sf(t,e,a,n,r),Lf(t)}function xf(t){d(t,function(t){var e=Of(t.outEdges,Rf),i=Of(t.inEdges,Rf),n=Math.max(e,i);t.setLayout({value:n},!0)})}function _f(t,e,i){for(var n=t,o=null,a=0;n.length;){o=[];for(var r=0,s=n.length;r<s;r++){var l=n[r];l.setLayout({x:a},!0),l.setLayout({dx:e},!0);for(var h=0,u=l.outEdges.length;h<u;h++)o.push(l.outEdges[h].node2)}n=o,++a}wf(t,a),bf(t,(i-e)/(a-1))}function wf(t,e){d(t,function(t){t.outEdges.length||t.setLayout({x:e-1},!0)})}function bf(t,e){d(t,function(t){var i=t.getLayout().x*e;t.setLayout({x:i},!0)})}function Sf(t,e,i,n,o){var a=mf().key(function(t){return t.getLayout().x}).sortKeys(zf).entries(t).map(function(t){return t.values});Mf(t,a,e,i,n),If(a,n,i);for(var r=1;o>0;o--)Tf(a,r*=.99),If(a,n,i),Df(a,r),If(a,n,i)}function Mf(t,e,i,n,o){var a=[];d(e,function(t){var e=t.length,i=0;d(t,function(t){i+=t.getLayout().value});var r=(n-(e-1)*o)/i;a.push(r)}),a.sort(function(t,e){return t-e});var r=a[0];d(e,function(t){d(t,function(t,e){t.setLayout({y:e},!0);var i=t.getLayout().value*r;t.setLayout({dy:i},!0)})}),d(i,function(t){var e=+t.getValue()*r;t.setLayout({dy:e},!0)})}function If(t,e,i){d(t,function(t){var n,o,a,r=0,s=t.length;for(t.sort(Ef),a=0;a<s;a++){if(n=t[a],(o=r-n.getLayout().y)>0){l=n.getLayout().y+o;n.setLayout({y:l},!0)}r=n.getLayout().y+n.getLayout().dy+e}if((o=r-e-i)>0){var l=n.getLayout().y-o;for(n.setLayout({y:l},!0),r=n.getLayout().y,a=s-2;a>=0;--a)(o=(n=t[a]).getLayout().y+n.getLayout().dy+e-r)>0&&(l=n.getLayout().y-o,n.setLayout({y:l},!0)),r=n.getLayout().y}})}function Tf(t,e){d(t.slice().reverse(),function(t){d(t,function(t){if(t.outEdges.length){var i=Of(t.outEdges,Af)/Of(t.outEdges,Rf),n=t.getLayout().y+(i-Nf(t))*e;t.setLayout({y:n},!0)}})})}function Af(t){return Nf(t.node2)*t.getValue()}function Df(t,e){d(t,function(t){d(t,function(t){if(t.inEdges.length){var i=Of(t.inEdges,Cf)/Of(t.inEdges,Rf),n=t.getLayout().y+(i-Nf(t))*e;t.setLayout({y:n},!0)}})})}function Cf(t){return Nf(t.node1)*t.getValue()}function Lf(t){d(t,function(t){t.outEdges.sort(kf),t.inEdges.sort(Pf)}),d(t,function(t){var e=0,i=0;d(t.outEdges,function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy}),d(t.inEdges,function(t){t.setLayout({ty:i},!0),i+=t.getLayout().dy})})}function kf(t,e){return t.node2.getLayout().y-e.node2.getLayout().y}function Pf(t,e){return t.node1.getLayout().y-e.node1.getLayout().y}function Of(t,e){for(var i=0,n=t.length,o=-1;++o<n;){var a=+e.call(t,t[o],o);isNaN(a)||(i+=a)}return i}function Nf(t){return t.getLayout().y+t.getLayout().dy/2}function Ef(t,e){return t.getLayout().y-e.getLayout().y}function zf(t,e){return t<e?-1:t>e?1:t===e?0:NaN}function Rf(t){return t.getValue()}function Bf(t,e,i,n){S_.call(this),this.bodyIndex,this.whiskerIndex,this.styleUpdater=i,this._createContent(t,e,n),this.updateData(t,e,n),this._seriesModel}function Vf(t,e,i){return f(t,function(t){return t=t.slice(),t[e]=i.initBaseline,t})}function Gf(t){var e={};return d(t,function(t,i){e["ends"+i]=t}),e}function Wf(t){this.group=new S_,this.styleUpdater=t}function Ff(t,e,i){var n=e.getItemModel(i),o=n.getModel(CC),a=e.getItemVisual(i,"color"),r=o.getItemStyle(["borderColor"]),s=t.childAt(t.whiskerIndex);s.style.set(r),s.style.stroke=a,s.dirty();var l=t.childAt(t.bodyIndex);l.style.set(r),l.style.stroke=a,l.dirty(),to(t,n.getModel(LC).getItemStyle())}function Hf(t){var e=[],i=[];return t.eachSeriesByType("boxplot",function(t){var n=t.getBaseAxis(),o=l(i,n);o<0&&(o=i.length,i[o]=n,e[o]={axis:n,seriesModels:[]}),e[o].seriesModels.push(t)}),e}function Zf(t){var e,i,n=t.axis,o=t.seriesModels,a=o.length,r=t.boxWidthList=[],s=t.boxOffsetList=[],l=[];if("category"===n.type)i=n.getBandWidth();else{var h=0;PC(o,function(t){h=Math.max(h,t.getData().count())}),e=n.getExtent(),Math.abs(e[1]-e[0])}PC(o,function(t){var e=t.get("boxWidth");y(e)||(e=[e,e]),l.push([To(e[0],i)||0,To(e[1],i)||0])});var u=.8*i-2,c=u/a*.3,d=(u-c*(a-1))/a,f=d/2-u/2;PC(o,function(t,e){s.push(f),f+=c+d,r.push(Math.min(Math.max(d,l[e][0]),l[e][1]))})}function Uf(t,e,i){var n,o=t.coordinateSystem,a=t.getData(),r=i/2,s=t.get("layout"),l="horizontal"===s?0:1,h=1-l,u=["x","y"],c=[];d(a.dimensions,function(t){var e=a.getDimensionInfo(t).coordDim;e===u[h]?c.push(t):e===u[l]&&(n=t)}),null==n||c.length<5||a.each([n].concat(c),function(){function t(t){var i=[];i[l]=d,i[h]=t;var n;return isNaN(d)||isNaN(t)?n=[NaN,NaN]:(n=o.dataToPoint(i))[l]+=e,n}function i(t,e){var i=t.slice(),n=t.slice();i[l]+=r,n[l]-=r,e?y.push(i,n):y.push(n,i)}function n(t){var e=[t.slice(),t.slice()];e[0][l]-=r,e[1][l]+=r,v.push(e)}var u=arguments,d=u[0],f=u[c.length+1],p=t(u[3]),g=t(u[1]),m=t(u[5]),v=[[g,t(u[2])],[m,t(u[4])]];n(g),n(m),n(p);var y=[];i(v[0][1],0),i(v[1][1],1),a.setItemLayout(f,{chartLayout:s,initBaseline:p[h],median:p,bodyEnds:y,whiskerEnds:v})})}function jf(t,e,i){var n=e.getItemModel(i),o=n.getModel(OC),a=e.getItemVisual(i,"color"),r=e.getItemVisual(i,"borderColor")||a,s=o.getItemStyle(["color","color0","borderColor","borderColor0"]),l=t.childAt(t.whiskerIndex);l.useStyle(s),l.style.stroke=r;var h=t.childAt(t.bodyIndex);h.useStyle(s),h.style.fill=a,h.style.stroke=r,to(t,n.getModel(NC).getItemStyle())}function Xf(t,e){var i,n=t.getBaseAxis(),o="category"===n.type?n.getBandWidth():(i=n.getExtent(),Math.abs(i[1]-i[0])/e.count()),a=To(VC(t.get("barMaxWidth"),o),o),r=To(VC(t.get("barMinWidth"),1),o),s=t.get("barWidth");return null!=s?To(s,o):Math.max(Math.min(o/2,a),r)}function Yf(t){return y(t)||(t=[+t,+t]),t}function qf(t,e){t.eachChild(function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:"stroke"===e.brushType?e.color:null,fill:"fill"===e.brushType?e.color:null}})})}function $f(t,e){S_.call(this);var i=new bl(t,e),n=new S_;this.add(i),this.add(n),n.beforeUpdate=function(){this.attr(i.getScale())},this.updateData(t,e)}function Kf(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=f(e,function(t){var e={coords:[t[0].coord,t[1].coord]};return t[0].name&&(e.fromName=t[0].name),t[1].name&&(e.toName=t[1].name),o([e,t[0],t[1]])}))}function Jf(t,e,i){S_.call(this),this.add(this.createLine(t,e,i)),this._updateEffectSymbol(t,e)}function Qf(t,e,i){S_.call(this),this._createPolyline(t,e,i)}function tp(t,e,i){Jf.call(this,t,e,i),this._lastFrame=0,this._lastFramePercent=0}function ep(){this.group=new S_}function ip(t){return t instanceof Array||(t=[t,t]),t}function np(){var t=Px();this.canvas=t,this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={}}function op(t,e,i){var n=t[1]-t[0],o=(e=f(e,function(e){return{interval:[(e.interval[0]-t[0])/n,(e.interval[1]-t[0])/n]}})).length,a=0;return function(t){for(n=a;n<o;n++)if((r=e[n].interval)[0]<=t&&t<=r[1]){a=n;break}if(n===o)for(var n=a-1;n>=0;n--){var r=e[n].interval;if(r[0]<=t&&t<=r[1]){a=n;break}}return n>=0&&n<o&&i[n]}}function ap(t,e){var i=t[1]-t[0];return e=[(e[0]-t[0])/i,(e[1]-t[0])/i],function(t){return t>=e[0]&&t<=e[1]}}function rp(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}function sp(t,e,i,n){var o=t.getItemLayout(e),a=i.get("symbolRepeat"),r=i.get("symbolClip"),s=i.get("symbolPosition")||"start",l=(i.get("symbolRotate")||0)*Math.PI/180||0,h=i.get("symbolPatternSize")||2,u=i.isAnimationEnabled(),c={dataIndex:e,layout:o,itemModel:i,symbolType:t.getItemVisual(e,"symbol")||"circle",color:t.getItemVisual(e,"color"),symbolClip:r,symbolRepeat:a,symbolRepeatDirection:i.get("symbolRepeatDirection"),symbolPatternSize:h,rotation:l,animationModel:u?i:null,hoverAnimation:u&&i.get("hoverAnimation"),z2:i.getShallow("z",!0)||0};lp(i,a,o,n,c),up(t,e,o,a,r,c.boundingLength,c.pxSign,h,n,c),cp(i,c.symbolScale,l,n,c);var d=c.symbolSize,f=i.get("symbolOffset");return y(f)&&(f=[To(f[0],d[0]),To(f[1],d[1])]),dp(i,d,o,a,r,f,s,c.valueLineWidth,c.boundingLength,c.repeatCutLength,n,c),c}function lp(t,e,i,n,o){var a,r=n.valueDim,s=t.get("symbolBoundingData"),l=n.coordSys.getOtherAxis(n.coordSys.getBaseAxis()),h=l.toGlobalCoord(l.dataToCoord(0)),u=1-+(i[r.wh]<=0);if(y(s)){var c=[hp(l,s[0])-h,hp(l,s[1])-h];c[1]<c[0]&&c.reverse(),a=c[u]}else a=null!=s?hp(l,s)-h:e?n.coordSysExtent[r.index][u]-h:i[r.wh];o.boundingLength=a,e&&(o.repeatCutLength=i[r.wh]),o.pxSign=a>0?1:a<0?-1:0}function hp(t,e){return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e)))}function up(t,e,i,n,o,a,r,s,l,h){var u=l.valueDim,c=l.categoryDim,d=Math.abs(i[c.wh]),f=t.getItemVisual(e,"symbolSize");y(f)?f=f.slice():(null==f&&(f="100%"),f=[f,f]),f[c.index]=To(f[c.index],d),f[u.index]=To(f[u.index],n?d:Math.abs(a)),h.symbolSize=f,(h.symbolScale=[f[0]/s,f[1]/s])[u.index]*=(l.isHorizontal?-1:1)*r}function cp(t,e,i,n,o){var a=t.get(tL)||0;a&&(iL.attr({scale:e.slice(),rotation:i}),iL.updateTransform(),a/=iL.getLineScale(),a*=e[n.valueDim.index]),o.valueLineWidth=a}function dp(t,e,i,n,o,r,s,l,h,u,c,d){var f=c.categoryDim,p=c.valueDim,g=d.pxSign,m=Math.max(e[p.index]+l,0),v=m;if(n){var y=Math.abs(h),x=T(t.get("symbolMargin"),"15%")+"",_=!1;x.lastIndexOf("!")===x.length-1&&(_=!0,x=x.slice(0,x.length-1)),x=To(x,e[p.index]);var w=Math.max(m+2*x,0),b=_?0:2*x,S=Go(n),M=S?n:Cp((y+b)/w);w=m+2*(x=(y-M*m)/2/(_?M:M-1)),b=_?0:2*x,S||"fixed"===n||(M=u?Cp((Math.abs(u)+b)/w):0),v=M*w-b,d.repeatTimes=M,d.symbolMargin=x}var I=g*(v/2),A=d.pathPosition=[];A[f.index]=i[f.wh]/2,A[p.index]="start"===s?I:"end"===s?h-I:h/2,r&&(A[0]+=r[0],A[1]+=r[1]);var D=d.bundlePosition=[];D[f.index]=i[f.xy],D[p.index]=i[p.xy];var C=d.barRectShape=a({},i);C[p.wh]=g*Math.max(Math.abs(i[p.wh]),Math.abs(A[p.index]+I)),C[f.wh]=i[f.wh];var L=d.clipShape={};L[f.xy]=-i[f.xy],L[f.wh]=c.ecSize[f.wh],L[p.xy]=0,L[p.wh]=i[p.wh]}function fp(t){var e=t.symbolPatternSize,i=dl(t.symbolType,-e/2,-e/2,e,e,t.color);return i.attr({culling:!0}),"image"!==i.type&&i.setStyle({strokeNoScale:!0}),i}function pp(t,e,i,n){function o(t){var e=l.slice(),n=i.pxSign,o=t;return("start"===i.symbolRepeatDirection?n>0:n<0)&&(o=u-1-t),e[h.index]=d*(o-u/2+.5)+l[h.index],{position:e,scale:i.symbolScale.slice(),rotation:i.rotation}}var a=t.__pictorialBundle,r=i.symbolSize,s=i.valueLineWidth,l=i.pathPosition,h=e.valueDim,u=i.repeatTimes||0,c=0,d=r[e.valueDim.index]+s+2*i.symbolMargin;for(Tp(t,function(t){t.__pictorialAnimationIndex=c,t.__pictorialRepeatTimes=u,c<u?Ap(t,null,o(c),i,n):Ap(t,null,{scale:[0,0]},i,n,function(){a.remove(t)}),wp(t,i),c++});c<u;c++){var f=fp(i);f.__pictorialAnimationIndex=c,f.__pictorialRepeatTimes=u,a.add(f);var p=o(c);Ap(f,{position:p.position,scale:[0,0]},{scale:p.scale,rotation:p.rotation},i,n),f.on("mouseover",function(){Tp(t,function(t){t.trigger("emphasis")})}).on("mouseout",function(){Tp(t,function(t){t.trigger("normal")})}),wp(f,i)}}function gp(t,e,i,n){var o=t.__pictorialBundle,a=t.__pictorialMainPath;a?Ap(a,null,{position:i.pathPosition.slice(),scale:i.symbolScale.slice(),rotation:i.rotation},i,n):(a=t.__pictorialMainPath=fp(i),o.add(a),Ap(a,{position:i.pathPosition.slice(),scale:[0,0],rotation:i.rotation},{scale:i.symbolScale.slice()},i,n),a.on("mouseover",function(){this.trigger("emphasis")}).on("mouseout",function(){this.trigger("normal")})),wp(a,i)}function mp(t,e,i){var n=a({},e.barRectShape),o=t.__pictorialBarRect;o?Ap(o,null,{shape:n},e,i):(o=t.__pictorialBarRect=new Vb({z2:2,shape:n,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}}),t.add(o))}function vp(t,e,i,n){if(i.symbolClip){var o=t.__pictorialClipPath,r=a({},i.clipShape),s=e.valueDim,l=i.animationModel,h=i.dataIndex;if(o)co(o,{shape:r},l,h);else{r[s.wh]=0,o=new Vb({shape:r}),t.__pictorialBundle.setClipPath(o),t.__pictorialClipPath=o;var u={};u[s.wh]=i.clipShape[s.wh],tS[n?"updateProps":"initProps"](o,{shape:u},l,h)}}}function yp(t,e){var i=t.getItemModel(e);return i.getAnimationDelayParams=xp,i.isAnimationEnabled=_p,i}function xp(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function _p(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function wp(t,e){t.off("emphasis").off("normal");var i=e.symbolScale.slice();e.hoverAnimation&&t.on("emphasis",function(){this.animateTo({scale:[1.1*i[0],1.1*i[1]]},400,"elasticOut")}).on("normal",function(){this.animateTo({scale:i.slice()},400,"elasticOut")})}function bp(t,e,i,n){var o=new S_,a=new S_;return o.add(a),o.__pictorialBundle=a,a.attr("position",i.bundlePosition.slice()),i.symbolRepeat?pp(o,e,i):gp(o,e,i),mp(o,i,n),vp(o,e,i,n),o.__pictorialShapeStr=Ip(t,i),o.__pictorialSymbolMeta=i,o}function Sp(t,e,i){var n=i.animationModel,o=i.dataIndex;co(t.__pictorialBundle,{position:i.bundlePosition.slice()},n,o),i.symbolRepeat?pp(t,e,i,!0):gp(t,e,i,!0),mp(t,i,!0),vp(t,e,i,!0)}function Mp(t,e,i,n){var o=n.__pictorialBarRect;o&&(o.style.text=null);var a=[];Tp(n,function(t){a.push(t)}),n.__pictorialMainPath&&a.push(n.__pictorialMainPath),n.__pictorialClipPath&&(i=null),d(a,function(t){co(t,{scale:[0,0]},i,e,function(){n.parent&&n.parent.remove(n)})}),t.setItemGraphicEl(e,null)}function Ip(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function Tp(t,e,i){d(t.__pictorialBundle.children(),function(n){n!==t.__pictorialBarRect&&e.call(i,n)})}function Ap(t,e,i,n,o,a){e&&t.attr(e),n.symbolClip&&!o?i&&t.attr(i):i&&tS[o?"updateProps":"initProps"](t,i,n.animationModel,n.dataIndex,a)}function Dp(t,e,i){var n=i.color,o=i.dataIndex,a=i.itemModel,s=a.getModel("itemStyle").getItemStyle(["color"]),l=a.getModel("emphasis.itemStyle").getItemStyle(),h=a.getShallow("cursor");Tp(t,function(t){t.setColor(n),t.setStyle(r({fill:n,opacity:i.opacity},s)),to(t,l),h&&(t.cursor=h),t.z2=i.z2});var u={},c=e.valueDim.posDesc[+(i.boundingLength>0)],d=t.__pictorialBarRect;Mh(d.style,u,a,n,e.seriesModel,o,c),to(d,u)}function Cp(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}function Lp(t,e,i){this.dimension="single",this.dimensions=["single"],this._axis=null,this._rect,this._init(t,e,i),this.model=t}function kp(t,e){e=e||{};var i=t.coordinateSystem,n=t.axis,o={},a=n.position,r=n.orient,s=i.getRect(),l=[s.x,s.x+s.width,s.y,s.y+s.height],h={horizontal:{top:l[2],bottom:l[3]},vertical:{left:l[0],right:l[1]}};o.position=["vertical"===r?h.vertical[a]:l[0],"horizontal"===r?h.horizontal[a]:l[3]];var u={horizontal:0,vertical:1};o.rotation=Math.PI/2*u[r];var c={top:-1,bottom:1,right:1,left:-1};o.labelDirection=o.tickDirection=o.nameDirection=c[a],t.get("axisTick.inside")&&(o.tickDirection=-o.tickDirection),T(e.labelInside,t.get("axisLabel.inside"))&&(o.labelDirection=-o.labelDirection);var d=e.rotate;return null==d&&(d=t.get("axisLabel.rotate")),o.labelRotation="top"===a?-d:d,o.labelInterval=n.getLabelInterval(),o.z2=1,o}function Pp(t,e,i,n,o){var r=t.axis;if(!r.scale.isBlank()&&r.containData(e))if(t.involveSeries){var s=Op(e,t),l=s.payloadBatch,h=s.snapToValue;l[0]&&null==o.seriesIndex&&a(o,l[0]),!n&&t.snap&&r.containData(h)&&null!=h&&(e=h),i.showPointer(t,e,l,o),i.showTooltip(t,s,h)}else i.showPointer(t,e)}function Op(t,e){var i=e.axis,n=i.dim,o=t,a=[],r=Number.MAX_VALUE,s=-1;return cL(e.seriesModels,function(e,l){var h,u,c=e.getData().mapDimension(n,!0);if(e.getAxisTooltipData){var d=e.getAxisTooltipData(c,t,i);u=d.dataIndices,h=d.nestestValue}else{if(!(u=e.getData().indicesOfNearest(c[0],t,!1,"category"===i.type?.5:null)).length)return;h=e.getData().get(c[0],u[0])}if(null!=h&&isFinite(h)){var f=t-h,p=Math.abs(f);p<=r&&((p<r||f>=0&&s<0)&&(r=p,s=f,o=h,a.length=0),cL(u,function(t){a.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})}))}}),{payloadBatch:a,snapToValue:o}}function Np(t,e,i,n){t[e.key]={value:i,payloadBatch:n}}function Ep(t,e,i,n){var o=i.payloadBatch,a=e.axis,r=a.model,s=e.axisPointerModel;if(e.triggerTooltip&&o.length){var l=e.coordSys.model,h=_h(l),u=t.map[h];u||(u=t.map[h]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(u)),u.dataByAxis.push({axisDim:a.dim,axisIndex:r.componentIndex,axisType:r.type,axisId:r.id,value:n,valueLabelOpt:{precision:s.get("label.precision"),formatter:s.get("label.formatter")},seriesDataIndices:o.slice()})}}function zp(t,e,i){var n=i.axesInfo=[];cL(e,function(e,i){var o=e.axisPointerModel.option,a=t[i];a?(!e.useHandle&&(o.status="show"),o.value=a.value,o.seriesDataIndices=(a.payloadBatch||[]).slice()):!e.useHandle&&(o.status="hide"),"show"===o.status&&n.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:o.value})})}function Rp(t,e,i,n){if(!Wp(e)&&t.list.length){var o=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};n({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:i.tooltipOption,position:i.position,dataIndexInside:o.dataIndexInside,dataIndex:o.dataIndex,seriesIndex:o.seriesIndex,dataByCoordSys:t.list})}else n({type:"hideTip"})}function Bp(t,e,i){var n=i.getZr(),o=fL(n).axisPointerLastHighlights||{},a=fL(n).axisPointerLastHighlights={};cL(t,function(t,e){var i=t.axisPointerModel.option;"show"===i.status&&cL(i.seriesDataIndices,function(t){var e=t.seriesIndex+" | "+t.dataIndex;a[e]=t})});var r=[],s=[];d(o,function(t,e){!a[e]&&s.push(t)}),d(a,function(t,e){!o[e]&&r.push(t)}),s.length&&i.dispatchAction({type:"downplay",escapeConnect:!0,batch:s}),r.length&&i.dispatchAction({type:"highlight",escapeConnect:!0,batch:r})}function Vp(t,e){for(var i=0;i<(t||[]).length;i++){var n=t[i];if(e.axis.dim===n.axisDim&&e.axis.model.componentIndex===n.axisIndex)return n}}function Gp(t){var e=t.axis.model,i={},n=i.axisDim=t.axis.dim;return i.axisIndex=i[n+"AxisIndex"]=e.componentIndex,i.axisName=i[n+"AxisName"]=e.name,i.axisId=i[n+"AxisId"]=e.id,i}function Wp(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function Fp(t,e,i){if(!_x.node){var n=e.getZr();pL(n).records||(pL(n).records={}),Hp(n,e),(pL(n).records[t]||(pL(n).records[t]={})).handler=i}}function Hp(t,e){function i(i,n){t.on(i,function(i){var o=Xp(e);gL(pL(t).records,function(t){t&&n(t,i,o.dispatchAction)}),Zp(o.pendings,e)})}pL(t).initialized||(pL(t).initialized=!0,i("click",v(jp,"click")),i("mousemove",v(jp,"mousemove")),i("globalout",Up))}function Zp(t,e){var i,n=t.showTip.length,o=t.hideTip.length;n?i=t.showTip[n-1]:o&&(i=t.hideTip[o-1]),i&&(i.dispatchAction=null,e.dispatchAction(i))}function Up(t,e,i){t.handler("leave",null,i)}function jp(t,e,i,n){e.handler(t,i,n)}function Xp(t){var e={showTip:[],hideTip:[]},i=function(n){var o=e[n.type];o?o.push(n):(n.dispatchAction=i,t.dispatchAction(n))};return{dispatchAction:i,pendings:e}}function Yp(t,e){if(!_x.node){var i=e.getZr();(pL(i).records||{})[t]&&(pL(i).records[t]=null)}}function qp(){}function $p(t,e,i,n){Kp(vL(i).lastProp,n)||(vL(i).lastProp=n,e?co(i,n,t):(i.stopAnimation(),i.attr(n)))}function Kp(t,e){if(w(t)&&w(e)){var i=!0;return d(e,function(e,n){i=i&&Kp(t[n],e)}),!!i}return t===e}function Jp(t,e){t[e.get("label.show")?"show":"hide"]()}function Qp(t){return{position:t.position.slice(),rotation:t.rotation||0}}function tg(t,e,i){var n=e.get("z"),o=e.get("zlevel");t&&t.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=o&&(t.zlevel=o),t.silent=i)})}function eg(t){var e,i=t.get("type"),n=t.getModel(i+"Style");return"line"===i?(e=n.getLineStyle()).fill=null:"shadow"===i&&((e=n.getAreaStyle()).stroke=null),e}function ig(t,e,i,n,o){var a=og(i.get("value"),e.axis,e.ecModel,i.get("seriesDataIndices"),{precision:i.get("label.precision"),formatter:i.get("label.formatter")}),r=i.getModel("label"),s=dS(r.get("padding")||0),l=r.getFont(),h=me(a,l),u=o.position,c=h.width+s[1]+s[3],d=h.height+s[0]+s[2],f=o.align;"right"===f&&(u[0]-=c),"center"===f&&(u[0]-=c/2);var p=o.verticalAlign;"bottom"===p&&(u[1]-=d),"middle"===p&&(u[1]-=d/2),ng(u,c,d,n);var g=r.get("backgroundColor");g&&"auto"!==g||(g=e.get("axisLine.lineStyle.color")),t.label={shape:{x:0,y:0,width:c,height:d,r:r.get("borderRadius")},position:u.slice(),style:{text:a,textFont:l,textFill:r.getTextColor(),textPosition:"inside",fill:g,stroke:r.get("borderColor")||"transparent",lineWidth:r.get("borderWidth")||0,shadowBlur:r.get("shadowBlur"),shadowColor:r.get("shadowColor"),shadowOffsetX:r.get("shadowOffsetX"),shadowOffsetY:r.get("shadowOffsetY")},z2:10}}function ng(t,e,i,n){var o=n.getWidth(),a=n.getHeight();t[0]=Math.min(t[0]+e,o)-e,t[1]=Math.min(t[1]+i,a)-i,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}function og(t,e,i,n,o){var a=e.scale.getLabel(t,{precision:o.precision}),r=o.formatter;if(r){var s={value:ul(e,t),seriesData:[]};d(n,function(t){var e=i.getSeriesByIndex(t.seriesIndex),n=t.dataIndexInside,o=e&&e.getDataParams(n);o&&s.seriesData.push(o)}),_(r)?a=r.replace("{value}",a):x(r)&&(a=r(s))}return a}function ag(t,e,i){var n=st();return dt(n,n,i.rotation),ct(n,n,i.position),go([t.dataToCoord(e),(i.labelOffset||0)+(i.labelDirection||1)*(i.labelMargin||0)],n)}function rg(t,e,i,n,o,a){var r=GT.innerTextLayout(i.rotation,0,i.labelDirection);i.labelMargin=o.get("label.margin"),ig(e,n,o,a,{position:ag(n.axis,t,i),align:r.textAlign,verticalAlign:r.textVerticalAlign})}function sg(t,e,i){return i=i||0,{x1:t[i],y1:t[1-i],x2:e[i],y2:e[1-i]}}function lg(t,e,i){return i=i||0,{x:t[i],y:t[1-i],width:e[i],height:e[1-i]}}function hg(t,e,i,n,o,a){return{cx:t,cy:e,r0:i,r:n,startAngle:o,endAngle:a,clockwise:!0}}function ug(t,e){var i={};return i[e.dim+"AxisIndex"]=e.index,t.getCartesian(i)}function cg(t){return"x"===t.dim?0:1}function dg(t){return t.isHorizontal()?0:1}function fg(t,e){var i=t.getRect();return[i[bL[e]],i[bL[e]]+i[SL[e]]]}function pg(t,e,i){var n=new Vb({shape:{x:t.x-10,y:t.y-10,width:0,height:t.height+20}});return fo(n,{shape:{width:t.width+20,height:t.height+20}},e,i),n}function gg(t,e,i){if(t.count())for(var n,o=e.coordinateSystem,a=e.getLayerSeries(),r=t.mapDimension("single"),s=t.mapDimension("value"),l=f(a,function(e){return f(e.indices,function(e){var i=o.dataToPoint(t.get(r,e));return i[1]=t.get(s,e),i})}),h=mg(l),u=h.y0,c=i/h.max,d=a.length,p=a[0].indices.length,g=0;g<p;++g){n=u[g]*c,t.setItemLayout(a[0].indices[g],{layerIndex:0,x:l[0][g][0],y0:n,y:l[0][g][1]*c});for(var m=1;m<d;++m)n+=l[m-1][g][1]*c,t.setItemLayout(a[m].indices[g],{layerIndex:m,x:l[m][g][0],y0:n,y:l[m][g][1]*c})}}function mg(t){for(var e=t.length,i=t[0].length,n=[],o=[],a=0,r={},s=0;s<i;++s){for(var l=0,h=0;l<e;++l)h+=t[l][s][1];h>a&&(a=h),n.push(h)}for(var u=0;u<i;++u)o[u]=(a-n[u])/2;a=0;for(var c=0;c<i;++c){var d=n[c]+o[c];d>a&&(a=d)}return r.y0=o,r.max=a,r}function vg(t){var e=0;d(t.children,function(t){vg(t);var i=t.value;y(i)&&(i=i[0]),e+=i});var i=t.value;y(i)&&(i=i[0]),(null==i||isNaN(i))&&(i=e),i<0&&(i=0),y(t.value)?t.value[0]=i:t.value=i}function yg(t,e,i){function n(){r.ignore=r.hoverIgnore}function o(){r.ignore=r.normalIgnore}S_.call(this);var a=new Ob({z2:DL}),r=new Cb({z2:CL,silent:t.getModel("label").get("silent")});this.add(a),this.add(r),this.updateData(!0,t,"normal",e,i),this.on("emphasis",n).on("normal",o).on("mouseover",n).on("mouseout",o)}function xg(t,e,i){var n=t.getVisual("color");0===t.getVisual("visualMeta").length&&(n=null);var o=t.getModel("itemStyle").get("color");if(o)return o;if(n)return n;if(0===t.depth)return i.option.color[0];var a=i.option.color.length;return o=i.option.color[_g(t)%a]}function _g(t){for(var e=t;e.depth>1;)e=e.parentNode;return l(t.getAncestors()[0].children,e)}function wg(t,e,i){return i!==AL.NONE&&(i===AL.SELF?t===e:i===AL.ANCESTOR?t===e||t.isAncestorOf(e):t===e||t.isDescendantOf(e))}function bg(t,e){var i=t.children||[];t.children=Sg(i,e),i.length&&d(t.children,function(t){bg(t,e)})}function Sg(t,e){if("function"==typeof e)return t.sort(e);var i="asc"===e;return t.sort(function(t,e){var n=(t.getValue()-e.getValue())*(i?1:-1);return 0===n?(t.dataIndex-e.dataIndex)*(i?-1:1):n})}function Mg(t,e){return e=e||[0,0],f(["x","y"],function(i,n){var o=this.getAxis(i),a=e[n],r=t[n]/2;return"category"===o.type?o.getBandWidth():Math.abs(o.dataToCoord(a-r)-o.dataToCoord(a+r))},this)}function Ig(t,e){return e=e||[0,0],f([0,1],function(i){var n=e[i],o=t[i]/2,a=[],r=[];return a[i]=n-o,r[i]=n+o,a[1-i]=r[1-i]=e[1-i],Math.abs(this.dataToPoint(a)[i]-this.dataToPoint(r)[i])},this)}function Tg(t,e){var i=this.getAxis(),n=e instanceof Array?e[0]:e,o=(t instanceof Array?t[0]:t)/2;return"category"===i.type?i.getBandWidth():Math.abs(i.dataToCoord(n-o)-i.dataToCoord(n+o))}function Ag(t,e){return f(["Radius","Angle"],function(i,n){var o=this["get"+i+"Axis"](),a=e[n],r=t[n]/2,s="dataTo"+i,l="category"===o.type?o.getBandWidth():Math.abs(o[s](a-r)-o[s](a+r));return"Angle"===i&&(l=l*Math.PI/180),l},this)}function Dg(t){var e,i=t.type;if("path"===i){var n=t.shape;(e=En(n.pathData,null,{x:n.x||0,y:n.y||0,width:n.width||0,height:n.height||0},"center")).__customPathData=t.pathData}else"image"===i?(e=new Je({})).__customImagePath=t.style.image:"text"===i?(e=new Cb({})).__customText=t.style.text:e=new(0,tS[i.charAt(0).toUpperCase()+i.slice(1)]);return e.__customGraphicType=i,e.name=t.name,e}function Cg(t,e,n,o,a,r){var s={},l=n.style||{};if(n.shape&&(s.shape=i(n.shape)),n.position&&(s.position=n.position.slice()),n.scale&&(s.scale=n.scale.slice()),n.origin&&(s.origin=n.origin.slice()),n.rotation&&(s.rotation=n.rotation),"image"===t.type&&n.style){h=s.style={};d(["x","y","width","height"],function(e){Lg(e,h,l,t.style,r)})}if("text"===t.type&&n.style){var h=s.style={};d(["x","y"],function(e){Lg(e,h,l,t.style,r)}),!l.hasOwnProperty("textFill")&&l.fill&&(l.textFill=l.fill),!l.hasOwnProperty("textStroke")&&l.stroke&&(l.textStroke=l.stroke)}if("group"!==t.type&&(t.useStyle(l),r)){t.style.opacity=0;var u=l.opacity;null==u&&(u=1),fo(t,{style:{opacity:u}},o,e)}r?t.attr(s):co(t,s,o,e),t.attr({z2:n.z2||0,silent:n.silent}),!1!==n.styleEmphasis&&to(t,n.styleEmphasis)}function Lg(t,e,i,n,o){null==i[t]||o||(e[t]=i[t],i[t]=n[t])}function kg(t,e,i,n){function o(t){null==t&&(t=u),v&&(c=e.getItemModel(t),d=c.getModel(zL),f=c.getModel(RL),p=e.getItemVisual(t,"color"),v=!1)}var s=t.get("renderItem"),l=t.coordinateSystem,h={};l&&(h=l.prepareCustoms?l.prepareCustoms():VL[l.type](l));var u,c,d,f,p,g=r({getWidth:n.getWidth,getHeight:n.getHeight,getZr:n.getZr,getDevicePixelRatio:n.getDevicePixelRatio,value:function(t,i){return null==i&&(i=u),e.get(e.getDimension(t||0),i)},style:function(i,n){null==n&&(n=u),o(n);var r=c.getModel(NL).getItemStyle();null!=p&&(r.fill=p);var s=e.getItemVisual(n,"opacity");return null!=s&&(r.opacity=s),io(r,d,null,{autoColor:p,isRectText:!0}),r.text=d.getShallow("show")?A(t.getFormattedLabel(n,"normal"),xl(e,n)):null,i&&a(r,i),r},styleEmphasis:function(i,n){null==n&&(n=u),o(n);var r=c.getModel(EL).getItemStyle();return io(r,f,null,{isRectText:!0},!0),r.text=f.getShallow("show")?D(t.getFormattedLabel(n,"emphasis"),t.getFormattedLabel(n,"normal"),xl(e,n)):null,i&&a(r,i),r},visual:function(t,i){return null==i&&(i=u),e.getItemVisual(i,t)},barLayout:function(t){if(l.getBaseAxis)return Qs(r({axis:l.getBaseAxis()},t),n)},currentSeriesIndices:function(){return i.getCurrentSeriesIndices()},font:function(t){return ho(t,i)}},h.api||{}),m={context:{},seriesId:t.id,seriesName:t.name,seriesIndex:t.seriesIndex,coordSys:h.coordSys,dataInsideLength:e.count(),encode:Pg(t.getData())},v=!0;return function(t){return u=t,v=!0,s&&s(r({dataIndexInside:t,dataIndex:e.getRawIndex(t)},m),g)||{}}}function Pg(t){var e={};return d(t.dimensions,function(i,n){var o=t.getDimensionInfo(i);if(!o.isExtraCoord){var a=o.coordDim;(e[a]=e[a]||[])[o.coordDimIndex]=n}}),e}function Og(t,e,i,n,o,a){return(t=Ng(t,e,i,n,o,a))&&a.setItemGraphicEl(e,t),t}function Ng(t,e,i,n,o,a){var r=i.type;if(!t||r===t.__customGraphicType||"path"===r&&i.pathData===t.__customPathData||"image"===r&&i.style.image===t.__customImagePath||"text"===r&&i.style.text===t.__customText||(o.remove(t),t=null),null!=r){var s=!t;if(!t&&(t=Dg(i)),Cg(t,e,i,n,a,s),"group"===r){var l=t.children()||[],h=i.children||[];if(i.diffChildrenByName)Eg({oldChildren:l,newChildren:h,dataIndex:e,animatableModel:n,group:t,data:a});else{for(var u=0;u<h.length;u++)Ng(t.childAt(u),e,h[u],n,t,a);for(;u<l.length;u++)l[u]&&t.remove(l[u])}}return o.add(t),t}}function Eg(t){new ws(t.oldChildren,t.newChildren,zg,zg,t).add(Rg).update(Rg).remove(Bg).execute()}function zg(t,e){var i=t&&t.name;return null!=i?i:BL+e}function Rg(t,e){var i=this.context,n=null!=t?i.newChildren[t]:null;Ng(null!=e?i.oldChildren[e]:null,i.dataIndex,n,i.animatableModel,i.group,i.data)}function Bg(t){var e=this.context,i=e.oldChildren[t];i&&e.group.remove(i)}function Vg(t,e,i,n){var o=i.type,a=new(0,tS[o.charAt(0).toUpperCase()+o.slice(1)])(i);e.add(a),n.set(t,a),a.__ecGraphicId=t}function Gg(t,e){var i=t&&t.parent;i&&("group"===t.type&&t.traverse(function(t){Gg(t,e)}),e.removeKey(t.__ecGraphicId),i.remove(t))}function Wg(t){return t=a({},t),d(["id","parentId","$action","hv","bounding"].concat(_S),function(e){delete t[e]}),t}function Fg(t,e){var i;return d(e,function(e){null!=t[e]&&"auto"!==t[e]&&(i=!0)}),i}function Hg(t,e){var i=t.exist;if(e.id=t.keyInfo.id,!e.type&&i&&(e.type=i.type),null==e.parentId){var n=e.parentOption;n?e.parentId=n.id:i&&(e.parentId=i.parentId)}e.parentOption=null}function Zg(t,e,i){var o=a({},i),r=t[e],s=i.$action||"merge";"merge"===s?r?(n(r,o,!0),ta(r,o,{ignoreSize:!0}),ia(i,r)):t[e]=o:"replace"===s?t[e]=o:"remove"===s&&r&&(t[e]=null)}function Ug(t,e){t&&(t.hv=e.hv=[Fg(e,["left","right"]),Fg(e,["top","bottom"])],"group"===t.type&&(null==t.width&&(t.width=e.width=0),null==t.height&&(t.height=e.height=0)))}function jg(t,e,i){var n,o={},a="toggleSelected"===t;return i.eachComponent("legend",function(i){a&&null!=n?i[n?"select":"unSelect"](e.name):(i[t](e.name),n=i.isSelected(e.name)),d(i.getData(),function(t){var e=t.get("name");if("\n"!==e&&""!==e){var n=i.isSelected(e);o.hasOwnProperty(e)?o[e]=o[e]&&n:o[e]=n}})}),{name:e.name,selected:o}}function Xg(t,e,i){var n=e.getBoxLayoutParams(),o=e.get("padding"),a={width:i.getWidth(),height:i.getHeight()},r=Ko(n,a,o);bS(e.get("orient"),t,e.get("itemGap"),r.width,r.height),Jo(t,n,a,o)}function Yg(t,e){var i=dS(e.get("padding")),n=e.getItemStyle(["color","opacity"]);return n.fill=e.get("backgroundColor"),t=new Vb({shape:{x:t.x-i[3],y:t.y-i[0],width:t.width+i[1]+i[3],height:t.height+i[0]+i[2],r:e.get("borderRadius")},style:n,silent:!0,z2:-1})}function qg(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}function $g(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHoverLayer||t.get("legendHoverLink")&&i.dispatchAction({type:"highlight",seriesName:t.name,name:e})}function Kg(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHoverLayer||t.get("legendHoverLink")&&i.dispatchAction({type:"downplay",seriesName:t.name,name:e})}function Jg(t,e,i){var n=[1,1];n[t.getOrient().index]=0,ta(e,i,{type:"box",ignoreSize:n})}function Qg(t){var e="left "+t+"s cubic-bezier(0.23, 1, 0.32, 1),top "+t+"s cubic-bezier(0.23, 1, 0.32, 1)";return f(QL,function(t){return t+"transition:"+e}).join(";")}function tm(t){var e=[],i=t.get("fontSize"),n=t.getTextColor();return n&&e.push("color:"+n),e.push("font:"+t.getFont()),i&&e.push("line-height:"+Math.round(3*i/2)+"px"),KL(["decoration","align"],function(i){var n=t.get(i);n&&e.push("text-"+i+":"+n)}),e.join(";")}function em(t){var e=[],i=t.get("transitionDuration"),n=t.get("backgroundColor"),o=t.getModel("textStyle"),a=t.get("padding");return i&&e.push(Qg(i)),n&&(_x.canvasSupported?e.push("background-Color:"+n):(e.push("background-Color:#"+Pt(n)),e.push("filter:alpha(opacity=70)"))),KL(["width","color","radius"],function(i){var n="border-"+i,o=JL(n),a=t.get(o);null!=a&&e.push(n+":"+a+("color"===i?"":"px"))}),e.push(tm(o)),null!=a&&e.push("padding:"+dS(a).join("px ")+"px"),e.join(";")+";"}function im(t,e){if(_x.wxa)return null;var i=document.createElement("div"),n=this._zr=e.getZr();this.el=i,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(i),this._container=t,this._show=!1,this._hideTimeout;var o=this;i.onmouseenter=function(){o._enterable&&(clearTimeout(o._hideTimeout),o._show=!0),o._inContent=!0},i.onmousemove=function(e){if(e=e||window.event,!o._enterable){var i=n.handler;li(t,e,!0),i.dispatch("mousemove",e)}},i.onmouseleave=function(){o._enterable&&o._show&&o.hideLater(o._hideDelay),o._inContent=!1}}function nm(t){for(var e=t.pop();t.length;){var i=t.pop();i&&(_o.isInstance(i)&&(i=i.get("tooltip",!0)),"string"==typeof i&&(i={formatter:i}),e=new _o(i,e,e.ecModel))}return e}function om(t,e){return t.dispatchAction||m(e.dispatchAction,e)}function am(t,e,i,n,o,a,r){var s=sm(i),l=s.width,h=s.height;return null!=a&&(t+l+a>n?t-=l+a:t+=a),null!=r&&(e+h+r>o?e-=h+r:e+=r),[t,e]}function rm(t,e,i,n,o){var a=sm(i),r=a.width,s=a.height;return t=Math.min(t+r,n)-r,e=Math.min(e+s,o)-s,t=Math.max(t,0),e=Math.max(e,0),[t,e]}function sm(t){var e=t.clientWidth,i=t.clientHeight;if(document.defaultView&&document.defaultView.getComputedStyle){var n=document.defaultView.getComputedStyle(t);n&&(e+=parseInt(n.paddingLeft,10)+parseInt(n.paddingRight,10)+parseInt(n.borderLeftWidth,10)+parseInt(n.borderRightWidth,10),i+=parseInt(n.paddingTop,10)+parseInt(n.paddingBottom,10)+parseInt(n.borderTopWidth,10)+parseInt(n.borderBottomWidth,10))}return{width:e,height:i}}function lm(t,e,i){var n=i[0],o=i[1],a=0,r=0,s=e.width,l=e.height;switch(t){case"inside":a=e.x+s/2-n/2,r=e.y+l/2-o/2;break;case"top":a=e.x+s/2-n/2,r=e.y-o-5;break;case"bottom":a=e.x+s/2-n/2,r=e.y+l+5;break;case"left":a=e.x-n-5,r=e.y+l/2-o/2;break;case"right":a=e.x+s+5,r=e.y+l/2-o/2}return[a,r]}function hm(t){return"center"===t||"middle"===t}function um(t){return t.get("stack")||"__ec_stack_"+t.seriesIndex}function cm(t){return t.dim}function dm(t,e){var i={};d(t,function(t,e){var n=t.getData(),o=t.coordinateSystem.getBaseAxis(),a=o.getExtent(),r="category"===o.type?o.getBandWidth():Math.abs(a[1]-a[0])/n.count(),s=i[cm(o)]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},l=s.stacks;i[cm(o)]=s;var h=um(t);l[h]||s.autoWidthCount++,l[h]=l[h]||{width:0,maxWidth:0};var u=To(t.get("barWidth"),r),c=To(t.get("barMaxWidth"),r),d=t.get("barGap"),f=t.get("barCategoryGap");u&&!l[h].width&&(u=Math.min(s.remainedWidth,u),l[h].width=u,s.remainedWidth-=u),c&&(l[h].maxWidth=c),null!=d&&(s.gap=d),null!=f&&(s.categoryGap=f)});var n={};return d(i,function(t,e){n[e]={};var i=t.stacks,o=t.bandWidth,a=To(t.categoryGap,o),r=To(t.gap,1),s=t.remainedWidth,l=t.autoWidthCount,h=(s-a)/(l+(l-1)*r);h=Math.max(h,0),d(i,function(t,e){var i=t.maxWidth;i&&i<h&&(i=Math.min(i,s),t.width&&(i=Math.min(i,t.width)),s-=i,t.width=i,l--)}),h=(s-a)/(l+(l-1)*r),h=Math.max(h,0);var u,c=0;d(i,function(t,e){t.width||(t.width=h),u=t,c+=t.width*(1+r)}),u&&(c-=u.width*r);var f=-c/2;d(i,function(t,i){n[e][i]=n[e][i]||{offset:f,width:t.width},f+=t.width*(1+r)})}),n}function fm(t,e){nT.call(this,"radius",t,e),this.type="category"}function pm(t,e){e=e||[0,360],nT.call(this,"angle",t,e),this.type="category"}function gm(t,e){return e.type||(e.data?"category":"value")}function mm(t,e,i){var n=e.get("center"),o=i.getWidth(),a=i.getHeight();t.cx=To(n[0],o),t.cy=To(n[1],a);var r=t.getRadiusAxis(),s=Math.min(o,a)/2,l=To(e.get("radius"),s);r.inverse?r.setExtent(l,0):r.setExtent(0,l)}function vm(t,e){var i=this,n=i.getAngleAxis(),o=i.getRadiusAxis();if(n.scale.setExtent(1/0,-1/0),o.scale.setExtent(1/0,-1/0),t.eachSeries(function(t){if(t.coordinateSystem===i){var e=t.getData();d(e.mapDimension("radius",!0),function(t){o.scale.unionExtentFromData(e,t)}),d(e.mapDimension("angle",!0),function(t){n.scale.unionExtentFromData(e,t)})}}),rl(n.scale,n.model),rl(o.scale,o.model),"category"===n.type&&!n.onBand){var a=n.getExtent(),r=360/n.scale.count();n.inverse?a[1]+=r:a[1]-=r,n.setExtent(a[0],a[1])}}function ym(t,e){if(t.type=e.get("type"),t.scale=sl(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,t.inverse=e.get("inverse"),"angleAxis"===e.mainType){t.inverse^=e.get("clockwise");var i=e.get("startAngle");t.setExtent(i,i+(t.inverse?-360:360))}e.axis=t,t.model=e}function xm(t,e,i){e[1]>e[0]&&(e=e.slice().reverse());var n=t.coordToPoint([e[0],i]),o=t.coordToPoint([e[1],i]);return{x1:n[0],y1:n[1],x2:o[0],y2:o[1]}}function _m(t){return t.getRadiusAxis().inverse?0:1}function wm(t,e,i){return{position:[t.cx,t.cy],rotation:i/180*Math.PI,labelDirection:-1,tickDirection:-1,nameDirection:1,labelRotate:e.getModel("axisLabel").get("rotate"),z2:1}}function bm(t,e,i,n,o){var a=e.axis,r=a.dataToCoord(t),s=n.getAngleAxis().getExtent()[0];s=s/180*Math.PI;var l,h,u,c=n.getRadiusAxis().getExtent();if("radius"===a.dim){var d=st();dt(d,d,s),ct(d,d,[n.cx,n.cy]),l=go([r,-o],d);var f=e.getModel("axisLabel").get("rotate")||0,p=GT.innerTextLayout(s,f*Math.PI/180,-1);h=p.textAlign,u=p.textVerticalAlign}else{var g=c[1];l=n.coordToPoint([g+o,r]);var m=n.cx,v=n.cy;h=Math.abs(l[0]-m)/g<.3?"center":l[0]>m?"left":"right",u=Math.abs(l[1]-v)/g<.3?"middle":l[1]>v?"top":"bottom"}return{position:l,align:h,verticalAlign:u}}function Sm(t,e){e.update="updateView",hs(e,function(e,i){var n={};return i.eachComponent({mainType:"geo",query:e},function(i){i[t](e.name),d(i.coordinateSystem.regions,function(t){n[t.name]=i.isSelected(t.name)||!1})}),{selected:n,name:e.name}})}function Mm(t){var e={};d(t,function(t){e[t]=1}),t.length=0,d(e,function(e,i){t.push(i)})}function Im(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}function Tm(t,e,n){function o(){var t=function(){};return t.prototype.__hidden=t.prototype,new t}var a={};return pk(e,function(e){var r=a[e]=o();pk(t[e],function(t,o){if(oD.isValidType(o)){var a={type:o,visual:t};n&&n(a,e),r[o]=new oD(a),"opacity"===o&&((a=i(a)).type="colorAlpha",r.__hidden.__alphaForOpacity=new oD(a))}})}),a}function Am(t,e,n){var o;d(n,function(t){e.hasOwnProperty(t)&&Im(e[t])&&(o=!0)}),o&&d(n,function(n){e.hasOwnProperty(n)&&Im(e[n])?t[n]=i(e[n]):delete t[n]})}function Dm(t,e,i,n,o,a){function r(t){return i.getItemVisual(u,t)}function s(t,e){i.setItemVisual(u,t,e)}function l(t,l){u=null==a?t:l;var c=i.getRawDataItem(u);if(!c||!1!==c.visualMap)for(var d=n.call(o,t),f=e[d],p=h[d],g=0,m=p.length;g<m;g++){var v=p[g];f[v]&&f[v].applyVisual(t,r,s)}}var h={};d(t,function(t){var i=oD.prepareVisualTypes(e[t]);h[t]=i});var u;null==a?i.each(l,!0):i.each([a],l,!0)}function Cm(t,e,i,n){var o={};return d(t,function(t){var i=oD.prepareVisualTypes(e[t]);o[t]=i}),{progress:function(t,a){null!=n&&(n=a.getDimension(n));for(var r=t.start;r<t.end;r++){var s=a.getRawDataItem(r);if(s&&!1===s.visualMap)return;for(var l=null!=n?a.get(n,r,!0):r,h=i(l),u=e[h],c=o[h],d=0,f=c.length;d<f;d++){var p=c[d];u[p]&&u[p].applyVisual(l,function(t){return a.getItemVisual(r,t)},function(t,e){a.setItemVisual(r,t,e)})}}}}}function Lm(t){var e=["x","y"],i=["width","height"];return{point:function(e,i,n){if(e){var o=n.range;return km(e[t],o)}},rect:function(n,o,a){if(n){var r=a.range,s=[n[e[t]],n[e[t]]+n[i[t]]];return s[1]<s[0]&&s.reverse(),km(s[0],r)||km(s[1],r)||km(r[0],s)||km(r[1],s)}}}}function km(t,e){return e[0]<=t&&t<=e[1]}function Pm(t,e,i,n,o){for(var a=0,r=o[o.length-1];a<o.length;a++){var s=o[a];if(Om(t,e,i,n,s[0],s[1],r[0],r[1]))return!0;r=s}}function Om(t,e,i,n,o,a,r,s){var l=Em(i-t,o-r,n-e,a-s);if(Nm(l))return!1;var h=Em(o-t,o-r,a-e,a-s)/l;if(h<0||h>1)return!1;var u=Em(i-t,o-t,n-e,a-e)/l;return!(u<0||u>1)}function Nm(t){return t<=1e-6&&t>=-1e-6}function Em(t,e,i,n){return t*n-e*i}function zm(t,e,i){var n=this._targetInfoList=[],o={},a=Bm(e,t);mk(bk,function(t,e){(!i||!i.include||vk(i.include,e)>=0)&&t(a,n,o)})}function Rm(t){return t[0]>t[1]&&t.reverse(),t}function Bm(t,e){return Oi(t,e,{includeMainTypes:_k})}function Vm(t,e,i,n){var o=i.getAxis(["x","y"][t]),a=Rm(f([0,1],function(t){return e?o.coordToData(o.toLocalCoord(n[t])):o.toGlobalCoord(o.dataToCoord(n[t]))})),r=[];return r[t]=a,r[1-t]=[NaN,NaN],{values:a,xyMinMax:r}}function Gm(t,e,i,n){return[e[0]-n[t]*i[0],e[1]-n[t]*i[1]]}function Wm(t,e){var i=Fm(t),n=Fm(e),o=[i[0]/n[0],i[1]/n[1]];return isNaN(o[0])&&(o[0]=1),isNaN(o[1])&&(o[1]=1),o}function Fm(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}function Hm(t,e,i,n,o){if(o){var a=t.getZr();a[Ck]||(a[Dk]||(a[Dk]=Zm),yr(a,Dk,i,e)(t,n))}}function Zm(t,e){if(!t.isDisposed()){var i=t.getZr();i[Ck]=!0,t.dispatchAction({type:"brushSelect",batch:e}),i[Ck]=!1}}function Um(t,e,i,n){for(var o=0,a=e.length;o<a;o++){var r=e[o];if(t[r.brushType](n,i,r.selectors,r))return!0}}function jm(t){var e=t.brushSelector;if(_(e)){var i=[];return d(gk,function(t,n){i[n]=function(i,n,o,a){var r=n.getItemLayout(i);return t[e](r,o,a)}}),i}if(x(e)){var n={};return d(gk,function(t,i){n[i]=e}),n}return e}function Xm(t,e){var i=t.option.seriesIndex;return null!=i&&"all"!==i&&(y(i)?l(i,e)<0:e!==i)}function Ym(t){var e=t.selectors={};return d(gk[t.brushType],function(i,n){e[n]=function(n){return i(n,e,t)}}),t}function qm(t){return new Kt(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}function $m(t,e){return n({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new _o(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}function Km(t,e,i,n){(!n||n.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(i)).enableBrush(t.brushOption).updateCovers(t.areas.slice())}function Jm(t,e){Ok[t]=e}function Qm(t){return Ok[t]}function tv(t,e,i){this.model=t,this.ecModel=e,this.api=i,this._brushType,this._brushMode}function ev(t,e,i){this._model=t}function iv(t,e,i,n){var o=i.calendarModel,a=i.seriesModel,r=o?o.coordinateSystem:a?a.coordinateSystem:null;return r===this?r[t](n):null}function nv(t,e){var i=t.cellSize;y(i)?1===i.length&&(i[1]=i[0]):i=t.cellSize=[i,i];var n=f([0,1],function(t){return Qo(e,t)&&(i[t]="auto"),null!=i[t]&&"auto"!==i[t]});ta(t,e,{type:"box",ignoreSize:n})}function ov(t){return l(Vk,t)>=0}function av(t,e,i){function n(t,e){return l(e.nodes,t)>=0}function o(t,n){var o=!1;return e(function(e){d(i(t,e)||[],function(t){n.records[e.name][t]&&(o=!0)})}),o}function a(t,n){n.nodes.push(t),e(function(e){d(i(t,e)||[],function(t){n.records[e.name][t]=!0})})}return function(i){var r={nodes:[],records:{}};if(e(function(t){r.records[t.name]={}}),!i)return r;a(i,r);var s;do{s=!1,t(function(t){!n(t,r)&&o(t,r)&&(a(t,r),s=!0)})}while(s);return r}}function rv(t,e,i){var n=[1/0,-1/0];return Wk(i,function(t){var i=t.getData();i&&Wk(i.mapDimension(e,!0),function(t){var e=i.getApproximateExtent(t);e[0]<n[0]&&(n[0]=e[0]),e[1]>n[1]&&(n[1]=e[1])})}),n[1]<n[0]&&(n=[NaN,NaN]),sv(t,n),n}function sv(t,e){var i=t.getAxisModel(),n=i.getMin(!0),o="category"===i.get("type"),a=o&&i.getCategories().length;null!=n&&"dataMin"!==n&&"function"!=typeof n?e[0]=n:o&&(e[0]=a>0?0:NaN);var r=i.getMax(!0);return null!=r&&"dataMax"!==r&&"function"!=typeof r?e[1]=r:o&&(e[1]=a>0?a-1:NaN),i.get("scale",!0)||(e[0]>0&&(e[0]=0),e[1]<0&&(e[1]=0)),e}function lv(t,e){var i=t.getAxisModel(),n=t._percentWindow,o=t._valueWindow;if(n){var a=ko(o,[0,500]);a=Math.min(a,20);var r=e||0===n[0]&&100===n[1];i.setRange(r?null:+o[0].toFixed(a),r?null:+o[1].toFixed(a))}}function hv(t){var e=t._minMaxSpan={},i=t._dataZoomModel;Wk(["min","max"],function(n){e[n+"Span"]=i.get(n+"Span");var o=i.get(n+"ValueSpan");if(null!=o&&(e[n+"ValueSpan"]=o,null!=(o=t.getAxisModel().axis.scale.parse(o)))){var a=t._dataExtent;e[n+"Span"]=Io(a[0]+o,a,[0,100],!0)}})}function uv(t){var e={};return Zk(["start","end","startValue","endValue","throttle"],function(i){t.hasOwnProperty(i)&&(e[i]=t[i])}),e}function cv(t,e){var i=t._rangePropMode,n=t.get("rangeMode");Zk([["start","startValue"],["end","endValue"]],function(t,o){var a=null!=e[t[0]],r=null!=e[t[1]];a&&!r?i[o]="percent":!a&&r?i[o]="value":n?i[o]=n[o]:a&&(i[o]="percent")})}function dv(t){return{x:"y",y:"x",radius:"angle",angle:"radius"}[t]}function fv(t){return"vertical"===t?"ns-resize":"ew-resize"}function pv(t,e){var i=yv(t),n=e.dataZoomId,o=e.coordId;d(i,function(t,i){var a=t.dataZoomInfos;a[n]&&l(e.allCoordIds,o)<0&&(delete a[n],t.count--)}),_v(i);var a=i[o];a||((a=i[o]={coordId:o,dataZoomInfos:{},count:0}).controller=xv(t,a),a.dispatchAction=v(Mv,t)),!a.dataZoomInfos[n]&&a.count++,a.dataZoomInfos[n]=e;var r=Iv(a.dataZoomInfos);a.controller.enable(r.controlType,r.opt),a.controller.setPointerChecker(e.containsPoint),yr(a,"dispatchAction",e.throttleRate,"fixRate")}function gv(t,e){var i=yv(t);d(i,function(t){t.controller.dispose();var i=t.dataZoomInfos;i[e]&&(delete i[e],t.count--)}),_v(i)}function mv(t,e){if(t&&"dataZoom"===t.type&&t.batch)for(var i=0,n=t.batch.length;i<n;i++)if(t.batch[i].dataZoomId===e)return!1;return!0}function vv(t){return t.type+"\0_"+t.id}function yv(t){var e=t.getZr();return e[oP]||(e[oP]={})}function xv(t,e){var i=new Zh(t.getZr());return i.on("pan",nP(wv,e)),i.on("zoom",nP(bv,e)),i}function _v(t){d(t,function(e,i){e.count||(e.controller.dispose(),delete t[i])})}function wv(t,e,i,n,o,a,r){Sv(t,function(s){return s.panGetRange(t.controller,e,i,n,o,a,r)})}function bv(t,e,i,n){Sv(t,function(o){return o.zoomGetRange(t.controller,e,i,n)})}function Sv(t,e){var i=[];d(t.dataZoomInfos,function(t){var n=e(t);!t.disabled&&n&&i.push({dataZoomId:t.dataZoomId,start:n[0],end:n[1]})}),t.dispatchAction(i)}function Mv(t,e){t.dispatchAction({type:"dataZoom",batch:e})}function Iv(t){var e,i={},n={type_true:2,type_move:1,type_false:0,type_undefined:-1};return d(t,function(t){var o=!t.disabled&&(!t.zoomLock||"move");n["type_"+o]>n["type_"+e]&&(e=o),a(i,t.roamControllerOpt)}),{controlType:e,opt:i}}function Tv(t,e){return t&&t.hasOwnProperty&&t.hasOwnProperty(e)}function Av(t,e,i,n){for(var o=e.targetVisuals[n],a=oD.prepareVisualTypes(o),r={color:t.getData().getVisual("color")},s=0,l=a.length;s<l;s++){var h=a[s],u=o["opacity"===h?"__alphaForOpacity":h];u&&u.applyVisual(i,function(t){return r[t]},function(t,e){r[t]=e})}return r.color}function Dv(t,e,i){if(i[0]===i[1])return i.slice();for(var n=(i[1]-i[0])/200,o=i[0],a=[],r=0;r<=200&&o<i[1];r++)a.push(o),o+=n;return a.push(i[1]),a}function Cv(t,e,i){var n=t.option,o=n.align;if(null!=o&&"auto"!==o)return o;for(var a={width:e.getWidth(),height:e.getHeight()},r="horizontal"===n.orient?1:0,s=[["left","right","width"],["top","bottom","height"]],l=s[r],h=[0,null,10],u={},c=0;c<3;c++)u[s[1-r][c]]=h[c],u[l[c]]=2===c?i[0]:n[l[c]];var d=[["x","width",3],["y","height",0]][r],f=Ko(u,a,n.padding);return l[(f.margin[d[2]]||0)+f[d[0]]+.5*f[d[1]]<.5*a[d[1]]?0:1]}function Lv(t){return d(t||[],function(e){null!=t.dataIndex&&(t.dataIndexInside=t.dataIndex,t.dataIndex=null)}),t}function kv(t,e,i,n){return new Rb({shape:{points:t},draggable:!!i,cursor:e,drift:i,onmousemove:function(t){Q_(t.event)},ondragend:n})}function Pv(t,e){return 0===t?[[0,0],[e,0],[e,-e]]:[[0,0],[e,0],[e,e]]}function Ov(t,e,i,n){return t?[[0,-TP(e,AP(i,0))],[CP,0],[0,TP(e,AP(n-i,0))]]:[[0,0],[5,-5],[5,5]]}function Nv(t,e,i){var n=DP/2,o=t.get("hoverLinkDataSize");return o&&(n=MP(o,e,i,!0)/2),n}function Ev(t){var e=t.get("hoverLinkOnHandle");return!!(null==e?t.get("realtime"):e)}function zv(t){return"vertical"===t?"ns-resize":"ew-resize"}function Rv(t,e){var i=t.inverse;("vertical"===t.orient?!i:i)&&e.reverse()}function Bv(t){Mi(t,"label",["show"])}function Vv(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}function Gv(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}function Wv(t,e,i){var n=-1;do{n=Math.max(Co(t.get(e,i)),n),t=t.stackedOn}while(t);return n}function Fv(t,e,i,n,o,a){var r=[],s=Yv(e,n,t),l=e.indicesOfNearest(n,s,!0)[0];r[o]=e.get(i,l,!0),r[a]=e.get(n,l,!0);var h=Wv(e,n,l);return(h=Math.min(h,20))>=0&&(r[a]=+r[a].toFixed(h)),r}function Hv(t,e){var n=t.getData(),o=t.coordinateSystem;if(e&&!Gv(e)&&!y(e.coord)&&o){var a=o.dimensions,r=Zv(e,n,o,t);if((e=i(e)).type&&BP[e.type]&&r.baseAxis&&r.valueAxis){var s=zP(a,r.baseAxis.dim),l=zP(a,r.valueAxis.dim);e.coord=BP[e.type](n,r.baseDataDim,r.valueDataDim,s,l),e.value=e.coord[l]}else{for(var h=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],u=0;u<2;u++)BP[h[u]]&&(h[u]=Yv(n,n.mapDimension(a[u]),h[u]));e.coord=h}}return e}function Zv(t,e,i,n){var o={};return null!=t.valueIndex||null!=t.valueDim?(o.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,o.valueAxis=i.getAxis(Uv(n,o.valueDataDim)),o.baseAxis=i.getOtherAxis(o.valueAxis),o.baseDataDim=e.mapDimension(o.baseAxis.dim)):(o.baseAxis=n.getBaseAxis(),o.valueAxis=i.getOtherAxis(o.baseAxis),o.baseDataDim=e.mapDimension(o.baseAxis.dim),o.valueDataDim=e.mapDimension(o.valueAxis.dim)),o}function Uv(t,e){var i=t.getData(),n=i.dimensions;e=i.getDimension(e);for(var o=0;o<n.length;o++){var a=i.getDimensionInfo(n[o]);if(a.name===e)return a.coordDim}}function jv(t,e){return!(t&&t.containData&&e.coord&&!Vv(e))||t.containData(e.coord)}function Xv(t,e,i,n){return n<2?t.coord&&t.coord[n]:t.value}function Yv(t,e,i){if("average"===i){var n=0,o=0;return t.each(e,function(t,e){isNaN(t)||(n+=t,o++)},!0),n/o}return t.getDataExtent(e,!0)["max"===i?1:0]}function qv(t,e,i){var n=e.coordinateSystem;t.each(function(o){var a,r=t.getItemModel(o),s=To(r.get("x"),i.getWidth()),l=To(r.get("y"),i.getHeight());if(isNaN(s)||isNaN(l)){if(e.getMarkerPosition)a=e.getMarkerPosition(t.getValues(t.dimensions,o));else if(n){var h=t.get(n.dimensions[0],o),u=t.get(n.dimensions[1],o);a=n.dataToPoint([h,u])}}else a=[s,l];isNaN(s)||(a[0]=s),isNaN(l)||(a[1]=l),t.setItemLayout(o,a)})}function $v(t,e,i){var n;n=t?f(t&&t.dimensions,function(t){return r({name:t,isSysCoord:!0},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{})}):[{name:"value",type:"float",isSysCoord:!0}];var o=new yI(n,i),a=f(i.get("data"),v(Hv,e));return t&&(a=g(a,v(jv,t))),o.initData(a,null,t?Xv:function(t){return t.value}),o}function Kv(t){return!isNaN(t)&&!isFinite(t)}function Jv(t,e,i,n){var o=1-t,a=n.dimensions[t];return Kv(e[o])&&Kv(i[o])&&e[t]===i[t]&&n.getAxis(a).containData(e[t])}function Qv(t,e){if("cartesian2d"===t.type){var i=e[0].coord,n=e[1].coord;if(i&&n&&(Jv(1,i,n,t)||Jv(0,i,n,t)))return!0}return jv(t,e[0])&&jv(t,e[1])}function ty(t,e,i,n,o){var a,r=n.coordinateSystem,s=t.getItemModel(e),l=To(s.get("x"),o.getWidth()),h=To(s.get("y"),o.getHeight());if(isNaN(l)||isNaN(h)){if(n.getMarkerPosition)a=n.getMarkerPosition(t.getValues(t.dimensions,e));else{var u=r.dimensions,c=t.get(u[0],e),d=t.get(u[1],e);a=r.dataToPoint([c,d])}if("cartesian2d"===r.type){var f=r.getAxis("x"),p=r.getAxis("y"),u=r.dimensions;Kv(t.get(u[0],e))?a[0]=f.toGlobalCoord(f.getExtent()[i?0:1]):Kv(t.get(u[1],e))&&(a[1]=p.toGlobalCoord(p.getExtent()[i?0:1]))}isNaN(l)||(a[0]=l),isNaN(h)||(a[1]=h)}else a=[l,h];t.setItemLayout(e,a)}function ey(t,e,i){var n;n=t?f(t&&t.dimensions,function(t){return r({name:t},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{})}):[{name:"value",type:"float"}];var o=new yI(n,i),a=new yI(n,i),s=new yI([],i),l=f(i.get("data"),v(GP,e,t,i));t&&(l=g(l,v(Qv,t)));var h=t?Xv:function(t){return t.value};return o.initData(f(l,function(t){return t[0]}),null,h),a.initData(f(l,function(t){return t[1]}),null,h),s.initData(f(l,function(t){return t[2]})),s.hasItemOption=!0,{from:o,to:a,line:s}}function iy(t){return!isNaN(t)&&!isFinite(t)}function ny(t,e,i,n){var o=1-t;return iy(e[o])&&iy(i[o])}function oy(t,e){var i=e.coord[0],n=e.coord[1];return!("cartesian2d"!==t.type||!i||!n||!ny(1,i,n,t)&&!ny(0,i,n,t))||(jv(t,{coord:i,x:e.x0,y:e.y0})||jv(t,{coord:n,x:e.x1,y:e.y1}))}function ay(t,e,i,n,o){var a,r=n.coordinateSystem,s=t.getItemModel(e),l=To(s.get(i[0]),o.getWidth()),h=To(s.get(i[1]),o.getHeight());if(isNaN(l)||isNaN(h)){if(n.getMarkerPosition)a=n.getMarkerPosition(t.getValues(i,e));else{var u=[f=t.get(i[0],e),p=t.get(i[1],e)];r.clampData&&r.clampData(u,u),a=r.dataToPoint(u,!0)}if("cartesian2d"===r.type){var c=r.getAxis("x"),d=r.getAxis("y"),f=t.get(i[0],e),p=t.get(i[1],e);iy(f)?a[0]=c.toGlobalCoord(c.getExtent()["x0"===i[0]?0:1]):iy(p)&&(a[1]=d.toGlobalCoord(d.getExtent()["y0"===i[1]?0:1]))}isNaN(l)||(a[0]=l),isNaN(h)||(a[1]=h)}else a=[l,h];return a}function ry(t,e,i){var n,o,a=["x0","y0","x1","y1"];t?(n=f(t&&t.dimensions,function(t){var i=e.getData();return r({name:t},i.getDimensionInfo(i.mapDimension(t))||{})}),o=new yI(f(a,function(t,e){return{name:t,type:n[e%2].type}}),i)):o=new yI(n=[{name:"value",type:"float"}],i);var s=f(i.get("data"),v(WP,e,t,i));t&&(s=g(s,v(oy,t)));var l=t?function(t,e,i,n){return t.coord[Math.floor(n/2)][n%2]}:function(t){return t.value};return o.initData(s,null,l),o.hasItemOption=!0,o}function sy(t){var e=t.type,i={number:"value",time:"time"};if(i[e]&&(t.axisType=i[e],delete t.type),ly(t),hy(t,"controlPosition")){var n=t.controlStyle||(t.controlStyle={});hy(n,"position")||(n.position=t.controlPosition),"none"!==n.position||hy(n,"show")||(n.show=!1,delete n.position),delete t.controlPosition}d(t.data||[],function(t){w(t)&&!y(t)&&(!hy(t,"value")&&hy(t,"name")&&(t.value=t.name),ly(t))})}function ly(t){var e=t.itemStyle||(t.itemStyle={}),i=e.emphasis||(e.emphasis={}),n=t.label||t.label||{},o=n.normal||(n.normal={}),a={normal:1,emphasis:1};d(n,function(t,e){a[e]||hy(o,e)||(o[e]=t)}),i.label&&!hy(n,"emphasis")&&(n.emphasis=i.label,delete i.label)}function hy(t,e){return t.hasOwnProperty(e)}function uy(t,e){return Ko(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}function cy(t,e,n,o){return En(t.get(e).replace(/^path:\/\//,""),i(o||{}),new Kt(n[0],n[1],n[2],n[3]),"center")}function dy(t,e,i,o,a,r){var s=e.get("color");a?(a.setColor(s),i.add(a),r&&r.onUpdate(a)):((a=dl(t.get("symbol"),-1,-1,2,2,s)).setStyle("strokeNoScale",!0),i.add(a),r&&r.onCreate(a));var l=e.getItemStyle(["color","symbol","symbolSize"]);a.setStyle(l),o=n({rectHover:!0,z2:100},o,!0);var h=t.get("symbolSize");(h=h instanceof Array?h.slice():[+h,+h])[0]/=2,h[1]/=2,o.scale=h;var u=t.get("symbolOffset");if(u){var c=o.position=o.position||[0,0];c[0]+=To(u[0],h[0]),c[1]+=To(u[1],h[1])}var d=t.get("symbolRotate");return o.rotation=(d||0)*Math.PI/180||0,a.attr(o),a.updateTransform(),a}function fy(t,e,i,n,o){if(!t.dragging){var a=n.getModel("checkpointStyle"),r=i.dataToCoord(n.getData().get(["value"],e));o||!a.get("animation",!0)?t.attr({position:[r,0]}):(t.stopAnimation(!0),t.animateTo({position:[r,0]},a.get("animationDuration",!0),a.get("animationEasing",!0)))}}function py(t){return 0===t.indexOf("my")}function gy(t){this.model=t}function my(t){this.model=t}function vy(t){var e={},i=[],n=[];return t.eachRawSeries(function(t){var o=t.coordinateSystem;if(!o||"cartesian2d"!==o.type&&"polar"!==o.type)i.push(t);else{var a=o.getBaseAxis();if("category"===a.type){var r=a.dim+"_"+a.index;e[r]||(e[r]={categoryAxis:a,valueAxis:o.getOtherAxis(a),series:[]},n.push({axisDim:a.dim,axisIndex:a.index})),e[r].series.push(t)}else i.push(t)}}),{seriesGroupByCategoryAxis:e,other:i,meta:n}}function yy(t){var e=[];return d(t,function(t,i){var n=t.categoryAxis,o=t.valueAxis.dim,a=[" "].concat(f(t.series,function(t){return t.name})),r=[n.model.getCategories()];d(t.series,function(t){r.push(t.getRawData().mapArray(o,function(t){return t}))});for(var s=[a.join(nO)],l=0;l<r[0].length;l++){for(var h=[],u=0;u<r.length;u++)h.push(r[u][l]);s.push(h.join(nO))}e.push(s.join("\n"))}),e.join("\n\n"+iO+"\n\n")}function xy(t){return f(t,function(t){var e=t.getRawData(),i=[t.name],n=[];return e.each(e.dimensions,function(){for(var t=arguments.length,o=arguments[t-1],a=e.getName(o),r=0;r<t-1;r++)n[r]=arguments[r];i.push((a?a+nO:"")+n.join(nO))}),i.join("\n")}).join("\n\n"+iO+"\n\n")}function _y(t){var e=vy(t);return{value:g([yy(e.seriesGroupByCategoryAxis),xy(e.other)],function(t){return t.replace(/[\n\t\s]/g,"")}).join("\n\n"+iO+"\n\n"),meta:e.meta}}function wy(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function by(t){if(t.slice(0,t.indexOf("\n")).indexOf(nO)>=0)return!0}function Sy(t){for(var e=t.split(/\n+/g),i=[],n=f(wy(e.shift()).split(oO),function(t){return{name:t,data:[]}}),o=0;o<e.length;o++){var a=wy(e[o]).split(oO);i.push(a.shift());for(var r=0;r<a.length;r++)n[r]&&(n[r].data[o]=a[r])}return{series:n,categories:i}}function My(t){for(var e=t.split(/\n+/g),i=wy(e.shift()),n=[],o=0;o<e.length;o++){var a,r=wy(e[o]).split(oO),s="",l=!1;isNaN(r[0])?(l=!0,s=r[0],r=r.slice(1),n[o]={name:s,value:[]},a=n[o].value):a=n[o]=[];for(var h=0;h<r.length;h++)a.push(+r[h]);1===a.length&&(l?n[o].value=a[0]:n[o]=a[0])}return{name:i,data:n}}function Iy(t,e){var i={series:[]};return d(t.split(new RegExp("\n*"+iO+"\n*","g")),function(t,n){if(by(t)){var o=Sy(t),a=e[n],r=a.axisDim+"Axis";a&&(i[r]=i[r]||[],i[r][a.axisIndex]={data:o.categories},i.series=i.series.concat(o.series))}else{o=My(t);i.series.push(o)}}),i}function Ty(t){this._dom=null,this.model=t}function Ay(t,e){return f(t,function(t,i){var n=e&&e[i];return w(n)&&!y(n)?(w(t)&&!y(t)&&(t=t.value),r({value:t},n)):t})}function Dy(t,e){var i=Py(t);aO(e,function(e,n){for(var o=i.length-1;o>=0&&!i[o][n];o--);if(o<0){var a=t.queryComponents({mainType:"dataZoom",subType:"select",id:n})[0];if(a){var r=a.getPercentRange();i[0][n]={dataZoomId:n,start:r[0],end:r[1]}}}}),i.push(e)}function Cy(t){var e=Py(t),i=e[e.length-1];e.length>1&&e.pop();var n={};return aO(i,function(t,i){for(var o=e.length-1;o>=0;o--)if(t=e[o][i]){n[i]=t;break}}),n}function Ly(t){t[rO]=null}function ky(t){return Py(t).length}function Py(t){var e=t[rO];return e||(e=t[rO]=[{}]),e}function Oy(t,e,i){(this._brushController=new yd(i.getZr())).on("brush",m(this._onBrush,this)).mount(),this._isZoomActive}function Ny(t){var e={};return d(["xAxisIndex","yAxisIndex"],function(i){e[i]=t[i],null==e[i]&&(e[i]="all"),(!1===e[i]||"none"===e[i])&&(e[i]=[])}),e}function Ey(t,e){t.setIconStatus("back",ky(e)>1?"emphasis":"normal")}function zy(t,e,i,n,o){var a=i._isZoomActive;n&&"takeGlobalCursor"===n.type&&(a="dataZoomSelect"===n.key&&n.dataZoomSelectActive),i._isZoomActive=a,t.setIconStatus("zoom",a?"emphasis":"normal");var r=new zm(Ny(t.option),e,{include:["grid"]});i._brushController.setPanels(r.makePanelOpts(o,function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"})).enableBrush(!!a&&{brushType:"auto",brushStyle:{lineWidth:0,fill:"rgba(0,0,0,0.2)"}})}function Ry(t){this.model=t}function By(t){return fO(t)}function Vy(){if(!mO&&vO){mO=!0;var t=vO.styleSheets;t.length<31?vO.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):t[0].addRule(".zrvml","behavior:url(#default#VML)")}}function Gy(t){return parseInt(t,10)}function Wy(t,e){Vy(),this.root=t,this.storage=e;var i=document.createElement("div"),n=document.createElement("div");i.style.cssText="display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;",n.style.cssText="position:absolute;left:0;top:0;",t.appendChild(i),this._vmlRoot=n,this._vmlViewport=i,this.resize();var o=e.delFromStorage,a=e.addToStorage;e.delFromStorage=function(t){o.call(e,t),t&&t.onRemove&&t.onRemove(n)},e.addToStorage=function(t){t.onAdd&&t.onAdd(n),a.call(e,t)},this._firstPaint=!0}function Fy(t){return function(){v_('In IE8.0 VML mode painter not support method "'+t+'"')}}function Hy(t){return document.createElementNS(KO,t)}function Zy(t){return eN(1e4*t)/1e4}function Uy(t){return t<sN&&t>-sN}function jy(t,e){var i=e?t.textFill:t.fill;return null!=i&&i!==tN}function Xy(t,e){var i=e?t.textStroke:t.stroke;return null!=i&&i!==tN}function Yy(t,e){e&&qy(t,"transform","matrix("+QO.call(e,",")+")")}function qy(t,e,i){(!i||"linear"!==i.type&&"radial"!==i.type)&&t.setAttribute(e,i)}function $y(t,e,i){t.setAttributeNS("http://www.w3.org/1999/xlink",e,i)}function Ky(t,e,i){if(jy(e,i)){var n=i?e.textFill:e.fill;n="transparent"===n?tN:n,"none"!==t.getAttribute("clip-path")&&n===tN&&(n="rgba(0, 0, 0, 0.002)"),qy(t,"fill",n),qy(t,"fill-opacity",e.opacity)}else qy(t,"fill",tN);if(Xy(e,i)){var o=i?e.textStroke:e.stroke;qy(t,"stroke",o="transparent"===o?tN:o),qy(t,"stroke-width",(i?e.textStrokeWidth:e.lineWidth)/(!i&&e.strokeNoScale?e.host.getLineScale():1)),qy(t,"paint-order",i?"stroke":"fill"),qy(t,"stroke-opacity",e.opacity),e.lineDash?(qy(t,"stroke-dasharray",e.lineDash.join(",")),qy(t,"stroke-dashoffset",eN(e.lineDashOffset||0))):qy(t,"stroke-dasharray",""),e.lineCap&&qy(t,"stroke-linecap",e.lineCap),e.lineJoin&&qy(t,"stroke-linejoin",e.lineJoin),e.miterLimit&&qy(t,"stroke-miterlimit",e.miterLimit)}else qy(t,"stroke",tN)}function Jy(t){for(var e=[],i=t.data,n=t.len(),o=0;o<n;){var a="",r=0;switch(i[o++]){case JO.M:a="M",r=2;break;case JO.L:a="L",r=2;break;case JO.Q:a="Q",r=4;break;case JO.C:a="C",r=6;break;case JO.A:var s=i[o++],l=i[o++],h=i[o++],u=i[o++],c=i[o++],d=i[o++],f=i[o++],p=i[o++],g=Math.abs(d),m=Uy(g-aN)&&!Uy(g),v=!1;v=g>=aN||!Uy(g)&&(d>-oN&&d<0||d>oN)==!!p;var y=Zy(s+h*nN(c)),x=Zy(l+u*iN(c));m&&(d=p?aN-1e-4:1e-4-aN,v=!0,9===o&&e.push("M",y,x));var _=Zy(s+h*nN(c+d)),w=Zy(l+u*iN(c+d));e.push("A",Zy(h),Zy(u),eN(f*rN),+v,+p,_,w);break;case JO.Z:a="Z";break;case JO.R:var _=Zy(i[o++]),w=Zy(i[o++]),b=Zy(i[o++]),S=Zy(i[o++]);e.push("M",_,w,"L",_+b,w,"L",_+b,w+S,"L",_,w+S,"L",_,w)}a&&e.push(a);for(var M=0;M<r;M++)e.push(Zy(i[o++]))}return e.join(" ")}function Qy(t){return"middle"===t?"middle":"bottom"===t?"baseline":"hanging"}function tx(){}function ex(t,e,i,n){for(var o=0,a=e.length,r=0,s=0;o<a;o++){var l=e[o];if(l.removed){for(var h=[],u=s;u<s+l.count;u++)h.push(u);l.indices=h,s+=l.count}else{for(var h=[],u=r;u<r+l.count;u++)h.push(u);l.indices=h,r+=l.count,l.added||(s+=l.count)}}return e}function ix(t){return{newPos:t.newPos,components:t.components.slice(0)}}function nx(t,e,i,n,o){this._zrId=t,this._svgRoot=e,this._tagNames="string"==typeof i?[i]:i,this._markLabel=n,this._domName=o||"_dom",this.nextId=0}function ox(t,e){nx.call(this,t,e,["linearGradient","radialGradient"],"__gradient_in_use__")}function ax(t,e){nx.call(this,t,e,"clipPath","__clippath_in_use__")}function rx(t,e){nx.call(this,t,e,["filter"],"__filter_in_use__","_shadowDom")}function sx(t){return t&&(t.shadowBlur||t.shadowOffsetX||t.shadowOffsetY||t.textShadowBlur||t.textShadowOffsetX||t.textShadowOffsetY)}function lx(t){return parseInt(t,10)}function hx(t){return t instanceof Mn?lN:t instanceof Je?hN:t instanceof Cb?uN:lN}function ux(t,e){return e&&t&&e.parentNode!==t}function cx(t,e,i){if(ux(t,e)&&i){var n=i.nextSibling;n?t.insertBefore(e,n):t.appendChild(e)}}function dx(t,e){if(ux(t,e)){var i=t.firstChild;i?t.insertBefore(e,i):t.appendChild(e)}}function fx(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)}function px(t){return t.__textSvgEl}function gx(t){return t.__svgEl}function mx(t){return function(){v_('In SVG mode painter not support method "'+t+'"')}}var vx=2311,yx=function(){return vx++},xx={},_x=xx="undefined"!=typeof wx?{browser:{},os:{},node:!1,wxa:!0,canvasSupported:!0,svgSupported:!1,touchEventsSupported:!0}:"undefined"==typeof document&&"undefined"!=typeof self?{browser:{},os:{},node:!1,worker:!0,canvasSupported:!0}:"undefined"==typeof navigator?{browser:{},os:{},node:!0,worker:!1,canvasSupported:!0,svgSupported:!0}:function(t){var e={},i={},n=t.match(/Firefox\/([\d.]+)/),o=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),a=t.match(/Edge\/([\d.]+)/),r=/micromessenger/i.test(t);return n&&(i.firefox=!0,i.version=n[1]),o&&(i.ie=!0,i.version=o[1]),a&&(i.edge=!0,i.version=a[1]),r&&(i.weChat=!0),{browser:i,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!i.ie&&!i.edge,pointerEventsSupported:"onpointerdown"in window&&(i.edge||i.ie&&i.version>=11)}}(navigator.userAgent),bx={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},Sx={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},Mx=Object.prototype.toString,Ix=Array.prototype,Tx=Ix.forEach,Ax=Ix.filter,Dx=Ix.slice,Cx=Ix.map,Lx=Ix.reduce,kx={},Px=function(){return kx.createCanvas()};kx.createCanvas=function(){return document.createElement("canvas")};var Ox,Nx="__ec_primitive__";E.prototype={constructor:E,get:function(t){return this.hasOwnProperty(t)?this[t]:null},set:function(t,e){return this[t]=e},each:function(t,e){void 0!==e&&(t=m(t,e));for(var i in this)this.hasOwnProperty(i)&&t(this[i],i)},removeKey:function(t){delete this[t]}};var Ex=(Object.freeze||Object)({$override:e,clone:i,merge:n,mergeAll:o,extend:a,defaults:r,createCanvas:Px,getContext:s,indexOf:l,inherits:h,mixin:u,isArrayLike:c,each:d,map:f,reduce:p,filter:g,find:function(t,e,i){if(t&&e)for(var n=0,o=t.length;n<o;n++)if(e.call(i,t[n],n,t))return t[n]},bind:m,curry:v,isArray:y,isFunction:x,isString:_,isObject:w,isBuiltInObject:b,isTypedArray:S,isDom:M,eqNaN:I,retrieve:T,retrieve2:A,retrieve3:D,slice:C,normalizeCssArray:L,assert:k,trim:P,setAsPrimitive:O,isPrimitive:N,createHashMap:z,concatArray:R,noop:B}),zx="undefined"==typeof Float32Array?Array:Float32Array,Rx=j,Bx=X,Vx=$,Gx=K,Wx=(Object.freeze||Object)({create:V,copy:G,clone:W,set:F,add:H,scaleAndAdd:Z,sub:U,len:j,length:Rx,lenSquare:X,lengthSquare:Bx,mul:function(t,e,i){return t[0]=e[0]*i[0],t[1]=e[1]*i[1],t},div:function(t,e,i){return t[0]=e[0]/i[0],t[1]=e[1]/i[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:Y,normalize:q,distance:$,dist:Vx,distanceSquare:K,distSquare:Gx,negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:J,applyTransform:Q,min:tt,max:et});it.prototype={constructor:it,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(nt(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var i=t.offsetX,n=t.offsetY,o=i-this._x,a=n-this._y;this._x=i,this._y=n,e.drift(o,a,t),this.dispatchToElement(nt(e,t),"drag",t.event);var r=this.findHover(i,n,e).target,s=this._dropTarget;this._dropTarget=r,e!==r&&(s&&r!==s&&this.dispatchToElement(nt(s,t),"dragleave",t.event),r&&r!==s&&this.dispatchToElement(nt(r,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(nt(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(nt(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}};var Fx=Array.prototype.slice,Hx=function(){this._$handlers={}};Hx.prototype={constructor:Hx,one:function(t,e,i){var n=this._$handlers;if(!e||!t)return this;n[t]||(n[t]=[]);for(var o=0;o<n[t].length;o++)if(n[t][o].h===e)return this;return n[t].push({h:e,one:!0,ctx:i||this}),this},on:function(t,e,i){var n=this._$handlers;if(!e||!t)return this;n[t]||(n[t]=[]);for(var o=0;o<n[t].length;o++)if(n[t][o].h===e)return this;return n[t].push({h:e,one:!1,ctx:i||this}),this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var i=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(i[t]){for(var n=[],o=0,a=i[t].length;o<a;o++)i[t][o].h!=e&&n.push(i[t][o]);i[t]=n}i[t]&&0===i[t].length&&delete i[t]}else delete i[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>3&&(e=Fx.call(e,1));for(var n=this._$handlers[t],o=n.length,a=0;a<o;){switch(i){case 1:n[a].h.call(n[a].ctx);break;case 2:n[a].h.call(n[a].ctx,e[1]);break;case 3:n[a].h.call(n[a].ctx,e[1],e[2]);break;default:n[a].h.apply(n[a].ctx,e)}n[a].one?(n.splice(a,1),o--):a++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>4&&(e=Fx.call(e,1,e.length-1));for(var n=e[e.length-1],o=this._$handlers[t],a=o.length,r=0;r<a;){switch(i){case 1:o[r].h.call(n);break;case 2:o[r].h.call(n,e[1]);break;case 3:o[r].h.call(n,e[1],e[2]);break;default:o[r].h.apply(n,e)}o[r].one?(o.splice(r,1),a--):r++}}return this}};var Zx="silent";at.prototype.dispose=function(){};var Ux=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],jx=function(t,e,i,n){Hx.call(this),this.storage=t,this.painter=e,this.painterRoot=n,i=i||new at,this.proxy=null,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,it.call(this),this.setHandlerProxy(i)};jx.prototype={constructor:jx,setHandlerProxy:function(t){this.proxy&&this.proxy.dispose(),t&&(d(Ux,function(e){t.on&&t.on(e,this[e],this)},this),t.handler=this),this.proxy=t},mousemove:function(t){var e=t.zrX,i=t.zrY,n=this._hovered,o=n.target;o&&!o.__zr&&(o=(n=this.findHover(n.x,n.y)).target);var a=this._hovered=this.findHover(e,i),r=a.target,s=this.proxy;s.setCursor&&s.setCursor(r?r.cursor:"default"),o&&r!==o&&this.dispatchToElement(n,"mouseout",t),this.dispatchToElement(a,"mousemove",t),r&&r!==o&&this.dispatchToElement(a,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);var e,i=t.toElement||t.relatedTarget;do{i=i&&i.parentNode}while(i&&9!=i.nodeType&&!(e=i===this.painterRoot));!e&&this.trigger("globalout",{event:t})},resize:function(t){this._hovered={}},dispatch:function(t,e){var i=this[t];i&&i.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,i){var n=(t=t||{}).target;if(!n||!n.silent){for(var o="on"+e,a=ot(e,t,i);n&&(n[o]&&(a.cancelBubble=n[o].call(n,a)),n.trigger(e,a),n=n.parent,!a.cancelBubble););a.cancelBubble||(this.trigger(e,a),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[o]&&t[o].call(t,a),t.trigger&&t.trigger(e,a)}))}},findHover:function(t,e,i){for(var n=this.storage.getDisplayList(),o={x:t,y:e},a=n.length-1;a>=0;a--){var r;if(n[a]!==i&&!n[a].ignore&&(r=rt(n[a],t,e))&&(!o.topTarget&&(o.topTarget=n[a]),r!==Zx)){o.target=n[a];break}}return o}},d(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){jx.prototype[t]=function(e){var i=this.findHover(e.zrX,e.zrY),n=i.target;if("mousedown"===t)this._downEl=n,this._downPoint=[e.zrX,e.zrY],this._upEl=n;else if("mouseup"===t)this._upEl=n;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||Vx(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(i,t,e)}}),u(jx,Hx),u(jx,it);var Xx="undefined"==typeof Float32Array?Array:Float32Array,Yx=(Object.freeze||Object)({create:st,identity:lt,copy:ht,mul:ut,translate:ct,rotate:dt,scale:ft,invert:pt,clone:gt}),qx=lt,$x=5e-5,Kx=function(t){(t=t||{}).position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},Jx=Kx.prototype;Jx.transform=null,Jx.needLocalTransform=function(){return mt(this.rotation)||mt(this.position[0])||mt(this.position[1])||mt(this.scale[0]-1)||mt(this.scale[1]-1)},Jx.updateTransform=function(){var t=this.parent,e=t&&t.transform,i=this.needLocalTransform(),n=this.transform;i||e?(n=n||st(),i?this.getLocalTransform(n):qx(n),e&&(i?ut(n,t.transform,n):ht(n,t.transform)),this.transform=n,this.invTransform=this.invTransform||st(),pt(this.invTransform,n)):n&&qx(n)},Jx.getLocalTransform=function(t){return Kx.getLocalTransform(this,t)},Jx.setTransform=function(t){var e=this.transform,i=t.dpr||1;e?t.setTransform(i*e[0],i*e[1],i*e[2],i*e[3],i*e[4],i*e[5]):t.setTransform(i,0,0,i,0,0)},Jx.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var Qx=[];Jx.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(ut(Qx,t.invTransform,e),e=Qx);var i=e[0]*e[0]+e[1]*e[1],n=e[2]*e[2]+e[3]*e[3],o=this.position,a=this.scale;mt(i-1)&&(i=Math.sqrt(i)),mt(n-1)&&(n=Math.sqrt(n)),e[0]<0&&(i=-i),e[3]<0&&(n=-n),o[0]=e[4],o[1]=e[5],a[0]=i,a[1]=n,this.rotation=Math.atan2(-e[1]/n,e[0]/i)}},Jx.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(i=-i),[e,i]},Jx.transformCoordToLocal=function(t,e){var i=[t,e],n=this.invTransform;return n&&Q(i,i,n),i},Jx.transformCoordToGlobal=function(t,e){var i=[t,e],n=this.transform;return n&&Q(i,i,n),i},Kx.getLocalTransform=function(t,e){qx(e=e||[]);var i=t.origin,n=t.scale||[1,1],o=t.rotation||0,a=t.position||[0,0];return i&&(e[4]-=i[0],e[5]-=i[1]),ft(e,e,n),o&&dt(e,e,o),i&&(e[4]+=i[0],e[5]+=i[1]),e[4]+=a[0],e[5]+=a[1],e};var t_={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,i=.1;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=.1):e=.4*Math.asin(1/i)/(2*Math.PI),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,i=.1;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=.1):e=.4*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,i=.1;return 0===t?0:1===t?1:(!i||i<1?(i=1,e=.1):e=.4*Math.asin(1/i)/(2*Math.PI),(t*=2)<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-t_.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*t_.bounceIn(2*t):.5*t_.bounceOut(2*t-1)+.5}};vt.prototype={constructor:vt,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)this._pausedTime+=e;else{var i=(t-this._startTime-this._pausedTime)/this._life;if(!(i<0)){i=Math.min(i,1);var n=this.easing,o="string"==typeof n?t_[n]:n,a="function"==typeof o?o(i):i;return this.fire("frame",a),1==i?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){this[t="on"+t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}};var e_=function(){this.head=null,this.tail=null,this._len=0},i_=e_.prototype;i_.insert=function(t){var e=new n_(t);return this.insertEntry(e),e},i_.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},i_.remove=function(t){var e=t.prev,i=t.next;e?e.next=i:this.head=i,i?i.prev=e:this.tail=e,t.next=t.prev=null,this._len--},i_.len=function(){return this._len},i_.clear=function(){this.head=this.tail=null,this._len=0};var n_=function(t){this.value=t,this.next,this.prev},o_=function(t){this._list=new e_,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},a_=o_.prototype;a_.put=function(t,e){var i=this._list,n=this._map,o=null;if(null==n[t]){var a=i.len(),r=this._lastRemovedEntry;if(a>=this._maxSize&&a>0){var s=i.head;i.remove(s),delete n[s.key],o=s.value,this._lastRemovedEntry=s}r?r.value=e:r=new n_(e),r.key=t,i.insertEntry(r),n[t]=r}return o},a_.get=function(t){var e=this._map[t],i=this._list;if(null!=e)return e!==i.tail&&(i.remove(e),i.insertEntry(e)),e.value},a_.clear=function(){this._list.clear(),this._map={}};var r_={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},s_=new o_(20),l_=null,h_=Ot,u_=Nt,c_=(Object.freeze||Object)({parse:Dt,lift:kt,toHex:Pt,fastLerp:Ot,fastMapToColor:h_,lerp:Nt,mapToColor:u_,modifyHSL:Et,modifyAlpha:zt,stringify:Rt}),d_=Array.prototype.slice,f_=function(t,e,i,n){this._tracks={},this._target=t,this._loop=e||!1,this._getter=i||Bt,this._setter=n||Vt,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};f_.prototype={when:function(t,e){var i=this._tracks;for(var n in e)if(e.hasOwnProperty(n)){if(!i[n]){i[n]=[];var o=this._getter(this._target,n);if(null==o)continue;0!==t&&i[n].push({time:0,value:Xt(o)})}i[n].push({time:t,value:e[n]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].pause();this._paused=!0},resume:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,i=0;i<e;i++)t[i].call(this)},start:function(t,e){var i,n=this,o=0;for(var a in this._tracks)if(this._tracks.hasOwnProperty(a)){var r=$t(this,t,function(){--o||n._doneCallback()},this._tracks[a],a,e);r&&(this._clipList.push(r),o++,this.animation&&this.animation.addClip(r),i=r)}if(i){var s=i.onframe;i.onframe=function(t,e){s(t,e);for(var i=0;i<n._onframeList.length;i++)n._onframeList[i](t,e)}}return o||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,i=this.animation,n=0;n<e.length;n++){var o=e[n];t&&o.onframe(this._target,1),i&&i.removeClip(o)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}};var p_=1;"undefined"!=typeof window&&(p_=Math.max(window.devicePixelRatio||1,1));var g_=p_,m_=function(){},v_=m_,y_=function(){this.animators=[]};y_.prototype={constructor:y_,animate:function(t,e){var i,n=!1,o=this,a=this.__zr;if(t){var r=t.split("."),s=o;n="shape"===r[0];for(var h=0,u=r.length;h<u;h++)s&&(s=s[r[h]]);s&&(i=s)}else i=o;if(i){var c=o.animators,d=new f_(i,e);return d.during(function(t){o.dirty(n)}).done(function(){c.splice(l(c,d),1)}),c.push(d),a&&a.animation.addAnimator(d),d}v_('Property "'+t+'" is not existed in element '+o.id)},stopAnimation:function(t){for(var e=this.animators,i=e.length,n=0;n<i;n++)e[n].stop(t);return e.length=0,this},animateTo:function(t,e,i,n,o,a){_(i)?(o=n,n=i,i=0):x(n)?(o=n,n="linear",i=0):x(i)?(o=i,i=0):x(e)?(o=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,i);var r=this.animators.slice(),s=r.length;s||o&&o();for(var l=0;l<r.length;l++)r[l].done(function(){--s||o&&o()}).start(n,a)},_animateToShallow:function(t,e,i,n,o){var a={},r=0;for(var s in i)if(i.hasOwnProperty(s))if(null!=e[s])w(i[s])&&!c(i[s])?this._animateToShallow(t?t+"."+s:s,e[s],i[s],n,o):(a[s]=i[s],r++);else if(null!=i[s])if(t){var l={};l[t]={},l[t][s]=i[s],this.attr(l)}else this.attr(s,i[s]);return r>0&&this.animate(t,!1).when(null==n?500:n,a).delay(o||0),this}};var x_=function(t){Kx.call(this,t),Hx.call(this,t),y_.call(this,t),this.id=t.id||yx()};x_.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,isGroup:!1,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var i=this[t];i||(i=this[t]=[]),i[0]=e[0],i[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(w(t))for(var i in t)t.hasOwnProperty(i)&&this.attrKV(i,t[i]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var i=0;i<e.length;i++)t.animation.addAnimator(e[i]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var i=0;i<e.length;i++)t.animation.removeAnimator(e[i]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},u(x_,y_),u(x_,Kx),u(x_,Hx);var __=Q,w_=Math.min,b_=Math.max;Kt.prototype={constructor:Kt,union:function(t){var e=w_(t.x,this.x),i=w_(t.y,this.y);this.width=b_(t.x+t.width,this.x+this.width)-e,this.height=b_(t.y+t.height,this.y+this.height)-i,this.x=e,this.y=i},applyTransform:function(){var t=[],e=[],i=[],n=[];return function(o){if(o){t[0]=i[0]=this.x,t[1]=n[1]=this.y,e[0]=n[0]=this.x+this.width,e[1]=i[1]=this.y+this.height,__(t,t,o),__(e,e,o),__(i,i,o),__(n,n,o),this.x=w_(t[0],e[0],i[0],n[0]),this.y=w_(t[1],e[1],i[1],n[1]);var a=b_(t[0],e[0],i[0],n[0]),r=b_(t[1],e[1],i[1],n[1]);this.width=a-this.x,this.height=r-this.y}}}(),calculateTransform:function(t){var e=this,i=t.width/e.width,n=t.height/e.height,o=st();return ct(o,o,[-e.x,-e.y]),ft(o,o,[i,n]),ct(o,o,[t.x,t.y]),o},intersect:function(t){if(!t)return!1;t instanceof Kt||(t=Kt.create(t));var e=this,i=e.x,n=e.x+e.width,o=e.y,a=e.y+e.height,r=t.x,s=t.x+t.width,l=t.y,h=t.y+t.height;return!(n<r||s<i||a<l||h<o)},contain:function(t,e){var i=this;return t>=i.x&&t<=i.x+i.width&&e>=i.y&&e<=i.y+i.height},clone:function(){return new Kt(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},Kt.create=function(t){return new Kt(t.x,t.y,t.width,t.height)};var S_=function(t){t=t||{},x_.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};S_.prototype={constructor:S_,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,i=0;i<e.length;i++)if(e[i].name===t)return e[i]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var i=this._children,n=i.indexOf(e);n>=0&&(i.splice(n,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,i=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof S_&&t.addChildrenToStorage(e)),i&&i.refresh()},remove:function(t){var e=this.__zr,i=this.__storage,n=this._children,o=l(n,t);return o<0?this:(n.splice(o,1),t.parent=null,i&&(i.delFromStorage(t),t instanceof S_&&t.delChildrenFromStorage(i)),e&&e.refresh(),this)},removeAll:function(){var t,e,i=this._children,n=this.__storage;for(e=0;e<i.length;e++)t=i[e],n&&(n.delFromStorage(t),t instanceof S_&&t.delChildrenFromStorage(n)),t.parent=null;return i.length=0,this},eachChild:function(t,e){for(var i=this._children,n=0;n<i.length;n++){var o=i[n];t.call(e,o,n)}return this},traverse:function(t,e){for(var i=0;i<this._children.length;i++){var n=this._children[i];t.call(e,n),"group"===n.type&&n.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var i=this._children[e];t.addToStorage(i),i instanceof S_&&i.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var i=this._children[e];t.delFromStorage(i),i instanceof S_&&i.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,i=new Kt(0,0,0,0),n=t||this._children,o=[],a=0;a<n.length;a++){var r=n[a];if(!r.ignore&&!r.invisible){var s=r.getBoundingRect(),l=r.getLocalTransform(o);l?(i.copy(s),i.applyTransform(l),(e=e||i.clone()).union(i)):(e=e||s.clone()).union(s)}}return e||i}},h(S_,x_);var M_=32,I_=7,T_=function(){this._roots=[],this._displayList=[],this._displayListLen=0};T_.prototype={constructor:T_,traverse:function(t,e){for(var i=0;i<this._roots.length;i++)this._roots[i].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,i=this._displayList,n=0,o=e.length;n<o;n++)this._updateAndAddDisplayable(e[n],null,t);i.length=this._displayListLen,_x.canvasSupported&&ae(i,re)},_updateAndAddDisplayable:function(t,e,i){if(!t.ignore||i){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var n=t.clipPath;if(n){e=e?e.slice():[];for(var o=n,a=t;o;)o.parent=a,o.updateTransform(),e.push(o),a=o,o=o.clipPath}if(t.isGroup){for(var r=t._children,s=0;s<r.length;s++){var l=r[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,i)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){t.__storage!==this&&(t instanceof S_&&t.addChildrenToStorage(this),this.addToStorage(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(i=0;i<this._roots.length;i++){var e=this._roots[i];e instanceof S_&&e.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var i=0,n=t.length;i<n;i++)this.delRoot(t[i]);else{var o=l(this._roots,t);o>=0&&(this.delFromStorage(t),this._roots.splice(o,1),t instanceof S_&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t&&(t.__storage=this,t.dirty(!1)),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:re};var A_={shadowBlur:1,shadowOffsetX:1,shadowOffsetY:1,textShadowBlur:1,textShadowOffsetX:1,textShadowOffsetY:1,textBoxShadowBlur:1,textBoxShadowOffsetX:1,textBoxShadowOffsetY:1},D_=function(t,e,i){return A_.hasOwnProperty(e)?i*=t.dpr:i},C_=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],L_=function(t,e){this.extendFrom(t,!1),this.host=e};L_.prototype={constructor:L_,host:null,fill:"#000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,font:null,textFont:null,fontStyle:null,fontWeight:null,fontSize:null,fontFamily:null,textTag:null,textFill:"#000",textStroke:null,textWidth:null,textHeight:null,textStrokeWidth:0,textLineHeight:null,textPosition:"inside",textRect:null,textOffset:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowColor:"transparent",textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textBoxShadowColor:"transparent",textBoxShadowBlur:0,textBoxShadowOffsetX:0,textBoxShadowOffsetY:0,transformText:!1,textRotation:0,textOrigin:null,textBackgroundColor:null,textBorderColor:null,textBorderWidth:0,textBorderRadius:0,textPadding:null,rich:null,truncate:null,blend:null,bind:function(t,e,i){for(var n=this,o=i&&i.style,a=!o,r=0;r<C_.length;r++){var s=C_[r],l=s[0];(a||n[l]!==o[l])&&(t[l]=D_(t,l,n[l]||s[1]))}if((a||n.fill!==o.fill)&&(t.fillStyle=n.fill),(a||n.stroke!==o.stroke)&&(t.strokeStyle=n.stroke),(a||n.opacity!==o.opacity)&&(t.globalAlpha=null==n.opacity?1:n.opacity),(a||n.blend!==o.blend)&&(t.globalCompositeOperation=n.blend||"source-over"),this.hasStroke()){var h=n.lineWidth;t.lineWidth=h/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&this.lineWidth>0},extendFrom:function(t,e){if(t)for(var i in t)!t.hasOwnProperty(i)||!0!==e&&(!1===e?this.hasOwnProperty(i):null==t[i])||(this[i]=t[i])},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,i){for(var n=("radial"===e.type?le:se)(t,e,i),o=e.colorStops,a=0;a<o.length;a++)n.addColorStop(o[a].offset,o[a].color);return n}};for(var k_=L_.prototype,P_=0;P_<C_.length;P_++){var O_=C_[P_];O_[0]in k_||(k_[O_[0]]=O_[1])}L_.getGradient=k_.getGradient;var N_=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};N_.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")};var E_=function(t,e,i){var n;i=i||g_,"string"==typeof t?n=ue(t,e,i):w(t)&&(t=(n=t).id),this.id=t,this.dom=n;var o=n.style;o&&(n.onselectstart=he,o["-webkit-user-select"]="none",o["user-select"]="none",o["-webkit-touch-callout"]="none",o["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",o.padding=0,o.margin=0,o["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=i};E_.prototype={constructor:E_,__dirty:!0,__used:!1,__drawIndex:0,__startIndex:0,__endIndex:0,incremental:!1,getElementCount:function(){return this.__endIndex-this.__startIndex},initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=ue("back-"+this.id,this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var i=this.dpr,n=this.dom,o=n.style,a=this.domBack;o.width=t+"px",o.height=e+"px",n.width=t*i,n.height=e*i,a&&(a.width=t*i,a.height=e*i,1!=i&&this.ctxBack.scale(i,i))},clear:function(t){var e=this.dom,i=this.ctx,n=e.width,o=e.height,a=this.clearColor,r=this.motionBlur&&!t,s=this.lastFrameAlpha,l=this.dpr;if(r&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,n/l,o/l)),i.clearRect(0,0,n,o),a){var h;a.colorStops?(h=a.__canvasGradient||L_.getGradient(i,a,{x:0,y:0,width:n,height:o}),a.__canvasGradient=h):a.image&&(h=N_.prototype.getCanvasPattern.call(a,i)),i.save(),i.fillStyle=h||a,i.fillRect(0,0,n,o),i.restore()}if(r){var u=this.domBack;i.save(),i.globalAlpha=s,i.drawImage(u,0,0,n,o),i.restore()}}};var z_="undefined"!=typeof window&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)},R_=new o_(50),B_={},V_=0,G_=5e3,W_=/\{([a-zA-Z0-9_]+)\|([^}]*)\}/g,F_="12px sans-serif",H_={};H_.measureText=function(t,e){var i=s();return i.font=e||F_,i.measureText(t)};var Z_={left:1,right:1,center:1},U_={top:1,bottom:1,middle:1},j_=new Kt,X_=function(){};X_.prototype={constructor:X_,drawRectText:function(t,e){var i=this.style;e=i.textRect||e,this.__dirty&&Oe(i);var n=i.text;if(null!=n&&(n+=""),$e(n,i)){t.save();var o=this.transform;i.transformText?this.setTransform(t):o&&(j_.copy(e),j_.applyTransform(o),e=j_),Ee(this,t,n,i,e),t.restore()}}},Ke.prototype={constructor:Ke,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:!1,incremental:!1,inplace:!1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var i=this.transformCoordToLocal(t,e);return this.getBoundingRect().contain(i[0],i[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?x_.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new L_(t,this),this.dirty(!1),this}},h(Ke,x_),u(Ke,X_),Je.prototype={constructor:Je,type:"image",brush:function(t,e){var i=this.style,n=i.image;i.bind(t,this,e);var o=this._image=de(n,this._image,this,this.onload);if(o&&pe(o)){var a=i.x||0,r=i.y||0,s=i.width,l=i.height,h=o.width/o.height;if(null==s&&null!=l?s=l*h:null==l&&null!=s?l=s/h:null==s&&null==l&&(s=o.width,l=o.height),this.setTransform(t),i.sWidth&&i.sHeight){var u=i.sx||0,c=i.sy||0;t.drawImage(o,u,c,i.sWidth,i.sHeight,a,r,s,l)}else if(i.sx&&i.sy){var d=s-(u=i.sx),f=l-(c=i.sy);t.drawImage(o,u,c,d,f,a,r,s,l)}else t.drawImage(o,a,r,s,l);null!=i.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new Kt(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},h(Je,Ke);var Y_=new Kt(0,0,0,0),q_=new Kt(0,0,0,0),$_=function(t,e,i){this.type="canvas";var n=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=i=a({},i||{}),this.dpr=i.devicePixelRatio||g_,this._singleCanvas=n,this.root=t;var o=t.style;o&&(o["-webkit-tap-highlight-color"]="transparent",o["-webkit-user-select"]=o["user-select"]=o["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var r=this._zlevelList=[],s=this._layers={};if(this._layerConfig={},this._needsManuallyCompositing=!1,n){null!=i.width&&(t.width=i.width),null!=i.height&&(t.height=i.height);var l=t.width,h=t.height;this._width=l,this._height=h;var u=new E_(t,this,1);u.__builtin__=!0,u.initContext(),s[314159]=u,r.push(314159),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var c=this._domRoot=oi(this._width,this._height);t.appendChild(c)}this._hoverlayer=null,this._hoverElements=[]};$_.prototype={constructor:$_,getType:function(){return"canvas"},isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},getViewportRootOffset:function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},refresh:function(t){var e=this.storage.getDisplayList(!0),i=this._zlevelList;this._redrawId=Math.random(),this._paintList(e,t,this._redrawId);for(var n=0;n<i.length;n++){var o=i[n],a=this._layers[o];!a.__builtin__&&a.refresh&&a.refresh()}return this.refreshHover(),this},addHover:function(t,e){if(!t.__hoverMir){var i=new t.constructor({style:t.style,shape:t.shape});i.__from=t,t.__hoverMir=i,i.setStyle(e),this._hoverElements.push(i)}},removeHover:function(t){var e=t.__hoverMir,i=this._hoverElements,n=l(i,e);n>=0&&i.splice(n,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,i=0;i<e.length;i++){var n=e[i].__from;n&&(n.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,i=this._hoverlayer;if(i&&i.clear(),e){ae(t,this.storage.displayableSortFunc),i||(i=this._hoverlayer=this.getLayer(1e5));var n={};i.ctx.save();for(var o=0;o<e;){var a=t[o],r=a.__from;r&&r.__zr?(o++,r.invisible||(a.transform=r.transform,a.invTransform=r.invTransform,a.__clipPaths=r.__clipPaths,this._doPaintEl(a,i,!0,n))):(t.splice(o,1),r.__hoverMir=null,e--)}i.ctx.restore()}},getHoverLayer:function(){return this.getLayer(1e5)},_paintList:function(t,e,i){if(this._redrawId===i){e=e||!1,this._updateLayerStatus(t);var n=this._doPaintList(t,e);if(this._needsManuallyCompositing&&this._compositeManually(),!n){var o=this;z_(function(){o._paintList(t,e,i)})}}},_compositeManually:function(){var t=this.getLayer(314159).ctx,e=this._domRoot.width,i=this._domRoot.height;t.clearRect(0,0,e,i),this.eachBuiltinLayer(function(n){n.virtual&&t.drawImage(n.dom,0,0,e,i)})},_doPaintList:function(t,e){for(var i=[],n=0;n<this._zlevelList.length;n++){var o=this._zlevelList[n];(s=this._layers[o]).__builtin__&&s!==this._hoverlayer&&(s.__dirty||e)&&i.push(s)}for(var a=!0,r=0;r<i.length;r++){var s=i[r],l=s.ctx,h={};l.save();var u=e?s.__startIndex:s.__drawIndex,c=!e&&s.incremental&&Date.now,f=c&&Date.now();if(s.__startIndex===s.__endIndex)s.clear();else if(u===s.__startIndex){var p=t[u];p.incremental&&p.notClear&&!e||s.clear()}-1===u&&(console.error("For some unknown reason. drawIndex is -1"),u=s.__startIndex);for(var g=u;g<s.__endIndex;g++){var m=t[g];if(this._doPaintEl(m,s,e,h),m.__dirty=!1,c&&Date.now()-f>15)break}s.__drawIndex=g,s.__drawIndex<s.__endIndex&&(a=!1),h.prevElClipPaths&&l.restore(),l.restore()}return _x.wxa&&d(this._layers,function(t){t&&t.ctx&&t.ctx.draw&&t.ctx.draw()}),a},_doPaintEl:function(t,e,i,n){var o=e.ctx,a=t.transform;if((e.__dirty||i)&&!t.invisible&&0!==t.style.opacity&&(!a||a[0]||a[3])&&(!t.culling||!ei(t,this._width,this._height))){var r=t.__clipPaths;n.prevElClipPaths&&!ii(r,n.prevElClipPaths)||(n.prevElClipPaths&&(e.ctx.restore(),n.prevElClipPaths=null,n.prevEl=null),r&&(o.save(),ni(r,o),n.prevElClipPaths=r)),t.beforeBrush&&t.beforeBrush(o),t.brush(o,n.prevEl||null),n.prevEl=t,t.afterBrush&&t.afterBrush(o)}},getLayer:function(t,e){this._singleCanvas&&!this._needsManuallyCompositing&&(t=314159);var i=this._layers[t];return i||((i=new E_("zr_"+t,this,this.dpr)).zlevel=t,i.__builtin__=!0,this._layerConfig[t]&&n(i,this._layerConfig[t],!0),e&&(i.virtual=e),this.insertLayer(t,i),i.initContext()),i},insertLayer:function(t,e){var i=this._layers,n=this._zlevelList,o=n.length,a=null,r=-1,s=this._domRoot;if(i[t])v_("ZLevel "+t+" has been used already");else if(ti(e)){if(o>0&&t>n[0]){for(r=0;r<o-1&&!(n[r]<t&&n[r+1]>t);r++);a=i[n[r]]}if(n.splice(r+1,0,t),i[t]=e,!e.virtual)if(a){var l=a.dom;l.nextSibling?s.insertBefore(e.dom,l.nextSibling):s.appendChild(e.dom)}else s.firstChild?s.insertBefore(e.dom,s.firstChild):s.appendChild(e.dom)}else v_("Layer of zlevel "+t+" is not valid")},eachLayer:function(t,e){var i,n,o=this._zlevelList;for(n=0;n<o.length;n++)i=o[n],t.call(e,this._layers[i],i)},eachBuiltinLayer:function(t,e){var i,n,o,a=this._zlevelList;for(o=0;o<a.length;o++)n=a[o],(i=this._layers[n]).__builtin__&&t.call(e,i,n)},eachOtherLayer:function(t,e){var i,n,o,a=this._zlevelList;for(o=0;o<a.length;o++)n=a[o],(i=this._layers[n]).__builtin__||t.call(e,i,n)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){function e(t){i&&(i.__endIndex!==t&&(i.__dirty=!0),i.__endIndex=t)}if(this.eachBuiltinLayer(function(t,e){t.__dirty=t.__used=!1}),this._singleCanvas)for(o=1;o<t.length;o++)if((r=t[o]).zlevel!==t[o-1].zlevel||r.incremental){this._needsManuallyCompositing=!0;break}for(var i=null,n=0,o=0;o<t.length;o++){var a,r=t[o],s=r.zlevel;r.incremental?((a=this.getLayer(s+.001,this._needsManuallyCompositing)).incremental=!0,n=1):a=this.getLayer(s+(n>0?.01:0),this._needsManuallyCompositing),a.__builtin__||v_("ZLevel "+s+" has been used by unkown layer "+a.id),a!==i&&(a.__used=!0,a.__startIndex!==o&&(a.__dirty=!0),a.__startIndex=o,a.incremental?a.__drawIndex=-1:a.__drawIndex=o,e(o),i=a),r.__dirty&&(a.__dirty=!0,a.incremental&&a.__drawIndex<0&&(a.__drawIndex=o))}e(o),this.eachBuiltinLayer(function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var i=this._layerConfig;i[t]?n(i[t],e,!0):i[t]=e;for(var o=0;o<this._zlevelList.length;o++){var a=this._zlevelList[o];a!==t&&a!==t+.01||n(this._layers[a],i[t],!0)}}},delLayer:function(t){var e=this._layers,i=this._zlevelList,n=e[t];n&&(n.dom.parentNode.removeChild(n.dom),delete e[t],i.splice(l(i,t),1))},resize:function(t,e){if(this._domRoot.style){var i=this._domRoot;i.style.display="none";var n=this._opts;if(null!=t&&(n.width=t),null!=e&&(n.height=e),t=this._getSize(0),e=this._getSize(1),i.style.display="",this._width!=t||e!=this._height){i.style.width=t+"px",i.style.height=e+"px";for(var o in this._layers)this._layers.hasOwnProperty(o)&&this._layers[o].resize(t,e);d(this._progressiveLayers,function(i){i.resize(t,e)}),this.refresh(!0)}this._width=t,this._height=e}else{if(null==t||null==e)return;this._width=t,this._height=e,this.getLayer(314159).resize(t,e)}return this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas&&!this._compositeManually)return this._layers[314159].dom;var e=new E_("image",this,t.pixelRatio||this.dpr);if(e.initContext(),e.clearColor=t.backgroundColor,e.clear(),t.pixelRatio<=this.dpr){this.refresh();var i=e.dom.width,n=e.dom.height,o=e.ctx;this.eachLayer(function(t){t.__builtin__?o.drawImage(t.dom,0,0,i,n):t.renderToCanvas&&(e.ctx.save(),t.renderToCanvas(e.ctx),e.ctx.restore())})}else for(var a={},r=this.storage.getDisplayList(!0),s=0;s<r.length;s++){var l=r[s];this._doPaintEl(l,e,!0,a)}return e.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,i=["width","height"][t],n=["clientWidth","clientHeight"][t],o=["paddingLeft","paddingTop"][t],a=["paddingRight","paddingBottom"][t];if(null!=e[i]&&"auto"!==e[i])return parseFloat(e[i]);var r=this.root,s=document.defaultView.getComputedStyle(r);return(r[n]||Qe(s[i])||Qe(r.style[i]))-(Qe(s[o])||0)-(Qe(s[a])||0)|0},pathToImage:function(t,e){e=e||this.dpr;var i=document.createElement("canvas"),n=i.getContext("2d"),o=t.getBoundingRect(),a=t.style,r=a.shadowBlur*e,s=a.shadowOffsetX*e,l=a.shadowOffsetY*e,h=a.hasStroke()?a.lineWidth:0,u=Math.max(h/2,-s+r),c=Math.max(h/2,s+r),d=Math.max(h/2,-l+r),f=Math.max(h/2,l+r),p=o.width+u+c,g=o.height+d+f;i.width=p*e,i.height=g*e,n.scale(e,e),n.clearRect(0,0,p,g),n.dpr=e;var m={position:t.position,rotation:t.rotation,scale:t.scale};t.position=[u-o.x,d-o.y],t.rotation=0,t.scale=[1,1],t.updateTransform(),t&&t.brush(n);var v=new Je({style:{x:0,y:0,image:i}});return null!=m.position&&(v.position=t.position=m.position),null!=m.rotation&&(v.rotation=t.rotation=m.rotation),null!=m.scale&&(v.scale=t.scale=m.scale),v}};var K_="undefined"!=typeof window&&!!window.addEventListener,J_=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Q_=K_?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0},tw=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,Hx.call(this)};tw.prototype={constructor:tw,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),i=0;i<e.length;i++)this.addClip(e[i])},removeClip:function(t){var e=l(this._clips,t);e>=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),i=0;i<e.length;i++)this.removeClip(e[i]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,i=this._clips,n=i.length,o=[],a=[],r=0;r<n;r++){var s=i[r],l=s.step(t,e);l&&(o.push(l),a.push(s))}for(r=0;r<n;)i[r]._needsRemove?(i[r]=i[n-1],i.pop(),n--):r++;n=o.length;for(r=0;r<n;r++)a[r].fire(o[r]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(z_(t),!e._paused&&e._update())}var e=this;this._running=!0,z_(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},animate:function(t,e){var i=new f_(t,(e=e||{}).loop,e.getter,e.setter);return this.addAnimator(i),i}},u(tw,Hx);var ew=function(){this._track=[]};ew.prototype={constructor:ew,recognize:function(t,e,i){return this._doTrack(t,e,i),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,i){var n=t.touches;if(n){for(var o={points:[],touches:[],target:e,event:t},a=0,r=n.length;a<r;a++){var s=n[a],l=ri(i,s,{});o.points.push([l.zrX,l.zrY]),o.touches.push(s)}this._track.push(o)}},_recognize:function(t){for(var e in iw)if(iw.hasOwnProperty(e)){var i=iw[e](this._track,t);if(i)return i}}};var iw={pinch:function(t,e){var i=t.length;if(i){var n=(t[i-1]||{}).points,o=(t[i-2]||{}).points||n;if(o&&o.length>1&&n&&n.length>1){var a=di(n)/di(o);!isFinite(a)&&(a=1),e.pinchScale=a;var r=fi(n);return e.pinchX=r[0],e.pinchY=r[1],{type:"pinch",target:t[0].target,event:e}}}}},nw=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],ow=["touchstart","touchend","touchmove"],aw={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},rw=f(nw,function(t){var e=t.replace("mouse","pointer");return aw[e]?e:t}),sw={mousemove:function(t){t=li(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){var e=(t=li(this.dom,t)).toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){(t=li(this.dom,t)).zrByTouch=!0,this._lastTouchMoment=new Date,gi(this,t,"start"),sw.mousemove.call(this,t),sw.mousedown.call(this,t),mi(this)},touchmove:function(t){(t=li(this.dom,t)).zrByTouch=!0,gi(this,t,"change"),sw.mousemove.call(this,t),mi(this)},touchend:function(t){(t=li(this.dom,t)).zrByTouch=!0,gi(this,t,"end"),sw.mouseup.call(this,t),+new Date-this._lastTouchMoment<300&&sw.click.call(this,t),mi(this)},pointerdown:function(t){sw.mousedown.call(this,t)},pointermove:function(t){vi(t)||sw.mousemove.call(this,t)},pointerup:function(t){sw.mouseup.call(this,t)},pointerout:function(t){vi(t)||sw.mouseout.call(this,t)}};d(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){sw[t]=function(e){e=li(this.dom,e),this.trigger(t,e)}});var lw=xi.prototype;lw.dispose=function(){for(var t=nw.concat(ow),e=0;e<t.length;e++){var i=t[e];ui(this.dom,pi(i),this._handlers[i])}},lw.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},u(xi,Hx);var hw=!_x.canvasSupported,uw={canvas:$_},cw={},dw=function(t,e,i){i=i||{},this.dom=e,this.id=t;var n=this,o=new T_,a=i.renderer;if(hw){if(!uw.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");a="vml"}else a&&uw[a]||(a="canvas");var r=new uw[a](e,o,i,t);this.storage=o,this.painter=r;var s=_x.node||_x.worker?null:new xi(r.getViewportRoot());this.handler=new jx(o,r,s,r.root),this.animation=new tw({stage:{update:m(this.flush,this)}}),this.animation.start(),this._needsRefresh;var l=o.delFromStorage,h=o.addToStorage;o.delFromStorage=function(t){l.call(o,t),t&&t.removeSelfFromZr(n)},o.addToStorage=function(t){h.call(o,t),t.addSelfToZr(n)}};dw.prototype={constructor:dw,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer(t,e),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},flush:function(){this._needsRefresh&&this.refreshImmediately(),this._needsRefreshHover&&this.refreshHoverImmediately()},addHover:function(t,e){this.painter.addHover&&(this.painter.addHover(t,e),this.refreshHover())},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e){return this.painter.pathToImage(t,e)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},findHover:function(t,e){return this.handler.findHover(t,e)},on:function(t,e,i){this.handler.on(t,e,i)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,bi(this.id)}};var fw=(Object.freeze||Object)({version:"4.0.1",init:_i,dispose:function(t){if(t)t.dispose();else{for(var e in cw)cw.hasOwnProperty(e)&&cw[e].dispose();cw={}}return this},getInstance:function(t){return cw[t]},registerPainter:wi}),pw=d,gw=w,mw=y,vw="\0-",yw=["fontStyle","fontWeight","fontSize","fontFamily","rich","tag","color","textBorderColor","textBorderWidth","width","height","lineHeight","align","verticalAlign","baseline","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY","backgroundColor","borderColor","borderWidth","borderRadius","padding"],xw=0,_w=".",ww="___EC__COMPONENT__CONTAINER___",bw=0,Sw=function(t){for(var e=0;e<t.length;e++)t[e][1]||(t[e][1]=t[e][0]);return function(e,i,n){for(var o={},a=0;a<t.length;a++){var r=t[a][1];if(!(i&&l(i,r)>=0||n&&l(n,r)<0)){var s=e.getShallow(r);null!=s&&(o[t[a][0]]=s)}}return o}},Mw=Sw([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),Iw={getLineStyle:function(t){var e=Mw(this,t),i=this.getLineDash(e.lineWidth);return i&&(e.lineDash=i),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),i=Math.max(t,2),n=4*t;return"solid"===e||null==e?null:"dashed"===e?[n,n]:[i,i]}},Tw=Sw([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),Aw={getAreaStyle:function(t,e){return Tw(this,t,e)}},Dw=Math.pow,Cw=Math.sqrt,Lw=1e-8,kw=1e-4,Pw=Cw(3),Ow=1/3,Nw=V(),Ew=V(),zw=V(),Rw=Math.min,Bw=Math.max,Vw=Math.sin,Gw=Math.cos,Ww=2*Math.PI,Fw=V(),Hw=V(),Zw=V(),Uw=[],jw=[],Xw={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},Yw=[],qw=[],$w=[],Kw=[],Jw=Math.min,Qw=Math.max,tb=Math.cos,eb=Math.sin,ib=Math.sqrt,nb=Math.abs,ob="undefined"!=typeof Float32Array,ab=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};ab.prototype={constructor:ab,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=nb(1/g_/t)||0,this._uy=nb(1/g_/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(Xw.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var i=nb(t-this._xi)>this._ux||nb(e-this._yi)>this._uy||this._len<5;return this.addData(Xw.L,t,e),this._ctx&&i&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),i&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,i,n,o,a){return this.addData(Xw.C,t,e,i,n,o,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,i,n,o,a):this._ctx.bezierCurveTo(t,e,i,n,o,a)),this._xi=o,this._yi=a,this},quadraticCurveTo:function(t,e,i,n){return this.addData(Xw.Q,t,e,i,n),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,i,n):this._ctx.quadraticCurveTo(t,e,i,n)),this._xi=i,this._yi=n,this},arc:function(t,e,i,n,o,a){return this.addData(Xw.A,t,e,i,i,n,o-n,0,a?0:1),this._ctx&&this._ctx.arc(t,e,i,n,o,a),this._xi=tb(o)*i+t,this._yi=eb(o)*i+t,this},arcTo:function(t,e,i,n,o){return this._ctx&&this._ctx.arcTo(t,e,i,n,o),this},rect:function(t,e,i,n){return this._ctx&&this._ctx.rect(t,e,i,n),this.addData(Xw.R,t,e,i,n),this},closePath:function(){this.addData(Xw.Z);var t=this._ctx,e=this._x0,i=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,i),t.closePath()),this._xi=e,this._yi=i,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,i=0;i<t.length;i++)e+=t[i];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length==e||!ob||(this.data=new Float32Array(e));for(var i=0;i<e;i++)this.data[i]=t[i];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,i=0,n=this._len,o=0;o<e;o++)i+=t[o].len();ob&&this.data instanceof Float32Array&&(this.data=new Float32Array(n+i));for(o=0;o<e;o++)for(var a=t[o].data,r=0;r<a.length;r++)this.data[n++]=a[r];this._len=n},addData:function(t){if(this._saveData){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var i=0;i<arguments.length;i++)e[this._len++]=arguments[i];this._prevCmd=t}},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var i,n,o=this._dashSum,a=this._dashOffset,r=this._lineDash,s=this._ctx,l=this._xi,h=this._yi,u=t-l,c=e-h,d=ib(u*u+c*c),f=l,p=h,g=r.length;for(u/=d,c/=d,a<0&&(a=o+a),f-=(a%=o)*u,p-=a*c;u>0&&f<=t||u<0&&f>=t||0==u&&(c>0&&p<=e||c<0&&p>=e);)f+=u*(i=r[n=this._dashIdx]),p+=c*i,this._dashIdx=(n+1)%g,u>0&&f<l||u<0&&f>l||c>0&&p<h||c<0&&p>h||s[n%2?"moveTo":"lineTo"](u>=0?Jw(f,t):Qw(f,t),c>=0?Jw(p,e):Qw(p,e));u=f-t,c=p-e,this._dashOffset=-ib(u*u+c*c)},_dashedBezierTo:function(t,e,i,n,o,a){var r,s,l,h,u,c=this._dashSum,d=this._dashOffset,f=this._lineDash,p=this._ctx,g=this._xi,m=this._yi,v=ji,y=0,x=this._dashIdx,_=f.length,w=0;for(d<0&&(d=c+d),d%=c,r=0;r<1;r+=.1)s=v(g,t,i,o,r+.1)-v(g,t,i,o,r),l=v(m,e,n,a,r+.1)-v(m,e,n,a,r),y+=ib(s*s+l*l);for(;x<_&&!((w+=f[x])>d);x++);for(r=(w-d)/y;r<=1;)h=v(g,t,i,o,r),u=v(m,e,n,a,r),x%2?p.moveTo(h,u):p.lineTo(h,u),r+=f[x]/y,x=(x+1)%_;x%2!=0&&p.lineTo(o,a),s=o-h,l=a-u,this._dashOffset=-ib(s*s+l*l)},_dashedQuadraticTo:function(t,e,i,n){var o=i,a=n;i=(i+2*t)/3,n=(n+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,i,n,o,a)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,ob&&(this.data=new Float32Array(t)))},getBoundingRect:function(){Yw[0]=Yw[1]=$w[0]=$w[1]=Number.MAX_VALUE,qw[0]=qw[1]=Kw[0]=Kw[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,i=0,n=0,o=0,a=0;a<t.length;){var r=t[a++];switch(1==a&&(n=e=t[a],o=i=t[a+1]),r){case Xw.M:e=n=t[a++],i=o=t[a++],$w[0]=n,$w[1]=o,Kw[0]=n,Kw[1]=o;break;case Xw.L:rn(e,i,t[a],t[a+1],$w,Kw),e=t[a++],i=t[a++];break;case Xw.C:sn(e,i,t[a++],t[a++],t[a++],t[a++],t[a],t[a+1],$w,Kw),e=t[a++],i=t[a++];break;case Xw.Q:ln(e,i,t[a++],t[a++],t[a],t[a+1],$w,Kw),e=t[a++],i=t[a++];break;case Xw.A:var s=t[a++],l=t[a++],h=t[a++],u=t[a++],c=t[a++],d=t[a++]+c,f=(t[a++],1-t[a++]);1==a&&(n=tb(c)*h+s,o=eb(c)*u+l),hn(s,l,h,u,c,d,f,$w,Kw),e=tb(d)*h+s,i=eb(d)*u+l;break;case Xw.R:rn(n=e=t[a++],o=i=t[a++],n+t[a++],o+t[a++],$w,Kw);break;case Xw.Z:e=n,i=o}tt(Yw,Yw,$w),et(qw,qw,Kw)}return 0===a&&(Yw[0]=Yw[1]=qw[0]=qw[1]=0),new Kt(Yw[0],Yw[1],qw[0]-Yw[0],qw[1]-Yw[1])},rebuildPath:function(t){for(var e,i,n,o,a,r,s=this.data,l=this._ux,h=this._uy,u=this._len,c=0;c<u;){var d=s[c++];switch(1==c&&(e=n=s[c],i=o=s[c+1]),d){case Xw.M:e=n=s[c++],i=o=s[c++],t.moveTo(n,o);break;case Xw.L:a=s[c++],r=s[c++],(nb(a-n)>l||nb(r-o)>h||c===u-1)&&(t.lineTo(a,r),n=a,o=r);break;case Xw.C:t.bezierCurveTo(s[c++],s[c++],s[c++],s[c++],s[c++],s[c++]),n=s[c-2],o=s[c-1];break;case Xw.Q:t.quadraticCurveTo(s[c++],s[c++],s[c++],s[c++]),n=s[c-2],o=s[c-1];break;case Xw.A:var f=s[c++],p=s[c++],g=s[c++],m=s[c++],v=s[c++],y=s[c++],x=s[c++],_=s[c++],w=g>m?g:m,b=g>m?1:g/m,S=g>m?m/g:1,M=v+y;Math.abs(g-m)>.001?(t.translate(f,p),t.rotate(x),t.scale(b,S),t.arc(0,0,w,v,M,1-_),t.scale(1/b,1/S),t.rotate(-x),t.translate(-f,-p)):t.arc(f,p,w,v,M,1-_),1==c&&(e=tb(v)*g+f,i=eb(v)*m+p),n=tb(M)*g+f,o=eb(M)*m+p;break;case Xw.R:e=n=s[c],i=o=s[c+1],t.rect(s[c++],s[c++],s[c++],s[c++]);break;case Xw.Z:t.closePath(),n=e,o=i}}}},ab.CMD=Xw;var rb=2*Math.PI,sb=2*Math.PI,lb=ab.CMD,hb=2*Math.PI,ub=1e-4,cb=[-1,-1,-1],db=[-1,-1],fb=N_.prototype.getCanvasPattern,pb=Math.abs,gb=new ab(!0);Mn.prototype={constructor:Mn,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var i=this.style,n=this.path||gb,o=i.hasStroke(),a=i.hasFill(),r=i.fill,s=i.stroke,l=a&&!!r.colorStops,h=o&&!!s.colorStops,u=a&&!!r.image,c=o&&!!s.image;if(i.bind(t,this,e),this.setTransform(t),this.__dirty){var d;l&&(d=d||this.getBoundingRect(),this._fillGradient=i.getGradient(t,r,d)),h&&(d=d||this.getBoundingRect(),this._strokeGradient=i.getGradient(t,s,d))}l?t.fillStyle=this._fillGradient:u&&(t.fillStyle=fb.call(r,t)),h?t.strokeStyle=this._strokeGradient:c&&(t.strokeStyle=fb.call(s,t));var f=i.lineDash,p=i.lineDashOffset,g=!!t.setLineDash,m=this.getGlobalScale();n.setScale(m[0],m[1]),this.__dirtyPath||f&&!g&&o?(n.beginPath(t),f&&!g&&(n.setLineDash(f),n.setLineDashOffset(p)),this.buildPath(n,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),a&&n.fill(t),f&&g&&(t.setLineDash(f),t.lineDashOffset=p),o&&n.stroke(t),f&&g&&t.setLineDash([]),null!=i.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))},buildPath:function(t,e,i){},createPathProxy:function(){this.path=new ab},getBoundingRect:function(){var t=this._rect,e=this.style,i=!t;if(i){var n=this.path;n||(n=this.path=new ab),this.__dirtyPath&&(n.beginPath(),this.buildPath(n,this.shape,!1)),t=n.getBoundingRect()}if(this._rect=t,e.hasStroke()){var o=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||i){o.copy(t);var a=e.lineWidth,r=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(a=Math.max(a,this.strokeContainThreshold||4)),r>1e-10&&(o.width+=a/r,o.height+=a/r,o.x-=a/r/2,o.y-=a/r/2)}return o}return t},contain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect(),o=this.style;if(t=i[0],e=i[1],n.contain(t,e)){var a=this.path.data;if(o.hasStroke()){var r=o.lineWidth,s=o.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(o.hasFill()||(r=Math.max(r,this.strokeContainThreshold)),Sn(a,r/s,t,e)))return!0}if(o.hasFill())return bn(a,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):Ke.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var i=this.shape;if(i){if(w(t))for(var n in t)t.hasOwnProperty(n)&&(i[n]=t[n]);else i[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&pb(t[0]-1)>1e-10&&pb(t[3]-1)>1e-10?Math.sqrt(pb(t[0]*t[3]-t[2]*t[1])):1}},Mn.extend=function(t){var e=function(e){Mn.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var i=t.shape;if(i){this.shape=this.shape||{};var n=this.shape;for(var o in i)!n.hasOwnProperty(o)&&i.hasOwnProperty(o)&&(n[o]=i[o])}t.init&&t.init.call(this,e)};h(e,Mn);for(var i in t)"style"!==i&&"shape"!==i&&(e.prototype[i]=t[i]);return e},h(Mn,Ke);var mb=ab.CMD,vb=[[],[],[]],yb=Math.sqrt,xb=Math.atan2,_b=function(t,e){var i,n,o,a,r,s,l=t.data,h=mb.M,u=mb.C,c=mb.L,d=mb.R,f=mb.A,p=mb.Q;for(o=0,a=0;o<l.length;){switch(i=l[o++],a=o,n=0,i){case h:case c:n=1;break;case u:n=3;break;case p:n=2;break;case f:var g=e[4],m=e[5],v=yb(e[0]*e[0]+e[1]*e[1]),y=yb(e[2]*e[2]+e[3]*e[3]),x=xb(-e[1]/y,e[0]/v);l[o]*=v,l[o++]+=g,l[o]*=y,l[o++]+=m,l[o++]*=v,l[o++]*=y,l[o++]+=x,l[o++]+=x,a=o+=2;break;case d:s[0]=l[o++],s[1]=l[o++],Q(s,s,e),l[a++]=s[0],l[a++]=s[1],s[0]+=l[o++],s[1]+=l[o++],Q(s,s,e),l[a++]=s[0],l[a++]=s[1]}for(r=0;r<n;r++)(s=vb[r])[0]=l[o++],s[1]=l[o++],Q(s,s,e),l[a++]=s[0],l[a++]=s[1]}},wb=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"],bb=Math.sqrt,Sb=Math.sin,Mb=Math.cos,Ib=Math.PI,Tb=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},Ab=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(Tb(t)*Tb(e))},Db=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(Ab(t,e))},Cb=function(t){Ke.call(this,t)};Cb.prototype={constructor:Cb,type:"text",brush:function(t,e){var i=this.style;this.__dirty&&Oe(i),i.fill=i.stroke=i.shadowBlur=i.shadowColor=i.shadowOffsetX=i.shadowOffsetY=null;var n=i.text;null!=n&&(n+=""),i.bind(t,this,e),$e(n,i)&&(this.setTransform(t),Ee(this,t,n,i),this.restoreTransform(t))},getBoundingRect:function(){var t=this.style;if(this.__dirty&&Oe(t),!this._rect){var e=t.text;null!=e?e+="":e="";var i=me(t.text+"",t.font,t.textAlign,t.textVerticalAlign,t.textPadding,t.rich);if(i.x+=t.x||0,i.y+=t.y||0,je(t.textStroke,t.textStrokeWidth)){var n=t.textStrokeWidth;i.x-=n/2,i.y-=n/2,i.width+=n,i.height+=n}this._rect=i}return this._rect}},h(Cb,Ke);var Lb=Mn.extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,i){i&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}}),kb=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]],Pb=function(t){return _x.browser.ie&&_x.browser.version>=11?function(){var e,i=this.__clipPaths,n=this.style;if(i)for(var o=0;o<i.length;o++){var a=i[o],r=a&&a.shape,s=a&&a.type;if(r&&("sector"===s&&r.startAngle===r.endAngle||"rect"===s&&(!r.width||!r.height))){for(l=0;l<kb.length;l++)kb[l][2]=n[kb[l][0]],n[kb[l][0]]=kb[l][1];e=!0;break}}if(t.apply(this,arguments),e)for(var l=0;l<kb.length;l++)n[kb[l][0]]=kb[l][2]}:t},Ob=Mn.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:Pb(Mn.prototype.brush),buildPath:function(t,e){var i=e.cx,n=e.cy,o=Math.max(e.r0||0,0),a=Math.max(e.r,0),r=e.startAngle,s=e.endAngle,l=e.clockwise,h=Math.cos(r),u=Math.sin(r);t.moveTo(h*o+i,u*o+n),t.lineTo(h*a+i,u*a+n),t.arc(i,n,a,r,s,!l),t.lineTo(Math.cos(s)*o+i,Math.sin(s)*o+n),0!==o&&t.arc(i,n,o,s,r,l),t.closePath()}}),Nb=Mn.extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var i=e.cx,n=e.cy,o=2*Math.PI;t.moveTo(i+e.r,n),t.arc(i,n,e.r,0,o,!1),t.moveTo(i+e.r0,n),t.arc(i,n,e.r0,0,o,!0)}}),Eb=function(t,e){for(var i=t.length,n=[],o=0,a=1;a<i;a++)o+=$(t[a-1],t[a]);var r=o/2;r=r<i?i:r;for(a=0;a<r;a++){var s,l,h,u=a/(r-1)*(e?i:i-1),c=Math.floor(u),d=u-c,f=t[c%i];e?(s=t[(c-1+i)%i],l=t[(c+1)%i],h=t[(c+2)%i]):(s=t[0===c?c:c-1],l=t[c>i-2?i-1:c+1],h=t[c>i-3?i-1:c+2]);var p=d*d,g=d*p;n.push([Ln(s[0],f[0],l[0],h[0],d,p,g),Ln(s[1],f[1],l[1],h[1],d,p,g)])}return n},zb=function(t,e,i,n){var o,a,r,s,l=[],h=[],u=[],c=[];if(n){r=[1/0,1/0],s=[-1/0,-1/0];for(var d=0,f=t.length;d<f;d++)tt(r,r,t[d]),et(s,s,t[d]);tt(r,r,n[0]),et(s,s,n[1])}for(var d=0,f=t.length;d<f;d++){var p=t[d];if(i)o=t[d?d-1:f-1],a=t[(d+1)%f];else{if(0===d||d===f-1){l.push(W(t[d]));continue}o=t[d-1],a=t[d+1]}U(h,a,o),Y(h,h,e);var g=$(p,o),m=$(p,a),v=g+m;0!==v&&(g/=v,m/=v),Y(u,h,-g),Y(c,h,m);var y=H([],p,u),x=H([],p,c);n&&(et(y,y,r),tt(y,y,s),et(x,x,r),tt(x,x,s)),l.push(y),l.push(x)}return i&&l.push(l.shift()),l},Rb=Mn.extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){kn(t,e,!0)}}),Bb=Mn.extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){kn(t,e,!1)}}),Vb=Mn.extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,n=e.y,o=e.width,a=e.height;e.r?Pe(t,e):t.rect(i,n,o,a),t.closePath()}}),Gb=Mn.extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,o=e.x2,a=e.y2,r=e.percent;0!==r&&(t.moveTo(i,n),r<1&&(o=i*(1-r)+o*r,a=n*(1-r)+a*r),t.lineTo(o,a))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}}),Wb=[],Fb=Mn.extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,o=e.x2,a=e.y2,r=e.cpx1,s=e.cpy1,l=e.cpx2,h=e.cpy2,u=e.percent;0!==u&&(t.moveTo(i,n),null==l||null==h?(u<1&&(nn(i,r,o,u,Wb),r=Wb[1],o=Wb[2],nn(n,s,a,u,Wb),s=Wb[1],a=Wb[2]),t.quadraticCurveTo(r,s,o,a)):(u<1&&($i(i,r,l,o,u,Wb),r=Wb[1],l=Wb[2],o=Wb[3],$i(n,s,h,a,u,Wb),s=Wb[1],h=Wb[2],a=Wb[3]),t.bezierCurveTo(r,s,l,h,o,a)))},pointAt:function(t){return Pn(this.shape,t,!1)},tangentAt:function(t){var e=Pn(this.shape,t,!0);return q(e,e)}}),Hb=Mn.extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.cx,n=e.cy,o=Math.max(e.r,0),a=e.startAngle,r=e.endAngle,s=e.clockwise,l=Math.cos(a),h=Math.sin(a);t.moveTo(l*o+i,h*o+n),t.arc(i,n,o,a,r,!s)}}),Zb=Mn.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,i=0;i<e.length;i++)t=t||e[i].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),i=0;i<t.length;i++)t[i].path||t[i].createPathProxy(),t[i].path.setScale(e[0],e[1])},buildPath:function(t,e){for(var i=e.paths||[],n=0;n<i.length;n++)i[n].buildPath(t,i[n].shape,!0)},afterBrush:function(){for(var t=this.shape.paths||[],e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),Mn.prototype.getBoundingRect.call(this)}}),Ub=function(t){this.colorStops=t||[]};Ub.prototype={constructor:Ub,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}};var jb=function(t,e,i,n,o,a){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==i?1:i,this.y2=null==n?0:n,this.type="linear",this.global=a||!1,Ub.call(this,o)};jb.prototype={constructor:jb},h(jb,Ub);var Xb=function(t,e,i,n,o){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==i?.5:i,this.type="radial",this.global=o||!1,Ub.call(this,n)};Xb.prototype={constructor:Xb},h(Xb,Ub),On.prototype.incremental=!0,On.prototype.clearDisplaybles=function(){this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.dirty(),this.notClear=!1},On.prototype.addDisplayable=function(t,e){e?this._temporaryDisplayables.push(t):this._displayables.push(t),this.dirty()},On.prototype.addDisplayables=function(t,e){e=e||!1;for(var i=0;i<t.length;i++)this.addDisplayable(t[i],e)},On.prototype.eachPendingDisplayable=function(t){for(e=this._cursor;e<this._displayables.length;e++)t&&t(this._displayables[e]);for(var e=0;e<this._temporaryDisplayables.length;e++)t&&t(this._temporaryDisplayables[e])},On.prototype.update=function(){this.updateTransform();for(t=this._cursor;t<this._displayables.length;t++)(e=this._displayables[t]).parent=this,e.update(),e.parent=null;for(var t=0;t<this._temporaryDisplayables.length;t++){var e=this._temporaryDisplayables[t];e.parent=this,e.update(),e.parent=null}},On.prototype.brush=function(t,e){for(i=this._cursor;i<this._displayables.length;i++)(n=this._temporaryDisplayables[i]).beforeBrush&&n.beforeBrush(t),n.brush(t,i===this._cursor?null:this._displayables[i-1]),n.afterBrush&&n.afterBrush(t);this._cursor=i;for(var i=0;i<this._temporaryDisplayables.length;i++){var n=this._temporaryDisplayables[i];n.beforeBrush&&n.beforeBrush(t),n.brush(t,0===i?null:this._temporaryDisplayables[i-1]),n.afterBrush&&n.afterBrush(t)}this._temporaryDisplayables=[],this.notClear=!0};var Yb=[];On.prototype.getBoundingRect=function(){if(!this._rect){for(var t=new Kt(1/0,1/0,-1/0,-1/0),e=0;e<this._displayables.length;e++){var i=this._displayables[e],n=i.getBoundingRect().clone();i.needLocalTransform()&&n.applyTransform(i.getLocalTransform(Yb)),t.union(n)}this._rect=t}return this._rect},On.prototype.contain=function(t,e){var i=this.transformCoordToLocal(t,e);if(this.getBoundingRect().contain(i[0],i[1]))for(var n=0;n<this._displayables.length;n++)if(this._displayables[n].contain(t,e))return!0;return!1},h(On,Ke);var qb=Math.round,$b=Math.max,Kb=Math.min,Jb={},Qb=function(t,e){for(var i=[],n=t.length,o=0;o<n;o++){var a=t[o];a.path||a.createPathProxy(),a.__dirtyPath&&a.buildPath(a.path,a.shape,!0),i.push(a.path)}var r=new Mn(e);return r.createPathProxy(),r.buildPath=function(t){t.appendPath(i);var e=t.getContext();e&&t.rebuildPath(e)},r},tS=(Object.freeze||Object)({extendShape:Nn,extendPath:function(t,e){return Cn(t,e)},makePath:En,makeImage:zn,mergePath:Qb,resizePath:Bn,subPixelOptimizeLine:Vn,subPixelOptimizeRect:Gn,subPixelOptimize:Wn,setHoverStyle:to,setLabelStyle:eo,setTextStyle:io,setText:function(t,e,i){var n,o={isRectText:!0};!1===i?n=!0:o.autoColor=i,no(t,e,o,n),t.host&&t.host.dirty&&t.host.dirty(!1)},getFont:ho,updateProps:co,initProps:fo,getTransform:po,applyTransform:go,transformDirection:mo,groupTransition:vo,clipPointsByRect:yo,clipRectByRect:function(t,e){var i=$b(t.x,e.x),n=Kb(t.x+t.width,e.x+e.width),o=$b(t.y,e.y),a=Kb(t.y+t.height,e.y+e.height);if(n>=i&&a>=o)return{x:i,y:o,width:n-i,height:a-o}},createIcon:xo,Group:S_,Image:Je,Text:Cb,Circle:Lb,Sector:Ob,Ring:Nb,Polygon:Rb,Polyline:Bb,Rect:Vb,Line:Gb,BezierCurve:Fb,Arc:Hb,IncrementalDisplayable:On,CompoundPath:Zb,LinearGradient:jb,RadialGradient:Xb,BoundingRect:Kt}),eS=["textStyle","color"],iS={getTextColor:function(t){var e=this.ecModel;return this.getShallow("color")||(!t&&e?e.get(eS):null)},getFont:function(){return ho({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},getTextRect:function(t){return me(t,this.getFont(),this.getShallow("align"),this.getShallow("verticalAlign")||this.getShallow("baseline"),this.getShallow("padding"),this.getShallow("rich"),this.getShallow("truncateText"))}},nS=Sw([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]),oS={getItemStyle:function(t,e){var i=nS(this,t,e),n=this.getBorderLineDash();return n&&(i.lineDash=n),i},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}},aS=u,rS=Pi();_o.prototype={constructor:_o,init:null,mergeOption:function(t){n(this.option,t,!0)},get:function(t,e){return null==t?this.option:wo(this.option,this.parsePath(t),!e&&bo(this,t))},getShallow:function(t,e){var i=this.option,n=null==i?i:i[t],o=!e&&bo(this,t);return null==n&&o&&(n=o.getShallow(t)),n},getModel:function(t,e){var i,n=null==t?this.option:wo(this.option,t=this.parsePath(t));return e=e||(i=bo(this,t))&&i.getModel(t),new _o(n,e,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){return new(0,this.constructor)(i(this.option))},setReadOnly:function(t){},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){rS(this).getParent=t},isAnimationEnabled:function(){if(!_x.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},Vi(_o),Gi(_o),aS(_o,Iw),aS(_o,Aw),aS(_o,iS),aS(_o,oS);var sS=0,lS=1e-4,hS=9007199254740991,uS=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/,cS=(Object.freeze||Object)({linearMap:Io,parsePercent:To,round:Ao,asc:Do,getPrecision:Co,getPrecisionSafe:Lo,getPixelPrecision:ko,getPercentWithPrecision:Po,MAX_SAFE_INTEGER:hS,remRadian:Oo,isRadianAroundZero:No,parseDate:Eo,quantity:zo,nice:Bo,reformIntervals:Vo,isNumeric:Go}),dS=L,fS=["a","b","c","d","e","f","g"],pS=function(t,e){return"{"+t+(null==e?"":e)+"}"},gS=function(t){return t<10?"0"+t:t},mS=be,vS=me,yS=(Object.freeze||Object)({addCommas:Wo,toCamelCase:Fo,normalizeCssArray:dS,encodeHTML:Ho,formatTpl:Zo,formatTplSimple:Uo,getTooltipMarker:jo,formatTime:Xo,capitalFirst:Yo,truncateText:mS,getTextRect:vS}),xS=d,_S=["left","right","top","bottom","width","height"],wS=[["width","left","right"],["height","top","bottom"]],bS=qo,SS=(v(qo,"vertical"),v(qo,"horizontal"),{getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}),MS=Pi(),IS=_o.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,i,n){_o.call(this,t,e,i,n),this.uid=So("ec_cpt_model")},init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i)},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,o=i?ea(t):{};n(t,e.getTheme().get(this.mainType)),n(t,this.getDefaultOption()),i&&ta(t,o,i)},mergeOption:function(t,e){n(this.option,t,!0);var i=this.layoutMode;i&&ta(this.option,t,i)},optionUpdated:function(t,e){},getDefaultOption:function(){var t=MS(this);if(!t.defaultOption){for(var e=[],i=this.constructor;i;){var o=i.prototype.defaultOption;o&&e.push(o),i=i.superClass}for(var a={},r=e.length-1;r>=0;r--)a=n(a,e[r],!0);t.defaultOption=a}return t.defaultOption},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});Hi(IS,{registerWhenExtend:!0}),function(t){var e={};t.registerSubTypeDefaulter=function(t,i){t=Ri(t),e[t.main]=i},t.determineSubType=function(i,n){var o=n.type;if(!o){var a=Ri(i).main;t.hasSubTypes(i)&&e[a]&&(o=e[a](n))}return o}}(IS),function(t,e){function i(t){var i={},a=[];return d(t,function(r){var s=n(i,r),h=o(s.originalDeps=e(r),t);s.entryCount=h.length,0===s.entryCount&&a.push(r),d(h,function(t){l(s.predecessor,t)<0&&s.predecessor.push(t);var e=n(i,t);l(e.successor,t)<0&&e.successor.push(r)})}),{graph:i,noEntryList:a}}function n(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function o(t,e){var i=[];return d(t,function(t){l(e,t)>=0&&i.push(t)}),i}t.topologicalTravel=function(t,e,n,o){function a(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}if(t.length){var r=i(e),s=r.graph,l=r.noEntryList,h={};for(d(t,function(t){h[t]=!0});l.length;){var u=l.pop(),c=s[u],f=!!h[u];f&&(n.call(o,u,c.originalDeps.slice()),delete h[u]),d(c.successor,f?function(t){h[t]=!0,a(t)}:a)}d(h,function(){throw new Error("Circle dependency may exists")})}}}(IS,function(t){var e=[];return d(IS.getClassesByMainType(t),function(t){e=e.concat(t.prototype.dependencies||[])}),e=f(e,function(t){return Ri(t).main}),"dataset"!==t&&l(e,"dataset")<=0&&e.unshift("dataset"),e}),u(IS,SS);var TS="";"undefined"!=typeof navigator&&(TS=navigator.platform||"");var AS={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],gradientColor:["#f6efa6","#d88273","#bf444c"],textStyle:{fontFamily:TS.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},DS=Pi(),CS={clearColorPalette:function(){DS(this).colorIdx=0,DS(this).colorNameMap={}},getColorFromPalette:function(t,e,i){var n=DS(e=e||this),o=n.colorIdx||0,a=n.colorNameMap=n.colorNameMap||{};if(a.hasOwnProperty(t))return a[t];var r=Si(this.get("color",!0)),s=this.get("colorLayer",!0),l=null!=i&&s?na(s,i):r;if((l=l||r)&&l.length){var h=l[o];return t&&(a[t]=h),n.colorIdx=(o+1)%l.length,h}}},LS={cartesian2d:function(t,e,i,n){var o=t.getReferringComponents("xAxis")[0],a=t.getReferringComponents("yAxis")[0];e.coordSysDims=["x","y"],i.set("x",o),i.set("y",a),aa(o)&&(n.set("x",o),e.firstCategoryDimIndex=0),aa(a)&&(n.set("y",a),e.firstCategoryDimIndex=1)},singleAxis:function(t,e,i,n){var o=t.getReferringComponents("singleAxis")[0];e.coordSysDims=["single"],i.set("single",o),aa(o)&&(n.set("single",o),e.firstCategoryDimIndex=0)},polar:function(t,e,i,n){var o=t.getReferringComponents("polar")[0],a=o.findAxisModel("radiusAxis"),r=o.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],i.set("radius",a),i.set("angle",r),aa(a)&&(n.set("radius",a),e.firstCategoryDimIndex=0),aa(r)&&(n.set("angle",r),e.firstCategoryDimIndex=1)},geo:function(t,e,i,n){e.coordSysDims=["lng","lat"]},parallel:function(t,e,i,n){var o=t.ecModel,a=o.getComponent("parallel",t.get("parallelIndex")),r=e.coordSysDims=a.dimensions.slice();d(a.parallelAxisIndex,function(t,a){var s=o.getComponent("parallelAxis",t),l=r[a];i.set(l,s),aa(s)&&null==e.firstCategoryDimIndex&&(n.set(l,s),e.firstCategoryDimIndex=a)})}},kS="original",PS="arrayRows",OS="objectRows",NS="keyedColumns",ES="unknown",zS="typedArray",RS="column",BS="row";ra.seriesDataToSource=function(t){return new ra({data:t,sourceFormat:S(t)?zS:kS,fromDataset:!1})},Gi(ra);var VS=Pi(),GS="\0_ec_inner",WS=_o.extend({constructor:WS,init:function(t,e,i,n){i=i||{},this.option=null,this._theme=new _o(i),this._optionManager=n},setOption:function(t,e){k(!(GS in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null)},resetOption:function(t){var e=!1,i=this._optionManager;if(!t||"recreate"===t){var n=i.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(n)):wa.call(this,n),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(this.mergeOption(o),e=!0)}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this,this._api);a.length&&d(a,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){var e=this.option,o=this._componentsMap,r=[];ha(this),d(t,function(t,o){null!=t&&(IS.hasClass(o)?o&&r.push(o):e[o]=null==e[o]?i(t):n(e[o],t,!0))}),IS.topologicalTravel(r,IS.getAllClassMainTypes(),function(i,n){var r=Si(t[i]),s=Ai(o.get(i),r);Di(s),d(s,function(t,e){var n=t.option;w(n)&&(t.keyInfo.mainType=i,t.keyInfo.subType=Sa(i,n,t.exist))});var l=ba(o,n);e[i]=[],o.set(i,[]),d(s,function(t,n){var r=t.exist,s=t.option;if(k(w(s)||r,"Empty component definition"),s){var h=IS.getClass(i,t.keyInfo.subType,!0);if(r&&r instanceof h)r.name=t.keyInfo.name,r.mergeOption(s,this),r.optionUpdated(s,!1);else{var u=a({dependentModels:l,componentIndex:n},t.keyInfo);a(r=new h(s,this,this,u),u),r.init(s,this,this,u),r.optionUpdated(null,!0)}}else r.mergeOption({},this),r.optionUpdated({},!1);o.get(i)[n]=r,e[i][n]=r.option},this),"series"===i&&Ma(this,o.get("series"))},this),this._seriesIndicesMap=z(this._seriesIndices=this._seriesIndices||[])},getOption:function(){var t=i(this.option);return d(t,function(e,i){if(IS.hasClass(i)){for(var n=(e=Si(e)).length-1;n>=0;n--)Ci(e[n])&&e.splice(n,1);t[i]=e}}),delete t[GS],t},getTheme:function(){return this._theme},getComponent:function(t,e){var i=this._componentsMap.get(t);if(i)return i[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var i=t.index,n=t.id,o=t.name,a=this._componentsMap.get(e);if(!a||!a.length)return[];var r;if(null!=i)y(i)||(i=[i]),r=g(f(i,function(t){return a[t]}),function(t){return!!t});else if(null!=n){var s=y(n);r=g(a,function(t){return s&&l(n,t.id)>=0||!s&&t.id===n})}else if(null!=o){var h=y(o);r=g(a,function(t){return h&&l(o,t.name)>=0||!h&&t.name===o})}else r=a.slice();return Ia(r,t)},findComponents:function(t){var e=t.query,i=t.mainType,n=function(t){var e=i+"Index",n=i+"Id",o=i+"Name";return!t||null==t[e]&&null==t[n]&&null==t[o]?null:{mainType:i,index:t[e],id:t[n],name:t[o]}}(e);return function(e){return t.filter?g(e,t.filter):e}(Ia(n?this.queryComponents(n):this._componentsMap.get(i),t))},eachComponent:function(t,e,i){var n=this._componentsMap;"function"==typeof t?(i=e,e=t,n.each(function(t,n){d(t,function(t,o){e.call(i,n,t,o)})})):_(t)?d(n.get(t),e,i):w(t)&&d(this.findComponents(t),e,i)},getSeriesByName:function(t){return g(this._componentsMap.get("series"),function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.get("series")[t]},getSeriesByType:function(t){return g(this._componentsMap.get("series"),function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.get("series").slice()},getSeriesCount:function(){return this._componentsMap.get("series").length},eachSeries:function(t,e){d(this._seriesIndices,function(i){var n=this._componentsMap.get("series")[i];t.call(e,n,i)},this)},eachRawSeries:function(t,e){d(this._componentsMap.get("series"),t,e)},eachSeriesByType:function(t,e,i){d(this._seriesIndices,function(n){var o=this._componentsMap.get("series")[n];o.subType===t&&e.call(i,o,n)},this)},eachRawSeriesByType:function(t,e,i){return d(this.getSeriesByType(t),e,i)},isSeriesFiltered:function(t){return null==this._seriesIndicesMap.get(t.componentIndex)},getCurrentSeriesIndices:function(){return(this._seriesIndices||[]).slice()},filterSeries:function(t,e){Ma(this,g(this._componentsMap.get("series"),t,e))},restoreData:function(t){var e=this._componentsMap;Ma(this,e.get("series"));var i=[];e.each(function(t,e){i.push(e)}),IS.topologicalTravel(i,IS.getAllClassMainTypes(),function(i,n){d(e.get(i),function(e){("series"!==i||!xa(e,t))&&e.restoreData()})})}});u(WS,CS);var FS=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"],HS={};Aa.prototype={constructor:Aa,create:function(t,e){var i=[];d(HS,function(n,o){var a=n.create(t,e);i=i.concat(a||[])}),this._coordinateSystems=i},update:function(t,e){d(this._coordinateSystems,function(i){i.update&&i.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},Aa.register=function(t,e){HS[t]=e},Aa.get=function(t){return HS[t]};var ZS=d,US=i,jS=f,XS=n,YS=/^(min|max)?(.+)$/;Da.prototype={constructor:Da,setOption:function(t,e){t&&d(Si(t.series),function(t){t&&t.data&&S(t.data)&&O(t.data)}),t=US(t,!0);var i=this._optionBackup,n=Ca.call(this,t,e,!i);this._newBaseOption=n.baseOption,i?(Oa(i.baseOption,n.baseOption),n.timelineOptions.length&&(i.timelineOptions=n.timelineOptions),n.mediaList.length&&(i.mediaList=n.mediaList),n.mediaDefault&&(i.mediaDefault=n.mediaDefault)):this._optionBackup=n},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=jS(e.timelineOptions,US),this._mediaList=jS(e.mediaList,US),this._mediaDefault=US(e.mediaDefault),this._currentMediaIndices=[],US(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,i=this._timelineOptions;if(i.length){var n=t.getComponent("timeline");n&&(e=US(i[n.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),i=this._api.getHeight(),n=this._mediaList,o=this._mediaDefault,a=[],r=[];if(!n.length&&!o)return r;for(var s=0,l=n.length;s<l;s++)La(n[s].query,e,i)&&a.push(s);return!a.length&&o&&(a=[-1]),a.length&&!Pa(a,this._currentMediaIndices)&&(r=jS(a,function(t){return US(-1===t?o.option:n[t].option)})),this._currentMediaIndices=a,r}};var qS=d,$S=w,KS=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"],JS=function(t,e){qS(Ga(t.series),function(t){$S(t)&&Va(t)});var i=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","parallelAxis","radar"];e&&i.push("valueAxis","categoryAxis","logAxis","timeAxis"),qS(i,function(e){qS(Ga(t[e]),function(t){t&&(Ra(t,"axisLabel"),Ra(t.axisPointer,"label"))})}),qS(Ga(t.parallel),function(t){var e=t&&t.parallelAxisDefault;Ra(e,"axisLabel"),Ra(e&&e.axisPointer,"label")}),qS(Ga(t.calendar),function(t){Ea(t,"itemStyle"),Ra(t,"dayLabel"),Ra(t,"monthLabel"),Ra(t,"yearLabel")}),qS(Ga(t.radar),function(t){Ra(t,"name")}),qS(Ga(t.geo),function(t){$S(t)&&(Ba(t),qS(Ga(t.regions),function(t){Ba(t)}))}),qS(Ga(t.timeline),function(t){Ba(t),Ea(t,"label"),Ea(t,"itemStyle"),Ea(t,"controlStyle",!0),Ea(t,"checkpointStyle");var e=t.data;y(e)&&d(e,function(t){w(t)&&(Ea(t,"label"),Ea(t,"itemStyle"))})}),qS(Ga(t.toolbox),function(t){Ea(t,"iconStyle"),qS(t.feature,function(t){Ea(t,"iconStyle")})}),Ra(Wa(t.axisPointer),"label"),Ra(Wa(t.tooltip).axisPointer,"label")},QS=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],tM=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],eM=function(t,e){JS(t,e),t.series=Si(t.series),d(t.series,function(t){if(w(t)){var e=t.type;if("pie"!==e&&"gauge"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var i=Fa(t,"pointer.color");null!=i&&Ha(t,"itemStyle.normal.color",i)}Za(t)}}),t.dataRange&&(t.visualMap=t.dataRange),d(tM,function(e){var i=t[e];i&&(y(i)||(i=[i]),d(i,function(t){Za(t)}))})},iM=Ua.prototype;iM.pure=!1,iM.persistent=!0,iM.getSource=function(){return this._source};var nM={arrayRows_column:{pure:!0,count:function(){return Math.max(0,this._data.length-this._source.startIndex)},getItem:function(t){return this._data[t+this._source.startIndex]},appendData:Ya},arrayRows_row:{pure:!0,count:function(){var t=this._data[0];return t?Math.max(0,t.length-this._source.startIndex):0},getItem:function(t){t+=this._source.startIndex;for(var e=[],i=this._data,n=0;n<i.length;n++){var o=i[n];e.push(o?o[t]:null)}return e},appendData:function(){throw new Error('Do not support appendData when set seriesLayoutBy: "row".')}},objectRows:{pure:!0,count:ja,getItem:Xa,appendData:Ya},keyedColumns:{pure:!0,count:function(){var t=this._source.dimensionsDefine[0].name,e=this._data[t];return e?e.length:0},getItem:function(t){for(var e=[],i=this._source.dimensionsDefine,n=0;n<i.length;n++){var o=this._data[i[n].name];e.push(o?o[t]:null)}return e},appendData:function(t){var e=this._data;d(t,function(t,i){for(var n=e[i]||(e[i]=[]),o=0;o<(t||[]).length;o++)n.push(t[o])})}},original:{count:ja,getItem:Xa,appendData:Ya},typedArray:{persistent:!1,pure:!0,count:function(){return this._data?this._data.length/this._dimSize:0},getItem:function(t){t-=this._offset;for(var e=[],i=this._dimSize*t,n=0;n<this._dimSize;n++)e[n]=this._data[i+n];return e},appendData:function(t){this._data=t},clean:function(){this._offset+=this.count(),this._data=null}}},oM={arrayRows:qa,objectRows:function(t,e,i,n){return null!=i?t[n]:t},keyedColumns:qa,original:function(t,e,i,n){var o=Ii(t);return null!=i&&o instanceof Array?o[i]:o},typedArray:qa},aM={arrayRows:$a,objectRows:function(t,e,i,n){return Ka(t[e],this._dimensionInfos[e])},keyedColumns:$a,original:function(t,e,i,n){var o=t&&(null==t.value?t:t.value);return!this._rawData.pure&&Ti(t)&&(this.hasItemOption=!0),Ka(o instanceof Array?o[n]:o,this._dimensionInfos[e])},typedArray:function(t,e,i,n){return t[n]}},rM=/\{@(.+?)\}/g,sM={getDataParams:function(t,e){var i=this.getData(e),n=this.getRawValue(t,e),o=i.getRawIndex(t),a=i.getName(t,!0),r=i.getRawDataItem(t),s=i.getItemVisual(t,"color");return{componentType:this.mainType,componentSubType:this.subType,seriesType:"series"===this.mainType?this.subType:null,seriesIndex:this.seriesIndex,seriesId:this.id,seriesName:this.name,name:a,dataIndex:o,data:r,dataType:e,value:n,color:s,marker:jo(s),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,i,n,o){e=e||"normal";var a=this.getData(i),r=a.getItemModel(t),s=this.getDataParams(t,i);null!=n&&s.value instanceof Array&&(s.value=s.value[n]);var l=r.get("normal"===e?[o||"label","formatter"]:[e,o||"label","formatter"]);return"function"==typeof l?(s.status=e,l(s)):"string"==typeof l?Zo(l,s).replace(rM,function(e,i){var n=i.length;return"["===i.charAt(0)&&"]"===i.charAt(n-1)&&(i=+i.slice(1,n-1)),Ja(a,t,i)}):void 0},getRawValue:function(t,e){return Ja(this.getData(e),t)},formatTooltip:function(){}},lM=er.prototype;lM.perform=function(t){var e=this._upstream,i=t&&t.skip;if(this._dirty&&e){var n=this.context;n.data=n.outputData=e.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this);var o;this._plan&&!i&&(o=this._plan(this.context)),(this._dirty||"reset"===o)&&(this._dirty=!1,ir(this,i));var a=t&&t.step;if(this._dueEnd=e?e._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var r=this._dueIndex,s=Math.min(null!=a?this._dueIndex+a:1/0,this._dueEnd);!i&&r<s&&this._progress({start:r,end:s},this.context),this._dueIndex=s;var l=null!=this._settedOutputEnd?this._settedOutputEnd:s;this._outputDueEnd=l}else this._dueIndex=this._outputDueEnd=null!=this._settedOutputEnd?this._settedOutputEnd:this._dueEnd;return this.unfinished()},lM.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},lM.unfinished=function(){return this._progress&&this._dueIndex<this._dueEnd},lM.pipe=function(t){(this._downstream!==t||this._dirty)&&(this._downstream=t,t._upstream=this,t.dirty())},lM.dispose=function(){this._disposed||(this._upstream&&(this._upstream._downstream=null),this._downstream&&(this._downstream._upstream=null),this._dirty=!1,this._disposed=!0)},lM.getUpstream=function(){return this._upstream},lM.getDownstream=function(){return this._downstream},lM.setOutputEnd=function(t){this._outputDueEnd=this._settedOutputEnd=t};var hM=Pi(),uM=IS.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.color",layoutMode:null,init:function(t,e,i,n){this.seriesIndex=this.componentIndex,this.dataTask=tr({count:ar,reset:rr}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,i),ua(this);var o=this.getInitialData(t,i);lr(o,this),this.dataTask.context.data=o,hM(this).dataBeforeProcessed=o,nr(this)},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,o=i?ea(t):{},a=this.subType;IS.hasClass(a)&&(a+="Series"),n(t,e.getTheme().get(this.subType)),n(t,this.getDefaultOption()),Mi(t,"label",["show"]),this.fillDataTextStyle(t.data),i&&ta(t,o,i)},mergeOption:function(t,e){t=n(this.option,t,!0),this.fillDataTextStyle(t.data);var i=this.layoutMode;i&&ta(this.option,t,i),ua(this);var o=this.getInitialData(t,e);lr(o,this),this.dataTask.dirty(),this.dataTask.context.data=o,hM(this).dataBeforeProcessed=o,nr(this)},fillDataTextStyle:function(t){if(t)for(var e=["show"],i=0;i<t.length;i++)t[i]&&t[i].label&&Mi(t[i],"label",e)},getInitialData:function(){},appendData:function(t){this.getRawData().appendData(t.data)},getData:function(t){var e=ur(this);if(e){var i=e.context.data;return null==t?i:i.getLinkedData(t)}return hM(this).data},setData:function(t){var e=ur(this);if(e){var i=e.context;i.data!==t&&e.isOverallFilter&&e.setOutputEnd(t.count()),i.outputData=t,e!==this.dataTask&&(i.data=t)}hM(this).data=t},getSource:function(){return la(this)},getRawData:function(){return hM(this).dataBeforeProcessed},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(t,e,i){function n(t){return Ho(Wo(t))}var o=this.getData(),a=o.mapDimension("defaultedTooltip",!0),r=a.length,s=this.getRawValue(t),l=y(s),h=o.getItemVisual(t,"color");w(h)&&h.colorStops&&(h=(h.colorStops[0]||{}).color),h=h||"transparent";var u=r>1||l&&!r?function(i){function n(t,i){var n=o.getDimensionInfo(i);if(n&&!1!==n.otherDims.tooltip){var a=n.type,l=jo({color:h,type:"subItem"}),u=(r?l+Ho(n.displayName||"-")+": ":"")+Ho("ordinal"===a?t+"":"time"===a?e?"":Xo("yyyy/MM/dd hh:mm:ss",t):Wo(t));u&&s.push(u)}}var r=p(i,function(t,e,i){var n=o.getDimensionInfo(i);return t|=n&&!1!==n.tooltip&&null!=n.displayName},0),s=[];return a.length?d(a,function(e){n(Ja(o,t,e),e)}):d(i,n),(r?"<br/>":"")+s.join(r?"<br/>":", ")}(s):n(r?Ja(o,t,a[0]):l?s[0]:s),c=jo(h),f=o.getName(t),g=this.name;return g===vw&&(g=""),g=g?Ho(g)+(e?": ":"<br/>"):"",e?c+g+u:g+c+(f?Ho(f)+": "+u:u)},isAnimationEnabled:function(){if(_x.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){this.dataTask.dirty()},getColorFromPalette:function(t,e,i){var n=this.ecModel,o=CS.getColorFromPalette.call(this,t,e,i);return o||(o=n.getColorFromPalette(t,e,i)),o},coordDimToDataDim:function(t){return this.getRawData().mapDimension(t,!0)},getProgressive:function(){return this.get("progressive")},getProgressiveThreshold:function(){return this.get("progressiveThreshold")},getAxisTooltipData:null,getTooltipPosition:null,pipeTask:null,preventIncremental:null,pipelineContext:null});u(uM,sM),u(uM,CS);var cM=function(){this.group=new S_,this.uid=So("viewComponent")};cM.prototype={constructor:cM,init:function(t,e){},render:function(t,e,i,n){},dispose:function(){}};var dM=cM.prototype;dM.updateView=dM.updateLayout=dM.updateVisual=function(t,e,i,n){},Vi(cM),Hi(cM,{registerWhenExtend:!0});var fM=function(){var t=Pi();return function(e){var i=t(e),n=e.pipelineContext,o=i.large,a=i.incrementalRender,r=i.large=n.large,s=i.incrementalRender=n.incrementalRender;return(o^r||a^s)&&"reset"}},pM=Pi(),gM=fM();cr.prototype={type:"chart",init:function(t,e){},render:function(t,e,i,n){},highlight:function(t,e,i,n){fr(t.getData(),n,"emphasis")},downplay:function(t,e,i,n){fr(t.getData(),n,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){},incrementalPrepareRender:null,incrementalRender:null,updateTransform:null};var mM=cr.prototype;mM.updateView=mM.updateLayout=mM.updateVisual=function(t,e,i,n){this.render(t,e,i,n)},Vi(cr),Hi(cr,{registerWhenExtend:!0}),cr.markUpdateMethod=function(t,e){pM(t).updateMethod=e};var vM="\0__throttleOriginMethod",yM="\0__throttleRate",xM="\0__throttleType",_M={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var i=t.getData(),n=(t.visualColorAccessPath||"itemStyle.color").split("."),o=t.get(n)||t.getColorFromPalette(t.get("name"),null,e.getSeriesCount());if(i.setVisual("color",o),!e.isSeriesFiltered(t)){"function"!=typeof o||o instanceof Ub||i.each(function(e){i.setItemVisual(e,"color",o(t.getDataParams(e)))});return{dataEach:i.hasItemOption?function(t,e){var i=t.getItemModel(e).get(n,!0);null!=i&&t.setItemVisual(e,"color",i)}:null}}}},wM={toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}},bM=function(t,e){function i(t,e){if("string"!=typeof t)return t;var i=t;return d(e,function(t,e){i=i.replace(new RegExp("\\{\\s*"+e+"\\s*\\}","g"),t)}),i}function n(t){var e=a.get(t);if(null==e){for(var i=t.split("."),n=wM.aria,o=0;o<i.length;++o)n=n[i[o]];return n}return e}function o(t){return wM.series.typeNames[t]||"自定义图"}var a=e.getModel("aria");if(a.get("show"))if(a.get("description"))t.setAttribute("aria-label",a.get("description"));else{var r=0;e.eachSeries(function(t,e){++r},this);var s,l=a.get("data.maxCount")||10,h=a.get("series.maxCount")||10,u=Math.min(r,h);if(!(r<1)){var c=function(){var t=e.getModel("title").option;return t&&t.length&&(t=t[0]),t&&t.text}();s=c?i(n("general.withTitle"),{title:c}):n("general.withoutTitle");var f=[];s+=i(n(r>1?"series.multiple.prefix":"series.single.prefix"),{seriesCount:r}),e.eachSeries(function(t,e){if(e<u){var a,s=t.get("name"),h="series."+(r>1?"multiple":"single")+".";a=i(a=n(s?h+"withName":h+"withoutName"),{seriesId:t.seriesIndex,seriesName:t.get("name"),seriesType:o(t.subType)});var c=t.getData();window.data=c,c.count()>l?a+=i(n("data.partialData"),{displayCnt:l}):a+=n("data.allData");for(var d=[],p=0;p<c.count();p++)if(p<l){var g=c.getName(p),m=Ja(c,p);d.push(i(n(g?"data.withName":"data.withoutName"),{name:g,value:m}))}a+=d.join(n("data.separator.middle"))+n("data.separator.end"),f.push(a)}}),s+=f.join(n("series.multiple.separator.middle"))+n("series.multiple.separator.end"),t.setAttribute("aria-label",s)}}},SM=Math.PI,MM=_r.prototype;MM.getPerformArgs=function(t,e){if(t.__pipeline){var i=this._pipelineMap.get(t.__pipeline.id),n=i.context;return{step:!e&&i.progressiveEnabled&&(!n||n.incrementalRender)&&t.__idxInPipeline>i.bockIndex?i.step:null}}},MM.getPipeline=function(t){return this._pipelineMap.get(t)},MM.updateStreamModes=function(t,e){var i=this._pipelineMap.get(t.uid),n=t.getData().count(),o=i.progressiveEnabled&&e.incrementalPrepareRender&&n>=i.threshold,a=t.get("large")&&n>=t.get("largeThreshold");t.pipelineContext=i.context={incrementalRender:o,large:a}},MM.restorePipelines=function(t){var e=this,i=e._pipelineMap=z();t.eachSeries(function(t){var n=t.getProgressive(),o=t.uid;i.set(o,{id:o,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:n&&!(t.preventIncremental&&t.preventIncremental()),bockIndex:-1,step:n||700,count:0}),Pr(e,t,t.dataTask)})},MM.prepareStageTasks=function(t,e){var i=this._stageTaskMap,n=this.ecInstance.getModel(),o=this.api;d(t,function(t){var e=i.get(t.uid)||i.set(t.uid,[]);t.reset&&br(this,t,e,n,o),t.overallReset&&Sr(this,t,e,n,o)},this)},MM.prepareView=function(t,e,i,n){var o=t.renderTask,a=o.context;a.model=e,a.ecModel=i,a.api=n,o.__block=!t.incrementalPrepareRender,Pr(this,e,o)},MM.performDataProcessorTasks=function(t,e,i){wr(this,t,e,i,{block:!0})},MM.performVisualTasks=function(t,e,i,n){wr(this,t,e,i,n)},MM.performSeriesTasks=function(t){var e;t.eachSeries(function(t){e|=t.dataTask.perform()}),this.unfinished|=e},MM.plan=function(){this._pipelineMap.each(function(t){var e=t.tail;do{if(e.__block){t.bockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)})};var IM=MM.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)};_r.wrapStageHandler=function(t,e){return x(t)&&(t={overallReset:t,seriesType:Or(t)}),t.uid=So("stageHandler"),e&&(t.visualType=e),t};var TM,AM={},DM={};Nr(AM,WS),Nr(DM,Ta),AM.eachSeriesByType=AM.eachRawSeriesByType=function(t){TM=t},AM.eachComponent=function(t){"series"===t.mainType&&t.subType&&(TM=t.subType)};var CM=["#37A2DA","#32C5E9","#67E0E3","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#E062AE","#E690D1","#e7bcf3","#9d96f5","#8378EA","#96BFFF"],LM={color:CM,colorLayer:[["#37A2DA","#ffd85c","#fd7b5f"],["#37A2DA","#67E0E3","#FFDB5C","#ff9f7f","#E062AE","#9d96f5"],["#37A2DA","#32C5E9","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#e7bcf3","#8378EA","#96BFFF"],CM]},kM=["#dd6b66","#759aa0","#e69d87","#8dc1a9","#ea7e53","#eedd78","#73a373","#73b9bc","#7289ab","#91ca8c","#f49f42"],PM={color:kM,backgroundColor:"#333",tooltip:{axisPointer:{lineStyle:{color:"#eee"},crossStyle:{color:"#eee"}}},legend:{textStyle:{color:"#eee"}},textStyle:{color:"#eee"},title:{textStyle:{color:"#eee"}},toolbox:{iconStyle:{normal:{borderColor:"#eee"}}},dataZoom:{textStyle:{color:"#eee"}},visualMap:{textStyle:{color:"#eee"}},timeline:{lineStyle:{color:"#eee"},itemStyle:{normal:{color:kM[1]}},label:{normal:{textStyle:{color:"#eee"}}},controlStyle:{normal:{color:"#eee",borderColor:"#eee"}}},timeAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},logAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},valueAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},categoryAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},line:{symbol:"circle"},graph:{color:kM},gauge:{title:{textStyle:{color:"#eee"}}},candlestick:{itemStyle:{normal:{color:"#FD1050",color0:"#0CF49B",borderColor:"#FD1050",borderColor0:"#0CF49B"}}}};PM.categoryAxis.splitLine.show=!1;var OM=k,NM=d,EM=x,zM=w,RM=IS.parseClassType,BM={zrender:"4.0.1"},VM=1e3,GM=1e3,WM=3e3,FM={PROCESSOR:{FILTER:VM,STATISTIC:5e3},VISUAL:{LAYOUT:GM,GLOBAL:2e3,CHART:WM,COMPONENT:4e3,BRUSH:5e3}},HM="__flagInMainProcess",ZM="__optionUpdated",UM=/^[a-zA-Z0-9_]+$/;zr.prototype.on=Er("on"),zr.prototype.off=Er("off"),zr.prototype.one=Er("one"),u(zr,Hx);var jM=Rr.prototype;jM._onframe=function(){if(!this._disposed){var t=this._scheduler;if(this[ZM]){var e=this[ZM].silent;this[HM]=!0,Vr(this),XM.update.call(this),this[HM]=!1,this[ZM]=!1,Zr.call(this,e),Ur.call(this,e)}else if(t.unfinished){var i=1,n=this._model;this._api;t.unfinished=!1;do{var o=+new Date;t.performSeriesTasks(n),t.performDataProcessorTasks(KM,n),Fr(this,n),t.performVisualTasks(tI,n),Kr(this,this._model,0,"remain"),i-=+new Date-o}while(i>0&&t.unfinished);t.unfinished||(this._zr&&this._zr.flush(),this.trigger("finished"))}}},jM.getDom=function(){return this._dom},jM.getZr=function(){return this._zr},jM.setOption=function(t,e,i){var n;if(zM(e)&&(i=e.lazyUpdate,n=e.silent,e=e.notMerge),this[HM]=!0,!this._model||e){var o=new Da(this._api),a=this._theme,r=this._model=new WS(null,null,a,o);r.scheduler=this._scheduler,r.init(null,null,a,o)}this._model.setOption(t,JM),i?(this[ZM]={silent:n},this[HM]=!1):(Vr(this),XM.update.call(this),this._zr.flush(),this[ZM]=!1,this[HM]=!1,Zr.call(this,n),Ur.call(this,n))},jM.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},jM.getModel=function(){return this._model},jM.getOption=function(){return this._model&&this._model.getOption()},jM.getWidth=function(){return this._zr.getWidth()},jM.getHeight=function(){return this._zr.getHeight()},jM.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},jM.getRenderedCanvas=function(t){if(_x.canvasSupported){(t=t||{}).pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr;return d(e.storage.getDisplayList(),function(t){t.stopAnimation(!0)}),e.painter.getRenderedCanvas(t)}},jM.getSvgDataUrl=function(){if(_x.svgSupported){var t=this._zr;return d(t.storage.getDisplayList(),function(t){t.stopAnimation(!0)}),t.painter.pathToSvg()}},jM.getDataURL=function(t){var e=(t=t||{}).excludeComponents,i=this._model,n=[],o=this;NM(e,function(t){i.eachComponent({mainType:t},function(t){var e=o._componentsMap[t.__viewId];e.group.ignore||(n.push(e),e.group.ignore=!0)})});var a="svg"===this._zr.painter.getType()?this.getSvgDataUrl():this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return NM(n,function(t){t.group.ignore=!1}),a},jM.getConnectedDataURL=function(t){if(_x.canvasSupported){var e=this.group,n=Math.min,o=Math.max;if(oI[e]){var a=1/0,r=1/0,s=-1/0,l=-1/0,h=[],u=t&&t.pixelRatio||1;d(nI,function(u,c){if(u.group===e){var d=u.getRenderedCanvas(i(t)),f=u.getDom().getBoundingClientRect();a=n(f.left,a),r=n(f.top,r),s=o(f.right,s),l=o(f.bottom,l),h.push({dom:d,left:f.left,top:f.top})}});var c=(s*=u)-(a*=u),f=(l*=u)-(r*=u),p=Px();p.width=c,p.height=f;var g=_i(p);return NM(h,function(t){var e=new Je({style:{x:t.left*u-a,y:t.top*u-r,image:t.dom}});g.add(e)}),g.refreshImmediately(),p.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},jM.convertToPixel=v(Br,"convertToPixel"),jM.convertFromPixel=v(Br,"convertFromPixel"),jM.containPixel=function(t,e){var i;return t=Oi(this._model,t),d(t,function(t,n){n.indexOf("Models")>=0&&d(t,function(t){var o=t.coordinateSystem;if(o&&o.containPoint)i|=!!o.containPoint(e);else if("seriesModels"===n){var a=this._chartsMap[t.__viewId];a&&a.containPoint&&(i|=a.containPoint(e,t))}},this)},this),!!i},jM.getVisual=function(t,e){var i=(t=Oi(this._model,t,{defaultMainType:"series"})).seriesModel.getData(),n=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?i.indexOfRawIndex(t.dataIndex):null;return null!=n?i.getItemVisual(n,e):i.getVisual(e)},jM.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},jM.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var XM={prepareAndUpdate:function(t){Vr(this),XM.update.call(this,t)},update:function(t){var e=this._model,i=this._api,n=this._zr,o=this._coordSysMgr,a=this._scheduler;if(e){e.restoreData(t),a.performSeriesTasks(e),o.create(e,i),a.performDataProcessorTasks(KM,e,t),Fr(this,e),Xr(e),o.update(e,i),Yr(e),a.performVisualTasks(tI,e,t),qr(this,e,i,t);var r=e.get("backgroundColor")||"transparent",s=n.painter;if(s.isSingleCanvas&&s.isSingleCanvas())n.configLayer(0,{clearColor:r});else{if(!_x.canvasSupported){var l=Dt(r);r=Rt(l,"rgb"),0===l[3]&&(r="transparent")}r.colorStops||r.image?(n.configLayer(0,{clearColor:r}),this.__hasGradientOrPatternBg=!0,this._dom.style.background="transparent"):(this.__hasGradientOrPatternBg&&n.configLayer(0,{clearColor:null}),this.__hasGradientOrPatternBg=!1,this._dom.style.background=r)}Jr(e,i)}},updateTransform:function(t){var e=this._model,i=this,n=this._api;if(e){var o=[];e.eachComponent(function(a,r){var s=i.getViewOfComponentModel(r);if(s&&s.__alive)if(s.updateTransform){var l=s.updateTransform(r,e,n,t);l&&l.update&&o.push(s)}else o.push(s)});var a=z();e.eachSeries(function(o){var r=i._chartsMap[o.__viewId];if(r.updateTransform){var s=r.updateTransform(o,e,n,t);s&&s.update&&a.set(o.uid,1)}else a.set(o.uid,1)}),Yr(e),this._scheduler.performVisualTasks(tI,e,t,{setDirty:!0,dirtyMap:a}),Kr(i,e,0,t,a),Jr(e,this._api)}},updateView:function(t){var e=this._model;e&&(cr.markUpdateMethod(t,"updateView"),Yr(e),this._scheduler.performVisualTasks(tI,e,t,{setDirty:!0}),qr(this,this._model,this._api,t),Jr(e,this._api))},updateVisual:function(t){XM.update.call(this,t)},updateLayout:function(t){XM.update.call(this,t)}};jM.resize=function(t){this._zr.resize(t);var e=this._model;this._loadingFX&&this._loadingFX.resize(),e&&Wr(this,e.resetOption("media"),t&&t.silent)},jM.showLoading=function(t,e){if(zM(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),iI[t]){var i=iI[t](this._api,e),n=this._zr;this._loadingFX=i,n.add(i)}},jM.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},jM.makeActionFromEvent=function(t){var e=a({},t);return e.type=$M[t.type],e},jM.dispatchAction=function(t,e){zM(e)||(e={silent:!!e}),qM[t.type]&&this._model&&(this[HM]?this._pendingActions.push(t):(Hr.call(this,t,e.silent),e.flush?this._zr.flush(!0):!1!==e.flush&&_x.browser.weChat&&this._throttledZrFlush(),Zr.call(this,e.silent),Ur.call(this,e.silent)))},jM.appendData=function(t){var e=t.seriesIndex;this.getModel().getSeriesByIndex(e).appendData(t),this._scheduler.unfinished=!0},jM.on=Er("on"),jM.off=Er("off"),jM.one=Er("one");var YM=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];jM._initEvents=function(){NM(YM,function(t){this._zr.on(t,function(e){var i,n=this.getModel(),o=e.target;if("globalout"===t)i={};else if(o&&null!=o.dataIndex){var r=o.dataModel||n.getSeriesByIndex(o.seriesIndex);i=r&&r.getDataParams(o.dataIndex,o.dataType)||{}}else o&&o.eventData&&(i=a({},o.eventData));i&&(i.event=e,i.type=t,this.trigger(t,i))},this)},this),NM($M,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},jM.isDisposed=function(){return this._disposed},jM.clear=function(){this.setOption({series:[]},!0)},jM.dispose=function(){if(!this._disposed){this._disposed=!0,Ei(this.getDom(),sI,"");var t=this._api,e=this._model;NM(this._componentsViews,function(i){i.dispose(e,t)}),NM(this._chartsViews,function(i){i.dispose(e,t)}),this._zr.dispose(),delete nI[this.id]}},u(Rr,Hx);var qM={},$M={},KM=[],JM=[],QM=[],tI=[],eI={},iI={},nI={},oI={},aI=new Date-0,rI=new Date-0,sI="_echarts_instance_",lI={},hI=os;ds(2e3,_M),ss(eM),ps("default",function(t,e){r(e=e||{},{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var i=new Vb({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),n=new Hb({shape:{startAngle:-SM/2,endAngle:-SM/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),o=new Vb({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});n.animateShape(!0).when(1e3,{endAngle:3*SM/2}).start("circularInOut"),n.animateShape(!0).when(1e3,{startAngle:3*SM/2}).delay(300).start("circularInOut");var a=new S_;return a.add(n),a.add(o),a.add(i),a.resize=function(){var e=t.getWidth()/2,a=t.getHeight()/2;n.setShape({cx:e,cy:a});var r=n.shape.r;o.setShape({x:e-r,y:a-r,width:2*r,height:2*r}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},a.resize(),a}),hs({type:"highlight",event:"highlight",update:"highlight"},B),hs({type:"downplay",event:"downplay",update:"downplay"},B),rs("light",LM),rs("dark",PM);var uI={};ws.prototype={constructor:ws,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t=this._old,e=this._new,i={},n=[],o=[];for(bs(t,{},n,"_oldKeyGetter",this),bs(e,i,o,"_newKeyGetter",this),a=0;a<t.length;a++)null!=(s=i[r=n[a]])?((h=s.length)?(1===h&&(i[r]=null),s=s.unshift()):i[r]=null,this._update&&this._update(s,a)):this._remove&&this._remove(a);for(var a=0;a<o.length;a++){var r=o[a];if(i.hasOwnProperty(r)){var s=i[r];if(null==s)continue;if(s.length)for(var l=0,h=s.length;l<h;l++)this._add&&this._add(s[l]);else this._add&&this._add(s)}}}};var cI=z(["tooltip","label","itemName","itemId","seriesName"]),dI=w,fI="undefined",pI=typeof window===fI?global:window,gI="e\0\0",mI={float:typeof pI.Float64Array===fI?Array:pI.Float64Array,int:typeof pI.Int32Array===fI?Array:pI.Int32Array,ordinal:Array,number:Array,time:Array},vI=["stackedOn","hasItemOption","_nameList","_idList","_rawData","_rawExtent","_chunkSize","_chunkCount","_dimValueGetter","_count","_rawCount","_nameDimIdx","_idDimIdx"],yI=function(t,e){t=t||["x","y"];for(var i={},n=[],o=0;o<t.length;o++){var a,r={};"string"==typeof t[o]?r={name:a=t[o],coordDim:a,coordDimIndex:0,stackable:!1,type:"float"}:(a=(r=t[o]).name,r.type=r.type||"float",r.coordDim||(r.coordDim=a,r.coordDimIndex=0)),r.otherDims=r.otherDims||{},n.push(a),i[a]=r,r.index=o}this.dimensions=n,this._dimensionInfos=i,this.hostModel=e,this.dataType,this._indices=null,this._count=0,this._rawCount=0,this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._layout={},this._itemVisuals=[],this.hasItemVisual={},this._itemLayouts=[],this._graphicEls=[],this._chunkSize=1e5,this._chunkCount=0,this._rawData,this._rawExtent={},this._extent={},this._approximateExtent={},this._dimensionsSummary=Ss(this)},xI=yI.prototype;xI.type="list",xI.hasItemOption=!0,xI.getDimension=function(t){return isNaN(t)||(t=this.dimensions[t]||t),t},xI.getDimensionInfo=function(t){return this._dimensionInfos[this.getDimension(t)]},xI.getDimensionsOnCoord=function(){return this._dimensionsSummary.dataDimsOnCoord.slice()},xI.mapDimension=function(t,e){var i=this._dimensionsSummary.encode[t];return!0===e?i&&i.slice()||[]:i?i[e||0]:null},xI.initData=function(t,e,i){(ra.isInstance(t)||c(t))&&(t=new Ua(t,this.dimensions.length)),this._rawData=t,this._storage={},this._indices=null,this._nameList=e||[],this._idList=[],this._nameRepeatCount={},i||(this.hasItemOption=!1),this.defaultDimValueGetter=aM[this._rawData.getSource().sourceFormat],this._dimValueGetter=i=i||this.defaultDimValueGetter,this._rawExtent={},this._initDataFromProvider(0,t.count()),t.pure&&(this.hasItemOption=!1)},xI.getProvider=function(){return this._rawData},xI.appendData=function(t){var e=this._rawData,i=this.count();e.appendData(t);var n=e.count();e.persistent||(n+=i),this._initDataFromProvider(i,n)},xI._initDataFromProvider=function(t,e){if(!(t>=e)){for(var i,n=this._chunkSize,o=this._rawData,a=this._storage,r=this.dimensions,s=this._dimensionInfos,l=this._nameList,h=this._idList,u=this._rawExtent,c=this._nameRepeatCount={},d=this._chunkCount,f=d-1,p=0;p<r.length;p++){u[I=r[p]]||(u[I]=[1/0,-1/0]);var g=s[I];0===g.otherDims.itemName&&(i=this._nameDimIdx=p),0===g.otherDims.itemId&&(this._idDimIdx=p);var m=mI[g.type];a[I]||(a[I]=[]);var v=a[I][f];if(v&&v.length<n){for(var y=new m(Math.min(e-f*n,n)),x=0;x<v.length;x++)y[x]=v[x];a[I][f]=y}for(M=d*n;M<e;M+=n)a[I].push(new m(Math.min(e-M,n)));this._chunkCount=a[I].length}for(var _=t;_<e;_++){for(var w=o.getItem(_),b=Math.floor(_/n),S=_%n,M=0;M<r.length;M++){var I=r[M],T=a[I][b],A=this._dimValueGetter(w,I,_,M);T[S]=A,A<u[I][0]&&(u[I][0]=A),A>u[I][1]&&(u[I][1]=A)}if(!o.pure){var D=l[_];w&&!D&&(null!=i?D=this._getNameFromStore(_):null!=w.name&&(l[_]=D=w.name));var C=null==w?null:w.id;null==C&&null!=D&&(c[D]=c[D]||0,C=D,c[D]>0&&(C+="__ec__"+c[D]),c[D]++),null!=C&&(h[_]=C)}}!o.persistent&&o.clean&&o.clean(),this._rawCount=this._count=e,this._extent={}}},xI._getNameFromStore=function(t){var e=this._nameDimIdx;if(null!=e){var i=this._chunkSize,n=Math.floor(t/i),o=t%i,a=this.dimensions[e],r=this._dimensionInfos[a].ordinalMeta;if(r)return r.categories[t];var s=this._storage[a][n];return s&&s[o]}},xI._getIdFromStore=function(t){var e=this._idDimIdx;if(null!=e){var i=this._chunkSize,n=Math.floor(t/i),o=t%i,a=this.dimensions[e],r=this._dimensionInfos[a].ordinalMeta;if(r)return r.categories[t];var s=this._storage[a][n];return s&&s[o]}},xI.count=function(){return this._count},xI.getIndices=function(){if(this._indices)return new(t=this._indices.constructor)(this._indices.buffer,0,this._count);for(var t=Ts(this),e=new t(this.count()),i=0;i<e.length;i++)e[i]=i;return e},xI.get=function(t,e,i){if(!(e>=0&&e<this._count))return NaN;var n=this._storage;if(!n[t])return NaN;e=this.getRawIndex(e);var o=Math.floor(e/this._chunkSize),a=e%this._chunkSize,r=n[t][o][a];if(i){var s=this._dimensionInfos[t];if(s&&s.stackable)for(var l=this.stackedOn;l;){var h=l.get(t,e);(r>=0&&h>0||r<=0&&h<0)&&(r+=h),l=l.stackedOn}}return r},xI._getFast=function(t,e){var i=Math.floor(e/this._chunkSize),n=e%this._chunkSize;return this._storage[t][i][n]},xI.getValues=function(t,e,i){var n=[];y(t)||(i=e,e=t,t=this.dimensions);for(var o=0,a=t.length;o<a;o++)n.push(this.get(t[o],e,i));return n},xI.hasValue=function(t){for(var e=this._dimensionsSummary.dataDimsOnCoord,i=this._dimensionInfos,n=0,o=e.length;n<o;n++)if("ordinal"!==i[e[n]].type&&isNaN(this.get(e[n],t)))return!1;return!0},xI.getDataExtent=function(t,e){t=this.getDimension(t);var i=this._storage[t],n=[1/0,-1/0];if(e=(e||!1)&&this.isStacked(t),!i)return n;var o,a=this.count(),r=[t,!!e].join("_");if(!this._indices&&!e)return this._rawExtent[t].slice();if(o=this._extent[r])return o.slice();for(var s=(o=n)[0],l=o[1],h=0;h<a;h++){var u=e?this.get(t,h,!0):this._getFast(t,this.getRawIndex(h));u<s&&(s=u),u>l&&(l=u)}return o=[s,l],this._extent[r]=o,o},xI.getApproximateExtent=function(t,e){return t=this.getDimension(t),this._approximateExtent[t]||this.getDataExtent(t,e)},xI.setApproximateExtent=function(t,e,i){e=this.getDimension(e),this._approximateExtent[e]=t.slice()},xI.isStacked=function(t){var e=this._dimensionInfos[t];return e&&e.stackable&&this.stackedOn},xI.getSum=function(t,e){var i=0;if(this._storage[t])for(var n=0,o=this.count();n<o;n++){var a=this.get(t,n,e);isNaN(a)||(i+=a)}return i},xI.indexOf=function(t,e){var i=this._storage[t],n=this._chunkSize;if(i)for(var o=0,a=this.count();o<a;o++){var r=o%n;if(i[Math.floor(o/n)][r]===e)return o}return-1},xI.indexOfName=function(t){for(var e=0,i=this.count();e<i;e++)if(this.getName(e)===t)return e;return-1},xI.indexOfRawIndex=function(t){if(!this._indices)return t;if(t>=this._rawCount||t<0)return-1;var e=this._indices,i=e[t];if(null!=i&&i<this._count&&i===t)return t;for(var n=0,o=this._count-1;n<=o;){var a=(n+o)/2|0;if(e[a]<t)n=a+1;else{if(!(e[a]>t))return a;o=a-1}}return-1},xI.indicesOfNearest=function(t,e,i,n){var o=[];if(!this._storage[t])return o;null==n&&(n=1/0);for(var a=Number.MAX_VALUE,r=-1,s=0,l=this.count();s<l;s++){var h=e-this.get(t,s,i),u=Math.abs(h);h<=n&&u<=a&&((u<a||h>=0&&r<0)&&(a=u,r=h,o.length=0),o.push(s))}return o},xI.getRawIndex=Cs,xI.getRawDataItem=function(t){if(this._rawData.persistent)return this._rawData.getItem(this.getRawIndex(t));for(var e=[],i=0;i<this.dimensions.length;i++){var n=this.dimensions[i];e.push(this.get(n,t))}return e},xI.getName=function(t){var e=this.getRawIndex(t);return this._nameList[e]||this._getNameFromStore(e)||""},xI.getId=function(t){return ks(this,this.getRawIndex(t))},xI.each=function(t,e,i,n){if(this._count){"function"==typeof t&&(n=i,i=e,e=t,t=[]);var o=(t=f(Ps(t),this.getDimension,this)).length;n=n||this;for(var a=0;a<this.count();a++)switch(o){case 0:e.call(n,a);break;case 1:e.call(n,this.get(t[0],a,i),a);break;case 2:e.call(n,this.get(t[0],a,i),this.get(t[1],a,i),a);break;default:for(var r=0,s=[];r<o;r++)s[r]=this.get(t[r],a,i);s[r]=a,e.apply(n,s)}}},xI.filterSelf=function(t,e,i,n){if(this._count){"function"==typeof t&&(n=i,i=e,e=t,t=[]),i=i||!1,n=n||this,t=f(Ps(t),this.getDimension,this);for(var o=this.count(),a=new(Ts(this))(o),r=[],s=t.length,l=0,h=t[0],u=0;u<o;u++){var c,d=this.getRawIndex(u);if(0===s)c=e.call(n,u);else if(1===s){var p=i?this.get(h,u,!0):this._getFast(h,d);c=e.call(n,p,u)}else{for(var g=0;g<s;g++)r[g]=i?this.get(t[g],u,!0):this._getFast(h,d);r[g]=u,c=e.apply(n,r)}c&&(a[l++]=d)}return l<o&&(this._indices=a),this._count=l,this._extent={},this.getRawIndex=this._indices?Ls:Cs,this}},xI.selectRange=function(t,e){if(this._count){e=e||!1;var i=[];for(var n in t)t.hasOwnProperty(n)&&i.push(n);var o=i.length;if(o){var a=this.count(),r=new(Ts(this))(a),s=0,l=i[0],h=t[l][0],u=t[l][1],c=!1;if(!this._indices&&!e){var d=0;if(1===o){for(var f=this._storage[i[0]],p=0;p<this._chunkCount;p++)for(var g=f[p],m=Math.min(this._count-p*this._chunkSize,this._chunkSize),v=0;v<m;v++)(b=g[v])>=h&&b<=u&&(r[s++]=d),d++;c=!0}else if(2===o){for(var f=this._storage[l],y=this._storage[i[1]],x=t[i[1]][0],_=t[i[1]][1],p=0;p<this._chunkCount;p++)for(var g=f[p],w=y[p],m=Math.min(this._count-p*this._chunkSize,this._chunkSize),v=0;v<m;v++){var b=g[v],S=w[v];b>=h&&b<=u&&S>=x&&S<=_&&(r[s++]=d),d++}c=!0}}if(!c)if(1===o){e=e||this.isStacked(l);for(v=0;v<a;v++){I=this.getRawIndex(v);(b=e?this.get(l,v,!0):this._getFast(l,I))>=h&&b<=u&&(r[s++]=I)}}else for(v=0;v<a;v++){for(var M=!0,I=this.getRawIndex(v),p=0;p<o;p++){var T=i[p];((b=e?this.get(T,v,!0):this._getFast(n,I))<t[T][0]||b>t[T][1])&&(M=!1)}M&&(r[s++]=this.getRawIndex(v))}return s<a&&(this._indices=r),this._count=s,this._extent={},this.getRawIndex=this._indices?Ls:Cs,this}}},xI.mapArray=function(t,e,i,n){"function"==typeof t&&(n=i,i=e,e=t,t=[]);var o=[];return this.each(t,function(){o.push(e&&e.apply(this,arguments))},i,n),o},xI.map=function(t,e,i,n){var o=Os(this,t=f(Ps(t),this.getDimension,this));o._indices=this._indices,o.getRawIndex=o._indices?Ls:Cs;for(var a=o._storage,r=[],s=this._chunkSize,l=t.length,h=this.count(),u=[],c=0;c<h;c++){for(var d=0;d<l;d++)u[d]=this.get(t[d],c,i);u[l]=c;var p=e&&e.apply(n,u);if(null!=p){"object"!=typeof p&&(r[0]=p,p=r);for(var g=this.getRawIndex(c),m=Math.floor(g/s),v=g%s,y=0;y<p.length;y++){var x=a[t[y]];x&&(x[m][v]=p[y])}}}return o},xI.downSample=function(t,e,i,n){for(var o=Os(this,[t]),a=o._storage,r=[],s=Math.floor(1/e),l=a[t],h=this.count(),u=this._chunkSize,c=new(Ts(this))(h),d=0,f=0;f<h;f+=s){s>h-f&&(s=h-f,r.length=s);for(var p=0;p<s;p++){var g=this.getRawIndex(f+p),m=Math.floor(g/u),v=g%u;r[p]=l[m][v]}var y=i(r),x=this.getRawIndex(Math.min(f+n(r,y)||0,h-1)),_=x%u;l[Math.floor(x/u)][_]=y,c[d++]=x}return o._count=d,o._indices=c,o.getRawIndex=Ls,o},xI.getItemModel=function(t){var e=this.hostModel;return new _o(this.getRawDataItem(t),e,e&&e.ecModel)},xI.diff=function(t){var e=this;return new ws(t?t.getIndices():[],this.getIndices(),function(e){return ks(t,e)},function(t){return ks(e,t)})},xI.getVisual=function(t){var e=this._visual;return e&&e[t]},xI.setVisual=function(t,e){if(dI(t))for(var i in t)t.hasOwnProperty(i)&&this.setVisual(i,t[i]);else this._visual=this._visual||{},this._visual[t]=e},xI.setLayout=function(t,e){if(dI(t))for(var i in t)t.hasOwnProperty(i)&&this.setLayout(i,t[i]);else this._layout[t]=e},xI.getLayout=function(t){return this._layout[t]},xI.getItemLayout=function(t){return this._itemLayouts[t]},xI.setItemLayout=function(t,e,i){this._itemLayouts[t]=i?a(this._itemLayouts[t]||{},e):e},xI.clearItemLayouts=function(){this._itemLayouts.length=0},xI.getItemVisual=function(t,e,i){var n=this._itemVisuals[t],o=n&&n[e];return null!=o||i?o:this.getVisual(e)},xI.setItemVisual=function(t,e,i){var n=this._itemVisuals[t]||{},o=this.hasItemVisual;if(this._itemVisuals[t]=n,dI(e))for(var a in e)e.hasOwnProperty(a)&&(n[a]=e[a],o[a]=!0);else n[e]=i,o[e]=!0},xI.clearAllVisual=function(){this._visual={},this._itemVisuals=[],this.hasItemVisual={}};var _I=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};xI.setItemGraphicEl=function(t,e){var i=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=i&&i.seriesIndex,"group"===e.type&&e.traverse(_I,e)),this._graphicEls[t]=e},xI.getItemGraphicEl=function(t){return this._graphicEls[t]},xI.eachItemGraphicEl=function(t,e){d(this._graphicEls,function(i,n){i&&t&&t.call(e,i,n)})},xI.cloneShallow=function(t){if(!t){var e=f(this.dimensions,this.getDimensionInfo,this);t=new yI(e,this.hostModel)}if(t._storage=this._storage,Ds(t,this),this._indices){var n=this._indices.constructor;t._indices=new n(this._indices)}else t._indices=null;return t.getRawIndex=t._indices?Ls:Cs,t._extent=i(this._extent),t._approximateExtent=i(this._approximateExtent),t},xI.wrapMethod=function(t,e){var i=this[t];"function"==typeof i&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=i.apply(this,arguments);return e.apply(this,[t].concat(C(arguments)))})},xI.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],xI.CHANGABLE_METHODS=["filterSelf","selectRange"];var wI=function(t,e){return e=e||{},Es(e.coordDimensions||[],t,{dimsDef:e.dimensionsDefine||t.dimensionsDefine,encodeDef:e.encodeDefine||t.encodeDefine,dimCount:e.dimensionsCount,extraPrefix:e.extraPrefix,extraFromZero:e.extraFromZero})};Fs.prototype.parse=function(t){return t},Fs.prototype.getSetting=function(t){return this._setting[t]},Fs.prototype.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},Fs.prototype.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},Fs.prototype.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},Fs.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},Fs.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e,!0))},Fs.prototype.getExtent=function(){return this._extent.slice()},Fs.prototype.setExtent=function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},Fs.prototype.getTicksLabels=function(){for(var t=[],e=this.getTicks(),i=0;i<e.length;i++)t.push(this.getLabel(e[i]));return t},Fs.prototype.isBlank=function(){return this._isBlank},Fs.prototype.setBlank=function(t){this._isBlank=t},Vi(Fs),Hi(Fs,{registerWhenExtend:!0}),Hs.createByAxisModel=function(t){var e=t.option,i=e.data,n=i&&f(i,Us);return new Hs({categories:n,needCollect:!n,deduplication:!1!==e.dedplication})};var bI=Hs.prototype;bI.getOrdinal=function(t){return Zs(this).get(t)},bI.parseAndCollect=function(t){var e,i=this._needCollect;if("string"!=typeof t&&!i)return t;if(i&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var n=Zs(this);return null==(e=n.get(t))&&(i?(e=this.categories.length,this.categories[e]=t,n.set(t,e)):e=NaN),e};var SI=Fs.prototype,MI=Fs.extend({type:"ordinal",init:function(t,e){t&&!y(t)||(t=new Hs({categories:t})),this._ordinalMeta=t,this._extent=e||[0,t.categories.length-1]},parse:function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},contain:function(t){return t=this.parse(t),SI.contain.call(this,t)&&null!=this._ordinalMeta.categories[t]},normalize:function(t){return SI.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(SI.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,i=e[0];i<=e[1];)t.push(i),i++;return t},getLabel:function(t){return this._ordinalMeta.categories[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e,!1))},niceTicks:B,niceExtent:B});MI.create=function(){return new MI};var II=Ao,TI=Ao,AI=Fs.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var i=this._extent;isNaN(t)||(i[0]=parseFloat(t)),isNaN(e)||(i[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),AI.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=Xs(t)},getTicks:function(){return $s(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getTicksLabels:function(){for(var t=[],e=this.getTicks(),i=0;i<e.length;i++)t.push(this.getLabel(e[i]));return t},getLabel:function(t,e){if(null==t)return"";var i=e&&e.precision;return null==i?i=Lo(t)||0:"auto"===i&&(i=this._intervalPrecision),t=TI(t,i,!0),Wo(t)},niceTicks:function(t,e,i){t=t||5;var n=this._extent,o=n[1]-n[0];if(isFinite(o)){o<0&&(o=-o,n.reverse());var a=js(n,t,e,i);this._intervalPrecision=a.intervalPrecision,this._interval=a.interval,this._niceExtent=a.niceTickExtent}},niceExtent:function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var i=e[0];t.fixMax?e[0]-=i/2:(e[1]+=i/2,e[0]-=i/2)}else e[1]=1;var n=e[1]-e[0];isFinite(n)||(e[0]=0,e[1]=1),this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var o=this._interval;t.fixMin||(e[0]=TI(Math.floor(e[0]/o)*o)),t.fixMax||(e[1]=TI(Math.ceil(e[1]/o)*o))}});AI.create=function(){return new AI};var DI="__ec_stack_",CI=AI.prototype,LI=Math.ceil,kI=Math.floor,PI=function(t,e,i,n){for(;i<n;){var o=i+n>>>1;t[o][1]<e?i=o+1:n=o}return i},OI=AI.extend({type:"time",getLabel:function(t){var e=this._stepLvl,i=new Date(t);return Xo(e[0],i,this.getSetting("useUTC"))},niceExtent:function(t){var e=this._extent;if(e[0]===e[1]&&(e[0]-=864e5,e[1]+=864e5),e[1]===-1/0&&e[0]===1/0){var i=new Date;e[1]=+new Date(i.getFullYear(),i.getMonth(),i.getDate()),e[0]=e[1]-864e5}this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var n=this._interval;t.fixMin||(e[0]=Ao(kI(e[0]/n)*n)),t.fixMax||(e[1]=Ao(LI(e[1]/n)*n))},niceTicks:function(t,e,i){t=t||10;var n=this._extent,o=n[1]-n[0],a=o/t;null!=e&&a<e&&(a=e),null!=i&&a>i&&(a=i);var r=NI.length,s=PI(NI,a,0,r),l=NI[Math.min(s,r-1)],h=l[1];"year"===l[0]&&(h*=Bo(o/h/t,!0));var u=this.getSetting("useUTC")?0:60*new Date(+n[0]||+n[1]).getTimezoneOffset()*1e3,c=[Math.round(LI((n[0]-u)/h)*h+u),Math.round(kI((n[1]-u)/h)*h+u)];qs(c,n),this._stepLvl=l,this._interval=h,this._niceExtent=c},parse:function(t){return+Eo(t)}});d(["contain","normalize"],function(t){OI.prototype[t]=function(e){return CI[t].call(this,this.parse(e))}});var NI=[["hh:mm:ss",1e3],["hh:mm:ss",5e3],["hh:mm:ss",1e4],["hh:mm:ss",15e3],["hh:mm:ss",3e4],["hh:mm\nMM-dd",6e4],["hh:mm\nMM-dd",3e5],["hh:mm\nMM-dd",6e5],["hh:mm\nMM-dd",9e5],["hh:mm\nMM-dd",18e5],["hh:mm\nMM-dd",36e5],["hh:mm\nMM-dd",72e5],["hh:mm\nMM-dd",216e5],["hh:mm\nMM-dd",432e5],["MM-dd\nyyyy",864e5],["MM-dd\nyyyy",1728e5],["MM-dd\nyyyy",2592e5],["MM-dd\nyyyy",3456e5],["MM-dd\nyyyy",432e6],["MM-dd\nyyyy",5184e5],["week",6048e5],["MM-dd\nyyyy",864e6],["week",12096e5],["week",18144e5],["month",26784e5],["week",36288e5],["month",53568e5],["week",36288e5],["quarter",8208e6],["month",107136e5],["month",13392e6],["half-year",16416e6],["month",214272e5],["month",26784e6],["year",32832e6]];OI.create=function(t){return new OI({useUTC:t.ecModel.get("useUTC")})};var EI=Fs.prototype,zI=AI.prototype,RI=Lo,BI=Ao,VI=Math.floor,GI=Math.ceil,WI=Math.pow,FI=Math.log,HI=Fs.extend({type:"log",base:10,$constructor:function(){Fs.apply(this,arguments),this._originalScale=new AI},getTicks:function(){var t=this._originalScale,e=this._extent,i=t.getExtent();return f(zI.getTicks.call(this),function(n){var o=Ao(WI(this.base,n));return o=n===e[0]&&t.__fixMin?nl(o,i[0]):o,o=n===e[1]&&t.__fixMax?nl(o,i[1]):o},this)},getLabel:zI.getLabel,scale:function(t){return t=EI.scale.call(this,t),WI(this.base,t)},setExtent:function(t,e){var i=this.base;t=FI(t)/FI(i),e=FI(e)/FI(i),zI.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=EI.getExtent.call(this);e[0]=WI(t,e[0]),e[1]=WI(t,e[1]);var i=this._originalScale,n=i.getExtent();return i.__fixMin&&(e[0]=nl(e[0],n[0])),i.__fixMax&&(e[1]=nl(e[1],n[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=FI(t[0])/FI(e),t[1]=FI(t[1])/FI(e),EI.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e,!0,function(t){return t>0}))},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0];if(!(i===1/0||i<=0)){var n=zo(i);for(t/i*n<=.5&&(n*=10);!isNaN(n)&&Math.abs(n)<1&&Math.abs(n)>0;)n*=10;var o=[Ao(GI(e[0]/n)*n),Ao(VI(e[1]/n)*n)];this._interval=n,this._niceExtent=o}},niceExtent:function(t){zI.niceExtent.call(this,t);var e=this._originalScale;e.__fixMin=t.fixMin,e.__fixMax=t.fixMax}});d(["contain","normalize"],function(t){HI.prototype[t]=function(e){return e=FI(e)/FI(this.base),EI[t].call(this,e)}}),HI.create=function(){return new HI};var ZI={getFormattedLabels:function(){return hl(this.axis,this.get("axisLabel.formatter"))},getMin:function(t){var e=this.option,i=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=i&&"dataMin"!==i&&"function"!=typeof i&&!I(i)&&(i=this.axis.scale.parse(i)),i},getMax:function(t){var e=this.option,i=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=i&&"dataMax"!==i&&"function"!=typeof i&&!I(i)&&(i=this.axis.scale.parse(i)),i},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:B,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}},UI=Nn({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,o=e.width/2,a=e.height/2;t.moveTo(i,n-a),t.lineTo(i+o,n+a),t.lineTo(i-o,n+a),t.closePath()}}),jI=Nn({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,o=e.width/2,a=e.height/2;t.moveTo(i,n-a),t.lineTo(i+o,n),t.lineTo(i,n+a),t.lineTo(i-o,n),t.closePath()}}),XI=Nn({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,n=e.y,o=e.width/5*3,a=Math.max(o,e.height),r=o/2,s=r*r/(a-r),l=n-a+r+s,h=Math.asin(s/r),u=Math.cos(h)*r,c=Math.sin(h),d=Math.cos(h),f=.6*r,p=.7*r;t.moveTo(i-u,l+s),t.arc(i,l,r,Math.PI-h,2*Math.PI+h),t.bezierCurveTo(i+u-c*f,l+s+d*f,i,n-p,i,n),t.bezierCurveTo(i,n-p,i-u+c*f,l+s+d*f,i-u,l+s),t.closePath()}}),YI=Nn({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.height,n=e.width,o=e.x,a=e.y,r=n/3*2;t.moveTo(o,a),t.lineTo(o+r,a+i),t.lineTo(o,a+i/4*3),t.lineTo(o-r,a+i),t.lineTo(o,a),t.closePath()}}),qI={line:function(t,e,i,n,o){o.x1=t,o.y1=e+n/2,o.x2=t+i,o.y2=e+n/2},rect:function(t,e,i,n,o){o.x=t,o.y=e,o.width=i,o.height=n},roundRect:function(t,e,i,n,o){o.x=t,o.y=e,o.width=i,o.height=n,o.r=Math.min(i,n)/4},square:function(t,e,i,n,o){var a=Math.min(i,n);o.x=t,o.y=e,o.width=a,o.height=a},circle:function(t,e,i,n,o){o.cx=t+i/2,o.cy=e+n/2,o.r=Math.min(i,n)/2},diamond:function(t,e,i,n,o){o.cx=t+i/2,o.cy=e+n/2,o.width=i,o.height=n},pin:function(t,e,i,n,o){o.x=t+i/2,o.y=e+n/2,o.width=i,o.height=n},arrow:function(t,e,i,n,o){o.x=t+i/2,o.y=e+n/2,o.width=i,o.height=n},triangle:function(t,e,i,n,o){o.cx=t+i/2,o.cy=e+n/2,o.width=i,o.height=n}},$I={};d({line:Gb,rect:Vb,roundRect:Vb,square:Vb,circle:Lb,diamond:jI,pin:XI,arrow:YI,triangle:UI},function(t,e){$I[e]=new t});var KI=Nn({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style;"pin"===this.shape.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,i){var n=e.symbolType,o=$I[n];"none"!==e.symbolType&&(o||(o=$I[n="rect"]),qI[n](e.x,e.y,e.width,e.height,o.shape),o.buildPath(t,o.shape,i))}}),JI=(Object.freeze||Object)({createList:function(t){return Bs(t.getSource(),t)},getLayoutRect:Ko,createScale:function(t,e){var i=e;_o.isInstance(e)||u(i=new _o(e),ZI);var n=sl(i);return n.setExtent(t[0],t[1]),rl(n,i),n},mixinAxisModelCommonMethods:function(t){u(t,ZI)},completeDimensions:Es,createDimensions:wI,createSymbol:dl}),QI=1e-8;gl.prototype={constructor:gl,properties:null,getBoundingRect:function(){var t=this._rect;if(t)return t;for(var e=Number.MAX_VALUE,i=[e,e],n=[-e,-e],o=[],a=[],r=this.geometries,s=0;s<r.length;s++)"polygon"===r[s].type&&(an(r[s].exterior,o,a),tt(i,i,o),et(n,n,a));return 0===s&&(i[0]=i[1]=n[0]=n[1]=0),this._rect=new Kt(i[0],i[1],n[0]-i[0],n[1]-i[1])},contain:function(t){var e=this.getBoundingRect(),i=this.geometries;if(!e.contain(t[0],t[1]))return!1;t:for(var n=0,o=i.length;n<o;n++)if("polygon"===i[n].type){var a=i[n].exterior,r=i[n].interiors;if(pl(a,t[0],t[1])){for(var s=0;s<(r?r.length:0);s++)if(pl(r[s]))continue t;return!0}}return!1},transformTo:function(t,e,i,n){var o=this.getBoundingRect(),a=o.width/o.height;i?n||(n=i/a):i=a*n;for(var r=new Kt(t,e,i,n),s=o.calculateTransform(r),l=this.geometries,h=0;h<l.length;h++)if("polygon"===l[h].type){for(var u=l[h].exterior,c=l[h].interiors,d=0;d<u.length;d++)Q(u[d],u[d],s);for(var f=0;f<(c?c.length:0);f++)for(d=0;d<c[f].length;d++)Q(c[f][d],c[f][d],s)}(o=this._rect).copy(r),this.center=[o.x+o.width/2,o.y+o.height/2]}};var tT=function(t){return ml(t),f(g(t.features,function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0}),function(t){var e=t.properties,i=t.geometry,n=i.coordinates,o=[];"Polygon"===i.type&&o.push({type:"polygon",exterior:n[0],interiors:n.slice(1)}),"MultiPolygon"===i.type&&d(n,function(t){t[0]&&o.push({type:"polygon",exterior:t[0],interiors:t.slice(1)})});var a=new gl(e.name,o,e.cp);return a.properties=e,a})},eT=Io,iT=[0,1],nT=function(t,e,i){this.dim=t,this.scale=e,this._extent=i||[0,0],this.inverse=!1,this.onBand=!1,this._labelInterval};nT.prototype={constructor:nT,contain:function(t){var e=this._extent,i=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return t>=i&&t<=n},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){return this._extent.slice()},getPixelPrecision:function(t){return ko(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var i=this._extent;i[0]=t,i[1]=e},dataToCoord:function(t,e){var i=this._extent,n=this.scale;return t=n.normalize(t),this.onBand&&"ordinal"===n.type&&yl(i=i.slice(),n.count()),eT(t,iT,i,e)},coordToData:function(t,e){var i=this._extent,n=this.scale;this.onBand&&"ordinal"===n.type&&yl(i=i.slice(),n.count());var o=eT(t,i,iT,e);return this.scale.scale(o)},pointToData:function(t,e){},getTicksCoords:function(t){if(this.onBand&&!t){for(var e=this.getBands(),i=[],n=0;n<e.length;n++)i.push(e[n][0]);return e[n-1]&&i.push(e[n-1][1]),i}return f(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){return f(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var t=this.getExtent(),e=[],i=this.scale.count(),n=t[0],o=t[1]-n,a=0;a<i;a++)e.push([o*a/i+n,o*(a+1)/i+n]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),i=e[1]-e[0]+(this.onBand?1:0);0===i&&(i=1);var n=Math.abs(t[1]-t[0]);return Math.abs(n)/i},isHorizontal:null,getRotate:null,getLabelInterval:function(){var t=this._labelInterval;if(!t){var e=this.model,i=e.getModel("axisLabel");t=i.get("interval"),"category"!==this.type||null!=t&&"auto"!==t||(t=ll(f(this.scale.getTicks(),this.dataToCoord,this),e.getFormattedLabels(),i.getFont(),this.getRotate?this.getRotate():this.isHorizontal&&!this.isHorizontal()?90:0,i.get("rotate"))),this._labelInterval=t}return t}};var oT=tT,aT={};d(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone","merge"],function(t){aT[t]=Ex[t]});gs({type:"dataset",defaultOption:{seriesLayoutBy:RS,sourceHeader:null,dimensions:null,source:null},optionUpdated:function(){sa(this)}});ms({type:"dataset"}),uM.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return Bs(this.getSource(),this)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{position:"top"},lineStyle:{width:2,type:"solid"},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:!1,connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}});var rT=bl.prototype;rT._createSymbol=function(t,e,i,n){this.removeAll();var o=dl(t,-1,-1,2,2,e.getItemVisual(i,"color"));o.attr({z2:100,culling:!0,scale:wl(n)}),o.drift=Sl,this._symbolType=t,this.add(o)},rT.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},rT.getSymbolPath=function(){return this.childAt(0)},rT.getScale=function(){return this.childAt(0).scale},rT.highlight=function(){this.childAt(0).trigger("emphasis")},rT.downplay=function(){this.childAt(0).trigger("normal")},rT.setZ=function(t,e){var i=this.childAt(0);i.zlevel=t,i.z=e},rT.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":"pointer"},rT.updateData=function(t,e,i){this.silent=!1;var n=t.getItemVisual(e,"symbol")||"circle",o=t.hostModel,a=_l(t,e),r=n!==this._symbolType;if(r?this._createSymbol(n,t,e,a):((s=this.childAt(0)).silent=!1,co(s,{scale:wl(a)},o,e)),this._updateCommon(t,e,a,i),r){var s=this.childAt(0),l=i&&i.fadeIn,h={scale:s.scale.slice()};l&&(h.style={opacity:s.style.opacity}),s.scale=[0,0],l&&(s.style.opacity=0),fo(s,h,o,e)}this._seriesModel=o};var sT=["itemStyle"],lT=["emphasis","itemStyle"],hT=["label"],uT=["emphasis","label"];rT._updateCommon=function(t,e,i,n){var o=this.childAt(0),r=t.hostModel,s=t.getItemVisual(e,"color");"image"!==o.type&&o.useStyle({strokeNoScale:!0});var l=n&&n.itemStyle,h=n&&n.hoverItemStyle,u=n&&n.symbolRotate,c=n&&n.symbolOffset,d=n&&n.labelModel,f=n&&n.hoverLabelModel,p=n&&n.hoverAnimation,g=n&&n.cursorStyle;if(!n||t.hasItemOption){var m=n&&n.itemModel?n.itemModel:t.getItemModel(e);l=m.getModel(sT).getItemStyle(["color"]),h=m.getModel(lT).getItemStyle(),u=m.getShallow("symbolRotate"),c=m.getShallow("symbolOffset"),d=m.getModel(hT),f=m.getModel(uT),p=m.getShallow("hoverAnimation"),g=m.getShallow("cursor")}else h=a({},h);var v=o.style;o.attr("rotation",(u||0)*Math.PI/180||0),c&&o.attr("position",[To(c[0],i[0]),To(c[1],i[1])]),g&&o.attr("cursor",g),o.setColor(s,n&&n.symbolInnerColor),o.setStyle(l);var y=t.getItemVisual(e,"opacity");null!=y&&(v.opacity=y);var x=n&&n.useNameLabel;eo(v,h,d,f,{labelFetcher:r,labelDataIndex:e,defaultText:function(e,i){return x?t.getName(e):xl(t,e)},isRectText:!0,autoColor:s}),o.off("mouseover").off("mouseout").off("emphasis").off("normal"),o.hoverStyle=h,to(o);var _=wl(i);if(p&&r.isAnimationEnabled()){var w=function(){var t=_[1]/_[0];this.animateTo({scale:[Math.max(1.1*_[0],_[0]+3),Math.max(1.1*_[1],_[1]+3*t)]},400,"elasticOut")},b=function(){this.animateTo({scale:_},400,"elasticOut")};o.on("mouseover",w).on("mouseout",b).on("emphasis",w).on("normal",b)}},rT.fadeOut=function(t,e){var i=this.childAt(0);this.silent=i.silent=!0,!(e&&e.keepLabel)&&(i.style.text=null),co(i,{style:{opacity:0},scale:[0,0]},this._seriesModel,this.dataIndex,t)},h(bl,S_);var cT=Ml.prototype;cT.updateData=function(t,e){var i=this.group,n=t.hostModel,o=this._data,a=this._symbolCtor,r=Tl(t);o||i.removeAll(),t.diff(o).add(function(n){var o=t.getItemLayout(n);if(Il(t,o,n,e)){var s=new a(t,n,r);s.attr("position",o),t.setItemGraphicEl(n,s),i.add(s)}}).update(function(s,l){var h=o.getItemGraphicEl(l),u=t.getItemLayout(s);Il(t,u,s,e)?(h?(h.updateData(t,s,r),co(h,{position:u},n)):(h=new a(t,s)).attr("position",u),i.add(h),t.setItemGraphicEl(s,h)):i.remove(h)}).remove(function(t){var e=o.getItemGraphicEl(t);e&&e.fadeOut(function(){i.remove(e)})}).execute(),this._data=t},cT.isPersistent=function(){return!0},cT.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,i){var n=t.getItemLayout(i);e.attr("position",n)})},cT.incrementalPrepareUpdate=function(t){this._seriesScope=Tl(t),this._data=null,this.group.removeAll()},cT.incrementalUpdate=function(t,e,i){for(var n=t.start;n<t.end;n++){var o=e.getItemLayout(n);if(Il(e,o,n,i)){var a=new this._symbolCtor(e,n,this._seriesScope);a.traverse(function(t){t.isGroup||(t.incremental=t.useHoverLayer=!0)}),a.attr("position",o),this.group.add(a),e.setItemGraphicEl(n,a)}}},cT.remove=function(t){var e=this.group,i=this._data;i&&(t?i.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())};var dT=function(t,e,i,n,o,a){for(var r=Cl(t,e),s=[],l=[],h=[],u=[],c=[],d=[],f=[],p=a.dimensions,g=0;g<r.length;g++){var m=r[g],v=!0;switch(m.cmd){case"=":var y=t.getItemLayout(m.idx),x=e.getItemLayout(m.idx1);(isNaN(y[0])||isNaN(y[1]))&&(y=x.slice()),s.push(y),l.push(x),h.push(i[m.idx]),u.push(n[m.idx1]),f.push(e.getRawIndex(m.idx1));break;case"+":_=m.idx;s.push(o.dataToPoint([e.get(p[0],_,!0),e.get(p[1],_,!0)])),l.push(e.getItemLayout(_).slice()),h.push(Dl(o,e,_)),u.push(n[_]),f.push(e.getRawIndex(_));break;case"-":var _=m.idx,w=t.getRawIndex(_);w!==_?(s.push(t.getItemLayout(_)),l.push(a.dataToPoint([t.get(p[0],_,!0),t.get(p[1],_,!0)])),h.push(i[_]),u.push(Dl(a,t,_)),f.push(w)):v=!1}v&&(c.push(m),d.push(d.length))}d.sort(function(t,e){return f[t]-f[e]});for(var b=[],S=[],M=[],I=[],T=[],g=0;g<d.length;g++){_=d[g];b[g]=s[_],S[g]=l[_],M[g]=h[_],I[g]=u[_],T[g]=c[_]}return{current:b,next:S,stackedOnCurrent:M,stackedOnNext:I,status:T}},fT=tt,pT=et,gT=Z,mT=G,vT=[],yT=[],xT=[],_T=Mn.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},brush:Pb(Mn.prototype.brush),buildPath:function(t,e){var i=e.points,n=0,o=i.length,a=Pl(i,e.smoothConstraint);if(e.connectNulls){for(;o>0&&Ll(i[o-1]);o--);for(;n<o&&Ll(i[n]);n++);}for(;n<o;)n+=kl(t,i,n,o,o,1,a.min,a.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),wT=Mn.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},brush:Pb(Mn.prototype.brush),buildPath:function(t,e){var i=e.points,n=e.stackedOnPoints,o=0,a=i.length,r=e.smoothMonotone,s=Pl(i,e.smoothConstraint),l=Pl(n,e.smoothConstraint);if(e.connectNulls){for(;a>0&&Ll(i[a-1]);a--);for(;o<a&&Ll(i[o]);o++);}for(;o<a;){var h=kl(t,i,o,a,a,1,s.min,s.max,e.smooth,r,e.connectNulls);kl(t,n,o+h-1,h,a,-1,l.min,l.max,e.stackedOnSmooth,r,e.connectNulls),o+=h+1,t.closePath()}}});cr.extend({type:"line",init:function(){var t=new S_,e=new Ml;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,i){var n=t.coordinateSystem,o=this.group,a=t.getData(),s=t.getModel("lineStyle"),l=t.getModel("areaStyle"),h=a.mapArray(a.getItemLayout,!0),u="polar"===n.type,c=this._coordSys,d=this._symbolDraw,f=this._polyline,p=this._polygon,g=this._lineGroup,m=t.get("animation"),v=!l.isEmpty(),y=Rl(0,n,a,l.get("origin")),x=t.get("showSymbol"),_=x&&!u&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(a,n),w=this._data;w&&w.eachItemGraphicEl(function(t,e){t.__temp&&(o.remove(t),w.setItemGraphicEl(e,null))}),x||d.remove(),o.add(g);var b=!u&&t.get("step");f&&c.type===n.type&&b===this._step?(v&&!p?p=this._newPolygon(h,y,n,m):p&&!v&&(g.remove(p),p=this._polygon=null),g.setClipPath(Gl(n,!1,t)),x&&d.updateData(a,_),a.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),Ol(this._stackedOnPoints,y)&&Ol(this._points,h)||(m?this._updateAnimation(a,y,n,i,b):(b&&(h=Wl(h,n,b),y=Wl(y,n,b)),f.setShape({points:h}),p&&p.setShape({points:h,stackedOnPoints:y})))):(x&&d.updateData(a,_),b&&(h=Wl(h,n,b),y=Wl(y,n,b)),f=this._newPolyline(h,n,m),v&&(p=this._newPolygon(h,y,n,m)),g.setClipPath(Gl(n,!0,t)));var S=Fl(a,n)||a.getVisual("color");f.useStyle(r(s.getLineStyle(),{fill:"none",stroke:S,lineJoin:"bevel"}));var M=t.get("smooth");if(M=Nl(t.get("smooth")),f.setShape({smooth:M,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),p){var I=a.stackedOn,T=0;p.useStyle(r(l.getAreaStyle(),{fill:S,opacity:.7,lineJoin:"bevel"})),I&&(T=Nl(I.hostModel.get("smooth"))),p.setShape({smooth:M,stackedOnSmooth:T,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=a,this._coordSys=n,this._stackedOnPoints=y,this._points=h,this._step=b},dispose:function(){},highlight:function(t,e,i,n){var o=t.getData(),a=ki(o,n);if(!(a instanceof Array)&&null!=a&&a>=0){var r=o.getItemGraphicEl(a);if(!r){var s=o.getItemLayout(a);if(!s)return;(r=new bl(o,a)).position=s,r.setZ(t.get("zlevel"),t.get("z")),r.ignore=isNaN(s[0])||isNaN(s[1]),r.__temp=!0,o.setItemGraphicEl(a,r),r.stopSymbolAnimation(!0),this.group.add(r)}r.highlight()}else cr.prototype.highlight.call(this,t,e,i,n)},downplay:function(t,e,i,n){var o=t.getData(),a=ki(o,n);if(null!=a&&a>=0){var r=o.getItemGraphicEl(a);r&&(r.__temp?(o.setItemGraphicEl(a,null),this.group.remove(r)):r.downplay())}else cr.prototype.downplay.call(this,t,e,i,n)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new _T({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var i=this._polygon;return i&&this._lineGroup.remove(i),i=new wT({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(i),this._polygon=i,i},_getSymbolIgnoreFunc:function(t,e){var i=e.getAxesByScale("ordinal")[0];if(i&&i.isLabelIgnored)return m(i.isLabelIgnored,i)},_updateAnimation:function(t,e,i,n,o){var a=this._polyline,r=this._polygon,s=t.hostModel,l=dT(this._data,t,this._stackedOnPoints,e,this._coordSys,i),h=l.current,u=l.stackedOnCurrent,c=l.next,d=l.stackedOnNext;o&&(h=Wl(l.current,i,o),u=Wl(l.stackedOnCurrent,i,o),c=Wl(l.next,i,o),d=Wl(l.stackedOnNext,i,o)),a.shape.__points=l.current,a.shape.points=h,co(a,{shape:{points:c}},s),r&&(r.setShape({points:h,stackedOnPoints:u}),co(r,{shape:{points:c,stackedOnPoints:d}},s));for(var f=[],p=l.status,g=0;g<p.length;g++)if("="===p[g].cmd){var m=t.getItemGraphicEl(p[g].idx1);m&&f.push({el:m,ptIdx:g})}a.animators&&a.animators.length&&a.animators[0].during(function(){for(var t=0;t<f.length;t++)f[t].el.attr("position",a.shape.__points[f[t].ptIdx])})},remove:function(t){var e=this.group,i=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),i&&i.eachItemGraphicEl(function(t,n){t.__temp&&(e.remove(t),i.setItemGraphicEl(n,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}});var bT=function(t,e,i){return{seriesType:t,performRawSeries:!0,reset:function(t,n,o){var a=t.getData(),r=t.get("symbol")||e,s=t.get("symbolSize");if(a.setVisual({legendSymbol:i||r,symbol:r,symbolSize:s}),!n.isSeriesFiltered(t)){var l="function"==typeof s;return{dataEach:a.hasItemOption||l?function(e,i){if("function"==typeof s){var n=t.getRawValue(i),o=t.getDataParams(i);e.setItemVisual(i,"symbolSize",s(n,o))}if(e.hasItemOption){var a=e.getItemModel(i),r=a.getShallow("symbol",!0),l=a.getShallow("symbolSize",!0);null!=r&&e.setItemVisual(i,"symbol",r),null!=l&&e.setItemVisual(i,"symbolSize",l)}}:null}}}}},ST=function(t){return{seriesType:t,plan:fM(),reset:function(t){var e=t.getData(),i=t.coordinateSystem,n=t.pipelineContext.large;if(i){var o=f(i.dimensions,function(t){return e.getDimension(e.mapDimension(t))}).slice(0,2),a=o.length;return a&&{progress:function(t,e){for(var r=t.end-t.start,s=n&&new Float32Array(r*a),l=t.start,h=0,u=[],c=[];l<t.end;l++){var d;if(1===a)f=e.get(o[0],l,!0),d=!isNaN(f)&&i.dataToPoint(f,null,c);else{var f=u[0]=e.get(o[0],l,!0),p=u[1]=e.get(o[1],l,!0);d=!isNaN(f)&&!isNaN(p)&&i.dataToPoint(u,null,c)}n?(s[h++]=d?d[0]:NaN,s[h++]=d?d[1]:NaN):e.setItemLayout(l,d&&d.slice()||[NaN,NaN])}n&&e.setLayout("symbolPoints",s)}}}}}},MT={average:function(t){for(var e=0,i=0,n=0;n<t.length;n++)isNaN(t[n])||(e+=t[n],i++);return 0===i?NaN:e/i},sum:function(t){for(var e=0,i=0;i<t.length;i++)e+=t[i]||0;return e},max:function(t){for(var e=-1/0,i=0;i<t.length;i++)t[i]>e&&(e=t[i]);return e},min:function(t){for(var e=1/0,i=0;i<t.length;i++)t[i]<e&&(e=t[i]);return e},nearest:function(t){return t[0]}},IT=function(t,e){return Math.round(t.length/2)},TT=function(t){this._axes={},this._dimList=[],this.name=t||""};TT.prototype={constructor:TT,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return f(this._dimList,Hl,this)},getAxesByScale:function(t){return t=t.toLowerCase(),g(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var i=this._dimList,n=t instanceof Array?[]:{},o=0;o<i.length;o++){var a=i[o],r=this._axes[a];n[a]=r[e](t[a])}return n}},Zl.prototype={constructor:Zl,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),i=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&i.contain(i.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoint:function(t,e,i){var n=this.getAxis("x"),o=this.getAxis("y");return i=i||[],i[0]=n.toGlobalCoord(n.dataToCoord(t[0])),i[1]=o.toGlobalCoord(o.dataToCoord(t[1])),i},clampData:function(t,e){var i=this.getAxis("x").scale.getExtent(),n=this.getAxis("y").scale.getExtent();return e=e||[],e[0]=Math.min(Math.max(Math.min(i[0],i[1]),t[0]),Math.max(i[0],i[1])),e[1]=Math.min(Math.max(Math.min(n[0],n[1]),t[1]),Math.max(n[0],n[1])),e},pointToData:function(t,e){var i=this.getAxis("x"),n=this.getAxis("y");return e=e||[],e[0]=i.coordToData(i.toLocalCoord(t[0])),e[1]=n.coordToData(n.toLocalCoord(t[1])),e},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")}},h(Zl,TT);var AT=function(t,e,i,n,o){nT.call(this,t,e,i),this.type=n||"value",this.position=o||"bottom"};AT.prototype={constructor:AT,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},h(AT,nT);var DT={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#333",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},CT={};CT.categoryAxis=n({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},DT),CT.valueAxis=n({boundaryGap:[0,0],splitNumber:5},DT),CT.timeAxis=r({scale:!0,min:"dataMin",max:"dataMax"},CT.valueAxis),CT.logAxis=r({scale:!0,logBase:10},CT.valueAxis);var LT=["value","category","time","log"],kT=function(t,e,i,a){d(LT,function(r){e.extend({type:t+"Axis."+r,mergeDefaultAndTheme:function(e,o){var a=this.layoutMode,s=a?ea(e):{};n(e,o.getTheme().get(r+"Axis")),n(e,this.getDefaultOption()),e.type=i(t,e),a&&ta(e,s,a)},optionUpdated:function(){"category"===this.option.type&&(this.__ordinalMeta=Hs.createByAxisModel(this))},getCategories:function(){if("category"===this.option.type)return this.__ordinalMeta.categories},getOrdinalMeta:function(){return this.__ordinalMeta},defaultOption:o([{},CT[r+"Axis"],a],!0)})}),IS.registerSubTypeDefaulter(t+"Axis",v(i,t))},PT=IS.extend({type:"cartesian2dAxis",axis:null,init:function(){PT.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){PT.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){PT.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});n(PT.prototype,ZI);var OT={offset:0};kT("x",PT,Ul,OT),kT("y",PT,Ul,OT),IS.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}});var NT=d,ET=function(t){var e=t.scale.getExtent(),i=e[0],n=e[1];return!(i>0&&n>0||i<0&&n<0)},zT=rl,RT=ql.prototype;RT.type="grid",RT.axisPointerEnabled=!0,RT.getRect=function(){return this._rect},RT.update=function(t,e){var i=this._axesMap;this._updateScale(t,this.model),NT(i.x,function(t){zT(t.scale,t.model)}),NT(i.y,function(t){zT(t.scale,t.model)}),NT(i.x,function(t){$l(i,"y",t)}),NT(i.y,function(t){$l(i,"x",t)}),this.resize(this.model,e)},RT.resize=function(t,e,i){function n(){NT(a,function(t){var e=t.isHorizontal(),i=e?[0,o.width]:[0,o.height],n=t.inverse?1:0;t.setExtent(i[n],i[1-n]),Jl(t,e?o.x:o.y)})}var o=Ko(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=o;var a=this._axesList;n(),!i&&t.get("containLabel")&&(NT(a,function(t){if(!t.model.get("axisLabel.inside")){var e=Yl(t);if(e){var i=t.isHorizontal()?"height":"width",n=t.model.get("axisLabel.margin");o[i]-=e[i]+n,"top"===t.position?o.y+=e.height+n:"left"===t.position&&(o.x+=e.width+n)}}}),n())},RT.getAxis=function(t,e){var i=this._axesMap[t];if(null!=i){if(null==e)for(var n in i)if(i.hasOwnProperty(n))return i[n];return i[e]}},RT.getAxes=function(){return this._axesList.slice()},RT.getCartesian=function(t,e){if(null!=t&&null!=e){var i="x"+t+"y"+e;return this._coordsMap[i]}w(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var n=0,o=this._coordsList;n<o.length;n++)if(o[n].getAxis("x").index===t||o[n].getAxis("y").index===e)return o[n]},RT.getCartesians=function(){return this._coordsList.slice()},RT.convertToPixel=function(t,e,i){var n=this._findConvertTarget(t,e);return n.cartesian?n.cartesian.dataToPoint(i):n.axis?n.axis.toGlobalCoord(n.axis.dataToCoord(i)):null},RT.convertFromPixel=function(t,e,i){var n=this._findConvertTarget(t,e);return n.cartesian?n.cartesian.pointToData(i):n.axis?n.axis.coordToData(n.axis.toLocalCoord(i)):null},RT._findConvertTarget=function(t,e){var i,n,o=e.seriesModel,a=e.xAxisModel||o&&o.getReferringComponents("xAxis")[0],r=e.yAxisModel||o&&o.getReferringComponents("yAxis")[0],s=e.gridModel,h=this._coordsList;return o?l(h,i=o.coordinateSystem)<0&&(i=null):a&&r?i=this.getCartesian(a.componentIndex,r.componentIndex):a?n=this.getAxis("x",a.componentIndex):r?n=this.getAxis("y",r.componentIndex):s&&s.coordinateSystem===this&&(i=this._coordsList[0]),{cartesian:i,axis:n}},RT.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},RT._initCartesian=function(t,e,i){function n(i){return function(n,s){if(jl(n,t,e)){var l=n.get("position");"x"===i?"top"!==l&&"bottom"!==l&&o[l="bottom"]&&(l="top"===l?"bottom":"top"):"left"!==l&&"right"!==l&&o[l="left"]&&(l="left"===l?"right":"left"),o[l]=!0;var h=new AT(i,sl(n),[0,0],n.get("type"),l),u="category"===h.type;h.onBand=u&&n.get("boundaryGap"),h.inverse=n.get("inverse"),h.onZero=n.get("axisLine.onZero"),h.onZeroAxisIndex=n.get("axisLine.onZeroAxisIndex"),n.axis=h,h.model=n,h.grid=this,h.index=s,this._axesList.push(h),a[i][s]=h,r[i]++}}}var o={left:!1,right:!1,top:!1,bottom:!1},a={x:{},y:{}},r={x:0,y:0};if(e.eachComponent("xAxis",n("x"),this),e.eachComponent("yAxis",n("y"),this),!r.x||!r.y)return this._axesMap={},void(this._axesList=[]);this._axesMap=a,NT(a.x,function(e,i){NT(a.y,function(n,o){var a="x"+i+"y"+o,r=new Zl(a);r.grid=this,r.model=t,this._coordsMap[a]=r,this._coordsList.push(r),r.addAxis(e),r.addAxis(n)},this)},this)},RT._updateScale=function(t,e){function i(t,e,i){NT(t.mapDimension(e.dim,!0),function(i){e.scale.unionExtentFromData(t,i)})}d(this._axesList,function(t){t.scale.setExtent(1/0,-1/0)}),t.eachSeries(function(n){if(th(n)){var o=Ql(n),a=o[0],r=o[1];if(!jl(a,e,t)||!jl(r,e,t))return;var s=this.getCartesian(a.componentIndex,r.componentIndex),l=n.getData(),h=s.getAxis("x"),u=s.getAxis("y");"list"===l.type&&(i(l,h),i(l,u))}},this)},RT.getTooltipAxes=function(t){var e=[],i=[];return NT(this.getCartesians(),function(n){var o=null!=t&&"auto"!==t?n.getAxis(t):n.getBaseAxis(),a=n.getOtherAxis(o);l(e,o)<0&&e.push(o),l(i,a)<0&&i.push(a)}),{baseAxes:e,otherAxes:i}};var BT=["xAxis","yAxis"];ql.create=function(t,e){var i=[];return t.eachComponent("grid",function(n,o){var a=new ql(n,t,e);a.name="grid_"+o,a.resize(n,e,!0),n.coordinateSystem=a,i.push(a)}),t.eachSeries(function(t){if(th(t)){var e=Ql(t),i=e[0],n=e[1],o=i.getCoordSysModel().coordinateSystem;t.coordinateSystem=o.getCartesian(i.componentIndex,n.componentIndex)}}),i},ql.dimensions=ql.prototype.dimensions=Zl.prototype.dimensions,Aa.register("cartesian2d",ql);var VT=Math.PI,GT=function(t,e){this.opt=e,this.axisModel=t,r(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new S_;var i=new S_({position:e.position.slice(),rotation:e.rotation});i.updateTransform(),this._transform=i.transform,this._dumbGroup=i};GT.prototype={constructor:GT,hasBuilder:function(t){return!!WT[t]},add:function(t){WT[t].call(this)},getGroup:function(){return this.group}};var WT={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var i=this.axisModel.axis.getExtent(),n=this._transform,o=[i[0],0],r=[i[1],0];n&&(Q(o,o,n),Q(r,r,n));var s=a({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle());this.group.add(new Gb(Vn({anid:"line",shape:{x1:o[0],y1:o[1],x2:r[0],y2:r[1]},style:s,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1})));var l=e.get("axisLine.symbol"),h=e.get("axisLine.symbolSize");if(null!=l){"string"==typeof l&&(l=[l,l]),"string"!=typeof h&&"number"!=typeof h||(h=[h,h]);var u=h[0],c=h[1];d([[t.rotation+Math.PI/2,o],[t.rotation-Math.PI/2,r]],function(t,e){if("none"!==l[e]&&null!=l[e]){var i=dl(l[e],-u/2,-c/2,u,c,s.stroke,!0);i.attr({rotation:t[0],position:t[1],silent:!0}),this.group.add(i)}},this)}}},axisTickLabel:function(){var t=this.axisModel,e=this.opt,i=lh(this,t,e);oh(t,hh(this,t,e),i)},axisName:function(){var t=this.opt,e=this.axisModel,i=T(t.axisName,e.get("name"));if(i){var n,o=e.get("nameLocation"),r=t.nameDirection,s=e.getModel("nameTextStyle"),l=e.get("nameGap")||0,h=this.axisModel.axis.getExtent(),u=h[0]>h[1]?-1:1,c=["start"===o?h[0]-u*l:"end"===o?h[1]+u*l:(h[0]+h[1])/2,sh(o)?t.labelOffset+r*l:0],d=e.get("nameRotate");null!=d&&(d=d*VT/180);var f;sh(o)?n=FT(t.rotation,null!=d?d:t.rotation,r):(n=ih(t,o,d||0,h),null!=(f=t.axisNameAvailableWidth)&&(f=Math.abs(f/Math.sin(n.rotation)),!isFinite(f)&&(f=null)));var p=s.getFont(),g=e.get("nameTruncate",!0)||{},m=g.ellipsis,v=T(t.nameTruncateMaxWidth,g.maxWidth,f),y=null!=m&&null!=v?mS(i,v,p,m,{minChar:2,placeholder:g.placeholder}):i,x=e.get("tooltip",!0),_=e.mainType,w={componentType:_,name:i,$vars:["name"]};w[_+"Index"]=e.componentIndex;var b=new Cb({anid:"name",__fullText:i,__truncatedText:y,position:c,rotation:n.rotation,silent:nh(e),z2:1,tooltip:x&&x.show?a({content:i,formatter:function(){return i},formatterParams:w},x):null});io(b.style,s,{text:y,textFont:p,textFill:s.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:n.textAlign,textVerticalAlign:n.textVerticalAlign}),e.get("triggerEvent")&&(b.eventData=eh(e),b.eventData.targetType="axisName",b.eventData.name=i),this._dumbGroup.add(b),b.updateTransform(),this.group.add(b),b.decomposeTransform()}}},FT=GT.innerTextLayout=function(t,e,i){var n,o,a=Oo(e-t);return No(a)?(o=i>0?"top":"bottom",n="center"):No(a-VT)?(o=i>0?"bottom":"top",n="center"):(o="middle",n=a>0&&a<VT?i>0?"right":"left":i>0?"left":"right"),{rotation:a,textAlign:n,textVerticalAlign:o}},HT=GT.ifIgnoreOnTick=function(t,e,i,n,o,a){if(0===e&&o||e===n-1&&a)return!1;var r,s=t.scale;return"ordinal"===s.type&&("function"==typeof i?(r=s.getTicks()[e],!i(r,s.getLabel(r))):e%(i+1))},ZT=GT.getInterval=function(t,e){var i=t.get("interval");return null!=i&&"auto"!=i||(i=e),i},UT=d,jT=v,XT=ms({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,i,n){this.axisPointerClass&&mh(t),XT.superApply(this,"render",arguments),wh(this,t,0,i,0,!0)},updateAxisPointer:function(t,e,i,n,o){wh(this,t,0,i,0,!1)},remove:function(t,e){var i=this._axisPointer;i&&i.remove(e),XT.superApply(this,"remove",arguments)},dispose:function(t,e){bh(this,e),XT.superApply(this,"dispose",arguments)}}),YT=[];XT.registerAxisPointerClass=function(t,e){YT[t]=e},XT.getAxisPointerClass=function(t){return t&&YT[t]};var qT=GT.ifIgnoreOnTick,$T=GT.getInterval,KT=["axisLine","axisTickLabel","axisName"],JT=["splitArea","splitLine"],QT=XT.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(t,e,i,n){this.group.removeAll();var o=this._axisGroup;if(this._axisGroup=new S_,this.group.add(this._axisGroup),t.get("show")){var a=t.getCoordSysModel(),r=Sh(a,t),s=new GT(t,r);d(KT,s.add,s),this._axisGroup.add(s.getGroup()),d(JT,function(e){t.get(e+".show")&&this["_"+e](t,a,r.labelInterval)},this),vo(o,this._axisGroup,t),QT.superCall(this,"render",t,e,i,n)}},_splitLine:function(t,e,i){var n=t.axis;if(!n.scale.isBlank()){var o=t.getModel("splitLine"),a=o.getModel("lineStyle"),s=a.get("color"),l=$T(o,i);s=y(s)?s:[s];for(var h=e.coordinateSystem.getRect(),u=n.isHorizontal(),c=0,d=n.getTicksCoords(),f=n.scale.getTicks(),p=t.get("axisLabel.showMinLabel"),g=t.get("axisLabel.showMaxLabel"),m=[],v=[],x=a.getLineStyle(),_=0;_<d.length;_++)if(!qT(n,_,l,d.length,p,g)){var w=n.toGlobalCoord(d[_]);u?(m[0]=w,m[1]=h.y,v[0]=w,v[1]=h.y+h.height):(m[0]=h.x,m[1]=w,v[0]=h.x+h.width,v[1]=w);var b=c++%s.length;this._axisGroup.add(new Gb(Vn({anid:"line_"+f[_],shape:{x1:m[0],y1:m[1],x2:v[0],y2:v[1]},style:r({stroke:s[b]},x),silent:!0})))}}},_splitArea:function(t,e,i){var n=t.axis;if(!n.scale.isBlank()){var o=t.getModel("splitArea"),a=o.getModel("areaStyle"),s=a.get("color"),l=e.coordinateSystem.getRect(),h=n.getTicksCoords(),u=n.scale.getTicks(),c=n.toGlobalCoord(h[0]),d=n.toGlobalCoord(h[0]),f=0,p=$T(o,i),g=a.getAreaStyle();s=y(s)?s:[s];for(var m=t.get("axisLabel.showMinLabel"),v=t.get("axisLabel.showMaxLabel"),x=1;x<h.length;x++)if(!qT(n,x,p,h.length,m,v)){var _,w,b,S,M=n.toGlobalCoord(h[x]);n.isHorizontal()?(_=c,w=l.y,b=M-_,S=l.height):(_=l.x,w=d,b=l.width,S=M-w);var I=f++%s.length;this._axisGroup.add(new Vb({anid:"area_"+u[x],shape:{x:_,y:w,width:b,height:S},style:r({fill:s[I]},g),silent:!0})),c=_+b,d=w+S}}}});QT.extend({type:"xAxis"}),QT.extend({type:"yAxis"}),ms({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new Vb({shape:t.coordinateSystem.getRect(),style:r({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),ss(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})}),ds(bT("line","circle","line")),cs(ST("line")),ls(FM.PROCESSOR.STATISTIC,function(t){return{seriesType:t,reset:function(t,e,i){var n=t.getData(),o=t.get("sampling"),a=t.coordinateSystem;if("cartesian2d"===a.type&&o){var r=a.getBaseAxis(),s=a.getOtherAxis(r),l=r.getExtent(),h=l[1]-l[0],u=Math.round(n.count()/h);if(u>1){var c;"string"==typeof o?c=MT[o]:"function"==typeof o&&(c=o),c&&t.setData(n.downSample(s.dim,1/u,c,IT))}}}}}("line"));var tA=uM.extend({type:"series.__base_bar__",getInitialData:function(t,e){return Bs(this.getSource(),this)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var i=e.dataToPoint(e.clampData(t)),n=this.getData(),o=n.getLayout("offset"),a=n.getLayout("size");return i[e.getBaseAxis().isHorizontal()?0:1]+=o+a/2,i}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,itemStyle:{},emphasis:{}}});tA.extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect"});var eA=Sw([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),iA={getBarItemStyle:function(t){var e=eA(this,t);if(this.getBorderLineDash){var i=this.getBorderLineDash();i&&(e.lineDash=i)}return e}},nA=["itemStyle","barBorderWidth"];a(_o.prototype,iA),ys({type:"bar",render:function(t,e,i){var n=t.get("coordinateSystem");return"cartesian2d"!==n&&"polar"!==n||this._render(t,e,i),this.group},dispose:B,_render:function(t,e,i){var n,o=this.group,a=t.getData(),r=this._data,s=t.coordinateSystem,l=s.getBaseAxis();"cartesian2d"===s.type?n=l.isHorizontal():"polar"===s.type&&(n="angle"===l.dim);var h=t.isAnimationEnabled()?t:null;a.diff(r).add(function(e){if(a.hasValue(e)){var i=a.getItemModel(e),r=aA[s.type](a,e,i),l=oA[s.type](a,e,i,r,n,h);a.setItemGraphicEl(e,l),o.add(l),Dh(l,a,e,i,r,t,n,"polar"===s.type)}}).update(function(e,i){var l=r.getItemGraphicEl(i);if(a.hasValue(e)){var u=a.getItemModel(e),c=aA[s.type](a,e,u);l?co(l,{shape:c},h,e):l=oA[s.type](a,e,u,c,n,h,!0),a.setItemGraphicEl(e,l),o.add(l),Dh(l,a,e,u,c,t,n,"polar"===s.type)}else o.remove(l)}).remove(function(t){var e=r.getItemGraphicEl(t);"cartesian2d"===s.type?e&&Th(t,h,e):e&&Ah(t,h,e)}).execute(),this._data=a},remove:function(t,e){var i=this.group,n=this._data;t.get("animation")?n&&n.eachItemGraphicEl(function(e){"sector"===e.type?Ah(e.dataIndex,t,e):Th(e.dataIndex,t,e)}):i.removeAll()}});var oA={cartesian2d:function(t,e,i,n,o,r,s){var l=new Vb({shape:a({},n)});if(r){var h=l.shape,u=o?"height":"width",c={};h[u]=0,c[u]=n[u],tS[s?"updateProps":"initProps"](l,{shape:c},r,e)}return l},polar:function(t,e,i,n,o,r,s){var l=new Ob({shape:a({},n)});if(r){var h=l.shape,u=o?"r":"endAngle",c={};h[u]=o?0:n.startAngle,c[u]=n[u],tS[s?"updateProps":"initProps"](l,{shape:c},r,e)}return l}},aA={cartesian2d:function(t,e,i){var n=t.getItemLayout(e),o=Ch(i,n),a=n.width>0?1:-1,r=n.height>0?1:-1;return{x:n.x+a*o/2,y:n.y+r*o/2,width:n.width-a*o,height:n.height-r*o}},polar:function(t,e,i){var n=t.getItemLayout(e);return{cx:n.cx,cy:n.cy,r0:n.r0,r:n.r,startAngle:n.startAngle,endAngle:n.endAngle}}};cs(v(il,"bar")),ds(function(t){t.eachSeriesByType("bar",function(t){t.getData().setVisual("legendSymbol","roundRect")})});var rA=function(t,e,i){e=y(e)&&{coordDimensions:e}||a({},e);var n=t.getSource(),o=wI(n,e),r=new yI(o,t);return r.initData(n,i),r},sA={updateSelectedMap:function(t){if(y(t))this._targetList=t.slice();else for(var e=t,i=e.mapDimension("value"),t=this._targetList=[],n=0,o=e.count();n<o;n++)t.push({name:e.getName(n),value:e.get(i,n),selected:Qa(e,n,"selected")});this._selectTargetMap=p(t||[],function(t,e){return t.set(e.name,e),t},z())},select:function(t,e){var i=null!=e?this._targetList[e]:this._selectTargetMap.get(t);"single"===this.get("selectedMode")&&this._selectTargetMap.each(function(t){t.selected=!1}),i&&(i.selected=!0)},unSelect:function(t,e){var i=null!=e?this._targetList[e]:this._selectTargetMap.get(t);i&&(i.selected=!1)},toggleSelected:function(t,e){var i=null!=e?this._targetList[e]:this._selectTargetMap.get(t);if(null!=i)return this[i.selected?"unSelect":"select"](t,e),i.selected},isSelected:function(t,e){var i=null!=e?this._targetList[e]:this._selectTargetMap.get(t);return i&&i.selected}},lA=vs({type:"series.pie",init:function(t){lA.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(this.getRawData()),this._defaultLabelLine(t)},mergeOption:function(t){lA.superCall(this,"mergeOption",t),this.updateSelectedMap(this.getRawData())},getInitialData:function(t,e){return rA(this,["value"])},getDataParams:function(t){var e=this.getData(),i=lA.superCall(this,"getDataParams",t),n=[];return e.each(e.mapDimension("value"),function(t){n.push(t)}),i.percent=Po(n,t,e.hostModel.get("percentPrecision")),i.$vars.push("percent"),i},_defaultLabelLine:function(t){Mi(t,"labelLine",["show"]);var e=t.labelLine,i=t.emphasis.labelLine;e.show=e.show&&t.label.show,i.show=i.show&&t.emphasis.label.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,hoverOffset:10,avoidLabelOverlap:!0,percentPrecision:2,stillShowZeroSum:!0,label:{rotate:!1,show:!0,position:"outer"},labelLine:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1},animationType:"expansion",animationEasing:"cubicOut"}});u(lA,sA);var hA=Ph.prototype;hA.updateData=function(t,e,i){function n(){s.stopAnimation(!0),s.animateTo({shape:{r:u.r+l.get("hoverOffset")}},300,"elasticOut")}function o(){s.stopAnimation(!0),s.animateTo({shape:{r:u.r}},300,"elasticOut")}var s=this.childAt(0),l=t.hostModel,h=t.getItemModel(e),u=t.getItemLayout(e),c=a({},u);c.label=null,i?(s.setShape(c),"scale"===l.getShallow("animationType")?(s.shape.r=u.r0,fo(s,{shape:{r:u.r}},l,e)):(s.shape.endAngle=u.startAngle,co(s,{shape:{endAngle:u.endAngle}},l,e))):co(s,{shape:c},l,e);var d=t.getItemVisual(e,"color");s.useStyle(r({lineJoin:"bevel",fill:d},h.getModel("itemStyle").getItemStyle())),s.hoverStyle=h.getModel("emphasis.itemStyle").getItemStyle();var f=h.getShallow("cursor");f&&s.attr("cursor",f),kh(this,t.getItemLayout(e),l.isSelected(null,e),l.get("selectedOffset"),l.get("animation")),s.off("mouseover").off("mouseout").off("emphasis").off("normal"),h.get("hoverAnimation")&&l.isAnimationEnabled()&&s.on("mouseover",n).on("mouseout",o).on("emphasis",n).on("normal",o),this._updateLabel(t,e),to(this)},hA._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),o=t.hostModel,a=t.getItemModel(e),r=t.getItemLayout(e).label,s=t.getItemVisual(e,"color");co(i,{shape:{points:r.linePoints||[[r.x,r.y],[r.x,r.y],[r.x,r.y]]}},o,e),co(n,{style:{x:r.x,y:r.y}},o,e),n.attr({rotation:r.rotation,origin:[r.x,r.y],z2:10});var l=a.getModel("label"),h=a.getModel("emphasis.label"),u=a.getModel("labelLine"),c=a.getModel("emphasis.labelLine"),s=t.getItemVisual(e,"color");eo(n.style,n.hoverStyle={},l,h,{labelFetcher:t.hostModel,labelDataIndex:e,defaultText:t.getName(e),autoColor:s,useInsideStyle:!!r.inside},{textAlign:r.textAlign,textVerticalAlign:r.verticalAlign,opacity:t.getItemVisual(e,"opacity")}),n.ignore=n.normalIgnore=!l.get("show"),n.hoverIgnore=!h.get("show"),i.ignore=i.normalIgnore=!u.get("show"),i.hoverIgnore=!c.get("show"),i.setStyle({stroke:s,opacity:t.getItemVisual(e,"opacity")}),i.setStyle(u.getModel("lineStyle").getLineStyle()),i.hoverStyle=c.getModel("lineStyle").getLineStyle();var d=u.get("smooth");d&&!0===d&&(d=.4),i.setShape({smooth:d})},h(Ph,S_);cr.extend({type:"pie",init:function(){var t=new S_;this._sectorGroup=t},render:function(t,e,i,n){if(!n||n.from!==this.uid){var o=t.getData(),a=this._data,r=this.group,s=e.get("animation"),l=!a,h=t.get("animationType"),u=v(Lh,this.uid,t,s,i),c=t.get("selectedMode");if(o.diff(a).add(function(t){var e=new Ph(o,t);l&&"scale"!==h&&e.eachChild(function(t){t.stopAnimation(!0)}),c&&e.on("click",u),o.setItemGraphicEl(t,e),r.add(e)}).update(function(t,e){var i=a.getItemGraphicEl(e);i.updateData(o,t),i.off("click"),c&&i.on("click",u),r.add(i),o.setItemGraphicEl(t,i)}).remove(function(t){var e=a.getItemGraphicEl(t);r.remove(e)}).execute(),s&&l&&o.count()>0&&"scale"!==h){var d=o.getItemLayout(0),f=Math.max(i.getWidth(),i.getHeight())/2,p=m(r.removeClipPath,r);r.setClipPath(this._createClipPath(d.cx,d.cy,f,d.startAngle,d.clockwise,p,t))}this._data=o}},dispose:function(){},_createClipPath:function(t,e,i,n,o,a,r){var s=new Ob({shape:{cx:t,cy:e,r0:0,r:i,startAngle:n,endAngle:n,clockwise:o}});return fo(s,{shape:{endAngle:n+(o?1:-1)*Math.PI*2}},r,a),s},containPoint:function(t,e){var i=e.getData().getItemLayout(0);if(i){var n=t[0]-i.cx,o=t[1]-i.cy,a=Math.sqrt(n*n+o*o);return a<=i.r&&a>=i.r0}}});var uA=function(t,e){d(e,function(e){e.update="updateView",hs(e,function(i,n){var o={};return n.eachComponent({mainType:"series",subType:t,query:i},function(t){t[e.method]&&t[e.method](i.name,i.dataIndex);var n=t.getData();n.each(function(e){var i=n.getName(e);o[i]=t.isSelected(i)||!1})}),{name:i.name,selected:o}})})},cA=function(t){return{getTargetSeries:function(e){var i={},n=z();return e.eachSeriesByType(t,function(t){t.__paletteScope=i,n.set(t.uid,t)}),n},reset:function(t,e){var i=t.getRawData(),n={},o=t.getData();o.each(function(t){var e=o.getRawIndex(t);n[e]=t}),i.each(function(e){var a=n[e],r=null!=a&&o.getItemVisual(a,"color",!0);if(r)i.setItemVisual(e,"color",r);else{var s=i.getItemModel(e).get("itemStyle.color")||t.getColorFromPalette(i.getName(e),t.__paletteScope,i.count());i.setItemVisual(e,"color",s),null!=a&&o.setItemVisual(a,"color",s)}})}}},dA=function(t,e,i,n){var o,a,r=t.getData(),s=[],l=!1;r.each(function(i){var n,h,u,c,d=r.getItemLayout(i),f=r.getItemModel(i),p=f.getModel("label"),g=p.get("position")||f.get("emphasis.label.position"),m=f.getModel("labelLine"),v=m.get("length"),y=m.get("length2"),x=(d.startAngle+d.endAngle)/2,_=Math.cos(x),w=Math.sin(x);o=d.cx,a=d.cy;var b="inside"===g||"inner"===g;if("center"===g)n=d.cx,h=d.cy,c="center";else{var S=(b?(d.r+d.r0)/2*_:d.r*_)+o,M=(b?(d.r+d.r0)/2*w:d.r*w)+a;if(n=S+3*_,h=M+3*w,!b){var I=S+_*(v+e-d.r),T=M+w*(v+e-d.r),A=I+(_<0?-1:1)*y,D=T;n=A+(_<0?-5:5),h=D,u=[[S,M],[I,T],[A,D]]}c=b?"center":_>0?"left":"right"}var C=p.getFont(),L=p.get("rotate")?_<0?-x+Math.PI:-x:0,k=me(t.getFormattedLabel(i,"normal")||r.getName(i),C,c,"top");l=!!L,d.label={x:n,y:h,position:g,height:k.height,len:v,len2:y,linePoints:u,textAlign:c,verticalAlign:"middle",rotation:L,inside:b},b||s.push(d.label)}),!l&&t.get("avoidLabelOverlap")&&Nh(s,o,a,e,i,n)},fA=2*Math.PI,pA=Math.PI/180,gA=function(t){return{seriesType:t,reset:function(t,e){var i=e.findComponents({mainType:"legend"});if(i&&i.length){var n=t.getData();n.filterSelf(function(t){for(var e=n.getName(t),o=0;o<i.length;o++)if(!i[o].isSelected(e))return!1;return!0},this)}}}};uA("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),ds(cA("pie")),cs(v(function(t,e,i,n){e.eachSeriesByType(t,function(t){var e=t.getData(),n=e.mapDimension("value"),o=t.get("center"),a=t.get("radius");y(a)||(a=[0,a]),y(o)||(o=[o,o]);var r=i.getWidth(),s=i.getHeight(),l=Math.min(r,s),h=To(o[0],r),u=To(o[1],s),c=To(a[0],l/2),d=To(a[1],l/2),f=-t.get("startAngle")*pA,p=t.get("minAngle")*pA,g=0;e.each(n,function(t){!isNaN(t)&&g++});var m=e.getSum(n),v=Math.PI/(m||g)*2,x=t.get("clockwise"),_=t.get("roseType"),w=t.get("stillShowZeroSum"),b=e.getDataExtent(n);b[0]=0;var S=fA,M=0,I=f,T=x?1:-1;if(e.each(n,function(t,i){var n;if(isNaN(t))e.setItemLayout(i,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:x,cx:h,cy:u,r0:c,r:_?NaN:d});else{(n="area"!==_?0===m&&w?v:t*v:fA/g)<p?(n=p,S-=p):M+=t;var o=I+T*n;e.setItemLayout(i,{angle:n,startAngle:I,endAngle:o,clockwise:x,cx:h,cy:u,r0:c,r:_?Io(t,b,[c,d]):d}),I=o}},!0),S<fA&&g)if(S<=.001){var A=fA/g;e.each(n,function(t,i){if(!isNaN(t)){var n=e.getItemLayout(i);n.angle=A,n.startAngle=f+T*i*A,n.endAngle=f+T*(i+1)*A}})}else v=S/M,I=f,e.each(n,function(t,i){if(!isNaN(t)){var n=e.getItemLayout(i),o=n.angle===p?p:t*v;n.startAngle=I,n.endAngle=I+T*o,I+=T*o}});dA(t,d,r,s)})},"pie")),ls(gA("pie")),uM.extend({type:"series.scatter",dependencies:["grid","polar","geo","singleAxis","calendar"],getInitialData:function(t,e){return Bs(this.getSource(),this)},brushSelector:"point",getProgressive:function(){var t=this.option.progressive;return null==t?this.option.large?5e3:this.get("progressive"):t},getProgressiveThreshold:function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?1e4:this.get("progressiveThreshold"):t},defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8},progressive:null}});var mA=Nn({shape:{points:null},symbolProxy:null,buildPath:function(t,e){var i=e.points,n=e.size,o=this.symbolProxy,a=o.shape;if(!((t.getContext?t.getContext():t)&&n[0]<4))for(var r=0;r<i.length;){var s=i[r++],l=i[r++];isNaN(s)||isNaN(l)||(a.x=s-n[0]/2,a.y=l-n[1]/2,a.width=n[0],a.height=n[1],o.buildPath(t,a,!0))}},afterBrush:function(t){var e=this.shape,i=e.points,n=e.size;if(n[0]<4){this.setTransform(t);for(var o=0;o<i.length;){var a=i[o++],r=i[o++];isNaN(a)||isNaN(r)||t.fillRect(a-n[0]/2,r-n[1]/2,n[0],n[1])}this.restoreTransform(t)}},findDataIndex:function(t,e){for(var i=this.shape,n=i.points,o=i.size,a=Math.max(o[0],4),r=Math.max(o[1],4),s=n.length/2-1;s>=0;s--){var l=2*s,h=n[l]-a/2,u=n[l+1]-r/2;if(t>=h&&e>=u&&t<=h+a&&e<=u+r)return s}return-1}}),vA=Eh.prototype;vA.isPersistent=function(){return!this._incremental},vA.updateData=function(t){this.group.removeAll();var e=new mA({rectHover:!0,cursor:"default"});e.setShape({points:t.getLayout("symbolPoints")}),this._setCommon(e,t),this.group.add(e),this._incremental=null},vA.updateLayout=function(t){if(!this._incremental){var e=t.getLayout("symbolPoints");this.group.eachChild(function(t){if(null!=t.startIndex){var i=2*(t.endIndex-t.startIndex),n=4*t.startIndex*2;e=new Float32Array(e.buffer,n,i)}t.setShape("points",e)})}},vA.incrementalPrepareUpdate=function(t){this.group.removeAll(),this._clearIncremental(),t.count()>2e6?(this._incremental||(this._incremental=new On({silent:!0})),this.group.add(this._incremental)):this._incremental=null},vA.incrementalUpdate=function(t,e){var i;this._incremental?(i=new mA,this._incremental.addDisplayable(i,!0)):((i=new mA({rectHover:!0,cursor:"default",startIndex:t.start,endIndex:t.end})).incremental=!0,this.group.add(i)),i.setShape({points:e.getLayout("symbolPoints")}),this._setCommon(i,e,!!this._incremental)},vA._setCommon=function(t,e,i){var n=e.hostModel,o=e.getVisual("symbolSize");t.setShape("size",o instanceof Array?o:[o,o]),t.symbolProxy=dl(e.getVisual("symbol"),0,0,0,0),t.setColor=t.symbolProxy.setColor;var a=t.shape.size[0]<4;t.useStyle(n.getModel("itemStyle").getItemStyle(a?["color","shadowBlur","shadowColor"]:["color"]));var r=e.getVisual("color");r&&t.setColor(r),i||(t.seriesIndex=n.seriesIndex,t.on("mousemove",function(e){t.dataIndex=null;var i=t.findDataIndex(e.offsetX,e.offsetY);i>=0&&(t.dataIndex=i+(t.startIndex||0))}))},vA.remove=function(){this._clearIncremental(),this._incremental=null,this.group.removeAll()},vA._clearIncremental=function(){var t=this._incremental;t&&t.clearDisplaybles()},ys({type:"scatter",render:function(t,e,i){var n=t.getData();this._updateSymbolDraw(n,t).updateData(n),this._finished=!0},incrementalPrepareRender:function(t,e,i){var n=t.getData();this._updateSymbolDraw(n,t).incrementalPrepareUpdate(n),this._finished=!1},incrementalRender:function(t,e,i){this._symbolDraw.incrementalUpdate(t,e.getData()),this._finished=t.end===e.getData().count()},updateTransform:function(t,e,i){var n=t.getData();if(this.group.dirty(),!this._finished||n.count()>1e4||!this._symbolDraw.isPersistent())return{update:!0};var o=ST().reset(t);o.progress&&o.progress({start:0,end:n.count()},n),this._symbolDraw.updateLayout(n)},_updateSymbolDraw:function(t,e){var i=this._symbolDraw,n=e.pipelineContext.large;return i&&n===this._isLargeDraw||(i&&i.remove(),i=this._symbolDraw=n?new Eh:new Ml,this._isLargeDraw=n,this.group.removeAll()),this.group.add(i.group),i},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},dispose:function(){}}),ds(bT("scatter","circle")),cs(ST("scatter")),h(zh,nT),Rh.prototype.getIndicatorAxes=function(){return this._indicatorAxes},Rh.prototype.dataToPoint=function(t,e){var i=this._indicatorAxes[e];return this.coordToPoint(i.dataToCoord(t),e)},Rh.prototype.coordToPoint=function(t,e){var i=this._indicatorAxes[e].angle;return[this.cx+t*Math.cos(i),this.cy-t*Math.sin(i)]},Rh.prototype.pointToData=function(t){var e=t[0]-this.cx,i=t[1]-this.cy,n=Math.sqrt(e*e+i*i);e/=n,i/=n;for(var o,a=Math.atan2(-i,e),r=1/0,s=-1,l=0;l<this._indicatorAxes.length;l++){var h=this._indicatorAxes[l],u=Math.abs(a-h.angle);u<r&&(o=h,s=l,r=u)}return[s,+(o&&o.coodToData(n))]},Rh.prototype.resize=function(t,e){var i=t.get("center"),n=e.getWidth(),o=e.getHeight(),a=Math.min(n,o)/2;this.cx=To(i[0],n),this.cy=To(i[1],o),this.startAngle=t.get("startAngle")*Math.PI/180,this.r=To(t.get("radius"),a),d(this._indicatorAxes,function(t,e){t.setExtent(0,this.r);var i=this.startAngle+e*Math.PI*2/this._indicatorAxes.length;i=Math.atan2(Math.sin(i),Math.cos(i)),t.angle=i},this)},Rh.prototype.update=function(t,e){function i(t){var e=Math.pow(10,Math.floor(Math.log(t)/Math.LN10)),i=t/e;return 2===i?i=5:i*=2,i*e}var n=this._indicatorAxes,o=this._model;d(n,function(t){t.scale.setExtent(1/0,-1/0)}),t.eachSeriesByType("radar",function(e,i){if("radar"===e.get("coordinateSystem")&&t.getComponent("radar",e.get("radarIndex"))===o){var a=e.getData();d(n,function(t){t.scale.unionExtentFromData(a,a.mapDimension(t.dim))})}},this);var a=o.get("splitNumber");d(n,function(t,e){var n=ol(t.scale,t.model);rl(t.scale,t.model);var o=t.model,r=t.scale,s=o.getMin(),l=o.getMax(),h=r.getInterval();if(null!=s&&null!=l)r.setExtent(+s,+l),r.setInterval((l-s)/a);else if(null!=s){var u;do{u=s+h*a,r.setExtent(+s,u),r.setInterval(h),h=i(h)}while(u<n[1]&&isFinite(u)&&isFinite(n[1]))}else if(null!=l){var c;do{c=l-h*a,r.setExtent(c,+l),r.setInterval(h),h=i(h)}while(c>n[0]&&isFinite(c)&&isFinite(n[0]))}else{r.getTicks().length-1>a&&(h=i(h));var d=Math.round((n[0]+n[1])/2/h)*h,f=Math.round(a/2);r.setExtent(Ao(d-f*h),Ao(d+(a-f)*h)),r.setInterval(h)}})},Rh.dimensions=[],Rh.create=function(t,e){var i=[];return t.eachComponent("radar",function(n){var o=new Rh(n,t,e);i.push(o),n.coordinateSystem=o}),t.eachSeriesByType("radar",function(t){"radar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("radarIndex")||0])}),i},Aa.register("radar",Rh);var yA=CT.valueAxis,xA=(gs({type:"radar",optionUpdated:function(){var t=this.get("boundaryGap"),e=this.get("splitNumber"),o=this.get("scale"),s=this.get("axisLine"),l=this.get("axisTick"),h=this.get("axisLabel"),u=this.get("name"),c=this.get("name.show"),d=this.get("name.formatter"),p=this.get("nameGap"),g=this.get("triggerEvent"),m=f(this.get("indicator")||[],function(f){null!=f.max&&f.max>0&&!f.min?f.min=0:null!=f.min&&f.min<0&&!f.max&&(f.max=0);var m=u;if(null!=f.color&&(m=r({color:f.color},u)),f=n(i(f),{boundaryGap:t,splitNumber:e,scale:o,axisLine:s,axisTick:l,axisLabel:h,name:f.text,nameLocation:"end",nameGap:p,nameTextStyle:m,triggerEvent:g},!1),c||(f.name=""),"string"==typeof d){var v=f.name;f.name=d.replace("{value}",null!=v?v:"")}else"function"==typeof d&&(f.name=d(f.name,f));var y=a(new _o(f,null,this.ecModel),ZI);return y.mainType="radar",y.componentIndex=this.componentIndex,y},this);this.getIndicatorModels=function(){return m}},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"75%",startAngle:90,name:{show:!0},boundaryGap:[0,0],splitNumber:5,nameGap:15,scale:!1,shape:"polygon",axisLine:n({lineStyle:{color:"#bbb"}},yA.axisLine),axisLabel:Bh(yA.axisLabel,!1),axisTick:Bh(yA.axisTick,!1),splitLine:Bh(yA.splitLine,!0),splitArea:Bh(yA.splitArea,!0),indicator:[]}}),["axisLine","axisTickLabel","axisName"]);ms({type:"radar",render:function(t,e,i){this.group.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},_buildAxes:function(t){var e=t.coordinateSystem;d(f(e.getIndicatorAxes(),function(t){return new GT(t.model,{position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1})}),function(t){d(xA,t.add,t),this.group.add(t.getGroup())},this)},_buildSplitLineAndArea:function(t){function e(t,e,i){var n=i%e.length;return t[n]=t[n]||[],n}var i=t.coordinateSystem,n=i.getIndicatorAxes();if(n.length){var o=t.get("shape"),a=t.getModel("splitLine"),s=t.getModel("splitArea"),l=a.getModel("lineStyle"),h=s.getModel("areaStyle"),u=a.get("show"),c=s.get("show"),p=l.get("color"),g=h.get("color");p=y(p)?p:[p],g=y(g)?g:[g];var m=[],v=[];if("circle"===o)for(var x=n[0].getTicksCoords(),_=i.cx,w=i.cy,b=0;b<x.length;b++)u&&m[D=e(m,p,b)].push(new Lb({shape:{cx:_,cy:w,r:x[b]}})),c&&b<x.length-1&&v[D=e(v,g,b)].push(new Nb({shape:{cx:_,cy:w,r0:x[b],r:x[b+1]}}));else for(var S,M=f(n,function(t,e){var n=t.getTicksCoords();return S=null==S?n.length-1:Math.min(n.length-1,S),f(n,function(t){return i.coordToPoint(t,e)})}),I=[],b=0;b<=S;b++){for(var T=[],A=0;A<n.length;A++)T.push(M[A][b]);if(T[0]&&T.push(T[0].slice()),u&&m[D=e(m,p,b)].push(new Bb({shape:{points:T}})),c&&I){var D=e(v,g,b-1);v[D].push(new Rb({shape:{points:T.concat(I)}}))}I=T.slice().reverse()}var C=l.getLineStyle(),L=h.getAreaStyle();d(v,function(t,e){this.group.add(Qb(t,{style:r({stroke:"none",fill:g[e%g.length]},L),silent:!0}))},this),d(m,function(t,e){this.group.add(Qb(t,{style:r({fill:"none",stroke:p[e%p.length]},C),silent:!0}))},this)}}});var _A=uM.extend({type:"series.radar",dependencies:["radar"],init:function(t){_A.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()}},getInitialData:function(t,e){return rA(this,{extraPrefix:"indicator_",extraFromZero:!0})},formatTooltip:function(t){var e=this.getData(),i=this.coordinateSystem.getIndicatorAxes(),n=this.getData().getName(t);return Ho(""===n?this.name:n)+"<br/>"+f(i,function(i,n){var o=e.get(e.mapDimension(i.dim),t);return Ho(i.name+" : "+o)}).join("<br />")},defaultOption:{zlevel:0,z:2,coordinateSystem:"radar",legendHoverLink:!0,radarIndex:0,lineStyle:{width:2,type:"solid"},label:{position:"top"},symbol:"emptyCircle",symbolSize:4}});ys({type:"radar",render:function(t,e,n){function o(t,e){var i=t.getItemVisual(e,"symbol")||"circle",n=t.getItemVisual(e,"color");if("none"!==i){var o=Vh(t.getItemVisual(e,"symbolSize")),a=dl(i,-1,-1,2,2,n);return a.attr({style:{strokeNoScale:!0},z2:100,scale:[o[0]/2,o[1]/2]}),a}}function a(e,i,n,a,r,s){n.removeAll();for(var l=0;l<i.length-1;l++){var h=o(a,r);h&&(h.__dimIdx=l,e[l]?(h.attr("position",e[l]),tS[s?"initProps":"updateProps"](h,{position:i[l]},t,r)):h.attr("position",i[l]),n.add(h))}}function s(t){return f(t,function(t){return[l.cx,l.cy]})}var l=t.coordinateSystem,h=this.group,u=t.getData(),c=this._data;u.diff(c).add(function(e){var i=u.getItemLayout(e);if(i){var n=new Rb,o=new Bb,r={shape:{points:i}};n.shape.points=s(i),o.shape.points=s(i),fo(n,r,t,e),fo(o,r,t,e);var l=new S_,h=new S_;l.add(o),l.add(n),l.add(h),a(o.shape.points,i,h,u,e,!0),u.setItemGraphicEl(e,l)}}).update(function(e,i){var n=c.getItemGraphicEl(i),o=n.childAt(0),r=n.childAt(1),s=n.childAt(2),l={shape:{points:u.getItemLayout(e)}};l.shape.points&&(a(o.shape.points,l.shape.points,s,u,e,!1),co(o,l,t),co(r,l,t),u.setItemGraphicEl(e,n))}).remove(function(t){h.remove(c.getItemGraphicEl(t))}).execute(),u.eachItemGraphicEl(function(t,e){function n(){l.attr("ignore",m)}function o(){l.attr("ignore",g)}var a=u.getItemModel(e),s=t.childAt(0),l=t.childAt(1),c=t.childAt(2),d=u.getItemVisual(e,"color");h.add(t),s.useStyle(r(a.getModel("lineStyle").getLineStyle(),{fill:"none",stroke:d})),s.hoverStyle=a.getModel("emphasis.lineStyle").getLineStyle();var f=a.getModel("areaStyle"),p=a.getModel("emphasis.areaStyle"),g=f.isEmpty()&&f.parentModel.isEmpty(),m=p.isEmpty()&&p.parentModel.isEmpty();m=m&&g,l.ignore=g,l.useStyle(r(f.getAreaStyle(),{fill:d,opacity:.7})),l.hoverStyle=p.getAreaStyle();var v=a.getModel("itemStyle").getItemStyle(["color"]),y=a.getModel("emphasis.itemStyle").getItemStyle(),x=a.getModel("label"),_=a.getModel("emphasis.label");c.eachChild(function(t){t.setStyle(v),t.hoverStyle=i(y),eo(t.style,t.hoverStyle,x,_,{labelFetcher:u.hostModel,labelDataIndex:e,labelDimIndex:t.__dimIdx,defaultText:u.get(u.dimensions[t.__dimIdx],e),autoColor:d,isRectText:!0})}),t.off("mouseover").off("mouseout").off("normal").off("emphasis"),t.on("emphasis",n).on("mouseover",n).on("normal",o).on("mouseout",o),to(t)}),this._data=u},remove:function(){this.group.removeAll(),this._data=null},dispose:function(){}});ds(cA("radar")),ds(bT("radar","circle")),cs(function(t){t.eachSeriesByType("radar",function(t){var e=t.getData(),i=[],n=t.coordinateSystem;if(n){for(var o=n.getIndicatorAxes(),a=0;a<n.getIndicatorAxes().length;a++)e.each(e.mapDimension(o[a].dim),function(t,e){i[e]=i[e]||[],i[e][a]=n.dataToPoint(t,a)});e.each(function(t){i[t][0]&&i[t].push(i[t][0].slice()),e.setItemLayout(t,i[t])})}})}),ls(gA("radar")),ss(function(t){var e=t.polar;if(e){y(e)||(e=[e]);var i=[];d(e,function(e,n){e.indicator?(e.type&&!e.shape&&(e.shape=e.type),t.radar=t.radar||[],y(t.radar)||(t.radar=[t.radar]),t.radar.push(e)):i.push(e)}),t.polar=i}d(t.series,function(t){t&&"radar"===t.type&&t.polarIndex&&(t.radarIndex=t.polarIndex)})});var wA=uM.extend({type:"series.map",dependencies:["geo"],layoutMode:"box",needsDrawMap:!1,seriesGroup:[],init:function(t){this._fillOption(t,this.getMapType()),wA.superApply(this,"init",arguments),this.updateSelectedMap(this.getRawData())},getInitialData:function(t){return rA(this,["value"])},mergeOption:function(t){this._fillOption(t,this.getMapType()),wA.superApply(this,"mergeOption",arguments),this.updateSelectedMap(this.getRawData())},getHostGeoModel:function(){var t=this.option.geoIndex;return null!=t?this.dependentModels.geo[t]:null},getMapType:function(){return(this.getHostGeoModel()||this).option.map},_fillOption:function(t,e){},getRawValue:function(t){var e=this.getData();return e.get(e.mapDimension("value"),t)},getRegionModel:function(t){var e=this.getData();return e.getItemModel(e.indexOfName(t))},formatTooltip:function(t){for(var e=this.getData(),i=Wo(this.getRawValue(t)),n=e.getName(t),o=this.seriesGroup,a=[],r=0;r<o.length;r++){var s=o[r].originalData.indexOfName(n),l=e.mapDimension("value");isNaN(o[r].originalData.get(l,s))||a.push(Ho(o[r].name))}return a.join(", ")+"<br />"+Ho(n+" : "+i)},getTooltipPosition:function(t){if(null!=t){var e=this.getData().getName(t),i=this.coordinateSystem,n=i.getRegion(e);return n&&i.dataToPoint(n.center)}},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},defaultOption:{zlevel:0,z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:.75,showLegendSymbol:!0,dataRangeHoverLink:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{areaColor:"rgba(255,215,0,0.8)"}}}});u(wA,sA);var bA="\0_ec_interaction_mutex";hs({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},function(){}),u(Zh,Hx);var SA={axisPointer:1,tooltip:1,brush:1};ou.prototype={constructor:ou,draw:function(t,e,i,n,o){var a="geo"===t.mainType,r=t.getData&&t.getData();a&&e.eachComponent({mainType:"series",subType:"map"},function(e){r||e.getHostGeoModel()!==t||(r=e.getData())});var s=t.coordinateSystem,l=this.group,h=s.scale,u={position:s.position,scale:h};!l.childAt(0)||o?l.attr(u):co(l,u,t),l.removeAll();var c=["itemStyle"],f=["emphasis","itemStyle"],p=["label"],g=["emphasis","label"],m=z();d(s.regions,function(e){var i=m.get(e.name)||m.set(e.name,new S_),n=new Zb({shape:{paths:[]}});i.add(n);var o,s=(C=t.getRegionModel(e.name)||t).getModel(c),u=C.getModel(f),v=eu(s),y=eu(u),x=C.getModel(p),_=C.getModel(g);if(r){o=r.indexOfName(e.name);var w=r.getItemVisual(o,"color",!0);w&&(v.fill=w)}d(e.geometries,function(t){if("polygon"===t.type){n.shape.paths.push(new Rb({shape:{points:t.exterior}}));for(var e=0;e<(t.interiors?t.interiors.length:0);e++)n.shape.paths.push(new Rb({shape:{points:t.interiors[e]}}))}}),n.setStyle(v),n.style.strokeNoScale=!0,n.culling=!0;var b=x.get("show"),S=_.get("show"),M=r&&isNaN(r.get(r.mapDimension("value"),o)),I=r&&r.getItemLayout(o);if(a||M&&(b||S)||I&&I.showLabel){var T,A=a?e.name:o;(!r||o>=0)&&(T=t);var D=new Cb({position:e.center.slice(),scale:[1/h[0],1/h[1]],z2:10,silent:!0});eo(D.style,D.hoverStyle={},x,_,{labelFetcher:T,labelDataIndex:A,defaultText:e.name,useInsideStyle:!1},{textAlign:"center",textVerticalAlign:"middle"}),i.add(D)}if(r)r.setItemGraphicEl(o,i);else{var C=t.getRegionModel(e.name);n.eventData={componentType:"geo",geoIndex:t.componentIndex,name:e.name,region:C&&C.option||{}}}(i.__regions||(i.__regions=[])).push(e),to(i,y,{hoverSilentOnTouch:!!t.get("selectedMode")}),l.add(i)}),this._updateController(t,e,i),iu(this,t,l,i,n),nu(t,l)},remove:function(){this.group.removeAll(),this._controller.dispose(),this._controllerHost={}},_updateController:function(t,e,i){function n(){var e={type:"geoRoam",componentType:l};return e[l+"Id"]=t.id,e}var o=t.coordinateSystem,r=this._controller,s=this._controllerHost;s.zoomLimit=t.get("scaleLimit"),s.zoom=o.getZoom(),r.enable(t.get("roam")||!1);var l=t.mainType;r.off("pan").on("pan",function(t,e){this._mouseDownFlag=!1,Jh(s,t,e),i.dispatchAction(a(n(),{dx:t,dy:e}))},this),r.off("zoom").on("zoom",function(t,e,o){if(this._mouseDownFlag=!1,Qh(s,t,e,o),i.dispatchAction(a(n(),{zoom:t,originX:e,originY:o})),this._updateGroup){var r=this.group,l=r.scale;r.traverse(function(t){"text"===t.type&&t.attr("scale",[1/l[0],1/l[1]])})}},this),r.setPointerChecker(function(e,n,a){return o.getViewRectAfterRoam().contain(n,a)&&!tu(e,i,t)})}},ys({type:"map",render:function(t,e,i,n){if(!n||"mapToggleSelect"!==n.type||n.from!==this.uid){var o=this.group;if(o.removeAll(),!t.getHostGeoModel()){if(n&&"geoRoam"===n.type&&"series"===n.componentType&&n.seriesId===t.id)(a=this._mapDraw)&&o.add(a.group);else if(t.needsDrawMap){var a=this._mapDraw||new ou(i,!0);o.add(a.group),a.draw(t,e,i,this,n),this._mapDraw=a}else this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null;t.get("showLegendSymbol")&&e.getComponent("legend")&&this._renderSymbols(t,e,i)}}},remove:function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null,this.group.removeAll()},dispose:function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null},_renderSymbols:function(t,e,i){var n=t.originalData,o=this.group;n.each(n.mapDimension("value"),function(e,i){if(!isNaN(e)){var a=n.getItemLayout(i);if(a&&a.point){var r=a.point,s=a.offset,l=new Lb({style:{fill:t.getData().getVisual("color")},shape:{cx:r[0]+9*s,cy:r[1],r:3},silent:!0,z2:s?8:10});if(!s){var h=t.mainSeries.getData(),u=n.getName(i),c=h.indexOfName(u),d=n.getItemModel(i),f=d.getModel("label"),p=d.getModel("emphasis.label"),g=h.getItemGraphicEl(c),m=A(t.getFormattedLabel(i,"normal"),u),v=A(t.getFormattedLabel(i,"emphasis"),m),y=function(){var t=io({},p,{text:p.get("show")?v:null},{isRectText:!0,useInsideStyle:!1},!0);l.style.extendFrom(t),l.__mapOriginalZ2=l.z2,l.z2+=1},x=function(){io(l.style,f,{text:f.get("show")?m:null,textPosition:f.getShallow("position")||"bottom"},{isRectText:!0,useInsideStyle:!1}),null!=l.__mapOriginalZ2&&(l.z2=l.__mapOriginalZ2,l.__mapOriginalZ2=null)};g.on("mouseover",y).on("mouseout",x).on("emphasis",y).on("normal",x),x()}o.add(l)}}})}}),hs({type:"geoRoam",event:"geoRoam",update:"updateTransform"},function(t,e){var i=t.componentType||"series";e.eachComponent({mainType:i,query:t},function(e){var n=e.coordinateSystem;if("geo"===n.type){var o=au(n,t,e.get("scaleLimit"));e.setCenter&&e.setCenter(o.center),e.setZoom&&e.setZoom(o.zoom),"series"===i&&d(e.seriesGroup,function(t){t.setCenter(o.center),t.setZoom(o.zoom)})}})});var MA=Q;u(ru,Kx),su.prototype={constructor:su,type:"view",dimensions:["x","y"],setBoundingRect:function(t,e,i,n){return this._rect=new Kt(t,e,i,n),this._rect},getBoundingRect:function(){return this._rect},setViewRect:function(t,e,i,n){this.transformTo(t,e,i,n),this._viewRect=new Kt(t,e,i,n)},transformTo:function(t,e,i,n){var o=this.getBoundingRect(),a=this._rawTransformable;a.transform=o.calculateTransform(new Kt(t,e,i,n)),a.decomposeTransform(),this._updateTransform()},setCenter:function(t){t&&(this._center=t,this._updateCenterAndZoom())},setZoom:function(t){t=t||1;var e=this.zoomLimit;e&&(null!=e.max&&(t=Math.min(e.max,t)),null!=e.min&&(t=Math.max(e.min,t))),this._zoom=t,this._updateCenterAndZoom()},getDefaultCenter:function(){var t=this.getBoundingRect();return[t.x+t.width/2,t.y+t.height/2]},getCenter:function(){return this._center||this.getDefaultCenter()},getZoom:function(){return this._zoom||1},getRoamTransform:function(){return this._roamTransformable.getLocalTransform()},_updateCenterAndZoom:function(){var t=this._rawTransformable.getLocalTransform(),e=this._roamTransformable,i=this.getDefaultCenter(),n=this.getCenter(),o=this.getZoom();n=Q([],n,t),i=Q([],i,t),e.origin=n,e.position=[i[0]-n[0],i[1]-n[1]],e.scale=[o,o],this._updateTransform()},_updateTransform:function(){var t=this._roamTransformable,e=this._rawTransformable;e.parent=t,t.updateTransform(),e.updateTransform(),ht(this.transform||(this.transform=[]),e.transform||st()),this._rawTransform=e.getLocalTransform(),this.invTransform=this.invTransform||[],pt(this.invTransform,this.transform),this.decomposeTransform()},getViewRect:function(){return this._viewRect},getViewRectAfterRoam:function(){var t=this.getBoundingRect().clone();return t.applyTransform(this.transform),t},dataToPoint:function(t,e,i){var n=e?this._rawTransform:this.transform;return i=i||[],n?MA(i,t,n):G(i,t)},pointToData:function(t){var e=this.invTransform;return e?MA([],t,e):[t[0],t[1]]},convertToPixel:v(lu,"dataToPoint"),convertFromPixel:v(lu,"pointToData"),containPoint:function(t){return this.getViewRectAfterRoam().contain(t[0],t[1])}},u(su,Kx);for(var IA=[126,25],TA=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],AA=0;AA<TA.length;AA++)for(var DA=0;DA<TA[AA].length;DA++)TA[AA][DA][0]/=10.5,TA[AA][DA][1]/=-14,TA[AA][DA][0]+=IA[0],TA[AA][DA][1]+=IA[1];var CA={"南海诸岛":[32,80],"广东":[0,-10],"香港":[10,5],"澳门":[-10,10],"天津":[5,5]},LA={Russia:[100,60],"United States":[-99,38],"United States of America":[-99,38]},kA=[[[123.45165252685547,25.73527164402261],[123.49731445312499,25.73527164402261],[123.49731445312499,25.750734064600884],[123.45165252685547,25.750734064600884],[123.45165252685547,25.73527164402261]]],PA=[function(t){"china"===t.map&&t.regions.push(new gl("南海诸岛",f(TA,function(t){return{type:"polygon",exterior:t}}),IA))},function(t){d(t.regions,function(t){var e=CA[t.name];if(e){var i=t.center;i[0]+=e[0]/10.5,i[1]+=-e[1]/14}})},function(t){d(t.regions,function(t){var e=LA[t.name];if(e){var i=t.center;i[0]=e[0],i[1]=e[1]}})},function(t){if("china"===t.map)for(var e=0,i=t.regions.length;e<i;++e)"台湾"===t.regions[e].name&&t.regions[e].geometries.push({type:"polygon",exterior:kA[0]})}];hu.prototype={constructor:hu,type:"geo",dimensions:["lng","lat"],containCoord:function(t){for(var e=this.regions,i=0;i<e.length;i++)if(e[i].contain(t))return!0;return!1},loadGeoJson:function(t,e,i){try{this.regions=t?tT(t):[]}catch(t){throw"Invalid geoJson format\n"+t.message}e=e||{},i=i||{};for(var n=this.regions,o=z(),a=0;a<n.length;a++){var r=n[a].name;r=i.hasOwnProperty(r)?i[r]:r,n[a].name=r,o.set(r,n[a]),this.addGeoCoord(r,n[a].center);var s=e[r];s&&n[a].transformTo(s.left,s.top,s.width,s.height)}this._regionsMap=o,this._rect=null,d(PA,function(t){t(this)},this)},transformTo:function(t,e,i,n){var o=this.getBoundingRect();(o=o.clone()).y=-o.y-o.height;var a=this._rawTransformable;a.transform=o.calculateTransform(new Kt(t,e,i,n)),a.decomposeTransform();var r=a.scale;r[1]=-r[1],a.updateTransform(),this._updateTransform()},getRegion:function(t){return this._regionsMap.get(t)},getRegionByCoord:function(t){for(var e=this.regions,i=0;i<e.length;i++)if(e[i].contain(t))return e[i]},addGeoCoord:function(t,e){this._nameCoordMap.set(t,e)},getGeoCoord:function(t){return this._nameCoordMap.get(t)},getBoundingRect:function(){if(this._rect)return this._rect;for(var t,e=this.regions,i=0;i<e.length;i++){var n=e[i].getBoundingRect();(t=t||n.clone()).union(n)}return this._rect=t||new Kt(0,0,0,0)},dataToPoint:function(t,e,i){if("string"==typeof t&&(t=this.getGeoCoord(t)),t)return su.prototype.dataToPoint.call(this,t,e,i)},convertToPixel:v(uu,"dataToPoint"),convertFromPixel:v(uu,"pointToData")},u(hu,su);var OA={dimensions:hu.prototype.dimensions,create:function(t,e){var i=[];t.eachComponent("geo",function(t,n){var o=t.get("map"),a=xs(o),r=new hu(o+n,o,a&&a.geoJson,a&&a.specialAreas,t.get("nameMap"));r.zoomLimit=t.get("scaleLimit"),i.push(r),du(r,t),t.coordinateSystem=r,r.model=t,r.resize=cu,r.resize(t,e)}),t.eachSeries(function(t){if("geo"===t.get("coordinateSystem")){var e=t.get("geoIndex")||0;t.coordinateSystem=i[e]}});var n={};return t.eachSeriesByType("map",function(t){if(!t.getHostGeoModel()){var e=t.getMapType();n[e]=n[e]||[],n[e].push(t)}}),d(n,function(t,n){var a=xs(n),r=f(t,function(t){return t.get("nameMap")}),s=new hu(n,n,a&&a.geoJson,a&&a.specialAreas,o(r));s.zoomLimit=T.apply(null,f(t,function(t){return t.get("scaleLimit")})),i.push(s),s.resize=cu,s.resize(t[0],e),d(t,function(t){t.coordinateSystem=s,du(s,t)})}),i},getFilledRegions:function(t,e,i){var n=(t||[]).slice();i=i||{};var o=xs(e),a=o&&o.geoJson;if(!a)return t;for(var r=z(),s=a.features,l=0;l<n.length;l++)r.set(n[l].name,n[l]);for(l=0;l<s.length;l++){var h=s[l].properties.name;r.get(h)||(i.hasOwnProperty(h)&&(h=i[h]),n.push({name:h}))}return n}};us("geo",OA);cs(function(t){var e={};t.eachSeriesByType("map",function(i){var n=i.getMapType();if(!i.getHostGeoModel()&&!e[n]){var o={};d(i.seriesGroup,function(e){var i=e.coordinateSystem,n=e.originalData;e.get("showLegendSymbol")&&t.getComponent("legend")&&n.each(n.mapDimension("value"),function(t,e){var a=n.getName(e),r=i.getRegion(a);if(r&&!isNaN(t)){var s=o[a]||0,l=i.dataToPoint(r.center);o[a]=s+1,n.setItemLayout(e,{point:l,offset:s})}})});var a=i.getData();a.each(function(t){var e=a.getName(t),i=a.getItemLayout(t)||{};i.showLabel=!o[e],a.setItemLayout(t,i)}),e[n]=!0}})}),ds(function(t){t.eachSeriesByType("map",function(t){var e=t.get("color"),i=t.getModel("itemStyle"),n=i.get("areaColor"),o=i.get("color")||e[t.seriesIndex%e.length];t.getData().setVisual({areaColor:n,color:o})})}),ls(FM.PROCESSOR.STATISTIC,function(t){var e={};t.eachSeriesByType("map",function(t){var i=t.getHostGeoModel(),n=i?"o"+i.id:"i"+t.getMapType();(e[n]=e[n]||[]).push(t)}),d(e,function(t,e){for(var i=fu(f(t,function(t){return t.getData()}),t[0].get("mapValueCalculation")),n=0;n<t.length;n++)t[n].originalData=t[n].getData();for(n=0;n<t.length;n++)t[n].seriesGroup=t,t[n].needsDrawMap=0===n&&!t[n].getHostGeoModel(),t[n].setData(i.cloneShallow()),t[n].mainSeries=t[0]})}),ss(function(t){var e=[];d(t.series,function(t){t&&"map"===t.type&&(e.push(t),t.map=t.map||t.mapType,r(t,t.mapLocation))})}),uA("map",[{type:"mapToggleSelect",event:"mapselectchanged",method:"toggleSelected"},{type:"mapSelect",event:"mapselected",method:"select"},{type:"mapUnSelect",event:"mapunselected",method:"unSelect"}]);var NA=d,EA="\0__link_datas",zA="\0__link_mainData",RA=function(t,e){this.name=t||"",this.depth=0,this.height=0,this.parentNode=null,this.dataIndex=-1,this.children=[],this.viewChildren=[],this.hostTree=e};RA.prototype={constructor:RA,isRemoved:function(){return this.dataIndex<0},eachNode:function(t,e,i){"function"==typeof t&&(i=e,e=t,t=null),_(t=t||{})&&(t={order:t});var n,o=t.order||"preorder",a=this[t.attr||"children"];"preorder"===o&&(n=e.call(i,this));for(var r=0;!n&&r<a.length;r++)a[r].eachNode(t,e,i);"postorder"===o&&e.call(i,this)},updateDepthAndHeight:function(t){var e=0;this.depth=t;for(var i=0;i<this.children.length;i++){var n=this.children[i];n.updateDepthAndHeight(t+1),n.height>e&&(e=n.height)}this.height=e+1},getNodeById:function(t){if(this.getId()===t)return this;for(var e=0,i=this.children,n=i.length;e<n;e++){var o=i[e].getNodeById(t);if(o)return o}},contains:function(t){if(t===this)return!0;for(var e=0,i=this.children,n=i.length;e<n;e++){var o=i[e].contains(t);if(o)return o}},getAncestors:function(t){for(var e=[],i=t?this:this.parentNode;i;)e.push(i),i=i.parentNode;return e.reverse(),e},getValue:function(t){var e=this.hostTree.data;return e.get(e.getDimension(t||"value"),this.dataIndex)},setLayout:function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},getLayout:function(){return this.hostTree.data.getItemLayout(this.dataIndex)},getModel:function(t){if(!(this.dataIndex<0)){var e,i=this.hostTree,n=i.data.getItemModel(this.dataIndex),o=this.getLevelModel();return o||0!==this.children.length&&(0===this.children.length||!1!==this.isExpand)||(e=this.getLeavesModel()),n.getModel(t,(o||e||i.hostModel).getModel(t))}},getLevelModel:function(){return(this.hostTree.levelModels||[])[this.depth]},getLeavesModel:function(){return this.hostTree.leavesModel},setVisual:function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},getVisual:function(t,e){return this.hostTree.data.getItemVisual(this.dataIndex,t,e)},getRawIndex:function(){return this.hostTree.data.getRawIndex(this.dataIndex)},getId:function(){return this.hostTree.data.getId(this.dataIndex)},isAncestorOf:function(t){for(var e=t.parentNode;e;){if(e===this)return!0;e=e.parentNode}return!1},isDescendantOf:function(t){return t!==this&&t.isAncestorOf(this)}},bu.prototype={constructor:bu,type:"tree",eachNode:function(t,e,i){this.root.eachNode(t,e,i)},getNodeByDataIndex:function(t){var e=this.data.getRawIndex(t);return this._nodes[e]},getNodeByName:function(t){return this.root.getNodeByName(t)},update:function(){for(var t=this.data,e=this._nodes,i=0,n=e.length;i<n;i++)e[i].dataIndex=-1;for(var i=0,n=t.count();i<n;i++)e[t.getRawIndex(i)].dataIndex=i},clearLayouts:function(){this.data.clearItemLayouts()}},bu.createTree=function(t,e,i){function n(t,e){var i=t.value;r=Math.max(r,y(i)?i.length:1),a.push(t);var s=new RA(t.name,o);e?Su(s,e):o.root=s,o._nodes.push(s);var l=t.children;if(l)for(var h=0;h<l.length;h++)n(l[h],s)}var o=new bu(e,i.levels,i.leaves),a=[],r=1;n(t),o.root.updateDepthAndHeight(0);var s=wI(a,{coordDimensions:["value"],dimensionsCount:r}),l=new yI(s,e);return l.initData(a),pu({mainData:l,struct:o,structAttr:"tree"}),o.update(),o},uM.extend({type:"series.tree",layoutInfo:null,layoutMode:"box",getInitialData:function(t){var e={name:t.name,children:t.data},i=t.leaves||{},n={};n.leaves=i;var o=bu.createTree(e,this,n),a=0;o.eachNode("preorder",function(t){t.depth>a&&(a=t.depth)});var r=t.expandAndCollapse&&t.initialTreeDepth>=0?t.initialTreeDepth:a;return o.root.eachNode("preorder",function(t){var e=t.hostTree.data.getRawDataItem(t.dataIndex);t.isExpand=e&&null!=e.collapsed?!e.collapsed:t.depth<=r}),o.data},formatTooltip:function(t){for(var e=this.getData().tree,i=e.root.children[0],n=e.getNodeByDataIndex(t),o=n.getValue(),a=n.name;n&&n!==i;)a=n.parentNode.name+"."+a,n=n.parentNode;return Ho(a+(isNaN(o)||null==o?"":" : "+o))},defaultOption:{zlevel:0,z:2,left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",orient:"horizontal",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:"#ccc",width:1.5,curveness:.5},itemStyle:{color:"lightsteelblue",borderColor:"#c23531",borderWidth:1.5},label:{show:!0,color:"#555"},leaves:{label:{show:!0}},animationEasing:"linear",animationDuration:700,animationDurationUpdate:1e3}}),ys({type:"tree",init:function(t,e){this._oldTree,this._mainGroup=new S_,this.group.add(this._mainGroup)},render:function(t,e,i,n){var o=t.getData(),a=t.layoutInfo,r=this._mainGroup,s=t.get("layout");"radial"===s?r.attr("position",[a.x+a.width/2,a.y+a.height/2]):r.attr("position",[a.x,a.y]);var l=this._data,h={expandAndCollapse:t.get("expandAndCollapse"),layout:s,orient:t.get("orient"),curvature:t.get("lineStyle.curveness"),symbolRotate:t.get("symbolRotate"),symbolOffset:t.get("symbolOffset"),hoverAnimation:t.get("hoverAnimation"),useNameLabel:!0,fadeIn:!0};o.diff(l).add(function(e){Ru(o,e)&&Vu(o,e,null,r,t,h)}).update(function(e,i){var n=l.getItemGraphicEl(i);Ru(o,e)?Vu(o,e,n,r,t,h):n&&Gu(o,e,n,r,t,h)}).remove(function(e){var i=l.getItemGraphicEl(e);Gu(o,e,i,r,t,h)}).execute(),!0===h.expandAndCollapse&&o.eachItemGraphicEl(function(e,n){e.off("click").on("click",function(){i.dispatchAction({type:"treeExpandAndCollapse",seriesId:t.id,dataIndex:n})})}),this._data=o},dispose:function(){},remove:function(){this._mainGroup.removeAll(),this._data=null}}),hs({type:"treeExpandAndCollapse",event:"treeExpandAndCollapse",update:"update"},function(t,e){e.eachComponent({mainType:"series",subType:"tree",query:t},function(e){var i=t.dataIndex,n=e.getData().tree.getNodeByDataIndex(i);n.isExpand=!n.isExpand})});var BA=function(t,e){var i=Cu(t,e);t.layoutInfo=i;var n=t.get("layout"),o=0,a=0,r=null;"radial"===n?(o=2*Math.PI,a=Math.min(i.height,i.width)/2,r=Au(function(t,e){return(t.parentNode===e.parentNode?1:2)/t.depth})):(o=i.width,a=i.height,r=Au());var s=t.getData().tree.root,l=s.children[0];Mu(s),Fu(l,Iu,r),s.hierNode.modifier=-l.hierNode.prelim,Hu(l,Tu);var h=l,u=l,c=l;Hu(l,function(t){var e=t.getLayout().x;e<h.getLayout().x&&(h=t),e>u.getLayout().x&&(u=t),t.depth>c.depth&&(c=t)});var d=h===u?1:r(h,u)/2,f=d-h.getLayout().x,p=0,g=0,m=0,v=0;"radial"===n?(p=o/(u.getLayout().x+d+f),g=a/(c.depth-1||1),Hu(l,function(t){m=(t.getLayout().x+f)*p,v=(t.depth-1)*g;var e=Du(m,v);t.setLayout({x:e.x,y:e.y,rawX:m,rawY:v},!0)})):"horizontal"===t.get("orient")?(g=a/(u.getLayout().x+d+f),p=o/(c.depth-1||1),Hu(l,function(t){v=(t.getLayout().x+f)*g,m=(t.depth-1)*p,t.setLayout({x:m,y:v},!0)})):(p=o/(u.getLayout().x+d+f),g=a/(c.depth-1||1),Hu(l,function(t){m=(t.getLayout().x+f)*p,v=(t.depth-1)*g,t.setLayout({x:m,y:v},!0)}))};ds(bT("tree","circle")),cs(function(t,e){t.eachSeriesByType("tree",function(t){BA(t,e)})}),cs(function(t,e){t.eachSeriesByType("tree",function(t){BA(t,e)})}),uM.extend({type:"series.treemap",layoutMode:"box",dependencies:["grid","polar"],_viewRoot:null,defaultOption:{progressive:0,hoverLayerThreshold:1/0,left:"center",top:"middle",right:null,bottom:null,width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{color:"rgba(0,0,0,0.7)",borderColor:"rgba(255,255,255,0.7)",borderWidth:1,shadowColor:"rgba(150,150,150,1)",shadowBlur:3,shadowOffsetX:0,shadowOffsetY:0,textStyle:{color:"#fff"}},emphasis:{textStyle:{}}},label:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",ellipsis:!0},upperLabel:{show:!1,position:[0,"50%"],height:20,color:"#fff",ellipsis:!0,verticalAlign:"middle"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,"50%"],color:"#fff",ellipsis:!0,verticalAlign:"middle"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},getInitialData:function(t,e){var i={name:t.name,children:t.data};Yu(i);var n=t.levels||[];n=t.levels=qu(n,e);var o={};return o.levels=n,bu.createTree(i,this,o).data},optionUpdated:function(){this.resetViewRoot()},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=Wo(y(i)?i[0]:i);return Ho(e.getName(t)+": "+n)},getDataParams:function(t){var e=uM.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(t);return e.treePathInfo=Xu(i,this),e},setLayoutInfo:function(t){this.layoutInfo=this.layoutInfo||{},a(this.layoutInfo,t)},mapIdToIndex:function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=z(),this._idIndexMapCount=0);var i=e.get(t);return null==i&&e.set(t,i=this._idIndexMapCount++),i},getViewRoot:function(){return this._viewRoot},resetViewRoot:function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)}});var VA=5;$u.prototype={constructor:$u,render:function(t,e,i,n){var o=t.getModel("breadcrumb"),a=this.group;if(a.removeAll(),o.get("show")&&i){var r=o.getModel("itemStyle"),s=r.getModel("textStyle"),l={pos:{left:o.get("left"),right:o.get("right"),top:o.get("top"),bottom:o.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:o.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(i,l,s),this._renderContent(t,l,r,s,n),Jo(a,l.pos,l.box)}},_prepare:function(t,e,i){for(var n=t;n;n=n.parentNode){var o=n.getModel().get("name"),a=i.getTextRect(o),r=Math.max(a.width+16,e.emptyItemWidth);e.totalWidth+=r+8,e.renderList.push({node:n,text:o,width:r})}},_renderContent:function(t,e,i,n,o){for(var a=0,s=e.emptyItemWidth,l=t.get("breadcrumb.height"),h=$o(e.pos,e.box),u=e.totalWidth,c=e.renderList,d=c.length-1;d>=0;d--){var f=c[d],p=f.node,g=f.width,m=f.text;u>h.width&&(u-=g-s,g=s,m=null);var y=new Rb({shape:{points:Ku(a,0,g,l,d===c.length-1,0===d)},style:r(i.getItemStyle(),{lineJoin:"bevel",text:m,textFill:n.getTextColor(),textFont:n.getFont()}),z:10,onclick:v(o,p)});this.group.add(y),Ju(y,t,p),a+=g+8}},remove:function(){this.group.removeAll()}};var GA=m,WA=S_,FA=Vb,HA=d,ZA=["label"],UA=["emphasis","label"],jA=["upperLabel"],XA=["emphasis","upperLabel"],YA=10,qA=1,$A=2,KA=Sw([["fill","color"],["stroke","strokeColor"],["lineWidth","strokeWidth"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),JA=function(t){var e=KA(t);return e.stroke=e.fill=e.lineWidth=null,e};ys({type:"treemap",init:function(t,e){this._containerGroup,this._storage={nodeGroup:[],background:[],content:[]},this._oldTree,this._breadcrumb,this._controller,this._state="ready"},render:function(t,e,i,n){if(!(l(e.findComponents({mainType:"series",subType:"treemap",query:n}),t)<0)){this.seriesModel=t,this.api=i,this.ecModel=e;var o=Zu(n,["treemapZoomToNode","treemapRootToNode"],t),a=n&&n.type,r=t.layoutInfo,s=!this._oldTree,h=this._storage,u="treemapRootToNode"===a&&o&&h?{rootNodeGroup:h.nodeGroup[o.node.getRawIndex()],direction:n.direction}:null,c=this._giveContainerGroup(r),d=this._doRender(c,t,u);s||a&&"treemapZoomToNode"!==a&&"treemapRootToNode"!==a?d.renderFinally():this._doAnimation(c,d,t,u),this._resetController(i),this._renderBreadcrumb(t,i,o)}},_giveContainerGroup:function(t){var e=this._containerGroup;return e||(e=this._containerGroup=new WA,this._initEvents(e),this.group.add(e)),e.attr("position",[t.x,t.y]),e},_doRender:function(t,e,i){function n(t,e,i,o,a){function r(t){return t.getId()}function s(r,s){var l=null!=r?t[r]:null,h=null!=s?e[s]:null,c=u(l,h,i,a);c&&n(l&&l.viewChildren||[],h&&h.viewChildren||[],c,o,a+1)}o?(e=t,HA(t,function(t,e){!t.isRemoved()&&s(e,e)})):new ws(e,t,r,r).add(s).update(s).remove(v(s,null)).execute()}var o=e.getData().tree,a=this._oldTree,r={nodeGroup:[],background:[],content:[]},s={nodeGroup:[],background:[],content:[]},l=this._storage,h=[],u=v(tc,e,s,l,i,r,h);n(o.root?[o.root]:[],a&&a.root?[a.root]:[],t,o===a||!a,0);var c=function(t){var e={nodeGroup:[],background:[],content:[]};return t&&HA(t,function(t,i){var n=e[i];HA(t,function(t){t&&(n.push(t),t.__tmWillDelete=1)})}),e}(l);return this._oldTree=o,this._storage=s,{lastsForAnimation:r,willDeleteEls:c,renderFinally:function(){HA(c,function(t){HA(t,function(t){t.parent&&t.parent.remove(t)})}),HA(h,function(t){t.invisible=!0,t.dirty()})}}},_doAnimation:function(t,e,i,n){if(i.get("animation")){var o=i.get("animationDurationUpdate"),r=i.get("animationEasing"),s=Qu();HA(e.willDeleteEls,function(t,e){HA(t,function(t,i){if(!t.invisible){var a,l=t.parent;if(n&&"drillDown"===n.direction)a=l===n.rootNodeGroup?{shape:{x:0,y:0,width:l.__tmNodeWidth,height:l.__tmNodeHeight},style:{opacity:0}}:{style:{opacity:0}};else{var h=0,u=0;l.__tmWillDelete||(h=l.__tmNodeWidth/2,u=l.__tmNodeHeight/2),a="nodeGroup"===e?{position:[h,u],style:{opacity:0}}:{shape:{x:h,y:u,width:0,height:0},style:{opacity:0}}}a&&s.add(t,a,o,r)}})}),HA(this._storage,function(t,i){HA(t,function(t,n){var l=e.lastsForAnimation[i][n],h={};l&&("nodeGroup"===i?l.old&&(h.position=t.position.slice(),t.attr("position",l.old)):(l.old&&(h.shape=a({},t.shape),t.setShape(l.old)),l.fadein?(t.setStyle("opacity",0),h.style={opacity:1}):1!==t.style.opacity&&(h.style={opacity:1})),s.add(t,h,o,r))})},this),this._state="animating",s.done(GA(function(){this._state="ready",e.renderFinally()},this)).start()}},_resetController:function(t){var e=this._controller;e||((e=this._controller=new Zh(t.getZr())).enable(this.seriesModel.get("roam")),e.on("pan",GA(this._onPan,this)),e.on("zoom",GA(this._onZoom,this)));var i=new Kt(0,0,t.getWidth(),t.getHeight());e.setPointerChecker(function(t,e,n){return i.contain(e,n)})},_clearController:function(){var t=this._controller;t&&(t.dispose(),t=null)},_onPan:function(t,e){if("animating"!==this._state&&(Math.abs(t)>3||Math.abs(e)>3)){var i=this.seriesModel.getData().tree.root;if(!i)return;var n=i.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t,y:n.y+e,width:n.width,height:n.height}})}},_onZoom:function(t,e,i){if("animating"!==this._state){var n=this.seriesModel.getData().tree.root;if(!n)return;var o=n.getLayout();if(!o)return;var a=new Kt(o.x,o.y,o.width,o.height),r=this.seriesModel.layoutInfo;e-=r.x,i-=r.y;var s=st();ct(s,s,[-e,-i]),ft(s,s,[t,t]),ct(s,s,[e,i]),a.applyTransform(s),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:a.x,y:a.y,width:a.width,height:a.height}})}},_initEvents:function(t){t.on("click",function(t){if("ready"===this._state){var e=this.seriesModel.get("nodeClick",!0);if(e){var i=this.findTarget(t.offsetX,t.offsetY);if(i){var n=i.node;if(n.getLayout().isLeafRoot)this._rootToNode(i);else if("zoomToNode"===e)this._zoomToNode(i);else if("link"===e){var o=n.hostTree.data.getItemModel(n.dataIndex),a=o.get("link",!0),r=o.get("target",!0)||"blank";a&&window.open(a,r)}}}}},this)},_renderBreadcrumb:function(t,e,i){i||(i=null!=t.get("leafDepth",!0)?{node:t.getViewRoot()}:this.findTarget(e.getWidth()/2,e.getHeight()/2))||(i={node:t.getData().tree.root}),(this._breadcrumb||(this._breadcrumb=new $u(this.group))).render(t,e,i.node,GA(function(e){"animating"!==this._state&&(ju(t.getViewRoot(),e)?this._rootToNode({node:e}):this._zoomToNode({node:e}))},this))},remove:function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage={nodeGroup:[],background:[],content:[]},this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},dispose:function(){this._clearController()},_zoomToNode:function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},_rootToNode:function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},findTarget:function(t,e){var i;return this.seriesModel.getViewRoot().eachNode({attr:"viewChildren",order:"preorder"},function(n){var o=this._storage.background[n.getRawIndex()];if(o){var a=o.transformCoordToLocal(t,e),r=o.shape;if(!(r.x<=a[0]&&a[0]<=r.x+r.width&&r.y<=a[1]&&a[1]<=r.y+r.height))return!1;i={node:n,offsetX:a[0],offsetY:a[1]}}},this),i}});for(var QA=["treemapZoomToNode","treemapRender","treemapMove"],tD=0;tD<QA.length;tD++)hs({type:QA[tD],update:"updateView"},function(){});hs({type:"treemapRootToNode",update:"updateView"},function(t,e){e.eachComponent({mainType:"series",subType:"treemap",query:t},function(e,i){var n=Zu(t,["treemapZoomToNode","treemapRootToNode"],e);if(n){var o=e.getViewRoot();o&&(t.direction=ju(o,n.node)?"rollUp":"drillDown"),e.resetViewRoot(n.node)}})});var eD=d,iD=w,nD=-1,oD=function(t){var e=t.mappingMethod,n=t.type,o=this.option=i(t);this.type=n,this.mappingMethod=e,this._normalizeData=rD[e];var a=aD[n];this.applyVisual=a.applyVisual,this.getColorMapper=a.getColorMapper,this._doMap=a._doMap[e],"piecewise"===e?(oc(o),ic(o)):"category"===e?o.categories?nc(o):oc(o,!0):(k("linear"!==e||o.dataExtent),oc(o))};oD.prototype={constructor:oD,mapValueToVisual:function(t){var e=this._normalizeData(t);return this._doMap(e,t)},getNormalizer:function(){return m(this._normalizeData,this)}};var aD=oD.visualHandlers={color:{applyVisual:sc("color"),getColorMapper:function(){var t=this.option;return m("category"===t.mappingMethod?function(t,e){return!e&&(t=this._normalizeData(t)),lc.call(this,t)}:function(e,i,n){var o=!!n;return!i&&(e=this._normalizeData(e)),n=Ot(e,t.parsedVisual,n),o?n:Rt(n,"rgba")},this)},_doMap:{linear:function(t){return Rt(Ot(t,this.option.parsedVisual),"rgba")},category:lc,piecewise:function(t,e){var i=cc.call(this,e);return null==i&&(i=Rt(Ot(t,this.option.parsedVisual),"rgba")),i},fixed:hc}},colorHue:ac(function(t,e){return Et(t,e)}),colorSaturation:ac(function(t,e){return Et(t,null,e)}),colorLightness:ac(function(t,e){return Et(t,null,null,e)}),colorAlpha:ac(function(t,e){return zt(t,e)}),opacity:{applyVisual:sc("opacity"),_doMap:uc([0,1])},symbol:{applyVisual:function(t,e,i){var n=this.mapValueToVisual(t);if(_(n))i("symbol",n);else if(iD(n))for(var o in n)n.hasOwnProperty(o)&&i(o,n[o])},_doMap:{linear:rc,category:lc,piecewise:function(t,e){var i=cc.call(this,e);return null==i&&(i=rc.call(this,t)),i},fixed:hc}},symbolSize:{applyVisual:sc("symbolSize"),_doMap:uc([0,1])}},rD={linear:function(t){return Io(t,this.option.dataExtent,[0,1],!0)},piecewise:function(t){var e=this.option.pieceList,i=oD.findPieceIndex(t,e,!0);if(null!=i)return Io(i,[0,e.length-1],[0,1],!0)},category:function(t){var e=this.option.categories?this.option.categoryMap[t]:t;return null==e?nD:e},fixed:B};oD.listVisualTypes=function(){var t=[];return d(aD,function(e,i){t.push(i)}),t},oD.addVisualHandler=function(t,e){aD[t]=e},oD.isValidType=function(t){return aD.hasOwnProperty(t)},oD.eachVisual=function(t,e,i){w(t)?d(t,e,i):e.call(i,t)},oD.mapVisual=function(t,e,i){var n,o=y(t)?[]:w(t)?{}:(n=!0,null);return oD.eachVisual(t,function(t,a){var r=e.call(i,t,a);n?o=r:o[a]=r}),o},oD.retrieveVisuals=function(t){var e,i={};return t&&eD(aD,function(n,o){t.hasOwnProperty(o)&&(i[o]=t[o],e=!0)}),e?i:null},oD.prepareVisualTypes=function(t){if(iD(t)){var e=[];eD(t,function(t,i){e.push(i)}),t=e}else{if(!y(t))return[];t=t.slice()}return t.sort(function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1}),t},oD.dependsOn=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},oD.findPieceIndex=function(t,e,i){function n(e,i){var n=Math.abs(e-t);n<a&&(a=n,o=i)}for(var o,a=1/0,r=0,s=e.length;r<s;r++){var l=e[r].value;if(null!=l){if(l===t||"string"==typeof l&&l===t+"")return r;i&&n(l,r)}}for(var r=0,s=e.length;r<s;r++){var h=e[r],u=h.interval,c=h.close;if(u){if(u[0]===-1/0){if(fc(c[1],t,u[1]))return r}else if(u[1]===1/0){if(fc(c[0],u[0],t))return r}else if(fc(c[0],u[0],t)&&fc(c[1],t,u[1]))return r;i&&n(u[0],r),i&&n(u[1],r)}}if(i)return t===1/0?e.length-1:t===-1/0?0:o};var sD=y,lD="itemStyle",hD={seriesType:"treemap",reset:function(t,e,i,n){var o=t.getData().tree,a=o.root,r=t.getModel(lD);a.isRemoved()||pc(a,{},f(o.levelModels,function(t){return t?t.get(lD):null}),r,t.getViewRoot().getAncestors(),t)}},uD=Math.max,cD=Math.min,dD=T,fD=d,pD=["itemStyle","borderWidth"],gD=["itemStyle","gapWidth"],mD=["upperLabel","show"],vD=["upperLabel","height"],yD={seriesType:"treemap",reset:function(t,e,i,n){var o=i.getWidth(),r=i.getHeight(),s=t.option,l=Ko(t.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()}),h=s.size||[],u=To(dD(l.width,h[0]),o),c=To(dD(l.height,h[1]),r),d=n&&n.type,f=Zu(n,["treemapZoomToNode","treemapRootToNode"],t),p="treemapRender"===d||"treemapMove"===d?n.rootRect:null,g=t.getViewRoot(),m=Uu(g);if("treemapMove"!==d){var v="treemapZoomToNode"===d?Cc(t,f,g,u,c):p?[p.width,p.height]:[u,c],y=s.sort;y&&"asc"!==y&&"desc"!==y&&(y="desc");var x={squareRatio:s.squareRatio,sort:y,leafDepth:s.leafDepth};g.hostTree.clearLayouts();_={x:0,y:0,width:v[0],height:v[1],area:v[0]*v[1]};g.setLayout(_),bc(g,x,!1,0);var _=g.getLayout();fD(m,function(t,e){var i=(m[e+1]||g).getValue();t.setLayout(a({dataExtent:[i,i],borderWidth:0,upperHeight:0},_))})}var w=t.getData().tree.root;w.setLayout(Lc(l,p,f),!0),t.setLayoutInfo(l),kc(w,new Kt(-l.x,-l.y,o,r),m,g,0)}};ds(hD),cs(yD);var xD=function(t){this._directed=t||!1,this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={},this.data,this.edgeData},_D=xD.prototype;_D.type="graph",_D.isDirected=function(){return this._directed},_D.addNode=function(t,e){t=t||""+e;var i=this._nodesMap;if(!i[Oc(t)]){var n=new Nc(t,e);return n.hostGraph=this,this.nodes.push(n),i[Oc(t)]=n,n}},_D.getNodeByIndex=function(t){var e=this.data.getRawIndex(t);return this.nodes[e]},_D.getNodeById=function(t){return this._nodesMap[Oc(t)]},_D.addEdge=function(t,e,i){var n=this._nodesMap,o=this._edgesMap;if("number"==typeof t&&(t=this.nodes[t]),"number"==typeof e&&(e=this.nodes[e]),Nc.isInstance(t)||(t=n[Oc(t)]),Nc.isInstance(e)||(e=n[Oc(e)]),t&&e){var a=t.id+"-"+e.id;if(!o[a]){var r=new Ec(t,e,i);return r.hostGraph=this,this._directed&&(t.outEdges.push(r),e.inEdges.push(r)),t.edges.push(r),t!==e&&e.edges.push(r),this.edges.push(r),o[a]=r,r}}},_D.getEdgeByIndex=function(t){var e=this.edgeData.getRawIndex(t);return this.edges[e]},_D.getEdge=function(t,e){Nc.isInstance(t)&&(t=t.id),Nc.isInstance(e)&&(e=e.id);var i=this._edgesMap;return this._directed?i[t+"-"+e]:i[t+"-"+e]||i[e+"-"+t]},_D.eachNode=function(t,e){for(var i=this.nodes,n=i.length,o=0;o<n;o++)i[o].dataIndex>=0&&t.call(e,i[o],o)},_D.eachEdge=function(t,e){for(var i=this.edges,n=i.length,o=0;o<n;o++)i[o].dataIndex>=0&&i[o].node1.dataIndex>=0&&i[o].node2.dataIndex>=0&&t.call(e,i[o],o)},_D.breadthFirstTraverse=function(t,e,i,n){if(Nc.isInstance(e)||(e=this._nodesMap[Oc(e)]),e){for(var o="out"===i?"outEdges":"in"===i?"inEdges":"edges",a=0;a<this.nodes.length;a++)this.nodes[a].__visited=!1;if(!t.call(n,e,null))for(var r=[e];r.length;)for(var s=r.shift(),l=s[o],a=0;a<l.length;a++){var h=l[a],u=h.node1===s?h.node2:h.node1;if(!u.__visited){if(t.call(n,u,s))return;r.push(u),u.__visited=!0}}}},_D.update=function(){for(var t=this.data,e=this.edgeData,i=this.nodes,n=this.edges,o=0,a=i.length;o<a;o++)i[o].dataIndex=-1;for(var o=0,a=t.count();o<a;o++)i[t.getRawIndex(o)].dataIndex=o;e.filterSelf(function(t){var i=n[e.getRawIndex(t)];return i.node1.dataIndex>=0&&i.node2.dataIndex>=0});for(var o=0,a=n.length;o<a;o++)n[o].dataIndex=-1;for(var o=0,a=e.count();o<a;o++)n[e.getRawIndex(o)].dataIndex=o},_D.clone=function(){for(var t=new xD(this._directed),e=this.nodes,i=this.edges,n=0;n<e.length;n++)t.addNode(e[n].id,e[n].dataIndex);for(n=0;n<i.length;n++){var o=i[n];t.addEdge(o.node1.id,o.node2.id,o.dataIndex)}return t},Nc.prototype={constructor:Nc,degree:function(){return this.edges.length},inDegree:function(){return this.inEdges.length},outDegree:function(){return this.outEdges.length},getModel:function(t){if(!(this.dataIndex<0))return this.hostGraph.data.getItemModel(this.dataIndex).getModel(t)}},Ec.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostGraph.edgeData.getItemModel(this.dataIndex).getModel(t)};var wD=function(t,e){return{getValue:function(i){var n=this[t][e];return n.get(n.getDimension(i||"value"),this.dataIndex)},setVisual:function(i,n){this.dataIndex>=0&&this[t][e].setItemVisual(this.dataIndex,i,n)},getVisual:function(i,n){return this[t][e].getItemVisual(this.dataIndex,i,n)},setLayout:function(i,n){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,i,n)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}};u(Nc,wD("hostGraph","data")),u(Ec,wD("hostGraph","edgeData")),xD.Node=Nc,xD.Edge=Ec,Gi(Nc),Gi(Ec);var bD=function(t,e,i,n,o){for(var a=new xD(n),r=0;r<t.length;r++)a.addNode(T(t[r].id,t[r].name,r),r);for(var s=[],l=[],h=0,r=0;r<e.length;r++){var u=e[r],c=u.source,d=u.target;a.addEdge(c,d,h)&&(l.push(u),s.push(T(u.id,c+" > "+d)),h++)}var f,p=i.get("coordinateSystem");if("cartesian2d"===p||"polar"===p)f=Bs(t,i);else{var g=Aa.get(p),m=wI(t,{coordDimensions:(g&&"view"!==g.type?g.dimensions||[]:[]).concat(["value"])});(f=new yI(m,i)).initData(t)}var v=new yI(["value"],i);return v.initData(l,s),o&&o(f,v),pu({mainData:f,struct:a,structAttr:"graph",datas:{node:f,edge:v},datasAttr:{node:"data",edge:"edgeData"}}),a.update(),a},SD=vs({type:"series.graph",init:function(t){SD.superApply(this,"init",arguments),this.legendDataProvider=function(){return this._categoriesData},this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeOption:function(t){SD.superApply(this,"mergeOption",arguments),this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeDefaultAndTheme:function(t){SD.superApply(this,"mergeDefaultAndTheme",arguments),Mi(t,["edgeLabel"],["show"])},getInitialData:function(t,e){var i=t.edges||t.links||[],n=t.data||t.nodes||[],o=this;if(n&&i)return bD(n,i,this,!0,function(t,i){function n(t){return(t=this.parsePath(t))&&"label"===t[0]?r:this.parentModel}t.wrapMethod("getItemModel",function(t){var e=o._categoriesModels[t.getShallow("category")];return e&&(e.parentModel=t.parentModel,t.parentModel=e),t});var a=o.getModel("edgeLabel"),r=new _o({label:a.option},a.parentModel,e);i.wrapMethod("getItemModel",function(t){return t.customizeGetParent(n),t})}).data},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},getCategoriesData:function(){return this._categoriesData},formatTooltip:function(t,e,i){if("edge"===i){var n=this.getData(),o=this.getDataParams(t,i),a=n.graph.getEdgeByIndex(t),r=n.getName(a.node1.dataIndex),s=n.getName(a.node2.dataIndex),l=[];return null!=r&&l.push(r),null!=s&&l.push(s),l=Ho(l.join(" > ")),o.value&&(l+=" : "+Ho(o.value)),l}return SD.superApply(this,"formatTooltip",arguments)},_updateCategoriesData:function(){var t=f(this.option.categories||[],function(t){return null!=t.value?t:a({value:0},t)}),e=new yI(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray(function(t){return e.getItemModel(t,!0)})},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},isAnimationEnabled:function(){return SD.superCall(this,"isAnimationEnabled")&&!("force"===this.get("layout")&&this.get("force.layoutAnimation"))},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",legendHoverLink:!0,hoverAnimation:!0,layout:null,focusNodeAdjacency:!1,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{position:"middle"},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:"{b}"},itemStyle:{},lineStyle:{color:"#aaa",width:1,curveness:0,opacity:.5},emphasis:{label:{show:!0}}}}),MD=Gb.prototype,ID=Fb.prototype,TD=Nn({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){(zc(e)?MD:ID).buildPath(t,e)},pointAt:function(t){return zc(this.shape)?MD.pointAt.call(this,t):ID.pointAt.call(this,t)},tangentAt:function(t){var e=this.shape,i=zc(e)?[e.x2-e.x1,e.y2-e.y1]:ID.tangentAt.call(this,t);return q(i,i)}}),AD=["fromSymbol","toSymbol"],DD=Wc.prototype;DD.beforeUpdate=function(){var t=this,e=t.childOfName("fromSymbol"),i=t.childOfName("toSymbol"),n=t.childOfName("label");if(e||i||!n.ignore){for(var o=1,a=this.parent;a;)a.scale&&(o/=a.scale[0]),a=a.parent;var r=t.childOfName("line");if(this.__dirty||r.__dirty){var s=r.shape.percent,l=r.pointAt(0),h=r.pointAt(s),u=U([],h,l);if(q(u,u),e&&(e.attr("position",l),c=r.tangentAt(0),e.attr("rotation",Math.PI/2-Math.atan2(c[1],c[0])),e.attr("scale",[o*s,o*s])),i){i.attr("position",h);var c=r.tangentAt(1);i.attr("rotation",-Math.PI/2-Math.atan2(c[1],c[0])),i.attr("scale",[o*s,o*s])}if(!n.ignore){n.attr("position",h);var d,f,p,g=5*o;if("end"===n.__position)d=[u[0]*g+h[0],u[1]*g+h[1]],f=u[0]>.8?"left":u[0]<-.8?"right":"center",p=u[1]>.8?"top":u[1]<-.8?"bottom":"middle";else if("middle"===n.__position){var m=s/2,v=[(c=r.tangentAt(m))[1],-c[0]],y=r.pointAt(m);v[1]>0&&(v[0]=-v[0],v[1]=-v[1]),d=[y[0]+v[0]*g,y[1]+v[1]*g],f="center",p="bottom";var x=-Math.atan2(c[1],c[0]);h[0]<l[0]&&(x=Math.PI+x),n.attr("rotation",x)}else d=[-u[0]*g+l[0],-u[1]*g+l[1]],f=u[0]>.8?"right":u[0]<-.8?"left":"center",p=u[1]>.8?"bottom":u[1]<-.8?"top":"middle";n.attr({style:{textVerticalAlign:n.__verticalAlign||p,textAlign:n.__textAlign||f},position:d,scale:[o,o]})}}}},DD._createLine=function(t,e,i){var n=t.hostModel,o=Vc(t.getItemLayout(e));o.shape.percent=0,fo(o,{shape:{percent:1}},n,e),this.add(o);var a=new Cb({name:"label"});this.add(a),d(AD,function(i){var n=Bc(i,t,e);this.add(n),this[Rc(i)]=t.getItemVisual(e,i)},this),this._updateCommonStl(t,e,i)},DD.updateData=function(t,e,i){var n=t.hostModel,o=this.childOfName("line"),a=t.getItemLayout(e),r={shape:{}};Gc(r.shape,a),co(o,r,n,e),d(AD,function(i){var n=t.getItemVisual(e,i),o=Rc(i);if(this[o]!==n){this.remove(this.childOfName(i));var a=Bc(i,t,e);this.add(a)}this[o]=n},this),this._updateCommonStl(t,e,i)},DD._updateCommonStl=function(t,e,i){var n=t.hostModel,o=this.childOfName("line"),a=i&&i.lineStyle,s=i&&i.hoverLineStyle,l=i&&i.labelModel,h=i&&i.hoverLabelModel;if(!i||t.hasItemOption){var u=t.getItemModel(e);a=u.getModel("lineStyle").getLineStyle(),s=u.getModel("emphasis.lineStyle").getLineStyle(),l=u.getModel("label"),h=u.getModel("emphasis.label")}var c=t.getItemVisual(e,"color"),f=D(t.getItemVisual(e,"opacity"),a.opacity,1);o.useStyle(r({strokeNoScale:!0,fill:"none",stroke:c,opacity:f},a)),o.hoverStyle=s,d(AD,function(t){var e=this.childOfName(t);e&&(e.setColor(c),e.setStyle({opacity:f}))},this);var p,g,m,v=l.getShallow("show"),y=h.getShallow("show"),x=this.childOfName("label");if(v||y){if(p=c||"#000",null==(g=n.getFormattedLabel(e,"normal",t.dataType))){var _=n.getRawValue(e);g=null==_?t.getName(e):isFinite(_)?Ao(_):_}m=A(n.getFormattedLabel(e,"emphasis",t.dataType),g)}if(v){var w=io(x.style,l,{text:g},{autoColor:p});x.__textAlign=w.textAlign,x.__verticalAlign=w.textVerticalAlign,x.__position=l.get("position")||"middle"}else x.setStyle("text",null);x.hoverStyle=y?{text:m,textFill:h.getTextColor(!0),fontStyle:h.getShallow("fontStyle"),fontWeight:h.getShallow("fontWeight"),fontSize:h.getShallow("fontSize"),fontFamily:h.getShallow("fontFamily")}:{text:null},x.ignore=!v&&!y,to(this)},DD.highlight=function(){this.trigger("emphasis")},DD.downplay=function(){this.trigger("normal")},DD.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},DD.setLinePoints=function(t){var e=this.childOfName("line");Gc(e.shape,t),e.dirty()},h(Wc,S_);var CD=Fc.prototype;CD.isPersistent=function(){return!0},CD.updateData=function(t){var e=this,i=e.group,n=e._lineData;e._lineData=t,n||i.removeAll();var o=Uc(t);t.diff(n).add(function(i){Hc(e,t,i,o)}).update(function(i,a){Zc(e,n,t,a,i,o)}).remove(function(t){i.remove(n.getItemGraphicEl(t))}).execute()},CD.updateLayout=function(){var t=this._lineData;t.eachItemGraphicEl(function(e,i){e.updateLayout(t,i)},this)},CD.incrementalPrepareUpdate=function(t){this._seriesScope=Uc(t),this._lineData=null,this.group.removeAll()},CD.incrementalUpdate=function(t,e){for(var i=t.start;i<t.end;i++)if(Xc(e.getItemLayout(i))){var n=new this._ctor(e,i,this._seriesScope);n.traverse(function(t){t.isGroup||(t.incremental=t.useHoverLayer=!0)}),this.group.add(n)}},CD.remove=function(){this._clearIncremental(),this._incremental=null,this.group.removeAll()},CD._clearIncremental=function(){var t=this._incremental;t&&t.clearDisplaybles()};var LD=[],kD=[],PD=[],OD=Ji,ND=Gx,ED=Math.abs,zD=function(t,e){function i(t){var e=t.getVisual("symbolSize");return e instanceof Array&&(e=(e[0]+e[1])/2),e}var n=[],o=nn,a=[[],[],[]],r=[[],[]],s=[];e/=2,t.eachEdge(function(t,l){var h=t.getLayout(),u=t.getVisual("fromSymbol"),c=t.getVisual("toSymbol");h.__original||(h.__original=[W(h[0]),W(h[1])],h[2]&&h.__original.push(W(h[2])));var d=h.__original;if(null!=h[2]){if(G(a[0],d[0]),G(a[1],d[2]),G(a[2],d[1]),u&&"none"!=u){var f=i(t.node1),p=Yc(a,d[0],f*e);o(a[0][0],a[1][0],a[2][0],p,n),a[0][0]=n[3],a[1][0]=n[4],o(a[0][1],a[1][1],a[2][1],p,n),a[0][1]=n[3],a[1][1]=n[4]}if(c&&"none"!=c){var f=i(t.node2),p=Yc(a,d[1],f*e);o(a[0][0],a[1][0],a[2][0],p,n),a[1][0]=n[1],a[2][0]=n[2],o(a[0][1],a[1][1],a[2][1],p,n),a[1][1]=n[1],a[2][1]=n[2]}G(h[0],a[0]),G(h[1],a[2]),G(h[2],a[1])}else{if(G(r[0],d[0]),G(r[1],d[1]),U(s,r[1],r[0]),q(s,s),u&&"none"!=u){f=i(t.node1);Z(r[0],r[0],s,f*e)}if(c&&"none"!=c){f=i(t.node2);Z(r[1],r[1],s,-f*e)}G(h[0],r[0]),G(h[1],r[1])}})},RD=["itemStyle","opacity"],BD=["lineStyle","opacity"];ys({type:"graph",init:function(t,e){var i=new Ml,n=new Fc,o=this.group;this._controller=new Zh(e.getZr()),this._controllerHost={target:o},o.add(i.group),o.add(n.group),this._symbolDraw=i,this._lineDraw=n,this._firstRender=!0},render:function(t,e,i){var n=t.coordinateSystem;this._model=t,this._nodeScaleRatio=t.get("nodeScaleRatio");var o=this._symbolDraw,a=this._lineDraw,r=this.group;if("view"===n.type){var s={position:n.position,scale:n.scale};this._firstRender?r.attr(s):co(r,s,t)}zD(t.getGraph(),this._getNodeGlobalScale(t));var l=t.getData();o.updateData(l);var h=t.getEdgeData();a.updateData(h),this._updateNodeAndLinkScale(),this._updateController(t,e,i),clearTimeout(this._layoutTimeout);var u=t.forceLayout,c=t.get("force.layoutAnimation");u&&this._startForceLayoutIteration(u,c),l.eachItemGraphicEl(function(e,n){var o=l.getItemModel(n);e.off("drag").off("dragend");var a=l.getItemModel(n).get("draggable");a&&e.on("drag",function(){u&&(u.warmUp(),!this._layouting&&this._startForceLayoutIteration(u,c),u.setFixed(n),l.setItemLayout(n,e.position))},this).on("dragend",function(){u&&u.setUnfixed(n)},this),e.setDraggable(a&&u),e.off("mouseover",e.__focusNodeAdjacency),e.off("mouseout",e.__unfocusNodeAdjacency),o.get("focusNodeAdjacency")&&(e.on("mouseover",e.__focusNodeAdjacency=function(){i.dispatchAction({type:"focusNodeAdjacency",seriesId:t.id,dataIndex:e.dataIndex})}),e.on("mouseout",e.__unfocusNodeAdjacency=function(){i.dispatchAction({type:"unfocusNodeAdjacency",seriesId:t.id})}))},this),l.graph.eachEdge(function(e){var n=e.getGraphicEl();n.off("mouseover",n.__focusNodeAdjacency),n.off("mouseout",n.__unfocusNodeAdjacency),e.getModel().get("focusNodeAdjacency")&&(n.on("mouseover",n.__focusNodeAdjacency=function(){i.dispatchAction({type:"focusNodeAdjacency",seriesId:t.id,edgeDataIndex:e.dataIndex})}),n.on("mouseout",n.__unfocusNodeAdjacency=function(){i.dispatchAction({type:"unfocusNodeAdjacency",seriesId:t.id})}))});var d="circular"===t.get("layout")&&t.get("circular.rotateLabel"),f=l.getLayout("cx"),p=l.getLayout("cy");l.eachItemGraphicEl(function(t,e){var i=t.getSymbolPath();if(d){var n=l.getItemLayout(e),o=Math.atan2(n[1]-p,n[0]-f);o<0&&(o=2*Math.PI+o);var a=n[0]<f;a&&(o-=Math.PI);var r=a?"left":"right";i.setStyle({textRotation:-o,textPosition:r,textOrigin:"center"}),i.hoverStyle&&(i.hoverStyle.textPosition=r)}else i.setStyle({textRotation:0})}),this._firstRender=!1},dispose:function(){this._controller&&this._controller.dispose(),this._controllerHost={}},focusNodeAdjacency:function(t,e,i,n){var o=this._model.getData().graph,a=n.dataIndex,r=n.edgeDataIndex,s=o.getNodeByIndex(a),l=o.getEdgeByIndex(r);(s||l)&&(o.eachNode(function(t){$c(t,RD,.1)}),o.eachEdge(function(t){$c(t,BD,.1)}),s&&(Kc(s,RD),d(s.edges,function(t){t.dataIndex<0||(Kc(t,BD),Kc(t.node1,RD),Kc(t.node2,RD))})),l&&(Kc(l,BD),Kc(l.node1,RD),Kc(l.node2,RD)))},unfocusNodeAdjacency:function(t,e,i,n){var o=this._model.getData().graph;o.eachNode(function(t){$c(t,RD)}),o.eachEdge(function(t){$c(t,BD)})},_startForceLayoutIteration:function(t,e){var i=this;!function n(){t.step(function(t){i.updateLayout(i._model),(i._layouting=!t)&&(e?i._layoutTimeout=setTimeout(n,16):n())})}()},_updateController:function(t,e,i){var n=this._controller,o=this._controllerHost,a=this.group;n.setPointerChecker(function(e,n,o){var r=a.getBoundingRect();return r.applyTransform(a.transform),r.contain(n,o)&&!tu(e,i,t)}),"view"===t.coordinateSystem.type?(n.enable(t.get("roam")),o.zoomLimit=t.get("scaleLimit"),o.zoom=t.coordinateSystem.getZoom(),n.off("pan").off("zoom").on("pan",function(e,n){Jh(o,e,n),i.dispatchAction({seriesId:t.id,type:"graphRoam",dx:e,dy:n})}).on("zoom",function(e,n,a){Qh(o,e,n,a),i.dispatchAction({seriesId:t.id,type:"graphRoam",zoom:e,originX:n,originY:a}),this._updateNodeAndLinkScale(),zD(t.getGraph(),this._getNodeGlobalScale(t)),this._lineDraw.updateLayout()},this)):n.disable()},_updateNodeAndLinkScale:function(){var t=this._model,e=t.getData(),i=this._getNodeGlobalScale(t),n=[i,i];e.eachItemGraphicEl(function(t,e){t.attr("scale",n)})},_getNodeGlobalScale:function(t){var e=t.coordinateSystem;if("view"!==e.type)return 1;var i=this._nodeScaleRatio,n=e.scale,o=n&&n[0]||1;return((e.getZoom()-1)*i+1)/o},updateLayout:function(t){zD(t.getGraph(),this._getNodeGlobalScale(t)),this._symbolDraw.updateLayout(),this._lineDraw.updateLayout()},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(),this._lineDraw&&this._lineDraw.remove()}}),hs({type:"graphRoam",event:"graphRoam",update:"none"},function(t,e){e.eachComponent({mainType:"series",query:t},function(e){var i=au(e.coordinateSystem,t);e.setCenter&&e.setCenter(i.center),e.setZoom&&e.setZoom(i.zoom)})}),hs({type:"focusNodeAdjacency",event:"focusNodeAdjacency",update:"series.graph:focusNodeAdjacency"},function(){}),hs({type:"unfocusNodeAdjacency",event:"unfocusNodeAdjacency",update:"series.graph:unfocusNodeAdjacency"},function(){});var VD=Z;ls(function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.eachSeriesByType("graph",function(t){var i=t.getCategoriesData(),n=t.getGraph().data,o=i.mapArray(i.getName);n.filterSelf(function(t){var i=n.getItemModel(t).getShallow("category");if(null!=i){"number"==typeof i&&(i=o[i]);for(var a=0;a<e.length;a++)if(!e[a].isSelected(i))return!1}return!0})},this)}),ds(bT("graph","circle",null)),ds(function(t){var e={};t.eachSeriesByType("graph",function(t){var i=t.getCategoriesData(),n=t.getData(),o={};i.each(function(n){var a=i.getName(n);o["ec-"+a]=n;var r=i.getItemModel(n).get("itemStyle.color")||t.getColorFromPalette(a,e);i.setItemVisual(n,"color",r)}),i.count()&&n.each(function(t){var e=n.getItemModel(t).getShallow("category");null!=e&&("string"==typeof e&&(e=o["ec-"+e]),n.getItemVisual(t,"color",!0)||n.setItemVisual(t,"color",i.getItemVisual(e,"color")))})})}),ds(function(t){t.eachSeriesByType("graph",function(t){var e=t.getGraph(),i=t.getEdgeData(),n=Jc(t.get("edgeSymbol")),o=Jc(t.get("edgeSymbolSize")),a="lineStyle.color".split("."),r="lineStyle.opacity".split(".");i.setVisual("fromSymbol",n&&n[0]),i.setVisual("toSymbol",n&&n[1]),i.setVisual("fromSymbolSize",o&&o[0]),i.setVisual("toSymbolSize",o&&o[1]),i.setVisual("color",t.get(a)),i.setVisual("opacity",t.get(r)),i.each(function(t){var n=i.getItemModel(t),o=e.getEdgeByIndex(t),s=Jc(n.getShallow("symbol",!0)),l=Jc(n.getShallow("symbolSize",!0)),h=n.get(a),u=n.get(r);switch(h){case"source":h=o.node1.getVisual("color");break;case"target":h=o.node2.getVisual("color")}s[0]&&o.setVisual("fromSymbol",s[0]),s[1]&&o.setVisual("toSymbol",s[1]),l[0]&&o.setVisual("fromSymbolSize",l[0]),l[1]&&o.setVisual("toSymbolSize",l[1]),o.setVisual("color",h),o.setVisual("opacity",u)})})}),cs(function(t,e){t.eachSeriesByType("graph",function(t){var e=t.get("layout"),i=t.coordinateSystem;if(i&&"view"!==i.type){var n=t.getData(),o=[];d(i.dimensions,function(t){o=o.concat(n.mapDimension(t,!0))});for(var a=0;a<n.count();a++){for(var r=[],s=!1,l=0;l<o.length;l++){var h=n.get(o[l],a);isNaN(h)||(s=!0),r.push(h)}s?n.setItemLayout(a,i.dataToPoint(r)):n.setItemLayout(a,[NaN,NaN])}td(n.graph)}else e&&"none"!==e||Qc(t)})}),cs(function(t){t.eachSeriesByType("graph",function(t){"circular"===t.get("layout")&&ed(t)})}),cs(function(t){t.eachSeriesByType("graph",function(t){var e=t.coordinateSystem;if(!e||"view"===e.type)if("force"===t.get("layout")){var i=t.preservedPoints||{},n=t.getGraph(),o=n.data,a=n.edgeData,r=t.getModel("force"),s=r.get("initLayout");t.preservedPoints?o.each(function(t){var e=o.getId(t);o.setItemLayout(t,i[e]||[NaN,NaN])}):s&&"none"!==s?"circular"===s&&ed(t):Qc(t);var l=o.getDataExtent("value"),h=a.getDataExtent("value"),u=r.get("repulsion"),c=r.get("edgeLength");y(u)||(u=[u,u]),y(c)||(c=[c,c]),c=[c[1],c[0]];var d=o.mapArray("value",function(t,e){var i=o.getItemLayout(e),n=Io(t,l,u);return isNaN(n)&&(n=(u[0]+u[1])/2),{w:n,rep:n,fixed:o.getItemModel(e).get("fixed"),p:!i||isNaN(i[0])||isNaN(i[1])?null:i}}),f=a.mapArray("value",function(t,e){var i=n.getEdgeByIndex(e),o=Io(t,h,c);return isNaN(o)&&(o=(c[0]+c[1])/2),{n1:d[i.node1.dataIndex],n2:d[i.node2.dataIndex],d:o,curveness:i.getModel().get("lineStyle.curveness")||0}}),p=(e=t.coordinateSystem).getBoundingRect(),g=id(d,f,{rect:p,gravity:r.get("gravity")}),m=g.step;g.step=function(t){for(var e=0,a=d.length;e<a;e++)d[e].fixed&&G(d[e].p,n.getNodeByIndex(e).getLayout());m(function(e,a,r){for(var s=0,l=e.length;s<l;s++)e[s].fixed||n.getNodeByIndex(s).setLayout(e[s].p),i[o.getId(s)]=e[s].p;for(var s=0,l=a.length;s<l;s++){var h=a[s],u=n.getEdgeByIndex(s),c=h.n1.p,d=h.n2.p,f=u.getLayout();(f=f?f.slice():[])[0]=f[0]||[],f[1]=f[1]||[],G(f[0],c),G(f[1],d),+h.curveness&&(f[2]=[(c[0]+d[0])/2-(c[1]-d[1])*h.curveness,(c[1]+d[1])/2-(d[0]-c[0])*h.curveness]),u.setLayout(f)}t&&t(r)})},t.forceLayout=g,t.preservedPoints=i,g.step()}else t.forceLayout=null})}),us("graphView",{create:function(t,e){var i=[];return t.eachSeriesByType("graph",function(t){var n=t.get("coordinateSystem");if(!n||"view"===n){var o=t.getData(),a=[],r=[];an(o.mapArray(function(t){var e=o.getItemModel(t);return[+e.get("x"),+e.get("y")]}),a,r),r[0]-a[0]==0&&(r[0]+=1,a[0]-=1),r[1]-a[1]==0&&(r[1]+=1,a[1]-=1);var s=(r[0]-a[0])/(r[1]-a[1]),l=nd(t,e,s);isNaN(s)&&(a=[l.x,l.y],r=[l.x+l.width,l.y+l.height]);var h=r[0]-a[0],u=r[1]-a[1],c=l.width,d=l.height,f=t.coordinateSystem=new su;f.zoomLimit=t.get("scaleLimit"),f.setBoundingRect(a[0],a[1],h,u),f.setViewRect(l.x,l.y,c,d),f.setCenter(t.get("center")),f.setZoom(t.get("zoom")),i.push(f)}}),i}});uM.extend({type:"series.gauge",getInitialData:function(t,e){var i=t.data||[];return y(i)||(i=[i]),t.data=i,rA(this,["value"])},defaultOption:{zlevel:0,z:2,center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,lineStyle:{color:[[.2,"#91c7ae"],[.8,"#63869e"],[1,"#c23531"]],width:30}},splitLine:{show:!0,length:30,lineStyle:{color:"#eee",width:2,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:8,lineStyle:{color:"#eee",width:1,type:"solid"}},axisLabel:{show:!0,distance:5,color:"auto"},pointer:{show:!0,length:"80%",width:8},itemStyle:{color:"auto"},title:{show:!0,offsetCenter:[0,"-40%"],color:"#333",fontSize:15},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:null,padding:[5,10],offsetCenter:[0,"40%"],color:"auto",fontSize:30}}});var GD=Mn.extend({type:"echartsGaugePointer",shape:{angle:0,width:10,r:10,x:0,y:0},buildPath:function(t,e){var i=Math.cos,n=Math.sin,o=e.r,a=e.width,r=e.angle,s=e.x-i(r)*a*(a>=o/3?1:2),l=e.y-n(r)*a*(a>=o/3?1:2);r=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+i(r)*a,e.y+n(r)*a),t.lineTo(e.x+i(e.angle)*o,e.y+n(e.angle)*o),t.lineTo(e.x-i(r)*a,e.y-n(r)*a),t.lineTo(s,l)}}),WD=2*Math.PI,FD=(cr.extend({type:"gauge",render:function(t,e,i){this.group.removeAll();var n=t.get("axisLine.lineStyle.color"),o=od(t,i);this._renderMain(t,e,i,n,o)},dispose:function(){},_renderMain:function(t,e,i,n,o){for(var a=this.group,r=t.getModel("axisLine").getModel("lineStyle"),s=t.get("clockwise"),l=-t.get("startAngle")/180*Math.PI,h=-t.get("endAngle")/180*Math.PI,u=(h-l)%WD,c=l,d=r.get("width"),f=0;f<n.length;f++){var p=Math.min(Math.max(n[f][0],0),1),g=new Ob({shape:{startAngle:c,endAngle:h=l+u*p,cx:o.cx,cy:o.cy,clockwise:s,r0:o.r-d,r:o.r},silent:!0});g.setStyle({fill:n[f][1]}),g.setStyle(r.getLineStyle(["color","borderWidth","borderColor"])),a.add(g),c=h}var m=function(t){if(t<=0)return n[0][1];for(var e=0;e<n.length;e++)if(n[e][0]>=t&&(0===e?0:n[e-1][0])<t)return n[e][1];return n[e-1][1]};if(!s){var v=l;l=h,h=v}this._renderTicks(t,e,i,m,o,l,h,s),this._renderPointer(t,e,i,m,o,l,h,s),this._renderTitle(t,e,i,m,o),this._renderDetail(t,e,i,m,o)},_renderTicks:function(t,e,i,n,o,a,r,s){for(var l=this.group,h=o.cx,u=o.cy,c=o.r,d=+t.get("min"),f=+t.get("max"),p=t.getModel("splitLine"),g=t.getModel("axisTick"),m=t.getModel("axisLabel"),v=t.get("splitNumber"),y=g.get("splitNumber"),x=To(p.get("length"),c),_=To(g.get("length"),c),w=a,b=(r-a)/v,S=b/y,M=p.getModel("lineStyle").getLineStyle(),I=g.getModel("lineStyle").getLineStyle(),T=0;T<=v;T++){var A=Math.cos(w),D=Math.sin(w);if(p.get("show")){var C=new Gb({shape:{x1:A*c+h,y1:D*c+u,x2:A*(c-x)+h,y2:D*(c-x)+u},style:M,silent:!0});"auto"===M.stroke&&C.setStyle({stroke:n(T/v)}),l.add(C)}if(m.get("show")){var L=ad(Ao(T/v*(f-d)+d),m.get("formatter")),k=m.get("distance"),P=n(T/v);l.add(new Cb({style:io({},m,{text:L,x:A*(c-x-k)+h,y:D*(c-x-k)+u,textVerticalAlign:D<-.4?"top":D>.4?"bottom":"middle",textAlign:A<-.4?"left":A>.4?"right":"center"},{autoColor:P}),silent:!0}))}if(g.get("show")&&T!==v){for(var O=0;O<=y;O++){var A=Math.cos(w),D=Math.sin(w),N=new Gb({shape:{x1:A*c+h,y1:D*c+u,x2:A*(c-_)+h,y2:D*(c-_)+u},silent:!0,style:I});"auto"===I.stroke&&N.setStyle({stroke:n((T+O/y)/v)}),l.add(N),w+=S}w-=S}else w+=b}},_renderPointer:function(t,e,i,n,o,a,r,s){var l=this.group,h=this._data;if(t.get("pointer.show")){var u=[+t.get("min"),+t.get("max")],c=[a,r],d=t.getData(),f=d.mapDimension("value");d.diff(h).add(function(e){var i=new GD({shape:{angle:a}});fo(i,{shape:{angle:Io(d.get(f,e),u,c,!0)}},t),l.add(i),d.setItemGraphicEl(e,i)}).update(function(e,i){var n=h.getItemGraphicEl(i);co(n,{shape:{angle:Io(d.get(f,e),u,c,!0)}},t),l.add(n),d.setItemGraphicEl(e,n)}).remove(function(t){var e=h.getItemGraphicEl(t);l.remove(e)}).execute(),d.eachItemGraphicEl(function(t,e){var i=d.getItemModel(e),a=i.getModel("pointer");t.setShape({x:o.cx,y:o.cy,width:To(a.get("width"),o.r),r:To(a.get("length"),o.r)}),t.useStyle(i.getModel("itemStyle").getItemStyle()),"auto"===t.style.fill&&t.setStyle("fill",n(Io(d.get(f,e),u,[0,1],!0))),to(t,i.getModel("emphasis.itemStyle").getItemStyle())}),this._data=d}else h&&h.eachItemGraphicEl(function(t){l.remove(t)})},_renderTitle:function(t,e,i,n,o){var a=t.getData(),r=a.mapDimension("value"),s=t.getModel("title");if(s.get("show")){var l=s.get("offsetCenter"),h=o.cx+To(l[0],o.r),u=o.cy+To(l[1],o.r),c=+t.get("min"),d=+t.get("max"),f=n(Io(t.getData().get(r,0),[c,d],[0,1],!0));this.group.add(new Cb({silent:!0,style:io({},s,{x:h,y:u,text:a.getName(0),textAlign:"center",textVerticalAlign:"middle"},{autoColor:f,forceRich:!0})}))}},_renderDetail:function(t,e,i,n,o){var a=t.getModel("detail"),r=+t.get("min"),s=+t.get("max");if(a.get("show")){var l=a.get("offsetCenter"),h=o.cx+To(l[0],o.r),u=o.cy+To(l[1],o.r),c=To(a.get("width"),o.r),d=To(a.get("height"),o.r),f=t.getData(),p=f.get(f.mapDimension("value"),0),g=n(Io(p,[r,s],[0,1],!0));this.group.add(new Cb({silent:!0,style:io({},a,{x:h,y:u,text:ad(p,a.get("formatter")),textWidth:isNaN(c)?null:c,textHeight:isNaN(d)?null:d,textAlign:"center",textVerticalAlign:"middle"},{autoColor:g,forceRich:!0})}))}}}),vs({type:"series.funnel",init:function(t){FD.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this._defaultLabelLine(t)},getInitialData:function(t,e){return rA(this,["value"])},_defaultLabelLine:function(t){Mi(t,"labelLine",["show"]);var e=t.labelLine,i=t.emphasis.labelLine;e.show=e.show&&t.label.show,i.show=i.show&&t.emphasis.label.show},getDataParams:function(t){var e=this.getData(),i=FD.superCall(this,"getDataParams",t),n=e.mapDimension("value"),o=e.getSum(n);return i.percent=o?+(e.get(n,t)/o*100).toFixed(2):0,i.$vars.push("percent"),i},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",gap:0,funnelAlign:"center",label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1,type:"solid"}},itemStyle:{borderColor:"#fff",borderWidth:1},emphasis:{label:{show:!0}}}})),HD=rd.prototype,ZD=["itemStyle","opacity"];HD.updateData=function(t,e,i){var n=this.childAt(0),o=t.hostModel,a=t.getItemModel(e),s=t.getItemLayout(e),l=t.getItemModel(e).get(ZD);l=null==l?1:l,n.useStyle({}),i?(n.setShape({points:s.points}),n.setStyle({opacity:0}),fo(n,{style:{opacity:l}},o,e)):co(n,{style:{opacity:l},shape:{points:s.points}},o,e);var h=a.getModel("itemStyle"),u=t.getItemVisual(e,"color");n.setStyle(r({lineJoin:"round",fill:u},h.getItemStyle(["opacity"]))),n.hoverStyle=h.getModel("emphasis").getItemStyle(),this._updateLabel(t,e),to(this)},HD._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),o=t.hostModel,a=t.getItemModel(e),r=t.getItemLayout(e).label,s=t.getItemVisual(e,"color");co(i,{shape:{points:r.linePoints||r.linePoints}},o,e),co(n,{style:{x:r.x,y:r.y}},o,e),n.attr({rotation:r.rotation,origin:[r.x,r.y],z2:10});var l=a.getModel("label"),h=a.getModel("emphasis.label"),u=a.getModel("labelLine"),c=a.getModel("emphasis.labelLine"),s=t.getItemVisual(e,"color");eo(n.style,n.hoverStyle={},l,h,{labelFetcher:t.hostModel,labelDataIndex:e,defaultText:t.getName(e),autoColor:s,useInsideStyle:!!r.inside},{textAlign:r.textAlign,textVerticalAlign:r.verticalAlign}),n.ignore=n.normalIgnore=!l.get("show"),n.hoverIgnore=!h.get("show"),i.ignore=i.normalIgnore=!u.get("show"),i.hoverIgnore=!c.get("show"),i.setStyle({stroke:s}),i.setStyle(u.getModel("lineStyle").getLineStyle()),i.hoverStyle=c.getModel("lineStyle").getLineStyle()},h(rd,S_);cr.extend({type:"funnel",render:function(t,e,i){var n=t.getData(),o=this._data,a=this.group;n.diff(o).add(function(t){var e=new rd(n,t);n.setItemGraphicEl(t,e),a.add(e)}).update(function(t,e){var i=o.getItemGraphicEl(e);i.updateData(n,t),a.add(i),n.setItemGraphicEl(t,i)}).remove(function(t){var e=o.getItemGraphicEl(t);a.remove(e)}).execute(),this._data=n},remove:function(){this.group.removeAll(),this._data=null},dispose:function(){}});ds(cA("funnel")),cs(function(t,e,i){t.eachSeriesByType("funnel",function(t){var i=t.getData(),n=i.mapDimension("value"),o=t.get("sort"),a=sd(t,e),r=ld(i,o),s=[To(t.get("minSize"),a.width),To(t.get("maxSize"),a.width)],l=i.getDataExtent(n),h=t.get("min"),u=t.get("max");null==h&&(h=Math.min(l[0],0)),null==u&&(u=l[1]);var c=t.get("funnelAlign"),d=t.get("gap"),f=(a.height-d*(i.count()-1))/i.count(),p=a.y,g=function(t,e){var o,r=Io(i.get(n,t)||0,[h,u],s,!0);switch(c){case"left":o=a.x;break;case"center":o=a.x+(a.width-r)/2;break;case"right":o=a.x+a.width-r}return[[o,e],[o+r,e]]};"ascending"===o&&(f=-f,d=-d,p+=a.height,r=r.reverse());for(var m=0;m<r.length;m++){var v=r[m],y=r[m+1],x=i.getItemModel(v).get("itemStyle.height");null==x?x=f:(x=To(x,a.height),"ascending"===o&&(x=-x));var _=g(v,p),w=g(y,p+x);p+=x+d,i.setItemLayout(v,{points:_.concat(w.slice().reverse())})}hd(i)})}),ls(gA("funnel"));var UD=function(t,e,i,n,o){nT.call(this,t,e,i),this.type=n||"value",this.axisIndex=o};UD.prototype={constructor:UD,model:null,isHorizontal:function(){return"horizontal"!==this.coordinateSystem.getModel().get("layout")}},h(UD,nT);var jD=function(t,e,i,n,o,a){e[0]=fd(e[0],i),e[1]=fd(e[1],i),t=t||0;var r=i[1]-i[0];null!=o&&(o=fd(o,[0,r])),null!=a&&(a=Math.max(a,null!=o?o:0)),"all"===n&&(o=a=Math.abs(e[1]-e[0]),n=0);var s=dd(e,n);e[n]+=t;var l=o||0,h=i.slice();s.sign<0?h[0]+=l:h[1]-=l,e[n]=fd(e[n],h);u=dd(e,n);null!=o&&(u.sign!==s.sign||u.span<o)&&(e[1-n]=e[n]+s.sign*o);var u=dd(e,n);return null!=a&&u.span>a&&(e[1-n]=e[n]+u.sign*a),e},XD=d,YD=Math.min,qD=Math.max,$D=Math.floor,KD=Math.ceil,JD=Ao,QD=Math.PI;pd.prototype={type:"parallel",constructor:pd,_init:function(t,e,i){var n=t.dimensions,o=t.parallelAxisIndex;XD(n,function(t,i){var n=o[i],a=e.getComponent("parallelAxis",n),r=this._axesMap.set(t,new UD(t,sl(a),[0,0],a.get("type"),n)),s="category"===r.type;r.onBand=s&&a.get("boundaryGap"),r.inverse=a.get("inverse"),a.axis=r,r.model=a,r.coordinateSystem=a.coordinateSystem=this},this)},update:function(t,e){this._updateAxesFromSeries(this._model,t)},containPoint:function(t){var e=this._makeLayoutInfo(),i=e.axisBase,n=e.layoutBase,o=e.pixelDimIndex,a=t[1-o],r=t[o];return a>=i&&a<=i+e.axisLength&&r>=n&&r<=n+e.layoutLength},getModel:function(){return this._model},_updateAxesFromSeries:function(t,e){e.eachSeries(function(i){if(t.contains(i,e)){var n=i.getData();XD(this.dimensions,function(t){var e=this._axesMap.get(t);e.scale.unionExtentFromData(n,n.mapDimension(t)),rl(e.scale,e.model)},this)}},this)},resize:function(t,e){this._rect=Ko(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes()},getRect:function(){return this._rect},_makeLayoutInfo:function(){var t,e=this._model,i=this._rect,n=["x","y"],o=["width","height"],a=e.get("layout"),r="horizontal"===a?0:1,s=i[o[r]],l=[0,s],h=this.dimensions.length,u=gd(e.get("axisExpandWidth"),l),c=gd(e.get("axisExpandCount")||0,[0,h]),d=e.get("axisExpandable")&&h>3&&h>c&&c>1&&u>0&&s>0,f=e.get("axisExpandWindow");f?(t=gd(f[1]-f[0],l),f[1]=f[0]+t):(t=gd(u*(c-1),l),(f=[u*(e.get("axisExpandCenter")||$D(h/2))-t/2])[1]=f[0]+t);var p=(s-t)/(h-c);p<3&&(p=0);var g=[$D(JD(f[0]/u,1))+1,KD(JD(f[1]/u,1))-1],m=p/u*f[0];return{layout:a,pixelDimIndex:r,layoutBase:i[n[r]],layoutLength:s,axisBase:i[n[1-r]],axisLength:i[o[1-r]],axisExpandable:d,axisExpandWidth:u,axisCollapseWidth:p,axisExpandWindow:f,axisCount:h,winInnerIndices:g,axisExpandWindow0Pos:m}},_layoutAxes:function(){var t=this._rect,e=this._axesMap,i=this.dimensions,n=this._makeLayoutInfo(),o=n.layout;e.each(function(t){var e=[0,n.axisLength],i=t.inverse?1:0;t.setExtent(e[i],e[1-i])}),XD(i,function(i,a){var r=(n.axisExpandable?vd:md)(a,n),s={horizontal:{x:r.position,y:n.axisLength},vertical:{x:0,y:r.position}},l={horizontal:QD/2,vertical:0},h=[s[o].x+t.x,s[o].y+t.y],u=l[o],c=st();dt(c,c,u),ct(c,c,h),this._axesLayout[i]={position:h,rotation:u,transform:c,axisNameAvailableWidth:r.axisNameAvailableWidth,axisLabelShow:r.axisLabelShow,nameTruncateMaxWidth:r.nameTruncateMaxWidth,tickDirection:1,labelDirection:1,labelInterval:e.get(i).getLabelInterval()}},this)},getAxis:function(t){return this._axesMap.get(t)},dataToPoint:function(t,e){return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t),e)},eachActiveState:function(t,e,i){for(var n=this.dimensions,o=f(n,function(e){return t.mapDimension(e)}),a=this._axesMap,r=this.hasAxisBrushed(),s=0,l=t.count();s<l;s++){var h,u=t.getValues(o,s);if(r){h="active";for(var c=0,d=n.length;c<d;c++){var p=n[c];if("inactive"===a.get(p).model.getActiveState(u[c],c)){h="inactive";break}}}else h="normal";e.call(i,h,s)}},hasAxisBrushed:function(){for(var t=this.dimensions,e=this._axesMap,i=!1,n=0,o=t.length;n<o;n++)"normal"!==e.get(t[n]).model.getActiveState()&&(i=!0);return i},axisCoordToPoint:function(t,e){return go([t,0],this._axesLayout[e].transform)},getAxisLayout:function(t){return i(this._axesLayout[t])},getSlidedAxisExpandWindow:function(t){var e=this._makeLayoutInfo(),i=e.pixelDimIndex,n=e.axisExpandWindow.slice(),o=n[1]-n[0],a=[0,e.axisExpandWidth*(e.axisCount-1)];if(!this.containPoint(t))return{behavior:"none",axisExpandWindow:n};var r,s=t[i]-e.layoutBase-e.axisExpandWindow0Pos,l="slide",h=e.axisCollapseWidth,u=this._model.get("axisExpandSlideTriggerArea"),c=null!=u[0];if(h)c&&h&&s<o*u[0]?(l="jump",r=s-o*u[2]):c&&h&&s>o*(1-u[0])?(l="jump",r=s-o*(1-u[2])):(r=s-o*u[1])>=0&&(r=s-o*(1-u[1]))<=0&&(r=0),(r*=e.axisExpandWidth/h)?jD(r,n,a,"all"):l="none";else{o=n[1]-n[0];(n=[qD(0,a[1]*s/o-o/2)])[1]=YD(a[1],n[0]+o),n[0]=n[1]-o}return{axisExpandWindow:n,behavior:l}}},Aa.register("parallel",{create:function(t,e){var i=[];return t.eachComponent("parallel",function(n,o){var a=new pd(n,t,e);a.name="parallel_"+o,a.resize(n,e),n.coordinateSystem=a,a.model=n,i.push(a)}),t.eachSeries(function(e){if("parallel"===e.get("coordinateSystem")){var i=t.queryComponents({mainType:"parallel",index:e.get("parallelIndex"),id:e.get("parallelId")})[0];e.coordinateSystem=i.coordinateSystem}}),i}});var tC=IS.extend({type:"baseParallelAxis",axis:null,activeIntervals:[],getAreaSelectStyle:function(){return Sw([["fill","color"],["lineWidth","borderWidth"],["stroke","borderColor"],["width","width"],["opacity","opacity"]])(this.getModel("areaSelectStyle"))},setActiveIntervals:function(t){var e=this.activeIntervals=i(t);if(e)for(var n=e.length-1;n>=0;n--)Do(e[n])},getActiveState:function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t)return"inactive";for(var i=0,n=e.length;i<n;i++)if(e[i][0]<=t&&t<=e[i][1])return"active";return"inactive"}}),eC={type:"value",dim:null,areaSelectStyle:{width:20,borderWidth:1,borderColor:"rgba(160,197,232)",color:"rgba(160,197,232)",opacity:.3},realtime:!0,z:10};n(tC.prototype,ZI),kT("parallel",tC,function(t,e){return e.type||(e.data?"category":"value")},eC),IS.extend({type:"parallel",dependencies:["parallelAxis"],coordinateSystem:null,dimensions:null,parallelAxisIndex:null,layoutMode:"box",defaultOption:{zlevel:0,z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},init:function(){IS.prototype.init.apply(this,arguments),this.mergeOption({})},mergeOption:function(t){var e=this.option;t&&n(e,t,!0),this._initDimensions()},contains:function(t,e){var i=t.get("parallelIndex");return null!=i&&e.getComponent("parallel",i)===this},setAxisExpand:function(t){d(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])},this)},_initDimensions:function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[];d(g(this.dependentModels.parallelAxis,function(t){return(t.get("parallelIndex")||0)===this.componentIndex},this),function(i){t.push("dim"+i.get("dim")),e.push(i.componentIndex)})}}),hs({type:"axisAreaSelect",event:"axisAreaSelected"},function(t,e){e.eachComponent({mainType:"parallelAxis",query:t},function(e){e.axis.model.setActiveIntervals(t.intervals)})}),hs("parallelAxisExpand",function(t,e){e.eachComponent({mainType:"parallel",query:t},function(e){e.setAxisExpand(t)})});var iC=v,nC=d,oC=f,aC=Math.min,rC=Math.max,sC=Math.pow,lC=1e4,hC=6,uC=6,cC="globalPan",dC={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},fC={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},pC={brushStyle:{lineWidth:2,stroke:"rgba(0,0,0,0.3)",fill:"rgba(0,0,0,0.1)"},transformable:!0,brushMode:"single",removeOnClick:!1},gC=0;yd.prototype={constructor:yd,enableBrush:function(t){return this._brushType&&_d(this),t.brushType&&xd(this,t),this},setPanels:function(t){if(t&&t.length){var e=this._panels={};d(t,function(t){e[t.panelId]=i(t)})}else this._panels=null;return this},mount:function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({position:t.position||[0,0],rotation:t.rotation||0,scale:t.scale||[1,1]}),this._transform=e.getLocalTransform(),this},eachCover:function(t,e){nC(this._covers,t,e)},updateCovers:function(t){function e(t,e){return(null!=t.id?t.id:a+e)+"-"+t.brushType}function o(e,i){var n=t[e];if(null!=i&&r[i]===h)s[e]=r[i];else{var o=s[e]=null!=i?(r[i].__brushOption=n,r[i]):bd(l,wd(l,n));Id(l,o)}}t=f(t,function(t){return n(i(pC),t,!0)});var a="\0-brush-index-",r=this._covers,s=this._covers=[],l=this,h=this._creatingCover;return new ws(r,t,function(t,i){return e(t.__brushOption,i)},e).add(o).update(o).remove(function(t){r[t]!==h&&l.group.remove(r[t])}).execute(),this},unmount:function(){return this.enableBrush(!1),Cd(this),this._zr.remove(this.group),this},dispose:function(){this.unmount(),this.off()}},u(yd,Hx);var mC={mousedown:function(t){if(this._dragging)Kd.call(this,t);else if(!t.target||!t.target.draggable){Xd(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null,(this._creatingPanel=Ad(this,t,e))&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);if(jd(this,t,e),this._dragging){Xd(t);var i=qd(this,t,e,!1);i&&Ld(this,i)}},mouseup:Kd},vC={lineX:Jd(0),lineY:Jd(1),rect:{createCover:function(t,e){return Od(iC(Wd,function(t){return t},function(t){return t}),t,e,["w","e","n","s","se","sw","ne","nw"])},getCreatingRange:function(t){var e=Pd(t);return Bd(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(t,e,i,n){Nd(t,e,i,n)},updateCommon:Ed,contain:Yd},polygon:{createCover:function(t,e){var i=new S_;return i.add(new Bb({name:"main",style:Rd(e),silent:!0})),i},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new Rb({name:"main",draggable:!0,drift:iC(Fd,t,e),ondragend:iC(Ld,t,{isEnd:!0})}))},updateCoverShape:function(t,e,i,n){e.childAt(0).setShape({points:Zd(t,e,i)})},updateCommon:Ed,contain:Yd}},yC=["axisLine","axisTickLabel","axisName"],xC=ms({type:"parallelAxis",init:function(t,e){xC.superApply(this,"init",arguments),(this._brushController=new yd(e.getZr())).on("brush",m(this._onBrush,this))},render:function(t,e,i,n){if(!of(t,e,n)){this.axisModel=t,this.api=i,this.group.removeAll();var o=this._axisGroup;if(this._axisGroup=new S_,this.group.add(this._axisGroup),t.get("show")){var r=rf(t,e),s=r.coordinateSystem,l=t.getAreaSelectStyle(),h=l.width,u=t.axis.dim,c=a({strokeContainThreshold:h},s.getAxisLayout(u)),f=new GT(t,c);d(yC,f.add,f),this._axisGroup.add(f.getGroup()),this._refreshBrushController(c,l,t,r,h,i);var p=n&&!1===n.animation?null:t;vo(o,this._axisGroup,p)}}},_refreshBrushController:function(t,e,i,n,o,a){var r=i.axis.getExtent(),s=r[1]-r[0],l=Math.min(30,.1*Math.abs(s)),h=Kt.create({x:r[0],y:-o/2,width:s,height:o});h.x-=l,h.width+=2*l,this._brushController.mount({enableGlobalPan:!0,rotation:t.rotation,position:t.position}).setPanels([{panelId:"pl",clipPath:Qd(h),isTargetByCursor:ef(h,a,n),getLinearBrushOtherExtent:tf(h,0)}]).enableBrush({brushType:"lineX",brushStyle:e,removeOnClick:!0}).updateCovers(af(i))},_onBrush:function(t,e){var i=this.axisModel,n=i.axis,o=f(t,function(t){return[n.coordToData(t.range[0],!0),n.coordToData(t.range[1],!0)]});(!i.option.realtime===e.isEnd||e.removeOnClick)&&this.api.dispatchAction({type:"axisAreaSelect",parallelAxisId:i.id,intervals:o})},dispose:function(){this._brushController.dispose()}});ms({type:"parallel",render:function(t,e,i){this._model=t,this._api=i,this._handlers||(this._handlers={},d(_C,function(t,e){i.getZr().on(e,this._handlers[e]=m(t,this))},this)),yr(this,"_throttledDispatchExpand",t.get("axisExpandRate"),"fixRate")},dispose:function(t,e){d(this._handlers,function(t,i){e.getZr().off(i,t)}),this._handlers=null},_throttledDispatchExpand:function(t){this._dispatchExpand(t)},_dispatchExpand:function(t){t&&this._api.dispatchAction(a({type:"parallelAxisExpand"},t))}});var _C={mousedown:function(t){sf(this,"click")&&(this._mouseDownPoint=[t.offsetX,t.offsetY])},mouseup:function(t){var e=this._mouseDownPoint;if(sf(this,"click")&&e){var i=[t.offsetX,t.offsetY];if(Math.pow(e[0]-i[0],2)+Math.pow(e[1]-i[1],2)>5)return;var n=this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]);"none"!==n.behavior&&this._dispatchExpand({axisExpandWindow:n.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(t){if(!this._mouseDownPoint&&sf(this,"mousemove")){var e=this._model,i=e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]),n=i.behavior;"jump"===n&&this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===n?null:{axisExpandWindow:i.axisExpandWindow,animation:"jump"===n&&null})}}};ss(function(t){ud(t),cd(t)}),uM.extend({type:"series.parallel",dependencies:["parallel"],visualColorAccessPath:"lineStyle.color",getInitialData:function(t,e){this.option.progressive&&(this.option.animation=!1);var i=this.getSource();return lf(i,this),Bs(i,this)},getRawIndicesByActiveState:function(t){var e=this.coordinateSystem,i=this.getData(),n=[];return e.eachActiveState(i,function(e,o){t===e&&n.push(i.getRawIndex(o))}),n},defaultOption:{zlevel:0,z:2,coordinateSystem:"parallel",parallelIndex:0,label:{show:!1},inactiveOpacity:.05,activeOpacity:1,lineStyle:{width:1,opacity:.45,type:"solid"},emphasis:{label:{show:!1}},progressive:!1,smooth:!1,animationEasing:"linear"}});cr.extend({type:"parallel",init:function(){this._dataGroup=new S_,this.group.add(this._dataGroup),this._data},render:function(t,e,i,n){this._renderForNormal(t,n)},dispose:function(){},_renderForNormal:function(t,e){var i=this._dataGroup,n=t.getData(),o=this._data,a=t.coordinateSystem,r=a.dimensions,s=t.option.smooth?.3:null;if(n.diff(o).add(function(t){df(n,i,t,r,a)}).update(function(i,s){var l=o.getItemGraphicEl(s),h=cf(n,i,r,a);n.setItemGraphicEl(i,l),co(l,{shape:{points:h}},e&&!1===e.animation?null:t,i)}).remove(function(t){var e=o.getItemGraphicEl(t);i.remove(e)}).execute(),ff(n,s),!this._data){var l=uf(a,t,function(){setTimeout(function(){i.removeClipPath()})});i.setClipPath(l)}this._data=n},remove:function(){this._dataGroup&&this._dataGroup.removeAll(),this._data=null}});var wC=["lineStyle","normal","opacity"];ds(function(t){t.eachSeriesByType("parallel",function(e){var i=e.getModel("itemStyle"),n=e.getModel("lineStyle"),o=t.get("color"),a=n.get("color")||i.get("color")||o[e.seriesIndex%o.length],r=e.get("inactiveOpacity"),s=e.get("activeOpacity"),l=e.getModel("lineStyle").getLineStyle(),h=e.coordinateSystem,u=e.getData(),c={normal:l.opacity,active:s,inactive:r};h.eachActiveState(u,function(t,e){var i=u.getItemModel(e),n=c[t];if("normal"===t){var o=i.get(wC,!0);null!=o&&(n=o)}u.setItemVisual(e,"opacity",n)}),u.setVisual("color",a)})});var bC=uM.extend({type:"series.sankey",layoutInfo:null,getInitialData:function(t){var e=t.edges||t.links,i=t.data||t.nodes;if(i&&e)return bD(i,e,this,!0).data},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},formatTooltip:function(t,e,i){if("edge"===i){var n=this.getDataParams(t,i),o=n.data,a=o.source+" -- "+o.target;return n.value&&(a+=" : "+n.value),Ho(a)}return bC.superCall(this,"formatTooltip",t,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",layout:null,left:"5%",top:"5%",right:"20%",bottom:"5%",nodeWidth:20,nodeGap:8,layoutIterations:32,label:{show:!0,position:"right",color:"#000",fontSize:12},itemStyle:{borderWidth:1,borderColor:"#333"},lineStyle:{color:"#314656",opacity:.2,curveness:.5},emphasis:{label:{show:!0},lineStyle:{opacity:.6}},animationEasing:"linear",animationDuration:1e3}}),SC=Nn({shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,cpx2:0,cpy2:0,extent:0},buildPath:function(t,e){var i=e.extent/2;t.moveTo(e.x1,e.y1-i),t.bezierCurveTo(e.cpx1,e.cpy1-i,e.cpx2,e.cpy2-i,e.x2,e.y2-i),t.lineTo(e.x2,e.y2+i),t.bezierCurveTo(e.cpx2,e.cpy2+i,e.cpx1,e.cpy1+i,e.x1,e.y1+i),t.closePath()}});ys({type:"sankey",_model:null,render:function(t,e,i){var n=t.getGraph(),o=this.group,a=t.layoutInfo,r=t.getData(),s=t.getData("edge");this._model=t,o.removeAll(),o.attr("position",[a.x,a.y]),n.eachEdge(function(e){var i=new SC;i.dataIndex=e.dataIndex,i.seriesIndex=t.seriesIndex,i.dataType="edge";var n=e.getModel("lineStyle"),a=n.get("curveness"),r=e.node1.getLayout(),l=e.node2.getLayout(),h=e.getLayout();i.shape.extent=Math.max(1,h.dy);var u=r.x+r.dx,c=r.y+h.sy+h.dy/2,d=l.x,f=l.y+h.ty+h.dy/2,p=u*(1-a)+d*a,g=c,m=u*a+d*(1-a),v=f;switch(i.setShape({x1:u,y1:c,x2:d,y2:f,cpx1:p,cpy1:g,cpx2:m,cpy2:v}),i.setStyle(n.getItemStyle()),i.style.fill){case"source":i.style.fill=e.node1.getVisual("color");break;case"target":i.style.fill=e.node2.getVisual("color")}to(i,e.getModel("emphasis.lineStyle").getItemStyle()),o.add(i),s.setItemGraphicEl(e.dataIndex,i)}),n.eachNode(function(e){var i=e.getLayout(),n=e.getModel(),a=n.getModel("label"),s=n.getModel("emphasis.label"),l=new Vb({shape:{x:i.x,y:i.y,width:e.getLayout().dx,height:e.getLayout().dy},style:n.getModel("itemStyle").getItemStyle()}),h=e.getModel("emphasis.itemStyle").getItemStyle();eo(l.style,h,a,s,{labelFetcher:t,labelDataIndex:e.dataIndex,defaultText:e.id,isRectText:!0}),l.setStyle("fill",e.getVisual("color")),to(l,h),o.add(l),r.setItemGraphicEl(e.dataIndex,l),l.dataType="node"}),!this._data&&t.get("animation")&&o.setClipPath(gf(o.getBoundingRect(),t,function(){o.removeClipPath()})),this._data=t.getData()},dispose:function(){}});cs(function(t,e,i){t.eachSeriesByType("sankey",function(t){var i=t.get("nodeWidth"),n=t.get("nodeGap"),o=vf(t,e);t.layoutInfo=o;var a=o.width,r=o.height,s=t.getGraph(),l=s.nodes,h=s.edges;xf(l),yf(l,h,i,n,a,r,0!==g(l,function(t){return 0===t.getLayout().value}).length?0:t.get("layoutIterations"))})}),ds(function(t,e){t.eachSeriesByType("sankey",function(t){var e=t.getGraph().nodes;e.sort(function(t,e){return t.getLayout().value-e.getLayout().value});var i=e[0].getLayout().value,n=e[e.length-1].getLayout().value;d(e,function(e){var o=new oD({type:"color",mappingMethod:"linear",dataExtent:[i,n],visual:t.get("color")}).mapValueToVisual(e.getLayout().value);e.setVisual("color",o);var a=e.getModel().get("itemStyle.color");null!=a&&e.setVisual("color",a)})})});var MC=Mn.extend({type:"whiskerInBox",shape:{},buildPath:function(t,e){for(var i in e)if(e.hasOwnProperty(i)&&0===i.indexOf("ends")){var n=e[i];t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1])}}}),IC=Bf.prototype;IC._createContent=function(t,e,i){var n=t.getItemLayout(e),o="horizontal"===n.chartLayout?1:0,a=0;this.add(new Rb({shape:{points:i?Vf(n.bodyEnds,o,n):n.bodyEnds},style:{strokeNoScale:!0},z2:100})),this.bodyIndex=a++;var r=f(n.whiskerEnds,function(t){return i?Vf(t,o,n):t});this.add(new MC({shape:Gf(r),style:{strokeNoScale:!0},z2:100})),this.whiskerIndex=a++},IC.updateData=function(t,e,i){var n=this._seriesModel=t.hostModel,o=t.getItemLayout(e),a=tS[i?"initProps":"updateProps"];a(this.childAt(this.bodyIndex),{shape:{points:o.bodyEnds}},n,e),a(this.childAt(this.whiskerIndex),{shape:Gf(o.whiskerEnds)},n,e),this.styleUpdater.call(null,this,t,e)},h(Bf,S_);var TC=Wf.prototype;TC.updateData=function(t){var e=this.group,i=this._data,n=this.styleUpdater;t.diff(i).add(function(i){if(t.hasValue(i)){var o=new Bf(t,i,n,!0);t.setItemGraphicEl(i,o),e.add(o)}}).update(function(o,a){var r=i.getItemGraphicEl(a);t.hasValue(o)?(r?r.updateData(t,o):r=new Bf(t,o,n),e.add(r),t.setItemGraphicEl(o,r)):e.remove(r)}).remove(function(t){var n=i.getItemGraphicEl(t);n&&e.remove(n)}).execute(),this._data=t},TC.remove=function(){var t=this.group,e=this._data;this._data=null,e&&e.eachItemGraphicEl(function(e){e&&t.remove(e)})};var AC={_baseAxisDim:null,getInitialData:function(t,e){var i,n,o=e.getComponent("xAxis",this.get("xAxisIndex")),a=e.getComponent("yAxis",this.get("yAxisIndex")),r=o.get("type"),s=a.get("type");"category"===r?(t.layout="horizontal",i=o.getOrdinalMeta(),n=!0):"category"===s?(t.layout="vertical",i=a.getOrdinalMeta(),n=!0):t.layout=t.layout||"horizontal";var l=["x","y"],h="horizontal"===t.layout?0:1,u=this._baseAxisDim=l[h],c=l[1-h],f=[o,a],p=f[h].get("type"),g=f[1-h].get("type"),m=t.data;if(m&&n){var v=[];d(m,function(t,e){var i;t.value&&y(t.value)?(i=t.value.slice(),t.value.unshift(e)):y(t)?(i=t.slice(),t.unshift(e)):i=t,v.push(i)}),t.data=v}var x=this.defaultValueDimensions;return rA(this,{coordDimensions:[{name:u,type:Ms(p),ordinalMeta:i,otherDims:{tooltip:!1,itemName:0},dimsDef:["base"]},{name:c,type:Ms(g),dimsDef:x.slice()}],dimensionsCount:x.length+1})},getBaseAxis:function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis}},DC={init:function(){var t=this._whiskerBoxDraw=new Wf(this.getStyleUpdater());this.group.add(t.group)},render:function(t,e,i){this._whiskerBoxDraw.updateData(t.getData())},remove:function(t){this._whiskerBoxDraw.remove()}};u(uM.extend({type:"series.boxplot",dependencies:["xAxis","yAxis","grid"],defaultValueDimensions:["min","Q1","median","Q3","max"],dimensions:null,defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,layout:null,boxWidth:[7,50],itemStyle:{color:"#fff",borderWidth:1},emphasis:{itemStyle:{borderWidth:2,shadowBlur:5,shadowOffsetX:2,shadowOffsetY:2,shadowColor:"rgba(0,0,0,0.4)"}},animationEasing:"elasticOut",animationDuration:800}}),AC,!0),u(cr.extend({type:"boxplot",getStyleUpdater:function(){return Ff},dispose:B}),DC,!0);var CC=["itemStyle"],LC=["emphasis","itemStyle"],kC=["itemStyle","borderColor"],PC=d;ds(function(t,e){var i=t.get("color");t.eachRawSeriesByType("boxplot",function(e){var n=i[e.seriesIndex%i.length],o=e.getData();o.setVisual({legendSymbol:"roundRect",color:e.get(kC)||n}),t.isSeriesFiltered(e)||o.each(function(t){var e=o.getItemModel(t);o.setItemVisual(t,{color:e.get(kC,!0)})})})}),cs(function(t){var e=Hf(t);PC(e,function(t){var e=t.seriesModels;e.length&&(Zf(t),PC(e,function(e,i){Uf(e,t.boxOffsetList[i],t.boxWidthList[i])}))})}),u(uM.extend({type:"series.candlestick",dependencies:["xAxis","yAxis","grid"],defaultValueDimensions:["open","close","lowest","highest"],dimensions:null,defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,layout:null,itemStyle:{color:"#c23531",color0:"#314656",borderWidth:1,borderColor:"#c23531",borderColor0:"#314656"},emphasis:{itemStyle:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,animationUpdate:!1,animationEasing:"linear",animationDuration:300},getShadowDim:function(){return"open"},brushSelector:function(t,e,i){var n=e.getItemLayout(t);return i.rect(n.brushRect)}}),AC,!0),u(cr.extend({type:"candlestick",getStyleUpdater:function(){return jf},dispose:B}),DC,!0);var OC=["itemStyle"],NC=["emphasis","itemStyle"],EC=["itemStyle","borderColor"],zC=["itemStyle","borderColor0"],RC=["itemStyle","color"],BC=["itemStyle","color0"],VC=A;ss(function(t){t&&y(t.series)&&d(t.series,function(t){w(t)&&"k"===t.type&&(t.type="candlestick")})}),ds(function(t,e){t.eachRawSeriesByType("candlestick",function(e){var i=e.getData();i.setVisual({legendSymbol:"roundRect"}),t.isSeriesFiltered(e)||i.each(function(t){var e=i.getItemModel(t),n=i.getItemLayout(t).sign;i.setItemVisual(t,{color:e.get(n>0?RC:BC),borderColor:e.get(n>0?EC:zC)})})})}),cs(function(t){t.eachSeriesByType("candlestick",function(t){var e,i=t.coordinateSystem,n=t.getData(),o=Xf(t,n),a=t.get("layout"),r="horizontal"===a?0:1,s=1-r,l=["x","y"],h=[];if(d(n.dimensions,function(t){var i=n.getDimensionInfo(t).coordDim;i===l[s]?h.push(t):i===l[r]&&(e=t)}),!(null==e||h.length<4)){var u=0;n.each([e].concat(h),function(){function t(t){var e=[];return e[r]=d,e[s]=t,isNaN(d)||isNaN(t)?[NaN,NaN]:i.dataToPoint(e)}function e(t,e){var i=t.slice(),n=t.slice();i[r]=Wn(i[r]+o/2,1,!1),n[r]=Wn(n[r]-o/2,1,!0),e?M.push(i,n):M.push(n,i)}function l(t){return t[r]=Wn(t[r],1),t}var c=arguments,d=c[0],f=c[h.length+1],p=c[1],g=c[2],m=c[3],v=c[4],y=Math.min(p,g),x=Math.max(p,g),_=t(y),w=t(x),b=t(m),S=[[l(t(v)),l(w)],[l(b),l(_)]],M=[];e(w,0),e(_,1);var I;I=p>g?-1:p<g?1:u>0?n.getItemModel(u-1).get()[2]<=g?1:-1:1,n.setItemLayout(f,{chartLayout:a,sign:I,initBaseline:p>g?w[s]:_[s],bodyEnds:M,whiskerEnds:S,brushRect:function(){var e=t(Math.min(p,g,m,v)),i=t(Math.max(p,g,m,v));return e[r]-=o/2,i[r]-=o/2,{x:e[0],y:e[1],width:s?o:i[0]-e[0],height:s?i[1]-e[1]:o}}()}),++u},!0)}})}),uM.extend({type:"series.effectScatter",dependencies:["grid","polar"],getInitialData:function(t,e){return Bs(this.getSource(),this)},brushSelector:"point",defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,effectType:"ripple",progressive:0,showEffectOn:"render",rippleEffect:{period:4,scale:2.5,brushType:"fill"},symbolSize:10}});var GC=$f.prototype;GC.stopEffectAnimation=function(){this.childAt(1).removeAll()},GC.startEffectAnimation=function(t){for(var e=t.symbolType,i=t.color,n=this.childAt(1),o=0;o<3;o++){var a=dl(e,-1,-1,2,2,i);a.attr({style:{strokeNoScale:!0},z2:99,silent:!0,scale:[.5,.5]});var r=-o/3*t.period+t.effectOffset;a.animate("",!0).when(t.period,{scale:[t.rippleScale/2,t.rippleScale/2]}).delay(r).start(),a.animateStyle(!0).when(t.period,{opacity:0}).delay(r).start(),n.add(a)}qf(n,t)},GC.updateEffectAnimation=function(t){for(var e=this._effectCfg,i=this.childAt(1),n=["symbolType","period","rippleScale"],o=0;o<n.length;o++){var a=n[o];if(e[a]!==t[a])return this.stopEffectAnimation(),void this.startEffectAnimation(t)}qf(i,t)},GC.highlight=function(){this.trigger("emphasis")},GC.downplay=function(){this.trigger("normal")},GC.updateData=function(t,e){var i=t.hostModel;this.childAt(0).updateData(t,e);var n=this.childAt(1),o=t.getItemModel(e),a=t.getItemVisual(e,"symbol"),r=Yf(t.getItemVisual(e,"symbolSize")),s=t.getItemVisual(e,"color");n.attr("scale",r),n.traverse(function(t){t.attr({fill:s})});var l=o.getShallow("symbolOffset");if(l){var h=n.position;h[0]=To(l[0],r[0]),h[1]=To(l[1],r[1])}n.rotation=(o.getShallow("symbolRotate")||0)*Math.PI/180||0;var u={};if(u.showEffectOn=i.get("showEffectOn"),u.rippleScale=o.get("rippleEffect.scale"),u.brushType=o.get("rippleEffect.brushType"),u.period=1e3*o.get("rippleEffect.period"),u.effectOffset=e/t.count(),u.z=o.getShallow("z")||0,u.zlevel=o.getShallow("zlevel")||0,u.symbolType=a,u.color=s,this.off("mouseover").off("mouseout").off("emphasis").off("normal"),"render"===u.showEffectOn)this._effectCfg?this.updateEffectAnimation(u):this.startEffectAnimation(u),this._effectCfg=u;else{this._effectCfg=null,this.stopEffectAnimation();var c=this.childAt(0),d=function(){c.highlight(),"render"!==u.showEffectOn&&this.startEffectAnimation(u)},f=function(){c.downplay(),"render"!==u.showEffectOn&&this.stopEffectAnimation()};this.on("mouseover",d,this).on("mouseout",f,this).on("emphasis",d,this).on("normal",f,this)}this._effectCfg=u},GC.fadeOut=function(t){this.off("mouseover").off("mouseout").off("emphasis").off("normal"),t&&t()},h($f,S_),ys({type:"effectScatter",init:function(){this._symbolDraw=new Ml($f)},render:function(t,e,i){var n=t.getData(),o=this._symbolDraw;o.updateData(n),this.group.add(o.group)},updateTransform:function(t,e,i){var n=t.getData();this.group.dirty();var o=ST().reset(t);o.progress&&o.progress({start:0,end:n.count()},n),this._symbolDraw.updateLayout(n)},_updateGroupTransform:function(t){var e=t.coordinateSystem;e&&e.getRoamTransform&&(this.group.transform=gt(e.getRoamTransform()),this.group.decomposeTransform())},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e)},dispose:function(){}}),ds(bT("effectScatter","circle")),cs(ST("effectScatter"));var WC="undefined"==typeof window?global:window,FC=WC.Uint32Array||Array,HC=WC.Float64Array||Array,ZC=uM.extend({type:"series.lines",dependencies:["grid","polar"],visualColorAccessPath:"lineStyle.color",init:function(t){Kf(t);var e=this._processFlatCoordsArray(t.data);this._flatCoords=e.flatCoords,this._flatCoordsOffset=e.flatCoordsOffset,e.flatCoords&&(t.data=new Float32Array(e.count)),ZC.superApply(this,"init",arguments)},mergeOption:function(t){if(Kf(t),t.data){var e=this._processFlatCoordsArray(t.data);this._flatCoords=e.flatCoords,this._flatCoordsOffset=e.flatCoordsOffset,e.flatCoords&&(t.data=new Float32Array(e.count))}ZC.superApply(this,"mergeOption",arguments)},appendData:function(t){var e=this._processFlatCoordsArray(t.data);e.flatCoords&&(this._flatCoords?(this._flatCoords=R(this._flatCoords,e.flatCoords),this._flatCoordsOffset=R(this._flatCoordsOffset,e.flatCoordsOffset)):(this._flatCoords=e.flatCoords,this._flatCoordsOffset=e.flatCoordsOffset),t.data=new Float32Array(e.count)),this.getRawData().appendData(t.data)},_getCoordsFromItemModel:function(t){var e=this.getData().getItemModel(t);return e.option instanceof Array?e.option:e.getShallow("coords")},getLineCoordsCount:function(t){return this._flatCoordsOffset?this._flatCoordsOffset[2*t+1]:this._getCoordsFromItemModel(t).length},getLineCoords:function(t,e){if(this._flatCoordsOffset){for(var i=this._flatCoordsOffset[2*t],n=this._flatCoordsOffset[2*t+1],o=0;o<n;o++)e[o]=e[o]||[],e[o][0]=this._flatCoords[i+2*o],e[o][1]=this._flatCoords[i+2*o+1];return n}for(var a=this._getCoordsFromItemModel(t),o=0;o<a.length;o++)e[o]=e[o]||[],e[o][0]=a[o][0],e[o][1]=a[o][1];return a.length},_processFlatCoordsArray:function(t){var e=0;if(this._flatCoords&&(e=this._flatCoords.length),"number"==typeof t[0]){for(var i=t.length,n=new FC(i),o=new HC(i),a=0,r=0,s=0,l=0;l<i;){s++;var h=t[l++];n[r++]=a+e,n[r++]=h;for(var u=0;u<h;u++){var c=t[l++],d=t[l++];o[a++]=c,o[a++]=d}}return{flatCoordsOffset:new Uint32Array(n.buffer,0,r),flatCoords:o,count:s}}return{flatCoordsOffset:null,flatCoords:null,count:t.length}},getInitialData:function(t,e){var i=new yI(["value"],this);return i.hasItemOption=!1,i.initData(t.data,[],function(t,e,n,o){if(t instanceof Array)return NaN;i.hasItemOption=!0;var a=t.value;return null!=a?a instanceof Array?a[o]:a:void 0}),i},formatTooltip:function(t){var e=this.getData().getItemModel(t),i=e.get("name");if(i)return i;var n=e.get("fromName"),o=e.get("toName"),a=[];return null!=n&&a.push(n),null!=o&&a.push(o),Ho(a.join(" > "))},preventIncremental:function(){return!!this.get("effect.show")},getProgressive:function(){var t=this.option.progressive;return null==t?this.option.large?1e4:this.get("progressive"):t},getProgressiveThreshold:function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?2e4:this.get("progressiveThreshold"):t},defaultOption:{coordinateSystem:"geo",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,incremental:!1,incrementalThreshold:3e3,polyline:!1,label:{show:!1,position:"end"},lineStyle:{opacity:.5}}}),UC=Jf.prototype;UC.createLine=function(t,e,i){return new Wc(t,e,i)},UC._updateEffectSymbol=function(t,e){var i=t.getItemModel(e).getModel("effect"),n=i.get("symbolSize"),o=i.get("symbol");y(n)||(n=[n,n]);var a=i.get("color")||t.getItemVisual(e,"color"),r=this.childAt(1);this._symbolType!==o&&(this.remove(r),(r=dl(o,-.5,-.5,1,1,a)).z2=100,r.culling=!0,this.add(r)),r&&(r.setStyle("shadowColor",a),r.setStyle(i.getItemStyle(["color"])),r.attr("scale",n),r.setColor(a),r.attr("scale",n),this._symbolType=o,this._updateEffectAnimation(t,i,e))},UC._updateEffectAnimation=function(t,e,i){var n=this.childAt(1);if(n){var o=this,a=t.getItemLayout(i),r=1e3*e.get("period"),s=e.get("loop"),l=e.get("constantSpeed"),h=T(e.get("delay"),function(e){return e/t.count()*r/3}),u="function"==typeof h;if(n.ignore=!0,this.updateAnimationPoints(n,a),l>0&&(r=this.getLineLength(n)/l*1e3),r!==this._period||s!==this._loop){n.stopAnimation();var c=h;u&&(c=h(i)),n.__t>0&&(c=-r*n.__t),n.__t=0;var d=n.animate("",s).when(r,{__t:1}).delay(c).during(function(){o.updateSymbolPosition(n)});s||d.done(function(){o.remove(n)}),d.start()}this._period=r,this._loop=s}},UC.getLineLength=function(t){return Vx(t.__p1,t.__cp1)+Vx(t.__cp1,t.__p2)},UC.updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},UC.updateData=function(t,e,i){this.childAt(0).updateData(t,e,i),this._updateEffectSymbol(t,e)},UC.updateSymbolPosition=function(t){var e=t.__p1,i=t.__p2,n=t.__cp1,o=t.__t,a=t.position,r=Ji,s=Qi;a[0]=r(e[0],n[0],i[0],o),a[1]=r(e[1],n[1],i[1],o);var l=s(e[0],n[0],i[0],o),h=s(e[1],n[1],i[1],o);t.rotation=-Math.atan2(h,l)-Math.PI/2,t.ignore=!1},UC.updateLayout=function(t,e){this.childAt(0).updateLayout(t,e);var i=t.getItemModel(e).getModel("effect");this._updateEffectAnimation(t,i,e)},h(Jf,S_);var jC=Qf.prototype;jC._createPolyline=function(t,e,i){var n=t.getItemLayout(e),o=new Bb({shape:{points:n}});this.add(o),this._updateCommonStl(t,e,i)},jC.updateData=function(t,e,i){var n=t.hostModel;co(this.childAt(0),{shape:{points:t.getItemLayout(e)}},n,e),this._updateCommonStl(t,e,i)},jC._updateCommonStl=function(t,e,i){var n=this.childAt(0),o=t.getItemModel(e),a=t.getItemVisual(e,"color"),s=i&&i.lineStyle,l=i&&i.hoverLineStyle;i&&!t.hasItemOption||(s=o.getModel("lineStyle").getLineStyle(),l=o.getModel("emphasis.lineStyle").getLineStyle()),n.useStyle(r({strokeNoScale:!0,fill:"none",stroke:a},s)),n.hoverStyle=l,to(this)},jC.updateLayout=function(t,e){this.childAt(0).setShape("points",t.getItemLayout(e))},h(Qf,S_);var XC=tp.prototype;XC.createLine=function(t,e,i){return new Qf(t,e,i)},XC.updateAnimationPoints=function(t,e){this._points=e;for(var i=[0],n=0,o=1;o<e.length;o++){var a=e[o-1],r=e[o];n+=Vx(a,r),i.push(n)}if(0!==n){for(o=0;o<i.length;o++)i[o]/=n;this._offsets=i,this._length=n}},XC.getLineLength=function(t){return this._length},XC.updateSymbolPosition=function(t){var e=t.__t,i=this._points,n=this._offsets,o=i.length;if(n){var a=this._lastFrame;if(e<this._lastFramePercent){for(r=Math.min(a+1,o-1);r>=0&&!(n[r]<=e);r--);r=Math.min(r,o-2)}else{for(var r=a;r<o&&!(n[r]>e);r++);r=Math.min(r-1,o-2)}J(t.position,i[r],i[r+1],(e-n[r])/(n[r+1]-n[r]));var s=i[r+1][0]-i[r][0],l=i[r+1][1]-i[r][1];t.rotation=-Math.atan2(l,s)-Math.PI/2,this._lastFrame=r,this._lastFramePercent=e,t.ignore=!1}},h(tp,Jf);var YC=Nn({shape:{polyline:!1,curveness:0,segs:[]},buildPath:function(t,e){var i=e.segs,n=e.curveness;if(e.polyline)for(r=0;r<i.length;){var o=i[r++];if(o>0){t.moveTo(i[r++],i[r++]);for(var a=1;a<o;a++)t.lineTo(i[r++],i[r++])}}else for(var r=0;r<i.length;){var s=i[r++],l=i[r++],h=i[r++],u=i[r++];if(t.moveTo(s,l),n>0){var c=(s+h)/2-(l-u)*n,d=(l+u)/2-(h-s)*n;t.quadraticCurveTo(c,d,h,u)}else t.lineTo(h,u)}},findDataIndex:function(t,e){var i=this.shape,n=i.segs,o=i.curveness;if(i.polyline)for(var a=0,r=0;r<n.length;){var s=n[r++];if(s>0)for(var l=n[r++],h=n[r++],u=1;u<s;u++)if(un(l,h,c=n[r++],d=n[r++]))return a;a++}else for(var a=0,r=0;r<n.length;){var l=n[r++],h=n[r++],c=n[r++],d=n[r++];if(o>0){if(dn(l,h,(l+c)/2-(h-d)*o,(h+d)/2-(c-l)*o,c,d))return a}else if(un(l,h,c,d))return a;a++}return-1}}),qC=ep.prototype;qC.isPersistent=function(){return!this._incremental},qC.updateData=function(t){this.group.removeAll();var e=new YC({rectHover:!0,cursor:"default"});e.setShape({segs:t.getLayout("linesPoints")}),this._setCommon(e,t),this.group.add(e),this._incremental=null},qC.incrementalPrepareUpdate=function(t){this.group.removeAll(),this._clearIncremental(),t.count()>5e5?(this._incremental||(this._incremental=new On({silent:!0})),this.group.add(this._incremental)):this._incremental=null},qC.incrementalUpdate=function(t,e){var i=new YC;i.setShape({segs:e.getLayout("linesPoints")}),this._setCommon(i,e,!!this._incremental),this._incremental?this._incremental.addDisplayable(i,!0):(i.rectHover=!0,i.cursor="default",i.__startIndex=t.start,this.group.add(i))},qC.remove=function(){this._clearIncremental(),this._incremental=null,this.group.removeAll()},qC._setCommon=function(t,e,i){var n=e.hostModel;t.setShape({polyline:n.get("polyline"),curveness:n.get("lineStyle.curveness")}),t.useStyle(n.getModel("lineStyle").getLineStyle()),t.style.strokeNoScale=!0;var o=e.getVisual("color");o&&t.setStyle("stroke",o),t.setStyle("fill"),i||(t.seriesIndex=n.seriesIndex,t.on("mousemove",function(e){t.dataIndex=null;var i=t.findDataIndex(e.offsetX,e.offsetY);i>0&&(t.dataIndex=i+t.__startIndex)}))},qC._clearIncremental=function(){var t=this._incremental;t&&t.clearDisplaybles()};var $C={seriesType:"lines",plan:fM(),reset:function(t){var e=t.coordinateSystem,i=t.get("polyline"),n=t.pipelineContext.large;return{progress:function(o,a){var r=[];if(n){var s,l=o.end-o.start;if(i){for(var h=0,u=o.start;u<o.end;u++)h+=t.getLineCoordsCount(u);s=new Float32Array(l+2*h)}else s=new Float32Array(2*l);for(var c=0,d=[],u=o.start;u<o.end;u++){g=t.getLineCoords(u,r),i&&(s[c++]=g);for(var f=0;f<g;f++)d=e.dataToPoint(r[f],!1,d),s[c++]=d[0],s[c++]=d[1]}a.setLayout("linesPoints",s)}else for(u=o.start;u<o.end;u++){var p=a.getItemModel(u),g=t.getLineCoords(u,r),m=[];if(i)for(var v=0;v<g;v++)m.push(e.dataToPoint(r[v]));else{m[0]=e.dataToPoint(r[0]),m[1]=e.dataToPoint(r[1]);var y=p.get("lineStyle.curveness");+y&&(m[2]=[(m[0][0]+m[1][0])/2-(m[0][1]-m[1][1])*y,(m[0][1]+m[1][1])/2-(m[1][0]-m[0][0])*y])}a.setItemLayout(u,m)}}}}};ys({type:"lines",init:function(){},render:function(t,e,i){var n=t.getData(),o=this._updateLineDraw(n,t),a=t.get("zlevel"),r=t.get("effect.trailLength"),s=i.getZr(),l="svg"===s.painter.getType();l||s.painter.getLayer(a).clear(!0),null==this._lastZlevel||l||s.configLayer(this._lastZlevel,{motionBlur:!1}),this._showEffect(t)&&r&&(l||s.configLayer(a,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(r/10+.9,1),0)})),o.updateData(n),this._lastZlevel=a,this._finished=!0},incrementalPrepareRender:function(t,e,i){var n=t.getData();this._updateLineDraw(n,t).incrementalPrepareUpdate(n),this._clearLayer(i),this._finished=!1},incrementalRender:function(t,e,i){this._lineDraw.incrementalUpdate(t,e.getData()),this._finished=t.end===e.getData().count()},updateTransform:function(t,e,i){var n=t.getData();if(!this._finished||t.pipelineContext.large)return{update:!0};var o=$C.reset(t);o.progress&&o.progress({start:0,end:n.count()},n),this._lineDraw.updateLayout(),this._clearLayer(i)},_updateLineDraw:function(t,e){var i=this._lineDraw,n=this._showEffect(e),o=!!e.get("polyline"),a=e.pipelineContext.large;return i&&n===this._hasEffet&&o===this._isPolyline&&a===this._isLargeDraw||(i&&i.remove(),i=this._lineDraw=a?new ep:new Fc(o?n?tp:Qf:n?Jf:Wc),this._hasEffet=n,this._isPolyline=o,this._isLargeDraw=a,this.group.removeAll()),this.group.add(i.group),i},_showEffect:function(t){return!!t.get("effect.show")},_clearLayer:function(t){var e=t.getZr();"svg"===e.painter.getType()||null==this._lastZlevel||e.painter.getLayer(this._lastZlevel).clear(!0)},remove:function(t,e){this._lineDraw&&this._lineDraw.remove(),this._lineDraw=null,this._clearLayer(e)},dispose:function(){}});var KC="lineStyle.opacity".split("."),JC={seriesType:"lines",reset:function(t,e,i){var n=ip(t.get("symbol")),o=ip(t.get("symbolSize")),a=t.getData();return a.setVisual("fromSymbol",n&&n[0]),a.setVisual("toSymbol",n&&n[1]),a.setVisual("fromSymbolSize",o&&o[0]),a.setVisual("toSymbolSize",o&&o[1]),a.setVisual("opacity",t.get(KC)),{dataEach:a.hasItemOption?function(t,e){var i=t.getItemModel(e),n=ip(i.getShallow("symbol",!0)),o=ip(i.getShallow("symbolSize",!0)),a=i.get(KC);n[0]&&t.setItemVisual(e,"fromSymbol",n[0]),n[1]&&t.setItemVisual(e,"toSymbol",n[1]),o[0]&&t.setItemVisual(e,"fromSymbolSize",o[0]),o[1]&&t.setItemVisual(e,"toSymbolSize",o[1]),t.setItemVisual(e,"opacity",a)}:null}}};cs($C),ds(JC),uM.extend({type:"series.heatmap",getInitialData:function(t,e){return Bs(this.getSource(),this)},preventIncremental:function(){var t=Aa.get(this.get("coordinateSystem"));if(t&&t.dimensions)return"lng"===t.dimensions[0]&&"lat"===t.dimensions[1]},defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,geoIndex:0,blurSize:30,pointSize:20,maxOpacity:1,minOpacity:0}});np.prototype={update:function(t,e,i,n,o,a){var r=this._getBrush(),s=this._getGradient(t,o,"inRange"),l=this._getGradient(t,o,"outOfRange"),h=this.pointSize+this.blurSize,u=this.canvas,c=u.getContext("2d"),d=t.length;u.width=e,u.height=i;for(var f=0;f<d;++f){var p=t[f],g=p[0],m=p[1],v=n(p[2]);c.globalAlpha=v,c.drawImage(r,g-h,m-h)}if(!u.width||!u.height)return u;for(var y=c.getImageData(0,0,u.width,u.height),x=y.data,_=0,w=x.length,b=this.minOpacity,S=this.maxOpacity-b;_<w;){var v=x[_+3]/256,M=4*Math.floor(255*v);if(v>0){var I=a(v)?s:l;v>0&&(v=v*S+b),x[_++]=I[M],x[_++]=I[M+1],x[_++]=I[M+2],x[_++]=I[M+3]*v*256}else _+=4}return c.putImageData(y,0,0),u},_getBrush:function(){var t=this._brushCanvas||(this._brushCanvas=Px()),e=this.pointSize+this.blurSize,i=2*e;t.width=i,t.height=i;var n=t.getContext("2d");return n.clearRect(0,0,i,i),n.shadowOffsetX=i,n.shadowBlur=this.blurSize,n.shadowColor="#000",n.beginPath(),n.arc(-e,e,this.pointSize,0,2*Math.PI,!0),n.closePath(),n.fill(),t},_getGradient:function(t,e,i){for(var n=this._gradientPixels,o=n[i]||(n[i]=new Uint8ClampedArray(1024)),a=[0,0,0,0],r=0,s=0;s<256;s++)e[i](s/255,!0,a),o[r++]=a[0],o[r++]=a[1],o[r++]=a[2],o[r++]=a[3];return o}},ys({type:"heatmap",render:function(t,e,i){var n;e.eachComponent("visualMap",function(e){e.eachTargetSeries(function(i){i===t&&(n=e)})}),this.group.removeAll(),this._incrementalDisplayable=null;var o=t.coordinateSystem;"cartesian2d"===o.type||"calendar"===o.type?this._renderOnCartesianAndCalendar(t,i,0,t.getData().count()):rp(o)&&this._renderOnGeo(o,t,n,i)},incrementalPrepareRender:function(t,e,i){this.group.removeAll()},incrementalRender:function(t,e,i,n){e.coordinateSystem&&this._renderOnCartesianAndCalendar(e,n,t.start,t.end,!0)},_renderOnCartesianAndCalendar:function(t,e,i,n,o){var r,s,l=t.coordinateSystem;if("cartesian2d"===l.type){var h=l.getAxis("x"),u=l.getAxis("y");r=h.getBandWidth(),s=u.getBandWidth()}for(var c=this.group,d=t.getData(),f=t.getModel("itemStyle").getItemStyle(["color"]),p=t.getModel("emphasis.itemStyle").getItemStyle(),g=t.getModel("label"),m=t.getModel("emphasis.label"),v=l.type,y="cartesian2d"===v?[d.mapDimension("x"),d.mapDimension("y"),d.mapDimension("value")]:[d.mapDimension("time"),d.mapDimension("value")],x=i;x<n;x++){var _;if("cartesian2d"===v){if(isNaN(d.get(y[2],x)))continue;var w=l.dataToPoint([d.get(y[0],x),d.get(y[1],x)]);_=new Vb({shape:{x:w[0]-r/2,y:w[1]-s/2,width:r,height:s},style:{fill:d.getItemVisual(x,"color"),opacity:d.getItemVisual(x,"opacity")}})}else{if(isNaN(d.get(y[1],x)))continue;_=new Vb({z2:1,shape:l.dataToRect([d.get(y[0],x)]).contentShape,style:{fill:d.getItemVisual(x,"color"),opacity:d.getItemVisual(x,"opacity")}})}var b=d.getItemModel(x);d.hasItemOption&&(f=b.getModel("itemStyle").getItemStyle(["color"]),p=b.getModel("emphasis.itemStyle").getItemStyle(),g=b.getModel("label"),m=b.getModel("emphasis.label"));var S=t.getRawValue(x),M="-";S&&null!=S[2]&&(M=S[2]),eo(f,p,g,m,{labelFetcher:t,labelDataIndex:x,defaultText:M,isRectText:!0}),_.setStyle(f),to(_,d.hasItemOption?p:a({},p)),_.incremental=o,o&&(_.useHoverLayer=!0),c.add(_),d.setItemGraphicEl(x,_)}},_renderOnGeo:function(t,e,i,n){var o=i.targetVisuals.inRange,a=i.targetVisuals.outOfRange,r=e.getData(),s=this._hmLayer||this._hmLayer||new np;s.blurSize=e.get("blurSize"),s.pointSize=e.get("pointSize"),s.minOpacity=e.get("minOpacity"),s.maxOpacity=e.get("maxOpacity");var l=t.getViewRect().clone(),h=t.getRoamTransform();l.applyTransform(h);var u=Math.max(l.x,0),c=Math.max(l.y,0),d=Math.min(l.width+l.x,n.getWidth()),f=Math.min(l.height+l.y,n.getHeight()),p=d-u,g=f-c,m=[r.mapDimension("lng"),r.mapDimension("lat"),r.mapDimension("value")],v=r.mapArray(m,function(e,i,n){var o=t.dataToPoint([e,i]);return o[0]-=u,o[1]-=c,o.push(n),o}),y=i.getExtent(),x="visualMap.continuous"===i.type?ap(y,i.option.range):op(y,i.getPieceList(),i.option.selected);s.update(v,p,g,o.color.getNormalizer(),{inRange:o.color.getColorMapper(),outOfRange:a.color.getColorMapper()},x);var _=new Je({style:{width:p,height:g,x:u,y:c,image:s.canvas},silent:!0});this.group.add(_)},dispose:function(){}});var QC=tA.extend({type:"series.pictorialBar",dependencies:["grid"],defaultOption:{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",progressive:0,hoverAnimation:!1},getInitialData:function(t){return t.stack=null,QC.superApply(this,"getInitialData",arguments)}}),tL=["itemStyle","borderWidth"],eL=[{xy:"x",wh:"width",index:0,posDesc:["left","right"]},{xy:"y",wh:"height",index:1,posDesc:["top","bottom"]}],iL=new Lb;ys({type:"pictorialBar",render:function(t,e,i){var n=this.group,o=t.getData(),a=this._data,r=t.coordinateSystem,s=!!r.getBaseAxis().isHorizontal(),l=r.grid.getRect(),h={ecSize:{width:i.getWidth(),height:i.getHeight()},seriesModel:t,coordSys:r,coordSysExtent:[[l.x,l.x+l.width],[l.y,l.y+l.height]],isHorizontal:s,valueDim:eL[+s],categoryDim:eL[1-s]};return o.diff(a).add(function(t){if(o.hasValue(t)){var e=yp(o,t),i=sp(o,t,e,h),a=bp(o,h,i);o.setItemGraphicEl(t,a),n.add(a),Dp(a,h,i)}}).update(function(t,e){var i=a.getItemGraphicEl(e);if(o.hasValue(t)){var r=yp(o,t),s=sp(o,t,r,h),l=Ip(o,s);i&&l!==i.__pictorialShapeStr&&(n.remove(i),o.setItemGraphicEl(t,null),i=null),i?Sp(i,h,s):i=bp(o,h,s,!0),o.setItemGraphicEl(t,i),i.__pictorialSymbolMeta=s,n.add(i),Dp(i,h,s)}else n.remove(i)}).remove(function(t){var e=a.getItemGraphicEl(t);e&&Mp(a,t,e.__pictorialSymbolMeta.animationModel,e)}).execute(),this._data=o,this.group},dispose:B,remove:function(t,e){var i=this.group,n=this._data;t.get("animation")?n&&n.eachItemGraphicEl(function(e){Mp(n,e.dataIndex,t,e)}):i.removeAll()}});cs(v(il,"pictorialBar")),ds(bT("pictorialBar","roundRect"));var nL=function(t,e,i,n,o){nT.call(this,t,e,i),this.type=n||"value",this.position=o||"bottom",this.orient=null,this._labelInterval=null};nL.prototype={constructor:nL,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},pointToData:function(t,e){return this.coordinateSystem.pointToData(t,e)[0]},toGlobalCoord:null,toLocalCoord:null},h(nL,nT),Lp.prototype={type:"singleAxis",axisPointerEnabled:!0,constructor:Lp,_init:function(t,e,i){var n=this.dimension,o=new nL(n,sl(t),[0,0],t.get("type"),t.get("position")),a="category"===o.type;o.onBand=a&&t.get("boundaryGap"),o.inverse=t.get("inverse"),o.orient=t.get("orient"),t.axis=o,o.model=t,o.coordinateSystem=this,this._axis=o},update:function(t,e){t.eachSeries(function(t){if(t.coordinateSystem===this){var e=t.getData();d(e.mapDimension(this.dimension,!0),function(t){this._axis.scale.unionExtentFromData(e,t)},this),rl(this._axis.scale,this._axis.model)}},this)},resize:function(t,e){this._rect=Ko({left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")},{width:e.getWidth(),height:e.getHeight()}),this._adjustAxis()},getRect:function(){return this._rect},_adjustAxis:function(){var t=this._rect,e=this._axis,i=e.isHorizontal(),n=i?[0,t.width]:[0,t.height],o=e.reverse?1:0;e.setExtent(n[o],n[1-o]),this._updateAxisTransform(e,i?t.x:t.y)},_updateAxisTransform:function(t,e){var i=t.getExtent(),n=i[0]+i[1],o=t.isHorizontal();t.toGlobalCoord=o?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord=o?function(t){return t-e}:function(t){return n-t+e}},getAxis:function(){return this._axis},getBaseAxis:function(){return this._axis},getAxes:function(){return[this._axis]},getTooltipAxes:function(){return{baseAxes:[this.getAxis()]}},containPoint:function(t){var e=this.getRect(),i=this.getAxis();return"horizontal"===i.orient?i.contain(i.toLocalCoord(t[0]))&&t[1]>=e.y&&t[1]<=e.y+e.height:i.contain(i.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},pointToData:function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},dataToPoint:function(t){var e=this.getAxis(),i=this.getRect(),n=[],o="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),n[o]=e.toGlobalCoord(e.dataToCoord(+t)),n[1-o]=0===o?i.y+i.height/2:i.x+i.width/2,n}},Aa.register("single",{create:function(t,e){var i=[];return t.eachComponent("singleAxis",function(n,o){var a=new Lp(n,t,e);a.name="single_"+o,a.resize(n,e),n.coordinateSystem=a,i.push(a)}),t.eachSeries(function(e){if("singleAxis"===e.get("coordinateSystem")){var i=t.queryComponents({mainType:"singleAxis",index:e.get("singleAxisIndex"),id:e.get("singleAxisId")})[0];e.coordinateSystem=i&&i.coordinateSystem}}),i},dimensions:Lp.prototype.dimensions});var oL=GT.getInterval,aL=GT.ifIgnoreOnTick,rL=["axisLine","axisTickLabel","axisName"],sL=XT.extend({type:"singleAxis",axisPointerClass:"SingleAxisPointer",render:function(t,e,i,n){var o=this.group;o.removeAll();var a=kp(t),r=new GT(t,a);d(rL,r.add,r),o.add(r.getGroup()),t.get("splitLine.show")&&this._splitLine(t,a.labelInterval),sL.superCall(this,"render",t,e,i,n)},_splitLine:function(t,e){var i=t.axis;if(!i.scale.isBlank()){var n=t.getModel("splitLine"),o=n.getModel("lineStyle"),a=o.get("width"),r=o.get("color"),s=oL(n,e);r=r instanceof Array?r:[r];for(var l=t.coordinateSystem.getRect(),h=i.isHorizontal(),u=[],c=0,d=i.getTicksCoords(),f=[],p=[],g=t.get("axisLabel.showMinLabel"),m=t.get("axisLabel.showMaxLabel"),v=0;v<d.length;++v)if(!aL(i,v,s,d.length,g,m)){var y=i.toGlobalCoord(d[v]);h?(f[0]=y,f[1]=l.y,p[0]=y,p[1]=l.y+l.height):(f[0]=l.x,f[1]=y,p[0]=l.x+l.width,p[1]=y);var x=c++%r.length;u[x]=u[x]||[],u[x].push(new Gb(Vn({shape:{x1:f[0],y1:f[1],x2:p[0],y2:p[1]},style:{lineWidth:a},silent:!0})))}for(v=0;v<u.length;++v)this.group.add(Qb(u[v],{style:{stroke:r[v%r.length],lineDash:o.getLineDash(a),lineWidth:a},silent:!0}))}}}),lL=IS.extend({type:"singleAxis",layoutMode:"box",axis:null,coordinateSystem:null,getCoordSysModel:function(){return this}}),hL={left:"5%",top:"5%",right:"5%",bottom:"5%",type:"value",position:"bottom",orient:"horizontal",axisLine:{show:!0,lineStyle:{width:2,type:"solid"}},tooltip:{show:!0},axisTick:{show:!0,length:6,lineStyle:{width:2}},axisLabel:{show:!0,interval:"auto"},splitLine:{show:!0,lineStyle:{type:"dashed",opacity:.2}}};n(lL.prototype,ZI),kT("single",lL,function(t,e){return e.type||(e.data?"category":"value")},hL);var uL=function(t,e){var i,n=[],o=t.seriesIndex;if(null==o||!(i=e.getSeriesByIndex(o)))return{point:[]};var a=i.getData(),r=ki(a,t);if(null==r||r<0||y(r))return{point:[]};var s=a.getItemGraphicEl(r),l=i.coordinateSystem;if(i.getTooltipPosition)n=i.getTooltipPosition(r)||[];else if(l&&l.dataToPoint)n=l.dataToPoint(a.getValues(f(l.dimensions,function(t){return a.mapDimension(t)}),r,!0))||[];else if(s){var h=s.getBoundingRect().clone();h.applyTransform(s.transform),n=[h.x+h.width/2,h.y+h.height/2]}return{point:n,el:s}},cL=d,dL=v,fL=Pi(),pL=(gs({type:"axisPointer",coordSysAxesInfo:null,defaultOption:{show:"auto",triggerOn:null,zlevel:0,z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#aaa",width:1,type:"solid"},shadowStyle:{color:"rgba(150,150,150,0.3)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,shadowBlur:3,shadowColor:"#aaa"},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}}}),Pi()),gL=d,mL=ms({type:"axisPointer",render:function(t,e,i){var n=e.getComponent("tooltip"),o=t.get("triggerOn")||n&&n.get("triggerOn")||"mousemove|click";Fp("axisPointer",i,function(t,e,i){"none"!==o&&("leave"===t||o.indexOf(t)>=0)&&i({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})})},remove:function(t,e){Yp(e.getZr(),"axisPointer"),mL.superApply(this._model,"remove",arguments)},dispose:function(t,e){Yp("axisPointer",e),mL.superApply(this._model,"dispose",arguments)}}),vL=Pi(),yL=i,xL=m;(qp.prototype={_group:null,_lastGraphicKey:null,_handle:null,_dragging:!1,_lastValue:null,_lastStatus:null,_payloadInfo:null,animationThreshold:15,render:function(t,e,i,n){var o=e.get("value"),a=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=i,n||this._lastValue!==o||this._lastStatus!==a){this._lastValue=o,this._lastStatus=a;var r=this._group,s=this._handle;if(!a||"hide"===a)return r&&r.hide(),void(s&&s.hide());r&&r.show(),s&&s.show();var l={};this.makeElOption(l,o,t,e,i);var h=l.graphicKey;h!==this._lastGraphicKey&&this.clear(i),this._lastGraphicKey=h;var u=this._moveAnimation=this.determineAnimation(t,e);if(r){var c=v($p,e,u);this.updatePointerEl(r,l,c,e),this.updateLabelEl(r,l,c,e)}else r=this._group=new S_,this.createPointerEl(r,l,t,e),this.createLabelEl(r,l,t,e),i.getZr().add(r);tg(r,e,!0),this._renderHandle(o)}},remove:function(t){this.clear(t)},dispose:function(t){this.clear(t)},determineAnimation:function(t,e){var i=e.get("animation"),n=t.axis,o="category"===n.type,a=e.get("snap");if(!a&&!o)return!1;if("auto"===i||null==i){var r=this.animationThreshold;if(o&&n.getBandWidth()>r)return!0;if(a){var s=vh(t).seriesDataCount,l=n.getExtent();return Math.abs(l[0]-l[1])/s>r}return!1}return!0===i},makeElOption:function(t,e,i,n,o){},createPointerEl:function(t,e,i,n){var o=e.pointer;if(o){var a=vL(t).pointerEl=new tS[o.type](yL(e.pointer));t.add(a)}},createLabelEl:function(t,e,i,n){if(e.label){var o=vL(t).labelEl=new Vb(yL(e.label));t.add(o),Jp(o,n)}},updatePointerEl:function(t,e,i){var n=vL(t).pointerEl;n&&(n.setStyle(e.pointer.style),i(n,{shape:e.pointer.shape}))},updateLabelEl:function(t,e,i,n){var o=vL(t).labelEl;o&&(o.setStyle(e.label.style),i(o,{shape:e.label.shape,position:e.label.position}),Jp(o,n))},_renderHandle:function(t){if(!this._dragging&&this.updateHandleTransform){var e=this._axisPointerModel,i=this._api.getZr(),n=this._handle,o=e.getModel("handle"),a=e.get("status");if(!o.get("show")||!a||"hide"===a)return n&&i.remove(n),void(this._handle=null);var r;this._handle||(r=!0,n=this._handle=xo(o.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){Q_(t.event)},onmousedown:xL(this._onHandleDragMove,this,0,0),drift:xL(this._onHandleDragMove,this),ondragend:xL(this._onHandleDragEnd,this)}),i.add(n)),tg(n,e,!1);var s=["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];n.setStyle(o.getItemStyle(null,s));var l=o.get("size");y(l)||(l=[l,l]),n.attr("scale",[l[0]/2,l[1]/2]),yr(this,"_doDispatchAxisPointer",o.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,r)}},_moveHandleToValue:function(t,e){$p(this._axisPointerModel,!e&&this._moveAnimation,this._handle,Qp(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},_onHandleDragMove:function(t,e){var i=this._handle;if(i){this._dragging=!0;var n=this.updateHandleTransform(Qp(i),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=n,i.stopAnimation(),i.attr(Qp(n)),vL(i).lastProp=null,this._doDispatchAxisPointer()}},_doDispatchAxisPointer:function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},_onHandleDragEnd:function(t){if(this._dragging=!1,this._handle){var e=this._axisPointerModel.get("value");this._moveHandleToValue(e),this._api.dispatchAction({type:"hideTip"})}},getHandleTransform:null,updateHandleTransform:null,clear:function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),i=this._group,n=this._handle;e&&i&&(this._lastGraphicKey=null,i&&e.remove(i),n&&e.remove(n),this._group=null,this._handle=null,this._payloadInfo=null)},doClear:function(){},buildLabel:function(t,e,i){return i=i||0,{x:t[i],y:t[1-i],width:e[i],height:e[1-i]}}}).constructor=qp,Vi(qp);var _L=qp.extend({makeElOption:function(t,e,i,n,o){var a=i.axis,r=a.grid,s=n.get("type"),l=ug(r,a).getOtherAxis(a).getGlobalExtent(),h=a.toGlobalCoord(a.dataToCoord(e,!0));if(s&&"none"!==s){var u=eg(n),c=wL[s](a,h,l,u);c.style=u,t.graphicKey=c.type,t.pointer=c}rg(e,t,Sh(r.model,i),i,n,o)},getHandleTransform:function(t,e,i){var n=Sh(e.axis.grid.model,e,{labelInside:!1});return n.labelMargin=i.get("handle.margin"),{position:ag(e.axis,t,n),rotation:n.rotation+(n.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,i,n){var o=i.axis,a=o.grid,r=o.getGlobalExtent(!0),s=ug(a,o).getOtherAxis(o).getGlobalExtent(),l="x"===o.dim?0:1,h=t.position;h[l]+=e[l],h[l]=Math.min(r[1],h[l]),h[l]=Math.max(r[0],h[l]);var u=(s[1]+s[0])/2,c=[u,u];c[l]=h[l];var d=[{verticalAlign:"middle"},{align:"center"}];return{position:h,rotation:t.rotation,cursorPoint:c,tooltipOption:d[l]}}}),wL={line:function(t,e,i,n){var o=sg([e,i[0]],[e,i[1]],cg(t));return Vn({shape:o,style:n}),{type:"Line",shape:o}},shadow:function(t,e,i,n){var o=t.getBandWidth(),a=i[1]-i[0];return{type:"Rect",shape:lg([e-o/2,i[0]],[o,a],cg(t))}}};XT.registerAxisPointerClass("CartesianAxisPointer",_L),ss(function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!y(e)&&(t.axisPointer.link=[e])}}),ls(FM.PROCESSOR.STATISTIC,function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=uh(t,e)}),hs({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},function(t,e,i){var n=t.currTrigger,o=[t.x,t.y],a=t,r=t.dispatchAction||m(i.dispatchAction,i),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){Wp(o)&&(o=uL({seriesIndex:a.seriesIndex,dataIndex:a.dataIndex},e).point);var l=Wp(o),h=a.axesInfo,u=s.axesInfo,c="leave"===n||Wp(o),d={},f={},p={list:[],map:{}},g={showPointer:dL(Np,f),showTooltip:dL(Ep,p)};cL(s.coordSysMap,function(t,e){var i=l||t.containPoint(o);cL(s.coordSysAxesInfo[e],function(t,e){var n=t.axis,a=Vp(h,t);if(!c&&i&&(!h||a)){var r=a&&a.value;null!=r||l||(r=n.pointToData(o)),null!=r&&Pp(t,r,g,!1,d)}})});var v={};return cL(u,function(t,e){var i=t.linkGroup;i&&!f[e]&&cL(i.axesInfo,function(e,n){var o=f[n];if(e!==t&&o){var a=o.value;i.mapper&&(a=t.axis.scale.parse(i.mapper(a,Gp(e),Gp(t)))),v[t.key]=a}})}),cL(v,function(t,e){Pp(u[e],t,g,!0,d)}),zp(f,u,d),Rp(p,o,t,r),Bp(u,0,i),d}});var bL=["x","y"],SL=["width","height"],ML=qp.extend({makeElOption:function(t,e,i,n,o){var a=i.axis,r=a.coordinateSystem,s=fg(r,1-dg(a)),l=r.dataToPoint(e)[0],h=n.get("type");if(h&&"none"!==h){var u=eg(n),c=IL[h](a,l,s,u);c.style=u,t.graphicKey=c.type,t.pointer=c}rg(e,t,kp(i),i,n,o)},getHandleTransform:function(t,e,i){var n=kp(e,{labelInside:!1});return n.labelMargin=i.get("handle.margin"),{position:ag(e.axis,t,n),rotation:n.rotation+(n.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,i,n){var o=i.axis,a=o.coordinateSystem,r=dg(o),s=fg(a,r),l=t.position;l[r]+=e[r],l[r]=Math.min(s[1],l[r]),l[r]=Math.max(s[0],l[r]);var h=fg(a,1-r),u=(h[1]+h[0])/2,c=[u,u];return c[r]=l[r],{position:l,rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:"middle"}}}}),IL={line:function(t,e,i,n){var o=sg([e,i[0]],[e,i[1]],dg(t));return Vn({shape:o,style:n}),{type:"Line",shape:o}},shadow:function(t,e,i,n){var o=t.getBandWidth(),a=i[1]-i[0];return{type:"Rect",shape:lg([e-o/2,i[0]],[o,a],dg(t))}}};XT.registerAxisPointerClass("SingleAxisPointer",ML),ms({type:"single"});var TL=uM.extend({type:"series.themeRiver",dependencies:["singleAxis"],nameMap:null,init:function(t){TL.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()}},fixData:function(t){for(var e=t.length,i=f(mf().key(function(t){return t[2]}).entries(t),function(t){return{name:t.key,dataList:t.values}}),n=i.length,o=-1,a=-1,r=0;r<n;++r){var s=i[r].dataList.length;s>o&&(o=s,a=r)}for(var l=0;l<n;++l)if(l!==a)for(var h=i[l].name,u=0;u<o;++u){for(var c=i[a].dataList[u][0],d=i[l].dataList.length,p=-1,g=0;g<d;++g)if(i[l].dataList[g][0]===c){p=g;break}-1===p&&(t[e]=[],t[e][0]=c,t[e][1]=0,t[e][2]=h,e++)}return t},getInitialData:function(t,e){for(var i=e.queryComponents({mainType:"singleAxis",index:this.get("singleAxisIndex"),id:this.get("singleAxisId")})[0].get("type"),n=g(t.data,function(t){return void 0!==t[2]}),o=this.fixData(n||[]),a=[],r=this.nameMap=z(),s=0,l=0;l<o.length;++l)a.push(o[l][2]),r.get(o[l][2])||(r.set(o[l][2],s),s++);var h=wI(o,{coordDimensions:["single"],dimensionsDefine:[{name:"time",type:Ms(i)},{name:"value",type:"float"},{name:"name",type:"ordinal"}],encodeDefine:{single:0,value:1,itemName:2}}),u=new yI(h,this);return u.initData(o),u},getLayerSeries:function(){for(var t=this.getData(),e=t.count(),i=[],n=0;n<e;++n)i[n]=n;for(var o=f(mf().key(function(e){return t.get("name",e)}).entries(i),function(t){return{name:t.key,indices:t.values}}),a=t.mapDimension("single"),r=0;r<o.length;++r)o[r].indices.sort(function(e,i){return t.get(a,e)-t.get(a,i)});return o},getAxisTooltipData:function(t,e,i){y(t)||(t=t?[t]:[]);for(var n,o=this.getData(),a=this.getLayerSeries(),r=[],s=a.length,l=0;l<s;++l){for(var h=Number.MAX_VALUE,u=-1,c=a[l].indices.length,d=0;d<c;++d){var f=o.get(t[0],a[l].indices[d]),p=Math.abs(f-e);p<=h&&(n=f,h=p,u=a[l].indices[d])}r.push(u)}return{dataIndices:r,nestestValue:n}},formatTooltip:function(t){var e=this.getData(),i=e.getName(t),n=e.get(e.mapDimension("value"),t);return(isNaN(n)||null==n)&&(n="-"),Ho(i+" : "+n)},defaultOption:{zlevel:0,z:2,coordinateSystem:"singleAxis",boundaryGap:["10%","10%"],singleAxisIndex:0,animationEasing:"linear",label:{margin:4,textAlign:"right",show:!0,position:"left",color:"#000",fontSize:11},emphasis:{label:{show:!0}}}});ys({type:"themeRiver",init:function(){this._layers=[]},render:function(t,e,i){function n(t){return t.name}function o(e,i,n){var o=this._layers;if("remove"!==e){for(var h,u=[],c=[],f=l[i].indices,p=0;p<f.length;p++){var g=r.getItemLayout(f[p]),m=g.x,v=g.y0,y=g.y;u.push([m,v]),c.push([m,v+y]),h=r.getItemVisual(f[p],"color")}var x,_,w=r.getItemLayout(f[0]),b=r.getItemModel(f[p-1]),S=b.getModel("label"),M=S.get("margin");if("add"===e){I=d[i]=new S_;x=new wT({shape:{points:u,stackedOnPoints:c,smooth:.4,stackedOnSmooth:.4,smoothConstraint:!1},z2:0}),_=new Cb({style:{x:w.x-M,y:w.y0+w.y/2}}),I.add(x),I.add(_),s.add(I),x.setClipPath(pg(x.getBoundingRect(),t,function(){x.removeClipPath()}))}else{var I=o[n];x=I.childAt(0),_=I.childAt(1),s.add(I),d[i]=I,co(x,{shape:{points:u,stackedOnPoints:c}},t),co(_,{style:{x:w.x-M,y:w.y0+w.y/2}},t)}var T=b.getModel("emphasis.itemStyle"),A=b.getModel("itemStyle");io(_.style,S,{text:S.get("show")?t.getFormattedLabel(f[p-1],"normal")||r.getName(f[p-1]):null,textVerticalAlign:"middle"}),x.setStyle(a({fill:h},A.getItemStyle(["color"]))),to(x,T.getItemStyle())}else s.remove(o[i])}var r=t.getData(),s=this.group,l=t.getLayerSeries(),h=r.getLayout("layoutInfo"),u=h.rect,c=h.boundaryGap;s.attr("position",[0,u.y+c[0]]);var d={};new ws(this._layersSeries||[],l,n,n).add(m(o,this,"add")).update(m(o,this,"update")).remove(m(o,this,"remove")).execute(),this._layersSeries=l,this._layers=d},dispose:function(){}});cs(function(t,e){t.eachSeriesByType("themeRiver",function(t){var e=t.getData(),i=t.coordinateSystem,n={},o=i.getRect();n.rect=o;var a=t.get("boundaryGap"),r=i.getAxis();n.boundaryGap=a,"horizontal"===r.orient?(a[0]=To(a[0],o.height),a[1]=To(a[1],o.height),gg(e,t,o.height-a[0]-a[1])):(a[0]=To(a[0],o.width),a[1]=To(a[1],o.width),gg(e,t,o.width-a[0]-a[1])),e.setLayout("layoutInfo",n)})}),ds(function(t){t.eachSeriesByType("themeRiver",function(t){var e=t.getData(),i=t.getRawData(),n=t.get("color"),o=z();e.each(function(t){o.set(e.getRawIndex(t),t)}),i.each(function(a){var r=i.getName(a),s=n[(t.nameMap.get(r)-1)%n.length];i.setItemVisual(a,"color",s);var l=o.get(a);null!=l&&e.setItemVisual(l,"color",s)})})}),ls(gA("themeRiver")),uM.extend({type:"series.sunburst",_viewRoot:null,getInitialData:function(t,e){var i={name:t.name,children:t.data};vg(i);var n=t.levels||[],o={};return o.levels=n,bu.createTree(i,this,o).data},optionUpdated:function(){this.resetViewRoot()},getDataParams:function(t){var e=uM.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(t);return e.treePathInfo=Xu(i,this),e},defaultOption:{zlevel:0,z:2,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,percentPrecision:2,stillShowZeroSum:!0,highlightPolicy:"descendant",nodeClick:"rootToNode",renderLabelForZeroData:!1,label:{rotate:"radial",show:!0,opacity:1,align:"center",position:"inside",distance:5,silent:!0,emphasis:{}},itemStyle:{borderWidth:1,borderColor:"white",opacity:1,emphasis:{},highlight:{opacity:1},downplay:{opacity:.9}},animationType:"expansion",animationDuration:1e3,animationDurationUpdate:500,animationEasing:"cubicOut",data:[],levels:[],sort:"desc"},getViewRoot:function(){return this._viewRoot},resetViewRoot:function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)}});var AL={NONE:"none",DESCENDANT:"descendant",ANCESTOR:"ancestor",SELF:"self"},DL=2,CL=4,LL=yg.prototype;LL.updateData=function(t,e,i,o,s){this.node=e,e.piece=this,o=o||this._seriesModel,s=s||this._ecModel;var l=this.childAt(0);l.dataIndex=e.dataIndex;var h=e.getModel(),u=e.getLayout(),c=a({},u);c.label=null;var d,f=xg(e,0,s),p=h.getModel("itemStyle").getItemStyle();d=r({lineJoin:"bevel",fill:(d="normal"===i?p:n(h.getModel(i+".itemStyle").getItemStyle(),p)).fill||f},d),t?(l.setShape(c),l.shape.r=u.r0,co(l,{shape:{r:u.r}},o,e.dataIndex),l.useStyle(d)):co(l,{shape:c,style:d},o),"normal"===i&&(l.hoverStyle=h.getModel("emphasis.itemStyle").getItemStyle(),to(this)),this._updateLabel(o,s,f);var g=h.getShallow("cursor");if(g&&l.attr("cursor",g),t){var m=o.getShallow("highlightPolicy");this._initEvents(l,e,o,m)}this._seriesModel=o||this._seriesModel,this._ecModel=s||this._ecModel},LL.onEmphasis=function(t){var e=this;this.node.hostTree.root.eachNode(function(i){i.piece&&(e.node===i?i.piece.updateData(!1,i,"emphasis"):wg(i,e.node,t)?i.piece.childAt(0).trigger("highlight"):t!==AL.NONE&&i.piece.childAt(0).trigger("downplay"))})},LL.onNormal=function(){this.node.hostTree.root.eachNode(function(t){t.piece&&t.piece.updateData(!1,t,"normal")})},LL.onHighlight=function(){this.updateData(!1,this.node,"highlight")},LL.onDownplay=function(){this.updateData(!1,this.node,"downplay")},LL._updateLabel=function(t,e,i){var n=this.node.getModel(),o=n.getModel("label"),a=n.getModel("label.emphasis"),r=T(t.getFormattedLabel(this.node.dataIndex,"normal",null,null,"label"),this.node.name);o.get("show")||(r="");var s=this.childAt(1);eo(s.style,s.hoverStyle={},o,a,{defaultText:o.getShallow("show")?r:null,autoColor:i,useInsideStyle:!0});var l,h=this.node.getLayout(),u=(h.startAngle+h.endAngle)/2,c=Math.cos(u),d=Math.sin(u),f=o.get("position"),p=o.get("distance")||0,g=o.get("align");"outside"===f?(l=h.r+p,g=u>Math.PI/2?"right":"left"):g&&"center"!==g?"left"===g?(l=h.r0+p,u>Math.PI/2&&(g="right")):"right"===g&&(l=h.r-p,u>Math.PI/2&&(g="left")):(l=(h.r+h.r0)/2,g="center"),s.attr("style",{text:r,textAlign:g,textVerticalAlign:o.get("verticalAlign")||"middle",opacity:o.get("opacity")});var m=l*c+h.cx,v=l*d+h.cy;s.attr("position",[m,v]);var y=o.getShallow("rotate"),x=0;"radial"===y?(x=-u)<-Math.PI/2&&(x+=Math.PI):"tangential"===y?(x=Math.PI/2-u)>Math.PI/2?x-=Math.PI:x<-Math.PI/2&&(x+=Math.PI):"number"==typeof y&&(x=y*Math.PI/180),s.attr("rotation",x)},LL._initEvents=function(t,e,i,n){t.off("mouseover").off("mouseout").off("emphasis").off("normal");var o=this,a=function(){o.onEmphasis(n)},r=function(){o.onNormal()};i.isAnimationEnabled()&&t.on("mouseover",a).on("mouseout",r).on("emphasis",a).on("normal",r).on("downplay",function(){o.onDownplay()}).on("highlight",function(){o.onHighlight()})},h(yg,S_);cr.extend({type:"sunburst",init:function(){},render:function(t,e,i,n){function o(i,n){if(u||!i||i.getValue()||(i=null),i!==s&&n!==s)if(n&&n.piece)i?n.piece.updateData(!1,i,"normal",t,e):a(n);else if(i){var o=new yg(i,t,e);h.add(o)}}function a(t){t&&t.piece&&(h.remove(t.piece),t.piece=null)}var r=this;this.seriesModel=t,this.api=i,this.ecModel=e;var s=t.getData().tree.root,l=t.getViewRoot(),h=this.group,u=t.get("renderLabelForZeroData"),c=[];l.eachNode(function(t){c.push(t)});var d=this._oldChildren||[];if(function(t,e){function i(t){return t.getId()}function n(i,n){o(null==i?null:t[i],null==n?null:e[n])}0===t.length&&0===e.length||new ws(e,t,i,i).add(n).update(n).remove(v(n,null)).execute()}(c,d),function(i,n){if(n.depth>0){i.piece?i.piece.updateData(!1,i,"normal",t,e):(i.piece=new yg(i,t,e),h.add(i.piece)),n.piece._onclickEvent&&n.piece.off("click",n.piece._onclickEvent);var o=function(t){r._rootToNode(n.parentNode)};n.piece._onclickEvent=o,i.piece.on("click",o)}else i.piece&&(h.remove(i.piece),i.piece=null)}(s,l),n&&n.highlight&&n.highlight.piece){var f=t.getShallow("highlightPolicy");n.highlight.piece.onEmphasis(f)}else if(n&&n.unhighlight){var p=s.piece;!p&&s.children.length&&(p=s.children[0].piece),p&&p.onNormal()}this._initEvents(),this._oldChildren=c},dispose:function(){},_initEvents:function(){var t=this,e=function(e){var i=t.seriesModel.get("nodeClick",!0);if(i){var n=!1;t.seriesModel.getViewRoot().eachNode(function(o){if(!n&&o.piece&&o.piece.childAt(0)===e.target){if("rootToNode"===i)t._rootToNode(o);else if("link"===i){var a=o.getModel(),r=a.get("link",!0);if(r){var s=a.get("target",!0)||"_blank";r&&window.open(r,s)}}n=!0}})}};this.group._onclickEvent&&this.group.off("click",this.group._onclickEvent),this.group.on("click",e),this.group._onclickEvent=e},_rootToNode:function(t){t!==this.seriesModel.getViewRoot()&&this.api.dispatchAction({type:"sunburstRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t})},containPoint:function(t,e){var i=e.getData().getItemLayout(0);if(i){var n=t[0]-i.cx,o=t[1]-i.cy,a=Math.sqrt(n*n+o*o);return a<=i.r&&a>=i.r0}}});var kL="sunburstRootToNode";hs({type:kL,update:"updateView"},function(t,e){e.eachComponent({mainType:"series",subType:"sunburst",query:t},function(e,i){var n=Zu(t,[kL],e);if(n){var o=e.getViewRoot();o&&(t.direction=ju(o,n.node)?"rollUp":"drillDown"),e.resetViewRoot(n.node)}})});var PL="sunburstHighlight";hs({type:PL,update:"updateView"},function(t,e){e.eachComponent({mainType:"series",subType:"sunburst",query:t},function(e,i){var n=Zu(t,[PL],e);n&&(t.highlight=n.node)})});hs({type:"sunburstUnhighlight",update:"updateView"},function(t,e){e.eachComponent({mainType:"series",subType:"sunburst",query:t},function(e,i){t.unhighlight=!0})});var OL=Math.PI/180;ds(v(cA,"sunburst")),cs(v(function(t,e,i,n){e.eachSeriesByType(t,function(t){var e=t.get("center"),n=t.get("radius");y(n)||(n=[0,n]),y(e)||(e=[e,e]);var o=i.getWidth(),a=i.getHeight(),r=Math.min(o,a),s=To(e[0],o),l=To(e[1],a),h=To(n[0],r/2),u=To(n[1],r/2),c=-t.get("startAngle")*OL,f=t.get("minAngle")*OL,p=t.getData().tree.root,g=t.getViewRoot(),m=g.depth,v=t.get("sort");null!=v&&bg(g,v);var x=0;d(g.children,function(t){!isNaN(t.getValue())&&x++});var _=g.getValue(),w=Math.PI/(_||x)*2,b=g.depth>0,S=g.height-(b?-1:1),M=(u-h)/(S||1),I=t.get("clockwise"),T=t.get("stillShowZeroSum"),A=I?1:-1,D=function(t,e){if(t){var i=e;if(t!==p){var n=t.getValue(),o=0===_&&T?w:n*w;o<f&&(o=f),i=e+A*o;var a=t.depth-m-(b?-1:1),u=h+M*a,c=h+M*(a+1),g=t.getModel();null!=g.get("r0")&&(u=To(g.get("r0"),r/2)),null!=g.get("r")&&(c=To(g.get("r"),r/2)),t.setLayout({angle:o,startAngle:e,endAngle:i,clockwise:I,cx:s,cy:l,r0:u,r:c})}if(t.children&&t.children.length){var v=0;d(t.children,function(t){v+=D(t,e+v)})}return i-e}};if(b){var C=h,L=h+M,k=2*Math.PI;p.setLayout({angle:k,startAngle:c,endAngle:c+k,clockwise:I,cx:s,cy:l,r0:C,r:L})}D(g,c)})},"sunburst")),ls(v(gA,"sunburst"));var NL=["itemStyle"],EL=["emphasis","itemStyle"],zL=["label"],RL=["emphasis","label"],BL="e\0\0",VL={cartesian2d:function(t){var e=t.grid.getRect();return{coordSys:{type:"cartesian2d",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:function(e){return t.dataToPoint(e)},size:m(Mg,t)}}},geo:function(t){var e=t.getBoundingRect();return{coordSys:{type:"geo",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:function(e,i){return t.dataToPoint(e,i)},size:m(Ig,t)}}},singleAxis:function(t){var e=t.getRect();return{coordSys:{type:"singleAxis",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:function(e){return t.dataToPoint(e)},size:m(Tg,t)}}},polar:function(t){var e=t.getRadiusAxis(),i=t.getAngleAxis(),n=e.getExtent();return n[0]>n[1]&&n.reverse(),{coordSys:{type:"polar",cx:t.cx,cy:t.cy,r:n[1],r0:n[0]},api:{coord:m(function(n){var o=e.dataToRadius(n[0]),a=i.dataToAngle(n[1]),r=t.coordToPoint([o,a]);return r.push(o,a*Math.PI/180),r}),size:m(Ag,t)}}},calendar:function(t){var e=t.getRect(),i=t.getRangeInfo();return{coordSys:{type:"calendar",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:t.getCellWidth(),cellHeight:t.getCellHeight(),rangeInfo:{start:i.start,end:i.end,weeks:i.weeks,dayCount:i.allDay}},api:{coord:function(e,i){return t.dataToPoint(e,i)}}}}};vs({type:"series.custom",dependencies:["grid","polar","geo","singleAxis","calendar"],defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0},getInitialData:function(t,e){return Bs(this.getSource(),this)}}),ys({type:"custom",_data:null,render:function(t,e,i){var n=this._data,o=t.getData(),a=this.group,r=kg(t,o,e,i);this.group.removeAll(),o.diff(n).add(function(e){o.hasValue(e)&&Og(null,e,r(e),t,a,o)}).update(function(e,i){var s=n.getItemGraphicEl(i);o.hasValue(e)?Og(s,e,r(e),t,a,o):s&&a.remove(s)}).remove(function(t){var e=n.getItemGraphicEl(t);e&&a.remove(e)}).execute(),this._data=o},incrementalPrepareRender:function(t,e,i){this.group.removeAll(),this._data=null},incrementalRender:function(t,e,i,n){for(var o=e.getData(),a=kg(e,o,i,n),r=t.start;r<t.end;r++)Og(null,r,a(r),e,this.group,o).traverse(function(t){t.isGroup||(t.incremental=!0,t.useHoverLayer=!0)})},dispose:B}),ss(function(t){var e=t.graphic;y(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])});var GL=gs({type:"graphic",defaultOption:{elements:[],parentId:null},_elOptionsToUpdate:null,mergeOption:function(t){var e=this.option.elements;this.option.elements=null,GL.superApply(this,"mergeOption",arguments),this.option.elements=e},optionUpdated:function(t,e){var i=this.option,n=(e?i:t).elements,o=i.elements=e?[]:i.elements,a=[];this._flatten(n,a);var r=Ai(o,a);Di(r);var s=this._elOptionsToUpdate=[];d(r,function(t,e){var i=t.option;i&&(s.push(i),Hg(t,i),Zg(o,e,i),Ug(o[e],i))},this);for(var l=o.length-1;l>=0;l--)null==o[l]?o.splice(l,1):delete o[l].$action},_flatten:function(t,e,i){d(t,function(t){if(t){i&&(t.parentOption=i),e.push(t);var n=t.children;"group"===t.type&&n&&this._flatten(n,e,t),delete t.children}},this)},useElOptionsToUpdate:function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t}});ms({type:"graphic",init:function(t,e){this._elMap=z(),this._lastGraphicModel},render:function(t,e,i){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t,i),this._relocate(t,i)},_updateElements:function(t,e){var i=t.useElOptionsToUpdate();if(i){var n=this._elMap,o=this.group;d(i,function(t){var e=t.$action,i=t.id,a=n.get(i),r=t.parentId,s=null!=r?n.get(r):o;if("text"===t.type){var l=t.style;t.hv&&t.hv[1]&&(l.textVerticalAlign=l.textBaseline=null),!l.hasOwnProperty("textFill")&&l.fill&&(l.textFill=l.fill),!l.hasOwnProperty("textStroke")&&l.stroke&&(l.textStroke=l.stroke)}var h=Wg(t);e&&"merge"!==e?"replace"===e?(Gg(a,n),Vg(i,s,h,n)):"remove"===e&&Gg(a,n):a?a.attr(h):Vg(i,s,h,n);var u=n.get(i);u&&(u.__ecGraphicWidth=t.width,u.__ecGraphicHeight=t.height)})}},_relocate:function(t,e){for(var i=t.option.elements,n=this.group,o=this._elMap,a=i.length-1;a>=0;a--){var r=i[a],s=o.get(r.id);if(s){var l=s.parent;Jo(s,r,l===n?{width:e.getWidth(),height:e.getHeight()}:{width:l.__ecGraphicWidth||0,height:l.__ecGraphicHeight||0},null,{hv:r.hv,boundingMode:r.bounding})}}},_clear:function(){var t=this._elMap;t.each(function(e){Gg(e,t)}),this._elMap=z()},dispose:function(){this._clear()}});var WL=gs({type:"legend.plain",dependencies:["series"],layoutMode:{type:"box",ignoreSize:!0},init:function(t,e,i){this.mergeDefaultAndTheme(t,i),t.selected=t.selected||{}},mergeOption:function(t){WL.superCall(this,"mergeOption",t)},optionUpdated:function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&"single"===this.get("selectedMode")){for(var e=!1,i=0;i<t.length;i++){var n=t[i].get("name");if(this.isSelected(n)){this.select(n),e=!0;break}}!e&&this.select(t[0].get("name"))}},_updateData:function(t){var e=[],i=[];t.eachRawSeries(function(n){var o=n.name;i.push(o);var a;if(n.legendDataProvider){var r=n.legendDataProvider(),s=r.mapArray(r.getName);t.isSeriesFiltered(n)||(i=i.concat(s)),s.length?e=e.concat(s):a=o}else a=o;a&&a!==vw&&e.push(a)}),this._availableNames=i;var n=f(this.get("data")||e,function(t){return"string"!=typeof t&&"number"!=typeof t||(t={name:t}),new _o(t,this,this.ecModel)},this);this._data=n},getData:function(){return this._data},select:function(t){var e=this.option.selected;"single"===this.get("selectedMode")&&d(this._data,function(t){e[t.get("name")]=!1}),e[t]=!0},unSelect:function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},toggleSelected:function(t){var e=this.option.selected;e.hasOwnProperty(t)||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},isSelected:function(t){var e=this.option.selected;return!(e.hasOwnProperty(t)&&!e[t])&&l(this._availableNames,t)>=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:"#ccc",textStyle:{color:"#333"},selectedMode:!0,tooltip:{show:!1}}});hs("legendToggleSelect","legendselectchanged",v(jg,"toggleSelected")),hs("legendSelect","legendselected",v(jg,"select")),hs("legendUnSelect","legendunselected",v(jg,"unSelect"));var FL=v,HL=d,ZL=S_,UL=ms({type:"legend.plain",newlineDisabled:!1,init:function(){this.group.add(this._contentGroup=new ZL),this._backgroundEl},getContentGroup:function(){return this._contentGroup},render:function(t,e,i){if(this.resetInner(),t.get("show",!0)){var n=t.get("align");n&&"auto"!==n||(n="right"===t.get("left")&&"vertical"===t.get("orient")?"right":"left"),this.renderInner(n,t,e,i);var o=t.getBoxLayoutParams(),a={width:i.getWidth(),height:i.getHeight()},s=t.get("padding"),l=Ko(o,a,s),h=this.layoutInner(t,n,l),u=Ko(r({width:h.width,height:h.height},o),a,s);this.group.attr("position",[u.x-h.x,u.y-h.y]),this.group.add(this._backgroundEl=Yg(h,t))}},resetInner:function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl)},renderInner:function(t,e,i,n){var o=this.getContentGroup(),a=z(),r=e.get("selectedMode");HL(e.getData(),function(s,l){var h=s.get("name");if(this.newlineDisabled||""!==h&&"\n"!==h){var u=i.getSeriesByName(h)[0];if(!a.get(h))if(u){var c=u.getData(),d=c.getVisual("color");"function"==typeof d&&(d=d(u.getDataParams(0)));var f=c.getVisual("legendSymbol")||"roundRect",p=c.getVisual("symbol");this._createItem(h,l,s,e,f,p,t,d,r).on("click",FL(qg,h,n)).on("mouseover",FL($g,u,null,n)).on("mouseout",FL(Kg,u,null,n)),a.set(h,!0)}else i.eachRawSeries(function(i){if(!a.get(h)&&i.legendDataProvider){var o=i.legendDataProvider(),u=o.indexOfName(h);if(u<0)return;var c=o.getItemVisual(u,"color");this._createItem(h,l,s,e,"roundRect",null,t,c,r).on("click",FL(qg,h,n)).on("mouseover",FL($g,i,h,n)).on("mouseout",FL(Kg,i,h,n)),a.set(h,!0)}},this)}else o.add(new ZL({newline:!0}))},this)},_createItem:function(t,e,i,n,o,r,s,l,h){var u=n.get("itemWidth"),c=n.get("itemHeight"),d=n.get("inactiveColor"),f=n.isSelected(t),p=new ZL,g=i.getModel("textStyle"),m=i.get("icon"),v=i.getModel("tooltip"),y=v.parentModel;if(o=m||o,p.add(dl(o,0,0,u,c,f?l:d,!0)),!m&&r&&(r!==o||"none"==r)){var x=.8*c;"none"===r&&(r="circle"),p.add(dl(r,(u-x)/2,(c-x)/2,x,x,f?l:d))}var _="left"===s?u+5:-5,w=s,b=n.get("formatter"),S=t;"string"==typeof b&&b?S=b.replace("{name}",null!=t?t:""):"function"==typeof b&&(S=b(t)),p.add(new Cb({style:io({},g,{text:S,x:_,y:c/2,textFill:f?g.getTextColor():d,textAlign:w,textVerticalAlign:"middle"})}));var M=new Vb({shape:p.getBoundingRect(),invisible:!0,tooltip:v.get("show")?a({content:t,formatter:y.get("formatter",!0)||function(){return t},formatterParams:{componentType:"legend",legendIndex:n.componentIndex,name:t,$vars:["name"]}},v.option):null});return p.add(M),p.eachChild(function(t){t.silent=!0}),M.silent=!h,this.getContentGroup().add(p),to(p),p.__legendDataIndex=e,p},layoutInner:function(t,e,i){var n=this.getContentGroup();bS(t.get("orient"),n,t.get("itemGap"),i.width,i.height);var o=n.getBoundingRect();return n.attr("position",[-o.x,-o.y]),this.group.getBoundingRect()}});ls(function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries(function(t){for(var i=0;i<e.length;i++)if(!e[i].isSelected(t.name))return!1;return!0})}),IS.registerSubTypeDefaulter("legend",function(){return"plain"});var jL=WL.extend({type:"legend.scroll",setScrollDataIndex:function(t){this.option.scrollDataIndex=t},defaultOption:{scrollDataIndex:0,pageButtonItemGap:5,pageButtonGap:null,pageButtonPosition:"end",pageFormatter:"{current}/{total}",pageIcons:{horizontal:["M0,0L12,-10L12,10z","M0,0L-12,-10L-12,10z"],vertical:["M0,0L20,0L10,-20z","M0,0L20,0L10,20z"]},pageIconColor:"#2f4554",pageIconInactiveColor:"#aaa",pageIconSize:15,pageTextStyle:{color:"#333"},animationDurationUpdate:800},init:function(t,e,i,n){var o=ea(t);jL.superCall(this,"init",t,e,i,n),Jg(this,t,o)},mergeOption:function(t,e){jL.superCall(this,"mergeOption",t,e),Jg(this,this.option,t)},getOrient:function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}}}),XL=S_,YL=["width","height"],qL=["x","y"],$L=UL.extend({type:"legend.scroll",newlineDisabled:!0,init:function(){$L.superCall(this,"init"),this._currentIndex=0,this.group.add(this._containerGroup=new XL),this._containerGroup.add(this.getContentGroup()),this.group.add(this._controllerGroup=new XL),this._showController},resetInner:function(){$L.superCall(this,"resetInner"),this._controllerGroup.removeAll(),this._containerGroup.removeClipPath(),this._containerGroup.__rectSize=null},renderInner:function(t,e,i,n){function o(t,i){var o=t+"DataIndex",l=xo(e.get("pageIcons",!0)[e.getOrient().name][i],{onclick:m(a._pageGo,a,o,e,n)},{x:-s[0]/2,y:-s[1]/2,width:s[0],height:s[1]});l.name=t,r.add(l)}var a=this;$L.superCall(this,"renderInner",t,e,i,n);var r=this._controllerGroup,s=e.get("pageIconSize",!0);y(s)||(s=[s,s]),o("pagePrev",0);var l=e.getModel("pageTextStyle");r.add(new Cb({name:"pageText",style:{textFill:l.getTextColor(),font:l.getFont(),textVerticalAlign:"middle",textAlign:"center"},silent:!0})),o("pageNext",1)},layoutInner:function(t,e,i){var n=this.getContentGroup(),o=this._containerGroup,a=this._controllerGroup,r=t.getOrient().index,s=YL[r],l=YL[1-r],h=qL[1-r];bS(t.get("orient"),n,t.get("itemGap"),r?i.width:null,r?null:i.height),bS("horizontal",a,t.get("pageButtonItemGap",!0));var u=n.getBoundingRect(),c=a.getBoundingRect(),d=this._showController=u[s]>i[s],f=[-u.x,-u.y];f[r]=n.position[r];var p=[0,0],g=[-c.x,-c.y],m=A(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?g[r]+=i[s]-c[s]:p[r]+=c[s]+m),g[1-r]+=u[l]/2-c[l]/2,n.attr("position",f),o.attr("position",p),a.attr("position",g);var v=this.group.getBoundingRect();if((v={x:0,y:0})[s]=d?i[s]:u[s],v[l]=Math.max(u[l],c[l]),v[h]=Math.min(0,c[h]+g[1-r]),o.__rectSize=i[s],d){var y={x:0,y:0};y[s]=Math.max(i[s]-c[s]-m,0),y[l]=v[l],o.setClipPath(new Vb({shape:y})),o.__rectSize=y[s]}else a.eachChild(function(t){t.attr({invisible:!0,silent:!0})});var x=this._getPageInfo(t);return null!=x.pageIndex&&co(n,{position:x.contentPosition},!!d&&t),this._updatePageInfoView(t,x),v},_pageGo:function(t,e,i){var n=this._getPageInfo(e)[t];null!=n&&i.dispatchAction({type:"legendScroll",scrollDataIndex:n,legendId:e.id})},_updatePageInfoView:function(t,e){var i=this._controllerGroup;d(["pagePrev","pageNext"],function(n){var o=null!=e[n+"DataIndex"],a=i.childOfName(n);a&&(a.setStyle("fill",o?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),a.cursor=o?"pointer":"default")});var n=i.childOfName("pageText"),o=t.get("pageFormatter"),a=e.pageIndex,r=null!=a?a+1:0,s=e.pageCount;n&&o&&n.setStyle("text",_(o)?o.replace("{current}",r).replace("{total}",s):o({current:r,total:s}))},_getPageInfo:function(t){function e(t){var e=t.getBoundingRect().clone();return e[f]+=t.position[u],e}var i,n,o,a,r=t.get("scrollDataIndex",!0),s=this.getContentGroup(),l=s.getBoundingRect(),h=this._containerGroup.__rectSize,u=t.getOrient().index,c=YL[u],d=YL[1-u],f=qL[u],p=s.position.slice();this._showController?s.eachChild(function(t){t.__legendDataIndex===r&&(a=t)}):a=s.childAt(0);var g=h?Math.ceil(l[c]/h):0;if(a){var m=a.getBoundingRect(),v=a.position[u]+m[f];p[u]=-v-l[f],i=Math.floor(g*(v+m[f]+h/2)/l[c]),i=l[c]&&g?Math.max(0,Math.min(g-1,i)):-1;var y={x:0,y:0};y[c]=h,y[d]=l[d],y[f]=-p[u]-l[f];var x,_=s.children();if(s.eachChild(function(t,i){var n=e(t);n.intersect(y)&&(null==x&&(x=i),o=t.__legendDataIndex),i===_.length-1&&n[f]+n[c]<=y[f]+y[c]&&(o=null)}),null!=x){var w=e(_[x]);if(y[f]=w[f]+w[c]-y[c],x<=0&&w[f]>=y[f])n=null;else{for(;x>0&&e(_[x-1]).intersect(y);)x--;n=_[x].__legendDataIndex}}}return{contentPosition:p,pageIndex:i,pageCount:g,pagePrevDataIndex:n,pageNextDataIndex:o}}});hs("legendScroll","legendscroll",function(t,e){var i=t.scrollDataIndex;null!=i&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},function(t){t.setScrollDataIndex(i)})}),gs({type:"tooltip",dependencies:["axisPointer"],defaultOption:{zlevel:0,z:8,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",confine:!1,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#fff",fontSize:14}}});var KL=d,JL=Fo,QL=["","-webkit-","-moz-","-o-"];im.prototype={constructor:im,_enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),i=t.style;"absolute"!==i.position&&"absolute"!==e.position&&(i.position="relative")},show:function(t){clearTimeout(this._hideTimeout);var e=this.el;e.style.cssText="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;"+em(t)+";left:"+this._x+"px;top:"+this._y+"px;"+(t.get("extraCssText")||""),e.style.display=e.innerHTML?"block":"none",this._show=!0},setContent:function(t){this.el.innerHTML=null==t?"":t},setEnterable:function(t){this._enterable=t},getSize:function(){var t=this.el;return[t.clientWidth,t.clientHeight]},moveTo:function(t,e){var i,n=this._zr;n&&n.painter&&(i=n.painter.getViewportRootOffset())&&(t+=i.offsetLeft,e+=i.offsetTop);var o=this.el.style;o.left=t+"px",o.top=e+"px",this._x=t,this._y=e},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(m(this.hide,this),t)):this.hide())},isShow:function(){return this._show}};var tk=m,ek=d,ik=To,nk=new Vb({shape:{x:-1,y:-1,width:2,height:2}});ms({type:"tooltip",init:function(t,e){if(!_x.node){var i=new im(e.getDom(),e);this._tooltipContent=i}},render:function(t,e,i){if(!_x.node&&!_x.wxa){this.group.removeAll(),this._tooltipModel=t,this._ecModel=e,this._api=i,this._lastDataByCoordSys=null,this._alwaysShowContent=t.get("alwaysShowContent");var n=this._tooltipContent;n.update(),n.setEnterable(t.get("enterable")),this._initGlobalListener(),this._keepShow()}},_initGlobalListener:function(){var t=this._tooltipModel.get("triggerOn");Fp("itemTooltip",this._api,tk(function(e,i,n){"none"!==t&&(t.indexOf(e)>=0?this._tryShow(i,n):"leave"===e&&this._hide(n))},this))},_keepShow:function(){var t=this._tooltipModel,e=this._ecModel,i=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==t.get("triggerOn")){var n=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){n.manuallyShowTip(t,e,i,{x:n._lastX,y:n._lastY})})}},manuallyShowTip:function(t,e,i,n){if(n.from!==this.uid&&!_x.node){var o=om(n,i);this._ticket="";var a=n.dataByCoordSys;if(n.tooltip&&null!=n.x&&null!=n.y){var r=nk;r.position=[n.x,n.y],r.update(),r.tooltip=n.tooltip,this._tryShow({offsetX:n.x,offsetY:n.y,target:r},o)}else if(a)this._tryShow({offsetX:n.x,offsetY:n.y,position:n.position,event:{},dataByCoordSys:n.dataByCoordSys,tooltipOption:n.tooltipOption},o);else if(null!=n.seriesIndex){if(this._manuallyAxisShowTip(t,e,i,n))return;var s=uL(n,e),l=s.point[0],h=s.point[1];null!=l&&null!=h&&this._tryShow({offsetX:l,offsetY:h,position:n.position,target:s.el,event:{}},o)}else null!=n.x&&null!=n.y&&(i.dispatchAction({type:"updateAxisPointer",x:n.x,y:n.y}),this._tryShow({offsetX:n.x,offsetY:n.y,position:n.position,target:i.getZr().findHover(n.x,n.y).target,event:{}},o))}},manuallyHideTip:function(t,e,i,n){var o=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&o.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=null,n.from!==this.uid&&this._hide(om(n,i))},_manuallyAxisShowTip:function(t,e,i,n){var o=n.seriesIndex,a=n.dataIndex,r=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=o&&null!=a&&null!=r){var s=e.getSeriesByIndex(o);if(s&&"axis"===(t=nm([s.getData().getItemModel(a),s,(s.coordinateSystem||{}).model,t])).get("trigger"))return i.dispatchAction({type:"updateAxisPointer",seriesIndex:o,dataIndex:a,position:n.position}),!0}},_tryShow:function(t,e){var i=t.target;if(this._tooltipModel){this._lastX=t.offsetX,this._lastY=t.offsetY;var n=t.dataByCoordSys;n&&n.length?this._showAxisTooltip(n,t):i&&null!=i.dataIndex?(this._lastDataByCoordSys=null,this._showSeriesItemTooltip(t,i,e)):i&&i.tooltip?(this._lastDataByCoordSys=null,this._showComponentItemTooltip(t,i,e)):(this._lastDataByCoordSys=null,this._hide(e))}},_showOrMove:function(t,e){var i=t.get("showDelay");e=m(e,this),clearTimeout(this._showTimout),i>0?this._showTimout=setTimeout(e,i):e()},_showAxisTooltip:function(t,e){var i=this._ecModel,n=this._tooltipModel,o=[e.offsetX,e.offsetY],a=[],r=[],s=nm([e.tooltipOption,n]);ek(t,function(t){ek(t.dataByAxis,function(t){var e=i.getComponent(t.axisDim+"Axis",t.axisIndex),n=t.value,o=[];if(e&&null!=n){var s=og(n,e.axis,i,t.seriesDataIndices,t.valueLabelOpt);d(t.seriesDataIndices,function(a){var l=i.getSeriesByIndex(a.seriesIndex),h=a.dataIndexInside,u=l&&l.getDataParams(h);u.axisDim=t.axisDim,u.axisIndex=t.axisIndex,u.axisType=t.axisType,u.axisId=t.axisId,u.axisValue=ul(e.axis,n),u.axisValueLabel=s,u&&(r.push(u),o.push(l.formatTooltip(h,!0)))});var l=s;a.push((l?Ho(l)+"<br />":"")+o.join("<br />"))}})},this),a.reverse(),a=a.join("<br /><br />");var l=e.position;this._showOrMove(s,function(){this._updateContentNotChangedOnAxis(t)?this._updatePosition(s,l,o[0],o[1],this._tooltipContent,r):this._showTooltipContent(s,a,r,Math.random(),o[0],o[1],l)})},_showSeriesItemTooltip:function(t,e,i){var n=this._ecModel,o=e.seriesIndex,a=n.getSeriesByIndex(o),r=e.dataModel||a,s=e.dataIndex,l=e.dataType,h=r.getData(),u=nm([h.getItemModel(s),r,a&&(a.coordinateSystem||{}).model,this._tooltipModel]),c=u.get("trigger");if(null==c||"item"===c){var d=r.getDataParams(s,l),f=r.formatTooltip(s,!1,l),p="item_"+r.name+"_"+s;this._showOrMove(u,function(){this._showTooltipContent(u,f,d,p,t.offsetX,t.offsetY,t.position,t.target)}),i({type:"showTip",dataIndexInside:s,dataIndex:h.getRawIndex(s),seriesIndex:o,from:this.uid})}},_showComponentItemTooltip:function(t,e,i){var n=e.tooltip;if("string"==typeof n){var o=n;n={content:o,formatter:o}}var a=new _o(n,this._tooltipModel,this._ecModel),r=a.get("content"),s=Math.random();this._showOrMove(a,function(){this._showTooltipContent(a,r,a.get("formatterParams")||{},s,t.offsetX,t.offsetY,t.position,e)}),i({type:"showTip",from:this.uid})},_showTooltipContent:function(t,e,i,n,o,a,r,s){if(this._ticket="",t.get("showContent")&&t.get("show")){var l=this._tooltipContent,h=t.get("formatter");r=r||t.get("position");var u=e;if(h&&"string"==typeof h)u=Zo(h,i,!0);else if("function"==typeof h){var c=tk(function(e,n){e===this._ticket&&(l.setContent(n),this._updatePosition(t,r,o,a,l,i,s))},this);this._ticket=n,u=h(i,n,c)}l.setContent(u),l.show(t),this._updatePosition(t,r,o,a,l,i,s)}},_updatePosition:function(t,e,i,n,o,a,r){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var h=o.getSize(),u=t.get("align"),c=t.get("verticalAlign"),d=r&&r.getBoundingRect().clone();if(r&&d.applyTransform(r.transform),"function"==typeof e&&(e=e([i,n],a,o.el,d,{viewSize:[s,l],contentSize:h.slice()})),y(e))i=ik(e[0],s),n=ik(e[1],l);else if(w(e)){e.width=h[0],e.height=h[1];var f=Ko(e,{width:s,height:l});i=f.x,n=f.y,u=null,c=null}else"string"==typeof e&&r?(i=(p=lm(e,d,h))[0],n=p[1]):(i=(p=am(i,n,o.el,s,l,u?null:20,c?null:20))[0],n=p[1]);if(u&&(i-=hm(u)?h[0]/2:"right"===u?h[0]:0),c&&(n-=hm(c)?h[1]/2:"bottom"===c?h[1]:0),t.get("confine")){var p=rm(i,n,o.el,s,l);i=p[0],n=p[1]}o.moveTo(i,n)},_updateContentNotChangedOnAxis:function(t){var e=this._lastDataByCoordSys,i=!!e&&e.length===t.length;return i&&ek(e,function(e,n){var o=e.dataByAxis||{},a=(t[n]||{}).dataByAxis||[];(i&=o.length===a.length)&&ek(o,function(t,e){var n=a[e]||{},o=t.seriesDataIndices||[],r=n.seriesDataIndices||[];(i&=t.value===n.value&&t.axisType===n.axisType&&t.axisId===n.axisId&&o.length===r.length)&&ek(o,function(t,e){var n=r[e];i&=t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})})}),this._lastDataByCoordSys=t,!!i},_hide:function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},dispose:function(t,e){_x.node||(this._tooltipContent.hide(),Yp("itemTooltip",e))}}),hs({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),hs({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},function(){}),fm.prototype={constructor:fm,pointToData:function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},dataToRadius:nT.prototype.dataToCoord,radiusToData:nT.prototype.coordToData},h(fm,nT),pm.prototype={constructor:pm,pointToData:function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},dataToAngle:nT.prototype.dataToCoord,angleToData:nT.prototype.coordToData},h(pm,nT);var ok=function(t){this.name=t||"",this.cx=0,this.cy=0,this._radiusAxis=new fm,this._angleAxis=new pm,this._radiusAxis.polar=this._angleAxis.polar=this};ok.prototype={type:"polar",axisPointerEnabled:!0,constructor:ok,dimensions:["radius","angle"],model:null,containPoint:function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},containData:function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},getAxis:function(t){return this["_"+t+"Axis"]},getAxes:function(){return[this._radiusAxis,this._angleAxis]},getAxesByScale:function(t){var e=[],i=this._angleAxis,n=this._radiusAxis;return i.scale.type===t&&e.push(i),n.scale.type===t&&e.push(n),e},getAngleAxis:function(){return this._angleAxis},getRadiusAxis:function(){return this._radiusAxis},getOtherAxis:function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},getTooltipAxes:function(t){var e=null!=t&&"auto"!==t?this.getAxis(t):this.getBaseAxis();return{baseAxes:[e],otherAxes:[this.getOtherAxis(e)]}},dataToPoint:function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},pointToData:function(t,e){var i=this.pointToCoord(t);return[this._radiusAxis.radiusToData(i[0],e),this._angleAxis.angleToData(i[1],e)]},pointToCoord:function(t){var e=t[0]-this.cx,i=t[1]-this.cy,n=this.getAngleAxis(),o=n.getExtent(),a=Math.min(o[0],o[1]),r=Math.max(o[0],o[1]);n.inverse?a=r-360:r=a+360;var s=Math.sqrt(e*e+i*i);e/=s,i/=s;for(var l=Math.atan2(-i,e)/Math.PI*180,h=l<a?1:-1;l<a||l>r;)l+=360*h;return[s,l]},coordToPoint:function(t){var e=t[0],i=t[1]/180*Math.PI;return[Math.cos(i)*e+this.cx,-Math.sin(i)*e+this.cy]}};var ak=IS.extend({type:"polarAxis",axis:null,getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"polar",index:this.option.polarIndex,id:this.option.polarId})[0]}});n(ak.prototype,ZI);var rk={angle:{startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:!1}},radius:{splitNumber:5}};kT("angle",ak,gm,rk.angle),kT("radius",ak,gm,rk.radius),gs({type:"polar",dependencies:["polarAxis","angleAxis"],coordinateSystem:null,findAxisModel:function(t){var e;return this.ecModel.eachComponent(t,function(t){t.getCoordSysModel()===this&&(e=t)},this),e},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"80%"}});var sk={dimensions:ok.prototype.dimensions,create:function(t,e){var i=[];return t.eachComponent("polar",function(t,n){var o=new ok(n);o.update=vm;var a=o.getRadiusAxis(),r=o.getAngleAxis(),s=t.findAxisModel("radiusAxis"),l=t.findAxisModel("angleAxis");ym(a,s),ym(r,l),mm(o,t,e),i.push(o),t.coordinateSystem=o,o.model=t}),t.eachSeries(function(e){if("polar"===e.get("coordinateSystem")){var i=t.queryComponents({mainType:"polar",index:e.get("polarIndex"),id:e.get("polarId")})[0];e.coordinateSystem=i.coordinateSystem}}),i}};Aa.register("polar",sk);var lk=["axisLine","axisLabel","axisTick","splitLine","splitArea"];XT.extend({type:"angleAxis",axisPointerClass:"PolarAxisPointer",render:function(t,e){if(this.group.removeAll(),t.get("show")){var i=t.axis,n=i.polar,o=n.getRadiusAxis().getExtent(),a=i.getTicksCoords();"category"!==i.type&&a.pop(),d(lk,function(e){!t.get(e+".show")||i.scale.isBlank()&&"axisLine"!==e||this["_"+e](t,n,a,o)},this)}},_axisLine:function(t,e,i,n){var o=t.getModel("axisLine.lineStyle"),a=new Lb({shape:{cx:e.cx,cy:e.cy,r:n[_m(e)]},style:o.getLineStyle(),z2:1,silent:!0});a.style.fill=null,this.group.add(a)},_axisTick:function(t,e,i,n){var o=t.getModel("axisTick"),a=(o.get("inside")?-1:1)*o.get("length"),s=n[_m(e)],l=f(i,function(t){return new Gb({shape:xm(e,[s,s+a],t)})});this.group.add(Qb(l,{style:r(o.getModel("lineStyle").getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")})}))},_axisLabel:function(t,e,i,n){for(var o=t.axis,a=t.getCategories(),r=t.getModel("axisLabel"),s=t.getFormattedLabels(),l=r.get("margin"),h=o.getLabelsCoords(),u=0;u<i.length;u++){var c=n[_m(e)],d=e.coordToPoint([c+l,h[u]]),f=e.cx,p=e.cy,g=Math.abs(d[0]-f)/c<.3?"center":d[0]>f?"left":"right",m=Math.abs(d[1]-p)/c<.3?"middle":d[1]>p?"top":"bottom";a&&a[u]&&a[u].textStyle&&(r=new _o(a[u].textStyle,r,r.ecModel));var v=new Cb({silent:!0});this.group.add(v),io(v.style,r,{x:d[0],y:d[1],textFill:r.getTextColor()||t.get("axisLine.lineStyle.color"),text:s[u],textAlign:g,textVerticalAlign:m})}},_splitLine:function(t,e,i,n){var o=t.getModel("splitLine").getModel("lineStyle"),a=o.get("color"),s=0;a=a instanceof Array?a:[a];for(var l=[],h=0;h<i.length;h++){var u=s++%a.length;l[u]=l[u]||[],l[u].push(new Gb({shape:xm(e,n,i[h])}))}for(h=0;h<l.length;h++)this.group.add(Qb(l[h],{style:r({stroke:a[h%a.length]},o.getLineStyle()),silent:!0,z:t.get("z")}))},_splitArea:function(t,e,i,n){var o=t.getModel("splitArea").getModel("areaStyle"),a=o.get("color"),s=0;a=a instanceof Array?a:[a];for(var l=[],h=Math.PI/180,u=-i[0]*h,c=Math.min(n[0],n[1]),d=Math.max(n[0],n[1]),f=t.get("clockwise"),p=1;p<i.length;p++){var g=s++%a.length;l[g]=l[g]||[],l[g].push(new Ob({shape:{cx:e.cx,cy:e.cy,r0:c,r:d,startAngle:u,endAngle:-i[p]*h,clockwise:f},silent:!0})),u=-i[p]*h}for(p=0;p<l.length;p++)this.group.add(Qb(l[p],{style:r({fill:a[p%a.length]},o.getAreaStyle()),silent:!0}))}});var hk=["axisLine","axisTickLabel","axisName"],uk=["splitLine","splitArea"];XT.extend({type:"radiusAxis",axisPointerClass:"PolarAxisPointer",render:function(t,e){if(this.group.removeAll(),t.get("show")){var i=t.axis,n=i.polar,o=n.getAngleAxis(),a=i.getTicksCoords(),r=o.getExtent()[0],s=i.getExtent(),l=wm(n,t,r),h=new GT(t,l);d(hk,h.add,h),this.group.add(h.getGroup()),d(uk,function(e){t.get(e+".show")&&!i.scale.isBlank()&&this["_"+e](t,n,r,s,a)},this)}},_splitLine:function(t,e,i,n,o){var a=t.getModel("splitLine").getModel("lineStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var h=[],u=0;u<o.length;u++){var c=l++%s.length;h[c]=h[c]||[],h[c].push(new Lb({shape:{cx:e.cx,cy:e.cy,r:o[u]},silent:!0}))}for(u=0;u<h.length;u++)this.group.add(Qb(h[u],{style:r({stroke:s[u%s.length],fill:null},a.getLineStyle()),silent:!0}))},_splitArea:function(t,e,i,n,o){var a=t.getModel("splitArea").getModel("areaStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var h=[],u=o[0],c=1;c<o.length;c++){var d=l++%s.length;h[d]=h[d]||[],h[d].push(new Ob({shape:{cx:e.cx,cy:e.cy,r0:u,r:o[c],startAngle:0,endAngle:2*Math.PI},silent:!0})),u=o[c]}for(c=0;c<h.length;c++)this.group.add(Qb(h[c],{style:r({fill:s[c%s.length]},a.getAreaStyle()),silent:!0}))}});var ck=qp.extend({makeElOption:function(t,e,i,n,o){var a=i.axis;"angle"===a.dim&&(this.animationThreshold=Math.PI/18);var r,s=a.polar,l=s.getOtherAxis(a).getExtent();r=a["dataTo"+Yo(a.dim)](e);var h=n.get("type");if(h&&"none"!==h){var u=eg(n),c=dk[h](a,s,r,l,u);c.style=u,t.graphicKey=c.type,t.pointer=c}ig(t,i,n,o,bm(e,i,0,s,n.get("label.margin")))}}),dk={line:function(t,e,i,n,o){return"angle"===t.dim?{type:"Line",shape:sg(e.coordToPoint([n[0],i]),e.coordToPoint([n[1],i]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:i}}},shadow:function(t,e,i,n,o){var a=t.getBandWidth(),r=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:hg(e.cx,e.cy,n[0],n[1],(-i-a/2)*r,(a/2-i)*r)}:{type:"Sector",shape:hg(e.cx,e.cy,i-a/2,i+a/2,0,2*Math.PI)}}};XT.registerAxisPointerClass("PolarAxisPointer",ck),cs(v(function(t,e,i){var n=i.getWidth(),o=i.getHeight(),a={},r={},s=dm(g(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"polar"===t.coordinateSystem.type}));e.eachSeriesByType(t,function(t){if("polar"===t.coordinateSystem.type){var e=t.getData(),i=t.coordinateSystem,l=i.getAngleAxis(),h=i.getBaseAxis(),u=um(t),c=s[cm(h)][u],d=c.offset,f=c.width,p=i.getOtherAxis(h),g=t.get("center")||["50%","50%"],m=To(g[0],n),v=To(g[1],o),y=t.get("barMinHeight")||0,x=t.get("barMinAngle")||0,_=p.getExtent()[0],w=p.model.get("max"),b=p.model.get("min"),S=[e.mapDimension("radius"),e.mapDimension("angle")],M=e.mapArray(S,function(t,e){return i.dataToPoint([t,e])},!0);a[u]=a[u]||[],r[u]=r[u]||[],e.each(e.mapDimension(p.dim),function(t,n){if(!isNaN(t)){a[u][n]||(a[u][n]={p:_,n:_},r[u][n]={p:_,n:_});var o,s,h,c,g=t>=0?"p":"n",S=i.pointToCoord(M[n]),I=r[u][n][g];if("radius"===p.dim)o=I,s=S[0],c=(h=(-S[1]+d)*Math.PI/180)+f*Math.PI/180,Math.abs(s)<y&&(s=o+(s<0?-1:1)*y),r[u][n][g]=s;else{s=(o=S[0]+d)+f,null!=w&&(t=Math.min(t,w)),null!=b&&(t=Math.max(t,b));var T=l.dataToAngle(t);Math.abs(T-I)<x&&(T=I-(t<0?-1:1)*x),h=-I*Math.PI/180,c=-T*Math.PI/180;var A=l.getExtent(),D=T;D===A[0]&&t>0?D=A[1]:D===A[1]&&t<0&&(D=A[0]),r[u][n][g]=D}e.setItemLayout(n,{cx:m,cy:v,r0:o,r:s,startAngle:h,endAngle:c})}},!0)}},this)},"bar")),ms({type:"polar"}),u(IS.extend({type:"geo",coordinateSystem:null,layoutMode:"box",init:function(t){IS.prototype.init.apply(this,arguments),Mi(t,"label",["show"])},optionUpdated:function(){var t=this.option,e=this;t.regions=OA.getFilledRegions(t.regions,t.map,t.nameMap),this._optionModelMap=p(t.regions||[],function(t,i){return i.name&&t.set(i.name,new _o(i,e)),t},z()),this.updateSelectedMap(t.regions)},defaultOption:{zlevel:0,z:0,show:!0,left:"center",top:"center",aspectScale:.75,silent:!1,map:"",boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",color:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},regions:[]},getRegionModel:function(t){return this._optionModelMap.get(t)||new _o(null,this,this.ecModel)},getFormattedLabel:function(t,e){var i=this.getRegionModel(t).get("label."+e+".formatter"),n={name:t};return"function"==typeof i?(n.status=e,i(n)):"string"==typeof i?i.replace("{a}",null!=t?t:""):void 0},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t}}),sA),ms({type:"geo",init:function(t,e){var i=new ou(e,!0);this._mapDraw=i,this.group.add(i.group)},render:function(t,e,i,n){if(!n||"geoToggleSelect"!==n.type||n.from!==this.uid){var o=this._mapDraw;t.get("show")?o.draw(t,e,i,this,n):this._mapDraw.group.removeAll(),this.group.silent=t.get("silent")}},dispose:function(){this._mapDraw&&this._mapDraw.remove()}}),Sm("toggleSelected",{type:"geoToggleSelect",event:"geoselectchanged"}),Sm("select",{type:"geoSelect",event:"geoselected"}),Sm("unSelect",{type:"geoUnSelect",event:"geounselected"});var fk=["rect","polygon","keep","clear"],pk=d,gk={lineX:Lm(0),lineY:Lm(1),rect:{point:function(t,e,i){return t&&i.boundingRect.contain(t[0],t[1])},rect:function(t,e,i){return t&&i.boundingRect.intersect(t)}},polygon:{point:function(t,e,i){return t&&i.boundingRect.contain(t[0],t[1])&&pl(i.range,t[0],t[1])},rect:function(t,e,i){var n=i.range;if(!t||n.length<=1)return!1;var o=t.x,a=t.y,r=t.width,s=t.height,l=n[0];return!!(pl(n,o,a)||pl(n,o+r,a)||pl(n,o,a+s)||pl(n,o+r,a+s)||Kt.create(t).contain(l[0],l[1])||Pm(o,a,o+r,a,n)||Pm(o,a,o,a+s,n)||Pm(o+r,a,o+r,a+s,n)||Pm(o,a+s,o+r,a+s,n))||void 0}}},mk=d,vk=l,yk=v,xk=["dataToPoint","pointToData"],_k=["grid","xAxis","yAxis","geo","graph","polar","radiusAxis","angleAxis","bmap"],wk=zm.prototype;wk.setOutputRanges=function(t,e){this.matchOutputRanges(t,e,function(t,e,i){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var n=Ik[t.brushType](0,i,e);t.__rangeOffset={offset:Tk[t.brushType](n.values,t.range,[1,1]),xyMinMax:n.xyMinMax}}})},wk.matchOutputRanges=function(t,e,i){mk(t,function(t){var n=this.findTargetInfo(t,e);n&&!0!==n&&d(n.coordSyses,function(n){var o=Ik[t.brushType](1,n,t.range);i(t,o.values,n,e)})},this)},wk.setInputRanges=function(t,e){mk(t,function(t){var i=this.findTargetInfo(t,e);if(t.range=t.range||[],i&&!0!==i){t.panelId=i.panelId;var n=Ik[t.brushType](0,i.coordSys,t.coordRange),o=t.__rangeOffset;t.range=o?Tk[t.brushType](n.values,o.offset,Wm(n.xyMinMax,o.xyMinMax)):n.values}},this)},wk.makePanelOpts=function(t,e){return f(this._targetInfoList,function(i){var n=i.getPanelRect();return{panelId:i.panelId,defaultBrushType:e&&e(i),clipPath:Qd(n),isTargetByCursor:ef(n,t,i.coordSysModel),getLinearBrushOtherExtent:tf(n)}})},wk.controlSeries=function(t,e,i){var n=this.findTargetInfo(t,i);return!0===n||n&&vk(n.coordSyses,e.coordinateSystem)>=0},wk.findTargetInfo=function(t,e){for(var i=this._targetInfoList,n=Bm(e,t),o=0;o<i.length;o++){var a=i[o],r=t.panelId;if(r){if(a.panelId===r)return a}else for(o=0;o<Sk.length;o++)if(Sk[o](n,a))return a}return!0};var bk={grid:function(t,e){var i=t.xAxisModels,n=t.yAxisModels,o=t.gridModels,a=z(),r={},s={};(i||n||o)&&(mk(i,function(t){var e=t.axis.grid.model;a.set(e.id,e),r[e.id]=!0}),mk(n,function(t){var e=t.axis.grid.model;a.set(e.id,e),s[e.id]=!0}),mk(o,function(t){a.set(t.id,t),r[t.id]=!0,s[t.id]=!0}),a.each(function(t){var o=t.coordinateSystem,a=[];mk(o.getCartesians(),function(t,e){(vk(i,t.getAxis("x").model)>=0||vk(n,t.getAxis("y").model)>=0)&&a.push(t)}),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:a[0],coordSyses:a,getPanelRect:Mk.grid,xAxisDeclared:r[t.id],yAxisDeclared:s[t.id]})}))},geo:function(t,e){mk(t.geoModels,function(t){var i=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:i,coordSyses:[i],getPanelRect:Mk.geo})})}},Sk=[function(t,e){var i=t.xAxisModel,n=t.yAxisModel,o=t.gridModel;return!o&&i&&(o=i.axis.grid.model),!o&&n&&(o=n.axis.grid.model),o&&o===e.gridModel},function(t,e){var i=t.geoModel;return i&&i===e.geoModel}],Mk={grid:function(){return this.coordSys.grid.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(po(t)),e}},Ik={lineX:yk(Vm,0),lineY:yk(Vm,1),rect:function(t,e,i){var n=e[xk[t]]([i[0][0],i[1][0]]),o=e[xk[t]]([i[0][1],i[1][1]]),a=[Rm([n[0],o[0]]),Rm([n[1],o[1]])];return{values:a,xyMinMax:a}},polygon:function(t,e,i){var n=[[1/0,-1/0],[1/0,-1/0]];return{values:f(i,function(i){var o=e[xk[t]](i);return n[0][0]=Math.min(n[0][0],o[0]),n[1][0]=Math.min(n[1][0],o[1]),n[0][1]=Math.max(n[0][1],o[0]),n[1][1]=Math.max(n[1][1],o[1]),o}),xyMinMax:n}}},Tk={lineX:yk(Gm,0),lineY:yk(Gm,1),rect:function(t,e,i){return[[t[0][0]-i[0]*e[0][0],t[0][1]-i[0]*e[0][1]],[t[1][0]-i[1]*e[1][0],t[1][1]-i[1]*e[1][1]]]},polygon:function(t,e,i){return f(t,function(t,n){return[t[0]-i[0]*e[n][0],t[1]-i[1]*e[n][1]]})}},Ak=["inBrush","outOfBrush"],Dk="__ecBrushSelect",Ck="__ecInBrushSelectEvent",Lk=FM.VISUAL.BRUSH;cs(Lk,function(t,e,i){t.eachComponent({mainType:"brush"},function(e){i&&"takeGlobalCursor"===i.type&&e.setBrushOption("brush"===i.key?i.brushOption:{brushType:!1}),(e.brushTargetManager=new zm(e.option,t)).setInputRanges(e.areas,t)})}),ds(Lk,function(t,e,n){var o,a,s=[];t.eachComponent({mainType:"brush"},function(e,n){function l(t){return"all"===m||v[t]}function h(t){return!!t.length}function u(t,e){var i=t.coordinateSystem;w|=i.hasAxisBrushed(),l(e)&&i.eachActiveState(t.getData(),function(t,e){"active"===t&&(x[e]=1)})}function c(i,n,o){var a=jm(i);if(a&&!Xm(e,n)&&(d(b,function(n){a[n.brushType]&&e.brushTargetManager.controlSeries(n,i,t)&&o.push(n),w|=h(o)}),l(n)&&h(o))){var r=i.getData();r.each(function(t){Um(a,o,r,t)&&(x[t]=1)})}}var p={brushId:e.id,brushIndex:n,brushName:e.name,areas:i(e.areas),selected:[]};s.push(p);var g=e.option,m=g.brushLink,v=[],x=[],_=[],w=0;n||(o=g.throttleType,a=g.throttleDelay);var b=f(e.areas,function(t){return Ym(r({boundingRect:kk[t.brushType](t)},t))}),S=Tm(e.option,Ak,function(t){t.mappingMethod="fixed"});y(m)&&d(m,function(t){v[t]=1}),t.eachSeries(function(t,e){var i=_[e]=[];"parallel"===t.subType?u(t,e):c(t,e,i)}),t.eachSeries(function(t,e){var i={seriesId:t.id,seriesIndex:e,seriesName:t.name,dataIndex:[]};p.selected.push(i);var n=jm(t),o=_[e],a=t.getData(),r=l(e)?function(t){return x[t]?(i.dataIndex.push(a.getRawIndex(t)),"inBrush"):"outOfBrush"}:function(t){return Um(n,o,a,t)?(i.dataIndex.push(a.getRawIndex(t)),"inBrush"):"outOfBrush"};(l(e)?w:h(o))&&Dm(Ak,S,a,r)})}),Hm(e,o,a,s,n)});var kk={lineX:B,lineY:B,rect:function(t){return qm(t.range)},polygon:function(t){for(var e,i=t.range,n=0,o=i.length;n<o;n++){e=e||[[1/0,-1/0],[1/0,-1/0]];var a=i[n];a[0]<e[0][0]&&(e[0][0]=a[0]),a[0]>e[0][1]&&(e[0][1]=a[0]),a[1]<e[1][0]&&(e[1][0]=a[1]),a[1]>e[1][1]&&(e[1][1]=a[1])}return e&&qm(e)}},Pk=["#ddd"];gs({type:"brush",dependencies:["geo","grid","xAxis","yAxis","parallel","series"],defaultOption:{toolbox:null,brushLink:null,seriesIndex:"all",geoIndex:null,xAxisIndex:null,yAxisIndex:null,brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(120,140,180,0.3)",borderColor:"rgba(120,140,180,0.8)"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},areas:[],brushType:null,brushOption:{},coordInfoList:[],optionUpdated:function(t,e){var i=this.option;!e&&Am(i,t,["inBrush","outOfBrush"]),i.inBrush=i.inBrush||{},i.outOfBrush=i.outOfBrush||{color:Pk}},setAreas:function(t){t&&(this.areas=f(t,function(t){return $m(this.option,t)},this))},setBrushOption:function(t){this.brushOption=$m(this.option,t),this.brushType=this.brushOption.brushType}});ms({type:"brush",init:function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new yd(e.getZr())).on("brush",m(this._onBrush,this)).mount()},render:function(t){return this.model=t,Km.apply(this,arguments)},updateView:Km,dispose:function(){this._brushController.dispose()},_onBrush:function(t,e){var n=this.model.id;this.model.brushTargetManager.setOutputRanges(t,this.ecModel),(!e.isEnd||e.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:n,areas:i(t),$from:n})}}),hs({type:"brush",event:"brush"},function(t,e){e.eachComponent({mainType:"brush",query:t},function(e){e.setAreas(t.areas)})}),hs({type:"brushSelect",event:"brushSelected",update:"none"},function(){});var Ok={},Nk=wM.toolbox.brush;tv.defaultOption={show:!0,type:["rect","polygon","lineX","lineY","keep","clear"],icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:i(Nk.title)};var Ek=tv.prototype;Ek.render=Ek.updateView=function(t,e,i){var n,o,a;e.eachComponent({mainType:"brush"},function(t){n=t.brushType,o=t.brushOption.brushMode||"single",a|=t.areas.length}),this._brushType=n,this._brushMode=o,d(t.get("type",!0),function(e){t.setIconStatus(e,("keep"===e?"multiple"===o:"clear"===e?a:e===n)?"emphasis":"normal")})},Ek.getIcons=function(){var t=this.model,e=t.get("icon",!0),i={};return d(t.get("type",!0),function(t){e[t]&&(i[t]=e[t])}),i},Ek.onclick=function(t,e,i){var n=this._brushType,o=this._brushMode;"clear"===i?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===i?n:n!==i&&i,brushMode:"keep"===i?"multiple"===o?"single":"multiple":o}})},Jm("brush",tv),ss(function(t,e){var i=t&&t.brush;if(y(i)||(i=i?[i]:[]),i.length){var n=[];d(i,function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(n=n.concat(e))});var o=t&&t.toolbox;y(o)&&(o=o[0]),o||(o={feature:{}},t.toolbox=[o]);var a=o.feature||(o.feature={}),r=a.brush||(a.brush={}),s=r.type||(r.type=[]);s.push.apply(s,n),Mm(s),e&&!s.length&&s.push.apply(s,fk)}});ev.prototype={constructor:ev,type:"calendar",dimensions:["time","value"],getDimensionsInfo:function(){return[{name:"time",type:"time"}]},getRangeInfo:function(){return this._rangeInfo},getModel:function(){return this._model},getRect:function(){return this._rect},getCellWidth:function(){return this._sw},getCellHeight:function(){return this._sh},getOrient:function(){return this._orient},getFirstDayOfWeek:function(){return this._firstDayOfWeek},getDateInfo:function(t){var e=(t=Eo(t)).getFullYear(),i=t.getMonth()+1;i=i<10?"0"+i:i;var n=t.getDate();n=n<10?"0"+n:n;var o=t.getDay();return o=Math.abs((o+7-this.getFirstDayOfWeek())%7),{y:e,m:i,d:n,day:o,time:t.getTime(),formatedDate:e+"-"+i+"-"+n,date:t}},getNextNDay:function(t,e){return 0===(e=e||0)?this.getDateInfo(t):((t=new Date(this.getDateInfo(t).time)).setDate(t.getDate()+e),this.getDateInfo(t))},update:function(t,e){function i(t,e){return null!=t[e]&&"auto"!==t[e]}this._firstDayOfWeek=+this._model.getModel("dayLabel").get("firstDay"),this._orient=this._model.get("orient"),this._lineWidth=this._model.getModel("itemStyle").getItemStyle().lineWidth||0,this._rangeInfo=this._getRangeInfo(this._initRangeOption());var n=this._rangeInfo.weeks||1,o=["width","height"],a=this._model.get("cellSize").slice(),r=this._model.getBoxLayoutParams(),s="horizontal"===this._orient?[n,7]:[7,n];d([0,1],function(t){i(a,t)&&(r[o[t]]=a[t]*s[t])});var l={width:e.getWidth(),height:e.getHeight()},h=this._rect=Ko(r,l);d([0,1],function(t){i(a,t)||(a[t]=h[o[t]]/s[t])}),this._sw=a[0],this._sh=a[1]},dataToPoint:function(t,e){y(t)&&(t=t[0]),null==e&&(e=!0);var i=this.getDateInfo(t),n=this._rangeInfo,o=i.formatedDate;if(e&&!(i.time>=n.start.time&&i.time<=n.end.time))return[NaN,NaN];var a=i.day,r=this._getRangeInfo([n.start.time,o]).nthWeek;return"vertical"===this._orient?[this._rect.x+a*this._sw+this._sw/2,this._rect.y+r*this._sh+this._sh/2]:[this._rect.x+r*this._sw+this._sw/2,this._rect.y+a*this._sh+this._sh/2]},pointToData:function(t){var e=this.pointToDate(t);return e&&e.time},dataToRect:function(t,e){var i=this.dataToPoint(t,e);return{contentShape:{x:i[0]-(this._sw-this._lineWidth)/2,y:i[1]-(this._sh-this._lineWidth)/2,width:this._sw-this._lineWidth,height:this._sh-this._lineWidth},center:i,tl:[i[0]-this._sw/2,i[1]-this._sh/2],tr:[i[0]+this._sw/2,i[1]-this._sh/2],br:[i[0]+this._sw/2,i[1]+this._sh/2],bl:[i[0]-this._sw/2,i[1]+this._sh/2]}},pointToDate:function(t){var e=Math.floor((t[0]-this._rect.x)/this._sw)+1,i=Math.floor((t[1]-this._rect.y)/this._sh)+1,n=this._rangeInfo.range;return"vertical"===this._orient?this._getDateByWeeksAndDay(i,e-1,n):this._getDateByWeeksAndDay(e,i-1,n)},convertToPixel:v(iv,"dataToPoint"),convertFromPixel:v(iv,"pointToData"),_initRangeOption:function(){var t=this._model.get("range"),e=t;if(y(e)&&1===e.length&&(e=e[0]),/^\d{4}$/.test(e)&&(t=[e+"-01-01",e+"-12-31"]),/^\d{4}[\/|-]\d{1,2}$/.test(e)){var i=this.getDateInfo(e),n=i.date;n.setMonth(n.getMonth()+1);var o=this.getNextNDay(n,-1);t=[i.formatedDate,o.formatedDate]}/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(e)&&(t=[e,e]);var a=this._getRangeInfo(t);return a.start.time>a.end.time&&t.reverse(),t},_getRangeInfo:function(t){var e;(t=[this.getDateInfo(t[0]),this.getDateInfo(t[1])])[0].time>t[1].time&&(e=!0,t.reverse());var i=Math.floor(t[1].time/864e5)-Math.floor(t[0].time/864e5)+1,n=new Date(t[0].time),o=n.getDate(),a=t[1].date.getDate();if(n.setDate(o+i-1),n.getDate()!==a)for(var r=n.getTime()-t[1].time>0?1:-1;n.getDate()!==a&&(n.getTime()-t[1].time)*r>0;)i-=r,n.setDate(o+i-1);var s=Math.floor((i+t[0].day+6)/7),l=e?1-s:s-1;return e&&t.reverse(),{range:[t[0].formatedDate,t[1].formatedDate],start:t[0],end:t[1],allDay:i,weeks:s,nthWeek:l,fweek:t[0].day,lweek:t[1].day}},_getDateByWeeksAndDay:function(t,e,i){var n=this._getRangeInfo(i);if(t>n.weeks||0===t&&e<n.fweek||t===n.weeks&&e>n.lweek)return!1;var o=7*(t-1)-n.fweek+e,a=new Date(n.start.time);return a.setDate(n.start.d+o),this.getDateInfo(a)}},ev.dimensions=ev.prototype.dimensions,ev.getDimensionsInfo=ev.prototype.getDimensionsInfo,ev.create=function(t,e){var i=[];return t.eachComponent("calendar",function(n){var o=new ev(n,t,e);i.push(o),n.coordinateSystem=o}),t.eachSeries(function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("calendarIndex")||0])}),i},Aa.register("calendar",ev);var zk=IS.extend({type:"calendar",coordinateSystem:null,defaultOption:{zlevel:0,z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{color:"#fff",borderWidth:1,borderColor:"#ccc"},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",nameMap:"en",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",nameMap:"en",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},init:function(t,e,i,n){var o=ea(t);zk.superApply(this,"init",arguments),nv(t,o)},mergeOption:function(t,e){zk.superApply(this,"mergeOption",arguments),nv(this.option,t)}}),Rk={EN:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],CN:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},Bk={EN:["S","M","T","W","T","F","S"],CN:["日","一","二","三","四","五","六"]};ms({type:"calendar",_tlpoints:null,_blpoints:null,_firstDayOfMonth:null,_firstDayPoints:null,render:function(t,e,i){var n=this.group;n.removeAll();var o=t.coordinateSystem,a=o.getRangeInfo(),r=o.getOrient();this._renderDayRect(t,a,n),this._renderLines(t,a,r,n),this._renderYearText(t,a,r,n),this._renderMonthText(t,r,n),this._renderWeekText(t,a,r,n)},_renderDayRect:function(t,e,i){for(var n=t.coordinateSystem,o=t.getModel("itemStyle").getItemStyle(),a=n.getCellWidth(),r=n.getCellHeight(),s=e.start.time;s<=e.end.time;s=n.getNextNDay(s,1).time){var l=n.dataToRect([s],!1).tl,h=new Vb({shape:{x:l[0],y:l[1],width:a,height:r},cursor:"default",style:o});i.add(h)}},_renderLines:function(t,e,i,n){function o(e){a._firstDayOfMonth.push(r.getDateInfo(e)),a._firstDayPoints.push(r.dataToRect([e],!1).tl);var o=a._getLinePointsOfOneWeek(t,e,i);a._tlpoints.push(o[0]),a._blpoints.push(o[o.length-1]),l&&a._drawSplitline(o,s,n)}var a=this,r=t.coordinateSystem,s=t.getModel("splitLine.lineStyle").getLineStyle(),l=t.get("splitLine.show"),h=s.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var u=e.start,c=0;u.time<=e.end.time;c++){o(u.formatedDate),0===c&&(u=r.getDateInfo(e.start.y+"-"+e.start.m));var d=u.date;d.setMonth(d.getMonth()+1),u=r.getDateInfo(d)}o(r.getNextNDay(e.end.time,1).formatedDate),l&&this._drawSplitline(a._getEdgesPoints(a._tlpoints,h,i),s,n),l&&this._drawSplitline(a._getEdgesPoints(a._blpoints,h,i),s,n)},_getEdgesPoints:function(t,e,i){var n=[t[0].slice(),t[t.length-1].slice()],o="horizontal"===i?0:1;return n[0][o]=n[0][o]-e/2,n[1][o]=n[1][o]+e/2,n},_drawSplitline:function(t,e,i){var n=new Bb({z2:20,shape:{points:t},style:e});i.add(n)},_getLinePointsOfOneWeek:function(t,e,i){var n=t.coordinateSystem;e=n.getDateInfo(e);for(var o=[],a=0;a<7;a++){var r=n.getNextNDay(e.time,a),s=n.dataToRect([r.time],!1);o[2*r.day]=s.tl,o[2*r.day+1]=s["horizontal"===i?"bl":"tr"]}return o},_formatterLabel:function(t,e){return"string"==typeof t&&t?Uo(t,e):"function"==typeof t?t(e):e.nameMap},_yearTextPositionControl:function(t,e,i,n,o){e=e.slice();var a=["center","bottom"];"bottom"===n?(e[1]+=o,a=["center","top"]):"left"===n?e[0]-=o:"right"===n?(e[0]+=o,a=["center","top"]):e[1]-=o;var r=0;return"left"!==n&&"right"!==n||(r=Math.PI/2),{rotation:r,position:e,style:{textAlign:a[0],textVerticalAlign:a[1]}}},_renderYearText:function(t,e,i,n){var o=t.getModel("yearLabel");if(o.get("show")){var a=o.get("margin"),r=o.get("position");r||(r="horizontal"!==i?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],l=(s[0][0]+s[1][0])/2,h=(s[0][1]+s[1][1])/2,u="horizontal"===i?0:1,c={top:[l,s[u][1]],bottom:[l,s[1-u][1]],left:[s[1-u][0],h],right:[s[u][0],h]},d=e.start.y;+e.end.y>+e.start.y&&(d=d+"-"+e.end.y);var f=o.get("formatter"),p={start:e.start.y,end:e.end.y,nameMap:d},g=this._formatterLabel(f,p),m=new Cb({z2:30});io(m.style,o,{text:g}),m.attr(this._yearTextPositionControl(m,c[r],i,r,a)),n.add(m)}},_monthTextPositionControl:function(t,e,i,n,o){var a="left",r="top",s=t[0],l=t[1];return"horizontal"===i?(l+=o,e&&(a="center"),"start"===n&&(r="bottom")):(s+=o,e&&(r="middle"),"start"===n&&(a="right")),{x:s,y:l,textAlign:a,textVerticalAlign:r}},_renderMonthText:function(t,e,i){var n=t.getModel("monthLabel");if(n.get("show")){var o=n.get("nameMap"),r=n.get("margin"),s=n.get("position"),l=n.get("align"),h=[this._tlpoints,this._blpoints];_(o)&&(o=Rk[o.toUpperCase()]||[]);var u="start"===s?0:1,c="horizontal"===e?0:1;r="start"===s?-r:r;for(var d="center"===l,f=0;f<h[u].length-1;f++){var p=h[u][f].slice(),g=this._firstDayOfMonth[f];if(d){var m=this._firstDayPoints[f];p[c]=(m[c]+h[0][f+1][c])/2}var v=n.get("formatter"),y=o[+g.m-1],x={yyyy:g.y,yy:(g.y+"").slice(2),MM:g.m,M:+g.m,nameMap:y},w=this._formatterLabel(v,x),b=new Cb({z2:30});a(io(b.style,n,{text:w}),this._monthTextPositionControl(p,d,e,s,r)),i.add(b)}}},_weekTextPositionControl:function(t,e,i,n,o){var a="center",r="middle",s=t[0],l=t[1],h="start"===i;return"horizontal"===e?(s=s+n+(h?1:-1)*o[0]/2,a=h?"right":"left"):(l=l+n+(h?1:-1)*o[1]/2,r=h?"bottom":"top"),{x:s,y:l,textAlign:a,textVerticalAlign:r}},_renderWeekText:function(t,e,i,n){var o=t.getModel("dayLabel");if(o.get("show")){var r=t.coordinateSystem,s=o.get("position"),l=o.get("nameMap"),h=o.get("margin"),u=r.getFirstDayOfWeek();_(l)&&(l=Bk[l.toUpperCase()]||[]);var c=r.getNextNDay(e.end.time,7-e.lweek).time,d=[r.getCellWidth(),r.getCellHeight()];h=To(h,d["horizontal"===i?0:1]),"start"===s&&(c=r.getNextNDay(e.start.time,-(7+e.fweek)).time,h=-h);for(var f=0;f<7;f++){var p=r.getNextNDay(c,f),g=r.dataToRect([p.time],!1).center,m=f;m=Math.abs((f+u)%7);var v=new Cb({z2:30});a(io(v.style,o,{text:l[m]}),this._weekTextPositionControl(g,i,s,h,d)),n.add(v)}}}}),gs({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),ms({type:"title",render:function(t,e,i){if(this.group.removeAll(),t.get("show")){var n=this.group,o=t.getModel("textStyle"),a=t.getModel("subtextStyle"),r=t.get("textAlign"),s=t.get("textBaseline"),l=new Cb({style:io({},o,{text:t.get("text"),textFill:o.getTextColor()},{disableBox:!0}),z2:10}),h=l.getBoundingRect(),u=t.get("subtext"),c=new Cb({style:io({},a,{text:u,textFill:a.getTextColor(),y:h.height+t.get("itemGap"),textVerticalAlign:"top"},{disableBox:!0}),z2:10}),d=t.get("link"),f=t.get("sublink");l.silent=!d,c.silent=!f,d&&l.on("click",function(){window.open(d,"_"+t.get("target"))}),f&&c.on("click",function(){window.open(f,"_"+t.get("subtarget"))}),n.add(l),u&&n.add(c);var p=n.getBoundingRect(),g=t.getBoxLayoutParams();g.width=p.width,g.height=p.height;var m=Ko(g,{width:i.getWidth(),height:i.getHeight()},t.get("padding"));r||("middle"===(r=t.get("left")||t.get("right"))&&(r="center"),"right"===r?m.x+=m.width:"center"===r&&(m.x+=m.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?m.y+=m.height:"middle"===s&&(m.y+=m.height/2),s=s||"top"),n.attr("position",[m.x,m.y]);var v={textAlign:r,textVerticalAlign:s};l.setStyle(v),c.setStyle(v),p=n.getBoundingRect();var y=m.margin,x=t.getItemStyle(["color","opacity"]);x.fill=t.get("backgroundColor");var _=new Vb({shape:{x:p.x-y[3],y:p.y-y[0],width:p.width+y[1]+y[3],height:p.height+y[0]+y[2],r:t.get("borderRadius")},style:x,silent:!0});Gn(_),n.add(_)}}}),IS.registerSubTypeDefaulter("dataZoom",function(){return"slider"});var Vk=["cartesian2d","polar","singleAxis"],Gk=function(t,e){var i=f(t=t.slice(),Yo),n=f(e=(e||[]).slice(),Yo);return function(o,a){d(t,function(t,r){for(var s={name:t,capital:i[r]},l=0;l<e.length;l++)s[e[l]]=t+n[l];o.call(a,s)})}}(["x","y","z","radius","angle","single"],["axisIndex","axis","index","id"]),Wk=d,Fk=Do,Hk=function(t,e,i,n){this._dimName=t,this._axisIndex=e,this._valueWindow,this._percentWindow,this._dataExtent,this._minMaxSpan,this.ecModel=n,this._dataZoomModel=i,this.hasSeriesStacked};Hk.prototype={constructor:Hk,hostedBy:function(t){return this._dataZoomModel===t},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var t=[],e=this.ecModel;return e.eachSeries(function(i){if(ov(i.get("coordinateSystem"))){var n=this._dimName,o=e.queryComponents({mainType:n+"Axis",index:i.get(n+"AxisIndex"),id:i.get(n+"AxisId")})[0];this._axisIndex===(o&&o.componentIndex)&&t.push(i)}},this),t},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},getOtherAxisModel:function(){var t,e,i=this._dimName,n=this.ecModel,o=this.getAxisModel();"x"===i||"y"===i?(e="gridIndex",t="x"===i?"y":"x"):(e="polarIndex",t="angle"===i?"radius":"angle");var a;return n.eachComponent(t+"Axis",function(t){(t.get(e)||0)===(o.get(e)||0)&&(a=t)}),a},getMinMaxSpan:function(){return i(this._minMaxSpan)},calculateDataWindow:function(t){var e=this._dataExtent,i=this.getAxisModel().axis.scale,n=this._dataZoomModel.getRangePropMode(),o=[0,100],a=[t.start,t.end],r=[];return Wk(["startValue","endValue"],function(e){r.push(null!=t[e]?i.parse(t[e]):null)}),Wk([0,1],function(t){var s=r[t],l=a[t];"percent"===n[t]?(null==l&&(l=o[t]),s=i.parse(Io(l,o,e,!0))):l=Io(s,e,o,!0),r[t]=s,a[t]=l}),{valueWindow:Fk(r),percentWindow:Fk(a)}},reset:function(t){if(t===this._dataZoomModel){var e=this.getTargetSeriesModels();this._dataExtent=rv(this,this._dimName,e),this.hasSeriesStacked=!1,Wk(e,function(t){var e=t.getData(),i=e.mapDimension(this._dimName);e.isStacked(i)&&(this.hasSeriesStacked=!0)},this);var i=this.calculateDataWindow(t.option);this._valueWindow=i.valueWindow,this._percentWindow=i.percentWindow,hv(this),lv(this)}},restore:function(t){t===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,lv(this,!0))},filterData:function(t,e){function i(t){return t>=r[0]&&t<=r[1]}if(t===this._dataZoomModel){var n=this._dimName,o=this.getTargetSeriesModels(),a=t.get("filterMode"),r=this._valueWindow;if("none"!==a){var s=this.getOtherAxisModel();t.get("$fromToolbox")&&s&&s.hasSeriesStacked&&(a="empty"),Wk(o,function(t){var e=t.getData(),o=e.mapDimension(n,!0);"weakFilter"===a?e.filterSelf(function(t){for(var i,n,a,s=0;s<o.length;s++){var l=e.get(o[s],t),h=!isNaN(l),u=l<r[0],c=l>r[1];if(h&&!u&&!c)return!0;h&&(a=!0),u&&(i=!0),c&&(n=!0)}return a&&i&&n}):Wk(o,function(n){if("empty"===a)t.setData(e.map(n,function(t){return i(t)?t:NaN}));else{var o={};o[n]=r,e.selectRange(o)}}),Wk(o,function(t){e.setApproximateExtent(r,t)})})}}}};var Zk=d,Uk=Gk,jk=gs({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null,minSpan:null,maxSpan:null,minValueSpan:null,maxValueSpan:null,rangeMode:null},init:function(t,e,i){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0,this._rangePropMode=["percent","percent"];var n=uv(t);this.mergeDefaultAndTheme(t,i),this.doInit(n)},mergeOption:function(t){var e=uv(t);n(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;_x.canvasSupported||(e.realtime=!1),this._setDefaultThrottle(t),cv(this,t),Zk([["start","startValue"],["end","endValue"]],function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=null)},this),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,i,n,o){var a=this.dependentModels[e.axis][i],r=a.__dzAxisProxy||(a.__dzAxisProxy=new Hk(e.name,i,this,o));t[e.name+"_"+i]=r},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();Uk(function(e){var i=e.axisIndex;t[i]=Si(t[i])},this),"axisIndex"===e?this._autoSetAxisIndex():"orient"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;Uk(function(i){null!=t[i.axisIndex]&&(e=!0)},this);var i=t.orient;return null==i&&e?"orient":e?void 0:(null==i&&(t.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var t=!0,e=this.get("orient",!0),i=this.option,n=this.dependentModels;if(t){var o="vertical"===e?"y":"x";n[o+"Axis"].length?(i[o+"AxisIndex"]=[0],t=!1):Zk(n.singleAxis,function(n){t&&n.get("orient",!0)===e&&(i.singleAxisIndex=[n.componentIndex],t=!1)})}t&&Uk(function(e){if(t){var n=[],o=this.dependentModels[e.axis];if(o.length&&!n.length)for(var a=0,r=o.length;a<r;a++)"category"===o[a].get("type")&&n.push(a);i[e.axisIndex]=n,n.length&&(t=!1)}},this),t&&this.ecModel.eachSeries(function(t){this._isSeriesHasAllAxesTypeOf(t,"value")&&Uk(function(e){var n=i[e.axisIndex],o=t.get(e.axisIndex),a=t.get(e.axisId);l(n,o=t.ecModel.queryComponents({mainType:e.axis,index:o,id:a})[0].componentIndex)<0&&n.push(o)})},this)},_autoSetOrient:function(){var t;this.eachTargetAxis(function(e){!t&&(t=e.name)},this),this.option.orient="y"===t?"vertical":"horizontal"},_isSeriesHasAllAxesTypeOf:function(t,e){var i=!0;return Uk(function(n){var o=t.get(n.axisIndex),a=this.dependentModels[n.axis][o];a&&a.get("type")===e||(i=!1)},this),i},_setDefaultThrottle:function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},getFirstTargetAxisModel:function(){var t;return Uk(function(e){if(null==t){var i=this.get(e.axisIndex);i.length&&(t=this.dependentModels[e.axis][i[0]])}},this),t},eachTargetAxis:function(t,e){var i=this.ecModel;Uk(function(n){Zk(this.get(n.axisIndex),function(o){t.call(e,n,o,this,i)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+"_"+e]},getAxisModel:function(t,e){var i=this.getAxisProxy(t,e);return i&&i.getAxisModel()},setRawRange:function(t,e){var i=this.option;Zk([["start","startValue"],["end","endValue"]],function(e){null==t[e[0]]&&null==t[e[1]]||(i[e[0]]=t[e[0]],i[e[1]]=t[e[1]])},this),!e&&cv(this,t)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var i=this.findRepresentativeAxisProxy();return i?i.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(t){if(t)return t.__dzAxisProxy;var e=this._axisProxies;for(var i in e)if(e.hasOwnProperty(i)&&e[i].hostedBy(this))return e[i];for(var i in e)if(e.hasOwnProperty(i)&&!e[i].hostedBy(this))return e[i]},getRangePropMode:function(){return this._rangePropMode.slice()}}),Xk=cM.extend({type:"dataZoom",render:function(t,e,i,n){this.dataZoomModel=t,this.ecModel=e,this.api=i},getTargetCoordInfo:function(){function t(t,e,i,n){for(var o,a=0;a<i.length;a++)if(i[a].model===t){o=i[a];break}o||i.push(o={model:t,axisModels:[],coordIndex:n}),o.axisModels.push(e)}var e=this.dataZoomModel,i=this.ecModel,n={};return e.eachTargetAxis(function(e,o){var a=i.getComponent(e.axis,o);if(a){var r=a.getCoordSysModel();r&&t(r,a,n[r.mainType]||(n[r.mainType]=[]),r.componentIndex)}},this),n}}),Yk=(jk.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#2f4554",width:.5,opacity:.3},areaStyle:{color:"rgba(47,69,84,0.3)",opacity:.3}},borderColor:"#ddd",fillerColor:"rgba(167,183,204,0.4)",handleIcon:"M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z",handleSize:"100%",handleStyle:{color:"#a7b7cc"},labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}}}),Vb),qk=Io,$k=Do,Kk=m,Jk=d,Qk="horizontal",tP=5,eP=["line","bar","candlestick","scatter"],iP=Xk.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,i,n){iP.superApply(this,"render",arguments),yr(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),!1!==this.dataZoomModel.get("show")?(n&&"dataZoom"===n.type&&n.from===this.uid||this._buildView(),this._updateView()):this.group.removeAll()},remove:function(){iP.superApply(this,"remove",arguments),xr(this,"_dispatchZoomAction")},dispose:function(){iP.superApply(this,"dispose",arguments),xr(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new S_;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,i=this._findCoordRect(),n={width:e.getWidth(),height:e.getHeight()},o=this._orient===Qk?{right:n.width-i.x-i.width,top:n.height-30-7,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},a=ea(t.option);d(["right","top","width","height"],function(t){"ph"===a[t]&&(a[t]=o[t])});var r=Ko(a,n,t.padding);this._location={x:r.x,y:r.y},this._size=[r.width,r.height],"vertical"===this._orient&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,i=this._orient,n=this.dataZoomModel.getFirstTargetAxisModel(),o=n&&n.get("inverse"),a=this._displayables.barGroup,r=(this._dataShadowInfo||{}).otherAxisInverse;a.attr(i!==Qk||o?i===Qk&&o?{scale:r?[-1,1]:[-1,-1]}:"vertical"!==i||o?{scale:r?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:r?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:r?[1,1]:[1,-1]});var s=t.getBoundingRect([a]);t.attr("position",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size,i=this._displayables.barGroup;i.add(new Yk({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40})),i.add(new Yk({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:m(this._onClickPanelClick,this)}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,i=t.series,n=i.getRawData(),o=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=o){var a=n.getDataExtent(o),s=.3*(a[1]-a[0]);a=[a[0]-s,a[1]+s];var l,h=[0,e[1]],u=[0,e[0]],c=[[e[0],0],[0,0]],d=[],f=u[1]/(n.count()-1),p=0,g=Math.round(n.count()/e[0]);n.each([o],function(t,e){if(g>0&&e%g)p+=f;else{var i=null==t||isNaN(t)||""===t,n=i?0:qk(t,a,h,!0);i&&!l&&e?(c.push([c[c.length-1][0],0]),d.push([d[d.length-1][0],0])):!i&&l&&(c.push([p,0]),d.push([p,0])),c.push([p,n]),d.push([p,n]),p+=f,l=i}});var m=this.dataZoomModel;this._displayables.barGroup.add(new Rb({shape:{points:c},style:r({fill:m.get("dataBackgroundColor")},m.getModel("dataBackground.areaStyle").getAreaStyle()),silent:!0,z2:-20})),this._displayables.barGroup.add(new Bb({shape:{points:d},style:m.getModel("dataBackground.lineStyle").getLineStyle(),silent:!0,z2:-19}))}}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(!1!==e){var i,n=this.ecModel;return t.eachTargetAxis(function(o,a){d(t.getAxisProxy(o.name,a).getTargetSeriesModels(),function(t){if(!(i||!0!==e&&l(eP,t.get("type"))<0)){var r,s=n.getComponent(o.axis,a).axis,h=dv(o.name),u=t.coordinateSystem;null!=h&&u.getOtherAxis&&(r=u.getOtherAxis(s).inverse),h=t.getData().mapDimension(h),i={thisAxis:s,series:t,thisDim:o.name,otherDim:h,otherAxisInverse:r}}},this)},this),i}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],i=t.handleLabels=[],n=this._displayables.barGroup,o=this._size,a=this.dataZoomModel;n.add(t.filler=new Yk({draggable:!0,cursor:fv(this._orient),drift:Kk(this._onDragMove,this,"all"),onmousemove:function(t){Q_(t.event)},ondragstart:Kk(this._showDataInfo,this,!0),ondragend:Kk(this._onDragEnd,this),onmouseover:Kk(this._showDataInfo,this,!0),onmouseout:Kk(this._showDataInfo,this,!1),style:{fill:a.get("fillerColor"),textPosition:"inside"}})),n.add(new Yk(Gn({silent:!0,shape:{x:0,y:0,width:o[0],height:o[1]},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}}))),Jk([0,1],function(t){var o=xo(a.get("handleIcon"),{cursor:fv(this._orient),draggable:!0,drift:Kk(this._onDragMove,this,t),onmousemove:function(t){Q_(t.event)},ondragend:Kk(this._onDragEnd,this),onmouseover:Kk(this._showDataInfo,this,!0),onmouseout:Kk(this._showDataInfo,this,!1)},{x:-1,y:0,width:2,height:2}),r=o.getBoundingRect();this._handleHeight=To(a.get("handleSize"),this._size[1]),this._handleWidth=r.width/r.height*this._handleHeight,o.setStyle(a.getModel("handleStyle").getItemStyle());var s=a.get("handleColor");null!=s&&(o.style.fill=s),n.add(e[t]=o);var l=a.textStyleModel;this.group.add(i[t]=new Cb({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",textFill:l.getTextColor(),textFont:l.getFont()},z2:10}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[qk(t[0],[0,100],e,!0),qk(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var i=this.dataZoomModel,n=this._handleEnds,o=this._getViewExtent(),a=i.findRepresentativeAxisProxy().getMinMaxSpan(),r=[0,100];jD(e,n,o,i.get("zoomLock")?"all":t,null!=a.minSpan?qk(a.minSpan,r,o,!0):null,null!=a.maxSpan?qk(a.maxSpan,r,o,!0):null),this._range=$k([qk(n[0],o,r,!0),qk(n[1],o,r,!0)])},_updateView:function(t){var e=this._displayables,i=this._handleEnds,n=$k(i.slice()),o=this._size;Jk([0,1],function(t){var n=e.handles[t],a=this._handleHeight;n.attr({scale:[a/2,a/2],position:[i[t],o[1]/2-a/2]})},this),e.filler.setShape({x:n[0],y:0,width:n[1]-n[0],height:o[1]}),this._updateDataInfo(t)},_updateDataInfo:function(t){function e(t){var e=po(n.handles[t].parent,this.group),i=mo(0===t?"right":"left",e),s=this._handleWidth/2+tP,l=go([c[t]+(0===t?-s:s),this._size[1]/2],e);o[t].setStyle({x:l[0],y:l[1],textVerticalAlign:a===Qk?"middle":i,textAlign:a===Qk?i:"center",text:r[t]})}var i=this.dataZoomModel,n=this._displayables,o=n.handleLabels,a=this._orient,r=["",""];if(i.get("showDetail")){var s=i.findRepresentativeAxisProxy();if(s){var l=s.getAxisModel().axis,h=this._range,u=t?s.calculateDataWindow({start:h[0],end:h[1]}).valueWindow:s.getDataValueWindow();r=[this._formatLabel(u[0],l),this._formatLabel(u[1],l)]}}var c=$k(this._handleEnds.slice());e.call(this,0),e.call(this,1)},_formatLabel:function(t,e){var i=this.dataZoomModel,n=i.get("labelFormatter"),o=i.get("labelPrecision");null!=o&&"auto"!==o||(o=e.getPixelPrecision());var a=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(o,20));return x(n)?n(t,a):_(n)?n.replace("{value}",a):a},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr("invisible",!t),e[1].attr("invisible",!t)},_onDragMove:function(t,e,i){this._dragging=!0;var n=go([e,i],this._displayables.barGroup.getLocalTransform(),!0);this._updateInterval(t,n[0]);var o=this.dataZoomModel.get("realtime");this._updateView(!o),o&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),!this.dataZoomModel.get("realtime")&&this._dispatchZoomAction()},_onClickPanelClick:function(t){var e=this._size,i=this._displayables.barGroup.transformCoordToLocal(t.offsetX,t.offsetY);if(!(i[0]<0||i[0]>e[0]||i[1]<0||i[1]>e[1])){var n=this._handleEnds,o=(n[0]+n[1])/2;this._updateInterval("all",i[0]-o),this._updateView(),this._dispatchZoomAction()}},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_findCoordRect:function(){var t;if(Jk(this.getTargetCoordInfo(),function(e){if(!t&&e.length){var i=e[0].model.coordinateSystem;t=i.getRect&&i.getRect()}}),!t){var e=this.api.getWidth(),i=this.api.getHeight();t={x:.2*e,y:.2*i,width:.6*e,height:.6*i}}return t}});jk.extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,preventDefaultMouseMove:!0}});var nP=v,oP="\0_ec_dataZoom_roams",aP=m,rP=Xk.extend({type:"dataZoom.inside",init:function(t,e){this._range},render:function(t,e,i,n){rP.superApply(this,"render",arguments),mv(n,t.id)&&(this._range=t.getPercentRange()),d(this.getTargetCoordInfo(),function(e,n){var o=f(e,function(t){return vv(t.model)});d(e,function(e){var a=e.model,r=t.option;pv(i,{coordId:vv(a),allCoordIds:o,containsPoint:function(t,e,i){return a.coordinateSystem.containPoint([e,i])},dataZoomId:t.id,throttleRate:t.get("throttle",!0),panGetRange:aP(this._onPan,this,e,n),zoomGetRange:aP(this._onZoom,this,e,n),zoomLock:r.zoomLock,disabled:r.disabled,roamControllerOpt:{zoomOnMouseWheel:r.zoomOnMouseWheel,moveOnMouseMove:r.moveOnMouseMove,preventDefaultMouseMove:r.preventDefaultMouseMove}})},this)},this)},dispose:function(){gv(this.api,this.dataZoomModel.id),rP.superApply(this,"dispose",arguments),this._range=null},_onPan:function(t,e,i,n,o,a,r,s,l){var h=this._range.slice(),u=t.axisModels[0];if(u){var c=sP[e]([a,r],[s,l],u,i,t),d=c.signal*(h[1]-h[0])*c.pixel/c.pixelLength;return jD(d,h,[0,100],"all"),this._range=h}},_onZoom:function(t,e,i,n,o,a){var r=this._range.slice(),s=t.axisModels[0];if(s){var l=sP[e](null,[o,a],s,i,t),h=(l.signal>0?l.pixelStart+l.pixelLength-l.pixel:l.pixel-l.pixelStart)/l.pixelLength*(r[1]-r[0])+r[0];n=Math.max(1/n,0),r[0]=(r[0]-h)*n+h,r[1]=(r[1]-h)*n+h;var u=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return jD(0,r,[0,100],0,u.minSpan,u.maxSpan),this._range=r}}}),sP={grid:function(t,e,i,n,o){var a=i.axis,r={},s=o.model.coordinateSystem.getRect();return t=t||[0,0],"x"===a.dim?(r.pixel=e[0]-t[0],r.pixelLength=s.width,r.pixelStart=s.x,r.signal=a.inverse?1:-1):(r.pixel=e[1]-t[1],r.pixelLength=s.height,r.pixelStart=s.y,r.signal=a.inverse?-1:1),r},polar:function(t,e,i,n,o){var a=i.axis,r={},s=o.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),h=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===i.mainType?(r.pixel=e[0]-t[0],r.pixelLength=l[1]-l[0],r.pixelStart=l[0],r.signal=a.inverse?1:-1):(r.pixel=e[1]-t[1],r.pixelLength=h[1]-h[0],r.pixelStart=h[0],r.signal=a.inverse?-1:1),r},singleAxis:function(t,e,i,n,o){var a=i.axis,r=o.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===a.orient?(s.pixel=e[0]-t[0],s.pixelLength=r.width,s.pixelStart=r.x,s.signal=a.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=r.height,s.pixelStart=r.y,s.signal=a.inverse?-1:1),s}};ls({getTargetSeries:function(t){var e=z();return t.eachComponent("dataZoom",function(t){t.eachTargetAxis(function(t,i,n){d(n.getAxisProxy(t.name,i).getTargetSeriesModels(),function(t){e.set(t.uid,t)})})}),e},isOverallFilter:!0,overallReset:function(t,e){t.eachComponent("dataZoom",function(t){t.eachTargetAxis(function(t,i,n){n.getAxisProxy(t.name,i).reset(n,e)}),t.eachTargetAxis(function(t,i,n){n.getAxisProxy(t.name,i).filterData(n,e)})}),t.eachComponent("dataZoom",function(t){var e=t.findRepresentativeAxisProxy(),i=e.getDataPercentWindow(),n=e.getDataValueWindow();t.setRawRange({start:i[0],end:i[1],startValue:n[0],endValue:n[1]},!0)})}}),hs("dataZoom",function(t,e){var i=av(m(e.eachComponent,e,"dataZoom"),Gk,function(t,e){return t.get(e.axisIndex)}),n=[];e.eachComponent({mainType:"dataZoom",query:t},function(t,e){n.push.apply(n,i(t).nodes)}),d(n,function(e,i){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})})});var lP=d,hP=function(t){var e=t&&t.visualMap;y(e)||(e=e?[e]:[]),lP(e,function(t){if(t){Tv(t,"splitList")&&!Tv(t,"pieces")&&(t.pieces=t.splitList,delete t.splitList);var e=t.pieces;e&&y(e)&&lP(e,function(t){w(t)&&(Tv(t,"start")&&!Tv(t,"min")&&(t.min=t.start),Tv(t,"end")&&!Tv(t,"max")&&(t.max=t.end))})}})};IS.registerSubTypeDefaulter("visualMap",function(t){return t.categories||(t.pieces?t.pieces.length>0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"});var uP=FM.VISUAL.COMPONENT;ds(uP,{createOnAllSeries:!0,reset:function(t,e){var i=[];return e.eachComponent("visualMap",function(e){e.isTargetSeries(t)&&i.push(Cm(e.stateList,e.targetVisuals,m(e.getValueState,e),e.getDataDimension(t.getData())))}),i}}),ds(uP,{createOnAllSeries:!0,reset:function(t,e){var i=t.getData(),n=[];e.eachComponent("visualMap",function(e){if(e.isTargetSeries(t)){var o=e.getVisualMeta(m(Av,null,t,e))||{stops:[],outerColors:[]},a=e.getDataDimension(i),r=i.getDimensionInfo(a);null!=r&&(o.dimension=r.index,n.push(o))}}),t.getData().setVisual("visualMeta",n)}});var cP={get:function(t,e,n){var o=i((dP[t]||{})[e]);return n&&y(o)?o[o.length-1]:o}},dP={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}},fP=oD.mapVisual,pP=oD.eachVisual,gP=y,mP=d,vP=Do,yP=Io,xP=B,_P=gs({type:"visualMap",dependencies:["series"],stateList:["inRange","outOfRange"],replacableOptionKeys:["inRange","outOfRange","target","controller","color"],dataBound:[-1/0,1/0],layoutMode:{type:"box",ignoreSize:!0},defaultOption:{show:!0,zlevel:0,z:4,seriesIndex:"all",min:0,max:200,dimension:null,inRange:null,outOfRange:null,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,color:null,formatter:null,text:null,textStyle:{color:"#333"}},init:function(t,e,i){this._dataExtent,this.targetVisuals={},this.controllerVisuals={},this.textStyleModel,this.itemSize,this.mergeDefaultAndTheme(t,i)},optionUpdated:function(t,e){var i=this.option;_x.canvasSupported||(i.realtime=!1),!e&&Am(i,t,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},resetVisual:function(t){var e=this.stateList;t=m(t,this),this.controllerVisuals=Tm(this.option.controller,e,t),this.targetVisuals=Tm(this.option.target,e,t)},getTargetSeriesIndices:function(){var t=this.option.seriesIndex,e=[];return null==t||"all"===t?this.ecModel.eachSeries(function(t,i){e.push(i)}):e=Si(t),e},eachTargetSeries:function(t,e){d(this.getTargetSeriesIndices(),function(i){t.call(e,this.ecModel.getSeriesByIndex(i))},this)},isTargetSeries:function(t){var e=!1;return this.eachTargetSeries(function(i){i===t&&(e=!0)}),e},formatValueText:function(t,e,i){function n(t){return t===l[0]?"min":t===l[1]?"max":(+t).toFixed(Math.min(s,20))}var o,a,r=this.option,s=r.precision,l=this.dataBound,h=r.formatter;return i=i||["<",">"],y(t)&&(t=t.slice(),o=!0),a=e?t:o?[n(t[0]),n(t[1])]:n(t),_(h)?h.replace("{value}",o?a[0]:a).replace("{value2}",o?a[1]:a):x(h)?o?h(t[0],t[1]):h(t):o?t[0]===l[0]?i[0]+" "+a[1]:t[1]===l[1]?i[1]+" "+a[0]:a[0]+" - "+a[1]:a},resetExtent:function(){var t=this.option,e=vP([t.min,t.max]);this._dataExtent=e},getDataDimension:function(t){var e=this.option.dimension,i=t.dimensions;if(null!=e||i.length)return t.getDimension(null!=e?e:i.length-1)},getExtent:function(){return this._dataExtent.slice()},completeVisualOption:function(){function t(t){gP(o.color)&&!t.inRange&&(t.inRange={color:o.color.slice().reverse()}),t.inRange=t.inRange||{color:e.get("gradientColor")},mP(this.stateList,function(e){var i=t[e];if(_(i)){var n=cP.get(i,"active",l);n?(t[e]={},t[e][i]=n):delete t[e]}},this)}var e=this.ecModel,o=this.option,a={inRange:o.inRange,outOfRange:o.outOfRange},r=o.target||(o.target={}),s=o.controller||(o.controller={});n(r,a),n(s,a);var l=this.isCategory();t.call(this,r),t.call(this,s),function(t,e,i){var n=t[e],o=t[i];n&&!o&&(o=t[i]={},mP(n,function(t,e){if(oD.isValidType(e)){var i=cP.get(e,"inactive",l);null!=i&&(o[e]=i,"color"!==e||o.hasOwnProperty("opacity")||o.hasOwnProperty("colorAlpha")||(o.opacity=[0,0]))}}))}.call(this,r,"inRange","outOfRange"),function(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,n=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,o=this.get("inactiveColor");mP(this.stateList,function(a){var r=this.itemSize,s=t[a];s||(s=t[a]={color:l?o:[o]}),null==s.symbol&&(s.symbol=e&&i(e)||(l?"roundRect":["roundRect"])),null==s.symbolSize&&(s.symbolSize=n&&i(n)||(l?r[0]:[r[0],r[0]])),s.symbol=fP(s.symbol,function(t){return"none"===t||"square"===t?"roundRect":t});var h=s.symbolSize;if(null!=h){var u=-1/0;pP(h,function(t){t>u&&(u=t)}),s.symbolSize=fP(h,function(t){return yP(t,[0,u],[0,r[0]],!0)})}},this)}.call(this,s)},resetItemSize:function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},isCategory:function(){return!!this.option.categories},setSelected:xP,getValueState:xP,getVisualMeta:xP}),wP=[20,140],bP=_P.extend({type:"visualMap.continuous",defaultOption:{align:"auto",calculable:!1,range:null,realtime:!0,itemHeight:null,itemWidth:null,hoverLink:!0,hoverLinkDataSize:null,hoverLinkOnHandle:null},optionUpdated:function(t,e){bP.superApply(this,"optionUpdated",arguments),this.resetExtent(),this.resetVisual(function(t){t.mappingMethod="linear",t.dataExtent=this.getExtent()}),this._resetRange()},resetItemSize:function(){bP.superApply(this,"resetItemSize",arguments);var t=this.itemSize;"horizontal"===this._orient&&t.reverse(),(null==t[0]||isNaN(t[0]))&&(t[0]=wP[0]),(null==t[1]||isNaN(t[1]))&&(t[1]=wP[1])},_resetRange:function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):y(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},completeVisualOption:function(){_P.prototype.completeVisualOption.apply(this,arguments),d(this.stateList,function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=0)},this)},setSelected:function(t){this.option.range=t.slice(),this._resetRange()},getSelected:function(){var t=this.getExtent(),e=Do((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]<t[0]&&(e[0]=t[0]),e[1]<t[0]&&(e[1]=t[0]),e},getValueState:function(t){var e=this.option.range,i=this.getExtent();return(e[0]<=i[0]||e[0]<=t)&&(e[1]>=i[1]||t<=e[1])?"inRange":"outOfRange"},findTargetDataIndices:function(t){var e=[];return this.eachTargetSeries(function(i){var n=[],o=i.getData();o.each(this.getDataDimension(o),function(e,i){t[0]<=e&&e<=t[1]&&n.push(i)},!0,this),e.push({seriesId:i.id,dataIndex:n})},this),e},getVisualMeta:function(t){function e(e,i){o.push({value:e,color:t(e,i)})}for(var i=Dv(0,0,this.getExtent()),n=Dv(0,0,this.option.range.slice()),o=[],a=0,r=0,s=n.length,l=i.length;r<l&&(!n.length||i[r]<=n[0]);r++)i[r]<n[a]&&e(i[r],"outOfRange");for(h=1;a<s;a++,h=0)h&&o.length&&e(n[a],"outOfRange"),e(n[a],"inRange");for(var h=1;r<l;r++)(!n.length||n[n.length-1]<i[r])&&(h&&(o.length&&e(o[o.length-1].value,"outOfRange"),h=0),e(i[r],"outOfRange"));var u=o.length;return{stops:o,outerColors:[u?o[0].color:"transparent",u?o[u-1].color:"transparent"]}}}),SP=ms({type:"visualMap",autoPositionValues:{left:1,right:1,top:1,bottom:1},init:function(t,e){this.ecModel=t,this.api=e,this.visualMapModel},render:function(t,e,i,n){this.visualMapModel=t,!1!==t.get("show")?this.doRender.apply(this,arguments):this.group.removeAll()},renderBackground:function(t){var e=this.visualMapModel,i=dS(e.get("padding")||0),n=t.getBoundingRect();t.add(new Vb({z2:-1,silent:!0,shape:{x:n.x-i[3],y:n.y-i[0],width:n.width+i[3]+i[1],height:n.height+i[0]+i[2]},style:{fill:e.get("backgroundColor"),stroke:e.get("borderColor"),lineWidth:e.get("borderWidth")}}))},getControllerVisual:function(t,e,i){function n(t){return s[t]}function o(t,e){s[t]=e}var a=(i=i||{}).forceState,r=this.visualMapModel,s={};if("symbol"===e&&(s.symbol=r.get("itemSymbol")),"color"===e){var l=r.get("contentColor");s.color=l}var h=r.controllerVisuals[a||r.getValueState(t)];return d(oD.prepareVisualTypes(h),function(a){var r=h[a];i.convertOpacityToAlpha&&"opacity"===a&&(a="colorAlpha",r=h.__alphaForOpacity),oD.dependsOn(a,e)&&r&&r.applyVisual(t,n,o)}),s[e]},positionGroup:function(t){var e=this.visualMapModel,i=this.api;Jo(t,e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()})},doRender:B}),MP=Io,IP=d,TP=Math.min,AP=Math.max,DP=12,CP=6,LP=SP.extend({type:"visualMap.continuous",init:function(){LP.superApply(this,"init",arguments),this._shapes={},this._dataInterval=[],this._handleEnds=[],this._orient,this._useHandle,this._hoverLinkDataIndices=[],this._dragging,this._hovering},doRender:function(t,e,i,n){n&&"selectDataRange"===n.type&&n.from===this.uid||this._buildView()},_buildView:function(){this.group.removeAll();var t=this.visualMapModel,e=this.group;this._orient=t.get("orient"),this._useHandle=t.get("calculable"),this._resetInterval(),this._renderBar(e);var i=t.get("text");this._renderEndsText(e,i,0),this._renderEndsText(e,i,1),this._updateView(!0),this.renderBackground(e),this._updateView(),this._enableHoverLinkToSeries(),this._enableHoverLinkFromSeries(),this.positionGroup(e)},_renderEndsText:function(t,e,i){if(e){var n=e[1-i];n=null!=n?n+"":"";var o=this.visualMapModel,a=o.get("textGap"),r=o.itemSize,s=this._shapes.barGroup,l=this._applyTransform([r[0]/2,0===i?-a:r[1]+a],s),h=this._applyTransform(0===i?"bottom":"top",s),u=this._orient,c=this.visualMapModel.textStyleModel;this.group.add(new Cb({style:{x:l[0],y:l[1],textVerticalAlign:"horizontal"===u?"middle":h,textAlign:"horizontal"===u?h:"center",text:n,textFont:c.getFont(),textFill:c.getTextColor()}}))}},_renderBar:function(t){var e=this.visualMapModel,i=this._shapes,n=e.itemSize,o=this._orient,a=this._useHandle,r=Cv(e,this.api,n),s=i.barGroup=this._createBarGroup(r);s.add(i.outOfRange=kv()),s.add(i.inRange=kv(null,a?zv(this._orient):null,m(this._dragHandle,this,"all",!1),m(this._dragHandle,this,"all",!0)));var l=e.textStyleModel.getTextRect("国"),h=AP(l.width,l.height);a&&(i.handleThumbs=[],i.handleLabels=[],i.handleLabelPoints=[],this._createHandle(s,0,n,h,o,r),this._createHandle(s,1,n,h,o,r)),this._createIndicator(s,n,h,o),t.add(s)},_createHandle:function(t,e,i,n,o){var a=m(this._dragHandle,this,e,!1),r=m(this._dragHandle,this,e,!0),s=kv(Pv(e,n),zv(this._orient),a,r);s.position[0]=i[0],t.add(s);var l=this.visualMapModel.textStyleModel,h=new Cb({draggable:!0,drift:a,onmousemove:function(t){Q_(t.event)},ondragend:r,style:{x:0,y:0,text:"",textFont:l.getFont(),textFill:l.getTextColor()}});this.group.add(h);var u=["horizontal"===o?n/2:1.5*n,"horizontal"===o?0===e?-1.5*n:1.5*n:0===e?-n/2:n/2],c=this._shapes;c.handleThumbs[e]=s,c.handleLabelPoints[e]=u,c.handleLabels[e]=h},_createIndicator:function(t,e,i,n){var o=kv([[0,0]],"move");o.position[0]=e[0],o.attr({invisible:!0,silent:!0}),t.add(o);var a=this.visualMapModel.textStyleModel,r=new Cb({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textFont:a.getFont(),textFill:a.getTextColor()}});this.group.add(r);var s=["horizontal"===n?i/2:CP+3,0],l=this._shapes;l.indicator=o,l.indicatorLabel=r,l.indicatorLabelPoint=s},_dragHandle:function(t,e,i,n){if(this._useHandle){if(this._dragging=!e,!e){var o=this._applyTransform([i,n],this._shapes.barGroup,!0);this._updateInterval(t,o[1]),this._updateView()}e===!this.visualMapModel.get("realtime")&&this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:this._dataInterval.slice()}),e?!this._hovering&&this._clearHoverLinkToSeries():Ev(this.visualMapModel)&&this._doHoverLinkToSeries(this._handleEnds[t],!1)}},_resetInterval:function(){var t=this.visualMapModel,e=this._dataInterval=t.getSelected(),i=t.getExtent(),n=[0,t.itemSize[1]];this._handleEnds=[MP(e[0],i,n,!0),MP(e[1],i,n,!0)]},_updateInterval:function(t,e){e=e||0;var i=this.visualMapModel,n=this._handleEnds,o=[0,i.itemSize[1]];jD(e,n,o,t,0);var a=i.getExtent();this._dataInterval=[MP(n[0],o,a,!0),MP(n[1],o,a,!0)]},_updateView:function(t){var e=this.visualMapModel,i=e.getExtent(),n=this._shapes,o=[0,e.itemSize[1]],a=t?o:this._handleEnds,r=this._createBarVisual(this._dataInterval,i,a,"inRange"),s=this._createBarVisual(i,i,o,"outOfRange");n.inRange.setStyle({fill:r.barColor,opacity:r.opacity}).setShape("points",r.barPoints),n.outOfRange.setStyle({fill:s.barColor,opacity:s.opacity}).setShape("points",s.barPoints),this._updateHandle(a,r)},_createBarVisual:function(t,e,i,n){var o={forceState:n,convertOpacityToAlpha:!0},a=this._makeColorGradient(t,o),r=[this.getControllerVisual(t[0],"symbolSize",o),this.getControllerVisual(t[1],"symbolSize",o)],s=this._createBarPoints(i,r);return{barColor:new jb(0,0,0,1,a),barPoints:s,handlesColor:[a[0].color,a[a.length-1].color]}},_makeColorGradient:function(t,e){var i=[],n=(t[1]-t[0])/100;i.push({color:this.getControllerVisual(t[0],"color",e),offset:0});for(var o=1;o<100;o++){var a=t[0]+n*o;if(a>t[1])break;i.push({color:this.getControllerVisual(a,"color",e),offset:o/100})}return i.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),i},_createBarPoints:function(t,e){var i=this.visualMapModel.itemSize;return[[i[0]-e[0],t[0]],[i[0],t[0]],[i[0],t[1]],[i[0]-e[1],t[1]]]},_createBarGroup:function(t){var e=this._orient,i=this.visualMapModel.get("inverse");return new S_("horizontal"!==e||i?"horizontal"===e&&i?{scale:"bottom"===t?[-1,1]:[1,1],rotation:-Math.PI/2}:"vertical"!==e||i?{scale:"left"===t?[1,1]:[-1,1]}:{scale:"left"===t?[1,-1]:[-1,-1]}:{scale:"bottom"===t?[1,1]:[-1,1],rotation:Math.PI/2})},_updateHandle:function(t,e){if(this._useHandle){var i=this._shapes,n=this.visualMapModel,o=i.handleThumbs,a=i.handleLabels;IP([0,1],function(r){var s=o[r];s.setStyle("fill",e.handlesColor[r]),s.position[1]=t[r];var l=go(i.handleLabelPoints[r],po(s,this.group));a[r].setStyle({x:l[0],y:l[1],text:n.formatValueText(this._dataInterval[r]),textVerticalAlign:"middle",textAlign:this._applyTransform("horizontal"===this._orient?0===r?"bottom":"top":"left",i.barGroup)})},this)}},_showIndicator:function(t,e,i,n){var o=this.visualMapModel,a=o.getExtent(),r=o.itemSize,s=[0,r[1]],l=MP(t,a,s,!0),h=this._shapes,u=h.indicator;if(u){u.position[1]=l,u.attr("invisible",!1),u.setShape("points",Ov(!!i,n,l,r[1]));var c={convertOpacityToAlpha:!0},d=this.getControllerVisual(t,"color",c);u.setStyle("fill",d);var f=go(h.indicatorLabelPoint,po(u,this.group)),p=h.indicatorLabel;p.attr("invisible",!1);var g=this._applyTransform("left",h.barGroup),m=this._orient;p.setStyle({text:(i||"")+o.formatValueText(e),textVerticalAlign:"horizontal"===m?g:"middle",textAlign:"horizontal"===m?"center":g,x:f[0],y:f[1]})}},_enableHoverLinkToSeries:function(){var t=this;this._shapes.barGroup.on("mousemove",function(e){if(t._hovering=!0,!t._dragging){var i=t.visualMapModel.itemSize,n=t._applyTransform([e.offsetX,e.offsetY],t._shapes.barGroup,!0,!0);n[1]=TP(AP(0,n[1]),i[1]),t._doHoverLinkToSeries(n[1],0<=n[0]&&n[0]<=i[0])}}).on("mouseout",function(){t._hovering=!1,!t._dragging&&t._clearHoverLinkToSeries()})},_enableHoverLinkFromSeries:function(){var t=this.api.getZr();this.visualMapModel.option.hoverLink?(t.on("mouseover",this._hoverLinkFromSeriesMouseOver,this),t.on("mouseout",this._hideIndicator,this)):this._clearHoverLinkFromSeries()},_doHoverLinkToSeries:function(t,e){var i=this.visualMapModel,n=i.itemSize;if(i.option.hoverLink){var o=[0,n[1]],a=i.getExtent();t=TP(AP(o[0],t),o[1]);var r=Nv(i,a,o),s=[t-r,t+r],l=MP(t,o,a,!0),h=[MP(s[0],o,a,!0),MP(s[1],o,a,!0)];s[0]<o[0]&&(h[0]=-1/0),s[1]>o[1]&&(h[1]=1/0),e&&(h[0]===-1/0?this._showIndicator(l,h[1],"< ",r):h[1]===1/0?this._showIndicator(l,h[0],"> ",r):this._showIndicator(l,l,"≈ ",r));var u=this._hoverLinkDataIndices,c=[];(e||Ev(i))&&(c=this._hoverLinkDataIndices=i.findTargetDataIndices(h));var d=Li(u,c);this._dispatchHighDown("downplay",Lv(d[0])),this._dispatchHighDown("highlight",Lv(d[1]))}},_hoverLinkFromSeriesMouseOver:function(t){var e=t.target,i=this.visualMapModel;if(e&&null!=e.dataIndex){var n=this.ecModel.getSeriesByIndex(e.seriesIndex);if(i.isTargetSeries(n)){var o=n.getData(e.dataType),a=o.get(i.getDataDimension(o),e.dataIndex,!0);isNaN(a)||this._showIndicator(a,a)}}},_hideIndicator:function(){var t=this._shapes;t.indicator&&t.indicator.attr("invisible",!0),t.indicatorLabel&&t.indicatorLabel.attr("invisible",!0)},_clearHoverLinkToSeries:function(){this._hideIndicator();var t=this._hoverLinkDataIndices;this._dispatchHighDown("downplay",Lv(t)),t.length=0},_clearHoverLinkFromSeries:function(){this._hideIndicator();var t=this.api.getZr();t.off("mouseover",this._hoverLinkFromSeriesMouseOver),t.off("mouseout",this._hideIndicator)},_applyTransform:function(t,e,i,n){var o=po(e,n?null:this.group);return tS[y(t)?"applyTransform":"transformDirection"](t,o,i)},_dispatchHighDown:function(t,e){e&&e.length&&this.api.dispatchAction({type:t,batch:e})},dispose:function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()},remove:function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()}});hs({type:"selectDataRange",event:"dataRangeSelected",update:"update"},function(t,e){e.eachComponent({mainType:"visualMap",query:t},function(e){e.setSelected(t.selected)})}),ss(hP);var kP=_P.extend({type:"visualMap.piecewise",defaultOption:{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieceList:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0,showLabel:null},optionUpdated:function(t,e){kP.superApply(this,"optionUpdated",arguments),this._pieceList=[],this.resetExtent();var n=this._mode=this._determineMode();PP[this._mode].call(this),this._resetSelected(t,e);var o=this.option.categories;this.resetVisual(function(t,e){"categories"===n?(t.mappingMethod="category",t.categories=i(o)):(t.dataExtent=this.getExtent(),t.mappingMethod="piecewise",t.pieceList=f(this._pieceList,function(t){var t=i(t);return"inRange"!==e&&(t.visual=null),t}))})},completeVisualOption:function(){function t(t,e,i){return t&&t[e]&&(w(t[e])?t[e].hasOwnProperty(i):t[e]===i)}var e=this.option,i={},n=oD.listVisualTypes(),o=this.isCategory();d(e.pieces,function(t){d(n,function(e){t.hasOwnProperty(e)&&(i[e]=1)})}),d(i,function(i,n){var a=0;d(this.stateList,function(i){a|=t(e,i,n)||t(e.target,i,n)},this),!a&&d(this.stateList,function(t){(e[t]||(e[t]={}))[n]=cP.get(n,"inRange"===t?"active":"inactive",o)})},this),_P.prototype.completeVisualOption.apply(this,arguments)},_resetSelected:function(t,e){var i=this.option,n=this._pieceList,o=(e?i:t).selected||{};if(i.selected=o,d(n,function(t,e){var i=this.getSelectedMapKey(t);o.hasOwnProperty(i)||(o[i]=!0)},this),"single"===i.selectedMode){var a=!1;d(n,function(t,e){var i=this.getSelectedMapKey(t);o[i]&&(a?o[i]=!1:a=!0)},this)}},getSelectedMapKey:function(t){return"categories"===this._mode?t.value+"":t.index+""},getPieceList:function(){return this._pieceList},_determineMode:function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},setSelected:function(t){this.option.selected=i(t)},getValueState:function(t){var e=oD.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?"inRange":"outOfRange"},findTargetDataIndices:function(t){var e=[];return this.eachTargetSeries(function(i){var n=[],o=i.getData();o.each(this.getDataDimension(o),function(e,i){oD.findPieceIndex(e,this._pieceList)===t&&n.push(i)},!0,this),e.push({seriesId:i.id,dataIndex:n})},this),e},getRepresentValue:function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var i=t.interval||[];e=i[0]===-1/0&&i[1]===1/0?0:(i[0]+i[1])/2}return e},getVisualMeta:function(t){function e(e,a){var r=o.getRepresentValue({interval:e});a||(a=o.getValueState(r));var s=t(r,a);e[0]===-1/0?n[0]=s:e[1]===1/0?n[1]=s:i.push({value:e[0],color:s},{value:e[1],color:s})}if(!this.isCategory()){var i=[],n=[],o=this,a=this._pieceList.slice();if(a.length){var r=a[0].interval[0];r!==-1/0&&a.unshift({interval:[-1/0,r]}),(r=a[a.length-1].interval[1])!==1/0&&a.push({interval:[r,1/0]})}else a.push({interval:[-1/0,1/0]});var s=-1/0;return d(a,function(t){var i=t.interval;i&&(i[0]>s&&e([s,i[0]],"outOfRange"),e(i.slice()),s=i[1])},this),{stops:i,outerColors:n}}}}),PP={splitNumber:function(){var t=this.option,e=this._pieceList,i=Math.min(t.precision,20),n=this.getExtent(),o=t.splitNumber;o=Math.max(parseInt(o,10),1),t.splitNumber=o;for(var a=(n[1]-n[0])/o;+a.toFixed(i)!==a&&i<5;)i++;t.precision=i,a=+a.toFixed(i);var r=0;t.minOpen&&e.push({index:r++,interval:[-1/0,n[0]],close:[0,0]});for(var s=n[0],l=r+o;r<l;s+=a){var h=r===o-1?n[1]:s+a;e.push({index:r++,interval:[s,h],close:[1,1]})}t.maxOpen&&e.push({index:r++,interval:[n[1],1/0],close:[0,0]}),Vo(e),d(e,function(t){t.text=this.formatValueText(t.interval)},this)},categories:function(){var t=this.option;d(t.categories,function(t){this._pieceList.push({text:this.formatValueText(t,!0),value:t})},this),Rv(t,this._pieceList)},pieces:function(){var t=this.option,e=this._pieceList;d(t.pieces,function(t,i){w(t)||(t={value:t});var n={text:"",index:i};if(null!=t.label&&(n.text=t.label),t.hasOwnProperty("value")){var o=n.value=t.value;n.interval=[o,o],n.close=[1,1]}else{for(var a=n.interval=[],r=n.close=[0,0],s=[1,0,1],l=[-1/0,1/0],h=[],u=0;u<2;u++){for(var c=[["gte","gt","min"],["lte","lt","max"]][u],d=0;d<3&&null==a[u];d++)a[u]=t[c[d]],r[u]=s[d],h[u]=2===d;null==a[u]&&(a[u]=l[u])}h[0]&&a[1]===1/0&&(r[0]=0),h[1]&&a[0]===-1/0&&(r[1]=0),a[0]===a[1]&&r[0]&&r[1]&&(n.value=a[0])}n.visual=oD.retrieveVisuals(t),e.push(n)},this),Rv(t,e),Vo(e),d(e,function(t){var e=t.close,i=[["<","≤"][e[1]],[">","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,i)},this)}};SP.extend({type:"visualMap.piecewise",doRender:function(){var t=this.group;t.removeAll();var e=this.visualMapModel,i=e.get("textGap"),n=e.textStyleModel,o=n.getFont(),a=n.getTextColor(),r=this._getItemAlign(),s=e.itemSize,l=this._getViewData(),h=l.endsText,u=T(e.get("showLabel",!0),!h);h&&this._renderEndsText(t,h[0],s,u,r),d(l.viewPieceList,function(n){var l=n.piece,h=new S_;h.onclick=m(this._onItemClick,this,l),this._enableHoverLink(h,n.indexInModelPieceList);var c=e.getRepresentValue(l);if(this._createItemSymbol(h,c,[0,0,s[0],s[1]]),u){var d=this.visualMapModel.getValueState(c);h.add(new Cb({style:{x:"right"===r?-i:s[0]+i,y:s[1]/2,text:l.text,textVerticalAlign:"middle",textAlign:r,textFont:o,textFill:a,opacity:"outOfRange"===d?.5:1}}))}t.add(h)},this),h&&this._renderEndsText(t,h[1],s,u,r),bS(e.get("orient"),t,e.get("itemGap")),this.renderBackground(t),this.positionGroup(t)},_enableHoverLink:function(t,e){function i(t){var i=this.visualMapModel;i.option.hoverLink&&this.api.dispatchAction({type:t,batch:Lv(i.findTargetDataIndices(e))})}t.on("mouseover",m(i,this,"highlight")).on("mouseout",m(i,this,"downplay"))},_getItemAlign:function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return Cv(t,this.api,t.itemSize);var i=e.align;return i&&"auto"!==i||(i="left"),i},_renderEndsText:function(t,e,i,n,o){if(e){var a=new S_,r=this.visualMapModel.textStyleModel;a.add(new Cb({style:{x:n?"right"===o?i[0]:0:i[0]/2,y:i[1]/2,textVerticalAlign:"middle",textAlign:n?o:"center",text:e,textFont:r.getFont(),textFill:r.getTextColor()}})),t.add(a)}},_getViewData:function(){var t=this.visualMapModel,e=f(t.getPieceList(),function(t,e){return{piece:t,indexInModelPieceList:e}}),i=t.get("text"),n=t.get("orient"),o=t.get("inverse");return("horizontal"===n?o:!o)?e.reverse():i&&(i=i.slice().reverse()),{viewPieceList:e,endsText:i}},_createItemSymbol:function(t,e,i){t.add(dl(this.getControllerVisual(e,"symbol"),i[0],i[1],i[2],i[3],this.getControllerVisual(e,"color")))},_onItemClick:function(t){var e=this.visualMapModel,n=e.option,o=i(n.selected),a=e.getSelectedMapKey(t);"single"===n.selectedMode?(o[a]=!0,d(o,function(t,e){o[e]=e===a})):o[a]=!o[a],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:o})}});ss(hP);var OP=Wo,NP=Ho,EP=gs({type:"marker",dependencies:["series","grid","polar","geo"],init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i),this.mergeOption(t,i,n.createdBySelf,!0)},isAnimationEnabled:function(){if(_x.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},mergeOption:function(t,e,i,n){var o=this.constructor,r=this.mainType+"Model";i||e.eachSeries(function(t){var i=t.get(this.mainType),s=t[r];i&&i.data?(s?s.mergeOption(i,e,!0):(n&&Bv(i),d(i.data,function(t){t instanceof Array?(Bv(t[0]),Bv(t[1])):Bv(t)}),a(s=new o(i,this,e),{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),s.__hostSeries=t),t[r]=s):t[r]=null},this)},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=y(i)?f(i,OP).join(", "):OP(i),o=e.getName(t),a=NP(this.name);return(null!=i||o)&&(a+="<br />"),o&&(a+=NP(o),null!=i&&(a+=" : ")),null!=i&&(a+=NP(n)),a},getData:function(){return this._data},setData:function(t){this._data=t}});u(EP,sM),EP.extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{show:!0,position:"inside"},itemStyle:{borderWidth:2},emphasis:{label:{show:!0}}}});var zP=l,RP=v,BP={min:RP(Fv,"min"),max:RP(Fv,"max"),average:RP(Fv,"average")},VP=ms({type:"marker",init:function(){this.markerGroupMap=z()},render:function(t,e,i){var n=this.markerGroupMap;n.each(function(t){t.__keep=!1});var o=this.type+"Model";e.eachSeries(function(t){var n=t[o];n&&this.renderSeries(t,n,e,i)},this),n.each(function(t){!t.__keep&&this.group.remove(t.group)},this)},renderSeries:function(){}});VP.extend({type:"markPoint",updateTransform:function(t,e,i){e.eachSeries(function(t){var e=t.markPointModel;e&&(qv(e.getData(),t,i),this.markerGroupMap.get(t.id).updateLayout(e))},this)},renderSeries:function(t,e,i,n){var o=t.coordinateSystem,a=t.id,r=t.getData(),s=this.markerGroupMap,l=s.get(a)||s.set(a,new Ml),h=$v(o,t,e);e.setData(h),qv(e.getData(),t,n),h.each(function(t){var i=h.getItemModel(t),n=i.getShallow("symbolSize");"function"==typeof n&&(n=n(e.getRawValue(t),e.getDataParams(t))),h.setItemVisual(t,{symbolSize:n,color:i.get("itemStyle.color")||r.getVisual("color"),symbol:i.getShallow("symbol")})}),l.updateData(h),this.group.add(l.group),h.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),l.__keep=!0,l.group.silent=e.get("silent")||t.get("silent")}}),ss(function(t){t.markPoint=t.markPoint||{}}),EP.extend({type:"markLine",defaultOption:{zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end"},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"}});var GP=function(t,e,o,r){var s=t.getData(),l=r.type;if(!y(r)&&("min"===l||"max"===l||"average"===l||null!=r.xAxis||null!=r.yAxis)){var h,u;if(null!=r.yAxis||null!=r.xAxis)h=null!=r.yAxis?"y":"x",e.getAxis(h),u=T(r.yAxis,r.xAxis);else{var c=Zv(r,s,e,t);h=c.valueDataDim,c.valueAxis,u=Yv(s,h,l)}var d="x"===h?0:1,f=1-d,p=i(r),g={};p.type=null,p.coord=[],g.coord=[],p.coord[f]=-1/0,g.coord[f]=1/0;var m=o.get("precision");m>=0&&"number"==typeof u&&(u=+u.toFixed(Math.min(m,20))),p.coord[d]=g.coord[d]=u,r=[p,g,{type:l,valueIndex:r.valueIndex,value:u}]}return r=[Hv(t,r[0]),Hv(t,r[1]),a({},r[2])],r[2].type=r[2].type||"",n(r[2],r[0]),n(r[2],r[1]),r};VP.extend({type:"markLine",updateTransform:function(t,e,i){e.eachSeries(function(t){var e=t.markLineModel;if(e){var n=e.getData(),o=e.__from,a=e.__to;o.each(function(e){ty(o,e,!0,t,i),ty(a,e,!1,t,i)}),n.each(function(t){n.setItemLayout(t,[o.getItemLayout(t),a.getItemLayout(t)])}),this.markerGroupMap.get(t.id).updateLayout()}},this)},renderSeries:function(t,e,i,n){function o(e,i,o){var a=e.getItemModel(i);ty(e,i,o,t,n),e.setItemVisual(i,{symbolSize:a.get("symbolSize")||g[o?0:1],symbol:a.get("symbol",!0)||p[o?0:1],color:a.get("itemStyle.color")||s.getVisual("color")})}var a=t.coordinateSystem,r=t.id,s=t.getData(),l=this.markerGroupMap,h=l.get(r)||l.set(r,new Fc);this.group.add(h.group);var u=ey(a,t,e),c=u.from,d=u.to,f=u.line;e.__from=c,e.__to=d,e.setData(f);var p=e.get("symbol"),g=e.get("symbolSize");y(p)||(p=[p,p]),"number"==typeof g&&(g=[g,g]),u.from.each(function(t){o(c,t,!0),o(d,t,!1)}),f.each(function(t){var e=f.getItemModel(t).get("lineStyle.color");f.setItemVisual(t,{color:e||c.getItemVisual(t,"color")}),f.setItemLayout(t,[c.getItemLayout(t),d.getItemLayout(t)]),f.setItemVisual(t,{fromSymbolSize:c.getItemVisual(t,"symbolSize"),fromSymbol:c.getItemVisual(t,"symbol"),toSymbolSize:d.getItemVisual(t,"symbolSize"),toSymbol:d.getItemVisual(t,"symbol")})}),h.updateData(f),u.line.eachItemGraphicEl(function(t,i){t.traverse(function(t){t.dataModel=e})}),h.__keep=!0,h.group.silent=e.get("silent")||t.get("silent")}}),ss(function(t){t.markLine=t.markLine||{}}),EP.extend({type:"markArea",defaultOption:{zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}}});var WP=function(t,e,i,n){var a=Hv(t,n[0]),r=Hv(t,n[1]),s=T,l=a.coord,h=r.coord;l[0]=s(l[0],-1/0),l[1]=s(l[1],-1/0),h[0]=s(h[0],1/0),h[1]=s(h[1],1/0);var u=o([{},a,r]);return u.coord=[a.coord,r.coord],u.x0=a.x,u.y0=a.y,u.x1=r.x,u.y1=r.y,u},FP=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]];VP.extend({type:"markArea",updateTransform:function(t,e,i){e.eachSeries(function(t){var e=t.markAreaModel;if(e){var n=e.getData();n.each(function(e){var o=f(FP,function(o){return ay(n,e,o,t,i)});n.setItemLayout(e,o),n.getItemGraphicEl(e).setShape("points",o)})}},this)},renderSeries:function(t,e,i,n){var o=t.coordinateSystem,a=t.name,s=t.getData(),l=this.markerGroupMap,h=l.get(a)||l.set(a,{group:new S_});this.group.add(h.group),h.__keep=!0;var u=ry(o,t,e);e.setData(u),u.each(function(e){u.setItemLayout(e,f(FP,function(i){return ay(u,e,i,t,n)})),u.setItemVisual(e,{color:s.getVisual("color")})}),u.diff(h.__data).add(function(t){var e=new Rb({shape:{points:u.getItemLayout(t)}});u.setItemGraphicEl(t,e),h.group.add(e)}).update(function(t,i){var n=h.__data.getItemGraphicEl(i);co(n,{shape:{points:u.getItemLayout(t)}},e,t),h.group.add(n),u.setItemGraphicEl(t,n)}).remove(function(t){var e=h.__data.getItemGraphicEl(t);h.group.remove(e)}).execute(),u.eachItemGraphicEl(function(t,i){var n=u.getItemModel(i),o=n.getModel("label"),a=n.getModel("emphasis.label"),s=u.getItemVisual(i,"color");t.useStyle(r(n.getModel("itemStyle").getItemStyle(),{fill:zt(s,.4),stroke:s})),t.hoverStyle=n.getModel("emphasis.itemStyle").getItemStyle(),eo(t.style,t.hoverStyle,o,a,{labelFetcher:e,labelDataIndex:i,defaultText:u.getName(i)||"",isRectText:!0,autoColor:s}),to(t,{}),t.dataModel=e}),h.__data=u,h.group.silent=e.get("silent")||t.get("silent")}}),ss(function(t){t.markArea=t.markArea||{}});IS.registerSubTypeDefaulter("timeline",function(){return"slider"}),hs({type:"timelineChange",event:"timelineChanged",update:"prepareAndUpdate"},function(t,e){var i=e.getComponent("timeline");return i&&null!=t.currentIndex&&(i.setCurrentIndex(t.currentIndex),!i.get("loop",!0)&&i.isIndexMax()&&i.setPlayState(!1)),e.resetOption("timeline"),r({currentIndex:i.option.currentIndex},t)}),hs({type:"timelinePlayChange",event:"timelinePlayChanged",update:"update"},function(t,e){var i=e.getComponent("timeline");i&&null!=t.playState&&i.setPlayState(t.playState)});var HP=IS.extend({type:"timeline",layoutMode:"box",defaultOption:{zlevel:0,z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},init:function(t,e,i){this._data,this._names,this.mergeDefaultAndTheme(t,i),this._initData()},mergeOption:function(t){HP.superApply(this,"mergeOption",arguments),this._initData()},setCurrentIndex:function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},getCurrentIndex:function(){return this.option.currentIndex},isIndexMax:function(){return this.getCurrentIndex()>=this._data.count()-1},setPlayState:function(t){this.option.autoPlay=!!t},getPlayState:function(){return!!this.option.autoPlay},_initData:function(){var t=this.option,e=t.data||[],n=t.axisType,o=this._names=[];if("category"===n){var a=[];d(e,function(t,e){var n,r=Ii(t);w(t)?(n=i(t)).value=e:n=e,a.push(n),_(r)||null!=r&&!isNaN(r)||(r=""),o.push(r+"")}),e=a}var r={category:"ordinal",time:"time"}[n]||"number";(this._data=new yI([{name:"value",type:r}],this)).initData(e,o)},getData:function(){return this._data},getCategories:function(){if("category"===this.get("axisType"))return this._names.slice()}});u(HP.extend({type:"timeline.slider",defaultOption:{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"emptyCircle",symbolSize:10,lineStyle:{show:!0,width:2,color:"#304654"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#304654"},itemStyle:{color:"#304654",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:13,color:"#c23531",borderWidth:5,borderColor:"rgba(194,53,49, 0.5)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:22,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z",prevIcon:"path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z",color:"#304654",borderColor:"#304654",borderWidth:1},emphasis:{label:{show:!0,color:"#c23531"},itemStyle:{color:"#c23531"},controlStyle:{color:"#c23531",borderColor:"#c23531",borderWidth:2}},data:[]}}),sM);var ZP=cM.extend({type:"timeline"}),UP=function(t,e,i,n){nT.call(this,t,e,i),this.type=n||"value",this._autoLabelInterval,this.model=null};UP.prototype={constructor:UP,getLabelInterval:function(){var t=this.model,e=t.getModel("label"),i=e.get("interval");return null!=i&&"auto"!=i?i:((i=this._autoLabelInterval)||(i=this._autoLabelInterval=ll(f(this.scale.getTicks(),this.dataToCoord,this),hl(this,e.get("formatter")),e.getFont(),"horizontal"===t.get("orient")?0:90,e.get("rotate"))),i)},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}}},h(UP,nT);var jP=m,XP=d,YP=Math.PI;ZP.extend({type:"timeline.slider",init:function(t,e){this.api=e,this._axis,this._viewRect,this._timer,this._currentPointer,this._mainGroup,this._labelGroup},render:function(t,e,i,n){if(this.model=t,this.api=i,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var o=this._layout(t,i),a=this._createGroup("mainGroup"),r=this._createGroup("labelGroup"),s=this._axis=this._createAxis(o,t);t.formatTooltip=function(t){return Ho(s.scale.getLabel(t))},XP(["AxisLine","AxisTick","Control","CurrentPointer"],function(e){this["_render"+e](o,a,s,t)},this),this._renderAxisLabel(o,r,s,t),this._position(o,t)}this._doPlayStop()},remove:function(){this._clearTimer(),this.group.removeAll()},dispose:function(){this._clearTimer()},_layout:function(t,e){var i=t.get("label.position"),n=t.get("orient"),o=uy(t,e);null==i||"auto"===i?i="horizontal"===n?o.y+o.height/2<e.getHeight()/2?"-":"+":o.x+o.width/2<e.getWidth()/2?"+":"-":isNaN(i)&&(i={horizontal:{top:"-",bottom:"+"},vertical:{left:"-",right:"+"}}[n][i]);var a={horizontal:"center",vertical:i>=0||"+"===i?"left":"right"},r={horizontal:i>=0||"+"===i?"top":"bottom",vertical:"middle"},s={horizontal:0,vertical:YP/2},l="vertical"===n?o.height:o.width,h=t.getModel("controlStyle"),u=h.get("show",!0),c=u?h.get("itemSize"):0,d=u?h.get("itemGap"):0,f=c+d,p=t.get("label.rotate")||0;p=p*YP/180;var g,m,v,y,x=h.get("position",!0),_=u&&h.get("showPlayBtn",!0),w=u&&h.get("showPrevBtn",!0),b=u&&h.get("showNextBtn",!0),S=0,M=l;return"left"===x||"bottom"===x?(_&&(g=[0,0],S+=f),w&&(m=[S,0],S+=f),b&&(v=[M-c,0],M-=f)):(_&&(g=[M-c,0],M-=f),w&&(m=[0,0],S+=f),b&&(v=[M-c,0],M-=f)),y=[S,M],t.get("inverse")&&y.reverse(),{viewRect:o,mainLength:l,orient:n,rotation:s[n],labelRotation:p,labelPosOpt:i,labelAlign:t.get("label.align")||a[n],labelBaseline:t.get("label.verticalAlign")||t.get("label.baseline")||r[n],playPosition:g,prevBtnPosition:m,nextBtnPosition:v,axisExtent:y,controlSize:c,controlGap:d}},_position:function(t,e){function i(t){var e=t.position;t.origin=[c[0][0]-e[0],c[1][0]-e[1]]}function n(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function o(t,e,i,n,o){t[n]+=i[n][o]-e[n][o]}var a=this._mainGroup,r=this._labelGroup,s=t.viewRect;if("vertical"===t.orient){var l=st(),h=s.x,u=s.y+s.height;ct(l,l,[-h,-u]),dt(l,l,-YP/2),ct(l,l,[h,u]),(s=s.clone()).applyTransform(l)}var c=n(s),d=n(a.getBoundingRect()),f=n(r.getBoundingRect()),p=a.position,g=r.position;g[0]=p[0]=c[0][0];var m=t.labelPosOpt;if(isNaN(m))o(p,d,c,1,v="+"===m?0:1),o(g,f,c,1,1-v);else{var v=m>=0?0:1;o(p,d,c,1,v),g[1]=p[1]+m}a.attr("position",p),r.attr("position",g),a.rotation=r.rotation=t.rotation,i(a),i(r)},_createAxis:function(t,e){var i=e.getData(),n=e.get("axisType"),o=sl(e,n),a=i.getDataExtent("value");o.setExtent(a[0],a[1]),this._customizeScale(o,i),o.niceTicks();var r=new UP("value",o,t.axisExtent,n);return r.model=e,r},_customizeScale:function(t,e){t.getTicks=function(){return e.mapArray(["value"],function(t){return t})},t.getTicksLabels=function(){return f(this.getTicks(),t.getLabel,t)}},_createGroup:function(t){var e=this["_"+t]=new S_;return this.group.add(e),e},_renderAxisLine:function(t,e,i,n){var o=i.getExtent();n.get("lineStyle.show")&&e.add(new Gb({shape:{x1:o[0],y1:0,x2:o[1],y2:0},style:a({lineCap:"round"},n.getModel("lineStyle").getLineStyle()),silent:!0,z2:1}))},_renderAxisTick:function(t,e,i,n){var o=n.getData(),a=i.scale.getTicks();XP(a,function(t,a){var r=i.dataToCoord(t),s=o.getItemModel(a),l=s.getModel("itemStyle"),h=s.getModel("emphasis.itemStyle"),u={position:[r,0],onclick:jP(this._changeTimeline,this,a)},c=dy(s,l,e,u);to(c,h.getItemStyle()),s.get("tooltip")?(c.dataIndex=a,c.dataModel=n):c.dataIndex=c.dataModel=null},this)},_renderAxisLabel:function(t,e,i,n){var o=n.getModel("label");if(o.get("show")){var a=n.getData(),r=i.scale.getTicks(),s=hl(i,o.get("formatter")),l=i.getLabelInterval();XP(r,function(n,o){if(!i.isLabelIgnored(o,l)){var r=a.getItemModel(o),h=r.getModel("label"),u=r.getModel("emphasis.label"),c=i.dataToCoord(n),d=new Cb({position:[c,0],rotation:t.labelRotation-t.rotation,onclick:jP(this._changeTimeline,this,o),silent:!1});io(d.style,h,{text:s[o],textAlign:t.labelAlign,textVerticalAlign:t.labelBaseline}),e.add(d),to(d,io({},u))}},this)}},_renderControl:function(t,e,i,n){function o(t,i,o,u){if(t){var c=cy(n,i,h,{position:t,origin:[a/2,0],rotation:u?-r:0,rectHover:!0,style:s,onclick:o});e.add(c),to(c,l)}}var a=t.controlSize,r=t.rotation,s=n.getModel("controlStyle").getItemStyle(),l=n.getModel("emphasis.controlStyle").getItemStyle(),h=[0,-a/2,a,a],u=n.getPlayState(),c=n.get("inverse",!0);o(t.nextBtnPosition,"controlStyle.nextIcon",jP(this._changeTimeline,this,c?"-":"+")),o(t.prevBtnPosition,"controlStyle.prevIcon",jP(this._changeTimeline,this,c?"+":"-")),o(t.playPosition,"controlStyle."+(u?"stopIcon":"playIcon"),jP(this._handlePlayClick,this,!u),!0)},_renderCurrentPointer:function(t,e,i,n){var o=n.getData(),a=n.getCurrentIndex(),r=o.getItemModel(a).getModel("checkpointStyle"),s=this,l={onCreate:function(t){t.draggable=!0,t.drift=jP(s._handlePointerDrag,s),t.ondragend=jP(s._handlePointerDragend,s),fy(t,a,i,n,!0)},onUpdate:function(t){fy(t,a,i,n)}};this._currentPointer=dy(r,r,this._mainGroup,{},this._currentPointer,l)},_handlePlayClick:function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},_handlePointerDrag:function(t,e,i){this._clearTimer(),this._pointerChangeTimeline([i.offsetX,i.offsetY])},_handlePointerDragend:function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},_pointerChangeTimeline:function(t,e){var i=this._toAxisCoord(t)[0],n=Do(this._axis.getExtent().slice());i>n[1]&&(i=n[1]),i<n[0]&&(i=n[0]),this._currentPointer.position[0]=i,this._currentPointer.dirty();var o=this._findNearestTick(i),a=this.model;(e||o!==a.getCurrentIndex()&&a.get("realtime"))&&this._changeTimeline(o)},_doPlayStop:function(){this._clearTimer(),this.model.getPlayState()&&(this._timer=setTimeout(jP(function(){var t=this.model;this._changeTimeline(t.getCurrentIndex()+(t.get("rewind",!0)?-1:1))},this),this.model.get("playInterval")))},_toAxisCoord:function(t){return go(t,this._mainGroup.getLocalTransform(),!0)},_findNearestTick:function(t){var e,i=this.model.getData(),n=1/0,o=this._axis;return i.each(["value"],function(i,a){var r=o.dataToCoord(i),s=Math.abs(r-t);s<n&&(n=s,e=a)}),e},_clearTimer:function(){this._timer&&(clearTimeout(this._timer),this._timer=null)},_changeTimeline:function(t){var e=this.model.getCurrentIndex();"+"===t?t=e+1:"-"===t&&(t=e-1),this.api.dispatchAction({type:"timelineChange",currentIndex:t,from:this.uid})}}),ss(function(t){var e=t&&t.timeline;y(e)||(e=e?[e]:[]),d(e,function(t){t&&sy(t)})});var qP=gs({type:"toolbox",layoutMode:{type:"box",ignoreSize:!0},mergeDefaultAndTheme:function(t){qP.superApply(this,"mergeDefaultAndTheme",arguments),d(this.option.feature,function(t,e){var i=Qm(e);i&&n(t,i.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}}}});ms({type:"toolbox",render:function(t,e,i,n){function o(o,r){var s,c=u[o],d=u[r],f=new _o(l[c],t,t.ecModel);if(c&&!d){if(py(c))s={model:f,onclick:f.option.onclick,featureName:c};else{var p=Qm(c);if(!p)return;s=new p(f,e,i)}h[c]=s}else{if(!(s=h[d]))return;s.model=f,s.ecModel=e,s.api=i}c||!d?f.get("show")&&!s.unusable?(a(f,s,c),f.setIconStatus=function(t,e){var i=this.option,n=this.iconPaths;i.iconStatus=i.iconStatus||{},i.iconStatus[t]=e,n[t]&&n[t].trigger(e)},s.render&&s.render(f,e,i,n)):s.remove&&s.remove(e,i):s.dispose&&s.dispose(e,i)}function a(n,o,a){var l=n.getModel("iconStyle"),h=n.getModel("emphasis.iconStyle"),u=o.getIcons?o.getIcons():n.get("icon"),c=n.get("title")||{};if("string"==typeof u){var f=u,p=c;c={},(u={})[a]=f,c[a]=p}var g=n.iconPaths={};d(u,function(a,u){var d=xo(a,{},{x:-s/2,y:-s/2,width:s,height:s});d.setStyle(l.getItemStyle()),d.hoverStyle=h.getItemStyle(),to(d),t.get("showTitle")&&(d.__title=c[u],d.on("mouseover",function(){var t=h.getItemStyle();d.setStyle({text:c[u],textPosition:t.textPosition||"bottom",textFill:t.fill||t.stroke||"#000",textAlign:t.textAlign||"center"})}).on("mouseout",function(){d.setStyle({textFill:null})})),d.trigger(n.get("iconStatus."+u)||"normal"),r.add(d),d.on("click",m(o.onclick,o,e,i,u)),g[u]=d})}var r=this.group;if(r.removeAll(),t.get("show")){var s=+t.get("itemSize"),l=t.get("feature")||{},h=this._features||(this._features={}),u=[];d(l,function(t,e){u.push(e)}),new ws(this._featureNames||[],u).add(o).update(o).remove(v(o,null)).execute(),this._featureNames=u,Xg(r,t,i),r.add(Yg(r.getBoundingRect(),t)),r.eachChild(function(t){var e=t.__title,n=t.hoverStyle;if(n&&e){var o=me(e,ke(n)),a=t.position[0]+r.position[0],l=!1;t.position[1]+r.position[1]+s+o.height>i.getHeight()&&(n.textPosition="top",l=!0);var h=l?-5-o.height:s+8;a+o.width/2>i.getWidth()?(n.textPosition=["100%",h],n.textAlign="right"):a-o.width/2<0&&(n.textPosition=[0,h],n.textAlign="left")}})}},updateView:function(t,e,i,n){d(this._features,function(t){t.updateView&&t.updateView(t.model,e,i,n)})},remove:function(t,e){d(this._features,function(i){i.remove&&i.remove(t,e)}),this.group.removeAll()},dispose:function(t,e){d(this._features,function(i){i.dispose&&i.dispose(t,e)})}});var $P=wM.toolbox.saveAsImage;gy.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:$P.title,type:"png",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:$P.lang.slice()},gy.prototype.unusable=!_x.canvasSupported,gy.prototype.onclick=function(t,e){var i=this.model,n=i.get("name")||t.get("title.0.text")||"echarts",o=document.createElement("a"),a=i.get("type",!0)||"png";o.download=n+"."+a,o.target="_blank";var r=e.getConnectedDataURL({type:a,backgroundColor:i.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",excludeComponents:i.get("excludeComponents"),pixelRatio:i.get("pixelRatio")});if(o.href=r,"function"!=typeof MouseEvent||_x.browser.ie||_x.browser.edge)if(window.navigator.msSaveOrOpenBlob){for(var s=atob(r.split(",")[1]),l=s.length,h=new Uint8Array(l);l--;)h[l]=s.charCodeAt(l);var u=new Blob([h]);window.navigator.msSaveOrOpenBlob(u,n+"."+a)}else{var c=i.get("lang"),d='<body style="margin:0;"><img src="'+r+'" style="max-width:100%;" title="'+(c&&c[0]||"")+'" /></body>';window.open().document.write(d)}else{var f=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});o.dispatchEvent(f)}},Jm("saveAsImage",gy);var KP=wM.toolbox.magicType;my.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z",tiled:"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z"},title:i(KP.title),option:{},seriesIndex:{}};var JP=my.prototype;JP.getIcons=function(){var t=this.model,e=t.get("icon"),i={};return d(t.get("type"),function(t){e[t]&&(i[t]=e[t])}),i};var QP={line:function(t,e,i,o){if("bar"===t)return n({id:e,type:"line",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},o.get("option.line")||{},!0)},bar:function(t,e,i,o){if("line"===t)return n({id:e,type:"bar",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},o.get("option.bar")||{},!0)},stack:function(t,e,i,o){if("line"===t||"bar"===t)return n({id:e,stack:"__ec_magicType_stack__"},o.get("option.stack")||{},!0)},tiled:function(t,e,i,o){if("line"===t||"bar"===t)return n({id:e,stack:""},o.get("option.tiled")||{},!0)}},tO=[["line","bar"],["stack","tiled"]];JP.onclick=function(t,e,i){var n=this.model,o=n.get("seriesIndex."+i);if(QP[i]){var a={series:[]};d(tO,function(t){l(t,i)>=0&&d(t,function(t){n.setIconStatus(t,"normal")})}),n.setIconStatus(i,"emphasis"),t.eachComponent({mainType:"series",query:null==o?null:{seriesIndex:o}},function(e){var o=e.subType,s=e.id,l=QP[i](o,s,e,n);l&&(r(l,e.option),a.series.push(l));var h=e.coordinateSystem;if(h&&"cartesian2d"===h.type&&("line"===i||"bar"===i)){var u=h.getAxesByScale("ordinal")[0];if(u){var c=u.dim+"Axis",d=t.queryComponents({mainType:c,index:e.get(name+"Index"),id:e.get(name+"Id")})[0].componentIndex;a[c]=a[c]||[];for(var f=0;f<=d;f++)a[c][d]=a[c][d]||{};a[c][d].boundaryGap="bar"===i}}}),e.dispatchAction({type:"changeMagicType",currentType:i,newOption:a})}},hs({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),Jm("magicType",my);var eO=wM.toolbox.dataView,iO=new Array(60).join("-"),nO="\t",oO=new RegExp("["+nO+"]+","g");Ty.defaultOption={show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:i(eO.title),lang:i(eO.lang),backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"},Ty.prototype.onclick=function(t,e){function i(){n.removeChild(a),x._dom=null}var n=e.getDom(),o=this.model;this._dom&&n.removeChild(this._dom);var a=document.createElement("div");a.style.cssText="position:absolute;left:5px;top:5px;bottom:5px;right:5px;",a.style.backgroundColor=o.get("backgroundColor")||"#fff";var r=document.createElement("h4"),s=o.get("lang")||[];r.innerHTML=s[0]||o.get("title"),r.style.cssText="margin: 10px 20px;",r.style.color=o.get("textColor");var l=document.createElement("div"),h=document.createElement("textarea");l.style.cssText="display:block;width:100%;overflow:auto;";var u=o.get("optionToContent"),c=o.get("contentToOption"),d=_y(t);if("function"==typeof u){var f=u(e.getOption());"string"==typeof f?l.innerHTML=f:M(f)&&l.appendChild(f)}else l.appendChild(h),h.readOnly=o.get("readOnly"),h.style.cssText="width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;",h.style.color=o.get("textColor"),h.style.borderColor=o.get("textareaBorderColor"),h.style.backgroundColor=o.get("textareaColor"),h.value=d.value;var p=d.meta,g=document.createElement("div");g.style.cssText="position:absolute;bottom:0;left:0;right:0;";var m="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",v=document.createElement("div"),y=document.createElement("div");m+=";background-color:"+o.get("buttonColor"),m+=";color:"+o.get("buttonTextColor");var x=this;hi(v,"click",i),hi(y,"click",function(){var t;try{t="function"==typeof c?c(l,e.getOption()):Iy(h.value,p)}catch(t){throw i(),new Error("Data view format error "+t)}t&&e.dispatchAction({type:"changeDataView",newOption:t}),i()}),v.innerHTML=s[1],y.innerHTML=s[2],y.style.cssText=m,v.style.cssText=m,!o.get("readOnly")&&g.appendChild(y),g.appendChild(v),hi(h,"keydown",function(t){if(9===(t.keyCode||t.which)){var e=this.value,i=this.selectionStart,n=this.selectionEnd;this.value=e.substring(0,i)+nO+e.substring(n),this.selectionStart=this.selectionEnd=i+1,Q_(t)}}),a.appendChild(r),a.appendChild(l),a.appendChild(g),l.style.height=n.clientHeight-80+"px",n.appendChild(a),this._dom=a},Ty.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},Ty.prototype.dispose=function(t,e){this.remove(t,e)},Jm("dataView",Ty),hs({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},function(t,e){var i=[];d(t.newOption.series,function(t){var n=e.getSeriesByName(t.name)[0];if(n){var o=n.get("data");i.push({name:t.name,data:Ay(t.data,o)})}else i.push(a({type:"scatter"},t))}),e.mergeOption(r({series:i},t.newOption))});var aO=d,rO="\0_ec_hist_store";jk.extend({type:"dataZoom.select"}),Xk.extend({type:"dataZoom.select"});var sO=wM.toolbox.dataZoom,lO=d,hO="\0_ec_\0toolbox-dataZoom_";Oy.defaultOption={show:!0,icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:i(sO.title)};var uO=Oy.prototype;uO.render=function(t,e,i,n){this.model=t,this.ecModel=e,this.api=i,zy(t,e,this,n,i),Ey(t,e)},uO.onclick=function(t,e,i){cO[i].call(this)},uO.remove=function(t,e){this._brushController.unmount()},uO.dispose=function(t,e){this._brushController.dispose()};var cO={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(Cy(this.ecModel))}};uO._onBrush=function(t,e){function i(t,e,i){var r=e.getAxis(t),s=r.model,l=n(t,s,a),h=l.findRepresentativeAxisProxy(s).getMinMaxSpan();null==h.minValueSpan&&null==h.maxValueSpan||(i=jD(0,i.slice(),r.scale.getExtent(),0,h.minValueSpan,h.maxValueSpan)),l&&(o[l.id]={dataZoomId:l.id,startValue:i[0],endValue:i[1]})}function n(t,e,i){var n;return i.eachComponent({mainType:"dataZoom",subType:"select"},function(i){i.getAxisModel(t,e.componentIndex)&&(n=i)}),n}if(e.isEnd&&t.length){var o={},a=this.ecModel;this._brushController.updateCovers([]),new zm(Ny(this.model.option),a,{include:["grid"]}).matchOutputRanges(t,a,function(t,e,n){if("cartesian2d"===n.type){var o=t.brushType;"rect"===o?(i("x",n,e[0]),i("y",n,e[1])):i({lineX:"x",lineY:"y"}[o],n,e)}}),Dy(a,o),this._dispatchZoomAction(o)}},uO._dispatchZoomAction=function(t){var e=[];lO(t,function(t,n){e.push(i(t))}),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},Jm("dataZoom",Oy),ss(function(t){function e(t,e){if(e){var o=t+"Index",a=e[o];null==a||"all"==a||y(a)||(a=!1===a||"none"===a?[]:[a]),i(t,function(e,i){if(null==a||"all"==a||-1!==l(a,i)){var r={type:"select",$fromToolbox:!0,id:hO+t+i};r[o]=i,n.push(r)}})}}function i(e,i){var n=t[e];y(n)||(n=n?[n]:[]),lO(n,i)}if(t){var n=t.dataZoom||(t.dataZoom=[]);y(n)||(t.dataZoom=n=[n]);var o=t.toolbox;if(o&&(y(o)&&(o=o[0]),o&&o.feature)){var a=o.feature.dataZoom;e("xAxis",a),e("yAxis",a)}}});var dO=wM.toolbox.restore;Ry.defaultOption={show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:dO.title},Ry.prototype.onclick=function(t,e,i){Ly(t),e.dispatchAction({type:"restore",from:this.uid})},Jm("restore",Ry),hs({type:"restore",event:"restore",update:"prepareAndUpdate"},function(t,e){e.resetOption("recreate")});var fO,pO="urn:schemas-microsoft-com:vml",gO="undefined"==typeof window?null:window,mO=!1,vO=gO&&gO.document;if(vO&&!_x.canvasSupported)try{!vO.namespaces.zrvml&&vO.namespaces.add("zrvml",pO),fO=function(t){return vO.createElement("<zrvml:"+t+' class="zrvml">')}}catch(t){fO=function(t){return vO.createElement("<"+t+' xmlns="'+pO+'" class="zrvml">')}}var yO=ab.CMD,xO=Math.round,_O=Math.sqrt,wO=Math.abs,bO=Math.cos,SO=Math.sin,MO=Math.max;if(!_x.canvasSupported){var IO=21600,TO=IO/2,AO=function(t){t.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",t.coordsize=IO+","+IO,t.coordorigin="0,0"},DO=function(t){return String(t).replace(/&/g,"&amp;").replace(/"/g,"&quot;")},CO=function(t,e,i){return"rgb("+[t,e,i].join(",")+")"},LO=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},kO=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},PO=function(t,e,i){return 1e5*(parseFloat(t)||0)+1e3*(parseFloat(e)||0)+i},OO=function(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t},NO=function(t,e,i){var n=Dt(e);i=+i,isNaN(i)&&(i=1),n&&(t.color=CO(n[0],n[1],n[2]),t.opacity=i*n[3])},EO=function(t){var e=Dt(t);return[CO(e[0],e[1],e[2]),e[3]]},zO=function(t,e,i){var n=e.fill;if(null!=n)if(n instanceof Ub){var o,a=0,r=[0,0],s=0,l=1,h=i.getBoundingRect(),u=h.width,c=h.height;if("linear"===n.type){o="gradient";var d=i.transform,f=[n.x*u,n.y*c],p=[n.x2*u,n.y2*c];d&&(Q(f,f,d),Q(p,p,d));var g=p[0]-f[0],m=p[1]-f[1];(a=180*Math.atan2(g,m)/Math.PI)<0&&(a+=360),a<1e-6&&(a=0)}else{o="gradientradial";var f=[n.x*u,n.y*c],d=i.transform,v=i.scale,y=u,x=c;r=[(f[0]-h.x)/y,(f[1]-h.y)/x],d&&Q(f,f,d),y/=v[0]*IO,x/=v[1]*IO;var _=MO(y,x);s=0/_,l=2*n.r/_-s}var w=n.colorStops.slice();w.sort(function(t,e){return t.offset-e.offset});for(var b=w.length,S=[],M=[],I=0;I<b;I++){var T=w[I],A=EO(T.color);M.push(T.offset*l+s+" "+A[0]),0!==I&&I!==b-1||S.push(A)}if(b>=2){var D=S[0][0],C=S[1][0],L=S[0][1]*e.opacity,k=S[1][1]*e.opacity;t.type=o,t.method="none",t.focus="100%",t.angle=a,t.color=D,t.color2=C,t.colors=M.join(","),t.opacity=k,t.opacity2=L}"radial"===o&&(t.focusposition=r.join(","))}else NO(t,n,e.opacity)},RO=function(t,e){null!=e.lineDash&&(t.dashstyle=e.lineDash.join(" ")),null==e.stroke||e.stroke instanceof Ub||NO(t,e.stroke,e.opacity)},BO=function(t,e,i,n){var o="fill"==e,a=t.getElementsByTagName(e)[0];null!=i[e]&&"none"!==i[e]&&(o||!o&&i.lineWidth)?(t[o?"filled":"stroked"]="true",i[e]instanceof Ub&&kO(t,a),a||(a=By(e)),o?zO(a,i,n):RO(a,i),LO(t,a)):(t[o?"filled":"stroked"]="false",kO(t,a))},VO=[[],[],[]],GO=function(t,e){var i,n,o,a,r,s,l=yO.M,h=yO.C,u=yO.L,c=yO.A,d=yO.Q,f=[],p=t.data,g=t.len();for(a=0;a<g;){switch(o=p[a++],n="",i=0,o){case l:n=" m ",i=1,r=p[a++],s=p[a++],VO[0][0]=r,VO[0][1]=s;break;case u:n=" l ",i=1,r=p[a++],s=p[a++],VO[0][0]=r,VO[0][1]=s;break;case d:case h:n=" c ",i=3;var m,v,y=p[a++],x=p[a++],_=p[a++],w=p[a++];o===d?(m=_,v=w,_=(_+2*y)/3,w=(w+2*x)/3,y=(r+2*y)/3,x=(s+2*x)/3):(m=p[a++],v=p[a++]),VO[0][0]=y,VO[0][1]=x,VO[1][0]=_,VO[1][1]=w,VO[2][0]=m,VO[2][1]=v,r=m,s=v;break;case c:var b=0,S=0,M=1,I=1,T=0;e&&(b=e[4],S=e[5],M=_O(e[0]*e[0]+e[1]*e[1]),I=_O(e[2]*e[2]+e[3]*e[3]),T=Math.atan2(-e[1]/I,e[0]/M));var A=p[a++],D=p[a++],C=p[a++],L=p[a++],k=p[a++]+T,P=p[a++]+k+T;a++;var O=p[a++],N=A+bO(k)*C,E=D+SO(k)*L,y=A+bO(P)*C,x=D+SO(P)*L,z=O?" wa ":" at ";Math.abs(N-y)<1e-4&&(Math.abs(P-k)>.01?O&&(N+=.0125):Math.abs(E-D)<1e-4?O&&N<A||!O&&N>A?x-=.0125:x+=.0125:O&&E<D||!O&&E>D?y+=.0125:y-=.0125),f.push(z,xO(((A-C)*M+b)*IO-TO),",",xO(((D-L)*I+S)*IO-TO),",",xO(((A+C)*M+b)*IO-TO),",",xO(((D+L)*I+S)*IO-TO),",",xO((N*M+b)*IO-TO),",",xO((E*I+S)*IO-TO),",",xO((y*M+b)*IO-TO),",",xO((x*I+S)*IO-TO)),r=y,s=x;break;case yO.R:var R=VO[0],B=VO[1];R[0]=p[a++],R[1]=p[a++],B[0]=R[0]+p[a++],B[1]=R[1]+p[a++],e&&(Q(R,R,e),Q(B,B,e)),R[0]=xO(R[0]*IO-TO),B[0]=xO(B[0]*IO-TO),R[1]=xO(R[1]*IO-TO),B[1]=xO(B[1]*IO-TO),f.push(" m ",R[0],",",R[1]," l ",B[0],",",R[1]," l ",B[0],",",B[1]," l ",R[0],",",B[1]);break;case yO.Z:f.push(" x ")}if(i>0){f.push(n);for(var V=0;V<i;V++){var G=VO[V];e&&Q(G,G,e),f.push(xO(G[0]*IO-TO),",",xO(G[1]*IO-TO),V<i-1?",":"")}}}return f.join("")};Mn.prototype.brushVML=function(t){var e=this.style,i=this._vmlEl;i||(i=By("shape"),AO(i),this._vmlEl=i),BO(i,"fill",e,this),BO(i,"stroke",e,this);var n=this.transform,o=null!=n,a=i.getElementsByTagName("stroke")[0];if(a){var r=e.lineWidth;if(o&&!e.strokeNoScale){var s=n[0]*n[3]-n[1]*n[2];r*=_O(wO(s))}a.weight=r+"px"}var l=this.path||(this.path=new ab);this.__dirtyPath&&(l.beginPath(),this.buildPath(l,this.shape),l.toStatic(),this.__dirtyPath=!1),i.path=GO(l,this.transform),i.style.zIndex=PO(this.zlevel,this.z,this.z2),LO(t,i),null!=e.text?this.drawRectText(t,this.getBoundingRect()):this.removeRectText(t)},Mn.prototype.onRemove=function(t){kO(t,this._vmlEl),this.removeRectText(t)},Mn.prototype.onAdd=function(t){LO(t,this._vmlEl),this.appendRectText(t)};var WO=function(t){return"object"==typeof t&&t.tagName&&"IMG"===t.tagName.toUpperCase()};Je.prototype.brushVML=function(t){var e,i,n=this.style,o=n.image;if(WO(o)){var a=o.src;if(a===this._imageSrc)e=this._imageWidth,i=this._imageHeight;else{var r=o.runtimeStyle,s=r.width,l=r.height;r.width="auto",r.height="auto",e=o.width,i=o.height,r.width=s,r.height=l,this._imageSrc=a,this._imageWidth=e,this._imageHeight=i}o=a}else o===this._imageSrc&&(e=this._imageWidth,i=this._imageHeight);if(o){var h=n.x||0,u=n.y||0,c=n.width,d=n.height,f=n.sWidth,p=n.sHeight,g=n.sx||0,m=n.sy||0,v=f&&p,y=this._vmlEl;y||(y=vO.createElement("div"),AO(y),this._vmlEl=y);var x,_=y.style,w=!1,b=1,S=1;if(this.transform&&(x=this.transform,b=_O(x[0]*x[0]+x[1]*x[1]),S=_O(x[2]*x[2]+x[3]*x[3]),w=x[1]||x[2]),w){var M=[h,u],I=[h+c,u],T=[h,u+d],A=[h+c,u+d];Q(M,M,x),Q(I,I,x),Q(T,T,x),Q(A,A,x);var D=MO(M[0],I[0],T[0],A[0]),C=MO(M[1],I[1],T[1],A[1]),L=[];L.push("M11=",x[0]/b,",","M12=",x[2]/S,",","M21=",x[1]/b,",","M22=",x[3]/S,",","Dx=",xO(h*b+x[4]),",","Dy=",xO(u*S+x[5])),_.padding="0 "+xO(D)+"px "+xO(C)+"px 0",_.filter="progid:DXImageTransform.Microsoft.Matrix("+L.join("")+", SizingMethod=clip)"}else x&&(h=h*b+x[4],u=u*S+x[5]),_.filter="",_.left=xO(h)+"px",_.top=xO(u)+"px";var k=this._imageEl,P=this._cropEl;k||(k=vO.createElement("div"),this._imageEl=k);var O=k.style;if(v){if(e&&i)O.width=xO(b*e*c/f)+"px",O.height=xO(S*i*d/p)+"px";else{var N=new Image,E=this;N.onload=function(){N.onload=null,e=N.width,i=N.height,O.width=xO(b*e*c/f)+"px",O.height=xO(S*i*d/p)+"px",E._imageWidth=e,E._imageHeight=i,E._imageSrc=o},N.src=o}P||((P=vO.createElement("div")).style.overflow="hidden",this._cropEl=P);var z=P.style;z.width=xO((c+g*c/f)*b),z.height=xO((d+m*d/p)*S),z.filter="progid:DXImageTransform.Microsoft.Matrix(Dx="+-g*c/f*b+",Dy="+-m*d/p*S+")",P.parentNode||y.appendChild(P),k.parentNode!=P&&P.appendChild(k)}else O.width=xO(b*c)+"px",O.height=xO(S*d)+"px",y.appendChild(k),P&&P.parentNode&&(y.removeChild(P),this._cropEl=null);var R="",B=n.opacity;B<1&&(R+=".Alpha(opacity="+xO(100*B)+") "),R+="progid:DXImageTransform.Microsoft.AlphaImageLoader(src="+o+", SizingMethod=scale)",O.filter=R,y.style.zIndex=PO(this.zlevel,this.z,this.z2),LO(t,y),null!=n.text&&this.drawRectText(t,this.getBoundingRect())}},Je.prototype.onRemove=function(t){kO(t,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(t)},Je.prototype.onAdd=function(t){LO(t,this._vmlEl),this.appendRectText(t)};var FO,HO={},ZO=0,UO=document.createElement("div"),jO=function(t){var e=HO[t];if(!e){ZO>100&&(ZO=0,HO={});var i,n=UO.style;try{n.font=t,i=n.fontFamily.split(",")[0]}catch(t){}e={style:n.fontStyle||"normal",variant:n.fontVariant||"normal",weight:n.fontWeight||"normal",size:0|parseFloat(n.fontSize||12),family:i||"Microsoft YaHei"},HO[t]=e,ZO++}return e};!function(t,e){H_[t]=e}("measureText",function(t,e){var i=vO;FO||((FO=i.createElement("div")).style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",vO.body.appendChild(FO));try{FO.style.font=e}catch(t){}return FO.innerHTML="",FO.appendChild(i.createTextNode(t)),{width:FO.offsetWidth}});for(var XO=new Kt,YO=[X_,Ke,Je,Mn,Cb],qO=0;qO<YO.length;qO++){var $O=YO[qO].prototype;$O.drawRectText=function(t,e,i,n){var o=this.style;this.__dirty&&Oe(o);var a=o.text;if(null!=a&&(a+=""),a){if(o.rich){var r=Ce(a,o);a=[];for(var s=0;s<r.lines.length;s++){for(var l=r.lines[s].tokens,h=[],u=0;u<l.length;u++)h.push(l[u].text);a.push(h.join(""))}a=a.join("\n")}var c,d,f=o.textAlign,p=o.textVerticalAlign,g=jO(o.font),m=g.style+" "+g.variant+" "+g.weight+" "+g.size+'px "'+g.family+'"';i=i||me(a,m,f,p);var v=this.transform;if(v&&!n&&(XO.copy(e),XO.applyTransform(v),e=XO),n)c=e.x,d=e.y;else{var y=o.textPosition,x=o.textDistance;if(y instanceof Array)c=e.x+OO(y[0],e.width),d=e.y+OO(y[1],e.height),f=f||"left";else{var _=we(y,e,x);c=_.x,d=_.y,f=f||_.textAlign,p=p||_.textVerticalAlign}}c=xe(c,i.width,f),d=_e(d,i.height,p),d+=i.height/2;var w,b,S,M=By,I=this._textVmlEl;I?b=(w=(S=I.firstChild).nextSibling).nextSibling:(I=M("line"),w=M("path"),b=M("textpath"),S=M("skew"),b.style["v-text-align"]="left",AO(I),w.textpathok=!0,b.on=!0,I.from="0 0",I.to="1000 0.05",LO(I,S),LO(I,w),LO(I,b),this._textVmlEl=I);var T=[c,d],A=I.style;v&&n?(Q(T,T,v),S.on=!0,S.matrix=v[0].toFixed(3)+","+v[2].toFixed(3)+","+v[1].toFixed(3)+","+v[3].toFixed(3)+",0,0",S.offset=(xO(T[0])||0)+","+(xO(T[1])||0),S.origin="0 0",A.left="0px",A.top="0px"):(S.on=!1,A.left=xO(c)+"px",A.top=xO(d)+"px"),b.string=DO(a);try{b.style.font=m}catch(t){}BO(I,"fill",{fill:o.textFill,opacity:o.opacity},this),BO(I,"stroke",{stroke:o.textStroke,opacity:o.opacity,lineDash:o.lineDash},this),I.style.zIndex=PO(this.zlevel,this.z,this.z2),LO(t,I)}},$O.removeRectText=function(t){kO(t,this._textVmlEl),this._textVmlEl=null},$O.appendRectText=function(t){LO(t,this._textVmlEl)}}Cb.prototype.brushVML=function(t){var e=this.style;null!=e.text?this.drawRectText(t,{x:e.x||0,y:e.y||0,width:0,height:0},this.getBoundingRect(),!0):this.removeRectText(t)},Cb.prototype.onRemove=function(t){this.removeRectText(t)},Cb.prototype.onAdd=function(t){this.appendRectText(t)}}Wy.prototype={constructor:Wy,getType:function(){return"vml"},getViewportRoot:function(){return this._vmlViewport},getViewportRootOffset:function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},refresh:function(){var t=this.storage.getDisplayList(!0,!0);this._paintList(t)},_paintList:function(t){for(var e=this._vmlRoot,i=0;i<t.length;i++){var n=t[i];n.invisible||n.ignore?(n.__alreadyNotVisible||n.onRemove(e),n.__alreadyNotVisible=!0):(n.__alreadyNotVisible&&n.onAdd(e),n.__alreadyNotVisible=!1,n.__dirty&&(n.beforeBrush&&n.beforeBrush(),(n.brushVML||n.brush).call(n,e),n.afterBrush&&n.afterBrush())),n.__dirty=!1}this._firstPaint&&(this._vmlViewport.appendChild(e),this._firstPaint=!1)},resize:function(t,e){var t=null==t?this._getWidth():t,e=null==e?this._getHeight():e;if(this._width!=t||this._height!=e){this._width=t,this._height=e;var i=this._vmlViewport.style;i.width=t+"px",i.height=e+"px"}},dispose:function(){this.root.innerHTML="",this._vmlRoot=this._vmlViewport=this.storage=null},getWidth:function(){return this._width},getHeight:function(){return this._height},clear:function(){this._vmlViewport&&this.root.removeChild(this._vmlViewport)},_getWidth:function(){var t=this.root,e=t.currentStyle;return(t.clientWidth||Gy(e.width))-Gy(e.paddingLeft)-Gy(e.paddingRight)|0},_getHeight:function(){var t=this.root,e=t.currentStyle;return(t.clientHeight||Gy(e.height))-Gy(e.paddingTop)-Gy(e.paddingBottom)|0}},d(["getLayer","insertLayer","eachLayer","eachBuiltinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],function(t){Wy.prototype[t]=Fy(t)}),wi("vml",Wy);var KO="http://www.w3.org/2000/svg",JO=ab.CMD,QO=Array.prototype.join,tN="none",eN=Math.round,iN=Math.sin,nN=Math.cos,oN=Math.PI,aN=2*Math.PI,rN=180/oN,sN=1e-4,lN={};lN.brush=function(t){var e=t.style,i=t.__svgEl;i||(i=Hy("path"),t.__svgEl=i),t.path||t.createPathProxy();var n=t.path;if(t.__dirtyPath){n.beginPath(),t.buildPath(n,t.shape),t.__dirtyPath=!1;var o=Jy(n);o.indexOf("NaN")<0&&qy(i,"d",o)}Ky(i,e),Yy(i,t.transform),null!=e.text&&dN(t,t.getBoundingRect())};var hN={};hN.brush=function(t){var e=t.style,i=e.image;if(i instanceof HTMLImageElement&&(i=i.src),i){var n=e.x||0,o=e.y||0,a=e.width,r=e.height,s=t.__svgEl;s||(s=Hy("image"),t.__svgEl=s),i!==t.__imageSrc&&($y(s,"href",i),t.__imageSrc=i),qy(s,"width",a),qy(s,"height",r),qy(s,"x",n),qy(s,"y",o),Yy(s,t.transform),null!=e.text&&dN(t,t.getBoundingRect())}};var uN={},cN=new Kt,dN=function(t,e,i){var n=t.style;t.__dirty&&Oe(n);var o=n.text;if(null!=o){o+="";var a=t.__textSvgEl;if(a||(a=Hy("text"),t.__textSvgEl=a),Ky(a,n,!0),t instanceof Cb||t.style.transformText)Yy(a,t.transform);else if(t.transform)cN.copy(e),cN.applyTransform(t.transform),e=cN;else{var r=t.transformCoordToGlobal(e.x,e.y);e.x=r[0],e.y=r[1]}var s,l,h=n.textPosition,u=n.textDistance,c=n.textAlign||"left";"number"==typeof n.fontSize&&(n.fontSize+="px");var d=n.font||[n.fontStyle||"",n.fontWeight||"",n.fontSize||"",n.fontFamily||""].join(" ")||F_,f=Qy(n.textVerticalAlign),p=(i=me(o,d,c,f)).lineHeight;if(h instanceof Array)s=e.x+h[0],l=e.y+h[1];else{var g=we(h,e,u);s=g.x,l=g.y,f=Qy(g.textVerticalAlign),c=g.textAlign}qy(a,"alignment-baseline",f),d&&(a.style.font=d);var m=n.textPadding;qy(a,"x",s),qy(a,"y",l);var v=o.split("\n"),y=v.length,x=c;"left"===x?(x="start",m&&(s+=m[3])):"right"===x?(x="end",m&&(s-=m[1])):"center"===x&&(x="middle",m&&(s+=(m[3]-m[1])/2));var _=0;if("baseline"===f?(_=-i.height+p,m&&(_-=m[2])):"middle"===f?(_=(-i.height+p)/2,m&&(l+=(m[0]-m[2])/2)):m&&(_+=m[0]),t.__text!==o||t.__textFont!==d){var w=t.__tspanList||[];t.__tspanList=w;for(S=0;S<y;S++)(M=w[S])?M.innerHTML="":(M=w[S]=Hy("tspan"),a.appendChild(M),qy(M,"alignment-baseline",f),qy(M,"text-anchor",x)),qy(M,"x",s),qy(M,"y",l+S*p+_),M.appendChild(document.createTextNode(v[S]));for(;S<w.length;S++)a.removeChild(w[S]);w.length=y,t.__text=o,t.__textFont=d}else if(t.__tspanList.length)for(var b=t.__tspanList.length,S=0;S<b;++S){var M=t.__tspanList[S];M&&(qy(M,"x",s),qy(M,"y",l+S*p+_))}}};uN.drawRectText=dN,uN.brush=function(t){var e=t.style;null!=e.text&&(e.textPosition=[0,0],dN(t,{x:e.x||0,y:e.y||0,width:0,height:0},t.getBoundingRect()))},tx.prototype={diff:function(t,e,i){i||(i=function(t,e){return t===e}),this.equals=i;var n=this;t=t.slice();var o=(e=e.slice()).length,a=t.length,r=1,s=o+a,l=[{newPos:-1,components:[]}],h=this.extractCommon(l[0],e,t,0);if(l[0].newPos+1>=o&&h+1>=a){for(var u=[],c=0;c<e.length;c++)u.push(c);return[{indices:u,count:e.length}]}for(;r<=s;){var d=function(){for(var i=-1*r;i<=r;i+=2){var s,h=l[i-1],u=l[i+1],c=(u?u.newPos:0)-i;h&&(l[i-1]=void 0);var d=h&&h.newPos+1<o,f=u&&0<=c&&c<a;if(d||f){if(!d||f&&h.newPos<u.newPos?(s=ix(u),n.pushComponent(s.components,void 0,!0)):((s=h).newPos++,n.pushComponent(s.components,!0,void 0)),c=n.extractCommon(s,e,t,i),s.newPos+1>=o&&c+1>=a)return ex(0,s.components);l[i]=s}else l[i]=void 0}r++}();if(d)return d}},pushComponent:function(t,e,i){var n=t[t.length-1];n&&n.added===e&&n.removed===i?t[t.length-1]={count:n.count+1,added:e,removed:i}:t.push({count:1,added:e,removed:i})},extractCommon:function(t,e,i,n){for(var o=e.length,a=i.length,r=t.newPos,s=r-n,l=0;r+1<o&&s+1<a&&this.equals(e[r+1],i[s+1]);)r++,s++,l++;return l&&t.components.push({count:l}),t.newPos=r,s},tokenize:function(t){return t.slice()},join:function(t){return t.slice()}};var fN=new tx,pN=function(t,e,i){return fN.diff(t,e,i)};nx.prototype.createElement=Hy,nx.prototype.getDefs=function(t){var e=this._svgRoot,i=this._svgRoot.getElementsByTagName("defs");return 0===i.length?t?((i=e.insertBefore(this.createElement("defs"),e.firstChild)).contains||(i.contains=function(t){var e=i.children;if(!e)return!1;for(var n=e.length-1;n>=0;--n)if(e[n]===t)return!0;return!1}),i):null:i[0]},nx.prototype.update=function(t,e){if(t){var i=this.getDefs(!1);if(t[this._domName]&&i.contains(t[this._domName]))"function"==typeof e&&e(t);else{var n=this.add(t);n&&(t[this._domName]=n)}}},nx.prototype.addDom=function(t){this.getDefs(!0).appendChild(t)},nx.prototype.removeDom=function(t){var e=this.getDefs(!1);e&&t[this._domName]&&(e.removeChild(t[this._domName]),t[this._domName]=null)},nx.prototype.getDoms=function(){var t=this.getDefs(!1);if(!t)return[];var e=[];return d(this._tagNames,function(i){var n=t.getElementsByTagName(i);e=e.concat([].slice.call(n))}),e},nx.prototype.markAllUnused=function(){var t=this;d(this.getDoms(),function(e){e[t._markLabel]="0"})},nx.prototype.markUsed=function(t){t&&(t[this._markLabel]="1")},nx.prototype.removeUnused=function(){var t=this.getDefs(!1);if(t){var e=this;d(this.getDoms(),function(i){"1"!==i[e._markLabel]&&t.removeChild(i)})}},nx.prototype.getSvgProxy=function(t){return t instanceof Mn?lN:t instanceof Je?hN:t instanceof Cb?uN:lN},nx.prototype.getTextSvgElement=function(t){return t.__textSvgEl},nx.prototype.getSvgElement=function(t){return t.__svgEl},h(ox,nx),ox.prototype.addWithoutUpdate=function(t,e){if(e&&e.style){var i=this;d(["fill","stroke"],function(n){if(e.style[n]&&("linear"===e.style[n].type||"radial"===e.style[n].type)){var o,a=e.style[n],r=i.getDefs(!0);a._dom?(o=a._dom,r.contains(a._dom)||i.addDom(o)):o=i.add(a),i.markUsed(e);var s=o.getAttribute("id");t.setAttribute(n,"url(#"+s+")")}})}},ox.prototype.add=function(t){var e;if("linear"===t.type)e=this.createElement("linearGradient");else{if("radial"!==t.type)return v_("Illegal gradient type."),null;e=this.createElement("radialGradient")}return t.id=t.id||this.nextId++,e.setAttribute("id","zr"+this._zrId+"-gradient-"+t.id),this.updateDom(t,e),this.addDom(e),e},ox.prototype.update=function(t){var e=this;nx.prototype.update.call(this,t,function(){var i=t.type,n=t._dom.tagName;"linear"===i&&"linearGradient"===n||"radial"===i&&"radialGradient"===n?e.updateDom(t,t._dom):(e.removeDom(t),e.add(t))})},ox.prototype.updateDom=function(t,e){if("linear"===t.type)e.setAttribute("x1",t.x),e.setAttribute("y1",t.y),e.setAttribute("x2",t.x2),e.setAttribute("y2",t.y2);else{if("radial"!==t.type)return void v_("Illegal gradient type.");e.setAttribute("cx",t.x),e.setAttribute("cy",t.y),e.setAttribute("r",t.r)}t.global?e.setAttribute("gradientUnits","userSpaceOnUse"):e.setAttribute("gradientUnits","objectBoundingBox"),e.innerHTML="";for(var i=t.colorStops,n=0,o=i.length;n<o;++n){var a=this.createElement("stop");a.setAttribute("offset",100*i[n].offset+"%"),a.setAttribute("stop-color",i[n].color),e.appendChild(a)}t._dom=e},ox.prototype.markUsed=function(t){if(t.style){var e=t.style.fill;e&&e._dom&&nx.prototype.markUsed.call(this,e._dom),(e=t.style.stroke)&&e._dom&&nx.prototype.markUsed.call(this,e._dom)}},h(ax,nx),ax.prototype.update=function(t){var e=this.getSvgElement(t);e&&this.updateDom(e,t.__clipPaths,!1);var i=this.getTextSvgElement(t);i&&this.updateDom(i,t.__clipPaths,!0),this.markUsed(t)},ax.prototype.updateDom=function(t,e,i){if(e&&e.length>0){var n,o,a=this.getDefs(!0),r=e[0],s=i?"_textDom":"_dom";r[s]?(o=r[s].getAttribute("id"),n=r[s],a.contains(n)||a.appendChild(n)):(o="zr"+this._zrId+"-clip-"+this.nextId,++this.nextId,(n=this.createElement("clipPath")).setAttribute("id",o),a.appendChild(n),r[s]=n);var l=this.getSvgProxy(r);if(r.transform&&r.parent.invTransform&&!i){var h=Array.prototype.slice.call(r.transform);ut(r.transform,r.parent.invTransform,r.transform),l.brush(r),r.transform=h}else l.brush(r);var u=this.getSvgElement(r);n.innerHTML="",n.appendChild(u.cloneNode()),t.setAttribute("clip-path","url(#"+o+")"),e.length>1&&this.updateDom(n,e.slice(1),i)}else t&&t.setAttribute("clip-path","none")},ax.prototype.markUsed=function(t){var e=this;t.__clipPaths&&t.__clipPaths.length>0&&d(t.__clipPaths,function(t){t._dom&&nx.prototype.markUsed.call(e,t._dom),t._textDom&&nx.prototype.markUsed.call(e,t._textDom)})},h(rx,nx),rx.prototype.addWithoutUpdate=function(t,e){if(e&&sx(e.style)){var i,n=e.style;n._shadowDom?(i=n._shadowDom,this.getDefs(!0).contains(n._shadowDom)||this.addDom(i)):i=this.add(e),this.markUsed(e);var o=i.getAttribute("id");t.style.filter="url(#"+o+")"}},rx.prototype.add=function(t){var e=this.createElement("filter"),i=t.style;return i._shadowDomId=i._shadowDomId||this.nextId++,e.setAttribute("id","zr"+this._zrId+"-shadow-"+i._shadowDomId),this.updateDom(t,e),this.addDom(e),e},rx.prototype.update=function(t,e){var i=e.style;if(sx(i)){var n=this;nx.prototype.update.call(this,e,function(t){n.updateDom(e,t._shadowDom)})}else this.remove(t,i)},rx.prototype.remove=function(t,e){null!=e._shadowDomId&&(this.removeDom(e),t.style.filter="")},rx.prototype.updateDom=function(t,e){var i=e.getElementsByTagName("feDropShadow");i=0===i.length?this.createElement("feDropShadow"):i[0];var n,o,a,r,s=t.style,l=t.scale?t.scale[0]||1:1,h=t.scale?t.scale[1]||1:1;if(s.shadowBlur||s.shadowOffsetX||s.shadowOffsetY)n=s.shadowOffsetX||0,o=s.shadowOffsetY||0,a=s.shadowBlur,r=s.shadowColor;else{if(!s.textShadowBlur)return void this.removeDom(e,s);n=s.textShadowOffsetX||0,o=s.textShadowOffsetY||0,a=s.textShadowBlur,r=s.textShadowColor}i.setAttribute("dx",n/l),i.setAttribute("dy",o/h),i.setAttribute("flood-color",r);var u=a/2/l+" "+a/2/h;i.setAttribute("stdDeviation",u),e.setAttribute("x","-100%"),e.setAttribute("y","-100%"),e.setAttribute("width",Math.ceil(a/2*200)+"%"),e.setAttribute("height",Math.ceil(a/2*200)+"%"),e.appendChild(i),s._shadowDom=e},rx.prototype.markUsed=function(t){var e=t.style;e&&e._shadowDom&&nx.prototype.markUsed.call(this,e._shadowDom)};var gN=function(t,e,i,n){this.root=t,this.storage=e,this._opts=i=a({},i||{});var o=Hy("svg");o.setAttribute("xmlns","http://www.w3.org/2000/svg"),o.setAttribute("version","1.1"),o.setAttribute("baseProfile","full"),o.style.cssText="user-select:none;position:absolute;left:0;top:0;",this.gradientManager=new ox(n,o),this.clipPathManager=new ax(n,o),this.shadowManager=new rx(n,o);var r=document.createElement("div");r.style.cssText="overflow:hidden;position:relative",this._svgRoot=o,this._viewport=r,t.appendChild(r),r.appendChild(o),this.resize(i.width,i.height),this._visibleList=[]};gN.prototype={constructor:gN,getType:function(){return"svg"},getViewportRoot:function(){return this._viewport},getViewportRootOffset:function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},refresh:function(){var t=this.storage.getDisplayList(!0);this._paintList(t)},_paintList:function(t){this.gradientManager.markAllUnused(),this.clipPathManager.markAllUnused(),this.shadowManager.markAllUnused();var e,i=this._svgRoot,n=this._visibleList,o=t.length,a=[];for(e=0;e<o;e++){var r=hx(f=t[e]),s=gx(f)||px(f);f.invisible||(f.__dirty&&(r&&r.brush(f),this.clipPathManager.update(f),f.style&&(this.gradientManager.update(f.style.fill),this.gradientManager.update(f.style.stroke),this.shadowManager.update(s,f)),f.__dirty=!1),a.push(f))}var l,h=pN(n,a);for(e=0;e<h.length;e++)if((c=h[e]).removed)for(d=0;d<c.count;d++){var s=gx(f=n[c.indices[d]]),u=px(f);fx(i,s),fx(i,u)}for(e=0;e<h.length;e++){var c=h[e];if(c.added)for(d=0;d<c.count;d++){var s=gx(f=a[c.indices[d]]),u=px(f);l?cx(i,s,l):dx(i,s),s?cx(i,u,s):l?cx(i,u,l):dx(i,u),cx(i,u,s),l=u||s||l,this.gradientManager.addWithoutUpdate(s,f),this.shadowManager.addWithoutUpdate(l,f),this.clipPathManager.markUsed(f)}else if(!c.removed)for(var d=0;d<c.count;d++){var f=a[c.indices[d]];l=s=px(f)||gx(f)||l,this.gradientManager.markUsed(f),this.gradientManager.addWithoutUpdate(s,f),this.shadowManager.markUsed(f),this.shadowManager.addWithoutUpdate(s,f),this.clipPathManager.markUsed(f)}}this.gradientManager.removeUnused(),this.clipPathManager.removeUnused(),this.shadowManager.removeUnused(),this._visibleList=a},_getDefs:function(t){var e=this._svgRoot,i=this._svgRoot.getElementsByTagName("defs");return 0===i.length?t?((i=e.insertBefore(Hy("defs"),e.firstChild)).contains||(i.contains=function(t){var e=i.children;if(!e)return!1;for(var n=e.length-1;n>=0;--n)if(e[n]===t)return!0;return!1}),i):null:i[0]},resize:function(t,e){var i=this._viewport;i.style.display="none";var n=this._opts;if(null!=t&&(n.width=t),null!=e&&(n.height=e),t=this._getSize(0),e=this._getSize(1),i.style.display="",this._width!==t||this._height!==e){this._width=t,this._height=e;var o=i.style;o.width=t+"px",o.height=e+"px";var a=this._svgRoot;a.setAttribute("width",t),a.setAttribute("height",e)}},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,i=["width","height"][t],n=["clientWidth","clientHeight"][t],o=["paddingLeft","paddingTop"][t],a=["paddingRight","paddingBottom"][t];if(null!=e[i]&&"auto"!==e[i])return parseFloat(e[i]);var r=this.root,s=document.defaultView.getComputedStyle(r);return(r[n]||lx(s[i])||lx(r.style[i]))-(lx(s[o])||0)-(lx(s[a])||0)|0},dispose:function(){this.root.innerHTML="",this._svgRoot=this._viewport=this.storage=null},clear:function(){this._viewport&&this.root.removeChild(this._viewport)},pathToSvg:function(){this.refresh();var t=this._svgRoot.outerHTML;return"data:img/svg+xml;utf-8,"+unescape(t)}},d(["getLayer","insertLayer","eachLayer","eachBuiltinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],function(t){gN.prototype[t]=mx(t)}),wi("svg",gN),t.version="4.0.2",t.dependencies=BM,t.PRIORITY=FM,t.init=function(t,e,i){var n=as(t);if(n)return n;var o=new Rr(t,e,i);return o.id="ec_"+aI++,nI[o.id]=o,Ei(t,sI,o.id),ns(o),o},t.connect=function(t){if(y(t)){var e=t;t=null,NM(e,function(e){null!=e.group&&(t=e.group)}),t=t||"g_"+rI++,NM(e,function(e){e.group=t})}return oI[t]=!0,t},t.disConnect=os,t.disconnect=hI,t.dispose=function(t){"string"==typeof t?t=nI[t]:t instanceof Rr||(t=as(t)),t instanceof Rr&&!t.isDisposed()&&t.dispose()},t.getInstanceByDom=as,t.getInstanceById=function(t){return nI[t]},t.registerTheme=rs,t.registerPreprocessor=ss,t.registerProcessor=ls,t.registerPostUpdate=function(t){QM.push(t)},t.registerAction=hs,t.registerCoordinateSystem=us,t.getCoordinateSystemDimensions=function(t){var e=Aa.get(t);if(e)return e.getDimensionsInfo?e.getDimensionsInfo():e.dimensions.slice()},t.registerLayout=cs,t.registerVisual=ds,t.registerLoading=ps,t.extendComponentModel=gs,t.extendComponentView=ms,t.extendSeriesModel=vs,t.extendChartView=ys,t.setCanvasCreator=function(t){e("createCanvas",t)},t.registerMap=function(t,e,i){e.geoJson&&!e.features&&(i=e.specialAreas,e=e.geoJson),"string"==typeof e&&(e="undefined"!=typeof JSON&&JSON.parse?JSON.parse(e):new Function("return ("+e+");")()),lI[t]={geoJson:e,specialAreas:i}},t.getMap=xs,t.dataTool=uI,t.zrender=fw,t.graphic=tS,t.number=cS,t.format=yS,t.throttle=vr,t.helper=JI,t.matrix=Yx,t.vector=Wx,t.color=c_,t.parseGeoJSON=tT,t.parseGeoJson=oT,t.util=aT,t.List=yI,t.Model=_o,t.Axis=nT,t.env=_x});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/chartJs/echarts.simple.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/chartJs/echarts.simple.min.js
new file mode 100644
index 0000000..daa6c6d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/chartJs/echarts.simple.min.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.echarts={})}(this,function(t){"use strict";function e(t,e){"createCanvas"===t&&(Kl=null),jl[t]=e}function n(t){if(null==t||"object"!=typeof t)return t;var e=t,i=Hl.call(t);if("[object Array]"===i){if(!E(t)){e=[];for(var r=0,a=t.length;r<a;r++)e[r]=n(t[r])}}else if(Wl[i]){if(!E(t)){var o=t.constructor;if(t.constructor.from)e=o.from(t);else{e=new o(t.length);for(var r=0,a=t.length;r<a;r++)e[r]=n(t[r])}}}else if(!Vl[i]&&!E(t)&&!M(t)){e={};for(var s in t)t.hasOwnProperty(s)&&(e[s]=n(t[s]))}return e}function i(t,e,r){if(!w(e)||!w(t))return r?n(e):t;for(var a in e)if(e.hasOwnProperty(a)){var o=t[a],s=e[a];!w(s)||!w(o)||y(s)||y(o)||M(s)||M(o)||b(s)||b(o)||E(s)||E(o)?!r&&a in t||(t[a]=n(e[a],!0)):i(o,s,r)}return t}function r(t,e){for(var n=t[0],r=1,a=t.length;r<a;r++)n=i(n,t[r],e);return n}function a(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function o(t,e,n){for(var i in e)e.hasOwnProperty(i)&&(n?null!=e[i]:null==t[i])&&(t[i]=e[i]);return t}function s(){return Kl||(Kl=$l().getContext("2d")),Kl}function l(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function h(t,e){function n(){}var i=t.prototype;n.prototype=e.prototype,t.prototype=new n;for(var r in i)t.prototype[r]=i[r];t.prototype.constructor=t,t.superClass=e}function u(t,e,n){o(t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,n)}function c(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function f(t,e,n){if(t&&e)if(t.forEach&&t.forEach===ql)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var a in t)t.hasOwnProperty(a)&&e.call(n,t[a],a,t)}function d(t,e,n){if(t&&e){if(t.map&&t.map===Yl)return t.map(e,n);for(var i=[],r=0,a=t.length;r<a;r++)i.push(e.call(n,t[r],r,t));return i}}function p(t,e,n,i){if(t&&e){if(t.reduce&&t.reduce===Ul)return t.reduce(e,n,i);for(var r=0,a=t.length;r<a;r++)n=e.call(i,n,t[r],r,t);return n}}function g(t,e,n){if(t&&e){if(t.filter&&t.filter===Xl)return t.filter(e,n);for(var i=[],r=0,a=t.length;r<a;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}}function m(t,e){var n=Zl.call(arguments,2);return function(){return t.apply(e,n.concat(Zl.call(arguments)))}}function v(t){var e=Zl.call(arguments,1);return function(){return t.apply(this,e.concat(Zl.call(arguments)))}}function y(t){return"[object Array]"===Hl.call(t)}function _(t){return"function"==typeof t}function x(t){return"[object String]"===Hl.call(t)}function w(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function b(t){return!!Vl[Hl.call(t)]}function S(t){return!!Wl[Hl.call(t)]}function M(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function T(t){return t!==t}function I(t){for(var e=0,n=arguments.length;e<n;e++)if(null!=arguments[e])return arguments[e]}function C(t,e){return null!=t?t:e}function k(t,e,n){return null!=t?t:null!=e?e:n}function D(){return Function.call.apply(Zl,arguments)}function A(t){if("number"==typeof t)return[t,t,t,t];var e=t.length;return 2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function L(t,e){if(!t)throw new Error(e)}function P(t){return null==t?null:"function"==typeof t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}function O(t){t[Ql]=!0}function E(t){return t[Ql]}function B(t){function e(t,e){n?i.set(t,e):i.set(e,t)}var n=y(t),i=this;t instanceof B?t.each(e):t&&f(t,e)}function R(t){return new B(t)}function z(){}function N(t,e){var n=new Jl(2);return null==t&&(t=0),null==e&&(e=0),n[0]=t,n[1]=e,n}function F(t){var e=new Jl(2);return e[0]=t[0],e[1]=t[1],e}function V(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t}function W(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t}function H(t){return Math.sqrt(G(t))}function G(t){return t[0]*t[0]+t[1]*t[1]}function q(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t}function X(t,e){var n=H(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t}function Z(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))}function Y(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t}function U(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t}function j(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}function $(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function K(t,e){return{target:t,topTarget:e&&e.topTarget}}function Q(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which}}function J(){}function tt(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i,r=t;r;){if(r.clipPath&&!r.clipPath.contain(e,n))return!1;r.silent&&(i=!0),r=r.parent}return!i||rh}return!1}function et(){var t=new sh(6);return nt(t),t}function nt(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function it(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function rt(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],a=e[0]*n[2]+e[2]*n[3],o=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t}function at(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function ot(t,e,n){var i=e[0],r=e[2],a=e[4],o=e[1],s=e[3],l=e[5],h=Math.sin(n),u=Math.cos(n);return t[0]=i*u+o*h,t[1]=-i*h+o*u,t[2]=r*u+s*h,t[3]=-r*h+u*s,t[4]=u*a+h*l,t[5]=u*l-h*a,t}function st(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function lt(t,e){var n=e[0],i=e[2],r=e[4],a=e[1],o=e[3],s=e[5],l=n*o-a*i;return l?(l=1/l,t[0]=o*l,t[1]=-a*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-o*r)*l,t[5]=(a*r-n*s)*l,t):null}function ht(t){return t>hh||t<-hh}function ut(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}function ct(t){return(t=Math.round(t))<0?0:t>255?255:t}function ft(t){return t<0?0:t>1?1:t}function dt(t){return ct(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function pt(t){return ft(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function gt(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function mt(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function vt(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function yt(t,e){wh&&vt(wh,e),wh=xh.put(t,wh||e.slice())}function _t(t,e){if(t){e=e||[];var n=xh.get(t);if(n)return vt(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in _h)return vt(e,_h[i]),yt(t,e),e;if("#"!==i.charAt(0)){var r=i.indexOf("("),a=i.indexOf(")");if(-1!==r&&a+1===i.length){var o=i.substr(0,r),s=i.substr(r+1,a-(r+1)).split(","),l=1;switch(o){case"rgba":if(4!==s.length)return void mt(e,0,0,0,1);l=pt(s.pop());case"rgb":return 3!==s.length?void mt(e,0,0,0,1):(mt(e,dt(s[0]),dt(s[1]),dt(s[2]),l),yt(t,e),e);case"hsla":return 4!==s.length?void mt(e,0,0,0,1):(s[3]=pt(s[3]),xt(s,e),yt(t,e),e);case"hsl":return 3!==s.length?void mt(e,0,0,0,1):(xt(s,e),yt(t,e),e);default:return}}mt(e,0,0,0,1)}else{if(4===i.length)return(h=parseInt(i.substr(1),16))>=0&&h<=4095?(mt(e,(3840&h)>>4|(3840&h)>>8,240&h|(240&h)>>4,15&h|(15&h)<<4,1),yt(t,e),e):void mt(e,0,0,0,1);if(7===i.length){var h=parseInt(i.substr(1),16);return h>=0&&h<=16777215?(mt(e,(16711680&h)>>16,(65280&h)>>8,255&h,1),yt(t,e),e):void mt(e,0,0,0,1)}}}}function xt(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=pt(t[1]),r=pt(t[2]),a=r<=.5?r*(i+1):r+i-r*i,o=2*r-a;return e=e||[],mt(e,ct(255*gt(o,a,n+1/3)),ct(255*gt(o,a,n)),ct(255*gt(o,a,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function wt(t,e){var n=_t(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0;return bt(n,4===n.length?"rgba":"rgb")}}function bt(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function St(t,e){return t[e]}function Mt(t,e,n){t[e]=n}function Tt(t,e,n){return(e-t)*n+t}function It(t,e,n){return n>.5?e:t}function Ct(t,e,n,i,r){var a=t.length;if(1==r)for(s=0;s<a;s++)i[s]=Tt(t[s],e[s],n);else for(var o=a&&t[0].length,s=0;s<a;s++)for(var l=0;l<o;l++)i[s][l]=Tt(t[s][l],e[s][l],n)}function kt(t,e,n){var i=t.length,r=e.length;if(i!==r)if(i>r)t.length=r;else for(o=i;o<r;o++)t.push(1===n?e[o]:bh.call(e[o]));for(var a=t[0]&&t[0].length,o=0;o<t.length;o++)if(1===n)isNaN(t[o])&&(t[o]=e[o]);else for(var s=0;s<a;s++)isNaN(t[o][s])&&(t[o][s]=e[o][s])}function Dt(t,e,n){if(t===e)return!0;var i=t.length;if(i!==e.length)return!1;if(1===n){for(a=0;a<i;a++)if(t[a]!==e[a])return!1}else for(var r=t[0].length,a=0;a<i;a++)for(var o=0;o<r;o++)if(t[a][o]!==e[a][o])return!1;return!0}function At(t,e,n,i,r,a,o,s,l){var h=t.length;if(1==l)for(c=0;c<h;c++)s[c]=Lt(t[c],e[c],n[c],i[c],r,a,o);else for(var u=t[0].length,c=0;c<h;c++)for(var f=0;f<u;f++)s[c][f]=Lt(t[c][f],e[c][f],n[c][f],i[c][f],r,a,o)}function Lt(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}function Pt(t){if(c(t)){var e=t.length;if(c(t[0])){for(var n=[],i=0;i<e;i++)n.push(bh.call(t[i]));return n}return bh.call(t)}return t}function Ot(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function Et(t){var e=t[t.length-1].value;return c(e&&e[0])?2:1}function Bt(t,e,n,i,r,a){var o=t._getter,s=t._setter,l="spline"===e,h=i.length;if(h){var u,f=c(i[0].value),d=!1,p=!1,g=f?Et(i):0;i.sort(function(t,e){return t.time-e.time}),u=i[h-1].time;for(var m=[],v=[],y=i[0].value,_=!0,x=0;x<h;x++){m.push(i[x].time/u);var w=i[x].value;if(f&&Dt(w,y,g)||!f&&w===y||(_=!1),y=w,"string"==typeof w){var b=_t(w);b?(w=b,d=!0):p=!0}v.push(w)}if(a||!_){for(var S=v[h-1],x=0;x<h-1;x++)f?kt(v[x],S,g):!isNaN(v[x])||isNaN(S)||p||d||(v[x]=S);f&&kt(o(t._target,r),S,g);var M,T,I,C,k,D,A=0,L=0;if(d)var P=[0,0,0,0];var O=new ut({target:t._target,life:u,loop:t._loop,delay:t._delay,onframe:function(t,e){var n;if(e<0)n=0;else if(e<L){for(n=M=Math.min(A+1,h-1);n>=0&&!(m[n]<=e);n--);n=Math.min(n,h-2)}else{for(n=A;n<h&&!(m[n]>e);n++);n=Math.min(n-1,h-2)}A=n,L=e;var i=m[n+1]-m[n];if(0!==i)if(T=(e-m[n])/i,l)if(C=v[n],I=v[0===n?n:n-1],k=v[n>h-2?h-1:n+1],D=v[n>h-3?h-1:n+2],f)At(I,C,k,D,T,T*T,T*T*T,o(t,r),g);else{if(d)a=At(I,C,k,D,T,T*T,T*T*T,P,1),a=Ot(P);else{if(p)return It(C,k,T);a=Lt(I,C,k,D,T,T*T,T*T*T)}s(t,r,a)}else if(f)Ct(v[n],v[n+1],T,o(t,r),g);else{var a;if(d)Ct(v[n],v[n+1],T,P,1),a=Ot(P);else{if(p)return It(v[n],v[n+1],T);a=Tt(v[n],v[n+1],T)}s(t,r,a)}},ondestroy:n});return e&&"spline"!==e&&(O.easing=e),O}}}function Rt(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}function zt(t){for(var e=0;t>=Eh;)e|=1&t,t>>=1;return t+e}function Nt(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r<n&&i(t[r],t[r-1])<0;)r++;Ft(t,e,r)}else for(;r<n&&i(t[r],t[r-1])>=0;)r++;return r-e}function Ft(t,e,n){for(n--;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}function Vt(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var a,o=t[i],s=e,l=i;s<l;)r(o,t[a=s+l>>>1])<0?l=a:s=a+1;var h=i-s;switch(h){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;h>0;)t[s+h]=t[s+h-1],h--}t[s]=o}}function Wt(t,e,n,i,r,a){var o=0,s=0,l=1;if(a(t,e[n+r])>0){for(s=i-r;l<s&&a(t,e[n+r+l])>0;)o=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),o+=r,l+=r}else{for(s=r+1;l<s&&a(t,e[n+r-l])<=0;)o=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var h=o;o=r-l,l=r-h}for(o++;o<l;){var u=o+(l-o>>>1);a(t,e[n+u])>0?o=u+1:l=u}return l}function Ht(t,e,n,i,r,a){var o=0,s=0,l=1;if(a(t,e[n+r])<0){for(s=r+1;l<s&&a(t,e[n+r-l])<0;)o=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var h=o;o=r-l,l=r-h}else{for(s=i-r;l<s&&a(t,e[n+r+l])>=0;)o=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),o+=r,l+=r}for(o++;o<l;){var u=o+(l-o>>>1);a(t,e[n+u])<0?l=u:o=u+1}return l}function Gt(t,e){function n(n){var s=a[n],h=o[n],u=a[n+1],c=o[n+1];o[n]=h+c,n===l-3&&(a[n+1]=a[n+2],o[n+1]=o[n+2]),l--;var f=Ht(t[u],t,s,h,0,e);s+=f,0!==(h-=f)&&0!==(c=Wt(t[s+h-1],t,u,c,c-1,e))&&(h<=c?i(s,h,u,c):r(s,h,u,c))}function i(n,i,r,a){var o=0;for(o=0;o<i;o++)h[o]=t[n+o];var l=0,u=r,c=n;if(t[c++]=t[u++],0!=--a)if(1!==i){for(var f,d,p,g=s;;){f=0,d=0,p=!1;do{if(e(t[u],h[l])<0){if(t[c++]=t[u++],d++,f=0,0==--a){p=!0;break}}else if(t[c++]=h[l++],f++,d=0,1==--i){p=!0;break}}while((f|d)<g);if(p)break;do{if(0!==(f=Ht(t[u],h,l,i,0,e))){for(o=0;o<f;o++)t[c+o]=h[l+o];if(c+=f,l+=f,(i-=f)<=1){p=!0;break}}if(t[c++]=t[u++],0==--a){p=!0;break}if(0!==(d=Wt(h[l],t,u,a,0,e))){for(o=0;o<d;o++)t[c+o]=t[u+o];if(c+=d,u+=d,0===(a-=d)){p=!0;break}}if(t[c++]=h[l++],1==--i){p=!0;break}g--}while(f>=Bh||d>=Bh);if(p)break;g<0&&(g=0),g+=2}if((s=g)<1&&(s=1),1===i){for(o=0;o<a;o++)t[c+o]=t[u+o];t[c+a]=h[l]}else{if(0===i)throw new Error;for(o=0;o<i;o++)t[c+o]=h[l+o]}}else{for(o=0;o<a;o++)t[c+o]=t[u+o];t[c+a]=h[l]}else for(o=0;o<i;o++)t[c+o]=h[l+o]}function r(n,i,r,a){var o=0;for(o=0;o<a;o++)h[o]=t[r+o];var l=n+i-1,u=a-1,c=r+a-1,f=0,d=0;if(t[c--]=t[l--],0!=--i)if(1!==a){for(var p=s;;){var g=0,m=0,v=!1;do{if(e(h[u],t[l])<0){if(t[c--]=t[l--],g++,m=0,0==--i){v=!0;break}}else if(t[c--]=h[u--],m++,g=0,1==--a){v=!0;break}}while((g|m)<p);if(v)break;do{if(0!=(g=i-Ht(h[u],t,n,i,i-1,e))){for(i-=g,d=(c-=g)+1,f=(l-=g)+1,o=g-1;o>=0;o--)t[d+o]=t[f+o];if(0===i){v=!0;break}}if(t[c--]=h[u--],1==--a){v=!0;break}if(0!=(m=a-Wt(t[l],h,0,a,a-1,e))){for(a-=m,d=(c-=m)+1,f=(u-=m)+1,o=0;o<m;o++)t[d+o]=h[f+o];if(a<=1){v=!0;break}}if(t[c--]=t[l--],0==--i){v=!0;break}p--}while(g>=Bh||m>=Bh);if(v)break;p<0&&(p=0),p+=2}if((s=p)<1&&(s=1),1===a){for(d=(c-=i)+1,f=(l-=i)+1,o=i-1;o>=0;o--)t[d+o]=t[f+o];t[c]=h[u]}else{if(0===a)throw new Error;for(f=c-(a-1),o=0;o<a;o++)t[f+o]=h[o]}}else{for(d=(c-=i)+1,f=(l-=i)+1,o=i-1;o>=0;o--)t[d+o]=t[f+o];t[c]=h[u]}else for(f=c-(a-1),o=0;o<a;o++)t[f+o]=h[o]}var a,o,s=Bh,l=0,h=[];a=[],o=[],this.mergeRuns=function(){for(;l>1;){var t=l-2;if(t>=1&&o[t-1]<=o[t]+o[t+1]||t>=2&&o[t-2]<=o[t]+o[t-1])o[t-1]<o[t+1]&&t--;else if(o[t]>o[t+1])break;n(t)}},this.forceMergeRuns=function(){for(;l>1;){var t=l-2;t>0&&o[t-1]<o[t+1]&&t--,n(t)}},this.pushRun=function(t,e){a[l]=t,o[l]=e,l+=1}}function qt(t,e,n,i){n||(n=0),i||(i=t.length);var r=i-n;if(!(r<2)){var a=0;if(r<Eh)return a=Nt(t,n,i,e),void Vt(t,n,i,n+a,e);var o=new Gt(t,e),s=zt(r);do{if((a=Nt(t,n,i,e))<s){var l=r;l>s&&(l=s),Vt(t,n,n+l,n+a,e),a=l}o.pushRun(n,a),o.mergeRuns(),r-=a,n+=a}while(0!==r);o.forceMergeRuns()}}function Xt(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}function Zt(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,a=null==e.y?0:e.y,o=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,a=a*n.height+n.y,o=o*n.height+n.y),t.createLinearGradient(i,a,r,o)}function Yt(t,e,n){var i=n.width,r=n.height,a=Math.min(i,r),o=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;return e.global||(o=o*i+n.x,s=s*r+n.y,l*=a),t.createRadialGradient(o,s,0,o,s,l)}function Ut(){return!1}function jt(t,e,n){var i=$l(),r=e.getWidth(),a=e.getHeight(),o=i.style;return o&&(o.position="absolute",o.left=0,o.top=0,o.width=r+"px",o.height=a+"px",i.setAttribute("data-zr-dom-id",t)),i.width=r*n,i.height=a*n,i}function $t(t){if("string"==typeof t){var e=Yh.get(t);return e&&e.image}return t}function Kt(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var a=Yh.get(t),o={hostEl:n,cb:i,cbPayload:r};return a?!Jt(e=a.image)&&a.pending.push(o):(!e&&(e=new Image),e.onload=Qt,Yh.put(t,e.__cachedImgObj={image:e,pending:[o]}),e.src=e.__zrImageSrc=t),e}return t}return e}function Qt(){var t=this.__cachedImgObj;this.onload=this.__cachedImgObj=null;for(var e=0;e<t.pending.length;e++){var n=t.pending[e],i=n.cb;i&&i(this,n.cbPayload),n.hostEl.dirty()}t.pending.length=0}function Jt(t){return t&&t.width&&t.height}function te(t,e){var n=t+":"+(e=e||Qh);if(Uh[n])return Uh[n];for(var i=(t+"").split("\n"),r=0,a=0,o=i.length;a<o;a++)r=Math.max(fe(i[a],e).width,r);return jh>$h&&(jh=0,Uh={}),jh++,Uh[n]=r,r}function ee(t,e,n,i,r,a,o){return a?ie(t,e,n,i,r,a,o):ne(t,e,n,i,r,o)}function ne(t,e,n,i,r,a){var o=de(t,e,r,a),s=te(t,e);r&&(s+=r[1]+r[3]);var l=o.outerHeight,h=new Rt(re(0,s,n),ae(0,l,i),s,l);return h.lineHeight=o.lineHeight,h}function ie(t,e,n,i,r,a,o){var s=pe(t,{rich:a,truncate:o,font:e,textAlign:n,textPadding:r}),l=s.outerWidth,h=s.outerHeight;return new Rt(re(0,l,n),ae(0,h,i),l,h)}function re(t,e,n){return"right"===n?t-=e:"center"===n&&(t-=e/2),t}function ae(t,e,n){return"middle"===n?t-=e/2:"bottom"===n&&(t-=e),t}function oe(t,e,n){var i=e.x,r=e.y,a=e.height,o=e.width,s=a/2,l="left",h="top";switch(t){case"left":i-=n,r+=s,l="right",h="middle";break;case"right":i+=n+o,r+=s,h="middle";break;case"top":i+=o/2,r-=n,l="center",h="bottom";break;case"bottom":i+=o/2,r+=a+n,l="center";break;case"inside":i+=o/2,r+=s,l="center",h="middle";break;case"insideLeft":i+=n,r+=s,h="middle";break;case"insideRight":i+=o-n,r+=s,l="right",h="middle";break;case"insideTop":i+=o/2,r+=n,l="center";break;case"insideBottom":i+=o/2,r+=a-n,l="center",h="bottom";break;case"insideTopLeft":i+=n,r+=n;break;case"insideTopRight":i+=o-n,r+=n,l="right";break;case"insideBottomLeft":i+=n,r+=a-n,h="bottom";break;case"insideBottomRight":i+=o-n,r+=a-n,l="right",h="bottom"}return{x:i,y:r,textAlign:l,textVerticalAlign:h}}function se(t,e,n,i,r){if(!e)return"";var a=(t+"").split("\n");r=le(e,n,i,r);for(var o=0,s=a.length;o<s;o++)a[o]=he(a[o],r);return a.join("\n")}function le(t,e,n,i){(i=a({},i)).font=e;var n=C(n,"...");i.maxIterations=C(i.maxIterations,2);var r=i.minChar=C(i.minChar,0);i.cnCharWidth=te("国",e);var o=i.ascCharWidth=te("a",e);i.placeholder=C(i.placeholder,"");for(var s=t=Math.max(0,t-1),l=0;l<r&&s>=o;l++)s-=o;var h=te(n);return h>s&&(n="",h=0),s=t-h,i.ellipsis=n,i.ellipsisWidth=h,i.contentWidth=s,i.containerWidth=t,i}function he(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var a=te(t,i);if(a<=n)return t;for(var o=0;;o++){if(a<=r||o>=e.maxIterations){t+=e.ellipsis;break}var s=0===o?ue(t,r,e.ascCharWidth,e.cnCharWidth):a>0?Math.floor(t.length*r/a):0;a=te(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function ue(t,e,n,i){for(var r=0,a=0,o=t.length;a<o&&r<e;a++){var s=t.charCodeAt(a);r+=0<=s&&s<=127?n:i}return a}function ce(t){return te("国",t)}function fe(t,e){return Jh.measureText(t,e)}function de(t,e,n,i){null!=t&&(t+="");var r=ce(e),a=t?t.split("\n"):[],o=a.length*r,s=o;if(n&&(s+=n[0]+n[2]),t&&i){var l=i.outerHeight,h=i.outerWidth;if(null!=l&&s>l)t="",a=[];else if(null!=h)for(var u=le(h-(n?n[1]+n[3]:0),e,i.ellipsis,{minChar:i.minChar,placeholder:i.placeholder}),c=0,f=a.length;c<f;c++)a[c]=he(a[c],u)}return{lines:a,height:o,outerHeight:s,lineHeight:r}}function pe(t,e){var n={lines:[],width:0,height:0};if(null!=t&&(t+=""),!t)return n;for(var i,r=Kh.lastIndex=0;null!=(i=Kh.exec(t));){var a=i.index;a>r&&ge(n,t.substring(r,a)),ge(n,i[2],i[1]),r=Kh.lastIndex}r<t.length&&ge(n,t.substring(r,t.length));var o=n.lines,s=0,l=0,h=[],u=e.textPadding,c=e.truncate,f=c&&c.outerWidth,d=c&&c.outerHeight;u&&(null!=f&&(f-=u[1]+u[3]),null!=d&&(d-=u[0]+u[2]));for(A=0;A<o.length;A++){for(var p=o[A],g=0,m=0,v=0;v<p.tokens.length;v++){var y=(L=p.tokens[v]).styleName&&e.rich[L.styleName]||{},_=L.textPadding=y.textPadding,x=L.font=y.font||e.font,w=L.textHeight=C(y.textHeight,ce(x));if(_&&(w+=_[0]+_[2]),L.height=w,L.lineHeight=k(y.textLineHeight,e.textLineHeight,w),L.textAlign=y&&y.textAlign||e.textAlign,L.textVerticalAlign=y&&y.textVerticalAlign||"middle",null!=d&&s+L.lineHeight>d)return{lines:[],width:0,height:0};L.textWidth=te(L.text,x);var b=y.textWidth,S=null==b||"auto"===b;if("string"==typeof b&&"%"===b.charAt(b.length-1))L.percentWidth=b,h.push(L),b=0;else{if(S){b=L.textWidth;var M=y.textBackgroundColor,T=M&&M.image;T&&Jt(T=$t(T))&&(b=Math.max(b,T.width*w/T.height))}var I=_?_[1]+_[3]:0;b+=I;var D=null!=f?f-m:null;null!=D&&D<b&&(!S||D<I?(L.text="",L.textWidth=b=0):(L.text=se(L.text,D-I,x,c.ellipsis,{minChar:c.minChar}),L.textWidth=te(L.text,x),b=L.textWidth+I))}m+=L.width=b,y&&(g=Math.max(g,L.lineHeight))}p.width=m,p.lineHeight=g,s+=g,l=Math.max(l,m)}n.outerWidth=n.width=C(e.textWidth,l),n.outerHeight=n.height=C(e.textHeight,s),u&&(n.outerWidth+=u[1]+u[3],n.outerHeight+=u[0]+u[2]);for(var A=0;A<h.length;A++){var L=h[A],P=L.percentWidth;L.width=parseInt(P,10)/100*l}return n}function ge(t,e,n){for(var i=""===e,r=e.split("\n"),a=t.lines,o=0;o<r.length;o++){var s=r[o],l={styleName:n,text:s,isLineHolder:!s&&!i};if(o)a.push({tokens:[l]});else{var h=(a[a.length-1]||(a[0]={tokens:[]})).tokens,u=h.length;1===u&&h[0].isLineHolder?h[0]=l:(s||!u||i)&&h.push(l)}}}function me(t){var e=(t.fontSize||t.fontFamily)&&[t.fontStyle,t.fontWeight,(t.fontSize||12)+"px",t.fontFamily||"sans-serif"].join(" ");return e&&P(e)||t.textFont||t.font}function ve(t,e){var n,i,r,a,o=e.x,s=e.y,l=e.width,h=e.height,u=e.r;l<0&&(o+=l,l=-l),h<0&&(s+=h,h=-h),"number"==typeof u?n=i=r=a=u:u instanceof Array?1===u.length?n=i=r=a=u[0]:2===u.length?(n=r=u[0],i=a=u[1]):3===u.length?(n=u[0],i=a=u[1],r=u[2]):(n=u[0],i=u[1],r=u[2],a=u[3]):n=i=r=a=0;var c;n+i>l&&(n*=l/(c=n+i),i*=l/c),r+a>l&&(r*=l/(c=r+a),a*=l/c),i+r>h&&(i*=h/(c=i+r),r*=h/c),n+a>h&&(n*=h/(c=n+a),a*=h/c),t.moveTo(o+n,s),t.lineTo(o+l-i,s),0!==i&&t.quadraticCurveTo(o+l,s,o+l,s+i),t.lineTo(o+l,s+h-r),0!==r&&t.quadraticCurveTo(o+l,s+h,o+l-r,s+h),t.lineTo(o+a,s+h),0!==a&&t.quadraticCurveTo(o,s+h,o,s+h-a),t.lineTo(o,s+n),0!==n&&t.quadraticCurveTo(o,s,o+n,s)}function ye(t){return _e(t),f(t.rich,_e),t}function _e(t){if(t){t.font=me(t);var e=t.textAlign;"middle"===e&&(e="center"),t.textAlign=null==e||tu[e]?e:"left";var n=t.textVerticalAlign||t.textBaseline;"center"===n&&(n="middle"),t.textVerticalAlign=null==n||eu[n]?n:"top",t.textPadding&&(t.textPadding=A(t.textPadding))}}function xe(t,e,n,i,r){i.rich?be(t,e,n,i,r):we(t,e,n,i,r)}function we(t,e,n,i,r){var a=Ae(e,"font",i.font||Qh),o=i.textPadding,s=t.__textCotentBlock;s&&!t.__dirty||(s=t.__textCotentBlock=de(n,a,o,i.truncate));var l=s.outerHeight,h=s.lines,u=s.lineHeight,c=De(l,i,r),f=c.baseX,d=c.baseY,p=c.textAlign,g=c.textVerticalAlign;Me(e,i,r,f,d);var m=ae(d,l,g),v=f,y=m,_=Ie(i);if(_||o){var x=te(n,a);o&&(x+=o[1]+o[3]);var w=re(f,x,p);_&&Ce(t,e,i,w,m,x,l),o&&(v=Ee(f,p,o),y+=o[0])}Ae(e,"textAlign",p||"left"),Ae(e,"textBaseline","middle"),Ae(e,"shadowBlur",i.textShadowBlur||0),Ae(e,"shadowColor",i.textShadowColor||"transparent"),Ae(e,"shadowOffsetX",i.textShadowOffsetX||0),Ae(e,"shadowOffsetY",i.textShadowOffsetY||0),y+=u/2;var b=i.textStrokeWidth,S=Le(i.textStroke,b),M=Pe(i.textFill);S&&(Ae(e,"lineWidth",b),Ae(e,"strokeStyle",S)),M&&Ae(e,"fillStyle",M);for(var T=0;T<h.length;T++)S&&e.strokeText(h[T],v,y),M&&e.fillText(h[T],v,y),y+=u}function be(t,e,n,i,r){var a=t.__textCotentBlock;a&&!t.__dirty||(a=t.__textCotentBlock=pe(n,i)),Se(t,e,a,i,r)}function Se(t,e,n,i,r){var a=n.width,o=n.outerWidth,s=n.outerHeight,l=i.textPadding,h=De(s,i,r),u=h.baseX,c=h.baseY,f=h.textAlign,d=h.textVerticalAlign;Me(e,i,r,u,c);var p=re(u,o,f),g=ae(c,s,d),m=p,v=g;l&&(m+=l[3],v+=l[0]);var y=m+a;Ie(i)&&Ce(t,e,i,p,g,o,s);for(var _=0;_<n.lines.length;_++){for(var x,w=n.lines[_],b=w.tokens,S=b.length,M=w.lineHeight,T=w.width,I=0,C=m,k=y,D=S-1;I<S&&(!(x=b[I]).textAlign||"left"===x.textAlign);)Te(t,e,x,i,M,v,C,"left"),T-=x.width,C+=x.width,I++;for(;D>=0&&"right"===(x=b[D]).textAlign;)Te(t,e,x,i,M,v,k,"right"),T-=x.width,k-=x.width,D--;for(C+=(a-(C-m)-(y-k)-T)/2;I<=D;)Te(t,e,x=b[I],i,M,v,C+x.width/2,"center"),C+=x.width,I++;v+=M}}function Me(t,e,n,i,r){if(n&&e.textRotation){var a=e.textOrigin;"center"===a?(i=n.width/2+n.x,r=n.height/2+n.y):a&&(i=a[0]+n.x,r=a[1]+n.y),t.translate(i,r),t.rotate(-e.textRotation),t.translate(-i,-r)}}function Te(t,e,n,i,r,a,o,s){var l=i.rich[n.styleName]||{},h=n.textVerticalAlign,u=a+r/2;"top"===h?u=a+n.height/2:"bottom"===h&&(u=a+r-n.height/2),!n.isLineHolder&&Ie(l)&&Ce(t,e,l,"right"===s?o-n.width:"center"===s?o-n.width/2:o,u-n.height/2,n.width,n.height);var c=n.textPadding;c&&(o=Ee(o,s,c),u-=n.height/2-c[2]-n.textHeight/2),Ae(e,"shadowBlur",k(l.textShadowBlur,i.textShadowBlur,0)),Ae(e,"shadowColor",l.textShadowColor||i.textShadowColor||"transparent"),Ae(e,"shadowOffsetX",k(l.textShadowOffsetX,i.textShadowOffsetX,0)),Ae(e,"shadowOffsetY",k(l.textShadowOffsetY,i.textShadowOffsetY,0)),Ae(e,"textAlign",s),Ae(e,"textBaseline","middle"),Ae(e,"font",n.font||Qh);var f=Le(l.textStroke||i.textStroke,p),d=Pe(l.textFill||i.textFill),p=C(l.textStrokeWidth,i.textStrokeWidth);f&&(Ae(e,"lineWidth",p),Ae(e,"strokeStyle",f),e.strokeText(n.text,o,u)),d&&(Ae(e,"fillStyle",d),e.fillText(n.text,o,u))}function Ie(t){return t.textBackgroundColor||t.textBorderWidth&&t.textBorderColor}function Ce(t,e,n,i,r,a,o){var s=n.textBackgroundColor,l=n.textBorderWidth,h=n.textBorderColor,u=x(s);if(Ae(e,"shadowBlur",n.textBoxShadowBlur||0),Ae(e,"shadowColor",n.textBoxShadowColor||"transparent"),Ae(e,"shadowOffsetX",n.textBoxShadowOffsetX||0),Ae(e,"shadowOffsetY",n.textBoxShadowOffsetY||0),u||l&&h){e.beginPath();var c=n.textBorderRadius;c?ve(e,{x:i,y:r,width:a,height:o,r:c}):e.rect(i,r,a,o),e.closePath()}if(u)Ae(e,"fillStyle",s),e.fill();else if(w(s)){var f=s.image;(f=Kt(f,null,t,ke,s))&&Jt(f)&&e.drawImage(f,i,r,a,o)}l&&h&&(Ae(e,"lineWidth",l),Ae(e,"strokeStyle",h),e.stroke())}function ke(t,e){e.image=t}function De(t,e,n){var i=e.x||0,r=e.y||0,a=e.textAlign,o=e.textVerticalAlign;if(n){var s=e.textPosition;if(s instanceof Array)i=n.x+Oe(s[0],n.width),r=n.y+Oe(s[1],n.height);else{var l=oe(s,n,e.textDistance);i=l.x,r=l.y,a=a||l.textAlign,o=o||l.textVerticalAlign}var h=e.textOffset;h&&(i+=h[0],r+=h[1])}return{baseX:i,baseY:r,textAlign:a,textVerticalAlign:o}}function Ae(t,e,n){return t[e]=Nh(t,e,n),t[e]}function Le(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function Pe(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function Oe(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}function Ee(t,e,n){return"right"===e?t-n[1]:"center"===e?t+n[3]/2-n[1]/2:t+n[3]}function Be(t,e){return null!=t&&(t||e.textBackgroundColor||e.textBorderWidth&&e.textBorderColor||e.textPadding)}function Re(t){t=t||{},Dh.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new Vh(t.style,this),this._rect=null,this.__clipPaths=[]}function ze(t){Re.call(this,t)}function Ne(t){return parseInt(t,10)}function Fe(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}function Ve(t,e,n){return ru.copy(t.getBoundingRect()),t.transform&&ru.applyTransform(t.transform),au.width=e,au.height=n,!ru.intersect(au)}function We(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!0}function He(t,e){for(var n=0;n<t.length;n++){var i=t[n];i.setTransform(e),e.beginPath(),i.buildPath(e,i.shape),e.clip(),i.restoreTransform(e)}}function Ge(t,e){var n=document.createElement("div");return n.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",n}function qe(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function Xe(t,e,n,i){return n=n||{},i||!Fl.canvasSupported?Ze(t,e,n):Fl.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):Ze(t,e,n),n}function Ze(t,e,n){var i=qe(t);n.zrX=e.clientX-i.left,n.zrY=e.clientY-i.top}function Ye(t,e,n){if(null!=(e=e||window.event).zrX)return e;var i=e.type;if(i&&i.indexOf("touch")>=0){var r="touchend"!=i?e.targetTouches[0]:e.changedTouches[0];r&&Xe(t,r,e,n)}else Xe(t,e,e,n),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;var a=e.button;return null==e.which&&void 0!==a&&lu.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function Ue(t,e,n){su?t.addEventListener(e,n):t.attachEvent("on"+e,n)}function je(t,e,n){su?t.removeEventListener(e,n):t.detachEvent("on"+e,n)}function $e(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}function Ke(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}function Qe(t){return"mousewheel"===t&&Fl.browser.firefox?"DOMMouseScroll":t}function Je(t,e,n){var i=t._gestureMgr;"start"===n&&i.clear();var r=i.recognize(e,t.handler.findHover(e.zrX,e.zrY,null).target,t.dom);if("end"===n&&i.clear(),r){var a=r.type;e.gestureEvent=a,t.handler.dispatchToElement({target:r.target},a,r.event)}}function tn(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function en(t){var e=t.pointerType;return"pen"===e||"touch"===e}function nn(t){function e(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}f(du,function(e){t._handlers[e]=m(mu[e],t)}),f(gu,function(e){t._handlers[e]=m(mu[e],t)}),f(fu,function(n){t._handlers[n]=e(mu[n],t)})}function rn(t){function e(e,n){f(e,function(e){Ue(t,Qe(e),n._handlers[e])},n)}ih.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new uu,this._handlers={},nn(this),Fl.pointerEventsSupported?e(gu,this):(Fl.touchEventsSupported&&e(du,this),e(fu,this))}function an(t,e){return new xu(zl(),t,e)}function on(t){return t instanceof Array?t:null==t?[]:[t]}function sn(t,e,n){if(t){t[e]=t[e]||{},t.emphasis=t.emphasis||{},t.emphasis[e]=t.emphasis[e]||{};for(var i=0,r=n.length;i<r;i++){var a=n[i];!t.emphasis[e].hasOwnProperty(a)&&t[e].hasOwnProperty(a)&&(t.emphasis[e][a]=t[e][a])}}}function ln(t){return!bu(t)||Su(t)||t instanceof Date?t:t.value}function hn(t){return bu(t)&&!(t instanceof Array)}function un(t,e){e=(e||[]).slice();var n=d(t||[],function(t,e){return{exist:t}});return wu(e,function(t,i){if(bu(t)){for(r=0;r<n.length;r++)if(!n[r].option&&null!=t.id&&n[r].exist.id===t.id+"")return n[r].option=t,void(e[i]=null);for(var r=0;r<n.length;r++){var a=n[r].exist;if(!(n[r].option||null!=a.id&&null!=t.id||null==t.name||fn(t)||fn(a)||a.name!==t.name+""))return n[r].option=t,void(e[i]=null)}}}),wu(e,function(t,e){if(bu(t)){for(var i=0;i<n.length;i++){var r=n[i].exist;if(!n[i].option&&!fn(r)&&null==t.id){n[i].option=t;break}}i>=n.length&&n.push({option:t})}}),n}function cn(t){var e=R();wu(t,function(t,n){var i=t.exist;i&&e.set(i.id,t)}),wu(t,function(t,n){var i=t.option;L(!i||null==i.id||!e.get(i.id)||e.get(i.id)===t,"id duplicates: "+(i&&i.id)),i&&null!=i.id&&e.set(i.id,t),!t.keyInfo&&(t.keyInfo={})}),wu(t,function(t,n){var i=t.exist,r=t.option,a=t.keyInfo;if(bu(r)){if(a.name=null!=r.name?r.name+"":i?i.name:Mu,i)a.id=i.id;else if(null!=r.id)a.id=r.id+"";else{var o=0;do{a.id="\0"+a.name+"\0"+o++}while(e.get(a.id))}e.set(a.id,t)}})}function fn(t){return bu(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")}function dn(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?y(e.dataIndex)?d(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?y(e.name)?d(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0}function pn(){var t="__\0ec_inner_"+Iu+++"_"+Math.random().toFixed(5);return function(e){return e[t]||(e[t]={})}}function gn(t,e,n){if(x(e)){var i={};i[e+"Index"]=0,e=i}var r=n&&n.defaultMainType;!r||mn(e,r+"Index")||mn(e,r+"Id")||mn(e,r+"Name")||(e[r+"Index"]=0);var a={};return wu(e,function(i,r){var i=e[r];if("dataIndex"!==r&&"dataIndexInside"!==r){var o=r.match(/^(\w+)(Index|Id|Name)$/)||[],s=o[1],h=(o[2]||"").toLowerCase();if(!(!s||!h||null==i||"index"===h&&"none"===i||n&&n.includeMainTypes&&l(n.includeMainTypes,s)<0)){var u={mainType:s};"index"===h&&"all"===i||(u[h]=i);var c=t.queryComponents(u);a[s+"Models"]=c,a[s+"Model"]=c[0]}}else a[r]=i}),a}function mn(t,e){return t&&t.hasOwnProperty(e)}function vn(t,e,n){t.setAttribute?t.setAttribute(e,n):t[e]=n}function yn(t,e){return t.getAttribute?t.getAttribute(e):t[e]}function _n(t){var e={main:"",sub:""};return t&&(t=t.split(Cu),e.main=t[0]||"",e.sub=t[1]||""),e}function xn(t){L(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function wn(t,e){t.$constructor=t,t.extend=function(t){var e=this,n=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return a(n.prototype,t),n.extend=this.extend,n.superCall=Sn,n.superApply=Mn,h(n,this),n.superClass=e,n}}function bn(t){var e=["__\0is_clz",Du++,Math.random().toFixed(3)].join("_");t.prototype[e]=!0,t.isInstance=function(t){return!(!t||!t[e])}}function Sn(t,e){var n=D(arguments,2);return this.superClass.prototype[e].apply(t,n)}function Mn(t,e,n){return this.superClass.prototype[e].apply(t,n)}function Tn(t,e){function n(t){var e=i[t.main];return e&&e[ku]||((e=i[t.main]={})[ku]=!0),e}e=e||{};var i={};if(t.registerClass=function(t,e){return e&&(xn(e),(e=_n(e)).sub?e.sub!==ku&&(n(e)[e.sub]=t):i[e.main]=t),t},t.getClass=function(t,e,n){var r=i[t];if(r&&r[ku]&&(r=e?r[e]:null),n&&!r)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return r},t.getClassesByMainType=function(t){t=_n(t);var e=[],n=i[t.main];return n&&n[ku]?f(n,function(t,n){n!==ku&&e.push(t)}):e.push(n),e},t.hasClass=function(t){return t=_n(t),!!i[t.main]},t.getAllClassMainTypes=function(){var t=[];return f(i,function(e,n){t.push(n)}),t},t.hasSubTypes=function(t){t=_n(t);var e=i[t.main];return e&&e[ku]},t.parseClassType=_n,e.registerWhenExtend){var r=t.extend;r&&(t.extend=function(e){var n=r.call(this,e);return t.registerClass(n,e.type)})}return t}function In(t){return t>-zu&&t<zu}function Cn(t){return t>zu||t<-zu}function kn(t,e,n,i,r){var a=1-r;return a*a*(a*t+3*r*e)+r*r*(r*i+3*a*n)}function Dn(t,e,n,i,r){var a=1-r;return 3*(((e-t)*a+2*(n-e)*r)*a+(i-n)*r*r)}function An(t,e,n,i,r,a){var o=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),h=t-r,u=s*s-3*o*l,c=s*l-9*o*h,f=l*l-3*s*h,d=0;if(In(u)&&In(c))In(s)?a[0]=0:(M=-l/s)>=0&&M<=1&&(a[d++]=M);else{var p=c*c-4*u*f;if(In(p)){var g=c/u,m=-g/2;(M=-s/o+g)>=0&&M<=1&&(a[d++]=M),m>=0&&m<=1&&(a[d++]=m)}else if(p>0){var v=Ru(p),y=u*s+1.5*o*(-c+v),_=u*s+1.5*o*(-c-v);(M=(-s-((y=y<0?-Bu(-y,Vu):Bu(y,Vu))+(_=_<0?-Bu(-_,Vu):Bu(_,Vu))))/(3*o))>=0&&M<=1&&(a[d++]=M)}else{var x=(2*u*s-3*o*c)/(2*Ru(u*u*u)),w=Math.acos(x)/3,b=Ru(u),S=Math.cos(w),M=(-s-2*b*S)/(3*o),m=(-s+b*(S+Fu*Math.sin(w)))/(3*o),T=(-s+b*(S-Fu*Math.sin(w)))/(3*o);M>=0&&M<=1&&(a[d++]=M),m>=0&&m<=1&&(a[d++]=m),T>=0&&T<=1&&(a[d++]=T)}}return d}function Ln(t,e,n,i,r){var a=6*n-12*e+6*t,o=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(In(o))Cn(a)&&(c=-s/a)>=0&&c<=1&&(r[l++]=c);else{var h=a*a-4*o*s;if(In(h))r[0]=-a/(2*o);else if(h>0){var u=Ru(h),c=(-a+u)/(2*o),f=(-a-u)/(2*o);c>=0&&c<=1&&(r[l++]=c),f>=0&&f<=1&&(r[l++]=f)}}return l}function Pn(t,e,n,i,r,a){var o=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,h=(s-o)*r+o,u=(l-s)*r+s,c=(u-h)*r+h;a[0]=t,a[1]=o,a[2]=h,a[3]=c,a[4]=c,a[5]=u,a[6]=l,a[7]=i}function On(t,e,n,i,r,a,o,s,l,h,u){var c,f,d,p,g,m=.005,v=1/0;Wu[0]=l,Wu[1]=h;for(var y=0;y<1;y+=.05)Hu[0]=kn(t,n,r,o,y),Hu[1]=kn(e,i,a,s,y),(p=eh(Wu,Hu))<v&&(c=y,v=p);v=1/0;for(var _=0;_<32&&!(m<Nu);_++)f=c-m,d=c+m,Hu[0]=kn(t,n,r,o,f),Hu[1]=kn(e,i,a,s,f),p=eh(Hu,Wu),f>=0&&p<v?(c=f,v=p):(Gu[0]=kn(t,n,r,o,d),Gu[1]=kn(e,i,a,s,d),g=eh(Gu,Wu),d<=1&&g<v?(c=d,v=g):m*=.5);return u&&(u[0]=kn(t,n,r,o,c),u[1]=kn(e,i,a,s,c)),Ru(v)}function En(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function Bn(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function Rn(t,e,n,i,r){var a=t-2*e+n,o=2*(e-t),s=t-i,l=0;if(In(a))Cn(o)&&(c=-s/o)>=0&&c<=1&&(r[l++]=c);else{var h=o*o-4*a*s;if(In(h))(c=-o/(2*a))>=0&&c<=1&&(r[l++]=c);else if(h>0){var u=Ru(h),c=(-o+u)/(2*a),f=(-o-u)/(2*a);c>=0&&c<=1&&(r[l++]=c),f>=0&&f<=1&&(r[l++]=f)}}return l}function zn(t,e,n){var i=t+n-2*e;return 0===i?.5:(t-e)/i}function Nn(t,e,n,i,r){var a=(e-t)*i+t,o=(n-e)*i+e,s=(o-a)*i+a;r[0]=t,r[1]=a,r[2]=s,r[3]=s,r[4]=o,r[5]=n}function Fn(t,e,n,i,r,a,o,s,l){var h,u=.005,c=1/0;Wu[0]=o,Wu[1]=s;for(var f=0;f<1;f+=.05)Hu[0]=En(t,n,r,f),Hu[1]=En(e,i,a,f),(m=eh(Wu,Hu))<c&&(h=f,c=m);c=1/0;for(var d=0;d<32&&!(u<Nu);d++){var p=h-u,g=h+u;Hu[0]=En(t,n,r,p),Hu[1]=En(e,i,a,p);var m=eh(Hu,Wu);if(p>=0&&m<c)h=p,c=m;else{Gu[0]=En(t,n,r,g),Gu[1]=En(e,i,a,g);var v=eh(Gu,Wu);g<=1&&v<c?(h=g,c=v):u*=.5}}return l&&(l[0]=En(t,n,r,h),l[1]=En(e,i,a,h)),Ru(c)}function Vn(t,e,n,i,r,a){r[0]=qu(t,n),r[1]=qu(e,i),a[0]=Xu(t,n),a[1]=Xu(e,i)}function Wn(t,e,n,i,r,a,o,s,l,h){var u,c=Ln,f=kn,d=c(t,n,r,o,Qu);for(l[0]=1/0,l[1]=1/0,h[0]=-1/0,h[1]=-1/0,u=0;u<d;u++){var p=f(t,n,r,o,Qu[u]);l[0]=qu(p,l[0]),h[0]=Xu(p,h[0])}for(d=c(e,i,a,s,Ju),u=0;u<d;u++){var g=f(e,i,a,s,Ju[u]);l[1]=qu(g,l[1]),h[1]=Xu(g,h[1])}l[0]=qu(t,l[0]),h[0]=Xu(t,h[0]),l[0]=qu(o,l[0]),h[0]=Xu(o,h[0]),l[1]=qu(e,l[1]),h[1]=Xu(e,h[1]),l[1]=qu(s,l[1]),h[1]=Xu(s,h[1])}function Hn(t,e,n,i,r,a,o,s){var l=zn,h=En,u=Xu(qu(l(t,n,r),1),0),c=Xu(qu(l(e,i,a),1),0),f=h(t,n,r,u),d=h(e,i,a,c);o[0]=qu(t,r,f),o[1]=qu(e,a,d),s[0]=Xu(t,r,f),s[1]=Xu(e,a,d)}function Gn(t,e,n,i,r,a,o,s,l){var h=U,u=j,c=Math.abs(r-a);if(c%Uu<1e-4&&c>1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(ju[0]=Yu(r)*n+t,ju[1]=Zu(r)*i+e,$u[0]=Yu(a)*n+t,$u[1]=Zu(a)*i+e,h(s,ju,$u),u(l,ju,$u),(r%=Uu)<0&&(r+=Uu),(a%=Uu)<0&&(a+=Uu),r>a&&!o?a+=Uu:r<a&&o&&(r+=Uu),o){var f=a;a=r,r=f}for(var d=0;d<a;d+=Math.PI/2)d>r&&(Ku[0]=Yu(d)*n+t,Ku[1]=Zu(d)*i+e,h(s,Ku,s),u(l,Ku,l))}function qn(t,e,n,i,r,a,o){if(0===r)return!1;var s=r,l=0,h=t;if(o>e+s&&o>i+s||o<e-s&&o<i-s||a>t+s&&a>n+s||a<t-s&&a<n-s)return!1;if(t===n)return Math.abs(a-t)<=s/2;var u=(l=(e-i)/(t-n))*a-o+(h=(t*i-n*e)/(t-n));return u*u/(l*l+1)<=s/2*s/2}function Xn(t,e,n,i,r,a,o,s,l,h,u){if(0===l)return!1;var c=l;return!(u>e+c&&u>i+c&&u>a+c&&u>s+c||u<e-c&&u<i-c&&u<a-c&&u<s-c||h>t+c&&h>n+c&&h>r+c&&h>o+c||h<t-c&&h<n-c&&h<r-c&&h<o-c)&&On(t,e,n,i,r,a,o,s,h,u,null)<=c/2}function Zn(t,e,n,i,r,a,o,s,l){if(0===o)return!1;var h=o;return!(l>e+h&&l>i+h&&l>a+h||l<e-h&&l<i-h&&l<a-h||s>t+h&&s>n+h&&s>r+h||s<t-h&&s<n-h&&s<r-h)&&Fn(t,e,n,i,r,a,s,l,null)<=h/2}function Yn(t){return(t%=dc)<0&&(t+=dc),t}function Un(t,e,n,i,r,a,o,s,l){if(0===o)return!1;var h=o;s-=t,l-=e;var u=Math.sqrt(s*s+l*l);if(u-h>n||u+h<n)return!1;if(Math.abs(i-r)%pc<1e-4)return!0;if(a){var c=i;i=Yn(r),r=Yn(c)}else i=Yn(i),r=Yn(r);i>r&&(r+=pc);var f=Math.atan2(l,s);return f<0&&(f+=pc),f>=i&&f<=r||f+pc>=i&&f+pc<=r}function jn(t,e,n,i,r,a){if(a>e&&a>i||a<e&&a<i)return 0;if(i===e)return 0;var o=i<e?1:-1,s=(a-e)/(i-e);return 1!==s&&0!==s||(o=i<e?.5:-.5),s*(n-t)+t>r?o:0}function $n(t,e){return Math.abs(t-e)<vc}function Kn(){var t=_c[0];_c[0]=_c[1],_c[1]=t}function Qn(t,e,n,i,r,a,o,s,l,h){if(h>e&&h>i&&h>a&&h>s||h<e&&h<i&&h<a&&h<s)return 0;var u=An(e,i,a,s,h,yc);if(0===u)return 0;for(var c,f,d=0,p=-1,g=0;g<u;g++){var m=yc[g],v=0===m||1===m?.5:1;kn(t,n,r,o,m)<l||(p<0&&(p=Ln(e,i,a,s,_c),_c[1]<_c[0]&&p>1&&Kn(),c=kn(e,i,a,s,_c[0]),p>1&&(f=kn(e,i,a,s,_c[1]))),2==p?m<_c[0]?d+=c<e?v:-v:m<_c[1]?d+=f<c?v:-v:d+=s<f?v:-v:m<_c[0]?d+=c<e?v:-v:d+=s<c?v:-v)}return d}function Jn(t,e,n,i,r,a,o,s){if(s>e&&s>i&&s>a||s<e&&s<i&&s<a)return 0;var l=Rn(e,i,a,s,yc);if(0===l)return 0;var h=zn(e,i,a);if(h>=0&&h<=1){for(var u=0,c=En(e,i,a,h),f=0;f<l;f++){d=0===yc[f]||1===yc[f]?.5:1;(p=En(t,n,r,yc[f]))<o||(yc[f]<h?u+=c<e?d:-d:u+=a<c?d:-d)}return u}var d=0===yc[0]||1===yc[0]?.5:1,p=En(t,n,r,yc[0]);return p<o?0:a<e?d:-d}function ti(t,e,n,i,r,a,o,s){if((s-=e)>n||s<-n)return 0;h=Math.sqrt(n*n-s*s);yc[0]=-h,yc[1]=h;var l=Math.abs(i-r);if(l<1e-4)return 0;if(l%mc<1e-4){i=0,r=mc;p=a?1:-1;return o>=yc[0]+t&&o<=yc[1]+t?p:0}if(a){var h=i;i=Yn(r),r=Yn(h)}else i=Yn(i),r=Yn(r);i>r&&(r+=mc);for(var u=0,c=0;c<2;c++){var f=yc[c];if(f+t>o){var d=Math.atan2(s,f),p=a?1:-1;d<0&&(d=mc+d),(d>=i&&d<=r||d+mc>=i&&d+mc<=r)&&(d>Math.PI/2&&d<1.5*Math.PI&&(p=-p),u+=p)}}return u}function ei(t,e,n,i,r){for(var a=0,o=0,s=0,l=0,h=0,u=0;u<t.length;){var c=t[u++];switch(c===gc.M&&u>1&&(n||(a+=jn(o,s,l,h,i,r))),1==u&&(l=o=t[u],h=s=t[u+1]),c){case gc.M:o=l=t[u++],s=h=t[u++];break;case gc.L:if(n){if(qn(o,s,t[u],t[u+1],e,i,r))return!0}else a+=jn(o,s,t[u],t[u+1],i,r)||0;o=t[u++],s=t[u++];break;case gc.C:if(n){if(Xn(o,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],e,i,r))return!0}else a+=Qn(o,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],i,r)||0;o=t[u++],s=t[u++];break;case gc.Q:if(n){if(Zn(o,s,t[u++],t[u++],t[u],t[u+1],e,i,r))return!0}else a+=Jn(o,s,t[u++],t[u++],t[u],t[u+1],i,r)||0;o=t[u++],s=t[u++];break;case gc.A:var f=t[u++],d=t[u++],p=t[u++],g=t[u++],m=t[u++],v=t[u++],y=(t[u++],1-t[u++]),_=Math.cos(m)*p+f,x=Math.sin(m)*g+d;u>1?a+=jn(o,s,_,x,i,r):(l=_,h=x);var w=(i-f)*g/p+f;if(n){if(Un(f,d,g,m,m+v,y,e,w,r))return!0}else a+=ti(f,d,g,m,m+v,y,w,r);o=Math.cos(m+v)*p+f,s=Math.sin(m+v)*g+d;break;case gc.R:l=o=t[u++],h=s=t[u++];var _=l+t[u++],x=h+t[u++];if(n){if(qn(l,h,_,h,e,i,r)||qn(_,h,_,x,e,i,r)||qn(_,x,l,x,e,i,r)||qn(l,x,l,h,e,i,r))return!0}else a+=jn(_,h,_,x,i,r),a+=jn(l,x,l,h,i,r);break;case gc.Z:if(n){if(qn(o,s,l,h,e,i,r))return!0}else a+=jn(o,s,l,h,i,r);o=l,s=h}}return n||$n(s,h)||(a+=jn(o,s,l,h,i,r)||0),0!==a}function ni(t,e,n){return ei(t,0,!1,e,n)}function ii(t,e,n,i){return ei(t,e,!0,n,i)}function ri(t){Re.call(this,t),this.path=null}function ai(t,e,n,i,r,a,o,s,l,h,u){var c=l*(Pc/180),f=Lc(c)*(t-n)/2+Ac(c)*(e-i)/2,d=-1*Ac(c)*(t-n)/2+Lc(c)*(e-i)/2,p=f*f/(o*o)+d*d/(s*s);p>1&&(o*=Dc(p),s*=Dc(p));var g=(r===a?-1:1)*Dc((o*o*(s*s)-o*o*(d*d)-s*s*(f*f))/(o*o*(d*d)+s*s*(f*f)))||0,m=g*o*d/s,v=g*-s*f/o,y=(t+n)/2+Lc(c)*m-Ac(c)*v,_=(e+i)/2+Ac(c)*m+Lc(c)*v,x=Bc([1,0],[(f-m)/o,(d-v)/s]),w=[(f-m)/o,(d-v)/s],b=[(-1*f-m)/o,(-1*d-v)/s],S=Bc(w,b);Ec(w,b)<=-1&&(S=Pc),Ec(w,b)>=1&&(S=0),0===a&&S>0&&(S-=2*Pc),1===a&&S<0&&(S+=2*Pc),u.addData(h,y,_,o,s,x,S,c,a)}function oi(t){if(!t)return[];var e,n=t.replace(/-/g," -").replace(/  /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e<kc.length;e++)n=n.replace(new RegExp(kc[e],"g"),"|"+kc[e]);var i,r=n.split("|"),a=0,o=0,s=new fc,l=fc.CMD;for(e=1;e<r.length;e++){var h,u=r[e],c=u.charAt(0),f=0,d=u.slice(1).replace(/e,-/g,"e-").split(",");d.length>0&&""===d[0]&&d.shift();for(var p=0;p<d.length;p++)d[p]=parseFloat(d[p]);for(;f<d.length&&!isNaN(d[f])&&!isNaN(d[0]);){var g,m,v,y,_,x,w,b=a,S=o;switch(c){case"l":a+=d[f++],o+=d[f++],h=l.L,s.addData(h,a,o);break;case"L":a=d[f++],o=d[f++],h=l.L,s.addData(h,a,o);break;case"m":a+=d[f++],o+=d[f++],h=l.M,s.addData(h,a,o),c="l";break;case"M":a=d[f++],o=d[f++],h=l.M,s.addData(h,a,o),c="L";break;case"h":a+=d[f++],h=l.L,s.addData(h,a,o);break;case"H":a=d[f++],h=l.L,s.addData(h,a,o);break;case"v":o+=d[f++],h=l.L,s.addData(h,a,o);break;case"V":o=d[f++],h=l.L,s.addData(h,a,o);break;case"C":h=l.C,s.addData(h,d[f++],d[f++],d[f++],d[f++],d[f++],d[f++]),a=d[f-2],o=d[f-1];break;case"c":h=l.C,s.addData(h,d[f++]+a,d[f++]+o,d[f++]+a,d[f++]+o,d[f++]+a,d[f++]+o),a+=d[f-2],o+=d[f-1];break;case"S":g=a,m=o;var M=s.len(),T=s.data;i===l.C&&(g+=a-T[M-4],m+=o-T[M-3]),h=l.C,b=d[f++],S=d[f++],a=d[f++],o=d[f++],s.addData(h,g,m,b,S,a,o);break;case"s":g=a,m=o;var M=s.len(),T=s.data;i===l.C&&(g+=a-T[M-4],m+=o-T[M-3]),h=l.C,b=a+d[f++],S=o+d[f++],a+=d[f++],o+=d[f++],s.addData(h,g,m,b,S,a,o);break;case"Q":b=d[f++],S=d[f++],a=d[f++],o=d[f++],h=l.Q,s.addData(h,b,S,a,o);break;case"q":b=d[f++]+a,S=d[f++]+o,a+=d[f++],o+=d[f++],h=l.Q,s.addData(h,b,S,a,o);break;case"T":g=a,m=o;var M=s.len(),T=s.data;i===l.Q&&(g+=a-T[M-4],m+=o-T[M-3]),a=d[f++],o=d[f++],h=l.Q,s.addData(h,g,m,a,o);break;case"t":g=a,m=o;var M=s.len(),T=s.data;i===l.Q&&(g+=a-T[M-4],m+=o-T[M-3]),a+=d[f++],o+=d[f++],h=l.Q,s.addData(h,g,m,a,o);break;case"A":v=d[f++],y=d[f++],_=d[f++],x=d[f++],w=d[f++],ai(b=a,S=o,a=d[f++],o=d[f++],x,w,v,y,_,h=l.A,s);break;case"a":v=d[f++],y=d[f++],_=d[f++],x=d[f++],w=d[f++],ai(b=a,S=o,a+=d[f++],o+=d[f++],x,w,v,y,_,h=l.A,s)}}"z"!==c&&"Z"!==c||(h=l.Z,s.addData(h)),i=h}return s.toStatic(),s}function si(t,e){var n=oi(t);return e=e||{},e.buildPath=function(t){if(t.setData)t.setData(n.data),(e=t.getContext())&&t.rebuildPath(e);else{var e=t;n.rebuildPath(e)}},e.applyTransform=function(t){Cc(n,t),this.dirty(!0)},e}function li(t,e){return new ri(si(t,e))}function hi(t,e){return ri.extend(si(t,e))}function ui(t,e,n,i,r,a,o){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*o+(-3*(e-n)-2*s-l)*a+s*r+e}function ci(t,e,n){var i=e.points,r=e.smooth;if(i&&i.length>=2){if(r&&"spline"!==r){var a=Gc(i,r,n,e.smoothConstraint);t.moveTo(i[0][0],i[0][1]);for(var o=i.length,s=0;s<(n?o:o-1);s++){var l=a[2*s],h=a[2*s+1],u=i[(s+1)%o];t.bezierCurveTo(l[0],l[1],h[0],h[1],u[0],u[1])}}else{"spline"===r&&(i=Hc(i,n)),t.moveTo(i[0][0],i[0][1]);for(var s=1,c=i.length;s<c;s++)t.lineTo(i[s][0],i[s][1])}n&&t.closePath()}}function fi(t,e,n){var i=t.cpx2,r=t.cpy2;return null===i||null===r?[(n?Dn:kn)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?Dn:kn)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?Bn:En)(t.x1,t.cpx1,t.x2,e),(n?Bn:En)(t.y1,t.cpy1,t.y2,e)]}function di(t){Re.call(this,t),this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.notClear=!0}function pi(t){return ri.extend(t)}function gi(t,e,n,i){var r=li(t,e),a=r.getBoundingRect();return n&&("center"===i&&(n=vi(n,a)),yi(r,n)),r}function mi(t,e,n){var i=new ze({style:{image:t,x:e.x,y:e.y,width:e.width,height:e.height},onload:function(t){if("center"===n){var r={width:t.width,height:t.height};i.setStyle(vi(e,r))}}});return i}function vi(t,e){var n,i=e.width/e.height,r=t.height*i;return n=r<=t.width?t.height:(r=t.width)/i,{x:t.x+t.width/2-r/2,y:t.y+t.height/2-n/2,width:r,height:n}}function yi(t,e){if(t.applyTransform){var n=t.getBoundingRect().calculateTransform(e);t.applyTransform(n)}}function _i(t){var e=t.shape,n=t.style.lineWidth;return nf(2*e.x1)===nf(2*e.x2)&&(e.x1=e.x2=xi(e.x1,n,!0)),nf(2*e.y1)===nf(2*e.y2)&&(e.y1=e.y2=xi(e.y1,n,!0)),t}function xi(t,e,n){var i=nf(2*t);return(i+nf(e))%2==0?i/2:(i+(n?1:-1))/2}function wi(t){return null!=t&&"none"!=t}function bi(t){return"string"==typeof t?wt(t,-.1):t}function Si(t){if(t.__hoverStlDirty){var e=t.style.stroke,n=t.style.fill,i=t.__hoverStl;i.fill=i.fill||(wi(n)?bi(n):null),i.stroke=i.stroke||(wi(e)?bi(e):null);var r={};for(var a in i)null!=i[a]&&(r[a]=t.style[a]);t.__normalStl=r,t.__hoverStlDirty=!1}}function Mi(t){if(!t.__isHover){if(Si(t),t.useHoverLayer)t.__zr&&t.__zr.addHover(t,t.__hoverStl);else{var e=t.style,n=e.insideRollbackOpt;n&&Wi(e),e.extendFrom(t.__hoverStl),n&&(Vi(e,e.insideOriginalTextPosition,n),null==e.textFill&&(e.textFill=n.autoColor)),t.dirty(!1),t.z2+=1}t.__isHover=!0}}function Ti(t){if(t.__isHover){var e=t.__normalStl;t.useHoverLayer?t.__zr&&t.__zr.removeHover(t):(e&&t.setStyle(e),t.z2-=1),t.__isHover=!1}}function Ii(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&Mi(t)}):Mi(t)}function Ci(t){"group"===t.type?t.traverse(function(t){"group"!==t.type&&Ti(t)}):Ti(t)}function ki(t,e){t.__hoverStl=t.hoverStyle||e||{},t.__hoverStlDirty=!0,t.__isHover&&Si(t)}function Di(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&Ii(this)}function Ai(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasis&&Ci(this)}function Li(){this.__isEmphasis=!0,Ii(this)}function Pi(){this.__isEmphasis=!1,Ci(this)}function Oi(t,e,n){t.__hoverSilentOnTouch=n&&n.hoverSilentOnTouch,"group"===t.type?t.traverse(function(t){"group"!==t.type&&ki(t,e)}):ki(t,e),t.on("mouseover",Di).on("mouseout",Ai),t.on("emphasis",Li).on("normal",Pi)}function Ei(t,e,n,i,r,a,o){var s,l=(r=r||of).labelFetcher,h=r.labelDataIndex,u=r.labelDimIndex,c=n.getShallow("show"),f=i.getShallow("show");(c||f)&&(l&&(s=l.getFormattedLabel(h,"normal",null,u)),null==s&&(s=_(r.defaultText)?r.defaultText(h,r):r.defaultText));var d=c?s:null,p=f?C(l?l.getFormattedLabel(h,"emphasis",null,u):null,s):null;null==d&&null==p||(Bi(t,n,a,r),Bi(e,i,o,r,!0)),t.text=d,e.text=p}function Bi(t,e,n,i,r){return Ri(t,e,i,r),n&&a(t,n),t.host&&t.host.dirty&&t.host.dirty(!1),t}function Ri(t,e,n,i){if((n=n||of).isRectText){var r=e.getShallow("position")||(i?null:"inside");"outside"===r&&(r="top"),t.textPosition=r,t.textOffset=e.getShallow("offset");var a=e.getShallow("rotate");null!=a&&(a*=Math.PI/180),t.textRotation=a,t.textDistance=C(e.getShallow("distance"),i?null:5)}var o,s=e.ecModel,l=s&&s.option.textStyle,h=zi(e);if(h){o={};for(var u in h)if(h.hasOwnProperty(u)){var c=e.getModel(["rich",u]);Ni(o[u]={},c,l,n,i)}}return t.rich=o,Ni(t,e,l,n,i,!0),n.forceRich&&!n.textStyle&&(n.textStyle={}),t}function zi(t){for(var e;t&&t!==t.ecModel;){var n=(t.option||of).rich;if(n){e=e||{};for(var i in n)n.hasOwnProperty(i)&&(e[i]=1)}t=t.parentModel}return e}function Ni(t,e,n,i,r,a){if(n=!r&&n||of,t.textFill=Fi(e.getShallow("color"),i)||n.color,t.textStroke=Fi(e.getShallow("textBorderColor"),i)||n.textBorderColor,t.textStrokeWidth=C(e.getShallow("textBorderWidth"),n.textBorderWidth),!r){if(a){var o=t.textPosition;t.insideRollback=Vi(t,o,i),t.insideOriginalTextPosition=o,t.insideRollbackOpt=i}null==t.textFill&&(t.textFill=i.autoColor)}t.fontStyle=e.getShallow("fontStyle")||n.fontStyle,t.fontWeight=e.getShallow("fontWeight")||n.fontWeight,t.fontSize=e.getShallow("fontSize")||n.fontSize,t.fontFamily=e.getShallow("fontFamily")||n.fontFamily,t.textAlign=e.getShallow("align"),t.textVerticalAlign=e.getShallow("verticalAlign")||e.getShallow("baseline"),t.textLineHeight=e.getShallow("lineHeight"),t.textWidth=e.getShallow("width"),t.textHeight=e.getShallow("height"),t.textTag=e.getShallow("tag"),a&&i.disableBox||(t.textBackgroundColor=Fi(e.getShallow("backgroundColor"),i),t.textPadding=e.getShallow("padding"),t.textBorderColor=Fi(e.getShallow("borderColor"),i),t.textBorderWidth=e.getShallow("borderWidth"),t.textBorderRadius=e.getShallow("borderRadius"),t.textBoxShadowColor=e.getShallow("shadowColor"),t.textBoxShadowBlur=e.getShallow("shadowBlur"),t.textBoxShadowOffsetX=e.getShallow("shadowOffsetX"),t.textBoxShadowOffsetY=e.getShallow("shadowOffsetY")),t.textShadowColor=e.getShallow("textShadowColor")||n.textShadowColor,t.textShadowBlur=e.getShallow("textShadowBlur")||n.textShadowBlur,t.textShadowOffsetX=e.getShallow("textShadowOffsetX")||n.textShadowOffsetX,t.textShadowOffsetY=e.getShallow("textShadowOffsetY")||n.textShadowOffsetY}function Fi(t,e){return"auto"!==t?t:e&&e.autoColor?e.autoColor:null}function Vi(t,e,n){var i,r=n.useInsideStyle;return null==t.textFill&&!1!==r&&(!0===r||n.isRectText&&e&&"string"==typeof e&&e.indexOf("inside")>=0)&&(i={textFill:null,textStroke:t.textStroke,textStrokeWidth:t.textStrokeWidth},t.textFill="#fff",null==t.textStroke&&(t.textStroke=n.autoColor,null==t.textStrokeWidth&&(t.textStrokeWidth=2))),i}function Wi(t){var e=t.insideRollback;e&&(t.textFill=e.textFill,t.textStroke=e.textStroke,t.textStrokeWidth=e.textStrokeWidth)}function Hi(t,e){var n=e||e.getModel("textStyle");return P([t.fontStyle||n&&n.getShallow("fontStyle")||"",t.fontWeight||n&&n.getShallow("fontWeight")||"",(t.fontSize||n&&n.getShallow("fontSize")||12)+"px",t.fontFamily||n&&n.getShallow("fontFamily")||"sans-serif"].join(" "))}function Gi(t,e,n,i,r,a){if("function"==typeof r&&(a=r,r=null),i&&i.isAnimationEnabled()){var o=t?"Update":"",s=i.getShallow("animationDuration"+o),l=i.getShallow("animationEasing"+o),h=i.getShallow("animationDelay"+o);"function"==typeof h&&(h=h(r,i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null)),"function"==typeof s&&(s=s(r)),s>0?e.animateTo(n,s,h||0,l,a,!!a):(e.stopAnimation(),e.attr(n),a&&a())}else e.stopAnimation(),e.attr(n),a&&a()}function qi(t,e,n,i,r){Gi(!0,t,e,n,i,r)}function Xi(t,e,n,i,r){Gi(!1,t,e,n,i,r)}function Zi(t,e,n){return e&&!c(e)&&(e=uh.getLocalTransform(e)),n&&(e=lt([],e)),Y([],t,e)}function Yi(t,e,n,i){function r(t){var e={position:F(t.position),rotation:t.rotation};return t.shape&&(e.shape=a({},t.shape)),e}if(t&&e){var o=function(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=o[t.anid];if(e){var i=r(t);t.attr(r(e)),qi(t,i,n,t.dataIndex)}}})}}function Ui(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}function ji(t,e,n){for(var i=0;i<e.length&&(!e[i]||null!=(t=t&&"object"==typeof t?t[e[i]]:null));i++);return null==t&&n&&(t=n.get(e)),t}function $i(t,e){var n=df(t).getParent;return n?n.call(t,e):t.parentModel}function Ki(t){return[t||"",pf++,Math.random().toFixed(5)].join("_")}function Qi(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ji(t,e,n,i){var r=e[1]-e[0],a=n[1]-n[0];if(0===r)return 0===a?n[0]:(n[0]+n[1])/2;if(i)if(r>0){if(t<=e[0])return n[0];if(t>=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*a+n[0]}function tr(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?Qi(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function er(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function nr(t){var e=t.toString(),n=e.indexOf("e");if(n>0){var i=+e.slice(n+1);return i<0?-i:0}var r=e.indexOf(".");return r<0?0:e.length-1-r}function ir(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),a=Math.round(n(Math.abs(e[1]-e[0]))/i),o=Math.min(Math.max(-r+a,0),20);return isFinite(o)?o:20}function rr(t,e,n){if(!t[e])return 0;var i=p(t,function(t,e){return t+(isNaN(e)?0:e)},0);if(0===i)return 0;for(var r=Math.pow(10,n),a=d(t,function(t){return(isNaN(t)?0:t)/i*r*100}),o=100*r,s=d(a,function(t){return Math.floor(t)}),l=p(s,function(t,e){return t+e},0),h=d(a,function(t,e){return t-s[e]});l<o;){for(var u=Number.NEGATIVE_INFINITY,c=null,f=0,g=h.length;f<g;++f)h[f]>u&&(u=h[f],c=f);++s[c],h[c]=0,++l}return s[e]/r}function ar(t){var e=2*Math.PI;return(t%e+e)%e}function or(t){return t>-gf&&t<gf}function sr(t){if(t instanceof Date)return t;if("string"==typeof t){var e=mf.exec(t);if(!e)return new Date(NaN);if(e[8]){var n=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(n-=e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,n,+(e[5]||0),+e[6]||0,+e[7]||0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))}function lr(t){return Math.pow(10,hr(t))}function hr(t){return Math.floor(Math.log(t)/Math.LN10)}function ur(t,e){var n,i=hr(t),r=Math.pow(10,i),a=t/r;return n=e?a<1.5?1:a<2.5?2:a<4?3:a<7?5:10:a<1?1:a<2?2:a<3?3:a<5?5:10,t=n*r,i>=-20?+t.toFixed(i<0?-i:0):t}function cr(t){return isNaN(t)?"-":(t=(t+"").split("."))[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:"")}function fr(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function dr(t,e,n){y(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],a=0;a<r.length;a++){var o=yf[a];t=t.replace(_f(o),_f(o,0))}for(var s=0;s<i;s++)for(var l=0;l<r.length;l++){var h=e[s][r[l]];t=t.replace(_f(yf[l],s),n?fr(h):h)}return t}function pr(t,e){var n=(t=x(t)?{color:t,extraCssText:e}:t||{}).color,i=t.type,e=t.extraCssText;return n?"subItem"===i?'<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:'+fr(n)+";"+(e||"")+'"></span>':'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:'+fr(n)+";"+(e||"")+'"></span>':""}function gr(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=sr(e),r=n?"UTC":"",a=i["get"+r+"FullYear"](),o=i["get"+r+"Month"]()+1,s=i["get"+r+"Date"](),l=i["get"+r+"Hours"](),h=i["get"+r+"Minutes"](),u=i["get"+r+"Seconds"]();return t=t.replace("MM",xf(o)).replace("M",o).replace("yyyy",a).replace("yy",a%100).replace("dd",xf(s)).replace("d",s).replace("hh",xf(l)).replace("h",l).replace("mm",xf(h)).replace("m",h).replace("ss",xf(u)).replace("s",u)}function mr(t,e,n,i,r){var a=0,o=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(l,h){var u,c,f=l.position,d=l.getBoundingRect(),p=e.childAt(h+1),g=p&&p.getBoundingRect();if("horizontal"===t){var m=d.width+(g?-g.x+d.x:0);(u=a+m)>i||l.newline?(a=0,u=m,o+=s+n,s=d.height):s=Math.max(s,d.height)}else{var v=d.height+(g?-g.y+d.y:0);(c=o+v)>r||l.newline?(a+=s+n,o=0,c=v,s=d.width):s=Math.max(s,d.width)}l.newline||(f[0]=a,f[1]=o,"horizontal"===t?a=u+n:o=c+n)})}function vr(t,e,n){n=vf(n||0);var i=e.width,r=e.height,a=tr(t.left,i),o=tr(t.top,r),s=tr(t.right,i),l=tr(t.bottom,r),h=tr(t.width,i),u=tr(t.height,r),c=n[2]+n[0],f=n[1]+n[3],d=t.aspect;switch(isNaN(h)&&(h=i-s-f-a),isNaN(u)&&(u=r-l-c-o),null!=d&&(isNaN(h)&&isNaN(u)&&(d>i/r?h=.8*i:u=.8*r),isNaN(h)&&(h=d*u),isNaN(u)&&(u=h/d)),isNaN(a)&&(a=i-s-h-f),isNaN(o)&&(o=r-l-u-c),t.left||t.right){case"center":a=i/2-h/2-n[3];break;case"right":a=i-h-f}switch(t.top||t.bottom){case"middle":case"center":o=r/2-u/2-n[0];break;case"bottom":o=r-u-c}a=a||0,o=o||0,isNaN(h)&&(h=i-f-a-(s||0)),isNaN(u)&&(u=r-c-o-(l||0));var p=new Rt(a+n[3],o+n[0],h,u);return p.margin=n,p}function yr(t,e,n){function i(n,i){var o={},l=0,h={},u=0;if(bf(n,function(e){h[e]=t[e]}),bf(n,function(t){r(e,t)&&(o[t]=h[t]=e[t]),a(o,t)&&l++,a(h,t)&&u++}),s[i])return a(e,n[1])?h[n[2]]=null:a(e,n[2])&&(h[n[1]]=null),h;if(2!==u&&l){if(l>=2)return o;for(var c=0;c<n.length;c++){var f=n[c];if(!r(o,f)&&r(t,f)){o[f]=t[f];break}}return o}return h}function r(t,e){return t.hasOwnProperty(e)}function a(t,e){return null!=t[e]&&"auto"!==t[e]}function o(t,e,n){bf(t,function(t){e[t]=n[t]})}!w(n)&&(n={});var s=n.ignoreSize;!y(s)&&(s=[s,s]);var l=i(Mf[0],0),h=i(Mf[1],1);o(Mf[0],t,l),o(Mf[1],t,h)}function _r(t){return xr({},t)}function xr(t,e){return e&&t&&bf(Sf,function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t}function wr(t,e){for(var n=t.length,i=0;i<n;i++)if(t[i].length>e)return t[i];return t[n-1]}function br(t){var e=t.get("coordinateSystem"),n={coordSysName:e,coordSysDims:[],axisMap:R(),categoryAxisMap:R()},i=Pf[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}function Sr(t){return"category"===t.get("type")}function Mr(t){this.fromDataset=t.fromDataset,this.data=t.data||(t.sourceFormat===Rf?{}:[]),this.sourceFormat=t.sourceFormat||zf,this.seriesLayoutBy=t.seriesLayoutBy||Ff,this.dimensionsDefine=t.dimensionsDefine,this.encodeDefine=t.encodeDefine&&R(t.encodeDefine),this.startIndex=t.startIndex||0,this.dimensionsDetectCount=t.dimensionsDetectCount}function Tr(t){var e=t.option.source,n=zf;if(S(e))n=Nf;else if(y(e))for(var i=0,r=e.length;i<r;i++){var a=e[i];if(null!=a){if(y(a)){n=Ef;break}if(w(a)){n=Bf;break}}}else if(w(e)){for(var o in e)if(e.hasOwnProperty(o)&&c(e[o])){n=Rf;break}}else if(null!=e)throw new Error("Invalid data");Wf(t).sourceFormat=n}function Ir(t){return Wf(t).source}function Cr(t){Wf(t).datasetMap=R()}function kr(t){var e=t.option,n=e.data,i=S(n)?Nf:Of,r=!1,a=e.seriesLayoutBy,o=e.sourceHeader,s=e.dimensions,l=Er(t);if(l){var h=l.option;n=h.source,i=Wf(l).sourceFormat,r=!0,a=a||h.seriesLayoutBy,null==o&&(o=h.sourceHeader),s=s||h.dimensions}var u=Dr(n,i,a,o,s),c=e.encode;!c&&l&&(c=Or(t,l,n,i,a,u)),Wf(t).source=new Mr({data:n,fromDataset:r,seriesLayoutBy:a,sourceFormat:i,dimensionsDefine:u.dimensionsDefine,startIndex:u.startIndex,dimensionsDetectCount:u.dimensionsDetectCount,encodeDefine:c})}function Dr(t,e,n,i,r){if(!t)return{dimensionsDefine:Ar(r)};var a,o,s;if(e===Ef)"auto"===i||null==i?Lr(function(t){null!=t&&"-"!==t&&(x(t)?null==o&&(o=1):o=0)},n,t,10):o=i?1:0,r||1!==o||(r=[],Lr(function(t,e){r[e]=null!=t?t:""},n,t)),a=r?r.length:n===Vf?t.length:t[0]?t[0].length:null;else if(e===Bf)r||(r=Pr(t),s=!0);else if(e===Rf)r||(r=[],s=!0,f(t,function(t,e){r.push(e)}));else if(e===Of){var l=ln(t[0]);a=y(l)&&l.length||1}var h;return s&&f(r,function(t,e){"name"===(w(t)?t.name:t)&&(h=e)}),{startIndex:o,dimensionsDefine:Ar(r),dimensionsDetectCount:a,potentialNameDimIndex:h}}function Ar(t){if(t){var e=R();return d(t,function(t,n){if(null==(t=a({},w(t)?t:{name:t})).name)return t;t.name+="",null==t.displayName&&(t.displayName=t.name);var i=e.get(t.name);return i?t.name+="-"+i.count++:e.set(t.name,{count:1}),t})}}function Lr(t,e,n,i){if(null==i&&(i=1/0),e===Vf)for(a=0;a<n.length&&a<i;a++)t(n[a]?n[a][0]:null,a);else for(var r=n[0]||[],a=0;a<r.length&&a<i;a++)t(r[a],a)}function Pr(t){for(var e,n=0;n<t.length&&!(e=t[n++]););if(e){var i=[];return f(e,function(t,e){i.push(e)}),i}}function Or(t,e,n,i,r,a){var o=br(t),s={},l=[],h=[],u=t.subType,c=R(["pie","map","funnel"]),d=R(["line","bar","pictorialBar","scatter","effectScatter","candlestick","boxplot"]);if(o&&null!=d.get(u)){var p=t.ecModel,g=Wf(p).datasetMap,m=e.uid+"_"+r,v=g.get(m)||g.set(m,{categoryWayDim:1,valueWayDim:0});f(o.coordSysDims,function(t){if(null==o.firstCategoryDimIndex){e=v.valueWayDim++;s[t]=e,h.push(e)}else if(o.categoryAxisMap.get(t))s[t]=0,l.push(0);else{var e=v.categoryWayDim++;s[t]=e,h.push(e)}})}else if(null!=c.get(u)){for(var y,_=0;_<5&&null==y;_++)Rr(n,i,r,a.dimensionsDefine,a.startIndex,_)||(y=_);if(null!=y){s.value=y;var x=a.potentialNameDimIndex||Math.max(y-1,0);h.push(x),l.push(x)}}return l.length&&(s.itemName=l),h.length&&(s.seriesName=h),s}function Er(t){var e=t.option;if(!e.data)return t.ecModel.getComponent("dataset",e.datasetIndex||0)}function Br(t,e){return Rr(t.data,t.sourceFormat,t.seriesLayoutBy,t.dimensionsDefine,t.startIndex,e)}function Rr(t,e,n,i,r,a){function o(t){return(null==t||!isFinite(t)||""===t)&&(!(!x(t)||"-"===t)||void 0)}var s;if(S(t))return!1;var l;if(i&&(l=w(l=i[a])?l.name:l),e===Ef)if(n===Vf){for(var h=t[a],u=0;u<(h||[]).length&&u<5;u++)if(null!=(s=o(h[r+u])))return s}else for(u=0;u<t.length&&u<5;u++){var c=t[r+u];if(c&&null!=(s=o(c[a])))return s}else if(e===Bf){if(!l)return;for(u=0;u<t.length&&u<5;u++)if((f=t[u])&&null!=(s=o(f[l])))return s}else if(e===Rf){if(!l)return;if(!(h=t[l])||S(h))return!1;for(u=0;u<h.length&&u<5;u++)if(null!=(s=o(h[u])))return s}else if(e===Of)for(u=0;u<t.length&&u<5;u++){var f=t[u],d=ln(f);if(!y(d))return!1;if(null!=(s=o(d[a])))return s}return!1}function zr(t,e){if(e){var n=e.seiresIndex,i=e.seriesId,r=e.seriesName;return null!=n&&t.componentIndex!==n||null!=i&&t.id!==i||null!=r&&t.name!==r}}function Nr(t,e){f(e,function(e,r){Cf.hasClass(r)||("object"==typeof e?t[r]=t[r]?i(t[r],e,!1):n(e):null==t[r]&&(t[r]=e))})}function Fr(t){t=t,this.option={},this.option[Hf]=1,this._componentsMap=R({series:[]}),this._seriesIndices,this._seriesIndicesMap,Nr(t,this._theme.option),i(t,Df,!1),this.mergeOption(t)}function Vr(t,e){y(e)||(e=e?[e]:[]);var n={};return f(e,function(e){n[e]=(t.get(e)||[]).slice()}),n}function Wr(t,e,n){return e.type?e.type:n?n.subType:Cf.determineSubType(t,e)}function Hr(t,e){t._seriesIndicesMap=R(t._seriesIndices=d(e,function(t){return t.componentIndex})||[])}function Gr(t,e){return e.hasOwnProperty("subType")?g(t,function(t){return t.subType===e.subType}):t}function qr(t){f(qf,function(e){this[e]=m(t[e],t)},this)}function Xr(){this._coordinateSystems=[]}function Zr(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function Yr(t,e,n){var i,r,a=[],o=[],s=t.timeline;if(t.baseOption&&(r=t.baseOption),(s||t.options)&&(r=r||{},a=(t.options||[]).slice()),t.media){r=r||{};var l=t.media;Zf(l,function(t){t&&t.option&&(t.query?o.push(t):i||(i=t))})}return r||(r=t),r.timeline||(r.timeline=s),Zf([r].concat(a).concat(d(o,function(t){return t.option})),function(t){Zf(e,function(e){e(t,n)})}),{baseOption:r,timelineOptions:a,mediaDefault:i,mediaList:o}}function Ur(t,e,n){var i={width:e,height:n,aspectratio:e/n},r=!0;return f(t,function(t,e){var n=e.match($f);if(n&&n[1]&&n[2]){var a=n[1],o=n[2].toLowerCase();jr(i[o],t,a)||(r=!1)}}),r}function jr(t,e,n){return"min"===n?t>=e:"max"===n?t<=e:t===e}function $r(t,e){return t.join(",")===e.join(",")}function Kr(t,e){Zf(e=e||{},function(e,n){if(null!=e){var i=t[n];if(Cf.hasClass(n)){e=on(e);var r=un(i=on(i),e);t[n]=Uf(r,function(t){return t.option&&t.exist?jf(t.exist,t.option,!0):t.exist||t.option})}else t[n]=jf(i,e,!0)}})}function Qr(t){var e=t&&t.itemStyle;if(e)for(var n=0,r=Jf.length;n<r;n++){var a=Jf[n],o=e.normal,s=e.emphasis;o&&o[a]&&(t[a]=t[a]||{},t[a].normal?i(t[a].normal,o[a]):t[a].normal=o[a],o[a]=null),s&&s[a]&&(t[a]=t[a]||{},t[a].emphasis?i(t[a].emphasis,s[a]):t[a].emphasis=s[a],s[a]=null)}}function Jr(t,e,n){if(t&&t[e]&&(t[e].normal||t[e].emphasis)){var i=t[e].normal,r=t[e].emphasis;i&&(n?(t[e].normal=t[e].emphasis=null,o(t[e],i)):t[e]=i),r&&(t.emphasis=t.emphasis||{},t.emphasis[e]=r)}}function ta(t){Jr(t,"itemStyle"),Jr(t,"lineStyle"),Jr(t,"areaStyle"),Jr(t,"label"),Jr(t,"labelLine"),Jr(t,"upperLabel"),Jr(t,"edgeLabel")}function ea(t){var e=Qf(t)&&t.textStyle;if(e)for(var n=0,i=Tu.length;n<i;n++){var r=Tu[n];e.hasOwnProperty(r)&&(t[r]=e[r])}}function na(t){t&&(ta(t),ea(t.label),t.emphasis&&ea(t.emphasis.label))}function ia(t){if(Qf(t)){Qr(t),ta(t),ea(t.label),ea(t.upperLabel),ea(t.edgeLabel),t.emphasis&&(ea(t.emphasis.label),ea(t.emphasis.upperLabel),ea(t.emphasis.edgeLabel));var e=t.markPoint;e&&(Qr(e),na(e));var n=t.markLine;n&&(Qr(n),na(n));var i=t.markArea;i&&na(i);var r=t.data;if("graph"===t.type){r=r||t.nodes;var a=t.links||t.edges;if(a&&!S(a))for(s=0;s<a.length;s++)na(a[s]);f(t.categories,function(t){ta(t)})}if(r&&!S(r))for(s=0;s<r.length;s++)na(r[s]);if((e=t.markPoint)&&e.data)for(var o=e.data,s=0;s<o.length;s++)na(o[s]);if((n=t.markLine)&&n.data)for(var l=n.data,s=0;s<l.length;s++)y(l[s])?(na(l[s][0]),na(l[s][1])):na(l[s]);"gauge"===t.type?(ea(t,"axisLabel"),ea(t,"title"),ea(t,"detail")):"treemap"===t.type&&(Jr(t.breadcrumb,"itemStyle"),f(t.levels,function(t){ta(t)}))}}function ra(t){return y(t)?t:t?[t]:[]}function aa(t){return(y(t)?t[0]:t)||{}}function oa(t,e){e=e.split(",");for(var n=t,i=0;i<e.length&&null!=(n=n&&n[e[i]]);i++);return n}function sa(t,e,n,i){e=e.split(",");for(var r,a=t,o=0;o<e.length-1;o++)null==a[r=e[o]]&&(a[r]={}),a=a[r];(i||null==a[e[o]])&&(a[e[o]]=n)}function la(t){f(ed,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}function ha(t,e){Mr.isInstance(t)||(t=Mr.seriesDataToSource(t)),this._source=t;var n=this._data=t.data,i=t.sourceFormat;i===Nf&&(this._offset=0,this._dimSize=e,this._data=n),a(this,ad[i===Ef?i+"_"+t.seriesLayoutBy:i])}function ua(){return this._data.length}function ca(t){return this._data[t]}function fa(t){for(var e=0;e<t.length;e++)this._data.push(t[e])}function da(t,e,n,i){return null!=n?t[n]:t}function pa(t,e,n,i){return ga(t[i],this._dimensionInfos[e])}function ga(t,e){var n=e&&e.type;if("ordinal"===n){var i=e&&e.ordinalMeta;return i?i.parseAndCollect(t):t}return"time"===n&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+sr(t)),null==t||""===t?NaN:+t}function ma(t,e,n){if(t){var i=t.getRawDataItem(e);if(null!=i){var r,a,o=t.getProvider().getSource().sourceFormat,s=t.getDimensionInfo(n);return s&&(r=s.name,a=s.index),od[o](i,e,a,r)}}}function va(t,e,n){if(t){var i=t.getProvider().getSource().sourceFormat;if(i===Of||i===Bf){var r=t.getRawDataItem(e);return i!==Of||w(r)||(r=null),r?r[n]:void 0}}}function ya(t){return new _a(t)}function _a(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0,this.context}function xa(t,e){t._dueIndex=t._outputDueEnd=t._dueEnd=0,t._settedOutputEnd=null,t._progress=!e&&t._reset&&t._reset(t.context);var n=t._downstream;n&&n.dirty()}function wa(t){var e=t.name;Mu===e&&(t.name=ba(t)||e)}function ba(t){var e=t.getRawData(),n=[];return f(e.mapDimension("seriesName",!0),function(t){var i=e.getDimensionInfo(t);i.displayName&&n.push(i.displayName)}),n.join(" ")}function Sa(t){return t.model.getRawData().count()}function Ma(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),Ta}function Ta(t,e){t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function Ia(t,e){f(t.CHANGABLE_METHODS,function(n){t.wrapMethod(n,v(Ca,e))})}function Ca(t){var e=ka(t);e&&e.setOutputEnd(this.count())}function ka(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}function Da(){this.group=new Oh,this.uid=Ki("viewChart"),this.renderTask=ya({plan:Pa,reset:Oa}),this.renderTask.context={view:this}}function Aa(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var n=0;n<t.childCount();n++)Aa(t.childAt(n),e)}function La(t,e,n){var i=dn(t,e);null!=i?f(on(i),function(e){Aa(t.getItemGraphicEl(e),n)}):t.eachItemGraphicEl(function(t){Aa(t,n)})}function Pa(t){return vd(t.model)}function Oa(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,a=e.pipelineContext.incrementalRender,o=t.view,s=r&&md(r).updateMethod;return o[a&&o.incrementalPrepareRender?"incrementalPrepareRender":s&&o[s]?s:"render"](e,n,i,r),a?Ea:null}function Ea(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}function Ba(t,e,n){function i(){u=(new Date).getTime(),c=null,t.apply(o,s||[])}var r,a,o,s,l,h=0,u=0,c=null;e=e||0;var f=function(){r=(new Date).getTime(),o=this,s=arguments;var t=l||e,f=l||n;l=null,a=r-(f?h:u)-t,clearTimeout(c),f?c=setTimeout(i,t):a>=0?i():c=setTimeout(i,-a),h=r};return f.clear=function(){c&&(clearTimeout(c),c=null)},f.debounceNextCall=function(t){l=t},f}function Ra(t,e){this.ecInstance=t,this.api=e,this.unfinished,this._stageTaskMap=R()}function za(t,e,n,i,r){function a(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}r=r||{};var o;f(e,function(e,s){if(!r.visualType||r.visualType===e.visualType){var l=t._stageTaskMap.get(e.uid),h=l.seriesTaskMap,u=l.overallTask;if(u){var c,f=u.agentStubMap;f.each(function(t){a(r,t)&&(t.dirty(),c=!0)}),c&&u.dirty(),Md(u,i);var d=t.getPerformArgs(u,r.block);f.each(function(t){t.perform(d)}),o|=u.perform(d)}else h&&h.each(function(s,l){a(r,s)&&s.dirty();var h=t.getPerformArgs(s,r.block);h.skip=!e.performRawSeries&&n.isSeriesFiltered(s.context.model),Md(s,i),o|=s.perform(h)})}}),t.unfinished|=o}function Na(t,e,n,i,r){function a(n){var a=n.uid,s=o.get(a)||o.set(a,ya({plan:qa,reset:Xa,count:Ya}));s.context={model:n,ecModel:i,api:r,useClearVisual:e.isVisual&&!e.isLayout,plan:e.plan,reset:e.reset,scheduler:t},Ua(t,n,s)}var o=n.seriesTaskMap||(n.seriesTaskMap=R()),s=e.seriesType,l=e.getTargetSeries;e.createOnAllSeries?i.eachRawSeries(a):s?i.eachRawSeriesByType(s,a):l&&l(i,r).each(a);var h=t._pipelineMap;o.each(function(t,e){h.get(e)||(t.dispose(),o.removeKey(e))})}function Fa(t,e,n,i,r){function a(e){var n=e.uid,i=s.get(n)||s.set(n,ya({reset:Wa,onDirty:Ga}));i.context={model:e,overallProgress:u,isOverallFilter:c},i.agent=o,i.__block=u,Ua(t,e,i)}var o=n.overallTask=n.overallTask||ya({reset:Va});o.context={ecModel:i,api:r,overallReset:e.overallReset,scheduler:t};var s=o.agentStubMap=o.agentStubMap||R(),l=e.seriesType,h=e.getTargetSeries,u=!0,c=e.isOverallFilter;l?i.eachRawSeriesByType(l,a):h?h(i,r).each(a):(u=!1,f(i.getSeries(),a));var d=t._pipelineMap;s.each(function(t,e){d.get(e)||(t.dispose(),s.removeKey(e))})}function Va(t){t.overallReset(t.ecModel,t.api,t.payload)}function Wa(t,e){return t.overallProgress&&Ha}function Ha(){this.agent.dirty(),this.getDownstream().dirty()}function Ga(){this.agent&&this.agent.dirty()}function qa(t){return t.plan&&t.plan(t.model,t.ecModel,t.api,t.payload)}function Xa(t){if(t.useClearVisual&&t.data.clearAllVisual(),(t.resetDefines=on(t.reset(t.model,t.ecModel,t.api,t.payload))).length)return Za}function Za(t,e){for(var n=e.data,i=e.resetDefines,r=0;r<i.length;r++){var a=i[r];if(a&&a.dataEach)for(var o=t.start;o<t.end;o++)a.dataEach(n,o);else a&&a.progress&&a.progress(t,n)}}function Ya(t){return t.data.count()}function Ua(t,e,n){var i=e.uid,r=t._pipelineMap.get(i);!r.head&&(r.head=n),r.tail&&r.tail.pipe(n),r.tail=n,n.__idxInPipeline=r.count++,n.__pipeline=r}function ja(t){Td=null;try{t(Id,Cd)}catch(t){}return Td}function $a(t,e){for(var n in e.prototype)t[n]=z}function Ka(t){return function(e,n,i){e=e&&e.toLowerCase(),ih.prototype[t].call(this,e,n,i)}}function Qa(){ih.call(this)}function Ja(t,e,i){function r(t,e){return t.__prio-e.__prio}i=i||{},"string"==typeof e&&(e=tp[e]),this.id,this.group,this._dom=t;var a=this._zr=an(t,{renderer:i.renderer||"canvas",devicePixelRatio:i.devicePixelRatio,width:i.width,height:i.height});this._throttledZrFlush=Ba(m(a.flush,a),17),(e=n(e))&&id(e,!0),this._theme=e,this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new Xr;var o=this._api=_o(this);this._scheduler=new Ra(this,o),ih.call(this),this._messageCenter=new Qa,this._initEvents(),this.resize=m(this.resize,this),this._pendingActions=[],qt(Jd,r),qt($d,r),a.animation.on("frame",this._onframe,this),O(this)}function to(t,e,n){var i,r=this._model,a=this._coordSysMgr.getCoordinateSystems();e=gn(r,e);for(var o=0;o<a.length;o++){var s=a[o];if(s[t]&&null!=(i=s[t](r,e,n)))return i}}function eo(t){var e=t._model,n=t._scheduler;n.restorePipelines(e),n.prepareStageTasks($d),n.prepareStageTasks(Jd),lo(t,"component",e,n),lo(t,"chart",e,n),n.plan()}function no(t,e,n,i,r){function a(i){i&&i.__alive&&i[e]&&i[e](i.__model,o,t._api,n)}var o=t._model;if(i){var s={};s[i+"Id"]=n[i+"Id"],s[i+"Index"]=n[i+"Index"],s[i+"Name"]=n[i+"Name"];var l={mainType:i,query:s};r&&(l.subType=r),o&&o.eachComponent(l,function(e,n){a(t["series"===i?"_chartsMap":"_componentsMap"][e.__viewId])},t)}else Od(t._componentsViews.concat(t._chartsViews),a)}function io(t,e,n){t[Hd]=!0,e&&eo(t),Zd.update.call(t),t[Hd]=!1,oo.call(t,n),so.call(t,n)}function ro(t,e){var n=t._chartsMap,i=t._scheduler;e.eachSeries(function(t){i.updateStreamModes(t,n[t.__viewId])})}function ao(t,e){var n=t.type,i=t.escapeConnect,r=Ud[n],s=r.actionInfo,l=(s.update||"update").split(":"),h=l.pop();l=null!=l[0]&&Rd(l[0]),this[Hd]=!0;var u=[t],c=!1;t.batch&&(c=!0,u=d(t.batch,function(e){return e=o(a({},e),t),e.batch=null,e}));var f,p=[],g="highlight"===n||"downplay"===n;Od(u,function(t){f=r.action(t,this._model,this._api),(f=f||a({},t)).type=s.event||f.type,p.push(f),g?no(this,h,t,"series"):l&&no(this,h,t,l.main,l.sub)},this),"none"===h||g||l||(this[Gd]?(eo(this),Zd.update.call(this,t),this[Gd]=!1):Zd[h].call(this,t)),f=c?{type:s.event||n,escapeConnect:i,batch:p}:p[0],this[Hd]=!1,!e&&this._messageCenter.trigger(f.type,f)}function oo(t){for(var e=this._pendingActions;e.length;){var n=e.shift();ao.call(this,n,t)}}function so(t){!t&&this.trigger("updated")}function lo(t,e,n,i){function r(t){var e="_ec_"+t.id+"_"+t.type,r=s[e];if(!r){var u=Rd(t.type);(r=new(a?dd.getClass(u.main,u.sub):Da.getClass(u.sub))).init(n,h),s[e]=r,o.push(r),l.add(r.group)}t.__viewId=r.__id=e,r.__alive=!0,r.__model=t,r.group.__ecComponentInfo={mainType:t.mainType,index:t.componentIndex},!a&&i.prepareView(r,t,n,h)}for(var a="component"===e,o=a?t._componentsViews:t._chartsViews,s=a?t._componentsMap:t._chartsMap,l=t._zr,h=t._api,u=0;u<o.length;u++)o[u].__alive=!1;a?n.eachComponent(function(t,e){"series"!==t&&r(e)}):n.eachSeries(r);for(u=0;u<o.length;){var c=o[u];c.__alive?u++:(!a&&c.renderTask.dispose(),l.remove(c.group),c.dispose(n,h),o.splice(u,1),delete s[c.__id],c.__id=c.group.__ecComponentInfo=null)}}function ho(t){var e={};t.eachSeries(function(t){var n=t.get("stack"),i=t.getData();if(n&&"list"===i.type){var r=e[n];e.hasOwnProperty(n)&&r&&(i.stackedOn=r),e[n]=i}})}function uo(t){t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()})}function co(t,e,n,i){fo(t,e,n,i),Od(t._chartsViews,function(t){t.__alive=!1}),po(t,e,n,i),Od(t._chartsViews,function(t){t.__alive||t.remove(e,n)})}function fo(t,e,n,i,r){Od(r||t._componentsViews,function(t){var r=t.__model;t.render(r,e,n,i),yo(r,t)})}function po(t,e,n,i,r){var a,o=t._scheduler;e.eachSeries(function(e){var n=t._chartsMap[e.__viewId];n.__alive=!0;var s=n.renderTask;o.updatePayload(s,i),r&&r.get(e.uid)&&s.dirty(),a|=s.perform(o.getPerformArgs(s)),n.group.silent=!!e.get("silent"),yo(e,n),vo(e,n)}),o.unfinished|=a,mo(t._zr,e),wd(t._zr.dom,e)}function go(t,e){Od(Qd,function(n){n(t,e)})}function mo(t,e){var n=t.storage,i=0;n.traverse(function(t){t.isGroup||i++}),i>e.get("hoverLayerThreshold")&&!Fl.node&&n.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function vo(t,e){var n=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.style.blend!==n&&t.setStyle("blend",n),t.eachPendingDisplayable&&t.eachPendingDisplayable(function(t){t.setStyle("blend",n)})})}function yo(t,e){var n=t.get("z"),i=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=i&&(t.zlevel=i))})}function _o(t){var e=t._coordSysMgr;return a(new qr(t),{getCoordinateSystems:m(e.getCoordinateSystems,e),getComponentByElement:function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}}})}function xo(t){function e(t,e){for(var i=0;i<t.length;i++)t[i][n]=e}var n="__connectUpdateStatus";Od(jd,function(i,r){t._messageCenter.on(r,function(i){if(ip[t.group]&&0!==t[n]){if(i&&i.escapeConnect)return;var r=t.makeActionFromEvent(i),a=[];Od(np,function(e){e!==t&&e.group===t.group&&a.push(e)}),e(a,0),Od(a,function(t){1!==t[n]&&t.dispatchAction(r)}),e(a,2)}})})}function wo(t){ip[t]=!1}function bo(t){return np[yn(t,op)]}function So(t,e){tp[t]=e}function Mo(t){Kd.push(t)}function To(t,e){Do($d,t,e,Nd)}function Io(t,e,n){"function"==typeof e&&(n=e,e="");var i=Bd(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,Pd(qd.test(i)&&qd.test(e)),Ud[i]||(Ud[i]={action:n,actionInfo:t}),jd[e]=i}function Co(t,e){Do(Jd,t,e,Fd,"layout")}function ko(t,e){Do(Jd,t,e,Vd,"visual")}function Do(t,e,n,i,r){(Ed(e)||Bd(e))&&(n=e,e=i);var a=Ra.wrapStageHandler(n,r);return a.__prio=e,a.__raw=n,t.push(a),a}function Ao(t,e){ep[t]=e}function Lo(t){return Cf.extend(t)}function Po(t){return dd.extend(t)}function Oo(t){return fd.extend(t)}function Eo(t){return Da.extend(t)}function Bo(t){return t}function Ro(t,e,n,i,r){this._old=t,this._new=e,this._oldKeyGetter=n||Bo,this._newKeyGetter=i||Bo,this.context=r}function zo(t,e,n,i,r){for(var a=0;a<t.length;a++){var o="_ec_"+r[i](t[a],a),s=e[o];null==s?(n.push(o),e[o]=a):(s.length||(e[o]=s=[s]),s.push(a))}}function No(t){var e={},n=e.encode={},i=e.coordDimMap=R(),r=[];f(t.dimensions,function(e){var a=t.getDimensionInfo(e),o=a.coordDim;if(o){var s=n[o];n.hasOwnProperty(o)||(s=n[o]=[]),s[a.coordDimIndex]=e,a.isSysCoord&&Vo(a.type)&&(r[0]=e),i.set(o,1)}up.each(function(t,e){var i=n[e];n.hasOwnProperty(e)||(i=n[e]=[]);var r=a.otherDims[e];null!=r&&!1!==r&&(i[r]=a.name)})});var a=[];i.each(function(t,e){a=a.concat(n[e])}),e.dataDimsOnCoord=a;var o=n.label;o&&o.length&&(r=o.slice());var s=r.slice(),l=n.tooltip;return l&&l.length&&(s=l.slice()),n.defaultedLabel=r,n.defaultedTooltip=s,e}function Fo(t){return"category"===t?"ordinal":"time"===t?"time":"float"}function Vo(t){return!("ordinal"===t||"time"===t)}function Wo(t){var e=typeof dp.Uint32Array===fp?Array:dp.Uint32Array,n=typeof dp.Uint16Array===fp?Array:dp.Uint16Array;return t._rawCount>65535?e:n}function Ho(t){var e=t.constructor;return e===Array?t.slice():new e(t)}function Go(t,e){f(mp.concat(e.__wrappedMethods||[]),function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t.__wrappedMethods=e.__wrappedMethods}function qo(t){return t}function Xo(t){return t<this._count&&t>=0?this._indices[t]:-1}function Zo(t,e){var n=t._idList[e];return null==n&&(n=t._getIdFromStore(e)),null==n&&(n=pp+e),n}function Yo(t){return y(t)||(t=[t]),t}function Uo(t,e){var n=t.dimensions,i=new vp(d(n,t.getDimensionInfo,t),t.hostModel);Go(i,t);for(var r=i._storage={},a=t._storage,o=0;o<n.length;o++){var s=n[o];a[s]&&(r[s]=l(e,s)>=0?jo(a[s]):a[s])}return i}function jo(t){for(var e=new Array(t.length),n=0;n<t.length;n++)e[n]=Ho(t[n]);return e}function $o(t,e,i){function r(t,e,n){null!=up.get(e)?t.otherDims[e]=n:(t.coordDim=e,t.coordDimIndex=n,u.set(e,!0))}Mr.isInstance(e)||(e=Mr.seriesDataToSource(e)),i=i||{},t=(t||[]).slice();for(var s=(i.dimsDef||[]).slice(),l=R(i.encodeDef),h=R(),u=R(),c=[],d=Ko(e,t,s,i.dimCount),p=0;p<d;p++){var g=s[p]=a({},w(s[p])?s[p]:{name:s[p]}),m=g.name,v=c[p]={otherDims:{}};null!=m&&null==h.get(m)&&(v.name=v.displayName=m,h.set(m,p)),null!=g.type&&(v.type=g.type),null!=g.displayName&&(v.displayName=g.displayName)}l.each(function(t,e){t=on(t).slice();var n=l.set(e,[]);f(t,function(t,i){x(t)&&(t=h.get(t)),null!=t&&t<d&&(n[i]=t,r(c[t],e,i))})});var y=0;f(t,function(t,e){var i,t,a,s;if(x(t))i=t,t={};else{i=t.name;var h=t.ordinalMeta;t.ordinalMeta=null,(t=n(t)).ordinalMeta=h,a=t.dimsDef,s=t.otherDims,t.name=t.coordDim=t.coordDimIndex=t.dimsDef=t.otherDims=null}var u=on(l.get(i));if(!u.length)for(var d=0;d<(a&&a.length||1);d++){for(;y<c.length&&null!=c[y].coordDim;)y++;y<c.length&&u.push(y++)}f(u,function(e,n){var l=c[e];r(o(l,t),i,n),null==l.name&&a&&(l.name=l.displayName=a[n]),l.isSysCoord=!0,s&&o(l.otherDims,s)})});for(var _=i.extraPrefix||"value",b=0;b<d;b++)null==(v=c[b]=c[b]||{}).coordDim&&(v.coordDim=Qo(_,u,i.extraFromZero),v.coordDimIndex=0,v.isExtraCoord=!0),null==v.name&&(v.name=Qo(v.coordDim,h)),null==v.type&&Br(e,b,v.name)&&(v.type="ordinal");return c}function Ko(t,e,n,i){return null==i&&(i=Math.max(t.dimensionsDetectCount||1,e.length,n.length),f(e,function(t){var e=t.dimsDef;e&&(i=Math.max(i,e.length))})),i}function Qo(t,e,n){if(n||null!=e.get(t)){for(var i=0;null!=e.get(t+i);)i++;t+=i}return e.set(t,!0),t}function Jo(t,e){Mr.isInstance(t)||(t=Mr.seriesDataToSource(t));var n,i=e.get("coordinateSystem"),r=Xr.get(i),a=br(e);a&&(n=d(a.coordSysDims,function(t){var e={name:t},n=a.axisMap.get(t);if(n){var i=n.get("type");e.type=Fo(i),e.stackable=ts(i)}return e})),n||(n=r&&(r.getDimensionsInfo?r.getDimensionsInfo():r.dimensions.slice())||["x","y"]);var o,s,l=xp(t,{coordDimensions:n});a&&f(l,function(t,e){var n=t.coordDim,i=a.categoryAxisMap.get(n);i&&(null==o&&(o=e),t.ordinalMeta=i.getOrdinalMeta()),null!=t.otherDims.itemName&&(s=!0)}),s||null==o||(l[o].otherDims.itemName=0);var h=new vp(l,e),u=null!=o&&es(t)?function(t,e,n,i){return i===o?n:this.defaultDimValueGetter(t,e,n,i)}:null;return h.hasItemOption=!1,h.initData(t,null,u),h}function ts(t){return"category"!==t&&"time"!==t}function es(t){if(t.sourceFormat===Of){var e=ns(t.data||[]);return null!=e&&!y(ln(e))}}function ns(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}function is(t,e){if("image"!==this.type){var n=this.style,i=this.shape;i&&"line"===i.symbolType?n.stroke=t:this.__isEmptyBrush?(n.stroke=t,n.fill=e||"#fff"):(n.fill&&(n.fill=t),n.stroke&&(n.stroke=t)),this.dirty(!1)}}function rs(t,e,n,i,r,a,o){var s=0===t.indexOf("empty");s&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var l;return l=0===t.indexOf("image://")?mi(t.slice(8),new Rt(e,n,i,r),o?"center":"cover"):0===t.indexOf("path://")?gi(t.slice(7),{},new Rt(e,n,i,r),o?"center":"cover"):new Cp({shape:{symbolType:t,x:e,y:n,width:i,height:r}}),l.__isEmptyBrush=s,l.setColor=is,l.setColor(a),l}function as(t,e){var n=t.mapDimension("defaultedLabel",!0),i=n.length;if(1===i)return ma(t,e,n[0]);if(i){for(var r=[],a=0;a<n.length;a++){var o=ma(t,e,n[a]);r.push(o)}return r.join(" ")}}function os(t,e){var n=t.getItemVisual(e,"symbolSize");return n instanceof Array?n.slice():[+n,+n]}function ss(t){return[t[0]/2,t[1]/2]}function ls(t,e,n){Oh.call(this),this.updateData(t,e,n)}function hs(t,e){this.parent.drift(t,e)}function us(t){this.group=new Oh,this._symbolCtor=t||ls}function cs(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i&&i(n))&&"none"!==t.getItemVisual(n,"symbol")}function fs(t){var e=t.hostModel;return{itemStyle:e.getModel("itemStyle").getItemStyle(["color"]),hoverItemStyle:e.getModel("emphasis.itemStyle").getItemStyle(),symbolRotate:e.get("symbolRotate"),symbolOffset:e.get("symbolOffset"),hoverAnimation:e.get("hoverAnimation"),labelModel:e.getModel("label"),hoverLabelModel:e.getModel("emphasis.label"),cursorStyle:e.get("cursor")}}function ds(t){return t>=0?1:-1}function ps(t,e,n){for(var i,r=t.getBaseAxis(),a=t.getOtherAxis(r),o=r.onZero?0:a.scale.getExtent()[0],s=a.dim,l="x"===s||"radius"===s?1:0,h=e.stackedOn,u=e.get(s,n);h&&ds(h.get(s,n))===ds(u);){i=h;break}var c=[];return c[l]=e.get(r.dim,n),c[1-l]=i?i.get(s,n,!0):o,t.dataToPoint(c)}function gs(t,e){var n=[];return e.diff(t).add(function(t){n.push({cmd:"+",idx:t})}).update(function(t,e){n.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){n.push({cmd:"-",idx:t})}).execute(),n}function ms(t){return isNaN(t[0])||isNaN(t[1])}function vs(t,e,n,i,r,a,o,s,l,h,u){for(var c=0,f=n,d=0;d<i;d++){var p=e[f];if(f>=r||f<0)break;if(ms(p)){if(u){f+=a;continue}break}if(f===n)t[a>0?"moveTo":"lineTo"](p[0],p[1]),Np(Vp,p);else if(l>0){var g=f+a,m=e[g];if(u)for(;m&&ms(e[g]);)m=e[g+=a];var v=.5,y=e[c];if(!(m=e[g])||ms(m))Np(Wp,p);else{ms(m)&&!u&&(m=p),W(Fp,m,y);var _,x;if("x"===h||"y"===h){var w="x"===h?0:1;_=Math.abs(p[w]-y[w]),x=Math.abs(p[w]-m[w])}else _=th(p,y),x=th(p,m);zp(Wp,p,Fp,-l*(1-(v=x/(x+_))))}Bp(Vp,Vp,s),Rp(Vp,Vp,o),Bp(Wp,Wp,s),Rp(Wp,Wp,o),t.bezierCurveTo(Vp[0],Vp[1],Wp[0],Wp[1],p[0],p[1]),zp(Vp,p,Fp,l*v)}else t.lineTo(p[0],p[1]);c=f,f+=a}return d}function ys(t,e){var n=[1/0,1/0],i=[-1/0,-1/0];if(e)for(var r=0;r<t.length;r++){var a=t[r];a[0]<n[0]&&(n[0]=a[0]),a[1]<n[1]&&(n[1]=a[1]),a[0]>i[0]&&(i[0]=a[0]),a[1]>i[1]&&(i[1]=a[1])}return{min:e?n:i,max:e?i:n}}function _s(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++){var i=t[n],r=e[n];if(i[0]!==r[0]||i[1]!==r[1])return}return!0}}function xs(t){return"number"==typeof t?t:t?.3:0}function ws(t){var e=t.getGlobalExtent();if(t.onBand){var n=t.getBandWidth()/2-1,i=e[1]>e[0]?1:-1;e[0]+=i*n,e[1]-=i*n}return e}function bs(t){return t>=0?1:-1}function Ss(t,e,n,i){var r=e.getBaseAxis(),a=e.getOtherAxis(r),o=0,s=a.scale.getExtent();"start"===i?o=s[0]:"end"===i?o=s[1]:(s=a.scale.getExtent())[0]>0?o=s[0]:s[1]<0&&(o=s[1]);var l=a.dim,h="x"===l||"radius"===l?1:0,u=n.mapDimension(l);return n.mapArray(u?[u]:[],function(t,i){for(var a,s=n.stackedOn;s&&bs(s.get(u,i))===bs(t);){a=s;break}var l=[];return l[h]=n.get(r.dim,i),l[1-h]=a?a.get(u,i,!0):o,e.dataToPoint(l)},!0)}function Ms(t,e,n){var i=ws(t.getAxis("x")),r=ws(t.getAxis("y")),a=t.getBaseAxis().isHorizontal(),o=Math.min(i[0],i[1]),s=Math.min(r[0],r[1]),l=Math.max(i[0],i[1])-o,h=Math.max(r[0],r[1])-s,u=n.get("lineStyle.width")||2,c=n.get("clipOverflow")?u/2:Math.max(l,h);a?(s-=c,h+=2*c):(o-=c,l+=2*c);var f=new Zc({shape:{x:o,y:s,width:l,height:h}});return e&&(f.shape[a?"width":"height"]=0,Xi(f,{shape:{width:l,height:h}},n)),f}function Ts(t,e,n){var i=t.getAngleAxis(),r=t.getRadiusAxis().getExtent(),a=i.getExtent(),o=Math.PI/180,s=new Vc({shape:{cx:t.cx,cy:t.cy,r0:r[0],r:r[1],startAngle:-a[0]*o,endAngle:-a[1]*o,clockwise:i.inverse}});return e&&(s.shape.endAngle=-a[0]*o,Xi(s,{shape:{endAngle:-a[1]*o}},n)),s}function Is(t,e,n){return"polar"===t.type?Ts(t,e,n):Ms(t,e,n)}function Cs(t,e,n){for(var i=e.getBaseAxis(),r="x"===i.dim||"radius"===i.dim?0:1,a=[],o=0;o<t.length-1;o++){var s=t[o+1],l=t[o];a.push(l);var h=[];switch(n){case"end":h[r]=s[r],h[1-r]=l[1-r],a.push(h);break;case"middle":var u=(l[r]+s[r])/2,c=[];h[r]=c[r]=u,h[1-r]=l[1-r],c[1-r]=s[1-r],a.push(h),a.push(c);break;default:h[r]=l[r],h[1-r]=s[1-r],a.push(h)}}return t[o]&&a.push(t[o]),a}function ks(t,e){var n=t.getVisual("visualMeta");if(n&&n.length&&t.count()){for(var i,r=n.length-1;r>=0;r--)if(n[r].dimension<2){i=n[r];break}if(i&&"cartesian2d"===e.type){var a=i.dimension,o=t.dimensions[a],s=e.getAxis(o),l=d(i.stops,function(t){return{coord:s.toGlobalCoord(s.dataToCoord(t.value)),color:t.color}}),h=l.length,u=i.outerColors.slice();h&&l[0].coord>l[h-1].coord&&(l.reverse(),u.reverse());var c=l[0].coord-10,p=l[h-1].coord+10,g=p-c;if(g<.001)return"transparent";f(l,function(t){t.offset=(t.coord-c)/g}),l.push({offset:h?l[h-1].offset:.5,color:u[1]||"transparent"}),l.unshift({offset:h?l[0].offset:.5,color:u[0]||"transparent"});var m=new Jc(0,0,0,0,l,!0);return m[o]=c,m[o+"2"]=p,m}}}function Ds(t){this._setting=t||{},this._extent=[1/0,-1/0],this._interval=0,this.init&&this.init.apply(this,arguments)}function As(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this._map}function Ls(t){return t._map||(t._map=R(t.categories))}function Ps(t){return w(t)&&null!=t.value?t.value:t+""}function Os(t,e,n,i){var r={},a=t[1]-t[0],o=r.interval=ur(a/e,!0);null!=n&&o<n&&(o=r.interval=n),null!=i&&o>i&&(o=r.interval=i);var s=r.intervalPrecision=Es(o);return Rs(r.niceTickExtent=[jp(Math.ceil(t[0]/o)*o,s),jp(Math.floor(t[1]/o)*o,s)],t),r}function Es(t){return nr(t)+2}function Bs(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function Rs(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),Bs(t,0,e),Bs(t,1,e),t[0]>t[1]&&(t[0]=t[1])}function zs(t,e,n,i){var r=[];if(!t)return r;e[0]<n[0]&&r.push(e[0]);for(var a=n[0];a<=n[1]&&(r.push(a),(a=jp(a+t,i))!==r[r.length-1]);)if(r.length>1e4)return[];return e[1]>(r.length?r[r.length-1]:n[1])&&r.push(e[1]),r}function Ns(t){return t.get("stack")||Qp+t.seriesIndex}function Fs(t){return t.dim+t.index}function Vs(t,e){return Ws(d(t,function(t){var e=t.getData(),n=t.coordinateSystem.getBaseAxis(),i=n.getExtent(),r="category"===n.type?n.getBandWidth():Math.abs(i[1]-i[0])/e.count();return{bandWidth:r,barWidth:tr(t.get("barWidth"),r),barMaxWidth:tr(t.get("barMaxWidth"),r),barGap:t.get("barGap"),barCategoryGap:t.get("barCategoryGap"),axisKey:Fs(n),stackId:Ns(t)}}),e)}function Ws(t,e){var n={};f(t,function(t,e){var i=t.axisKey,r=t.bandWidth,a=n[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},o=a.stacks;n[i]=a;var s=t.stackId;o[s]||a.autoWidthCount++,o[s]=o[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!o[s].width&&(o[s].width=l,l=Math.min(a.remainedWidth,l),a.remainedWidth-=l);var h=t.barMaxWidth;h&&(o[s].maxWidth=h);var u=t.barGap;null!=u&&(a.gap=u);var c=t.barCategoryGap;null!=c&&(a.categoryGap=c)});var i={};return f(n,function(t,e){i[e]={};var n=t.stacks,r=t.bandWidth,a=tr(t.categoryGap,r),o=tr(t.gap,1),s=t.remainedWidth,l=t.autoWidthCount,h=(s-a)/(l+(l-1)*o);h=Math.max(h,0),f(n,function(t,e){var n=t.maxWidth;n&&n<h&&(n=Math.min(n,s),t.width&&(n=Math.min(n,t.width)),s-=n,t.width=n,l--)}),h=(s-a)/(l+(l-1)*o),h=Math.max(h,0);var u,c=0;f(n,function(t,e){t.width||(t.width=h),u=t,c+=t.width*(1+o)}),u&&(c-=u.width*o);var d=-c/2;f(n,function(t,n){i[e][n]=i[e][n]||{offset:d,width:t.width},d+=t.width*(1+o)})}),i}function Hs(t,e){return lg(t,sg(e))}function Gs(t,e){var n,i,r,a=t.type,o=e.getMin(),s=e.getMax(),l=null!=o,h=null!=s,u=t.getExtent();"ordinal"===a?n=e.getCategories().length:(y(i=e.get("boundaryGap"))||(i=[i||0,i||0]),"boolean"==typeof i[0]&&(i=[0,0]),i[0]=tr(i[0],1),i[1]=tr(i[1],1),r=u[1]-u[0]||Math.abs(u[0])),null==o&&(o="ordinal"===a?n?0:NaN:u[0]-i[0]*r),null==s&&(s="ordinal"===a?n?n-1:NaN:u[1]+i[1]*r),"dataMin"===o?o=u[0]:"function"==typeof o&&(o=o({min:u[0],max:u[1]})),"dataMax"===s?s=u[1]:"function"==typeof s&&(s=s({min:u[0],max:u[1]})),(null==o||!isFinite(o))&&(o=NaN),(null==s||!isFinite(s))&&(s=NaN),t.setBlank(T(o)||T(s)),e.getNeedCrossZero()&&(o>0&&s>0&&!l&&(o=0),o<0&&s<0&&!h&&(s=0));var c=e.ecModel;if(c){var f=g(c.getSeriesByType("bar"),function(t){return t.getBaseAxis()===e.axis}).length>0;if(("time"===a||"interval"===a)&&f){var d=qs(o,s,e);o=d.min,s=d.max}}return[o,s]}function qs(t,e,n){var i=n.ecModel,r=n.axis.getExtent(),a=r[1]-r[0],o=Vs(g(i.getSeriesByType("bar"),function(t){return!i.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}))[n.axis.dim+n.axis.index];if(void 0===o)return{min:t,max:e};var s=1/0;f(o,function(t){s=Math.min(t.offset,s)});var l=-1/0;f(o,function(t){l=Math.max(t.offset+t.width,l)});var h=Math.abs(s)+l,u=e-t,c=u/(1-(s+l)/a)-u;return e+=c*(l/h),t-=c*(s/h),{min:t,max:e}}function Xs(t,e){if(e=e||t.get("type"))switch(e){case"category":return new Up(t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),[1/0,-1/0]);case"value":return new Kp;default:return(Ds.getClass(e)||Kp).create(t)}}function Zs(t,e,n,i,r){var a,o=0,s=0,l=(i-r)/180*Math.PI,h=1;e.length>40&&(h=Math.floor(e.length/40));for(var u=0;u<t.length;u+=h){var c=t[u],f=ee(e[u],n,"center","top");f.x+=c*Math.cos(l),f.y+=c*Math.sin(l),f.width*=1.3,f.height*=1.3,a?a.intersect(f)?(s++,o=Math.max(o,s)):(a.union(f),s=0):a=f.clone()}return 0===o&&h>1?h:(o+1)*h-1}function Ys(t,e){var n=t.scale,i=n.getTicksLabels(),r=n.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",null!=e?e:"")}}(e),d(i,e)):"function"==typeof e?d(r,function(n,i){return e(Us(t,n),i)},this):i}function Us(t,e){return"category"===t.type?t.scale.getLabel(e):e}function js(t){return this._axes[t]}function $s(t){pg.call(this,t)}function Ks(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}function Qs(t,e){return e.type||(e.data?"category":"value")}function Js(t,e,n){return t.getCoordSysModel()===e}function tl(t,e){var n=e*Math.PI/180,i=t.plain(),r=i.width,a=i.height,o=r*Math.cos(n)+a*Math.sin(n),s=r*Math.sin(n)+a*Math.cos(n);return new Rt(i.x,i.y,o,s)}function el(t){var e,n=t.model,i=n.get("axisLabel.show")?n.getFormattedLabels():[],r=n.getModel("axisLabel"),a=1,o=i.length;o>40&&(a=Math.ceil(o/40));for(var s=0;s<o;s+=a)if(!t.isLabelIgnored(s)){var l=tl(r.getTextRect(i[s]),r.get("rotate")||0);e?e.union(l):e=l}return e}function nl(t,e,n){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,n),this.model=t}function il(t,e,n){var i=t[e];if(n.onZero){var r=n.onZeroAxisIndex;if(null==r){for(var a in i)if(i.hasOwnProperty(a)){var o=i[a];if(o&&!rl(o)){r=+a;break}}null==r&&(n.onZero=!1),n.onZeroAxisIndex=r}else(o=i[r])&&rl(o)&&(n.onZero=!1)}}function rl(t){return"category"===t.type||"time"===t.type||!Cg(t)}function al(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}function ol(t,e){return d(Ag,function(e){return t.getReferringComponents(e)[0]})}function sl(t){return"cartesian2d"===t.get("coordinateSystem")}function ll(t){var e={componentType:t.mainType};return e[t.mainType+"Index"]=t.componentIndex,e}function hl(t,e,n,i){var r,a,o=ar(n-t.rotation),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;return or(o-Lg/2)?(a=l?"bottom":"top",r="center"):or(o-1.5*Lg)?(a=l?"top":"bottom",r="center"):(a="middle",r=o<1.5*Lg&&o>Lg/2?l?"left":"right":l?"right":"left"),{rotation:o,textAlign:r,textVerticalAlign:a}}function ul(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}function cl(t,e,n){var i=t.get("axisLabel.showMinLabel"),r=t.get("axisLabel.showMaxLabel");e=e||[],n=n||[];var a=e[0],o=e[1],s=e[e.length-1],l=e[e.length-2],h=n[0],u=n[1],c=n[n.length-1],f=n[n.length-2];!1===i?(fl(a),fl(h)):dl(a,o)&&(i?(fl(o),fl(u)):(fl(a),fl(h))),!1===r?(fl(s),fl(c)):dl(l,s)&&(r?(fl(l),fl(f)):(fl(s),fl(c)))}function fl(t){t&&(t.ignore=!0)}function dl(t,e,n){var i=t&&t.getBoundingRect().clone(),r=e&&e.getBoundingRect().clone();if(i&&r){var a=nt([]);return ot(a,a,-t.rotation),i.applyTransform(rt([],a,t.getLocalTransform())),r.applyTransform(rt([],a,e.getLocalTransform())),i.intersect(r)}}function pl(t){return"middle"===t||"center"===t}function gl(t,e,n){var i=e.axis;if(e.get("axisTick.show")&&!i.scale.isBlank()){for(var r=e.getModel("axisTick"),a=r.getModel("lineStyle"),s=r.get("length"),l=Rg(r,n.labelInterval),h=i.getTicksCoords(r.get("alignWithLabel")),u=i.scale.getTicks(),c=e.get("axisLabel.showMinLabel"),f=e.get("axisLabel.showMaxLabel"),d=[],p=[],g=t._transform,m=[],v=h.length,y=0;y<v;y++)if(!Bg(i,y,l,v,c,f)){var _=h[y];d[0]=_,d[1]=0,p[0]=_,p[1]=n.tickDirection*s,g&&(Y(d,d,g),Y(p,p,g));var x=new Yc(_i({anid:"tick_"+u[y],shape:{x1:d[0],y1:d[1],x2:p[0],y2:p[1]},style:o(a.getLineStyle(),{stroke:e.get("axisLine.lineStyle.color")}),z2:2,silent:!0}));t.group.add(x),m.push(x)}return m}}function ml(t,e,n){var i=e.axis;if(I(n.axisLabelShow,e.get("axisLabel.show"))&&!i.scale.isBlank()){var r=e.getModel("axisLabel"),a=r.get("margin"),o=i.scale.getTicks(),s=e.getFormattedLabels(),l=(I(n.labelRotate,r.get("rotate"))||0)*Lg/180,h=Eg(n.rotation,l,n.labelDirection),u=e.getCategories(),c=[],d=ul(e),p=e.get("triggerEvent"),g=e.get("axisLabel.showMinLabel"),m=e.get("axisLabel.showMaxLabel");return f(o,function(l,f){if(!Bg(i,f,n.labelInterval,o.length,g,m)){var v=r;u&&u[l]&&u[l].textStyle&&(v=new Ui(u[l].textStyle,r,e.ecModel));var y=v.getTextColor()||e.get("axisLine.lineStyle.color"),_=[i.dataToCoord(l),n.labelOffset+n.labelDirection*a],x=i.scale.getLabel(l),w=new Rc({anid:"label_"+l,position:_,rotation:h.rotation,silent:d,z2:10});Bi(w.style,v,{text:s[f],textAlign:v.getShallow("align",!0)||h.textAlign,textVerticalAlign:v.getShallow("verticalAlign",!0)||v.getShallow("baseline",!0)||h.textVerticalAlign,textFill:"function"==typeof y?y("category"===i.type?x:"value"===i.type?l+"":l,f):y}),p&&(w.eventData=ll(e),w.eventData.targetType="axisLabel",w.eventData.value=x),t._dumbGroup.add(w),w.updateTransform(),c.push(w),t.group.add(w),w.decomposeTransform()}}),c}}function vl(t){var e=yl(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,a=n.get("status"),o=n.get("value");null!=o&&(o=i.parse(o));var s=xl(n);null==a&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==o||o>l[1])&&(o=l[1]),o<l[0]&&(o=l[0]),r.value=o,s&&(r.status=e.axis.scale.isBlank()?"hide":"show")}}function yl(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[wl(t)]}function _l(t){var e=yl(t);return e&&e.axisPointerModel}function xl(t){return!!t.get("handle.show")}function wl(t){return t.type+"||"+t.id}function bl(t,e,n,i,r,a){var o=zg.getAxisPointerClass(t.axisPointerClass);if(o){var s=_l(e);s?(t._axisPointer||(t._axisPointer=new o)).render(e,s,i,a):Sl(t,i)}}function Sl(t,e,n){var i=t._axisPointer;i&&i.dispose(e,n),t._axisPointer=null}function Ml(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,a={},o=r.position,s=r.onZero?"onZero":o,l=r.dim,h=i.getRect(),u=[h.x,h.x+h.width,h.y,h.y+h.height],c={left:0,right:1,top:0,bottom:1,onZero:2},f=e.get("offset")||0,d="x"===l?[u[2]-f,u[3]+f]:[u[0]-f,u[1]+f];if(r.onZero){var p=i.getAxis("x"===l?"y":"x",r.onZeroAxisIndex),g=p.toGlobalCoord(p.dataToCoord(0));d[c.onZero]=Math.max(Math.min(g,d[1]),d[0])}a.position=["y"===l?d[c[s]]:u[0],"x"===l?d[c[s]]:u[3]],a.rotation=Math.PI/2*("x"===l?0:1);var m={top:-1,bottom:1,left:-1,right:1};a.labelDirection=a.tickDirection=a.nameDirection=m[o],a.labelOffset=r.onZero?d[c[o]]-d[c.onZero]:0,e.get("axisTick.inside")&&(a.tickDirection=-a.tickDirection),I(n.labelInside,e.get("axisLabel.inside"))&&(a.labelDirection=-a.labelDirection);var v=e.get("axisLabel.rotate");return a.labelRotate="top"===s?-v:v,a.labelInterval=r.getLabelInterval(),a.z2=1,a}function Tl(t,e,n,i,r,a,o){Ei(t,e,n.getModel("label"),n.getModel("emphasis.label"),{labelFetcher:r,labelDataIndex:a,defaultText:as(r.getData(),a),isRectText:!0,autoColor:i}),Il(t),Il(e)}function Il(t,e){"outside"===t.textPosition&&(t.textPosition=e)}function Cl(t,e,n){n.style.text=null,qi(n,{shape:{width:0}},e,t,function(){n.parent&&n.parent.remove(n)})}function kl(t,e,n){n.style.text=null,qi(n,{shape:{r:n.shape.r0}},e,t,function(){n.parent&&n.parent.remove(n)})}function Dl(t,e,n,i,r,a,s,l){var h=e.getItemVisual(n,"color"),u=e.getItemVisual(n,"opacity"),c=i.getModel("itemStyle"),f=i.getModel("emphasis.itemStyle").getBarItemStyle();l||t.setShape("r",c.get("barBorderRadius")||0),t.useStyle(o({fill:h,opacity:u},c.getBarItemStyle()));var d=i.getShallow("cursor");d&&t.attr("cursor",d);var p=s?r.height>0?"bottom":"top":r.width>0?"left":"right";l||Tl(t.style,f,i,h,a,n,p),Oi(t,f)}function Al(t,e){var n=t.get(Zg)||0;return Math.min(n,Math.abs(e.width),Math.abs(e.height))}function Ll(t,e,n,i){var r=e.getData(),a=this.dataIndex,o=r.getName(a),s=e.get("selectedOffset");i.dispatchAction({type:"pieToggleSelect",from:t,name:o,seriesId:e.id}),r.each(function(t){Pl(r.getItemGraphicEl(t),r.getItemLayout(t),e.isSelected(r.getName(t)),s,n)})}function Pl(t,e,n,i,r){var a=(e.startAngle+e.endAngle)/2,o=Math.cos(a),s=Math.sin(a),l=n?i:0,h=[o*l,s*l];r?t.animate().when(200,{position:h}).start("bounceOut"):t.attr("position",h)}function Ol(t,e){function n(){a.ignore=a.hoverIgnore,o.ignore=o.hoverIgnore}function i(){a.ignore=a.normalIgnore,o.ignore=o.normalIgnore}Oh.call(this);var r=new Vc({z2:2}),a=new Xc,o=new Rc;this.add(r),this.add(a),this.add(o),this.updateData(t,e,!0),this.on("emphasis",n).on("normal",i).on("mouseover",n).on("mouseout",i)}function El(t,e,n,i,r,a,o){function s(e,n){for(var i=e;i>=0&&(t[i].y-=n,!(i>0&&t[i].y>t[i-1].y+t[i-1].height));i--);}function l(t,e,n,i,r,a){for(var o=e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++)if("center"!==t[s].position){var h=Math.abs(t[s].y-i),u=t[s].len,c=t[s].len2,f=h<r+u?Math.sqrt((r+u+c)*(r+u+c)-h*h):Math.abs(t[s].x-n);e&&f>=o&&(f=o-10),!e&&f<=o&&(f=o+10),t[s].x=n+f*a,o=f}}t.sort(function(t,e){return t.y-e.y});for(var h,u=0,c=t.length,f=[],d=[],p=0;p<c;p++)(h=t[p].y-u)<0&&function(e,n,i,r){for(var a=e;a<n;a++)if(t[a].y+=i,a>e&&a+1<n&&t[a+1].y>t[a].y+t[a].height)return void s(a,i/2);s(n-1,i/2)}(p,c,-h),u=t[p].y+t[p].height;o-u<0&&s(c-1,u-o);for(p=0;p<c;p++)t[p].y>=n?d.push(t[p]):f.push(t[p]);l(f,!1,e,n,i,r),l(d,!0,e,n,i,r)}function Bl(t,e,n,i,r,a){for(var o=[],s=[],l=0;l<t.length;l++)t[l].x<e?o.push(t[l]):s.push(t[l]);El(s,e,n,i,1,r,a),El(o,e,n,i,-1,r,a);for(l=0;l<t.length;l++){var h=t[l].linePoints;if(h){var u=h[1][0]-h[2][0];t[l].x<e?h[2][0]=t[l].x+3:h[2][0]=t[l].x-3,h[1][1]=h[2][1]=t[l].y,h[1][0]=h[2][0]+u}}}var Rl=2311,zl=function(){return Rl++},Nl={},Fl=Nl="undefined"!=typeof wx?{browser:{},os:{},node:!1,wxa:!0,canvasSupported:!0,svgSupported:!1,touchEventsSupported:!0}:"undefined"==typeof document&&"undefined"!=typeof self?{browser:{},os:{},node:!1,worker:!0,canvasSupported:!0}:"undefined"==typeof navigator?{browser:{},os:{},node:!0,worker:!1,canvasSupported:!0,svgSupported:!0}:function(t){var e={},n={},i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),a=t.match(/Edge\/([\d.]+)/),o=/micromessenger/i.test(t);return i&&(n.firefox=!0,n.version=i[1]),r&&(n.ie=!0,n.version=r[1]),a&&(n.edge=!0,n.version=a[1]),o&&(n.weChat=!0),{browser:n,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!n.ie&&!n.edge,pointerEventsSupported:"onpointerdown"in window&&(n.edge||n.ie&&n.version>=11)}}(navigator.userAgent),Vl={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},Wl={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},Hl=Object.prototype.toString,Gl=Array.prototype,ql=Gl.forEach,Xl=Gl.filter,Zl=Gl.slice,Yl=Gl.map,Ul=Gl.reduce,jl={},$l=function(){return jl.createCanvas()};jl.createCanvas=function(){return document.createElement("canvas")};var Kl,Ql="__ec_primitive__";B.prototype={constructor:B,get:function(t){return this.hasOwnProperty(t)?this[t]:null},set:function(t,e){return this[t]=e},each:function(t,e){void 0!==e&&(t=m(t,e));for(var n in this)this.hasOwnProperty(n)&&t(this[n],n)},removeKey:function(t){delete this[t]}};var Jl="undefined"==typeof Float32Array?Array:Float32Array,th=Z,eh=function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])};$.prototype={constructor:$,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(K(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,i=t.offsetY,r=n-this._x,a=i-this._y;this._x=n,this._y=i,e.drift(r,a,t),this.dispatchToElement(K(e,t),"drag",t.event);var o=this.findHover(n,i,e).target,s=this._dropTarget;this._dropTarget=o,e!==o&&(s&&o!==s&&this.dispatchToElement(K(s,t),"dragleave",t.event),o&&o!==s&&this.dispatchToElement(K(o,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(K(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(K(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}};var nh=Array.prototype.slice,ih=function(){this._$handlers={}};ih.prototype={constructor:ih,one:function(t,e,n){var i=this._$handlers;if(!e||!t)return this;i[t]||(i[t]=[]);for(var r=0;r<i[t].length;r++)if(i[t][r].h===e)return this;return i[t].push({h:e,one:!0,ctx:n||this}),this},on:function(t,e,n){var i=this._$handlers;if(!e||!t)return this;i[t]||(i[t]=[]);for(var r=0;r<i[t].length;r++)if(i[t][r].h===e)return this;return i[t].push({h:e,one:!1,ctx:n||this}),this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var n=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,a=n[t].length;r<a;r++)n[t][r].h!=e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>3&&(e=nh.call(e,1));for(var i=this._$handlers[t],r=i.length,a=0;a<r;){switch(n){case 1:i[a].h.call(i[a].ctx);break;case 2:i[a].h.call(i[a].ctx,e[1]);break;case 3:i[a].h.call(i[a].ctx,e[1],e[2]);break;default:i[a].h.apply(i[a].ctx,e)}i[a].one?(i.splice(a,1),r--):a++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>4&&(e=nh.call(e,1,e.length-1));for(var i=e[e.length-1],r=this._$handlers[t],a=r.length,o=0;o<a;){switch(n){case 1:r[o].h.call(i);break;case 2:r[o].h.call(i,e[1]);break;case 3:r[o].h.call(i,e[1],e[2]);break;default:r[o].h.apply(i,e)}r[o].one?(r.splice(o,1),a--):o++}}return this}};var rh="silent";J.prototype.dispose=function(){};var ah=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],oh=function(t,e,n,i){ih.call(this),this.storage=t,this.painter=e,this.painterRoot=i,n=n||new J,this.proxy=null,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,$.call(this),this.setHandlerProxy(n)};oh.prototype={constructor:oh,setHandlerProxy:function(t){this.proxy&&this.proxy.dispose(),t&&(f(ah,function(e){t.on&&t.on(e,this[e],this)},this),t.handler=this),this.proxy=t},mousemove:function(t){var e=t.zrX,n=t.zrY,i=this._hovered,r=i.target;r&&!r.__zr&&(r=(i=this.findHover(i.x,i.y)).target);var a=this._hovered=this.findHover(e,n),o=a.target,s=this.proxy;s.setCursor&&s.setCursor(o?o.cursor:"default"),r&&o!==r&&this.dispatchToElement(i,"mouseout",t),this.dispatchToElement(a,"mousemove",t),o&&o!==r&&this.dispatchToElement(a,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);var e,n=t.toElement||t.relatedTarget;do{n=n&&n.parentNode}while(n&&9!=n.nodeType&&!(e=n===this.painterRoot));!e&&this.trigger("globalout",{event:t})},resize:function(t){this._hovered={}},dispatch:function(t,e){var n=this[t];n&&n.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,a=Q(e,t,n);i&&(i[r]&&(a.cancelBubble=i[r].call(i,a)),i.trigger(e,a),i=i.parent,!a.cancelBubble););a.cancelBubble||(this.trigger(e,a),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[r]&&t[r].call(t,a),t.trigger&&t.trigger(e,a)}))}},findHover:function(t,e,n){for(var i=this.storage.getDisplayList(),r={x:t,y:e},a=i.length-1;a>=0;a--){var o;if(i[a]!==n&&!i[a].ignore&&(o=tt(i[a],t,e))&&(!r.topTarget&&(r.topTarget=i[a]),o!==rh)){r.target=i[a];break}}return r}},f(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){oh.prototype[t]=function(e){var n=this.findHover(e.zrX,e.zrY),i=n.target;if("mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||th(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}),u(oh,ih),u(oh,$);var sh="undefined"==typeof Float32Array?Array:Float32Array,lh=nt,hh=5e-5,uh=function(t){(t=t||{}).position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},ch=uh.prototype;ch.transform=null,ch.needLocalTransform=function(){return ht(this.rotation)||ht(this.position[0])||ht(this.position[1])||ht(this.scale[0]-1)||ht(this.scale[1]-1)},ch.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;n||e?(i=i||et(),n?this.getLocalTransform(i):lh(i),e&&(n?rt(i,t.transform,i):it(i,t.transform)),this.transform=i,this.invTransform=this.invTransform||et(),lt(this.invTransform,i)):i&&lh(i)},ch.getLocalTransform=function(t){return uh.getLocalTransform(this,t)},ch.setTransform=function(t){var e=this.transform,n=t.dpr||1;e?t.setTransform(n*e[0],n*e[1],n*e[2],n*e[3],n*e[4],n*e[5]):t.setTransform(n,0,0,n,0,0)},ch.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var fh=[];ch.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(rt(fh,t.invTransform,e),e=fh);var n=e[0]*e[0]+e[1]*e[1],i=e[2]*e[2]+e[3]*e[3],r=this.position,a=this.scale;ht(n-1)&&(n=Math.sqrt(n)),ht(i-1)&&(i=Math.sqrt(i)),e[0]<0&&(n=-n),e[3]<0&&(i=-i),r[0]=e[4],r[1]=e[5],a[0]=n,a[1]=i,this.rotation=Math.atan2(-e[1]/i,e[0]/n)}},ch.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),n=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(n=-n),[e,n]},ch.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&Y(n,n,i),n},ch.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&Y(n,n,i),n},uh.getLocalTransform=function(t,e){lh(e=e||[]);var n=t.origin,i=t.scale||[1,1],r=t.rotation||0,a=t.position||[0,0];return n&&(e[4]-=n[0],e[5]-=n[1]),st(e,e,i),r&&ot(e,e,r),n&&(e[4]+=n[0],e[5]+=n[1]),e[4]+=a[0],e[5]+=a[1],e};var dh={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-dh.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*dh.bounceIn(2*t):.5*dh.bounceOut(2*t-1)+.5}};ut.prototype={constructor:ut,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)this._pausedTime+=e;else{var n=(t-this._startTime-this._pausedTime)/this._life;if(!(n<0)){n=Math.min(n,1);var i=this.easing,r="string"==typeof i?dh[i]:i,a="function"==typeof r?r(n):n;return this.fire("frame",a),1==n?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){this[t="on"+t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}};var ph=function(){this.head=null,this.tail=null,this._len=0},gh=ph.prototype;gh.insert=function(t){var e=new mh(t);return this.insertEntry(e),e},gh.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},gh.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},gh.len=function(){return this._len},gh.clear=function(){this.head=this.tail=null,this._len=0};var mh=function(t){this.value=t,this.next,this.prev},vh=function(t){this._list=new ph,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},yh=vh.prototype;yh.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var a=n.len(),o=this._lastRemovedEntry;if(a>=this._maxSize&&a>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}o?o.value=e:o=new mh(e),o.key=t,n.insertEntry(o),i[t]=o}return r},yh.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},yh.clear=function(){this._list.clear(),this._map={}};var _h={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},xh=new vh(20),wh=null,bh=Array.prototype.slice,Sh=function(t,e,n,i){this._tracks={},this._target=t,this._loop=e||!1,this._getter=n||St,this._setter=i||Mt,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};Sh.prototype={when:function(t,e){var n=this._tracks;for(var i in e)if(e.hasOwnProperty(i)){if(!n[i]){n[i]=[];var r=this._getter(this._target,i);if(null==r)continue;0!==t&&n[i].push({time:0,value:Pt(r)})}n[i].push({time:t,value:e[i]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].pause();this._paused=!0},resume:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,n=0;n<e;n++)t[n].call(this)},start:function(t,e){var n,i=this,r=0;for(var a in this._tracks)if(this._tracks.hasOwnProperty(a)){var o=Bt(this,t,function(){--r||i._doneCallback()},this._tracks[a],a,e);o&&(this._clipList.push(o),r++,this.animation&&this.animation.addClip(o),n=o)}if(n){var s=n.onframe;n.onframe=function(t,e){s(t,e);for(var n=0;n<i._onframeList.length;n++)i._onframeList[n](t,e)}}return r||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,n=this.animation,i=0;i<e.length;i++){var r=e[i];t&&r.onframe(this._target,1),n&&n.removeClip(r)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}};var Mh=1;"undefined"!=typeof window&&(Mh=Math.max(window.devicePixelRatio||1,1));var Th=Mh,Ih=function(){},Ch=Ih,kh=function(){this.animators=[]};kh.prototype={constructor:kh,animate:function(t,e){var n,i=!1,r=this,a=this.__zr;if(t){var o=t.split("."),s=r;i="shape"===o[0];for(var h=0,u=o.length;h<u;h++)s&&(s=s[o[h]]);s&&(n=s)}else n=r;if(n){var c=r.animators,f=new Sh(n,e);return f.during(function(t){r.dirty(i)}).done(function(){c.splice(l(c,f),1)}),c.push(f),a&&a.animation.addAnimator(f),f}Ch('Property "'+t+'" is not existed in element '+r.id)},stopAnimation:function(t){for(var e=this.animators,n=e.length,i=0;i<n;i++)e[i].stop(t);return e.length=0,this},animateTo:function(t,e,n,i,r,a){x(n)?(r=i,i=n,n=0):_(i)?(r=i,i="linear",n=0):_(n)?(r=n,n=0):_(e)?(r=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,n);var o=this.animators.slice(),s=o.length;s||r&&r();for(var l=0;l<o.length;l++)o[l].done(function(){--s||r&&r()}).start(i,a)},_animateToShallow:function(t,e,n,i,r){var a={},o=0;for(var s in n)if(n.hasOwnProperty(s))if(null!=e[s])w(n[s])&&!c(n[s])?this._animateToShallow(t?t+"."+s:s,e[s],n[s],i,r):(a[s]=n[s],o++);else if(null!=n[s])if(t){var l={};l[t]={},l[t][s]=n[s],this.attr(l)}else this.attr(s,n[s]);return o>0&&this.animate(t,!1).when(null==i?500:i,a).delay(r||0),this}};var Dh=function(t){uh.call(this,t),ih.call(this,t),kh.call(this,t),this.id=t.id||zl()};Dh.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,isGroup:!1,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var n=this.transform;n||(n=this.transform=[1,0,0,1,0,0]),n[4]+=t,n[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var n=this[t];n||(n=this[t]=[]),n[0]=e[0],n[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(w(t))for(var n in t)t.hasOwnProperty(n)&&this.attrKV(n,t[n]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},u(Dh,kh),u(Dh,uh),u(Dh,ih);var Ah=Y,Lh=Math.min,Ph=Math.max;Rt.prototype={constructor:Rt,union:function(t){var e=Lh(t.x,this.x),n=Lh(t.y,this.y);this.width=Ph(t.x+t.width,this.x+this.width)-e,this.height=Ph(t.y+t.height,this.y+this.height)-n,this.x=e,this.y=n},applyTransform:function(){var t=[],e=[],n=[],i=[];return function(r){if(r){t[0]=n[0]=this.x,t[1]=i[1]=this.y,e[0]=i[0]=this.x+this.width,e[1]=n[1]=this.y+this.height,Ah(t,t,r),Ah(e,e,r),Ah(n,n,r),Ah(i,i,r),this.x=Lh(t[0],e[0],n[0],i[0]),this.y=Lh(t[1],e[1],n[1],i[1]);var a=Ph(t[0],e[0],n[0],i[0]),o=Ph(t[1],e[1],n[1],i[1]);this.width=a-this.x,this.height=o-this.y}}}(),calculateTransform:function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=et();return at(r,r,[-e.x,-e.y]),st(r,r,[n,i]),at(r,r,[t.x,t.y]),r},intersect:function(t){if(!t)return!1;t instanceof Rt||(t=Rt.create(t));var e=this,n=e.x,i=e.x+e.width,r=e.y,a=e.y+e.height,o=t.x,s=t.x+t.width,l=t.y,h=t.y+t.height;return!(i<o||s<n||a<l||h<r)},contain:function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},clone:function(){return new Rt(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},Rt.create=function(t){return new Rt(t.x,t.y,t.width,t.height)};var Oh=function(t){t=t||{},Dh.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};Oh.prototype={constructor:Oh,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var n=this._children,i=n.indexOf(e);i>=0&&(n.splice(i,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,n=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof Oh&&t.addChildrenToStorage(e)),n&&n.refresh()},remove:function(t){var e=this.__zr,n=this.__storage,i=this._children,r=l(i,t);return r<0?this:(i.splice(r,1),t.parent=null,n&&(n.delFromStorage(t),t instanceof Oh&&t.delChildrenFromStorage(n)),e&&e.refresh(),this)},removeAll:function(){var t,e,n=this._children,i=this.__storage;for(e=0;e<n.length;e++)t=n[e],i&&(i.delFromStorage(t),t instanceof Oh&&t.delChildrenFromStorage(i)),t.parent=null;return n.length=0,this},eachChild:function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},traverse:function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n];t.call(e,i),"group"===i.type&&i.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.addToStorage(n),n instanceof Oh&&n.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.delFromStorage(n),n instanceof Oh&&n.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,n=new Rt(0,0,0,0),i=t||this._children,r=[],a=0;a<i.length;a++){var o=i[a];if(!o.ignore&&!o.invisible){var s=o.getBoundingRect(),l=o.getLocalTransform(r);l?(n.copy(s),n.applyTransform(l),(e=e||n.clone()).union(n)):(e=e||s.clone()).union(s)}}return e||n}},h(Oh,Dh);var Eh=32,Bh=7,Rh=function(){this._roots=[],this._displayList=[],this._displayListLen=0};Rh.prototype={constructor:Rh,traverse:function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,i=0,r=e.length;i<r;i++)this._updateAndAddDisplayable(e[i],null,t);n.length=this._displayListLen,Fl.canvasSupported&&qt(n,Xt)},_updateAndAddDisplayable:function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var i=t.clipPath;if(i){e=e?e.slice():[];for(var r=i,a=t;r;)r.parent=a,r.updateTransform(),e.push(r),a=r,r=r.clipPath}if(t.isGroup){for(var o=t._children,s=0;s<o.length;s++){var l=o[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,n)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){t.__storage!==this&&(t instanceof Oh&&t.addChildrenToStorage(this),this.addToStorage(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(n=0;n<this._roots.length;n++){var e=this._roots[n];e instanceof Oh&&e.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var n=0,i=t.length;n<i;n++)this.delRoot(t[n]);else{var r=l(this._roots,t);r>=0&&(this.delFromStorage(t),this._roots.splice(r,1),t instanceof Oh&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t&&(t.__storage=this,t.dirty(!1)),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:Xt};var zh={shadowBlur:1,shadowOffsetX:1,shadowOffsetY:1,textShadowBlur:1,textShadowOffsetX:1,textShadowOffsetY:1,textBoxShadowBlur:1,textBoxShadowOffsetX:1,textBoxShadowOffsetY:1},Nh=function(t,e,n){return zh.hasOwnProperty(e)?n*=t.dpr:n},Fh=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],Vh=function(t,e){this.extendFrom(t,!1),this.host=e};Vh.prototype={constructor:Vh,host:null,fill:"#000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,font:null,textFont:null,fontStyle:null,fontWeight:null,fontSize:null,fontFamily:null,textTag:null,textFill:"#000",textStroke:null,textWidth:null,textHeight:null,textStrokeWidth:0,textLineHeight:null,textPosition:"inside",textRect:null,textOffset:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowColor:"transparent",textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textBoxShadowColor:"transparent",textBoxShadowBlur:0,textBoxShadowOffsetX:0,textBoxShadowOffsetY:0,transformText:!1,textRotation:0,textOrigin:null,textBackgroundColor:null,textBorderColor:null,textBorderWidth:0,textBorderRadius:0,textPadding:null,rich:null,truncate:null,blend:null,bind:function(t,e,n){for(var i=this,r=n&&n.style,a=!r,o=0;o<Fh.length;o++){var s=Fh[o],l=s[0];(a||i[l]!==r[l])&&(t[l]=Nh(t,l,i[l]||s[1]))}if((a||i.fill!==r.fill)&&(t.fillStyle=i.fill),(a||i.stroke!==r.stroke)&&(t.strokeStyle=i.stroke),(a||i.opacity!==r.opacity)&&(t.globalAlpha=null==i.opacity?1:i.opacity),(a||i.blend!==r.blend)&&(t.globalCompositeOperation=i.blend||"source-over"),this.hasStroke()){var h=i.lineWidth;t.lineWidth=h/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&this.lineWidth>0},extendFrom:function(t,e){if(t)for(var n in t)!t.hasOwnProperty(n)||!0!==e&&(!1===e?this.hasOwnProperty(n):null==t[n])||(this[n]=t[n])},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,n){for(var i=("radial"===e.type?Yt:Zt)(t,e,n),r=e.colorStops,a=0;a<r.length;a++)i.addColorStop(r[a].offset,r[a].color);return i}};for(var Wh=Vh.prototype,Hh=0;Hh<Fh.length;Hh++){var Gh=Fh[Hh];Gh[0]in Wh||(Wh[Gh[0]]=Gh[1])}Vh.getGradient=Wh.getGradient;var qh=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};qh.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")};var Xh=function(t,e,n){var i;n=n||Th,"string"==typeof t?i=jt(t,e,n):w(t)&&(t=(i=t).id),this.id=t,this.dom=i;var r=i.style;r&&(i.onselectstart=Ut,r["-webkit-user-select"]="none",r["user-select"]="none",r["-webkit-touch-callout"]="none",r["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",r.padding=0,r.margin=0,r["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=n};Xh.prototype={constructor:Xh,__dirty:!0,__used:!1,__drawIndex:0,__startIndex:0,__endIndex:0,incremental:!1,getElementCount:function(){return this.__endIndex-this.__startIndex},initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=jt("back-"+this.id,this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var n=this.dpr,i=this.dom,r=i.style,a=this.domBack;r.width=t+"px",r.height=e+"px",i.width=t*n,i.height=e*n,a&&(a.width=t*n,a.height=e*n,1!=n&&this.ctxBack.scale(n,n))},clear:function(t){var e=this.dom,n=this.ctx,i=e.width,r=e.height,a=this.clearColor,o=this.motionBlur&&!t,s=this.lastFrameAlpha,l=this.dpr;if(o&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,i/l,r/l)),n.clearRect(0,0,i,r),a){var h;a.colorStops?(h=a.__canvasGradient||Vh.getGradient(n,a,{x:0,y:0,width:i,height:r}),a.__canvasGradient=h):a.image&&(h=qh.prototype.getCanvasPattern.call(a,n)),n.save(),n.fillStyle=h||a,n.fillRect(0,0,i,r),n.restore()}if(o){var u=this.domBack;n.save(),n.globalAlpha=s,n.drawImage(u,0,0,i,r),n.restore()}}};var Zh="undefined"!=typeof window&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)},Yh=new vh(50),Uh={},jh=0,$h=5e3,Kh=/\{([a-zA-Z0-9_]+)\|([^}]*)\}/g,Qh="12px sans-serif",Jh={};Jh.measureText=function(t,e){var n=s();return n.font=e||Qh,n.measureText(t)};var tu={left:1,right:1,center:1},eu={top:1,bottom:1,middle:1},nu=new Rt,iu=function(){};iu.prototype={constructor:iu,drawRectText:function(t,e){var n=this.style;e=n.textRect||e,this.__dirty&&ye(n);var i=n.text;if(null!=i&&(i+=""),Be(i,n)){t.save();var r=this.transform;n.transformText?this.setTransform(t):r&&(nu.copy(e),nu.applyTransform(r),e=nu),xe(this,t,i,n,e),t.restore()}}},Re.prototype={constructor:Re,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:!1,incremental:!1,inplace:!1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var n=this.transformCoordToLocal(t,e);return this.getBoundingRect().contain(n[0],n[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?Dh.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new Vh(t,this),this.dirty(!1),this}},h(Re,Dh),u(Re,iu),ze.prototype={constructor:ze,type:"image",brush:function(t,e){var n=this.style,i=n.image;n.bind(t,this,e);var r=this._image=Kt(i,this._image,this,this.onload);if(r&&Jt(r)){var a=n.x||0,o=n.y||0,s=n.width,l=n.height,h=r.width/r.height;if(null==s&&null!=l?s=l*h:null==l&&null!=s?l=s/h:null==s&&null==l&&(s=r.width,l=r.height),this.setTransform(t),n.sWidth&&n.sHeight){var u=n.sx||0,c=n.sy||0;t.drawImage(r,u,c,n.sWidth,n.sHeight,a,o,s,l)}else if(n.sx&&n.sy){var f=s-(u=n.sx),d=l-(c=n.sy);t.drawImage(r,u,c,f,d,a,o,s,l)}else t.drawImage(r,a,o,s,l);null!=n.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new Rt(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},h(ze,Re);var ru=new Rt(0,0,0,0),au=new Rt(0,0,0,0),ou=function(t,e,n){this.type="canvas";var i=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=a({},n||{}),this.dpr=n.devicePixelRatio||Th,this._singleCanvas=i,this.root=t;var r=t.style;r&&(r["-webkit-tap-highlight-color"]="transparent",r["-webkit-user-select"]=r["user-select"]=r["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var o=this._zlevelList=[],s=this._layers={};if(this._layerConfig={},this._needsManuallyCompositing=!1,i){null!=n.width&&(t.width=n.width),null!=n.height&&(t.height=n.height);var l=t.width,h=t.height;this._width=l,this._height=h;var u=new Xh(t,this,1);u.__builtin__=!0,u.initContext(),s[314159]=u,o.push(314159),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var c=this._domRoot=Ge(this._width,this._height);t.appendChild(c)}this._hoverlayer=null,this._hoverElements=[]};ou.prototype={constructor:ou,getType:function(){return"canvas"},isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},getViewportRootOffset:function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},refresh:function(t){var e=this.storage.getDisplayList(!0),n=this._zlevelList;this._redrawId=Math.random(),this._paintList(e,t,this._redrawId);for(var i=0;i<n.length;i++){var r=n[i],a=this._layers[r];!a.__builtin__&&a.refresh&&a.refresh()}return this.refreshHover(),this},addHover:function(t,e){if(!t.__hoverMir){var n=new t.constructor({style:t.style,shape:t.shape});n.__from=t,t.__hoverMir=n,n.setStyle(e),this._hoverElements.push(n)}},removeHover:function(t){var e=t.__hoverMir,n=this._hoverElements,i=l(n,e);i>=0&&n.splice(i,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,n=0;n<e.length;n++){var i=e[n].__from;i&&(i.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){qt(t,this.storage.displayableSortFunc),n||(n=this._hoverlayer=this.getLayer(1e5));var i={};n.ctx.save();for(var r=0;r<e;){var a=t[r],o=a.__from;o&&o.__zr?(r++,o.invisible||(a.transform=o.transform,a.invTransform=o.invTransform,a.__clipPaths=o.__clipPaths,this._doPaintEl(a,n,!0,i))):(t.splice(r,1),o.__hoverMir=null,e--)}n.ctx.restore()}},getHoverLayer:function(){return this.getLayer(1e5)},_paintList:function(t,e,n){if(this._redrawId===n){e=e||!1,this._updateLayerStatus(t);var i=this._doPaintList(t,e);if(this._needsManuallyCompositing&&this._compositeManually(),!i){var r=this;Zh(function(){r._paintList(t,e,n)})}}},_compositeManually:function(){var t=this.getLayer(314159).ctx,e=this._domRoot.width,n=this._domRoot.height;t.clearRect(0,0,e,n),this.eachBuiltinLayer(function(i){i.virtual&&t.drawImage(i.dom,0,0,e,n)})},_doPaintList:function(t,e){for(var n=[],i=0;i<this._zlevelList.length;i++){var r=this._zlevelList[i];(s=this._layers[r]).__builtin__&&s!==this._hoverlayer&&(s.__dirty||e)&&n.push(s)}for(var a=!0,o=0;o<n.length;o++){var s=n[o],l=s.ctx,h={};l.save();var u=e?s.__startIndex:s.__drawIndex,c=!e&&s.incremental&&Date.now,d=c&&Date.now();if(s.__startIndex===s.__endIndex)s.clear();else if(u===s.__startIndex){var p=t[u];p.incremental&&p.notClear&&!e||s.clear()}-1===u&&(console.error("For some unknown reason. drawIndex is -1"),u=s.__startIndex);for(var g=u;g<s.__endIndex;g++){var m=t[g];if(this._doPaintEl(m,s,e,h),m.__dirty=!1,c&&Date.now()-d>15)break}s.__drawIndex=g,s.__drawIndex<s.__endIndex&&(a=!1),h.prevElClipPaths&&l.restore(),l.restore()}return Fl.wxa&&f(this._layers,function(t){t&&t.ctx&&t.ctx.draw&&t.ctx.draw()}),a},_doPaintEl:function(t,e,n,i){var r=e.ctx,a=t.transform;if((e.__dirty||n)&&!t.invisible&&0!==t.style.opacity&&(!a||a[0]||a[3])&&(!t.culling||!Ve(t,this._width,this._height))){var o=t.__clipPaths;i.prevElClipPaths&&!We(o,i.prevElClipPaths)||(i.prevElClipPaths&&(e.ctx.restore(),i.prevElClipPaths=null,i.prevEl=null),o&&(r.save(),He(o,r),i.prevElClipPaths=o)),t.beforeBrush&&t.beforeBrush(r),t.brush(r,i.prevEl||null),i.prevEl=t,t.afterBrush&&t.afterBrush(r)}},getLayer:function(t,e){this._singleCanvas&&!this._needsManuallyCompositing&&(t=314159);var n=this._layers[t];return n||((n=new Xh("zr_"+t,this,this.dpr)).zlevel=t,n.__builtin__=!0,this._layerConfig[t]&&i(n,this._layerConfig[t],!0),e&&(n.virtual=e),this.insertLayer(t,n),n.initContext()),n},insertLayer:function(t,e){var n=this._layers,i=this._zlevelList,r=i.length,a=null,o=-1,s=this._domRoot;if(n[t])Ch("ZLevel "+t+" has been used already");else if(Fe(e)){if(r>0&&t>i[0]){for(o=0;o<r-1&&!(i[o]<t&&i[o+1]>t);o++);a=n[i[o]]}if(i.splice(o+1,0,t),n[t]=e,!e.virtual)if(a){var l=a.dom;l.nextSibling?s.insertBefore(e.dom,l.nextSibling):s.appendChild(e.dom)}else s.firstChild?s.insertBefore(e.dom,s.firstChild):s.appendChild(e.dom)}else Ch("Layer of zlevel "+t+" is not valid")},eachLayer:function(t,e){var n,i,r=this._zlevelList;for(i=0;i<r.length;i++)n=r[i],t.call(e,this._layers[n],n)},eachBuiltinLayer:function(t,e){var n,i,r,a=this._zlevelList;for(r=0;r<a.length;r++)i=a[r],(n=this._layers[i]).__builtin__&&t.call(e,n,i)},eachOtherLayer:function(t,e){var n,i,r,a=this._zlevelList;for(r=0;r<a.length;r++)i=a[r],(n=this._layers[i]).__builtin__||t.call(e,n,i)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){function e(t){n&&(n.__endIndex!==t&&(n.__dirty=!0),n.__endIndex=t)}if(this.eachBuiltinLayer(function(t,e){t.__dirty=t.__used=!1}),this._singleCanvas)for(r=1;r<t.length;r++)if((o=t[r]).zlevel!==t[r-1].zlevel||o.incremental){this._needsManuallyCompositing=!0;break}for(var n=null,i=0,r=0;r<t.length;r++){var a,o=t[r],s=o.zlevel;o.incremental?((a=this.getLayer(s+.001,this._needsManuallyCompositing)).incremental=!0,i=1):a=this.getLayer(s+(i>0?.01:0),this._needsManuallyCompositing),a.__builtin__||Ch("ZLevel "+s+" has been used by unkown layer "+a.id),a!==n&&(a.__used=!0,a.__startIndex!==r&&(a.__dirty=!0),a.__startIndex=r,a.incremental?a.__drawIndex=-1:a.__drawIndex=r,e(r),n=a),o.__dirty&&(a.__dirty=!0,a.incremental&&a.__drawIndex<0&&(a.__drawIndex=r))}e(r),this.eachBuiltinLayer(function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var n=this._layerConfig;n[t]?i(n[t],e,!0):n[t]=e;for(var r=0;r<this._zlevelList.length;r++){var a=this._zlevelList[r];a!==t&&a!==t+.01||i(this._layers[a],n[t],!0)}}},delLayer:function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(l(n,t),1))},resize:function(t,e){if(this._domRoot.style){var n=this._domRoot;n.style.display="none";var i=this._opts;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=this._getSize(0),e=this._getSize(1),n.style.display="",this._width!=t||e!=this._height){n.style.width=t+"px",n.style.height=e+"px";for(var r in this._layers)this._layers.hasOwnProperty(r)&&this._layers[r].resize(t,e);f(this._progressiveLayers,function(n){n.resize(t,e)}),this.refresh(!0)}this._width=t,this._height=e}else{if(null==t||null==e)return;this._width=t,this._height=e,this.getLayer(314159).resize(t,e)}return this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas&&!this._compositeManually)return this._layers[314159].dom;var e=new Xh("image",this,t.pixelRatio||this.dpr);if(e.initContext(),e.clearColor=t.backgroundColor,e.clear(),t.pixelRatio<=this.dpr){this.refresh();var n=e.dom.width,i=e.dom.height,r=e.ctx;this.eachLayer(function(t){t.__builtin__?r.drawImage(t.dom,0,0,n,i):t.renderToCanvas&&(e.ctx.save(),t.renderToCanvas(e.ctx),e.ctx.restore())})}else for(var a={},o=this.storage.getDisplayList(!0),s=0;s<o.length;s++){var l=o[s];this._doPaintEl(l,e,!0,a)}return e.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,n=["width","height"][t],i=["clientWidth","clientHeight"][t],r=["paddingLeft","paddingTop"][t],a=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);var o=this.root,s=document.defaultView.getComputedStyle(o);return(o[i]||Ne(s[n])||Ne(o.style[n]))-(Ne(s[r])||0)-(Ne(s[a])||0)|0},pathToImage:function(t,e){e=e||this.dpr;var n=document.createElement("canvas"),i=n.getContext("2d"),r=t.getBoundingRect(),a=t.style,o=a.shadowBlur*e,s=a.shadowOffsetX*e,l=a.shadowOffsetY*e,h=a.hasStroke()?a.lineWidth:0,u=Math.max(h/2,-s+o),c=Math.max(h/2,s+o),f=Math.max(h/2,-l+o),d=Math.max(h/2,l+o),p=r.width+u+c,g=r.height+f+d;n.width=p*e,n.height=g*e,i.scale(e,e),i.clearRect(0,0,p,g),i.dpr=e;var m={position:t.position,rotation:t.rotation,scale:t.scale};t.position=[u-r.x,f-r.y],t.rotation=0,t.scale=[1,1],t.updateTransform(),t&&t.brush(i);var v=new ze({style:{x:0,y:0,image:n}});return null!=m.position&&(v.position=t.position=m.position),null!=m.rotation&&(v.rotation=t.rotation=m.rotation),null!=m.scale&&(v.scale=t.scale=m.scale),v}};var su="undefined"!=typeof window&&!!window.addEventListener,lu=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,hu=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,ih.call(this)};hu.prototype={constructor:hu,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),n=0;n<e.length;n++)this.addClip(e[n])},removeClip:function(t){var e=l(this._clips,t);e>=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),n=0;n<e.length;n++)this.removeClip(e[n]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,n=this._clips,i=n.length,r=[],a=[],o=0;o<i;o++){var s=n[o],l=s.step(t,e);l&&(r.push(l),a.push(s))}for(o=0;o<i;)n[o]._needsRemove?(n[o]=n[i-1],n.pop(),i--):o++;i=r.length;for(o=0;o<i;o++)a[o].fire(r[o]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(Zh(t),!e._paused&&e._update())}var e=this;this._running=!0,Zh(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},animate:function(t,e){var n=new Sh(t,(e=e||{}).loop,e.getter,e.setter);return this.addAnimator(n),n}},u(hu,ih);var uu=function(){this._track=[]};uu.prototype={constructor:uu,recognize:function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},a=0,o=i.length;a<o;a++){var s=i[a],l=Xe(n,s,{});r.points.push([l.zrX,l.zrY]),r.touches.push(s)}this._track.push(r)}},_recognize:function(t){for(var e in cu)if(cu.hasOwnProperty(e)){var n=cu[e](this._track,t);if(n)return n}}};var cu={pinch:function(t,e){var n=t.length;if(n){var i=(t[n-1]||{}).points,r=(t[n-2]||{}).points||i;if(r&&r.length>1&&i&&i.length>1){var a=$e(i)/$e(r);!isFinite(a)&&(a=1),e.pinchScale=a;var o=Ke(i);return e.pinchX=o[0],e.pinchY=o[1],{type:"pinch",target:t[0].target,event:e}}}}},fu=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],du=["touchstart","touchend","touchmove"],pu={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},gu=d(fu,function(t){var e=t.replace("mouse","pointer");return pu[e]?e:t}),mu={mousemove:function(t){t=Ye(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){var e=(t=Ye(this.dom,t)).toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){(t=Ye(this.dom,t)).zrByTouch=!0,this._lastTouchMoment=new Date,Je(this,t,"start"),mu.mousemove.call(this,t),mu.mousedown.call(this,t),tn(this)},touchmove:function(t){(t=Ye(this.dom,t)).zrByTouch=!0,Je(this,t,"change"),mu.mousemove.call(this,t),tn(this)},touchend:function(t){(t=Ye(this.dom,t)).zrByTouch=!0,Je(this,t,"end"),mu.mouseup.call(this,t),+new Date-this._lastTouchMoment<300&&mu.click.call(this,t),tn(this)},pointerdown:function(t){mu.mousedown.call(this,t)},pointermove:function(t){en(t)||mu.mousemove.call(this,t)},pointerup:function(t){mu.mouseup.call(this,t)},pointerout:function(t){en(t)||mu.mouseout.call(this,t)}};f(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){mu[t]=function(e){e=Ye(this.dom,e),this.trigger(t,e)}});var vu=rn.prototype;vu.dispose=function(){for(var t=fu.concat(du),e=0;e<t.length;e++){var n=t[e];je(this.dom,Qe(n),this._handlers[n])}},vu.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},u(rn,ih);var yu=!Fl.canvasSupported,_u={canvas:ou},xu=function(t,e,n){n=n||{},this.dom=e,this.id=t;var i=this,r=new Rh,a=n.renderer;if(yu){if(!_u.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");a="vml"}else a&&_u[a]||(a="canvas");var o=new _u[a](e,r,n,t);this.storage=r,this.painter=o;var s=Fl.node||Fl.worker?null:new rn(o.getViewportRoot());this.handler=new oh(r,o,s,o.root),this.animation=new hu({stage:{update:m(this.flush,this)}}),this.animation.start(),this._needsRefresh;var l=r.delFromStorage,h=r.addToStorage;r.delFromStorage=function(t){l.call(r,t),t&&t.removeSelfFromZr(i)},r.addToStorage=function(t){h.call(r,t),t.addSelfToZr(i)}};xu.prototype={constructor:xu,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer(t,e),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},flush:function(){this._needsRefresh&&this.refreshImmediately(),this._needsRefreshHover&&this.refreshHoverImmediately()},addHover:function(t,e){this.painter.addHover&&(this.painter.addHover(t,e),this.refreshHover())},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e){return this.painter.pathToImage(t,e)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},findHover:function(t,e){return this.handler.findHover(t,e)},on:function(t,e,n){this.handler.on(t,e,n)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null}};var wu=f,bu=w,Su=y,Mu="\0-",Tu=["fontStyle","fontWeight","fontSize","fontFamily","rich","tag","color","textBorderColor","textBorderWidth","width","height","lineHeight","align","verticalAlign","baseline","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY","backgroundColor","borderColor","borderWidth","borderRadius","padding"],Iu=0,Cu=".",ku="___EC__COMPONENT__CONTAINER___",Du=0,Au=function(t){for(var e=0;e<t.length;e++)t[e][1]||(t[e][1]=t[e][0]);return function(e,n,i){for(var r={},a=0;a<t.length;a++){var o=t[a][1];if(!(n&&l(n,o)>=0||i&&l(i,o)<0)){var s=e.getShallow(o);null!=s&&(r[t[a][0]]=s)}}return r}},Lu=Au([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),Pu={getLineStyle:function(t){var e=Lu(this,t),n=this.getLineDash(e.lineWidth);return n&&(e.lineDash=n),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),n=Math.max(t,2),i=4*t;return"solid"===e||null==e?null:"dashed"===e?[i,i]:[n,n]}},Ou=Au([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),Eu={getAreaStyle:function(t,e){return Ou(this,t,e)}},Bu=Math.pow,Ru=Math.sqrt,zu=1e-8,Nu=1e-4,Fu=Ru(3),Vu=1/3,Wu=N(),Hu=N(),Gu=N(),qu=Math.min,Xu=Math.max,Zu=Math.sin,Yu=Math.cos,Uu=2*Math.PI,ju=N(),$u=N(),Ku=N(),Qu=[],Ju=[],tc={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},ec=[],nc=[],ic=[],rc=[],ac=Math.min,oc=Math.max,sc=Math.cos,lc=Math.sin,hc=Math.sqrt,uc=Math.abs,cc="undefined"!=typeof Float32Array,fc=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};fc.prototype={constructor:fc,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=uc(1/Th/t)||0,this._uy=uc(1/Th/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(tc.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var n=uc(t-this._xi)>this._ux||uc(e-this._yi)>this._uy||this._len<5;return this.addData(tc.L,t,e),this._ctx&&n&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,n,i,r,a){return this.addData(tc.C,t,e,n,i,r,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,n,i,r,a):this._ctx.bezierCurveTo(t,e,n,i,r,a)),this._xi=r,this._yi=a,this},quadraticCurveTo:function(t,e,n,i){return this.addData(tc.Q,t,e,n,i),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},arc:function(t,e,n,i,r,a){return this.addData(tc.A,t,e,n,n,i,r-i,0,a?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,a),this._xi=sc(r)*n+t,this._yi=lc(r)*n+t,this},arcTo:function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},rect:function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(tc.R,t,e,n,i),this},closePath:function(){this.addData(tc.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,n=0;n<t.length;n++)e+=t[n];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length==e||!cc||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();cc&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(r=0;r<e;r++)for(var a=t[r].data,o=0;o<a.length;o++)this.data[i++]=a[o];this._len=i},addData:function(t){if(this._saveData){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var n=0;n<arguments.length;n++)e[this._len++]=arguments[n];this._prevCmd=t}},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var n,i,r=this._dashSum,a=this._dashOffset,o=this._lineDash,s=this._ctx,l=this._xi,h=this._yi,u=t-l,c=e-h,f=hc(u*u+c*c),d=l,p=h,g=o.length;for(u/=f,c/=f,a<0&&(a=r+a),d-=(a%=r)*u,p-=a*c;u>0&&d<=t||u<0&&d>=t||0==u&&(c>0&&p<=e||c<0&&p>=e);)d+=u*(n=o[i=this._dashIdx]),p+=c*n,this._dashIdx=(i+1)%g,u>0&&d<l||u<0&&d>l||c>0&&p<h||c<0&&p>h||s[i%2?"moveTo":"lineTo"](u>=0?ac(d,t):oc(d,t),c>=0?ac(p,e):oc(p,e));u=d-t,c=p-e,this._dashOffset=-hc(u*u+c*c)},_dashedBezierTo:function(t,e,n,i,r,a){var o,s,l,h,u,c=this._dashSum,f=this._dashOffset,d=this._lineDash,p=this._ctx,g=this._xi,m=this._yi,v=kn,y=0,_=this._dashIdx,x=d.length,w=0;for(f<0&&(f=c+f),f%=c,o=0;o<1;o+=.1)s=v(g,t,n,r,o+.1)-v(g,t,n,r,o),l=v(m,e,i,a,o+.1)-v(m,e,i,a,o),y+=hc(s*s+l*l);for(;_<x&&!((w+=d[_])>f);_++);for(o=(w-f)/y;o<=1;)h=v(g,t,n,r,o),u=v(m,e,i,a,o),_%2?p.moveTo(h,u):p.lineTo(h,u),o+=d[_]/y,_=(_+1)%x;_%2!=0&&p.lineTo(r,a),s=r-h,l=a-u,this._dashOffset=-hc(s*s+l*l)},_dashedQuadraticTo:function(t,e,n,i){var r=n,a=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,a)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,cc&&(this.data=new Float32Array(t)))},getBoundingRect:function(){ec[0]=ec[1]=ic[0]=ic[1]=Number.MAX_VALUE,nc[0]=nc[1]=rc[0]=rc[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,n=0,i=0,r=0,a=0;a<t.length;){var o=t[a++];switch(1==a&&(i=e=t[a],r=n=t[a+1]),o){case tc.M:e=i=t[a++],n=r=t[a++],ic[0]=i,ic[1]=r,rc[0]=i,rc[1]=r;break;case tc.L:Vn(e,n,t[a],t[a+1],ic,rc),e=t[a++],n=t[a++];break;case tc.C:Wn(e,n,t[a++],t[a++],t[a++],t[a++],t[a],t[a+1],ic,rc),e=t[a++],n=t[a++];break;case tc.Q:Hn(e,n,t[a++],t[a++],t[a],t[a+1],ic,rc),e=t[a++],n=t[a++];break;case tc.A:var s=t[a++],l=t[a++],h=t[a++],u=t[a++],c=t[a++],f=t[a++]+c,d=(t[a++],1-t[a++]);1==a&&(i=sc(c)*h+s,r=lc(c)*u+l),Gn(s,l,h,u,c,f,d,ic,rc),e=sc(f)*h+s,n=lc(f)*u+l;break;case tc.R:Vn(i=e=t[a++],r=n=t[a++],i+t[a++],r+t[a++],ic,rc);break;case tc.Z:e=i,n=r}U(ec,ec,ic),j(nc,nc,rc)}return 0===a&&(ec[0]=ec[1]=nc[0]=nc[1]=0),new Rt(ec[0],ec[1],nc[0]-ec[0],nc[1]-ec[1])},rebuildPath:function(t){for(var e,n,i,r,a,o,s=this.data,l=this._ux,h=this._uy,u=this._len,c=0;c<u;){var f=s[c++];switch(1==c&&(e=i=s[c],n=r=s[c+1]),f){case tc.M:e=i=s[c++],n=r=s[c++],t.moveTo(i,r);break;case tc.L:a=s[c++],o=s[c++],(uc(a-i)>l||uc(o-r)>h||c===u-1)&&(t.lineTo(a,o),i=a,r=o);break;case tc.C:t.bezierCurveTo(s[c++],s[c++],s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case tc.Q:t.quadraticCurveTo(s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case tc.A:var d=s[c++],p=s[c++],g=s[c++],m=s[c++],v=s[c++],y=s[c++],_=s[c++],x=s[c++],w=g>m?g:m,b=g>m?1:g/m,S=g>m?m/g:1,M=v+y;Math.abs(g-m)>.001?(t.translate(d,p),t.rotate(_),t.scale(b,S),t.arc(0,0,w,v,M,1-x),t.scale(1/b,1/S),t.rotate(-_),t.translate(-d,-p)):t.arc(d,p,w,v,M,1-x),1==c&&(e=sc(v)*g+d,n=lc(v)*m+p),i=sc(M)*g+d,r=lc(M)*m+p;break;case tc.R:e=i=s[c],n=r=s[c+1],t.rect(s[c++],s[c++],s[c++],s[c++]);break;case tc.Z:t.closePath(),i=e,r=n}}}},fc.CMD=tc;var dc=2*Math.PI,pc=2*Math.PI,gc=fc.CMD,mc=2*Math.PI,vc=1e-4,yc=[-1,-1,-1],_c=[-1,-1],xc=qh.prototype.getCanvasPattern,wc=Math.abs,bc=new fc(!0);ri.prototype={constructor:ri,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var n=this.style,i=this.path||bc,r=n.hasStroke(),a=n.hasFill(),o=n.fill,s=n.stroke,l=a&&!!o.colorStops,h=r&&!!s.colorStops,u=a&&!!o.image,c=r&&!!s.image;if(n.bind(t,this,e),this.setTransform(t),this.__dirty){var f;l&&(f=f||this.getBoundingRect(),this._fillGradient=n.getGradient(t,o,f)),h&&(f=f||this.getBoundingRect(),this._strokeGradient=n.getGradient(t,s,f))}l?t.fillStyle=this._fillGradient:u&&(t.fillStyle=xc.call(o,t)),h?t.strokeStyle=this._strokeGradient:c&&(t.strokeStyle=xc.call(s,t));var d=n.lineDash,p=n.lineDashOffset,g=!!t.setLineDash,m=this.getGlobalScale();i.setScale(m[0],m[1]),this.__dirtyPath||d&&!g&&r?(i.beginPath(t),d&&!g&&(i.setLineDash(d),i.setLineDashOffset(p)),this.buildPath(i,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),a&&i.fill(t),d&&g&&(t.setLineDash(d),t.lineDashOffset=p),r&&i.stroke(t),d&&g&&t.setLineDash([]),null!=n.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))},buildPath:function(t,e,n){},createPathProxy:function(){this.path=new fc},getBoundingRect:function(){var t=this._rect,e=this.style,n=!t;if(n){var i=this.path;i||(i=this.path=new fc),this.__dirtyPath&&(i.beginPath(),this.buildPath(i,this.shape,!1)),t=i.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||n){r.copy(t);var a=e.lineWidth,o=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(a=Math.max(a,this.strokeContainThreshold||4)),o>1e-10&&(r.width+=a/o,r.height+=a/o,r.x-=a/o/2,r.y-=a/o/2)}return r}return t},contain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var a=this.path.data;if(r.hasStroke()){var o=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(r.hasFill()||(o=Math.max(o,this.strokeContainThreshold)),ii(a,o/s,t,e)))return!0}if(r.hasFill())return ni(a,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):Re.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var n=this.shape;if(n){if(w(t))for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);else n[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&wc(t[0]-1)>1e-10&&wc(t[3]-1)>1e-10?Math.sqrt(wc(t[0]*t[3]-t[2]*t[1])):1}},ri.extend=function(t){var e=function(e){ri.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var n=t.shape;if(n){this.shape=this.shape||{};var i=this.shape;for(var r in n)!i.hasOwnProperty(r)&&n.hasOwnProperty(r)&&(i[r]=n[r])}t.init&&t.init.call(this,e)};h(e,ri);for(var n in t)"style"!==n&&"shape"!==n&&(e.prototype[n]=t[n]);return e},h(ri,Re);var Sc=fc.CMD,Mc=[[],[],[]],Tc=Math.sqrt,Ic=Math.atan2,Cc=function(t,e){var n,i,r,a,o,s,l=t.data,h=Sc.M,u=Sc.C,c=Sc.L,f=Sc.R,d=Sc.A,p=Sc.Q;for(r=0,a=0;r<l.length;){switch(n=l[r++],a=r,i=0,n){case h:case c:i=1;break;case u:i=3;break;case p:i=2;break;case d:var g=e[4],m=e[5],v=Tc(e[0]*e[0]+e[1]*e[1]),y=Tc(e[2]*e[2]+e[3]*e[3]),_=Ic(-e[1]/y,e[0]/v);l[r]*=v,l[r++]+=g,l[r]*=y,l[r++]+=m,l[r++]*=v,l[r++]*=y,l[r++]+=_,l[r++]+=_,a=r+=2;break;case f:s[0]=l[r++],s[1]=l[r++],Y(s,s,e),l[a++]=s[0],l[a++]=s[1],s[0]+=l[r++],s[1]+=l[r++],Y(s,s,e),l[a++]=s[0],l[a++]=s[1]}for(o=0;o<i;o++)(s=Mc[o])[0]=l[r++],s[1]=l[r++],Y(s,s,e),l[a++]=s[0],l[a++]=s[1]}},kc=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"],Dc=Math.sqrt,Ac=Math.sin,Lc=Math.cos,Pc=Math.PI,Oc=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},Ec=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(Oc(t)*Oc(e))},Bc=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(Ec(t,e))},Rc=function(t){Re.call(this,t)};Rc.prototype={constructor:Rc,type:"text",brush:function(t,e){var n=this.style;this.__dirty&&ye(n),n.fill=n.stroke=n.shadowBlur=n.shadowColor=n.shadowOffsetX=n.shadowOffsetY=null;var i=n.text;null!=i&&(i+=""),n.bind(t,this,e),Be(i,n)&&(this.setTransform(t),xe(this,t,i,n),this.restoreTransform(t))},getBoundingRect:function(){var t=this.style;if(this.__dirty&&ye(t),!this._rect){var e=t.text;null!=e?e+="":e="";var n=ee(t.text+"",t.font,t.textAlign,t.textVerticalAlign,t.textPadding,t.rich);if(n.x+=t.x||0,n.y+=t.y||0,Le(t.textStroke,t.textStrokeWidth)){var i=t.textStrokeWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect}},h(Rc,Re);var zc=ri.extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,n){n&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}}),Nc=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]],Fc=function(t){return Fl.browser.ie&&Fl.browser.version>=11?function(){var e,n=this.__clipPaths,i=this.style;if(n)for(var r=0;r<n.length;r++){var a=n[r],o=a&&a.shape,s=a&&a.type;if(o&&("sector"===s&&o.startAngle===o.endAngle||"rect"===s&&(!o.width||!o.height))){for(l=0;l<Nc.length;l++)Nc[l][2]=i[Nc[l][0]],i[Nc[l][0]]=Nc[l][1];e=!0;break}}if(t.apply(this,arguments),e)for(var l=0;l<Nc.length;l++)i[Nc[l][0]]=Nc[l][2]}:t},Vc=ri.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:Fc(ri.prototype.brush),buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),a=Math.max(e.r,0),o=e.startAngle,s=e.endAngle,l=e.clockwise,h=Math.cos(o),u=Math.sin(o);t.moveTo(h*r+n,u*r+i),t.lineTo(h*a+n,u*a+i),t.arc(n,i,a,o,s,!l),t.lineTo(Math.cos(s)*r+n,Math.sin(s)*r+i),0!==r&&t.arc(n,i,r,s,o,l),t.closePath()}}),Wc=ri.extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)}}),Hc=function(t,e){for(var n=t.length,i=[],r=0,a=1;a<n;a++)r+=Z(t[a-1],t[a]);var o=r/2;o=o<n?n:o;for(a=0;a<o;a++){var s,l,h,u=a/(o-1)*(e?n:n-1),c=Math.floor(u),f=u-c,d=t[c%n];e?(s=t[(c-1+n)%n],l=t[(c+1)%n],h=t[(c+2)%n]):(s=t[0===c?c:c-1],l=t[c>n-2?n-1:c+1],h=t[c>n-3?n-1:c+2]);var p=f*f,g=f*p;i.push([ui(s[0],d[0],l[0],h[0],f,p,g),ui(s[1],d[1],l[1],h[1],f,p,g)])}return i},Gc=function(t,e,n,i){var r,a,o,s,l=[],h=[],u=[],c=[];if(i){o=[1/0,1/0],s=[-1/0,-1/0];for(var f=0,d=t.length;f<d;f++)U(o,o,t[f]),j(s,s,t[f]);U(o,o,i[0]),j(s,s,i[1])}for(var f=0,d=t.length;f<d;f++){var p=t[f];if(n)r=t[f?f-1:d-1],a=t[(f+1)%d];else{if(0===f||f===d-1){l.push(F(t[f]));continue}r=t[f-1],a=t[f+1]}W(h,a,r),q(h,h,e);var g=Z(p,r),m=Z(p,a),v=g+m;0!==v&&(g/=v,m/=v),q(u,h,-g),q(c,h,m);var y=V([],p,u),_=V([],p,c);i&&(j(y,y,o),U(y,y,s),j(_,_,o),U(_,_,s)),l.push(y),l.push(_)}return n&&l.push(l.shift()),l},qc=ri.extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){ci(t,e,!0)}}),Xc=ri.extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){ci(t,e,!1)}}),Zc=ri.extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width,a=e.height;e.r?ve(t,e):t.rect(n,i,r,a),t.closePath()}}),Yc=ri.extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,a=e.y2,o=e.percent;0!==o&&(t.moveTo(n,i),o<1&&(r=n*(1-o)+r*o,a=i*(1-o)+a*o),t.lineTo(r,a))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}}),Uc=[],jc=ri.extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,a=e.y2,o=e.cpx1,s=e.cpy1,l=e.cpx2,h=e.cpy2,u=e.percent;0!==u&&(t.moveTo(n,i),null==l||null==h?(u<1&&(Nn(n,o,r,u,Uc),o=Uc[1],r=Uc[2],Nn(i,s,a,u,Uc),s=Uc[1],a=Uc[2]),t.quadraticCurveTo(o,s,r,a)):(u<1&&(Pn(n,o,l,r,u,Uc),o=Uc[1],l=Uc[2],r=Uc[3],Pn(i,s,h,a,u,Uc),s=Uc[1],h=Uc[2],a=Uc[3]),t.bezierCurveTo(o,s,l,h,r,a)))},pointAt:function(t){return fi(this.shape,t,!1)},tangentAt:function(t){var e=fi(this.shape,t,!0);return X(e,e)}}),$c=ri.extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),a=e.startAngle,o=e.endAngle,s=e.clockwise,l=Math.cos(a),h=Math.sin(a);t.moveTo(l*r+n,h*r+i),t.arc(n,i,r,a,o,!s)}}),Kc=ri.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,n=0;n<e.length;n++)t=t||e[n].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1])},buildPath:function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},afterBrush:function(){for(var t=this.shape.paths||[],e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),ri.prototype.getBoundingRect.call(this)}}),Qc=function(t){this.colorStops=t||[]};Qc.prototype={constructor:Qc,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}};var Jc=function(t,e,n,i,r,a){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==n?1:n,this.y2=null==i?0:i,this.type="linear",this.global=a||!1,Qc.call(this,r)};Jc.prototype={constructor:Jc},h(Jc,Qc);var tf=function(t,e,n,i,r){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==n?.5:n,this.type="radial",this.global=r||!1,Qc.call(this,i)};tf.prototype={constructor:tf},h(tf,Qc),di.prototype.incremental=!0,di.prototype.clearDisplaybles=function(){this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.dirty(),this.notClear=!1},di.prototype.addDisplayable=function(t,e){e?this._temporaryDisplayables.push(t):this._displayables.push(t),this.dirty()},di.prototype.addDisplayables=function(t,e){e=e||!1;for(var n=0;n<t.length;n++)this.addDisplayable(t[n],e)},di.prototype.eachPendingDisplayable=function(t){for(e=this._cursor;e<this._displayables.length;e++)t&&t(this._displayables[e]);for(var e=0;e<this._temporaryDisplayables.length;e++)t&&t(this._temporaryDisplayables[e])},di.prototype.update=function(){this.updateTransform();for(t=this._cursor;t<this._displayables.length;t++)(e=this._displayables[t]).parent=this,e.update(),e.parent=null;for(var t=0;t<this._temporaryDisplayables.length;t++){var e=this._temporaryDisplayables[t];e.parent=this,e.update(),e.parent=null}},di.prototype.brush=function(t,e){for(n=this._cursor;n<this._displayables.length;n++)(i=this._temporaryDisplayables[n]).beforeBrush&&i.beforeBrush(t),i.brush(t,n===this._cursor?null:this._displayables[n-1]),i.afterBrush&&i.afterBrush(t);this._cursor=n;for(var n=0;n<this._temporaryDisplayables.length;n++){var i=this._temporaryDisplayables[n];i.beforeBrush&&i.beforeBrush(t),i.brush(t,0===n?null:this._temporaryDisplayables[n-1]),i.afterBrush&&i.afterBrush(t)}this._temporaryDisplayables=[],this.notClear=!0};var ef=[];di.prototype.getBoundingRect=function(){if(!this._rect){for(var t=new Rt(1/0,1/0,-1/0,-1/0),e=0;e<this._displayables.length;e++){var n=this._displayables[e],i=n.getBoundingRect().clone();n.needLocalTransform()&&i.applyTransform(n.getLocalTransform(ef)),t.union(i)}this._rect=t}return this._rect},di.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e);if(this.getBoundingRect().contain(n[0],n[1]))for(var i=0;i<this._displayables.length;i++)if(this._displayables[i].contain(t,e))return!0;return!1},h(di,Re);var nf=Math.round,rf=Math.max,af=Math.min,of={},sf=(Object.freeze||Object)({extendShape:pi,extendPath:function(t,e){return hi(t,e)},makePath:gi,makeImage:mi,mergePath:function(t,e){for(var n=[],i=t.length,r=0;r<i;r++){var a=t[r];a.path||a.createPathProxy(),a.__dirtyPath&&a.buildPath(a.path,a.shape,!0),n.push(a.path)}var o=new ri(e);return o.createPathProxy(),o.buildPath=function(t){t.appendPath(n);var e=t.getContext();e&&t.rebuildPath(e)},o},resizePath:yi,subPixelOptimizeLine:_i,subPixelOptimizeRect:function(t){var e=t.shape,n=t.style.lineWidth,i=e.x,r=e.y,a=e.width,o=e.height;return e.x=xi(e.x,n,!0),e.y=xi(e.y,n,!0),e.width=Math.max(xi(i+a,n,!1)-e.x,0===a?0:1),e.height=Math.max(xi(r+o,n,!1)-e.y,0===o?0:1),t},subPixelOptimize:xi,setHoverStyle:Oi,setLabelStyle:Ei,setTextStyle:Bi,setText:function(t,e,n){var i,r={isRectText:!0};!1===n?i=!0:r.autoColor=n,Ri(t,e,r,i),t.host&&t.host.dirty&&t.host.dirty(!1)},getFont:Hi,updateProps:qi,initProps:Xi,getTransform:function(t,e){for(var n=nt([]);t&&t!==e;)rt(n,t.getLocalTransform(),n),t=t.parent;return n},applyTransform:Zi,transformDirection:function(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return a=Zi(a,e,n),Math.abs(a[0])>Math.abs(a[1])?a[0]>0?"right":"left":a[1]>0?"bottom":"top"},groupTransition:Yi,clipPointsByRect:function(t,e){return d(t,function(t){var n=t[0];n=rf(n,e.x),n=af(n,e.x+e.width);var i=t[1];return i=rf(i,e.y),i=af(i,e.y+e.height),[n,i]})},clipRectByRect:function(t,e){var n=rf(t.x,e.x),i=af(t.x+t.width,e.x+e.width),r=rf(t.y,e.y),a=af(t.y+t.height,e.y+e.height);if(i>=n&&a>=r)return{x:n,y:r,width:i-n,height:a-r}},createIcon:function(t,e,n){var i=(e=a({rectHover:!0},e)).style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(i.image=t.slice(8),o(i,n),new ze(e)):gi(t.replace("path://",""),e,n,"center")},Group:Oh,Image:ze,Text:Rc,Circle:zc,Sector:Vc,Ring:Wc,Polygon:qc,Polyline:Xc,Rect:Zc,Line:Yc,BezierCurve:jc,Arc:$c,IncrementalDisplayable:di,CompoundPath:Kc,LinearGradient:Jc,RadialGradient:tf,BoundingRect:Rt}),lf=["textStyle","color"],hf={getTextColor:function(t){var e=this.ecModel;return this.getShallow("color")||(!t&&e?e.get(lf):null)},getFont:function(){return Hi({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},getTextRect:function(t){return ee(t,this.getFont(),this.getShallow("align"),this.getShallow("verticalAlign")||this.getShallow("baseline"),this.getShallow("padding"),this.getShallow("rich"),this.getShallow("truncateText"))}},uf=Au([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]),cf={getItemStyle:function(t,e){var n=uf(this,t,e),i=this.getBorderLineDash();return i&&(n.lineDash=i),n},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}},ff=u,df=pn();Ui.prototype={constructor:Ui,init:null,mergeOption:function(t){i(this.option,t,!0)},get:function(t,e){return null==t?this.option:ji(this.option,this.parsePath(t),!e&&$i(this,t))},getShallow:function(t,e){var n=this.option,i=null==n?n:n[t],r=!e&&$i(this,t);return null==i&&r&&(i=r.getShallow(t)),i},getModel:function(t,e){var n,i=null==t?this.option:ji(this.option,t=this.parsePath(t));return e=e||(n=$i(this,t))&&n.getModel(t),new Ui(i,e,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){return new(0,this.constructor)(n(this.option))},setReadOnly:function(t){},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){df(this).getParent=t},isAnimationEnabled:function(){if(!Fl.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},wn(Ui),bn(Ui),ff(Ui,Pu),ff(Ui,Eu),ff(Ui,hf),ff(Ui,cf);var pf=0,gf=1e-4,mf=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/,vf=A,yf=["a","b","c","d","e","f","g"],_f=function(t,e){return"{"+t+(null==e?"":e)+"}"},xf=function(t){return t<10?"0"+t:t},wf=se,bf=f,Sf=["left","right","top","bottom","width","height"],Mf=[["width","left","right"],["height","top","bottom"]],Tf=(v(mr,"vertical"),v(mr,"horizontal"),{getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}),If=pn(),Cf=Ui.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,n,i){Ui.call(this,t,e,n,i),this.uid=Ki("ec_cpt_model")},init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,r=n?_r(t):{};i(t,e.getTheme().get(this.mainType)),i(t,this.getDefaultOption()),n&&yr(t,r,n)},mergeOption:function(t,e){i(this.option,t,!0);var n=this.layoutMode;n&&yr(this.option,t,n)},optionUpdated:function(t,e){},getDefaultOption:function(){var t=If(this);if(!t.defaultOption){for(var e=[],n=this.constructor;n;){var r=n.prototype.defaultOption;r&&e.push(r),n=n.superClass}for(var a={},o=e.length-1;o>=0;o--)a=i(a,e[o],!0);t.defaultOption=a}return t.defaultOption},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});Tn(Cf,{registerWhenExtend:!0}),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){t=_n(t),e[t.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var a=_n(n).main;t.hasSubTypes(n)&&e[a]&&(r=e[a](i))}return r}}(Cf),function(t,e){function n(t){var n={},a=[];return f(t,function(o){var s=i(n,o),h=r(s.originalDeps=e(o),t);s.entryCount=h.length,0===s.entryCount&&a.push(o),f(h,function(t){l(s.predecessor,t)<0&&s.predecessor.push(t);var e=i(n,t);l(e.successor,t)<0&&e.successor.push(o)})}),{graph:n,noEntryList:a}}function i(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function r(t,e){var n=[];return f(t,function(t){l(e,t)>=0&&n.push(t)}),n}t.topologicalTravel=function(t,e,i,r){function a(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}if(t.length){var o=n(e),s=o.graph,l=o.noEntryList,h={};for(f(t,function(t){h[t]=!0});l.length;){var u=l.pop(),c=s[u],d=!!h[u];d&&(i.call(r,u,c.originalDeps.slice()),delete h[u]),f(c.successor,d?function(t){h[t]=!0,a(t)}:a)}f(h,function(){throw new Error("Circle dependency may exists")})}}}(Cf,function(t){var e=[];return f(Cf.getClassesByMainType(t),function(t){e=e.concat(t.prototype.dependencies||[])}),e=d(e,function(t){return _n(t).main}),"dataset"!==t&&l(e,"dataset")<=0&&e.unshift("dataset"),e}),u(Cf,Tf);var kf="";"undefined"!=typeof navigator&&(kf=navigator.platform||"");var Df={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],gradientColor:["#f6efa6","#d88273","#bf444c"],textStyle:{fontFamily:kf.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},Af=pn(),Lf={clearColorPalette:function(){Af(this).colorIdx=0,Af(this).colorNameMap={}},getColorFromPalette:function(t,e,n){var i=Af(e=e||this),r=i.colorIdx||0,a=i.colorNameMap=i.colorNameMap||{};if(a.hasOwnProperty(t))return a[t];var o=on(this.get("color",!0)),s=this.get("colorLayer",!0),l=null!=n&&s?wr(s,n):o;if((l=l||o)&&l.length){var h=l[r];return t&&(a[t]=h),i.colorIdx=(r+1)%l.length,h}}},Pf={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis")[0],a=t.getReferringComponents("yAxis")[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",a),Sr(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),Sr(a)&&(i.set("y",a),e.firstCategoryDimIndex=1)},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis")[0];e.coordSysDims=["single"],n.set("single",r),Sr(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar")[0],a=r.findAxisModel("radiusAxis"),o=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",a),n.set("angle",o),Sr(a)&&(i.set("radius",a),e.firstCategoryDimIndex=0),Sr(o)&&(i.set("angle",o),e.firstCategoryDimIndex=1)},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,a=r.getComponent("parallel",t.get("parallelIndex")),o=e.coordSysDims=a.dimensions.slice();f(a.parallelAxisIndex,function(t,a){var s=r.getComponent("parallelAxis",t),l=o[a];n.set(l,s),Sr(s)&&null==e.firstCategoryDimIndex&&(i.set(l,s),e.firstCategoryDimIndex=a)})}},Of="original",Ef="arrayRows",Bf="objectRows",Rf="keyedColumns",zf="unknown",Nf="typedArray",Ff="column",Vf="row";Mr.seriesDataToSource=function(t){return new Mr({data:t,sourceFormat:S(t)?Nf:Of,fromDataset:!1})},bn(Mr);var Wf=pn(),Hf="\0_ec_inner",Gf=Ui.extend({constructor:Gf,init:function(t,e,n,i){n=n||{},this.option=null,this._theme=new Ui(n),this._optionManager=i},setOption:function(t,e){L(!(Hf in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null)},resetOption:function(t){var e=!1,n=this._optionManager;if(!t||"recreate"===t){var i=n.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(i)):Fr.call(this,i),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var r=n.getTimelineOption(this);r&&(this.mergeOption(r),e=!0)}if(!t||"recreate"===t||"media"===t){var a=n.getMediaOption(this,this._api);a.length&&f(a,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){var e=this.option,r=this._componentsMap,o=[];Cr(this),f(t,function(t,r){null!=t&&(Cf.hasClass(r)?r&&o.push(r):e[r]=null==e[r]?n(t):i(e[r],t,!0))}),Cf.topologicalTravel(o,Cf.getAllClassMainTypes(),function(n,i){var o=on(t[n]),s=un(r.get(n),o);cn(s),f(s,function(t,e){var i=t.option;w(i)&&(t.keyInfo.mainType=n,t.keyInfo.subType=Wr(n,i,t.exist))});var l=Vr(r,i);e[n]=[],r.set(n,[]),f(s,function(t,i){var o=t.exist,s=t.option;if(L(w(s)||o,"Empty component definition"),s){var h=Cf.getClass(n,t.keyInfo.subType,!0);if(o&&o instanceof h)o.name=t.keyInfo.name,o.mergeOption(s,this),o.optionUpdated(s,!1);else{var u=a({dependentModels:l,componentIndex:i},t.keyInfo);a(o=new h(s,this,this,u),u),o.init(s,this,this,u),o.optionUpdated(null,!0)}}else o.mergeOption({},this),o.optionUpdated({},!1);r.get(n)[i]=o,e[n][i]=o.option},this),"series"===n&&Hr(this,r.get("series"))},this),this._seriesIndicesMap=R(this._seriesIndices=this._seriesIndices||[])},getOption:function(){var t=n(this.option);return f(t,function(e,n){if(Cf.hasClass(n)){for(var i=(e=on(e)).length-1;i>=0;i--)fn(e[i])&&e.splice(i,1);t[n]=e}}),delete t[Hf],t},getTheme:function(){return this._theme},getComponent:function(t,e){var n=this._componentsMap.get(t);if(n)return n[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var n=t.index,i=t.id,r=t.name,a=this._componentsMap.get(e);if(!a||!a.length)return[];var o;if(null!=n)y(n)||(n=[n]),o=g(d(n,function(t){return a[t]}),function(t){return!!t});else if(null!=i){var s=y(i);o=g(a,function(t){return s&&l(i,t.id)>=0||!s&&t.id===i})}else if(null!=r){var h=y(r);o=g(a,function(t){return h&&l(r,t.name)>=0||!h&&t.name===r})}else o=a.slice();return Gr(o,t)},findComponents:function(t){var e=t.query,n=t.mainType,i=function(t){var e=n+"Index",i=n+"Id",r=n+"Name";return!t||null==t[e]&&null==t[i]&&null==t[r]?null:{mainType:n,index:t[e],id:t[i],name:t[r]}}(e);return function(e){return t.filter?g(e,t.filter):e}(Gr(i?this.queryComponents(i):this._componentsMap.get(n),t))},eachComponent:function(t,e,n){var i=this._componentsMap;"function"==typeof t?(n=e,e=t,i.each(function(t,i){f(t,function(t,r){e.call(n,i,t,r)})})):x(t)?f(i.get(t),e,n):w(t)&&f(this.findComponents(t),e,n)},getSeriesByName:function(t){return g(this._componentsMap.get("series"),function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.get("series")[t]},getSeriesByType:function(t){return g(this._componentsMap.get("series"),function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.get("series").slice()},getSeriesCount:function(){return this._componentsMap.get("series").length},eachSeries:function(t,e){f(this._seriesIndices,function(n){var i=this._componentsMap.get("series")[n];t.call(e,i,n)},this)},eachRawSeries:function(t,e){f(this._componentsMap.get("series"),t,e)},eachSeriesByType:function(t,e,n){f(this._seriesIndices,function(i){var r=this._componentsMap.get("series")[i];r.subType===t&&e.call(n,r,i)},this)},eachRawSeriesByType:function(t,e,n){return f(this.getSeriesByType(t),e,n)},isSeriesFiltered:function(t){return null==this._seriesIndicesMap.get(t.componentIndex)},getCurrentSeriesIndices:function(){return(this._seriesIndices||[]).slice()},filterSeries:function(t,e){Hr(this,g(this._componentsMap.get("series"),t,e))},restoreData:function(t){var e=this._componentsMap;Hr(this,e.get("series"));var n=[];e.each(function(t,e){n.push(e)}),Cf.topologicalTravel(n,Cf.getAllClassMainTypes(),function(n,i){f(e.get(n),function(e){("series"!==n||!zr(e,t))&&e.restoreData()})})}});u(Gf,Lf);var qf=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"],Xf={};Xr.prototype={constructor:Xr,create:function(t,e){var n=[];f(Xf,function(i,r){var a=i.create(t,e);n=n.concat(a||[])}),this._coordinateSystems=n},update:function(t,e){f(this._coordinateSystems,function(n){n.update&&n.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},Xr.register=function(t,e){Xf[t]=e},Xr.get=function(t){return Xf[t]};var Zf=f,Yf=n,Uf=d,jf=i,$f=/^(min|max)?(.+)$/;Zr.prototype={constructor:Zr,setOption:function(t,e){t&&f(on(t.series),function(t){t&&t.data&&S(t.data)&&O(t.data)}),t=Yf(t,!0);var n=this._optionBackup,i=Yr.call(this,t,e,!n);this._newBaseOption=i.baseOption,n?(Kr(n.baseOption,i.baseOption),i.timelineOptions.length&&(n.timelineOptions=i.timelineOptions),i.mediaList.length&&(n.mediaList=i.mediaList),i.mediaDefault&&(n.mediaDefault=i.mediaDefault)):this._optionBackup=i},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=Uf(e.timelineOptions,Yf),this._mediaList=Uf(e.mediaList,Yf),this._mediaDefault=Yf(e.mediaDefault),this._currentMediaIndices=[],Yf(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=Yf(n[i.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,r=this._mediaDefault,a=[],o=[];if(!i.length&&!r)return o;for(var s=0,l=i.length;s<l;s++)Ur(i[s].query,e,n)&&a.push(s);return!a.length&&r&&(a=[-1]),a.length&&!$r(a,this._currentMediaIndices)&&(o=Uf(a,function(t){return Yf(-1===t?r.option:i[t].option)})),this._currentMediaIndices=a,o}};var Kf=f,Qf=w,Jf=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"],td=function(t,e){Kf(ra(t.series),function(t){Qf(t)&&ia(t)});var n=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","parallelAxis","radar"];e&&n.push("valueAxis","categoryAxis","logAxis","timeAxis"),Kf(n,function(e){Kf(ra(t[e]),function(t){t&&(ea(t,"axisLabel"),ea(t.axisPointer,"label"))})}),Kf(ra(t.parallel),function(t){var e=t&&t.parallelAxisDefault;ea(e,"axisLabel"),ea(e&&e.axisPointer,"label")}),Kf(ra(t.calendar),function(t){Jr(t,"itemStyle"),ea(t,"dayLabel"),ea(t,"monthLabel"),ea(t,"yearLabel")}),Kf(ra(t.radar),function(t){ea(t,"name")}),Kf(ra(t.geo),function(t){Qf(t)&&(na(t),Kf(ra(t.regions),function(t){na(t)}))}),Kf(ra(t.timeline),function(t){na(t),Jr(t,"label"),Jr(t,"itemStyle"),Jr(t,"controlStyle",!0),Jr(t,"checkpointStyle");var e=t.data;y(e)&&f(e,function(t){w(t)&&(Jr(t,"label"),Jr(t,"itemStyle"))})}),Kf(ra(t.toolbox),function(t){Jr(t,"iconStyle"),Kf(t.feature,function(t){Jr(t,"iconStyle")})}),ea(aa(t.axisPointer),"label"),ea(aa(t.tooltip).axisPointer,"label")},ed=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],nd=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],id=function(t,e){td(t,e),t.series=on(t.series),f(t.series,function(t){if(w(t)){var e=t.type;if("pie"!==e&&"gauge"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var n=oa(t,"pointer.color");null!=n&&sa(t,"itemStyle.normal.color",n)}la(t)}}),t.dataRange&&(t.visualMap=t.dataRange),f(nd,function(e){var n=t[e];n&&(y(n)||(n=[n]),f(n,function(t){la(t)}))})},rd=ha.prototype;rd.pure=!1,rd.persistent=!0,rd.getSource=function(){return this._source};var ad={arrayRows_column:{pure:!0,count:function(){return Math.max(0,this._data.length-this._source.startIndex)},getItem:function(t){return this._data[t+this._source.startIndex]},appendData:fa},arrayRows_row:{pure:!0,count:function(){var t=this._data[0];return t?Math.max(0,t.length-this._source.startIndex):0},getItem:function(t){t+=this._source.startIndex;for(var e=[],n=this._data,i=0;i<n.length;i++){var r=n[i];e.push(r?r[t]:null)}return e},appendData:function(){throw new Error('Do not support appendData when set seriesLayoutBy: "row".')}},objectRows:{pure:!0,count:ua,getItem:ca,appendData:fa},keyedColumns:{pure:!0,count:function(){var t=this._source.dimensionsDefine[0].name,e=this._data[t];return e?e.length:0},getItem:function(t){for(var e=[],n=this._source.dimensionsDefine,i=0;i<n.length;i++){var r=this._data[n[i].name];e.push(r?r[t]:null)}return e},appendData:function(t){var e=this._data;f(t,function(t,n){for(var i=e[n]||(e[n]=[]),r=0;r<(t||[]).length;r++)i.push(t[r])})}},original:{count:ua,getItem:ca,appendData:fa},typedArray:{persistent:!1,pure:!0,count:function(){return this._data?this._data.length/this._dimSize:0},getItem:function(t){t-=this._offset;for(var e=[],n=this._dimSize*t,i=0;i<this._dimSize;i++)e[i]=this._data[n+i];return e},appendData:function(t){this._data=t},clean:function(){this._offset+=this.count(),this._data=null}}},od={arrayRows:da,objectRows:function(t,e,n,i){return null!=n?t[i]:t},keyedColumns:da,original:function(t,e,n,i){var r=ln(t);return null!=n&&r instanceof Array?r[n]:r},typedArray:da},sd={arrayRows:pa,objectRows:function(t,e,n,i){return ga(t[e],this._dimensionInfos[e])},keyedColumns:pa,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return!this._rawData.pure&&hn(t)&&(this.hasItemOption=!0),ga(r instanceof Array?r[i]:r,this._dimensionInfos[e])},typedArray:function(t,e,n,i){return t[i]}},ld=/\{@(.+?)\}/g,hd={getDataParams:function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),r=n.getRawIndex(t),a=n.getName(t,!0),o=n.getRawDataItem(t),s=n.getItemVisual(t,"color");return{componentType:this.mainType,componentSubType:this.subType,seriesType:"series"===this.mainType?this.subType:null,seriesIndex:this.seriesIndex,seriesId:this.id,seriesName:this.name,name:a,dataIndex:r,data:o,dataType:e,value:i,color:s,marker:pr(s),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,n,i,r){e=e||"normal";var a=this.getData(n),o=a.getItemModel(t),s=this.getDataParams(t,n);null!=i&&s.value instanceof Array&&(s.value=s.value[i]);var l=o.get("normal"===e?[r||"label","formatter"]:[e,r||"label","formatter"]);return"function"==typeof l?(s.status=e,l(s)):"string"==typeof l?dr(l,s).replace(ld,function(e,n){var i=n.length;return"["===n.charAt(0)&&"]"===n.charAt(i-1)&&(n=+n.slice(1,i-1)),ma(a,t,n)}):void 0},getRawValue:function(t,e){return ma(this.getData(e),t)},formatTooltip:function(){}},ud=_a.prototype;ud.perform=function(t){var e=this._upstream,n=t&&t.skip;if(this._dirty&&e){var i=this.context;i.data=i.outputData=e.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this);var r;this._plan&&!n&&(r=this._plan(this.context)),(this._dirty||"reset"===r)&&(this._dirty=!1,xa(this,n));var a=t&&t.step;if(this._dueEnd=e?e._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var o=this._dueIndex,s=Math.min(null!=a?this._dueIndex+a:1/0,this._dueEnd);!n&&o<s&&this._progress({start:o,end:s},this.context),this._dueIndex=s;var l=null!=this._settedOutputEnd?this._settedOutputEnd:s;this._outputDueEnd=l}else this._dueIndex=this._outputDueEnd=null!=this._settedOutputEnd?this._settedOutputEnd:this._dueEnd;return this.unfinished()},ud.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},ud.unfinished=function(){return this._progress&&this._dueIndex<this._dueEnd},ud.pipe=function(t){(this._downstream!==t||this._dirty)&&(this._downstream=t,t._upstream=this,t.dirty())},ud.dispose=function(){this._disposed||(this._upstream&&(this._upstream._downstream=null),this._downstream&&(this._downstream._upstream=null),this._dirty=!1,this._disposed=!0)},ud.getUpstream=function(){return this._upstream},ud.getDownstream=function(){return this._downstream},ud.setOutputEnd=function(t){this._outputDueEnd=this._settedOutputEnd=t};var cd=pn(),fd=Cf.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.color",layoutMode:null,init:function(t,e,n,i){this.seriesIndex=this.componentIndex,this.dataTask=ya({count:Sa,reset:Ma}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),kr(this);var r=this.getInitialData(t,n);Ia(r,this),this.dataTask.context.data=r,cd(this).dataBeforeProcessed=r,wa(this)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,r=n?_r(t):{},a=this.subType;Cf.hasClass(a)&&(a+="Series"),i(t,e.getTheme().get(this.subType)),i(t,this.getDefaultOption()),sn(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&yr(t,r,n)},mergeOption:function(t,e){t=i(this.option,t,!0),this.fillDataTextStyle(t.data);var n=this.layoutMode;n&&yr(this.option,t,n),kr(this);var r=this.getInitialData(t,e);Ia(r,this),this.dataTask.dirty(),this.dataTask.context.data=r,cd(this).dataBeforeProcessed=r,wa(this)},fillDataTextStyle:function(t){if(t)for(var e=["show"],n=0;n<t.length;n++)t[n]&&t[n].label&&sn(t[n],"label",e)},getInitialData:function(){},appendData:function(t){this.getRawData().appendData(t.data)},getData:function(t){var e=ka(this);if(e){var n=e.context.data;return null==t?n:n.getLinkedData(t)}return cd(this).data},setData:function(t){var e=ka(this);if(e){var n=e.context;n.data!==t&&e.isOverallFilter&&e.setOutputEnd(t.count()),n.outputData=t,e!==this.dataTask&&(n.data=t)}cd(this).data=t},getSource:function(){return Ir(this)},getRawData:function(){return cd(this).dataBeforeProcessed},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(t,e,n){function i(t){return fr(cr(t))}var r=this.getData(),a=r.mapDimension("defaultedTooltip",!0),o=a.length,s=this.getRawValue(t),l=y(s),h=r.getItemVisual(t,"color");w(h)&&h.colorStops&&(h=(h.colorStops[0]||{}).color),h=h||"transparent";var u=o>1||l&&!o?function(n){function i(t,n){var i=r.getDimensionInfo(n);if(i&&!1!==i.otherDims.tooltip){var a=i.type,l=pr({color:h,type:"subItem"}),u=(o?l+fr(i.displayName||"-")+": ":"")+fr("ordinal"===a?t+"":"time"===a?e?"":gr("yyyy/MM/dd hh:mm:ss",t):cr(t));u&&s.push(u)}}var o=p(n,function(t,e,n){var i=r.getDimensionInfo(n);return t|=i&&!1!==i.tooltip&&null!=i.displayName},0),s=[];return a.length?f(a,function(e){i(ma(r,t,e),e)}):f(n,i),(o?"<br/>":"")+s.join(o?"<br/>":", ")}(s):i(o?ma(r,t,a[0]):l?s[0]:s),c=pr(h),d=r.getName(t),g=this.name;return g===Mu&&(g=""),g=g?fr(g)+(e?": ":"<br/>"):"",e?c+g+u:g+c+(d?fr(d)+": "+u:u)},isAnimationEnabled:function(){if(Fl.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){this.dataTask.dirty()},getColorFromPalette:function(t,e,n){var i=this.ecModel,r=Lf.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},coordDimToDataDim:function(t){return this.getRawData().mapDimension(t,!0)},getProgressive:function(){return this.get("progressive")},getProgressiveThreshold:function(){return this.get("progressiveThreshold")},getAxisTooltipData:null,getTooltipPosition:null,pipeTask:null,preventIncremental:null,pipelineContext:null});u(fd,hd),u(fd,Lf);var dd=function(){this.group=new Oh,this.uid=Ki("viewComponent")};dd.prototype={constructor:dd,init:function(t,e){},render:function(t,e,n,i){},dispose:function(){}};var pd=dd.prototype;pd.updateView=pd.updateLayout=pd.updateVisual=function(t,e,n,i){},wn(dd),Tn(dd,{registerWhenExtend:!0});var gd=function(){var t=pn();return function(e){var n=t(e),i=e.pipelineContext,r=n.large,a=n.incrementalRender,o=n.large=i.large,s=n.incrementalRender=i.incrementalRender;return(r^o||a^s)&&"reset"}},md=pn(),vd=gd();Da.prototype={type:"chart",init:function(t,e){},render:function(t,e,n,i){},highlight:function(t,e,n,i){La(t.getData(),i,"emphasis")},downplay:function(t,e,n,i){La(t.getData(),i,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){},incrementalPrepareRender:null,incrementalRender:null,updateTransform:null};var yd=Da.prototype;yd.updateView=yd.updateLayout=yd.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},wn(Da),Tn(Da,{registerWhenExtend:!0}),Da.markUpdateMethod=function(t,e){md(t).updateMethod=e};var _d={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=(t.visualColorAccessPath||"itemStyle.color").split("."),r=t.get(i)||t.getColorFromPalette(t.get("name"),null,e.getSeriesCount());if(n.setVisual("color",r),!e.isSeriesFiltered(t)){"function"!=typeof r||r instanceof Qc||n.each(function(e){n.setItemVisual(e,"color",r(t.getDataParams(e)))});return{dataEach:n.hasItemOption?function(t,e){var n=t.getItemModel(e).get(i,!0);null!=n&&t.setItemVisual(e,"color",n)}:null}}}},xd={toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}},wd=function(t,e){function n(t,e){if("string"!=typeof t)return t;var n=t;return f(e,function(t,e){n=n.replace(new RegExp("\\{\\s*"+e+"\\s*\\}","g"),t)}),n}function i(t){var e=a.get(t);if(null==e){for(var n=t.split("."),i=xd.aria,r=0;r<n.length;++r)i=i[n[r]];return i}return e}function r(t){return xd.series.typeNames[t]||"自定义图"}var a=e.getModel("aria");if(a.get("show"))if(a.get("description"))t.setAttribute("aria-label",a.get("description"));else{var o=0;e.eachSeries(function(t,e){++o},this);var s,l=a.get("data.maxCount")||10,h=a.get("series.maxCount")||10,u=Math.min(o,h);if(!(o<1)){var c=function(){var t=e.getModel("title").option;return t&&t.length&&(t=t[0]),t&&t.text}();s=c?n(i("general.withTitle"),{title:c}):i("general.withoutTitle");var d=[];s+=n(i(o>1?"series.multiple.prefix":"series.single.prefix"),{seriesCount:o}),e.eachSeries(function(t,e){if(e<u){var a,s=t.get("name"),h="series."+(o>1?"multiple":"single")+".";a=n(a=i(s?h+"withName":h+"withoutName"),{seriesId:t.seriesIndex,seriesName:t.get("name"),seriesType:r(t.subType)});var c=t.getData();window.data=c,c.count()>l?a+=n(i("data.partialData"),{displayCnt:l}):a+=i("data.allData");for(var f=[],p=0;p<c.count();p++)if(p<l){var g=c.getName(p),m=ma(c,p);f.push(n(i(g?"data.withName":"data.withoutName"),{name:g,value:m}))}a+=f.join(i("data.separator.middle"))+i("data.separator.end"),d.push(a)}}),s+=d.join(i("series.multiple.separator.middle"))+i("series.multiple.separator.end"),t.setAttribute("aria-label",s)}}},bd=Math.PI,Sd=Ra.prototype;Sd.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context;return{step:!e&&n.progressiveEnabled&&(!i||i.incrementalRender)&&t.__idxInPipeline>n.bockIndex?n.step:null}}},Sd.getPipeline=function(t){return this._pipelineMap.get(t)},Sd.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,a=t.get("large")&&i>=t.get("largeThreshold");t.pipelineContext=n.context={incrementalRender:r,large:a}},Sd.restorePipelines=function(t){var e=this,n=e._pipelineMap=R();t.eachSeries(function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),bockIndex:-1,step:i||700,count:0}),Ua(e,t,t.dataTask)})},Sd.prepareStageTasks=function(t,e){var n=this._stageTaskMap,i=this.ecInstance.getModel(),r=this.api;f(t,function(t){var e=n.get(t.uid)||n.set(t.uid,[]);t.reset&&Na(this,t,e,i,r),t.overallReset&&Fa(this,t,e,i,r)},this)},Sd.prepareView=function(t,e,n,i){var r=t.renderTask,a=r.context;a.model=e,a.ecModel=n,a.api=i,r.__block=!t.incrementalPrepareRender,Ua(this,e,r)},Sd.performDataProcessorTasks=function(t,e,n){za(this,t,e,n,{block:!0})},Sd.performVisualTasks=function(t,e,n,i){za(this,t,e,n,i)},Sd.performSeriesTasks=function(t){var e;t.eachSeries(function(t){e|=t.dataTask.perform()}),this.unfinished|=e},Sd.plan=function(){this._pipelineMap.each(function(t){var e=t.tail;do{if(e.__block){t.bockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)})};var Md=Sd.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)};Ra.wrapStageHandler=function(t,e){return _(t)&&(t={overallReset:t,seriesType:ja(t)}),t.uid=Ki("stageHandler"),e&&(t.visualType=e),t};var Td,Id={},Cd={};$a(Id,Gf),$a(Cd,qr),Id.eachSeriesByType=Id.eachRawSeriesByType=function(t){Td=t},Id.eachComponent=function(t){"series"===t.mainType&&t.subType&&(Td=t.subType)};var kd=["#37A2DA","#32C5E9","#67E0E3","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#E062AE","#E690D1","#e7bcf3","#9d96f5","#8378EA","#96BFFF"],Dd={color:kd,colorLayer:[["#37A2DA","#ffd85c","#fd7b5f"],["#37A2DA","#67E0E3","#FFDB5C","#ff9f7f","#E062AE","#9d96f5"],["#37A2DA","#32C5E9","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#e7bcf3","#8378EA","#96BFFF"],kd]},Ad=["#dd6b66","#759aa0","#e69d87","#8dc1a9","#ea7e53","#eedd78","#73a373","#73b9bc","#7289ab","#91ca8c","#f49f42"],Ld={color:Ad,backgroundColor:"#333",tooltip:{axisPointer:{lineStyle:{color:"#eee"},crossStyle:{color:"#eee"}}},legend:{textStyle:{color:"#eee"}},textStyle:{color:"#eee"},title:{textStyle:{color:"#eee"}},toolbox:{iconStyle:{normal:{borderColor:"#eee"}}},dataZoom:{textStyle:{color:"#eee"}},visualMap:{textStyle:{color:"#eee"}},timeline:{lineStyle:{color:"#eee"},itemStyle:{normal:{color:Ad[1]}},label:{normal:{textStyle:{color:"#eee"}}},controlStyle:{normal:{color:"#eee",borderColor:"#eee"}}},timeAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},logAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},valueAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},categoryAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},line:{symbol:"circle"},graph:{color:Ad},gauge:{title:{textStyle:{color:"#eee"}}},candlestick:{itemStyle:{normal:{color:"#FD1050",color0:"#0CF49B",borderColor:"#FD1050",borderColor0:"#0CF49B"}}}};Ld.categoryAxis.splitLine.show=!1;var Pd=L,Od=f,Ed=_,Bd=w,Rd=Cf.parseClassType,zd={zrender:"4.0.1"},Nd=1e3,Fd=1e3,Vd=3e3,Wd={PROCESSOR:{FILTER:Nd,STATISTIC:5e3},VISUAL:{LAYOUT:Fd,GLOBAL:2e3,CHART:Vd,COMPONENT:4e3,BRUSH:5e3}},Hd="__flagInMainProcess",Gd="__optionUpdated",qd=/^[a-zA-Z0-9_]+$/;Qa.prototype.on=Ka("on"),Qa.prototype.off=Ka("off"),Qa.prototype.one=Ka("one"),u(Qa,ih);var Xd=Ja.prototype;Xd._onframe=function(){if(!this._disposed){var t=this._scheduler;if(this[Gd]){var e=this[Gd].silent;this[Hd]=!0,eo(this),Zd.update.call(this),this[Hd]=!1,this[Gd]=!1,oo.call(this,e),so.call(this,e)}else if(t.unfinished){var n=1,i=this._model;this._api;t.unfinished=!1;do{var r=+new Date;t.performSeriesTasks(i),t.performDataProcessorTasks($d,i),ro(this,i),t.performVisualTasks(Jd,i),po(this,this._model,0,"remain"),n-=+new Date-r}while(n>0&&t.unfinished);t.unfinished||(this._zr&&this._zr.flush(),this.trigger("finished"))}}},Xd.getDom=function(){return this._dom},Xd.getZr=function(){return this._zr},Xd.setOption=function(t,e,n){var i;if(Bd(e)&&(n=e.lazyUpdate,i=e.silent,e=e.notMerge),this[Hd]=!0,!this._model||e){var r=new Zr(this._api),a=this._theme,o=this._model=new Gf(null,null,a,r);o.scheduler=this._scheduler,o.init(null,null,a,r)}this._model.setOption(t,Kd),n?(this[Gd]={silent:i},this[Hd]=!1):(eo(this),Zd.update.call(this),this._zr.flush(),this[Gd]=!1,this[Hd]=!1,oo.call(this,i),so.call(this,i))},Xd.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},Xd.getModel=function(){return this._model},Xd.getOption=function(){return this._model&&this._model.getOption()},Xd.getWidth=function(){return this._zr.getWidth()},Xd.getHeight=function(){return this._zr.getHeight()},Xd.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},Xd.getRenderedCanvas=function(t){if(Fl.canvasSupported){(t=t||{}).pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr;return f(e.storage.getDisplayList(),function(t){t.stopAnimation(!0)}),e.painter.getRenderedCanvas(t)}},Xd.getSvgDataUrl=function(){if(Fl.svgSupported){var t=this._zr;return f(t.storage.getDisplayList(),function(t){t.stopAnimation(!0)}),t.painter.pathToSvg()}},Xd.getDataURL=function(t){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;Od(e,function(t){n.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)})});var a="svg"===this._zr.painter.getType()?this.getSvgDataUrl():this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return Od(i,function(t){t.group.ignore=!1}),a},Xd.getConnectedDataURL=function(t){if(Fl.canvasSupported){var e=this.group,i=Math.min,r=Math.max;if(ip[e]){var a=1/0,o=1/0,s=-1/0,l=-1/0,h=[],u=t&&t.pixelRatio||1;f(np,function(u,c){if(u.group===e){var f=u.getRenderedCanvas(n(t)),d=u.getDom().getBoundingClientRect();a=i(d.left,a),o=i(d.top,o),s=r(d.right,s),l=r(d.bottom,l),h.push({dom:f,left:d.left,top:d.top})}});var c=(s*=u)-(a*=u),d=(l*=u)-(o*=u),p=$l();p.width=c,p.height=d;var g=an(p);return Od(h,function(t){var e=new ze({style:{x:t.left*u-a,y:t.top*u-o,image:t.dom}});g.add(e)}),g.refreshImmediately(),p.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},Xd.convertToPixel=v(to,"convertToPixel"),Xd.convertFromPixel=v(to,"convertFromPixel"),Xd.containPixel=function(t,e){var n;return t=gn(this._model,t),f(t,function(t,i){i.indexOf("Models")>=0&&f(t,function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n|=!!r.containPoint(e);else if("seriesModels"===i){var a=this._chartsMap[t.__viewId];a&&a.containPoint&&(n|=a.containPoint(e,t))}},this)},this),!!n},Xd.getVisual=function(t,e){var n=(t=gn(this._model,t,{defaultMainType:"series"})).seriesModel.getData(),i=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?n.indexOfRawIndex(t.dataIndex):null;return null!=i?n.getItemVisual(i,e):n.getVisual(e)},Xd.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},Xd.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var Zd={prepareAndUpdate:function(t){eo(this),Zd.update.call(this,t)},update:function(t){var e=this._model,n=this._api,i=this._zr,r=this._coordSysMgr,a=this._scheduler;if(e){e.restoreData(t),a.performSeriesTasks(e),r.create(e,n),a.performDataProcessorTasks($d,e,t),ro(this,e),ho(e),r.update(e,n),uo(e),a.performVisualTasks(Jd,e,t),co(this,e,n,t);var o=e.get("backgroundColor")||"transparent",s=i.painter;if(s.isSingleCanvas&&s.isSingleCanvas())i.configLayer(0,{clearColor:o});else{if(!Fl.canvasSupported){var l=_t(o);o=bt(l,"rgb"),0===l[3]&&(o="transparent")}o.colorStops||o.image?(i.configLayer(0,{clearColor:o}),this.__hasGradientOrPatternBg=!0,this._dom.style.background="transparent"):(this.__hasGradientOrPatternBg&&i.configLayer(0,{clearColor:null}),this.__hasGradientOrPatternBg=!1,this._dom.style.background=o)}go(e,n)}},updateTransform:function(t){var e=this._model,n=this,i=this._api;if(e){var r=[];e.eachComponent(function(a,o){var s=n.getViewOfComponentModel(o);if(s&&s.__alive)if(s.updateTransform){var l=s.updateTransform(o,e,i,t);l&&l.update&&r.push(s)}else r.push(s)});var a=R();e.eachSeries(function(r){var o=n._chartsMap[r.__viewId];if(o.updateTransform){var s=o.updateTransform(r,e,i,t);s&&s.update&&a.set(r.uid,1)}else a.set(r.uid,1)}),uo(e),this._scheduler.performVisualTasks(Jd,e,t,{setDirty:!0,dirtyMap:a}),po(n,e,0,t,a),go(e,this._api)}},updateView:function(t){var e=this._model;e&&(Da.markUpdateMethod(t,"updateView"),uo(e),this._scheduler.performVisualTasks(Jd,e,t,{setDirty:!0}),co(this,this._model,this._api,t),go(e,this._api))},updateVisual:function(t){Zd.update.call(this,t)},updateLayout:function(t){Zd.update.call(this,t)}};Xd.resize=function(t){this._zr.resize(t);var e=this._model;this._loadingFX&&this._loadingFX.resize(),e&&io(this,e.resetOption("media"),t&&t.silent)},Xd.showLoading=function(t,e){if(Bd(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),ep[t]){var n=ep[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},Xd.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},Xd.makeActionFromEvent=function(t){var e=a({},t);return e.type=jd[t.type],e},Xd.dispatchAction=function(t,e){Bd(e)||(e={silent:!!e}),Ud[t.type]&&this._model&&(this[Hd]?this._pendingActions.push(t):(ao.call(this,t,e.silent),e.flush?this._zr.flush(!0):!1!==e.flush&&Fl.browser.weChat&&this._throttledZrFlush(),oo.call(this,e.silent),so.call(this,e.silent)))},Xd.appendData=function(t){var e=t.seriesIndex;this.getModel().getSeriesByIndex(e).appendData(t),this._scheduler.unfinished=!0},Xd.on=Ka("on"),Xd.off=Ka("off"),Xd.one=Ka("one");var Yd=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];Xd._initEvents=function(){Od(Yd,function(t){this._zr.on(t,function(e){var n,i=this.getModel(),r=e.target;if("globalout"===t)n={};else if(r&&null!=r.dataIndex){var o=r.dataModel||i.getSeriesByIndex(r.seriesIndex);n=o&&o.getDataParams(r.dataIndex,r.dataType)||{}}else r&&r.eventData&&(n=a({},r.eventData));n&&(n.event=e,n.type=t,this.trigger(t,n))},this)},this),Od(jd,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},Xd.isDisposed=function(){return this._disposed},Xd.clear=function(){this.setOption({series:[]},!0)},Xd.dispose=function(){if(!this._disposed){this._disposed=!0,vn(this.getDom(),op,"");var t=this._api,e=this._model;Od(this._componentsViews,function(n){n.dispose(e,t)}),Od(this._chartsViews,function(n){n.dispose(e,t)}),this._zr.dispose(),delete np[this.id]}},u(Ja,ih);var Ud={},jd={},$d=[],Kd=[],Qd=[],Jd=[],tp={},ep={},np={},ip={},rp=new Date-0,ap=new Date-0,op="_echarts_instance_",sp={},lp=wo;ko(2e3,_d),Mo(id),Ao("default",function(t,e){o(e=e||{},{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var n=new Zc({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),i=new $c({shape:{startAngle:-bd/2,endAngle:-bd/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),r=new Zc({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});i.animateShape(!0).when(1e3,{endAngle:3*bd/2}).start("circularInOut"),i.animateShape(!0).when(1e3,{startAngle:3*bd/2}).delay(300).start("circularInOut");var a=new Oh;return a.add(i),a.add(r),a.add(n),a.resize=function(){var e=t.getWidth()/2,a=t.getHeight()/2;i.setShape({cx:e,cy:a});var o=i.shape.r;r.setShape({x:e-o,y:a-o,width:2*o,height:2*o}),n.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},a.resize(),a}),Io({type:"highlight",event:"highlight",update:"highlight"},z),Io({type:"downplay",event:"downplay",update:"downplay"},z),So("light",Dd),So("dark",Ld);var hp={};Lo({type:"dataset",defaultOption:{seriesLayoutBy:Ff,sourceHeader:null,dimensions:null,source:null},optionUpdated:function(){Tr(this)}});Po({type:"dataset"}),Ro.prototype={constructor:Ro,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t=this._old,e=this._new,n={},i=[],r=[];for(zo(t,{},i,"_oldKeyGetter",this),zo(e,n,r,"_newKeyGetter",this),a=0;a<t.length;a++)null!=(s=n[o=i[a]])?((h=s.length)?(1===h&&(n[o]=null),s=s.unshift()):n[o]=null,this._update&&this._update(s,a)):this._remove&&this._remove(a);for(var a=0;a<r.length;a++){var o=r[a];if(n.hasOwnProperty(o)){var s=n[o];if(null==s)continue;if(s.length)for(var l=0,h=s.length;l<h;l++)this._add&&this._add(s[l]);else this._add&&this._add(s)}}}};var up=R(["tooltip","label","itemName","itemId","seriesName"]),cp=w,fp="undefined",dp=typeof window===fp?global:window,pp="e\0\0",gp={float:typeof dp.Float64Array===fp?Array:dp.Float64Array,int:typeof dp.Int32Array===fp?Array:dp.Int32Array,ordinal:Array,number:Array,time:Array},mp=["stackedOn","hasItemOption","_nameList","_idList","_rawData","_rawExtent","_chunkSize","_chunkCount","_dimValueGetter","_count","_rawCount","_nameDimIdx","_idDimIdx"],vp=function(t,e){t=t||["x","y"];for(var n={},i=[],r=0;r<t.length;r++){var a,o={};"string"==typeof t[r]?o={name:a=t[r],coordDim:a,coordDimIndex:0,stackable:!1,type:"float"}:(a=(o=t[r]).name,o.type=o.type||"float",o.coordDim||(o.coordDim=a,o.coordDimIndex=0)),o.otherDims=o.otherDims||{},i.push(a),n[a]=o,o.index=r}this.dimensions=i,this._dimensionInfos=n,this.hostModel=e,this.dataType,this._indices=null,this._count=0,this._rawCount=0,this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._layout={},this._itemVisuals=[],this.hasItemVisual={},this._itemLayouts=[],this._graphicEls=[],this._chunkSize=1e5,this._chunkCount=0,this._rawData,this._rawExtent={},this._extent={},this._approximateExtent={},this._dimensionsSummary=No(this)},yp=vp.prototype;yp.type="list",yp.hasItemOption=!0,yp.getDimension=function(t){return isNaN(t)||(t=this.dimensions[t]||t),t},yp.getDimensionInfo=function(t){return this._dimensionInfos[this.getDimension(t)]},yp.getDimensionsOnCoord=function(){return this._dimensionsSummary.dataDimsOnCoord.slice()},yp.mapDimension=function(t,e){var n=this._dimensionsSummary.encode[t];return!0===e?n&&n.slice()||[]:n?n[e||0]:null},yp.initData=function(t,e,n){(Mr.isInstance(t)||c(t))&&(t=new ha(t,this.dimensions.length)),this._rawData=t,this._storage={},this._indices=null,this._nameList=e||[],this._idList=[],this._nameRepeatCount={},n||(this.hasItemOption=!1),this.defaultDimValueGetter=sd[this._rawData.getSource().sourceFormat],this._dimValueGetter=n=n||this.defaultDimValueGetter,this._rawExtent={},this._initDataFromProvider(0,t.count()),t.pure&&(this.hasItemOption=!1)},yp.getProvider=function(){return this._rawData},yp.appendData=function(t){var e=this._rawData,n=this.count();e.appendData(t);var i=e.count();e.persistent||(i+=n),this._initDataFromProvider(n,i)},yp._initDataFromProvider=function(t,e){if(!(t>=e)){for(var n,i=this._chunkSize,r=this._rawData,a=this._storage,o=this.dimensions,s=this._dimensionInfos,l=this._nameList,h=this._idList,u=this._rawExtent,c=this._nameRepeatCount={},f=this._chunkCount,d=f-1,p=0;p<o.length;p++){u[T=o[p]]||(u[T]=[1/0,-1/0]);var g=s[T];0===g.otherDims.itemName&&(n=this._nameDimIdx=p),0===g.otherDims.itemId&&(this._idDimIdx=p);var m=gp[g.type];a[T]||(a[T]=[]);var v=a[T][d];if(v&&v.length<i){for(var y=new m(Math.min(e-d*i,i)),_=0;_<v.length;_++)y[_]=v[_];a[T][d]=y}for(M=f*i;M<e;M+=i)a[T].push(new m(Math.min(e-M,i)));this._chunkCount=a[T].length}for(var x=t;x<e;x++){for(var w=r.getItem(x),b=Math.floor(x/i),S=x%i,M=0;M<o.length;M++){var T=o[M],I=a[T][b],C=this._dimValueGetter(w,T,x,M);I[S]=C,C<u[T][0]&&(u[T][0]=C),C>u[T][1]&&(u[T][1]=C)}if(!r.pure){var k=l[x];w&&!k&&(null!=n?k=this._getNameFromStore(x):null!=w.name&&(l[x]=k=w.name));var D=null==w?null:w.id;null==D&&null!=k&&(c[k]=c[k]||0,D=k,c[k]>0&&(D+="__ec__"+c[k]),c[k]++),null!=D&&(h[x]=D)}}!r.persistent&&r.clean&&r.clean(),this._rawCount=this._count=e,this._extent={}}},yp._getNameFromStore=function(t){var e=this._nameDimIdx;if(null!=e){var n=this._chunkSize,i=Math.floor(t/n),r=t%n,a=this.dimensions[e],o=this._dimensionInfos[a].ordinalMeta;if(o)return o.categories[t];var s=this._storage[a][i];return s&&s[r]}},yp._getIdFromStore=function(t){var e=this._idDimIdx;if(null!=e){var n=this._chunkSize,i=Math.floor(t/n),r=t%n,a=this.dimensions[e],o=this._dimensionInfos[a].ordinalMeta;if(o)return o.categories[t];var s=this._storage[a][i];return s&&s[r]}},yp.count=function(){return this._count},yp.getIndices=function(){if(this._indices)return new(t=this._indices.constructor)(this._indices.buffer,0,this._count);for(var t=Wo(this),e=new t(this.count()),n=0;n<e.length;n++)e[n]=n;return e},yp.get=function(t,e,n){if(!(e>=0&&e<this._count))return NaN;var i=this._storage;if(!i[t])return NaN;e=this.getRawIndex(e);var r=Math.floor(e/this._chunkSize),a=e%this._chunkSize,o=i[t][r][a];if(n){var s=this._dimensionInfos[t];if(s&&s.stackable)for(var l=this.stackedOn;l;){var h=l.get(t,e);(o>=0&&h>0||o<=0&&h<0)&&(o+=h),l=l.stackedOn}}return o},yp._getFast=function(t,e){var n=Math.floor(e/this._chunkSize),i=e%this._chunkSize;return this._storage[t][n][i]},yp.getValues=function(t,e,n){var i=[];y(t)||(n=e,e=t,t=this.dimensions);for(var r=0,a=t.length;r<a;r++)i.push(this.get(t[r],e,n));return i},yp.hasValue=function(t){for(var e=this._dimensionsSummary.dataDimsOnCoord,n=this._dimensionInfos,i=0,r=e.length;i<r;i++)if("ordinal"!==n[e[i]].type&&isNaN(this.get(e[i],t)))return!1;return!0},yp.getDataExtent=function(t,e){t=this.getDimension(t);var n=this._storage[t],i=[1/0,-1/0];if(e=(e||!1)&&this.isStacked(t),!n)return i;var r,a=this.count(),o=[t,!!e].join("_");if(!this._indices&&!e)return this._rawExtent[t].slice();if(r=this._extent[o])return r.slice();for(var s=(r=i)[0],l=r[1],h=0;h<a;h++){var u=e?this.get(t,h,!0):this._getFast(t,this.getRawIndex(h));u<s&&(s=u),u>l&&(l=u)}return r=[s,l],this._extent[o]=r,r},yp.getApproximateExtent=function(t,e){return t=this.getDimension(t),this._approximateExtent[t]||this.getDataExtent(t,e)},yp.setApproximateExtent=function(t,e,n){e=this.getDimension(e),this._approximateExtent[e]=t.slice()},yp.isStacked=function(t){var e=this._dimensionInfos[t];return e&&e.stackable&&this.stackedOn},yp.getSum=function(t,e){var n=0;if(this._storage[t])for(var i=0,r=this.count();i<r;i++){var a=this.get(t,i,e);isNaN(a)||(n+=a)}return n},yp.indexOf=function(t,e){var n=this._storage[t],i=this._chunkSize;if(n)for(var r=0,a=this.count();r<a;r++){var o=r%i;if(n[Math.floor(r/i)][o]===e)return r}return-1},yp.indexOfName=function(t){for(var e=0,n=this.count();e<n;e++)if(this.getName(e)===t)return e;return-1},yp.indexOfRawIndex=function(t){if(!this._indices)return t;if(t>=this._rawCount||t<0)return-1;var e=this._indices,n=e[t];if(null!=n&&n<this._count&&n===t)return t;for(var i=0,r=this._count-1;i<=r;){var a=(i+r)/2|0;if(e[a]<t)i=a+1;else{if(!(e[a]>t))return a;r=a-1}}return-1},yp.indicesOfNearest=function(t,e,n,i){var r=[];if(!this._storage[t])return r;null==i&&(i=1/0);for(var a=Number.MAX_VALUE,o=-1,s=0,l=this.count();s<l;s++){var h=e-this.get(t,s,n),u=Math.abs(h);h<=i&&u<=a&&((u<a||h>=0&&o<0)&&(a=u,o=h,r.length=0),r.push(s))}return r},yp.getRawIndex=qo,yp.getRawDataItem=function(t){if(this._rawData.persistent)return this._rawData.getItem(this.getRawIndex(t));for(var e=[],n=0;n<this.dimensions.length;n++){var i=this.dimensions[n];e.push(this.get(i,t))}return e},yp.getName=function(t){var e=this.getRawIndex(t);return this._nameList[e]||this._getNameFromStore(e)||""},yp.getId=function(t){return Zo(this,this.getRawIndex(t))},yp.each=function(t,e,n,i){if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]);var r=(t=d(Yo(t),this.getDimension,this)).length;i=i||this;for(var a=0;a<this.count();a++)switch(r){case 0:e.call(i,a);break;case 1:e.call(i,this.get(t[0],a,n),a);break;case 2:e.call(i,this.get(t[0],a,n),this.get(t[1],a,n),a);break;default:for(var o=0,s=[];o<r;o++)s[o]=this.get(t[o],a,n);s[o]=a,e.apply(i,s)}}},yp.filterSelf=function(t,e,n,i){if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||!1,i=i||this,t=d(Yo(t),this.getDimension,this);for(var r=this.count(),a=new(Wo(this))(r),o=[],s=t.length,l=0,h=t[0],u=0;u<r;u++){var c,f=this.getRawIndex(u);if(0===s)c=e.call(i,u);else if(1===s){var p=n?this.get(h,u,!0):this._getFast(h,f);c=e.call(i,p,u)}else{for(var g=0;g<s;g++)o[g]=n?this.get(t[g],u,!0):this._getFast(h,f);o[g]=u,c=e.apply(i,o)}c&&(a[l++]=f)}return l<r&&(this._indices=a),this._count=l,this._extent={},this.getRawIndex=this._indices?Xo:qo,this}},yp.selectRange=function(t,e){if(this._count){e=e||!1;var n=[];for(var i in t)t.hasOwnProperty(i)&&n.push(i);var r=n.length;if(r){var a=this.count(),o=new(Wo(this))(a),s=0,l=n[0],h=t[l][0],u=t[l][1],c=!1;if(!this._indices&&!e){var f=0;if(1===r){for(var d=this._storage[n[0]],p=0;p<this._chunkCount;p++)for(var g=d[p],m=Math.min(this._count-p*this._chunkSize,this._chunkSize),v=0;v<m;v++)(b=g[v])>=h&&b<=u&&(o[s++]=f),f++;c=!0}else if(2===r){for(var d=this._storage[l],y=this._storage[n[1]],_=t[n[1]][0],x=t[n[1]][1],p=0;p<this._chunkCount;p++)for(var g=d[p],w=y[p],m=Math.min(this._count-p*this._chunkSize,this._chunkSize),v=0;v<m;v++){var b=g[v],S=w[v];b>=h&&b<=u&&S>=_&&S<=x&&(o[s++]=f),f++}c=!0}}if(!c)if(1===r){e=e||this.isStacked(l);for(v=0;v<a;v++){T=this.getRawIndex(v);(b=e?this.get(l,v,!0):this._getFast(l,T))>=h&&b<=u&&(o[s++]=T)}}else for(v=0;v<a;v++){for(var M=!0,T=this.getRawIndex(v),p=0;p<r;p++){var I=n[p];((b=e?this.get(I,v,!0):this._getFast(i,T))<t[I][0]||b>t[I][1])&&(M=!1)}M&&(o[s++]=this.getRawIndex(v))}return s<a&&(this._indices=o),this._count=s,this._extent={},this.getRawIndex=this._indices?Xo:qo,this}}},yp.mapArray=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]);var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},n,i),r},yp.map=function(t,e,n,i){var r=Uo(this,t=d(Yo(t),this.getDimension,this));r._indices=this._indices,r.getRawIndex=r._indices?Xo:qo;for(var a=r._storage,o=[],s=this._chunkSize,l=t.length,h=this.count(),u=[],c=0;c<h;c++){for(var f=0;f<l;f++)u[f]=this.get(t[f],c,n);u[l]=c;var p=e&&e.apply(i,u);if(null!=p){"object"!=typeof p&&(o[0]=p,p=o);for(var g=this.getRawIndex(c),m=Math.floor(g/s),v=g%s,y=0;y<p.length;y++){var _=a[t[y]];_&&(_[m][v]=p[y])}}}return r},yp.downSample=function(t,e,n,i){for(var r=Uo(this,[t]),a=r._storage,o=[],s=Math.floor(1/e),l=a[t],h=this.count(),u=this._chunkSize,c=new(Wo(this))(h),f=0,d=0;d<h;d+=s){s>h-d&&(s=h-d,o.length=s);for(var p=0;p<s;p++){var g=this.getRawIndex(d+p),m=Math.floor(g/u),v=g%u;o[p]=l[m][v]}var y=n(o),_=this.getRawIndex(Math.min(d+i(o,y)||0,h-1)),x=_%u;l[Math.floor(_/u)][x]=y,c[f++]=_}return r._count=f,r._indices=c,r.getRawIndex=Xo,r},yp.getItemModel=function(t){var e=this.hostModel;return new Ui(this.getRawDataItem(t),e,e&&e.ecModel)},yp.diff=function(t){var e=this;return new Ro(t?t.getIndices():[],this.getIndices(),function(e){return Zo(t,e)},function(t){return Zo(e,t)})},yp.getVisual=function(t){var e=this._visual;return e&&e[t]},yp.setVisual=function(t,e){if(cp(t))for(var n in t)t.hasOwnProperty(n)&&this.setVisual(n,t[n]);else this._visual=this._visual||{},this._visual[t]=e},yp.setLayout=function(t,e){if(cp(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},yp.getLayout=function(t){return this._layout[t]},yp.getItemLayout=function(t){return this._itemLayouts[t]},yp.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?a(this._itemLayouts[t]||{},e):e},yp.clearItemLayouts=function(){this._itemLayouts.length=0},yp.getItemVisual=function(t,e,n){var i=this._itemVisuals[t],r=i&&i[e];return null!=r||n?r:this.getVisual(e)},yp.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{},r=this.hasItemVisual;if(this._itemVisuals[t]=i,cp(e))for(var a in e)e.hasOwnProperty(a)&&(i[a]=e[a],r[a]=!0);else i[e]=n,r[e]=!0},yp.clearAllVisual=function(){this._visual={},this._itemVisuals=[],this.hasItemVisual={}};var _p=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};yp.setItemGraphicEl=function(t,e){var n=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=n&&n.seriesIndex,"group"===e.type&&e.traverse(_p,e)),this._graphicEls[t]=e},yp.getItemGraphicEl=function(t){return this._graphicEls[t]},yp.eachItemGraphicEl=function(t,e){f(this._graphicEls,function(n,i){n&&t&&t.call(e,n,i)})},yp.cloneShallow=function(t){if(!t){var e=d(this.dimensions,this.getDimensionInfo,this);t=new vp(e,this.hostModel)}if(t._storage=this._storage,Go(t,this),this._indices){var i=this._indices.constructor;t._indices=new i(this._indices)}else t._indices=null;return t.getRawIndex=t._indices?Xo:qo,t._extent=n(this._extent),t._approximateExtent=n(this._approximateExtent),t},yp.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(D(arguments)))})},yp.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],yp.CHANGABLE_METHODS=["filterSelf","selectRange"];var xp=function(t,e){return e=e||{},$o(e.coordDimensions||[],t,{dimsDef:e.dimensionsDefine||t.dimensionsDefine,encodeDef:e.encodeDefine||t.encodeDefine,dimCount:e.dimensionsCount,extraPrefix:e.extraPrefix,extraFromZero:e.extraFromZero})};fd.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return Jo(this.getSource(),this)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{position:"top"},lineStyle:{width:2,type:"solid"},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:!1,connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}});var wp=pi({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i+a),t.lineTo(n-r,i+a),t.closePath()}}),bp=pi({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i),t.lineTo(n,i+a),t.lineTo(n-r,i),t.closePath()}}),Sp=pi({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,a=Math.max(r,e.height),o=r/2,s=o*o/(a-o),l=i-a+o+s,h=Math.asin(s/o),u=Math.cos(h)*o,c=Math.sin(h),f=Math.cos(h),d=.6*o,p=.7*o;t.moveTo(n-u,l+s),t.arc(n,l,o,Math.PI-h,2*Math.PI+h),t.bezierCurveTo(n+u-c*d,l+s+f*d,n,i-p,n,i),t.bezierCurveTo(n,i-p,n-u+c*d,l+s+f*d,n-u,l+s),t.closePath()}}),Mp=pi({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,a=e.y,o=i/3*2;t.moveTo(r,a),t.lineTo(r+o,a+n),t.lineTo(r,a+n/4*3),t.lineTo(r-o,a+n),t.lineTo(r,a),t.closePath()}}),Tp={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var a=Math.min(n,i);r.x=t,r.y=e,r.width=a,r.height=a},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},Ip={};f({line:Yc,rect:Zc,roundRect:Zc,square:Zc,circle:zc,diamond:bp,pin:Sp,arrow:Mp,triangle:wp},function(t,e){Ip[e]=new t});var Cp=pi({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style;"pin"===this.shape.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,n){var i=e.symbolType,r=Ip[i];"none"!==e.symbolType&&(r||(r=Ip[i="rect"]),Tp[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n))}}),kp=ls.prototype;kp._createSymbol=function(t,e,n,i){this.removeAll();var r=rs(t,-1,-1,2,2,e.getItemVisual(n,"color"));r.attr({z2:100,culling:!0,scale:ss(i)}),r.drift=hs,this._symbolType=t,this.add(r)},kp.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},kp.getSymbolPath=function(){return this.childAt(0)},kp.getScale=function(){return this.childAt(0).scale},kp.highlight=function(){this.childAt(0).trigger("emphasis")},kp.downplay=function(){this.childAt(0).trigger("normal")},kp.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},kp.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":"pointer"},kp.updateData=function(t,e,n){this.silent=!1;var i=t.getItemVisual(e,"symbol")||"circle",r=t.hostModel,a=os(t,e),o=i!==this._symbolType;if(o?this._createSymbol(i,t,e,a):((s=this.childAt(0)).silent=!1,qi(s,{scale:ss(a)},r,e)),this._updateCommon(t,e,a,n),o){var s=this.childAt(0),l=n&&n.fadeIn,h={scale:s.scale.slice()};l&&(h.style={opacity:s.style.opacity}),s.scale=[0,0],l&&(s.style.opacity=0),Xi(s,h,r,e)}this._seriesModel=r};var Dp=["itemStyle"],Ap=["emphasis","itemStyle"],Lp=["label"],Pp=["emphasis","label"];kp._updateCommon=function(t,e,n,i){var r=this.childAt(0),o=t.hostModel,s=t.getItemVisual(e,"color");"image"!==r.type&&r.useStyle({strokeNoScale:!0});var l=i&&i.itemStyle,h=i&&i.hoverItemStyle,u=i&&i.symbolRotate,c=i&&i.symbolOffset,f=i&&i.labelModel,d=i&&i.hoverLabelModel,p=i&&i.hoverAnimation,g=i&&i.cursorStyle;if(!i||t.hasItemOption){var m=i&&i.itemModel?i.itemModel:t.getItemModel(e);l=m.getModel(Dp).getItemStyle(["color"]),h=m.getModel(Ap).getItemStyle(),u=m.getShallow("symbolRotate"),c=m.getShallow("symbolOffset"),f=m.getModel(Lp),d=m.getModel(Pp),p=m.getShallow("hoverAnimation"),g=m.getShallow("cursor")}else h=a({},h);var v=r.style;r.attr("rotation",(u||0)*Math.PI/180||0),c&&r.attr("position",[tr(c[0],n[0]),tr(c[1],n[1])]),g&&r.attr("cursor",g),r.setColor(s,i&&i.symbolInnerColor),r.setStyle(l);var y=t.getItemVisual(e,"opacity");null!=y&&(v.opacity=y);var _=i&&i.useNameLabel;Ei(v,h,f,d,{labelFetcher:o,labelDataIndex:e,defaultText:function(e,n){return _?t.getName(e):as(t,e)},isRectText:!0,autoColor:s}),r.off("mouseover").off("mouseout").off("emphasis").off("normal"),r.hoverStyle=h,Oi(r);var x=ss(n);if(p&&o.isAnimationEnabled()){var w=function(){var t=x[1]/x[0];this.animateTo({scale:[Math.max(1.1*x[0],x[0]+3),Math.max(1.1*x[1],x[1]+3*t)]},400,"elasticOut")},b=function(){this.animateTo({scale:x},400,"elasticOut")};r.on("mouseover",w).on("mouseout",b).on("emphasis",w).on("normal",b)}},kp.fadeOut=function(t,e){var n=this.childAt(0);this.silent=n.silent=!0,!(e&&e.keepLabel)&&(n.style.text=null),qi(n,{style:{opacity:0},scale:[0,0]},this._seriesModel,this.dataIndex,t)},h(ls,Oh);var Op=us.prototype;Op.updateData=function(t,e){var n=this.group,i=t.hostModel,r=this._data,a=this._symbolCtor,o=fs(t);r||n.removeAll(),t.diff(r).add(function(i){var r=t.getItemLayout(i);if(cs(t,r,i,e)){var s=new a(t,i,o);s.attr("position",r),t.setItemGraphicEl(i,s),n.add(s)}}).update(function(s,l){var h=r.getItemGraphicEl(l),u=t.getItemLayout(s);cs(t,u,s,e)?(h?(h.updateData(t,s,o),qi(h,{position:u},i)):(h=new a(t,s)).attr("position",u),n.add(h),t.setItemGraphicEl(s,h)):n.remove(h)}).remove(function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut(function(){n.remove(e)})}).execute(),this._data=t},Op.isPersistent=function(){return!0},Op.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,n){var i=t.getItemLayout(n);e.attr("position",i)})},Op.incrementalPrepareUpdate=function(t){this._seriesScope=fs(t),this._data=null,this.group.removeAll()},Op.incrementalUpdate=function(t,e,n){for(var i=t.start;i<t.end;i++){var r=e.getItemLayout(i);if(cs(e,r,i,n)){var a=new this._symbolCtor(e,i,this._seriesScope);a.traverse(function(t){t.isGroup||(t.incremental=t.useHoverLayer=!0)}),a.attr("position",r),this.group.add(a),e.setItemGraphicEl(i,a)}}},Op.remove=function(t){var e=this.group,n=this._data;n&&(t?n.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())};var Ep=function(t,e,n,i,r,a){for(var o=gs(t,e),s=[],l=[],h=[],u=[],c=[],f=[],d=[],p=a.dimensions,g=0;g<o.length;g++){var m=o[g],v=!0;switch(m.cmd){case"=":var y=t.getItemLayout(m.idx),_=e.getItemLayout(m.idx1);(isNaN(y[0])||isNaN(y[1]))&&(y=_.slice()),s.push(y),l.push(_),h.push(n[m.idx]),u.push(i[m.idx1]),d.push(e.getRawIndex(m.idx1));break;case"+":x=m.idx;s.push(r.dataToPoint([e.get(p[0],x,!0),e.get(p[1],x,!0)])),l.push(e.getItemLayout(x).slice()),h.push(ps(r,e,x)),u.push(i[x]),d.push(e.getRawIndex(x));break;case"-":var x=m.idx,w=t.getRawIndex(x);w!==x?(s.push(t.getItemLayout(x)),l.push(a.dataToPoint([t.get(p[0],x,!0),t.get(p[1],x,!0)])),h.push(n[x]),u.push(ps(a,t,x)),d.push(w)):v=!1}v&&(c.push(m),f.push(f.length))}f.sort(function(t,e){return d[t]-d[e]});for(var b=[],S=[],M=[],T=[],I=[],g=0;g<f.length;g++){x=f[g];b[g]=s[x],S[g]=l[x],M[g]=h[x],T[g]=u[x],I[g]=c[x]}return{current:b,next:S,stackedOnCurrent:M,stackedOnNext:T,status:I}},Bp=U,Rp=j,zp=function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t},Np=function(t,e){return t[0]=e[0],t[1]=e[1],t},Fp=[],Vp=[],Wp=[],Hp=ri.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},brush:Fc(ri.prototype.brush),buildPath:function(t,e){var n=e.points,i=0,r=n.length,a=ys(n,e.smoothConstraint);if(e.connectNulls){for(;r>0&&ms(n[r-1]);r--);for(;i<r&&ms(n[i]);i++);}for(;i<r;)i+=vs(t,n,i,r,r,1,a.min,a.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),Gp=ri.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},brush:Fc(ri.prototype.brush),buildPath:function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,a=n.length,o=e.smoothMonotone,s=ys(n,e.smoothConstraint),l=ys(i,e.smoothConstraint);if(e.connectNulls){for(;a>0&&ms(n[a-1]);a--);for(;r<a&&ms(n[r]);r++);}for(;r<a;){var h=vs(t,n,r,a,a,1,s.min,s.max,e.smooth,o,e.connectNulls);vs(t,i,r+h-1,h,a,-1,l.min,l.max,e.stackedOnSmooth,o,e.connectNulls),r+=h+1,t.closePath()}}});Da.extend({type:"line",init:function(){var t=new Oh,e=new us;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,n){var i=t.coordinateSystem,r=this.group,a=t.getData(),s=t.getModel("lineStyle"),l=t.getModel("areaStyle"),h=a.mapArray(a.getItemLayout,!0),u="polar"===i.type,c=this._coordSys,f=this._symbolDraw,d=this._polyline,p=this._polygon,g=this._lineGroup,m=t.get("animation"),v=!l.isEmpty(),y=Ss(0,i,a,l.get("origin")),_=t.get("showSymbol"),x=_&&!u&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(a,i),w=this._data;w&&w.eachItemGraphicEl(function(t,e){t.__temp&&(r.remove(t),w.setItemGraphicEl(e,null))}),_||f.remove(),r.add(g);var b=!u&&t.get("step");d&&c.type===i.type&&b===this._step?(v&&!p?p=this._newPolygon(h,y,i,m):p&&!v&&(g.remove(p),p=this._polygon=null),g.setClipPath(Is(i,!1,t)),_&&f.updateData(a,x),a.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),_s(this._stackedOnPoints,y)&&_s(this._points,h)||(m?this._updateAnimation(a,y,i,n,b):(b&&(h=Cs(h,i,b),y=Cs(y,i,b)),d.setShape({points:h}),p&&p.setShape({points:h,stackedOnPoints:y})))):(_&&f.updateData(a,x),b&&(h=Cs(h,i,b),y=Cs(y,i,b)),d=this._newPolyline(h,i,m),v&&(p=this._newPolygon(h,y,i,m)),g.setClipPath(Is(i,!0,t)));var S=ks(a,i)||a.getVisual("color");d.useStyle(o(s.getLineStyle(),{fill:"none",stroke:S,lineJoin:"bevel"}));var M=t.get("smooth");if(M=xs(t.get("smooth")),d.setShape({smooth:M,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),p){var T=a.stackedOn,I=0;p.useStyle(o(l.getAreaStyle(),{fill:S,opacity:.7,lineJoin:"bevel"})),T&&(I=xs(T.hostModel.get("smooth"))),p.setShape({smooth:M,stackedOnSmooth:I,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=a,this._coordSys=i,this._stackedOnPoints=y,this._points=h,this._step=b},dispose:function(){},highlight:function(t,e,n,i){var r=t.getData(),a=dn(r,i);if(!(a instanceof Array)&&null!=a&&a>=0){var o=r.getItemGraphicEl(a);if(!o){var s=r.getItemLayout(a);if(!s)return;(o=new ls(r,a)).position=s,o.setZ(t.get("zlevel"),t.get("z")),o.ignore=isNaN(s[0])||isNaN(s[1]),o.__temp=!0,r.setItemGraphicEl(a,o),o.stopSymbolAnimation(!0),this.group.add(o)}o.highlight()}else Da.prototype.highlight.call(this,t,e,n,i)},downplay:function(t,e,n,i){var r=t.getData(),a=dn(r,i);if(null!=a&&a>=0){var o=r.getItemGraphicEl(a);o&&(o.__temp?(r.setItemGraphicEl(a,null),this.group.remove(o)):o.downplay())}else Da.prototype.downplay.call(this,t,e,n,i)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new Hp({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new Gp({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(n),this._polygon=n,n},_getSymbolIgnoreFunc:function(t,e){var n=e.getAxesByScale("ordinal")[0];if(n&&n.isLabelIgnored)return m(n.isLabelIgnored,n)},_updateAnimation:function(t,e,n,i,r){var a=this._polyline,o=this._polygon,s=t.hostModel,l=Ep(this._data,t,this._stackedOnPoints,e,this._coordSys,n),h=l.current,u=l.stackedOnCurrent,c=l.next,f=l.stackedOnNext;r&&(h=Cs(l.current,n,r),u=Cs(l.stackedOnCurrent,n,r),c=Cs(l.next,n,r),f=Cs(l.stackedOnNext,n,r)),a.shape.__points=l.current,a.shape.points=h,qi(a,{shape:{points:c}},s),o&&(o.setShape({points:h,stackedOnPoints:u}),qi(o,{shape:{points:c,stackedOnPoints:f}},s));for(var d=[],p=l.status,g=0;g<p.length;g++)if("="===p[g].cmd){var m=t.getItemGraphicEl(p[g].idx1);m&&d.push({el:m,ptIdx:g})}a.animators&&a.animators.length&&a.animators[0].during(function(){for(var t=0;t<d.length;t++)d[t].el.attr("position",a.shape.__points[d[t].ptIdx])})},remove:function(t){var e=this.group,n=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),n&&n.eachItemGraphicEl(function(t,i){t.__temp&&(e.remove(t),n.setItemGraphicEl(i,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}});var qp={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-1/0,n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return e},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return e},nearest:function(t){return t[0]}},Xp=function(t,e){return Math.round(t.length/2)};Ds.prototype.parse=function(t){return t},Ds.prototype.getSetting=function(t){return this._setting[t]},Ds.prototype.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},Ds.prototype.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},Ds.prototype.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},Ds.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},Ds.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e,!0))},Ds.prototype.getExtent=function(){return this._extent.slice()},Ds.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},Ds.prototype.getTicksLabels=function(){for(var t=[],e=this.getTicks(),n=0;n<e.length;n++)t.push(this.getLabel(e[n]));return t},Ds.prototype.isBlank=function(){return this._isBlank},Ds.prototype.setBlank=function(t){this._isBlank=t},wn(Ds),Tn(Ds,{registerWhenExtend:!0}),As.createByAxisModel=function(t){var e=t.option,n=e.data,i=n&&d(n,Ps);return new As({categories:i,needCollect:!i,deduplication:!1!==e.dedplication})};var Zp=As.prototype;Zp.getOrdinal=function(t){return Ls(this).get(t)},Zp.parseAndCollect=function(t){var e,n=this._needCollect;if("string"!=typeof t&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=Ls(this);return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e};var Yp=Ds.prototype,Up=Ds.extend({type:"ordinal",init:function(t,e){t&&!y(t)||(t=new As({categories:t})),this._ordinalMeta=t,this._extent=e||[0,t.categories.length-1]},parse:function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},contain:function(t){return t=this.parse(t),Yp.contain.call(this,t)&&null!=this._ordinalMeta.categories[t]},normalize:function(t){return Yp.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(Yp.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push(n),n++;return t},getLabel:function(t){return this._ordinalMeta.categories[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e,!1))},niceTicks:z,niceExtent:z});Up.create=function(){return new Up};var jp=er,$p=er,Kp=Ds.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),Kp.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=Es(t)},getTicks:function(){return zs(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getTicksLabels:function(){for(var t=[],e=this.getTicks(),n=0;n<e.length;n++)t.push(this.getLabel(e[n]));return t},getLabel:function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=nr(t)||0:"auto"===n&&(n=this._intervalPrecision),t=$p(t,n,!0),cr(t)},niceTicks:function(t,e,n){t=t||5;var i=this._extent,r=i[1]-i[0];if(isFinite(r)){r<0&&(r=-r,i.reverse());var a=Os(i,t,e,n);this._intervalPrecision=a.intervalPrecision,this._interval=a.interval,this._niceExtent=a.niceTickExtent}},niceExtent:function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var n=e[0];t.fixMax?e[0]-=n/2:(e[1]+=n/2,e[0]-=n/2)}else e[1]=1;var i=e[1]-e[0];isFinite(i)||(e[0]=0,e[1]=1),this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var r=this._interval;t.fixMin||(e[0]=$p(Math.floor(e[0]/r)*r)),t.fixMax||(e[1]=$p(Math.ceil(e[1]/r)*r))}});Kp.create=function(){return new Kp};var Qp="__ec_stack_",Jp=Kp.prototype,tg=Math.ceil,eg=Math.floor,ng=function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][1]<e?n=r+1:i=r}return n},ig=Kp.extend({type:"time",getLabel:function(t){var e=this._stepLvl,n=new Date(t);return gr(e[0],n,this.getSetting("useUTC"))},niceExtent:function(t){var e=this._extent;if(e[0]===e[1]&&(e[0]-=864e5,e[1]+=864e5),e[1]===-1/0&&e[0]===1/0){var n=new Date;e[1]=+new Date(n.getFullYear(),n.getMonth(),n.getDate()),e[0]=e[1]-864e5}this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var i=this._interval;t.fixMin||(e[0]=er(eg(e[0]/i)*i)),t.fixMax||(e[1]=er(tg(e[1]/i)*i))},niceTicks:function(t,e,n){t=t||10;var i=this._extent,r=i[1]-i[0],a=r/t;null!=e&&a<e&&(a=e),null!=n&&a>n&&(a=n);var o=rg.length,s=ng(rg,a,0,o),l=rg[Math.min(s,o-1)],h=l[1];"year"===l[0]&&(h*=ur(r/h/t,!0));var u=this.getSetting("useUTC")?0:60*new Date(+i[0]||+i[1]).getTimezoneOffset()*1e3,c=[Math.round(tg((i[0]-u)/h)*h+u),Math.round(eg((i[1]-u)/h)*h+u)];Rs(c,i),this._stepLvl=l,this._interval=h,this._niceExtent=c},parse:function(t){return+sr(t)}});f(["contain","normalize"],function(t){ig.prototype[t]=function(e){return Jp[t].call(this,this.parse(e))}});var rg=[["hh:mm:ss",1e3],["hh:mm:ss",5e3],["hh:mm:ss",1e4],["hh:mm:ss",15e3],["hh:mm:ss",3e4],["hh:mm\nMM-dd",6e4],["hh:mm\nMM-dd",3e5],["hh:mm\nMM-dd",6e5],["hh:mm\nMM-dd",9e5],["hh:mm\nMM-dd",18e5],["hh:mm\nMM-dd",36e5],["hh:mm\nMM-dd",72e5],["hh:mm\nMM-dd",216e5],["hh:mm\nMM-dd",432e5],["MM-dd\nyyyy",864e5],["MM-dd\nyyyy",1728e5],["MM-dd\nyyyy",2592e5],["MM-dd\nyyyy",3456e5],["MM-dd\nyyyy",432e6],["MM-dd\nyyyy",5184e5],["week",6048e5],["MM-dd\nyyyy",864e6],["week",12096e5],["week",18144e5],["month",26784e5],["week",36288e5],["month",53568e5],["week",36288e5],["quarter",8208e6],["month",107136e5],["month",13392e6],["half-year",16416e6],["month",214272e5],["month",26784e6],["year",32832e6]];ig.create=function(t){return new ig({useUTC:t.ecModel.get("useUTC")})};var ag=Ds.prototype,og=Kp.prototype,sg=nr,lg=er,hg=Math.floor,ug=Math.ceil,cg=Math.pow,fg=Math.log,dg=Ds.extend({type:"log",base:10,$constructor:function(){Ds.apply(this,arguments),this._originalScale=new Kp},getTicks:function(){var t=this._originalScale,e=this._extent,n=t.getExtent();return d(og.getTicks.call(this),function(i){var r=er(cg(this.base,i));return r=i===e[0]&&t.__fixMin?Hs(r,n[0]):r,r=i===e[1]&&t.__fixMax?Hs(r,n[1]):r},this)},getLabel:og.getLabel,scale:function(t){return t=ag.scale.call(this,t),cg(this.base,t)},setExtent:function(t,e){var n=this.base;t=fg(t)/fg(n),e=fg(e)/fg(n),og.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=ag.getExtent.call(this);e[0]=cg(t,e[0]),e[1]=cg(t,e[1]);var n=this._originalScale,i=n.getExtent();return n.__fixMin&&(e[0]=Hs(e[0],i[0])),n.__fixMax&&(e[1]=Hs(e[1],i[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=fg(t[0])/fg(e),t[1]=fg(t[1])/fg(e),ag.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e,!0,function(t){return t>0}))},niceTicks:function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=lr(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[er(ug(e[0]/i)*i),er(hg(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},niceExtent:function(t){og.niceExtent.call(this,t);var e=this._originalScale;e.__fixMin=t.fixMin,e.__fixMax=t.fixMax}});f(["contain","normalize"],function(t){dg.prototype[t]=function(e){return e=fg(e)/fg(this.base),ag[t].call(this,e)}}),dg.create=function(){return new dg};var pg=function(t){this._axes={},this._dimList=[],this.name=t||""};pg.prototype={constructor:pg,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return d(this._dimList,js,this)},getAxesByScale:function(t){return t=t.toLowerCase(),g(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var n=this._dimList,i=t instanceof Array?[]:{},r=0;r<n.length;r++){var a=n[r],o=this._axes[a];i[a]=o[e](t[a])}return i}},$s.prototype={constructor:$s,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoint:function(t,e,n){var i=this.getAxis("x"),r=this.getAxis("y");return n=n||[],n[0]=i.toGlobalCoord(i.dataToCoord(t[0])),n[1]=r.toGlobalCoord(r.dataToCoord(t[1])),n},clampData:function(t,e){var n=this.getAxis("x").scale.getExtent(),i=this.getAxis("y").scale.getExtent();return e=e||[],e[0]=Math.min(Math.max(Math.min(n[0],n[1]),t[0]),Math.max(n[0],n[1])),e[1]=Math.min(Math.max(Math.min(i[0],i[1]),t[1]),Math.max(i[0],i[1])),e},pointToData:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return e=e||[],e[0]=n.coordToData(n.toLocalCoord(t[0])),e[1]=i.coordToData(i.toLocalCoord(t[1])),e},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")}},h($s,pg);var gg=Ji,mg=[0,1],vg=function(t,e,n){this.dim=t,this.scale=e,this._extent=n||[0,0],this.inverse=!1,this.onBand=!1,this._labelInterval};vg.prototype={constructor:vg,contain:function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){return this._extent.slice()},getPixelPrecision:function(t){return ir(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var n=this._extent;n[0]=t,n[1]=e},dataToCoord:function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&Ks(n=n.slice(),i.count()),gg(t,mg,n,e)},coordToData:function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&Ks(n=n.slice(),i.count());var r=gg(t,n,mg,e);return this.scale.scale(r)},pointToData:function(t,e){},getTicksCoords:function(t){if(this.onBand&&!t){for(var e=this.getBands(),n=[],i=0;i<e.length;i++)n.push(e[i][0]);return e[i-1]&&n.push(e[i-1][1]),n}return d(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){return d(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var t=this.getExtent(),e=[],n=this.scale.count(),i=t[0],r=t[1]-i,a=0;a<n;a++)e.push([r*a/n+i,r*(a+1)/n+i]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},isHorizontal:null,getRotate:null,getLabelInterval:function(){var t=this._labelInterval;if(!t){var e=this.model,n=e.getModel("axisLabel");t=n.get("interval"),"category"!==this.type||null!=t&&"auto"!==t||(t=Zs(d(this.scale.getTicks(),this.dataToCoord,this),e.getFormattedLabels(),n.getFont(),this.getRotate?this.getRotate():this.isHorizontal&&!this.isHorizontal()?90:0,n.get("rotate"))),this._labelInterval=t}return t}};var yg=function(t,e,n,i,r){vg.call(this,t,e,n),this.type=i||"value",this.position=r||"bottom"};yg.prototype={constructor:yg,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},h(yg,vg);var _g={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#333",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},xg={};xg.categoryAxis=i({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},_g),xg.valueAxis=i({boundaryGap:[0,0],splitNumber:5},_g),xg.timeAxis=o({scale:!0,min:"dataMin",max:"dataMax"},xg.valueAxis),xg.logAxis=o({scale:!0,logBase:10},xg.valueAxis);var wg=["value","category","time","log"],bg=function(t,e,n,a){f(wg,function(o){e.extend({type:t+"Axis."+o,mergeDefaultAndTheme:function(e,r){var a=this.layoutMode,s=a?_r(e):{};i(e,r.getTheme().get(o+"Axis")),i(e,this.getDefaultOption()),e.type=n(t,e),a&&yr(e,s,a)},optionUpdated:function(){"category"===this.option.type&&(this.__ordinalMeta=As.createByAxisModel(this))},getCategories:function(){if("category"===this.option.type)return this.__ordinalMeta.categories},getOrdinalMeta:function(){return this.__ordinalMeta},defaultOption:r([{},xg[o+"Axis"],a],!0)})}),Cf.registerSubTypeDefaulter(t+"Axis",v(n,t))},Sg={getFormattedLabels:function(){return Ys(this.axis,this.get("axisLabel.formatter"))},getMin:function(t){var e=this.option,n=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=n&&"dataMin"!==n&&"function"!=typeof n&&!T(n)&&(n=this.axis.scale.parse(n)),n},getMax:function(t){var e=this.option,n=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=n&&"dataMax"!==n&&"function"!=typeof n&&!T(n)&&(n=this.axis.scale.parse(n)),n},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:z,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}},Mg=Cf.extend({type:"cartesian2dAxis",axis:null,init:function(){Mg.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){Mg.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){Mg.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});i(Mg.prototype,Sg);var Tg={offset:0};bg("x",Mg,Qs,Tg),bg("y",Mg,Qs,Tg),Cf.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}});var Ig=f,Cg=function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(n>0&&i>0||n<0&&i<0)},kg=function(t,e){var n=Gs(t,e),i=null!=e.getMin(),r=null!=e.getMax(),a=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase"));var o=t.type;t.setExtent(n[0],n[1]),t.niceExtent({splitNumber:a,fixMin:i,fixMax:r,minInterval:"interval"===o||"time"===o?e.get("minInterval"):null,maxInterval:"interval"===o||"time"===o?e.get("maxInterval"):null});var s=e.get("interval");null!=s&&t.setInterval&&t.setInterval(s)},Dg=nl.prototype;Dg.type="grid",Dg.axisPointerEnabled=!0,Dg.getRect=function(){return this._rect},Dg.update=function(t,e){var n=this._axesMap;this._updateScale(t,this.model),Ig(n.x,function(t){kg(t.scale,t.model)}),Ig(n.y,function(t){kg(t.scale,t.model)}),Ig(n.x,function(t){il(n,"y",t)}),Ig(n.y,function(t){il(n,"x",t)}),this.resize(this.model,e)},Dg.resize=function(t,e,n){function i(){Ig(a,function(t){var e=t.isHorizontal(),n=e?[0,r.width]:[0,r.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),al(t,e?r.x:r.y)})}var r=vr(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=r;var a=this._axesList;i(),!n&&t.get("containLabel")&&(Ig(a,function(t){if(!t.model.get("axisLabel.inside")){var e=el(t);if(e){var n=t.isHorizontal()?"height":"width",i=t.model.get("axisLabel.margin");r[n]-=e[n]+i,"top"===t.position?r.y+=e.height+i:"left"===t.position&&(r.x+=e.width+i)}}}),i())},Dg.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n){if(null==e)for(var i in n)if(n.hasOwnProperty(i))return n[i];return n[e]}},Dg.getAxes=function(){return this._axesList.slice()},Dg.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}w(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},Dg.getCartesians=function(){return this._coordsList.slice()},Dg.convertToPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},Dg.convertFromPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},Dg._findConvertTarget=function(t,e){var n,i,r=e.seriesModel,a=e.xAxisModel||r&&r.getReferringComponents("xAxis")[0],o=e.yAxisModel||r&&r.getReferringComponents("yAxis")[0],s=e.gridModel,h=this._coordsList;return r?l(h,n=r.coordinateSystem)<0&&(n=null):a&&o?n=this.getCartesian(a.componentIndex,o.componentIndex):a?i=this.getAxis("x",a.componentIndex):o?i=this.getAxis("y",o.componentIndex):s&&s.coordinateSystem===this&&(n=this._coordsList[0]),{cartesian:n,axis:i}},Dg.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},Dg._initCartesian=function(t,e,n){function i(n){return function(i,s){if(Js(i,t,e)){var l=i.get("position");"x"===n?"top"!==l&&"bottom"!==l&&r[l="bottom"]&&(l="top"===l?"bottom":"top"):"left"!==l&&"right"!==l&&r[l="left"]&&(l="left"===l?"right":"left"),r[l]=!0;var h=new yg(n,Xs(i),[0,0],i.get("type"),l),u="category"===h.type;h.onBand=u&&i.get("boundaryGap"),h.inverse=i.get("inverse"),h.onZero=i.get("axisLine.onZero"),h.onZeroAxisIndex=i.get("axisLine.onZeroAxisIndex"),i.axis=h,h.model=i,h.grid=this,h.index=s,this._axesList.push(h),a[n][s]=h,o[n]++}}}var r={left:!1,right:!1,top:!1,bottom:!1},a={x:{},y:{}},o={x:0,y:0};if(e.eachComponent("xAxis",i("x"),this),e.eachComponent("yAxis",i("y"),this),!o.x||!o.y)return this._axesMap={},void(this._axesList=[]);this._axesMap=a,Ig(a.x,function(e,n){Ig(a.y,function(i,r){var a="x"+n+"y"+r,o=new $s(a);o.grid=this,o.model=t,this._coordsMap[a]=o,this._coordsList.push(o),o.addAxis(e),o.addAxis(i)},this)},this)},Dg._updateScale=function(t,e){function n(t,e,n){Ig(t.mapDimension(e.dim,!0),function(n){e.scale.unionExtentFromData(t,n)})}f(this._axesList,function(t){t.scale.setExtent(1/0,-1/0)}),t.eachSeries(function(i){if(sl(i)){var r=ol(i),a=r[0],o=r[1];if(!Js(a,e,t)||!Js(o,e,t))return;var s=this.getCartesian(a.componentIndex,o.componentIndex),l=i.getData(),h=s.getAxis("x"),u=s.getAxis("y");"list"===l.type&&(n(l,h),n(l,u))}},this)},Dg.getTooltipAxes=function(t){var e=[],n=[];return Ig(this.getCartesians(),function(i){var r=null!=t&&"auto"!==t?i.getAxis(t):i.getBaseAxis(),a=i.getOtherAxis(r);l(e,r)<0&&e.push(r),l(n,a)<0&&n.push(a)}),{baseAxes:e,otherAxes:n}};var Ag=["xAxis","yAxis"];nl.create=function(t,e){var n=[];return t.eachComponent("grid",function(i,r){var a=new nl(i,t,e);a.name="grid_"+r,a.resize(i,e,!0),i.coordinateSystem=a,n.push(a)}),t.eachSeries(function(t){if(sl(t)){var e=ol(t),n=e[0],i=e[1],r=n.getCoordSysModel().coordinateSystem;t.coordinateSystem=r.getCartesian(n.componentIndex,i.componentIndex)}}),n},nl.dimensions=nl.prototype.dimensions=$s.prototype.dimensions,Xr.register("cartesian2d",nl);var Lg=Math.PI,Pg=function(t,e){this.opt=e,this.axisModel=t,o(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new Oh;var n=new Oh({position:e.position.slice(),rotation:e.rotation});n.updateTransform(),this._transform=n.transform,this._dumbGroup=n};Pg.prototype={constructor:Pg,hasBuilder:function(t){return!!Og[t]},add:function(t){Og[t].call(this)},getGroup:function(){return this.group}};var Og={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var n=this.axisModel.axis.getExtent(),i=this._transform,r=[n[0],0],o=[n[1],0];i&&(Y(r,r,i),Y(o,o,i));var s=a({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle());this.group.add(new Yc(_i({anid:"line",shape:{x1:r[0],y1:r[1],x2:o[0],y2:o[1]},style:s,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1})));var l=e.get("axisLine.symbol"),h=e.get("axisLine.symbolSize");if(null!=l){"string"==typeof l&&(l=[l,l]),"string"!=typeof h&&"number"!=typeof h||(h=[h,h]);var u=h[0],c=h[1];f([[t.rotation+Math.PI/2,r],[t.rotation-Math.PI/2,o]],function(t,e){if("none"!==l[e]&&null!=l[e]){var n=rs(l[e],-u/2,-c/2,u,c,s.stroke,!0);n.attr({rotation:t[0],position:t[1],silent:!0}),this.group.add(n)}},this)}}},axisTickLabel:function(){var t=this.axisModel,e=this.opt,n=gl(this,t,e);cl(t,ml(this,t,e),n)},axisName:function(){var t=this.opt,e=this.axisModel,n=I(t.axisName,e.get("name"));if(n){var i,r=e.get("nameLocation"),o=t.nameDirection,s=e.getModel("nameTextStyle"),l=e.get("nameGap")||0,h=this.axisModel.axis.getExtent(),u=h[0]>h[1]?-1:1,c=["start"===r?h[0]-u*l:"end"===r?h[1]+u*l:(h[0]+h[1])/2,pl(r)?t.labelOffset+o*l:0],f=e.get("nameRotate");null!=f&&(f=f*Lg/180);var d;pl(r)?i=Eg(t.rotation,null!=f?f:t.rotation,o):(i=hl(t,r,f||0,h),null!=(d=t.axisNameAvailableWidth)&&(d=Math.abs(d/Math.sin(i.rotation)),!isFinite(d)&&(d=null)));var p=s.getFont(),g=e.get("nameTruncate",!0)||{},m=g.ellipsis,v=I(t.nameTruncateMaxWidth,g.maxWidth,d),y=null!=m&&null!=v?wf(n,v,p,m,{minChar:2,placeholder:g.placeholder}):n,_=e.get("tooltip",!0),x=e.mainType,w={componentType:x,name:n,$vars:["name"]};w[x+"Index"]=e.componentIndex;var b=new Rc({anid:"name",__fullText:n,__truncatedText:y,position:c,rotation:i.rotation,silent:ul(e),z2:1,tooltip:_&&_.show?a({content:n,formatter:function(){return n},formatterParams:w},_):null});Bi(b.style,s,{text:y,textFont:p,textFill:s.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:i.textAlign,textVerticalAlign:i.textVerticalAlign}),e.get("triggerEvent")&&(b.eventData=ll(e),b.eventData.targetType="axisName",b.eventData.name=n),this._dumbGroup.add(b),b.updateTransform(),this.group.add(b),b.decomposeTransform()}}},Eg=Pg.innerTextLayout=function(t,e,n){var i,r,a=ar(e-t);return or(a)?(r=n>0?"top":"bottom",i="center"):or(a-Lg)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=a>0&&a<Lg?n>0?"right":"left":n>0?"left":"right"),{rotation:a,textAlign:i,textVerticalAlign:r}},Bg=Pg.ifIgnoreOnTick=function(t,e,n,i,r,a){if(0===e&&r||e===i-1&&a)return!1;var o,s=t.scale;return"ordinal"===s.type&&("function"==typeof n?(o=s.getTicks()[e],!n(o,s.getLabel(o))):e%(n+1))},Rg=Pg.getInterval=function(t,e){var n=t.get("interval");return null!=n&&"auto"!=n||(n=e),n},zg=Po({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,n,i){this.axisPointerClass&&vl(t),zg.superApply(this,"render",arguments),bl(this,t,0,n,0,!0)},updateAxisPointer:function(t,e,n,i,r){bl(this,t,0,n,0,!1)},remove:function(t,e){var n=this._axisPointer;n&&n.remove(e),zg.superApply(this,"remove",arguments)},dispose:function(t,e){Sl(this,e),zg.superApply(this,"dispose",arguments)}}),Ng=[];zg.registerAxisPointerClass=function(t,e){Ng[t]=e},zg.getAxisPointerClass=function(t){return t&&Ng[t]};var Fg=Pg.ifIgnoreOnTick,Vg=Pg.getInterval,Wg=["axisLine","axisTickLabel","axisName"],Hg=["splitArea","splitLine"],Gg=zg.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(t,e,n,i){this.group.removeAll();var r=this._axisGroup;if(this._axisGroup=new Oh,this.group.add(this._axisGroup),t.get("show")){var a=t.getCoordSysModel(),o=Ml(a,t),s=new Pg(t,o);f(Wg,s.add,s),this._axisGroup.add(s.getGroup()),f(Hg,function(e){t.get(e+".show")&&this["_"+e](t,a,o.labelInterval)},this),Yi(r,this._axisGroup,t),Gg.superCall(this,"render",t,e,n,i)}},_splitLine:function(t,e,n){var i=t.axis;if(!i.scale.isBlank()){var r=t.getModel("splitLine"),a=r.getModel("lineStyle"),s=a.get("color"),l=Vg(r,n);s=y(s)?s:[s];for(var h=e.coordinateSystem.getRect(),u=i.isHorizontal(),c=0,f=i.getTicksCoords(),d=i.scale.getTicks(),p=t.get("axisLabel.showMinLabel"),g=t.get("axisLabel.showMaxLabel"),m=[],v=[],_=a.getLineStyle(),x=0;x<f.length;x++)if(!Fg(i,x,l,f.length,p,g)){var w=i.toGlobalCoord(f[x]);u?(m[0]=w,m[1]=h.y,v[0]=w,v[1]=h.y+h.height):(m[0]=h.x,m[1]=w,v[0]=h.x+h.width,v[1]=w);var b=c++%s.length;this._axisGroup.add(new Yc(_i({anid:"line_"+d[x],shape:{x1:m[0],y1:m[1],x2:v[0],y2:v[1]},style:o({stroke:s[b]},_),silent:!0})))}}},_splitArea:function(t,e,n){var i=t.axis;if(!i.scale.isBlank()){var r=t.getModel("splitArea"),a=r.getModel("areaStyle"),s=a.get("color"),l=e.coordinateSystem.getRect(),h=i.getTicksCoords(),u=i.scale.getTicks(),c=i.toGlobalCoord(h[0]),f=i.toGlobalCoord(h[0]),d=0,p=Vg(r,n),g=a.getAreaStyle();s=y(s)?s:[s];for(var m=t.get("axisLabel.showMinLabel"),v=t.get("axisLabel.showMaxLabel"),_=1;_<h.length;_++)if(!Fg(i,_,p,h.length,m,v)){var x,w,b,S,M=i.toGlobalCoord(h[_]);i.isHorizontal()?(x=c,w=l.y,b=M-x,S=l.height):(x=l.x,w=f,b=l.width,S=M-w);var T=d++%s.length;this._axisGroup.add(new Zc({anid:"area_"+u[_],shape:{x:x,y:w,width:b,height:S},style:o({fill:s[T]},g),silent:!0})),c=x+b,f=w+S}}}});Gg.extend({type:"xAxis"}),Gg.extend({type:"yAxis"}),Po({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new Zc({shape:t.coordinateSystem.getRect(),style:o({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),Mo(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})}),ko(function(t,e,n){return{seriesType:t,performRawSeries:!0,reset:function(t,i,r){var a=t.getData(),o=t.get("symbol")||e,s=t.get("symbolSize");if(a.setVisual({legendSymbol:n||o,symbol:o,symbolSize:s}),!i.isSeriesFiltered(t)){var l="function"==typeof s;return{dataEach:a.hasItemOption||l?function(e,n){if("function"==typeof s){var i=t.getRawValue(n),r=t.getDataParams(n);e.setItemVisual(n,"symbolSize",s(i,r))}if(e.hasItemOption){var a=e.getItemModel(n),o=a.getShallow("symbol",!0),l=a.getShallow("symbolSize",!0);null!=o&&e.setItemVisual(n,"symbol",o),null!=l&&e.setItemVisual(n,"symbolSize",l)}}:null}}}}}("line","circle","line")),Co(function(t){return{seriesType:t,plan:gd(),reset:function(t){var e=t.getData(),n=t.coordinateSystem,i=t.pipelineContext.large;if(n){var r=d(n.dimensions,function(t){return e.getDimension(e.mapDimension(t))}).slice(0,2),a=r.length;return a&&{progress:function(t,e){for(var o=t.end-t.start,s=i&&new Float32Array(o*a),l=t.start,h=0,u=[],c=[];l<t.end;l++){var f;if(1===a)d=e.get(r[0],l,!0),f=!isNaN(d)&&n.dataToPoint(d,null,c);else{var d=u[0]=e.get(r[0],l,!0),p=u[1]=e.get(r[1],l,!0);f=!isNaN(d)&&!isNaN(p)&&n.dataToPoint(u,null,c)}i?(s[h++]=f?f[0]:NaN,s[h++]=f?f[1]:NaN):e.setItemLayout(l,f&&f.slice()||[NaN,NaN])}i&&e.setLayout("symbolPoints",s)}}}}}}("line")),To(Wd.PROCESSOR.STATISTIC,function(t){return{seriesType:t,reset:function(t,e,n){var i=t.getData(),r=t.get("sampling"),a=t.coordinateSystem;if("cartesian2d"===a.type&&r){var o=a.getBaseAxis(),s=a.getOtherAxis(o),l=o.getExtent(),h=l[1]-l[0],u=Math.round(i.count()/h);if(u>1){var c;"string"==typeof r?c=qp[r]:"function"==typeof r&&(c=r),c&&t.setData(i.downSample(s.dim,1/u,c,Xp))}}}}}("line")),fd.extend({type:"series.__base_bar__",getInitialData:function(t,e){return Jo(this.getSource(),this)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),a=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+a/2,n}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,itemStyle:{},emphasis:{}}}).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect"});var qg=Au([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),Xg={getBarItemStyle:function(t){var e=qg(this,t);if(this.getBorderLineDash){var n=this.getBorderLineDash();n&&(e.lineDash=n)}return e}},Zg=["itemStyle","barBorderWidth"];a(Ui.prototype,Xg),Eo({type:"bar",render:function(t,e,n){var i=t.get("coordinateSystem");return"cartesian2d"!==i&&"polar"!==i||this._render(t,e,n),this.group},dispose:z,_render:function(t,e,n){var i,r=this.group,a=t.getData(),o=this._data,s=t.coordinateSystem,l=s.getBaseAxis();"cartesian2d"===s.type?i=l.isHorizontal():"polar"===s.type&&(i="angle"===l.dim);var h=t.isAnimationEnabled()?t:null;a.diff(o).add(function(e){if(a.hasValue(e)){var n=a.getItemModel(e),o=Ug[s.type](a,e,n),l=Yg[s.type](a,e,n,o,i,h);a.setItemGraphicEl(e,l),r.add(l),Dl(l,a,e,n,o,t,i,"polar"===s.type)}}).update(function(e,n){var l=o.getItemGraphicEl(n);if(a.hasValue(e)){var u=a.getItemModel(e),c=Ug[s.type](a,e,u);l?qi(l,{shape:c},h,e):l=Yg[s.type](a,e,u,c,i,h,!0),a.setItemGraphicEl(e,l),r.add(l),Dl(l,a,e,u,c,t,i,"polar"===s.type)}else r.remove(l)}).remove(function(t){var e=o.getItemGraphicEl(t);"cartesian2d"===s.type?e&&Cl(t,h,e):e&&kl(t,h,e)}).execute(),this._data=a},remove:function(t,e){var n=this.group,i=this._data;t.get("animation")?i&&i.eachItemGraphicEl(function(e){"sector"===e.type?kl(e.dataIndex,t,e):Cl(e.dataIndex,t,e)}):n.removeAll()}});var Yg={cartesian2d:function(t,e,n,i,r,o,s){var l=new Zc({shape:a({},i)});if(o){var h=l.shape,u=r?"height":"width",c={};h[u]=0,c[u]=i[u],sf[s?"updateProps":"initProps"](l,{shape:c},o,e)}return l},polar:function(t,e,n,i,r,o,s){var l=new Vc({shape:a({},i)});if(o){var h=l.shape,u=r?"r":"endAngle",c={};h[u]=r?0:i.startAngle,c[u]=i[u],sf[s?"updateProps":"initProps"](l,{shape:c},o,e)}return l}},Ug={cartesian2d:function(t,e,n){var i=t.getItemLayout(e),r=Al(n,i),a=i.width>0?1:-1,o=i.height>0?1:-1;return{x:i.x+a*r/2,y:i.y+o*r/2,width:i.width-a*r,height:i.height-o*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle}}};Co(v(function(t,e,n){var i=Vs(g(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),r={},a={};e.eachSeriesByType(t,function(t){if("cartesian2d"===t.coordinateSystem.type){var e=t.getData(),n=t.coordinateSystem,o=n.getBaseAxis(),s=Ns(t),l=i[Fs(o)][s],h=l.offset,u=l.width,c=n.getOtherAxis(o),f=t.get("barMinHeight")||0,d=o.onZero?c.toGlobalCoord(c.dataToCoord(0)):c.getGlobalExtent()[0],p=[e.mapDimension("x"),e.mapDimension("y")],g=e.mapArray(p,function(t,e){return n.dataToPoint([t,e])},!0);r[s]=r[s]||[],a[s]=a[s]||[],e.setLayout({offset:h,size:u}),e.each(e.mapDimension(c.dim),function(t,n){if(!isNaN(t)){r[s][n]||(r[s][n]={p:d,n:d},a[s][n]={p:d,n:d});var i,o,l,p,m=t>=0?"p":"n",v=g[n],y=r[s][n][m],_=a[s][n][m];c.isHorizontal()?(i=y,o=v[1]+h,l=v[0]-_,p=u,a[s][n][m]+=l,Math.abs(l)<f&&(l=(l<0?-1:1)*f),r[s][n][m]+=l):(i=v[0]+h,o=y,l=u,p=v[1]-_,a[s][n][m]+=p,Math.abs(p)<f&&(p=(p<=0?-1:1)*f),r[s][n][m]+=p),e.setItemLayout(n,{x:i,y:o,width:l,height:p})}},!0)}},this)},"bar")),ko(function(t){t.eachSeriesByType("bar",function(t){t.getData().setVisual("legendSymbol","roundRect")})});var jg=function(t,e,n){e=y(e)&&{coordDimensions:e}||a({},e);var i=t.getSource(),r=xp(i,e),o=new vp(r,t);return o.initData(i,n),o},$g={updateSelectedMap:function(t){if(y(t))this._targetList=t.slice();else for(var e=t,n=e.mapDimension("value"),t=this._targetList=[],i=0,r=e.count();i<r;i++)t.push({name:e.getName(i),value:e.get(n,i),selected:va(e,i,"selected")});this._selectTargetMap=p(t||[],function(t,e){return t.set(e.name,e),t},R())},select:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);"single"===this.get("selectedMode")&&this._selectTargetMap.each(function(t){t.selected=!1}),n&&(n.selected=!0)},unSelect:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);n&&(n.selected=!1)},toggleSelected:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);if(null!=n)return this[n.selected?"unSelect":"select"](t,e),n.selected},isSelected:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);return n&&n.selected}},Kg=Oo({type:"series.pie",init:function(t){Kg.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(this.getRawData()),this._defaultLabelLine(t)},mergeOption:function(t){Kg.superCall(this,"mergeOption",t),this.updateSelectedMap(this.getRawData())},getInitialData:function(t,e){return jg(this,["value"])},getDataParams:function(t){var e=this.getData(),n=Kg.superCall(this,"getDataParams",t),i=[];return e.each(e.mapDimension("value"),function(t){i.push(t)}),n.percent=rr(i,t,e.hostModel.get("percentPrecision")),n.$vars.push("percent"),n},_defaultLabelLine:function(t){sn(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,hoverOffset:10,avoidLabelOverlap:!0,percentPrecision:2,stillShowZeroSum:!0,label:{rotate:!1,show:!0,position:"outer"},labelLine:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1},animationType:"expansion",animationEasing:"cubicOut"}});u(Kg,$g);var Qg=Ol.prototype;Qg.updateData=function(t,e,n){function i(){s.stopAnimation(!0),s.animateTo({shape:{r:u.r+l.get("hoverOffset")}},300,"elasticOut")}function r(){s.stopAnimation(!0),s.animateTo({shape:{r:u.r}},300,"elasticOut")}var s=this.childAt(0),l=t.hostModel,h=t.getItemModel(e),u=t.getItemLayout(e),c=a({},u);c.label=null,n?(s.setShape(c),"scale"===l.getShallow("animationType")?(s.shape.r=u.r0,Xi(s,{shape:{r:u.r}},l,e)):(s.shape.endAngle=u.startAngle,qi(s,{shape:{endAngle:u.endAngle}},l,e))):qi(s,{shape:c},l,e);var f=t.getItemVisual(e,"color");s.useStyle(o({lineJoin:"bevel",fill:f},h.getModel("itemStyle").getItemStyle())),s.hoverStyle=h.getModel("emphasis.itemStyle").getItemStyle();var d=h.getShallow("cursor");d&&s.attr("cursor",d),Pl(this,t.getItemLayout(e),l.isSelected(null,e),l.get("selectedOffset"),l.get("animation")),s.off("mouseover").off("mouseout").off("emphasis").off("normal"),h.get("hoverAnimation")&&l.isAnimationEnabled()&&s.on("mouseover",i).on("mouseout",r).on("emphasis",i).on("normal",r),this._updateLabel(t,e),Oi(this)},Qg._updateLabel=function(t,e){var n=this.childAt(1),i=this.childAt(2),r=t.hostModel,a=t.getItemModel(e),o=t.getItemLayout(e).label,s=t.getItemVisual(e,"color");qi(n,{shape:{points:o.linePoints||[[o.x,o.y],[o.x,o.y],[o.x,o.y]]}},r,e),qi(i,{style:{x:o.x,y:o.y}},r,e),i.attr({rotation:o.rotation,origin:[o.x,o.y],z2:10});var l=a.getModel("label"),h=a.getModel("emphasis.label"),u=a.getModel("labelLine"),c=a.getModel("emphasis.labelLine"),s=t.getItemVisual(e,"color");Ei(i.style,i.hoverStyle={},l,h,{labelFetcher:t.hostModel,labelDataIndex:e,defaultText:t.getName(e),autoColor:s,useInsideStyle:!!o.inside},{textAlign:o.textAlign,textVerticalAlign:o.verticalAlign,opacity:t.getItemVisual(e,"opacity")}),i.ignore=i.normalIgnore=!l.get("show"),i.hoverIgnore=!h.get("show"),n.ignore=n.normalIgnore=!u.get("show"),n.hoverIgnore=!c.get("show"),n.setStyle({stroke:s,opacity:t.getItemVisual(e,"opacity")}),n.setStyle(u.getModel("lineStyle").getLineStyle()),n.hoverStyle=c.getModel("lineStyle").getLineStyle();var f=u.get("smooth");f&&!0===f&&(f=.4),n.setShape({smooth:f})},h(Ol,Oh);Da.extend({type:"pie",init:function(){var t=new Oh;this._sectorGroup=t},render:function(t,e,n,i){if(!i||i.from!==this.uid){var r=t.getData(),a=this._data,o=this.group,s=e.get("animation"),l=!a,h=t.get("animationType"),u=v(Ll,this.uid,t,s,n),c=t.get("selectedMode");if(r.diff(a).add(function(t){var e=new Ol(r,t);l&&"scale"!==h&&e.eachChild(function(t){t.stopAnimation(!0)}),c&&e.on("click",u),r.setItemGraphicEl(t,e),o.add(e)}).update(function(t,e){var n=a.getItemGraphicEl(e);n.updateData(r,t),n.off("click"),c&&n.on("click",u),o.add(n),r.setItemGraphicEl(t,n)}).remove(function(t){var e=a.getItemGraphicEl(t);o.remove(e)}).execute(),s&&l&&r.count()>0&&"scale"!==h){var f=r.getItemLayout(0),d=Math.max(n.getWidth(),n.getHeight())/2,p=m(o.removeClipPath,o);o.setClipPath(this._createClipPath(f.cx,f.cy,d,f.startAngle,f.clockwise,p,t))}this._data=r}},dispose:function(){},_createClipPath:function(t,e,n,i,r,a,o){var s=new Vc({shape:{cx:t,cy:e,r0:0,r:n,startAngle:i,endAngle:i,clockwise:r}});return Xi(s,{shape:{endAngle:i+(r?1:-1)*Math.PI*2}},o,a),s},containPoint:function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,a=Math.sqrt(i*i+r*r);return a<=n.r&&a>=n.r0}}});var Jg=function(t,e,n,i){var r,a,o=t.getData(),s=[],l=!1;o.each(function(n){var i,h,u,c,f=o.getItemLayout(n),d=o.getItemModel(n),p=d.getModel("label"),g=p.get("position")||d.get("emphasis.label.position"),m=d.getModel("labelLine"),v=m.get("length"),y=m.get("length2"),_=(f.startAngle+f.endAngle)/2,x=Math.cos(_),w=Math.sin(_);r=f.cx,a=f.cy;var b="inside"===g||"inner"===g;if("center"===g)i=f.cx,h=f.cy,c="center";else{var S=(b?(f.r+f.r0)/2*x:f.r*x)+r,M=(b?(f.r+f.r0)/2*w:f.r*w)+a;if(i=S+3*x,h=M+3*w,!b){var T=S+x*(v+e-f.r),I=M+w*(v+e-f.r),C=T+(x<0?-1:1)*y,k=I;i=C+(x<0?-5:5),h=k,u=[[S,M],[T,I],[C,k]]}c=b?"center":x>0?"left":"right"}var D=p.getFont(),A=p.get("rotate")?x<0?-_+Math.PI:-_:0,L=ee(t.getFormattedLabel(n,"normal")||o.getName(n),D,c,"top");l=!!A,f.label={x:i,y:h,position:g,height:L.height,len:v,len2:y,linePoints:u,textAlign:c,verticalAlign:"middle",rotation:A,inside:b},b||s.push(f.label)}),!l&&t.get("avoidLabelOverlap")&&Bl(s,r,a,e,n,i)},tm=2*Math.PI,em=Math.PI/180;!function(t,e){f(e,function(e){e.update="updateView",Io(e,function(n,i){var r={};return i.eachComponent({mainType:"series",subType:t,query:n},function(t){t[e.method]&&t[e.method](n.name,n.dataIndex);var i=t.getData();i.each(function(e){var n=i.getName(e);r[n]=t.isSelected(n)||!1})}),{name:n.name,selected:r}})})}("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),ko(function(t){return{getTargetSeries:function(e){var n={},i=R();return e.eachSeriesByType(t,function(t){t.__paletteScope=n,i.set(t.uid,t)}),i},reset:function(t,e){var n=t.getRawData(),i={},r=t.getData();r.each(function(t){var e=r.getRawIndex(t);i[e]=t}),n.each(function(e){var a=i[e],o=null!=a&&r.getItemVisual(a,"color",!0);if(o)n.setItemVisual(e,"color",o);else{var s=n.getItemModel(e).get("itemStyle.color")||t.getColorFromPalette(n.getName(e),t.__paletteScope,n.count());n.setItemVisual(e,"color",s),null!=a&&r.setItemVisual(a,"color",s)}})}}}("pie")),Co(v(function(t,e,n,i){e.eachSeriesByType(t,function(t){var e=t.getData(),i=e.mapDimension("value"),r=t.get("center"),a=t.get("radius");y(a)||(a=[0,a]),y(r)||(r=[r,r]);var o=n.getWidth(),s=n.getHeight(),l=Math.min(o,s),h=tr(r[0],o),u=tr(r[1],s),c=tr(a[0],l/2),f=tr(a[1],l/2),d=-t.get("startAngle")*em,p=t.get("minAngle")*em,g=0;e.each(i,function(t){!isNaN(t)&&g++});var m=e.getSum(i),v=Math.PI/(m||g)*2,_=t.get("clockwise"),x=t.get("roseType"),w=t.get("stillShowZeroSum"),b=e.getDataExtent(i);b[0]=0;var S=tm,M=0,T=d,I=_?1:-1;if(e.each(i,function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:_,cx:h,cy:u,r0:c,r:x?NaN:f});else{(i="area"!==x?0===m&&w?v:t*v:tm/g)<p?(i=p,S-=p):M+=t;var r=T+I*i;e.setItemLayout(n,{angle:i,startAngle:T,endAngle:r,clockwise:_,cx:h,cy:u,r0:c,r:x?Ji(t,b,[c,f]):f}),T=r}},!0),S<tm&&g)if(S<=.001){var C=tm/g;e.each(i,function(t,n){if(!isNaN(t)){var i=e.getItemLayout(n);i.angle=C,i.startAngle=d+I*n*C,i.endAngle=d+I*(n+1)*C}})}else v=S/M,T=d,e.each(i,function(t,n){if(!isNaN(t)){var i=e.getItemLayout(n),r=i.angle===p?p:t*v;i.startAngle=T,i.endAngle=T+I*r,T+=I*r}});Jg(t,f,o,s)})},"pie")),To(function(t){return{seriesType:t,reset:function(t,e){var n=e.findComponents({mainType:"legend"});if(n&&n.length){var i=t.getData();i.filterSelf(function(t){for(var e=i.getName(t),r=0;r<n.length;r++)if(!n[r].isSelected(e))return!1;return!0},this)}}}}("pie")),t.version="4.0.2",t.dependencies=zd,t.PRIORITY=Wd,t.init=function(t,e,n){var i=bo(t);if(i)return i;var r=new Ja(t,e,n);return r.id="ec_"+rp++,np[r.id]=r,vn(t,op,r.id),xo(r),r},t.connect=function(t){if(y(t)){var e=t;t=null,Od(e,function(e){null!=e.group&&(t=e.group)}),t=t||"g_"+ap++,Od(e,function(e){e.group=t})}return ip[t]=!0,t},t.disConnect=wo,t.disconnect=lp,t.dispose=function(t){"string"==typeof t?t=np[t]:t instanceof Ja||(t=bo(t)),t instanceof Ja&&!t.isDisposed()&&t.dispose()},t.getInstanceByDom=bo,t.getInstanceById=function(t){return np[t]},t.registerTheme=So,t.registerPreprocessor=Mo,t.registerProcessor=To,t.registerPostUpdate=function(t){Qd.push(t)},t.registerAction=Io,t.registerCoordinateSystem=function(t,e){Xr.register(t,e)},t.getCoordinateSystemDimensions=function(t){var e=Xr.get(t);if(e)return e.getDimensionsInfo?e.getDimensionsInfo():e.dimensions.slice()},t.registerLayout=Co,t.registerVisual=ko,t.registerLoading=Ao,t.extendComponentModel=Lo,t.extendComponentView=Po,t.extendSeriesModel=Oo,t.extendChartView=Eo,t.setCanvasCreator=function(t){e("createCanvas",t)},t.registerMap=function(t,e,n){e.geoJson&&!e.features&&(n=e.specialAreas,e=e.geoJson),"string"==typeof e&&(e="undefined"!=typeof JSON&&JSON.parse?JSON.parse(e):new Function("return ("+e+");")()),sp[t]={geoJson:e,specialAreas:n}},t.getMap=function(t){return sp[t]},t.dataTool=hp});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/chosen/chosen.jquery.js b/management/guns-admin/src/main/webapp/static/js/plugins/chosen/chosen.jquery.js
new file mode 100644
index 0000000..e7181e9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/chosen/chosen.jquery.js
@@ -0,0 +1,1211 @@
+/*!
+ Chosen, a Select Box Enhancer for jQuery and Prototype
+ by Patrick Filler for Harvest, http://getharvest.com
+
+ Version 1.1.0
+ Full source at https://github.com/harvesthq/chosen
+ Copyright (c) 2011 Harvest http://getharvest.com
+
+ MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+ This file is generated by `grunt build`, do not edit it by hand.
+ */
+
+(function() {
+    var $, AbstractChosen, Chosen, SelectParser, _ref,
+        __hasProp = {}.hasOwnProperty,
+        __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+    SelectParser = (function() {
+        function SelectParser() {
+            this.options_index = 0;
+            this.parsed = [];
+        }
+
+        SelectParser.prototype.add_node = function(child) {
+            if (child.nodeName.toUpperCase() === "OPTGROUP") {
+                return this.add_group(child);
+            } else {
+                return this.add_option(child);
+            }
+        };
+
+        SelectParser.prototype.add_group = function(group) {
+            var group_position, option, _i, _len, _ref, _results;
+            group_position = this.parsed.length;
+            this.parsed.push({
+                array_index: group_position,
+                group: true,
+                label: this.escapeExpression(group.label),
+                children: 0,
+                disabled: group.disabled
+            });
+            _ref = group.childNodes;
+            _results = [];
+            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+                option = _ref[_i];
+                _results.push(this.add_option(option, group_position, group.disabled));
+            }
+            return _results;
+        };
+
+        SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
+            if (option.nodeName.toUpperCase() === "OPTION") {
+                if (option.text !== "") {
+                    if (group_position != null) {
+                        this.parsed[group_position].children += 1;
+                    }
+                    this.parsed.push({
+                        array_index: this.parsed.length,
+                        options_index: this.options_index,
+                        value: option.value,
+                        text: option.text,
+                        html: option.innerHTML,
+                        selected: option.selected,
+                        disabled: group_disabled === true ? group_disabled : option.disabled,
+                        group_array_index: group_position,
+                        classes: option.className,
+                        style: option.style.cssText
+                    });
+                } else {
+                    this.parsed.push({
+                        array_index: this.parsed.length,
+                        options_index: this.options_index,
+                        empty: true
+                    });
+                }
+                return this.options_index += 1;
+            }
+        };
+
+        SelectParser.prototype.escapeExpression = function(text) {
+            var map, unsafe_chars;
+            if ((text == null) || text === false) {
+                return "";
+            }
+            if (!/[\&\<\>\"\'\`]/.test(text)) {
+                return text;
+            }
+            map = {
+                "<": "&lt;",
+                ">": "&gt;",
+                '"': "&quot;",
+                "'": "&#x27;",
+                "`": "&#x60;"
+            };
+            unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g;
+            return text.replace(unsafe_chars, function(chr) {
+                return map[chr] || "&amp;";
+            });
+        };
+
+        return SelectParser;
+
+    })();
+
+    SelectParser.select_to_array = function(select) {
+        var child, parser, _i, _len, _ref;
+        parser = new SelectParser();
+        _ref = select.childNodes;
+        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+            child = _ref[_i];
+            parser.add_node(child);
+        }
+        return parser.parsed;
+    };
+
+    AbstractChosen = (function() {
+        function AbstractChosen(form_field, options) {
+            this.form_field = form_field;
+            this.options = options != null ? options : {};
+            if (!AbstractChosen.browser_is_supported()) {
+                return;
+            }
+            this.is_multiple = this.form_field.multiple;
+            this.set_default_text();
+            this.set_default_values();
+            this.setup();
+            this.set_up_html();
+            this.register_observers();
+        }
+
+        AbstractChosen.prototype.set_default_values = function() {
+            var _this = this;
+            this.click_test_action = function(evt) {
+                return _this.test_active_click(evt);
+            };
+            this.activate_action = function(evt) {
+                return _this.activate_field(evt);
+            };
+            this.active_field = false;
+            this.mouse_on_container = false;
+            this.results_showing = false;
+            this.result_highlighted = null;
+            this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
+            this.disable_search_threshold = this.options.disable_search_threshold || 0;
+            this.disable_search = this.options.disable_search || false;
+            this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
+            this.group_search = this.options.group_search != null ? this.options.group_search : true;
+            this.search_contains = this.options.search_contains || false;
+            this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;
+            this.max_selected_options = this.options.max_selected_options || Infinity;
+            this.inherit_select_classes = this.options.inherit_select_classes || false;
+            this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;
+            return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;
+        };
+
+        AbstractChosen.prototype.set_default_text = function() {
+            if (this.form_field.getAttribute("data-placeholder")) {
+                this.default_text = this.form_field.getAttribute("data-placeholder");
+            } else if (this.is_multiple) {
+                this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
+            } else {
+                this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
+            }
+            return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
+        };
+
+        AbstractChosen.prototype.mouse_enter = function() {
+            return this.mouse_on_container = true;
+        };
+
+        AbstractChosen.prototype.mouse_leave = function() {
+            return this.mouse_on_container = false;
+        };
+
+        AbstractChosen.prototype.input_focus = function(evt) {
+            var _this = this;
+            if (this.is_multiple) {
+                if (!this.active_field) {
+                    return setTimeout((function() {
+                        return _this.container_mousedown();
+                    }), 50);
+                }
+            } else {
+                if (!this.active_field) {
+                    return this.activate_field();
+                }
+            }
+        };
+
+        AbstractChosen.prototype.input_blur = function(evt) {
+            var _this = this;
+            if (!this.mouse_on_container) {
+                this.active_field = false;
+                return setTimeout((function() {
+                    return _this.blur_test();
+                }), 100);
+            }
+        };
+
+        AbstractChosen.prototype.results_option_build = function(options) {
+            var content, data, _i, _len, _ref;
+            content = '';
+            _ref = this.results_data;
+            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+                data = _ref[_i];
+                if (data.group) {
+                    content += this.result_add_group(data);
+                } else {
+                    content += this.result_add_option(data);
+                }
+                if (options != null ? options.first : void 0) {
+                    if (data.selected && this.is_multiple) {
+                        this.choice_build(data);
+                    } else if (data.selected && !this.is_multiple) {
+                        this.single_set_selected_text(data.text);
+                    }
+                }
+            }
+            return content;
+        };
+
+        AbstractChosen.prototype.result_add_option = function(option) {
+            var classes, option_el;
+            if (!option.search_match) {
+                return '';
+            }
+            if (!this.include_option_in_results(option)) {
+                return '';
+            }
+            classes = [];
+            if (!option.disabled && !(option.selected && this.is_multiple)) {
+                classes.push("active-result");
+            }
+            if (option.disabled && !(option.selected && this.is_multiple)) {
+                classes.push("disabled-result");
+            }
+            if (option.selected) {
+                classes.push("result-selected");
+            }
+            if (option.group_array_index != null) {
+                classes.push("group-option");
+            }
+            if (option.classes !== "") {
+                classes.push(option.classes);
+            }
+            option_el = document.createElement("li");
+            option_el.className = classes.join(" ");
+            option_el.style.cssText = option.style;
+            option_el.setAttribute("data-option-array-index", option.array_index);
+            option_el.innerHTML = option.search_text;
+            return this.outerHTML(option_el);
+        };
+
+        AbstractChosen.prototype.result_add_group = function(group) {
+            var group_el;
+            if (!(group.search_match || group.group_match)) {
+                return '';
+            }
+            if (!(group.active_options > 0)) {
+                return '';
+            }
+            group_el = document.createElement("li");
+            group_el.className = "group-result";
+            group_el.innerHTML = group.search_text;
+            return this.outerHTML(group_el);
+        };
+
+        AbstractChosen.prototype.results_update_field = function() {
+            this.set_default_text();
+            if (!this.is_multiple) {
+                this.results_reset_cleanup();
+            }
+            this.result_clear_highlight();
+            this.results_build();
+            if (this.results_showing) {
+                return this.winnow_results();
+            }
+        };
+
+        AbstractChosen.prototype.reset_single_select_options = function() {
+            var result, _i, _len, _ref, _results;
+            _ref = this.results_data;
+            _results = [];
+            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+                result = _ref[_i];
+                if (result.selected) {
+                    _results.push(result.selected = false);
+                } else {
+                    _results.push(void 0);
+                }
+            }
+            return _results;
+        };
+
+        AbstractChosen.prototype.results_toggle = function() {
+            if (this.results_showing) {
+                return this.results_hide();
+            } else {
+                return this.results_show();
+            }
+        };
+
+        AbstractChosen.prototype.results_search = function(evt) {
+            if (this.results_showing) {
+                return this.winnow_results();
+            } else {
+                return this.results_show();
+            }
+        };
+
+        AbstractChosen.prototype.winnow_results = function() {
+            var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref;
+            this.no_results_clear();
+            results = 0;
+            searchText = this.get_search_text();
+            escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+            regexAnchor = this.search_contains ? "" : "^";
+            regex = new RegExp(regexAnchor + escapedSearchText, 'i');
+            zregex = new RegExp(escapedSearchText, 'i');
+            _ref = this.results_data;
+            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+                option = _ref[_i];
+                option.search_match = false;
+                results_group = null;
+                if (this.include_option_in_results(option)) {
+                    if (option.group) {
+                        option.group_match = false;
+                        option.active_options = 0;
+                    }
+                    if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {
+                        results_group = this.results_data[option.group_array_index];
+                        if (results_group.active_options === 0 && results_group.search_match) {
+                            results += 1;
+                        }
+                        results_group.active_options += 1;
+                    }
+                    if (!(option.group && !this.group_search)) {
+                        option.search_text = option.group ? option.label : option.html;
+                        option.search_match = this.search_string_match(option.search_text, regex);
+                        if (option.search_match && !option.group) {
+                            results += 1;
+                        }
+                        if (option.search_match) {
+                            if (searchText.length) {
+                                startpos = option.search_text.search(zregex);
+                                text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length);
+                                option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
+                            }
+                            if (results_group != null) {
+                                results_group.group_match = true;
+                            }
+                        } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {
+                            option.search_match = true;
+                        }
+                    }
+                }
+            }
+            this.result_clear_highlight();
+            if (results < 1 && searchText.length) {
+                this.update_results_content("");
+                return this.no_results(searchText);
+            } else {
+                this.update_results_content(this.results_option_build());
+                return this.winnow_results_set_highlight();
+            }
+        };
+
+        AbstractChosen.prototype.search_string_match = function(search_string, regex) {
+            var part, parts, _i, _len;
+            if (regex.test(search_string)) {
+                return true;
+            } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) {
+                parts = search_string.replace(/\[|\]/g, "").split(" ");
+                if (parts.length) {
+                    for (_i = 0, _len = parts.length; _i < _len; _i++) {
+                        part = parts[_i];
+                        if (regex.test(part)) {
+                            return true;
+                        }
+                    }
+                }
+            }
+        };
+
+        AbstractChosen.prototype.choices_count = function() {
+            var option, _i, _len, _ref;
+            if (this.selected_option_count != null) {
+                return this.selected_option_count;
+            }
+            this.selected_option_count = 0;
+            _ref = this.form_field.options;
+            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+                option = _ref[_i];
+                if (option.selected) {
+                    this.selected_option_count += 1;
+                }
+            }
+            return this.selected_option_count;
+        };
+
+        AbstractChosen.prototype.choices_click = function(evt) {
+            evt.preventDefault();
+            if (!(this.results_showing || this.is_disabled)) {
+                return this.results_show();
+            }
+        };
+
+        AbstractChosen.prototype.keyup_checker = function(evt) {
+            var stroke, _ref;
+            stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+            this.search_field_scale();
+            switch (stroke) {
+                case 8:
+                    if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {
+                        return this.keydown_backstroke();
+                    } else if (!this.pending_backstroke) {
+                        this.result_clear_highlight();
+                        return this.results_search();
+                    }
+                    break;
+                case 13:
+                    evt.preventDefault();
+                    if (this.results_showing) {
+                        return this.result_select(evt);
+                    }
+                    break;
+                case 27:
+                    if (this.results_showing) {
+                        this.results_hide();
+                    }
+                    return true;
+                case 9:
+                case 38:
+                case 40:
+                case 16:
+                case 91:
+                case 17:
+                    break;
+                default:
+                    return this.results_search();
+            }
+        };
+
+        AbstractChosen.prototype.clipboard_event_checker = function(evt) {
+            var _this = this;
+            return setTimeout((function() {
+                return _this.results_search();
+            }), 50);
+        };
+
+        AbstractChosen.prototype.container_width = function() {
+            if (this.options.width != null) {
+                return this.options.width;
+            } else {
+                return "" + this.form_field.offsetWidth + "px";
+            }
+        };
+
+        AbstractChosen.prototype.include_option_in_results = function(option) {
+            if (this.is_multiple && (!this.display_selected_options && option.selected)) {
+                return false;
+            }
+            if (!this.display_disabled_options && option.disabled) {
+                return false;
+            }
+            if (option.empty) {
+                return false;
+            }
+            return true;
+        };
+
+        AbstractChosen.prototype.search_results_touchstart = function(evt) {
+            this.touch_started = true;
+            return this.search_results_mouseover(evt);
+        };
+
+        AbstractChosen.prototype.search_results_touchmove = function(evt) {
+            this.touch_started = false;
+            return this.search_results_mouseout(evt);
+        };
+
+        AbstractChosen.prototype.search_results_touchend = function(evt) {
+            if (this.touch_started) {
+                return this.search_results_mouseup(evt);
+            }
+        };
+
+        AbstractChosen.prototype.outerHTML = function(element) {
+            var tmp;
+            if (element.outerHTML) {
+                return element.outerHTML;
+            }
+            tmp = document.createElement("div");
+            tmp.appendChild(element);
+            return tmp.innerHTML;
+        };
+
+        AbstractChosen.browser_is_supported = function() {
+            if (window.navigator.appName === "Microsoft Internet Explorer") {
+                return document.documentMode >= 8;
+            }
+            if (/iP(od|hone)/i.test(window.navigator.userAgent)) {
+                return false;
+            }
+            if (/Android/i.test(window.navigator.userAgent)) {
+                if (/Mobile/i.test(window.navigator.userAgent)) {
+                    return false;
+                }
+            }
+            return true;
+        };
+
+        AbstractChosen.default_multiple_text = "Select Some Options";
+
+        AbstractChosen.default_single_text = "Select an Option";
+
+        AbstractChosen.default_no_result_text = "No results match";
+
+        return AbstractChosen;
+
+    })();
+
+    $ = jQuery;
+
+    $.fn.extend({
+        chosen: function(options) {
+            if (!AbstractChosen.browser_is_supported()) {
+                return this;
+            }
+            return this.each(function(input_field) {
+                var $this, chosen;
+                $this = $(this);
+                chosen = $this.data('chosen');
+                if (options === 'destroy' && chosen) {
+                    chosen.destroy();
+                } else if (!chosen) {
+                    $this.data('chosen', new Chosen(this, options));
+                }
+            });
+        }
+    });
+
+    Chosen = (function(_super) {
+        __extends(Chosen, _super);
+
+        function Chosen() {
+            _ref = Chosen.__super__.constructor.apply(this, arguments);
+            return _ref;
+        }
+
+        Chosen.prototype.setup = function() {
+            this.form_field_jq = $(this.form_field);
+            this.current_selectedIndex = this.form_field.selectedIndex;
+            return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl");
+        };
+
+        Chosen.prototype.set_up_html = function() {
+            var container_classes, container_props;
+            container_classes = ["chosen-container"];
+            container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single"));
+            if (this.inherit_select_classes && this.form_field.className) {
+                container_classes.push(this.form_field.className);
+            }
+            if (this.is_rtl) {
+                container_classes.push("chosen-rtl");
+            }
+            container_props = {
+                'class': container_classes.join(' '),
+                'style': "width: " + (this.container_width()) + ";",
+                'title': this.form_field.title
+            };
+            if (this.form_field.id.length) {
+                container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen";
+            }
+            this.container = $("<div />", container_props);
+            if (this.is_multiple) {
+                this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>');
+            } else {
+                this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>');
+            }
+            this.form_field_jq.hide().after(this.container);
+            this.dropdown = this.container.find('div.chosen-drop').first();
+            this.search_field = this.container.find('input').first();
+            this.search_results = this.container.find('ul.chosen-results').first();
+            this.search_field_scale();
+            this.search_no_results = this.container.find('li.no-results').first();
+            if (this.is_multiple) {
+                this.search_choices = this.container.find('ul.chosen-choices').first();
+                this.search_container = this.container.find('li.search-field').first();
+            } else {
+                this.search_container = this.container.find('div.chosen-search').first();
+                this.selected_item = this.container.find('.chosen-single').first();
+            }
+            this.results_build();
+            this.set_tab_index();
+            this.set_label_behavior();
+            return this.form_field_jq.trigger("chosen:ready", {
+                chosen: this
+            });
+        };
+
+        Chosen.prototype.register_observers = function() {
+            var _this = this;
+            this.container.bind('mousedown.chosen', function(evt) {
+                _this.container_mousedown(evt);
+            });
+            this.container.bind('mouseup.chosen', function(evt) {
+                _this.container_mouseup(evt);
+            });
+            this.container.bind('mouseenter.chosen', function(evt) {
+                _this.mouse_enter(evt);
+            });
+            this.container.bind('mouseleave.chosen', function(evt) {
+                _this.mouse_leave(evt);
+            });
+            this.search_results.bind('mouseup.chosen', function(evt) {
+                _this.search_results_mouseup(evt);
+            });
+            this.search_results.bind('mouseover.chosen', function(evt) {
+                _this.search_results_mouseover(evt);
+            });
+            this.search_results.bind('mouseout.chosen', function(evt) {
+                _this.search_results_mouseout(evt);
+            });
+            this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) {
+                _this.search_results_mousewheel(evt);
+            });
+            this.search_results.bind('touchstart.chosen', function(evt) {
+                _this.search_results_touchstart(evt);
+            });
+            this.search_results.bind('touchmove.chosen', function(evt) {
+                _this.search_results_touchmove(evt);
+            });
+            this.search_results.bind('touchend.chosen', function(evt) {
+                _this.search_results_touchend(evt);
+            });
+            this.form_field_jq.bind("chosen:updated.chosen", function(evt) {
+                _this.results_update_field(evt);
+            });
+            this.form_field_jq.bind("chosen:activate.chosen", function(evt) {
+                _this.activate_field(evt);
+            });
+            this.form_field_jq.bind("chosen:open.chosen", function(evt) {
+                _this.container_mousedown(evt);
+            });
+            this.form_field_jq.bind("chosen:close.chosen", function(evt) {
+                _this.input_blur(evt);
+            });
+            this.search_field.bind('blur.chosen', function(evt) {
+                _this.input_blur(evt);
+            });
+            this.search_field.bind('keyup.chosen', function(evt) {
+                _this.keyup_checker(evt);
+            });
+            this.search_field.bind('keydown.chosen', function(evt) {
+                _this.keydown_checker(evt);
+            });
+            this.search_field.bind('focus.chosen', function(evt) {
+                _this.input_focus(evt);
+            });
+            this.search_field.bind('cut.chosen', function(evt) {
+                _this.clipboard_event_checker(evt);
+            });
+            this.search_field.bind('paste.chosen', function(evt) {
+                _this.clipboard_event_checker(evt);
+            });
+            if (this.is_multiple) {
+                return this.search_choices.bind('click.chosen', function(evt) {
+                    _this.choices_click(evt);
+                });
+            } else {
+                return this.container.bind('click.chosen', function(evt) {
+                    evt.preventDefault();
+                });
+            }
+        };
+
+        Chosen.prototype.destroy = function() {
+            $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action);
+            if (this.search_field[0].tabIndex) {
+                this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;
+            }
+            this.container.remove();
+            this.form_field_jq.removeData('chosen');
+            return this.form_field_jq.show();
+        };
+
+        Chosen.prototype.search_field_disabled = function() {
+            this.is_disabled = this.form_field_jq[0].disabled;
+            if (this.is_disabled) {
+                this.container.addClass('chosen-disabled');
+                this.search_field[0].disabled = true;
+                if (!this.is_multiple) {
+                    this.selected_item.unbind("focus.chosen", this.activate_action);
+                }
+                return this.close_field();
+            } else {
+                this.container.removeClass('chosen-disabled');
+                this.search_field[0].disabled = false;
+                if (!this.is_multiple) {
+                    return this.selected_item.bind("focus.chosen", this.activate_action);
+                }
+            }
+        };
+
+        Chosen.prototype.container_mousedown = function(evt) {
+            if (!this.is_disabled) {
+                if (evt && evt.type === "mousedown" && !this.results_showing) {
+                    evt.preventDefault();
+                }
+                if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
+                    if (!this.active_field) {
+                        if (this.is_multiple) {
+                            this.search_field.val("");
+                        }
+                        $(this.container[0].ownerDocument).bind('click.chosen', this.click_test_action);
+                        this.results_show();
+                    } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) {
+                        evt.preventDefault();
+                        this.results_toggle();
+                    }
+                    return this.activate_field();
+                }
+            }
+        };
+
+        Chosen.prototype.container_mouseup = function(evt) {
+            if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
+                return this.results_reset(evt);
+            }
+        };
+
+        Chosen.prototype.search_results_mousewheel = function(evt) {
+            var delta;
+            if (evt.originalEvent) {
+                delta = -evt.originalEvent.wheelDelta || evt.originalEvent.detail;
+            }
+            if (delta != null) {
+                evt.preventDefault();
+                if (evt.type === 'DOMMouseScroll') {
+                    delta = delta * 40;
+                }
+                return this.search_results.scrollTop(delta + this.search_results.scrollTop());
+            }
+        };
+
+        Chosen.prototype.blur_test = function(evt) {
+            if (!this.active_field && this.container.hasClass("chosen-container-active")) {
+                return this.close_field();
+            }
+        };
+
+        Chosen.prototype.close_field = function() {
+            $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action);
+            this.active_field = false;
+            this.results_hide();
+            this.container.removeClass("chosen-container-active");
+            this.clear_backstroke();
+            this.show_search_field_default();
+            return this.search_field_scale();
+        };
+
+        Chosen.prototype.activate_field = function() {
+            this.container.addClass("chosen-container-active");
+            this.active_field = true;
+            this.search_field.val(this.search_field.val());
+            return this.search_field.focus();
+        };
+
+        Chosen.prototype.test_active_click = function(evt) {
+            var active_container;
+            active_container = $(evt.target).closest('.chosen-container');
+            if (active_container.length && this.container[0] === active_container[0]) {
+                return this.active_field = true;
+            } else {
+                return this.close_field();
+            }
+        };
+
+        Chosen.prototype.results_build = function() {
+            this.parsing = true;
+            this.selected_option_count = null;
+            this.results_data = SelectParser.select_to_array(this.form_field);
+            if (this.is_multiple) {
+                this.search_choices.find("li.search-choice").remove();
+            } else if (!this.is_multiple) {
+                this.single_set_selected_text();
+                if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
+                    this.search_field[0].readOnly = true;
+                    this.container.addClass("chosen-container-single-nosearch");
+                } else {
+                    this.search_field[0].readOnly = false;
+                    this.container.removeClass("chosen-container-single-nosearch");
+                }
+            }
+            this.update_results_content(this.results_option_build({
+                first: true
+            }));
+            this.search_field_disabled();
+            this.show_search_field_default();
+            this.search_field_scale();
+            return this.parsing = false;
+        };
+
+        Chosen.prototype.result_do_highlight = function(el) {
+            var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
+            if (el.length) {
+                this.result_clear_highlight();
+                this.result_highlight = el;
+                this.result_highlight.addClass("highlighted");
+                maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
+                visible_top = this.search_results.scrollTop();
+                visible_bottom = maxHeight + visible_top;
+                high_top = this.result_highlight.position().top + this.search_results.scrollTop();
+                high_bottom = high_top + this.result_highlight.outerHeight();
+                if (high_bottom >= visible_bottom) {
+                    return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
+                } else if (high_top < visible_top) {
+                    return this.search_results.scrollTop(high_top);
+                }
+            }
+        };
+
+        Chosen.prototype.result_clear_highlight = function() {
+            if (this.result_highlight) {
+                this.result_highlight.removeClass("highlighted");
+            }
+            return this.result_highlight = null;
+        };
+
+        Chosen.prototype.results_show = function() {
+            if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
+                this.form_field_jq.trigger("chosen:maxselected", {
+                    chosen: this
+                });
+                return false;
+            }
+            this.container.addClass("chosen-with-drop");
+            this.results_showing = true;
+            this.search_field.focus();
+            this.search_field.val(this.search_field.val());
+            this.winnow_results();
+            return this.form_field_jq.trigger("chosen:showing_dropdown", {
+                chosen: this
+            });
+        };
+
+        Chosen.prototype.update_results_content = function(content) {
+            return this.search_results.html(content);
+        };
+
+        Chosen.prototype.results_hide = function() {
+            if (this.results_showing) {
+                this.result_clear_highlight();
+                this.container.removeClass("chosen-with-drop");
+                this.form_field_jq.trigger("chosen:hiding_dropdown", {
+                    chosen: this
+                });
+            }
+            return this.results_showing = false;
+        };
+
+        Chosen.prototype.set_tab_index = function(el) {
+            var ti;
+            if (this.form_field.tabIndex) {
+                ti = this.form_field.tabIndex;
+                this.form_field.tabIndex = -1;
+                return this.search_field[0].tabIndex = ti;
+            }
+        };
+
+        Chosen.prototype.set_label_behavior = function() {
+            var _this = this;
+            this.form_field_label = this.form_field_jq.parents("label");
+            if (!this.form_field_label.length && this.form_field.id.length) {
+                this.form_field_label = $("label[for='" + this.form_field.id + "']");
+            }
+            if (this.form_field_label.length > 0) {
+                return this.form_field_label.bind('click.chosen', function(evt) {
+                    if (_this.is_multiple) {
+                        return _this.container_mousedown(evt);
+                    } else {
+                        return _this.activate_field();
+                    }
+                });
+            }
+        };
+
+        Chosen.prototype.show_search_field_default = function() {
+            if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {
+                this.search_field.val(this.default_text);
+                return this.search_field.addClass("default");
+            } else {
+                this.search_field.val("");
+                return this.search_field.removeClass("default");
+            }
+        };
+
+        Chosen.prototype.search_results_mouseup = function(evt) {
+            var target;
+            target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+            if (target.length) {
+                this.result_highlight = target;
+                this.result_select(evt);
+                return this.search_field.focus();
+            }
+        };
+
+        Chosen.prototype.search_results_mouseover = function(evt) {
+            var target;
+            target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+            if (target) {
+                return this.result_do_highlight(target);
+            }
+        };
+
+        Chosen.prototype.search_results_mouseout = function(evt) {
+            if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
+                return this.result_clear_highlight();
+            }
+        };
+
+        Chosen.prototype.choice_build = function(item) {
+            var choice, close_link,
+                _this = this;
+            choice = $('<li />', {
+                "class": "search-choice"
+            }).html("<span>" + item.html + "</span>");
+            if (item.disabled) {
+                choice.addClass('search-choice-disabled');
+            } else {
+                close_link = $('<a />', {
+                    "class": 'search-choice-close',
+                    'data-option-array-index': item.array_index
+                });
+                close_link.bind('click.chosen', function(evt) {
+                    return _this.choice_destroy_link_click(evt);
+                });
+                choice.append(close_link);
+            }
+            return this.search_container.before(choice);
+        };
+
+        Chosen.prototype.choice_destroy_link_click = function(evt) {
+            evt.preventDefault();
+            evt.stopPropagation();
+            if (!this.is_disabled) {
+                return this.choice_destroy($(evt.target));
+            }
+        };
+
+        Chosen.prototype.choice_destroy = function(link) {
+            if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) {
+                this.show_search_field_default();
+                if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) {
+                    this.results_hide();
+                }
+                link.parents('li').first().remove();
+                return this.search_field_scale();
+            }
+        };
+
+        Chosen.prototype.results_reset = function() {
+            this.reset_single_select_options();
+            this.form_field.options[0].selected = true;
+            this.single_set_selected_text();
+            this.show_search_field_default();
+            this.results_reset_cleanup();
+            this.form_field_jq.trigger("change");
+            if (this.active_field) {
+                return this.results_hide();
+            }
+        };
+
+        Chosen.prototype.results_reset_cleanup = function() {
+            this.current_selectedIndex = this.form_field.selectedIndex;
+            return this.selected_item.find("abbr").remove();
+        };
+
+        Chosen.prototype.result_select = function(evt) {
+            var high, item;
+            if (this.result_highlight) {
+                high = this.result_highlight;
+                this.result_clear_highlight();
+                if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
+                    this.form_field_jq.trigger("chosen:maxselected", {
+                        chosen: this
+                    });
+                    return false;
+                }
+                if (this.is_multiple) {
+                    high.removeClass("active-result");
+                } else {
+                    this.reset_single_select_options();
+                }
+                item = this.results_data[high[0].getAttribute("data-option-array-index")];
+                item.selected = true;
+                this.form_field.options[item.options_index].selected = true;
+                this.selected_option_count = null;
+                if (this.is_multiple) {
+                    this.choice_build(item);
+                } else {
+                    this.single_set_selected_text(item.text);
+                }
+                if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
+                    this.results_hide();
+                }
+                this.search_field.val("");
+                if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
+                    this.form_field_jq.trigger("change", {
+                        'selected': this.form_field.options[item.options_index].value
+                    });
+                }
+                this.current_selectedIndex = this.form_field.selectedIndex;
+                return this.search_field_scale();
+            }
+        };
+
+        Chosen.prototype.single_set_selected_text = function(text) {
+            if (text == null) {
+                text = this.default_text;
+            }
+            if (text === this.default_text) {
+                this.selected_item.addClass("chosen-default");
+            } else {
+                this.single_deselect_control_build();
+                this.selected_item.removeClass("chosen-default");
+            }
+            return this.selected_item.find("span").text(text);
+        };
+
+        Chosen.prototype.result_deselect = function(pos) {
+            var result_data;
+            result_data = this.results_data[pos];
+            if (!this.form_field.options[result_data.options_index].disabled) {
+                result_data.selected = false;
+                this.form_field.options[result_data.options_index].selected = false;
+                this.selected_option_count = null;
+                this.result_clear_highlight();
+                if (this.results_showing) {
+                    this.winnow_results();
+                }
+                this.form_field_jq.trigger("change", {
+                    deselected: this.form_field.options[result_data.options_index].value
+                });
+                this.search_field_scale();
+                return true;
+            } else {
+                return false;
+            }
+        };
+
+        Chosen.prototype.single_deselect_control_build = function() {
+            if (!this.allow_single_deselect) {
+                return;
+            }
+            if (!this.selected_item.find("abbr").length) {
+                this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
+            }
+            return this.selected_item.addClass("chosen-single-with-deselect");
+        };
+
+        Chosen.prototype.get_search_text = function() {
+            if (this.search_field.val() === this.default_text) {
+                return "";
+            } else {
+                return $('<div/>').text($.trim(this.search_field.val())).html();
+            }
+        };
+
+        Chosen.prototype.winnow_results_set_highlight = function() {
+            var do_high, selected_results;
+            selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
+            do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
+            if (do_high != null) {
+                return this.result_do_highlight(do_high);
+            }
+        };
+
+        Chosen.prototype.no_results = function(terms) {
+            var no_results_html;
+            no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
+            no_results_html.find("span").first().html(terms);
+            this.search_results.append(no_results_html);
+            return this.form_field_jq.trigger("chosen:no_results", {
+                chosen: this
+            });
+        };
+
+        Chosen.prototype.no_results_clear = function() {
+            return this.search_results.find(".no-results").remove();
+        };
+
+        Chosen.prototype.keydown_arrow = function() {
+            var next_sib;
+            if (this.results_showing && this.result_highlight) {
+                next_sib = this.result_highlight.nextAll("li.active-result").first();
+                if (next_sib) {
+                    return this.result_do_highlight(next_sib);
+                }
+            } else {
+                return this.results_show();
+            }
+        };
+
+        Chosen.prototype.keyup_arrow = function() {
+            var prev_sibs;
+            if (!this.results_showing && !this.is_multiple) {
+                return this.results_show();
+            } else if (this.result_highlight) {
+                prev_sibs = this.result_highlight.prevAll("li.active-result");
+                if (prev_sibs.length) {
+                    return this.result_do_highlight(prev_sibs.first());
+                } else {
+                    if (this.choices_count() > 0) {
+                        this.results_hide();
+                    }
+                    return this.result_clear_highlight();
+                }
+            }
+        };
+
+        Chosen.prototype.keydown_backstroke = function() {
+            var next_available_destroy;
+            if (this.pending_backstroke) {
+                this.choice_destroy(this.pending_backstroke.find("a").first());
+                return this.clear_backstroke();
+            } else {
+                next_available_destroy = this.search_container.siblings("li.search-choice").last();
+                if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
+                    this.pending_backstroke = next_available_destroy;
+                    if (this.single_backstroke_delete) {
+                        return this.keydown_backstroke();
+                    } else {
+                        return this.pending_backstroke.addClass("search-choice-focus");
+                    }
+                }
+            }
+        };
+
+        Chosen.prototype.clear_backstroke = function() {
+            if (this.pending_backstroke) {
+                this.pending_backstroke.removeClass("search-choice-focus");
+            }
+            return this.pending_backstroke = null;
+        };
+
+        Chosen.prototype.keydown_checker = function(evt) {
+            var stroke, _ref1;
+            stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode;
+            this.search_field_scale();
+            if (stroke !== 8 && this.pending_backstroke) {
+                this.clear_backstroke();
+            }
+            switch (stroke) {
+                case 8:
+                    this.backstroke_length = this.search_field.val().length;
+                    break;
+                case 9:
+                    if (this.results_showing && !this.is_multiple) {
+                        this.result_select(evt);
+                    }
+                    this.mouse_on_container = false;
+                    break;
+                case 13:
+                    evt.preventDefault();
+                    break;
+                case 38:
+                    evt.preventDefault();
+                    this.keyup_arrow();
+                    break;
+                case 40:
+                    evt.preventDefault();
+                    this.keydown_arrow();
+                    break;
+            }
+        };
+
+        Chosen.prototype.search_field_scale = function() {
+            var div, f_width, h, style, style_block, styles, w, _i, _len;
+            if (this.is_multiple) {
+                h = 0;
+                w = 0;
+                style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
+                styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
+                for (_i = 0, _len = styles.length; _i < _len; _i++) {
+                    style = styles[_i];
+                    style_block += style + ":" + this.search_field.css(style) + ";";
+                }
+                div = $('<div />', {
+                    'style': style_block
+                });
+                div.text(this.search_field.val());
+                $('body').append(div);
+                w = div.width() + 25;
+                div.remove();
+                f_width = this.container.outerWidth();
+                if (w > f_width - 10) {
+                    w = f_width - 10;
+                }
+                return this.search_field.css({
+                    'width': w + 'px'
+                });
+            }
+        };
+
+        return Chosen;
+
+    })(AbstractChosen);
+
+}).call(this);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/mootools-adapter.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/mootools-adapter.js
new file mode 100644
index 0000000..98446dd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/mootools-adapter.js
@@ -0,0 +1,13 @@
+/*
+ Highcharts JS v2.2.5 (2012-06-08)
+ MooTools adapter
+
+ (c) 2010-2011 Torstein H?nsi
+
+ License: www.highcharts.com/license
+*/
+(function(){var e=window,i=document,f=e.MooTools.version.substring(0,3),g=f==="1.2"||f==="1.1",j=g||f==="1.3",h=e.$extend||function(){return Object.append.apply(Object,arguments)};e.HighchartsAdapter={init:function(a){var b=Fx.prototype,c=b.start,d=Fx.Morph.prototype,e=d.compute;b.start=function(b,d){var e=this.element;if(b.d)this.paths=a.init(e,e.d,this.toD);c.apply(this,arguments);return this};d.compute=function(b,c,d){var f=this.paths;if(f)this.element.attr("d",a.step(f[0],f[1],d,this.toD));else return e.apply(this,
+arguments)}},adapterRun:function(a,b){return $(a).getStyle(b).toInt()},getScript:function(a,b){var c=i.getElementsByTagName("head")[0],d=i.createElement("script");d.type="text/javascript";d.src=a;d.onload=b;c.appendChild(d)},animate:function(a,b,c){var d=a.attr,f=c&&c.complete;if(d&&!a.setStyle)a.getStyle=a.attr,a.setStyle=function(){var b=arguments;a.attr.call(a,b[0],b[1][0])},a.$family=function(){return!0};e.HighchartsAdapter.stop(a);c=new Fx.Morph(d?a:$(a),h({transition:Fx.Transitions.Quad.easeInOut},
+c));if(d)c.element=a;if(b.d)c.toD=b.d;f&&c.addEvent("complete",f);c.start(b);a.fx=c},each:function(a,b){return g?$each(a,b):Array.each(a,b)},map:function(a,b){return a.map(b)},grep:function(a,b){return a.filter(b)},merge:function(){var a=arguments,b=[{}],c=a.length;if(g)a=$merge.apply(null,a);else{for(;c--;)typeof a[c]!=="boolean"&&(b[c+1]=a[c]);a=Object.merge.apply(Object,b)}return a},offset:function(a){a=$(a).getOffsets();return{left:a.x,top:a.y}},extendWithEvents:function(a){a.addEvent||(a.nodeName?
+$(a):h(a,new Events))},addEvent:function(a,b,c){typeof b==="string"&&(b==="unload"&&(b="beforeunload"),e.HighchartsAdapter.extendWithEvents(a),a.addEvent(b,c))},removeEvent:function(a,b,c){typeof a!=="string"&&(e.HighchartsAdapter.extendWithEvents(a),b?(b==="unload"&&(b="beforeunload"),c?a.removeEvent(b,c):a.removeEvents&&a.removeEvents(b)):a.removeEvents())},fireEvent:function(a,b,c,d){b={type:b,target:a};b=j?new Event(b):new DOMEvent(b);b=h(b,c);b.preventDefault=function(){d=null};a.fireEvent&&
+a.fireEvent(b.type,b);d&&d(b)},washMouseEvent:function(a){a.pageX=a.page.x;a.pageY=a.page.y;return a},stop:function(a){a.fx&&a.fx.cancel()}}})();
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/mootools-adapter.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/mootools-adapter.src.js
new file mode 100644
index 0000000..a3caf93
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/mootools-adapter.src.js
@@ -0,0 +1,321 @@
+/**
+ * @license Highcharts JS v2.2.5 (2012-06-08)
+ * MooTools adapter
+ *
+ * (c) 2010-2011 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Fx, $, $extend, $each, $merge, Events, Event, DOMEvent */
+
+(function () {
+
+var win = window,
+	doc = document,
+	mooVersion = win.MooTools.version.substring(0, 3), // Get the first three characters of the version number
+	legacy = mooVersion === '1.2' || mooVersion === '1.1', // 1.1 && 1.2 considered legacy, 1.3 is not.
+	legacyEvent = legacy || mooVersion === '1.3', // In versions 1.1 - 1.3 the event class is named Event, in newer versions it is named DOMEvent.
+	$extend = win.$extend || function () {
+		return Object.append.apply(Object, arguments);
+	};
+
+win.HighchartsAdapter = {
+	/**
+	 * Initialize the adapter. This is run once as Highcharts is first run.
+	 * @param {Object} pathAnim The helper object to do animations across adapters.
+	 */
+	init: function (pathAnim) {
+		var fxProto = Fx.prototype,
+			fxStart = fxProto.start,
+			morphProto = Fx.Morph.prototype,
+			morphCompute = morphProto.compute;
+
+		// override Fx.start to allow animation of SVG element wrappers
+		/*jslint unparam: true*//* allow unused parameters in fx functions */
+		fxProto.start = function (from, to) {
+			var fx = this,
+				elem = fx.element;
+
+			// special for animating paths
+			if (from.d) {
+				//this.fromD = this.element.d.split(' ');
+				fx.paths = pathAnim.init(
+					elem,
+					elem.d,
+					fx.toD
+				);
+			}
+			fxStart.apply(fx, arguments);
+
+			return this; // chainable
+		};
+
+		// override Fx.step to allow animation of SVG element wrappers
+		morphProto.compute = function (from, to, delta) {
+			var fx = this,
+				paths = fx.paths;
+
+			if (paths) {
+				fx.element.attr(
+					'd',
+					pathAnim.step(paths[0], paths[1], delta, fx.toD)
+				);
+			} else {
+				return morphCompute.apply(fx, arguments);
+			}
+		};
+		/*jslint unparam: false*/
+	},
+	
+	/**
+	 * Run a general method on the framework, following jQuery syntax
+	 * @param {Object} el The HTML element
+	 * @param {String} method Which method to run on the wrapped element
+	 */
+	adapterRun: function (el, method) {
+		
+		// This currently works for getting inner width and height. If adding
+		// more methods later, we need a conditional implementation for each.
+		return $(el).getStyle(method).toInt();
+		
+	},
+
+	/**
+	 * Downloads a script and executes a callback when done.
+	 * @param {String} scriptLocation
+	 * @param {Function} callback
+	 */
+	getScript: function (scriptLocation, callback) {
+		// We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script.
+		var head = doc.getElementsByTagName('head')[0];
+		var script = doc.createElement('script');
+
+		script.type = 'text/javascript';
+		script.src = scriptLocation;
+		script.onload = callback;
+
+		head.appendChild(script);
+	},
+
+	/**
+	 * Animate a HTML element or SVG element wrapper
+	 * @param {Object} el
+	 * @param {Object} params
+	 * @param {Object} options jQuery-like animation options: duration, easing, callback
+	 */
+	animate: function (el, params, options) {
+		var isSVGElement = el.attr,
+			effect,
+			complete = options && options.complete;
+
+		if (isSVGElement && !el.setStyle) {
+			// add setStyle and getStyle methods for internal use in Moo
+			el.getStyle = el.attr;
+			el.setStyle = function () { // property value is given as array in Moo - break it down
+				var args = arguments;
+				el.attr.call(el, args[0], args[1][0]);
+			};
+			// dirty hack to trick Moo into handling el as an element wrapper
+			el.$family = function () { return true; };
+		}
+
+		// stop running animations
+		win.HighchartsAdapter.stop(el);
+
+		// define and run the effect
+		effect = new Fx.Morph(
+			isSVGElement ? el : $(el),
+			$extend({
+				transition: Fx.Transitions.Quad.easeInOut
+			}, options)
+		);
+
+		// Make sure that the element reference is set when animating svg elements
+		if (isSVGElement) {
+			effect.element = el;
+		}
+
+		// special treatment for paths
+		if (params.d) {
+			effect.toD = params.d;
+		}
+
+		// jQuery-like events
+		if (complete) {
+			effect.addEvent('complete', complete);
+		}
+
+		// run
+		effect.start(params);
+
+		// record for use in stop method
+		el.fx = effect;
+	},
+
+	/**
+	 * MooTool's each function
+	 *
+	 */
+	each: function (arr, fn) {
+		return legacy ?
+			$each(arr, fn) :
+			Array.each(arr, fn);
+	},
+
+	/**
+	 * Map an array
+	 * @param {Array} arr
+	 * @param {Function} fn
+	 */
+	map: function (arr, fn) {
+		return arr.map(fn);
+	},
+
+	/**
+	 * Grep or filter an array
+	 * @param {Array} arr
+	 * @param {Function} fn
+	 */
+	grep: function (arr, fn) {
+		return arr.filter(fn);
+	},
+
+	/**
+	 * Deep merge two objects and return a third
+	 */
+	merge: function () {
+		var args = arguments,
+			args13 = [{}], // MooTools 1.3+
+			i = args.length,
+			ret;
+
+		if (legacy) {
+			ret = $merge.apply(null, args);
+		} else {
+			while (i--) {
+				// Boolean argumens should not be merged.
+				// JQuery explicitly skips this, so we do it here as well.
+				if (typeof args[i] !== 'boolean') {
+					args13[i + 1] = args[i];
+				}
+			}
+			ret = Object.merge.apply(Object, args13);
+		}
+
+		return ret;
+	},
+
+	/**
+	 * Get the offset of an element relative to the top left corner of the web page
+	 */
+	offset: function (el) {
+		var offsets = $(el).getOffsets();
+		return {
+			left: offsets.x,
+			top: offsets.y
+		};
+	},
+
+	/**
+	 * Extends an object with Events, if its not done
+	 */
+	extendWithEvents: function (el) {
+		// if the addEvent method is not defined, el is a custom Highcharts object
+		// like series or point
+		if (!el.addEvent) {
+			if (el.nodeName) {
+				el = $(el); // a dynamically generated node
+			} else {
+				$extend(el, new Events()); // a custom object
+			}
+		}
+	},
+
+	/**
+	 * Add an event listener
+	 * @param {Object} el HTML element or custom object
+	 * @param {String} type Event type
+	 * @param {Function} fn Event handler
+	 */
+	addEvent: function (el, type, fn) {
+		if (typeof type === 'string') { // chart broke due to el being string, type function
+
+			if (type === 'unload') { // Moo self destructs before custom unload events
+				type = 'beforeunload';
+			}
+
+			win.HighchartsAdapter.extendWithEvents(el);
+
+			el.addEvent(type, fn);
+		}
+	},
+
+	removeEvent: function (el, type, fn) {
+		if (typeof el === 'string') {
+			// el.removeEvents below apperantly calls this method again. Do not quite understand why, so for now just bail out.
+			return;
+		}
+		
+		win.HighchartsAdapter.extendWithEvents(el);
+		if (type) {
+			if (type === 'unload') { // Moo self destructs before custom unload events
+				type = 'beforeunload';
+			}
+
+			if (fn) {
+				el.removeEvent(type, fn);
+			} else if (el.removeEvents) { // #958
+				el.removeEvents(type);
+			}
+		} else {
+			el.removeEvents();
+		}
+	},
+
+	fireEvent: function (el, event, eventArguments, defaultFunction) {
+		var eventArgs = {
+			type: event,
+			target: el
+		};
+		// create an event object that keeps all functions
+		event = legacyEvent ? new Event(eventArgs) : new DOMEvent(eventArgs);
+		event = $extend(event, eventArguments);
+		// override the preventDefault function to be able to use
+		// this for custom events
+		event.preventDefault = function () {
+			defaultFunction = null;
+		};
+		// if fireEvent is not available on the object, there hasn't been added
+		// any events to it above
+		if (el.fireEvent) {
+			el.fireEvent(event.type, event);
+		}
+
+		// fire the default if it is passed and it is not prevented above
+		if (defaultFunction) {
+			defaultFunction(event);
+		}
+	},
+	
+	/**
+	 * Set back e.pageX and e.pageY that MooTools has abstracted away
+	 */
+	washMouseEvent: function (e) {
+		e.pageX = e.page.x;
+		e.pageY = e.page.y;
+		return e;
+	},
+
+	/**
+	 * Stop running animations on the object
+	 */
+	stop: function (el) {
+		if (el.fx) {
+			el.fx.cancel();
+		}
+	}
+};
+
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/prototype-adapter.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/prototype-adapter.js
new file mode 100644
index 0000000..0a58d6b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/prototype-adapter.js
@@ -0,0 +1,16 @@
+/*
+ Highcharts JS v2.2.5 (2012-06-08)
+ Prototype adapter
+
+ @author Michael Nelson, Torstein H?nsi.
+
+ Feel free to use and modify this script.
+ Highcharts license: www.highcharts.com/license.
+*/
+var HighchartsAdapter=function(){var g=typeof Effect!=="undefined";return{init:function(c){if(g)Effect.HighchartsTransition=Class.create(Effect.Base,{initialize:function(a,b,d,e){var f;this.element=a;this.key=b;f=a.attr?a.attr(b):$(a).getStyle(b);if(b==="d")this.paths=c.init(a,a.d,d),this.toD=d,f=0,d=1;this.start(Object.extend(e||{},{from:f,to:d,attribute:b}))},setup:function(){HighchartsAdapter._extend(this.element);if(!this.element._highchart_animation)this.element._highchart_animation={};this.element._highchart_animation[this.key]=
+this},update:function(a){var b=this.paths,d=this.element;b&&(a=c.step(b[0],b[1],a,this.toD));d.attr?d.attr(this.options.attribute,a):(b={},b[this.options.attribute]=a,$(d).setStyle(b))},finish:function(){delete this.element._highchart_animation[this.key]}})},adapterRun:function(c,a){return parseInt($(c).getStyle(a),10)},getScript:function(c,a){var b=$$("head")[0];b&&b.appendChild((new Element("script",{type:"text/javascript",src:c})).observe("load",a))},addNS:function(c){var a=/^(?:click|mouse(?:down|up|over|move|out))$/;
+return/^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/.test(c)||a.test(c)?c:"h:"+c},addEvent:function(c,a,b){c.addEventListener||c.attachEvent?Event.observe($(c),HighchartsAdapter.addNS(a),b):(HighchartsAdapter._extend(c),c._highcharts_observe(a,b))},animate:function(c,a,b){var d,b=b||{};b.delay=0;b.duration=(b.duration||500)/1E3;b.afterFinish=b.complete;if(g)for(d in a)new Effect.HighchartsTransition($(c),d,a[d],b);else{if(c.attr)for(d in a)c.attr(d,a[d]);b.complete&&
+b.complete()}c.attr||$(c).setStyle(a)},stop:function(c){var a;if(c._highcharts_extended&&c._highchart_animation)for(a in c._highchart_animation)c._highchart_animation[a].cancel()},each:function(c,a){$A(c).each(a)},offset:function(c){return $(c).cumulativeOffset()},fireEvent:function(c,a,b,d){c.fire?c.fire(HighchartsAdapter.addNS(a),b):c._highcharts_extended&&(b=b||{},c._highcharts_fire(a,b));b&&b.defaultPrevented&&(d=null);d&&d(b)},removeEvent:function(c,a,b){$(c).stopObserving&&(a&&(a=HighchartsAdapter.addNS(a)),
+$(c).stopObserving(a,b));window===c?Event.stopObserving(c,a,b):(HighchartsAdapter._extend(c),c._highcharts_stop_observing(a,b))},washMouseEvent:function(c){return c},grep:function(c,a){return c.findAll(a)},map:function(c,a){return c.map(a)},merge:function(){function c(a,b){var d,e;for(e in b)d=b[e],a[e]=d&&typeof d==="object"&&d.constructor!==Array&&typeof d.nodeType!=="number"?c(a[e]||{},d):b[e];return a}return function(){var a=arguments,b,d={};for(b=0;b<a.length;b++)d=c(d,a[b]);return d}.apply(this,
+arguments)},_extend:function(c){c._highcharts_extended||Object.extend(c,{_highchart_events:{},_highchart_animation:null,_highcharts_extended:!0,_highcharts_observe:function(a,b){this._highchart_events[a]=[this._highchart_events[a],b].compact().flatten()},_highcharts_stop_observing:function(a,b){a?b?this._highchart_events[a]=[this._highchart_events[a]].compact().flatten().without(b):delete this._highchart_events[a]:this._highchart_events={}},_highcharts_fire:function(a,b){(this._highchart_events[a]||
+[]).each(function(a){if(!b.stopped)b.preventDefault=function(){b.defaultPrevented=!0},a.bind(this)(b)===!1&&b.preventDefault()}.bind(this))}})}}}();
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/prototype-adapter.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/prototype-adapter.src.js
new file mode 100644
index 0000000..3bb27d4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/prototype-adapter.src.js
@@ -0,0 +1,381 @@
+/**
+ * @license Highcharts JS v2.2.5 (2012-06-08)
+ * Prototype adapter
+ *
+ * @author Michael Nelson, Torstein Hønsi.
+ *
+ * Feel free to use and modify this script.
+ * Highcharts license: www.highcharts.com/license.
+ */
+
+// JSLint options:
+/*global Effect, Class, Event, Element, $, $$, $A */
+
+// Adapter interface between prototype and the Highcharts charting library
+var HighchartsAdapter = (function () {
+
+var hasEffect = typeof Effect !== 'undefined';
+
+return {
+
+	/**
+	 * Initialize the adapter. This is run once as Highcharts is first run.
+	 * @param {Object} pathAnim The helper object to do animations across adapters.
+	 */
+	init: function (pathAnim) {
+		if (hasEffect) {
+			/**
+			 * Animation for Highcharts SVG element wrappers only
+			 * @param {Object} element
+			 * @param {Object} attribute
+			 * @param {Object} to
+			 * @param {Object} options
+			 */
+			Effect.HighchartsTransition = Class.create(Effect.Base, {
+				initialize: function (element, attr, to, options) {
+					var from,
+						opts;
+
+					this.element = element;
+					this.key = attr;
+					from = element.attr ? element.attr(attr) : $(element).getStyle(attr);
+
+					// special treatment for paths
+					if (attr === 'd') {
+						this.paths = pathAnim.init(
+							element,
+							element.d,
+							to
+						);
+						this.toD = to;
+
+
+						// fake values in order to read relative position as a float in update
+						from = 0;
+						to = 1;
+					}
+
+					opts = Object.extend((options || {}), {
+						from: from,
+						to: to,
+						attribute: attr
+					});
+					this.start(opts);
+				},
+				setup: function () {
+					HighchartsAdapter._extend(this.element);
+					// If this is the first animation on this object, create the _highcharts_animation helper that
+					// contain pointers to the animation objects.
+					if (!this.element._highchart_animation) {
+						this.element._highchart_animation = {};
+					}
+
+					// Store a reference to this animation instance.
+					this.element._highchart_animation[this.key] = this;
+				},
+				update: function (position) {
+					var paths = this.paths,
+						element = this.element,
+						obj;
+
+					if (paths) {
+						position = pathAnim.step(paths[0], paths[1], position, this.toD);
+					}
+
+					if (element.attr) { // SVGElement
+						element.attr(this.options.attribute, position);
+					
+					} else { // HTML, #409
+						obj = {};
+						obj[this.options.attribute] = position;
+						$(element).setStyle(obj);
+					}
+					
+				},
+				finish: function () {
+					// Delete the property that holds this animation now that it is finished.
+					// Both canceled animations and complete ones gets a 'finish' call.
+					delete this.element._highchart_animation[this.key];
+				}
+			});
+		}
+	},
+	
+	/**
+	 * Run a general method on the framework, following jQuery syntax
+	 * @param {Object} el The HTML element
+	 * @param {String} method Which method to run on the wrapped element
+	 */
+	adapterRun: function (el, method) {
+		
+		// This currently works for getting inner width and height. If adding
+		// more methods later, we need a conditional implementation for each.
+		return parseInt($(el).getStyle(method), 10);
+		
+	},
+
+	/**
+	 * Downloads a script and executes a callback when done.
+	 * @param {String} scriptLocation
+	 * @param {Function} callback
+	 */
+	getScript: function (scriptLocation, callback) {
+		var head = $$('head')[0]; // Returns an array, so pick the first element.
+		if (head) {
+			// Append a new 'script' element, set its type and src attributes, add a 'load' handler that calls the callback
+			head.appendChild(new Element('script', { type: 'text/javascript', src: scriptLocation}).observe('load', callback));
+		}
+	},
+
+	/**
+	 * Custom events in prototype needs to be namespaced. This method adds a namespace 'h:' in front of
+	 * events that are not recognized as native.
+	 */
+	addNS: function (eventName) {
+		var HTMLEvents = /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,
+			MouseEvents = /^(?:click|mouse(?:down|up|over|move|out))$/;
+		return (HTMLEvents.test(eventName) || MouseEvents.test(eventName)) ?
+			eventName :
+			'h:' + eventName;
+	},
+
+	// el needs an event to be attached. el is not necessarily a dom element
+	addEvent: function (el, event, fn) {
+		if (el.addEventListener || el.attachEvent) {
+			Event.observe($(el), HighchartsAdapter.addNS(event), fn);
+
+		} else {
+			HighchartsAdapter._extend(el);
+			el._highcharts_observe(event, fn);
+		}
+	},
+
+	// motion makes things pretty. use it if effects is loaded, if not... still get to the end result.
+	animate: function (el, params, options) {
+		var key,
+			fx;
+
+		// default options
+		options = options || {};
+		options.delay = 0;
+		options.duration = (options.duration || 500) / 1000;
+		options.afterFinish = options.complete;
+
+		// animate wrappers and DOM elements
+		if (hasEffect) {
+			for (key in params) {
+				// The fx variable is seemingly thrown away here, but the Effect.setup will add itself to the _highcharts_animation object
+				// on the element itself so its not really lost.
+				fx = new Effect.HighchartsTransition($(el), key, params[key], options);
+			}
+		} else {
+			if (el.attr) { // #409 without effects
+				for (key in params) {
+					el.attr(key, params[key]);
+				}
+			}
+			if (options.complete) {
+				options.complete();
+			}
+		}
+
+		if (!el.attr) { // HTML element, #409
+			$(el).setStyle(params);
+		}
+	},
+
+	// this only occurs in higcharts 2.0+
+	stop: function (el) {
+		var key;
+		if (el._highcharts_extended && el._highchart_animation) {
+			for (key in el._highchart_animation) {
+				// Cancel the animation
+				// The 'finish' function in the Effect object will remove the reference
+				el._highchart_animation[key].cancel();
+			}
+		}
+	},
+
+	// um.. each
+	each: function (arr, fn) {
+		$A(arr).each(fn);
+	},
+
+	/**
+	 * Get the cumulative offset relative to the top left of the page. This method, unlike its
+	 * jQuery and MooTools counterpart, still suffers from issue #208 regarding the position
+	 * of a chart within a fixed container.
+	 */
+	offset: function (el) {
+		return $(el).cumulativeOffset();
+	},
+
+	// fire an event based on an event name (event) and an object (el).
+	// again, el may not be a dom element
+	fireEvent: function (el, event, eventArguments, defaultFunction) {
+		if (el.fire) {
+			el.fire(HighchartsAdapter.addNS(event), eventArguments);
+		} else if (el._highcharts_extended) {
+			eventArguments = eventArguments || {};
+			el._highcharts_fire(event, eventArguments);
+		}
+
+		if (eventArguments && eventArguments.defaultPrevented) {
+			defaultFunction = null;
+		}
+
+		if (defaultFunction) {
+			defaultFunction(eventArguments);
+		}
+	},
+
+	removeEvent: function (el, event, handler) {
+		if ($(el).stopObserving) {
+			if (event) {
+				event = HighchartsAdapter.addNS(event);
+			}
+			$(el).stopObserving(event, handler);
+		} if (window === el) {
+			Event.stopObserving(el, event, handler);
+		} else {
+			HighchartsAdapter._extend(el);
+			el._highcharts_stop_observing(event, handler);
+		}
+	},
+	
+	washMouseEvent: function (e) {
+		return e;
+	},
+
+	// um, grep
+	grep: function (arr, fn) {
+		return arr.findAll(fn);
+	},
+
+	// um, map
+	map: function (arr, fn) {
+		return arr.map(fn);
+	},
+
+	// deep merge. merge({a : 'a', b : {b1 : 'b1', b2 : 'b2'}}, {b : {b2 : 'b2_prime'}, c : 'c'}) => {a : 'a', b : {b1 : 'b1', b2 : 'b2_prime'}, c : 'c'}
+	/*merge: function(){
+		function doCopy(copy, original) {
+			var value,
+				key,
+				undef,
+				nil,
+				same,
+				obj,
+				arr,
+				node;
+
+			for (key in original) {
+				value = original[key];
+				undef = typeof(value) === 'undefined';
+				nil = value === null;
+				same = original === copy[key];
+
+				if (undef || nil || same) {
+					continue;
+				}
+
+				obj = typeof(value) === 'object';
+				arr = value && obj && value.constructor == Array;
+				node = !!value.nodeType;
+
+				if (obj && !arr && !node) {
+					copy[key] = doCopy(typeof copy[key] == 'object' ? copy[key] : {}, value);
+				}
+				else {
+					copy[key] = original[key];
+				}
+			}
+			return copy;
+		}
+
+		var args = arguments, retVal = {};
+
+		for (var i = 0; i < args.length; i++) {
+			retVal = doCopy(retVal, args[i]);
+		}
+
+		return retVal;
+	},*/
+	merge: function () { // the built-in prototype merge function doesn't do deep copy
+		function doCopy(copy, original) {
+			var value, key;
+
+			for (key in original) {
+				value = original[key];
+				if (value && typeof value === 'object' && value.constructor !== Array &&
+						typeof value.nodeType !== 'number') {
+					copy[key] = doCopy(copy[key] || {}, value); // copy
+
+				} else {
+					copy[key] = original[key];
+				}
+			}
+			return copy;
+		}
+
+		function merge() {
+			var args = arguments,
+				i,
+				retVal = {};
+
+			for (i = 0; i < args.length; i++) {
+				retVal = doCopy(retVal, args[i]);
+
+			}
+			return retVal;
+		}
+
+		return merge.apply(this, arguments);
+	},
+
+	// extend an object to handle highchart events (highchart objects, not svg elements).
+	// this is a very simple way of handling events but whatever, it works (i think)
+	_extend: function (object) {
+		if (!object._highcharts_extended) {
+			Object.extend(object, {
+				_highchart_events: {},
+				_highchart_animation: null,
+				_highcharts_extended: true,
+				_highcharts_observe: function (name, fn) {
+					this._highchart_events[name] = [this._highchart_events[name], fn].compact().flatten();
+				},
+				_highcharts_stop_observing: function (name, fn) {
+					if (name) {
+						if (fn) {
+							this._highchart_events[name] = [this._highchart_events[name]].compact().flatten().without(fn);
+						} else {
+							delete this._highchart_events[name];
+						}
+					} else {
+						this._highchart_events = {};
+					}
+				},
+				_highcharts_fire: function (name, args) {
+					(this._highchart_events[name] || []).each(function (fn) {
+						// args is never null here
+						if (args.stopped) {
+							return; // "throw $break" wasn't working. i think because of the scope of 'this'.
+						}
+
+						// Attach a simple preventDefault function to skip default handler if called
+						args.preventDefault = function () {
+							args.defaultPrevented = true;
+						};
+
+						// If the event handler return false, prevent the default handler from executing
+						if (fn.bind(this)(args) === false) {
+							args.preventDefault();
+						}
+					}
+.bind(this));
+				}
+			});
+		}
+	}
+};
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/standalone-framework.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/standalone-framework.js
new file mode 100644
index 0000000..c3ff31b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/standalone-framework.js
@@ -0,0 +1,18 @@
+/*
+ Highcharts JS v4.0.3 (2014-07-03)
+
+ Standalone Highcharts Framework
+
+ License: MIT License
+*/
+var HighchartsAdapter=function(){function o(c){function b(b,a,d){b.removeEventListener(a,d,!1)}function d(b,a,d){d=b.HCProxiedMethods[d.toString()];b.detachEvent("on"+a,d)}function a(a,c){var f=a.HCEvents,i,g,k,j;if(a.removeEventListener)i=b;else if(a.attachEvent)i=d;else return;c?(g={},g[c]=!0):g=f;for(j in g)if(f[j])for(k=f[j].length;k--;)i(a,j,f[j][k])}c.HCExtended||Highcharts.extend(c,{HCExtended:!0,HCEvents:{},bind:function(b,a){var d=this,c=this.HCEvents,g;if(d.addEventListener)d.addEventListener(b,
+a,!1);else if(d.attachEvent){g=function(b){b.target=b.srcElement||window;a.call(d,b)};if(!d.HCProxiedMethods)d.HCProxiedMethods={};d.HCProxiedMethods[a.toString()]=g;d.attachEvent("on"+b,g)}c[b]===r&&(c[b]=[]);c[b].push(a)},unbind:function(c,h){var f,i;c?(f=this.HCEvents[c]||[],h?(i=HighchartsAdapter.inArray(h,f),i>-1&&(f.splice(i,1),this.HCEvents[c]=f),this.removeEventListener?b(this,c,h):this.attachEvent&&d(this,c,h)):(a(this,c),this.HCEvents[c]=[])):(a(this),this.HCEvents={})},trigger:function(b,
+a){var d=this.HCEvents[b]||[],c=d.length,g,k,j;k=function(){a.defaultPrevented=!0};for(g=0;g<c;g++){j=d[g];if(a.stopped)break;a.preventDefault=k;a.target=this;if(!a.type)a.type=b;j.call(this,a)===!1&&a.preventDefault()}}});return c}var r,l=document,p=[],m=[],q,n;Math.easeInOutSine=function(c,b,d,a){return-d/2*(Math.cos(Math.PI*c/a)-1)+b};return{init:function(c){if(!l.defaultView)this._getStyle=function(b,d){var a;return b.style[d]?b.style[d]:(d==="opacity"&&(d="filter"),a=b.currentStyle[d.replace(/\-(\w)/g,
+function(a,b){return b.toUpperCase()})],d==="filter"&&(a=a.replace(/alpha\(opacity=([0-9]+)\)/,function(b,a){return a/100})),a===""?1:a)},this.adapterRun=function(b,d){var a={width:"clientWidth",height:"clientHeight"}[d];if(a)return b.style.zoom=1,b[a]-2*parseInt(HighchartsAdapter._getStyle(b,"padding"),10)};if(!Array.prototype.forEach)this.each=function(b,d){for(var a=0,c=b.length;a<c;a++)if(d.call(b[a],b[a],a,b)===!1)return a};if(!Array.prototype.indexOf)this.inArray=function(b,d){var a,c=0;if(d)for(a=
+d.length;c<a;c++)if(d[c]===b)return c;return-1};if(!Array.prototype.filter)this.grep=function(b,d){for(var a=[],c=0,h=b.length;c<h;c++)d(b[c],c)&&a.push(b[c]);return a};n=function(b,c,a){this.options=c;this.elem=b;this.prop=a};n.prototype={update:function(){var b;b=this.paths;var d=this.elem,a=d.element;b&&a?d.attr("d",c.step(b[0],b[1],this.now,this.toD)):d.attr?a&&d.attr(this.prop,this.now):(b={},b[this.prop]=this.now+this.unit,Highcharts.css(d,b));this.options.step&&this.options.step.call(this.elem,
+this.now,this)},custom:function(b,c,a){var e=this,h=function(a){return e.step(a)},f;this.startTime=+new Date;this.start=b;this.end=c;this.unit=a;this.now=this.start;this.pos=this.state=0;h.elem=this.elem;h()&&m.push(h)===1&&(q=setInterval(function(){for(f=0;f<m.length;f++)m[f]()||m.splice(f--,1);m.length||clearInterval(q)},13))},step:function(b){var c=+new Date,a;a=this.options;var e=this.elem,h;if(e.stopAnimation||e.attr&&!e.element)a=!1;else if(b||c>=a.duration+this.startTime){this.now=this.end;
+this.pos=this.state=1;this.update();b=this.options.curAnim[this.prop]=!0;for(h in a.curAnim)a.curAnim[h]!==!0&&(b=!1);b&&a.complete&&a.complete.call(e);a=!1}else e=c-this.startTime,this.state=e/a.duration,this.pos=a.easing(e,0,1,a.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update(),a=!0;return a}};this.animate=function(b,d,a){var e,h="",f,i,g;b.stopAnimation=!1;if(typeof a!=="object"||a===null)e=arguments,a={duration:e[2],easing:e[3],complete:e[4]};if(typeof a.duration!=="number")a.duration=
+400;a.easing=Math[a.easing]||Math.easeInOutSine;a.curAnim=Highcharts.extend({},d);for(g in d)i=new n(b,a,g),f=null,g==="d"?(i.paths=c.init(b,b.d,d.d),i.toD=d.d,e=0,f=1):b.attr?e=b.attr(g):(e=parseFloat(HighchartsAdapter._getStyle(b,g))||0,g!=="opacity"&&(h="px")),f||(f=parseFloat(d[g])),i.custom(e,f,h)}},_getStyle:function(c,b){return window.getComputedStyle(c,void 0).getPropertyValue(b)},getScript:function(c,b){var d=l.getElementsByTagName("head")[0],a=l.createElement("script");a.type="text/javascript";
+a.src=c;a.onload=b;d.appendChild(a)},inArray:function(c,b){return b.indexOf?b.indexOf(c):p.indexOf.call(b,c)},adapterRun:function(c,b){return parseInt(HighchartsAdapter._getStyle(c,b),10)},grep:function(c,b){return p.filter.call(c,b)},map:function(c,b){for(var d=[],a=0,e=c.length;a<e;a++)d[a]=b.call(c[a],c[a],a,c);return d},offset:function(c){var b=document.documentElement,c=c.getBoundingClientRect();return{top:c.top+(window.pageYOffset||b.scrollTop)-(b.clientTop||0),left:c.left+(window.pageXOffset||
+b.scrollLeft)-(b.clientLeft||0)}},addEvent:function(c,b,d){o(c).bind(b,d)},removeEvent:function(c,b,d){o(c).unbind(b,d)},fireEvent:function(c,b,d,a){var e;l.createEvent&&(c.dispatchEvent||c.fireEvent)?(e=l.createEvent("Events"),e.initEvent(b,!0,!0),e.target=c,Highcharts.extend(e,d),c.dispatchEvent?c.dispatchEvent(e):c.fireEvent(b,e)):c.HCExtended===!0&&(d=d||{},c.trigger(b,d));d&&d.defaultPrevented&&(a=null);a&&a(d)},washMouseEvent:function(c){return c},stop:function(c){c.stopAnimation=!0},each:function(c,
+b){return Array.prototype.forEach.call(c,b)}}}();
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/standalone-framework.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/standalone-framework.src.js
new file mode 100644
index 0000000..bd7209a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/adapters/standalone-framework.src.js
@@ -0,0 +1,590 @@
+/**
+ * @license Highcharts JS v4.0.3 (2014-07-03)
+ *
+ * Standalone Highcharts Framework
+ *
+ * License: MIT License
+ */
+
+
+/*global Highcharts */
+var HighchartsAdapter = (function () {
+
+var UNDEFINED,
+	doc = document,
+	emptyArray = [],
+	timers = [],
+	timerId,
+	Fx;
+
+Math.easeInOutSine = function (t, b, c, d) {
+	return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
+};
+
+
+
+/**
+ * Extend given object with custom events
+ */
+function augment(obj) {
+	function removeOneEvent(el, type, fn) {
+		el.removeEventListener(type, fn, false);
+	}
+
+	function IERemoveOneEvent(el, type, fn) {
+		fn = el.HCProxiedMethods[fn.toString()];
+		el.detachEvent('on' + type, fn);
+	}
+
+	function removeAllEvents(el, type) {
+		var events = el.HCEvents,
+			remove,
+			types,
+			len,
+			n;
+
+		if (el.removeEventListener) {
+			remove = removeOneEvent;
+		} else if (el.attachEvent) {
+			remove = IERemoveOneEvent;
+		} else {
+			return; // break on non-DOM events
+		}
+
+
+		if (type) {
+			types = {};
+			types[type] = true;
+		} else {
+			types = events;
+		}
+
+		for (n in types) {
+			if (events[n]) {
+				len = events[n].length;
+				while (len--) {
+					remove(el, n, events[n][len]);
+				}
+			}
+		}
+	}
+
+	if (!obj.HCExtended) {
+		Highcharts.extend(obj, {
+			HCExtended: true,
+
+			HCEvents: {},
+
+			bind: function (name, fn) {
+				var el = this,
+					events = this.HCEvents,
+					wrappedFn;
+
+				// handle DOM events in modern browsers
+				if (el.addEventListener) {
+					el.addEventListener(name, fn, false);
+
+				// handle old IE implementation
+				} else if (el.attachEvent) {
+					
+					wrappedFn = function (e) {
+						e.target = e.srcElement || window; // #2820
+						fn.call(el, e);
+					};
+
+					if (!el.HCProxiedMethods) {
+						el.HCProxiedMethods = {};
+					}
+
+					// link wrapped fn with original fn, so we can get this in removeEvent
+					el.HCProxiedMethods[fn.toString()] = wrappedFn;
+
+					el.attachEvent('on' + name, wrappedFn);
+				}
+
+
+				if (events[name] === UNDEFINED) {
+					events[name] = [];
+				}
+
+				events[name].push(fn);
+			},
+
+			unbind: function (name, fn) {
+				var events,
+					index;
+
+				if (name) {
+					events = this.HCEvents[name] || [];
+					if (fn) {
+						index = HighchartsAdapter.inArray(fn, events);
+						if (index > -1) {
+							events.splice(index, 1);
+							this.HCEvents[name] = events;
+						}
+						if (this.removeEventListener) {
+							removeOneEvent(this, name, fn);
+						} else if (this.attachEvent) {
+							IERemoveOneEvent(this, name, fn);
+						}
+					} else {
+						removeAllEvents(this, name);
+						this.HCEvents[name] = [];
+					}
+				} else {
+					removeAllEvents(this);
+					this.HCEvents = {};
+				}
+			},
+
+			trigger: function (name, args) {
+				var events = this.HCEvents[name] || [],
+					target = this,
+					len = events.length,
+					i,
+					preventDefault,
+					fn;
+
+				// Attach a simple preventDefault function to skip default handler if called
+				preventDefault = function () {
+					args.defaultPrevented = true;
+				};
+				
+				for (i = 0; i < len; i++) {
+					fn = events[i];
+
+					// args is never null here
+					if (args.stopped) {
+						return;
+					}
+
+					args.preventDefault = preventDefault;
+					args.target = target;
+
+					// If the type is not set, we're running a custom event (#2297). If it is set,
+					// we're running a browser event, and setting it will cause en error in
+					// IE8 (#2465).
+					if (!args.type) {
+						args.type = name;
+					}
+					
+
+					
+					// If the event handler return false, prevent the default handler from executing
+					if (fn.call(this, args) === false) {
+						args.preventDefault();
+					}
+				}
+			}
+		});
+	}
+
+	return obj;
+}
+
+
+return {
+	/**
+	 * Initialize the adapter. This is run once as Highcharts is first run.
+	 */
+	init: function (pathAnim) {
+
+		/**
+		 * Compatibility section to add support for legacy IE. This can be removed if old IE 
+		 * support is not needed.
+		 */
+		if (!doc.defaultView) {
+			this._getStyle = function (el, prop) {
+				var val;
+				if (el.style[prop]) {
+					return el.style[prop];
+				} else {
+					if (prop === 'opacity') {
+						prop = 'filter';
+					}
+					/*jslint unparam: true*/
+					val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b) { return b.toUpperCase(); })];
+					if (prop === 'filter') {
+						val = val.replace(
+							/alpha\(opacity=([0-9]+)\)/, 
+							function (a, b) { 
+								return b / 100; 
+							}
+						);
+					}
+					/*jslint unparam: false*/
+					return val === '' ? 1 : val;
+				} 
+			};
+			this.adapterRun = function (elem, method) {
+				var alias = { width: 'clientWidth', height: 'clientHeight' }[method];
+
+				if (alias) {
+					elem.style.zoom = 1;
+					return elem[alias] - 2 * parseInt(HighchartsAdapter._getStyle(elem, 'padding'), 10);
+				}
+			};
+		}
+
+		if (!Array.prototype.forEach) {
+			this.each = function (arr, fn) { // legacy
+				var i = 0, 
+					len = arr.length;
+				for (; i < len; i++) {
+					if (fn.call(arr[i], arr[i], i, arr) === false) {
+						return i;
+					}
+				}
+			};
+		}
+
+		if (!Array.prototype.indexOf) {
+			this.inArray = function (item, arr) {
+				var len, 
+					i = 0;
+
+				if (arr) {
+					len = arr.length;
+					
+					for (; i < len; i++) {
+						if (arr[i] === item) {
+							return i;
+						}
+					}
+				}
+
+				return -1;
+			};
+		}
+
+		if (!Array.prototype.filter) {
+			this.grep = function (elements, callback) {
+				var ret = [],
+					i = 0,
+					length = elements.length;
+
+				for (; i < length; i++) {
+					if (!!callback(elements[i], i)) {
+						ret.push(elements[i]);
+					}
+				}
+
+				return ret;
+			};
+		}
+
+		//--- End compatibility section ---
+
+
+		/**
+		 * Start of animation specific code
+		 */
+		Fx = function (elem, options, prop) {
+			this.options = options;
+			this.elem = elem;
+			this.prop = prop;
+		};
+		Fx.prototype = {
+			
+			update: function () {
+				var styles,
+					paths = this.paths,
+					elem = this.elem,
+					elemelem = elem.element; // if destroyed, it is null
+
+				// Animating a path definition on SVGElement
+				if (paths && elemelem) {
+					elem.attr('d', pathAnim.step(paths[0], paths[1], this.now, this.toD));
+				
+				// Other animations on SVGElement
+				} else if (elem.attr) {
+					if (elemelem) {
+						elem.attr(this.prop, this.now);
+					}
+
+				// HTML styles
+				} else {
+					styles = {};
+					styles[this.prop] = this.now + this.unit;
+					Highcharts.css(elem, styles);
+				}
+				
+				if (this.options.step) {
+					this.options.step.call(this.elem, this.now, this);
+				}
+
+			},
+			custom: function (from, to, unit) {
+				var self = this,
+					t = function (gotoEnd) {
+						return self.step(gotoEnd);
+					},
+					i;
+
+				this.startTime = +new Date();
+				this.start = from;
+				this.end = to;
+				this.unit = unit;
+				this.now = this.start;
+				this.pos = this.state = 0;
+
+				t.elem = this.elem;
+
+				if (t() && timers.push(t) === 1) {
+					timerId = setInterval(function () {
+						
+						for (i = 0; i < timers.length; i++) {
+							if (!timers[i]()) {
+								timers.splice(i--, 1);
+							}
+						}
+
+						if (!timers.length) {
+							clearInterval(timerId);
+						}
+					}, 13);
+				}
+			},
+			
+			step: function (gotoEnd) {
+				var t = +new Date(),
+					ret,
+					done,
+					options = this.options,
+					elem = this.elem,
+					i;
+				
+				if (elem.stopAnimation || (elem.attr && !elem.element)) { // #2616, element including flag is destroyed
+					ret = false;
+
+				} else if (gotoEnd || t >= options.duration + this.startTime) {
+					this.now = this.end;
+					this.pos = this.state = 1;
+					this.update();
+
+					this.options.curAnim[this.prop] = true;
+
+					done = true;
+					for (i in options.curAnim) {
+						if (options.curAnim[i] !== true) {
+							done = false;
+						}
+					}
+
+					if (done) {
+						if (options.complete) {
+							options.complete.call(elem);
+						}
+					}
+					ret = false;
+
+				} else {
+					var n = t - this.startTime;
+					this.state = n / options.duration;
+					this.pos = options.easing(n, 0, 1, options.duration);
+					this.now = this.start + ((this.end - this.start) * this.pos);
+					this.update();
+					ret = true;
+				}
+				return ret;
+			}
+		};
+
+		/**
+		 * The adapter animate method
+		 */
+		this.animate = function (el, prop, opt) {
+			var start,
+				unit = '',
+				end,
+				fx,
+				args,
+				name;
+
+			el.stopAnimation = false; // ready for new
+
+			if (typeof opt !== 'object' || opt === null) {
+				args = arguments;
+				opt = {
+					duration: args[2],
+					easing: args[3],
+					complete: args[4]
+				};
+			}
+			if (typeof opt.duration !== 'number') {
+				opt.duration = 400;
+			}
+			opt.easing = Math[opt.easing] || Math.easeInOutSine;
+			opt.curAnim = Highcharts.extend({}, prop);
+			
+			for (name in prop) {
+				fx = new Fx(el, opt, name);
+				end = null;
+				
+				if (name === 'd') {
+					fx.paths = pathAnim.init(
+						el,
+						el.d,
+						prop.d
+					);
+					fx.toD = prop.d;
+					start = 0;
+					end = 1;
+				} else if (el.attr) {
+					start = el.attr(name);
+				} else {
+					start = parseFloat(HighchartsAdapter._getStyle(el, name)) || 0;
+					if (name !== 'opacity') {
+						unit = 'px';
+					}
+				}
+	
+				if (!end) {
+					end = parseFloat(prop[name]);
+				}
+				fx.custom(start, end, unit);
+			}	
+		};
+	},
+
+	/**
+	 * Internal method to return CSS value for given element and property
+	 */
+	_getStyle: function (el, prop) {
+		return window.getComputedStyle(el, undefined).getPropertyValue(prop);
+	},
+
+	/**
+	 * Downloads a script and executes a callback when done.
+	 * @param {String} scriptLocation
+	 * @param {Function} callback
+	 */
+	getScript: function (scriptLocation, callback) {
+		// We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script.
+		var head = doc.getElementsByTagName('head')[0],
+			script = doc.createElement('script');
+
+		script.type = 'text/javascript';
+		script.src = scriptLocation;
+		script.onload = callback;
+
+		head.appendChild(script);
+	},
+
+	/**
+	 * Return the index of an item in an array, or -1 if not found
+	 */
+	inArray: function (item, arr) {
+		return arr.indexOf ? arr.indexOf(item) : emptyArray.indexOf.call(arr, item);
+	},
+
+
+	/**
+	 * A direct link to adapter methods
+	 */
+	adapterRun: function (elem, method) {
+		return parseInt(HighchartsAdapter._getStyle(elem, method), 10);
+	},
+
+	/**
+	 * Filter an array
+	 */
+	grep: function (elements, callback) {
+		return emptyArray.filter.call(elements, callback);
+	},
+
+	/**
+	 * Map an array
+	 */
+	map: function (arr, fn) {
+		var results = [], i = 0, len = arr.length;
+
+		for (; i < len; i++) {
+			results[i] = fn.call(arr[i], arr[i], i, arr);
+		}
+
+		return results;
+	},
+
+	/**
+	 * Get the element's offset position, corrected by overflow:auto. Loosely based on jQuery's offset method.
+	 */
+	offset: function (el) {
+		var docElem = document.documentElement,
+			box = el.getBoundingClientRect();
+
+		return {
+			top: box.top  + (window.pageYOffset || docElem.scrollTop)  - (docElem.clientTop  || 0),
+			left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0)
+		};
+	},
+
+	/**
+	 * Add an event listener
+	 */
+	addEvent: function (el, type, fn) {
+		augment(el).bind(type, fn);
+	},
+
+	/**
+	 * Remove event added with addEvent
+	 */
+	removeEvent: function (el, type, fn) {
+		augment(el).unbind(type, fn);
+	},
+
+	/**
+	 * Fire an event on a custom object
+	 */
+	fireEvent: function (el, type, eventArguments, defaultFunction) {
+		var e;
+
+		if (doc.createEvent && (el.dispatchEvent || el.fireEvent)) {
+			e = doc.createEvent('Events');
+			e.initEvent(type, true, true);
+			e.target = el;
+
+			Highcharts.extend(e, eventArguments);
+
+			if (el.dispatchEvent) {
+				el.dispatchEvent(e);
+			} else {
+				el.fireEvent(type, e);
+			}
+
+		} else if (el.HCExtended === true) {
+			eventArguments = eventArguments || {};
+			el.trigger(type, eventArguments);
+		}
+
+		if (eventArguments && eventArguments.defaultPrevented) {
+			defaultFunction = null;
+		}
+
+		if (defaultFunction) {
+			defaultFunction(eventArguments);
+		}
+	},
+
+	washMouseEvent: function (e) {
+		return e;
+	},
+
+
+	/**
+	 * Stop running animation
+	 */
+	stop: function (el) {
+		el.stopAnimation = true;
+	},
+
+	/**
+	 * Utility for iterating over an array. Parameters are reversed compared to jQuery.
+	 * @param {Array} arr
+	 * @param {Function} fn
+	 */
+	each: function (arr, fn) { // modern browsers
+		return Array.prototype.forEach.call(arr, fn);
+	}
+};
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-3d.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-3d.js
new file mode 100644
index 0000000..34680d1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-3d.js
@@ -0,0 +1,44 @@
+/*
+ Highcharts JS v4.0.3 (2014-07-03)
+
+ (c) 2009-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(d){function x(g,a,b,c){var e,f,j;b*=t;a*=t;var i=[],h,k,o;b*=-1;h=c.x;k=c.y;o=(c.z===0?1.0E-4:c.z)*(c.vd||25);o=Math.max(500,o);var q=l(b),n=m(b),r=l(a),s=m(a),p,v,u;d.each(g,function(a){p=a.x-h;v=a.y-k;u=a.z||0;e=n*p-q*u;f=-q*r*p-n*r*u+s*v;j=q*s*p+n*s*u+r*v;e=e*((o-j)/o)+h;f=f*((o-j)/o)+k;i.push({x:A(e),y:A(f),z:A(j)})});return i}function w(g,a,b,c,e,f,d,i){var h=[];return f>e&&f-e>n/2+1.0E-4?(h=h.concat(w(g,a,b,c,e,e+n/2,d,i)),h=h.concat(w(g,a,b,c,e+n/2,f,d,i))):f<e&&e-f>n/2+1.0E-4?(h=
+h.concat(w(g,a,b,c,e,e-n/2,d,i)),h=h.concat(w(g,a,b,c,e-n/2,f,d,i))):(h=f-e,["C",g+b*m(e)-b*B*h*l(e)+d,a+c*l(e)+c*B*h*m(e)+i,g+b*m(f)+b*B*h*l(f)+d,a+c*l(f)-c*B*h*m(f)+i,g+b*m(f)+d,a+c*l(f)+i])}function C(g){if(this.chart.is3d()){var a=this.chart.options.plotOptions.column.grouping;a!==void 0&&!a&&this.group.zIndex!==void 0&&this.group.attr({zIndex:this.group.zIndex*10});var b=this.options,c=this.options.states;this.borderWidth=b.borderWidth=b.edgeWidth||1;d.each(this.data,function(a){a=a.pointAttr;
+this.borderColor=d.pick(b.edgeColor,a[""].fill);a[""].stroke=this.borderColor;a.hover.stroke=d.pick(c.hover.edgeColor,this.borderColor);a.select.stroke=d.pick(c.select.edgeColor,this.borderColor)})}g.apply(this,[].slice.call(arguments,1))}var n=Math.PI,t=n/180,l=Math.sin,m=Math.cos,A=Math.round,B=4*(Math.sqrt(2)-1)/3/(n/2);d.SVGRenderer.prototype.toLinePath=function(g,a){var b=[];d.each(g,function(a){b.push("L",a.x,a.y)});b[0]="M";a&&b.push("Z");return b};d.SVGRenderer.prototype.cuboid=function(g){var a=
+this.g(),g=this.cuboidPath(g);a.front=this.path(g[0]).attr({zIndex:g[3],"stroke-linejoin":"round"}).add(a);a.top=this.path(g[1]).attr({zIndex:g[4],"stroke-linejoin":"round"}).add(a);a.side=this.path(g[2]).attr({zIndex:g[5],"stroke-linejoin":"round"}).add(a);a.fillSetter=function(a){var c=d.Color(a).brighten(0.1).get(),e=d.Color(a).brighten(-0.1).get();this.front.attr({fill:a});this.top.attr({fill:c});this.side.attr({fill:e});this.color=a;return this};a.opacitySetter=function(a){this.front.attr({opacity:a});
+this.top.attr({opacity:a});this.side.attr({opacity:a});return this};a.attr=function(a){a.shapeArgs||a.x?(a=this.renderer.cuboidPath(a.shapeArgs||a),this.front.attr({d:a[0],zIndex:a[3]}),this.top.attr({d:a[1],zIndex:a[4]}),this.side.attr({d:a[2],zIndex:a[5]})):d.SVGElement.prototype.attr.call(this,a);return this};a.animate=function(a,c,e){a.x&&a.y?(a=this.renderer.cuboidPath(a),this.front.attr({zIndex:a[3]}).animate({d:a[0]},c,e),this.top.attr({zIndex:a[4]}).animate({d:a[1]},c,e),this.side.attr({zIndex:a[5]}).animate({d:a[2]},
+c,e)):a.opacity?(this.front.animate(a,c,e),this.top.animate(a,c,e),this.side.animate(a,c,e)):d.SVGElement.prototype.animate.call(this,a,c,e);return this};a.destroy=function(){this.front.destroy();this.top.destroy();this.side.destroy();return null};a.attr({zIndex:-g[3]});return a};d.SVGRenderer.prototype.cuboidPath=function(d){var a=d.x,b=d.y,c=d.z,e=d.height,f=d.width,j=d.depth,i=d.alpha,h=d.beta,a=[{x:a,y:b,z:c},{x:a+f,y:b,z:c},{x:a+f,y:b+e,z:c},{x:a,y:b+e,z:c},{x:a,y:b+e,z:c+j},{x:a+f,y:b+e,z:c+
+j},{x:a+f,y:b,z:c+j},{x:a,y:b,z:c+j}],a=x(a,i,h,d.origin),d=["M",a[0].x,a[0].y,"L",a[7].x,a[7].y,"L",a[6].x,a[6].y,"L",a[1].x,a[1].y,"Z"],b=["M",a[3].x,a[3].y,"L",a[2].x,a[2].y,"L",a[5].x,a[5].y,"L",a[4].x,a[4].y,"Z"],c=["M",a[1].x,a[1].y,"L",a[2].x,a[2].y,"L",a[5].x,a[5].y,"L",a[6].x,a[6].y,"Z"],e=["M",a[0].x,a[0].y,"L",a[7].x,a[7].y,"L",a[4].x,a[4].y,"L",a[3].x,a[3].y,"Z"];return[["M",a[0].x,a[0].y,"L",a[1].x,a[1].y,"L",a[2].x,a[2].y,"L",a[3].x,a[3].y,"Z"],a[7].y<a[1].y?d:a[4].y>a[2].y?b:[],a[6].x>
+a[1].x?c:a[7].x<a[0].x?e:[],(a[0].z+a[1].z+a[2].z+a[3].z)/4,h>0?(a[0].z+a[7].z+a[6].z+a[1].z)/4:(a[3].z+a[2].z+a[5].z+a[4].z)/4,i>0?(a[1].z+a[2].z+a[5].z+a[6].z)/4:(a[0].z+a[7].z+a[4].z+a[3].z)/4]};d.SVGRenderer.prototype.arc3d=function(g){g.alpha*=t;g.beta*=t;var a=this.g(),b=this.arc3dPath(g),c=a.renderer,e=b.zTop*100;a.shapeArgs=g;a.top=c.path(b.top).attr({zIndex:b.zTop}).add(a);a.side1=c.path(b.side2).attr({zIndex:b.zSide2});a.side2=c.path(b.side1).attr({zIndex:b.zSide1});a.inn=c.path(b.inn).attr({zIndex:b.zInn});
+a.out=c.path(b.out).attr({zIndex:b.zOut});a.fillSetter=function(a){this.color=a;var b=d.Color(a).brighten(-0.1).get();this.side1.attr({fill:b});this.side2.attr({fill:b});this.inn.attr({fill:b});this.out.attr({fill:b});this.top.attr({fill:a});return this};a.translateXSetter=function(a){this.out.attr({translateX:a});this.inn.attr({translateX:a});this.side1.attr({translateX:a});this.side2.attr({translateX:a});this.top.attr({translateX:a})};a.translateYSetter=function(a){this.out.attr({translateY:a});
+this.inn.attr({translateY:a});this.side1.attr({translateY:a});this.side2.attr({translateY:a});this.top.attr({translateY:a})};a.animate=function(a,b,c){a.end||a.start?(this._shapeArgs=this.shapeArgs,d.SVGElement.prototype.animate.call(this,{_args:a},{duration:b,step:function(){var a=arguments[1],b=a.elem,c=b._shapeArgs,e=a.end,a=a.pos,c=d.merge(c,{start:c.start+(e.start-c.start)*a,end:c.end+(e.end-c.end)*a}),e=b.renderer.arc3dPath(c);b.shapeArgs=c;b.top.attr({d:e.top,zIndex:e.zTop});b.inn.attr({d:e.inn,
+zIndex:e.zInn});b.out.attr({d:e.out,zIndex:e.zOut});b.side1.attr({d:e.side1,zIndex:e.zSide1});b.side2.attr({d:e.side2,zIndex:e.zSide2})}},c)):d.SVGElement.prototype.animate.call(this,a,b,c);return this};a.destroy=function(){this.top.destroy();this.out.destroy();this.inn.destroy();this.side1.destroy();this.side2.destroy();d.SVGElement.prototype.destroy.call(this)};a.hide=function(){this.top.hide();this.out.hide();this.inn.hide();this.side1.hide();this.side2.hide()};a.show=function(){this.top.show();
+this.out.show();this.inn.show();this.side1.show();this.side2.show()};a.zIndex=e;a.attr({zIndex:e});return a};d.SVGRenderer.prototype.arc3dPath=function(d){var a=d.x,b=d.y,c=d.start,e=d.end-1.0E-5,f=d.r,j=d.innerR,i=d.depth,h=d.alpha,k=d.beta,o=m(c),q=l(c),d=m(e),z=l(e),r=f*m(k),s=f*m(h),p=j*m(k);j*=m(h);var v=i*l(k),u=i*l(h),i=["M",a+r*o,b+s*q],i=i.concat(w(a,b,r,s,c,e,0,0)),i=i.concat(["L",a+p*d,b+j*z]),i=i.concat(w(a,b,p,j,e,c,0,0)),i=i.concat(["Z"]),k=k>0?n/2:0,h=h>0?0:n/2,k=c>-k?c:e>-k?-k:c,t=
+e<n-h?e:c<n-h?n-h:e,h=["M",a+r*m(k),b+s*l(k)],h=h.concat(w(a,b,r,s,k,t,0,0)),h=h.concat(["L",a+r*m(t)+v,b+s*l(t)+u]),h=h.concat(w(a,b,r,s,t,k,v,u)),h=h.concat(["Z"]),k=["M",a+p*o,b+j*q],k=k.concat(w(a,b,p,j,c,e,0,0)),k=k.concat(["L",a+p*m(e)+v,b+j*l(e)+u]),k=k.concat(w(a,b,p,j,e,c,v,u)),k=k.concat(["Z"]),o=["M",a+r*o,b+s*q,"L",a+r*o+v,b+s*q+u,"L",a+p*o+v,b+j*q+u,"L",a+p*o,b+j*q,"Z"],a=["M",a+r*d,b+s*z,"L",a+r*d+v,b+s*z+u,"L",a+p*d+v,b+j*z+u,"L",a+p*d,b+j*z,"Z"],b=l((c+e)/2),c=l(c),e=l(e);return{top:i,
+zTop:f,out:h,zOut:Math.max(b,c,e)*f,inn:k,zInn:Math.max(b,c,e)*f,side1:o,zSide1:c*f*0.99,side2:a,zSide2:e*f*0.99}};d.Chart.prototype.is3d=function(){return this.options.chart.options3d&&this.options.chart.options3d.enabled};d.wrap(d.Chart.prototype,"isInsidePlot",function(d){return this.is3d()?!0:d.apply(this,[].slice.call(arguments,1))});var y=d.getOptions();y.chart.options3d={enabled:!1,alpha:0,beta:0,depth:100,viewDistance:25,frame:{bottom:{size:1,color:"rgba(255,255,255,0)"},side:{size:1,color:"rgba(255,255,255,0)"},
+back:{size:1,color:"rgba(255,255,255,0)"}}};y.plotOptions.pie.borderColor=void 0;d.wrap(d.Chart.prototype,"setChartSize",function(d){d.apply(this,[].slice.call(arguments,1));if(this.is3d()){var a=this.inverted,b=this.clipBox,c=this.margin;b[a?"y":"x"]=-(c[3]||0);b[a?"x":"y"]=-(c[0]||0);b[a?"height":"width"]=this.chartWidth+(c[3]||0)+(c[1]||0);b[a?"width":"height"]=this.chartHeight+(c[0]||0)+(c[2]||0)}});d.wrap(d.Chart.prototype,"redraw",function(d){if(this.is3d())this.isDirtyBox=!0;d.apply(this,[].slice.call(arguments,
+1))});d.Chart.prototype.retrieveStacks=function(g,a){var b={},c=1;if(g||!a)return this.series;d.each(this.series,function(a){b[a.options.stack||0]?b[a.options.stack||0].series.push(a):(b[a.options.stack||0]={series:[a],position:c},c++)});b.totalStacks=c+1;return b};d.wrap(d.Axis.prototype,"init",function(g){var a=arguments;if(a[1].is3d())a[2].tickWidth=d.pick(a[2].tickWidth,0),a[2].gridLineWidth=d.pick(a[2].gridLineWidth,1);g.apply(this,[].slice.call(arguments,1))});d.wrap(d.Axis.prototype,"render",
+function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.chart,b=a.renderer,c=a.options.chart.options3d,e=c.alpha,f=c.beta*(a.yAxis[0].opposite?-1:1),j=c.frame,i=j.bottom,h=j.back,j=j.side,k=c.depth,o=this.height,q=this.width,l=this.left,m=this.top,c={x:a.plotLeft+a.plotWidth/2,y:a.plotTop+a.plotHeight/2,z:k,vd:c.viewDistance};if(this.horiz)this.axisLine&&this.axisLine.hide(),f={x:l,y:m+(a.yAxis[0].reversed?-i.size:o),z:0,width:q,height:i.size,depth:k,alpha:e,beta:f,origin:c},
+this.bottomFrame?this.bottomFrame.animate(f):this.bottomFrame=b.cuboid(f).attr({fill:i.color,zIndex:a.yAxis[0].reversed&&e>0?4:-1}).css({stroke:i.color}).add();else{var n={x:l,y:m,z:k+1,width:q,height:o+i.size,depth:h.size,alpha:e,beta:f,origin:c};this.backFrame?this.backFrame.animate(n):this.backFrame=b.cuboid(n).attr({fill:h.color,zIndex:-3}).css({stroke:h.color}).add();this.axisLine&&this.axisLine.hide();a={x:(a.yAxis[0].opposite?q:0)+l-j.size,y:m,z:0,width:j.size,height:o+i.size,depth:k+h.size,
+alpha:e,beta:f,origin:c};this.sideFrame?this.sideFrame.animate(a):this.sideFrame=b.cuboid(a).attr({fill:j.color,zIndex:-2}).css({stroke:j.color}).add()}}});d.wrap(d.Axis.prototype,"getPlotLinePath",function(d){var a=d.apply(this,[].slice.call(arguments,1));if(!this.chart.is3d())return a;if(a===null)return a;var b=this.chart,c=b.options.chart.options3d,e=c.depth;c.origin={x:b.plotLeft+b.plotWidth/2,y:b.plotTop+b.plotHeight/2,z:e,vd:c.viewDistance};var a=[{x:a[1],y:a[2],z:this.horiz||this.opposite?
+e:0},{x:a[1],y:a[2],z:e},{x:a[4],y:a[5],z:e},{x:a[4],y:a[5],z:this.horiz||this.opposite?0:e}],e=b.options.inverted?c.beta:c.alpha,f=b.options.inverted?c.alpha:c.beta;f*=b.yAxis[0].opposite?-1:1;a=x(a,e,f,c.origin);return a=this.chart.renderer.toLinePath(a,!1)});d.wrap(d.Axis.prototype,"getPlotBandPath",function(d){if(this.chart.is3d()){var a=arguments,b=a[1],a=this.getPlotLinePath(a[2]);(b=this.getPlotLinePath(b))&&a?b.push(a[7],a[8],a[4],a[5],a[1],a[2]):b=null;return b}else return d.apply(this,[].slice.call(arguments,
+1))});d.wrap(d.Tick.prototype,"getMarkPath",function(d){var a=d.apply(this,[].slice.call(arguments,1));if(!this.axis.chart.is3d())return a;var b=this.axis.chart,c=b.options.chart.options3d,e={x:b.plotLeft+b.plotWidth/2,y:b.plotTop+b.plotHeight/2,z:c.depth,vd:c.viewDistance},a=[{x:a[1],y:a[2],z:0},{x:a[4],y:a[5],z:0}],f=b.inverted?c.beta:c.alpha,c=b.inverted?c.alpha:c.beta;c*=b.yAxis[0].opposite?-1:1;a=x(a,f,c,e);return a=["M",a[0].x,a[0].y,"L",a[1].x,a[1].y]});d.wrap(d.Tick.prototype,"getLabelPosition",
+function(d){var a=d.apply(this,[].slice.call(arguments,1));if(!this.axis.chart.is3d())return a;var b=this.axis.chart,c=b.options.chart.options3d,e={x:b.plotLeft+b.plotWidth/2,y:b.plotTop+b.plotHeight/2,z:c.depth,vd:c.viewDistance},f=b.inverted?c.beta:c.alpha,c=b.inverted?c.alpha:c.beta;c*=b.yAxis[0].opposite?-1:1;return a=x([{x:a.x,y:a.y,z:0}],f,c,e)[0]});d.wrap(d.Axis.prototype,"drawCrosshair",function(d){var a=arguments;this.chart.is3d()&&a[2]&&(a[2]={plotX:a[2].plotXold||a[2].plotX,plotY:a[2].plotYold||
+a[2].plotY});d.apply(this,[].slice.call(a,1))});d.wrap(d.seriesTypes.column.prototype,"translate",function(g){g.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.chart,b=this.options,c=a.options.chart.options3d,e=b.depth||25,f={x:a.plotWidth/2,y:a.plotHeight/2,z:c.depth,vd:c.viewDistance},j=c.alpha,i=c.beta*(a.yAxis[0].opposite?-1:1),h=(b.stacking?b.stack||0:this._i)*(e+(b.groupZPadding||1));b.grouping!==!1&&(h=0);h+=b.groupZPadding||1;d.each(this.data,function(a){var b=a.shapeArgs,
+c=a.tooltipPos;a.shapeType="cuboid";b.alpha=j;b.beta=i;b.z=h;b.origin=f;b.depth=e;c=x([{x:c[0],y:c[1],z:h}],j,i,f)[0];a.tooltipPos=[c.x,c.y]})}});d.wrap(d.seriesTypes.column.prototype,"animate",function(g){if(this.chart.is3d()){var a=arguments[1],b=this.yAxis,c=this,e=this.yAxis.reversed;if(d.svg)a?d.each(c.data,function(a){a.height=a.shapeArgs.height;a.shapey=a.shapeArgs.y;a.shapeArgs.height=1;if(!e)a.shapeArgs.y=a.stackY?a.plotY+b.translate(a.stackY):a.plotY+(a.negative?-a.height:a.height)}):(d.each(c.data,
+function(a){a.shapeArgs.height=a.height;a.shapeArgs.y=a.shapey;a.graphic&&a.graphic.animate(a.shapeArgs,c.options.animation)}),this.drawDataLabels(),c.animate=null)}else g.apply(this,[].slice.call(arguments,1))});d.wrap(d.seriesTypes.column.prototype,"init",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.options,b=a.grouping,c=a.stacking,e=0;if((b===void 0||b)&&c){b=this.chart.retrieveStacks(b,c);c=a.stack||0;for(e=0;e<b[c].series.length;e++)if(b[c].series[e]===
+this)break;e=b.totalStacks*10-10*(b.totalStacks-b[c].position)-e}a.zIndex=e}});d.wrap(d.Series.prototype,"alignDataLabel",function(d){if(this.chart.is3d()&&(this.type==="column"||this.type==="columnrange")){var a=this.chart,b=a.options.chart.options3d,c=arguments[4],e={x:c.x,y:c.y,z:0},e=x([e],b.alpha,b.beta*(a.yAxis[0].opposite?-1:1),{x:a.plotWidth/2,y:a.plotHeight/2,z:b.depth,vd:b.viewDistance})[0];c.x=e.x;c.y=e.y}d.apply(this,[].slice.call(arguments,1))});d.seriesTypes.columnrange&&d.wrap(d.seriesTypes.columnrange.prototype,
+"drawPoints",C);d.wrap(d.seriesTypes.column.prototype,"drawPoints",C);y=d.getOptions();y.plotOptions.cylinder=d.merge(y.plotOptions.column);y=d.extendClass(d.seriesTypes.column,{type:"cylinder"});d.seriesTypes.cylinder=y;d.wrap(d.seriesTypes.cylinder.prototype,"translate",function(g){g.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.chart,b=a.options,c=b.plotOptions.cylinder,b=b.chart.options3d,e=c.depth||0,f={x:a.inverted?a.plotHeight/2:a.plotWidth/2,y:a.inverted?a.plotWidth/
+2:a.plotHeight/2,z:b.depth,vd:b.viewDistance},j=b.alpha,i=c.stacking?(this.options.stack||0)*e:this._i*e;i+=e/2;c.grouping!==!1&&(i=0);d.each(this.data,function(a){var b=a.shapeArgs;a.shapeType="arc3d";b.x+=e/2;b.z=i;b.start=0;b.end=2*n;b.r=e*0.95;b.innerR=0;b.depth=b.height*(1/l((90-j)*t))-i;b.alpha=90-j;b.beta=0;b.origin=f})}});d.wrap(d.seriesTypes.pie.prototype,"translate",function(g){g.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this,b=a.chart,c=a.options,e=c.depth||0,f=
+b.options.chart.options3d,j={x:b.plotWidth/2,y:b.plotHeight/2,z:f.depth},i=f.alpha,h=f.beta,k=c.stacking?(c.stack||0)*e:a._i*e;k+=e/2;c.grouping!==!1&&(k=0);d.each(a.data,function(b){b.shapeType="arc3d";var c=b.shapeArgs;if(b.y)c.z=k,c.depth=e*0.75,c.origin=j,c.alpha=i,c.beta=h,c=(c.end+c.start)/2,b.slicedTranslation={translateX:A(m(c)*a.options.slicedOffset*m(i*t)),translateY:A(l(c)*a.options.slicedOffset*m(i*t))}})}});d.wrap(d.seriesTypes.pie.prototype.pointClass.prototype,"haloPath",function(d){return this.series.chart.is3d()?
+[]:d.call(this)});d.wrap(d.seriesTypes.pie.prototype,"drawPoints",function(g){if(this.chart.is3d()){var a=this.options,b=this.options.states;this.borderWidth=a.borderWidth=a.edgeWidth||1;b.hover.borderColor=d.pick(b.hover.edgeColor,this.borderColor);b.hover.borderWidth=d.pick(b.hover.edgeWidth,this.borderWidth);b.select.borderColor=d.pick(b.select.edgeColor,this.borderColor);b.select.borderWidth=d.pick(b.select.edgeWidth,this.borderWidth);d.each(this.data,function(a){var c=a.pointAttr;c[""].stroke=
+a.series.borderColor||a.color;c[""]["stroke-width"]=a.series.borderWidth;c.hover.stroke=b.hover.borderColor;c.hover["stroke-width"]=b.hover.borderWidth;c.select.stroke=b.select.borderColor;c.select["stroke-width"]=b.select.borderWidth})}g.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var c=this.group;d.each(this.points,function(a){a.graphic.out.add(c);a.graphic.inn.add(c);a.graphic.side1.add(c);a.graphic.side2.add(c)})}});d.wrap(d.seriesTypes.pie.prototype,"drawDataLabels",function(g){this.chart.is3d()&&
+d.each(this.data,function(a){var b=a.shapeArgs,c=b.r,d=b.depth,f=b.alpha*t,b=(b.start+b.end)/2,a=a.labelPos;a[1]+=-c*(1-m(f))*l(b)+(l(b)>0?l(f)*d:0);a[3]+=-c*(1-m(f))*l(b)+(l(b)>0?l(f)*d:0);a[5]+=-c*(1-m(f))*l(b)+(l(b)>0?l(f)*d:0)});g.apply(this,[].slice.call(arguments,1))});d.wrap(d.seriesTypes.pie.prototype,"addPoint",function(d){d.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&this.update()});d.wrap(d.seriesTypes.pie.prototype,"animate",function(g){if(this.chart.is3d()){var a=arguments[1],
+b=this.options.animation,c=this.center,e=this.group,f=this.markerGroup;if(d.svg)if(b===!0&&(b={}),a){if(e.oldtranslateX=e.translateX,e.oldtranslateY=e.translateY,a={translateX:c[0],translateY:c[1],scaleX:0.001,scaleY:0.001},e.attr(a),f)f.attrSetters=e.attrSetters,f.attr(a)}else a={translateX:e.oldtranslateX,translateY:e.oldtranslateY,scaleX:1,scaleY:1},e.animate(a,b),f&&f.animate(a,b),this.animate=null}else g.apply(this,[].slice.call(arguments,1))});d.wrap(d.seriesTypes.scatter.prototype,"translate",
+function(g){g.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.chart,b=this.chart.options.chart.options3d,c=b.alpha,e=b.beta,f={x:a.inverted?a.plotHeight/2:a.plotWidth/2,y:a.inverted?a.plotWidth/2:a.plotHeight/2,z:b.depth,vd:b.viewDistance},b=b.depth,j=a.options.zAxis||{min:0,max:b},i=b/(j.max-j.min);d.each(this.data,function(a){var b={x:a.plotX,y:a.plotY,z:(a.z-j.min)*i},b=x([b],c,e,f)[0];a.plotXold=a.plotX;a.plotYold=a.plotY;a.plotX=b.x;a.plotY=b.y;a.plotZ=b.z})}});d.wrap(d.seriesTypes.scatter.prototype,
+"init",function(d){var a=d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d())this.pointArrayMap=["x","y","z"],this.tooltipOptions.pointFormat=this.userOptions.tooltip?this.userOptions.tooltip.pointFormat||"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>":"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>";return a});if(d.VMLRenderer)d.setOptions({animate:!1}),d.VMLRenderer.prototype.cuboid=d.SVGRenderer.prototype.cuboid,d.VMLRenderer.prototype.cuboidPath=
+d.SVGRenderer.prototype.cuboidPath,d.VMLRenderer.prototype.toLinePath=d.SVGRenderer.prototype.toLinePath,d.VMLRenderer.prototype.createElement3D=d.SVGRenderer.prototype.createElement3D,d.VMLRenderer.prototype.arc3d=function(g){g=d.SVGRenderer.prototype.arc3d.call(this,g);g.css({zIndex:g.zIndex});return g},d.VMLRenderer.prototype.arc3dPath=d.SVGRenderer.prototype.arc3dPath,d.Chart.prototype.renderSeries=function(){for(var d,a=this.series.length;a--;)d=this.series[a],d.translate(),d.setTooltipPoints&&
+d.setTooltipPoints(),d.render()},d.wrap(d.Axis.prototype,"render",function(d){d.apply(this,[].slice.call(arguments,1));this.sideFrame&&(this.sideFrame.css({zIndex:0}),this.sideFrame.front.attr({fill:this.sideFrame.color}));this.bottomFrame&&(this.bottomFrame.css({zIndex:1}),this.bottomFrame.front.attr({fill:this.bottomFrame.color}));this.backFrame&&(this.backFrame.css({zIndex:0}),this.backFrame.front.attr({fill:this.backFrame.color}))})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-3d.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-3d.src.js
new file mode 100644
index 0000000..666b8a6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-3d.src.js
@@ -0,0 +1,1352 @@
+// ==ClosureCompiler==
+// @compilation_level SIMPLE_OPTIMIZATIONS
+
+/**
+ * @license Highcharts JS v4.0.3 (2014-07-03)
+ *
+ * (c) 2009-2013 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts, HighchartsAdapter, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console */
+
+(function (Highcharts) {
+	/**
+	Shorthands for often used function
+*/ 
+/**
+ *	Mathematical Functionility
+ */
+var PI = Math.PI,
+	deg2rad = (PI / 180), // degrees to radians 
+	sin = Math.sin,
+	cos = Math.cos, 
+
+	round = Math.round;
+
+function perspective(points, angle2, angle1, origin) {
+	angle1 *= deg2rad;
+	angle2 *= deg2rad;
+
+	var result = [],
+		xe, 
+		ye, 
+		ze;
+
+	angle1 *= -1;
+	
+	xe = origin.x;
+	ye = origin.y;
+	ze = (origin.z === 0 ? 0.0001 : origin.z) * (origin.vd || 25);
+	
+	// some kind of minimum?
+	ze = Math.max(500, ze);
+
+	var s1 = sin(angle1),
+		c1 = cos(angle1),
+		s2 = sin(angle2),
+		c2 = cos(angle2);
+
+	var x, y, z, p;
+
+	Highcharts.each(points, function (point) {
+		x = point.x - xe;
+		y = point.y - ye;
+		z = point.z || 0;
+
+		p = {
+			x: c1 * x - s1 * z,
+			y: -s1 * s2 * x - c1 * s2 * z + c2 * y,		
+			z: s1 * c2 * x + c1 * c2 * z + s2 * y
+		};
+
+		p.x = p.x * ((ze - p.z) / ze) + xe;
+		p.y = p.y * ((ze - p.z) / ze) + ye;
+
+		result.push({x: round(p.x), y: round(p.y), z: round(p.z)});
+	});
+	return result;
+}
+/*** 
+	EXTENSION TO THE SVG-RENDERER TO ENABLE 3D SHAPES
+	***/
+////// HELPER METHODS //////
+var dFactor = (4 * (Math.sqrt(2) - 1) / 3) / (PI / 2);
+
+function curveTo(cx, cy, rx, ry, start, end, dx, dy) {
+	var result = [];
+	if ((end > start) && (end - start > PI / 2 + 0.0001)) {
+		result = result.concat(curveTo(cx, cy, rx, ry, start, start + (PI / 2), dx, dy));
+		result = result.concat(curveTo(cx, cy, rx, ry, start + (PI / 2), end, dx, dy));
+		return result;
+	} else if ((end < start) && (start - end > PI / 2 + 0.0001)) {			
+		result = result.concat(curveTo(cx, cy, rx, ry, start, start - (PI / 2), dx, dy));
+		result = result.concat(curveTo(cx, cy, rx, ry, start - (PI / 2), end, dx, dy));
+		return result;
+	} else {
+		var arcAngle = end - start;
+		return [
+			'C', 
+			cx + (rx * cos(start)) - ((rx * dFactor * arcAngle) * sin(start)) + dx,
+			cy + (ry * sin(start)) + ((ry * dFactor * arcAngle) * cos(start)) + dy,
+			cx + (rx * cos(end)) + ((rx * dFactor * arcAngle) * sin(end)) + dx,
+			cy + (ry * sin(end)) - ((ry * dFactor * arcAngle) * cos(end)) + dy,
+
+			cx + (rx * cos(end)) + dx,
+			cy + (ry * sin(end)) + dy
+		];
+	}
+}
+
+Highcharts.SVGRenderer.prototype.toLinePath = function (points, closed) {
+	var result = [];
+
+	// Put "L x y" for each point
+	Highcharts.each(points, function (point) {
+		result.push('L', point.x, point.y);
+	});
+
+	// Set the first element to M
+	result[0] = 'M';
+
+	// If it is a closed line, add Z
+	if (closed) {
+		result.push('Z');
+	}
+	
+	return result;
+};
+
+////// CUBOIDS //////
+Highcharts.SVGRenderer.prototype.cuboid = function (shapeArgs) {
+
+	var result = this.g(),
+	paths = this.cuboidPath(shapeArgs);
+
+	result.front = this.path(paths[0]).attr({zIndex: paths[3], 'stroke-linejoin': 'round'}).add(result);
+	result.top = this.path(paths[1]).attr({zIndex: paths[4], 'stroke-linejoin': 'round'}).add(result);
+	result.side = this.path(paths[2]).attr({zIndex: paths[5], 'stroke-linejoin': 'round'}).add(result);
+
+	result.fillSetter = function (color) {
+		var c0 = color,
+		c1 = Highcharts.Color(color).brighten(0.1).get(),
+		c2 = Highcharts.Color(color).brighten(-0.1).get();
+
+		this.front.attr({fill: c0});
+		this.top.attr({fill: c1});
+		this.side.attr({fill: c2});
+
+		this.color = color;
+		return this;
+	};
+
+	result.opacitySetter = function (opacity) {
+		this.front.attr({opacity: opacity});
+		this.top.attr({opacity: opacity});
+		this.side.attr({opacity: opacity});
+		return this;
+	};
+
+	result.attr = function (args) {
+		if (args.shapeArgs || args.x) {
+			var shapeArgs = args.shapeArgs || args;
+			var paths = this.renderer.cuboidPath(shapeArgs);
+			this.front.attr({d: paths[0], zIndex: paths[3]});
+			this.top.attr({d: paths[1], zIndex: paths[4]});
+			this.side.attr({d: paths[2], zIndex: paths[5]});			
+		} else {
+			Highcharts.SVGElement.prototype.attr.call(this, args);
+		}
+
+		return this;
+	};
+	
+	result.animate = function (args, duration, complete) {
+		if (args.x && args.y) {
+			var paths = this.renderer.cuboidPath(args);
+			this.front.attr({zIndex: paths[3]}).animate({d: paths[0]}, duration, complete);
+			this.top.attr({zIndex: paths[4]}).animate({d: paths[1]}, duration, complete);
+			this.side.attr({zIndex: paths[5]}).animate({d: paths[2]}, duration, complete);
+		} else if (args.opacity) {				
+				this.front.animate(args, duration, complete);
+				this.top.animate(args, duration, complete);
+				this.side.animate(args, duration, complete);
+		} else {
+			Highcharts.SVGElement.prototype.animate.call(this, args, duration, complete);
+		}
+		return this;
+	};
+
+	result.destroy = function () {
+		this.front.destroy();
+		this.top.destroy();
+		this.side.destroy();
+
+		return null;
+	};
+
+	// Apply the Z index to the cuboid group
+	result.attr({ zIndex: -paths[3] });
+
+	return result;
+};
+
+
+Highcharts.SVGRenderer.prototype.cuboidPath = function (shapeArgs) {
+	var x = shapeArgs.x,
+		y = shapeArgs.y,
+		z = shapeArgs.z,
+		h = shapeArgs.height,
+		w = shapeArgs.width,
+		d = shapeArgs.depth,
+		alpha = shapeArgs.alpha,
+		beta = shapeArgs.beta,
+		origin = shapeArgs.origin;
+
+	var pArr = [
+		{x: x, y: y, z: z},
+		{x: x + w, y: y, z: z},
+		{x: x + w, y: y + h, z: z},
+		{x: x, y: y + h, z: z},
+		{x: x, y: y + h, z: z + d},
+		{x: x + w, y: y + h, z: z + d},
+		{x: x + w, y: y, z: z + d},
+		{x: x, y: y, z: z + d}
+	];
+
+	pArr = perspective(pArr, alpha, beta, origin);
+
+	var path1, // FRONT
+		path2, // TOP OR BOTTOM
+		path3; // LEFT OR RIGHT
+
+	// front	
+	path1 = [
+	'M', pArr[0].x, pArr[0].y,
+	'L', pArr[1].x, pArr[1].y,
+	'L', pArr[2].x, pArr[2].y,
+	'L', pArr[3].x, pArr[3].y,
+	'Z'
+	];
+	var z1 = (pArr[0].z + pArr[1].z + pArr[2].z + pArr[3].z) / 4;
+
+	// top or bottom
+	var top = [
+	'M', pArr[0].x, pArr[0].y,
+	'L', pArr[7].x, pArr[7].y,
+	'L', pArr[6].x, pArr[6].y,
+	'L', pArr[1].x, pArr[1].y,
+	'Z'
+	];
+	var bottom = [
+	'M', pArr[3].x, pArr[3].y,
+	'L', pArr[2].x, pArr[2].y,
+	'L', pArr[5].x, pArr[5].y,
+	'L', pArr[4].x, pArr[4].y,
+	'Z'
+	];
+	if (pArr[7].y < pArr[1].y) {
+		path2 = top;
+	} else if (pArr[4].y > pArr[2].y) {
+		path2 = bottom;
+	} else {
+		path2 = [];
+	}
+	var z2 = (beta > 0 ? (pArr[0].z + pArr[7].z + pArr[6].z + pArr[1].z) / 4 : (pArr[3].z + pArr[2].z + pArr[5].z + pArr[4].z) / 4);
+
+	// side
+	var right = [
+	'M', pArr[1].x, pArr[1].y,
+	'L', pArr[2].x, pArr[2].y,
+	'L', pArr[5].x, pArr[5].y,
+	'L', pArr[6].x, pArr[6].y,
+	'Z'
+	];
+	var left = [
+	'M', pArr[0].x, pArr[0].y,
+	'L', pArr[7].x, pArr[7].y,
+	'L', pArr[4].x, pArr[4].y,
+	'L', pArr[3].x, pArr[3].y,
+	'Z'
+	];	
+	if (pArr[6].x > pArr[1].x) {
+		path3 = right;
+	} else if (pArr[7].x < pArr[0].x) {
+		path3 = left;
+	} else {
+		path3 = [];
+	}
+	var z3 = (alpha > 0 ? (pArr[1].z + pArr[2].z + pArr[5].z + pArr[6].z) / 4 : (pArr[0].z + pArr[7].z + pArr[4].z + pArr[3].z) / 4);
+
+	return [path1, path2, path3, z1, z2, z3];
+};
+
+////// SECTORS //////
+Highcharts.SVGRenderer.prototype.arc3d = function (shapeArgs) {
+
+	shapeArgs.alpha *= deg2rad;
+	shapeArgs.beta *= deg2rad;
+	var result = this.g(),
+		paths = this.arc3dPath(shapeArgs),
+		renderer = result.renderer;
+
+	var zIndex = paths.zTop * 100;
+
+	result.shapeArgs = shapeArgs;	// Store for later use
+
+	result.top = renderer.path(paths.top).attr({zIndex: paths.zTop}).add(result);
+	result.side1 = renderer.path(paths.side2).attr({zIndex: paths.zSide2});
+	result.side2 = renderer.path(paths.side1).attr({zIndex: paths.zSide1});
+	result.inn = renderer.path(paths.inn).attr({zIndex: paths.zInn});
+	result.out = renderer.path(paths.out).attr({zIndex: paths.zOut});
+
+	result.fillSetter = function (color) {
+		this.color = color;
+
+		var c0 = color,
+		c2 = Highcharts.Color(color).brighten(-0.1).get();
+		
+		this.side1.attr({fill: c2});
+		this.side2.attr({fill: c2});
+		this.inn.attr({fill: c2});
+		this.out.attr({fill: c2});
+		this.top.attr({fill: c0});
+		return this;
+	};
+	
+	result.translateXSetter = function (value) {
+		this.out.attr({translateX: value});
+		this.inn.attr({translateX: value});
+		this.side1.attr({translateX: value});
+		this.side2.attr({translateX: value});
+		this.top.attr({translateX: value});
+	};
+	
+	result.translateYSetter = function (value) {
+		this.out.attr({translateY: value});
+		this.inn.attr({translateY: value});
+		this.side1.attr({translateY: value});
+		this.side2.attr({translateY: value});
+		this.top.attr({translateY: value});
+	};
+
+	result.animate = function (args, duration, complete) {
+		if (args.end || args.start) {
+			this._shapeArgs = this.shapeArgs;
+
+			Highcharts.SVGElement.prototype.animate.call(this, {
+				_args: args	
+			}, {
+				duration: duration,
+				step: function () {
+					var args = arguments,
+						fx = args[1],
+						result = fx.elem,						
+						start = result._shapeArgs,
+						end = fx.end,
+						pos = fx.pos,
+						sA = Highcharts.merge(start, {
+							start: start.start + ((end.start - start.start) * pos),
+							end: start.end + ((end.end - start.end) * pos)
+						});
+
+					var paths = result.renderer.arc3dPath(sA);
+
+					result.shapeArgs = sA;
+
+					result.top.attr({d: paths.top, zIndex: paths.zTop});
+					result.inn.attr({d: paths.inn, zIndex: paths.zInn});
+					result.out.attr({d: paths.out, zIndex: paths.zOut});
+					result.side1.attr({d: paths.side1, zIndex: paths.zSide1});
+					result.side2.attr({d: paths.side2, zIndex: paths.zSide2});
+
+				}
+			}, complete);
+		} else {			
+			Highcharts.SVGElement.prototype.animate.call(this, args, duration, complete);
+		}
+		return this;
+	};
+
+	result.destroy = function () {
+		this.top.destroy();
+		this.out.destroy();
+		this.inn.destroy();
+		this.side1.destroy();
+		this.side2.destroy();
+
+		Highcharts.SVGElement.prototype.destroy.call(this);
+	};
+	result.hide = function () {
+		this.top.hide();
+		this.out.hide();
+		this.inn.hide();
+		this.side1.hide();
+		this.side2.hide();
+	};
+	result.show = function () {
+		this.top.show();
+		this.out.show();
+		this.inn.show();
+		this.side1.show();
+		this.side2.show();
+	};
+	
+	result.zIndex = zIndex;
+	result.attr({zIndex: zIndex});
+	return result;
+};
+
+
+Highcharts.SVGRenderer.prototype.arc3dPath = function (shapeArgs) {
+	var cx = shapeArgs.x,
+		cy = shapeArgs.y,
+		start = shapeArgs.start,
+		end = shapeArgs.end - 0.00001,
+		r = shapeArgs.r,
+		ir = shapeArgs.innerR,
+		d = shapeArgs.depth,
+		alpha = shapeArgs.alpha,
+		beta = shapeArgs.beta;
+
+	// Some Variables
+	var cs = cos(start),
+		ss = sin(start),
+		ce = cos(end),
+		se = sin(end),
+		rx = r * cos(beta),
+		ry = r * cos(alpha),
+		irx = ir * cos(beta),
+		iry = ir * cos(alpha),
+		dx = d * sin(beta),
+		dy = d * sin(alpha);
+
+	// TOP	
+	var top = ['M', cx + (rx * cs), cy + (ry * ss)];
+	top = top.concat(curveTo(cx, cy, rx, ry, start, end, 0, 0));
+	top = top.concat([
+		'L', cx + (irx * ce), cy + (iry * se)
+	]);
+	top = top.concat(curveTo(cx, cy, irx, iry, end, start, 0, 0));
+	top = top.concat(['Z']);
+
+	// OUTSIDE
+	var b = (beta > 0 ? PI / 2 : 0),
+		a = (alpha > 0 ? 0 : PI / 2);
+
+	var start2 = start > -b ? start : (end > -b ? -b : start),
+		end2 = end < PI - a ? end : (start < PI - a ? PI - a : end);
+	
+	var out = ['M', cx + (rx * cos(start2)), cy + (ry * sin(start2))];
+	out = out.concat(curveTo(cx, cy, rx, ry, start2, end2, 0, 0));
+	out = out.concat([
+		'L', cx + (rx * cos(end2)) + dx, cy + (ry * sin(end2)) + dy
+	]);
+	out = out.concat(curveTo(cx, cy, rx, ry, end2, start2, dx, dy));
+	out = out.concat(['Z']);
+
+	// INSIDE
+	var inn = ['M', cx + (irx * cs), cy + (iry * ss)];
+	inn = inn.concat(curveTo(cx, cy, irx, iry, start, end, 0, 0));
+	inn = inn.concat([
+		'L', cx + (irx * cos(end)) + dx, cy + (iry * sin(end)) + dy
+	]);
+	inn = inn.concat(curveTo(cx, cy, irx, iry, end, start, dx, dy));
+	inn = inn.concat(['Z']);
+
+	// SIDES
+	var side1 = [
+		'M', cx + (rx * cs), cy + (ry * ss),
+		'L', cx + (rx * cs) + dx, cy + (ry * ss) + dy,
+		'L', cx + (irx * cs) + dx, cy + (iry * ss) + dy,
+		'L', cx + (irx * cs), cy + (iry * ss),
+		'Z'
+	];
+	var side2 = [
+		'M', cx + (rx * ce), cy + (ry * se),
+		'L', cx + (rx * ce) + dx, cy + (ry * se) + dy,
+		'L', cx + (irx * ce) + dx, cy + (iry * se) + dy,
+		'L', cx + (irx * ce), cy + (iry * se),
+		'Z'
+	];
+
+	var a1 = sin((start + end) / 2),
+		a2 = sin(start),
+		a3 = sin(end);
+
+	return {
+		top: top,
+		zTop: r,
+		out: out,
+		zOut: Math.max(a1, a2, a3) * r,
+		inn: inn,
+		zInn: Math.max(a1, a2, a3) * r,
+		side1: side1,
+		zSide1: a2 * (r * 0.99),
+		side2: side2,
+		zSide2: a3 * (r * 0.99)
+	};
+};
+/*** 
+	EXTENSION FOR 3D CHARTS
+***/
+// Shorthand to check the is3d flag
+Highcharts.Chart.prototype.is3d = function () {
+	return this.options.chart.options3d && this.options.chart.options3d.enabled;
+};
+
+Highcharts.wrap(Highcharts.Chart.prototype, 'isInsidePlot', function (proceed) {
+	if (this.is3d()) {
+		return true;
+	} else {
+		return proceed.apply(this, [].slice.call(arguments, 1));
+	}
+});
+
+var defaultChartOptions = Highcharts.getOptions();
+defaultChartOptions.chart.options3d = {
+	enabled: false,
+	alpha: 0,
+	beta: 0,
+	depth: 100,
+	viewDistance: 25,
+	frame: {
+		bottom: { size: 1, color: 'rgba(255,255,255,0)' },
+		side: { size: 1, color: 'rgba(255,255,255,0)' },
+		back: { size: 1, color: 'rgba(255,255,255,0)' }
+	}
+};
+defaultChartOptions.plotOptions.pie.borderColor = undefined;
+
+Highcharts.wrap(Highcharts.Chart.prototype, 'setChartSize', function (proceed) {
+	proceed.apply(this, [].slice.call(arguments, 1));
+
+	if (this.is3d()) {
+		var inverted = this.inverted,
+			clipBox = this.clipBox,
+			margin = this.margin,
+			x = inverted ? 'y' : 'x',
+			y = inverted ? 'x' : 'y',
+			w = inverted ? 'height' : 'width',
+			h = inverted ? 'width' : 'height';
+
+		clipBox[x] = -(margin[3] || 0);
+		clipBox[y] = -(margin[0] || 0);
+		clipBox[w] = this.chartWidth + (margin[3] || 0) + (margin[1] || 0);
+		clipBox[h] = this.chartHeight + (margin[0] || 0) + (margin[2] || 0);
+	}
+});
+
+Highcharts.wrap(Highcharts.Chart.prototype, 'redraw', function (proceed) {
+	if (this.is3d()) {
+		// Set to force a redraw of all elements
+		this.isDirtyBox = true;
+	}
+	proceed.apply(this, [].slice.call(arguments, 1));	
+});
+
+Highcharts.Chart.prototype.retrieveStacks = function (grouping, stacking) {
+
+	var stacks = {},
+		i = 1;
+
+	if (grouping || !stacking) { return this.series; }
+
+	Highcharts.each(this.series, function (S) {
+		if (!stacks[S.options.stack || 0]) {
+			stacks[S.options.stack || 0] = { series: [S], position: i};
+			i++;
+		} else {
+			stacks[S.options.stack || 0].series.push(S);
+		}
+	});
+	stacks.totalStacks = i + 1;
+	return stacks;
+};
+
+/*** 
+	EXTENSION TO THE AXIS
+***/
+Highcharts.wrap(Highcharts.Axis.prototype, 'init', function (proceed) {
+	var args = arguments;
+	if (args[1].is3d()) {
+		args[2].tickWidth = Highcharts.pick(args[2].tickWidth, 0);
+		args[2].gridLineWidth = Highcharts.pick(args[2].gridLineWidth, 1);
+	}
+
+	proceed.apply(this, [].slice.call(arguments, 1));
+});	
+Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) {
+	proceed.apply(this, [].slice.call(arguments, 1));
+
+	// Do not do this if the chart is not 3D
+	if (!this.chart.is3d()) {
+		return;
+	}
+
+	var chart = this.chart,
+		renderer = chart.renderer,
+		options3d = chart.options.chart.options3d,
+		alpha = options3d.alpha,
+		beta = options3d.beta * (chart.yAxis[0].opposite ? -1 : 1),
+		frame = options3d.frame,
+		fbottom = frame.bottom,
+		fback = frame.back,
+		fside = frame.side,
+		depth = options3d.depth,
+		height = this.height,
+		width = this.width,
+		left = this.left,
+		top = this.top;
+
+	var origin = {
+		x: chart.plotLeft + (chart.plotWidth / 2),
+		y: chart.plotTop + (chart.plotHeight / 2),
+		z: depth,
+		vd: options3d.viewDistance
+	};
+	if (this.horiz) {
+		/// BOTTOM
+		if (this.axisLine) {
+			this.axisLine.hide();
+		}
+		var bottomShape = {
+			x: left,
+			y: top + (chart.yAxis[0].reversed ? -fbottom.size : height),
+			z: 0,
+			width: width,
+			height: fbottom.size,
+			depth: depth,
+			alpha: alpha,
+			beta: beta,
+			origin: origin
+		};
+		if (!this.bottomFrame) {
+			this.bottomFrame = renderer.cuboid(bottomShape).attr({fill: fbottom.color, zIndex: (chart.yAxis[0].reversed && alpha > 0 ? 4 : -1)}).css({stroke: fbottom.color}).add();
+		} else {
+			this.bottomFrame.animate(bottomShape);
+		}
+	} else {
+		// BACK
+		var backShape = {
+			x: left,
+			y: top,
+			z: depth + 1,
+			width: width,
+			height: height + fbottom.size,
+			depth: fback.size,
+			alpha: alpha,
+			beta: beta,
+			origin: origin
+		};
+		if (!this.backFrame) {
+			this.backFrame = renderer.cuboid(backShape).attr({fill: fback.color, zIndex: -3}).css({stroke: fback.color}).add();
+		} else {
+			this.backFrame.animate(backShape);
+		}
+		// SIDE
+		if (this.axisLine) {
+			this.axisLine.hide();
+		}
+		var sideShape = {
+			x: (chart.yAxis[0].opposite ? width : 0) + left - fside.size,
+			y: top,
+			z: 0,
+			width: fside.size,
+			height: height + fbottom.size,
+			depth: depth + fback.size,
+			alpha: alpha,
+			beta: beta,
+			origin: origin
+		};
+		if (!this.sideFrame) {
+			this.sideFrame = renderer.cuboid(sideShape).attr({fill: fside.color, zIndex: -2}).css({stroke: fside.color}).add();
+		} else {
+			this.sideFrame.animate(sideShape);
+		}
+	}
+});
+
+Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotLinePath', function (proceed) {
+	var path = proceed.apply(this, [].slice.call(arguments, 1));
+	
+	// Do not do this if the chart is not 3D
+	if (!this.chart.is3d()) {
+		return path;
+	}
+
+	if (path === null) { return path; }
+
+	var chart = this.chart,
+		options3d = chart.options.chart.options3d;
+
+	var d = options3d.depth;
+
+	options3d.origin = {
+		x: chart.plotLeft + (chart.plotWidth / 2),
+		y: chart.plotTop + (chart.plotHeight / 2),
+		z: d,
+		vd: options3d.viewDistance
+	};
+
+	var pArr = [
+		{ x: path[1], y: path[2], z : (this.horiz || this.opposite ? d : 0)},
+		{ x: path[1], y: path[2], z : d },
+		{ x: path[4], y: path[5], z : d },
+		{ x: path[4], y: path[5], z : (this.horiz || this.opposite ? 0 : d)}
+	];
+
+	var alpha = chart.options.inverted ? options3d.beta : options3d.alpha,
+		beta = chart.options.inverted ? options3d.alpha : options3d.beta;
+
+	beta *= (chart.yAxis[0].opposite ? -1 : 1);
+
+	pArr = perspective(pArr, alpha, beta, options3d.origin);
+	path = this.chart.renderer.toLinePath(pArr, false);
+
+	return path;
+});
+
+Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotBandPath', function (proceed) {
+	// Do not do this if the chart is not 3D
+	if (!this.chart.is3d()) {
+		return proceed.apply(this, [].slice.call(arguments, 1));
+	} else {
+		var args = arguments,
+			from = args[1],
+			to = args[2];
+	
+		var toPath = this.getPlotLinePath(to),
+			path = this.getPlotLinePath(from);
+
+		if (path && toPath) {
+			path.push(
+				toPath[7],	// These two do not exist in the regular getPlotLine
+				toPath[8],  // ---- # 3005
+				toPath[4],
+				toPath[5],
+				toPath[1],
+				toPath[2]
+			);
+		} else { // outside the axis area
+			path = null;
+		}
+		
+		return path;
+	}
+});
+
+/*** 
+	EXTENSION TO THE TICKS
+***/
+
+Highcharts.wrap(Highcharts.Tick.prototype, 'getMarkPath', function (proceed) {
+	var path = proceed.apply(this, [].slice.call(arguments, 1));	
+
+	// Do not do this if the chart is not 3D
+	if (!this.axis.chart.is3d()) {
+		return path;
+	}
+
+	var chart = this.axis.chart,
+		options3d = chart.options.chart.options3d;
+
+	var origin = {
+		x: chart.plotLeft + (chart.plotWidth / 2),
+		y: chart.plotTop + (chart.plotHeight / 2),
+		z: options3d.depth,
+		vd: options3d.viewDistance
+	};
+
+	var pArr = [
+		{x: path[1], y: path[2], z: 0},
+		{x: path[4], y: path[5], z: 0}
+	];
+	
+	var alpha = chart.inverted ? options3d.beta : options3d.alpha,
+		beta = chart.inverted ? options3d.alpha : options3d.beta;
+
+	beta *= (chart.yAxis[0].opposite ? -1 : 1);
+
+	pArr = perspective(pArr, alpha, beta, origin);
+	path = [
+		'M', pArr[0].x, pArr[0].y,
+		'L', pArr[1].x, pArr[1].y
+		];
+	return path;
+});
+
+Highcharts.wrap(Highcharts.Tick.prototype, 'getLabelPosition', function (proceed) {
+	var pos = proceed.apply(this, [].slice.call(arguments, 1));
+	
+	// Do not do this if the chart is not 3D
+	if (!this.axis.chart.is3d()) {
+		return pos;
+	}	
+
+	var chart = this.axis.chart,
+		options3d = chart.options.chart.options3d;
+
+	var origin = {
+		x: chart.plotLeft + (chart.plotWidth / 2),
+		y: chart.plotTop + (chart.plotHeight / 2),
+		z: options3d.depth,
+		vd: options3d.viewDistance
+	};
+	
+	var alpha = chart.inverted ? options3d.beta : options3d.alpha,
+		beta = chart.inverted ? options3d.alpha : options3d.beta;
+
+	beta *= (chart.yAxis[0].opposite ? -1 : 1);
+
+	pos = perspective([{x: pos.x, y: pos.y, z: 0}], alpha, beta, origin)[0];
+	return pos;
+});
+
+Highcharts.wrap(Highcharts.Axis.prototype, 'drawCrosshair', function (proceed) {
+	var args = arguments;
+	if (this.chart.is3d()) {
+		if (args[2]) {
+			args[2] = {
+				plotX: args[2].plotXold || args[2].plotX,
+				plotY: args[2].plotYold || args[2].plotY
+			};
+		}
+	}
+	proceed.apply(this, [].slice.call(args, 1));
+});/*** 
+	EXTENSION FOR 3D COLUMNS
+***/
+Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'translate', function (proceed) {
+	proceed.apply(this, [].slice.call(arguments, 1));
+
+	// Do not do this if the chart is not 3D
+	if (!this.chart.is3d()) {  
+		return;
+	}	
+
+	var series = this,
+		chart = series.chart,
+		options = chart.options,
+		seriesOptions = series.options,		
+		options3d = options.chart.options3d,
+
+		depth = seriesOptions.depth || 25,
+		origin = {
+			x: chart.plotWidth / 2,
+			y: chart.plotHeight / 2, 
+			z: options3d.depth,
+			vd: options3d.viewDistance
+		},
+		alpha = options3d.alpha,
+		beta = options3d.beta * (chart.yAxis[0].opposite ? -1 : 1);
+
+	var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series._i; 
+	var z = stack * (depth + (seriesOptions.groupZPadding || 1));
+
+	if (seriesOptions.grouping !== false) { z = 0; }
+
+	z += (seriesOptions.groupZPadding || 1);
+
+	Highcharts.each(series.data, function (point) {
+		var shapeArgs = point.shapeArgs,
+			tooltipPos = point.tooltipPos;
+
+		point.shapeType = 'cuboid';
+		shapeArgs.alpha = alpha;
+		shapeArgs.beta = beta; 
+		shapeArgs.z = z;
+		shapeArgs.origin = origin;
+		shapeArgs.depth = depth;
+
+		// Translate the tooltip position in 3d space
+		tooltipPos = perspective([{ x: tooltipPos[0], y: tooltipPos[1], z: z }], alpha, beta, origin)[0];
+		point.tooltipPos = [tooltipPos.x, tooltipPos.y];
+
+	});	    
+});
+
+Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'animate', function (proceed) {
+	if (!this.chart.is3d()) {
+		proceed.apply(this, [].slice.call(arguments, 1));
+	} else {
+		var args = arguments,
+			init = args[1],
+			yAxis = this.yAxis,
+			series = this,
+			reversed = this.yAxis.reversed;
+
+		if (Highcharts.svg) { // VML is too slow anyway
+			if (init) {
+				Highcharts.each(series.data, function (point) {
+					point.height = point.shapeArgs.height;
+					point.shapey = point.shapeArgs.y;	//#2968				
+					point.shapeArgs.height = 1;
+					if (!reversed) {
+						if (point.stackY) {
+							point.shapeArgs.y = point.plotY + yAxis.translate(point.stackY);
+						} else {
+							point.shapeArgs.y = point.plotY + (point.negative ? -point.height : point.height);
+						}
+					}
+				});
+
+			} else { // run the animation				
+				Highcharts.each(series.data, function (point) {					
+					point.shapeArgs.height = point.height;
+					point.shapeArgs.y = point.shapey;	//#2968
+					// null value do not have a graphic
+					if (point.graphic) {
+						point.graphic.animate(point.shapeArgs, series.options.animation);					
+					}
+				});
+
+				// redraw datalabels to the correct position
+				this.drawDataLabels();
+
+				// delete this function to allow it only once
+				series.animate = null;
+			}
+		}
+	}
+});
+
+Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'init', function (proceed) {
+	proceed.apply(this, [].slice.call(arguments, 1));
+
+	if (this.chart.is3d()) {
+		var seriesOptions = this.options,	
+			grouping = seriesOptions.grouping,
+			stacking = seriesOptions.stacking,
+			z = 0;	
+		
+		if (!(grouping !== undefined && !grouping) && stacking) {
+			var stacks = this.chart.retrieveStacks(grouping, stacking),
+				stack = seriesOptions.stack || 0,
+				i; // position within the stack
+			for (i = 0; i < stacks[stack].series.length; i++) {
+				if (stacks[stack].series[i] === this) {
+					break;
+				}
+			}
+			z = (stacks.totalStacks * 10) - (10 * (stacks.totalStacks - stacks[stack].position)) - i;
+		}
+				
+		seriesOptions.zIndex = z;
+	}
+});
+function draw3DPoints(proceed) {
+	// Do not do this if the chart is not 3D
+	if (this.chart.is3d()) {		
+		var grouping = this.chart.options.plotOptions.column.grouping;
+		if (grouping !== undefined && !grouping && this.group.zIndex !== undefined) {
+			this.group.attr({zIndex : (this.group.zIndex * 10)});
+		} 
+
+		var options = this.options,
+			states = this.options.states;
+			
+		this.borderWidth = options.borderWidth = options.edgeWidth || 1;
+
+		Highcharts.each(this.data, function (point) {
+			var pointAttr = point.pointAttr;
+
+			// Set the border color to the fill color to provide a smooth edge
+			this.borderColor = Highcharts.pick(options.edgeColor, pointAttr[''].fill);
+
+			pointAttr[''].stroke = this.borderColor;
+			pointAttr.hover.stroke = Highcharts.pick(states.hover.edgeColor, this.borderColor);
+			pointAttr.select.stroke = Highcharts.pick(states.select.edgeColor, this.borderColor);
+		});
+	}
+
+	proceed.apply(this, [].slice.call(arguments, 1));
+}
+
+Highcharts.wrap(Highcharts.Series.prototype, 'alignDataLabel', function (proceed) {
+	
+	// Only do this for 3D columns and columnranges
+	if (this.chart.is3d() && (this.type === 'column' || this.type === 'columnrange')) {
+		var series = this,
+			chart = series.chart,
+			options = chart.options,		
+			options3d = options.chart.options3d,
+			origin = {
+				x: chart.plotWidth / 2,
+				y: chart.plotHeight / 2, 
+				z: options3d.depth,
+				vd: options3d.viewDistance
+			},
+			alpha = options3d.alpha,
+			beta = options3d.beta * (chart.yAxis[0].opposite ? -1 : 1);
+
+		var args = arguments,
+			alignTo = args[4];
+		
+		var pos = ({x: alignTo.x, y: alignTo.y, z: 0});
+		pos = perspective([pos], alpha, beta, origin)[0];
+		alignTo.x = pos.x;
+		alignTo.y = pos.y;
+	}
+
+	proceed.apply(this, [].slice.call(arguments, 1));
+});
+
+if (Highcharts.seriesTypes.columnrange) {
+	Highcharts.wrap(Highcharts.seriesTypes.columnrange.prototype, 'drawPoints', draw3DPoints);
+}
+
+Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'drawPoints', draw3DPoints);
+
+/*** 
+	EXTENSION FOR 3D CYLINDRICAL COLUMNS
+	Not supported
+***/
+var defaultOptions = Highcharts.getOptions();
+defaultOptions.plotOptions.cylinder = Highcharts.merge(defaultOptions.plotOptions.column);
+var CylinderSeries = Highcharts.extendClass(Highcharts.seriesTypes.column, {
+	type: 'cylinder'
+});
+Highcharts.seriesTypes.cylinder = CylinderSeries;
+
+Highcharts.wrap(Highcharts.seriesTypes.cylinder.prototype, 'translate', function (proceed) {
+	proceed.apply(this, [].slice.call(arguments, 1));
+
+	// Do not do this if the chart is not 3D
+	if (!this.chart.is3d()) {
+		return;
+	}	
+
+	var series = this,
+		chart = series.chart,
+		options = chart.options,
+		cylOptions = options.plotOptions.cylinder,
+		options3d = options.chart.options3d,
+		depth = cylOptions.depth || 0,
+		origin = {
+			x: chart.inverted ? chart.plotHeight / 2 : chart.plotWidth / 2,
+			y: chart.inverted ? chart.plotWidth / 2 : chart.plotHeight / 2, 
+			z: options3d.depth,
+			vd: options3d.viewDistance
+		},
+		alpha = options3d.alpha;
+
+	var z = cylOptions.stacking ? (this.options.stack || 0) * depth : series._i * depth;
+	z += depth / 2;
+
+	if (cylOptions.grouping !== false) { z = 0; }
+
+	Highcharts.each(series.data, function (point) {
+		var shapeArgs = point.shapeArgs;
+		point.shapeType = 'arc3d';
+		shapeArgs.x += depth / 2;
+		shapeArgs.z = z;
+		shapeArgs.start = 0;
+		shapeArgs.end = 2 * PI;
+		shapeArgs.r = depth * 0.95;
+		shapeArgs.innerR = 0;
+		shapeArgs.depth = shapeArgs.height * (1 / sin((90 - alpha) * deg2rad)) - z;
+		shapeArgs.alpha = 90 - alpha;
+		shapeArgs.beta = 0;
+		shapeArgs.origin = origin;	
+	});
+});
+/*** 
+	EXTENSION FOR 3D PIES
+***/
+
+Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'translate', function (proceed) {
+	proceed.apply(this, [].slice.call(arguments, 1));
+
+	// Do not do this if the chart is not 3D
+	if (!this.chart.is3d()) {
+		return;
+	}	
+	
+	var series = this,
+		chart = series.chart,
+		options = chart.options,
+		seriesOptions = series.options,
+		depth = seriesOptions.depth || 0,
+		options3d = options.chart.options3d,
+		origin = {
+			x: chart.plotWidth / 2,
+			y: chart.plotHeight / 2,
+			z: options3d.depth
+		},
+		alpha = options3d.alpha,
+		beta = options3d.beta;
+
+	var z = seriesOptions.stacking ? (seriesOptions.stack || 0) * depth : series._i * depth;
+	z += depth / 2;
+
+	if (seriesOptions.grouping !== false) { z = 0; }
+
+	Highcharts.each(series.data, function (point) {
+		point.shapeType = 'arc3d';
+		var shapeArgs = point.shapeArgs;
+
+		if (point.y) { // will be false if null or 0 #3006
+			shapeArgs.z = z;
+			shapeArgs.depth = depth * 0.75;
+			shapeArgs.origin = origin;
+			shapeArgs.alpha = alpha;
+			shapeArgs.beta = beta;
+		
+			var angle = (shapeArgs.end + shapeArgs.start) / 2;
+
+			point.slicedTranslation = {
+				translateX : round(cos(angle) * series.options.slicedOffset * cos(alpha * deg2rad)),
+				translateY : round(sin(angle) * series.options.slicedOffset * cos(alpha * deg2rad))
+			};
+		} else {
+			shapeArgs = null;
+		}
+	});
+});
+
+Highcharts.wrap(Highcharts.seriesTypes.pie.prototype.pointClass.prototype, 'haloPath', function (proceed) {
+	return this.series.chart.is3d() ? [] : proceed.call(this);
+});
+
+Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'drawPoints', function (proceed) {
+	// Do not do this if the chart is not 3D
+	if (this.chart.is3d()) {
+		var options = this.options,
+			states = this.options.states;
+
+		// Set the border color to the fill color to provide a smooth edge
+		this.borderWidth = options.borderWidth = options.edgeWidth || 1;
+
+		states.hover.borderColor = Highcharts.pick(states.hover.edgeColor, this.borderColor);		
+		states.hover.borderWidth = Highcharts.pick(states.hover.edgeWidth, this.borderWidth);	
+		states.select.borderColor = Highcharts.pick(states.select.edgeColor, this.borderColor);		
+		states.select.borderWidth = Highcharts.pick(states.select.edgeWidth, this.borderWidth);
+
+		Highcharts.each(this.data, function (point) {
+			var pointAttr = point.pointAttr;
+			pointAttr[''].stroke = point.series.borderColor || point.color;
+			pointAttr['']['stroke-width'] = point.series.borderWidth;
+			pointAttr.hover.stroke = states.hover.borderColor;	
+			pointAttr.hover['stroke-width'] = states.hover.borderWidth;
+			pointAttr.select.stroke = states.select.borderColor;
+			pointAttr.select['stroke-width'] = states.select.borderWidth;
+		});	
+	}
+
+	proceed.apply(this, [].slice.call(arguments, 1));
+
+	if (this.chart.is3d()) {		
+		var seriesGroup = this.group;
+		Highcharts.each(this.points, function (point) {
+			point.graphic.out.add(seriesGroup);
+			point.graphic.inn.add(seriesGroup);
+			point.graphic.side1.add(seriesGroup);
+			point.graphic.side2.add(seriesGroup);
+		});		
+	}
+});
+
+Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'drawDataLabels', function (proceed) {
+	if (this.chart.is3d()) {
+		var series = this;
+		Highcharts.each(series.data, function (point) {
+			var shapeArgs = point.shapeArgs,
+				r = shapeArgs.r,
+				d = shapeArgs.depth,
+				a1 = shapeArgs.alpha * deg2rad,
+				a2 = (shapeArgs.start + shapeArgs.end) / 2,
+				labelPos = point.labelPos;
+
+			labelPos[1] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0);
+			labelPos[3] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0);
+			labelPos[5] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0);
+		});
+	} 
+
+	proceed.apply(this, [].slice.call(arguments, 1));
+});
+
+Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'addPoint', function (proceed) {
+	proceed.apply(this, [].slice.call(arguments, 1));	
+	if (this.chart.is3d()) {
+		// destroy (and rebuild) everything!!!
+		this.update();
+	}
+});
+
+Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'animate', function (proceed) {
+	if (!this.chart.is3d()) {
+		proceed.apply(this, [].slice.call(arguments, 1));
+	} else {
+		var args = arguments,
+			init = args[1],
+			animation = this.options.animation,
+			attribs,
+			center = this.center,
+			group = this.group,
+			markerGroup = this.markerGroup;
+
+		if (Highcharts.svg) { // VML is too slow anyway
+				
+				if (animation === true) {
+					animation = {};
+				}
+				// Initialize the animation
+				if (init) {
+				
+					// Scale down the group and place it in the center
+					group.oldtranslateX = group.translateX;
+					group.oldtranslateY = group.translateY;
+					attribs = {
+						translateX: center[0],
+						translateY: center[1],
+						scaleX: 0.001, // #1499
+						scaleY: 0.001
+					};
+					
+					group.attr(attribs);
+					if (markerGroup) {
+						markerGroup.attrSetters = group.attrSetters;
+						markerGroup.attr(attribs);
+					}
+				
+				// Run the animation
+				} else {
+					attribs = {
+						translateX: group.oldtranslateX,
+						translateY: group.oldtranslateY,
+						scaleX: 1,
+						scaleY: 1
+					};
+					group.animate(attribs, animation);
+
+					if (markerGroup) {
+						markerGroup.animate(attribs, animation);
+					}
+				
+					// Delete this function to allow it only once
+					this.animate = null;
+				}
+				
+		}
+	}
+});/*** 
+	EXTENSION FOR 3D SCATTER CHART
+***/
+Highcharts.wrap(Highcharts.seriesTypes.scatter.prototype, 'translate', function (proceed) {
+//function translate3d(proceed) {
+	proceed.apply(this, [].slice.call(arguments, 1));
+	
+	if (!this.chart.is3d()) {
+		return;
+	}	
+
+	var series = this,
+		chart = series.chart,
+		options3d = series.chart.options.chart.options3d,
+		alpha = options3d.alpha,
+		beta = options3d.beta,
+		origin = {
+			x: chart.inverted ? chart.plotHeight / 2 : chart.plotWidth / 2,
+			y: chart.inverted ? chart.plotWidth / 2 : chart.plotHeight / 2, 
+			z: options3d.depth,
+			vd: options3d.viewDistance
+		},
+		depth = options3d.depth,
+		zAxis = chart.options.zAxis || { min : 0, max: depth };
+	
+	var rangeModifier = depth / (zAxis.max - zAxis.min);
+	
+	Highcharts.each(series.data, function (point) {
+		var pCo = { 
+			x: point.plotX,
+			y: point.plotY,
+			z: (point.z - zAxis.min) * rangeModifier
+		};
+
+		pCo = perspective([pCo], alpha, beta, origin)[0];		
+
+		point.plotXold = point.plotX;
+		point.plotYold = point.plotY;
+		
+		point.plotX = pCo.x;
+		point.plotY = pCo.y;
+		point.plotZ = pCo.z;
+	});	  
+});
+
+Highcharts.wrap(Highcharts.seriesTypes.scatter.prototype, 'init', function (proceed) {
+	var result = proceed.apply(this, [].slice.call(arguments, 1));
+
+	if (this.chart.is3d()) {
+		// Add a third coordinate
+		this.pointArrayMap = ['x', 'y', 'z'];
+
+		// Set a new default tooltip formatter
+		var default3dScatterTooltip = 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>';
+		if (this.userOptions.tooltip) {
+			this.tooltipOptions.pointFormat = this.userOptions.tooltip.pointFormat || default3dScatterTooltip;
+		} else {
+			this.tooltipOptions.pointFormat = default3dScatterTooltip;
+		}
+	}
+	return result;
+});/**
+ *	Extension to the VML Renderer
+ */
+if (Highcharts.VMLRenderer) {
+
+Highcharts.setOptions({animate: false});
+
+Highcharts.VMLRenderer.prototype.cuboid = Highcharts.SVGRenderer.prototype.cuboid;
+Highcharts.VMLRenderer.prototype.cuboidPath = Highcharts.SVGRenderer.prototype.cuboidPath;
+
+Highcharts.VMLRenderer.prototype.toLinePath = Highcharts.SVGRenderer.prototype.toLinePath;
+
+Highcharts.VMLRenderer.prototype.createElement3D = Highcharts.SVGRenderer.prototype.createElement3D;
+
+Highcharts.VMLRenderer.prototype.arc3d = function (shapeArgs) { 
+	var result = Highcharts.SVGRenderer.prototype.arc3d.call(this, shapeArgs);
+	result.css({zIndex: result.zIndex});
+	return result;
+};
+
+Highcharts.VMLRenderer.prototype.arc3dPath = Highcharts.SVGRenderer.prototype.arc3dPath;
+
+// Draw the series in the reverse order
+Highcharts.Chart.prototype.renderSeries = function () {
+	var serie,
+		i = this.series.length;
+	while (i--) {		
+		serie = this.series[i];
+		serie.translate();
+		if (serie.setTooltipPoints) {
+			serie.setTooltipPoints();
+		}
+		serie.render();	
+	}
+};
+
+Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) {
+	proceed.apply(this, [].slice.call(arguments, 1));
+	// VML doesn't support a negative z-index
+	if (this.sideFrame) {
+		this.sideFrame.css({zIndex: 0});
+		this.sideFrame.front.attr({fill: this.sideFrame.color});
+	}
+	if (this.bottomFrame) {
+		this.bottomFrame.css({zIndex: 1});
+		this.bottomFrame.front.attr({fill: this.bottomFrame.color});
+	}	
+	if (this.backFrame) {
+		this.backFrame.css({zIndex: 0});
+		this.backFrame.front.attr({fill: this.backFrame.color});
+	}		
+});
+
+}
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-all.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-all.js
new file mode 100644
index 0000000..350db6e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-all.js
@@ -0,0 +1,462 @@
+/*
+ Highcharts JS v4.0.3 (2014-07-03)
+
+ Standalone Highcharts Framework
+
+ License: MIT License
+*/
+var HighchartsAdapter=function(){function o(c){function b(b,a,d){b.removeEventListener(a,d,!1)}function d(b,a,d){d=b.HCProxiedMethods[d.toString()];b.detachEvent("on"+a,d)}function a(a,c){var f=a.HCEvents,i,g,k,j;if(a.removeEventListener)i=b;else if(a.attachEvent)i=d;else return;c?(g={},g[c]=!0):g=f;for(j in g)if(f[j])for(k=f[j].length;k--;)i(a,j,f[j][k])}c.HCExtended||Highcharts.extend(c,{HCExtended:!0,HCEvents:{},bind:function(b,a){var d=this,c=this.HCEvents,g;if(d.addEventListener)d.addEventListener(b,
+a,!1);else if(d.attachEvent){g=function(b){b.target=b.srcElement||window;a.call(d,b)};if(!d.HCProxiedMethods)d.HCProxiedMethods={};d.HCProxiedMethods[a.toString()]=g;d.attachEvent("on"+b,g)}c[b]===r&&(c[b]=[]);c[b].push(a)},unbind:function(c,h){var f,i;c?(f=this.HCEvents[c]||[],h?(i=HighchartsAdapter.inArray(h,f),i>-1&&(f.splice(i,1),this.HCEvents[c]=f),this.removeEventListener?b(this,c,h):this.attachEvent&&d(this,c,h)):(a(this,c),this.HCEvents[c]=[])):(a(this),this.HCEvents={})},trigger:function(b,
+a){var d=this.HCEvents[b]||[],c=d.length,g,k,j;k=function(){a.defaultPrevented=!0};for(g=0;g<c;g++){j=d[g];if(a.stopped)break;a.preventDefault=k;a.target=this;if(!a.type)a.type=b;j.call(this,a)===!1&&a.preventDefault()}}});return c}var r,l=document,p=[],m=[],q,n;Math.easeInOutSine=function(c,b,d,a){return-d/2*(Math.cos(Math.PI*c/a)-1)+b};return{init:function(c){if(!l.defaultView)this._getStyle=function(b,d){var a;return b.style[d]?b.style[d]:(d==="opacity"&&(d="filter"),a=b.currentStyle[d.replace(/\-(\w)/g,
+function(a,b){return b.toUpperCase()})],d==="filter"&&(a=a.replace(/alpha\(opacity=([0-9]+)\)/,function(b,a){return a/100})),a===""?1:a)},this.adapterRun=function(b,d){var a={width:"clientWidth",height:"clientHeight"}[d];if(a)return b.style.zoom=1,b[a]-2*parseInt(HighchartsAdapter._getStyle(b,"padding"),10)};if(!Array.prototype.forEach)this.each=function(b,d){for(var a=0,c=b.length;a<c;a++)if(d.call(b[a],b[a],a,b)===!1)return a};if(!Array.prototype.indexOf)this.inArray=function(b,d){var a,c=0;if(d)for(a=
+d.length;c<a;c++)if(d[c]===b)return c;return-1};if(!Array.prototype.filter)this.grep=function(b,d){for(var a=[],c=0,h=b.length;c<h;c++)d(b[c],c)&&a.push(b[c]);return a};n=function(b,c,a){this.options=c;this.elem=b;this.prop=a};n.prototype={update:function(){var b;b=this.paths;var d=this.elem,a=d.element;b&&a?d.attr("d",c.step(b[0],b[1],this.now,this.toD)):d.attr?a&&d.attr(this.prop,this.now):(b={},b[this.prop]=this.now+this.unit,Highcharts.css(d,b));this.options.step&&this.options.step.call(this.elem,
+this.now,this)},custom:function(b,c,a){var e=this,h=function(a){return e.step(a)},f;this.startTime=+new Date;this.start=b;this.end=c;this.unit=a;this.now=this.start;this.pos=this.state=0;h.elem=this.elem;h()&&m.push(h)===1&&(q=setInterval(function(){for(f=0;f<m.length;f++)m[f]()||m.splice(f--,1);m.length||clearInterval(q)},13))},step:function(b){var c=+new Date,a;a=this.options;var e=this.elem,h;if(e.stopAnimation||e.attr&&!e.element)a=!1;else if(b||c>=a.duration+this.startTime){this.now=this.end;
+this.pos=this.state=1;this.update();b=this.options.curAnim[this.prop]=!0;for(h in a.curAnim)a.curAnim[h]!==!0&&(b=!1);b&&a.complete&&a.complete.call(e);a=!1}else e=c-this.startTime,this.state=e/a.duration,this.pos=a.easing(e,0,1,a.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update(),a=!0;return a}};this.animate=function(b,d,a){var e,h="",f,i,g;b.stopAnimation=!1;if(typeof a!=="object"||a===null)e=arguments,a={duration:e[2],easing:e[3],complete:e[4]};if(typeof a.duration!=="number")a.duration=
+400;a.easing=Math[a.easing]||Math.easeInOutSine;a.curAnim=Highcharts.extend({},d);for(g in d)i=new n(b,a,g),f=null,g==="d"?(i.paths=c.init(b,b.d,d.d),i.toD=d.d,e=0,f=1):b.attr?e=b.attr(g):(e=parseFloat(HighchartsAdapter._getStyle(b,g))||0,g!=="opacity"&&(h="px")),f||(f=parseFloat(d[g])),i.custom(e,f,h)}},_getStyle:function(c,b){return window.getComputedStyle(c,void 0).getPropertyValue(b)},getScript:function(c,b){var d=l.getElementsByTagName("head")[0],a=l.createElement("script");a.type="text/javascript";
+a.src=c;a.onload=b;d.appendChild(a)},inArray:function(c,b){return b.indexOf?b.indexOf(c):p.indexOf.call(b,c)},adapterRun:function(c,b){return parseInt(HighchartsAdapter._getStyle(c,b),10)},grep:function(c,b){return p.filter.call(c,b)},map:function(c,b){for(var d=[],a=0,e=c.length;a<e;a++)d[a]=b.call(c[a],c[a],a,c);return d},offset:function(c){var b=document.documentElement,c=c.getBoundingClientRect();return{top:c.top+(window.pageYOffset||b.scrollTop)-(b.clientTop||0),left:c.left+(window.pageXOffset||
+b.scrollLeft)-(b.clientLeft||0)}},addEvent:function(c,b,d){o(c).bind(b,d)},removeEvent:function(c,b,d){o(c).unbind(b,d)},fireEvent:function(c,b,d,a){var e;l.createEvent&&(c.dispatchEvent||c.fireEvent)?(e=l.createEvent("Events"),e.initEvent(b,!0,!0),e.target=c,Highcharts.extend(e,d),c.dispatchEvent?c.dispatchEvent(e):c.fireEvent(b,e)):c.HCExtended===!0&&(d=d||{},c.trigger(b,d));d&&d.defaultPrevented&&(a=null);a&&a(d)},washMouseEvent:function(c){return c},stop:function(c){c.stopAnimation=!0},each:function(c,
+b){return Array.prototype.forEach.call(c,b)}}}();
+/*
+ Highcharts JS v4.0.3 (2014-07-03)
+
+ (c) 2009-2014 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(){function r(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function w(){var a,b=arguments,c,d={},e=function(a,b){var c,d;typeof a!=="object"&&(a={});for(d in b)b.hasOwnProperty(d)&&(c=b[d],a[d]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&d!=="renderTo"&&typeof c.nodeType!=="number"?e(a[d]||{},c):b[d]);return a};b[0]===!0&&(d=b[1],b=Array.prototype.slice.call(b,2));c=b.length;for(a=0;a<c;a++)d=e(d,b[a]);return d}function z(a,b){return parseInt(a,b||
+10)}function Fa(a){return typeof a==="string"}function da(a){return a&&typeof a==="object"}function La(a){return Object.prototype.toString.call(a)==="[object Array]"}function ia(a){return typeof a==="number"}function za(a){return V.log(a)/V.LN10}function ja(a){return V.pow(10,a)}function ka(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function s(a){return a!==t&&a!==null}function F(a,b,c){var d,e;if(Fa(b))s(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(s(b)&&
+da(b))for(d in b)a.setAttribute(d,b[d]);return e}function ra(a){return La(a)?a:[a]}function p(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],c!==t&&c!==null)return c}function A(a,b){if(Aa&&!ba&&b&&b.opacity!==t)b.filter="alpha(opacity="+b.opacity*100+")";r(a.style,b)}function $(a,b,c,d,e){a=x.createElement(a);b&&r(a,b);e&&A(a,{padding:0,border:P,margin:0});c&&A(a,c);d&&d.appendChild(a);return a}function la(a,b){var c=function(){return t};c.prototype=new a;r(c.prototype,b);return c}function Ga(a,
+b,c,d){var e=L.lang,a=+a||0,f=b===-1?(a.toString().split(".")[1]||"").length:isNaN(b=Q(b))?2:b,b=c===void 0?e.decimalPoint:c,d=d===void 0?e.thousandsSep:d,e=a<0?"-":"",c=String(z(a=Q(a).toFixed(f))),g=c.length>3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+Q(a-c).toFixed(f).slice(2):"")}function Ha(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function Ma(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);
+return c.apply(this,a)}}function Ia(a,b){for(var c="{",d=!1,e,f,g,h,i,j=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h<i;h++)e=e[g[h]];if(f.length)f=f.join(":"),g=/\.([0-9])/,h=L.lang,i=void 0,/f$/.test(f)?(i=(i=f.match(g))?i[1]:-1,e!==null&&(e=Ga(e,i,h.decimalPoint,f.indexOf(",")>-1?h.thousandsSep:""))):e=bb(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function lb(a){return V.pow(10,U(V.log(a)/V.LN10))}
+function mb(a,b,c,d){var e,c=p(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals===!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(a=b[d],e<=(b[d]+(b[d+1]||b[d]))/2)break;a*=c;return a}function nb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].ss_i=e;a.sort(function(a,c){d=b(a,c);return d===0?a.ss_i-c.ss_i:d});for(e=0;e<c;e++)delete a[e].ss_i}function Na(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function Ba(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);
+return c}function Oa(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Pa(a){cb||(cb=$(Ja));a&&cb.appendChild(a);cb.innerHTML=""}function ea(a){return parseFloat(a.toPrecision(14))}function Qa(a,b){va=p(a,b.animation)}function Ab(){var a=L.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";Ra=(a&&L.global.timezoneOffset||0)*6E4;db=a?Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,p(c,1),p(g,0),p(h,0),p(i,0))).getTime()};ob=b+"Minutes";pb=b+"Hours";qb=b+"Day";
+Wa=b+"Date";eb=b+"Month";fb=b+"FullYear";Bb=c+"Minutes";Cb=c+"Hours";rb=c+"Date";Db=c+"Month";Eb=c+"FullYear"}function G(){}function Sa(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function ma(){this.init.apply(this,arguments)}function Xa(){this.init.apply(this,arguments)}function Fb(a,b,c,d,e){var f=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=null;this.points={};this.stack=e;this.alignOptions={align:b.align||(f?c?"left":
+"right":"center"),verticalAlign:b.verticalAlign||(f?"middle":c?"bottom":"top"),y:p(b.y,f?4:c?14:-6),x:p(b.x,f?c?-6:6:0)};this.textAlign=b.textAlign||(f?c?"right":"left":"center")}var t,x=document,H=window,V=Math,v=V.round,U=V.floor,Ka=V.ceil,u=V.max,C=V.min,Q=V.abs,aa=V.cos,fa=V.sin,na=V.PI,Ca=na*2/360,wa=navigator.userAgent,Gb=H.opera,Aa=/msie/i.test(wa)&&!Gb,gb=x.documentMode===8,sb=/AppleWebKit/.test(wa),Ta=/Firefox/.test(wa),Hb=/(Mobile|Android|Windows Phone)/.test(wa),xa="http://www.w3.org/2000/svg",
+ba=!!x.createElementNS&&!!x.createElementNS(xa,"svg").createSVGRect,Nb=Ta&&parseInt(wa.split("Firefox/")[1],10)<4,ga=!ba&&!Aa&&!!x.createElement("canvas").getContext,Ya,Za,Ib={},tb=0,cb,L,bb,va,ub,B,oa,sa=function(){return t},W=[],$a=0,Ja="div",P="none",Ob=/^[0-9]+$/,Pb="stroke-width",db,Ra,ob,pb,qb,Wa,eb,fb,Bb,Cb,rb,Db,Eb,J={},S;H.Highcharts?oa(16,!0):S=H.Highcharts={};bb=function(a,b,c){if(!s(b)||isNaN(b))return"Invalid date";var a=p(a,"%Y-%m-%d %H:%M:%S"),d=new Date(b-Ra),e,f=d[pb](),g=d[qb](),
+h=d[Wa](),i=d[eb](),j=d[fb](),k=L.lang,l=k.weekdays,d=r({a:l[g].substr(0,3),A:l[g],d:Ha(h),e:h,b:k.shortMonths[i],B:k.months[i],m:Ha(i+1),y:j.toString().substr(2,2),Y:j,H:Ha(f),I:Ha(f%12||12),l:f%12||12,M:Ha(d[ob]()),p:f<12?"AM":"PM",P:f<12?"am":"pm",S:Ha(d.getSeconds()),L:Ha(v(b%1E3),3)},S.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+a.substr(1):a};oa=function(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+
+a;if(b)throw c;H.console&&console.log(c)};B={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:26784E5,year:31556952E3};ub={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);
+a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=[].concat(b).splice(b.length-f,f),e&&(d[f-6]=d[f-2],d[f-5]=d[f-1]),b=b.concat(d);h&&(b=b.concat(h),c=c.concat(i));return[b,c]},step:function(a,b,c,d){var e=[],f=a.length;if(c===1)e=d;else if(f===b.length&&c<1)for(;f--;)d=parseFloat(a[f]),e[f]=isNaN(d)?a[f]:c*parseFloat(b[f]-d)+d;else e=b;return e}};(function(a){H.HighchartsAdapter=H.HighchartsAdapter||a&&{init:function(b){var c=a.fx,d=c.step,e,f=a.Tween,g=f&&f.propHooks;e=a.cssHooks.opacity;a.extend(a.easing,
+{easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c}});a.each(["cur","_default","width","height","opacity"],function(a,b){var e=d,k;b==="cur"?e=c.prototype:b==="_default"&&f&&(e=g[b],b="set");(k=e[b])&&(e[b]=function(c){var d,c=a?c:this;if(c.prop!=="align")return d=c.elem,d.attr?d.attr(c.prop,b==="cur"?t:c.now):k.apply(this,arguments)})});Ma(e,"get",function(a,b,c){return b.attr?b.opacity||0:a.call(this,b,c)});e=function(a){var c=a.elem,d;if(!a.started)d=b.init(c,c.d,c.toD),a.start=d[0],a.end=
+d[1],a.started=!0;c.attr("d",b.step(a.start,a.end,a.pos,c.toD))};f?g.d={set:e}:d.d=e;this.each=Array.prototype.forEach?function(a,b){return Array.prototype.forEach.call(a,b)}:function(a,b){var c,d=a.length;for(c=0;c<d;c++)if(b.call(a[c],a[c],c,a)===!1)return c};a.fn.highcharts=function(){var a="Chart",b=arguments,c,d;if(this[0]){Fa(b[0])&&(a=b[0],b=Array.prototype.slice.call(b,1));c=b[0];if(c!==t)c.chart=c.chart||{},c.chart.renderTo=this[0],new S[a](c,b[1]),d=this;c===t&&(d=W[F(this[0],"data-highcharts-chart")])}return d}},
+getScript:a.getScript,inArray:a.inArray,adapterRun:function(b,c){return a(b)[c]()},grep:a.grep,map:function(a,c){for(var d=[],e=0,f=a.length;e<f;e++)d[e]=c.call(a[e],a[e],e,a);return d},offset:function(b){return a(b).offset()},addEvent:function(b,c,d){a(b).bind(c,d)},removeEvent:function(b,c,d){var e=x.removeEventListener?"removeEventListener":"detachEvent";x[e]&&b&&!b[e]&&(b[e]=function(){});a(b).unbind(c,d)},fireEvent:function(b,c,d,e){var f=a.Event(c),g="detached"+c,h;!Aa&&d&&(delete d.layerX,
+delete d.layerY,delete d.returnValue);r(f,d);b[c]&&(b[g]=b[c],b[c]=null);a.each(["preventDefault","stopPropagation"],function(a,b){var c=f[b];f[b]=function(){try{c.call(f)}catch(a){b==="preventDefault"&&(h=!0)}}});a(b).trigger(f);b[g]&&(b[c]=b[g],b[g]=null);e&&!f.isDefaultPrevented()&&!h&&e(f)},washMouseEvent:function(a){var c=a.originalEvent||a;if(c.pageX===t)c.pageX=a.pageX,c.pageY=a.pageY;return c},animate:function(b,c,d){var e=a(b);if(!b.style)b.style={};if(c.d)b.toD=c.d,c.d=1;e.stop();c.opacity!==
+t&&b.attr&&(c.opacity+="px");e.animate(c,d)},stop:function(b){a(b).stop()}}})(H.jQuery);var T=H.HighchartsAdapter,M=T||{};T&&T.init.call(T,ub);var hb=M.adapterRun,Qb=M.getScript,Da=M.inArray,q=M.each,vb=M.grep,Rb=M.offset,Ua=M.map,N=M.addEvent,X=M.removeEvent,K=M.fireEvent,Sb=M.washMouseEvent,ib=M.animate,ab=M.stop,M={enabled:!0,x:0,y:15,style:{color:"#606060",cursor:"default",fontSize:"11px"}};L={colors:"#7cb5ec,#434348,#90ed7d,#f7a35c,#8085e9,#f15c80,#e4d354,#8085e8,#8d4653,#91e8e1".split(","),
+symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:","},global:{useUTC:!0,
+canvasToolsURL:"http://code.highcharts.com/4.0.3/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/4.0.3/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:0,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#333333",fontSize:"18px"}},subtitle:{text:"",
+align:"center",style:{color:"#555555"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,marker:{lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0,lineWidthPlus:1,radiusPlus:2},select:{fillColor:"#FFFFFF",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:w(M,{align:"center",enabled:!1,formatter:function(){return this.y===null?"":Ga(this.y,-1)},verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,states:{hover:{lineWidthPlus:1,
+marker:{},halo:{size:10,opacity:0.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderColor:"#909090",borderRadius:0,navigation:{activeColor:"#274b6d",inactiveColor:"#CCC"},shadow:!1,itemStyle:{color:"#333333",fontSize:"12px",fontWeight:"bold"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",
+width:"13px",height:"13px"},symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"white",opacity:0.5,textAlign:"center"}},tooltip:{enabled:!0,animation:ba,backgroundColor:"rgba(249, 249, 249, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",
+day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{series.color}">●</span> {series.name}: <b>{point.y}</b><br/>',shadow:!0,snap:Hb?25:10,style:{color:"#333333",cursor:"default",fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",
+color:"#909090",fontSize:"9px"}}};var ca=L.plotOptions,T=ca.line;Ab();var Tb=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,Ub=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,Vb=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,ya=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Ua(a.stops,function(a){return ya(a[1])}):(c=Tb.exec(a))?b=[z(c[1]),z(c[2]),z(c[3]),parseFloat(c[4],10)]:(c=Ub.exec(a))?b=[z(c[1],16),z(c[2],16),z(c[3],
+16),1]:(c=Vb.exec(a))&&(b=[z(c[1]),z(c[2]),z(c[3]),1])})(a);return{get:function(c){var f;d?(f=w(a),f.stops=[].concat(f.stops),q(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)q(d,function(b){b.brighten(a)});else if(ia(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=z(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this}}};
+G.prototype={opacity:1,textProps:"fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration,textShadow,HcTextStroke".split(","),init:function(a,b){this.element=b==="span"?$(b):x.createElementNS(xa,b);this.renderer=a},animate:function(a,b,c){b=p(b,va,!0);ab(this);if(b){b=w(b,{});if(c)b.complete=c;ib(this,a,b)}else this.attr(a),c&&c();return this},colorGradient:function(a,b,c){var d=this.renderer,e,f,g,h,i,j,k,l,m,n,o=[];a.linearGradient?f="linearGradient":a.radialGradient&&(f="radialGradient");
+if(f){g=a[f];h=d.gradients;j=a.stops;m=c.radialReference;La(g)&&(a[f]=g={x1:g[0],y1:g[1],x2:g[2],y2:g[3],gradientUnits:"userSpaceOnUse"});f==="radialGradient"&&m&&!s(g.gradientUnits)&&(g=w(g,{cx:m[0]-m[2]/2+g.cx*m[2],cy:m[1]-m[2]/2+g.cy*m[2],r:g.r*m[2],gradientUnits:"userSpaceOnUse"}));for(n in g)n!=="id"&&o.push(n,g[n]);for(n in j)o.push(j[n]);o=o.join(",");h[o]?a=h[o].attr("id"):(g.id=a="highcharts-"+tb++,h[o]=i=d.createElement(f).attr(g).add(d.defs),i.stops=[],q(j,function(a){a[1].indexOf("rgba")===
+0?(e=ya(a[1]),k=e.get("rgb"),l=e.get("a")):(k=a[1],l=1);a=d.createElement("stop").attr({offset:a[0],"stop-color":k,"stop-opacity":l}).add(i);i.stops.push(a)}));c.setAttribute(b,"url("+d.url+"#"+a+")")}},attr:function(a,b){var c,d,e=this.element,f,g=this,h;typeof a==="string"&&b!==t&&(c=a,a={},a[c]=b);if(typeof a==="string")g=(this[a+"Getter"]||this._defaultGetter).call(this,a,e);else{for(c in a){d=a[c];h=!1;this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c)&&(f||(this.symbolAttr(a),
+f=!0),h=!0);if(this.rotation&&(c==="x"||c==="y"))this.doTransform=!0;h||(this[c+"Setter"]||this._defaultSetter).call(this,d,c,e);this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(c)&&this.updateShadows(c,d)}if(this.doTransform)this.updateTransform(),this.doTransform=!1}return g},updateShadows:function(a,b){for(var c=this.shadows,d=c.length;d--;)c[d].setAttribute(a,a==="height"?u(b-(c[d].cutHeight||0),0):a==="d"?this.d:b)},addClass:function(a){var b=this.element,c=F(b,"class")||
+"";c.indexOf(a)===-1&&F(b,"class",c+" "+a);return this},symbolAttr:function(a){var b=this;q("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(c){b[c]=p(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x,b.y,b.width,b.height,b)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":P)},crisp:function(a){var b,c={},d,e=a.strokeWidth||this.strokeWidth||0;d=v(e)%2/2;a.x=U(a.x||this.x||0)+d;a.y=U(a.y||this.y||0)+d;a.width=U((a.width||this.width||
+0)-2*d);a.height=U((a.height||this.height||0)-2*d);a.strokeWidth=e;for(b in a)this[b]!==a[b]&&(this[b]=c[b]=a[b]);return c},css:function(a){var b=this.styles,c={},d=this.element,e,f,g="";e=!b;if(a&&a.color)a.fill=a.color;if(b)for(f in a)a[f]!==b[f]&&(c[f]=a[f],e=!0);if(e){e=this.textWidth=a&&a.width&&d.nodeName.toLowerCase()==="text"&&z(a.width);b&&(a=r(b,c));this.styles=a;e&&(ga||!ba&&this.renderer.forExport)&&delete a.width;if(Aa&&!ba)A(this.element,a);else{b=function(a,b){return"-"+b.toLowerCase()};
+for(f in a)g+=f.replace(/([A-Z])/g,b)+":"+a[f]+";";F(d,"style",g)}e&&this.added&&this.renderer.buildText(this)}return this},on:function(a,b){var c=this,d=c.element;Za&&a==="click"?(d.ontouchstart=function(a){c.touchEventFired=Date.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(wa.indexOf("Android")===-1||Date.now()-(c.touchEventFired||0)>1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){this.element.radialReference=a;return this},translate:function(a,b){return this.attr({translateX:a,
+translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation,g=this.element;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(g.getAttribute("x")||0)+" "+(g.getAttribute("y")||0)+")");(s(c)||s(d))&&a.push("scale("+p(c,1)+" "+p(d,1)+")");a.length&&g.setAttribute("transform",
+a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions=a,this.alignByTranslate=b,!c||Fa(c))this.alignTo=d=c||"renderer",ka(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=p(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];
+h[b?"translateX":"x"]=v(f);if(e==="bottom"||e==="middle")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=v(g);this[this.placed?"animate":"attr"](h);this.placed=!0;this.alignAttr=h;return this},getBBox:function(){var a=this.bBox,b=this.renderer,c,d,e=this.rotation;c=this.element;var f=this.styles,g=e*Ca;d=this.textStr;var h;if(d===""||Ob.test(d))h="num."+d.toString().length+(f?"|"+f.fontSize+"|"+f.fontFamily:"");h&&(a=b.cache[h]);if(!a){if(c.namespaceURI===xa||b.forExport){try{a=
+c.getBBox?r({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(i){}if(!a||a.width<0)a={width:0,height:0}}else a=this.htmlGetBBox();if(b.isSVG){c=a.width;d=a.height;if(Aa&&f&&f.fontSize==="11px"&&d.toPrecision(3)==="16.9")a.height=d=14;if(e)a.width=Q(d*fa(g))+Q(c*aa(g)),a.height=Q(d*aa(g))+Q(c*fa(g))}this.bBox=a;h&&(b.cache[h]=a)}return a},show:function(a){return a&&this.element.namespaceURI===xa?(this.element.removeAttribute("visibility"),this):this.attr({visibility:a?"inherit":"visible"})},
+hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.hide()}})},add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=this.element,f=this.zIndex,g,h;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(f)c.handleZ=!0,f=z(f);if(c.handleZ){a=d.childNodes;for(g=0;g<a.length;g++)if(b=a[g],c=F(b,"zIndex"),b!==e&&(z(c)>f||!s(f)&&s(c))){d.insertBefore(e,
+b);h=!0;break}}h||d.appendChild(e);this.added=!0;if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&a.parentGroup,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;ab(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f<a.stops.length;f++)a.stops[f]=a.stops[f].destroy();a.stops=null}a.safeRemoveChild(b);for(c&&
+q(c,function(b){a.safeRemoveChild(b)});d&&d.div&&d.div.childNodes.length===0;)b=d.parentGroup,a.safeRemoveChild(d.div),delete d.div,d=b;a.alignTo&&ka(a.renderer.alignedObjects,a);for(e in a)delete a[e];return null},shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,j,k;if(a){i=p(a.width,3);j=(a.opacity||0.15)/i;k=this.parentInverted?"(-1,-1)":"("+p(a.offsetX,1)+", "+p(a.offsetY,1)+")";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;F(f,{isShadow:"true",stroke:a.color||"black","stroke-opacity":j*
+e,"stroke-width":h,transform:"translate"+k,fill:P});if(c)F(f,"height",u(F(f,"height")-h,0)),f.cutHeight=h;b?b.element.appendChild(f):g.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this},xGetter:function(a){this.element.nodeName==="circle"&&(a={x:"cx",y:"cy"}[a]||a);return this._defaultGetter(a)},_defaultGetter:function(a){a=p(this[a],this.element?this.element.getAttribute(a):null,0);/^[\-0-9\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,b,c){a&&a.join&&(a=a.join(" "));
+/(NaN| {2}|^$)/.test(a)&&(a="M 0 0");c.setAttribute(b,a);this[b]=a},dashstyleSetter:function(a){var b;if(a=a&&a.toLowerCase()){a=a.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").replace("solid",1).split(",");for(b=a.length;b--;)a[b]=z(a[b])*this["stroke-width"];a=a.join(",");this.element.setAttribute("stroke-dasharray",a)}},alignSetter:function(a){this.element.setAttribute("text-anchor",
+{left:"start",center:"middle",right:"end"}[a])},opacitySetter:function(a,b,c){this[b]=a;c.setAttribute(b,a)},titleSetter:function(a){var b=this.element.getElementsByTagName("title")[0];b||(b=x.createElementNS(xa,"title"),this.element.appendChild(b));b.textContent=a},textSetter:function(a){if(a!==this.textStr)delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this)},fillSetter:function(a,b,c){typeof a==="string"?c.setAttribute(b,a):a&&this.colorGradient(a,b,c)},zIndexSetter:function(a,
+b,c){c.setAttribute(b,a);this[b]=a},_defaultSetter:function(a,b,c){c.setAttribute(b,a)}};G.prototype.yGetter=G.prototype.xGetter;G.prototype.translateXSetter=G.prototype.translateYSetter=G.prototype.rotationSetter=G.prototype.verticalAlignSetter=G.prototype.scaleXSetter=G.prototype.scaleYSetter=function(a,b){this[b]=a;this.doTransform=!0};G.prototype["stroke-widthSetter"]=G.prototype.strokeSetter=function(a,b,c){this[b]=a;if(this.stroke&&this["stroke-width"])this.strokeWidth=this["stroke-width"],
+G.prototype.fillSetter.call(this,this.stroke,"stroke",c),c.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0;else if(b==="stroke-width"&&a===0&&this.hasStroke)c.removeAttribute("stroke"),this.hasStroke=!1};var ta=function(){this.init.apply(this,arguments)};ta.prototype={Element:G,init:function(a,b,c,d,e){var f=location,g,d=this.createElement("svg").attr({version:"1.1"}).css(this.getStyle(d));g=d.element;a.appendChild(g);a.innerHTML.indexOf("xmlns")===-1&&F(g,"xmlns",xa);this.isSVG=
+!0;this.box=g;this.boxWrapper=d;this.alignedObjects=[];this.url=(Ta||sb)&&x.getElementsByTagName("base").length?f.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(x.createTextNode("Created with Highcharts 4.0.3"));this.defs=this.createElement("defs").add();this.forExport=e;this.gradients={};this.cache={};this.setSize(b,c,!1);var h;if(Ta&&a.getBoundingClientRect)this.subPixelFix=b=function(){A(a,{left:0,top:0});h=a.getBoundingClientRect();
+A(a,{left:Ka(h.left)-h.left+"px",top:Ka(h.top)-h.top+"px"})},b(),N(H,"resize",b)},getStyle:function(a){return this.style=r({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Oa(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&X(H,"resize",this.subPixelFix);return this.alignedObjects=
+null},createElement:function(a){var b=new this.Element;b.init(this,a);return b},draw:function(){},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=p(a.textStr,"").toString(),f=e.indexOf("<")!==-1,g=b.childNodes,h,i,j=F(b,"x"),k=a.styles,l=a.textWidth,m=k&&k.lineHeight,n=k&&k.HcTextStroke,o=g.length,Y=function(a){return m?z(m):c.fontMetrics(/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:k&&k.fontSize||c.style.fontSize||12,a).h};o--;)b.removeChild(g[o]);!f&&!n&&e.indexOf(" ")===
+-1?b.appendChild(x.createTextNode(e)):(h=/<.*style="([^"]+)".*>/,i=/<.*href="(http[^"]+)".*>/,l&&!a.added&&this.box.appendChild(b),e=f?e.replace(/<(b|strong)>/g,'<span style="font-weight:bold">').replace(/<(i|em)>/g,'<span style="font-style:italic">').replace(/<a/g,"<span").replace(/<\/(b|strong|i|em|a)>/g,"</span>").split(/<br.*?>/g):[e],e[e.length-1]===""&&e.pop(),q(e,function(e,f){var g,m=0,e=e.replace(/<span/g,"|||<span").replace(/<\/span>/g,"</span>|||");g=e.split("|||");q(g,function(e){if(e!==
+""||g.length===1){var n={},o=x.createElementNS(xa,"tspan"),p;h.test(e)&&(p=e.match(h)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),F(o,"style",p));i.test(e)&&!d&&(F(o,"onclick",'location.href="'+e.match(i)[1]+'"'),A(o,{cursor:"pointer"}));e=(e.replace(/<(.|\n)*?>/g,"")||" ").replace(/&lt;/g,"<").replace(/&gt;/g,">");if(e!==" "){o.appendChild(x.createTextNode(e));if(m)n.dx=0;else if(f&&j!==null)n.x=j;F(o,n);b.appendChild(o);!m&&f&&(!ba&&d&&A(o,{display:"block"}),F(o,"dy",Y(o)));if(l)for(var e=e.replace(/([^\^])-/g,
+"$1- ").split(" "),n=g.length>1||e.length>1&&k.whiteSpace!=="nowrap",q,E,s=k.HcHeight,u=[],t=Y(o),Kb=1;n&&(e.length||u.length);)delete a.bBox,q=a.getBBox(),E=q.width,!ba&&c.forExport&&(E=c.measureSpanWidth(o.firstChild.data,a.styles)),q=E>l,!q||e.length===1?(e=u,u=[],e.length&&(Kb++,s&&Kb*t>s?(e=["..."],a.attr("title",a.textStr)):(o=x.createElementNS(xa,"tspan"),F(o,{dy:t,x:j}),p&&F(o,"style",p),b.appendChild(o))),E>l&&(l=E)):(o.removeChild(o.firstChild),u.unshift(e.pop())),e.length&&o.appendChild(x.createTextNode(e.join(" ").replace(/- /g,
+"-")));m++}}})}))},button:function(a,b,c,d,e,f,g,h,i){var j=this.label(a,b,c,i,null,null,null,null,"button"),k=0,l,m,n,o,p,q,a={x1:0,y1:0,x2:0,y2:1},e=w({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);n=e.style;delete e.style;f=w(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);o=f.style;delete f.style;g=w(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);p=g.style;
+delete g.style;h=w(e,{style:{color:"#CCC"}},h);q=h.style;delete h.style;N(j.element,Aa?"mouseover":"mouseenter",function(){k!==3&&j.attr(f).css(o)});N(j.element,Aa?"mouseout":"mouseleave",function(){k!==3&&(l=[e,f,g][k],m=[n,o,p][k],j.attr(l).css(m))});j.setState=function(a){(j.state=k=a)?a===2?j.attr(g).css(p):a===3&&j.attr(h).css(q):j.attr(e).css(n)};return j.on("click",function(){k!==3&&d.call(j)}).attr(e).css(r({cursor:"default"},n))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=v(a[1])-b%
+2/2);a[2]===a[5]&&(a[2]=a[5]=v(a[2])+b%2/2);return a},path:function(a){var b={fill:P};La(a)?b.d=a:da(a)&&r(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=da(a)?a:{x:a,y:b,r:c};b=this.createElement("circle");b.xSetter=function(a){this.element.setAttribute("cx",a)};b.ySetter=function(a){this.element.setAttribute("cy",a)};return b.attr(a)},arc:function(a,b,c,d,e,f){if(da(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||
+0,end:f||0});a.r=c;return a},rect:function(a,b,c,d,e,f){var e=da(a)?a.r:e,g=this.createElement("rect"),a=da(a)?a:a===t?{}:{x:a,y:b,width:u(c,0),height:u(d,0)};if(f!==t)a.strokeWidth=f,a=g.crisp(a);if(e)a.r=e;g.rSetter=function(a){F(this.element,{rx:a,ry:a})};return g.attr(a)},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[p(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return s(a)?
+b.attr({"class":"highcharts-"+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:P};arguments.length>1&&r(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(v(b),v(c),d,e,f),i=/^url\((.*?)\)$/,j,k;if(h)g=this.path(h),r(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&r(g,f);else if(i.test(a))k=
+function(a,b){a.element&&(a.attr({width:b[0],height:b[1]}),a.alignByTranslate||a.translate(v((d-b[0])/2),v((e-b[1])/2)))},j=a.match(i)[1],a=Ib[j],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),$("img",{onload:function(){k(g,Ib[j]=[this.width,this.height])},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+
+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=aa(f),j=fa(f),k=aa(g),g=fa(g),e=e.end-f<na?0:1;return["M",a+c*i,b+c*j,"A",c,c,0,e,1,a+c*k,b+c*g,h?"M":"L",a+d*k,b+d*g,"A",d,d,0,e,0,a+d*i,b+d*j,h?"":"Z"]},callout:function(a,b,c,d,
+e){var f=C(e&&e.r||0,c,d),g=f+6,h=e&&e.anchorX,i=e&&e.anchorY,e=v(e.strokeWidth||0)%2/2;a+=e;b+=e;e=["M",a+f,b,"L",a+c-f,b,"C",a+c,b,a+c,b,a+c,b+f,"L",a+c,b+d-f,"C",a+c,b+d,a+c,b+d,a+c-f,b+d,"L",a+f,b+d,"C",a,b+d,a,b+d,a,b+d-f,"L",a,b+f,"C",a,b,a,b,a+f,b];h&&h>c&&i>b+g&&i<b+d-g?e.splice(13,3,"L",a+c,i-6,a+c+6,i,a+c,i+6,a+c,b+d-f):h&&h<0&&i>b+g&&i<b+d-g?e.splice(33,3,"L",a,i+6,a-6,i,a,i-6,a,b+f):i&&i>d&&h>a+g&&h<a+c-g?e.splice(23,3,"L",h+6,b+d,h,b+d+6,h-6,b+d,a+f,b+d):i&&i<0&&h>a+g&&h<a+c-g&&e.splice(3,
+3,"L",h-6,b,h,b-6,h+6,b,c-f,b);return e}},clipRect:function(a,b,c,d){var e="highcharts-"+tb++,f=this.createElement("clipPath").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;return a},text:function(a,b,c,d){var e=ga||!ba&&this.forExport,f={};if(d&&!this.forExport)return this.html(a,b,c);f.x=Math.round(b||0);if(c)f.y=Math.round(c);if(a||a===0)f.text=a;a=this.createElement("text").attr(f);e&&a.css({position:"absolute"});if(!d)a.xSetter=function(a,b,c){var d=c.getElementsByTagName("tspan"),
+e,f=c.getAttribute(b),m;for(m=0;m<d.length;m++)e=d[m],e.getAttribute(b)===f&&e.setAttribute(b,a);c.setAttribute(b,a)};return a},fontMetrics:function(a,b){a=a||this.style.fontSize;if(b&&H.getComputedStyle)b=b.element||b,a=H.getComputedStyle(b,"").fontSize;var a=/px/.test(a)?z(a):/em/.test(a)?parseFloat(a)*12:12,c=a<24?a+4:v(a*1.2),d=v(c*0.8);return{h:c,b:d,f:a}},label:function(a,b,c,d,e,f,g,h,i){function j(){var a,b;a=o.element.style;E=(u===void 0||wb===void 0||n.styles.textAlign)&&o.textStr&&o.getBBox();
+n.width=(u||E.width||0)+2*D+jb;n.height=(wb||E.height||0)+2*D;R=D+m.fontMetrics(a&&a.fontSize,o).b;if(z){if(!p)a=v(-I*D),b=h?-R:0,n.box=p=d?m.symbol(d,a,b,n.width,n.height,y):m.rect(a,b,n.width,n.height,0,y[Pb]),p.attr("fill",P).add(n);p.isImg||p.attr(r({width:v(n.width),height:v(n.height)},y));y=null}}function k(){var a=n.styles,a=a&&a.textAlign,b=jb+D*(1-I),c;c=h?0:R;if(s(u)&&E&&(a==="center"||a==="right"))b+={center:0.5,right:1}[a]*(u-E.width);if(b!==o.x||c!==o.y)o.attr("x",b),c!==t&&o.attr("y",
+c);o.x=b;o.y=c}function l(a,b){p?p.attr(a,b):y[a]=b}var m=this,n=m.g(i),o=m.text("",0,0,g).attr({zIndex:1}),p,E,I=0,D=3,jb=0,u,wb,xb,x,Jb=0,y={},R,z;n.onAdd=function(){o.add(n);n.attr({text:a||"",x:b,y:c});p&&s(e)&&n.attr({anchorX:e,anchorY:f})};n.widthSetter=function(a){u=a};n.heightSetter=function(a){wb=a};n.paddingSetter=function(a){s(a)&&a!==D&&(D=a,k())};n.paddingLeftSetter=function(a){s(a)&&a!==jb&&(jb=a,k())};n.alignSetter=function(a){I={left:0,center:0.5,right:1}[a]};n.textSetter=function(a){a!==
+t&&o.textSetter(a);j();k()};n["stroke-widthSetter"]=function(a,b){a&&(z=!0);Jb=a%2/2;l(b,a)};n.strokeSetter=n.fillSetter=n.rSetter=function(a,b){b==="fill"&&a&&(z=!0);l(b,a)};n.anchorXSetter=function(a,b){e=a;l(b,a+Jb-xb)};n.anchorYSetter=function(a,b){f=a;l(b,a-x)};n.xSetter=function(a){n.x=a;I&&(a-=I*((u||E.width)+D));xb=v(a);n.attr("translateX",xb)};n.ySetter=function(a){x=n.y=v(a);n.attr("translateY",x)};var C=n.css;return r(n,{css:function(a){if(a){var b={},a=w(a);q(n.textProps,function(c){a[c]!==
+t&&(b[c]=a[c],delete a[c])});o.css(b)}return C.call(n,a)},getBBox:function(){return{width:E.width+2*D,height:E.height+2*D,x:E.x-D,y:E.y-D}},shadow:function(a){p&&p.shadow(a);return n},destroy:function(){X(n.element,"mouseenter");X(n.element,"mouseleave");o&&(o=o.destroy());p&&(p=p.destroy());G.prototype.destroy.call(n);n=m=j=k=l=null}})}};Ya=ta;r(G.prototype,{htmlCss:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();this.styles=
+r(this.styles,a);A(this.element,a);return this},htmlGetBBox:function(){var a=this.element,b=this.bBox;if(!b){if(a.nodeName==="text")a.style.position="absolute";b=this.bBox={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}return b},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=this.shadows;A(b,{marginLeft:c,marginTop:d});
+i&&q(i,function(a){A(a,{marginLeft:c+1,marginTop:d+1})});this.inverted&&q(b.childNodes,function(c){a.invertChild(c,b)});if(b.tagName==="SPAN"){var j=this.rotation,k,l=z(this.textWidth),m=[j,g,b.innerHTML,this.textWidth].join(",");if(m!==this.cTT){k=a.fontMetrics(b.style.fontSize).b;s(j)&&this.setSpanRotation(j,h,k);i=p(this.elemWidth,b.offsetWidth);if(i>l&&/[ \-]/.test(b.textContent||b.innerText))A(b,{width:l+"px",display:"block",whiteSpace:"normal"}),i=l;this.getSpanCorrection(i,k,h,j,g)}A(b,{left:e+
+(this.xCorr||0)+"px",top:f+(this.yCorr||0)+"px"});if(sb)k=b.offsetHeight;this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,c){var d={},e=Aa?"-ms-transform":sb?"-webkit-transform":Ta?"MozTransform":Gb?"-o-transform":"";d[e]=d.transform="rotate("+a+"deg)";d[e+(Ta?"Origin":"-origin")]=d.transformOrigin=b*100+"% "+c+"px";A(this.element,d)},getSpanCorrection:function(a,b,c){this.xCorr=-a*c;this.yCorr=-b}});r(ta.prototype,{html:function(a,b,c){var d=this.createElement("span"),e=d.element,
+f=d.renderer;d.textSetter=function(a){a!==e.innerHTML&&delete this.bBox;e.innerHTML=this.textStr=a};d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,b){b==="align"&&(b="textAlign");d[b]=a;d.htmlUpdateTransform()};d.attr({text:a,x:v(b),y:v(c)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});d.css=d.htmlCss;if(f.isSVG)d.add=function(a){var b,c=f.box.parentNode,j=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)j.push(a),a=a.parentGroup;
+q(j.reverse(),function(a){var d;b=a.div=a.div||$(Ja,{className:F(a.element,"class")},{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;r(a,{translateXSetter:function(b,c){d.left=b+"px";a[c]=b;a.doTransform=!0},translateYSetter:function(b,c){d.top=b+"px";a[c]=b;a.doTransform=!0},visibilitySetter:function(a,b){d[b]=a}})})}}else b=c;b.appendChild(e);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d};return d}});var Z;if(!ba&&!ga){Z={init:function(a,
+b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ","absolute",";"],e=b===Ja;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=$(c);this.renderer=a},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&
+this.updateTransform();if(this.onAdd)this.onAdd();return this},updateTransform:G.prototype.htmlUpdateTransform,setSpanRotation:function(){var a=this.rotation,b=aa(a*Ca),c=fa(a*Ca);A(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",b,", M12=",-c,", M21=",c,", M22=",b,", sizingMethod='auto expand')"].join(""):P})},getSpanCorrection:function(a,b,c,d,e){var f=d?aa(d*Ca):1,g=d?fa(d*Ca):0,h=p(this.elemHeight,this.element.offsetHeight),i;this.xCorr=f<0&&-a;this.yCorr=g<0&&-h;i=f*g<
+0;this.xCorr+=g*b*(i?1-c:c);this.yCorr-=f*b*(d?i?c:1-c:1);e&&e!=="left"&&(this.xCorr-=a*c*(f<0?-1:1),d&&(this.yCorr-=h*c*(g<0?-1:1)),A(this.element,{textAlign:e}))},pathToVML:function(a){for(var b=a.length,c=[];b--;)if(ia(a[b]))c[b]=v(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))c[b+5]===c[b+7]&&(c[b+7]+=a[b+7]>a[b+5]?1:-1),c[b+6]===c[b+8]&&(c[b+8]+=a[b+8]>a[b+6]?1:-1);return c.join(" ")||"x"},clip:function(a){var b=this,c;a?(c=a.members,ka(c,b),c.push(b),
+b.destroyClip=function(){ka(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:gb?"inherit":"rect(auto)"});return b.css(a)},css:G.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Pa(a)},destroy:function(){this.destroyClip&&this.destroyClip();return G.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=H.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=z(a[c-
+2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,n,o;k&&typeof k.value!=="string"&&(k="x");m=k;if(a){n=p(a.width,3);o=(a.opacity||0.15)/n;for(e=1;e<=3;e++){l=n*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=['<shape isShadow="true" strokeweight="',l,'" filled="false" path="',m,'" coordsize="10 10" style="',f.style.cssText,'" />'];h=$(g.prepVML(j),null,{left:z(i.left)+p(a.offsetX,1),top:z(i.top)+p(a.offsetY,1)});if(c)h.cutOff=
+l+1;j=['<stroke color="',a.color||"black",'" opacity="',o*e,'"/>'];$(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this},updateShadows:sa,setAttr:function(a,b){gb?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){this.element.className=a},dashstyleSetter:function(a,b,c){(c.getElementsByTagName("stroke")[0]||$(this.renderer.prepVML(["<stroke/>"]),null,null,c))[b]=a||"solid";this[b]=a},dSetter:function(a,b,
+c){var d=this.shadows,a=a||[];this.d=a.join&&a.join(" ");c.path=a=this.pathToVML(a);if(d)for(c=d.length;c--;)d[c].path=d[c].cutOff?this.cutOffPath(a,d[c].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,c){var d=c.nodeName;if(d==="SPAN")c.style.color=a;else if(d!=="IMG")c.filled=a!==P,this.setAttr("fillcolor",this.renderer.color(a,c,b,this))},opacitySetter:sa,rotationSetter:function(a,b,c){c=c.style;this[b]=c[b]=a;c.left=-v(fa(a*Ca)+1)+"px";c.top=v(aa(a*Ca))+"px"},strokeSetter:function(a,b,c){this.setAttr("strokecolor",
+this.renderer.color(a,c,b))},"stroke-widthSetter":function(a,b,c){c.stroked=!!a;this[b]=a;ia(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,c){a==="inherit"&&(a="visible");this.shadows&&q(this.shadows,function(c){c.style[b]=a});c.nodeName==="DIV"&&(a=a==="hidden"?"-999em":0,gb||(c.style[b]=a?"visible":"hidden"),b="top");c.style[b]=a},xSetter:function(a,b,c){this[b]=a;b==="x"?b="left":b==="y"&&(b="top");this.updateClipping?(this[b]=
+a,this.updateClipping()):c.style[b]=a},zIndexSetter:function(a,b,c){c.style[b]=a}};S.VMLElement=Z=la(G,Z);Z.prototype.ySetter=Z.prototype.widthSetter=Z.prototype.heightSetter=Z.prototype.xSetter;var ha={Element:Z,isIE8:wa.indexOf("MSIE 8.0")>-1,init:function(a,b,c,d){var e;this.alignedObjects=[];d=this.createElement(Ja).css(r(this.getStyle(d),{position:"relative"}));e=d.element;a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=d;this.cache={};this.setSize(b,c,!1);if(!x.namespaces.hcv){x.namespaces.add("hcv",
+"urn:schemas-microsoft-com:vml");try{x.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(f){x.styleSheets[0].cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=da(a);return r(e,{members:[],left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:
+c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=a.element,c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+v(a?e:d)+"px,"+v(a?f:b)+"px,"+v(a?b:f)+"px,"+v(a?d:e)+"px)"};!a&&gb&&c==="DIV"&&r(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){q(e.members,function(a){a.element&&a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=P;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&
+(i="pattern");if(i){var k,l,m=a.linearGradient||a.radialGradient,n,o,p,E,I,D="",a=a.stops,u,s=[],t=function(){h=['<fill colors="'+s.join(",")+'" opacity="',p,'" o:opacity2="',o,'" type="',i,'" ',D,'focus="100%" method="any" />'];$(e.prepVML(h),null,null,b)};n=a[0];u=a[a.length-1];n[0]>0&&a.unshift([0,n[1]]);u[0]<1&&a.push([1,u[1]]);q(a,function(a,b){g.test(a[1])?(f=ya(a[1]),k=f.get("rgb"),l=f.get("a")):(k=a[1],l=1);s.push(a[0]*100+"% "+k);b?(p=l,E=k):(o=l,I=k)});if(c==="fill")if(i==="gradient")c=
+m.x1||m[0]||0,a=m.y1||m[1]||0,n=m.x2||m[2]||0,m=m.y2||m[3]||0,D='angle="'+(90-V.atan((m-a)/(n-c))*180/na)+'"',t();else{var j=m.r,r=j*2,v=j*2,x=m.cx,y=m.cy,R=b.radialReference,w,j=function(){R&&(w=d.getBBox(),x+=(R[0]-w.x)/w.width-0.5,y+=(R[1]-w.y)/w.height-0.5,r*=R[2]/w.width,v*=R[2]/w.height);D='src="'+L.global.VMLRadialGradientURL+'" size="'+r+","+v+'" origin="0.5,0.5" position="'+x+","+y+'" color2="'+I+'" ';t()};d.added?j():d.onAdd=j;j=E}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=ya(a),h=
+["<",c,' opacity="',f.get("a"),'"/>'],$(this.prepVML(h),null,null,b),j=f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","<hcv:");
+return a},text:ta.prototype.html,path:function(a){var b={coordsize:"10 10"};La(a)?b.d=a:da(a)&&r(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,c){var d=this.symbol("circle");if(da(a))c=a.r,b=a.y,a=a.x;d.isCircle=!0;d.r=c;return d.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement(Ja).attr(b)},image:function(a,b,c,d,e){var f=this.createElement("img").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,
+height:e});return f},createElement:function(a){return a==="rect"?this.symbol(a):ta.prototype.createElement.call(this,a)},invertChild:function(a,b){var c=this,d=b.style,e=a.tagName==="IMG"&&a.style;A(a,{flip:"x",left:z(d.width)-(e?z(e.top):1),top:z(d.height)-(e?z(e.left):1),rotation:-90});q(a.childNodes,function(b){c.invertChild(b,a)})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=aa(f),i=fa(f),j=aa(g),k=fa(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,
+b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){return ta.prototype.symbols[!s(e)||!e.r?"square":"callout"].call(0,a,b,c,d,e)}}};S.VMLRenderer=Z=function(){this.init.apply(this,arguments)};Z.prototype=w(ta.prototype,ha);Ya=Z}ta.prototype.measureSpanWidth=function(a,b){var c=
+x.createElement("span"),d;d=x.createTextNode(a);c.appendChild(d);A(c,b);this.box.appendChild(c);d=c.offsetWidth;Pa(c);return d};var Lb;if(ga)S.CanVGRenderer=Z=function(){xa="http://www.w3.org/1999/xhtml"},Z.prototype.symbols={},Lb=function(){function a(){var a=b.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,d){b.length===0&&Qb(d,a);b.push(c)}}}(),Ya=Z;Sa.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.horiz,e=a.categories,f=a.names,g=this.pos,h=b.labels,
+i=h.rotation,j=a.tickPositions,d=d&&e&&!h.step&&!h.staggerLines&&!h.rotation&&c.plotWidth/j.length||!d&&(c.margin[3]||c.chartWidth*0.33),k=g===j[0],l=g===j[j.length-1],m,f=e?p(e[g],f[g],g):g,e=this.label,n=j.info;a.isDatetimeAxis&&n&&(m=b.dateTimeLabelFormats[n.higherRanks[g]||n.unitName]);this.isFirst=k;this.isLast=l;b=a.labelFormatter.call({axis:a,chart:c,isFirst:k,isLast:l,dateTimeLabelFormat:m,value:a.isLog?ea(ja(f)):f});g=d&&{width:u(1,v(d-2*(h.padding||10)))+"px"};g=r(g,h.style);if(s(e))e&&
+e.attr({text:b}).css(g);else{m={align:a.labelAlign};if(ia(i))m.rotation=i;if(d&&h.ellipsis)g.HcHeight=a.len/j.length;this.label=e=s(b)&&h.enabled?c.renderer.text(b,0,0,h.useHTML).attr(m).css(g).add(a.labelGroup):null;a.tickBaseline=c.renderer.fontMetrics(h.style.fontSize,e).b;i&&a.side===2&&(a.tickBaseline*=aa(i*Ca))}this.yOffset=e?p(h.y,a.tickBaseline+(a.side===2?8:-(e.getBBox().height/2))):0},getLabelSize:function(){var a=this.label,b=this.axis;return a?a.getBBox()[b.horiz?"height":"width"]:0},
+getLabelSides:function(){var a=this.label.getBBox(),b=this.axis,c=b.horiz,d=b.options.labels,a=c?a.width:a.height,b=c?d.x-a*{left:0,center:0.5,right:1}[b.labelAlign]:0;return[b,c?a+b:a]},handleOverflow:function(a,b){var c=!0,d=this.axis,e=this.isFirst,f=this.isLast,g=d.horiz?b.x:b.y,h=d.reversed,i=d.tickPositions,j=this.getLabelSides(),k=j[0],j=j[1],l,m,n,o=this.label.line||0;l=d.labelEdge;m=d.justifyLabels&&(e||f);l[o]===t||g+k>l[o]?l[o]=g+j:m||(c=!1);if(m){l=(m=d.justifyToPlot)?d.pos:0;m=m?l+d.len:
+d.chart.chartWidth;do a+=e?1:-1,n=d.ticks[i[a]];while(i[a]&&(!n||!n.label||n.label.line!==o));d=n&&n.label.xy&&n.label.xy.x+n.getLabelSides()[e?0:1];e&&!h||f&&h?g+k<l&&(g=l-k,n&&g+j>d&&(c=!1)):g+j>m&&(g=m-j,n&&g+k<d&&(c=!1));b.x=g}return c},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?g-e.bottom+e.offset-(e.opposite?e.height:
+0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,j=i.transA,k=i.reversed,l=i.staggerLines,a=a+e.x-(f&&d?f*j*(k?-1:1):0),b=b+this.yOffset-(f&&!d?f*j*(k?1:-1):0);if(l)c.line=g/(h||1)%l,b+=c.line*(i.labelOffset/l);return{x:a,y:b}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine(["M",a,b,"L",a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,j=this.pos,k=e.labels,
+l=this.gridLine,m=h?h+"Grid":"grid",n=h?h+"Tick":"tick",o=e[m+"LineWidth"],q=e[m+"LineColor"],E=e[m+"LineDashStyle"],I=e[n+"Length"],m=e[n+"Width"]||0,D=e[n+"Color"],u=e[n+"Position"],n=this.mark,s=k.step,r=!0,v=d.tickmarkOffset,w=this.getPosition(g,j,v,b),x=w.x,w=w.y,y=g&&x===d.pos+d.len||!g&&w===d.pos?-1:1,c=p(c,1);this.isActive=!0;if(o){j=d.getPlotLinePath(j+v,o*y,b,!0);if(l===t){l={stroke:q,"stroke-width":o};if(E)l.dashstyle=E;if(!h)l.zIndex=1;if(b)l.opacity=0;this.gridLine=l=o?f.path(j).attr(l).add(d.gridGroup):
+null}if(!b&&l&&j)l[this.isNew?"attr":"animate"]({d:j,opacity:c})}if(m&&I)u==="inside"&&(I=-I),d.opposite&&(I=-I),h=this.getMarkPath(x,w,I,m*y,g,f),n?n.animate({d:h,opacity:c}):this.mark=f.path(h).attr({stroke:D,"stroke-width":m,opacity:c}).add(d.axisGroup);if(i&&!isNaN(x))i.xy=w=this.getLabelPosition(x,w,i,g,k,v,a,s),this.isFirst&&!this.isLast&&!p(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!p(e.showLastLabel,1)?r=!1:!d.isRadial&&!k.step&&!k.rotation&&!b&&c!==0&&(r=this.handleOverflow(a,w)),
+s&&a%s&&(r=!1),r&&!isNaN(w.y)?(w.opacity=c,i[this.isNew?"attr":"animate"](w),this.isNew=!1):i.attr("y",-9999)},destroy:function(){Oa(this,this.axis)}};S.PlotLineOrBand=function(a,b){this.axis=a;if(b)this.options=b,this.id=b.id};S.PlotLineOrBand.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=(b.pointRange||0)/2,e=a.options,f=e.label,g=a.label,h=e.width,i=e.to,j=e.from,k=s(j)&&s(i),l=e.value,m=e.dashStyle,n=a.svgElem,o=[],p,q=e.color,I=e.zIndex,D=e.events,r={},t=b.chart.renderer;b.isLog&&
+(j=za(j),i=za(i),l=za(l));if(h){if(o=b.getPlotLinePath(l,h),r={stroke:q,"stroke-width":h},m)r.dashstyle=m}else if(k){j=u(j,b.min-d);i=C(i,b.max+d);o=b.getPlotBandPath(j,i,e);if(q)r.fill=q;if(e.borderWidth)r.stroke=e.borderColor,r["stroke-width"]=e.borderWidth}else return;if(s(I))r.zIndex=I;if(n)if(o)n.animate({d:o},null,n.onGetPath);else{if(n.hide(),n.onGetPath=function(){n.show()},g)a.label=g=g.destroy()}else if(o&&o.length&&(a.svgElem=n=t.path(o).attr(r).add(),D))for(p in d=function(b){n.on(b,function(c){D[b].apply(a,
+[c])})},D)d(p);if(f&&s(f.text)&&o&&o.length&&b.width>0&&b.height>0){f=w({align:c&&k&&"center",x:c?!k&&4:10,verticalAlign:!c&&k&&"middle",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},f);if(!g){r={align:f.textAlign||f.align,rotation:f.rotation};if(s(I))r.zIndex=I;a.label=g=t.text(f.text,0,0,f.useHTML).attr(r).css(f.style).add()}b=[o[1],o[4],k?o[6]:o[1]];k=[o[2],o[5],k?o[7]:o[2]];o=Na(b);c=Na(k);g.align(f,!1,{x:o,y:c,width:Ba(b)-o,height:Ba(k)-c});g.show()}else g&&g.hide();return a},destroy:function(){ka(this.axis.plotLinesAndBands,
+this);delete this.axis;Oa(this)}};ma.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:M,lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:10,
+tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#707070"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return Ga(this.total,-1)},style:M.style}},defaultLeftAxisOptions:{labels:{x:-15,y:null},title:{rotation:270}},
+defaultRightAxisOptions:{labels:{x:15,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:null},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-15},title:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.coll=(this.isXAxis=c)?"xAxis":"yAxis";this.opposite=b.opposite;this.side=b.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;
+this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.names=[];this.isLog=e==="logarithmic";this.isDatetimeAxis=e==="datetime";this.isLinked=s(d.linkedTo);this.tickmarkOffset=this.categories&&d.tickmarkPlacement==="between"?0.5:0;this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;
+this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.min=this.max=null;this.crosshair=p(d.crosshair,ra(a.options.tooltip.crosshairs)[c?0:1],!1);var f,d=this.options.events;Da(this,a.axes)===-1&&(c&&!this.isColorAxis?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];if(a.inverted&&c&&this.reversed===t)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)N(this,f,d[f]);if(this.isLog)this.val2lin=
+za,this.lin2val=ja},setOptions:function(a){this.options=w(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],w(L[this.coll],a))},defaultLabelFormatter:function(){var a=this.axis,b=this.value,c=a.categories,d=this.dateTimeLabelFormat,e=L.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ia(h,this);else if(c)g=b;else if(d)g=
+bb(d,b);else if(f&&a>=1E3)for(;f--&&g===t;)c=Math.pow(1E3,f+1),a>=c&&e[f]!==null&&(g=Ga(b/c,-1)+e[f]);g===t&&(g=Q(b)>=1E4?Ga(b,0):Ga(b,-1,t,""));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=null;a.buildStacks&&a.buildStacks();q(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d;d=c.options.threshold;var e;a.hasVisibleSeries=!0;a.isLog&&d<=0&&(d=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=C(p(a.dataMin,d[0]),
+Na(d)),a.dataMax=u(p(a.dataMax,d[0]),Ba(d))}else{c.getExtremes();e=c.dataMax;c=c.dataMin;if(s(c)&&s(e))a.dataMin=C(p(a.dataMin,c),c),a.dataMax=u(p(a.dataMax,e),e);if(s(d))if(a.dataMin>=d)a.dataMin=d,a.ignoreMinPadding=!0;else if(a.dataMax<d)a.dataMax=d,a.ignoreMaxPadding=!0}}})},translate:function(a,b,c,d,e,f){var g=1,h=0,i=d?this.oldTransA:this.transA,d=d?this.oldMin:this.min,j=this.minPixelPadding,e=(this.options.ordinal||this.isLog&&e)&&this.lin2val;if(!i)i=this.transA;if(c)g*=-1,h=this.len;this.reversed&&
+(g*=-1,h-=g*(this.sector||this.len));b?(a=a*g+h,a-=j,a=a/i+d,e&&(a=this.lin2val(a))):(e&&(a=this.val2lin(a)),f==="between"&&(f=0.5),a=g*(a-d)*i+h+g*j+(ia(f)?i*f*this.pointRange:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,c,d,e){var f=this.chart,g=this.left,h=this.top,i,j,k=c&&f.oldChartHeight||f.chartHeight,l=c&&f.oldChartWidth||
+f.chartWidth,m;i=this.transB;e=p(e,this.translate(a,null,null,c));a=c=v(e+i);i=j=v(k-e-i);if(isNaN(e))m=!0;else if(this.horiz){if(i=h,j=k-this.bottom,a<g||a>g+this.width)m=!0}else if(a=g,c=l-this.right,i<h||i>h+this.height)m=!0;return m&&!d?null:f.renderer.crispLine(["M",a,i,"L",c,j],b||1)},getLinearTickPositions:function(a,b,c){var d,e=ea(U(b/a)*a),f=ea(Ka(c/a)*a),g=[];if(b===c&&ia(b))return[b];for(b=e;b<=f;){g.push(b);b=ea(b+a);if(b===d)break;d=b}return g},getMinorTickPositions:function(){var a=
+this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e;if(this.isLog){e=b.length;for(a=1;a<e;a++)d=d.concat(this.getLogTickPositions(c,b[a-1],b[a],!0))}else if(this.isDatetimeAxis&&a.minorTickInterval==="auto")d=d.concat(this.getTimeTicks(this.normalizeTimeTickInterval(c),this.min,this.max,a.startOfWeek)),d[0]<this.min&&d.shift();else for(b=this.min+(b[0]-this.min)%c;b<=this.max;b+=c)d.push(b);return d},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-
+this.dataMin>=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===t&&!this.isLog)s(a.min)||s(a.max)?this.minRange=null:(q(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-1;g>0;g--)if(h=i[g]-i[g-1],f===t||h<f)f=h}),this.minRange=C(f*5,this.dataMax-this.dataMin));if(c-b<this.minRange){var k=this.minRange;d=(k-c+b)/2;d=[b-d,p(a.min,b-d)];if(e)d[2]=this.dataMin;b=Ba(d);c=[b+k,p(a.max,b+k)];if(e)c[2]=this.dataMax;c=Na(c);c-b<k&&(d[0]=c-k,d[1]=p(a.min,c-k),b=Ba(d))}this.min=b;this.max=
+c},setAxisTranslation:function(a){var b=this,c=b.max-b.min,d=b.axisPointRange||0,e,f=0,g=0,h=b.linkedParent,i=!!b.categories,j=b.transA;if(b.isXAxis||i||d)h?(f=h.minPointOffset,g=h.pointRangePadding):q(b.series,function(a){var h=i?1:b.isXAxis?a.pointRange:b.axisPointRange||0,j=a.options.pointPlacement,n=a.closestPointRange;h>c&&(h=0);d=u(d,h);f=u(f,Fa(j)?0:h/2);g=u(g,j==="on"?0:h);!a.noSharedTooltip&&s(n)&&(e=s(e)?C(e,n):n)}),h=b.ordinalSlope&&e?b.ordinalSlope/e:1,b.minPointOffset=f*=h,b.pointRangePadding=
+g*=h,b.pointRange=C(d,c),b.closestPointRange=e;if(a)b.oldTransA=j;b.translationSlope=b.transA=j=b.len/(c+g||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=j*f},setTickPositions:function(a){var b=this,c=b.chart,d=b.options,e=d.startOnTick,f=d.endOnTick,g=b.isLog,h=b.isDatetimeAxis,i=b.isXAxis,j=b.isLinked,k=b.options.tickPositioner,l=d.maxPadding,m=d.minPadding,n=d.tickInterval,o=d.minTickInterval,Y=d.tickPixelInterval,E,I=b.categories;j?(b.linkedParent=c[b.coll][d.linkedTo],c=b.linkedParent.getExtremes(),
+b.min=p(c.min,c.dataMin),b.max=p(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&oa(11,1)):(b.min=p(b.userMin,d.min,b.dataMin),b.max=p(b.userMax,d.max,b.dataMax));if(g)!a&&C(b.min,p(b.dataMin,b.min))<=0&&oa(10,1),b.min=ea(za(b.min)),b.max=ea(za(b.max));if(b.range&&s(b.max))b.userMin=b.min=u(b.min,b.max-b.range),b.userMax=b.max,b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!I&&!b.axisPointRange&&!b.usePercentage&&!j&&s(b.min)&&s(b.max)&&(c=b.max-b.min)){if(!s(d.min)&&
+!s(b.userMin)&&m&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=c*m;if(!s(d.max)&&!s(b.userMax)&&l&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*l}if(ia(d.floor))b.min=u(b.min,d.floor);if(ia(d.ceiling))b.max=C(b.max,d.ceiling);b.min===b.max||b.min===void 0||b.max===void 0?b.tickInterval=1:j&&!n&&Y===b.linkedParent.options.tickPixelInterval?b.tickInterval=b.linkedParent.tickInterval:(b.tickInterval=p(n,I?1:(b.max-b.min)*Y/u(b.len,Y)),!s(n)&&b.len<Y&&!this.isRadial&&!this.isLog&&!I&&e&&f&&(E=!0,b.tickInterval/=
+4));i&&!a&&q(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange)b.tickInterval=u(b.pointRange,b.tickInterval);if(!n&&b.tickInterval<o)b.tickInterval=o;if(!h&&!g&&!n)b.tickInterval=mb(b.tickInterval,null,lb(b.tickInterval),d);b.minorTickInterval=d.minorTickInterval==="auto"&&b.tickInterval?b.tickInterval/
+5:d.minorTickInterval;b.tickPositions=a=d.tickPositions?[].concat(d.tickPositions):k&&k.apply(b,[b.min,b.max]);if(!a)!b.ordinalPositions&&(b.max-b.min)/b.tickInterval>u(2*b.len,200)&&oa(19,!0),a=h?b.getTimeTicks(b.normalizeTimeTickInterval(b.tickInterval,d.units),b.min,b.max,d.startOfWeek,b.ordinalPositions,b.closestPointRange,!0):g?b.getLogTickPositions(b.tickInterval,b.min,b.max):b.getLinearTickPositions(b.tickInterval,b.min,b.max),E&&a.splice(1,a.length-2),b.tickPositions=a;if(!j)d=a[0],g=a[a.length-
+1],h=b.minPointOffset||0,!e&&!f&&!I&&a.length===2&&a.splice(1,0,(g+d)/2),e?b.min=d:b.min-h>d&&a.shift(),f?b.max=g:b.max+h<g&&a.pop(),a.length===1&&(e=Q(b.max)>1E13?1:0.001,b.min-=e,b.max+=e)},setMaxTicks:function(){var a=this.chart,b=a.maxTicks||{},c=this.tickPositions,d=this._maxTicksKey=[this.coll,this.pos,this.len].join("-");if(!this.isLinked&&!this.isDatetimeAxis&&c&&c.length>(b[d]||0)&&this.options.alignTicks!==!1)b[d]=c.length;a.maxTicks=b},adjustTickAmount:function(){var a=this._maxTicksKey,
+b=this.tickPositions,c=this.chart.maxTicks;if(c&&c[a]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1&&this.min!==t){var d=this.tickAmount,e=b.length;this.tickAmount=a=c[a];if(e<a){for(;b.length<a;)b.push(ea(b[b.length-1]+this.tickInterval));this.transA*=(e-1)/(a-1);this.max=b[b.length-1]}if(s(d)&&a!==d)this.isDirty=!0}},setScale:function(){var a=this.stacks,b,c,d,e;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();e=this.len!==
+this.oldAxisLength;q(this.series,function(a){if(a.isDirtyData||a.isDirty||a.xAxis.isDirty)d=!0});if(e||d||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax){if(!this.isXAxis)for(b in a)for(c in a[b])a[b][c].total=null,a[b][c].cum=0;this.forceRedraw=!1;this.getSeriesExtremes();this.setTickPositions();this.oldUserMin=this.userMin;this.oldUserMax=this.userMax;if(!this.isDirty)this.isDirty=e||this.min!==this.oldMin||this.max!==this.oldMax}else if(!this.isXAxis){if(this.oldStacks)a=
+this.stacks=this.oldStacks;for(b in a)for(c in a[b])a[b][c].cum=a[b][c].total}this.setMaxTicks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=p(c,!0),e=r(e,{min:a,max:b});K(f,"setExtremes",e,function(){f.userMin=a;f.userMax=b;f.eventArgs=e;f.isDirtyExtremes=!0;c&&g.redraw(d)})},zoom:function(a,b){var c=this.dataMin,d=this.dataMax,e=this.options;this.allowZoomOutside||(s(c)&&a<=C(c,p(e.min,c))&&(a=t),s(d)&&b>=u(d,p(e.max,d))&&(b=t));this.displayBtn=a!==t||b!==t;this.setExtremes(a,b,!1,t,
+{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,e=p(b.width,a.plotWidth-c+(b.offsetRight||0)),f=p(b.height,a.plotHeight),g=p(b.top,a.plotTop),b=p(b.left,a.plotLeft+c),c=/%$/;c.test(f)&&(f=parseInt(f,10)/100*a.plotHeight);c.test(g)&&(g=parseInt(g,10)/100*a.plotHeight+a.plotTop);this.left=b;this.top=g;this.width=e;this.height=f;this.bottom=a.chartHeight-f-g;this.right=a.chartWidth-e-b;this.len=u(d?e:f,0);this.pos=d?b:g},getExtremes:function(){var a=
+this.isLog;return{min:a?ea(ja(this.min)):this.min,max:a?ea(ja(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?ja(this.min):this.min,b=b?ja(this.max):this.max;c>a||a===null?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(p(a,0)-this.side*90+720)%360;return a>15&&a<165?"right":a>195&&a<345?"left":"center"},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,
+e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k,l=0,m,n=0,o=d.title,Y=d.labels,E=0,I=b.axisOffset,b=b.clipOffset,D=[-1,1,1,-1][h],r,v=1,w=p(Y.maxStaggerLines,5),x,z,C,y,R;a.hasData=j=a.hasVisibleSeries||s(a.min)&&s(a.max)&&!!e;a.showAxis=k=j||p(d.showEmpty,!0);a.staggerLines=a.horiz&&Y.staggerLines;if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g("axis-labels").attr({zIndex:Y.zIndex||
+7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels").add();if(j||a.isLinked){a.labelAlign=p(Y.align||a.autoLabelAlign(Y.rotation));q(e,function(b){f[b]?f[b].addLabel():f[b]=new Sa(a,b)});if(a.horiz&&!a.staggerLines&&w&&!Y.rotation){for(j=a.reversed?[].concat(e).reverse():e;v<w;){x=[];z=!1;for(r=0;r<j.length;r++)C=j[r],y=(y=f[C].label&&f[C].label.getBBox())?y.width:0,R=r%v,y&&(C=a.translate(C),x[R]!==t&&C<x[R]&&(z=!0),x[R]=C+y);if(z)v++;else break}if(v>1)a.staggerLines=v}q(e,function(b){if(h===
+0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)E=u(f[b].getLabelSize(),E)});if(a.staggerLines)E*=a.staggerLines,a.labelOffset=E}else for(r in f)f[r].destroy(),delete f[r];if(o&&o.text&&o.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(o.text,0,0,o.useHTML).attr({zIndex:7,rotation:o.rotation||0,align:o.textAlign||{low:"left",middle:"center",high:"right"}[o.align]}).addClass("highcharts-"+this.coll.toLowerCase()+"-title").css(o.style).add(a.axisGroup),a.axisTitle.isNew=!0;if(k)l=a.axisTitle.getBBox()[g?
+"height":"width"],m=o.offset,n=s(m)?0:p(o.margin,g?5:10);a.axisTitle[k?"show":"hide"]()}a.offset=D*p(d.offset,I[h]);c=h===2?a.tickBaseline:0;g=E+n+(E&&D*(g?p(Y.y,a.tickBaseline+8):Y.x)-c);a.axisTitleMargin=p(m,g);I[h]=u(I[h],a.axisTitleMargin+l+D*a.offset,g);b[i]=u(b[i],U(d.lineWidth/2)*2)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",e?
+this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=z(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this,
+b=a.horiz,c=a.reversed,d=a.chart,e=d.renderer,f=a.options,g=a.isLog,h=a.isLinked,i=a.tickPositions,j,k=a.axisTitle,l=a.ticks,m=a.minorTicks,n=a.alternateBands,o=f.stackLabels,p=f.alternateGridColor,E=a.tickmarkOffset,I=f.lineWidth,D=d.hasRendered&&s(a.oldMin)&&!isNaN(a.oldMin),r=a.hasData,u=a.showAxis,v,w=f.labels.overflow,x=a.justifyLabels=b&&w!==!1,z;a.labelEdge.length=0;a.justifyToPlot=w==="justify";q([l,m,n],function(a){for(var b in a)a[b].isActive=!1});if(r||h)if(a.minorTickInterval&&!a.categories&&
+q(a.getMinorTickPositions(),function(b){m[b]||(m[b]=new Sa(a,b,"minor"));D&&m[b].isNew&&m[b].render(null,!0);m[b].render(null,!1,1)}),i.length&&(j=i.slice(),(b&&c||!b&&!c)&&j.reverse(),x&&(j=j.slice(1).concat([j[0]])),q(j,function(b,c){x&&(c=c===j.length-1?0:c+1);if(!h||b>=a.min&&b<=a.max)l[b]||(l[b]=new Sa(a,b)),D&&l[b].isNew&&l[b].render(c,!0,0.1),l[b].render(c)}),E&&a.min===0&&(l[-1]||(l[-1]=new Sa(a,-1,null,!0)),l[-1].render(-1))),p&&q(i,function(b,c){if(c%2===0&&b<a.max)n[b]||(n[b]=new S.PlotLineOrBand(a)),
+v=b+E,z=i[c+1]!==t?i[c+1]+E:a.max,n[b].options={from:g?ja(v):v,to:g?ja(z):z,color:p},n[b].render(),n[b].isActive=!0}),!a._addedPlotLB)q((f.plotLines||[]).concat(f.plotBands||[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0;q([l,m,n],function(a){var b,c,e=[],f=va?va.duration||500:0,g=function(){for(c=e.length;c--;)a[e[c]]&&!a[e[c]].isActive&&(a[e[c]].destroy(),delete a[e[c]])};for(b in a)if(!a[b].isActive)a[b].render(b,!1,0),a[b].isActive=!1,e.push(b);a===n||!d.hasRendered||!f?g():f&&setTimeout(g,
+f)});if(I)b=a.getLinePath(I),a.axisLine?a.axisLine.animate({d:b}):a.axisLine=e.path(b).attr({stroke:f.lineColor,"stroke-width":I,zIndex:7}).add(a.axisGroup),a.axisLine[u?"show":"hide"]();if(k&&u)k[k.isNew?"attr":"animate"](a.getTitlePosition()),k.isNew=!1;o&&o.enabled&&a.renderStackTotals();a.isDirty=!1},redraw:function(){this.render();q(this.plotLinesAndBands,function(a){a.render()});q(this.series,function(a){a.isDirty=!0})},destroy:function(a){var b=this,c=b.stacks,d,e=b.plotLinesAndBands;a||X(b);
+for(d in c)Oa(c[d]),c[d]=null;q([b.ticks,b.minorTicks,b.alternateBands],function(a){Oa(a)});for(a=e.length;a--;)e[a].destroy();q("stackTotalGroup,axisLine,axisTitle,axisGroup,cross,gridGroup,labelGroup".split(","),function(a){b[a]&&(b[a]=b[a].destroy())});this.cross&&this.cross.destroy()},drawCrosshair:function(a,b){if(this.crosshair)if((s(b)||!p(this.crosshair.snap,!0))===!1)this.hideCrosshair();else{var c,d=this.crosshair,e=d.animation;p(d.snap,!0)?s(b)&&(c=this.chart.inverted!=this.horiz?b.plotX:
+this.len-b.plotY):c=this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos;c=this.isRadial?this.getPlotLinePath(this.isXAxis?b.x:p(b.stackY,b.y)):this.getPlotLinePath(null,null,null,null,c);if(c===null)this.hideCrosshair();else if(this.cross)this.cross.attr({visibility:"visible"})[e?"animate":"attr"]({d:c},e);else{e={"stroke-width":d.width||1,stroke:d.color||"#C0C0C0",zIndex:d.zIndex||2};if(d.dashStyle)e.dashstyle=d.dashStyle;this.cross=this.chart.renderer.path(c).attr(e).add()}}},hideCrosshair:function(){this.cross&&
+this.cross.hide()}};r(ma.prototype,{getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b),d=this.getPlotLinePath(a);d&&c?d.push(c[4],c[5],c[1],c[2]):d=null;return d},addPlotBand:function(a){return this.addPlotBandOrLine(a,"plotBands")},addPlotLine:function(a){return this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(a,b){var c=(new S.PlotLineOrBand(this,a)).render(),d=this.userOptions;c&&(b&&(d[b]=d[b]||[],d[b].push(a)),this.plotLinesAndBands.push(c));return c},removePlotBandOrLine:function(a){for(var b=
+this.plotLinesAndBands,c=this.options,d=this.userOptions,e=b.length;e--;)b[e].id===a&&b[e].destroy();q([c.plotLines||[],d.plotLines||[],c.plotBands||[],d.plotBands||[]],function(b){for(e=b.length;e--;)b[e].id===a&&ka(b,b[e])})}});ma.prototype.getTimeTicks=function(a,b,c,d){var e=[],f={},g=L.global.useUTC,h,i=new Date(b-Ra),j=a.unitRange,k=a.count;if(s(b)){j>=B.second&&(i.setMilliseconds(0),i.setSeconds(j>=B.minute?0:k*U(i.getSeconds()/k)));if(j>=B.minute)i[Bb](j>=B.hour?0:k*U(i[ob]()/k));if(j>=B.hour)i[Cb](j>=
+B.day?0:k*U(i[pb]()/k));if(j>=B.day)i[rb](j>=B.month?1:k*U(i[Wa]()/k));j>=B.month&&(i[Db](j>=B.year?0:k*U(i[eb]()/k)),h=i[fb]());j>=B.year&&(h-=h%k,i[Eb](h));if(j===B.week)i[rb](i[Wa]()-i[qb]()+p(d,1));b=1;Ra&&(i=new Date(i.getTime()+Ra));h=i[fb]();for(var d=i.getTime(),l=i[eb](),m=i[Wa](),n=g?Ra:(864E5+i.getTimezoneOffset()*6E4)%864E5;d<c;)e.push(d),j===B.year?d=db(h+b*k,0):j===B.month?d=db(h,l+b*k):!g&&(j===B.day||j===B.week)?d=db(h,l,m+b*k*(j===B.day?1:7)):d+=j*k,b++;e.push(d);q(vb(e,function(a){return j<=
+B.hour&&a%B.day===n}),function(a){f[a]="day"})}e.info=r(a,{higherRanks:f,totalRange:j*k});return e};ma.prototype.normalizeTimeTickInterval=function(a,b){var c=b||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]],d=c[c.length-1],e=B[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=B[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+B[c[g+1][0]])/2)break;e===B.year&&
+a<5*e&&(f=[1,2,5]);c=mb(a/e,f,d[0]==="year"?u(lb(a/e),1):1);return{unitRange:e,count:c,unitName:d[0]}};ma.prototype.getLogTickPositions=function(a,b,c,d){var e=this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=v(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=U(b),h,i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!l;f++){i=e.length;for(h=0;h<i&&!l;h++)j=za(ja(f)*e[h]),j>b&&(!d||k<=c)&&k!==t&&g.push(k),k>c&&(l=!0),k=j}else if(b=ja(b),
+c=ja(c),a=e[d?"minorTickInterval":"tickInterval"],a=p(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=mb(a,null,lb(a)),g=Ua(this.getLinearTickPositions(a,b,c),za),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g};var Mb=S.Tooltip=function(){this.init.apply(this,arguments)};Mb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=z(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,
+y:0};this.isHidden=!0;this.label=a.renderer.label("",0,0,b.shape||"callout",null,null,b.useHTML,null,"tooltip").attr({padding:e,fill:b.backgroundColor,"stroke-width":c,r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-9999});ga||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden&&
+(Q(a-f.x)>1||Q(b-f.y)>1),h=e.followPointer||e.len>1;r(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:h?t:g?(2*f.anchorX+c)/3:c,anchorY:h?t:g?(f.anchorY+d)/2:d});e.label.attr(f);if(g)clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(){var a=this,b;clearTimeout(this.hideTimer);if(!this.isHidden)b=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){a.label.fadeOut();a.isHidden=!0},p(this.options.hideDelay,500)),b&&q(b,function(a){a.setState()}),
+this.chart.hoverPoints=null},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=0,h=0,i,a=ra(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===t&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(q(a,function(a){i=a.series.yAxis;g+=a.plotX;h+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&i?i.top-f:0)}),g/=a.length,h/=a.length,c=[e?d.plotWidth-h:g,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-g:h]);return Ua(c,v)},getPosition:function(a,b,c){var d=
+this.chart,e=this.distance,f={},g,h=["y",d.chartHeight,b,c.plotY+d.plotTop],i=["x",d.chartWidth,a,c.plotX+d.plotLeft],j=c.ttBelow||d.inverted&&!c.negative||!d.inverted&&c.negative,k=function(a,b,c,d){var g=c<d-e,b=d+e+c<b,c=d-e-c;d+=e;if(j&&b)f[a]=d;else if(!j&&g)f[a]=c;else if(g)f[a]=c;else if(b)f[a]=d;else return!1},l=function(a,b,c,d){if(d<e||d>b-e)return!1;else f[a]=d<c/2?1:d>b-c/2?b-c-2:d-c/2},m=function(a){var b=h;h=i;i=b;g=a},n=function(){k.apply(0,h)!==!1?l.apply(0,i)===!1&&!g&&(m(!0),n()):
+g?f.x=f.y=0:(m(!0),n())};(d.inverted||this.len>1)&&m();n();return f},defaultFormatter:function(a){var b=this.points||ra(this),c=b[0].series,d;d=[a.tooltipHeaderFormatter(b[0])];q(b,function(a){c=a.series;d.push(c.tooltipFormatter&&c.tooltipFormatter(a)||a.point.tooltipFormatter(c.tooltipOptions.pointFormat))});d.push(a.options.footerFormat||"");return d.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h={},i,j=[];i=e.formatter||this.defaultFormatter;var h=c.hoverPoints,
+k,l=this.shared;clearTimeout(this.hideTimer);this.followPointer=ra(a)[0].series.tooltipOptions.followPointer;g=this.getAnchor(a,b);f=g[0];g=g[1];l&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,h&&q(h,function(a){a.setState()}),q(a,function(a){a.setState("hover");j.push(a.getLabelConfig())}),h={x:a[0].category,y:a[0].y},h.points=j,this.len=j.length,a=a[0]):h=a.getLabelConfig();i=i.call(h,this);h=a.series;this.distance=p(h.tooltipOptions.distance,16);i===!1?this.hide():(this.isHidden&&(ab(d),
+d.attr("opacity",1).show()),d.attr({text:i}),k=e.borderColor||a.color||h.color||"#606060",d.attr({stroke:k}),this.updatePosition({plotX:f,plotY:g,negative:a.negative,ttBelow:a.ttBelow}),this.isHidden=!1);K(c,"tooltipRefresh",{text:i,x:f+c.plotLeft,y:g+c.plotTop,borderColor:k})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||this.getPosition).call(this,c.width,c.height,a);this.move(v(c.x),v(c.y),a.plotX+b.plotLeft,a.plotY+b.plotTop)},tooltipHeaderFormatter:function(a){var b=
+a.series,c=b.tooltipOptions,d=c.dateTimeLabelFormats,e=c.xDateFormat,f=b.xAxis,g=f&&f.options.type==="datetime"&&ia(a.key),c=c.headerFormat,f=f&&f.closestPointRange,h;if(g&&!e){if(f)for(h in B){if(B[h]>=f||B[h]<=B.day&&a.key%B[h]>0){e=d[h];break}}else e=d.day;e=e||d.year}g&&e&&(c=c.replace("{point.key}","{point.key:"+e+"}"));return Ia(c,{point:a,series:b})}};var pa;Za=x.documentElement.ontouchstart!==t;var Va=S.Pointer=function(a,b){this.init(a,b)};Va.prototype={init:function(a,b){var c=b.chart,d=
+c.events,e=ga?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.hasZoom=f||e;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(S.Tooltip&&b.tooltip.enabled)a.tooltip=new Mb(a,b.tooltip),this.followTouchMove=b.tooltip.followTouchMove;this.setDOMEvents()},normalize:function(a,b){var c,d,a=a||window.event,a=Sb(a);if(!a.target)a.target=a.srcElement;d=a.touches?a.touches.length?
+a.touches.item(0):a.changedTouches[0]:a;if(!b)this.chartPosition=b=Rb(this.chart.container);d.pageX===t?(c=u(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,d=d.pageY-b.top);return r(a,{chartX:v(c),chartY:v(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};q(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},getIndex:function(a){var b=this.chart;return b.inverted?b.plotHeight+b.plotTop-a.chartY:a.chartX-b.plotLeft},
+runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e,f,g=b.hoverPoint,h=b.hoverSeries,i,j,k=b.chartWidth,l=this.getIndex(a);if(d&&this.options.tooltip.shared&&(!h||!h.noSharedTooltip)){f=[];i=c.length;for(j=0;j<i;j++)if(c[j].visible&&c[j].options.enableMouseTracking!==!1&&!c[j].noSharedTooltip&&c[j].singularTooltips!==!0&&c[j].tooltipPoints.length&&(e=c[j].tooltipPoints[l])&&e.series)e._dist=Q(l-e.clientX),k=C(k,e._dist),f.push(e);for(i=f.length;i--;)f[i]._dist>k&&f.splice(i,1);if(f.length&&
+f[0].clientX!==this.hoverX)d.refresh(f,a),this.hoverX=f[0].clientX}c=h&&h.tooltipOptions.followPointer;if(h&&h.tracker&&!c){if((e=h.tooltipPoints[l])&&e!==g)e.onMouseOver(a)}else d&&c&&!d.isHidden&&(h=d.getAnchor([{}],a),d.updatePosition({plotX:h[0],plotY:h[1]}));if(d&&!this._onDocumentMouseMove)this._onDocumentMouseMove=function(a){if(W[pa])W[pa].pointer.onDocumentMouseMove(a)},N(x,"mousemove",this._onDocumentMouseMove);q(b.axes,function(b){b.drawCrosshair(a,p(e,g))})},reset:function(a){var b=this.chart,
+c=b.hoverSeries,d=b.hoverPoint,e=b.tooltip,f=e&&e.shared?b.hoverPoints:d;(a=a&&e&&f)&&ra(f)[0].plotX===t&&(a=!1);if(a)e.refresh(f),d&&d.setState(d.state,!0);else{if(d)d.onMouseOut();if(c)c.onMouseOut();e&&e.hide();if(this._onDocumentMouseMove)X(x,"mousemove",this._onDocumentMouseMove),this._onDocumentMouseMove=null;q(b.axes,function(a){a.hideCrosshair()});this.hoverX=null}},scaleGroups:function(a,b){var c=this.chart,d;q(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),
+e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,j=b.plotWidth,k=b.plotHeight,l,m=this.mouseDownX,n=this.mouseDownY,
+o=c.panKey&&a[c.panKey+"Key"];d<h?d=h:d>h+j&&(d=h+j);e<i?e=i:e>i+k&&(e=i+k);this.hasDragged=Math.sqrt(Math.pow(m-d,2)+Math.pow(n-e,2));if(this.hasDragged>10){l=b.isInsidePlot(m-h,n-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!o&&!this.selectionMarker)this.selectionMarker=b.renderer.rect(h,i,f?1:j,g?1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();this.selectionMarker&&f&&(d-=m,this.selectionMarker.attr({width:Q(d),x:(d>0?0:d)+m}));this.selectionMarker&&
+g&&(d=e-n,this.selectionMarker.attr({height:Q(d),y:(d>0?0:d)+n}));l&&!this.selectionMarker&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this.chart,c=this.hasPinched;if(this.selectionMarker){var d={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},e=this.selectionMarker,f=e.attr?e.attr("x"):e.x,g=e.attr?e.attr("y"):e.y,h=e.attr?e.attr("width"):e.width,i=e.attr?e.attr("height"):e.height,j;if(this.hasDragged||c)q(b.axes,function(b){if(b.zoomEnabled){var c=b.horiz,e=a.type==="touchend"?b.minPixelPadding:
+0,n=b.toValue((c?f:g)+e),c=b.toValue((c?f+h:g+i)-e);!isNaN(n)&&!isNaN(c)&&(d[b.coll].push({axis:b,min:C(n,c),max:u(n,c)}),j=!0)}}),j&&K(b,"selection",d,function(a){b.zoom(r(a,c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();c&&this.scaleGroups()}if(b)A(b.container,{cursor:b._cursor}),b.cancelClick=this.hasDragged>10,b.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=this.normalize(a);a.preventDefault&&a.preventDefault();
+this.dragStart(a)},onDocumentMouseUp:function(a){W[pa]&&W[pa].pointer.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,d=b.hoverSeries,a=this.normalize(a,c);c&&d&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){var a=W[pa];if(a)a.pointer.reset(),a.pointer.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart;pa=b.index;a=this.normalize(a);a.returnValue=
+!1;b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=F(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries,c=(a=a.relatedTarget||a.toElement)&&a.point&&a.point.series;if(b&&!b.options.stickyTracking&&!this.inClass(a,
+"highcharts-tooltip")&&c!==b)b.onMouseOut()},onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,a=this.normalize(a);a.cancelBubble=!0;b.cancelClick||(c&&this.inClass(a.target,"highcharts-tracker")?(K(c.series,"click",r(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(r(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&K(b,"click",a)))},setDOMEvents:function(){var a=this,b=a.chart.container;b.onmousedown=function(b){a.onContainerMouseDown(b)};
+b.onmousemove=function(b){a.onContainerMouseMove(b)};b.onclick=function(b){a.onContainerClick(b)};N(b,"mouseleave",a.onContainerMouseLeave);$a===1&&N(x,"mouseup",a.onDocumentMouseUp);if(Za)b.ontouchstart=function(b){a.onContainerTouchStart(b)},b.ontouchmove=function(b){a.onContainerTouchMove(b)},$a===1&&N(x,"touchend",a.onDocumentTouchEnd)},destroy:function(){var a;X(this.chart.container,"mouseleave",this.onContainerMouseLeave);$a||(X(x,"mouseup",this.onDocumentMouseUp),X(x,"touchend",this.onDocumentTouchEnd));
+clearInterval(this.tooltipTimeout);for(a in this)this[a]=null}};r(S.Pointer.prototype,{pinchTranslate:function(a,b,c,d,e,f){(this.zoomHor||this.pinchHor)&&this.pinchTranslateDirection(!0,a,b,c,d,e,f);(this.zoomVert||this.pinchVert)&&this.pinchTranslateDirection(!1,a,b,c,d,e,f)},pinchTranslateDirection:function(a,b,c,d,e,f,g,h){var i=this.chart,j=a?"x":"y",k=a?"X":"Y",l="chart"+k,m=a?"width":"height",n=i["plot"+(a?"Left":"Top")],o,p,q=h||1,r=i.inverted,D=i.bounds[a?"h":"v"],u=b.length===1,s=b[0][l],
+v=c[0][l],t=!u&&b[1][l],w=!u&&c[1][l],x,c=function(){!u&&Q(s-t)>20&&(q=h||Q(v-w)/Q(s-t));p=(n-v)/q+s;o=i["plot"+(a?"Width":"Height")]/q};c();b=p;b<D.min?(b=D.min,x=!0):b+o>D.max&&(b=D.max-o,x=!0);x?(v-=0.8*(v-g[j][0]),u||(w-=0.8*(w-g[j][1])),c()):g[j]=[v,w];r||(f[j]=p-n,f[m]=o);f=r?1/q:q;e[m]=o;e[j]=b;d[r?a?"scaleY":"scaleX":"scale"+k]=q;d["translate"+k]=f*n+(v-f*s)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=b.followTouchMove,f=a.touches,g=f.length,h=b.lastValidTouch,i=b.hasZoom,j=b.selectionMarker,
+k={},l=g===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||c.runChartClick),m={};(i||e)&&!l&&a.preventDefault();Ua(f,function(a){return b.normalize(a)});if(a.type==="touchstart")q(f,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),h.x=[d[0].chartX,d[1]&&d[1].chartX],h.y=[d[0].chartY,d[1]&&d[1].chartY],q(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],d=a.minPixelPadding,e=a.toPixels(p(a.options.min,a.dataMin)),f=a.toPixels(p(a.options.max,a.dataMax)),g=
+C(e,f),e=u(e,f);b.min=C(a.pos,g-d);b.max=u(a.pos+a.len,e+d)}});else if(d.length){if(!j)b.selectionMarker=j=r({destroy:sa},c.plotBox);b.pinchTranslate(d,f,k,j,m,h);b.hasPinched=i;b.scaleGroups(k,m);!i&&e&&g===1&&this.runPointActions(b.normalize(a))}},onContainerTouchStart:function(a){var b=this.chart;pa=b.index;a.touches.length===1?(a=this.normalize(a),b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)?(this.runPointActions(a),this.pinch(a)):this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchMove:function(a){(a.touches.length===
+1||a.touches.length===2)&&this.pinch(a)},onDocumentTouchEnd:function(a){W[pa]&&W[pa].pointer.drop(a)}});if(H.PointerEvent||H.MSPointerEvent){var ua={},yb=!!H.PointerEvent,Wb=function(){var a,b=[];b.item=function(a){return this[a]};for(a in ua)ua.hasOwnProperty(a)&&b.push({pageX:ua[a].pageX,pageY:ua[a].pageY,target:ua[a].target});return b},zb=function(a,b,c,d){a=a.originalEvent||a;if((a.pointerType==="touch"||a.pointerType===a.MSPOINTER_TYPE_TOUCH)&&W[pa])d(a),d=W[pa].pointer,d[b]({type:c,target:a.currentTarget,
+preventDefault:sa,touches:Wb()})};r(Va.prototype,{onContainerPointerDown:function(a){zb(a,"onContainerTouchStart","touchstart",function(a){ua[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){zb(a,"onContainerTouchMove","touchmove",function(a){ua[a.pointerId]={pageX:a.pageX,pageY:a.pageY};if(!ua[a.pointerId].target)ua[a.pointerId].target=a.currentTarget})},onDocumentPointerUp:function(a){zb(a,"onContainerTouchEnd","touchend",function(a){delete ua[a.pointerId]})},
+batchMSEvents:function(a){a(this.chart.container,yb?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,yb?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(x,yb?"pointerup":"MSPointerUp",this.onDocumentPointerUp)}});Ma(Va.prototype,"init",function(a,b,c){a.call(this,b,c);(this.hasZoom||this.followTouchMove)&&A(b.container,{"-ms-touch-action":P,"touch-action":P})});Ma(Va.prototype,"setDOMEvents",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&
+this.batchMSEvents(N)});Ma(Va.prototype,"destroy",function(a){this.batchMSEvents(X);a.call(this)})}var kb=S.Legend=function(a,b){this.init(a,b)};kb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=p(b.padding,8),f=b.itemMarginTop||0;this.options=b;if(b.enabled)c.itemStyle=d,c.itemHiddenStyle=w(d,b.itemHiddenStyle),c.itemMarginTop=f,c.padding=e,c.initialItemX=e,c.initialItemY=e-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.lastLineHeight=0,c.symbolWidth=p(b.symbolWidth,16),c.pages=[],c.render(),
+N(c.chart,"endResize",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options,d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.legendColor||a.color||"#CCC":g,g=a.options&&a.options.marker,i={fill:h},j;d&&d.css({fill:c,color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(j in i.stroke=h,g=a.convertAttribs(g),g)d=g[j],d!==t&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,
+d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;a.legendGroup&&a.legendGroup.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=e,f.y=d},destroyItem:function(a){var b=a.checkbox;q(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Pa(a.checkbox)},destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight;if(b)c=
+b.translateY,q(this.allItems,function(e){var f=e.checkbox,g;f&&(g=c+f.y+(a||0)+3,A(f,{left:b.translateX+e.checkboxOffset+f.x-20+"px",top:g+"px",display:g>c-6&&g<c+d-6?"":P}))})},renderTitle:function(){var a=this.padding,b=this.options.title,c=0;if(b.text){if(!this.title)this.title=this.chart.renderer.label(b.text,a-3,a-4,null,null,null,null,null,"legend-title").attr({zIndex:1}).css(b.style).add(this.group);a=this.title.getBBox();c=a.height;this.offsetWidth=a.width;this.contentGroup.attr({translateY:c})}this.titleHeight=
+c},renderItem:function(a){var b=this.chart,c=b.renderer,d=this.options,e=d.layout==="horizontal",f=this.symbolWidth,g=d.symbolPadding,h=this.itemStyle,i=this.itemHiddenStyle,j=this.padding,k=e?p(d.itemDistance,20):0,l=!d.rtl,m=d.width,n=d.itemMarginBottom||0,o=this.itemMarginTop,q=this.initialItemX,r=a.legendItem,s=a.series&&a.series.drawLegendSymbol?a.series:a,D=s.options,D=this.createCheckboxForItem&&D&&D.showCheckbox,t=d.useHTML;if(!r){a.legendGroup=c.g("legend-item").attr({zIndex:1}).add(this.scrollGroup);
+a.legendItem=r=c.text(d.labelFormat?Ia(d.labelFormat,a):d.labelFormatter.call(a),l?f+g:-g,this.baseline||0,t).css(w(a.visible?h:i)).attr({align:l?"left":"right",zIndex:2}).add(a.legendGroup);if(!this.baseline)this.baseline=c.fontMetrics(h.fontSize,r).f+3+o,r.attr("y",this.baseline);s.drawLegendSymbol(this,a);this.setItemEvents&&this.setItemEvents(a,r,t,h,i);this.colorizeItem(a,a.visible);D&&this.createCheckboxForItem(a)}c=r.getBBox();f=a.checkboxOffset=d.itemWidth||a.legendItemWidth||f+g+c.width+
+k+(D?20:0);this.itemHeight=g=v(a.legendItemHeight||c.height);if(e&&this.itemX-q+f>(m||b.chartWidth-2*j-q-d.x))this.itemX=q,this.itemY+=o+this.lastLineHeight+n,this.lastLineHeight=0;this.maxItemWidth=u(this.maxItemWidth,f);this.lastItemY=o+this.itemY+n;this.lastLineHeight=u(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];e?this.itemX+=f:(this.itemY+=o+g+n,this.lastLineHeight=g);this.offsetWidth=m||u((e?this.itemX-q-k:f)+j,this.offsetWidth)},getAllItems:function(){var a=[];q(this.chart.series,
+function(b){var c=b.options;if(p(c.showInLegend,!s(c.linkedTo)?t:!1,!0))a=a.concat(b.legendItems||(c.legendType==="point"?b.data:b))});return a},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();
+e=a.getAllItems();nb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;q(e,function(b){a.renderItem(b)});g=j.width||a.offsetWidth;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h);if(l||m){g+=k;h+=k;if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp({width:g,height:h})),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor,"stroke-width":l||
+0,fill:m||P}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;q(e,function(b){a.positionItem(b)});f&&d.align(r({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h,i=this.clipRect,j=e.navigation,k=p(j.animation,!0),l=j.arrowSize||12,m=this.nav,n=this.pages,o,r=this.allItems;
+e.layout==="horizontal"&&(f/=2);g&&(f=C(f,g));n.length=0;if(a>f&&!e.useHTML){this.clipHeight=h=u(f-20-this.titleHeight-this.padding,0);this.currentPage=p(this.currentPage,1);this.fullHeight=a;q(r,function(a,b){var c=a._legendItemPos[1],d=v(a.legendItem.getBBox().height),e=n.length;if(!e||c-n[e-1]>h&&(o||c)!==n[e-1])n.push(o||c),e++;b===r.length-1&&c+d-n[e-1]>h&&n.push(c);c!==o&&(o=c)});if(!i)i=b.clipRect=d.clipRect(0,this.padding,9999,0),b.contentGroup.clip(i);i.attr({height:h});if(!m)this.nav=m=
+d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,l,l).on("click",function(){b.scroll(-1,k)}).add(m),this.pager=d.text("",15,10).css(j.style).add(m),this.down=d.symbol("triangle-down",0,0,l,l).on("click",function(){b.scroll(1,k)}).add(m);b.scroll(0);a=f}else if(m)i.attr({height:c.chartHeight}),m.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pages,d=c.length,e=this.currentPage+a,f=this.clipHeight,g=this.options.navigation,
+h=g.activeColor,g=g.inactiveColor,i=this.pager,j=this.padding;e>d&&(e=d);if(e>0)b!==t&&Qa(b,this.chart),this.nav.attr({translateX:j,translateY:f+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:e===1?g:h}).css({cursor:e===1?"default":"pointer"}),i.attr({text:e+"/"+d}),this.down.attr({x:18+this.pager.getBBox().width,fill:e===d?g:h}).css({cursor:e===d?"default":"pointer"}),c=-c[e-1]+this.initialItemY,this.scrollGroup.animate({translateY:c}),this.currentPage=e,this.positionCheckboxes(c)}};
+M=S.LegendSymbolMixin={drawRectangle:function(a,b){var c=a.options.symbolHeight||12;b.legendSymbol=this.chart.renderer.rect(0,a.baseline-5-c/2,a.symbolWidth,c,a.options.symbolRadius||0).attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,c=b.marker,d;d=a.symbolWidth;var e=this.chart.renderer,f=this.legendGroup,a=a.baseline-v(e.fontMetrics(a.options.itemStyle.fontSize,this.legendItem).b*0.3),g;if(b.lineWidth){g={"stroke-width":b.lineWidth};if(b.dashStyle)g.dashstyle=
+b.dashStyle;this.legendLine=e.path(["M",0,a,"L",d,a]).attr(g).add(f)}if(c&&c.enabled!==!1)b=c.radius,this.legendSymbol=d=e.symbol(this.symbol,d/2-b,a-b,2*b,2*b).add(f),d.isMarker=!0}};(/Trident\/7\.0/.test(wa)||Ta)&&Ma(kb.prototype,"positionItem",function(a,b){var c=this,d=function(){b._legendItemPos&&a.call(c,b)};d();setTimeout(d)});Xa.prototype={init:function(a,b){var c,d=a.series;a.series=null;c=w(L,a);c.series=a.series=d;this.userOptions=a;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=
+this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=W.length;W.push(f);$a++;d.reflow!==!1&&N(f,"load",function(){f.initReflow()});if(e)for(g in e)N(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=ga?!1:p(d.animation,!0);f.pointCount=f.colorCounter=f.symbolCounter=0;f.firstRender()},initSeries:function(a){var b=this.options.chart;(b=J[a.type||b.type||b.defaultSeriesType])||
+oa(17,!0);b=new b;b.init(this,a);return b},isInsidePlot:function(a,b,c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&q(this.axes,function(a){a.adjustTickAmount()});this.maxTicks=null},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.hasCartesianSeries,j=this.isDirtyBox,k=c.length,l=k,m=this.renderer,n=m.isHidden(),o=[];Qa(a,this);n&&this.cloneRenderTo();
+for(this.layOutTitles();l--;)if(a=c[l],a.options.stacking&&(g=!0,a.isDirty)){h=!0;break}if(h)for(l=k;l--;)if(a=c[l],a.options.stacking)a.isDirty=!0;q(c,function(a){a.isDirty&&a.options.legendType==="point"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(i){if(!this.isResizing)this.maxTicks=null,q(b,function(a){a.setScale()});this.adjustTickAmounts()}this.getMargins();i&&(q(b,function(a){a.isDirty&&(j=!0)}),q(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=
+!1,o.push(function(){K(a,"afterSetExtremes",r(a.eventArgs,a.getExtremes()));delete a.eventArgs});(j||g)&&a.redraw()}));j&&this.drawChartBox();q(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset(!0);m.draw();K(this,"redraw");n&&this.cloneRenderTo(!0);q(o,function(a){a.call()})},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id===a)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=
+c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis=ra(b.xAxis||{}),b=b.yAxis=ra(b.yAxis||{});q(c,function(a,b){a.index=b;a.isX=!0});q(b,function(a,b){a.index=b});c=c.concat(b);q(c,function(b){new ma(a,b)});a.adjustTickAmounts()},getSelectedPoints:function(){var a=[];q(this.series,function(b){a=a.concat(vb(b.points||[],function(a){return a.selected}))});return a},getSelectedSeries:function(){return vb(this.series,function(a){return a.selected})},
+getStacks:function(){var a=this;q(a.yAxis,function(a){if(a.stacks&&a.hasVisibleSeries)a.oldStacks=a.stacks});q(a.series,function(b){if(b.options.stacking&&(b.visible===!0||a.options.chart.ignoreHiddenSeries===!1))b.stackKey=b.type+p(b.options.stack,"")})},setTitle:function(a,b,c){var g;var d=this,e=d.options,f;f=e.title=w(e.title,a);g=e.subtitle=w(e.subtitle,b),e=g;q([["title",a,f],["subtitle",b,e]],function(a){var b=a[0],c=d[b],e=a[1],a=a[2];c&&e&&(d[b]=c=c.destroy());a&&a.text&&!c&&(d[b]=d.renderer.text(a.text,
+0,0,a.useHTML).attr({align:a.align,"class":"highcharts-"+b,zIndex:a.zIndex||4}).css(a.style).add())});d.layOutTitles(c)},layOutTitles:function(a){var b=0,c=this.title,d=this.subtitle,e=this.options,f=e.title,e=e.subtitle,g=this.renderer,h=this.spacingBox.width-44;if(c&&(c.css({width:(f.width||h)+"px"}).align(r({y:g.fontMetrics(f.style.fontSize,c).b-3},f),!1,"spacingBox"),!f.floating&&!f.verticalAlign))b=c.getBBox().height;d&&(d.css({width:(e.width||h)+"px"}).align(r({y:b+(f.margin-13)+g.fontMetrics(f.style.fontSize,
+d).b},e),!1,"spacingBox"),!e.floating&&!e.verticalAlign&&(b=Ka(b+d.getBBox().height)));c=this.titleOffset!==b;this.titleOffset=b;if(!this.isDirtyBox&&c)this.isDirtyBox=c,this.hasRendered&&p(a,!0)&&this.isDirtyBox&&this.redraw()},getChartSize:function(){var a=this.options.chart,b=a.width,a=a.height,c=this.renderToClone||this.renderTo;if(!s(b))this.containerWidth=hb(c,"width");if(!s(a))this.containerHeight=hb(c,"height");this.chartWidth=u(0,b||this.containerWidth||600);this.chartHeight=u(0,p(a,this.containerHeight>
+19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Pa(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),A(b,{position:"absolute",top:"-9999px",display:"block"}),b.style.setProperty&&b.style.setProperty("display","block","important"),x.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,
+c,d,e;this.renderTo=a=b.renderTo;e="highcharts-"+tb++;if(Fa(a))this.renderTo=a=x.getElementById(a);a||oa(13,!0);c=z(F(a,"data-highcharts-chart"));!isNaN(c)&&W[c]&&W[c].hasRendered&&W[c].destroy();F(a,"data-highcharts-chart",this.index);a.innerHTML="";!b.skipClone&&!a.offsetWidth&&this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight;this.container=a=$(Ja,{className:"highcharts-container"+(b.className?" "+b.className:""),id:e},r({position:"relative",overflow:"hidden",width:c+
+"px",height:d+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},b.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=b.forExport?new ta(a,c,d,b.style,!0):new Ya(a,c,d,b.style);ga&&this.renderer.create(this,a,c,d)},getMargins:function(){var a=this.spacing,b,c=this.legend,d=this.margin,e=this.options.legend,f=p(e.margin,20),g=e.x,h=e.y,i=e.align,j=e.verticalAlign,k=this.titleOffset;this.resetMargins();b=this.axisOffset;if(k&&!s(d[0]))this.plotTop=
+u(this.plotTop,k+this.options.title.margin+a[0]);if(c.display&&!e.floating)if(i==="right"){if(!s(d[1]))this.marginRight=u(this.marginRight,c.legendWidth-g+f+a[1])}else if(i==="left"){if(!s(d[3]))this.plotLeft=u(this.plotLeft,c.legendWidth+g+f+a[3])}else if(j==="top"){if(!s(d[0]))this.plotTop=u(this.plotTop,c.legendHeight+h+f+a[0])}else if(j==="bottom"&&!s(d[2]))this.marginBottom=u(this.marginBottom,c.legendHeight-h+f+a[2]);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&
+(this.plotTop+=this.extraTopMargin);this.hasCartesianSeries&&q(this.axes,function(a){a.getOffset()});s(d[3])||(this.plotLeft+=b[3]);s(d[0])||(this.plotTop+=b[0]);s(d[2])||(this.marginBottom+=b[2]);s(d[1])||(this.marginRight+=b[1]);this.setChartSize()},reflow:function(a){var b=this,c=b.options.chart,d=b.renderTo,e=c.width||hb(d,"width"),f=c.height||hb(d,"height"),c=a?a.target:H,d=function(){if(b.container)b.setSize(e,f,!1),b.hasUserSize=null};if(!b.hasUserSize&&e&&f&&(c===H||c===x)){if(e!==b.containerWidth||
+f!==b.containerHeight)clearTimeout(b.reflowTimeout),a?b.reflowTimeout=setTimeout(d,100):d();b.containerWidth=e;b.containerHeight=f}},initReflow:function(){var a=this,b=function(b){a.reflow(b)};N(H,"resize",b);N(a,"destroy",function(){X(H,"resize",b)})},setSize:function(a,b,c){var d=this,e,f,g;d.isResizing+=1;g=function(){d&&K(d,"endResize",null,function(){d.isResizing-=1})};Qa(c,d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;if(s(a))d.chartWidth=e=u(0,v(a)),d.hasUserSize=!!e;if(s(b))d.chartHeight=
+f=u(0,v(b));(va?ib:A)(d.container,{width:e+"px",height:f+"px"},va);d.setChartSize(!0);d.renderer.setSize(e,f,c);d.maxTicks=null;q(d.axes,function(a){a.isDirty=!0;a.setScale()});q(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.layOutTitles();d.getMargins();d.redraw(c);d.oldChartHeight=null;K(d,"resize");va===!1?g():setTimeout(g,va&&va.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,
+h=this.clipOffset,i,j,k,l;this.plotLeft=i=v(this.plotLeft);this.plotTop=j=v(this.plotTop);this.plotWidth=k=u(0,v(d-i-this.marginRight));this.plotHeight=l=u(0,v(e-j-this.marginBottom));this.plotSizeX=b?l:k;this.plotSizeY=b?k:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:l};d=2*U(this.plotBorderWidth/2);b=Ka(u(d,h[3])/2);c=Ka(u(d,h[0])/2);this.clipBox={x:b,y:c,width:U(this.plotSizeX-
+u(d,h[1])/2-b),height:u(0,U(this.plotSizeY-u(d,h[2])/2-c))};a||q(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this.spacing,b=this.margin;this.plotTop=p(b[0],a[0]);this.marginRight=p(b[1],a[1]);this.marginBottom=p(b[2],a[2]);this.plotLeft=p(b[3],a[3]);this.axisOffset=[0,0,0,0];this.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=
+this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,n,o=this.plotLeft,p=this.plotTop,q=this.plotWidth,r=this.plotHeight,u=this.plotBox,s=this.clipRect,v=this.clipBox;n=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp({width:c-n,height:d-n}));else{e={fill:j||P};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=b.rect(n/2,n/2,c-n,d-n,a.borderRadius,i).attr(e).addClass("highcharts-background").add().shadow(a.shadow)}if(k)f?
+f.animate(u):this.plotBackground=b.rect(o,p,q,r,0).attr({fill:k}).add().shadow(a.plotShadow);if(l)h?h.animate(u):this.plotBGImage=b.image(l,o,p,q,r).add();s?s.animate({width:v.width,height:v.height}):this.clipRect=b.clipRect(v);if(m)g?g.animate(g.crisp({x:o,y:p,width:q,height:r})):this.plotBorder=b.rect(o,p,q,r,0,-m).attr({stroke:a.plotBorderColor,"stroke-width":m,fill:P,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,e,f;q(["inverted",
+"angular","polar"],function(g){c=J[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=J[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;q(b,function(a){a.linkedSeries.length=0});q(b,function(b){var d=b.options.linkedTo;if(Fa(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d})},renderSeries:function(){q(this.series,function(a){a.translate();a.setTooltipPoints&&a.setTooltipPoints();
+a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&q(b.items,function(c){var d=r(b.style,c.style),e=z(d.left)+a.plotLeft,f=z(d.top)+a.plotTop+12;delete d.left;delete d.top;a.renderer.text(c.html,e,f).attr({zIndex:2}).css(d).add()})},render:function(){var a=this.axes,b=this.renderer,c=this.options;this.setTitle();this.legend=new kb(this,c.legend);this.getStacks();q(a,function(a){a.setScale()});this.getMargins();this.maxTicks=null;q(a,function(a){a.setTickPositions(!0);a.setMaxTicks()});
+this.adjustTickAmounts();this.getMargins();this.drawChartBox();this.hasCartesianSeries&&q(a,function(a){a.render()});if(!this.seriesGroup)this.seriesGroup=b.g("series-group").attr({zIndex:3}).add();this.renderSeries();this.renderLabels();this.showCredits(c.credits);this.hasRendered=!0},showCredits:function(a){if(a.enabled&&!this.credits)this.credits=this.renderer.text(a.text,0,0).on("click",function(){if(a.href)location.href=a.href}).attr({align:a.position.align,zIndex:8}).css(a.style).add().align(a.position)},
+destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;K(a,"destroy");W[a.index]=t;$a--;a.renderTo.removeAttribute("data-highcharts-chart");X(a);for(e=b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();q("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML=
+"",X(d),f&&Pa(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!ba&&H==H.top&&x.readyState!=="complete"||ga&&!H.canvg?(ga?Lb.push(function(){a.firstRender()},a.options.global.canvasToolsURL):x.attachEvent("onreadystatechange",function(){x.detachEvent("onreadystatechange",a.firstRender);x.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender()){a.getContainer();K(a,"init");a.resetMargins();a.setChartSize();
+a.propFromSeries();a.getAxes();q(b.series||[],function(b){a.initSeries(b)});a.linkSeries();K(a,"beforeRender");if(S.Pointer)a.pointer=new Va(a,b);a.render();a.renderer.draw();c&&c.apply(a,[a]);q(a.callbacks,function(b){b.apply(a,[a])});a.cloneRenderTo(!0);K(a,"load")}},splashArray:function(a,b){var c=b[a],c=da(c)?c:[c,c,c,c];return[p(b[a+"Top"],c[0]),p(b[a+"Right"],c[1]),p(b[a+"Bottom"],c[2]),p(b[a+"Left"],c[3])]}};Xa.prototype.callbacks=[];Z=S.CenteredSeriesMixin={getCenter:function(){var a=this.options,
+b=this.chart,c=2*(a.slicedOffset||0),d,e=b.plotWidth-2*c,f=b.plotHeight-2*c,b=a.center,a=[p(b[0],"50%"),p(b[1],"50%"),a.size||"100%",a.innerSize||0],g=C(e,f),h;return Ua(a,function(a,b){h=/%$/.test(a);d=b<2||b===2&&h;return(h?[e,f,g,g][b]*z(a)/100:a)+(d?c:0)})}};var Ea=function(){};Ea.prototype={init:function(a,b,c){this.series=a;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===
+b.length))a.colorCounter=0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.options.pointValKey||c.pointValKey,a=Ea.prototype.optionsToObject.call(this,a);r(this,a);this.options=this.options?r(this.options,a):a;if(d)this.y=this[d];if(this.x===t&&c)this.x=b===t?c.autoIncrement():b;return this},optionsToObject:function(a){var b={},c=this.series,d=c.pointArrayMap||["y"],e=d.length,f=0,g=0;if(typeof a==="number"||a===null)b[d[0]]=a;else if(La(a)){if(a.length>e){c=typeof a[0];
+if(c==="string")b.name=a[0];else if(c==="number")b.x=a[0];f++}for(;g<e;)b[d[g++]]=a[f++]}else if(typeof a==="object"){b=a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}return b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),ka(b,this),!b.length))a.hoverPoints=null;if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)X(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=
+null},destroyElements:function(){for(var a="graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup".split(","),b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var b=this.series,c=b.tooltipOptions,d=p(c.valueDecimals,""),e=c.valuePrefix||"",f=c.valueSuffix||"";q(b.pointArrayMap||
+["y"],function(b){b="{point."+b;if(e||f)a=a.replace(b+"}",e+b+"}"+f);a=a.replace(b+"}",b+":,."+d+"f}")});return Ia(a,{point:this,series:this.series})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a==="click"&&e.allowPointSelect&&(c=function(a){d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});K(this,a,b,c)}};var O=function(){};O.prototype={isCartesian:!0,type:"line",pointClass:Ea,sorted:!0,
+requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor",r:"radius"},axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],init:function(a,b){var c=this,d,e,f=a.series,g=function(a,b){return p(a.options.index,a._i)-p(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();r(c,{name:b.name,state:"",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if(ga)b.animation=!1;e=b.events;for(d in e)N(c,
+d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();q(c.parallelArrays,function(a){c[a+"Data"]=[]});c.setData(b.data,!1);if(c.isCartesian)a.hasCartesianSeries=!0;f.push(c);c._i=f.length-1;nb(f,g);this.yAxis&&nb(this.yAxis.series,g);q(f,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;q(a.axisTypes||[],function(e){q(c[e],function(c){d=c.options;if(b[e]===
+d.index||b[e]!==t&&b[e]===d.id||b[e]===t&&d.index===0)c.series.push(a),a[e]=c,c.isDirty=!0});!a[e]&&a.optionalAxis!==e&&oa(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,d=arguments;q(c.parallelArrays,typeof b==="number"?function(d){var f=d==="y"&&c.toYData?c.toYData(a):a[d];c[d+"Data"][b]=f}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(d,2))})},autoIncrement:function(){var a=this.options,b=this.xIncrement,b=p(b,a.pointStart,0);this.pointInterval=p(this.pointInterval,
+a.pointInterval,1);this.xIncrement=b+this.pointInterval;return b},getSegments:function(){var a=-1,b=[],c,d=this.points,e=d.length;if(e)if(this.options.connectNulls){for(c=e;c--;)d[c].y===null&&d.splice(c,1);d.length&&(b=[d])}else q(d,function(c,g){c.y===null?(g>a+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions=a;c=w(e,c.series,
+a);this.tooltipOptions=w(L.tooltip,L.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);e.marker===null&&delete c.marker;return c},getCyclic:function(a,b,c){var d=this.userOptions,e="_"+a+"Index",f=a+"Counter";b||(s(d[e])?b=d[e]:(d[e]=b=this.chart[f]%c.length,this.chart[f]+=1),b=c[b]);this[a]=b},getColor:function(){this.options.colorByPoint||this.getCyclic("color",this.options.color||ca[this.type].color,this.chart.options.colors)},getSymbol:function(){var a=
+this.options.marker;this.getCyclic("symbol",a.symbol,this.chart.options.symbols);if(/^url/.test(this.symbol))a.radius=0},drawLegendSymbol:M.drawLineMarker,setData:function(a,b,c,d){var e=this,f=e.points,g=f&&f.length||0,h,i=e.options,j=e.chart,k=null,l=e.xAxis,m=l&&!!l.categories,n=e.tooltipPoints,o=i.turboThreshold,r=this.xData,u=this.yData,s=(h=e.pointArrayMap)&&h.length,a=a||[];h=a.length;b=p(b,!0);if(d!==!1&&h&&g===h&&!e.cropped&&!e.hasGroupedData)q(a,function(a,b){f[b].update(a,!1)});else{e.xIncrement=
+null;e.pointRange=m?1:i.pointRange;e.colorCounter=0;q(this.parallelArrays,function(a){e[a+"Data"].length=0});if(o&&h>o){for(c=0;k===null&&c<h;)k=a[c],c++;if(ia(k)){m=p(i.pointStart,0);i=p(i.pointInterval,1);for(c=0;c<h;c++)r[c]=m,u[c]=a[c],m+=i;e.xIncrement=m}else if(La(k))if(s)for(c=0;c<h;c++)i=a[c],r[c]=i[0],u[c]=i.slice(1,s+1);else for(c=0;c<h;c++)i=a[c],r[c]=i[0],u[c]=i[1];else oa(12)}else for(c=0;c<h;c++)if(a[c]!==t&&(i={series:e},e.pointClass.prototype.applyOptions.apply(i,[a[c]]),e.updateParallelArrays(i,
+c),m&&i.name))l.names[i.x]=i.name;Fa(u[0])&&oa(14,!0);e.data=[];e.options.data=a;for(c=g;c--;)f[c]&&f[c].destroy&&f[c].destroy();if(n)n.length=0;if(l)l.minRange=l.userMinRange;e.isDirty=e.isDirtyData=j.isDirtyBox=!0;c=!1}b&&j.redraw(c)},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e;e=0;var f,g,h=this.xAxis,i=this.options,j=i.cropThreshold,k=0,l=this.isCartesian,m,n;if(l&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!a)return!1;if(l&&this.sorted&&(!j||d>j||this.forceCrop))if(m=
+h.getExtremes(),n=m.min,m=m.max,b[d-1]<n||b[0]>m)b=[],c=[];else if(b[0]<n||b[d-1]>m)e=this.cropData(this.xData,this.yData,n,m),b=e.xData,c=e.yData,e=e.start,f=!0,k=b.length;for(a=b.length-1;a>=0;a--)d=b[a]-b[a-1],!f&&b[a]>n&&b[a]<m&&k++,d>0&&(g===t||d<g)?g=d:d<0&&this.requireSorting&&oa(15);this.cropped=f;this.cropStart=e;this.processedXData=b;this.processedYData=c;this.activePointCount=k;if(i.pointRange===null)this.pointRange=g||1;this.closestPointRange=g},cropData:function(a,b,c,d){var e=a.length,
+f=0,g=e,h=p(this.cropShoulder,1),i;for(i=0;i<e;i++)if(a[i]>=c){f=u(0,i-h);break}for(;i<e;i++)if(a[i]>d){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(m=0;m<g;m++)i=h+m,j?l[m]=(new f).init(this,[d[m]].concat(ra(e[m]))):(b[i]?k=b[i]:a[i]!==
+t&&(b[i]=k=(new f).init(this,a[i],d[m])),l[m]=k);if(b&&(g!==(c=b.length)||j))for(m=0;m<c;m++)if(m===h&&!j&&(m+=g),b[m])b[m].destroyElements(),b[m].plotX=t;this.data=b;this.points=l},getExtremes:function(a){var b=this.yAxis,c=this.processedXData,d,e=[],f=0;d=this.xAxis.getExtremes();var g=d.min,h=d.max,i,j,k,l,a=a||this.stackedYData||this.processedYData;d=a.length;for(l=0;l<d;l++)if(j=c[l],k=a[l],i=k!==null&&k!==t&&(!b.isLog||k.length||k>0),j=this.getExtremesFromAll||this.cropped||(c[l+1]||j)>=g&&
+(c[l-1]||j)<=h,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=p(void 0,Na(e));this.dataMax=p(void 0,Ba(e))},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i==="between"||ia(i),k=a.threshold,a=0;a<g;a++){var l=f[a],m=l.x,n=l.y,o=l.low,q=b&&e.stacks[(this.negStacks&&n<k?"-":"")+this.stackKey];
+if(e.isLog&&n<=0)l.y=n=null;l.plotX=c.translate(m,0,0,0,1,i,this.type==="flags");if(b&&this.visible&&q&&q[m])q=q[m],n=q.points[this.index+","+a],o=n[0],n=n[1],o===0&&(o=p(k,e.min)),e.isLog&&o<=0&&(o=null),l.total=l.stackTotal=q.total,l.percentage=q.total&&l.y/q.total*100,l.stackY=n,q.setOffset(this.pointXOffset||0,this.barW||0);l.yBottom=s(o)?e.translate(o,0,1,0,1):null;h&&(n=this.modifyValue(n,l));l.plotY=typeof n==="number"&&n!==Infinity?e.translate(n,0,1,0,1):t;l.clientX=j?c.translate(m,0,0,0,
+1):l.plotX;l.negative=l.y<(k||0);l.category=d&&d[l.x]!==t?d[l.x]:l.x}this.getSegments()},animate:function(a){var b=this.chart,c=b.renderer,d;d=this.options.animation;var e=this.clipBox||b.clipBox,f=b.inverted,g;if(d&&!da(d))d=ca[this.type].animation;g=["_sharedClip",d.duration,d.easing,e.height].join(",");a?(a=b[g],d=b[g+"m"],a||(b[g]=a=c.clipRect(r(e,{width:0})),b[g+"m"]=d=c.clipRect(-99,f?-b.plotLeft:-b.plotTop,99,f?b.chartWidth:b.chartHeight)),this.group.clip(a),this.markerGroup.clip(d),this.sharedClipKey=
+g):((a=b[g])&&a.animate({width:b.plotSizeX},d),b[g+"m"]&&b[g+"m"].animate({width:b.plotSizeX+99},d),this.animate=null)},afterAnimate:function(){var a=this.chart,b=this.sharedClipKey,c=this.group,d=this.clipBox;if(c&&this.options.clip!==!1){if(!b||!d)c.clip(d?a.renderer.clipRect(d):a.clipRect);this.markerGroup.clip()}K(this,"afterAnimate");setTimeout(function(){b&&a[b]&&(d||(a[b]=a[b].destroy()),a[b+"m"]&&(a[b+"m"]=a[b+"m"].destroy()))},100)},drawPoints:function(){var a,b=this.points,c=this.chart,
+d,e,f,g,h,i,j,k;d=this.options.marker;var l=this.pointAttr[""],m,n=this.markerGroup,o=p(d.enabled,this.activePointCount<0.5*this.xAxis.len/d.radius);if(d.enabled!==!1||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=U(g.plotX),e=g.plotY,k=g.graphic,i=g.marker||{},a=o&&i.enabled===t||i.enabled,m=c.isInsidePlot(v(d),e,c.inverted),a&&e!==t&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""]||l,h=a.r,i=p(i.symbol,this.symbol),j=i.indexOf("url")===0,k)k[m?"show":"hide"](!0).animate(r({x:d-
+h,y:e-h},k.symbolName?{width:2*h,height:2*h}:{}));else{if(m&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(n)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=p(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=ca[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color;f={stroke:g,fill:g};var h=a.points||[],i,j=[],k,l=a.pointAttrToOptions;
+k=a.hasPointSpecificOptions;var m=b.negativeColor,n=c.lineColor,o=c.fillColor;i=b.turboThreshold;var p;b.marker?(e.radius=e.radius||c.radius+e.radiusPlus,e.lineWidth=e.lineWidth||c.lineWidth+e.lineWidthPlus):e.color=e.color||ya(e.color||g).brighten(e.brightness).get();j[""]=a.convertAttribs(c,f);q(["hover","select"],function(b){j[b]=a.convertAttribs(d[b],j[""])});a.pointAttr=j;g=h.length;if(!i||g<i||k)for(;g--;){i=h[g];if((c=i.options&&i.options.marker||i.options)&&c.enabled===!1)c.radius=0;if(i.negative&&
+m)i.color=i.fillColor=m;k=b.colorByPoint||i.color;if(i.options)for(p in l)s(c[l[p]])&&(k=!0);if(k){c=c||{};k=[];d=c.states||{};f=d.hover=d.hover||{};if(!b.marker)f.color=f.color||!i.options.color&&e.color||ya(i.color).brighten(f.brightness||e.brightness).get();f={color:i.color};if(!o)f.fillColor=i.color;if(!n)f.lineColor=i.color;k[""]=a.convertAttribs(r(f,c),j[""]);k.hover=a.convertAttribs(d.hover,j.hover,k[""]);k.select=a.convertAttribs(d.select,j.select,k[""])}else k=j;i.pointAttr=k}},destroy:function(){var a=
+this,b=a.chart,c=/AppleWebKit\/533/.test(wa),d,e,f=a.data||[],g,h,i;K(a,"destroy");X(a);q(a.axisTypes||[],function(b){if(i=a[b])ka(i.series,a),i.isDirty=i.forceRedraw=!0});a.legendItem&&a.chart.legend.destroyItem(a);for(e=f.length;e--;)(g=f[e])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);q("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","),function(b){a[b]&&(d=c&&b==="group"?"hide":"destroy",a[b][d]())});if(b.hoverSeries===
+a)b.hoverSeries=null;ka(b.series,a);for(h in a)delete a[h]},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;q(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?"L":"M"),d&&f&&(i=a[f-1],d==="right"?c.push(i.plotX,h):d==="center"?c.push((i.plotX+g)/2,i.plotY,(i.plotX+g)/2,h):c.push(g,i.plotY)),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];q(a.segments,function(e){c=a.getSegmentPath(e);e.length>
+1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color]],d=b.lineWidth,e=b.dashStyle,f=b.linecap!=="square",g=this.getGraphPath(),h=b.negativeColor;h&&c.push(["graphNeg",h]);q(c,function(c,h){var k=c[0],l=a[k];if(l)ab(l),l.animate({d:g});else if(d&&g.length)l={stroke:c[1],"stroke-width":d,fill:P,zIndex:1},e?l.dashstyle=e:f&&(l["stroke-linecap"]=l["stroke-linejoin"]="round"),a[k]=a.chart.renderer.path(g).attr(l).add(a.group).shadow(!h&&
+b.shadow)})},clipNeg:function(){var a=this.options,b=this.chart,c=b.renderer,d=a.negativeColor||a.negativeFillColor,e,f=this.graph,g=this.area,h=this.posClip,i=this.negClip;e=b.chartWidth;var j=b.chartHeight,k=u(e,j),l=this.yAxis;if(d&&(f||g)){d=v(l.toPixels(a.threshold||0,!0));d<0&&(k-=d);a={x:0,y:0,width:k,height:d};k={x:0,y:d,width:k,height:k};if(b.inverted)a.height=k.y=b.plotWidth-d,c.isVML&&(a={x:b.plotWidth-d-b.plotLeft,y:0,width:e,height:j},k={x:d+b.plotLeft-e,y:0,width:b.plotLeft+d,height:e});
+l.reversed?(b=k,e=a):(b=a,e=k);h?(h.animate(b),i.animate(e)):(this.posClip=h=c.clipRect(b),this.negClip=i=c.clipRect(e),f&&this.graphNeg&&(f.clip(h),this.graphNeg.clip(i)),g&&(g.clip(h),this.areaNeg.clip(i)))}},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};q(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)N(c,"resize",a),N(b,"destroy",function(){X(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,
+e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e));f[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;if(a.inverted)b=c,c=this.xAxis;return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=(c=d.animation)&&!!a.animate&&b.renderer.isSVG&&p(c.duration,500)||0,f=a.visible?"visible":"hidden",g=d.zIndex,
+h=a.hasRendered,i=b.seriesGroup;c=a.plotGroup("group","series",f,g,i);a.markerGroup=a.plotGroup("markerGroup","markers",f,g,i);e&&a.animate(!0);a.getAttribs();c.inverted=a.isCartesian?b.inverted:!1;a.drawGraph&&(a.drawGraph(),a.clipNeg());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&a.options.enableMouseTracking!==!1&&a.drawTracker();b.inverted&&a.invertGroups();d.clip!==!1&&!a.sharedClipKey&&!h&&c.clip(b.clipRect);e&&a.animate();if(!h)e?a.animationTimeout=setTimeout(function(){a.afterAnimate()},
+e):a.afterAnimate();a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:p(d&&d.left,a.plotLeft),translateY:p(e&&e.top,a.plotTop)}));this.translate();this.setTooltipPoints&&this.setTooltipPoints(!0);this.render();b&&K(this,"updatedData")}};Fb.prototype={destroy:function(){Oa(this,this.axis)},render:function(a){var b=this.options,
+c=b.format,c=c?Ia(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,null,null,b.useHTML).css(b.style).attr({align:this.textAlign,rotation:b.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=this.isNegative,g=c.translate(c.usePercentage?100:this.total,0,0,0,1),c=c.translate(0),c=Q(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-
+c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e[this.options.crop===!1||d.isInsidePlot(f.x,f.y)?"show":"hide"](!0)}};ma.prototype.buildStacks=function(){var a=this.series,b=p(this.options.reversedStacks,!0),c=a.length;if(!this.isXAxis){for(this.usePercentage=!1;c--;)a[b?c:a.length-c-1].setStackedPoints();if(this.usePercentage)for(c=0;c<a.length;c++)a[c].setPercentStacks()}};ma.prototype.renderStackTotals=function(){var a=this.chart,b=a.renderer,c=
+this.stacks,d,e,f=this.stackTotalGroup;if(!f)this.stackTotalGroup=f=b.g("stack-labels").attr({visibility:"visible",zIndex:6}).add();f.translate(a.plotLeft,a.plotTop);for(d in c)for(e in a=c[d],a)a[e].render(f)};O.prototype.setStackedPoints=function(){if(this.options.stacking&&!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var a=this.processedXData,b=this.processedYData,c=[],d=b.length,e=this.options,f=e.threshold,g=e.stack,e=e.stacking,h=this.stackKey,i="-"+h,j=this.negStacks,
+k=this.yAxis,l=k.stacks,m=k.oldStacks,n,o,p,q,r,s;for(q=0;q<d;q++){r=a[q];s=b[q];p=this.index+","+q;o=(n=j&&s<f)?i:h;l[o]||(l[o]={});if(!l[o][r])m[o]&&m[o][r]?(l[o][r]=m[o][r],l[o][r].total=null):l[o][r]=new Fb(k,k.options.stackLabels,n,r,g);o=l[o][r];o.points[p]=[o.cum||0];e==="percent"?(n=n?h:i,j&&l[n]&&l[n][r]?(n=l[n][r],o.total=n.total=u(n.total,o.total)+Q(s)||0):o.total=ea(o.total+(Q(s)||0))):o.total=ea(o.total+(s||0));o.cum=(o.cum||0)+(s||0);o.points[p].push(o.cum);c[q]=o.cum}if(e==="percent")k.usePercentage=
+!0;this.stackedYData=c;k.oldStacks={}}};O.prototype.setPercentStacks=function(){var a=this,b=a.stackKey,c=a.yAxis.stacks,d=a.processedXData;q([b,"-"+b],function(b){var e;for(var f=d.length,g,h;f--;)if(g=d[f],e=(h=c[b]&&c[b][g])&&h.points[a.index+","+f],g=e)h=h.total?100/h.total:0,g[0]=ea(g[0]*h),g[1]=ea(g[1]*h),a.stackedYData[f]=g[1]})};r(Xa.prototype,{addSeries:function(a,b,c){var d,e=this;a&&(b=p(b,!0),K(e,"addSeries",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&
+e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?"xAxis":"yAxis",f=this.options;new ma(this,w(a,{index:this[e].length,isX:b}));f[e]=ra(f[e]||{});f[e].push(a);p(c,!0)&&this.redraw(d)},showLoading:function(a){var b=this,c=b.options,d=b.loadingDiv,e=c.loading,f=function(){d&&A(d,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+"px",height:b.plotHeight+"px"})};if(!d)b.loadingDiv=d=$(Ja,{className:"highcharts-loading"},r(e.style,{zIndex:10,display:P}),b.container),b.loadingSpan=$("span",
+null,e.labelStyle,d),N(b,"redraw",f);b.loadingSpan.innerHTML=a||c.lang.loading;if(!b.loadingShown)A(d,{opacity:0,display:""}),ib(d,{opacity:e.style.opacity},{duration:e.showDuration||0}),b.loadingShown=!0;f()},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&ib(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){A(b,{display:P})}});this.loadingShown=!1}});r(Ea.prototype,{update:function(a,b,c){var d=this,e=d.series,f=d.graphic,g,h=e.data,i=e.chart,j=e.options,b=p(b,
+!0);d.firePointEvent("update",{options:a},function(){d.applyOptions(a);if(da(a)){e.getAttribs();if(f)a&&a.marker&&a.marker.symbol?d.graphic=f.destroy():f.attr(d.pointAttr[d.state||""]);if(a&&a.dataLabels&&d.dataLabel)d.dataLabel=d.dataLabel.destroy()}g=Da(d,h);e.updateParallelArrays(d,g);j.data[g]=d.options;e.isDirty=e.isDirtyData=!0;if(!e.fixedBox&&e.hasCartesianSeries)i.isDirtyBox=!0;j.legendType==="point"&&i.legend.destroyItem(d);b&&i.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.points,
+f=d.chart,g,h=d.data;Qa(b,f);a=p(a,!0);c.firePointEvent("remove",null,function(){g=Da(c,h);h.length===e.length&&e.splice(g,1);h.splice(g,1);d.options.data.splice(g,1);d.updateParallelArrays(c,"splice",g,1);c.destroy();d.isDirty=!0;d.isDirtyData=!0;a&&f.redraw()})}});r(O.prototype,{addPoint:function(a,b,c,d){var e=this.options,f=this.data,g=this.graph,h=this.area,i=this.chart,j=this.xAxis&&this.xAxis.names,k=g&&g.shift||0,l=e.data,m,n=this.xData;Qa(d,i);c&&q([g,h,this.graphNeg,this.areaNeg],function(a){if(a)a.shift=
+k+1});if(h)h.isArea=!0;b=p(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);g=d.x;h=n.length;if(this.requireSorting&&g<n[h-1])for(m=!0;h&&n[h-1]>g;)h--;this.updateParallelArrays(d,"splice",h,0,0);this.updateParallelArrays(d,h);if(j)j[g]=d.name;l.splice(h,0,a);m&&(this.data.splice(h,0,null),this.processData());e.legendType==="point"&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(d,"shift"),l.shift()));this.isDirtyData=this.isDirty=
+!0;b&&(this.getAttribs(),i.redraw())},remove:function(a,b){var c=this,d=c.chart,a=p(a,!0);if(!c.isRemoving)c.isRemoving=!0,K(c,"remove",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)});c.isRemoving=!1},update:function(a,b){var c=this,d=this.chart,e=this.userOptions,f=this.type,g=J[f].prototype,h=["group","markerGroup","dataLabelsGroup"],i;q(h,function(a){h[a]=c[a];delete c[a]});a=w(e,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},
+a);this.remove(!1);for(i in g)g.hasOwnProperty(i)&&(this[i]=t);r(this,J[a.type||f].prototype);q(h,function(a){c[a]=h[a]});this.init(d,a);d.linkSeries();p(b,!0)&&d.redraw(!1)}});r(ma.prototype,{update:function(a,b){var c=this.chart,a=c.options[this.coll][this.options.index]=w(this.userOptions,a);this.destroy(!0);this._addedPlotLB=t;this.init(c,r(a,{events:t}));c.isDirtyBox=!0;p(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);
+ka(b.axes,this);ka(b[c],this);b.options[c].splice(this.options.index,1);q(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;p(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}});ha=la(O);J.line=ha;ca.area=w(T,{threshold:0});var qa=la(O,{type:"area",getSegments:function(){var a=this,b=[],c=[],d=[],e=this.xAxis,f=this.yAxis,g=f.stacks[this.stackKey],h={},i,j,k=this.points,l=this.options.connectNulls,m,n;
+if(this.options.stacking&&!this.cropped){for(m=0;m<k.length;m++)h[k[m].x]=k[m];for(n in g)g[n].total!==null&&d.push(+n);d.sort(function(a,b){return a-b});q(d,function(b){var d=0,k;if(!l||h[b]&&h[b].y!==null)if(h[b])c.push(h[b]);else{for(m=a.index;m<=f.series.length;m++)if(k=g[b].points[m+","+b]){d=k[1];break}i=e.translate(b);j=f.toPixels(d,!0);c.push({y:null,plotX:i,clientX:i,plotY:j,yBottom:j,onMouseOver:sa})}});c.length&&b.push(c)}else O.prototype.getSegments.call(this),b=this.segments;this.segments=
+b},getSegmentPath:function(a){var b=O.prototype.getSegmentPath.call(this,a),c=[].concat(b),d,e=this.options;d=b.length;var f=this.yAxis.getThreshold(e.threshold),g;d===3&&c.push("L",b[1],b[2]);if(e.stacking&&!this.closedStacks)for(d=a.length-1;d>=0;d--)g=p(a[d].yBottom,f),d<a.length-1&&e.step&&c.push(a[d+1].plotX,g),c.push(a[d].plotX,g);else this.closeSegment(c,a,f);this.areaPath=this.areaPath.concat(c);return b},closeSegment:function(a,b,c){a.push("L",b[b.length-1].plotX,c,"L",b[0].plotX,c)},drawGraph:function(){this.areaPath=
+[];O.prototype.drawGraph.apply(this);var a=this,b=this.areaPath,c=this.options,d=c.negativeColor,e=c.negativeFillColor,f=[["area",this.color,c.fillColor]];(d||e)&&f.push(["areaNeg",d,e]);q(f,function(d){var e=d[0],f=a[e];f?f.animate({d:b}):a[e]=a.chart.renderer.path(b).attr({fill:p(d[2],ya(d[1]).setOpacity(p(c.fillOpacity,0.75)).get()),zIndex:0}).add(a.group)})},drawLegendSymbol:M.drawRectangle});J.area=qa;ca.spline=w(T);ha=la(O,{type:"spline",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,
+f=a[c-1],g=a[c+1],h,i,j,k;if(f&&g){a=f.plotY;j=g.plotX;var g=g.plotY,l;h=(1.5*d+f.plotX)/2.5;i=(1.5*e+a)/2.5;j=(1.5*d+j)/2.5;k=(1.5*e+g)/2.5;l=(k-i)*(j-d)/(j-h)+e-k;i+=l;k+=l;i>a&&i>e?(i=u(a,e),k=2*e-i):i<a&&i<e&&(i=C(a,e),k=2*e-i);k>g&&k>e?(k=u(g,e),i=2*e-k):k<g&&k<e&&(k=C(g,e),i=2*e-k);b.rightContX=j;b.rightContY=k}c?(b=["C",f.rightContX||f.plotX,f.rightContY||f.plotY,h||d,i||e,d,e],f.rightContX=f.rightContY=null):b=["M",d,e];return b}});J.spline=ha;ca.areaspline=w(ca.area);qa=qa.prototype;ha=la(ha,
+{type:"areaspline",closedStacks:!0,getSegmentPath:qa.getSegmentPath,closeSegment:qa.closeSegment,drawGraph:qa.drawGraph,drawLegendSymbol:M.drawRectangle});J.areaspline=ha;ca.column=w(T,{borderColor:"#FFFFFF",borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1,halo:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},stickyTracking:!1,tooltip:{distance:6},
+threshold:0});ha=la(O,{type:"column",pointAttrToOptions:{stroke:"borderColor",fill:"color",r:"borderRadius"},cropShoulder:0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){O.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&q(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},getColumnMetrics:function(){var a=this,b=a.options,c=a.xAxis,d=a.yAxis,e=c.reversed,f,g={},h,i=0;b.grouping===!1?i=1:q(a.chart.series,function(b){var c=b.options,e=b.yAxis;if(b.type===
+a.type&&b.visible&&d.len===e.len&&d.pos===e.pos)c.stacking?(f=b.stackKey,g[f]===t&&(g[f]=i++),h=g[f]):c.grouping!==!1&&(h=i++),b.columnIndex=h});var c=C(Q(c.transA)*(c.ordinalSlope||b.pointRange||c.closestPointRange||c.tickInterval||1),c.len),j=c*b.groupPadding,k=(c-2*j)/i,l=b.pointWidth,b=s(l)?(k-l)/2:k*b.pointPadding,l=p(l,k-2*b);return a.columnMetrics={width:l,offset:b+(j+((e?i-(a.columnIndex||0):a.columnIndex)||0)*k-c/2)*(e?-1:1)}},translate:function(){var a=this,b=a.chart,c=a.options,d=a.borderWidth=
+p(c.borderWidth,a.activePointCount>0.5*a.xAxis.len?0:1),e=a.yAxis,f=a.translatedThreshold=e.getThreshold(c.threshold),g=p(c.minPointLength,5),h=a.getColumnMetrics(),i=h.width,j=a.barW=u(i,1+2*d),k=a.pointXOffset=h.offset,l=-(d%2?0.5:0),m=d%2?0.5:1;b.renderer.isVML&&b.inverted&&(m+=1);c.pointPadding&&(j=Ka(j));O.prototype.translate.apply(a);q(a.points,function(c){var d=p(c.yBottom,f),h=C(u(-999-d,c.plotY),e.len+999+d),q=c.plotX+k,r=j,s=C(h,d),t;t=u(h,d)-s;Q(t)<g&&g&&(t=g,s=v(Q(s-f)>g?d-g:f-(e.translate(c.y,
+0,1,0,1)<=f?g:0)));c.barX=q;c.pointWidth=i;c.tooltipPos=b.inverted?[e.len-h,a.xAxis.len-q-r/2]:[q+r/2,h];r=v(q+r)+l;q=v(q)+l;r-=q;d=Q(s)<0.5;t=v(s+t)+m;s=v(s)+m;t-=s;d&&(s-=1,t+=1);c.shapeType="rect";c.shapeArgs={x:q,y:s,width:r,height:t}})},getSymbol:sa,drawLegendSymbol:M.drawRectangle,drawGraph:sa,drawPoints:function(){var a=this,b=this.chart,c=a.options,d=b.renderer,e=c.animationLimit||250,f,g;q(a.points,function(h){var i=h.plotY,j=h.graphic;if(i!==t&&!isNaN(i)&&h.y!==null)f=h.shapeArgs,i=s(a.borderWidth)?
+{"stroke-width":a.borderWidth}:{},g=h.pointAttr[h.selected?"select":""]||a.pointAttr[""],j?(ab(j),j.attr(i)[b.pointCount<e?"animate":"attr"](w(f))):h.graphic=d[h.shapeType](f).attr(g).attr(i).add(a.group).shadow(c.shadow,null,c.stacking&&!c.borderRadius);else if(j)h.graphic=j.destroy()})},animate:function(a){var b=this.yAxis,c=this.options,d=this.chart.inverted,e={};if(ba)a?(e.scaleY=0.001,a=C(b.pos+b.len,u(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):
+(e.scaleY=1,e[d?"translateX":"translateY"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&q(b.series,function(b){if(b.type===a.type)b.isDirty=!0});O.prototype.remove.apply(a,arguments)}});J.column=ha;ca.bar=w(ca.column);qa=la(ha,{type:"bar",inverted:!0});J.bar=qa;ca.scatter=w(T,{lineWidth:0,tooltip:{headerFormat:'<span style="color:{series.color}">●</span> <span style="font-size: 10px;"> {series.name}</span><br/>',pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"},
+stickyTracking:!1});qa=la(O,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1,singularTooltips:!0,drawGraph:function(){this.options.lineWidth&&O.prototype.drawGraph.call(this)}});J.scatter=qa;ca.pie=w(T,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,
+showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});T={type:"pie",isCartesian:!1,pointClass:la(Ea,{init:function(){Ea.prototype.init.apply(this,arguments);var a=this,b;if(a.y<0)a.y=null;r(a,{visible:a.visible!==!1,name:p(a.name,"Slice")});b=function(b){a.slice(b.type==="select")};N(a,"select",b);N(a,"unselect",b);return a},setVisible:function(a){var b=this,c=b.series,d=c.chart;b.visible=b.options.visible=a=a===t?!b.visible:a;c.options.data[Da(b,
+c.data)]=b.options;q(["graphic","dataLabel","connector","shadowGroup"],function(c){if(b[c])b[c][a?"show":"hide"](!0)});b.legendItem&&d.legend.colorizeItem(b,a);if(!c.isDirty&&c.options.ignoreHiddenPoint)c.isDirty=!0,d.redraw()},slice:function(a,b,c){var d=this.series;Qa(c,d.chart);p(b,!0);this.sliced=this.options.sliced=a=s(a)?a:!this.sliced;d.options.data[Da(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},
+haloPath:function(a){var b=this.shapeArgs,c=this.series.chart;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.plotLeft+b.x,c.plotTop+b.y,b.r+a,b.r+a,{innerR:this.shapeArgs.r,start:b.start,end:b.end})}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},singularTooltips:!0,getColor:sa,animate:function(a){var b=this,c=b.points,d=b.startAngleRad;
+if(!a)q(c,function(a){var c=a.graphic,a=a.shapeArgs;c&&(c.attr({r:b.center[3]/2,start:d,end:d}),c.animate({r:a.r,start:a.start,end:a.end},b.options.animation))}),b.animate=null},setData:function(a,b,c,d){O.prototype.setData.call(this,a,!1,c,d);this.processData();this.generatePoints();p(b,!0)&&this.chart.redraw(c)},generatePoints:function(){var a,b=0,c,d,e,f=this.options.ignoreHiddenPoint;O.prototype.generatePoints.call(this);c=this.points;d=c.length;for(a=0;a<d;a++)e=c[a],b+=f&&!e.visible?0:e.y;this.total=
+b;for(a=0;a<d;a++)e=c[a],e.percentage=b>0?e.y/b*100:0,e.total=b},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=na/180*(i-90),i=(this.endAngleRad=na/180*(p(c.endAngle,i+360)-90))-j,k=this.points,l=c.dataLabels.distance,c=c.ignoreHiddenPoint,m,n=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=V.asin(C((b-a[1])/(a[2]/2+l),1));return a[0]+(c?-1:1)*aa(h)*(a[2]/2+l)};for(m=0;m<
+n;m++){o=k[m];f=j+b*i;if(!c||o.visible)b+=o.percentage/100;g=j+b*i;o.shapeType="arc";o.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:v(f*1E3)/1E3,end:v(g*1E3)/1E3};h=(g+f)/2;h>1.5*na?h-=2*na:h<-na/2&&(h+=2*na);o.slicedTranslation={translateX:v(aa(h)*d),translateY:v(fa(h)*d)};f=aa(h)*a[2]/2;g=fa(h)*a[2]/2;o.tooltipPos=[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-na/2||h>na/2?1:0;o.angle=h;e=C(e,l/2);o.labelPos=[a[0]+f+aa(h)*l,a[1]+g+fa(h)*l,a[0]+f+aa(h)*e,a[1]+g+fa(h)*e,a[0]+f,a[1]+g,l<0?"center":o.half?
+"right":"left",h]}},drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);q(a.points,function(h){d=h.graphic;g=h.shapeArgs;f=h.shadowGroup;if(e&&!f)f=h.shadowGroup=b.g("shadow").add(a.shadowGroup);c=h.sliced?h.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);d?d.animate(r(g,c)):h.graphic=d=b[h.shapeType](g).setRadialReference(a.center).attr(h.pointAttr[h.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(c).add(a.group).shadow(e,
+f);h.visible!==void 0&&h.setVisible(h.visible)})},sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawLegendSymbol:M.drawRectangle,getCenter:Z.getCenter,getSymbol:sa};T=la(O,T);J.pie=T;O.prototype.drawDataLabels=function(){var a=this,b=a.options,c=b.cursor,d=b.dataLabels,e=a.points,f,g,h,i;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(d),i=a.plotGroup("dataLabelsGroup","data-labels",d.defer?"hidden":"visible",d.zIndex||6),!a.hasRendered&&
+p(d.defer,!0)&&(i.attr({opacity:0}),N(a,"afterAnimate",function(){a.visible&&i.show();i[b.animation?"animate":"attr"]({opacity:1},{duration:200})})),g=d,q(e,function(b){var e,l=b.dataLabel,m,n,o=b.connector,q=!0;f=b.options&&b.options.dataLabels;e=p(f&&f.enabled,g.enabled);if(l&&!e)b.dataLabel=l.destroy();else if(e){d=w(g,f);e=d.rotation;m=b.getLabelConfig();h=d.format?Ia(d.format,m):d.formatter.call(m,d);d.style.color=p(d.color,d.style.color,a.color,"black");if(l)if(s(h))l.attr({text:h}),q=!1;else{if(b.dataLabel=
+l=l.destroy(),o)b.connector=o.destroy()}else if(s(h)){l={fill:d.backgroundColor,stroke:d.borderColor,"stroke-width":d.borderWidth,r:d.borderRadius||0,rotation:e,padding:d.padding,zIndex:1};for(n in l)l[n]===t&&delete l[n];l=b.dataLabel=a.chart.renderer[e?"text":"label"](h,0,-999,null,null,null,d.useHTML).attr(l).css(r(d.style,c&&{cursor:c})).add(i).shadow(d.shadow)}l&&a.alignDataLabel(b,l,d,null,q)}})};O.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=p(a.plotX,-999),
+i=p(a.plotY,-999),j=b.getBBox();if(a=this.visible&&(a.series.forceDL||f.isInsidePlot(h,v(i),g)||d&&f.isInsidePlot(h,g?d.x+1:d.y+d.height-1,g)))d=r({x:g?f.plotWidth-i:h,y:v(g?f.plotHeight-h:i),width:0,height:0},d),r(c,{width:j.width,height:j.height}),c.rotation?b[e?"attr":"animate"]({x:d.x+c.x+d.width/2,y:d.y+c.y+d.height/2}).attr({align:c.align}):(b.align(c,null,d),g=b.alignAttr,p(c.overflow,"justify")==="justify"?this.justifyDataLabel(b,c,g,j,d,e):p(c.crop,!0)&&(a=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+
+j.width,g.y+j.height)));if(!a)b.attr({y:-999}),b.placed=!1};O.prototype.justifyDataLabel=function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k;j=c.x;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0;j=c.y;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height;if(j>g.plotHeight)i==="top"?b.verticalAlign="bottom":b.y=g.plotHeight-j,k=!0;if(k)a.placed=!f,a.align(b,null,e)};if(J.pie)J.pie.prototype.drawDataLabels=
+function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=p(e.connectorPadding,10),g=p(e.connectorWidth,1),h=d.plotWidth,i=d.plotHeight,j,k,l=p(e.softConnector,!0),m=e.distance,n=a.center,o=n[2]/2,r=n[1],s=m>0,t,w,x,z=[[],[]],B,A,K,J,y,R=[0,0,0,0],N=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){O.prototype.drawDataLabels.apply(a);q(b,function(a){a.dataLabel&&a.visible&&z[a.half].push(a)});for(J=2;J--;){var H=[],M=[],F=z[J],L=F.length,G;if(L){a.sortByAngle(F,
+J-0.5);for(y=b=0;!b&&F[y];)b=F[y]&&F[y].dataLabel&&(F[y].dataLabel.getBBox().height||21),y++;if(m>0){w=C(r+o+m,d.plotHeight);for(y=u(0,r-o-m);y<=w;y+=b)H.push(y);w=H.length;if(L>w){c=[].concat(F);c.sort(N);for(y=L;y--;)c[y].rank=y;for(y=L;y--;)F[y].rank>=w&&F.splice(y,1);L=F.length}for(y=0;y<L;y++){c=F[y];x=c.labelPos;c=9999;var S,P;for(P=0;P<w;P++)S=Q(H[P]-x[1]),S<c&&(c=S,G=P);if(G<y&&H[y]!==null)G=y;else for(w<L-y+G&&H[y]!==null&&(G=w-L+y);H[G]===null;)G++;M.push({i:G,y:H[G]});H[G]=null}M.sort(N)}for(y=
+0;y<L;y++){c=F[y];x=c.labelPos;t=c.dataLabel;K=c.visible===!1?"hidden":"visible";c=x[1];if(m>0){if(w=M.pop(),G=w.i,A=w.y,c>A&&H[G+1]!==null||c<A&&H[G-1]!==null)A=C(u(0,c),d.plotHeight)}else A=c;B=e.justify?n[0]+(J?-1:1)*(o+m):a.getX(A===r-o-m||A===r+o+m?c:A,J);t._attr={visibility:K,align:x[6]};t._pos={x:B+e.x+({left:f,right:-f}[x[6]]||0),y:A+e.y-10};t.connX=B;t.connY=A;if(this.options.size===null)w=t.width,B-w<f?R[3]=u(v(w-B+f),R[3]):B+w>h-f&&(R[1]=u(v(B+w-h+f),R[1])),A-b/2<0?R[0]=u(v(-A+b/2),R[0]):
+A+b/2>i&&(R[2]=u(v(A+b/2-i),R[2]))}}}if(Ba(R)===0||this.verifyDataLabelOverflow(R))this.placeDataLabels(),s&&g&&q(this.points,function(b){j=b.connector;x=b.labelPos;if((t=b.dataLabel)&&t._pos)K=t._attr.visibility,B=t.connX,A=t.connY,k=l?["M",B+(x[6]==="left"?5:-5),A,"C",B,A,2*x[2]-x[4],2*x[3]-x[5],x[2],x[3],"L",x[4],x[5]]:["M",B+(x[6]==="left"?5:-5),A,"L",x[2],x[3],"L",x[4],x[5]],j?(j.animate({d:k}),j.attr("visibility",K)):b.connector=j=a.chart.renderer.path(k).attr({"stroke-width":g,stroke:e.connectorColor||
+b.color||"#606060",visibility:K}).add(a.dataLabelsGroup);else if(j)b.connector=j.destroy()})}},J.pie.prototype.placeDataLabels=function(){q(this.points,function(a){var a=a.dataLabel,b;if(a)(b=a._pos)?(a.attr(a._attr),a[a.moved?"animate":"attr"](b),a.moved=!0):a&&a.attr({y:-999})})},J.pie.prototype.alignDataLabel=sa,J.pie.prototype.verifyDataLabelOverflow=function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize||80,f;d[0]!==null?e=u(b[2]-u(a[1],a[3]),c):(e=u(b[2]-a[1]-a[3],c),b[0]+=(a[3]-
+a[1])/2);d[1]!==null?e=u(C(e,b[2]-u(a[0],a[2])),c):(e=u(C(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);e<b[2]?(b[2]=e,this.translate(b),q(this.points,function(a){if(a.dataLabel)a.dataLabel._pos=null}),this.drawDataLabels&&this.drawDataLabels()):f=!0;return f};if(J.column)J.column.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=a.dlBox||a.shapeArgs,i=a.below||a.plotY>p(this.translatedThreshold,f.plotSizeY),j=p(c.inside,!!this.options.stacking);if(h&&(d=w(h),g&&(d={x:f.plotWidth-
+d.y-d.height,y:f.plotHeight-d.x-d.width,width:d.height,height:d.width}),!j))g?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=p(c.align,!g||j?"center":i?"right":"left");c.verticalAlign=p(c.verticalAlign,g||j?"middle":i?"top":"bottom");O.prototype.alignDataLabel.call(this,a,b,c,d,e)};T=S.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(c){var d=c.target,e;if(b.hoverSeries!==a)a.onMouseOver();for(;d&&!e;)e=d.point,
+d=d.parentNode;if(e!==t&&e!==b.hoverPoint)e.onMouseOver(c)};q(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)q(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),Za))a[b].on("touchstart",f)}),a._hasTracking=!0},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,
+f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,l=k&&{cursor:k},k=a.singlePoints,m,n=function(){if(f.hoverSeries!==a)a.onMouseOver()},o="rgba(192,192,192,"+(ba?1.0E-4:0.002)+")";if(e&&!c)for(m=e+1;m--;)d[m]==="M"&&d.splice(m+1,0,d[m+1]-i,d[m+2],"L"),(m&&d[m]==="M"||m===e)&&d.splice(m,0,"L",d[m-2]+i,d[m-1]);for(m=0;m<k.length;m++)e=k[m],d.push("M",e.plotX-i,e.plotY,"L",e.plotX+i,e.plotY);j?j.attr({d:d}):(a.tracker=h.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?
+"visible":"hidden",stroke:o,fill:c?o:P,"stroke-width":b.lineWidth+(c?0:2*i),zIndex:2}).add(a.group),q([a.tracker,a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover",n).on("mouseout",function(a){g.onTrackerMouseOut(a)}).css(l);if(Za)a.on("touchstart",n)}))}};if(J.column)ha.prototype.drawTracker=T.drawTrackerPoint;if(J.pie)J.pie.prototype.drawTracker=T.drawTrackerPoint;if(J.scatter)qa.prototype.drawTracker=T.drawTrackerPoint;r(kb.prototype,{setItemEvents:function(a,b,c,d,e){var f=
+this;(c?b:a.legendGroup).on("mouseover",function(){a.setState("hover");b.css(f.options.itemHoverStyle)}).on("mouseout",function(){b.css(a.visible?d:e);a.setState()}).on("click",function(b){var c=function(){a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):K(a,"legendItemClick",b,c)})},createCheckboxForItem:function(a){a.checkbox=$("input",{type:"checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);N(a.checkbox,
+"click",function(b){K(a,"checkboxClick",{checked:b.target.checked},function(){a.select()})})}});L.legend.itemStyle.cursor="pointer";r(Xa.prototype,{showResetZoom:function(){var a=this,b=L.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo==="chart"?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,f)},zoomOut:function(){var a=this;
+K(a,"selection",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var b,c=this.pointer,d=!1,e;!a||a.resetSelection?q(this.axes,function(a){b=a.zoom()}):q(a.xAxis.concat(a.yAxis),function(a){var e=a.axis,h=e.isXAxis;if(c[h?"zoomX":"zoomY"]||c[h?"pinchX":"pinchY"])b=e.zoom(a.min,a.max),e.displayBtn&&(d=!0)});e=this.resetZoomButton;if(d&&!e)this.showResetZoom();else if(!d&&da(e))this.resetZoomButton=e.destroy();b&&this.redraw(p(this.options.chart.animation,a&&a.animation,this.pointCount<100))},
+pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&q(d,function(a){a.setState()});q(b==="xy"?[1,0]:[1],function(b){var d=a[b?"chartX":"chartY"],h=c[b?"xAxis":"yAxis"][0],i=c[b?"mouseDownX":"mouseDownY"],j=(h.pointRange||0)/2,k=h.getExtremes(),l=h.toValue(i-d,!0)+j,i=h.toValue(i+c[b?"plotWidth":"plotHeight"]-d,!0)-j;h.series.length&&l>C(k.dataMin,k.min)&&i<u(k.dataMax,k.max)&&(h.setExtremes(l,i,!1,!1,{trigger:"pan"}),e=!0);c[b?"mouseDownX":"mouseDownY"]=d});e&&c.redraw(!1);A(c.container,{cursor:"move"})}});
+r(Ea.prototype,{select:function(a,b){var c=this,d=c.series,e=d.chart,a=p(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[Da(c,d.data)]=c.options;c.setState(a&&"select");b||q(e.getSelectedPoints(),function(a){if(a.selected&&a!==c)a.selected=a.options.selected=!1,d.options.data[Da(a,d.data)]=a.options,a.setState(""),a.firePointEvent("unselect")})})},onMouseOver:function(a){var b=this.series,c=b.chart,d=c.tooltip,e=c.hoverPoint;
+if(e&&e!==this)e.onMouseOut();this.firePointEvent("mouseOver");d&&(!d.shared||b.noSharedTooltip)&&d.refresh(this,a);this.setState("hover");c.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints;this.firePointEvent("mouseOut");if(!b||Da(this,b)===-1)this.setState(),a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var a=w(this.series.options.point,this.options).events,b;this.events=a;for(b in a)N(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a,
+b){var c=this.plotX,d=this.plotY,e=this.series,f=e.options.states,g=ca[e.type].marker&&e.options.marker,h=g&&!g.enabled,i=g&&g.states[a],j=i&&i.enabled===!1,k=e.stateMarkerGraphic,l=this.marker||{},m=e.chart,n=e.halo,o,a=a||"";o=this.pointAttr[a]||e.pointAttr[a];if(!(a===this.state&&!b||this.selected&&a!=="select"||f[a]&&f[a].enabled===!1||a&&(j||h&&i.enabled===!1)||a&&l.states&&l.states[a]&&l.states[a].enabled===!1)){if(this.graphic)g=g&&this.graphic.symbolName&&o.r,this.graphic.attr(w(o,g?{x:c-
+g,y:d-g,width:2*g,height:2*g}:{})),k&&k.hide();else{if(a&&i)if(g=i.radius,l=l.symbol||e.symbol,k&&k.currentSymbol!==l&&(k=k.destroy()),k)k[b?"animate":"attr"]({x:c-g,y:d-g});else if(l)e.stateMarkerGraphic=k=m.renderer.symbol(l,c-g,d-g,2*g,2*g).attr(o).add(e.markerGroup),k.currentSymbol=l;if(k)k[a&&m.isInsidePlot(c,d,m.inverted)?"show":"hide"]()}if((c=f[a]&&f[a].halo)&&c.size){if(!n)e.halo=n=m.renderer.path().add(e.seriesGroup);n.attr(r({fill:ya(this.color||e.color).setOpacity(c.opacity).get()},c.attributes))[b?
+"animate":"attr"]({d:this.haloPath(c.size)})}else n&&n.attr({d:[]});this.state=a}},haloPath:function(a){var b=this.series,c=b.chart,d=b.getPlotBox(),e=c.inverted;return c.renderer.symbols.circle(d.translateX+(e?b.yAxis.len-this.plotY:this.plotX)-a,d.translateY+(e?b.xAxis.len-this.plotX:this.plotY)-a,a*2,a*2)}});r(O.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&K(this,"mouseOver");this.setState("hover");a.hoverSeries=
+this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;if(d)d.onMouseOut();this&&a.events.mouseOut&&K(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState();b.hoverSeries=null},setState:function(a){var b=this.options,c=this.graph,d=this.graphNeg,e=b.states,b=b.lineWidth,a=a||"";if(this.state!==a)this.state=a,e[a]&&e[a].enabled===!1||(a&&(b=e[a].lineWidth||b+(e[a].lineWidthPlus||0)),c&&!c.dashstyle&&(a={"stroke-width":b},c.attr(a),
+d&&d.attr(a)))},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===t?!h:a)?"show":"hide";q(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&q(d.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});q(c.linkedSeries,function(b){b.setVisible(a,!1)});if(g)d.isDirtyBox=
+!0;b!==!1&&d.redraw();K(c,f)},setTooltipPoints:function(a){var b=[],c,d,e=this.xAxis,f=e&&e.getExtremes(),g=e?e.tooltipLen||e.len:this.chart.plotSizeX,h,i,j=[];if(!(this.options.enableMouseTracking===!1||this.singularTooltips)){if(a)this.tooltipPoints=null;q(this.segments||this.points,function(a){b=b.concat(a)});e&&e.reversed&&(b=b.reverse());this.orderTooltipPoints&&this.orderTooltipPoints(b);a=b.length;for(i=0;i<a;i++)if(e=b[i],c=e.x,c>=f.min&&c<=f.max){h=b[i+1];c=d===t?0:d+1;for(d=b[i+1]?C(u(0,
+U((e.clientX+(h?h.wrappedClientX||h.clientX:g))/2)),g):g;c>=0&&c<=d;)j[c++]=e}this.tooltipPoints=j}},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===t?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;K(this,a?"select":"unselect")},drawTracker:T.drawTrackerGraph});r(S,{Axis:ma,Chart:Xa,Color:ya,Point:Ea,Tick:Sa,Renderer:Ya,Series:O,SVGElement:G,SVGRenderer:ta,arrayMin:Na,arrayMax:Ba,charts:W,dateFormat:bb,format:Ia,pathAnim:ub,
+getOptions:function(){return L},hasBidiBug:Nb,isTouchDevice:Hb,numberFormat:Ga,seriesTypes:J,setOptions:function(a){L=w(!0,L,a);Ab();return L},addEvent:N,removeEvent:X,createElement:$,discardElement:Pa,css:A,each:q,extend:r,map:Ua,merge:w,pick:p,splat:ra,extendClass:la,pInt:z,wrap:Ma,svg:ba,canvas:ga,vml:!ba&&!ga,product:"Highcharts",version:"4.0.3"})})();
+/*
+ Highcharts JS v4.0.3 (2014-07-03)
+
+ (c) 2009-2014 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(l,C){function K(a,b,c){this.init.call(this,a,b,c)}var P=l.arrayMin,Q=l.arrayMax,s=l.each,F=l.extend,q=l.merge,R=l.map,o=l.pick,x=l.pInt,p=l.getOptions().plotOptions,g=l.seriesTypes,v=l.extendClass,L=l.splat,r=l.wrap,M=l.Axis,y=l.Tick,H=l.Point,S=l.Pointer,T=l.CenteredSeriesMixin,z=l.TrackerMixin,t=l.Series,w=Math,D=w.round,A=w.floor,N=w.max,U=l.Color,u=function(){};F(K.prototype,{init:function(a,b,c){var d=this,e=d.defaultOptions;d.chart=b;if(b.angular)e.background={};d.options=a=q(e,a);
+(a=a.background)&&s([].concat(L(a)).reverse(),function(a){var b=a.backgroundColor,a=q(d.defaultBackgroundOptions,a);if(b)a.backgroundColor=b;a.color=a.backgroundColor;c.options.plotBands.unshift(a)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{shape:"circle",borderWidth:1,borderColor:"silver",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#FFF"],[1,"#DDD"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});
+var G=M.prototype,y=y.prototype,V={getOffset:u,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:u,setCategories:u,setTitle:u},O={isRadial:!0,defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},
+maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){a=this.options=q(this.defaultOptions,this.defaultRadialOptions,a);if(!a.plotBands)a.plotBands=[]},getOffset:function(){G.getOffset.call(this);this.chart.axisOffset[this.side]=0;this.center=this.pane.center=T.getCenter.call(this.pane)},getLinePath:function(a,b){var c=this.center,b=o(b,
+c[2]/2-this.offset);return this.chart.renderer.symbols.arc(this.left+c[0],this.top+c[1],b,b,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0})},setAxisTranslation:function(){G.setAxisTranslation.call(this);if(this.center)this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0},beforeSetTickPositions:function(){this.autoConnect&&(this.max+=this.categories&&
+1||this.pointRange||this.closestPointRange||0)},setAxisSize:function(){G.setAxisSize.call(this);if(this.isRadial){this.center=this.pane.center=l.CenteredSeriesMixin.getCenter.call(this.pane);if(this.isCircular)this.sector=this.endAngleRad-this.startAngleRad;this.len=this.width=this.height=this.center[2]*o(this.sector,1)/2}},getPosition:function(a,b){return this.postTranslate(this.isCircular?this.translate(a):0,o(this.isCircular?b:this.translate(a),this.center[2]/2)-this.offset)},postTranslate:function(a,
+b){var c=this.chart,d=this.center,a=this.startAngleRad+a;return{x:c.plotLeft+d[0]+Math.cos(a)*b,y:c.plotTop+d[1]+Math.sin(a)*b}},getPlotBandPath:function(a,b,c){var d=this.center,e=this.startAngleRad,f=d[2]/2,h=[o(c.outerRadius,"100%"),c.innerRadius,o(c.thickness,10)],j=/%$/,k,m=this.isCircular;this.options.gridLineInterpolation==="polygon"?d=this.getPlotLinePath(a).concat(this.getPlotLinePath(b,!0)):(m||(h[0]=this.translate(a),h[1]=this.translate(b)),h=R(h,function(a){j.test(a)&&(a=x(a,10)*f/100);
+return a}),c.shape==="circle"||!m?(a=-Math.PI/2,b=Math.PI*1.5,k=!0):(a=e+this.translate(a),b=e+this.translate(b)),d=this.chart.renderer.symbols.arc(this.left+d[0],this.top+d[1],h[0],h[0],{start:a,end:b,innerR:o(h[1],h[0]-h[2]),open:k}));return d},getPlotLinePath:function(a,b){var c=this,d=c.center,e=c.chart,f=c.getPosition(a),h,j,k;c.isCircular?k=["M",d[0]+e.plotLeft,d[1]+e.plotTop,"L",f.x,f.y]:c.options.gridLineInterpolation==="circle"?(a=c.translate(a))&&(k=c.getLinePath(0,a)):(s(e.xAxis,function(a){a.pane===
+c.pane&&(h=a)}),k=[],a=c.translate(a),d=h.tickPositions,h.autoConnect&&(d=d.concat([d[0]])),b&&(d=[].concat(d).reverse()),s(d,function(f,c){j=h.getPosition(f,a);k.push(c?"L":"M",j.x,j.y)}));return k},getTitlePosition:function(){var a=this.center,b=this.chart,c=this.options.title;return{x:b.plotLeft+a[0]+(c.x||0),y:b.plotTop+a[1]-{high:0.5,middle:0.25,low:0}[c.align]*a[2]+(c.y||0)}}};r(G,"init",function(a,b,c){var i;var d=b.angular,e=b.polar,f=c.isX,h=d&&f,j,k;k=b.options;var m=c.pane||0;if(d){if(F(this,
+h?V:O),j=!f)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else if(e)F(this,O),this.defaultRadialOptions=(j=f)?this.defaultRadialXOptions:q(this.defaultYAxisOptions,this.defaultRadialYOptions);a.call(this,b,c);if(!h&&(d||e)){a=this.options;if(!b.panes)b.panes=[];this.pane=(i=b.panes[m]=b.panes[m]||new K(L(k.pane)[m],b,this),m=i);m=m.options;b.inverted=!1;k.chart.zoomType=null;this.startAngleRad=b=(m.startAngle-90)*Math.PI/180;this.endAngleRad=k=(o(m.endAngle,m.startAngle+360)-90)*Math.PI/
+180;this.offset=a.offset||0;if((this.isCircular=j)&&c.max===C&&k-b===2*Math.PI)this.autoConnect=!0}});r(y,"getPosition",function(a,b,c,d,e){var f=this.axis;return f.getPosition?f.getPosition(c):a.call(this,b,c,d,e)});r(y,"getLabelPosition",function(a,b,c,d,e,f,h,j,k){var m=this.axis,i=f.y,n=f.align,g=(m.translate(this.pos)+m.startAngleRad+Math.PI/2)/Math.PI*180%360;m.isRadial?(a=m.getPosition(this.pos,m.center[2]/2+o(f.distance,-25)),f.rotation==="auto"?d.attr({rotation:g}):i===null&&(i=m.chart.renderer.fontMetrics(d.styles.fontSize).b-
+d.getBBox().height/2),n===null&&(n=m.isCircular?g>20&&g<160?"left":g>200&&g<340?"right":"center":"center",d.attr({align:n})),a.x+=f.x,a.y+=i):a=a.call(this,b,c,d,e,f,h,j,k);return a});r(y,"getMarkPath",function(a,b,c,d,e,f,h){var j=this.axis;j.isRadial?(a=j.getPosition(this.pos,j.center[2]/2+d),b=["M",b,c,"L",a.x,a.y]):b=a.call(this,b,c,d,e,f,h);return b});p.arearange=q(p.area,{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'<span style="color:{series.color}">●</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'},
+trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}});g.arearange=v(g.area,{type:"arearange",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",getSegments:function(){var a=this;s(a.points,function(b){if(!a.options.connectNulls&&(b.low===null||b.high===null))b.y=null;else if(b.low===null&&b.high!==null)b.y=b.high});t.prototype.getSegments.call(this)},translate:function(){var a=this.yAxis;g.area.prototype.translate.apply(this);
+s(this.points,function(b){var c=b.low,d=b.high,e=b.plotY;d===null&&c===null?b.y=null:c===null?(b.plotLow=b.plotY=null,b.plotHigh=a.translate(d,0,1,0,1)):d===null?(b.plotLow=e,b.plotHigh=null):(b.plotLow=e,b.plotHigh=a.translate(d,0,1,0,1))})},getSegmentPath:function(a){var b,c=[],d=a.length,e=t.prototype.getSegmentPath,f,h;h=this.options;var j=h.step;for(b=HighchartsAdapter.grep(a,function(a){return a.plotLow!==null});d--;)f=a[d],f.plotHigh!==null&&c.push({plotX:f.plotX,plotY:f.plotHigh});a=e.call(this,
+b);if(j)j===!0&&(j="left"),h.step={left:"right",center:"center",right:"left"}[j];c=e.call(this,c);h.step=j;h=[].concat(a,c);c[0]="L";this.areaPath=this.areaPath.concat(a,c);return h},drawDataLabels:function(){var a=this.data,b=a.length,c,d=[],e=t.prototype,f=this.options.dataLabels,h=f.align,j,k=this.chart.inverted;if(f.enabled||this._hasPointLabels){for(c=b;c--;)if(j=a[c],j.y=j.high,j._plotY=j.plotY,j.plotY=j.plotHigh,d[c]=j.dataLabel,j.dataLabel=j.dataLabelUpper,j.below=!1,k){if(!h)f.align="left";
+f.x=f.xHigh}else f.y=f.yHigh;e.drawDataLabels&&e.drawDataLabels.apply(this,arguments);for(c=b;c--;)if(j=a[c],j.dataLabelUpper=j.dataLabel,j.dataLabel=d[c],j.y=j.low,j.plotY=j._plotY,j.below=!0,k){if(!h)f.align="right";f.x=f.xLow}else f.y=f.yLow;e.drawDataLabels&&e.drawDataLabels.apply(this,arguments)}f.align=h},alignDataLabel:function(){g.column.prototype.alignDataLabel.apply(this,arguments)},getSymbol:u,drawPoints:u});p.areasplinerange=q(p.arearange);g.areasplinerange=v(g.arearange,{type:"areasplinerange",
+getPointSpline:g.spline.prototype.getPointSpline});(function(){var a=g.column.prototype;p.columnrange=q(p.column,p.arearange,{lineWidth:1,pointRange:null});g.columnrange=v(g.arearange,{type:"columnrange",translate:function(){var b=this,c=b.yAxis,d;a.translate.apply(b);s(b.points,function(a){var f=a.shapeArgs,h=b.options.minPointLength,j;a.tooltipPos=null;a.plotHigh=d=c.translate(a.high,0,1,0,1);a.plotLow=a.plotY;j=d;a=a.plotY-d;a<h&&(h-=a,a+=h,j-=h/2);f.height=a;f.y=j})},trackerGroups:["group","dataLabelsGroup"],
+drawGraph:u,pointAttrToOptions:a.pointAttrToOptions,drawPoints:a.drawPoints,drawTracker:a.drawTracker,animate:a.animate,getColumnMetrics:a.getColumnMetrics})})();p.gauge=q(p.line,{dataLabels:{enabled:!0,defer:!1,y:15,borderWidth:1,borderColor:"silver",borderRadius:3,crop:!1,style:{fontWeight:"bold"},verticalAlign:"top",zIndex:2},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1});z={type:"gauge",pointClass:v(H,{setState:function(a){this.state=a}}),angular:!0,drawGraph:u,fixedBox:!0,forceDL:!0,
+trackerGroups:["group","dataLabelsGroup"],translate:function(){var a=this.yAxis,b=this.options,c=a.center;this.generatePoints();s(this.points,function(d){var e=q(b.dial,d.dial),f=x(o(e.radius,80))*c[2]/200,h=x(o(e.baseLength,70))*f/100,j=x(o(e.rearLength,10))*f/100,k=e.baseWidth||3,m=e.topWidth||1,i=b.overshoot,n=a.startAngleRad+a.translate(d.y,null,null,null,!0);i&&typeof i==="number"?(i=i/180*Math.PI,n=Math.max(a.startAngleRad-i,Math.min(a.endAngleRad+i,n))):b.wrap===!1&&(n=Math.max(a.startAngleRad,
+Math.min(a.endAngleRad,n)));n=n*180/Math.PI;d.shapeType="path";d.shapeArgs={d:e.path||["M",-j,-k/2,"L",h,-k/2,f,-m/2,f,m/2,h,k/2,-j,k/2,"z"],translateX:c[0],translateY:c[1],rotation:n};d.plotX=c[0];d.plotY=c[1]})},drawPoints:function(){var a=this,b=a.yAxis.center,c=a.pivot,d=a.options,e=d.pivot,f=a.chart.renderer;s(a.points,function(c){var b=c.graphic,k=c.shapeArgs,e=k.d,i=q(d.dial,c.dial);b?(b.animate(k),k.d=e):c.graphic=f[c.shapeType](k).attr({stroke:i.borderColor||"none","stroke-width":i.borderWidth||
+0,fill:i.backgroundColor||"black",rotation:k.rotation}).add(a.group)});c?c.animate({translateX:b[0],translateY:b[1]}):a.pivot=f.circle(0,0,o(e.radius,5)).attr({"stroke-width":e.borderWidth||0,stroke:e.borderColor||"silver",fill:e.backgroundColor||"black"}).translate(b[0],b[1]).add(a.group)},animate:function(a){var b=this;if(!a)s(b.points,function(a){var d=a.graphic;d&&(d.attr({rotation:b.yAxis.startAngleRad*180/Math.PI}),d.animate({rotation:a.shapeArgs.rotation},b.options.animation))}),b.animate=
+null},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);t.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(a,b){t.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();o(b,!0)&&this.chart.redraw()},drawTracker:z&&z.drawTrackerPoint};g.gauge=v(g.line,z);p.boxplot=q(p.column,{fillColor:"#FFFFFF",lineWidth:1,medianWidth:2,states:{hover:{brightness:-0.3}},threshold:null,
+tooltip:{pointFormat:'<span style="color:{series.color}">●</span> <b> {series.name}</b><br/>Maximum: {point.high}<br/>Upper quartile: {point.q3}<br/>Median: {point.median}<br/>Lower quartile: {point.q1}<br/>Minimum: {point.low}<br/>'},whiskerLength:"50%",whiskerWidth:2});g.boxplot=v(g.column,{type:"boxplot",pointArrayMap:["low","q1","median","q3","high"],toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:"high",pointAttrToOptions:{fill:"fillColor",stroke:"color","stroke-width":"lineWidth"},
+drawDataLabels:u,translate:function(){var a=this.yAxis,b=this.pointArrayMap;g.column.prototype.translate.apply(this);s(this.points,function(c){s(b,function(b){c[b]!==null&&(c[b+"Plot"]=a.translate(c[b],0,1,0,1))})})},drawPoints:function(){var a=this,b=a.points,c=a.options,d=a.chart.renderer,e,f,h,j,k,m,i,n,g,l,p,I,r,q,J,u,v,t,w,x,z,y,E=a.doQuartiles!==!1,B=parseInt(a.options.whiskerLength,10)/100;s(b,function(b){g=b.graphic;z=b.shapeArgs;p={};q={};u={};y=b.color||a.color;if(b.plotY!==C)if(e=b.pointAttr[b.selected?
+"selected":""],v=z.width,t=A(z.x),w=t+v,x=D(v/2),f=A(E?b.q1Plot:b.lowPlot),h=A(E?b.q3Plot:b.lowPlot),j=A(b.highPlot),k=A(b.lowPlot),p.stroke=b.stemColor||c.stemColor||y,p["stroke-width"]=o(b.stemWidth,c.stemWidth,c.lineWidth),p.dashstyle=b.stemDashStyle||c.stemDashStyle,q.stroke=b.whiskerColor||c.whiskerColor||y,q["stroke-width"]=o(b.whiskerWidth,c.whiskerWidth,c.lineWidth),u.stroke=b.medianColor||c.medianColor||y,u["stroke-width"]=o(b.medianWidth,c.medianWidth,c.lineWidth),u["stroke-linecap"]="round",
+i=p["stroke-width"]%2/2,n=t+x+i,l=["M",n,h,"L",n,j,"M",n,f,"L",n,k],E&&(i=e["stroke-width"]%2/2,n=A(n)+i,f=A(f)+i,h=A(h)+i,t+=i,w+=i,I=["M",t,h,"L",t,f,"L",w,f,"L",w,h,"L",t,h,"z"]),B&&(i=q["stroke-width"]%2/2,j+=i,k+=i,r=["M",n-x*B,j,"L",n+x*B,j,"M",n-x*B,k,"L",n+x*B,k]),i=u["stroke-width"]%2/2,m=D(b.medianPlot)+i,J=["M",t,m,"L",w,m],g)b.stem.animate({d:l}),B&&b.whiskers.animate({d:r}),E&&b.box.animate({d:I}),b.medianShape.animate({d:J});else{b.graphic=g=d.g().add(a.group);b.stem=d.path(l).attr(p).add(g);
+if(B)b.whiskers=d.path(r).attr(q).add(g);if(E)b.box=d.path(I).attr(e).add(g);b.medianShape=d.path(J).attr(u).add(g)}})}});p.errorbar=q(p.boxplot,{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'<span style="color:{series.color}">●</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'},whiskerWidth:null});g.errorbar=v(g.boxplot,{type:"errorbar",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:g.arearange?
+g.arearange.prototype.drawDataLabels:u,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||g.column.prototype.getColumnMetrics.call(this)}});p.waterfall=q(p.column,{lineWidth:1,lineColor:"#333",dashStyle:"dot",borderColor:"#333",states:{hover:{lineWidthPlus:0}}});g.waterfall=v(g.column,{type:"waterfall",upColorProp:"fill",pointArrayMap:["low","y"],pointValKey:"y",init:function(a,b){b.stacking=!0;g.column.prototype.init.call(this,a,b)},translate:function(){var a=
+this.yAxis,b,c,d,e,f,h,j,k,m,i;b=this.options.threshold;g.column.prototype.translate.apply(this);k=m=b;d=this.points;for(c=0,b=d.length;c<b;c++){e=d[c];f=e.shapeArgs;h=this.getStack(c);i=h.points[this.index+","+c];if(isNaN(e.y))e.y=this.yData[c];j=N(k,k+e.y)+i[0];f.y=a.translate(j,0,1);e.isSum?(f.y=a.translate(i[1],0,1),f.height=a.translate(i[0],0,1)-f.y):e.isIntermediateSum?(f.y=a.translate(i[1],0,1),f.height=a.translate(m,0,1)-f.y,m=i[1]):k+=h.total;f.height<0&&(f.y+=f.height,f.height*=-1);e.plotY=
+f.y=D(f.y)-this.borderWidth%2/2;f.height=N(D(f.height),0.001);e.yBottom=f.y+f.height;f=e.plotY+(e.negative?f.height:0);this.chart.inverted?e.tooltipPos[0]=a.len-f:e.tooltipPos[1]=f}},processData:function(a){var b=this.yData,c=this.points,d,e=b.length,f,h,j,k,m,i;h=f=j=k=this.options.threshold||0;for(i=0;i<e;i++)m=b[i],d=c&&c[i]?c[i]:{},m==="sum"||d.isSum?b[i]=h:m==="intermediateSum"||d.isIntermediateSum?b[i]=f:(h+=m,f+=m),j=Math.min(h,j),k=Math.max(h,k);t.prototype.processData.call(this,a);this.dataMin=
+j;this.dataMax=k},toYData:function(a){if(a.isSum)return"sum";else if(a.isIntermediateSum)return"intermediateSum";return a.y},getAttribs:function(){g.column.prototype.getAttribs.apply(this,arguments);var a=this.options,b=a.states,c=a.upColor||this.color,a=l.Color(c).brighten(0.1).get(),d=q(this.pointAttr),e=this.upColorProp;d[""][e]=c;d.hover[e]=b.hover.upColor||a;d.select[e]=b.select.upColor||c;s(this.points,function(a){if(a.y>0&&!a.color)a.pointAttr=d,a.color=c})},getGraphPath:function(){var a=this.data,
+b=a.length,c=D(this.options.lineWidth+this.borderWidth)%2/2,d=[],e,f,h;for(h=1;h<b;h++)f=a[h].shapeArgs,e=a[h-1].shapeArgs,f=["M",e.x+e.width,e.y+c,"L",f.x,e.y+c],a[h-1].y<0&&(f[2]+=e.height,f[5]+=e.height),d=d.concat(f);return d},getExtremes:u,getStack:function(a){var b=this.yAxis.stacks,c=this.stackKey;this.processedYData[a]<this.options.threshold&&(c="-"+c);return b[c][a]},drawGraph:t.prototype.drawGraph});p.bubble=q(p.scatter,{dataLabels:{formatter:function(){return this.point.z},inside:!0,style:{color:"white",
+textShadow:"0px 0px 3px black"},verticalAlign:"middle"},marker:{lineColor:null,lineWidth:1},minSize:8,maxSize:"20%",states:{hover:{halo:{size:5}}},tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0});z=v(H,{haloPath:function(){return H.prototype.haloPath.call(this,this.shapeArgs.r+this.series.options.states.hover.halo.size)}});g.bubble=v(g.scatter,{type:"bubble",pointClass:z,pointArrayMap:["y","z"],parallelArrays:["x","y","z"],trackerGroups:["group","dataLabelsGroup"],
+bubblePadding:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor"},applyOpacity:function(a){var b=this.options.marker,c=o(b.fillOpacity,0.5),a=a||b.fillColor||this.color;c!==1&&(a=U(a).setOpacity(c).get("rgba"));return a},convertAttribs:function(){var a=t.prototype.convertAttribs.apply(this,arguments);a.fill=this.applyOpacity(a.fill);return a},getRadii:function(a,b,c,d){var e,f,h,j=this.zData,k=[],m=this.options.sizeBy!=="width";for(f=0,e=j.length;f<e;f++)h=b-a,h=
+h>0?(j[f]-a)/(b-a):0.5,m&&h>=0&&(h=Math.sqrt(h)),k.push(w.ceil(c+h*(d-c))/2);this.radii=k},animate:function(a){var b=this.options.animation;if(!a)s(this.points,function(a){var d=a.graphic,a=a.shapeArgs;d&&a&&(d.attr("r",1),d.animate({r:a.r},b))}),this.animate=null},translate:function(){var a,b=this.data,c,d,e=this.radii;g.scatter.prototype.translate.call(this);for(a=b.length;a--;)c=b[a],d=e?e[a]:0,c.negative=c.z<(this.options.zThreshold||0),d>=this.minPxSize/2?(c.shapeType="circle",c.shapeArgs={x:c.plotX,
+y:c.plotY,r:d},c.dlBox={x:c.plotX-d,y:c.plotY-d,width:2*d,height:2*d}):c.shapeArgs=c.plotY=c.dlBox=C},drawLegendSymbol:function(a,b){var c=x(a.itemStyle.fontSize)/2;b.legendSymbol=this.chart.renderer.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker=!0},drawPoints:g.column.prototype.drawPoints,alignDataLabel:g.column.prototype.alignDataLabel});M.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,d=0,e=b,f=this.isXAxis,h=f?"xData":"yData",j=this.min,
+k={},m=w.min(c.plotWidth,c.plotHeight),i=Number.MAX_VALUE,n=-Number.MAX_VALUE,g=this.max-j,l=b/g,p=[];this.tickPositions&&(s(this.series,function(b){var h=b.options;if(b.bubblePadding&&(b.visible||!c.options.chart.ignoreHiddenSeries))if(a.allowZoomOutside=!0,p.push(b),f)s(["minSize","maxSize"],function(a){var b=h[a],f=/%$/.test(b),b=x(b);k[a]=f?m*b/100:b}),b.minPxSize=k.minSize,b=b.zData,b.length&&(i=o(h.zMin,w.min(i,w.max(P(b),h.displayNegative===!1?h.zThreshold:-Number.MAX_VALUE))),n=o(h.zMax,w.max(n,
+Q(b))))}),s(p,function(a){var b=a[h],c=b.length,m;f&&a.getRadii(i,n,k.minSize,k.maxSize);if(g>0)for(;c--;)typeof b[c]==="number"&&(m=a.radii[c],d=Math.min((b[c]-j)*l-m,d),e=Math.max((b[c]-j)*l+m,e))}),p.length&&g>0&&o(this.options.min,this.userMin)===C&&o(this.options.max,this.userMax)===C&&(e-=b,l*=(b+d-e)/b,this.min+=d/l,this.max+=e/l))};(function(){function a(a,b,c){a.call(this,b,c);if(this.chart.polar)this.closeSegment=function(a){var b=this.xAxis.center;a.push("L",b[0],b[1])},this.closedStacks=
+!0}function b(a,b){var c=this.chart,d=this.options.animation,e=this.group,i=this.markerGroup,n=this.xAxis.center,g=c.plotLeft,l=c.plotTop;if(c.polar){if(c.renderer.isSVG)d===!0&&(d={}),b?(c={translateX:n[0]+g,translateY:n[1]+l,scaleX:0.001,scaleY:0.001},e.attr(c),i&&i.attr(c)):(c={translateX:g,translateY:l,scaleX:1,scaleY:1},e.animate(c,d),i&&i.animate(c,d),this.animate=null)}else a.call(this,b)}var c=t.prototype,d=S.prototype,e;c.toXY=function(a){var b,c=this.chart,d=a.plotX;b=a.plotY;a.rectPlotX=
+d;a.rectPlotY=b;d=(d/Math.PI*180+this.xAxis.pane.options.startAngle)%360;d<0&&(d+=360);a.clientX=d;b=this.xAxis.postTranslate(a.plotX,this.yAxis.len-b);a.plotX=a.polarPlotX=b.x-c.plotLeft;a.plotY=a.polarPlotY=b.y-c.plotTop};c.orderTooltipPoints=function(a){if(this.chart.polar&&(a.sort(function(a,b){return a.clientX-b.clientX}),a[0]))a[0].wrappedClientX=a[0].clientX+360,a.push(a[0])};g.area&&r(g.area.prototype,"init",a);g.areaspline&&r(g.areaspline.prototype,"init",a);g.spline&&r(g.spline.prototype,
+"getPointSpline",function(a,b,c,d){var e,i,n,g,l,p,o;if(this.chart.polar){e=c.plotX;i=c.plotY;a=b[d-1];n=b[d+1];this.connectEnds&&(a||(a=b[b.length-2]),n||(n=b[1]));if(a&&n)g=a.plotX,l=a.plotY,b=n.plotX,p=n.plotY,g=(1.5*e+g)/2.5,l=(1.5*i+l)/2.5,n=(1.5*e+b)/2.5,o=(1.5*i+p)/2.5,b=Math.sqrt(Math.pow(g-e,2)+Math.pow(l-i,2)),p=Math.sqrt(Math.pow(n-e,2)+Math.pow(o-i,2)),g=Math.atan2(l-i,g-e),l=Math.atan2(o-i,n-e),o=Math.PI/2+(g+l)/2,Math.abs(g-o)>Math.PI/2&&(o-=Math.PI),g=e+Math.cos(o)*b,l=i+Math.sin(o)*
+b,n=e+Math.cos(Math.PI+o)*p,o=i+Math.sin(Math.PI+o)*p,c.rightContX=n,c.rightContY=o;d?(c=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,g||e,l||i,e,i],a.rightContX=a.rightContY=null):c=["M",e,i]}else c=a.call(this,b,c,d);return c});r(c,"translate",function(a){a.call(this);if(this.chart.polar&&!this.preventPostTranslate)for(var a=this.points,b=a.length;b--;)this.toXY(a[b])});r(c,"getSegmentPath",function(a,b){var c=this.points;if(this.chart.polar&&this.options.connectEnds!==!1&&b[b.length-1]===c[c.length-
+1]&&c[0].y!==null)this.connectEnds=!0,b=[].concat(b,[c[0]]);return a.call(this,b)});r(c,"animate",b);r(c,"setTooltipPoints",function(a,b){this.chart.polar&&F(this.xAxis,{tooltipLen:360});return a.call(this,b)});if(g.column)e=g.column.prototype,r(e,"animate",b),r(e,"translate",function(a){var b=this.xAxis,c=this.yAxis.len,d=b.center,e=b.startAngleRad,i=this.chart.renderer,g,l;this.preventPostTranslate=!0;a.call(this);if(b.isRadial){b=this.points;for(l=b.length;l--;)g=b[l],a=g.barX+e,g.shapeType="path",
+g.shapeArgs={d:i.symbols.arc(d[0],d[1],c-g.plotY,null,{start:a,end:a+g.pointWidth,innerR:c-o(g.yBottom,c)})},this.toXY(g),g.tooltipPos=[g.plotX,g.plotY],g.ttBelow=g.plotY>d[1]}}),r(e,"alignDataLabel",function(a,b,d,e,g,i){if(this.chart.polar){a=b.rectPlotX/Math.PI*180;if(e.align===null)e.align=a>20&&a<160?"left":a>200&&a<340?"right":"center";if(e.verticalAlign===null)e.verticalAlign=a<45||a>315?"bottom":a>135&&a<225?"top":"middle";c.alignDataLabel.call(this,b,d,e,g,i)}else a.call(this,b,d,e,g,i)});
+r(d,"getIndex",function(a,b){var c,d=this.chart,e;d.polar?(e=d.xAxis[0].center,c=b.chartX-e[0]-d.plotLeft,d=b.chartY-e[1]-d.plotTop,c=180-Math.round(Math.atan2(c,d)/Math.PI*180)):c=a.call(this,b);return c});r(d,"getCoordinates",function(a,b){var c=this.chart,d={xAxis:[],yAxis:[]};c.polar?s(c.axes,function(a){var e=a.isXAxis,f=a.center,g=b.chartX-f[0]-c.plotLeft,f=b.chartY-f[1]-c.plotTop;d[e?"xAxis":"yAxis"].push({axis:a,value:a.translate(e?Math.PI-Math.atan2(g,f):Math.sqrt(Math.pow(g,2)+Math.pow(f,
+2)),!0)})}):d=a.call(this,b);return d})})()})(Highcharts);
+/*
+ Highcharts JS v4.0.3 (2014-07-03)
+
+ (c) 2009-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(d){function x(g,a,b,c){var e,f,j;b*=t;a*=t;var i=[],h,k,o;b*=-1;h=c.x;k=c.y;o=(c.z===0?1.0E-4:c.z)*(c.vd||25);o=Math.max(500,o);var q=l(b),n=m(b),r=l(a),s=m(a),p,v,u;d.each(g,function(a){p=a.x-h;v=a.y-k;u=a.z||0;e=n*p-q*u;f=-q*r*p-n*r*u+s*v;j=q*s*p+n*s*u+r*v;e=e*((o-j)/o)+h;f=f*((o-j)/o)+k;i.push({x:A(e),y:A(f),z:A(j)})});return i}function w(g,a,b,c,e,f,d,i){var h=[];return f>e&&f-e>n/2+1.0E-4?(h=h.concat(w(g,a,b,c,e,e+n/2,d,i)),h=h.concat(w(g,a,b,c,e+n/2,f,d,i))):f<e&&e-f>n/2+1.0E-4?(h=
+h.concat(w(g,a,b,c,e,e-n/2,d,i)),h=h.concat(w(g,a,b,c,e-n/2,f,d,i))):(h=f-e,["C",g+b*m(e)-b*B*h*l(e)+d,a+c*l(e)+c*B*h*m(e)+i,g+b*m(f)+b*B*h*l(f)+d,a+c*l(f)-c*B*h*m(f)+i,g+b*m(f)+d,a+c*l(f)+i])}function C(g){if(this.chart.is3d()){var a=this.chart.options.plotOptions.column.grouping;a!==void 0&&!a&&this.group.zIndex!==void 0&&this.group.attr({zIndex:this.group.zIndex*10});var b=this.options,c=this.options.states;this.borderWidth=b.borderWidth=b.edgeWidth||1;d.each(this.data,function(a){a=a.pointAttr;
+this.borderColor=d.pick(b.edgeColor,a[""].fill);a[""].stroke=this.borderColor;a.hover.stroke=d.pick(c.hover.edgeColor,this.borderColor);a.select.stroke=d.pick(c.select.edgeColor,this.borderColor)})}g.apply(this,[].slice.call(arguments,1))}var n=Math.PI,t=n/180,l=Math.sin,m=Math.cos,A=Math.round,B=4*(Math.sqrt(2)-1)/3/(n/2);d.SVGRenderer.prototype.toLinePath=function(g,a){var b=[];d.each(g,function(a){b.push("L",a.x,a.y)});b[0]="M";a&&b.push("Z");return b};d.SVGRenderer.prototype.cuboid=function(g){var a=
+this.g(),g=this.cuboidPath(g);a.front=this.path(g[0]).attr({zIndex:g[3],"stroke-linejoin":"round"}).add(a);a.top=this.path(g[1]).attr({zIndex:g[4],"stroke-linejoin":"round"}).add(a);a.side=this.path(g[2]).attr({zIndex:g[5],"stroke-linejoin":"round"}).add(a);a.fillSetter=function(a){var c=d.Color(a).brighten(0.1).get(),e=d.Color(a).brighten(-0.1).get();this.front.attr({fill:a});this.top.attr({fill:c});this.side.attr({fill:e});this.color=a;return this};a.opacitySetter=function(a){this.front.attr({opacity:a});
+this.top.attr({opacity:a});this.side.attr({opacity:a});return this};a.attr=function(a){a.shapeArgs||a.x?(a=this.renderer.cuboidPath(a.shapeArgs||a),this.front.attr({d:a[0],zIndex:a[3]}),this.top.attr({d:a[1],zIndex:a[4]}),this.side.attr({d:a[2],zIndex:a[5]})):d.SVGElement.prototype.attr.call(this,a);return this};a.animate=function(a,c,e){a.x&&a.y?(a=this.renderer.cuboidPath(a),this.front.attr({zIndex:a[3]}).animate({d:a[0]},c,e),this.top.attr({zIndex:a[4]}).animate({d:a[1]},c,e),this.side.attr({zIndex:a[5]}).animate({d:a[2]},
+c,e)):a.opacity?(this.front.animate(a,c,e),this.top.animate(a,c,e),this.side.animate(a,c,e)):d.SVGElement.prototype.animate.call(this,a,c,e);return this};a.destroy=function(){this.front.destroy();this.top.destroy();this.side.destroy();return null};a.attr({zIndex:-g[3]});return a};d.SVGRenderer.prototype.cuboidPath=function(d){var a=d.x,b=d.y,c=d.z,e=d.height,f=d.width,j=d.depth,i=d.alpha,h=d.beta,a=[{x:a,y:b,z:c},{x:a+f,y:b,z:c},{x:a+f,y:b+e,z:c},{x:a,y:b+e,z:c},{x:a,y:b+e,z:c+j},{x:a+f,y:b+e,z:c+
+j},{x:a+f,y:b,z:c+j},{x:a,y:b,z:c+j}],a=x(a,i,h,d.origin),d=["M",a[0].x,a[0].y,"L",a[7].x,a[7].y,"L",a[6].x,a[6].y,"L",a[1].x,a[1].y,"Z"],b=["M",a[3].x,a[3].y,"L",a[2].x,a[2].y,"L",a[5].x,a[5].y,"L",a[4].x,a[4].y,"Z"],c=["M",a[1].x,a[1].y,"L",a[2].x,a[2].y,"L",a[5].x,a[5].y,"L",a[6].x,a[6].y,"Z"],e=["M",a[0].x,a[0].y,"L",a[7].x,a[7].y,"L",a[4].x,a[4].y,"L",a[3].x,a[3].y,"Z"];return[["M",a[0].x,a[0].y,"L",a[1].x,a[1].y,"L",a[2].x,a[2].y,"L",a[3].x,a[3].y,"Z"],a[7].y<a[1].y?d:a[4].y>a[2].y?b:[],a[6].x>
+a[1].x?c:a[7].x<a[0].x?e:[],(a[0].z+a[1].z+a[2].z+a[3].z)/4,h>0?(a[0].z+a[7].z+a[6].z+a[1].z)/4:(a[3].z+a[2].z+a[5].z+a[4].z)/4,i>0?(a[1].z+a[2].z+a[5].z+a[6].z)/4:(a[0].z+a[7].z+a[4].z+a[3].z)/4]};d.SVGRenderer.prototype.arc3d=function(g){g.alpha*=t;g.beta*=t;var a=this.g(),b=this.arc3dPath(g),c=a.renderer,e=b.zTop*100;a.shapeArgs=g;a.top=c.path(b.top).attr({zIndex:b.zTop}).add(a);a.side1=c.path(b.side2).attr({zIndex:b.zSide2});a.side2=c.path(b.side1).attr({zIndex:b.zSide1});a.inn=c.path(b.inn).attr({zIndex:b.zInn});
+a.out=c.path(b.out).attr({zIndex:b.zOut});a.fillSetter=function(a){this.color=a;var b=d.Color(a).brighten(-0.1).get();this.side1.attr({fill:b});this.side2.attr({fill:b});this.inn.attr({fill:b});this.out.attr({fill:b});this.top.attr({fill:a});return this};a.translateXSetter=function(a){this.out.attr({translateX:a});this.inn.attr({translateX:a});this.side1.attr({translateX:a});this.side2.attr({translateX:a});this.top.attr({translateX:a})};a.translateYSetter=function(a){this.out.attr({translateY:a});
+this.inn.attr({translateY:a});this.side1.attr({translateY:a});this.side2.attr({translateY:a});this.top.attr({translateY:a})};a.animate=function(a,b,c){a.end||a.start?(this._shapeArgs=this.shapeArgs,d.SVGElement.prototype.animate.call(this,{_args:a},{duration:b,step:function(){var a=arguments[1],b=a.elem,c=b._shapeArgs,e=a.end,a=a.pos,c=d.merge(c,{start:c.start+(e.start-c.start)*a,end:c.end+(e.end-c.end)*a}),e=b.renderer.arc3dPath(c);b.shapeArgs=c;b.top.attr({d:e.top,zIndex:e.zTop});b.inn.attr({d:e.inn,
+zIndex:e.zInn});b.out.attr({d:e.out,zIndex:e.zOut});b.side1.attr({d:e.side1,zIndex:e.zSide1});b.side2.attr({d:e.side2,zIndex:e.zSide2})}},c)):d.SVGElement.prototype.animate.call(this,a,b,c);return this};a.destroy=function(){this.top.destroy();this.out.destroy();this.inn.destroy();this.side1.destroy();this.side2.destroy();d.SVGElement.prototype.destroy.call(this)};a.hide=function(){this.top.hide();this.out.hide();this.inn.hide();this.side1.hide();this.side2.hide()};a.show=function(){this.top.show();
+this.out.show();this.inn.show();this.side1.show();this.side2.show()};a.zIndex=e;a.attr({zIndex:e});return a};d.SVGRenderer.prototype.arc3dPath=function(d){var a=d.x,b=d.y,c=d.start,e=d.end-1.0E-5,f=d.r,j=d.innerR,i=d.depth,h=d.alpha,k=d.beta,o=m(c),q=l(c),d=m(e),z=l(e),r=f*m(k),s=f*m(h),p=j*m(k);j*=m(h);var v=i*l(k),u=i*l(h),i=["M",a+r*o,b+s*q],i=i.concat(w(a,b,r,s,c,e,0,0)),i=i.concat(["L",a+p*d,b+j*z]),i=i.concat(w(a,b,p,j,e,c,0,0)),i=i.concat(["Z"]),k=k>0?n/2:0,h=h>0?0:n/2,k=c>-k?c:e>-k?-k:c,t=
+e<n-h?e:c<n-h?n-h:e,h=["M",a+r*m(k),b+s*l(k)],h=h.concat(w(a,b,r,s,k,t,0,0)),h=h.concat(["L",a+r*m(t)+v,b+s*l(t)+u]),h=h.concat(w(a,b,r,s,t,k,v,u)),h=h.concat(["Z"]),k=["M",a+p*o,b+j*q],k=k.concat(w(a,b,p,j,c,e,0,0)),k=k.concat(["L",a+p*m(e)+v,b+j*l(e)+u]),k=k.concat(w(a,b,p,j,e,c,v,u)),k=k.concat(["Z"]),o=["M",a+r*o,b+s*q,"L",a+r*o+v,b+s*q+u,"L",a+p*o+v,b+j*q+u,"L",a+p*o,b+j*q,"Z"],a=["M",a+r*d,b+s*z,"L",a+r*d+v,b+s*z+u,"L",a+p*d+v,b+j*z+u,"L",a+p*d,b+j*z,"Z"],b=l((c+e)/2),c=l(c),e=l(e);return{top:i,
+zTop:f,out:h,zOut:Math.max(b,c,e)*f,inn:k,zInn:Math.max(b,c,e)*f,side1:o,zSide1:c*f*0.99,side2:a,zSide2:e*f*0.99}};d.Chart.prototype.is3d=function(){return this.options.chart.options3d&&this.options.chart.options3d.enabled};d.wrap(d.Chart.prototype,"isInsidePlot",function(d){return this.is3d()?!0:d.apply(this,[].slice.call(arguments,1))});var y=d.getOptions();y.chart.options3d={enabled:!1,alpha:0,beta:0,depth:100,viewDistance:25,frame:{bottom:{size:1,color:"rgba(255,255,255,0)"},side:{size:1,color:"rgba(255,255,255,0)"},
+back:{size:1,color:"rgba(255,255,255,0)"}}};y.plotOptions.pie.borderColor=void 0;d.wrap(d.Chart.prototype,"setChartSize",function(d){d.apply(this,[].slice.call(arguments,1));if(this.is3d()){var a=this.inverted,b=this.clipBox,c=this.margin;b[a?"y":"x"]=-(c[3]||0);b[a?"x":"y"]=-(c[0]||0);b[a?"height":"width"]=this.chartWidth+(c[3]||0)+(c[1]||0);b[a?"width":"height"]=this.chartHeight+(c[0]||0)+(c[2]||0)}});d.wrap(d.Chart.prototype,"redraw",function(d){if(this.is3d())this.isDirtyBox=!0;d.apply(this,[].slice.call(arguments,
+1))});d.Chart.prototype.retrieveStacks=function(g,a){var b={},c=1;if(g||!a)return this.series;d.each(this.series,function(a){b[a.options.stack||0]?b[a.options.stack||0].series.push(a):(b[a.options.stack||0]={series:[a],position:c},c++)});b.totalStacks=c+1;return b};d.wrap(d.Axis.prototype,"init",function(g){var a=arguments;if(a[1].is3d())a[2].tickWidth=d.pick(a[2].tickWidth,0),a[2].gridLineWidth=d.pick(a[2].gridLineWidth,1);g.apply(this,[].slice.call(arguments,1))});d.wrap(d.Axis.prototype,"render",
+function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.chart,b=a.renderer,c=a.options.chart.options3d,e=c.alpha,f=c.beta*(a.yAxis[0].opposite?-1:1),j=c.frame,i=j.bottom,h=j.back,j=j.side,k=c.depth,o=this.height,q=this.width,l=this.left,m=this.top,c={x:a.plotLeft+a.plotWidth/2,y:a.plotTop+a.plotHeight/2,z:k,vd:c.viewDistance};if(this.horiz)this.axisLine&&this.axisLine.hide(),f={x:l,y:m+(a.yAxis[0].reversed?-i.size:o),z:0,width:q,height:i.size,depth:k,alpha:e,beta:f,origin:c},
+this.bottomFrame?this.bottomFrame.animate(f):this.bottomFrame=b.cuboid(f).attr({fill:i.color,zIndex:a.yAxis[0].reversed&&e>0?4:-1}).css({stroke:i.color}).add();else{var n={x:l,y:m,z:k+1,width:q,height:o+i.size,depth:h.size,alpha:e,beta:f,origin:c};this.backFrame?this.backFrame.animate(n):this.backFrame=b.cuboid(n).attr({fill:h.color,zIndex:-3}).css({stroke:h.color}).add();this.axisLine&&this.axisLine.hide();a={x:(a.yAxis[0].opposite?q:0)+l-j.size,y:m,z:0,width:j.size,height:o+i.size,depth:k+h.size,
+alpha:e,beta:f,origin:c};this.sideFrame?this.sideFrame.animate(a):this.sideFrame=b.cuboid(a).attr({fill:j.color,zIndex:-2}).css({stroke:j.color}).add()}}});d.wrap(d.Axis.prototype,"getPlotLinePath",function(d){var a=d.apply(this,[].slice.call(arguments,1));if(!this.chart.is3d())return a;if(a===null)return a;var b=this.chart,c=b.options.chart.options3d,e=c.depth;c.origin={x:b.plotLeft+b.plotWidth/2,y:b.plotTop+b.plotHeight/2,z:e,vd:c.viewDistance};var a=[{x:a[1],y:a[2],z:this.horiz||this.opposite?
+e:0},{x:a[1],y:a[2],z:e},{x:a[4],y:a[5],z:e},{x:a[4],y:a[5],z:this.horiz||this.opposite?0:e}],e=b.options.inverted?c.beta:c.alpha,f=b.options.inverted?c.alpha:c.beta;f*=b.yAxis[0].opposite?-1:1;a=x(a,e,f,c.origin);return a=this.chart.renderer.toLinePath(a,!1)});d.wrap(d.Axis.prototype,"getPlotBandPath",function(d){if(this.chart.is3d()){var a=arguments,b=a[1],a=this.getPlotLinePath(a[2]);(b=this.getPlotLinePath(b))&&a?b.push(a[7],a[8],a[4],a[5],a[1],a[2]):b=null;return b}else return d.apply(this,[].slice.call(arguments,
+1))});d.wrap(d.Tick.prototype,"getMarkPath",function(d){var a=d.apply(this,[].slice.call(arguments,1));if(!this.axis.chart.is3d())return a;var b=this.axis.chart,c=b.options.chart.options3d,e={x:b.plotLeft+b.plotWidth/2,y:b.plotTop+b.plotHeight/2,z:c.depth,vd:c.viewDistance},a=[{x:a[1],y:a[2],z:0},{x:a[4],y:a[5],z:0}],f=b.inverted?c.beta:c.alpha,c=b.inverted?c.alpha:c.beta;c*=b.yAxis[0].opposite?-1:1;a=x(a,f,c,e);return a=["M",a[0].x,a[0].y,"L",a[1].x,a[1].y]});d.wrap(d.Tick.prototype,"getLabelPosition",
+function(d){var a=d.apply(this,[].slice.call(arguments,1));if(!this.axis.chart.is3d())return a;var b=this.axis.chart,c=b.options.chart.options3d,e={x:b.plotLeft+b.plotWidth/2,y:b.plotTop+b.plotHeight/2,z:c.depth,vd:c.viewDistance},f=b.inverted?c.beta:c.alpha,c=b.inverted?c.alpha:c.beta;c*=b.yAxis[0].opposite?-1:1;return a=x([{x:a.x,y:a.y,z:0}],f,c,e)[0]});d.wrap(d.Axis.prototype,"drawCrosshair",function(d){var a=arguments;this.chart.is3d()&&a[2]&&(a[2]={plotX:a[2].plotXold||a[2].plotX,plotY:a[2].plotYold||
+a[2].plotY});d.apply(this,[].slice.call(a,1))});d.wrap(d.seriesTypes.column.prototype,"translate",function(g){g.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.chart,b=this.options,c=a.options.chart.options3d,e=b.depth||25,f={x:a.plotWidth/2,y:a.plotHeight/2,z:c.depth,vd:c.viewDistance},j=c.alpha,i=c.beta*(a.yAxis[0].opposite?-1:1),h=(b.stacking?b.stack||0:this._i)*(e+(b.groupZPadding||1));b.grouping!==!1&&(h=0);h+=b.groupZPadding||1;d.each(this.data,function(a){var b=a.shapeArgs,
+c=a.tooltipPos;a.shapeType="cuboid";b.alpha=j;b.beta=i;b.z=h;b.origin=f;b.depth=e;c=x([{x:c[0],y:c[1],z:h}],j,i,f)[0];a.tooltipPos=[c.x,c.y]})}});d.wrap(d.seriesTypes.column.prototype,"animate",function(g){if(this.chart.is3d()){var a=arguments[1],b=this.yAxis,c=this,e=this.yAxis.reversed;if(d.svg)a?d.each(c.data,function(a){a.height=a.shapeArgs.height;a.shapey=a.shapeArgs.y;a.shapeArgs.height=1;if(!e)a.shapeArgs.y=a.stackY?a.plotY+b.translate(a.stackY):a.plotY+(a.negative?-a.height:a.height)}):(d.each(c.data,
+function(a){a.shapeArgs.height=a.height;a.shapeArgs.y=a.shapey;a.graphic&&a.graphic.animate(a.shapeArgs,c.options.animation)}),this.drawDataLabels(),c.animate=null)}else g.apply(this,[].slice.call(arguments,1))});d.wrap(d.seriesTypes.column.prototype,"init",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.options,b=a.grouping,c=a.stacking,e=0;if((b===void 0||b)&&c){b=this.chart.retrieveStacks(b,c);c=a.stack||0;for(e=0;e<b[c].series.length;e++)if(b[c].series[e]===
+this)break;e=b.totalStacks*10-10*(b.totalStacks-b[c].position)-e}a.zIndex=e}});d.wrap(d.Series.prototype,"alignDataLabel",function(d){if(this.chart.is3d()&&(this.type==="column"||this.type==="columnrange")){var a=this.chart,b=a.options.chart.options3d,c=arguments[4],e={x:c.x,y:c.y,z:0},e=x([e],b.alpha,b.beta*(a.yAxis[0].opposite?-1:1),{x:a.plotWidth/2,y:a.plotHeight/2,z:b.depth,vd:b.viewDistance})[0];c.x=e.x;c.y=e.y}d.apply(this,[].slice.call(arguments,1))});d.seriesTypes.columnrange&&d.wrap(d.seriesTypes.columnrange.prototype,
+"drawPoints",C);d.wrap(d.seriesTypes.column.prototype,"drawPoints",C);y=d.getOptions();y.plotOptions.cylinder=d.merge(y.plotOptions.column);y=d.extendClass(d.seriesTypes.column,{type:"cylinder"});d.seriesTypes.cylinder=y;d.wrap(d.seriesTypes.cylinder.prototype,"translate",function(g){g.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.chart,b=a.options,c=b.plotOptions.cylinder,b=b.chart.options3d,e=c.depth||0,f={x:a.inverted?a.plotHeight/2:a.plotWidth/2,y:a.inverted?a.plotWidth/
+2:a.plotHeight/2,z:b.depth,vd:b.viewDistance},j=b.alpha,i=c.stacking?(this.options.stack||0)*e:this._i*e;i+=e/2;c.grouping!==!1&&(i=0);d.each(this.data,function(a){var b=a.shapeArgs;a.shapeType="arc3d";b.x+=e/2;b.z=i;b.start=0;b.end=2*n;b.r=e*0.95;b.innerR=0;b.depth=b.height*(1/l((90-j)*t))-i;b.alpha=90-j;b.beta=0;b.origin=f})}});d.wrap(d.seriesTypes.pie.prototype,"translate",function(g){g.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this,b=a.chart,c=a.options,e=c.depth||0,f=
+b.options.chart.options3d,j={x:b.plotWidth/2,y:b.plotHeight/2,z:f.depth},i=f.alpha,h=f.beta,k=c.stacking?(c.stack||0)*e:a._i*e;k+=e/2;c.grouping!==!1&&(k=0);d.each(a.data,function(b){b.shapeType="arc3d";var c=b.shapeArgs;if(b.y)c.z=k,c.depth=e*0.75,c.origin=j,c.alpha=i,c.beta=h,c=(c.end+c.start)/2,b.slicedTranslation={translateX:A(m(c)*a.options.slicedOffset*m(i*t)),translateY:A(l(c)*a.options.slicedOffset*m(i*t))}})}});d.wrap(d.seriesTypes.pie.prototype.pointClass.prototype,"haloPath",function(d){return this.series.chart.is3d()?
+[]:d.call(this)});d.wrap(d.seriesTypes.pie.prototype,"drawPoints",function(g){if(this.chart.is3d()){var a=this.options,b=this.options.states;this.borderWidth=a.borderWidth=a.edgeWidth||1;b.hover.borderColor=d.pick(b.hover.edgeColor,this.borderColor);b.hover.borderWidth=d.pick(b.hover.edgeWidth,this.borderWidth);b.select.borderColor=d.pick(b.select.edgeColor,this.borderColor);b.select.borderWidth=d.pick(b.select.edgeWidth,this.borderWidth);d.each(this.data,function(a){var c=a.pointAttr;c[""].stroke=
+a.series.borderColor||a.color;c[""]["stroke-width"]=a.series.borderWidth;c.hover.stroke=b.hover.borderColor;c.hover["stroke-width"]=b.hover.borderWidth;c.select.stroke=b.select.borderColor;c.select["stroke-width"]=b.select.borderWidth})}g.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var c=this.group;d.each(this.points,function(a){a.graphic.out.add(c);a.graphic.inn.add(c);a.graphic.side1.add(c);a.graphic.side2.add(c)})}});d.wrap(d.seriesTypes.pie.prototype,"drawDataLabels",function(g){this.chart.is3d()&&
+d.each(this.data,function(a){var b=a.shapeArgs,c=b.r,d=b.depth,f=b.alpha*t,b=(b.start+b.end)/2,a=a.labelPos;a[1]+=-c*(1-m(f))*l(b)+(l(b)>0?l(f)*d:0);a[3]+=-c*(1-m(f))*l(b)+(l(b)>0?l(f)*d:0);a[5]+=-c*(1-m(f))*l(b)+(l(b)>0?l(f)*d:0)});g.apply(this,[].slice.call(arguments,1))});d.wrap(d.seriesTypes.pie.prototype,"addPoint",function(d){d.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&this.update()});d.wrap(d.seriesTypes.pie.prototype,"animate",function(g){if(this.chart.is3d()){var a=arguments[1],
+b=this.options.animation,c=this.center,e=this.group,f=this.markerGroup;if(d.svg)if(b===!0&&(b={}),a){if(e.oldtranslateX=e.translateX,e.oldtranslateY=e.translateY,a={translateX:c[0],translateY:c[1],scaleX:0.001,scaleY:0.001},e.attr(a),f)f.attrSetters=e.attrSetters,f.attr(a)}else a={translateX:e.oldtranslateX,translateY:e.oldtranslateY,scaleX:1,scaleY:1},e.animate(a,b),f&&f.animate(a,b),this.animate=null}else g.apply(this,[].slice.call(arguments,1))});d.wrap(d.seriesTypes.scatter.prototype,"translate",
+function(g){g.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.chart,b=this.chart.options.chart.options3d,c=b.alpha,e=b.beta,f={x:a.inverted?a.plotHeight/2:a.plotWidth/2,y:a.inverted?a.plotWidth/2:a.plotHeight/2,z:b.depth,vd:b.viewDistance},b=b.depth,j=a.options.zAxis||{min:0,max:b},i=b/(j.max-j.min);d.each(this.data,function(a){var b={x:a.plotX,y:a.plotY,z:(a.z-j.min)*i},b=x([b],c,e,f)[0];a.plotXold=a.plotX;a.plotYold=a.plotY;a.plotX=b.x;a.plotY=b.y;a.plotZ=b.z})}});d.wrap(d.seriesTypes.scatter.prototype,
+"init",function(d){var a=d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d())this.pointArrayMap=["x","y","z"],this.tooltipOptions.pointFormat=this.userOptions.tooltip?this.userOptions.tooltip.pointFormat||"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>":"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>";return a});if(d.VMLRenderer)d.setOptions({animate:!1}),d.VMLRenderer.prototype.cuboid=d.SVGRenderer.prototype.cuboid,d.VMLRenderer.prototype.cuboidPath=
+d.SVGRenderer.prototype.cuboidPath,d.VMLRenderer.prototype.toLinePath=d.SVGRenderer.prototype.toLinePath,d.VMLRenderer.prototype.createElement3D=d.SVGRenderer.prototype.createElement3D,d.VMLRenderer.prototype.arc3d=function(g){g=d.SVGRenderer.prototype.arc3d.call(this,g);g.css({zIndex:g.zIndex});return g},d.VMLRenderer.prototype.arc3dPath=d.SVGRenderer.prototype.arc3dPath,d.Chart.prototype.renderSeries=function(){for(var d,a=this.series.length;a--;)d=this.series[a],d.translate(),d.setTooltipPoints&&
+d.setTooltipPoints(),d.render()},d.wrap(d.Axis.prototype,"render",function(d){d.apply(this,[].slice.call(arguments,1));this.sideFrame&&(this.sideFrame.css({zIndex:0}),this.sideFrame.front.attr({fill:this.sideFrame.color}));this.bottomFrame&&(this.bottomFrame.css({zIndex:1}),this.bottomFrame.front.attr({fill:this.bottomFrame.color}));this.backFrame&&(this.backFrame.css({zIndex:0}),this.backFrame.front.attr({fill:this.backFrame.color}))})})(Highcharts);
+/*
+ Highcharts JS v4.0.3 (2014-07-03)
+ Exporting module
+
+ (c) 2010-2014 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(f){var A=f.Chart,t=f.addEvent,B=f.removeEvent,l=f.createElement,o=f.discardElement,v=f.css,k=f.merge,r=f.each,p=f.extend,D=Math.max,j=document,C=window,E=f.isTouchDevice,F=f.Renderer.prototype.symbols,s=f.getOptions(),y;p(s.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"});s.navigation={menuStyle:{border:"1px solid #A0A0A0",
+background:"#FFFFFF",padding:"5px 0"},menuItemStyle:{padding:"0 10px",background:"none",color:"#303030",fontSize:E?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{symbolFill:"#E0E0E0",symbolSize:14,symbolStroke:"#666",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,theme:{fill:"white",stroke:"none"},verticalAlign:"top",width:24}};s.exporting={type:"image/png",url:"http://export.highcharts.com/",buttons:{contextButton:{menuClassName:"highcharts-contextmenu",
+symbol:"menu",_titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}};f.post=function(b,a,d){var c,b=l("form",k({method:"post",
+action:b,enctype:"multipart/form-data"},d),{display:"none"},j.body);for(c in a)l("input",{type:"hidden",name:c,value:a[c]},null,b);b.submit();o(b)};p(A.prototype,{getSVG:function(b){var a=this,d,c,z,h,g=k(a.options,b);if(!j.createElementNS)j.createElementNS=function(a,b){return j.createElement(b)};b=l("div",null,{position:"absolute",top:"-9999em",width:a.chartWidth+"px",height:a.chartHeight+"px"},j.body);c=a.renderTo.style.width;h=a.renderTo.style.height;c=g.exporting.sourceWidth||g.chart.width||
+/px$/.test(c)&&parseInt(c,10)||600;h=g.exporting.sourceHeight||g.chart.height||/px$/.test(h)&&parseInt(h,10)||400;p(g.chart,{animation:!1,renderTo:b,forExport:!0,width:c,height:h});g.exporting.enabled=!1;g.series=[];r(a.series,function(a){z=k(a.options,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});z.isInternal||g.series.push(z)});d=new f.Chart(g,a.callback);r(["xAxis","yAxis"],function(b){r(a[b],function(a,c){var g=d[b][c],f=a.getExtremes(),h=f.userMin,f=f.userMax;g&&(h!==
+void 0||f!==void 0)&&g.setExtremes(h,f,!0,!1)})});c=d.container.innerHTML;g=null;d.destroy();o(b);c=c.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ href=/g," xlink:href=").replace(/\n/," ").replace(/<\/svg>.*?$/,"</svg>").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g,'$1="rgb($2)" $1-opacity="$3"').replace(/&nbsp;/g,
+" ").replace(/&shy;/g,"­").replace(/<IMG /g,"<image ").replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g,'width="$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href="$1"/>').replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" >]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()});return c=c.replace(/(url\(#highcharts-[0-9]+)&quot;/g,"$1").replace(/&quot;/g,"'")},exportChart:function(b,a){var b=
+b||{},d=this.options.exporting,d=this.getSVG(k({chart:{borderRadius:0}},d.chartOptions,a,{exporting:{sourceWidth:b.sourceWidth||d.sourceWidth,sourceHeight:b.sourceHeight||d.sourceHeight}})),b=k(this.options.exporting,b);f.post(b.url,{filename:b.filename||"chart",type:b.type,width:b.width||0,scale:b.scale||2,svg:d},b.formAttributes)},print:function(){var b=this,a=b.container,d=[],c=a.parentNode,f=j.body,h=f.childNodes;if(!b.isPrinting)b.isPrinting=!0,r(h,function(a,b){if(a.nodeType===1)d[b]=a.style.display,
+a.style.display="none"}),f.appendChild(a),C.focus(),C.print(),setTimeout(function(){c.appendChild(a);r(h,function(a,b){if(a.nodeType===1)a.style.display=d[b]});b.isPrinting=!1},1E3)},contextMenu:function(b,a,d,c,f,h,g){var e=this,k=e.options.navigation,q=k.menuItemStyle,m=e.chartWidth,n=e.chartHeight,j="cache-"+b,i=e[j],u=D(f,h),w,x,o,s=function(a){e.pointer.inClass(a.target,b)||x()};if(!i)e[j]=i=l("div",{className:b},{position:"absolute",zIndex:1E3,padding:u+"px"},e.container),w=l("div",null,p({MozBoxShadow:"3px 3px 10px #888",
+WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},k.menuStyle),i),x=function(){v(i,{display:"none"});g&&g.setState(0);e.openMenu=!1},t(i,"mouseleave",function(){o=setTimeout(x,500)}),t(i,"mouseenter",function(){clearTimeout(o)}),t(document,"mouseup",s),t(e,"destroy",function(){B(document,"mouseup",s)}),r(a,function(a){if(a){var b=a.separator?l("hr",null,null,w):l("div",{onmouseover:function(){v(this,k.menuItemHoverStyle)},onmouseout:function(){v(this,q)},onclick:function(){x();a.onclick.apply(e,
+arguments)},innerHTML:a.text||e.options.lang[a.textKey]},p({cursor:"pointer"},q),w);e.exportDivElements.push(b)}}),e.exportDivElements.push(w,i),e.exportMenuWidth=i.offsetWidth,e.exportMenuHeight=i.offsetHeight;a={display:"block"};d+e.exportMenuWidth>m?a.right=m-d-f-u+"px":a.left=d-u+"px";c+h+e.exportMenuHeight>n&&g.alignOptions.verticalAlign!=="top"?a.bottom=n-c-u+"px":a.top=c+h-u+"px";v(i,a);e.openMenu=!0},addButton:function(b){var a=this,d=a.renderer,c=k(a.options.navigation.buttonOptions,b),j=
+c.onclick,h=c.menuItems,g,e,l={stroke:c.symbolStroke,fill:c.symbolFill},q=c.symbolSize||12;if(!a.btnCount)a.btnCount=0;if(!a.exportDivElements)a.exportDivElements=[],a.exportSVGElements=[];if(c.enabled!==!1){var m=c.theme,n=m.states,o=n&&n.hover,n=n&&n.select,i;delete m.states;j?i=function(){j.apply(a,arguments)}:h&&(i=function(){a.contextMenu(e.menuClassName,h,e.translateX,e.translateY,e.width,e.height,e);e.setState(2)});c.text&&c.symbol?m.paddingLeft=f.pick(m.paddingLeft,25):c.text||p(m,{width:c.width,
+height:c.height,padding:0});e=d.button(c.text,0,0,i,m,o,n).attr({title:a.options.lang[c._titleKey],"stroke-linecap":"round"});e.menuClassName=b.menuClassName||"highcharts-menu-"+a.btnCount++;c.symbol&&(g=d.symbol(c.symbol,c.symbolX-q/2,c.symbolY-q/2,q,q).attr(p(l,{"stroke-width":c.symbolStrokeWidth||1,zIndex:1})).add(e));e.add().align(p(c,{width:e.width,x:f.pick(c.x,y)}),!0,"spacingBox");y+=(e.width+c.buttonSpacing)*(c.align==="right"?-1:1);a.exportSVGElements.push(e,g)}},destroyExport:function(b){var b=
+b.target,a,d;for(a=0;a<b.exportSVGElements.length;a++)if(d=b.exportSVGElements[a])d.onclick=d.ontouchstart=null,b.exportSVGElements[a]=d.destroy();for(a=0;a<b.exportDivElements.length;a++)d=b.exportDivElements[a],B(d,"mouseleave"),b.exportDivElements[a]=d.onmouseout=d.onmouseover=d.ontouchstart=d.onclick=null,o(d)}});F.menu=function(b,a,d,c){return["M",b,a+2.5,"L",b+d,a+2.5,"M",b,a+c/2+0.5,"L",b+d,a+c/2+0.5,"M",b,a+c-1.5,"L",b+d,a+c-1.5]};A.prototype.callbacks.push(function(b){var a,d=b.options.exporting,
+c=d.buttons;y=0;if(d.enabled!==!1){for(a in c)b.addButton(c[a]);t(b,"destroy",b.destroyExport)}})})(Highcharts);
+/*
+ Data plugin for Highcharts
+
+ (c) 2012-2014 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(j){var m=j.each,n=function(b,a){this.init(b,a)};j.extend(n.prototype,{init:function(b,a){this.options=b;this.chartOptions=a;this.columns=b.columns||this.rowsToColumns(b.rows)||[];this.columns.length?this.dataFound():(this.parseCSV(),this.parseTable(),this.parseGoogleSpreadsheet())},getColumnDistribution:function(){var b=this.chartOptions,a=b&&b.chart&&b.chart.type,c=[];m(b&&b.series||[],function(b){c.push((j.seriesTypes[b.type||a||"line"].prototype.pointArrayMap||[0]).length)});this.valueCount=
+{global:(j.seriesTypes[a||"line"].prototype.pointArrayMap||[0]).length,individual:c}},dataFound:function(){if(this.options.switchRowsAndColumns)this.columns=this.rowsToColumns(this.columns);this.parseTypes();this.findHeaderRow();this.parsed();this.complete()},parseCSV:function(){var b=this,a=this.options,c=a.csv,d=this.columns,e=a.startRow||0,f=a.endRow||Number.MAX_VALUE,i=a.startColumn||0,h=a.endColumn||Number.MAX_VALUE,g,k,o=0;c&&(k=c.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split(a.lineDelimiter||
+"\n"),g=a.itemDelimiter||(c.indexOf("\t")!==-1?"\t":","),m(k,function(a,c){var k=b.trim(a),j=k.indexOf("#")===0;c>=e&&c<=f&&!j&&k!==""&&(k=a.split(g),m(k,function(b,a){a>=i&&a<=h&&(d[a-i]||(d[a-i]=[]),d[a-i][o]=b)}),o+=1)}),this.dataFound())},parseTable:function(){var b=this.options,a=b.table,c=this.columns,d=b.startRow||0,e=b.endRow||Number.MAX_VALUE,f=b.startColumn||0,i=b.endColumn||Number.MAX_VALUE;a&&(typeof a==="string"&&(a=document.getElementById(a)),m(a.getElementsByTagName("tr"),function(a,
+b){b>=d&&b<=e&&m(a.children,function(a,e){if((a.tagName==="TD"||a.tagName==="TH")&&e>=f&&e<=i)c[e-f]||(c[e-f]=[]),c[e-f][b-d]=a.innerHTML})}),this.dataFound())},parseGoogleSpreadsheet:function(){var b=this,a=this.options,c=a.googleSpreadsheetKey,d=this.columns,e=a.startRow||0,f=a.endRow||Number.MAX_VALUE,i=a.startColumn||0,h=a.endColumn||Number.MAX_VALUE,g,k;c&&jQuery.ajax({dataType:"json",url:"https://spreadsheets.google.com/feeds/cells/"+c+"/"+(a.googleSpreadsheetWorksheet||"od6")+"/public/values?alt=json-in-script&callback=?",
+error:a.error,success:function(a){var a=a.feed.entry,c,j=a.length,m=0,n=0,l;for(l=0;l<j;l++)c=a[l],m=Math.max(m,c.gs$cell.col),n=Math.max(n,c.gs$cell.row);for(l=0;l<m;l++)if(l>=i&&l<=h)d[l-i]=[],d[l-i].length=Math.min(n,f-e);for(l=0;l<j;l++)if(c=a[l],g=c.gs$cell.row-1,k=c.gs$cell.col-1,k>=i&&k<=h&&g>=e&&g<=f)d[k-i][g-e]=c.content.$t;b.dataFound()}})},findHeaderRow:function(){m(this.columns,function(){});this.headerRow=0},trim:function(b){return typeof b==="string"?b.replace(/^\s+|\s+$/g,""):b},parseTypes:function(){for(var b=
+this.columns,a=b.length,c,d,e,f;a--;)for(c=b[a].length;c--;)d=b[a][c],e=parseFloat(d),f=this.trim(d),f==e?(b[a][c]=e,e>31536E6?b[a].isDatetime=!0:b[a].isNumeric=!0):(d=this.parseDate(d),a===0&&typeof d==="number"&&!isNaN(d)?(b[a][c]=d,b[a].isDatetime=!0):b[a][c]=f===""?null:f)},dateFormats:{"YYYY-mm-dd":{regex:"^([0-9]{4})-([0-9]{2})-([0-9]{2})$",parser:function(b){return Date.UTC(+b[1],b[2]-1,+b[3])}}},parseDate:function(b){var a=this.options.parseDate,c,d,e;a&&(c=a(b));if(typeof b==="string")for(d in this.dateFormats)a=
+this.dateFormats[d],(e=b.match(a.regex))&&(c=a.parser(e));return c},rowsToColumns:function(b){var a,c,d,e,f;if(b){f=[];c=b.length;for(a=0;a<c;a++){e=b[a].length;for(d=0;d<e;d++)f[d]||(f[d]=[]),f[d][a]=b[a][d]}}return f},parsed:function(){this.options.parsed&&this.options.parsed.call(this,this.columns)},complete:function(){var b=this.columns,a,c,d=this.options,e,f,i,h,g,k;if(d.complete||d.afterComplete){this.getColumnDistribution();b.length>1&&(a=b.shift(),this.headerRow===0&&a.shift(),a.isDatetime?
+c="datetime":a.isNumeric||(c="category"));for(h=0;h<b.length;h++)if(this.headerRow===0)b[h].name=b[h].shift();f=[];for(h=0,k=0;h<b.length;k++){e=j.pick(this.valueCount.individual[k],this.valueCount.global);i=[];if(h+e<=b.length)for(g=0;g<b[h].length;g++)i[g]=[a[g],b[h][g]!==void 0?b[h][g]:null],e>1&&i[g].push(b[h+1][g]!==void 0?b[h+1][g]:null),e>2&&i[g].push(b[h+2][g]!==void 0?b[h+2][g]:null),e>3&&i[g].push(b[h+3][g]!==void 0?b[h+3][g]:null),e>4&&i[g].push(b[h+4][g]!==void 0?b[h+4][g]:null);f[k]=
+{name:b[h].name,data:i};h+=e}b={xAxis:{type:c},series:f};d.complete&&d.complete(b);d.afterComplete&&d.afterComplete(b)}}});j.Data=n;j.data=function(b,a){return new n(b,a)};j.wrap(j.Chart.prototype,"init",function(b,a,c){var d=this;a&&a.data?j.data(j.extend(a.data,{afterComplete:function(e){var f,i;if(a.hasOwnProperty("series"))if(typeof a.series==="object")for(f=Math.max(a.series.length,e.series.length);f--;)i=a.series[f]||{},a.series[f]=j.merge(i,e.series[f]);else delete a.series;a=j.merge(e,a);
+b.call(d,a,c)}}),a):b.call(d,a,c)})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-more.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-more.js
new file mode 100644
index 0000000..e3c5c69
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-more.js
@@ -0,0 +1,53 @@
+/*
+ Highcharts JS v4.0.3 (2014-07-03)
+
+ (c) 2009-2014 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(l,C){function K(a,b,c){this.init.call(this,a,b,c)}var P=l.arrayMin,Q=l.arrayMax,s=l.each,F=l.extend,q=l.merge,R=l.map,o=l.pick,x=l.pInt,p=l.getOptions().plotOptions,g=l.seriesTypes,v=l.extendClass,L=l.splat,r=l.wrap,M=l.Axis,y=l.Tick,H=l.Point,S=l.Pointer,T=l.CenteredSeriesMixin,z=l.TrackerMixin,t=l.Series,w=Math,D=w.round,A=w.floor,N=w.max,U=l.Color,u=function(){};F(K.prototype,{init:function(a,b,c){var d=this,e=d.defaultOptions;d.chart=b;if(b.angular)e.background={};d.options=a=q(e,a);
+(a=a.background)&&s([].concat(L(a)).reverse(),function(a){var b=a.backgroundColor,a=q(d.defaultBackgroundOptions,a);if(b)a.backgroundColor=b;a.color=a.backgroundColor;c.options.plotBands.unshift(a)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{shape:"circle",borderWidth:1,borderColor:"silver",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#FFF"],[1,"#DDD"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});
+var G=M.prototype,y=y.prototype,V={getOffset:u,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:u,setCategories:u,setTitle:u},O={isRadial:!0,defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},
+maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){a=this.options=q(this.defaultOptions,this.defaultRadialOptions,a);if(!a.plotBands)a.plotBands=[]},getOffset:function(){G.getOffset.call(this);this.chart.axisOffset[this.side]=0;this.center=this.pane.center=T.getCenter.call(this.pane)},getLinePath:function(a,b){var c=this.center,b=o(b,
+c[2]/2-this.offset);return this.chart.renderer.symbols.arc(this.left+c[0],this.top+c[1],b,b,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0})},setAxisTranslation:function(){G.setAxisTranslation.call(this);if(this.center)this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0},beforeSetTickPositions:function(){this.autoConnect&&(this.max+=this.categories&&
+1||this.pointRange||this.closestPointRange||0)},setAxisSize:function(){G.setAxisSize.call(this);if(this.isRadial){this.center=this.pane.center=l.CenteredSeriesMixin.getCenter.call(this.pane);if(this.isCircular)this.sector=this.endAngleRad-this.startAngleRad;this.len=this.width=this.height=this.center[2]*o(this.sector,1)/2}},getPosition:function(a,b){return this.postTranslate(this.isCircular?this.translate(a):0,o(this.isCircular?b:this.translate(a),this.center[2]/2)-this.offset)},postTranslate:function(a,
+b){var c=this.chart,d=this.center,a=this.startAngleRad+a;return{x:c.plotLeft+d[0]+Math.cos(a)*b,y:c.plotTop+d[1]+Math.sin(a)*b}},getPlotBandPath:function(a,b,c){var d=this.center,e=this.startAngleRad,f=d[2]/2,h=[o(c.outerRadius,"100%"),c.innerRadius,o(c.thickness,10)],j=/%$/,k,m=this.isCircular;this.options.gridLineInterpolation==="polygon"?d=this.getPlotLinePath(a).concat(this.getPlotLinePath(b,!0)):(m||(h[0]=this.translate(a),h[1]=this.translate(b)),h=R(h,function(a){j.test(a)&&(a=x(a,10)*f/100);
+return a}),c.shape==="circle"||!m?(a=-Math.PI/2,b=Math.PI*1.5,k=!0):(a=e+this.translate(a),b=e+this.translate(b)),d=this.chart.renderer.symbols.arc(this.left+d[0],this.top+d[1],h[0],h[0],{start:a,end:b,innerR:o(h[1],h[0]-h[2]),open:k}));return d},getPlotLinePath:function(a,b){var c=this,d=c.center,e=c.chart,f=c.getPosition(a),h,j,k;c.isCircular?k=["M",d[0]+e.plotLeft,d[1]+e.plotTop,"L",f.x,f.y]:c.options.gridLineInterpolation==="circle"?(a=c.translate(a))&&(k=c.getLinePath(0,a)):(s(e.xAxis,function(a){a.pane===
+c.pane&&(h=a)}),k=[],a=c.translate(a),d=h.tickPositions,h.autoConnect&&(d=d.concat([d[0]])),b&&(d=[].concat(d).reverse()),s(d,function(f,c){j=h.getPosition(f,a);k.push(c?"L":"M",j.x,j.y)}));return k},getTitlePosition:function(){var a=this.center,b=this.chart,c=this.options.title;return{x:b.plotLeft+a[0]+(c.x||0),y:b.plotTop+a[1]-{high:0.5,middle:0.25,low:0}[c.align]*a[2]+(c.y||0)}}};r(G,"init",function(a,b,c){var i;var d=b.angular,e=b.polar,f=c.isX,h=d&&f,j,k;k=b.options;var m=c.pane||0;if(d){if(F(this,
+h?V:O),j=!f)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else if(e)F(this,O),this.defaultRadialOptions=(j=f)?this.defaultRadialXOptions:q(this.defaultYAxisOptions,this.defaultRadialYOptions);a.call(this,b,c);if(!h&&(d||e)){a=this.options;if(!b.panes)b.panes=[];this.pane=(i=b.panes[m]=b.panes[m]||new K(L(k.pane)[m],b,this),m=i);m=m.options;b.inverted=!1;k.chart.zoomType=null;this.startAngleRad=b=(m.startAngle-90)*Math.PI/180;this.endAngleRad=k=(o(m.endAngle,m.startAngle+360)-90)*Math.PI/
+180;this.offset=a.offset||0;if((this.isCircular=j)&&c.max===C&&k-b===2*Math.PI)this.autoConnect=!0}});r(y,"getPosition",function(a,b,c,d,e){var f=this.axis;return f.getPosition?f.getPosition(c):a.call(this,b,c,d,e)});r(y,"getLabelPosition",function(a,b,c,d,e,f,h,j,k){var m=this.axis,i=f.y,n=f.align,g=(m.translate(this.pos)+m.startAngleRad+Math.PI/2)/Math.PI*180%360;m.isRadial?(a=m.getPosition(this.pos,m.center[2]/2+o(f.distance,-25)),f.rotation==="auto"?d.attr({rotation:g}):i===null&&(i=m.chart.renderer.fontMetrics(d.styles.fontSize).b-
+d.getBBox().height/2),n===null&&(n=m.isCircular?g>20&&g<160?"left":g>200&&g<340?"right":"center":"center",d.attr({align:n})),a.x+=f.x,a.y+=i):a=a.call(this,b,c,d,e,f,h,j,k);return a});r(y,"getMarkPath",function(a,b,c,d,e,f,h){var j=this.axis;j.isRadial?(a=j.getPosition(this.pos,j.center[2]/2+d),b=["M",b,c,"L",a.x,a.y]):b=a.call(this,b,c,d,e,f,h);return b});p.arearange=q(p.area,{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'<span style="color:{series.color}">●</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'},
+trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}});g.arearange=v(g.area,{type:"arearange",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",getSegments:function(){var a=this;s(a.points,function(b){if(!a.options.connectNulls&&(b.low===null||b.high===null))b.y=null;else if(b.low===null&&b.high!==null)b.y=b.high});t.prototype.getSegments.call(this)},translate:function(){var a=this.yAxis;g.area.prototype.translate.apply(this);
+s(this.points,function(b){var c=b.low,d=b.high,e=b.plotY;d===null&&c===null?b.y=null:c===null?(b.plotLow=b.plotY=null,b.plotHigh=a.translate(d,0,1,0,1)):d===null?(b.plotLow=e,b.plotHigh=null):(b.plotLow=e,b.plotHigh=a.translate(d,0,1,0,1))})},getSegmentPath:function(a){var b,c=[],d=a.length,e=t.prototype.getSegmentPath,f,h;h=this.options;var j=h.step;for(b=HighchartsAdapter.grep(a,function(a){return a.plotLow!==null});d--;)f=a[d],f.plotHigh!==null&&c.push({plotX:f.plotX,plotY:f.plotHigh});a=e.call(this,
+b);if(j)j===!0&&(j="left"),h.step={left:"right",center:"center",right:"left"}[j];c=e.call(this,c);h.step=j;h=[].concat(a,c);c[0]="L";this.areaPath=this.areaPath.concat(a,c);return h},drawDataLabels:function(){var a=this.data,b=a.length,c,d=[],e=t.prototype,f=this.options.dataLabels,h=f.align,j,k=this.chart.inverted;if(f.enabled||this._hasPointLabels){for(c=b;c--;)if(j=a[c],j.y=j.high,j._plotY=j.plotY,j.plotY=j.plotHigh,d[c]=j.dataLabel,j.dataLabel=j.dataLabelUpper,j.below=!1,k){if(!h)f.align="left";
+f.x=f.xHigh}else f.y=f.yHigh;e.drawDataLabels&&e.drawDataLabels.apply(this,arguments);for(c=b;c--;)if(j=a[c],j.dataLabelUpper=j.dataLabel,j.dataLabel=d[c],j.y=j.low,j.plotY=j._plotY,j.below=!0,k){if(!h)f.align="right";f.x=f.xLow}else f.y=f.yLow;e.drawDataLabels&&e.drawDataLabels.apply(this,arguments)}f.align=h},alignDataLabel:function(){g.column.prototype.alignDataLabel.apply(this,arguments)},getSymbol:u,drawPoints:u});p.areasplinerange=q(p.arearange);g.areasplinerange=v(g.arearange,{type:"areasplinerange",
+getPointSpline:g.spline.prototype.getPointSpline});(function(){var a=g.column.prototype;p.columnrange=q(p.column,p.arearange,{lineWidth:1,pointRange:null});g.columnrange=v(g.arearange,{type:"columnrange",translate:function(){var b=this,c=b.yAxis,d;a.translate.apply(b);s(b.points,function(a){var f=a.shapeArgs,h=b.options.minPointLength,j;a.tooltipPos=null;a.plotHigh=d=c.translate(a.high,0,1,0,1);a.plotLow=a.plotY;j=d;a=a.plotY-d;a<h&&(h-=a,a+=h,j-=h/2);f.height=a;f.y=j})},trackerGroups:["group","dataLabelsGroup"],
+drawGraph:u,pointAttrToOptions:a.pointAttrToOptions,drawPoints:a.drawPoints,drawTracker:a.drawTracker,animate:a.animate,getColumnMetrics:a.getColumnMetrics})})();p.gauge=q(p.line,{dataLabels:{enabled:!0,defer:!1,y:15,borderWidth:1,borderColor:"silver",borderRadius:3,crop:!1,style:{fontWeight:"bold"},verticalAlign:"top",zIndex:2},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1});z={type:"gauge",pointClass:v(H,{setState:function(a){this.state=a}}),angular:!0,drawGraph:u,fixedBox:!0,forceDL:!0,
+trackerGroups:["group","dataLabelsGroup"],translate:function(){var a=this.yAxis,b=this.options,c=a.center;this.generatePoints();s(this.points,function(d){var e=q(b.dial,d.dial),f=x(o(e.radius,80))*c[2]/200,h=x(o(e.baseLength,70))*f/100,j=x(o(e.rearLength,10))*f/100,k=e.baseWidth||3,m=e.topWidth||1,i=b.overshoot,n=a.startAngleRad+a.translate(d.y,null,null,null,!0);i&&typeof i==="number"?(i=i/180*Math.PI,n=Math.max(a.startAngleRad-i,Math.min(a.endAngleRad+i,n))):b.wrap===!1&&(n=Math.max(a.startAngleRad,
+Math.min(a.endAngleRad,n)));n=n*180/Math.PI;d.shapeType="path";d.shapeArgs={d:e.path||["M",-j,-k/2,"L",h,-k/2,f,-m/2,f,m/2,h,k/2,-j,k/2,"z"],translateX:c[0],translateY:c[1],rotation:n};d.plotX=c[0];d.plotY=c[1]})},drawPoints:function(){var a=this,b=a.yAxis.center,c=a.pivot,d=a.options,e=d.pivot,f=a.chart.renderer;s(a.points,function(c){var b=c.graphic,k=c.shapeArgs,e=k.d,i=q(d.dial,c.dial);b?(b.animate(k),k.d=e):c.graphic=f[c.shapeType](k).attr({stroke:i.borderColor||"none","stroke-width":i.borderWidth||
+0,fill:i.backgroundColor||"black",rotation:k.rotation}).add(a.group)});c?c.animate({translateX:b[0],translateY:b[1]}):a.pivot=f.circle(0,0,o(e.radius,5)).attr({"stroke-width":e.borderWidth||0,stroke:e.borderColor||"silver",fill:e.backgroundColor||"black"}).translate(b[0],b[1]).add(a.group)},animate:function(a){var b=this;if(!a)s(b.points,function(a){var d=a.graphic;d&&(d.attr({rotation:b.yAxis.startAngleRad*180/Math.PI}),d.animate({rotation:a.shapeArgs.rotation},b.options.animation))}),b.animate=
+null},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);t.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(a,b){t.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();o(b,!0)&&this.chart.redraw()},drawTracker:z&&z.drawTrackerPoint};g.gauge=v(g.line,z);p.boxplot=q(p.column,{fillColor:"#FFFFFF",lineWidth:1,medianWidth:2,states:{hover:{brightness:-0.3}},threshold:null,
+tooltip:{pointFormat:'<span style="color:{series.color}">●</span> <b> {series.name}</b><br/>Maximum: {point.high}<br/>Upper quartile: {point.q3}<br/>Median: {point.median}<br/>Lower quartile: {point.q1}<br/>Minimum: {point.low}<br/>'},whiskerLength:"50%",whiskerWidth:2});g.boxplot=v(g.column,{type:"boxplot",pointArrayMap:["low","q1","median","q3","high"],toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:"high",pointAttrToOptions:{fill:"fillColor",stroke:"color","stroke-width":"lineWidth"},
+drawDataLabels:u,translate:function(){var a=this.yAxis,b=this.pointArrayMap;g.column.prototype.translate.apply(this);s(this.points,function(c){s(b,function(b){c[b]!==null&&(c[b+"Plot"]=a.translate(c[b],0,1,0,1))})})},drawPoints:function(){var a=this,b=a.points,c=a.options,d=a.chart.renderer,e,f,h,j,k,m,i,n,g,l,p,I,r,q,J,u,v,t,w,x,z,y,E=a.doQuartiles!==!1,B=parseInt(a.options.whiskerLength,10)/100;s(b,function(b){g=b.graphic;z=b.shapeArgs;p={};q={};u={};y=b.color||a.color;if(b.plotY!==C)if(e=b.pointAttr[b.selected?
+"selected":""],v=z.width,t=A(z.x),w=t+v,x=D(v/2),f=A(E?b.q1Plot:b.lowPlot),h=A(E?b.q3Plot:b.lowPlot),j=A(b.highPlot),k=A(b.lowPlot),p.stroke=b.stemColor||c.stemColor||y,p["stroke-width"]=o(b.stemWidth,c.stemWidth,c.lineWidth),p.dashstyle=b.stemDashStyle||c.stemDashStyle,q.stroke=b.whiskerColor||c.whiskerColor||y,q["stroke-width"]=o(b.whiskerWidth,c.whiskerWidth,c.lineWidth),u.stroke=b.medianColor||c.medianColor||y,u["stroke-width"]=o(b.medianWidth,c.medianWidth,c.lineWidth),u["stroke-linecap"]="round",
+i=p["stroke-width"]%2/2,n=t+x+i,l=["M",n,h,"L",n,j,"M",n,f,"L",n,k],E&&(i=e["stroke-width"]%2/2,n=A(n)+i,f=A(f)+i,h=A(h)+i,t+=i,w+=i,I=["M",t,h,"L",t,f,"L",w,f,"L",w,h,"L",t,h,"z"]),B&&(i=q["stroke-width"]%2/2,j+=i,k+=i,r=["M",n-x*B,j,"L",n+x*B,j,"M",n-x*B,k,"L",n+x*B,k]),i=u["stroke-width"]%2/2,m=D(b.medianPlot)+i,J=["M",t,m,"L",w,m],g)b.stem.animate({d:l}),B&&b.whiskers.animate({d:r}),E&&b.box.animate({d:I}),b.medianShape.animate({d:J});else{b.graphic=g=d.g().add(a.group);b.stem=d.path(l).attr(p).add(g);
+if(B)b.whiskers=d.path(r).attr(q).add(g);if(E)b.box=d.path(I).attr(e).add(g);b.medianShape=d.path(J).attr(u).add(g)}})}});p.errorbar=q(p.boxplot,{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'<span style="color:{series.color}">●</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'},whiskerWidth:null});g.errorbar=v(g.boxplot,{type:"errorbar",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:g.arearange?
+g.arearange.prototype.drawDataLabels:u,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||g.column.prototype.getColumnMetrics.call(this)}});p.waterfall=q(p.column,{lineWidth:1,lineColor:"#333",dashStyle:"dot",borderColor:"#333",states:{hover:{lineWidthPlus:0}}});g.waterfall=v(g.column,{type:"waterfall",upColorProp:"fill",pointArrayMap:["low","y"],pointValKey:"y",init:function(a,b){b.stacking=!0;g.column.prototype.init.call(this,a,b)},translate:function(){var a=
+this.yAxis,b,c,d,e,f,h,j,k,m,i;b=this.options.threshold;g.column.prototype.translate.apply(this);k=m=b;d=this.points;for(c=0,b=d.length;c<b;c++){e=d[c];f=e.shapeArgs;h=this.getStack(c);i=h.points[this.index+","+c];if(isNaN(e.y))e.y=this.yData[c];j=N(k,k+e.y)+i[0];f.y=a.translate(j,0,1);e.isSum?(f.y=a.translate(i[1],0,1),f.height=a.translate(i[0],0,1)-f.y):e.isIntermediateSum?(f.y=a.translate(i[1],0,1),f.height=a.translate(m,0,1)-f.y,m=i[1]):k+=h.total;f.height<0&&(f.y+=f.height,f.height*=-1);e.plotY=
+f.y=D(f.y)-this.borderWidth%2/2;f.height=N(D(f.height),0.001);e.yBottom=f.y+f.height;f=e.plotY+(e.negative?f.height:0);this.chart.inverted?e.tooltipPos[0]=a.len-f:e.tooltipPos[1]=f}},processData:function(a){var b=this.yData,c=this.points,d,e=b.length,f,h,j,k,m,i;h=f=j=k=this.options.threshold||0;for(i=0;i<e;i++)m=b[i],d=c&&c[i]?c[i]:{},m==="sum"||d.isSum?b[i]=h:m==="intermediateSum"||d.isIntermediateSum?b[i]=f:(h+=m,f+=m),j=Math.min(h,j),k=Math.max(h,k);t.prototype.processData.call(this,a);this.dataMin=
+j;this.dataMax=k},toYData:function(a){if(a.isSum)return"sum";else if(a.isIntermediateSum)return"intermediateSum";return a.y},getAttribs:function(){g.column.prototype.getAttribs.apply(this,arguments);var a=this.options,b=a.states,c=a.upColor||this.color,a=l.Color(c).brighten(0.1).get(),d=q(this.pointAttr),e=this.upColorProp;d[""][e]=c;d.hover[e]=b.hover.upColor||a;d.select[e]=b.select.upColor||c;s(this.points,function(a){if(a.y>0&&!a.color)a.pointAttr=d,a.color=c})},getGraphPath:function(){var a=this.data,
+b=a.length,c=D(this.options.lineWidth+this.borderWidth)%2/2,d=[],e,f,h;for(h=1;h<b;h++)f=a[h].shapeArgs,e=a[h-1].shapeArgs,f=["M",e.x+e.width,e.y+c,"L",f.x,e.y+c],a[h-1].y<0&&(f[2]+=e.height,f[5]+=e.height),d=d.concat(f);return d},getExtremes:u,getStack:function(a){var b=this.yAxis.stacks,c=this.stackKey;this.processedYData[a]<this.options.threshold&&(c="-"+c);return b[c][a]},drawGraph:t.prototype.drawGraph});p.bubble=q(p.scatter,{dataLabels:{formatter:function(){return this.point.z},inside:!0,style:{color:"white",
+textShadow:"0px 0px 3px black"},verticalAlign:"middle"},marker:{lineColor:null,lineWidth:1},minSize:8,maxSize:"20%",states:{hover:{halo:{size:5}}},tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0});z=v(H,{haloPath:function(){return H.prototype.haloPath.call(this,this.shapeArgs.r+this.series.options.states.hover.halo.size)}});g.bubble=v(g.scatter,{type:"bubble",pointClass:z,pointArrayMap:["y","z"],parallelArrays:["x","y","z"],trackerGroups:["group","dataLabelsGroup"],
+bubblePadding:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor"},applyOpacity:function(a){var b=this.options.marker,c=o(b.fillOpacity,0.5),a=a||b.fillColor||this.color;c!==1&&(a=U(a).setOpacity(c).get("rgba"));return a},convertAttribs:function(){var a=t.prototype.convertAttribs.apply(this,arguments);a.fill=this.applyOpacity(a.fill);return a},getRadii:function(a,b,c,d){var e,f,h,j=this.zData,k=[],m=this.options.sizeBy!=="width";for(f=0,e=j.length;f<e;f++)h=b-a,h=
+h>0?(j[f]-a)/(b-a):0.5,m&&h>=0&&(h=Math.sqrt(h)),k.push(w.ceil(c+h*(d-c))/2);this.radii=k},animate:function(a){var b=this.options.animation;if(!a)s(this.points,function(a){var d=a.graphic,a=a.shapeArgs;d&&a&&(d.attr("r",1),d.animate({r:a.r},b))}),this.animate=null},translate:function(){var a,b=this.data,c,d,e=this.radii;g.scatter.prototype.translate.call(this);for(a=b.length;a--;)c=b[a],d=e?e[a]:0,c.negative=c.z<(this.options.zThreshold||0),d>=this.minPxSize/2?(c.shapeType="circle",c.shapeArgs={x:c.plotX,
+y:c.plotY,r:d},c.dlBox={x:c.plotX-d,y:c.plotY-d,width:2*d,height:2*d}):c.shapeArgs=c.plotY=c.dlBox=C},drawLegendSymbol:function(a,b){var c=x(a.itemStyle.fontSize)/2;b.legendSymbol=this.chart.renderer.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker=!0},drawPoints:g.column.prototype.drawPoints,alignDataLabel:g.column.prototype.alignDataLabel});M.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,d=0,e=b,f=this.isXAxis,h=f?"xData":"yData",j=this.min,
+k={},m=w.min(c.plotWidth,c.plotHeight),i=Number.MAX_VALUE,n=-Number.MAX_VALUE,g=this.max-j,l=b/g,p=[];this.tickPositions&&(s(this.series,function(b){var h=b.options;if(b.bubblePadding&&(b.visible||!c.options.chart.ignoreHiddenSeries))if(a.allowZoomOutside=!0,p.push(b),f)s(["minSize","maxSize"],function(a){var b=h[a],f=/%$/.test(b),b=x(b);k[a]=f?m*b/100:b}),b.minPxSize=k.minSize,b=b.zData,b.length&&(i=o(h.zMin,w.min(i,w.max(P(b),h.displayNegative===!1?h.zThreshold:-Number.MAX_VALUE))),n=o(h.zMax,w.max(n,
+Q(b))))}),s(p,function(a){var b=a[h],c=b.length,m;f&&a.getRadii(i,n,k.minSize,k.maxSize);if(g>0)for(;c--;)typeof b[c]==="number"&&(m=a.radii[c],d=Math.min((b[c]-j)*l-m,d),e=Math.max((b[c]-j)*l+m,e))}),p.length&&g>0&&o(this.options.min,this.userMin)===C&&o(this.options.max,this.userMax)===C&&(e-=b,l*=(b+d-e)/b,this.min+=d/l,this.max+=e/l))};(function(){function a(a,b,c){a.call(this,b,c);if(this.chart.polar)this.closeSegment=function(a){var b=this.xAxis.center;a.push("L",b[0],b[1])},this.closedStacks=
+!0}function b(a,b){var c=this.chart,d=this.options.animation,e=this.group,i=this.markerGroup,n=this.xAxis.center,g=c.plotLeft,l=c.plotTop;if(c.polar){if(c.renderer.isSVG)d===!0&&(d={}),b?(c={translateX:n[0]+g,translateY:n[1]+l,scaleX:0.001,scaleY:0.001},e.attr(c),i&&i.attr(c)):(c={translateX:g,translateY:l,scaleX:1,scaleY:1},e.animate(c,d),i&&i.animate(c,d),this.animate=null)}else a.call(this,b)}var c=t.prototype,d=S.prototype,e;c.toXY=function(a){var b,c=this.chart,d=a.plotX;b=a.plotY;a.rectPlotX=
+d;a.rectPlotY=b;d=(d/Math.PI*180+this.xAxis.pane.options.startAngle)%360;d<0&&(d+=360);a.clientX=d;b=this.xAxis.postTranslate(a.plotX,this.yAxis.len-b);a.plotX=a.polarPlotX=b.x-c.plotLeft;a.plotY=a.polarPlotY=b.y-c.plotTop};c.orderTooltipPoints=function(a){if(this.chart.polar&&(a.sort(function(a,b){return a.clientX-b.clientX}),a[0]))a[0].wrappedClientX=a[0].clientX+360,a.push(a[0])};g.area&&r(g.area.prototype,"init",a);g.areaspline&&r(g.areaspline.prototype,"init",a);g.spline&&r(g.spline.prototype,
+"getPointSpline",function(a,b,c,d){var e,i,n,g,l,p,o;if(this.chart.polar){e=c.plotX;i=c.plotY;a=b[d-1];n=b[d+1];this.connectEnds&&(a||(a=b[b.length-2]),n||(n=b[1]));if(a&&n)g=a.plotX,l=a.plotY,b=n.plotX,p=n.plotY,g=(1.5*e+g)/2.5,l=(1.5*i+l)/2.5,n=(1.5*e+b)/2.5,o=(1.5*i+p)/2.5,b=Math.sqrt(Math.pow(g-e,2)+Math.pow(l-i,2)),p=Math.sqrt(Math.pow(n-e,2)+Math.pow(o-i,2)),g=Math.atan2(l-i,g-e),l=Math.atan2(o-i,n-e),o=Math.PI/2+(g+l)/2,Math.abs(g-o)>Math.PI/2&&(o-=Math.PI),g=e+Math.cos(o)*b,l=i+Math.sin(o)*
+b,n=e+Math.cos(Math.PI+o)*p,o=i+Math.sin(Math.PI+o)*p,c.rightContX=n,c.rightContY=o;d?(c=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,g||e,l||i,e,i],a.rightContX=a.rightContY=null):c=["M",e,i]}else c=a.call(this,b,c,d);return c});r(c,"translate",function(a){a.call(this);if(this.chart.polar&&!this.preventPostTranslate)for(var a=this.points,b=a.length;b--;)this.toXY(a[b])});r(c,"getSegmentPath",function(a,b){var c=this.points;if(this.chart.polar&&this.options.connectEnds!==!1&&b[b.length-1]===c[c.length-
+1]&&c[0].y!==null)this.connectEnds=!0,b=[].concat(b,[c[0]]);return a.call(this,b)});r(c,"animate",b);r(c,"setTooltipPoints",function(a,b){this.chart.polar&&F(this.xAxis,{tooltipLen:360});return a.call(this,b)});if(g.column)e=g.column.prototype,r(e,"animate",b),r(e,"translate",function(a){var b=this.xAxis,c=this.yAxis.len,d=b.center,e=b.startAngleRad,i=this.chart.renderer,g,l;this.preventPostTranslate=!0;a.call(this);if(b.isRadial){b=this.points;for(l=b.length;l--;)g=b[l],a=g.barX+e,g.shapeType="path",
+g.shapeArgs={d:i.symbols.arc(d[0],d[1],c-g.plotY,null,{start:a,end:a+g.pointWidth,innerR:c-o(g.yBottom,c)})},this.toXY(g),g.tooltipPos=[g.plotX,g.plotY],g.ttBelow=g.plotY>d[1]}}),r(e,"alignDataLabel",function(a,b,d,e,g,i){if(this.chart.polar){a=b.rectPlotX/Math.PI*180;if(e.align===null)e.align=a>20&&a<160?"left":a>200&&a<340?"right":"center";if(e.verticalAlign===null)e.verticalAlign=a<45||a>315?"bottom":a>135&&a<225?"top":"middle";c.alignDataLabel.call(this,b,d,e,g,i)}else a.call(this,b,d,e,g,i)});
+r(d,"getIndex",function(a,b){var c,d=this.chart,e;d.polar?(e=d.xAxis[0].center,c=b.chartX-e[0]-d.plotLeft,d=b.chartY-e[1]-d.plotTop,c=180-Math.round(Math.atan2(c,d)/Math.PI*180)):c=a.call(this,b);return c});r(d,"getCoordinates",function(a,b){var c=this.chart,d={xAxis:[],yAxis:[]};c.polar?s(c.axes,function(a){var e=a.isXAxis,f=a.center,g=b.chartX-f[0]-c.plotLeft,f=b.chartY-f[1]-c.plotTop;d[e?"xAxis":"yAxis"].push({axis:a,value:a.translate(e?Math.PI-Math.atan2(g,f):Math.sqrt(Math.pow(g,2)+Math.pow(f,
+2)),!0)})}):d=a.call(this,b);return d})})()})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-more.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-more.src.js
new file mode 100644
index 0000000..255e2ac
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts-more.src.js
@@ -0,0 +1,2576 @@
+// ==ClosureCompiler==
+// @compilation_level SIMPLE_OPTIMIZATIONS
+
+/**
+ * @license Highcharts JS v4.0.3 (2014-07-03)
+ *
+ * (c) 2009-2014 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts, HighchartsAdapter, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console */
+
+(function (Highcharts, UNDEFINED) {
+var arrayMin = Highcharts.arrayMin,
+	arrayMax = Highcharts.arrayMax,
+	each = Highcharts.each,
+	extend = Highcharts.extend,
+	merge = Highcharts.merge,
+	map = Highcharts.map,
+	pick = Highcharts.pick,
+	pInt = Highcharts.pInt,
+	defaultPlotOptions = Highcharts.getOptions().plotOptions,
+	seriesTypes = Highcharts.seriesTypes,
+	extendClass = Highcharts.extendClass,
+	splat = Highcharts.splat,
+	wrap = Highcharts.wrap,
+	Axis = Highcharts.Axis,
+	Tick = Highcharts.Tick,
+	Point = Highcharts.Point,
+	Pointer = Highcharts.Pointer,
+	CenteredSeriesMixin = Highcharts.CenteredSeriesMixin,
+	TrackerMixin = Highcharts.TrackerMixin,
+	Series = Highcharts.Series,
+	math = Math,
+	mathRound = math.round,
+	mathFloor = math.floor,
+	mathMax = math.max,
+	Color = Highcharts.Color,
+	noop = function () {};/**
+ * The Pane object allows options that are common to a set of X and Y axes.
+ * 
+ * In the future, this can be extended to basic Highcharts and Highstock.
+ */
+function Pane(options, chart, firstAxis) {
+	this.init.call(this, options, chart, firstAxis);
+}
+
+// Extend the Pane prototype
+extend(Pane.prototype, {
+	
+	/**
+	 * Initiate the Pane object
+	 */
+	init: function (options, chart, firstAxis) {
+		var pane = this,
+			backgroundOption,
+			defaultOptions = pane.defaultOptions;
+		
+		pane.chart = chart;
+		
+		// Set options
+		if (chart.angular) { // gauges
+			defaultOptions.background = {}; // gets extended by this.defaultBackgroundOptions
+		}
+		pane.options = options = merge(defaultOptions, options);
+		
+		backgroundOption = options.background;
+		
+		// To avoid having weighty logic to place, update and remove the backgrounds,
+		// push them to the first axis' plot bands and borrow the existing logic there.
+		if (backgroundOption) {
+			each([].concat(splat(backgroundOption)).reverse(), function (config) {
+				var backgroundColor = config.backgroundColor; // if defined, replace the old one (specific for gradients)
+				config = merge(pane.defaultBackgroundOptions, config);
+				if (backgroundColor) {
+					config.backgroundColor = backgroundColor;
+				}
+				config.color = config.backgroundColor; // due to naming in plotBands
+				firstAxis.options.plotBands.unshift(config);
+			});
+		}
+	},
+	
+	/**
+	 * The default options object
+	 */
+	defaultOptions: {
+		// background: {conditional},
+		center: ['50%', '50%'],
+		size: '85%',
+		startAngle: 0
+		//endAngle: startAngle + 360
+	},	
+	
+	/**
+	 * The default background options
+	 */
+	defaultBackgroundOptions: {
+		shape: 'circle',
+		borderWidth: 1,
+		borderColor: 'silver',
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#FFF'],
+				[1, '#DDD']
+			]
+		},
+		from: -Number.MAX_VALUE, // corrected to axis min
+		innerRadius: 0,
+		to: Number.MAX_VALUE, // corrected to axis max
+		outerRadius: '105%'
+	}
+	
+});
+var axisProto = Axis.prototype,
+	tickProto = Tick.prototype;
+	
+/**
+ * Augmented methods for the x axis in order to hide it completely, used for the X axis in gauges
+ */
+var hiddenAxisMixin = {
+	getOffset: noop,
+	redraw: function () {
+		this.isDirty = false; // prevent setting Y axis dirty
+	},
+	render: function () {
+		this.isDirty = false; // prevent setting Y axis dirty
+	},
+	setScale: noop,
+	setCategories: noop,
+	setTitle: noop
+};
+
+/**
+ * Augmented methods for the value axis
+ */
+/*jslint unparam: true*/
+var radialAxisMixin = {
+	isRadial: true,
+	
+	/**
+	 * The default options extend defaultYAxisOptions
+	 */
+	defaultRadialGaugeOptions: {
+		labels: {
+			align: 'center',
+			x: 0,
+			y: null // auto
+		},
+		minorGridLineWidth: 0,
+		minorTickInterval: 'auto',
+		minorTickLength: 10,
+		minorTickPosition: 'inside',
+		minorTickWidth: 1,
+		tickLength: 10,
+		tickPosition: 'inside',
+		tickWidth: 2,
+		title: {
+			rotation: 0
+		},
+		zIndex: 2 // behind dials, points in the series group
+	},
+	
+	// Circular axis around the perimeter of a polar chart
+	defaultRadialXOptions: {
+		gridLineWidth: 1, // spokes
+		labels: {
+			align: null, // auto
+			distance: 15,
+			x: 0,
+			y: null // auto
+		},
+		maxPadding: 0,
+		minPadding: 0,
+		showLastLabel: false, 
+		tickLength: 0
+	},
+	
+	// Radial axis, like a spoke in a polar chart
+	defaultRadialYOptions: {
+		gridLineInterpolation: 'circle',
+		labels: {
+			align: 'right',
+			x: -3,
+			y: -2
+		},
+		showLastLabel: false,
+		title: {
+			x: 4,
+			text: null,
+			rotation: 90
+		}
+	},
+	
+	/**
+	 * Merge and set options
+	 */
+	setOptions: function (userOptions) {
+		
+		var options = this.options = merge(
+			this.defaultOptions,
+			this.defaultRadialOptions,
+			userOptions
+		);
+
+		// Make sure the plotBands array is instanciated for each Axis (#2649)
+		if (!options.plotBands) {
+			options.plotBands = [];
+		}
+		
+	},
+	
+	/**
+	 * Wrap the getOffset method to return zero offset for title or labels in a radial 
+	 * axis
+	 */
+	getOffset: function () {
+		// Call the Axis prototype method (the method we're in now is on the instance)
+		axisProto.getOffset.call(this);
+		
+		// Title or label offsets are not counted
+		this.chart.axisOffset[this.side] = 0;
+		
+		// Set the center array
+		this.center = this.pane.center = CenteredSeriesMixin.getCenter.call(this.pane);
+	},
+
+
+	/**
+	 * Get the path for the axis line. This method is also referenced in the getPlotLinePath
+	 * method.
+	 */
+	getLinePath: function (lineWidth, radius) {
+		var center = this.center;
+		radius = pick(radius, center[2] / 2 - this.offset);
+		
+		return this.chart.renderer.symbols.arc(
+			this.left + center[0],
+			this.top + center[1],
+			radius,
+			radius, 
+			{
+				start: this.startAngleRad,
+				end: this.endAngleRad,
+				open: true,
+				innerR: 0
+			}
+		);
+	},
+
+	/**
+	 * Override setAxisTranslation by setting the translation to the difference
+	 * in rotation. This allows the translate method to return angle for 
+	 * any given value.
+	 */
+	setAxisTranslation: function () {
+		
+		// Call uber method		
+		axisProto.setAxisTranslation.call(this);
+			
+		// Set transA and minPixelPadding
+		if (this.center) { // it's not defined the first time
+			if (this.isCircular) {
+				
+				this.transA = (this.endAngleRad - this.startAngleRad) / 
+					((this.max - this.min) || 1);
+					
+				
+			} else { 
+				this.transA = (this.center[2] / 2) / ((this.max - this.min) || 1);
+			}
+			
+			if (this.isXAxis) {
+				this.minPixelPadding = this.transA * this.minPointOffset;
+			} else {
+				// This is a workaround for regression #2593, but categories still don't position correctly.
+				// TODO: Implement true handling of Y axis categories on gauges.
+				this.minPixelPadding = 0; 
+			}
+		}
+	},
+	
+	/**
+	 * In case of auto connect, add one closestPointRange to the max value right before
+	 * tickPositions are computed, so that ticks will extend passed the real max.
+	 */
+	beforeSetTickPositions: function () {
+		if (this.autoConnect) {
+			this.max += (this.categories && 1) || this.pointRange || this.closestPointRange || 0; // #1197, #2260
+		}
+	},
+	
+	/**
+	 * Override the setAxisSize method to use the arc's circumference as length. This
+	 * allows tickPixelInterval to apply to pixel lengths along the perimeter
+	 */
+	setAxisSize: function () {
+		
+		axisProto.setAxisSize.call(this);
+
+		if (this.isRadial) {
+
+			// Set the center array
+			this.center = this.pane.center = Highcharts.CenteredSeriesMixin.getCenter.call(this.pane);
+
+			// The sector is used in Axis.translate to compute the translation of reversed axis points (#2570)
+			if (this.isCircular) {
+				this.sector = this.endAngleRad - this.startAngleRad;	
+			}
+			
+			// Axis len is used to lay out the ticks
+			this.len = this.width = this.height = this.center[2] * pick(this.sector, 1) / 2;
+
+
+		}
+	},
+	
+	/**
+	 * Returns the x, y coordinate of a point given by a value and a pixel distance
+	 * from center
+	 */
+	getPosition: function (value, length) {
+		return this.postTranslate(
+			this.isCircular ? this.translate(value) : 0, // #2848
+			pick(this.isCircular ? length : this.translate(value), this.center[2] / 2) - this.offset
+		);		
+	},
+	
+	/**
+	 * Translate from intermediate plotX (angle), plotY (axis.len - radius) to final chart coordinates. 
+	 */
+	postTranslate: function (angle, radius) {
+		
+		var chart = this.chart,
+			center = this.center;
+			
+		angle = this.startAngleRad + angle;
+
+		return {
+			x: chart.plotLeft + center[0] + Math.cos(angle) * radius,
+			y: chart.plotTop + center[1] + Math.sin(angle) * radius
+		}; 
+		
+	},
+	
+	/**
+	 * Find the path for plot bands along the radial axis
+	 */
+	getPlotBandPath: function (from, to, options) {
+		var center = this.center,
+			startAngleRad = this.startAngleRad,
+			fullRadius = center[2] / 2,
+			radii = [
+				pick(options.outerRadius, '100%'),
+				options.innerRadius,
+				pick(options.thickness, 10)
+			],
+			percentRegex = /%$/,
+			start,
+			end,
+			open,
+			isCircular = this.isCircular, // X axis in a polar chart
+			ret;
+			
+		// Polygonal plot bands
+		if (this.options.gridLineInterpolation === 'polygon') {
+			ret = this.getPlotLinePath(from).concat(this.getPlotLinePath(to, true));
+		
+		// Circular grid bands
+		} else {
+			
+			// Plot bands on Y axis (radial axis) - inner and outer radius depend on to and from
+			if (!isCircular) {
+				radii[0] = this.translate(from);
+				radii[1] = this.translate(to);
+			}
+			
+			// Convert percentages to pixel values
+			radii = map(radii, function (radius) {
+				if (percentRegex.test(radius)) {
+					radius = (pInt(radius, 10) * fullRadius) / 100;
+				}
+				return radius;
+			});
+			
+			// Handle full circle
+			if (options.shape === 'circle' || !isCircular) {
+				start = -Math.PI / 2;
+				end = Math.PI * 1.5;
+				open = true;
+			} else {
+				start = startAngleRad + this.translate(from);
+				end = startAngleRad + this.translate(to);
+			}
+		
+		
+			ret = this.chart.renderer.symbols.arc(
+				this.left + center[0],
+				this.top + center[1],
+				radii[0],
+				radii[0],
+				{
+					start: start,
+					end: end,
+					innerR: pick(radii[1], radii[0] - radii[2]),
+					open: open
+				}
+			);
+		}
+		 
+		return ret;
+	},
+	
+	/**
+	 * Find the path for plot lines perpendicular to the radial axis.
+	 */
+	getPlotLinePath: function (value, reverse) {
+		var axis = this,
+			center = axis.center,
+			chart = axis.chart,
+			end = axis.getPosition(value),
+			xAxis,
+			xy,
+			tickPositions,
+			ret;
+		
+		// Spokes
+		if (axis.isCircular) {
+			ret = ['M', center[0] + chart.plotLeft, center[1] + chart.plotTop, 'L', end.x, end.y];
+		
+		// Concentric circles			
+		} else if (axis.options.gridLineInterpolation === 'circle') {
+			value = axis.translate(value);
+			if (value) { // a value of 0 is in the center
+				ret = axis.getLinePath(0, value);
+			}
+		// Concentric polygons 
+		} else {
+			// Find the X axis in the same pane
+			each(chart.xAxis, function (a) {
+				if (a.pane === axis.pane) {
+					xAxis = a;
+				}
+			});
+			ret = [];
+			value = axis.translate(value);
+			tickPositions = xAxis.tickPositions;
+			if (xAxis.autoConnect) {
+				tickPositions = tickPositions.concat([tickPositions[0]]);
+			}
+			// Reverse the positions for concatenation of polygonal plot bands
+			if (reverse) {
+				tickPositions = [].concat(tickPositions).reverse();
+			}
+				
+			each(tickPositions, function (pos, i) {
+				xy = xAxis.getPosition(pos, value);
+				ret.push(i ? 'L' : 'M', xy.x, xy.y);
+			});
+			
+		}
+		return ret;
+	},
+	
+	/**
+	 * Find the position for the axis title, by default inside the gauge
+	 */
+	getTitlePosition: function () {
+		var center = this.center,
+			chart = this.chart,
+			titleOptions = this.options.title;
+		
+		return { 
+			x: chart.plotLeft + center[0] + (titleOptions.x || 0), 
+			y: chart.plotTop + center[1] - ({ high: 0.5, middle: 0.25, low: 0 }[titleOptions.align] * 
+				center[2]) + (titleOptions.y || 0)  
+		};
+	}
+	
+};
+/*jslint unparam: false*/
+
+/**
+ * Override axisProto.init to mix in special axis instance functions and function overrides
+ */
+wrap(axisProto, 'init', function (proceed, chart, userOptions) {
+	var axis = this,
+		angular = chart.angular,
+		polar = chart.polar,
+		isX = userOptions.isX,
+		isHidden = angular && isX,
+		isCircular,
+		startAngleRad,
+		endAngleRad,
+		options,
+		chartOptions = chart.options,
+		paneIndex = userOptions.pane || 0,
+		pane,
+		paneOptions;
+		
+	// Before prototype.init
+	if (angular) {
+		extend(this, isHidden ? hiddenAxisMixin : radialAxisMixin);
+		isCircular =  !isX;
+		if (isCircular) {
+			this.defaultRadialOptions = this.defaultRadialGaugeOptions;
+		}
+		
+	} else if (polar) {
+		//extend(this, userOptions.isX ? radialAxisMixin : radialAxisMixin);
+		extend(this, radialAxisMixin);
+		isCircular = isX;
+		this.defaultRadialOptions = isX ? this.defaultRadialXOptions : merge(this.defaultYAxisOptions, this.defaultRadialYOptions);
+		
+	}
+	
+	// Run prototype.init
+	proceed.call(this, chart, userOptions);
+	
+	if (!isHidden && (angular || polar)) {
+		options = this.options;
+		
+		// Create the pane and set the pane options.
+		if (!chart.panes) {
+			chart.panes = [];
+		}
+		this.pane = pane = chart.panes[paneIndex] = chart.panes[paneIndex] || new Pane(
+			splat(chartOptions.pane)[paneIndex],
+			chart,
+			axis
+		);
+		paneOptions = pane.options;
+		
+			
+		// Disable certain features on angular and polar axes
+		chart.inverted = false;
+		chartOptions.chart.zoomType = null;
+		
+		// Start and end angle options are
+		// given in degrees relative to top, while internal computations are
+		// in radians relative to right (like SVG).
+		this.startAngleRad = startAngleRad = (paneOptions.startAngle - 90) * Math.PI / 180;
+		this.endAngleRad = endAngleRad = (pick(paneOptions.endAngle, paneOptions.startAngle + 360)  - 90) * Math.PI / 180;
+		this.offset = options.offset || 0;
+		
+		this.isCircular = isCircular;
+		
+		// Automatically connect grid lines?
+		if (isCircular && userOptions.max === UNDEFINED && endAngleRad - startAngleRad === 2 * Math.PI) {
+			this.autoConnect = true;
+		}
+	}
+	
+});
+
+/**
+ * Add special cases within the Tick class' methods for radial axes.
+ */	
+wrap(tickProto, 'getPosition', function (proceed, horiz, pos, tickmarkOffset, old) {
+	var axis = this.axis;
+	
+	return axis.getPosition ? 
+		axis.getPosition(pos) :
+		proceed.call(this, horiz, pos, tickmarkOffset, old);	
+});
+
+/**
+ * Wrap the getLabelPosition function to find the center position of the label
+ * based on the distance option
+ */	
+wrap(tickProto, 'getLabelPosition', function (proceed, x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {
+	var axis = this.axis,
+		optionsY = labelOptions.y,
+		ret,
+		align = labelOptions.align,
+		angle = ((axis.translate(this.pos) + axis.startAngleRad + Math.PI / 2) / Math.PI * 180) % 360;
+
+	if (axis.isRadial) {
+		ret = axis.getPosition(this.pos, (axis.center[2] / 2) + pick(labelOptions.distance, -25));
+		
+		// Automatically rotated
+		if (labelOptions.rotation === 'auto') {
+			label.attr({ 
+				rotation: angle
+			});
+		
+		// Vertically centered
+		} else if (optionsY === null) {
+			optionsY = axis.chart.renderer.fontMetrics(label.styles.fontSize).b - label.getBBox().height / 2;
+		}
+		
+		// Automatic alignment
+		if (align === null) {
+			if (axis.isCircular) {
+				if (angle > 20 && angle < 160) {
+					align = 'left'; // right hemisphere
+				} else if (angle > 200 && angle < 340) {
+					align = 'right'; // left hemisphere
+				} else {
+					align = 'center'; // top or bottom
+				}
+			} else {
+				align = 'center';
+			}
+			label.attr({
+				align: align
+			});
+		}
+		
+		ret.x += labelOptions.x;
+		ret.y += optionsY;
+		
+	} else {
+		ret = proceed.call(this, x, y, label, horiz, labelOptions, tickmarkOffset, index, step);
+	}
+	return ret;
+});
+
+/**
+ * Wrap the getMarkPath function to return the path of the radial marker
+ */
+wrap(tickProto, 'getMarkPath', function (proceed, x, y, tickLength, tickWidth, horiz, renderer) {
+	var axis = this.axis,
+		endPoint,
+		ret;
+		
+	if (axis.isRadial) {
+		endPoint = axis.getPosition(this.pos, axis.center[2] / 2 + tickLength);
+		ret = [
+			'M',
+			x,
+			y,
+			'L',
+			endPoint.x,
+			endPoint.y
+		];
+	} else {
+		ret = proceed.call(this, x, y, tickLength, tickWidth, horiz, renderer);
+	}
+	return ret;
+});/* 
+ * The AreaRangeSeries class
+ * 
+ */
+
+/**
+ * Extend the default options with map options
+ */
+defaultPlotOptions.arearange = merge(defaultPlotOptions.area, {
+	lineWidth: 1,
+	marker: null,
+	threshold: null,
+	tooltip: {
+		pointFormat: '<span style="color:{series.color}">\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'
+	},
+	trackByArea: true,
+	dataLabels: {
+		align: null,
+		verticalAlign: null,
+		xLow: 0,
+		xHigh: 0,
+		yLow: 0,
+		yHigh: 0	
+	},
+	states: {
+		hover: {
+			halo: false
+		}
+	}
+});
+
+/**
+ * Add the series type
+ */
+seriesTypes.arearange = extendClass(seriesTypes.area, {
+	type: 'arearange',
+	pointArrayMap: ['low', 'high'],
+	toYData: function (point) {
+		return [point.low, point.high];
+	},
+	pointValKey: 'low',
+	
+	/**
+	 * Extend getSegments to force null points if the higher value is null. #1703.
+	 */
+	getSegments: function () {
+		var series = this;
+
+		each(series.points, function (point) {
+			if (!series.options.connectNulls && (point.low === null || point.high === null)) {
+				point.y = null;
+			} else if (point.low === null && point.high !== null) {
+				point.y = point.high;
+			}
+		});
+		Series.prototype.getSegments.call(this);
+	},
+	
+	/**
+	 * Translate data points from raw values x and y to plotX and plotY
+	 */
+	translate: function () {
+		var series = this,
+			yAxis = series.yAxis;
+
+		seriesTypes.area.prototype.translate.apply(series);
+
+		// Set plotLow and plotHigh
+		each(series.points, function (point) {
+
+			var low = point.low,
+				high = point.high,
+				plotY = point.plotY;
+
+			if (high === null && low === null) {
+				point.y = null;
+			} else if (low === null) {
+				point.plotLow = point.plotY = null;
+				point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
+			} else if (high === null) {
+				point.plotLow = plotY;
+				point.plotHigh = null;
+			} else {
+				point.plotLow = plotY;
+				point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
+			}
+		});
+	},
+	
+	/**
+	 * Extend the line series' getSegmentPath method by applying the segment
+	 * path to both lower and higher values of the range
+	 */
+	getSegmentPath: function (segment) {
+		
+		var lowSegment,
+			highSegment = [],
+			i = segment.length,
+			baseGetSegmentPath = Series.prototype.getSegmentPath,
+			point,
+			linePath,
+			lowerPath,
+			options = this.options,
+			step = options.step,
+			higherPath;
+			
+		// Remove nulls from low segment
+		lowSegment = HighchartsAdapter.grep(segment, function (point) {
+			return point.plotLow !== null;
+		});
+		
+		// Make a segment with plotX and plotY for the top values
+		while (i--) {
+			point = segment[i];
+			if (point.plotHigh !== null) {
+				highSegment.push({
+					plotX: point.plotX,
+					plotY: point.plotHigh
+				});
+			}
+		}
+		
+		// Get the paths
+		lowerPath = baseGetSegmentPath.call(this, lowSegment);
+		if (step) {
+			if (step === true) {
+				step = 'left';
+			}
+			options.step = { left: 'right', center: 'center', right: 'left' }[step]; // swap for reading in getSegmentPath
+		}
+		higherPath = baseGetSegmentPath.call(this, highSegment);
+		options.step = step;
+		
+		// Create a line on both top and bottom of the range
+		linePath = [].concat(lowerPath, higherPath);
+		
+		// For the area path, we need to change the 'move' statement into 'lineTo' or 'curveTo'
+		higherPath[0] = 'L'; // this probably doesn't work for spline			
+		this.areaPath = this.areaPath.concat(lowerPath, higherPath);
+		
+		return linePath;
+	},
+	
+	/**
+	 * Extend the basic drawDataLabels method by running it for both lower and higher
+	 * values.
+	 */
+	drawDataLabels: function () {
+		
+		var data = this.data,
+			length = data.length,
+			i,
+			originalDataLabels = [],
+			seriesProto = Series.prototype,
+			dataLabelOptions = this.options.dataLabels,
+			align = dataLabelOptions.align,
+			point,
+			inverted = this.chart.inverted;
+			
+		if (dataLabelOptions.enabled || this._hasPointLabels) {
+			
+			// Step 1: set preliminary values for plotY and dataLabel and draw the upper labels
+			i = length;
+			while (i--) {
+				point = data[i];
+				
+				// Set preliminary values
+				point.y = point.high;
+				point._plotY = point.plotY;
+				point.plotY = point.plotHigh;
+				
+				// Store original data labels and set preliminary label objects to be picked up 
+				// in the uber method
+				originalDataLabels[i] = point.dataLabel;
+				point.dataLabel = point.dataLabelUpper;
+				
+				// Set the default offset
+				point.below = false;
+				if (inverted) {
+					if (!align) {
+						dataLabelOptions.align = 'left';
+					}
+					dataLabelOptions.x = dataLabelOptions.xHigh;								
+				} else {
+					dataLabelOptions.y = dataLabelOptions.yHigh;
+				}
+			}
+			
+			if (seriesProto.drawDataLabels) {
+				seriesProto.drawDataLabels.apply(this, arguments); // #1209
+			}
+			
+			// Step 2: reorganize and handle data labels for the lower values
+			i = length;
+			while (i--) {
+				point = data[i];
+				
+				// Move the generated labels from step 1, and reassign the original data labels
+				point.dataLabelUpper = point.dataLabel;
+				point.dataLabel = originalDataLabels[i];
+				
+				// Reset values
+				point.y = point.low;
+				point.plotY = point._plotY;
+				
+				// Set the default offset
+				point.below = true;
+				if (inverted) {
+					if (!align) {
+						dataLabelOptions.align = 'right';
+					}
+					dataLabelOptions.x = dataLabelOptions.xLow;
+				} else {
+					dataLabelOptions.y = dataLabelOptions.yLow;
+				}
+			}
+			if (seriesProto.drawDataLabels) {
+				seriesProto.drawDataLabels.apply(this, arguments);
+			}
+		}
+
+		dataLabelOptions.align = align;
+	
+	},
+	
+	alignDataLabel: function () {
+		seriesTypes.column.prototype.alignDataLabel.apply(this, arguments);
+	},
+	
+	getSymbol: noop,
+	
+	drawPoints: noop
+});/**
+ * The AreaSplineRangeSeries class
+ */
+
+defaultPlotOptions.areasplinerange = merge(defaultPlotOptions.arearange);
+
+/**
+ * AreaSplineRangeSeries object
+ */
+seriesTypes.areasplinerange = extendClass(seriesTypes.arearange, {
+	type: 'areasplinerange',
+	getPointSpline: seriesTypes.spline.prototype.getPointSpline
+});
+
+(function () {
+	
+	var colProto = seriesTypes.column.prototype;
+
+	/**
+	 * The ColumnRangeSeries class
+	 */
+	defaultPlotOptions.columnrange = merge(defaultPlotOptions.column, defaultPlotOptions.arearange, {
+		lineWidth: 1,
+		pointRange: null
+	});
+
+	/**
+	 * ColumnRangeSeries object
+	 */
+	seriesTypes.columnrange = extendClass(seriesTypes.arearange, {
+		type: 'columnrange',
+		/**
+		 * Translate data points from raw values x and y to plotX and plotY
+		 */
+		translate: function () {
+			var series = this,
+				yAxis = series.yAxis,
+				plotHigh;
+
+			colProto.translate.apply(series);
+
+			// Set plotLow and plotHigh
+			each(series.points, function (point) {
+				var shapeArgs = point.shapeArgs,
+					minPointLength = series.options.minPointLength,
+					heightDifference,
+					height,
+					y;
+
+				point.tooltipPos = null; // don't inherit from column
+				point.plotHigh = plotHigh = yAxis.translate(point.high, 0, 1, 0, 1);
+				point.plotLow = point.plotY;
+
+				// adjust shape
+				y = plotHigh;
+				height = point.plotY - plotHigh;
+
+				if (height < minPointLength) {
+					heightDifference = (minPointLength - height);
+					height += heightDifference;
+					y -= heightDifference / 2;
+				}
+				shapeArgs.height = height;
+				shapeArgs.y = y;
+			});
+		},
+		trackerGroups: ['group', 'dataLabelsGroup'],
+		drawGraph: noop,
+		pointAttrToOptions: colProto.pointAttrToOptions,
+		drawPoints: colProto.drawPoints,
+		drawTracker: colProto.drawTracker,
+		animate: colProto.animate,
+		getColumnMetrics: colProto.getColumnMetrics
+	});
+}());
+
+/* 
+ * The GaugeSeries class
+ */
+
+
+
+/**
+ * Extend the default options
+ */
+defaultPlotOptions.gauge = merge(defaultPlotOptions.line, {
+	dataLabels: {
+		enabled: true,
+		defer: false,
+		y: 15,
+		borderWidth: 1,
+		borderColor: 'silver',
+		borderRadius: 3,
+		crop: false,
+		style: {
+			fontWeight: 'bold'
+		},
+		verticalAlign: 'top',
+		zIndex: 2
+	},
+	dial: {
+		// radius: '80%',
+		// backgroundColor: 'black',
+		// borderColor: 'silver',
+		// borderWidth: 0,
+		// baseWidth: 3,
+		// topWidth: 1,
+		// baseLength: '70%' // of radius
+		// rearLength: '10%'
+	},
+	pivot: {
+		//radius: 5,
+		//borderWidth: 0
+		//borderColor: 'silver',
+		//backgroundColor: 'black'
+	},
+	tooltip: {
+		headerFormat: ''
+	},
+	showInLegend: false
+});
+
+/**
+ * Extend the point object
+ */
+var GaugePoint = extendClass(Point, {
+	/**
+	 * Don't do any hover colors or anything
+	 */
+	setState: function (state) {
+		this.state = state;
+	}
+});
+
+
+/**
+ * Add the series type
+ */
+var GaugeSeries = {
+	type: 'gauge',
+	pointClass: GaugePoint,
+	
+	// chart.angular will be set to true when a gauge series is present, and this will
+	// be used on the axes
+	angular: true, 
+	drawGraph: noop,
+	fixedBox: true,
+	forceDL: true,
+	trackerGroups: ['group', 'dataLabelsGroup'],
+	
+	/**
+	 * Calculate paths etc
+	 */
+	translate: function () {
+		
+		var series = this,
+			yAxis = series.yAxis,
+			options = series.options,
+			center = yAxis.center;
+			
+		series.generatePoints();
+		
+		each(series.points, function (point) {
+			
+			var dialOptions = merge(options.dial, point.dial),
+				radius = (pInt(pick(dialOptions.radius, 80)) * center[2]) / 200,
+				baseLength = (pInt(pick(dialOptions.baseLength, 70)) * radius) / 100,
+				rearLength = (pInt(pick(dialOptions.rearLength, 10)) * radius) / 100,
+				baseWidth = dialOptions.baseWidth || 3,
+				topWidth = dialOptions.topWidth || 1,
+				overshoot = options.overshoot,
+				rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true);
+
+			// Handle the wrap and overshoot options
+			if (overshoot && typeof overshoot === 'number') {
+				overshoot = overshoot / 180 * Math.PI;
+				rotation = Math.max(yAxis.startAngleRad - overshoot, Math.min(yAxis.endAngleRad + overshoot, rotation));			
+			
+			} else if (options.wrap === false) {
+				rotation = Math.max(yAxis.startAngleRad, Math.min(yAxis.endAngleRad, rotation));
+			}
+
+			rotation = rotation * 180 / Math.PI;
+				
+			point.shapeType = 'path';
+			point.shapeArgs = {
+				d: dialOptions.path || [
+					'M', 
+					-rearLength, -baseWidth / 2, 
+					'L', 
+					baseLength, -baseWidth / 2,
+					radius, -topWidth / 2,
+					radius, topWidth / 2,
+					baseLength, baseWidth / 2,
+					-rearLength, baseWidth / 2,
+					'z'
+				],
+				translateX: center[0],
+				translateY: center[1],
+				rotation: rotation
+			};
+			
+			// Positions for data label
+			point.plotX = center[0];
+			point.plotY = center[1];
+		});
+	},
+	
+	/**
+	 * Draw the points where each point is one needle
+	 */
+	drawPoints: function () {
+		
+		var series = this,
+			center = series.yAxis.center,
+			pivot = series.pivot,
+			options = series.options,
+			pivotOptions = options.pivot,
+			renderer = series.chart.renderer;
+		
+		each(series.points, function (point) {
+			
+			var graphic = point.graphic,
+				shapeArgs = point.shapeArgs,
+				d = shapeArgs.d,
+				dialOptions = merge(options.dial, point.dial); // #1233
+			
+			if (graphic) {
+				graphic.animate(shapeArgs);
+				shapeArgs.d = d; // animate alters it
+			} else {
+				point.graphic = renderer[point.shapeType](shapeArgs)
+					.attr({
+						stroke: dialOptions.borderColor || 'none',
+						'stroke-width': dialOptions.borderWidth || 0,
+						fill: dialOptions.backgroundColor || 'black',
+						rotation: shapeArgs.rotation // required by VML when animation is false
+					})
+					.add(series.group);
+			}
+		});
+		
+		// Add or move the pivot
+		if (pivot) {
+			pivot.animate({ // #1235
+				translateX: center[0],
+				translateY: center[1]
+			});
+		} else {
+			series.pivot = renderer.circle(0, 0, pick(pivotOptions.radius, 5))
+				.attr({
+					'stroke-width': pivotOptions.borderWidth || 0,
+					stroke: pivotOptions.borderColor || 'silver',
+					fill: pivotOptions.backgroundColor || 'black'
+				})
+				.translate(center[0], center[1])
+				.add(series.group);
+		}
+	},
+	
+	/**
+	 * Animate the arrow up from startAngle
+	 */
+	animate: function (init) {
+		var series = this;
+
+		if (!init) {
+			each(series.points, function (point) {
+				var graphic = point.graphic;
+
+				if (graphic) {
+					// start value
+					graphic.attr({
+						rotation: series.yAxis.startAngleRad * 180 / Math.PI
+					});
+
+					// animate
+					graphic.animate({
+						rotation: point.shapeArgs.rotation
+					}, series.options.animation);
+				}
+			});
+
+			// delete this function to allow it only once
+			series.animate = null;
+		}
+	},
+	
+	render: function () {
+		this.group = this.plotGroup(
+			'group', 
+			'series', 
+			this.visible ? 'visible' : 'hidden', 
+			this.options.zIndex, 
+			this.chart.seriesGroup
+		);
+		Series.prototype.render.call(this);
+		this.group.clip(this.chart.clipRect);
+	},
+	
+	/**
+	 * Extend the basic setData method by running processData and generatePoints immediately,
+	 * in order to access the points from the legend.
+	 */
+	setData: function (data, redraw) {
+		Series.prototype.setData.call(this, data, false);
+		this.processData();
+		this.generatePoints();
+		if (pick(redraw, true)) {
+			this.chart.redraw();
+		}
+	},
+
+	/**
+	 * If the tracking module is loaded, add the point tracker
+	 */
+	drawTracker: TrackerMixin && TrackerMixin.drawTrackerPoint
+};
+seriesTypes.gauge = extendClass(seriesTypes.line, GaugeSeries);
+
+/* ****************************************************************************
+ * Start Box plot series code											      *
+ *****************************************************************************/
+
+// Set default options
+defaultPlotOptions.boxplot = merge(defaultPlotOptions.column, {
+	fillColor: '#FFFFFF',
+	lineWidth: 1,
+	//medianColor: null,
+	medianWidth: 2,
+	states: {
+		hover: {
+			brightness: -0.3
+		}
+	},
+	//stemColor: null,
+	//stemDashStyle: 'solid'
+	//stemWidth: null,
+	threshold: null,
+	tooltip: {
+		pointFormat: '<span style="color:{series.color}">\u25CF</span> <b> {series.name}</b><br/>' +
+			'Maximum: {point.high}<br/>' +
+			'Upper quartile: {point.q3}<br/>' +
+			'Median: {point.median}<br/>' +
+			'Lower quartile: {point.q1}<br/>' +
+			'Minimum: {point.low}<br/>'
+			
+	},
+	//whiskerColor: null,
+	whiskerLength: '50%',
+	whiskerWidth: 2
+});
+
+// Create the series object
+seriesTypes.boxplot = extendClass(seriesTypes.column, {
+	type: 'boxplot',
+	pointArrayMap: ['low', 'q1', 'median', 'q3', 'high'], // array point configs are mapped to this
+	toYData: function (point) { // return a plain array for speedy calculation
+		return [point.low, point.q1, point.median, point.q3, point.high];
+	},
+	pointValKey: 'high', // defines the top of the tracker
+	
+	/**
+	 * One-to-one mapping from options to SVG attributes
+	 */
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		fill: 'fillColor',
+		stroke: 'color',
+		'stroke-width': 'lineWidth'
+	},
+	
+	/**
+	 * Disable data labels for box plot
+	 */
+	drawDataLabels: noop,
+
+	/**
+	 * Translate data points from raw values x and y to plotX and plotY
+	 */
+	translate: function () {
+		var series = this,
+			yAxis = series.yAxis,
+			pointArrayMap = series.pointArrayMap;
+
+		seriesTypes.column.prototype.translate.apply(series);
+
+		// do the translation on each point dimension
+		each(series.points, function (point) {
+			each(pointArrayMap, function (key) {
+				if (point[key] !== null) {
+					point[key + 'Plot'] = yAxis.translate(point[key], 0, 1, 0, 1);
+				}
+			});
+		});
+	},
+
+	/**
+	 * Draw the data points
+	 */
+	drawPoints: function () {
+		var series = this,  //state = series.state,
+			points = series.points,
+			options = series.options,
+			chart = series.chart,
+			renderer = chart.renderer,
+			pointAttr,
+			q1Plot,
+			q3Plot,
+			highPlot,
+			lowPlot,
+			medianPlot,
+			crispCorr,
+			crispX,
+			graphic,
+			stemPath,
+			stemAttr,
+			boxPath,
+			whiskersPath,
+			whiskersAttr,
+			medianPath,
+			medianAttr,
+			width,
+			left,
+			right,
+			halfWidth,
+			shapeArgs,
+			color,
+			doQuartiles = series.doQuartiles !== false, // error bar inherits this series type but doesn't do quartiles
+			whiskerLength = parseInt(series.options.whiskerLength, 10) / 100;
+
+
+		each(points, function (point) {
+
+			graphic = point.graphic;
+			shapeArgs = point.shapeArgs; // the box
+			stemAttr = {};
+			whiskersAttr = {};
+			medianAttr = {};
+			color = point.color || series.color;
+			
+			if (point.plotY !== UNDEFINED) {
+
+				pointAttr = point.pointAttr[point.selected ? 'selected' : ''];
+
+				// crisp vector coordinates
+				width = shapeArgs.width;
+				left = mathFloor(shapeArgs.x);
+				right = left + width;
+				halfWidth = mathRound(width / 2);
+				//crispX = mathRound(left + halfWidth) + crispCorr;
+				q1Plot = mathFloor(doQuartiles ? point.q1Plot : point.lowPlot);// + crispCorr;
+				q3Plot = mathFloor(doQuartiles ? point.q3Plot : point.lowPlot);// + crispCorr;
+				highPlot = mathFloor(point.highPlot);// + crispCorr;
+				lowPlot = mathFloor(point.lowPlot);// + crispCorr;
+				
+				// Stem attributes
+				stemAttr.stroke = point.stemColor || options.stemColor || color;
+				stemAttr['stroke-width'] = pick(point.stemWidth, options.stemWidth, options.lineWidth);
+				stemAttr.dashstyle = point.stemDashStyle || options.stemDashStyle;
+				
+				// Whiskers attributes
+				whiskersAttr.stroke = point.whiskerColor || options.whiskerColor || color;
+				whiskersAttr['stroke-width'] = pick(point.whiskerWidth, options.whiskerWidth, options.lineWidth);
+				
+				// Median attributes
+				medianAttr.stroke = point.medianColor || options.medianColor || color;
+				medianAttr['stroke-width'] = pick(point.medianWidth, options.medianWidth, options.lineWidth);
+				medianAttr['stroke-linecap'] = 'round'; // #1638
+				
+				
+				// The stem
+				crispCorr = (stemAttr['stroke-width'] % 2) / 2;
+				crispX = left + halfWidth + crispCorr;				
+				stemPath = [
+					// stem up
+					'M',
+					crispX, q3Plot,
+					'L',
+					crispX, highPlot,
+					
+					// stem down
+					'M',
+					crispX, q1Plot,
+					'L',
+					crispX, lowPlot
+				];
+				
+				// The box
+				if (doQuartiles) {
+					crispCorr = (pointAttr['stroke-width'] % 2) / 2;
+					crispX = mathFloor(crispX) + crispCorr;
+					q1Plot = mathFloor(q1Plot) + crispCorr;
+					q3Plot = mathFloor(q3Plot) + crispCorr;
+					left += crispCorr;
+					right += crispCorr;
+					boxPath = [
+						'M',
+						left, q3Plot,
+						'L',
+						left, q1Plot,
+						'L',
+						right, q1Plot,
+						'L',
+						right, q3Plot,
+						'L',
+						left, q3Plot,
+						'z'
+					];
+				}
+				
+				// The whiskers
+				if (whiskerLength) {
+					crispCorr = (whiskersAttr['stroke-width'] % 2) / 2;
+					highPlot = highPlot + crispCorr;
+					lowPlot = lowPlot + crispCorr;
+					whiskersPath = [
+						// High whisker
+						'M',
+						crispX - halfWidth * whiskerLength, 
+						highPlot,
+						'L',
+						crispX + halfWidth * whiskerLength, 
+						highPlot,
+						
+						// Low whisker
+						'M',
+						crispX - halfWidth * whiskerLength, 
+						lowPlot,
+						'L',
+						crispX + halfWidth * whiskerLength, 
+						lowPlot
+					];
+				}
+				
+				// The median
+				crispCorr = (medianAttr['stroke-width'] % 2) / 2;				
+				medianPlot = mathRound(point.medianPlot) + crispCorr;
+				medianPath = [
+					'M',
+					left, 
+					medianPlot,
+					'L',
+					right, 
+					medianPlot
+				];
+				
+				// Create or update the graphics
+				if (graphic) { // update
+					
+					point.stem.animate({ d: stemPath });
+					if (whiskerLength) {
+						point.whiskers.animate({ d: whiskersPath });
+					}
+					if (doQuartiles) {
+						point.box.animate({ d: boxPath });
+					}
+					point.medianShape.animate({ d: medianPath });
+					
+				} else { // create new
+					point.graphic = graphic = renderer.g()
+						.add(series.group);
+					
+					point.stem = renderer.path(stemPath)
+						.attr(stemAttr)
+						.add(graphic);
+						
+					if (whiskerLength) {
+						point.whiskers = renderer.path(whiskersPath) 
+							.attr(whiskersAttr)
+							.add(graphic);
+					}
+					if (doQuartiles) {
+						point.box = renderer.path(boxPath)
+							.attr(pointAttr)
+							.add(graphic);
+					}	
+					point.medianShape = renderer.path(medianPath)
+						.attr(medianAttr)
+						.add(graphic);
+				}
+			}
+		});
+
+	}
+
+
+});
+
+/* ****************************************************************************
+ * End Box plot series code												*
+ *****************************************************************************/
+/* ****************************************************************************
+ * Start error bar series code                                                *
+ *****************************************************************************/
+
+// 1 - set default options
+defaultPlotOptions.errorbar = merge(defaultPlotOptions.boxplot, {
+	color: '#000000',
+	grouping: false,
+	linkedTo: ':previous',
+	tooltip: {
+		pointFormat: '<span style="color:{series.color}">\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'
+	},
+	whiskerWidth: null
+});
+
+// 2 - Create the series object
+seriesTypes.errorbar = extendClass(seriesTypes.boxplot, {
+	type: 'errorbar',
+	pointArrayMap: ['low', 'high'], // array point configs are mapped to this
+	toYData: function (point) { // return a plain array for speedy calculation
+		return [point.low, point.high];
+	},
+	pointValKey: 'high', // defines the top of the tracker
+	doQuartiles: false,
+	drawDataLabels: seriesTypes.arearange ? seriesTypes.arearange.prototype.drawDataLabels : noop,
+
+	/**
+	 * Get the width and X offset, either on top of the linked series column
+	 * or standalone
+	 */
+	getColumnMetrics: function () {
+		return (this.linkedParent && this.linkedParent.columnMetrics) || 
+			seriesTypes.column.prototype.getColumnMetrics.call(this);
+	}
+});
+
+/* ****************************************************************************
+ * End error bar series code                                                  *
+ *****************************************************************************/
+/* ****************************************************************************
+ * Start Waterfall series code                                                *
+ *****************************************************************************/
+
+// 1 - set default options
+defaultPlotOptions.waterfall = merge(defaultPlotOptions.column, {
+	lineWidth: 1,
+	lineColor: '#333',
+	dashStyle: 'dot',
+	borderColor: '#333',
+	states: {
+		hover: {
+			lineWidthPlus: 0 // #3126
+		}
+	}
+});
+
+
+// 2 - Create the series object
+seriesTypes.waterfall = extendClass(seriesTypes.column, {
+	type: 'waterfall',
+
+	upColorProp: 'fill',
+
+	pointArrayMap: ['low', 'y'],
+
+	pointValKey: 'y',
+
+	/**
+	 * Init waterfall series, force stacking
+	 */
+	init: function (chart, options) {
+		// force stacking
+		options.stacking = true;
+
+		seriesTypes.column.prototype.init.call(this, chart, options);
+	},
+
+
+	/**
+	 * Translate data points from raw values
+	 */
+	translate: function () {
+		var series = this,
+			options = series.options,
+			yAxis = series.yAxis,
+			len,
+			i,
+			points,
+			point,
+			shapeArgs,
+			stack,
+			y,
+			previousY,
+			previousIntermediate,
+			stackPoint,
+			threshold = options.threshold,
+			tooltipY;
+
+		// run column series translate
+		seriesTypes.column.prototype.translate.apply(this);
+
+		previousY = previousIntermediate = threshold;
+		points = series.points;
+
+		for (i = 0, len = points.length; i < len; i++) {
+			// cache current point object
+			point = points[i];
+			shapeArgs = point.shapeArgs;
+
+			// get current stack
+			stack = series.getStack(i);
+			stackPoint = stack.points[series.index + ',' + i];
+
+			// override point value for sums
+			if (isNaN(point.y)) {
+				point.y = series.yData[i];
+			}
+
+			// up points
+			y = mathMax(previousY, previousY + point.y) + stackPoint[0];
+			shapeArgs.y = yAxis.translate(y, 0, 1);
+
+
+			// sum points
+			if (point.isSum) {
+				shapeArgs.y = yAxis.translate(stackPoint[1], 0, 1);
+				shapeArgs.height = yAxis.translate(stackPoint[0], 0, 1) - shapeArgs.y;
+
+			} else if (point.isIntermediateSum) {
+				shapeArgs.y = yAxis.translate(stackPoint[1], 0, 1);
+				shapeArgs.height = yAxis.translate(previousIntermediate, 0, 1) - shapeArgs.y;
+				previousIntermediate = stackPoint[1];
+
+			// if it's not the sum point, update previous stack end position
+			} else {
+				previousY += stack.total;
+			}
+
+			// negative points
+			if (shapeArgs.height < 0) {
+				shapeArgs.y += shapeArgs.height;
+				shapeArgs.height *= -1;
+			}
+
+			point.plotY = shapeArgs.y = mathRound(shapeArgs.y) - (series.borderWidth % 2) / 2;
+			shapeArgs.height = mathMax(mathRound(shapeArgs.height), 0.001); // #3151
+			point.yBottom = shapeArgs.y + shapeArgs.height;
+
+			// Correct tooltip placement (#3014)
+			tooltipY = point.plotY + (point.negative ? shapeArgs.height : 0);
+			if (series.chart.inverted) {
+				point.tooltipPos[0] = yAxis.len - tooltipY;
+			} else {
+				point.tooltipPos[1] = tooltipY;
+			}
+
+		}
+	},
+
+	/**
+	 * Call default processData then override yData to reflect waterfall's extremes on yAxis
+	 */
+	processData: function (force) {
+		var series = this,
+			options = series.options,
+			yData = series.yData,
+			points = series.points,
+			point,
+			dataLength = yData.length,
+			threshold = options.threshold || 0,
+			subSum,
+			sum,
+			dataMin,
+			dataMax,
+			y,
+			i;
+
+		sum = subSum = dataMin = dataMax = threshold;
+
+		for (i = 0; i < dataLength; i++) {
+			y = yData[i];
+			point = points && points[i] ? points[i] : {};
+
+			if (y === "sum" || point.isSum) {
+				yData[i] = sum;
+			} else if (y === "intermediateSum" || point.isIntermediateSum) {
+				yData[i] = subSum;
+			} else {
+				sum += y;
+				subSum += y;
+			}
+			dataMin = Math.min(sum, dataMin);
+			dataMax = Math.max(sum, dataMax);
+		}
+
+		Series.prototype.processData.call(this, force);
+
+		// Record extremes
+		series.dataMin = dataMin;
+		series.dataMax = dataMax;
+	},
+
+	/**
+	 * Return y value or string if point is sum
+	 */
+	toYData: function (pt) {
+		if (pt.isSum) {
+			return "sum";
+		} else if (pt.isIntermediateSum) {
+			return "intermediateSum";
+		}
+
+		return pt.y;
+	},
+
+	/**
+	 * Postprocess mapping between options and SVG attributes
+	 */
+	getAttribs: function () {
+		seriesTypes.column.prototype.getAttribs.apply(this, arguments);
+
+		var series = this,
+			options = series.options,
+			stateOptions = options.states,
+			upColor = options.upColor || series.color,
+			hoverColor = Highcharts.Color(upColor).brighten(0.1).get(),
+			seriesDownPointAttr = merge(series.pointAttr),
+			upColorProp = series.upColorProp;
+
+		seriesDownPointAttr[''][upColorProp] = upColor;
+		seriesDownPointAttr.hover[upColorProp] = stateOptions.hover.upColor || hoverColor;
+		seriesDownPointAttr.select[upColorProp] = stateOptions.select.upColor || upColor;
+
+		each(series.points, function (point) {
+			if (point.y > 0 && !point.color) {
+				point.pointAttr = seriesDownPointAttr;
+				point.color = upColor;
+			}
+		});
+	},
+
+	/**
+	 * Draw columns' connector lines
+	 */
+	getGraphPath: function () {
+
+		var data = this.data,
+			length = data.length,
+			lineWidth = this.options.lineWidth + this.borderWidth,
+			normalizer = mathRound(lineWidth) % 2 / 2,
+			path = [],
+			M = 'M',
+			L = 'L',
+			prevArgs,
+			pointArgs,
+			i,
+			d;
+
+		for (i = 1; i < length; i++) {
+			pointArgs = data[i].shapeArgs;
+			prevArgs = data[i - 1].shapeArgs;
+
+			d = [
+				M,
+				prevArgs.x + prevArgs.width, prevArgs.y + normalizer,
+				L,
+				pointArgs.x, prevArgs.y + normalizer
+			];
+
+			if (data[i - 1].y < 0) {
+				d[2] += prevArgs.height;
+				d[5] += prevArgs.height;
+			}
+
+			path = path.concat(d);
+		}
+
+		return path;
+	},
+
+	/**
+	 * Extremes are recorded in processData
+	 */
+	getExtremes: noop,
+
+	/**
+	 * Return stack for given index
+	 */
+	getStack: function (i) {
+		var axis = this.yAxis,
+			stacks = axis.stacks,
+			key = this.stackKey;
+
+		if (this.processedYData[i] < this.options.threshold) {
+			key = '-' + key;
+		}
+
+		return stacks[key][i];
+	},
+
+	drawGraph: Series.prototype.drawGraph
+});
+
+/* ****************************************************************************
+ * End Waterfall series code                                                  *
+ *****************************************************************************/
+/* ****************************************************************************
+ * Start Bubble series code											          *
+ *****************************************************************************/
+
+// 1 - set default options
+defaultPlotOptions.bubble = merge(defaultPlotOptions.scatter, {
+	dataLabels: {
+		formatter: function () { // #2945
+			return this.point.z;
+		},
+		inside: true,
+		style: {
+			color: 'white',
+			textShadow: '0px 0px 3px black'
+		},
+		verticalAlign: 'middle'
+	},
+	// displayNegative: true,
+	marker: {
+		// fillOpacity: 0.5,
+		lineColor: null, // inherit from series.color
+		lineWidth: 1
+	},
+	minSize: 8,
+	maxSize: '20%',
+	// negativeColor: null,
+	// sizeBy: 'area'
+	states: {
+		hover: {
+			halo: {
+				size: 5
+			}
+		}
+	},
+	tooltip: {
+		pointFormat: '({point.x}, {point.y}), Size: {point.z}'
+	},
+	turboThreshold: 0,
+	zThreshold: 0
+});
+
+var BubblePoint = extendClass(Point, {
+	haloPath: function () {
+		return Point.prototype.haloPath.call(this, this.shapeArgs.r + this.series.options.states.hover.halo.size);
+	}
+});
+
+// 2 - Create the series object
+seriesTypes.bubble = extendClass(seriesTypes.scatter, {
+	type: 'bubble',
+	pointClass: BubblePoint,
+	pointArrayMap: ['y', 'z'],
+	parallelArrays: ['x', 'y', 'z'],
+	trackerGroups: ['group', 'dataLabelsGroup'],
+	bubblePadding: true,
+	
+	/**
+	 * Mapping between SVG attributes and the corresponding options
+	 */
+	pointAttrToOptions: { 
+		stroke: 'lineColor',
+		'stroke-width': 'lineWidth',
+		fill: 'fillColor'
+	},
+	
+	/**
+	 * Apply the fillOpacity to all fill positions
+	 */
+	applyOpacity: function (fill) {
+		var markerOptions = this.options.marker,
+			fillOpacity = pick(markerOptions.fillOpacity, 0.5);
+		
+		// When called from Legend.colorizeItem, the fill isn't predefined
+		fill = fill || markerOptions.fillColor || this.color; 
+		
+		if (fillOpacity !== 1) {
+			fill = Color(fill).setOpacity(fillOpacity).get('rgba');
+		}
+		return fill;
+	},
+	
+	/**
+	 * Extend the convertAttribs method by applying opacity to the fill
+	 */
+	convertAttribs: function () {
+		var obj = Series.prototype.convertAttribs.apply(this, arguments);
+		
+		obj.fill = this.applyOpacity(obj.fill);
+		
+		return obj;
+	},
+
+	/**
+	 * Get the radius for each point based on the minSize, maxSize and each point's Z value. This
+	 * must be done prior to Series.translate because the axis needs to add padding in 
+	 * accordance with the point sizes.
+	 */
+	getRadii: function (zMin, zMax, minSize, maxSize) {
+		var len,
+			i,
+			pos,
+			zData = this.zData,
+			radii = [],
+			sizeByArea = this.options.sizeBy !== 'width',
+			zRange;
+		
+		// Set the shape type and arguments to be picked up in drawPoints
+		for (i = 0, len = zData.length; i < len; i++) {
+			zRange = zMax - zMin;
+			pos = zRange > 0 ? // relative size, a number between 0 and 1
+				(zData[i] - zMin) / (zMax - zMin) : 
+				0.5;
+			if (sizeByArea && pos >= 0) {
+				pos = Math.sqrt(pos);
+			}
+			radii.push(math.ceil(minSize + pos * (maxSize - minSize)) / 2);
+		}
+		this.radii = radii;
+	},
+	
+	/**
+	 * Perform animation on the bubbles
+	 */
+	animate: function (init) {
+		var animation = this.options.animation;
+		
+		if (!init) { // run the animation
+			each(this.points, function (point) {
+				var graphic = point.graphic,
+					shapeArgs = point.shapeArgs;
+
+				if (graphic && shapeArgs) {
+					// start values
+					graphic.attr('r', 1);
+
+					// animate
+					graphic.animate({
+						r: shapeArgs.r
+					}, animation);
+				}
+			});
+
+			// delete this function to allow it only once
+			this.animate = null;
+		}
+	},
+	
+	/**
+	 * Extend the base translate method to handle bubble size
+	 */
+	translate: function () {
+		
+		var i,
+			data = this.data,
+			point,
+			radius,
+			radii = this.radii;
+		
+		// Run the parent method
+		seriesTypes.scatter.prototype.translate.call(this);
+		
+		// Set the shape type and arguments to be picked up in drawPoints
+		i = data.length;
+		
+		while (i--) {
+			point = data[i];
+			radius = radii ? radii[i] : 0; // #1737
+
+			// Flag for negativeColor to be applied in Series.js
+			point.negative = point.z < (this.options.zThreshold || 0);
+			
+			if (radius >= this.minPxSize / 2) {
+				// Shape arguments
+				point.shapeType = 'circle';
+				point.shapeArgs = {
+					x: point.plotX,
+					y: point.plotY,
+					r: radius
+				};
+				
+				// Alignment box for the data label
+				point.dlBox = {
+					x: point.plotX - radius,
+					y: point.plotY - radius,
+					width: 2 * radius,
+					height: 2 * radius
+				};
+			} else { // below zThreshold
+				point.shapeArgs = point.plotY = point.dlBox = UNDEFINED; // #1691
+			}
+		}
+	},
+	
+	/**
+	 * Get the series' symbol in the legend
+	 * 
+	 * @param {Object} legend The legend object
+	 * @param {Object} item The series (this) or point
+	 */
+	drawLegendSymbol: function (legend, item) {
+		var radius = pInt(legend.itemStyle.fontSize) / 2;
+		
+		item.legendSymbol = this.chart.renderer.circle(
+			radius,
+			legend.baseline - radius,
+			radius
+		).attr({
+			zIndex: 3
+		}).add(item.legendGroup);
+		item.legendSymbol.isMarker = true;	
+		
+	},
+	
+	drawPoints: seriesTypes.column.prototype.drawPoints,
+	alignDataLabel: seriesTypes.column.prototype.alignDataLabel
+});
+
+/**
+ * Add logic to pad each axis with the amount of pixels
+ * necessary to avoid the bubbles to overflow.
+ */
+Axis.prototype.beforePadding = function () {
+	var axis = this,
+		axisLength = this.len,
+		chart = this.chart,
+		pxMin = 0, 
+		pxMax = axisLength,
+		isXAxis = this.isXAxis,
+		dataKey = isXAxis ? 'xData' : 'yData',
+		min = this.min,
+		extremes = {},
+		smallestSize = math.min(chart.plotWidth, chart.plotHeight),
+		zMin = Number.MAX_VALUE,
+		zMax = -Number.MAX_VALUE,
+		range = this.max - min,
+		transA = axisLength / range,
+		activeSeries = [];
+
+	// Handle padding on the second pass, or on redraw
+	if (this.tickPositions) {
+		each(this.series, function (series) {
+
+			var seriesOptions = series.options,
+				zData;
+
+			if (series.bubblePadding && (series.visible || !chart.options.chart.ignoreHiddenSeries)) {
+
+				// Correction for #1673
+				axis.allowZoomOutside = true;
+
+				// Cache it
+				activeSeries.push(series);
+
+				if (isXAxis) { // because X axis is evaluated first
+				
+					// For each series, translate the size extremes to pixel values
+					each(['minSize', 'maxSize'], function (prop) {
+						var length = seriesOptions[prop],
+							isPercent = /%$/.test(length);
+						
+						length = pInt(length);
+						extremes[prop] = isPercent ?
+							smallestSize * length / 100 :
+							length;
+						
+					});
+					series.minPxSize = extremes.minSize;
+					
+					// Find the min and max Z
+					zData = series.zData;
+					if (zData.length) { // #1735
+						zMin = pick(seriesOptions.zMin, math.min(
+							zMin,
+							math.max(
+								arrayMin(zData), 
+								seriesOptions.displayNegative === false ? seriesOptions.zThreshold : -Number.MAX_VALUE
+							)
+						));
+						zMax = pick(seriesOptions.zMax, math.max(zMax, arrayMax(zData)));
+					}
+				}
+			}
+		});
+
+		each(activeSeries, function (series) {
+
+			var data = series[dataKey],
+				i = data.length,
+				radius;
+
+			if (isXAxis) {
+				series.getRadii(zMin, zMax, extremes.minSize, extremes.maxSize);
+			}
+			
+			if (range > 0) {
+				while (i--) {
+					if (typeof data[i] === 'number') {
+						radius = series.radii[i];
+						pxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);
+						pxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);
+					}
+				}
+			}
+		});
+		
+		if (activeSeries.length && range > 0 && pick(this.options.min, this.userMin) === UNDEFINED && pick(this.options.max, this.userMax) === UNDEFINED) {
+			pxMax -= axisLength;
+			transA *= (axisLength + pxMin - pxMax) / axisLength;
+			this.min += pxMin / transA;
+			this.max += pxMax / transA;
+		}
+	}
+};
+
+/* ****************************************************************************
+ * End Bubble series code                                                     *
+ *****************************************************************************/
+
+(function () {
+
+	/**
+	 * Extensions for polar charts. Additionally, much of the geometry required for polar charts is
+	 * gathered in RadialAxes.js.
+	 * 
+	 */
+
+	var seriesProto = Series.prototype,
+		pointerProto = Pointer.prototype,
+		colProto;
+
+	/**
+	 * Translate a point's plotX and plotY from the internal angle and radius measures to 
+	 * true plotX, plotY coordinates
+	 */
+	seriesProto.toXY = function (point) {
+		var xy,
+			chart = this.chart,
+			plotX = point.plotX,
+			plotY = point.plotY,
+			clientX;
+	
+		// Save rectangular plotX, plotY for later computation
+		point.rectPlotX = plotX;
+		point.rectPlotY = plotY;
+	
+		// Record the angle in degrees for use in tooltip
+		clientX = ((plotX / Math.PI * 180) + this.xAxis.pane.options.startAngle) % 360;
+		if (clientX < 0) { // #2665
+			clientX += 360;
+		}
+		point.clientX = clientX;
+
+	
+		// Find the polar plotX and plotY
+		xy = this.xAxis.postTranslate(point.plotX, this.yAxis.len - plotY);
+		point.plotX = point.polarPlotX = xy.x - chart.plotLeft;
+		point.plotY = point.polarPlotY = xy.y - chart.plotTop;
+	};
+
+	/** 
+	 * Order the tooltip points to get the mouse capture ranges correct. #1915. 
+	 */
+	seriesProto.orderTooltipPoints = function (points) {
+		if (this.chart.polar) {
+			points.sort(function (a, b) {
+				return a.clientX - b.clientX;
+			});
+
+			// Wrap mouse tracking around to capture movement on the segment to the left
+			// of the north point (#1469, #2093).
+			if (points[0]) {
+				points[0].wrappedClientX = points[0].clientX + 360;
+				points.push(points[0]);
+			}
+		}
+	};
+
+
+	/**
+	 * Add some special init logic to areas and areasplines
+	 */
+	function initArea(proceed, chart, options) {
+		proceed.call(this, chart, options);
+		if (this.chart.polar) {
+		
+			/**
+			 * Overridden method to close a segment path. While in a cartesian plane the area 
+			 * goes down to the threshold, in the polar chart it goes to the center.
+			 */
+			this.closeSegment = function (path) {
+				var center = this.xAxis.center;
+				path.push(
+					'L',
+					center[0],
+					center[1]
+				);			
+			};
+		
+			// Instead of complicated logic to draw an area around the inner area in a stack,
+			// just draw it behind
+			this.closedStacks = true;
+		}
+	}
+
+	if (seriesTypes.area) {		
+		wrap(seriesTypes.area.prototype, 'init', initArea);	
+	}
+	if (seriesTypes.areaspline) {		
+		wrap(seriesTypes.areaspline.prototype, 'init', initArea);			
+	}	
+
+	if (seriesTypes.spline) {
+		/**
+		 * Overridden method for calculating a spline from one point to the next
+		 */
+		wrap(seriesTypes.spline.prototype, 'getPointSpline', function (proceed, segment, point, i) {
+	
+			var ret,
+				smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc;
+				denom = smoothing + 1,
+				plotX, 
+				plotY,
+				lastPoint,
+				nextPoint,
+				lastX,
+				lastY,
+				nextX,
+				nextY,
+				leftContX,
+				leftContY,
+				rightContX,
+				rightContY,
+				distanceLeftControlPoint,
+				distanceRightControlPoint,
+				leftContAngle,
+				rightContAngle,
+				jointAngle;
+		
+		
+			if (this.chart.polar) {
+		
+				plotX = point.plotX;
+				plotY = point.plotY;
+				lastPoint = segment[i - 1];
+				nextPoint = segment[i + 1];
+			
+				// Connect ends
+				if (this.connectEnds) {
+					if (!lastPoint) {
+						lastPoint = segment[segment.length - 2]; // not the last but the second last, because the segment is already connected
+					}
+					if (!nextPoint) {
+						nextPoint = segment[1];
+					}	
+				}
+
+				// find control points
+				if (lastPoint && nextPoint) {
+		
+					lastX = lastPoint.plotX;
+					lastY = lastPoint.plotY;
+					nextX = nextPoint.plotX;
+					nextY = nextPoint.plotY;
+					leftContX = (smoothing * plotX + lastX) / denom;
+					leftContY = (smoothing * plotY + lastY) / denom;
+					rightContX = (smoothing * plotX + nextX) / denom;
+					rightContY = (smoothing * plotY + nextY) / denom;
+					distanceLeftControlPoint = Math.sqrt(Math.pow(leftContX - plotX, 2) + Math.pow(leftContY - plotY, 2));
+					distanceRightControlPoint = Math.sqrt(Math.pow(rightContX - plotX, 2) + Math.pow(rightContY - plotY, 2));
+					leftContAngle = Math.atan2(leftContY - plotY, leftContX - plotX);
+					rightContAngle = Math.atan2(rightContY - plotY, rightContX - plotX);
+					jointAngle = (Math.PI / 2) + ((leftContAngle + rightContAngle) / 2);
+				
+				
+					// Ensure the right direction, jointAngle should be in the same quadrant as leftContAngle
+					if (Math.abs(leftContAngle - jointAngle) > Math.PI / 2) {
+						jointAngle -= Math.PI;
+					}
+			
+					// Find the corrected control points for a spline straight through the point
+					leftContX = plotX + Math.cos(jointAngle) * distanceLeftControlPoint;
+					leftContY = plotY + Math.sin(jointAngle) * distanceLeftControlPoint;
+					rightContX = plotX + Math.cos(Math.PI + jointAngle) * distanceRightControlPoint;
+					rightContY = plotY + Math.sin(Math.PI + jointAngle) * distanceRightControlPoint;
+			
+					// Record for drawing in next point
+					point.rightContX = rightContX;
+					point.rightContY = rightContY;
+
+				}
+		
+		
+				// moveTo or lineTo
+				if (!i) {
+					ret = ['M', plotX, plotY];
+				} else { // curve from last point to this
+					ret = [
+						'C',
+						lastPoint.rightContX || lastPoint.plotX,
+						lastPoint.rightContY || lastPoint.plotY,
+						leftContX || plotX,
+						leftContY || plotY,
+						plotX,
+						plotY
+					];
+					lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later
+				}
+		
+		
+			} else {
+				ret = proceed.call(this, segment, point, i);
+			}
+			return ret;
+		});
+	}
+
+	/**
+	 * Extend translate. The plotX and plotY values are computed as if the polar chart were a
+	 * cartesian plane, where plotX denotes the angle in radians and (yAxis.len - plotY) is the pixel distance from
+	 * center. 
+	 */
+	wrap(seriesProto, 'translate', function (proceed) {
+		
+		// Run uber method
+		proceed.call(this);
+	
+		// Postprocess plot coordinates
+		if (this.chart.polar && !this.preventPostTranslate) {
+			var points = this.points,
+				i = points.length;
+			while (i--) {
+				// Translate plotX, plotY from angle and radius to true plot coordinates
+				this.toXY(points[i]);
+			}
+		}
+	});
+
+	/** 
+	 * Extend getSegmentPath to allow connecting ends across 0 to provide a closed circle in 
+	 * line-like series.
+	 */
+	wrap(seriesProto, 'getSegmentPath', function (proceed, segment) {
+		
+		var points = this.points;
+	
+		// Connect the path
+		if (this.chart.polar && this.options.connectEnds !== false && 
+				segment[segment.length - 1] === points[points.length - 1] && points[0].y !== null) {
+			this.connectEnds = true; // re-used in splines
+			segment = [].concat(segment, [points[0]]);
+		}
+	
+		// Run uber method
+		return proceed.call(this, segment);
+	
+	});
+
+
+	function polarAnimate(proceed, init) {
+		var chart = this.chart,
+			animation = this.options.animation,
+			group = this.group,
+			markerGroup = this.markerGroup,
+			center = this.xAxis.center,
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop,
+			attribs;
+
+		// Specific animation for polar charts
+		if (chart.polar) {
+		
+			// Enable animation on polar charts only in SVG. In VML, the scaling is different, plus animation
+			// would be so slow it would't matter.
+			if (chart.renderer.isSVG) {
+
+				if (animation === true) {
+					animation = {};
+				}
+	
+				// Initialize the animation
+				if (init) {
+				
+					// Scale down the group and place it in the center
+					attribs = {
+						translateX: center[0] + plotLeft,
+						translateY: center[1] + plotTop,
+						scaleX: 0.001, // #1499
+						scaleY: 0.001
+					};
+					
+					group.attr(attribs);
+					if (markerGroup) {
+						//markerGroup.attrSetters = group.attrSetters;
+						markerGroup.attr(attribs);
+					}
+				
+				// Run the animation
+				} else {
+					attribs = {
+						translateX: plotLeft,
+						translateY: plotTop,
+						scaleX: 1,
+						scaleY: 1
+					};
+					group.animate(attribs, animation);
+					if (markerGroup) {
+						markerGroup.animate(attribs, animation);
+					}
+				
+					// Delete this function to allow it only once
+					this.animate = null;
+				}
+			}
+	
+		// For non-polar charts, revert to the basic animation
+		} else {
+			proceed.call(this, init);
+		} 
+	}
+
+	// Define the animate method for regular series
+	wrap(seriesProto, 'animate', polarAnimate);
+
+	/**
+	 * Throw in a couple of properties to let setTooltipPoints know we're indexing the points
+	 * in degrees (0-360), not plot pixel width.
+	 */
+	wrap(seriesProto, 'setTooltipPoints', function (proceed, renew) {
+		
+		if (this.chart.polar) {
+			extend(this.xAxis, {
+				tooltipLen: 360 // degrees are the resolution unit of the tooltipPoints array
+			});	
+		}
+		// Run uber method
+		return proceed.call(this, renew);
+	});
+
+
+	if (seriesTypes.column) {
+
+		colProto = seriesTypes.column.prototype;
+		/**
+		* Define the animate method for columnseries
+		*/
+		wrap(colProto, 'animate', polarAnimate);
+
+
+		/**
+		 * Extend the column prototype's translate method
+		 */
+		wrap(colProto, 'translate', function (proceed) {
+		
+			var xAxis = this.xAxis,
+				len = this.yAxis.len,
+				center = xAxis.center,
+				startAngleRad = xAxis.startAngleRad,
+				renderer = this.chart.renderer,
+				start,
+				points,
+				point,
+				i;
+	
+			this.preventPostTranslate = true;
+	
+			// Run uber method
+			proceed.call(this);
+	
+			// Postprocess plot coordinates
+			if (xAxis.isRadial) {
+				points = this.points;
+				i = points.length;
+				while (i--) {
+					point = points[i];
+					start = point.barX + startAngleRad;
+					point.shapeType = 'path';
+					point.shapeArgs = {
+						d: renderer.symbols.arc(
+							center[0],
+							center[1],
+							len - point.plotY,
+							null, 
+							{
+								start: start,
+								end: start + point.pointWidth,
+								innerR: len - pick(point.yBottom, len)
+							}
+						)
+					};
+					// Provide correct plotX, plotY for tooltip
+					this.toXY(point); 
+					point.tooltipPos = [point.plotX, point.plotY];
+					point.ttBelow = point.plotY > center[1];
+				}
+			}
+		});
+
+
+		/**
+		 * Align column data labels outside the columns. #1199.
+		 */
+		wrap(colProto, 'alignDataLabel', function (proceed, point, dataLabel, options, alignTo, isNew) {
+	
+			if (this.chart.polar) {
+				var angle = point.rectPlotX / Math.PI * 180,
+					align,
+					verticalAlign;
+		
+				// Align nicely outside the perimeter of the columns
+				if (options.align === null) {
+					if (angle > 20 && angle < 160) {
+						align = 'left'; // right hemisphere
+					} else if (angle > 200 && angle < 340) {
+						align = 'right'; // left hemisphere
+					} else {
+						align = 'center'; // top or bottom
+					}
+					options.align = align;
+				}
+				if (options.verticalAlign === null) {
+					if (angle < 45 || angle > 315) {
+						verticalAlign = 'bottom'; // top part
+					} else if (angle > 135 && angle < 225) {
+						verticalAlign = 'top'; // bottom part
+					} else {
+						verticalAlign = 'middle'; // left or right
+					}
+					options.verticalAlign = verticalAlign;
+				}
+		
+				seriesProto.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);
+			} else {
+				proceed.call(this, point, dataLabel, options, alignTo, isNew);
+			}
+	
+		});		
+	}
+
+
+	/**
+	 * Extend the mouse tracker to return the tooltip position index in terms of
+	 * degrees rather than pixels
+	 */
+	wrap(pointerProto, 'getIndex', function (proceed, e) {
+		var ret,
+			chart = this.chart,
+			center,
+			x,
+			y;
+	
+		if (chart.polar) {
+			center = chart.xAxis[0].center;
+			x = e.chartX - center[0] - chart.plotLeft;
+			y = e.chartY - center[1] - chart.plotTop;
+		
+			ret = 180 - Math.round(Math.atan2(x, y) / Math.PI * 180);
+	
+		} else {
+	
+			// Run uber method
+			ret = proceed.call(this, e);
+		}
+		return ret;
+	});
+
+	/**
+	 * Extend getCoordinates to prepare for polar axis values
+	 */
+	wrap(pointerProto, 'getCoordinates', function (proceed, e) {
+		var chart = this.chart,
+			ret = {
+				xAxis: [],
+				yAxis: []
+			};
+	
+		if (chart.polar) {	
+
+			each(chart.axes, function (axis) {
+				var isXAxis = axis.isXAxis,
+					center = axis.center,
+					x = e.chartX - center[0] - chart.plotLeft,
+					y = e.chartY - center[1] - chart.plotTop;
+			
+				ret[isXAxis ? 'xAxis' : 'yAxis'].push({
+					axis: axis,
+					value: axis.translate(
+						isXAxis ?
+							Math.PI - Math.atan2(x, y) : // angle 
+							Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)), // distance from center
+						true
+					)
+				});
+			});
+		
+		} else {
+			ret = proceed.call(this, e);
+		}
+	
+		return ret;
+	});
+
+}());
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts.js
new file mode 100644
index 0000000..5c86577
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts.js
@@ -0,0 +1,307 @@
+/*
+ Highcharts JS v4.0.3 (2014-07-03)
+
+ (c) 2009-2014 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(){function r(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function w(){var a,b=arguments,c,d={},e=function(a,b){var c,d;typeof a!=="object"&&(a={});for(d in b)b.hasOwnProperty(d)&&(c=b[d],a[d]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&d!=="renderTo"&&typeof c.nodeType!=="number"?e(a[d]||{},c):b[d]);return a};b[0]===!0&&(d=b[1],b=Array.prototype.slice.call(b,2));c=b.length;for(a=0;a<c;a++)d=e(d,b[a]);return d}function z(a,b){return parseInt(a,b||
+10)}function Fa(a){return typeof a==="string"}function da(a){return a&&typeof a==="object"}function La(a){return Object.prototype.toString.call(a)==="[object Array]"}function ia(a){return typeof a==="number"}function za(a){return V.log(a)/V.LN10}function ja(a){return V.pow(10,a)}function ka(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function s(a){return a!==t&&a!==null}function F(a,b,c){var d,e;if(Fa(b))s(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(s(b)&&
+da(b))for(d in b)a.setAttribute(d,b[d]);return e}function ra(a){return La(a)?a:[a]}function p(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],c!==t&&c!==null)return c}function A(a,b){if(Aa&&!ba&&b&&b.opacity!==t)b.filter="alpha(opacity="+b.opacity*100+")";r(a.style,b)}function $(a,b,c,d,e){a=x.createElement(a);b&&r(a,b);e&&A(a,{padding:0,border:P,margin:0});c&&A(a,c);d&&d.appendChild(a);return a}function la(a,b){var c=function(){return t};c.prototype=new a;r(c.prototype,b);return c}function Ga(a,
+b,c,d){var e=L.lang,a=+a||0,f=b===-1?(a.toString().split(".")[1]||"").length:isNaN(b=Q(b))?2:b,b=c===void 0?e.decimalPoint:c,d=d===void 0?e.thousandsSep:d,e=a<0?"-":"",c=String(z(a=Q(a).toFixed(f))),g=c.length>3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+Q(a-c).toFixed(f).slice(2):"")}function Ha(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function Ma(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);
+return c.apply(this,a)}}function Ia(a,b){for(var c="{",d=!1,e,f,g,h,i,j=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h<i;h++)e=e[g[h]];if(f.length)f=f.join(":"),g=/\.([0-9])/,h=L.lang,i=void 0,/f$/.test(f)?(i=(i=f.match(g))?i[1]:-1,e!==null&&(e=Ga(e,i,h.decimalPoint,f.indexOf(",")>-1?h.thousandsSep:""))):e=bb(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function lb(a){return V.pow(10,U(V.log(a)/V.LN10))}
+function mb(a,b,c,d){var e,c=p(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals===!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(a=b[d],e<=(b[d]+(b[d+1]||b[d]))/2)break;a*=c;return a}function nb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].ss_i=e;a.sort(function(a,c){d=b(a,c);return d===0?a.ss_i-c.ss_i:d});for(e=0;e<c;e++)delete a[e].ss_i}function Na(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function Ba(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);
+return c}function Oa(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Pa(a){cb||(cb=$(Ja));a&&cb.appendChild(a);cb.innerHTML=""}function ea(a){return parseFloat(a.toPrecision(14))}function Qa(a,b){va=p(a,b.animation)}function Ab(){var a=L.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";Ra=(a&&L.global.timezoneOffset||0)*6E4;db=a?Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,p(c,1),p(g,0),p(h,0),p(i,0))).getTime()};ob=b+"Minutes";pb=b+"Hours";qb=b+"Day";
+Wa=b+"Date";eb=b+"Month";fb=b+"FullYear";Bb=c+"Minutes";Cb=c+"Hours";rb=c+"Date";Db=c+"Month";Eb=c+"FullYear"}function G(){}function Sa(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function ma(){this.init.apply(this,arguments)}function Xa(){this.init.apply(this,arguments)}function Fb(a,b,c,d,e){var f=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=null;this.points={};this.stack=e;this.alignOptions={align:b.align||(f?c?"left":
+"right":"center"),verticalAlign:b.verticalAlign||(f?"middle":c?"bottom":"top"),y:p(b.y,f?4:c?14:-6),x:p(b.x,f?c?-6:6:0)};this.textAlign=b.textAlign||(f?c?"right":"left":"center")}var t,x=document,H=window,V=Math,v=V.round,U=V.floor,Ka=V.ceil,u=V.max,C=V.min,Q=V.abs,aa=V.cos,fa=V.sin,na=V.PI,Ca=na*2/360,wa=navigator.userAgent,Gb=H.opera,Aa=/msie/i.test(wa)&&!Gb,gb=x.documentMode===8,sb=/AppleWebKit/.test(wa),Ta=/Firefox/.test(wa),Hb=/(Mobile|Android|Windows Phone)/.test(wa),xa="http://www.w3.org/2000/svg",
+ba=!!x.createElementNS&&!!x.createElementNS(xa,"svg").createSVGRect,Nb=Ta&&parseInt(wa.split("Firefox/")[1],10)<4,ga=!ba&&!Aa&&!!x.createElement("canvas").getContext,Ya,Za,Ib={},tb=0,cb,L,bb,va,ub,B,oa,sa=function(){return t},W=[],$a=0,Ja="div",P="none",Ob=/^[0-9]+$/,Pb="stroke-width",db,Ra,ob,pb,qb,Wa,eb,fb,Bb,Cb,rb,Db,Eb,J={},S;H.Highcharts?oa(16,!0):S=H.Highcharts={};bb=function(a,b,c){if(!s(b)||isNaN(b))return"Invalid date";var a=p(a,"%Y-%m-%d %H:%M:%S"),d=new Date(b-Ra),e,f=d[pb](),g=d[qb](),
+h=d[Wa](),i=d[eb](),j=d[fb](),k=L.lang,l=k.weekdays,d=r({a:l[g].substr(0,3),A:l[g],d:Ha(h),e:h,b:k.shortMonths[i],B:k.months[i],m:Ha(i+1),y:j.toString().substr(2,2),Y:j,H:Ha(f),I:Ha(f%12||12),l:f%12||12,M:Ha(d[ob]()),p:f<12?"AM":"PM",P:f<12?"am":"pm",S:Ha(d.getSeconds()),L:Ha(v(b%1E3),3)},S.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+a.substr(1):a};oa=function(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+
+a;if(b)throw c;H.console&&console.log(c)};B={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:26784E5,year:31556952E3};ub={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);
+a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=[].concat(b).splice(b.length-f,f),e&&(d[f-6]=d[f-2],d[f-5]=d[f-1]),b=b.concat(d);h&&(b=b.concat(h),c=c.concat(i));return[b,c]},step:function(a,b,c,d){var e=[],f=a.length;if(c===1)e=d;else if(f===b.length&&c<1)for(;f--;)d=parseFloat(a[f]),e[f]=isNaN(d)?a[f]:c*parseFloat(b[f]-d)+d;else e=b;return e}};(function(a){H.HighchartsAdapter=H.HighchartsAdapter||a&&{init:function(b){var c=a.fx,d=c.step,e,f=a.Tween,g=f&&f.propHooks;e=a.cssHooks.opacity;a.extend(a.easing,
+{easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c}});a.each(["cur","_default","width","height","opacity"],function(a,b){var e=d,k;b==="cur"?e=c.prototype:b==="_default"&&f&&(e=g[b],b="set");(k=e[b])&&(e[b]=function(c){var d,c=a?c:this;if(c.prop!=="align")return d=c.elem,d.attr?d.attr(c.prop,b==="cur"?t:c.now):k.apply(this,arguments)})});Ma(e,"get",function(a,b,c){return b.attr?b.opacity||0:a.call(this,b,c)});e=function(a){var c=a.elem,d;if(!a.started)d=b.init(c,c.d,c.toD),a.start=d[0],a.end=
+d[1],a.started=!0;c.attr("d",b.step(a.start,a.end,a.pos,c.toD))};f?g.d={set:e}:d.d=e;this.each=Array.prototype.forEach?function(a,b){return Array.prototype.forEach.call(a,b)}:function(a,b){var c,d=a.length;for(c=0;c<d;c++)if(b.call(a[c],a[c],c,a)===!1)return c};a.fn.highcharts=function(){var a="Chart",b=arguments,c,d;if(this[0]){Fa(b[0])&&(a=b[0],b=Array.prototype.slice.call(b,1));c=b[0];if(c!==t)c.chart=c.chart||{},c.chart.renderTo=this[0],new S[a](c,b[1]),d=this;c===t&&(d=W[F(this[0],"data-highcharts-chart")])}return d}},
+getScript:a.getScript,inArray:a.inArray,adapterRun:function(b,c){return a(b)[c]()},grep:a.grep,map:function(a,c){for(var d=[],e=0,f=a.length;e<f;e++)d[e]=c.call(a[e],a[e],e,a);return d},offset:function(b){return a(b).offset()},addEvent:function(b,c,d){a(b).bind(c,d)},removeEvent:function(b,c,d){var e=x.removeEventListener?"removeEventListener":"detachEvent";x[e]&&b&&!b[e]&&(b[e]=function(){});a(b).unbind(c,d)},fireEvent:function(b,c,d,e){var f=a.Event(c),g="detached"+c,h;!Aa&&d&&(delete d.layerX,
+delete d.layerY,delete d.returnValue);r(f,d);b[c]&&(b[g]=b[c],b[c]=null);a.each(["preventDefault","stopPropagation"],function(a,b){var c=f[b];f[b]=function(){try{c.call(f)}catch(a){b==="preventDefault"&&(h=!0)}}});a(b).trigger(f);b[g]&&(b[c]=b[g],b[g]=null);e&&!f.isDefaultPrevented()&&!h&&e(f)},washMouseEvent:function(a){var c=a.originalEvent||a;if(c.pageX===t)c.pageX=a.pageX,c.pageY=a.pageY;return c},animate:function(b,c,d){var e=a(b);if(!b.style)b.style={};if(c.d)b.toD=c.d,c.d=1;e.stop();c.opacity!==
+t&&b.attr&&(c.opacity+="px");e.animate(c,d)},stop:function(b){a(b).stop()}}})(H.jQuery);var T=H.HighchartsAdapter,M=T||{};T&&T.init.call(T,ub);var hb=M.adapterRun,Qb=M.getScript,Da=M.inArray,q=M.each,vb=M.grep,Rb=M.offset,Ua=M.map,N=M.addEvent,X=M.removeEvent,K=M.fireEvent,Sb=M.washMouseEvent,ib=M.animate,ab=M.stop,M={enabled:!0,x:0,y:15,style:{color:"#606060",cursor:"default",fontSize:"11px"}};L={colors:"#7cb5ec,#434348,#90ed7d,#f7a35c,#8085e9,#f15c80,#e4d354,#8085e8,#8d4653,#91e8e1".split(","),
+symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:","},global:{useUTC:!0,
+canvasToolsURL:"http://code.highcharts.com/4.0.3/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/4.0.3/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:0,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#333333",fontSize:"18px"}},subtitle:{text:"",
+align:"center",style:{color:"#555555"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,marker:{lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0,lineWidthPlus:1,radiusPlus:2},select:{fillColor:"#FFFFFF",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:w(M,{align:"center",enabled:!1,formatter:function(){return this.y===null?"":Ga(this.y,-1)},verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,states:{hover:{lineWidthPlus:1,
+marker:{},halo:{size:10,opacity:0.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderColor:"#909090",borderRadius:0,navigation:{activeColor:"#274b6d",inactiveColor:"#CCC"},shadow:!1,itemStyle:{color:"#333333",fontSize:"12px",fontWeight:"bold"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",
+width:"13px",height:"13px"},symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"white",opacity:0.5,textAlign:"center"}},tooltip:{enabled:!0,animation:ba,backgroundColor:"rgba(249, 249, 249, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",
+day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{series.color}">●</span> {series.name}: <b>{point.y}</b><br/>',shadow:!0,snap:Hb?25:10,style:{color:"#333333",cursor:"default",fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",
+color:"#909090",fontSize:"9px"}}};var ca=L.plotOptions,T=ca.line;Ab();var Tb=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,Ub=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,Vb=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,ya=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Ua(a.stops,function(a){return ya(a[1])}):(c=Tb.exec(a))?b=[z(c[1]),z(c[2]),z(c[3]),parseFloat(c[4],10)]:(c=Ub.exec(a))?b=[z(c[1],16),z(c[2],16),z(c[3],
+16),1]:(c=Vb.exec(a))&&(b=[z(c[1]),z(c[2]),z(c[3]),1])})(a);return{get:function(c){var f;d?(f=w(a),f.stops=[].concat(f.stops),q(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)q(d,function(b){b.brighten(a)});else if(ia(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=z(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this}}};
+G.prototype={opacity:1,textProps:"fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration,textShadow,HcTextStroke".split(","),init:function(a,b){this.element=b==="span"?$(b):x.createElementNS(xa,b);this.renderer=a},animate:function(a,b,c){b=p(b,va,!0);ab(this);if(b){b=w(b,{});if(c)b.complete=c;ib(this,a,b)}else this.attr(a),c&&c();return this},colorGradient:function(a,b,c){var d=this.renderer,e,f,g,h,i,j,k,l,m,n,o=[];a.linearGradient?f="linearGradient":a.radialGradient&&(f="radialGradient");
+if(f){g=a[f];h=d.gradients;j=a.stops;m=c.radialReference;La(g)&&(a[f]=g={x1:g[0],y1:g[1],x2:g[2],y2:g[3],gradientUnits:"userSpaceOnUse"});f==="radialGradient"&&m&&!s(g.gradientUnits)&&(g=w(g,{cx:m[0]-m[2]/2+g.cx*m[2],cy:m[1]-m[2]/2+g.cy*m[2],r:g.r*m[2],gradientUnits:"userSpaceOnUse"}));for(n in g)n!=="id"&&o.push(n,g[n]);for(n in j)o.push(j[n]);o=o.join(",");h[o]?a=h[o].attr("id"):(g.id=a="highcharts-"+tb++,h[o]=i=d.createElement(f).attr(g).add(d.defs),i.stops=[],q(j,function(a){a[1].indexOf("rgba")===
+0?(e=ya(a[1]),k=e.get("rgb"),l=e.get("a")):(k=a[1],l=1);a=d.createElement("stop").attr({offset:a[0],"stop-color":k,"stop-opacity":l}).add(i);i.stops.push(a)}));c.setAttribute(b,"url("+d.url+"#"+a+")")}},attr:function(a,b){var c,d,e=this.element,f,g=this,h;typeof a==="string"&&b!==t&&(c=a,a={},a[c]=b);if(typeof a==="string")g=(this[a+"Getter"]||this._defaultGetter).call(this,a,e);else{for(c in a){d=a[c];h=!1;this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c)&&(f||(this.symbolAttr(a),
+f=!0),h=!0);if(this.rotation&&(c==="x"||c==="y"))this.doTransform=!0;h||(this[c+"Setter"]||this._defaultSetter).call(this,d,c,e);this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(c)&&this.updateShadows(c,d)}if(this.doTransform)this.updateTransform(),this.doTransform=!1}return g},updateShadows:function(a,b){for(var c=this.shadows,d=c.length;d--;)c[d].setAttribute(a,a==="height"?u(b-(c[d].cutHeight||0),0):a==="d"?this.d:b)},addClass:function(a){var b=this.element,c=F(b,"class")||
+"";c.indexOf(a)===-1&&F(b,"class",c+" "+a);return this},symbolAttr:function(a){var b=this;q("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(c){b[c]=p(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x,b.y,b.width,b.height,b)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":P)},crisp:function(a){var b,c={},d,e=a.strokeWidth||this.strokeWidth||0;d=v(e)%2/2;a.x=U(a.x||this.x||0)+d;a.y=U(a.y||this.y||0)+d;a.width=U((a.width||this.width||
+0)-2*d);a.height=U((a.height||this.height||0)-2*d);a.strokeWidth=e;for(b in a)this[b]!==a[b]&&(this[b]=c[b]=a[b]);return c},css:function(a){var b=this.styles,c={},d=this.element,e,f,g="";e=!b;if(a&&a.color)a.fill=a.color;if(b)for(f in a)a[f]!==b[f]&&(c[f]=a[f],e=!0);if(e){e=this.textWidth=a&&a.width&&d.nodeName.toLowerCase()==="text"&&z(a.width);b&&(a=r(b,c));this.styles=a;e&&(ga||!ba&&this.renderer.forExport)&&delete a.width;if(Aa&&!ba)A(this.element,a);else{b=function(a,b){return"-"+b.toLowerCase()};
+for(f in a)g+=f.replace(/([A-Z])/g,b)+":"+a[f]+";";F(d,"style",g)}e&&this.added&&this.renderer.buildText(this)}return this},on:function(a,b){var c=this,d=c.element;Za&&a==="click"?(d.ontouchstart=function(a){c.touchEventFired=Date.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(wa.indexOf("Android")===-1||Date.now()-(c.touchEventFired||0)>1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){this.element.radialReference=a;return this},translate:function(a,b){return this.attr({translateX:a,
+translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation,g=this.element;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(g.getAttribute("x")||0)+" "+(g.getAttribute("y")||0)+")");(s(c)||s(d))&&a.push("scale("+p(c,1)+" "+p(d,1)+")");a.length&&g.setAttribute("transform",
+a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions=a,this.alignByTranslate=b,!c||Fa(c))this.alignTo=d=c||"renderer",ka(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=p(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];
+h[b?"translateX":"x"]=v(f);if(e==="bottom"||e==="middle")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=v(g);this[this.placed?"animate":"attr"](h);this.placed=!0;this.alignAttr=h;return this},getBBox:function(){var a=this.bBox,b=this.renderer,c,d,e=this.rotation;c=this.element;var f=this.styles,g=e*Ca;d=this.textStr;var h;if(d===""||Ob.test(d))h="num."+d.toString().length+(f?"|"+f.fontSize+"|"+f.fontFamily:"");h&&(a=b.cache[h]);if(!a){if(c.namespaceURI===xa||b.forExport){try{a=
+c.getBBox?r({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(i){}if(!a||a.width<0)a={width:0,height:0}}else a=this.htmlGetBBox();if(b.isSVG){c=a.width;d=a.height;if(Aa&&f&&f.fontSize==="11px"&&d.toPrecision(3)==="16.9")a.height=d=14;if(e)a.width=Q(d*fa(g))+Q(c*aa(g)),a.height=Q(d*aa(g))+Q(c*fa(g))}this.bBox=a;h&&(b.cache[h]=a)}return a},show:function(a){return a&&this.element.namespaceURI===xa?(this.element.removeAttribute("visibility"),this):this.attr({visibility:a?"inherit":"visible"})},
+hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.hide()}})},add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=this.element,f=this.zIndex,g,h;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(f)c.handleZ=!0,f=z(f);if(c.handleZ){a=d.childNodes;for(g=0;g<a.length;g++)if(b=a[g],c=F(b,"zIndex"),b!==e&&(z(c)>f||!s(f)&&s(c))){d.insertBefore(e,
+b);h=!0;break}}h||d.appendChild(e);this.added=!0;if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&a.parentGroup,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;ab(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f<a.stops.length;f++)a.stops[f]=a.stops[f].destroy();a.stops=null}a.safeRemoveChild(b);for(c&&
+q(c,function(b){a.safeRemoveChild(b)});d&&d.div&&d.div.childNodes.length===0;)b=d.parentGroup,a.safeRemoveChild(d.div),delete d.div,d=b;a.alignTo&&ka(a.renderer.alignedObjects,a);for(e in a)delete a[e];return null},shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,j,k;if(a){i=p(a.width,3);j=(a.opacity||0.15)/i;k=this.parentInverted?"(-1,-1)":"("+p(a.offsetX,1)+", "+p(a.offsetY,1)+")";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;F(f,{isShadow:"true",stroke:a.color||"black","stroke-opacity":j*
+e,"stroke-width":h,transform:"translate"+k,fill:P});if(c)F(f,"height",u(F(f,"height")-h,0)),f.cutHeight=h;b?b.element.appendChild(f):g.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this},xGetter:function(a){this.element.nodeName==="circle"&&(a={x:"cx",y:"cy"}[a]||a);return this._defaultGetter(a)},_defaultGetter:function(a){a=p(this[a],this.element?this.element.getAttribute(a):null,0);/^[\-0-9\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,b,c){a&&a.join&&(a=a.join(" "));
+/(NaN| {2}|^$)/.test(a)&&(a="M 0 0");c.setAttribute(b,a);this[b]=a},dashstyleSetter:function(a){var b;if(a=a&&a.toLowerCase()){a=a.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").replace("solid",1).split(",");for(b=a.length;b--;)a[b]=z(a[b])*this["stroke-width"];a=a.join(",");this.element.setAttribute("stroke-dasharray",a)}},alignSetter:function(a){this.element.setAttribute("text-anchor",
+{left:"start",center:"middle",right:"end"}[a])},opacitySetter:function(a,b,c){this[b]=a;c.setAttribute(b,a)},titleSetter:function(a){var b=this.element.getElementsByTagName("title")[0];b||(b=x.createElementNS(xa,"title"),this.element.appendChild(b));b.textContent=a},textSetter:function(a){if(a!==this.textStr)delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this)},fillSetter:function(a,b,c){typeof a==="string"?c.setAttribute(b,a):a&&this.colorGradient(a,b,c)},zIndexSetter:function(a,
+b,c){c.setAttribute(b,a);this[b]=a},_defaultSetter:function(a,b,c){c.setAttribute(b,a)}};G.prototype.yGetter=G.prototype.xGetter;G.prototype.translateXSetter=G.prototype.translateYSetter=G.prototype.rotationSetter=G.prototype.verticalAlignSetter=G.prototype.scaleXSetter=G.prototype.scaleYSetter=function(a,b){this[b]=a;this.doTransform=!0};G.prototype["stroke-widthSetter"]=G.prototype.strokeSetter=function(a,b,c){this[b]=a;if(this.stroke&&this["stroke-width"])this.strokeWidth=this["stroke-width"],
+G.prototype.fillSetter.call(this,this.stroke,"stroke",c),c.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0;else if(b==="stroke-width"&&a===0&&this.hasStroke)c.removeAttribute("stroke"),this.hasStroke=!1};var ta=function(){this.init.apply(this,arguments)};ta.prototype={Element:G,init:function(a,b,c,d,e){var f=location,g,d=this.createElement("svg").attr({version:"1.1"}).css(this.getStyle(d));g=d.element;a.appendChild(g);a.innerHTML.indexOf("xmlns")===-1&&F(g,"xmlns",xa);this.isSVG=
+!0;this.box=g;this.boxWrapper=d;this.alignedObjects=[];this.url=(Ta||sb)&&x.getElementsByTagName("base").length?f.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(x.createTextNode("Created with Highcharts 4.0.3"));this.defs=this.createElement("defs").add();this.forExport=e;this.gradients={};this.cache={};this.setSize(b,c,!1);var h;if(Ta&&a.getBoundingClientRect)this.subPixelFix=b=function(){A(a,{left:0,top:0});h=a.getBoundingClientRect();
+A(a,{left:Ka(h.left)-h.left+"px",top:Ka(h.top)-h.top+"px"})},b(),N(H,"resize",b)},getStyle:function(a){return this.style=r({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Oa(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&X(H,"resize",this.subPixelFix);return this.alignedObjects=
+null},createElement:function(a){var b=new this.Element;b.init(this,a);return b},draw:function(){},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=p(a.textStr,"").toString(),f=e.indexOf("<")!==-1,g=b.childNodes,h,i,j=F(b,"x"),k=a.styles,l=a.textWidth,m=k&&k.lineHeight,n=k&&k.HcTextStroke,o=g.length,Y=function(a){return m?z(m):c.fontMetrics(/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:k&&k.fontSize||c.style.fontSize||12,a).h};o--;)b.removeChild(g[o]);!f&&!n&&e.indexOf(" ")===
+-1?b.appendChild(x.createTextNode(e)):(h=/<.*style="([^"]+)".*>/,i=/<.*href="(http[^"]+)".*>/,l&&!a.added&&this.box.appendChild(b),e=f?e.replace(/<(b|strong)>/g,'<span style="font-weight:bold">').replace(/<(i|em)>/g,'<span style="font-style:italic">').replace(/<a/g,"<span").replace(/<\/(b|strong|i|em|a)>/g,"</span>").split(/<br.*?>/g):[e],e[e.length-1]===""&&e.pop(),q(e,function(e,f){var g,m=0,e=e.replace(/<span/g,"|||<span").replace(/<\/span>/g,"</span>|||");g=e.split("|||");q(g,function(e){if(e!==
+""||g.length===1){var n={},o=x.createElementNS(xa,"tspan"),p;h.test(e)&&(p=e.match(h)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),F(o,"style",p));i.test(e)&&!d&&(F(o,"onclick",'location.href="'+e.match(i)[1]+'"'),A(o,{cursor:"pointer"}));e=(e.replace(/<(.|\n)*?>/g,"")||" ").replace(/&lt;/g,"<").replace(/&gt;/g,">");if(e!==" "){o.appendChild(x.createTextNode(e));if(m)n.dx=0;else if(f&&j!==null)n.x=j;F(o,n);b.appendChild(o);!m&&f&&(!ba&&d&&A(o,{display:"block"}),F(o,"dy",Y(o)));if(l)for(var e=e.replace(/([^\^])-/g,
+"$1- ").split(" "),n=g.length>1||e.length>1&&k.whiteSpace!=="nowrap",q,E,s=k.HcHeight,u=[],t=Y(o),Kb=1;n&&(e.length||u.length);)delete a.bBox,q=a.getBBox(),E=q.width,!ba&&c.forExport&&(E=c.measureSpanWidth(o.firstChild.data,a.styles)),q=E>l,!q||e.length===1?(e=u,u=[],e.length&&(Kb++,s&&Kb*t>s?(e=["..."],a.attr("title",a.textStr)):(o=x.createElementNS(xa,"tspan"),F(o,{dy:t,x:j}),p&&F(o,"style",p),b.appendChild(o))),E>l&&(l=E)):(o.removeChild(o.firstChild),u.unshift(e.pop())),e.length&&o.appendChild(x.createTextNode(e.join(" ").replace(/- /g,
+"-")));m++}}})}))},button:function(a,b,c,d,e,f,g,h,i){var j=this.label(a,b,c,i,null,null,null,null,"button"),k=0,l,m,n,o,p,q,a={x1:0,y1:0,x2:0,y2:1},e=w({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);n=e.style;delete e.style;f=w(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);o=f.style;delete f.style;g=w(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);p=g.style;
+delete g.style;h=w(e,{style:{color:"#CCC"}},h);q=h.style;delete h.style;N(j.element,Aa?"mouseover":"mouseenter",function(){k!==3&&j.attr(f).css(o)});N(j.element,Aa?"mouseout":"mouseleave",function(){k!==3&&(l=[e,f,g][k],m=[n,o,p][k],j.attr(l).css(m))});j.setState=function(a){(j.state=k=a)?a===2?j.attr(g).css(p):a===3&&j.attr(h).css(q):j.attr(e).css(n)};return j.on("click",function(){k!==3&&d.call(j)}).attr(e).css(r({cursor:"default"},n))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=v(a[1])-b%
+2/2);a[2]===a[5]&&(a[2]=a[5]=v(a[2])+b%2/2);return a},path:function(a){var b={fill:P};La(a)?b.d=a:da(a)&&r(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=da(a)?a:{x:a,y:b,r:c};b=this.createElement("circle");b.xSetter=function(a){this.element.setAttribute("cx",a)};b.ySetter=function(a){this.element.setAttribute("cy",a)};return b.attr(a)},arc:function(a,b,c,d,e,f){if(da(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||
+0,end:f||0});a.r=c;return a},rect:function(a,b,c,d,e,f){var e=da(a)?a.r:e,g=this.createElement("rect"),a=da(a)?a:a===t?{}:{x:a,y:b,width:u(c,0),height:u(d,0)};if(f!==t)a.strokeWidth=f,a=g.crisp(a);if(e)a.r=e;g.rSetter=function(a){F(this.element,{rx:a,ry:a})};return g.attr(a)},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[p(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return s(a)?
+b.attr({"class":"highcharts-"+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:P};arguments.length>1&&r(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(v(b),v(c),d,e,f),i=/^url\((.*?)\)$/,j,k;if(h)g=this.path(h),r(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&r(g,f);else if(i.test(a))k=
+function(a,b){a.element&&(a.attr({width:b[0],height:b[1]}),a.alignByTranslate||a.translate(v((d-b[0])/2),v((e-b[1])/2)))},j=a.match(i)[1],a=Ib[j],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),$("img",{onload:function(){k(g,Ib[j]=[this.width,this.height])},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+
+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=aa(f),j=fa(f),k=aa(g),g=fa(g),e=e.end-f<na?0:1;return["M",a+c*i,b+c*j,"A",c,c,0,e,1,a+c*k,b+c*g,h?"M":"L",a+d*k,b+d*g,"A",d,d,0,e,0,a+d*i,b+d*j,h?"":"Z"]},callout:function(a,b,c,d,
+e){var f=C(e&&e.r||0,c,d),g=f+6,h=e&&e.anchorX,i=e&&e.anchorY,e=v(e.strokeWidth||0)%2/2;a+=e;b+=e;e=["M",a+f,b,"L",a+c-f,b,"C",a+c,b,a+c,b,a+c,b+f,"L",a+c,b+d-f,"C",a+c,b+d,a+c,b+d,a+c-f,b+d,"L",a+f,b+d,"C",a,b+d,a,b+d,a,b+d-f,"L",a,b+f,"C",a,b,a,b,a+f,b];h&&h>c&&i>b+g&&i<b+d-g?e.splice(13,3,"L",a+c,i-6,a+c+6,i,a+c,i+6,a+c,b+d-f):h&&h<0&&i>b+g&&i<b+d-g?e.splice(33,3,"L",a,i+6,a-6,i,a,i-6,a,b+f):i&&i>d&&h>a+g&&h<a+c-g?e.splice(23,3,"L",h+6,b+d,h,b+d+6,h-6,b+d,a+f,b+d):i&&i<0&&h>a+g&&h<a+c-g&&e.splice(3,
+3,"L",h-6,b,h,b-6,h+6,b,c-f,b);return e}},clipRect:function(a,b,c,d){var e="highcharts-"+tb++,f=this.createElement("clipPath").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;return a},text:function(a,b,c,d){var e=ga||!ba&&this.forExport,f={};if(d&&!this.forExport)return this.html(a,b,c);f.x=Math.round(b||0);if(c)f.y=Math.round(c);if(a||a===0)f.text=a;a=this.createElement("text").attr(f);e&&a.css({position:"absolute"});if(!d)a.xSetter=function(a,b,c){var d=c.getElementsByTagName("tspan"),
+e,f=c.getAttribute(b),m;for(m=0;m<d.length;m++)e=d[m],e.getAttribute(b)===f&&e.setAttribute(b,a);c.setAttribute(b,a)};return a},fontMetrics:function(a,b){a=a||this.style.fontSize;if(b&&H.getComputedStyle)b=b.element||b,a=H.getComputedStyle(b,"").fontSize;var a=/px/.test(a)?z(a):/em/.test(a)?parseFloat(a)*12:12,c=a<24?a+4:v(a*1.2),d=v(c*0.8);return{h:c,b:d,f:a}},label:function(a,b,c,d,e,f,g,h,i){function j(){var a,b;a=o.element.style;E=(u===void 0||wb===void 0||n.styles.textAlign)&&o.textStr&&o.getBBox();
+n.width=(u||E.width||0)+2*D+jb;n.height=(wb||E.height||0)+2*D;R=D+m.fontMetrics(a&&a.fontSize,o).b;if(z){if(!p)a=v(-I*D),b=h?-R:0,n.box=p=d?m.symbol(d,a,b,n.width,n.height,y):m.rect(a,b,n.width,n.height,0,y[Pb]),p.attr("fill",P).add(n);p.isImg||p.attr(r({width:v(n.width),height:v(n.height)},y));y=null}}function k(){var a=n.styles,a=a&&a.textAlign,b=jb+D*(1-I),c;c=h?0:R;if(s(u)&&E&&(a==="center"||a==="right"))b+={center:0.5,right:1}[a]*(u-E.width);if(b!==o.x||c!==o.y)o.attr("x",b),c!==t&&o.attr("y",
+c);o.x=b;o.y=c}function l(a,b){p?p.attr(a,b):y[a]=b}var m=this,n=m.g(i),o=m.text("",0,0,g).attr({zIndex:1}),p,E,I=0,D=3,jb=0,u,wb,xb,x,Jb=0,y={},R,z;n.onAdd=function(){o.add(n);n.attr({text:a||"",x:b,y:c});p&&s(e)&&n.attr({anchorX:e,anchorY:f})};n.widthSetter=function(a){u=a};n.heightSetter=function(a){wb=a};n.paddingSetter=function(a){s(a)&&a!==D&&(D=a,k())};n.paddingLeftSetter=function(a){s(a)&&a!==jb&&(jb=a,k())};n.alignSetter=function(a){I={left:0,center:0.5,right:1}[a]};n.textSetter=function(a){a!==
+t&&o.textSetter(a);j();k()};n["stroke-widthSetter"]=function(a,b){a&&(z=!0);Jb=a%2/2;l(b,a)};n.strokeSetter=n.fillSetter=n.rSetter=function(a,b){b==="fill"&&a&&(z=!0);l(b,a)};n.anchorXSetter=function(a,b){e=a;l(b,a+Jb-xb)};n.anchorYSetter=function(a,b){f=a;l(b,a-x)};n.xSetter=function(a){n.x=a;I&&(a-=I*((u||E.width)+D));xb=v(a);n.attr("translateX",xb)};n.ySetter=function(a){x=n.y=v(a);n.attr("translateY",x)};var C=n.css;return r(n,{css:function(a){if(a){var b={},a=w(a);q(n.textProps,function(c){a[c]!==
+t&&(b[c]=a[c],delete a[c])});o.css(b)}return C.call(n,a)},getBBox:function(){return{width:E.width+2*D,height:E.height+2*D,x:E.x-D,y:E.y-D}},shadow:function(a){p&&p.shadow(a);return n},destroy:function(){X(n.element,"mouseenter");X(n.element,"mouseleave");o&&(o=o.destroy());p&&(p=p.destroy());G.prototype.destroy.call(n);n=m=j=k=l=null}})}};Ya=ta;r(G.prototype,{htmlCss:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();this.styles=
+r(this.styles,a);A(this.element,a);return this},htmlGetBBox:function(){var a=this.element,b=this.bBox;if(!b){if(a.nodeName==="text")a.style.position="absolute";b=this.bBox={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}return b},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=this.shadows;A(b,{marginLeft:c,marginTop:d});
+i&&q(i,function(a){A(a,{marginLeft:c+1,marginTop:d+1})});this.inverted&&q(b.childNodes,function(c){a.invertChild(c,b)});if(b.tagName==="SPAN"){var j=this.rotation,k,l=z(this.textWidth),m=[j,g,b.innerHTML,this.textWidth].join(",");if(m!==this.cTT){k=a.fontMetrics(b.style.fontSize).b;s(j)&&this.setSpanRotation(j,h,k);i=p(this.elemWidth,b.offsetWidth);if(i>l&&/[ \-]/.test(b.textContent||b.innerText))A(b,{width:l+"px",display:"block",whiteSpace:"normal"}),i=l;this.getSpanCorrection(i,k,h,j,g)}A(b,{left:e+
+(this.xCorr||0)+"px",top:f+(this.yCorr||0)+"px"});if(sb)k=b.offsetHeight;this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,c){var d={},e=Aa?"-ms-transform":sb?"-webkit-transform":Ta?"MozTransform":Gb?"-o-transform":"";d[e]=d.transform="rotate("+a+"deg)";d[e+(Ta?"Origin":"-origin")]=d.transformOrigin=b*100+"% "+c+"px";A(this.element,d)},getSpanCorrection:function(a,b,c){this.xCorr=-a*c;this.yCorr=-b}});r(ta.prototype,{html:function(a,b,c){var d=this.createElement("span"),e=d.element,
+f=d.renderer;d.textSetter=function(a){a!==e.innerHTML&&delete this.bBox;e.innerHTML=this.textStr=a};d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,b){b==="align"&&(b="textAlign");d[b]=a;d.htmlUpdateTransform()};d.attr({text:a,x:v(b),y:v(c)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});d.css=d.htmlCss;if(f.isSVG)d.add=function(a){var b,c=f.box.parentNode,j=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)j.push(a),a=a.parentGroup;
+q(j.reverse(),function(a){var d;b=a.div=a.div||$(Ja,{className:F(a.element,"class")},{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;r(a,{translateXSetter:function(b,c){d.left=b+"px";a[c]=b;a.doTransform=!0},translateYSetter:function(b,c){d.top=b+"px";a[c]=b;a.doTransform=!0},visibilitySetter:function(a,b){d[b]=a}})})}}else b=c;b.appendChild(e);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d};return d}});var Z;if(!ba&&!ga){Z={init:function(a,
+b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ","absolute",";"],e=b===Ja;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=$(c);this.renderer=a},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&
+this.updateTransform();if(this.onAdd)this.onAdd();return this},updateTransform:G.prototype.htmlUpdateTransform,setSpanRotation:function(){var a=this.rotation,b=aa(a*Ca),c=fa(a*Ca);A(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",b,", M12=",-c,", M21=",c,", M22=",b,", sizingMethod='auto expand')"].join(""):P})},getSpanCorrection:function(a,b,c,d,e){var f=d?aa(d*Ca):1,g=d?fa(d*Ca):0,h=p(this.elemHeight,this.element.offsetHeight),i;this.xCorr=f<0&&-a;this.yCorr=g<0&&-h;i=f*g<
+0;this.xCorr+=g*b*(i?1-c:c);this.yCorr-=f*b*(d?i?c:1-c:1);e&&e!=="left"&&(this.xCorr-=a*c*(f<0?-1:1),d&&(this.yCorr-=h*c*(g<0?-1:1)),A(this.element,{textAlign:e}))},pathToVML:function(a){for(var b=a.length,c=[];b--;)if(ia(a[b]))c[b]=v(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))c[b+5]===c[b+7]&&(c[b+7]+=a[b+7]>a[b+5]?1:-1),c[b+6]===c[b+8]&&(c[b+8]+=a[b+8]>a[b+6]?1:-1);return c.join(" ")||"x"},clip:function(a){var b=this,c;a?(c=a.members,ka(c,b),c.push(b),
+b.destroyClip=function(){ka(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:gb?"inherit":"rect(auto)"});return b.css(a)},css:G.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Pa(a)},destroy:function(){this.destroyClip&&this.destroyClip();return G.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=H.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=z(a[c-
+2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,n,o;k&&typeof k.value!=="string"&&(k="x");m=k;if(a){n=p(a.width,3);o=(a.opacity||0.15)/n;for(e=1;e<=3;e++){l=n*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=['<shape isShadow="true" strokeweight="',l,'" filled="false" path="',m,'" coordsize="10 10" style="',f.style.cssText,'" />'];h=$(g.prepVML(j),null,{left:z(i.left)+p(a.offsetX,1),top:z(i.top)+p(a.offsetY,1)});if(c)h.cutOff=
+l+1;j=['<stroke color="',a.color||"black",'" opacity="',o*e,'"/>'];$(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this},updateShadows:sa,setAttr:function(a,b){gb?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){this.element.className=a},dashstyleSetter:function(a,b,c){(c.getElementsByTagName("stroke")[0]||$(this.renderer.prepVML(["<stroke/>"]),null,null,c))[b]=a||"solid";this[b]=a},dSetter:function(a,b,
+c){var d=this.shadows,a=a||[];this.d=a.join&&a.join(" ");c.path=a=this.pathToVML(a);if(d)for(c=d.length;c--;)d[c].path=d[c].cutOff?this.cutOffPath(a,d[c].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,c){var d=c.nodeName;if(d==="SPAN")c.style.color=a;else if(d!=="IMG")c.filled=a!==P,this.setAttr("fillcolor",this.renderer.color(a,c,b,this))},opacitySetter:sa,rotationSetter:function(a,b,c){c=c.style;this[b]=c[b]=a;c.left=-v(fa(a*Ca)+1)+"px";c.top=v(aa(a*Ca))+"px"},strokeSetter:function(a,b,c){this.setAttr("strokecolor",
+this.renderer.color(a,c,b))},"stroke-widthSetter":function(a,b,c){c.stroked=!!a;this[b]=a;ia(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,c){a==="inherit"&&(a="visible");this.shadows&&q(this.shadows,function(c){c.style[b]=a});c.nodeName==="DIV"&&(a=a==="hidden"?"-999em":0,gb||(c.style[b]=a?"visible":"hidden"),b="top");c.style[b]=a},xSetter:function(a,b,c){this[b]=a;b==="x"?b="left":b==="y"&&(b="top");this.updateClipping?(this[b]=
+a,this.updateClipping()):c.style[b]=a},zIndexSetter:function(a,b,c){c.style[b]=a}};S.VMLElement=Z=la(G,Z);Z.prototype.ySetter=Z.prototype.widthSetter=Z.prototype.heightSetter=Z.prototype.xSetter;var ha={Element:Z,isIE8:wa.indexOf("MSIE 8.0")>-1,init:function(a,b,c,d){var e;this.alignedObjects=[];d=this.createElement(Ja).css(r(this.getStyle(d),{position:"relative"}));e=d.element;a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=d;this.cache={};this.setSize(b,c,!1);if(!x.namespaces.hcv){x.namespaces.add("hcv",
+"urn:schemas-microsoft-com:vml");try{x.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(f){x.styleSheets[0].cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=da(a);return r(e,{members:[],left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:
+c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=a.element,c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+v(a?e:d)+"px,"+v(a?f:b)+"px,"+v(a?b:f)+"px,"+v(a?d:e)+"px)"};!a&&gb&&c==="DIV"&&r(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){q(e.members,function(a){a.element&&a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=P;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&
+(i="pattern");if(i){var k,l,m=a.linearGradient||a.radialGradient,n,o,p,E,I,D="",a=a.stops,u,s=[],t=function(){h=['<fill colors="'+s.join(",")+'" opacity="',p,'" o:opacity2="',o,'" type="',i,'" ',D,'focus="100%" method="any" />'];$(e.prepVML(h),null,null,b)};n=a[0];u=a[a.length-1];n[0]>0&&a.unshift([0,n[1]]);u[0]<1&&a.push([1,u[1]]);q(a,function(a,b){g.test(a[1])?(f=ya(a[1]),k=f.get("rgb"),l=f.get("a")):(k=a[1],l=1);s.push(a[0]*100+"% "+k);b?(p=l,E=k):(o=l,I=k)});if(c==="fill")if(i==="gradient")c=
+m.x1||m[0]||0,a=m.y1||m[1]||0,n=m.x2||m[2]||0,m=m.y2||m[3]||0,D='angle="'+(90-V.atan((m-a)/(n-c))*180/na)+'"',t();else{var j=m.r,r=j*2,v=j*2,x=m.cx,y=m.cy,R=b.radialReference,w,j=function(){R&&(w=d.getBBox(),x+=(R[0]-w.x)/w.width-0.5,y+=(R[1]-w.y)/w.height-0.5,r*=R[2]/w.width,v*=R[2]/w.height);D='src="'+L.global.VMLRadialGradientURL+'" size="'+r+","+v+'" origin="0.5,0.5" position="'+x+","+y+'" color2="'+I+'" ';t()};d.added?j():d.onAdd=j;j=E}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=ya(a),h=
+["<",c,' opacity="',f.get("a"),'"/>'],$(this.prepVML(h),null,null,b),j=f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","<hcv:");
+return a},text:ta.prototype.html,path:function(a){var b={coordsize:"10 10"};La(a)?b.d=a:da(a)&&r(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,c){var d=this.symbol("circle");if(da(a))c=a.r,b=a.y,a=a.x;d.isCircle=!0;d.r=c;return d.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement(Ja).attr(b)},image:function(a,b,c,d,e){var f=this.createElement("img").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,
+height:e});return f},createElement:function(a){return a==="rect"?this.symbol(a):ta.prototype.createElement.call(this,a)},invertChild:function(a,b){var c=this,d=b.style,e=a.tagName==="IMG"&&a.style;A(a,{flip:"x",left:z(d.width)-(e?z(e.top):1),top:z(d.height)-(e?z(e.left):1),rotation:-90});q(a.childNodes,function(b){c.invertChild(b,a)})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=aa(f),i=fa(f),j=aa(g),k=fa(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,
+b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){return ta.prototype.symbols[!s(e)||!e.r?"square":"callout"].call(0,a,b,c,d,e)}}};S.VMLRenderer=Z=function(){this.init.apply(this,arguments)};Z.prototype=w(ta.prototype,ha);Ya=Z}ta.prototype.measureSpanWidth=function(a,b){var c=
+x.createElement("span"),d;d=x.createTextNode(a);c.appendChild(d);A(c,b);this.box.appendChild(c);d=c.offsetWidth;Pa(c);return d};var Lb;if(ga)S.CanVGRenderer=Z=function(){xa="http://www.w3.org/1999/xhtml"},Z.prototype.symbols={},Lb=function(){function a(){var a=b.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,d){b.length===0&&Qb(d,a);b.push(c)}}}(),Ya=Z;Sa.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.horiz,e=a.categories,f=a.names,g=this.pos,h=b.labels,
+i=h.rotation,j=a.tickPositions,d=d&&e&&!h.step&&!h.staggerLines&&!h.rotation&&c.plotWidth/j.length||!d&&(c.margin[3]||c.chartWidth*0.33),k=g===j[0],l=g===j[j.length-1],m,f=e?p(e[g],f[g],g):g,e=this.label,n=j.info;a.isDatetimeAxis&&n&&(m=b.dateTimeLabelFormats[n.higherRanks[g]||n.unitName]);this.isFirst=k;this.isLast=l;b=a.labelFormatter.call({axis:a,chart:c,isFirst:k,isLast:l,dateTimeLabelFormat:m,value:a.isLog?ea(ja(f)):f});g=d&&{width:u(1,v(d-2*(h.padding||10)))+"px"};g=r(g,h.style);if(s(e))e&&
+e.attr({text:b}).css(g);else{m={align:a.labelAlign};if(ia(i))m.rotation=i;if(d&&h.ellipsis)g.HcHeight=a.len/j.length;this.label=e=s(b)&&h.enabled?c.renderer.text(b,0,0,h.useHTML).attr(m).css(g).add(a.labelGroup):null;a.tickBaseline=c.renderer.fontMetrics(h.style.fontSize,e).b;i&&a.side===2&&(a.tickBaseline*=aa(i*Ca))}this.yOffset=e?p(h.y,a.tickBaseline+(a.side===2?8:-(e.getBBox().height/2))):0},getLabelSize:function(){var a=this.label,b=this.axis;return a?a.getBBox()[b.horiz?"height":"width"]:0},
+getLabelSides:function(){var a=this.label.getBBox(),b=this.axis,c=b.horiz,d=b.options.labels,a=c?a.width:a.height,b=c?d.x-a*{left:0,center:0.5,right:1}[b.labelAlign]:0;return[b,c?a+b:a]},handleOverflow:function(a,b){var c=!0,d=this.axis,e=this.isFirst,f=this.isLast,g=d.horiz?b.x:b.y,h=d.reversed,i=d.tickPositions,j=this.getLabelSides(),k=j[0],j=j[1],l,m,n,o=this.label.line||0;l=d.labelEdge;m=d.justifyLabels&&(e||f);l[o]===t||g+k>l[o]?l[o]=g+j:m||(c=!1);if(m){l=(m=d.justifyToPlot)?d.pos:0;m=m?l+d.len:
+d.chart.chartWidth;do a+=e?1:-1,n=d.ticks[i[a]];while(i[a]&&(!n||!n.label||n.label.line!==o));d=n&&n.label.xy&&n.label.xy.x+n.getLabelSides()[e?0:1];e&&!h||f&&h?g+k<l&&(g=l-k,n&&g+j>d&&(c=!1)):g+j>m&&(g=m-j,n&&g+k<d&&(c=!1));b.x=g}return c},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?g-e.bottom+e.offset-(e.opposite?e.height:
+0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,j=i.transA,k=i.reversed,l=i.staggerLines,a=a+e.x-(f&&d?f*j*(k?-1:1):0),b=b+this.yOffset-(f&&!d?f*j*(k?1:-1):0);if(l)c.line=g/(h||1)%l,b+=c.line*(i.labelOffset/l);return{x:a,y:b}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine(["M",a,b,"L",a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,j=this.pos,k=e.labels,
+l=this.gridLine,m=h?h+"Grid":"grid",n=h?h+"Tick":"tick",o=e[m+"LineWidth"],q=e[m+"LineColor"],E=e[m+"LineDashStyle"],I=e[n+"Length"],m=e[n+"Width"]||0,D=e[n+"Color"],u=e[n+"Position"],n=this.mark,s=k.step,r=!0,v=d.tickmarkOffset,w=this.getPosition(g,j,v,b),x=w.x,w=w.y,y=g&&x===d.pos+d.len||!g&&w===d.pos?-1:1,c=p(c,1);this.isActive=!0;if(o){j=d.getPlotLinePath(j+v,o*y,b,!0);if(l===t){l={stroke:q,"stroke-width":o};if(E)l.dashstyle=E;if(!h)l.zIndex=1;if(b)l.opacity=0;this.gridLine=l=o?f.path(j).attr(l).add(d.gridGroup):
+null}if(!b&&l&&j)l[this.isNew?"attr":"animate"]({d:j,opacity:c})}if(m&&I)u==="inside"&&(I=-I),d.opposite&&(I=-I),h=this.getMarkPath(x,w,I,m*y,g,f),n?n.animate({d:h,opacity:c}):this.mark=f.path(h).attr({stroke:D,"stroke-width":m,opacity:c}).add(d.axisGroup);if(i&&!isNaN(x))i.xy=w=this.getLabelPosition(x,w,i,g,k,v,a,s),this.isFirst&&!this.isLast&&!p(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!p(e.showLastLabel,1)?r=!1:!d.isRadial&&!k.step&&!k.rotation&&!b&&c!==0&&(r=this.handleOverflow(a,w)),
+s&&a%s&&(r=!1),r&&!isNaN(w.y)?(w.opacity=c,i[this.isNew?"attr":"animate"](w),this.isNew=!1):i.attr("y",-9999)},destroy:function(){Oa(this,this.axis)}};S.PlotLineOrBand=function(a,b){this.axis=a;if(b)this.options=b,this.id=b.id};S.PlotLineOrBand.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=(b.pointRange||0)/2,e=a.options,f=e.label,g=a.label,h=e.width,i=e.to,j=e.from,k=s(j)&&s(i),l=e.value,m=e.dashStyle,n=a.svgElem,o=[],p,q=e.color,I=e.zIndex,D=e.events,r={},t=b.chart.renderer;b.isLog&&
+(j=za(j),i=za(i),l=za(l));if(h){if(o=b.getPlotLinePath(l,h),r={stroke:q,"stroke-width":h},m)r.dashstyle=m}else if(k){j=u(j,b.min-d);i=C(i,b.max+d);o=b.getPlotBandPath(j,i,e);if(q)r.fill=q;if(e.borderWidth)r.stroke=e.borderColor,r["stroke-width"]=e.borderWidth}else return;if(s(I))r.zIndex=I;if(n)if(o)n.animate({d:o},null,n.onGetPath);else{if(n.hide(),n.onGetPath=function(){n.show()},g)a.label=g=g.destroy()}else if(o&&o.length&&(a.svgElem=n=t.path(o).attr(r).add(),D))for(p in d=function(b){n.on(b,function(c){D[b].apply(a,
+[c])})},D)d(p);if(f&&s(f.text)&&o&&o.length&&b.width>0&&b.height>0){f=w({align:c&&k&&"center",x:c?!k&&4:10,verticalAlign:!c&&k&&"middle",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},f);if(!g){r={align:f.textAlign||f.align,rotation:f.rotation};if(s(I))r.zIndex=I;a.label=g=t.text(f.text,0,0,f.useHTML).attr(r).css(f.style).add()}b=[o[1],o[4],k?o[6]:o[1]];k=[o[2],o[5],k?o[7]:o[2]];o=Na(b);c=Na(k);g.align(f,!1,{x:o,y:c,width:Ba(b)-o,height:Ba(k)-c});g.show()}else g&&g.hide();return a},destroy:function(){ka(this.axis.plotLinesAndBands,
+this);delete this.axis;Oa(this)}};ma.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:M,lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:10,
+tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#707070"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return Ga(this.total,-1)},style:M.style}},defaultLeftAxisOptions:{labels:{x:-15,y:null},title:{rotation:270}},
+defaultRightAxisOptions:{labels:{x:15,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:null},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-15},title:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.coll=(this.isXAxis=c)?"xAxis":"yAxis";this.opposite=b.opposite;this.side=b.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;
+this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.names=[];this.isLog=e==="logarithmic";this.isDatetimeAxis=e==="datetime";this.isLinked=s(d.linkedTo);this.tickmarkOffset=this.categories&&d.tickmarkPlacement==="between"?0.5:0;this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;
+this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.min=this.max=null;this.crosshair=p(d.crosshair,ra(a.options.tooltip.crosshairs)[c?0:1],!1);var f,d=this.options.events;Da(this,a.axes)===-1&&(c&&!this.isColorAxis?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];if(a.inverted&&c&&this.reversed===t)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)N(this,f,d[f]);if(this.isLog)this.val2lin=
+za,this.lin2val=ja},setOptions:function(a){this.options=w(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],w(L[this.coll],a))},defaultLabelFormatter:function(){var a=this.axis,b=this.value,c=a.categories,d=this.dateTimeLabelFormat,e=L.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ia(h,this);else if(c)g=b;else if(d)g=
+bb(d,b);else if(f&&a>=1E3)for(;f--&&g===t;)c=Math.pow(1E3,f+1),a>=c&&e[f]!==null&&(g=Ga(b/c,-1)+e[f]);g===t&&(g=Q(b)>=1E4?Ga(b,0):Ga(b,-1,t,""));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=null;a.buildStacks&&a.buildStacks();q(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d;d=c.options.threshold;var e;a.hasVisibleSeries=!0;a.isLog&&d<=0&&(d=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=C(p(a.dataMin,d[0]),
+Na(d)),a.dataMax=u(p(a.dataMax,d[0]),Ba(d))}else{c.getExtremes();e=c.dataMax;c=c.dataMin;if(s(c)&&s(e))a.dataMin=C(p(a.dataMin,c),c),a.dataMax=u(p(a.dataMax,e),e);if(s(d))if(a.dataMin>=d)a.dataMin=d,a.ignoreMinPadding=!0;else if(a.dataMax<d)a.dataMax=d,a.ignoreMaxPadding=!0}}})},translate:function(a,b,c,d,e,f){var g=1,h=0,i=d?this.oldTransA:this.transA,d=d?this.oldMin:this.min,j=this.minPixelPadding,e=(this.options.ordinal||this.isLog&&e)&&this.lin2val;if(!i)i=this.transA;if(c)g*=-1,h=this.len;this.reversed&&
+(g*=-1,h-=g*(this.sector||this.len));b?(a=a*g+h,a-=j,a=a/i+d,e&&(a=this.lin2val(a))):(e&&(a=this.val2lin(a)),f==="between"&&(f=0.5),a=g*(a-d)*i+h+g*j+(ia(f)?i*f*this.pointRange:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,c,d,e){var f=this.chart,g=this.left,h=this.top,i,j,k=c&&f.oldChartHeight||f.chartHeight,l=c&&f.oldChartWidth||
+f.chartWidth,m;i=this.transB;e=p(e,this.translate(a,null,null,c));a=c=v(e+i);i=j=v(k-e-i);if(isNaN(e))m=!0;else if(this.horiz){if(i=h,j=k-this.bottom,a<g||a>g+this.width)m=!0}else if(a=g,c=l-this.right,i<h||i>h+this.height)m=!0;return m&&!d?null:f.renderer.crispLine(["M",a,i,"L",c,j],b||1)},getLinearTickPositions:function(a,b,c){var d,e=ea(U(b/a)*a),f=ea(Ka(c/a)*a),g=[];if(b===c&&ia(b))return[b];for(b=e;b<=f;){g.push(b);b=ea(b+a);if(b===d)break;d=b}return g},getMinorTickPositions:function(){var a=
+this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e;if(this.isLog){e=b.length;for(a=1;a<e;a++)d=d.concat(this.getLogTickPositions(c,b[a-1],b[a],!0))}else if(this.isDatetimeAxis&&a.minorTickInterval==="auto")d=d.concat(this.getTimeTicks(this.normalizeTimeTickInterval(c),this.min,this.max,a.startOfWeek)),d[0]<this.min&&d.shift();else for(b=this.min+(b[0]-this.min)%c;b<=this.max;b+=c)d.push(b);return d},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-
+this.dataMin>=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===t&&!this.isLog)s(a.min)||s(a.max)?this.minRange=null:(q(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-1;g>0;g--)if(h=i[g]-i[g-1],f===t||h<f)f=h}),this.minRange=C(f*5,this.dataMax-this.dataMin));if(c-b<this.minRange){var k=this.minRange;d=(k-c+b)/2;d=[b-d,p(a.min,b-d)];if(e)d[2]=this.dataMin;b=Ba(d);c=[b+k,p(a.max,b+k)];if(e)c[2]=this.dataMax;c=Na(c);c-b<k&&(d[0]=c-k,d[1]=p(a.min,c-k),b=Ba(d))}this.min=b;this.max=
+c},setAxisTranslation:function(a){var b=this,c=b.max-b.min,d=b.axisPointRange||0,e,f=0,g=0,h=b.linkedParent,i=!!b.categories,j=b.transA;if(b.isXAxis||i||d)h?(f=h.minPointOffset,g=h.pointRangePadding):q(b.series,function(a){var h=i?1:b.isXAxis?a.pointRange:b.axisPointRange||0,j=a.options.pointPlacement,n=a.closestPointRange;h>c&&(h=0);d=u(d,h);f=u(f,Fa(j)?0:h/2);g=u(g,j==="on"?0:h);!a.noSharedTooltip&&s(n)&&(e=s(e)?C(e,n):n)}),h=b.ordinalSlope&&e?b.ordinalSlope/e:1,b.minPointOffset=f*=h,b.pointRangePadding=
+g*=h,b.pointRange=C(d,c),b.closestPointRange=e;if(a)b.oldTransA=j;b.translationSlope=b.transA=j=b.len/(c+g||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=j*f},setTickPositions:function(a){var b=this,c=b.chart,d=b.options,e=d.startOnTick,f=d.endOnTick,g=b.isLog,h=b.isDatetimeAxis,i=b.isXAxis,j=b.isLinked,k=b.options.tickPositioner,l=d.maxPadding,m=d.minPadding,n=d.tickInterval,o=d.minTickInterval,Y=d.tickPixelInterval,E,I=b.categories;j?(b.linkedParent=c[b.coll][d.linkedTo],c=b.linkedParent.getExtremes(),
+b.min=p(c.min,c.dataMin),b.max=p(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&oa(11,1)):(b.min=p(b.userMin,d.min,b.dataMin),b.max=p(b.userMax,d.max,b.dataMax));if(g)!a&&C(b.min,p(b.dataMin,b.min))<=0&&oa(10,1),b.min=ea(za(b.min)),b.max=ea(za(b.max));if(b.range&&s(b.max))b.userMin=b.min=u(b.min,b.max-b.range),b.userMax=b.max,b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!I&&!b.axisPointRange&&!b.usePercentage&&!j&&s(b.min)&&s(b.max)&&(c=b.max-b.min)){if(!s(d.min)&&
+!s(b.userMin)&&m&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=c*m;if(!s(d.max)&&!s(b.userMax)&&l&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*l}if(ia(d.floor))b.min=u(b.min,d.floor);if(ia(d.ceiling))b.max=C(b.max,d.ceiling);b.min===b.max||b.min===void 0||b.max===void 0?b.tickInterval=1:j&&!n&&Y===b.linkedParent.options.tickPixelInterval?b.tickInterval=b.linkedParent.tickInterval:(b.tickInterval=p(n,I?1:(b.max-b.min)*Y/u(b.len,Y)),!s(n)&&b.len<Y&&!this.isRadial&&!this.isLog&&!I&&e&&f&&(E=!0,b.tickInterval/=
+4));i&&!a&&q(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange)b.tickInterval=u(b.pointRange,b.tickInterval);if(!n&&b.tickInterval<o)b.tickInterval=o;if(!h&&!g&&!n)b.tickInterval=mb(b.tickInterval,null,lb(b.tickInterval),d);b.minorTickInterval=d.minorTickInterval==="auto"&&b.tickInterval?b.tickInterval/
+5:d.minorTickInterval;b.tickPositions=a=d.tickPositions?[].concat(d.tickPositions):k&&k.apply(b,[b.min,b.max]);if(!a)!b.ordinalPositions&&(b.max-b.min)/b.tickInterval>u(2*b.len,200)&&oa(19,!0),a=h?b.getTimeTicks(b.normalizeTimeTickInterval(b.tickInterval,d.units),b.min,b.max,d.startOfWeek,b.ordinalPositions,b.closestPointRange,!0):g?b.getLogTickPositions(b.tickInterval,b.min,b.max):b.getLinearTickPositions(b.tickInterval,b.min,b.max),E&&a.splice(1,a.length-2),b.tickPositions=a;if(!j)d=a[0],g=a[a.length-
+1],h=b.minPointOffset||0,!e&&!f&&!I&&a.length===2&&a.splice(1,0,(g+d)/2),e?b.min=d:b.min-h>d&&a.shift(),f?b.max=g:b.max+h<g&&a.pop(),a.length===1&&(e=Q(b.max)>1E13?1:0.001,b.min-=e,b.max+=e)},setMaxTicks:function(){var a=this.chart,b=a.maxTicks||{},c=this.tickPositions,d=this._maxTicksKey=[this.coll,this.pos,this.len].join("-");if(!this.isLinked&&!this.isDatetimeAxis&&c&&c.length>(b[d]||0)&&this.options.alignTicks!==!1)b[d]=c.length;a.maxTicks=b},adjustTickAmount:function(){var a=this._maxTicksKey,
+b=this.tickPositions,c=this.chart.maxTicks;if(c&&c[a]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1&&this.min!==t){var d=this.tickAmount,e=b.length;this.tickAmount=a=c[a];if(e<a){for(;b.length<a;)b.push(ea(b[b.length-1]+this.tickInterval));this.transA*=(e-1)/(a-1);this.max=b[b.length-1]}if(s(d)&&a!==d)this.isDirty=!0}},setScale:function(){var a=this.stacks,b,c,d,e;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();e=this.len!==
+this.oldAxisLength;q(this.series,function(a){if(a.isDirtyData||a.isDirty||a.xAxis.isDirty)d=!0});if(e||d||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax){if(!this.isXAxis)for(b in a)for(c in a[b])a[b][c].total=null,a[b][c].cum=0;this.forceRedraw=!1;this.getSeriesExtremes();this.setTickPositions();this.oldUserMin=this.userMin;this.oldUserMax=this.userMax;if(!this.isDirty)this.isDirty=e||this.min!==this.oldMin||this.max!==this.oldMax}else if(!this.isXAxis){if(this.oldStacks)a=
+this.stacks=this.oldStacks;for(b in a)for(c in a[b])a[b][c].cum=a[b][c].total}this.setMaxTicks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=p(c,!0),e=r(e,{min:a,max:b});K(f,"setExtremes",e,function(){f.userMin=a;f.userMax=b;f.eventArgs=e;f.isDirtyExtremes=!0;c&&g.redraw(d)})},zoom:function(a,b){var c=this.dataMin,d=this.dataMax,e=this.options;this.allowZoomOutside||(s(c)&&a<=C(c,p(e.min,c))&&(a=t),s(d)&&b>=u(d,p(e.max,d))&&(b=t));this.displayBtn=a!==t||b!==t;this.setExtremes(a,b,!1,t,
+{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,e=p(b.width,a.plotWidth-c+(b.offsetRight||0)),f=p(b.height,a.plotHeight),g=p(b.top,a.plotTop),b=p(b.left,a.plotLeft+c),c=/%$/;c.test(f)&&(f=parseInt(f,10)/100*a.plotHeight);c.test(g)&&(g=parseInt(g,10)/100*a.plotHeight+a.plotTop);this.left=b;this.top=g;this.width=e;this.height=f;this.bottom=a.chartHeight-f-g;this.right=a.chartWidth-e-b;this.len=u(d?e:f,0);this.pos=d?b:g},getExtremes:function(){var a=
+this.isLog;return{min:a?ea(ja(this.min)):this.min,max:a?ea(ja(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?ja(this.min):this.min,b=b?ja(this.max):this.max;c>a||a===null?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(p(a,0)-this.side*90+720)%360;return a>15&&a<165?"right":a>195&&a<345?"left":"center"},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,
+e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k,l=0,m,n=0,o=d.title,Y=d.labels,E=0,I=b.axisOffset,b=b.clipOffset,D=[-1,1,1,-1][h],r,v=1,w=p(Y.maxStaggerLines,5),x,z,C,y,R;a.hasData=j=a.hasVisibleSeries||s(a.min)&&s(a.max)&&!!e;a.showAxis=k=j||p(d.showEmpty,!0);a.staggerLines=a.horiz&&Y.staggerLines;if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g("axis-labels").attr({zIndex:Y.zIndex||
+7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels").add();if(j||a.isLinked){a.labelAlign=p(Y.align||a.autoLabelAlign(Y.rotation));q(e,function(b){f[b]?f[b].addLabel():f[b]=new Sa(a,b)});if(a.horiz&&!a.staggerLines&&w&&!Y.rotation){for(j=a.reversed?[].concat(e).reverse():e;v<w;){x=[];z=!1;for(r=0;r<j.length;r++)C=j[r],y=(y=f[C].label&&f[C].label.getBBox())?y.width:0,R=r%v,y&&(C=a.translate(C),x[R]!==t&&C<x[R]&&(z=!0),x[R]=C+y);if(z)v++;else break}if(v>1)a.staggerLines=v}q(e,function(b){if(h===
+0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)E=u(f[b].getLabelSize(),E)});if(a.staggerLines)E*=a.staggerLines,a.labelOffset=E}else for(r in f)f[r].destroy(),delete f[r];if(o&&o.text&&o.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(o.text,0,0,o.useHTML).attr({zIndex:7,rotation:o.rotation||0,align:o.textAlign||{low:"left",middle:"center",high:"right"}[o.align]}).addClass("highcharts-"+this.coll.toLowerCase()+"-title").css(o.style).add(a.axisGroup),a.axisTitle.isNew=!0;if(k)l=a.axisTitle.getBBox()[g?
+"height":"width"],m=o.offset,n=s(m)?0:p(o.margin,g?5:10);a.axisTitle[k?"show":"hide"]()}a.offset=D*p(d.offset,I[h]);c=h===2?a.tickBaseline:0;g=E+n+(E&&D*(g?p(Y.y,a.tickBaseline+8):Y.x)-c);a.axisTitleMargin=p(m,g);I[h]=u(I[h],a.axisTitleMargin+l+D*a.offset,g);b[i]=u(b[i],U(d.lineWidth/2)*2)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",e?
+this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=z(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this,
+b=a.horiz,c=a.reversed,d=a.chart,e=d.renderer,f=a.options,g=a.isLog,h=a.isLinked,i=a.tickPositions,j,k=a.axisTitle,l=a.ticks,m=a.minorTicks,n=a.alternateBands,o=f.stackLabels,p=f.alternateGridColor,E=a.tickmarkOffset,I=f.lineWidth,D=d.hasRendered&&s(a.oldMin)&&!isNaN(a.oldMin),r=a.hasData,u=a.showAxis,v,w=f.labels.overflow,x=a.justifyLabels=b&&w!==!1,z;a.labelEdge.length=0;a.justifyToPlot=w==="justify";q([l,m,n],function(a){for(var b in a)a[b].isActive=!1});if(r||h)if(a.minorTickInterval&&!a.categories&&
+q(a.getMinorTickPositions(),function(b){m[b]||(m[b]=new Sa(a,b,"minor"));D&&m[b].isNew&&m[b].render(null,!0);m[b].render(null,!1,1)}),i.length&&(j=i.slice(),(b&&c||!b&&!c)&&j.reverse(),x&&(j=j.slice(1).concat([j[0]])),q(j,function(b,c){x&&(c=c===j.length-1?0:c+1);if(!h||b>=a.min&&b<=a.max)l[b]||(l[b]=new Sa(a,b)),D&&l[b].isNew&&l[b].render(c,!0,0.1),l[b].render(c)}),E&&a.min===0&&(l[-1]||(l[-1]=new Sa(a,-1,null,!0)),l[-1].render(-1))),p&&q(i,function(b,c){if(c%2===0&&b<a.max)n[b]||(n[b]=new S.PlotLineOrBand(a)),
+v=b+E,z=i[c+1]!==t?i[c+1]+E:a.max,n[b].options={from:g?ja(v):v,to:g?ja(z):z,color:p},n[b].render(),n[b].isActive=!0}),!a._addedPlotLB)q((f.plotLines||[]).concat(f.plotBands||[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0;q([l,m,n],function(a){var b,c,e=[],f=va?va.duration||500:0,g=function(){for(c=e.length;c--;)a[e[c]]&&!a[e[c]].isActive&&(a[e[c]].destroy(),delete a[e[c]])};for(b in a)if(!a[b].isActive)a[b].render(b,!1,0),a[b].isActive=!1,e.push(b);a===n||!d.hasRendered||!f?g():f&&setTimeout(g,
+f)});if(I)b=a.getLinePath(I),a.axisLine?a.axisLine.animate({d:b}):a.axisLine=e.path(b).attr({stroke:f.lineColor,"stroke-width":I,zIndex:7}).add(a.axisGroup),a.axisLine[u?"show":"hide"]();if(k&&u)k[k.isNew?"attr":"animate"](a.getTitlePosition()),k.isNew=!1;o&&o.enabled&&a.renderStackTotals();a.isDirty=!1},redraw:function(){this.render();q(this.plotLinesAndBands,function(a){a.render()});q(this.series,function(a){a.isDirty=!0})},destroy:function(a){var b=this,c=b.stacks,d,e=b.plotLinesAndBands;a||X(b);
+for(d in c)Oa(c[d]),c[d]=null;q([b.ticks,b.minorTicks,b.alternateBands],function(a){Oa(a)});for(a=e.length;a--;)e[a].destroy();q("stackTotalGroup,axisLine,axisTitle,axisGroup,cross,gridGroup,labelGroup".split(","),function(a){b[a]&&(b[a]=b[a].destroy())});this.cross&&this.cross.destroy()},drawCrosshair:function(a,b){if(this.crosshair)if((s(b)||!p(this.crosshair.snap,!0))===!1)this.hideCrosshair();else{var c,d=this.crosshair,e=d.animation;p(d.snap,!0)?s(b)&&(c=this.chart.inverted!=this.horiz?b.plotX:
+this.len-b.plotY):c=this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos;c=this.isRadial?this.getPlotLinePath(this.isXAxis?b.x:p(b.stackY,b.y)):this.getPlotLinePath(null,null,null,null,c);if(c===null)this.hideCrosshair();else if(this.cross)this.cross.attr({visibility:"visible"})[e?"animate":"attr"]({d:c},e);else{e={"stroke-width":d.width||1,stroke:d.color||"#C0C0C0",zIndex:d.zIndex||2};if(d.dashStyle)e.dashstyle=d.dashStyle;this.cross=this.chart.renderer.path(c).attr(e).add()}}},hideCrosshair:function(){this.cross&&
+this.cross.hide()}};r(ma.prototype,{getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b),d=this.getPlotLinePath(a);d&&c?d.push(c[4],c[5],c[1],c[2]):d=null;return d},addPlotBand:function(a){return this.addPlotBandOrLine(a,"plotBands")},addPlotLine:function(a){return this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(a,b){var c=(new S.PlotLineOrBand(this,a)).render(),d=this.userOptions;c&&(b&&(d[b]=d[b]||[],d[b].push(a)),this.plotLinesAndBands.push(c));return c},removePlotBandOrLine:function(a){for(var b=
+this.plotLinesAndBands,c=this.options,d=this.userOptions,e=b.length;e--;)b[e].id===a&&b[e].destroy();q([c.plotLines||[],d.plotLines||[],c.plotBands||[],d.plotBands||[]],function(b){for(e=b.length;e--;)b[e].id===a&&ka(b,b[e])})}});ma.prototype.getTimeTicks=function(a,b,c,d){var e=[],f={},g=L.global.useUTC,h,i=new Date(b-Ra),j=a.unitRange,k=a.count;if(s(b)){j>=B.second&&(i.setMilliseconds(0),i.setSeconds(j>=B.minute?0:k*U(i.getSeconds()/k)));if(j>=B.minute)i[Bb](j>=B.hour?0:k*U(i[ob]()/k));if(j>=B.hour)i[Cb](j>=
+B.day?0:k*U(i[pb]()/k));if(j>=B.day)i[rb](j>=B.month?1:k*U(i[Wa]()/k));j>=B.month&&(i[Db](j>=B.year?0:k*U(i[eb]()/k)),h=i[fb]());j>=B.year&&(h-=h%k,i[Eb](h));if(j===B.week)i[rb](i[Wa]()-i[qb]()+p(d,1));b=1;Ra&&(i=new Date(i.getTime()+Ra));h=i[fb]();for(var d=i.getTime(),l=i[eb](),m=i[Wa](),n=g?Ra:(864E5+i.getTimezoneOffset()*6E4)%864E5;d<c;)e.push(d),j===B.year?d=db(h+b*k,0):j===B.month?d=db(h,l+b*k):!g&&(j===B.day||j===B.week)?d=db(h,l,m+b*k*(j===B.day?1:7)):d+=j*k,b++;e.push(d);q(vb(e,function(a){return j<=
+B.hour&&a%B.day===n}),function(a){f[a]="day"})}e.info=r(a,{higherRanks:f,totalRange:j*k});return e};ma.prototype.normalizeTimeTickInterval=function(a,b){var c=b||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]],d=c[c.length-1],e=B[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=B[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+B[c[g+1][0]])/2)break;e===B.year&&
+a<5*e&&(f=[1,2,5]);c=mb(a/e,f,d[0]==="year"?u(lb(a/e),1):1);return{unitRange:e,count:c,unitName:d[0]}};ma.prototype.getLogTickPositions=function(a,b,c,d){var e=this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=v(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=U(b),h,i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!l;f++){i=e.length;for(h=0;h<i&&!l;h++)j=za(ja(f)*e[h]),j>b&&(!d||k<=c)&&k!==t&&g.push(k),k>c&&(l=!0),k=j}else if(b=ja(b),
+c=ja(c),a=e[d?"minorTickInterval":"tickInterval"],a=p(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=mb(a,null,lb(a)),g=Ua(this.getLinearTickPositions(a,b,c),za),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g};var Mb=S.Tooltip=function(){this.init.apply(this,arguments)};Mb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=z(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,
+y:0};this.isHidden=!0;this.label=a.renderer.label("",0,0,b.shape||"callout",null,null,b.useHTML,null,"tooltip").attr({padding:e,fill:b.backgroundColor,"stroke-width":c,r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-9999});ga||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden&&
+(Q(a-f.x)>1||Q(b-f.y)>1),h=e.followPointer||e.len>1;r(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:h?t:g?(2*f.anchorX+c)/3:c,anchorY:h?t:g?(f.anchorY+d)/2:d});e.label.attr(f);if(g)clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(){var a=this,b;clearTimeout(this.hideTimer);if(!this.isHidden)b=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){a.label.fadeOut();a.isHidden=!0},p(this.options.hideDelay,500)),b&&q(b,function(a){a.setState()}),
+this.chart.hoverPoints=null},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=0,h=0,i,a=ra(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===t&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(q(a,function(a){i=a.series.yAxis;g+=a.plotX;h+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&i?i.top-f:0)}),g/=a.length,h/=a.length,c=[e?d.plotWidth-h:g,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-g:h]);return Ua(c,v)},getPosition:function(a,b,c){var d=
+this.chart,e=this.distance,f={},g,h=["y",d.chartHeight,b,c.plotY+d.plotTop],i=["x",d.chartWidth,a,c.plotX+d.plotLeft],j=c.ttBelow||d.inverted&&!c.negative||!d.inverted&&c.negative,k=function(a,b,c,d){var g=c<d-e,b=d+e+c<b,c=d-e-c;d+=e;if(j&&b)f[a]=d;else if(!j&&g)f[a]=c;else if(g)f[a]=c;else if(b)f[a]=d;else return!1},l=function(a,b,c,d){if(d<e||d>b-e)return!1;else f[a]=d<c/2?1:d>b-c/2?b-c-2:d-c/2},m=function(a){var b=h;h=i;i=b;g=a},n=function(){k.apply(0,h)!==!1?l.apply(0,i)===!1&&!g&&(m(!0),n()):
+g?f.x=f.y=0:(m(!0),n())};(d.inverted||this.len>1)&&m();n();return f},defaultFormatter:function(a){var b=this.points||ra(this),c=b[0].series,d;d=[a.tooltipHeaderFormatter(b[0])];q(b,function(a){c=a.series;d.push(c.tooltipFormatter&&c.tooltipFormatter(a)||a.point.tooltipFormatter(c.tooltipOptions.pointFormat))});d.push(a.options.footerFormat||"");return d.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h={},i,j=[];i=e.formatter||this.defaultFormatter;var h=c.hoverPoints,
+k,l=this.shared;clearTimeout(this.hideTimer);this.followPointer=ra(a)[0].series.tooltipOptions.followPointer;g=this.getAnchor(a,b);f=g[0];g=g[1];l&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,h&&q(h,function(a){a.setState()}),q(a,function(a){a.setState("hover");j.push(a.getLabelConfig())}),h={x:a[0].category,y:a[0].y},h.points=j,this.len=j.length,a=a[0]):h=a.getLabelConfig();i=i.call(h,this);h=a.series;this.distance=p(h.tooltipOptions.distance,16);i===!1?this.hide():(this.isHidden&&(ab(d),
+d.attr("opacity",1).show()),d.attr({text:i}),k=e.borderColor||a.color||h.color||"#606060",d.attr({stroke:k}),this.updatePosition({plotX:f,plotY:g,negative:a.negative,ttBelow:a.ttBelow}),this.isHidden=!1);K(c,"tooltipRefresh",{text:i,x:f+c.plotLeft,y:g+c.plotTop,borderColor:k})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||this.getPosition).call(this,c.width,c.height,a);this.move(v(c.x),v(c.y),a.plotX+b.plotLeft,a.plotY+b.plotTop)},tooltipHeaderFormatter:function(a){var b=
+a.series,c=b.tooltipOptions,d=c.dateTimeLabelFormats,e=c.xDateFormat,f=b.xAxis,g=f&&f.options.type==="datetime"&&ia(a.key),c=c.headerFormat,f=f&&f.closestPointRange,h;if(g&&!e){if(f)for(h in B){if(B[h]>=f||B[h]<=B.day&&a.key%B[h]>0){e=d[h];break}}else e=d.day;e=e||d.year}g&&e&&(c=c.replace("{point.key}","{point.key:"+e+"}"));return Ia(c,{point:a,series:b})}};var pa;Za=x.documentElement.ontouchstart!==t;var Va=S.Pointer=function(a,b){this.init(a,b)};Va.prototype={init:function(a,b){var c=b.chart,d=
+c.events,e=ga?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.hasZoom=f||e;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(S.Tooltip&&b.tooltip.enabled)a.tooltip=new Mb(a,b.tooltip),this.followTouchMove=b.tooltip.followTouchMove;this.setDOMEvents()},normalize:function(a,b){var c,d,a=a||window.event,a=Sb(a);if(!a.target)a.target=a.srcElement;d=a.touches?a.touches.length?
+a.touches.item(0):a.changedTouches[0]:a;if(!b)this.chartPosition=b=Rb(this.chart.container);d.pageX===t?(c=u(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,d=d.pageY-b.top);return r(a,{chartX:v(c),chartY:v(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};q(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},getIndex:function(a){var b=this.chart;return b.inverted?b.plotHeight+b.plotTop-a.chartY:a.chartX-b.plotLeft},
+runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e,f,g=b.hoverPoint,h=b.hoverSeries,i,j,k=b.chartWidth,l=this.getIndex(a);if(d&&this.options.tooltip.shared&&(!h||!h.noSharedTooltip)){f=[];i=c.length;for(j=0;j<i;j++)if(c[j].visible&&c[j].options.enableMouseTracking!==!1&&!c[j].noSharedTooltip&&c[j].singularTooltips!==!0&&c[j].tooltipPoints.length&&(e=c[j].tooltipPoints[l])&&e.series)e._dist=Q(l-e.clientX),k=C(k,e._dist),f.push(e);for(i=f.length;i--;)f[i]._dist>k&&f.splice(i,1);if(f.length&&
+f[0].clientX!==this.hoverX)d.refresh(f,a),this.hoverX=f[0].clientX}c=h&&h.tooltipOptions.followPointer;if(h&&h.tracker&&!c){if((e=h.tooltipPoints[l])&&e!==g)e.onMouseOver(a)}else d&&c&&!d.isHidden&&(h=d.getAnchor([{}],a),d.updatePosition({plotX:h[0],plotY:h[1]}));if(d&&!this._onDocumentMouseMove)this._onDocumentMouseMove=function(a){if(W[pa])W[pa].pointer.onDocumentMouseMove(a)},N(x,"mousemove",this._onDocumentMouseMove);q(b.axes,function(b){b.drawCrosshair(a,p(e,g))})},reset:function(a){var b=this.chart,
+c=b.hoverSeries,d=b.hoverPoint,e=b.tooltip,f=e&&e.shared?b.hoverPoints:d;(a=a&&e&&f)&&ra(f)[0].plotX===t&&(a=!1);if(a)e.refresh(f),d&&d.setState(d.state,!0);else{if(d)d.onMouseOut();if(c)c.onMouseOut();e&&e.hide();if(this._onDocumentMouseMove)X(x,"mousemove",this._onDocumentMouseMove),this._onDocumentMouseMove=null;q(b.axes,function(a){a.hideCrosshair()});this.hoverX=null}},scaleGroups:function(a,b){var c=this.chart,d;q(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),
+e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,j=b.plotWidth,k=b.plotHeight,l,m=this.mouseDownX,n=this.mouseDownY,
+o=c.panKey&&a[c.panKey+"Key"];d<h?d=h:d>h+j&&(d=h+j);e<i?e=i:e>i+k&&(e=i+k);this.hasDragged=Math.sqrt(Math.pow(m-d,2)+Math.pow(n-e,2));if(this.hasDragged>10){l=b.isInsidePlot(m-h,n-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!o&&!this.selectionMarker)this.selectionMarker=b.renderer.rect(h,i,f?1:j,g?1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();this.selectionMarker&&f&&(d-=m,this.selectionMarker.attr({width:Q(d),x:(d>0?0:d)+m}));this.selectionMarker&&
+g&&(d=e-n,this.selectionMarker.attr({height:Q(d),y:(d>0?0:d)+n}));l&&!this.selectionMarker&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this.chart,c=this.hasPinched;if(this.selectionMarker){var d={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},e=this.selectionMarker,f=e.attr?e.attr("x"):e.x,g=e.attr?e.attr("y"):e.y,h=e.attr?e.attr("width"):e.width,i=e.attr?e.attr("height"):e.height,j;if(this.hasDragged||c)q(b.axes,function(b){if(b.zoomEnabled){var c=b.horiz,e=a.type==="touchend"?b.minPixelPadding:
+0,n=b.toValue((c?f:g)+e),c=b.toValue((c?f+h:g+i)-e);!isNaN(n)&&!isNaN(c)&&(d[b.coll].push({axis:b,min:C(n,c),max:u(n,c)}),j=!0)}}),j&&K(b,"selection",d,function(a){b.zoom(r(a,c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();c&&this.scaleGroups()}if(b)A(b.container,{cursor:b._cursor}),b.cancelClick=this.hasDragged>10,b.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=this.normalize(a);a.preventDefault&&a.preventDefault();
+this.dragStart(a)},onDocumentMouseUp:function(a){W[pa]&&W[pa].pointer.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,d=b.hoverSeries,a=this.normalize(a,c);c&&d&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){var a=W[pa];if(a)a.pointer.reset(),a.pointer.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart;pa=b.index;a=this.normalize(a);a.returnValue=
+!1;b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=F(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries,c=(a=a.relatedTarget||a.toElement)&&a.point&&a.point.series;if(b&&!b.options.stickyTracking&&!this.inClass(a,
+"highcharts-tooltip")&&c!==b)b.onMouseOut()},onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,a=this.normalize(a);a.cancelBubble=!0;b.cancelClick||(c&&this.inClass(a.target,"highcharts-tracker")?(K(c.series,"click",r(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(r(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&K(b,"click",a)))},setDOMEvents:function(){var a=this,b=a.chart.container;b.onmousedown=function(b){a.onContainerMouseDown(b)};
+b.onmousemove=function(b){a.onContainerMouseMove(b)};b.onclick=function(b){a.onContainerClick(b)};N(b,"mouseleave",a.onContainerMouseLeave);$a===1&&N(x,"mouseup",a.onDocumentMouseUp);if(Za)b.ontouchstart=function(b){a.onContainerTouchStart(b)},b.ontouchmove=function(b){a.onContainerTouchMove(b)},$a===1&&N(x,"touchend",a.onDocumentTouchEnd)},destroy:function(){var a;X(this.chart.container,"mouseleave",this.onContainerMouseLeave);$a||(X(x,"mouseup",this.onDocumentMouseUp),X(x,"touchend",this.onDocumentTouchEnd));
+clearInterval(this.tooltipTimeout);for(a in this)this[a]=null}};r(S.Pointer.prototype,{pinchTranslate:function(a,b,c,d,e,f){(this.zoomHor||this.pinchHor)&&this.pinchTranslateDirection(!0,a,b,c,d,e,f);(this.zoomVert||this.pinchVert)&&this.pinchTranslateDirection(!1,a,b,c,d,e,f)},pinchTranslateDirection:function(a,b,c,d,e,f,g,h){var i=this.chart,j=a?"x":"y",k=a?"X":"Y",l="chart"+k,m=a?"width":"height",n=i["plot"+(a?"Left":"Top")],o,p,q=h||1,r=i.inverted,D=i.bounds[a?"h":"v"],u=b.length===1,s=b[0][l],
+v=c[0][l],t=!u&&b[1][l],w=!u&&c[1][l],x,c=function(){!u&&Q(s-t)>20&&(q=h||Q(v-w)/Q(s-t));p=(n-v)/q+s;o=i["plot"+(a?"Width":"Height")]/q};c();b=p;b<D.min?(b=D.min,x=!0):b+o>D.max&&(b=D.max-o,x=!0);x?(v-=0.8*(v-g[j][0]),u||(w-=0.8*(w-g[j][1])),c()):g[j]=[v,w];r||(f[j]=p-n,f[m]=o);f=r?1/q:q;e[m]=o;e[j]=b;d[r?a?"scaleY":"scaleX":"scale"+k]=q;d["translate"+k]=f*n+(v-f*s)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=b.followTouchMove,f=a.touches,g=f.length,h=b.lastValidTouch,i=b.hasZoom,j=b.selectionMarker,
+k={},l=g===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||c.runChartClick),m={};(i||e)&&!l&&a.preventDefault();Ua(f,function(a){return b.normalize(a)});if(a.type==="touchstart")q(f,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),h.x=[d[0].chartX,d[1]&&d[1].chartX],h.y=[d[0].chartY,d[1]&&d[1].chartY],q(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],d=a.minPixelPadding,e=a.toPixels(p(a.options.min,a.dataMin)),f=a.toPixels(p(a.options.max,a.dataMax)),g=
+C(e,f),e=u(e,f);b.min=C(a.pos,g-d);b.max=u(a.pos+a.len,e+d)}});else if(d.length){if(!j)b.selectionMarker=j=r({destroy:sa},c.plotBox);b.pinchTranslate(d,f,k,j,m,h);b.hasPinched=i;b.scaleGroups(k,m);!i&&e&&g===1&&this.runPointActions(b.normalize(a))}},onContainerTouchStart:function(a){var b=this.chart;pa=b.index;a.touches.length===1?(a=this.normalize(a),b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)?(this.runPointActions(a),this.pinch(a)):this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchMove:function(a){(a.touches.length===
+1||a.touches.length===2)&&this.pinch(a)},onDocumentTouchEnd:function(a){W[pa]&&W[pa].pointer.drop(a)}});if(H.PointerEvent||H.MSPointerEvent){var ua={},yb=!!H.PointerEvent,Wb=function(){var a,b=[];b.item=function(a){return this[a]};for(a in ua)ua.hasOwnProperty(a)&&b.push({pageX:ua[a].pageX,pageY:ua[a].pageY,target:ua[a].target});return b},zb=function(a,b,c,d){a=a.originalEvent||a;if((a.pointerType==="touch"||a.pointerType===a.MSPOINTER_TYPE_TOUCH)&&W[pa])d(a),d=W[pa].pointer,d[b]({type:c,target:a.currentTarget,
+preventDefault:sa,touches:Wb()})};r(Va.prototype,{onContainerPointerDown:function(a){zb(a,"onContainerTouchStart","touchstart",function(a){ua[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){zb(a,"onContainerTouchMove","touchmove",function(a){ua[a.pointerId]={pageX:a.pageX,pageY:a.pageY};if(!ua[a.pointerId].target)ua[a.pointerId].target=a.currentTarget})},onDocumentPointerUp:function(a){zb(a,"onContainerTouchEnd","touchend",function(a){delete ua[a.pointerId]})},
+batchMSEvents:function(a){a(this.chart.container,yb?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,yb?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(x,yb?"pointerup":"MSPointerUp",this.onDocumentPointerUp)}});Ma(Va.prototype,"init",function(a,b,c){a.call(this,b,c);(this.hasZoom||this.followTouchMove)&&A(b.container,{"-ms-touch-action":P,"touch-action":P})});Ma(Va.prototype,"setDOMEvents",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&
+this.batchMSEvents(N)});Ma(Va.prototype,"destroy",function(a){this.batchMSEvents(X);a.call(this)})}var kb=S.Legend=function(a,b){this.init(a,b)};kb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=p(b.padding,8),f=b.itemMarginTop||0;this.options=b;if(b.enabled)c.itemStyle=d,c.itemHiddenStyle=w(d,b.itemHiddenStyle),c.itemMarginTop=f,c.padding=e,c.initialItemX=e,c.initialItemY=e-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.lastLineHeight=0,c.symbolWidth=p(b.symbolWidth,16),c.pages=[],c.render(),
+N(c.chart,"endResize",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options,d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.legendColor||a.color||"#CCC":g,g=a.options&&a.options.marker,i={fill:h},j;d&&d.css({fill:c,color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(j in i.stroke=h,g=a.convertAttribs(g),g)d=g[j],d!==t&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,
+d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;a.legendGroup&&a.legendGroup.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=e,f.y=d},destroyItem:function(a){var b=a.checkbox;q(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Pa(a.checkbox)},destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight;if(b)c=
+b.translateY,q(this.allItems,function(e){var f=e.checkbox,g;f&&(g=c+f.y+(a||0)+3,A(f,{left:b.translateX+e.checkboxOffset+f.x-20+"px",top:g+"px",display:g>c-6&&g<c+d-6?"":P}))})},renderTitle:function(){var a=this.padding,b=this.options.title,c=0;if(b.text){if(!this.title)this.title=this.chart.renderer.label(b.text,a-3,a-4,null,null,null,null,null,"legend-title").attr({zIndex:1}).css(b.style).add(this.group);a=this.title.getBBox();c=a.height;this.offsetWidth=a.width;this.contentGroup.attr({translateY:c})}this.titleHeight=
+c},renderItem:function(a){var b=this.chart,c=b.renderer,d=this.options,e=d.layout==="horizontal",f=this.symbolWidth,g=d.symbolPadding,h=this.itemStyle,i=this.itemHiddenStyle,j=this.padding,k=e?p(d.itemDistance,20):0,l=!d.rtl,m=d.width,n=d.itemMarginBottom||0,o=this.itemMarginTop,q=this.initialItemX,r=a.legendItem,s=a.series&&a.series.drawLegendSymbol?a.series:a,D=s.options,D=this.createCheckboxForItem&&D&&D.showCheckbox,t=d.useHTML;if(!r){a.legendGroup=c.g("legend-item").attr({zIndex:1}).add(this.scrollGroup);
+a.legendItem=r=c.text(d.labelFormat?Ia(d.labelFormat,a):d.labelFormatter.call(a),l?f+g:-g,this.baseline||0,t).css(w(a.visible?h:i)).attr({align:l?"left":"right",zIndex:2}).add(a.legendGroup);if(!this.baseline)this.baseline=c.fontMetrics(h.fontSize,r).f+3+o,r.attr("y",this.baseline);s.drawLegendSymbol(this,a);this.setItemEvents&&this.setItemEvents(a,r,t,h,i);this.colorizeItem(a,a.visible);D&&this.createCheckboxForItem(a)}c=r.getBBox();f=a.checkboxOffset=d.itemWidth||a.legendItemWidth||f+g+c.width+
+k+(D?20:0);this.itemHeight=g=v(a.legendItemHeight||c.height);if(e&&this.itemX-q+f>(m||b.chartWidth-2*j-q-d.x))this.itemX=q,this.itemY+=o+this.lastLineHeight+n,this.lastLineHeight=0;this.maxItemWidth=u(this.maxItemWidth,f);this.lastItemY=o+this.itemY+n;this.lastLineHeight=u(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];e?this.itemX+=f:(this.itemY+=o+g+n,this.lastLineHeight=g);this.offsetWidth=m||u((e?this.itemX-q-k:f)+j,this.offsetWidth)},getAllItems:function(){var a=[];q(this.chart.series,
+function(b){var c=b.options;if(p(c.showInLegend,!s(c.linkedTo)?t:!1,!0))a=a.concat(b.legendItems||(c.legendType==="point"?b.data:b))});return a},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();
+e=a.getAllItems();nb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;q(e,function(b){a.renderItem(b)});g=j.width||a.offsetWidth;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h);if(l||m){g+=k;h+=k;if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp({width:g,height:h})),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor,"stroke-width":l||
+0,fill:m||P}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;q(e,function(b){a.positionItem(b)});f&&d.align(r({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h,i=this.clipRect,j=e.navigation,k=p(j.animation,!0),l=j.arrowSize||12,m=this.nav,n=this.pages,o,r=this.allItems;
+e.layout==="horizontal"&&(f/=2);g&&(f=C(f,g));n.length=0;if(a>f&&!e.useHTML){this.clipHeight=h=u(f-20-this.titleHeight-this.padding,0);this.currentPage=p(this.currentPage,1);this.fullHeight=a;q(r,function(a,b){var c=a._legendItemPos[1],d=v(a.legendItem.getBBox().height),e=n.length;if(!e||c-n[e-1]>h&&(o||c)!==n[e-1])n.push(o||c),e++;b===r.length-1&&c+d-n[e-1]>h&&n.push(c);c!==o&&(o=c)});if(!i)i=b.clipRect=d.clipRect(0,this.padding,9999,0),b.contentGroup.clip(i);i.attr({height:h});if(!m)this.nav=m=
+d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,l,l).on("click",function(){b.scroll(-1,k)}).add(m),this.pager=d.text("",15,10).css(j.style).add(m),this.down=d.symbol("triangle-down",0,0,l,l).on("click",function(){b.scroll(1,k)}).add(m);b.scroll(0);a=f}else if(m)i.attr({height:c.chartHeight}),m.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pages,d=c.length,e=this.currentPage+a,f=this.clipHeight,g=this.options.navigation,
+h=g.activeColor,g=g.inactiveColor,i=this.pager,j=this.padding;e>d&&(e=d);if(e>0)b!==t&&Qa(b,this.chart),this.nav.attr({translateX:j,translateY:f+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:e===1?g:h}).css({cursor:e===1?"default":"pointer"}),i.attr({text:e+"/"+d}),this.down.attr({x:18+this.pager.getBBox().width,fill:e===d?g:h}).css({cursor:e===d?"default":"pointer"}),c=-c[e-1]+this.initialItemY,this.scrollGroup.animate({translateY:c}),this.currentPage=e,this.positionCheckboxes(c)}};
+M=S.LegendSymbolMixin={drawRectangle:function(a,b){var c=a.options.symbolHeight||12;b.legendSymbol=this.chart.renderer.rect(0,a.baseline-5-c/2,a.symbolWidth,c,a.options.symbolRadius||0).attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,c=b.marker,d;d=a.symbolWidth;var e=this.chart.renderer,f=this.legendGroup,a=a.baseline-v(e.fontMetrics(a.options.itemStyle.fontSize,this.legendItem).b*0.3),g;if(b.lineWidth){g={"stroke-width":b.lineWidth};if(b.dashStyle)g.dashstyle=
+b.dashStyle;this.legendLine=e.path(["M",0,a,"L",d,a]).attr(g).add(f)}if(c&&c.enabled!==!1)b=c.radius,this.legendSymbol=d=e.symbol(this.symbol,d/2-b,a-b,2*b,2*b).add(f),d.isMarker=!0}};(/Trident\/7\.0/.test(wa)||Ta)&&Ma(kb.prototype,"positionItem",function(a,b){var c=this,d=function(){b._legendItemPos&&a.call(c,b)};d();setTimeout(d)});Xa.prototype={init:function(a,b){var c,d=a.series;a.series=null;c=w(L,a);c.series=a.series=d;this.userOptions=a;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=
+this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=W.length;W.push(f);$a++;d.reflow!==!1&&N(f,"load",function(){f.initReflow()});if(e)for(g in e)N(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=ga?!1:p(d.animation,!0);f.pointCount=f.colorCounter=f.symbolCounter=0;f.firstRender()},initSeries:function(a){var b=this.options.chart;(b=J[a.type||b.type||b.defaultSeriesType])||
+oa(17,!0);b=new b;b.init(this,a);return b},isInsidePlot:function(a,b,c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&q(this.axes,function(a){a.adjustTickAmount()});this.maxTicks=null},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.hasCartesianSeries,j=this.isDirtyBox,k=c.length,l=k,m=this.renderer,n=m.isHidden(),o=[];Qa(a,this);n&&this.cloneRenderTo();
+for(this.layOutTitles();l--;)if(a=c[l],a.options.stacking&&(g=!0,a.isDirty)){h=!0;break}if(h)for(l=k;l--;)if(a=c[l],a.options.stacking)a.isDirty=!0;q(c,function(a){a.isDirty&&a.options.legendType==="point"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(i){if(!this.isResizing)this.maxTicks=null,q(b,function(a){a.setScale()});this.adjustTickAmounts()}this.getMargins();i&&(q(b,function(a){a.isDirty&&(j=!0)}),q(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=
+!1,o.push(function(){K(a,"afterSetExtremes",r(a.eventArgs,a.getExtremes()));delete a.eventArgs});(j||g)&&a.redraw()}));j&&this.drawChartBox();q(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset(!0);m.draw();K(this,"redraw");n&&this.cloneRenderTo(!0);q(o,function(a){a.call()})},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id===a)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=
+c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis=ra(b.xAxis||{}),b=b.yAxis=ra(b.yAxis||{});q(c,function(a,b){a.index=b;a.isX=!0});q(b,function(a,b){a.index=b});c=c.concat(b);q(c,function(b){new ma(a,b)});a.adjustTickAmounts()},getSelectedPoints:function(){var a=[];q(this.series,function(b){a=a.concat(vb(b.points||[],function(a){return a.selected}))});return a},getSelectedSeries:function(){return vb(this.series,function(a){return a.selected})},
+getStacks:function(){var a=this;q(a.yAxis,function(a){if(a.stacks&&a.hasVisibleSeries)a.oldStacks=a.stacks});q(a.series,function(b){if(b.options.stacking&&(b.visible===!0||a.options.chart.ignoreHiddenSeries===!1))b.stackKey=b.type+p(b.options.stack,"")})},setTitle:function(a,b,c){var g;var d=this,e=d.options,f;f=e.title=w(e.title,a);g=e.subtitle=w(e.subtitle,b),e=g;q([["title",a,f],["subtitle",b,e]],function(a){var b=a[0],c=d[b],e=a[1],a=a[2];c&&e&&(d[b]=c=c.destroy());a&&a.text&&!c&&(d[b]=d.renderer.text(a.text,
+0,0,a.useHTML).attr({align:a.align,"class":"highcharts-"+b,zIndex:a.zIndex||4}).css(a.style).add())});d.layOutTitles(c)},layOutTitles:function(a){var b=0,c=this.title,d=this.subtitle,e=this.options,f=e.title,e=e.subtitle,g=this.renderer,h=this.spacingBox.width-44;if(c&&(c.css({width:(f.width||h)+"px"}).align(r({y:g.fontMetrics(f.style.fontSize,c).b-3},f),!1,"spacingBox"),!f.floating&&!f.verticalAlign))b=c.getBBox().height;d&&(d.css({width:(e.width||h)+"px"}).align(r({y:b+(f.margin-13)+g.fontMetrics(f.style.fontSize,
+d).b},e),!1,"spacingBox"),!e.floating&&!e.verticalAlign&&(b=Ka(b+d.getBBox().height)));c=this.titleOffset!==b;this.titleOffset=b;if(!this.isDirtyBox&&c)this.isDirtyBox=c,this.hasRendered&&p(a,!0)&&this.isDirtyBox&&this.redraw()},getChartSize:function(){var a=this.options.chart,b=a.width,a=a.height,c=this.renderToClone||this.renderTo;if(!s(b))this.containerWidth=hb(c,"width");if(!s(a))this.containerHeight=hb(c,"height");this.chartWidth=u(0,b||this.containerWidth||600);this.chartHeight=u(0,p(a,this.containerHeight>
+19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Pa(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),A(b,{position:"absolute",top:"-9999px",display:"block"}),b.style.setProperty&&b.style.setProperty("display","block","important"),x.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,
+c,d,e;this.renderTo=a=b.renderTo;e="highcharts-"+tb++;if(Fa(a))this.renderTo=a=x.getElementById(a);a||oa(13,!0);c=z(F(a,"data-highcharts-chart"));!isNaN(c)&&W[c]&&W[c].hasRendered&&W[c].destroy();F(a,"data-highcharts-chart",this.index);a.innerHTML="";!b.skipClone&&!a.offsetWidth&&this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight;this.container=a=$(Ja,{className:"highcharts-container"+(b.className?" "+b.className:""),id:e},r({position:"relative",overflow:"hidden",width:c+
+"px",height:d+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},b.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=b.forExport?new ta(a,c,d,b.style,!0):new Ya(a,c,d,b.style);ga&&this.renderer.create(this,a,c,d)},getMargins:function(){var a=this.spacing,b,c=this.legend,d=this.margin,e=this.options.legend,f=p(e.margin,20),g=e.x,h=e.y,i=e.align,j=e.verticalAlign,k=this.titleOffset;this.resetMargins();b=this.axisOffset;if(k&&!s(d[0]))this.plotTop=
+u(this.plotTop,k+this.options.title.margin+a[0]);if(c.display&&!e.floating)if(i==="right"){if(!s(d[1]))this.marginRight=u(this.marginRight,c.legendWidth-g+f+a[1])}else if(i==="left"){if(!s(d[3]))this.plotLeft=u(this.plotLeft,c.legendWidth+g+f+a[3])}else if(j==="top"){if(!s(d[0]))this.plotTop=u(this.plotTop,c.legendHeight+h+f+a[0])}else if(j==="bottom"&&!s(d[2]))this.marginBottom=u(this.marginBottom,c.legendHeight-h+f+a[2]);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&
+(this.plotTop+=this.extraTopMargin);this.hasCartesianSeries&&q(this.axes,function(a){a.getOffset()});s(d[3])||(this.plotLeft+=b[3]);s(d[0])||(this.plotTop+=b[0]);s(d[2])||(this.marginBottom+=b[2]);s(d[1])||(this.marginRight+=b[1]);this.setChartSize()},reflow:function(a){var b=this,c=b.options.chart,d=b.renderTo,e=c.width||hb(d,"width"),f=c.height||hb(d,"height"),c=a?a.target:H,d=function(){if(b.container)b.setSize(e,f,!1),b.hasUserSize=null};if(!b.hasUserSize&&e&&f&&(c===H||c===x)){if(e!==b.containerWidth||
+f!==b.containerHeight)clearTimeout(b.reflowTimeout),a?b.reflowTimeout=setTimeout(d,100):d();b.containerWidth=e;b.containerHeight=f}},initReflow:function(){var a=this,b=function(b){a.reflow(b)};N(H,"resize",b);N(a,"destroy",function(){X(H,"resize",b)})},setSize:function(a,b,c){var d=this,e,f,g;d.isResizing+=1;g=function(){d&&K(d,"endResize",null,function(){d.isResizing-=1})};Qa(c,d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;if(s(a))d.chartWidth=e=u(0,v(a)),d.hasUserSize=!!e;if(s(b))d.chartHeight=
+f=u(0,v(b));(va?ib:A)(d.container,{width:e+"px",height:f+"px"},va);d.setChartSize(!0);d.renderer.setSize(e,f,c);d.maxTicks=null;q(d.axes,function(a){a.isDirty=!0;a.setScale()});q(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.layOutTitles();d.getMargins();d.redraw(c);d.oldChartHeight=null;K(d,"resize");va===!1?g():setTimeout(g,va&&va.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,
+h=this.clipOffset,i,j,k,l;this.plotLeft=i=v(this.plotLeft);this.plotTop=j=v(this.plotTop);this.plotWidth=k=u(0,v(d-i-this.marginRight));this.plotHeight=l=u(0,v(e-j-this.marginBottom));this.plotSizeX=b?l:k;this.plotSizeY=b?k:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:l};d=2*U(this.plotBorderWidth/2);b=Ka(u(d,h[3])/2);c=Ka(u(d,h[0])/2);this.clipBox={x:b,y:c,width:U(this.plotSizeX-
+u(d,h[1])/2-b),height:u(0,U(this.plotSizeY-u(d,h[2])/2-c))};a||q(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this.spacing,b=this.margin;this.plotTop=p(b[0],a[0]);this.marginRight=p(b[1],a[1]);this.marginBottom=p(b[2],a[2]);this.plotLeft=p(b[3],a[3]);this.axisOffset=[0,0,0,0];this.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=
+this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,n,o=this.plotLeft,p=this.plotTop,q=this.plotWidth,r=this.plotHeight,u=this.plotBox,s=this.clipRect,v=this.clipBox;n=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp({width:c-n,height:d-n}));else{e={fill:j||P};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=b.rect(n/2,n/2,c-n,d-n,a.borderRadius,i).attr(e).addClass("highcharts-background").add().shadow(a.shadow)}if(k)f?
+f.animate(u):this.plotBackground=b.rect(o,p,q,r,0).attr({fill:k}).add().shadow(a.plotShadow);if(l)h?h.animate(u):this.plotBGImage=b.image(l,o,p,q,r).add();s?s.animate({width:v.width,height:v.height}):this.clipRect=b.clipRect(v);if(m)g?g.animate(g.crisp({x:o,y:p,width:q,height:r})):this.plotBorder=b.rect(o,p,q,r,0,-m).attr({stroke:a.plotBorderColor,"stroke-width":m,fill:P,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,e,f;q(["inverted",
+"angular","polar"],function(g){c=J[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=J[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;q(b,function(a){a.linkedSeries.length=0});q(b,function(b){var d=b.options.linkedTo;if(Fa(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d})},renderSeries:function(){q(this.series,function(a){a.translate();a.setTooltipPoints&&a.setTooltipPoints();
+a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&q(b.items,function(c){var d=r(b.style,c.style),e=z(d.left)+a.plotLeft,f=z(d.top)+a.plotTop+12;delete d.left;delete d.top;a.renderer.text(c.html,e,f).attr({zIndex:2}).css(d).add()})},render:function(){var a=this.axes,b=this.renderer,c=this.options;this.setTitle();this.legend=new kb(this,c.legend);this.getStacks();q(a,function(a){a.setScale()});this.getMargins();this.maxTicks=null;q(a,function(a){a.setTickPositions(!0);a.setMaxTicks()});
+this.adjustTickAmounts();this.getMargins();this.drawChartBox();this.hasCartesianSeries&&q(a,function(a){a.render()});if(!this.seriesGroup)this.seriesGroup=b.g("series-group").attr({zIndex:3}).add();this.renderSeries();this.renderLabels();this.showCredits(c.credits);this.hasRendered=!0},showCredits:function(a){if(a.enabled&&!this.credits)this.credits=this.renderer.text(a.text,0,0).on("click",function(){if(a.href)location.href=a.href}).attr({align:a.position.align,zIndex:8}).css(a.style).add().align(a.position)},
+destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;K(a,"destroy");W[a.index]=t;$a--;a.renderTo.removeAttribute("data-highcharts-chart");X(a);for(e=b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();q("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML=
+"",X(d),f&&Pa(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!ba&&H==H.top&&x.readyState!=="complete"||ga&&!H.canvg?(ga?Lb.push(function(){a.firstRender()},a.options.global.canvasToolsURL):x.attachEvent("onreadystatechange",function(){x.detachEvent("onreadystatechange",a.firstRender);x.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender()){a.getContainer();K(a,"init");a.resetMargins();a.setChartSize();
+a.propFromSeries();a.getAxes();q(b.series||[],function(b){a.initSeries(b)});a.linkSeries();K(a,"beforeRender");if(S.Pointer)a.pointer=new Va(a,b);a.render();a.renderer.draw();c&&c.apply(a,[a]);q(a.callbacks,function(b){b.apply(a,[a])});a.cloneRenderTo(!0);K(a,"load")}},splashArray:function(a,b){var c=b[a],c=da(c)?c:[c,c,c,c];return[p(b[a+"Top"],c[0]),p(b[a+"Right"],c[1]),p(b[a+"Bottom"],c[2]),p(b[a+"Left"],c[3])]}};Xa.prototype.callbacks=[];Z=S.CenteredSeriesMixin={getCenter:function(){var a=this.options,
+b=this.chart,c=2*(a.slicedOffset||0),d,e=b.plotWidth-2*c,f=b.plotHeight-2*c,b=a.center,a=[p(b[0],"50%"),p(b[1],"50%"),a.size||"100%",a.innerSize||0],g=C(e,f),h;return Ua(a,function(a,b){h=/%$/.test(a);d=b<2||b===2&&h;return(h?[e,f,g,g][b]*z(a)/100:a)+(d?c:0)})}};var Ea=function(){};Ea.prototype={init:function(a,b,c){this.series=a;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===
+b.length))a.colorCounter=0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.options.pointValKey||c.pointValKey,a=Ea.prototype.optionsToObject.call(this,a);r(this,a);this.options=this.options?r(this.options,a):a;if(d)this.y=this[d];if(this.x===t&&c)this.x=b===t?c.autoIncrement():b;return this},optionsToObject:function(a){var b={},c=this.series,d=c.pointArrayMap||["y"],e=d.length,f=0,g=0;if(typeof a==="number"||a===null)b[d[0]]=a;else if(La(a)){if(a.length>e){c=typeof a[0];
+if(c==="string")b.name=a[0];else if(c==="number")b.x=a[0];f++}for(;g<e;)b[d[g++]]=a[f++]}else if(typeof a==="object"){b=a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}return b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),ka(b,this),!b.length))a.hoverPoints=null;if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)X(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=
+null},destroyElements:function(){for(var a="graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup".split(","),b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var b=this.series,c=b.tooltipOptions,d=p(c.valueDecimals,""),e=c.valuePrefix||"",f=c.valueSuffix||"";q(b.pointArrayMap||
+["y"],function(b){b="{point."+b;if(e||f)a=a.replace(b+"}",e+b+"}"+f);a=a.replace(b+"}",b+":,."+d+"f}")});return Ia(a,{point:this,series:this.series})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a==="click"&&e.allowPointSelect&&(c=function(a){d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});K(this,a,b,c)}};var O=function(){};O.prototype={isCartesian:!0,type:"line",pointClass:Ea,sorted:!0,
+requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor",r:"radius"},axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],init:function(a,b){var c=this,d,e,f=a.series,g=function(a,b){return p(a.options.index,a._i)-p(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();r(c,{name:b.name,state:"",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if(ga)b.animation=!1;e=b.events;for(d in e)N(c,
+d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();q(c.parallelArrays,function(a){c[a+"Data"]=[]});c.setData(b.data,!1);if(c.isCartesian)a.hasCartesianSeries=!0;f.push(c);c._i=f.length-1;nb(f,g);this.yAxis&&nb(this.yAxis.series,g);q(f,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;q(a.axisTypes||[],function(e){q(c[e],function(c){d=c.options;if(b[e]===
+d.index||b[e]!==t&&b[e]===d.id||b[e]===t&&d.index===0)c.series.push(a),a[e]=c,c.isDirty=!0});!a[e]&&a.optionalAxis!==e&&oa(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,d=arguments;q(c.parallelArrays,typeof b==="number"?function(d){var f=d==="y"&&c.toYData?c.toYData(a):a[d];c[d+"Data"][b]=f}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(d,2))})},autoIncrement:function(){var a=this.options,b=this.xIncrement,b=p(b,a.pointStart,0);this.pointInterval=p(this.pointInterval,
+a.pointInterval,1);this.xIncrement=b+this.pointInterval;return b},getSegments:function(){var a=-1,b=[],c,d=this.points,e=d.length;if(e)if(this.options.connectNulls){for(c=e;c--;)d[c].y===null&&d.splice(c,1);d.length&&(b=[d])}else q(d,function(c,g){c.y===null?(g>a+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions=a;c=w(e,c.series,
+a);this.tooltipOptions=w(L.tooltip,L.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);e.marker===null&&delete c.marker;return c},getCyclic:function(a,b,c){var d=this.userOptions,e="_"+a+"Index",f=a+"Counter";b||(s(d[e])?b=d[e]:(d[e]=b=this.chart[f]%c.length,this.chart[f]+=1),b=c[b]);this[a]=b},getColor:function(){this.options.colorByPoint||this.getCyclic("color",this.options.color||ca[this.type].color,this.chart.options.colors)},getSymbol:function(){var a=
+this.options.marker;this.getCyclic("symbol",a.symbol,this.chart.options.symbols);if(/^url/.test(this.symbol))a.radius=0},drawLegendSymbol:M.drawLineMarker,setData:function(a,b,c,d){var e=this,f=e.points,g=f&&f.length||0,h,i=e.options,j=e.chart,k=null,l=e.xAxis,m=l&&!!l.categories,n=e.tooltipPoints,o=i.turboThreshold,r=this.xData,u=this.yData,s=(h=e.pointArrayMap)&&h.length,a=a||[];h=a.length;b=p(b,!0);if(d!==!1&&h&&g===h&&!e.cropped&&!e.hasGroupedData)q(a,function(a,b){f[b].update(a,!1)});else{e.xIncrement=
+null;e.pointRange=m?1:i.pointRange;e.colorCounter=0;q(this.parallelArrays,function(a){e[a+"Data"].length=0});if(o&&h>o){for(c=0;k===null&&c<h;)k=a[c],c++;if(ia(k)){m=p(i.pointStart,0);i=p(i.pointInterval,1);for(c=0;c<h;c++)r[c]=m,u[c]=a[c],m+=i;e.xIncrement=m}else if(La(k))if(s)for(c=0;c<h;c++)i=a[c],r[c]=i[0],u[c]=i.slice(1,s+1);else for(c=0;c<h;c++)i=a[c],r[c]=i[0],u[c]=i[1];else oa(12)}else for(c=0;c<h;c++)if(a[c]!==t&&(i={series:e},e.pointClass.prototype.applyOptions.apply(i,[a[c]]),e.updateParallelArrays(i,
+c),m&&i.name))l.names[i.x]=i.name;Fa(u[0])&&oa(14,!0);e.data=[];e.options.data=a;for(c=g;c--;)f[c]&&f[c].destroy&&f[c].destroy();if(n)n.length=0;if(l)l.minRange=l.userMinRange;e.isDirty=e.isDirtyData=j.isDirtyBox=!0;c=!1}b&&j.redraw(c)},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e;e=0;var f,g,h=this.xAxis,i=this.options,j=i.cropThreshold,k=0,l=this.isCartesian,m,n;if(l&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!a)return!1;if(l&&this.sorted&&(!j||d>j||this.forceCrop))if(m=
+h.getExtremes(),n=m.min,m=m.max,b[d-1]<n||b[0]>m)b=[],c=[];else if(b[0]<n||b[d-1]>m)e=this.cropData(this.xData,this.yData,n,m),b=e.xData,c=e.yData,e=e.start,f=!0,k=b.length;for(a=b.length-1;a>=0;a--)d=b[a]-b[a-1],!f&&b[a]>n&&b[a]<m&&k++,d>0&&(g===t||d<g)?g=d:d<0&&this.requireSorting&&oa(15);this.cropped=f;this.cropStart=e;this.processedXData=b;this.processedYData=c;this.activePointCount=k;if(i.pointRange===null)this.pointRange=g||1;this.closestPointRange=g},cropData:function(a,b,c,d){var e=a.length,
+f=0,g=e,h=p(this.cropShoulder,1),i;for(i=0;i<e;i++)if(a[i]>=c){f=u(0,i-h);break}for(;i<e;i++)if(a[i]>d){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(m=0;m<g;m++)i=h+m,j?l[m]=(new f).init(this,[d[m]].concat(ra(e[m]))):(b[i]?k=b[i]:a[i]!==
+t&&(b[i]=k=(new f).init(this,a[i],d[m])),l[m]=k);if(b&&(g!==(c=b.length)||j))for(m=0;m<c;m++)if(m===h&&!j&&(m+=g),b[m])b[m].destroyElements(),b[m].plotX=t;this.data=b;this.points=l},getExtremes:function(a){var b=this.yAxis,c=this.processedXData,d,e=[],f=0;d=this.xAxis.getExtremes();var g=d.min,h=d.max,i,j,k,l,a=a||this.stackedYData||this.processedYData;d=a.length;for(l=0;l<d;l++)if(j=c[l],k=a[l],i=k!==null&&k!==t&&(!b.isLog||k.length||k>0),j=this.getExtremesFromAll||this.cropped||(c[l+1]||j)>=g&&
+(c[l-1]||j)<=h,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=p(void 0,Na(e));this.dataMax=p(void 0,Ba(e))},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i==="between"||ia(i),k=a.threshold,a=0;a<g;a++){var l=f[a],m=l.x,n=l.y,o=l.low,q=b&&e.stacks[(this.negStacks&&n<k?"-":"")+this.stackKey];
+if(e.isLog&&n<=0)l.y=n=null;l.plotX=c.translate(m,0,0,0,1,i,this.type==="flags");if(b&&this.visible&&q&&q[m])q=q[m],n=q.points[this.index+","+a],o=n[0],n=n[1],o===0&&(o=p(k,e.min)),e.isLog&&o<=0&&(o=null),l.total=l.stackTotal=q.total,l.percentage=q.total&&l.y/q.total*100,l.stackY=n,q.setOffset(this.pointXOffset||0,this.barW||0);l.yBottom=s(o)?e.translate(o,0,1,0,1):null;h&&(n=this.modifyValue(n,l));l.plotY=typeof n==="number"&&n!==Infinity?e.translate(n,0,1,0,1):t;l.clientX=j?c.translate(m,0,0,0,
+1):l.plotX;l.negative=l.y<(k||0);l.category=d&&d[l.x]!==t?d[l.x]:l.x}this.getSegments()},animate:function(a){var b=this.chart,c=b.renderer,d;d=this.options.animation;var e=this.clipBox||b.clipBox,f=b.inverted,g;if(d&&!da(d))d=ca[this.type].animation;g=["_sharedClip",d.duration,d.easing,e.height].join(",");a?(a=b[g],d=b[g+"m"],a||(b[g]=a=c.clipRect(r(e,{width:0})),b[g+"m"]=d=c.clipRect(-99,f?-b.plotLeft:-b.plotTop,99,f?b.chartWidth:b.chartHeight)),this.group.clip(a),this.markerGroup.clip(d),this.sharedClipKey=
+g):((a=b[g])&&a.animate({width:b.plotSizeX},d),b[g+"m"]&&b[g+"m"].animate({width:b.plotSizeX+99},d),this.animate=null)},afterAnimate:function(){var a=this.chart,b=this.sharedClipKey,c=this.group,d=this.clipBox;if(c&&this.options.clip!==!1){if(!b||!d)c.clip(d?a.renderer.clipRect(d):a.clipRect);this.markerGroup.clip()}K(this,"afterAnimate");setTimeout(function(){b&&a[b]&&(d||(a[b]=a[b].destroy()),a[b+"m"]&&(a[b+"m"]=a[b+"m"].destroy()))},100)},drawPoints:function(){var a,b=this.points,c=this.chart,
+d,e,f,g,h,i,j,k;d=this.options.marker;var l=this.pointAttr[""],m,n=this.markerGroup,o=p(d.enabled,this.activePointCount<0.5*this.xAxis.len/d.radius);if(d.enabled!==!1||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=U(g.plotX),e=g.plotY,k=g.graphic,i=g.marker||{},a=o&&i.enabled===t||i.enabled,m=c.isInsidePlot(v(d),e,c.inverted),a&&e!==t&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""]||l,h=a.r,i=p(i.symbol,this.symbol),j=i.indexOf("url")===0,k)k[m?"show":"hide"](!0).animate(r({x:d-
+h,y:e-h},k.symbolName?{width:2*h,height:2*h}:{}));else{if(m&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(n)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=p(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=ca[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color;f={stroke:g,fill:g};var h=a.points||[],i,j=[],k,l=a.pointAttrToOptions;
+k=a.hasPointSpecificOptions;var m=b.negativeColor,n=c.lineColor,o=c.fillColor;i=b.turboThreshold;var p;b.marker?(e.radius=e.radius||c.radius+e.radiusPlus,e.lineWidth=e.lineWidth||c.lineWidth+e.lineWidthPlus):e.color=e.color||ya(e.color||g).brighten(e.brightness).get();j[""]=a.convertAttribs(c,f);q(["hover","select"],function(b){j[b]=a.convertAttribs(d[b],j[""])});a.pointAttr=j;g=h.length;if(!i||g<i||k)for(;g--;){i=h[g];if((c=i.options&&i.options.marker||i.options)&&c.enabled===!1)c.radius=0;if(i.negative&&
+m)i.color=i.fillColor=m;k=b.colorByPoint||i.color;if(i.options)for(p in l)s(c[l[p]])&&(k=!0);if(k){c=c||{};k=[];d=c.states||{};f=d.hover=d.hover||{};if(!b.marker)f.color=f.color||!i.options.color&&e.color||ya(i.color).brighten(f.brightness||e.brightness).get();f={color:i.color};if(!o)f.fillColor=i.color;if(!n)f.lineColor=i.color;k[""]=a.convertAttribs(r(f,c),j[""]);k.hover=a.convertAttribs(d.hover,j.hover,k[""]);k.select=a.convertAttribs(d.select,j.select,k[""])}else k=j;i.pointAttr=k}},destroy:function(){var a=
+this,b=a.chart,c=/AppleWebKit\/533/.test(wa),d,e,f=a.data||[],g,h,i;K(a,"destroy");X(a);q(a.axisTypes||[],function(b){if(i=a[b])ka(i.series,a),i.isDirty=i.forceRedraw=!0});a.legendItem&&a.chart.legend.destroyItem(a);for(e=f.length;e--;)(g=f[e])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);q("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","),function(b){a[b]&&(d=c&&b==="group"?"hide":"destroy",a[b][d]())});if(b.hoverSeries===
+a)b.hoverSeries=null;ka(b.series,a);for(h in a)delete a[h]},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;q(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?"L":"M"),d&&f&&(i=a[f-1],d==="right"?c.push(i.plotX,h):d==="center"?c.push((i.plotX+g)/2,i.plotY,(i.plotX+g)/2,h):c.push(g,i.plotY)),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];q(a.segments,function(e){c=a.getSegmentPath(e);e.length>
+1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color]],d=b.lineWidth,e=b.dashStyle,f=b.linecap!=="square",g=this.getGraphPath(),h=b.negativeColor;h&&c.push(["graphNeg",h]);q(c,function(c,h){var k=c[0],l=a[k];if(l)ab(l),l.animate({d:g});else if(d&&g.length)l={stroke:c[1],"stroke-width":d,fill:P,zIndex:1},e?l.dashstyle=e:f&&(l["stroke-linecap"]=l["stroke-linejoin"]="round"),a[k]=a.chart.renderer.path(g).attr(l).add(a.group).shadow(!h&&
+b.shadow)})},clipNeg:function(){var a=this.options,b=this.chart,c=b.renderer,d=a.negativeColor||a.negativeFillColor,e,f=this.graph,g=this.area,h=this.posClip,i=this.negClip;e=b.chartWidth;var j=b.chartHeight,k=u(e,j),l=this.yAxis;if(d&&(f||g)){d=v(l.toPixels(a.threshold||0,!0));d<0&&(k-=d);a={x:0,y:0,width:k,height:d};k={x:0,y:d,width:k,height:k};if(b.inverted)a.height=k.y=b.plotWidth-d,c.isVML&&(a={x:b.plotWidth-d-b.plotLeft,y:0,width:e,height:j},k={x:d+b.plotLeft-e,y:0,width:b.plotLeft+d,height:e});
+l.reversed?(b=k,e=a):(b=a,e=k);h?(h.animate(b),i.animate(e)):(this.posClip=h=c.clipRect(b),this.negClip=i=c.clipRect(e),f&&this.graphNeg&&(f.clip(h),this.graphNeg.clip(i)),g&&(g.clip(h),this.areaNeg.clip(i)))}},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};q(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)N(c,"resize",a),N(b,"destroy",function(){X(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,
+e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e));f[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;if(a.inverted)b=c,c=this.xAxis;return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=(c=d.animation)&&!!a.animate&&b.renderer.isSVG&&p(c.duration,500)||0,f=a.visible?"visible":"hidden",g=d.zIndex,
+h=a.hasRendered,i=b.seriesGroup;c=a.plotGroup("group","series",f,g,i);a.markerGroup=a.plotGroup("markerGroup","markers",f,g,i);e&&a.animate(!0);a.getAttribs();c.inverted=a.isCartesian?b.inverted:!1;a.drawGraph&&(a.drawGraph(),a.clipNeg());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&a.options.enableMouseTracking!==!1&&a.drawTracker();b.inverted&&a.invertGroups();d.clip!==!1&&!a.sharedClipKey&&!h&&c.clip(b.clipRect);e&&a.animate();if(!h)e?a.animationTimeout=setTimeout(function(){a.afterAnimate()},
+e):a.afterAnimate();a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:p(d&&d.left,a.plotLeft),translateY:p(e&&e.top,a.plotTop)}));this.translate();this.setTooltipPoints&&this.setTooltipPoints(!0);this.render();b&&K(this,"updatedData")}};Fb.prototype={destroy:function(){Oa(this,this.axis)},render:function(a){var b=this.options,
+c=b.format,c=c?Ia(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,null,null,b.useHTML).css(b.style).attr({align:this.textAlign,rotation:b.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=this.isNegative,g=c.translate(c.usePercentage?100:this.total,0,0,0,1),c=c.translate(0),c=Q(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-
+c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e[this.options.crop===!1||d.isInsidePlot(f.x,f.y)?"show":"hide"](!0)}};ma.prototype.buildStacks=function(){var a=this.series,b=p(this.options.reversedStacks,!0),c=a.length;if(!this.isXAxis){for(this.usePercentage=!1;c--;)a[b?c:a.length-c-1].setStackedPoints();if(this.usePercentage)for(c=0;c<a.length;c++)a[c].setPercentStacks()}};ma.prototype.renderStackTotals=function(){var a=this.chart,b=a.renderer,c=
+this.stacks,d,e,f=this.stackTotalGroup;if(!f)this.stackTotalGroup=f=b.g("stack-labels").attr({visibility:"visible",zIndex:6}).add();f.translate(a.plotLeft,a.plotTop);for(d in c)for(e in a=c[d],a)a[e].render(f)};O.prototype.setStackedPoints=function(){if(this.options.stacking&&!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var a=this.processedXData,b=this.processedYData,c=[],d=b.length,e=this.options,f=e.threshold,g=e.stack,e=e.stacking,h=this.stackKey,i="-"+h,j=this.negStacks,
+k=this.yAxis,l=k.stacks,m=k.oldStacks,n,o,p,q,r,s;for(q=0;q<d;q++){r=a[q];s=b[q];p=this.index+","+q;o=(n=j&&s<f)?i:h;l[o]||(l[o]={});if(!l[o][r])m[o]&&m[o][r]?(l[o][r]=m[o][r],l[o][r].total=null):l[o][r]=new Fb(k,k.options.stackLabels,n,r,g);o=l[o][r];o.points[p]=[o.cum||0];e==="percent"?(n=n?h:i,j&&l[n]&&l[n][r]?(n=l[n][r],o.total=n.total=u(n.total,o.total)+Q(s)||0):o.total=ea(o.total+(Q(s)||0))):o.total=ea(o.total+(s||0));o.cum=(o.cum||0)+(s||0);o.points[p].push(o.cum);c[q]=o.cum}if(e==="percent")k.usePercentage=
+!0;this.stackedYData=c;k.oldStacks={}}};O.prototype.setPercentStacks=function(){var a=this,b=a.stackKey,c=a.yAxis.stacks,d=a.processedXData;q([b,"-"+b],function(b){var e;for(var f=d.length,g,h;f--;)if(g=d[f],e=(h=c[b]&&c[b][g])&&h.points[a.index+","+f],g=e)h=h.total?100/h.total:0,g[0]=ea(g[0]*h),g[1]=ea(g[1]*h),a.stackedYData[f]=g[1]})};r(Xa.prototype,{addSeries:function(a,b,c){var d,e=this;a&&(b=p(b,!0),K(e,"addSeries",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&
+e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?"xAxis":"yAxis",f=this.options;new ma(this,w(a,{index:this[e].length,isX:b}));f[e]=ra(f[e]||{});f[e].push(a);p(c,!0)&&this.redraw(d)},showLoading:function(a){var b=this,c=b.options,d=b.loadingDiv,e=c.loading,f=function(){d&&A(d,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+"px",height:b.plotHeight+"px"})};if(!d)b.loadingDiv=d=$(Ja,{className:"highcharts-loading"},r(e.style,{zIndex:10,display:P}),b.container),b.loadingSpan=$("span",
+null,e.labelStyle,d),N(b,"redraw",f);b.loadingSpan.innerHTML=a||c.lang.loading;if(!b.loadingShown)A(d,{opacity:0,display:""}),ib(d,{opacity:e.style.opacity},{duration:e.showDuration||0}),b.loadingShown=!0;f()},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&ib(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){A(b,{display:P})}});this.loadingShown=!1}});r(Ea.prototype,{update:function(a,b,c){var d=this,e=d.series,f=d.graphic,g,h=e.data,i=e.chart,j=e.options,b=p(b,
+!0);d.firePointEvent("update",{options:a},function(){d.applyOptions(a);if(da(a)){e.getAttribs();if(f)a&&a.marker&&a.marker.symbol?d.graphic=f.destroy():f.attr(d.pointAttr[d.state||""]);if(a&&a.dataLabels&&d.dataLabel)d.dataLabel=d.dataLabel.destroy()}g=Da(d,h);e.updateParallelArrays(d,g);j.data[g]=d.options;e.isDirty=e.isDirtyData=!0;if(!e.fixedBox&&e.hasCartesianSeries)i.isDirtyBox=!0;j.legendType==="point"&&i.legend.destroyItem(d);b&&i.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.points,
+f=d.chart,g,h=d.data;Qa(b,f);a=p(a,!0);c.firePointEvent("remove",null,function(){g=Da(c,h);h.length===e.length&&e.splice(g,1);h.splice(g,1);d.options.data.splice(g,1);d.updateParallelArrays(c,"splice",g,1);c.destroy();d.isDirty=!0;d.isDirtyData=!0;a&&f.redraw()})}});r(O.prototype,{addPoint:function(a,b,c,d){var e=this.options,f=this.data,g=this.graph,h=this.area,i=this.chart,j=this.xAxis&&this.xAxis.names,k=g&&g.shift||0,l=e.data,m,n=this.xData;Qa(d,i);c&&q([g,h,this.graphNeg,this.areaNeg],function(a){if(a)a.shift=
+k+1});if(h)h.isArea=!0;b=p(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);g=d.x;h=n.length;if(this.requireSorting&&g<n[h-1])for(m=!0;h&&n[h-1]>g;)h--;this.updateParallelArrays(d,"splice",h,0,0);this.updateParallelArrays(d,h);if(j)j[g]=d.name;l.splice(h,0,a);m&&(this.data.splice(h,0,null),this.processData());e.legendType==="point"&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(d,"shift"),l.shift()));this.isDirtyData=this.isDirty=
+!0;b&&(this.getAttribs(),i.redraw())},remove:function(a,b){var c=this,d=c.chart,a=p(a,!0);if(!c.isRemoving)c.isRemoving=!0,K(c,"remove",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)});c.isRemoving=!1},update:function(a,b){var c=this,d=this.chart,e=this.userOptions,f=this.type,g=J[f].prototype,h=["group","markerGroup","dataLabelsGroup"],i;q(h,function(a){h[a]=c[a];delete c[a]});a=w(e,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},
+a);this.remove(!1);for(i in g)g.hasOwnProperty(i)&&(this[i]=t);r(this,J[a.type||f].prototype);q(h,function(a){c[a]=h[a]});this.init(d,a);d.linkSeries();p(b,!0)&&d.redraw(!1)}});r(ma.prototype,{update:function(a,b){var c=this.chart,a=c.options[this.coll][this.options.index]=w(this.userOptions,a);this.destroy(!0);this._addedPlotLB=t;this.init(c,r(a,{events:t}));c.isDirtyBox=!0;p(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);
+ka(b.axes,this);ka(b[c],this);b.options[c].splice(this.options.index,1);q(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;p(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}});ha=la(O);J.line=ha;ca.area=w(T,{threshold:0});var qa=la(O,{type:"area",getSegments:function(){var a=this,b=[],c=[],d=[],e=this.xAxis,f=this.yAxis,g=f.stacks[this.stackKey],h={},i,j,k=this.points,l=this.options.connectNulls,m,n;
+if(this.options.stacking&&!this.cropped){for(m=0;m<k.length;m++)h[k[m].x]=k[m];for(n in g)g[n].total!==null&&d.push(+n);d.sort(function(a,b){return a-b});q(d,function(b){var d=0,k;if(!l||h[b]&&h[b].y!==null)if(h[b])c.push(h[b]);else{for(m=a.index;m<=f.series.length;m++)if(k=g[b].points[m+","+b]){d=k[1];break}i=e.translate(b);j=f.toPixels(d,!0);c.push({y:null,plotX:i,clientX:i,plotY:j,yBottom:j,onMouseOver:sa})}});c.length&&b.push(c)}else O.prototype.getSegments.call(this),b=this.segments;this.segments=
+b},getSegmentPath:function(a){var b=O.prototype.getSegmentPath.call(this,a),c=[].concat(b),d,e=this.options;d=b.length;var f=this.yAxis.getThreshold(e.threshold),g;d===3&&c.push("L",b[1],b[2]);if(e.stacking&&!this.closedStacks)for(d=a.length-1;d>=0;d--)g=p(a[d].yBottom,f),d<a.length-1&&e.step&&c.push(a[d+1].plotX,g),c.push(a[d].plotX,g);else this.closeSegment(c,a,f);this.areaPath=this.areaPath.concat(c);return b},closeSegment:function(a,b,c){a.push("L",b[b.length-1].plotX,c,"L",b[0].plotX,c)},drawGraph:function(){this.areaPath=
+[];O.prototype.drawGraph.apply(this);var a=this,b=this.areaPath,c=this.options,d=c.negativeColor,e=c.negativeFillColor,f=[["area",this.color,c.fillColor]];(d||e)&&f.push(["areaNeg",d,e]);q(f,function(d){var e=d[0],f=a[e];f?f.animate({d:b}):a[e]=a.chart.renderer.path(b).attr({fill:p(d[2],ya(d[1]).setOpacity(p(c.fillOpacity,0.75)).get()),zIndex:0}).add(a.group)})},drawLegendSymbol:M.drawRectangle});J.area=qa;ca.spline=w(T);ha=la(O,{type:"spline",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,
+f=a[c-1],g=a[c+1],h,i,j,k;if(f&&g){a=f.plotY;j=g.plotX;var g=g.plotY,l;h=(1.5*d+f.plotX)/2.5;i=(1.5*e+a)/2.5;j=(1.5*d+j)/2.5;k=(1.5*e+g)/2.5;l=(k-i)*(j-d)/(j-h)+e-k;i+=l;k+=l;i>a&&i>e?(i=u(a,e),k=2*e-i):i<a&&i<e&&(i=C(a,e),k=2*e-i);k>g&&k>e?(k=u(g,e),i=2*e-k):k<g&&k<e&&(k=C(g,e),i=2*e-k);b.rightContX=j;b.rightContY=k}c?(b=["C",f.rightContX||f.plotX,f.rightContY||f.plotY,h||d,i||e,d,e],f.rightContX=f.rightContY=null):b=["M",d,e];return b}});J.spline=ha;ca.areaspline=w(ca.area);qa=qa.prototype;ha=la(ha,
+{type:"areaspline",closedStacks:!0,getSegmentPath:qa.getSegmentPath,closeSegment:qa.closeSegment,drawGraph:qa.drawGraph,drawLegendSymbol:M.drawRectangle});J.areaspline=ha;ca.column=w(T,{borderColor:"#FFFFFF",borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1,halo:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},stickyTracking:!1,tooltip:{distance:6},
+threshold:0});ha=la(O,{type:"column",pointAttrToOptions:{stroke:"borderColor",fill:"color",r:"borderRadius"},cropShoulder:0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){O.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&q(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},getColumnMetrics:function(){var a=this,b=a.options,c=a.xAxis,d=a.yAxis,e=c.reversed,f,g={},h,i=0;b.grouping===!1?i=1:q(a.chart.series,function(b){var c=b.options,e=b.yAxis;if(b.type===
+a.type&&b.visible&&d.len===e.len&&d.pos===e.pos)c.stacking?(f=b.stackKey,g[f]===t&&(g[f]=i++),h=g[f]):c.grouping!==!1&&(h=i++),b.columnIndex=h});var c=C(Q(c.transA)*(c.ordinalSlope||b.pointRange||c.closestPointRange||c.tickInterval||1),c.len),j=c*b.groupPadding,k=(c-2*j)/i,l=b.pointWidth,b=s(l)?(k-l)/2:k*b.pointPadding,l=p(l,k-2*b);return a.columnMetrics={width:l,offset:b+(j+((e?i-(a.columnIndex||0):a.columnIndex)||0)*k-c/2)*(e?-1:1)}},translate:function(){var a=this,b=a.chart,c=a.options,d=a.borderWidth=
+p(c.borderWidth,a.activePointCount>0.5*a.xAxis.len?0:1),e=a.yAxis,f=a.translatedThreshold=e.getThreshold(c.threshold),g=p(c.minPointLength,5),h=a.getColumnMetrics(),i=h.width,j=a.barW=u(i,1+2*d),k=a.pointXOffset=h.offset,l=-(d%2?0.5:0),m=d%2?0.5:1;b.renderer.isVML&&b.inverted&&(m+=1);c.pointPadding&&(j=Ka(j));O.prototype.translate.apply(a);q(a.points,function(c){var d=p(c.yBottom,f),h=C(u(-999-d,c.plotY),e.len+999+d),q=c.plotX+k,r=j,s=C(h,d),t;t=u(h,d)-s;Q(t)<g&&g&&(t=g,s=v(Q(s-f)>g?d-g:f-(e.translate(c.y,
+0,1,0,1)<=f?g:0)));c.barX=q;c.pointWidth=i;c.tooltipPos=b.inverted?[e.len-h,a.xAxis.len-q-r/2]:[q+r/2,h];r=v(q+r)+l;q=v(q)+l;r-=q;d=Q(s)<0.5;t=v(s+t)+m;s=v(s)+m;t-=s;d&&(s-=1,t+=1);c.shapeType="rect";c.shapeArgs={x:q,y:s,width:r,height:t}})},getSymbol:sa,drawLegendSymbol:M.drawRectangle,drawGraph:sa,drawPoints:function(){var a=this,b=this.chart,c=a.options,d=b.renderer,e=c.animationLimit||250,f,g;q(a.points,function(h){var i=h.plotY,j=h.graphic;if(i!==t&&!isNaN(i)&&h.y!==null)f=h.shapeArgs,i=s(a.borderWidth)?
+{"stroke-width":a.borderWidth}:{},g=h.pointAttr[h.selected?"select":""]||a.pointAttr[""],j?(ab(j),j.attr(i)[b.pointCount<e?"animate":"attr"](w(f))):h.graphic=d[h.shapeType](f).attr(g).attr(i).add(a.group).shadow(c.shadow,null,c.stacking&&!c.borderRadius);else if(j)h.graphic=j.destroy()})},animate:function(a){var b=this.yAxis,c=this.options,d=this.chart.inverted,e={};if(ba)a?(e.scaleY=0.001,a=C(b.pos+b.len,u(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):
+(e.scaleY=1,e[d?"translateX":"translateY"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&q(b.series,function(b){if(b.type===a.type)b.isDirty=!0});O.prototype.remove.apply(a,arguments)}});J.column=ha;ca.bar=w(ca.column);qa=la(ha,{type:"bar",inverted:!0});J.bar=qa;ca.scatter=w(T,{lineWidth:0,tooltip:{headerFormat:'<span style="color:{series.color}">●</span> <span style="font-size: 10px;"> {series.name}</span><br/>',pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"},
+stickyTracking:!1});qa=la(O,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1,singularTooltips:!0,drawGraph:function(){this.options.lineWidth&&O.prototype.drawGraph.call(this)}});J.scatter=qa;ca.pie=w(T,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,
+showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});T={type:"pie",isCartesian:!1,pointClass:la(Ea,{init:function(){Ea.prototype.init.apply(this,arguments);var a=this,b;if(a.y<0)a.y=null;r(a,{visible:a.visible!==!1,name:p(a.name,"Slice")});b=function(b){a.slice(b.type==="select")};N(a,"select",b);N(a,"unselect",b);return a},setVisible:function(a){var b=this,c=b.series,d=c.chart;b.visible=b.options.visible=a=a===t?!b.visible:a;c.options.data[Da(b,
+c.data)]=b.options;q(["graphic","dataLabel","connector","shadowGroup"],function(c){if(b[c])b[c][a?"show":"hide"](!0)});b.legendItem&&d.legend.colorizeItem(b,a);if(!c.isDirty&&c.options.ignoreHiddenPoint)c.isDirty=!0,d.redraw()},slice:function(a,b,c){var d=this.series;Qa(c,d.chart);p(b,!0);this.sliced=this.options.sliced=a=s(a)?a:!this.sliced;d.options.data[Da(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},
+haloPath:function(a){var b=this.shapeArgs,c=this.series.chart;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.plotLeft+b.x,c.plotTop+b.y,b.r+a,b.r+a,{innerR:this.shapeArgs.r,start:b.start,end:b.end})}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},singularTooltips:!0,getColor:sa,animate:function(a){var b=this,c=b.points,d=b.startAngleRad;
+if(!a)q(c,function(a){var c=a.graphic,a=a.shapeArgs;c&&(c.attr({r:b.center[3]/2,start:d,end:d}),c.animate({r:a.r,start:a.start,end:a.end},b.options.animation))}),b.animate=null},setData:function(a,b,c,d){O.prototype.setData.call(this,a,!1,c,d);this.processData();this.generatePoints();p(b,!0)&&this.chart.redraw(c)},generatePoints:function(){var a,b=0,c,d,e,f=this.options.ignoreHiddenPoint;O.prototype.generatePoints.call(this);c=this.points;d=c.length;for(a=0;a<d;a++)e=c[a],b+=f&&!e.visible?0:e.y;this.total=
+b;for(a=0;a<d;a++)e=c[a],e.percentage=b>0?e.y/b*100:0,e.total=b},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=na/180*(i-90),i=(this.endAngleRad=na/180*(p(c.endAngle,i+360)-90))-j,k=this.points,l=c.dataLabels.distance,c=c.ignoreHiddenPoint,m,n=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=V.asin(C((b-a[1])/(a[2]/2+l),1));return a[0]+(c?-1:1)*aa(h)*(a[2]/2+l)};for(m=0;m<
+n;m++){o=k[m];f=j+b*i;if(!c||o.visible)b+=o.percentage/100;g=j+b*i;o.shapeType="arc";o.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:v(f*1E3)/1E3,end:v(g*1E3)/1E3};h=(g+f)/2;h>1.5*na?h-=2*na:h<-na/2&&(h+=2*na);o.slicedTranslation={translateX:v(aa(h)*d),translateY:v(fa(h)*d)};f=aa(h)*a[2]/2;g=fa(h)*a[2]/2;o.tooltipPos=[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-na/2||h>na/2?1:0;o.angle=h;e=C(e,l/2);o.labelPos=[a[0]+f+aa(h)*l,a[1]+g+fa(h)*l,a[0]+f+aa(h)*e,a[1]+g+fa(h)*e,a[0]+f,a[1]+g,l<0?"center":o.half?
+"right":"left",h]}},drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);q(a.points,function(h){d=h.graphic;g=h.shapeArgs;f=h.shadowGroup;if(e&&!f)f=h.shadowGroup=b.g("shadow").add(a.shadowGroup);c=h.sliced?h.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);d?d.animate(r(g,c)):h.graphic=d=b[h.shapeType](g).setRadialReference(a.center).attr(h.pointAttr[h.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(c).add(a.group).shadow(e,
+f);h.visible!==void 0&&h.setVisible(h.visible)})},sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawLegendSymbol:M.drawRectangle,getCenter:Z.getCenter,getSymbol:sa};T=la(O,T);J.pie=T;O.prototype.drawDataLabels=function(){var a=this,b=a.options,c=b.cursor,d=b.dataLabels,e=a.points,f,g,h,i;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(d),i=a.plotGroup("dataLabelsGroup","data-labels",d.defer?"hidden":"visible",d.zIndex||6),!a.hasRendered&&
+p(d.defer,!0)&&(i.attr({opacity:0}),N(a,"afterAnimate",function(){a.visible&&i.show();i[b.animation?"animate":"attr"]({opacity:1},{duration:200})})),g=d,q(e,function(b){var e,l=b.dataLabel,m,n,o=b.connector,q=!0;f=b.options&&b.options.dataLabels;e=p(f&&f.enabled,g.enabled);if(l&&!e)b.dataLabel=l.destroy();else if(e){d=w(g,f);e=d.rotation;m=b.getLabelConfig();h=d.format?Ia(d.format,m):d.formatter.call(m,d);d.style.color=p(d.color,d.style.color,a.color,"black");if(l)if(s(h))l.attr({text:h}),q=!1;else{if(b.dataLabel=
+l=l.destroy(),o)b.connector=o.destroy()}else if(s(h)){l={fill:d.backgroundColor,stroke:d.borderColor,"stroke-width":d.borderWidth,r:d.borderRadius||0,rotation:e,padding:d.padding,zIndex:1};for(n in l)l[n]===t&&delete l[n];l=b.dataLabel=a.chart.renderer[e?"text":"label"](h,0,-999,null,null,null,d.useHTML).attr(l).css(r(d.style,c&&{cursor:c})).add(i).shadow(d.shadow)}l&&a.alignDataLabel(b,l,d,null,q)}})};O.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=p(a.plotX,-999),
+i=p(a.plotY,-999),j=b.getBBox();if(a=this.visible&&(a.series.forceDL||f.isInsidePlot(h,v(i),g)||d&&f.isInsidePlot(h,g?d.x+1:d.y+d.height-1,g)))d=r({x:g?f.plotWidth-i:h,y:v(g?f.plotHeight-h:i),width:0,height:0},d),r(c,{width:j.width,height:j.height}),c.rotation?b[e?"attr":"animate"]({x:d.x+c.x+d.width/2,y:d.y+c.y+d.height/2}).attr({align:c.align}):(b.align(c,null,d),g=b.alignAttr,p(c.overflow,"justify")==="justify"?this.justifyDataLabel(b,c,g,j,d,e):p(c.crop,!0)&&(a=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+
+j.width,g.y+j.height)));if(!a)b.attr({y:-999}),b.placed=!1};O.prototype.justifyDataLabel=function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k;j=c.x;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0;j=c.y;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height;if(j>g.plotHeight)i==="top"?b.verticalAlign="bottom":b.y=g.plotHeight-j,k=!0;if(k)a.placed=!f,a.align(b,null,e)};if(J.pie)J.pie.prototype.drawDataLabels=
+function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=p(e.connectorPadding,10),g=p(e.connectorWidth,1),h=d.plotWidth,i=d.plotHeight,j,k,l=p(e.softConnector,!0),m=e.distance,n=a.center,o=n[2]/2,r=n[1],s=m>0,t,w,x,z=[[],[]],B,A,K,J,y,R=[0,0,0,0],N=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){O.prototype.drawDataLabels.apply(a);q(b,function(a){a.dataLabel&&a.visible&&z[a.half].push(a)});for(J=2;J--;){var H=[],M=[],F=z[J],L=F.length,G;if(L){a.sortByAngle(F,
+J-0.5);for(y=b=0;!b&&F[y];)b=F[y]&&F[y].dataLabel&&(F[y].dataLabel.getBBox().height||21),y++;if(m>0){w=C(r+o+m,d.plotHeight);for(y=u(0,r-o-m);y<=w;y+=b)H.push(y);w=H.length;if(L>w){c=[].concat(F);c.sort(N);for(y=L;y--;)c[y].rank=y;for(y=L;y--;)F[y].rank>=w&&F.splice(y,1);L=F.length}for(y=0;y<L;y++){c=F[y];x=c.labelPos;c=9999;var S,P;for(P=0;P<w;P++)S=Q(H[P]-x[1]),S<c&&(c=S,G=P);if(G<y&&H[y]!==null)G=y;else for(w<L-y+G&&H[y]!==null&&(G=w-L+y);H[G]===null;)G++;M.push({i:G,y:H[G]});H[G]=null}M.sort(N)}for(y=
+0;y<L;y++){c=F[y];x=c.labelPos;t=c.dataLabel;K=c.visible===!1?"hidden":"visible";c=x[1];if(m>0){if(w=M.pop(),G=w.i,A=w.y,c>A&&H[G+1]!==null||c<A&&H[G-1]!==null)A=C(u(0,c),d.plotHeight)}else A=c;B=e.justify?n[0]+(J?-1:1)*(o+m):a.getX(A===r-o-m||A===r+o+m?c:A,J);t._attr={visibility:K,align:x[6]};t._pos={x:B+e.x+({left:f,right:-f}[x[6]]||0),y:A+e.y-10};t.connX=B;t.connY=A;if(this.options.size===null)w=t.width,B-w<f?R[3]=u(v(w-B+f),R[3]):B+w>h-f&&(R[1]=u(v(B+w-h+f),R[1])),A-b/2<0?R[0]=u(v(-A+b/2),R[0]):
+A+b/2>i&&(R[2]=u(v(A+b/2-i),R[2]))}}}if(Ba(R)===0||this.verifyDataLabelOverflow(R))this.placeDataLabels(),s&&g&&q(this.points,function(b){j=b.connector;x=b.labelPos;if((t=b.dataLabel)&&t._pos)K=t._attr.visibility,B=t.connX,A=t.connY,k=l?["M",B+(x[6]==="left"?5:-5),A,"C",B,A,2*x[2]-x[4],2*x[3]-x[5],x[2],x[3],"L",x[4],x[5]]:["M",B+(x[6]==="left"?5:-5),A,"L",x[2],x[3],"L",x[4],x[5]],j?(j.animate({d:k}),j.attr("visibility",K)):b.connector=j=a.chart.renderer.path(k).attr({"stroke-width":g,stroke:e.connectorColor||
+b.color||"#606060",visibility:K}).add(a.dataLabelsGroup);else if(j)b.connector=j.destroy()})}},J.pie.prototype.placeDataLabels=function(){q(this.points,function(a){var a=a.dataLabel,b;if(a)(b=a._pos)?(a.attr(a._attr),a[a.moved?"animate":"attr"](b),a.moved=!0):a&&a.attr({y:-999})})},J.pie.prototype.alignDataLabel=sa,J.pie.prototype.verifyDataLabelOverflow=function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize||80,f;d[0]!==null?e=u(b[2]-u(a[1],a[3]),c):(e=u(b[2]-a[1]-a[3],c),b[0]+=(a[3]-
+a[1])/2);d[1]!==null?e=u(C(e,b[2]-u(a[0],a[2])),c):(e=u(C(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);e<b[2]?(b[2]=e,this.translate(b),q(this.points,function(a){if(a.dataLabel)a.dataLabel._pos=null}),this.drawDataLabels&&this.drawDataLabels()):f=!0;return f};if(J.column)J.column.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=a.dlBox||a.shapeArgs,i=a.below||a.plotY>p(this.translatedThreshold,f.plotSizeY),j=p(c.inside,!!this.options.stacking);if(h&&(d=w(h),g&&(d={x:f.plotWidth-
+d.y-d.height,y:f.plotHeight-d.x-d.width,width:d.height,height:d.width}),!j))g?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=p(c.align,!g||j?"center":i?"right":"left");c.verticalAlign=p(c.verticalAlign,g||j?"middle":i?"top":"bottom");O.prototype.alignDataLabel.call(this,a,b,c,d,e)};T=S.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(c){var d=c.target,e;if(b.hoverSeries!==a)a.onMouseOver();for(;d&&!e;)e=d.point,
+d=d.parentNode;if(e!==t&&e!==b.hoverPoint)e.onMouseOver(c)};q(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)q(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),Za))a[b].on("touchstart",f)}),a._hasTracking=!0},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,
+f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,l=k&&{cursor:k},k=a.singlePoints,m,n=function(){if(f.hoverSeries!==a)a.onMouseOver()},o="rgba(192,192,192,"+(ba?1.0E-4:0.002)+")";if(e&&!c)for(m=e+1;m--;)d[m]==="M"&&d.splice(m+1,0,d[m+1]-i,d[m+2],"L"),(m&&d[m]==="M"||m===e)&&d.splice(m,0,"L",d[m-2]+i,d[m-1]);for(m=0;m<k.length;m++)e=k[m],d.push("M",e.plotX-i,e.plotY,"L",e.plotX+i,e.plotY);j?j.attr({d:d}):(a.tracker=h.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?
+"visible":"hidden",stroke:o,fill:c?o:P,"stroke-width":b.lineWidth+(c?0:2*i),zIndex:2}).add(a.group),q([a.tracker,a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover",n).on("mouseout",function(a){g.onTrackerMouseOut(a)}).css(l);if(Za)a.on("touchstart",n)}))}};if(J.column)ha.prototype.drawTracker=T.drawTrackerPoint;if(J.pie)J.pie.prototype.drawTracker=T.drawTrackerPoint;if(J.scatter)qa.prototype.drawTracker=T.drawTrackerPoint;r(kb.prototype,{setItemEvents:function(a,b,c,d,e){var f=
+this;(c?b:a.legendGroup).on("mouseover",function(){a.setState("hover");b.css(f.options.itemHoverStyle)}).on("mouseout",function(){b.css(a.visible?d:e);a.setState()}).on("click",function(b){var c=function(){a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):K(a,"legendItemClick",b,c)})},createCheckboxForItem:function(a){a.checkbox=$("input",{type:"checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);N(a.checkbox,
+"click",function(b){K(a,"checkboxClick",{checked:b.target.checked},function(){a.select()})})}});L.legend.itemStyle.cursor="pointer";r(Xa.prototype,{showResetZoom:function(){var a=this,b=L.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo==="chart"?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,f)},zoomOut:function(){var a=this;
+K(a,"selection",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var b,c=this.pointer,d=!1,e;!a||a.resetSelection?q(this.axes,function(a){b=a.zoom()}):q(a.xAxis.concat(a.yAxis),function(a){var e=a.axis,h=e.isXAxis;if(c[h?"zoomX":"zoomY"]||c[h?"pinchX":"pinchY"])b=e.zoom(a.min,a.max),e.displayBtn&&(d=!0)});e=this.resetZoomButton;if(d&&!e)this.showResetZoom();else if(!d&&da(e))this.resetZoomButton=e.destroy();b&&this.redraw(p(this.options.chart.animation,a&&a.animation,this.pointCount<100))},
+pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&q(d,function(a){a.setState()});q(b==="xy"?[1,0]:[1],function(b){var d=a[b?"chartX":"chartY"],h=c[b?"xAxis":"yAxis"][0],i=c[b?"mouseDownX":"mouseDownY"],j=(h.pointRange||0)/2,k=h.getExtremes(),l=h.toValue(i-d,!0)+j,i=h.toValue(i+c[b?"plotWidth":"plotHeight"]-d,!0)-j;h.series.length&&l>C(k.dataMin,k.min)&&i<u(k.dataMax,k.max)&&(h.setExtremes(l,i,!1,!1,{trigger:"pan"}),e=!0);c[b?"mouseDownX":"mouseDownY"]=d});e&&c.redraw(!1);A(c.container,{cursor:"move"})}});
+r(Ea.prototype,{select:function(a,b){var c=this,d=c.series,e=d.chart,a=p(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[Da(c,d.data)]=c.options;c.setState(a&&"select");b||q(e.getSelectedPoints(),function(a){if(a.selected&&a!==c)a.selected=a.options.selected=!1,d.options.data[Da(a,d.data)]=a.options,a.setState(""),a.firePointEvent("unselect")})})},onMouseOver:function(a){var b=this.series,c=b.chart,d=c.tooltip,e=c.hoverPoint;
+if(e&&e!==this)e.onMouseOut();this.firePointEvent("mouseOver");d&&(!d.shared||b.noSharedTooltip)&&d.refresh(this,a);this.setState("hover");c.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints;this.firePointEvent("mouseOut");if(!b||Da(this,b)===-1)this.setState(),a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var a=w(this.series.options.point,this.options).events,b;this.events=a;for(b in a)N(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a,
+b){var c=this.plotX,d=this.plotY,e=this.series,f=e.options.states,g=ca[e.type].marker&&e.options.marker,h=g&&!g.enabled,i=g&&g.states[a],j=i&&i.enabled===!1,k=e.stateMarkerGraphic,l=this.marker||{},m=e.chart,n=e.halo,o,a=a||"";o=this.pointAttr[a]||e.pointAttr[a];if(!(a===this.state&&!b||this.selected&&a!=="select"||f[a]&&f[a].enabled===!1||a&&(j||h&&i.enabled===!1)||a&&l.states&&l.states[a]&&l.states[a].enabled===!1)){if(this.graphic)g=g&&this.graphic.symbolName&&o.r,this.graphic.attr(w(o,g?{x:c-
+g,y:d-g,width:2*g,height:2*g}:{})),k&&k.hide();else{if(a&&i)if(g=i.radius,l=l.symbol||e.symbol,k&&k.currentSymbol!==l&&(k=k.destroy()),k)k[b?"animate":"attr"]({x:c-g,y:d-g});else if(l)e.stateMarkerGraphic=k=m.renderer.symbol(l,c-g,d-g,2*g,2*g).attr(o).add(e.markerGroup),k.currentSymbol=l;if(k)k[a&&m.isInsidePlot(c,d,m.inverted)?"show":"hide"]()}if((c=f[a]&&f[a].halo)&&c.size){if(!n)e.halo=n=m.renderer.path().add(e.seriesGroup);n.attr(r({fill:ya(this.color||e.color).setOpacity(c.opacity).get()},c.attributes))[b?
+"animate":"attr"]({d:this.haloPath(c.size)})}else n&&n.attr({d:[]});this.state=a}},haloPath:function(a){var b=this.series,c=b.chart,d=b.getPlotBox(),e=c.inverted;return c.renderer.symbols.circle(d.translateX+(e?b.yAxis.len-this.plotY:this.plotX)-a,d.translateY+(e?b.xAxis.len-this.plotX:this.plotY)-a,a*2,a*2)}});r(O.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&K(this,"mouseOver");this.setState("hover");a.hoverSeries=
+this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;if(d)d.onMouseOut();this&&a.events.mouseOut&&K(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState();b.hoverSeries=null},setState:function(a){var b=this.options,c=this.graph,d=this.graphNeg,e=b.states,b=b.lineWidth,a=a||"";if(this.state!==a)this.state=a,e[a]&&e[a].enabled===!1||(a&&(b=e[a].lineWidth||b+(e[a].lineWidthPlus||0)),c&&!c.dashstyle&&(a={"stroke-width":b},c.attr(a),
+d&&d.attr(a)))},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===t?!h:a)?"show":"hide";q(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&q(d.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});q(c.linkedSeries,function(b){b.setVisible(a,!1)});if(g)d.isDirtyBox=
+!0;b!==!1&&d.redraw();K(c,f)},setTooltipPoints:function(a){var b=[],c,d,e=this.xAxis,f=e&&e.getExtremes(),g=e?e.tooltipLen||e.len:this.chart.plotSizeX,h,i,j=[];if(!(this.options.enableMouseTracking===!1||this.singularTooltips)){if(a)this.tooltipPoints=null;q(this.segments||this.points,function(a){b=b.concat(a)});e&&e.reversed&&(b=b.reverse());this.orderTooltipPoints&&this.orderTooltipPoints(b);a=b.length;for(i=0;i<a;i++)if(e=b[i],c=e.x,c>=f.min&&c<=f.max){h=b[i+1];c=d===t?0:d+1;for(d=b[i+1]?C(u(0,
+U((e.clientX+(h?h.wrappedClientX||h.clientX:g))/2)),g):g;c>=0&&c<=d;)j[c++]=e}this.tooltipPoints=j}},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===t?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;K(this,a?"select":"unselect")},drawTracker:T.drawTrackerGraph});r(S,{Axis:ma,Chart:Xa,Color:ya,Point:Ea,Tick:Sa,Renderer:Ya,Series:O,SVGElement:G,SVGRenderer:ta,arrayMin:Na,arrayMax:Ba,charts:W,dateFormat:bb,format:Ia,pathAnim:ub,
+getOptions:function(){return L},hasBidiBug:Nb,isTouchDevice:Hb,numberFormat:Ga,seriesTypes:J,setOptions:function(a){L=w(!0,L,a);Ab();return L},addEvent:N,removeEvent:X,createElement:$,discardElement:Pa,css:A,each:q,extend:r,map:Ua,merge:w,pick:p,splat:ra,extendClass:la,pInt:z,wrap:Ma,svg:ba,canvas:ga,vml:!ba&&!ga,product:"Highcharts",version:"4.0.3"})})();
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts.src.js
new file mode 100644
index 0000000..d461476
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/highcharts.src.js
@@ -0,0 +1,17696 @@
+// ==ClosureCompiler==
+// @compilation_level SIMPLE_OPTIMIZATIONS
+
+/**
+ * @license Highcharts JS v4.0.3 (2014-07-03)
+ *
+ * (c) 2009-2014 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console, each, grep */
+/*jslint ass: true, sloppy: true, forin: true, plusplus: true, nomen: true, vars: true, regexp: true, newcap: true, browser: true, continue: true, white: true */
+(function () {
+// encapsulated variables
+var UNDEFINED,
+	doc = document,
+	win = window,
+	math = Math,
+	mathRound = math.round,
+	mathFloor = math.floor,
+	mathCeil = math.ceil,
+	mathMax = math.max,
+	mathMin = math.min,
+	mathAbs = math.abs,
+	mathCos = math.cos,
+	mathSin = math.sin,
+	mathPI = math.PI,
+	deg2rad = mathPI * 2 / 360,
+
+
+	// some variables
+	userAgent = navigator.userAgent,
+	isOpera = win.opera,
+	isIE = /msie/i.test(userAgent) && !isOpera,
+	docMode8 = doc.documentMode === 8,
+	isWebKit = /AppleWebKit/.test(userAgent),
+	isFirefox = /Firefox/.test(userAgent),
+	isTouchDevice = /(Mobile|Android|Windows Phone)/.test(userAgent),
+	SVG_NS = 'http://www.w3.org/2000/svg',
+	hasSVG = !!doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect,
+	hasBidiBug = isFirefox && parseInt(userAgent.split('Firefox/')[1], 10) < 4, // issue #38
+	useCanVG = !hasSVG && !isIE && !!doc.createElement('canvas').getContext,
+	Renderer,
+	hasTouch,
+	symbolSizes = {},
+	idCounter = 0,
+	garbageBin,
+	defaultOptions,
+	dateFormat, // function
+	globalAnimation,
+	pathAnim,
+	timeUnits,
+	error,
+	noop = function () { return UNDEFINED; },
+	charts = [],
+	chartCount = 0,
+	PRODUCT = 'Highcharts',
+	VERSION = '4.0.3',
+
+	// some constants for frequently used strings
+	DIV = 'div',
+	ABSOLUTE = 'absolute',
+	RELATIVE = 'relative',
+	HIDDEN = 'hidden',
+	PREFIX = 'highcharts-',
+	VISIBLE = 'visible',
+	PX = 'px',
+	NONE = 'none',
+	M = 'M',
+	L = 'L',
+	numRegex = /^[0-9]+$/,
+	NORMAL_STATE = '',
+	HOVER_STATE = 'hover',
+	SELECT_STATE = 'select',
+	
+	// Object for extending Axis
+	AxisPlotLineOrBandExtension,
+
+	// constants for attributes
+	STROKE_WIDTH = 'stroke-width',
+
+	// time methods, changed based on whether or not UTC is used
+	makeTime,
+	timezoneOffset,
+	getMinutes,
+	getHours,
+	getDay,
+	getDate,
+	getMonth,
+	getFullYear,
+	setMinutes,
+	setHours,
+	setDate,
+	setMonth,
+	setFullYear,
+
+
+	// lookup over the types and the associated classes
+	seriesTypes = {},
+	Highcharts;
+
+// The Highcharts namespace
+if (win.Highcharts) {
+	error(16, true);
+} else {
+	Highcharts = win.Highcharts = {};
+}
+/**
+ * Extend an object with the members of another
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to add to the first one
+ */
+function extend(a, b) {
+	var n;
+	if (!a) {
+		a = {};
+	}
+	for (n in b) {
+		a[n] = b[n];
+	}
+	return a;
+}
+	
+/**
+ * Deep merge two or more objects and return a third object. If the first argument is
+ * true, the contents of the second object is copied into the first object.
+ * Previously this function redirected to jQuery.extend(true), but this had two limitations.
+ * First, it deep merged arrays, which lead to workarounds in Highcharts. Second,
+ * it copied properties from extended prototypes. 
+ */
+function merge() {
+	var i,
+		args = arguments,
+		len,
+		ret = {},
+		doCopy = function (copy, original) {
+			var value, key;
+
+			// An object is replacing a primitive
+			if (typeof copy !== 'object') {
+				copy = {};
+			}
+
+			for (key in original) {
+				if (original.hasOwnProperty(key)) {
+					value = original[key];
+
+					// Copy the contents of objects, but not arrays or DOM nodes
+					if (value && typeof value === 'object' && Object.prototype.toString.call(value) !== '[object Array]'
+							&& key !== 'renderTo' && typeof value.nodeType !== 'number') {
+						copy[key] = doCopy(copy[key] || {}, value);
+				
+					// Primitives and arrays are copied over directly
+					} else {
+						copy[key] = original[key];
+					}
+				}
+			}
+			return copy;
+		};
+
+	// If first argument is true, copy into the existing object. Used in setOptions.
+	if (args[0] === true) {
+		ret = args[1];
+		args = Array.prototype.slice.call(args, 2);
+	}
+
+	// For each argument, extend the return
+	len = args.length;
+	for (i = 0; i < len; i++) {
+		ret = doCopy(ret, args[i]);
+	}
+
+	return ret;
+}
+
+/**
+ * Shortcut for parseInt
+ * @param {Object} s
+ * @param {Number} mag Magnitude
+ */
+function pInt(s, mag) {
+	return parseInt(s, mag || 10);
+}
+
+/**
+ * Check for string
+ * @param {Object} s
+ */
+function isString(s) {
+	return typeof s === 'string';
+}
+
+/**
+ * Check for object
+ * @param {Object} obj
+ */
+function isObject(obj) {
+	return obj && typeof obj === 'object';
+}
+
+/**
+ * Check for array
+ * @param {Object} obj
+ */
+function isArray(obj) {
+	return Object.prototype.toString.call(obj) === '[object Array]';
+}
+
+/**
+ * Check for number
+ * @param {Object} n
+ */
+function isNumber(n) {
+	return typeof n === 'number';
+}
+
+function log2lin(num) {
+	return math.log(num) / math.LN10;
+}
+function lin2log(num) {
+	return math.pow(10, num);
+}
+
+/**
+ * Remove last occurence of an item from an array
+ * @param {Array} arr
+ * @param {Mixed} item
+ */
+function erase(arr, item) {
+	var i = arr.length;
+	while (i--) {
+		if (arr[i] === item) {
+			arr.splice(i, 1);
+			break;
+		}
+	}
+	//return arr;
+}
+
+/**
+ * Returns true if the object is not null or undefined. Like MooTools' $.defined.
+ * @param {Object} obj
+ */
+function defined(obj) {
+	return obj !== UNDEFINED && obj !== null;
+}
+
+/**
+ * Set or get an attribute or an object of attributes. Can't use jQuery attr because
+ * it attempts to set expando properties on the SVG element, which is not allowed.
+ *
+ * @param {Object} elem The DOM element to receive the attribute(s)
+ * @param {String|Object} prop The property or an abject of key-value pairs
+ * @param {String} value The value if a single property is set
+ */
+function attr(elem, prop, value) {
+	var key,
+		ret;
+
+	// if the prop is a string
+	if (isString(prop)) {
+		// set the value
+		if (defined(value)) {
+			elem.setAttribute(prop, value);
+
+		// get the value
+		} else if (elem && elem.getAttribute) { // elem not defined when printing pie demo...
+			ret = elem.getAttribute(prop);
+		}
+
+	// else if prop is defined, it is a hash of key/value pairs
+	} else if (defined(prop) && isObject(prop)) {
+		for (key in prop) {
+			elem.setAttribute(key, prop[key]);
+		}
+	}
+	return ret;
+}
+/**
+ * Check if an element is an array, and if not, make it into an array. Like
+ * MooTools' $.splat.
+ */
+function splat(obj) {
+	return isArray(obj) ? obj : [obj];
+}
+
+
+/**
+ * Return the first value that is defined. Like MooTools' $.pick.
+ */
+function pick() {
+	var args = arguments,
+		i,
+		arg,
+		length = args.length;
+	for (i = 0; i < length; i++) {
+		arg = args[i];
+		if (arg !== UNDEFINED && arg !== null) {
+			return arg;
+		}
+	}
+}
+
+/**
+ * Set CSS on a given element
+ * @param {Object} el
+ * @param {Object} styles Style object with camel case property names
+ */
+function css(el, styles) {
+	if (isIE && !hasSVG) { // #2686
+		if (styles && styles.opacity !== UNDEFINED) {
+			styles.filter = 'alpha(opacity=' + (styles.opacity * 100) + ')';
+		}
+	}
+	extend(el.style, styles);
+}
+
+/**
+ * Utility function to create element with attributes and styles
+ * @param {Object} tag
+ * @param {Object} attribs
+ * @param {Object} styles
+ * @param {Object} parent
+ * @param {Object} nopad
+ */
+function createElement(tag, attribs, styles, parent, nopad) {
+	var el = doc.createElement(tag);
+	if (attribs) {
+		extend(el, attribs);
+	}
+	if (nopad) {
+		css(el, {padding: 0, border: NONE, margin: 0});
+	}
+	if (styles) {
+		css(el, styles);
+	}
+	if (parent) {
+		parent.appendChild(el);
+	}
+	return el;
+}
+
+/**
+ * Extend a prototyped class by new members
+ * @param {Object} parent
+ * @param {Object} members
+ */
+function extendClass(parent, members) {
+	var object = function () { return UNDEFINED; };
+	object.prototype = new parent();
+	extend(object.prototype, members);
+	return object;
+}
+
+/**
+ * Format a number and return a string based on input settings
+ * @param {Number} number The input number to format
+ * @param {Number} decimals The amount of decimals
+ * @param {String} decPoint The decimal point, defaults to the one given in the lang options
+ * @param {String} thousandsSep The thousands separator, defaults to the one given in the lang options
+ */
+function numberFormat(number, decimals, decPoint, thousandsSep) {
+	var lang = defaultOptions.lang,
+		// http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format/
+		n = +number || 0,
+		c = decimals === -1 ?
+			(n.toString().split('.')[1] || '').length : // preserve decimals
+			(isNaN(decimals = mathAbs(decimals)) ? 2 : decimals),
+		d = decPoint === undefined ? lang.decimalPoint : decPoint,
+		t = thousandsSep === undefined ? lang.thousandsSep : thousandsSep,
+		s = n < 0 ? "-" : "",
+		i = String(pInt(n = mathAbs(n).toFixed(c))),
+		j = i.length > 3 ? i.length % 3 : 0;
+
+	return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) +
+		(c ? d + mathAbs(n - i).toFixed(c).slice(2) : "");
+}
+
+/**
+ * Pad a string to a given length by adding 0 to the beginning
+ * @param {Number} number
+ * @param {Number} length
+ */
+function pad(number, length) {
+	// Create an array of the remaining length +1 and join it with 0's
+	return new Array((length || 2) + 1 - String(number).length).join(0) + number;
+}
+
+/**
+ * Wrap a method with extended functionality, preserving the original function
+ * @param {Object} obj The context object that the method belongs to 
+ * @param {String} method The name of the method to extend
+ * @param {Function} func A wrapper function callback. This function is called with the same arguments
+ * as the original function, except that the original function is unshifted and passed as the first 
+ * argument. 
+ */
+function wrap(obj, method, func) {
+	var proceed = obj[method];
+	obj[method] = function () {
+		var args = Array.prototype.slice.call(arguments);
+		args.unshift(proceed);
+		return func.apply(this, args);
+	};
+}
+
+/**
+ * Based on http://www.php.net/manual/en/function.strftime.php
+ * @param {String} format
+ * @param {Number} timestamp
+ * @param {Boolean} capitalize
+ */
+dateFormat = function (format, timestamp, capitalize) {
+	if (!defined(timestamp) || isNaN(timestamp)) {
+		return 'Invalid date';
+	}
+	format = pick(format, '%Y-%m-%d %H:%M:%S');
+
+	var date = new Date(timestamp - timezoneOffset),
+		key, // used in for constuct below
+		// get the basic time values
+		hours = date[getHours](),
+		day = date[getDay](),
+		dayOfMonth = date[getDate](),
+		month = date[getMonth](),
+		fullYear = date[getFullYear](),
+		lang = defaultOptions.lang,
+		langWeekdays = lang.weekdays,
+
+		// List all format keys. Custom formats can be added from the outside. 
+		replacements = extend({
+
+			// Day
+			'a': langWeekdays[day].substr(0, 3), // Short weekday, like 'Mon'
+			'A': langWeekdays[day], // Long weekday, like 'Monday'
+			'd': pad(dayOfMonth), // Two digit day of the month, 01 to 31
+			'e': dayOfMonth, // Day of the month, 1 through 31
+
+			// Week (none implemented)
+			//'W': weekNumber(),
+
+			// Month
+			'b': lang.shortMonths[month], // Short month, like 'Jan'
+			'B': lang.months[month], // Long month, like 'January'
+			'm': pad(month + 1), // Two digit month number, 01 through 12
+
+			// Year
+			'y': fullYear.toString().substr(2, 2), // Two digits year, like 09 for 2009
+			'Y': fullYear, // Four digits year, like 2009
+
+			// Time
+			'H': pad(hours), // Two digits hours in 24h format, 00 through 23
+			'I': pad((hours % 12) || 12), // Two digits hours in 12h format, 00 through 11
+			'l': (hours % 12) || 12, // Hours in 12h format, 1 through 12
+			'M': pad(date[getMinutes]()), // Two digits minutes, 00 through 59
+			'p': hours < 12 ? 'AM' : 'PM', // Upper case AM or PM
+			'P': hours < 12 ? 'am' : 'pm', // Lower case AM or PM
+			'S': pad(date.getSeconds()), // Two digits seconds, 00 through  59
+			'L': pad(mathRound(timestamp % 1000), 3) // Milliseconds (naming from Ruby)
+		}, Highcharts.dateFormats);
+
+
+	// do the replaces
+	for (key in replacements) {
+		while (format.indexOf('%' + key) !== -1) { // regex would do it in one line, but this is faster
+			format = format.replace('%' + key, typeof replacements[key] === 'function' ? replacements[key](timestamp) : replacements[key]);
+		}
+	}
+
+	// Optionally capitalize the string and return
+	return capitalize ? format.substr(0, 1).toUpperCase() + format.substr(1) : format;
+};
+
+/** 
+ * Format a single variable. Similar to sprintf, without the % prefix.
+ */
+function formatSingle(format, val) {
+	var floatRegex = /f$/,
+		decRegex = /\.([0-9])/,
+		lang = defaultOptions.lang,
+		decimals;
+
+	if (floatRegex.test(format)) { // float
+		decimals = format.match(decRegex);
+		decimals = decimals ? decimals[1] : -1;
+		if (val !== null) {
+			val = numberFormat(
+				val,
+				decimals,
+				lang.decimalPoint,
+				format.indexOf(',') > -1 ? lang.thousandsSep : ''
+			);
+		}
+	} else {
+		val = dateFormat(format, val);
+	}
+	return val;
+}
+
+/**
+ * Format a string according to a subset of the rules of Python's String.format method.
+ */
+function format(str, ctx) {
+	var splitter = '{',
+		isInside = false,
+		segment,
+		valueAndFormat,
+		path,
+		i,
+		len,
+		ret = [],
+		val,
+		index;
+	
+	while ((index = str.indexOf(splitter)) !== -1) {
+		
+		segment = str.slice(0, index);
+		if (isInside) { // we're on the closing bracket looking back
+			
+			valueAndFormat = segment.split(':');
+			path = valueAndFormat.shift().split('.'); // get first and leave format
+			len = path.length;
+			val = ctx;
+
+			// Assign deeper paths
+			for (i = 0; i < len; i++) {
+				val = val[path[i]];
+			}
+
+			// Format the replacement
+			if (valueAndFormat.length) {
+				val = formatSingle(valueAndFormat.join(':'), val);
+			}
+
+			// Push the result and advance the cursor
+			ret.push(val);
+			
+		} else {
+			ret.push(segment);
+			
+		}
+		str = str.slice(index + 1); // the rest
+		isInside = !isInside; // toggle
+		splitter = isInside ? '}' : '{'; // now look for next matching bracket
+	}
+	ret.push(str);
+	return ret.join('');
+}
+
+/**
+ * Get the magnitude of a number
+ */
+function getMagnitude(num) {
+	return math.pow(10, mathFloor(math.log(num) / math.LN10));
+}
+
+/**
+ * Take an interval and normalize it to multiples of 1, 2, 2.5 and 5
+ * @param {Number} interval
+ * @param {Array} multiples
+ * @param {Number} magnitude
+ * @param {Object} options
+ */
+function normalizeTickInterval(interval, multiples, magnitude, options) {
+	var normalized, i;
+
+	// round to a tenfold of 1, 2, 2.5 or 5
+	magnitude = pick(magnitude, 1);
+	normalized = interval / magnitude;
+
+	// multiples for a linear scale
+	if (!multiples) {
+		multiples = [1, 2, 2.5, 5, 10];
+
+		// the allowDecimals option
+		if (options && options.allowDecimals === false) {
+			if (magnitude === 1) {
+				multiples = [1, 2, 5, 10];
+			} else if (magnitude <= 0.1) {
+				multiples = [1 / magnitude];
+			}
+		}
+	}
+
+	// normalize the interval to the nearest multiple
+	for (i = 0; i < multiples.length; i++) {
+		interval = multiples[i];
+		if (normalized <= (multiples[i] + (multiples[i + 1] || multiples[i])) / 2) {
+			break;
+		}
+	}
+
+	// multiply back to the correct magnitude
+	interval *= magnitude;
+
+	return interval;
+}
+
+
+/**
+ * Utility method that sorts an object array and keeping the order of equal items.
+ * ECMA script standard does not specify the behaviour when items are equal.
+ */
+function stableSort(arr, sortFunction) {
+	var length = arr.length,
+		sortValue,
+		i;
+
+	// Add index to each item
+	for (i = 0; i < length; i++) {
+		arr[i].ss_i = i; // stable sort index
+	}
+
+	arr.sort(function (a, b) {
+		sortValue = sortFunction(a, b);
+		return sortValue === 0 ? a.ss_i - b.ss_i : sortValue;
+	});
+
+	// Remove index from items
+	for (i = 0; i < length; i++) {
+		delete arr[i].ss_i; // stable sort index
+	}
+}
+
+/**
+ * Non-recursive method to find the lowest member of an array. Math.min raises a maximum
+ * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This
+ * method is slightly slower, but safe.
+ */
+function arrayMin(data) {
+	var i = data.length,
+		min = data[0];
+
+	while (i--) {
+		if (data[i] < min) {
+			min = data[i];
+		}
+	}
+	return min;
+}
+
+/**
+ * Non-recursive method to find the lowest member of an array. Math.min raises a maximum
+ * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This
+ * method is slightly slower, but safe.
+ */
+function arrayMax(data) {
+	var i = data.length,
+		max = data[0];
+
+	while (i--) {
+		if (data[i] > max) {
+			max = data[i];
+		}
+	}
+	return max;
+}
+
+/**
+ * Utility method that destroys any SVGElement or VMLElement that are properties on the given object.
+ * It loops all properties and invokes destroy if there is a destroy method. The property is
+ * then delete'ed.
+ * @param {Object} The object to destroy properties on
+ * @param {Object} Exception, do not destroy this property, only delete it.
+ */
+function destroyObjectProperties(obj, except) {
+	var n;
+	for (n in obj) {
+		// If the object is non-null and destroy is defined
+		if (obj[n] && obj[n] !== except && obj[n].destroy) {
+			// Invoke the destroy
+			obj[n].destroy();
+		}
+
+		// Delete the property from the object.
+		delete obj[n];
+	}
+}
+
+
+/**
+ * Discard an element by moving it to the bin and delete
+ * @param {Object} The HTML node to discard
+ */
+function discardElement(element) {
+	// create a garbage bin element, not part of the DOM
+	if (!garbageBin) {
+		garbageBin = createElement(DIV);
+	}
+
+	// move the node and empty bin
+	if (element) {
+		garbageBin.appendChild(element);
+	}
+	garbageBin.innerHTML = '';
+}
+
+/**
+ * Provide error messages for debugging, with links to online explanation 
+ */
+error = function (code, stop) {
+	var msg = 'Highcharts error #' + code + ': www.highcharts.com/errors/' + code;
+	if (stop) {
+		throw msg;
+	}
+	// else ...
+	if (win.console) {
+		console.log(msg);
+	}
+};
+
+/**
+ * Fix JS round off float errors
+ * @param {Number} num
+ */
+function correctFloat(num) {
+	return parseFloat(
+		num.toPrecision(14)
+	);
+}
+
+/**
+ * Set the global animation to either a given value, or fall back to the
+ * given chart's animation option
+ * @param {Object} animation
+ * @param {Object} chart
+ */
+function setAnimation(animation, chart) {
+	globalAnimation = pick(animation, chart.animation);
+}
+
+/**
+ * The time unit lookup
+ */
+timeUnits = {
+	millisecond: 1,
+	second: 1000,
+	minute: 60000,
+	hour: 3600000,
+	day: 24 * 3600000,
+	week: 7 * 24 * 3600000,
+	month: 31 * 24 * 3600000,
+	year: 31556952000
+};
+/**
+ * Path interpolation algorithm used across adapters
+ */
+pathAnim = {
+	/**
+	 * Prepare start and end values so that the path can be animated one to one
+	 */
+	init: function (elem, fromD, toD) {
+		fromD = fromD || '';
+		var shift = elem.shift,
+			bezier = fromD.indexOf('C') > -1,
+			numParams = bezier ? 7 : 3,
+			endLength,
+			slice,
+			i,
+			start = fromD.split(' '),
+			end = [].concat(toD), // copy
+			startBaseLine,
+			endBaseLine,
+			sixify = function (arr) { // in splines make move points have six parameters like bezier curves
+				i = arr.length;
+				while (i--) {
+					if (arr[i] === M) {
+						arr.splice(i + 1, 0, arr[i + 1], arr[i + 2], arr[i + 1], arr[i + 2]);
+					}
+				}
+			};
+
+		if (bezier) {
+			sixify(start);
+			sixify(end);
+		}
+
+		// pull out the base lines before padding
+		if (elem.isArea) {
+			startBaseLine = start.splice(start.length - 6, 6);
+			endBaseLine = end.splice(end.length - 6, 6);
+		}
+
+		// if shifting points, prepend a dummy point to the end path
+		if (shift <= end.length / numParams && start.length === end.length) {
+			while (shift--) {
+				end = [].concat(end).splice(0, numParams).concat(end);
+			}
+		}
+		elem.shift = 0; // reset for following animations
+
+		// copy and append last point until the length matches the end length
+		if (start.length) {
+			endLength = end.length;
+			while (start.length < endLength) {
+
+				//bezier && sixify(start);
+				slice = [].concat(start).splice(start.length - numParams, numParams);
+				if (bezier) { // disable first control point
+					slice[numParams - 6] = slice[numParams - 2];
+					slice[numParams - 5] = slice[numParams - 1];
+				}
+				start = start.concat(slice);
+			}
+		}
+
+		if (startBaseLine) { // append the base lines for areas
+			start = start.concat(startBaseLine);
+			end = end.concat(endBaseLine);
+		}
+		return [start, end];
+	},
+
+	/**
+	 * Interpolate each value of the path and return the array
+	 */
+	step: function (start, end, pos, complete) {
+		var ret = [],
+			i = start.length,
+			startVal;
+
+		if (pos === 1) { // land on the final path without adjustment points appended in the ends
+			ret = complete;
+
+		} else if (i === end.length && pos < 1) {
+			while (i--) {
+				startVal = parseFloat(start[i]);
+				ret[i] =
+					isNaN(startVal) ? // a letter instruction like M or L
+						start[i] :
+						pos * (parseFloat(end[i] - startVal)) + startVal;
+
+			}
+		} else { // if animation is finished or length not matching, land on right value
+			ret = end;
+		}
+		return ret;
+	}
+};
+
+(function ($) {
+	/**
+	 * The default HighchartsAdapter for jQuery
+	 */
+	win.HighchartsAdapter = win.HighchartsAdapter || ($ && {
+		
+		/**
+		 * Initialize the adapter by applying some extensions to jQuery
+		 */
+		init: function (pathAnim) {
+			
+			// extend the animate function to allow SVG animations
+			var Fx = $.fx,
+				Step = Fx.step,
+				dSetter,
+				Tween = $.Tween,
+				propHooks = Tween && Tween.propHooks,
+				opacityHook = $.cssHooks.opacity;
+			
+			/*jslint unparam: true*//* allow unused param x in this function */
+			$.extend($.easing, {
+				easeOutQuad: function (x, t, b, c, d) {
+					return -c * (t /= d) * (t - 2) + b;
+				}
+			});
+			/*jslint unparam: false*/
+		
+			// extend some methods to check for elem.attr, which means it is a Highcharts SVG object
+			$.each(['cur', '_default', 'width', 'height', 'opacity'], function (i, fn) {
+				var obj = Step,
+					base;
+					
+				// Handle different parent objects
+				if (fn === 'cur') {
+					obj = Fx.prototype; // 'cur', the getter, relates to Fx.prototype
+				
+				} else if (fn === '_default' && Tween) { // jQuery 1.8 model
+					obj = propHooks[fn];
+					fn = 'set';
+				}
+		
+				// Overwrite the method
+				base = obj[fn];
+				if (base) { // step.width and step.height don't exist in jQuery < 1.7
+		
+					// create the extended function replacement
+					obj[fn] = function (fx) {
+
+						var elem;
+						
+						// Fx.prototype.cur does not use fx argument
+						fx = i ? fx : this;
+
+						// Don't run animations on textual properties like align (#1821)
+						if (fx.prop === 'align') {
+							return;
+						}
+		
+						// shortcut
+						elem = fx.elem;
+		
+						// Fx.prototype.cur returns the current value. The other ones are setters
+						// and returning a value has no effect.
+						return elem.attr ? // is SVG element wrapper
+							elem.attr(fx.prop, fn === 'cur' ? UNDEFINED : fx.now) : // apply the SVG wrapper's method
+							base.apply(this, arguments); // use jQuery's built-in method
+					};
+				}
+			});
+
+			// Extend the opacity getter, needed for fading opacity with IE9 and jQuery 1.10+
+			wrap(opacityHook, 'get', function (proceed, elem, computed) {
+				return elem.attr ? (elem.opacity || 0) : proceed.call(this, elem, computed);
+			});
+			
+			
+			// Define the setter function for d (path definitions)
+			dSetter = function (fx) {
+				var elem = fx.elem,
+					ends;
+		
+				// Normally start and end should be set in state == 0, but sometimes,
+				// for reasons unknown, this doesn't happen. Perhaps state == 0 is skipped
+				// in these cases
+				if (!fx.started) {
+					ends = pathAnim.init(elem, elem.d, elem.toD);
+					fx.start = ends[0];
+					fx.end = ends[1];
+					fx.started = true;
+				}
+		
+		
+				// interpolate each value of the path
+				elem.attr('d', pathAnim.step(fx.start, fx.end, fx.pos, elem.toD));
+			};
+			
+			// jQuery 1.8 style
+			if (Tween) {
+				propHooks.d = {
+					set: dSetter
+				};
+			// pre 1.8
+			} else {
+				// animate paths
+				Step.d = dSetter;
+			}
+			
+			/**
+			 * Utility for iterating over an array. Parameters are reversed compared to jQuery.
+			 * @param {Array} arr
+			 * @param {Function} fn
+			 */
+			this.each = Array.prototype.forEach ?
+				function (arr, fn) { // modern browsers
+					return Array.prototype.forEach.call(arr, fn);
+					
+				} : 
+				function (arr, fn) { // legacy
+					var i, 
+						len = arr.length;
+					for (i = 0; i < len; i++) {
+						if (fn.call(arr[i], arr[i], i, arr) === false) {
+							return i;
+						}
+					}
+				};
+			
+			/**
+			 * Register Highcharts as a plugin in the respective framework
+			 */
+			$.fn.highcharts = function () {
+				var constr = 'Chart', // default constructor
+					args = arguments,
+					options,
+					ret,
+					chart;
+
+				if (this[0]) {
+
+					if (isString(args[0])) {
+						constr = args[0];
+						args = Array.prototype.slice.call(args, 1); 
+					}
+					options = args[0];
+
+					// Create the chart
+					if (options !== UNDEFINED) {
+						/*jslint unused:false*/
+						options.chart = options.chart || {};
+						options.chart.renderTo = this[0];
+						chart = new Highcharts[constr](options, args[1]);
+						ret = this;
+						/*jslint unused:true*/
+					}
+
+					// When called without parameters or with the return argument, get a predefined chart
+					if (options === UNDEFINED) {
+						ret = charts[attr(this[0], 'data-highcharts-chart')];
+					}
+				}
+				
+				return ret;
+			};
+
+		},
+
+		
+		/**
+		 * Downloads a script and executes a callback when done.
+		 * @param {String} scriptLocation
+		 * @param {Function} callback
+		 */
+		getScript: $.getScript,
+		
+		/**
+		 * Return the index of an item in an array, or -1 if not found
+		 */
+		inArray: $.inArray,
+		
+		/**
+		 * A direct link to jQuery methods. MooTools and Prototype adapters must be implemented for each case of method.
+		 * @param {Object} elem The HTML element
+		 * @param {String} method Which method to run on the wrapped element
+		 */
+		adapterRun: function (elem, method) {
+			return $(elem)[method]();
+		},
+	
+		/**
+		 * Filter an array
+		 */
+		grep: $.grep,
+	
+		/**
+		 * Map an array
+		 * @param {Array} arr
+		 * @param {Function} fn
+		 */
+		map: function (arr, fn) {
+			//return jQuery.map(arr, fn);
+			var results = [],
+				i = 0,
+				len = arr.length;
+			for (; i < len; i++) {
+				results[i] = fn.call(arr[i], arr[i], i, arr);
+			}
+			return results;
+	
+		},
+	
+		/**
+		 * Get the position of an element relative to the top left of the page
+		 */
+		offset: function (el) {
+			return $(el).offset();
+		},
+	
+		/**
+		 * Add an event listener
+		 * @param {Object} el A HTML element or custom object
+		 * @param {String} event The event type
+		 * @param {Function} fn The event handler
+		 */
+		addEvent: function (el, event, fn) {
+			$(el).bind(event, fn);
+		},
+	
+		/**
+		 * Remove event added with addEvent
+		 * @param {Object} el The object
+		 * @param {String} eventType The event type. Leave blank to remove all events.
+		 * @param {Function} handler The function to remove
+		 */
+		removeEvent: function (el, eventType, handler) {
+			// workaround for jQuery issue with unbinding custom events:
+			// http://forum.jQuery.com/topic/javascript-error-when-unbinding-a-custom-event-using-jQuery-1-4-2
+			var func = doc.removeEventListener ? 'removeEventListener' : 'detachEvent';
+			if (doc[func] && el && !el[func]) {
+				el[func] = function () {};
+			}
+	
+			$(el).unbind(eventType, handler);
+		},
+	
+		/**
+		 * Fire an event on a custom object
+		 * @param {Object} el
+		 * @param {String} type
+		 * @param {Object} eventArguments
+		 * @param {Function} defaultFunction
+		 */
+		fireEvent: function (el, type, eventArguments, defaultFunction) {
+			var event = $.Event(type),
+				detachedType = 'detached' + type,
+				defaultPrevented;
+	
+			// Remove warnings in Chrome when accessing returnValue (#2790), layerX and layerY. Although Highcharts
+			// never uses these properties, Chrome includes them in the default click event and
+			// raises the warning when they are copied over in the extend statement below.
+			//
+			// To avoid problems in IE (see #1010) where we cannot delete the properties and avoid
+			// testing if they are there (warning in chrome) the only option is to test if running IE.
+			if (!isIE && eventArguments) {
+				delete eventArguments.layerX;
+				delete eventArguments.layerY;
+				delete eventArguments.returnValue;
+			}
+	
+			extend(event, eventArguments);
+	
+			// Prevent jQuery from triggering the object method that is named the
+			// same as the event. For example, if the event is 'select', jQuery
+			// attempts calling el.select and it goes into a loop.
+			if (el[type]) {
+				el[detachedType] = el[type];
+				el[type] = null;
+			}
+	
+			// Wrap preventDefault and stopPropagation in try/catch blocks in
+			// order to prevent JS errors when cancelling events on non-DOM
+			// objects. #615.
+			/*jslint unparam: true*/
+			$.each(['preventDefault', 'stopPropagation'], function (i, fn) {
+				var base = event[fn];
+				event[fn] = function () {
+					try {
+						base.call(event);
+					} catch (e) {
+						if (fn === 'preventDefault') {
+							defaultPrevented = true;
+						}
+					}
+				};
+			});
+			/*jslint unparam: false*/
+	
+			// trigger it
+			$(el).trigger(event);
+	
+			// attach the method
+			if (el[detachedType]) {
+				el[type] = el[detachedType];
+				el[detachedType] = null;
+			}
+	
+			if (defaultFunction && !event.isDefaultPrevented() && !defaultPrevented) {
+				defaultFunction(event);
+			}
+		},
+		
+		/**
+		 * Extension method needed for MooTools
+		 */
+		washMouseEvent: function (e) {
+			var ret = e.originalEvent || e;
+			
+			// computed by jQuery, needed by IE8
+			if (ret.pageX === UNDEFINED) { // #1236
+				ret.pageX = e.pageX;
+				ret.pageY = e.pageY;
+			}
+			
+			return ret;
+		},
+	
+		/**
+		 * Animate a HTML element or SVG element wrapper
+		 * @param {Object} el
+		 * @param {Object} params
+		 * @param {Object} options jQuery-like animation options: duration, easing, callback
+		 */
+		animate: function (el, params, options) {
+			var $el = $(el);
+			if (!el.style) {
+				el.style = {}; // #1881
+			}
+			if (params.d) {
+				el.toD = params.d; // keep the array form for paths, used in $.fx.step.d
+				params.d = 1; // because in jQuery, animating to an array has a different meaning
+			}
+	
+			$el.stop();
+			if (params.opacity !== UNDEFINED && el.attr) {
+				params.opacity += 'px'; // force jQuery to use same logic as width and height (#2161)
+			}
+			$el.animate(params, options);
+	
+		},
+		/**
+		 * Stop running animation
+		 */
+		stop: function (el) {
+			$(el).stop();
+		}
+	});
+}(win.jQuery));
+
+
+// check for a custom HighchartsAdapter defined prior to this file
+var globalAdapter = win.HighchartsAdapter,
+	adapter = globalAdapter || {};
+	
+// Initialize the adapter
+if (globalAdapter) {
+	globalAdapter.init.call(globalAdapter, pathAnim);
+}
+
+
+// Utility functions. If the HighchartsAdapter is not defined, adapter is an empty object
+// and all the utility functions will be null. In that case they are populated by the
+// default adapters below.
+var adapterRun = adapter.adapterRun,
+	getScript = adapter.getScript,
+	inArray = adapter.inArray,
+	each = adapter.each,
+	grep = adapter.grep,
+	offset = adapter.offset,
+	map = adapter.map,
+	addEvent = adapter.addEvent,
+	removeEvent = adapter.removeEvent,
+	fireEvent = adapter.fireEvent,
+	washMouseEvent = adapter.washMouseEvent,
+	animate = adapter.animate,
+	stop = adapter.stop;
+
+
+
+/* ****************************************************************************
+ * Handle the options                                                         *
+ *****************************************************************************/
+var
+
+defaultLabelOptions = {
+	enabled: true,
+	// rotation: 0,
+	// align: 'center',
+	x: 0,
+	y: 15,
+	/*formatter: function () {
+		return this.value;
+	},*/
+	style: {
+		color: '#606060',
+		cursor: 'default',
+		fontSize: '11px'
+	}
+};
+
+defaultOptions = {
+	colors: ['#7cb5ec', '#434348', '#90ed7d', '#f7a35c', 
+		    '#8085e9', '#f15c80', '#e4d354', '#8085e8', '#8d4653', '#91e8e1'],
+	symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],
+	lang: {
+		loading: 'Loading...',
+		months: ['January', 'February', 'March', 'April', 'May', 'June', 'July',
+				'August', 'September', 'October', 'November', 'December'],
+		shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		decimalPoint: '.',
+		numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels
+		resetZoom: 'Reset zoom',
+		resetZoomTitle: 'Reset zoom level 1:1',
+		thousandsSep: ','
+	},
+	global: {
+		useUTC: true,
+		//timezoneOffset: 0,
+		canvasToolsURL: 'http://code.highcharts.com/4.0.3/modules/canvas-tools.js',
+		VMLRadialGradientURL: 'http://code.highcharts.com/4.0.3/gfx/vml-radial-gradient.png'
+	},
+	chart: {
+		//animation: true,
+		//alignTicks: false,
+		//reflow: true,
+		//className: null,
+		//events: { load, selection },
+		//margin: [null],
+		//marginTop: null,
+		//marginRight: null,
+		//marginBottom: null,
+		//marginLeft: null,
+		borderColor: '#4572A7',
+		//borderWidth: 0,
+		borderRadius: 0,
+		defaultSeriesType: 'line',
+		ignoreHiddenSeries: true,
+		//inverted: false,
+		//shadow: false,
+		spacing: [10, 10, 15, 10],
+		//spacingTop: 10,
+		//spacingRight: 10,
+		//spacingBottom: 15,
+		//spacingLeft: 10,
+		//style: {
+		//	fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif', // default font
+		//	fontSize: '12px'
+		//},
+		backgroundColor: '#FFFFFF',
+		//plotBackgroundColor: null,
+		plotBorderColor: '#C0C0C0',
+		//plotBorderWidth: 0,
+		//plotShadow: false,
+		//zoomType: ''
+		resetZoomButton: {
+			theme: {
+				zIndex: 20
+			},
+			position: {
+				align: 'right',
+				x: -10,
+				//verticalAlign: 'top',
+				y: 10
+			}
+			// relativeTo: 'plot'
+		}
+	},
+	title: {
+		text: 'Chart title',
+		align: 'center',
+		// floating: false,
+		margin: 15,
+		// x: 0,
+		// verticalAlign: 'top',
+		// y: null,
+		style: {
+			color: '#333333',
+			fontSize: '18px'
+		}
+
+	},
+	subtitle: {
+		text: '',
+		align: 'center',
+		// floating: false
+		// x: 0,
+		// verticalAlign: 'top',
+		// y: null,
+		style: {
+			color: '#555555'
+		}
+	},
+
+	plotOptions: {
+		line: { // base series options
+			allowPointSelect: false,
+			showCheckbox: false,
+			animation: {
+				duration: 1000
+			},
+			//connectNulls: false,
+			//cursor: 'default',
+			//clip: true,
+			//dashStyle: null,
+			//enableMouseTracking: true,
+			events: {},
+			//legendIndex: 0,
+			//linecap: 'round',
+			lineWidth: 2,
+			//shadow: false,
+			// stacking: null,
+			marker: {
+				//enabled: true,
+				//symbol: null,
+				lineWidth: 0,
+				radius: 4,
+				lineColor: '#FFFFFF',
+				//fillColor: null,
+				states: { // states for a single point
+					hover: {
+						enabled: true,
+						lineWidthPlus: 1,
+						radiusPlus: 2
+					},
+					select: {
+						fillColor: '#FFFFFF',
+						lineColor: '#000000',
+						lineWidth: 2
+					}
+				}
+			},
+			point: {
+				events: {}
+			},
+			dataLabels: merge(defaultLabelOptions, {
+				align: 'center',
+				//defer: true,
+				enabled: false,
+				formatter: function () {
+					return this.y === null ? '' : numberFormat(this.y, -1);
+				},
+				verticalAlign: 'bottom', // above singular point
+				y: 0
+				// backgroundColor: undefined,
+				// borderColor: undefined,
+				// borderRadius: undefined,
+				// borderWidth: undefined,
+				// padding: 3,
+				// shadow: false
+			}),
+			cropThreshold: 300, // draw points outside the plot area when the number of points is less than this
+			pointRange: 0,
+			//pointStart: 0,
+			//pointInterval: 1,
+			//showInLegend: null, // auto: true for standalone series, false for linked series
+			states: { // states for the entire series
+				hover: {
+					//enabled: false,
+					lineWidthPlus: 1,
+					marker: {
+						// lineWidth: base + 1,
+						// radius: base + 1
+					},
+					halo: {
+						size: 10,
+						opacity: 0.25
+					}
+				},
+				select: {
+					marker: {}
+				}
+			},
+			stickyTracking: true,
+			//tooltip: {
+				//pointFormat: '<span style="color:{series.color}">\u25CF</span> {series.name}: <b>{point.y}</b>'
+				//valueDecimals: null,
+				//xDateFormat: '%A, %b %e, %Y',
+				//valuePrefix: '',
+				//ySuffix: ''				
+			//}
+			turboThreshold: 1000
+			// zIndex: null
+		}
+	},
+	labels: {
+		//items: [],
+		style: {
+			//font: defaultFont,
+			position: ABSOLUTE,
+			color: '#3E576F'
+		}
+	},
+	legend: {
+		enabled: true,
+		align: 'center',
+		//floating: false,
+		layout: 'horizontal',
+		labelFormatter: function () {
+			return this.name;
+		},
+		//borderWidth: 0,
+		borderColor: '#909090',
+		borderRadius: 0,
+		navigation: {
+			// animation: true,
+			activeColor: '#274b6d',
+			// arrowSize: 12
+			inactiveColor: '#CCC'
+			// style: {} // text styles
+		},
+		// margin: 20,
+		// reversed: false,
+		shadow: false,
+		// backgroundColor: null,
+		/*style: {
+			padding: '5px'
+		},*/
+		itemStyle: {			
+			color: '#333333',
+			fontSize: '12px',
+			fontWeight: 'bold'
+		},
+		itemHoverStyle: {
+			//cursor: 'pointer', removed as of #601
+			color: '#000'
+		},
+		itemHiddenStyle: {
+			color: '#CCC'
+		},
+		itemCheckboxStyle: {
+			position: ABSOLUTE,
+			width: '13px', // for IE precision
+			height: '13px'
+		},
+		// itemWidth: undefined,
+		// symbolRadius: 0,
+		// symbolWidth: 16,
+		symbolPadding: 5,
+		verticalAlign: 'bottom',
+		// width: undefined,
+		x: 0,
+		y: 0,
+		title: {
+			//text: null,
+			style: {
+				fontWeight: 'bold'
+			}
+		}			
+	},
+
+	loading: {
+		// hideDuration: 100,
+		labelStyle: {
+			fontWeight: 'bold',
+			position: RELATIVE,
+			top: '45%'
+		},
+		// showDuration: 0,
+		style: {
+			position: ABSOLUTE,
+			backgroundColor: 'white',
+			opacity: 0.5,
+			textAlign: 'center'
+		}
+	},
+
+	tooltip: {
+		enabled: true,
+		animation: hasSVG,
+		//crosshairs: null,
+		backgroundColor: 'rgba(249, 249, 249, .85)',
+		borderWidth: 1,
+		borderRadius: 3,
+		dateTimeLabelFormats: { 
+			millisecond: '%A, %b %e, %H:%M:%S.%L',
+			second: '%A, %b %e, %H:%M:%S',
+			minute: '%A, %b %e, %H:%M',
+			hour: '%A, %b %e, %H:%M',
+			day: '%A, %b %e, %Y',
+			week: 'Week from %A, %b %e, %Y',
+			month: '%B %Y',
+			year: '%Y'
+		},
+		//formatter: defaultFormatter,
+		headerFormat: '<span style="font-size: 10px">{point.key}</span><br/>',
+		pointFormat: '<span style="color:{series.color}">\u25CF</span> {series.name}: <b>{point.y}</b><br/>',
+		shadow: true,
+		//shape: 'callout',
+		//shared: false,
+		snap: isTouchDevice ? 25 : 10,
+		style: {
+			color: '#333333',
+			cursor: 'default',
+			fontSize: '12px',
+			padding: '8px',
+			whiteSpace: 'nowrap'
+		}
+		//xDateFormat: '%A, %b %e, %Y',
+		//valueDecimals: null,
+		//valuePrefix: '',
+		//valueSuffix: ''
+	},
+
+	credits: {
+		enabled: true,
+		text: 'Highcharts.com',
+		href: 'http://www.highcharts.com',
+		position: {
+			align: 'right',
+			x: -10,
+			verticalAlign: 'bottom',
+			y: -5
+		},
+		style: {
+			cursor: 'pointer',
+			color: '#909090',
+			fontSize: '9px'
+		}
+	}
+};
+
+
+
+
+// Series defaults
+var defaultPlotOptions = defaultOptions.plotOptions,
+	defaultSeriesOptions = defaultPlotOptions.line;
+
+// set the default time methods
+setTimeMethods();
+
+
+
+/**
+ * Set the time methods globally based on the useUTC option. Time method can be either
+ * local time or UTC (default).
+ */
+function setTimeMethods() {
+	var useUTC = defaultOptions.global.useUTC,
+		GET = useUTC ? 'getUTC' : 'get',
+		SET = useUTC ? 'setUTC' : 'set';
+
+
+	timezoneOffset = ((useUTC && defaultOptions.global.timezoneOffset) || 0) * 60000;
+	makeTime = useUTC ? Date.UTC : function (year, month, date, hours, minutes, seconds) {
+		return new Date(
+			year,
+			month,
+			pick(date, 1),
+			pick(hours, 0),
+			pick(minutes, 0),
+			pick(seconds, 0)
+		).getTime();
+	};
+	getMinutes =  GET + 'Minutes';
+	getHours =    GET + 'Hours';
+	getDay =      GET + 'Day';
+	getDate =     GET + 'Date';
+	getMonth =    GET + 'Month';
+	getFullYear = GET + 'FullYear';
+	setMinutes =  SET + 'Minutes';
+	setHours =    SET + 'Hours';
+	setDate =     SET + 'Date';
+	setMonth =    SET + 'Month';
+	setFullYear = SET + 'FullYear';
+
+}
+
+/**
+ * Merge the default options with custom options and return the new options structure
+ * @param {Object} options The new custom options
+ */
+function setOptions(options) {
+	
+	// Copy in the default options
+	defaultOptions = merge(true, defaultOptions, options);
+	
+	// Apply UTC
+	setTimeMethods();
+
+	return defaultOptions;
+}
+
+/**
+ * Get the updated default options. Until 3.0.7, merely exposing defaultOptions for outside modules
+ * wasn't enough because the setOptions method created a new object.
+ */
+function getOptions() {
+	return defaultOptions;
+}
+
+
+/**
+ * Handle color operations. The object methods are chainable.
+ * @param {String} input The input color in either rbga or hex format
+ */
+var rgbaRegEx = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,
+	hexRegEx = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,
+	rgbRegEx = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/;
+
+var Color = function (input) {
+	// declare variables
+	var rgba = [], result, stops;
+
+	/**
+	 * Parse the input color to rgba array
+	 * @param {String} input
+	 */
+	function init(input) {
+
+		// Gradients
+		if (input && input.stops) {
+			stops = map(input.stops, function (stop) {
+				return Color(stop[1]);
+			});
+
+		// Solid colors
+		} else {
+			// rgba
+			result = rgbaRegEx.exec(input);
+			if (result) {
+				rgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];
+			} else { 
+				// hex
+				result = hexRegEx.exec(input);
+				if (result) {
+					rgba = [pInt(result[1], 16), pInt(result[2], 16), pInt(result[3], 16), 1];
+				} else {
+					// rgb
+					result = rgbRegEx.exec(input);
+					if (result) {
+						rgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];
+					}
+				}
+			}
+		}		
+
+	}
+	/**
+	 * Return the color a specified format
+	 * @param {String} format
+	 */
+	function get(format) {
+		var ret;
+
+		if (stops) {
+			ret = merge(input);
+			ret.stops = [].concat(ret.stops);
+			each(stops, function (stop, i) {
+				ret.stops[i] = [ret.stops[i][0], stop.get(format)];
+			});
+
+		// it's NaN if gradient colors on a column chart
+		} else if (rgba && !isNaN(rgba[0])) {
+			if (format === 'rgb') {
+				ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';
+			} else if (format === 'a') {
+				ret = rgba[3];
+			} else {
+				ret = 'rgba(' + rgba.join(',') + ')';
+			}
+		} else {
+			ret = input;
+		}
+		return ret;
+	}
+
+	/**
+	 * Brighten the color
+	 * @param {Number} alpha
+	 */
+	function brighten(alpha) {
+		if (stops) {
+			each(stops, function (stop) {
+				stop.brighten(alpha);
+			});
+		
+		} else if (isNumber(alpha) && alpha !== 0) {
+			var i;
+			for (i = 0; i < 3; i++) {
+				rgba[i] += pInt(alpha * 255);
+
+				if (rgba[i] < 0) {
+					rgba[i] = 0;
+				}
+				if (rgba[i] > 255) {
+					rgba[i] = 255;
+				}
+			}
+		}
+		return this;
+	}
+	/**
+	 * Set the color's opacity to a given alpha value
+	 * @param {Number} alpha
+	 */
+	function setOpacity(alpha) {
+		rgba[3] = alpha;
+		return this;
+	}
+
+	// initialize: parse the input
+	init(input);
+
+	// public methods
+	return {
+		get: get,
+		brighten: brighten,
+		rgba: rgba,
+		setOpacity: setOpacity
+	};
+};
+
+
+/**
+ * A wrapper object for SVG elements
+ */
+function SVGElement() {}
+
+SVGElement.prototype = {
+	
+	// Default base for animation
+	opacity: 1,
+	// For labels, these CSS properties are applied to the <text> node directly
+	textProps: ['fontSize', 'fontWeight', 'fontFamily', 'color', 
+		'lineHeight', 'width', 'textDecoration', 'textShadow', 'HcTextStroke'],
+	
+	/**
+	 * Initialize the SVG renderer
+	 * @param {Object} renderer
+	 * @param {String} nodeName
+	 */
+	init: function (renderer, nodeName) {
+		var wrapper = this;
+		wrapper.element = nodeName === 'span' ?
+			createElement(nodeName) :
+			doc.createElementNS(SVG_NS, nodeName);
+		wrapper.renderer = renderer;
+	},
+	
+	/**
+	 * Animate a given attribute
+	 * @param {Object} params
+	 * @param {Number} options The same options as in jQuery animation
+	 * @param {Function} complete Function to perform at the end of animation
+	 */
+	animate: function (params, options, complete) {
+		var animOptions = pick(options, globalAnimation, true);
+		stop(this); // stop regardless of animation actually running, or reverting to .attr (#607)
+		if (animOptions) {
+			animOptions = merge(animOptions, {}); //#2625
+			if (complete) { // allows using a callback with the global animation without overwriting it
+				animOptions.complete = complete;
+			}
+			animate(this, params, animOptions);
+		} else {
+			this.attr(params);
+			if (complete) {
+				complete();
+			}
+		}
+		return this;
+	},
+
+	/**
+	 * Build an SVG gradient out of a common JavaScript configuration object
+	 */
+	colorGradient: function (color, prop, elem) {
+		var renderer = this.renderer,
+			colorObject,
+			gradName,
+			gradAttr,
+			gradients,
+			gradientObject,
+			stops,
+			stopColor,
+			stopOpacity,
+			radialReference,
+			n,
+			id,
+			key = [];
+
+		// Apply linear or radial gradients
+		if (color.linearGradient) {
+			gradName = 'linearGradient';
+		} else if (color.radialGradient) {
+			gradName = 'radialGradient';
+		}
+
+		if (gradName) {
+			gradAttr = color[gradName];
+			gradients = renderer.gradients;
+			stops = color.stops;
+			radialReference = elem.radialReference;
+
+			// Keep < 2.2 kompatibility
+			if (isArray(gradAttr)) {
+				color[gradName] = gradAttr = {
+					x1: gradAttr[0],
+					y1: gradAttr[1],
+					x2: gradAttr[2],
+					y2: gradAttr[3],
+					gradientUnits: 'userSpaceOnUse'
+				};
+			}
+
+			// Correct the radial gradient for the radial reference system
+			if (gradName === 'radialGradient' && radialReference && !defined(gradAttr.gradientUnits)) {
+				gradAttr = merge(gradAttr, {
+					cx: (radialReference[0] - radialReference[2] / 2) + gradAttr.cx * radialReference[2],
+					cy: (radialReference[1] - radialReference[2] / 2) + gradAttr.cy * radialReference[2],
+					r: gradAttr.r * radialReference[2],
+					gradientUnits: 'userSpaceOnUse'
+				});
+			}
+
+			// Build the unique key to detect whether we need to create a new element (#1282)
+			for (n in gradAttr) {
+				if (n !== 'id') {
+					key.push(n, gradAttr[n]);
+				}
+			}
+			for (n in stops) {
+				key.push(stops[n]);
+			}
+			key = key.join(',');
+
+			// Check if a gradient object with the same config object is created within this renderer
+			if (gradients[key]) {
+				id = gradients[key].attr('id');
+
+			} else {
+
+				// Set the id and create the element
+				gradAttr.id = id = PREFIX + idCounter++;
+				gradients[key] = gradientObject = renderer.createElement(gradName)
+					.attr(gradAttr)
+					.add(renderer.defs);
+
+
+				// The gradient needs to keep a list of stops to be able to destroy them
+				gradientObject.stops = [];
+				each(stops, function (stop) {
+					var stopObject;
+					if (stop[1].indexOf('rgba') === 0) {
+						colorObject = Color(stop[1]);
+						stopColor = colorObject.get('rgb');
+						stopOpacity = colorObject.get('a');
+					} else {
+						stopColor = stop[1];
+						stopOpacity = 1;
+					}
+					stopObject = renderer.createElement('stop').attr({
+						offset: stop[0],
+						'stop-color': stopColor,
+						'stop-opacity': stopOpacity
+					}).add(gradientObject);
+
+					// Add the stop element to the gradient
+					gradientObject.stops.push(stopObject);
+				});
+			}
+
+			// Set the reference to the gradient object
+			elem.setAttribute(prop, 'url(' + renderer.url + '#' + id + ')');
+		} 
+	},
+
+	/**
+	 * Set or get a given attribute
+	 * @param {Object|String} hash
+	 * @param {Mixed|Undefined} val
+	 */
+	attr: function (hash, val) {
+		var key,
+			value,
+			element = this.element,
+			hasSetSymbolSize,
+			ret = this,
+			skipAttr;
+
+		// single key-value pair
+		if (typeof hash === 'string' && val !== UNDEFINED) {
+			key = hash;
+			hash = {};
+			hash[key] = val;
+		}
+
+		// used as a getter: first argument is a string, second is undefined
+		if (typeof hash === 'string') {
+			ret = (this[hash + 'Getter'] || this._defaultGetter).call(this, hash, element);
+		
+		// setter
+		} else {
+
+			for (key in hash) {
+				value = hash[key];
+				skipAttr = false;
+
+
+
+				if (this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(key)) {
+					if (!hasSetSymbolSize) {
+						this.symbolAttr(hash);
+						hasSetSymbolSize = true;
+					}
+					skipAttr = true;
+				}
+
+				if (this.rotation && (key === 'x' || key === 'y')) {
+					this.doTransform = true;
+				}
+				
+				if (!skipAttr) {
+					(this[key + 'Setter'] || this._defaultSetter).call(this, value, key, element);
+				}
+
+				// Let the shadow follow the main element
+				if (this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {
+					this.updateShadows(key, value);
+				}
+			}
+
+			// Update transform. Do this outside the loop to prevent redundant updating for batch setting
+			// of attributes.
+			if (this.doTransform) {
+				this.updateTransform();
+				this.doTransform = false;
+			}
+
+		}
+
+		return ret;
+	},
+
+	updateShadows: function (key, value) {
+		var shadows = this.shadows,
+			i = shadows.length;
+		while (i--) {
+			shadows[i].setAttribute(
+				key,
+				key === 'height' ?
+					mathMax(value - (shadows[i].cutHeight || 0), 0) :
+					key === 'd' ? this.d : value
+			);
+		}
+	},
+
+	/**
+	 * Add a class name to an element
+	 */
+	addClass: function (className) {
+		var element = this.element,
+			currentClassName = attr(element, 'class') || '';
+
+		if (currentClassName.indexOf(className) === -1) {
+			attr(element, 'class', currentClassName + ' ' + className);
+		}
+		return this;
+	},
+	/* hasClass and removeClass are not (yet) needed
+	hasClass: function (className) {
+		return attr(this.element, 'class').indexOf(className) !== -1;
+	},
+	removeClass: function (className) {
+		attr(this.element, 'class', attr(this.element, 'class').replace(className, ''));
+		return this;
+	},
+	*/
+
+	/**
+	 * If one of the symbol size affecting parameters are changed,
+	 * check all the others only once for each call to an element's
+	 * .attr() method
+	 * @param {Object} hash
+	 */
+	symbolAttr: function (hash) {
+		var wrapper = this;
+
+		each(['x', 'y', 'r', 'start', 'end', 'width', 'height', 'innerR', 'anchorX', 'anchorY'], function (key) {
+			wrapper[key] = pick(hash[key], wrapper[key]);
+		});
+
+		wrapper.attr({
+			d: wrapper.renderer.symbols[wrapper.symbolName](
+				wrapper.x,
+				wrapper.y,
+				wrapper.width,
+				wrapper.height,
+				wrapper
+			)
+		});
+	},
+
+	/**
+	 * Apply a clipping path to this object
+	 * @param {String} id
+	 */
+	clip: function (clipRect) {
+		return this.attr('clip-path', clipRect ? 'url(' + this.renderer.url + '#' + clipRect.id + ')' : NONE);
+	},
+
+	/**
+	 * Calculate the coordinates needed for drawing a rectangle crisply and return the
+	 * calculated attributes
+	 * @param {Number} strokeWidth
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	crisp: function (rect) {
+
+		var wrapper = this,
+			key,
+			attribs = {},
+			normalizer,
+			strokeWidth = rect.strokeWidth || wrapper.strokeWidth || 0;
+
+		normalizer = mathRound(strokeWidth) % 2 / 2; // mathRound because strokeWidth can sometimes have roundoff errors
+
+		// normalize for crisp edges
+		rect.x = mathFloor(rect.x || wrapper.x || 0) + normalizer;
+		rect.y = mathFloor(rect.y || wrapper.y || 0) + normalizer;
+		rect.width = mathFloor((rect.width || wrapper.width || 0) - 2 * normalizer);
+		rect.height = mathFloor((rect.height || wrapper.height || 0) - 2 * normalizer);
+		rect.strokeWidth = strokeWidth;
+
+		for (key in rect) {
+			if (wrapper[key] !== rect[key]) { // only set attribute if changed
+				wrapper[key] = attribs[key] = rect[key];
+			}
+		}
+
+		return attribs;
+	},
+
+	/**
+	 * Set styles for the element
+	 * @param {Object} styles
+	 */
+	css: function (styles) {
+		var elemWrapper = this,
+			oldStyles = elemWrapper.styles,
+			newStyles = {},
+			elem = elemWrapper.element,
+			textWidth,
+			n,
+			serializedCss = '',
+			hyphenate,
+			hasNew = !oldStyles;
+
+		// convert legacy
+		if (styles && styles.color) {
+			styles.fill = styles.color;
+		}
+
+		// Filter out existing styles to increase performance (#2640)
+		if (oldStyles) {
+			for (n in styles) {
+				if (styles[n] !== oldStyles[n]) {
+					newStyles[n] = styles[n];
+					hasNew = true;
+				}
+			}
+		}
+		if (hasNew) {
+			textWidth = elemWrapper.textWidth = styles && styles.width && elem.nodeName.toLowerCase() === 'text' && pInt(styles.width);
+
+			// Merge the new styles with the old ones
+			if (oldStyles) {
+				styles = extend(
+					oldStyles,
+					newStyles
+				);
+			}		
+
+			// store object
+			elemWrapper.styles = styles;
+
+			if (textWidth && (useCanVG || (!hasSVG && elemWrapper.renderer.forExport))) {
+				delete styles.width;
+			}
+
+			// serialize and set style attribute
+			if (isIE && !hasSVG) {
+				css(elemWrapper.element, styles);
+			} else {
+				/*jslint unparam: true*/
+				hyphenate = function (a, b) { return '-' + b.toLowerCase(); };
+				/*jslint unparam: false*/
+				for (n in styles) {
+					serializedCss += n.replace(/([A-Z])/g, hyphenate) + ':' + styles[n] + ';';
+				}
+				attr(elem, 'style', serializedCss); // #1881
+			}
+
+
+			// re-build text
+			if (textWidth && elemWrapper.added) {
+				elemWrapper.renderer.buildText(elemWrapper);
+			}
+		}
+
+		return elemWrapper;
+	},
+
+	/**
+	 * Add an event listener
+	 * @param {String} eventType
+	 * @param {Function} handler
+	 */
+	on: function (eventType, handler) {
+		var svgElement = this,
+			element = svgElement.element;
+		
+		// touch
+		if (hasTouch && eventType === 'click') {
+			element.ontouchstart = function (e) {			
+				svgElement.touchEventFired = Date.now();				
+				e.preventDefault();
+				handler.call(element, e);
+			};
+			element.onclick = function (e) {												
+				if (userAgent.indexOf('Android') === -1 || Date.now() - (svgElement.touchEventFired || 0) > 1100) { // #2269
+					handler.call(element, e);
+				}
+			};			
+		} else {
+			// simplest possible event model for internal use
+			element['on' + eventType] = handler;
+		}
+		return this;
+	},
+
+	/**
+	 * Set the coordinates needed to draw a consistent radial gradient across
+	 * pie slices regardless of positioning inside the chart. The format is
+	 * [centerX, centerY, diameter] in pixels.
+	 */
+	setRadialReference: function (coordinates) {
+		this.element.radialReference = coordinates;
+		return this;
+	},
+
+	/**
+	 * Move an object and its children by x and y values
+	 * @param {Number} x
+	 * @param {Number} y
+	 */
+	translate: function (x, y) {
+		return this.attr({
+			translateX: x,
+			translateY: y
+		});
+	},
+
+	/**
+	 * Invert a group, rotate and flip
+	 */
+	invert: function () {
+		var wrapper = this;
+		wrapper.inverted = true;
+		wrapper.updateTransform();
+		return wrapper;
+	},
+
+	/**
+	 * Private method to update the transform attribute based on internal
+	 * properties
+	 */
+	updateTransform: function () {
+		var wrapper = this,
+			translateX = wrapper.translateX || 0,
+			translateY = wrapper.translateY || 0,
+			scaleX = wrapper.scaleX,
+			scaleY = wrapper.scaleY,
+			inverted = wrapper.inverted,
+			rotation = wrapper.rotation,
+			element = wrapper.element,
+			transform;
+
+		// flipping affects translate as adjustment for flipping around the group's axis
+		if (inverted) {
+			translateX += wrapper.attr('width');
+			translateY += wrapper.attr('height');
+		}
+
+		// Apply translate. Nearly all transformed elements have translation, so instead
+		// of checking for translate = 0, do it always (#1767, #1846).
+		transform = ['translate(' + translateX + ',' + translateY + ')'];
+
+		// apply rotation
+		if (inverted) {
+			transform.push('rotate(90) scale(-1,1)');
+		} else if (rotation) { // text rotation
+			transform.push('rotate(' + rotation + ' ' + (element.getAttribute('x') || 0) + ' ' + (element.getAttribute('y') || 0) + ')');
+		}
+
+		// apply scale
+		if (defined(scaleX) || defined(scaleY)) {
+			transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');
+		}
+
+		if (transform.length) {
+			element.setAttribute('transform', transform.join(' '));
+		}
+	},
+	/**
+	 * Bring the element to the front
+	 */
+	toFront: function () {
+		var element = this.element;
+		element.parentNode.appendChild(element);
+		return this;
+	},
+
+
+	/**
+	 * Break down alignment options like align, verticalAlign, x and y
+	 * to x and y relative to the chart.
+	 *
+	 * @param {Object} alignOptions
+	 * @param {Boolean} alignByTranslate
+	 * @param {String[Object} box The box to align to, needs a width and height. When the
+	 *        box is a string, it refers to an object in the Renderer. For example, when
+	 *        box is 'spacingBox', it refers to Renderer.spacingBox which holds width, height
+	 *        x and y properties.
+	 *
+	 */
+	align: function (alignOptions, alignByTranslate, box) {
+		var align,
+			vAlign,
+			x,
+			y,
+			attribs = {},
+			alignTo,
+			renderer = this.renderer,
+			alignedObjects = renderer.alignedObjects;
+
+		// First call on instanciate
+		if (alignOptions) {
+			this.alignOptions = alignOptions;
+			this.alignByTranslate = alignByTranslate;
+			if (!box || isString(box)) { // boxes other than renderer handle this internally
+				this.alignTo = alignTo = box || 'renderer';
+				erase(alignedObjects, this); // prevent duplicates, like legendGroup after resize
+				alignedObjects.push(this);
+				box = null; // reassign it below
+			}
+
+		// When called on resize, no arguments are supplied
+		} else {
+			alignOptions = this.alignOptions;
+			alignByTranslate = this.alignByTranslate;
+			alignTo = this.alignTo;
+		}
+
+		box = pick(box, renderer[alignTo], renderer);
+
+		// Assign variables
+		align = alignOptions.align;
+		vAlign = alignOptions.verticalAlign;
+		x = (box.x || 0) + (alignOptions.x || 0); // default: left align
+		y = (box.y || 0) + (alignOptions.y || 0); // default: top align
+
+		// Align
+		if (align === 'right' || align === 'center') {
+			x += (box.width - (alignOptions.width || 0)) /
+					{ right: 1, center: 2 }[align];
+		}
+		attribs[alignByTranslate ? 'translateX' : 'x'] = mathRound(x);
+
+
+		// Vertical align
+		if (vAlign === 'bottom' || vAlign === 'middle') {
+			y += (box.height - (alignOptions.height || 0)) /
+					({ bottom: 1, middle: 2 }[vAlign] || 1);
+
+		}
+		attribs[alignByTranslate ? 'translateY' : 'y'] = mathRound(y);
+
+		// Animate only if already placed
+		this[this.placed ? 'animate' : 'attr'](attribs);
+		this.placed = true;
+		this.alignAttr = attribs;
+
+		return this;
+	},
+
+	/**
+	 * Get the bounding box (width, height, x and y) for the element
+	 */
+	getBBox: function () {
+		var wrapper = this,
+			bBox = wrapper.bBox,
+			renderer = wrapper.renderer,
+			width,
+			height,
+			rotation = wrapper.rotation,
+			element = wrapper.element,
+			styles = wrapper.styles,
+			rad = rotation * deg2rad,
+			textStr = wrapper.textStr,
+			cacheKey;
+
+		// Since numbers are monospaced, and numerical labels appear a lot in a chart,
+		// we assume that a label of n characters has the same bounding box as others 
+		// of the same length.
+		if (textStr === '' || numRegex.test(textStr)) {
+			cacheKey = 'num.' + textStr.toString().length + (styles ? ('|' + styles.fontSize + '|' + styles.fontFamily) : '');
+
+		} //else { // This code block made demo/waterfall fail, related to buildText
+			// Caching all strings reduces rendering time by 4-5%. 
+			// : Check how this affects places where bBox is found on the element
+			//cacheKey = textStr + (styles ? ('|' + styles.fontSize + '|' + styles.fontFamily) : '');
+		//}
+		if (cacheKey) {
+			bBox = renderer.cache[cacheKey];
+		}
+
+		// No cache found
+		if (!bBox) {
+
+			// SVG elements
+			if (element.namespaceURI === SVG_NS || renderer.forExport) {
+				try { // Fails in Firefox if the container has display: none.
+
+					bBox = element.getBBox ?
+						// SVG: use extend because IE9 is not allowed to change width and height in case
+						// of rotation (below)
+						extend({}, element.getBBox()) :
+						// Canvas renderer and legacy IE in export mode
+						{
+							width: element.offsetWidth,
+							height: element.offsetHeight
+						};
+				} catch (e) {}
+
+				// If the bBox is not set, the try-catch block above failed. The other condition
+				// is for Opera that returns a width of -Infinity on hidden elements.
+				if (!bBox || bBox.width < 0) {
+					bBox = { width: 0, height: 0 };
+				}
+
+
+			// VML Renderer or useHTML within SVG
+			} else {
+
+				bBox = wrapper.htmlGetBBox();
+
+			}
+
+			// True SVG elements as well as HTML elements in modern browsers using the .useHTML option
+			// need to compensated for rotation
+			if (renderer.isSVG) {
+				width = bBox.width;
+				height = bBox.height;
+
+				// Workaround for wrong bounding box in IE9 and IE10 (#1101, #1505, #1669, #2568)
+				if (isIE && styles && styles.fontSize === '11px' && height.toPrecision(3) === '16.9') {
+					bBox.height = height = 14;
+				}
+
+				// Adjust for rotated text
+				if (rotation) {
+					bBox.width = mathAbs(height * mathSin(rad)) + mathAbs(width * mathCos(rad));
+					bBox.height = mathAbs(height * mathCos(rad)) + mathAbs(width * mathSin(rad));
+				}
+			}
+
+			// Cache it
+			wrapper.bBox = bBox;
+			if (cacheKey) {
+				renderer.cache[cacheKey] = bBox;
+			}
+		}
+		return bBox;
+	},
+
+	/**
+	 * Show the element
+	 */
+	show: function (inherit) {
+		// IE9-11 doesn't handle visibilty:inherit well, so we remove the attribute instead (#2881)
+		if (inherit && this.element.namespaceURI === SVG_NS) {
+			this.element.removeAttribute('visibility');
+			return this;
+		} else {
+			return this.attr({ visibility: inherit ? 'inherit' : VISIBLE });
+		}
+	},
+
+	/**
+	 * Hide the element
+	 */
+	hide: function () {
+		return this.attr({ visibility: HIDDEN });
+	},
+
+	fadeOut: function (duration) {
+		var elemWrapper = this;
+		elemWrapper.animate({
+			opacity: 0
+		}, {
+			duration: duration || 150,
+			complete: function () {
+				elemWrapper.hide();
+			}
+		});
+	},
+
+	/**
+	 * Add the element
+	 * @param {Object|Undefined} parent Can be an element, an element wrapper or undefined
+	 *    to append the element to the renderer.box.
+	 */
+	add: function (parent) {
+
+		var renderer = this.renderer,
+			parentWrapper = parent || renderer,
+			parentNode = parentWrapper.element || renderer.box,
+			childNodes,
+			element = this.element,
+			zIndex = this.zIndex,
+			otherElement,
+			otherZIndex,
+			i,
+			inserted;
+
+		if (parent) {
+			this.parentGroup = parent;
+		}
+
+		// mark as inverted
+		this.parentInverted = parent && parent.inverted;
+
+		// build formatted text
+		if (this.textStr !== undefined) {
+			renderer.buildText(this);
+		}
+
+		// mark the container as having z indexed children
+		if (zIndex) {
+			parentWrapper.handleZ = true;
+			zIndex = pInt(zIndex);
+		}
+
+		// insert according to this and other elements' zIndex
+		if (parentWrapper.handleZ) { // this element or any of its siblings has a z index
+			childNodes = parentNode.childNodes;
+			for (i = 0; i < childNodes.length; i++) {
+				otherElement = childNodes[i];
+				otherZIndex = attr(otherElement, 'zIndex');
+				if (otherElement !== element && (
+						// insert before the first element with a higher zIndex
+						pInt(otherZIndex) > zIndex ||
+						// if no zIndex given, insert before the first element with a zIndex
+						(!defined(zIndex) && defined(otherZIndex))
+
+						)) {
+					parentNode.insertBefore(element, otherElement);
+					inserted = true;
+					break;
+				}
+			}
+		}
+
+		// default: append at the end
+		if (!inserted) {
+			parentNode.appendChild(element);
+		}
+
+		// mark as added
+		this.added = true;
+
+		// fire an event for internal hooks
+		if (this.onAdd) {
+			this.onAdd();
+		}
+
+		return this;
+	},
+
+	/**
+	 * Removes a child either by removeChild or move to garbageBin.
+	 * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.
+	 */
+	safeRemoveChild: function (element) {
+		var parentNode = element.parentNode;
+		if (parentNode) {
+			parentNode.removeChild(element);
+		}
+	},
+
+	/**
+	 * Destroy the element and element wrapper
+	 */
+	destroy: function () {
+		var wrapper = this,
+			element = wrapper.element || {},
+			shadows = wrapper.shadows,
+			parentToClean = wrapper.renderer.isSVG && element.nodeName === 'SPAN' && wrapper.parentGroup,
+			grandParent,
+			key,
+			i;
+
+		// remove events
+		element.onclick = element.onmouseout = element.onmouseover = element.onmousemove = element.point = null;
+		stop(wrapper); // stop running animations
+
+		if (wrapper.clipPath) {
+			wrapper.clipPath = wrapper.clipPath.destroy();
+		}
+
+		// Destroy stops in case this is a gradient object
+		if (wrapper.stops) {
+			for (i = 0; i < wrapper.stops.length; i++) {
+				wrapper.stops[i] = wrapper.stops[i].destroy();
+			}
+			wrapper.stops = null;
+		}
+
+		// remove element
+		wrapper.safeRemoveChild(element);
+
+		// destroy shadows
+		if (shadows) {
+			each(shadows, function (shadow) {
+				wrapper.safeRemoveChild(shadow);
+			});
+		}
+
+		// In case of useHTML, clean up empty containers emulating SVG groups (#1960, #2393, #2697).
+		while (parentToClean && parentToClean.div && parentToClean.div.childNodes.length === 0) {
+			grandParent = parentToClean.parentGroup;
+			wrapper.safeRemoveChild(parentToClean.div);
+			delete parentToClean.div;
+			parentToClean = grandParent;
+		}
+
+		// remove from alignObjects
+		if (wrapper.alignTo) {
+			erase(wrapper.renderer.alignedObjects, wrapper);
+		}
+
+		for (key in wrapper) {
+			delete wrapper[key];
+		}
+
+		return null;
+	},
+
+	/**
+	 * Add a shadow to the element. Must be done after the element is added to the DOM
+	 * @param {Boolean|Object} shadowOptions
+	 */
+	shadow: function (shadowOptions, group, cutOff) {
+		var shadows = [],
+			i,
+			shadow,
+			element = this.element,
+			strokeWidth,
+			shadowWidth,
+			shadowElementOpacity,
+
+			// compensate for inverted plot area
+			transform;
+
+
+		if (shadowOptions) {
+			shadowWidth = pick(shadowOptions.width, 3);
+			shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;
+			transform = this.parentInverted ?
+				'(-1,-1)' :
+				'(' + pick(shadowOptions.offsetX, 1) + ', ' + pick(shadowOptions.offsetY, 1) + ')';
+			for (i = 1; i <= shadowWidth; i++) {
+				shadow = element.cloneNode(0);
+				strokeWidth = (shadowWidth * 2) + 1 - (2 * i);
+				attr(shadow, {
+					'isShadow': 'true',
+					'stroke': shadowOptions.color || 'black',
+					'stroke-opacity': shadowElementOpacity * i,
+					'stroke-width': strokeWidth,
+					'transform': 'translate' + transform,
+					'fill': NONE
+				});
+				if (cutOff) {
+					attr(shadow, 'height', mathMax(attr(shadow, 'height') - strokeWidth, 0));
+					shadow.cutHeight = strokeWidth;
+				}
+
+				if (group) {
+					group.element.appendChild(shadow);
+				} else {
+					element.parentNode.insertBefore(shadow, element);
+				}
+
+				shadows.push(shadow);
+			}
+
+			this.shadows = shadows;
+		}
+		return this;
+
+	},
+
+	xGetter: function (key) {
+		if (this.element.nodeName === 'circle') {
+			key = { x: 'cx', y: 'cy' }[key] || key;
+		}
+		return this._defaultGetter(key);
+	},
+
+	/** 
+	 * Get the current value of an attribute or pseudo attribute, used mainly
+	 * for animation.
+	 */
+	_defaultGetter: function (key) {
+		var ret = pick(this[key], this.element ? this.element.getAttribute(key) : null, 0);
+
+		if (/^[\-0-9\.]+$/.test(ret)) { // is numerical
+			ret = parseFloat(ret);
+		}
+		return ret;
+	},
+
+
+	dSetter: function (value, key, element) {
+		if (value && value.join) { // join path
+			value = value.join(' ');
+		}
+		if (/(NaN| {2}|^$)/.test(value)) {
+			value = 'M 0 0';
+		}
+		element.setAttribute(key, value);
+
+		this[key] = value;
+	},
+	dashstyleSetter: function (value) {
+		var i;
+		value = value && value.toLowerCase();
+		if (value) {
+			value = value
+				.replace('shortdashdotdot', '3,1,1,1,1,1,')
+				.replace('shortdashdot', '3,1,1,1')
+				.replace('shortdot', '1,1,')
+				.replace('shortdash', '3,1,')
+				.replace('longdash', '8,3,')
+				.replace(/dot/g, '1,3,')
+				.replace('dash', '4,3,')
+				.replace(/,$/, '')
+				.replace('solid', 1)
+				.split(','); // ending comma
+
+			i = value.length;
+			while (i--) {
+				value[i] = pInt(value[i]) * this['stroke-width'];
+			}
+			value = value.join(',');
+			this.element.setAttribute('stroke-dasharray', value);
+		}
+	},
+	alignSetter: function (value) {
+		this.element.setAttribute('text-anchor', { left: 'start', center: 'middle', right: 'end' }[value]);
+	},
+	opacitySetter: function (value, key, element) {
+		this[key] = value;
+		element.setAttribute(key, value);
+	},
+	titleSetter: function (value) {
+		var titleNode = this.element.getElementsByTagName('title')[0];
+		if (!titleNode) {
+			titleNode = doc.createElementNS(SVG_NS, 'title');
+			this.element.appendChild(titleNode);
+		}
+		titleNode.textContent = value;
+	},
+	textSetter: function (value) {
+		if (value !== this.textStr) {
+			// Delete bBox memo when the text changes
+			delete this.bBox;
+		
+			this.textStr = value;
+			if (this.added) {
+				this.renderer.buildText(this);
+			}
+		}
+	},
+	fillSetter: function (value, key, element) {
+		if (typeof value === 'string') {
+			element.setAttribute(key, value);
+		} else if (value) {
+			this.colorGradient(value, key, element);
+		}
+	},
+	zIndexSetter: function (value, key, element) {
+		element.setAttribute(key, value);
+		this[key] = value;
+	},
+	_defaultSetter: function (value, key, element) {
+		element.setAttribute(key, value);
+	}
+};
+
+// Some shared setters and getters
+SVGElement.prototype.yGetter = SVGElement.prototype.xGetter;
+SVGElement.prototype.translateXSetter = SVGElement.prototype.translateYSetter = 
+		SVGElement.prototype.rotationSetter = SVGElement.prototype.verticalAlignSetter = 
+		SVGElement.prototype.scaleXSetter = SVGElement.prototype.scaleYSetter = function (value, key) {
+	this[key] = value;
+	this.doTransform = true;
+};
+
+// WebKit and Batik have problems with a stroke-width of zero, so in this case we remove the 
+// stroke attribute altogether. #1270, #1369, #3065, #3072.
+SVGElement.prototype['stroke-widthSetter'] = SVGElement.prototype.strokeSetter = function (value, key, element) {
+	this[key] = value;
+	// Only apply the stroke attribute if the stroke width is defined and larger than 0
+	if (this.stroke && this['stroke-width']) {
+		this.strokeWidth = this['stroke-width'];
+		SVGElement.prototype.fillSetter.call(this, this.stroke, 'stroke', element); // use prototype as instance may be overridden
+		element.setAttribute('stroke-width', this['stroke-width']);
+		this.hasStroke = true;
+	} else if (key === 'stroke-width' && value === 0 && this.hasStroke) {
+		element.removeAttribute('stroke');
+		this.hasStroke = false;
+	}
+};
+
+
+/**
+ * The default SVG renderer
+ */
+var SVGRenderer = function () {
+	this.init.apply(this, arguments);
+};
+SVGRenderer.prototype = {
+	Element: SVGElement,
+
+	/**
+	 * Initialize the SVGRenderer
+	 * @param {Object} container
+	 * @param {Number} width
+	 * @param {Number} height
+	 * @param {Boolean} forExport
+	 */
+	init: function (container, width, height, style, forExport) {
+		var renderer = this,
+			loc = location,
+			boxWrapper,
+			element,
+			desc;
+
+		boxWrapper = renderer.createElement('svg')
+			.attr({
+				version: '1.1'
+			})
+			.css(this.getStyle(style));
+		element = boxWrapper.element;
+		container.appendChild(element);
+
+		// For browsers other than IE, add the namespace attribute (#1978)
+		if (container.innerHTML.indexOf('xmlns') === -1) {
+			attr(element, 'xmlns', SVG_NS);
+		}
+
+		// object properties
+		renderer.isSVG = true;
+		renderer.box = element;
+		renderer.boxWrapper = boxWrapper;
+		renderer.alignedObjects = [];
+
+		// Page url used for internal references. #24, #672, #1070
+		renderer.url = (isFirefox || isWebKit) && doc.getElementsByTagName('base').length ?
+			loc.href
+				.replace(/#.*?$/, '') // remove the hash
+				.replace(/([\('\)])/g, '\\$1') // escape parantheses and quotes
+				.replace(/ /g, '%20') : // replace spaces (needed for Safari only)
+			'';
+
+		// Add description
+		desc = this.createElement('desc').add();
+		desc.element.appendChild(doc.createTextNode('Created with ' + PRODUCT + ' ' + VERSION));
+
+
+		renderer.defs = this.createElement('defs').add();
+		renderer.forExport = forExport;
+		renderer.gradients = {}; // Object where gradient SvgElements are stored
+		renderer.cache = {}; // Cache for numerical bounding boxes
+
+		renderer.setSize(width, height, false);
+
+
+
+		// Issue 110 workaround:
+		// In Firefox, if a div is positioned by percentage, its pixel position may land
+		// between pixels. The container itself doesn't display this, but an SVG element
+		// inside this container will be drawn at subpixel precision. In order to draw
+		// sharp lines, this must be compensated for. This doesn't seem to work inside
+		// iframes though (like in jsFiddle).
+		var subPixelFix, rect;
+		if (isFirefox && container.getBoundingClientRect) {
+			renderer.subPixelFix = subPixelFix = function () {
+				css(container, { left: 0, top: 0 });
+				rect = container.getBoundingClientRect();
+				css(container, {
+					left: (mathCeil(rect.left) - rect.left) + PX,
+					top: (mathCeil(rect.top) - rect.top) + PX
+				});
+			};
+
+			// run the fix now
+			subPixelFix();
+
+			// run it on resize
+			addEvent(win, 'resize', subPixelFix);
+		}
+	},
+
+	getStyle: function (style) {
+		return (this.style = extend({
+			fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif', // default font
+			fontSize: '12px'
+		}, style));
+	},
+
+	/**
+	 * Detect whether the renderer is hidden. This happens when one of the parent elements
+	 * has display: none. #608.
+	 */
+	isHidden: function () {
+		return !this.boxWrapper.getBBox().width;
+	},
+
+	/**
+	 * Destroys the renderer and its allocated members.
+	 */
+	destroy: function () {
+		var renderer = this,
+			rendererDefs = renderer.defs;
+		renderer.box = null;
+		renderer.boxWrapper = renderer.boxWrapper.destroy();
+
+		// Call destroy on all gradient elements
+		destroyObjectProperties(renderer.gradients || {});
+		renderer.gradients = null;
+
+		// Defs are null in VMLRenderer
+		// Otherwise, destroy them here.
+		if (rendererDefs) {
+			renderer.defs = rendererDefs.destroy();
+		}
+
+		// Remove sub pixel fix handler
+		// We need to check that there is a handler, otherwise all functions that are registered for event 'resize' are removed
+		// See issue #982
+		if (renderer.subPixelFix) {
+			removeEvent(win, 'resize', renderer.subPixelFix);
+		}
+
+		renderer.alignedObjects = null;
+
+		return null;
+	},
+
+	/**
+	 * Create a wrapper for an SVG element
+	 * @param {Object} nodeName
+	 */
+	createElement: function (nodeName) {
+		var wrapper = new this.Element();
+		wrapper.init(this, nodeName);
+		return wrapper;
+	},
+
+	/**
+	 * Dummy function for use in canvas renderer
+	 */
+	draw: function () {},
+
+	/**
+	 * Parse a simple HTML string into SVG tspans
+	 *
+	 * @param {Object} textNode The parent text SVG node
+	 */
+	buildText: function (wrapper) {
+		var textNode = wrapper.element,
+			renderer = this,
+			forExport = renderer.forExport,
+			textStr = pick(wrapper.textStr, '').toString(),
+			hasMarkup = textStr.indexOf('<') !== -1,
+			lines,
+			childNodes = textNode.childNodes,
+			styleRegex,
+			hrefRegex,
+			parentX = attr(textNode, 'x'),
+			textStyles = wrapper.styles,
+			width = wrapper.textWidth,
+			textLineHeight = textStyles && textStyles.lineHeight,
+			textStroke = textStyles && textStyles.HcTextStroke,
+			i = childNodes.length,
+			getLineHeight = function (tspan) {
+				return textLineHeight ? 
+					pInt(textLineHeight) :
+					renderer.fontMetrics(
+						/(px|em)$/.test(tspan && tspan.style.fontSize) ?
+							tspan.style.fontSize :
+							((textStyles && textStyles.fontSize) || renderer.style.fontSize || 12),
+						tspan
+					).h;
+			};
+
+		/// remove old text
+		while (i--) {
+			textNode.removeChild(childNodes[i]);
+		}
+
+		// Skip tspans, add text directly to text node. The forceTSpan is a hook 
+		// used in text outline hack.
+		if (!hasMarkup && !textStroke && textStr.indexOf(' ') === -1) {
+			textNode.appendChild(doc.createTextNode(textStr));
+			return;
+
+		// Complex strings, add more logic
+		} else {
+
+			styleRegex = /<.*style="([^"]+)".*>/;
+			hrefRegex = /<.*href="(http[^"]+)".*>/;
+
+			if (width && !wrapper.added) {
+				this.box.appendChild(textNode); // attach it to the DOM to read offset width
+			}
+
+			if (hasMarkup) {
+				lines = textStr
+					.replace(/<(b|strong)>/g, '<span style="font-weight:bold">')
+					.replace(/<(i|em)>/g, '<span style="font-style:italic">')
+					.replace(/<a/g, '<span')
+					.replace(/<\/(b|strong|i|em|a)>/g, '</span>')
+					.split(/<br.*?>/g);
+
+			} else {
+				lines = [textStr];
+			}
+
+
+			// remove empty line at end
+			if (lines[lines.length - 1] === '') {
+				lines.pop();
+			}
+
+			
+			// build the lines
+			each(lines, function (line, lineNo) {
+				var spans, spanNo = 0;
+
+				line = line.replace(/<span/g, '|||<span').replace(/<\/span>/g, '</span>|||');
+				spans = line.split('|||');
+
+				each(spans, function (span) {
+					if (span !== '' || spans.length === 1) {
+						var attributes = {},
+							tspan = doc.createElementNS(SVG_NS, 'tspan'),
+							spanStyle; // #390
+						if (styleRegex.test(span)) {
+							spanStyle = span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2');
+							attr(tspan, 'style', spanStyle);
+						}
+						if (hrefRegex.test(span) && !forExport) { // Not for export - #1529
+							attr(tspan, 'onclick', 'location.href=\"' + span.match(hrefRegex)[1] + '\"');
+							css(tspan, { cursor: 'pointer' });
+						}
+
+						span = (span.replace(/<(.|\n)*?>/g, '') || ' ')
+							.replace(/&lt;/g, '<')
+							.replace(/&gt;/g, '>');
+
+						// Nested tags aren't supported, and cause crash in Safari (#1596)
+						if (span !== ' ') {
+
+							// add the text node
+							tspan.appendChild(doc.createTextNode(span));
+
+							if (!spanNo) { // first span in a line, align it to the left
+								if (lineNo && parentX !== null) {
+									attributes.x = parentX;
+								}
+							} else {
+								attributes.dx = 0; // #16
+							}
+
+							// add attributes
+							attr(tspan, attributes);
+
+							// Append it
+							textNode.appendChild(tspan);
+
+							// first span on subsequent line, add the line height
+							if (!spanNo && lineNo) {
+
+								// allow getting the right offset height in exporting in IE
+								if (!hasSVG && forExport) {
+									css(tspan, { display: 'block' });
+								}
+
+								// Set the line height based on the font size of either
+								// the text element or the tspan element
+								attr(
+									tspan,
+									'dy',
+									getLineHeight(tspan)
+								);
+							}
+
+							// check width and apply soft breaks
+							if (width) {
+								var words = span.replace(/([^\^])-/g, '$1- ').split(' '), // #1273
+									hasWhiteSpace = spans.length > 1 || (words.length > 1 && textStyles.whiteSpace !== 'nowrap'),
+									tooLong,
+									actualWidth,
+									hcHeight = textStyles.HcHeight,
+									rest = [],
+									dy = getLineHeight(tspan),
+									softLineNo = 1,
+									bBox;
+
+								while (hasWhiteSpace && (words.length || rest.length)) {
+									delete wrapper.bBox; // delete cache
+									bBox = wrapper.getBBox();
+									actualWidth = bBox.width;
+
+									// Old IE cannot measure the actualWidth for SVG elements (#2314)
+									if (!hasSVG && renderer.forExport) {
+										actualWidth = renderer.measureSpanWidth(tspan.firstChild.data, wrapper.styles);
+									}
+
+									tooLong = actualWidth > width;
+									if (!tooLong || words.length === 1) { // new line needed
+										words = rest;
+										rest = [];
+										if (words.length) {
+											softLineNo++;
+											if (hcHeight && softLineNo * dy > hcHeight) {
+												words = ['...'];
+												wrapper.attr('title', wrapper.textStr);
+											} else {
+
+												tspan = doc.createElementNS(SVG_NS, 'tspan');
+												attr(tspan, {
+													dy: dy,
+													x: parentX
+												});
+												if (spanStyle) { // #390
+													attr(tspan, 'style', spanStyle);
+												}
+												textNode.appendChild(tspan);
+											}
+										}
+										if (actualWidth > width) { // a single word is pressing it out
+											width = actualWidth;
+										}
+									} else { // append to existing line tspan
+										tspan.removeChild(tspan.firstChild);
+										rest.unshift(words.pop());
+									}
+									if (words.length) {
+										tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));
+									}
+								}
+							}
+
+							spanNo++;
+						}
+					}
+				});
+			});
+		}
+	},
+
+	/**
+	 * Create a button with preset states
+	 * @param {String} text
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Function} callback
+	 * @param {Object} normalState
+	 * @param {Object} hoverState
+	 * @param {Object} pressedState
+	 */
+	button: function (text, x, y, callback, normalState, hoverState, pressedState, disabledState, shape) {
+		var label = this.label(text, x, y, shape, null, null, null, null, 'button'),
+			curState = 0,
+			stateOptions,
+			stateStyle,
+			normalStyle,
+			hoverStyle,
+			pressedStyle,
+			disabledStyle,
+			verticalGradient = { x1: 0, y1: 0, x2: 0, y2: 1 };
+
+		// Normal state - prepare the attributes
+		normalState = merge({
+			'stroke-width': 1,
+			stroke: '#CCCCCC',
+			fill: {
+				linearGradient: verticalGradient,
+				stops: [
+					[0, '#FEFEFE'],
+					[1, '#F6F6F6']
+				]
+			},
+			r: 2,
+			padding: 5,
+			style: {
+				color: 'black'
+			}
+		}, normalState);
+		normalStyle = normalState.style;
+		delete normalState.style;
+
+		// Hover state
+		hoverState = merge(normalState, {
+			stroke: '#68A',
+			fill: {
+				linearGradient: verticalGradient,
+				stops: [
+					[0, '#FFF'],
+					[1, '#ACF']
+				]
+			}
+		}, hoverState);
+		hoverStyle = hoverState.style;
+		delete hoverState.style;
+
+		// Pressed state
+		pressedState = merge(normalState, {
+			stroke: '#68A',
+			fill: {
+				linearGradient: verticalGradient,
+				stops: [
+					[0, '#9BD'],
+					[1, '#CDF']
+				]
+			}
+		}, pressedState);
+		pressedStyle = pressedState.style;
+		delete pressedState.style;
+
+		// Disabled state
+		disabledState = merge(normalState, {
+			style: {
+				color: '#CCC'
+			}
+		}, disabledState);
+		disabledStyle = disabledState.style;
+		delete disabledState.style;
+
+		// Add the events. IE9 and IE10 need mouseover and mouseout to funciton (#667).
+		addEvent(label.element, isIE ? 'mouseover' : 'mouseenter', function () {
+			if (curState !== 3) {
+				label.attr(hoverState)
+					.css(hoverStyle);
+			}
+		});
+		addEvent(label.element, isIE ? 'mouseout' : 'mouseleave', function () {
+			if (curState !== 3) {
+				stateOptions = [normalState, hoverState, pressedState][curState];
+				stateStyle = [normalStyle, hoverStyle, pressedStyle][curState];
+				label.attr(stateOptions)
+					.css(stateStyle);
+			}
+		});
+
+		label.setState = function (state) {
+			label.state = curState = state;
+			if (!state) {
+				label.attr(normalState)
+					.css(normalStyle);
+			} else if (state === 2) {
+				label.attr(pressedState)
+					.css(pressedStyle);
+			} else if (state === 3) {
+				label.attr(disabledState)
+					.css(disabledStyle);
+			}
+		};
+
+		return label
+			.on('click', function () {
+				if (curState !== 3) {
+					callback.call(label);
+				}
+			})
+			.attr(normalState)
+			.css(extend({ cursor: 'default' }, normalStyle));
+	},
+
+	/**
+	 * Make a straight line crisper by not spilling out to neighbour pixels
+	 * @param {Array} points
+	 * @param {Number} width
+	 */
+	crispLine: function (points, width) {
+		// points format: [M, 0, 0, L, 100, 0]
+		// normalize to a crisp line
+		if (points[1] === points[4]) {
+			// Substract due to #1129. Now bottom and left axis gridlines behave the same.
+			points[1] = points[4] = mathRound(points[1]) - (width % 2 / 2);
+		}
+		if (points[2] === points[5]) {
+			points[2] = points[5] = mathRound(points[2]) + (width % 2 / 2);
+		}
+		return points;
+	},
+
+
+	/**
+	 * Draw a path
+	 * @param {Array} path An SVG path in array form
+	 */
+	path: function (path) {
+		var attr = {
+			fill: NONE
+		};
+		if (isArray(path)) {
+			attr.d = path;
+		} else if (isObject(path)) { // attributes
+			extend(attr, path);
+		}
+		return this.createElement('path').attr(attr);
+	},
+
+	/**
+	 * Draw and return an SVG circle
+	 * @param {Number} x The x position
+	 * @param {Number} y The y position
+	 * @param {Number} r The radius
+	 */
+	circle: function (x, y, r) {
+		var attr = isObject(x) ?
+			x :
+			{
+				x: x,
+				y: y,
+				r: r
+			},
+			wrapper = this.createElement('circle');
+
+		wrapper.xSetter = function (value) {
+			this.element.setAttribute('cx', value);
+		};
+		wrapper.ySetter = function (value) {
+			this.element.setAttribute('cy', value);
+		};
+		return wrapper.attr(attr);
+	},
+
+	/**
+	 * Draw and return an arc
+	 * @param {Number} x X position
+	 * @param {Number} y Y position
+	 * @param {Number} r Radius
+	 * @param {Number} innerR Inner radius like used in donut charts
+	 * @param {Number} start Starting angle
+	 * @param {Number} end Ending angle
+	 */
+	arc: function (x, y, r, innerR, start, end) {
+		var arc;
+
+		if (isObject(x)) {
+			y = x.y;
+			r = x.r;
+			innerR = x.innerR;
+			start = x.start;
+			end = x.end;
+			x = x.x;
+		}
+
+		// Arcs are defined as symbols for the ability to set
+		// attributes in attr and animate
+		arc = this.symbol('arc', x || 0, y || 0, r || 0, r || 0, {
+			innerR: innerR || 0,
+			start: start || 0,
+			end: end || 0
+		});
+		arc.r = r; // #959
+		return arc;
+	},
+
+	/**
+	 * Draw and return a rectangle
+	 * @param {Number} x Left position
+	 * @param {Number} y Top position
+	 * @param {Number} width
+	 * @param {Number} height
+	 * @param {Number} r Border corner radius
+	 * @param {Number} strokeWidth A stroke width can be supplied to allow crisp drawing
+	 */
+	rect: function (x, y, width, height, r, strokeWidth) {
+
+		r = isObject(x) ? x.r : r;
+
+		var wrapper = this.createElement('rect'),
+			attribs = isObject(x) ? x : x === UNDEFINED ? {} : {
+				x: x,
+				y: y,
+				width: mathMax(width, 0),
+				height: mathMax(height, 0)
+			};
+
+		if (strokeWidth !== UNDEFINED) {
+			attribs.strokeWidth = strokeWidth;
+			attribs = wrapper.crisp(attribs);
+		}
+
+		if (r) {
+			attribs.r = r;
+		}
+
+		wrapper.rSetter = function (value) {
+			attr(this.element, {
+				rx: value,
+				ry: value
+			});
+		};
+		
+		return wrapper.attr(attribs);
+	},
+
+	/**
+	 * Resize the box and re-align all aligned elements
+	 * @param {Object} width
+	 * @param {Object} height
+	 * @param {Boolean} animate
+	 *
+	 */
+	setSize: function (width, height, animate) {
+		var renderer = this,
+			alignedObjects = renderer.alignedObjects,
+			i = alignedObjects.length;
+
+		renderer.width = width;
+		renderer.height = height;
+
+		renderer.boxWrapper[pick(animate, true) ? 'animate' : 'attr']({
+			width: width,
+			height: height
+		});
+
+		while (i--) {
+			alignedObjects[i].align();
+		}
+	},
+
+	/**
+	 * Create a group
+	 * @param {String} name The group will be given a class name of 'highcharts-{name}'.
+	 *     This can be used for styling and scripting.
+	 */
+	g: function (name) {
+		var elem = this.createElement('g');
+		return defined(name) ? elem.attr({ 'class': PREFIX + name }) : elem;
+	},
+
+	/**
+	 * Display an image
+	 * @param {String} src
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	image: function (src, x, y, width, height) {
+		var attribs = {
+				preserveAspectRatio: NONE
+			},
+			elemWrapper;
+
+		// optional properties
+		if (arguments.length > 1) {
+			extend(attribs, {
+				x: x,
+				y: y,
+				width: width,
+				height: height
+			});
+		}
+
+		elemWrapper = this.createElement('image').attr(attribs);
+
+		// set the href in the xlink namespace
+		if (elemWrapper.element.setAttributeNS) {
+			elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink',
+				'href', src);
+		} else {
+			// could be exporting in IE
+			// using href throws "not supported" in ie7 and under, requries regex shim to fix later
+			elemWrapper.element.setAttribute('hc-svg-href', src);
+		}
+		return elemWrapper;
+	},
+
+	/**
+	 * Draw a symbol out of pre-defined shape paths from the namespace 'symbol' object.
+	 *
+	 * @param {Object} symbol
+	 * @param {Object} x
+	 * @param {Object} y
+	 * @param {Object} radius
+	 * @param {Object} options
+	 */
+	symbol: function (symbol, x, y, width, height, options) {
+
+		var obj,
+
+			// get the symbol definition function
+			symbolFn = this.symbols[symbol],
+
+			// check if there's a path defined for this symbol
+			path = symbolFn && symbolFn(
+				mathRound(x),
+				mathRound(y),
+				width,
+				height,
+				options
+			),
+
+			imageElement,
+			imageRegex = /^url\((.*?)\)$/,
+			imageSrc,
+			imageSize,
+			centerImage;
+
+		if (path) {
+
+			obj = this.path(path);
+			// expando properties for use in animate and attr
+			extend(obj, {
+				symbolName: symbol,
+				x: x,
+				y: y,
+				width: width,
+				height: height
+			});
+			if (options) {
+				extend(obj, options);
+			}
+
+
+		// image symbols
+		} else if (imageRegex.test(symbol)) {
+
+			// On image load, set the size and position
+			centerImage = function (img, size) {
+				if (img.element) { // it may be destroyed in the meantime (#1390)
+					img.attr({
+						width: size[0],
+						height: size[1]
+					});
+
+					if (!img.alignByTranslate) { // #185
+						img.translate(
+							mathRound((width - size[0]) / 2), // #1378
+							mathRound((height - size[1]) / 2)
+						);
+					}
+				}
+			};
+
+			imageSrc = symbol.match(imageRegex)[1];
+			imageSize = symbolSizes[imageSrc];
+
+			// Ireate the image synchronously, add attribs async
+			obj = this.image(imageSrc)
+				.attr({
+					x: x,
+					y: y
+				});
+			obj.isImg = true;
+
+			if (imageSize) {
+				centerImage(obj, imageSize);
+			} else {
+				// Initialize image to be 0 size so export will still function if there's no cached sizes.
+				//
+				obj.attr({ width: 0, height: 0 });
+
+				// Create a dummy JavaScript image to get the width and height. Due to a bug in IE < 8,
+				// the created element must be assigned to a variable in order to load (#292).
+				imageElement = createElement('img', {
+					onload: function () {
+						centerImage(obj, symbolSizes[imageSrc] = [this.width, this.height]);
+					},
+					src: imageSrc
+				});
+			}
+		}
+
+		return obj;
+	},
+
+	/**
+	 * An extendable collection of functions for defining symbol paths.
+	 */
+	symbols: {
+		'circle': function (x, y, w, h) {
+			var cpw = 0.166 * w;
+			return [
+				M, x + w / 2, y,
+				'C', x + w + cpw, y, x + w + cpw, y + h, x + w / 2, y + h,
+				'C', x - cpw, y + h, x - cpw, y, x + w / 2, y,
+				'Z'
+			];
+		},
+
+		'square': function (x, y, w, h) {
+			return [
+				M, x, y,
+				L, x + w, y,
+				x + w, y + h,
+				x, y + h,
+				'Z'
+			];
+		},
+
+		'triangle': function (x, y, w, h) {
+			return [
+				M, x + w / 2, y,
+				L, x + w, y + h,
+				x, y + h,
+				'Z'
+			];
+		},
+
+		'triangle-down': function (x, y, w, h) {
+			return [
+				M, x, y,
+				L, x + w, y,
+				x + w / 2, y + h,
+				'Z'
+			];
+		},
+		'diamond': function (x, y, w, h) {
+			return [
+				M, x + w / 2, y,
+				L, x + w, y + h / 2,
+				x + w / 2, y + h,
+				x, y + h / 2,
+				'Z'
+			];
+		},
+		'arc': function (x, y, w, h, options) {
+			var start = options.start,
+				radius = options.r || w || h,
+				end = options.end - 0.001, // to prevent cos and sin of start and end from becoming equal on 360 arcs (related: #1561)
+				innerRadius = options.innerR,
+				open = options.open,
+				cosStart = mathCos(start),
+				sinStart = mathSin(start),
+				cosEnd = mathCos(end),
+				sinEnd = mathSin(end),
+				longArc = options.end - start < mathPI ? 0 : 1;
+
+			return [
+				M,
+				x + radius * cosStart,
+				y + radius * sinStart,
+				'A', // arcTo
+				radius, // x radius
+				radius, // y radius
+				0, // slanting
+				longArc, // long or short arc
+				1, // clockwise
+				x + radius * cosEnd,
+				y + radius * sinEnd,
+				open ? M : L,
+				x + innerRadius * cosEnd,
+				y + innerRadius * sinEnd,
+				'A', // arcTo
+				innerRadius, // x radius
+				innerRadius, // y radius
+				0, // slanting
+				longArc, // long or short arc
+				0, // clockwise
+				x + innerRadius * cosStart,
+				y + innerRadius * sinStart,
+
+				open ? '' : 'Z' // close
+			];
+		},
+
+		/**
+		 * Callout shape used for default tooltips, also used for rounded rectangles in VML
+		 */
+		callout: function (x, y, w, h, options) {
+			var arrowLength = 6,
+				halfDistance = 6,
+				r = mathMin((options && options.r) || 0, w, h),
+				safeDistance = r + halfDistance,
+				anchorX = options && options.anchorX,
+				anchorY = options && options.anchorY,
+				path,
+				normalizer = mathRound(options.strokeWidth || 0) % 2 / 2; // mathRound because strokeWidth can sometimes have roundoff errors;
+
+			x += normalizer;
+			y += normalizer;
+			path = [
+				'M', x + r, y, 
+				'L', x + w - r, y, // top side
+				'C', x + w, y, x + w, y, x + w, y + r, // top-right corner
+				'L', x + w, y + h - r, // right side
+				'C', x + w, y + h, x + w, y + h, x + w - r, y + h, // bottom-right corner
+				'L', x + r, y + h, // bottom side
+				'C', x, y + h, x, y + h, x, y + h - r, // bottom-left corner
+				'L', x, y + r, // left side
+				'C', x, y, x, y, x + r, y // top-right corner
+			];
+			
+			if (anchorX && anchorX > w && anchorY > y + safeDistance && anchorY < y + h - safeDistance) { // replace right side
+				path.splice(13, 3,
+					'L', x + w, anchorY - halfDistance, 
+					x + w + arrowLength, anchorY,
+					x + w, anchorY + halfDistance,
+					x + w, y + h - r
+				);
+			} else if (anchorX && anchorX < 0 && anchorY > y + safeDistance && anchorY < y + h - safeDistance) { // replace left side
+				path.splice(33, 3, 
+					'L', x, anchorY + halfDistance, 
+					x - arrowLength, anchorY,
+					x, anchorY - halfDistance,
+					x, y + r
+				);
+			} else if (anchorY && anchorY > h && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace bottom
+				path.splice(23, 3,
+					'L', anchorX + halfDistance, y + h,
+					anchorX, y + h + arrowLength,
+					anchorX - halfDistance, y + h,
+					x + r, y + h
+				);
+			} else if (anchorY && anchorY < 0 && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace top
+				path.splice(3, 3,
+					'L', anchorX - halfDistance, y,
+					anchorX, y - arrowLength,
+					anchorX + halfDistance, y,
+					w - r, y
+				);
+			}
+			return path;
+		}
+	},
+
+	/**
+	 * Define a clipping rectangle
+	 * @param {String} id
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	clipRect: function (x, y, width, height) {
+		var wrapper,
+			id = PREFIX + idCounter++,
+
+			clipPath = this.createElement('clipPath').attr({
+				id: id
+			}).add(this.defs);
+
+		wrapper = this.rect(x, y, width, height, 0).add(clipPath);
+		wrapper.id = id;
+		wrapper.clipPath = clipPath;
+
+		return wrapper;
+	},
+
+
+	
+
+
+	/**
+	 * Add text to the SVG object
+	 * @param {String} str
+	 * @param {Number} x Left position
+	 * @param {Number} y Top position
+	 * @param {Boolean} useHTML Use HTML to render the text
+	 */
+	text: function (str, x, y, useHTML) {
+
+		// declare variables
+		var renderer = this,
+			fakeSVG = useCanVG || (!hasSVG && renderer.forExport),
+			wrapper,
+			attr = {};
+
+		if (useHTML && !renderer.forExport) {
+			return renderer.html(str, x, y);
+		}
+
+		attr.x = Math.round(x || 0); // X is always needed for line-wrap logic
+		if (y) {
+			attr.y = Math.round(y);
+		}
+		if (str || str === 0) {
+			attr.text = str;
+		}
+
+		wrapper = renderer.createElement('text')
+			.attr(attr);
+
+		// Prevent wrapping from creating false offsetWidths in export in legacy IE (#1079, #1063)
+		if (fakeSVG) {
+			wrapper.css({
+				position: ABSOLUTE
+			});
+		}
+
+		if (!useHTML) {
+			wrapper.xSetter = function (value, key, element) {
+				var tspans = element.getElementsByTagName('tspan'),
+					tspan,
+					parentVal = element.getAttribute(key),
+					i;
+				for (i = 0; i < tspans.length; i++) {
+					tspan = tspans[i];
+					// If the x values are equal, the tspan represents a linebreak
+					if (tspan.getAttribute(key) === parentVal) {
+						tspan.setAttribute(key, value);
+					}
+				}
+				element.setAttribute(key, value);
+			};
+		}
+		
+		return wrapper;
+	},
+
+	/**
+	 * Utility to return the baseline offset and total line height from the font size
+	 */
+	fontMetrics: function (fontSize, elem) {
+		fontSize = fontSize || this.style.fontSize;
+		if (elem && win.getComputedStyle) {
+			elem = elem.element || elem; // SVGElement
+			fontSize = win.getComputedStyle(elem, "").fontSize;
+		}
+		fontSize = /px/.test(fontSize) ? pInt(fontSize) : /em/.test(fontSize) ? parseFloat(fontSize) * 12 : 12;
+
+		// Empirical values found by comparing font size and bounding box height.
+		// Applies to the default font family. http://jsfiddle.net/highcharts/7xvn7/
+		var lineHeight = fontSize < 24 ? fontSize + 4 : mathRound(fontSize * 1.2),
+			baseline = mathRound(lineHeight * 0.8);
+
+		return {
+			h: lineHeight,
+			b: baseline,
+			f: fontSize
+		};
+	},
+
+	/**
+	 * Add a label, a text item that can hold a colored or gradient background
+	 * as well as a border and shadow.
+	 * @param {string} str
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {String} shape
+	 * @param {Number} anchorX In case the shape has a pointer, like a flag, this is the
+	 *    coordinates it should be pinned to
+	 * @param {Number} anchorY
+	 * @param {Boolean} baseline Whether to position the label relative to the text baseline,
+	 *    like renderer.text, or to the upper border of the rectangle.
+	 * @param {String} className Class name for the group
+	 */
+	label: function (str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {
+
+		var renderer = this,
+			wrapper = renderer.g(className),
+			text = renderer.text('', 0, 0, useHTML)
+				.attr({
+					zIndex: 1
+				}),
+				//.add(wrapper),
+			box,
+			bBox,
+			alignFactor = 0,
+			padding = 3,
+			paddingLeft = 0,
+			width,
+			height,
+			wrapperX,
+			wrapperY,
+			crispAdjust = 0,
+			deferredAttr = {},
+			baselineOffset,
+			needsBox;
+
+		/**
+		 * This function runs after the label is added to the DOM (when the bounding box is
+		 * available), and after the text of the label is updated to detect the new bounding
+		 * box and reflect it in the border box.
+		 */
+		function updateBoxSize() {
+			var boxX,
+				boxY,
+				style = text.element.style;
+
+			bBox = (width === undefined || height === undefined || wrapper.styles.textAlign) && text.textStr && 
+				text.getBBox();
+			wrapper.width = (width || bBox.width || 0) + 2 * padding + paddingLeft;
+			wrapper.height = (height || bBox.height || 0) + 2 * padding;
+
+			// update the label-scoped y offset
+			baselineOffset = padding + renderer.fontMetrics(style && style.fontSize, text).b;
+
+			
+			if (needsBox) {
+
+				// create the border box if it is not already present
+				if (!box) {
+					boxX = mathRound(-alignFactor * padding);
+					boxY = baseline ? -baselineOffset : 0;
+
+					wrapper.box = box = shape ?
+						renderer.symbol(shape, boxX, boxY, wrapper.width, wrapper.height, deferredAttr) :
+						renderer.rect(boxX, boxY, wrapper.width, wrapper.height, 0, deferredAttr[STROKE_WIDTH]);
+					box.attr('fill', NONE).add(wrapper);
+				}
+
+				// apply the box attributes
+				if (!box.isImg) { // #1630
+					box.attr(extend({
+						width: mathRound(wrapper.width),
+						height: mathRound(wrapper.height)
+					}, deferredAttr));
+				}
+				deferredAttr = null;
+			}
+		}
+
+		/**
+		 * This function runs after setting text or padding, but only if padding is changed
+		 */
+		function updateTextPadding() {
+			var styles = wrapper.styles,
+				textAlign = styles && styles.textAlign,
+				x = paddingLeft + padding * (1 - alignFactor),
+				y;
+
+			// determin y based on the baseline
+			y = baseline ? 0 : baselineOffset;
+
+			// compensate for alignment
+			if (defined(width) && bBox && (textAlign === 'center' || textAlign === 'right')) {
+				x += { center: 0.5, right: 1 }[textAlign] * (width - bBox.width);
+			}
+
+			// update if anything changed
+			if (x !== text.x || y !== text.y) {
+				text.attr('x', x);
+				if (y !== UNDEFINED) {
+					text.attr('y', y);
+				}
+			}
+
+			// record current values
+			text.x = x;
+			text.y = y;
+		}
+
+		/**
+		 * Set a box attribute, or defer it if the box is not yet created
+		 * @param {Object} key
+		 * @param {Object} value
+		 */
+		function boxAttr(key, value) {
+			if (box) {
+				box.attr(key, value);
+			} else {
+				deferredAttr[key] = value;
+			}
+		}
+
+		/**
+		 * After the text element is added, get the desired size of the border box
+		 * and add it before the text in the DOM.
+		 */
+		wrapper.onAdd = function () {
+			text.add(wrapper);
+			wrapper.attr({
+				text: str || '', // alignment is available now
+				x: x,
+				y: y
+			});
+
+			if (box && defined(anchorX)) {
+				wrapper.attr({
+					anchorX: anchorX,
+					anchorY: anchorY
+				});
+			}
+		};
+
+		/*
+		 * Add specific attribute setters.
+		 */
+
+		// only change local variables
+		wrapper.widthSetter = function (value) {
+			width = value;
+		};
+		wrapper.heightSetter = function (value) {
+			height = value;
+		};
+		wrapper.paddingSetter =  function (value) {
+			if (defined(value) && value !== padding) {
+				padding = value;
+				updateTextPadding();
+			}
+		};
+		wrapper.paddingLeftSetter =  function (value) {
+			if (defined(value) && value !== paddingLeft) {
+				paddingLeft = value;
+				updateTextPadding();
+			}
+		};
+
+
+		// change local variable and prevent setting attribute on the group
+		wrapper.alignSetter = function (value) {
+			alignFactor = { left: 0, center: 0.5, right: 1 }[value];
+		};
+
+		// apply these to the box and the text alike
+		wrapper.textSetter = function (value) {
+			if (value !== UNDEFINED) {
+				text.textSetter(value);
+			}
+			updateBoxSize();
+			updateTextPadding();
+		};
+
+		// apply these to the box but not to the text
+		wrapper['stroke-widthSetter'] = function (value, key) {
+			if (value) {
+				needsBox = true;
+			}
+			crispAdjust = value % 2 / 2;
+			boxAttr(key, value);
+		};
+		wrapper.strokeSetter = wrapper.fillSetter = wrapper.rSetter = function (value, key) {
+			if (key === 'fill' && value) {
+				needsBox = true;
+			}
+			boxAttr(key, value);
+		};
+		wrapper.anchorXSetter = function (value, key) {
+			anchorX = value;
+			boxAttr(key, value + crispAdjust - wrapperX);
+		};
+		wrapper.anchorYSetter = function (value, key) {
+			anchorY = value;
+			boxAttr(key, value - wrapperY);
+		};
+
+		// rename attributes
+		wrapper.xSetter = function (value) {
+			wrapper.x = value; // for animation getter
+			if (alignFactor) {
+				value -= alignFactor * ((width || bBox.width) + padding);
+			}
+			wrapperX = mathRound(value);
+			wrapper.attr('translateX', wrapperX);
+		};
+		wrapper.ySetter = function (value) {
+			wrapperY = wrapper.y = mathRound(value);
+			wrapper.attr('translateY', wrapperY);
+		};
+
+		// Redirect certain methods to either the box or the text
+		var baseCss = wrapper.css;
+		return extend(wrapper, {
+			/**
+			 * Pick up some properties and apply them to the text instead of the wrapper
+			 */
+			css: function (styles) {
+				if (styles) {
+					var textStyles = {};
+					styles = merge(styles); // create a copy to avoid altering the original object (#537)
+					each(wrapper.textProps, function (prop) {
+						if (styles[prop] !== UNDEFINED) {
+							textStyles[prop] = styles[prop];
+							delete styles[prop];
+						}
+					});
+					text.css(textStyles);
+				}
+				return baseCss.call(wrapper, styles);
+			},
+			/**
+			 * Return the bounding box of the box, not the group
+			 */
+			getBBox: function () {
+				return {
+					width: bBox.width + 2 * padding,
+					height: bBox.height + 2 * padding,
+					x: bBox.x - padding,
+					y: bBox.y - padding
+				};
+			},
+			/**
+			 * Apply the shadow to the box
+			 */
+			shadow: function (b) {
+				if (box) {
+					box.shadow(b);
+				}
+				return wrapper;
+			},
+			/**
+			 * Destroy and release memory.
+			 */
+			destroy: function () {
+
+				// Added by button implementation
+				removeEvent(wrapper.element, 'mouseenter');
+				removeEvent(wrapper.element, 'mouseleave');
+
+				if (text) {
+					text = text.destroy();
+				}
+				if (box) {
+					box = box.destroy();
+				}
+				// Call base implementation to destroy the rest
+				SVGElement.prototype.destroy.call(wrapper);
+
+				// Release local pointers (#1298)
+				wrapper = renderer = updateBoxSize = updateTextPadding = boxAttr = null;
+			}
+		});
+	}
+}; // end SVGRenderer
+
+
+// general renderer
+Renderer = SVGRenderer;
+// extend SvgElement for useHTML option
+extend(SVGElement.prototype, {
+	/**
+	 * Apply CSS to HTML elements. This is used in text within SVG rendering and
+	 * by the VML renderer
+	 */
+	htmlCss: function (styles) {
+		var wrapper = this,
+			element = wrapper.element,
+			textWidth = styles && element.tagName === 'SPAN' && styles.width;
+
+		if (textWidth) {
+			delete styles.width;
+			wrapper.textWidth = textWidth;
+			wrapper.updateTransform();
+		}
+
+		wrapper.styles = extend(wrapper.styles, styles);
+		css(wrapper.element, styles);
+
+		return wrapper;
+	},
+
+	/**
+	 * VML and useHTML method for calculating the bounding box based on offsets
+	 * @param {Boolean} refresh Whether to force a fresh value from the DOM or to
+	 * use the cached value
+	 *
+	 * @return {Object} A hash containing values for x, y, width and height
+	 */
+
+	htmlGetBBox: function () {
+		var wrapper = this,
+			element = wrapper.element,
+			bBox = wrapper.bBox;
+
+		// faking getBBox in exported SVG in legacy IE
+		if (!bBox) {
+			// faking getBBox in exported SVG in legacy IE (is this a duplicate of the fix for #1079?)
+			if (element.nodeName === 'text') {
+				element.style.position = ABSOLUTE;
+			}
+
+			bBox = wrapper.bBox = {
+				x: element.offsetLeft,
+				y: element.offsetTop,
+				width: element.offsetWidth,
+				height: element.offsetHeight
+			};
+		}
+
+		return bBox;
+	},
+
+	/**
+	 * VML override private method to update elements based on internal
+	 * properties based on SVG transform
+	 */
+	htmlUpdateTransform: function () {
+		// aligning non added elements is expensive
+		if (!this.added) {
+			this.alignOnAdd = true;
+			return;
+		}
+
+		var wrapper = this,
+			renderer = wrapper.renderer,
+			elem = wrapper.element,
+			translateX = wrapper.translateX || 0,
+			translateY = wrapper.translateY || 0,
+			x = wrapper.x || 0,
+			y = wrapper.y || 0,
+			align = wrapper.textAlign || 'left',
+			alignCorrection = { left: 0, center: 0.5, right: 1 }[align],
+			shadows = wrapper.shadows;
+
+		// apply translate
+		css(elem, {
+			marginLeft: translateX,
+			marginTop: translateY
+		});
+		if (shadows) { // used in labels/tooltip
+			each(shadows, function (shadow) {
+				css(shadow, {
+					marginLeft: translateX + 1,
+					marginTop: translateY + 1
+				});
+			});
+		}
+
+		// apply inversion
+		if (wrapper.inverted) { // wrapper is a group
+			each(elem.childNodes, function (child) {
+				renderer.invertChild(child, elem);
+			});
+		}
+
+		if (elem.tagName === 'SPAN') {
+
+			var width,
+				rotation = wrapper.rotation,
+				baseline,
+				textWidth = pInt(wrapper.textWidth),
+				currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth].join(',');
+
+			if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed
+
+
+				baseline = renderer.fontMetrics(elem.style.fontSize).b;
+
+				// Renderer specific handling of span rotation
+				if (defined(rotation)) {
+					wrapper.setSpanRotation(rotation, alignCorrection, baseline);
+				}
+
+				width = pick(wrapper.elemWidth, elem.offsetWidth);
+
+				// Update textWidth
+				if (width > textWidth && /[ \-]/.test(elem.textContent || elem.innerText)) { // #983, #1254
+					css(elem, {
+						width: textWidth + PX,
+						display: 'block',
+						whiteSpace: 'normal'
+					});
+					width = textWidth;
+				}
+
+				wrapper.getSpanCorrection(width, baseline, alignCorrection, rotation, align);
+			}
+
+			// apply position with correction
+			css(elem, {
+				left: (x + (wrapper.xCorr || 0)) + PX,
+				top: (y + (wrapper.yCorr || 0)) + PX
+			});
+
+			// force reflow in webkit to apply the left and top on useHTML element (#1249)
+			if (isWebKit) {
+				baseline = elem.offsetHeight; // assigned to baseline for JSLint purpose
+			}
+
+			// record current text transform
+			wrapper.cTT = currentTextTransform;
+		}
+	},
+
+	/**
+	 * Set the rotation of an individual HTML span
+	 */
+	setSpanRotation: function (rotation, alignCorrection, baseline) {
+		var rotationStyle = {},
+			cssTransformKey = isIE ? '-ms-transform' : isWebKit ? '-webkit-transform' : isFirefox ? 'MozTransform' : isOpera ? '-o-transform' : '';
+
+		rotationStyle[cssTransformKey] = rotationStyle.transform = 'rotate(' + rotation + 'deg)';
+		rotationStyle[cssTransformKey + (isFirefox ? 'Origin' : '-origin')] = rotationStyle.transformOrigin = (alignCorrection * 100) + '% ' + baseline + 'px';
+		css(this.element, rotationStyle);
+	},
+
+	/**
+	 * Get the correction in X and Y positioning as the element is rotated.
+	 */
+	getSpanCorrection: function (width, baseline, alignCorrection) {
+		this.xCorr = -width * alignCorrection;
+		this.yCorr = -baseline;
+	}
+});
+
+// Extend SvgRenderer for useHTML option.
+extend(SVGRenderer.prototype, {
+	/**
+	 * Create HTML text node. This is used by the VML renderer as well as the SVG
+	 * renderer through the useHTML option.
+	 *
+	 * @param {String} str
+	 * @param {Number} x
+	 * @param {Number} y
+	 */
+	html: function (str, x, y) {
+		var wrapper = this.createElement('span'),
+			element = wrapper.element,
+			renderer = wrapper.renderer;
+
+		// Text setter
+		wrapper.textSetter = function (value) {
+			if (value !== element.innerHTML) {
+				delete this.bBox;
+			}
+			element.innerHTML = this.textStr = value;
+		};
+
+		// Various setters which rely on update transform
+		wrapper.xSetter = wrapper.ySetter = wrapper.alignSetter = wrapper.rotationSetter = function (value, key) {
+			if (key === 'align') {
+				key = 'textAlign'; // Do not overwrite the SVGElement.align method. Same as VML.
+			}
+			wrapper[key] = value;
+			wrapper.htmlUpdateTransform();
+		};
+
+		// Set the default attributes
+		wrapper.attr({
+				text: str,
+				x: mathRound(x),
+				y: mathRound(y)
+			})
+			.css({
+				position: ABSOLUTE,
+				whiteSpace: 'nowrap',
+				fontFamily: this.style.fontFamily,
+				fontSize: this.style.fontSize
+			});
+
+		// Use the HTML specific .css method
+		wrapper.css = wrapper.htmlCss;
+
+		// This is specific for HTML within SVG
+		if (renderer.isSVG) {
+			wrapper.add = function (svgGroupWrapper) {
+
+				var htmlGroup,
+					container = renderer.box.parentNode,
+					parentGroup,
+					parents = [];
+
+				this.parentGroup = svgGroupWrapper;
+
+				// Create a mock group to hold the HTML elements
+				if (svgGroupWrapper) {
+					htmlGroup = svgGroupWrapper.div;
+					if (!htmlGroup) {
+
+						// Read the parent chain into an array and read from top down
+						parentGroup = svgGroupWrapper;
+						while (parentGroup) {
+
+							parents.push(parentGroup);
+
+							// Move up to the next parent group
+							parentGroup = parentGroup.parentGroup;
+						}
+
+						// Ensure dynamically updating position when any parent is translated
+						each(parents.reverse(), function (parentGroup) {
+							var htmlGroupStyle;
+
+							// Create a HTML div and append it to the parent div to emulate
+							// the SVG group structure
+							htmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, {
+								className: attr(parentGroup.element, 'class')
+							}, {
+								position: ABSOLUTE,
+								left: (parentGroup.translateX || 0) + PX,
+								top: (parentGroup.translateY || 0) + PX
+							}, htmlGroup || container); // the top group is appended to container
+
+							// Shortcut
+							htmlGroupStyle = htmlGroup.style;
+
+							// Set listeners to update the HTML div's position whenever the SVG group
+							// position is changed
+							extend(parentGroup, {
+								translateXSetter: function (value, key) {
+									htmlGroupStyle.left = value + PX;
+									parentGroup[key] = value;
+									parentGroup.doTransform = true;
+								},
+								translateYSetter: function (value, key) {
+									htmlGroupStyle.top = value + PX;
+									parentGroup[key] = value;
+									parentGroup.doTransform = true;
+								},
+								visibilitySetter: function (value, key) {
+									htmlGroupStyle[key] = value;
+								}
+							});
+						});
+
+					}
+				} else {
+					htmlGroup = container;
+				}
+
+				htmlGroup.appendChild(element);
+
+				// Shared with VML:
+				wrapper.added = true;
+				if (wrapper.alignOnAdd) {
+					wrapper.htmlUpdateTransform();
+				}
+
+				return wrapper;
+			};
+		}
+		return wrapper;
+	}
+});
+
+/* ****************************************************************************
+ *                                                                            *
+ * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE                              *
+ *                                                                            *
+ * For applications and websites that don't need IE support, like platform    *
+ * targeted mobile apps and web apps, this code can be removed.               *
+ *                                                                            *
+ *****************************************************************************/
+
+/**
+ * @constructor
+ */
+var VMLRenderer, VMLElement;
+if (!hasSVG && !useCanVG) {
+
+/**
+ * The VML element wrapper.
+ */
+VMLElement = {
+
+	/**
+	 * Initialize a new VML element wrapper. It builds the markup as a string
+	 * to minimize DOM traffic.
+	 * @param {Object} renderer
+	 * @param {Object} nodeName
+	 */
+	init: function (renderer, nodeName) {
+		var wrapper = this,
+			markup =  ['<', nodeName, ' filled="f" stroked="f"'],
+			style = ['position: ', ABSOLUTE, ';'],
+			isDiv = nodeName === DIV;
+
+		// divs and shapes need size
+		if (nodeName === 'shape' || isDiv) {
+			style.push('left:0;top:0;width:1px;height:1px;');
+		}
+		style.push('visibility: ', isDiv ? HIDDEN : VISIBLE);
+
+		markup.push(' style="', style.join(''), '"/>');
+
+		// create element with default attributes and style
+		if (nodeName) {
+			markup = isDiv || nodeName === 'span' || nodeName === 'img' ?
+				markup.join('')
+				: renderer.prepVML(markup);
+			wrapper.element = createElement(markup);
+		}
+
+		wrapper.renderer = renderer;
+	},
+
+	/**
+	 * Add the node to the given parent
+	 * @param {Object} parent
+	 */
+	add: function (parent) {
+		var wrapper = this,
+			renderer = wrapper.renderer,
+			element = wrapper.element,
+			box = renderer.box,
+			inverted = parent && parent.inverted,
+
+			// get the parent node
+			parentNode = parent ?
+				parent.element || parent :
+				box;
+
+
+		// if the parent group is inverted, apply inversion on all children
+		if (inverted) { // only on groups
+			renderer.invertChild(element, parentNode);
+		}
+
+		// append it
+		parentNode.appendChild(element);
+
+		// align text after adding to be able to read offset
+		wrapper.added = true;
+		if (wrapper.alignOnAdd && !wrapper.deferUpdateTransform) {
+			wrapper.updateTransform();
+		}
+
+		// fire an event for internal hooks
+		if (wrapper.onAdd) {
+			wrapper.onAdd();
+		}
+
+		return wrapper;
+	},
+
+	/**
+	 * VML always uses htmlUpdateTransform
+	 */
+	updateTransform: SVGElement.prototype.htmlUpdateTransform,
+
+	/**
+	 * Set the rotation of a span with oldIE's filter
+	 */
+	setSpanRotation: function () {
+		// Adjust for alignment and rotation. Rotation of useHTML content is not yet implemented
+		// but it can probably be implemented for Firefox 3.5+ on user request. FF3.5+
+		// has support for CSS3 transform. The getBBox method also needs to be updated
+		// to compensate for the rotation, like it currently does for SVG.
+		// Test case: http://jsfiddle.net/highcharts/Ybt44/
+
+		var rotation = this.rotation,
+			costheta = mathCos(rotation * deg2rad),
+			sintheta = mathSin(rotation * deg2rad);
+					
+		css(this.element, {
+			filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta,
+				', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta,
+				', sizingMethod=\'auto expand\')'].join('') : NONE
+		});
+	},
+
+	/**
+	 * Get the positioning correction for the span after rotating. 
+	 */
+	getSpanCorrection: function (width, baseline, alignCorrection, rotation, align) {
+
+		var costheta = rotation ? mathCos(rotation * deg2rad) : 1,
+			sintheta = rotation ? mathSin(rotation * deg2rad) : 0,
+			height = pick(this.elemHeight, this.element.offsetHeight),
+			quad,
+			nonLeft = align && align !== 'left';
+
+		// correct x and y
+		this.xCorr = costheta < 0 && -width;
+		this.yCorr = sintheta < 0 && -height;
+
+		// correct for baseline and corners spilling out after rotation
+		quad = costheta * sintheta < 0;
+		this.xCorr += sintheta * baseline * (quad ? 1 - alignCorrection : alignCorrection);
+		this.yCorr -= costheta * baseline * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1);
+		// correct for the length/height of the text
+		if (nonLeft) {
+			this.xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1);
+			if (rotation) {
+				this.yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1);
+			}
+			css(this.element, {
+				textAlign: align
+			});
+		}
+	},
+
+	/**
+	 * Converts a subset of an SVG path definition to its VML counterpart. Takes an array
+	 * as the parameter and returns a string.
+	 */
+	pathToVML: function (value) {
+		// convert paths
+		var i = value.length,
+			path = [];
+
+		while (i--) {
+
+			// Multiply by 10 to allow subpixel precision.
+			// Substracting half a pixel seems to make the coordinates
+			// align with SVG, but this hasn't been tested thoroughly
+			if (isNumber(value[i])) {
+				path[i] = mathRound(value[i] * 10) - 5;
+			} else if (value[i] === 'Z') { // close the path
+				path[i] = 'x';
+			} else {
+				path[i] = value[i];
+
+				// When the start X and end X coordinates of an arc are too close,
+				// they are rounded to the same value above. In this case, substract or 
+				// add 1 from the end X and Y positions. #186, #760, #1371, #1410.
+				if (value.isArc && (value[i] === 'wa' || value[i] === 'at')) {
+					// Start and end X
+					if (path[i + 5] === path[i + 7]) {
+						path[i + 7] += value[i + 7] > value[i + 5] ? 1 : -1;
+					}
+					// Start and end Y
+					if (path[i + 6] === path[i + 8]) {
+						path[i + 8] += value[i + 8] > value[i + 6] ? 1 : -1;
+					}
+				}
+			}
+		}
+
+		
+		// Loop up again to handle path shortcuts (#2132)
+		/*while (i++ < path.length) {
+			if (path[i] === 'H') { // horizontal line to
+				path[i] = 'L';
+				path.splice(i + 2, 0, path[i - 1]);
+			} else if (path[i] === 'V') { // vertical line to
+				path[i] = 'L';
+				path.splice(i + 1, 0, path[i - 2]);
+			}
+		}*/
+		return path.join(' ') || 'x';
+	},
+
+	/**
+	 * Set the element's clipping to a predefined rectangle
+	 *
+	 * @param {String} id The id of the clip rectangle
+	 */
+	clip: function (clipRect) {
+		var wrapper = this,
+			clipMembers,
+			cssRet;
+
+		if (clipRect) {
+			clipMembers = clipRect.members;
+			erase(clipMembers, wrapper); // Ensure unique list of elements (#1258)
+			clipMembers.push(wrapper);
+			wrapper.destroyClip = function () {
+				erase(clipMembers, wrapper);
+			};
+			cssRet = clipRect.getCSS(wrapper);
+
+		} else {
+			if (wrapper.destroyClip) {
+				wrapper.destroyClip();
+			}
+			cssRet = { clip: docMode8 ? 'inherit' : 'rect(auto)' }; // #1214
+		}
+
+		return wrapper.css(cssRet);
+
+	},
+
+	/**
+	 * Set styles for the element
+	 * @param {Object} styles
+	 */
+	css: SVGElement.prototype.htmlCss,
+
+	/**
+	 * Removes a child either by removeChild or move to garbageBin.
+	 * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.
+	 */
+	safeRemoveChild: function (element) {
+		// discardElement will detach the node from its parent before attaching it
+		// to the garbage bin. Therefore it is important that the node is attached and have parent.
+		if (element.parentNode) {
+			discardElement(element);
+		}
+	},
+
+	/**
+	 * Extend element.destroy by removing it from the clip members array
+	 */
+	destroy: function () {
+		if (this.destroyClip) {
+			this.destroyClip();
+		}
+
+		return SVGElement.prototype.destroy.apply(this);
+	},
+
+	/**
+	 * Add an event listener. VML override for normalizing event parameters.
+	 * @param {String} eventType
+	 * @param {Function} handler
+	 */
+	on: function (eventType, handler) {
+		// simplest possible event model for internal use
+		this.element['on' + eventType] = function () {
+			var evt = win.event;
+			evt.target = evt.srcElement;
+			handler(evt);
+		};
+		return this;
+	},
+
+	/**
+	 * In stacked columns, cut off the shadows so that they don't overlap
+	 */
+	cutOffPath: function (path, length) {
+
+		var len;
+
+		path = path.split(/[ ,]/);
+		len = path.length;
+
+		if (len === 9 || len === 11) {
+			path[len - 4] = path[len - 2] = pInt(path[len - 2]) - 10 * length;
+		}
+		return path.join(' ');
+	},
+
+	/**
+	 * Apply a drop shadow by copying elements and giving them different strokes
+	 * @param {Boolean|Object} shadowOptions
+	 */
+	shadow: function (shadowOptions, group, cutOff) {
+		var shadows = [],
+			i,
+			element = this.element,
+			renderer = this.renderer,
+			shadow,
+			elemStyle = element.style,
+			markup,
+			path = element.path,
+			strokeWidth,
+			modifiedPath,
+			shadowWidth,
+			shadowElementOpacity;
+
+		// some times empty paths are not strings
+		if (path && typeof path.value !== 'string') {
+			path = 'x';
+		}
+		modifiedPath = path;
+
+		if (shadowOptions) {
+			shadowWidth = pick(shadowOptions.width, 3);
+			shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;
+			for (i = 1; i <= 3; i++) {
+
+				strokeWidth = (shadowWidth * 2) + 1 - (2 * i);
+
+				// Cut off shadows for stacked column items
+				if (cutOff) {
+					modifiedPath = this.cutOffPath(path.value, strokeWidth + 0.5);
+				}
+
+				markup = ['<shape isShadow="true" strokeweight="', strokeWidth,
+					'" filled="false" path="', modifiedPath,
+					'" coordsize="10 10" style="', element.style.cssText, '" />'];
+
+				shadow = createElement(renderer.prepVML(markup),
+					null, {
+						left: pInt(elemStyle.left) + pick(shadowOptions.offsetX, 1),
+						top: pInt(elemStyle.top) + pick(shadowOptions.offsetY, 1)
+					}
+				);
+				if (cutOff) {
+					shadow.cutOff = strokeWidth + 1;
+				}
+
+				// apply the opacity
+				markup = ['<stroke color="', shadowOptions.color || 'black', '" opacity="', shadowElementOpacity * i, '"/>'];
+				createElement(renderer.prepVML(markup), null, null, shadow);
+
+
+				// insert it
+				if (group) {
+					group.element.appendChild(shadow);
+				} else {
+					element.parentNode.insertBefore(shadow, element);
+				}
+
+				// record it
+				shadows.push(shadow);
+
+			}
+
+			this.shadows = shadows;
+		}
+		return this;
+	},
+	updateShadows: noop, // Used in SVG only
+
+	setAttr: function (key, value) {
+		if (docMode8) { // IE8 setAttribute bug
+			this.element[key] = value;
+		} else {
+			this.element.setAttribute(key, value);
+		}
+	},
+	classSetter: function (value) {
+		// IE8 Standards mode has problems retrieving the className unless set like this
+		this.element.className = value;
+	},
+	dashstyleSetter: function (value, key, element) {
+		var strokeElem = element.getElementsByTagName('stroke')[0] ||
+			createElement(this.renderer.prepVML(['<stroke/>']), null, null, element);
+		strokeElem[key] = value || 'solid';
+		this[key] = value; /* because changing stroke-width will change the dash length
+			and cause an epileptic effect */
+	},
+	dSetter: function (value, key, element) {
+		var i,
+			shadows = this.shadows;
+		value = value || [];
+		this.d = value.join && value.join(' '); // used in getter for animation
+
+		element.path = value = this.pathToVML(value);
+
+		// update shadows
+		if (shadows) {
+			i = shadows.length;
+			while (i--) {
+				shadows[i].path = shadows[i].cutOff ? this.cutOffPath(value, shadows[i].cutOff) : value;
+			}
+		}
+		this.setAttr(key, value);
+	},
+	fillSetter: function (value, key, element) {
+		var nodeName = element.nodeName;
+		if (nodeName === 'SPAN') { // text color
+			element.style.color = value;
+		} else if (nodeName !== 'IMG') { // #1336
+			element.filled = value !== NONE;
+			this.setAttr('fillcolor', this.renderer.color(value, element, key, this));
+		}
+	},
+	opacitySetter: noop, // Don't bother - animation is too slow and filters introduce artifacts
+	rotationSetter: function (value, key, element) {
+		var style = element.style;
+		this[key] = style[key] = value; // style is for #1873
+
+		// Correction for the 1x1 size of the shape container. Used in gauge needles.
+		style.left = -mathRound(mathSin(value * deg2rad) + 1) + PX;
+		style.top = mathRound(mathCos(value * deg2rad)) + PX;
+	},
+	strokeSetter: function (value, key, element) {
+		this.setAttr('strokecolor', this.renderer.color(value, element, key));
+	},
+	'stroke-widthSetter': function (value, key, element) {
+		element.stroked = !!value; // VML "stroked" attribute
+		this[key] = value; // used in getter, issue #113
+		if (isNumber(value)) {
+			value += PX;
+		}
+		this.setAttr('strokeweight', value);
+	},
+	titleSetter: function (value, key) {
+		this.setAttr(key, value);
+	},
+	visibilitySetter: function (value, key, element) {
+
+		// Handle inherited visibility
+		if (value === 'inherit') {
+			value = VISIBLE;
+		}
+		
+		// Let the shadow follow the main element
+		if (this.shadows) {
+			each(this.shadows, function (shadow) {
+				shadow.style[key] = value;
+			});
+		}
+
+		// Instead of toggling the visibility CSS property, move the div out of the viewport.
+		// This works around #61 and #586
+		if (element.nodeName === 'DIV') {
+			value = value === HIDDEN ? '-999em' : 0;
+
+			// In order to redraw, IE7 needs the div to be visible when tucked away
+			// outside the viewport. So the visibility is actually opposite of
+			// the expected value. This applies to the tooltip only.
+			if (!docMode8) {
+				element.style[key] = value ? VISIBLE : HIDDEN;
+			}
+			key = 'top';
+		}
+		element.style[key] = value;
+	},
+	xSetter: function (value, key, element) {
+		this[key] = value; // used in getter
+
+		if (key === 'x') {
+			key = 'left';
+		} else if (key === 'y') {
+			key = 'top';
+		}/* else {
+			value = mathMax(0, value); // don't set width or height below zero (#311)
+		}*/
+
+		// clipping rectangle special
+		if (this.updateClipping) {
+			this[key] = value; // the key is now 'left' or 'top' for 'x' and 'y'
+			this.updateClipping();
+		} else {
+			// normal
+			element.style[key] = value;
+		}
+	},
+	zIndexSetter: function (value, key, element) {
+		element.style[key] = value;
+	}
+};
+Highcharts.VMLElement = VMLElement = extendClass(SVGElement, VMLElement);
+
+// Some shared setters
+VMLElement.prototype.ySetter =
+	VMLElement.prototype.widthSetter = 
+	VMLElement.prototype.heightSetter = 
+	VMLElement.prototype.xSetter;
+
+
+/**
+ * The VML renderer
+ */
+var VMLRendererExtension = { // inherit SVGRenderer
+
+	Element: VMLElement,
+	isIE8: userAgent.indexOf('MSIE 8.0') > -1,
+
+
+	/**
+	 * Initialize the VMLRenderer
+	 * @param {Object} container
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	init: function (container, width, height, style) {
+		var renderer = this,
+			boxWrapper,
+			box,
+			css;
+
+		renderer.alignedObjects = [];
+
+		boxWrapper = renderer.createElement(DIV)
+			.css(extend(this.getStyle(style), { position: RELATIVE}));
+		box = boxWrapper.element;
+		container.appendChild(boxWrapper.element);
+
+
+		// generate the containing box
+		renderer.isVML = true;
+		renderer.box = box;
+		renderer.boxWrapper = boxWrapper;
+		renderer.cache = {};
+
+
+		renderer.setSize(width, height, false);
+
+		// The only way to make IE6 and IE7 print is to use a global namespace. However,
+		// with IE8 the only way to make the dynamic shapes visible in screen and print mode
+		// seems to be to add the xmlns attribute and the behaviour style inline.
+		if (!doc.namespaces.hcv) {
+
+			doc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml');
+
+			// Setup default CSS (#2153, #2368, #2384)
+			css = 'hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke' +
+				'{ behavior:url(#default#VML); display: inline-block; } ';
+			try {
+				doc.createStyleSheet().cssText = css;
+			} catch (e) {
+				doc.styleSheets[0].cssText += css;
+			}
+
+		}
+	},
+
+
+	/**
+	 * Detect whether the renderer is hidden. This happens when one of the parent elements
+	 * has display: none
+	 */
+	isHidden: function () {
+		return !this.box.offsetWidth;
+	},
+
+	/**
+	 * Define a clipping rectangle. In VML it is accomplished by storing the values
+	 * for setting the CSS style to all associated members.
+	 *
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	clipRect: function (x, y, width, height) {
+
+		// create a dummy element
+		var clipRect = this.createElement(),
+			isObj = isObject(x);
+
+		// mimic a rectangle with its style object for automatic updating in attr
+		return extend(clipRect, {
+			members: [],
+			left: (isObj ? x.x : x) + 1,
+			top: (isObj ? x.y : y) + 1,
+			width: (isObj ? x.width : width) - 1,
+			height: (isObj ? x.height : height) - 1,
+			getCSS: function (wrapper) {
+				var element = wrapper.element,
+					nodeName = element.nodeName,
+					isShape = nodeName === 'shape',
+					inverted = wrapper.inverted,
+					rect = this,
+					top = rect.top - (isShape ? element.offsetTop : 0),
+					left = rect.left,
+					right = left + rect.width,
+					bottom = top + rect.height,
+					ret = {
+						clip: 'rect(' +
+							mathRound(inverted ? left : top) + 'px,' +
+							mathRound(inverted ? bottom : right) + 'px,' +
+							mathRound(inverted ? right : bottom) + 'px,' +
+							mathRound(inverted ? top : left) + 'px)'
+					};
+
+				// issue 74 workaround
+				if (!inverted && docMode8 && nodeName === 'DIV') {
+					extend(ret, {
+						width: right + PX,
+						height: bottom + PX
+					});
+				}
+				return ret;
+			},
+
+			// used in attr and animation to update the clipping of all members
+			updateClipping: function () {
+				each(clipRect.members, function (member) {
+					if (member.element) { // Deleted series, like in stock/members/series-remove demo. Should be removed from members, but this will do.
+						member.css(clipRect.getCSS(member));
+					}
+				});
+			}
+		});
+
+	},
+
+
+	/**
+	 * Take a color and return it if it's a string, make it a gradient if it's a
+	 * gradient configuration object, and apply opacity.
+	 *
+	 * @param {Object} color The color or config object
+	 */
+	color: function (color, elem, prop, wrapper) {
+		var renderer = this,
+			colorObject,
+			regexRgba = /^rgba/,
+			markup,
+			fillType,
+			ret = NONE;
+
+		// Check for linear or radial gradient
+		if (color && color.linearGradient) {
+			fillType = 'gradient';
+		} else if (color && color.radialGradient) {
+			fillType = 'pattern';
+		}
+
+
+		if (fillType) {
+
+			var stopColor,
+				stopOpacity,
+				gradient = color.linearGradient || color.radialGradient,
+				x1,
+				y1,
+				x2,
+				y2,
+				opacity1,
+				opacity2,
+				color1,
+				color2,
+				fillAttr = '',
+				stops = color.stops,
+				firstStop,
+				lastStop,
+				colors = [],
+				addFillNode = function () {
+					// Add the fill subnode. When colors attribute is used, the meanings of opacity and o:opacity2
+					// are reversed.
+					markup = ['<fill colors="' + colors.join(',') + '" opacity="', opacity2, '" o:opacity2="', opacity1,
+						'" type="', fillType, '" ', fillAttr, 'focus="100%" method="any" />'];
+					createElement(renderer.prepVML(markup), null, null, elem);
+				};
+
+			// Extend from 0 to 1
+			firstStop = stops[0];
+			lastStop = stops[stops.length - 1];
+			if (firstStop[0] > 0) {
+				stops.unshift([
+					0,
+					firstStop[1]
+				]);
+			}
+			if (lastStop[0] < 1) {
+				stops.push([
+					1,
+					lastStop[1]
+				]);
+			}
+
+			// Compute the stops
+			each(stops, function (stop, i) {
+				if (regexRgba.test(stop[1])) {
+					colorObject = Color(stop[1]);
+					stopColor = colorObject.get('rgb');
+					stopOpacity = colorObject.get('a');
+				} else {
+					stopColor = stop[1];
+					stopOpacity = 1;
+				}
+
+				// Build the color attribute
+				colors.push((stop[0] * 100) + '% ' + stopColor);
+
+				// Only start and end opacities are allowed, so we use the first and the last
+				if (!i) {
+					opacity1 = stopOpacity;
+					color2 = stopColor;
+				} else {
+					opacity2 = stopOpacity;
+					color1 = stopColor;
+				}
+			});
+
+			// Apply the gradient to fills only.
+			if (prop === 'fill') {
+
+				// Handle linear gradient angle
+				if (fillType === 'gradient') {
+					x1 = gradient.x1 || gradient[0] || 0;
+					y1 = gradient.y1 || gradient[1] || 0;
+					x2 = gradient.x2 || gradient[2] || 0;
+					y2 = gradient.y2 || gradient[3] || 0;
+					fillAttr = 'angle="' + (90  - math.atan(
+						(y2 - y1) / // y vector
+						(x2 - x1) // x vector
+						) * 180 / mathPI) + '"';
+
+					addFillNode();
+
+				// Radial (circular) gradient
+				} else {
+
+					var r = gradient.r,
+						sizex = r * 2,
+						sizey = r * 2,
+						cx = gradient.cx,
+						cy = gradient.cy,
+						radialReference = elem.radialReference,
+						bBox,
+						applyRadialGradient = function () {
+							if (radialReference) {
+								bBox = wrapper.getBBox();
+								cx += (radialReference[0] - bBox.x) / bBox.width - 0.5;
+								cy += (radialReference[1] - bBox.y) / bBox.height - 0.5;
+								sizex *= radialReference[2] / bBox.width;
+								sizey *= radialReference[2] / bBox.height;
+							}
+							fillAttr = 'src="' + defaultOptions.global.VMLRadialGradientURL + '" ' +
+								'size="' + sizex + ',' + sizey + '" ' +
+								'origin="0.5,0.5" ' +
+								'position="' + cx + ',' + cy + '" ' +
+								'color2="' + color2 + '" ';
+
+							addFillNode();
+						};
+
+					// Apply radial gradient
+					if (wrapper.added) {
+						applyRadialGradient();
+					} else {
+						// We need to know the bounding box to get the size and position right
+						wrapper.onAdd = applyRadialGradient;
+					}
+
+					// The fill element's color attribute is broken in IE8 standards mode, so we
+					// need to set the parent shape's fillcolor attribute instead.
+					ret = color1;
+				}
+
+			// Gradients are not supported for VML stroke, return the first color. #722.
+			} else {
+				ret = stopColor;
+			}
+
+		// if the color is an rgba color, split it and add a fill node
+		// to hold the opacity component
+		} else if (regexRgba.test(color) && elem.tagName !== 'IMG') {
+
+			colorObject = Color(color);
+
+			markup = ['<', prop, ' opacity="', colorObject.get('a'), '"/>'];
+			createElement(this.prepVML(markup), null, null, elem);
+
+			ret = colorObject.get('rgb');
+
+
+		} else {
+			var propNodes = elem.getElementsByTagName(prop); // 'stroke' or 'fill' node
+			if (propNodes.length) {
+				propNodes[0].opacity = 1;
+				propNodes[0].type = 'solid';
+			}
+			ret = color;
+		}
+
+		return ret;
+	},
+
+	/**
+	 * Take a VML string and prepare it for either IE8 or IE6/IE7.
+	 * @param {Array} markup A string array of the VML markup to prepare
+	 */
+	prepVML: function (markup) {
+		var vmlStyle = 'display:inline-block;behavior:url(#default#VML);',
+			isIE8 = this.isIE8;
+
+		markup = markup.join('');
+
+		if (isIE8) { // add xmlns and style inline
+			markup = markup.replace('/>', ' xmlns="urn:schemas-microsoft-com:vml" />');
+			if (markup.indexOf('style="') === -1) {
+				markup = markup.replace('/>', ' style="' + vmlStyle + '" />');
+			} else {
+				markup = markup.replace('style="', 'style="' + vmlStyle);
+			}
+
+		} else { // add namespace
+			markup = markup.replace('<', '<hcv:');
+		}
+
+		return markup;
+	},
+
+	/**
+	 * Create rotated and aligned text
+	 * @param {String} str
+	 * @param {Number} x
+	 * @param {Number} y
+	 */
+	text: SVGRenderer.prototype.html,
+
+	/**
+	 * Create and return a path element
+	 * @param {Array} path
+	 */
+	path: function (path) {
+		var attr = {
+			// subpixel precision down to 0.1 (width and height = 1px)
+			coordsize: '10 10'
+		};
+		if (isArray(path)) {
+			attr.d = path;
+		} else if (isObject(path)) { // attributes
+			extend(attr, path);
+		}
+		// create the shape
+		return this.createElement('shape').attr(attr);
+	},
+
+	/**
+	 * Create and return a circle element. In VML circles are implemented as
+	 * shapes, which is faster than v:oval
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} r
+	 */
+	circle: function (x, y, r) {
+		var circle = this.symbol('circle');
+		if (isObject(x)) {
+			r = x.r;
+			y = x.y;
+			x = x.x;
+		}
+		circle.isCircle = true; // Causes x and y to mean center (#1682)
+		circle.r = r;
+		return circle.attr({ x: x, y: y });
+	},
+
+	/**
+	 * Create a group using an outer div and an inner v:group to allow rotating
+	 * and flipping. A simple v:group would have problems with positioning
+	 * child HTML elements and CSS clip.
+	 *
+	 * @param {String} name The name of the group
+	 */
+	g: function (name) {
+		var wrapper,
+			attribs;
+
+		// set the class name
+		if (name) {
+			attribs = { 'className': PREFIX + name, 'class': PREFIX + name };
+		}
+
+		// the div to hold HTML and clipping
+		wrapper = this.createElement(DIV).attr(attribs);
+
+		return wrapper;
+	},
+
+	/**
+	 * VML override to create a regular HTML image
+	 * @param {String} src
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	image: function (src, x, y, width, height) {
+		var obj = this.createElement('img')
+			.attr({ src: src });
+
+		if (arguments.length > 1) {
+			obj.attr({
+				x: x,
+				y: y,
+				width: width,
+				height: height
+			});
+		}
+		return obj;
+	},
+
+	/**
+	 * For rectangles, VML uses a shape for rect to overcome bugs and rotation problems
+	 */
+	createElement: function (nodeName) {
+		return nodeName === 'rect' ? this.symbol(nodeName) : SVGRenderer.prototype.createElement.call(this, nodeName);	
+	},
+
+	/**
+	 * In the VML renderer, each child of an inverted div (group) is inverted
+	 * @param {Object} element
+	 * @param {Object} parentNode
+	 */
+	invertChild: function (element, parentNode) {
+		var ren = this,
+			parentStyle = parentNode.style,
+			imgStyle = element.tagName === 'IMG' && element.style; // #1111
+
+		css(element, {
+			flip: 'x',
+			left: pInt(parentStyle.width) - (imgStyle ? pInt(imgStyle.top) : 1),
+			top: pInt(parentStyle.height) - (imgStyle ? pInt(imgStyle.left) : 1),
+			rotation: -90
+		});
+
+		// Recursively invert child elements, needed for nested composite shapes like box plots and error bars. #1680, #1806.
+		each(element.childNodes, function (child) {
+			ren.invertChild(child, element);
+		});
+	},
+
+	/**
+	 * Symbol definitions that override the parent SVG renderer's symbols
+	 *
+	 */
+	symbols: {
+		// VML specific arc function
+		arc: function (x, y, w, h, options) {
+			var start = options.start,
+				end = options.end,
+				radius = options.r || w || h,
+				innerRadius = options.innerR,
+				cosStart = mathCos(start),
+				sinStart = mathSin(start),
+				cosEnd = mathCos(end),
+				sinEnd = mathSin(end),
+				ret;
+
+			if (end - start === 0) { // no angle, don't show it.
+				return ['x'];
+			}
+
+			ret = [
+				'wa', // clockwise arc to
+				x - radius, // left
+				y - radius, // top
+				x + radius, // right
+				y + radius, // bottom
+				x + radius * cosStart, // start x
+				y + radius * sinStart, // start y
+				x + radius * cosEnd, // end x
+				y + radius * sinEnd  // end y
+			];
+
+			if (options.open && !innerRadius) {
+				ret.push(
+					'e',
+					M,
+					x,// - innerRadius,
+					y// - innerRadius
+				);
+			}
+
+			ret.push(
+				'at', // anti clockwise arc to
+				x - innerRadius, // left
+				y - innerRadius, // top
+				x + innerRadius, // right
+				y + innerRadius, // bottom
+				x + innerRadius * cosEnd, // start x
+				y + innerRadius * sinEnd, // start y
+				x + innerRadius * cosStart, // end x
+				y + innerRadius * sinStart, // end y
+				'x', // finish path
+				'e' // close
+			);
+
+			ret.isArc = true;
+			return ret;
+
+		},
+		// Add circle symbol path. This performs significantly faster than v:oval.
+		circle: function (x, y, w, h, wrapper) {
+
+			if (wrapper) {
+				w = h = 2 * wrapper.r;
+			}
+
+			// Center correction, #1682
+			if (wrapper && wrapper.isCircle) {
+				x -= w / 2;
+				y -= h / 2;
+			}
+
+			// Return the path
+			return [
+				'wa', // clockwisearcto
+				x, // left
+				y, // top
+				x + w, // right
+				y + h, // bottom
+				x + w, // start x
+				y + h / 2,     // start y
+				x + w, // end x
+				y + h / 2,     // end y
+				//'x', // finish path
+				'e' // close
+			];
+		},
+		/**
+		 * Add rectangle symbol path which eases rotation and omits arcsize problems
+		 * compared to the built-in VML roundrect shape. When borders are not rounded,
+		 * use the simpler square path, else use the callout path without the arrow.
+		 */
+		rect: function (x, y, w, h, options) {
+			return SVGRenderer.prototype.symbols[
+				!defined(options) || !options.r ? 'square' : 'callout'
+			].call(0, x, y, w, h, options);
+		}
+	}
+};
+Highcharts.VMLRenderer = VMLRenderer = function () {
+	this.init.apply(this, arguments);
+};
+VMLRenderer.prototype = merge(SVGRenderer.prototype, VMLRendererExtension);
+
+	// general renderer
+	Renderer = VMLRenderer;
+}
+
+// This method is used with exporting in old IE, when emulating SVG (see #2314)
+SVGRenderer.prototype.measureSpanWidth = function (text, styles) {
+	var measuringSpan = doc.createElement('span'),
+		offsetWidth,
+	textNode = doc.createTextNode(text);
+
+	measuringSpan.appendChild(textNode);
+	css(measuringSpan, styles);
+	this.box.appendChild(measuringSpan);
+	offsetWidth = measuringSpan.offsetWidth;
+	discardElement(measuringSpan); // #2463
+	return offsetWidth;
+};
+
+
+/* ****************************************************************************
+ *                                                                            *
+ * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE                                *
+ *                                                                            *
+ *****************************************************************************/
+/* ****************************************************************************
+ *                                                                            *
+ * START OF ANDROID < 3 SPECIFIC CODE. THIS CAN BE REMOVED IF YOU'RE NOT      *
+ * TARGETING THAT SYSTEM.                                                     *
+ *                                                                            *
+ *****************************************************************************/
+var CanVGRenderer,
+	CanVGController;
+
+if (useCanVG) {
+	/**
+	 * The CanVGRenderer is empty from start to keep the source footprint small.
+	 * When requested, the CanVGController downloads the rest of the source packaged
+	 * together with the canvg library.
+	 */
+	Highcharts.CanVGRenderer = CanVGRenderer = function () {
+		// Override the global SVG namespace to fake SVG/HTML that accepts CSS
+		SVG_NS = 'http://www.w3.org/1999/xhtml';
+	};
+
+	/**
+	 * Start with an empty symbols object. This is needed when exporting is used (exporting.src.js will add a few symbols), but 
+	 * the implementation from SvgRenderer will not be merged in until first render.
+	 */
+	CanVGRenderer.prototype.symbols = {};
+
+	/**
+	 * Handles on demand download of canvg rendering support.
+	 */
+	CanVGController = (function () {
+		// List of renderering calls
+		var deferredRenderCalls = [];
+
+		/**
+		 * When downloaded, we are ready to draw deferred charts.
+		 */
+		function drawDeferred() {
+			var callLength = deferredRenderCalls.length,
+				callIndex;
+
+			// Draw all pending render calls
+			for (callIndex = 0; callIndex < callLength; callIndex++) {
+				deferredRenderCalls[callIndex]();
+			}
+			// Clear the list
+			deferredRenderCalls = [];
+		}
+
+		return {
+			push: function (func, scriptLocation) {
+				// Only get the script once
+				if (deferredRenderCalls.length === 0) {
+					getScript(scriptLocation, drawDeferred);
+				}
+				// Register render call
+				deferredRenderCalls.push(func);
+			}
+		};
+	}());
+
+	Renderer = CanVGRenderer;
+} // end CanVGRenderer
+
+/* ****************************************************************************
+ *                                                                            *
+ * END OF ANDROID < 3 SPECIFIC CODE                                           *
+ *                                                                            *
+ *****************************************************************************/
+
+/**
+ * The Tick class
+ */
+function Tick(axis, pos, type, noLabel) {
+	this.axis = axis;
+	this.pos = pos;
+	this.type = type || '';
+	this.isNew = true;
+
+	if (!type && !noLabel) {
+		this.addLabel();
+	}
+}
+
+Tick.prototype = {
+	/**
+	 * Write the tick label
+	 */
+	addLabel: function () {
+		var tick = this,
+			axis = tick.axis,
+			options = axis.options,
+			chart = axis.chart,
+			horiz = axis.horiz,
+			categories = axis.categories,
+			names = axis.names,
+			pos = tick.pos,
+			labelOptions = options.labels,
+			rotation = labelOptions.rotation,
+			str,
+			tickPositions = axis.tickPositions,
+			width = (horiz && categories &&
+				!labelOptions.step && !labelOptions.staggerLines &&
+				!labelOptions.rotation &&
+				chart.plotWidth / tickPositions.length) ||
+				(!horiz && (chart.margin[3] || chart.chartWidth * 0.33)), // #1580, #1931
+			isFirst = pos === tickPositions[0],
+			isLast = pos === tickPositions[tickPositions.length - 1],
+			css,
+			attr,
+			value = categories ?
+				pick(categories[pos], names[pos], pos) :
+				pos,
+			label = tick.label,
+			tickPositionInfo = tickPositions.info,
+			dateTimeLabelFormat;
+
+		// Set the datetime label format. If a higher rank is set for this position, use that. If not,
+		// use the general format.
+		if (axis.isDatetimeAxis && tickPositionInfo) {
+			dateTimeLabelFormat = options.dateTimeLabelFormats[tickPositionInfo.higherRanks[pos] || tickPositionInfo.unitName];
+		}
+		// set properties for access in render method
+		tick.isFirst = isFirst;
+		tick.isLast = isLast;
+
+		// get the string
+		str = axis.labelFormatter.call({
+			axis: axis,
+			chart: chart,
+			isFirst: isFirst,
+			isLast: isLast,
+			dateTimeLabelFormat: dateTimeLabelFormat,
+			value: axis.isLog ? correctFloat(lin2log(value)) : value
+		});
+
+		// prepare CSS
+		css = width && { width: mathMax(1, mathRound(width - 2 * (labelOptions.padding || 10))) + PX };
+		css = extend(css, labelOptions.style);
+
+		// first call
+		if (!defined(label)) {
+			attr = {
+				align: axis.labelAlign
+			};
+			if (isNumber(rotation)) {
+				attr.rotation = rotation;
+			}
+			if (width && labelOptions.ellipsis) {
+				css.HcHeight = axis.len / tickPositions.length;
+			}
+
+			tick.label = label =
+				defined(str) && labelOptions.enabled ?
+					chart.renderer.text(
+							str,
+							0,
+							0,
+							labelOptions.useHTML
+						)
+						.attr(attr)
+						// without position absolute, IE export sometimes is wrong
+						.css(css)
+						.add(axis.labelGroup) :
+					null;
+
+			// Set the tick baseline and correct for rotation (#1764)
+			axis.tickBaseline = chart.renderer.fontMetrics(labelOptions.style.fontSize, label).b;
+			if (rotation && axis.side === 2) {
+				axis.tickBaseline *= mathCos(rotation * deg2rad);
+			}
+
+
+		// update
+		} else if (label) {
+			label.attr({
+					text: str
+				})
+				.css(css);
+		}
+		tick.yOffset = label ? pick(labelOptions.y, axis.tickBaseline + (axis.side === 2 ? 8 : -(label.getBBox().height / 2))) : 0;
+	},
+
+	/**
+	 * Get the offset height or width of the label
+	 */
+	getLabelSize: function () {
+		var label = this.label,
+			axis = this.axis;
+		return label ?
+			label.getBBox()[axis.horiz ? 'height' : 'width'] :
+			0;
+	},
+
+	/**
+	 * Find how far the labels extend to the right and left of the tick's x position. Used for anti-collision
+	 * detection with overflow logic.
+	 */
+	getLabelSides: function () {
+		var bBox = this.label.getBBox(),
+			axis = this.axis,
+			horiz = axis.horiz,
+			options = axis.options,
+			labelOptions = options.labels,
+			size = horiz ? bBox.width : bBox.height,
+			leftSide = horiz ?
+				labelOptions.x - size * { left: 0, center: 0.5, right: 1 }[axis.labelAlign] :
+				0,
+			rightSide = horiz ?
+				size + leftSide :
+				size;
+
+		return [leftSide, rightSide];
+	},
+
+	/**
+	 * Handle the label overflow by adjusting the labels to the left and right edge, or
+	 * hide them if they collide into the neighbour label.
+	 */
+	handleOverflow: function (index, xy) {
+		var show = true,
+			axis = this.axis,
+			isFirst = this.isFirst,
+			isLast = this.isLast,
+			horiz = axis.horiz,
+			pxPos = horiz ? xy.x : xy.y,
+			reversed = axis.reversed,
+			tickPositions = axis.tickPositions,
+			sides = this.getLabelSides(),
+			leftSide = sides[0],
+			rightSide = sides[1],
+			axisLeft,
+			axisRight,
+			neighbour,
+			neighbourEdge,
+			line = this.label.line || 0,
+			labelEdge = axis.labelEdge,
+			justifyLabel = axis.justifyLabels && (isFirst || isLast),
+			justifyToPlot;
+
+		// Hide it if it now overlaps the neighbour label
+		if (labelEdge[line] === UNDEFINED || pxPos + leftSide > labelEdge[line]) {
+			labelEdge[line] = pxPos + rightSide;
+
+		} else if (!justifyLabel) {
+			show = false;
+		}
+
+		if (justifyLabel) {
+			justifyToPlot = axis.justifyToPlot;
+			axisLeft = justifyToPlot ? axis.pos : 0;
+			axisRight = justifyToPlot ? axisLeft + axis.len : axis.chart.chartWidth;
+
+			// Find the firsth neighbour on the same line
+			do {
+				index += (isFirst ? 1 : -1);
+				neighbour = axis.ticks[tickPositions[index]];
+			} while (tickPositions[index] && (!neighbour || !neighbour.label || neighbour.label.line !== line)); // #3044
+
+			neighbourEdge = neighbour && neighbour.label.xy && neighbour.label.xy.x + neighbour.getLabelSides()[isFirst ? 0 : 1];
+
+			if ((isFirst && !reversed) || (isLast && reversed)) {
+				// Is the label spilling out to the left of the plot area?
+				if (pxPos + leftSide < axisLeft) {
+
+					// Align it to plot left
+					pxPos = axisLeft - leftSide;
+
+					// Hide it if it now overlaps the neighbour label
+					if (neighbour && pxPos + rightSide > neighbourEdge) {
+						show = false;
+					}
+				}
+
+			} else {
+				// Is the label spilling out to the right of the plot area?
+				if (pxPos + rightSide > axisRight) {
+
+					// Align it to plot right
+					pxPos = axisRight - rightSide;
+
+					// Hide it if it now overlaps the neighbour label
+					if (neighbour && pxPos + leftSide < neighbourEdge) {
+						show = false;
+					}
+
+				}
+			}
+
+			// Set the modified x position of the label
+			xy.x = pxPos;
+		}
+		return show;
+	},
+
+	/**
+	 * Get the x and y position for ticks and labels
+	 */
+	getPosition: function (horiz, pos, tickmarkOffset, old) {
+		var axis = this.axis,
+			chart = axis.chart,
+			cHeight = (old && chart.oldChartHeight) || chart.chartHeight;
+
+		return {
+			x: horiz ?
+				axis.translate(pos + tickmarkOffset, null, null, old) + axis.transB :
+				axis.left + axis.offset + (axis.opposite ? ((old && chart.oldChartWidth) || chart.chartWidth) - axis.right - axis.left : 0),
+
+			y: horiz ?
+				cHeight - axis.bottom + axis.offset - (axis.opposite ? axis.height : 0) :
+				cHeight - axis.translate(pos + tickmarkOffset, null, null, old) - axis.transB
+		};
+
+	},
+
+	/**
+	 * Get the x, y position of the tick label
+	 */
+	getLabelPosition: function (x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {
+		var axis = this.axis,
+			transA = axis.transA,
+			reversed = axis.reversed,
+			staggerLines = axis.staggerLines;
+
+		x = x + labelOptions.x - (tickmarkOffset && horiz ?
+			tickmarkOffset * transA * (reversed ? -1 : 1) : 0);
+		y = y + this.yOffset - (tickmarkOffset && !horiz ?
+			tickmarkOffset * transA * (reversed ? 1 : -1) : 0);
+
+		// Correct for staggered labels
+		if (staggerLines) {
+			label.line = (index / (step || 1) % staggerLines);
+			y += label.line * (axis.labelOffset / staggerLines);
+		}
+
+		return {
+			x: x,
+			y: y
+		};
+	},
+
+	/**
+	 * Extendible method to return the path of the marker
+	 */
+	getMarkPath: function (x, y, tickLength, tickWidth, horiz, renderer) {
+		return renderer.crispLine([
+				M,
+				x,
+				y,
+				L,
+				x + (horiz ? 0 : -tickLength),
+				y + (horiz ? tickLength : 0)
+			], tickWidth);
+	},
+
+	/**
+	 * Put everything in place
+	 *
+	 * @param index {Number}
+	 * @param old {Boolean} Use old coordinates to prepare an animation into new position
+	 */
+	render: function (index, old, opacity) {
+		var tick = this,
+			axis = tick.axis,
+			options = axis.options,
+			chart = axis.chart,
+			renderer = chart.renderer,
+			horiz = axis.horiz,
+			type = tick.type,
+			label = tick.label,
+			pos = tick.pos,
+			labelOptions = options.labels,
+			gridLine = tick.gridLine,
+			gridPrefix = type ? type + 'Grid' : 'grid',
+			tickPrefix = type ? type + 'Tick' : 'tick',
+			gridLineWidth = options[gridPrefix + 'LineWidth'],
+			gridLineColor = options[gridPrefix + 'LineColor'],
+			dashStyle = options[gridPrefix + 'LineDashStyle'],
+			tickLength = options[tickPrefix + 'Length'],
+			tickWidth = options[tickPrefix + 'Width'] || 0,
+			tickColor = options[tickPrefix + 'Color'],
+			tickPosition = options[tickPrefix + 'Position'],
+			gridLinePath,
+			mark = tick.mark,
+			markPath,
+			step = labelOptions.step,
+			attribs,
+			show = true,
+			tickmarkOffset = axis.tickmarkOffset,
+			xy = tick.getPosition(horiz, pos, tickmarkOffset, old),
+			x = xy.x,
+			y = xy.y,
+			reverseCrisp = ((horiz && x === axis.pos + axis.len) || (!horiz && y === axis.pos)) ? -1 : 1; // #1480, #1687
+
+		opacity = pick(opacity, 1);
+		this.isActive = true;
+
+		// create the grid line
+		if (gridLineWidth) {
+			gridLinePath = axis.getPlotLinePath(pos + tickmarkOffset, gridLineWidth * reverseCrisp, old, true);
+
+			if (gridLine === UNDEFINED) {
+				attribs = {
+					stroke: gridLineColor,
+					'stroke-width': gridLineWidth
+				};
+				if (dashStyle) {
+					attribs.dashstyle = dashStyle;
+				}
+				if (!type) {
+					attribs.zIndex = 1;
+				}
+				if (old) {
+					attribs.opacity = 0;
+				}
+				tick.gridLine = gridLine =
+					gridLineWidth ?
+						renderer.path(gridLinePath)
+							.attr(attribs).add(axis.gridGroup) :
+						null;
+			}
+
+			// If the parameter 'old' is set, the current call will be followed
+			// by another call, therefore do not do any animations this time
+			if (!old && gridLine && gridLinePath) {
+				gridLine[tick.isNew ? 'attr' : 'animate']({
+					d: gridLinePath,
+					opacity: opacity
+				});
+			}
+		}
+
+		// create the tick mark
+		if (tickWidth && tickLength) {
+
+			// negate the length
+			if (tickPosition === 'inside') {
+				tickLength = -tickLength;
+			}
+			if (axis.opposite) {
+				tickLength = -tickLength;
+			}
+
+			markPath = tick.getMarkPath(x, y, tickLength, tickWidth * reverseCrisp, horiz, renderer);
+			if (mark) { // updating
+				mark.animate({
+					d: markPath,
+					opacity: opacity
+				});
+			} else { // first time
+				tick.mark = renderer.path(
+					markPath
+				).attr({
+					stroke: tickColor,
+					'stroke-width': tickWidth,
+					opacity: opacity
+				}).add(axis.axisGroup);
+			}
+		}
+
+		// the label is created on init - now move it into place
+		if (label && !isNaN(x)) {
+			label.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);
+
+			// Apply show first and show last. If the tick is both first and last, it is
+			// a single centered tick, in which case we show the label anyway (#2100).
+			if ((tick.isFirst && !tick.isLast && !pick(options.showFirstLabel, 1)) ||
+					(tick.isLast && !tick.isFirst && !pick(options.showLastLabel, 1))) {
+				show = false;
+
+			// Handle label overflow and show or hide accordingly
+			} else if (!axis.isRadial && !labelOptions.step && !labelOptions.rotation && !old && opacity !== 0) {
+				show = tick.handleOverflow(index, xy);
+			}
+
+			// apply step
+			if (step && index % step) {
+				// show those indices dividable by step
+				show = false;
+			}
+
+			// Set the new position, and show or hide
+			if (show && !isNaN(xy.y)) {
+				xy.opacity = opacity;
+				label[tick.isNew ? 'attr' : 'animate'](xy);
+				tick.isNew = false;
+			} else {
+				label.attr('y', -9999); // #1338
+			}
+		}
+	},
+
+	/**
+	 * Destructor for the tick prototype
+	 */
+	destroy: function () {
+		destroyObjectProperties(this, this.axis);
+	}
+};
+
+/**
+ * The object wrapper for plot lines and plot bands
+ * @param {Object} options
+ */
+Highcharts.PlotLineOrBand = function (axis, options) {
+	this.axis = axis;
+
+	if (options) {
+		this.options = options;
+		this.id = options.id;
+	}
+};
+
+Highcharts.PlotLineOrBand.prototype = {
+	
+	/**
+	 * Render the plot line or plot band. If it is already existing,
+	 * move it.
+	 */
+	render: function () {
+		var plotLine = this,
+			axis = plotLine.axis,
+			horiz = axis.horiz,
+			halfPointRange = (axis.pointRange || 0) / 2,
+			options = plotLine.options,
+			optionsLabel = options.label,
+			label = plotLine.label,
+			width = options.width,
+			to = options.to,
+			from = options.from,
+			isBand = defined(from) && defined(to),
+			value = options.value,
+			dashStyle = options.dashStyle,
+			svgElem = plotLine.svgElem,
+			path = [],
+			addEvent,
+			eventType,
+			xs,
+			ys,
+			x,
+			y,
+			color = options.color,
+			zIndex = options.zIndex,
+			events = options.events,
+			attribs = {},
+			renderer = axis.chart.renderer;
+
+		// logarithmic conversion
+		if (axis.isLog) {
+			from = log2lin(from);
+			to = log2lin(to);
+			value = log2lin(value);
+		}
+
+		// plot line
+		if (width) {
+			path = axis.getPlotLinePath(value, width);
+			attribs = {
+				stroke: color,
+				'stroke-width': width
+			};
+			if (dashStyle) {
+				attribs.dashstyle = dashStyle;
+			}
+		} else if (isBand) { // plot band
+			
+			// keep within plot area
+			from = mathMax(from, axis.min - halfPointRange);
+			to = mathMin(to, axis.max + halfPointRange);
+			
+			path = axis.getPlotBandPath(from, to, options);
+			if (color) {
+				attribs.fill = color;
+			}
+			if (options.borderWidth) {
+				attribs.stroke = options.borderColor;
+				attribs['stroke-width'] = options.borderWidth;
+			}
+		} else {
+			return;
+		}
+		// zIndex
+		if (defined(zIndex)) {
+			attribs.zIndex = zIndex;
+		}
+
+		// common for lines and bands
+		if (svgElem) {
+			if (path) {
+				svgElem.animate({
+					d: path
+				}, null, svgElem.onGetPath);
+			} else {
+				svgElem.hide();
+				svgElem.onGetPath = function () {
+					svgElem.show();
+				};
+				if (label) {
+					plotLine.label = label = label.destroy();
+				}
+			}
+		} else if (path && path.length) {
+			plotLine.svgElem = svgElem = renderer.path(path)
+				.attr(attribs).add();
+
+			// events
+			if (events) {
+				addEvent = function (eventType) {
+					svgElem.on(eventType, function (e) {
+						events[eventType].apply(plotLine, [e]);
+					});
+				};
+				for (eventType in events) {
+					addEvent(eventType);
+				}
+			}
+		}
+
+		// the plot band/line label
+		if (optionsLabel && defined(optionsLabel.text) && path && path.length && axis.width > 0 && axis.height > 0) {
+			// apply defaults
+			optionsLabel = merge({
+				align: horiz && isBand && 'center',
+				x: horiz ? !isBand && 4 : 10,
+				verticalAlign : !horiz && isBand && 'middle',
+				y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,
+				rotation: horiz && !isBand && 90
+			}, optionsLabel);
+
+			// add the SVG element
+			if (!label) {
+				attribs = {
+					align: optionsLabel.textAlign || optionsLabel.align,
+					rotation: optionsLabel.rotation
+				};
+				if (defined(zIndex)) {
+					attribs.zIndex = zIndex;
+				}
+				plotLine.label = label = renderer.text(
+						optionsLabel.text,
+						0,
+						0,
+						optionsLabel.useHTML
+					)
+					.attr(attribs)
+					.css(optionsLabel.style)
+					.add();
+			}
+
+			// get the bounding box and align the label
+			// #3000 changed to better handle choice between plotband or plotline
+			xs = [path[1], path[4], (isBand ? path[6] : path[1])];
+			ys = [path[2], path[5], (isBand ? path[7] : path[2])];
+			x = arrayMin(xs);
+			y = arrayMin(ys);
+
+			label.align(optionsLabel, false, {
+				x: x,
+				y: y,
+				width: arrayMax(xs) - x,
+				height: arrayMax(ys) - y
+			});
+			label.show();
+
+		} else if (label) { // move out of sight
+			label.hide();
+		}
+
+		// chainable
+		return plotLine;
+	},
+
+	/**
+	 * Remove the plot line or band
+	 */
+	destroy: function () {
+		// remove it from the lookup
+		erase(this.axis.plotLinesAndBands, this);
+		
+		delete this.axis;
+		destroyObjectProperties(this);
+	}
+};
+
+/**
+ * Object with members for extending the Axis prototype
+ */
+
+AxisPlotLineOrBandExtension = {
+
+	/**
+	 * Create the path for a plot band
+	 */ 
+	getPlotBandPath: function (from, to) {
+		var toPath = this.getPlotLinePath(to),
+			path = this.getPlotLinePath(from);
+
+		if (path && toPath) {
+			path.push(
+				toPath[4],
+				toPath[5],
+				toPath[1],
+				toPath[2]
+			);
+		} else { // outside the axis area
+			path = null;
+		}
+		
+		return path;
+	},
+
+	addPlotBand: function (options) {
+		return this.addPlotBandOrLine(options, 'plotBands');
+	},
+	
+	addPlotLine: function (options) {
+		return this.addPlotBandOrLine(options, 'plotLines');
+	},
+
+	/**
+	 * Add a plot band or plot line after render time
+	 *
+	 * @param options {Object} The plotBand or plotLine configuration object
+	 */
+	addPlotBandOrLine: function (options, coll) {
+		var obj = new Highcharts.PlotLineOrBand(this, options).render(),
+			userOptions = this.userOptions;
+
+		if (obj) { // #2189
+			// Add it to the user options for exporting and Axis.update
+			if (coll) {
+				userOptions[coll] = userOptions[coll] || [];
+				userOptions[coll].push(options); 
+			}
+			this.plotLinesAndBands.push(obj); 
+		}
+		
+		return obj;
+	},
+
+	/**
+	 * Remove a plot band or plot line from the chart by id
+	 * @param {Object} id
+	 */
+	removePlotBandOrLine: function (id) {
+		var plotLinesAndBands = this.plotLinesAndBands,
+			options = this.options,
+			userOptions = this.userOptions,
+			i = plotLinesAndBands.length;
+		while (i--) {
+			if (plotLinesAndBands[i].id === id) {
+				plotLinesAndBands[i].destroy();
+			}
+		}
+		each([options.plotLines || [], userOptions.plotLines || [], options.plotBands || [], userOptions.plotBands || []], function (arr) {
+			i = arr.length;
+			while (i--) {
+				if (arr[i].id === id) {
+					erase(arr, arr[i]);
+				}
+			}
+		});
+	}
+};
+
+/**
+ * Create a new axis object
+ * @param {Object} chart
+ * @param {Object} options
+ */
+function Axis() {
+	this.init.apply(this, arguments);
+}
+
+Axis.prototype = {
+
+	/**
+	 * Default options for the X axis - the Y axis has extended defaults
+	 */
+	defaultOptions: {
+		// allowDecimals: null,
+		// alternateGridColor: null,
+		// categories: [],
+		dateTimeLabelFormats: {
+			millisecond: '%H:%M:%S.%L',
+			second: '%H:%M:%S',
+			minute: '%H:%M',
+			hour: '%H:%M',
+			day: '%e. %b',
+			week: '%e. %b',
+			month: '%b \'%y',
+			year: '%Y'
+		},
+		endOnTick: false,
+		gridLineColor: '#C0C0C0',
+		// gridLineDashStyle: 'solid',
+		// gridLineWidth: 0,
+		// reversed: false,
+
+		labels: defaultLabelOptions,
+			// { step: null },
+		lineColor: '#C0D0E0',
+		lineWidth: 1,
+		//linkedTo: null,
+		//max: undefined,
+		//min: undefined,
+		minPadding: 0.01,
+		maxPadding: 0.01,
+		//minRange: null,
+		minorGridLineColor: '#E0E0E0',
+		// minorGridLineDashStyle: null,
+		minorGridLineWidth: 1,
+		minorTickColor: '#A0A0A0',
+		//minorTickInterval: null,
+		minorTickLength: 2,
+		minorTickPosition: 'outside', // inside or outside
+		//minorTickWidth: 0,
+		//opposite: false,
+		//offset: 0,
+		//plotBands: [{
+		//	events: {},
+		//	zIndex: 1,
+		//	labels: { align, x, verticalAlign, y, style, rotation, textAlign }
+		//}],
+		//plotLines: [{
+		//	events: {}
+		//  dashStyle: {}
+		//	zIndex:
+		//	labels: { align, x, verticalAlign, y, style, rotation, textAlign }
+		//}],
+		//reversed: false,
+		// showFirstLabel: true,
+		// showLastLabel: true,
+		startOfWeek: 1,
+		startOnTick: false,
+		tickColor: '#C0D0E0',
+		//tickInterval: null,
+		tickLength: 10,
+		tickmarkPlacement: 'between', // on or between
+		tickPixelInterval: 100,
+		tickPosition: 'outside',
+		tickWidth: 1,
+		title: {
+			//text: null,
+			align: 'middle', // low, middle or high
+			//margin: 0 for horizontal, 10 for vertical axes,
+			//rotation: 0,
+			//side: 'outside',
+			style: {
+				color: '#707070'
+			}
+			//x: 0,
+			//y: 0
+		},
+		type: 'linear' // linear, logarithmic or datetime
+	},
+
+	/**
+	 * This options set extends the defaultOptions for Y axes
+	 */
+	defaultYAxisOptions: {
+		endOnTick: true,
+		gridLineWidth: 1,
+		tickPixelInterval: 72,
+		showLastLabel: true,
+		labels: {
+			x: -8,
+			y: 3
+		},
+		lineWidth: 0,
+		maxPadding: 0.05,
+		minPadding: 0.05,
+		startOnTick: true,
+		tickWidth: 0,
+		title: {
+			rotation: 270,
+			text: 'Values'
+		},
+		stackLabels: {
+			enabled: false,
+			//align: dynamic,
+			//y: dynamic,
+			//x: dynamic,
+			//verticalAlign: dynamic,
+			//textAlign: dynamic,
+			//rotation: 0,
+			formatter: function () {
+				return numberFormat(this.total, -1);
+			},
+			style: defaultLabelOptions.style
+		}
+	},
+
+	/**
+	 * These options extend the defaultOptions for left axes
+	 */
+	defaultLeftAxisOptions: {
+		labels: {
+			x: -15,
+			y: null
+		},
+		title: {
+			rotation: 270
+		}
+	},
+
+	/**
+	 * These options extend the defaultOptions for right axes
+	 */
+	defaultRightAxisOptions: {
+		labels: {
+			x: 15,
+			y: null
+		},
+		title: {
+			rotation: 90
+		}
+	},
+
+	/**
+	 * These options extend the defaultOptions for bottom axes
+	 */
+	defaultBottomAxisOptions: {
+		labels: {
+			x: 0,
+			y: null // based on font size
+			// overflow: undefined,
+			// staggerLines: null
+		},
+		title: {
+			rotation: 0
+		}
+	},
+	/**
+	 * These options extend the defaultOptions for left axes
+	 */
+	defaultTopAxisOptions: {
+		labels: {
+			x: 0,
+			y: -15
+			// overflow: undefined
+			// staggerLines: null
+		},
+		title: {
+			rotation: 0
+		}
+	},
+
+	/**
+	 * Initialize the axis
+	 */
+	init: function (chart, userOptions) {
+
+
+		var isXAxis = userOptions.isX,
+			axis = this;
+
+		// Flag, is the axis horizontal
+		axis.horiz = chart.inverted ? !isXAxis : isXAxis;
+
+		// Flag, isXAxis
+		axis.isXAxis = isXAxis;
+		axis.coll = isXAxis ? 'xAxis' : 'yAxis';
+
+		axis.opposite = userOptions.opposite; // needed in setOptions
+		axis.side = userOptions.side || (axis.horiz ?
+				(axis.opposite ? 0 : 2) : // top : bottom
+				(axis.opposite ? 1 : 3));  // right : left
+
+		axis.setOptions(userOptions);
+
+
+		var options = this.options,
+			type = options.type,
+			isDatetimeAxis = type === 'datetime';
+
+		axis.labelFormatter = options.labels.formatter || axis.defaultLabelFormatter; // can be overwritten by dynamic format
+
+
+		// Flag, stagger lines or not
+		axis.userOptions = userOptions;
+
+		//axis.axisTitleMargin = UNDEFINED,// = options.title.margin,
+		axis.minPixelPadding = 0;
+		//axis.ignoreMinPadding = UNDEFINED; // can be set to true by a column or bar series
+		//axis.ignoreMaxPadding = UNDEFINED;
+
+		axis.chart = chart;
+		axis.reversed = options.reversed;
+		axis.zoomEnabled = options.zoomEnabled !== false;
+
+		// Initial categories
+		axis.categories = options.categories || type === 'category';
+		axis.names = [];
+
+		// Elements
+		//axis.axisGroup = UNDEFINED;
+		//axis.gridGroup = UNDEFINED;
+		//axis.axisTitle = UNDEFINED;
+		//axis.axisLine = UNDEFINED;
+
+		// Shorthand types
+		axis.isLog = type === 'logarithmic';
+		axis.isDatetimeAxis = isDatetimeAxis;
+
+		// Flag, if axis is linked to another axis
+		axis.isLinked = defined(options.linkedTo);
+		// Linked axis.
+		//axis.linkedParent = UNDEFINED;
+
+		// Tick positions
+		//axis.tickPositions = UNDEFINED; // array containing predefined positions
+		// Tick intervals
+		//axis.tickInterval = UNDEFINED;
+		//axis.minorTickInterval = UNDEFINED;
+
+		axis.tickmarkOffset = (axis.categories && options.tickmarkPlacement === 'between') ? 0.5 : 0;
+
+		// Major ticks
+		axis.ticks = {};
+		axis.labelEdge = [];
+		// Minor ticks
+		axis.minorTicks = {};
+		//axis.tickAmount = UNDEFINED;
+
+		// List of plotLines/Bands
+		axis.plotLinesAndBands = [];
+
+		// Alternate bands
+		axis.alternateBands = {};
+
+		// Axis metrics
+		//axis.left = UNDEFINED;
+		//axis.top = UNDEFINED;
+		//axis.width = UNDEFINED;
+		//axis.height = UNDEFINED;
+		//axis.bottom = UNDEFINED;
+		//axis.right = UNDEFINED;
+		//axis.transA = UNDEFINED;
+		//axis.transB = UNDEFINED;
+		//axis.oldTransA = UNDEFINED;
+		axis.len = 0;
+		//axis.oldMin = UNDEFINED;
+		//axis.oldMax = UNDEFINED;
+		//axis.oldUserMin = UNDEFINED;
+		//axis.oldUserMax = UNDEFINED;
+		//axis.oldAxisLength = UNDEFINED;
+		axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;
+		axis.range = options.range;
+		axis.offset = options.offset || 0;
+
+
+		// Dictionary for stacks
+		axis.stacks = {};
+		axis.oldStacks = {};
+		
+		// Min and max in the data
+		//axis.dataMin = UNDEFINED,
+		//axis.dataMax = UNDEFINED,
+
+		// The axis range
+		axis.max = null;
+		axis.min = null;
+
+		// User set min and max
+		//axis.userMin = UNDEFINED,
+		//axis.userMax = UNDEFINED,
+
+		// Crosshair options
+		axis.crosshair = pick(options.crosshair, splat(chart.options.tooltip.crosshairs)[isXAxis ? 0 : 1], false);
+		// Run Axis
+
+		var eventType,
+			events = axis.options.events;
+
+		// Register
+		if (inArray(axis, chart.axes) === -1) { // don't add it again on Axis.update()
+			if (isXAxis && !this.isColorAxis) { // #2713
+				chart.axes.splice(chart.xAxis.length, 0, axis);
+			} else {
+				chart.axes.push(axis);
+			}
+
+			chart[axis.coll].push(axis);
+		}
+
+		axis.series = axis.series || []; // populated by Series
+
+		// inverted charts have reversed xAxes as default
+		if (chart.inverted && isXAxis && axis.reversed === UNDEFINED) {
+			axis.reversed = true;
+		}
+
+		axis.removePlotBand = axis.removePlotBandOrLine;
+		axis.removePlotLine = axis.removePlotBandOrLine;
+
+
+		// register event listeners
+		for (eventType in events) {
+			addEvent(axis, eventType, events[eventType]);
+		}
+
+		// extend logarithmic axis
+		if (axis.isLog) {
+			axis.val2lin = log2lin;
+			axis.lin2val = lin2log;
+		}
+	},
+
+	/**
+	 * Merge and set options
+	 */
+	setOptions: function (userOptions) {
+		this.options = merge(
+			this.defaultOptions,
+			this.isXAxis ? {} : this.defaultYAxisOptions,
+			[this.defaultTopAxisOptions, this.defaultRightAxisOptions,
+				this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side],
+			merge(
+				defaultOptions[this.coll], // if set in setOptions (#1053)
+				userOptions
+			)
+		);
+	},
+
+	/**
+	 * The default label formatter. The context is a special config object for the label.
+	 */
+	defaultLabelFormatter: function () {
+		var axis = this.axis,
+			value = this.value,
+			categories = axis.categories,
+			dateTimeLabelFormat = this.dateTimeLabelFormat,
+			numericSymbols = defaultOptions.lang.numericSymbols,
+			i = numericSymbols && numericSymbols.length,
+			multi,
+			ret,
+			formatOption = axis.options.labels.format,
+
+			// make sure the same symbol is added for all labels on a linear axis
+			numericSymbolDetector = axis.isLog ? value : axis.tickInterval;
+
+		if (formatOption) {
+			ret = format(formatOption, this);
+
+		} else if (categories) {
+			ret = value;
+
+		} else if (dateTimeLabelFormat) { // datetime axis
+			ret = dateFormat(dateTimeLabelFormat, value);
+
+		} else if (i && numericSymbolDetector >= 1000) {
+			// Decide whether we should add a numeric symbol like k (thousands) or M (millions).
+			// If we are to enable this in tooltip or other places as well, we can move this
+			// logic to the numberFormatter and enable it by a parameter.
+			while (i-- && ret === UNDEFINED) {
+				multi = Math.pow(1000, i + 1);
+				if (numericSymbolDetector >= multi && numericSymbols[i] !== null) {
+					ret = numberFormat(value / multi, -1) + numericSymbols[i];
+				}
+			}
+		}
+
+		if (ret === UNDEFINED) {
+			if (mathAbs(value) >= 10000) { // add thousands separators
+				ret = numberFormat(value, 0);
+
+			} else { // small numbers
+				ret = numberFormat(value, -1, UNDEFINED, ''); // #2466
+			}
+		}
+
+		return ret;
+	},
+
+	/**
+	 * Get the minimum and maximum for the series of each axis
+	 */
+	getSeriesExtremes: function () {
+		var axis = this,
+			chart = axis.chart;
+
+		axis.hasVisibleSeries = false;
+
+		// reset dataMin and dataMax in case we're redrawing
+		axis.dataMin = axis.dataMax = null;
+		
+		if (axis.buildStacks) {
+			axis.buildStacks();
+		}
+
+		// loop through this axis' series
+		each(axis.series, function (series) {
+
+			if (series.visible || !chart.options.chart.ignoreHiddenSeries) {
+
+				var seriesOptions = series.options,
+					xData,
+					threshold = seriesOptions.threshold,
+					seriesDataMin,
+					seriesDataMax;
+
+				axis.hasVisibleSeries = true;
+
+				// Validate threshold in logarithmic axes
+				if (axis.isLog && threshold <= 0) {
+					threshold = null;
+				}
+
+				// Get dataMin and dataMax for X axes
+				if (axis.isXAxis) {
+					xData = series.xData;
+					if (xData.length) {
+						axis.dataMin = mathMin(pick(axis.dataMin, xData[0]), arrayMin(xData));
+						axis.dataMax = mathMax(pick(axis.dataMax, xData[0]), arrayMax(xData));
+					}
+
+				// Get dataMin and dataMax for Y axes, as well as handle stacking and processed data
+				} else {
+
+					// Get this particular series extremes
+					series.getExtremes();
+					seriesDataMax = series.dataMax;
+					seriesDataMin = series.dataMin;
+
+					// Get the dataMin and dataMax so far. If percentage is used, the min and max are
+					// always 0 and 100. If seriesDataMin and seriesDataMax is null, then series
+					// doesn't have active y data, we continue with nulls
+					if (defined(seriesDataMin) && defined(seriesDataMax)) {
+						axis.dataMin = mathMin(pick(axis.dataMin, seriesDataMin), seriesDataMin);
+						axis.dataMax = mathMax(pick(axis.dataMax, seriesDataMax), seriesDataMax);
+					}
+
+					// Adjust to threshold
+					if (defined(threshold)) {
+						if (axis.dataMin >= threshold) {
+							axis.dataMin = threshold;
+							axis.ignoreMinPadding = true;
+						} else if (axis.dataMax < threshold) {
+							axis.dataMax = threshold;
+							axis.ignoreMaxPadding = true;
+						}
+					}
+				}
+			}
+		});
+	},
+
+	/**
+	 * Translate from axis value to pixel position on the chart, or back
+	 *
+	 */
+	translate: function (val, backwards, cvsCoord, old, handleLog, pointPlacement) {
+		var axis = this,
+			sign = 1,
+			cvsOffset = 0,
+			localA = old ? axis.oldTransA : axis.transA,
+			localMin = old ? axis.oldMin : axis.min,
+			returnValue,
+			minPixelPadding = axis.minPixelPadding,
+			postTranslate = (axis.options.ordinal || (axis.isLog && handleLog)) && axis.lin2val;
+
+		if (!localA) {
+			localA = axis.transA;
+		}
+
+		// In vertical axes, the canvas coordinates start from 0 at the top like in
+		// SVG.
+		if (cvsCoord) {
+			sign *= -1; // canvas coordinates inverts the value
+			cvsOffset = axis.len;
+		}
+
+		// Handle reversed axis
+		if (axis.reversed) {
+			sign *= -1;
+			cvsOffset -= sign * (axis.sector || axis.len);
+		}
+
+		// From pixels to value
+		if (backwards) { // reverse translation
+
+			val = val * sign + cvsOffset;
+			val -= minPixelPadding;
+			returnValue = val / localA + localMin; // from chart pixel to value
+			if (postTranslate) { // log and ordinal axes
+				returnValue = axis.lin2val(returnValue);
+			}
+
+		// From value to pixels
+		} else {
+			if (postTranslate) { // log and ordinal axes
+				val = axis.val2lin(val);
+			}
+			if (pointPlacement === 'between') {
+				pointPlacement = 0.5;
+			}
+			returnValue = sign * (val - localMin) * localA + cvsOffset + (sign * minPixelPadding) +
+				(isNumber(pointPlacement) ? localA * pointPlacement * axis.pointRange : 0);
+		}
+
+		return returnValue;
+	},
+
+	/**
+	 * Utility method to translate an axis value to pixel position.
+	 * @param {Number} value A value in terms of axis units
+	 * @param {Boolean} paneCoordinates Whether to return the pixel coordinate relative to the chart
+	 *        or just the axis/pane itself.
+	 */
+	toPixels: function (value, paneCoordinates) {
+		return this.translate(value, false, !this.horiz, null, true) + (paneCoordinates ? 0 : this.pos);
+	},
+
+	/*
+	 * Utility method to translate a pixel position in to an axis value
+	 * @param {Number} pixel The pixel value coordinate
+	 * @param {Boolean} paneCoordiantes Whether the input pixel is relative to the chart or just the
+	 *        axis/pane itself.
+	 */
+	toValue: function (pixel, paneCoordinates) {
+		return this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, null, true);
+	},
+
+	/**
+	 * Create the path for a plot line that goes from the given value on
+	 * this axis, across the plot to the opposite side
+	 * @param {Number} value
+	 * @param {Number} lineWidth Used for calculation crisp line
+	 * @param {Number] old Use old coordinates (for resizing and rescaling)
+	 */
+	getPlotLinePath: function (value, lineWidth, old, force, translatedValue) {
+		var axis = this,
+			chart = axis.chart,
+			axisLeft = axis.left,
+			axisTop = axis.top,
+			x1,
+			y1,
+			x2,
+			y2,
+			cHeight = (old && chart.oldChartHeight) || chart.chartHeight,
+			cWidth = (old && chart.oldChartWidth) || chart.chartWidth,
+			skip,
+			transB = axis.transB;
+
+		translatedValue = pick(translatedValue, axis.translate(value, null, null, old));
+		x1 = x2 = mathRound(translatedValue + transB);
+		y1 = y2 = mathRound(cHeight - translatedValue - transB);
+
+		if (isNaN(translatedValue)) { // no min or max
+			skip = true;
+
+		} else if (axis.horiz) {
+			y1 = axisTop;
+			y2 = cHeight - axis.bottom;
+			if (x1 < axisLeft || x1 > axisLeft + axis.width) {
+				skip = true;
+			}
+		} else {
+			x1 = axisLeft;
+			x2 = cWidth - axis.right;
+
+			if (y1 < axisTop || y1 > axisTop + axis.height) {
+				skip = true;
+			}
+		}
+		return skip && !force ?
+			null :
+			chart.renderer.crispLine([M, x1, y1, L, x2, y2], lineWidth || 1);
+	},
+
+	/**
+	 * Set the tick positions of a linear axis to round values like whole tens or every five.
+	 */
+	getLinearTickPositions: function (tickInterval, min, max) {
+		var pos,
+			lastPos,
+			roundedMin = correctFloat(mathFloor(min / tickInterval) * tickInterval),
+			roundedMax = correctFloat(mathCeil(max / tickInterval) * tickInterval),
+			tickPositions = [];
+
+		// For single points, add a tick regardless of the relative position (#2662)
+		if (min === max && isNumber(min)) {
+			return [min];
+		}
+
+		// Populate the intermediate values
+		pos = roundedMin;
+		while (pos <= roundedMax) {
+
+			// Place the tick on the rounded value
+			tickPositions.push(pos);
+
+			// Always add the raw tickInterval, not the corrected one.
+			pos = correctFloat(pos + tickInterval);
+
+			// If the interval is not big enough in the current min - max range to actually increase
+			// the loop variable, we need to break out to prevent endless loop. Issue #619
+			if (pos === lastPos) {
+				break;
+			}
+
+			// Record the last value
+			lastPos = pos;
+		}
+		return tickPositions;
+	},
+
+	/**
+	 * Return the minor tick positions. For logarithmic axes, reuse the same logic
+	 * as for major ticks.
+	 */
+	getMinorTickPositions: function () {
+		var axis = this,
+			options = axis.options,
+			tickPositions = axis.tickPositions,
+			minorTickInterval = axis.minorTickInterval,
+			minorTickPositions = [],
+			pos,
+			i,
+			len;
+
+		if (axis.isLog) {
+			len = tickPositions.length;
+			for (i = 1; i < len; i++) {
+				minorTickPositions = minorTickPositions.concat(
+					axis.getLogTickPositions(minorTickInterval, tickPositions[i - 1], tickPositions[i], true)
+				);
+			}
+		} else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314
+			minorTickPositions = minorTickPositions.concat(
+				axis.getTimeTicks(
+					axis.normalizeTimeTickInterval(minorTickInterval),
+					axis.min,
+					axis.max,
+					options.startOfWeek
+				)
+			);
+			if (minorTickPositions[0] < axis.min) {
+				minorTickPositions.shift();
+			}
+		} else {
+			for (pos = axis.min + (tickPositions[0] - axis.min) % minorTickInterval; pos <= axis.max; pos += minorTickInterval) {
+				minorTickPositions.push(pos);
+			}
+		}
+		return minorTickPositions;
+	},
+
+	/**
+	 * Adjust the min and max for the minimum range. Keep in mind that the series data is
+	 * not yet processed, so we don't have information on data cropping and grouping, or
+	 * updated axis.pointRange or series.pointRange. The data can't be processed until
+	 * we have finally established min and max.
+	 */
+	adjustForMinRange: function () {
+		var axis = this,
+			options = axis.options,
+			min = axis.min,
+			max = axis.max,
+			zoomOffset,
+			spaceAvailable = axis.dataMax - axis.dataMin >= axis.minRange,
+			closestDataRange,
+			i,
+			distance,
+			xData,
+			loopLength,
+			minArgs,
+			maxArgs;
+
+		// Set the automatic minimum range based on the closest point distance
+		if (axis.isXAxis && axis.minRange === UNDEFINED && !axis.isLog) {
+
+			if (defined(options.min) || defined(options.max)) {
+				axis.minRange = null; // don't do this again
+
+			} else {
+
+				// Find the closest distance between raw data points, as opposed to
+				// closestPointRange that applies to processed points (cropped and grouped)
+				each(axis.series, function (series) {
+					xData = series.xData;
+					loopLength = series.xIncrement ? 1 : xData.length - 1;
+					for (i = loopLength; i > 0; i--) {
+						distance = xData[i] - xData[i - 1];
+						if (closestDataRange === UNDEFINED || distance < closestDataRange) {
+							closestDataRange = distance;
+						}
+					}
+				});
+				axis.minRange = mathMin(closestDataRange * 5, axis.dataMax - axis.dataMin);
+			}
+		}
+
+		// if minRange is exceeded, adjust
+		if (max - min < axis.minRange) {
+			var minRange = axis.minRange;
+			zoomOffset = (minRange - max + min) / 2;
+
+			// if min and max options have been set, don't go beyond it
+			minArgs = [min - zoomOffset, pick(options.min, min - zoomOffset)];
+			if (spaceAvailable) { // if space is available, stay within the data range
+				minArgs[2] = axis.dataMin;
+			}
+			min = arrayMax(minArgs);
+
+			maxArgs = [min + minRange, pick(options.max, min + minRange)];
+			if (spaceAvailable) { // if space is availabe, stay within the data range
+				maxArgs[2] = axis.dataMax;
+			}
+
+			max = arrayMin(maxArgs);
+
+			// now if the max is adjusted, adjust the min back
+			if (max - min < minRange) {
+				minArgs[0] = max - minRange;
+				minArgs[1] = pick(options.min, max - minRange);
+				min = arrayMax(minArgs);
+			}
+		}
+
+		// Record modified extremes
+		axis.min = min;
+		axis.max = max;
+	},
+
+	/**
+	 * Update translation information
+	 */
+	setAxisTranslation: function (saveOld) {
+		var axis = this,
+			range = axis.max - axis.min,
+			pointRange = axis.axisPointRange || 0,
+			closestPointRange,
+			minPointOffset = 0,
+			pointRangePadding = 0,
+			linkedParent = axis.linkedParent,
+			ordinalCorrection,
+			hasCategories = !!axis.categories,
+			transA = axis.transA;
+
+		// Adjust translation for padding. Y axis with categories need to go through the same (#1784).
+		if (axis.isXAxis || hasCategories || pointRange) {
+			if (linkedParent) {
+				minPointOffset = linkedParent.minPointOffset;
+				pointRangePadding = linkedParent.pointRangePadding;
+
+			} else {
+				each(axis.series, function (series) {
+					var seriesPointRange = hasCategories ? 1 : (axis.isXAxis ? series.pointRange : (axis.axisPointRange || 0)), // #2806
+						pointPlacement = series.options.pointPlacement,
+						seriesClosestPointRange = series.closestPointRange;
+
+					if (seriesPointRange > range) { // #1446
+						seriesPointRange = 0;
+					}
+					pointRange = mathMax(pointRange, seriesPointRange);
+
+					// minPointOffset is the value padding to the left of the axis in order to make
+					// room for points with a pointRange, typically columns. When the pointPlacement option
+					// is 'between' or 'on', this padding does not apply.
+					minPointOffset = mathMax(
+						minPointOffset,
+						isString(pointPlacement) ? 0 : seriesPointRange / 2
+					);
+
+					// Determine the total padding needed to the length of the axis to make room for the
+					// pointRange. If the series' pointPlacement is 'on', no padding is added.
+					pointRangePadding = mathMax(
+						pointRangePadding,
+						pointPlacement === 'on' ? 0 : seriesPointRange
+					);
+
+					// Set the closestPointRange
+					if (!series.noSharedTooltip && defined(seriesClosestPointRange)) {
+						closestPointRange = defined(closestPointRange) ?
+							mathMin(closestPointRange, seriesClosestPointRange) :
+							seriesClosestPointRange;
+					}
+				});
+			}
+
+			// Record minPointOffset and pointRangePadding
+			ordinalCorrection = axis.ordinalSlope && closestPointRange ? axis.ordinalSlope / closestPointRange : 1; // #988, #1853
+			axis.minPointOffset = minPointOffset = minPointOffset * ordinalCorrection;
+			axis.pointRangePadding = pointRangePadding = pointRangePadding * ordinalCorrection;
+
+			// pointRange means the width reserved for each point, like in a column chart
+			axis.pointRange = mathMin(pointRange, range);
+
+			// closestPointRange means the closest distance between points. In columns
+			// it is mostly equal to pointRange, but in lines pointRange is 0 while closestPointRange
+			// is some other value
+			axis.closestPointRange = closestPointRange;
+		}
+
+		// Secondary values
+		if (saveOld) {
+			axis.oldTransA = transA;
+		}
+		axis.translationSlope = axis.transA = transA = axis.len / ((range + pointRangePadding) || 1);
+		axis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend
+		axis.minPixelPadding = transA * minPointOffset;
+	},
+
+	/**
+	 * Set the tick positions to round values and optionally extend the extremes
+	 * to the nearest tick
+	 */
+	setTickPositions: function (secondPass) {
+		var axis = this,
+			chart = axis.chart,
+			options = axis.options,
+			startOnTick = options.startOnTick,
+			endOnTick = options.endOnTick,
+			isLog = axis.isLog,
+			isDatetimeAxis = axis.isDatetimeAxis,
+			isXAxis = axis.isXAxis,
+			isLinked = axis.isLinked,
+			tickPositioner = axis.options.tickPositioner,
+			maxPadding = options.maxPadding,
+			minPadding = options.minPadding,
+			length,
+			linkedParentExtremes,
+			tickIntervalOption = options.tickInterval,
+			minTickIntervalOption = options.minTickInterval,
+			tickPixelIntervalOption = options.tickPixelInterval,
+			tickPositions,
+			keepTwoTicksOnly,
+			categories = axis.categories;
+
+		// linked axis gets the extremes from the parent axis
+		if (isLinked) {
+			axis.linkedParent = chart[axis.coll][options.linkedTo];
+			linkedParentExtremes = axis.linkedParent.getExtremes();
+			axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);
+			axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);
+			if (options.type !== axis.linkedParent.options.type) {
+				error(11, 1); // Can't link axes of different type
+			}
+		} else { // initial min and max from the extreme data values
+			axis.min = pick(axis.userMin, options.min, axis.dataMin);
+			axis.max = pick(axis.userMax, options.max, axis.dataMax);
+		}
+
+		if (isLog) {
+			if (!secondPass && mathMin(axis.min, pick(axis.dataMin, axis.min)) <= 0) { // #978
+				error(10, 1); // Can't plot negative values on log axis
+			}
+			axis.min = correctFloat(log2lin(axis.min)); // correctFloat cures #934
+			axis.max = correctFloat(log2lin(axis.max));
+		}
+
+		// handle zoomed range
+		if (axis.range && defined(axis.max)) {
+			axis.userMin = axis.min = mathMax(axis.min, axis.max - axis.range); // #618
+			axis.userMax = axis.max;
+
+			axis.range = null;  // don't use it when running setExtremes
+		}
+
+		// Hook for adjusting this.min and this.max. Used by bubble series.
+		if (axis.beforePadding) {
+			axis.beforePadding();
+		}
+
+		// adjust min and max for the minimum range
+		axis.adjustForMinRange();
+
+		// Pad the values to get clear of the chart's edges. To avoid tickInterval taking the padding
+		// into account, we do this after computing tick interval (#1337).
+		if (!categories && !axis.axisPointRange && !axis.usePercentage && !isLinked && defined(axis.min) && defined(axis.max)) {
+			length = axis.max - axis.min;
+			if (length) {
+				if (!defined(options.min) && !defined(axis.userMin) && minPadding && (axis.dataMin < 0 || !axis.ignoreMinPadding)) {
+					axis.min -= length * minPadding;
+				}
+				if (!defined(options.max) && !defined(axis.userMax)  && maxPadding && (axis.dataMax > 0 || !axis.ignoreMaxPadding)) {
+					axis.max += length * maxPadding;
+				}
+			}
+		}
+
+		// Stay within floor and ceiling
+		if (isNumber(options.floor)) {
+			axis.min = mathMax(axis.min, options.floor);
+		}
+		if (isNumber(options.ceiling)) {
+			axis.max = mathMin(axis.max, options.ceiling);
+		}
+
+		// get tickInterval
+		if (axis.min === axis.max || axis.min === undefined || axis.max === undefined) {
+			axis.tickInterval = 1;
+		} else if (isLinked && !tickIntervalOption &&
+				tickPixelIntervalOption === axis.linkedParent.options.tickPixelInterval) {
+			axis.tickInterval = axis.linkedParent.tickInterval;
+		} else {
+			axis.tickInterval = pick(
+				tickIntervalOption,
+				categories ? // for categoried axis, 1 is default, for linear axis use tickPix
+					1 :
+					// don't let it be more than the data range
+					(axis.max - axis.min) * tickPixelIntervalOption / mathMax(axis.len, tickPixelIntervalOption)
+			);
+			// For squished axes, set only two ticks
+			if (!defined(tickIntervalOption) && axis.len < tickPixelIntervalOption && !this.isRadial &&
+					!this.isLog && !categories && startOnTick && endOnTick) {
+				keepTwoTicksOnly = true;
+				axis.tickInterval /= 4; // tick extremes closer to the real values
+			}
+		}
+
+		// Now we're finished detecting min and max, crop and group series data. This
+		// is in turn needed in order to find tick positions in ordinal axes.
+		if (isXAxis && !secondPass) {
+			each(axis.series, function (series) {
+				series.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);
+			});
+		}
+
+		// set the translation factor used in translate function
+		axis.setAxisTranslation(true);
+
+		// hook for ordinal axes and radial axes
+		if (axis.beforeSetTickPositions) {
+			axis.beforeSetTickPositions();
+		}
+
+		// hook for extensions, used in Highstock ordinal axes
+		if (axis.postProcessTickInterval) {
+			axis.tickInterval = axis.postProcessTickInterval(axis.tickInterval);
+		}
+
+		// In column-like charts, don't cramp in more ticks than there are points (#1943)
+		if (axis.pointRange) {
+			axis.tickInterval = mathMax(axis.pointRange, axis.tickInterval);
+		}
+
+		// Before normalizing the tick interval, handle minimum tick interval. This applies only if tickInterval is not defined.
+		if (!tickIntervalOption && axis.tickInterval < minTickIntervalOption) {
+			axis.tickInterval = minTickIntervalOption;
+		}
+
+		// for linear axes, get magnitude and normalize the interval
+		if (!isDatetimeAxis && !isLog) { // linear
+			if (!tickIntervalOption) {
+				axis.tickInterval = normalizeTickInterval(axis.tickInterval, null, getMagnitude(axis.tickInterval), options);
+			}
+		}
+
+		// get minorTickInterval
+		axis.minorTickInterval = options.minorTickInterval === 'auto' && axis.tickInterval ?
+				axis.tickInterval / 5 : options.minorTickInterval;
+
+		// find the tick positions
+		axis.tickPositions = tickPositions = options.tickPositions ?
+			[].concat(options.tickPositions) : // Work on a copy (#1565)
+			(tickPositioner && tickPositioner.apply(axis, [axis.min, axis.max]));
+		if (!tickPositions) {
+
+			// Too many ticks
+			if (!axis.ordinalPositions && (axis.max - axis.min) / axis.tickInterval > mathMax(2 * axis.len, 200)) {
+				error(19, true);
+			}
+
+			if (isDatetimeAxis) {
+				tickPositions = axis.getTimeTicks(
+					axis.normalizeTimeTickInterval(axis.tickInterval, options.units),
+					axis.min,
+					axis.max,
+					options.startOfWeek,
+					axis.ordinalPositions,
+					axis.closestPointRange,
+					true
+				);
+			} else if (isLog) {
+				tickPositions = axis.getLogTickPositions(axis.tickInterval, axis.min, axis.max);
+			} else {
+				tickPositions = axis.getLinearTickPositions(axis.tickInterval, axis.min, axis.max);
+			}
+
+			if (keepTwoTicksOnly) {
+				tickPositions.splice(1, tickPositions.length - 2);
+			}
+
+			axis.tickPositions = tickPositions;
+		}
+
+		if (!isLinked) {
+
+			// reset min/max or remove extremes based on start/end on tick
+			var roundedMin = tickPositions[0],
+				roundedMax = tickPositions[tickPositions.length - 1],
+				minPointOffset = axis.minPointOffset || 0,
+				singlePad;
+
+			// Prevent all ticks from being removed (#3195)
+			if (!startOnTick && !endOnTick && !categories && tickPositions.length === 2) {
+				tickPositions.splice(1, 0, (roundedMax + roundedMin) / 2);
+			}
+
+			if (startOnTick) {
+				axis.min = roundedMin;
+			} else if (axis.min - minPointOffset > roundedMin) {
+				tickPositions.shift();
+			}
+
+			if (endOnTick) {
+				axis.max = roundedMax;
+			} else if (axis.max + minPointOffset < roundedMax) {
+				tickPositions.pop();
+			}
+
+			// When there is only one point, or all points have the same value on this axis, then min
+			// and max are equal and tickPositions.length is 0 or 1. In this case, add some padding
+			// in order to center the point, but leave it with one tick. #1337.
+			if (tickPositions.length === 1) {
+				singlePad = mathAbs(axis.max) > 10e12 ? 1 : 0.001; // The lowest possible number to avoid extra padding on columns (#2619, #2846)
+				axis.min -= singlePad;
+				axis.max += singlePad;
+			}
+		}
+	},
+
+	/**
+	 * Set the max ticks of either the x and y axis collection
+	 */
+	setMaxTicks: function () {
+
+		var chart = this.chart,
+			maxTicks = chart.maxTicks || {},
+			tickPositions = this.tickPositions,
+			key = this._maxTicksKey = [this.coll, this.pos, this.len].join('-');
+
+		if (!this.isLinked && !this.isDatetimeAxis && tickPositions && tickPositions.length > (maxTicks[key] || 0) && this.options.alignTicks !== false) {
+			maxTicks[key] = tickPositions.length;
+		}
+		chart.maxTicks = maxTicks;
+	},
+
+	/**
+	 * When using multiple axes, adjust the number of ticks to match the highest
+	 * number of ticks in that group
+	 */
+	adjustTickAmount: function () {
+		var axis = this,
+			chart = axis.chart,
+			key = axis._maxTicksKey,
+			tickPositions = axis.tickPositions,
+			maxTicks = chart.maxTicks;
+
+		if (maxTicks && maxTicks[key] && !axis.isDatetimeAxis && !axis.categories && !axis.isLinked &&
+				axis.options.alignTicks !== false && this.min !== UNDEFINED) {
+			var oldTickAmount = axis.tickAmount,
+				calculatedTickAmount = tickPositions.length,
+				tickAmount;
+
+			// set the axis-level tickAmount to use below
+			axis.tickAmount = tickAmount = maxTicks[key];
+
+			if (calculatedTickAmount < tickAmount) {
+				while (tickPositions.length < tickAmount) {
+					tickPositions.push(correctFloat(
+						tickPositions[tickPositions.length - 1] + axis.tickInterval
+					));
+				}
+				axis.transA *= (calculatedTickAmount - 1) / (tickAmount - 1);
+				axis.max = tickPositions[tickPositions.length - 1];
+
+			}
+			if (defined(oldTickAmount) && tickAmount !== oldTickAmount) {
+				axis.isDirty = true;
+			}
+		}
+	},
+
+	/**
+	 * Set the scale based on data min and max, user set min and max or options
+	 *
+	 */
+	setScale: function () {
+		var axis = this,
+			stacks = axis.stacks,
+			type,
+			i,
+			isDirtyData,
+			isDirtyAxisLength;
+
+		axis.oldMin = axis.min;
+		axis.oldMax = axis.max;
+		axis.oldAxisLength = axis.len;
+
+		// set the new axisLength
+		axis.setAxisSize();
+		//axisLength = horiz ? axisWidth : axisHeight;
+		isDirtyAxisLength = axis.len !== axis.oldAxisLength;
+
+		// is there new data?
+		each(axis.series, function (series) {
+			if (series.isDirtyData || series.isDirty ||
+					series.xAxis.isDirty) { // when x axis is dirty, we need new data extremes for y as well
+				isDirtyData = true;
+			}
+		});
+
+		// do we really need to go through all this?
+		if (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||
+			axis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax) {
+
+			// reset stacks
+			if (!axis.isXAxis) {
+				for (type in stacks) {
+					for (i in stacks[type]) {
+						stacks[type][i].total = null;
+						stacks[type][i].cum = 0;
+					}
+				}
+			}
+
+			axis.forceRedraw = false;
+
+			// get data extremes if needed
+			axis.getSeriesExtremes();
+
+			// get fixed positions based on tickInterval
+			axis.setTickPositions();
+
+			// record old values to decide whether a rescale is necessary later on (#540)
+			axis.oldUserMin = axis.userMin;
+			axis.oldUserMax = axis.userMax;
+
+			// Mark as dirty if it is not already set to dirty and extremes have changed. #595.
+			if (!axis.isDirty) {
+				axis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;
+			}
+		} else if (!axis.isXAxis) {
+			if (axis.oldStacks) {
+				stacks = axis.stacks = axis.oldStacks;
+			}
+
+			// reset stacks
+			for (type in stacks) {
+				for (i in stacks[type]) {
+					stacks[type][i].cum = stacks[type][i].total;
+				}
+			}
+		}
+
+		// Set the maximum tick amount
+		axis.setMaxTicks();
+	},
+
+	/**
+	 * Set the extremes and optionally redraw
+	 * @param {Number} newMin
+	 * @param {Number} newMax
+	 * @param {Boolean} redraw
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 * @param {Object} eventArguments
+	 *
+	 */
+	setExtremes: function (newMin, newMax, redraw, animation, eventArguments) {
+		var axis = this,
+			chart = axis.chart;
+
+		redraw = pick(redraw, true); // defaults to true
+
+		// Extend the arguments with min and max
+		eventArguments = extend(eventArguments, {
+			min: newMin,
+			max: newMax
+		});
+
+		// Fire the event
+		fireEvent(axis, 'setExtremes', eventArguments, function () { // the default event handler
+
+			axis.userMin = newMin;
+			axis.userMax = newMax;
+			axis.eventArgs = eventArguments;
+
+			// Mark for running afterSetExtremes
+			axis.isDirtyExtremes = true;
+
+			// redraw
+			if (redraw) {
+				chart.redraw(animation);
+			}
+		});
+	},
+
+	/**
+	 * Overridable method for zooming chart. Pulled out in a separate method to allow overriding
+	 * in stock charts.
+	 */
+	zoom: function (newMin, newMax) {
+		var dataMin = this.dataMin,
+			dataMax = this.dataMax,
+			options = this.options;
+
+		// Prevent pinch zooming out of range. Check for defined is for #1946. #1734.
+		if (!this.allowZoomOutside) {
+			if (defined(dataMin) && newMin <= mathMin(dataMin, pick(options.min, dataMin))) {
+				newMin = UNDEFINED;
+			}
+			if (defined(dataMax) && newMax >= mathMax(dataMax, pick(options.max, dataMax))) {
+				newMax = UNDEFINED;
+			}
+		}
+
+		// In full view, displaying the reset zoom button is not required
+		this.displayBtn = newMin !== UNDEFINED || newMax !== UNDEFINED;
+
+		// Do it
+		this.setExtremes(
+			newMin,
+			newMax,
+			false,
+			UNDEFINED,
+			{ trigger: 'zoom' }
+		);
+		return true;
+	},
+
+	/**
+	 * Update the axis metrics
+	 */
+	setAxisSize: function () {
+		var chart = this.chart,
+			options = this.options,
+			offsetLeft = options.offsetLeft || 0,
+			offsetRight = options.offsetRight || 0,
+			horiz = this.horiz,
+			width = pick(options.width, chart.plotWidth - offsetLeft + offsetRight),
+			height = pick(options.height, chart.plotHeight),
+			top = pick(options.top, chart.plotTop),
+			left = pick(options.left, chart.plotLeft + offsetLeft),
+			percentRegex = /%$/;
+
+		// Check for percentage based input values
+		if (percentRegex.test(height)) {
+			height = parseInt(height, 10) / 100 * chart.plotHeight;
+		}
+		if (percentRegex.test(top)) {
+			top = parseInt(top, 10) / 100 * chart.plotHeight + chart.plotTop;
+		}
+
+		// Expose basic values to use in Series object and navigator
+		this.left = left;
+		this.top = top;
+		this.width = width;
+		this.height = height;
+		this.bottom = chart.chartHeight - height - top;
+		this.right = chart.chartWidth - width - left;
+
+		// Direction agnostic properties
+		this.len = mathMax(horiz ? width : height, 0); // mathMax fixes #905
+		this.pos = horiz ? left : top; // distance from SVG origin
+	},
+
+	/**
+	 * Get the actual axis extremes
+	 */
+	getExtremes: function () {
+		var axis = this,
+			isLog = axis.isLog;
+
+		return {
+			min: isLog ? correctFloat(lin2log(axis.min)) : axis.min,
+			max: isLog ? correctFloat(lin2log(axis.max)) : axis.max,
+			dataMin: axis.dataMin,
+			dataMax: axis.dataMax,
+			userMin: axis.userMin,
+			userMax: axis.userMax
+		};
+	},
+
+	/**
+	 * Get the zero plane either based on zero or on the min or max value.
+	 * Used in bar and area plots
+	 */
+	getThreshold: function (threshold) {
+		var axis = this,
+			isLog = axis.isLog;
+
+		var realMin = isLog ? lin2log(axis.min) : axis.min,
+			realMax = isLog ? lin2log(axis.max) : axis.max;
+
+		if (realMin > threshold || threshold === null) {
+			threshold = realMin;
+		} else if (realMax < threshold) {
+			threshold = realMax;
+		}
+
+		return axis.translate(threshold, 0, 1, 0, 1);
+	},
+
+	/**
+	 * Compute auto alignment for the axis label based on which side the axis is on
+	 * and the given rotation for the label
+	 */
+	autoLabelAlign: function (rotation) {
+		var ret,
+			angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360;
+
+		if (angle > 15 && angle < 165) {
+			ret = 'right';
+		} else if (angle > 195 && angle < 345) {
+			ret = 'left';
+		} else {
+			ret = 'center';
+		}
+		return ret;
+	},
+
+	/**
+	 * Render the tick labels to a preliminary position to get their sizes
+	 */
+	getOffset: function () {
+		var axis = this,
+			chart = axis.chart,
+			renderer = chart.renderer,
+			options = axis.options,
+			tickPositions = axis.tickPositions,
+			ticks = axis.ticks,
+			horiz = axis.horiz,
+			side = axis.side,
+			invertedSide = chart.inverted ? [1, 0, 3, 2][side] : side,
+			hasData,
+			showAxis,
+			titleOffset = 0,
+			titleOffsetOption,
+			titleMargin = 0,
+			axisTitleOptions = options.title,
+			labelOptions = options.labels,
+			labelOffset = 0, // reset
+			labelOffsetPadded,
+			axisOffset = chart.axisOffset,
+			clipOffset = chart.clipOffset,
+			directionFactor = [-1, 1, 1, -1][side],
+			n,
+			i,
+			autoStaggerLines = 1,
+			maxStaggerLines = pick(labelOptions.maxStaggerLines, 5),
+			sortedPositions,
+			lastRight,
+			overlap,
+			pos,
+			bBox,
+			x,
+			w,
+			lineNo,
+			lineHeightCorrection;
+
+		// For reuse in Axis.render
+		axis.hasData = hasData = (axis.hasVisibleSeries || (defined(axis.min) && defined(axis.max) && !!tickPositions));
+		axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);
+
+		// Set/reset staggerLines
+		axis.staggerLines = axis.horiz && labelOptions.staggerLines;
+
+		// Create the axisGroup and gridGroup elements on first iteration
+		if (!axis.axisGroup) {
+			axis.gridGroup = renderer.g('grid')
+				.attr({ zIndex: options.gridZIndex || 1 })
+				.add();
+			axis.axisGroup = renderer.g('axis')
+				.attr({ zIndex: options.zIndex || 2 })
+				.add();
+			axis.labelGroup = renderer.g('axis-labels')
+				.attr({ zIndex: labelOptions.zIndex || 7 })
+				.addClass(PREFIX + axis.coll.toLowerCase() + '-labels')
+				.add();
+		}
+
+		if (hasData || axis.isLinked) {
+
+			// Set the explicit or automatic label alignment
+			axis.labelAlign = pick(labelOptions.align || axis.autoLabelAlign(labelOptions.rotation));
+
+			// Generate ticks
+			each(tickPositions, function (pos) {
+				if (!ticks[pos]) {
+					ticks[pos] = new Tick(axis, pos);
+				} else {
+					ticks[pos].addLabel(); // update labels depending on tick interval
+				}
+			});
+
+			// Handle automatic stagger lines
+			if (axis.horiz && !axis.staggerLines && maxStaggerLines && !labelOptions.rotation) {
+				sortedPositions = axis.reversed ? [].concat(tickPositions).reverse() : tickPositions;
+				while (autoStaggerLines < maxStaggerLines) {
+					lastRight = [];
+					overlap = false;
+
+					for (i = 0; i < sortedPositions.length; i++) {
+						pos = sortedPositions[i];
+						bBox = ticks[pos].label && ticks[pos].label.getBBox();
+						w = bBox ? bBox.width : 0;
+						lineNo = i % autoStaggerLines;
+
+						if (w) {
+							x = axis.translate(pos); // don't handle log
+							if (lastRight[lineNo] !== UNDEFINED && x < lastRight[lineNo]) {
+								overlap = true;
+							}
+							lastRight[lineNo] = x + w;
+						}
+					}
+					if (overlap) {
+						autoStaggerLines++;
+					} else {
+						break;
+					}
+				}
+
+				if (autoStaggerLines > 1) {
+					axis.staggerLines = autoStaggerLines;
+				}
+			}
+
+
+			each(tickPositions, function (pos) {
+				// left side must be align: right and right side must have align: left for labels
+				if (side === 0 || side === 2 || { 1: 'left', 3: 'right' }[side] === axis.labelAlign) {
+
+					// get the highest offset
+					labelOffset = mathMax(
+						ticks[pos].getLabelSize(),
+						labelOffset
+					);
+				}
+			});
+
+			if (axis.staggerLines) {
+				labelOffset *= axis.staggerLines;
+				axis.labelOffset = labelOffset;
+			}
+
+
+		} else { // doesn't have data
+			for (n in ticks) {
+				ticks[n].destroy();
+				delete ticks[n];
+			}
+		}
+
+		if (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) {
+			if (!axis.axisTitle) {
+				axis.axisTitle = renderer.text(
+					axisTitleOptions.text,
+					0,
+					0,
+					axisTitleOptions.useHTML
+				)
+				.attr({
+					zIndex: 7,
+					rotation: axisTitleOptions.rotation || 0,
+					align:
+						axisTitleOptions.textAlign ||
+						{ low: 'left', middle: 'center', high: 'right' }[axisTitleOptions.align]
+				})
+				.addClass(PREFIX + this.coll.toLowerCase() + '-title')
+				.css(axisTitleOptions.style)
+				.add(axis.axisGroup);
+				axis.axisTitle.isNew = true;
+			}
+
+			if (showAxis) {
+				titleOffset = axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];
+				titleOffsetOption = axisTitleOptions.offset;
+				titleMargin = defined(titleOffsetOption) ? 0 : pick(axisTitleOptions.margin, horiz ? 5 : 10);
+			}
+
+			// hide or show the title depending on whether showEmpty is set
+			axis.axisTitle[showAxis ? 'show' : 'hide']();
+		}
+
+		// handle automatic or user set offset
+		axis.offset = directionFactor * pick(options.offset, axisOffset[side]);
+
+		lineHeightCorrection = side === 2 ? axis.tickBaseline : 0;
+		labelOffsetPadded = labelOffset + titleMargin +
+			(labelOffset && (directionFactor * (horiz ? pick(labelOptions.y, axis.tickBaseline + 8) : labelOptions.x) - lineHeightCorrection));
+		axis.axisTitleMargin = pick(titleOffsetOption, labelOffsetPadded);
+
+		axisOffset[side] = mathMax(
+			axisOffset[side],
+			axis.axisTitleMargin + titleOffset + directionFactor * axis.offset,
+			labelOffsetPadded // #3027
+		);
+		clipOffset[invertedSide] = mathMax(clipOffset[invertedSide], mathFloor(options.lineWidth / 2) * 2);
+	},
+
+	/**
+	 * Get the path for the axis line
+	 */
+	getLinePath: function (lineWidth) {
+		var chart = this.chart,
+			opposite = this.opposite,
+			offset = this.offset,
+			horiz = this.horiz,
+			lineLeft = this.left + (opposite ? this.width : 0) + offset,
+			lineTop = chart.chartHeight - this.bottom - (opposite ? this.height : 0) + offset;
+
+		if (opposite) {
+			lineWidth *= -1; // crispify the other way - #1480, #1687
+		}
+
+		return chart.renderer.crispLine([
+				M,
+				horiz ?
+					this.left :
+					lineLeft,
+				horiz ?
+					lineTop :
+					this.top,
+				L,
+				horiz ?
+					chart.chartWidth - this.right :
+					lineLeft,
+				horiz ?
+					lineTop :
+					chart.chartHeight - this.bottom
+			], lineWidth);
+	},
+
+	/**
+	 * Position the title
+	 */
+	getTitlePosition: function () {
+		// compute anchor points for each of the title align options
+		var horiz = this.horiz,
+			axisLeft = this.left,
+			axisTop = this.top,
+			axisLength = this.len,
+			axisTitleOptions = this.options.title,
+			margin = horiz ? axisLeft : axisTop,
+			opposite = this.opposite,
+			offset = this.offset,
+			fontSize = pInt(axisTitleOptions.style.fontSize || 12),
+
+			// the position in the length direction of the axis
+			alongAxis = {
+				low: margin + (horiz ? 0 : axisLength),
+				middle: margin + axisLength / 2,
+				high: margin + (horiz ? axisLength : 0)
+			}[axisTitleOptions.align],
+
+			// the position in the perpendicular direction of the axis
+			offAxis = (horiz ? axisTop + this.height : axisLeft) +
+				(horiz ? 1 : -1) * // horizontal axis reverses the margin
+				(opposite ? -1 : 1) * // so does opposite axes
+				this.axisTitleMargin +
+				(this.side === 2 ? fontSize : 0);
+
+		return {
+			x: horiz ?
+				alongAxis :
+				offAxis + (opposite ? this.width : 0) + offset +
+					(axisTitleOptions.x || 0), // x
+			y: horiz ?
+				offAxis - (opposite ? this.height : 0) + offset :
+				alongAxis + (axisTitleOptions.y || 0) // y
+		};
+	},
+
+	/**
+	 * Render the axis
+	 */
+	render: function () {
+		var axis = this,
+			horiz = axis.horiz,
+			reversed = axis.reversed,
+			chart = axis.chart,
+			renderer = chart.renderer,
+			options = axis.options,
+			isLog = axis.isLog,
+			isLinked = axis.isLinked,
+			tickPositions = axis.tickPositions,
+			sortedPositions,
+			axisTitle = axis.axisTitle,			
+			ticks = axis.ticks,
+			minorTicks = axis.minorTicks,
+			alternateBands = axis.alternateBands,
+			stackLabelOptions = options.stackLabels,
+			alternateGridColor = options.alternateGridColor,
+			tickmarkOffset = axis.tickmarkOffset,
+			lineWidth = options.lineWidth,
+			linePath,
+			hasRendered = chart.hasRendered,
+			slideInTicks = hasRendered && defined(axis.oldMin) && !isNaN(axis.oldMin),
+			hasData = axis.hasData,
+			showAxis = axis.showAxis,
+			from,
+			overflow = options.labels.overflow,
+			justifyLabels = axis.justifyLabels = horiz && overflow !== false,
+			to;
+
+		// Reset
+		axis.labelEdge.length = 0;
+		axis.justifyToPlot = overflow === 'justify';
+
+		// Mark all elements inActive before we go over and mark the active ones
+		each([ticks, minorTicks, alternateBands], function (coll) {
+			var pos;
+			for (pos in coll) {
+				coll[pos].isActive = false;
+			}
+		});
+
+		// If the series has data draw the ticks. Else only the line and title
+		if (hasData || isLinked) {
+
+			// minor ticks
+			if (axis.minorTickInterval && !axis.categories) {
+				each(axis.getMinorTickPositions(), function (pos) {
+					if (!minorTicks[pos]) {
+						minorTicks[pos] = new Tick(axis, pos, 'minor');
+					}
+
+					// render new ticks in old position
+					if (slideInTicks && minorTicks[pos].isNew) {
+						minorTicks[pos].render(null, true);
+					}
+
+					minorTicks[pos].render(null, false, 1);
+				});
+			}
+
+			// Major ticks. Pull out the first item and render it last so that
+			// we can get the position of the neighbour label. #808.
+			if (tickPositions.length) { // #1300
+				sortedPositions = tickPositions.slice();
+				if ((horiz && reversed) || (!horiz && !reversed)) {
+					sortedPositions.reverse();
+				}
+				if (justifyLabels) {
+					sortedPositions = sortedPositions.slice(1).concat([sortedPositions[0]]);
+				}
+				each(sortedPositions, function (pos, i) {
+
+					// Reorganize the indices
+					if (justifyLabels) {
+						i = (i === sortedPositions.length - 1) ? 0 : i + 1;
+					}
+
+					// linked axes need an extra check to find out if
+					if (!isLinked || (pos >= axis.min && pos <= axis.max)) {
+
+						if (!ticks[pos]) {
+							ticks[pos] = new Tick(axis, pos);
+						}
+
+						// render new ticks in old position
+						if (slideInTicks && ticks[pos].isNew) {
+							ticks[pos].render(i, true, 0.1);
+						}
+
+						ticks[pos].render(i);
+					}
+
+				});
+				// In a categorized axis, the tick marks are displayed between labels. So
+				// we need to add a tick mark and grid line at the left edge of the X axis.
+				if (tickmarkOffset && axis.min === 0) {
+					if (!ticks[-1]) {
+						ticks[-1] = new Tick(axis, -1, null, true);
+					}
+					ticks[-1].render(-1);
+				}
+
+			}
+
+			// alternate grid color
+			if (alternateGridColor) {
+				each(tickPositions, function (pos, i) {
+					if (i % 2 === 0 && pos < axis.max) {
+						if (!alternateBands[pos]) {
+							alternateBands[pos] = new Highcharts.PlotLineOrBand(axis);
+						}
+						from = pos + tickmarkOffset; // #949
+						to = tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] + tickmarkOffset : axis.max;
+						alternateBands[pos].options = {
+							from: isLog ? lin2log(from) : from,
+							to: isLog ? lin2log(to) : to,
+							color: alternateGridColor
+						};
+						alternateBands[pos].render();
+						alternateBands[pos].isActive = true;
+					}
+				});
+			}
+
+			// custom plot lines and bands
+			if (!axis._addedPlotLB) { // only first time
+				each((options.plotLines || []).concat(options.plotBands || []), function (plotLineOptions) {
+					axis.addPlotBandOrLine(plotLineOptions);
+				});
+				axis._addedPlotLB = true;
+			}
+
+		} // end if hasData
+
+		// Remove inactive ticks
+		each([ticks, minorTicks, alternateBands], function (coll) {
+			var pos,
+				i,
+				forDestruction = [],
+				delay = globalAnimation ? globalAnimation.duration || 500 : 0,
+				destroyInactiveItems = function () {
+					i = forDestruction.length;
+					while (i--) {
+						// When resizing rapidly, the same items may be destroyed in different timeouts,
+						// or the may be reactivated
+						if (coll[forDestruction[i]] && !coll[forDestruction[i]].isActive) {
+							coll[forDestruction[i]].destroy();
+							delete coll[forDestruction[i]];
+						}
+					}
+
+				};
+
+			for (pos in coll) {
+
+				if (!coll[pos].isActive) {
+					// Render to zero opacity
+					coll[pos].render(pos, false, 0);
+					coll[pos].isActive = false;
+					forDestruction.push(pos);
+				}
+			}
+
+			// When the objects are finished fading out, destroy them
+			if (coll === alternateBands || !chart.hasRendered || !delay) {
+				destroyInactiveItems();
+			} else if (delay) {
+				setTimeout(destroyInactiveItems, delay);
+			}
+		});
+
+		// Static items. As the axis group is cleared on subsequent calls
+		// to render, these items are added outside the group.
+		// axis line
+		if (lineWidth) {
+			linePath = axis.getLinePath(lineWidth);
+			if (!axis.axisLine) {
+				axis.axisLine = renderer.path(linePath)
+					.attr({
+						stroke: options.lineColor,
+						'stroke-width': lineWidth,
+						zIndex: 7
+					})
+					.add(axis.axisGroup);
+			} else {
+				axis.axisLine.animate({ d: linePath });
+			}
+
+			// show or hide the line depending on options.showEmpty
+			axis.axisLine[showAxis ? 'show' : 'hide']();
+		}
+
+		if (axisTitle && showAxis) {
+
+			axisTitle[axisTitle.isNew ? 'attr' : 'animate'](
+				axis.getTitlePosition()
+			);
+			axisTitle.isNew = false;
+		}
+
+		// Stacked totals:
+		if (stackLabelOptions && stackLabelOptions.enabled) {
+			axis.renderStackTotals();
+		}
+		// End stacked totals
+
+		axis.isDirty = false;
+	},
+
+	/**
+	 * Redraw the axis to reflect changes in the data or axis extremes
+	 */
+	redraw: function () {
+		
+		// render the axis
+		this.render();
+
+		// move plot lines and bands
+		each(this.plotLinesAndBands, function (plotLine) {
+			plotLine.render();
+		});
+
+		// mark associated series as dirty and ready for redraw
+		each(this.series, function (series) {
+			series.isDirty = true;
+		});
+
+	},
+
+	/**
+	 * Destroys an Axis instance.
+	 */
+	destroy: function (keepEvents) {
+		var axis = this,
+			stacks = axis.stacks,
+			stackKey,
+			plotLinesAndBands = axis.plotLinesAndBands,
+			i;
+
+		// Remove the events
+		if (!keepEvents) {
+			removeEvent(axis);
+		}
+
+		// Destroy each stack total
+		for (stackKey in stacks) {
+			destroyObjectProperties(stacks[stackKey]);
+
+			stacks[stackKey] = null;
+		}
+
+		// Destroy collections
+		each([axis.ticks, axis.minorTicks, axis.alternateBands], function (coll) {
+			destroyObjectProperties(coll);
+		});
+		i = plotLinesAndBands.length;
+		while (i--) { // #1975
+			plotLinesAndBands[i].destroy();
+		}
+
+		// Destroy local variables
+		each(['stackTotalGroup', 'axisLine', 'axisTitle', 'axisGroup', 'cross', 'gridGroup', 'labelGroup'], function (prop) {
+			if (axis[prop]) {
+				axis[prop] = axis[prop].destroy();
+			}
+		});
+
+		// Destroy crosshair
+		if (this.cross) {
+			this.cross.destroy();
+		}
+	},
+
+	/**
+	 * Draw the crosshair
+	 */
+	drawCrosshair: function (e, point) {
+		if (!this.crosshair) { return; }// Do not draw crosshairs if you don't have too.
+
+		if ((defined(point) || !pick(this.crosshair.snap, true)) === false) {
+			this.hideCrosshair();
+			return;
+		}
+
+		var path,
+			options = this.crosshair,
+			animation = options.animation,
+			pos;
+
+		// Get the path
+		if (!pick(options.snap, true)) {
+			pos = (this.horiz ? e.chartX - this.pos : this.len - e.chartY + this.pos);
+		} else if (defined(point)) {
+			/*jslint eqeq: true*/
+			pos = (this.chart.inverted != this.horiz) ? point.plotX : this.len - point.plotY;
+			/*jslint eqeq: false*/
+		}
+
+		if (this.isRadial) {
+			path = this.getPlotLinePath(this.isXAxis ? point.x : pick(point.stackY, point.y));
+		} else {
+			path = this.getPlotLinePath(null, null, null, null, pos);
+		}
+
+		if (path === null) {
+			this.hideCrosshair();
+			return;
+		}
+
+		// Draw the cross
+		if (this.cross) {
+			this.cross
+				.attr({ visibility: VISIBLE })[animation ? 'animate' : 'attr']({ d: path }, animation);
+		} else {
+			var attribs = {
+				'stroke-width': options.width || 1,
+				stroke: options.color || '#C0C0C0',
+				zIndex: options.zIndex || 2
+			};
+			if (options.dashStyle) {
+				attribs.dashstyle = options.dashStyle;
+			}
+			this.cross = this.chart.renderer.path(path).attr(attribs).add();
+		}
+	},
+
+	/**
+	 *	Hide the crosshair.
+	 */
+	hideCrosshair: function () {
+		if (this.cross) {
+			this.cross.hide();
+		}
+	}
+}; // end Axis
+
+extend(Axis.prototype, AxisPlotLineOrBandExtension);
+
+/**
+ * Set the tick positions to a time unit that makes sense, for example
+ * on the first of each month or on every Monday. Return an array
+ * with the time positions. Used in datetime axes as well as for grouping
+ * data on a datetime axis.
+ *
+ * @param {Object} normalizedInterval The interval in axis values (ms) and the count
+ * @param {Number} min The minimum in axis values
+ * @param {Number} max The maximum in axis values
+ * @param {Number} startOfWeek
+ */
+Axis.prototype.getTimeTicks = function (normalizedInterval, min, max, startOfWeek) {
+	var tickPositions = [],
+		i,
+		higherRanks = {},
+		useUTC = defaultOptions.global.useUTC,
+		minYear, // used in months and years as a basis for Date.UTC()
+		minDate = new Date(min - timezoneOffset),
+		interval = normalizedInterval.unitRange,
+		count = normalizedInterval.count;
+
+	if (defined(min)) { // #1300
+		if (interval >= timeUnits.second) { // second
+			minDate.setMilliseconds(0);
+			minDate.setSeconds(interval >= timeUnits.minute ? 0 :
+				count * mathFloor(minDate.getSeconds() / count));
+		}
+	
+		if (interval >= timeUnits.minute) { // minute
+			minDate[setMinutes](interval >= timeUnits.hour ? 0 :
+				count * mathFloor(minDate[getMinutes]() / count));
+		}
+	
+		if (interval >= timeUnits.hour) { // hour
+			minDate[setHours](interval >= timeUnits.day ? 0 :
+				count * mathFloor(minDate[getHours]() / count));
+		}
+	
+		if (interval >= timeUnits.day) { // day
+			minDate[setDate](interval >= timeUnits.month ? 1 :
+				count * mathFloor(minDate[getDate]() / count));
+		}
+	
+		if (interval >= timeUnits.month) { // month
+			minDate[setMonth](interval >= timeUnits.year ? 0 :
+				count * mathFloor(minDate[getMonth]() / count));
+			minYear = minDate[getFullYear]();
+		}
+	
+		if (interval >= timeUnits.year) { // year
+			minYear -= minYear % count;
+			minDate[setFullYear](minYear);
+		}
+	
+		// week is a special case that runs outside the hierarchy
+		if (interval === timeUnits.week) {
+			// get start of current week, independent of count
+			minDate[setDate](minDate[getDate]() - minDate[getDay]() +
+				pick(startOfWeek, 1));
+		}
+	
+	
+		// get tick positions
+		i = 1;
+		if (timezoneOffset) {
+			minDate = new Date(minDate.getTime() + timezoneOffset);
+		}
+		minYear = minDate[getFullYear]();
+		var time = minDate.getTime(),
+			minMonth = minDate[getMonth](),
+			minDateDate = minDate[getDate](),
+			localTimezoneOffset = useUTC ? 
+				timezoneOffset : 
+				(24 * 3600 * 1000 + minDate.getTimezoneOffset() * 60 * 1000) % (24 * 3600 * 1000); // #950
+	
+		// iterate and add tick positions at appropriate values
+		while (time < max) {
+			tickPositions.push(time);
+	
+			// if the interval is years, use Date.UTC to increase years
+			if (interval === timeUnits.year) {
+				time = makeTime(minYear + i * count, 0);
+	
+			// if the interval is months, use Date.UTC to increase months
+			} else if (interval === timeUnits.month) {
+				time = makeTime(minYear, minMonth + i * count);
+	
+			// if we're using global time, the interval is not fixed as it jumps
+			// one hour at the DST crossover
+			} else if (!useUTC && (interval === timeUnits.day || interval === timeUnits.week)) {
+				time = makeTime(minYear, minMonth, minDateDate +
+					i * count * (interval === timeUnits.day ? 1 : 7));
+	
+			// else, the interval is fixed and we use simple addition
+			} else {
+				time += interval * count;
+			}
+	
+			i++;
+		}
+	
+		// push the last time
+		tickPositions.push(time);
+
+
+		// mark new days if the time is dividible by day (#1649, #1760)
+		each(grep(tickPositions, function (time) {
+			return interval <= timeUnits.hour && time % timeUnits.day === localTimezoneOffset;
+		}), function (time) {
+			higherRanks[time] = 'day';
+		});
+	}
+
+
+	// record information on the chosen unit - for dynamic label formatter
+	tickPositions.info = extend(normalizedInterval, {
+		higherRanks: higherRanks,
+		totalRange: interval * count
+	});
+
+	return tickPositions;
+};
+
+/**
+ * Get a normalized tick interval for dates. Returns a configuration object with
+ * unit range (interval), count and name. Used to prepare data for getTimeTicks. 
+ * Previously this logic was part of getTimeTicks, but as getTimeTicks now runs
+ * of segments in stock charts, the normalizing logic was extracted in order to 
+ * prevent it for running over again for each segment having the same interval. 
+ * #662, #697.
+ */
+Axis.prototype.normalizeTimeTickInterval = function (tickInterval, unitsOption) {
+	var units = unitsOption || [[
+				'millisecond', // unit name
+				[1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples
+			], [
+				'second',
+				[1, 2, 5, 10, 15, 30]
+			], [
+				'minute',
+				[1, 2, 5, 10, 15, 30]
+			], [
+				'hour',
+				[1, 2, 3, 4, 6, 8, 12]
+			], [
+				'day',
+				[1, 2]
+			], [
+				'week',
+				[1, 2]
+			], [
+				'month',
+				[1, 2, 3, 4, 6]
+			], [
+				'year',
+				null
+			]],
+		unit = units[units.length - 1], // default unit is years
+		interval = timeUnits[unit[0]],
+		multiples = unit[1],
+		count,
+		i;
+		
+	// loop through the units to find the one that best fits the tickInterval
+	for (i = 0; i < units.length; i++) {
+		unit = units[i];
+		interval = timeUnits[unit[0]];
+		multiples = unit[1];
+
+
+		if (units[i + 1]) {
+			// lessThan is in the middle between the highest multiple and the next unit.
+			var lessThan = (interval * multiples[multiples.length - 1] +
+						timeUnits[units[i + 1][0]]) / 2;
+
+			// break and keep the current unit
+			if (tickInterval <= lessThan) {
+				break;
+			}
+		}
+	}
+
+	// prevent 2.5 years intervals, though 25, 250 etc. are allowed
+	if (interval === timeUnits.year && tickInterval < 5 * interval) {
+		multiples = [1, 2, 5];
+	}
+
+	// get the count
+	count = normalizeTickInterval(
+		tickInterval / interval, 
+		multiples,
+		unit[0] === 'year' ? mathMax(getMagnitude(tickInterval / interval), 1) : 1 // #1913, #2360
+	);
+	
+	return {
+		unitRange: interval,
+		count: count,
+		unitName: unit[0]
+	};
+};/**
+ * Methods defined on the Axis prototype
+ */
+
+/**
+ * Set the tick positions of a logarithmic axis
+ */
+Axis.prototype.getLogTickPositions = function (interval, min, max, minor) {
+	var axis = this,
+		options = axis.options,
+		axisLength = axis.len,
+		// Since we use this method for both major and minor ticks,
+		// use a local variable and return the result
+		positions = []; 
+	
+	// Reset
+	if (!minor) {
+		axis._minorAutoInterval = null;
+	}
+	
+	// First case: All ticks fall on whole logarithms: 1, 10, 100 etc.
+	if (interval >= 0.5) {
+		interval = mathRound(interval);
+		positions = axis.getLinearTickPositions(interval, min, max);
+		
+	// Second case: We need intermediary ticks. For example 
+	// 1, 2, 4, 6, 8, 10, 20, 40 etc. 
+	} else if (interval >= 0.08) {
+		var roundedMin = mathFloor(min),
+			intermediate,
+			i,
+			j,
+			len,
+			pos,
+			lastPos,
+			break2;
+			
+		if (interval > 0.3) {
+			intermediate = [1, 2, 4];
+		} else if (interval > 0.15) { // 0.2 equals five minor ticks per 1, 10, 100 etc
+			intermediate = [1, 2, 4, 6, 8];
+		} else { // 0.1 equals ten minor ticks per 1, 10, 100 etc
+			intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];
+		}
+		
+		for (i = roundedMin; i < max + 1 && !break2; i++) {
+			len = intermediate.length;
+			for (j = 0; j < len && !break2; j++) {
+				pos = log2lin(lin2log(i) * intermediate[j]);
+				if (pos > min && (!minor || lastPos <= max) && lastPos !== UNDEFINED) { // #1670, lastPos is #3113
+					positions.push(lastPos);
+				}
+				
+				if (lastPos > max) {
+					break2 = true;
+				}
+				lastPos = pos;
+			}
+		}
+		
+	// Third case: We are so deep in between whole logarithmic values that
+	// we might as well handle the tick positions like a linear axis. For
+	// example 1.01, 1.02, 1.03, 1.04.
+	} else {
+		var realMin = lin2log(min),
+			realMax = lin2log(max),
+			tickIntervalOption = options[minor ? 'minorTickInterval' : 'tickInterval'],
+			filteredTickIntervalOption = tickIntervalOption === 'auto' ? null : tickIntervalOption,
+			tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),
+			totalPixelLength = minor ? axisLength / axis.tickPositions.length : axisLength;
+		
+		interval = pick(
+			filteredTickIntervalOption,
+			axis._minorAutoInterval,
+			(realMax - realMin) * tickPixelIntervalOption / (totalPixelLength || 1)
+		);
+		
+		interval = normalizeTickInterval(
+			interval, 
+			null, 
+			getMagnitude(interval)
+		);
+		
+		positions = map(axis.getLinearTickPositions(
+			interval, 
+			realMin,
+			realMax	
+		), log2lin);
+		
+		if (!minor) {
+			axis._minorAutoInterval = interval / 5;
+		}
+	}
+	
+	// Set the axis-level tickInterval variable 
+	if (!minor) {
+		axis.tickInterval = interval;
+	}
+	return positions;
+};/**
+ * The tooltip object
+ * @param {Object} chart The chart instance
+ * @param {Object} options Tooltip options
+ */
+var Tooltip = Highcharts.Tooltip = function () {
+	this.init.apply(this, arguments);
+};
+
+Tooltip.prototype = {
+
+	init: function (chart, options) {
+
+		var borderWidth = options.borderWidth,
+			style = options.style,
+			padding = pInt(style.padding);
+
+		// Save the chart and options
+		this.chart = chart;
+		this.options = options;
+
+		// Keep track of the current series
+		//this.currentSeries = UNDEFINED;
+
+		// List of crosshairs
+		this.crosshairs = [];
+
+		// Current values of x and y when animating
+		this.now = { x: 0, y: 0 };
+
+		// The tooltip is initially hidden
+		this.isHidden = true;
+
+
+		// create the label
+		this.label = chart.renderer.label('', 0, 0, options.shape || 'callout', null, null, options.useHTML, null, 'tooltip')
+			.attr({
+				padding: padding,
+				fill: options.backgroundColor,
+				'stroke-width': borderWidth,
+				r: options.borderRadius,
+				zIndex: 8
+			})
+			.css(style)
+			.css({ padding: 0 }) // Remove it from VML, the padding is applied as an attribute instead (#1117)
+			.add()
+			.attr({ y: -9999 }); // #2301, #2657
+
+		// When using canVG the shadow shows up as a gray circle
+		// even if the tooltip is hidden.
+		if (!useCanVG) {
+			this.label.shadow(options.shadow);
+		}
+
+		// Public property for getting the shared state.
+		this.shared = options.shared;
+	},
+
+	/**
+	 * Destroy the tooltip and its elements.
+	 */
+	destroy: function () {
+		// Destroy and clear local variables
+		if (this.label) {
+			this.label = this.label.destroy();
+		}
+		clearTimeout(this.hideTimer);
+		clearTimeout(this.tooltipTimeout);
+	},
+
+	/**
+	 * Provide a soft movement for the tooltip
+	 *
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @private
+	 */
+	move: function (x, y, anchorX, anchorY) {
+		var tooltip = this,
+			now = tooltip.now,
+			animate = tooltip.options.animation !== false && !tooltip.isHidden && 
+				// When we get close to the target position, abort animation and land on the right place (#3056)
+				(mathAbs(x - now.x) > 1 || mathAbs(y - now.y) > 1),
+			skipAnchor = tooltip.followPointer || tooltip.len > 1;
+
+		// Get intermediate values for animation
+		extend(now, {
+			x: animate ? (2 * now.x + x) / 3 : x,
+			y: animate ? (now.y + y) / 2 : y,
+			anchorX: skipAnchor ? UNDEFINED : animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,
+			anchorY: skipAnchor ? UNDEFINED : animate ? (now.anchorY + anchorY) / 2 : anchorY
+		});
+
+		// Move to the intermediate value
+		tooltip.label.attr(now);
+
+		
+		// Run on next tick of the mouse tracker
+		if (animate) {
+		
+			// Never allow two timeouts
+			clearTimeout(this.tooltipTimeout);
+			
+			// Set the fixed interval ticking for the smooth tooltip
+			this.tooltipTimeout = setTimeout(function () {
+				// The interval function may still be running during destroy, so check that the chart is really there before calling.
+				if (tooltip) {
+					tooltip.move(x, y, anchorX, anchorY);
+				}
+			}, 32);
+			
+		}
+	},
+
+	/**
+	 * Hide the tooltip
+	 */
+	hide: function () {
+		var tooltip = this,
+			hoverPoints;
+		
+		clearTimeout(this.hideTimer); // disallow duplicate timers (#1728, #1766)
+		if (!this.isHidden) {
+			hoverPoints = this.chart.hoverPoints;
+
+			this.hideTimer = setTimeout(function () {
+				tooltip.label.fadeOut();
+				tooltip.isHidden = true;
+			}, pick(this.options.hideDelay, 500));
+
+			// hide previous hoverPoints and set new
+			if (hoverPoints) {
+				each(hoverPoints, function (point) {
+					point.setState();
+				});
+			}
+
+			this.chart.hoverPoints = null;
+		}
+	},
+	
+	/** 
+	 * Extendable method to get the anchor position of the tooltip
+	 * from a point or set of points
+	 */
+	getAnchor: function (points, mouseEvent) {
+		var ret,
+			chart = this.chart,
+			inverted = chart.inverted,
+			plotTop = chart.plotTop,
+			plotX = 0,
+			plotY = 0,
+			yAxis;
+		
+		points = splat(points);
+		
+		// Pie uses a special tooltipPos
+		ret = points[0].tooltipPos;
+		
+		// When tooltip follows mouse, relate the position to the mouse
+		if (this.followPointer && mouseEvent) {
+			if (mouseEvent.chartX === UNDEFINED) {
+				mouseEvent = chart.pointer.normalize(mouseEvent);
+			}
+			ret = [
+				mouseEvent.chartX - chart.plotLeft,
+				mouseEvent.chartY - plotTop
+			];
+		}
+		// When shared, use the average position
+		if (!ret) {
+			each(points, function (point) {
+				yAxis = point.series.yAxis;
+				plotX += point.plotX;
+				plotY += (point.plotLow ? (point.plotLow + point.plotHigh) / 2 : point.plotY) +
+					(!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151
+			});
+			
+			plotX /= points.length;
+			plotY /= points.length;
+			
+			ret = [
+				inverted ? chart.plotWidth - plotY : plotX,
+				this.shared && !inverted && points.length > 1 && mouseEvent ? 
+					mouseEvent.chartY - plotTop : // place shared tooltip next to the mouse (#424)
+					inverted ? chart.plotHeight - plotX : plotY
+			];
+		}
+
+		return map(ret, mathRound);
+	},
+	
+	/**
+	 * Place the tooltip in a chart without spilling over
+	 * and not covering the point it self.
+	 */
+	getPosition: function (boxWidth, boxHeight, point) {
+		
+		var chart = this.chart,
+			distance = this.distance,
+			ret = {},
+			swapped,
+			first = ['y', chart.chartHeight, boxHeight, point.plotY + chart.plotTop],
+			second = ['x', chart.chartWidth, boxWidth, point.plotX + chart.plotLeft],
+			// The far side is right or bottom
+			preferFarSide = point.ttBelow || (chart.inverted && !point.negative) || (!chart.inverted && point.negative),
+			/**
+			 * Handle the preferred dimension. When the preferred dimension is tooltip
+			 * on top or bottom of the point, it will look for space there.
+			 */
+			firstDimension = function (dim, outerSize, innerSize, point) {
+				var roomLeft = innerSize < point - distance,
+					roomRight = point + distance + innerSize < outerSize,
+					alignedLeft = point - distance - innerSize,
+					alignedRight = point + distance;
+
+				if (preferFarSide && roomRight) {
+					ret[dim] = alignedRight;
+				} else if (!preferFarSide && roomLeft) {
+					ret[dim] = alignedLeft;
+				} else if (roomLeft) {
+					ret[dim] = alignedLeft;
+				} else if (roomRight) {
+					ret[dim] = alignedRight;
+				} else {
+					return false;
+				}
+			},
+			/**
+			 * Handle the secondary dimension. If the preferred dimension is tooltip
+			 * on top or bottom of the point, the second dimension is to align the tooltip
+			 * above the point, trying to align center but allowing left or right
+			 * align within the chart box.
+			 */
+			secondDimension = function (dim, outerSize, innerSize, point) {
+				// Too close to the edge, return false and swap dimensions
+				if (point < distance || point > outerSize - distance) {
+					return false;
+				
+				// Align left/top
+				} else if (point < innerSize / 2) {
+					ret[dim] = 1;
+				// Align right/bottom
+				} else if (point > outerSize - innerSize / 2) {
+					ret[dim] = outerSize - innerSize - 2;
+				// Align center
+				} else {
+					ret[dim] = point - innerSize / 2;
+				}
+			},
+			/**
+			 * Swap the dimensions 
+			 */
+			swap = function (count) {
+				var temp = first;
+				first = second;
+				second = temp;
+				swapped = count;
+			},
+			run = function () {
+				if (firstDimension.apply(0, first) !== false) {
+					if (secondDimension.apply(0, second) === false && !swapped) {
+						swap(true);
+						run();
+					}
+				} else if (!swapped) {
+					swap(true);
+					run();
+				} else {
+					ret.x = ret.y = 0;
+				}
+			};
+
+		// Under these conditions, prefer the tooltip on the side of the point
+		if (chart.inverted || this.len > 1) {
+			swap();
+		}
+		run();
+
+		return ret;
+	
+	},
+
+	/**
+	 * In case no user defined formatter is given, this will be used. Note that the context
+	 * here is an object holding point, series, x, y etc.
+	 */
+	defaultFormatter: function (tooltip) {
+		var items = this.points || splat(this),
+			series = items[0].series,
+			s;
+
+		// build the header
+		s = [tooltip.tooltipHeaderFormatter(items[0])];
+
+		// build the values
+		each(items, function (item) {
+			series = item.series;
+			s.push((series.tooltipFormatter && series.tooltipFormatter(item)) ||
+				item.point.tooltipFormatter(series.tooltipOptions.pointFormat));
+		});
+
+		// footer
+		s.push(tooltip.options.footerFormat || '');
+
+		return s.join('');
+	},
+
+	/**
+	 * Refresh the tooltip's text and position.
+	 * @param {Object} point
+	 */
+	refresh: function (point, mouseEvent) {
+		var tooltip = this,
+			chart = tooltip.chart,
+			label = tooltip.label,
+			options = tooltip.options,
+			x,
+			y,
+			anchor,
+			textConfig = {},
+			text,
+			pointConfig = [],
+			formatter = options.formatter || tooltip.defaultFormatter,
+			hoverPoints = chart.hoverPoints,
+			borderColor,
+			shared = tooltip.shared,
+			currentSeries;
+			
+		clearTimeout(this.hideTimer);
+		
+		// get the reference point coordinates (pie charts use tooltipPos)
+		tooltip.followPointer = splat(point)[0].series.tooltipOptions.followPointer;
+		anchor = tooltip.getAnchor(point, mouseEvent);
+		x = anchor[0];
+		y = anchor[1];
+
+		// shared tooltip, array is sent over
+		if (shared && !(point.series && point.series.noSharedTooltip)) {
+			
+			// hide previous hoverPoints and set new
+			
+			chart.hoverPoints = point;
+			if (hoverPoints) {
+				each(hoverPoints, function (point) {
+					point.setState();
+				});
+			}
+
+			each(point, function (item) {
+				item.setState(HOVER_STATE);
+
+				pointConfig.push(item.getLabelConfig());
+			});
+
+			textConfig = {
+				x: point[0].category,
+				y: point[0].y
+			};
+			textConfig.points = pointConfig;
+			this.len = pointConfig.length;
+			point = point[0];
+
+		// single point tooltip
+		} else {
+			textConfig = point.getLabelConfig();
+		}
+		text = formatter.call(textConfig, tooltip);
+
+		// register the current series
+		currentSeries = point.series;
+		this.distance = pick(currentSeries.tooltipOptions.distance, 16);
+
+		// update the inner HTML
+		if (text === false) {
+			this.hide();
+		} else {
+
+			// show it
+			if (tooltip.isHidden) {
+				stop(label);
+				label.attr('opacity', 1).show();
+			}
+
+			// update text
+			label.attr({
+				text: text
+			});
+
+			// set the stroke color of the box
+			borderColor = options.borderColor || point.color || currentSeries.color || '#606060';
+			label.attr({
+				stroke: borderColor
+			});
+			
+			tooltip.updatePosition({ plotX: x, plotY: y, negative: point.negative, ttBelow: point.ttBelow });
+		
+			this.isHidden = false;
+		}
+		fireEvent(chart, 'tooltipRefresh', {
+				text: text,
+				x: x + chart.plotLeft,
+				y: y + chart.plotTop,
+				borderColor: borderColor
+			});
+	},
+	
+	/**
+	 * Find the new position and perform the move
+	 */
+	updatePosition: function (point) {
+		var chart = this.chart,
+			label = this.label, 
+			pos = (this.options.positioner || this.getPosition).call(
+				this,
+				label.width,
+				label.height,
+				point
+			);
+
+		// do the move
+		this.move(
+			mathRound(pos.x), 
+			mathRound(pos.y), 
+			point.plotX + chart.plotLeft, 
+			point.plotY + chart.plotTop
+		);
+	},
+
+
+	/**
+	 * Format the header of the tooltip
+	 */
+	tooltipHeaderFormatter: function (point) {
+		var series = point.series,
+			tooltipOptions = series.tooltipOptions,
+			dateTimeLabelFormats = tooltipOptions.dateTimeLabelFormats,
+			xDateFormat = tooltipOptions.xDateFormat,
+			xAxis = series.xAxis,
+			isDateTime = xAxis && xAxis.options.type === 'datetime' && isNumber(point.key),
+			headerFormat = tooltipOptions.headerFormat,
+			closestPointRange = xAxis && xAxis.closestPointRange,
+			n;
+
+		// Guess the best date format based on the closest point distance (#568)
+		if (isDateTime && !xDateFormat) {
+			if (closestPointRange) {
+				for (n in timeUnits) {
+					if (timeUnits[n] >= closestPointRange || 
+							// If the point is placed every day at 23:59, we need to show
+							// the minutes as well. This logic only works for time units less than 
+							// a day, since all higher time units are dividable by those. #2637.
+							(timeUnits[n] <= timeUnits.day && point.key % timeUnits[n] > 0)) {
+						xDateFormat = dateTimeLabelFormats[n];
+						break;
+					}
+				}
+			} else {
+				xDateFormat = dateTimeLabelFormats.day;
+			}
+
+			xDateFormat = xDateFormat || dateTimeLabelFormats.year; // #2546, 2581
+
+		}
+
+		// Insert the header date format if any
+		if (isDateTime && xDateFormat) {
+			headerFormat = headerFormat.replace('{point.key}', '{point.key:' + xDateFormat + '}');
+		}
+
+		return format(headerFormat, {
+			point: point,
+			series: series
+		});
+	}
+};
+
+var hoverChartIndex;
+
+// Global flag for touch support
+hasTouch = doc.documentElement.ontouchstart !== UNDEFINED;
+
+/**
+ * The mouse tracker object. All methods starting with "on" are primary DOM event handlers. 
+ * Subsequent methods should be named differently from what they are doing.
+ * @param {Object} chart The Chart instance
+ * @param {Object} options The root options object
+ */
+var Pointer = Highcharts.Pointer = function (chart, options) {
+	this.init(chart, options);
+};
+
+Pointer.prototype = {
+	/**
+	 * Initialize Pointer
+	 */
+	init: function (chart, options) {
+		
+		var chartOptions = options.chart,
+			chartEvents = chartOptions.events,
+			zoomType = useCanVG ? '' : chartOptions.zoomType,
+			inverted = chart.inverted,
+			zoomX,
+			zoomY;
+
+		// Store references
+		this.options = options;
+		this.chart = chart;
+		
+		// Zoom status
+		this.zoomX = zoomX = /x/.test(zoomType);
+		this.zoomY = zoomY = /y/.test(zoomType);
+		this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);
+		this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);
+		this.hasZoom = zoomX || zoomY;
+
+		// Do we need to handle click on a touch device?
+		this.runChartClick = chartEvents && !!chartEvents.click;
+
+		this.pinchDown = [];
+		this.lastValidTouch = {};
+
+		if (Highcharts.Tooltip && options.tooltip.enabled) {
+			chart.tooltip = new Tooltip(chart, options.tooltip);
+			this.followTouchMove = options.tooltip.followTouchMove;
+		}
+
+		this.setDOMEvents();
+	}, 
+
+	/**
+	 * Add crossbrowser support for chartX and chartY
+	 * @param {Object} e The event object in standard browsers
+	 */
+	normalize: function (e, chartPosition) {
+		var chartX,
+			chartY,
+			ePos;
+
+		// common IE normalizing
+		e = e || window.event;
+
+		// Framework specific normalizing (#1165)
+		e = washMouseEvent(e);
+
+		// More IE normalizing, needs to go after washMouseEvent
+		if (!e.target) {
+			e.target = e.srcElement;
+		}
+		
+		// iOS (#2757)
+		ePos = e.touches ?  (e.touches.length ? e.touches.item(0) : e.changedTouches[0]) : e;
+
+		// Get mouse position
+		if (!chartPosition) {
+			this.chartPosition = chartPosition = offset(this.chart.container);
+		}
+
+		// chartX and chartY
+		if (ePos.pageX === UNDEFINED) { // IE < 9. #886.
+			chartX = mathMax(e.x, e.clientX - chartPosition.left); // #2005, #2129: the second case is 
+				// for IE10 quirks mode within framesets
+			chartY = e.y;
+		} else {
+			chartX = ePos.pageX - chartPosition.left;
+			chartY = ePos.pageY - chartPosition.top;
+		}
+
+		return extend(e, {
+			chartX: mathRound(chartX),
+			chartY: mathRound(chartY)
+		});
+	},
+
+	/**
+	 * Get the click position in terms of axis values.
+	 *
+	 * @param {Object} e A pointer event
+	 */
+	getCoordinates: function (e) {
+		var coordinates = {
+				xAxis: [],
+				yAxis: []
+			};
+
+		each(this.chart.axes, function (axis) {
+			coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({
+				axis: axis,
+				value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])
+			});
+		});
+		return coordinates;
+	},
+	
+	/**
+	 * Return the index in the tooltipPoints array, corresponding to pixel position in 
+	 * the plot area.
+	 */
+	getIndex: function (e) {
+		var chart = this.chart;
+		return chart.inverted ? 
+			chart.plotHeight + chart.plotTop - e.chartY : 
+			e.chartX - chart.plotLeft;
+	},
+
+	/**
+	 * With line type charts with a single tracker, get the point closest to the mouse.
+	 * Run Point.onMouseOver and display tooltip for the point or points.
+	 */
+	runPointActions: function (e) {
+		var pointer = this,
+			chart = pointer.chart,
+			series = chart.series,
+			tooltip = chart.tooltip,
+			followPointer,
+			point,
+			points,
+			hoverPoint = chart.hoverPoint,
+			hoverSeries = chart.hoverSeries,
+			i,
+			j,
+			distance = chart.chartWidth,
+			index = pointer.getIndex(e),
+			anchor;
+
+		// shared tooltip
+		if (tooltip && pointer.options.tooltip.shared && !(hoverSeries && hoverSeries.noSharedTooltip)) {
+			points = [];
+
+			// loop over all series and find the ones with points closest to the mouse
+			i = series.length;
+			for (j = 0; j < i; j++) {
+				if (series[j].visible &&
+						series[j].options.enableMouseTracking !== false &&
+						!series[j].noSharedTooltip && series[j].singularTooltips !== true && series[j].tooltipPoints.length) {
+					point = series[j].tooltipPoints[index];
+					if (point && point.series) { // not a dummy point, #1544
+						point._dist = mathAbs(index - point.clientX);
+						distance = mathMin(distance, point._dist);
+						points.push(point);
+					}
+				}
+			}
+			// remove furthest points
+			i = points.length;
+			while (i--) {
+				if (points[i]._dist > distance) {
+					points.splice(i, 1);
+				}
+			}
+			// refresh the tooltip if necessary
+			if (points.length && (points[0].clientX !== pointer.hoverX)) {
+				tooltip.refresh(points, e);
+				pointer.hoverX = points[0].clientX;
+			}
+		}
+
+		// Separate tooltip and general mouse events
+		followPointer = hoverSeries && hoverSeries.tooltipOptions.followPointer;
+		if (hoverSeries && hoverSeries.tracker && !followPointer) { // #2584, #2830
+
+			// get the point
+			point = hoverSeries.tooltipPoints[index];
+
+			// a new point is hovered, refresh the tooltip
+			if (point && point !== hoverPoint) {
+
+				// trigger the events
+				point.onMouseOver(e);
+
+			}
+			
+		} else if (tooltip && followPointer && !tooltip.isHidden) {
+			anchor = tooltip.getAnchor([{}], e);
+			tooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });
+		}
+
+		// Start the event listener to pick up the tooltip 
+		if (tooltip && !pointer._onDocumentMouseMove) {
+			pointer._onDocumentMouseMove = function (e) {
+				if (charts[hoverChartIndex]) {
+					charts[hoverChartIndex].pointer.onDocumentMouseMove(e);
+				}
+			};
+			addEvent(doc, 'mousemove', pointer._onDocumentMouseMove);
+		}
+
+		// Draw independent crosshairs
+		each(chart.axes, function (axis) {
+			axis.drawCrosshair(e, pick(point, hoverPoint));
+		});
+	},
+
+
+
+	/**
+	 * Reset the tracking by hiding the tooltip, the hover series state and the hover point
+	 * 
+	 * @param allowMove {Boolean} Instead of destroying the tooltip altogether, allow moving it if possible
+	 */
+	reset: function (allowMove) {
+		var pointer = this,
+			chart = pointer.chart,
+			hoverSeries = chart.hoverSeries,
+			hoverPoint = chart.hoverPoint,
+			tooltip = chart.tooltip,
+			tooltipPoints = tooltip && tooltip.shared ? chart.hoverPoints : hoverPoint;
+			
+		// Narrow in allowMove
+		allowMove = allowMove && tooltip && tooltipPoints;
+			
+		// Check if the points have moved outside the plot area, #1003
+		if (allowMove && splat(tooltipPoints)[0].plotX === UNDEFINED) {
+			allowMove = false;
+		}	
+
+		// Just move the tooltip, #349
+		if (allowMove) {
+			tooltip.refresh(tooltipPoints);
+			if (hoverPoint) { // #2500
+				hoverPoint.setState(hoverPoint.state, true);
+			}
+
+		// Full reset
+		} else {
+
+			if (hoverPoint) {
+				hoverPoint.onMouseOut();
+			}
+
+			if (hoverSeries) {
+				hoverSeries.onMouseOut();
+			}
+
+			if (tooltip) {
+				tooltip.hide();
+			}
+
+			if (pointer._onDocumentMouseMove) {
+				removeEvent(doc, 'mousemove', pointer._onDocumentMouseMove);
+				pointer._onDocumentMouseMove = null;
+			}
+
+			// Remove crosshairs
+			each(chart.axes, function (axis) {
+				axis.hideCrosshair();
+			});
+			
+			pointer.hoverX = null;
+
+		}
+	},
+
+	/**
+	 * Scale series groups to a certain scale and translation
+	 */
+	scaleGroups: function (attribs, clip) {
+
+		var chart = this.chart,
+			seriesAttribs;
+
+		// Scale each series
+		each(chart.series, function (series) {
+			seriesAttribs = attribs || series.getPlotBox(); // #1701
+			if (series.xAxis && series.xAxis.zoomEnabled) {
+				series.group.attr(seriesAttribs);
+				if (series.markerGroup) {
+					series.markerGroup.attr(seriesAttribs);
+					series.markerGroup.clip(clip ? chart.clipRect : null);
+				}
+				if (series.dataLabelsGroup) {
+					series.dataLabelsGroup.attr(seriesAttribs);
+				}
+			}
+		});
+		
+		// Clip
+		chart.clipRect.attr(clip || chart.clipBox);
+	},
+
+	/**
+	 * Start a drag operation
+	 */
+	dragStart: function (e) {
+		var chart = this.chart;
+
+		// Record the start position
+		chart.mouseIsDown = e.type;
+		chart.cancelClick = false;
+		chart.mouseDownX = this.mouseDownX = e.chartX;
+		chart.mouseDownY = this.mouseDownY = e.chartY;
+	},
+
+	/**
+	 * Perform a drag operation in response to a mousemove event while the mouse is down
+	 */
+	drag: function (e) {
+
+		var chart = this.chart,
+			chartOptions = chart.options.chart,
+			chartX = e.chartX,
+			chartY = e.chartY,
+			zoomHor = this.zoomHor,
+			zoomVert = this.zoomVert,
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop,
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			clickedInside,
+			size,
+			mouseDownX = this.mouseDownX,
+			mouseDownY = this.mouseDownY,
+			panKey = chartOptions.panKey && e[chartOptions.panKey + 'Key'];
+
+		// If the mouse is outside the plot area, adjust to cooordinates
+		// inside to prevent the selection marker from going outside
+		if (chartX < plotLeft) {
+			chartX = plotLeft;
+		} else if (chartX > plotLeft + plotWidth) {
+			chartX = plotLeft + plotWidth;
+		}
+
+		if (chartY < plotTop) {
+			chartY = plotTop;
+		} else if (chartY > plotTop + plotHeight) {
+			chartY = plotTop + plotHeight;
+		}
+		
+		// determine if the mouse has moved more than 10px
+		this.hasDragged = Math.sqrt(
+			Math.pow(mouseDownX - chartX, 2) +
+			Math.pow(mouseDownY - chartY, 2)
+		);
+		
+		if (this.hasDragged > 10) {
+			clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);
+
+			// make a selection
+			if (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside && !panKey) {
+				if (!this.selectionMarker) {
+					this.selectionMarker = chart.renderer.rect(
+						plotLeft,
+						plotTop,
+						zoomHor ? 1 : plotWidth,
+						zoomVert ? 1 : plotHeight,
+						0
+					)
+					.attr({
+						fill: chartOptions.selectionMarkerFill || 'rgba(69,114,167,0.25)',
+						zIndex: 7
+					})
+					.add();
+				}
+			}
+
+			// adjust the width of the selection marker
+			if (this.selectionMarker && zoomHor) {
+				size = chartX - mouseDownX;
+				this.selectionMarker.attr({
+					width: mathAbs(size),
+					x: (size > 0 ? 0 : size) + mouseDownX
+				});
+			}
+			// adjust the height of the selection marker
+			if (this.selectionMarker && zoomVert) {
+				size = chartY - mouseDownY;
+				this.selectionMarker.attr({
+					height: mathAbs(size),
+					y: (size > 0 ? 0 : size) + mouseDownY
+				});
+			}
+
+			// panning
+			if (clickedInside && !this.selectionMarker && chartOptions.panning) {
+				chart.pan(e, chartOptions.panning);
+			}
+		}
+	},
+
+	/**
+	 * On mouse up or touch end across the entire document, drop the selection.
+	 */
+	drop: function (e) {
+		var chart = this.chart,
+			hasPinched = this.hasPinched;
+
+		if (this.selectionMarker) {
+			var selectionData = {
+					xAxis: [],
+					yAxis: [],
+					originalEvent: e.originalEvent || e
+				},
+				selectionBox = this.selectionMarker,
+				selectionLeft = selectionBox.attr ? selectionBox.attr('x') : selectionBox.x,
+				selectionTop = selectionBox.attr ? selectionBox.attr('y') : selectionBox.y,
+				selectionWidth = selectionBox.attr ? selectionBox.attr('width') : selectionBox.width,
+				selectionHeight = selectionBox.attr ? selectionBox.attr('height') : selectionBox.height,
+				runZoom;
+
+			// a selection has been made
+			if (this.hasDragged || hasPinched) {
+
+				// record each axis' min and max
+				each(chart.axes, function (axis) {
+					if (axis.zoomEnabled) {
+						var horiz = axis.horiz,
+							minPixelPadding = e.type === 'touchend' ? axis.minPixelPadding: 0, // #1207, #3075
+							selectionMin = axis.toValue((horiz ? selectionLeft : selectionTop) + minPixelPadding),
+							selectionMax = axis.toValue((horiz ? selectionLeft + selectionWidth : selectionTop + selectionHeight) - minPixelPadding);
+
+						if (!isNaN(selectionMin) && !isNaN(selectionMax)) { // #859
+							selectionData[axis.coll].push({
+								axis: axis,
+								min: mathMin(selectionMin, selectionMax), // for reversed axes,
+								max: mathMax(selectionMin, selectionMax)
+							});
+							runZoom = true;
+						}
+					}
+				});
+				if (runZoom) {
+					fireEvent(chart, 'selection', selectionData, function (args) { 
+						chart.zoom(extend(args, hasPinched ? { animation: false } : null)); 
+					});
+				}
+
+			}
+			this.selectionMarker = this.selectionMarker.destroy();
+
+			// Reset scaling preview
+			if (hasPinched) {
+				this.scaleGroups();
+			}
+		}
+
+		// Reset all
+		if (chart) { // it may be destroyed on mouse up - #877
+			css(chart.container, { cursor: chart._cursor });
+			chart.cancelClick = this.hasDragged > 10; // #370
+			chart.mouseIsDown = this.hasDragged = this.hasPinched = false;
+			this.pinchDown = [];
+		}
+	},
+
+	onContainerMouseDown: function (e) {
+
+		e = this.normalize(e);
+
+		// issue #295, dragging not always working in Firefox
+		if (e.preventDefault) {
+			e.preventDefault();
+		}
+		
+		this.dragStart(e);
+	},
+
+	
+
+	onDocumentMouseUp: function (e) {
+		if (charts[hoverChartIndex]) {
+			charts[hoverChartIndex].pointer.drop(e);
+		}
+	},
+
+	/**
+	 * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.
+	 * Issue #149 workaround. The mouseleave event does not always fire. 
+	 */
+	onDocumentMouseMove: function (e) {
+		var chart = this.chart,
+			chartPosition = this.chartPosition,
+			hoverSeries = chart.hoverSeries;
+
+		e = this.normalize(e, chartPosition);
+
+		// If we're outside, hide the tooltip
+		if (chartPosition && hoverSeries && !this.inClass(e.target, 'highcharts-tracker') &&
+				!chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+			this.reset();
+		}
+	},
+
+	/**
+	 * When mouse leaves the container, hide the tooltip.
+	 */
+	onContainerMouseLeave: function () {
+		var chart = charts[hoverChartIndex];
+		if (chart) {
+			chart.pointer.reset();
+			chart.pointer.chartPosition = null; // also reset the chart position, used in #149 fix
+		}
+	},
+
+	// The mousemove, touchmove and touchstart event handler
+	onContainerMouseMove: function (e) {
+
+		var chart = this.chart;
+
+		hoverChartIndex = chart.index;
+
+		e = this.normalize(e);		
+		e.returnValue = false; // #2251, #3224
+		
+		if (chart.mouseIsDown === 'mousedown') {
+			this.drag(e);
+		} 
+		
+		// Show the tooltip and run mouse over events (#977)
+		if ((this.inClass(e.target, 'highcharts-tracker') || 
+				chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) && !chart.openMenu) {
+			this.runPointActions(e);
+		}
+	},
+
+	/**
+	 * Utility to detect whether an element has, or has a parent with, a specific
+	 * class name. Used on detection of tracker objects and on deciding whether
+	 * hovering the tooltip should cause the active series to mouse out.
+	 */
+	inClass: function (element, className) {
+		var elemClassName;
+		while (element) {
+			elemClassName = attr(element, 'class');
+			if (elemClassName) {
+				if (elemClassName.indexOf(className) !== -1) {
+					return true;
+				} else if (elemClassName.indexOf(PREFIX + 'container') !== -1) {
+					return false;
+				}
+			}
+			element = element.parentNode;
+		}		
+	},
+
+	onTrackerMouseOut: function (e) {
+		var series = this.chart.hoverSeries,
+			relatedTarget = e.relatedTarget || e.toElement,
+			relatedSeries = relatedTarget && relatedTarget.point && relatedTarget.point.series; // #2499
+		
+		if (series && !series.options.stickyTracking && !this.inClass(relatedTarget, PREFIX + 'tooltip') &&
+				relatedSeries !== series) {
+			series.onMouseOut();
+		}
+	},
+
+	onContainerClick: function (e) {
+		var chart = this.chart,
+			hoverPoint = chart.hoverPoint, 
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop;
+		
+		e = this.normalize(e);
+		e.cancelBubble = true; // IE specific
+
+		if (!chart.cancelClick) {
+			
+			// On tracker click, fire the series and point events. #783, #1583
+			if (hoverPoint && this.inClass(e.target, PREFIX + 'tracker')) {
+
+				// the series click event
+				fireEvent(hoverPoint.series, 'click', extend(e, {
+					point: hoverPoint
+				}));
+
+				// the point click event
+				if (chart.hoverPoint) { // it may be destroyed (#1844)
+					hoverPoint.firePointEvent('click', e);
+				}
+
+			// When clicking outside a tracker, fire a chart event
+			} else {
+				extend(e, this.getCoordinates(e));
+
+				// fire a click event in the chart
+				if (chart.isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) {
+					fireEvent(chart, 'click', e);
+				}
+			}
+
+
+		}
+	},
+
+	/**
+	 * Set the JS DOM events on the container and document. This method should contain
+	 * a one-to-one assignment between methods and their handlers. Any advanced logic should
+	 * be moved to the handler reflecting the event's name.
+	 */
+	setDOMEvents: function () {
+
+		var pointer = this,
+			container = pointer.chart.container;
+
+		container.onmousedown = function (e) {
+			pointer.onContainerMouseDown(e);
+		};
+		container.onmousemove = function (e) {
+			pointer.onContainerMouseMove(e);
+		};
+		container.onclick = function (e) {
+			pointer.onContainerClick(e);
+		};
+		addEvent(container, 'mouseleave', pointer.onContainerMouseLeave);
+		if (chartCount === 1) {
+			addEvent(doc, 'mouseup', pointer.onDocumentMouseUp);
+		}
+		if (hasTouch) {
+			container.ontouchstart = function (e) {
+				pointer.onContainerTouchStart(e);
+			};
+			container.ontouchmove = function (e) {
+				pointer.onContainerTouchMove(e);
+			};
+			if (chartCount === 1) {
+				addEvent(doc, 'touchend', pointer.onDocumentTouchEnd);
+			}
+		}
+		
+	},
+
+	/**
+	 * Destroys the Pointer object and disconnects DOM events.
+	 */
+	destroy: function () {
+		var prop;
+
+		removeEvent(this.chart.container, 'mouseleave', this.onContainerMouseLeave);
+		if (!chartCount) {
+			removeEvent(doc, 'mouseup', this.onDocumentMouseUp);
+			removeEvent(doc, 'touchend', this.onDocumentTouchEnd);
+		}
+
+		// memory and CPU leak
+		clearInterval(this.tooltipTimeout);
+
+		for (prop in this) {
+			this[prop] = null;
+		}
+	}
+};
+
+
+/* Support for touch devices */
+extend(Highcharts.Pointer.prototype, {
+
+	/**
+	 * Run translation operations
+	 */
+	pinchTranslate: function (pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {
+		if (this.zoomHor || this.pinchHor) {
+			this.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+		}
+		if (this.zoomVert || this.pinchVert) {
+			this.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+		}
+	},
+
+	/**
+	 * Run translation operations for each direction (horizontal and vertical) independently
+	 */
+	pinchTranslateDirection: function (horiz, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch, forcedScale) {
+		var chart = this.chart,
+			xy = horiz ? 'x' : 'y',
+			XY = horiz ? 'X' : 'Y',
+			sChartXY = 'chart' + XY,
+			wh = horiz ? 'width' : 'height',
+			plotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')],
+			selectionWH,
+			selectionXY,
+			clipXY,
+			scale = forcedScale || 1,
+			inverted = chart.inverted,
+			bounds = chart.bounds[horiz ? 'h' : 'v'],
+			singleTouch = pinchDown.length === 1,
+			touch0Start = pinchDown[0][sChartXY],
+			touch0Now = touches[0][sChartXY],
+			touch1Start = !singleTouch && pinchDown[1][sChartXY],
+			touch1Now = !singleTouch && touches[1][sChartXY],
+			outOfBounds,
+			transformScale,
+			scaleKey,
+			setScale = function () {
+				if (!singleTouch && mathAbs(touch0Start - touch1Start) > 20) { // Don't zoom if fingers are too close on this axis
+					scale = forcedScale || mathAbs(touch0Now - touch1Now) / mathAbs(touch0Start - touch1Start); 
+				}
+				
+				clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;
+				selectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;
+			};
+
+		// Set the scale, first pass
+		setScale();
+
+		selectionXY = clipXY; // the clip position (x or y) is altered if out of bounds, the selection position is not
+
+		// Out of bounds
+		if (selectionXY < bounds.min) {
+			selectionXY = bounds.min;
+			outOfBounds = true;
+		} else if (selectionXY + selectionWH > bounds.max) {
+			selectionXY = bounds.max - selectionWH;
+			outOfBounds = true;
+		}
+		
+		// Is the chart dragged off its bounds, determined by dataMin and dataMax?
+		if (outOfBounds) {
+
+			// Modify the touchNow position in order to create an elastic drag movement. This indicates
+			// to the user that the chart is responsive but can't be dragged further.
+			touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);
+			if (!singleTouch) {
+				touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);
+			}
+
+			// Set the scale, second pass to adapt to the modified touchNow positions
+			setScale();
+
+		} else {
+			lastValidTouch[xy] = [touch0Now, touch1Now];
+		}
+
+		// Set geometry for clipping, selection and transformation
+		if (!inverted) { // TODO: implement clipping for inverted charts
+			clip[xy] = clipXY - plotLeftTop;
+			clip[wh] = selectionWH;
+		}
+		scaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;
+		transformScale = inverted ? 1 / scale : scale;
+
+		selectionMarker[wh] = selectionWH;
+		selectionMarker[xy] = selectionXY;
+		transform[scaleKey] = scale;
+		transform['translate' + XY] = (transformScale * plotLeftTop) + (touch0Now - (transformScale * touch0Start));
+	},
+	
+	/**
+	 * Handle touch events with two touches
+	 */
+	pinch: function (e) {
+
+		var self = this,
+			chart = self.chart,
+			pinchDown = self.pinchDown,
+			followTouchMove = self.followTouchMove,
+			touches = e.touches,
+			touchesLength = touches.length,
+			lastValidTouch = self.lastValidTouch,
+			hasZoom = self.hasZoom,
+			selectionMarker = self.selectionMarker,
+			transform = {},
+			fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, PREFIX + 'tracker') && 
+				chart.runTrackerClick) || chart.runChartClick),
+			clip = {};
+
+		// On touch devices, only proceed to trigger click if a handler is defined
+		if ((hasZoom || followTouchMove) && !fireClickEvent) {
+			e.preventDefault();
+		}
+		
+		// Normalize each touch
+		map(touches, function (e) {
+			return self.normalize(e);
+		});
+		
+		// Register the touch start position
+		if (e.type === 'touchstart') {
+			each(touches, function (e, i) {
+				pinchDown[i] = { chartX: e.chartX, chartY: e.chartY };
+			});
+			lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];
+			lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];
+
+			// Identify the data bounds in pixels
+			each(chart.axes, function (axis) {
+				if (axis.zoomEnabled) {
+					var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],
+						minPixelPadding = axis.minPixelPadding,
+						min = axis.toPixels(pick(axis.options.min, axis.dataMin)),
+						max = axis.toPixels(pick(axis.options.max, axis.dataMax)),
+						absMin = mathMin(min, max),
+						absMax = mathMax(min, max);
+
+					// Store the bounds for use in the touchmove handler
+					bounds.min = mathMin(axis.pos, absMin - minPixelPadding);
+					bounds.max = mathMax(axis.pos + axis.len, absMax + minPixelPadding);
+				}
+			});
+		
+		// Event type is touchmove, handle panning and pinching
+		} else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first
+			
+
+			// Set the marker
+			if (!selectionMarker) {
+				self.selectionMarker = selectionMarker = extend({
+					destroy: noop
+				}, chart.plotBox);
+			}
+			
+			self.pinchTranslate(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+
+			self.hasPinched = hasZoom;
+
+			// Scale and translate the groups to provide visual feedback during pinching
+			self.scaleGroups(transform, clip);
+			
+			// Optionally move the tooltip on touchmove
+			if (!hasZoom && followTouchMove && touchesLength === 1) {
+				this.runPointActions(self.normalize(e));
+			}
+		}
+	},
+
+	onContainerTouchStart: function (e) {
+		var chart = this.chart;
+
+		hoverChartIndex = chart.index;
+
+		if (e.touches.length === 1) {
+
+			e = this.normalize(e);
+
+			if (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+
+				// Run mouse events and display tooltip etc
+				this.runPointActions(e);
+
+				this.pinch(e);
+
+			} else {
+				// Hide the tooltip on touching outside the plot area (#1203)
+				this.reset();
+			}
+
+		} else if (e.touches.length === 2) {
+			this.pinch(e);
+		}   
+	},
+
+	onContainerTouchMove: function (e) {
+		if (e.touches.length === 1 || e.touches.length === 2) {
+			this.pinch(e);
+		}
+	},
+
+	onDocumentTouchEnd: function (e) {
+		if (charts[hoverChartIndex]) {
+			charts[hoverChartIndex].pointer.drop(e);
+		}
+	}
+
+});
+if (win.PointerEvent || win.MSPointerEvent) {
+	
+	// The touches object keeps track of the points being touched at all times
+	var touches = {},
+		hasPointerEvent = !!win.PointerEvent,
+		getWebkitTouches = function () {
+			var key, fake = [];
+			fake.item = function (i) { return this[i]; };
+			for (key in touches) {
+				if (touches.hasOwnProperty(key)) {
+					fake.push({
+						pageX: touches[key].pageX,
+						pageY: touches[key].pageY,
+						target: touches[key].target
+					});
+				}
+			}
+			return fake;
+		},
+		translateMSPointer = function (e, method, wktype, callback) {
+			var p;
+			e = e.originalEvent || e;
+			if ((e.pointerType === 'touch' || e.pointerType === e.MSPOINTER_TYPE_TOUCH) && charts[hoverChartIndex]) {
+				callback(e);
+				p = charts[hoverChartIndex].pointer;
+				p[method]({
+					type: wktype,
+					target: e.currentTarget,
+					preventDefault: noop,
+					touches: getWebkitTouches()
+				});				
+			}
+		};
+
+	/**
+	 * Extend the Pointer prototype with methods for each event handler and more
+	 */
+	extend(Pointer.prototype, {
+		onContainerPointerDown: function (e) {
+			translateMSPointer(e, 'onContainerTouchStart', 'touchstart', function (e) {
+				touches[e.pointerId] = { pageX: e.pageX, pageY: e.pageY, target: e.currentTarget };
+			});
+		},
+		onContainerPointerMove: function (e) {
+			translateMSPointer(e, 'onContainerTouchMove', 'touchmove', function (e) {
+				touches[e.pointerId] = { pageX: e.pageX, pageY: e.pageY };
+				if (!touches[e.pointerId].target) {
+					touches[e.pointerId].target = e.currentTarget;
+				}
+			});
+		},
+		onDocumentPointerUp: function (e) {
+			translateMSPointer(e, 'onContainerTouchEnd', 'touchend', function (e) {
+				delete touches[e.pointerId];
+			});
+		},
+
+		/**
+		 * Add or remove the MS Pointer specific events
+		 */
+		batchMSEvents: function (fn) {
+			fn(this.chart.container, hasPointerEvent ? 'pointerdown' : 'MSPointerDown', this.onContainerPointerDown);
+			fn(this.chart.container, hasPointerEvent ? 'pointermove' : 'MSPointerMove', this.onContainerPointerMove);
+			fn(doc, hasPointerEvent ? 'pointerup' : 'MSPointerUp', this.onDocumentPointerUp);
+		}
+	});
+
+	// Disable default IE actions for pinch and such on chart element
+	wrap(Pointer.prototype, 'init', function (proceed, chart, options) {
+		proceed.call(this, chart, options);
+		if (this.hasZoom || this.followTouchMove) {
+			css(chart.container, {
+				'-ms-touch-action': NONE,
+				'touch-action': NONE
+			});
+		}
+	});
+
+	// Add IE specific touch events to chart
+	wrap(Pointer.prototype, 'setDOMEvents', function (proceed) {
+		proceed.apply(this);
+		if (this.hasZoom || this.followTouchMove) {
+			this.batchMSEvents(addEvent);
+		}
+	});
+	// Destroy MS events also
+	wrap(Pointer.prototype, 'destroy', function (proceed) {
+		this.batchMSEvents(removeEvent);
+		proceed.call(this);
+	});
+}
+/**
+ * The overview of the chart's series
+ */
+var Legend = Highcharts.Legend = function (chart, options) {
+	this.init(chart, options);
+};
+
+Legend.prototype = {
+	
+	/**
+	 * Initialize the legend
+	 */
+	init: function (chart, options) {
+		
+		var legend = this,
+			itemStyle = options.itemStyle,
+			padding = pick(options.padding, 8),
+			itemMarginTop = options.itemMarginTop || 0;
+	
+		this.options = options;
+
+		if (!options.enabled) {
+			return;
+		}
+	
+		legend.itemStyle = itemStyle;
+		legend.itemHiddenStyle = merge(itemStyle, options.itemHiddenStyle);
+		legend.itemMarginTop = itemMarginTop;
+		legend.padding = padding;
+		legend.initialItemX = padding;
+		legend.initialItemY = padding - 5; // 5 is the number of pixels above the text
+		legend.maxItemWidth = 0;
+		legend.chart = chart;
+		legend.itemHeight = 0;
+		legend.lastLineHeight = 0;
+		legend.symbolWidth = pick(options.symbolWidth, 16);
+		legend.pages = [];
+
+
+		// Render it
+		legend.render();
+
+		// move checkboxes
+		addEvent(legend.chart, 'endResize', function () { 
+			legend.positionCheckboxes();
+		});
+
+	},
+
+	/**
+	 * Set the colors for the legend item
+	 * @param {Object} item A Series or Point instance
+	 * @param {Object} visible Dimmed or colored
+	 */
+	colorizeItem: function (item, visible) {
+		var legend = this,
+			options = legend.options,
+			legendItem = item.legendItem,
+			legendLine = item.legendLine,
+			legendSymbol = item.legendSymbol,
+			hiddenColor = legend.itemHiddenStyle.color,
+			textColor = visible ? options.itemStyle.color : hiddenColor,
+			symbolColor = visible ? (item.legendColor || item.color || '#CCC') : hiddenColor,
+			markerOptions = item.options && item.options.marker,
+			symbolAttr = { fill: symbolColor },
+			key,
+			val;
+		
+		if (legendItem) {
+			legendItem.css({ fill: textColor, color: textColor }); // color for #1553, oldIE
+		}
+		if (legendLine) {
+			legendLine.attr({ stroke: symbolColor });
+		}
+		
+		if (legendSymbol) {
+			
+			// Apply marker options
+			if (markerOptions && legendSymbol.isMarker) { // #585
+				symbolAttr.stroke = symbolColor;
+				markerOptions = item.convertAttribs(markerOptions);
+				for (key in markerOptions) {
+					val = markerOptions[key];
+					if (val !== UNDEFINED) {
+						symbolAttr[key] = val;
+					}
+				}
+			}
+
+			legendSymbol.attr(symbolAttr);
+		}
+	},
+
+	/**
+	 * Position the legend item
+	 * @param {Object} item A Series or Point instance
+	 */
+	positionItem: function (item) {
+		var legend = this,
+			options = legend.options,
+			symbolPadding = options.symbolPadding,
+			ltr = !options.rtl,
+			legendItemPos = item._legendItemPos,
+			itemX = legendItemPos[0],
+			itemY = legendItemPos[1],
+			checkbox = item.checkbox;
+
+		if (item.legendGroup) {
+			item.legendGroup.translate(
+				ltr ? itemX : legend.legendWidth - itemX - 2 * symbolPadding - 4,
+				itemY
+			);
+		}
+
+		if (checkbox) {
+			checkbox.x = itemX;
+			checkbox.y = itemY;
+		}
+	},
+
+	/**
+	 * Destroy a single legend item
+	 * @param {Object} item The series or point
+	 */
+	destroyItem: function (item) {
+		var checkbox = item.checkbox;
+
+		// destroy SVG elements
+		each(['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'], function (key) {
+			if (item[key]) {
+				item[key] = item[key].destroy();
+			}
+		});
+
+		if (checkbox) {
+			discardElement(item.checkbox);
+		}
+	},
+
+	/**
+	 * Destroys the legend.
+	 */
+	destroy: function () {
+		var legend = this,
+			legendGroup = legend.group,
+			box = legend.box;
+
+		if (box) {
+			legend.box = box.destroy();
+		}
+
+		if (legendGroup) {
+			legend.group = legendGroup.destroy();
+		}
+	},
+
+	/**
+	 * Position the checkboxes after the width is determined
+	 */
+	positionCheckboxes: function (scrollOffset) {
+		var alignAttr = this.group.alignAttr,
+			translateY,
+			clipHeight = this.clipHeight || this.legendHeight;
+
+		if (alignAttr) {
+			translateY = alignAttr.translateY;
+			each(this.allItems, function (item) {
+				var checkbox = item.checkbox,
+					top;
+				
+				if (checkbox) {
+					top = (translateY + checkbox.y + (scrollOffset || 0) + 3);
+					css(checkbox, {
+						left: (alignAttr.translateX + item.checkboxOffset + checkbox.x - 20) + PX,
+						top: top + PX,
+						display: top > translateY - 6 && top < translateY + clipHeight - 6 ? '' : NONE
+					});
+				}
+			});
+		}
+	},
+	
+	/**
+	 * Render the legend title on top of the legend
+	 */
+	renderTitle: function () {
+		var options = this.options,
+			padding = this.padding,
+			titleOptions = options.title,
+			titleHeight = 0,
+			bBox;
+		
+		if (titleOptions.text) {
+			if (!this.title) {
+				this.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, null, null, null, null, null, 'legend-title')
+					.attr({ zIndex: 1 })
+					.css(titleOptions.style)
+					.add(this.group);
+			}
+			bBox = this.title.getBBox();
+			titleHeight = bBox.height;
+			this.offsetWidth = bBox.width; // #1717
+			this.contentGroup.attr({ translateY: titleHeight });
+		}
+		this.titleHeight = titleHeight;
+	},
+
+	/**
+	 * Render a single specific legend item
+	 * @param {Object} item A series or point
+	 */
+	renderItem: function (item) {
+		var legend = this,
+			chart = legend.chart,
+			renderer = chart.renderer,
+			options = legend.options,
+			horizontal = options.layout === 'horizontal',
+			symbolWidth = legend.symbolWidth,
+			symbolPadding = options.symbolPadding,
+			itemStyle = legend.itemStyle,
+			itemHiddenStyle = legend.itemHiddenStyle,
+			padding = legend.padding,
+			itemDistance = horizontal ? pick(options.itemDistance, 20) : 0,
+			ltr = !options.rtl,
+			itemHeight,
+			widthOption = options.width,
+			itemMarginBottom = options.itemMarginBottom || 0,
+			itemMarginTop = legend.itemMarginTop,
+			initialItemX = legend.initialItemX,
+			bBox,
+			itemWidth,
+			li = item.legendItem,
+			series = item.series && item.series.drawLegendSymbol ? item.series : item,
+			seriesOptions = series.options,
+			showCheckbox = legend.createCheckboxForItem && seriesOptions && seriesOptions.showCheckbox,
+			useHTML = options.useHTML;
+
+		if (!li) { // generate it once, later move it
+
+			// Generate the group box
+			// A group to hold the symbol and text. Text is to be appended in Legend class.
+			item.legendGroup = renderer.g('legend-item')
+				.attr({ zIndex: 1 })
+				.add(legend.scrollGroup);
+
+			// Generate the list item text and add it to the group
+			item.legendItem = li = renderer.text(
+					options.labelFormat ? format(options.labelFormat, item) : options.labelFormatter.call(item),
+					ltr ? symbolWidth + symbolPadding : -symbolPadding,
+					legend.baseline || 0,
+					useHTML
+				)
+				.css(merge(item.visible ? itemStyle : itemHiddenStyle)) // merge to prevent modifying original (#1021)
+				.attr({
+					align: ltr ? 'left' : 'right',
+					zIndex: 2
+				})
+				.add(item.legendGroup);
+
+			// Get the baseline for the first item - the font size is equal for all
+			if (!legend.baseline) {
+				legend.baseline = renderer.fontMetrics(itemStyle.fontSize, li).f + 3 + itemMarginTop;
+				li.attr('y', legend.baseline);
+			}
+
+			// Draw the legend symbol inside the group box
+			series.drawLegendSymbol(legend, item);
+
+			if (legend.setItemEvents) {
+				legend.setItemEvents(item, li, useHTML, itemStyle, itemHiddenStyle);
+			}			
+
+			// Colorize the items
+			legend.colorizeItem(item, item.visible);
+
+			// add the HTML checkbox on top
+			if (showCheckbox) {
+				legend.createCheckboxForItem(item);				
+			}
+		}
+
+		// calculate the positions for the next line
+		bBox = li.getBBox();
+
+		itemWidth = item.checkboxOffset = 
+			options.itemWidth || 
+			item.legendItemWidth || 
+			symbolWidth + symbolPadding + bBox.width + itemDistance + (showCheckbox ? 20 : 0);
+		legend.itemHeight = itemHeight = mathRound(item.legendItemHeight || bBox.height);
+
+		// if the item exceeds the width, start a new line
+		if (horizontal && legend.itemX - initialItemX + itemWidth >
+				(widthOption || (chart.chartWidth - 2 * padding - initialItemX - options.x))) {
+			legend.itemX = initialItemX;
+			legend.itemY += itemMarginTop + legend.lastLineHeight + itemMarginBottom;
+			legend.lastLineHeight = 0; // reset for next line
+		}
+
+		// If the item exceeds the height, start a new column
+		/*if (!horizontal && legend.itemY + options.y + itemHeight > chart.chartHeight - spacingTop - spacingBottom) {
+			legend.itemY = legend.initialItemY;
+			legend.itemX += legend.maxItemWidth;
+			legend.maxItemWidth = 0;
+		}*/
+
+		// Set the edge positions
+		legend.maxItemWidth = mathMax(legend.maxItemWidth, itemWidth);
+		legend.lastItemY = itemMarginTop + legend.itemY + itemMarginBottom;
+		legend.lastLineHeight = mathMax(itemHeight, legend.lastLineHeight); // #915
+
+		// cache the position of the newly generated or reordered items
+		item._legendItemPos = [legend.itemX, legend.itemY];
+
+		// advance
+		if (horizontal) {
+			legend.itemX += itemWidth;
+
+		} else {
+			legend.itemY += itemMarginTop + itemHeight + itemMarginBottom;
+			legend.lastLineHeight = itemHeight;
+		}
+
+		// the width of the widest item
+		legend.offsetWidth = widthOption || mathMax(
+			(horizontal ? legend.itemX - initialItemX - itemDistance : itemWidth) + padding,
+			legend.offsetWidth
+		);
+	},
+
+	/**
+	 * Get all items, which is one item per series for normal series and one item per point
+	 * for pie series.
+	 */
+	getAllItems: function () {
+		var allItems = [];
+		each(this.chart.series, function (series) {
+			var seriesOptions = series.options;
+
+			// Handle showInLegend. If the series is linked to another series, defaults to false.
+			if (!pick(seriesOptions.showInLegend, !defined(seriesOptions.linkedTo) ? UNDEFINED : false, true)) {
+				return;
+			}
+
+			// use points or series for the legend item depending on legendType
+			allItems = allItems.concat(
+					series.legendItems ||
+					(seriesOptions.legendType === 'point' ?
+							series.data :
+							series)
+			);
+		});
+		return allItems;
+	},
+
+	/**
+	 * Render the legend. This method can be called both before and after
+	 * chart.render. If called after, it will only rearrange items instead
+	 * of creating new ones.
+	 */
+	render: function () {
+		var legend = this,
+			chart = legend.chart,
+			renderer = chart.renderer,
+			legendGroup = legend.group,
+			allItems,
+			display,
+			legendWidth,
+			legendHeight,
+			box = legend.box,
+			options = legend.options,
+			padding = legend.padding,
+			legendBorderWidth = options.borderWidth,
+			legendBackgroundColor = options.backgroundColor;
+
+		legend.itemX = legend.initialItemX;
+		legend.itemY = legend.initialItemY;
+		legend.offsetWidth = 0;
+		legend.lastItemY = 0;
+
+		if (!legendGroup) {
+			legend.group = legendGroup = renderer.g('legend')
+				.attr({ zIndex: 7 }) 
+				.add();
+			legend.contentGroup = renderer.g()
+				.attr({ zIndex: 1 }) // above background
+				.add(legendGroup);
+			legend.scrollGroup = renderer.g()
+				.add(legend.contentGroup);
+		}
+		
+		legend.renderTitle();
+
+		// add each series or point
+		allItems = legend.getAllItems();
+
+		// sort by legendIndex
+		stableSort(allItems, function (a, b) {
+			return ((a.options && a.options.legendIndex) || 0) - ((b.options && b.options.legendIndex) || 0);
+		});
+
+		// reversed legend
+		if (options.reversed) {
+			allItems.reverse();
+		}
+
+		legend.allItems = allItems;
+		legend.display = display = !!allItems.length;
+
+		// render the items
+		each(allItems, function (item) {
+			legend.renderItem(item); 
+		});
+
+		// Draw the border
+		legendWidth = options.width || legend.offsetWidth;
+		legendHeight = legend.lastItemY + legend.lastLineHeight + legend.titleHeight;
+		
+		
+		legendHeight = legend.handleOverflow(legendHeight);
+
+		if (legendBorderWidth || legendBackgroundColor) {
+			legendWidth += padding;
+			legendHeight += padding;
+
+			if (!box) {
+				legend.box = box = renderer.rect(
+					0,
+					0,
+					legendWidth,
+					legendHeight,
+					options.borderRadius,
+					legendBorderWidth || 0
+				).attr({
+					stroke: options.borderColor,
+					'stroke-width': legendBorderWidth || 0,
+					fill: legendBackgroundColor || NONE
+				})
+				.add(legendGroup)
+				.shadow(options.shadow);
+				box.isNew = true;
+
+			} else if (legendWidth > 0 && legendHeight > 0) {
+				box[box.isNew ? 'attr' : 'animate'](
+					box.crisp({ width: legendWidth, height: legendHeight })
+				);
+				box.isNew = false;
+			}
+
+			// hide the border if no items
+			box[display ? 'show' : 'hide']();
+		}
+		
+		legend.legendWidth = legendWidth;
+		legend.legendHeight = legendHeight;
+
+		// Now that the legend width and height are established, put the items in the 
+		// final position
+		each(allItems, function (item) {
+			legend.positionItem(item);
+		});
+
+		// 1.x compatibility: positioning based on style
+		/*var props = ['left', 'right', 'top', 'bottom'],
+			prop,
+			i = 4;
+		while (i--) {
+			prop = props[i];
+			if (options.style[prop] && options.style[prop] !== 'auto') {
+				options[i < 2 ? 'align' : 'verticalAlign'] = prop;
+				options[i < 2 ? 'x' : 'y'] = pInt(options.style[prop]) * (i % 2 ? -1 : 1);
+			}
+		}*/
+
+		if (display) {
+			legendGroup.align(extend({
+				width: legendWidth,
+				height: legendHeight
+			}, options), true, 'spacingBox');
+		}
+
+		if (!chart.isResizing) {
+			this.positionCheckboxes();
+		}
+	},
+	
+	/**
+	 * Set up the overflow handling by adding navigation with up and down arrows below the
+	 * legend.
+	 */
+	handleOverflow: function (legendHeight) {
+		var legend = this,
+			chart = this.chart,
+			renderer = chart.renderer,
+			options = this.options,
+			optionsY = options.y,
+			alignTop = options.verticalAlign === 'top',
+			spaceHeight = chart.spacingBox.height + (alignTop ? -optionsY : optionsY) - this.padding,
+			maxHeight = options.maxHeight,
+			clipHeight,
+			clipRect = this.clipRect,
+			navOptions = options.navigation,
+			animation = pick(navOptions.animation, true),
+			arrowSize = navOptions.arrowSize || 12,
+			nav = this.nav,
+			pages = this.pages,
+			lastY,
+			allItems = this.allItems;
+			
+		// Adjust the height
+		if (options.layout === 'horizontal') {
+			spaceHeight /= 2;
+		}
+		if (maxHeight) {
+			spaceHeight = mathMin(spaceHeight, maxHeight);
+		}
+		
+		// Reset the legend height and adjust the clipping rectangle
+		pages.length = 0;
+		if (legendHeight > spaceHeight && !options.useHTML) {
+
+			this.clipHeight = clipHeight = mathMax(spaceHeight - 20 - this.titleHeight - this.padding, 0);
+			this.currentPage = pick(this.currentPage, 1);
+			this.fullHeight = legendHeight;
+			
+			// Fill pages with Y positions so that the top of each a legend item defines
+			// the scroll top for each page (#2098)
+			each(allItems, function (item, i) {
+				var y = item._legendItemPos[1],
+					h = mathRound(item.legendItem.getBBox().height),
+					len = pages.length;
+				
+				if (!len || (y - pages[len - 1] > clipHeight && (lastY || y) !== pages[len - 1])) {
+					pages.push(lastY || y);
+					len++;
+				}
+				
+				if (i === allItems.length - 1 && y + h - pages[len - 1] > clipHeight) {
+					pages.push(y);
+				}
+				if (y !== lastY) {
+					lastY = y;
+				}
+			});
+
+			// Only apply clipping if needed. Clipping causes blurred legend in PDF export (#1787)
+			if (!clipRect) {
+				clipRect = legend.clipRect = renderer.clipRect(0, this.padding, 9999, 0);
+				legend.contentGroup.clip(clipRect);
+			}
+			clipRect.attr({
+				height: clipHeight
+			});
+			
+			// Add navigation elements
+			if (!nav) {
+				this.nav = nav = renderer.g().attr({ zIndex: 1 }).add(this.group);
+				this.up = renderer.symbol('triangle', 0, 0, arrowSize, arrowSize)
+					.on('click', function () {
+						legend.scroll(-1, animation);
+					})
+					.add(nav);
+				this.pager = renderer.text('', 15, 10)
+					.css(navOptions.style)
+					.add(nav);
+				this.down = renderer.symbol('triangle-down', 0, 0, arrowSize, arrowSize)
+					.on('click', function () {
+						legend.scroll(1, animation);
+					})
+					.add(nav);
+			}
+			
+			// Set initial position
+			legend.scroll(0);
+			
+			legendHeight = spaceHeight;
+			
+		} else if (nav) {
+			clipRect.attr({
+				height: chart.chartHeight
+			});
+			nav.hide();
+			this.scrollGroup.attr({
+				translateY: 1
+			});
+			this.clipHeight = 0; // #1379
+		}
+		
+		return legendHeight;
+	},
+	
+	/**
+	 * Scroll the legend by a number of pages
+	 * @param {Object} scrollBy
+	 * @param {Object} animation
+	 */
+	scroll: function (scrollBy, animation) {
+		var pages = this.pages,
+			pageCount = pages.length,
+			currentPage = this.currentPage + scrollBy,
+			clipHeight = this.clipHeight,
+			navOptions = this.options.navigation,
+			activeColor = navOptions.activeColor,
+			inactiveColor = navOptions.inactiveColor,
+			pager = this.pager,
+			padding = this.padding,
+			scrollOffset;
+		
+		// When resizing while looking at the last page
+		if (currentPage > pageCount) {
+			currentPage = pageCount;
+		}
+		
+		if (currentPage > 0) {
+			
+			if (animation !== UNDEFINED) {
+				setAnimation(animation, this.chart);
+			}
+			
+			this.nav.attr({
+				translateX: padding,
+				translateY: clipHeight + this.padding + 7 + this.titleHeight,
+				visibility: VISIBLE
+			});
+			this.up.attr({
+					fill: currentPage === 1 ? inactiveColor : activeColor
+				})
+				.css({
+					cursor: currentPage === 1 ? 'default' : 'pointer'
+				});
+			pager.attr({
+				text: currentPage + '/' + pageCount
+			});
+			this.down.attr({
+					x: 18 + this.pager.getBBox().width, // adjust to text width
+					fill: currentPage === pageCount ? inactiveColor : activeColor
+				})
+				.css({
+					cursor: currentPage === pageCount ? 'default' : 'pointer'
+				});
+			
+			scrollOffset = -pages[currentPage - 1] + this.initialItemY;
+
+			this.scrollGroup.animate({
+				translateY: scrollOffset
+			});			
+			
+			this.currentPage = currentPage;
+			this.positionCheckboxes(scrollOffset);
+		}
+			
+	}
+	
+};
+
+/*
+ * LegendSymbolMixin
+ */ 
+
+var LegendSymbolMixin = Highcharts.LegendSymbolMixin = {
+
+	/**
+	 * Get the series' symbol in the legend
+	 * 
+	 * @param {Object} legend The legend object
+	 * @param {Object} item The series (this) or point
+	 */
+	drawRectangle: function (legend, item) {
+		var symbolHeight = legend.options.symbolHeight || 12;
+		
+		item.legendSymbol = this.chart.renderer.rect(
+			0,
+			legend.baseline - 5 - (symbolHeight / 2),
+			legend.symbolWidth,
+			symbolHeight,
+			legend.options.symbolRadius || 0
+		).attr({
+			zIndex: 3
+		}).add(item.legendGroup);		
+		
+	},
+
+	/**
+	 * Get the series' symbol in the legend. This method should be overridable to create custom 
+	 * symbols through Highcharts.seriesTypes[type].prototype.drawLegendSymbols.
+	 * 
+	 * @param {Object} legend The legend object
+	 */
+	drawLineMarker: function (legend) {
+
+		var options = this.options,
+			markerOptions = options.marker,
+			radius,
+			legendOptions = legend.options,
+			legendSymbol,
+			symbolWidth = legend.symbolWidth,
+			renderer = this.chart.renderer,
+			legendItemGroup = this.legendGroup,
+			verticalCenter = legend.baseline - mathRound(renderer.fontMetrics(legendOptions.itemStyle.fontSize, this.legendItem).b * 0.3),
+			attr;
+
+		// Draw the line
+		if (options.lineWidth) {
+			attr = {
+				'stroke-width': options.lineWidth
+			};
+			if (options.dashStyle) {
+				attr.dashstyle = options.dashStyle;
+			}
+			this.legendLine = renderer.path([
+				M,
+				0,
+				verticalCenter,
+				L,
+				symbolWidth,
+				verticalCenter
+			])
+			.attr(attr)
+			.add(legendItemGroup);
+		}
+		
+		// Draw the marker
+		if (markerOptions && markerOptions.enabled !== false) {
+			radius = markerOptions.radius;
+			this.legendSymbol = legendSymbol = renderer.symbol(
+				this.symbol,
+				(symbolWidth / 2) - radius,
+				verticalCenter - radius,
+				2 * radius,
+				2 * radius
+			)
+			.add(legendItemGroup);
+			legendSymbol.isMarker = true;
+		}
+	}
+};
+
+// Workaround for #2030, horizontal legend items not displaying in IE11 Preview,
+// and for #2580, a similar drawing flaw in Firefox 26.
+// TODO: Explore if there's a general cause for this. The problem may be related 
+// to nested group elements, as the legend item texts are within 4 group elements.
+if (/Trident\/7\.0/.test(userAgent) || isFirefox) {
+	wrap(Legend.prototype, 'positionItem', function (proceed, item) {
+		var legend = this,
+			runPositionItem = function () { // If chart destroyed in sync, this is undefined (#2030)
+				if (item._legendItemPos) {
+					proceed.call(legend, item);
+				}
+			};
+
+		// Do it now, for export and to get checkbox placement
+		runPositionItem();
+		
+		// Do it after to work around the core issue
+		setTimeout(runPositionItem);
+	});
+}
+/**
+ * The chart class
+ * @param {Object} options
+ * @param {Function} callback Function to run when the chart has loaded
+ */
+function Chart() {
+	this.init.apply(this, arguments);
+}
+
+Chart.prototype = {
+
+	/**
+	 * Initialize the chart
+	 */
+	init: function (userOptions, callback) {
+
+		// Handle regular options
+		var options,
+			seriesOptions = userOptions.series; // skip merging data points to increase performance
+
+		userOptions.series = null;
+		options = merge(defaultOptions, userOptions); // do the merge
+		options.series = userOptions.series = seriesOptions; // set back the series data
+		this.userOptions = userOptions;
+
+		var optionsChart = options.chart;
+		
+		// Create margin & spacing array
+		this.margin = this.splashArray('margin', optionsChart);
+		this.spacing = this.splashArray('spacing', optionsChart);
+
+		var chartEvents = optionsChart.events;
+
+		//this.runChartClick = chartEvents && !!chartEvents.click;
+		this.bounds = { h: {}, v: {} }; // Pixel data bounds for touch zoom
+
+		this.callback = callback;
+		this.isResizing = 0;
+		this.options = options;
+		//chartTitleOptions = UNDEFINED;
+		//chartSubtitleOptions = UNDEFINED;
+
+		this.axes = [];
+		this.series = [];
+		this.hasCartesianSeries = optionsChart.showAxes;
+		//this.axisOffset = UNDEFINED;
+		//this.maxTicks = UNDEFINED; // handle the greatest amount of ticks on grouped axes
+		//this.inverted = UNDEFINED;
+		//this.loadingShown = UNDEFINED;
+		//this.container = UNDEFINED;
+		//this.chartWidth = UNDEFINED;
+		//this.chartHeight = UNDEFINED;
+		//this.marginRight = UNDEFINED;
+		//this.marginBottom = UNDEFINED;
+		//this.containerWidth = UNDEFINED;
+		//this.containerHeight = UNDEFINED;
+		//this.oldChartWidth = UNDEFINED;
+		//this.oldChartHeight = UNDEFINED;
+
+		//this.renderTo = UNDEFINED;
+		//this.renderToClone = UNDEFINED;
+
+		//this.spacingBox = UNDEFINED
+
+		//this.legend = UNDEFINED;
+
+		// Elements
+		//this.chartBackground = UNDEFINED;
+		//this.plotBackground = UNDEFINED;
+		//this.plotBGImage = UNDEFINED;
+		//this.plotBorder = UNDEFINED;
+		//this.loadingDiv = UNDEFINED;
+		//this.loadingSpan = UNDEFINED;
+
+		var chart = this,
+			eventType;
+
+		// Add the chart to the global lookup
+		chart.index = charts.length;
+		charts.push(chart);
+		chartCount++;
+
+		// Set up auto resize
+		if (optionsChart.reflow !== false) {
+			addEvent(chart, 'load', function () {
+				chart.initReflow();
+			});
+		}
+
+		// Chart event handlers
+		if (chartEvents) {
+			for (eventType in chartEvents) {
+				addEvent(chart, eventType, chartEvents[eventType]);
+			}
+		}
+
+		chart.xAxis = [];
+		chart.yAxis = [];
+
+		// Expose methods and variables
+		chart.animation = useCanVG ? false : pick(optionsChart.animation, true);
+		chart.pointCount = chart.colorCounter = chart.symbolCounter = 0;
+
+		chart.firstRender();
+	},
+
+	/**
+	 * Initialize an individual series, called internally before render time
+	 */
+	initSeries: function (options) {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			type = options.type || optionsChart.type || optionsChart.defaultSeriesType,
+			series,
+			constr = seriesTypes[type];
+
+		// No such series type
+		if (!constr) {
+			error(17, true);
+		}
+
+		series = new constr();
+		series.init(this, options);
+		return series;
+	},
+
+	/**
+	 * Check whether a given point is within the plot area
+	 *
+	 * @param {Number} plotX Pixel x relative to the plot area
+	 * @param {Number} plotY Pixel y relative to the plot area
+	 * @param {Boolean} inverted Whether the chart is inverted
+	 */
+	isInsidePlot: function (plotX, plotY, inverted) {
+		var x = inverted ? plotY : plotX,
+			y = inverted ? plotX : plotY;
+			
+		return x >= 0 &&
+			x <= this.plotWidth &&
+			y >= 0 &&
+			y <= this.plotHeight;
+	},
+
+	/**
+	 * Adjust all axes tick amounts
+	 */
+	adjustTickAmounts: function () {
+		if (this.options.chart.alignTicks !== false) {
+			each(this.axes, function (axis) {
+				axis.adjustTickAmount();
+			});
+		}
+		this.maxTicks = null;
+	},
+
+	/**
+	 * Redraw legend, axes or series based on updated data
+	 *
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+	redraw: function (animation) {
+		var chart = this,
+			axes = chart.axes,
+			series = chart.series,
+			pointer = chart.pointer,
+			legend = chart.legend,
+			redrawLegend = chart.isDirtyLegend,
+			hasStackedSeries,
+			hasDirtyStacks,
+			hasCartesianSeries = chart.hasCartesianSeries,
+			isDirtyBox = chart.isDirtyBox, // todo: check if it has actually changed?
+			seriesLength = series.length,
+			i = seriesLength,
+			serie,
+			renderer = chart.renderer,
+			isHiddenChart = renderer.isHidden(),
+			afterRedraw = [];
+			
+		setAnimation(animation, chart);
+		
+		if (isHiddenChart) {
+			chart.cloneRenderTo();
+		}
+
+		// Adjust title layout (reflow multiline text)
+		chart.layOutTitles();
+
+		// link stacked series
+		while (i--) {
+			serie = series[i];
+
+			if (serie.options.stacking) {
+				hasStackedSeries = true;
+				
+				if (serie.isDirty) {
+					hasDirtyStacks = true;
+					break;
+				}
+			}
+		}
+		if (hasDirtyStacks) { // mark others as dirty
+			i = seriesLength;
+			while (i--) {
+				serie = series[i];
+				if (serie.options.stacking) {
+					serie.isDirty = true;
+				}
+			}
+		}
+
+		// handle updated data in the series
+		each(series, function (serie) {
+			if (serie.isDirty) { // prepare the data so axis can read it
+				if (serie.options.legendType === 'point') {
+					redrawLegend = true;
+				}
+			}
+		});
+
+		// handle added or removed series
+		if (redrawLegend && legend.options.enabled) { // series or pie points are added or removed
+			// draw legend graphics
+			legend.render();
+
+			chart.isDirtyLegend = false;
+		}
+
+		// reset stacks
+		if (hasStackedSeries) {
+			chart.getStacks();
+		}
+
+
+		if (hasCartesianSeries) {
+			if (!chart.isResizing) {
+
+				// reset maxTicks
+				chart.maxTicks = null;
+
+				// set axes scales
+				each(axes, function (axis) {
+					axis.setScale();
+				});
+			}
+
+			chart.adjustTickAmounts();
+		}
+
+		chart.getMargins(); // #3098
+
+		if (hasCartesianSeries) {
+			// If one axis is dirty, all axes must be redrawn (#792, #2169)
+			each(axes, function (axis) {
+				if (axis.isDirty) {
+					isDirtyBox = true;
+				}
+			});
+
+			// redraw axes
+			each(axes, function (axis) {
+				
+				// Fire 'afterSetExtremes' only if extremes are set
+				if (axis.isDirtyExtremes) { // #821
+					axis.isDirtyExtremes = false;
+					afterRedraw.push(function () { // prevent a recursive call to chart.redraw() (#1119)
+						fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751
+						delete axis.eventArgs;
+					});
+				}
+				
+				if (isDirtyBox || hasStackedSeries) {
+					axis.redraw();
+				}
+			});
+		}
+		
+		// the plot areas size has changed
+		if (isDirtyBox) {
+			chart.drawChartBox();
+		}
+
+
+		// redraw affected series
+		each(series, function (serie) {
+			if (serie.isDirty && serie.visible &&
+					(!serie.isCartesian || serie.xAxis)) { // issue #153
+				serie.redraw();
+			}
+		});
+
+		// move tooltip or reset
+		if (pointer) {
+			pointer.reset(true);
+		}
+
+		// redraw if canvas
+		renderer.draw();
+
+		// fire the event
+		fireEvent(chart, 'redraw'); // jQuery breaks this when calling it from addEvent. Overwrites chart.redraw
+		
+		if (isHiddenChart) {
+			chart.cloneRenderTo(true);
+		}
+		
+		// Fire callbacks that are put on hold until after the redraw
+		each(afterRedraw, function (callback) {
+			callback.call();
+		});
+	},
+
+	/**
+	 * Get an axis, series or point object by id.
+	 * @param id {String} The id as given in the configuration options
+	 */
+	get: function (id) {
+		var chart = this,
+			axes = chart.axes,
+			series = chart.series;
+
+		var i,
+			j,
+			points;
+
+		// search axes
+		for (i = 0; i < axes.length; i++) {
+			if (axes[i].options.id === id) {
+				return axes[i];
+			}
+		}
+
+		// search series
+		for (i = 0; i < series.length; i++) {
+			if (series[i].options.id === id) {
+				return series[i];
+			}
+		}
+
+		// search points
+		for (i = 0; i < series.length; i++) {
+			points = series[i].points || [];
+			for (j = 0; j < points.length; j++) {
+				if (points[j].id === id) {
+					return points[j];
+				}
+			}
+		}
+		return null;
+	},
+
+	/**
+	 * Create the Axis instances based on the config options
+	 */
+	getAxes: function () {
+		var chart = this,
+			options = this.options,
+			xAxisOptions = options.xAxis = splat(options.xAxis || {}),
+			yAxisOptions = options.yAxis = splat(options.yAxis || {}),
+			optionsArray,
+			axis;
+
+		// make sure the options are arrays and add some members
+		each(xAxisOptions, function (axis, i) {
+			axis.index = i;
+			axis.isX = true;
+		});
+
+		each(yAxisOptions, function (axis, i) {
+			axis.index = i;
+		});
+
+		// concatenate all axis options into one array
+		optionsArray = xAxisOptions.concat(yAxisOptions);
+
+		each(optionsArray, function (axisOptions) {
+			axis = new Axis(chart, axisOptions);
+		});
+
+		chart.adjustTickAmounts();
+	},
+
+
+	/**
+	 * Get the currently selected points from all series
+	 */
+	getSelectedPoints: function () {
+		var points = [];
+		each(this.series, function (serie) {
+			points = points.concat(grep(serie.points || [], function (point) {
+				return point.selected;
+			}));
+		});
+		return points;
+	},
+
+	/**
+	 * Get the currently selected series
+	 */
+	getSelectedSeries: function () {
+		return grep(this.series, function (serie) {
+			return serie.selected;
+		});
+	},
+
+	/**
+	 * Generate stacks for each series and calculate stacks total values
+	 */
+	getStacks: function () {
+		var chart = this;
+
+		// reset stacks for each yAxis
+		each(chart.yAxis, function (axis) {
+			if (axis.stacks && axis.hasVisibleSeries) {
+				axis.oldStacks = axis.stacks;
+			}
+		});
+
+		each(chart.series, function (series) {
+			if (series.options.stacking && (series.visible === true || chart.options.chart.ignoreHiddenSeries === false)) {
+				series.stackKey = series.type + pick(series.options.stack, '');
+			}
+		});
+	},	
+
+	/**
+	 * Show the title and subtitle of the chart
+	 *
+	 * @param titleOptions {Object} New title options
+	 * @param subtitleOptions {Object} New subtitle options
+	 *
+	 */
+	setTitle: function (titleOptions, subtitleOptions, redraw) {
+		var chart = this,
+			options = chart.options,
+			chartTitleOptions,
+			chartSubtitleOptions;
+
+		chartTitleOptions = options.title = merge(options.title, titleOptions);
+		chartSubtitleOptions = options.subtitle = merge(options.subtitle, subtitleOptions);
+
+		// add title and subtitle
+		each([
+			['title', titleOptions, chartTitleOptions],
+			['subtitle', subtitleOptions, chartSubtitleOptions]
+		], function (arr) {
+			var name = arr[0],
+				title = chart[name],
+				titleOptions = arr[1],
+				chartTitleOptions = arr[2];
+
+			if (title && titleOptions) {
+				chart[name] = title = title.destroy(); // remove old
+			}
+			
+			if (chartTitleOptions && chartTitleOptions.text && !title) {
+				chart[name] = chart.renderer.text(
+					chartTitleOptions.text,
+					0,
+					0,
+					chartTitleOptions.useHTML
+				)
+				.attr({
+					align: chartTitleOptions.align,
+					'class': PREFIX + name,
+					zIndex: chartTitleOptions.zIndex || 4
+				})
+				.css(chartTitleOptions.style)
+				.add();
+			}	
+		});
+		chart.layOutTitles(redraw);
+	},
+
+	/**
+	 * Lay out the chart titles and cache the full offset height for use in getMargins
+	 */
+	layOutTitles: function (redraw) {
+		var titleOffset = 0,
+			title = this.title,
+			subtitle = this.subtitle,
+			options = this.options,
+			titleOptions = options.title,
+			subtitleOptions = options.subtitle,
+			requiresDirtyBox,
+			renderer = this.renderer,
+			autoWidth = this.spacingBox.width - 44; // 44 makes room for default context button
+
+		if (title) {
+			title
+				.css({ width: (titleOptions.width || autoWidth) + PX })
+				.align(extend({ 
+					y: renderer.fontMetrics(titleOptions.style.fontSize, title).b - 3
+				}, titleOptions), false, 'spacingBox');
+			
+			if (!titleOptions.floating && !titleOptions.verticalAlign) {
+				titleOffset = title.getBBox().height;
+			}
+		}
+		if (subtitle) {
+			subtitle
+				.css({ width: (subtitleOptions.width || autoWidth) + PX })
+				.align(extend({ 
+					y: titleOffset + (titleOptions.margin - 13) + renderer.fontMetrics(titleOptions.style.fontSize, subtitle).b 
+				}, subtitleOptions), false, 'spacingBox');
+			
+			if (!subtitleOptions.floating && !subtitleOptions.verticalAlign) {
+				titleOffset = mathCeil(titleOffset + subtitle.getBBox().height);
+			}
+		}
+
+		requiresDirtyBox = this.titleOffset !== titleOffset;				
+		this.titleOffset = titleOffset; // used in getMargins
+
+		if (!this.isDirtyBox && requiresDirtyBox) {
+			this.isDirtyBox = requiresDirtyBox;
+			// Redraw if necessary (#2719, #2744)		
+			if (this.hasRendered && pick(redraw, true) && this.isDirtyBox) {
+				this.redraw();
+			}
+		}
+	},
+
+	/**
+	 * Get chart width and height according to options and container size
+	 */
+	getChartSize: function () {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			widthOption = optionsChart.width,
+			heightOption = optionsChart.height,
+			renderTo = chart.renderToClone || chart.renderTo;
+
+		// get inner width and height from jQuery (#824)
+		if (!defined(widthOption)) {
+			chart.containerWidth = adapterRun(renderTo, 'width');
+		}
+		if (!defined(heightOption)) {
+			chart.containerHeight = adapterRun(renderTo, 'height');
+		}
+		
+		chart.chartWidth = mathMax(0, widthOption || chart.containerWidth || 600); // #1393, 1460
+		chart.chartHeight = mathMax(0, pick(heightOption,
+			// the offsetHeight of an empty container is 0 in standard browsers, but 19 in IE7:
+			chart.containerHeight > 19 ? chart.containerHeight : 400));
+	},
+
+	/**
+	 * Create a clone of the chart's renderTo div and place it outside the viewport to allow
+	 * size computation on chart.render and chart.redraw
+	 */
+	cloneRenderTo: function (revert) {
+		var clone = this.renderToClone,
+			container = this.container;
+		
+		// Destroy the clone and bring the container back to the real renderTo div
+		if (revert) {
+			if (clone) {
+				this.renderTo.appendChild(container);
+				discardElement(clone);
+				delete this.renderToClone;
+			}
+		
+		// Set up the clone
+		} else {
+			if (container && container.parentNode === this.renderTo) {
+				this.renderTo.removeChild(container); // do not clone this
+			}
+			this.renderToClone = clone = this.renderTo.cloneNode(0);
+			css(clone, {
+				position: ABSOLUTE,
+				top: '-9999px',
+				display: 'block' // #833
+			});
+			if (clone.style.setProperty) { // #2631
+				clone.style.setProperty('display', 'block', 'important');
+			}
+			doc.body.appendChild(clone);
+			if (container) {
+				clone.appendChild(container);
+			}
+		}
+	},
+
+	/**
+	 * Get the containing element, determine the size and create the inner container
+	 * div to hold the chart
+	 */
+	getContainer: function () {
+		var chart = this,
+			container,
+			optionsChart = chart.options.chart,
+			chartWidth,
+			chartHeight,
+			renderTo,
+			indexAttrName = 'data-highcharts-chart',
+			oldChartIndex,
+			containerId;
+
+		chart.renderTo = renderTo = optionsChart.renderTo;
+		containerId = PREFIX + idCounter++;
+
+		if (isString(renderTo)) {
+			chart.renderTo = renderTo = doc.getElementById(renderTo);
+		}
+		
+		// Display an error if the renderTo is wrong
+		if (!renderTo) {
+			error(13, true);
+		}
+		
+		// If the container already holds a chart, destroy it. The check for hasRendered is there
+		// because web pages that are saved to disk from the browser, will preserve the data-highcharts-chart
+		// attribute and the SVG contents, but not an interactive chart. So in this case,
+		// charts[oldChartIndex] will point to the wrong chart if any (#2609).
+		oldChartIndex = pInt(attr(renderTo, indexAttrName));
+		if (!isNaN(oldChartIndex) && charts[oldChartIndex] && charts[oldChartIndex].hasRendered) {
+			charts[oldChartIndex].destroy();
+		}		
+		
+		// Make a reference to the chart from the div
+		attr(renderTo, indexAttrName, chart.index);
+
+		// remove previous chart
+		renderTo.innerHTML = '';
+
+		// If the container doesn't have an offsetWidth, it has or is a child of a node
+		// that has display:none. We need to temporarily move it out to a visible
+		// state to determine the size, else the legend and tooltips won't render
+		// properly. The allowClone option is used in sparklines as a micro optimization,
+		// saving about 1-2 ms each chart.
+		if (!optionsChart.skipClone && !renderTo.offsetWidth) {
+			chart.cloneRenderTo();
+		}
+
+		// get the width and height
+		chart.getChartSize();
+		chartWidth = chart.chartWidth;
+		chartHeight = chart.chartHeight;
+
+		// create the inner container
+		chart.container = container = createElement(DIV, {
+				className: PREFIX + 'container' +
+					(optionsChart.className ? ' ' + optionsChart.className : ''),
+				id: containerId
+			}, extend({
+				position: RELATIVE,
+				overflow: HIDDEN, // needed for context menu (avoid scrollbars) and
+					// content overflow in IE
+				width: chartWidth + PX,
+				height: chartHeight + PX,
+				textAlign: 'left',
+				lineHeight: 'normal', // #427
+				zIndex: 0, // #1072
+				'-webkit-tap-highlight-color': 'rgba(0,0,0,0)'
+			}, optionsChart.style),
+			chart.renderToClone || renderTo
+		);
+
+		// cache the cursor (#1650)
+		chart._cursor = container.style.cursor;
+
+		// Initialize the renderer
+		chart.renderer =
+			optionsChart.forExport ? // force SVG, used for SVG export
+				new SVGRenderer(container, chartWidth, chartHeight, optionsChart.style, true) :
+				new Renderer(container, chartWidth, chartHeight, optionsChart.style);
+
+		if (useCanVG) {
+			// If we need canvg library, extend and configure the renderer
+			// to get the tracker for translating mouse events
+			chart.renderer.create(chart, container, chartWidth, chartHeight);
+		}
+	},
+
+	/**
+	 * Calculate margins by rendering axis labels in a preliminary position. Title,
+	 * subtitle and legend have already been rendered at this stage, but will be
+	 * moved into their final positions
+	 */
+	getMargins: function () {
+		var chart = this,
+			spacing = chart.spacing,
+			axisOffset,
+			legend = chart.legend,
+			margin = chart.margin,
+			legendOptions = chart.options.legend,
+			legendMargin = pick(legendOptions.margin, 20),
+			legendX = legendOptions.x,
+			legendY = legendOptions.y,
+			align = legendOptions.align,
+			verticalAlign = legendOptions.verticalAlign,
+			titleOffset = chart.titleOffset;
+
+		chart.resetMargins();
+		axisOffset = chart.axisOffset;
+
+		// Adjust for title and subtitle
+		if (titleOffset && !defined(margin[0])) {
+			chart.plotTop = mathMax(chart.plotTop, titleOffset + chart.options.title.margin + spacing[0]);
+		}
+		
+		// Adjust for legend
+		if (legend.display && !legendOptions.floating) {
+			if (align === 'right') { // horizontal alignment handled first
+				if (!defined(margin[1])) {
+					chart.marginRight = mathMax(
+						chart.marginRight,
+						legend.legendWidth - legendX + legendMargin + spacing[1]
+					);
+				}
+			} else if (align === 'left') {
+				if (!defined(margin[3])) {
+					chart.plotLeft = mathMax(
+						chart.plotLeft,
+						legend.legendWidth + legendX + legendMargin + spacing[3]
+					);
+				}
+
+			} else if (verticalAlign === 'top') {
+				if (!defined(margin[0])) {
+					chart.plotTop = mathMax(
+						chart.plotTop,
+						legend.legendHeight + legendY + legendMargin + spacing[0]
+					);
+				}
+
+			} else if (verticalAlign === 'bottom') {
+				if (!defined(margin[2])) {
+					chart.marginBottom = mathMax(
+						chart.marginBottom,
+						legend.legendHeight - legendY + legendMargin + spacing[2]
+					);
+				}
+			}
+		}
+
+		// adjust for scroller
+		if (chart.extraBottomMargin) {
+			chart.marginBottom += chart.extraBottomMargin;
+		}
+		if (chart.extraTopMargin) {
+			chart.plotTop += chart.extraTopMargin;
+		}
+
+		// pre-render axes to get labels offset width
+		if (chart.hasCartesianSeries) {
+			each(chart.axes, function (axis) {
+				axis.getOffset();
+			});
+		}
+		
+		if (!defined(margin[3])) {
+			chart.plotLeft += axisOffset[3];
+		}
+		if (!defined(margin[0])) {
+			chart.plotTop += axisOffset[0];
+		}
+		if (!defined(margin[2])) {
+			chart.marginBottom += axisOffset[2];
+		}
+		if (!defined(margin[1])) {
+			chart.marginRight += axisOffset[1];
+		}
+
+		chart.setChartSize();
+
+	},
+
+	/**
+	 * Resize the chart to its container if size is not explicitly set
+	 */
+	reflow: function (e) {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			renderTo = chart.renderTo,
+			width = optionsChart.width || adapterRun(renderTo, 'width'),
+			height = optionsChart.height || adapterRun(renderTo, 'height'),
+			target = e ? e.target : win, // #805 - MooTools doesn't supply e
+			doReflow = function () {
+				if (chart.container) { // It may have been destroyed in the meantime (#1257)
+					chart.setSize(width, height, false);
+					chart.hasUserSize = null;
+				}
+			};
+			
+		// Width and height checks for display:none. Target is doc in IE8 and Opera,
+		// win in Firefox, Chrome and IE9.
+		if (!chart.hasUserSize && width && height && (target === win || target === doc)) {
+			if (width !== chart.containerWidth || height !== chart.containerHeight) {
+				clearTimeout(chart.reflowTimeout);
+				if (e) { // Called from window.resize
+					chart.reflowTimeout = setTimeout(doReflow, 100);
+				} else { // Called directly (#2224)
+					doReflow();
+				}
+			}
+			chart.containerWidth = width;
+			chart.containerHeight = height;
+		}
+	},
+
+	/**
+	 * Add the event handlers necessary for auto resizing
+	 */
+	initReflow: function () {
+		var chart = this,
+			reflow = function (e) {
+				chart.reflow(e);
+			};
+			
+		
+		addEvent(win, 'resize', reflow);
+		addEvent(chart, 'destroy', function () {
+			removeEvent(win, 'resize', reflow);
+		});
+	},
+
+	/**
+	 * Resize the chart to a given width and height
+	 * @param {Number} width
+	 * @param {Number} height
+	 * @param {Object|Boolean} animation
+	 */
+	setSize: function (width, height, animation) {
+		var chart = this,
+			chartWidth,
+			chartHeight,
+			fireEndResize;
+
+		// Handle the isResizing counter
+		chart.isResizing += 1;
+		fireEndResize = function () {
+			if (chart) {
+				fireEvent(chart, 'endResize', null, function () {
+					chart.isResizing -= 1;
+				});
+			}
+		};
+
+		// set the animation for the current process
+		setAnimation(animation, chart);
+
+		chart.oldChartHeight = chart.chartHeight;
+		chart.oldChartWidth = chart.chartWidth;
+		if (defined(width)) {
+			chart.chartWidth = chartWidth = mathMax(0, mathRound(width));
+			chart.hasUserSize = !!chartWidth;
+		}
+		if (defined(height)) {
+			chart.chartHeight = chartHeight = mathMax(0, mathRound(height));
+		}
+
+		// Resize the container with the global animation applied if enabled (#2503)
+		(globalAnimation ? animate : css)(chart.container, {
+			width: chartWidth + PX,
+			height: chartHeight + PX
+		}, globalAnimation);
+
+		chart.setChartSize(true);
+		chart.renderer.setSize(chartWidth, chartHeight, animation);
+
+		// handle axes
+		chart.maxTicks = null;
+		each(chart.axes, function (axis) {
+			axis.isDirty = true;
+			axis.setScale();
+		});
+
+		// make sure non-cartesian series are also handled
+		each(chart.series, function (serie) {
+			serie.isDirty = true;
+		});
+
+		chart.isDirtyLegend = true; // force legend redraw
+		chart.isDirtyBox = true; // force redraw of plot and chart border
+
+		chart.layOutTitles(); // #2857
+		chart.getMargins();
+
+		chart.redraw(animation);
+
+
+		chart.oldChartHeight = null;
+		fireEvent(chart, 'resize');
+
+		// fire endResize and set isResizing back
+		// If animation is disabled, fire without delay
+		if (globalAnimation === false) {
+			fireEndResize();
+		} else { // else set a timeout with the animation duration
+			setTimeout(fireEndResize, (globalAnimation && globalAnimation.duration) || 500);
+		}
+	},
+
+	/**
+	 * Set the public chart properties. This is done before and after the pre-render
+	 * to determine margin sizes
+	 */
+	setChartSize: function (skipAxes) {
+		var chart = this,
+			inverted = chart.inverted,
+			renderer = chart.renderer,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			optionsChart = chart.options.chart,
+			spacing = chart.spacing,
+			clipOffset = chart.clipOffset,
+			clipX,
+			clipY,
+			plotLeft,
+			plotTop,
+			plotWidth,
+			plotHeight,
+			plotBorderWidth;
+
+		chart.plotLeft = plotLeft = mathRound(chart.plotLeft);
+		chart.plotTop = plotTop = mathRound(chart.plotTop);
+		chart.plotWidth = plotWidth = mathMax(0, mathRound(chartWidth - plotLeft - chart.marginRight));
+		chart.plotHeight = plotHeight = mathMax(0, mathRound(chartHeight - plotTop - chart.marginBottom));
+
+		chart.plotSizeX = inverted ? plotHeight : plotWidth;
+		chart.plotSizeY = inverted ? plotWidth : plotHeight;
+		
+		chart.plotBorderWidth = optionsChart.plotBorderWidth || 0;
+
+		// Set boxes used for alignment
+		chart.spacingBox = renderer.spacingBox = {
+			x: spacing[3],
+			y: spacing[0],
+			width: chartWidth - spacing[3] - spacing[1],
+			height: chartHeight - spacing[0] - spacing[2]
+		};
+		chart.plotBox = renderer.plotBox = {
+			x: plotLeft,
+			y: plotTop,
+			width: plotWidth,
+			height: plotHeight
+		};
+
+		plotBorderWidth = 2 * mathFloor(chart.plotBorderWidth / 2);
+		clipX = mathCeil(mathMax(plotBorderWidth, clipOffset[3]) / 2);
+		clipY = mathCeil(mathMax(plotBorderWidth, clipOffset[0]) / 2);
+		chart.clipBox = {
+			x: clipX, 
+			y: clipY, 
+			width: mathFloor(chart.plotSizeX - mathMax(plotBorderWidth, clipOffset[1]) / 2 - clipX), 
+			height: mathMax(0, mathFloor(chart.plotSizeY - mathMax(plotBorderWidth, clipOffset[2]) / 2 - clipY))
+		};
+
+		if (!skipAxes) {
+			each(chart.axes, function (axis) {
+				axis.setAxisSize();
+				axis.setAxisTranslation();
+			});
+		}
+	},
+
+	/**
+	 * Initial margins before auto size margins are applied
+	 */
+	resetMargins: function () {
+		var chart = this,
+			spacing = chart.spacing,
+			margin = chart.margin;
+
+		chart.plotTop = pick(margin[0], spacing[0]);
+		chart.marginRight = pick(margin[1], spacing[1]);
+		chart.marginBottom = pick(margin[2], spacing[2]);
+		chart.plotLeft = pick(margin[3], spacing[3]);
+		chart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left
+		chart.clipOffset = [0, 0, 0, 0];
+	},
+
+	/**
+	 * Draw the borders and backgrounds for chart and plot area
+	 */
+	drawChartBox: function () {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			renderer = chart.renderer,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			chartBackground = chart.chartBackground,
+			plotBackground = chart.plotBackground,
+			plotBorder = chart.plotBorder,
+			plotBGImage = chart.plotBGImage,
+			chartBorderWidth = optionsChart.borderWidth || 0,
+			chartBackgroundColor = optionsChart.backgroundColor,
+			plotBackgroundColor = optionsChart.plotBackgroundColor,
+			plotBackgroundImage = optionsChart.plotBackgroundImage,
+			plotBorderWidth = optionsChart.plotBorderWidth || 0,
+			mgn,
+			bgAttr,
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop,
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			plotBox = chart.plotBox,
+			clipRect = chart.clipRect,
+			clipBox = chart.clipBox;
+
+		// Chart area
+		mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);
+
+		if (chartBorderWidth || chartBackgroundColor) {
+			if (!chartBackground) {
+				
+				bgAttr = {
+					fill: chartBackgroundColor || NONE
+				};
+				if (chartBorderWidth) { // #980
+					bgAttr.stroke = optionsChart.borderColor;
+					bgAttr['stroke-width'] = chartBorderWidth;
+				}
+				chart.chartBackground = renderer.rect(mgn / 2, mgn / 2, chartWidth - mgn, chartHeight - mgn,
+						optionsChart.borderRadius, chartBorderWidth)
+					.attr(bgAttr)
+					.addClass(PREFIX + 'background')
+					.add()
+					.shadow(optionsChart.shadow);
+
+			} else { // resize
+				chartBackground.animate(
+					chartBackground.crisp({ width: chartWidth - mgn, height: chartHeight - mgn })
+				);
+			}
+		}
+
+
+		// Plot background
+		if (plotBackgroundColor) {
+			if (!plotBackground) {
+				chart.plotBackground = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0)
+					.attr({
+						fill: plotBackgroundColor
+					})
+					.add()
+					.shadow(optionsChart.plotShadow);
+			} else {
+				plotBackground.animate(plotBox);
+			}
+		}
+		if (plotBackgroundImage) {
+			if (!plotBGImage) {
+				chart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight)
+					.add();
+			} else {
+				plotBGImage.animate(plotBox);
+			}
+		}
+		
+		// Plot clip
+		if (!clipRect) {
+			chart.clipRect = renderer.clipRect(clipBox);
+		} else {
+			clipRect.animate({
+				width: clipBox.width,
+				height: clipBox.height
+			});
+		}
+
+		// Plot area border
+		if (plotBorderWidth) {
+			if (!plotBorder) {
+				chart.plotBorder = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0, -plotBorderWidth)
+					.attr({
+						stroke: optionsChart.plotBorderColor,
+						'stroke-width': plotBorderWidth,
+						fill: NONE,
+						zIndex: 1
+					})
+					.add();
+			} else {
+				plotBorder.animate(
+					plotBorder.crisp({ x: plotLeft, y: plotTop, width: plotWidth, height: plotHeight })
+				);
+			}
+		}
+
+		// reset
+		chart.isDirtyBox = false;
+	},
+
+	/**
+	 * Detect whether a certain chart property is needed based on inspecting its options
+	 * and series. This mainly applies to the chart.invert property, and in extensions to 
+	 * the chart.angular and chart.polar properties.
+	 */
+	propFromSeries: function () {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			klass,
+			seriesOptions = chart.options.series,
+			i,
+			value;
+			
+			
+		each(['inverted', 'angular', 'polar'], function (key) {
+			
+			// The default series type's class
+			klass = seriesTypes[optionsChart.type || optionsChart.defaultSeriesType];
+			
+			// Get the value from available chart-wide properties
+			value = (
+				chart[key] || // 1. it is set before
+				optionsChart[key] || // 2. it is set in the options
+				(klass && klass.prototype[key]) // 3. it's default series class requires it
+			);
+	
+			// 4. Check if any the chart's series require it
+			i = seriesOptions && seriesOptions.length;
+			while (!value && i--) {
+				klass = seriesTypes[seriesOptions[i].type];
+				if (klass && klass.prototype[key]) {
+					value = true;
+				}
+			}
+	
+			// Set the chart property
+			chart[key] = value;	
+		});
+		
+	},
+
+	/**
+	 * Link two or more series together. This is done initially from Chart.render,
+	 * and after Chart.addSeries and Series.remove.
+	 */
+	linkSeries: function () {
+		var chart = this,
+			chartSeries = chart.series;
+
+		// Reset links
+		each(chartSeries, function (series) {
+			series.linkedSeries.length = 0;
+		});
+
+		// Apply new links
+		each(chartSeries, function (series) {
+			var linkedTo = series.options.linkedTo;
+			if (isString(linkedTo)) {
+				if (linkedTo === ':previous') {
+					linkedTo = chart.series[series.index - 1];
+				} else {
+					linkedTo = chart.get(linkedTo);
+				}
+				if (linkedTo) {
+					linkedTo.linkedSeries.push(series);
+					series.linkedParent = linkedTo;
+				}
+			}
+		});
+	},
+
+	/**
+	 * Render series for the chart
+	 */
+	renderSeries: function () {
+		each(this.series, function (serie) {
+			serie.translate();
+			if (serie.setTooltipPoints) {
+				serie.setTooltipPoints();
+			}
+			serie.render();
+		});
+	},
+		
+	/**
+	 * Render labels for the chart
+	 */
+	renderLabels: function () {
+		var chart = this,
+			labels = chart.options.labels;
+		if (labels.items) {
+			each(labels.items, function (label) {
+				var style = extend(labels.style, label.style),
+					x = pInt(style.left) + chart.plotLeft,
+					y = pInt(style.top) + chart.plotTop + 12;
+
+				// delete to prevent rewriting in IE
+				delete style.left;
+				delete style.top;
+
+				chart.renderer.text(
+					label.html,
+					x,
+					y
+				)
+				.attr({ zIndex: 2 })
+				.css(style)
+				.add();
+
+			});
+		}
+	},
+
+	/**
+	 * Render all graphics for the chart
+	 */
+	render: function () {
+		var chart = this,
+			axes = chart.axes,
+			renderer = chart.renderer,
+			options = chart.options;
+
+		// Title
+		chart.setTitle();
+
+
+		// Legend
+		chart.legend = new Legend(chart, options.legend);
+
+		chart.getStacks(); // render stacks
+
+		// Get margins by pre-rendering axes
+		// set axes scales
+		each(axes, function (axis) {
+			axis.setScale();
+		});
+
+		chart.getMargins();
+
+		chart.maxTicks = null; // reset for second pass
+		each(axes, function (axis) {
+			axis.setTickPositions(true); // update to reflect the new margins
+			axis.setMaxTicks();
+		});
+		chart.adjustTickAmounts();
+		chart.getMargins(); // second pass to check for new labels
+
+
+		// Draw the borders and backgrounds
+		chart.drawChartBox();		
+
+
+		// Axes
+		if (chart.hasCartesianSeries) {
+			each(axes, function (axis) {
+				axis.render();
+			});
+		}
+
+		// The series
+		if (!chart.seriesGroup) {
+			chart.seriesGroup = renderer.g('series-group')
+				.attr({ zIndex: 3 })
+				.add();
+		}
+		chart.renderSeries();
+
+		// Labels
+		chart.renderLabels();
+
+		// Credits
+		chart.showCredits(options.credits);
+
+		// Set flag
+		chart.hasRendered = true;
+
+	},
+
+	/**
+	 * Show chart credits based on config options
+	 */
+	showCredits: function (credits) {
+		if (credits.enabled && !this.credits) {
+			this.credits = this.renderer.text(
+				credits.text,
+				0,
+				0
+			)
+			.on('click', function () {
+				if (credits.href) {
+					location.href = credits.href;
+				}
+			})
+			.attr({
+				align: credits.position.align,
+				zIndex: 8
+			})
+			.css(credits.style)
+			.add()
+			.align(credits.position);
+		}
+	},
+
+	/**
+	 * Clean up memory usage
+	 */
+	destroy: function () {
+		var chart = this,
+			axes = chart.axes,
+			series = chart.series,
+			container = chart.container,
+			i,
+			parentNode = container && container.parentNode;
+			
+		// fire the chart.destoy event
+		fireEvent(chart, 'destroy');
+		
+		// Delete the chart from charts lookup array
+		charts[chart.index] = UNDEFINED;
+		chartCount--;
+		chart.renderTo.removeAttribute('data-highcharts-chart');
+
+		// remove events
+		removeEvent(chart);
+
+		// ==== Destroy collections:
+		// Destroy axes
+		i = axes.length;
+		while (i--) {
+			axes[i] = axes[i].destroy();
+		}
+
+		// Destroy each series
+		i = series.length;
+		while (i--) {
+			series[i] = series[i].destroy();
+		}
+
+		// ==== Destroy chart properties:
+		each(['title', 'subtitle', 'chartBackground', 'plotBackground', 'plotBGImage', 
+				'plotBorder', 'seriesGroup', 'clipRect', 'credits', 'pointer', 'scroller', 
+				'rangeSelector', 'legend', 'resetZoomButton', 'tooltip', 'renderer'], function (name) {
+			var prop = chart[name];
+
+			if (prop && prop.destroy) {
+				chart[name] = prop.destroy();
+			}
+		});
+
+		// remove container and all SVG
+		if (container) { // can break in IE when destroyed before finished loading
+			container.innerHTML = '';
+			removeEvent(container);
+			if (parentNode) {
+				discardElement(container);
+			}
+
+		}
+
+		// clean it all up
+		for (i in chart) {
+			delete chart[i];
+		}
+
+	},
+
+
+	/**
+	 * VML namespaces can't be added until after complete. Listening
+	 * for Perini's doScroll hack is not enough.
+	 */
+	isReadyToRender: function () {
+		var chart = this;
+
+		// Note: in spite of JSLint's complaints, win == win.top is required
+		/*jslint eqeq: true*/
+		if ((!hasSVG && (win == win.top && doc.readyState !== 'complete')) || (useCanVG && !win.canvg)) {
+		/*jslint eqeq: false*/
+			if (useCanVG) {
+				// Delay rendering until canvg library is downloaded and ready
+				CanVGController.push(function () { chart.firstRender(); }, chart.options.global.canvasToolsURL);
+			} else {
+				doc.attachEvent('onreadystatechange', function () {
+					doc.detachEvent('onreadystatechange', chart.firstRender);
+					if (doc.readyState === 'complete') {
+						chart.firstRender();
+					}
+				});
+			}
+			return false;
+		}
+		return true;
+	},
+
+	/**
+	 * Prepare for first rendering after all data are loaded
+	 */
+	firstRender: function () {
+		var chart = this,
+			options = chart.options,
+			callback = chart.callback;
+
+		// Check whether the chart is ready to render
+		if (!chart.isReadyToRender()) {
+			return;
+		}
+
+		// Create the container
+		chart.getContainer();
+
+		// Run an early event after the container and renderer are established
+		fireEvent(chart, 'init');
+
+		
+		chart.resetMargins();
+		chart.setChartSize();
+
+		// Set the common chart properties (mainly invert) from the given series
+		chart.propFromSeries();
+
+		// get axes
+		chart.getAxes();
+
+		// Initialize the series
+		each(options.series || [], function (serieOptions) {
+			chart.initSeries(serieOptions);
+		});
+
+		chart.linkSeries();
+
+		// Run an event after axes and series are initialized, but before render. At this stage,
+		// the series data is indexed and cached in the xData and yData arrays, so we can access
+		// those before rendering. Used in Highstock. 
+		fireEvent(chart, 'beforeRender'); 
+
+		// depends on inverted and on margins being set
+		if (Highcharts.Pointer) {
+			chart.pointer = new Pointer(chart, options);
+		}
+
+		chart.render();
+
+		// add canvas
+		chart.renderer.draw();
+		// run callbacks
+		if (callback) {
+			callback.apply(chart, [chart]);
+		}
+		each(chart.callbacks, function (fn) {
+			fn.apply(chart, [chart]);
+		});
+		
+		
+		// If the chart was rendered outside the top container, put it back in
+		chart.cloneRenderTo(true);
+		
+		fireEvent(chart, 'load');
+
+	},
+
+	/**
+	* Creates arrays for spacing and margin from given options.
+	*/
+	splashArray: function (target, options) {
+		var oVar = options[target],
+			tArray = isObject(oVar) ? oVar : [oVar, oVar, oVar, oVar];
+
+		return [pick(options[target + 'Top'], tArray[0]),
+				pick(options[target + 'Right'], tArray[1]),
+				pick(options[target + 'Bottom'], tArray[2]),
+				pick(options[target + 'Left'], tArray[3])];
+	}
+}; // end Chart
+
+// Hook for exporting module
+Chart.prototype.callbacks = [];
+
+var CenteredSeriesMixin = Highcharts.CenteredSeriesMixin = {
+	/**
+	 * Get the center of the pie based on the size and center options relative to the  
+	 * plot area. Borrowed by the polar and gauge series types.
+	 */
+	getCenter: function () {
+		
+		var options = this.options,
+			chart = this.chart,
+			slicingRoom = 2 * (options.slicedOffset || 0),
+			handleSlicingRoom,
+			plotWidth = chart.plotWidth - 2 * slicingRoom,
+			plotHeight = chart.plotHeight - 2 * slicingRoom,
+			centerOption = options.center,
+			positions = [pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0],
+			smallestSize = mathMin(plotWidth, plotHeight),
+			isPercent;
+		
+		return map(positions, function (length, i) {
+			isPercent = /%$/.test(length);
+			handleSlicingRoom = i < 2 || (i === 2 && isPercent);
+			return (isPercent ?
+				// i == 0: centerX, relative to width
+				// i == 1: centerY, relative to height
+				// i == 2: size, relative to smallestSize
+				// i == 4: innerSize, relative to smallestSize
+				[plotWidth, plotHeight, smallestSize, smallestSize][i] *
+					pInt(length) / 100 :
+				length) + (handleSlicingRoom ? slicingRoom : 0);
+		});
+	}
+};
+
+/**
+ * The Point object and prototype. Inheritable and used as base for PiePoint
+ */
+var Point = function () {};
+Point.prototype = {
+
+	/**
+	 * Initialize the point
+	 * @param {Object} series The series object containing this point
+	 * @param {Object} options The data in either number, array or object format
+	 */
+	init: function (series, options, x) {
+
+		var point = this,
+			colors;
+		point.series = series;
+		point.applyOptions(options, x);
+		point.pointAttr = {};
+
+		if (series.options.colorByPoint) {
+			colors = series.options.colors || series.chart.options.colors;
+			point.color = point.color || colors[series.colorCounter++];
+			// loop back to zero
+			if (series.colorCounter === colors.length) {
+				series.colorCounter = 0;
+			}
+		}
+
+		series.chart.pointCount++;
+		return point;
+	},
+	/**
+	 * Apply the options containing the x and y data and possible some extra properties.
+	 * This is called on point init or from point.update.
+	 *
+	 * @param {Object} options
+	 */
+	applyOptions: function (options, x) {
+		var point = this,
+			series = point.series,
+			pointValKey = series.options.pointValKey || series.pointValKey;
+
+		options = Point.prototype.optionsToObject.call(this, options);
+
+		// copy options directly to point
+		extend(point, options);
+		point.options = point.options ? extend(point.options, options) : options;
+
+		// For higher dimension series types. For instance, for ranges, point.y is mapped to point.low.
+		if (pointValKey) {
+			point.y = point[pointValKey];
+		}
+
+		// If no x is set by now, get auto incremented value. All points must have an
+		// x value, however the y value can be null to create a gap in the series
+		if (point.x === UNDEFINED && series) {
+			point.x = x === UNDEFINED ? series.autoIncrement() : x;
+		}
+
+		return point;
+	},
+
+	/**
+	 * Transform number or array configs into objects
+	 */
+	optionsToObject: function (options) {
+		var ret = {},
+			series = this.series,
+			pointArrayMap = series.pointArrayMap || ['y'],
+			valueCount = pointArrayMap.length,
+			firstItemType,
+			i = 0,
+			j = 0;
+
+		if (typeof options === 'number' || options === null) {
+			ret[pointArrayMap[0]] = options;
+
+		} else if (isArray(options)) {
+			// with leading x value
+			if (options.length > valueCount) {
+				firstItemType = typeof options[0];
+				if (firstItemType === 'string') {
+					ret.name = options[0];
+				} else if (firstItemType === 'number') {
+					ret.x = options[0];
+				}
+				i++;
+			}
+			while (j < valueCount) {
+				ret[pointArrayMap[j++]] = options[i++];
+			}
+		} else if (typeof options === 'object') {
+			ret = options;
+
+			// This is the fastest way to detect if there are individual point dataLabels that need
+			// to be considered in drawDataLabels. These can only occur in object configs.
+			if (options.dataLabels) {
+				series._hasPointLabels = true;
+			}
+
+			// Same approach as above for markers
+			if (options.marker) {
+				series._hasPointMarkers = true;
+			}
+		}
+		return ret;
+	},
+
+	/**
+	 * Destroy a point to clear memory. Its reference still stays in series.data.
+	 */
+	destroy: function () {
+		var point = this,
+			series = point.series,
+			chart = series.chart,
+			hoverPoints = chart.hoverPoints,
+			prop;
+
+		chart.pointCount--;
+
+		if (hoverPoints) {
+			point.setState();
+			erase(hoverPoints, point);
+			if (!hoverPoints.length) {
+				chart.hoverPoints = null;
+			}
+
+		}
+		if (point === chart.hoverPoint) {
+			point.onMouseOut();
+		}
+
+		// remove all events
+		if (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive
+			removeEvent(point);
+			point.destroyElements();
+		}
+
+		if (point.legendItem) { // pies have legend items
+			chart.legend.destroyItem(point);
+		}
+
+		for (prop in point) {
+			point[prop] = null;
+		}
+
+
+	},
+
+	/**
+	 * Destroy SVG elements associated with the point
+	 */
+	destroyElements: function () {
+		var point = this,
+			props = ['graphic', 'dataLabel', 'dataLabelUpper', 'group', 'connector', 'shadowGroup'],
+			prop,
+			i = 6;
+		while (i--) {
+			prop = props[i];
+			if (point[prop]) {
+				point[prop] = point[prop].destroy();
+			}
+		}
+	},
+
+	/**
+	 * Return the configuration hash needed for the data label and tooltip formatters
+	 */
+	getLabelConfig: function () {
+		var point = this;
+		return {
+			x: point.category,
+			y: point.y,
+			key: point.name || point.category,
+			series: point.series,
+			point: point,
+			percentage: point.percentage,
+			total: point.total || point.stackTotal
+		};
+	},	
+
+	/**
+	 * Extendable method for formatting each point's tooltip line
+	 *
+	 * @return {String} A string to be concatenated in to the common tooltip text
+	 */
+	tooltipFormatter: function (pointFormat) {
+
+		// Insert options for valueDecimals, valuePrefix, and valueSuffix
+		var series = this.series,
+			seriesTooltipOptions = series.tooltipOptions,
+			valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''),
+			valuePrefix = seriesTooltipOptions.valuePrefix || '',
+			valueSuffix = seriesTooltipOptions.valueSuffix || '';
+
+		// Loop over the point array map and replace unformatted values with sprintf formatting markup
+		each(series.pointArrayMap || ['y'], function (key) {
+			key = '{point.' + key; // without the closing bracket
+			if (valuePrefix || valueSuffix) {
+				pointFormat = pointFormat.replace(key + '}', valuePrefix + key + '}' + valueSuffix);
+			}
+			pointFormat = pointFormat.replace(key + '}', key + ':,.' + valueDecimals + 'f}');
+		});
+
+		return format(pointFormat, {
+			point: this,
+			series: this.series
+		});
+	},
+
+	/**
+	 * Fire an event on the Point object. Must not be renamed to fireEvent, as this
+	 * causes a name clash in MooTools
+	 * @param {String} eventType
+	 * @param {Object} eventArgs Additional event arguments
+	 * @param {Function} defaultFunction Default event handler
+	 */
+	firePointEvent: function (eventType, eventArgs, defaultFunction) {
+		var point = this,
+			series = this.series,
+			seriesOptions = series.options;
+
+		// load event handlers on demand to save time on mouseover/out
+		if (seriesOptions.point.events[eventType] || (point.options && point.options.events && point.options.events[eventType])) {
+			this.importEvents();
+		}
+
+		// add default handler if in selection mode
+		if (eventType === 'click' && seriesOptions.allowPointSelect) {
+			defaultFunction = function (event) {
+				// Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera
+				point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);
+			};
+		}
+
+		fireEvent(this, eventType, eventArgs, defaultFunction);
+	}
+};/**
+ * @classDescription The base function which all other series types inherit from. The data in the series is stored
+ * in various arrays.
+ *
+ * - First, series.options.data contains all the original config options for
+ * each point whether added by options or methods like series.addPoint.
+ * - Next, series.data contains those values converted to points, but in case the series data length
+ * exceeds the cropThreshold, or if the data is grouped, series.data doesn't contain all the points. It
+ * only contains the points that have been created on demand.
+ * - Then there's series.points that contains all currently visible point objects. In case of cropping,
+ * the cropped-away points are not part of this array. The series.points array starts at series.cropStart
+ * compared to series.data and series.options.data. If however the series data is grouped, these can't
+ * be correlated one to one.
+ * - series.xData and series.processedXData contain clean x values, equivalent to series.data and series.points.
+ * - series.yData and series.processedYData contain clean x values, equivalent to series.data and series.points.
+ *
+ * @param {Object} chart
+ * @param {Object} options
+ */
+var Series = function () {};
+
+Series.prototype = {
+
+	isCartesian: true,
+	type: 'line',
+	pointClass: Point,
+	sorted: true, // requires the data to be sorted
+	requireSorting: true,
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		stroke: 'lineColor',
+		'stroke-width': 'lineWidth',
+		fill: 'fillColor',
+		r: 'radius'
+	},
+	axisTypes: ['xAxis', 'yAxis'],
+	colorCounter: 0,
+	parallelArrays: ['x', 'y'], // each point's x and y values are stored in this.xData and this.yData
+	init: function (chart, options) {
+		var series = this,
+			eventType,
+			events,
+			chartSeries = chart.series,
+			sortByIndex = function (a, b) {
+				return pick(a.options.index, a._i) - pick(b.options.index, b._i);
+			};
+
+		series.chart = chart;
+		series.options = options = series.setOptions(options); // merge with plotOptions
+		series.linkedSeries = [];
+
+		// bind the axes
+		series.bindAxes();
+
+		// set some variables
+		extend(series, {
+			name: options.name,
+			state: NORMAL_STATE,
+			pointAttr: {},
+			visible: options.visible !== false, // true by default
+			selected: options.selected === true // false by default
+		});
+
+		// special
+		if (useCanVG) {
+			options.animation = false;
+		}
+
+		// register event listeners
+		events = options.events;
+		for (eventType in events) {
+			addEvent(series, eventType, events[eventType]);
+		}
+		if (
+			(events && events.click) ||
+			(options.point && options.point.events && options.point.events.click) ||
+			options.allowPointSelect
+		) {
+			chart.runTrackerClick = true;
+		}
+
+		series.getColor();
+		series.getSymbol();
+
+		// Set the data
+		each(series.parallelArrays, function (key) {
+			series[key + 'Data'] = [];
+		});
+		series.setData(options.data, false);
+
+		// Mark cartesian
+		if (series.isCartesian) {
+			chart.hasCartesianSeries = true;
+		}
+
+		// Register it in the chart
+		chartSeries.push(series);
+		series._i = chartSeries.length - 1;
+
+		// Sort series according to index option (#248, #1123, #2456)
+		stableSort(chartSeries, sortByIndex);
+		if (this.yAxis) {
+			stableSort(this.yAxis.series, sortByIndex);
+		}
+
+		each(chartSeries, function (series, i) {
+			series.index = i;
+			series.name = series.name || 'Series ' + (i + 1);
+		});
+
+	},
+
+	/**
+	 * Set the xAxis and yAxis properties of cartesian series, and register the series
+	 * in the axis.series array
+	 */
+	bindAxes: function () {
+		var series = this,
+			seriesOptions = series.options,
+			chart = series.chart,
+			axisOptions;
+
+		each(series.axisTypes || [], function (AXIS) { // repeat for xAxis and yAxis
+
+			each(chart[AXIS], function (axis) { // loop through the chart's axis objects
+				axisOptions = axis.options;
+
+				// apply if the series xAxis or yAxis option mathches the number of the
+				// axis, or if undefined, use the first axis
+				if ((seriesOptions[AXIS] === axisOptions.index) ||
+						(seriesOptions[AXIS] !== UNDEFINED && seriesOptions[AXIS] === axisOptions.id) ||
+						(seriesOptions[AXIS] === UNDEFINED && axisOptions.index === 0)) {
+
+					// register this series in the axis.series lookup
+					axis.series.push(series);
+
+					// set this series.xAxis or series.yAxis reference
+					series[AXIS] = axis;
+
+					// mark dirty for redraw
+					axis.isDirty = true;
+				}
+			});
+
+			// The series needs an X and an Y axis
+			if (!series[AXIS] && series.optionalAxis !== AXIS) {
+				error(18, true);
+			}
+
+		});
+	},
+
+	/**
+	 * For simple series types like line and column, the data values are held in arrays like
+	 * xData and yData for quick lookup to find extremes and more. For multidimensional series
+	 * like bubble and map, this can be extended with arrays like zData and valueData by
+	 * adding to the series.parallelArrays array.
+	 */
+	updateParallelArrays: function (point, i) {
+		var series = point.series,
+			args = arguments,
+			fn = typeof i === 'number' ?
+				 // Insert the value in the given position
+				function (key) {
+					var val = key === 'y' && series.toYData ? series.toYData(point) : point[key];
+					series[key + 'Data'][i] = val;
+				} :
+				// Apply the method specified in i with the following arguments as arguments
+				function (key) {
+					Array.prototype[i].apply(series[key + 'Data'], Array.prototype.slice.call(args, 2));
+				};
+
+		each(series.parallelArrays, fn);
+	},
+
+	/**
+	 * Return an auto incremented x value based on the pointStart and pointInterval options.
+	 * This is only used if an x value is not given for the point that calls autoIncrement.
+	 */
+	autoIncrement: function () {
+		var series = this,
+			options = series.options,
+			xIncrement = series.xIncrement;
+
+		xIncrement = pick(xIncrement, options.pointStart, 0);
+
+		series.pointInterval = pick(series.pointInterval, options.pointInterval, 1);
+
+		series.xIncrement = xIncrement + series.pointInterval;
+		return xIncrement;
+	},
+
+	/**
+	 * Divide the series data into segments divided by null values.
+	 */
+	getSegments: function () {
+		var series = this,
+			lastNull = -1,
+			segments = [],
+			i,
+			points = series.points,
+			pointsLength = points.length;
+
+		if (pointsLength) { // no action required for []
+
+			// if connect nulls, just remove null points
+			if (series.options.connectNulls) {
+				i = pointsLength;
+				while (i--) {
+					if (points[i].y === null) {
+						points.splice(i, 1);
+					}
+				}
+				if (points.length) {
+					segments = [points];
+				}
+
+			// else, split on null points
+			} else {
+				each(points, function (point, i) {
+					if (point.y === null) {
+						if (i > lastNull + 1) {
+							segments.push(points.slice(lastNull + 1, i));
+						}
+						lastNull = i;
+					} else if (i === pointsLength - 1) { // last value
+						segments.push(points.slice(lastNull + 1, i + 1));
+					}
+				});
+			}
+		}
+
+		// register it
+		series.segments = segments;
+	},
+
+	/**
+	 * Set the series options by merging from the options tree
+	 * @param {Object} itemOptions
+	 */
+	setOptions: function (itemOptions) {
+		var chart = this.chart,
+			chartOptions = chart.options,
+			plotOptions = chartOptions.plotOptions,
+			userOptions = chart.userOptions || {},
+			userPlotOptions = userOptions.plotOptions || {},
+			typeOptions = plotOptions[this.type],
+			options;
+
+		this.userOptions = itemOptions;
+
+		options = merge(
+			typeOptions,
+			plotOptions.series,
+			itemOptions
+		);
+
+		// The tooltip options are merged between global and series specific options
+		this.tooltipOptions = merge(
+			defaultOptions.tooltip,
+			defaultOptions.plotOptions[this.type].tooltip,
+			userOptions.tooltip,
+			userPlotOptions.series && userPlotOptions.series.tooltip,
+			userPlotOptions[this.type] && userPlotOptions[this.type].tooltip,
+			itemOptions.tooltip
+		);
+
+		// Delete marker object if not allowed (#1125)
+		if (typeOptions.marker === null) {
+			delete options.marker;
+		}
+
+		return options;
+
+	},
+
+	getCyclic: function (prop, value, defaults) {
+		var i,
+			userOptions = this.userOptions,
+			indexName = '_' + prop + 'Index',
+			counterName = prop + 'Counter';
+
+		if (!value) {
+			if (defined(userOptions[indexName])) { // after Series.update()
+				i = userOptions[indexName];
+			} else {
+				userOptions[indexName] = i = this.chart[counterName] % defaults.length;
+				this.chart[counterName] += 1;
+			}
+			value = defaults[i];
+		}
+		this[prop] = value;
+	},
+
+	/**
+	 * Get the series' color
+	 */
+	getColor: function () {
+		if (!this.options.colorByPoint) {
+			this.getCyclic('color', this.options.color || defaultPlotOptions[this.type].color, this.chart.options.colors);
+		}
+	},
+	/**
+	 * Get the series' symbol
+	 */
+	getSymbol: function () {
+		var seriesMarkerOption = this.options.marker;
+
+		this.getCyclic('symbol', seriesMarkerOption.symbol, this.chart.options.symbols);
+
+		// don't substract radius in image symbols (#604)
+		if (/^url/.test(this.symbol)) {
+			seriesMarkerOption.radius = 0;
+		}
+	},
+
+	drawLegendSymbol: LegendSymbolMixin.drawLineMarker,
+
+	/**
+	 * Replace the series data with a new set of data
+	 * @param {Object} data
+	 * @param {Object} redraw
+	 */
+	setData: function (data, redraw, animation, updatePoints) {
+		var series = this,
+			oldData = series.points,
+			oldDataLength = (oldData && oldData.length) || 0,
+			dataLength,
+			options = series.options,
+			chart = series.chart,
+			firstPoint = null,
+			xAxis = series.xAxis,
+			hasCategories = xAxis && !!xAxis.categories,
+			tooltipPoints = series.tooltipPoints,
+			i,
+			turboThreshold = options.turboThreshold,
+			pt,
+			xData = this.xData,
+			yData = this.yData,
+			pointArrayMap = series.pointArrayMap,
+			valueCount = pointArrayMap && pointArrayMap.length;
+
+		data = data || [];
+		dataLength = data.length;
+		redraw = pick(redraw, true);
+
+		// If the point count is the same as is was, just run Point.update which is
+		// cheaper, allows animation, and keeps references to points.
+		if (updatePoints !== false && dataLength && oldDataLength === dataLength && !series.cropped && !series.hasGroupedData) {
+			each(data, function (point, i) {
+				oldData[i].update(point, false);
+			});
+
+		} else {
+
+			// Reset properties
+			series.xIncrement = null;
+			series.pointRange = hasCategories ? 1 : options.pointRange;
+
+			series.colorCounter = 0; // for series with colorByPoint (#1547)
+			
+			// Update parallel arrays
+			each(this.parallelArrays, function (key) {
+				series[key + 'Data'].length = 0;
+			});
+
+			// In turbo mode, only one- or twodimensional arrays of numbers are allowed. The
+			// first value is tested, and we assume that all the rest are defined the same
+			// way. Although the 'for' loops are similar, they are repeated inside each
+			// if-else conditional for max performance.
+			if (turboThreshold && dataLength > turboThreshold) {
+
+				// find the first non-null point
+				i = 0;
+				while (firstPoint === null && i < dataLength) {
+					firstPoint = data[i];
+					i++;
+				}
+
+
+				if (isNumber(firstPoint)) { // assume all points are numbers
+					var x = pick(options.pointStart, 0),
+						pointInterval = pick(options.pointInterval, 1);
+
+					for (i = 0; i < dataLength; i++) {
+						xData[i] = x;
+						yData[i] = data[i];
+						x += pointInterval;
+					}
+					series.xIncrement = x;
+				} else if (isArray(firstPoint)) { // assume all points are arrays
+					if (valueCount) { // [x, low, high] or [x, o, h, l, c]
+						for (i = 0; i < dataLength; i++) {
+							pt = data[i];
+							xData[i] = pt[0];
+							yData[i] = pt.slice(1, valueCount + 1);
+						}
+					} else { // [x, y]
+						for (i = 0; i < dataLength; i++) {
+							pt = data[i];
+							xData[i] = pt[0];
+							yData[i] = pt[1];
+						}
+					}
+				} else {
+					error(12); // Highcharts expects configs to be numbers or arrays in turbo mode
+				}
+			} else {
+				for (i = 0; i < dataLength; i++) {
+					if (data[i] !== UNDEFINED) { // stray commas in oldIE
+						pt = { series: series };
+						series.pointClass.prototype.applyOptions.apply(pt, [data[i]]);
+						series.updateParallelArrays(pt, i);
+						if (hasCategories && pt.name) {
+							xAxis.names[pt.x] = pt.name; // #2046
+						}
+					}
+				}
+			}
+
+			// Forgetting to cast strings to numbers is a common caveat when handling CSV or JSON
+			if (isString(yData[0])) {
+				error(14, true);
+			}
+
+			series.data = [];
+			series.options.data = data;
+			//series.zData = zData;
+
+			// destroy old points
+			i = oldDataLength;
+			while (i--) {
+				if (oldData[i] && oldData[i].destroy) {
+					oldData[i].destroy();
+				}
+			}
+			if (tooltipPoints) { // #2594
+				tooltipPoints.length = 0;
+			}
+
+			// reset minRange (#878)
+			if (xAxis) {
+				xAxis.minRange = xAxis.userMinRange;
+			}
+
+			// redraw
+			series.isDirty = series.isDirtyData = chart.isDirtyBox = true;
+			animation = false;
+		}
+
+		if (redraw) {
+			chart.redraw(animation);
+		}
+	},
+
+	/**
+	 * Process the data by cropping away unused data points if the series is longer
+	 * than the crop threshold. This saves computing time for lage series.
+	 */
+	processData: function (force) {
+		var series = this,
+			processedXData = series.xData, // copied during slice operation below
+			processedYData = series.yData,
+			dataLength = processedXData.length,
+			croppedData,
+			cropStart = 0,
+			cropped,
+			distance,
+			closestPointRange,
+			xAxis = series.xAxis,
+			i, // loop variable
+			options = series.options,
+			cropThreshold = options.cropThreshold,
+			activePointCount = 0,
+			isCartesian = series.isCartesian,
+			xExtremes,
+			min,
+			max;
+
+		// If the series data or axes haven't changed, don't go through this. Return false to pass
+		// the message on to override methods like in data grouping.
+		if (isCartesian && !series.isDirty && !xAxis.isDirty && !series.yAxis.isDirty && !force) {
+			return false;
+		}
+
+
+		// optionally filter out points outside the plot area
+		if (isCartesian && series.sorted && (!cropThreshold || dataLength > cropThreshold || series.forceCrop)) {
+			
+			xExtremes = xAxis.getExtremes(); // corrected for log axis (#3053)
+			min = xExtremes.min;
+			max = xExtremes.max;
+
+			// it's outside current extremes
+			if (processedXData[dataLength - 1] < min || processedXData[0] > max) {
+				processedXData = [];
+				processedYData = [];
+
+			// only crop if it's actually spilling out
+			} else if (processedXData[0] < min || processedXData[dataLength - 1] > max) {
+				croppedData = this.cropData(series.xData, series.yData, min, max);
+				processedXData = croppedData.xData;
+				processedYData = croppedData.yData;
+				cropStart = croppedData.start;
+				cropped = true;
+				activePointCount = processedXData.length;
+			}
+		}
+
+
+		// Find the closest distance between processed points
+		for (i = processedXData.length - 1; i >= 0; i--) {
+			distance = processedXData[i] - processedXData[i - 1];
+			
+			if (!cropped && processedXData[i] > min && processedXData[i] < max) {
+				activePointCount++;
+			}
+			if (distance > 0 && (closestPointRange === UNDEFINED || distance < closestPointRange)) {
+				closestPointRange = distance;
+
+			// Unsorted data is not supported by the line tooltip, as well as data grouping and
+			// navigation in Stock charts (#725) and width calculation of columns (#1900)
+			} else if (distance < 0 && series.requireSorting) {
+				error(15);
+			}
+		}
+
+		// Record the properties
+		series.cropped = cropped; // undefined or true
+		series.cropStart = cropStart;
+		series.processedXData = processedXData;
+		series.processedYData = processedYData;
+		series.activePointCount = activePointCount;
+
+		if (options.pointRange === null) { // null means auto, as for columns, candlesticks and OHLC
+			series.pointRange = closestPointRange || 1;
+		}
+		series.closestPointRange = closestPointRange;
+
+	},
+
+	/**
+	 * Iterate over xData and crop values between min and max. Returns object containing crop start/end
+	 * cropped xData with corresponding part of yData, dataMin and dataMax within the cropped range
+	 */
+	cropData: function (xData, yData, min, max) {
+		var dataLength = xData.length,
+			cropStart = 0,
+			cropEnd = dataLength,
+			cropShoulder = pick(this.cropShoulder, 1), // line-type series need one point outside
+			i;
+
+		// iterate up to find slice start
+		for (i = 0; i < dataLength; i++) {
+			if (xData[i] >= min) {
+				cropStart = mathMax(0, i - cropShoulder);
+				break;
+			}
+		}
+
+		// proceed to find slice end
+		for (; i < dataLength; i++) {
+			if (xData[i] > max) {
+				cropEnd = i + cropShoulder;
+				break;
+			}
+		}
+
+		return {
+			xData: xData.slice(cropStart, cropEnd),
+			yData: yData.slice(cropStart, cropEnd),
+			start: cropStart,
+			end: cropEnd
+		};
+	},
+
+
+	/**
+	 * Generate the data point after the data has been processed by cropping away
+	 * unused points and optionally grouped in Highcharts Stock.
+	 */
+	generatePoints: function () {
+		var series = this,
+			options = series.options,
+			dataOptions = options.data,
+			data = series.data,
+			dataLength,
+			processedXData = series.processedXData,
+			processedYData = series.processedYData,
+			pointClass = series.pointClass,
+			processedDataLength = processedXData.length,
+			cropStart = series.cropStart || 0,
+			cursor,
+			hasGroupedData = series.hasGroupedData,
+			point,
+			points = [],
+			i;
+
+		if (!data && !hasGroupedData) {
+			var arr = [];
+			arr.length = dataOptions.length;
+			data = series.data = arr;
+		}
+
+		for (i = 0; i < processedDataLength; i++) {
+			cursor = cropStart + i;
+			if (!hasGroupedData) {
+				if (data[cursor]) {
+					point = data[cursor];
+				} else if (dataOptions[cursor] !== UNDEFINED) { // #970
+					data[cursor] = point = (new pointClass()).init(series, dataOptions[cursor], processedXData[i]);
+				}
+				points[i] = point;
+			} else {
+				// splat the y data in case of ohlc data array
+				points[i] = (new pointClass()).init(series, [processedXData[i]].concat(splat(processedYData[i])));
+			}
+		}
+
+		// Hide cropped-away points - this only runs when the number of points is above cropThreshold, or when
+		// swithching view from non-grouped data to grouped data (#637)
+		if (data && (processedDataLength !== (dataLength = data.length) || hasGroupedData)) {
+			for (i = 0; i < dataLength; i++) {
+				if (i === cropStart && !hasGroupedData) { // when has grouped data, clear all points
+					i += processedDataLength;
+				}
+				if (data[i]) {
+					data[i].destroyElements();
+					data[i].plotX = UNDEFINED; // #1003
+				}
+			}
+		}
+
+		series.data = data;
+		series.points = points;
+	},
+
+	/**
+	 * Calculate Y extremes for visible data
+	 */
+	getExtremes: function (yData) {
+		var xAxis = this.xAxis,
+			yAxis = this.yAxis,
+			xData = this.processedXData,
+			yDataLength,
+			activeYData = [],
+			activeCounter = 0,
+			xExtremes = xAxis.getExtremes(), // #2117, need to compensate for log X axis
+			xMin = xExtremes.min,
+			xMax = xExtremes.max,
+			validValue,
+			withinRange,
+			dataMin,
+			dataMax,
+			x,
+			y,
+			i,
+			j;
+
+		yData = yData || this.stackedYData || this.processedYData;
+		yDataLength = yData.length;
+
+		for (i = 0; i < yDataLength; i++) {
+
+			x = xData[i];
+			y = yData[i];
+
+			// For points within the visible range, including the first point outside the
+			// visible range, consider y extremes
+			validValue = y !== null && y !== UNDEFINED && (!yAxis.isLog || (y.length || y > 0));
+			withinRange = this.getExtremesFromAll || this.cropped || ((xData[i + 1] || x) >= xMin &&
+				(xData[i - 1] || x) <= xMax);
+
+			if (validValue && withinRange) {
+
+				j = y.length;
+				if (j) { // array, like ohlc or range data
+					while (j--) {
+						if (y[j] !== null) {
+							activeYData[activeCounter++] = y[j];
+						}
+					}
+				} else {
+					activeYData[activeCounter++] = y;
+				}
+			}
+		}
+		this.dataMin = pick(dataMin, arrayMin(activeYData));
+		this.dataMax = pick(dataMax, arrayMax(activeYData));
+	},
+
+	/**
+	 * Translate data points from raw data values to chart specific positioning data
+	 * needed later in drawPoints, drawGraph and drawTracker.
+	 */
+	translate: function () {
+		if (!this.processedXData) { // hidden series
+			this.processData();
+		}
+		this.generatePoints();
+		var series = this,
+			options = series.options,
+			stacking = options.stacking,
+			xAxis = series.xAxis,
+			categories = xAxis.categories,
+			yAxis = series.yAxis,
+			points = series.points,
+			dataLength = points.length,
+			hasModifyValue = !!series.modifyValue,
+			i,
+			pointPlacement = options.pointPlacement,
+			dynamicallyPlaced = pointPlacement === 'between' || isNumber(pointPlacement),
+			threshold = options.threshold;
+
+		// Translate each point
+		for (i = 0; i < dataLength; i++) {
+			var point = points[i],
+				xValue = point.x,
+				yValue = point.y,
+				yBottom = point.low,
+				stack = stacking && yAxis.stacks[(series.negStacks && yValue < threshold ? '-' : '') + series.stackKey],
+				pointStack,
+				stackValues;
+
+			// Discard disallowed y values for log axes
+			if (yAxis.isLog && yValue <= 0) {
+				point.y = yValue = null;
+			}
+
+			// Get the plotX translation
+			point.plotX = xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement, this.type === 'flags'); // Math.round fixes #591
+
+
+			// Calculate the bottom y value for stacked series
+			if (stacking && series.visible && stack && stack[xValue]) {
+
+				pointStack = stack[xValue];
+				stackValues = pointStack.points[series.index + ',' + i];
+				yBottom = stackValues[0];
+				yValue = stackValues[1];
+
+				if (yBottom === 0) {
+					yBottom = pick(threshold, yAxis.min);
+				}
+				if (yAxis.isLog && yBottom <= 0) { // #1200, #1232
+					yBottom = null;
+				}
+
+				point.total = point.stackTotal = pointStack.total;
+				point.percentage = pointStack.total && (point.y / pointStack.total * 100);
+				point.stackY = yValue;
+
+				// Place the stack label
+				pointStack.setOffset(series.pointXOffset || 0, series.barW || 0);
+
+			}
+
+			// Set translated yBottom or remove it
+			point.yBottom = defined(yBottom) ?
+				yAxis.translate(yBottom, 0, 1, 0, 1) :
+				null;
+
+			// general hook, used for Highstock compare mode
+			if (hasModifyValue) {
+				yValue = series.modifyValue(yValue, point);
+			}
+
+			// Set the the plotY value, reset it for redraws
+			point.plotY = (typeof yValue === 'number' && yValue !== Infinity) ?
+				//mathRound(yAxis.translate(yValue, 0, 1, 0, 1) * 10) / 10 : // Math.round fixes #591
+				yAxis.translate(yValue, 0, 1, 0, 1) :
+				UNDEFINED;
+
+			// Set client related positions for mouse tracking
+			point.clientX = dynamicallyPlaced ? xAxis.translate(xValue, 0, 0, 0, 1) : point.plotX; // #1514
+
+			point.negative = point.y < (threshold || 0);
+
+			// some API data
+			point.category = categories && categories[point.x] !== UNDEFINED ?
+				categories[point.x] : point.x;
+
+		}
+
+		// now that we have the cropped data, build the segments
+		series.getSegments();
+	},
+
+	/**
+	 * Animate in the series
+	 */
+	animate: function (init) {
+		var series = this,
+			chart = series.chart,
+			renderer = chart.renderer,
+			clipRect,
+			markerClipRect,
+			animation = series.options.animation,
+			clipBox = series.clipBox || chart.clipBox,
+			inverted = chart.inverted,
+			sharedClipKey;
+
+		// Animation option is set to true
+		if (animation && !isObject(animation)) {
+			animation = defaultPlotOptions[series.type].animation;
+		}
+		sharedClipKey = ['_sharedClip', animation.duration, animation.easing, clipBox.height].join(',');
+
+		// Initialize the animation. Set up the clipping rectangle.
+		if (init) {
+
+			// If a clipping rectangle with the same properties is currently present in the chart, use that.
+			clipRect = chart[sharedClipKey];
+			markerClipRect = chart[sharedClipKey + 'm'];
+			if (!clipRect) {
+				chart[sharedClipKey] = clipRect = renderer.clipRect(
+					extend(clipBox, { width: 0 })
+				);
+
+				chart[sharedClipKey + 'm'] = markerClipRect = renderer.clipRect(
+					-99, // include the width of the first marker
+					inverted ? -chart.plotLeft : -chart.plotTop,
+					99,
+					inverted ? chart.chartWidth : chart.chartHeight
+				);
+			}
+			series.group.clip(clipRect);
+			series.markerGroup.clip(markerClipRect);
+			series.sharedClipKey = sharedClipKey;
+
+		// Run the animation
+		} else {
+			clipRect = chart[sharedClipKey];
+			if (clipRect) {
+				clipRect.animate({
+					width: chart.plotSizeX
+				}, animation);
+			}
+			if (chart[sharedClipKey + 'm']) {
+				chart[sharedClipKey + 'm'].animate({
+					width: chart.plotSizeX + 99
+				}, animation);
+			}
+
+			// Delete this function to allow it only once
+			series.animate = null;
+ 
+		}
+	},
+
+	/**
+	 * This runs after animation to land on the final plot clipping
+	 */
+	afterAnimate: function () {
+		var chart = this.chart,
+			sharedClipKey = this.sharedClipKey,
+			group = this.group,
+			clipBox = this.clipBox;
+
+		if (group && this.options.clip !== false) {
+			if (!sharedClipKey || !clipBox) {
+				group.clip(clipBox ? chart.renderer.clipRect(clipBox) : chart.clipRect);
+			}
+			this.markerGroup.clip(); // no clip
+		}
+
+		fireEvent(this, 'afterAnimate');
+
+		// Remove the shared clipping rectancgle when all series are shown
+		setTimeout(function () {
+			if (sharedClipKey && chart[sharedClipKey]) {
+				if (!clipBox) {
+					chart[sharedClipKey] = chart[sharedClipKey].destroy();
+				}
+				if (chart[sharedClipKey + 'm']) {
+					chart[sharedClipKey + 'm'] = chart[sharedClipKey + 'm'].destroy();
+				}
+			}
+		}, 100);
+	},
+
+	/**
+	 * Draw the markers
+	 */
+	drawPoints: function () {
+		var series = this,
+			pointAttr,
+			points = series.points,
+			chart = series.chart,
+			plotX,
+			plotY,
+			i,
+			point,
+			radius,
+			symbol,
+			isImage,
+			graphic,
+			options = series.options,
+			seriesMarkerOptions = options.marker,
+			seriesPointAttr = series.pointAttr[''],
+			pointMarkerOptions,
+			enabled,
+			isInside,
+			markerGroup = series.markerGroup,
+			globallyEnabled = pick(
+				seriesMarkerOptions.enabled, 
+				series.activePointCount < (0.5 * series.xAxis.len / seriesMarkerOptions.radius)
+			);
+
+		if (seriesMarkerOptions.enabled !== false || series._hasPointMarkers) {
+
+			i = points.length;
+			while (i--) {
+				point = points[i];
+				plotX = mathFloor(point.plotX); // #1843
+				plotY = point.plotY;
+				graphic = point.graphic;
+				pointMarkerOptions = point.marker || {};
+				enabled = (globallyEnabled && pointMarkerOptions.enabled === UNDEFINED) || pointMarkerOptions.enabled;
+				isInside = chart.isInsidePlot(mathRound(plotX), plotY, chart.inverted); // #1858
+
+				// only draw the point if y is defined
+				if (enabled && plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {
+
+					// shortcuts
+					pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE] || seriesPointAttr;
+					radius = pointAttr.r;
+					symbol = pick(pointMarkerOptions.symbol, series.symbol);
+					isImage = symbol.indexOf('url') === 0;
+
+					if (graphic) { // update
+						graphic[isInside ? 'show' : 'hide'](true) // Since the marker group isn't clipped, each individual marker must be toggled
+							.animate(extend({
+								x: plotX - radius,
+								y: plotY - radius
+							}, graphic.symbolName ? { // don't apply to image symbols #507
+								width: 2 * radius,
+								height: 2 * radius
+							} : {}));
+					} else if (isInside && (radius > 0 || isImage)) {
+						point.graphic = graphic = chart.renderer.symbol(
+							symbol,
+							plotX - radius,
+							plotY - radius,
+							2 * radius,
+							2 * radius
+						)
+						.attr(pointAttr)
+						.add(markerGroup);
+					}
+
+				} else if (graphic) {
+					point.graphic = graphic.destroy(); // #1269
+				}
+			}
+		}
+
+	},
+
+	/**
+	 * Convert state properties from API naming conventions to SVG attributes
+	 *
+	 * @param {Object} options API options object
+	 * @param {Object} base1 SVG attribute object to inherit from
+	 * @param {Object} base2 Second level SVG attribute object to inherit from
+	 */
+	convertAttribs: function (options, base1, base2, base3) {
+		var conversion = this.pointAttrToOptions,
+			attr,
+			option,
+			obj = {};
+
+		options = options || {};
+		base1 = base1 || {};
+		base2 = base2 || {};
+		base3 = base3 || {};
+
+		for (attr in conversion) {
+			option = conversion[attr];
+			obj[attr] = pick(options[option], base1[attr], base2[attr], base3[attr]);
+		}
+		return obj;
+	},
+
+	/**
+	 * Get the state attributes. Each series type has its own set of attributes
+	 * that are allowed to change on a point's state change. Series wide attributes are stored for
+	 * all series, and additionally point specific attributes are stored for all
+	 * points with individual marker options. If such options are not defined for the point,
+	 * a reference to the series wide attributes is stored in point.pointAttr.
+	 */
+	getAttribs: function () {
+		var series = this,
+			seriesOptions = series.options,
+			normalOptions = defaultPlotOptions[series.type].marker ? seriesOptions.marker : seriesOptions,
+			stateOptions = normalOptions.states,
+			stateOptionsHover = stateOptions[HOVER_STATE],
+			pointStateOptionsHover,
+			seriesColor = series.color,
+			normalDefaults = {
+				stroke: seriesColor,
+				fill: seriesColor
+			},
+			points = series.points || [], // #927
+			i,
+			point,
+			seriesPointAttr = [],
+			pointAttr,
+			pointAttrToOptions = series.pointAttrToOptions,
+			hasPointSpecificOptions = series.hasPointSpecificOptions,
+			negativeColor = seriesOptions.negativeColor,
+			defaultLineColor = normalOptions.lineColor,
+			defaultFillColor = normalOptions.fillColor,
+			turboThreshold = seriesOptions.turboThreshold,
+			attr,
+			key;
+
+		// series type specific modifications
+		if (seriesOptions.marker) { // line, spline, area, areaspline, scatter
+
+			// if no hover radius is given, default to normal radius + 2
+			stateOptionsHover.radius = stateOptionsHover.radius || normalOptions.radius + stateOptionsHover.radiusPlus;
+			stateOptionsHover.lineWidth = stateOptionsHover.lineWidth || normalOptions.lineWidth + stateOptionsHover.lineWidthPlus;
+
+		} else { // column, bar, pie
+
+			// if no hover color is given, brighten the normal color
+			stateOptionsHover.color = stateOptionsHover.color ||
+				Color(stateOptionsHover.color || seriesColor)
+					.brighten(stateOptionsHover.brightness).get();
+		}
+
+		// general point attributes for the series normal state
+		seriesPointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, normalDefaults);
+
+		// HOVER_STATE and SELECT_STATE states inherit from normal state except the default radius
+		each([HOVER_STATE, SELECT_STATE], function (state) {
+			seriesPointAttr[state] =
+					series.convertAttribs(stateOptions[state], seriesPointAttr[NORMAL_STATE]);
+		});
+
+		// set it
+		series.pointAttr = seriesPointAttr;
+
+
+		// Generate the point-specific attribute collections if specific point
+		// options are given. If not, create a referance to the series wide point
+		// attributes
+		i = points.length;
+		if (!turboThreshold || i < turboThreshold || hasPointSpecificOptions) {
+			while (i--) {
+				point = points[i];
+				normalOptions = (point.options && point.options.marker) || point.options;
+				if (normalOptions && normalOptions.enabled === false) {
+					normalOptions.radius = 0;
+				}
+
+				if (point.negative && negativeColor) {
+					point.color = point.fillColor = negativeColor;
+				}
+
+				hasPointSpecificOptions = seriesOptions.colorByPoint || point.color; // #868
+
+				// check if the point has specific visual options
+				if (point.options) {
+					for (key in pointAttrToOptions) {
+						if (defined(normalOptions[pointAttrToOptions[key]])) {
+							hasPointSpecificOptions = true;
+						}
+					}
+				}
+
+				// a specific marker config object is defined for the individual point:
+				// create it's own attribute collection
+				if (hasPointSpecificOptions) {
+					normalOptions = normalOptions || {};
+					pointAttr = [];
+					stateOptions = normalOptions.states || {}; // reassign for individual point
+					pointStateOptionsHover = stateOptions[HOVER_STATE] = stateOptions[HOVER_STATE] || {};
+
+					// Handle colors for column and pies
+					if (!seriesOptions.marker) { // column, bar, point
+						// If no hover color is given, brighten the normal color. #1619, #2579
+						pointStateOptionsHover.color = pointStateOptionsHover.color || (!point.options.color && stateOptionsHover.color) ||
+							Color(point.color)
+								.brighten(pointStateOptionsHover.brightness || stateOptionsHover.brightness)
+								.get();
+					}
+
+					// normal point state inherits series wide normal state
+					attr = { color: point.color }; // #868
+					if (!defaultFillColor) { // Individual point color or negative color markers (#2219)
+						attr.fillColor = point.color;
+					}
+					if (!defaultLineColor) {
+						attr.lineColor = point.color; // Bubbles take point color, line markers use white
+					}
+					pointAttr[NORMAL_STATE] = series.convertAttribs(extend(attr, normalOptions), seriesPointAttr[NORMAL_STATE]);
+
+					// inherit from point normal and series hover
+					pointAttr[HOVER_STATE] = series.convertAttribs(
+						stateOptions[HOVER_STATE],
+						seriesPointAttr[HOVER_STATE],
+						pointAttr[NORMAL_STATE]
+					);
+
+					// inherit from point normal and series hover
+					pointAttr[SELECT_STATE] = series.convertAttribs(
+						stateOptions[SELECT_STATE],
+						seriesPointAttr[SELECT_STATE],
+						pointAttr[NORMAL_STATE]
+					);
+
+
+				// no marker config object is created: copy a reference to the series-wide
+				// attribute collection
+				} else {
+					pointAttr = seriesPointAttr;
+				}
+
+				point.pointAttr = pointAttr;
+			}
+		}
+	},
+
+	/**
+	 * Clear DOM objects and free up memory
+	 */
+	destroy: function () {
+		var series = this,
+			chart = series.chart,
+			issue134 = /AppleWebKit\/533/.test(userAgent),
+			destroy,
+			i,
+			data = series.data || [],
+			point,
+			prop,
+			axis;
+
+		// add event hook
+		fireEvent(series, 'destroy');
+
+		// remove all events
+		removeEvent(series);
+
+		// erase from axes
+		each(series.axisTypes || [], function (AXIS) {
+			axis = series[AXIS];
+			if (axis) {
+				erase(axis.series, series);
+				axis.isDirty = axis.forceRedraw = true;
+			}
+		});
+
+		// remove legend items
+		if (series.legendItem) {
+			series.chart.legend.destroyItem(series);
+		}
+
+		// destroy all points with their elements
+		i = data.length;
+		while (i--) {
+			point = data[i];
+			if (point && point.destroy) {
+				point.destroy();
+			}
+		}
+		series.points = null;
+
+		// Clear the animation timeout if we are destroying the series during initial animation
+		clearTimeout(series.animationTimeout);
+
+		// destroy all SVGElements associated to the series
+		each(['area', 'graph', 'dataLabelsGroup', 'group', 'markerGroup', 'tracker',
+				'graphNeg', 'areaNeg', 'posClip', 'negClip'], function (prop) {
+			if (series[prop]) {
+
+				// issue 134 workaround
+				destroy = issue134 && prop === 'group' ?
+					'hide' :
+					'destroy';
+
+				series[prop][destroy]();
+			}
+		});
+
+		// remove from hoverSeries
+		if (chart.hoverSeries === series) {
+			chart.hoverSeries = null;
+		}
+		erase(chart.series, series);
+
+		// clear all members
+		for (prop in series) {
+			delete series[prop];
+		}
+	},
+
+	/**
+	 * Return the graph path of a segment
+	 */
+	getSegmentPath: function (segment) {
+		var series = this,
+			segmentPath = [],
+			step = series.options.step;
+
+		// build the segment line
+		each(segment, function (point, i) {
+
+			var plotX = point.plotX,
+				plotY = point.plotY,
+				lastPoint;
+
+			if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object
+				segmentPath.push.apply(segmentPath, series.getPointSpline(segment, point, i));
+
+			} else {
+
+				// moveTo or lineTo
+				segmentPath.push(i ? L : M);
+
+				// step line?
+				if (step && i) {
+					lastPoint = segment[i - 1];
+					if (step === 'right') {
+						segmentPath.push(
+							lastPoint.plotX,
+							plotY
+						);
+
+					} else if (step === 'center') {
+						segmentPath.push(
+							(lastPoint.plotX + plotX) / 2,
+							lastPoint.plotY,
+							(lastPoint.plotX + plotX) / 2,
+							plotY
+						);
+
+					} else {
+						segmentPath.push(
+							plotX,
+							lastPoint.plotY
+						);
+					}
+				}
+
+				// normal line to next point
+				segmentPath.push(
+					point.plotX,
+					point.plotY
+				);
+			}
+		});
+
+		return segmentPath;
+	},
+
+	/**
+	 * Get the graph path
+	 */
+	getGraphPath: function () {
+		var series = this,
+			graphPath = [],
+			segmentPath,
+			singlePoints = []; // used in drawTracker
+
+		// Divide into segments and build graph and area paths
+		each(series.segments, function (segment) {
+
+			segmentPath = series.getSegmentPath(segment);
+
+			// add the segment to the graph, or a single point for tracking
+			if (segment.length > 1) {
+				graphPath = graphPath.concat(segmentPath);
+			} else {
+				singlePoints.push(segment[0]);
+			}
+		});
+
+		// Record it for use in drawGraph and drawTracker, and return graphPath
+		series.singlePoints = singlePoints;
+		series.graphPath = graphPath;
+
+		return graphPath;
+
+	},
+
+	/**
+	 * Draw the actual graph
+	 */
+	drawGraph: function () {
+		var series = this,
+			options = this.options,
+			props = [['graph', options.lineColor || this.color]],
+			lineWidth = options.lineWidth,
+			dashStyle =  options.dashStyle,
+			roundCap = options.linecap !== 'square',
+			graphPath = this.getGraphPath(),
+			negativeColor = options.negativeColor;
+
+		if (negativeColor) {
+			props.push(['graphNeg', negativeColor]);
+		}
+
+		// draw the graph
+		each(props, function (prop, i) {
+			var graphKey = prop[0],
+				graph = series[graphKey],
+				attribs;
+
+			if (graph) {
+				stop(graph); // cancel running animations, #459
+				graph.animate({ d: graphPath });
+
+			} else if (lineWidth && graphPath.length) { // #1487
+				attribs = {
+					stroke: prop[1],
+					'stroke-width': lineWidth,
+					fill: NONE,
+					zIndex: 1 // #1069
+				};
+				if (dashStyle) {
+					attribs.dashstyle = dashStyle;
+				} else if (roundCap) {
+					attribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';
+				}
+
+				series[graphKey] = series.chart.renderer.path(graphPath)
+					.attr(attribs)
+					.add(series.group)
+					.shadow(!i && options.shadow);
+			}
+		});
+	},
+
+	/**
+	 * Clip the graphs into the positive and negative coloured graphs
+	 */
+	clipNeg: function () {
+		var options = this.options,
+			chart = this.chart,
+			renderer = chart.renderer,
+			negativeColor = options.negativeColor || options.negativeFillColor,
+			translatedThreshold,
+			posAttr,
+			negAttr,
+			graph = this.graph,
+			area = this.area,
+			posClip = this.posClip,
+			negClip = this.negClip,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			chartSizeMax = mathMax(chartWidth, chartHeight),
+			yAxis = this.yAxis,
+			above,
+			below;
+
+		if (negativeColor && (graph || area)) {
+			translatedThreshold = mathRound(yAxis.toPixels(options.threshold || 0, true));
+			if (translatedThreshold < 0) {
+				chartSizeMax -= translatedThreshold; // #2534
+			}
+			above = {
+				x: 0,
+				y: 0,
+				width: chartSizeMax,
+				height: translatedThreshold
+			};
+			below = {
+				x: 0,
+				y: translatedThreshold,
+				width: chartSizeMax,
+				height: chartSizeMax
+			};
+
+			if (chart.inverted) {
+
+				above.height = below.y = chart.plotWidth - translatedThreshold;
+				if (renderer.isVML) {
+					above = {
+						x: chart.plotWidth - translatedThreshold - chart.plotLeft,
+						y: 0,
+						width: chartWidth,
+						height: chartHeight
+					};
+					below = {
+						x: translatedThreshold + chart.plotLeft - chartWidth,
+						y: 0,
+						width: chart.plotLeft + translatedThreshold,
+						height: chartWidth
+					};
+				}
+			}
+
+			if (yAxis.reversed) {
+				posAttr = below;
+				negAttr = above;
+			} else {
+				posAttr = above;
+				negAttr = below;
+			}
+
+			if (posClip) { // update
+				posClip.animate(posAttr);
+				negClip.animate(negAttr);
+			} else {
+
+				this.posClip = posClip = renderer.clipRect(posAttr);
+				this.negClip = negClip = renderer.clipRect(negAttr);
+
+				if (graph && this.graphNeg) {
+					graph.clip(posClip);
+					this.graphNeg.clip(negClip);
+				}
+
+				if (area) {
+					area.clip(posClip);
+					this.areaNeg.clip(negClip);
+				}
+			}
+		}
+	},
+
+	/**
+	 * Initialize and perform group inversion on series.group and series.markerGroup
+	 */
+	invertGroups: function () {
+		var series = this,
+			chart = series.chart;
+
+		// Pie, go away (#1736)
+		if (!series.xAxis) {
+			return;
+		}
+
+		// A fixed size is needed for inversion to work
+		function setInvert() {
+			var size = {
+				width: series.yAxis.len,
+				height: series.xAxis.len
+			};
+
+			each(['group', 'markerGroup'], function (groupName) {
+				if (series[groupName]) {
+					series[groupName].attr(size).invert();
+				}
+			});
+		}
+
+		addEvent(chart, 'resize', setInvert); // do it on resize
+		addEvent(series, 'destroy', function () {
+			removeEvent(chart, 'resize', setInvert);
+		});
+
+		// Do it now
+		setInvert(); // do it now
+
+		// On subsequent render and redraw, just do setInvert without setting up events again
+		series.invertGroups = setInvert;
+	},
+
+	/**
+	 * General abstraction for creating plot groups like series.group, series.dataLabelsGroup and
+	 * series.markerGroup. On subsequent calls, the group will only be adjusted to the updated plot size.
+	 */
+	plotGroup: function (prop, name, visibility, zIndex, parent) {
+		var group = this[prop],
+			isNew = !group;
+
+		// Generate it on first call
+		if (isNew) {
+			this[prop] = group = this.chart.renderer.g(name)
+				.attr({
+					visibility: visibility,
+					zIndex: zIndex || 0.1 // IE8 needs this
+				})
+				.add(parent);
+		}
+		// Place it on first and subsequent (redraw) calls
+		group[isNew ? 'attr' : 'animate'](this.getPlotBox());
+		return group;
+	},
+
+	/**
+	 * Get the translation and scale for the plot area of this series
+	 */
+	getPlotBox: function () {
+		var chart = this.chart,
+			xAxis = this.xAxis,
+			yAxis = this.yAxis;
+
+		// Swap axes for inverted (#2339)
+		if (chart.inverted) {
+			xAxis = yAxis;
+			yAxis = this.xAxis;
+		}
+		return {
+			translateX: xAxis ? xAxis.left : chart.plotLeft,
+			translateY: yAxis ? yAxis.top : chart.plotTop,
+			scaleX: 1, // #1623
+			scaleY: 1
+		};
+	},
+
+	/**
+	 * Render the graph and markers
+	 */
+	render: function () {
+		var series = this,
+			chart = series.chart,
+			group,
+			options = series.options,
+			animation = options.animation,
+			// Animation doesn't work in IE8 quirks when the group div is hidden,
+			// and looks bad in other oldIE
+			animDuration = (animation && !!series.animate && chart.renderer.isSVG && pick(animation.duration, 500)) || 0,
+			visibility = series.visible ? VISIBLE : HIDDEN,
+			zIndex = options.zIndex,
+			hasRendered = series.hasRendered,
+			chartSeriesGroup = chart.seriesGroup;
+
+		// the group
+		group = series.plotGroup(
+			'group',
+			'series',
+			visibility,
+			zIndex,
+			chartSeriesGroup
+		);
+
+		series.markerGroup = series.plotGroup(
+			'markerGroup',
+			'markers',
+			visibility,
+			zIndex,
+			chartSeriesGroup
+		);
+
+		// initiate the animation
+		if (animDuration) {
+			series.animate(true);
+		}
+
+		// cache attributes for shapes
+		series.getAttribs();
+
+		// SVGRenderer needs to know this before drawing elements (#1089, #1795)
+		group.inverted = series.isCartesian ? chart.inverted : false;
+
+		// draw the graph if any
+		if (series.drawGraph) {
+			series.drawGraph();
+			series.clipNeg();
+		}
+
+		// draw the data labels (inn pies they go before the points)
+		if (series.drawDataLabels) {
+			series.drawDataLabels();
+		}
+
+		// draw the points
+		if (series.visible) {
+			series.drawPoints();
+		}
+
+
+		// draw the mouse tracking area
+		if (series.drawTracker && series.options.enableMouseTracking !== false) {
+			series.drawTracker();
+		}
+
+		// Handle inverted series and tracker groups
+		if (chart.inverted) {
+			series.invertGroups();
+		}
+
+		// Initial clipping, must be defined after inverting groups for VML
+		if (options.clip !== false && !series.sharedClipKey && !hasRendered) {
+			group.clip(chart.clipRect);
+		}
+
+		// Run the animation
+		if (animDuration) {
+			series.animate();
+		} 
+
+		// Call the afterAnimate function on animation complete (but don't overwrite the animation.complete option
+		// which should be available to the user).
+		if (!hasRendered) {
+			if (animDuration) {
+				series.animationTimeout = setTimeout(function () {
+					series.afterAnimate();
+				}, animDuration);
+			} else {
+				series.afterAnimate();
+			}
+		}
+
+		series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see
+		// (See #322) series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see
+		series.hasRendered = true;
+	},
+
+	/**
+	 * Redraw the series after an update in the axes.
+	 */
+	redraw: function () {
+		var series = this,
+			chart = series.chart,
+			wasDirtyData = series.isDirtyData, // cache it here as it is set to false in render, but used after
+			group = series.group,
+			xAxis = series.xAxis,
+			yAxis = series.yAxis;
+
+		// reposition on resize
+		if (group) {
+			if (chart.inverted) {
+				group.attr({
+					width: chart.plotWidth,
+					height: chart.plotHeight
+				});
+			}
+
+			group.animate({
+				translateX: pick(xAxis && xAxis.left, chart.plotLeft),
+				translateY: pick(yAxis && yAxis.top, chart.plotTop)
+			});
+		}
+
+		series.translate();
+		if (series.setTooltipPoints) {
+			series.setTooltipPoints(true);
+		}
+		series.render();
+
+		if (wasDirtyData) {
+			fireEvent(series, 'updatedData');
+		}
+	}
+}; // end Series prototype
+
+/**
+ * The class for stack items
+ */
+function StackItem(axis, options, isNegative, x, stackOption) {
+	
+	var inverted = axis.chart.inverted;
+
+	this.axis = axis;
+
+	// Tells if the stack is negative
+	this.isNegative = isNegative;
+
+	// Save the options to be able to style the label
+	this.options = options;
+
+	// Save the x value to be able to position the label later
+	this.x = x;
+
+	// Initialize total value
+	this.total = null;
+
+	// This will keep each points' extremes stored by series.index and point index
+	this.points = {};
+
+	// Save the stack option on the series configuration object, and whether to treat it as percent
+	this.stack = stackOption;
+
+	// The align options and text align varies on whether the stack is negative and
+	// if the chart is inverted or not.
+	// First test the user supplied value, then use the dynamic.
+	this.alignOptions = {
+		align: options.align || (inverted ? (isNegative ? 'left' : 'right') : 'center'),
+		verticalAlign: options.verticalAlign || (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),
+		y: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)),
+		x: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0)
+	};
+
+	this.textAlign = options.textAlign || (inverted ? (isNegative ? 'right' : 'left') : 'center');
+}
+
+StackItem.prototype = {
+	destroy: function () {
+		destroyObjectProperties(this, this.axis);
+	},
+
+	/**
+	 * Renders the stack total label and adds it to the stack label group.
+	 */
+	render: function (group) {
+		var options = this.options,
+			formatOption = options.format,
+			str = formatOption ?
+				format(formatOption, this) : 
+				options.formatter.call(this);  // format the text in the label
+
+		// Change the text to reflect the new total and set visibility to hidden in case the serie is hidden
+		if (this.label) {
+			this.label.attr({text: str, visibility: HIDDEN});
+		// Create new label
+		} else {
+			this.label =
+				this.axis.chart.renderer.text(str, null, null, options.useHTML)		// dummy positions, actual position updated with setOffset method in columnseries
+					.css(options.style)				// apply style
+					.attr({
+						align: this.textAlign,				// fix the text-anchor
+						rotation: options.rotation,	// rotation
+						visibility: HIDDEN					// hidden until setOffset is called
+					})				
+					.add(group);							// add to the labels-group
+		}
+	},
+
+	/**
+	 * Sets the offset that the stack has from the x value and repositions the label.
+	 */
+	setOffset: function (xOffset, xWidth) {
+		var stackItem = this,
+			axis = stackItem.axis,
+			chart = axis.chart,
+			inverted = chart.inverted,
+			neg = this.isNegative,							// special treatment is needed for negative stacks
+			y = axis.translate(axis.usePercentage ? 100 : this.total, 0, 0, 0, 1), // stack value translated mapped to chart coordinates
+			yZero = axis.translate(0),						// stack origin
+			h = mathAbs(y - yZero),							// stack height
+			x = chart.xAxis[0].translate(this.x) + xOffset,	// stack x position
+			plotHeight = chart.plotHeight,
+			stackBox = {	// this is the box for the complete stack
+				x: inverted ? (neg ? y : y - h) : x,
+				y: inverted ? plotHeight - x - xWidth : (neg ? (plotHeight - y - h) : plotHeight - y),
+				width: inverted ? h : xWidth,
+				height: inverted ? xWidth : h
+			},
+			label = this.label,
+			alignAttr;
+		
+		if (label) {
+			label.align(this.alignOptions, null, stackBox);	// align the label to the box
+				
+			// Set visibility (#678)
+			alignAttr = label.alignAttr;
+			label[this.options.crop === false || chart.isInsidePlot(alignAttr.x, alignAttr.y) ? 'show' : 'hide'](true);
+		}
+	}
+};
+
+
+// Stacking methods defined on the Axis prototype
+
+/**
+ * Build the stacks from top down
+ */
+Axis.prototype.buildStacks = function () {
+	var series = this.series,
+		reversedStacks = pick(this.options.reversedStacks, true),
+		i = series.length;
+	if (!this.isXAxis) {
+		this.usePercentage = false;
+		while (i--) {
+			series[reversedStacks ? i : series.length - i - 1].setStackedPoints();
+		}
+		// Loop up again to compute percent stack
+		if (this.usePercentage) {
+			for (i = 0; i < series.length; i++) {
+				series[i].setPercentStacks();
+			}
+		}
+	}
+};
+
+Axis.prototype.renderStackTotals = function () {
+	var axis = this,
+		chart = axis.chart,
+		renderer = chart.renderer,
+		stacks = axis.stacks,
+		stackKey, 
+		oneStack, 
+		stackCategory,
+		stackTotalGroup = axis.stackTotalGroup;
+
+	// Create a separate group for the stack total labels
+	if (!stackTotalGroup) {
+		axis.stackTotalGroup = stackTotalGroup =
+			renderer.g('stack-labels')
+				.attr({
+					visibility: VISIBLE,
+					zIndex: 6
+				})
+				.add();
+	}
+
+	// plotLeft/Top will change when y axis gets wider so we need to translate the
+	// stackTotalGroup at every render call. See bug #506 and #516
+	stackTotalGroup.translate(chart.plotLeft, chart.plotTop);
+
+	// Render each stack total
+	for (stackKey in stacks) {
+		oneStack = stacks[stackKey];
+		for (stackCategory in oneStack) {
+			oneStack[stackCategory].render(stackTotalGroup);
+		}
+	}
+};
+
+
+// Stacking methods defnied for Series prototype
+
+/**
+ * Adds series' points value to corresponding stack
+ */
+Series.prototype.setStackedPoints = function () {
+	if (!this.options.stacking || (this.visible !== true && this.chart.options.chart.ignoreHiddenSeries !== false)) {
+		return;
+	}
+
+	var series = this,
+		xData = series.processedXData,
+		yData = series.processedYData,
+		stackedYData = [],
+		yDataLength = yData.length,
+		seriesOptions = series.options,
+		threshold = seriesOptions.threshold,
+		stackOption = seriesOptions.stack,
+		stacking = seriesOptions.stacking,
+		stackKey = series.stackKey,
+		negKey = '-' + stackKey,
+		negStacks = series.negStacks,
+		yAxis = series.yAxis,
+		stacks = yAxis.stacks,
+		oldStacks = yAxis.oldStacks,
+		isNegative,
+		stack,
+		other,
+		key,
+		pointKey,
+		i,
+		x,
+		y;
+
+	// loop over the non-null y values and read them into a local array
+	for (i = 0; i < yDataLength; i++) {
+		x = xData[i];
+		y = yData[i];
+		pointKey = series.index + ',' + i;
+
+		// Read stacked values into a stack based on the x value,
+		// the sign of y and the stack key. Stacking is also handled for null values (#739)
+		isNegative = negStacks && y < threshold;
+		key = isNegative ? negKey : stackKey;
+
+		// Create empty object for this stack if it doesn't exist yet
+		if (!stacks[key]) {
+			stacks[key] = {};
+		}
+
+		// Initialize StackItem for this x
+		if (!stacks[key][x]) {
+			if (oldStacks[key] && oldStacks[key][x]) {
+				stacks[key][x] = oldStacks[key][x];
+				stacks[key][x].total = null;
+			} else {
+				stacks[key][x] = new StackItem(yAxis, yAxis.options.stackLabels, isNegative, x, stackOption);
+			}
+		}
+
+		// If the StackItem doesn't exist, create it first
+		stack = stacks[key][x];
+		stack.points[pointKey] = [stack.cum || 0];
+
+		// Add value to the stack total
+		if (stacking === 'percent') {
+
+			// Percent stacked column, totals are the same for the positive and negative stacks
+			other = isNegative ? stackKey : negKey;
+			if (negStacks && stacks[other] && stacks[other][x]) {
+				other = stacks[other][x];
+				stack.total = other.total = mathMax(other.total, stack.total) + mathAbs(y) || 0;
+
+			// Percent stacked areas
+			} else {
+				stack.total = correctFloat(stack.total + (mathAbs(y) || 0));
+			}
+		} else {
+			stack.total = correctFloat(stack.total + (y || 0));
+		}
+
+		stack.cum = (stack.cum || 0) + (y || 0);
+
+		stack.points[pointKey].push(stack.cum);
+		stackedYData[i] = stack.cum;
+
+	}
+
+	if (stacking === 'percent') {
+		yAxis.usePercentage = true;
+	}
+
+	this.stackedYData = stackedYData; // To be used in getExtremes
+
+	// Reset old stacks
+	yAxis.oldStacks = {};
+};
+
+/**
+ * Iterate over all stacks and compute the absolute values to percent
+ */
+Series.prototype.setPercentStacks = function () {
+	var series = this,
+		stackKey = series.stackKey,
+		stacks = series.yAxis.stacks,
+		processedXData = series.processedXData;
+
+	each([stackKey, '-' + stackKey], function (key) {
+		var i = processedXData.length,
+			x,
+			stack,
+			pointExtremes,
+			totalFactor;
+
+		while (i--) {
+			x = processedXData[i];
+			stack = stacks[key] && stacks[key][x];
+			pointExtremes = stack && stack.points[series.index + ',' + i];
+			if (pointExtremes) {
+				totalFactor = stack.total ? 100 / stack.total : 0;
+				pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor); // Y bottom value
+				pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor); // Y value
+				series.stackedYData[i] = pointExtremes[1];
+			}
+		}
+	});
+};
+
+// Extend the Chart prototype for dynamic methods
+extend(Chart.prototype, {
+
+	/**
+	 * Add a series dynamically after  time
+	 *
+	 * @param {Object} options The config options
+	 * @param {Boolean} redraw Whether to redraw the chart after adding. Defaults to true.
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 *
+	 * @return {Object} series The newly created series object
+	 */
+	addSeries: function (options, redraw, animation) {
+		var series,
+			chart = this;
+
+		if (options) {
+			redraw = pick(redraw, true); // defaults to true
+
+			fireEvent(chart, 'addSeries', { options: options }, function () {
+				series = chart.initSeries(options);
+
+				chart.isDirtyLegend = true; // the series array is out of sync with the display
+				chart.linkSeries();
+				if (redraw) {
+					chart.redraw(animation);
+				}
+			});
+		}
+
+		return series;
+	},
+
+	/**
+     * Add an axis to the chart
+     * @param {Object} options The axis option
+     * @param {Boolean} isX Whether it is an X axis or a value axis
+     */
+	addAxis: function (options, isX, redraw, animation) {
+		var key = isX ? 'xAxis' : 'yAxis',
+			chartOptions = this.options,
+			axis;
+
+		/*jslint unused: false*/
+		axis = new Axis(this, merge(options, {
+			index: this[key].length,
+			isX: isX
+		}));
+		/*jslint unused: true*/
+
+		// Push the new axis options to the chart options
+		chartOptions[key] = splat(chartOptions[key] || {});
+		chartOptions[key].push(options);
+
+		if (pick(redraw, true)) {
+			this.redraw(animation);
+		}
+	},
+
+	/**
+	 * Dim the chart and show a loading text or symbol
+	 * @param {String} str An optional text to show in the loading label instead of the default one
+	 */
+	showLoading: function (str) {
+		var chart = this,
+			options = chart.options,
+			loadingDiv = chart.loadingDiv,
+			loadingOptions = options.loading,
+			setLoadingSize = function () {
+				if (loadingDiv) {
+					css(loadingDiv, {
+						left: chart.plotLeft + PX,
+						top: chart.plotTop + PX,
+						width: chart.plotWidth + PX,
+						height: chart.plotHeight + PX
+					});
+				}
+			};
+
+		// create the layer at the first call
+		if (!loadingDiv) {
+			chart.loadingDiv = loadingDiv = createElement(DIV, {
+				className: PREFIX + 'loading'
+			}, extend(loadingOptions.style, {
+				zIndex: 10,
+				display: NONE
+			}), chart.container);
+
+			chart.loadingSpan = createElement(
+				'span',
+				null,
+				loadingOptions.labelStyle,
+				loadingDiv
+			);
+			addEvent(chart, 'redraw', setLoadingSize); // #1080
+		}
+
+		// update text
+		chart.loadingSpan.innerHTML = str || options.lang.loading;
+
+		// show it
+		if (!chart.loadingShown) {
+			css(loadingDiv, {
+				opacity: 0,
+				display: ''				
+			});
+			animate(loadingDiv, {
+				opacity: loadingOptions.style.opacity
+			}, {
+				duration: loadingOptions.showDuration || 0
+			});
+			chart.loadingShown = true;
+		}
+		setLoadingSize();
+	},
+
+	/**
+	 * Hide the loading layer
+	 */
+	hideLoading: function () {
+		var options = this.options,
+			loadingDiv = this.loadingDiv;
+
+		if (loadingDiv) {
+			animate(loadingDiv, {
+				opacity: 0
+			}, {
+				duration: options.loading.hideDuration || 100,
+				complete: function () {
+					css(loadingDiv, { display: NONE });
+				}
+			});
+		}
+		this.loadingShown = false;
+	}
+});
+
+// extend the Point prototype for dynamic methods
+extend(Point.prototype, {
+	/**
+	 * Update the point with new options (typically x/y data) and optionally redraw the series.
+	 *
+	 * @param {Object} options Point options as defined in the series.data array
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 *
+	 */
+	update: function (options, redraw, animation) {
+		var point = this,
+			series = point.series,
+			graphic = point.graphic,
+			i,
+			data = series.data,
+			chart = series.chart,
+			seriesOptions = series.options;
+
+		redraw = pick(redraw, true);
+
+		// fire the event with a default handler of doing the update
+		point.firePointEvent('update', { options: options }, function () {
+
+			point.applyOptions(options);
+
+			// update visuals
+			if (isObject(options)) {
+				series.getAttribs();
+				if (graphic) {
+					if (options && options.marker && options.marker.symbol) {
+						point.graphic = graphic.destroy();
+					} else {
+						graphic.attr(point.pointAttr[point.state || '']);
+					}
+				}
+				if (options && options.dataLabels && point.dataLabel) { // #2468
+					point.dataLabel = point.dataLabel.destroy();
+				}
+			}
+
+			// record changes in the parallel arrays
+			i = inArray(point, data);
+			series.updateParallelArrays(point, i);
+
+			seriesOptions.data[i] = point.options;
+
+			// redraw
+			series.isDirty = series.isDirtyData = true;
+			if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320
+				chart.isDirtyBox = true;
+			}
+
+			if (seriesOptions.legendType === 'point') { // #1831, #1885
+				chart.legend.destroyItem(point);
+			}
+			if (redraw) {
+				chart.redraw(animation);
+			}
+		});
+	},
+
+	/**
+	 * Remove a point and optionally redraw the series and if necessary the axes
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+	remove: function (redraw, animation) {
+		var point = this,
+			series = point.series,
+			points = series.points,
+			chart = series.chart,
+			i,
+			data = series.data;
+
+		setAnimation(animation, chart);
+		redraw = pick(redraw, true);
+
+		// fire the event with a default handler of removing the point
+		point.firePointEvent('remove', null, function () {
+
+			// splice all the parallel arrays
+			i = inArray(point, data);
+			if (data.length === points.length) {
+				points.splice(i, 1);
+			}
+			data.splice(i, 1);
+			series.options.data.splice(i, 1);
+			series.updateParallelArrays(point, 'splice', i, 1);
+
+			point.destroy();
+
+			// redraw
+			series.isDirty = true;
+			series.isDirtyData = true;
+			if (redraw) {
+				chart.redraw();
+			}
+		});
+	}
+});
+
+// Extend the series prototype for dynamic methods
+extend(Series.prototype, {
+	/**
+	 * Add a point dynamically after chart load time
+	 * @param {Object} options Point options as given in series.data
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean} shift If shift is true, a point is shifted off the start
+	 *    of the series as one is appended to the end.
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+	addPoint: function (options, redraw, shift, animation) {
+		var series = this,
+			seriesOptions = series.options,
+			data = series.data,
+			graph = series.graph,
+			area = series.area,
+			chart = series.chart,
+			names = series.xAxis && series.xAxis.names,
+			currentShift = (graph && graph.shift) || 0,
+			dataOptions = seriesOptions.data,
+			point,
+			isInTheMiddle,
+			xData = series.xData,
+			x,
+			i;
+
+		setAnimation(animation, chart);
+
+		// Make graph animate sideways
+		if (shift) {
+			each([graph, area, series.graphNeg, series.areaNeg], function (shape) {
+				if (shape) {
+					shape.shift = currentShift + 1;
+				}
+			});
+		}
+		if (area) {
+			area.isArea = true; // needed in animation, both with and without shift
+		}
+
+		// Optional redraw, defaults to true
+		redraw = pick(redraw, true);
+
+		// Get options and push the point to xData, yData and series.options. In series.generatePoints
+		// the Point instance will be created on demand and pushed to the series.data array.
+		point = { series: series };
+		series.pointClass.prototype.applyOptions.apply(point, [options]);
+		x = point.x;
+
+		// Get the insertion point
+		i = xData.length;
+		if (series.requireSorting && x < xData[i - 1]) {
+			isInTheMiddle = true;
+			while (i && xData[i - 1] > x) {
+				i--;
+			}
+		}
+
+		series.updateParallelArrays(point, 'splice', i, 0, 0); // insert undefined item
+		series.updateParallelArrays(point, i); // update it
+
+		if (names) {
+			names[x] = point.name;
+		}
+		dataOptions.splice(i, 0, options);
+
+		if (isInTheMiddle) {
+			series.data.splice(i, 0, null);
+			series.processData();
+		}
+
+		// Generate points to be added to the legend (#1329)
+		if (seriesOptions.legendType === 'point') {
+			series.generatePoints();
+		}
+
+		// Shift the first point off the parallel arrays
+		// todo: consider series.removePoint(i) method
+		if (shift) {
+			if (data[0] && data[0].remove) {
+				data[0].remove(false);
+			} else {
+				data.shift();
+				series.updateParallelArrays(point, 'shift');
+
+				dataOptions.shift();
+			}
+		}
+
+		// redraw
+		series.isDirty = true;
+		series.isDirtyData = true;
+		if (redraw) {
+			series.getAttribs(); // #1937
+			chart.redraw();
+		}
+	},
+
+	/**
+	 * Remove a series and optionally redraw the chart
+	 *
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+
+	remove: function (redraw, animation) {
+		var series = this,
+			chart = series.chart;
+		redraw = pick(redraw, true);
+
+		if (!series.isRemoving) {  /* prevent triggering native event in jQuery
+				(calling the remove function from the remove event) */
+			series.isRemoving = true;
+
+			// fire the event with a default handler of removing the point
+			fireEvent(series, 'remove', null, function () {
+
+
+				// destroy elements
+				series.destroy();
+
+
+				// redraw
+				chart.isDirtyLegend = chart.isDirtyBox = true;
+				chart.linkSeries();
+
+				if (redraw) {
+					chart.redraw(animation);
+				}
+			});
+
+		}
+		series.isRemoving = false;
+	},
+
+	/**
+	 * Update the series with a new set of options
+	 */
+	update: function (newOptions, redraw) {
+		var series = this,
+			chart = this.chart,
+			// must use user options when changing type because this.options is merged
+			// in with type specific plotOptions
+			oldOptions = this.userOptions,
+			oldType = this.type,
+			proto = seriesTypes[oldType].prototype,
+			preserve = ['group', 'markerGroup', 'dataLabelsGroup'],
+			n;
+
+		// Make sure groups are not destroyed (#3094)
+		each(preserve, function (prop) {
+			preserve[prop] = series[prop];
+			delete series[prop];
+		});
+
+		// Do the merge, with some forced options
+		newOptions = merge(oldOptions, {
+			animation: false,
+			index: this.index,
+			pointStart: this.xData[0] // when updating after addPoint
+		}, { data: this.options.data }, newOptions);
+
+		// Destroy the series and reinsert methods from the type prototype
+		this.remove(false);
+		for (n in proto) { // Overwrite series-type specific methods (#2270)
+			if (proto.hasOwnProperty(n)) {
+				this[n] = UNDEFINED;
+			}
+		}
+		extend(this, seriesTypes[newOptions.type || oldType].prototype);
+
+		// Re-register groups (#3094)
+		each(preserve, function (prop) {
+			series[prop] = preserve[prop];
+		});
+
+
+		this.init(chart, newOptions);
+		chart.linkSeries(); // Links are lost in this.remove (#3028)
+		if (pick(redraw, true)) {
+			chart.redraw(false);
+		}
+	}
+});
+
+// Extend the Axis.prototype for dynamic methods
+extend(Axis.prototype, {
+
+	/**
+	 * Update the axis with a new options structure
+	 */
+	update: function (newOptions, redraw) {
+		var chart = this.chart;
+
+		newOptions = chart.options[this.coll][this.options.index] = merge(this.userOptions, newOptions);
+
+		this.destroy(true);
+		this._addedPlotLB = UNDEFINED; // #1611, #2887
+
+		this.init(chart, extend(newOptions, { events: UNDEFINED }));
+
+		chart.isDirtyBox = true;
+		if (pick(redraw, true)) {
+			chart.redraw();
+		}
+	},
+
+	/**
+     * Remove the axis from the chart
+     */
+	remove: function (redraw) {
+		var chart = this.chart,
+			key = this.coll, // xAxis or yAxis
+			axisSeries = this.series,
+			i = axisSeries.length;
+
+		// Remove associated series (#2687)
+		while (i--) {
+			if (axisSeries[i]) {
+				axisSeries[i].remove(false);
+			}
+		}
+
+		// Remove the axis
+		erase(chart.axes, this);
+		erase(chart[key], this);
+		chart.options[key].splice(this.options.index, 1);
+		each(chart[key], function (axis, i) { // Re-index, #1706
+			axis.options.index = i;
+		});
+		this.destroy();
+		chart.isDirtyBox = true;
+
+		if (pick(redraw, true)) {
+			chart.redraw();
+		}
+	},
+
+	/**
+	 * Update the axis title by options
+	 */
+	setTitle: function (newTitleOptions, redraw) {
+		this.update({ title: newTitleOptions }, redraw);
+	},
+
+	/**
+	 * Set new axis categories and optionally redraw
+	 * @param {Array} categories
+	 * @param {Boolean} redraw
+	 */
+	setCategories: function (categories, redraw) {
+		this.update({ categories: categories }, redraw);
+	}
+
+});
+
+
+/**
+ * LineSeries object
+ */
+var LineSeries = extendClass(Series);
+seriesTypes.line = LineSeries;
+
+/**
+ * Set the default options for area
+ */
+defaultPlotOptions.area = merge(defaultSeriesOptions, {
+	threshold: 0
+	// trackByArea: false,
+	// lineColor: null, // overrides color, but lets fillColor be unaltered
+	// fillOpacity: 0.75,
+	// fillColor: null
+});
+
+/**
+ * AreaSeries object
+ */
+var AreaSeries = extendClass(Series, {
+	type: 'area',
+	/**
+	 * For stacks, don't split segments on null values. Instead, draw null values with 
+	 * no marker. Also insert dummy points for any X position that exists in other series
+	 * in the stack.
+	 */ 
+	getSegments: function () {
+		var series = this,
+			segments = [],
+			segment = [],
+			keys = [],
+			xAxis = this.xAxis,
+			yAxis = this.yAxis,
+			stack = yAxis.stacks[this.stackKey],
+			pointMap = {},
+			plotX,
+			plotY,
+			points = this.points,
+			connectNulls = this.options.connectNulls,
+			i,
+			x;
+
+		if (this.options.stacking && !this.cropped) { // cropped causes artefacts in Stock, and perf issue
+			// Create a map where we can quickly look up the points by their X value.
+			for (i = 0; i < points.length; i++) {
+				pointMap[points[i].x] = points[i];
+			}
+
+			// Sort the keys (#1651)
+			for (x in stack) {
+				if (stack[x].total !== null) { // nulled after switching between grouping and not (#1651, #2336)
+					keys.push(+x);
+				}
+			}
+			keys.sort(function (a, b) {
+				return a - b;
+			});
+
+			each(keys, function (x) {
+				var y = 0,
+					stackPoint;
+
+				if (connectNulls && (!pointMap[x] || pointMap[x].y === null)) { // #1836
+					return;
+
+				// The point exists, push it to the segment
+				} else if (pointMap[x]) {
+					segment.push(pointMap[x]);
+
+				// There is no point for this X value in this series, so we 
+				// insert a dummy point in order for the areas to be drawn
+				// correctly.
+				} else {
+
+					// Loop down the stack to find the series below this one that has
+					// a value (#1991)
+					for (i = series.index; i <= yAxis.series.length; i++) {
+						stackPoint = stack[x].points[i + ',' + x];
+						if (stackPoint) {
+							y = stackPoint[1];
+							break;
+						}
+					}
+
+					plotX = xAxis.translate(x);
+					plotY = yAxis.toPixels(y, true);
+					segment.push({ 
+						y: null, 
+						plotX: plotX,
+						clientX: plotX, 
+						plotY: plotY, 
+						yBottom: plotY,
+						onMouseOver: noop
+					});
+				}
+			});
+
+			if (segment.length) {
+				segments.push(segment);
+			}
+
+		} else {
+			Series.prototype.getSegments.call(this);
+			segments = this.segments;
+		}
+
+		this.segments = segments;
+	},
+	
+	/**
+	 * Extend the base Series getSegmentPath method by adding the path for the area.
+	 * This path is pushed to the series.areaPath property.
+	 */
+	getSegmentPath: function (segment) {
+		
+		var segmentPath = Series.prototype.getSegmentPath.call(this, segment), // call base method
+			areaSegmentPath = [].concat(segmentPath), // work on a copy for the area path
+			i,
+			options = this.options,
+			segLength = segmentPath.length,
+			translatedThreshold = this.yAxis.getThreshold(options.threshold), // #2181
+			yBottom;
+		
+		if (segLength === 3) { // for animation from 1 to two points
+			areaSegmentPath.push(L, segmentPath[1], segmentPath[2]);
+		}
+		if (options.stacking && !this.closedStacks) {
+			
+			// Follow stack back. Todo: implement areaspline. A general solution could be to 
+			// reverse the entire graphPath of the previous series, though may be hard with
+			// splines and with series with different extremes
+			for (i = segment.length - 1; i >= 0; i--) {
+
+				yBottom = pick(segment[i].yBottom, translatedThreshold);
+			
+				// step line?
+				if (i < segment.length - 1 && options.step) {
+					areaSegmentPath.push(segment[i + 1].plotX, yBottom);
+				}
+				
+				areaSegmentPath.push(segment[i].plotX, yBottom);
+			}
+
+		} else { // follow zero line back
+			this.closeSegment(areaSegmentPath, segment, translatedThreshold);
+		}
+		this.areaPath = this.areaPath.concat(areaSegmentPath);
+		return segmentPath;
+	},
+	
+	/**
+	 * Extendable method to close the segment path of an area. This is overridden in polar 
+	 * charts.
+	 */
+	closeSegment: function (path, segment, translatedThreshold) {
+		path.push(
+			L,
+			segment[segment.length - 1].plotX,
+			translatedThreshold,
+			L,
+			segment[0].plotX,
+			translatedThreshold
+		);
+	},
+	
+	/**
+	 * Draw the graph and the underlying area. This method calls the Series base
+	 * function and adds the area. The areaPath is calculated in the getSegmentPath
+	 * method called from Series.prototype.drawGraph.
+	 */
+	drawGraph: function () {
+		
+		// Define or reset areaPath
+		this.areaPath = [];
+		
+		// Call the base method
+		Series.prototype.drawGraph.apply(this);
+		
+		// Define local variables
+		var series = this,
+			areaPath = this.areaPath,
+			options = this.options,
+			negativeColor = options.negativeColor,
+			negativeFillColor = options.negativeFillColor,
+			props = [['area', this.color, options.fillColor]]; // area name, main color, fill color
+		
+		if (negativeColor || negativeFillColor) {
+			props.push(['areaNeg', negativeColor, negativeFillColor]);
+		}
+		
+		each(props, function (prop) {
+			var areaKey = prop[0],
+				area = series[areaKey];
+				
+			// Create or update the area
+			if (area) { // update
+				area.animate({ d: areaPath });
+	
+			} else { // create
+				series[areaKey] = series.chart.renderer.path(areaPath)
+					.attr({
+						fill: pick(
+							prop[2],
+							Color(prop[1]).setOpacity(pick(options.fillOpacity, 0.75)).get()
+						),
+						zIndex: 0 // #1069
+					}).add(series.group);
+			}
+		});
+	},
+
+	drawLegendSymbol: LegendSymbolMixin.drawRectangle
+});
+
+seriesTypes.area = AreaSeries;
+/**
+ * Set the default options for spline
+ */
+defaultPlotOptions.spline = merge(defaultSeriesOptions);
+
+/**
+ * SplineSeries object
+ */
+var SplineSeries = extendClass(Series, {
+	type: 'spline',
+
+	/**
+	 * Get the spline segment from a given point's previous neighbour to the given point
+	 */
+	getPointSpline: function (segment, point, i) {
+		var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc
+			denom = smoothing + 1,
+			plotX = point.plotX,
+			plotY = point.plotY,
+			lastPoint = segment[i - 1],
+			nextPoint = segment[i + 1],
+			leftContX,
+			leftContY,
+			rightContX,
+			rightContY,
+			ret;
+
+		// find control points
+		if (lastPoint && nextPoint) {
+		
+			var lastX = lastPoint.plotX,
+				lastY = lastPoint.plotY,
+				nextX = nextPoint.plotX,
+				nextY = nextPoint.plotY,
+				correction;
+
+			leftContX = (smoothing * plotX + lastX) / denom;
+			leftContY = (smoothing * plotY + lastY) / denom;
+			rightContX = (smoothing * plotX + nextX) / denom;
+			rightContY = (smoothing * plotY + nextY) / denom;
+
+			// have the two control points make a straight line through main point
+			correction = ((rightContY - leftContY) * (rightContX - plotX)) /
+				(rightContX - leftContX) + plotY - rightContY;
+
+			leftContY += correction;
+			rightContY += correction;
+
+			// to prevent false extremes, check that control points are between
+			// neighbouring points' y values
+			if (leftContY > lastY && leftContY > plotY) {
+				leftContY = mathMax(lastY, plotY);
+				rightContY = 2 * plotY - leftContY; // mirror of left control point
+			} else if (leftContY < lastY && leftContY < plotY) {
+				leftContY = mathMin(lastY, plotY);
+				rightContY = 2 * plotY - leftContY;
+			}
+			if (rightContY > nextY && rightContY > plotY) {
+				rightContY = mathMax(nextY, plotY);
+				leftContY = 2 * plotY - rightContY;
+			} else if (rightContY < nextY && rightContY < plotY) {
+				rightContY = mathMin(nextY, plotY);
+				leftContY = 2 * plotY - rightContY;
+			}
+
+			// record for drawing in next point
+			point.rightContX = rightContX;
+			point.rightContY = rightContY;
+
+		}
+		
+		// Visualize control points for debugging
+		/*
+		if (leftContX) {
+			this.chart.renderer.circle(leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop, 2)
+				.attr({
+					stroke: 'red',
+					'stroke-width': 1,
+					fill: 'none'
+				})
+				.add();
+			this.chart.renderer.path(['M', leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop,
+				'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])
+				.attr({
+					stroke: 'red',
+					'stroke-width': 1
+				})
+				.add();
+			this.chart.renderer.circle(rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop, 2)
+				.attr({
+					stroke: 'green',
+					'stroke-width': 1,
+					fill: 'none'
+				})
+				.add();
+			this.chart.renderer.path(['M', rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop,
+				'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])
+				.attr({
+					stroke: 'green',
+					'stroke-width': 1
+				})
+				.add();
+		}
+		*/
+
+		// moveTo or lineTo
+		if (!i) {
+			ret = [M, plotX, plotY];
+		} else { // curve from last point to this
+			ret = [
+				'C',
+				lastPoint.rightContX || lastPoint.plotX,
+				lastPoint.rightContY || lastPoint.plotY,
+				leftContX || plotX,
+				leftContY || plotY,
+				plotX,
+				plotY
+			];
+			lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later
+		}
+		return ret;
+	}
+});
+seriesTypes.spline = SplineSeries;
+
+/**
+ * Set the default options for areaspline
+ */
+defaultPlotOptions.areaspline = merge(defaultPlotOptions.area);
+
+/**
+ * AreaSplineSeries object
+ */
+var areaProto = AreaSeries.prototype,
+	AreaSplineSeries = extendClass(SplineSeries, {
+		type: 'areaspline',
+		closedStacks: true, // instead of following the previous graph back, follow the threshold back
+		
+		// Mix in methods from the area series
+		getSegmentPath: areaProto.getSegmentPath,
+		closeSegment: areaProto.closeSegment,
+		drawGraph: areaProto.drawGraph,
+		drawLegendSymbol: LegendSymbolMixin.drawRectangle
+	});
+
+seriesTypes.areaspline = AreaSplineSeries;
+
+/**
+ * Set the default options for column
+ */
+defaultPlotOptions.column = merge(defaultSeriesOptions, {
+	borderColor: '#FFFFFF',
+	//borderWidth: 1,
+	borderRadius: 0,
+	//colorByPoint: undefined,
+	groupPadding: 0.2,
+	//grouping: true,
+	marker: null, // point options are specified in the base options
+	pointPadding: 0.1,
+	//pointWidth: null,
+	minPointLength: 0,
+	cropThreshold: 50, // when there are more points, they will not animate out of the chart on xAxis.setExtremes
+	pointRange: null, // null means auto, meaning 1 in a categorized axis and least distance between points if not categories
+	states: {
+		hover: {
+			brightness: 0.1,
+			shadow: false,
+			halo: false
+		},
+		select: {
+			color: '#C0C0C0',
+			borderColor: '#000000',
+			shadow: false
+		}
+	},
+	dataLabels: {
+		align: null, // auto
+		verticalAlign: null, // auto
+		y: null
+	},
+	stickyTracking: false,
+	tooltip: {
+		distance: 6
+	},
+	threshold: 0
+});
+
+/**
+ * ColumnSeries object
+ */
+var ColumnSeries = extendClass(Series, {
+	type: 'column',
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		stroke: 'borderColor',
+		fill: 'color',
+		r: 'borderRadius'
+	},
+	cropShoulder: 0,
+	trackerGroups: ['group', 'dataLabelsGroup'],
+	negStacks: true, // use separate negative stacks, unlike area stacks where a negative 
+		// point is substracted from previous (#1910)
+	
+	/**
+	 * Initialize the series
+	 */
+	init: function () {
+		Series.prototype.init.apply(this, arguments);
+
+		var series = this,
+			chart = series.chart;
+
+		// if the series is added dynamically, force redraw of other
+		// series affected by a new column
+		if (chart.hasRendered) {
+			each(chart.series, function (otherSeries) {
+				if (otherSeries.type === series.type) {
+					otherSeries.isDirty = true;
+				}
+			});
+		}
+	},
+
+	/**
+	 * Return the width and x offset of the columns adjusted for grouping, groupPadding, pointPadding,
+	 * pointWidth etc. 
+	 */
+	getColumnMetrics: function () {
+
+		var series = this,
+			options = series.options,
+			xAxis = series.xAxis,
+			yAxis = series.yAxis,
+			reversedXAxis = xAxis.reversed,
+			stackKey,
+			stackGroups = {},
+			columnIndex,
+			columnCount = 0;
+
+		// Get the total number of column type series.
+		// This is called on every series. Consider moving this logic to a
+		// chart.orderStacks() function and call it on init, addSeries and removeSeries
+		if (options.grouping === false) {
+			columnCount = 1;
+		} else {
+			each(series.chart.series, function (otherSeries) {
+				var otherOptions = otherSeries.options,
+					otherYAxis = otherSeries.yAxis;
+				if (otherSeries.type === series.type && otherSeries.visible &&
+						yAxis.len === otherYAxis.len && yAxis.pos === otherYAxis.pos) {  // #642, #2086
+					if (otherOptions.stacking) {
+						stackKey = otherSeries.stackKey;
+						if (stackGroups[stackKey] === UNDEFINED) {
+							stackGroups[stackKey] = columnCount++;
+						}
+						columnIndex = stackGroups[stackKey];
+					} else if (otherOptions.grouping !== false) { // #1162
+						columnIndex = columnCount++;
+					}
+					otherSeries.columnIndex = columnIndex;
+				}
+			});
+		}
+
+		var categoryWidth = mathMin(
+				mathAbs(xAxis.transA) * (xAxis.ordinalSlope || options.pointRange || xAxis.closestPointRange || xAxis.tickInterval || 1), // #2610
+				xAxis.len // #1535
+			),
+			groupPadding = categoryWidth * options.groupPadding,
+			groupWidth = categoryWidth - 2 * groupPadding,
+			pointOffsetWidth = groupWidth / columnCount,
+			optionPointWidth = options.pointWidth,
+			pointPadding = defined(optionPointWidth) ? (pointOffsetWidth - optionPointWidth) / 2 :
+				pointOffsetWidth * options.pointPadding,
+			pointWidth = pick(optionPointWidth, pointOffsetWidth - 2 * pointPadding), // exact point width, used in polar charts
+			colIndex = (reversedXAxis ? 
+				columnCount - (series.columnIndex || 0) : // #1251
+				series.columnIndex) || 0,
+			pointXOffset = pointPadding + (groupPadding + colIndex *
+				pointOffsetWidth - (categoryWidth / 2)) *
+				(reversedXAxis ? -1 : 1);
+
+		// Save it for reading in linked series (Error bars particularly)
+		return (series.columnMetrics = { 
+			width: pointWidth, 
+			offset: pointXOffset 
+		});
+			
+	},
+
+	/**
+	 * Translate each point to the plot area coordinate system and find shape positions
+	 */
+	translate: function () {
+		var series = this,
+			chart = series.chart,
+			options = series.options,
+			borderWidth = series.borderWidth = pick(
+				options.borderWidth, 
+				series.activePointCount > 0.5 * series.xAxis.len ? 0 : 1
+			),
+			yAxis = series.yAxis,
+			threshold = options.threshold,
+			translatedThreshold = series.translatedThreshold = yAxis.getThreshold(threshold),
+			minPointLength = pick(options.minPointLength, 5),
+			metrics = series.getColumnMetrics(),
+			pointWidth = metrics.width,
+			seriesBarW = series.barW = mathMax(pointWidth, 1 + 2 * borderWidth), // postprocessed for border width
+			pointXOffset = series.pointXOffset = metrics.offset,
+			xCrisp = -(borderWidth % 2 ? 0.5 : 0),
+			yCrisp = borderWidth % 2 ? 0.5 : 1;
+
+		if (chart.renderer.isVML && chart.inverted) {
+			yCrisp += 1;
+		}
+
+		// When the pointPadding is 0, we want the columns to be packed tightly, so we allow individual
+		// columns to have individual sizes. When pointPadding is greater, we strive for equal-width
+		// columns (#2694).
+		if (options.pointPadding) {
+			seriesBarW = mathCeil(seriesBarW);
+		}
+
+		Series.prototype.translate.apply(series);
+
+		// Record the new values
+		each(series.points, function (point) {
+			var yBottom = pick(point.yBottom, translatedThreshold),
+				plotY = mathMin(mathMax(-999 - yBottom, point.plotY), yAxis.len + 999 + yBottom), // Don't draw too far outside plot area (#1303, #2241)
+				barX = point.plotX + pointXOffset,
+				barW = seriesBarW,
+				barY = mathMin(plotY, yBottom),
+				right,
+				bottom,
+				fromTop,
+				barH = mathMax(plotY, yBottom) - barY;
+
+			// Handle options.minPointLength
+			if (mathAbs(barH) < minPointLength) {
+				if (minPointLength) {
+					barH = minPointLength;
+					barY =
+						mathRound(mathAbs(barY - translatedThreshold) > minPointLength ? // stacked
+							yBottom - minPointLength : // keep position
+							translatedThreshold - (yAxis.translate(point.y, 0, 1, 0, 1) <= translatedThreshold ? minPointLength : 0)); // use exact yAxis.translation (#1485)
+				}
+			}
+
+			// Cache for access in polar
+			point.barX = barX;
+			point.pointWidth = pointWidth;
+
+			// Fix the tooltip on center of grouped columns (#1216)
+			point.tooltipPos = chart.inverted ? [yAxis.len - plotY, series.xAxis.len - barX - barW / 2] : [barX + barW / 2, plotY];
+
+			// Round off to obtain crisp edges and avoid overlapping with neighbours (#2694)
+			right = mathRound(barX + barW) + xCrisp;
+			barX = mathRound(barX) + xCrisp;
+			barW = right - barX;
+
+			fromTop = mathAbs(barY) < 0.5;
+			bottom = mathRound(barY + barH) + yCrisp;
+			barY = mathRound(barY) + yCrisp;
+			barH = bottom - barY;
+
+			// Top edges are exceptions
+			if (fromTop) {
+				barY -= 1;
+				barH += 1;
+			}
+
+			// Register shape type and arguments to be used in drawPoints
+			point.shapeType = 'rect';
+			point.shapeArgs = {
+				x: barX,
+				y: barY,
+				width: barW,
+				height: barH
+			};
+
+		});
+
+	},
+
+	getSymbol: noop,
+	
+	/**
+	 * Use a solid rectangle like the area series types
+	 */
+	drawLegendSymbol: LegendSymbolMixin.drawRectangle,
+	
+	
+	/**
+	 * Columns have no graph
+	 */
+	drawGraph: noop,
+
+	/**
+	 * Draw the columns. For bars, the series.group is rotated, so the same coordinates
+	 * apply for columns and bars. This method is inherited by scatter series.
+	 *
+	 */
+	drawPoints: function () {
+		var series = this,
+			chart = this.chart,
+			options = series.options,
+			renderer = chart.renderer,
+			animationLimit = options.animationLimit || 250,
+			shapeArgs,
+			pointAttr;
+
+		// draw the columns
+		each(series.points, function (point) {
+			var plotY = point.plotY,
+				graphic = point.graphic,
+				borderAttr;
+
+			if (plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {
+				shapeArgs = point.shapeArgs;
+
+				borderAttr = defined(series.borderWidth) ? {
+					'stroke-width': series.borderWidth
+				} : {};
+
+				pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE] || series.pointAttr[NORMAL_STATE];
+				
+				if (graphic) { // update
+					stop(graphic);
+					graphic.attr(borderAttr)[chart.pointCount < animationLimit ? 'animate' : 'attr'](merge(shapeArgs));
+
+				} else {
+					point.graphic = graphic = renderer[point.shapeType](shapeArgs)
+						.attr(pointAttr)
+						.attr(borderAttr)
+						.add(series.group)
+						.shadow(options.shadow, null, options.stacking && !options.borderRadius);
+				}
+
+			} else if (graphic) {
+				point.graphic = graphic.destroy(); // #1269
+			}
+		});
+	},
+
+	/**
+	 * Animate the column heights one by one from zero
+	 * @param {Boolean} init Whether to initialize the animation or run it
+	 */
+	animate: function (init) {
+		var series = this,
+			yAxis = this.yAxis,
+			options = series.options,
+			inverted = this.chart.inverted,
+			attr = {},
+			translatedThreshold;
+
+		if (hasSVG) { // VML is too slow anyway
+			if (init) {
+				attr.scaleY = 0.001;
+				translatedThreshold = mathMin(yAxis.pos + yAxis.len, mathMax(yAxis.pos, yAxis.toPixels(options.threshold)));
+				if (inverted) {
+					attr.translateX = translatedThreshold - yAxis.len;
+				} else {
+					attr.translateY = translatedThreshold;
+				}
+				series.group.attr(attr);
+
+			} else { // run the animation
+				
+				attr.scaleY = 1;
+				attr[inverted ? 'translateX' : 'translateY'] = yAxis.pos;
+				series.group.animate(attr, series.options.animation);
+
+				// delete this function to allow it only once
+				series.animate = null;
+			}
+		}
+	},
+	
+	/**
+	 * Remove this series from the chart
+	 */
+	remove: function () {
+		var series = this,
+			chart = series.chart;
+
+		// column and bar series affects other series of the same type
+		// as they are either stacked or grouped
+		if (chart.hasRendered) {
+			each(chart.series, function (otherSeries) {
+				if (otherSeries.type === series.type) {
+					otherSeries.isDirty = true;
+				}
+			});
+		}
+
+		Series.prototype.remove.apply(series, arguments);
+	}
+});
+seriesTypes.column = ColumnSeries;
+/**
+ * Set the default options for bar
+ */
+defaultPlotOptions.bar = merge(defaultPlotOptions.column);
+/**
+ * The Bar series class
+ */
+var BarSeries = extendClass(ColumnSeries, {
+	type: 'bar',
+	inverted: true
+});
+seriesTypes.bar = BarSeries;
+
+/**
+ * Set the default options for scatter
+ */
+defaultPlotOptions.scatter = merge(defaultSeriesOptions, {
+	lineWidth: 0,
+	tooltip: {
+		headerFormat: '<span style="color:{series.color}">\u25CF</span> <span style="font-size: 10px;"> {series.name}</span><br/>',
+		pointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>'
+	},
+	stickyTracking: false
+});
+
+/**
+ * The scatter series class
+ */
+var ScatterSeries = extendClass(Series, {
+	type: 'scatter',
+	sorted: false,
+	requireSorting: false,
+	noSharedTooltip: true,
+	trackerGroups: ['markerGroup', 'dataLabelsGroup'],
+	takeOrdinalPosition: false, // #2342
+	singularTooltips: true,
+	drawGraph: function () {
+		if (this.options.lineWidth) {
+			Series.prototype.drawGraph.call(this);
+		}
+	}
+});
+
+seriesTypes.scatter = ScatterSeries;
+
+/**
+ * Set the default options for pie
+ */
+defaultPlotOptions.pie = merge(defaultSeriesOptions, {
+	borderColor: '#FFFFFF',
+	borderWidth: 1,
+	center: [null, null],
+	clip: false,
+	colorByPoint: true, // always true for pies
+	dataLabels: {
+		// align: null,
+		// connectorWidth: 1,
+		// connectorColor: point.color,
+		// connectorPadding: 5,
+		distance: 30,
+		enabled: true,
+		formatter: function () { // #2945
+			return this.point.name;
+		}
+		// softConnector: true,
+		//y: 0
+	},
+	ignoreHiddenPoint: true,
+	//innerSize: 0,
+	legendType: 'point',
+	marker: null, // point options are specified in the base options
+	size: null,
+	showInLegend: false,
+	slicedOffset: 10,
+	states: {
+		hover: {
+			brightness: 0.1,
+			shadow: false
+		}
+	},
+	stickyTracking: false,
+	tooltip: {
+		followPointer: true
+	}
+});
+
+/**
+ * Extended point object for pies
+ */
+var PiePoint = extendClass(Point, {
+	/**
+	 * Initiate the pie slice
+	 */
+	init: function () {
+
+		Point.prototype.init.apply(this, arguments);
+
+		var point = this,
+			toggleSlice;
+
+		// Disallow negative values (#1530)
+		if (point.y < 0) {
+			point.y = null;
+		}
+
+		//visible: options.visible !== false,
+		extend(point, {
+			visible: point.visible !== false,
+			name: pick(point.name, 'Slice')
+		});
+
+		// add event listener for select
+		toggleSlice = function (e) {
+			point.slice(e.type === 'select');
+		};
+		addEvent(point, 'select', toggleSlice);
+		addEvent(point, 'unselect', toggleSlice);
+
+		return point;
+	},
+
+	/**
+	 * Toggle the visibility of the pie slice
+	 * @param {Boolean} vis Whether to show the slice or not. If undefined, the
+	 *    visibility is toggled
+	 */
+	setVisible: function (vis) {
+		var point = this,
+			series = point.series,
+			chart = series.chart;
+
+		// if called without an argument, toggle visibility
+		point.visible = point.options.visible = vis = vis === UNDEFINED ? !point.visible : vis;
+		series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data
+
+		// Show and hide associated elements
+		each(['graphic', 'dataLabel', 'connector', 'shadowGroup'], function (key) {
+			if (point[key]) {
+				point[key][vis ? 'show' : 'hide'](true);
+			}
+		});
+
+		if (point.legendItem) {
+			chart.legend.colorizeItem(point, vis);
+		}
+		
+		// Handle ignore hidden slices
+		if (!series.isDirty && series.options.ignoreHiddenPoint) {
+			series.isDirty = true;
+			chart.redraw();
+		}
+	},
+
+	/**
+	 * Set or toggle whether the slice is cut out from the pie
+	 * @param {Boolean} sliced When undefined, the slice state is toggled
+	 * @param {Boolean} redraw Whether to redraw the chart. True by default.
+	 */
+	slice: function (sliced, redraw, animation) {
+		var point = this,
+			series = point.series,
+			chart = series.chart,
+			translation;
+
+		setAnimation(animation, chart);
+
+		// redraw is true by default
+		redraw = pick(redraw, true);
+
+		// if called without an argument, toggle
+		point.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;
+		series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data
+
+		translation = sliced ? point.slicedTranslation : {
+			translateX: 0,
+			translateY: 0
+		};
+
+		point.graphic.animate(translation);
+		
+		if (point.shadowGroup) {
+			point.shadowGroup.animate(translation);
+		}
+
+	},
+
+	haloPath: function (size) {
+		var shapeArgs = this.shapeArgs,
+			chart = this.series.chart;
+
+		return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(chart.plotLeft + shapeArgs.x, chart.plotTop + shapeArgs.y, shapeArgs.r + size, shapeArgs.r + size, {
+			innerR: this.shapeArgs.r,
+			start: shapeArgs.start,
+			end: shapeArgs.end
+		});
+	}
+});
+
+/**
+ * The Pie series class
+ */
+var PieSeries = {
+	type: 'pie',
+	isCartesian: false,
+	pointClass: PiePoint,
+	requireSorting: false,
+	noSharedTooltip: true,
+	trackerGroups: ['group', 'dataLabelsGroup'],
+	axisTypes: [],
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		stroke: 'borderColor',
+		'stroke-width': 'borderWidth',
+		fill: 'color'
+	},
+	singularTooltips: true,
+
+	/**
+	 * Pies have one color each point
+	 */
+	getColor: noop,
+
+	/**
+	 * Animate the pies in
+	 */
+	animate: function (init) {
+		var series = this,
+			points = series.points,
+			startAngleRad = series.startAngleRad;
+
+		if (!init) {
+			each(points, function (point) {
+				var graphic = point.graphic,
+					args = point.shapeArgs;
+
+				if (graphic) {
+					// start values
+					graphic.attr({
+						r: series.center[3] / 2, // animate from inner radius (#779)
+						start: startAngleRad,
+						end: startAngleRad
+					});
+
+					// animate
+					graphic.animate({
+						r: args.r,
+						start: args.start,
+						end: args.end
+					}, series.options.animation);
+				}
+			});
+
+			// delete this function to allow it only once
+			series.animate = null;
+		}
+	},
+
+	/**
+	 * Extend the basic setData method by running processData and generatePoints immediately,
+	 * in order to access the points from the legend.
+	 */
+	setData: function (data, redraw, animation, updatePoints) {
+		Series.prototype.setData.call(this, data, false, animation, updatePoints);
+		this.processData();
+		this.generatePoints();
+		if (pick(redraw, true)) {
+			this.chart.redraw(animation);
+		} 
+	},
+
+	/**
+	 * Extend the generatePoints method by adding total and percentage properties to each point
+	 */
+	generatePoints: function () {
+		var i,
+			total = 0,
+			points,
+			len,
+			point,
+			ignoreHiddenPoint = this.options.ignoreHiddenPoint;
+
+		Series.prototype.generatePoints.call(this);
+
+		// Populate local vars
+		points = this.points;
+		len = points.length;
+		
+		// Get the total sum
+		for (i = 0; i < len; i++) {
+			point = points[i];
+			total += (ignoreHiddenPoint && !point.visible) ? 0 : point.y;
+		}
+		this.total = total;
+
+		// Set each point's properties
+		for (i = 0; i < len; i++) {
+			point = points[i];
+			point.percentage = total > 0 ? (point.y / total) * 100 : 0;
+			point.total = total;
+		}
+		
+	},
+	
+	/**
+	 * Do translation for pie slices
+	 */
+	translate: function (positions) {
+		this.generatePoints();
+		
+		var series = this,
+			cumulative = 0,
+			precision = 1000, // issue #172
+			options = series.options,
+			slicedOffset = options.slicedOffset,
+			connectorOffset = slicedOffset + options.borderWidth,
+			start,
+			end,
+			angle,
+			startAngle = options.startAngle || 0,
+			startAngleRad = series.startAngleRad = mathPI / 180 * (startAngle - 90),
+			endAngleRad = series.endAngleRad = mathPI / 180 * ((pick(options.endAngle, startAngle + 360)) - 90),
+			circ = endAngleRad - startAngleRad, //2 * mathPI,
+			points = series.points,
+			radiusX, // the x component of the radius vector for a given point
+			radiusY,
+			labelDistance = options.dataLabels.distance,
+			ignoreHiddenPoint = options.ignoreHiddenPoint,
+			i,
+			len = points.length,
+			point;
+
+		// Get positions - either an integer or a percentage string must be given.
+		// If positions are passed as a parameter, we're in a recursive loop for adjusting
+		// space for data labels.
+		if (!positions) {
+			series.center = positions = series.getCenter();
+		}
+
+		// utility for getting the x value from a given y, used for anticollision logic in data labels
+		series.getX = function (y, left) {
+
+			angle = math.asin(mathMin((y - positions[1]) / (positions[2] / 2 + labelDistance), 1));
+
+			return positions[0] +
+				(left ? -1 : 1) *
+				(mathCos(angle) * (positions[2] / 2 + labelDistance));
+		};
+
+		// Calculate the geometry for each point
+		for (i = 0; i < len; i++) {
+			
+			point = points[i];
+			
+			// set start and end angle
+			start = startAngleRad + (cumulative * circ);
+			if (!ignoreHiddenPoint || point.visible) {
+				cumulative += point.percentage / 100;
+			}
+			end = startAngleRad + (cumulative * circ);
+
+			// set the shape
+			point.shapeType = 'arc';
+			point.shapeArgs = {
+				x: positions[0],
+				y: positions[1],
+				r: positions[2] / 2,
+				innerR: positions[3] / 2,
+				start: mathRound(start * precision) / precision,
+				end: mathRound(end * precision) / precision
+			};
+
+			// The angle must stay within -90 and 270 (#2645)
+			angle = (end + start) / 2;
+			if (angle > 1.5 * mathPI) {
+				angle -= 2 * mathPI;
+			} else if (angle < -mathPI / 2) {
+				angle += 2 * mathPI;
+			}
+
+			// Center for the sliced out slice
+			point.slicedTranslation = {
+				translateX: mathRound(mathCos(angle) * slicedOffset),
+				translateY: mathRound(mathSin(angle) * slicedOffset)
+			};
+
+			// set the anchor point for tooltips
+			radiusX = mathCos(angle) * positions[2] / 2;
+			radiusY = mathSin(angle) * positions[2] / 2;
+			point.tooltipPos = [
+				positions[0] + radiusX * 0.7,
+				positions[1] + radiusY * 0.7
+			];
+			
+			point.half = angle < -mathPI / 2 || angle > mathPI / 2 ? 1 : 0;
+			point.angle = angle;
+
+			// set the anchor point for data labels
+			connectorOffset = mathMin(connectorOffset, labelDistance / 2); // #1678
+			point.labelPos = [
+				positions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector
+				positions[1] + radiusY + mathSin(angle) * labelDistance, // a/a
+				positions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie
+				positions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a
+				positions[0] + radiusX, // landing point for connector
+				positions[1] + radiusY, // a/a
+				labelDistance < 0 ? // alignment
+					'center' :
+					point.half ? 'right' : 'left', // alignment
+				angle // center angle
+			];
+
+		}
+	},
+	
+	drawGraph: null,
+
+	/**
+	 * Draw the data points
+	 */
+	drawPoints: function () {
+		var series = this,
+			chart = series.chart,
+			renderer = chart.renderer,
+			groupTranslation,
+			//center,
+			graphic,
+			//group,
+			shadow = series.options.shadow,
+			shadowGroup,
+			shapeArgs;
+
+		if (shadow && !series.shadowGroup) {
+			series.shadowGroup = renderer.g('shadow')
+				.add(series.group);
+		}
+
+		// draw the slices
+		each(series.points, function (point) {
+			graphic = point.graphic;
+			shapeArgs = point.shapeArgs;
+			shadowGroup = point.shadowGroup;
+
+			// put the shadow behind all points
+			if (shadow && !shadowGroup) {
+				shadowGroup = point.shadowGroup = renderer.g('shadow')
+					.add(series.shadowGroup);
+			}
+
+			// if the point is sliced, use special translation, else use plot area traslation
+			groupTranslation = point.sliced ? point.slicedTranslation : {
+				translateX: 0,
+				translateY: 0
+			};
+
+			//group.translate(groupTranslation[0], groupTranslation[1]);
+			if (shadowGroup) {
+				shadowGroup.attr(groupTranslation);
+			}
+
+			// draw the slice
+			if (graphic) {
+				graphic.animate(extend(shapeArgs, groupTranslation));
+			} else {
+				point.graphic = graphic = renderer[point.shapeType](shapeArgs)
+					.setRadialReference(series.center)
+					.attr(
+						point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]
+					)
+					.attr({ 
+						'stroke-linejoin': 'round'
+						//zIndex: 1 // #2722 (reversed)
+					})
+					.attr(groupTranslation)
+					.add(series.group)
+					.shadow(shadow, shadowGroup);	
+			}
+
+			// detect point specific visibility (#2430)
+			if (point.visible !== undefined) {
+				point.setVisible(point.visible);
+			}
+
+		});
+
+	},
+
+	/**
+	 * Utility for sorting data labels
+	 */
+	sortByAngle: function (points, sign) {
+		points.sort(function (a, b) {
+			return a.angle !== undefined && (b.angle - a.angle) * sign;
+		});
+	},		
+
+	/**
+	 * Use a simple symbol from LegendSymbolMixin
+	 */
+	drawLegendSymbol: LegendSymbolMixin.drawRectangle,
+
+	/**
+	 * Use the getCenter method from drawLegendSymbol
+	 */
+	getCenter: CenteredSeriesMixin.getCenter,
+
+	/**
+	 * Pies don't have point marker symbols
+	 */
+	getSymbol: noop
+
+};
+PieSeries = extendClass(Series, PieSeries);
+seriesTypes.pie = PieSeries;
+
+/**
+ * Draw the data labels
+ */
+Series.prototype.drawDataLabels = function () {
+
+	var series = this,
+		seriesOptions = series.options,
+		cursor = seriesOptions.cursor,
+		options = seriesOptions.dataLabels,
+		points = series.points,
+		pointOptions,
+		generalOptions,
+		str,
+		dataLabelsGroup;
+
+	if (options.enabled || series._hasPointLabels) {
+
+		// Process default alignment of data labels for columns
+		if (series.dlProcessOptions) {
+			series.dlProcessOptions(options);
+		}
+
+		// Create a separate group for the data labels to avoid rotation
+		dataLabelsGroup = series.plotGroup(
+			'dataLabelsGroup',
+			'data-labels',
+			options.defer ? HIDDEN : VISIBLE,
+			options.zIndex || 6
+		);
+
+		if (!series.hasRendered && pick(options.defer, true)) {
+			dataLabelsGroup.attr({ opacity: 0 });
+			addEvent(series, 'afterAnimate', function () {
+				if (series.visible) { // #3023, #3024
+					dataLabelsGroup.show();
+				}
+				dataLabelsGroup[seriesOptions.animation ? 'animate' : 'attr']({ opacity: 1 }, { duration: 200 });
+			});
+		}
+
+		// Make the labels for each point
+		generalOptions = options;
+		each(points, function (point) {
+
+			var enabled,
+				dataLabel = point.dataLabel,
+				labelConfig,
+				attr,
+				name,
+				rotation,
+				connector = point.connector,
+				isNew = true;
+
+			// Determine if each data label is enabled
+			pointOptions = point.options && point.options.dataLabels;
+			enabled = pick(pointOptions && pointOptions.enabled, generalOptions.enabled); // #2282
+
+
+			// If the point is outside the plot area, destroy it. #678, #820
+			if (dataLabel && !enabled) {
+				point.dataLabel = dataLabel.destroy();
+
+			// Individual labels are disabled if the are explicitly disabled
+			// in the point options, or if they fall outside the plot area.
+			} else if (enabled) {
+
+				// Create individual options structure that can be extended without
+				// affecting others
+				options = merge(generalOptions, pointOptions);
+
+				rotation = options.rotation;
+
+				// Get the string
+				labelConfig = point.getLabelConfig();
+				str = options.format ?
+					format(options.format, labelConfig) :
+					options.formatter.call(labelConfig, options);
+
+				// Determine the color
+				options.style.color = pick(options.color, options.style.color, series.color, 'black');
+
+
+				// update existing label
+				if (dataLabel) {
+
+					if (defined(str)) {
+						dataLabel
+							.attr({
+								text: str
+							});
+						isNew = false;
+
+					} else { // #1437 - the label is shown conditionally
+						point.dataLabel = dataLabel = dataLabel.destroy();
+						if (connector) {
+							point.connector = connector.destroy();
+						}
+					}
+
+				// create new label
+				} else if (defined(str)) {
+					attr = {
+						//align: align,
+						fill: options.backgroundColor,
+						stroke: options.borderColor,
+						'stroke-width': options.borderWidth,
+						r: options.borderRadius || 0,
+						rotation: rotation,
+						padding: options.padding,
+						zIndex: 1
+					};
+					// Remove unused attributes (#947)
+					for (name in attr) {
+						if (attr[name] === UNDEFINED) {
+							delete attr[name];
+						}
+					}
+
+					dataLabel = point.dataLabel = series.chart.renderer[rotation ? 'text' : 'label']( // labels don't support rotation
+						str,
+						0,
+						-999,
+						null,
+						null,
+						null,
+						options.useHTML
+					)
+					.attr(attr)
+					.css(extend(options.style, cursor && { cursor: cursor }))
+					.add(dataLabelsGroup)
+					.shadow(options.shadow);
+
+				}
+
+				if (dataLabel) {
+					// Now the data label is created and placed at 0,0, so we need to align it
+					series.alignDataLabel(point, dataLabel, options, null, isNew);
+				}
+			}
+		});
+	}
+};
+
+/**
+ * Align each individual data label
+ */
+Series.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {
+	var chart = this.chart,
+		inverted = chart.inverted,
+		plotX = pick(point.plotX, -999),
+		plotY = pick(point.plotY, -999),
+		bBox = dataLabel.getBBox(),
+		// Math.round for rounding errors (#2683), alignTo to allow column labels (#2700)
+		visible = this.visible && (point.series.forceDL || chart.isInsidePlot(plotX, mathRound(plotY), inverted) ||
+			(alignTo && chart.isInsidePlot(plotX, inverted ? alignTo.x + 1 : alignTo.y + alignTo.height - 1, inverted))),
+		alignAttr; // the final position;
+
+	if (visible) {
+
+		// The alignment box is a singular point
+		alignTo = extend({
+			x: inverted ? chart.plotWidth - plotY : plotX,
+			y: mathRound(inverted ? chart.plotHeight - plotX : plotY),
+			width: 0,
+			height: 0
+		}, alignTo);
+
+		// Add the text size for alignment calculation
+		extend(options, {
+			width: bBox.width,
+			height: bBox.height
+		});
+
+		// Allow a hook for changing alignment in the last moment, then do the alignment
+		if (options.rotation) { // Fancy box alignment isn't supported for rotated text
+			dataLabel[isNew ? 'attr' : 'animate']({
+					x: alignTo.x + options.x + alignTo.width / 2,
+					y: alignTo.y + options.y + alignTo.height / 2
+				})
+				.attr({ // #3003
+					align: options.align
+				});
+		} else {
+			dataLabel.align(options, null, alignTo);
+			alignAttr = dataLabel.alignAttr;
+
+			// Handle justify or crop
+			if (pick(options.overflow, 'justify') === 'justify') {
+				this.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);
+
+			} else if (pick(options.crop, true)) {
+				// Now check that the data label is within the plot area
+				visible = chart.isInsidePlot(alignAttr.x, alignAttr.y) && chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);
+
+			}
+		}
+	}
+
+	// Show or hide based on the final aligned position
+	if (!visible) {
+		dataLabel.attr({ y: -999 });
+		dataLabel.placed = false; // don't animate back in
+	}
+
+};
+
+/**
+ * If data labels fall partly outside the plot area, align them back in, in a way that
+ * doesn't hide the point.
+ */
+Series.prototype.justifyDataLabel = function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {
+	var chart = this.chart,
+		align = options.align,
+		verticalAlign = options.verticalAlign,
+		off,
+		justified;
+
+	// Off left
+	off = alignAttr.x;
+	if (off < 0) {
+		if (align === 'right') {
+			options.align = 'left';
+		} else {
+			options.x = -off;
+		}
+		justified = true;
+	}
+
+	// Off right
+	off = alignAttr.x + bBox.width;
+	if (off > chart.plotWidth) {
+		if (align === 'left') {
+			options.align = 'right';
+		} else {
+			options.x = chart.plotWidth - off;
+		}
+		justified = true;
+	}
+
+	// Off top
+	off = alignAttr.y;
+	if (off < 0) {
+		if (verticalAlign === 'bottom') {
+			options.verticalAlign = 'top';
+		} else {
+			options.y = -off;
+		}
+		justified = true;
+	}
+
+	// Off bottom
+	off = alignAttr.y + bBox.height;
+	if (off > chart.plotHeight) {
+		if (verticalAlign === 'top') {
+			options.verticalAlign = 'bottom';
+		} else {
+			options.y = chart.plotHeight - off;
+		}
+		justified = true;
+	}
+
+	if (justified) {
+		dataLabel.placed = !isNew;
+		dataLabel.align(options, null, alignTo);
+	}
+};
+
+/**
+ * Override the base drawDataLabels method by pie specific functionality
+ */
+if (seriesTypes.pie) {
+	seriesTypes.pie.prototype.drawDataLabels = function () {
+		var series = this,
+			data = series.data,
+			point,
+			chart = series.chart,
+			options = series.options.dataLabels,
+			connectorPadding = pick(options.connectorPadding, 10),
+			connectorWidth = pick(options.connectorWidth, 1),
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			connector,
+			connectorPath,
+			softConnector = pick(options.softConnector, true),
+			distanceOption = options.distance,
+			seriesCenter = series.center,
+			radius = seriesCenter[2] / 2,
+			centerY = seriesCenter[1],
+			outside = distanceOption > 0,
+			dataLabel,
+			dataLabelWidth,
+			labelPos,
+			labelHeight,
+			halves = [// divide the points into right and left halves for anti collision
+				[], // right
+				[]  // left
+			],
+			x,
+			y,
+			visibility,
+			rankArr,
+			i,
+			j,
+			overflow = [0, 0, 0, 0], // top, right, bottom, left
+			sort = function (a, b) {
+				return b.y - a.y;
+			};
+
+		// get out if not enabled
+		if (!series.visible || (!options.enabled && !series._hasPointLabels)) {
+			return;
+		}
+
+		// run parent method
+		Series.prototype.drawDataLabels.apply(series);
+
+		// arrange points for detection collision
+		each(data, function (point) {
+			if (point.dataLabel && point.visible) { // #407, #2510
+				halves[point.half].push(point);
+			}
+		});
+
+		/* Loop over the points in each half, starting from the top and bottom
+		 * of the pie to detect overlapping labels.
+		 */
+		i = 2;
+		while (i--) {
+
+			var slots = [],
+				slotsLength,
+				usedSlots = [],
+				points = halves[i],
+				pos,
+				bottom,
+				length = points.length,
+				slotIndex;
+
+			if (!length) {
+				continue;
+			}
+
+			// Sort by angle
+			series.sortByAngle(points, i - 0.5);
+
+			// Assume equal label heights on either hemisphere (#2630)
+			j = labelHeight = 0;
+			while (!labelHeight && points[j]) { // #1569
+				labelHeight = points[j] && points[j].dataLabel && (points[j].dataLabel.getBBox().height || 21); // 21 is for #968
+				j++;
+			}
+
+			// Only do anti-collision when we are outside the pie and have connectors (#856)
+			if (distanceOption > 0) {
+
+				// Build the slots
+				bottom = mathMin(centerY + radius + distanceOption, chart.plotHeight);
+				for (pos = mathMax(0, centerY - radius - distanceOption); pos <= bottom; pos += labelHeight) {
+					slots.push(pos);
+				}
+				slotsLength = slots.length;
+
+
+				/* Visualize the slots
+				if (!series.slotElements) {
+					series.slotElements = [];
+				}
+				if (i === 1) {
+					series.slotElements.forEach(function (elem) {
+						elem.destroy();
+					});
+					series.slotElements.length = 0;
+				}
+					
+				slots.forEach(function (pos, no) {
+					var slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0),
+						slotY = pos + chart.plotTop;
+					
+					if (!isNaN(slotX)) {
+						series.slotElements.push(chart.renderer.rect(slotX, slotY - 7, 100, labelHeight, 1)
+							.attr({
+								'stroke-width': 1,
+								stroke: 'silver',
+								fill: 'rgba(0,0,255,0.1)'
+							})
+							.add());
+						series.slotElements.push(chart.renderer.text('Slot '+ no, slotX, slotY + 4)
+							.attr({
+								fill: 'silver'
+							}).add());
+					}
+				});
+				// */
+
+				// if there are more values than available slots, remove lowest values
+				if (length > slotsLength) {
+					// create an array for sorting and ranking the points within each quarter
+					rankArr = [].concat(points);
+					rankArr.sort(sort);
+					j = length;
+					while (j--) {
+						rankArr[j].rank = j;
+					}
+					j = length;
+					while (j--) {
+						if (points[j].rank >= slotsLength) {
+							points.splice(j, 1);
+						}
+					}
+					length = points.length;
+				}
+
+				// The label goes to the nearest open slot, but not closer to the edge than
+				// the label's index.
+				for (j = 0; j < length; j++) {
+
+					point = points[j];
+					labelPos = point.labelPos;
+
+					var closest = 9999,
+						distance,
+						slotI;
+
+					// find the closest slot index
+					for (slotI = 0; slotI < slotsLength; slotI++) {
+						distance = mathAbs(slots[slotI] - labelPos[1]);
+						if (distance < closest) {
+							closest = distance;
+							slotIndex = slotI;
+						}
+					}
+
+					// if that slot index is closer to the edges of the slots, move it
+					// to the closest appropriate slot
+					if (slotIndex < j && slots[j] !== null) { // cluster at the top
+						slotIndex = j;
+					} else if (slotsLength  < length - j + slotIndex && slots[j] !== null) { // cluster at the bottom
+						slotIndex = slotsLength - length + j;
+						while (slots[slotIndex] === null) { // make sure it is not taken
+							slotIndex++;
+						}
+					} else {
+						// Slot is taken, find next free slot below. In the next run, the next slice will find the
+						// slot above these, because it is the closest one
+						while (slots[slotIndex] === null) { // make sure it is not taken
+							slotIndex++;
+						}
+					}
+
+					usedSlots.push({ i: slotIndex, y: slots[slotIndex] });
+					slots[slotIndex] = null; // mark as taken
+				}
+				// sort them in order to fill in from the top
+				usedSlots.sort(sort);
+			}
+
+			// now the used slots are sorted, fill them up sequentially
+			for (j = 0; j < length; j++) {
+
+				var slot, naturalY;
+
+				point = points[j];
+				labelPos = point.labelPos;
+				dataLabel = point.dataLabel;
+				visibility = point.visible === false ? HIDDEN : VISIBLE;
+				naturalY = labelPos[1];
+
+				if (distanceOption > 0) {
+					slot = usedSlots.pop();
+					slotIndex = slot.i;
+
+					// if the slot next to currrent slot is free, the y value is allowed
+					// to fall back to the natural position
+					y = slot.y;
+					if ((naturalY > y && slots[slotIndex + 1] !== null) ||
+							(naturalY < y &&  slots[slotIndex - 1] !== null)) {
+						y = mathMin(mathMax(0, naturalY), chart.plotHeight);
+					}
+
+				} else {
+					y = naturalY;
+				}
+
+				// get the x - use the natural x position for first and last slot, to prevent the top
+				// and botton slice connectors from touching each other on either side
+				x = options.justify ?
+					seriesCenter[0] + (i ? -1 : 1) * (radius + distanceOption) :
+					series.getX(y === centerY - radius - distanceOption || y === centerY + radius + distanceOption ? naturalY : y, i);
+
+
+				// Record the placement and visibility
+				dataLabel._attr = {
+					visibility: visibility,
+					align: labelPos[6]
+				};
+				dataLabel._pos = {
+					x: x + options.x +
+						({ left: connectorPadding, right: -connectorPadding }[labelPos[6]] || 0),
+					y: y + options.y - 10 // 10 is for the baseline (label vs text)
+				};
+				dataLabel.connX = x;
+				dataLabel.connY = y;
+
+
+				// Detect overflowing data labels
+				if (this.options.size === null) {
+					dataLabelWidth = dataLabel.width;
+					// Overflow left
+					if (x - dataLabelWidth < connectorPadding) {
+						overflow[3] = mathMax(mathRound(dataLabelWidth - x + connectorPadding), overflow[3]);
+
+					// Overflow right
+					} else if (x + dataLabelWidth > plotWidth - connectorPadding) {
+						overflow[1] = mathMax(mathRound(x + dataLabelWidth - plotWidth + connectorPadding), overflow[1]);
+					}
+
+					// Overflow top
+					if (y - labelHeight / 2 < 0) {
+						overflow[0] = mathMax(mathRound(-y + labelHeight / 2), overflow[0]);
+
+					// Overflow left
+					} else if (y + labelHeight / 2 > plotHeight) {
+						overflow[2] = mathMax(mathRound(y + labelHeight / 2 - plotHeight), overflow[2]);
+					}
+				}
+			} // for each point
+		} // for each half
+
+		// Do not apply the final placement and draw the connectors until we have verified
+		// that labels are not spilling over.
+		if (arrayMax(overflow) === 0 || this.verifyDataLabelOverflow(overflow)) {
+
+			// Place the labels in the final position
+			this.placeDataLabels();
+
+			// Draw the connectors
+			if (outside && connectorWidth) {
+				each(this.points, function (point) {
+					connector = point.connector;
+					labelPos = point.labelPos;
+					dataLabel = point.dataLabel;
+
+					if (dataLabel && dataLabel._pos) {
+						visibility = dataLabel._attr.visibility;
+						x = dataLabel.connX;
+						y = dataLabel.connY;
+						connectorPath = softConnector ? [
+							M,
+							x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label
+							'C',
+							x, y, // first break, next to the label
+							2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],
+							labelPos[2], labelPos[3], // second break
+							L,
+							labelPos[4], labelPos[5] // base
+						] : [
+							M,
+							x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label
+							L,
+							labelPos[2], labelPos[3], // second break
+							L,
+							labelPos[4], labelPos[5] // base
+						];
+
+						if (connector) {
+							connector.animate({ d: connectorPath });
+							connector.attr('visibility', visibility);
+
+						} else {
+							point.connector = connector = series.chart.renderer.path(connectorPath).attr({
+								'stroke-width': connectorWidth,
+								stroke: options.connectorColor || point.color || '#606060',
+								visibility: visibility
+								//zIndex: 0 // #2722 (reversed)
+							})
+							.add(series.dataLabelsGroup);
+						}
+					} else if (connector) {
+						point.connector = connector.destroy();
+					}
+				});
+			}
+		}
+	};
+	/**
+	 * Perform the final placement of the data labels after we have verified that they
+	 * fall within the plot area.
+	 */
+	seriesTypes.pie.prototype.placeDataLabels = function () {
+		each(this.points, function (point) {
+			var dataLabel = point.dataLabel,
+				_pos;
+
+			if (dataLabel) {
+				_pos = dataLabel._pos;
+				if (_pos) {
+					dataLabel.attr(dataLabel._attr);
+					dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);
+					dataLabel.moved = true;
+				} else if (dataLabel) {
+					dataLabel.attr({ y: -999 });
+				}
+			}
+		});
+	};
+
+	seriesTypes.pie.prototype.alignDataLabel =  noop;
+
+	/**
+	 * Verify whether the data labels are allowed to draw, or we should run more translation and data
+	 * label positioning to keep them inside the plot area. Returns true when data labels are ready
+	 * to draw.
+	 */
+	seriesTypes.pie.prototype.verifyDataLabelOverflow = function (overflow) {
+
+		var center = this.center,
+			options = this.options,
+			centerOption = options.center,
+			minSize = options.minSize || 80,
+			newSize = minSize,
+			ret;
+
+		// Handle horizontal size and center
+		if (centerOption[0] !== null) { // Fixed center
+			newSize = mathMax(center[2] - mathMax(overflow[1], overflow[3]), minSize);
+
+		} else { // Auto center
+			newSize = mathMax(
+				center[2] - overflow[1] - overflow[3], // horizontal overflow
+				minSize
+			);
+			center[0] += (overflow[3] - overflow[1]) / 2; // horizontal center
+		}
+
+		// Handle vertical size and center
+		if (centerOption[1] !== null) { // Fixed center
+			newSize = mathMax(mathMin(newSize, center[2] - mathMax(overflow[0], overflow[2])), minSize);
+
+		} else { // Auto center
+			newSize = mathMax(
+				mathMin(
+					newSize,
+					center[2] - overflow[0] - overflow[2] // vertical overflow
+				),
+				minSize
+			);
+			center[1] += (overflow[0] - overflow[2]) / 2; // vertical center
+		}
+
+		// If the size must be decreased, we need to run translate and drawDataLabels again
+		if (newSize < center[2]) {
+			center[2] = newSize;
+			this.translate(center);
+			each(this.points, function (point) {
+				if (point.dataLabel) {
+					point.dataLabel._pos = null; // reset
+				}
+			});
+
+			if (this.drawDataLabels) {
+				this.drawDataLabels();
+			}
+		// Else, return true to indicate that the pie and its labels is within the plot area
+		} else {
+			ret = true;
+		}
+		return ret;
+	};
+}
+
+if (seriesTypes.column) {
+
+	/**
+	 * Override the basic data label alignment by adjusting for the position of the column
+	 */
+	seriesTypes.column.prototype.alignDataLabel = function (point, dataLabel, options,  alignTo, isNew) {
+		var chart = this.chart,
+			inverted = chart.inverted,
+			dlBox = point.dlBox || point.shapeArgs, // data label box for alignment
+			below = point.below || (point.plotY > pick(this.translatedThreshold, chart.plotSizeY)),
+			inside = pick(options.inside, !!this.options.stacking); // draw it inside the box?
+
+		// Align to the column itself, or the top of it
+		if (dlBox) { // Area range uses this method but not alignTo
+			alignTo = merge(dlBox);
+
+			if (inverted) {
+				alignTo = {
+					x: chart.plotWidth - alignTo.y - alignTo.height,
+					y: chart.plotHeight - alignTo.x - alignTo.width,
+					width: alignTo.height,
+					height: alignTo.width
+				};
+			}
+
+			// Compute the alignment box
+			if (!inside) {
+				if (inverted) {
+					alignTo.x += below ? 0 : alignTo.width;
+					alignTo.width = 0;
+				} else {
+					alignTo.y += below ? alignTo.height : 0;
+					alignTo.height = 0;
+				}
+			}
+		}
+
+
+		// When alignment is undefined (typically columns and bars), display the individual
+		// point below or above the point depending on the threshold
+		options.align = pick(
+			options.align,
+			!inverted || inside ? 'center' : below ? 'right' : 'left'
+		);
+		options.verticalAlign = pick(
+			options.verticalAlign,
+			inverted || inside ? 'middle' : below ? 'top' : 'bottom'
+		);
+
+		// Call the parent method
+		Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);
+	};
+}
+
+
+
+/**
+ * TrackerMixin for points and graphs
+ */
+
+var TrackerMixin = Highcharts.TrackerMixin = {
+
+	drawTrackerPoint: function () {
+		var series = this,
+			chart = series.chart,
+			pointer = chart.pointer,
+			cursor = series.options.cursor,
+			css = cursor && { cursor: cursor },
+			onMouseOver = function (e) {
+				var target = e.target,
+				point;
+
+				if (chart.hoverSeries !== series) {
+					series.onMouseOver();
+				}
+
+				while (target && !point) {
+					point = target.point;
+					target = target.parentNode;
+				}
+
+				if (point !== UNDEFINED && point !== chart.hoverPoint) { // undefined on graph in scatterchart
+					point.onMouseOver(e);
+				}
+			};
+
+		// Add reference to the point
+		each(series.points, function (point) {
+			if (point.graphic) {
+				point.graphic.element.point = point;
+			}
+			if (point.dataLabel) {
+				point.dataLabel.element.point = point;
+			}
+		});
+
+		// Add the event listeners, we need to do this only once
+		if (!series._hasTracking) {
+			each(series.trackerGroups, function (key) {
+				if (series[key]) { // we don't always have dataLabelsGroup
+					series[key]
+						.addClass(PREFIX + 'tracker')
+						.on('mouseover', onMouseOver)
+						.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })
+						.css(css);
+					if (hasTouch) {
+						series[key].on('touchstart', onMouseOver);
+					}
+				}
+			});
+			series._hasTracking = true;
+		}
+	},
+
+	/**
+	 * Draw the tracker object that sits above all data labels and markers to
+	 * track mouse events on the graph or points. For the line type charts
+	 * the tracker uses the same graphPath, but with a greater stroke width
+	 * for better control.
+	 */
+	drawTrackerGraph: function () {
+		var series = this,
+			options = series.options,
+			trackByArea = options.trackByArea,
+			trackerPath = [].concat(trackByArea ? series.areaPath : series.graphPath),
+			trackerPathLength = trackerPath.length,
+			chart = series.chart,
+			pointer = chart.pointer,
+			renderer = chart.renderer,
+			snap = chart.options.tooltip.snap,
+			tracker = series.tracker,
+			cursor = options.cursor,
+			css = cursor && { cursor: cursor },
+			singlePoints = series.singlePoints,
+			singlePoint,
+			i,
+			onMouseOver = function () {
+				if (chart.hoverSeries !== series) {
+					series.onMouseOver();
+				}
+			},
+			/*
+			 * Empirical lowest possible opacities for TRACKER_FILL for an element to stay invisible but clickable
+			 * IE6: 0.002
+			 * IE7: 0.002
+			 * IE8: 0.002
+			 * IE9: 0.00000000001 (unlimited)
+			 * IE10: 0.0001 (exporting only)
+			 * FF: 0.00000000001 (unlimited)
+			 * Chrome: 0.000001
+			 * Safari: 0.000001
+			 * Opera: 0.00000000001 (unlimited)
+			 */
+			TRACKER_FILL = 'rgba(192,192,192,' + (hasSVG ? 0.0001 : 0.002) + ')';
+
+		// Extend end points. A better way would be to use round linecaps,
+		// but those are not clickable in VML.
+		if (trackerPathLength && !trackByArea) {
+			i = trackerPathLength + 1;
+			while (i--) {
+				if (trackerPath[i] === M) { // extend left side
+					trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L);
+				}
+				if ((i && trackerPath[i] === M) || i === trackerPathLength) { // extend right side
+					trackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]);
+				}
+			}
+		}
+
+		// handle single points
+		for (i = 0; i < singlePoints.length; i++) {
+			singlePoint = singlePoints[i];
+			trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,
+			L, singlePoint.plotX + snap, singlePoint.plotY);
+		}
+
+		// draw the tracker
+		if (tracker) {
+			tracker.attr({ d: trackerPath });
+		} else { // create
+
+			series.tracker = renderer.path(trackerPath)
+			.attr({
+				'stroke-linejoin': 'round', // #1225
+				visibility: series.visible ? VISIBLE : HIDDEN,
+				stroke: TRACKER_FILL,
+				fill: trackByArea ? TRACKER_FILL : NONE,
+				'stroke-width' : options.lineWidth + (trackByArea ? 0 : 2 * snap),
+				zIndex: 2
+			})
+			.add(series.group);
+
+			// The tracker is added to the series group, which is clipped, but is covered
+			// by the marker group. So the marker group also needs to capture events.
+			each([series.tracker, series.markerGroup], function (tracker) {
+				tracker.addClass(PREFIX + 'tracker')
+					.on('mouseover', onMouseOver)
+					.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })
+					.css(css);
+
+				if (hasTouch) {
+					tracker.on('touchstart', onMouseOver);
+				}
+			});
+		}
+	}
+};
+/* End TrackerMixin */
+
+
+/**
+ * Add tracking event listener to the series group, so the point graphics
+ * themselves act as trackers
+ */ 
+
+if (seriesTypes.column) {
+	ColumnSeries.prototype.drawTracker = TrackerMixin.drawTrackerPoint;	
+}
+
+if (seriesTypes.pie) {
+	seriesTypes.pie.prototype.drawTracker = TrackerMixin.drawTrackerPoint;
+}
+
+if (seriesTypes.scatter) {
+	ScatterSeries.prototype.drawTracker = TrackerMixin.drawTrackerPoint;
+}
+
+/* 
+ * Extend Legend for item events 
+ */ 
+extend(Legend.prototype, {
+
+	setItemEvents: function (item, legendItem, useHTML, itemStyle, itemHiddenStyle) {
+	var legend = this;
+	// Set the events on the item group, or in case of useHTML, the item itself (#1249)
+	(useHTML ? legendItem : item.legendGroup).on('mouseover', function () {
+			item.setState(HOVER_STATE);
+			legendItem.css(legend.options.itemHoverStyle);
+		})
+		.on('mouseout', function () {
+			legendItem.css(item.visible ? itemStyle : itemHiddenStyle);
+			item.setState();
+		})
+		.on('click', function (event) {
+			var strLegendItemClick = 'legendItemClick',
+				fnLegendItemClick = function () {
+					item.setVisible();
+				};
+				
+			// Pass over the click/touch event. #4.
+			event = {
+				browserEvent: event
+			};
+
+			// click the name or symbol
+			if (item.firePointEvent) { // point
+				item.firePointEvent(strLegendItemClick, event, fnLegendItemClick);
+			} else {
+				fireEvent(item, strLegendItemClick, event, fnLegendItemClick);
+			}
+		});
+	},
+
+	createCheckboxForItem: function (item) {
+		var legend = this;
+
+		item.checkbox = createElement('input', {
+			type: 'checkbox',
+			checked: item.selected,
+			defaultChecked: item.selected // required by IE7
+		}, legend.options.itemCheckboxStyle, legend.chart.container);
+
+		addEvent(item.checkbox, 'click', function (event) {
+			var target = event.target;
+			fireEvent(item, 'checkboxClick', {
+					checked: target.checked
+				},
+				function () {
+					item.select();
+				}
+			);
+		});
+	}	
+});
+
+/* 
+ * Add pointer cursor to legend itemstyle in defaultOptions
+ */
+defaultOptions.legend.itemStyle.cursor = 'pointer';
+
+
+/* 
+ * Extend the Chart object with interaction
+ */
+
+extend(Chart.prototype, {
+	/**
+	 * Display the zoom button
+	 */
+	showResetZoom: function () {
+		var chart = this,
+			lang = defaultOptions.lang,
+			btnOptions = chart.options.chart.resetZoomButton,
+			theme = btnOptions.theme,
+			states = theme.states,
+			alignTo = btnOptions.relativeTo === 'chart' ? null : 'plotBox';
+			
+		this.resetZoomButton = chart.renderer.button(lang.resetZoom, null, null, function () { chart.zoomOut(); }, theme, states && states.hover)
+			.attr({
+				align: btnOptions.position.align,
+				title: lang.resetZoomTitle
+			})
+			.add()
+			.align(btnOptions.position, false, alignTo);
+			
+	},
+
+	/**
+	 * Zoom out to 1:1
+	 */
+	zoomOut: function () {
+		var chart = this;
+		fireEvent(chart, 'selection', { resetSelection: true }, function () { 
+			chart.zoom();
+		});
+	},
+
+	/**
+	 * Zoom into a given portion of the chart given by axis coordinates
+	 * @param {Object} event
+	 */
+	zoom: function (event) {
+		var chart = this,
+			hasZoomed,
+			pointer = chart.pointer,
+			displayButton = false,
+			resetZoomButton;
+
+		// If zoom is called with no arguments, reset the axes
+		if (!event || event.resetSelection) {
+			each(chart.axes, function (axis) {
+				hasZoomed = axis.zoom();
+			});
+		} else { // else, zoom in on all axes
+			each(event.xAxis.concat(event.yAxis), function (axisData) {
+				var axis = axisData.axis,
+					isXAxis = axis.isXAxis;
+
+				// don't zoom more than minRange
+				if (pointer[isXAxis ? 'zoomX' : 'zoomY'] || pointer[isXAxis ? 'pinchX' : 'pinchY']) {
+					hasZoomed = axis.zoom(axisData.min, axisData.max);
+					if (axis.displayBtn) {
+						displayButton = true;
+					}
+				}
+			});
+		}
+		
+		// Show or hide the Reset zoom button
+		resetZoomButton = chart.resetZoomButton;
+		if (displayButton && !resetZoomButton) {
+			chart.showResetZoom();
+		} else if (!displayButton && isObject(resetZoomButton)) {
+			chart.resetZoomButton = resetZoomButton.destroy();
+		}
+		
+
+		// Redraw
+		if (hasZoomed) {
+			chart.redraw(
+				pick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100) // animation
+			);
+		}
+	},
+
+	/**
+	 * Pan the chart by dragging the mouse across the pane. This function is called
+	 * on mouse move, and the distance to pan is computed from chartX compared to
+	 * the first chartX position in the dragging operation.
+	 */
+	pan: function (e, panning) {
+
+		var chart = this,
+			hoverPoints = chart.hoverPoints,
+			doRedraw;
+
+		// remove active points for shared tooltip
+		if (hoverPoints) {
+			each(hoverPoints, function (point) {
+				point.setState();
+			});
+		}
+
+		each(panning === 'xy' ? [1, 0] : [1], function (isX) { // xy is used in maps
+			var mousePos = e[isX ? 'chartX' : 'chartY'],
+				axis = chart[isX ? 'xAxis' : 'yAxis'][0],
+				startPos = chart[isX ? 'mouseDownX' : 'mouseDownY'],
+				halfPointRange = (axis.pointRange || 0) / 2,
+				extremes = axis.getExtremes(),
+				newMin = axis.toValue(startPos - mousePos, true) + halfPointRange,
+				newMax = axis.toValue(startPos + chart[isX ? 'plotWidth' : 'plotHeight'] - mousePos, true) - halfPointRange;
+
+			if (axis.series.length && newMin > mathMin(extremes.dataMin, extremes.min) && newMax < mathMax(extremes.dataMax, extremes.max)) {
+				axis.setExtremes(newMin, newMax, false, false, { trigger: 'pan' });
+				doRedraw = true;
+			}
+
+			chart[isX ? 'mouseDownX' : 'mouseDownY'] = mousePos; // set new reference for next run
+		});
+
+		if (doRedraw) {
+			chart.redraw(false);
+		}
+		css(chart.container, { cursor: 'move' });
+	}
+});
+
+/*
+ * Extend the Point object with interaction
+ */
+extend(Point.prototype, {
+	/**
+	 * Toggle the selection status of a point
+	 * @param {Boolean} selected Whether to select or unselect the point.
+	 * @param {Boolean} accumulate Whether to add to the previous selection. By default,
+	 *		 this happens if the control key (Cmd on Mac) was pressed during clicking.
+	 */
+	select: function (selected, accumulate) {
+		var point = this,
+			series = point.series,
+			chart = series.chart;
+
+		selected = pick(selected, !point.selected);
+
+		// fire the event with the defalut handler
+		point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {
+			point.selected = point.options.selected = selected;
+			series.options.data[inArray(point, series.data)] = point.options;
+
+			point.setState(selected && SELECT_STATE);
+
+			// unselect all other points unless Ctrl or Cmd + click
+			if (!accumulate) {
+				each(chart.getSelectedPoints(), function (loopPoint) {
+					if (loopPoint.selected && loopPoint !== point) {
+						loopPoint.selected = loopPoint.options.selected = false;
+						series.options.data[inArray(loopPoint, series.data)] = loopPoint.options;
+						loopPoint.setState(NORMAL_STATE);
+							loopPoint.firePointEvent('unselect');
+					}
+				});
+			}
+		});
+	},
+
+	/**
+	 * Runs on mouse over the point
+	 */
+	onMouseOver: function (e) {
+		var point = this,
+			series = point.series,
+			chart = series.chart,
+			tooltip = chart.tooltip,
+			hoverPoint = chart.hoverPoint;
+
+		// set normal state to previous series
+		if (hoverPoint && hoverPoint !== point) {
+			hoverPoint.onMouseOut();
+		}
+
+		// trigger the event
+		point.firePointEvent('mouseOver');
+
+		// update the tooltip
+		if (tooltip && (!tooltip.shared || series.noSharedTooltip)) {
+			tooltip.refresh(point, e);
+		}
+
+		// hover this
+		point.setState(HOVER_STATE);
+		chart.hoverPoint = point;
+	},
+
+	/**
+	 * Runs on mouse out from the point
+	 */
+	onMouseOut: function () {
+		var chart = this.series.chart,
+			hoverPoints = chart.hoverPoints;
+
+		this.firePointEvent('mouseOut');
+
+		if (!hoverPoints || inArray(this, hoverPoints) === -1) { // #887, #2240
+			this.setState();
+			chart.hoverPoint = null;
+		}
+	},
+
+	/**
+	 * Import events from the series' and point's options. Only do it on
+	 * demand, to save processing time on hovering.
+	 */
+	importEvents: function () {
+		if (!this.hasImportedEvents) {
+			var point = this,
+				options = merge(point.series.options.point, point.options),
+				events = options.events,
+				eventType;
+
+			point.events = events;
+
+			for (eventType in events) {
+				addEvent(point, eventType, events[eventType]);
+			}
+			this.hasImportedEvents = true;
+
+		}
+	},
+
+	/**
+	 * Set the point's state
+	 * @param {String} state
+	 */
+	setState: function (state, move) {
+		var point = this,
+			plotX = point.plotX,
+			plotY = point.plotY,
+			series = point.series,
+			stateOptions = series.options.states,
+			markerOptions = defaultPlotOptions[series.type].marker && series.options.marker,
+			normalDisabled = markerOptions && !markerOptions.enabled,
+			markerStateOptions = markerOptions && markerOptions.states[state],
+			stateDisabled = markerStateOptions && markerStateOptions.enabled === false,
+			stateMarkerGraphic = series.stateMarkerGraphic,
+			pointMarker = point.marker || {},
+			chart = series.chart,
+			radius,
+			halo = series.halo,
+			haloOptions,
+			newSymbol,
+			pointAttr;
+
+		state = state || NORMAL_STATE; // empty string
+		pointAttr = point.pointAttr[state] || series.pointAttr[state];
+
+		if (
+				// already has this state
+				(state === point.state && !move) ||
+				// selected points don't respond to hover
+				(point.selected && state !== SELECT_STATE) ||
+				// series' state options is disabled
+				(stateOptions[state] && stateOptions[state].enabled === false) ||
+				// general point marker's state options is disabled
+				(state && (stateDisabled || (normalDisabled && markerStateOptions.enabled === false))) ||
+				// individual point marker's state options is disabled
+				(state && pointMarker.states && pointMarker.states[state] && pointMarker.states[state].enabled === false) // #1610
+
+			) {
+			return;
+		}
+
+		// apply hover styles to the existing point
+		if (point.graphic) {
+			radius = markerOptions && point.graphic.symbolName && pointAttr.r;
+			point.graphic.attr(merge(
+				pointAttr,
+				radius ? { // new symbol attributes (#507, #612)
+					x: plotX - radius,
+					y: plotY - radius,
+					width: 2 * radius,
+					height: 2 * radius
+				} : {}
+			));
+
+			// Zooming in from a range with no markers to a range with markers
+			if (stateMarkerGraphic) {
+				stateMarkerGraphic.hide();
+			}
+		} else {
+			// if a graphic is not applied to each point in the normal state, create a shared
+			// graphic for the hover state
+			if (state && markerStateOptions) {
+				radius = markerStateOptions.radius;
+				newSymbol = pointMarker.symbol || series.symbol;
+
+				// If the point has another symbol than the previous one, throw away the
+				// state marker graphic and force a new one (#1459)
+				if (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {
+					stateMarkerGraphic = stateMarkerGraphic.destroy();
+				}
+
+				// Add a new state marker graphic
+				if (!stateMarkerGraphic) {
+					if (newSymbol) {
+						series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(
+							newSymbol,
+							plotX - radius,
+							plotY - radius,
+							2 * radius,
+							2 * radius
+						)
+						.attr(pointAttr)
+						.add(series.markerGroup);
+						stateMarkerGraphic.currentSymbol = newSymbol;
+					}
+
+				// Move the existing graphic
+				} else {
+					stateMarkerGraphic[move ? 'animate' : 'attr']({ // #1054
+						x: plotX - radius,
+						y: plotY - radius
+					});
+				}
+			}
+
+			if (stateMarkerGraphic) {
+				stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY, chart.inverted) ? 'show' : 'hide'](); // #2450
+			}
+		}
+
+		// Show me your halo
+		haloOptions = stateOptions[state] && stateOptions[state].halo;
+		if (haloOptions && haloOptions.size) {
+			if (!halo) {
+				series.halo = halo = chart.renderer.path()
+					.add(series.seriesGroup);
+			}
+			halo.attr(extend({
+				fill: Color(point.color || series.color).setOpacity(haloOptions.opacity).get()
+			}, haloOptions.attributes))[move ? 'animate' : 'attr']({
+				d: point.haloPath(haloOptions.size)
+			});
+		} else if (halo) {
+			halo.attr({ d: [] });
+		}
+
+		point.state = state;
+	},
+
+	haloPath: function (size) {
+		var series = this.series,
+			chart = series.chart,
+			plotBox = series.getPlotBox(),
+			inverted = chart.inverted;
+
+		return chart.renderer.symbols.circle(
+			plotBox.translateX + (inverted ? series.yAxis.len - this.plotY : this.plotX) - size, 
+			plotBox.translateY + (inverted ? series.xAxis.len - this.plotX : this.plotY) - size, 
+			size * 2, 
+			size * 2
+		);
+	}
+});
+
+/*
+ * Extend the Series object with interaction
+ */
+
+extend(Series.prototype, {
+	/**
+	 * Series mouse over handler
+	 */
+	onMouseOver: function () {
+		var series = this,
+			chart = series.chart,
+			hoverSeries = chart.hoverSeries;
+
+		// set normal state to previous series
+		if (hoverSeries && hoverSeries !== series) {
+			hoverSeries.onMouseOut();
+		}
+
+		// trigger the event, but to save processing time,
+		// only if defined
+		if (series.options.events.mouseOver) {
+			fireEvent(series, 'mouseOver');
+		}
+
+		// hover this
+		series.setState(HOVER_STATE);
+		chart.hoverSeries = series;
+	},
+
+	/**
+	 * Series mouse out handler
+	 */
+	onMouseOut: function () {
+		// trigger the event only if listeners exist
+		var series = this,
+			options = series.options,
+			chart = series.chart,
+			tooltip = chart.tooltip,
+			hoverPoint = chart.hoverPoint;
+
+		// trigger mouse out on the point, which must be in this series
+		if (hoverPoint) {
+			hoverPoint.onMouseOut();
+		}
+
+		// fire the mouse out event
+		if (series && options.events.mouseOut) {
+			fireEvent(series, 'mouseOut');
+		}
+
+
+		// hide the tooltip
+		if (tooltip && !options.stickyTracking && (!tooltip.shared || series.noSharedTooltip)) {
+			tooltip.hide();
+		}
+
+		// set normal state
+		series.setState();
+		chart.hoverSeries = null;
+	},
+
+	/**
+	 * Set the state of the graph
+	 */
+	setState: function (state) {
+		var series = this,
+			options = series.options,
+			graph = series.graph,
+			graphNeg = series.graphNeg,
+			stateOptions = options.states,
+			lineWidth = options.lineWidth,
+			attribs;
+
+		state = state || NORMAL_STATE;
+
+		if (series.state !== state) {
+			series.state = state;
+
+			if (stateOptions[state] && stateOptions[state].enabled === false) {
+				return;
+			}
+
+			if (state) {
+				lineWidth = stateOptions[state].lineWidth || lineWidth + (stateOptions[state].lineWidthPlus || 0);
+			}
+
+			if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML
+				attribs = {
+					'stroke-width': lineWidth
+				};
+				// use attr because animate will cause any other animation on the graph to stop
+				graph.attr(attribs);
+				if (graphNeg) {
+					graphNeg.attr(attribs);
+				}
+			}
+		}
+	},
+
+	/**
+	 * Set the visibility of the graph
+	 *
+	 * @param vis {Boolean} True to show the series, false to hide. If UNDEFINED,
+	 *				the visibility is toggled.
+	 */
+	setVisible: function (vis, redraw) {
+		var series = this,
+			chart = series.chart,
+			legendItem = series.legendItem,
+			showOrHide,
+			ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,
+			oldVisibility = series.visible;
+
+		// if called without an argument, toggle visibility
+		series.visible = vis = series.userOptions.visible = vis === UNDEFINED ? !oldVisibility : vis;
+		showOrHide = vis ? 'show' : 'hide';
+
+		// show or hide elements
+		each(['group', 'dataLabelsGroup', 'markerGroup', 'tracker'], function (key) {
+			if (series[key]) {
+				series[key][showOrHide]();
+			}
+		});
+
+
+		// hide tooltip (#1361)
+		if (chart.hoverSeries === series) {
+			series.onMouseOut();
+		}
+
+
+		if (legendItem) {
+			chart.legend.colorizeItem(series, vis);
+		}
+
+
+		// rescale or adapt to resized chart
+		series.isDirty = true;
+		// in a stack, all other series are affected
+		if (series.options.stacking) {
+			each(chart.series, function (otherSeries) {
+				if (otherSeries.options.stacking && otherSeries.visible) {
+					otherSeries.isDirty = true;
+				}
+			});
+		}
+
+		// show or hide linked series
+		each(series.linkedSeries, function (otherSeries) {
+			otherSeries.setVisible(vis, false);
+		});
+
+		if (ignoreHiddenSeries) {
+			chart.isDirtyBox = true;
+		}
+		if (redraw !== false) {
+			chart.redraw();
+		}
+
+		fireEvent(series, showOrHide);
+	},
+
+	/**
+	 * Memorize tooltip texts and positions
+	 */
+	setTooltipPoints: function (renew) {
+		var series = this,
+			points = [],
+			pointsLength,
+			low,
+			high,
+			xAxis = series.xAxis,
+			xExtremes = xAxis && xAxis.getExtremes(),
+			axisLength = xAxis ? (xAxis.tooltipLen || xAxis.len) : series.chart.plotSizeX, // tooltipLen and tooltipPosName used in polar
+			point,
+			pointX,
+			nextPoint,
+			i,
+			tooltipPoints = []; // a lookup array for each pixel in the x dimension
+
+		// don't waste resources if tracker is disabled
+		if (series.options.enableMouseTracking === false || series.singularTooltips) {
+			return;
+		}
+
+		// renew
+		if (renew) {
+			series.tooltipPoints = null;
+		}
+
+		// concat segments to overcome null values
+		each(series.segments || series.points, function (segment) {
+			points = points.concat(segment);
+		});
+
+		// Reverse the points in case the X axis is reversed
+		if (xAxis && xAxis.reversed) {
+			points = points.reverse();
+		}
+
+		// Polar needs additional shaping
+		if (series.orderTooltipPoints) {
+			series.orderTooltipPoints(points);
+		}
+
+		// Assign each pixel position to the nearest point
+		pointsLength = points.length;
+		for (i = 0; i < pointsLength; i++) {
+			point = points[i];
+			pointX = point.x;
+			if (pointX >= xExtremes.min && pointX <= xExtremes.max) { // #1149
+				nextPoint = points[i + 1];
+
+				// Set this range's low to the last range's high plus one
+				low = high === UNDEFINED ? 0 : high + 1;
+				// Now find the new high
+				high = points[i + 1] ?
+					mathMin(mathMax(0, mathFloor( // #2070
+						(point.clientX + (nextPoint ? (nextPoint.wrappedClientX || nextPoint.clientX) : axisLength)) / 2
+					)), axisLength) :
+					axisLength;
+
+				while (low >= 0 && low <= high) {
+					tooltipPoints[low++] = point;
+				}
+			}
+		}
+		series.tooltipPoints = tooltipPoints;
+	},
+
+	/**
+	 * Show the graph
+	 */
+	show: function () {
+		this.setVisible(true);
+	},
+
+	/**
+	 * Hide the graph
+	 */
+	hide: function () {
+		this.setVisible(false);
+	},
+
+
+	/**
+	 * Set the selected state of the graph
+	 *
+	 * @param selected {Boolean} True to select the series, false to unselect. If
+	 *				UNDEFINED, the selection state is toggled.
+	 */
+	select: function (selected) {
+		var series = this;
+		// if called without an argument, toggle
+		series.selected = selected = (selected === UNDEFINED) ? !series.selected : selected;
+
+		if (series.checkbox) {
+			series.checkbox.checked = selected;
+		}
+
+		fireEvent(series, selected ? 'select' : 'unselect');
+	},
+
+	drawTracker: TrackerMixin.drawTrackerGraph
+});
+// global variables
+extend(Highcharts, {
+	
+	// Constructors
+	Axis: Axis,
+	Chart: Chart,
+	Color: Color,
+	Point: Point,
+	Tick: Tick,	
+	Renderer: Renderer,
+	Series: Series,
+	SVGElement: SVGElement,
+	SVGRenderer: SVGRenderer,
+	
+	// Various
+	arrayMin: arrayMin,
+	arrayMax: arrayMax,
+	charts: charts,
+	dateFormat: dateFormat,
+	format: format,
+	pathAnim: pathAnim,
+	getOptions: getOptions,
+	hasBidiBug: hasBidiBug,
+	isTouchDevice: isTouchDevice,
+	numberFormat: numberFormat,
+	seriesTypes: seriesTypes,
+	setOptions: setOptions,
+	addEvent: addEvent,
+	removeEvent: removeEvent,
+	createElement: createElement,
+	discardElement: discardElement,
+	css: css,
+	each: each,
+	extend: extend,
+	map: map,
+	merge: merge,
+	pick: pick,
+	splat: splat,
+	extendClass: extendClass,
+	pInt: pInt,
+	wrap: wrap,
+	svg: hasSVG,
+	canvas: useCanVG,
+	vml: !hasSVG && !useCanVG,
+	product: PRODUCT,
+	version: VERSION
+});
+
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/canvas-tools.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/canvas-tools.js
new file mode 100644
index 0000000..49e5188
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/canvas-tools.js
@@ -0,0 +1,133 @@
+/*
+ A class to parse color values
+ @author Stoyan Stefanov <sstoo@gmail.com>
+ @link   http://www.phpied.com/rgb-color-parser-in-javascript/
+ Use it if you like it
+
+ canvg.js - Javascript SVG parser and renderer on Canvas
+ MIT Licensed 
+ Gabe Lerner (gabelerner@gmail.com)
+ http://code.google.com/p/canvg/
+
+ Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/
+
+ Highcharts JS v2.2.5 (2012-06-08)
+ CanVGRenderer Extension module
+
+ (c) 2011-2012 Torstein H?nsi, Erik Olsson
+
+ License: www.highcharts.com/license
+*/
+function RGBColor(m){this.ok=!1;m.charAt(0)=="#"&&(m=m.substr(1,6));var m=m.replace(/ /g,""),m=m.toLowerCase(),a={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",
+darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",
+gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",
+lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",
+oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",
+slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"},c;for(c in a)m==c&&(m=a[c]);var d=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(b){return[parseInt(b[1]),parseInt(b[2]),parseInt(b[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,
+example:["#00ff00","336699"],process:function(b){return[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(b){return[parseInt(b[1]+b[1],16),parseInt(b[2]+b[2],16),parseInt(b[3]+b[3],16)]}}];for(c=0;c<d.length;c++){var b=d[c].process,k=d[c].re.exec(m);if(k)channels=b(k),this.r=channels[0],this.g=channels[1],this.b=channels[2],this.ok=!0}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r;this.g=this.g<0||isNaN(this.g)?0:
+this.g>255?255:this.g;this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b;this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"};this.toHex=function(){var b=this.r.toString(16),a=this.g.toString(16),d=this.b.toString(16);b.length==1&&(b="0"+b);a.length==1&&(a="0"+a);d.length==1&&(d="0"+d);return"#"+b+a+d};this.getHelpXML=function(){for(var b=[],k=0;k<d.length;k++)for(var c=d[k].example,j=0;j<c.length;j++)b[b.length]=c[j];for(var h in a)b[b.length]=h;c=document.createElement("ul");
+c.setAttribute("id","rgbcolor-examples");for(k=0;k<b.length;k++)try{var l=document.createElement("li"),o=new RGBColor(b[k]),n=document.createElement("div");n.style.cssText="margin: 3px; border: 1px solid black; background:"+o.toHex()+"; color:"+o.toHex();n.appendChild(document.createTextNode("test"));var q=document.createTextNode(" "+b[k]+" -> "+o.toRGB()+" -> "+o.toHex());l.appendChild(n);l.appendChild(q);c.appendChild(l)}catch(p){}return c}}
+if(!window.console)window.console={},window.console.log=function(){},window.console.dir=function(){};if(!Array.prototype.indexOf)Array.prototype.indexOf=function(m){for(var a=0;a<this.length;a++)if(this[a]==m)return a;return-1};
+(function(){function m(){var a={FRAMERATE:30,MAX_VIRTUAL_PIXELS:3E4};a.init=function(c){a.Definitions={};a.Styles={};a.Animations=[];a.Images=[];a.ctx=c;a.ViewPort=new function(){this.viewPorts=[];this.Clear=function(){this.viewPorts=[]};this.SetCurrent=function(a,b){this.viewPorts.push({width:a,height:b})};this.RemoveCurrent=function(){this.viewPorts.pop()};this.Current=function(){return this.viewPorts[this.viewPorts.length-1]};this.width=function(){return this.Current().width};this.height=function(){return this.Current().height};
+this.ComputeSize=function(a){return a!=null&&typeof a=="number"?a:a=="x"?this.width():a=="y"?this.height():Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}};a.init();a.ImagesLoaded=function(){for(var c=0;c<a.Images.length;c++)if(!a.Images[c].loaded)return!1;return!0};a.trim=function(a){return a.replace(/^\s+|\s+$/g,"")};a.compressSpaces=function(a){return a.replace(/[\s\r\t\n]+/gm," ")};a.ajax=function(a){var d;return(d=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"))?
+(d.open("GET",a,!1),d.send(null),d.responseText):null};a.parseXml=function(a){if(window.DOMParser)return(new DOMParser).parseFromString(a,"text/xml");else{var a=a.replace(/<!DOCTYPE svg[^>]*>/,""),d=new ActiveXObject("Microsoft.XMLDOM");d.async="false";d.loadXML(a);return d}};a.Property=function(c,d){this.name=c;this.value=d;this.hasValue=function(){return this.value!=null&&this.value!==""};this.numValue=function(){if(!this.hasValue())return 0;var b=parseFloat(this.value);(this.value+"").match(/%$/)&&
+(b/=100);return b};this.valueOrDefault=function(b){return this.hasValue()?this.value:b};this.numValueOrDefault=function(b){return this.hasValue()?this.numValue():b};var b=this;this.Color={addOpacity:function(d){var c=b.value;if(d!=null&&d!=""){var f=new RGBColor(b.value);f.ok&&(c="rgba("+f.r+", "+f.g+", "+f.b+", "+d+")")}return new a.Property(b.name,c)}};this.Definition={getDefinition:function(){var d=b.value.replace(/^(url\()?#([^\)]+)\)?$/,"$2");return a.Definitions[d]},isUrl:function(){return b.value.indexOf("url(")==
+0},getFillStyle:function(b){var d=this.getDefinition();return d!=null&&d.createGradient?d.createGradient(a.ctx,b):d!=null&&d.createPattern?d.createPattern(a.ctx,b):null}};this.Length={DPI:function(){return 96},EM:function(b){var d=12,c=new a.Property("fontSize",a.Font.Parse(a.ctx.font).fontSize);c.hasValue()&&(d=c.Length.toPixels(b));return d},toPixels:function(d){if(!b.hasValue())return 0;var c=b.value+"";return c.match(/em$/)?b.numValue()*this.EM(d):c.match(/ex$/)?b.numValue()*this.EM(d)/2:c.match(/px$/)?
+b.numValue():c.match(/pt$/)?b.numValue()*1.25:c.match(/pc$/)?b.numValue()*15:c.match(/cm$/)?b.numValue()*this.DPI(d)/2.54:c.match(/mm$/)?b.numValue()*this.DPI(d)/25.4:c.match(/in$/)?b.numValue()*this.DPI(d):c.match(/%$/)?b.numValue()*a.ViewPort.ComputeSize(d):b.numValue()}};this.Time={toMilliseconds:function(){if(!b.hasValue())return 0;var a=b.value+"";if(a.match(/s$/))return b.numValue()*1E3;a.match(/ms$/);return b.numValue()}};this.Angle={toRadians:function(){if(!b.hasValue())return 0;var a=b.value+
+"";return a.match(/deg$/)?b.numValue()*(Math.PI/180):a.match(/grad$/)?b.numValue()*(Math.PI/200):a.match(/rad$/)?b.numValue():b.numValue()*(Math.PI/180)}}};a.Font=new function(){this.Styles=["normal","italic","oblique","inherit"];this.Variants=["normal","small-caps","inherit"];this.Weights="normal,bold,bolder,lighter,100,200,300,400,500,600,700,800,900,inherit".split(",");this.CreateFont=function(d,b,c,e,f,g){g=g!=null?this.Parse(g):this.CreateFont("","","","","",a.ctx.font);return{fontFamily:f||
+g.fontFamily,fontSize:e||g.fontSize,fontStyle:d||g.fontStyle,fontWeight:c||g.fontWeight,fontVariant:b||g.fontVariant,toString:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var c=this;this.Parse=function(d){for(var b={},d=a.trim(a.compressSpaces(d||"")).split(" "),k=!1,e=!1,f=!1,g=!1,j="",h=0;h<d.length;h++)if(!e&&c.Styles.indexOf(d[h])!=-1){if(d[h]!="inherit")b.fontStyle=d[h];e=!0}else if(!g&&c.Variants.indexOf(d[h])!=-1){if(d[h]!="inherit")b.fontVariant=
+d[h];e=g=!0}else if(!f&&c.Weights.indexOf(d[h])!=-1){if(d[h]!="inherit")b.fontWeight=d[h];e=g=f=!0}else if(k)d[h]!="inherit"&&(j+=d[h]);else{if(d[h]!="inherit")b.fontSize=d[h].split("/")[0];e=g=f=k=!0}if(j!="")b.fontFamily=j;return b}};a.ToNumberArray=function(c){for(var c=a.trim(a.compressSpaces((c||"").replace(/,/g," "))).split(" "),d=0;d<c.length;d++)c[d]=parseFloat(c[d]);return c};a.Point=function(a,d){this.x=a;this.y=d;this.angleTo=function(b){return Math.atan2(b.y-this.y,b.x-this.x)};this.applyTransform=
+function(b){var a=this.x*b[1]+this.y*b[3]+b[5];this.x=this.x*b[0]+this.y*b[2]+b[4];this.y=a}};a.CreatePoint=function(c){c=a.ToNumberArray(c);return new a.Point(c[0],c[1])};a.CreatePath=function(c){for(var c=a.ToNumberArray(c),d=[],b=0;b<c.length;b+=2)d.push(new a.Point(c[b],c[b+1]));return d};a.BoundingBox=function(a,d,b,k){this.y2=this.x2=this.y1=this.x1=Number.NaN;this.x=function(){return this.x1};this.y=function(){return this.y1};this.width=function(){return this.x2-this.x1};this.height=function(){return this.y2-
+this.y1};this.addPoint=function(b,a){if(b!=null){if(isNaN(this.x1)||isNaN(this.x2))this.x2=this.x1=b;if(b<this.x1)this.x1=b;if(b>this.x2)this.x2=b}if(a!=null){if(isNaN(this.y1)||isNaN(this.y2))this.y2=this.y1=a;if(a<this.y1)this.y1=a;if(a>this.y2)this.y2=a}};this.addX=function(b){this.addPoint(b,null)};this.addY=function(b){this.addPoint(null,b)};this.addBoundingBox=function(b){this.addPoint(b.x1,b.y1);this.addPoint(b.x2,b.y2)};this.addQuadraticCurve=function(b,a,d,c,k,l){d=b+2/3*(d-b);c=a+2/3*(c-
+a);this.addBezierCurve(b,a,d,d+1/3*(k-b),c,c+1/3*(l-a),k,l)};this.addBezierCurve=function(b,a,d,c,k,l,o,n){var q=[b,a],p=[d,c],t=[k,l],m=[o,n];this.addPoint(q[0],q[1]);this.addPoint(m[0],m[1]);for(i=0;i<=1;i++)b=function(b){return Math.pow(1-b,3)*q[i]+3*Math.pow(1-b,2)*b*p[i]+3*(1-b)*Math.pow(b,2)*t[i]+Math.pow(b,3)*m[i]},a=6*q[i]-12*p[i]+6*t[i],d=-3*q[i]+9*p[i]-9*t[i]+3*m[i],c=3*p[i]-3*q[i],d==0?a!=0&&(a=-c/a,0<a&&a<1&&(i==0&&this.addX(b(a)),i==1&&this.addY(b(a)))):(c=Math.pow(a,2)-4*c*d,c<0||(k=
+(-a+Math.sqrt(c))/(2*d),0<k&&k<1&&(i==0&&this.addX(b(k)),i==1&&this.addY(b(k))),a=(-a-Math.sqrt(c))/(2*d),0<a&&a<1&&(i==0&&this.addX(b(a)),i==1&&this.addY(b(a)))))};this.isPointInBox=function(b,a){return this.x1<=b&&b<=this.x2&&this.y1<=a&&a<=this.y2};this.addPoint(a,d);this.addPoint(b,k)};a.Transform=function(c){var d=this;this.Type={};this.Type.translate=function(b){this.p=a.CreatePoint(b);this.apply=function(b){b.translate(this.p.x||0,this.p.y||0)};this.applyToPoint=function(b){b.applyTransform([1,
+0,0,1,this.p.x||0,this.p.y||0])}};this.Type.rotate=function(b){b=a.ToNumberArray(b);this.angle=new a.Property("angle",b[0]);this.cx=b[1]||0;this.cy=b[2]||0;this.apply=function(b){b.translate(this.cx,this.cy);b.rotate(this.angle.Angle.toRadians());b.translate(-this.cx,-this.cy)};this.applyToPoint=function(b){var a=this.angle.Angle.toRadians();b.applyTransform([1,0,0,1,this.p.x||0,this.p.y||0]);b.applyTransform([Math.cos(a),Math.sin(a),-Math.sin(a),Math.cos(a),0,0]);b.applyTransform([1,0,0,1,-this.p.x||
+0,-this.p.y||0])}};this.Type.scale=function(b){this.p=a.CreatePoint(b);this.apply=function(b){b.scale(this.p.x||1,this.p.y||this.p.x||1)};this.applyToPoint=function(b){b.applyTransform([this.p.x||0,0,0,this.p.y||0,0,0])}};this.Type.matrix=function(b){this.m=a.ToNumberArray(b);this.apply=function(b){b.transform(this.m[0],this.m[1],this.m[2],this.m[3],this.m[4],this.m[5])};this.applyToPoint=function(b){b.applyTransform(this.m)}};this.Type.SkewBase=function(b){this.base=d.Type.matrix;this.base(b);this.angle=
+new a.Property("angle",b)};this.Type.SkewBase.prototype=new this.Type.matrix;this.Type.skewX=function(b){this.base=d.Type.SkewBase;this.base(b);this.m=[1,0,Math.tan(this.angle.Angle.toRadians()),1,0,0]};this.Type.skewX.prototype=new this.Type.SkewBase;this.Type.skewY=function(b){this.base=d.Type.SkewBase;this.base(b);this.m=[1,Math.tan(this.angle.Angle.toRadians()),0,1,0,0]};this.Type.skewY.prototype=new this.Type.SkewBase;this.transforms=[];this.apply=function(b){for(var a=0;a<this.transforms.length;a++)this.transforms[a].apply(b)};
+this.applyToPoint=function(b){for(var a=0;a<this.transforms.length;a++)this.transforms[a].applyToPoint(b)};for(var c=a.trim(a.compressSpaces(c)).split(/\s(?=[a-z])/),b=0;b<c.length;b++){var k=c[b].split("(")[0],e=c[b].split("(")[1].replace(")","");this.transforms.push(new this.Type[k](e))}};a.AspectRatio=function(c,d,b,k,e,f,g,j,h,l){var d=a.compressSpaces(d),d=d.replace(/^defer\s/,""),o=d.split(" ")[0]||"xMidYMid",d=d.split(" ")[1]||"meet",n=b/k,q=e/f,p=Math.min(n,q),m=Math.max(n,q);d=="meet"&&(k*=
+p,f*=p);d=="slice"&&(k*=m,f*=m);h=new a.Property("refX",h);l=new a.Property("refY",l);h.hasValue()&&l.hasValue()?c.translate(-p*h.Length.toPixels("x"),-p*l.Length.toPixels("y")):(o.match(/^xMid/)&&(d=="meet"&&p==q||d=="slice"&&m==q)&&c.translate(b/2-k/2,0),o.match(/YMid$/)&&(d=="meet"&&p==n||d=="slice"&&m==n)&&c.translate(0,e/2-f/2),o.match(/^xMax/)&&(d=="meet"&&p==q||d=="slice"&&m==q)&&c.translate(b-k,0),o.match(/YMax$/)&&(d=="meet"&&p==n||d=="slice"&&m==n)&&c.translate(0,e-f));o=="none"?c.scale(n,
+q):d=="meet"?c.scale(p,p):d=="slice"&&c.scale(m,m);c.translate(g==null?0:-g,j==null?0:-j)};a.Element={};a.Element.ElementBase=function(c){this.attributes={};this.styles={};this.children=[];this.attribute=function(b,d){var c=this.attributes[b];if(c!=null)return c;c=new a.Property(b,"");d==!0&&(this.attributes[b]=c);return c};this.style=function(b,d){var c=this.styles[b];if(c!=null)return c;c=this.attribute(b);if(c!=null&&c.hasValue())return c;c=this.parent;if(c!=null&&(c=c.style(b),c!=null&&c.hasValue()))return c;
+c=new a.Property(b,"");d==!0&&(this.styles[b]=c);return c};this.render=function(b){if(this.style("display").value!="none"&&this.attribute("visibility").value!="hidden"){b.save();this.setContext(b);if(this.attribute("mask").hasValue()){var a=this.attribute("mask").Definition.getDefinition();a!=null&&a.apply(b,this)}else this.style("filter").hasValue()?(a=this.style("filter").Definition.getDefinition(),a!=null&&a.apply(b,this)):this.renderChildren(b);this.clearContext(b);b.restore()}};this.setContext=
+function(){};this.clearContext=function(){};this.renderChildren=function(b){for(var a=0;a<this.children.length;a++)this.children[a].render(b)};this.addChild=function(b,d){var c=b;d&&(c=a.CreateElement(b));c.parent=this;this.children.push(c)};if(c!=null&&c.nodeType==1){for(var d=0;d<c.childNodes.length;d++){var b=c.childNodes[d];b.nodeType==1&&this.addChild(b,!0)}for(d=0;d<c.attributes.length;d++)b=c.attributes[d],this.attributes[b.nodeName]=new a.Property(b.nodeName,b.nodeValue);b=a.Styles[c.nodeName];
+if(b!=null)for(var k in b)this.styles[k]=b[k];if(this.attribute("class").hasValue())for(var d=a.compressSpaces(this.attribute("class").value).split(" "),e=0;e<d.length;e++){b=a.Styles["."+d[e]];if(b!=null)for(k in b)this.styles[k]=b[k];b=a.Styles[c.nodeName+"."+d[e]];if(b!=null)for(k in b)this.styles[k]=b[k]}if(this.attribute("style").hasValue()){b=this.attribute("style").value.split(";");for(d=0;d<b.length;d++)a.trim(b[d])!=""&&(c=b[d].split(":"),k=a.trim(c[0]),c=a.trim(c[1]),this.styles[k]=new a.Property(k,
+c))}this.attribute("id").hasValue()&&a.Definitions[this.attribute("id").value]==null&&(a.Definitions[this.attribute("id").value]=this)}};a.Element.RenderedElementBase=function(c){this.base=a.Element.ElementBase;this.base(c);this.setContext=function(d){if(this.style("fill").Definition.isUrl()){var b=this.style("fill").Definition.getFillStyle(this);if(b!=null)d.fillStyle=b}else if(this.style("fill").hasValue())b=this.style("fill"),this.style("fill-opacity").hasValue()&&(b=b.Color.addOpacity(this.style("fill-opacity").value)),
+d.fillStyle=b.value=="none"?"rgba(0,0,0,0)":b.value;if(this.style("stroke").Definition.isUrl()){if(b=this.style("stroke").Definition.getFillStyle(this),b!=null)d.strokeStyle=b}else if(this.style("stroke").hasValue())b=this.style("stroke"),this.style("stroke-opacity").hasValue()&&(b=b.Color.addOpacity(this.style("stroke-opacity").value)),d.strokeStyle=b.value=="none"?"rgba(0,0,0,0)":b.value;if(this.style("stroke-width").hasValue())d.lineWidth=this.style("stroke-width").Length.toPixels();if(this.style("stroke-linecap").hasValue())d.lineCap=
+this.style("stroke-linecap").value;if(this.style("stroke-linejoin").hasValue())d.lineJoin=this.style("stroke-linejoin").value;if(this.style("stroke-miterlimit").hasValue())d.miterLimit=this.style("stroke-miterlimit").value;if(typeof d.font!="undefined")d.font=a.Font.CreateFont(this.style("font-style").value,this.style("font-variant").value,this.style("font-weight").value,this.style("font-size").hasValue()?this.style("font-size").Length.toPixels()+"px":"",this.style("font-family").value).toString();
+this.attribute("transform").hasValue()&&(new a.Transform(this.attribute("transform").value)).apply(d);this.attribute("clip-path").hasValue()&&(b=this.attribute("clip-path").Definition.getDefinition(),b!=null&&b.apply(d));if(this.style("opacity").hasValue())d.globalAlpha=this.style("opacity").numValue()}};a.Element.RenderedElementBase.prototype=new a.Element.ElementBase;a.Element.PathElementBase=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.path=function(d){d!=null&&d.beginPath();
+return new a.BoundingBox};this.renderChildren=function(d){this.path(d);a.Mouse.checkPath(this,d);d.fillStyle!=""&&d.fill();d.strokeStyle!=""&&d.stroke();var b=this.getMarkers();if(b!=null){if(this.style("marker-start").Definition.isUrl()){var c=this.style("marker-start").Definition.getDefinition();c.render(d,b[0][0],b[0][1])}if(this.style("marker-mid").Definition.isUrl())for(var c=this.style("marker-mid").Definition.getDefinition(),e=1;e<b.length-1;e++)c.render(d,b[e][0],b[e][1]);this.style("marker-end").Definition.isUrl()&&
+(c=this.style("marker-end").Definition.getDefinition(),c.render(d,b[b.length-1][0],b[b.length-1][1]))}};this.getBoundingBox=function(){return this.path()};this.getMarkers=function(){return null}};a.Element.PathElementBase.prototype=new a.Element.RenderedElementBase;a.Element.svg=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseClearContext=this.clearContext;this.clearContext=function(d){this.baseClearContext(d);a.ViewPort.RemoveCurrent()};this.baseSetContext=this.setContext;
+this.setContext=function(d){d.strokeStyle="rgba(0,0,0,0)";d.lineCap="butt";d.lineJoin="miter";d.miterLimit=4;this.baseSetContext(d);this.attribute("x").hasValue()&&this.attribute("y").hasValue()&&d.translate(this.attribute("x").Length.toPixels("x"),this.attribute("y").Length.toPixels("y"));var b=a.ViewPort.width(),c=a.ViewPort.height();if(typeof this.root=="undefined"&&this.attribute("width").hasValue()&&this.attribute("height").hasValue()){var b=this.attribute("width").Length.toPixels("x"),c=this.attribute("height").Length.toPixels("y"),
+e=0,f=0;this.attribute("refX").hasValue()&&this.attribute("refY").hasValue()&&(e=-this.attribute("refX").Length.toPixels("x"),f=-this.attribute("refY").Length.toPixels("y"));d.beginPath();d.moveTo(e,f);d.lineTo(b,f);d.lineTo(b,c);d.lineTo(e,c);d.closePath();d.clip()}a.ViewPort.SetCurrent(b,c);if(this.attribute("viewBox").hasValue()){var e=a.ToNumberArray(this.attribute("viewBox").value),f=e[0],g=e[1],b=e[2],c=e[3];a.AspectRatio(d,this.attribute("preserveAspectRatio").value,a.ViewPort.width(),b,a.ViewPort.height(),
+c,f,g,this.attribute("refX").value,this.attribute("refY").value);a.ViewPort.RemoveCurrent();a.ViewPort.SetCurrent(e[2],e[3])}}};a.Element.svg.prototype=new a.Element.RenderedElementBase;a.Element.rect=function(c){this.base=a.Element.PathElementBase;this.base(c);this.path=function(d){var b=this.attribute("x").Length.toPixels("x"),c=this.attribute("y").Length.toPixels("y"),e=this.attribute("width").Length.toPixels("x"),f=this.attribute("height").Length.toPixels("y"),g=this.attribute("rx").Length.toPixels("x"),
+j=this.attribute("ry").Length.toPixels("y");this.attribute("rx").hasValue()&&!this.attribute("ry").hasValue()&&(j=g);this.attribute("ry").hasValue()&&!this.attribute("rx").hasValue()&&(g=j);d!=null&&(d.beginPath(),d.moveTo(b+g,c),d.lineTo(b+e-g,c),d.quadraticCurveTo(b+e,c,b+e,c+j),d.lineTo(b+e,c+f-j),d.quadraticCurveTo(b+e,c+f,b+e-g,c+f),d.lineTo(b+g,c+f),d.quadraticCurveTo(b,c+f,b,c+f-j),d.lineTo(b,c+j),d.quadraticCurveTo(b,c,b+g,c),d.closePath());return new a.BoundingBox(b,c,b+e,c+f)}};a.Element.rect.prototype=
+new a.Element.PathElementBase;a.Element.circle=function(c){this.base=a.Element.PathElementBase;this.base(c);this.path=function(d){var b=this.attribute("cx").Length.toPixels("x"),c=this.attribute("cy").Length.toPixels("y"),e=this.attribute("r").Length.toPixels();d!=null&&(d.beginPath(),d.arc(b,c,e,0,Math.PI*2,!0),d.closePath());return new a.BoundingBox(b-e,c-e,b+e,c+e)}};a.Element.circle.prototype=new a.Element.PathElementBase;a.Element.ellipse=function(c){this.base=a.Element.PathElementBase;this.base(c);
+this.path=function(d){var b=4*((Math.sqrt(2)-1)/3),c=this.attribute("rx").Length.toPixels("x"),e=this.attribute("ry").Length.toPixels("y"),f=this.attribute("cx").Length.toPixels("x"),g=this.attribute("cy").Length.toPixels("y");d!=null&&(d.beginPath(),d.moveTo(f,g-e),d.bezierCurveTo(f+b*c,g-e,f+c,g-b*e,f+c,g),d.bezierCurveTo(f+c,g+b*e,f+b*c,g+e,f,g+e),d.bezierCurveTo(f-b*c,g+e,f-c,g+b*e,f-c,g),d.bezierCurveTo(f-c,g-b*e,f-b*c,g-e,f,g-e),d.closePath());return new a.BoundingBox(f-c,g-e,f+c,g+e)}};a.Element.ellipse.prototype=
+new a.Element.PathElementBase;a.Element.line=function(c){this.base=a.Element.PathElementBase;this.base(c);this.getPoints=function(){return[new a.Point(this.attribute("x1").Length.toPixels("x"),this.attribute("y1").Length.toPixels("y")),new a.Point(this.attribute("x2").Length.toPixels("x"),this.attribute("y2").Length.toPixels("y"))]};this.path=function(d){var b=this.getPoints();d!=null&&(d.beginPath(),d.moveTo(b[0].x,b[0].y),d.lineTo(b[1].x,b[1].y));return new a.BoundingBox(b[0].x,b[0].y,b[1].x,b[1].y)};
+this.getMarkers=function(){var a=this.getPoints(),b=a[0].angleTo(a[1]);return[[a[0],b],[a[1],b]]}};a.Element.line.prototype=new a.Element.PathElementBase;a.Element.polyline=function(c){this.base=a.Element.PathElementBase;this.base(c);this.points=a.CreatePath(this.attribute("points").value);this.path=function(d){var b=new a.BoundingBox(this.points[0].x,this.points[0].y);d!=null&&(d.beginPath(),d.moveTo(this.points[0].x,this.points[0].y));for(var c=1;c<this.points.length;c++)b.addPoint(this.points[c].x,
+this.points[c].y),d!=null&&d.lineTo(this.points[c].x,this.points[c].y);return b};this.getMarkers=function(){for(var a=[],b=0;b<this.points.length-1;b++)a.push([this.points[b],this.points[b].angleTo(this.points[b+1])]);a.push([this.points[this.points.length-1],a[a.length-1][1]]);return a}};a.Element.polyline.prototype=new a.Element.PathElementBase;a.Element.polygon=function(c){this.base=a.Element.polyline;this.base(c);this.basePath=this.path;this.path=function(a){var b=this.basePath(a);a!=null&&(a.lineTo(this.points[0].x,
+this.points[0].y),a.closePath());return b}};a.Element.polygon.prototype=new a.Element.polyline;a.Element.path=function(c){this.base=a.Element.PathElementBase;this.base(c);c=this.attribute("d").value;c=c.replace(/,/gm," ");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,"$1 $2");c=c.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");c=c.replace(/([0-9])([+\-])/gm,
+"$1 $2");c=c.replace(/(\.[0-9]*)(\.)/gm,"$1 $2");c=c.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");c=a.compressSpaces(c);c=a.trim(c);this.PathParser=new function(d){this.tokens=d.split(" ");this.reset=function(){this.i=-1;this.previousCommand=this.command="";this.start=new a.Point(0,0);this.control=new a.Point(0,0);this.current=new a.Point(0,0);this.points=[];this.angles=[]};this.isEnd=function(){return this.i>=this.tokens.length-1};this.isCommandOrEnd=function(){return this.isEnd()?
+!0:this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null};this.isRelativeCommand=function(){return this.command==this.command.toLowerCase()};this.getToken=function(){this.i+=1;return this.tokens[this.i]};this.getScalar=function(){return parseFloat(this.getToken())};this.nextCommand=function(){this.previousCommand=this.command;this.command=this.getToken()};this.getPoint=function(){return this.makeAbsolute(new a.Point(this.getScalar(),this.getScalar()))};this.getAsControlPoint=function(){var b=this.getPoint();
+return this.control=b};this.getAsCurrentPoint=function(){var b=this.getPoint();return this.current=b};this.getReflectedControlPoint=function(){return this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s"?this.current:new a.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y)};this.makeAbsolute=function(b){if(this.isRelativeCommand())b.x=this.current.x+b.x,b.y=this.current.y+b.y;return b};this.addMarker=function(b,a,d){d!=null&&this.angles.length>0&&this.angles[this.angles.length-
+1]==null&&(this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(d));this.addMarkerAngle(b,a==null?null:a.angleTo(b))};this.addMarkerAngle=function(b,a){this.points.push(b);this.angles.push(a)};this.getMarkerPoints=function(){return this.points};this.getMarkerAngles=function(){for(var b=0;b<this.angles.length;b++)if(this.angles[b]==null)for(var a=b+1;a<this.angles.length;a++)if(this.angles[a]!=null){this.angles[b]=this.angles[a];break}return this.angles}}(c);this.path=function(d){var b=
+this.PathParser;b.reset();var c=new a.BoundingBox;for(d!=null&&d.beginPath();!b.isEnd();)switch(b.nextCommand(),b.command.toUpperCase()){case "M":var e=b.getAsCurrentPoint();b.addMarker(e);c.addPoint(e.x,e.y);d!=null&&d.moveTo(e.x,e.y);for(b.start=b.current;!b.isCommandOrEnd();)e=b.getAsCurrentPoint(),b.addMarker(e,b.start),c.addPoint(e.x,e.y),d!=null&&d.lineTo(e.x,e.y);break;case "L":for(;!b.isCommandOrEnd();){var f=b.current,e=b.getAsCurrentPoint();b.addMarker(e,f);c.addPoint(e.x,e.y);d!=null&&
+d.lineTo(e.x,e.y)}break;case "H":for(;!b.isCommandOrEnd();)e=new a.Point((b.isRelativeCommand()?b.current.x:0)+b.getScalar(),b.current.y),b.addMarker(e,b.current),b.current=e,c.addPoint(b.current.x,b.current.y),d!=null&&d.lineTo(b.current.x,b.current.y);break;case "V":for(;!b.isCommandOrEnd();)e=new a.Point(b.current.x,(b.isRelativeCommand()?b.current.y:0)+b.getScalar()),b.addMarker(e,b.current),b.current=e,c.addPoint(b.current.x,b.current.y),d!=null&&d.lineTo(b.current.x,b.current.y);break;case "C":for(;!b.isCommandOrEnd();){var g=
+b.current,f=b.getPoint(),j=b.getAsControlPoint(),e=b.getAsCurrentPoint();b.addMarker(e,j,f);c.addBezierCurve(g.x,g.y,f.x,f.y,j.x,j.y,e.x,e.y);d!=null&&d.bezierCurveTo(f.x,f.y,j.x,j.y,e.x,e.y)}break;case "S":for(;!b.isCommandOrEnd();)g=b.current,f=b.getReflectedControlPoint(),j=b.getAsControlPoint(),e=b.getAsCurrentPoint(),b.addMarker(e,j,f),c.addBezierCurve(g.x,g.y,f.x,f.y,j.x,j.y,e.x,e.y),d!=null&&d.bezierCurveTo(f.x,f.y,j.x,j.y,e.x,e.y);break;case "Q":for(;!b.isCommandOrEnd();)g=b.current,j=b.getAsControlPoint(),
+e=b.getAsCurrentPoint(),b.addMarker(e,j,j),c.addQuadraticCurve(g.x,g.y,j.x,j.y,e.x,e.y),d!=null&&d.quadraticCurveTo(j.x,j.y,e.x,e.y);break;case "T":for(;!b.isCommandOrEnd();)g=b.current,j=b.getReflectedControlPoint(),b.control=j,e=b.getAsCurrentPoint(),b.addMarker(e,j,j),c.addQuadraticCurve(g.x,g.y,j.x,j.y,e.x,e.y),d!=null&&d.quadraticCurveTo(j.x,j.y,e.x,e.y);break;case "A":for(;!b.isCommandOrEnd();){var g=b.current,h=b.getScalar(),l=b.getScalar(),f=b.getScalar()*(Math.PI/180),o=b.getScalar(),j=b.getScalar(),
+e=b.getAsCurrentPoint(),n=new a.Point(Math.cos(f)*(g.x-e.x)/2+Math.sin(f)*(g.y-e.y)/2,-Math.sin(f)*(g.x-e.x)/2+Math.cos(f)*(g.y-e.y)/2),q=Math.pow(n.x,2)/Math.pow(h,2)+Math.pow(n.y,2)/Math.pow(l,2);q>1&&(h*=Math.sqrt(q),l*=Math.sqrt(q));o=(o==j?-1:1)*Math.sqrt((Math.pow(h,2)*Math.pow(l,2)-Math.pow(h,2)*Math.pow(n.y,2)-Math.pow(l,2)*Math.pow(n.x,2))/(Math.pow(h,2)*Math.pow(n.y,2)+Math.pow(l,2)*Math.pow(n.x,2)));isNaN(o)&&(o=0);var p=new a.Point(o*h*n.y/l,o*-l*n.x/h),g=new a.Point((g.x+e.x)/2+Math.cos(f)*
+p.x-Math.sin(f)*p.y,(g.y+e.y)/2+Math.sin(f)*p.x+Math.cos(f)*p.y),m=function(b,a){return(b[0]*a[0]+b[1]*a[1])/(Math.sqrt(Math.pow(b[0],2)+Math.pow(b[1],2))*Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2)))},s=function(b,a){return(b[0]*a[1]<b[1]*a[0]?-1:1)*Math.acos(m(b,a))},o=s([1,0],[(n.x-p.x)/h,(n.y-p.y)/l]),q=[(n.x-p.x)/h,(n.y-p.y)/l],p=[(-n.x-p.x)/h,(-n.y-p.y)/l],n=s(q,p);if(m(q,p)<=-1)n=Math.PI;m(q,p)>=1&&(n=0);j==0&&n>0&&(n-=2*Math.PI);j==1&&n<0&&(n+=2*Math.PI);q=new a.Point(g.x-h*Math.cos((o+n)/
+2),g.y-l*Math.sin((o+n)/2));b.addMarkerAngle(q,(o+n)/2+(j==0?1:-1)*Math.PI/2);b.addMarkerAngle(e,n+(j==0?1:-1)*Math.PI/2);c.addPoint(e.x,e.y);d!=null&&(m=h>l?h:l,e=h>l?1:h/l,h=h>l?l/h:1,d.translate(g.x,g.y),d.rotate(f),d.scale(e,h),d.arc(0,0,m,o,o+n,1-j),d.scale(1/e,1/h),d.rotate(-f),d.translate(-g.x,-g.y))}break;case "Z":d!=null&&d.closePath(),b.current=b.start}return c};this.getMarkers=function(){for(var a=this.PathParser.getMarkerPoints(),b=this.PathParser.getMarkerAngles(),c=[],e=0;e<a.length;e++)c.push([a[e],
+b[e]]);return c}};a.Element.path.prototype=new a.Element.PathElementBase;a.Element.pattern=function(c){this.base=a.Element.ElementBase;this.base(c);this.createPattern=function(d){var b=new a.Element.svg;b.attributes.viewBox=new a.Property("viewBox",this.attribute("viewBox").value);b.attributes.x=new a.Property("x",this.attribute("x").value);b.attributes.y=new a.Property("y",this.attribute("y").value);b.attributes.width=new a.Property("width",this.attribute("width").value);b.attributes.height=new a.Property("height",
+this.attribute("height").value);b.children=this.children;var c=document.createElement("canvas");c.width=this.attribute("width").Length.toPixels("x");c.height=this.attribute("height").Length.toPixels("y");b.render(c.getContext("2d"));return d.createPattern(c,"repeat")}};a.Element.pattern.prototype=new a.Element.ElementBase;a.Element.marker=function(c){this.base=a.Element.ElementBase;this.base(c);this.baseRender=this.render;this.render=function(d,b,c){d.translate(b.x,b.y);this.attribute("orient").valueOrDefault("auto")==
+"auto"&&d.rotate(c);this.attribute("markerUnits").valueOrDefault("strokeWidth")=="strokeWidth"&&d.scale(d.lineWidth,d.lineWidth);d.save();var e=new a.Element.svg;e.attributes.viewBox=new a.Property("viewBox",this.attribute("viewBox").value);e.attributes.refX=new a.Property("refX",this.attribute("refX").value);e.attributes.refY=new a.Property("refY",this.attribute("refY").value);e.attributes.width=new a.Property("width",this.attribute("markerWidth").value);e.attributes.height=new a.Property("height",
+this.attribute("markerHeight").value);e.attributes.fill=new a.Property("fill",this.attribute("fill").valueOrDefault("black"));e.attributes.stroke=new a.Property("stroke",this.attribute("stroke").valueOrDefault("none"));e.children=this.children;e.render(d);d.restore();this.attribute("markerUnits").valueOrDefault("strokeWidth")=="strokeWidth"&&d.scale(1/d.lineWidth,1/d.lineWidth);this.attribute("orient").valueOrDefault("auto")=="auto"&&d.rotate(-c);d.translate(-b.x,-b.y)}};a.Element.marker.prototype=
+new a.Element.ElementBase;a.Element.defs=function(c){this.base=a.Element.ElementBase;this.base(c);this.render=function(){}};a.Element.defs.prototype=new a.Element.ElementBase;a.Element.GradientBase=function(c){this.base=a.Element.ElementBase;this.base(c);this.gradientUnits=this.attribute("gradientUnits").valueOrDefault("objectBoundingBox");this.stops=[];for(c=0;c<this.children.length;c++)this.stops.push(this.children[c]);this.getGradient=function(){};this.createGradient=function(d,b){var c=this;this.attribute("xlink:href").hasValue()&&
+(c=this.attribute("xlink:href").Definition.getDefinition());for(var e=this.getGradient(d,b),f=0;f<c.stops.length;f++)e.addColorStop(c.stops[f].offset,c.stops[f].color);if(this.attribute("gradientTransform").hasValue()){c=a.ViewPort.viewPorts[0];f=new a.Element.rect;f.attributes.x=new a.Property("x",-a.MAX_VIRTUAL_PIXELS/3);f.attributes.y=new a.Property("y",-a.MAX_VIRTUAL_PIXELS/3);f.attributes.width=new a.Property("width",a.MAX_VIRTUAL_PIXELS);f.attributes.height=new a.Property("height",a.MAX_VIRTUAL_PIXELS);
+var g=new a.Element.g;g.attributes.transform=new a.Property("transform",this.attribute("gradientTransform").value);g.children=[f];f=new a.Element.svg;f.attributes.x=new a.Property("x",0);f.attributes.y=new a.Property("y",0);f.attributes.width=new a.Property("width",c.width);f.attributes.height=new a.Property("height",c.height);f.children=[g];g=document.createElement("canvas");g.width=c.width;g.height=c.height;c=g.getContext("2d");c.fillStyle=e;f.render(c);return c.createPattern(g,"no-repeat")}return e}};
+a.Element.GradientBase.prototype=new a.Element.ElementBase;a.Element.linearGradient=function(c){this.base=a.Element.GradientBase;this.base(c);this.getGradient=function(a,b){var c=b.getBoundingBox(),e=this.gradientUnits=="objectBoundingBox"?c.x()+c.width()*this.attribute("x1").numValue():this.attribute("x1").Length.toPixels("x"),f=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("y1").numValue():this.attribute("y1").Length.toPixels("y"),g=this.gradientUnits=="objectBoundingBox"?
+c.x()+c.width()*this.attribute("x2").numValue():this.attribute("x2").Length.toPixels("x"),c=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("y2").numValue():this.attribute("y2").Length.toPixels("y");return a.createLinearGradient(e,f,g,c)}};a.Element.linearGradient.prototype=new a.Element.GradientBase;a.Element.radialGradient=function(c){this.base=a.Element.GradientBase;this.base(c);this.getGradient=function(a,b){var c=b.getBoundingBox(),e=this.gradientUnits=="objectBoundingBox"?
+c.x()+c.width()*this.attribute("cx").numValue():this.attribute("cx").Length.toPixels("x"),f=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("cy").numValue():this.attribute("cy").Length.toPixels("y"),g=e,j=f;this.attribute("fx").hasValue()&&(g=this.gradientUnits=="objectBoundingBox"?c.x()+c.width()*this.attribute("fx").numValue():this.attribute("fx").Length.toPixels("x"));this.attribute("fy").hasValue()&&(j=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("fy").numValue():
+this.attribute("fy").Length.toPixels("y"));c=this.gradientUnits=="objectBoundingBox"?(c.width()+c.height())/2*this.attribute("r").numValue():this.attribute("r").Length.toPixels();return a.createRadialGradient(g,j,0,e,f,c)}};a.Element.radialGradient.prototype=new a.Element.GradientBase;a.Element.stop=function(c){this.base=a.Element.ElementBase;this.base(c);this.offset=this.attribute("offset").numValue();c=this.style("stop-color");this.style("stop-opacity").hasValue()&&(c=c.Color.addOpacity(this.style("stop-opacity").value));
+this.color=c.value};a.Element.stop.prototype=new a.Element.ElementBase;a.Element.AnimateBase=function(c){this.base=a.Element.ElementBase;this.base(c);a.Animations.push(this);this.duration=0;this.begin=this.attribute("begin").Time.toMilliseconds();this.maxDuration=this.begin+this.attribute("dur").Time.toMilliseconds();this.getProperty=function(){var a=this.attribute("attributeType").value,b=this.attribute("attributeName").value;return a=="CSS"?this.parent.style(b,!0):this.parent.attribute(b,!0)};this.initialValue=
+null;this.removed=!1;this.calcValue=function(){return""};this.update=function(a){if(this.initialValue==null)this.initialValue=this.getProperty().value;if(this.duration>this.maxDuration)if(this.attribute("repeatCount").value=="indefinite")this.duration=0;else return this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed?(this.removed=!0,this.getProperty().value=this.initialValue,!0):!1;this.duration+=a;a=!1;if(this.begin<this.duration)a=this.calcValue(),this.attribute("type").hasValue()&&
+(a=this.attribute("type").value+"("+a+")"),this.getProperty().value=a,a=!0;return a};this.progress=function(){return(this.duration-this.begin)/(this.maxDuration-this.begin)}};a.Element.AnimateBase.prototype=new a.Element.ElementBase;a.Element.animate=function(c){this.base=a.Element.AnimateBase;this.base(c);this.calcValue=function(){var a=this.attribute("from").numValue(),b=this.attribute("to").numValue();return a+(b-a)*this.progress()}};a.Element.animate.prototype=new a.Element.AnimateBase;a.Element.animateColor=
+function(c){this.base=a.Element.AnimateBase;this.base(c);this.calcValue=function(){var a=new RGBColor(this.attribute("from").value),b=new RGBColor(this.attribute("to").value);if(a.ok&&b.ok){var c=a.r+(b.r-a.r)*this.progress(),e=a.g+(b.g-a.g)*this.progress(),a=a.b+(b.b-a.b)*this.progress();return"rgb("+parseInt(c,10)+","+parseInt(e,10)+","+parseInt(a,10)+")"}return this.attribute("from").value}};a.Element.animateColor.prototype=new a.Element.AnimateBase;a.Element.animateTransform=function(c){this.base=
+a.Element.animate;this.base(c)};a.Element.animateTransform.prototype=new a.Element.animate;a.Element.font=function(c){this.base=a.Element.ElementBase;this.base(c);this.horizAdvX=this.attribute("horiz-adv-x").numValue();this.isArabic=this.isRTL=!1;this.missingGlyph=this.fontFace=null;this.glyphs=[];for(c=0;c<this.children.length;c++){var d=this.children[c];if(d.type=="font-face")this.fontFace=d,d.style("font-family").hasValue()&&(a.Definitions[d.style("font-family").value]=this);else if(d.type=="missing-glyph")this.missingGlyph=
+d;else if(d.type=="glyph")d.arabicForm!=""?(this.isArabic=this.isRTL=!0,typeof this.glyphs[d.unicode]=="undefined"&&(this.glyphs[d.unicode]=[]),this.glyphs[d.unicode][d.arabicForm]=d):this.glyphs[d.unicode]=d}};a.Element.font.prototype=new a.Element.ElementBase;a.Element.fontface=function(c){this.base=a.Element.ElementBase;this.base(c);this.ascent=this.attribute("ascent").value;this.descent=this.attribute("descent").value;this.unitsPerEm=this.attribute("units-per-em").numValue()};a.Element.fontface.prototype=
+new a.Element.ElementBase;a.Element.missingglyph=function(c){this.base=a.Element.path;this.base(c);this.horizAdvX=0};a.Element.missingglyph.prototype=new a.Element.path;a.Element.glyph=function(c){this.base=a.Element.path;this.base(c);this.horizAdvX=this.attribute("horiz-adv-x").numValue();this.unicode=this.attribute("unicode").value;this.arabicForm=this.attribute("arabic-form").value};a.Element.glyph.prototype=new a.Element.path;a.Element.text=function(c){this.base=a.Element.RenderedElementBase;
+this.base(c);if(c!=null){this.children=[];for(var d=0;d<c.childNodes.length;d++){var b=c.childNodes[d];b.nodeType==1?this.addChild(b,!0):b.nodeType==3&&this.addChild(new a.Element.tspan(b),!1)}}this.baseSetContext=this.setContext;this.setContext=function(b){this.baseSetContext(b);if(this.style("dominant-baseline").hasValue())b.textBaseline=this.style("dominant-baseline").value;if(this.style("alignment-baseline").hasValue())b.textBaseline=this.style("alignment-baseline").value};this.renderChildren=
+function(b){for(var a=this.style("text-anchor").valueOrDefault("start"),c=this.attribute("x").Length.toPixels("x"),d=this.attribute("y").Length.toPixels("y"),j=0;j<this.children.length;j++){var h=this.children[j];h.attribute("x").hasValue()?h.x=h.attribute("x").Length.toPixels("x"):(h.attribute("dx").hasValue()&&(c+=h.attribute("dx").Length.toPixels("x")),h.x=c);c=h.measureText(b);if(a!="start"&&(j==0||h.attribute("x").hasValue())){for(var l=c,o=j+1;o<this.children.length;o++){var n=this.children[o];
+if(n.attribute("x").hasValue())break;l+=n.measureText(b)}h.x-=a=="end"?l:l/2}c=h.x+c;h.attribute("y").hasValue()?h.y=h.attribute("y").Length.toPixels("y"):(h.attribute("dy").hasValue()&&(d+=h.attribute("dy").Length.toPixels("y")),h.y=d);d=h.y;h.render(b)}}};a.Element.text.prototype=new a.Element.RenderedElementBase;a.Element.TextElementBase=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.getGlyph=function(a,b,c){var e=b[c],f=null;if(a.isArabic){var g="isolated";if((c==0||b[c-
+1]==" ")&&c<b.length-2&&b[c+1]!=" ")g="terminal";c>0&&b[c-1]!=" "&&c<b.length-2&&b[c+1]!=" "&&(g="medial");if(c>0&&b[c-1]!=" "&&(c==b.length-1||b[c+1]==" "))g="initial";typeof a.glyphs[e]!="undefined"&&(f=a.glyphs[e][g],f==null&&a.glyphs[e].type=="glyph"&&(f=a.glyphs[e]))}else f=a.glyphs[e];if(f==null)f=a.missingGlyph;return f};this.renderChildren=function(c){var b=this.parent.style("font-family").Definition.getDefinition();if(b!=null){var k=this.parent.style("font-size").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize),
+e=this.parent.style("font-style").valueOrDefault(a.Font.Parse(a.ctx.font).fontStyle),f=this.getText();b.isRTL&&(f=f.split("").reverse().join(""));for(var g=a.ToNumberArray(this.parent.attribute("dx").value),j=0;j<f.length;j++){var h=this.getGlyph(b,f,j),l=k/b.fontFace.unitsPerEm;c.translate(this.x,this.y);c.scale(l,-l);var o=c.lineWidth;c.lineWidth=c.lineWidth*b.fontFace.unitsPerEm/k;e=="italic"&&c.transform(1,0,0.4,1,0,0);h.render(c);e=="italic"&&c.transform(1,0,-0.4,1,0,0);c.lineWidth=o;c.scale(1/
+l,-1/l);c.translate(-this.x,-this.y);this.x+=k*(h.horizAdvX||b.horizAdvX)/b.fontFace.unitsPerEm;typeof g[j]!="undefined"&&!isNaN(g[j])&&(this.x+=g[j])}}else c.strokeStyle!=""&&c.strokeText(a.compressSpaces(this.getText()),this.x,this.y),c.fillStyle!=""&&c.fillText(a.compressSpaces(this.getText()),this.x,this.y)};this.getText=function(){};this.measureText=function(c){var b=this.parent.style("font-family").Definition.getDefinition();if(b!=null){var c=this.parent.style("font-size").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize),
+k=0,e=this.getText();b.isRTL&&(e=e.split("").reverse().join(""));for(var f=a.ToNumberArray(this.parent.attribute("dx").value),g=0;g<e.length;g++){var j=this.getGlyph(b,e,g);k+=(j.horizAdvX||b.horizAdvX)*c/b.fontFace.unitsPerEm;typeof f[g]!="undefined"&&!isNaN(f[g])&&(k+=f[g])}return k}b=a.compressSpaces(this.getText());if(!c.measureText)return b.length*10;c.save();this.setContext(c);b=c.measureText(b).width;c.restore();return b}};a.Element.TextElementBase.prototype=new a.Element.RenderedElementBase;
+a.Element.tspan=function(c){this.base=a.Element.TextElementBase;this.base(c);this.text=c.nodeType==3?c.nodeValue:c.childNodes.length>0?c.childNodes[0].nodeValue:c.text;this.getText=function(){return this.text}};a.Element.tspan.prototype=new a.Element.TextElementBase;a.Element.tref=function(c){this.base=a.Element.TextElementBase;this.base(c);this.getText=function(){var a=this.attribute("xlink:href").Definition.getDefinition();if(a!=null)return a.children[0].getText()}};a.Element.tref.prototype=new a.Element.TextElementBase;
+a.Element.a=function(c){this.base=a.Element.TextElementBase;this.base(c);this.hasText=!0;for(var d=0;d<c.childNodes.length;d++)if(c.childNodes[d].nodeType!=3)this.hasText=!1;this.text=this.hasText?c.childNodes[0].nodeValue:"";this.getText=function(){return this.text};this.baseRenderChildren=this.renderChildren;this.renderChildren=function(b){if(this.hasText){this.baseRenderChildren(b);var c=new a.Property("fontSize",a.Font.Parse(a.ctx.font).fontSize);a.Mouse.checkBoundingBox(this,new a.BoundingBox(this.x,
+this.y-c.Length.toPixels("y"),this.x+this.measureText(b),this.y))}else c=new a.Element.g,c.children=this.children,c.parent=this,c.render(b)};this.onclick=function(){window.open(this.attribute("xlink:href").value)};this.onmousemove=function(){a.ctx.canvas.style.cursor="pointer"}};a.Element.a.prototype=new a.Element.TextElementBase;a.Element.image=function(c){this.base=a.Element.RenderedElementBase;this.base(c);a.Images.push(this);this.img=document.createElement("img");this.loaded=!1;var d=this;this.img.onload=
+function(){d.loaded=!0};this.img.src=this.attribute("xlink:href").value;this.renderChildren=function(b){var c=this.attribute("x").Length.toPixels("x"),d=this.attribute("y").Length.toPixels("y"),f=this.attribute("width").Length.toPixels("x"),g=this.attribute("height").Length.toPixels("y");f==0||g==0||(b.save(),b.translate(c,d),a.AspectRatio(b,this.attribute("preserveAspectRatio").value,f,this.img.width,g,this.img.height,0,0),b.drawImage(this.img,0,0),b.restore())}};a.Element.image.prototype=new a.Element.RenderedElementBase;
+a.Element.g=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.getBoundingBox=function(){for(var c=new a.BoundingBox,b=0;b<this.children.length;b++)c.addBoundingBox(this.children[b].getBoundingBox());return c}};a.Element.g.prototype=new a.Element.RenderedElementBase;a.Element.symbol=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseSetContext=this.setContext;this.setContext=function(c){this.baseSetContext(c);if(this.attribute("viewBox").hasValue()){var b=
+a.ToNumberArray(this.attribute("viewBox").value),k=b[0],e=b[1];width=b[2];height=b[3];a.AspectRatio(c,this.attribute("preserveAspectRatio").value,this.attribute("width").Length.toPixels("x"),width,this.attribute("height").Length.toPixels("y"),height,k,e);a.ViewPort.SetCurrent(b[2],b[3])}}};a.Element.symbol.prototype=new a.Element.RenderedElementBase;a.Element.style=function(c){this.base=a.Element.ElementBase;this.base(c);for(var c=c.childNodes[0].nodeValue+(c.childNodes.length>1?c.childNodes[1].nodeValue:
+""),c=c.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm,""),c=a.compressSpaces(c),c=c.split("}"),d=0;d<c.length;d++)if(a.trim(c[d])!="")for(var b=c[d].split("{"),k=b[0].split(","),b=b[1].split(";"),e=0;e<k.length;e++){var f=a.trim(k[e]);if(f!=""){for(var g={},j=0;j<b.length;j++){var h=b[j].indexOf(":"),l=b[j].substr(0,h),h=b[j].substr(h+1,b[j].length-h);l!=null&&h!=null&&(g[a.trim(l)]=new a.Property(a.trim(l),a.trim(h)))}a.Styles[f]=g;if(f=="@font-face"){f=g["font-family"].value.replace(/"/g,
+"");g=g.src.value.split(",");for(j=0;j<g.length;j++)if(g[j].indexOf('format("svg")')>0){l=g[j].indexOf("url");h=g[j].indexOf(")",l);l=g[j].substr(l+5,h-l-6);l=a.parseXml(a.ajax(l)).getElementsByTagName("font");for(h=0;h<l.length;h++){var o=a.CreateElement(l[h]);a.Definitions[f]=o}}}}}};a.Element.style.prototype=new a.Element.ElementBase;a.Element.use=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseSetContext=this.setContext;this.setContext=function(a){this.baseSetContext(a);
+this.attribute("x").hasValue()&&a.translate(this.attribute("x").Length.toPixels("x"),0);this.attribute("y").hasValue()&&a.translate(0,this.attribute("y").Length.toPixels("y"))};this.getDefinition=function(){var a=this.attribute("xlink:href").Definition.getDefinition();if(this.attribute("width").hasValue())a.attribute("width",!0).value=this.attribute("width").value;if(this.attribute("height").hasValue())a.attribute("height",!0).value=this.attribute("height").value;return a};this.path=function(a){var b=
+this.getDefinition();b!=null&&b.path(a)};this.renderChildren=function(a){var b=this.getDefinition();b!=null&&b.render(a)}};a.Element.use.prototype=new a.Element.RenderedElementBase;a.Element.mask=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,b){var c=this.attribute("x").Length.toPixels("x"),e=this.attribute("y").Length.toPixels("y"),f=this.attribute("width").Length.toPixels("x"),g=this.attribute("height").Length.toPixels("y"),j=b.attribute("mask").value;b.attribute("mask").value=
+"";var h=document.createElement("canvas");h.width=c+f;h.height=e+g;var l=h.getContext("2d");this.renderChildren(l);var o=document.createElement("canvas");o.width=c+f;o.height=e+g;var n=o.getContext("2d");b.render(n);n.globalCompositeOperation="destination-in";n.fillStyle=l.createPattern(h,"no-repeat");n.fillRect(0,0,c+f,e+g);a.fillStyle=n.createPattern(o,"no-repeat");a.fillRect(0,0,c+f,e+g);b.attribute("mask").value=j};this.render=function(){}};a.Element.mask.prototype=new a.Element.ElementBase;a.Element.clipPath=
+function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a){for(var b=0;b<this.children.length;b++)this.children[b].path&&(this.children[b].path(a),a.clip())};this.render=function(){}};a.Element.clipPath.prototype=new a.Element.ElementBase;a.Element.filter=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,b){var c=b.getBoundingBox(),e=this.attribute("x").Length.toPixels("x"),f=this.attribute("y").Length.toPixels("y");if(e==0||f==0)e=c.x1,f=c.y1;var g=
+this.attribute("width").Length.toPixels("x"),j=this.attribute("height").Length.toPixels("y");if(g==0||j==0)g=c.width(),j=c.height();c=b.style("filter").value;b.style("filter").value="";var h=0.2*g,l=0.2*j,o=document.createElement("canvas");o.width=g+2*h;o.height=j+2*l;var n=o.getContext("2d");n.translate(-e+h,-f+l);b.render(n);for(var q=0;q<this.children.length;q++)this.children[q].apply(n,0,0,g+2*h,j+2*l);a.drawImage(o,0,0,g+2*h,j+2*l,e-h,f-l,g+2*h,j+2*l);b.style("filter",!0).value=c};this.render=
+function(){}};a.Element.filter.prototype=new a.Element.ElementBase;a.Element.feGaussianBlur=function(c){function d(a,c,d,f,g){for(var j=0;j<g;j++)for(var h=0;h<f;h++)for(var l=a[j*f*4+h*4+3]/255,o=0;o<4;o++){for(var n=d[0]*(l==0?255:a[j*f*4+h*4+o])*(l==0||o==3?1:l),q=1;q<d.length;q++){var p=Math.max(h-q,0),m=a[j*f*4+p*4+3]/255,p=Math.min(h+q,f-1),p=a[j*f*4+p*4+3]/255,s=d[q],r;m==0?r=255:(r=Math.max(h-q,0),r=a[j*f*4+r*4+o]);m=r*(m==0||o==3?1:m);p==0?r=255:(r=Math.min(h+q,f-1),r=a[j*f*4+r*4+o]);n+=
+s*(m+r*(p==0||o==3?1:p))}c[h*g*4+j*4+o]=n}}this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,c,e,f,g){var e=this.attribute("stdDeviation").numValue(),c=a.getImageData(0,0,f,g),e=Math.max(e,0.01),j=Math.ceil(e*4)+1;mask=[];for(var h=0;h<j;h++)mask[h]=Math.exp(-0.5*(h/e)*(h/e));e=mask;j=0;for(h=1;h<e.length;h++)j+=Math.abs(e[h]);j=2*j+Math.abs(e[0]);for(h=0;h<e.length;h++)e[h]/=j;tmp=[];d(c.data,tmp,e,f,g);d(tmp,c.data,e,g,f);a.clearRect(0,0,f,g);a.putImageData(c,0,0)}};a.Element.filter.prototype=
+new a.Element.feGaussianBlur;a.Element.title=function(){};a.Element.title.prototype=new a.Element.ElementBase;a.Element.desc=function(){};a.Element.desc.prototype=new a.Element.ElementBase;a.Element.MISSING=function(a){console.log("ERROR: Element '"+a.nodeName+"' not yet implemented.")};a.Element.MISSING.prototype=new a.Element.ElementBase;a.CreateElement=function(c){var d=c.nodeName.replace(/^[^:]+:/,""),d=d.replace(/\-/g,""),b=null,b=typeof a.Element[d]!="undefined"?new a.Element[d](c):new a.Element.MISSING(c);
+b.type=c.nodeName;return b};a.load=function(c,d){a.loadXml(c,a.ajax(d))};a.loadXml=function(c,d){a.loadXmlDoc(c,a.parseXml(d))};a.loadXmlDoc=function(c,d){a.init(c);var b=function(a){for(var b=c.canvas;b;)a.x-=b.offsetLeft,a.y-=b.offsetTop,b=b.offsetParent;window.scrollX&&(a.x+=window.scrollX);window.scrollY&&(a.y+=window.scrollY);return a};if(a.opts.ignoreMouse!=!0)c.canvas.onclick=function(c){c=b(new a.Point(c!=null?c.clientX:event.clientX,c!=null?c.clientY:event.clientY));a.Mouse.onclick(c.x,c.y)},
+c.canvas.onmousemove=function(c){c=b(new a.Point(c!=null?c.clientX:event.clientX,c!=null?c.clientY:event.clientY));a.Mouse.onmousemove(c.x,c.y)};var k=a.CreateElement(d.documentElement),e=k.root=!0,f=function(){a.ViewPort.Clear();c.canvas.parentNode&&a.ViewPort.SetCurrent(c.canvas.parentNode.clientWidth,c.canvas.parentNode.clientHeight);if(a.opts.ignoreDimensions!=!0){if(k.style("width").hasValue())c.canvas.width=k.style("width").Length.toPixels("x"),c.canvas.style.width=c.canvas.width+"px";if(k.style("height").hasValue())c.canvas.height=
+k.style("height").Length.toPixels("y"),c.canvas.style.height=c.canvas.height+"px"}var b=c.canvas.clientWidth||c.canvas.width,d=c.canvas.clientHeight||c.canvas.height;a.ViewPort.SetCurrent(b,d);if(a.opts!=null&&a.opts.offsetX!=null)k.attribute("x",!0).value=a.opts.offsetX;if(a.opts!=null&&a.opts.offsetY!=null)k.attribute("y",!0).value=a.opts.offsetY;if(a.opts!=null&&a.opts.scaleWidth!=null&&a.opts.scaleHeight!=null){var f=1,g=1;k.attribute("width").hasValue()&&(f=k.attribute("width").Length.toPixels("x")/
+a.opts.scaleWidth);k.attribute("height").hasValue()&&(g=k.attribute("height").Length.toPixels("y")/a.opts.scaleHeight);k.attribute("width",!0).value=a.opts.scaleWidth;k.attribute("height",!0).value=a.opts.scaleHeight;k.attribute("viewBox",!0).value="0 0 "+b*f+" "+d*g;k.attribute("preserveAspectRatio",!0).value="none"}a.opts.ignoreClear!=!0&&c.clearRect(0,0,b,d);k.render(c);e&&(e=!1,a.opts!=null&&typeof a.opts.renderCallback=="function"&&a.opts.renderCallback())},g=!0;a.ImagesLoaded()&&(g=!1,f());
+a.intervalID=setInterval(function(){var b=!1;g&&a.ImagesLoaded()&&(g=!1,b=!0);a.opts.ignoreMouse!=!0&&(b|=a.Mouse.hasEvents());if(a.opts.ignoreAnimation!=!0)for(var c=0;c<a.Animations.length;c++)b|=a.Animations[c].update(1E3/a.FRAMERATE);a.opts!=null&&typeof a.opts.forceRedraw=="function"&&a.opts.forceRedraw()==!0&&(b=!0);b&&(f(),a.Mouse.runEvents())},1E3/a.FRAMERATE)};a.stop=function(){a.intervalID&&clearInterval(a.intervalID)};a.Mouse=new function(){this.events=[];this.hasEvents=function(){return this.events.length!=
+0};this.onclick=function(a,d){this.events.push({type:"onclick",x:a,y:d,run:function(a){if(a.onclick)a.onclick()}})};this.onmousemove=function(a,d){this.events.push({type:"onmousemove",x:a,y:d,run:function(a){if(a.onmousemove)a.onmousemove()}})};this.eventElements=[];this.checkPath=function(a,d){for(var b=0;b<this.events.length;b++){var k=this.events[b];d.isPointInPath&&d.isPointInPath(k.x,k.y)&&(this.eventElements[b]=a)}};this.checkBoundingBox=function(a,d){for(var b=0;b<this.events.length;b++){var k=
+this.events[b];d.isPointInBox(k.x,k.y)&&(this.eventElements[b]=a)}};this.runEvents=function(){a.ctx.canvas.style.cursor="";for(var c=0;c<this.events.length;c++)for(var d=this.events[c],b=this.eventElements[c];b;)d.run(b),b=b.parent;this.events=[];this.eventElements=[]}};return a}this.canvg=function(a,c,d){if(a==null&&c==null&&d==null)for(var c=document.getElementsByTagName("svg"),b=0;b<c.length;b++){a=c[b];d=document.createElement("canvas");d.width=a.clientWidth;d.height=a.clientHeight;a.parentNode.insertBefore(d,
+a);a.parentNode.removeChild(a);var k=document.createElement("div");k.appendChild(a);canvg(d,k.innerHTML)}else d=d||{},typeof a=="string"&&(a=document.getElementById(a)),a.svg==null?(b=m(),a.svg=b):(b=a.svg,b.stop()),b.opts=d,a=a.getContext("2d"),typeof c.documentElement!="undefined"?b.loadXmlDoc(a,c):c.substr(0,1)=="<"?b.loadXml(a,c):b.load(a,c)}})();
+if(CanvasRenderingContext2D)CanvasRenderingContext2D.prototype.drawSvg=function(m,a,c,d,b){canvg(this.canvas,m,{ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0,ignoreClear:!0,offsetX:a,offsetY:c,scaleWidth:d,scaleHeight:b})};
+(function(m){var a=m.css,c=m.CanVGRenderer,d=m.SVGRenderer,b=m.extend,k=m.merge,e=m.addEvent,f=m.createElement,g=m.discardElement;b(c.prototype,d.prototype);b(c.prototype,{create:function(a,b,c,d){this.setContainer(b,c,d);this.configure(a)},setContainer:function(a,b,c){var d=a.style,e=a.parentNode,g=d.left,d=d.top,k=a.offsetWidth,m=a.offsetHeight,s={visibility:"hidden",position:"absolute"};this.init.apply(this,[a,b,c]);this.canvas=f("canvas",{width:k,height:m},{position:"relative",left:g,top:d},a);
+this.ttLine=f("div",null,s,e);this.ttDiv=f("div",null,s,e);this.ttTimer=void 0;this.hiddenSvg=a=f("div",{width:k,height:m},{visibility:"hidden",left:g,top:d},e);a.appendChild(this.box)},configure:function(b){var c=this,d=b.options.tooltip,f=d.borderWidth,g=c.ttDiv,m=d.style,p=c.ttLine,t=parseInt(m.padding,10),m=k(m,{padding:t+"px","background-color":d.backgroundColor,"border-style":"solid","border-width":f+"px","border-radius":d.borderRadius+"px"});d.shadow&&(m=k(m,{"box-shadow":"1px 1px 3px gray",
+"-webkit-box-shadow":"1px 1px 3px gray"}));a(g,m);a(p,{"border-left":"1px solid darkgray"});e(b,"tooltipRefresh",function(d){var e=b.container,f=e.offsetLeft,e=e.offsetTop,k;g.innerHTML=d.text;k=b.tooltip.getPosition(g.offsetWidth,g.offsetHeight,{plotX:d.x,plotY:d.y});a(g,{visibility:"visible",left:k.x+"px",top:k.y+"px","border-color":d.borderColor});a(p,{visibility:"visible",left:f+d.x+"px",top:e+b.plotTop+"px",height:b.plotHeight+"px"});c.ttTimer!==void 0&&clearTimeout(c.ttTimer);c.ttTimer=setTimeout(function(){a(g,
+{visibility:"hidden"});a(p,{visibility:"hidden"})},3E3)})},destroy:function(){g(this.canvas);this.ttTimer!==void 0&&clearTimeout(this.ttTimer);g(this.ttLine);g(this.ttDiv);g(this.hiddenSvg);return d.prototype.destroy.apply(this)},color:function(a,b,c){a&&a.linearGradient&&(a=a.stops[a.stops.length-1][1]);return d.prototype.color.call(this,a,b,c)},draw:function(){window.canvg(this.canvas,this.hiddenSvg.innerHTML)}})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/canvas-tools.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/canvas-tools.src.js
new file mode 100644
index 0000000..2a5ed34
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/canvas-tools.src.js
@@ -0,0 +1,3113 @@
+/**
+ * @license A class to parse color values
+ * @author Stoyan Stefanov <sstoo@gmail.com>
+ * @link   http://www.phpied.com/rgb-color-parser-in-javascript/
+ * Use it if you like it
+ *
+ */
+function RGBColor(color_string)
+{
+    this.ok = false;
+
+    // strip any leading #
+    if (color_string.charAt(0) == '#') { // remove # if any
+        color_string = color_string.substr(1,6);
+    }
+
+    color_string = color_string.replace(/ /g,'');
+    color_string = color_string.toLowerCase();
+
+    // before getting into regexps, try simple matches
+    // and overwrite the input
+    var simple_colors = {
+        aliceblue: 'f0f8ff',
+        antiquewhite: 'faebd7',
+        aqua: '00ffff',
+        aquamarine: '7fffd4',
+        azure: 'f0ffff',
+        beige: 'f5f5dc',
+        bisque: 'ffe4c4',
+        black: '000000',
+        blanchedalmond: 'ffebcd',
+        blue: '0000ff',
+        blueviolet: '8a2be2',
+        brown: 'a52a2a',
+        burlywood: 'deb887',
+        cadetblue: '5f9ea0',
+        chartreuse: '7fff00',
+        chocolate: 'd2691e',
+        coral: 'ff7f50',
+        cornflowerblue: '6495ed',
+        cornsilk: 'fff8dc',
+        crimson: 'dc143c',
+        cyan: '00ffff',
+        darkblue: '00008b',
+        darkcyan: '008b8b',
+        darkgoldenrod: 'b8860b',
+        darkgray: 'a9a9a9',
+        darkgreen: '006400',
+        darkkhaki: 'bdb76b',
+        darkmagenta: '8b008b',
+        darkolivegreen: '556b2f',
+        darkorange: 'ff8c00',
+        darkorchid: '9932cc',
+        darkred: '8b0000',
+        darksalmon: 'e9967a',
+        darkseagreen: '8fbc8f',
+        darkslateblue: '483d8b',
+        darkslategray: '2f4f4f',
+        darkturquoise: '00ced1',
+        darkviolet: '9400d3',
+        deeppink: 'ff1493',
+        deepskyblue: '00bfff',
+        dimgray: '696969',
+        dodgerblue: '1e90ff',
+        feldspar: 'd19275',
+        firebrick: 'b22222',
+        floralwhite: 'fffaf0',
+        forestgreen: '228b22',
+        fuchsia: 'ff00ff',
+        gainsboro: 'dcdcdc',
+        ghostwhite: 'f8f8ff',
+        gold: 'ffd700',
+        goldenrod: 'daa520',
+        gray: '808080',
+        green: '008000',
+        greenyellow: 'adff2f',
+        honeydew: 'f0fff0',
+        hotpink: 'ff69b4',
+        indianred : 'cd5c5c',
+        indigo : '4b0082',
+        ivory: 'fffff0',
+        khaki: 'f0e68c',
+        lavender: 'e6e6fa',
+        lavenderblush: 'fff0f5',
+        lawngreen: '7cfc00',
+        lemonchiffon: 'fffacd',
+        lightblue: 'add8e6',
+        lightcoral: 'f08080',
+        lightcyan: 'e0ffff',
+        lightgoldenrodyellow: 'fafad2',
+        lightgrey: 'd3d3d3',
+        lightgreen: '90ee90',
+        lightpink: 'ffb6c1',
+        lightsalmon: 'ffa07a',
+        lightseagreen: '20b2aa',
+        lightskyblue: '87cefa',
+        lightslateblue: '8470ff',
+        lightslategray: '778899',
+        lightsteelblue: 'b0c4de',
+        lightyellow: 'ffffe0',
+        lime: '00ff00',
+        limegreen: '32cd32',
+        linen: 'faf0e6',
+        magenta: 'ff00ff',
+        maroon: '800000',
+        mediumaquamarine: '66cdaa',
+        mediumblue: '0000cd',
+        mediumorchid: 'ba55d3',
+        mediumpurple: '9370d8',
+        mediumseagreen: '3cb371',
+        mediumslateblue: '7b68ee',
+        mediumspringgreen: '00fa9a',
+        mediumturquoise: '48d1cc',
+        mediumvioletred: 'c71585',
+        midnightblue: '191970',
+        mintcream: 'f5fffa',
+        mistyrose: 'ffe4e1',
+        moccasin: 'ffe4b5',
+        navajowhite: 'ffdead',
+        navy: '000080',
+        oldlace: 'fdf5e6',
+        olive: '808000',
+        olivedrab: '6b8e23',
+        orange: 'ffa500',
+        orangered: 'ff4500',
+        orchid: 'da70d6',
+        palegoldenrod: 'eee8aa',
+        palegreen: '98fb98',
+        paleturquoise: 'afeeee',
+        palevioletred: 'd87093',
+        papayawhip: 'ffefd5',
+        peachpuff: 'ffdab9',
+        peru: 'cd853f',
+        pink: 'ffc0cb',
+        plum: 'dda0dd',
+        powderblue: 'b0e0e6',
+        purple: '800080',
+        red: 'ff0000',
+        rosybrown: 'bc8f8f',
+        royalblue: '4169e1',
+        saddlebrown: '8b4513',
+        salmon: 'fa8072',
+        sandybrown: 'f4a460',
+        seagreen: '2e8b57',
+        seashell: 'fff5ee',
+        sienna: 'a0522d',
+        silver: 'c0c0c0',
+        skyblue: '87ceeb',
+        slateblue: '6a5acd',
+        slategray: '708090',
+        snow: 'fffafa',
+        springgreen: '00ff7f',
+        steelblue: '4682b4',
+        tan: 'd2b48c',
+        teal: '008080',
+        thistle: 'd8bfd8',
+        tomato: 'ff6347',
+        turquoise: '40e0d0',
+        violet: 'ee82ee',
+        violetred: 'd02090',
+        wheat: 'f5deb3',
+        white: 'ffffff',
+        whitesmoke: 'f5f5f5',
+        yellow: 'ffff00',
+        yellowgreen: '9acd32'
+    };
+    for (var key in simple_colors) {
+        if (color_string == key) {
+            color_string = simple_colors[key];
+        }
+    }
+    // emd of simple type-in colors
+
+    // array of color definition objects
+    var color_defs = [
+        {
+            re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
+            example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],
+            process: function (bits){
+                return [
+                    parseInt(bits[1]),
+                    parseInt(bits[2]),
+                    parseInt(bits[3])
+                ];
+            }
+        },
+        {
+            re: /^(\w{2})(\w{2})(\w{2})$/,
+            example: ['#00ff00', '336699'],
+            process: function (bits){
+                return [
+                    parseInt(bits[1], 16),
+                    parseInt(bits[2], 16),
+                    parseInt(bits[3], 16)
+                ];
+            }
+        },
+        {
+            re: /^(\w{1})(\w{1})(\w{1})$/,
+            example: ['#fb0', 'f0f'],
+            process: function (bits){
+                return [
+                    parseInt(bits[1] + bits[1], 16),
+                    parseInt(bits[2] + bits[2], 16),
+                    parseInt(bits[3] + bits[3], 16)
+                ];
+            }
+        }
+    ];
+
+    // search through the definitions to find a match
+    for (var i = 0; i < color_defs.length; i++) {
+        var re = color_defs[i].re;
+        var processor = color_defs[i].process;
+        var bits = re.exec(color_string);
+        if (bits) {
+            channels = processor(bits);
+            this.r = channels[0];
+            this.g = channels[1];
+            this.b = channels[2];
+            this.ok = true;
+        }
+
+    }
+
+    // validate/cleanup values
+    this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);
+    this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);
+    this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);
+
+    // some getters
+    this.toRGB = function () {
+        return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';
+    }
+    this.toHex = function () {
+        var r = this.r.toString(16);
+        var g = this.g.toString(16);
+        var b = this.b.toString(16);
+        if (r.length == 1) r = '0' + r;
+        if (g.length == 1) g = '0' + g;
+        if (b.length == 1) b = '0' + b;
+        return '#' + r + g + b;
+    }
+
+    // help
+    this.getHelpXML = function () {
+
+        var examples = new Array();
+        // add regexps
+        for (var i = 0; i < color_defs.length; i++) {
+            var example = color_defs[i].example;
+            for (var j = 0; j < example.length; j++) {
+                examples[examples.length] = example[j];
+            }
+        }
+        // add type-in colors
+        for (var sc in simple_colors) {
+            examples[examples.length] = sc;
+        }
+
+        var xml = document.createElement('ul');
+        xml.setAttribute('id', 'rgbcolor-examples');
+        for (var i = 0; i < examples.length; i++) {
+            try {
+                var list_item = document.createElement('li');
+                var list_color = new RGBColor(examples[i]);
+                var example_div = document.createElement('div');
+                example_div.style.cssText =
+                        'margin: 3px; '
+                        + 'border: 1px solid black; '
+                        + 'background:' + list_color.toHex() + '; '
+                        + 'color:' + list_color.toHex()
+                ;
+                example_div.appendChild(document.createTextNode('test'));
+                var list_item_value = document.createTextNode(
+                    ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()
+                );
+                list_item.appendChild(example_div);
+                list_item.appendChild(list_item_value);
+                xml.appendChild(list_item);
+
+            } catch(e){}
+        }
+        return xml;
+
+    }
+
+}
+
+/**
+ * @license canvg.js - Javascript SVG parser and renderer on Canvas
+ * MIT Licensed 
+ * Gabe Lerner (gabelerner@gmail.com)
+ * http://code.google.com/p/canvg/
+ *
+ * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/
+ *
+ */
+if(!window.console) {
+	window.console = {};
+	window.console.log = function(str) {};
+	window.console.dir = function(str) {};
+}
+
+if(!Array.prototype.indexOf){
+	Array.prototype.indexOf = function(obj){
+		for(var i=0; i<this.length; i++){
+			if(this[i]==obj){
+				return i;
+			}
+		}
+		return -1;
+	}
+}
+
+(function(){
+	// canvg(target, s)
+	// empty parameters: replace all 'svg' elements on page with 'canvas' elements
+	// target: canvas element or the id of a canvas element
+	// s: svg string, url to svg file, or xml document
+	// opts: optional hash of options
+	//		 ignoreMouse: true => ignore mouse events
+	//		 ignoreAnimation: true => ignore animations
+	//		 ignoreDimensions: true => does not try to resize canvas
+	//		 ignoreClear: true => does not clear canvas
+	//		 offsetX: int => draws at a x offset
+	//		 offsetY: int => draws at a y offset
+	//		 scaleWidth: int => scales horizontally to width
+	//		 scaleHeight: int => scales vertically to height
+	//		 renderCallback: function => will call the function after the first render is completed
+	//		 forceRedraw: function => will call the function on every frame, if it returns true, will redraw
+	this.canvg = function (target, s, opts) {
+		// no parameters
+		if (target == null && s == null && opts == null) {
+			var svgTags = document.getElementsByTagName('svg');
+			for (var i=0; i<svgTags.length; i++) {
+				var svgTag = svgTags[i];
+				var c = document.createElement('canvas');
+				c.width = svgTag.clientWidth;
+				c.height = svgTag.clientHeight;
+				svgTag.parentNode.insertBefore(c, svgTag);
+				svgTag.parentNode.removeChild(svgTag);
+				var div = document.createElement('div');
+				div.appendChild(svgTag);
+				canvg(c, div.innerHTML);
+			}
+			return;
+		}	
+		opts = opts || {};
+	
+		if (typeof target == 'string') {
+			target = document.getElementById(target);
+		}
+		
+		// reuse class per canvas
+		var svg;
+		if (target.svg == null) {
+			svg = build();
+			target.svg = svg;
+		}
+		else {
+			svg = target.svg;
+			svg.stop();
+		}
+		svg.opts = opts;
+		
+		var ctx = target.getContext('2d');
+		if (typeof(s.documentElement) != 'undefined') {
+			// load from xml doc
+			svg.loadXmlDoc(ctx, s);
+		}
+		else if (s.substr(0,1) == '<') {
+			// load from xml string
+			svg.loadXml(ctx, s);
+		}
+		else {
+			// load from url
+			svg.load(ctx, s);
+		}
+	}
+
+	function build() {
+		var svg = { };
+		
+		svg.FRAMERATE = 30;
+		svg.MAX_VIRTUAL_PIXELS = 30000;
+		
+		// globals
+		svg.init = function(ctx) {
+			svg.Definitions = {};
+			svg.Styles = {};
+			svg.Animations = [];
+			svg.Images = [];
+			svg.ctx = ctx;
+			svg.ViewPort = new (function () {
+				this.viewPorts = [];
+				this.Clear = function() { this.viewPorts = []; }
+				this.SetCurrent = function(width, height) { this.viewPorts.push({ width: width, height: height }); }
+				this.RemoveCurrent = function() { this.viewPorts.pop(); }
+				this.Current = function() { return this.viewPorts[this.viewPorts.length - 1]; }
+				this.width = function() { return this.Current().width; }
+				this.height = function() { return this.Current().height; }
+				this.ComputeSize = function(d) {
+					if (d != null && typeof(d) == 'number') return d;
+					if (d == 'x') return this.width();
+					if (d == 'y') return this.height();
+					return Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2);			
+				}
+			});
+		}
+		svg.init();
+		
+		// images loaded
+		svg.ImagesLoaded = function() { 
+			for (var i=0; i<svg.Images.length; i++) {
+				if (!svg.Images[i].loaded) return false;
+			}
+			return true;
+		}
+
+		// trim
+		svg.trim = function(s) { return s.replace(/^\s+|\s+$/g, ''); }
+		
+		// compress spaces
+		svg.compressSpaces = function(s) { return s.replace(/[\s\r\t\n]+/gm,' '); }
+		
+		// ajax
+		svg.ajax = function(url) {
+			var AJAX;
+			if(window.XMLHttpRequest){AJAX=new XMLHttpRequest();}
+			else{AJAX=new ActiveXObject('Microsoft.XMLHTTP');}
+			if(AJAX){
+			   AJAX.open('GET',url,false);
+			   AJAX.send(null);
+			   return AJAX.responseText;
+			}
+			return null;
+		} 
+		
+		// parse xml
+		svg.parseXml = function(xml) {
+			if (window.DOMParser)
+			{
+				var parser = new DOMParser();
+				return parser.parseFromString(xml, 'text/xml');
+			}
+			else 
+			{
+				xml = xml.replace(/<!DOCTYPE svg[^>]*>/, '');
+				var xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
+				xmlDoc.async = 'false';
+				xmlDoc.loadXML(xml); 
+				return xmlDoc;
+			}		
+		}
+		
+		svg.Property = function(name, value) {
+			this.name = name;
+			this.value = value;
+			
+			this.hasValue = function() {
+				return (this.value != null && this.value !== '');
+			}
+							
+			// return the numerical value of the property
+			this.numValue = function() {
+				if (!this.hasValue()) return 0;
+				
+				var n = parseFloat(this.value);
+				if ((this.value + '').match(/%$/)) {
+					n = n / 100.0;
+				}
+				return n;
+			}
+			
+			this.valueOrDefault = function(def) {
+				if (this.hasValue()) return this.value;
+				return def;
+			}
+			
+			this.numValueOrDefault = function(def) {
+				if (this.hasValue()) return this.numValue();
+				return def;
+			}
+			
+			/* EXTENSIONS */
+			var that = this;
+			
+			// color extensions
+			this.Color = {
+				// augment the current color value with the opacity
+				addOpacity: function(opacity) {
+					var newValue = that.value;
+					if (opacity != null && opacity != '') {
+						var color = new RGBColor(that.value);
+						if (color.ok) {
+							newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacity + ')';
+						}
+					}
+					return new svg.Property(that.name, newValue);
+				}
+			}
+			
+			// definition extensions
+			this.Definition = {
+				// get the definition from the definitions table
+				getDefinition: function() {
+					var name = that.value.replace(/^(url\()?#([^\)]+)\)?$/, '$2');
+					return svg.Definitions[name];
+				},
+				
+				isUrl: function() {
+					return that.value.indexOf('url(') == 0
+				},
+				
+				getFillStyle: function(e) {
+					var def = this.getDefinition();
+					
+					// gradient
+					if (def != null && def.createGradient) {
+						return def.createGradient(svg.ctx, e);
+					}
+					
+					// pattern
+					if (def != null && def.createPattern) {
+						return def.createPattern(svg.ctx, e);
+					}
+					
+					return null;
+				}
+			}
+			
+			// length extensions
+			this.Length = {
+				DPI: function(viewPort) {
+					return 96.0; // : compute?
+				},
+				
+				EM: function(viewPort) {
+					var em = 12;
+					
+					var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);
+					if (fontSize.hasValue()) em = fontSize.Length.toPixels(viewPort);
+					
+					return em;
+				},
+			
+				// get the length as pixels
+				toPixels: function(viewPort) {
+					if (!that.hasValue()) return 0;
+					var s = that.value+'';
+					if (s.match(/em$/)) return that.numValue() * this.EM(viewPort);
+					if (s.match(/ex$/)) return that.numValue() * this.EM(viewPort) / 2.0;
+					if (s.match(/px$/)) return that.numValue();
+					if (s.match(/pt$/)) return that.numValue() * 1.25;
+					if (s.match(/pc$/)) return that.numValue() * 15;
+					if (s.match(/cm$/)) return that.numValue() * this.DPI(viewPort) / 2.54;
+					if (s.match(/mm$/)) return that.numValue() * this.DPI(viewPort) / 25.4;
+					if (s.match(/in$/)) return that.numValue() * this.DPI(viewPort);
+					if (s.match(/%$/)) return that.numValue() * svg.ViewPort.ComputeSize(viewPort);
+					return that.numValue();
+				}
+			}
+			
+			// time extensions
+			this.Time = {
+				// get the time as milliseconds
+				toMilliseconds: function() {
+					if (!that.hasValue()) return 0;
+					var s = that.value+'';
+					if (s.match(/s$/)) return that.numValue() * 1000;
+					if (s.match(/ms$/)) return that.numValue();
+					return that.numValue();
+				}
+			}
+			
+			// angle extensions
+			this.Angle = {
+				// get the angle as radians
+				toRadians: function() {
+					if (!that.hasValue()) return 0;
+					var s = that.value+'';
+					if (s.match(/deg$/)) return that.numValue() * (Math.PI / 180.0);
+					if (s.match(/grad$/)) return that.numValue() * (Math.PI / 200.0);
+					if (s.match(/rad$/)) return that.numValue();
+					return that.numValue() * (Math.PI / 180.0);
+				}
+			}
+		}
+		
+		// fonts
+		svg.Font = new (function() {
+			this.Styles = ['normal','italic','oblique','inherit'];
+			this.Variants = ['normal','small-caps','inherit'];
+			this.Weights = ['normal','bold','bolder','lighter','100','200','300','400','500','600','700','800','900','inherit'];
+			
+			this.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) { 
+				var f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font);
+				return { 
+					fontFamily: fontFamily || f.fontFamily, 
+					fontSize: fontSize || f.fontSize, 
+					fontStyle: fontStyle || f.fontStyle, 
+					fontWeight: fontWeight || f.fontWeight, 
+					fontVariant: fontVariant || f.fontVariant,
+					toString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') } 
+				} 
+			}
+			
+			var that = this;
+			this.Parse = function(s) {
+				var f = {};
+				var d = svg.trim(svg.compressSpaces(s || '')).split(' ');
+				var set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false }
+				var ff = '';
+				for (var i=0; i<d.length; i++) {
+					if (!set.fontStyle && that.Styles.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontStyle = d[i]; set.fontStyle = true; }
+					else if (!set.fontVariant && that.Variants.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontVariant = d[i]; set.fontStyle = set.fontVariant = true;	}
+					else if (!set.fontWeight && that.Weights.indexOf(d[i]) != -1) {	if (d[i] != 'inherit') f.fontWeight = d[i]; set.fontStyle = set.fontVariant = set.fontWeight = true; }
+					else if (!set.fontSize) { if (d[i] != 'inherit') f.fontSize = d[i].split('/')[0]; set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; }
+					else { if (d[i] != 'inherit') ff += d[i]; }
+				} if (ff != '') f.fontFamily = ff;
+				return f;
+			}
+		});
+		
+		// points and paths
+		svg.ToNumberArray = function(s) {
+			var a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' ');
+			for (var i=0; i<a.length; i++) {
+				a[i] = parseFloat(a[i]);
+			}
+			return a;
+		}		
+		svg.Point = function(x, y) {
+			this.x = x;
+			this.y = y;
+			
+			this.angleTo = function(p) {
+				return Math.atan2(p.y - this.y, p.x - this.x);
+			}
+			
+			this.applyTransform = function(v) {
+				var xp = this.x * v[0] + this.y * v[2] + v[4];
+				var yp = this.x * v[1] + this.y * v[3] + v[5];
+				this.x = xp;
+				this.y = yp;
+			}
+		}
+		svg.CreatePoint = function(s) {
+			var a = svg.ToNumberArray(s);
+			return new svg.Point(a[0], a[1]);
+		}
+		svg.CreatePath = function(s) {
+			var a = svg.ToNumberArray(s);
+			var path = [];
+			for (var i=0; i<a.length; i+=2) {
+				path.push(new svg.Point(a[i], a[i+1]));
+			}
+			return path;
+		}
+		
+		// bounding box
+		svg.BoundingBox = function(x1, y1, x2, y2) { // pass in initial points if you want
+			this.x1 = Number.NaN;
+			this.y1 = Number.NaN;
+			this.x2 = Number.NaN;
+			this.y2 = Number.NaN;
+			
+			this.x = function() { return this.x1; }
+			this.y = function() { return this.y1; }
+			this.width = function() { return this.x2 - this.x1; }
+			this.height = function() { return this.y2 - this.y1; }
+			
+			this.addPoint = function(x, y) {	
+				if (x != null) {
+					if (isNaN(this.x1) || isNaN(this.x2)) {
+						this.x1 = x;
+						this.x2 = x;
+					}
+					if (x < this.x1) this.x1 = x;
+					if (x > this.x2) this.x2 = x;
+				}
+			
+				if (y != null) {
+					if (isNaN(this.y1) || isNaN(this.y2)) {
+						this.y1 = y;
+						this.y2 = y;
+					}
+					if (y < this.y1) this.y1 = y;
+					if (y > this.y2) this.y2 = y;
+				}
+			}			
+			this.addX = function(x) { this.addPoint(x, null); }
+			this.addY = function(y) { this.addPoint(null, y); }
+			
+			this.addBoundingBox = function(bb) {
+				this.addPoint(bb.x1, bb.y1);
+				this.addPoint(bb.x2, bb.y2);
+			}
+			
+			this.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) {
+				var cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)
+				var cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)
+				var cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)
+				var cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)
+				this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y,	cp2y, p2x, p2y);
+			}
+			
+			this.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {
+				// from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html
+				var p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y];
+				this.addPoint(p0[0], p0[1]);
+				this.addPoint(p3[0], p3[1]);
+				
+				for (i=0; i<=1; i++) {
+					var f = function(t) { 
+						return Math.pow(1-t, 3) * p0[i]
+						+ 3 * Math.pow(1-t, 2) * t * p1[i]
+						+ 3 * (1-t) * Math.pow(t, 2) * p2[i]
+						+ Math.pow(t, 3) * p3[i];
+					}
+					
+					var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];
+					var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];
+					var c = 3 * p1[i] - 3 * p0[i];
+					
+					if (a == 0) {
+						if (b == 0) continue;
+						var t = -c / b;
+						if (0 < t && t < 1) {
+							if (i == 0) this.addX(f(t));
+							if (i == 1) this.addY(f(t));
+						}
+						continue;
+					}
+					
+					var b2ac = Math.pow(b, 2) - 4 * c * a;
+					if (b2ac < 0) continue;
+					var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);
+					if (0 < t1 && t1 < 1) {
+						if (i == 0) this.addX(f(t1));
+						if (i == 1) this.addY(f(t1));
+					}
+					var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);
+					if (0 < t2 && t2 < 1) {
+						if (i == 0) this.addX(f(t2));
+						if (i == 1) this.addY(f(t2));
+					}
+				}
+			}
+			
+			this.isPointInBox = function(x, y) {
+				return (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2);
+			}
+			
+			this.addPoint(x1, y1);
+			this.addPoint(x2, y2);
+		}
+		
+		// transforms
+		svg.Transform = function(v) {	
+			var that = this;
+			this.Type = {}
+		
+			// translate
+			this.Type.translate = function(s) {
+				this.p = svg.CreatePoint(s);			
+				this.apply = function(ctx) {
+					ctx.translate(this.p.x || 0.0, this.p.y || 0.0);
+				}
+				this.applyToPoint = function(p) {
+					p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);
+				}
+			}
+			
+			// rotate
+			this.Type.rotate = function(s) {
+				var a = svg.ToNumberArray(s);
+				this.angle = new svg.Property('angle', a[0]);
+				this.cx = a[1] || 0;
+				this.cy = a[2] || 0;
+				this.apply = function(ctx) {
+					ctx.translate(this.cx, this.cy);
+					ctx.rotate(this.angle.Angle.toRadians());
+					ctx.translate(-this.cx, -this.cy);
+				}
+				this.applyToPoint = function(p) {
+					var a = this.angle.Angle.toRadians();
+					p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);
+					p.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);
+					p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]);
+				}			
+			}
+			
+			this.Type.scale = function(s) {
+				this.p = svg.CreatePoint(s);
+				this.apply = function(ctx) {
+					ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0);
+				}
+				this.applyToPoint = function(p) {
+					p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]);
+				}				
+			}
+			
+			this.Type.matrix = function(s) {
+				this.m = svg.ToNumberArray(s);
+				this.apply = function(ctx) {
+					ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]);
+				}
+				this.applyToPoint = function(p) {
+					p.applyTransform(this.m);
+				}					
+			}
+			
+			this.Type.SkewBase = function(s) {
+				this.base = that.Type.matrix;
+				this.base(s);
+				this.angle = new svg.Property('angle', s);
+			}
+			this.Type.SkewBase.prototype = new this.Type.matrix;
+			
+			this.Type.skewX = function(s) {
+				this.base = that.Type.SkewBase;
+				this.base(s);
+				this.m = [1, 0, Math.tan(this.angle.Angle.toRadians()), 1, 0, 0];
+			}
+			this.Type.skewX.prototype = new this.Type.SkewBase;
+			
+			this.Type.skewY = function(s) {
+				this.base = that.Type.SkewBase;
+				this.base(s);
+				this.m = [1, Math.tan(this.angle.Angle.toRadians()), 0, 1, 0, 0];
+			}
+			this.Type.skewY.prototype = new this.Type.SkewBase;
+		
+			this.transforms = [];
+			
+			this.apply = function(ctx) {
+				for (var i=0; i<this.transforms.length; i++) {
+					this.transforms[i].apply(ctx);
+				}
+			}
+			
+			this.applyToPoint = function(p) {
+				for (var i=0; i<this.transforms.length; i++) {
+					this.transforms[i].applyToPoint(p);
+				}
+			}
+			
+			var data = svg.trim(svg.compressSpaces(v)).split(/\s(?=[a-z])/);
+			for (var i=0; i<data.length; i++) {
+				var type = data[i].split('(')[0];
+				var s = data[i].split('(')[1].replace(')','');
+				var transform = new this.Type[type](s);
+				this.transforms.push(transform);
+			}
+		}
+		
+		// aspect ratio
+		svg.AspectRatio = function(ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) {
+			// aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute
+			aspectRatio = svg.compressSpaces(aspectRatio);
+			aspectRatio = aspectRatio.replace(/^defer\s/,''); // ignore defer
+			var align = aspectRatio.split(' ')[0] || 'xMidYMid';
+			var meetOrSlice = aspectRatio.split(' ')[1] || 'meet';					
+	
+			// calculate scale
+			var scaleX = width / desiredWidth;
+			var scaleY = height / desiredHeight;
+			var scaleMin = Math.min(scaleX, scaleY);
+			var scaleMax = Math.max(scaleX, scaleY);
+			if (meetOrSlice == 'meet') { desiredWidth *= scaleMin; desiredHeight *= scaleMin; }
+			if (meetOrSlice == 'slice') { desiredWidth *= scaleMax; desiredHeight *= scaleMax; }	
+			
+			refX = new svg.Property('refX', refX);
+			refY = new svg.Property('refY', refY);
+			if (refX.hasValue() && refY.hasValue()) {				
+				ctx.translate(-scaleMin * refX.Length.toPixels('x'), -scaleMin * refY.Length.toPixels('y'));
+			} 
+			else {					
+				// align
+				if (align.match(/^xMid/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width / 2.0 - desiredWidth / 2.0, 0); 
+				if (align.match(/YMid$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height / 2.0 - desiredHeight / 2.0); 
+				if (align.match(/^xMax/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width - desiredWidth, 0); 
+				if (align.match(/YMax$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height - desiredHeight); 
+			}
+			
+			// scale
+			if (align == 'none') ctx.scale(scaleX, scaleY);
+			else if (meetOrSlice == 'meet') ctx.scale(scaleMin, scaleMin); 
+			else if (meetOrSlice == 'slice') ctx.scale(scaleMax, scaleMax); 	
+			
+			// translate
+			ctx.translate(minX == null ? 0 : -minX, minY == null ? 0 : -minY);			
+		}
+		
+		// elements
+		svg.Element = {}
+		
+		svg.Element.ElementBase = function(node) {	
+			this.attributes = {};
+			this.styles = {};
+			this.children = [];
+			
+			// get or create attribute
+			this.attribute = function(name, createIfNotExists) {
+				var a = this.attributes[name];
+				if (a != null) return a;
+							
+				a = new svg.Property(name, '');
+				if (createIfNotExists == true) this.attributes[name] = a;
+				return a;
+			}
+			
+			// get or create style, crawls up node tree
+			this.style = function(name, createIfNotExists) {
+				var s = this.styles[name];
+				if (s != null) return s;
+				
+				var a = this.attribute(name);
+				if (a != null && a.hasValue()) {
+					return a;
+				}
+				
+				var p = this.parent;
+				if (p != null) {
+					var ps = p.style(name);
+					if (ps != null && ps.hasValue()) {
+						return ps;
+					}
+				}
+					
+				s = new svg.Property(name, '');
+				if (createIfNotExists == true) this.styles[name] = s;
+				return s;
+			}
+			
+			// base render
+			this.render = function(ctx) {
+				// don't render display=none
+				if (this.style('display').value == 'none') return;
+				
+				// don't render visibility=hidden
+				if (this.attribute('visibility').value == 'hidden') return;
+			
+				ctx.save();
+					this.setContext(ctx);
+						// mask
+						if (this.attribute('mask').hasValue()) {
+							var mask = this.attribute('mask').Definition.getDefinition();
+							if (mask != null) mask.apply(ctx, this);
+						}
+						else if (this.style('filter').hasValue()) {
+							var filter = this.style('filter').Definition.getDefinition();
+							if (filter != null) filter.apply(ctx, this);
+						}
+						else this.renderChildren(ctx);				
+					this.clearContext(ctx);
+				ctx.restore();
+			}
+			
+			// base set context
+			this.setContext = function(ctx) {
+				// OVERRIDE ME!
+			}
+			
+			// base clear context
+			this.clearContext = function(ctx) {
+				// OVERRIDE ME!
+			}			
+			
+			// base render children
+			this.renderChildren = function(ctx) {
+				for (var i=0; i<this.children.length; i++) {
+					this.children[i].render(ctx);
+				}
+			}
+			
+			this.addChild = function(childNode, create) {
+				var child = childNode;
+				if (create) child = svg.CreateElement(childNode);
+				child.parent = this;
+				this.children.push(child);			
+			}
+				
+			if (node != null && node.nodeType == 1) { //ELEMENT_NODE
+				// add children
+				for (var i=0; i<node.childNodes.length; i++) {
+					var childNode = node.childNodes[i];
+					if (childNode.nodeType == 1) this.addChild(childNode, true); //ELEMENT_NODE
+				}
+				
+				// add attributes
+				for (var i=0; i<node.attributes.length; i++) {
+					var attribute = node.attributes[i];
+					this.attributes[attribute.nodeName] = new svg.Property(attribute.nodeName, attribute.nodeValue);
+				}
+										
+				// add tag styles
+				var styles = svg.Styles[node.nodeName];
+				if (styles != null) {
+					for (var name in styles) {
+						this.styles[name] = styles[name];
+					}
+				}					
+				
+				// add class styles
+				if (this.attribute('class').hasValue()) {
+					var classes = svg.compressSpaces(this.attribute('class').value).split(' ');
+					for (var j=0; j<classes.length; j++) {
+						styles = svg.Styles['.'+classes[j]];
+						if (styles != null) {
+							for (var name in styles) {
+								this.styles[name] = styles[name];
+							}
+						}
+						styles = svg.Styles[node.nodeName+'.'+classes[j]];
+						if (styles != null) {
+							for (var name in styles) {
+								this.styles[name] = styles[name];
+							}
+						}
+					}
+				}
+				
+				// add inline styles
+				if (this.attribute('style').hasValue()) {
+					var styles = this.attribute('style').value.split(';');
+					for (var i=0; i<styles.length; i++) {
+						if (svg.trim(styles[i]) != '') {
+							var style = styles[i].split(':');
+							var name = svg.trim(style[0]);
+							var value = svg.trim(style[1]);
+							this.styles[name] = new svg.Property(name, value);
+						}
+					}
+				}	
+
+				// add id
+				if (this.attribute('id').hasValue()) {
+					if (svg.Definitions[this.attribute('id').value] == null) {
+						svg.Definitions[this.attribute('id').value] = this;
+					}
+				}
+			}
+		}
+		
+		svg.Element.RenderedElementBase = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.setContext = function(ctx) {
+				// fill
+				if (this.style('fill').Definition.isUrl()) {
+					var fs = this.style('fill').Definition.getFillStyle(this);
+					if (fs != null) ctx.fillStyle = fs;
+				}
+				else if (this.style('fill').hasValue()) {
+					var fillStyle = this.style('fill');
+					if (this.style('fill-opacity').hasValue()) fillStyle = fillStyle.Color.addOpacity(this.style('fill-opacity').value);
+					ctx.fillStyle = (fillStyle.value == 'none' ? 'rgba(0,0,0,0)' : fillStyle.value);
+				}
+									
+				// stroke
+				if (this.style('stroke').Definition.isUrl()) {
+					var fs = this.style('stroke').Definition.getFillStyle(this);
+					if (fs != null) ctx.strokeStyle = fs;
+				}
+				else if (this.style('stroke').hasValue()) {
+					var strokeStyle = this.style('stroke');
+					if (this.style('stroke-opacity').hasValue()) strokeStyle = strokeStyle.Color.addOpacity(this.style('stroke-opacity').value);
+					ctx.strokeStyle = (strokeStyle.value == 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value);
+				}
+				if (this.style('stroke-width').hasValue()) ctx.lineWidth = this.style('stroke-width').Length.toPixels();
+				if (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value;
+				if (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value;
+				if (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value;
+
+				// font
+				if (typeof(ctx.font) != 'undefined') {
+					ctx.font = svg.Font.CreateFont( 
+						this.style('font-style').value, 
+						this.style('font-variant').value, 
+						this.style('font-weight').value, 
+						this.style('font-size').hasValue() ? this.style('font-size').Length.toPixels() + 'px' : '', 
+						this.style('font-family').value).toString();
+				}
+				
+				// transform
+				if (this.attribute('transform').hasValue()) { 
+					var transform = new svg.Transform(this.attribute('transform').value);
+					transform.apply(ctx);
+				}
+				
+				// clip
+				if (this.attribute('clip-path').hasValue()) {
+					var clip = this.attribute('clip-path').Definition.getDefinition();
+					if (clip != null) clip.apply(ctx);
+				}
+				
+				// opacity
+				if (this.style('opacity').hasValue()) {
+					ctx.globalAlpha = this.style('opacity').numValue();
+				}
+			}		
+		}
+		svg.Element.RenderedElementBase.prototype = new svg.Element.ElementBase;
+		
+		svg.Element.PathElementBase = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				if (ctx != null) ctx.beginPath();
+				return new svg.BoundingBox();
+			}
+			
+			this.renderChildren = function(ctx) {
+				this.path(ctx);
+				svg.Mouse.checkPath(this, ctx);
+				if (ctx.fillStyle != '') ctx.fill();
+				if (ctx.strokeStyle != '') ctx.stroke();
+				
+				var markers = this.getMarkers();
+				if (markers != null) {
+					if (this.style('marker-start').Definition.isUrl()) {
+						var marker = this.style('marker-start').Definition.getDefinition();
+						marker.render(ctx, markers[0][0], markers[0][1]);
+					}
+					if (this.style('marker-mid').Definition.isUrl()) {
+						var marker = this.style('marker-mid').Definition.getDefinition();
+						for (var i=1;i<markers.length-1;i++) {
+							marker.render(ctx, markers[i][0], markers[i][1]);
+						}
+					}
+					if (this.style('marker-end').Definition.isUrl()) {
+						var marker = this.style('marker-end').Definition.getDefinition();
+						marker.render(ctx, markers[markers.length-1][0], markers[markers.length-1][1]);
+					}
+				}					
+			}
+			
+			this.getBoundingBox = function() {
+				return this.path();
+			}
+			
+			this.getMarkers = function() {
+				return null;
+			}
+		}
+		svg.Element.PathElementBase.prototype = new svg.Element.RenderedElementBase;
+		
+		// svg element
+		svg.Element.svg = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.baseClearContext = this.clearContext;
+			this.clearContext = function(ctx) {
+				this.baseClearContext(ctx);
+				svg.ViewPort.RemoveCurrent();
+			}
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {
+				// initial values
+				ctx.strokeStyle = 'rgba(0,0,0,0)';
+				ctx.lineCap = 'butt';
+				ctx.lineJoin = 'miter';
+				ctx.miterLimit = 4;			
+			
+				this.baseSetContext(ctx);
+				
+				// create new view port
+				if (this.attribute('x').hasValue() && this.attribute('y').hasValue()) {
+					ctx.translate(this.attribute('x').Length.toPixels('x'), this.attribute('y').Length.toPixels('y'));
+				}
+				
+				var width = svg.ViewPort.width();
+				var height = svg.ViewPort.height();
+				if (typeof(this.root) == 'undefined' && this.attribute('width').hasValue() && this.attribute('height').hasValue()) {
+					width = this.attribute('width').Length.toPixels('x');
+					height = this.attribute('height').Length.toPixels('y');
+					
+					var x = 0;
+					var y = 0;
+					if (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) {
+						x = -this.attribute('refX').Length.toPixels('x');
+						y = -this.attribute('refY').Length.toPixels('y');
+					}
+					
+					ctx.beginPath();
+					ctx.moveTo(x, y);
+					ctx.lineTo(width, y);
+					ctx.lineTo(width, height);
+					ctx.lineTo(x, height);
+					ctx.closePath();
+					ctx.clip();
+				}
+				svg.ViewPort.SetCurrent(width, height);	
+						
+				// viewbox
+				if (this.attribute('viewBox').hasValue()) {				
+					var viewBox = svg.ToNumberArray(this.attribute('viewBox').value);
+					var minX = viewBox[0];
+					var minY = viewBox[1];
+					width = viewBox[2];
+					height = viewBox[3];
+					
+					svg.AspectRatio(ctx,
+									this.attribute('preserveAspectRatio').value, 
+									svg.ViewPort.width(), 
+									width,
+									svg.ViewPort.height(),
+									height,
+									minX,
+									minY,
+									this.attribute('refX').value,
+									this.attribute('refY').value);
+										
+					svg.ViewPort.RemoveCurrent();	
+					svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);						
+				}				
+			}
+		}
+		svg.Element.svg.prototype = new svg.Element.RenderedElementBase;
+
+		// rect element
+		svg.Element.rect = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');
+				var rx = this.attribute('rx').Length.toPixels('x');
+				var ry = this.attribute('ry').Length.toPixels('y');
+				if (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx;
+				if (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry;
+				
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(x + rx, y);
+					ctx.lineTo(x + width - rx, y);
+					ctx.quadraticCurveTo(x + width, y, x + width, y + ry)
+					ctx.lineTo(x + width, y + height - ry);
+					ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height)
+					ctx.lineTo(x + rx, y + height);
+					ctx.quadraticCurveTo(x, y + height, x, y + height - ry)
+					ctx.lineTo(x, y + ry);
+					ctx.quadraticCurveTo(x, y, x + rx, y)
+					ctx.closePath();
+				}
+				
+				return new svg.BoundingBox(x, y, x + width, y + height);
+			}
+		}
+		svg.Element.rect.prototype = new svg.Element.PathElementBase;
+		
+		// circle element
+		svg.Element.circle = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				var cx = this.attribute('cx').Length.toPixels('x');
+				var cy = this.attribute('cy').Length.toPixels('y');
+				var r = this.attribute('r').Length.toPixels();
+			
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.arc(cx, cy, r, 0, Math.PI * 2, true); 
+					ctx.closePath();
+				}
+				
+				return new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r);
+			}
+		}
+		svg.Element.circle.prototype = new svg.Element.PathElementBase;	
+
+		// ellipse element
+		svg.Element.ellipse = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);
+				var rx = this.attribute('rx').Length.toPixels('x');
+				var ry = this.attribute('ry').Length.toPixels('y');
+				var cx = this.attribute('cx').Length.toPixels('x');
+				var cy = this.attribute('cy').Length.toPixels('y');
+				
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(cx, cy - ry);
+					ctx.bezierCurveTo(cx + (KAPPA * rx), cy - ry,  cx + rx, cy - (KAPPA * ry), cx + rx, cy);
+					ctx.bezierCurveTo(cx + rx, cy + (KAPPA * ry), cx + (KAPPA * rx), cy + ry, cx, cy + ry);
+					ctx.bezierCurveTo(cx - (KAPPA * rx), cy + ry, cx - rx, cy + (KAPPA * ry), cx - rx, cy);
+					ctx.bezierCurveTo(cx - rx, cy - (KAPPA * ry), cx - (KAPPA * rx), cy - ry, cx, cy - ry);
+					ctx.closePath();
+				}
+				
+				return new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);
+			}
+		}
+		svg.Element.ellipse.prototype = new svg.Element.PathElementBase;			
+		
+		// line element
+		svg.Element.line = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.getPoints = function() {
+				return [
+					new svg.Point(this.attribute('x1').Length.toPixels('x'), this.attribute('y1').Length.toPixels('y')),
+					new svg.Point(this.attribute('x2').Length.toPixels('x'), this.attribute('y2').Length.toPixels('y'))];
+			}
+								
+			this.path = function(ctx) {
+				var points = this.getPoints();
+				
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(points[0].x, points[0].y);
+					ctx.lineTo(points[1].x, points[1].y);
+				}
+				
+				return new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y);
+			}
+			
+			this.getMarkers = function() {
+				var points = this.getPoints();	
+				var a = points[0].angleTo(points[1]);
+				return [[points[0], a], [points[1], a]];
+			}
+		}
+		svg.Element.line.prototype = new svg.Element.PathElementBase;		
+				
+		// polyline element
+		svg.Element.polyline = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.points = svg.CreatePath(this.attribute('points').value);
+			this.path = function(ctx) {
+				var bb = new svg.BoundingBox(this.points[0].x, this.points[0].y);
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(this.points[0].x, this.points[0].y);
+				}
+				for (var i=1; i<this.points.length; i++) {
+					bb.addPoint(this.points[i].x, this.points[i].y);
+					if (ctx != null) ctx.lineTo(this.points[i].x, this.points[i].y);
+				}
+				return bb;
+			}
+			
+			this.getMarkers = function() {
+				var markers = [];
+				for (var i=0; i<this.points.length - 1; i++) {
+					markers.push([this.points[i], this.points[i].angleTo(this.points[i+1])]);
+				}
+				markers.push([this.points[this.points.length-1], markers[markers.length-1][1]]);
+				return markers;
+			}			
+		}
+		svg.Element.polyline.prototype = new svg.Element.PathElementBase;				
+				
+		// polygon element
+		svg.Element.polygon = function(node) {
+			this.base = svg.Element.polyline;
+			this.base(node);
+			
+			this.basePath = this.path;
+			this.path = function(ctx) {
+				var bb = this.basePath(ctx);
+				if (ctx != null) {
+					ctx.lineTo(this.points[0].x, this.points[0].y);
+					ctx.closePath();
+				}
+				return bb;
+			}
+		}
+		svg.Element.polygon.prototype = new svg.Element.polyline;
+
+		// path element
+		svg.Element.path = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+					
+			var d = this.attribute('d').value;
+			// TODO: convert to real lexer based on http://www.w3.org/TR/SVG11/paths.html#PathDataBNF
+			d = d.replace(/,/gm,' '); // get rid of all commas
+			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from commands
+			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from commands
+			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,'$1 $2'); // separate commands from points
+			d = d.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from points
+			d = d.replace(/([0-9])([+\-])/gm,'$1 $2'); // separate digits when no comma
+			d = d.replace(/(\.[0-9]*)(\.)/gm,'$1 $2'); // separate digits when no comma
+			d = d.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,'$1 $3 $4 '); // shorthand elliptical arc path syntax
+			d = svg.compressSpaces(d); // compress multiple spaces
+			d = svg.trim(d);
+			this.PathParser = new (function(d) {
+				this.tokens = d.split(' ');
+				
+				this.reset = function() {
+					this.i = -1;
+					this.command = '';
+					this.previousCommand = '';
+					this.start = new svg.Point(0, 0);
+					this.control = new svg.Point(0, 0);
+					this.current = new svg.Point(0, 0);
+					this.points = [];
+					this.angles = [];
+				}
+								
+				this.isEnd = function() {
+					return this.i >= this.tokens.length - 1;
+				}
+				
+				this.isCommandOrEnd = function() {
+					if (this.isEnd()) return true;
+					return this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null;
+				}
+				
+				this.isRelativeCommand = function() {
+					return this.command == this.command.toLowerCase();
+				}
+							
+				this.getToken = function() {
+					this.i = this.i + 1;
+					return this.tokens[this.i];
+				}
+				
+				this.getScalar = function() {
+					return parseFloat(this.getToken());
+				}
+				
+				this.nextCommand = function() {
+					this.previousCommand = this.command;
+					this.command = this.getToken();
+				}				
+				
+				this.getPoint = function() {
+					var p = new svg.Point(this.getScalar(), this.getScalar());
+					return this.makeAbsolute(p);
+				}
+				
+				this.getAsControlPoint = function() {
+					var p = this.getPoint();
+					this.control = p;
+					return p;
+				}
+				
+				this.getAsCurrentPoint = function() {
+					var p = this.getPoint();
+					this.current = p;
+					return p;	
+				}
+				
+				this.getReflectedControlPoint = function() {
+					if (this.previousCommand.toLowerCase() != 'c' && this.previousCommand.toLowerCase() != 's') {
+						return this.current;
+					}
+					
+					// reflect point
+					var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y);					
+					return p;
+				}
+				
+				this.makeAbsolute = function(p) {
+					if (this.isRelativeCommand()) {
+						p.x = this.current.x + p.x;
+						p.y = this.current.y + p.y;
+					}
+					return p;
+				}
+				
+				this.addMarker = function(p, from, priorTo) {
+					// if the last angle isn't filled in because we didn't have this point yet ...
+					if (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) {
+						this.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo);
+					}
+					this.addMarkerAngle(p, from == null ? null : from.angleTo(p));
+				}
+				
+				this.addMarkerAngle = function(p, a) {
+					this.points.push(p);
+					this.angles.push(a);
+				}				
+				
+				this.getMarkerPoints = function() { return this.points; }
+				this.getMarkerAngles = function() {
+					for (var i=0; i<this.angles.length; i++) {
+						if (this.angles[i] == null) {
+							for (var j=i+1; j<this.angles.length; j++) {
+								if (this.angles[j] != null) {
+									this.angles[i] = this.angles[j];
+									break;
+								}
+							}
+						}
+					}
+					return this.angles;
+				}
+			})(d);
+
+			this.path = function(ctx) {
+				var pp = this.PathParser;
+				pp.reset();
+
+				var bb = new svg.BoundingBox();
+				if (ctx != null) ctx.beginPath();
+				while (!pp.isEnd()) {
+					pp.nextCommand();
+					switch (pp.command.toUpperCase()) {
+					case 'M':
+						var p = pp.getAsCurrentPoint();
+						pp.addMarker(p);
+						bb.addPoint(p.x, p.y);
+						if (ctx != null) ctx.moveTo(p.x, p.y);
+						pp.start = pp.current;
+						while (!pp.isCommandOrEnd()) {
+							var p = pp.getAsCurrentPoint();
+							pp.addMarker(p, pp.start);
+							bb.addPoint(p.x, p.y);
+							if (ctx != null) ctx.lineTo(p.x, p.y);
+						}
+						break;
+					case 'L':
+						while (!pp.isCommandOrEnd()) {
+							var c = pp.current;
+							var p = pp.getAsCurrentPoint();
+							pp.addMarker(p, c);
+							bb.addPoint(p.x, p.y);
+							if (ctx != null) ctx.lineTo(p.x, p.y);
+						}
+						break;
+					case 'H':
+						while (!pp.isCommandOrEnd()) {
+							var newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y);
+							pp.addMarker(newP, pp.current);
+							pp.current = newP;
+							bb.addPoint(pp.current.x, pp.current.y);
+							if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);
+						}
+						break;
+					case 'V':
+						while (!pp.isCommandOrEnd()) {
+							var newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar());
+							pp.addMarker(newP, pp.current);
+							pp.current = newP;
+							bb.addPoint(pp.current.x, pp.current.y);
+							if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);
+						}
+						break;
+					case 'C':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var p1 = pp.getPoint();
+							var cntrl = pp.getAsControlPoint();
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, p1);
+							bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'S':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var p1 = pp.getReflectedControlPoint();
+							var cntrl = pp.getAsControlPoint();
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, p1);
+							bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'Q':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var cntrl = pp.getAsControlPoint();
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, cntrl);
+							bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'T':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var cntrl = pp.getReflectedControlPoint();
+							pp.control = cntrl;
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, cntrl);
+							bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'A':
+						while (!pp.isCommandOrEnd()) {
+						    var curr = pp.current;
+							var rx = pp.getScalar();
+							var ry = pp.getScalar();
+							var xAxisRotation = pp.getScalar() * (Math.PI / 180.0);
+							var largeArcFlag = pp.getScalar();
+							var sweepFlag = pp.getScalar();
+							var cp = pp.getAsCurrentPoint();
+
+							// Conversion from endpoint to center parameterization
+							// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
+							// x1', y1'
+							var currp = new svg.Point(
+								Math.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0,
+								-Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0
+							);
+							// adjust radii
+							var l = Math.pow(currp.x,2)/Math.pow(rx,2)+Math.pow(currp.y,2)/Math.pow(ry,2);
+							if (l > 1) {
+								rx *= Math.sqrt(l);
+								ry *= Math.sqrt(l);
+							}
+							// cx', cy'
+							var s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt(
+								((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) /
+								(Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2))
+							);
+							if (isNaN(s)) s = 0;
+							var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);
+							// cx, cy
+							var centp = new svg.Point(
+								(curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y,
+								(curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y
+							);
+							// vector magnitude
+							var m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); }
+							// ratio between two vectors
+							var r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) }
+							// angle between two vectors
+							var a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); }
+							// initial angle
+							var a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]);
+							// angle delta
+							var u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry];
+							var v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry];
+							var ad = a(u, v);
+							if (r(u,v) <= -1) ad = Math.PI;
+							if (r(u,v) >= 1) ad = 0;
+
+							if (sweepFlag == 0 && ad > 0) ad = ad - 2 * Math.PI;
+							if (sweepFlag == 1 && ad < 0) ad = ad + 2 * Math.PI;
+
+							// for markers
+							var halfWay = new svg.Point(
+								centp.x - rx * Math.cos((a1 + ad) / 2),
+								centp.y - ry * Math.sin((a1 + ad) / 2)
+							);
+							pp.addMarkerAngle(halfWay, (a1 + ad) / 2 + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2);
+							pp.addMarkerAngle(cp, ad + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2);
+
+							bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better
+							if (ctx != null) {
+								var r = rx > ry ? rx : ry;
+								var sx = rx > ry ? 1 : rx / ry;
+								var sy = rx > ry ? ry / rx : 1;
+
+								ctx.translate(centp.x, centp.y);
+								ctx.rotate(xAxisRotation);
+								ctx.scale(sx, sy);
+								ctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag);
+								ctx.scale(1/sx, 1/sy);
+								ctx.rotate(-xAxisRotation);
+								ctx.translate(-centp.x, -centp.y);
+							}
+						}
+						break;
+					case 'Z':
+						if (ctx != null) ctx.closePath();
+						pp.current = pp.start;
+					}
+				}
+
+				return bb;
+			}
+
+			this.getMarkers = function() {
+				var points = this.PathParser.getMarkerPoints();
+				var angles = this.PathParser.getMarkerAngles();
+				
+				var markers = [];
+				for (var i=0; i<points.length; i++) {
+					markers.push([points[i], angles[i]]);
+				}
+				return markers;
+			}
+		}
+		svg.Element.path.prototype = new svg.Element.PathElementBase;
+		
+		// pattern element
+		svg.Element.pattern = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.createPattern = function(ctx, element) {
+				// render me using a temporary svg element
+				var tempSvg = new svg.Element.svg();
+				tempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);
+				tempSvg.attributes['x'] = new svg.Property('x', this.attribute('x').value);
+				tempSvg.attributes['y'] = new svg.Property('y', this.attribute('y').value);
+				tempSvg.attributes['width'] = new svg.Property('width', this.attribute('width').value);
+				tempSvg.attributes['height'] = new svg.Property('height', this.attribute('height').value);
+				tempSvg.children = this.children;
+				
+				var c = document.createElement('canvas');
+				c.width = this.attribute('width').Length.toPixels('x');
+				c.height = this.attribute('height').Length.toPixels('y');
+				tempSvg.render(c.getContext('2d'));		
+				return ctx.createPattern(c, 'repeat');
+			}
+		}
+		svg.Element.pattern.prototype = new svg.Element.ElementBase;
+		
+		// marker element
+		svg.Element.marker = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.baseRender = this.render;
+			this.render = function(ctx, point, angle) {
+				ctx.translate(point.x, point.y);
+				if (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(angle);
+				if (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth);
+				ctx.save();
+							
+				// render me using a temporary svg element
+				var tempSvg = new svg.Element.svg();
+				tempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);
+				tempSvg.attributes['refX'] = new svg.Property('refX', this.attribute('refX').value);
+				tempSvg.attributes['refY'] = new svg.Property('refY', this.attribute('refY').value);
+				tempSvg.attributes['width'] = new svg.Property('width', this.attribute('markerWidth').value);
+				tempSvg.attributes['height'] = new svg.Property('height', this.attribute('markerHeight').value);
+				tempSvg.attributes['fill'] = new svg.Property('fill', this.attribute('fill').valueOrDefault('black'));
+				tempSvg.attributes['stroke'] = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none'));
+				tempSvg.children = this.children;
+				tempSvg.render(ctx);
+				
+				ctx.restore();
+				if (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(1/ctx.lineWidth, 1/ctx.lineWidth);
+				if (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(-angle);
+				ctx.translate(-point.x, -point.y);
+			}
+		}
+		svg.Element.marker.prototype = new svg.Element.ElementBase;
+		
+		// definitions element
+		svg.Element.defs = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);	
+			
+			this.render = function(ctx) {
+				// NOOP
+			}
+		}
+		svg.Element.defs.prototype = new svg.Element.ElementBase;
+		
+		// base for gradients
+		svg.Element.GradientBase = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.gradientUnits = this.attribute('gradientUnits').valueOrDefault('objectBoundingBox');
+			
+			this.stops = [];			
+			for (var i=0; i<this.children.length; i++) {
+				var child = this.children[i];
+				this.stops.push(child);
+			}	
+			
+			this.getGradient = function() {
+				// OVERRIDE ME!
+			}			
+
+			this.createGradient = function(ctx, element) {
+				var stopsContainer = this;
+				if (this.attribute('xlink:href').hasValue()) {
+					stopsContainer = this.attribute('xlink:href').Definition.getDefinition();
+				}
+			
+				var g = this.getGradient(ctx, element);
+				for (var i=0; i<stopsContainer.stops.length; i++) {
+					g.addColorStop(stopsContainer.stops[i].offset, stopsContainer.stops[i].color);
+				}
+				
+				if (this.attribute('gradientTransform').hasValue()) {
+					// render as transformed pattern on temporary canvas
+					var rootView = svg.ViewPort.viewPorts[0];
+					
+					var rect = new svg.Element.rect();
+					rect.attributes['x'] = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS/3.0);
+					rect.attributes['y'] = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS/3.0);
+					rect.attributes['width'] = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS);
+					rect.attributes['height'] = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS);
+					
+					var group = new svg.Element.g();
+					group.attributes['transform'] = new svg.Property('transform', this.attribute('gradientTransform').value);
+					group.children = [ rect ];
+					
+					var tempSvg = new svg.Element.svg();
+					tempSvg.attributes['x'] = new svg.Property('x', 0);
+					tempSvg.attributes['y'] = new svg.Property('y', 0);
+					tempSvg.attributes['width'] = new svg.Property('width', rootView.width);
+					tempSvg.attributes['height'] = new svg.Property('height', rootView.height);
+					tempSvg.children = [ group ];
+					
+					var c = document.createElement('canvas');
+					c.width = rootView.width;
+					c.height = rootView.height;
+					var tempCtx = c.getContext('2d');
+					tempCtx.fillStyle = g;
+					tempSvg.render(tempCtx);		
+					return tempCtx.createPattern(c, 'no-repeat');
+				}
+				
+				return g;				
+			}
+		}
+		svg.Element.GradientBase.prototype = new svg.Element.ElementBase;
+		
+		// linear gradient element
+		svg.Element.linearGradient = function(node) {
+			this.base = svg.Element.GradientBase;
+			this.base(node);
+			
+			this.getGradient = function(ctx, element) {
+				var bb = element.getBoundingBox();
+				
+				var x1 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('x1').numValue() 
+					: this.attribute('x1').Length.toPixels('x'));
+				var y1 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('y1').numValue()
+					: this.attribute('y1').Length.toPixels('y'));
+				var x2 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('x2').numValue()
+					: this.attribute('x2').Length.toPixels('x'));
+				var y2 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('y2').numValue()
+					: this.attribute('y2').Length.toPixels('y'));
+
+				return ctx.createLinearGradient(x1, y1, x2, y2);
+			}
+		}
+		svg.Element.linearGradient.prototype = new svg.Element.GradientBase;
+		
+		// radial gradient element
+		svg.Element.radialGradient = function(node) {
+			this.base = svg.Element.GradientBase;
+			this.base(node);
+			
+			this.getGradient = function(ctx, element) {
+				var bb = element.getBoundingBox();
+				
+				var cx = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('cx').numValue() 
+					: this.attribute('cx').Length.toPixels('x'));
+				var cy = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('cy').numValue() 
+					: this.attribute('cy').Length.toPixels('y'));
+				
+				var fx = cx;
+				var fy = cy;
+				if (this.attribute('fx').hasValue()) {
+					fx = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('fx').numValue() 
+					: this.attribute('fx').Length.toPixels('x'));
+				}
+				if (this.attribute('fy').hasValue()) {
+					fy = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('fy').numValue() 
+					: this.attribute('fy').Length.toPixels('y'));
+				}
+				
+				var r = (this.gradientUnits == 'objectBoundingBox' 
+					? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue()
+					: this.attribute('r').Length.toPixels());
+				
+				return ctx.createRadialGradient(fx, fy, 0, cx, cy, r);
+			}
+		}
+		svg.Element.radialGradient.prototype = new svg.Element.GradientBase;
+		
+		// gradient stop element
+		svg.Element.stop = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.offset = this.attribute('offset').numValue();
+			
+			var stopColor = this.style('stop-color');
+			if (this.style('stop-opacity').hasValue()) stopColor = stopColor.Color.addOpacity(this.style('stop-opacity').value);
+			this.color = stopColor.value;
+		}
+		svg.Element.stop.prototype = new svg.Element.ElementBase;
+		
+		// animation base element
+		svg.Element.AnimateBase = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			svg.Animations.push(this);
+			
+			this.duration = 0.0;
+			this.begin = this.attribute('begin').Time.toMilliseconds();
+			this.maxDuration = this.begin + this.attribute('dur').Time.toMilliseconds();
+			
+			this.getProperty = function() {
+				var attributeType = this.attribute('attributeType').value;
+				var attributeName = this.attribute('attributeName').value;
+				
+				if (attributeType == 'CSS') {
+					return this.parent.style(attributeName, true);
+				}
+				return this.parent.attribute(attributeName, true);			
+			};
+			
+			this.initialValue = null;
+			this.removed = false;			
+
+			this.calcValue = function() {
+				// OVERRIDE ME!
+				return '';
+			}
+			
+			this.update = function(delta) {	
+				// set initial value
+				if (this.initialValue == null) {
+					this.initialValue = this.getProperty().value;
+				}
+			
+				// if we're past the end time
+				if (this.duration > this.maxDuration) {
+					// loop for indefinitely repeating animations
+					if (this.attribute('repeatCount').value == 'indefinite') {
+						this.duration = 0.0
+					}
+					else if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) {
+						this.removed = true;
+						this.getProperty().value = this.initialValue;
+						return true;
+					}
+					else {
+						return false; // no updates made
+					}
+				}			
+				this.duration = this.duration + delta;
+			
+				// if we're past the begin time
+				var updated = false;
+				if (this.begin < this.duration) {
+					var newValue = this.calcValue(); // tween
+					
+					if (this.attribute('type').hasValue()) {
+						// for transform, etc.
+						var type = this.attribute('type').value;
+						newValue = type + '(' + newValue + ')';
+					}
+					
+					this.getProperty().value = newValue;
+					updated = true;
+				}
+				
+				return updated;
+			}
+			
+			// fraction of duration we've covered
+			this.progress = function() {
+				return ((this.duration - this.begin) / (this.maxDuration - this.begin));
+			}			
+		}
+		svg.Element.AnimateBase.prototype = new svg.Element.ElementBase;
+		
+		// animate element
+		svg.Element.animate = function(node) {
+			this.base = svg.Element.AnimateBase;
+			this.base(node);
+			
+			this.calcValue = function() {
+				var from = this.attribute('from').numValue();
+				var to = this.attribute('to').numValue();
+				
+				// tween value linearly
+				return from + (to - from) * this.progress(); 
+			};
+		}
+		svg.Element.animate.prototype = new svg.Element.AnimateBase;
+			
+		// animate color element
+		svg.Element.animateColor = function(node) {
+			this.base = svg.Element.AnimateBase;
+			this.base(node);
+
+			this.calcValue = function() {
+				var from = new RGBColor(this.attribute('from').value);
+				var to = new RGBColor(this.attribute('to').value);
+				
+				if (from.ok && to.ok) {
+					// tween color linearly
+					var r = from.r + (to.r - from.r) * this.progress();
+					var g = from.g + (to.g - from.g) * this.progress();
+					var b = from.b + (to.b - from.b) * this.progress();
+					return 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')';
+				}
+				return this.attribute('from').value;
+			};
+		}
+		svg.Element.animateColor.prototype = new svg.Element.AnimateBase;
+		
+		// animate transform element
+		svg.Element.animateTransform = function(node) {
+			this.base = svg.Element.animate;
+			this.base(node);
+		}
+		svg.Element.animateTransform.prototype = new svg.Element.animate;
+		
+		// font element
+		svg.Element.font = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+
+			this.horizAdvX = this.attribute('horiz-adv-x').numValue();			
+			
+			this.isRTL = false;
+			this.isArabic = false;
+			this.fontFace = null;
+			this.missingGlyph = null;
+			this.glyphs = [];			
+			for (var i=0; i<this.children.length; i++) {
+				var child = this.children[i];
+				if (child.type == 'font-face') {
+					this.fontFace = child;
+					if (child.style('font-family').hasValue()) {
+						svg.Definitions[child.style('font-family').value] = this;
+					}
+				}
+				else if (child.type == 'missing-glyph') this.missingGlyph = child;
+				else if (child.type == 'glyph') {
+					if (child.arabicForm != '') {
+						this.isRTL = true;
+						this.isArabic = true;
+						if (typeof(this.glyphs[child.unicode]) == 'undefined') this.glyphs[child.unicode] = [];
+						this.glyphs[child.unicode][child.arabicForm] = child;
+					}
+					else {
+						this.glyphs[child.unicode] = child;
+					}
+				}
+			}	
+		}
+		svg.Element.font.prototype = new svg.Element.ElementBase;
+		
+		// font-face element
+		svg.Element.fontface = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);	
+			
+			this.ascent = this.attribute('ascent').value;
+			this.descent = this.attribute('descent').value;
+			this.unitsPerEm = this.attribute('units-per-em').numValue();				
+		}
+		svg.Element.fontface.prototype = new svg.Element.ElementBase;
+		
+		// missing-glyph element
+		svg.Element.missingglyph = function(node) {
+			this.base = svg.Element.path;
+			this.base(node);	
+			
+			this.horizAdvX = 0;
+		}
+		svg.Element.missingglyph.prototype = new svg.Element.path;
+		
+		// glyph element
+		svg.Element.glyph = function(node) {
+			this.base = svg.Element.path;
+			this.base(node);	
+			
+			this.horizAdvX = this.attribute('horiz-adv-x').numValue();
+			this.unicode = this.attribute('unicode').value;
+			this.arabicForm = this.attribute('arabic-form').value;
+		}
+		svg.Element.glyph.prototype = new svg.Element.path;
+		
+		// text element
+		svg.Element.text = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			if (node != null) {
+				// add children
+				this.children = [];
+				for (var i=0; i<node.childNodes.length; i++) {
+					var childNode = node.childNodes[i];
+					if (childNode.nodeType == 1) { // capture tspan and tref nodes
+						this.addChild(childNode, true);
+					}
+					else if (childNode.nodeType == 3) { // capture text
+						this.addChild(new svg.Element.tspan(childNode), false);
+					}
+				}
+			}
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {
+				this.baseSetContext(ctx);
+				if (this.style('dominant-baseline').hasValue()) ctx.textBaseline = this.style('dominant-baseline').value;
+				if (this.style('alignment-baseline').hasValue()) ctx.textBaseline = this.style('alignment-baseline').value;
+			}
+			
+			this.renderChildren = function(ctx) {
+				var textAnchor = this.style('text-anchor').valueOrDefault('start');
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				for (var i=0; i<this.children.length; i++) {
+					var child = this.children[i];
+				
+					if (child.attribute('x').hasValue()) {
+						child.x = child.attribute('x').Length.toPixels('x');
+					}
+					else {
+						if (child.attribute('dx').hasValue()) x += child.attribute('dx').Length.toPixels('x');
+						child.x = x;
+					}
+					
+					var childLength = child.measureText(ctx);
+					if (textAnchor != 'start' && (i==0 || child.attribute('x').hasValue())) { // new group?
+						// loop through rest of children
+						var groupLength = childLength;
+						for (var j=i+1; j<this.children.length; j++) {
+							var childInGroup = this.children[j];
+							if (childInGroup.attribute('x').hasValue()) break; // new group
+							groupLength += childInGroup.measureText(ctx);
+						}
+						child.x -= (textAnchor == 'end' ? groupLength : groupLength / 2.0);
+					}
+					x = child.x + childLength;
+					
+					if (child.attribute('y').hasValue()) {
+						child.y = child.attribute('y').Length.toPixels('y');
+					}
+					else {
+						if (child.attribute('dy').hasValue()) y += child.attribute('dy').Length.toPixels('y');
+						child.y = y;
+					}	
+					y = child.y;
+					
+					child.render(ctx);
+				}
+			}
+		}
+		svg.Element.text.prototype = new svg.Element.RenderedElementBase;
+		
+		// text base
+		svg.Element.TextElementBase = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.getGlyph = function(font, text, i) {
+				var c = text[i];
+				var glyph = null;
+				if (font.isArabic) {
+					var arabicForm = 'isolated';
+					if ((i==0 || text[i-1]==' ') && i<text.length-2 && text[i+1]!=' ') arabicForm = 'terminal'; 
+					if (i>0 && text[i-1]!=' ' && i<text.length-2 && text[i+1]!=' ') arabicForm = 'medial';
+					if (i>0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial';
+					if (typeof(font.glyphs[c]) != 'undefined') {
+						glyph = font.glyphs[c][arabicForm];
+						if (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c];
+					}
+				}
+				else {
+					glyph = font.glyphs[c];
+				}
+				if (glyph == null) glyph = font.missingGlyph;
+				return glyph;
+			}
+			
+			this.renderChildren = function(ctx) {
+				var customFont = this.parent.style('font-family').Definition.getDefinition();
+				if (customFont != null) {
+					var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);
+					var fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle);
+					var text = this.getText();
+					if (customFont.isRTL) text = text.split("").reverse().join("");
+					
+					var dx = svg.ToNumberArray(this.parent.attribute('dx').value);
+					for (var i=0; i<text.length; i++) {
+						var glyph = this.getGlyph(customFont, text, i);
+						var scale = fontSize / customFont.fontFace.unitsPerEm;
+						ctx.translate(this.x, this.y);
+						ctx.scale(scale, -scale);
+						var lw = ctx.lineWidth;
+						ctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize;
+						if (fontStyle == 'italic') ctx.transform(1, 0, .4, 1, 0, 0);
+						glyph.render(ctx);
+						if (fontStyle == 'italic') ctx.transform(1, 0, -.4, 1, 0, 0);
+						ctx.lineWidth = lw;
+						ctx.scale(1/scale, -1/scale);
+						ctx.translate(-this.x, -this.y);	
+						
+						this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm;
+						if (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {
+							this.x += dx[i];
+						}
+					}
+					return;
+				}
+			
+				if (ctx.strokeStyle != '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);
+				if (ctx.fillStyle != '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);
+			}
+			
+			this.getText = function() {
+				// OVERRIDE ME
+			}
+			
+			this.measureText = function(ctx) {
+				var customFont = this.parent.style('font-family').Definition.getDefinition();
+				if (customFont != null) {
+					var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);
+					var measure = 0;
+					var text = this.getText();
+					if (customFont.isRTL) text = text.split("").reverse().join("");
+					var dx = svg.ToNumberArray(this.parent.attribute('dx').value);
+					for (var i=0; i<text.length; i++) {
+						var glyph = this.getGlyph(customFont, text, i);
+						measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;
+						if (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {
+							measure += dx[i];
+						}
+					}
+					return measure;
+				}
+			
+				var textToMeasure = svg.compressSpaces(this.getText());
+				if (!ctx.measureText) return textToMeasure.length * 10;
+				
+				ctx.save();
+				this.setContext(ctx);
+				var width = ctx.measureText(textToMeasure).width;
+				ctx.restore();
+				return width;
+			}
+		}
+		svg.Element.TextElementBase.prototype = new svg.Element.RenderedElementBase;
+		
+		// tspan 
+		svg.Element.tspan = function(node) {
+			this.base = svg.Element.TextElementBase;
+			this.base(node);
+			
+			this.text = node.nodeType == 3 ? node.nodeValue : // text
+						node.childNodes.length > 0 ? node.childNodes[0].nodeValue : // element
+						node.text;
+			this.getText = function() {
+				return this.text;
+			}
+		}
+		svg.Element.tspan.prototype = new svg.Element.TextElementBase;
+		
+		// tref
+		svg.Element.tref = function(node) {
+			this.base = svg.Element.TextElementBase;
+			this.base(node);
+			
+			this.getText = function() {
+				var element = this.attribute('xlink:href').Definition.getDefinition();
+				if (element != null) return element.children[0].getText();
+			}
+		}
+		svg.Element.tref.prototype = new svg.Element.TextElementBase;		
+		
+		// a element
+		svg.Element.a = function(node) {
+			this.base = svg.Element.TextElementBase;
+			this.base(node);
+			
+			this.hasText = true;
+			for (var i=0; i<node.childNodes.length; i++) {
+				if (node.childNodes[i].nodeType != 3) this.hasText = false;
+			}
+			
+			// this might contain text
+			this.text = this.hasText ? node.childNodes[0].nodeValue : '';
+			this.getText = function() {
+				return this.text;
+			}		
+
+			this.baseRenderChildren = this.renderChildren;
+			this.renderChildren = function(ctx) {
+				if (this.hasText) {
+					// render as text element
+					this.baseRenderChildren(ctx);
+					var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);
+					svg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.Length.toPixels('y'), this.x + this.measureText(ctx), this.y));					
+				}
+				else {
+					// render as temporary group
+					var g = new svg.Element.g();
+					g.children = this.children;
+					g.parent = this;
+					g.render(ctx);
+				}
+			}
+			
+			this.onclick = function() {
+				window.open(this.attribute('xlink:href').value);
+			}
+			
+			this.onmousemove = function() {
+				svg.ctx.canvas.style.cursor = 'pointer';
+			}
+		}
+		svg.Element.a.prototype = new svg.Element.TextElementBase;		
+		
+		// image element
+		svg.Element.image = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			svg.Images.push(this);
+			this.img = document.createElement('img');
+			this.loaded = false;
+			var that = this;
+			this.img.onload = function() { that.loaded = true; }
+			this.img.src = this.attribute('xlink:href').value;
+			
+			this.renderChildren = function(ctx) {
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');			
+				if (width == 0 || height == 0) return;
+			
+				ctx.save();
+				ctx.translate(x, y);
+				svg.AspectRatio(ctx,
+								this.attribute('preserveAspectRatio').value,
+								width,
+								this.img.width,
+								height,
+								this.img.height,
+								0,
+								0);	
+				ctx.drawImage(this.img, 0, 0);			
+				ctx.restore();
+			}
+		}
+		svg.Element.image.prototype = new svg.Element.RenderedElementBase;
+		
+		// group element
+		svg.Element.g = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.getBoundingBox = function() {
+				var bb = new svg.BoundingBox();
+				for (var i=0; i<this.children.length; i++) {
+					bb.addBoundingBox(this.children[i].getBoundingBox());
+				}
+				return bb;
+			};
+		}
+		svg.Element.g.prototype = new svg.Element.RenderedElementBase;
+
+		// symbol element
+		svg.Element.symbol = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {		
+				this.baseSetContext(ctx);
+				
+				// viewbox
+				if (this.attribute('viewBox').hasValue()) {				
+					var viewBox = svg.ToNumberArray(this.attribute('viewBox').value);
+					var minX = viewBox[0];
+					var minY = viewBox[1];
+					width = viewBox[2];
+					height = viewBox[3];
+					
+					svg.AspectRatio(ctx,
+									this.attribute('preserveAspectRatio').value, 
+									this.attribute('width').Length.toPixels('x'),
+									width,
+									this.attribute('height').Length.toPixels('y'),
+									height,
+									minX,
+									minY);
+
+					svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);						
+				}
+			}			
+		}
+		svg.Element.symbol.prototype = new svg.Element.RenderedElementBase;		
+			
+		// style element
+		svg.Element.style = function(node) { 
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			// text, or spaces then CDATA
+			var css = node.childNodes[0].nodeValue + (node.childNodes.length > 1 ? node.childNodes[1].nodeValue : '');
+			css = css.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm, ''); // remove comments
+			css = svg.compressSpaces(css); // replace whitespace
+			var cssDefs = css.split('}');
+			for (var i=0; i<cssDefs.length; i++) {
+				if (svg.trim(cssDefs[i]) != '') {
+					var cssDef = cssDefs[i].split('{');
+					var cssClasses = cssDef[0].split(',');
+					var cssProps = cssDef[1].split(';');
+					for (var j=0; j<cssClasses.length; j++) {
+						var cssClass = svg.trim(cssClasses[j]);
+						if (cssClass != '') {
+							var props = {};
+							for (var k=0; k<cssProps.length; k++) {
+								var prop = cssProps[k].indexOf(':');
+								var name = cssProps[k].substr(0, prop);
+								var value = cssProps[k].substr(prop + 1, cssProps[k].length - prop);
+								if (name != null && value != null) {
+									props[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value));
+								}
+							}
+							svg.Styles[cssClass] = props;
+							if (cssClass == '@font-face') {
+								var fontFamily = props['font-family'].value.replace(/"/g,'');
+								var srcs = props['src'].value.split(',');
+								for (var s=0; s<srcs.length; s++) {
+									if (srcs[s].indexOf('format("svg")') > 0) {
+										var urlStart = srcs[s].indexOf('url');
+										var urlEnd = srcs[s].indexOf(')', urlStart);
+										var url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6);
+										var doc = svg.parseXml(svg.ajax(url));
+										var fonts = doc.getElementsByTagName('font');
+										for (var f=0; f<fonts.length; f++) {
+											var font = svg.CreateElement(fonts[f]);
+											svg.Definitions[fontFamily] = font;
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		svg.Element.style.prototype = new svg.Element.ElementBase;
+		
+		// use element 
+		svg.Element.use = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {
+				this.baseSetContext(ctx);
+				if (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').Length.toPixels('x'), 0);
+				if (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').Length.toPixels('y'));
+			}
+			
+			this.getDefinition = function() {
+				var element = this.attribute('xlink:href').Definition.getDefinition();
+				if (this.attribute('width').hasValue()) element.attribute('width', true).value = this.attribute('width').value;
+				if (this.attribute('height').hasValue()) element.attribute('height', true).value = this.attribute('height').value;
+				return element;
+			}
+			
+			this.path = function(ctx) {
+				var element = this.getDefinition();
+				if (element != null) element.path(ctx);
+			}
+			
+			this.renderChildren = function(ctx) {
+				var element = this.getDefinition();
+				if (element != null) element.render(ctx);
+			}
+		}
+		svg.Element.use.prototype = new svg.Element.RenderedElementBase;
+		
+		// mask element
+		svg.Element.mask = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+						
+			this.apply = function(ctx, element) {
+				// render as temp svg	
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');
+				
+				// temporarily remove mask to avoid recursion
+				var mask = element.attribute('mask').value;
+				element.attribute('mask').value = '';
+				
+					var cMask = document.createElement('canvas');
+					cMask.width = x + width;
+					cMask.height = y + height;
+					var maskCtx = cMask.getContext('2d');
+					this.renderChildren(maskCtx);
+				
+					var c = document.createElement('canvas');
+					c.width = x + width;
+					c.height = y + height;
+					var tempCtx = c.getContext('2d');
+					element.render(tempCtx);
+					tempCtx.globalCompositeOperation = 'destination-in';
+					tempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');
+					tempCtx.fillRect(0, 0, x + width, y + height);
+					
+					ctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');
+					ctx.fillRect(0, 0, x + width, y + height);
+					
+				// reassign mask
+				element.attribute('mask').value = mask;	
+			}
+			
+			this.render = function(ctx) {
+				// NO RENDER
+			}
+		}
+		svg.Element.mask.prototype = new svg.Element.ElementBase;
+		
+		// clip element
+		svg.Element.clipPath = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.apply = function(ctx) {
+				for (var i=0; i<this.children.length; i++) {
+					if (this.children[i].path) {
+						this.children[i].path(ctx);
+						ctx.clip();
+					}
+				}
+			}
+			
+			this.render = function(ctx) {
+				// NO RENDER
+			}
+		}
+		svg.Element.clipPath.prototype = new svg.Element.ElementBase;
+
+		// filters
+		svg.Element.filter = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+						
+			this.apply = function(ctx, element) {
+				// render as temp svg	
+				var bb = element.getBoundingBox();
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				if (x == 0 || y == 0) {
+					x = bb.x1;
+					y = bb.y1;
+				}
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');
+				if (width == 0 || height == 0) {
+					width = bb.width();
+					height = bb.height();
+				}
+				
+				// temporarily remove filter to avoid recursion
+				var filter = element.style('filter').value;
+				element.style('filter').value = '';
+				
+				// max filter distance
+				var extraPercent = .20;
+				var px = extraPercent * width;
+				var py = extraPercent * height;
+				
+				var c = document.createElement('canvas');
+				c.width = width + 2*px;
+				c.height = height + 2*py;
+				var tempCtx = c.getContext('2d');
+				tempCtx.translate(-x + px, -y + py);
+				element.render(tempCtx);
+			
+				// apply filters
+				for (var i=0; i<this.children.length; i++) {
+					this.children[i].apply(tempCtx, 0, 0, width + 2*px, height + 2*py);
+				}
+				
+				// render on me
+				ctx.drawImage(c, 0, 0, width + 2*px, height + 2*py, x - px, y - py, width + 2*px, height + 2*py);
+				
+				// reassign filter
+				element.style('filter', true).value = filter;	
+			}
+			
+			this.render = function(ctx) {
+				// NO RENDER
+			}		
+		}
+		svg.Element.filter.prototype = new svg.Element.ElementBase;
+		
+		svg.Element.feGaussianBlur = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);	
+			
+			function make_fgauss(sigma) {
+				sigma = Math.max(sigma, 0.01);			      
+				var len = Math.ceil(sigma * 4.0) + 1;                     
+				mask = [];                               
+				for (var i = 0; i < len; i++) {                             
+					mask[i] = Math.exp(-0.5 * (i / sigma) * (i / sigma));                                           
+				}                                                           
+				return mask; 
+			}
+			
+			function normalize(mask) {
+				var sum = 0;
+				for (var i = 1; i < mask.length; i++) {
+					sum += Math.abs(mask[i]);
+				}
+				sum = 2 * sum + Math.abs(mask[0]);
+				for (var i = 0; i < mask.length; i++) {
+					mask[i] /= sum;
+				}
+				return mask;
+			}
+			
+			function convolve_even(src, dst, mask, width, height) {
+			  for (var y = 0; y < height; y++) {
+				for (var x = 0; x < width; x++) {
+				  var a = imGet(src, x, y, width, height, 3)/255;
+				  for (var rgba = 0; rgba < 4; rgba++) {					  
+					  var sum = mask[0] * (a==0?255:imGet(src, x, y, width, height, rgba)) * (a==0||rgba==3?1:a);
+					  for (var i = 1; i < mask.length; i++) {
+						var a1 = imGet(src, Math.max(x-i,0), y, width, height, 3)/255;
+					    var a2 = imGet(src, Math.min(x+i, width-1), y, width, height, 3)/255;
+						sum += mask[i] * 
+						  ((a1==0?255:imGet(src, Math.max(x-i,0), y, width, height, rgba)) * (a1==0||rgba==3?1:a1) + 
+						   (a2==0?255:imGet(src, Math.min(x+i, width-1), y, width, height, rgba)) * (a2==0||rgba==3?1:a2));
+					  }
+					  imSet(dst, y, x, height, width, rgba, sum);
+				  }			  
+				}
+			  }
+			}		
+
+			function imGet(img, x, y, width, height, rgba) {
+				return img[y*width*4 + x*4 + rgba];
+			}
+			
+			function imSet(img, x, y, width, height, rgba, val) {
+				img[y*width*4 + x*4 + rgba] = val;
+			}
+						
+			function blur(ctx, width, height, sigma)
+			{
+				var srcData = ctx.getImageData(0, 0, width, height);
+				var mask = make_fgauss(sigma);
+				mask = normalize(mask);
+				tmp = [];
+				convolve_even(srcData.data, tmp, mask, width, height);
+				convolve_even(tmp, srcData.data, mask, height, width);
+				ctx.clearRect(0, 0, width, height);
+				ctx.putImageData(srcData, 0, 0);
+			}			
+		
+			this.apply = function(ctx, x, y, width, height) {
+				// assuming x==0 && y==0 for now
+				blur(ctx, width, height, this.attribute('stdDeviation').numValue());
+			}
+		}
+		svg.Element.filter.prototype = new svg.Element.feGaussianBlur;
+		
+		// title element, do nothing
+		svg.Element.title = function(node) {
+		}
+		svg.Element.title.prototype = new svg.Element.ElementBase;
+
+		// desc element, do nothing
+		svg.Element.desc = function(node) {
+		}
+		svg.Element.desc.prototype = new svg.Element.ElementBase;		
+		
+		svg.Element.MISSING = function(node) {
+			console.log('ERROR: Element \'' + node.nodeName + '\' not yet implemented.');
+		}
+		svg.Element.MISSING.prototype = new svg.Element.ElementBase;
+		
+		// element factory
+		svg.CreateElement = function(node) {	
+			var className = node.nodeName.replace(/^[^:]+:/,''); // remove namespace
+			className = className.replace(/\-/g,''); // remove dashes
+			var e = null;
+			if (typeof(svg.Element[className]) != 'undefined') {
+				e = new svg.Element[className](node);
+			}
+			else {
+				e = new svg.Element.MISSING(node);
+			}
+
+			e.type = node.nodeName;
+			return e;
+		}
+				
+		// load from url
+		svg.load = function(ctx, url) {
+			svg.loadXml(ctx, svg.ajax(url));
+		}
+		
+		// load from xml
+		svg.loadXml = function(ctx, xml) {
+			svg.loadXmlDoc(ctx, svg.parseXml(xml));
+		}
+		
+		svg.loadXmlDoc = function(ctx, dom) {
+			svg.init(ctx);
+			
+			var mapXY = function(p) {
+				var e = ctx.canvas;
+				while (e) {
+					p.x -= e.offsetLeft;
+					p.y -= e.offsetTop;
+					e = e.offsetParent;
+				}
+				if (window.scrollX) p.x += window.scrollX;
+				if (window.scrollY) p.y += window.scrollY;
+				return p;
+			}
+			
+			// bind mouse
+			if (svg.opts['ignoreMouse'] != true) {
+				ctx.canvas.onclick = function(e) {
+					var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));
+					svg.Mouse.onclick(p.x, p.y);
+				};
+				ctx.canvas.onmousemove = function(e) {
+					var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));
+					svg.Mouse.onmousemove(p.x, p.y);
+				};
+			}
+		
+			var e = svg.CreateElement(dom.documentElement);
+			e.root = true;
+					
+			// render loop
+			var isFirstRender = true;
+			var draw = function() {
+				svg.ViewPort.Clear();
+				if (ctx.canvas.parentNode) svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight);
+			
+				if (svg.opts['ignoreDimensions'] != true) {
+					// set canvas size
+					if (e.style('width').hasValue()) {
+						ctx.canvas.width = e.style('width').Length.toPixels('x');
+						ctx.canvas.style.width = ctx.canvas.width + 'px';
+					}
+					if (e.style('height').hasValue()) {
+						ctx.canvas.height = e.style('height').Length.toPixels('y');
+						ctx.canvas.style.height = ctx.canvas.height + 'px';
+					}
+				}
+				var cWidth = ctx.canvas.clientWidth || ctx.canvas.width;
+				var cHeight = ctx.canvas.clientHeight || ctx.canvas.height;
+				svg.ViewPort.SetCurrent(cWidth, cHeight);		
+				
+				if (svg.opts != null && svg.opts['offsetX'] != null) e.attribute('x', true).value = svg.opts['offsetX'];
+				if (svg.opts != null && svg.opts['offsetY'] != null) e.attribute('y', true).value = svg.opts['offsetY'];
+				if (svg.opts != null && svg.opts['scaleWidth'] != null && svg.opts['scaleHeight'] != null) {
+					var xRatio = 1, yRatio = 1;
+					if (e.attribute('width').hasValue()) xRatio = e.attribute('width').Length.toPixels('x') / svg.opts['scaleWidth'];
+					if (e.attribute('height').hasValue()) yRatio = e.attribute('height').Length.toPixels('y') / svg.opts['scaleHeight'];
+				
+					e.attribute('width', true).value = svg.opts['scaleWidth'];
+					e.attribute('height', true).value = svg.opts['scaleHeight'];			
+					e.attribute('viewBox', true).value = '0 0 ' + (cWidth * xRatio) + ' ' + (cHeight * yRatio);
+					e.attribute('preserveAspectRatio', true).value = 'none';
+				}
+			
+				// clear and render
+				if (svg.opts['ignoreClear'] != true) {
+					ctx.clearRect(0, 0, cWidth, cHeight);
+				}
+				e.render(ctx);
+				if (isFirstRender) {
+					isFirstRender = false;
+					if (svg.opts != null && typeof(svg.opts['renderCallback']) == 'function') svg.opts['renderCallback']();
+				}			
+			}
+			
+			var waitingForImages = true;
+			if (svg.ImagesLoaded()) {
+				waitingForImages = false;
+				draw();
+			}
+			svg.intervalID = setInterval(function() { 
+				var needUpdate = false;
+				
+				if (waitingForImages && svg.ImagesLoaded()) {
+					waitingForImages = false;
+					needUpdate = true;
+				}
+			
+				// need update from mouse events?
+				if (svg.opts['ignoreMouse'] != true) {
+					needUpdate = needUpdate | svg.Mouse.hasEvents();
+				}
+			
+				// need update from animations?
+				if (svg.opts['ignoreAnimation'] != true) {
+					for (var i=0; i<svg.Animations.length; i++) {
+						needUpdate = needUpdate | svg.Animations[i].update(1000 / svg.FRAMERATE);
+					}
+				}
+				
+				// need update from redraw?
+				if (svg.opts != null && typeof(svg.opts['forceRedraw']) == 'function') {
+					if (svg.opts['forceRedraw']() == true) needUpdate = true;
+				}
+				
+				// render if needed
+				if (needUpdate) {
+					draw();				
+					svg.Mouse.runEvents(); // run and clear our events
+				}
+			}, 1000 / svg.FRAMERATE);
+		}
+		
+		svg.stop = function() {
+			if (svg.intervalID) {
+				clearInterval(svg.intervalID);
+			}
+		}
+		
+		svg.Mouse = new (function() {
+			this.events = [];
+			this.hasEvents = function() { return this.events.length != 0; }
+		
+			this.onclick = function(x, y) {
+				this.events.push({ type: 'onclick', x: x, y: y, 
+					run: function(e) { if (e.onclick) e.onclick(); }
+				});
+			}
+			
+			this.onmousemove = function(x, y) {
+				this.events.push({ type: 'onmousemove', x: x, y: y,
+					run: function(e) { if (e.onmousemove) e.onmousemove(); }
+				});
+			}			
+			
+			this.eventElements = [];
+			
+			this.checkPath = function(element, ctx) {
+				for (var i=0; i<this.events.length; i++) {
+					var e = this.events[i];
+					if (ctx.isPointInPath && ctx.isPointInPath(e.x, e.y)) this.eventElements[i] = element;
+				}
+			}
+			
+			this.checkBoundingBox = function(element, bb) {
+				for (var i=0; i<this.events.length; i++) {
+					var e = this.events[i];
+					if (bb.isPointInBox(e.x, e.y)) this.eventElements[i] = element;
+				}			
+			}
+			
+			this.runEvents = function() {
+				svg.ctx.canvas.style.cursor = '';
+				
+				for (var i=0; i<this.events.length; i++) {
+					var e = this.events[i];
+					var element = this.eventElements[i];
+					while (element) {
+						e.run(element);
+						element = element.parent;
+					}
+				}		
+			
+				// done running, clear
+				this.events = []; 
+				this.eventElements = [];
+			}
+		});
+		
+		return svg;
+	}
+})();
+
+if (CanvasRenderingContext2D) {
+	CanvasRenderingContext2D.prototype.drawSvg = function(s, dx, dy, dw, dh) {
+		canvg(this.canvas, s, { 
+			ignoreMouse: true, 
+			ignoreAnimation: true, 
+			ignoreDimensions: true, 
+			ignoreClear: true, 
+			offsetX: dx, 
+			offsetY: dy, 
+			scaleWidth: dw, 
+			scaleHeight: dh
+		});
+	}
+}/**
+ * @license Highcharts JS v2.2.5 (2012-06-08)
+ * CanVGRenderer Extension module
+ *
+ * (c) 2011-2012 Torstein Hønsi, Erik Olsson
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts */
+
+(function (Highcharts) { // encapsulate
+	var UNDEFINED,
+		DIV = 'div',
+		ABSOLUTE = 'absolute',
+		RELATIVE = 'relative',
+		HIDDEN = 'hidden',
+		VISIBLE = 'visible',
+		PX = 'px',
+		css = Highcharts.css,
+		CanVGRenderer = Highcharts.CanVGRenderer,
+		SVGRenderer = Highcharts.SVGRenderer,
+		extend = Highcharts.extend,
+		merge = Highcharts.merge,
+		addEvent = Highcharts.addEvent,
+		createElement = Highcharts.createElement,
+		discardElement = Highcharts.discardElement;
+
+	// Extend CanVG renderer on demand, inherit from SVGRenderer
+	extend(CanVGRenderer.prototype, SVGRenderer.prototype);
+
+	// Add additional functionality:
+	extend(CanVGRenderer.prototype, {
+		create: function (chart, container, chartWidth, chartHeight) {
+			this.setContainer(container, chartWidth, chartHeight);
+			this.configure(chart);
+		},
+		setContainer: function (container, chartWidth, chartHeight) {
+			var containerStyle = container.style,
+				containerParent = container.parentNode,
+				containerLeft = containerStyle.left,
+				containerTop = containerStyle.top,
+				containerOffsetWidth = container.offsetWidth,
+				containerOffsetHeight = container.offsetHeight,
+				canvas,
+				initialHiddenStyle = { visibility: HIDDEN, position: ABSOLUTE };
+
+			this.init.apply(this, [container, chartWidth, chartHeight]);
+
+			// add the canvas above it
+			canvas = createElement('canvas', {
+				width: containerOffsetWidth,
+				height: containerOffsetHeight
+			}, {
+				position: RELATIVE,
+				left: containerLeft,
+				top: containerTop
+			}, container);
+			this.canvas = canvas;
+
+			// Create the tooltip line and div, they are placed as siblings to
+			// the container (and as direct childs to the div specified in the html page)
+			this.ttLine = createElement(DIV, null, initialHiddenStyle, containerParent);
+			this.ttDiv = createElement(DIV, null, initialHiddenStyle, containerParent);
+			this.ttTimer = UNDEFINED;
+
+			// Move away the svg node to a new div inside the container's parent so we can hide it.
+			var hiddenSvg = createElement(DIV, {
+				width: containerOffsetWidth,
+				height: containerOffsetHeight
+			}, {
+				visibility: HIDDEN,
+				left: containerLeft,
+				top: containerTop
+			}, containerParent);
+			this.hiddenSvg = hiddenSvg;
+			hiddenSvg.appendChild(this.box);
+		},
+
+		/**
+		 * Configures the renderer with the chart. Attach a listener to the event tooltipRefresh.
+		 **/
+		configure: function (chart) {
+			var renderer = this,
+				options = chart.options.tooltip,
+				borderWidth = options.borderWidth,
+				tooltipDiv = renderer.ttDiv,
+				tooltipDivStyle = options.style,
+				tooltipLine = renderer.ttLine,
+				padding = parseInt(tooltipDivStyle.padding, 10);
+
+			// Add border styling from options to the style
+			tooltipDivStyle = merge(tooltipDivStyle, {
+				padding: padding + PX,
+				'background-color': options.backgroundColor,
+				'border-style': 'solid',
+				'border-width': borderWidth + PX,
+				'border-radius': options.borderRadius + PX
+			});
+
+			// Optionally add shadow
+			if (options.shadow) {
+				tooltipDivStyle = merge(tooltipDivStyle, {
+					'box-shadow': '1px 1px 3px gray', // w3c
+					'-webkit-box-shadow': '1px 1px 3px gray' // webkit
+				});
+			}
+			css(tooltipDiv, tooltipDivStyle);
+
+			// Set simple style on the line
+			css(tooltipLine, {
+				'border-left': '1px solid darkgray'
+			});
+
+			// This event is triggered when a new tooltip should be shown
+			addEvent(chart, 'tooltipRefresh', function (args) {
+				var chartContainer = chart.container,
+					offsetLeft = chartContainer.offsetLeft,
+					offsetTop = chartContainer.offsetTop,
+					position;
+
+				// Set the content of the tooltip
+				tooltipDiv.innerHTML = args.text;
+
+				// Compute the best position for the tooltip based on the divs size and container size.
+				position = chart.tooltip.getPosition(tooltipDiv.offsetWidth, tooltipDiv.offsetHeight, {plotX: args.x, plotY: args.y});
+
+				css(tooltipDiv, {
+					visibility: VISIBLE,
+					left: position.x + PX,
+					top: position.y + PX,
+					'border-color': args.borderColor
+				});
+
+				// Position the tooltip line
+				css(tooltipLine, {
+					visibility: VISIBLE,
+					left: offsetLeft + args.x + PX,
+					top: offsetTop + chart.plotTop + PX,
+					height: chart.plotHeight  + PX
+				});
+
+				// This timeout hides the tooltip after 3 seconds
+				// First clear any existing timer
+				if (renderer.ttTimer !== UNDEFINED) {
+					clearTimeout(renderer.ttTimer);
+				}
+
+				// Start a new timer that hides tooltip and line
+				renderer.ttTimer = setTimeout(function () {
+					css(tooltipDiv, { visibility: HIDDEN });
+					css(tooltipLine, { visibility: HIDDEN });
+				}, 3000);
+			});
+		},
+
+		/**
+		 * Extend SVGRenderer.destroy to also destroy the elements added by CanVGRenderer.
+		 */
+		destroy: function () {
+			var renderer = this;
+
+			// Remove the canvas
+			discardElement(renderer.canvas);
+
+			// Kill the timer
+			if (renderer.ttTimer !== UNDEFINED) {
+				clearTimeout(renderer.ttTimer);
+			}
+
+			// Remove the divs for tooltip and line
+			discardElement(renderer.ttLine);
+			discardElement(renderer.ttDiv);
+			discardElement(renderer.hiddenSvg);
+
+			// Continue with base class
+			return SVGRenderer.prototype.destroy.apply(renderer);
+		},
+
+		/**
+		 * Take a color and return it if it's a string, do not make it a gradient even if it is a
+		 * gradient. Currently canvg cannot render gradients (turns out black),
+		 * see: http://code.google.com/p/canvg/issues/detail?id=104
+		 *
+		 * @param {Object} color The color or config object
+		 */
+		color: function (color, elem, prop) {
+			if (color && color.linearGradient) {
+				// Pick the end color and forward to base implementation
+				color = color.stops[color.stops.length - 1][1];
+			}
+			return SVGRenderer.prototype.color.call(this, color, elem, prop);
+		},
+
+		/**
+		 * Draws the SVG on the canvas or adds a draw invokation to the deferred list.
+		 */
+		draw: function () {
+			var renderer = this;
+			window.canvg(renderer.canvas, renderer.hiddenSvg.innerHTML);
+		}
+	});
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/data.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/data.js
new file mode 100644
index 0000000..42a5fdb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/data.js
@@ -0,0 +1,17 @@
+/*
+ Data plugin for Highcharts
+
+ (c) 2012-2014 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(j){var m=j.each,n=function(b,a){this.init(b,a)};j.extend(n.prototype,{init:function(b,a){this.options=b;this.chartOptions=a;this.columns=b.columns||this.rowsToColumns(b.rows)||[];this.columns.length?this.dataFound():(this.parseCSV(),this.parseTable(),this.parseGoogleSpreadsheet())},getColumnDistribution:function(){var b=this.chartOptions,a=b&&b.chart&&b.chart.type,c=[];m(b&&b.series||[],function(b){c.push((j.seriesTypes[b.type||a||"line"].prototype.pointArrayMap||[0]).length)});this.valueCount=
+{global:(j.seriesTypes[a||"line"].prototype.pointArrayMap||[0]).length,individual:c}},dataFound:function(){if(this.options.switchRowsAndColumns)this.columns=this.rowsToColumns(this.columns);this.parseTypes();this.findHeaderRow();this.parsed();this.complete()},parseCSV:function(){var b=this,a=this.options,c=a.csv,d=this.columns,e=a.startRow||0,f=a.endRow||Number.MAX_VALUE,i=a.startColumn||0,h=a.endColumn||Number.MAX_VALUE,g,k,o=0;c&&(k=c.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split(a.lineDelimiter||
+"\n"),g=a.itemDelimiter||(c.indexOf("\t")!==-1?"\t":","),m(k,function(a,c){var k=b.trim(a),j=k.indexOf("#")===0;c>=e&&c<=f&&!j&&k!==""&&(k=a.split(g),m(k,function(b,a){a>=i&&a<=h&&(d[a-i]||(d[a-i]=[]),d[a-i][o]=b)}),o+=1)}),this.dataFound())},parseTable:function(){var b=this.options,a=b.table,c=this.columns,d=b.startRow||0,e=b.endRow||Number.MAX_VALUE,f=b.startColumn||0,i=b.endColumn||Number.MAX_VALUE;a&&(typeof a==="string"&&(a=document.getElementById(a)),m(a.getElementsByTagName("tr"),function(a,
+b){b>=d&&b<=e&&m(a.children,function(a,e){if((a.tagName==="TD"||a.tagName==="TH")&&e>=f&&e<=i)c[e-f]||(c[e-f]=[]),c[e-f][b-d]=a.innerHTML})}),this.dataFound())},parseGoogleSpreadsheet:function(){var b=this,a=this.options,c=a.googleSpreadsheetKey,d=this.columns,e=a.startRow||0,f=a.endRow||Number.MAX_VALUE,i=a.startColumn||0,h=a.endColumn||Number.MAX_VALUE,g,k;c&&jQuery.ajax({dataType:"json",url:"https://spreadsheets.google.com/feeds/cells/"+c+"/"+(a.googleSpreadsheetWorksheet||"od6")+"/public/values?alt=json-in-script&callback=?",
+error:a.error,success:function(a){var a=a.feed.entry,c,j=a.length,m=0,n=0,l;for(l=0;l<j;l++)c=a[l],m=Math.max(m,c.gs$cell.col),n=Math.max(n,c.gs$cell.row);for(l=0;l<m;l++)if(l>=i&&l<=h)d[l-i]=[],d[l-i].length=Math.min(n,f-e);for(l=0;l<j;l++)if(c=a[l],g=c.gs$cell.row-1,k=c.gs$cell.col-1,k>=i&&k<=h&&g>=e&&g<=f)d[k-i][g-e]=c.content.$t;b.dataFound()}})},findHeaderRow:function(){m(this.columns,function(){});this.headerRow=0},trim:function(b){return typeof b==="string"?b.replace(/^\s+|\s+$/g,""):b},parseTypes:function(){for(var b=
+this.columns,a=b.length,c,d,e,f;a--;)for(c=b[a].length;c--;)d=b[a][c],e=parseFloat(d),f=this.trim(d),f==e?(b[a][c]=e,e>31536E6?b[a].isDatetime=!0:b[a].isNumeric=!0):(d=this.parseDate(d),a===0&&typeof d==="number"&&!isNaN(d)?(b[a][c]=d,b[a].isDatetime=!0):b[a][c]=f===""?null:f)},dateFormats:{"YYYY-mm-dd":{regex:"^([0-9]{4})-([0-9]{2})-([0-9]{2})$",parser:function(b){return Date.UTC(+b[1],b[2]-1,+b[3])}}},parseDate:function(b){var a=this.options.parseDate,c,d,e;a&&(c=a(b));if(typeof b==="string")for(d in this.dateFormats)a=
+this.dateFormats[d],(e=b.match(a.regex))&&(c=a.parser(e));return c},rowsToColumns:function(b){var a,c,d,e,f;if(b){f=[];c=b.length;for(a=0;a<c;a++){e=b[a].length;for(d=0;d<e;d++)f[d]||(f[d]=[]),f[d][a]=b[a][d]}}return f},parsed:function(){this.options.parsed&&this.options.parsed.call(this,this.columns)},complete:function(){var b=this.columns,a,c,d=this.options,e,f,i,h,g,k;if(d.complete||d.afterComplete){this.getColumnDistribution();b.length>1&&(a=b.shift(),this.headerRow===0&&a.shift(),a.isDatetime?
+c="datetime":a.isNumeric||(c="category"));for(h=0;h<b.length;h++)if(this.headerRow===0)b[h].name=b[h].shift();f=[];for(h=0,k=0;h<b.length;k++){e=j.pick(this.valueCount.individual[k],this.valueCount.global);i=[];if(h+e<=b.length)for(g=0;g<b[h].length;g++)i[g]=[a[g],b[h][g]!==void 0?b[h][g]:null],e>1&&i[g].push(b[h+1][g]!==void 0?b[h+1][g]:null),e>2&&i[g].push(b[h+2][g]!==void 0?b[h+2][g]:null),e>3&&i[g].push(b[h+3][g]!==void 0?b[h+3][g]:null),e>4&&i[g].push(b[h+4][g]!==void 0?b[h+4][g]:null);f[k]=
+{name:b[h].name,data:i};h+=e}b={xAxis:{type:c},series:f};d.complete&&d.complete(b);d.afterComplete&&d.afterComplete(b)}}});j.Data=n;j.data=function(b,a){return new n(b,a)};j.wrap(j.Chart.prototype,"init",function(b,a,c){var d=this;a&&a.data?j.data(j.extend(a.data,{afterComplete:function(e){var f,i;if(a.hasOwnProperty("series"))if(typeof a.series==="object")for(f=Math.max(a.series.length,e.series.length);f--;)i=a.series[f]||{},a.series[f]=j.merge(i,e.series[f]);else delete a.series;a=j.merge(e,a);
+b.call(d,a,c)}}),a):b.call(d,a,c)})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/data.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/data.src.js
new file mode 100644
index 0000000..a8a0a70
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/data.src.js
@@ -0,0 +1,622 @@
+/**
+ * @license Data plugin for Highcharts
+ *
+ * (c) 2012-2014 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+/*
+ * The Highcharts Data plugin is a utility to ease parsing of input sources like
+ * CSV, HTML tables or grid views into basic configuration options for use 
+ * directly in the Highcharts constructor.
+ *
+ * Demo: http://jsfiddle.net/highcharts/SnLFj/
+ *
+ * --- OPTIONS ---
+ *
+ * - columns : Array<Array<Mixed>>
+ * A two-dimensional array representing the input data on tabular form. This input can
+ * be used when the data is already parsed, for example from a grid view component.
+ * Each cell can be a string or number. If not switchRowsAndColumns is set, the columns
+ * are interpreted as series. See also the rows option.
+ *
+ * - complete : Function(chartOptions)
+ * The callback that is evaluated when the data is finished loading, optionally from an 
+ * external source, and parsed. The first argument passed is a finished chart options
+ * object, containing the series. Thise options
+ * can be extended with additional options and passed directly to the chart constructor. This is 
+ * related to the parsed callback, that goes in at an earlier stage.
+ *
+ * - csv : String
+ * A comma delimited string to be parsed. Related options are startRow, endRow, startColumn
+ * and endColumn to delimit what part of the table is used. The lineDelimiter and 
+ * itemDelimiter options define the CSV delimiter formats.
+ * 
+ * - endColumn : Integer
+ * In tabular input data, the first row (indexed by 0) to use. Defaults to the last 
+ * column containing data.
+ *
+ * - endRow : Integer
+ * In tabular input data, the last row (indexed by 0) to use. Defaults to the last row
+ * containing data.
+ *
+ * - googleSpreadsheetKey : String 
+ * A Google Spreadsheet key. See https://developers.google.com/gdata/samples/spreadsheet_sample
+ * for general information on GS.
+ *
+ * - googleSpreadsheetWorksheet : String 
+ * The Google Spreadsheet worksheet. The available id's can be read from 
+ * https://spreadsheets.google.com/feeds/worksheets/{key}/public/basic
+ *
+ * - itemDelimiter : String
+ * Item or cell delimiter for parsing CSV. Defaults to the tab character "\t" if a tab character
+ * is found in the CSV string, if not it defaults to ",".
+ *
+ * - lineDelimiter : String
+ * Line delimiter for parsing CSV. Defaults to "\n".
+ *
+ * - parsed : Function
+ * A callback function to access the parsed columns, the two-dimentional input data
+ * array directly, before they are interpreted into series data and categories. See also
+ * the complete callback, that goes in on a later stage where the raw columns are interpreted
+ * into a Highcharts option structure.
+ *
+ * - parseDate : Function
+ * A callback function to parse string representations of dates into JavaScript timestamps.
+ * Return an integer on success.
+ *
+ * - rows : Array<Array<Mixed>>
+ * The same as the columns input option, but defining rows intead of columns.
+ *
+ * - startColumn : Integer
+ * In tabular input data, the first column (indexed by 0) to use. 
+ *
+ * - startRow : Integer
+ * In tabular input data, the first row (indexed by 0) to use.
+ *
+ * - switchRowsAndColumns : Boolean
+ * Switch rows and columns of the input data, so that this.columns effectively becomes the
+ * rows of the data set, and the rows are interpreted as series.
+ *
+ * - table : String|HTMLElement
+ * A HTML table or the id of such to be parsed as input data. Related options ara startRow,
+ * endRow, startColumn and endColumn to delimit what part of the table is used.
+ */
+
+// JSLint options:
+/*global jQuery */
+
+(function (Highcharts) { // docs
+	
+	// Utilities
+	var each = Highcharts.each;
+	
+	
+	// The Data constructor
+	var Data = function (dataOptions, chartOptions) {
+		this.init(dataOptions, chartOptions);
+	};
+	
+	// Set the prototype properties
+	Highcharts.extend(Data.prototype, {
+		
+	/**
+	 * Initialize the Data object with the given options
+	 */
+	init: function (options, chartOptions) {
+		this.options = options;
+		this.chartOptions = chartOptions;
+		this.columns = options.columns || this.rowsToColumns(options.rows) || [];
+
+		// No need to parse or interpret anything
+		if (this.columns.length) {
+			this.dataFound();
+
+		// Parse and interpret
+		} else {
+
+			// Parse a CSV string if options.csv is given
+			this.parseCSV();
+			
+			// Parse a HTML table if options.table is given
+			this.parseTable();
+
+			// Parse a Google Spreadsheet 
+			this.parseGoogleSpreadsheet();	
+		}
+
+	},
+
+	/**
+	 * Get the column distribution. For example, a line series takes a single column for 
+	 * Y values. A range series takes two columns for low and high values respectively,
+	 * and an OHLC series takes four columns.
+	 */
+	getColumnDistribution: function () {
+		var chartOptions = this.chartOptions,
+			getValueCount = function (type) {
+				return (Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap || [0]).length;
+			},
+			globalType = chartOptions && chartOptions.chart && chartOptions.chart.type,
+			individualCounts = [];
+
+		each((chartOptions && chartOptions.series) || [], function (series) {
+			individualCounts.push(getValueCount(series.type || globalType));
+		});
+
+		this.valueCount = {
+			global: getValueCount(globalType),
+			individual: individualCounts
+		};
+	},
+
+	/**
+	 * When the data is parsed into columns, either by CSV, table, GS or direct input,
+	 * continue with other operations.
+	 */
+	dataFound: function () {
+		
+		if (this.options.switchRowsAndColumns) {
+			this.columns = this.rowsToColumns(this.columns);
+		}
+
+		// Interpret the values into right types
+		this.parseTypes();
+		
+		// Use first row for series names?
+		this.findHeaderRow();
+		
+		// Handle columns if a handleColumns callback is given
+		this.parsed();
+		
+		// Complete if a complete callback is given
+		this.complete();
+		
+	},
+	
+	/**
+	 * Parse a CSV input string
+	 */
+	parseCSV: function () {
+		var self = this,
+			options = this.options,
+			csv = options.csv,
+			columns = this.columns,
+			startRow = options.startRow || 0,
+			endRow = options.endRow || Number.MAX_VALUE,
+			startColumn = options.startColumn || 0,
+			endColumn = options.endColumn || Number.MAX_VALUE,
+			itemDelimiter,
+			lines,
+			activeRowNo = 0;
+			
+		if (csv) {
+			
+			lines = csv
+				.replace(/\r\n/g, "\n") // Unix
+				.replace(/\r/g, "\n") // Mac
+				.split(options.lineDelimiter || "\n");
+
+			itemDelimiter = options.itemDelimiter || (csv.indexOf('\t') !== -1 ? '\t' : ',');
+			
+			each(lines, function (line, rowNo) {
+				var trimmed = self.trim(line),
+					isComment = trimmed.indexOf('#') === 0,
+					isBlank = trimmed === '',
+					items;
+				
+				if (rowNo >= startRow && rowNo <= endRow && !isComment && !isBlank) {
+					items = line.split(itemDelimiter);
+					each(items, function (item, colNo) {
+						if (colNo >= startColumn && colNo <= endColumn) {
+							if (!columns[colNo - startColumn]) {
+								columns[colNo - startColumn] = [];					
+							}
+							
+							columns[colNo - startColumn][activeRowNo] = item;
+						}
+					});
+					activeRowNo += 1;
+				}
+			});
+
+			this.dataFound();
+		}
+	},
+	
+	/**
+	 * Parse a HTML table
+	 */
+	parseTable: function () {
+		var options = this.options,
+			table = options.table,
+			columns = this.columns,
+			startRow = options.startRow || 0,
+			endRow = options.endRow || Number.MAX_VALUE,
+			startColumn = options.startColumn || 0,
+			endColumn = options.endColumn || Number.MAX_VALUE;
+
+		if (table) {
+			
+			if (typeof table === 'string') {
+				table = document.getElementById(table);
+			}
+			
+			each(table.getElementsByTagName('tr'), function (tr, rowNo) {
+				if (rowNo >= startRow && rowNo <= endRow) {
+					each(tr.children, function (item, colNo) {
+						if ((item.tagName === 'TD' || item.tagName === 'TH') && colNo >= startColumn && colNo <= endColumn) {
+							if (!columns[colNo - startColumn]) {
+								columns[colNo - startColumn] = [];					
+							}
+							
+							columns[colNo - startColumn][rowNo - startRow] = item.innerHTML;
+						}
+					});
+				}
+			});
+
+			this.dataFound(); // continue
+		}
+	},
+
+	/**
+	 */
+	parseGoogleSpreadsheet: function () {
+		var self = this,
+			options = this.options,
+			googleSpreadsheetKey = options.googleSpreadsheetKey,
+			columns = this.columns,
+			startRow = options.startRow || 0,
+			endRow = options.endRow || Number.MAX_VALUE,
+			startColumn = options.startColumn || 0,
+			endColumn = options.endColumn || Number.MAX_VALUE,
+			gr, // google row
+			gc; // google column
+
+		if (googleSpreadsheetKey) {
+			jQuery.ajax({
+				dataType: 'json', 
+				url: 'https://spreadsheets.google.com/feeds/cells/' + 
+				  googleSpreadsheetKey + '/' + (options.googleSpreadsheetWorksheet || 'od6') +
+					  '/public/values?alt=json-in-script&callback=?',
+				error: options.error,
+				success: function (json) {
+					// Prepare the data from the spreadsheat
+					var cells = json.feed.entry,
+						cell,
+						cellCount = cells.length,
+						colCount = 0,
+						rowCount = 0,
+						i;
+				
+					// First, find the total number of columns and rows that 
+					// are actually filled with data
+					for (i = 0; i < cellCount; i++) {
+						cell = cells[i];
+						colCount = Math.max(colCount, cell.gs$cell.col);
+						rowCount = Math.max(rowCount, cell.gs$cell.row);			
+					}
+				
+					// Set up arrays containing the column data
+					for (i = 0; i < colCount; i++) {
+						if (i >= startColumn && i <= endColumn) {
+							// Create new columns with the length of either end-start or rowCount
+							columns[i - startColumn] = [];
+
+							// Setting the length to avoid jslint warning
+							columns[i - startColumn].length = Math.min(rowCount, endRow - startRow);
+						}
+					}
+					
+					// Loop over the cells and assign the value to the right
+					// place in the column arrays
+					for (i = 0; i < cellCount; i++) {
+						cell = cells[i];
+						gr = cell.gs$cell.row - 1; // rows start at 1
+						gc = cell.gs$cell.col - 1; // columns start at 1
+
+						// If both row and col falls inside start and end
+						// set the transposed cell value in the newly created columns
+						if (gc >= startColumn && gc <= endColumn &&
+							gr >= startRow && gr <= endRow) {
+							columns[gc - startColumn][gr - startRow] = cell.content.$t;
+						}
+					}
+					self.dataFound();
+				}
+			});
+		}
+	},
+	
+	/**
+	 * Find the header row. For now, we just check whether the first row contains
+	 * numbers or strings. Later we could loop down and find the first row with 
+	 * numbers.
+	 */
+	findHeaderRow: function () {
+		var headerRow = 0;
+		each(this.columns, function (column) {
+			if (typeof column[0] !== 'string') {
+				headerRow = null;
+			}
+		});
+		this.headerRow = 0;
+	},
+	
+	/**
+	 * Trim a string from whitespace
+	 */
+	trim: function (str) {
+		return typeof str === 'string' ? str.replace(/^\s+|\s+$/g, '') : str;
+	},
+	
+	/**
+	 * Parse numeric cells in to number types and date types in to true dates.
+	 */
+	parseTypes: function () {
+		var columns = this.columns,
+			col = columns.length, 
+			row,
+			val,
+			floatVal,
+			trimVal,
+			dateVal;
+			
+		while (col--) {
+			row = columns[col].length;
+			while (row--) {
+				val = columns[col][row];
+				floatVal = parseFloat(val);
+				trimVal = this.trim(val);
+
+				/*jslint eqeq: true*/
+				if (trimVal == floatVal) { // is numeric
+				/*jslint eqeq: false*/
+					columns[col][row] = floatVal;
+					
+					// If the number is greater than milliseconds in a year, assume datetime
+					if (floatVal > 365 * 24 * 3600 * 1000) {
+						columns[col].isDatetime = true;
+					} else {
+						columns[col].isNumeric = true;
+					}					
+				
+				} else { // string, continue to determine if it is a date string or really a string
+					dateVal = this.parseDate(val);
+					
+					if (col === 0 && typeof dateVal === 'number' && !isNaN(dateVal)) { // is date
+						columns[col][row] = dateVal;
+						columns[col].isDatetime = true;
+					
+					} else { // string
+						columns[col][row] = trimVal === '' ? null : trimVal;
+					}
+				}
+				
+			}
+		}
+	},
+	
+	/**
+	 * A collection of available date formats, extendable from the outside to support
+	 * custom date formats.
+	 */
+	dateFormats: {
+		'YYYY-mm-dd': {
+			regex: '^([0-9]{4})-([0-9]{2})-([0-9]{2})$',
+			parser: function (match) {
+				return Date.UTC(+match[1], match[2] - 1, +match[3]);
+			}
+		}
+	},
+	
+	/**
+	 * Parse a date and return it as a number. Overridable through options.parseDate.
+	 */
+	parseDate: function (val) {
+		var parseDate = this.options.parseDate,
+			ret,
+			key,
+			format,
+			match;
+
+		if (parseDate) {
+			ret = parseDate(val);
+		}
+			
+		if (typeof val === 'string') {
+			for (key in this.dateFormats) {
+				format = this.dateFormats[key];
+				match = val.match(format.regex);
+				if (match) {
+					ret = format.parser(match);
+				}
+			}
+		}
+		return ret;
+	},
+	
+	/**
+	 * Reorganize rows into columns
+	 */
+	rowsToColumns: function (rows) {
+		var row,
+			rowsLength,
+			col,
+			colsLength,
+			columns;
+
+		if (rows) {
+			columns = [];
+			rowsLength = rows.length;
+			for (row = 0; row < rowsLength; row++) {
+				colsLength = rows[row].length;
+				for (col = 0; col < colsLength; col++) {
+					if (!columns[col]) {
+						columns[col] = [];
+					}
+					columns[col][row] = rows[row][col];
+				}
+			}
+		}
+		return columns;
+	},
+	
+	/**
+	 * A hook for working directly on the parsed columns
+	 */
+	parsed: function () {
+		if (this.options.parsed) {
+			this.options.parsed.call(this, this.columns);
+		}
+	},
+	
+	/**
+	 * If a complete callback function is provided in the options, interpret the 
+	 * columns into a Highcharts options object.
+	 */
+	complete: function () {
+		
+		var columns = this.columns,
+			firstCol,
+			type,
+			options = this.options,
+			valueCount,
+			series,
+			data,
+			i,
+			j,
+			seriesIndex,
+			chartOptions;
+			
+		
+		if (options.complete || options.afterComplete) {
+
+			this.getColumnDistribution();
+			
+			// Use first column for X data or categories?
+			if (columns.length > 1) {
+				firstCol = columns.shift();
+				if (this.headerRow === 0) {
+					firstCol.shift(); // remove the first cell
+				}
+				
+				
+				if (firstCol.isDatetime) {
+					type = 'datetime';
+				} else if (!firstCol.isNumeric) {
+					type = 'category';
+				}
+			}
+
+			// Get the names and shift the top row
+			for (i = 0; i < columns.length; i++) {
+				if (this.headerRow === 0) {
+					columns[i].name = columns[i].shift();
+				}
+			}
+			
+			// Use the next columns for series
+			series = [];
+			for (i = 0, seriesIndex = 0; i < columns.length; seriesIndex++) {
+
+				// This series' value count
+				valueCount = Highcharts.pick(this.valueCount.individual[seriesIndex], this.valueCount.global);
+				
+				// Iterate down the cells of each column and add data to the series
+				data = [];
+
+				// Only loop and fill the data series if there are columns available.
+				// We need this check to avoid reading outside the array bounds.
+				if (i + valueCount <= columns.length) {
+					for (j = 0; j < columns[i].length; j++) {
+						data[j] = [
+							firstCol[j],
+							columns[i][j] !== undefined ? columns[i][j] : null
+						];
+						if (valueCount > 1) {
+							data[j].push(columns[i + 1][j] !== undefined ? columns[i + 1][j] : null);
+						}
+						if (valueCount > 2) {
+							data[j].push(columns[i + 2][j] !== undefined ? columns[i + 2][j] : null);
+						}
+						if (valueCount > 3) {
+							data[j].push(columns[i + 3][j] !== undefined ? columns[i + 3][j] : null);
+						}
+						if (valueCount > 4) {
+							data[j].push(columns[i + 4][j] !== undefined ? columns[i + 4][j] : null);
+						}
+					}
+				}
+
+				// Add the series
+				series[seriesIndex] = {
+					name: columns[i].name,
+					data: data
+				};
+
+				i += valueCount;
+			}
+			
+			// Do the callback
+			chartOptions = {
+				xAxis: {
+					type: type
+				},
+				series: series
+			};
+			if (options.complete) {
+				options.complete(chartOptions);
+			}
+			// The afterComplete hook is used internally to avoid conflict with the externally
+			// available complete option.
+			if (options.afterComplete) {
+				options.afterComplete(chartOptions);
+			}
+		}
+	}
+	});
+	
+	// Register the Data prototype and data function on Highcharts
+	Highcharts.Data = Data;
+	Highcharts.data = function (options, chartOptions) {
+		return new Data(options, chartOptions);
+	};
+
+	// Extend Chart.init so that the Chart constructor accepts a new configuration
+	// option group, data.
+	Highcharts.wrap(Highcharts.Chart.prototype, 'init', function (proceed, userOptions, callback) {
+		var chart = this;
+
+		if (userOptions && userOptions.data) {
+			Highcharts.data(Highcharts.extend(userOptions.data, {
+				afterComplete: function (dataOptions) {
+					var i, series;
+					
+					// Merge series configs
+					if (userOptions.hasOwnProperty('series')) {
+						if (typeof userOptions.series === 'object') {
+							i = Math.max(userOptions.series.length, dataOptions.series.length);
+							while (i--) {
+								series = userOptions.series[i] || {};
+								userOptions.series[i] = Highcharts.merge(series, dataOptions.series[i]);
+							}
+						} else { // Allow merging in dataOptions.series (#2856)
+							delete userOptions.series;
+						}
+					}
+
+					// Do the merge
+					userOptions = Highcharts.merge(dataOptions, userOptions);
+
+					proceed.call(chart, userOptions, callback);
+				}
+			}), userOptions);
+		} else {
+			proceed.call(chart, userOptions, callback);
+		}
+	});
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/drilldown.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/drilldown.js
new file mode 100644
index 0000000..f8e3517
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/drilldown.js
@@ -0,0 +1,14 @@
+(function(g){function s(a,b,d){return"rgba("+[Math.round(a[0]+(b[0]-a[0])*d),Math.round(a[1]+(b[1]-a[1])*d),Math.round(a[2]+(b[2]-a[2])*d),a[3]+(b[3]-a[3])*d].join(",")+")"}var t=function(){},o=g.getOptions(),i=g.each,p=g.extend,x=g.format,y=g.pick,q=g.wrap,l=g.Chart,n=g.seriesTypes,u=n.pie,m=n.column,v=HighchartsAdapter.fireEvent,z=HighchartsAdapter.inArray;p(o.lang,{drillUpText:"◁ Back to {series.name}"});o.drilldown={activeAxisLabelStyle:{cursor:"pointer",color:"#0d233a",fontWeight:"bold",textDecoration:"underline"},
+activeDataLabelStyle:{cursor:"pointer",color:"#0d233a",fontWeight:"bold",textDecoration:"underline"},animation:{duration:500},drillUpButton:{position:{align:"right",x:-10,y:10}}};g.SVGRenderer.prototype.Element.prototype.fadeIn=function(a){this.attr({opacity:0.1,visibility:"inherit"}).animate({opacity:y(this.newOpacity,1)},a||{duration:250})};l.prototype.addSeriesAsDrilldown=function(a,b){this.addSingleSeriesAsDrilldown(a,b);this.applyDrilldown()};l.prototype.addSingleSeriesAsDrilldown=function(a,
+b){var d=a.series,c=d.xAxis,f=d.yAxis,h;h=a.color||d.color;var e,w=[],g=[],k;k=d.levelNumber||0;b=p({color:h},b);e=z(a,d.points);i(d.chart.series,function(a){if(a.xAxis===c)w.push(a),g.push(a.userOptions),a.levelNumber=a.levelNumber||0});h={levelNumber:k,seriesOptions:d.userOptions,levelSeriesOptions:g,levelSeries:w,shapeArgs:a.shapeArgs,bBox:a.graphic.getBBox(),color:h,lowerSeriesOptions:b,pointOptions:d.options.data[e],pointIndex:e,oldExtremes:{xMin:c&&c.userMin,xMax:c&&c.userMax,yMin:f&&f.userMin,
+yMax:f&&f.userMax}};if(!this.drilldownLevels)this.drilldownLevels=[];this.drilldownLevels.push(h);h=h.lowerSeries=this.addSeries(b,!1);h.levelNumber=k+1;if(c)c.oldPos=c.pos,c.userMin=c.userMax=null,f.userMin=f.userMax=null;if(d.type===h.type)h.animate=h.animateDrilldown||t,h.options.animation=!0};l.prototype.applyDrilldown=function(){var a=this.drilldownLevels,b=a[a.length-1].levelNumber;i(this.drilldownLevels,function(a){a.levelNumber===b&&i(a.levelSeries,function(a){a.levelNumber===b&&a.remove(!1)})});
+this.redraw();this.showDrillUpButton()};l.prototype.getDrilldownBackText=function(){var a=this.drilldownLevels[this.drilldownLevels.length-1];a.series=a.seriesOptions;return x(this.options.lang.drillUpText,a)};l.prototype.showDrillUpButton=function(){var a=this,b=this.getDrilldownBackText(),d=a.options.drilldown.drillUpButton,c,f;this.drillUpButton?this.drillUpButton.attr({text:b}).align():(f=(c=d.theme)&&c.states,this.drillUpButton=this.renderer.button(b,null,null,function(){a.drillUp()},c,f&&f.hover,
+f&&f.select).attr({align:d.position.align,zIndex:9}).add().align(d.position,!1,d.relativeTo||"plotBox"))};l.prototype.drillUp=function(){for(var a=this,b=a.drilldownLevels,d=b[b.length-1].levelNumber,c=b.length,f=a.series,h=f.length,e,g,j,k,l=function(b){var c;i(f,function(a){a.userOptions===b&&(c=a)});c=c||a.addSeries(b,!1);if(c.type===g.type&&c.animateDrillupTo)c.animate=c.animateDrillupTo;b===e.seriesOptions&&(j=c)};c--;)if(e=b[c],e.levelNumber===d){b.pop();g=e.lowerSeries;if(!g.chart)for(;h--;)if(f[h].options.id===
+e.lowerSeriesOptions.id){g=f[h];break}g.xData=[];i(e.levelSeriesOptions,l);v(a,"drillup",{seriesOptions:e.seriesOptions});if(j.type===g.type)j.drilldownLevel=e,j.options.animation=a.options.drilldown.animation,g.animateDrillupFrom&&g.animateDrillupFrom(e);j.levelNumber=d;g.remove(!1);if(j.xAxis)k=e.oldExtremes,j.xAxis.setExtremes(k.xMin,k.xMax,!1),j.yAxis.setExtremes(k.yMin,k.yMax,!1)}this.redraw();this.drilldownLevels.length===0?this.drillUpButton=this.drillUpButton.destroy():this.drillUpButton.attr({text:this.getDrilldownBackText()}).align()};
+m.prototype.supportsDrilldown=!0;m.prototype.animateDrillupTo=function(a){if(!a){var b=this,d=b.drilldownLevel;i(this.points,function(a){a.graphic.hide();a.dataLabel&&a.dataLabel.hide();a.connector&&a.connector.hide()});setTimeout(function(){i(b.points,function(a,b){var h=b===(d&&d.pointIndex)?"show":"fadeIn",e=h==="show"?!0:void 0;a.graphic[h](e);if(a.dataLabel)a.dataLabel[h](e);if(a.connector)a.connector[h](e)})},Math.max(this.chart.options.drilldown.animation.duration-50,0));this.animate=t}};m.prototype.animateDrilldown=
+function(a){var b=this,d=this.chart.drilldownLevels,c=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1].shapeArgs,f=this.chart.options.drilldown.animation;if(!a)i(d,function(a){if(b.userOptions===a.lowerSeriesOptions)c=a.shapeArgs}),c.x+=this.xAxis.oldPos-this.xAxis.pos,i(this.points,function(a){a.graphic&&a.graphic.attr(c).animate(a.shapeArgs,f);a.dataLabel&&a.dataLabel.fadeIn(f)}),this.animate=null};m.prototype.animateDrillupFrom=function(a){var b=this.chart.options.drilldown.animation,
+d=this.group,c=this;i(c.trackerGroups,function(a){if(c[a])c[a].on("mouseover")});delete this.group;i(this.points,function(c){var h=c.graphic,e=g.Color(c.color).rgba,i=g.Color(a.color).rgba,j=function(){h.destroy();d&&(d=d.destroy())};h&&(delete c.graphic,b?h.animate(a.shapeArgs,g.merge(b,{step:function(a,b){b.prop==="start"&&e.length===4&&i.length===4&&this.attr({fill:s(e,i,b.pos)})},complete:j})):(h.attr(a.shapeArgs),j()))})};u&&p(u.prototype,{supportsDrilldown:!0,animateDrillupTo:m.prototype.animateDrillupTo,
+animateDrillupFrom:m.prototype.animateDrillupFrom,animateDrilldown:function(a){var b=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],d=this.chart.options.drilldown.animation,c=b.shapeArgs,f=c.start,h=(c.end-f)/this.points.length,e=g.Color(b.color).rgba;if(!a)i(this.points,function(a,b){var i=g.Color(a.color).rgba;a.graphic.attr(g.merge(c,{start:f+b*h,end:f+(b+1)*h}))[d?"animate":"attr"](a.shapeArgs,g.merge(d,{step:function(a,b){b.prop==="start"&&e.length===4&&i.length===4&&this.attr({fill:s(e,
+i,b.pos)})}}))}),this.animate=null}});g.Point.prototype.doDrilldown=function(a){for(var b=this.series.chart,d=b.options.drilldown,c=(d.series||[]).length,f;c--&&!f;)d.series[c].id===this.drilldown&&(f=d.series[c]);v(b,"drilldown",{point:this,seriesOptions:f});f&&(a?b.addSingleSeriesAsDrilldown(this,f):b.addSeriesAsDrilldown(this,f))};q(g.Point.prototype,"init",function(a,b,d,c){var f=a.call(this,b,d,c),h=b.chart,e=(a=b.xAxis&&b.xAxis.ticks[c])&&a.label;if(f.drilldown){if(g.addEvent(f,"click",function(){f.doDrilldown()}),
+e){if(!e._basicStyle)e._basicStyle=e.element.getAttribute("style");e.addClass("highcharts-drilldown-axis-label").css(h.options.drilldown.activeAxisLabelStyle).on("click",function(){i(e.ddPoints,function(a){a.doDrilldown&&a.doDrilldown(!0)});h.applyDrilldown()});if(!e.ddPoints)e.ddPoints=[];e.ddPoints.push(f)}}else e&&e._basicStyle&&e.element.setAttribute("style",e._basicStyle);return f});q(g.Series.prototype,"drawDataLabels",function(a){var b=this.chart.options.drilldown.activeDataLabelStyle;a.call(this);
+i(this.points,function(a){if(a.drilldown&&a.dataLabel)a.dataLabel.attr({"class":"highcharts-drilldown-data-label"}).css(b).on("click",function(){a.doDrilldown()})})});var r,o=function(a){a.call(this);i(this.points,function(a){a.drilldown&&a.graphic&&a.graphic.attr({"class":"highcharts-drilldown-point"}).css({cursor:"pointer"})})};for(r in n)n[r].prototype.supportsDrilldown&&q(n[r].prototype,"drawTracker",o)})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/drilldown.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/drilldown.src.js
new file mode 100644
index 0000000..72aac35
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/drilldown.src.js
@@ -0,0 +1,586 @@
+/**
+ * Highcharts Drilldown plugin
+ * 
+ * Author: Torstein Honsi
+ * License: MIT License
+ *
+ * Demo: http://jsfiddle.net/highcharts/Vf3yT/
+ */
+
+/*global HighchartsAdapter*/
+(function (H) {
+
+	"use strict";
+
+	var noop = function () {},
+		defaultOptions = H.getOptions(),
+		each = H.each,
+		extend = H.extend,
+		format = H.format,
+		pick = H.pick,
+		wrap = H.wrap,
+		Chart = H.Chart,
+		seriesTypes = H.seriesTypes,
+		PieSeries = seriesTypes.pie,
+		ColumnSeries = seriesTypes.column,
+		fireEvent = HighchartsAdapter.fireEvent,
+		inArray = HighchartsAdapter.inArray;
+
+	// Utilities
+	function tweenColors(startColor, endColor, pos) {
+		var rgba = [
+				Math.round(startColor[0] + (endColor[0] - startColor[0]) * pos),
+				Math.round(startColor[1] + (endColor[1] - startColor[1]) * pos),
+				Math.round(startColor[2] + (endColor[2] - startColor[2]) * pos),
+				startColor[3] + (endColor[3] - startColor[3]) * pos
+			];
+		return 'rgba(' + rgba.join(',') + ')';
+	}
+
+	// Add language
+	extend(defaultOptions.lang, {
+		drillUpText: '◁ Back to {series.name}'
+	});
+	defaultOptions.drilldown = {
+		activeAxisLabelStyle: {
+			cursor: 'pointer',
+			color: '#0d233a',
+			fontWeight: 'bold',
+			textDecoration: 'underline'			
+		},
+		activeDataLabelStyle: {
+			cursor: 'pointer',
+			color: '#0d233a',
+			fontWeight: 'bold',
+			textDecoration: 'underline'			
+		},
+		animation: {
+			duration: 500
+		},
+		drillUpButton: {
+			position: { 
+				align: 'right',
+				x: -10,
+				y: 10
+			}
+			// relativeTo: 'plotBox'
+			// theme
+		}
+	};	
+
+	/**
+	 * A general fadeIn method
+	 */
+	H.SVGRenderer.prototype.Element.prototype.fadeIn = function (animation) {
+		this
+		.attr({
+			opacity: 0.1,
+			visibility: 'inherit'
+		})
+		.animate({
+			opacity: pick(this.newOpacity, 1) // newOpacity used in maps
+		}, animation || {
+			duration: 250
+		});
+	};
+
+	Chart.prototype.addSeriesAsDrilldown = function (point, ddOptions) {
+		this.addSingleSeriesAsDrilldown(point, ddOptions);
+		this.applyDrilldown();
+	};
+	Chart.prototype.addSingleSeriesAsDrilldown = function (point, ddOptions) {
+		var oldSeries = point.series,
+			xAxis = oldSeries.xAxis,
+			yAxis = oldSeries.yAxis,
+			newSeries,
+			color = point.color || oldSeries.color,
+			pointIndex,
+			levelSeries = [],
+			levelSeriesOptions = [],
+			level,
+			levelNumber;
+
+		levelNumber = oldSeries.levelNumber || 0;
+			
+		ddOptions = extend({
+			color: color
+		}, ddOptions);
+		pointIndex = inArray(point, oldSeries.points);
+
+		// Record options for all current series
+		each(oldSeries.chart.series, function (series) {
+			if (series.xAxis === xAxis) {
+				levelSeries.push(series);
+				levelSeriesOptions.push(series.userOptions);
+				series.levelNumber = series.levelNumber || 0;
+			}
+		});
+		
+		// Add a record of properties for each drilldown level
+		level = {
+			levelNumber: levelNumber,
+			seriesOptions: oldSeries.userOptions,
+			levelSeriesOptions: levelSeriesOptions,
+			levelSeries: levelSeries,
+			shapeArgs: point.shapeArgs,
+			bBox: point.graphic.getBBox(),
+			color: color,
+			lowerSeriesOptions: ddOptions,
+			pointOptions: oldSeries.options.data[pointIndex],
+			pointIndex: pointIndex,
+			oldExtremes: {
+				xMin: xAxis && xAxis.userMin,
+				xMax: xAxis && xAxis.userMax,
+				yMin: yAxis && yAxis.userMin,
+				yMax: yAxis && yAxis.userMax
+			}
+		};
+
+		// Generate and push it to a lookup array
+		if (!this.drilldownLevels) {
+			this.drilldownLevels = [];
+		}
+		this.drilldownLevels.push(level);
+
+		newSeries = level.lowerSeries = this.addSeries(ddOptions, false);
+		newSeries.levelNumber = levelNumber + 1;
+		if (xAxis) {
+			xAxis.oldPos = xAxis.pos;
+			xAxis.userMin = xAxis.userMax = null;
+			yAxis.userMin = yAxis.userMax = null;
+		}
+
+		// Run fancy cross-animation on supported and equal types
+		if (oldSeries.type === newSeries.type) {
+			newSeries.animate = newSeries.animateDrilldown || noop;
+			newSeries.options.animation = true;
+		}
+	};
+
+	Chart.prototype.applyDrilldown = function () {
+		var drilldownLevels = this.drilldownLevels, 
+			levelToRemove = drilldownLevels[drilldownLevels.length - 1].levelNumber;
+		
+		each(this.drilldownLevels, function (level) {
+			if (level.levelNumber === levelToRemove) {
+				each(level.levelSeries, function (series) {
+					if (series.levelNumber === levelToRemove) { // Not removed, not added as part of a multi-series drilldown
+						series.remove(false);
+					}
+				});
+			}
+		});
+		
+		this.redraw();
+		this.showDrillUpButton();
+	};
+
+	Chart.prototype.getDrilldownBackText = function () {
+		var lastLevel = this.drilldownLevels[this.drilldownLevels.length - 1];
+		lastLevel.series = lastLevel.seriesOptions;
+		return format(this.options.lang.drillUpText, lastLevel);
+
+	};
+
+	Chart.prototype.showDrillUpButton = function () {
+		var chart = this,
+			backText = this.getDrilldownBackText(),
+			buttonOptions = chart.options.drilldown.drillUpButton,
+			attr,
+			states;
+			
+
+		if (!this.drillUpButton) {
+			attr = buttonOptions.theme;
+			states = attr && attr.states;
+						
+			this.drillUpButton = this.renderer.button(
+				backText,
+				null,
+				null,
+				function () {
+					chart.drillUp(); 
+				},
+				attr, 
+				states && states.hover,
+				states && states.select
+			)
+			.attr({
+				align: buttonOptions.position.align,
+				zIndex: 9
+			})
+			.add()
+			.align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');
+		} else {
+			this.drillUpButton.attr({
+				text: backText
+			})
+			.align();
+		}
+	};
+
+	Chart.prototype.drillUp = function () {
+		var chart = this,
+			drilldownLevels = chart.drilldownLevels,
+			levelNumber = drilldownLevels[drilldownLevels.length - 1].levelNumber,
+			i = drilldownLevels.length,
+			chartSeries = chart.series,
+			seriesI = chartSeries.length,
+			level,
+			oldSeries,
+			newSeries,
+			oldExtremes,
+			addSeries = function (seriesOptions) {
+				var addedSeries;
+				each(chartSeries, function (series) {
+					if (series.userOptions === seriesOptions) {
+						addedSeries = series;
+					}
+				});
+
+				addedSeries = addedSeries || chart.addSeries(seriesOptions, false);
+				if (addedSeries.type === oldSeries.type && addedSeries.animateDrillupTo) {
+					addedSeries.animate = addedSeries.animateDrillupTo;
+				}
+				if (seriesOptions === level.seriesOptions) {
+					newSeries = addedSeries;
+				}
+			};
+		
+		while (i--) {
+
+			level = drilldownLevels[i];
+			if (level.levelNumber === levelNumber) {
+				drilldownLevels.pop();
+				
+				// Get the lower series by reference or id
+				oldSeries = level.lowerSeries;
+				if (!oldSeries.chart) {  // #2786
+					while (seriesI--) {
+						if (chartSeries[seriesI].options.id === level.lowerSeriesOptions.id) {
+							oldSeries = chartSeries[seriesI];
+							break;
+						}
+					}
+				}
+				oldSeries.xData = []; // Overcome problems with minRange (#2898)
+
+				each(level.levelSeriesOptions, addSeries);
+				
+				fireEvent(chart, 'drillup', { seriesOptions: level.seriesOptions });
+
+				if (newSeries.type === oldSeries.type) {
+					newSeries.drilldownLevel = level;
+					newSeries.options.animation = chart.options.drilldown.animation;
+
+					if (oldSeries.animateDrillupFrom) {
+						oldSeries.animateDrillupFrom(level);
+					}
+				}
+				newSeries.levelNumber = levelNumber;
+				
+				oldSeries.remove(false);
+
+				// Reset the zoom level of the upper series
+				if (newSeries.xAxis) {
+					oldExtremes = level.oldExtremes;
+					newSeries.xAxis.setExtremes(oldExtremes.xMin, oldExtremes.xMax, false);
+					newSeries.yAxis.setExtremes(oldExtremes.yMin, oldExtremes.yMax, false);
+				}
+			}
+		}
+
+		this.redraw();
+
+		if (this.drilldownLevels.length === 0) {
+			this.drillUpButton = this.drillUpButton.destroy();
+		} else {
+			this.drillUpButton.attr({
+				text: this.getDrilldownBackText()
+			})
+			.align();
+		}
+	};
+
+
+	ColumnSeries.prototype.supportsDrilldown = true;
+	
+	/**
+	 * When drilling up, keep the upper series invisible until the lower series has
+	 * moved into place
+	 */
+	ColumnSeries.prototype.animateDrillupTo = function (init) {
+		if (!init) {
+			var newSeries = this,
+				level = newSeries.drilldownLevel;
+
+			each(this.points, function (point) {
+				point.graphic.hide();
+				if (point.dataLabel) {
+					point.dataLabel.hide();
+				}
+				if (point.connector) {
+					point.connector.hide();
+				}
+			});
+
+
+			// Do dummy animation on first point to get to complete
+			setTimeout(function () {
+				each(newSeries.points, function (point, i) {  
+					// Fade in other points			  
+					var verb = i === (level && level.pointIndex) ? 'show' : 'fadeIn',
+						inherit = verb === 'show' ? true : undefined;
+					point.graphic[verb](inherit);
+					if (point.dataLabel) {
+						point.dataLabel[verb](inherit);
+					}
+					if (point.connector) {
+						point.connector[verb](inherit);
+					}
+				});
+			}, Math.max(this.chart.options.drilldown.animation.duration - 50, 0));
+
+			// Reset
+			this.animate = noop;
+		}
+
+	};
+	
+	ColumnSeries.prototype.animateDrilldown = function (init) {
+		var series = this,
+			drilldownLevels = this.chart.drilldownLevels,
+			animateFrom = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1].shapeArgs,
+			animationOptions = this.chart.options.drilldown.animation;
+			
+		if (!init) {
+			each(drilldownLevels, function (level) {
+				if (series.userOptions === level.lowerSeriesOptions) {
+					animateFrom = level.shapeArgs;
+				}
+			});
+
+			animateFrom.x += (this.xAxis.oldPos - this.xAxis.pos);
+	
+			each(this.points, function (point) {
+				if (point.graphic) {
+					point.graphic
+						.attr(animateFrom)
+						.animate(point.shapeArgs, animationOptions);
+				}
+				if (point.dataLabel) {
+					point.dataLabel.fadeIn(animationOptions);
+				}
+			});
+			this.animate = null;
+		}
+		
+	};
+
+	/**
+	 * When drilling up, pull out the individual point graphics from the lower series
+	 * and animate them into the origin point in the upper series.
+	 */
+	ColumnSeries.prototype.animateDrillupFrom = function (level) {
+		var animationOptions = this.chart.options.drilldown.animation,
+			group = this.group,
+			series = this;
+
+		// Cancel mouse events on the series group (#2787)
+		each(series.trackerGroups, function (key) {
+			if (series[key]) { // we don't always have dataLabelsGroup
+				series[key].on('mouseover');
+			}
+		});
+			
+
+		delete this.group;
+		each(this.points, function (point) {
+			var graphic = point.graphic,
+				startColor = H.Color(point.color).rgba,
+				endColor = H.Color(level.color).rgba,
+				complete = function () {
+					graphic.destroy();
+					if (group) {
+						group = group.destroy();
+					}
+				};
+
+			if (graphic) {
+			
+				delete point.graphic;
+
+				if (animationOptions) {
+					/*jslint unparam: true*/
+					graphic.animate(level.shapeArgs, H.merge(animationOptions, {
+						step: function (val, fx) {
+							if (fx.prop === 'start' && startColor.length === 4 && endColor.length === 4) {
+								this.attr({
+									fill: tweenColors(startColor, endColor, fx.pos)
+								});
+							}
+						},
+						complete: complete
+					}));
+					/*jslint unparam: false*/
+				} else {
+					graphic.attr(level.shapeArgs);
+					complete();
+				}
+			}
+		});
+	};
+
+	if (PieSeries) {
+		extend(PieSeries.prototype, {
+			supportsDrilldown: true,
+			animateDrillupTo: ColumnSeries.prototype.animateDrillupTo,
+			animateDrillupFrom: ColumnSeries.prototype.animateDrillupFrom,
+
+			animateDrilldown: function (init) {
+				var level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],
+					animationOptions = this.chart.options.drilldown.animation,
+					animateFrom = level.shapeArgs,
+					start = animateFrom.start,
+					angle = animateFrom.end - start,
+					startAngle = angle / this.points.length,
+					startColor = H.Color(level.color).rgba;
+
+				if (!init) {
+					each(this.points, function (point, i) {
+						var endColor = H.Color(point.color).rgba;
+
+						/*jslint unparam: true*/
+						point.graphic
+							.attr(H.merge(animateFrom, {
+								start: start + i * startAngle,
+								end: start + (i + 1) * startAngle
+							}))[animationOptions ? 'animate' : 'attr'](point.shapeArgs, H.merge(animationOptions, {
+								step: function (val, fx) {
+									if (fx.prop === 'start' && startColor.length === 4 && endColor.length === 4) {
+										this.attr({
+											fill: tweenColors(startColor, endColor, fx.pos)
+										});
+									}
+								}
+							}));
+						/*jslint unparam: false*/
+					});
+					this.animate = null;
+				}
+			}
+		});
+	}
+	
+	H.Point.prototype.doDrilldown = function (_holdRedraw) {
+		var series = this.series,
+			chart = series.chart,
+			drilldown = chart.options.drilldown,
+			i = (drilldown.series || []).length,
+			seriesOptions;
+		
+		while (i-- && !seriesOptions) {
+			if (drilldown.series[i].id === this.drilldown) {
+				seriesOptions = drilldown.series[i];
+			}
+		}
+
+		// Fire the event. If seriesOptions is undefined, the implementer can check for 
+		// seriesOptions, and call addSeriesAsDrilldown async if necessary.
+		fireEvent(chart, 'drilldown', { 
+			point: this,
+			seriesOptions: seriesOptions
+		});
+		
+		if (seriesOptions) {
+			if (_holdRedraw) {
+				chart.addSingleSeriesAsDrilldown(this, seriesOptions);
+			} else {
+				chart.addSeriesAsDrilldown(this, seriesOptions);
+			}
+		}
+
+	};
+	
+	wrap(H.Point.prototype, 'init', function (proceed, series, options, x) {
+		var point = proceed.call(this, series, options, x),
+			chart = series.chart,
+			tick = series.xAxis && series.xAxis.ticks[x],
+			tickLabel = tick && tick.label;
+		
+		if (point.drilldown) {
+			
+			// Add the click event to the point label
+			H.addEvent(point, 'click', function () {
+				point.doDrilldown();
+			});
+			
+			// Make axis labels clickable
+			if (tickLabel) {
+				if (!tickLabel._basicStyle) {
+					tickLabel._basicStyle = tickLabel.element.getAttribute('style');
+				}
+				tickLabel
+					.addClass('highcharts-drilldown-axis-label')
+					.css(chart.options.drilldown.activeAxisLabelStyle)
+					.on('click', function () {
+						each(tickLabel.ddPoints, function (point) {
+							if (point.doDrilldown) {
+								point.doDrilldown(true);
+							}
+						});
+						chart.applyDrilldown();
+					});
+				if (!tickLabel.ddPoints) {
+					tickLabel.ddPoints = [];
+				}
+				tickLabel.ddPoints.push(point);
+					
+			}
+		} else if (tickLabel && tickLabel._basicStyle) {
+			tickLabel.element.setAttribute('style', tickLabel._basicStyle);
+		}
+		
+		return point;
+	});
+
+	wrap(H.Series.prototype, 'drawDataLabels', function (proceed) {
+		var css = this.chart.options.drilldown.activeDataLabelStyle;
+
+		proceed.call(this);
+
+		each(this.points, function (point) {
+			if (point.drilldown && point.dataLabel) {
+				point.dataLabel
+					.attr({
+						'class': 'highcharts-drilldown-data-label'
+					})
+					.css(css)
+					.on('click', function () {
+						point.doDrilldown();
+					});
+			}
+		});
+	});
+
+	// Mark the trackers with a pointer 
+	var type, 
+		drawTrackerWrapper = function (proceed) {
+			proceed.call(this);
+			each(this.points, function (point) {
+				if (point.drilldown && point.graphic) {
+					point.graphic
+						.attr({
+							'class': 'highcharts-drilldown-point'
+						})
+						.css({ cursor: 'pointer' });
+				}
+			});
+		};
+	for (type in seriesTypes) {
+		if (seriesTypes[type].prototype.supportsDrilldown) {
+			wrap(seriesTypes[type].prototype, 'drawTracker', drawTrackerWrapper);
+		}
+	}
+		
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/exporting.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/exporting.js
new file mode 100644
index 0000000..83cb82e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/exporting.js
@@ -0,0 +1,17 @@
+
+(function(){var HC=Highcharts,Chart=HC.Chart,addEvent=HC.addEvent,removeEvent=HC.removeEvent,createElement=HC.createElement,discardElement=HC.discardElement,css=HC.css,merge=HC.merge,each=HC.each,extend=HC.extend,math=Math,mathMax=math.max,doc=document,win=window,hasTouch=doc.documentElement.ontouchstart!==undefined,M='M',L='L',DIV='div',HIDDEN='hidden',NONE='none',PREFIX='highcharts-',ABSOLUTE='absolute',PX='px',UNDEFINED,defaultOptions=HC.getOptions();extend(defaultOptions.lang,{downloadPNG:'Download PNG image',downloadJPEG:'Download JPEG image',downloadPDF:'Download PDF document',downloadSVG:'Download SVG vector image',exportButtonTitle:'Export to raster or vector image',printButtonTitle:'Print the chart'});defaultOptions.navigation={menuStyle:{border:'1px solid #A0A0A0',background:'#FFFFFF'},menuItemStyle:{padding:'0 5px',background:NONE,color:'#303030',fontSize:hasTouch?'14px':'11px'},menuItemHoverStyle:{background:'#4572A5',color:'#FFFFFF'},buttonOptions:{align:'right',backgroundColor:{linearGradient:[0,0,0,20],stops:[[0.4,'#F7F7F7'],[0.6,'#E3E3E3']]},borderColor:'#B0B0B0',borderRadius:3,borderWidth:1,height:20,hoverBorderColor:'#909090',hoverSymbolFill:'#81A7CF',hoverSymbolStroke:'#4572A5',symbolFill:'#E0E0E0',symbolStroke:'#A0A0A0',symbolX:11.5,symbolY:10.5,verticalAlign:'top',width:24,y:10}};defaultOptions.exporting={type:'image/png',url:getPageDomain()+"/report/downloadHighcharts.action",width:800,buttons:{exportButton:{symbol:'exportIcon',x:-10,symbolFill:'#A8BF77',hoverSymbolFill:'#768F3E',_id:'exportButton',_titleKey:'exportButtonTitle',menuItems:[{textKey:'downloadPNG',onclick:function(){this.exportChart();}},{textKey:'downloadJPEG',onclick:function(){this.exportChart({type:'image/jpeg'});}},{textKey:'downloadPDF',onclick:function(){this.exportChart({type:'application/pdf'});}},{textKey:'downloadSVG',onclick:function(){this.exportChart({type:'image/svg+xml'});}}]},printButton:{symbol:'printIcon',x:-36,symbolFill:'#B5C9DF',hoverSymbolFill:'#779ABF',_id:'printButton',_titleKey:'printButtonTitle',onclick:function(){this.print();}}}};extend(Chart.prototype,{getSVG:function(additionalOptions){var chart=this,chartCopy,sandbox,svg,seriesOptions,options=merge(chart.options,additionalOptions);if(!doc.createElementNS){doc.createElementNS=function(ns,tagName){return doc.createElement(tagName);};}
+sandbox=createElement(DIV,null,{position:ABSOLUTE,top:'-9999em',width:chart.chartWidth+PX,height:chart.chartHeight+PX},doc.body);extend(options.chart,{renderTo:sandbox,forExport:true});options.exporting.enabled=false;options.chart.plotBackgroundImage=null;options.series=[];each(chart.series,function(serie){seriesOptions=merge(serie.options,{animation:false,showCheckbox:false,visible:serie.visible});if(!seriesOptions.isInternal){if(seriesOptions&&seriesOptions.marker&&/^url\(/.test(seriesOptions.marker.symbol)){seriesOptions.marker.symbol='circle';}
+options.series.push(seriesOptions);}});chartCopy=new Highcharts.Chart(options);each(['xAxis','yAxis'],function(axisType){each(chart[axisType],function(axis,i){var axisCopy=chartCopy[axisType][i],extremes=axis.getExtremes(),userMin=extremes.userMin,userMax=extremes.userMax;if(userMin!==UNDEFINED||userMax!==UNDEFINED){axisCopy.setExtremes(userMin,userMax,true,false);}});});svg=chartCopy.container.innerHTML;options=null;chartCopy.destroy();discardElement(sandbox);svg=svg.replace(/zIndex="[^"]+"/g,'').replace(/isShadow="[^"]+"/g,'').replace(/symbolName="[^"]+"/g,'').replace(/jQuery[0-9]+="[^"]+"/g,'').replace(/isTracker="[^"]+"/g,'').replace(/url\([^#]+#/g,'url(#').replace(/<svg /,'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ href=/g,' xlink:href=').replace(/\n/,' ').replace(/<\/svg>.*?$/,'</svg>').replace(/&nbsp;/g,'\u00A0').replace(/&shy;/g,'\u00AD').replace(/<IMG /g,'<image ').replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g,'width="$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href="$1"/>').replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" ]+)/g,'class="$1"').replace(/ transform /g,' ').replace(/:(path|rect)/g,'$1').replace(/style="([^"]+)"/g,function(s){return s.toLowerCase();});svg=svg.replace(/(url\(#highcharts-[0-9]+)&quot;/g,'$1').replace(/&quot;/g,"'");if(svg.match(/ xmlns="/g).length===2){svg=svg.replace(/xmlns="[^"]+"/,'');}
+return svg;},exportChart:function(options,chartOptions){var form,chart=this,svg=chart.getSVG(merge(chart.options.exporting.chartOptions,chartOptions));options=merge(chart.options.exporting,options);form=createElement('form',{method:'post',action:options.url},{display:NONE},doc.body);each(['filename','type','width','svg'],function(name){createElement('input',{type:HIDDEN,name:name,value:{filename:options.filename||'chart',type:options.type,width:options.width,svg:svg}[name]},null,form);});form.submit();discardElement(form);},getExportChart:function(options,chartOptions){var form,chart=this,svg=chart.getSVG(merge(chart.options.exporting.chartOptions,chartOptions));options=merge(chart.options.exporting,options);form=createElement('form',{method:'post',action:getPageDomain()+'/report/getExportChart.action'},{display:NONE},doc.body);each(['filename','type','width','svg'],function(name){var ele=createElement('input',{type:HIDDEN,name:name,value:{filename:options.filename||'chart',type:options.type,width:options.width,svg:svg}[name]},null,form);});$(form).ajaxFormSubmit({success:function(result){eval("var fn = "+options.callback);fn(result);}});discardElement(form);},print:function(){var chart=this,container=chart.container,origDisplay=[],origParent=container.parentNode,body=doc.body,childNodes=body.childNodes;if(chart.isPrinting){return;}
+chart.isPrinting=true;each(childNodes,function(node,i){if(node.nodeType===1){origDisplay[i]=node.style.display;node.style.display=NONE;}});body.appendChild(container);win.print();setTimeout(function(){origParent.appendChild(container);each(childNodes,function(node,i){if(node.nodeType===1){node.style.display=origDisplay[i];}});chart.isPrinting=false;},1000);},contextMenu:function(name,items,x,y,width,height){var chart=this,navOptions=chart.options.navigation,menuItemStyle=navOptions.menuItemStyle,chartWidth=chart.chartWidth,chartHeight=chart.chartHeight,cacheName='cache-'+name,menu=chart[cacheName],menuPadding=mathMax(width,height),boxShadow='3px 3px 10px #888',innerMenu,hide,menuStyle;if(!menu){chart[cacheName]=menu=createElement(DIV,{className:PREFIX+name},{position:ABSOLUTE,zIndex:1000,padding:menuPadding+PX},chart.container);innerMenu=createElement(DIV,null,extend({MozBoxShadow:boxShadow,WebkitBoxShadow:boxShadow,boxShadow:boxShadow},navOptions.menuStyle),menu);hide=function(){css(menu,{display:NONE});};addEvent(menu,'mouseleave',hide);each(items,function(item){if(item){var div=createElement(DIV,{onmouseover:function(){css(this,navOptions.menuItemHoverStyle);},onmouseout:function(){css(this,menuItemStyle);},innerHTML:item.text||chart.options.lang[item.textKey]},extend({cursor:'pointer'},menuItemStyle),innerMenu);div[hasTouch?'ontouchstart':'onclick']=function(){hide();item.onclick.apply(chart,arguments);};chart.exportDivElements.push(div);}});chart.exportDivElements.push(innerMenu,menu);chart.exportMenuWidth=menu.offsetWidth;chart.exportMenuHeight=menu.offsetHeight;}
+menuStyle={display:'block'};if(x+chart.exportMenuWidth>chartWidth){menuStyle.right=(chartWidth-x-width-menuPadding)+PX;}else{menuStyle.left=(x-menuPadding)+PX;}
+if(y+height+chart.exportMenuHeight>chartHeight){menuStyle.bottom=(chartHeight-y-menuPadding)+PX;}else{menuStyle.top=(y+height-menuPadding)+PX;}
+css(menu,menuStyle);},addButton:function(options){var chart=this,renderer=chart.renderer,btnOptions=merge(chart.options.navigation.buttonOptions,options),onclick=btnOptions.onclick,menuItems=btnOptions.menuItems,buttonWidth=btnOptions.width,buttonHeight=btnOptions.height,box,symbol,button,borderWidth=btnOptions.borderWidth,boxAttr={stroke:btnOptions.borderColor},symbolAttr={stroke:btnOptions.symbolStroke,fill:btnOptions.symbolFill},symbolSize=btnOptions.symbolSize||12;if(!chart.exportDivElements){chart.exportDivElements=[];chart.exportSVGElements=[];}
+if(btnOptions.enabled===false){return;}
+function revert(){symbol.attr(symbolAttr);box.attr(boxAttr);}
+box=renderer.rect(0,0,buttonWidth,buttonHeight,btnOptions.borderRadius,borderWidth).align(btnOptions,true).attr(extend({fill:btnOptions.backgroundColor,'stroke-width':borderWidth,zIndex:19},boxAttr)).add();button=renderer.rect(0,0,buttonWidth,buttonHeight,0).align(btnOptions).attr({id:btnOptions._id,fill:'rgba(255, 255, 255, 0.001)',title:chart.options.lang[btnOptions._titleKey],zIndex:21}).css({cursor:'pointer'}).on('mouseover',function(){symbol.attr({stroke:btnOptions.hoverSymbolStroke,fill:btnOptions.hoverSymbolFill});box.attr({stroke:btnOptions.hoverBorderColor});}).on('mouseout',revert).on('click',revert).add();if(menuItems){onclick=function(){revert();var bBox=button.getBBox();chart.contextMenu('export-menu',menuItems,bBox.x,bBox.y,buttonWidth,buttonHeight);};}
+button.on('click',function(){onclick.apply(chart,arguments);});symbol=renderer.symbol(btnOptions.symbol,btnOptions.symbolX-(symbolSize/2),btnOptions.symbolY-(symbolSize/2),symbolSize,symbolSize).align(btnOptions,true).attr(extend(symbolAttr,{'stroke-width':btnOptions.symbolStrokeWidth||1,zIndex:20})).add();chart.exportSVGElements.push(box,button,symbol);},destroyExport:function(){var i,chart=this,elem;for(i=0;i<chart.exportSVGElements.length;i++){elem=chart.exportSVGElements[i];elem.onclick=elem.ontouchstart=null;chart.exportSVGElements[i]=elem.destroy();}
+for(i=0;i<chart.exportDivElements.length;i++){elem=chart.exportDivElements[i];removeEvent(elem,'mouseleave');chart.exportDivElements[i]=elem.onmouseout=elem.onmouseover=elem.ontouchstart=elem.onclick=null;discardElement(elem);}}});function crisp(arr){var i=arr.length;while(i--){if(typeof arr[i]==='number'){arr[i]=Math.round(arr[i])-0.5;}}
+return arr;}
+HC.Renderer.prototype.symbols.exportIcon=function(x,y,width,height){return crisp([M,x,y+width,L,x+width,y+height,x+width,y+height*0.8,x,y+height*0.8,'Z',M,x+width*0.5,y+height*0.8,L,x+width*0.8,y+height*0.4,x+width*0.4,y+height*0.4,x+width*0.4,y,x+width*0.6,y,x+width*0.6,y+height*0.4,x+width*0.2,y+height*0.4,'Z']);};HC.Renderer.prototype.symbols.printIcon=function(x,y,width,height){return crisp([M,x,y+height*0.7,L,x+width,y+height*0.7,x+width,y+height*0.4,x,y+height*0.4,'Z',M,x+width*0.2,y+height*0.4,L,x+width*0.2,y,x+width*0.8,y,x+width*0.8,y+height*0.4,'Z',M,x+width*0.2,y+height*0.7,L,x,y+height,x+width,y+height,x+width*0.8,y+height*0.7,'Z']);};Chart.prototype.callbacks.push(function(chart){var n,exportingOptions=chart.options.exporting,buttons=exportingOptions.buttons;if(exportingOptions.enabled!==false){for(n in buttons){chart.addButton(buttons[n]);}
+addEvent(chart,'destroy',chart.destroyExport);}});}());
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/exporting.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/exporting.src.js
new file mode 100644
index 0000000..e62861a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/exporting.src.js
@@ -0,0 +1,775 @@
+/**
+ * @license Highcharts JS v2.2.5 (2012-06-08)
+ * Exporting module
+ *
+ * (c) 2010-2011 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts, document, window, Math, setTimeout */
+
+(function () { // encapsulate
+
+// create shortcuts
+var HC = Highcharts,
+	Chart = HC.Chart,
+	addEvent = HC.addEvent,
+	removeEvent = HC.removeEvent,
+	createElement = HC.createElement,
+	discardElement = HC.discardElement,
+	css = HC.css,
+	merge = HC.merge,
+	each = HC.each,
+	extend = HC.extend,
+	math = Math,
+	mathMax = math.max,
+	doc = document,
+	win = window,
+	hasTouch = doc.documentElement.ontouchstart !== undefined,
+	M = 'M',
+	L = 'L',
+	DIV = 'div',
+	HIDDEN = 'hidden',
+	NONE = 'none',
+	PREFIX = 'highcharts-',
+	ABSOLUTE = 'absolute',
+	PX = 'px',
+	UNDEFINED,
+	defaultOptions = HC.getOptions();
+
+	// Add language
+	extend(defaultOptions.lang, {
+		downloadPNG: 'Download PNG image',
+		downloadJPEG: 'Download JPEG image',
+		downloadPDF: 'Download PDF document',
+		downloadSVG: 'Download SVG vector image',
+		exportButtonTitle: 'Export to raster or vector image',
+		printButtonTitle: 'Print the chart'
+	});
+
+// Buttons and menus are collected in a separate config option set called 'navigation'.
+// This can be extended later to add control buttons like zoom and pan right click menus.
+defaultOptions.navigation = {
+	menuStyle: {
+		border: '1px solid #A0A0A0',
+		background: '#FFFFFF'
+	},
+	menuItemStyle: {
+		padding: '0 5px',
+		background: NONE,
+		color: '#303030',
+		fontSize: hasTouch ? '14px' : '11px'
+	},
+	menuItemHoverStyle: {
+		background: '#4572A5',
+		color: '#FFFFFF'
+	},
+
+	buttonOptions: {
+		align: 'right',
+		backgroundColor: {
+			linearGradient: [0, 0, 0, 20],
+			stops: [
+				[0.4, '#F7F7F7'],
+				[0.6, '#E3E3E3']
+			]
+		},
+		borderColor: '#B0B0B0',
+		borderRadius: 3,
+		borderWidth: 1,
+		//enabled: true,
+		height: 20,
+		hoverBorderColor: '#909090',
+		hoverSymbolFill: '#81A7CF',
+		hoverSymbolStroke: '#4572A5',
+		symbolFill: '#E0E0E0',
+		//symbolSize: 12,
+		symbolStroke: '#A0A0A0',
+		//symbolStrokeWidth: 1,
+		symbolX: 11.5,
+		symbolY: 10.5,
+		verticalAlign: 'top',
+		width: 24,
+		y: 10
+	}
+};
+
+
+
+// Add the export related options
+defaultOptions.exporting = {
+	//enabled: true,
+	//filename: 'chart',
+	type: 'image/png',
+	url: getPageDomain()+"/report/downloadHighcharts.action",
+	width: 800,
+	buttons: {
+		exportButton: {
+			//enabled: true,
+			symbol: 'exportIcon',
+			x: -10,
+			symbolFill: '#A8BF77',
+			hoverSymbolFill: '#768F3E',
+			_id: 'exportButton',
+			_titleKey: 'exportButtonTitle',
+			menuItems: [{
+				textKey: 'downloadPNG',
+				onclick: function () {
+					this.exportChart();
+				}
+			}, {
+				textKey: 'downloadJPEG',
+				onclick: function () {
+					this.exportChart({
+						type: 'image/jpeg'
+					});
+				}
+			}, {
+				textKey: 'downloadPDF',
+				onclick: function () {
+					this.exportChart({
+						type: 'application/pdf'
+					});
+				}
+			}, {
+				textKey: 'downloadSVG',
+				onclick: function () {
+					this.exportChart({
+						type: 'image/svg+xml'
+					});
+				}
+			}
+			// Enable this block to add "View SVG" to the dropdown menu
+			/*
+			,{
+
+				text: 'View SVG',
+				onclick: function () {
+					var svg = this.getSVG()
+						.replace(/</g, '\n&lt;')
+						.replace(/>/g, '&gt;');
+
+					doc.body.innerHTML = '<pre>' + svg + '</pre>';
+				}
+			} // */
+			]
+
+		},
+		printButton: {
+			//enabled: true,
+			symbol: 'printIcon',
+			x: -36,
+			symbolFill: '#B5C9DF',
+			hoverSymbolFill: '#779ABF',
+			_id: 'printButton',
+			_titleKey: 'printButtonTitle',
+			onclick: function () {
+				this.print();
+			}
+		}
+	}
+};
+
+
+
+extend(Chart.prototype, {
+	/**
+	 * Return an SVG representation of the chart
+	 *
+	 * @param additionalOptions {Object} Additional chart options for the generated SVG representation
+	 */
+	getSVG: function (additionalOptions) {
+		var chart = this,
+			chartCopy,
+			sandbox,
+			svg,
+			seriesOptions,
+			options = merge(chart.options, additionalOptions); // copy the options and add extra options
+
+		// IE compatibility hack for generating SVG content that it doesn't really understand
+		if (!doc.createElementNS) {
+			/*jslint unparam: true*//* allow unused parameter ns in function below */
+			doc.createElementNS = function (ns, tagName) {
+				return doc.createElement(tagName);
+			};
+			/*jslint unparam: false*/
+		}
+
+		// create a sandbox where a new chart will be generated
+		sandbox = createElement(DIV, null, {
+			position: ABSOLUTE,
+			top: '-9999em',
+			width: chart.chartWidth + PX,
+			height: chart.chartHeight + PX
+		}, doc.body);
+
+		// override some options
+		extend(options.chart, {
+			renderTo: sandbox,
+			forExport: true
+		});
+		options.exporting.enabled = false; // hide buttons in print
+		options.chart.plotBackgroundImage = null; // the converter doesn't handle images
+
+		// prepare for replicating the chart
+		options.series = [];
+		each(chart.series, function (serie) {
+			seriesOptions = merge(serie.options, {
+				animation: false, // turn off animation
+				showCheckbox: false,
+				visible: serie.visible
+			});
+
+			if (!seriesOptions.isInternal) { // used for the navigator series that has its own option set
+
+				// remove image markers
+				if (seriesOptions && seriesOptions.marker && /^url\(/.test(seriesOptions.marker.symbol)) {
+					seriesOptions.marker.symbol = 'circle';
+				}
+
+				options.series.push(seriesOptions);
+			}
+		});
+
+		// generate the chart copy
+		chartCopy = new Highcharts.Chart(options);
+
+		// reflect axis extremes in the export
+		each(['xAxis', 'yAxis'], function (axisType) {
+			each(chart[axisType], function (axis, i) {
+				var axisCopy = chartCopy[axisType][i],
+					extremes = axis.getExtremes(),
+					userMin = extremes.userMin,
+					userMax = extremes.userMax;
+
+				if (userMin !== UNDEFINED || userMax !== UNDEFINED) {
+					axisCopy.setExtremes(userMin, userMax, true, false);
+				}
+			});
+		});
+
+		// get the SVG from the container's innerHTML
+		svg = chartCopy.container.innerHTML;
+
+		// free up memory
+		options = null;
+		chartCopy.destroy();
+		discardElement(sandbox);
+
+		// sanitize
+		svg = svg
+			.replace(/zIndex="[^"]+"/g, '')
+			.replace(/isShadow="[^"]+"/g, '')
+			.replace(/symbolName="[^"]+"/g, '')
+			.replace(/jQuery[0-9]+="[^"]+"/g, '')
+			.replace(/isTracker="[^"]+"/g, '')
+			.replace(/url\([^#]+#/g, 'url(#')
+			.replace(/<svg /, '<svg xmlns:xlink="http://www.w3.org/1999/xlink" ')
+			.replace(/ href=/g, ' xlink:href=')
+			.replace(/\n/, ' ')
+			.replace(/<\/svg>.*?$/, '</svg>') // any HTML added to the container after the SVG (#894)
+			/* This fails in IE < 8
+			.replace(/([0-9]+)\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight
+				return s2 +'.'+ s3[0];
+			})*/
+
+			// Replace HTML entities, issue #347
+			.replace(/&nbsp;/g, '\u00A0') // no-break space
+			.replace(/&shy;/g,  '\u00AD') // soft hyphen
+
+			// IE specific
+			.replace(/<IMG /g, '<image ')
+			.replace(/height=([^" ]+)/g, 'height="$1"')
+			.replace(/width=([^" ]+)/g, 'width="$1"')
+			.replace(/hc-svg-href="([^"]+)">/g, 'xlink:href="$1"/>')
+			.replace(/id=([^" >]+)/g, 'id="$1"')
+			.replace(/class=([^" ]+)/g, 'class="$1"')
+			.replace(/ transform /g, ' ')
+			.replace(/:(path|rect)/g, '$1')
+			.replace(/style="([^"]+)"/g, function (s) {
+				return s.toLowerCase();
+			});
+
+		// IE9 beta bugs with innerHTML. Test again with final IE9.
+		svg = svg.replace(/(url\(#highcharts-[0-9]+)&quot;/g, '$1')
+			.replace(/&quot;/g, "'");
+		if (svg.match(/ xmlns="/g).length === 2) {
+			svg = svg.replace(/xmlns="[^"]+"/, '');
+		}
+		return svg;
+	},
+
+	/**
+	 * Submit the SVG representation of the chart to the server
+	 * @param {Object} options Exporting options. Possible members are url, type and width.
+	 * @param {Object} chartOptions Additional chart options for the SVG representation of the chart
+	 */
+	exportChart: function (options, chartOptions) {
+		var form,
+			chart = this,
+			svg = chart.getSVG(merge(chart.options.exporting.chartOptions, chartOptions)); // docs
+
+		// merge the options
+		options = merge(chart.options.exporting, options);
+
+		// create the form
+		form = createElement('form', {
+			method: 'post',
+			action: options.url
+			//enctype: 'multipart/form-data'
+		}, {
+			display: NONE
+		}, doc.body);
+
+		// add the values
+		each(['filename', 'type', 'width', 'svg'], function (name) {
+			createElement('input', {
+				type: HIDDEN,
+				name: name,
+				value: {
+					filename: options.filename || 'chart',
+					type: options.type,
+					width: options.width,
+					svg: svg
+				}[name]
+			}, null, form);
+		});
+
+		// submit
+		form.submit();
+
+		// clean up
+		discardElement(form);
+	},getExportChart: function (options, chartOptions) {
+		var form,
+			chart = this,
+			svg = chart.getSVG(merge(chart.options.exporting.chartOptions, chartOptions)); // docs
+
+		// merge the options
+		options = merge(chart.options.exporting, options);
+
+		// create the form
+		form = createElement('form', {
+			method: 'post',
+			action: getPageDomain()+'/report/getExportChart.action'
+			//enctype: 'multipart/form-data'
+		}, {
+			display: NONE
+		}, doc.body);
+		// add the values
+		each(['filename', 'type', 'width', 'svg'], function (name) {
+			var ele = createElement('input', {
+				type: HIDDEN,
+				name: name,
+				value: {
+					filename: options.filename || 'chart',
+					type: options.type,
+					width: options.width,
+					svg: svg
+				}[name]
+			}, null, form);
+		});
+
+		// submit
+		//form.submit();
+		$(form).ajaxFormSubmit({
+			success : function(result){
+				eval("var fn = "+options.callback);
+				fn(result);
+			}
+		});
+		// clean up
+		discardElement(form);
+	},
+
+	/**
+	 * Print the chart
+	 */
+	print: function () {
+
+		var chart = this,
+			container = chart.container,
+			origDisplay = [],
+			origParent = container.parentNode,
+			body = doc.body,
+			childNodes = body.childNodes;
+
+		if (chart.isPrinting) { // block the button while in printing mode
+			return;
+		}
+
+		chart.isPrinting = true;
+
+		// hide all body content
+		each(childNodes, function (node, i) {
+			if (node.nodeType === 1) {
+				origDisplay[i] = node.style.display;
+				node.style.display = NONE;
+			}
+		});
+
+		// pull out the chart
+		body.appendChild(container);
+
+		// print
+		win.print();
+
+		// allow the browser to prepare before reverting
+		setTimeout(function () {
+
+			// put the chart back in
+			origParent.appendChild(container);
+
+			// restore all body content
+			each(childNodes, function (node, i) {
+				if (node.nodeType === 1) {
+					node.style.display = origDisplay[i];
+				}
+			});
+
+			chart.isPrinting = false;
+
+		}, 1000);
+
+	},
+
+	/**
+	 * Display a popup menu for choosing the export type
+	 *
+	 * @param {String} name An identifier for the menu
+	 * @param {Array} items A collection with text and onclicks for the items
+	 * @param {Number} x The x position of the opener button
+	 * @param {Number} y The y position of the opener button
+	 * @param {Number} width The width of the opener button
+	 * @param {Number} height The height of the opener button
+	 */
+	contextMenu: function (name, items, x, y, width, height) {
+		var chart = this,
+			navOptions = chart.options.navigation,
+			menuItemStyle = navOptions.menuItemStyle,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			cacheName = 'cache-' + name,
+			menu = chart[cacheName],
+			menuPadding = mathMax(width, height), // for mouse leave detection
+			boxShadow = '3px 3px 10px #888',
+			innerMenu,
+			hide,
+			menuStyle;
+
+		// create the menu only the first time
+		if (!menu) {
+
+			// create a HTML element above the SVG
+			chart[cacheName] = menu = createElement(DIV, {
+				className: PREFIX + name
+			}, {
+				position: ABSOLUTE,
+				zIndex: 1000,
+				padding: menuPadding + PX
+			}, chart.container);
+
+			innerMenu = createElement(DIV, null,
+				extend({
+					MozBoxShadow: boxShadow,
+					WebkitBoxShadow: boxShadow,
+					boxShadow: boxShadow
+				}, navOptions.menuStyle), menu);
+
+			// hide on mouse out
+			hide = function () {
+				css(menu, { display: NONE });
+			};
+
+			addEvent(menu, 'mouseleave', hide);
+
+
+			// create the items
+			each(items, function (item) {
+				if (item) {
+					var div = createElement(DIV, {
+						onmouseover: function () {
+							css(this, navOptions.menuItemHoverStyle);
+						},
+						onmouseout: function () {
+							css(this, menuItemStyle);
+						},
+						innerHTML: item.text || chart.options.lang[item.textKey]
+					}, extend({
+						cursor: 'pointer'
+					}, menuItemStyle), innerMenu);
+
+					div[hasTouch ? 'ontouchstart' : 'onclick'] = function () {
+						hide();
+						item.onclick.apply(chart, arguments);
+					};
+
+					// Keep references to menu divs to be able to destroy them
+					chart.exportDivElements.push(div);
+				}
+			});
+
+			// Keep references to menu and innerMenu div to be able to destroy them
+			chart.exportDivElements.push(innerMenu, menu);
+
+			chart.exportMenuWidth = menu.offsetWidth;
+			chart.exportMenuHeight = menu.offsetHeight;
+		}
+
+		menuStyle = { display: 'block' };
+
+		// if outside right, right align it
+		if (x + chart.exportMenuWidth > chartWidth) {
+			menuStyle.right = (chartWidth - x - width - menuPadding) + PX;
+		} else {
+			menuStyle.left = (x - menuPadding) + PX;
+		}
+		// if outside bottom, bottom align it
+		if (y + height + chart.exportMenuHeight > chartHeight) {
+			menuStyle.bottom = (chartHeight - y - menuPadding)  + PX;
+		} else {
+			menuStyle.top = (y + height - menuPadding) + PX;
+		}
+
+		css(menu, menuStyle);
+	},
+
+	/**
+	 * Add the export button to the chart
+	 */
+	addButton: function (options) {
+		var chart = this,
+			renderer = chart.renderer,
+			btnOptions = merge(chart.options.navigation.buttonOptions, options),
+			onclick = btnOptions.onclick,
+			menuItems = btnOptions.menuItems,
+			buttonWidth = btnOptions.width,
+			buttonHeight = btnOptions.height,
+			box,
+			symbol,
+			button,
+			borderWidth = btnOptions.borderWidth,
+			boxAttr = {
+				stroke: btnOptions.borderColor
+
+			},
+			symbolAttr = {
+				stroke: btnOptions.symbolStroke,
+				fill: btnOptions.symbolFill
+			},
+			symbolSize = btnOptions.symbolSize || 12;
+
+		// Keeps references to the button elements
+		if (!chart.exportDivElements) {
+			chart.exportDivElements = [];
+			chart.exportSVGElements = [];
+		}
+
+		if (btnOptions.enabled === false) {
+			return;
+		}
+
+		// element to capture the click
+		function revert() {
+			symbol.attr(symbolAttr);
+			box.attr(boxAttr);
+		}
+
+		// the box border
+		box = renderer.rect(
+			0,
+			0,
+			buttonWidth,
+			buttonHeight,
+			btnOptions.borderRadius,
+			borderWidth
+		)
+		//.translate(buttonLeft, buttonTop) // to allow gradients
+		.align(btnOptions, true)
+		.attr(extend({
+			fill: btnOptions.backgroundColor,
+			'stroke-width': borderWidth,
+			zIndex: 19
+		}, boxAttr)).add();
+
+		// the invisible element to track the clicks
+		button = renderer.rect(
+				0,
+				0,
+				buttonWidth,
+				buttonHeight,
+				0
+			)
+			.align(btnOptions)
+			.attr({
+				id: btnOptions._id,
+				fill: 'rgba(255, 255, 255, 0.001)',
+				title: chart.options.lang[btnOptions._titleKey],
+				zIndex: 21
+			}).css({
+				cursor: 'pointer'
+			})
+			.on('mouseover', function () {
+				symbol.attr({
+					stroke: btnOptions.hoverSymbolStroke,
+					fill: btnOptions.hoverSymbolFill
+				});
+				box.attr({
+					stroke: btnOptions.hoverBorderColor
+				});
+			})
+			.on('mouseout', revert)
+			.on('click', revert)
+			.add();
+
+		// add the click event
+		if (menuItems) {
+			onclick = function () {
+				revert();
+				var bBox = button.getBBox();
+				chart.contextMenu('export-menu', menuItems, bBox.x, bBox.y, buttonWidth, buttonHeight);
+			};
+		}
+		/*addEvent(button.element, 'click', function() {
+			onclick.apply(chart, arguments);
+		});*/
+		button.on('click', function () {
+			onclick.apply(chart, arguments);
+		});
+
+		// the icon
+		symbol = renderer.symbol(
+				btnOptions.symbol,
+				btnOptions.symbolX - (symbolSize / 2),
+				btnOptions.symbolY - (symbolSize / 2),
+				symbolSize,				
+				symbolSize
+			)
+			.align(btnOptions, true)
+			.attr(extend(symbolAttr, {
+				'stroke-width': btnOptions.symbolStrokeWidth || 1,
+				zIndex: 20
+			})).add();
+
+		// Keep references to the renderer element so to be able to destroy them later.
+		chart.exportSVGElements.push(box, button, symbol);
+	},
+
+	/**
+	 * Destroy the buttons.
+	 */
+	destroyExport: function () {
+		var i,
+			chart = this,
+			elem;
+
+		// Destroy the extra buttons added
+		for (i = 0; i < chart.exportSVGElements.length; i++) {
+			elem = chart.exportSVGElements[i];
+			// Destroy and null the svg/vml elements
+			elem.onclick = elem.ontouchstart = null;
+			chart.exportSVGElements[i] = elem.destroy();
+		}
+
+		// Destroy the divs for the menu
+		for (i = 0; i < chart.exportDivElements.length; i++) {
+			elem = chart.exportDivElements[i];
+
+			// Remove the event handler
+			removeEvent(elem, 'mouseleave');
+
+			// Remove inline events
+			chart.exportDivElements[i] = elem.onmouseout = elem.onmouseover = elem.ontouchstart = elem.onclick = null;
+
+			// Destroy the div by moving to garbage bin
+			discardElement(elem);
+		}
+	}
+});
+
+/**
+ * Crisp for 1px stroke width, which is default. In the future, consider a smarter,
+ * global function.
+ */
+function crisp(arr) {
+	var i = arr.length;
+	while (i--) {
+		if (typeof arr[i] === 'number') {
+			arr[i] = Math.round(arr[i]) - 0.5;		
+		}
+	}
+	return arr;
+}
+
+// Create the export icon
+HC.Renderer.prototype.symbols.exportIcon = function (x, y, width, height) {
+	return crisp([
+		M, // the disk
+		x, y + width,
+		L,
+		x + width, y + height,
+		x + width, y + height * 0.8,
+		x, y + height * 0.8,
+		'Z',
+		M, // the arrow
+		x + width * 0.5, y + height * 0.8,
+		L,
+		x + width * 0.8, y + height * 0.4,
+		x + width * 0.4, y + height * 0.4,
+		x + width * 0.4, y,
+		x + width * 0.6, y,
+		x + width * 0.6, y + height * 0.4,
+		x + width * 0.2, y + height * 0.4,
+		'Z'
+	]);
+};
+// Create the print icon
+HC.Renderer.prototype.symbols.printIcon = function (x, y, width, height) {
+	return crisp([
+		M, // the printer
+		x, y + height * 0.7,
+		L,
+		x + width, y + height * 0.7,
+		x + width, y + height * 0.4,
+		x, y + height * 0.4,
+		'Z',
+		M, // the upper sheet
+		x + width * 0.2, y + height * 0.4,
+		L,
+		x + width * 0.2, y,
+		x + width * 0.8, y,
+		x + width * 0.8, y + height * 0.4,
+		'Z',
+		M, // the lower sheet
+		x + width * 0.2, y + height * 0.7,
+		L,
+		x, y + height,
+		x + width, y + height,
+		x + width * 0.8, y + height * 0.7,
+		'Z'
+	]);
+};
+
+
+// Add the buttons on chart load
+Chart.prototype.callbacks.push(function (chart) {
+	var n,
+		exportingOptions = chart.options.exporting,
+		buttons = exportingOptions.buttons;
+
+	if (exportingOptions.enabled !== false) {
+
+		for (n in buttons) {
+			chart.addButton(buttons[n]);
+		}
+
+		// Destroy the export elements at chart destroy
+		addEvent(chart, 'destroy', chart.destroyExport);
+	}
+
+});
+
+
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/funnel.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/funnel.js
new file mode 100644
index 0000000..8a8a192
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/funnel.js
@@ -0,0 +1,13 @@
+/*
+ 
+ Highcharts funnel module
+
+ (c) 2010-2014 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(b){var d=b.getOptions(),v=d.plotOptions,q=b.seriesTypes,E=b.merge,D=function(){},A=b.each;v.funnel=E(v.pie,{animation:!1,center:["50%","50%"],width:"90%",neckWidth:"30%",height:"100%",neckHeight:"25%",reversed:!1,dataLabels:{connectorWidth:1,connectorColor:"#606060"},size:!0,states:{select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}}});q.funnel=b.extendClass(q.pie,{type:"funnel",animate:D,singularTooltips:!0,translate:function(){var a=function(j,a){return/%$/.test(j)?a*parseInt(j,
+10)/100:parseInt(j,10)},B=0,f=this.chart,c=this.options,g=c.reversed,b=f.plotWidth,n=f.plotHeight,o=0,f=c.center,h=a(f[0],b),d=a(f[0],n),q=a(c.width,b),k,r,e=a(c.height,n),s=a(c.neckWidth,b),t=a(c.neckHeight,n),w=e-t,a=this.data,x,y,v=c.dataLabels.position==="left"?1:0,z,l,C,p,i,u,m;this.getWidthAt=r=function(j){return j>e-t||e===t?s:s+(q-s)*((e-t-j)/(e-t))};this.getX=function(j,a){return h+(a?-1:1)*(r(g?n-j:j)/2+c.dataLabels.distance)};this.center=[h,d,e];this.centerX=h;A(a,function(a){B+=a.y});
+A(a,function(a){m=null;y=B?a.y/B:0;l=d-e/2+o*e;i=l+y*e;k=r(l);z=h-k/2;C=z+k;k=r(i);p=h-k/2;u=p+k;l>w?(z=p=h-s/2,C=u=h+s/2):i>w&&(m=i,k=r(w),p=h-k/2,u=p+k,i=w);g&&(l=e-l,i=e-i,m=m?e-m:null);x=["M",z,l,"L",C,l,u,i];m&&x.push(u,m,p,m);x.push(p,i,"Z");a.shapeType="path";a.shapeArgs={d:x};a.percentage=y*100;a.plotX=h;a.plotY=(l+(m||i))/2;a.tooltipPos=[h,a.plotY];a.slice=D;a.half=v;o+=y})},drawPoints:function(){var a=this,b=a.options,f=a.chart.renderer;A(a.data,function(c){var g=c.graphic,d=c.shapeArgs;
+g?g.animate(d):c.graphic=f.path(d).attr({fill:c.color,stroke:b.borderColor,"stroke-width":b.borderWidth}).add(a.group)})},sortByAngle:function(a){a.sort(function(a,b){return a.plotY-b.plotY})},drawDataLabels:function(){var a=this.data,b=this.options.dataLabels.distance,f,c,g,d=a.length,n,o;for(this.center[2]-=2*b;d--;)g=a[d],c=(f=g.half)?1:-1,o=g.plotY,n=this.getX(o,f),g.labelPos=[0,o,n+(b-5)*c,o,n+b*c,o,f?"right":"left",0];q.pie.prototype.drawDataLabels.call(this)}});d.plotOptions.pyramid=b.merge(d.plotOptions.funnel,
+{neckWidth:"0%",neckHeight:"0%",reversed:!0});b.seriesTypes.pyramid=b.extendClass(b.seriesTypes.funnel,{type:"pyramid"})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/funnel.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/funnel.src.js
new file mode 100644
index 0000000..eb6ba9b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/funnel.src.js
@@ -0,0 +1,310 @@
+/**
+ * @license 
+ * Highcharts funnel module
+ *
+ * (c) 2010-2014 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+/*global Highcharts */
+(function (Highcharts) {
+	
+'use strict';
+
+// create shortcuts
+var defaultOptions = Highcharts.getOptions(),
+	defaultPlotOptions = defaultOptions.plotOptions,
+	seriesTypes = Highcharts.seriesTypes,
+	merge = Highcharts.merge,
+	noop = function () {},
+	each = Highcharts.each;
+
+// set default options
+defaultPlotOptions.funnel = merge(defaultPlotOptions.pie, {
+	animation: false,
+	center: ['50%', '50%'],
+	width: '90%',
+	neckWidth: '30%',
+	height: '100%',
+	neckHeight: '25%',
+	reversed: false,
+	dataLabels: {
+		//position: 'right',
+		connectorWidth: 1,
+		connectorColor: '#606060'
+	},
+	size: true, // to avoid adapting to data label size in Pie.drawDataLabels
+	states: {
+		select: {
+			color: '#C0C0C0',
+			borderColor: '#000000',
+			shadow: false
+		}
+	}	
+});
+
+
+seriesTypes.funnel = Highcharts.extendClass(seriesTypes.pie, {
+	
+	type: 'funnel',
+	animate: noop,
+	singularTooltips: true,
+
+	/**
+	 * Overrides the pie translate method
+	 */
+	translate: function () {
+		
+		var 
+			// Get positions - either an integer or a percentage string must be given
+			getLength = function (length, relativeTo) {
+				return (/%$/).test(length) ?
+					relativeTo * parseInt(length, 10) / 100 :
+					parseInt(length, 10);
+			},
+			
+			sum = 0,
+			series = this,
+			chart = series.chart,
+			options = series.options,
+			reversed = options.reversed,
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			cumulative = 0, // start at top
+			center = options.center,
+			centerX = getLength(center[0], plotWidth),
+			centerY = getLength(center[0], plotHeight),
+			width = getLength(options.width, plotWidth),
+			tempWidth,
+			getWidthAt,
+			height = getLength(options.height, plotHeight),
+			neckWidth = getLength(options.neckWidth, plotWidth),
+			neckHeight = getLength(options.neckHeight, plotHeight),
+			neckY = height - neckHeight,
+			data = series.data,
+			path,
+			fraction,
+			half = options.dataLabels.position === 'left' ? 1 : 0,
+
+			x1, 
+			y1, 
+			x2, 
+			x3, 
+			y3, 
+			x4, 
+			y5;
+
+		// Return the width at a specific y coordinate
+		series.getWidthAt = getWidthAt = function (y) {
+			return y > height - neckHeight || height === neckHeight ?
+				neckWidth :
+				neckWidth + (width - neckWidth) * ((height - neckHeight - y) / (height - neckHeight));
+		};
+		series.getX = function (y, half) {
+					return centerX + (half ? -1 : 1) * ((getWidthAt(reversed ? plotHeight - y : y) / 2) + options.dataLabels.distance);
+		};
+
+		// Expose
+		series.center = [centerX, centerY, height];
+		series.centerX = centerX;
+
+		/*
+		 * Individual point coordinate naming:
+		 *
+		 * x1,y1 _________________ x2,y1
+		 *  \                         /
+		 *   \                       /
+		 *    \                     /
+		 *     \                   /
+		 *      \                 /
+		 *     x3,y3 _________ x4,y3
+		 *
+		 * Additional for the base of the neck:
+		 *
+		 *       |               |
+		 *       |               |
+		 *       |               |
+		 *     x3,y5 _________ x4,y5
+		 */
+
+
+
+
+		// get the total sum
+		each(data, function (point) {
+			sum += point.y;
+		});
+
+		each(data, function (point) {
+			// set start and end positions
+			y5 = null;
+			fraction = sum ? point.y / sum : 0;
+			y1 = centerY - height / 2 + cumulative * height;
+			y3 = y1 + fraction * height;
+			//tempWidth = neckWidth + (width - neckWidth) * ((height - neckHeight - y1) / (height - neckHeight));
+			tempWidth = getWidthAt(y1);
+			x1 = centerX - tempWidth / 2;
+			x2 = x1 + tempWidth;
+			tempWidth = getWidthAt(y3);
+			x3 = centerX - tempWidth / 2;
+			x4 = x3 + tempWidth;
+
+			// the entire point is within the neck
+			if (y1 > neckY) {
+				x1 = x3 = centerX - neckWidth / 2;
+				x2 = x4 = centerX + neckWidth / 2;
+			
+			// the base of the neck
+			} else if (y3 > neckY) {
+				y5 = y3;
+
+				tempWidth = getWidthAt(neckY);
+				x3 = centerX - tempWidth / 2;
+				x4 = x3 + tempWidth;
+
+				y3 = neckY;
+			}
+
+			if (reversed) {
+				y1 = height - y1;
+				y3 = height - y3;
+				y5 = (y5 ? height - y5 : null);
+			}
+			// save the path
+			path = [
+				'M',
+				x1, y1,
+				'L',
+				x2, y1,
+				x4, y3
+			];
+			if (y5) {
+				path.push(x4, y5, x3, y5);
+			}
+			path.push(x3, y3, 'Z');
+
+			// prepare for using shared dr
+			point.shapeType = 'path';
+			point.shapeArgs = { d: path };
+
+
+			// for tooltips and data labels
+			point.percentage = fraction * 100;
+			point.plotX = centerX;
+			point.plotY = (y1 + (y5 || y3)) / 2;
+
+			// Placement of tooltips and data labels
+			point.tooltipPos = [
+				centerX,
+				point.plotY
+			];
+
+			// Slice is a noop on funnel points
+			point.slice = noop;
+			
+			// Mimicking pie data label placement logic
+			point.half = half;
+
+			cumulative += fraction;
+		});		
+	},
+	/**
+	 * Draw a single point (wedge)
+	 * @param {Object} point The point object
+	 * @param {Object} color The color of the point
+	 * @param {Number} brightness The brightness relative to the color
+	 */
+	drawPoints: function () {
+		var series = this,
+			options = series.options,
+			chart = series.chart,
+			renderer = chart.renderer;
+
+		each(series.data, function (point) {
+			
+			var graphic = point.graphic,
+				shapeArgs = point.shapeArgs;
+
+			if (!graphic) { // Create the shapes
+				point.graphic = renderer.path(shapeArgs).
+					attr({
+						fill: point.color,
+						stroke: options.borderColor,
+						'stroke-width': options.borderWidth
+					}).
+					add(series.group);
+					
+			} else { // Update the shapes
+				graphic.animate(shapeArgs);
+			}
+		});
+	},
+
+	/**
+	 * Funnel items don't have angles (#2289)
+	 */
+	sortByAngle: function (points) {
+		points.sort(function (a, b) {
+			return a.plotY - b.plotY;
+		});
+	},
+	
+	/**
+	 * Extend the pie data label method
+	 */
+	drawDataLabels: function () {
+		var data = this.data,
+			labelDistance = this.options.dataLabels.distance,
+			leftSide,
+			sign,
+			point,
+			i = data.length,
+			x,
+			y;
+		
+		// In the original pie label anticollision logic, the slots are distributed
+		// from one labelDistance above to one labelDistance below the pie. In funnels
+		// we don't want this.
+		this.center[2] -= 2 * labelDistance;
+		
+		// Set the label position array for each point.
+		while (i--) {
+			point = data[i];
+			leftSide = point.half;
+			sign = leftSide ? 1 : -1;
+			y = point.plotY;
+			x = this.getX(y, leftSide);
+				
+			// set the anchor point for data labels
+			point.labelPos = [
+				0, // first break of connector
+				y, // a/a
+				x + (labelDistance - 5) * sign, // second break, right outside point shape
+				y, // a/a
+				x + labelDistance * sign, // landing point for connector
+				y, // a/a
+				leftSide ? 'right' : 'left', // alignment
+				0 // center angle
+			];
+		}
+		
+		seriesTypes.pie.prototype.drawDataLabels.call(this);
+	}
+
+});
+
+/** 
+ * Pyramid series type.
+ * A pyramid series is a special type of funnel, without neck and reversed by default.
+ */
+defaultOptions.plotOptions.pyramid = Highcharts.merge(defaultOptions.plotOptions.funnel, {        
+	neckWidth: '0%',
+	neckHeight: '0%',
+	reversed: true
+});
+Highcharts.seriesTypes.pyramid = Highcharts.extendClass(Highcharts.seriesTypes.funnel, {
+	type: 'pyramid'
+});
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/heatmap.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/heatmap.js
new file mode 100644
index 0000000..6d9705c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/heatmap.js
@@ -0,0 +1,23 @@
+/*
+ Highcharts JS v4.0.3 (2014-07-03)
+
+ (c) 2011-2014 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(h){var j=h.Axis,y=h.Chart,p=h.Color,z=h.Legend,t=h.LegendSymbolMixin,u=h.Series,v=h.SVGRenderer,w=h.getOptions(),k=h.each,q=h.extend,A=h.extendClass,l=h.merge,m=h.pick,x=h.numberFormat,o=h.seriesTypes,r=h.wrap,n=function(){},s=h.ColorAxis=function(){this.isColorAxis=!0;this.init.apply(this,arguments)};q(s.prototype,j.prototype);q(s.prototype,{defaultColorAxisOptions:{lineWidth:0,gridLineWidth:1,tickPixelInterval:72,startOnTick:!0,endOnTick:!0,offset:0,marker:{animation:{duration:50},color:"gray",
+width:0.01},labels:{overflow:"justify"},minColor:"#EFEFFF",maxColor:"#003875",tickLength:5},init:function(b,a){var c=b.options.legend.layout!=="vertical",d;d=l(this.defaultColorAxisOptions,{side:c?2:1,reversed:!c},a,{isX:c,opposite:!c,showEmpty:!1,title:null,isColor:!0});j.prototype.init.call(this,b,d);a.dataClasses&&this.initDataClasses(a);this.initStops(a);this.isXAxis=!0;this.horiz=c;this.zoomEnabled=!1},tweenColors:function(b,a,c){var d=a.rgba[3]!==1||b.rgba[3]!==1;return(d?"rgba(":"rgb(")+Math.round(a.rgba[0]+
+(b.rgba[0]-a.rgba[0])*(1-c))+","+Math.round(a.rgba[1]+(b.rgba[1]-a.rgba[1])*(1-c))+","+Math.round(a.rgba[2]+(b.rgba[2]-a.rgba[2])*(1-c))+(d?","+(a.rgba[3]+(b.rgba[3]-a.rgba[3])*(1-c)):"")+")"},initDataClasses:function(b){var a=this,c=this.chart,d,e=0,f=this.options;this.dataClasses=d=[];this.legendItems=[];k(b.dataClasses,function(g,i){var h,g=l(g);d.push(g);if(!g.color)f.dataClassColor==="category"?(h=c.options.colors,g.color=h[e++],e===h.length&&(e=0)):g.color=a.tweenColors(p(f.minColor),p(f.maxColor),
+i/(b.dataClasses.length-1))})},initStops:function(b){this.stops=b.stops||[[0,this.options.minColor],[1,this.options.maxColor]];k(this.stops,function(a){a.color=p(a[1])})},setOptions:function(b){j.prototype.setOptions.call(this,b);this.options.crosshair=this.options.marker;this.coll="colorAxis"},setAxisSize:function(){var b=this.legendSymbol,a=this.chart,c,d,e;if(b)this.left=c=b.attr("x"),this.top=d=b.attr("y"),this.width=e=b.attr("width"),this.height=b=b.attr("height"),this.right=a.chartWidth-c-e,
+this.bottom=a.chartHeight-d-b,this.len=this.horiz?e:b,this.pos=this.horiz?c:d},toColor:function(b,a){var c,d=this.stops,e,f=this.dataClasses,g,i;if(f)for(i=f.length;i--;){if(g=f[i],e=g.from,d=g.to,(e===void 0||b>=e)&&(d===void 0||b<=d)){c=g.color;if(a)a.dataClass=i;break}}else{this.isLog&&(b=this.val2lin(b));c=1-(this.max-b)/(this.max-this.min||1);for(i=d.length;i--;)if(c>d[i][0])break;e=d[i]||d[i+1];d=d[i+1]||e;c=1-(d[0]-c)/(d[0]-e[0]||1);c=this.tweenColors(e.color,d.color,c)}return c},getOffset:function(){var b=
+this.legendGroup,a=this.chart.axisOffset[this.side];if(b){j.prototype.getOffset.call(this);if(!this.axisGroup.parentGroup)this.axisGroup.add(b),this.gridGroup.add(b),this.labelGroup.add(b),this.added=!0;this.chart.axisOffset[this.side]=a}},setLegendColor:function(){var b,a=this.options;b=this.horiz?[0,0,1,0]:[0,0,0,1];this.legendColor={linearGradient:{x1:b[0],y1:b[1],x2:b[2],y2:b[3]},stops:a.stops||[[0,a.minColor],[1,a.maxColor]]}},drawLegendSymbol:function(b,a){var c=b.padding,d=b.options,e=this.horiz,
+f=m(d.symbolWidth,e?200:12),g=m(d.symbolHeight,e?12:200),i=m(d.labelPadding,e?16:30),d=m(d.itemDistance,10);this.setLegendColor();a.legendSymbol=this.chart.renderer.rect(0,b.baseline-11,f,g).attr({zIndex:1}).add(a.legendGroup);a.legendSymbol.getBBox();this.legendItemWidth=f+c+(e?d:i);this.legendItemHeight=g+c+(e?i:0)},setState:n,visible:!0,setVisible:n,getSeriesExtremes:function(){var b;if(this.series.length)b=this.series[0],this.dataMin=b.valueMin,this.dataMax=b.valueMax},drawCrosshair:function(b,
+a){var c=!this.cross,d=a&&a.plotX,e=a&&a.plotY,f,g=this.pos,i=this.len;if(a)f=this.toPixels(a.value),f<g?f=g-2:f>g+i&&(f=g+i+2),a.plotX=f,a.plotY=this.len-f,j.prototype.drawCrosshair.call(this,b,a),a.plotX=d,a.plotY=e,!c&&this.cross&&this.cross.attr({fill:this.crosshair.color}).add(this.labelGroup)},getPlotLinePath:function(b,a,c,d,e){return e?this.horiz?["M",e-4,this.top-6,"L",e+4,this.top-6,e,this.top,"Z"]:["M",this.left,e,"L",this.left-6,e+6,this.left-6,e-6,"Z"]:j.prototype.getPlotLinePath.call(this,
+b,a,c,d)},update:function(b,a){k(this.series,function(a){a.isDirtyData=!0});j.prototype.update.call(this,b,a);this.legendItem&&(this.setLegendColor(),this.chart.legend.colorizeItem(this,!0))},getDataClassLegendSymbols:function(){var b=this,a=this.chart,c=this.legendItems,d=a.options.legend,e=d.valueDecimals,f=d.valueSuffix||"",g;c.length||k(this.dataClasses,function(d,h){var j=!0,l=d.from,m=d.to;g="";l===void 0?g="< ":m===void 0&&(g="> ");l!==void 0&&(g+=x(l,e)+f);l!==void 0&&m!==void 0&&(g+=" - ");
+m!==void 0&&(g+=x(m,e)+f);c.push(q({chart:a,name:g,options:{},drawLegendSymbol:t.drawRectangle,visible:!0,setState:n,setVisible:function(){j=this.visible=!j;k(b.series,function(a){k(a.points,function(a){a.dataClass===h&&a.setVisible(j)})});a.legend.colorizeItem(this,j)}},d))});return c},name:""});r(y.prototype,"getAxes",function(b){var a=this.options.colorAxis;b.call(this);this.colorAxis=[];a&&new s(this,a)});r(z.prototype,"getAllItems",function(b){var a=[],c=this.chart.colorAxis[0];c&&(c.options.dataClasses?
+a=a.concat(c.getDataClassLegendSymbols()):a.push(c),k(c.series,function(a){a.options.showInLegend=!1}));return a.concat(b.call(this))});h={pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color",dashstyle:"dashStyle"},pointArrayMap:["value"],axisTypes:["xAxis","yAxis","colorAxis"],optionalAxis:"colorAxis",trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:n,parallelArrays:["x","y","value"],colorKey:"value",translateColors:function(){var b=this,a=this.options.nullColor,
+c=this.colorAxis,d=this.colorKey;k(this.data,function(e){var f=e[d];if(f=f===null?a:c&&f!==void 0?c.toColor(f,e):e.color||b.color)e.color=f})}};r(v.prototype,"buildText",function(b,a){var c=a.styles&&a.styles.HcTextStroke;b.call(this,a);c&&a.applyTextStroke&&a.applyTextStroke(c)});v.prototype.Element.prototype.applyTextStroke=function(b){var a=this.element,c,d,b=b.split(" ");c=a.getElementsByTagName("tspan");d=a.firstChild;this.ySetter=this.xSetter;k([].slice.call(c),function(c,f){var g;f===0&&(c.setAttribute("x",
+a.getAttribute("x")),(f=a.getAttribute("y"))!==null&&c.setAttribute("y",f));g=c.cloneNode(1);g.setAttribute("stroke",b[1]);g.setAttribute("stroke-width",b[0]);g.setAttribute("stroke-linejoin","round");a.insertBefore(g,d)})};w.plotOptions.heatmap=l(w.plotOptions.scatter,{animation:!1,borderWidth:0,nullColor:"#F8F8F8",dataLabels:{formatter:function(){return this.point.value},verticalAlign:"middle",crop:!1,overflow:!1,style:{color:"white",fontWeight:"bold",HcTextStroke:"1px rgba(0,0,0,0.5)"}},marker:null,
+tooltip:{pointFormat:"{point.x}, {point.y}: {point.value}<br/>"},states:{normal:{animation:!0},hover:{brightness:0.2}}});o.heatmap=A(o.scatter,l(h,{type:"heatmap",pointArrayMap:["y","value"],hasPointSpecificOptions:!0,supportsDrilldown:!0,getExtremesFromAll:!0,init:function(){o.scatter.prototype.init.apply(this,arguments);this.pointRange=this.options.colsize||1;this.yAxis.axisPointRange=this.options.rowsize||1},translate:function(){var b=this.options,a=this.xAxis,c=this.yAxis;this.generatePoints();
+k(this.points,function(d){var e=(b.colsize||1)/2,f=(b.rowsize||1)/2,g=Math.round(a.len-a.translate(d.x-e,0,1,0,1)),e=Math.round(a.len-a.translate(d.x+e,0,1,0,1)),h=Math.round(c.translate(d.y-f,0,1,0,1)),f=Math.round(c.translate(d.y+f,0,1,0,1));d.plotX=(g+e)/2;d.plotY=(h+f)/2;d.shapeType="rect";d.shapeArgs={x:Math.min(g,e),y:Math.min(h,f),width:Math.abs(e-g),height:Math.abs(f-h)}});this.translateColors();this.chart.hasRendered&&k(this.points,function(a){a.shapeArgs.fill=a.color})},drawPoints:o.column.prototype.drawPoints,
+animate:n,getBox:n,drawLegendSymbol:t.drawRectangle,getExtremes:function(){u.prototype.getExtremes.call(this,this.valueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;u.prototype.getExtremes.call(this)}}))})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/heatmap.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/heatmap.src.js
new file mode 100644
index 0000000..8273f5b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/heatmap.src.js
@@ -0,0 +1,675 @@
+/**
+ * @license Highcharts JS v4.0.3 (2014-07-03)
+ *
+ * (c) 2011-2014 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+/*global HighchartsAdapter*/
+(function (Highcharts) {
+
+
+var UNDEFINED,
+	Axis = Highcharts.Axis,
+	Chart = Highcharts.Chart,
+	Color = Highcharts.Color,
+	Legend = Highcharts.Legend,
+	LegendSymbolMixin = Highcharts.LegendSymbolMixin,
+	Series = Highcharts.Series,
+	SVGRenderer = Highcharts.SVGRenderer,
+	
+	defaultOptions = Highcharts.getOptions(),
+	each = Highcharts.each,
+	extend = Highcharts.extend,
+	extendClass = Highcharts.extendClass,
+	merge = Highcharts.merge,
+	pick = Highcharts.pick,
+	numberFormat = Highcharts.numberFormat,
+	seriesTypes = Highcharts.seriesTypes,
+	wrap = Highcharts.wrap,
+	noop = function () {};
+
+	
+
+
+/**
+ * The ColorAxis object for inclusion in gradient legends
+ */
+var ColorAxis = Highcharts.ColorAxis = function () {
+	this.isColorAxis = true;
+	this.init.apply(this, arguments);
+};
+extend(ColorAxis.prototype, Axis.prototype);
+extend(ColorAxis.prototype, {
+	defaultColorAxisOptions: {
+		lineWidth: 0,
+		gridLineWidth: 1,
+		tickPixelInterval: 72,
+		startOnTick: true,
+		endOnTick: true,
+		offset: 0,
+		marker: {
+			animation: {
+				duration: 50
+			},
+			color: 'gray',
+			width: 0.01
+		},
+		labels: {
+			overflow: 'justify'
+		},
+		minColor: '#EFEFFF',
+		maxColor: '#003875',
+		tickLength: 5
+	},
+	init: function (chart, userOptions) {
+		var horiz = chart.options.legend.layout !== 'vertical',
+			options;
+
+		// Build the options
+		options = merge(this.defaultColorAxisOptions, {
+			side: horiz ? 2 : 1,
+			reversed: !horiz
+		}, userOptions, {
+			isX: horiz,
+			opposite: !horiz,
+			showEmpty: false,
+			title: null,
+			isColor: true
+		});
+
+		Axis.prototype.init.call(this, chart, options);
+
+		// Base init() pushes it to the xAxis array, now pop it again
+		//chart[this.isXAxis ? 'xAxis' : 'yAxis'].pop();
+
+		// Prepare data classes
+		if (userOptions.dataClasses) {
+			this.initDataClasses(userOptions);
+		}
+		this.initStops(userOptions);
+
+		// Override original axis properties
+		this.isXAxis = true;
+		this.horiz = horiz;
+		this.zoomEnabled = false;
+	},
+
+	/*
+	 * Return an intermediate color between two colors, according to pos where 0
+	 * is the from color and 1 is the to color
+	 */
+	tweenColors: function (from, to, pos) {
+		// Check for has alpha, because rgba colors perform worse due to lack of
+		// support in WebKit.
+		var hasAlpha = (to.rgba[3] !== 1 || from.rgba[3] !== 1);
+		return (hasAlpha ? 'rgba(' : 'rgb(') + 
+			Math.round(to.rgba[0] + (from.rgba[0] - to.rgba[0]) * (1 - pos)) + ',' + 
+			Math.round(to.rgba[1] + (from.rgba[1] - to.rgba[1]) * (1 - pos)) + ',' + 
+			Math.round(to.rgba[2] + (from.rgba[2] - to.rgba[2]) * (1 - pos)) + 
+			(hasAlpha ? (',' + (to.rgba[3] + (from.rgba[3] - to.rgba[3]) * (1 - pos))) : '') + ')';
+		},
+
+	initDataClasses: function (userOptions) {
+		var axis = this,
+			chart = this.chart,
+			dataClasses,
+			colorCounter = 0,
+			options = this.options;
+		this.dataClasses = dataClasses = [];
+		this.legendItems = [];
+
+		each(userOptions.dataClasses, function (dataClass, i) {
+			var colors;
+
+			dataClass = merge(dataClass);
+			dataClasses.push(dataClass);
+			if (!dataClass.color) {
+				if (options.dataClassColor === 'category') {
+					colors = chart.options.colors;
+					dataClass.color = colors[colorCounter++];
+					// loop back to zero
+					if (colorCounter === colors.length) {
+						colorCounter = 0;
+					}
+				} else {
+					dataClass.color = axis.tweenColors(Color(options.minColor), Color(options.maxColor), i / (userOptions.dataClasses.length - 1));
+				}
+			}
+		});
+	},
+
+	initStops: function (userOptions) {
+		this.stops = userOptions.stops || [
+			[0, this.options.minColor],
+			[1, this.options.maxColor]
+		];
+		each(this.stops, function (stop) {
+			stop.color = Color(stop[1]);
+		});
+	},
+
+	/**
+	 * Extend the setOptions method to process extreme colors and color
+	 * stops.
+	 */
+	setOptions: function (userOptions) {
+		Axis.prototype.setOptions.call(this, userOptions);
+
+		this.options.crosshair = this.options.marker;
+		this.coll = 'colorAxis';
+	},
+
+	setAxisSize: function () {
+		var symbol = this.legendSymbol,
+			chart = this.chart,
+			x,
+			y,
+			width,
+			height;
+
+		if (symbol) {
+			this.left = x = symbol.attr('x');
+			this.top = y = symbol.attr('y');
+			this.width = width = symbol.attr('width');
+			this.height = height = symbol.attr('height');
+			this.right = chart.chartWidth - x - width;
+			this.bottom = chart.chartHeight - y - height;
+
+			this.len = this.horiz ? width : height;
+			this.pos = this.horiz ? x : y;
+		}
+	},
+
+	/** 
+	 * Translate from a value to a color
+	 */
+	toColor: function (value, point) {
+		var pos,
+			stops = this.stops,
+			from,
+			to,
+			color,
+			dataClasses = this.dataClasses,
+			dataClass,
+			i;
+
+		if (dataClasses) {
+			i = dataClasses.length;
+			while (i--) {
+				dataClass = dataClasses[i];
+				from = dataClass.from;
+				to = dataClass.to;
+				if ((from === UNDEFINED || value >= from) && (to === UNDEFINED || value <= to)) {
+					color = dataClass.color;
+					if (point) {
+						point.dataClass = i;
+					}
+					break;
+				}	
+			}
+
+		} else {
+
+			if (this.isLog) {
+				value = this.val2lin(value);
+			}
+			pos = 1 - ((this.max - value) / ((this.max - this.min) || 1));
+			i = stops.length;
+			while (i--) {
+				if (pos > stops[i][0]) {
+					break;
+				}
+			}
+			from = stops[i] || stops[i + 1];
+			to = stops[i + 1] || from;
+
+			// The position within the gradient
+			pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1);
+
+			color = this.tweenColors(
+				from.color, 
+				to.color,
+				pos
+			);
+		}
+		return color;
+	},
+
+	getOffset: function () {
+		var group = this.legendGroup,
+			sideOffset = this.chart.axisOffset[this.side];
+		
+		if (group) {
+
+			Axis.prototype.getOffset.call(this);
+			
+			if (!this.axisGroup.parentGroup) {
+
+				// Move the axis elements inside the legend group
+				this.axisGroup.add(group);
+				this.gridGroup.add(group);
+				this.labelGroup.add(group);
+
+				this.added = true;
+			}
+			// Reset it to avoid color axis reserving space
+			this.chart.axisOffset[this.side] = sideOffset;
+		}
+	},
+
+	/**
+	 * Create the color gradient
+	 */
+	setLegendColor: function () {
+		var grad,
+			horiz = this.horiz,
+			options = this.options;
+
+		grad = horiz ? [0, 0, 1, 0] : [0, 0, 0, 1]; 
+		this.legendColor = {
+			linearGradient: { x1: grad[0], y1: grad[1], x2: grad[2], y2: grad[3] },
+			stops: options.stops || [
+				[0, options.minColor],
+				[1, options.maxColor]
+			]
+		};
+	},
+
+	/**
+	 * The color axis appears inside the legend and has its own legend symbol
+	 */
+	drawLegendSymbol: function (legend, item) {
+		var padding = legend.padding,
+			legendOptions = legend.options,
+			horiz = this.horiz,
+			box,
+			width = pick(legendOptions.symbolWidth, horiz ? 200 : 12),
+			height = pick(legendOptions.symbolHeight, horiz ? 12 : 200),
+			labelPadding = pick(legendOptions.labelPadding, horiz ? 16 : 30),
+			itemDistance = pick(legendOptions.itemDistance, 10);
+
+		this.setLegendColor();
+
+		// Create the gradient
+		item.legendSymbol = this.chart.renderer.rect(
+			0,
+			legend.baseline - 11,
+			width,
+			height
+		).attr({
+			zIndex: 1
+		}).add(item.legendGroup);
+		box = item.legendSymbol.getBBox();
+
+		// Set how much space this legend item takes up
+		this.legendItemWidth = width + padding + (horiz ? itemDistance : labelPadding);
+		this.legendItemHeight = height + padding + (horiz ? labelPadding : 0);
+	},
+	/**
+	 * Fool the legend
+	 */
+	setState: noop,
+	visible: true,
+	setVisible: noop,
+	getSeriesExtremes: function () {
+		var series;
+		if (this.series.length) {
+			series = this.series[0];
+			this.dataMin = series.valueMin;
+			this.dataMax = series.valueMax;
+		}
+	},
+	drawCrosshair: function (e, point) {
+		var newCross = !this.cross,
+			plotX = point && point.plotX,
+			plotY = point && point.plotY,
+			crossPos,
+			axisPos = this.pos,
+			axisLen = this.len;
+		
+		if (point) {
+			crossPos = this.toPixels(point.value);
+			if (crossPos < axisPos) {
+				crossPos = axisPos - 2;
+			} else if (crossPos > axisPos + axisLen) {
+				crossPos = axisPos + axisLen + 2;
+			}
+			
+			point.plotX = crossPos;
+			point.plotY = this.len - crossPos;
+			Axis.prototype.drawCrosshair.call(this, e, point);
+			point.plotX = plotX;
+			point.plotY = plotY;
+			
+			if (!newCross && this.cross) {
+				this.cross
+					.attr({
+						fill: this.crosshair.color
+					})
+					.add(this.labelGroup);
+			}
+		}
+	},
+	getPlotLinePath: function (a, b, c, d, pos) {
+		if (pos) { // crosshairs only
+			return this.horiz ? 
+				['M', pos - 4, this.top - 6, 'L', pos + 4, this.top - 6, pos, this.top, 'Z'] : 
+				['M', this.left, pos, 'L', this.left - 6, pos + 6, this.left - 6, pos - 6, 'Z'];
+		} else {
+			return Axis.prototype.getPlotLinePath.call(this, a, b, c, d);
+		}
+	},
+
+	update: function (newOptions, redraw) {
+		each(this.series, function (series) {
+			series.isDirtyData = true; // Needed for Axis.update when choropleth colors change
+		});
+		Axis.prototype.update.call(this, newOptions, redraw);
+		if (this.legendItem) {
+			this.setLegendColor();
+			this.chart.legend.colorizeItem(this, true);
+		}
+	},
+
+	/**
+	 * Get the legend item symbols for data classes
+	 */
+	getDataClassLegendSymbols: function () {
+		var axis = this,
+			chart = this.chart,
+			legendItems = this.legendItems,
+			legendOptions = chart.options.legend,
+			valueDecimals = legendOptions.valueDecimals,
+			valueSuffix = legendOptions.valueSuffix || '',
+			name;
+
+		if (!legendItems.length) {
+			each(this.dataClasses, function (dataClass, i) {
+				var vis = true,
+					from = dataClass.from,
+					to = dataClass.to;
+				
+				// Assemble the default name. This can be overridden by legend.options.labelFormatter
+				name = '';
+				if (from === UNDEFINED) {
+					name = '< ';
+				} else if (to === UNDEFINED) {
+					name = '> ';
+				}
+				if (from !== UNDEFINED) {
+					name += numberFormat(from, valueDecimals) + valueSuffix;
+				}
+				if (from !== UNDEFINED && to !== UNDEFINED) {
+					name += ' - ';
+				}
+				if (to !== UNDEFINED) {
+					name += numberFormat(to, valueDecimals) + valueSuffix;
+				}
+				
+				// Add a mock object to the legend items
+				legendItems.push(extend({
+					chart: chart,
+					name: name,
+					options: {},
+					drawLegendSymbol: LegendSymbolMixin.drawRectangle,
+					visible: true,
+					setState: noop,
+					setVisible: function () {
+						vis = this.visible = !vis;
+						each(axis.series, function (series) {
+							each(series.points, function (point) {
+								if (point.dataClass === i) {
+									point.setVisible(vis);
+								}
+							});
+						});
+						
+						chart.legend.colorizeItem(this, vis);
+					}
+				}, dataClass));
+			});
+		}
+		return legendItems;
+	},
+	name: '' // Prevents 'undefined' in legend in IE8
+});
+
+
+
+/**
+ * Extend the chart getAxes method to also get the color axis
+ */
+wrap(Chart.prototype, 'getAxes', function (proceed) {
+
+	var options = this.options,
+		colorAxisOptions = options.colorAxis;
+
+	proceed.call(this);
+
+	this.colorAxis = [];
+	if (colorAxisOptions) {
+		proceed = new ColorAxis(this, colorAxisOptions); // Fake assignment for jsLint
+	}
+});
+
+
+/**
+ * Wrap the legend getAllItems method to add the color axis. This also removes the 
+ * axis' own series to prevent them from showing up individually.
+ */
+wrap(Legend.prototype, 'getAllItems', function (proceed) {
+	var allItems = [],
+		colorAxis = this.chart.colorAxis[0];
+
+	if (colorAxis) {
+
+		// Data classes
+		if (colorAxis.options.dataClasses) {
+			allItems = allItems.concat(colorAxis.getDataClassLegendSymbols());
+		// Gradient legend
+		} else {
+			// Add this axis on top
+			allItems.push(colorAxis);
+		}
+
+		// Don't add the color axis' series
+		each(colorAxis.series, function (series) {
+			series.options.showInLegend = false;
+		});
+	}
+
+	return allItems.concat(proceed.call(this));
+});/**
+ * Mixin for maps and heatmaps
+ */
+var colorSeriesMixin = {
+
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		stroke: 'borderColor',
+		'stroke-width': 'borderWidth',
+		fill: 'color',
+		dashstyle: 'dashStyle'
+	},
+	pointArrayMap: ['value'],
+	axisTypes: ['xAxis', 'yAxis', 'colorAxis'],
+	optionalAxis: 'colorAxis',
+	trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],
+	getSymbol: noop,
+	parallelArrays: ['x', 'y', 'value'],
+	colorKey: 'value',
+	
+	/**
+	 * In choropleth maps, the color is a result of the value, so this needs translation too
+	 */
+	translateColors: function () {
+		var series = this,
+			nullColor = this.options.nullColor,
+			colorAxis = this.colorAxis,
+			colorKey = this.colorKey;
+
+		each(this.data, function (point) {
+			var value = point[colorKey],
+				color;
+
+			color = value === null ? nullColor : (colorAxis && value !== undefined) ? colorAxis.toColor(value, point) : point.color || series.color;
+
+			if (color) {
+				point.color = color;
+			}
+		});
+	}
+};
+
+
+/**
+ * Wrap the buildText method and add the hook for add text stroke
+ */
+wrap(SVGRenderer.prototype, 'buildText', function (proceed, wrapper) {
+
+	var textStroke = wrapper.styles && wrapper.styles.HcTextStroke;
+
+	proceed.call(this, wrapper);
+
+	// Apply the text stroke
+	if (textStroke && wrapper.applyTextStroke) {
+		wrapper.applyTextStroke(textStroke);
+	}
+});
+
+/**
+ * Apply an outside text stroke to data labels, based on the custom CSS property, HcTextStroke.
+ * Consider moving this to Highcharts core, also makes sense on stacked columns etc.
+ */
+SVGRenderer.prototype.Element.prototype.applyTextStroke = function (textStroke) {
+	var elem = this.element,
+		tspans,
+		firstChild;
+	
+	textStroke = textStroke.split(' ');
+	tspans = elem.getElementsByTagName('tspan');
+	firstChild = elem.firstChild;
+	
+	// In order to get the right y position of the clones, 
+	// copy over the y setter
+	this.ySetter = this.xSetter;
+	
+	each([].slice.call(tspans), function (tspan, y) {
+		var clone;
+		if (y === 0) {
+			tspan.setAttribute('x', elem.getAttribute('x'));
+			if ((y = elem.getAttribute('y')) !== null) {
+				tspan.setAttribute('y', y);
+			}
+		}
+		clone = tspan.cloneNode(1);
+		clone.setAttribute('stroke', textStroke[1]);
+		clone.setAttribute('stroke-width', textStroke[0]);
+		clone.setAttribute('stroke-linejoin', 'round');
+		elem.insertBefore(clone, firstChild);
+	});
+};
+/**
+ * Extend the default options with map options
+ */
+defaultOptions.plotOptions.heatmap = merge(defaultOptions.plotOptions.scatter, {
+	animation: false,
+	borderWidth: 0,
+	nullColor: '#F8F8F8',
+	dataLabels: {
+		formatter: function () { // #2945
+			return this.point.value;
+		},
+		verticalAlign: 'middle',
+		crop: false,
+		overflow: false,
+		style: {
+			color: 'white',
+			fontWeight: 'bold',
+			HcTextStroke: '1px rgba(0,0,0,0.5)'
+		}
+	},
+	marker: null,
+	tooltip: {
+		pointFormat: '{point.x}, {point.y}: {point.value}<br/>'
+	},
+	states: {
+		normal: {
+			animation: true
+		},
+		hover: {
+			brightness: 0.2
+		}
+	}
+});
+
+// The Heatmap series type
+seriesTypes.heatmap = extendClass(seriesTypes.scatter, merge(colorSeriesMixin, {
+	type: 'heatmap',
+	pointArrayMap: ['y', 'value'],
+	hasPointSpecificOptions: true,
+	supportsDrilldown: true,
+	getExtremesFromAll: true,
+	init: function () {
+		seriesTypes.scatter.prototype.init.apply(this, arguments);
+		this.pointRange = this.options.colsize || 1;
+		this.yAxis.axisPointRange = this.options.rowsize || 1; // general point range
+	},
+	translate: function () {
+		var series = this,
+			options = series.options,
+			xAxis = series.xAxis,
+			yAxis = series.yAxis;
+
+		series.generatePoints();
+
+		each(series.points, function (point) {
+			var xPad = (options.colsize || 1) / 2,
+				yPad = (options.rowsize || 1) / 2,
+				x1 = Math.round(xAxis.len - xAxis.translate(point.x - xPad, 0, 1, 0, 1)),
+				x2 = Math.round(xAxis.len - xAxis.translate(point.x + xPad, 0, 1, 0, 1)),
+				y1 = Math.round(yAxis.translate(point.y - yPad, 0, 1, 0, 1)),
+				y2 = Math.round(yAxis.translate(point.y + yPad, 0, 1, 0, 1));
+
+			// Set plotX and plotY for use in K-D-Tree and more
+			point.plotX = (x1 + x2) / 2;
+			point.plotY = (y1 + y2) / 2;
+
+			point.shapeType = 'rect';
+			point.shapeArgs = {
+				x: Math.min(x1, x2),
+				y: Math.min(y1, y2),
+				width: Math.abs(x2 - x1),
+				height: Math.abs(y2 - y1)
+			};
+		});
+		
+		series.translateColors();
+
+		// Make sure colors are updated on colorAxis update (#2893)
+		if (this.chart.hasRendered) {
+			each(series.points, function (point) {
+				point.shapeArgs.fill = point.color;
+			});
+		}
+	},
+	drawPoints: seriesTypes.column.prototype.drawPoints,
+	animate: noop,
+	getBox: noop,
+	drawLegendSymbol: LegendSymbolMixin.drawRectangle,
+
+	getExtremes: function () {
+		// Get the extremes from the value data
+		Series.prototype.getExtremes.call(this, this.valueData);
+		this.valueMin = this.dataMin;
+		this.valueMax = this.dataMax;
+
+		// Get the extremes from the y data
+		Series.prototype.getExtremes.call(this);
+	}
+		
+}));
+
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/no-data-to-display.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/no-data-to-display.js
new file mode 100644
index 0000000..99ea2c1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/no-data-to-display.js
@@ -0,0 +1,12 @@
+/*
+ Highcharts JS v4.0.3 (2014-07-03)
+ Plugin for displaying a message when there is no data visible in chart.
+
+ (c) 2010-2014 Highsoft AS
+ Author: Oystein Moseng
+
+ License: www.highcharts.com/license
+*/
+(function(c){function f(){return!!this.points.length}function g(){this.hasData()?this.hideNoData():this.showNoData()}var d=c.seriesTypes,e=c.Chart.prototype,h=c.getOptions(),i=c.extend;i(h.lang,{noData:"No data to display"});h.noData={position:{x:0,y:0,align:"center",verticalAlign:"middle"},attr:{},style:{fontWeight:"bold",fontSize:"12px",color:"#60606a"}};if(d.pie)d.pie.prototype.hasData=f;if(d.gauge)d.gauge.prototype.hasData=f;if(d.waterfall)d.waterfall.prototype.hasData=f;c.Series.prototype.hasData=
+function(){return this.dataMax!==void 0&&this.dataMin!==void 0};e.showNoData=function(a){var b=this.options,a=a||b.lang.noData,b=b.noData;if(!this.noDataLabel)this.noDataLabel=this.renderer.label(a,0,0,null,null,null,null,null,"no-data").attr(b.attr).css(b.style).add(),this.noDataLabel.align(i(this.noDataLabel.getBBox(),b.position),!1,"plotBox")};e.hideNoData=function(){if(this.noDataLabel)this.noDataLabel=this.noDataLabel.destroy()};e.hasData=function(){for(var a=this.series,b=a.length;b--;)if(a[b].hasData()&&
+!a[b].options.isInternal)return!0;return!1};e.callbacks.push(function(a){c.addEvent(a,"load",g);c.addEvent(a,"redraw",g)})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/no-data-to-display.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/no-data-to-display.src.js
new file mode 100644
index 0000000..b02b5be
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/no-data-to-display.src.js
@@ -0,0 +1,130 @@
+/**
+ * @license Highcharts JS v4.0.3 (2014-07-03)
+ * Plugin for displaying a message when there is no data visible in chart.
+ *
+ * (c) 2010-2014 Highsoft AS
+ * Author: Oystein Moseng
+ *
+ * License: www.highcharts.com/license
+ */
+
+(function (H) { // docs
+	
+	var seriesTypes = H.seriesTypes,
+		chartPrototype = H.Chart.prototype,
+		defaultOptions = H.getOptions(),
+		extend = H.extend;
+
+	// Add language option
+	extend(defaultOptions.lang, {
+		noData: 'No data to display'
+	});
+	
+	// Add default display options for message
+	defaultOptions.noData = {
+		position: {
+			x: 0,
+			y: 0,			
+			align: 'center',
+			verticalAlign: 'middle'
+		},
+		attr: {						
+		},
+		style: {	
+			fontWeight: 'bold',		
+			fontSize: '12px',
+			color: '#60606a'		
+		}
+	};
+
+	/**
+	 * Define hasData functions for series. These return true if there are data points on this series within the plot area
+	 */	
+	function hasDataPie() {
+		return !!this.points.length; /* != 0 */
+	}
+
+	if (seriesTypes.pie) {
+		seriesTypes.pie.prototype.hasData = hasDataPie;
+	}
+
+	if (seriesTypes.gauge) {
+		seriesTypes.gauge.prototype.hasData = hasDataPie;
+	}
+
+	if (seriesTypes.waterfall) {
+		seriesTypes.waterfall.prototype.hasData = hasDataPie;
+	}
+
+	H.Series.prototype.hasData = function () {
+		return this.dataMax !== undefined && this.dataMin !== undefined;
+	};
+	
+	/**
+	 * Display a no-data message.
+	 *
+	 * @param {String} str An optional message to show in place of the default one 
+	 */
+	chartPrototype.showNoData = function (str) {
+		var chart = this,
+			options = chart.options,
+			text = str || options.lang.noData,
+			noDataOptions = options.noData;
+
+		if (!chart.noDataLabel) {
+			chart.noDataLabel = chart.renderer.label(text, 0, 0, null, null, null, null, null, 'no-data')
+				.attr(noDataOptions.attr)
+				.css(noDataOptions.style)
+				.add();
+			chart.noDataLabel.align(extend(chart.noDataLabel.getBBox(), noDataOptions.position), false, 'plotBox');
+		}
+	};
+
+	/**
+	 * Hide no-data message	
+	 */	
+	chartPrototype.hideNoData = function () {
+		var chart = this;
+		if (chart.noDataLabel) {
+			chart.noDataLabel = chart.noDataLabel.destroy();
+		}
+	};
+
+	/**
+	 * Returns true if there are data points within the plot area now
+	 */	
+	chartPrototype.hasData = function () {
+		var chart = this,
+			series = chart.series,
+			i = series.length;
+
+		while (i--) {
+			if (series[i].hasData() && !series[i].options.isInternal) { 
+				return true;
+			}	
+		}
+
+		return false;
+	};
+
+	/**
+	 * Show no-data message if there is no data in sight. Otherwise, hide it.
+	 */
+	function handleNoData() {
+		var chart = this;
+		if (chart.hasData()) {
+			chart.hideNoData();
+		} else {
+			chart.showNoData();
+		}
+	}
+
+	/**
+	 * Add event listener to handle automatic display of no-data message
+	 */
+	chartPrototype.callbacks.push(function (chart) {
+		H.addEvent(chart, 'load', handleNoData);
+		H.addEvent(chart, 'redraw', handleNoData);
+	});
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/solid-gauge.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/solid-gauge.js
new file mode 100644
index 0000000..283ac42
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/solid-gauge.js
@@ -0,0 +1,13 @@
+/*
+  Highcharts JS v4.0.3 (2014-07-03)
+ Solid angular gauge module
+
+ (c) 2010-2014 Torstein Honsi
+
+ License: www.highcharts.com/license
+*/
+(function(a){var k=a.getOptions().plotOptions,q=a.pInt,r=a.pick,l=a.each,n;k.solidgauge=a.merge(k.gauge,{colorByPoint:!0});n={initDataClasses:function(b){var h=this,e=this.chart,c,m=0,f=this.options;this.dataClasses=c=[];l(b.dataClasses,function(g,d){var i,g=a.merge(g);c.push(g);if(!g.color)f.dataClassColor==="category"?(i=e.options.colors,g.color=i[m++],m===i.length&&(m=0)):g.color=h.tweenColors(a.Color(f.minColor),a.Color(f.maxColor),d/(b.dataClasses.length-1))})},initStops:function(b){this.stops=
+b.stops||[[0,this.options.minColor],[1,this.options.maxColor]];l(this.stops,function(b){b.color=a.Color(b[1])})},toColor:function(b,h){var e,c=this.stops,a,f=this.dataClasses,g,d;if(f)for(d=f.length;d--;){if(g=f[d],a=g.from,c=g.to,(a===void 0||b>=a)&&(c===void 0||b<=c)){e=g.color;if(h)h.dataClass=d;break}}else{this.isLog&&(b=this.val2lin(b));e=1-(this.max-b)/(this.max-this.min);for(d=c.length;d--;)if(e>c[d][0])break;a=c[d]||c[d+1];c=c[d+1]||a;e=1-(c[0]-e)/(c[0]-a[0]||1);e=this.tweenColors(a.color,
+c.color,e)}return e},tweenColors:function(b,a,e){var c=a.rgba[3]!==1||b.rgba[3]!==1;return b.rgba.length===0||a.rgba.length===0?"none":(c?"rgba(":"rgb(")+Math.round(a.rgba[0]+(b.rgba[0]-a.rgba[0])*(1-e))+","+Math.round(a.rgba[1]+(b.rgba[1]-a.rgba[1])*(1-e))+","+Math.round(a.rgba[2]+(b.rgba[2]-a.rgba[2])*(1-e))+(c?","+(a.rgba[3]+(b.rgba[3]-a.rgba[3])*(1-e)):"")+")"}};a.seriesTypes.solidgauge=a.extendClass(a.seriesTypes.gauge,{type:"solidgauge",bindAxes:function(){var b;a.seriesTypes.gauge.prototype.bindAxes.call(this);
+b=this.yAxis;a.extend(b,n);b.options.dataClasses&&b.initDataClasses(b.options);b.initStops(b.options)},drawPoints:function(){var b=this,h=b.yAxis,e=h.center,c=b.options,m=b.chart.renderer;a.each(b.points,function(f){var g=f.graphic,d=h.startAngleRad+h.translate(f.y,null,null,null,!0),i=q(r(c.radius,100))*e[2]/200,o=q(r(c.innerRadius,60))*e[2]/200,p=h.toColor(f.y,f),k;if(p!=="none")k=f.color,f.color=p;c.wrap===!1&&(d=Math.max(h.startAngleRad,Math.min(h.endAngleRad,d)));var d=d*180/Math.PI,j=d/(180/
+Math.PI),l=h.startAngleRad,d=Math.min(j,l),j=Math.max(j,l);j-d>2*Math.PI&&(j=d+2*Math.PI);i={x:e[0],y:e[1],r:i,innerR:o,start:d,end:j};g?(o=i.d,g.attr({fill:f.color}).animate(i,{step:function(b,c){g.attr("fill",n.tweenColors(a.Color(k),a.Color(p),c.pos))}}),i.d=o):f.graphic=m.arc(i).attr({stroke:c.borderColor||"none","stroke-width":c.borderWidth||0,fill:f.color,"sweep-flag":0}).add(b.group)})},animate:null})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/solid-gauge.src.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/solid-gauge.src.js
new file mode 100644
index 0000000..32af40a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/modules/solid-gauge.src.js
@@ -0,0 +1,234 @@
+/**
+ * @license  Highcharts JS v4.0.3 (2014-07-03)
+ * Solid angular gauge module
+ *
+ * (c) 2010-2014 Torstein Honsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+/*global Highcharts*/
+(function (H) {
+	"use strict";
+
+	var defaultPlotOptions = H.getOptions().plotOptions,
+		pInt = H.pInt,
+		pick = H.pick,
+		each = H.each,
+		colorAxisMethods,
+		UNDEFINED;
+
+	// The default options
+	defaultPlotOptions.solidgauge = H.merge(defaultPlotOptions.gauge, {
+		colorByPoint: true
+	});
+
+
+	// These methods are defined in the ColorAxis object, and copied here.
+	// If we implement an AMD system we should make ColorAxis a dependency.
+	colorAxisMethods = {
+
+
+		initDataClasses: function (userOptions) {
+			var axis = this,
+				chart = this.chart,
+				dataClasses,
+				colorCounter = 0,
+				options = this.options;
+			this.dataClasses = dataClasses = [];
+
+			each(userOptions.dataClasses, function (dataClass, i) {
+				var colors;
+
+				dataClass = H.merge(dataClass);
+				dataClasses.push(dataClass);
+				if (!dataClass.color) {
+					if (options.dataClassColor === 'category') {
+						colors = chart.options.colors;
+						dataClass.color = colors[colorCounter++];
+						// loop back to zero
+						if (colorCounter === colors.length) {
+							colorCounter = 0;
+						}
+					} else {
+						dataClass.color = axis.tweenColors(H.Color(options.minColor), H.Color(options.maxColor), i / (userOptions.dataClasses.length - 1));
+					}
+				}
+			});
+		},
+
+		initStops: function (userOptions) {
+			this.stops = userOptions.stops || [
+				[0, this.options.minColor],
+				[1, this.options.maxColor]
+			];
+			each(this.stops, function (stop) {
+				stop.color = H.Color(stop[1]);
+			});
+		},
+		/** 
+		 * Translate from a value to a color
+		 */
+		toColor: function (value, point) {
+			var pos,
+				stops = this.stops,
+				from,
+				to,
+				color,
+				dataClasses = this.dataClasses,
+				dataClass,
+				i;
+
+			if (dataClasses) {
+				i = dataClasses.length;
+				while (i--) {
+					dataClass = dataClasses[i];
+					from = dataClass.from;
+					to = dataClass.to;
+					if ((from === UNDEFINED || value >= from) && (to === UNDEFINED || value <= to)) {
+						color = dataClass.color;
+						if (point) {
+							point.dataClass = i;
+						}
+						break;
+					}   
+				}
+
+			} else {
+
+				if (this.isLog) {
+					value = this.val2lin(value);
+				}
+				pos = 1 - ((this.max - value) / (this.max - this.min));
+				i = stops.length;
+				while (i--) {
+					if (pos > stops[i][0]) {
+						break;
+					}
+				}
+				from = stops[i] || stops[i + 1];
+				to = stops[i + 1] || from;
+
+				// The position within the gradient
+				pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1);
+				
+				color = this.tweenColors(
+					from.color, 
+					to.color,
+					pos
+				);
+			}
+			return color;
+		},
+		tweenColors: function (from, to, pos) {
+			// Check for has alpha, because rgba colors perform worse due to lack of
+			// support in WebKit.
+			var hasAlpha = (to.rgba[3] !== 1 || from.rgba[3] !== 1);
+
+			if (from.rgba.length === 0 || to.rgba.length === 0) {
+				return 'none';
+			}
+			return (hasAlpha ? 'rgba(' : 'rgb(') + 
+				Math.round(to.rgba[0] + (from.rgba[0] - to.rgba[0]) * (1 - pos)) + ',' + 
+				Math.round(to.rgba[1] + (from.rgba[1] - to.rgba[1]) * (1 - pos)) + ',' + 
+				Math.round(to.rgba[2] + (from.rgba[2] - to.rgba[2]) * (1 - pos)) + 
+				(hasAlpha ? (',' + (to.rgba[3] + (from.rgba[3] - to.rgba[3]) * (1 - pos))) : '') + ')';
+		}
+	};
+
+	// The series prototype
+	H.seriesTypes.solidgauge = H.extendClass(H.seriesTypes.gauge, {
+		type: 'solidgauge',
+
+		bindAxes: function () {
+			var axis;
+			H.seriesTypes.gauge.prototype.bindAxes.call(this);
+
+			axis = this.yAxis;
+			H.extend(axis, colorAxisMethods);
+
+			// Prepare data classes
+			if (axis.options.dataClasses) {
+				axis.initDataClasses(axis.options);
+			}
+			axis.initStops(axis.options);
+		},
+
+		/**
+		 * Draw the points where each point is one needle
+		 */
+		drawPoints: function () {
+			var series = this,
+				yAxis = series.yAxis,
+				center = yAxis.center,
+				options = series.options,
+				renderer = series.chart.renderer;
+
+			H.each(series.points, function (point) {
+				var graphic = point.graphic,
+					rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true),
+					radius = (pInt(pick(options.radius, 100)) * center[2]) / 200,
+					innerRadius = (pInt(pick(options.innerRadius, 60)) * center[2]) / 200,
+					shapeArgs,
+					d,
+					toColor = yAxis.toColor(point.y, point),
+					fromColor;
+
+				if (toColor !== 'none') {
+					fromColor = point.color;
+					point.color = toColor;
+				}
+
+				// Handle the wrap option
+				if (options.wrap === false) {
+					rotation = Math.max(yAxis.startAngleRad, Math.min(yAxis.endAngleRad, rotation));
+				}
+				rotation = rotation * 180 / Math.PI;
+
+				var angle1 = rotation / (180 / Math.PI),
+					angle2 = yAxis.startAngleRad,
+					minAngle = Math.min(angle1, angle2),
+					maxAngle = Math.max(angle1, angle2);
+
+				if (maxAngle - minAngle > 2 * Math.PI) {
+					maxAngle = minAngle + 2 * Math.PI;
+				}
+
+				shapeArgs = {
+					x: center[0],
+					y: center[1],
+					r: radius,
+					innerR: innerRadius,
+					start: minAngle,
+					end: maxAngle 
+				};
+
+				if (graphic) {
+					d = shapeArgs.d;
+
+					/*jslint unparam: true*/
+					graphic.attr({
+						fill: point.color
+					}).animate(shapeArgs, {
+						step: function (value, fx) {
+							graphic.attr('fill', colorAxisMethods.tweenColors(H.Color(fromColor), H.Color(toColor), fx.pos));
+						}
+					});
+					/*jslint unparam: false*/
+					shapeArgs.d = d; // animate alters it
+				} else {					
+					point.graphic = renderer.arc(shapeArgs)
+						.attr({
+							stroke: options.borderColor || 'none',
+							'stroke-width': options.borderWidth || 0,
+							fill: point.color,
+							'sweep-flag': 0
+						})
+						.add(series.group);
+				}
+			});
+		},
+		animate: null
+	});
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-blue.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-blue.js
new file mode 100644
index 0000000..7cf7138
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-blue.js
@@ -0,0 +1,254 @@
+/**
+ * Dark blue theme for Highcharts JS
+ * @author Torstein Honsi
+ */
+
+Highcharts.theme = {
+	colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 1, y2: 1 },
+			stops: [
+				[0, 'rgb(48, 48, 96)'],
+				[1, 'rgb(0, 0, 0)']
+			]
+		},
+		borderColor: '#000000',
+		borderWidth: 2,
+		className: 'dark-container',
+		plotBackgroundColor: 'rgba(255, 255, 255, .1)',
+		plotBorderColor: '#CCCCCC',
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#C0C0C0',
+			font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#666666',
+			font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineColor: '#333333',
+		gridLineWidth: 1,
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		tickColor: '#A0A0A0',
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+			}
+		}
+	},
+	yAxis: {
+		gridLineColor: '#333333',
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		minorTickInterval: null,
+		tickColor: '#A0A0A0',
+		tickWidth: 1,
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+			}
+		}
+	},
+	tooltip: {
+		backgroundColor: 'rgba(0, 0, 0, 0.75)',
+		style: {
+			color: '#F0F0F0'
+		}
+	},
+	toolbar: {
+		itemStyle: {
+			color: 'silver'
+		}
+	},
+	plotOptions: {
+		line: {
+			dataLabels: {
+				color: '#CCC'
+			},
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		spline: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		scatter: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		candlestick: {
+			lineColor: 'white'
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: '#A0A0A0'
+		},
+		itemHoverStyle: {
+			color: '#FFF'
+		},
+		itemHiddenStyle: {
+			color: '#444'
+		}
+	},
+	credits: {
+		style: {
+			color: '#666'
+		}
+	},
+	labels: {
+		style: {
+			color: '#CCC'
+		}
+	},
+
+	navigation: {
+		buttonOptions: {
+			symbolStroke: '#DDDDDD',
+			hoverSymbolStroke: '#FFFFFF',
+			theme: {
+				fill: {
+					linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+					stops: [
+						[0.4, '#606060'],
+						[0.6, '#333333']
+					]
+				},
+				stroke: '#000000'
+			}
+		}
+	},
+
+	// scroll charts
+	rangeSelector: {
+		buttonTheme: {
+			fill: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+			stroke: '#000000',
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold'
+			},
+			states: {
+				hover: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.4, '#BBB'],
+							[0.6, '#888']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'white'
+					}
+				},
+				select: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.1, '#000'],
+							[0.3, '#333']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'yellow'
+					}
+				}
+			}
+		},
+		inputStyle: {
+			backgroundColor: '#333',
+			color: 'silver'
+		},
+		labelStyle: {
+			color: 'silver'
+		}
+	},
+
+	navigator: {
+		handles: {
+			backgroundColor: '#666',
+			borderColor: '#AAA'
+		},
+		outlineColor: '#CCC',
+		maskFill: 'rgba(16, 16, 16, 0.5)',
+		series: {
+			color: '#7798BF',
+			lineColor: '#A6C7ED'
+		}
+	},
+
+	scrollbar: {
+		barBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		barBorderColor: '#CCC',
+		buttonArrowColor: '#CCC',
+		buttonBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		buttonBorderColor: '#CCC',
+		rifleColor: '#FFF',
+		trackBackgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#000'],
+				[1, '#333']
+			]
+		},
+		trackBorderColor: '#666'
+	},
+
+	// special colors for some of the
+	legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',
+	background2: 'rgb(35, 35, 70)',
+	dataLabelsColor: '#444',
+	textColor: '#C0C0C0',
+	maskColor: 'rgba(255,255,255,0.3)'
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-green.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-green.js
new file mode 100644
index 0000000..4a7ad58
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-green.js
@@ -0,0 +1,255 @@
+/**
+ * Dark blue theme for Highcharts JS
+ * @author Torstein Honsi
+ */
+
+Highcharts.theme = {
+	colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: {
+			linearGradient: [0, 0, 250, 500],
+			stops: [
+				[0, 'rgb(48, 96, 48)'],
+				[1, 'rgb(0, 0, 0)']
+			]
+		},
+		borderColor: '#000000',
+		borderWidth: 2,
+		className: 'dark-container',
+		plotBackgroundColor: 'rgba(255, 255, 255, .1)',
+		plotBorderColor: '#CCCCCC',
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#C0C0C0',
+			font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#666666',
+			font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineColor: '#333333',
+		gridLineWidth: 1,
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		tickColor: '#A0A0A0',
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+			}
+		}
+	},
+	yAxis: {
+		gridLineColor: '#333333',
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		minorTickInterval: null,
+		tickColor: '#A0A0A0',
+		tickWidth: 1,
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+			}
+		}
+	},
+	tooltip: {
+		backgroundColor: 'rgba(0, 0, 0, 0.75)',
+		style: {
+			color: '#F0F0F0'
+		}
+	},
+	toolbar: {
+		itemStyle: {
+			color: 'silver'
+		}
+	},
+	plotOptions: {
+		line: {
+			dataLabels: {
+				color: '#CCC'
+			},
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		spline: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		scatter: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		candlestick: {
+			lineColor: 'white'
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: '#A0A0A0'
+		},
+		itemHoverStyle: {
+			color: '#FFF'
+		},
+		itemHiddenStyle: {
+			color: '#444'
+		}
+	},
+	credits: {
+		style: {
+			color: '#666'
+		}
+	},
+	labels: {
+		style: {
+			color: '#CCC'
+		}
+	},
+
+
+	navigation: {
+		buttonOptions: {
+			symbolStroke: '#DDDDDD',
+			hoverSymbolStroke: '#FFFFFF',
+			theme: {
+				fill: {
+					linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+					stops: [
+						[0.4, '#606060'],
+						[0.6, '#333333']
+					]
+				},
+				stroke: '#000000'
+			}
+		}
+	},
+
+	// scroll charts
+	rangeSelector: {
+		buttonTheme: {
+			fill: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+			stroke: '#000000',
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold'
+			},
+			states: {
+				hover: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.4, '#BBB'],
+							[0.6, '#888']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'white'
+					}
+				},
+				select: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.1, '#000'],
+							[0.3, '#333']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'yellow'
+					}
+				}
+			}
+		},
+		inputStyle: {
+			backgroundColor: '#333',
+			color: 'silver'
+		},
+		labelStyle: {
+			color: 'silver'
+		}
+	},
+
+	navigator: {
+		handles: {
+			backgroundColor: '#666',
+			borderColor: '#AAA'
+		},
+		outlineColor: '#CCC',
+		maskFill: 'rgba(16, 16, 16, 0.5)',
+		series: {
+			color: '#7798BF',
+			lineColor: '#A6C7ED'
+		}
+	},
+
+	scrollbar: {
+		barBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		barBorderColor: '#CCC',
+		buttonArrowColor: '#CCC',
+		buttonBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		buttonBorderColor: '#CCC',
+		rifleColor: '#FFF',
+		trackBackgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#000'],
+				[1, '#333']
+			]
+		},
+		trackBorderColor: '#666'
+	},
+
+	// special colors for some of the
+	legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',
+	background2: 'rgb(35, 35, 70)',
+	dataLabelsColor: '#444',
+	textColor: '#C0C0C0',
+	maskColor: 'rgba(255,255,255,0.3)'
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-unica.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-unica.js
new file mode 100644
index 0000000..4f1f8df
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/dark-unica.js
@@ -0,0 +1,213 @@
+/**
+ * Dark theme for Highcharts JS
+ * @author Torstein Honsi
+ */
+
+// Load the fonts
+Highcharts.createElement('link', {
+	href: 'http://fonts.googleapis.com/css?family=Unica+One',
+	rel: 'stylesheet',
+	type: 'text/css'
+}, null, document.getElementsByTagName('head')[0]);
+
+Highcharts.theme = {
+	colors: ["#2b908f", "#90ee7e", "#f45b5b", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 1, y2: 1 },
+			stops: [
+				[0, '#2a2a2b'],
+				[1, '#3e3e40']
+			]
+		},
+		style: {
+			fontFamily: "'Unica One', sans-serif"
+		},
+		plotBorderColor: '#606063'
+	},
+	title: {
+		style: {
+			color: '#E0E0E3',
+			textTransform: 'uppercase',
+			fontSize: '20px'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#E0E0E3',
+			textTransform: 'uppercase'
+		}
+	},
+	xAxis: {
+		gridLineColor: '#707073',
+		labels: {
+			style: {
+				color: '#E0E0E3'
+			}
+		},
+		lineColor: '#707073',
+		minorGridLineColor: '#505053',
+		tickColor: '#707073',
+		title: {
+			style: {
+				color: '#A0A0A3'
+
+			}
+		}
+	},
+	yAxis: {
+		gridLineColor: '#707073',
+		labels: {
+			style: {
+				color: '#E0E0E3'
+			}
+		},
+		lineColor: '#707073',
+		minorGridLineColor: '#505053',
+		tickColor: '#707073',
+		tickWidth: 1,
+		title: {
+			style: {
+				color: '#A0A0A3'
+			}
+		}
+	},
+	tooltip: {
+		backgroundColor: 'rgba(0, 0, 0, 0.85)',
+		style: {
+			color: '#F0F0F0'
+		}
+	},
+	plotOptions: {
+		series: {
+			dataLabels: {
+				color: '#B0B0B3'
+			},
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		boxplot: {
+			fillColor: '#505053'
+		},
+		candlestick: {
+			lineColor: 'white'
+		},
+		errorbar: {
+			color: 'white'
+		}
+	},
+	legend: {
+		itemStyle: {
+			color: '#E0E0E3'
+		},
+		itemHoverStyle: {
+			color: '#FFF'
+		},
+		itemHiddenStyle: {
+			color: '#606063'
+		}
+	},
+	credits: {
+		style: {
+			color: '#666'
+		}
+	},
+	labels: {
+		style: {
+			color: '#707073'
+		}
+	},
+
+	drilldown: {
+		activeAxisLabelStyle: {
+			color: '#F0F0F3'
+		},
+		activeDataLabelStyle: {
+			color: '#F0F0F3'
+		}
+	},
+
+	navigation: {
+		buttonOptions: {
+			symbolStroke: '#DDDDDD',
+			theme: {
+				fill: '#505053'
+			}
+		}
+	},
+
+	// scroll charts
+	rangeSelector: {
+		buttonTheme: {
+			fill: '#505053',
+			stroke: '#000000',
+			style: {
+				color: '#CCC'
+			},
+			states: {
+				hover: {
+					fill: '#707073',
+					stroke: '#000000',
+					style: {
+						color: 'white'
+					}
+				},
+				select: {
+					fill: '#000003',
+					stroke: '#000000',
+					style: {
+						color: 'white'
+					}
+				}
+			}
+		},
+		inputBoxBorderColor: '#505053',
+		inputStyle: {
+			backgroundColor: '#333',
+			color: 'silver'
+		},
+		labelStyle: {
+			color: 'silver'
+		}
+	},
+
+	navigator: {
+		handles: {
+			backgroundColor: '#666',
+			borderColor: '#AAA'
+		},
+		outlineColor: '#CCC',
+		maskFill: 'rgba(255,255,255,0.1)',
+		series: {
+			color: '#7798BF',
+			lineColor: '#A6C7ED'
+		},
+		xAxis: {
+			gridLineColor: '#505053'
+		}
+	},
+
+	scrollbar: {
+		barBackgroundColor: '#808083',
+		barBorderColor: '#808083',
+		buttonArrowColor: '#CCC',
+		buttonBackgroundColor: '#606063',
+		buttonBorderColor: '#606063',
+		rifleColor: '#FFF',
+		trackBackgroundColor: '#404043',
+		trackBorderColor: '#404043'
+	},
+
+	// special colors for some of the
+	legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',
+	background2: '#505053',
+	dataLabelsColor: '#B0B0B3',
+	textColor: '#C0C0C0',
+	contrastTextColor: '#F0F0F3',
+	maskColor: 'rgba(255,255,255,0.3)'
+};
+
+// Apply the theme
+Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/gray.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/gray.js
new file mode 100644
index 0000000..d9a4016
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/gray.js
@@ -0,0 +1,257 @@
+/**
+ * Gray theme for Highcharts JS
+ * @author Torstein Honsi
+ */
+
+Highcharts.theme = {
+	colors: ["#DDDF0D", "#7798BF", "#55BF3B", "#DF5353", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, 'rgb(96, 96, 96)'],
+				[1, 'rgb(16, 16, 16)']
+			]
+		},
+		borderWidth: 0,
+		borderRadius: 0,
+		plotBackgroundColor: null,
+		plotShadow: false,
+		plotBorderWidth: 0
+	},
+	title: {
+		style: {
+			color: '#FFF',
+			font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#DDD',
+			font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineWidth: 0,
+		lineColor: '#999',
+		tickColor: '#999',
+		labels: {
+			style: {
+				color: '#999',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#AAA',
+				font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	yAxis: {
+		alternateGridColor: null,
+		minorTickInterval: null,
+		gridLineColor: 'rgba(255, 255, 255, .1)',
+		minorGridLineColor: 'rgba(255,255,255,0.07)',
+		lineWidth: 0,
+		tickWidth: 0,
+		labels: {
+			style: {
+				color: '#999',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#AAA',
+				font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	legend: {
+		itemStyle: {
+			color: '#CCC'
+		},
+		itemHoverStyle: {
+			color: '#FFF'
+		},
+		itemHiddenStyle: {
+			color: '#333'
+		}
+	},
+	labels: {
+		style: {
+			color: '#CCC'
+		}
+	},
+	tooltip: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, 'rgba(96, 96, 96, .8)'],
+				[1, 'rgba(16, 16, 16, .8)']
+			]
+		},
+		borderWidth: 0,
+		style: {
+			color: '#FFF'
+		}
+	},
+
+
+	plotOptions: {
+		series: {
+			nullColor: '#444444'
+		},
+		line: {
+			dataLabels: {
+				color: '#CCC'
+			},
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		spline: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		scatter: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		candlestick: {
+			lineColor: 'white'
+		}
+	},
+
+	toolbar: {
+		itemStyle: {
+			color: '#CCC'
+		}
+	},
+
+	navigation: {
+		buttonOptions: {
+			symbolStroke: '#DDDDDD',
+			hoverSymbolStroke: '#FFFFFF',
+			theme: {
+				fill: {
+					linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+					stops: [
+						[0.4, '#606060'],
+						[0.6, '#333333']
+					]
+				},
+				stroke: '#000000'
+			}
+		}
+	},
+
+	// scroll charts
+	rangeSelector: {
+		buttonTheme: {
+			fill: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+			stroke: '#000000',
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold'
+			},
+			states: {
+				hover: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.4, '#BBB'],
+							[0.6, '#888']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'white'
+					}
+				},
+				select: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.1, '#000'],
+							[0.3, '#333']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'yellow'
+					}
+				}
+			}
+		},
+		inputStyle: {
+			backgroundColor: '#333',
+			color: 'silver'
+		},
+		labelStyle: {
+			color: 'silver'
+		}
+	},
+
+	navigator: {
+		handles: {
+			backgroundColor: '#666',
+			borderColor: '#AAA'
+		},
+		outlineColor: '#CCC',
+		maskFill: 'rgba(16, 16, 16, 0.5)',
+		series: {
+			color: '#7798BF',
+			lineColor: '#A6C7ED'
+		}
+	},
+
+	scrollbar: {
+		barBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		barBorderColor: '#CCC',
+		buttonArrowColor: '#CCC',
+		buttonBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		buttonBorderColor: '#CCC',
+		rifleColor: '#FFF',
+		trackBackgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#000'],
+				[1, '#333']
+			]
+		},
+		trackBorderColor: '#666'
+	},
+
+	// special colors for some of the demo examples
+	legendBackgroundColor: 'rgba(48, 48, 48, 0.8)',
+	background2: 'rgb(70, 70, 70)',
+	dataLabelsColor: '#444',
+	textColor: '#E0E0E0',
+	maskColor: 'rgba(255,255,255,0.3)'
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/grid-light.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/grid-light.js
new file mode 100644
index 0000000..acf53ae
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/grid-light.js
@@ -0,0 +1,74 @@
+/**
+ * Grid-light theme for Highcharts JS
+ * @author Torstein Honsi
+ */
+
+// Load the fonts
+Highcharts.createElement('link', {
+	href: 'http://fonts.googleapis.com/css?family=Dosis:400,600',
+	rel: 'stylesheet',
+	type: 'text/css'
+}, null, document.getElementsByTagName('head')[0]);
+
+Highcharts.theme = {
+	colors: ["#7cb5ec", "#f7a35c", "#90ee7e", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: null,
+		style: {
+			fontFamily: "Dosis, sans-serif"
+		}
+	},
+	title: {
+		style: {
+			fontSize: '16px',
+			fontWeight: 'bold',
+			textTransform: 'uppercase'
+		}
+	},
+	tooltip: {
+		borderWidth: 0,
+		backgroundColor: 'rgba(219,219,216,0.8)',
+		shadow: false
+	},
+	legend: {
+		itemStyle: {
+			fontWeight: 'bold',
+			fontSize: '13px'
+		}
+	},
+	xAxis: {
+		gridLineWidth: 1,
+		labels: {
+			style: {
+				fontSize: '12px'
+			}
+		}
+	},
+	yAxis: {
+		minorTickInterval: 'auto',
+		title: {
+			style: {
+				textTransform: 'uppercase'
+			}
+		},
+		labels: {
+			style: {
+				fontSize: '12px'
+			}
+		}
+	},
+	plotOptions: {
+		candlestick: {
+			lineColor: '#404048'
+		}
+	},
+
+
+	// General
+	background2: '#F0F0EA'
+	
+};
+
+// Apply the theme
+Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/grid.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/grid.js
new file mode 100644
index 0000000..70342f5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/grid.js
@@ -0,0 +1,103 @@
+/**
+ * Grid theme for Highcharts JS
+ * @author Torstein Honsi
+ */
+
+Highcharts.theme = {
+	colors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'],
+	chart: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 1, y2: 1 },
+			stops: [
+				[0, 'rgb(255, 255, 255)'],
+				[1, 'rgb(240, 240, 255)']
+			]
+		},
+		borderWidth: 2,
+		plotBackgroundColor: 'rgba(255, 255, 255, .9)',
+		plotShadow: true,
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#000',
+			font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#666666',
+			font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineWidth: 1,
+		lineColor: '#000',
+		tickColor: '#000',
+		labels: {
+			style: {
+				color: '#000',
+				font: '11px Trebuchet MS, Verdana, sans-serif'
+			}
+		},
+		title: {
+			style: {
+				color: '#333',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+			}
+		}
+	},
+	yAxis: {
+		minorTickInterval: 'auto',
+		lineColor: '#000',
+		lineWidth: 1,
+		tickWidth: 1,
+		tickColor: '#000',
+		labels: {
+			style: {
+				color: '#000',
+				font: '11px Trebuchet MS, Verdana, sans-serif'
+			}
+		},
+		title: {
+			style: {
+				color: '#333',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+			}
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: 'black'
+
+		},
+		itemHoverStyle: {
+			color: '#039'
+		},
+		itemHiddenStyle: {
+			color: 'gray'
+		}
+	},
+	labels: {
+		style: {
+			color: '#99b'
+		}
+	},
+
+	navigation: {
+		buttonOptions: {
+			theme: {
+				stroke: '#CCCCCC'
+			}
+		}
+	}
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/sand-signika.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/sand-signika.js
new file mode 100644
index 0000000..2f1e34e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/sand-signika.js
@@ -0,0 +1,104 @@
+/**
+ * Sand-Signika theme for Highcharts JS
+ * @author Torstein Honsi
+ */
+
+// Load the fonts
+Highcharts.createElement('link', {
+	href: 'http://fonts.googleapis.com/css?family=Signika:400,700',
+	rel: 'stylesheet',
+	type: 'text/css'
+}, null, document.getElementsByTagName('head')[0]);
+
+// Add the background image to the container
+Highcharts.wrap(Highcharts.Chart.prototype, 'getContainer', function (proceed) {
+	proceed.call(this);
+	this.container.style.background = 'url(http://www.highcharts.com/samples/graphics/sand.png)';
+});
+
+
+Highcharts.theme = {
+	colors: ["#f45b5b", "#8085e9", "#8d4654", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: null,
+		style: {
+			fontFamily: "Signika, serif"
+		}
+	},
+	title: {
+		style: {
+			color: 'black',
+			fontSize: '16px',
+			fontWeight: 'bold'
+		}
+	},
+	subtitle: {
+		style: {
+			color: 'black'
+		}
+	},
+	tooltip: {
+		borderWidth: 0
+	},
+	legend: {
+		itemStyle: {
+			fontWeight: 'bold',
+			fontSize: '13px'
+		}
+	},
+	xAxis: {
+		labels: {
+			style: {
+				color: '#6e6e70'
+			}
+		}
+	},
+	yAxis: {
+		labels: {
+			style: {
+				color: '#6e6e70'
+			}
+		}
+	},
+	plotOptions: {
+		series: {
+			shadow: true
+		},
+		candlestick: {
+			lineColor: '#404048'
+		},
+		map: {
+			shadow: false
+		}
+	},
+
+	// Highstock specific
+	navigator: {
+		xAxis: {
+			gridLineColor: '#D0D0D8'
+		}
+	},
+	rangeSelector: {
+		buttonTheme: {
+			fill: 'white',
+			stroke: '#C0C0C8',
+			'stroke-width': 1,
+			states: {
+				select: {
+					fill: '#D0D0D8'
+				}
+			}
+		}
+	},
+	scrollbar: {
+		trackBorderColor: '#C0C0C8'
+	},
+
+	// General
+	background2: '#E0E0E8'
+	
+};
+
+// Apply the theme
+Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/skies.js b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/skies.js
new file mode 100644
index 0000000..d58b1f2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/highcharts/themes/skies.js
@@ -0,0 +1,89 @@
+/**
+ * Skies theme for Highcharts JS
+ * @author Torstein Honsi
+ */
+
+Highcharts.theme = {
+	colors: ["#514F78", "#42A07B", "#9B5E4A", "#72727F", "#1F949A", "#82914E", "#86777F", "#42A07B"],
+	chart: {
+		className: 'skies',
+		borderWidth: 0,
+		plotShadow: true,
+		plotBackgroundImage: 'http://www.highcharts.com/demo/gfx/skies.jpg',
+		plotBackgroundColor: {
+			linearGradient: [0, 0, 250, 500],
+			stops: [
+				[0, 'rgba(255, 255, 255, 1)'],
+				[1, 'rgba(255, 255, 255, 0)']
+			]
+		},
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#3E576F',
+			font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#6D869F',
+			font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineWidth: 0,
+		lineColor: '#C0D0E0',
+		tickColor: '#C0D0E0',
+		labels: {
+			style: {
+				color: '#666',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#666',
+				font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	yAxis: {
+		alternateGridColor: 'rgba(255, 255, 255, .5)',
+		lineColor: '#C0D0E0',
+		tickColor: '#C0D0E0',
+		tickWidth: 1,
+		labels: {
+			style: {
+				color: '#666',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#666',
+				font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: '#3E576F'
+		},
+		itemHoverStyle: {
+			color: 'black'
+		},
+		itemHiddenStyle: {
+			color: 'silver'
+		}
+	},
+	labels: {
+		style: {
+			color: '#3E576F'
+		}
+	}
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/iCheck/icheck.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/iCheck/icheck.min.js
new file mode 100644
index 0000000..9b826fb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/iCheck/icheck.min.js
@@ -0,0 +1,11 @@
+/*! iCheck v1.0.2 by Damir Sultanov, http://git.io/arlzeA, MIT Licensed */
+(function(f){function A(a,b,d){var c=a[0],g=/er/.test(d)?_indeterminate:/bl/.test(d)?n:k,e=d==_update?{checked:c[k],disabled:c[n],indeterminate:"true"==a.attr(_indeterminate)||"false"==a.attr(_determinate)}:c[g];if(/^(ch|di|in)/.test(d)&&!e)x(a,g);else if(/^(un|en|de)/.test(d)&&e)q(a,g);else if(d==_update)for(var f in e)e[f]?x(a,f,!0):q(a,f,!0);else if(!b||"toggle"==d){if(!b)a[_callback]("ifClicked");e?c[_type]!==r&&q(a,g):x(a,g)}}function x(a,b,d){var c=a[0],g=a.parent(),e=b==k,u=b==_indeterminate,
+    v=b==n,s=u?_determinate:e?y:"enabled",F=l(a,s+t(c[_type])),B=l(a,b+t(c[_type]));if(!0!==c[b]){if(!d&&b==k&&c[_type]==r&&c.name){var w=a.closest("form"),p='input[name="'+c.name+'"]',p=w.length?w.find(p):f(p);p.each(function(){this!==c&&f(this).data(m)&&q(f(this),b)})}u?(c[b]=!0,c[k]&&q(a,k,"force")):(d||(c[b]=!0),e&&c[_indeterminate]&&q(a,_indeterminate,!1));D(a,e,b,d)}c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"default");g[_add](B||l(a,b)||"");g.attr("role")&&!u&&g.attr("aria-"+(v?n:k),"true");
+    g[_remove](F||l(a,s)||"")}function q(a,b,d){var c=a[0],g=a.parent(),e=b==k,f=b==_indeterminate,m=b==n,s=f?_determinate:e?y:"enabled",q=l(a,s+t(c[_type])),r=l(a,b+t(c[_type]));if(!1!==c[b]){if(f||!d||"force"==d)c[b]=!1;D(a,e,s,d)}!c[n]&&l(a,_cursor,!0)&&g.find("."+C).css(_cursor,"pointer");g[_remove](r||l(a,b)||"");g.attr("role")&&!f&&g.attr("aria-"+(m?n:k),"false");g[_add](q||l(a,s)||"")}function E(a,b){if(a.data(m)){a.parent().html(a.attr("style",a.data(m).s||""));if(b)a[_callback](b);a.off(".i").unwrap();
+    f(_label+'[for="'+a[0].id+'"]').add(a.closest(_label)).off(".i")}}function l(a,b,f){if(a.data(m))return a.data(m).o[b+(f?"":"Class")]}function t(a){return a.charAt(0).toUpperCase()+a.slice(1)}function D(a,b,f,c){if(!c){if(b)a[_callback]("ifToggled");a[_callback]("ifChanged")[_callback]("if"+t(f))}}var m="iCheck",C=m+"-helper",r="radio",k="checked",y="un"+k,n="disabled";_determinate="determinate";_indeterminate="in"+_determinate;_update="update";_type="type";_click="click";_touch="touchbegin.i touchend.i";
+    _add="addClass";_remove="removeClass";_callback="trigger";_label="label";_cursor="cursor";_mobile=/ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);f.fn[m]=function(a,b){var d='input[type="checkbox"], input[type="'+r+'"]',c=f(),g=function(a){a.each(function(){var a=f(this);c=a.is(d)?c.add(a):c.add(a.find(d))})};if(/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(a))return a=a.toLowerCase(),g(this),c.each(function(){var c=
+        f(this);"destroy"==a?E(c,"ifDestroyed"):A(c,!0,a);f.isFunction(b)&&b()});if("object"!=typeof a&&a)return this;var e=f.extend({checkedClass:k,disabledClass:n,indeterminateClass:_indeterminate,labelHover:!0},a),l=e.handle,v=e.hoverClass||"hover",s=e.focusClass||"focus",t=e.activeClass||"active",B=!!e.labelHover,w=e.labelHoverClass||"hover",p=(""+e.increaseArea).replace("%","")|0;if("checkbox"==l||l==r)d='input[type="'+l+'"]';-50>p&&(p=-50);g(this);return c.each(function(){var a=f(this);E(a);var c=this,
+        b=c.id,g=-p+"%",d=100+2*p+"%",d={position:"absolute",top:g,left:g,display:"block",width:d,height:d,margin:0,padding:0,background:"#fff",border:0,opacity:0},g=_mobile?{position:"absolute",visibility:"hidden"}:p?d:{position:"absolute",opacity:0},l="checkbox"==c[_type]?e.checkboxClass||"icheckbox":e.radioClass||"i"+r,z=f(_label+'[for="'+b+'"]').add(a.closest(_label)),u=!!e.aria,y=m+"-"+Math.random().toString(36).substr(2,6),h='<div class="'+l+'" '+(u?'role="'+c[_type]+'" ':"");u&&z.each(function(){h+=
+        'aria-labelledby="';this.id?h+=this.id:(this.id=y,h+=y);h+='"'});h=a.wrap(h+"/>")[_callback]("ifCreated").parent().append(e.insert);d=f('<ins class="'+C+'"/>').css(d).appendTo(h);a.data(m,{o:e,s:a.attr("style")}).css(g);e.inheritClass&&h[_add](c.className||"");e.inheritID&&b&&h.attr("id",m+"-"+b);"static"==h.css("position")&&h.css("position","relative");A(a,!0,_update);if(z.length)z.on(_click+".i mouseover.i mouseout.i "+_touch,function(b){var d=b[_type],e=f(this);if(!c[n]){if(d==_click){if(f(b.target).is("a"))return;
+        A(a,!1,!0)}else B&&(/ut|nd/.test(d)?(h[_remove](v),e[_remove](w)):(h[_add](v),e[_add](w)));if(_mobile)b.stopPropagation();else return!1}});a.on(_click+".i focus.i blur.i keyup.i keydown.i keypress.i",function(b){var d=b[_type];b=b.keyCode;if(d==_click)return!1;if("keydown"==d&&32==b)return c[_type]==r&&c[k]||(c[k]?q(a,k):x(a,k)),!1;if("keyup"==d&&c[_type]==r)!c[k]&&x(a,k);else if(/us|ur/.test(d))h["blur"==d?_remove:_add](s)});d.on(_click+" mousedown mouseup mouseover mouseout "+_touch,function(b){var d=
+        b[_type],e=/wn|up/.test(d)?t:v;if(!c[n]){if(d==_click)A(a,!1,!0);else{if(/wn|er|in/.test(d))h[_add](e);else h[_remove](e+" "+t);if(z.length&&B&&e==v)z[/ut|nd/.test(d)?_remove:_add](w)}if(_mobile)b.stopPropagation();else return!1}})})}})(window.jQuery||window.Zepto);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/laydate/laydate.js b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/laydate.js
new file mode 100644
index 0000000..83a12cb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/laydate.js
@@ -0,0 +1,2 @@
+/*! laydate-v5.0.9 日期与时间组件 MIT License  http://www.layui.com/laydate/  By 贤心 */
+ ;!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="开始日期超出了结束日期<br>建议重新选择",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));t<n.length;t++)this.push(n[t])};C.prototype=[],C.prototype.constructor=C,w.extend=function(){var e=1,t=arguments,n=function(e,t){e=e||(t.constructor===Array?[]:{});for(var a in t)e[a]=t[a]&&t[a].constructor===Object?n(e[a],t[a]):t[a];return e};for(t[0]="object"==typeof t[0]?t[0]:{};e<t.length;e++)"object"==typeof t[e]&&n(t[0],t[e]);return t[0]},w.ie=function(){var e=navigator.userAgent.toLowerCase();return!!(window.ActiveXObject||"ActiveXObject"in window)&&((e.match(/msie\s(\d+)/)||[])[1]||"11")}(),w.stope=function(e){e=e||window.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},w.each=function(e,t){var n,a=this;if("function"!=typeof t)return a;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;n<e.length&&!t.call(e[n],n,e[n]);n++);return a},w.digit=function(e,t,n){var a="";e=String(e),t=t||2;for(var i=e.length;i<t;i++)a+="0";return e<Math.pow(10,t)?a+(0|e):e},w.elem=function(e,t){var n=document.createElement(e);return w.each(t||{},function(e,t){n.setAttribute(e,t)}),n},C.addStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){new RegExp("\\b"+n+"\\b").test(e)||(e=e+" "+n)}),e.replace(/^\s|\s$/,"")},C.removeStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){var a=new RegExp("\\b"+n+"\\b");a.test(e)&&(e=e.replace(a,""))}),e.replace(/\s+/," ").replace(/^\s|\s$/,"")},C.prototype.find=function(e){var t=this,n=0,a=[],i="object"==typeof e;return this.each(function(r,o){for(var s=i?[e]:o.querySelectorAll(e||null);n<s.length;n++)a.push(s[n]);t.shift()}),i||(t.selector=(t.selector?t.selector+" ":"")+e),w.each(a,function(e,n){t.push(n)}),t},C.prototype.each=function(e){return w.each.call(this,this,e)},C.prototype.addClass=function(e,t){return this.each(function(n,a){a.className=C[t?"removeStr":"addStr"](a.className,e)})},C.prototype.removeClass=function(e){return this.addClass(e,!0)},C.prototype.hasClass=function(e){var t=!1;return this.each(function(n,a){new RegExp("\\b"+e+"\\b").test(a.className)&&(t=!0)}),t},C.prototype.attr=function(e,t){var n=this;return void 0===t?function(){if(n.length>0)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,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?r<s?o+r*s:r:o);a=[l.getFullYear(),l.getMonth()+1,l.getDate()],r<s||(i=[l.getHours(),l.getMinutes(),l.getSeconds()])}else a=(t[n].match(/\d+-\d+-\d+/)||[""])[0].split("-"),i=(t[n].match(/\d+:\d+:\d+/)||[""])[0].split(":");t[n]={year:0|a[0]||(new Date).getFullYear(),month:a[1]?(0|a[1])-1:(new Date).getMonth(),date:0|a[2]||(new Date).getDate(),hours:0|i[0],minutes:0|i[1],seconds:0|i[2]}}),e.elemID="layui-laydate"+t.elem.attr("lay-key"),(t.show||a)&&e.render(),a||e.events(),t.value&&(t.value.constructor===Date?e.setValue(e.parse(0,e.systemDate(t.value))):e.setValue(t.value)))},T.prototype.render=function(){var e=this,t=e.config,n=e.lang(),a="static"===t.position,i=e.elem=w.elem("div",{id:e.elemID,"class":["layui-laydate",t.range?" layui-laydate-range":"",a?" "+c:"",t.theme&&"default"!==t.theme&&!/^#/.test(t.theme)?" laydate-theme-"+t.theme:""].join("")}),r=e.elemMain=[],o=e.elemHeader=[],s=e.elemCont=[],l=e.table=[],d=e.footer=w.elem("div",{"class":p});if(t.zIndex&&(i.style.zIndex=t.zIndex),w.each(new Array(2),function(e){if(!t.range&&e>0)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="&#xe65a;",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="&#xe603;",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="&#xe602;",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="&#xe65b;",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('<span lay-type="datetime" class="laydate-btns-time">'+n.timeTips+"</span>"),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('<span lay-type="'+r+'" class="laydate-btns-'+r+'">'+o+"</span>"))}),e.push('<div class="laydate-footer-btns">'+i.join("")+"</div>"),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<l.length&&(a=!0),/yyyy|y/.test(l)?(c<d[0]&&(c=d[0],a=!0),e.year=c):/MM|M/.test(l)?(c<1&&(c=1,a=!0),e.month=c-1):/dd|d/.test(l)?(c<1&&(c=1,a=!0),e.date=c):/HH|H/.test(l)?(c<1&&(c=0,a=!0),e.hours=c,r.range&&(i[o[n]].hours=c)):/mm|m/.test(l)?(c<1&&(c=0,a=!0),e.minutes=c,r.range&&(i[o[n]].minutes=c)):/ss|s/.test(l)&&(c<1&&(c=0,a=!0),e.seconds=c,r.range&&(i[o[n]].seconds=c))}),c(e)};return"limit"===e?(c(o),i):(l=l||r.value,"string"==typeof l&&(l=l.replace(/\s+/g," ").replace(/^\s|\s$/g,"")),i.startState&&!i.endState&&(delete i.startState,i.endState=!0),"string"==typeof l&&l?i.EXP_IF.test(l)?r.range?(l=l.split(" "+r.range+" "),i.startDate=i.startDate||i.systemDate(),i.endDate=i.endDate||i.systemDate(),r.dateTime=w.extend({},i.startDate),w.each([i.startDate,i.endDate],function(e,t){m(t,l[e],e)})):m(o,l):(i.hint("日期格式不合法<br>必须遵循下述格式:<br>"+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"<br>已为你重置"),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('<span class="laydate-day-mark">'+n+"</span>"),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.now<l.min||l.now>l.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.year<d[0]&&(l.year=d[0],r.hint("最低只能支持到公元"+d[0]+"年")),l.year>d[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?(c=a-t+e,n.addClass("laydate-day-prev"),d=r.getAsYM(l.year,l.month,"sub")):e>=t&&e<i+t?(c=e-t,s.range||c+1===l.date&&n.addClass(o)):(c=e-i-t,n.addClass("laydate-day-next"),d=r.getAsYM(l.year,l.month)),d[1]++,d[2]=c+1,n.attr("lay-ymd",d.join("-")).html(d[2]),r.mark(n,d).limit(n,{year:d[0],month:d[1]-1,date:d[2]},e)}),w(f[0]).attr("lay-ym",l.year+"-"+(l.month+1)),w(f[1]).attr("lay-ym",l.year+"-"+(l.month+1)),"cn"===s.lang?(w(f[0]).attr("lay-type","year").html(l.year+"年"),w(f[1]).attr("lay-type","month").html(l.month+1+"月")):(w(f[0]).attr("lay-type","month").html(m.month[l.month]),w(f[1]).attr("lay-type","year").html(l.year)),u&&(s.range&&(e?r.endDate=r.endDate||{year:l.year+("year"===s.type?1:0),month:l.month+("month"===s.type?0:-1)}:r.startDate=r.startDate||{year:l.year,month:l.month},e&&(r.listYM=[[r.startDate.year,r.startDate.month+1],[r.endDate.year,r.endDate.month+1]],r.list(s.type,0).list(s.type,1),"time"===s.type?r.setBtnStatus("时间",w.extend({},r.systemDate(),r.startTime),w.extend({},r.systemDate(),r.endTime)):r.setBtnStatus(!0))),s.range||(r.listYM=[[l.year,l.month+1]],r.list(s.type,0))),s.range&&!e){var p=r.getAsYM(l.year,l.month);r.calendar(w.extend({},l,{year:p[0],month:p[1]}))}return s.range||r.limit(w(r.footer).find(g),null,0,["hours","minutes","seconds"]),s.range&&e&&!u&&r.stampRange(),r},T.prototype.list=function(e,t){var n=this,a=n.config,i=a.dateTime,r=n.lang(),l=a.range&&"date"!==a.type&&"datetime"!==a.type,d=w.elem("ul",{"class":m+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[e]}),c=n.elemHeader[t],u=w(c[2]).find("span"),h=n.elemCont[t||0],y=w(h).find("."+m)[0],f="cn"===a.lang,p=f?"年":"",T=n.listYM[t]||{},C=["hours","minutes","seconds"],x=["startTime","endTime"][t];if(T[0]<1&&(T[0]=1),"year"===e){var M,b=M=T[0]-7;b<1&&(b=M=1),w.each(new Array(15),function(e){var i=w.elem("li",{"lay-ym":M}),r={year:M};M==T[0]&&w(i).addClass(o),i.innerHTML=M+p,d.appendChild(i),M<n.firstDate.year?(r.month=a.min.month,r.date=a.min.date):M>=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.min.date: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=["<p>"+r.time[e]+"</p><ol>"];w.each(new Array(t),function(t){i.push("<li"+(n[x][C[e]]===t?' class="'+o+'"':"")+">"+w.digit(t,2)+"</li>")}),a.innerHTML=i.join("")+"</ol>",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&&s<t&&w(i).addClass(u)})},T.prototype.done=function(e,t){var n=this,a=n.config,i=w.extend({},n.startDate?w.extend(n.startDate,n.startTime):a.dateTime),r=w.extend({},w.extend(n.endDate,n.endTime));return w.each([i,r],function(e,t){"month"in t&&w.extend(t,{month:t.month+1})}),e=e||[n.parse(),i,r],"function"==typeof a[t||"done"]&&a[t||"done"].apply(a,e),n},T.prototype.choose=function(e){var t=this,n=t.config,a=n.dateTime,i=w(t.elem).find("td"),r=e.attr("lay-ymd").split("-"),l=function(e){new Date;e&&w.extend(a,r),n.range&&(t.startDate?w.extend(t.startDate,r):t.startDate=w.extend({},r,t.startTime),t.startYMD=r)};if(r={year:0|r[0],month:(0|r[1])-1,date:0|r[2]},!e.hasClass(s))if(n.range){if(w.each(["startTime","endTime"],function(e,n){t[n]=t[n]||{hours:0,minutes:0,seconds:0}}),t.endState)l(),delete t.endState,delete t.endDate,t.startState=!0,i.removeClass(o+" "+u),e.addClass(o);else if(t.startState){if(e.addClass(o),t.endDate?w.extend(t.endDate,r):t.endDate=w.extend({},r,t.endTime),t.newDate(r).getTime()<t.newDate(t.startYMD).getTime()){var d=w.extend({},t.endDate,{hours:t.startDate.hours,minutes:t.startDate.minutes,seconds:t.startDate.seconds});w.extend(t.endDate,t.startDate,{hours:t.endDate.hours,minutes:t.endDate.minutes,seconds:t.endDate.seconds}),t.startDate=d}n.showBottom||t.done(),t.stampRange(),t.endState=!0,t.done(null,"change")}else e.addClass(o),l(),t.startState=!0;w(t.footer).find(g)[t.endDate?"removeClass":"addClass"](s)}else"static"===n.position?(l(!0),t.calendar().done().done(null,"change")):"date"===n.type?(l(!0),t.setValue(t.parse()).remove().done()):"datetime"===n.type&&(l(!0),t.calendar().done(null,"change"))},T.prototype.tool=function(e,t){var n=this,a=n.config,i=a.dateTime,r="static"===a.position,o={datetime:function(){w(e).hasClass(s)||(n.list("time",0),a.range&&n.list("time",1),w(e).attr("lay-type","date").html(n.lang().dateTips))},date:function(){n.closeList(),w(e).attr("lay-type","datetime").html(n.lang().timeTips)},clear:function(){n.setValue("").remove(),r&&(w.extend(i,n.firstDate),n.calendar()),a.range&&(delete n.startState,delete n.endState,delete n.endDate,delete n.startTime,delete n.endTime),n.done(["",{},{}])},now:function(){var e=new Date;w.extend(i,n.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),n.setValue(n.parse()).remove(),r&&n.calendar(),n.done()},confirm:function(){if(a.range){if(!n.endDate)return n.hint("请先选择日期范围");if(w(e).hasClass(s))return n.hint("time"===a.type?l.replace(/日期/g,"时间"):l)}else if(w(e).hasClass(s))return n.hint("不在有效日期或时间范围内");n.done(),n.setValue(n.parse()).remove()}};o[t]&&o[t]()},T.prototype.change=function(e){var t=this,n=t.config,a=n.dateTime,i=n.range&&("year"===n.type||"month"===n.type),r=t.elemCont[e||0],o=t.listYM[e],s=function(s){var l=["startDate","endDate"][e],d=w(r).find(".laydate-year-list")[0],c=w(r).find(".laydate-month-list")[0];return d&&(o[0]=s?o[0]-15:o[0]+15,t.list("year",e)),c&&(s?o[0]--:o[0]++,t.list("month",e)),(d||c)&&(w.extend(a,{year:o[0]}),i&&(t[l].year=o[0]),n.range||t.done(null,"change"),t.setBtnStatus(),n.range||t.limit(w(t.footer).find(g),{year:o[0]})),d||c};return{prevYear:function(){s("sub")||(a.year--,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))},prevMonth:function(){var e=t.getAsYM(a.year,a.month,"sub");w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextMonth:function(){var e=t.getAsYM(a.year,a.month);w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextYear:function(){s()||(a.year++,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))}}},T.prototype.changeEvent=function(){var e=this;e.config;w(e.elem).on("click",function(e){w.stope(e)}),w.each(e.elemHeader,function(t,n){w(n[0]).on("click",function(n){e.change(t).prevYear()}),w(n[1]).on("click",function(n){e.change(t).prevMonth()}),w(n[2]).find("span").on("click",function(n){var a=w(this),i=a.attr("lay-ym"),r=a.attr("lay-type");i&&(i=i.split("-"),e.listYM[t]=[0|i[0],0|i[1]],e.list(r,t),w(e.footer).find(D).addClass(s))}),w(n[3]).on("click",function(n){e.change(t).nextMonth()}),w(n[4]).on("click",function(n){e.change(t).nextYear()})}),w.each(e.table,function(t,n){var a=w(n).find("td");a.on("click",function(){e.choose(w(this))})}),w(e.footer).find("span").on("click",function(){var t=w(this).attr("lay-type");e.tool(this,t)})},T.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())},T.prototype.events=function(){var e=this,t=e.config,n=function(n,a){n.on(t.trigger,function(){a&&(e.bindElem=this),e.render()})};t.elem[0]&&!t.elem[0].eventHandler&&(n(t.elem,"bind"),n(t.eventElem),w(document).on("click",function(n){n.target!==t.elem[0]&&n.target!==t.eventElem[0]&&n.target!==w(t.closeStop)[0]&&e.remove()}).on("keydown",function(t){13===t.keyCode&&w("#"+e.elemID)[0]&&e.elemID===T.thisElem&&(t.preventDefault(),w(e.footer).find(g)[0].click())}),w(window).on("resize",function(){return!(!e.elem||!w(r)[0])&&void e.position()}),t.elem[0].eventHandler=!0)},n.render=function(e){var t=new T(e);return a.call(t)},n.getEndDate=function(e,t){var n=new Date;return n.setFullYear(t||n.getFullYear(),e||n.getMonth()+1,1),new Date(n.getTime()-864e5).getDate()},window.lay=window.lay||w,e?(n.ready(),layui.define(function(e){n.path=layui.cache.dir,e(i,n)})):"function"==typeof define&&define.amd?define(function(){return n}):function(){n.ready(),window.laydate=n}()}();
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.eot b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.eot
new file mode 100644
index 0000000..c861caa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.eot
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.svg b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.svg
new file mode 100644
index 0000000..1e04218
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<!--
+2013-9-30: Created.
+-->
+<svg>
+<metadata>
+Created by iconfont
+</metadata>
+<defs>
+
+<font id="laydate-icon" horiz-adv-x="1024" >
+  <font-face
+    font-family="laydate-icon"
+    font-weight="500"
+    font-stretch="normal"
+    units-per-em="1024"
+    ascent="896"
+    descent="-128"
+  />
+    <missing-glyph />
+    
+    <glyph glyph-name="x" unicode="x" horiz-adv-x="1001"
+d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5
+t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5
+t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" />
+    
+
+    
+    <glyph glyph-name="youyou" unicode="&#58882;" d="M283.648 721.918976 340.873216 780.926976 740.352 383.997952 340.876288-12.925952 283.648 46.077952 619.52 383.997952Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="zuozuo" unicode="&#58883;" d="M740.352 721.918976 683.126784 780.926976 283.648 383.997952 683.123712-12.925952 740.352 46.077952 404.48 383.997952Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="xiayiye" unicode="&#58970;" d="M62.573 384.103l423.401 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.751-18.976-68.727 0l-39.753 39.753 0.269 0.246-385.655 385.661zM451.365 384.103l423.407 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.757-18.977-68.727 0l-39.762 39.754 0.273 0.249-385.662 385.661zM451.365 384.103z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="xiayiye1" unicode="&#58971;" d="M948.066926 382.958838l-411.990051-412.24426c-18.47333-18.47333-48.417689-18.47333-66.875207 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L814.691135 383.088983 467.512212 730.269123c-18.466032 18.458735-18.466032 48.405526 0 66.873991 18.468465 18.464816 48.410391 18.464816 66.872774 0l38.682336-38.682336-0.261507-0.239614 375.259894-375.265975v0.003649m-378.312834 0L157.756743-29.285422c-18.47333-18.47333-48.415256-18.47333-66.872775 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L436.369787 383.088983 89.19208 730.269123c-18.4636 18.458735-18.4636 48.405526 0 66.873991 18.470898 18.464816 48.415256 18.464816 66.872774 0l38.692067-38.682336-0.266372-0.239614 375.267191-375.265975-0.004865 0.003649m0 0z"  horiz-adv-x="1024" />
+
+    
+
+
+  </font>
+</defs></svg>
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.ttf b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.ttf
new file mode 100644
index 0000000..0bd6c4a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.ttf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.woff b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.woff
new file mode 100644
index 0000000..bfe5599
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/font/iconfont.woff
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/laydate.css b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/laydate.css
new file mode 100644
index 0000000..c7e1508
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/laydate/theme/default/laydate.css
@@ -0,0 +1,2 @@
+/*! laydate-v5.0.9 日期与时间组件 MIT License  http://www.layui.com/laydate/  By 贤心 */
+.laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}@font-face{font-family:laydate-icon;src:url(font/iconfont.eot);src:url(font/iconfont.eot#iefix) format('embedded-opentype'),url(font/iconfont.svg#iconfont) format('svg'),url(font/iconfont.woff) format('woff'),url(font/iconfont.ttf) format('truetype')}.laydate-icon{font-family:laydate-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/extend/layer.ext.js b/management/guns-admin/src/main/webapp/static/js/plugins/layer/extend/layer.ext.js
new file mode 100644
index 0000000..ec9cf15
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/extend/layer.ext.js
@@ -0,0 +1,2 @@
+/*! layer弹层组件拓展类 */
+;!function(){layer.use("skin/layer.ext.css",function(){layer.layui_layer_extendlayerextjs=!0});var a=layer.cache||{},b=function(b){return a.skin?" "+a.skin+" "+a.skin+"-"+b:""};layer.prompt=function(a,c){a=a||{},"function"==typeof a&&(c=a);var d,e=2==a.formType?'<textarea class="layui-layer-input">'+(a.value||"")+"</textarea>":function(){return'<input type="'+(1==a.formType?"password":"text")+'" class="layui-layer-input" value="'+(a.value||"")+'">'}();return layer.open($.extend({btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],content:e,skin:"layui-layer-prompt"+b("prompt"),success:function(a){d=a.find(".layui-layer-input"),d.focus()},yes:function(b){var e=d.val();""===e?d.focus():e.length>(a.maxlength||500)?layer.tips("&#x6700;&#x591A;&#x8F93;&#x5165;"+(a.maxlength||500)+"&#x4E2A;&#x5B57;&#x6570;",d,{tips:1}):c&&c(e,b,d)}},a))},layer.tab=function(a){a=a||{};var c=a.tab||{};return layer.open($.extend({type:1,skin:"layui-layer-tab"+b("tab"),title:function(){var a=c.length,b=1,d="";if(a>0)for(d='<span class="layui-layer-tabnow">'+c[0].title+"</span>";a>b;b++)d+="<span>"+c[b].title+"</span>";return d}(),content:'<ul class="layui-layer-tabmain">'+function(){var a=c.length,b=1,d="";if(a>0)for(d='<li class="layui-layer-tabli xubox_tab_layer">'+(c[0].content||"no content")+"</li>";a>b;b++)d+='<li class="layui-layer-tabli">'+(c[b].content||"no  content")+"</li>";return d}()+"</ul>",success:function(a){var b=a.find(".layui-layer-title").children(),c=a.find(".layui-layer-tabmain").children();b.on("mousedown",function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0;var b=$(this),d=b.index();b.addClass("layui-layer-tabnow").siblings().removeClass("layui-layer-tabnow"),c.eq(d).show().siblings().hide()})}},a))},layer.photos=function(a,c,d){function e(a,b,c){var d=new Image;d.onload=function(){d.onload=null,b(d)},d.onerror=function(a){d.onerror=null,c(a)},d.src=a}var f={};if(a=a||{},a.photos){var g=a.photos.constructor===Object,h=g?a.photos:{},i=h.data||[],j=h.start||0;if(f.imgIndex=j+1,g){if(0===i.length)return void layer.msg("&#x6CA1;&#x6709;&#x56FE;&#x7247;")}else{var k=$(a.photos),l=k.find(a.img||"img");if(0===l.length)return;if(c||k.find(h.img||"img").each(function(b){var c=$(this);i.push({alt:c.attr("alt"),pid:c.attr("layer-pid"),src:c.attr("layer-src")||c.attr("src"),thumb:c.attr("src")}),c.on("click",function(){layer.photos($.extend(a,{photos:{start:b,data:i,tab:a.tab},full:a.full}),!0)})}),!c)return}f.imgprev=function(a){f.imgIndex--,f.imgIndex<1&&(f.imgIndex=i.length),f.tabimg(a)},f.imgnext=function(a,b){f.imgIndex++,f.imgIndex>i.length&&(f.imgIndex=1,b)||f.tabimg(a)},f.keyup=function(a){if(!f.end){var b=a.keyCode;a.preventDefault(),37===b?f.imgprev(!0):39===b?f.imgnext(!0):27===b&&layer.close(f.index)}},f.tabimg=function(b){i.length<=1||(h.start=f.imgIndex-1,layer.close(f.index),layer.photos(a,!0,b))},f.event=function(){f.bigimg.hover(function(){f.imgsee.show()},function(){f.imgsee.hide()}),f.bigimg.find(".layui-layer-imgprev").on("click",function(a){a.preventDefault(),f.imgprev()}),f.bigimg.find(".layui-layer-imgnext").on("click",function(a){a.preventDefault(),f.imgnext()}),$(document).on("keyup",f.keyup)},f.loadi=layer.load(1,{shade:"shade"in a?!1:.9,scrollbar:!1}),e(i[j].src,function(c){layer.close(f.loadi),f.index=layer.open($.extend({type:1,area:function(){var b=[c.width,c.height],d=[$(window).width()-100,$(window).height()-100];return!a.full&&b[0]>d[0]&&(b[0]=d[0],b[1]=b[0]*d[1]/b[0]),[b[0]+"px",b[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,shift:5*Math.random()|0,skin:"layui-layer-photos"+b("photos"),content:'<div class="layui-layer-phimg"><img src="'+i[j].src+'" alt="'+(i[j].alt||"")+'" layer-pid="'+i[j].pid+'"><div class="layui-layer-imgsee">'+(i.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(d?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(i[j].alt||"")+"</a><em>"+f.imgIndex+"/"+i.length+"</em></span></div></div></div>",success:function(b,c){f.bigimg=b.find(".layui-layer-phimg"),f.imgsee=b.find(".layui-layer-imguide,.layui-layer-imgbar"),f.event(b),a.tab&&a.tab(i[j],b)},end:function(){f.end=!0,$(document).off("keyup",f.keyup)}},a))},function(){layer.close(f.loadi),layer.msg("&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;",{time:3e4,btn:["下一张","不看了"],yes:function(){i.length>1&&f.imgnext(!0,!0)}})})}}}();
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/laydate.js b/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/laydate.js
new file mode 100644
index 0000000..2da091b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/laydate.js
@@ -0,0 +1,11 @@
+/**
+
+ @Name : layDate v1.1 日期控件
+ @Author: 贤心
+ @Date: 2014-06-25
+ @QQ群:176047195
+ @Site:http://sentsin.com/layui/laydate
+
+ */
+
+;!function(a){var b={path:"",defSkin:"default",format:"YYYY-MM-DD",min:"1900-01-01 00:00:00",max:"2099-12-31 23:59:59",isv:!1},c={},d=document,e="createElement",f="getElementById",g="getElementsByTagName",h=["laydate_box","laydate_void","laydate_click","LayDateSkin","skins/","/laydate.css"];a.laydate=function(b){b=b||{};try{h.event=a.event?a.event:laydate.caller.arguments[0]}catch(d){}return c.run(b),laydate},laydate.v="1.1",c.getPath=function(){var a=document.scripts,c=a[a.length-1].src;return b.path?b.path:c.substring(0,c.lastIndexOf("/")+1)}(),c.use=function(a,b){var f=d[e]("link");f.type="text/css",f.rel="stylesheet",f.href=c.getPath+a+h[5],b&&(f.id=b),d[g]("head")[0].appendChild(f),f=null},c.trim=function(a){return a=a||"",a.replace(/^\s|\s$/g,"").replace(/\s+/g," ")},c.digit=function(a){return 10>a?"0"+(0|a):a},c.stopmp=function(b){return b=b||a.event,b.stopPropagation?b.stopPropagation():b.cancelBubble=!0,this},c.each=function(a,b){for(var c=0,d=a.length;d>c&&b(c,a[c])!==!1;c++);},c.hasClass=function(a,b){return a=a||{},new RegExp("\\b"+b+"\\b").test(a.className)},c.addClass=function(a,b){return a=a||{},c.hasClass(a,b)||(a.className+=" "+b),a.className=c.trim(a.className),this},c.removeClass=function(a,b){if(a=a||{},c.hasClass(a,b)){var d=new RegExp("\\b"+b+"\\b");a.className=a.className.replace(d,"")}return this},c.removeCssAttr=function(a,b){var c=a.style;c.removeProperty?c.removeProperty(b):c.removeAttribute(b)},c.shde=function(a,b){a.style.display=b?"none":"block"},c.query=function(a){var e,b,h,i,j;return a=c.trim(a).split(" "),b=d[f](a[0].substr(1)),b?a[1]?/^\./.test(a[1])?(i=a[1].substr(1),j=new RegExp("\\b"+i+"\\b"),e=[],h=d.getElementsByClassName?b.getElementsByClassName(i):b[g]("*"),c.each(h,function(a,b){j.test(b.className)&&e.push(b)}),e[0]?e:""):(e=b[g](a[1]),e[0]?b[g](a[1]):""):b:void 0},c.on=function(b,d,e){return b.attachEvent?b.attachEvent("on"+d,function(){e.call(b,a.even)}):b.addEventListener(d,e,!1),c},c.stopMosup=function(a,b){"mouseup"!==a&&c.on(b,"mouseup",function(a){c.stopmp(a)})},c.run=function(a){var d,e,g,b=c.query,f=h.event;try{g=f.target||f.srcElement||{}}catch(i){g={}}if(d=a.elem?b(a.elem):g,f&&g.tagName){if(!d||d===c.elem)return;c.stopMosup(f.type,d),c.stopmp(f),c.view(d,a),c.reshow()}else e=a.event||"click",c.each((0|d.length)>0?d:[d],function(b,d){c.stopMosup(e,d),c.on(d,e,function(b){c.stopmp(b),d!==c.elem&&(c.view(d,a),c.reshow())})})},c.scroll=function(a){return a=a?"scrollLeft":"scrollTop",d.body[a]|d.documentElement[a]},c.winarea=function(a){return document.documentElement[a?"clientWidth":"clientHeight"]},c.isleap=function(a){return 0===a%4&&0!==a%100||0===a%400},c.checkVoid=function(a,b,d){var e=[];return a=0|a,b=0|b,d=0|d,a<c.mins[0]?e=["y"]:a>c.maxs[0]?e=["y",1]:a>=c.mins[0]&&a<=c.maxs[0]&&(a==c.mins[0]&&(b<c.mins[1]?e=["m"]:b==c.mins[1]&&d<c.mins[2]&&(e=["d"])),a==c.maxs[0]&&(b>c.maxs[1]?e=["m",1]:b==c.maxs[1]&&d>c.maxs[2]&&(e=["d",1]))),e},c.timeVoid=function(a,b){if(c.ymd[1]+1==c.mins[1]&&c.ymd[2]==c.mins[2]){if(0===b&&a<c.mins[3])return 1;if(1===b&&a<c.mins[4])return 1;if(2===b&&a<c.mins[5])return 1}else if(c.ymd[1]+1==c.maxs[1]&&c.ymd[2]==c.maxs[2]){if(0===b&&a>c.maxs[3])return 1;if(1===b&&a>c.maxs[4])return 1;if(2===b&&a>c.maxs[5])return 1}return a>(b?59:23)?1:void 0},c.check=function(){var a=c.options.format.replace(/YYYY|MM|DD|hh|mm|ss/g,"\\d+\\").replace(/\\$/g,""),b=new RegExp(a),d=c.elem[h.elemv],e=d.match(/\d+/g)||[],f=c.checkVoid(e[0],e[1],e[2]);if(""!==d.replace(/\s/g,"")){if(!b.test(d))return c.elem[h.elemv]="",c.msg("日期不符合格式,请重新选择。"),1;if(f[0])return c.elem[h.elemv]="",c.msg("日期不在有效期内,请重新选择。"),1;f.value=c.elem[h.elemv].match(b).join(),e=f.value.match(/\d+/g),e[1]<1?(e[1]=1,f.auto=1):e[1]>12?(e[1]=12,f.auto=1):e[1].length<2&&(f.auto=1),e[2]<1?(e[2]=1,f.auto=1):e[2]>c.months[(0|e[1])-1]?(e[2]=31,f.auto=1):e[2].length<2&&(f.auto=1),e.length>3&&(c.timeVoid(e[3],0)&&(f.auto=1),c.timeVoid(e[4],1)&&(f.auto=1),c.timeVoid(e[5],2)&&(f.auto=1)),f.auto?c.creation([e[0],0|e[1],0|e[2]],1):f.value!==c.elem[h.elemv]&&(c.elem[h.elemv]=f.value)}},c.months=[31,null,31,30,31,30,31,31,30,31,30,31],c.viewDate=function(a,b,d){var f=(c.query,{}),g=new Date;a<(0|c.mins[0])&&(a=0|c.mins[0]),a>(0|c.maxs[0])&&(a=0|c.maxs[0]),g.setFullYear(a,b,d),f.ymd=[g.getFullYear(),g.getMonth(),g.getDate()],c.months[1]=c.isleap(f.ymd[0])?29:28,g.setFullYear(f.ymd[0],f.ymd[1],1),f.FDay=g.getDay(),f.PDay=c.months[0===b?11:b-1]-f.FDay+1,f.NDay=1,c.each(h.tds,function(a,b){var g,d=f.ymd[0],e=f.ymd[1]+1;b.className="",a<f.FDay?(b.innerHTML=g=a+f.PDay,c.addClass(b,"laydate_nothis"),1===e&&(d-=1),e=1===e?12:e-1):a>=f.FDay&&a<f.FDay+c.months[f.ymd[1]]?(b.innerHTML=g=a-f.FDay+1,a-f.FDay+1===f.ymd[2]&&(c.addClass(b,h[2]),f.thisDay=b)):(b.innerHTML=g=f.NDay++,c.addClass(b,"laydate_nothis"),12===e&&(d+=1),e=12===e?1:e+1),c.checkVoid(d,e,g)[0]&&c.addClass(b,h[1]),c.options.festival&&c.festival(b,e+"."+g),b.setAttribute("y",d),b.setAttribute("m",e),b.setAttribute("d",g),d=e=g=null}),c.valid=!c.hasClass(f.thisDay,h[1]),c.ymd=f.ymd,h.year.value=c.ymd[0]+"年",h.month.value=c.digit(c.ymd[1]+1)+"月",c.each(h.mms,function(a,b){var d=c.checkVoid(c.ymd[0],(0|b.getAttribute("m"))+1);"y"===d[0]||"m"===d[0]?c.addClass(b,h[1]):c.removeClass(b,h[1]),c.removeClass(b,h[2]),d=null}),c.addClass(h.mms[c.ymd[1]],h[2]),f.times=[0|c.inymd[3]||0,0|c.inymd[4]||0,0|c.inymd[5]||0],c.each(new Array(3),function(a){c.hmsin[a].value=c.digit(c.timeVoid(f.times[a],a)?0|c.mins[a+3]:0|f.times[a])}),c[c.valid?"removeClass":"addClass"](h.ok,h[1])},c.festival=function(a,b){var c;switch(b){case"1.1":c="元旦";break;case"3.8":c="妇女";break;case"4.5":c="清明";break;case"5.1":c="劳动";break;case"6.1":c="儿童";break;case"9.10":c="教师";break;case"10.1":c="国庆"}c&&(a.innerHTML=c),c=null},c.viewYears=function(a){var b=c.query,d="";c.each(new Array(14),function(b){d+=7===b?"<li "+(parseInt(h.year.value)===a?'class="'+h[2]+'"':"")+' y="'+a+'">'+a+"年</li>":'<li y="'+(a-7+b)+'">'+(a-7+b)+"年</li>"}),b("#laydate_ys").innerHTML=d,c.each(b("#laydate_ys li"),function(a,b){"y"===c.checkVoid(b.getAttribute("y"))[0]?c.addClass(b,h[1]):c.on(b,"click",function(a){c.stopmp(a).reshow(),c.viewDate(0|this.getAttribute("y"),c.ymd[1],c.ymd[2])})})},c.initDate=function(){var d=(c.query,new Date),e=c.elem[h.elemv].match(/\d+/g)||[];e.length<3&&(e=c.options.start.match(/\d+/g)||[],e.length<3&&(e=[d.getFullYear(),d.getMonth()+1,d.getDate()])),c.inymd=e,c.viewDate(e[0],e[1]-1,e[2])},c.iswrite=function(){var a=c.query,b={time:a("#laydate_hms")};c.shde(b.time,!c.options.istime),c.shde(h.oclear,!("isclear"in c.options?c.options.isclear:1)),c.shde(h.otoday,!("istoday"in c.options?c.options.istoday:1)),c.shde(h.ok,!("issure"in c.options?c.options.issure:1))},c.orien=function(a,b){var d,e=c.elem.getBoundingClientRect();a.style.left=e.left+(b?0:c.scroll(1))+"px",d=e.bottom+a.offsetHeight/1.5<=c.winarea()?e.bottom-1:e.top>a.offsetHeight/1.5?e.top-a.offsetHeight+1:c.winarea()-a.offsetHeight,a.style.top=d+(b?0:c.scroll())+"px"},c.follow=function(a){c.options.fixed?(a.style.position="fixed",c.orien(a,1)):(a.style.position="absolute",c.orien(a))},c.viewtb=function(){var a,b=[],f=["日","一","二","三","四","五","六"],h={},i=d[e]("table"),j=d[e]("thead");return j.appendChild(d[e]("tr")),h.creath=function(a){var b=d[e]("th");b.innerHTML=f[a],j[g]("tr")[0].appendChild(b),b=null},c.each(new Array(6),function(d){b.push([]),a=i.insertRow(0),c.each(new Array(7),function(c){b[d][c]=0,0===d&&h.creath(c),a.insertCell(c)})}),i.insertBefore(j,i.children[0]),i.id=i.className="laydate_table",a=b=null,i.outerHTML.toLowerCase()}(),c.view=function(a,f){var i,g=c.query,j={};f=f||a,c.elem=a,c.options=f,c.options.format||(c.options.format=b.format),c.options.start=c.options.start||"",c.mm=j.mm=[c.options.min||b.min,c.options.max||b.max],c.mins=j.mm[0].match(/\d+/g),c.maxs=j.mm[1].match(/\d+/g),h.elemv=/textarea|input/.test(c.elem.tagName.toLocaleLowerCase())?"value":"innerHTML",c.box?c.shde(c.box):(i=d[e]("div"),i.id=h[0],i.className=h[0],i.style.cssText="position: absolute;",i.setAttribute("name","laydate-v"+laydate.v),i.innerHTML=j.html='<div class="laydate_top"><div class="laydate_ym laydate_y" id="laydate_YY"><a class="laydate_choose laydate_chprev laydate_tab"><cite></cite></a><input id="laydate_y" readonly><label></label><a class="laydate_choose laydate_chnext laydate_tab"><cite></cite></a><div class="laydate_yms"><a class="laydate_tab laydate_chtop"><cite></cite></a><ul id="laydate_ys"></ul><a class="laydate_tab laydate_chdown"><cite></cite></a></div></div><div class="laydate_ym laydate_m" id="laydate_MM"><a class="laydate_choose laydate_chprev laydate_tab"><cite></cite></a><input id="laydate_m" readonly><label></label><a class="laydate_choose laydate_chnext laydate_tab"><cite></cite></a><div class="laydate_yms" id="laydate_ms">'+function(){var a="";return c.each(new Array(12),function(b){a+='<span m="'+b+'">'+c.digit(b+1)+"月</span>"}),a}()+"</div>"+"</div>"+"</div>"+c.viewtb+'<div class="laydate_bottom">'+'<ul id="laydate_hms">'+'<li class="laydate_sj">时间</li>'+"<li><input readonly>:</li>"+"<li><input readonly>:</li>"+"<li><input readonly></li>"+"</ul>"+'<div class="laydate_time" id="laydate_time"></div>'+'<div class="laydate_btn">'+'<a id="laydate_clear">清空</a>'+'<a id="laydate_today">今天</a>'+'<a id="laydate_ok">确认</a>'+"</div>"+(b.isv?'<a href="http://sentsin.com/layui/laydate/" class="laydate_v" target="_blank">laydate-v'+laydate.v+"</a>":"")+"</div>",d.body.appendChild(i),c.box=g("#"+h[0]),c.events(),i=null),c.follow(c.box),f.zIndex?c.box.style.zIndex=f.zIndex:c.removeCssAttr(c.box,"z-index"),c.stopMosup("click",c.box),c.initDate(),c.iswrite(),c.check()},c.reshow=function(){return c.each(c.query("#"+h[0]+" .laydate_show"),function(a,b){c.removeClass(b,"laydate_show")}),this},c.close=function(){c.reshow(),c.shde(c.query("#"+h[0]),1),c.elem=null},c.parse=function(a,d,e){return a=a.concat(d),e=e||(c.options?c.options.format:b.format),e.replace(/YYYY|MM|DD|hh|mm|ss/g,function(){return a.index=0|++a.index,c.digit(a[a.index])})},c.creation=function(a,b){var e=(c.query,c.hmsin),f=c.parse(a,[e[0].value,e[1].value,e[2].value]);c.elem[h.elemv]=f,b||(c.close(),"function"==typeof c.options.choose&&c.options.choose(f))},c.events=function(){var b=c.query,e={box:"#"+h[0]};c.addClass(d.body,"laydate_body"),h.tds=b("#laydate_table td"),h.mms=b("#laydate_ms span"),h.year=b("#laydate_y"),h.month=b("#laydate_m"),c.each(b(e.box+" .laydate_ym"),function(a,b){c.on(b,"click",function(b){c.stopmp(b).reshow(),c.addClass(this[g]("div")[0],"laydate_show"),a||(e.YY=parseInt(h.year.value),c.viewYears(e.YY))})}),c.on(b(e.box),"click",function(){c.reshow()}),e.tabYear=function(a){0===a?c.ymd[0]--:1===a?c.ymd[0]++:2===a?e.YY-=14:e.YY+=14,2>a?(c.viewDate(c.ymd[0],c.ymd[1],c.ymd[2]),c.reshow()):c.viewYears(e.YY)},c.each(b("#laydate_YY .laydate_tab"),function(a,b){c.on(b,"click",function(b){c.stopmp(b),e.tabYear(a)})}),e.tabMonth=function(a){a?(c.ymd[1]++,12===c.ymd[1]&&(c.ymd[0]++,c.ymd[1]=0)):(c.ymd[1]--,-1===c.ymd[1]&&(c.ymd[0]--,c.ymd[1]=11)),c.viewDate(c.ymd[0],c.ymd[1],c.ymd[2])},c.each(b("#laydate_MM .laydate_tab"),function(a,b){c.on(b,"click",function(b){c.stopmp(b).reshow(),e.tabMonth(a)})}),c.each(b("#laydate_ms span"),function(a,b){c.on(b,"click",function(a){c.stopmp(a).reshow(),c.hasClass(this,h[1])||c.viewDate(c.ymd[0],0|this.getAttribute("m"),c.ymd[2])})}),c.each(b("#laydate_table td"),function(a,b){c.on(b,"click",function(a){c.hasClass(this,h[1])||(c.stopmp(a),c.creation([0|this.getAttribute("y"),0|this.getAttribute("m"),0|this.getAttribute("d")]))})}),h.oclear=b("#laydate_clear"),c.on(h.oclear,"click",function(){c.elem[h.elemv]="",c.close()}),h.otoday=b("#laydate_today"),c.on(h.otoday,"click",function(){c.elem[h.elemv]=laydate.now(0,c.options.format),c.close()}),h.ok=b("#laydate_ok"),c.on(h.ok,"click",function(){c.valid&&c.creation([c.ymd[0],c.ymd[1]+1,c.ymd[2]])}),e.times=b("#laydate_time"),c.hmsin=e.hmsin=b("#laydate_hms input"),e.hmss=["小时","分钟","秒数"],e.hmsarr=[],c.msg=function(a,d){var f='<div class="laydte_hsmtex">'+(d||"提示")+"<span>×</span></div>";"string"==typeof a?(f+="<p>"+a+"</p>",c.shde(b("#"+h[0])),c.removeClass(e.times,"laydate_time1").addClass(e.times,"laydate_msg")):(e.hmsarr[a]?f=e.hmsarr[a]:(f+='<div id="laydate_hmsno" class="laydate_hmsno">',c.each(new Array(0===a?24:60),function(a){f+="<span>"+a+"</span>"}),f+="</div>",e.hmsarr[a]=f),c.removeClass(e.times,"laydate_msg"),c[0===a?"removeClass":"addClass"](e.times,"laydate_time1")),c.addClass(e.times,"laydate_show"),e.times.innerHTML=f},e.hmson=function(a,d){var e=b("#laydate_hmsno span"),f=c.valid?null:1;c.each(e,function(b,e){f?c.addClass(e,h[1]):c.timeVoid(b,d)?c.addClass(e,h[1]):c.on(e,"click",function(){c.hasClass(this,h[1])||(a.value=c.digit(0|this.innerHTML))})}),c.addClass(e[0|a.value],"laydate_click")},c.each(e.hmsin,function(a,b){c.on(b,"click",function(b){c.stopmp(b).reshow(),c.msg(a,e.hmss[a]),e.hmson(this,a)})}),c.on(d,"mouseup",function(){var a=b("#"+h[0]);a&&"none"!==a.style.display&&(c.check()||c.close())}).on(d,"keydown",function(b){b=b||a.event;var d=b.keyCode;13===d&&c.creation([c.ymd[0],c.ymd[1]+1,c.ymd[2]])})},c.init=function(){c.use("need"),c.use(h[4]+b.defSkin,h[3]),c.skinLink=c.query("#"+h[3])}(),laydate.reset=function(){c.box&&c.elem&&c.follow(c.box)},laydate.now=function(a,b){var d=new Date(0|a?function(a){return 864e5>a?+new Date+864e5*a:a}(parseInt(a)):+new Date);return c.parse([d.getFullYear(),d.getMonth()+1,d.getDate()],[d.getHours(),d.getMinutes(),d.getSeconds()],b)},laydate.skin=function(a){c.skinLink.href=c.getPath+h[4]+a+h[5]}}(window);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/need/laydate.css b/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/need/laydate.css
new file mode 100644
index 0000000..91d4dbc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/need/laydate.css
@@ -0,0 +1,75 @@
+/**
+
+ @Name: laydate 核心样式
+ @Author:贤心
+ @Site:http://sentsin.com/layui/laydate
+
+**/
+
+html{_background-image:url(about:blank); _background-attachment:fixed;}
+.layer-date{display: inline-block!important;vertical-align:text-top;}
+.laydate_body .laydate_box, .laydate_body .laydate_box *{margin:0; padding:0;}
+.laydate-icon,
+.laydate-icon-default,
+.laydate-icon-danlan,
+.laydate-icon-dahong,
+.laydate-icon-molv{height:34px; padding-right:20px;min-width:34px;vertical-align: text-top;border:1px solid #C6C6C6; background-repeat:no-repeat; background-position:right center;  background-color:#fff; outline:0;}
+.laydate-icon-default{ background-image:url(../skins/default/icon.png)}
+.laydate-icon-danlan{border:1px solid #B1D2EC; background-image:url(../skins/danlan/icon.png)}
+.laydate-icon-dahong{background-image:url(../skins/dahong/icon.png)}
+.laydate-icon-molv{background-image:url(../skins/molv/icon.png)}
+.laydate_body .laydate_box{width:240px; font:12px '\5B8B\4F53'; z-index:99999999; *margin:-2px 0 0 -2px; *overflow:hidden; _margin:0; _position:absolute!important; background-color:#fff;}
+.laydate_body .laydate_box li{list-style:none;}
+.laydate_body .laydate_box .laydate_void{cursor:text!important;}
+.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{text-decoration:none; blr:expression(this.onFocus=this.blur()); cursor:pointer;}
+.laydate_body .laydate_box a:hover{text-decoration:none;}
+.laydate_body .laydate_box cite, .laydate_body .laydate_box label{position:absolute; width:0; height:0; border-width:5px; border-style:dashed; border-color:transparent; overflow:hidden; cursor:pointer;}
+.laydate_body .laydate_box .laydate_yms, .laydate_body .laydate_box .laydate_time{display:none;}
+.laydate_body .laydate_box .laydate_show{display:block;}
+.laydate_body .laydate_box input{outline:0; font-size:14px; background-color:#fff;}
+.laydate_body .laydate_top{position:relative; height:26px; padding:5px; *width:100%; z-index:99;}
+.laydate_body .laydate_ym{position:relative; float:left; height:24px; cursor:pointer;}
+.laydate_body .laydate_ym input{float:left; height:24px; line-height:24px; text-align:center; border:none; cursor:pointer;}
+.laydate_body .laydate_ym .laydate_yms{position:absolute; left: -1px; top: 24px; height:181px;}
+.laydate_body .laydate_y{width:121px;}
+.laydate_body .laydate_y input{width:64px; margin-right:15px;}
+.laydate_body .laydate_y .laydate_yms{width:121px; text-align:center;}
+.laydate_body .laydate_y .laydate_yms a{position:relative; display:block; height:20px;}
+.laydate_body .laydate_y .laydate_yms ul{height:139px; padding:0; *overflow:hidden;}
+.laydate_body .laydate_y .laydate_yms ul li{float:left; width:60px; height:20px; line-height: 20px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
+.laydate_box *{box-sizing:content-box!important;}
+.laydate_body .laydate_m{width:99px;float: right;margin-right:-2px;}
+.laydate_body .laydate_m .laydate_yms{width:99px; padding:0;}
+.laydate_body .laydate_m input{width:42px; margin-right:15px;}
+.laydate_body .laydate_m .laydate_yms span{display:block; float:left; width:42px; margin: 5px 0 0 5px; line-height:24px; text-align:center; _display:inline;}
+.laydate_body .laydate_choose{display:block; float:left; position:relative; width:20px; height:24px;}
+.laydate_body .laydate_choose cite, .laydate_body .laydate_tab cite{left:50%; top:50%;}
+.laydate_body .laydate_chtop cite{margin:-7px 0 0 -5px; border-bottom-style:solid;}
+.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{top:50%; margin:-2px 0 0 -5px; border-top-style:solid;}
+.laydate_body .laydate_chprev cite{margin:-5px 0 0 -7px;}
+.laydate_body .laydate_chnext cite{margin:-5px 0 0 -2px;}
+.laydate_body .laydate_ym label{right:28px;}
+.laydate_body .laydate_table{ width:230px; margin:0 5px; border-collapse:collapse; border-spacing:0px; }
+.laydate_body .laydate_table td{width:31px; height:19px; line-height:19px; text-align: center; cursor:pointer; font-size: 12px;}
+.laydate_body .laydate_table thead{height:22px; line-height:22px;}
+.laydate_body .laydate_table thead th{font-weight:400; font-size:12px; text-align:center;}
+.laydate_body .laydate_bottom{position:relative; height:22px; line-height:20px; padding:5px; font-size:12px;}
+.laydate_body .laydate_bottom #laydate_hms{position: relative; z-index: 1; float:left; }
+.laydate_body .laydate_time{ position:absolute; left:5px; bottom: 26px; width:129px; height:125px; *overflow:hidden;}
+.laydate_body .laydate_time .laydate_hmsno{ padding:5px 0 0 5px;}
+.laydate_body .laydate_time .laydate_hmsno span{display:block; float:left; width:24px; height:19px; line-height:19px; text-align:center; cursor:pointer; *margin-bottom:-5px;}
+.laydate_body .laydate_time1{width:228px; height:154px;}
+.laydate_body .laydate_time1 .laydate_hmsno{padding: 6px 0 0 8px;}
+.laydate_body .laydate_time1 .laydate_hmsno span{width:21px; height:20px; line-height:20px;}
+.laydate_body .laydate_msg{left:49px; bottom:67px; width:141px; height:auto; overflow: hidden;}
+.laydate_body .laydate_msg p{padding:5px 10px;}
+.laydate_body .laydate_bottom li{float:left; height:20px; line-height:20px; border-right:none; font-weight:900;}
+.laydate_body .laydate_bottom .laydate_sj{width:33px; text-align:center; font-weight:400;}
+.laydate_body .laydate_bottom input{float:left; width:21px; height:20px; line-height:20px; border:none; text-align:center; cursor:pointer; font-size:12px;  font-weight:400;}
+.laydate_body .laydate_bottom .laydte_hsmtex{height:20px; line-height:20px; text-align:center;}
+.laydate_body .laydate_bottom .laydte_hsmtex span{position:absolute; width:20px; top:0; right:0px; cursor:pointer;}
+.laydate_body .laydate_bottom .laydte_hsmtex span:hover{font-size:14px;}
+.laydate_body .laydate_bottom .laydate_btn{position:absolute; right:5px; top:5px;}
+.laydate_body .laydate_bottom .laydate_btn a{float:left; height:20px; padding:0 6px; _padding:0 5px;}
+.laydate_body .laydate_bottom .laydate_v{position:absolute; left:10px; top:6px; font-family:Courier; z-index:0;}
+
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/skins/default/icon.png b/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/skins/default/icon.png
new file mode 100644
index 0000000..948660f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/skins/default/icon.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/skins/default/laydate.css b/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/skins/default/laydate.css
new file mode 100644
index 0000000..a3ce4d4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/laydate/skins/default/laydate.css
@@ -0,0 +1,59 @@
+/**
+
+ @Name: laydate皮肤:墨绿
+ @Author:贤心
+ @Site:http://sentsin.com/layui/laydate
+
+**/
+
+.laydate-icon{border:1px solid #ccc; background-image:url(icon.png)}
+
+.laydate_body .laydate_bottom #laydate_hms,
+.laydate_body .laydate_time{border:1px solid #ccc;}
+
+.laydate_body .laydate_box,
+.laydate_body .laydate_ym .laydate_yms,
+.laydate_body .laydate_time{box-shadow: 2px 2px 5px rgba(0,0,0,.1);}
+
+.laydate_body .laydate_box{border-top:none; border-bottom:none; background-color:#fff; color:#00625A;}
+.laydate_body .laydate_box input{background:none!important; color:#fff;}
+.laydate_body .laydate_box .laydate_void{color:#00E8D7!important;}
+.laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{color:#00625A;}
+.laydate_body .laydate_box a:hover{color:#666;}
+.laydate_body .laydate_click{background-color:#009F95!important; color:#fff!important;}
+.laydate_body .laydate_top{border-top:1px solid #009F95; background-color:#009F95}
+.laydate_body .laydate_ym{border:1px solid #009F95; background-color:#009F95;}
+.laydate_body .laydate_ym .laydate_yms{border:1px solid #009F95; background-color:#009F95; color:#fff;}
+.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #009F95;}
+.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #009F95; border-bottom:none;}
+.laydate_body .laydate_choose{border-left:1px solid #009F95;}
+.laydate_body .laydate_chprev{border-left:none; border-right:1px solid #009F95;}
+.laydate_body .laydate_choose:hover,
+.laydate_body .laydate_y .laydate_yms a:hover{background-color:#00C1B3;}
+.laydate_body .laydate_chtop cite{border-bottom-color:#fff;}
+.laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{border-top-color:#fff;}
+.laydate_body .laydate_chprev cite{border-right-style:solid; border-right-color:#fff;}
+.laydate_body .laydate_chnext cite{border-left-style:solid; border-left-color:#fff;}
+.laydate_body .laydate_table{width: 240px!important; margin: 0!important; border:1px solid #ccc; border-top:none; border-bottom:none;}
+.laydate_body .laydate_table td{border:none;  height:21px!important; line-height:21px!important; background-color:#fff; color:#00625A;}
+.laydate_body .laydate_table .laydate_nothis{color:#999;}
+.laydate_body .laydate_table thead{border-bottom:1px solid #ccc; height:21px!important; line-height:21px!important;}
+.laydate_body .laydate_table thead th{}
+.laydate_body .laydate_bottom{border:1px solid #ccc; border-top:none;}
+.laydate_body .laydate_bottom #laydate_hms{background-color:#fff;}
+.laydate_body .laydate_time{background-color:#fff;}
+.laydate_body .laydate_time1{width: 226px!important; height: 152px!important;}
+.laydate_body .laydate_bottom .laydate_sj{width:31px!important; border-right:1px solid #ccc; background-color:#fff;}
+.laydate_body .laydate_bottom input{background-color:#fff; color:#00625A;}
+.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #ccc;}
+.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #ccc;}
+.laydate_body .laydate_bottom .laydate_v{color:#999}
+.laydate_body .laydate_bottom .laydate_btn a{border: 1px solid #ccc; border-right:none; background-color:#fff;}
+.laydate_body .laydate_bottom .laydate_btn a:hover{background-color:#F6F6F6; color:#00625A;}
+
+.laydate_body .laydate_m .laydate_yms span:hover,
+.laydate_body .laydate_time .laydate_hmsno span:hover,
+.laydate_body .laydate_y .laydate_yms ul li:hover,
+.laydate_body .laydate_table td:hover{background-color:#00C1B3; color:#fff;}
+
+
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/layer.js b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layer.js
new file mode 100644
index 0000000..12cb6b5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layer.js
@@ -0,0 +1,2 @@
+/*! layer-v3.1.1 Web弹层组件 MIT License  http://layer.layui.com/  By 贤心 */
+ ;!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:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],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:"&#x4FE1;&#x606F;",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?'<div class="layui-layer-title" style="'+(f?r.title[1]:"")+'">'+(f?r.title[0]:r.title)+"</div>":"";return r.zIndex=s,t([r.shade?'<div class="layui-layer-shade" id="layui-layer-shade'+a+'" times="'+a+'" style="'+("z-index:"+(s-1)+"; ")+'"></div>':"",'<div class="'+l[0]+(" layui-layer-"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?"":" layui-layer-border")+" "+(r.skin||"")+'" id="'+l[0]+a+'" type="'+o.type[r.type]+'" times="'+a+'" showtime="'+r.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+s+"; width:"+r.area[0]+";height:"+r.area[1]+(r.fixed?"":";position:absolute;")+'">'+(e&&2!=r.type?"":u)+'<div id="'+(r.id||"")+'" class="layui-layer-content'+(0==r.type&&r.icon!==-1?" layui-layer-padding":"")+(3==r.type?" layui-layer-loading"+r.icon:"")+'">'+(0==r.type&&r.icon!==-1?'<i class="layui-layer-ico layui-layer-ico'+r.icon+'"></i>':"")+(1==r.type&&e?"":r.content||"")+'</div><span class="layui-layer-setwin">'+function(){var e=c?'<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>':"";return r.closeBtn&&(e+='<a class="layui-layer-ico '+l[7]+" "+l[7]+(r.title?r.closeBtn:4==r.type?"1":"2")+'" href="javascript:;"></a>'),e}()+"</span>"+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class="'+l[6]+t+'">'+r.btn[t]+"</a>";return'<div class="'+l[6]+" layui-layer-btn-"+(r.btnAlign||"")+'">'+e+"</div>"}():"")+(r.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],u,i('<div class="layui-layer-move"></div>')),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='<iframe scrolling="'+(t.content[1]||"auto")+'" allowtransparency="true" id="'+l[4]+a+'" name="'+l[4]+a+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+t.content[0]+'"></iframe>';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]+'<i class="layui-layer-TipsG"></i>',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;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(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?'<textarea class="layui-layer-input"'+a+">"+(e.value||"")+"</textarea>":function(){return'<input type="'+(1==e.formType?"password":"text")+'" class="layui-layer-input" value="'+(e.value||"")+'">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("&#x6700;&#x591A;&#x8F93;&#x5165;"+(e.maxlength||500)+"&#x4E2A;&#x5B57;&#x6570;",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='<span class="'+n+'">'+t[0].title+"</span>";i<e;i++)a+="<span>"+t[i].title+"</span>";return a}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=t.length,i=1,a="";if(e>0)for(a='<li class="layui-layer-tabli '+n+'">'+(t[0].content||"no content")+"</li>";i<e;i++)a+='<li class="layui-layer-tabli">'+(t[i].content||"no  content")+"</li>";return a}()+"</ul>",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("&#x6CA1;&#x6709;&#x56FE;&#x7247;")}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]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+"px",a[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,isOutAnim:!1,skin:"layui-layer-photos"+c("photos"),content:'<div class="layui-layer-phimg"><img src="'+u[d].src+'" alt="'+(u[d].alt||"")+'" layer-pid="'+u[d].pid+'"><div class="layui-layer-imgsee">'+(u.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(a?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(u[d].alt||"")+"</a><em>"+s.imgIndex+"/"+u.length+"</em></span></div></div></div>",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("&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;",{time:3e4,btn:["&#x4E0B;&#x4E00;&#x5F20;","&#x4E0D;&#x770B;&#x4E86;"],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/management/guns-admin/src/main/webapp/static/js/plugins/layer/layer.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layer.min.js
new file mode 100644
index 0000000..e70ee77
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layer.min.js
@@ -0,0 +1,2 @@
+/*! layer-v3.1.0 Web弹层组件 MIT License  http://layer.layui.com/  By 贤心 */
+ ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.scripts,t=e[e.length-1],i=t.src;if(!t.getAttribute("merge"))return i.substring(0,i.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],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.0",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:"&#x4FE1;&#x606F;",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?'<div class="layui-layer-title" style="'+(f?r.title[1]:"")+'">'+(f?r.title[0]:r.title)+"</div>":"";return r.zIndex=s,t([r.shade?'<div class="layui-layer-shade" id="layui-layer-shade'+a+'" times="'+a+'" style="'+("z-index:"+(s-1)+"; ")+'"></div>':"",'<div class="'+l[0]+(" layui-layer-"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?"":" layui-layer-border")+" "+(r.skin||"")+'" id="'+l[0]+a+'" type="'+o.type[r.type]+'" times="'+a+'" showtime="'+r.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+s+"; width:"+r.area[0]+";height:"+r.area[1]+(r.fixed?"":";position:absolute;")+'">'+(e&&2!=r.type?"":u)+'<div id="'+(r.id||"")+'" class="layui-layer-content'+(0==r.type&&r.icon!==-1?" layui-layer-padding":"")+(3==r.type?" layui-layer-loading"+r.icon:"")+'">'+(0==r.type&&r.icon!==-1?'<i class="layui-layer-ico layui-layer-ico'+r.icon+'"></i>':"")+(1==r.type&&e?"":r.content||"")+'</div><span class="layui-layer-setwin">'+function(){var e=c?'<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>':"";return r.closeBtn&&(e+='<a class="layui-layer-ico '+l[7]+" "+l[7]+(r.title?r.closeBtn:4==r.type?"1":"2")+'" href="javascript:;"></a>'),e}()+"</span>"+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class="'+l[6]+t+'">'+r.btn[t]+"</a>";return'<div class="'+l[6]+" layui-layer-btn-"+(r.btnAlign||"")+'">'+e+"</div>"}():"")+(r.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],u,i('<div class="layui-layer-move"></div>')),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='<iframe scrolling="'+(t.content[1]||"auto")+'" allowtransparency="true" id="'+l[4]+a+'" name="'+l[4]+a+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+t.content[0]+'"></iframe>';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]+'<i class="layui-layer-TipsG"></i>',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":"rgba(0,0,0,"+(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;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(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?'<textarea class="layui-layer-input"'+a+">"+(e.value||"")+"</textarea>":function(){return'<input type="'+(1==e.formType?"password":"text")+'" class="layui-layer-input" value="'+(e.value||"")+'">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("&#x6700;&#x591A;&#x8F93;&#x5165;"+(e.maxlength||500)+"&#x4E2A;&#x5B57;&#x6570;",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='<span class="'+n+'">'+t[0].title+"</span>";i<e;i++)a+="<span>"+t[i].title+"</span>";return a}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=t.length,i=1,a="";if(e>0)for(a='<li class="layui-layer-tabli '+n+'">'+(t[0].content||"no content")+"</li>";i<e;i++)a+='<li class="layui-layer-tabli">'+(t[i].content||"no  content")+"</li>";return a}()+"</ul>",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("&#x6CA1;&#x6709;&#x56FE;&#x7247;")}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]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+"px",a[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,isOutAnim:!1,skin:"layui-layer-photos"+c("photos"),content:'<div class="layui-layer-phimg"><img src="'+u[d].src+'" alt="'+(u[d].alt||"")+'" layer-pid="'+u[d].pid+'"><div class="layui-layer-imgsee">'+(u.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(a?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(u[d].alt||"")+"</a><em>"+s.imgIndex+"/"+u.length+"</em></span></div></div></div>",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("&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;",{time:3e4,btn:["&#x4E0B;&#x4E00;&#x5F20;","&#x4E0D;&#x770B;&#x4E86;"],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/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/chatlog.json b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/chatlog.json
new file mode 100644
index 0000000..13954d7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/chatlog.json
@@ -0,0 +1,30 @@
+{
+    "status": 1,
+    "msg": "ok",
+    "data": [
+        {
+            "id": "100001",
+            "name": "Beaut-zihan",
+            "time": "10:23",
+            "face": "img/a1.jpg"
+        },
+        {
+            "id": "100002",
+            "name": "慕容晓晓",
+            "time": "昨天",
+            "face": "img/a2.jpg"
+        },
+        {
+            "id": "1000033",
+            "name": "乔峰",
+            "time": "2014-4.22",
+            "face": "img/a3.jpg"
+        },
+        {
+            "id": "10000333",
+            "name": "高圆圆",
+            "time": "2014-4.21",
+            "face": "img/a4.jpg"
+        }
+    ]
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/friend.json b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/friend.json
new file mode 100644
index 0000000..13a2b65
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/friend.json
@@ -0,0 +1,107 @@
+{
+    "status": 1,
+    "msg": "ok",
+    "data": [
+        {
+            "name": "销售部",
+            "nums": 36,
+            "id": 1,
+            "item": [
+                {
+                    "id": "100001",
+                    "name": "郭敬明",
+                    "face": "img/a5.jpg"
+                },
+                {
+                    "id": "100002",
+                    "name": "作家崔成浩",
+                    "face": "img/a6.jpg"
+                },
+                {
+                    "id": "1000022",
+                    "name": "韩寒",
+                    "face": "img/a7.jpg"
+                },
+                {
+                    "id": "10000222",
+                    "name": "范爷",
+                    "face": "img/a8.jpg"
+                },
+                {
+                    "id": "100002222",
+                    "name": "小马哥",
+                    "face": "img/a9.jpg"
+                }
+            ]
+        },
+        {
+            "name": "大学同窗",
+            "nums": 16,
+            "id": 2,
+            "item": [
+                {
+                    "id": "1000033",
+                    "name": "苏醒",
+                    "face": "img/a9.jpg"
+                },
+                {
+                    "id": "10000333",
+                    "name": "马云",
+                    "face": "img/a8.jpg"
+                },
+                {
+                    "id": "100003",
+                    "name": "鬼脚七",
+                    "face": "img/a7.jpg"
+                },
+                {
+                    "id": "100004",
+                    "name": "谢楠",
+                    "face": "img/a6.jpg"
+                },
+                {
+                    "id": "100005",
+                    "name": "徐峥",
+                    "face": "img/a5.jpg"
+                }
+            ]
+        },
+        {
+            "name": "H+后台主题",
+            "nums": 38,
+            "id": 3,
+            "item": [
+                {
+                    "id": "100006",
+                    "name": "柏雪近在它香",
+                    "face": "img/a4.jpg"
+                },
+                {
+                    "id": "100007",
+                    "name": "罗昌平",
+                    "face": "img/a3.jpg"
+                },
+                {
+                    "id": "100008",
+                    "name": "Crystal影子",
+                    "face": "img/a2.jpg"
+                },
+                {
+                    "id": "100009",
+                    "name": "艺小想",
+                    "face": "img/a1.jpg"
+                },
+                {
+                    "id": "100010",
+                    "name": "天猫",
+                    "face": "img/a8.jpg"
+                },
+                {
+                    "id": "100011",
+                    "name": "张泉灵",
+                    "face": "img/a7.jpg"
+                }
+            ]
+        }
+    ]
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/group.json b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/group.json
new file mode 100644
index 0000000..3352f65
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/group.json
@@ -0,0 +1,57 @@
+{
+    "status": 1,
+    "msg": "ok",
+    "data": [
+        {
+            "name": "H+交流群",
+            "nums": 36,
+            "id": 1,
+            "item": [
+                {
+                    "id": "101",
+                    "name": "H+ Bug反馈",
+                    "face": "http://tp2.sinaimg.cn/2211874245/180/40050524279/0"
+                },
+                {
+                    "id": "102",
+                    "name": "H+ 技术交流",
+                    "face": "http://tp3.sinaimg.cn/1820711170/180/1286855219/1"
+                }
+            ]
+        },
+        {
+            "name": "Bootstrap",
+            "nums": 16,
+            "id": 2,
+            "item": [
+                {
+                    "id": "103",
+                    "name": "Bootstrap中文",
+                    "face": "http://tp2.sinaimg.cn/2211874245/180/40050524279/0"
+                },
+                {
+                    "id": "104",
+                    "name": "Bootstrap资源",
+                    "face": "http://tp3.sinaimg.cn/1820711170/180/1286855219/1"
+                }
+            ]
+        },
+        {
+            "name": "WebApp",
+            "nums": 106,
+            "id": 3,
+            "item": [
+                {
+                    "id": "105",
+                    "name": "移动开发",
+                    "face": "http://tp2.sinaimg.cn/2211874245/180/40050524279/0"
+                },
+                {
+                    "id": "106",
+                    "name": "H5前言",
+                    "face": "http://tp3.sinaimg.cn/1820711170/180/1286855219/1"
+                }
+            ]
+        }
+    ]
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/groups.json b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/groups.json
new file mode 100644
index 0000000..fd0464a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/data/groups.json
@@ -0,0 +1,56 @@
+{
+    "status": 1,
+    "msg": "ok",
+    "data": [
+        {
+            "id": "100001",
+            "name": "無言的蒁説",
+            "face": "img/a1.jpg"
+        },
+        {
+            "id": "100002",
+            "name": "婷宝奢侈品",
+            "face": "img/a2.jpg"
+        },
+        {
+            "id": "100003",
+            "name": "忆恨思爱",
+            "face": "img/a3.jpg"
+        },
+        {
+            "id": "100004",
+            "name": "天涯奥拓慢",
+            "face": "img/a4.jpg"
+        },
+        {
+            "id": "100005",
+            "name": "雨落无声的天空",
+            "face": "img/a5.jpg"
+        },
+        {
+            "id": "100006",
+            "name": "李越LycorisRadiate",
+            "face": "img/a6.jpg"
+        },
+        {
+            "id": "100007",
+            "name": "冯胖妞张直丑",
+            "face": "img/a7.jpg"
+        },
+        {
+            "id": "100008",
+            "name": "陈龙hmmm",
+            "face": "img/a8.jpg"
+        },
+        {
+            "id": "100009",
+            "name": "别闹哥胆儿小",
+            "face": "img/a9.jpg"
+        },
+        {
+            "id": "100010",
+            "name": "锅锅锅锅萌哒哒 ",
+            "face": "img/a10.jpg"
+        }
+    ]
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/layim.css b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/layim.css
new file mode 100644
index 0000000..a568a03
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/layim.css
@@ -0,0 +1,158 @@
+/*
+
+ @Name: layim WebIM 1.0.0
+ @Author:贤心(子涵修改)
+ @Date: 2014-04-25
+ @Blog: http://sentsin.com
+
+ */
+body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,input,button,textarea,p,blockquote,th,td,form{margin:0; padding:0;}
+input,button,textarea,select,optgroup,option{font-family:inherit; font-size:inherit; font-style:inherit; font-weight:inherit; outline: 0;}
+li{list-style:none;}
+.xxim_icon, .xxim_main i, .layim_chatbox i{position:absolute;}
+.loading{background:url(loading.gif) no-repeat center center;}
+.layim_chatbox a, .layim_chatbox a:hover{color:#343434; text-decoration:none; }
+.layim_zero{position:absolute; width:0; height:0; border-style:dashed; border-color:transparent; overflow:hidden;}
+
+.xxim_main{position:fixed; right:1px; bottom:1px; width:230px; border:1px solid #BEBEBE; background-color:#fff; font-size:12px; box-shadow: 0 0 10px rgba(0,0,0,.2); z-index:99999999}
+.layim_chatbox textarea{resize:none;}
+.xxim_main em, .xxim_main i, .layim_chatbox em, .layim_chatbox i{font-style:normal; font-weight:400;}
+.xxim_main h5{font-size:100%; font-weight:400;}
+
+/* 搜索栏 */
+.xxim_search{position:relative; padding-left:40px; height:40px; border-bottom:1px solid #DCDCDC; background-color:#fff;}
+.xxim_search i{left:10px; top:12px; width:16px; height:16px;font-size: 16px;color:#999;}
+.xxim_search input{border:none; background:none; width: 180px; margin-top:10px; line-height:20px;}
+.xxim_search span{display:none; position:absolute; right:10px; top:10px; height:18px; line-height:18px;width:18px;text-align: center;background-color:#AFAFAF; color:#fff; cursor:pointer; border-radius:2px; font-size:12px; font-weight:900;}
+.xxim_search span:hover{background-color:#FCBE00;}
+
+/* 主面板tab */
+.xxim_tabs{height:45px; border-bottom:1px solid #DBDBDB; background-color:#F4F4F4; font-size:0;}
+.xxim_tabs span{position:relative; display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:76px; height:45px; border-right:1px solid #DBDBDB; cursor:pointer; font-size:12px;}
+.xxim_tabs span i{top:12px; left:50%; width:20px; margin-left:-10px; height:20px;font-size:20px;color:#ccc;}
+.xxim_tabs .xxim_tabnow{height:46px; background-color:#fff;}
+.xxim_tabs .xxim_tabnow i{color:#1ab394;}
+.xxim_tabs .xxim_latechat{border-right:none;}
+.xxim_tabs .xxim_tabfriend i{width:14px; margin-left:-7px;}
+
+/* 主面板列表 */
+.xxim_list{display:none; height:350px; padding:5px 0; overflow:hidden;}
+.xxim_list:hover{ overflow-y:auto;}
+.xxim_list h5{position:relative; padding-left:32px; height:26px; line-height:26px; cursor:pointer; color:#000; font-size:0;}
+.xxim_list h5 span{display:inline-block; *display:inline; *zoom:1; vertical-align:top; max-width:140px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; font-size:12px;}
+.xxim_list h5 i{left:15px; top:8px; width:10px; height:10px;font-size:10px;color:#666;}
+.xxim_list h5 *{font-size:12px;}
+.xxim_list .xxim_chatlist{display:none;}
+.xxim_list .xxim_liston h5 i{width:8px; height:7px;}
+.xxim_list .xxim_liston .xxim_chatlist{display:block;}
+.xxim_chatlist {}
+.xxim_chatlist li{position:relative; height:40px; line-height:30px; padding:5px 10px; font-size:0; cursor:pointer;}
+.xxim_chatlist li:hover{background-color:#F2F4F8}
+.xxim_chatlist li *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; font-size:12px;}
+.xxim_chatlist li span{padding-left:10px; max-width:120px;  overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}
+.xxim_chatlist li img{width:30px; height:30px;}
+.xxim_chatlist li .xxim_time{position:absolute; right:10px; color:#999;}
+.xxim_list .xxim_errormsg{text-align:center; margin:50px 0; color:#999;}
+.xxim_searchmain{position:absolute; width:230px; height:491px; left:0; top:41px; z-index:10; background-color:#fff;}
+
+/* 主面板底部 */
+.xxim_bottom{height:34px; border-top:1px solid #D0DCF3; background-color:#F2F4F8;}
+.xxim_expend{border-left:1px solid #D0DCF3; border-bottom:1px solid #D0DCF3;}
+.xxim_bottom li{position:relative; width:50px; height:32px; line-height:32px; float:left; border-right:1px solid #D0DCF3;  cursor:pointer;}
+.xxim_bottom li i{ top:9px;}
+.xxim_bottom .xxim_hide{border-right:none;}
+.xxim_bottom .xxim_online{width:72px; padding-left:35px;}
+.xxim_online i{left:13px; width:14px; height:14px;font-size:14px;color:#FFA00A;}
+.xxim_setonline{display:none; position:absolute; left:-79px; bottom:-1px;  border:1px solid #DCDCDC; background-color:#fff;}
+.xxim_setonline span{position:relative; display:block; width:32px;width: 77px; padding:0 10px 0 35px;}
+.xxim_setonline span:hover{background-color:#F2F4F8;}
+.xxim_offline .xxim_nowstate, .xxim_setoffline i{color:#999;}
+.xxim_mymsg i{left:18px; width:14px; height:14px;font-size: 14px;}
+.xxim_mymsg a{position:absolute; left:0; top:0; width:50px; height:32px;}
+.xxim_seter i{left:18px; width:14px; height:14px;font-size: 14px;}
+.xxim_hide i{left:18px; width:14px; height:14px;font-size: 14px;}
+.xxim_show i{}
+.xxim_bottom .xxim_on{position:absolute; left:-17px; top:50%; width:16px;text-align: center;color:#999;line-height: 97px; height:97px; margin-top:-49px;border:solid 1px #BEBEBE;border-right: none; background:#F2F4F8;}
+.xxim_bottom .xxim_off{}
+
+/* 聊天窗口 */
+.layim_chatbox{width:620px; border:1px solid #BEBEBE; background-color:#fff; font-size:12px; box-shadow: 0 0 10px rgba(0,0,0,.2);}
+.layim_chatbox h6{position:relative; height:40px; border-bottom:1px solid #D9D9D9; background-color:#FCFDFA}
+.layim_move{position:absolute; height:40px; width: 620px; z-index:0;}
+.layim_face{position:absolute; bottom:-1px; left:10px; width:64px; height:64px;padding:1px;background: #fff; border:1px solid #ccc;}
+.layim_face img{width:60px; height:60px;}
+.layim_names{position:absolute; left:90px; max-width:300px; line-height:40px; color:#000; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; font-size:14px;}
+.layim_rightbtn{position:absolute; right:15px; top:12px; font-size:20px;}
+.layim_rightbtn i{position:relative; width:16px; height:16px; display:inline-block; *display:inline; *zoom:1; vertical-align:top; cursor:pointer; transition: all .3s;text-align: center;line-height: 16px;}
+.layim_rightbtn .layim_close{background: #FFA00A;color:#fff;}
+.layim_rightbtn .layim_close:hover{-webkit-transform: rotate(180deg); -moz-transform: rotate(180deg);}
+.layim_rightbtn .layer_setmin{margin-right:5px;color:#999;font-size:14px;font-weight: 700;}
+.layim_chat, .layim_chatmore,.layim_groups{height:450px; overflow:hidden;}
+.layim_chatmore{display:none; float:left; width:135px; border-right:1px solid #BEBEBE; background-color:#F2F2F2}
+.layim_chatlist li, .layim_groups li{position:relative; height:30px; line-height:30px; padding:0 10px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; cursor:pointer;}
+.layim_chatlist li{padding:0 20px 0 10px;}
+.layim_chatlist li:hover{background-color:#E3E3E3;}
+.layim_chatlist li span{display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:90px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}
+.layim_chatlist li em{display:none; position:absolute; top:6px; right:10px; height:18px; line-height:18px;width:18px;text-align: center;font-size:14px;font-weight:900; border-radius:3px;}
+.layim_chatlist li em:hover{background-color: #FCBE00; color:#fff;}
+.layim_chatlist .layim_chatnow,.layim_chatlist .layim_chatnow:hover{/*border-top:1px solid #D9D9D9; border-bottom:1px solid #D9D9D9;*/ background-color:#fff;}
+.layim_chat{}
+.layim_chatarea{height:280px;}
+.layim_chatview{display:none; height:280px; overflow:hidden;}
+.layim_chatmore:hover, .layim_groups:hover, .layim_chatview:hover{overflow-y:auto;}
+.layim_chatview li{margin-bottom:10px; clear:both; *zoom:1;}
+.layim_chatview li:after{content:'\20'; clear:both; *zoom:1; display:block; height:0;}
+
+.layim_chatthis{display:block;}
+.layim_chatuser{float:left; padding:15px; font-size:0;}
+.layim_chatuser *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; line-height:30px; font-size:12px; padding-right:10px;}
+.layim_chatuser img{width:30px; height:30px;padding-right: 0;margin-right: 15px;}
+.layim_chatuser .layim_chatname{max-width:230px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}
+.layim_chatuser .layim_chattime{color:#999; padding-left:10px;}
+.layim_chatsay{position:relative; float:left; margin:0 15px; padding:10px; line-height:20px; background-color:#F3F3F3; border-radius:3px; clear:both;}
+.layim_chatsay .layim_zero{left:5px; top:-8px; border-width:8px; border-right-style:solid; border-right-color:#F3F3F3;}
+.layim_chateme .layim_chatuser{float:right;}
+.layim_chateme .layim_chatuser *{padding-right:0; padding-left:10px;}
+.layim_chateme .layim_chatuser img{margin-left:15px;padding-left: 0;}
+.layim_chateme .layim_chatsay .layim_zero{left:auto; right:10px;}
+.layim_chateme .layim_chatuser .layim_chattime{padding-left:0; padding-right:10px;}
+.layim_chateme .layim_chatsay{float:right; background-color:#EBFBE3}
+.layim_chateme .layim_zero{border-right-color:#EBFBE3;}
+.layim_groups{display:none; float:right; width:130px; border-left:1px solid #D9D9D9; background-color:#fff;}
+.layim_groups ul{display:none;}
+.layim_groups ul.layim_groupthis{display:block;}
+.layim_groups li *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; margin-right:10px;}
+.layim_groups li img{width:20px; height:20px; margin-top:5px;}
+.layim_groups li span{max-width:80px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;}
+.layim_groups li:hover{background-color:#F3F3F3;}
+.layim_groups .layim_errors{text-align:center; color:#999;}
+.layim_tool{position:relative; height:35px; line-height:35px; padding-left:10px; background-color:#F3F3F3;}
+.layim_tool i{position:relative; top:10px; display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:16px; height:16px; margin-right:10px; cursor:pointer;font-size:16px;color:#999;font-weight: 700;}
+.layim_tool i:hover{color:#FFA00A;}
+.layim_tool .layim_seechatlog{position:absolute; right:15px;}
+.layim_tool .layim_seechatlog i{}
+.layim_write{display:block; border:none; width:98%; height:90px; line-height:20px; margin:5px auto 0;}
+.layim_send{position:relative; height:40px; background-color:#F3F3F3;}
+.layim_sendbtn{position:absolute; height:26px; line-height:26px; right:10px; top:8px; padding:0 40px 0 20px; background-color:#FFA00A; color:#fff; border-radius:3px; cursor:pointer;}
+.layim_enter{position:absolute; right:0; border-left:1px solid #FFB94F; width:24px; height:26px;}
+.layim_enter:hover{background-color:#E68A00; border-radius:0 3px 3px 0;}
+.layim_enter .layim_zero{left:7px; top:11px; border-width:5px; border-top-style:solid; border-top-color:#FFE0B3;}
+.layim_sendtype{display:none; position:absolute; right:10px; bottom:37px; border:1px solid #D9D9D9; background-color:#fff; text-align:left;}
+.layim_sendtype span{display:block; line-height:24px; padding:0 10px 0 25px; cursor:pointer;}
+.layim_sendtype span:hover{background-color:#F3F3F3;}
+.layim_sendtype span i{left:5px;}
+
+.layim_min{display:none; position:absolute; left:-190px; bottom:-1px; width:160px; height:32px; line-height:32px; padding:0 10px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; border:1px solid #ccc; box-shadow: 0 0 5px rgba(0,0,75,.2); background-color:#FCFDFA; cursor:pointer;}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/layim.js b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/layim.js
new file mode 100644
index 0000000..52f0083
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/layim.js
@@ -0,0 +1,630 @@
+/*
+
+ @Name: layui WebIM 1.0.0
+ @Author:贤心
+ @Date: 2014-04-25
+ @Blog: http://sentsin.com
+
+ */
+
+;!function(win, undefined){
+
+var config = {
+    msgurl: 'mailbox.html?msg=',
+    chatlogurl: 'mailbox.html?user=',
+    aniTime: 200,
+    right: -232,
+    api: {
+        friend: 'js/plugins/layer/layim/data/friend.json', //好友列表接口
+        group: 'js/plugins/layer/layim/data/group.json', //群组列表接口
+        chatlog: 'js/plugins/layer/layim/data/chatlog.json', //聊天记录接口
+        groups: 'js/plugins/layer/layim/data/groups.json', //群组成员接口
+        sendurl: '' //发送消息接口
+    },
+    user: { //当前用户信息
+        name: '游客',
+        face: 'img/a1.jpg'
+    },
+
+    //自动回复内置文案,也可动态读取数据库配置
+    autoReplay: [
+        '您好,我现在有事不在,一会再和您联系。',
+        '你没发错吧?',
+        '洗澡中,请勿打扰,偷窥请购票,个体四十,团体八折,订票电话:一般人我不告诉他!',
+        '你好,我是主人的美女秘书,有什么事就跟我说吧,等他回来我会转告他的。',
+        '我正在拉磨,没法招呼您,因为我们家毛驴去动物保护协会把我告了,说我剥夺它休产假的权利。',
+        '<(@ ̄︶ ̄@)>',
+        '你要和我说话?你真的要和我说话?你确定自己想说吗?你一定非说不可吗?那你说吧,这是自动回复。',
+        '主人正在开机自检,键盘鼠标看好机会出去凉快去了,我是他的电冰箱,我打字比较慢,你慢慢说,别急……',
+        '(*^__^*) 嘻嘻,是贤心吗?'
+    ],
+
+
+    chating: {},
+    hosts: (function(){
+        var dk = location.href.match(/\:\d+/);
+        dk = dk ? dk[0] : '';
+        return 'http://' + document.domain + dk + '/';
+    })(),
+    json: function(url, data, callback, error){
+        return $.ajax({
+            type: 'POST',
+            url: url,
+            data: data,
+            dataType: 'json',
+            success: callback,
+            error: error
+        });
+    },
+    stopMP: function(e){
+        e ? e.stopPropagation() : e.cancelBubble = true;
+    }
+}, dom = [$(window), $(document), $('html'), $('body')], xxim = {};
+
+//主界面tab
+xxim.tabs = function(index){
+    var node = xxim.node;
+    node.tabs.eq(index).addClass('xxim_tabnow').siblings().removeClass('xxim_tabnow');
+    node.list.eq(index).show().siblings('.xxim_list').hide();
+    if(node.list.eq(index).find('li').length === 0){
+        xxim.getDates(index);
+    }
+};
+
+//节点
+xxim.renode = function(){
+    var node = xxim.node = {
+        tabs: $('#xxim_tabs>span'),
+        list: $('.xxim_list'),
+        online: $('.xxim_online'),
+        setonline: $('.xxim_setonline'),
+        onlinetex: $('#xxim_onlinetex'),
+        xximon: $('#xxim_on'),
+        layimFooter: $('#xxim_bottom'),
+        xximHide: $('#xxim_hide'),
+        xximSearch: $('#xxim_searchkey'),
+        searchMian: $('#xxim_searchmain'),
+        closeSearch: $('#xxim_closesearch'),
+        layimMin: $('#layim_min')
+    };
+};
+
+//主界面缩放
+xxim.expend = function(){
+    var node = xxim.node;
+    if(xxim.layimNode.attr('state') !== '1'){
+        xxim.layimNode.stop().animate({right: config.right}, config.aniTime, function(){
+            node.xximon.addClass('xxim_off');
+            try{
+                localStorage.layimState = 1;
+            }catch(e){}
+            xxim.layimNode.attr({state: 1});
+            node.layimFooter.addClass('xxim_expend').stop().animate({marginLeft: config.right}, config.aniTime/2);
+            node.xximHide.addClass('xxim_show');
+        });
+    } else {
+        xxim.layimNode.stop().animate({right: 1}, config.aniTime, function(){
+            node.xximon.removeClass('xxim_off');
+            try{
+                localStorage.layimState = 2;
+            }catch(e){}
+            xxim.layimNode.removeAttr('state');
+            node.layimFooter.removeClass('xxim_expend');
+            node.xximHide.removeClass('xxim_show');
+        });
+        node.layimFooter.stop().animate({marginLeft: 0}, config.aniTime);
+    }
+};
+
+//初始化窗口格局
+xxim.layinit = function(){
+    var node = xxim.node;
+
+    //主界面
+    try{
+        /*
+        if(!localStorage.layimState){
+            config.aniTime = 0;
+            localStorage.layimState = 1;
+        }
+        */
+        if(localStorage.layimState === '1'){
+            xxim.layimNode.attr({state: 1}).css({right: config.right});
+            node.xximon.addClass('xxim_off');
+            node.layimFooter.addClass('xxim_expend').css({marginLeft: config.right});
+            node.xximHide.addClass('xxim_show');
+        }
+    }catch(e){
+        //layer.msg(e.message, 5, -1);
+    }
+};
+
+//聊天窗口
+xxim.popchat = function(param){
+    var node = xxim.node, log = {};
+
+    log.success = function(layero){
+        layer.setMove();
+
+        xxim.chatbox = layero.find('#layim_chatbox');
+        log.chatlist = xxim.chatbox.find('.layim_chatmore>ul');
+
+        log.chatlist.html('<li data-id="'+ param.id +'" type="'+ param.type +'"  id="layim_user'+ param.type + param.id +'"><span>'+ param.name +'</span><em>×</em></li>')
+        xxim.tabchat(param, xxim.chatbox);
+
+        //最小化聊天窗
+        xxim.chatbox.find('.layer_setmin').on('click', function(){
+            var indexs = layero.attr('times');
+            layero.hide();
+            node.layimMin.text(xxim.nowchat.name).show();
+        });
+
+        //关闭窗口
+        xxim.chatbox.find('.layim_close').on('click', function(){
+            var indexs = layero.attr('times');
+            layer.close(indexs);
+            xxim.chatbox = null;
+            config.chating = {};
+            config.chatings = 0;
+        });
+
+        //关闭某个聊天
+        log.chatlist.on('mouseenter', 'li', function(){
+            $(this).find('em').show();
+        }).on('mouseleave', 'li', function(){
+            $(this).find('em').hide();
+        });
+        log.chatlist.on('click', 'li em', function(e){
+            var parents = $(this).parent(), dataType = parents.attr('type');
+            var dataId = parents.attr('data-id'), index = parents.index();
+            var chatlist = log.chatlist.find('li'), indexs;
+
+            config.stopMP(e);
+
+            delete config.chating[dataType + dataId];
+            config.chatings--;
+
+            parents.remove();
+            $('#layim_area'+ dataType + dataId).remove();
+            if(dataType === 'group'){
+                $('#layim_group'+ dataType + dataId).remove();
+            }
+
+            if(parents.hasClass('layim_chatnow')){
+                if(index === config.chatings){
+                    indexs = index - 1;
+                } else {
+                    indexs = index + 1;
+                }
+                xxim.tabchat(config.chating[chatlist.eq(indexs).attr('type') + chatlist.eq(indexs).attr('data-id')]);
+            }
+
+            if(log.chatlist.find('li').length === 1){
+                log.chatlist.parent().hide();
+            }
+        });
+
+        //聊天选项卡
+        log.chatlist.on('click', 'li', function(){
+            var othis = $(this), dataType = othis.attr('type'), dataId = othis.attr('data-id');
+            xxim.tabchat(config.chating[dataType + dataId]);
+        });
+
+        //发送热键切换
+        log.sendType = $('#layim_sendtype'), log.sendTypes = log.sendType.find('span');
+        $('#layim_enter').on('click', function(e){
+            config.stopMP(e);
+            log.sendType.show();
+        });
+        log.sendTypes.on('click', function(){
+            log.sendTypes.find('i').text('')
+            $(this).find('i').text('√');
+        });
+
+        xxim.transmit();
+    };
+
+    log.html = '<div class="layim_chatbox" id="layim_chatbox">'
+            +'<h6>'
+            +'<span class="layim_move"></span>'
+            +'    <a href="'+ param.url +'" class="layim_face" target="_blank"><img src="'+ param.face +'" ></a>'
+            +'    <a href="'+ param.url +'" class="layim_names" target="_blank">'+ param.name +'</a>'
+            +'    <span class="layim_rightbtn">'
+            +'        <i class="layer_setmin">—</i>'
+            +'        <i class="layim_close">&times;</i>'
+            +'    </span>'
+            +'</h6>'
+            +'<div class="layim_chatmore" id="layim_chatmore">'
+            +'    <ul class="layim_chatlist"></ul>'
+            +'</div>'
+            +'<div class="layim_groups" id="layim_groups"></div>'
+            +'<div class="layim_chat">'
+            +'    <div class="layim_chatarea" id="layim_chatarea">'
+            +'        <ul class="layim_chatview layim_chatthis"  id="layim_area'+ param.type + param.id +'"></ul>'
+            +'    </div>'
+            +'    <div class="layim_tool">'
+            +'        <i class="layim_addface fa fa-meh-o" title="发送表情"></i>'
+            +'        <a href="javascript:;"><i class="layim_addimage fa fa-picture-o" title="上传图片"></i></a>'
+            +'        <a href="javascript:;"><i class="layim_addfile fa fa-paperclip" title="上传附件"></i></a>'
+            +'        <a href="" target="_blank" class="layim_seechatlog"><i class="fa fa-comment-o"></i>聊天记录</a>'
+            +'    </div>'
+            +'    <textarea class="layim_write" id="layim_write"></textarea>'
+            +'    <div class="layim_send">'
+            +'        <div class="layim_sendbtn" id="layim_sendbtn">发送<span class="layim_enter" id="layim_enter"><em class="layim_zero"></em></span></div>'
+            +'        <div class="layim_sendtype" id="layim_sendtype">'
+            +'            <span><i>√</i>按Enter键发送</span>'
+            +'            <span><i></i>按Ctrl+Enter键发送</span>'
+            +'        </div>'
+            +'    </div>'
+            +'</div>'
+            +'</div>';
+
+    if(config.chatings < 1){
+        $.layer({
+            type: 1,
+            border: [0],
+            title: false,
+            shade: [0],
+            area: ['620px', '493px'],
+            move: '.layim_chatbox .layim_move',
+            moveType: 1,
+            closeBtn: false,
+            offset: [(($(window).height() - 493)/2)+'px', ''],
+            page: {
+                html: log.html
+            }, success: function(layero){
+                log.success(layero);
+            }
+        })
+    } else {
+        log.chatmore = xxim.chatbox.find('#layim_chatmore');
+        log.chatarea = xxim.chatbox.find('#layim_chatarea');
+
+        log.chatmore.show();
+
+        log.chatmore.find('ul>li').removeClass('layim_chatnow');
+        log.chatmore.find('ul').append('<li data-id="'+ param.id +'" type="'+ param.type +'" id="layim_user'+ param.type + param.id +'" class="layim_chatnow"><span>'+ param.name +'</span><em>×</em></li>');
+
+        log.chatarea.find('.layim_chatview').removeClass('layim_chatthis');
+        log.chatarea.append('<ul class="layim_chatview layim_chatthis" id="layim_area'+ param.type + param.id +'"></ul>');
+
+        xxim.tabchat(param);
+    }
+
+    //群组
+    log.chatgroup = xxim.chatbox.find('#layim_groups');
+    if(param.type === 'group'){
+        log.chatgroup.find('ul').removeClass('layim_groupthis');
+        log.chatgroup.append('<ul class="layim_groupthis" id="layim_group'+ param.type + param.id +'"></ul>');
+        xxim.getGroups(param);
+    }
+    //点击群员切换聊天窗
+    log.chatgroup.on('click', 'ul>li', function(){
+        xxim.popchatbox($(this));
+    });
+};
+
+//定位到某个聊天队列
+xxim.tabchat = function(param){
+    var node = xxim.node, log = {}, keys = param.type + param.id;
+    xxim.nowchat = param;
+
+    xxim.chatbox.find('#layim_user'+ keys).addClass('layim_chatnow').siblings().removeClass('layim_chatnow');
+    xxim.chatbox.find('#layim_area'+ keys).addClass('layim_chatthis').siblings().removeClass('layim_chatthis');
+    xxim.chatbox.find('#layim_group'+ keys).addClass('layim_groupthis').siblings().removeClass('layim_groupthis');
+
+    xxim.chatbox.find('.layim_face>img').attr('src', param.face);
+    xxim.chatbox.find('.layim_face, .layim_names').attr('href', param.href);
+    xxim.chatbox.find('.layim_names').text(param.name);
+
+    xxim.chatbox.find('.layim_seechatlog').attr('href', config.chatlogurl + param.id);
+
+    log.groups = xxim.chatbox.find('.layim_groups');
+    if(param.type === 'group'){
+        log.groups.show();
+    } else {
+        log.groups.hide();
+    }
+
+    $('#layim_write').focus();
+
+};
+
+//弹出聊天窗
+xxim.popchatbox = function(othis){
+    var node = xxim.node, dataId = othis.attr('data-id'), param = {
+        id: dataId, //用户ID
+        type: othis.attr('type'),
+        name: othis.find('.xxim_onename').text(),  //用户名
+        face: othis.find('.xxim_oneface').attr('src'),  //用户头像
+        href: 'profile.html?user=' + dataId //用户主页
+    }, key = param.type + dataId;
+    if(!config.chating[key]){
+        xxim.popchat(param);
+        config.chatings++;
+    } else {
+        xxim.tabchat(param);
+    }
+    config.chating[key] = param;
+
+    var chatbox = $('#layim_chatbox');
+    if(chatbox[0]){
+        node.layimMin.hide();
+        chatbox.parents('.xubox_layer').show();
+    }
+};
+
+//请求群员
+xxim.getGroups = function(param){
+    var keys = param.type + param.id, str = '',
+    groupss = xxim.chatbox.find('#layim_group'+ keys);
+    groupss.addClass('loading');
+    config.json(config.api.groups, {}, function(datas){
+        if(datas.status === 1){
+            var ii = 0, lens = datas.data.length;
+            if(lens > 0){
+                for(; ii < lens; ii++){
+                    str += '<li data-id="'+ datas.data[ii].id +'" type="one"><img src="'+ datas.data[ii].face +'" class="xxim_oneface"><span class="xxim_onename">'+ datas.data[ii].name +'</span></li>';
+                }
+            } else {
+                str = '<li class="layim_errors">没有群员</li>';
+            }
+
+        } else {
+            str = '<li class="layim_errors">'+ datas.msg +'</li>';
+        }
+        groupss.removeClass('loading');
+        groupss.html(str);
+    }, function(){
+        groupss.removeClass('loading');
+        groupss.html('<li class="layim_errors">请求异常</li>');
+    });
+};
+
+//消息传输
+xxim.transmit = function(){
+    var node = xxim.node, log = {};
+    node.sendbtn = $('#layim_sendbtn');
+    node.imwrite = $('#layim_write');
+
+    //发送
+    log.send = function(){
+        var data = {
+            content: node.imwrite.val(),
+            id: xxim.nowchat.id,
+            sign_key: '', //密匙
+            _: +new Date
+        };
+
+        if(data.content.replace(/\s/g, '') === ''){
+            layer.tips('说点啥呗!', '#layim_write', 2);
+            node.imwrite.focus();
+        } else {
+            //此处皆为模拟
+            var keys = xxim.nowchat.type + xxim.nowchat.id;
+
+            //聊天模版
+            log.html = function(param, type){
+                return '<li class="'+ (type === 'me' ? 'layim_chateme' : '') +'">'
+                    +'<div class="layim_chatuser">'
+                        + function(){
+                            if(type === 'me'){
+                                return '<span class="layim_chattime">'+ param.time +'</span>'
+                                       +'<span class="layim_chatname">'+ param.name +'</span>'
+                                       +'<img src="'+ param.face +'" >';
+                            } else {
+                                return '<img src="'+ param.face +'" >'
+                                       +'<span class="layim_chatname">'+ param.name +'</span>'
+                                       +'<span class="layim_chattime">'+ param.time +'</span>';
+                            }
+                        }()
+                    +'</div>'
+                    +'<div class="layim_chatsay">'+ param.content +'<em class="layim_zero"></em></div>'
+                +'</li>';
+            };
+
+            log.imarea = xxim.chatbox.find('#layim_area'+ keys);
+
+            log.imarea.append(log.html({
+                time: '2014-04-26 0:37',
+                name: config.user.name,
+                face: config.user.face,
+                content: data.content
+            }, 'me'));
+            node.imwrite.val('').focus();
+            log.imarea.scrollTop(log.imarea[0].scrollHeight);
+
+            setTimeout(function(){
+                log.imarea.append(log.html({
+                    time: '2014-04-26 0:38',
+                    name: xxim.nowchat.name,
+                    face: xxim.nowchat.face,
+                    content: config.autoReplay[(Math.random()*config.autoReplay.length) | 0]
+                }));
+                log.imarea.scrollTop(log.imarea[0].scrollHeight);
+            }, 500);
+
+            /*
+            that.json(config.api.sendurl, data, function(datas){
+
+            });
+            */
+        }
+
+    };
+    node.sendbtn.on('click', log.send);
+
+    node.imwrite.keyup(function(e){
+        if(e.keyCode === 13){
+            log.send();
+        }
+    });
+};
+
+//事件
+xxim.event = function(){
+    var node = xxim.node;
+
+    //主界面tab
+    node.tabs.eq(0).addClass('xxim_tabnow');
+    node.tabs.on('click', function(){
+        var othis = $(this), index = othis.index();
+        xxim.tabs(index);
+    });
+
+    //列表展收
+    node.list.on('click', 'h5', function(){
+        var othis = $(this), chat = othis.siblings('.xxim_chatlist'), parentss = othis.find("i");
+        if(parentss.hasClass('fa-caret-down')){
+            chat.hide();
+            parentss.attr('class','fa fa-caret-right');
+        } else {
+            chat.show();
+            parentss.attr('class','fa fa-caret-down');
+        }
+    });
+
+    //设置在线隐身
+    node.online.on('click', function(e){
+        config.stopMP(e);
+        node.setonline.show();
+    });
+    node.setonline.find('span').on('click', function(e){
+        var index = $(this).index();
+        config.stopMP(e);
+        if(index === 0){
+            node.onlinetex.html('在线');
+            node.online.removeClass('xxim_offline');
+        } else if(index === 1) {
+            node.onlinetex.html('隐身');
+            node.online.addClass('xxim_offline');
+        }
+        node.setonline.hide();
+    });
+
+    node.xximon.on('click', xxim.expend);
+    node.xximHide.on('click', xxim.expend);
+
+    //搜索
+    node.xximSearch.keyup(function(){
+        var val = $(this).val().replace(/\s/g, '');
+        if(val !== ''){
+            node.searchMian.show();
+            node.closeSearch.show();
+            //此处的搜索ajax参考xxim.getDates
+            node.list.eq(3).html('<li class="xxim_errormsg">没有符合条件的结果</li>');
+        } else {
+            node.searchMian.hide();
+            node.closeSearch.hide();
+        }
+    });
+    node.closeSearch.on('click', function(){
+        $(this).hide();
+        node.searchMian.hide();
+        node.xximSearch.val('').focus();
+    });
+
+    //弹出聊天窗
+    config.chatings = 0;
+    node.list.on('click', '.xxim_childnode', function(){
+        var othis = $(this);
+        xxim.popchatbox(othis);
+    });
+
+    //点击最小化栏
+    node.layimMin.on('click', function(){
+        $(this).hide();
+        $('#layim_chatbox').parents('.xubox_layer').show();
+    });
+
+
+    //document事件
+    dom[1].on('click', function(){
+        node.setonline.hide();
+        $('#layim_sendtype').hide();
+    });
+};
+
+//请求列表数据
+xxim.getDates = function(index){
+    var api = [config.api.friend, config.api.group, config.api.chatlog],
+        node = xxim.node, myf = node.list.eq(index);
+    myf.addClass('loading');
+    config.json(api[index], {}, function(datas){
+        if(datas.status === 1){
+            var i = 0, myflen = datas.data.length, str = '', item;
+            if(myflen > 1){
+                if(index !== 2){
+                    for(; i < myflen; i++){
+                        str += '<li data-id="'+ datas.data[i].id +'" class="xxim_parentnode">'
+                            +'<h5><i class="fa fa-caret-right"></i><span class="xxim_parentname">'+ datas.data[i].name +'</span><em class="xxim_nums">('+ datas.data[i].nums +')</em></h5>'
+                            +'<ul class="xxim_chatlist">';
+                        item = datas.data[i].item;
+                        for(var j = 0; j < item.length; j++){
+                            str += '<li data-id="'+ item[j].id +'" class="xxim_childnode" type="'+ (index === 0 ? 'one' : 'group') +'"><img src="'+ item[j].face +'" class="xxim_oneface"><span class="xxim_onename">'+ item[j].name +'</span></li>';
+                        }
+                        str += '</ul></li>';
+                    }
+                } else {
+                    str += '<li class="xxim_liston">'
+                        +'<ul class="xxim_chatlist">';
+                    for(; i < myflen; i++){
+                        str += '<li data-id="'+ datas.data[i].id +'" class="xxim_childnode" type="one"><img src="'+ datas.data[i].face +'"  class="xxim_oneface"><span  class="xxim_onename">'+ datas.data[i].name +'</span><em class="xxim_time">'+ datas.data[i].time +'</em></li>';
+                    }
+                    str += '</ul></li>';
+                }
+                myf.html(str);
+            } else {
+                myf.html('<li class="xxim_errormsg">没有任何数据</li>');
+            }
+            myf.removeClass('loading');
+        } else {
+            myf.html('<li class="xxim_errormsg">'+ datas.msg +'</li>');
+        }
+    }, function(){
+        myf.html('<li class="xxim_errormsg">请求失败</li>');
+        myf.removeClass('loading');
+    });
+};
+
+//渲染骨架
+xxim.view = (function(){
+    var xximNode = xxim.layimNode = $('<div id="xximmm" class="xxim_main">'
+            +'<div class="xxim_top" id="xxim_top">'
+            +'  <div class="xxim_search"><i class="fa fa-search"></i><input id="xxim_searchkey" /><span id="xxim_closesearch">×</span></div>'
+            +'  <div class="xxim_tabs" id="xxim_tabs"><span class="xxim_tabfriend" title="好友"><i class="fa fa-user"></i></span><span class="xxim_tabgroup" title="群组"><i class="fa fa-users"></i></span><span class="xxim_latechat"  title="最近聊天"><i class="fa fa-clock-o"></i></span></div>'
+            +'  <ul class="xxim_list" style="display:block"></ul>'
+            +'  <ul class="xxim_list"></ul>'
+            +'  <ul class="xxim_list"></ul>'
+            +'  <ul class="xxim_list xxim_searchmain" id="xxim_searchmain"></ul>'
+            +'</div>'
+            +'<ul class="xxim_bottom" id="xxim_bottom">'
+            +'<li class="xxim_online" id="xxim_online">'
+                +'<i class="xxim_nowstate fa fa-check-circle"></i><span id="xxim_onlinetex">在线</span>'
+                +'<div class="xxim_setonline">'
+                    +'<span><i class="fa fa-check-circle"></i>在线</span>'
+                    +'<span class="xxim_setoffline"><i class="fa fa-check-circle"></i>隐身</span>'
+                +'</div>'
+            +'</li>'
+            +'<li class="xxim_mymsg" id="xxim_mymsg" title="我的私信"><i class="fa fa-comment"></i><a href="'+ config.msgurl +'" target="_blank"></a></li>'
+            +'<li class="xxim_seter" id="xxim_seter" title="设置">'
+                +'<i class="fa fa-gear"></i>'
+                +'<div>'
+
+                +'</div>'
+            +'</li>'
+            +'<li class="xxim_hide" id="xxim_hide"><i class="fa fa-exchange"></i></li>'
+            +'<li id="xxim_on" class="xxim_icon xxim_on fa fa-ellipsis-v"></li>'
+            +'<div class="layim_min" id="layim_min"></div>'
+        +'</ul>'
+    +'</div>');
+    dom[3].append(xximNode);
+
+    xxim.renode();
+    xxim.getDates(0);
+    xxim.event();
+    xxim.layinit();
+}());
+
+}(window);
+
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/loading.gif b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/loading.gif
new file mode 100644
index 0000000..059b1ac
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/layim/loading.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/mobile/layer.js b/management/guns-admin/src/main/webapp/static/js/plugins/layer/mobile/layer.js
new file mode 100644
index 0000000..f9cf693
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/mobile/layer.js
@@ -0,0 +1,2 @@
+/*! layer mobile-v2.0.0 Web弹层组件 MIT License  http://layer.layui.com/mobile  By 贤心 */
+ ;!function(e){"use strict";var t=document,n="querySelectorAll",i="getElementsByClassName",a=function(e){return t[n](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 n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var r=0,o=["layui-m-layer"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement("div");e.id=s.id=o[0]+r,s.setAttribute("class",o[0]+" "+o[0]+(n.type||0)),s.setAttribute("index",r);var l=function(){var e="object"==typeof n.title;return n.title?'<h3 style="'+(e?n.title[1]:"")+'">'+(e?n.title[0]:n.title)+"</h3>":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e='<span yes type="1">'+n.btn[0]+"</span>",2===t&&(e='<span no type="0">'+n.btn[1]+"</span>"+e),'<div class="layui-m-layerbtn">'+e+"</div>"):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content='<i></i><i class="layui-m-layerload"></i><i></i><p>'+(n.content||"")+"</p>"),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"<div "+("string"==typeof n.shade?'style="'+n.shade+'"':"")+' class="layui-m-layershade"></div>':"")+'<div class="layui-m-layermain" '+(n.fixed?"":'style="position:static;"')+'><div class="layui-m-layersection"><div class="layui-m-layerchild '+(n.skin?"layui-m-layer-"+n.skin+" ":"")+(n.className?n.className:"")+" "+(n.anim?"layui-m-anim-"+n.anim:"")+'" '+(n.style?'style="'+n.style+'"':"")+">"+l+'<div class="layui-m-layercont">'+n.content+"</div>"+c+"</div></div></div>",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;o<r;o++)l.touch(s[o],a);if(e.shade&&e.shadeClose){var c=t[i]("layui-m-layershade")[0];l.touch(c,function(){layer.close(n.index,e.end)})}e.end&&(l.end[n.index]=e.end)},e.layer={v:"2.0",index:r,open:function(e){var t=new c(e||{});return t.index},close:function(e){var n=a("#"+o[0]+e)[0];n&&(n.innerHTML="",t.body.removeChild(n),clearTimeout(l.timer[e]),delete l.timer[e],"function"==typeof l.end[e]&&l.end[e](),delete l.end[e])},closeAll:function(){for(var e=t[i](o[0]),n=0,a=e.length;n<a;n++)layer.close(0|e[0].getAttribute("index"))}},"function"==typeof define?define(function(){return layer}):function(){var e=document.scripts,n=e[e.length-1],i=n.src,a=i.substring(0,i.lastIndexOf("/")+1);n.getAttribute("merge")||document.head.appendChild(function(){var e=t.createElement("link");return e.href=a+"need/layer.css?2.0",e.type="text/css",e.rel="styleSheet",e.id="layermcss",e}())}()}(window);
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/mobile/need/layer.css b/management/guns-admin/src/main/webapp/static/js/plugins/layer/mobile/need/layer.css
new file mode 100644
index 0000000..b9dbf20
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/mobile/need/layer.css
@@ -0,0 +1 @@
+.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon-ext.png b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon-ext.png
new file mode 100644
index 0000000..bbbb669
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon-ext.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon.png b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon.png
new file mode 100644
index 0000000..b5c8f1e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon_ext.png b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon_ext.png
new file mode 100644
index 0000000..8baee59
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/icon_ext.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-0.gif b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-0.gif
new file mode 100644
index 0000000..6f3c953
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-0.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-1.gif b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-1.gif
new file mode 100644
index 0000000..db3a483
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-1.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-2.gif b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-2.gif
new file mode 100644
index 0000000..5bb90fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/loading-2.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/textbg.png b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/textbg.png
new file mode 100644
index 0000000..ad1040c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/textbg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_ico0.png b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_ico0.png
new file mode 100644
index 0000000..7754a47
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_ico0.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading0.gif b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading0.gif
new file mode 100644
index 0000000..6f3c953
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading0.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading1.gif b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading1.gif
new file mode 100644
index 0000000..db3a483
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading1.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading2.gif b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading2.gif
new file mode 100644
index 0000000..5bb90fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading2.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading3.gif b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading3.gif
new file mode 100644
index 0000000..fbe57be
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_loading3.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_title0.png b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_title0.png
new file mode 100644
index 0000000..4ffbe31
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/default/xubox_title0.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/layer.css b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/layer.css
new file mode 100644
index 0000000..c6bc000
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/layer.css
@@ -0,0 +1,7 @@
+/*!
+
+ @Name: layer's style
+ @Author: 贤心
+ @Blog: sentsin.com
+
+ */*html{background-image:url(about:blank);background-attachment:fixed}html #layui_layer_skinlayercss{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{top:150px;left:50%;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;box-shadow:1px 1px 50px rgba(0,0,0,.3);border-radius:2px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.3);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-moves{position:absolute;border:3px solid #666;border:3px solid rgba(0,0,0,.5);cursor:move;background-color:#fff;background-color:rgba(255,255,255,.3);filter:alpha(opacity=50)}.layui-layer-load{background:url(default/loading-0.gif) center center no-repeat #fff}.layui-layer-ico{background:url(default/icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layui-anim{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layui-anim-close{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layui-anim-01{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layui-anim-02{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layui-anim-03{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layui-anim-04{-webkit-animation-name:rollIn;animation-name:rollIn}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-anim-05{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layui-anim-06{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#F8F8F8}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:0 -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-150px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-181px -31px}.layui-layer-btn{text-align:right;padding:0 10px 12px;pointer-events:auto}.layui-layer-btn a{height:28px;line-height:28px;margin:0 6px;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.7}.layui-layer-btn .layui-layer-btn0{border-color:#4898d5;background-color:#2e8ded;color:#fff}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;font-size:14px;overflow:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe .layui-layer-content{overflow:hidden}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(default/loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(default/loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(default/loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:5px 10px;font-size:12px;_float:left;border-radius:3px;box-shadow:1px 1px 3px rgba(0,0,0,.3);background-color:#F90;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#F90}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:1px;border-bottom-style:solid;border-bottom-color:#F90}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-lan .layui-layer-btn{padding:10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#BBB5B5;border:none}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/layer.ext.css b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/layer.ext.css
new file mode 100644
index 0000000..95c9bb4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/layer.ext.css
@@ -0,0 +1,8 @@
+/*!
+
+ @Name: layer拓展样式
+ @Date: 2012.12.13
+ @Author: 贤心
+ @blog: sentsin.com
+
+ */.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span{text-overflow:ellipsis;white-space:nowrap}.layui-layer-iconext{background:url(default/icon-ext.png) no-repeat}html #layui_layer_skinlayerextcss{display:none;position:absolute;width:1989px}.layui-layer-prompt .layui-layer-input{display:block;width:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:1s;animation-duration:1s;background:url(default/xubox_loading1.gif) center center no-repeat #000}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/moon/default.png b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/moon/default.png
new file mode 100644
index 0000000..77dfaf3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/moon/default.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/moon/style.css b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/moon/style.css
new file mode 100644
index 0000000..8a00dc3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/skin/moon/style.css
@@ -0,0 +1,141 @@
+/*
+ * layer皮肤
+ * 作者:一☆隐☆一
+ * QQ:9073194
+ * 请保留这里的信息 谢谢!虽然你不保留我也不能把你怎么样!
+ */
+
+html #layui_layer_skinmoonstylecss {
+	display: none;
+	position: absolute;
+	width: 1989px;
+}
+body .layer-ext-moon[type="dialog"] {
+	min-width: 320px;
+}
+body .layer-ext-moon-msg[type="dialog"]{min-width:200px;}
+body .layer-ext-moon .layui-layer-title {
+	background: #f6f6f6;
+	color: #212a31;
+	font-size: 16px;
+	font-weight: bold;
+	height: 46px;
+	line-height: 46px;
+}
+
+
+
+body .layer-ext-moon .layui-layer-content .layui-layer-ico {
+	height: 32px;
+	width: 32px;
+	top:18.5px;
+}
+body .layer-ext-moon .layui-layer-ico0 {
+	background: url(default.png) no-repeat -96px 0;
+	;
+}
+body .layer-ext-moon .layui-layer-ico1 {
+	background: url(default.png) no-repeat -224px 0;
+	;
+}
+body .layer-ext-moon .layui-layer-ico2 {
+	background: url(default.png) no-repeat -192px 0;
+}
+body .layer-ext-moon .layui-layer-ico3 {
+	background: url(default.png) no-repeat -160px 0;
+}
+body .layer-ext-moon .layui-layer-ico4 {
+	background: url(default.png) no-repeat -320px 0;
+}
+body .layer-ext-moon .layui-layer-ico5 {
+	background: url(default.png) no-repeat -288px 0;
+}
+body .layer-ext-moon .layui-layer-ico6 {
+	background: url(default.png) -256px 0;
+}
+body .layer-ext-moon .layui-layer-ico7 {
+	background: url(default.png) no-repeat -128px 0;
+}
+body .layer-ext-moon .layui-layer-setwin {
+	top: 15px;
+	right: 15px;
+}
+body .layer-ext-moon .layui-layer-setwin a {
+	width: 16px;
+	height: 16px;
+}
+body .layer-ext-moon .layui-layer-setwin .layui-layer-min cite:hover {
+	background-color: #56abe4;
+}
+body .layer-ext-moon .layui-layer-setwin .layui-layer-max {
+	background: url(default.png) no-repeat -80px 0;
+}
+body .layer-ext-moon .layui-layer-setwin .layui-layer-max:hover {
+	background: url(default.png) no-repeat -64px 0;
+}
+body .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin {
+	background: url(default.png) no-repeat -32px 0;
+}
+body .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin:hover {
+	background: url(default.png) no-repeat -16px 0;
+}
+body .layer-ext-moon .layui-layer-setwin .layui-layer-close1,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2 {
+	background: url(default.png) 0 0;
+}
+body .layer-ext-moon .layui-layer-setwin .layui-layer-close1:hover,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2:hover {
+	background: url(default.png) -48px 0;
+}
+body .layer-ext-moon .layui-layer-padding{padding-top: 24px;}
+body .layer-ext-moon .layui-layer-btn {
+	padding: 15px 0;
+	background: #f0f4f7;
+	border-top: 1px #c7c7c7 solid;
+}
+body .layer-ext-moon .layui-layer-btn a {
+	font-size: 12px;
+	font-weight: normal;
+	margin: 0 3px;
+	margin-right: 7px;
+	margin-left: 7px;
+	padding: 6px 20px;
+	color: #fff;
+	border: 1px solid #0064b6;
+	background: #0071ce;
+	border-radius: 3px;
+	display: inline-block;
+	height: 20px;
+	line-height: 20px;
+	text-align: center;
+	vertical-align: middle;
+	background-repeat: no-repeat;
+	text-decoration: none;
+	outline: none;
+	-moz-box-sizing: content-box;
+	-webkit-box-sizing: content-box;
+	box-sizing: content-box;
+}
+body .layer-ext-moon .layui-layer-btn .layui-layer-btn0 {
+	background: #0071ce;
+}
+body .layer-ext-moon .layui-layer-btn .layui-layer-btn1 {
+	background: #fff;
+	color: #404a58;
+	border: 1px solid #c0c4cd;
+	border-radius: 3px;
+}
+body .layer-ext-moon .layui-layer-btn .layui-layer-btn2 {
+	background: #f60;
+	color: #fff;
+	border: 1px solid #f60;
+	border-radius: 3px;
+}
+body .layer-ext-moon .layui-layer-btn .layui-layer-btn3 {
+	background: #f00;
+	color: #fff;
+	border: 1px solid #f00;
+	border-radius: 3px;
+}
+
+body .layer-ext-moon .layui-layer-title span.layui-layer-tabnow{
+	height:46px;
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/icon-ext.png b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/icon-ext.png
new file mode 100644
index 0000000..bbbb669
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/icon-ext.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/icon.png b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/icon.png
new file mode 100644
index 0000000..3e17da8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/icon.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/layer.css b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/layer.css
new file mode 100644
index 0000000..820b4a9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/layer.css
@@ -0,0 +1 @@
+.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-0.gif b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-0.gif
new file mode 100644
index 0000000..6f3c953
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-0.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-1.gif b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-1.gif
new file mode 100644
index 0000000..db3a483
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-1.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-2.gif b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-2.gif
new file mode 100644
index 0000000..5bb90fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/layer/theme/default/loading-2.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/metisMenu/jquery.metisMenu.js b/management/guns-admin/src/main/webapp/static/js/plugins/metisMenu/jquery.metisMenu.js
new file mode 100644
index 0000000..a04cdb0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/metisMenu/jquery.metisMenu.js
@@ -0,0 +1,120 @@
+/*
+ * metismenu - v1.1.3
+ * Easy menu jQuery plugin for Twitter Bootstrap 3
+ * https://github.com/onokumus/metisMenu
+ *
+ * Made by Osman Nuri Okumus
+ * Under MIT License
+ */
+;(function($, window, document, undefined) {
+
+    var pluginName = "metisMenu",
+        defaults = {
+            toggle: true,
+            doubleTapToGo: false
+        };
+
+    function Plugin(element, options) {
+        this.element = $(element);
+        this.settings = $.extend({}, defaults, options);
+        this._defaults = defaults;
+        this._name = pluginName;
+        this.init();
+    }
+
+    Plugin.prototype = {
+        init: function() {
+
+            var $this = this.element,
+                $toggle = this.settings.toggle,
+                obj = this;
+
+            if (this.isIE() <= 9) {
+                $this.find("li.active").has("ul").children("ul").collapse("show");
+                $this.find("li").not(".active").has("ul").children("ul").collapse("hide");
+            } else {
+                $this.find("li.active").has("ul").children("ul").addClass("collapse in");
+                $this.find("li").not(".active").has("ul").children("ul").addClass("collapse");
+            }
+
+            //add the "doubleTapToGo" class to active items if needed
+            if (obj.settings.doubleTapToGo) {
+                $this.find("li.active").has("ul").children("a").addClass("doubleTapToGo");
+            }
+
+            $this.find("li").has("ul").children("a").on("click" + "." + pluginName, function(e) {
+                e.preventDefault();
+
+                //Do we need to enable the double tap
+                if (obj.settings.doubleTapToGo) {
+
+                    //if we hit a second time on the link and the href is valid, navigate to that url
+                    if (obj.doubleTapToGo($(this)) && $(this).attr("href") !== "#" && $(this).attr("href") !== "") {
+                        e.stopPropagation();
+                        document.location = $(this).attr("href");
+                        return;
+                    }
+                }
+
+                $(this).parent("li").toggleClass("active").children("ul").collapse("toggle");
+
+                if ($toggle) {
+                    $(this).parent("li").siblings().removeClass("active").children("ul.in").collapse("hide");
+                }
+
+            });
+        },
+
+        isIE: function() { //https://gist.github.com/padolsey/527683
+            var undef,
+                v = 3,
+                div = document.createElement("div"),
+                all = div.getElementsByTagName("i");
+
+            while (
+                div.innerHTML = "<!--[if gt IE " + (++v) + "]><i></i><![endif]-->",
+                    all[0]
+                ) {
+                return v > 4 ? v : undef;
+            }
+        },
+
+        //Enable the link on the second click.
+        doubleTapToGo: function(elem) {
+            var $this = this.element;
+
+            //if the class "doubleTapToGo" exists, remove it and return
+            if (elem.hasClass("doubleTapToGo")) {
+                elem.removeClass("doubleTapToGo");
+                return true;
+            }
+
+            //does not exists, add a new class and return false
+            if (elem.parent().children("ul").length) {
+                //first remove all other class
+                $this.find(".doubleTapToGo").removeClass("doubleTapToGo");
+                //add the class on the current element
+                elem.addClass("doubleTapToGo");
+                return false;
+            }
+        },
+
+        remove: function() {
+            this.element.off("." + pluginName);
+            this.element.removeData(pluginName);
+        }
+
+    };
+
+    $.fn[pluginName] = function(options) {
+        this.each(function () {
+            var el = $(this);
+            if (el.data(pluginName)) {
+                el.data(pluginName).remove();
+            }
+            el.data(pluginName, new Plugin(this, options));
+        });
+        return this;
+    };
+
+})(jQuery, window, document);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/pace/pace.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/pace/pace.min.js
new file mode 100644
index 0000000..134dcac
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/pace/pace.min.js
@@ -0,0 +1,2 @@
+/*! pace 0.5.1 */
+(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W=[].slice,X={}.hasOwnProperty,Y=function(a,b){function c(){this.constructor=a}for(var d in b)X.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},Z=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};for(t={catchupTime:500,initialRate:.03,minTime:500,ghostTime:500,maxProgressPerFrame:10,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},B=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance?"function"==typeof performance.now?performance.now():void 0:void 0)?a:+new Date},D=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,s=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==D&&(D=function(a){return setTimeout(a,50)},s=function(a){return clearTimeout(a)}),F=function(a){var b,c;return b=B(),(c=function(){var d;return d=B()-b,d>=33?(b=B(),a(d,function(){return D(c)})):setTimeout(c,33-d)})()},E=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?W.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},u=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?W.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)X.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?u(b[a],e):b[a]=e);return b},p=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},w=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];c<this.bindings[a].length;)this.bindings[a][c].handler===b?e.push(this.bindings[a].splice(c,1)):e.push(c++);return e}},a.prototype.trigger=function(){var a,b,c,d,e,f,g,h,i;if(c=arguments[0],a=2<=arguments.length?W.call(arguments,1):[],null!=(g=this.bindings)?g[c]:void 0){for(e=0,i=[];e<this.bindings[c].length;)h=this.bindings[c][e],d=h.handler,b=h.ctx,f=h.once,d.apply(null!=b?b:this,a),f?i.push(this.bindings[c].splice(e,1)):i.push(e++);return i}},a}(),null==window.Pace&&(window.Pace={}),u(Pace,g.prototype),C=Pace.options=u({},t,window.paceOptions,w()),T=["ajax","document","eventLag","elements"],P=0,R=T.length;R>P;P++)J=T[P],C[J]===!0&&(C[J]=t[J]);i=function(a){function b(){return U=b.__super__.constructor.apply(this,arguments)}return Y(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(C.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='<div class="pace-progress">\n  <div class="pace-progress-inner"></div>\n</div>\n<div class="pace-activity"></div>',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b;return null==document.querySelector(C.target)?!1:(a=this.getElement(),a.children[0].style.width=""+this.progress+"%",(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?b="99":(b=this.progress<10?"0":"",b+=0|this.progress),a.children[0].setAttribute("data-progress",""+b)),this.lastRenderedProgress=this.progress)},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),O=window.XMLHttpRequest,N=window.XDomainRequest,M=window.WebSocket,v=function(a,b){var c,d,e,f;f=[];for(d in b.prototype)try{e=b.prototype[d],null==a[d]&&"function"!=typeof e?f.push(a[d]=e):f.push(void 0)}catch(g){c=g}return f},z=[],Pace.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?W.call(arguments,1):[],z.unshift("ignore"),c=b.apply(null,a),z.shift(),c},Pace.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?W.call(arguments,1):[],z.unshift("track"),c=b.apply(null,a),z.shift(),c},I=function(a){var b;if(null==a&&(a="GET"),"track"===z[0])return"force";if(!z.length&&C.ajax){if("socket"===a&&C.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),Z.call(C.ajax.trackMethods,b)>=0)return!0}return!1},j=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return I(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new O(b),a(c),c},v(window.XMLHttpRequest,O),null!=N&&(window.XDomainRequest=function(){var b;return b=new N,a(b),b},v(window.XDomainRequest,N)),null!=M&&C.ajax.trackWebSockets&&(window.WebSocket=function(a,b){var d;return d=null!=b?new M(a,b):new M(a),I("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d},v(window.WebSocket,M))}return Y(b,a),b}(h),Q=null,x=function(){return null==Q&&(Q=new j),Q},H=function(a){var b,c,d,e;for(e=C.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},x().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,H(g)?void 0:Pace.running||C.restartOnRequestAfter===!1&&"force"!==I(f)?void 0:(d=arguments,c=C.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,j;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(Pace.restart(),i=Pace.sources,j=[],c=0,g=i.length;g>c;c++){if(J=i[c],J instanceof a){J.watch.apply(J,d);break}j.push(void 0)}return j}},c))}),a=function(){function a(){var a=this;this.elements=[],x().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,H(e)?void 0:(c="socket"===d?new m(b):new n(b),this.elements.push(c))},a}(),n=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2}),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100});else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),m=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100})}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},C.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=B(),b=setInterval(function(){var g;return g=B()-c-50,c=B(),e.push(g),e.length>C.eventLag.sampleCount&&e.shift(),a=p(e),++d>=C.eventLag.minSamples&&a<C.eventLag.lagThreshold?(f.progress=100,clearInterval(b)):f.progress=100*(3/(a+3))},50)}return a}(),l=function(){function a(a){this.source=a,this.last=this.sinceLastUpdate=0,this.rate=C.initialRate,this.catchup=0,this.progress=this.lastProgress=0,null!=this.source&&(this.progress=E(this.source,"progress"))}return a.prototype.tick=function(a,b){var c;return null==b&&(b=E(this.source,"progress")),b>=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/C.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,C.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+C.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),K=null,G=null,q=null,L=null,o=null,r=null,Pace.running=!1,y=function(){return C.restartOnPushState?Pace.restart():void 0},null!=window.history.pushState&&(S=window.history.pushState,window.history.pushState=function(){return y(),S.apply(window.history,arguments)}),null!=window.history.replaceState&&(V=window.history.replaceState,window.history.replaceState=function(){return y(),V.apply(window.history,arguments)}),k={ajax:a,elements:d,document:c,eventLag:f},(A=function(){var a,c,d,e,f,g,h,i;for(Pace.sources=K=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],C[a]!==!1&&K.push(new k[a](C[a]));for(i=null!=(h=C.extraSources)?h:[],d=0,f=i.length;f>d;d++)J=i[d],K.push(new J(C));return Pace.bar=q=new b,G=[],L=new l})(),Pace.stop=function(){return Pace.trigger("stop"),Pace.running=!1,q.destroy(),r=!0,null!=o&&("function"==typeof s&&s(o),o=null),A()},Pace.restart=function(){return Pace.trigger("restart"),Pace.stop(),Pace.start()},Pace.go=function(){var a;return Pace.running=!0,q.render(),a=B(),r=!1,o=F(function(b,c){var d,e,f,g,h,i,j,k,m,n,o,p,s,t,u,v;for(k=100-q.progress,e=o=0,f=!0,i=p=0,t=K.length;t>p;i=++p)for(J=K[i],n=null!=G[i]?G[i]:G[i]=[],h=null!=(v=J.elements)?v:[J],j=s=0,u=h.length;u>s;j=++s)g=h[j],m=null!=n[j]?n[j]:n[j]=new l(g),f&=m.done,m.done||(e++,o+=m.tick(b));return d=o/e,q.update(L.tick(b,d)),q.done()||f||r?(q.update(100),Pace.trigger("done"),setTimeout(function(){return q.finish(),Pace.running=!1,Pace.trigger("hide")},Math.max(C.ghostTime,Math.max(C.minTime-(B()-a),0)))):c()})},Pace.start=function(a){u(C,a),Pace.running=!0;try{q.render()}catch(b){i=b}return document.querySelector(".pace")?(Pace.trigger("start"),Pace.go()):setTimeout(Pace.start,50)},"function"==typeof define&&define.amd?define(function(){return Pace}):"object"==typeof exports?module.exports=Pace:C.startOnPageLoad&&Pace.start()}).call(this);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/slimscroll/jquery.slimscroll.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/slimscroll/jquery.slimscroll.min.js
new file mode 100644
index 0000000..ee047a1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/slimscroll/jquery.slimscroll.min.js
@@ -0,0 +1,15 @@
+/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ *
+ * Version: 1.3.0
+ *
+ */
+(function(f){jQuery.fn.extend({slimScroll:function(h){var a=f.extend({width:"auto",height:"250px",size:"3px",color:"#a7b1c2",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:0.2,railDraggable:!0,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"},h);this.each(function(){function r(d){if(s){d=d||
+window.event;var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);f(d.target||d.srcTarget||d.srcElement).closest("."+a.wrapperClass).is(b.parent())&&m(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function m(d,f,h){k=!1;var e=d,g=b.outerHeight()-c.outerHeight();f&&(e=parseInt(c.css("top"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),e=Math.min(Math.max(e,0),g),e=0<d?Math.ceil(e):Math.floor(e),c.css({top:e+"px"}));l=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());
+e=l*(b[0].scrollHeight-b.outerHeight());h&&(e=d,d=e/b[0].scrollHeight*b.outerHeight(),d=Math.min(Math.max(d,0),g),c.css({top:d+"px"}));b.scrollTop(e);b.trigger("slimscrolling",~~e);v();p()}function C(){window.addEventListener?(this.addEventListener("DOMMouseScroll",r,!1),this.addEventListener("mousewheel",r,!1),this.addEventListener("MozMousePixelScroll",r,!1)):document.attachEvent("onmousewheel",r)}function w(){u=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),D);c.css({height:u+"px"});
+var a=u==b.outerHeight()?"none":"block";c.css({display:a})}function v(){w();clearTimeout(A);l==~~l?(k=a.allowPageScroll,B!=l&&b.trigger("slimscroll",0==~~l?"top":"bottom")):k=!1;B=l;u>=b.outerHeight()?k=!0:(c.stop(!0,!0).fadeIn("fast"),a.railVisible&&g.stop(!0,!0).fadeIn("fast"))}function p(){a.alwaysVisible||(A=setTimeout(function(){a.disableFadeOut&&s||(x||y)||(c.fadeOut("slow"),g.fadeOut("slow"))},1E3))}var s,x,y,A,z,u,l,B,D=30,k=!1,b=f(this);if(b.parent().hasClass(a.wrapperClass)){var n=b.scrollTop(),
+c=b.parent().find("."+a.barClass),g=b.parent().find("."+a.railClass);w();if(f.isPlainObject(h)){if("height"in h&&"auto"==h.height){b.parent().css("height","auto");b.css("height","auto");var q=b.parent().parent().height();b.parent().css("height",q);b.css("height",q)}if("scrollTo"in h)n=parseInt(a.scrollTo);else if("scrollBy"in h)n+=parseInt(a.scrollBy);else if("destroy"in h){c.remove();g.remove();b.unwrap();return}m(n,!1,!0)}}else{a.height="auto"==a.height?b.parent().height():a.height;n=f("<div></div>").addClass(a.wrapperClass).css({position:"relative",width:a.width,height:a.height});b.css({width:a.width,height:a.height});var g=f("<div></div>").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=f("<div></div>").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible?
+"block":"none","border-radius":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,WebkitBorderRadius:a.borderRadius,zIndex:99}),q="right"==a.position?{right:a.distance}:{left:a.distance};g.css(q);c.css(q);b.wrap(n);b.parent().append(c);b.parent().append(g);a.railDraggable&&c.bind("mousedown",function(a){var b=f(document);y=!0;t=parseFloat(c.css("top"));pageY=a.pageY;b.bind("mousemove.slimscroll",function(a){currTop=t+a.pageY-pageY;c.css("top",currTop);m(0,c.position().top,!1)});
+b.bind("mouseup.slimscroll",function(a){y=!1;p();b.unbind(".slimscroll")});return!1}).bind("selectstart.slimscroll",function(a){a.stopPropagation();a.preventDefault();return!1});g.hover(function(){v()},function(){p()});c.hover(function(){x=!0},function(){x=!1});b.hover(function(){s=!0;v();p()},function(){s=!1;p()});b.bind("touchstart",function(a,b){a.originalEvent.touches.length&&(z=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&&
+(m((z-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),z=b.originalEvent.touches[0].pageY)});w();"bottom"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),m(0,!0)):"top"!==a.start&&(m(f(a.start).position().top,null,!0),a.alwaysVisible||c.hide());C()}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/sweetalert/sweetalert.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/sweetalert/sweetalert.min.js
new file mode 100644
index 0000000..c1e4b73
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/sweetalert/sweetalert.min.js
@@ -0,0 +1 @@
+!function(e,t,n){"use strict";!function o(e,t,n){function a(s,l){if(!t[s]){if(!e[s]){var i="function"==typeof require&&require;if(!l&&i)return i(s,!0);if(r)return r(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var c=t[s]={exports:{}};e[s][0].call(c.exports,function(t){var n=e[s][1][t];return a(n?n:t)},c,c.exports,o,e,t,n)}return t[s].exports}for(var r="function"==typeof require&&require,s=0;s<n.length;s++)a(n[s]);return a}({1:[function(o){var a,r,s,l,i=function(e){return e&&e.__esModule?e:{"default":e}},u=o("./modules/handle-dom"),c=o("./modules/utils"),d=o("./modules/handle-swal-dom"),f=o("./modules/handle-click"),p=o("./modules/handle-key"),m=i(p),v=o("./modules/default-params"),y=i(v),h=o("./modules/set-params"),g=i(h);s=l=function(){function o(e){var t=s;return t[e]===n?y["default"][e]:t[e]}var s=arguments[0];if(u.addClass(t.body,"stop-scrolling"),d.resetInput(),s===n)return c.logStr("SweetAlert expects at least 1 attribute!"),!1;var l=c.extend({},y["default"]);switch(typeof s){case"string":l.title=s,l.text=arguments[1]||"",l.type=arguments[2]||"";break;case"object":if(s.title===n)return c.logStr('Missing "title" argument!'),!1;l.title=s.title;for(var i in y["default"])l[i]=o(i);l.confirmButtonText=l.showCancelButton?"Confirm":y["default"].confirmButtonText,l.confirmButtonText=o("confirmButtonText"),l.doneFunction=arguments[1]||null;break;default:return c.logStr('Unexpected type of argument! Expected "string" or "object", got '+typeof s),!1}g["default"](l),d.fixVerticalPosition(),d.openModal(arguments[1]);for(var p=d.getModal(),v=p.querySelectorAll("button"),h=["onclick","onmouseover","onmouseout","onmousedown","onmouseup","onfocus"],b=function(e){return f.handleButton(e,l,p)},w=0;w<v.length;w++)for(var C=0;C<h.length;C++){var S=h[C];v[w][S]=b}d.getOverlay().onclick=b,a=e.onkeydown;var x=function(e){return m["default"](e,l,p)};e.onkeydown=x,e.onfocus=function(){setTimeout(function(){r!==n&&(r.focus(),r=n)},0)}},s.setDefaults=l.setDefaults=function(e){if(!e)throw new Error("userParams is required");if("object"!=typeof e)throw new Error("userParams has to be a object");c.extend(y["default"],e)},s.close=l.close=function(){var o=d.getModal();u.fadeOut(d.getOverlay(),5),u.fadeOut(o,5),u.removeClass(o,"showSweetAlert"),u.addClass(o,"hideSweetAlert"),u.removeClass(o,"visible");var s=o.querySelector(".sa-icon.sa-success");u.removeClass(s,"animate"),u.removeClass(s.querySelector(".sa-tip"),"animateSuccessTip"),u.removeClass(s.querySelector(".sa-long"),"animateSuccessLong");var l=o.querySelector(".sa-icon.sa-error");u.removeClass(l,"animateErrorIcon"),u.removeClass(l.querySelector(".sa-x-mark"),"animateXMark");var i=o.querySelector(".sa-icon.sa-warning");return u.removeClass(i,"pulseWarning"),u.removeClass(i.querySelector(".sa-body"),"pulseWarningIns"),u.removeClass(i.querySelector(".sa-dot"),"pulseWarningIns"),setTimeout(function(){var e=o.getAttribute("data-custom-class");u.removeClass(o,e)},300),u.removeClass(t.body,"stop-scrolling"),e.onkeydown=a,e.previousActiveElement&&e.previousActiveElement.focus(),r=n,clearTimeout(o.timeout),!0},s.showInputError=l.showInputError=function(e){var t=d.getModal(),n=t.querySelector(".sa-input-error");u.addClass(n,"show");var o=t.querySelector(".sa-error-container");u.addClass(o,"show"),o.querySelector("p").innerHTML=e,t.querySelector("input").focus()},s.resetInputError=l.resetInputError=function(e){if(e&&13===e.keyCode)return!1;var t=d.getModal(),n=t.querySelector(".sa-input-error");u.removeClass(n,"show");var o=t.querySelector(".sa-error-container");u.removeClass(o,"show")},"undefined"!=typeof e?e.sweetAlert=e.swal=s:c.logStr("SweetAlert is a frontend module!")},{"./modules/default-params":2,"./modules/handle-click":3,"./modules/handle-dom":4,"./modules/handle-key":5,"./modules/handle-swal-dom":6,"./modules/set-params":8,"./modules/utils":9}],2:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var o={title:"",text:"",type:null,allowOutsideClick:!1,showConfirmButton:!0,showCancelButton:!1,closeOnConfirm:!0,closeOnCancel:!0,confirmButtonText:"OK",confirmButtonColor:"#AEDEF4",cancelButtonText:"取消",imageUrl:null,imageSize:null,timer:null,customClass:"",html:!1,animation:!0,allowEscapeKey:!0,inputType:"text",inputPlaceholder:"",inputValue:""};n["default"]=o,t.exports=n["default"]},{}],3:[function(t,n,o){Object.defineProperty(o,"__esModule",{value:!0});var a=t("./utils"),r=(t("./handle-swal-dom"),t("./handle-dom")),s=function(t,n,o){function s(e){m&&n.confirmButtonColor&&(p.style.backgroundColor=e)}var u,c,d,f=t||e.event,p=f.target||f.srcElement,m=-1!==p.className.indexOf("confirm"),v=-1!==p.className.indexOf("sweet-overlay"),y=r.hasClass(o,"visible"),h=n.doneFunction&&"true"===o.getAttribute("data-has-done-function");switch(m&&n.confirmButtonColor&&(u=n.confirmButtonColor,c=a.colorLuminance(u,-.04),d=a.colorLuminance(u,-.14)),f.type){case"mouseover":s(c);break;case"mouseout":s(u);break;case"mousedown":s(d);break;case"mouseup":s(c);break;case"focus":var g=o.querySelector("button.confirm"),b=o.querySelector("button.cancel");m?b.style.boxShadow="none":g.style.boxShadow="none";break;case"click":var w=o===p,C=r.isDescendant(o,p);if(!w&&!C&&y&&!n.allowOutsideClick)break;m&&h&&y?l(o,n):h&&y||v?i(o,n):r.isDescendant(o,p)&&"BUTTON"===p.tagName&&sweetAlert.close()}},l=function(e,t){var n=!0;r.hasClass(e,"show-input")&&(n=e.querySelector("input").value,n||(n="")),t.doneFunction(n),t.closeOnConfirm&&sweetAlert.close()},i=function(e,t){var n=String(t.doneFunction).replace(/\s/g,""),o="function("===n.substring(0,9)&&")"!==n.substring(9,10);o&&t.doneFunction(!1),t.closeOnCancel&&sweetAlert.close()};o["default"]={handleButton:s,handleConfirm:l,handleCancel:i},n.exports=o["default"]},{"./handle-dom":4,"./handle-swal-dom":6,"./utils":9}],4:[function(n,o,a){Object.defineProperty(a,"__esModule",{value:!0});var r=function(e,t){return new RegExp(" "+t+" ").test(" "+e.className+" ")},s=function(e,t){r(e,t)||(e.className+=" "+t)},l=function(e,t){var n=" "+e.className.replace(/[\t\r\n]/g," ")+" ";if(r(e,t)){for(;n.indexOf(" "+t+" ")>=0;)n=n.replace(" "+t+" "," ");e.className=n.replace(/^\s+|\s+$/g,"")}},i=function(e){var n=t.createElement("div");return n.appendChild(t.createTextNode(e)),n.innerHTML},u=function(e){e.style.opacity="",e.style.display="block"},c=function(e){if(e&&!e.length)return u(e);for(var t=0;t<e.length;++t)u(e[t])},d=function(e){e.style.opacity="",e.style.display="none"},f=function(e){if(e&&!e.length)return d(e);for(var t=0;t<e.length;++t)d(e[t])},p=function(e,t){for(var n=t.parentNode;null!==n;){if(n===e)return!0;n=n.parentNode}return!1},m=function(e){e.style.left="-9999px",e.style.display="block";var t,n=e.clientHeight;return t="undefined"!=typeof getComputedStyle?parseInt(getComputedStyle(e).getPropertyValue("padding-top"),10):parseInt(e.currentStyle.padding),e.style.left="",e.style.display="none","-"+parseInt((n+t)/2)+"px"},v=function(e,t){if(+e.style.opacity<1){t=t||16,e.style.opacity=0,e.style.display="block";var n=+new Date,o=function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(){e.style.opacity=+e.style.opacity+(new Date-n)/100,n=+new Date,+e.style.opacity<1&&setTimeout(o,t)});o()}e.style.display="block"},y=function(e,t){t=t||16,e.style.opacity=1;var n=+new Date,o=function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(){e.style.opacity=+e.style.opacity-(new Date-n)/100,n=+new Date,+e.style.opacity>0?setTimeout(o,t):e.style.display="none"});o()},h=function(n){if("function"==typeof MouseEvent){var o=new MouseEvent("click",{view:e,bubbles:!1,cancelable:!0});n.dispatchEvent(o)}else if(t.createEvent){var a=t.createEvent("MouseEvents");a.initEvent("click",!1,!1),n.dispatchEvent(a)}else t.createEventObject?n.fireEvent("onclick"):"function"==typeof n.onclick&&n.onclick()},g=function(t){"function"==typeof t.stopPropagation?(t.stopPropagation(),t.preventDefault()):e.event&&e.event.hasOwnProperty("cancelBubble")&&(e.event.cancelBubble=!0)};a.hasClass=r,a.addClass=s,a.removeClass=l,a.escapeHtml=i,a._show=u,a.show=c,a._hide=d,a.hide=f,a.isDescendant=p,a.getTopMargin=m,a.fadeIn=v,a.fadeOut=y,a.fireClick=h,a.stopEventPropagation=g},{}],5:[function(t,o,a){Object.defineProperty(a,"__esModule",{value:!0});var r=t("./handle-dom"),s=t("./handle-swal-dom"),l=function(t,o,a){var l=t||e.event,i=l.keyCode||l.which,u=a.querySelector("button.confirm"),c=a.querySelector("button.cancel"),d=a.querySelectorAll("button[tabindex]");if(-1!==[9,13,32,27].indexOf(i)){for(var f=l.target||l.srcElement,p=-1,m=0;m<d.length;m++)if(f===d[m]){p=m;break}9===i?(f=-1===p?u:p===d.length-1?d[0]:d[p+1],r.stopEventPropagation(l),f.focus(),o.confirmButtonColor&&s.setFocusStyle(f,o.confirmButtonColor)):13===i?("INPUT"===f.tagName&&(f=u,u.focus()),f=-1===p?u:n):27===i&&o.allowEscapeKey===!0?(f=c,r.fireClick(f,l)):f=n}};a["default"]=l,o.exports=a["default"]},{"./handle-dom":4,"./handle-swal-dom":6}],6:[function(n,o,a){var r=function(e){return e&&e.__esModule?e:{"default":e}};Object.defineProperty(a,"__esModule",{value:!0});var s=n("./utils"),l=n("./handle-dom"),i=n("./default-params"),u=r(i),c=n("./injected-html"),d=r(c),f=".sweet-alert",p=".sweet-overlay",m=function(){var e=t.createElement("div");for(e.innerHTML=d["default"];e.firstChild;)t.body.appendChild(e.firstChild)},v=function(e){function t(){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(){var e=t.querySelector(f);return e||(m(),e=v()),e}),y=function(){var e=v();return e?e.querySelector("input"):void 0},h=function(){return t.querySelector(p)},g=function(e,t){var n=s.hexToRgb(t);e.style.boxShadow="0 0 2px rgba("+n+", 0.8), inset 0 0 0 1px rgba(0, 0, 0, 0.05)"},b=function(n){var o=v();l.fadeIn(h(),10),l.show(o),l.addClass(o,"showSweetAlert"),l.removeClass(o,"hideSweetAlert"),e.previousActiveElement=t.activeElement;var a=o.querySelector("button.confirm");a.focus(),setTimeout(function(){l.addClass(o,"visible")},500);var r=o.getAttribute("data-timer");if("null"!==r&&""!==r){var s=n;o.timeout=setTimeout(function(){var e=(s||null)&&"true"===o.getAttribute("data-has-done-function");e?s(null):sweetAlert.close()},r)}},w=function(){var e=v(),t=y();l.removeClass(e,"show-input"),t.value=u["default"].inputValue,t.setAttribute("type",u["default"].inputType),t.setAttribute("placeholder",u["default"].inputPlaceholder),C()},C=function(e){if(e&&13===e.keyCode)return!1;var t=v(),n=t.querySelector(".sa-input-error");l.removeClass(n,"show");var o=t.querySelector(".sa-error-container");l.removeClass(o,"show")},S=function(){var e=v();e.style.marginTop=l.getTopMargin(v())};a.sweetAlertInitialize=m,a.getModal=v,a.getOverlay=h,a.getInput=y,a.setFocusStyle=g,a.openModal=b,a.resetInput=w,a.resetInputError=C,a.fixVerticalPosition=S},{"./default-params":2,"./handle-dom":4,"./injected-html":7,"./utils":9}],7:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var o='<div class="sweet-overlay" tabIndex="-1"></div><div class="sweet-alert"><div class="sa-icon sa-error">\n      <span class="sa-x-mark">\n        <span class="sa-line sa-left"></span>\n        <span class="sa-line sa-right"></span>\n      </span>\n    </div><div class="sa-icon sa-warning">\n      <span class="sa-body"></span>\n      <span class="sa-dot"></span>\n    </div><div class="sa-icon sa-info"></div><div class="sa-icon sa-success">\n      <span class="sa-line sa-tip"></span>\n      <span class="sa-line sa-long"></span>\n\n      <div class="sa-placeholder"></div>\n      <div class="sa-fix"></div>\n    </div><div class="sa-icon sa-custom"></div><h2>Title</h2>\n    <p>Text</p>\n    <fieldset>\n      <input type="text" tabIndex="3" />\n      <div class="sa-input-error"></div>\n    </fieldset><div class="sa-error-container">\n      <div class="icon">!</div>\n      <p>Not valid!</p>\n    </div><div class="sa-button-container">\n      <button class="cancel" tabIndex="2">Cancel</button>\n      <button class="confirm" tabIndex="1">OK</button>\n    </div></div>';n["default"]=o,t.exports=n["default"]},{}],8:[function(e,t,o){Object.defineProperty(o,"__esModule",{value:!0});var a=e("./utils"),r=e("./handle-swal-dom"),s=e("./handle-dom"),l=["error","warning","info","success","input","prompt"],i=function(e){var t=r.getModal(),o=t.querySelector("h2"),i=t.querySelector("p"),u=t.querySelector("button.cancel"),c=t.querySelector("button.confirm");if(o.innerHTML=e.html?e.title:s.escapeHtml(e.title).split("\n").join("<br>"),i.innerHTML=e.html?e.text:s.escapeHtml(e.text||"").split("\n").join("<br>"),e.text&&s.show(i),e.customClass)s.addClass(t,e.customClass),t.setAttribute("data-custom-class",e.customClass);else{var d=t.getAttribute("data-custom-class");s.removeClass(t,d),t.setAttribute("data-custom-class","")}if(s.hide(t.querySelectorAll(".sa-icon")),e.type&&!a.isIE8()){var f=function(){for(var o=!1,a=0;a<l.length;a++)if(e.type===l[a]){o=!0;break}if(!o)return logStr("Unknown alert type: "+e.type),{v:!1};var i=["success","error","warning","info"],u=n;-1!==i.indexOf(e.type)&&(u=t.querySelector(".sa-icon.sa-"+e.type),s.show(u));var c=r.getInput();switch(e.type){case"success":s.addClass(u,"animate"),s.addClass(u.querySelector(".sa-tip"),"animateSuccessTip"),s.addClass(u.querySelector(".sa-long"),"animateSuccessLong");break;case"error":s.addClass(u,"animateErrorIcon"),s.addClass(u.querySelector(".sa-x-mark"),"animateXMark");break;case"warning":s.addClass(u,"pulseWarning"),s.addClass(u.querySelector(".sa-body"),"pulseWarningIns"),s.addClass(u.querySelector(".sa-dot"),"pulseWarningIns");break;case"input":case"prompt":c.setAttribute("type",e.inputType),c.value=e.inputValue,c.setAttribute("placeholder",e.inputPlaceholder),s.addClass(t,"show-input"),setTimeout(function(){c.focus(),c.addEventListener("keyup",swal.resetInputError)},400)}}();if("object"==typeof f)return f.v}if(e.imageUrl){var p=t.querySelector(".sa-icon.sa-custom");p.style.backgroundImage="url("+e.imageUrl+")",s.show(p);var m=80,v=80;if(e.imageSize){var y=e.imageSize.toString().split("x"),h=y[0],g=y[1];h&&g?(m=h,v=g):logStr("Parameter imageSize expects value with format WIDTHxHEIGHT, got "+e.imageSize)}p.setAttribute("style",p.getAttribute("style")+"width:"+m+"px; height:"+v+"px")}t.setAttribute("data-has-cancel-button",e.showCancelButton),e.showCancelButton?u.style.display="inline-block":s.hide(u),t.setAttribute("data-has-confirm-button",e.showConfirmButton),e.showConfirmButton?c.style.display="inline-block":s.hide(c),e.cancelButtonText&&(u.innerHTML=s.escapeHtml(e.cancelButtonText)),e.confirmButtonText&&(c.innerHTML=s.escapeHtml(e.confirmButtonText)),e.confirmButtonColor&&(c.style.backgroundColor=e.confirmButtonColor,r.setFocusStyle(c,e.confirmButtonColor)),t.setAttribute("data-allow-outside-click",e.allowOutsideClick);var b=e.doneFunction?!0:!1;t.setAttribute("data-has-done-function",b),e.animation?"string"==typeof e.animation?t.setAttribute("data-animation",e.animation):t.setAttribute("data-animation","pop"):t.setAttribute("data-animation","none"),t.setAttribute("data-timer",e.timer)};o["default"]=i,t.exports=o["default"]},{"./handle-dom":4,"./handle-swal-dom":6,"./utils":9}],9:[function(t,n,o){Object.defineProperty(o,"__esModule",{value:!0});var a=function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e},r=function(e){var t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?parseInt(t[1],16)+", "+parseInt(t[2],16)+", "+parseInt(t[3],16):null},s=function(){return e.attachEvent&&!e.addEventListener},l=function(t){e.console&&e.console.log("SweetAlert: "+t)},i=function(e,t){e=String(e).replace(/[^0-9a-f]/gi,""),e.length<6&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),t=t||0;var n,o,a="#";for(o=0;3>o;o++)n=parseInt(e.substr(2*o,2),16),n=Math.round(Math.min(Math.max(0,n+n*t),255)).toString(16),a+=("00"+n).substr(n.length);return a};o.extend=a,o.hexToRgb=r,o.isIE8=s,o.logStr=l,o.colorLuminance=i},{}]},{},[1]),"function"==typeof define&&define.amd?define(function(){return sweetAlert}):"undefined"!=typeof module&&module.exports&&(module.exports=sweetAlert)}(window,document);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/switchery/switchery.js b/management/guns-admin/src/main/webapp/static/js/plugins/switchery/switchery.js
new file mode 100644
index 0000000..c6d8609
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/switchery/switchery.js
@@ -0,0 +1 @@
+(function(){function require(path,parent,orig){var resolved=require.resolve(path);if(null==resolved){orig=orig||path;parent=parent||"root";var err=new Error('Failed to require "'+orig+'" from "'+parent+'"');err.path=orig;err.parent=parent;err.require=true;throw err}var module=require.modules[resolved];if(!module._resolving&&!module.exports){var mod={};mod.exports={};mod.client=mod.component=true;module._resolving=true;module.call(this,mod.exports,require.relative(resolved),mod);delete module._resolving;module.exports=mod.exports}return module.exports}require.modules={};require.aliases={};require.resolve=function(path){if(path.charAt(0)==="/")path=path.slice(1);var paths=[path,path+".js",path+".json",path+"/index.js",path+"/index.json"];for(var i=0;i<paths.length;i++){var path=paths[i];if(require.modules.hasOwnProperty(path))return path;if(require.aliases.hasOwnProperty(path))return require.aliases[path]}};require.normalize=function(curr,path){var segs=[];if("."!=path.charAt(0))return path;curr=curr.split("/");path=path.split("/");for(var i=0;i<path.length;++i){if(".."==path[i]){curr.pop()}else if("."!=path[i]&&""!=path[i]){segs.push(path[i])}}return curr.concat(segs).join("/")};require.register=function(path,definition){require.modules[path]=definition};require.alias=function(from,to){if(!require.modules.hasOwnProperty(from)){throw new Error('Failed to alias "'+from+'", it does not exist')}require.aliases[to]=from};require.relative=function(parent){var p=require.normalize(parent,"..");function lastIndexOf(arr,obj){var i=arr.length;while(i--){if(arr[i]===obj)return i}return-1}function localRequire(path){var resolved=localRequire.resolve(path);return require(resolved,parent,path)}localRequire.resolve=function(path){var c=path.charAt(0);if("/"==c)return path.slice(1);if("."==c)return require.normalize(p,path);var segs=parent.split("/");var i=lastIndexOf(segs,"deps")+1;if(!i)i=0;path=segs.slice(0,i+1).join("/")+"/deps/"+path;return path};localRequire.exists=function(path){return require.modules.hasOwnProperty(localRequire.resolve(path))};return localRequire};require.register("abpetkov-transitionize/transitionize.js",function(exports,require,module){module.exports=Transitionize;function Transitionize(element,props){if(!(this instanceof Transitionize))return new Transitionize(element,props);this.element=element;this.props=props||{};this.init()}Transitionize.prototype.isSafari=function(){return/Safari/.test(navigator.userAgent)&&/Apple Computer/.test(navigator.vendor)};Transitionize.prototype.init=function(){var transitions=[];for(var key in this.props){transitions.push(key+" "+this.props[key])}this.element.style.transition=transitions.join(", ");if(this.isSafari())this.element.style.webkitTransition=transitions.join(", ")}});require.register("ftlabs-fastclick/lib/fastclick.js",function(exports,require,module){function FastClick(layer){"use strict";var oldOnClick,self=this;this.trackingClick=false;this.trackingClickStart=0;this.targetElement=null;this.touchStartX=0;this.touchStartY=0;this.lastTouchIdentifier=0;this.touchBoundary=10;this.layer=layer;if(!layer||!layer.nodeType){throw new TypeError("Layer must be a document node")}this.onClick=function(){return FastClick.prototype.onClick.apply(self,arguments)};this.onMouse=function(){return FastClick.prototype.onMouse.apply(self,arguments)};this.onTouchStart=function(){return FastClick.prototype.onTouchStart.apply(self,arguments)};this.onTouchMove=function(){return FastClick.prototype.onTouchMove.apply(self,arguments)};this.onTouchEnd=function(){return FastClick.prototype.onTouchEnd.apply(self,arguments)};this.onTouchCancel=function(){return FastClick.prototype.onTouchCancel.apply(self,arguments)};if(FastClick.notNeeded(layer)){return}if(this.deviceIsAndroid){layer.addEventListener("mouseover",this.onMouse,true);layer.addEventListener("mousedown",this.onMouse,true);layer.addEventListener("mouseup",this.onMouse,true)}layer.addEventListener("click",this.onClick,true);layer.addEventListener("touchstart",this.onTouchStart,false);layer.addEventListener("touchmove",this.onTouchMove,false);layer.addEventListener("touchend",this.onTouchEnd,false);layer.addEventListener("touchcancel",this.onTouchCancel,false);if(!Event.prototype.stopImmediatePropagation){layer.removeEventListener=function(type,callback,capture){var rmv=Node.prototype.removeEventListener;if(type==="click"){rmv.call(layer,type,callback.hijacked||callback,capture)}else{rmv.call(layer,type,callback,capture)}};layer.addEventListener=function(type,callback,capture){var adv=Node.prototype.addEventListener;if(type==="click"){adv.call(layer,type,callback.hijacked||(callback.hijacked=function(event){if(!event.propagationStopped){callback(event)}}),capture)}else{adv.call(layer,type,callback,capture)}}}if(typeof layer.onclick==="function"){oldOnClick=layer.onclick;layer.addEventListener("click",function(event){oldOnClick(event)},false);layer.onclick=null}}FastClick.prototype.deviceIsAndroid=navigator.userAgent.indexOf("Android")>0;FastClick.prototype.deviceIsIOS=/iP(ad|hone|od)/.test(navigator.userAgent);FastClick.prototype.deviceIsIOS4=FastClick.prototype.deviceIsIOS&&/OS 4_\d(_\d)?/.test(navigator.userAgent);FastClick.prototype.deviceIsIOSWithBadTarget=FastClick.prototype.deviceIsIOS&&/OS ([6-9]|\d{2})_\d/.test(navigator.userAgent);FastClick.prototype.needsClick=function(target){"use strict";switch(target.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(target.disabled){return true}break;case"input":if(this.deviceIsIOS&&target.type==="file"||target.disabled){return true}break;case"label":case"video":return true}return/\bneedsclick\b/.test(target.className)};FastClick.prototype.needsFocus=function(target){"use strict";switch(target.nodeName.toLowerCase()){case"textarea":return true;case"select":return!this.deviceIsAndroid;case"input":switch(target.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return false}return!target.disabled&&!target.readOnly;default:return/\bneedsfocus\b/.test(target.className)}};FastClick.prototype.sendClick=function(targetElement,event){"use strict";var clickEvent,touch;if(document.activeElement&&document.activeElement!==targetElement){document.activeElement.blur()}touch=event.changedTouches[0];clickEvent=document.createEvent("MouseEvents");clickEvent.initMouseEvent(this.determineEventType(targetElement),true,true,window,1,touch.screenX,touch.screenY,touch.clientX,touch.clientY,false,false,false,false,0,null);clickEvent.forwardedTouchEvent=true;targetElement.dispatchEvent(clickEvent)};FastClick.prototype.determineEventType=function(targetElement){"use strict";if(this.deviceIsAndroid&&targetElement.tagName.toLowerCase()==="select"){return"mousedown"}return"click"};FastClick.prototype.focus=function(targetElement){"use strict";var length;if(this.deviceIsIOS&&targetElement.setSelectionRange&&targetElement.type.indexOf("date")!==0&&targetElement.type!=="time"){length=targetElement.value.length;targetElement.setSelectionRange(length,length)}else{targetElement.focus()}};FastClick.prototype.updateScrollParent=function(targetElement){"use strict";var scrollParent,parentElement;scrollParent=targetElement.fastClickScrollParent;if(!scrollParent||!scrollParent.contains(targetElement)){parentElement=targetElement;do{if(parentElement.scrollHeight>parentElement.offsetHeight){scrollParent=parentElement;targetElement.fastClickScrollParent=parentElement;break}parentElement=parentElement.parentElement}while(parentElement)}if(scrollParent){scrollParent.fastClickLastScrollTop=scrollParent.scrollTop}};FastClick.prototype.getTargetElementFromEventTarget=function(eventTarget){"use strict";if(eventTarget.nodeType===Node.TEXT_NODE){return eventTarget.parentNode}return eventTarget};FastClick.prototype.onTouchStart=function(event){"use strict";var targetElement,touch,selection;if(event.targetTouches.length>1){return true}targetElement=this.getTargetElementFromEventTarget(event.target);touch=event.targetTouches[0];if(this.deviceIsIOS){selection=window.getSelection();if(selection.rangeCount&&!selection.isCollapsed){return true}if(!this.deviceIsIOS4){if(touch.identifier===this.lastTouchIdentifier){event.preventDefault();return false}this.lastTouchIdentifier=touch.identifier;this.updateScrollParent(targetElement)}}this.trackingClick=true;this.trackingClickStart=event.timeStamp;this.targetElement=targetElement;this.touchStartX=touch.pageX;this.touchStartY=touch.pageY;if(event.timeStamp-this.lastClickTime<200){event.preventDefault()}return true};FastClick.prototype.touchHasMoved=function(event){"use strict";var touch=event.changedTouches[0],boundary=this.touchBoundary;if(Math.abs(touch.pageX-this.touchStartX)>boundary||Math.abs(touch.pageY-this.touchStartY)>boundary){return true}return false};FastClick.prototype.onTouchMove=function(event){"use strict";if(!this.trackingClick){return true}if(this.targetElement!==this.getTargetElementFromEventTarget(event.target)||this.touchHasMoved(event)){this.trackingClick=false;this.targetElement=null}return true};FastClick.prototype.findControl=function(labelElement){"use strict";if(labelElement.control!==undefined){return labelElement.control}if(labelElement.htmlFor){return document.getElementById(labelElement.htmlFor)}return labelElement.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")};FastClick.prototype.onTouchEnd=function(event){"use strict";var forElement,trackingClickStart,targetTagName,scrollParent,touch,targetElement=this.targetElement;if(!this.trackingClick){return true}if(event.timeStamp-this.lastClickTime<200){this.cancelNextClick=true;return true}this.cancelNextClick=false;this.lastClickTime=event.timeStamp;trackingClickStart=this.trackingClickStart;this.trackingClick=false;this.trackingClickStart=0;if(this.deviceIsIOSWithBadTarget){touch=event.changedTouches[0];targetElement=document.elementFromPoint(touch.pageX-window.pageXOffset,touch.pageY-window.pageYOffset)||targetElement;targetElement.fastClickScrollParent=this.targetElement.fastClickScrollParent}targetTagName=targetElement.tagName.toLowerCase();if(targetTagName==="label"){forElement=this.findControl(targetElement);if(forElement){this.focus(targetElement);if(this.deviceIsAndroid){return false}targetElement=forElement}}else if(this.needsFocus(targetElement)){if(event.timeStamp-trackingClickStart>100||this.deviceIsIOS&&window.top!==window&&targetTagName==="input"){this.targetElement=null;return false}this.focus(targetElement);if(!this.deviceIsIOS4||targetTagName!=="select"){this.targetElement=null;event.preventDefault()}return false}if(this.deviceIsIOS&&!this.deviceIsIOS4){scrollParent=targetElement.fastClickScrollParent;if(scrollParent&&scrollParent.fastClickLastScrollTop!==scrollParent.scrollTop){return true}}if(!this.needsClick(targetElement)){event.preventDefault();this.sendClick(targetElement,event)}return false};FastClick.prototype.onTouchCancel=function(){"use strict";this.trackingClick=false;this.targetElement=null};FastClick.prototype.onMouse=function(event){"use strict";if(!this.targetElement){return true}if(event.forwardedTouchEvent){return true}if(!event.cancelable){return true}if(!this.needsClick(this.targetElement)||this.cancelNextClick){if(event.stopImmediatePropagation){event.stopImmediatePropagation()}else{event.propagationStopped=true}event.stopPropagation();event.preventDefault();return false}return true};FastClick.prototype.onClick=function(event){"use strict";var permitted;if(this.trackingClick){this.targetElement=null;this.trackingClick=false;return true}if(event.target.type==="submit"&&event.detail===0){return true}permitted=this.onMouse(event);if(!permitted){this.targetElement=null}return permitted};FastClick.prototype.destroy=function(){"use strict";var layer=this.layer;if(this.deviceIsAndroid){layer.removeEventListener("mouseover",this.onMouse,true);layer.removeEventListener("mousedown",this.onMouse,true);layer.removeEventListener("mouseup",this.onMouse,true)}layer.removeEventListener("click",this.onClick,true);layer.removeEventListener("touchstart",this.onTouchStart,false);layer.removeEventListener("touchmove",this.onTouchMove,false);layer.removeEventListener("touchend",this.onTouchEnd,false);layer.removeEventListener("touchcancel",this.onTouchCancel,false)};FastClick.notNeeded=function(layer){"use strict";var metaViewport;var chromeVersion;if(typeof window.ontouchstart==="undefined"){return true}chromeVersion=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1];if(chromeVersion){if(FastClick.prototype.deviceIsAndroid){metaViewport=document.querySelector("meta[name=viewport]");if(metaViewport){if(metaViewport.content.indexOf("user-scalable=no")!==-1){return true}if(chromeVersion>31&&window.innerWidth<=window.screen.width){return true}}}else{return true}}if(layer.style.msTouchAction==="none"){return true}return false};FastClick.attach=function(layer){"use strict";return new FastClick(layer)};if(typeof define!=="undefined"&&define.amd){define(function(){"use strict";return FastClick})}else if(typeof module!=="undefined"&&module.exports){module.exports=FastClick.attach;module.exports.FastClick=FastClick}else{window.FastClick=FastClick}});require.register("switchery/switchery.js",function(exports,require,module){var transitionize=require("transitionize"),fastclick=require("fastclick");module.exports=Switchery;var defaults={color:"#64bd63",secondaryColor:"#dfdfdf",className:"switchery",disabled:false,disabledOpacity:.5,speed:"0.4s"};function Switchery(element,options){if(!(this instanceof Switchery))return new Switchery(element,options);this.element=element;this.options=options||{};for(var i in defaults){if(this.options[i]==null){this.options[i]=defaults[i]}}if(this.element!=null&&this.element.type=="checkbox")this.init()}Switchery.prototype.hide=function(){this.element.style.display="none"};Switchery.prototype.show=function(){var switcher=this.create();this.insertAfter(this.element,switcher)};Switchery.prototype.create=function(){this.switcher=document.createElement("span");this.jack=document.createElement("small");this.switcher.appendChild(this.jack);this.switcher.className=this.options.className;return this.switcher};Switchery.prototype.insertAfter=function(reference,target){reference.parentNode.insertBefore(target,reference.nextSibling)};Switchery.prototype.isChecked=function(){return this.element.checked};Switchery.prototype.isDisabled=function(){return this.options.disabled||this.element.disabled};Switchery.prototype.setPosition=function(clicked){var checked=this.isChecked(),switcher=this.switcher,jack=this.jack;if(clicked&&checked)checked=false;else if(clicked&&!checked)checked=true;if(checked===true){this.element.checked=true;if(window.getComputedStyle)jack.style.left=parseInt(window.getComputedStyle(switcher).width)-parseInt(window.getComputedStyle(jack).width)+"px";else jack.style.left=parseInt(switcher.currentStyle["width"])-parseInt(jack.currentStyle["width"])+"px";if(this.options.color)this.colorize();this.setSpeed()}else{jack.style.left=0;this.element.checked=false;this.switcher.style.boxShadow="inset 0 0 0 0 "+this.options.secondaryColor;this.switcher.style.borderColor=this.options.secondaryColor;this.switcher.style.backgroundColor="";this.setSpeed()}};Switchery.prototype.setSpeed=function(){var switcherProp={},jackProp={left:this.options.speed.replace(/[a-z]/,"")/2+"s"};if(this.isChecked()){switcherProp={border:this.options.speed,"box-shadow":this.options.speed,"background-color":this.options.speed.replace(/[a-z]/,"")*3+"s"}}else{switcherProp={border:this.options.speed,"box-shadow":this.options.speed}}transitionize(this.switcher,switcherProp);transitionize(this.jack,jackProp)};Switchery.prototype.setAttributes=function(){var id=this.element.getAttribute("id"),name=this.element.getAttribute("name");if(id)this.switcher.setAttribute("id",id);if(name)this.switcher.setAttribute("name",name)};Switchery.prototype.colorize=function(){this.switcher.style.backgroundColor=this.options.color;this.switcher.style.borderColor=this.options.color;this.switcher.style.boxShadow="inset 0 0 0 16px "+this.options.color};Switchery.prototype.handleOnchange=function(state){if(typeof Event==="function"||!document.fireEvent){var event=document.createEvent("HTMLEvents");event.initEvent("change",true,true);this.element.dispatchEvent(event)}else{this.element.fireEvent("onchange")}};Switchery.prototype.handleChange=function(){var self=this,el=this.element;if(el.addEventListener){el.addEventListener("change",function(){self.setPosition()})}else{el.attachEvent("onchange",function(){self.setPosition()})}};Switchery.prototype.handleClick=function(){var self=this,switcher=this.switcher;if(this.isDisabled()===false){fastclick(switcher);if(switcher.addEventListener){switcher.addEventListener("click",function(){self.setPosition(true);self.handleOnchange(self.element.checked)})}else{switcher.attachEvent("onclick",function(){self.setPosition(true);self.handleOnchange(self.element.checked)})}}else{this.element.disabled=true;this.switcher.style.opacity=this.options.disabledOpacity}};Switchery.prototype.disableLabel=function(){var parent=this.element.parentNode,labels=document.getElementsByTagName("label"),attached=null;for(var i=0;i<labels.length;i++){if(labels[i].getAttribute("for")===this.element.id){attached=true}}if(attached===true||parent.tagName.toLowerCase()==="label"){if(parent.addEventListener){parent.addEventListener("click",function(e){e.preventDefault()})}else{parent.attachEvent("onclick",function(e){e.returnValue=false})}}};Switchery.prototype.markAsSwitched=function(){this.element.setAttribute("data-switchery",true)};Switchery.prototype.markedAsSwitched=function(){return this.element.getAttribute("data-switchery")};Switchery.prototype.init=function(){this.hide();this.show();this.setPosition();this.setAttributes();this.markAsSwitched();this.disableLabel();this.handleChange();this.handleClick()}});require.alias("abpetkov-transitionize/transitionize.js","switchery/deps/transitionize/transitionize.js");require.alias("abpetkov-transitionize/transitionize.js","switchery/deps/transitionize/index.js");require.alias("abpetkov-transitionize/transitionize.js","transitionize/index.js");require.alias("abpetkov-transitionize/transitionize.js","abpetkov-transitionize/index.js");require.alias("ftlabs-fastclick/lib/fastclick.js","switchery/deps/fastclick/lib/fastclick.js");require.alias("ftlabs-fastclick/lib/fastclick.js","switchery/deps/fastclick/index.js");require.alias("ftlabs-fastclick/lib/fastclick.js","fastclick/index.js");require.alias("ftlabs-fastclick/lib/fastclick.js","ftlabs-fastclick/index.js");require.alias("switchery/switchery.js","switchery/index.js");if(typeof exports=="object"){module.exports=require("switchery")}else if(typeof define=="function"&&define.amd){define(function(){return require("switchery")})}else{this["Switchery"]=require("switchery")}})();
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/emotion.css b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/emotion.css
new file mode 100644
index 0000000..4fef67c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/emotion.css
@@ -0,0 +1,87 @@
+.edui-popup-emotion .edui-emotion-jd img{
+    background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+.edui-popup-emotion .edui-emotion-pp img{
+    background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:25px;height:25px;display:block;
+}
+
+.edui-popup-emotion .edui-emotion-ldw img{
+    background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+
+.edui-popup-emotion .edui-emotion-tsj img{
+    background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+
+.edui-popup-emotion .edui-emotion-cat img{
+    background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+
+.edui-popup-emotion .edui-emotion-bb img{
+    background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+
+.edui-popup-emotion .edui-emotion-youa img{
+    background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+
+.edui-popup-emotion .edui-emotion-smileytable {
+    width: 100%;
+    border-spacing: 0;
+    border-collapse: collapse;
+    table-layout: fixed;
+}
+
+.edui-popup-emotion .edui-emotion-wrapper {
+    padding: 15px;
+}
+
+.edui-popup-emotion .edui-tab-nav{
+    height: auto;
+    *height: 31px;
+}
+.edui-popup-emotion .edui-emotion-tabs{
+    clear: both;
+    width: 0;
+    height: 0;
+}
+
+.edui-popup-emotion .edui-tab-content {
+    padding: 15px 0;
+}
+
+.edui-popup-emotion .edui-emotion-preview-box {
+    width:90px;
+    height:76px;
+    border:2px solid #9cb945;
+    background:#FFFFFF;
+    background-position:center;
+    background-repeat:no-repeat;
+    position: absolute;
+    top: 67px;
+    left: 494px;
+    display: none;
+}
+
+.edui-popup-emotion .edui-tab-text {
+    font-size: 12px;
+}
+
+.edui-popup-emotion .edui-emotion-preview-left {
+    left: 15px;
+}
+
+.edui-popup-emotion .edui-emotion-preview-img {
+    width: 100%;
+    height: 100%;
+    display: block;
+    background-repeat: no-repeat;
+    background-position: center center;
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/emotion.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/emotion.js
new file mode 100644
index 0000000..a74ddaf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/emotion.js
@@ -0,0 +1,272 @@
+(function(){
+
+    var editor = null;
+
+    UM.registerWidget('emotion',{
+
+        tpl: "<link type=\"text/css\" rel=\"stylesheet\" href=\"<%=emotion_url%>emotion.css\">" +
+            "<div class=\"edui-emotion-tab-Jpanel edui-emotion-wrapper\">" +
+            "<ul class=\"edui-emotion-Jtabnav edui-tab-nav\">" +
+            "<li class=\"edui-tab-item\"><a data-context=\".edui-emotion-Jtab0\" hideFocus=\"true\" class=\"edui-tab-text\"><%=lang_input_choice%></a></li>" +
+            "<li class=\"edui-tab-item\"><a data-context=\".edui-emotion-Jtab1\" class=\"edui-tab-text\"><%=lang_input_Tuzki%></a></li>" +
+            "<li class=\"edui-tab-item\"><a data-context=\".edui-emotion-Jtab2\" hideFocus=\"true\" class=\"edui-tab-text\"><%=lang_input_lvdouwa%></a></li>" +
+            "<li class=\"edui-tab-item\"><a data-context=\".edui-emotion-Jtab3\" hideFocus=\"true\" class=\"edui-tab-text\"><%=lang_input_BOBO%></a></li>" +
+            "<li class=\"edui-tab-item\"><a data-context=\".edui-emotion-Jtab4\" hideFocus=\"true\" class=\"edui-tab-text\"><%=lang_input_babyCat%></a></li>" +
+            "<li class=\"edui-tab-item\"><a data-context=\".edui-emotion-Jtab5\" hideFocus=\"true\" class=\"edui-tab-text\"><%=lang_input_bubble%></a></li>" +
+            "<li class=\"edui-tab-item\"><a data-context=\".edui-emotion-Jtab6\" hideFocus=\"true\" class=\"edui-tab-text\"><%=lang_input_youa%></a></li>" +
+            "<li class=\"edui-emotion-tabs\"></li>" +
+            "</ul>" +
+            "<div class=\"edui-tab-content edui-emotion-JtabBodys\">" +
+            "<div class=\"edui-emotion-Jtab0 edui-tab-pane\"></div>" +
+            "<div class=\"edui-emotion-Jtab1 edui-tab-pane\"></div>" +
+            "<div class=\"edui-emotion-Jtab2 edui-tab-pane\"></div>" +
+            "<div class=\"edui-emotion-Jtab3 edui-tab-pane\"></div>" +
+            "<div class=\"edui-emotion-Jtab4 edui-tab-pane\"></div>" +
+            "<div class=\"edui-emotion-Jtab5 edui-tab-pane\"></div>" +
+            "<div class=\"edui-emotion-Jtab6 edui-tab-pane\"></div>" +
+            "</div>" +
+            "<div class=\"edui-emotion-JtabIconReview edui-emotion-preview-box\">" +
+            "<img src=\"<%=cover_img%>\" class=\'edui-emotion-JfaceReview edui-emotion-preview-img\'/>" +
+            "</div>",
+
+        sourceData: {
+            emotion: {
+                tabNum:7, //切换面板数量
+                SmilmgName:{ 'edui-emotion-Jtab0':['j_00', 84], 'edui-emotion-Jtab1':['t_00', 40], 'edui-emotion-Jtab2':['w_00', 52], 'edui-emotion-Jtab3':['B_00', 63], 'edui-emotion-Jtab4':['C_00', 20], 'edui-emotion-Jtab5':['i_f', 50], 'edui-emotion-Jtab6':['y_00', 40] }, //图片前缀名
+                imageFolders:{ 'edui-emotion-Jtab0':'jx2/', 'edui-emotion-Jtab1':'tsj/', 'edui-emotion-Jtab2':'ldw/', 'edui-emotion-Jtab3':'bobo/', 'edui-emotion-Jtab4':'babycat/', 'edui-emotion-Jtab5':'face/', 'edui-emotion-Jtab6':'youa/'}, //图片对应文件夹路径
+                imageCss:{'edui-emotion-Jtab0':'jd', 'edui-emotion-Jtab1':'tsj', 'edui-emotion-Jtab2':'ldw', 'edui-emotion-Jtab3':'bb', 'edui-emotion-Jtab4':'cat', 'edui-emotion-Jtab5':'pp', 'edui-emotion-Jtab6':'youa'}, //图片css类名
+                imageCssOffset:{'edui-emotion-Jtab0':35, 'edui-emotion-Jtab1':35, 'edui-emotion-Jtab2':35, 'edui-emotion-Jtab3':35, 'edui-emotion-Jtab4':35, 'edui-emotion-Jtab5':25, 'edui-emotion-Jtab6':35}, //图片偏移
+                SmileyInfor:{
+                    'edui-emotion-Jtab0':['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'],
+                    'edui-emotion-Jtab1':['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'],
+                    'edui-emotion-Jtab2':['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'],
+                    'edui-emotion-Jtab3':['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'],
+                    'edui-emotion-Jtab4':['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'],
+                    'edui-emotion-Jtab5':['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'],
+                    'edui-emotion-Jtab6':['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上']
+                }
+            }
+        },
+        initContent:function( _editor, $widget ){
+
+            var me = this,
+                emotion = me.sourceData.emotion,
+                lang = _editor.getLang( 'emotion' )['static'],
+                emotionUrl = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/emotion/',
+                options = $.extend( {}, lang, {
+                    emotion_url: emotionUrl
+                }),
+                $root = me.root();
+
+            if( me.inited ) {
+                me.preventDefault();
+                this.switchToFirst();
+                return;
+            }
+
+            me.inited = true;
+
+            editor = _editor;
+            this.widget = $widget;
+
+            emotion.SmileyPath = _editor.options.emotionLocalization === true ? emotionUrl + 'images/' : "http://img.baidu.com/hi/";
+            emotion.SmileyBox = me.createTabList( emotion.tabNum );
+            emotion.tabExist = me.createArr( emotion.tabNum );
+
+            options['cover_img'] = emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif' : 'default/0.gif');
+
+            $root.html( $.parseTmpl( me.tpl, options ) );
+
+            me.tabs = $.eduitab({selector:".edui-emotion-tab-Jpanel"});
+
+            //缓存预览对象
+            me.previewBox = $root.find(".edui-emotion-JtabIconReview");
+            me.previewImg = $root.find(".edui-emotion-JfaceReview");
+
+            me.initImgName();
+
+        },
+        initEvent:function(){
+
+            var me = this;
+
+            //防止点击过后关闭popup
+            me.root().on('click', function(e){
+                return false;
+            });
+
+            //移动预览
+            me.root().delegate( 'td', 'mouseover mouseout', function( evt ){
+
+                var $td = $( this),
+                    url = $td.attr('data-surl') || null;
+
+                if( url ) {
+                    me[evt.type]( this, url , $td.attr('data-posflag') );
+                }
+
+                return false;
+
+            } );
+
+            //点击选中
+            me.root().delegate( 'td', 'click', function( evt ){
+
+                var $td = $( this),
+                    realUrl = $td.attr('data-realurl') || null;
+
+                if( realUrl ) {
+                    me.insertSmiley( realUrl.replace( /'/g, "\\'" ), evt );
+                }
+
+                return false;
+
+            } );
+
+            //更新模板
+            me.tabs.edui().on("beforeshow", function( evt ){
+
+                var contentId = $(evt.target).attr('data-context').replace( /^.*\.(?=[^\s]*$)/, '' );
+
+                evt.stopPropagation();
+
+                me.updateTab( contentId );
+
+            });
+
+            this.switchToFirst();
+
+        },
+        initImgName: function() {
+
+            var emotion = this.sourceData.emotion;
+
+            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 );
+                }
+            }
+
+        },
+        /**
+         * 切换到第一个tab
+         */
+        switchToFirst: function(){
+            this.root().find(".edui-emotion-Jtabnav .edui-tab-text:first").trigger('click');
+        },
+        updateTab: function( contentBoxId ) {
+
+            var me = this,
+                emotion = me.sourceData.emotion;
+
+            me.autoHeight( contentBoxId );
+
+            if ( !emotion.tabExist[ contentBoxId ] ) {
+
+                emotion.tabExist[ contentBoxId ] = true;
+                me.createTab( contentBoxId );
+
+            }
+
+        },
+        autoHeight: function( ) {
+            this.widget.height(this.root() + 2);
+        },
+        createTabList: function( tabNum ) {
+            var obj = {};
+            for ( var i = 0; i < tabNum; i++ ) {
+                obj["edui-emotion-Jtab" + i] = [];
+            }
+            return obj;
+        },
+        mouseover: function( td, srcPath, posFlag ) {
+
+            posFlag -= 0;
+
+            $(td).css( 'backgroundColor', '#ACCD3C' );
+
+            this.previewImg.css( "backgroundImage", "url(" + srcPath + ")" );
+            posFlag && this.previewBox.addClass('edui-emotion-preview-left');
+            this.previewBox.show();
+
+        },
+        mouseout: function( td ) {
+            $(td).css( 'backgroundColor', 'transparent' );
+            this.previewBox.removeClass('edui-emotion-preview-left').hide();
+        },
+        insertSmiley: function( url, evt ) {
+            var obj = {
+                src: url
+            };
+            obj._src = obj.src;
+            editor.execCommand( 'insertimage', obj );
+            if ( !evt.ctrlKey ) {
+                //关闭预览
+                this.previewBox.removeClass('edui-emotion-preview-left').hide();
+                this.widget.edui().hide();
+            }
+        },
+        createTab: function( contentBoxId ) {
+
+            var faceVersion = "?v=1.1", //版本号
+                me = this,
+                $contentBox = this.root().find("."+contentBoxId),
+                emotion = me.sourceData.emotion,
+                imagePath = emotion.SmileyPath + emotion.imageFolders[ contentBoxId ], //获取显示表情和预览表情的路径
+                positionLine = 11 / 2, //中间数
+                iWidth = iHeight = 35, //图片长宽
+                iColWidth = 3, //表格剩余空间的显示比例
+                tableCss = emotion.imageCss[ contentBoxId ],
+                cssOffset = emotion.imageCssOffset[ contentBoxId ],
+                textHTML = ['<table border="1" class="edui-emotion-smileytable">'],
+                i = 0, imgNum = emotion.SmileyBox[ contentBoxId ].length, imgColNum = 11, faceImage,
+                sUrl, realUrl, posflag, offset, infor;
+
+            for ( ; i < imgNum; ) {
+                textHTML.push( '<tr>' );
+                for ( var j = 0; j < imgColNum; j++, i++ ) {
+                    faceImage = emotion.SmileyBox[ contentBoxId ][i];
+                    if ( faceImage ) {
+                        sUrl = imagePath + faceImage + faceVersion;
+                        realUrl = imagePath + faceImage;
+                        posflag = j < positionLine ? 0 : 1;
+                        offset = cssOffset * i * (-1) - 1;
+                        infor = emotion.SmileyInfor[ contentBoxId ][i];
+
+                        textHTML.push( '<td  class="edui-emotion-' + tableCss + '" data-surl="'+ sUrl +'" data-realurl="'+ realUrl +'" data-posflag="'+ posflag +'" align="center">' );
+                        textHTML.push( '<span>' );
+                        textHTML.push( '<img  style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>' );
+                        textHTML.push( '</span>' );
+                    } else {
+                        textHTML.push( '<td bgcolor="#FFFFFF">' );
+                    }
+                    textHTML.push( '</td>' );
+                }
+                textHTML.push( '</tr>' );
+            }
+            textHTML.push( '</table>' );
+            textHTML = textHTML.join( "" );
+            $contentBox.html( textHTML );
+        },
+        createArr: function( tabNum ) {
+            var arr = [];
+            for ( var i = 0; i < tabNum; i++ ) {
+                arr[i] = 0;
+            }
+            return arr;
+        },
+        width:603,
+        height:400
+    });
+
+})();
+
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/0.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/0.gif
new file mode 100644
index 0000000..6964168
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/0.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/bface.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/bface.gif
new file mode 100644
index 0000000..14fe618
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/bface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/cface.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/cface.gif
new file mode 100644
index 0000000..bff947f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/cface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/fface.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/fface.gif
new file mode 100644
index 0000000..0d8a6af
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/fface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/jxface2.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/jxface2.gif
new file mode 100644
index 0000000..a959c90
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/jxface2.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/neweditor-tab-bg.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/neweditor-tab-bg.png
new file mode 100644
index 0000000..8f398b0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/neweditor-tab-bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/tface.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/tface.gif
new file mode 100644
index 0000000..1354f54
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/tface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/wface.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/wface.gif
new file mode 100644
index 0000000..5667160
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/wface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/yface.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/yface.gif
new file mode 100644
index 0000000..51608be
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/emotion/images/yface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.css b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.css
new file mode 100644
index 0000000..45d4865
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.css
@@ -0,0 +1,32 @@
+.edui-popup-formula .edui-formula-wrapper {
+    padding: 15px;
+}
+.edui-popup-formula .edui-formula-wrapper .edui-tab-nav{
+    height: auto;
+    *height: 31px;
+}
+.edui-popup-formula .edui-formula-wrapper .edui-tab-text {
+    font-size: 12px;
+}
+.edui-popup-formula .edui-formula-wrapper .edui-formula-clearboth {
+    clear: both;
+    width: 0;
+    height: 0;
+}
+.edui-popup-formula .edui-formula-wrapper .edui-tab-pane ul {
+    margin: 0px;
+    padding: 0px;
+}
+.edui-popup-formula .edui-formula-wrapper .edui-tab-content {
+    padding: 5px 0px 0px 0px;
+}
+.edui-popup-formula .edui-formula-wrapper .edui-tab-pane .edui-formula-latex-item {
+    display: block;
+    float: left;
+    margin: 0px 3px 3px 0px;
+    width: 30px;
+    height: 30px;
+    border:1px solid #cccccc;
+    background-image: url("images/formula.png");
+    cursor: pointer;
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.html b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.html
new file mode 100644
index 0000000..1271211
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.html
@@ -0,0 +1,212 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Document</title>
+    <link rel="stylesheet" href="../../third-party/mathquill/mathquill.css"/>
+    <style>
+        html, body, .main{
+            margin: 0;
+            padding: 0;
+            overflow: hidden;
+        }
+        .main{
+            width:1024px;
+            height:1024px;
+        }
+        .mathquill-editable,
+        .mathquill-rendered-math{
+            border: 0px;
+            padding: 0px;
+            margin:4px;
+        }
+    </style>
+</head>
+<body>
+
+<div class="main">
+    <div class="mathquill-editable"></div>
+</div>
+
+<div>
+    <input id="blurHelper" />
+</div>
+
+<script src="../../third-party/jquery.min.js"></script>
+<script src="../../third-party/mathquill/mathquill.js"></script>
+<script>
+    $(function(){
+
+        var UM = parent.UM,
+            $iframe = $(getSelfIframe()),
+            editorId = $iframe.parents('.edui-body-container').attr('id'),
+            editor = UM.getEditor(editorId),
+            timer;
+
+        /* 获得当前公式所在的iframe节点 */
+        function getSelfIframe(){
+            var iframes = parent.document.getElementsByTagName('iframe');
+            for (var key in iframes) {
+                if (iframes[key].contentWindow == window) {
+                    return iframes[key];
+                }
+            }
+            return null;
+        }
+        /* 获得当前url上的hash存储的参数值 */
+        function getLatex() {
+            return $iframe.attr('data-latex') || '';
+        }
+        /* 保存场景 */
+        function saveScene(){
+            timer && clearTimeout(timer);
+            timer = setTimeout(function(){
+                editor.fireEvent('savescene');
+                editor.fireEvent('contentchange');
+                editor.fireEvent('selectionchange');
+                timer = null;
+            }, 300);
+        }
+        /* 设置编辑器可编辑 */
+        function enableEditor(){
+            if(editor.body.contentEditable == 'false') {
+                editor.setEnabled();
+            }
+        }
+        /* 设置编辑器不可编辑 */
+        function disableEditor(){
+            if(editor.body.contentEditable == 'true') {
+                editor.setDisabled(['undo', 'redo', 'preview', 'formula'], true);
+            }
+        }
+
+        /* 公式 */
+        var Formula = function(){
+            var _this = this,
+                latex = getLatex();
+
+            this.isFocus = false;
+            this.isDisabled = false;
+
+            /* 加载公式内容 */
+            this.$mathquill = $('.mathquill-editable').mathquill('latex', latex);
+
+            /* 设置活动状态的公式iframe */
+            this.$mathquill.on('mousedown', function(){
+                /* 编辑器不可用时,公式也不可用 */
+                if(_this.disabled) return false;
+
+                /* 第一次点击当前公式,设置公式活动 */
+                if(!$iframe.hasClass('edui-formula-active')) {
+                    disableEditor();
+                    editor.blur();
+                    editor.$body.find('iframe').not($iframe).each(function(k, v){
+                        v.contentWindow.formula.blur();
+                    });
+                    if(_this.$mathquill.find('.cursor').css('display') == 'none') {
+                        _this.refresh();
+                        _this.$mathquill.addClass('hasCursor');
+                    }
+                }
+                _this.focus();
+            });
+            editor.addListener('click', function(){
+                _this.blur();
+                enableEditor();
+            });
+
+            /* 里面focus,编辑器也判断为focus */
+            editor.addListener('isFocus', function(){
+                return _this.isFocus;
+            });
+            /* um不可用,公式也不可编辑 */
+            editor.addListener('setDisabled', function(type, except){
+                if (!(except && except.join(' ').indexOf('formula') != -1) && _this.isDisabled != true ) {
+                    _this.setDisabled();
+                }
+            });
+            editor.addListener('setEnabled', function(){
+                if (_this.isDisabled != false) {
+                    _this.setEnabled();
+                }
+            });
+
+            /* 设置更新外层iframe的大小和属性 */
+            $(document.body).on('keydown', function(){
+                _this.updateIframe();
+            }).on('keyup', function(){
+                _this.updateIframe();
+            });
+
+            /* 清除初始化的高亮状态 */
+            this.$mathquill.removeClass('hasCursor');
+
+            /* 初始化后延迟刷新外层iframe大小 */
+            setTimeout(function(){
+                _this.updateIframe();
+            }, 300);
+        };
+
+        Formula.prototype = {
+            focus:function(){
+                $iframe.addClass('edui-formula-active');
+                this.isFocus = true;
+            },
+            blur:function(){
+                $iframe.removeClass('edui-formula-active');
+                this.removeCursor();
+                this.isFocus = false;
+            },
+            removeCursor: function(){
+                this.$mathquill.find('span.cursor').hide();
+                this.$mathquill.parent().find('.hasCursor').removeClass('hasCursor');
+            },
+            updateIframe: function(){
+                $iframe.width(this.$mathquill.width()+8).height(this.$mathquill.height()+8);
+                var latex = $iframe.attr('data-latex'),
+                    newLatex = this.getLatex();
+                if(latex != newLatex) {
+                    $iframe.attr('data-latex', this.getLatex());
+                    saveScene();
+                }
+            },
+            insertLatex: function(latex){
+                this.$mathquill.mathquill('write', latex);
+                this.updateIframe();
+                this.removeCursor();
+            },
+            setLatex: function(latex){
+                this.$mathquill.mathquill('latex', latex);
+                this.updateIframe();
+            },
+            getLatex: function(){
+                return this.$mathquill.mathquill('latex');
+            },
+            redraw: function(){
+                this.$mathquill.mathquill('redraw');
+            },
+            setDisabled: function(){
+                this.blur();
+                var latex = this.getLatex();
+                this.$mathquill.mathquill('revert').text(latex).mathquill();
+                this.updateIframe();
+                this.isDisabled = true;
+            },
+            setEnabled: function(){
+                this.$mathquill.removeClass('mathquill-rendered-math');
+                this.refresh();
+                this.isDisabled = false;
+            },
+            refresh: function(){
+                var latex = this.getLatex();
+                this.$mathquill.mathquill('revert').text(latex).mathquill('editable');
+                this.updateIframe();
+            }
+        };
+
+        /* 绑定到window上,给上级window调用 */
+        window.formula = new Formula();
+    });
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.js
new file mode 100644
index 0000000..ffa9e78
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/formula.js
@@ -0,0 +1,124 @@
+(function () {
+
+    var editor = null;
+
+    UM.registerWidget('formula', {
+
+        tpl: "<link type=\"text/css\" rel=\"stylesheet\" href=\"<%=formula_url%>formula.css\">" +
+            "<div class=\"edui-formula-wrapper\">" +
+            "<ul class=\"edui-tab-nav\"></ul>" +
+            "<div class=\"edui-tab-content\"></div>" +
+            "</div>",
+
+        sourceData: {
+            formula: {
+                'common': [
+                    "{/}frac{ }{ }", "^{ }/_{ }", "x^{ }", "x_{ }", "x^{ }_{ }", "{/}bar{ }", "{/}sqrt{ }", "{/}nthroot{ }{ }",
+                    "{/}sum^{ }_{n=}", "{/}sum", "{/}log_{ }", "{/}ln", "{/}int_{ }^{ }", "{/}oint_{ }^{ }"
+                ],
+                'symbol': [
+                    "+", "-", "{/}pm", "{/}times", "{/}ast", "{/}div", "/", "{/}bigtriangleup",
+                    "=", "{/}ne", "{/}approx", ">", "<", "{/}ge", "{/}le", "{/}infty",
+                    "{/}cap", "{/}cup", "{/}because", "{/}therefore", "{/}subset", "{/}supset", "{/}subseteq", "{/}supseteq",
+                    "{/}nsubseteq", "{/}nsupseteq", "{/}in", "{/}ni", "{/}notin", "{/}mapsto", "{/}leftarrow", "{/}rightarrow",
+                    "{/}Leftarrow", "{/}Rightarrow", "{/}leftrightarrow", "{/}Leftrightarrow"
+                ],
+                'letter': [
+                    "{/}alpha", "{/}beta", "{/}gamma", "{/}delta", "{/}varepsilon", "{/}varphi", "{/}lambda", "{/}mu",
+                    "{/}rho", "{/}sigma", "{/}omega", "{/}Gamma", "{/}Delta", "{/}Theta", "{/}Lambda", "{/}Xi",
+                    "{/}Pi", "{/}Sigma", "{/}Upsilon", "{/}Phi", "{/}Psi", "{/}Omega"
+                ]
+            }
+        },
+        initContent: function (_editor, $widget) {
+
+            var me = this,
+                formula = me.sourceData.formula,
+                lang = _editor.getLang('formula').static,
+                formulaUrl = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/formula/',
+                options = $.extend({}, lang, { 'formula_url': formulaUrl }),
+                $root = me.root();
+
+            if (me.inited) {
+                me.preventDefault();
+                return;
+            }
+            me.inited = true;
+
+            editor = _editor;
+            me.$widget = $widget;
+
+            $root.html($.parseTmpl(me.tpl, options));
+            me.tabs = $.eduitab({selector: "#edui-formula-tab-Jpanel"});
+
+            /* 初始化popup的内容 */
+            var headHtml = [], xMax = 0, yMax = 0,
+                $tabContent = me.root().find('.edui-tab-content');
+            $.each(formula, function (k, v) {
+                var contentHtml = [];
+                $.each(v, function (i, f) {
+                    contentHtml.push('<li class="edui-formula-latex-item" data-latex="' + f + '" style="background-position:-' + (xMax * 30) + 'px -' + (yMax * 30) + 'px"></li>');
+                    if (++xMax >=8) {
+                        ++yMax; xMax = 0;
+                    }
+                });
+                yMax++; xMax = 0;
+                $tabContent.append('<div class="edui-tab-pane"><ul>' + contentHtml.join('') + '</ul>');
+                headHtml.push('<li class="edui-tab-item"><a href="javascript:void(0);" class="edui-tab-text">' + lang['lang_tab_' + k] + '</a></li>');
+            });
+            headHtml.push('<li class="edui-formula-clearboth"></li>');
+            $root.find('.edui-tab-nav').html(headHtml.join(''));
+            $root.find('.edui-tab-content').append('<div class="edui-formula-clearboth"></div>');
+
+            /* 选中第一个tab */
+            me.switchTab(0);
+        },
+        initEvent: function () {
+            var me = this;
+
+            //防止点击过后关闭popup
+            me.root().on('click', function (e) {
+                return false;
+            });
+
+            //点击tab切换菜单
+            me.root().find('.edui-tab-nav').delegate('.edui-tab-item', 'click', function (evt) {
+                me.switchTab(this);
+                return false;
+            });
+
+            //点击选中公式
+            me.root().find('.edui-tab-pane').delegate('.edui-formula-latex-item', 'click', function (evt) {
+                var $item = $(this),
+                    latex = $item.attr('data-latex') || '';
+
+                if (latex) {
+                    me.insertLatex(latex.replace("{/}", "\\"));
+                }
+                me.$widget.edui().hide();
+                return false;
+            });
+        },
+        switchTab:function(index){
+            var me = this,
+                $root = me.root(),
+                index = $.isNumeric(index) ? index:$.inArray(index, $root.find('.edui-tab-nav .edui-tab-item'));
+
+            $root.find('.edui-tab-nav .edui-tab-item').removeClass('edui-active').eq(index).addClass('edui-active');
+            $root.find('.edui-tab-content .edui-tab-pane').removeClass('edui-active').eq(index).addClass('edui-active');
+
+            /* 自动长高 */
+            me.autoHeight(0);
+        },
+        autoHeight: function () {
+            this.$widget.height(this.root() + 2);
+        },
+        insertLatex: function (latex) {
+            editor.execCommand('formula', latex );
+        },
+        width: 350,
+        height: 400
+    });
+
+})();
+
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/images/formula.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/images/formula.png
new file mode 100644
index 0000000..04cbb3b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/formula/images/formula.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/image.css b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/image.css
new file mode 100644
index 0000000..5548391
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/image.css
@@ -0,0 +1,42 @@
+.edui-dialog-image .edui-image-wrapper{font-size: 12px;margin: 15px;}
+
+/*upload*/
+.edui-dialog-image .edui-image-upload1{position: absolute;top:50%;left:50%;width:44px;height:38px;margin-top:-19px; margin-left: -22px;}
+.edui-dialog-image .edui-image-upload2{position:relative;float:left;width:120px;height:120px;margin:5px 0 0 5px;}
+
+.edui-dialog-image .edui-image-form{position: absolute;left: 0px;top: 0px;width: 100%;height: 100%;opacity: 0;cursor: pointer;}
+.edui-dialog-image .edui-image-form .edui-image-file{width: 100%;height:100%;filter: alpha(opacity=0)}
+
+.edui-dialog-image .edui-image-upload1 .edui-image-icon{display: inline-block;width:44px;height:38px;background-image: url('images/upload1.png')}
+.edui-dialog-image .edui-image-upload1 .edui-image-icon.hover{background-position: -50px 0;}
+.edui-dialog-image .edui-image-upload2 .edui-image-icon{display: inline-block;width:120px;height:120px;background-image: url('images/upload2.png')}
+
+.edui-dialog-image .edui-image-dragTip{position: absolute;display:none;top:50%;left:50%;margin-top:30px;margin-left: -60px;
+    color: #222;font-size:14px;text-shadow: 0px 2px 3px #555;}
+
+.edui-dialog-image .edui-image-content{height:330px;width:100%;position: relative;}
+
+.edui-dialog-image .edui-image-mask{display: none;position: absolute;top:0;left:0;width: 100%; height: 100%;background-color:#fff;
+    text-align: center;line-height:300px;color:#000;font-size:14px;font-weight:bold;opacity: 0.6;filter: alpha(opacity=60);}
+.edui-dialog-image .edui-image-mask.edui-active{display: block;}
+
+/*network*/
+.edui-dialog-image .edui-image-searchBar{margin: 10px;}
+.edui-dialog-image .edui-image-searchBar .edui-image-searchTxt{display: inline-block !important;*display: inline !important;*zoom:1;width:400px; border: 1px solid #c5d2ff; height: 20px; line-height: 18px; font-size: 14px; padding: 3px; margin: 0;outline:0;}
+.edui-dialog-image .edui-image-searchBar .edui-image-searchAdd{display: inline-block !important;*display: inline !important;*zoom:1;
+    width:60px; text-align:center;height: 25px;text-align: center;line-height: 25px;
+    background-color: #ffffff;padding: 0; border: 1px solid #ababab;margin-left: 20px;cursor: pointer;
+}
+.edui-dialog-image .edui-image-searchBar .edui-image-searchAdd.hover{
+    background-color: #d5e1f2;
+    padding: 0;
+    border: 1px solid #a3bde3;
+}
+.edui-dialog-image .edui-image-searchRes{height:280px;overflow:auto;}
+
+
+/*common*/
+.edui-dialog-image .edui-image-item{position:relative;float:left;width:120px;height:120px;border: 1px solid #CCC;cursor: default;margin: 5px 0 0 5px;}
+.edui-dialog-image .edui-image-item .edui-image-pic{position: absolute;left:-9999px;}
+.edui-dialog-image .edui-image-item .edui-image-close{position:absolute;right:0;background: url('images/close.png');width:17px;height:17px;cursor:pointer;z-index:1}
+.edui-dialog-image .edui-image-item.hover .edui-image-close{display: block;}
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/image.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/image.js
new file mode 100644
index 0000000..188f634
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/image.js
@@ -0,0 +1,445 @@
+(function () {
+
+    var utils = UM.utils,
+        browser = UM.browser,
+        Base = {
+        checkURL: function (url) {
+            if(!url)    return false;
+            url = utils.trim(url);
+            if (url.length <= 0) {
+                return false;
+            }
+            if (url.search(/http:\/\/|https:\/\//) !== 0) {
+                url += 'http://';
+            }
+
+            url=url.replace(/\?[\s\S]*$/,"");
+
+            if (!/(.gif|.jpg|.jpeg|.png)$/i.test(url)) {
+                return false;
+            }
+            return url;
+        },
+        getAllPic: function (sel, $w, editor) {
+            var me = this,
+                arr = [],
+                $imgs = $(sel, $w);
+
+            $.each($imgs, function (index, node) {
+                $(node).removeAttr("width").removeAttr("height");
+
+//                if (node.width > editor.options.initialFrameWidth) {
+//                    me.scale(node, editor.options.initialFrameWidth -
+//                        parseInt($(editor.body).css("padding-left"))  -
+//                        parseInt($(editor.body).css("padding-right")));
+//                }
+
+                return arr.push({
+                    _src: node.src,
+                    src: node.src
+                });
+            });
+
+            return arr;
+        },
+        scale: function (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;
+                    }
+                }
+            }
+
+            return this;
+        },
+        close: function ($img) {
+
+            $img.css({
+                top: ($img.parent().height() - $img.height()) / 2,
+                left: ($img.parent().width()-$img.width())/2
+            }).prev().on("click",function () {
+
+                if ( $(this).parent().remove().hasClass("edui-image-upload-item") ) {
+                    //显示图片计数-1
+                    Upload.showCount--;
+                    Upload.updateView();
+                }
+
+            });
+
+            return this;
+        },
+        createImgBase64: function (img, file, $w) {
+            if (browser.webkit) {
+                //Chrome8+
+                img.src = window.webkitURL.createObjectURL(file);
+            } else if (browser.gecko) {
+                //FF4+
+                img.src = window.URL.createObjectURL(file);
+            } else {
+                //实例化file reader对象
+                var reader = new FileReader();
+                reader.onload = function (e) {
+                    img.src = this.result;
+                    $w.append(img);
+                };
+                reader.readAsDataURL(file);
+            }
+        },
+        callback: function (editor, $w, url, state) {
+
+            if (state == "SUCCESS") {
+                //显示图片计数+1
+                Upload.showCount++;
+                var $img = $("<img src='" + editor.options.imagePath + url + "' class='edui-image-pic' />"),
+                    $item = $("<div class='edui-image-item edui-image-upload-item'><div class='edui-image-close'></div></div>").append($img);
+
+                if ($(".edui-image-upload2", $w).length < 1) {
+                    $(".edui-image-content", $w).append($item);
+
+                    Upload.render(".edui-image-content", 2)
+                        .config(".edui-image-upload2");
+                } else {
+                    $(".edui-image-upload2", $w).before($item).show();
+                }
+
+                $img.on("load", function () {
+                    Base.scale(this, 120);
+                    Base.close($(this));
+                    $(".edui-image-content", $w).focus();
+                });
+
+            } else {
+                currentDialog.showTip( state );
+                window.setTimeout( function () {
+
+                    currentDialog.hideTip();
+
+                }, 3000 );
+            }
+
+            Upload.toggleMask();
+
+        }
+    };
+
+    /*
+     * 本地上传
+     * */
+    var Upload = {
+        showCount: 0,
+        uploadTpl: '<div class="edui-image-upload%%">' +
+            '<span class="edui-image-icon"></span>' +
+            '<form class="edui-image-form" method="post" enctype="multipart/form-data" target="up">' +
+            '<input style=\"filter: alpha(opacity=0);\" class="edui-image-file" type="file" hidefocus name="upfile" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>' +
+            '</form>' +
+
+            '</div>',
+        init: function (editor, $w) {
+            var me = this;
+
+            me.editor = editor;
+            me.dialog = $w;
+            me.render(".edui-image-local", 1);
+            me.config(".edui-image-upload1");
+            me.submit();
+            me.drag();
+
+            $(".edui-image-upload1").hover(function () {
+                $(".edui-image-icon", this).toggleClass("hover");
+            });
+
+            if (!(UM.browser.ie && UM.browser.version <= 9)) {
+                $(".edui-image-dragTip", me.dialog).css("display", "block");
+            }
+
+
+            return me;
+        },
+        render: function (sel, t) {
+            var me = this;
+
+            $(sel, me.dialog).append($(me.uploadTpl.replace(/%%/g, t)));
+
+            return me;
+        },
+        config: function (sel) {
+            var me = this,
+                url=me.editor.options.imageUrl;
+
+            url=url + (url.indexOf("?") == -1 ? "?" : "&") + "editorid="+me.editor.id;//初始form提交地址;
+
+            $("form", $(sel, me.dialog)).attr("action", url);
+
+            return me;
+        },
+        uploadComplete: function(r){
+            var me = this;
+            try{
+                var json = eval('('+r+')');
+                Base.callback(me.editor, me.dialog, json.url, json.state);
+            }catch (e){
+                var lang = me.editor.getLang('image');
+                Base.callback(me.editor, me.dialog, '', (lang && lang.uploadError) || 'Error!');
+            }
+        },
+        submit: function (callback) {
+
+            var me = this,
+                input = $( '<input style="filter: alpha(opacity=0);" class="edui-image-file" type="file" hidefocus="" name="upfile" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp">'),
+                input = input[0];
+
+            $(me.dialog).delegate( ".edui-image-file", "change", function ( e ) {
+
+                if ( !this.parentNode ) {
+                    return;
+                }
+
+                $('<iframe name="up"  style="display: none"></iframe>').insertBefore(me.dialog).on('load', function(){
+                    var r = this.contentWindow.document.body.innerHTML;
+                    if(r == '')return;
+                    me.uploadComplete(r);
+                    $(this).unbind('load');
+                    $(this).remove();
+
+                });
+
+                $(this).parent()[0].submit();
+                Upload.updateInput( input );
+                me.toggleMask("Loading....");
+                callback && callback();
+
+            });
+
+            return me;
+        },
+        //更新input
+        updateInput: function ( inputField ) {
+
+            $( ".edui-image-file", this.dialog ).each( function ( index, ele ) {
+
+                ele.parentNode.replaceChild( inputField.cloneNode( true ), ele );
+
+            } );
+
+        },
+        //更新上传框
+        updateView: function () {
+
+            if ( Upload.showCount !== 0 ) {
+                return;
+            }
+
+            $(".edui-image-upload2", this.dialog).hide();
+            $(".edui-image-dragTip", this.dialog).show();
+            $(".edui-image-upload1", this.dialog).show();
+
+        },
+        drag: function () {
+            var me = this;
+            //做拽上传的支持
+            if (!UM.browser.ie9below) {
+                me.dialog.find('.edui-image-content').on('drop',function (e) {
+
+                    //获取文件列表
+                    var fileList = e.originalEvent.dataTransfer.files;
+                    var img = document.createElement('img');
+                    var hasImg = false;
+                    $.each(fileList, function (i, f) {
+                        if (/^image/.test(f.type)) {
+                            //创建图片的base64
+                            Base.createImgBase64(img, f, me.dialog);
+
+                            var xhr = new XMLHttpRequest();
+                            xhr.open("post", me.editor.getOpt('imageUrl') + "?type=ajax", true);
+                            xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+
+                            //模拟数据
+                            var fd = new FormData();
+                            fd.append(me.editor.getOpt('imageFieldName'), f);
+
+                            xhr.send(fd);
+                            xhr.addEventListener('load', function (e) {
+                                var r = e.target.response, json;
+                                me.uploadComplete(r);
+                                if (i == fileList.length - 1) {
+                                    $(img).remove()
+                                }
+                            });
+                            hasImg = true;
+                        }
+                    });
+                    if (hasImg) {
+                        e.preventDefault();
+                        me.toggleMask("Loading....");
+                    }
+
+                }).on('dragover', function (e) {
+                        e.preventDefault();
+                    });
+            }
+        },
+        toggleMask: function (html) {
+            var me = this;
+
+            var $mask = $(".edui-image-mask", me.dialog);
+            if (html) {
+                if (!(UM.browser.ie && UM.browser.version <= 9)) {
+                    $(".edui-image-dragTip", me.dialog).css( "display", "none" );
+                }
+                $(".edui-image-upload1", me.dialog).css( "display", "none" );
+                $mask.addClass("edui-active").html(html);
+            } else {
+
+                $mask.removeClass("edui-active").html();
+
+                if ( Upload.showCount > 0 ) {
+                    return me;
+                }
+
+                if (!(UM.browser.ie && UM.browser.version <= 9) ){
+                    $(".edui-image-dragTip", me.dialog).css("display", "block");
+                }
+                $(".edui-image-upload1", me.dialog).css( "display", "block" );
+            }
+
+            return me;
+        }
+    };
+
+    /*
+     * 网络图片
+     * */
+    var NetWork = {
+        init: function (editor, $w) {
+            var me = this;
+
+            me.editor = editor;
+            me.dialog = $w;
+
+            me.initEvt();
+        },
+        initEvt: function () {
+            var me = this,
+                url,
+                $ele = $(".edui-image-searchTxt", me.dialog);
+
+            $(".edui-image-searchAdd", me.dialog).on("click", function () {
+                url = Base.checkURL($ele.val());
+
+                if (url) {
+
+                    $("<img src='" + url + "' class='edui-image-pic' />").on("load", function () {
+
+
+
+                        var $item = $("<div class='edui-image-item'><div class='edui-image-close'></div></div>").append(this);
+
+                        $(".edui-image-searchRes", me.dialog).append($item);
+
+                        Base.scale(this, 120);
+
+                        $item.width($(this).width());
+
+                        Base.close($(this));
+
+                        $ele.val("");
+                    });
+                }
+            })
+                .hover(function () {
+                    $(this).toggleClass("hover");
+                });
+        }
+    };
+
+    var $tab = null,
+        currentDialog = null;
+
+    UM.registerWidget('image', {
+        tpl: "<link rel=\"stylesheet\" type=\"text/css\" href=\"<%=image_url%>image.css\">" +
+            "<div class=\"edui-image-wrapper\">" +
+            "<ul class=\"edui-tab-nav\">" +
+            "<li class=\"edui-tab-item edui-active\"><a data-context=\".edui-image-local\" class=\"edui-tab-text\"><%=lang_tab_local%></a></li>" +
+            "<li  class=\"edui-tab-item\"><a data-context=\".edui-image-JimgSearch\" class=\"edui-tab-text\"><%=lang_tab_imgSearch%></a></li>" +
+            "</ul>" +
+            "<div class=\"edui-tab-content\">" +
+            "<div class=\"edui-image-local edui-tab-pane edui-active\">" +
+            "<div class=\"edui-image-content\"></div>" +
+            "<div class=\"edui-image-mask\"></div>" +
+            "<div class=\"edui-image-dragTip\"><%=lang_input_dragTip%></div>" +
+            "</div>" +
+            "<div class=\"edui-image-JimgSearch edui-tab-pane\">" +
+            "<div class=\"edui-image-searchBar\">" +
+            "<table style=\"table-layout: initial;\"><tr><td><input class=\"edui-image-searchTxt\" type=\"text\"></td>" +
+            "<td><div class=\"edui-image-searchAdd\"><%=lang_btn_add%></div></td></tr></table>" +
+            "</div>" +
+            "<div class=\"edui-image-searchRes\"></div>" +
+            "</div>" +
+            "</div>" +
+            "</div>",
+        initContent: function (editor, $dialog) {
+            var lang = editor.getLang('image')["static"],
+                opt = $.extend({}, lang, {
+                    image_url: UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/image/'
+                });
+
+            Upload.showCount = 0;
+
+            if (lang) {
+                var html = $.parseTmpl(this.tpl, opt);
+            }
+
+            currentDialog = $dialog.edui();
+
+            this.root().html(html);
+
+        },
+        initEvent: function (editor, $w) {
+            $tab = $.eduitab({selector: ".edui-image-wrapper"})
+                .edui().on("beforeshow", function (e) {
+                    e.stopPropagation();
+                });
+
+            Upload.init(editor, $w);
+
+            NetWork.init(editor, $w);
+        },
+        buttons: {
+            'ok': {
+                exec: function (editor, $w) {
+                    var sel = "",
+                        index = $tab.activate();
+
+                    if (index == 0) {
+                        sel = ".edui-image-content .edui-image-pic";
+                    } else if (index == 1) {
+                        sel = ".edui-image-searchRes .edui-image-pic";
+                    }
+
+                    var list = Base.getAllPic(sel, $w, editor);
+
+                    if (index != -1) {
+                        editor.execCommand('insertimage', list);
+                    }
+                }
+            },
+            'cancel': {}
+        },
+        width: 700,
+        height: 408
+    }, function (editor, $w, url, state) {
+        Base.callback(editor, $w, url, state)
+    })
+})();
+
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/close.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/close.png
new file mode 100644
index 0000000..d368388
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/close.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/upload1.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/upload1.png
new file mode 100644
index 0000000..c9056ca
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/upload1.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/upload2.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/upload2.png
new file mode 100644
index 0000000..57ce63f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/image/images/upload2.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/link/link.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/link/link.js
new file mode 100644
index 0000000..2d0a30c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/link/link.js
@@ -0,0 +1,73 @@
+(function(){
+    var utils = UM.utils;
+    function hrefStartWith(href, arr) {
+        href = href.replace(/^\s+|\s+$/g, '');
+        for (var i = 0, ai; ai = arr[i++];) {
+            if (href.indexOf(ai) == 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    UM.registerWidget('link', {
+        tpl: "<style type=\"text/css\">" +
+            ".edui-dialog-link .edui-link-table{font-size: 12px;margin: 10px;line-height: 30px}" +
+            ".edui-dialog-link .edui-link-txt{width:300px;height:21px;line-height:21px;border:1px solid #d7d7d7;}" +
+            "</style>" +
+            "<table style=\"table-layout: initial;height: 75%;\" class=\"edui-link-table\">" +
+            "<tr>" +
+            "<td><label for=\"href\"><%=lang_input_url%></label></td>" +
+            "<td><input class=\"edui-link-txt\" id=\"edui-link-Jhref\" type=\"text\" /></td>" +
+            "</tr>" +
+            "<tr>" +
+            "<td><label for=\"title\"><%=lang_input_title%></label></td>" +
+            "<td><input class=\"edui-link-txt\" id=\"edui-link-Jtitle\" type=\"text\"/></td>" +
+            "</tr>" +
+            "<tr>" +
+            "<td colspan=\"2\">" +
+            "<label for=\"target\"><%=lang_input_target%></label>" +
+            "<input id=\"edui-link-Jtarget\" type=\"checkbox\"/>" +
+            "</td>" +
+            "</tr>" +
+//            "<tr>" +
+//            "<td colspan=\"2\" id=\"edui-link-Jmsg\"></td>" +
+//            "</tr>" +
+            "</table>",
+        initContent: function (editor) {
+            var lang = editor.getLang('link');
+            if (lang) {
+                var html = $.parseTmpl(this.tpl, lang.static);
+            }
+            this.root().html(html);
+        },
+        initEvent: function (editor, $w) {
+            var link = editor.queryCommandValue('link');
+            if(link){
+                $('#edui-link-Jhref',$w).val(utils.html($(link).attr('href')));
+                $('#edui-link-Jtitle',$w).val($(link).attr('title'));
+                $(link).attr('target') == '_blank' && $('#edui-link-Jtarget').attr('checked',true)
+            }
+            $('#edui-link-Jhref',$w).focus();
+        },
+        buttons: {
+            'ok': {
+                exec: function (editor, $w) {
+                    var href = $('#edui-link-Jhref').val().replace(/^\s+|\s+$/g, '');
+
+                    if (href) {
+                        editor.execCommand('link', {
+                            'href': href,
+                            'target': $("#edui-link-Jtarget:checked").length ? "_blank" : '_self',
+                            'title': $("#edui-link-Jtitle").val().replace(/^\s+|\s+$/g, ''),
+                            '_href': href
+                        });
+                    }
+                }
+            },
+            'cancel':{}
+        },
+        width: 400
+    })
+})();
+
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/map/map.html b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/map/map.html
new file mode 100644
index 0000000..be97a8c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/map/map.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8"/>
+    <meta name="keywords" content="百度地图,百度地图API,百度地图自定义工具,百度地图所见即所得工具"/>
+    <meta name="description" content="百度地图API自定义地图,帮助用户在可视化操作下生成百度地图"/>
+    <title>百度地图API自定义地图</title>
+    <!--引用百度地图API-->
+    <style type="text/css">
+        html, body {
+            margin: 0;
+            padding: 0;
+            overflow: hidden;
+        }
+    </style>
+    <script type="text/javascript" src="http://api.map.baidu.com/api?key=&v=2.0&ak=6b6c1a67eaa7db1ca6d6da28e590e343&services=true"></script>
+</head>
+
+<body onload="initMap();">
+<!--百度地图容器-->
+<div style="width:697px;height:550px;border:#ccc solid 1px;" id="dituContent"></div>
+</body>
+<script type="text/javascript">
+    function getParam(name) {
+        return location.href.match(new RegExp('[?#&]' + name + '=([^?#&]+)', 'i')) ? RegExp.$1 : '';
+    }
+    var map, marker;
+    var centerParam = getParam('center');
+    var zoomParam = getParam('zoom');
+    var widthParam = getParam('width');
+    var heightParam = getParam('height');
+    var markersParam = getParam('markers');
+    var markerStylesParam = getParam('markerStyles');
+    var iframe = getSelfIframe();
+    var UM = parent.UM;
+    var editor = getEditor();
+
+    //创建和初始化地图函数:
+    function initMap() {
+        // [FF]切换模式后报错
+        if (!window.BMap) {
+            return;
+        }
+        var dituContent = document.getElementById('dituContent');
+        dituContent.style.width = widthParam + 'px';
+        dituContent.style.height = heightParam + 'px';
+
+        createMap();//创建地图
+        setMapEvent();//设置地图事件
+        addMapControl();//向地图添加控件
+
+        // 创建标注
+        var markersArr = markersParam.split(',');
+        var point = new BMap.Point(markersArr[0], markersArr[1]);
+        marker = new BMap.Marker(point);
+        marker.enableDragging();
+        map.addOverlay(marker); // 将标注添加到地图中
+
+        if(iframe && UM && editor) { //在编辑状态下
+            setMapListener();//地图改变修改外层的iframe标签src属性
+        } else {
+            document.focus();
+        }
+    }
+
+    //创建地图函数:
+    function createMap() {
+        map = new BMap.Map("dituContent");//在百度地图容器中创建一个地图
+        var centerArr = centerParam.split(',');
+        var point = new BMap.Point(parseFloat(centerArr[0]), parseFloat(centerArr[1]));//定义一个中心点坐标
+        map.centerAndZoom(point, parseInt(zoomParam));//设定地图的中心点和坐标并将地图显示在地图容器中
+    }
+
+    //地图事件设置函数:
+    function setMapEvent() {
+        map.enableDragging();//启用地图拖拽事件,默认启用(可不写)
+        map.enableScrollWheelZoom();//启用地图滚轮放大缩小
+        map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写)
+        map.enableKeyboard();//启用键盘上下左右键移动地图
+    }
+
+    //地图控件添加函数:
+    function addMapControl() {
+        //向地图中添加缩放控件
+        var ctrl_nav = new BMap.NavigationControl({anchor: BMAP_ANCHOR_TOP_LEFT, type: BMAP_NAVIGATION_CONTROL_LARGE});
+        map.addControl(ctrl_nav);
+        //向地图中添加缩略图控件
+        var ctrl_ove = new BMap.OverviewMapControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, isOpen: 1});
+        map.addControl(ctrl_ove);
+        //向地图中添加比例尺控件
+        var ctrl_sca = new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT});
+        map.addControl(ctrl_sca);
+    }
+
+    function setMapListener() {
+        var timer;
+
+        map.addEventListener('moveend', mapListenerHandler);
+        map.addEventListener('zoomend', mapListenerHandler);
+        marker.addEventListener('dragend', mapListenerHandler);
+
+        function mapListenerHandler() {
+            var zoom = map.getZoom(),
+                center = map.getCenter(),
+                marker = window.marker.P;
+
+            iframe.src = iframe.src.
+                replace(new RegExp('([?#&])center=([^?#&]+)', 'i'), '$1center=' + center.lng + ',' + center.lat).
+                replace(new RegExp('([?#&])markers=([^?#&]+)', 'i'), '$1markers=' + marker.lng + ',' + marker.lat).
+                replace(new RegExp('([?#&])zoom=([^?#&]+)', 'i'), '$1zoom=' + zoom);
+            editor.fireEvent('saveScene');
+            saveScene(editor);
+        }
+
+        function saveScene(){
+            if(!timer) {
+                timer = setTimeout(function(){
+                    editor.fireEvent('savescene');
+                    editor.fireEvent('contentchange');
+                    timer = null;
+                }, 1000);
+            }
+        }
+    }
+
+    function getSelfIframe(){
+        var iframes = parent.document.getElementsByTagName('iframe');
+        for (var key in iframes) {
+            if (iframes[key].contentWindow == window) {
+                return iframes[key];
+            }
+        }
+        return null;
+    }
+
+    function getEditor(){
+        var parentNode = iframe.parentNode;
+        while (parentNode && parentNode.tagName && parentNode.tagName.toLowerCase() != 'body') {
+            if (parentNode.className && parentNode.className.indexOf('edui-body-container')!=-1) {
+                return UM.getEditor(parentNode.id);
+            }
+            parentNode = parentNode.parentNode;
+        }
+        return null;
+    }
+</script>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/map/map.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/map/map.js
new file mode 100644
index 0000000..1775093
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/map/map.js
@@ -0,0 +1,263 @@
+(function () {
+
+    var widgetName = 'map';
+
+    UM.registerWidget(widgetName, {
+
+        tpl: "<style type=\"text/css\">" +
+            ".edui-dialog-map .edui-map-content{width:530px; height: 350px;margin: 10px auto;}" +
+            ".edui-dialog-map .edui-map-content table{width: 100%}" +
+            ".edui-dialog-map .edui-map-content table td{vertical-align: middle;}" +
+            ".edui-dialog-map .edui-map-button { border: 1px solid #ccc; float: left; cursor: default; height: 23px; width: 70px; cursor: pointer; margin: 0; font-size: 12px; line-height: 24px; text-align: center; }" +
+            ".edui-dialog-map .edui-map-button:hover {background:#eee;}" +
+            ".edui-dialog-map .edui-map-city,.edui-dialog-map .edui-map-address{height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}" +
+            ".edui-dialog-map .edui-map-city{width:90px}" +
+            ".edui-dialog-map .edui-map-address{width:150px}" +
+            ".edui-dialog-map .edui-map-dynamic-label span{vertical-align:middle;margin: 3px 0px 3px 3px;}" +
+            ".edui-dialog-map .edui-map-dynamic-label input{vertical-align:middle;margin: 3px;}" +
+            "</style>" +
+            "<div class=\"edui-map-content\">" +
+            "<table style=\"table-layout: initial;\">" +
+            "<tr>" +
+            "<td><%=lang_city%>:</td>" +
+            "<td><input class=\"edui-map-city\" type=\"text\" value=\"<%=city.value%>\"/></td>" +
+            "<td><%=lang_address%>:</td>" +
+            "<td><input class=\"edui-map-address\" type=\"text\" value=\"\" /></td>" +
+            "<td><a class=\"edui-map-button\"><%=lang_search%></a></td>" +
+            "<td><label class=\"edui-map-dynamic-label\"><input class=\"edui-map-dynamic\" type=\"checkbox\" name=\"edui-map-dynamic\" /><span><%=lang_dynamicmap%></span></label></td>"+
+            "</tr>" +
+            "</table>" +
+            "<div style=\"width:100%;height:340px;margin:5px auto;border:1px solid gray\" class=\"edui-map-container\"></div>" +
+            "</div>" +
+            "<script class=\"edui-tpl-container\" type=\"text/plain\">" +
+            "<!DOCTYPE html>" +
+            "<html>" +
+            "<head>" +
+            "<title></title>" +
+            "</head>" +
+            "<body>" +
+            "<scr_ipt>" +
+            "window.onload = function(){" +
+            "var scripts = document.scripts || document.getElementsByTagName(\"script\")," +
+            "src = [];" +
+            "for( var i = 1, len = scripts.length; i<len; i++ ) {" +
+            "src.push( scripts[i].src );" +
+            "}" +
+            "parent.UM.getEditor(<<id>>).getWidgetData(\'map\').requestMapApi( src );" +
+            "};" +
+            "function mapReadyStateChange ( state ) { " +
+            " if ( state === 'complete' || state === 'loaded' ) {" +
+            " document.close(); " +
+            " } }" +
+            "</scr_ipt>" +
+            "<scr_ipt onreadystatechange='mapReadyStateChange(this.readyState);' onload='mapReadyStateChange(\"loaded\");' src=\"http://api.map.baidu.com/api?v=2.0&ak=6b6c1a67eaa7db1ca6d6da28e590e343&services=true\"></scr_ipt>" +
+            "</body>" +
+            "</html>" +
+            "</script>",
+        initContent: function (editor, $widget) {
+
+            var me = this,
+                lang = editor.getLang(widgetName),
+                theme_url = editor.options.themePath + editor.options.theme;
+
+            if( me.inited ) {
+                me.preventDefault();
+                return false;
+            }
+
+            me.inited = true;
+
+            me.lang = lang;
+            me.editor = editor;
+
+            me.root().html($.parseTmpl(me.tpl, $.extend({}, lang['static'], {
+                'theme_url': theme_url
+            })));
+
+            me.initRequestApi();
+
+        },
+        /**
+         * 初始化请求API
+         */
+        initRequestApi: function () {
+
+            var $ifr = null;
+
+            //已经初始化过, 不用再次初始化
+            if (window.BMap && window.BMap.Map) {
+                this.initBaiduMap();
+            } else {
+
+                $ifr = $('<iframe style="display: none;"></iframe>');
+                $ifr.appendTo( this.root() );
+
+                $ifr = $ifr[ 0 ].contentWindow.document;
+
+                $ifr.open();
+                $ifr.write( this.root().find(".edui-tpl-container").html().replace( /scr_ipt/g, 'script').replace('<<id>>',"'" + this.editor.id + "'") );
+
+            }
+
+        },
+        requestMapApi: function (src) {
+
+            var me = this;
+
+            if (src.length) {
+
+                var _src = src[0];
+
+                src = src.slice(1);
+
+                if (_src) {
+                    $.getScript(_src, function () {
+                        me.requestMapApi(src);
+                    });
+                } else {
+                    me.requestMapApi(src);
+                }
+
+            } else {
+
+                me.initBaiduMap();
+
+            }
+
+
+        },
+        initBaiduMap: function () {
+
+            var $root = this.root(),
+                map = new BMap.Map($root.find(".edui-map-container")[0]),
+                me = this,
+                marker,
+                point,
+                imgcss,
+                img = $(me.editor.selection.getRange().getClosedNode());
+
+            map.enableInertialDragging();
+            map.enableScrollWheelZoom();
+            map.enableContinuousZoom();
+
+            if (img.length && /api[.]map[.]baidu[.]com/ig.test(img.attr("src"))) {
+                var url = img.attr("src"),
+                    centerPos = me.getPars(url, "center").split(","),
+                    markerPos = me.getPars(url, "markers").split(",");
+                point = new BMap.Point(Number(centerPos[0]), Number(centerPos[1]));
+                marker = new BMap.Marker(new BMap.Point(Number(markerPos[0]), Number(markerPos[1])));
+                map.addControl(new BMap.NavigationControl());
+                map.centerAndZoom(point, Number(me.getPars(url, "zoom")));
+                imgcss = img.attr('style');
+            } else {
+                point = new BMap.Point(116.404, 39.915);    // 创建点坐标
+                marker = new BMap.Marker(point);
+                map.addControl(new BMap.NavigationControl());
+                map.centerAndZoom(point, 10);                     // 初始化地图,设置中心点坐标和地图级别。
+            }
+            marker.enableDragging();
+            map.addOverlay(marker);
+
+            me.map = map;
+            me.marker = marker;
+            me.imgcss = imgcss;
+        },
+        doSearch: function () {
+            var me = this,
+                city = me.root().find('.edui-map-city').val(),
+                address = me.root().find('.edui-map-address').val();
+
+            if (!city) {
+                alert(me.lang.cityMsg);
+                return;
+            }
+            var search = new BMap.LocalSearch(city, {
+                onSearchComplete: function (results) {
+                    if (results && results.getNumPois()) {
+                        var points = [];
+                        for (var i = 0; i < results.getCurrentNumPois(); i++) {
+                            points.push(results.getPoi(i).point);
+                        }
+                        if (points.length > 1) {
+                            me.map.setViewport(points);
+                        } else {
+                            me.map.centerAndZoom(points[0], 13);
+                        }
+                        point = me.map.getCenter();
+                        me.marker.setPoint(point);
+                    } else {
+                        alert(me.lang.errorMsg);
+                    }
+                }
+            });
+            search.search(address || city);
+        },
+        getPars: function (str, par) {
+            var reg = new RegExp(par + "=((\\d+|[.,])*)", "g");
+            return reg.exec(str)[1];
+        },
+        reset: function(){
+            this.map && this.map.reset();
+        },
+        initEvent: function () {
+            var me = this,
+                $root = me.root();
+
+            $root.find('.edui-map-address').on('keydown', function (evt) {
+                evt = evt || event;
+                if (evt.keyCode == 13) {
+                    me.doSearch();
+                    return false;
+                }
+            });
+
+            $root.find(".edui-map-button").on('click', function (evt) {
+                me.doSearch();
+            });
+
+            $root.find(".edui-map-address").focus();
+
+            $root.on( "mousewheel DOMMouseScroll", function ( e ) {
+                return false;
+            } );
+
+        },
+        width: 580,
+        height: 408,
+        buttons: {
+            ok: {
+                exec: function (editor) {
+                    var widget = editor.getWidgetData(widgetName),
+                        center = widget.map.getCenter(),
+                        zoom = widget.map.getZoom(),
+                        size = widget.map.getSize(),
+                        point = widget.marker.P;
+
+                    if (widget.root().find(".edui-map-dynamic")[0].checked) {
+                        var URL = editor.getOpt('UMEDITOR_HOME_URL'),
+                            url = [URL + (/\/$/.test(URL) ? '':'/') + "dialogs/map/map.html" +
+                                '#center=' + center.lng + ',' + center.lat,
+                                '&zoom=' + zoom,
+                                '&width=' + size.width,
+                                '&height=' + size.height,
+                                '&markers=' + point.lng + ',' + point.lat].join('');
+                        editor.execCommand('inserthtml', '<iframe class="ueditor_baidumap" src="' + url + '" frameborder="0" width="' + (size.width+4) + '" height="' + (size.height+4) + '"></iframe>');
+                    } else {
+                        url = "http://api.map.baidu.com/staticimage?center=" + center.lng + ',' + center.lat +
+                            "&zoom=" + zoom + "&width=" + size.width + '&height=' + size.height + "&markers=" + point.lng + ',' + point.lat;
+                        editor.execCommand('inserthtml', '<img width="' + size.width + '"height="' + size.height + '" src="' + url + '"' + (widget.imgcss ? ' style="' + widget.imgcss + '"' : '') + '/>', true);
+                    }
+
+                    widget.reset();
+                }
+            },
+            cancel: {
+                exec: function(editor){
+                    editor.getWidgetData(widgetName).reset();
+                }
+            }
+        }
+    });
+
+})();
+
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/center_focus.jpg b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/center_focus.jpg
new file mode 100644
index 0000000..262b029
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/center_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/left_focus.jpg b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/left_focus.jpg
new file mode 100644
index 0000000..7886d27
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/left_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/none_focus.jpg b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/none_focus.jpg
new file mode 100644
index 0000000..7c768dc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/none_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/right_focus.jpg b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/right_focus.jpg
new file mode 100644
index 0000000..173e10d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/images/right_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/video.css b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/video.css
new file mode 100644
index 0000000..e046d8c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/video.css
@@ -0,0 +1,59 @@
+@charset "utf-8";
+.edui-dialog-video .edui-video-wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative}
+.edui-dialog-video .edui-video-tabbody{height:335px;}
+.edui-dialog-video .edui-video-panel { position: absolute;width:100%; height:100%;background: #fff;}
+.edui-dialog-video .edui-video-panel table td{vertical-align: middle;}
+.edui-dialog-video #eduiVideoUrl {
+    width: 470px;
+    height: 21px;
+    line-height: 21px;
+    margin: 8px 5px;
+    background: #FFF;
+    border: 1px solid #d7d7d7;
+}
+.edui-dialog-video #eduiVideoSearchTxt{margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;}
+.edui-dialog-video #searchList{width: 570px;overflow: auto;zoom:1;height: 270px;}
+.edui-dialog-video #searchList div{float: left;width: 120px;height: 135px;margin: 5px 15px;}
+.edui-dialog-video #searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*不用缩略图*/
+.edui-dialog-video #searchList p{margin-left: 10px;}
+.edui-dialog-video #eduiVideoType{
+    width: 65px;
+    height: 23px;
+    line-height: 22px;
+    border: 1px solid #d7d7d7;
+}
+.edui-dialog-video #eduiVideoSearchBtn,.edui-dialog-video #eduiVideoSearchReset{
+    /*width: 80px;*/
+    height: 25px;
+    line-height: 25px;
+    background: #eee;
+    border: 1px solid #d7d7d7;
+    cursor: pointer;
+    padding: 0 5px;
+}
+
+
+
+.edui-dialog-video #eduiVideoPreview{width: 420px; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left}
+.edui-dialog-video #eduiVideoInfo {width: 120px;float: left;margin-left: 10px;_margin-left:7px;}
+.edui-dialog-video .edui-video-wrapper fieldset{
+    border: 1px solid #ddd;
+    padding-left: 5px;
+    margin-bottom: 20px;
+    padding-bottom: 5px;
+    width: 115px;
+}
+.edui-dialog-video .edui-video-wrapper fieldset legend{font-weight: bold;}
+.edui-dialog-video .edui-video-wrapper fieldset p{line-height: 30px;}
+.edui-dialog-video .edui-video-wrapper fieldset input.edui-video-txt{
+    width: 65px;
+    height: 21px;
+    line-height: 21px;
+    margin: 8px 5px;
+    background: #FFF;
+    border: 1px solid #d7d7d7;
+}
+.edui-dialog-video .edui-video-wrapper label.edui-video-url{font-weight: bold;margin-left: 5px;color: #06c;}
+.edui-dialog-video #eduiVideoFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;}
+.edui-dialog-video #eduiVideoFloat .edui-video-focus{opacity: 1;filter: alpha(opacity = 100)}
+.edui-dialog-video .edui-video-wrapper span.edui-video-view{display: inline-block;width: 30px;float: right;cursor: pointer;color: blue}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/video.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/video.js
new file mode 100644
index 0000000..a2d5ffd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/dialogs/video/video.js
@@ -0,0 +1,282 @@
+
+(function(){
+    var domUtils = UM.dom.domUtils;
+    var widgetName = 'video';
+
+    UM.registerWidget( widgetName,{
+
+        tpl: "<link rel=\"stylesheet\" type=\"text/css\" href=\"<%=video_url%>video.css\" />" +
+            "<div class=\"edui-video-wrapper\">" +
+            "<div id=\"eduiVideoTab\">" +
+            "<div id=\"eduiVideoTabHeads\" class=\"edui-video-tabhead\">" +
+            "<span tabSrc=\"video\" class=\"edui-video-focus\"><%=lang_tab_insertV%></span>" +
+            "</div>" +
+            "<div id=\"eduiVideoTabBodys\" class=\"edui-video-tabbody\">" +
+            "<div id=\"eduiVideoPanel\" class=\"edui-video-panel\">" +
+            "<table style=\"table-layout: initial;\"><tr><td><label for=\"eduiVideoUrl\" class=\"edui-video-url\"><%=lang_video_url%></label></td><td><input id=\"eduiVideoUrl\" type=\"text\"></td></tr></table>" +
+            "<div id=\"eduiVideoPreview\"></div>" +
+            "<div id=\"eduiVideoInfo\">" +
+            "<fieldset>" +
+            "<legend><%=lang_video_size%></legend>" +
+            "<table style=\"table-layout: initial;\">" +
+            "<tr><td><label for=\"eduiVideoWidth\"><%=lang_videoW%></label></td><td><input class=\"edui-video-txt\" id=\"eduiVideoWidth\" type=\"text\"/></td></tr>" +
+            "<tr><td><label for=\"eduiVideoHeight\"><%=lang_videoH%></label></td><td><input class=\"edui-video-txt\" id=\"eduiVideoHeight\" type=\"text\"/></td></tr>" +
+            "</table>" +
+            "</fieldset>" +
+            "<fieldset>" +
+            "<legend><%=lang_alignment%></legend>" +
+            "<div id=\"eduiVideoFloat\"></div>" +
+            "</fieldset>" +
+            "</div>" +
+            "</div>" +
+            "</div>" +
+            "</div>" +
+            "</div>",
+        initContent:function( editor, $widget ){
+
+            var me = this,
+                lang = editor.getLang( widgetName),
+                video_url = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/video/';
+
+            me.lang = lang;
+            me.editor = editor;
+            me.$widget = $widget;
+            me.root().html( $.parseTmpl( me.tpl, $.extend( { video_url: video_url }, lang['static'] ) ) );
+
+            me.initController( lang );
+
+        },
+        initEvent:function(){
+
+            var me = this,
+                url = $("#eduiVideoUrl", me.$widget)[0];
+
+            if( 'oninput' in url ) {
+                url.oninput = function(){
+                    me.createPreviewVideo( this.value );
+                };
+            } else {
+                url.onpropertychange = function () {
+                    me.createPreviewVideo( this.value );
+                }
+            }
+
+        },
+        initController: function( lang ){
+
+            var me = this,
+                img = me.editor.selection.getRange().getClosedNode(),
+                url;
+
+            me.createAlignButton( ["eduiVideoFloat"] );
+
+            //编辑视频时初始化相关信息
+            if(img && img.className == "edui-faked-video"){
+                $("#eduiVideoUrl", me.$widget)[0].value = url = img.getAttribute("_url");
+                $("#eduiVideoWidth", me.$widget)[0].value = img.width;
+                $("#eduiVideoHeight", me.$widget)[0].value = img.height;
+                var align = domUtils.getComputedStyle(img,"float"),
+                    parentAlign = domUtils.getComputedStyle(img.parentNode,"text-align");
+                me.updateAlignButton(parentAlign==="center"?"center":align);
+            }
+            me.createPreviewVideo(url);
+
+        },
+        /**
+         * 根据url生成视频预览
+         */
+        createPreviewVideo: function(url){
+
+            if ( !url )return;
+
+            var me = this,
+                lang = me.lang,
+                conUrl = me.convert_url(url);
+
+            if(!me.endWith(conUrl,[".swf",".flv",".wmv"])){
+                $("#eduiVideoPreview", me.$widget).html( lang.urlError );
+                return;
+            }
+            $("#eduiVideoPreview", me.$widget)[0].innerHTML = '<embed type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
+                ' src="' + url + '"' +
+                ' width="' + 420  + '"' +
+                ' height="' + 280  + '"' +
+                ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" ></embed>';
+
+        },
+        /**
+         * 将单个视频信息插入编辑器中
+         */
+        insertSingle: function(){
+
+            var me = this,
+                width = $("#eduiVideoWidth", me.$widget)[0],
+                height = $("#eduiVideoHeight", me.$widget)[0],
+                url=$('#eduiVideoUrl', me.$widget)[0].value,
+                align = this.findFocus("eduiVideoFloat","name");
+
+            if(!url) return false;
+            if ( !me.checkNum( [width, height] ) ) return false;
+            this.editor.execCommand('insertvideo', {
+                url: me.convert_url(url),
+                width: width.value,
+                height: height.value,
+                align: align
+            });
+
+        },
+        /**
+         * URL转换
+         */
+        convert_url: function(url){
+            if ( !url ) return '';
+            var matches = url.match(/youtu.be\/(\w+)$/) ||
+                    url.match(/youtube\.com\/watch\?v=(\w+)/) ||
+                    url.match(/youtube.com\/v\/(\w+)/),
+                youku = url.match(/youku\.com\/v_show\/id_(\w+)/),
+                youkuPlay = /player\.youku\.com/ig.test(url);
+
+            if(youkuPlay){
+                url = url.replace(/\?f=.*/, "");
+            } else if (matches){
+                url = "https://www.youtube.com/v/" + matches[1] + "?version=3&feature=player_embedded";
+            }else if(youku){
+                url = "http://player.youku.com/player.php/sid/"+youku[1]+"/v.swf"
+            } else {
+                url = url.replace(/http:\/\/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "http://www.tudou.com/v/$1")
+                    .replace(/http:\/\/www\.youtube\.com\/watch\?v=([\w\-]+)/i, "http://www.youtube.com/v/$1")
+                    .replace(/http:\/\/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, "http://player.youku.com/player.php/sid/$1")
+                    .replace(/http:\/\/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "http://player.56.com/v_$1.swf")
+                    .replace(/http:\/\/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "http://player.56.com/v_$1.swf")
+                    .replace(/http:\/\/v\.ku6\.com\/.+\/([^.]+)\.html/i, "http://player.ku6.com/refer/$1/v.swf")
+                    .replace(/\?f=.*/, "");
+            }
+            return url;
+        },
+        /**
+         * 检测传入的所有input框中输入的长宽是否是正数
+         */
+        checkNum: function checkNum( nodes ) {
+
+            var me = this;
+
+            for ( var i = 0, ci; ci = nodes[i++]; ) {
+                var value = ci.value;
+                if ( !me.isNumber( value ) && value) {
+                    alert( me.lang.numError );
+                    ci.value = "";
+                    ci.focus();
+                    return false;
+                }
+            }
+            return true;
+        },
+        /**
+         * 数字判断
+         * @param value
+         */
+        isNumber: function( value ) {
+            return /(0|^[1-9]\d*$)/.test( value );
+        },
+        updateAlignButton: function( align ) {
+            var aligns = $( "#eduiVideoFloat", this.$widget )[0].children;
+
+            for ( var i = 0, ci; ci = aligns[i++]; ) {
+                if ( ci.getAttribute( "name" ) == align ) {
+                    if ( ci.className !="edui-video-focus" ) {
+                        ci.className = "edui-video-focus";
+                    }
+                } else {
+                    if ( ci.className =="edui-video-focus" ) {
+                        ci.className = "";
+                    }
+                }
+            }
+
+        },
+        /**
+         * 创建图片浮动选择按钮
+         * @param ids
+         */
+        createAlignButton: function( ids ) {
+            var lang = this.lang,
+                vidoe_home = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/video/';
+
+            for ( var i = 0, ci; ci = ids[i++]; ) {
+                var floatContainer = $( "#" + ci, this.$widget ) [0],
+                    nameMaps = {"none":lang['default'], "left":lang.floatLeft, "right":lang.floatRight};
+                for ( var j in nameMaps ) {
+                    var div = document.createElement( "div" );
+                    div.setAttribute( "name", j );
+                    if ( j == "none" ) div.className="edui-video-focus";
+                    div.style.cssText = "background:url("+ vidoe_home +"images/" + j + "_focus.jpg);";
+                    div.setAttribute( "title", nameMaps[j] );
+                    floatContainer.appendChild( div );
+                }
+                this.switchSelect( ci );
+            }
+        },
+        /**
+         * 选择切换
+         */
+        switchSelect: function( selectParentId ) {
+            var selects = $( "#" + selectParentId, this.$widget )[0].children;
+            for ( var i = 0, ci; ci = selects[i++]; ) {
+               $(ci).on("click", function () {
+                    for ( var j = 0, cj; cj = selects[j++]; ) {
+                        cj.className = "";
+                        cj.removeAttribute && cj.removeAttribute( "class" );
+                    }
+                    this.className = "edui-video-focus";
+                } )
+            }
+        },
+        /**
+         * 找到id下具有focus类的节点并返回该节点下的某个属性
+         * @param id
+         * @param returnProperty
+         */
+        findFocus: function( id, returnProperty ) {
+            var tabs = $( "#" + id , this.$widget)[0].children,
+                property;
+            for ( var i = 0, ci; ci = tabs[i++]; ) {
+                if ( ci.className=="edui-video-focus" ) {
+                    property = ci.getAttribute( returnProperty );
+                    break;
+                }
+            }
+            return property;
+        },
+        /**
+         * 末尾字符检测
+         */
+        endWith: function(str,endStrArr){
+            for(var i=0,len = endStrArr.length;i<len;i++){
+                var tmp = endStrArr[i];
+                if(str.length - tmp.length<0) return false;
+
+                if(str.substring(str.length-tmp.length)==tmp){
+                    return true;
+                }
+            }
+            return false;
+        },
+        width:610,
+        height:498,
+        buttons: {
+            ok: {
+                exec: function( editor, $w ){
+                    $("#eduiVideoPreview", $w).html("");
+                    editor.getWidgetData(widgetName).insertSingle();
+                }
+            },
+            cancel: {
+                exec: function(){
+                    //清除视频
+                    $("#eduiVideoPreview").html("");
+                }
+            }
+        }
+    });
+
+})();
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/index.html b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/index.html
new file mode 100644
index 0000000..71e71cc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/index.html
@@ -0,0 +1,277 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <title>UMEDITOR 完整demo</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <link href="themes/default/css/umeditor.css" type="text/css" rel="stylesheet">
+    <script type="text/javascript" src="third-party/jquery.min.js"></script>
+    <script type="text/javascript" charset="utf-8" src="umeditor.config.js"></script>
+    <script type="text/javascript" charset="utf-8" src="umeditor.min.js"></script>
+    <script type="text/javascript" src="lang/zh-cn/zh-cn.js"></script>
+    <style type="text/css">
+        h1{
+            font-family: "微软雅黑";
+            font-weight: normal;
+        }
+        .btn {
+            display: inline-block;
+            *display: inline;
+            padding: 4px 12px;
+            margin-bottom: 0;
+            *margin-left: .3em;
+            font-size: 14px;
+            line-height: 20px;
+            color: #333333;
+            text-align: center;
+            text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+            vertical-align: middle;
+            cursor: pointer;
+            background-color: #f5f5f5;
+            *background-color: #e6e6e6;
+            background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+            background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+            background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+            background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+            background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+            background-repeat: repeat-x;
+            border: 1px solid #cccccc;
+            *border: 0;
+            border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+            border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+            border-bottom-color: #b3b3b3;
+            -webkit-border-radius: 4px;
+            -moz-border-radius: 4px;
+            border-radius: 4px;
+            filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+            filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+            *zoom: 1;
+            -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+            -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+        }
+
+        .btn:hover,
+        .btn:focus,
+        .btn:active,
+        .btn.active,
+        .btn.disabled,
+        .btn[disabled] {
+            color: #333333;
+            background-color: #e6e6e6;
+            *background-color: #d9d9d9;
+        }
+
+        .btn:active,
+        .btn.active {
+            background-color: #cccccc \9;
+        }
+
+        .btn:first-child {
+            *margin-left: 0;
+        }
+
+        .btn:hover,
+        .btn:focus {
+            color: #333333;
+            text-decoration: none;
+            background-position: 0 -15px;
+            -webkit-transition: background-position 0.1s linear;
+            -moz-transition: background-position 0.1s linear;
+            -o-transition: background-position 0.1s linear;
+            transition: background-position 0.1s linear;
+        }
+
+        .btn:focus {
+            outline: thin dotted #333;
+            outline: 5px auto -webkit-focus-ring-color;
+            outline-offset: -2px;
+        }
+
+        .btn.active,
+        .btn:active {
+            background-image: none;
+            outline: 0;
+            -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+            -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+            box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+        }
+
+        .btn.disabled,
+        .btn[disabled] {
+            cursor: default;
+            background-image: none;
+            opacity: 0.65;
+            filter: alpha(opacity=65);
+            -webkit-box-shadow: none;
+            -moz-box-shadow: none;
+            box-shadow: none;
+        }
+    </style>
+</head>
+<body>
+<h1>UMEDITOR 完整demo</h1>
+
+<!--style给定宽度可以影响编辑器的最终宽度-->
+<script type="text/plain" id="myEditor" style="width:1000px;height:240px;">
+    <p>这里我可以写一些输入提示</p>
+</script>
+
+
+<div class="clear"></div>
+<div id="btns">
+    <table>
+        <tr>
+            <td>
+                <button class="btn" unselected="on" onclick="getAllHtml()">获得整个html的内容</button>&nbsp;
+                <button class="btn" onclick="getContent()">获得内容</button>&nbsp;
+                <button class="btn" onclick="setContent()">写入内容</button>&nbsp;
+                <button class="btn" onclick="setContent(true)">追加内容</button>&nbsp;
+                <button class="btn" onclick="getContentTxt()">获得纯文本</button>&nbsp;
+                <button class="btn" onclick="getPlainTxt()">获得带格式的纯文本</button>&nbsp;
+                <button class="btn" onclick="hasContent()">判断是否有内容</button>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <button class="btn" onclick="setFocus()">编辑器获得焦点</button>&nbsp;
+                <button class="btn" onmousedown="isFocus();return false;">编辑器是否获得焦点</button>&nbsp;
+                <button class="btn" onclick="doBlur()">编辑器取消焦点</button>&nbsp;
+                <button class="btn" onclick="insertHtml()">插入给定的内容</button>&nbsp;
+                <button class="btn" onclick="getContentTxt()">获得纯文本</button>&nbsp;
+                <button class="btn" id="enable" onclick="setEnabled()">可以编辑</button>&nbsp;
+                <button class="btn" onclick="setDisabled()">不可编辑</button>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <button class="btn" onclick="UM.getEditor('myEditor').setHide()">隐藏编辑器</button>&nbsp;
+                <button class="btn" onclick="UM.getEditor('myEditor').setShow()">显示编辑器</button>&nbsp;
+                <button class="btn" onclick="UM.getEditor('myEditor').setHeight(300)">设置编辑器的高度为300</button>&nbsp;
+                <button class="btn" onclick="UM.getEditor('myEditor').setWidth(1200)">设置编辑器的宽度为1200</button>
+            </td>
+        </tr>
+
+    </table>
+</div>
+<table>
+    <tr>
+        <td>
+            <button class="btn" onclick="createEditor()"/>创建编辑器</button>
+            <button class="btn" onclick="deleteEditor()"/>删除编辑器</button>
+        </td>
+    </tr>
+</table>
+
+<div>
+    <h3 id="focush2"></h3>
+</div>
+<script type="text/javascript">
+    //实例化编辑器
+    var um = UM.getEditor('myEditor');
+    um.addListener('blur',function(){
+        $('#focush2').html('编辑器失去焦点了')
+    });
+    um.addListener('focus',function(){
+        $('#focush2').html('')
+    });
+    //按钮的操作
+    function insertHtml() {
+        var value = prompt('插入html代码', '');
+        um.execCommand('insertHtml', value)
+    }
+    function isFocus(){
+        alert(um.isFocus())
+    }
+    function doBlur(){
+        um.blur()
+    }
+    function createEditor() {
+        enableBtn();
+        um = UM.getEditor('myEditor');
+    }
+    function getAllHtml() {
+        alert(UM.getEditor('myEditor').getAllHtml())
+    }
+    function getContent() {
+        var arr = [];
+        arr.push("使用editor.getContent()方法可以获得编辑器的内容");
+        arr.push("内容为:");
+        arr.push(UM.getEditor('myEditor').getContent());
+        alert(arr.join("\n"));
+    }
+    function getPlainTxt() {
+        var arr = [];
+        arr.push("使用editor.getPlainTxt()方法可以获得编辑器的带格式的纯文本内容");
+        arr.push("内容为:");
+        arr.push(UM.getEditor('myEditor').getPlainTxt());
+        alert(arr.join('\n'))
+    }
+    function setContent(isAppendTo) {
+        var arr = [];
+        arr.push("使用editor.setContent('欢迎使用umeditor')方法可以设置编辑器的内容");
+        UM.getEditor('myEditor').setContent('欢迎使用umeditor', isAppendTo);
+        alert(arr.join("\n"));
+    }
+    function setDisabled() {
+        UM.getEditor('myEditor').setDisabled('fullscreen');
+        disableBtn("enable");
+    }
+
+    function setEnabled() {
+        UM.getEditor('myEditor').setEnabled();
+        enableBtn();
+    }
+
+    function getText() {
+        //当你点击按钮时编辑区域已经失去了焦点,如果直接用getText将不会得到内容,所以要在选回来,然后取得内容
+        var range = UM.getEditor('myEditor').selection.getRange();
+        range.select();
+        var txt = UM.getEditor('myEditor').selection.getText();
+        alert(txt)
+    }
+
+    function getContentTxt() {
+        var arr = [];
+        arr.push("使用editor.getContentTxt()方法可以获得编辑器的纯文本内容");
+        arr.push("编辑器的纯文本内容为:");
+        arr.push(UM.getEditor('myEditor').getContentTxt());
+        alert(arr.join("\n"));
+    }
+    function hasContent() {
+        var arr = [];
+        arr.push("使用editor.hasContents()方法判断编辑器里是否有内容");
+        arr.push("判断结果为:");
+        arr.push(UM.getEditor('myEditor').hasContents());
+        alert(arr.join("\n"));
+    }
+    function setFocus() {
+        UM.getEditor('myEditor').focus();
+    }
+    function deleteEditor() {
+        disableBtn();
+        UM.getEditor('myEditor').destroy();
+    }
+    function disableBtn(str) {
+        var div = document.getElementById('btns');
+        var btns = domUtils.getElementsByTagName(div, "button");
+        for (var i = 0, btn; btn = btns[i++];) {
+            if (btn.id == str) {
+                domUtils.removeAttributes(btn, ["disabled"]);
+            } else {
+                btn.setAttribute("disabled", "true");
+            }
+        }
+    }
+    function enableBtn() {
+        var div = document.getElementById('btns');
+        var btns = domUtils.getElementsByTagName(div, "button");
+        for (var i = 0, btn; btn = btns[i++];) {
+            domUtils.removeAttributes(btn, ["disabled"]);
+        }
+    }
+</script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/en.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/en.js
new file mode 100644
index 0000000..45b2f1a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/en.js
@@ -0,0 +1,150 @@
+/**
+ * English language package
+ */
+UM.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', 'image':'Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link',
+        'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap',
+        'video':'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', 'highlightcode':'Code', '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',
+        'drafts': 'drafts', 'formula':'formula'
+    },
+    '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'
+    },
+    'ok':"OK",
+    'cancel':"Cancel",
+    'closeDialog':"closeDialog",
+    'tableDrag':"You must import the file uiUtils.js before drag! ",
+    'autofloatMsg':"The plugin AutoFloat depends on EditorUI!",
+    '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',
+    'more':'More',
+    'pasteOpt':'Paste Option',
+    'pasteSourceFormat':"Keep Source Formatting",
+    'tagFormat':'Keep tag',
+    'pasteTextFormat':'Keep Text only',
+
+    //===============dialog i18N=======================
+    'image':{
+        'static':{
+            'lang_tab_local':"Local Upload",
+            'lang_tab_imgSearch':"Network Pictures",
+            'lang_input_dragTip':"Support drag upload",
+            'lang_btn_add':"Add"
+        },
+        'uploadError': 'Upload Error'
+    },
+    '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!'
+    },
+    '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!"
+    },
+    'video':{
+        'static':{
+            'lang_tab_insertV':"Video",
+            '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"}
+        },
+        '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':" &nbsp;The video is loading, please wait…",
+        'clickToSelect':"Click to select",
+        'goToSource':'Visit source video ',
+        'noVideo':" &nbsp; &nbsp;Sorry,can't find the video,please try again!"
+    },
+    'formula':{
+        'static':{
+            'lang_tab_common':'Common',
+            'lang_tab_symbol':'Symbol',
+            'lang_tab_letter':'Letter'
+        }
+    }
+};
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/addimage.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/addimage.png
new file mode 100644
index 0000000..3a2fd17
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/addimage.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/alldeletebtnhoverskin.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/alldeletebtnhoverskin.png
new file mode 100644
index 0000000..355eeab
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/alldeletebtnhoverskin.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/alldeletebtnupskin.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/alldeletebtnupskin.png
new file mode 100644
index 0000000..61658ce
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/alldeletebtnupskin.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/background.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/background.png
new file mode 100644
index 0000000..d5bf5fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/background.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/button.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/button.png
new file mode 100644
index 0000000..098874c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/button.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/copy.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/copy.png
new file mode 100644
index 0000000..f982e8b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/copy.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/deletedisable.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/deletedisable.png
new file mode 100644
index 0000000..c8ee750
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/deletedisable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/deleteenable.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/deleteenable.png
new file mode 100644
index 0000000..26acc88
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/deleteenable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/imglabel.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/imglabel.png
new file mode 100644
index 0000000..da401e6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/imglabel.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/listbackground.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/listbackground.png
new file mode 100644
index 0000000..4f82ccd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/listbackground.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/localimage.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/localimage.png
new file mode 100644
index 0000000..12c8e6a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/localimage.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/music.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/music.png
new file mode 100644
index 0000000..2f495fe
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/music.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotateleftdisable.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotateleftdisable.png
new file mode 100644
index 0000000..741526e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotateleftdisable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotateleftenable.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotateleftenable.png
new file mode 100644
index 0000000..e164ddb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotateleftenable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotaterightdisable.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotaterightdisable.png
new file mode 100644
index 0000000..5a78c26
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotaterightdisable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotaterightenable.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotaterightenable.png
new file mode 100644
index 0000000..d768531
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/rotaterightenable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/upload.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/upload.png
new file mode 100644
index 0000000..7bb15b3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/en/images/upload.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/copy.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/copy.png
new file mode 100644
index 0000000..b2536aa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/copy.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/imglabel.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/imglabel.png
new file mode 100644
index 0000000..4fc3c88
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/imglabel.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/localimage.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/localimage.png
new file mode 100644
index 0000000..7303c36
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/localimage.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/music.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/music.png
new file mode 100644
index 0000000..354edeb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/music.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/upload.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/upload.png
new file mode 100644
index 0000000..08d4d92
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/images/upload.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/zh-cn.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/zh-cn.js
new file mode 100644
index 0000000..13d8cba
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/lang/zh-cn/zh-cn.js
@@ -0,0 +1,150 @@
+/**
+ * 中文语言包
+ */
+UM.I18N['zh-cn'] = {
+    'labelMap':{
+        'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图',
+        'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框',
+        'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用',
+        'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览',
+        'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期',
+        'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格',
+        'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行', 'splittocols':'拆分成列', 'splittocells':'完全拆分单元格',
+        'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言','fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'image':'图片',
+        'edittable':'表格属性','edittd':'单元格属性', 'link':'超链接','emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'百度地图',
+        'video':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐',
+        'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表',
+        'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入',
+        'rowspacingtop':'段前距', 'rowspacingbottom':'段后距', 'highlightcode':'插入代码', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认',
+        'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存',
+        'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版', 'webapp':'百度应用',
+        'touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦','music':'音乐','inserttable':'插入表格',
+        'drafts': '草稿箱', 'formula':'数学公式'
+
+
+    },
+    'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'},
+    'fontfamily':{
+        'songti':'宋体',
+        'kaiti':'楷体',
+        'heiti':'黑体',
+        'lishu':'隶书',
+        'yahei':'微软雅黑',
+        'andaleMono':'andale mono',
+        'arial': 'arial',
+        'arialBlack':'arial black',
+        'comicSansMs':'comic sans ms',
+        'impact':'impact',
+        'timesNewRoman':'times new roman'
+    },
+    'ok':"确认",
+    'cancel':"取消",
+    'closeDialog':"关闭对话框",
+    'tableDrag':"表格拖动必须引入uiUtils.js文件!",
+    'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!",
+    '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':'只保留文本',
+
+    //===============dialog i18N=======================
+    'image':{
+        'static':{
+            'lang_tab_local':"本地上传",
+            'lang_tab_imgSearch':"网络图片",
+            'lang_input_dragTip':"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择图片上传",
+            'lang_btn_add':"添加"
+        },
+        'uploadError': '上传出错'
+    },
+    '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':'无法定位到该地址!'
+    },
+    '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':"抱歉,找不到该位置!"
+    },
+    'video':{
+        'static':{
+            'lang_tab_insertV':"插入视频",
+            'lang_video_url':"视频网址",
+            'lang_video_size':"视频尺寸",
+            'lang_videoW':"宽度",
+            'lang_videoH':"高度",
+            'lang_alignment':"对齐方式",
+            'videoSearchTxt':{'value':"请输入搜索关键字!"},
+            'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]},
+            'videoSearchBtn':{'value':"百度一下"},
+            'videoSearchReset':{'value':"清空结果"}
+        },
+        'numError':"请输入正确的数值,如123,400",
+        'floatLeft':"左浮动",
+        'floatRight':"右浮动",
+        'default':"默认",
+        'block':"独占一行",
+        'urlError':"输入的视频地址有误,请检查后再试!",
+        'loading':" &nbsp;视频加载中,请等待……",
+        'clickToSelect':"点击选中",
+        'goToSource':'访问源视频',
+        'noVideo':" &nbsp; &nbsp;抱歉,找不到对应的视频,请重试!"
+    },
+    'formula':{
+        'static':{
+            'lang_tab_common':'常用公式',
+            'lang_tab_symbol':'符号',
+            'lang_tab_letter':'字母'
+        }
+    }
+};
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/css/umeditor.css b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/css/umeditor.css
new file mode 100644
index 0000000..16590ae
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/css/umeditor.css
@@ -0,0 +1,777 @@
+.edui-container{
+    position: relative;
+    border: 1px solid #d4d4d4;
+    box-shadow: 2px 2px 5px #d3d6da;
+    background-color: #fff;
+}
+.edui-container .edui-toolbar{
+    position: relative;
+    width:auto;
+    border-bottom: 1px solid #e1e1e1;
+    box-shadow: 2px 2px 5px #d3d6da;
+    background-color: #fafafa;
+    z-index: 99999;
+}
+.edui-toolbar .edui-btn-toolbar{
+    position: relative;
+    padding: 5px;
+}
+.edui-container .edui-editor-body{
+    background-color: #fff;
+}
+.edui-editor-body .edui-body-container{
+}
+
+.edui-editor-body .edui-body-container p{margin:5px 0;}
+.edui-editor-body .edui-body-container{
+    border:0;
+    outline:none;
+    cursor:text;
+    padding:0 10px 0;
+    overflow:auto;
+    display:block;
+    word-wrap:break-word;
+    font-size:16px;
+    font-family:sans-serif;
+}
+.edui-editor-body.focus{border:1px solid #5c9dff}
+.edui-editor-body table{margin:10px 0 10px;border-collapse:collapse;display:table;}
+.edui-editor-body td{padding: 5px 10px;border: 1px solid #DDD;}
+.edui-editor-body iframe.mathquill-embedded-latex{
+    border: 0px;
+    padding: 0px;
+    display: inline;
+    margin: 0px;
+    background: none;
+    vertical-align: middle;
+    width: 0px;
+    height: 0px;
+}
+/*普通按钮*/
+.edui-btn-toolbar .edui-btn{
+    position: relative;
+    display: inline-block;
+    vertical-align: top;
+    *display: inline;
+    *zoom:1;
+    width:auto;
+    margin: 0 1px;
+    padding:1px;
+    border:none;
+    background: none;
+}
+.edui-btn-toolbar .edui-btn .edui-icon{
+    width: 20px;
+    height: 20px;
+    margin: 0;
+    padding:0;
+    background-repeat: no-repeat;
+    background-image: url(../images/icons.png);
+    background-image: url(../images/icons.gif) \9;
+}
+
+/*状态反射*/
+.edui-btn-toolbar .edui-btn.edui-hover,
+.edui-btn-toolbar .edui-btn.edui-active{
+    background-color: #d5e1f2;
+    padding: 0;
+    border: 1px solid #a3bde3;
+    _z-index: 1;
+}
+.edui-btn-toolbar .edui-btn.edui-disabled{
+    opacity: 0.3;
+    filter: alpha(opacity = 30);
+}
+.edui-btn-toolbar .edui-btn .edui-icon-source {
+    background-position:-260px -0px;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-undo {
+    background-position: -160px 0;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-redo {
+    background-position: -100px 0;
+}
+.edui-btn-toolbar  .edui-btn .edui-icon-bold{
+    background-position: 0 0;
+}
+.edui-btn-toolbar  .edui-btn .edui-icon-italic {
+    background-position: -60px 0;
+}
+.edui-btn-toolbar  .edui-btn .edui-icon-underline  {
+    background-position: -140px 0
+}
+.edui-btn-toolbar .edui-btn .edui-icon-strikethrough {
+    background-position: -120px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-superscript {
+    background-position: -620px 0;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-subscript {
+    background-position:  -600px 0;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-font, .edui-btn-toolbar .edui-btn .edui-icon-forecolor {
+    background-position: -720px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-backcolor {
+    background-position: -760px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-insertorderedlist {
+    background-position: -80px 0;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-insertunorderedlist {
+    background-position:   -20px 0;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-selectall {
+    background-position: -400px -20px;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-cleardoc {
+    background-position: -520px 0;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-paragraph {
+    background-position: -140px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-fontfamily {
+    background-position: -140px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-fontsize {
+    background-position: -140px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-justifyleft {
+    background-position: -460px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-justifycenter {
+    background-position: -420px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-justifyright {
+    background-position:-480px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-justifyjustify {
+    background-position: -440px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-link {
+    background-position: -500px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-unlink {
+    background-position: -640px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-image {
+    background-position: -380px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-emotion {
+    background-position: -60px -20px;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-video {
+    background-position: -320px -20px;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-map {
+    background-position:  -40px -40px;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-gmap {
+    background-position:  -260px -40px;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-horizontal {
+    background-position: -360px 0;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-print {
+    background-position: -440px -20px;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-preview {
+    background-position: -420px -20px;
+}
+
+.edui-btn-toolbar .edui-btn-fullscreen{
+    float:right;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-fullscreen {
+    background-position: -100px -20px;
+}
+
+.edui-btn-toolbar .edui-btn .edui-icon-removeformat {
+    background-position: -580px 0;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-drafts {
+    background-position: -560px 0;
+}
+.edui-btn-toolbar .edui-btn .edui-icon-formula {
+    background-position: -80px -20px;
+}
+.edui-btn-toolbar .edui-splitbutton{
+    position: relative;
+    display: inline-block ;
+    vertical-align: top;
+    *display: inline ;
+    *zoom:1;
+    margin:0 2px;
+}
+.edui-splitbutton .edui-btn{
+    margin: 0;
+}
+.edui-splitbutton .edui-caret{
+    position: relative;
+    display: inline-block ;
+    vertical-align: top;
+    *display: inline ;
+    *zoom:1;
+    width: 8px;
+    height: 20px;
+    background: url(../images/icons.png) -741px 0;
+    _background: url(../images/icons.gif) -741px 0;
+}
+
+.edui-btn-toolbar .edui-splitbutton,
+.edui-btn-toolbar .edui-splitbutton{
+    _border: none;
+}
+
+/*状态反射*/
+.edui-btn-toolbar .edui-splitbutton.edui-hover .edui-btn{
+    background-color: #d5e1f2;
+}
+
+.edui-btn-toolbar .edui-splitbutton.edui-disabled{
+    opacity: 0.3;
+    filter: alpha(opacity = 30);
+}
+.edui-btn-toolbar .edui-splitbutton.edui-disabled .edui-caret{
+    opacity: 0.3 \0;
+    filter: alpha(opacity = 30)\0;
+}
+
+
+.edui-btn-toolbar .edui-combobox{
+    border: 1px solid #CCC;
+    padding:0;
+    margin:0 2px;
+    line-height: 20px;
+}
+.edui-combobox .edui-button-label{
+    position: relative;
+    display: inline-block;
+    vertical-align: top;
+    *display: inline ;
+    *zoom:1;
+    width:60px;
+    height:20px;
+    line-height: 20px;
+    padding: 2px;
+    margin: 0;
+    font-size: 12px;
+    text-align: center;
+    cursor: default;
+}
+.edui-combobox  .edui-button-spacing{
+    position: relative;
+    display: inline-block ;
+    vertical-align: top;
+    *display: inline ;
+    *zoom:1;
+    height:20px;
+    margin: 0;
+    padding:0 3px;
+}
+.edui-combobox .edui-caret{
+    position: relative;
+    display: inline-block ;
+    vertical-align: top;
+    *display: inline ;
+    *zoom:1;
+    height:20px;
+    width: 12px;
+    margin: 0;
+    padding: 0;
+    background: url(../images/icons.png) -741px 0;
+    _background: url(../images/icons.gif) -741px 0;
+}
+.edui-btn-toolbar .edui-combobox.edui-disabled{
+    opacity: 0.2;
+    filter: alpha(opacity = 20);
+}
+.edui-btn-toolbar .edui-combobox.edui-disabled .edui-button-label,
+.edui-btn-toolbar .edui-combobox.edui-disabled .edui-caret{
+    opacity: 0.2 \0;
+    filter: alpha(opacity = 20)\0;
+}
+.edui-combobox-menu{
+    position: absolute;
+    top: 100%;
+    left: 0;
+    display: none;
+    list-style: none;
+    text-decoration: none;
+    margin: 0;
+    padding:5px;
+    background-color: #ffffff;
+    border: 1px solid #ccc;
+    font-size: 12px;
+    box-shadow: 2px 2px 5px #d3d6da;
+    min-width: 160px;
+    _width: 160px;
+}
+
+.edui-combobox-menu .edui-combobox-item {
+    display: block;
+    border: 1px solid white;
+}
+
+.edui-combobox-menu .edui-combobox-item-label {
+    height: 25px;
+    line-height: 25px;
+    display: inline-block;
+    _display: inline;
+    _zoom: 1;
+    margin-left: 10px;
+}
+
+.edui-combobox-menu .edui-combobox-item:hover, .edui-combobox-menu .edui-combobox-stack-item:hover, .edui-combobox-menu .edui-combobox-item-hover {
+    background-color: #d5e1f2;
+    padding: 0;
+    border: 1px solid #a3bde3;
+}
+
+.edui-combobox-menu .edui-combobox-item .edui-combobox-icon {
+    display: inline-block;
+    *zoom: 1;
+    *display: inline;
+    width: 24px;
+    height: 25px;
+    background: red;
+    vertical-align: bottom;
+    background: url(../images/ok.gif) no-repeat 1000px 1000px;
+}
+
+.edui-combobox-menu .edui-combobox-checked .edui-combobox-icon {
+    background-position: 10px 7px;
+}
+
+
+.edui-combobox-menu .edui-combobox-item-separator {
+    min-width: 160px;
+    height: 1px;
+    line-height: 1px;
+    overflow: hidden;
+    background: #d3d3d3;
+    margin: 5px 0;
+    *margin-top: -8px;
+}
+
+/* 字体样式校正 */
+
+.edui-combobox-fontsize .edui-combobox-item-0.edui-combobox-checked .edui-combobox-icon {
+    background-position: 10px 7px;
+}
+
+.edui-combobox-fontsize .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon {
+    background-position: 10px 7px;
+}
+
+.edui-combobox-fontsize .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon {
+    background-position: 10px 7px;
+}
+
+.edui-combobox-fontsize .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon {
+    background-position: 10px 7px;
+}
+
+/* 24 */
+.edui-combobox-fontsize .edui-combobox-item-4 .edui-combobox-item-label {
+    height: 27px;
+    line-height: 27px;
+}
+
+.edui-combobox-fontsize .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon {
+    background-position: 10px 5px;
+}
+
+/* 32 */
+.edui-combobox-fontsize .edui-combobox-item-5 .edui-combobox-item-label {
+    height: 31px;
+    line-height: 31px;
+}
+
+.edui-combobox-fontsize .edui-combobox-item-5.edui-combobox-checked .edui-combobox-icon {
+    background-position: 10px 4px;
+}
+
+
+/* 48 */
+.edui-combobox-fontsize .edui-combobox-item-6 .edui-combobox-item-label {
+    height: 47px;
+    line-height: 47px;
+}
+
+/*.edui-combobox-fontsize .edui-combobox-item-6 .edui-combobox-icon {*/
+    /*height: 25px;*/
+    /*margin-bottom: 11px;*/
+/*}*/
+
+/*.edui-combobox-fontsize .edui-combobox-item-6.edui-combobox-checked .edui-combobox-icon {*/
+    /*background-position: 10px 7px;*/
+/*}*/
+
+
+/* 段落样式校正 */
+/* h1 */
+.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-item-label {
+    font-size: 32px;
+    height: 36px;
+    line-height: 36px;
+}
+
+.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-icon {
+    height: 25px;
+    margin-bottom: 5px;
+}
+
+.edui-combobox-paragraph .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon {
+    background-position: 10px 7px;
+}
+
+/* h2 */
+.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-item-label {
+    font-size: 28px;
+    height: 27px;
+    line-height: 27px;
+}
+
+.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-icon {
+    margin-bottom: 5px;
+}
+
+.edui-combobox-paragraph .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon {
+    background-position: 10px 10px;
+}
+
+/* h3 */
+.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-item-label {
+    font-size: 24px;
+    height: 25px;
+    line-height: 25px;
+}
+
+.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-icon {
+    height: 25px;
+    margin-bottom: 5px;
+}
+
+.edui-combobox-paragraph .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon {
+    background-position: 10px 11px;
+}
+
+/* h4 */
+.edui-combobox-paragraph .edui-combobox-item-4 .edui-combobox-item-label {
+    font-size: 18px;
+    height: 25px;
+    line-height: 25px;
+}
+
+.edui-combobox-paragraph .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon {
+    background-position: 10px 6px;
+}
+
+/* h5 */
+.edui-combobox-paragraph .edui-combobox-item-5 .edui-combobox-item-label {
+    font-size: 16px;
+}
+
+/* h6 */
+.edui-combobox-paragraph .edui-combobox-item-6 .edui-combobox-item-label {
+    font-size: 12px;
+}
+.edui-modal {
+    position: fixed;
+    _position: absolute;
+    top: 10%;
+    left: 50%;
+    border: 1px solid #acacac;
+    box-shadow: 2px 2px 5px #d3d6da;
+    background-color: #ffffff;
+    outline: 0;
+    /*新加*/
+    width:60%;
+    height:67%;
+    margin:auto;
+}
+.edui-modal-header {
+    padding: 5px 10px;
+    border-bottom: 1px solid #eee;
+}
+.edui-modal-header .edui-close {
+    float: right;
+    width:20px;
+    height:20px;
+    margin-top: 2px;
+    padding: 1px;
+    border: 0;
+    background: url("../images/close.png") no-repeat center center;
+    cursor: pointer;
+}
+.edui-modal-header .edui-close.edui-hover {
+    background-color: #d5e1f2;
+    padding:0;
+    border: 1px solid #a3bde3;
+}
+.edui-modal-header .edui-title {
+    margin: 0;
+    line-height: 25px;
+    font-size: 20px;
+}
+.edui-modal-body {
+    position: relative;
+    max-height: 400px;
+    font-size: 12px;
+    overflow-y: auto;
+}
+.edui-modal-footer {
+    float: right;
+    padding: 5px 15px 15px;
+    overflow: hidden;
+}
+.edui-modal-footer .edui-btn {
+    float: left;
+    height: 24px;
+    width: 96px;
+    margin: 0 10px;
+    background-color: #ffffff;
+    padding: 0;
+    border: 1px solid #ababab;
+    font-size: 12px;
+    line-height: 24px;
+    text-align: center;
+    cursor: pointer;
+}
+.edui-modal-footer .edui-btn.edui-hover{
+    background-color: #d5e1f2;
+    border: 1px solid #a3bde3;
+}
+.edui-modal-backdrop{
+    opacity: 0.5;
+    filter: alpha(opacity=50);
+    position: fixed;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    background-color: #c6c6c6;
+}
+
+.edui-modal .edui-modal-tip {
+    color: red;
+    position: absolute;
+    bottom: 10px;
+    left: 10px;
+    height: 30px;
+    line-height: 30px;
+    display: none;
+}
+/*图片上传*/
+.edui-dialog-image-body {
+    width: 700px;
+    height: 400px;
+}
+/*插入视频*/
+.edui-dialog-video-body{
+    width: 600px;
+    height: 350px;
+}
+/*谷歌地图*/
+.edui-dialog-gmap-body{
+    width:550px;
+    height: 400px;
+}
+
+/*百度地图*/
+.edui-dialog-map-body{
+    width:580px;
+    height: 400px;
+}
+
+/*链接*/
+.edui-dialog-link-body{
+    width:400px;
+    height:200px;
+}
+.edui-popup{
+    display: none;
+    background: url('../images/pop-bg.png') repeat #fff;
+    padding: 2px;
+}
+.edui-popup .edui-popup-body{
+    border: 1px solid #bfbfbf;
+    background-color: #fff;
+}
+.edui-popup .edui-popup-caret{
+    width: 21px;
+    height: 11px;
+}
+.edui-popup .edui-popup-caret.up{
+    background:url('../images/caret.png') no-repeat 0 0;
+}
+.edui-popup .edui-popup-caret.down{
+    background:url('../images/caret.png') no-repeat 0 0;
+}
+
+
+.edui-tab-nav {
+    margin: 0;
+    padding:0;
+    border-bottom: 1px solid #ddd;
+    list-style: none;
+    height:30px;
+}
+.edui-tab-nav .edui-tab-item {
+    float:left;
+    margin-bottom: -1px;
+    margin-top: 1px;
+    margin-top: 0\9;
+}
+.edui-tab-nav .edui-tab-item .edui-tab-text{
+    display: block;
+    padding:8px 12px;
+    border: 1px solid transparent;
+    color: #0088cc;
+    text-decoration: none;
+    outline: 0;
+    _border:1px solid #fff ;
+    cursor: pointer;
+}
+.edui-tab-nav .edui-tab-item .edui-tab-text:FOCUS {
+    outline: none;
+}
+.edui-tab-nav .edui-tab-item.edui-active  .edui-tab-text{
+    border: 1px solid #ddd;
+    border-bottom-color: transparent;
+    background-color: #fff;
+    padding:8px 12px;
+    color: #555555;
+    cursor: default;
+}
+.edui-tab-content .edui-tab-pane{
+    padding: 1px;
+    position: relative;
+    display: none;
+    background-color: #fff;
+    clear: both;
+}
+.edui-tab-content .edui-tab-pane.edui-active{
+    display: block;
+}
+
+
+.edui-btn-toolbar .edui-tooltip{
+    position: absolute;
+    padding: 5px 0;
+    display: none;
+    /*opacity: 0.8;*/
+    /*filter: alpha(opacity=80);*/
+    z-index: 99999;
+}
+.edui-tooltip .edui-tooltip-arrow{
+    position: absolute;
+    top: 0;
+    _top: -2px;
+    left: 50%;
+    width: 0;
+    height: 0;
+    padding: 0;
+    font-size:0;
+    margin-left: -5px;
+    border-color: transparent;
+    border-style: dashed dashed solid dashed;
+    border-bottom-color: #000000;
+    border-width: 0 5px 5px;
+    background: transparent;
+}
+.edui-tooltip .edui-tooltip-inner{
+    padding: 6px;
+    color: #ffffff;
+    text-align: center;
+    text-decoration: none;
+    font-size: 10px;
+    background-color: #000000;
+    white-space: nowrap;
+    line-height: 12px;
+}
+.edui-splitbutton-color-label {
+    width: 16px;
+    height: 3px;
+    position: absolute;
+    bottom: 2px;
+    left: 50%;
+    margin-left: -8px;
+    overflow: hidden;
+    line-height: 3px;
+}
+.edui-popup .edui-colorpicker {
+    margin: 10px;
+    font-size: 12px;
+}
+.edui-colorpicker .edui-colorpicker-topbar{
+    height: 27px;
+    width: 200px;
+    overflow: hidden;
+}
+.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-preview{
+    height: 20px;
+    border: 1px inset black;
+    margin-left: 1px;
+    width: 128px;
+    float: left;
+}
+.edui-colorpicker .edui-colorpicker-topbar .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-colorpicker table{
+    border-collapse: collapse;
+    border-spacing: 2px;
+}
+.edui-colorpicker tr.edui-colorpicker-firstrow{
+    height: 30px;
+}
+.edui-colorpicker table td{
+    padding: 0 2px;
+}
+.edui-colorpicker table td .edui-colorpicker-colorcell{
+    display: block;
+    text-decoration: none;
+    color: black;
+    width: 14px;
+    height: 14px;
+    margin: 0;
+    cursor: pointer;
+}
+.edui-toolbar .edui-separator{
+    width: 2px;
+    height: 20px;
+    padding: 1px 2px;
+    background: url(../images/icons.png) -179px 1px;
+    background: url(../images/icons.gif) -179px 1px \9;
+    display: inline-block ;
+    vertical-align: top;
+    *display: inline ;
+    *zoom:1;
+    border:none;
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/css/umeditor.min.css b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/css/umeditor.min.css
new file mode 100644
index 0000000..cb7eb5f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/css/umeditor.min.css
@@ -0,0 +1,8 @@
+/*!
+ * UEditor Mini版本
+ * version: 1.2.2
+ * build: Thu Dec 22 2016 16:36:28 GMT+0800 (CST)
+ */
+
+
+.edui-container{position:relative;border:1px solid #d4d4d4;box-shadow:2px 2px 5px #d3d6da;background-color:#fff}.edui-container .edui-toolbar{position:relative;width:auto;border-bottom:1px solid #e1e1e1;box-shadow:2px 2px 5px #d3d6da;background-color:#fafafa;z-index:99999}.edui-toolbar .edui-btn-toolbar{position:relative;padding:5px}.edui-container .edui-editor-body{background-color:#fff}.edui-editor-body .edui-body-container{}.edui-editor-body .edui-body-container p{margin:5px 0}.edui-editor-body .edui-body-container{border:0;outline:0;cursor:text;padding:0 10px;overflow:auto;display:block;word-wrap:break-word;font-size:16px;font-family:sans-serif}.edui-editor-body.focus{border:1px solid #5c9dff}.edui-editor-body table{margin:10px 0;border-collapse:collapse;display:table}.edui-editor-body td{padding:5px 10px;border:1px solid #DDD}.edui-editor-body iframe.mathquill-embedded-latex{border:0;padding:0;display:inline;margin:0;background:0 0;vertical-align:middle;width:0;height:0}.edui-btn-toolbar .edui-btn{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;width:auto;margin:0 1px;padding:1px;border:0;background:0 0}.edui-btn-toolbar .edui-btn .edui-icon{width:20px;height:20px;margin:0;padding:0;background-repeat:no-repeat;background-image:url(../images/icons.png);background-image:url(../images/icons.gif) \9}.edui-btn-toolbar .edui-btn.edui-hover,.edui-btn-toolbar .edui-btn.edui-active{background-color:#d5e1f2;padding:0;border:1px solid #a3bde3;_z-index:1}.edui-btn-toolbar .edui-btn.edui-disabled{opacity:.3;filter:alpha(opacity=30)}.edui-btn-toolbar .edui-btn .edui-icon-source{background-position:-260px -0px}.edui-btn-toolbar .edui-btn .edui-icon-undo{background-position:-160px 0}.edui-btn-toolbar .edui-btn .edui-icon-redo{background-position:-100px 0}.edui-btn-toolbar .edui-btn .edui-icon-bold{background-position:0 0}.edui-btn-toolbar .edui-btn .edui-icon-italic{background-position:-60px 0}.edui-btn-toolbar .edui-btn .edui-icon-underline{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-strikethrough{background-position:-120px 0}.edui-btn-toolbar .edui-btn .edui-icon-superscript{background-position:-620px 0}.edui-btn-toolbar .edui-btn .edui-icon-subscript{background-position:-600px 0}.edui-btn-toolbar .edui-btn .edui-icon-font,.edui-btn-toolbar .edui-btn .edui-icon-forecolor{background-position:-720px 0}.edui-btn-toolbar .edui-btn .edui-icon-backcolor{background-position:-760px 0}.edui-btn-toolbar .edui-btn .edui-icon-insertorderedlist{background-position:-80px 0}.edui-btn-toolbar .edui-btn .edui-icon-insertunorderedlist{background-position:-20px 0}.edui-btn-toolbar .edui-btn .edui-icon-selectall{background-position:-400px -20px}.edui-btn-toolbar .edui-btn .edui-icon-cleardoc{background-position:-520px 0}.edui-btn-toolbar .edui-btn .edui-icon-paragraph{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-fontfamily{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-fontsize{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifyleft{background-position:-460px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifycenter{background-position:-420px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifyright{background-position:-480px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifyjustify{background-position:-440px 0}.edui-btn-toolbar .edui-btn .edui-icon-link{background-position:-500px 0}.edui-btn-toolbar .edui-btn .edui-icon-unlink{background-position:-640px 0}.edui-btn-toolbar .edui-btn .edui-icon-image{background-position:-380px 0}.edui-btn-toolbar .edui-btn .edui-icon-emotion{background-position:-60px -20px}.edui-btn-toolbar .edui-btn .edui-icon-video{background-position:-320px -20px}.edui-btn-toolbar .edui-btn .edui-icon-map{background-position:-40px -40px}.edui-btn-toolbar .edui-btn .edui-icon-gmap{background-position:-260px -40px}.edui-btn-toolbar .edui-btn .edui-icon-horizontal{background-position:-360px 0}.edui-btn-toolbar .edui-btn .edui-icon-print{background-position:-440px -20px}.edui-btn-toolbar .edui-btn .edui-icon-preview{background-position:-420px -20px}.edui-btn-toolbar .edui-btn-fullscreen{float:right}.edui-btn-toolbar .edui-btn .edui-icon-fullscreen{background-position:-100px -20px}.edui-btn-toolbar .edui-btn .edui-icon-removeformat{background-position:-580px 0}.edui-btn-toolbar .edui-btn .edui-icon-drafts{background-position:-560px 0}.edui-btn-toolbar .edui-btn .edui-icon-formula{background-position:-80px -20px}.edui-btn-toolbar .edui-splitbutton{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;margin:0 2px}.edui-splitbutton .edui-btn{margin:0}.edui-splitbutton .edui-caret{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;width:8px;height:20px;background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0}.edui-btn-toolbar .edui-splitbutton,.edui-btn-toolbar .edui-splitbutton{_border:0}.edui-btn-toolbar .edui-splitbutton.edui-hover .edui-btn{background-color:#d5e1f2}.edui-btn-toolbar .edui-splitbutton.edui-disabled{opacity:.3;filter:alpha(opacity=30)}.edui-btn-toolbar .edui-splitbutton.edui-disabled .edui-caret{opacity:.3 \0;filter:alpha(opacity=30)\0}.edui-btn-toolbar .edui-combobox{border:1px solid #CCC;padding:0;margin:0 2px;line-height:20px}.edui-combobox .edui-button-label{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;width:60px;height:20px;line-height:20px;padding:2px;margin:0;font-size:12px;text-align:center;cursor:default}.edui-combobox .edui-button-spacing{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;height:20px;margin:0;padding:0 3px}.edui-combobox .edui-caret{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;height:20px;width:12px;margin:0;padding:0;background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0}.edui-btn-toolbar .edui-combobox.edui-disabled{opacity:.2;filter:alpha(opacity=20)}.edui-btn-toolbar .edui-combobox.edui-disabled .edui-button-label,.edui-btn-toolbar .edui-combobox.edui-disabled .edui-caret{opacity:.2 \0;filter:alpha(opacity=20)\0}.edui-combobox-menu{position:absolute;top:100%;left:0;display:none;list-style:none;text-decoration:none;margin:0;padding:5px;background-color:#fff;border:1px solid #ccc;font-size:12px;box-shadow:2px 2px 5px #d3d6da;min-width:160px;_width:160px}.edui-combobox-menu .edui-combobox-item{display:block;border:1px solid #fff}.edui-combobox-menu .edui-combobox-item-label{height:25px;line-height:25px;display:inline-block;_display:inline;_zoom:1;margin-left:10px}.edui-combobox-menu .edui-combobox-item:hover,.edui-combobox-menu .edui-combobox-stack-item:hover,.edui-combobox-menu .edui-combobox-item-hover{background-color:#d5e1f2;padding:0;border:1px solid #a3bde3}.edui-combobox-menu .edui-combobox-item .edui-combobox-icon{display:inline-block;*zoom:1;*display:inline;width:24px;height:25px;background:red;vertical-align:bottom;background:url(../images/ok.gif) no-repeat 1000px 1000px}.edui-combobox-menu .edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-menu .edui-combobox-item-separator{min-width:160px;height:1px;line-height:1px;overflow:hidden;background:#d3d3d3;margin:5px 0;*margin-top:-8px}.edui-combobox-fontsize .edui-combobox-item-0.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-4 .edui-combobox-item-label{height:27px;line-height:27px}.edui-combobox-fontsize .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon{background-position:10px 5px}.edui-combobox-fontsize .edui-combobox-item-5 .edui-combobox-item-label{height:31px;line-height:31px}.edui-combobox-fontsize .edui-combobox-item-5.edui-combobox-checked .edui-combobox-icon{background-position:10px 4px}.edui-combobox-fontsize .edui-combobox-item-6 .edui-combobox-item-label{height:47px;line-height:47px}.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-item-label{font-size:32px;height:36px;line-height:36px}.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-icon{height:25px;margin-bottom:5px}.edui-combobox-paragraph .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-item-label{font-size:28px;height:27px;line-height:27px}.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-icon{margin-bottom:5px}.edui-combobox-paragraph .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon{background-position:10px 10px}.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-item-label{font-size:24px;height:25px;line-height:25px}.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-icon{height:25px;margin-bottom:5px}.edui-combobox-paragraph .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon{background-position:10px 11px}.edui-combobox-paragraph .edui-combobox-item-4 .edui-combobox-item-label{font-size:18px;height:25px;line-height:25px}.edui-combobox-paragraph .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon{background-position:10px 6px}.edui-combobox-paragraph .edui-combobox-item-5 .edui-combobox-item-label{font-size:16px}.edui-combobox-paragraph .edui-combobox-item-6 .edui-combobox-item-label{font-size:12px}.edui-modal{position:fixed;_position:absolute;top:10%;left:50%;border:1px solid #acacac;box-shadow:2px 2px 5px #d3d6da;background-color:#fff;outline:0}.edui-modal-header{padding:5px 10px;border-bottom:1px solid #eee}.edui-modal-header .edui-close{float:right;width:20px;height:20px;margin-top:2px;padding:1px;border:0;background:url(../images/close.png) no-repeat center center;cursor:pointer}.edui-modal-header .edui-close.edui-hover{background-color:#d5e1f2;padding:0;border:1px solid #a3bde3}.edui-modal-header .edui-title{margin:0;line-height:25px;font-size:20px}.edui-modal-body{position:relative;max-height:400px;font-size:12px;overflow-y:auto}.edui-modal-footer{float:right;padding:5px 15px 15px;overflow:hidden}.edui-modal-footer .edui-btn{float:left;height:24px;width:96px;margin:0 10px;background-color:#fff;padding:0;border:1px solid #ababab;font-size:12px;line-height:24px;text-align:center;cursor:pointer}.edui-modal-footer .edui-btn.edui-hover{background-color:#d5e1f2;border:1px solid #a3bde3}.edui-modal-backdrop{opacity:.5;filter:alpha(opacity=50);position:fixed;top:0;right:0;bottom:0;left:0;background-color:#c6c6c6}.edui-modal .edui-modal-tip{color:red;position:absolute;bottom:10px;left:10px;height:30px;line-height:30px;display:none}.edui-dialog-image-body{width:700px;height:400px}.edui-dialog-video-body{width:600px;height:350px}.edui-dialog-gmap-body{width:550px;height:400px}.edui-dialog-map-body{width:580px;height:400px}.edui-dialog-link-body{width:400px;height:200px}.edui-popup{display:none;background:url(../images/pop-bg.png) repeat #fff;padding:2px}.edui-popup .edui-popup-body{border:1px solid #bfbfbf;background-color:#fff}.edui-popup .edui-popup-caret{width:21px;height:11px}.edui-popup .edui-popup-caret.up{background:url(../images/caret.png) no-repeat 0 0}.edui-popup .edui-popup-caret.down{background:url(../images/caret.png) no-repeat 0 0}.edui-tab-nav{margin:0;padding:0;border-bottom:1px solid #ddd;list-style:none;height:30px}.edui-tab-nav .edui-tab-item{float:left;margin-bottom:-1px;margin-top:1px;margin-top:0\9}.edui-tab-nav .edui-tab-item .edui-tab-text{display:block;padding:8px 12px;border:1px solid transparent;color:#08c;text-decoration:none;outline:0;_border:1px solid #fff;cursor:pointer}.edui-tab-nav .edui-tab-item .edui-tab-text:FOCUS{outline:0}.edui-tab-nav .edui-tab-item.edui-active .edui-tab-text{border:1px solid #ddd;border-bottom-color:transparent;background-color:#fff;padding:8px 12px;color:#555;cursor:default}.edui-tab-content .edui-tab-pane{padding:1px;position:relative;display:none;background-color:#fff;clear:both}.edui-tab-content .edui-tab-pane.edui-active{display:block}.edui-btn-toolbar .edui-tooltip{position:absolute;padding:5px 0;display:none;z-index:99999}.edui-tooltip .edui-tooltip-arrow{position:absolute;top:0;_top:-2px;left:50%;width:0;height:0;padding:0;font-size:0;margin-left:-5px;border-color:transparent;border-style:dashed dashed solid;border-bottom-color:#000;border-width:0 5px 5px;background:transparent}.edui-tooltip .edui-tooltip-inner{padding:6px;color:#fff;text-align:center;text-decoration:none;font-size:10px;background-color:#000;white-space:nowrap;line-height:12px}.edui-splitbutton-color-label{width:16px;height:3px;position:absolute;bottom:2px;left:50%;margin-left:-8px;overflow:hidden;line-height:3px}.edui-popup .edui-colorpicker{margin:10px;font-size:12px}.edui-colorpicker .edui-colorpicker-topbar{height:27px;width:200px;overflow:hidden}.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-preview{height:20px;border:1px inset #000;margin-left:1px;width:128px;float:left}.edui-colorpicker .edui-colorpicker-topbar .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-colorpicker table{border-collapse:collapse;border-spacing:2px}.edui-colorpicker tr.edui-colorpicker-firstrow{height:30px}.edui-colorpicker table td{padding:0 2px}.edui-colorpicker table td .edui-colorpicker-colorcell{display:block;text-decoration:none;color:#000;width:14px;height:14px;margin:0;cursor:pointer}.edui-toolbar .edui-separator{width:2px;height:20px;padding:1px 2px;background:url(../images/icons.png) -179px 1px;background:url(../images/icons.gif) -179px 1px \9;display:inline-block;vertical-align:top;*display:inline;*zoom:1;border:0}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/caret.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/caret.png
new file mode 100644
index 0000000..cf06947
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/caret.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/close.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/close.png
new file mode 100644
index 0000000..a57693f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/close.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/icons.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/icons.gif
new file mode 100644
index 0000000..8206560
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/icons.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/icons.png
new file mode 100644
index 0000000..de9a1bb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/ok.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/ok.gif
new file mode 100644
index 0000000..9d1362c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/ok.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/pop-bg.png b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/pop-bg.png
new file mode 100644
index 0000000..d7a5a30
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/pop-bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/spacer.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/spacer.gif
new file mode 100644
index 0000000..5bfd67a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/spacer.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/videologo.gif b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/videologo.gif
new file mode 100644
index 0000000..555af74
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/themes/default/images/videologo.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/jquery.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/jquery.min.js
new file mode 100644
index 0000000..da41706
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/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="<div class='a'></div><div class='a i'></div>",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="<select><option selected=''></option></select>",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="<a href='#'></a>","#"===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="<input/>",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="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",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></: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="<table><tr><td></td><td>t</td></tr></table>",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="<div></div>",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=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},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></$2>");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></$2>")+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)?"<table>"!==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("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.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=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.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){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},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)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):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):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.eot b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.eot
new file mode 100644
index 0000000..0d10a95
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.eot
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.otf b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.otf
new file mode 100644
index 0000000..d549563
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.otf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.svg b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.svg
new file mode 100644
index 0000000..eff3111
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.svg
@@ -0,0 +1,5102 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG webfont generated by Font Squirrel.
+Designer    : George Douros
+Foundry     : Free
+Foundry URL : http://users.teilar.gr/_g1951d/
+</metadata>
+<defs>
+<font id="Symbola" horiz-adv-x="2048" >
+<font-face units-per-em="2048" ascent="1606" descent="-442" />
+<missing-glyph horiz-adv-x="512" />
+<glyph unicode=" "  horiz-adv-x="512" />
+<glyph unicode="&#x09;" horiz-adv-x="512" />
+<glyph unicode="&#xa0;" horiz-adv-x="512" />
+<glyph unicode="!" horiz-adv-x="682" d="M418 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM341 383q-25 0 -29 47l-79 932v10q0 40 30 66q34 28 78 28t78 -28q30 -26 30 -66v-10l-79 -934q-4 -45 -29 -45z" />
+<glyph unicode="&#x22;" horiz-adv-x="809" d="M428 1283q0 -11 -7 -23l-272 -472q-10 -17 -25.5 -17t-15.5 12.5t78 243t95 274.5q16 38 66 38q81 0 81 -56zM701 1283q0 -11 -7 -23l-271 -472q-10 -17 -26 -17t-16 12.5t78 243t95 274.5q16 38 66 38q81 0 81 -56z" />
+<glyph unicode="#" horiz-adv-x="1024" d="M985 382q0 -41 -68 -41h-185l-69 -394q-12 -68 -53 -68q-33 0 -33 35q0 11 4 33l69 394h-318l-69 -394q-12 -68 -53 -68q-33 0 -33 35q0 11 4 33l69 394h-143q-68 0 -68 41t68 41h158l56 318h-214q-68 0 -68 41t68 41h228l66 374q12 68 53 68q33 0 33 -35q0 -11 -4 -33 l-66 -374h318l66 374q12 68 53 68q33 0 33 -35q0 -11 -4 -33l-66 -374h100q68 0 68 -41t-68 -41h-114l-56 -318h170q68 0 68 -41zM721 741h-318l-56 -318h318z" />
+<glyph unicode="$" horiz-adv-x="964" d="M750 652q104 -112 104 -270t-97 -273t-246 -128v-89h-60v86q-155 10 -249 110.5t-94 255.5q0 97 89 97q38 0 63 -25t25 -63q0 -89 -88 -89q-14 0 -31 4q45 -214 285 -228v574q-161 41 -238 116q-105 105 -105 255.5t98.5 255t244.5 117.5v88h60v-86q152 -8 247.5 -99.5 t95.5 -240.5q0 -96 -88 -96q-38 0 -63.5 25.5t-25.5 63.5q0 88 89 88q17 0 30 -4q-50 190 -285 201v-521q159 -39 239 -125zM451 1298q-101 -10 -173 -80.5t-72 -172t69.5 -166t175.5 -87.5v506zM686 133.5q70 79.5 70 187t-67.5 182t-177.5 97.5v-560q105 14 175 93.5z" />
+<glyph unicode="%" horiz-adv-x="1662" d="M1331 878q281 0 281 -456t-281 -456t-281 456t281 456zM1358 1470q0 -12 -17 -37l-1037 -1536q-21 -31 -41 -31q-41 0 -41 41q0 13 19 41l920 1364q-106 -70 -270 -70t-301 99q22 -86 22 -222q0 -453 -281 -453t-281 456t281 456q149 0 223 -142q165 -149 331 -149 q235 0 389 195q23 29 43 29q41 0 41 -41zM1493 351v141q0 150 -19 217q-35 130 -143.5 130t-143.5 -128q-18 -67 -18 -216v-145q0 -345 162 -345t162 346zM493 1051q0 205 1 205v-2q-5 132 -34 197l-84 81q-22 7 -46 7q-108 0 -143 -128q-18 -67 -18 -216v-145 q0 -345 162 -345t162 346z" />
+<glyph unicode="&#x26;" horiz-adv-x="1593" d="M1205 18q81 0 153 59.5t76 170.5h52q-3 -130 -86.5 -211.5t-202.5 -81.5q-182 0 -361 156q-175 -156 -370 -156q-154 0 -262.5 87.5t-108.5 219.5q0 75 31 124.5t128 150.5l173 184q-84 214 -84 416q0 152 86 240.5t187.5 88.5t148.5 -97q35 -71 35 -167 q0 -136 -250 -414q57 -150 169.5 -314.5t170.5 -231.5q133 164 293 446q12 36 12 41q0 90 -146 90v64q81 -6 209.5 -6t239.5 6v-64q-125 -1 -191 -54q-44 -36 -114 -155q-175 -298 -271 -409q154 -183 283 -183zM748 1204q0 56 -15 110q-31 107 -108 107q-61 0 -107 -59 t-46 -201t61 -323q215 233 215 366zM314 523q-49 -81 -49 -193t45 -198q59 -114 172 -114q168 0 316 132q-78 78 -181 228t-172 296q-98 -94 -131 -151z" />
+<glyph unicode="'" horiz-adv-x="536" d="M428 1283q0 -11 -7 -23l-272 -472q-10 -17 -25.5 -17t-15.5 12.5t78 243t95 274.5q16 38 66 38q81 0 81 -56z" />
+<glyph unicode="(" horiz-adv-x="682" d="M574 -332q0 -18 -19 -18q-11 0 -46 29q-226 186 -322 396t-96 507t96 507t322 396q35 29 46 29q19 0 19 -18q0 -8 -24 -32q-300 -295 -300 -882t300 -882q24 -24 24 -32z" />
+<glyph unicode=")" horiz-adv-x="682" d="M591 582q0 -297 -96 -507t-322 -396q-35 -29 -46 -29q-19 0 -19 18q0 8 24 32q300 295 300 882t-300 882q-24 24 -24 32q0 18 19 18q11 0 46 -29q226 -186 322 -396t96 -507z" />
+<glyph unicode="*" horiz-adv-x="964" d="M824 1016q26 -12 26 -39.5t-16.5 -47t-35.5 -19.5t-31 9l-258 182l30 -319q0 -49 -56.5 -49t-56.5 49v5l29 314l-257 -182q-13 -9 -31.5 -9t-35.5 19.5t-17 47t27 39.5l287 132l-287 132q-27 13 -27 40t17 47t35.5 20t31.5 -9l257 -183l-29 319q0 49 56.5 49t56.5 -49v-5 l-30 -314l258 183q12 9 31 9t35.5 -20t16.5 -47t-26 -40l-287 -132z" />
+<glyph unicode="+" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41h-547v-546q0 -39 -41 -39t-41 39v546h-546q-39 0 -39 41t39 41h546v548q0 37 41 37t41 -37v-548h547q37 0 37 -41z" />
+<glyph unicode="," horiz-adv-x="512" d="M326 33q-33 -33 -83 -33t-78.5 32.5t-28.5 76t29 76t85 32.5t91 -58t35 -157q0 -152 -76.5 -274.5t-110.5 -122.5q-20 0 -20 22q0 8 14 23q148 157 148 352q0 30 -5 31z" />
+<glyph unicode="-" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="." horiz-adv-x="512" d="M333 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32z" />
+<glyph unicode="/" horiz-adv-x="569" d="M569 1475q0 -6 -2 -13l-488 -1788q-7 -26 -40 -26q-39 0 -39 41q0 6 2 13l488 1788q7 26 40 26q39 0 39 -41z" />
+<glyph unicode="0" horiz-adv-x="1043" d="M877 1156q83 -165 83 -482t-78 -477q-118 -242 -362 -242q-226 0 -344 209q-93 164 -93 490.5t76 486.5q117 247 359 247t359 -232zM787 564v260q0 216 -37 329q-61 190 -229.5 190t-229.5 -191q-37 -114 -37 -329q0 -41 0.5 -122t0.5 -121q0 -239 33 -360 q59 -220 231.5 -220t233.5 212q34 120 34 352z" />
+<glyph unicode="1" horiz-adv-x="1043" d="M190 64l76 -2q153 0 175 43q9 18 9 53v1087q-109 -54 -272 -54v64q250 0 379 133h10q29 0 35 -14q3 -6 3 -39v-1181q0 -33 8 -50q15 -33 117 -40h40.5h94.5v-64q-71 6 -136 6h-404q-64 0 -135 -6v64z" />
+<glyph unicode="2" horiz-adv-x="1043" d="M106 0v18q0 33 24 60l400 445q218 243 218 461q0 139 -72.5 239.5t-206.5 100.5q-97 0 -173 -59t-109 -153q7 2 17 2q121 0 121 -109q0 -46 -31 -78t-77 -32q-111 0 -111 116q0 157 116 267t287.5 110t299.5 -111t128 -293q0 -118 -77 -228q-44 -63 -165 -181l-428 -415 h416q136 0 156 16.5t46 185.5h52l-57 -362h-774z" />
+<glyph unicode="3" horiz-adv-x="1043" d="M954 356q0 -172 -134 -286.5t-300.5 -114.5t-290.5 82q-140 93 -140 244q0 53 32 87t83.5 34t85 -33.5t33.5 -84t-34.5 -82.5t-84.5 -32q-10 0 -20 1q46 -77 135 -118t185 -41q125 0 187 116q48 91 48 232t-51 230q-63 113 -197 113h-108q-33 0 -33 22.5t48 28.5 q33 1 65 3q124 8 183.5 105t59.5 241q0 102 -50.5 168.5t-149.5 66.5q-194 0 -278 -130h5q124 0 124 -105q0 -46 -29.5 -76t-76.5 -30t-76.5 29.5t-29.5 77.5q0 132 123 213q108 71 248.5 71t252.5 -71q130 -82 130 -212t-84 -230t-209 -141q145 -29 246.5 -132.5 t101.5 -245.5z" />
+<glyph unicode="4" horiz-adv-x="1043" d="M983 345h-208v-196q0 -30 9 -48q19 -37 185 -37h9v-64q-83 6 -142 6h-285q-56 0 -139 -6v64q47 -1 64 -1q110 0 130 38q9 17 9 48v196h-555v64l640 978q16 25 41.5 25t31.5 -17q2 -6 2 -38v-948h208v-64zM627 409v777l-509 -777h509z" />
+<glyph unicode="5" horiz-adv-x="1043" d="M278 770q109 106 273.5 106t275 -138.5t110.5 -323t-132.5 -322t-321.5 -137.5q-155 0 -266 113t-111 268q0 111 101 111q44 0 74.5 -29t30.5 -73t-30.5 -73.5t-74.5 -29.5q-18 0 -34 5q29 -101 115.5 -168t190.5 -67q145 0 224 136q49 85 49 274.5t-37 273.5 q-59 134 -178 134q-89 0 -147 -35t-99.5 -83t-49.5 -48q-29 0 -29 41v648q0 34 20 34q9 0 26 -6q166 -60 289.5 -60t270.5 62q12 5 18 5q20 0 20 -23q0 -16 -36 -56q-144 -161 -366 -161q-86 0 -176 27v-405z" />
+<glyph unicode="6" horiz-adv-x="1043" d="M277 684q84 206 263.5 206t296.5 -139t117 -327.5t-121 -328.5t-308 -140q-242 0 -353 247q-83 183 -83 458q0 205 80 385.5t240 276.5q111 66 226 66t191.5 -57.5t76.5 -165.5q0 -44 -26.5 -73t-68.5 -29t-69.5 28t-27.5 69q0 93 103 93h11q-57 85 -183 85 q-81 0 -155 -47q-210 -133 -210 -607zM767 371v104q0 160 -38 238q-63 129 -193 129t-199 -127q-57 -103 -57 -244q0 -206 38 -302q26 -67 82.5 -112t124.5 -45q140 0 206 136q36 74 36 223z" />
+<glyph unicode="7" horiz-adv-x="1043" d="M969 1328q0 -32 -19 -59l-283 -395q-94 -131 -128 -356q-23 -151 -23 -449q0 -114 -95.5 -114t-95.5 114q0 384 256 784l232 329h-499q-117 0 -138 -13.5t-50 -188.5h-52l69 430h52q2 -20 14 -33q31 -34 253 -34h507v-15z" />
+<glyph unicode="8" horiz-adv-x="1043" d="M954 349q0 -170 -130.5 -282t-301 -112t-302 99t-131.5 261q0 235 301 384q-55 32 -154 112q-91 99 -91 239t113.5 239t262 99t263.5 -85t115 -225q0 -194 -253 -323q93 -56 131 -81.5t75 -66.5q102 -113 102 -258zM807 1078q0 112 -86.5 186t-196 74t-199 -58 t-89.5 -153.5t106 -172.5q30 -22 257 -168q208 120 208 292zM851 276q0 76 -40 126t-117 102.5t-257 161.5q-244 -134 -244 -351q0 -130 99 -216.5t226.5 -86.5t230 73t102.5 191z" />
+<glyph unicode="9" horiz-adv-x="1043" d="M954 687q0 -388 -220 -601q-135 -131 -303 -131q-120 0 -198 51q-92 59 -92 173q0 100 95 100q41 0 69 -27.5t28 -70t-33 -70.5q-27 -24 -63 -24q-6 0 -13 1q64 -76 205 -76q77 0 148 47q120 79 163 274q27 120 27 330q-82 -209 -263 -209t-298 139.5t-117 333.5 t129.5 327.5t310.5 133.5q102 0 187 -53q238 -148 238 -648zM763 878q0 202 -34 293q-62 167 -200 167t-209 -132q-43 -80 -43 -247v-86q0 -161 37 -238q64 -132 194.5 -132t199.5 129q55 103 55 246z" />
+<glyph unicode=":" horiz-adv-x="547" d="M378 104q0 -42 -31 -73t-73.5 -31t-73.5 31t-31 73t31 73t73.5 31t73.5 -31t31 -73zM378 743q0 -42 -31 -73t-73.5 -31t-73.5 31t-31 73t31 73t73.5 31t73.5 -31t31 -73z" />
+<glyph unicode=";" horiz-adv-x="569" d="M387 774q0 -45 -31.5 -76.5t-76.5 -31.5t-77 32t-32 76.5t32 76.5t76.5 32t76.5 -32t32 -77zM348 23q-26 -23 -73.5 -23t-76 32.5t-28.5 76t29 76t80 32.5q114 0 114 -211q0 -153 -69.5 -277t-100.5 -124q-20 0 -20 22q0 11 14 27q131 151 131 369z" />
+<glyph unicode="&#x3c;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37z" />
+<glyph unicode="=" horiz-adv-x="1591" d="M1421 380q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 784q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x3e;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37z" />
+<glyph unicode="?" horiz-adv-x="909" d="M504 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM743 1350q79 -73 79 -191.5t-98 -191.5q-270 -200 -270 -457v-72q0 -55 -26 -55t-26 49v92q0 267 181 461q69 74 69 182t-28 152q-49 80 -195 80q-187 0 -268 -139q114 0 114 -93.5 t-94 -93.5t-94 102.5t95.5 185.5t252.5 83q207 0 308 -94z" />
+<glyph unicode="@" horiz-adv-x="1500" d="M1391 652q0 -405 -196 -405q-70 0 -125.5 36.5t-68.5 100.5q-98 -137 -257.5 -137t-269 128.5t-109.5 294t109.5 293.5t272.5 128q124 0 226 -107q12 -15 38 -41q18 -16 63.5 -16t52.5 -6.5t7 -38.5v-466q0 -127 67 -127q141 0 141 322q0 483 -356 651q-117 55 -238 55 q-253 0 -422.5 -195t-169.5 -455t171.5 -452.5t430.5 -192.5q185 0 378 66l95 40q61 23 109.5 23t48.5 -20.5t-109 -56.5q-285 -96 -520 -96q-279 0 -465.5 205t-186.5 484.5t184 486t458 206.5q139 0 267 -63q180 -89 277 -262.5t97 -382.5zM1001 505v329q0 37 -26 76 q-91 139 -218.5 139t-199.5 -134q-60 -111 -60 -245t60 -246q73 -135 195 -135q82 0 165.5 68.5t83.5 147.5z" />
+<glyph unicode="A" horiz-adv-x="1484" d="M1417 0q-127 6 -297.5 6t-244.5 -6v61h5q157 0 157 59q0 29 -39 136l-70 192h-487l-61 -163q-34 -90 -34 -123q0 -51 52 -78q42 -23 97 -23v-61q-189 6 -239.5 6t-187.5 -6v61q174 2 219 133l409 1177q14 40 46 40t46 -40l425 -1231q21 -61 84 -75q19 -5 77 -5q19 0 43 1 v-61zM906 510l-222 641l-220 -641h442z" />
+<glyph unicode="B" horiz-adv-x="1346" d="M1278 360q0 -161 -135.5 -260.5t-302.5 -99.5h-772v61q62 -2 63 -2q113 0 134 45q5 11 5 42v1051q0 31 -5 42q-19 43 -152 43q-21 0 -45 -1v62h720q161 0 290 -83q148 -95 148 -247q0 -120 -98.5 -203t-227.5 -108q147 -16 262.5 -109t115.5 -233zM720 721 q129 0 221.5 82t92.5 202.5t-73 198t-186 77.5h-255q-53 0 -69.5 -13t-16.5 -66v-481h286zM994 147q88 86 88 214t-76.5 222t-200.5 94h-371v-537q0 -53 16.5 -66t69.5 -13h257q129 0 217 86z" />
+<glyph unicode="C" horiz-adv-x="1335" d="M1267 854q0 -26 -29 -26t-35 32q-12 60 -47 178q-51 127 -151 208.5t-217 81.5t-220 -50q-298 -145 -298 -613.5t322 -606.5q96 -41 185 -41q140 0 256 85t159 218q17 52 27 140q4 33 23 33q24 0 24 -35q0 -205 -154 -353t-360 -148q-288 0 -486 213t-198 502.5 t198.5 503.5t485.5 214q193 0 363 -169l99 144q17 25 31 25q22 0 22 -33v-503z" />
+<glyph unicode="D" horiz-adv-x="1459" d="M1226 1130q166 -200 166 -466t-172 -465t-432 -199h-720v61l62 -2q108 0 130 31q10 14 10 52v1060q0 36 -10 50q-21 29 -157 29h-35v62h720q263 0 438 -213zM1085 229q110 148 110 436.5t-103 433.5q-129 182 -359 182h-207q-53 0 -70 -13t-17 -66v-1062q0 -53 17.5 -66 t69.5 -13h209q225 0 350 168z" />
+<glyph unicode="E" horiz-adv-x="1354" d="M68 0v61q47 -1 53 -1q125 0 142 38q7 16 7 48v1053q0 30 -7 47q-15 36 -152 36q-20 0 -43 -1v62h1108l56 -442h-49q-24 218 -99.5 299t-288.5 81h-263q-54 0 -71 -13.5t-17 -65.5v-474h178q134 0 173.5 46.5t39.5 182.5h51v-521h-51q0 136 -40 183t-173 47h-178v-526 q0 -52 17 -65.5t71 -13.5h273q236 0 326 111q67 84 107 336h49l-84 -508h-1135z" />
+<glyph unicode="F" horiz-adv-x="1271" d="M779 1281h-252q-45 0 -64 -11.5t-19 -67.5v-501h170q132 0 171 48t39 183h48v-522h-48q0 136 -39 183.5t-171 47.5h-170v-497q0 -27 7 -44q16 -39 209 -39h37v-61q-74 6 -135 6h-373q-49 0 -121 -6v61h75q64 0 88 10q39 18 39 73v1056q0 25 -6 42q-14 39 -166 39h-30v62 h1081l54 -442h-49q-24 217 -89 291q-77 89 -286 89z" />
+<glyph unicode="G" horiz-adv-x="1472" d="M1405 478q-80 0 -97 -6q-40 -15 -40 -81v-360q0 -29 -16 -29q-42 0 -127 122q-97 -167 -378 -167t-480 212t-199 502.5t198.5 504.5t485.5 214q198 0 365 -169l99 144q17 25 31 25q21 0 21 -33l1 -503q0 -26 -29 -26t-35 32q-12 60 -46 177q-51 128 -151.5 209.5 t-217.5 81.5t-211 -46q-309 -152 -309 -608.5t312 -609.5q96 -47 213 -47t201 56q98 65 98 183v126q0 40 -9 56q-23 40 -175 40h-63v59q65 -5 221.5 -5t336.5 5v-59z" />
+<glyph unicode="H" horiz-adv-x="1480" d="M1413 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61q-71 6 -113 6h-361q-36 0 -107 -6v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v530h-590v-530q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61 q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-474h590v474q0 29 -8 45q-17 34 -148 34h-46v62q70 -6 112 -6h356q43 0 113 6v-62z" />
+<glyph unicode="I" horiz-adv-x="736" d="M670 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62z" />
+<glyph unicode="J" horiz-adv-x="970" d="M752 284q0 -141 -112.5 -234t-245 -93t-229.5 73t-97 190q0 49 30.5 81.5t78.5 32.5t79 -31.5t31 -78.5q0 -110 -121 -110h-4q71 -114 217 -114q99 0 156 101q47 83 47 190v910q0 29 -9 47q-19 36 -223 36h-32v62q78 -6 161 -6h221q73 0 203 6v-62l-42 2q-60 0 -85 -14 t-25 -69z" />
+<glyph unicode="K" horiz-adv-x="1519" d="M649 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-636l618 588q36 34 36 67q0 61 -91 63v62q69 -6 217.5 -6t201.5 6v-62q-160 -2 -281 -118l-356 -340l456 -670q42 -62 83.5 -78.5t122.5 -16.5v-61q-127 6 -281.5 6t-225.5 -6v61h4q113 0 113 59q0 22 -31 68l-357 528 l-229 -218v-359q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-347q-43 0 -114 -6v61q8 0 26.5 -0.5t28.5 -0.5q125 0 141 40q6 15 6 44v1066q0 27 -7 41q-16 33 -176 33h-19v62q70 -6 119 -6h342q50 0 120 6v-62z" />
+<glyph unicode="L" horiz-adv-x="1216" d="M697 1284l-66 2q-156 0 -177 -36q-10 -17 -10 -48v-1062q0 -52 17.5 -65.5t68.5 -13.5h173q212 0 303 123q70 96 94 324h49l-55 -508h-1026v61q8 0 25.5 -0.5t27.5 -0.5q124 0 142 35q7 14 7 46v1064q0 32 -7 46q-17 33 -185 33h-10v62q71 -6 126 -6h383q47 0 120 6v-62z " />
+<glyph unicode="M" horiz-adv-x="1793" d="M1726 1281l-56 2q-125 0 -141 -41q-6 -15 -6 -45v-1058q0 -26 8 -43q17 -35 185 -35h10v-61q-75 6 -119 6h-334q-38 0 -113 -6v61h76q63 0 87 10q40 17 40 70v1140h-2l-483 -1245q-14 -36 -36 -36t-39 43l-476 1222h-2v-1064q0 -140 200 -140h3v-61q-209 6 -229 6 t-231 -6v61h3q199 0 199 140v1003q0 22 -6 38q-12 32 -89 39q-6 1 -32.5 1t-74.5 -1v62h341q45 0 61 -42l428 -1102l430 1108q14 36 49 36h349v-62z" />
+<glyph unicode="N" horiz-adv-x="1480" d="M1209 1139v-1107q0 -32 -26 -32q-16 0 -34 26l-805 1178q-12 17 -19 25v-1028q0 -140 200 -140h3v-61q-208 6 -230 6t-230 -6v61h3q199 0 199 140v1032q0 29 -8 35q-19 13 -194 13v62h342q30 0 48 -26l696 -1019v847q0 139 -203 139v62q205 -6 231.5 -6t230.5 6v-62h-3 q-201 0 -201 -145z" />
+<glyph unicode="O" horiz-adv-x="1445" d="M722 -43q-280 0 -467 214t-187 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503t-187.5 -499t-467.5 -213.5zM1175 696q0 438 -260 590q-92 54 -192 54t-191 -53q-262 -153 -262 -591q0 -469 265 -632q91 -56 185 -56t188 55q267 156 267 633z" />
+<glyph unicode="P" horiz-adv-x="1295" d="M1074 1249q154 -106 154 -268t-142 -262t-307 -100h-335v-473q0 -32 7 -48q17 -37 181 -37h17v-61q-72 6 -133 6h-326q-50 0 -122 -6v61l55 -1q122 0 140 38q7 15 7 48v1051q0 32 -7 48q-16 37 -158 37q-18 0 -37 -1v62h695q174 0 311 -94zM1024 977q0 161 -75.5 232.5 t-237.5 71.5h-186q-53 0 -69.5 -13t-16.5 -66v-532h272q313 0 313 307z" />
+<glyph unicode="Q" horiz-adv-x="1457" d="M1390 -19q0 -135 -52 -236q-65 -127 -189 -127t-183 130q-34 73 -56 239q-95 -30 -186 -30q-281 0 -468.5 214t-187.5 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503.5q0 -209 -107 -390.5t-292 -265.5q62 -192 188 -192q138 0 180 166q9 35 21 35q23 0 23 -41z M1180 669q0 455 -262 613q-96 58 -194.5 58t-193.5 -56q-267 -157 -267 -615q0 -213 69 -375q86 -199 259 -263q-28 45 -28 103.5t47.5 107.5t115.5 49q144 0 221 -208q233 172 233 586zM726 248q-50 0 -84.5 -36.5t-34.5 -87t33 -84.5t84 -34q92 0 174 46q-36 196 -172 196 z" />
+<glyph unicode="R" horiz-adv-x="1508" d="M1440 173q0 -86 -51 -151t-135 -65q-330 0 -330 318q0 13 1 40v40q0 158 -73 227.5t-186 69.5h-227v-511q0 -29 7 -46q14 -34 171 -34h26v-61q-74 6 -143 6h-289q-69 0 -143 -6v61q6 0 24.5 -0.5t28.5 -0.5q125 0 142 35q7 15 7 46v1055q0 27 -6 45q-14 40 -167 40h-29 v62h618q183 0 333 -84q180 -100 180 -267q0 -122 -115 -213q-94 -75 -229 -108q165 -57 224 -182q25 -52 39 -149l25 -182q31 -158 118 -158q101 0 131 175q5 31 24 31q24 0 24 -33zM997 992q0 196 -143 256q-84 35 -314 35q-51 0 -69 -7q-32 -14 -32 -57v-523h219 q339 0 339 296z" />
+<glyph unicode="S" horiz-adv-x="1007" d="M860.5 616.5q79.5 -107.5 79.5 -262.5t-110.5 -276t-277.5 -121q-236 0 -362 137l-72 -111q-16 -26 -30 -26q-20 0 -20 29v431q0 29 24 29q30 0 30 -72q0 -143 117 -250t311 -107q114 0 189 84t75 192.5t-59 184.5t-170 104q-88 17 -260 65q-116 42 -186.5 140t-70.5 221 q0 160 111 271t278 111t309 -139l69 112q17 27 29 27q24 0 24 -33v-429q0 -28 -28 -28q-18 0 -23 22q-7 41 -25 122q-81 290 -360 290q-109 0 -183.5 -74.5t-74.5 -183.5q0 -189 199 -250q85 -19 252 -62q136 -40 215.5 -147.5z" />
+<glyph unicode="T" horiz-adv-x="1413" d="M878 1282q-46 0 -65.5 -11.5t-19.5 -53.5v-1071q0 -25 10 -47q18 -38 243 -38h34v-61q-84 6 -154 6h-439q-71 0 -155 -6v61q9 0 35.5 -0.5t40.5 -0.5q184 0 202 39q8 17 8 47v1072q0 43 -29 56q-17 8 -66 8q-256 0 -321 -62.5t-86 -318.5h-48l36 442h1206l36 -442h-49 q-22 262 -88.5 321.5t-330.5 59.5z" />
+<glyph unicode="U" horiz-adv-x="1480" d="M1209 1131v-668q0 -203 -122.5 -354.5t-323.5 -151.5t-347 143.5t-146 347.5v760q0 30 -7 43q-18 34 -156 34q-19 0 -39 -1v62q73 -6 156 -6h269q84 0 156 6v-62q-48 1 -60 1q-118 0 -136 -34q-9 -17 -9 -51v-759q0 -298 192 -393q62 -31 134 -31q170 0 274.5 131 t104.5 306v685q0 89 -63 122q-45 23 -140 23v62q205 -6 234 -6t233 6v-62h-4q-164 0 -192 -85q-8 -24 -8 -68z" />
+<glyph unicode="V" horiz-adv-x="1536" d="M814 -6q-14 -37 -46.5 -37t-48.5 43l-457 1209q-22 57 -81 71q-19 5 -67 5q-20 0 -46 -1v62q214 -6 336.5 -6t195.5 6v-62h-6q-156 0 -156 -56q0 -30 141 -394l247 -637l361 950q9 24 9 40q0 94 -143 97v62q154 -6 238 -6t177 6v-62q-164 -1 -214 -132z" />
+<glyph unicode="W" horiz-adv-x="2087" d="M2019 1284q-152 0 -195 -132l-378 -1156q-13 -39 -38.5 -39t-37.5 37l-328 1003l-323 -1001q-13 -39 -39.5 -39t-38.5 37l-395 1207q-6 19 -23 53q-23 30 -134 30h-21v62q242 -6 344.5 -6t175.5 6v-62h-5q-161 0 -161 -58q0 -15 4 -27l316 -968l275 845l-35 127 q-16 48 -52 64.5t-134 16.5v62q242 -6 344.5 -6t175.5 6v-62h-5q-160 0 -160 -58q0 -15 5 -30l316 -965l296 910q10 31 10 39q0 53 -63 81q-48 22 -109 23v62q155 -6 239 -6t174 6v-62z" />
+<glyph unicode="X" horiz-adv-x="1518" d="M1450 0q-127 6 -299 6t-244 -6v61q128 5 128 59q0 10 -320 493l-281 -414q-19 -28 -19 -48q0 -43 38.5 -66t84.5 -24v-61q-74 6 -165 6t-305 -6v61q196 0 285 131l323 477l-362 547q-34 51 -99 64q-24 4 -81 4h-41v62q112 -6 292.5 -6t251.5 6v-62q-128 -5 -128 -58 q0 -13 268 -410l225 333q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62q81 -6 163.5 -6t306.5 6v-62q-198 -2 -285 -128l-271 -395l416 -629q35 -53 99 -66q25 -5 85 -5h38v-61z" />
+<glyph unicode="Y" horiz-adv-x="1566" d="M1499 1284q-173 0 -252 -128l-381 -619v-388q0 -34 10 -53q15 -29 90 -35h104v-61q-73 6 -127 6h-320q-55 0 -128 -6v61q8 0 25.5 -0.5t27.5 -0.5q124 0 142 36q7 14 7 43v398l-413 675q-34 56 -95 68q-21 4 -121 4v62q126 -6 299.5 -6t246.5 6v-62h-24q-112 0 -112 -48 q0 -14 13 -35l356 -581l325 529q21 34 21 58q0 77 -113 77v62q155 -6 240.5 -6t178.5 6v-62z" />
+<glyph unicode="Z" horiz-adv-x="1128" d="M101 0q-33 0 -33 33q0 21 13 41l766 1207h-310q-206 0 -294 -87.5t-100 -293.5h-51l22 443h900q34 0 34 -32q0 -16 -14 -38l-764 -1205h324q239 0 329 114q76 95 89 344h49l-35 -526h-925z" />
+<glyph unicode="[" horiz-adv-x="682" d="M571 -309q0 -41 -68 -41h-391v1864h391q68 0 68 -40.5t-68 -40.5h-309v-1701h309q68 0 68 -41z" />
+<glyph unicode="\" horiz-adv-x="569" d="M569 -311q0 -41 -39 -41q-33 0 -40 26l-488 1788q-2 7 -2 13q0 41 39 41q33 0 40 -26l488 -1788q2 -7 2 -13z" />
+<glyph unicode="]" horiz-adv-x="682" d="M570 -350h-391q-68 0 -68 41t68 41h309v1701h-309q-68 0 -68 40.5t68 40.5h391v-1864z" />
+<glyph unicode="^" horiz-adv-x="906" d="M765 1057q31 -15 31 -41t-21 -26q-5 0 -7 2q-199 57 -315 265q-103 -186 -314 -265q-3 -2 -8 -2q-21 0 -21 36q0 16 28 29l53 23q129 64 208 204q11 23 36 67q6 11 18.5 11t19.5 -11l34 -68q77 -138 208 -203z" />
+<glyph unicode="_" horiz-adv-x="964" d="M971 -337q59 0 59 -38.5t-59 -38.5h-979q-58 0 -58 38.5t59 38.5h978z" />
+<glyph unicode="`" horiz-adv-x="536" d="M255 1301q17 -44 95 -274.5t78 -243t-15.5 -12.5t-26.5 17l-271 472q-7 12 -7 23q0 56 81 56q50 0 66 -38z" />
+<glyph unicode="a" horiz-adv-x="1070" d="M1018 190q0 -83 -47.5 -142.5t-122.5 -59.5t-120.5 51.5t-52.5 122.5q-35 -85 -111 -135.5t-186.5 -50.5t-205.5 50q-119 62 -119 178q0 179 213 279q131 61 394 76v78q0 110 -60.5 192t-166.5 82q-154 0 -231 -98q46 0 78 -26.5t32 -70t-28.5 -71.5t-71.5 -28 q-98 0 -98 99q0 113 102 178.5t222 65.5q183 0 293 -119q50 -54 63.5 -108t13.5 -144v-427q0 -40 20.5 -74t57.5 -34q79 0 79 175q0 28 -2 80h55v-119zM660 300v214q-171 -6 -291 -71q-152 -82 -152 -236q0 -78 56.5 -130.5t135.5 -52.5q111 0 181 81.5t70 194.5z" />
+<glyph unicode="b" horiz-adv-x="1160" d="M360 807q121 139 303.5 139t313 -145.5t130.5 -342t-139 -339.5t-327.5 -143t-290.5 157q-24 -46 -77 -133h-53v1277q0 88 -47 109q-20 10 -85 10q-16 0 -35 -1v67l307 23v-678zM865 162q64 99 64 300t-60 299q-85 138 -225 138q-91 0 -184 -64t-93 -150v-442 q0 -45 30 -89q89 -130 234 -130t234 138z" />
+<glyph unicode="c" horiz-adv-x="920" d="M868 254q0 -22 -27 -75q-104 -203 -329 -203q-194 0 -326.5 144.5t-132.5 343t132 347.5t330 149q121 0 215 -54q113 -64 113 -170t-97 -106q-42 0 -70.5 28t-28.5 70q0 94 100 99q-79 78 -229 78q-60 0 -120 -34q-168 -94 -168 -402.5t178 -404.5q63 -34 123 -34 q113 0 181 64q40 37 74 109.5t53 72.5q29 0 29 -22z" />
+<glyph unicode="d" horiz-adv-x="1159" d="M793 118q-111 -142 -295 -142t-314.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q163 0 270 -133v464q0 88 -47 109q-20 10 -85 10q-16 0 -35 -1v67l308 23v-1300q0 -88 46 -110q20 -10 85 -10q16 0 35 1v-66l-313 -24v142zM793 253v449q0 32 -24 68q-87 129 -236 129 t-238 -138q-65 -100 -65 -300t61 -299q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="e" horiz-adv-x="933" d="M854 280q27 0 27 -28t-35 -88q-110 -188 -315 -188t-341.5 147.5t-136.5 344.5t127 344.5t312.5 147.5t287 -119t101.5 -302q0 -30 -7.5 -37.5t-38.5 -7.5h-605v-7q0 -210 64 -313q90 -144 242 -144q198 0 290 221q12 29 28 29zM740 539q0 143 -50 243q-64 129 -192 129 q-41 0 -90 -23q-165 -78 -175 -349h507z" />
+<glyph unicode="f" horiz-adv-x="798" d="M239 6l-185 -6v66q28 -1 69 -1t64 12q34 18 34 76v702h-168v68h168v246q0 141 95.5 240t236.5 99q72 0 132.5 -40.5t60.5 -108.5q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -151 -102q-46 -84 -46 -189v-248h251v-68h-246v-704q0 -21 7 -41 q15 -44 186 -44h15v-66q-81 6 -145 6h-185z" />
+<glyph unicode="g" horiz-adv-x="1082" d="M403 136l112 3q242 0 345 -59q142 -81 142 -244q0 -140 -177 -217q-136 -59 -297 -59t-298 59q-177 76 -177 212q0 77 58.5 133.5t138.5 79.5q-94 62 -94 192q0 98 66 176q-101 85 -101 220t105.5 224.5t238 89.5t230.5 -77q103 101 227 101q45 0 76.5 -30t31.5 -75 q0 -64 -62 -64t-62 61q0 44 34 59q-9 2 -20 2q-104 0 -193 -84q87 -81 87 -211t-105 -220t-232 -90t-221 67q-36 -43 -36 -100q0 -149 183 -149zM655 633q0 264 -187 264q-102 0 -153 -87q-34 -58 -34 -178q0 -264 187 -264q101 0 152 86q35 59 35 179zM888 -169 q0 183 -357 183h-191q-72 0 -124.5 -55.5t-52.5 -127.5q0 -109 134 -172q108 -51 230.5 -51t228.5 51q132 64 132 172z" />
+<glyph unicode="h" horiz-adv-x="1181" d="M1129 0q-200 6 -238 6t-244 -6v66q30 -1 70.5 -1t63.5 12q33 19 33 76v519q0 227 -158 227q-130 0 -209.5 -104.5t-79.5 -238.5v-400q0 -39 10 -58q18 -33 117 -33q18 0 38 1v-66q-200 6 -236.5 6t-242.5 -6v66q30 -1 72.5 -1t68 16.5t25.5 80.5v1115q0 87 -44 108 q-21 10 -96 10h-26v67l306 23v-744h2q41 93 125 149t184 56q292 0 292 -314v-502q0 -65 135 -65q15 0 32 1v-66z" />
+<glyph unicode="i" horiz-adv-x="562" d="M510 0q-202 6 -233 6t-224 -6v66l44 -1q66 0 89 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66zM335.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33z" />
+<glyph unicode="j" horiz-adv-x="588" d="M385 -107q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29q158 0 158 281v861q0 39 -9 60q-20 45 -148 45h-27v68l324 23v-1053zM353 1356q33 -33 33 -80.5t-33.5 -81t-80 -33.5 t-79.5 34.5t-33 80t33.5 79.5t80 34t79.5 -33z" />
+<glyph unicode="k" horiz-adv-x="1139" d="M1086 0q-88 6 -168 6t-248 -6v66h6q70 0 70 49q0 38 -255 385l-136 -116v-222q0 -51 12 -69.5t47 -22.5q30 -4 83 -4h25v-66q-121 6 -197 6t-272 -6v66q10 0 33 -0.5t35 -0.5q99 0 99 97v1115q0 87 -45 108q-21 10 -106 10h-16v67l307 23v-1027l302 261q47 41 47 84 q0 50 -61 52v68q116 -8 214 -8t175 8v-68q-133 -6 -270 -114q-174 -137 -174 -156q0 -2 14 -22l273 -383q48 -67 88 -91q39 -23 112 -23h6v-66z" />
+<glyph unicode="l" horiz-adv-x="579" d="M53 66l68 -2q98 0 98 98v1115q0 87 -44 108q-21 10 -106 10h-16v67l306 23v-1323q0 -50 13.5 -69t49.5 -23q29 -4 81 -4h24v-66q-220 6 -247.5 6t-226.5 -6v66z" />
+<glyph unicode="m" horiz-adv-x="1775" d="M1485 6q-40 0 -244 -6v66q26 -1 70 -1t65 13q32 19 32 84v499q0 238 -157 238q-130 0 -209.5 -104.5t-79.5 -238.5v-401q0 -39 12 -60q18 -30 118 -30q17 0 37 1v-66q-198 6 -237.5 6t-244.5 -6v66q26 -1 70 -1t65 13q32 19 32 84v499q0 238 -158 238 q-130 0 -209.5 -104.5t-79.5 -238.5v-397q0 -47 11 -64q18 -30 114 -30q19 0 40 1v-66q-198 6 -236 6t-243 -6v66q26 -1 69.5 -1t70 16t26.5 81v574q0 87 -44 109q-21 10 -96 10h-26v68l301 23v-225q101 225 316 225q251 0 284 -210q43 95 126.5 152.5t185.5 57.5 q158 0 224.5 -81t66.5 -243v-42q-1 -27 -1 -41v-409q0 -65 132 -65q17 0 35 1v-66q-198 6 -238 6z" />
+<glyph unicode="n" horiz-adv-x="1181" d="M1129 0q-200 6 -238 6t-244 -6v66q29 -1 70 -1t64 12q33 19 33 76v519q0 227 -158 227q-130 0 -209.5 -104.5t-79.5 -238.5v-400q0 -38 10 -58q17 -33 117 -33q17 0 38 1v-66q-199 6 -236 6t-243 -6v66q29 -1 72 -1t68.5 16.5t25.5 80.5v574q0 87 -44 109q-21 10 -96 10 h-26v68l301 23v-225q101 225 316 225q292 0 292 -316v-500q0 -65 135 -65q15 0 32 1v-66z" />
+<glyph unicode="o" horiz-adv-x="1054" d="M191.5 118.5q-138.5 142.5 -138.5 341.5t138 349.5t336.5 150.5t336.5 -151t138 -350.5t-139 -341t-336 -141.5t-335.5 142.5zM776 188q47 92 47 292.5t-56 292.5q-84 138 -244.5 138t-241.5 -143q-51 -90 -51 -294.5t55 -299.5q83 -144 246.5 -144t244.5 158z" />
+<glyph unicode="p" horiz-adv-x="1160" d="M360 805q127 141 308 141t310 -146.5t129 -342t-139 -338.5t-337 -143q-78 0 -158.5 42t-105.5 109v-388q0 -42 11 -59q19 -29 114 -29q19 0 41 1v-66q-169 5 -241.5 5t-238.5 -5v66q37 -2 76.5 -2t60.5 14q30 19 30 83v1002q0 51 -10 71.5t-44 28.5q-26 6 -83 6h-30v68 l307 23v-141zM855 176q74 128 74 282t-67 281q-81 154 -218 154q-179 0 -277 -172v-478q0 -46 30 -89q91 -130 230.5 -130t227.5 152z" />
+<glyph unicode="q" horiz-adv-x="1159" d="M1106 -414q-166 5 -243 5t-239 -5v66q37 -2 77 -2t66 16.5t26 80.5v383q-115 -154 -284 -154q-192 0 -324 144.5t-132 340t138 340.5t334 145q92 0 169.5 -54t117.5 -140l81 194h47v-1199q0 -46 12 -67q17 -29 113 -29q19 0 41 1v-66zM799 291v301q0 112 -76 206.5 t-178.5 94.5t-176.5 -72q-138 -134 -138 -362q0 -152 66 -280q81 -155 219 -155q104 0 194 82t90 185z" />
+<glyph unicode="r" horiz-adv-x="823" d="M53 66l67 -2q100 0 100 98v574q0 87 -45 109q-22 10 -106 10h-16v68l297 23v-235q76 235 262 235q60 0 109.5 -36.5t49.5 -85.5t-25.5 -76t-65 -27t-66 26t-26.5 66q0 64 48 84q-6 2 -14 2q-136 0 -207 -140q-55 -111 -55 -262v-346q0 -62 56 -78q23 -7 108 -7h44v-66 q-81 6 -147 6h-174l-194 -6v66z" />
+<glyph unicode="s" horiz-adv-x="804" d="M752 274q0 -146 -97 -222t-242 -76t-242 93q-77 -93 -97.5 -93t-20.5 33v322q0 32 27 32q21 0 30 -35q37 -146 92 -214q73 -90 206 -90q103 0 172 48.5t69 146.5q0 147 -223 195q-128 28 -148 33q-82 25 -134 67q-91 75 -91 183q0 134 108 204q92 59 221.5 59t212.5 -61 q60 61 82 61t22 -33v-254q0 -35 -29 -35q-23 0 -31 43l-6 60q-16 87 -81.5 132.5t-158.5 45.5t-157 -34q-81 -43 -81 -129t94 -130q48 -22 169 -46q170 -33 243 -102q91 -86 91 -204z" />
+<glyph unicode="t" horiz-adv-x="775" d="M722 265q0 -113 -48 -193q-58 -96 -164 -96q-132 0 -203.5 78t-71.5 211v590h-182v49q142 5 215 145q59 111 61 268h53v-394h305v-68h-305v-594q0 -231 144.5 -231t144.5 290q0 18 -1 67h52v-122z" />
+<glyph unicode="u" horiz-adv-x="1181" d="M821 169q-89 -193 -278.5 -193t-256.5 83t-67 280v375q0 102 -35 126q-23 15 -119 15h-12v68l314 23v-710q0 -114 39 -163t156 -49t189 108q63 94 63 224v380q0 87 -45 109q-21 10 -96 10h-26v68l315 23v-761q0 -87 45 -109q21 -10 96 -10h26v-66l-308 -24v193z" />
+<glyph unicode="v" horiz-adv-x="1151" d="M577 -24q-29 0 -45 40l-309 760q-24 60 -68 73q-18 6 -83 6h-19v68q120 -8 164 -8t276 8v-68q-122 0 -122 -54q0 -15 252 -634l219 546q13 32 13 50q0 90 -102 92v68q135 -8 194.5 -8t151.5 8v-68q-142 -1 -198 -142l-279 -697q-16 -40 -45 -40z" />
+<glyph unicode="w" horiz-adv-x="1571" d="M1045 -24q-28 0 -42 40l-220 608l-216 -606q-15 -42 -42.5 -42t-44.5 48l-270 757q-19 54 -62 68q-20 6 -78 6h-17v68q143 -8 170.5 -8t260.5 8v-68h-4q-121 0 -121 -56q0 -38 77 -245l137 -366l183 518q-38 105 -54 121q-29 28 -129 28v68q120 -8 189 -8l224 8v-68h-4 q-124 0 -124 -56q0 -11 11 -42l213 -595l195 546q10 28 10 46q0 98 -125 101v68q151 -8 209.5 -8t146.5 8v-68q-131 -3 -179 -136l-252 -703q-14 -40 -42 -40z" />
+<glyph unicode="x" horiz-adv-x="1183" d="M1131 0q-91 6 -175.5 6t-261.5 -6v66q77 3 77 54q0 10 -208 285q-192 -223 -192 -272q0 -61 62 -67v-66q-141 6 -221 6t-159 -6v66q159 0 274 128l200 256l-212 276q-71 92 -105 110.5t-147 18.5v68q110 -8 171 -8t264 8v-68q-75 -2 -75 -52q0 -20 184 -255l134 167 q33 41 33 75q0 61 -63 65v68q108 -8 192.5 -8t188.5 8v-68q-152 -3 -255 -109q-26 -27 -197 -244l287 -369q37 -47 92 -60q28 -7 95 -7h17v-66z" />
+<glyph unicode="y" horiz-adv-x="1151" d="M249 -439q-76 0 -136 50t-60 124q0 91 89 91q39 0 65 -25.5t26 -63.5q0 -81 -85 -91q41 -38 101 -38q93 0 158 92q32 45 68 130l71 170l-321 781q-22 54 -70 68q-21 6 -74 6h-28v68q120 -8 178.5 -8t261.5 8v-68h-4q-116 0 -116 -54q0 -19 250 -616l217 528q14 34 14 50 q0 90 -101 92v68q170 -8 212 -8t134 8v-68h-2q-140 0 -197 -136l-377 -913q-101 -245 -274 -245z" />
+<glyph unicode="z" horiz-adv-x="904" d="M91 0q-38 0 -38 30q0 15 18 39l599 807h-245q-167 0 -223.5 -63.5t-65.5 -234.5h-53l24 345h701q38 0 38 -28q0 -14 -18 -38l-595 -803h251q182 0 248 86q51 68 65 260h55l-38 -400h-723z" />
+<glyph unicode="{" horiz-adv-x="983" d="M827 -327q0 -23 -41 -23q-174 0 -285 78q-73 51 -93 116q-13 42 -13 149v313q0 117 -72 181t-190 73q-33 2 -33 21t18 22t35 4q242 31 242 252v313q0 107 13 149q20 65 93 116q109 77 285 77q41 0 41 -20.5t-18 -24.5q-154 -9 -237 -94q-42 -43 -54 -114q-5 -34 -5 -129 v-277q0 -89 -21 -132q-47 -96 -202 -141q155 -45 202 -141q21 -42 21 -131v-277q0 -95 5 -129q12 -71 54 -114q83 -85 237 -94q18 -4 18 -23z" />
+<glyph unicode="|" horiz-adv-x="410" d="M246 -311q0 -41 -41 -41t-41 41v1788q0 39 41 39t41 -39v-1788z" />
+<glyph unicode="}" horiz-adv-x="983" d="M883 582q0 -17 -18 -20t-35 -4q-242 -31 -242 -252v-313q0 -107 -13 -149q-20 -65 -93 -116q-111 -78 -285 -78q-41 0 -41 23q0 19 18 23q154 9 237 94q42 43 54 114q5 34 5 129v277q0 89 21 131q47 96 202 141q-155 45 -202 141q-21 43 -21 132v277q0 95 -5 129 q-12 71 -54 114q-83 85 -237 94q-18 4 -18 24.5t41 20.5q176 0 285 -77q73 -51 93 -116q13 -42 13 -149v-313q0 -117 72 -181t190 -73q33 -2 33 -23z" />
+<glyph unicode="~" horiz-adv-x="1058" d="M1021 659q0 -111 -71.5 -195t-175.5 -84t-251.5 116.5t-233.5 116.5q-136 0 -179 -131q-6 -29 -15.5 -65t-27.5 -36q-30 0 -30 57q0 109 72.5 193.5t176 84.5t251 -117t233.5 -117q155 0 192 184q9 49 31 49q28 0 28 -56z" />
+<glyph d="M731 1248q0 -164 -105 -244t-273 -80h-221v650h228q169 0 270 -81t101 -245zM1251 257h-455v650h455v-113h-304v-131h282v-113h-282v-180h304v-113zM1916 -410h-453v650h152v-537h301v-113zM344 1033q229 0 229 216t-229 216h-60v-432h60z" />
+<glyph unicode="&#xa1;" horiz-adv-x="682" d="M418 1012q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM341 -422q-44 0 -78 28q-30 26 -30 66v10l79 934q4 45 29 45t29 -47l79 -932v-10q0 -40 -30 -66q-34 -28 -78 -28z" />
+<glyph unicode="&#xa2;" horiz-adv-x="920" d="M868 454q0 -22 -27 -75q-100 -194 -310 -203v-284h-60v286q-179 16 -298.5 157t-119.5 327.5t118 332t300 163.5v288h60v-286q118 -5 206 -58q106 -64 106 -168t-97 -104q-42 0 -70.5 28t-28.5 70q0 94 100 99q-75 74 -216 78v-875q113 0 181 64q40 37 74 109.5t53 72.5 q29 0 29 -22zM398 1071q-168 -94 -168 -402.5t178 -404.5q31 -17 63 -26v862q-37 -9 -73 -29z" />
+<glyph unicode="&#xa3;" horiz-adv-x="1051" d="M958 310q18 0 18 -23t-22 -86q-78 -225 -264 -225q-85 0 -177 56q-32 19 -153 112q-81 -168 -182 -168q-50 0 -78.5 35t-28.5 93t44 99.5t110 41.5q35 0 94 -10q4 50 4 120t-21 334h-213v60h209q-9 121 -9 208q0 171 97 299t263 128q117 0 180 -64t63 -133 q0 -27 -20.5 -50t-47.5 -23q-49 0 -61 61q-22 109 -24 112q-27 61 -114 61q-192 0 -192 -294q0 -57 10.5 -161t12.5 -144h357v-60h-356q0 -270 -66 -469l167 -56q101 -30 172 -30q135 0 189 107l17 45q10 24 22 24zM213 203q-105 0 -105 -99q0 -89 75 -89q88 0 126 154 q-52 34 -96 34z" />
+<glyph unicode="&#xa4;" horiz-adv-x="1024" d="M512 140q-160 0 -283 102l-145 -142l-56 55l144 145q-102 123 -102 282.5t102 282.5l-144 141l56 57l145 -141q123 102 283 102t283 -103l143 142l58 -57l-144 -141q102 -123 102 -282.5t-102 -282.5l144 -145l-58 -55l-143 143q-123 -103 -283 -103zM872 582 q0 149 -105.5 254.5t-254.5 105.5t-254.5 -105.5t-105.5 -254.5t105.5 -254.5t254.5 -105.5t254.5 105.5t105.5 254.5z" />
+<glyph unicode="&#xa5;" horiz-adv-x="1566" d="M1499 1284q-174 0 -252 -128l-272 -442h355v-60h-392l-72 -117v-13h464v-60h-464v-315q0 -34 10 -53q15 -29 89 -35h105v-61q-73 6 -127 6h-320q-55 0 -128 -6v61q8 0 25.5 -0.5t27.5 -0.5q124 0 142 36q7 14 7 43v325h-461v60h461v13l-72 117h-389v60h352l-304 498 q-35 56 -95 68q-21 4 -121 4v62q126 -6 299.5 -6t246.5 6v-62h-24q-112 0 -112 -48q0 -14 13 -35l298 -487h115l268 435q21 34 21 58q0 77 -113 77v62q155 -6 240.5 -6t178.5 6v-62zM868 654h-42l21 -34z" />
+<glyph unicode="&#xa6;" horiz-adv-x="386" d="M246 811q0 -61 -41 -61t-41 61v642q0 61 41 61t41 -61v-642zM246 -289q0 -61 -41 -61t-41 61v642q0 61 41 61t41 -61v-642z" />
+<glyph unicode="&#xa7;" horiz-adv-x="964" d="M596 1140l13 91q0 89 -104 89q-68 0 -115.5 -48t-47.5 -117q0 -101 123 -206l229 -183q123 -119 123 -256q0 -197 -207 -321q116 -126 116 -240.5t-77 -192t-180.5 -77.5t-175.5 61t-72 152q0 32 21 57t53 25q71 0 71 -81l-16 -103q0 -36 36.5 -54.5t87 -18.5t103 47 t52.5 108q0 101 -125 211l-232 191q-126 123 -126 257q0 194 209 319q-117 128 -117 242t77.5 191t180 77t175.5 -58.5t73 -146t-74 -87.5q-31 0 -52.5 21t-21.5 51zM578 215q145 87 145 200.5t-127 231.5l-211 174q-142 -84 -142 -200.5t125 -233.5z" />
+<glyph unicode="&#xa8;" horiz-adv-x="549" d="M167 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32zM539 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32z" />
+<glyph unicode="&#xa9;" horiz-adv-x="1524" d="M1233.5 1020q195.5 -197 195.5 -472.5t-196 -471.5t-471.5 -196t-471 196t-195.5 472t196 472.5t471.5 196.5t471 -197zM1378 548q0 255 -181 436.5t-435.5 181.5t-435 -182t-180.5 -437t180.5 -436t435.5 -181t435.5 181.5t180.5 436.5zM1099 390q0 -130 -98.5 -224 t-229.5 -94q-183 0 -308 134.5t-125 318t125.5 318.5t307.5 135q122 0 227 -102q64 102 82.5 102t18.5 -24v-315q0 -23 -24 -23q-20 0 -26.5 31.5t-28.5 104.5q-73 178 -233 178t-242 -129q-70 -109 -70 -276q0 -295 197 -380q57 -25 129 -25t142.5 51.5t97.5 133.5 q6 32 19 96q4 16 18 16q21 0 21 -27z" />
+<glyph unicode="&#xaa;" horiz-adv-x="822" d="M783 715q0 -62 -40 -103t-102 -41q-98 0 -129 97q-67 -105 -206 -105q-96 0 -170 34q-96 44 -96 128q0 125 165 194q99 41 289 51v43q0 73 -44 122.5t-127 49.5t-139 -47q70 -13 70 -74q0 -34 -25.5 -54.5t-59.5 -20.5q-84 0 -84 76q0 83 81.5 127.5t171.5 44.5 q142 0 227 -82q60 -58 60 -174v-284q0 -62 49 -62q48 0 48 130q0 18 -1 40h62v-90zM494 788v132q-116 -5 -198 -43q-113 -52 -113 -150q0 -50 40.5 -81t104 -31t115 49t51.5 124z" />
+<glyph unicode="&#xab;" horiz-adv-x="1140" d="M528 5q0 -27 -48 -27q-20 0 -36 37l-30 68q-79 165 -266 268q-29 14 -86 45q-15 10 -15 25t15 25l87 46q186 100 265 266l26 65q20 41 54 41t34 -27q0 -3 -3 -10q-123 -284 -344 -406q223 -124 344 -406q3 -7 3 -10zM952 5q0 -27 -47 -27q-20 0 -37 37t-30 68 q-79 165 -266 268q-30 14 -86 45q-15 10 -15 25t15 25l87 46q186 100 265 266l26 65q20 41 54 41t34 -27q0 -3 -3 -10q-123 -284 -344 -406q223 -124 344 -406q3 -7 3 -10z" />
+<glyph unicode="&#xac;" horiz-adv-x="1591" d="M1304 219q0 -37 -41 -37t-41 37v428h-1013q-39 0 -39 41t39 41h1058q37 0 37 -37v-473z" />
+<glyph unicode="&#xad;" horiz-adv-x="0" />
+<glyph unicode="&#xae;" horiz-adv-x="1524" d="M1233.5 1020q195.5 -197 195.5 -472.5t-196 -471.5t-471.5 -196t-471 196t-195.5 472t196 472.5t471.5 196.5t471 -197zM1378 548q0 255 -181 436.5t-435.5 181.5t-435 -182t-180.5 -437t180.5 -436t435.5 -181t435.5 181.5t180.5 436.5zM1218 231q0 -56 -33 -98.5 t-88 -42.5q-211 0 -211 205v26q1 17 1 25q0 180 -158 180h-137v-316q0 -17 4 -26q8 -19 105 -19h19v-47q-48 4 -88 4h-195q-40 0 -88 -4v47h20q12 -1 19 -1q75 0 85 20q4 8 4 26v664q0 16 -4 27q-8 21 -100 21h-24v48h393q116 0 212 -55q114 -65 114 -172q0 -144 -205 -202 q116 -45 143 -147l34 -204q18 -63 62 -63q58 0 77 106q4 24 19 24q20 0 20 -26zM931 743q0 112 -75 152q-53 28 -172 28h-53q-39 0 -39 -35v-325h133q206 0 206 180z" />
+<glyph unicode="&#xaf;" horiz-adv-x="964" d="M971 1543q59 0 59 -38.5t-59 -38.5h-979q-58 0 -58 38.5t59 38.5h978z" />
+<glyph unicode="&#xb0;" horiz-adv-x="771" d="M590.5 1325.5q84.5 -84.5 84.5 -205t-84.5 -204.5t-205 -84t-205 84.5t-84.5 204.5t84.5 204.5t205 84.5t205 -84.5zM534 972.5q61 61.5 61 149t-61 148.5t-148.5 61t-149 -61.5t-61.5 -148.5t62 -148.5t149 -61.5t148 61.5z" />
+<glyph unicode="&#xb1;" horiz-adv-x="1591" d="M1421 41q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h546v502h-546q-39 0 -39 41t39 41h546v546q0 39 41 39t41 -39v-546h547q37 0 37 -41t-37 -41h-547v-502h547q37 0 37 -41z" />
+<glyph unicode="&#xb2;" horiz-adv-x="801" d="M79 579v22q0 26 21 47l300 296q160 158 160 299q0 93 -53.5 154.5t-145.5 61.5q-136 0 -195 -119q98 -2 98 -83q0 -36 -27 -59.5t-64 -23.5q-94 0 -94 87q0 113 93.5 187t219.5 74t228 -74t102 -205q0 -82 -60 -158q-33 -42 -125 -121l-300 -259h300q82 0 95 9.5 t33 125.5h59l-46 -261h-599z" />
+<glyph unicode="&#xb3;" horiz-adv-x="801" d="M735 826q0 -124 -106.5 -200.5t-229.5 -76.5t-218 54q-114 64 -114 173q0 90 97 90q40 0 69 -24t29 -63q0 -82 -93 -87q74 -85 219 -85q86 0 126 64t40 155q0 220 -176 220q-72 0 -72 -1h3q-47 3 -47 27t91 29.5t133.5 67.5t42.5 153q0 146 -140 146q-122 0 -187 -67 q86 -7 86 -79q0 -80 -89.5 -80t-89.5 81q0 96 100 152q83 47 188 47t192 -47q105 -57 105 -154q0 -81 -55.5 -145.5t-137.5 -96.5q97 -26 165.5 -93t68.5 -160z" />
+<glyph unicode="&#xb4;" horiz-adv-x="928" d="M523 1401q22 29 53 29t54 -23t23 -53t-28 -54l-313 -256l-37 35z" />
+<glyph unicode="&#xb5;" horiz-adv-x="1120" d="M1043 187q0 -84 -47.5 -143.5t-130 -59.5t-125 64.5t-42.5 152.5q-101 -225 -317 -225q-83 0 -144 25v-66q0 -221 -37 -352h-148q37 173 37 311v1029h147v-663q0 -237 159 -237q129 0 209 101t80 233v566h148v-765q0 -39 21.5 -73.5t58.5 -34.5q78 0 78 171l-2 86h55 v-120z" />
+<glyph unicode="&#xb6;" horiz-adv-x="964" d="M927 1235h-125v-1642h-68v1642h-177v-1642h-68v982h-5q-448 0 -448 358q0 177 128 270q113 83 296 83h467v-51z" />
+<glyph unicode="&#xb7;" horiz-adv-x="300" d="M260 582q0 -46 -32 -78t-78 -32t-78 32t-32 78t32 78t78 32t78 -32t32 -78z" />
+<glyph unicode="&#xb8;" horiz-adv-x="1024" d="M744 -239q0 -161 -376 -161h-88v43q327 0 327 118q0 56 -42 87t-101 32v127h96v-95q70 -11 127 -49.5t57 -101.5z" />
+<glyph unicode="&#xb9;" horiz-adv-x="801" d="M142 642l84 -2q93 0 106 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -105 5h-316q-38 0 -105 -5v64z" />
+<glyph unicode="&#xba;" horiz-adv-x="810" d="M771 894.5q0 -143.5 -111 -237.5t-255.5 -94t-254.5 94.5t-110 238t110 242.5t255.5 99t255.5 -99.5t110 -243zM583 719q34 60 34 189t-41 189q-60 88 -174.5 88t-172.5 -91q-37 -58 -37 -190t40 -194q59 -91 176.5 -91t174.5 100z" />
+<glyph unicode="&#xbb;" horiz-adv-x="1140" d="M670 421q0 -15 -15 -25l-87 -45q-188 -104 -266 -268l-26 -64q-20 -41 -46 -41q-41 0 -41 27q0 5 2 10q116 279 345 406q-227 125 -345 406q-2 4 -2 10q0 27 34 27t50 -36.5t29 -69.5q78 -165 265 -266q31 -14 88 -46q15 -10 15 -25zM1093 421q0 -15 -14 -25l-87 -45 q-188 -104 -266 -268l-26 -64q-20 -41 -46 -41q-41 0 -41 27q0 5 1 10q117 279 346 406q-227 125 -346 406q-1 4 -1 10q0 27 33.5 27t53.5 -41l26 -65q78 -165 265 -266q30 -14 88 -46q14 -10 14 -25z" />
+<glyph unicode="&#xbc;" horiz-adv-x="1722" d="M1499 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667q11 17 35 17q40 0 40 -40zM1677 -100h-156v-120q0 -18 5 -27q10 -19 134 -19h13v-64q-78 5 -117 5h-213q-36 0 -114 -5v64l58 -1q76 0 88 20q6 10 6 27v120h-416v56l481 653 q15 21 40 21q35 0 35 -47v-620h156v-63zM142 643l67 -2q109 0 123 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -112 5h-302q-45 0 -112 -5v64zM1390 -37v476l-352 -476h352z" />
+<glyph unicode="&#xbd;" horiz-adv-x="1722" d="M142 643l67 -2q109 0 123 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -112 5h-302q-45 0 -112 -5v64zM1419 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667 q11 17 35 17q40 0 40 -40zM999 -329v22q0 26 21 47l300 296q160 158 160 299q0 89 -52 152.5t-147 63.5q-136 0 -195 -119q98 -2 98 -83q0 -35 -26.5 -59t-64.5 -24q-94 0 -94 87q0 109 90.5 185t222.5 76t231 -76.5t99 -202.5q0 -82 -61 -159q-32 -40 -124 -120l-300 -259 h285q97 0 110 9.5t33 125.5h59l-46 -261h-599z" />
+<glyph unicode="&#xbe;" horiz-adv-x="1722" d="M1499 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667q11 17 35 17q40 0 40 -40zM1677 -100h-156v-120q0 -18 5 -27q10 -19 134 -19h13v-64q-78 5 -117 5h-213q-36 0 -114 -5v64l58 -1q76 0 88 20q6 10 6 27v120h-416v56l481 653 q15 21 40 21q35 0 35 -47v-620h156v-63zM735 827q0 -120 -103.5 -198.5t-231.5 -78.5t-223 56q-110 65 -110 171q0 90 97 90q42 0 70 -24.5t28 -62.5q0 -82 -93 -87q74 -85 219 -85q88 0 131 72q35 58 35 147q0 220 -176 220h-81q-35 0 -35 25.5t90.5 30.5t133.5 67t43 153 q0 146 -140 146q-123 0 -187 -67q86 -8 86 -79q0 -80 -89.5 -80t-89.5 81q0 94 97 150q83 49 191 49t195 -49q102 -57 102 -152q0 -79 -54.5 -144t-138.5 -98q100 -27 167 -94.5t67 -158.5zM1390 -37v476l-352 -476h352z" />
+<glyph unicode="&#xbf;" horiz-adv-x="909" d="M559 1012q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM728 -29q94 0 94 -102.5t-95.5 -185.5t-252.5 -83q-207 0 -308 94q-79 73 -79 191.5t98 191.5q270 200 270 457v72q0 55 26 55t26 -49v-92q0 -267 -181 -461q-69 -74 -69 -182 t28 -152q49 -80 195 -80q187 0 268 139q-114 0 -114 93.5t94 93.5z" />
+<glyph unicode="&#xd7;" horiz-adv-x="1591" d="M1321 100q0 -44 -43 -44q-15 0 -25 10l-458 458l-456 -456q-11 -11 -27 -11q-42 0 -42 42q0 16 11 27l457 456l-457 456q-11 11 -11 27q0 42 42 42q16 0 27 -11l456 -456l458 458q10 10 25 10q43 0 43 -44q0 -14 -10 -24l-458 -458l458 -458q10 -10 10 -24z" />
+<glyph unicode="&#xf7;" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM875 1109.5q34 -33.5 34 -80t-33.5 -79.5t-80.5 -33t-80.5 33t-33.5 79.5t34 80t80 33.5t80 -33.5zM875.5 214q33.5 -33 33.5 -79.5t-34 -80t-80 -33.5t-80 33.5t-34 80t33.5 79.5t80.5 33t80.5 -33z " />
+<glyph unicode="&#x131;" horiz-adv-x="562" d="M510 0q-202 6 -233 6t-224 -6v66l44 -1q66 0 89 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66z" />
+<glyph unicode="&#x192;" horiz-adv-x="1033" d="M977 1183q-39 0 -65 25q-23 23 -23 56v8q3 37 29 64.5t62 32.5q-41 31 -94 31q-19 0 -34 -4q-35 -11 -68 -63q-9 -16 -65 -311l-26 -138h208q26 0 22 -27l-7 -16q-4 -25 -29 -25h-208l-93 -503q-81 -436 -171 -585.5t-203 -149.5q-71 0 -125.5 39t-54.5 98t30 93.5 t79 34.5q75 0 75 -71q0 -44 -29.5 -76t-72.5 -34q37 -37 107 -37q67 0 109 121q26 75 117 559l95 511h-173q-26 0 -20 26l5 17q6 25 31 25h171l24 128q23 121 47.5 204t70.5 136q85 94 185 94q48 0 94 -20q102 -45 102 -132q0 -7 -1 -14q-8 -97 -101 -97z" />
+<glyph unicode="&#x19b;" horiz-adv-x="1121" d="M1102 -7q0 -18 -45 -18q-81 0 -107 19.5t-54 92.5q-62 162 -194 554l-403 -483q-49 -68 -141 -167q-26 -18 -46 -18q-61 0 -61 57q0 29 43 72q575 581 587 594l-130 369h-267q-37 0 -37 42t37 42h237l-51 140q-23 65 -34 87q-26 57 -53 70q-22 6 -48 14.5t-26 23.5 q0 24 39 24q212 0 266 -155l70 -204h276q38 0 38 -42t-38 -42h-247l333 -963q20 -57 38 -81.5t18 -27.5z" />
+<glyph unicode="&#x1c0;" horiz-adv-x="626" d="M354 -101q0 -41 -41 -41t-41 41v1368q0 39 41 39t41 -39v-1368z" />
+<glyph unicode="&#x1c1;" horiz-adv-x="1024" d="M752 -105q0 -37 -41 -37t-41 37v1374q0 37 41 37t41 -37v-1374zM354 -105q0 -37 -41 -37t-41 37v1374q0 37 41 37t41 -37v-1374z" />
+<glyph unicode="&#x1c2;" horiz-adv-x="1194" d="M1024 380q0 -41 -37 -41h-349v-444q0 -37 -41 -37t-41 37v444h-347q-39 0 -39 41t39 41h347v322h-347q-39 0 -39 41t39 41h347v444q0 37 41 37t41 -37v-444h349q37 0 37 -41t-37 -41h-349v-322h349q37 0 37 -41z" />
+<glyph unicode="&#x237;" horiz-adv-x="588" d="M385 -107q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29q158 0 158 281v861q0 39 -9 60q-20 45 -148 45h-27v68l324 23v-1053z" />
+<glyph unicode="&#x238;" horiz-adv-x="1740" d="M940 807q121 139 303.5 139t313 -145.5t130.5 -342t-139 -339.5t-327.5 -143t-290.5 157q-24 -46 -77 -133h-60v118q-111 -142 -295 -142t-314.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q163 0 270 -133v464q0 88 -47 109q-20 10 -85 10q-16 0 -35 -1v67l308 23 v-678zM1445 162q64 99 64 300t-60 299q-85 138 -225 138q-91 0 -184 -64t-93 -150v-442q0 -45 30 -89q89 -130 234 -130t234 138zM793 253v449q0 32 -24 68q-87 129 -236 129t-238 -138q-65 -100 -65 -300t61 -299q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="&#x239;" horiz-adv-x="1733" d="M940 813q124 133 303 133t308 -146.5t129 -342t-139 -338.5t-337 -143q-78 0 -158.5 42t-105.5 109v-380q0 -46 12 -67q17 -29 113 -29q19 0 41 1v-66q-166 5 -243 5t-239 -5v66q37 -2 77 -2t66 16.5t26 80.5v383q-115 -154 -284 -154q-192 0 -324 144.5t-132 340 t138 340.5t334 145q92 0 169.5 -54t117.5 -140l81 194h47v-133zM1428 176q74 128 74 282t-67 281q-81 154 -218 154q-179 0 -277 -172v-478q0 -46 30 -89q91 -130 230.5 -130t227.5 152zM799 291v301q0 112 -76 206.5t-178.5 94.5t-176.5 -72q-138 -134 -138 -362 q0 -152 66 -280q81 -155 219 -155q104 0 194 82t90 185z" />
+<glyph unicode="&#x23c;" horiz-adv-x="920" d="M868 254q0 -22 -27 -75q-104 -203 -329 -203q-91 0 -174 36l-83 -229l-44 18l85 232q-111 63 -177 178.5t-66 249.5q0 201 132 350t330 149q56 0 113 -14l74 203l44 -18l-72 -199q169 -62 169 -202q0 -100 -97 -100q-42 0 -70.5 28t-28.5 70q0 94 100 99q-37 36 -91 56 l-289 -792q76 -61 176.5 -61t168.5 64q40 37 74 109.5t53 72.5q29 0 29 -22zM610 896q-43 9 -97.5 9t-114.5 -34q-168 -94 -168 -405q0 -223 100 -339z" />
+<glyph unicode="&#x240;" horiz-adv-x="914" d="M914 -60q0 -69 -61 -114t-142 -45t-181 79q-21 16 -156 147q-82 79 -127 79q-30 0 -66.5 -43t-61.5 -43h-28q-38 0 -38 30q0 15 18 39l599 807h-245q-154 0 -205 -49.5t-74 -208.5h-53l44 305h671q38 0 38 -28q0 -14 -18 -38q-473 -639 -473 -642.5t29.5 -16t66.5 -40.5 q127 -94 172 -212.5t98 -118.5q46 0 70 25q-64 22 -64 91q0 39 26.5 65t66.5 26t67 -26.5t27 -67.5z" />
+<glyph unicode="&#x250;" horiz-adv-x="1070" d="M1018 732q0 -179 -213 -279q-131 -61 -394 -76v-78q0 -110 60.5 -192t166.5 -82q154 0 231 98q-46 0 -78 26.5t-32 70t28.5 71.5t71.5 28q98 0 98 -99q0 -113 -102 -178.5t-222 -65.5q-183 0 -293 119q-50 54 -63.5 108t-13.5 144v427q0 40 -20.5 74t-57.5 34 q-79 0 -79 -175q0 -28 2 -80h-55v119q0 83 47.5 142.5t122.5 59.5t120.5 -51.5t52.5 -122.5q35 85 111 135.5t186.5 50.5t205.5 -50q119 -62 119 -178zM854 729q0 78 -56.5 130.5t-135.5 52.5q-111 0 -181 -81.5t-70 -194.5v-214q171 6 291 71q152 82 152 236z" />
+<glyph unicode="&#x251;" horiz-adv-x="1159" d="M793 118q-111 -142 -295 -142t-314.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q90 0 169 -44t114 -120l81 164h47v-761q0 -88 46 -110q20 -10 85 -10q16 0 35 1v-66l-313 -24v142zM793 253v449q0 32 -24 68q-87 129 -236 129t-238 -138q-65 -100 -65 -300t61 -299 q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="&#x252;" horiz-adv-x="1159" d="M366 804q111 142 295 142t314.5 -144.5t130.5 -340.5t-139.5 -340.5t-336.5 -144.5q-90 0 -169 44t-114 120l-81 -164h-47v761q0 88 -46 110q-20 10 -85 10q-16 0 -35 -1v66l313 24v-142zM864 161q65 100 65 300t-61 299q-85 138 -224 138q-93 0 -185.5 -69.5 t-92.5 -159.5v-449q0 -32 24 -68q87 -129 236 -129t238 138z" />
+<glyph unicode="&#x253;" horiz-adv-x="1160" d="M360 807q121 139 303.5 139t313 -145.5t130.5 -342t-139 -339.5t-327.5 -143t-290.5 157q-24 -46 -77 -133h-53v1099q0 141 95.5 240t236.5 99q72 0 132.5 -40.5t60.5 -108.5q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -149 -101 q-43 -81 -43 -187v-297zM865 162q64 99 64 300t-60 299q-85 138 -225 138q-91 0 -184 -64t-93 -150v-442q0 -45 30 -89q89 -130 234 -130t234 138z" />
+<glyph unicode="&#x254;" horiz-adv-x="920" d="M406 960q198 0 330 -149t132 -347.5t-132.5 -343t-326.5 -144.5q-225 0 -329 203q-27 53 -27 75t29 22q19 0 53 -72.5t74 -109.5q68 -64 181 -64q60 0 123 34q178 96 178 404.5t-168 402.5q-60 34 -120 34q-150 0 -229 -78q100 -5 100 -99q0 -42 -28.5 -70t-70.5 -28 q-97 0 -97 106t113 170q94 54 215 54z" />
+<glyph unicode="&#x255;" horiz-adv-x="920" d="M869 275q0 -123 -115.5 -211t-241.5 -88q-44 0 -86 8l-47 -74q-20 -38 -63 -112q-9 -15 -23 -15q-29 0 -29 26q0 24 107 190q-142 48 -230 177t-88 285q0 201 132 350t330 149q121 0 215 -54q113 -64 113 -170t-97 -106q-42 0 -70.5 28t-28.5 70q0 94 100 99 q-79 78 -229 78q-60 0 -120 -34q-168 -94 -168 -403q0 -315 182 -406q219 319 338 319t119 -106zM815 275q0 52 -63 52q-89 0 -288 -287q34 -10 67 -10q102 0 193 72t91 173z" />
+<glyph unicode="&#x256;" horiz-adv-x="1159" d="M793 118q-111 -142 -295 -142t-314.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q163 0 270 -133v464q0 88 -47 109q-20 10 -85 10q-16 0 -35 -1v67l308 23v-1718q0 -88 46 -110q20 -10 85 -10q16 0 35 1v-66l-313 -24v560zM793 253v449q0 32 -24 68q-87 129 -236 129 t-238 -138q-65 -100 -65 -300t61 -299q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="&#x257;" horiz-adv-x="1325" d="M1325 1289q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -149 -101q-43 -81 -43 -187v-919q0 -88 46 -110q20 -10 85 -10q16 0 35 1v-66l-313 -24v142q-111 -142 -295 -142t-314.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q163 0 270 -133 v286q0 141 96 240t237 99q72 0 132.5 -40.5t60.5 -108.5zM793 253v449q0 32 -24 68q-87 129 -236 129t-238 -138q-65 -100 -65 -300t61 -299q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="&#x258;" horiz-adv-x="933" d="M53 539q0 183 101.5 302t287 119t312.5 -147.5t127 -344.5t-136.5 -344.5t-341.5 -147.5t-315 188q-35 60 -35 88t27 28q16 0 28 -29q92 -221 290 -221q152 0 242 144q64 103 64 313v7h-605q-31 0 -38.5 7.5t-7.5 37.5zM436 911q-128 0 -192 -129q-50 -100 -50 -243h507 q-10 271 -175 349q-49 23 -90 23z" />
+<glyph unicode="&#x259;" horiz-adv-x="933" d="M88 772q110 188 315 188t341.5 -147.5t136.5 -344.5t-127 -344.5t-312.5 -147.5t-287 119t-101.5 302q0 30 7.5 37.5t38.5 7.5h605v7q0 210 -64 313q-90 144 -242 144q-198 0 -290 -221q-12 -29 -28 -29q-27 0 -27 28t35 88zM194 397q0 -143 50 -243q64 -129 192 -129 q41 0 90 23q165 78 175 349h-507z" />
+<glyph unicode="&#x25a;" horiz-adv-x="1351" d="M1083 1089l-10 -207q0 -188 118 -188q34 0 64 20q-72 11 -72 84q0 35 24.5 59.5t59.5 24.5t59.5 -24.5t24.5 -59.5q0 -63 -49 -108.5t-113 -45.5q-167 0 -167 251l6 165q0 29 -13 29t-49 -41l-218 -247q123 -145 123 -340.5t-132.5 -340t-317 -144.5t-289.5 127 q-28 34 -28 49.5t33 52.5l495 555q-80 146 -242 146q-113 0 -181 -64q-40 -37 -74 -109.5t-53 -72.5q-29 0 -29 22.5t27 74.5q106 203 329 203q171 0 298 -116l245 274q58 65 88 65q43 0 43 -94zM694 466q0 135 -35 234l-490 -555q73 -115 224 -115q60 0 123 34 q178 97 178 402z" />
+<glyph unicode="&#x25b;" horiz-adv-x="883" d="M792 280q28 0 28 -28.5t-34 -86.5q-110 -189 -326 -189q-148 0 -260 61q-138 75 -138 211q0 99 74 161.5t179 86.5q-93 22 -154 84t-61 153q0 123 132 182q98 45 221 45t210 -28q123 -40 123 -122q0 -33 -24.5 -55.5t-60.5 -22.5t-67 47q-52 77 -61 86q-47 47 -126 47 q-202 0 -202 -194q0 -188 199 -188q22 0 63 11t63 11q86 0 86 -55.5t-87 -55.5q-21 0 -62.5 11t-62.5 11q-224 0 -224 -205q0 -228 255 -228q204 0 290 221q11 29 27 29z" />
+<glyph unicode="&#x25c;" horiz-adv-x="883" d="M820 248q0 -136 -138 -211q-112 -61 -260 -61q-216 0 -326 189q-34 58 -34 86.5t28 28.5q16 0 27 -29q86 -221 290 -221q255 0 255 228q0 205 -224 205q-21 0 -62.5 -11t-62.5 -11q-87 0 -87 55.5t86 55.5q22 0 63 -11t63 -11q199 0 199 188q0 194 -202 194 q-79 0 -126 -47q-9 -9 -61 -86q-31 -47 -67 -47t-60.5 22.5t-24.5 55.5q0 82 123 122q87 28 210 28t221 -45q132 -59 132 -182q0 -91 -61 -153t-154 -84q105 -24 179 -86.5t74 -161.5z" />
+<glyph unicode="&#x25d;" horiz-adv-x="1282" d="M1014 1089l-10 -207q0 -188 118 -188q34 0 64 20q-72 11 -72 84q0 35 24.5 59.5t59.5 24.5t59.5 -24.5t24.5 -59.5q0 -63 -49 -108.5t-113 -45.5q-167 0 -167 251l6 165q0 29 -13 29t-49 -41l-165 -187q50 -53 50 -136t-61 -145t-154 -84q105 -24 179 -86.5t74 -161.5 q0 -136 -138 -211q-112 -61 -260 -61q-216 0 -326 189q-34 58 -34 86.5t28 28.5q16 0 27 -29q86 -221 290 -221q255 0 255 228q0 205 -224 205q-21 0 -62.5 -11t-62.5 -11q-87 0 -87 55.5t86 55.5q22 0 63 -11t63 -11q199 0 199 188q0 194 -202 194q-79 0 -126 -47 q-9 -9 -61 -86q-31 -47 -67 -47t-60.5 22.5t-24.5 55.5q0 82 123 122q87 28 192 28q172 0 274 -63l198 221q58 65 88 65q43 0 43 -94z" />
+<glyph unicode="&#x25e;" horiz-adv-x="977" d="M915 248q0 -135 -140 -211q-114 -61 -263 -61q-200 0 -329.5 146.5t-129.5 347.5t128 345.5t325 144.5q141 0 239 -45q132 -59 132 -182q0 -91 -61 -153t-154 -84q105 -24 179 -86.5t74 -161.5zM757 258q0 205 -224 205q-21 0 -62.5 -11t-62.5 -11q-87 0 -87 55.5 t86 55.5q22 0 63 -11t63 -11q199 0 199 188q0 93 -59.5 143.5t-156.5 50.5q-174 0 -280 -130.5t-106 -309t94 -303.5q103 -139 278 -139q255 0 255 228z" />
+<glyph unicode="&#x25f;" horiz-adv-x="597" d="M585 514h-200v-621q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29q158 0 158 281v625h-214v68h214v168q0 39 -9 60q-20 45 -148 45h-27v68l324 23v-364h200v-68z" />
+<glyph unicode="&#x260;" horiz-adv-x="1322" d="M1322 1289q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -149 -101q-43 -81 -43 -187v-988q0 -558 -514 -558q-118 0 -201.5 54.5t-83.5 166.5q0 98 94 98q41 0 68 -26.5t27 -67.5q0 -94 -105 -94h-2q60 -74 201 -74q369 0 369 413v162 q-115 -154 -284 -154q-193 0 -324.5 130.5t-131.5 324.5t137.5 324.5t325.5 130.5t283 -169v322q0 141 96 240t237 99q72 0 132.5 -40.5t60.5 -108.5zM796 351v241q0 112 -76 206.5t-185 94.5q-146 0 -233 -134q-75 -116 -75 -267.5t67 -268.5q80 -139 218 -139 q104 0 194 82t90 185z" />
+<glyph unicode="&#x261;" horiz-adv-x="1159" d="M937 116q0 -558 -514 -558q-118 0 -201.5 54.5t-83.5 166.5q0 98 94 98q41 0 68 -26.5t27 -67.5q0 -94 -105 -94h-2q60 -74 201 -74q369 0 369 413v162q-115 -154 -284 -154q-193 0 -324.5 130.5t-131.5 324.5t137.5 324.5t334.5 130.5q92 0 169.5 -54t117.5 -140l81 194 h47v-830zM796 351v241q0 112 -76 206.5t-185 94.5q-146 0 -233 -134q-75 -116 -75 -267.5t67 -268.5q80 -139 218 -139q104 0 194 82t90 185z" />
+<glyph unicode="&#x262;" horiz-adv-x="1134" d="M1083 315h-42q-62 0 -62 -51v-236q0 -27 -20 -27q-29 0 -96 77q-80 -108 -287 -108t-365.5 141.5t-158.5 350.5t158 351t369 142q151 0 276 -110l70 90q16 20 30 20q25 0 25 -30v-340q0 -26 -29 -26t-36 28q-8 40 -34 118q-39 87 -114.5 140t-160.5 53t-155 -31 q-230 -102 -230 -404.5t232 -404.5q71 -31 155 -31t146 34q77 41 77 120v77q0 24 -6 33q-17 24 -182 24v64q58 -4 168.5 -4t271.5 4v-64z" />
+<glyph unicode="&#x263;" horiz-adv-x="1151" d="M775 39q66 -144 66 -250t-73 -168.5t-178 -62.5t-176.5 51t-71.5 145t71 230q22 43 126 210l-316 582q-31 57 -71 71q-22 8 -76 8h-23v68q119 -8 168 -8t272 8v-68h-4q-118 0 -118 -54q0 -12 253 -477l218 389q13 23 13 50q0 91 -102 92v68q131 -8 193 -8t153 8v-68 q-119 -1 -198 -142l-248 -443q99 -180 122 -231zM465.5 -344q47.5 -45 113.5 -45t99.5 43.5t33.5 113t-51 183.5q-10 23 -92 180q-151 -247 -151 -357q0 -73 47.5 -118z" />
+<glyph unicode="&#x264;" horiz-adv-x="1051" d="M999 855q-60 0 -103 -33q-27 -19 -75 -79l-215 -265q152 -177 152 -300q0 -202 -220 -202q-190 0 -190 192q0 125 139 261l-284 377q-37 49 -142 49h-8v68q120 -8 166 -8t274 8v-68h-6q-131 0 -131 -46q0 -12 8 -23l209 -277l189 234q9 11 9 30q0 80 -118 82v68 q134 -8 194 -8t152 8v-68zM646 146q0 83 -114 227q-114 -113 -114 -207q0 -56 33 -96t88 -40q107 0 107 116z" />
+<glyph unicode="&#x265;" horiz-adv-x="1181" d="M823 182h-2q-41 -93 -125 -149t-184 -56q-292 0 -292 314v502q0 65 -135 65q-15 0 -32 -1v66q200 -6 238 -6t244 6v-66q-30 1 -70.5 1t-63.5 -12q-33 -19 -33 -76v-519q0 -227 158 -227q130 0 209.5 104.5t79.5 238.5v400q0 39 -10 58q-18 33 -117 33q-18 0 -38 -1v66 q200 -6 236.5 -6t242.5 6v-66q-30 1 -72.5 1t-68 -16.5t-25.5 -80.5v-995q0 -87 44 -108q21 -10 96 -10h26v-67l-306 -23v624z" />
+<glyph unicode="&#x266;" horiz-adv-x="1181" d="M1129 0q-200 6 -238 6t-244 -6v66q30 -1 70.5 -1t63.5 12q33 19 33 76v519q0 227 -158 227q-130 0 -209.5 -104.5t-79.5 -238.5v-400q0 -39 10 -58q18 -33 117 -33q18 0 38 1v-66q-200 6 -236.5 6t-242.5 -6v66q30 -1 72.5 -1t68 16.5t25.5 80.5v937q0 141 95.5 240 t236.5 99q72 0 132.5 -40.5t60.5 -108.5q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -149 -101q-43 -81 -43 -187v-363h2q41 93 125 149t184 56q292 0 292 -314v-502q0 -65 135 -65q15 0 32 1v-66z" />
+<glyph unicode="&#x267;" horiz-adv-x="1164" d="M962 -107q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29q158 0 158 281v743q0 267 -166 267q-130 0 -209.5 -104.5t-79.5 -238.5v-400q0 -39 10 -58q18 -33 117 -33q18 0 38 1v-66 q-200 6 -236.5 6t-242.5 -6v66q30 -1 72.5 -1t68 16.5t25.5 80.5v937q0 141 95.5 240t236.5 99q72 0 132.5 -40.5t60.5 -108.5q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -149 -101q-43 -81 -43 -187v-363h2q41 93 125 149t184 56 q292 0 292 -316v-737z" />
+<glyph unicode="&#x268;" horiz-adv-x="578" d="M335.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM566 514h-207v-370q0 -59 51 -73q19 -5 69 -5h31v-66q-202 6 -233 6t-224 -6v66l44 -1q66 0 89 13q33 18 33 79v357h-207v68h207v157q0 85 -41 105q-21 11 -103 11h-14 v68l298 23v-364h207v-68z" />
+<glyph unicode="&#x269;" horiz-adv-x="748" d="M695 266q0 -114 -48 -194q-58 -96 -164 -96q-133 0 -203 78t-70 212v473q0 86 -41 106q-20 11 -103 11h-14v67l299 23v-685q0 -231 148 -231q102 0 131 139q12 56 12 182v37h53v-122z" />
+<glyph unicode="&#x26a;" horiz-adv-x="578" d="M525 0q-193 6 -236 6t-236 -6v66l44 -1q66 0 89 13q33 18 33 79v609q0 61 -33 79q-23 13 -89 13l-44 -1v66q193 -6 236 -6t236 6v-66l-44 1q-66 0 -89 -13q-33 -18 -33 -79v-609q0 -61 33 -79q23 -13 89 -13l44 1v-66z" />
+<glyph unicode="&#x26b;" horiz-adv-x="704" d="M115 66l68 -2q98 0 98 98v505q-38 17 -69 17q-79 0 -165 -99l-35 30q76 87 96 105q64 57 124 57q25 0 49 -8v508q0 87 -44 108q-21 10 -106 10h-16v67l306 23v-790q37 -17 71 -17q79 0 165 99l35 -31q-76 -87 -96 -105q-64 -57 -124 -57q-25 0 -51 9v-431q0 -50 13.5 -69 t49.5 -23q29 -4 81 -4h24v-66q-220 6 -247.5 6t-226.5 -6v66z" />
+<glyph unicode="&#x26c;" horiz-adv-x="749" d="M145 66l68 -2q98 0 98 98v352q-299 0 -299 184q0 60 35.5 99.5t94.5 39.5q100 0 169 -90v530q0 87 -44 108q-21 10 -106 10h-16v67l306 23v-903h286v-68h-286v-352q0 -50 13.5 -69t49.5 -23q29 -4 81 -4h24v-66q-220 6 -247.5 6t-226.5 -6v66zM311 582q-13 68 -61.5 129 t-112 61t-63.5 -74t90 -100q44 -12 147 -16z" />
+<glyph unicode="&#x26d;" horiz-adv-x="663" d="M703 -152q0 -114 -48 -194q-58 -96 -164 -96q-132 0 -202 78t-70 212v1429q0 87 -44 108q-21 10 -106 10h-16v67l306 23v-1642q0 -231 148 -231q102 0 131 139q12 56 12 182v37h53v-122z" />
+<glyph unicode="&#x26e;" horiz-adv-x="1147" d="M53 66l68 -2q98 0 98 98v1115q0 87 -44 108q-21 10 -106 10h-16v67l306 23v-562h688q38 0 38 -28q0 -20 -18 -38l-372 -379q179 -12 295.5 -121t116.5 -293.5t-137.5 -311t-334.5 -126.5q-121 0 -215 54q-113 64 -113 170t97 106q42 0 70.5 -28t28.5 -70q0 -94 -100 -99 q79 -78 221 -78t224 115t82 252.5t-76 220.5t-210 83q-39 0 -84 -12l-37 38l397 405h-336q-122 0 -166 -24q-59 -33 -59 -136v-461q0 -50 13.5 -69t49.5 -23q29 -4 81 -4h24v-66q-220 6 -247.5 6t-226.5 -6v66z" />
+<glyph unicode="&#x26f;" horiz-adv-x="1775" d="M1106 -23q-251 0 -284 210q-43 -95 -126.5 -152.5t-185.5 -57.5q-158 0 -224.5 81t-66.5 243q0 14 0.5 41.5t0.5 41.5v409q0 65 -132 65q-17 0 -35 -1v66q198 -6 238 -6t244 6v-66q-26 1 -70 1t-65 -13q-32 -19 -32 -84v-499q0 -238 157 -238q130 0 209.5 104.5 t79.5 238.5v401q0 39 -12 60q-18 30 -118 30q-17 0 -37 -1v66q198 -6 237.5 -6t244.5 6v-66q-26 1 -70 1t-65 -13q-32 -19 -32 -84v-499q0 -238 158 -238q130 0 209.5 104.5t79.5 238.5v397q0 47 -11 64q-18 30 -114 30q-19 0 -40 -1v66q198 -6 236 -6t243 6v-66 q-26 1 -69.5 1t-70 -16t-26.5 -81v-574q0 -87 44 -109q21 -10 96 -10h26v-68l-301 -23v225q-101 -225 -316 -225z" />
+<glyph unicode="&#x270;" horiz-adv-x="1775" d="M1106 -23q-251 0 -284 210q-43 -95 -126.5 -152.5t-185.5 -57.5q-158 0 -224.5 81t-66.5 243q0 14 0.5 41.5t0.5 41.5v409q0 65 -132 65q-17 0 -35 -1v66q198 -6 238 -6t244 6v-66q-26 1 -70 1t-65 -13q-32 -19 -32 -84v-499q0 -238 157 -238q130 0 209.5 104.5 t79.5 238.5v401q0 39 -12 60q-18 30 -118 30q-17 0 -37 -1v66q198 -6 237.5 -6t244.5 6v-66q-26 1 -70 1t-65 -13q-32 -19 -32 -84v-499q0 -238 158 -238q130 0 209.5 104.5t79.5 238.5v397q0 47 -11 64q-18 30 -114 30q-19 0 -40 -1v66q198 -6 236 -6t243 6v-66 q-26 1 -69.5 1t-70 -16t-26.5 -81v-993q0 -87 44 -109q21 -10 96 -10h26v-68l-301 -23v644q-101 -225 -316 -225z" />
+<glyph unicode="&#x271;" horiz-adv-x="1760" d="M1558 -107q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29q158 0 158 281v743q0 267 -166 267q-130 0 -210 -105t-80 -238v-401q0 -39 12 -60q18 -30 118 -30q17 0 37 1v-66 q-198 6 -237.5 6t-244.5 -6v66q26 -1 70 -1t65 13q32 19 32 84v499q0 238 -158 238q-130 0 -209.5 -104.5t-79.5 -238.5v-397q0 -47 11 -64q18 -30 114 -30q19 0 40 1v-66q-198 6 -236 6t-243 -6v66q26 -1 69.5 -1t70 16t26.5 81v574q0 87 -44 109q-21 10 -96 10h-26v68 l301 23v-225q101 225 316 225q251 0 284 -210q43 95 126.5 152.5t185.5 57.5q292 0 292 -316v-737z" />
+<glyph unicode="&#x272;" horiz-adv-x="1207" d="M1155 0q-200 6 -238 6t-244 -6v66q29 -1 70 -1t64 12q33 19 33 76v519q0 227 -158 227q-130 0 -213.5 -109.5t-83.5 -243.5v-653q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29 q158 0 158 281v847q0 87 -44 109q-21 10 -96 10h-26v68l301 23v-225q101 225 316 225q292 0 292 -316v-500q0 -65 135 -65q15 0 32 1v-66z" />
+<glyph unicode="&#x273;" horiz-adv-x="1356" d="M1356 -267q0 -84 -83 -132q-69 -40 -159 -40q-130 0 -211 99.5t-81 232.5v739q0 267 -166 267q-130 0 -209.5 -104.5t-79.5 -238.5v-400q0 -38 10 -58q17 -33 117 -33q17 0 38 1v-66q-199 6 -236 6t-243 -6v66q29 -1 72 -1t68.5 16.5t25.5 80.5v574q0 87 -44 109 q-21 10 -96 10h-26v68l301 23v-225q101 225 316 225q292 0 292 -316v-741q0 -281 158 -281q56 0 114 29q-74 20 -74 96q0 42 28.5 70t70.5 28t69.5 -28t27.5 -70z" />
+<glyph unicode="&#x274;" horiz-adv-x="1160" d="M954 769v-740q0 -29 -32 -29t-48 21l-611 796v-665q0 -87 151 -87h3v-65q-156 4 -182.5 4t-182.5 -4v65h3q150 0 150 87v681q0 17 -13.5 20.5t-139.5 3.5v66h287q27 0 43 -21l514 -669v540q0 86 -151 86h-3v66q153 -4 184 -4t183 4v-66h-3q-152 0 -152 -90z" />
+<glyph unicode="&#x275;" horiz-adv-x="1054" d="M191.5 118.5q-138.5 142.5 -138.5 341.5t138 349.5t336.5 150.5t336.5 -151t138 -350.5t-139 -341t-336 -141.5t-335.5 142.5zM767 773q-84 138 -244.5 138t-241.5 -143q-49 -87 -51 -256h593q-2 173 -56 261zM285 174q83 -144 246.5 -144t244.5 158q45 89 47 256h-593 q2 -178 55 -270z" />
+<glyph unicode="&#x276;" horiz-adv-x="1488" d="M786 0q-39 0 -116.5 -15t-116.5 -15q-205 0 -353 142.5t-148 347t148 350t353 145.5q39 0 114.5 -16t114.5 -16h570l44 -315h-53q-19 150 -68 203.5t-196 54.5l-182 1q-32 0 -41.5 -7.5t-9.5 -38.5v-312h153q99 0 132 29q32 28 32 120v6h53v-368h-53v6q0 92 -32 120 q-33 29 -132 29h-153v-349q0 -29 8.5 -37t38.5 -8h183q170 0 231 71q45 53 78 231h54l-66 -359h-587zM717 478v164q0 75 -9 143t-40.5 96.5t-108.5 28.5q-157 0 -255 -142q-87 -126 -87 -292t85 -303q98 -158 257 -158q79 0 110 30t39 93.5t8 157t1 182.5z" />
+<glyph unicode="&#x277;" horiz-adv-x="1419" d="M1335 467q0 -179 -91 -322q-104 -165 -273 -165q-230 0 -258 270h-6q-29 -270 -258 -270q-169 0 -274 165q-91 143 -91 322q0 235 191.5 381.5t431.5 146.5t426 -142q202 -154 202 -386zM1147 471q0 200 -119.5 338.5t-317 138.5t-318 -140t-120.5 -341q0 -428 199 -428 q100 0 151 100q40 78 40 189q0 59 -24 173.5t-24 172.5q0 114 97 114q94 0 94 -114q0 -58 -22.5 -172.5t-22.5 -173.5q0 -112 38 -189q50 -100 150 -100q199 0 199 432z" />
+<glyph unicode="&#x278;" horiz-adv-x="1195" d="M429 1265l-68 -2v66q198 -6 225.5 -6t248.5 6v-66h-24q-53 0 -82 -3q-36 -5 -49 -24t-13 -69v-211q204 -24 339.5 -169.5t135.5 -327.5t-136 -319t-339 -160v-218q0 -50 13 -69t49 -23q29 -4 82 -4h24v-66q-221 6 -248.5 6t-225.5 -6v66l68 -2q98 0 98 98v218 q-203 23 -338.5 160.5t-135.5 319.5t134.5 326.5t339.5 169.5v211q0 98 -98 98zM908 199q55 93 55 281.5t-66 282.5q-81 115 -230 142v-869q162 29 241 163zM290 757q-60 -92 -60 -284t64 -289q80 -119 233 -147v868q-159 -29 -237 -148z" />
+<glyph unicode="&#x279;" horiz-adv-x="823" d="M771 857l-67 2q-100 0 -100 -98v-574q0 -87 45 -109q22 -10 106 -10h16v-68l-297 -23v235q-76 -235 -262 -235q-60 0 -109.5 36.5t-49.5 85.5t25.5 76t65 27t66 -26t26.5 -66q0 -64 -48 -84q6 -2 14 -2q136 0 207 140q55 111 55 262v346q0 62 -56 78q-23 7 -108 7h-44v66 q81 -6 147 -6h174l194 6v-66z" />
+<glyph unicode="&#x27a;" horiz-adv-x="823" d="M771 1277l-67 2q-100 0 -100 -98v-994q0 -87 45 -109q22 -10 106 -10h16v-68l-297 -23v235q-76 -235 -262 -235q-60 0 -109.5 36.5t-49.5 85.5t25.5 76t65 27t66 -26t26.5 -66q0 -64 -48 -84q6 -2 14 -2q136 0 207 140q55 111 55 262v766q0 62 -56 78q-23 7 -108 7h-44 v66q81 -6 147 -6h174l194 6v-66z" />
+<glyph unicode="&#x27b;" horiz-adv-x="998" d="M771 857l-67 2q-100 0 -100 -98v-872q0 -281 158 -281q56 0 114 29q-74 20 -74 96q0 42 28.5 70t70.5 28t69.5 -28t27.5 -70q0 -84 -83 -132q-69 -40 -159 -40q-130 0 -211 99.5t-81 232.5v291q-81 -207 -252 -207q-60 0 -109.5 36.5t-49.5 85.5t25.5 76t65 27t66 -26 t26.5 -66q0 -64 -48 -84q6 -2 14 -2q136 0 207 140q55 111 55 262v346q0 62 -56 78q-23 7 -108 7h-44v66q81 -6 147 -6h174l194 6v-66z" />
+<glyph unicode="&#x27c;" horiz-adv-x="823" d="M53 -348l67 -2q100 0 100 98v988q0 87 -45 109q-22 10 -106 10h-16v68l297 23v-235q76 235 262 235q60 0 109.5 -36.5t49.5 -85.5t-25.5 -76t-65 -27t-66 26t-26.5 66q0 64 48 84q-6 2 -14 2q-136 0 -207 -140q-55 -111 -55 -262v-760q0 -62 56 -78q23 -7 108 -7h44v-66 q-81 6 -147 6h-174l-194 -6v66z" />
+<glyph unicode="&#x27d;" horiz-adv-x="823" d="M612 946q60 0 109.5 -36.5t49.5 -85.5t-25.5 -76t-65 -27t-66 26t-26.5 66q0 64 48 84q-6 2 -14 2q-136 0 -207 -140q-55 -111 -55 -262v-608q0 -281 158 -281q56 0 114 29q-74 20 -74 96q0 42 28.5 70t70.5 28t69.5 -28t27.5 -70q0 -84 -83 -132q-69 -40 -159 -40 q-130 0 -211 99.5t-81 232.5v843q0 87 -45 109q-22 10 -106 10h-16v68l297 23v-235q76 235 262 235z" />
+<glyph unicode="&#x27e;" horiz-adv-x="823" d="M53 66l67 -2q100 0 100 98v445q0 141 95.5 240t236.5 99q72 0 132.5 -40.5t60.5 -108.5q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -149 -101q-43 -81 -43 -187v-461q0 -62 56 -78q23 -7 108 -7h44v-66q-81 6 -147 6h-174l-194 -6v66z" />
+<glyph unicode="&#x27f;" horiz-adv-x="823" d="M678 -336l67 2v-66l-194 6h-174q-66 0 -147 -6v66h44q85 0 108 7q56 16 56 78v861q0 106 -43 187q-53 101 -149 101q-37 0 -70 -15q64 -22 64 -91q0 -39 -26.5 -65t-65.5 -26q-95 0 -95 94q0 68 60.5 108.5t132.5 40.5q141 0 236.5 -99t95.5 -240v-845q0 -98 100 -98z " />
+<glyph unicode="&#x280;" horiz-adv-x="1166" d="M1103 124q0 -64 -44 -109t-108 -45q-115 0 -189.5 49.5t-74.5 175.5v32q1 21 1 31q0 86 -35 123q-55 58 -141 58h-169v-272q0 -49 9 -68q16 -33 158 -33v-66q-198 6 -226.5 6t-249.5 -6v66q142 0 158 33q9 19 9 68v589q0 49 -9 68q-16 33 -158 33v66h484q206 0 326 -103 q77 -66 77 -147.5t-83 -143.5q-66 -50 -157 -71q86 -38 125 -102q25 -42 51.5 -147t31.5 -118q28 -74 72 -74q73 0 88 109q4 30 26 30q28 0 28 -32zM674 520q69 43 69 157.5t-83 154.5q-54 25 -165.5 25t-124.5 -5q-27 -10 -27 -75v-291h156q121 0 175 34z" />
+<glyph unicode="&#x281;" horiz-adv-x="1166" d="M1103 799q0 -32 -28 -32q-22 0 -26 30q-15 109 -88 109q-44 0 -72 -74q-5 -13 -31.5 -118t-51.5 -147q-39 -64 -125 -102q91 -21 157 -71q83 -62 83 -143.5t-70 -141.5q-127 -109 -333 -109h-484v66q142 0 158 33q9 19 9 68v589q0 49 -9 68q-16 33 -158 33v66 q221 -6 249.5 -6t226.5 6v-66q-142 0 -158 -33q-9 -19 -9 -68v-272h169q86 0 141 58q35 37 35 123q0 10 -1 31v32q0 126 74.5 175.5t189.5 49.5q64 0 108 -45t44 -109zM660 91q83 40 83 154.5t-69 157.5q-54 34 -175 34h-156v-291q0 -65 27 -75q13 -5 124.5 -5t165.5 25z " />
+<glyph unicode="&#x282;" horiz-adv-x="804" d="M752 274q0 -146 -97 -222t-242 -76t-242 93v-177q0 -106 43 -187q53 -101 149 -101q37 0 70 15q-64 22 -64 91q0 39 26.5 65t65.5 26q95 0 95 -94q0 -68 -60.5 -108.5t-132.5 -40.5q-139 0 -224.5 97.5t-85.5 241.5v434q0 32 27 32q21 0 30 -35q37 -146 92 -214 q73 -90 206 -90q103 0 172 48.5t69 146.5q0 147 -223 195q-128 28 -148 33q-82 25 -134 67q-91 75 -91 183q0 134 108 204q92 59 221.5 59t212.5 -61q60 61 82 61t22 -33v-254q0 -35 -29 -35q-23 0 -31 43l-6 60q-16 87 -81.5 132.5t-158.5 45.5t-157 -34q-81 -43 -81 -129 t94 -130q48 -22 169 -46q170 -33 243 -102q91 -86 91 -204z" />
+<glyph unicode="&#x283;" horiz-adv-x="967" d="M915 1359q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -151 -102q-46 -84 -46 -189v-1224q0 -141 -95.5 -240t-236.5 -99q-72 0 -132.5 40.5t-60.5 108.5q0 94 95 94q39 0 65.5 -26t26.5 -65q0 -69 -64 -91q33 -15 70 -15q96 0 151 102 q46 84 46 189v1224q0 141 95.5 240t236.5 99q72 0 132.5 -40.5t60.5 -108.5z" />
+<glyph unicode="&#x284;" horiz-adv-x="967" d="M915 1359q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -151 -102q-46 -84 -46 -189v-248h251v-68h-251v-594h168v-68h-168v-246q0 -141 -95.5 -240t-236.5 -99q-72 0 -132.5 40.5t-60.5 108.5q0 94 95 94q39 0 65.5 -26t26.5 -65 q0 -69 -64 -91q33 -15 70 -15q96 0 151 102q46 84 46 189v248h-251v68h251v594h-168v68h168v246q0 141 95.5 240t236.5 99q72 0 132.5 -40.5t60.5 -108.5z" />
+<glyph unicode="&#x285;" horiz-adv-x="915" d="M915 -243q0 -68 -60.5 -108.5t-132.5 -40.5q-141 0 -236.5 99t-95.5 240v662q0 105 -46 189q-55 102 -151 102q-37 0 -70 -15q64 -22 64 -91q0 -39 -26.5 -65t-65.5 -26q-95 0 -95 94q0 68 60.5 108.5t132.5 40.5q141 0 236.5 -99t95.5 -240v-662q0 -105 46 -189 q55 -102 151 -102q37 0 70 15q-64 22 -64 91q0 39 26.5 65t65.5 26q95 0 95 -94z" />
+<glyph unicode="&#x286;" horiz-adv-x="1015" d="M963 1359q0 -41 -27 -67.5t-67 -26.5t-66.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -151 -102q-46 -84 -46 -189v-1178l-4 -59q89 -127 155 -357l-54 -19q-56 196 -121 304q-36 -95 -121.5 -152t-185.5 -57t-171 71t-71 170.5t70 170t174 70.5t194 -62v1096 q0 141 95.5 240t236.5 99q72 0 132.5 -40.5t60.5 -108.5zM438 -22v19q-88 78 -198 78q-74 0 -127.5 -53.5t-53.5 -127.5t53.5 -127.5t127.5 -53.5q94 0 146 82.5t52 182.5z" />
+<glyph unicode="&#x287;" horiz-adv-x="775" d="M393 -24v394h-305v68h305v594q0 231 -144.5 231t-144.5 -290q0 -18 1 -67h-52v122q0 113 48 193q58 96 164 96q132 0 203.5 -78t71.5 -211v-590h182v-49q-142 -5 -215 -145q-59 -111 -61 -268h-53z" />
+<glyph unicode="&#x288;" horiz-adv-x="776" d="M776 -267q0 -84 -83 -132q-69 -40 -159 -40q-131 0 -215 100t-84 233v961h-182v49q142 5 215 145q59 111 61 268h53v-394h305v-68h-305v-966q0 -281 158 -281q56 0 114 29q-74 20 -74 96q0 42 28.5 70t70.5 28t69.5 -28t27.5 -70z" />
+<glyph unicode="&#x289;" horiz-adv-x="1188" d="M1176 514h-207v-329q0 -87 45 -109q21 -10 96 -10h26v-66l-308 -24v193q-89 -193 -278.5 -193t-256.5 83t-67 280v175h-214v68h214v132q0 102 -35 126q-22 15 -119 15h-12v68l314 23v-364h447v154q0 87 -45 109q-21 10 -96 10h-26v68l315 23v-364h207v-68zM821 356v158 h-447v-278q0 -114 39 -163t156 -49t189 108q63 94 63 224z" />
+<glyph unicode="&#x28a;" horiz-adv-x="1110" d="M1038 839h-177q168 -153 168 -381q0 -197 -138.5 -339.5t-335.5 -142.5t-335.5 142.5t-138.5 339.5q0 228 168 381h-177v84q85 -8 133.5 -8t205.5 8v-52q-98 -58 -131 -173q-22 -75 -22 -222q0 -208 55 -302q84 -144 242 -144t242 144q55 94 55 302q0 147 -22 222 q-33 115 -131 173v52q157 -8 205.5 -8t133.5 8v-84z" />
+<glyph unicode="&#x28b;" horiz-adv-x="1199" d="M1146 504q0 -226 -128.5 -377t-350.5 -151q-190 0 -297.5 96.5t-107.5 284.5v421q0 40 -21 74t-58 34q-79 0 -79 -173q0 -36 3 -84h-55v120q0 83 47.5 143t132 60t132 -63t47.5 -153v-357q0 -355 250 -355q171 0 264 163q77 134 77 319q0 134 -49 249q-63 149 -179 149 q-52 0 -94 -29q80 -13 80 -96q0 -39 -27.5 -64.5t-68.5 -25.5t-66.5 29t-25.5 71q0 76 72 119.5t154 43.5q174 0 268 -143q80 -122 80 -305z" />
+<glyph unicode="&#x28c;" horiz-adv-x="1151" d="M1099 0q-120 8 -164 8t-276 -8v68q122 0 122 54q0 15 -252 634l-219 -546q-13 -32 -13 -50q0 -90 102 -92v-68q-135 8 -194.5 8t-151.5 -8v68q142 1 198 142l279 697q16 40 45 40t45 -40l309 -760q24 -60 68 -73q18 -6 83 -6h19v-68z" />
+<glyph unicode="&#x28d;" horiz-adv-x="1571" d="M1518 0q-143 8 -170.5 8t-260.5 -8v68h4q121 0 121 56q0 38 -77 245l-137 366l-183 -518q38 -105 54 -121q29 -28 129 -28v-68q-120 8 -189 8l-224 -8v68h4q124 0 124 56q0 11 -11 42l-213 595l-195 -546q-10 -28 -10 -46q0 -98 125 -101v-68q-151 8 -209.5 8t-146.5 -8 v68q131 3 179 136l252 703q14 40 42 40t42 -40l220 -608l216 606q15 42 42.5 42t44.5 -48l270 -757q19 -54 62 -68q20 -6 78 -6h17v-68z" />
+<glyph unicode="&#x28e;" horiz-adv-x="1151" d="M1099 0q-120 8 -178.5 8t-261.5 -8v68h4q116 0 116 54q0 19 -250 616l-217 -528q-14 -34 -14 -50q0 -90 101 -92v-68q-170 8 -212 8t-134 -8v68h2q140 0 197 136l377 913q101 245 274 245q76 0 136 -50t60 -124q0 -91 -89 -91q-39 0 -65 25.5t-26 63.5q0 81 85 91 q-41 38 -101 38q-93 0 -158 -92q-32 -45 -68 -130l-71 -170l321 -781q22 -54 70 -68q21 -6 74 -6h28v-68z" />
+<glyph unicode="&#x28f;" horiz-adv-x="1206" d="M1154 857q-135 0 -192 -83l-288 -416v-241q0 -21 6 -32q11 -20 149 -20v-66q-68 5 -99 5h-255q-30 0 -99 -5v66q7 0 23 -0.5t25 -0.5q90 0 101 20q4 8 4 26v248l-312 454q-26 37 -75 44q-8 1 -90 1v66q94 -4 185 -4h125q52 0 120 5v-67h-47q-56 0 -56 -24q0 -6 272 -402 l240 348q15 22 15 34q0 44 -86 44v66q116 -4 181.5 -4t152.5 5v-67z" />
+<glyph unicode="&#x290;" horiz-adv-x="1199" d="M1199 -293q0 -68 -60.5 -108.5t-132.5 -40.5q-139 0 -224.5 97.5t-85.5 241.5v103h-605q-38 0 -38 30q0 15 18 39l599 807h-245q-167 0 -223.5 -63.5t-65.5 -234.5h-53l24 345h701q38 0 38 -28q0 -14 -18 -38l-595 -803h251q182 0 248 86q51 68 65 260h55l-38 -400v-108 q0 -106 43 -187q53 -101 149 -101q37 0 70 15q-64 22 -64 91q0 39 26.5 65t65.5 26q95 0 95 -94z" />
+<glyph unicode="&#x291;" horiz-adv-x="935" d="M349 -217q-29 0 -29 24.5t107 192.5h-336q-38 0 -38 30q0 15 18 39l599 807h-245q-167 0 -223.5 -63.5t-65.5 -234.5h-53l24 345h701q38 0 38 -28q0 -14 -18 -38l-595 -803h230q222 327 342 327t120 -106q0 -125 -120 -205q-105 -70 -237 -70h-75q-36 -53 -57 -90 l-64 -112q-10 -15 -23 -15zM871 275q0 52 -63 52q-87 0 -279 -273h58q96 0 190 64.5t94 156.5z" />
+<glyph unicode="&#x292;" horiz-adv-x="948" d="M496 478q179 -12 295.5 -121t116.5 -293.5t-137.5 -311t-334.5 -126.5q-121 0 -215 54q-113 64 -113 170t97 106q42 0 70.5 -28t28.5 -70q0 -94 -100 -99q79 -78 221 -78t224 115t82 252.5t-76 220.5t-210 83q-39 0 -84 -12l-37 38l397 405h-325q-126 0 -164 -19 q-60 -30 -72 -141h-54l21 300h721q38 0 38 -28q0 -20 -18 -38z" />
+<glyph unicode="&#x293;" horiz-adv-x="948" d="M496 478q179 -12 295.5 -121t116.5 -278.5t-103 -289.5q45 -94 81 -214l-47 -17q-33 103 -73 190q-135 -122 -330 -122q-120 0 -215 54q-113 65 -113 176.5t95 179t212 67.5q171 0 300 -167q16 58 16 115q0 135 -76 218t-210 83q-39 0 -84 -12l-37 38l397 405h-325 q-126 0 -164 -19q-60 -30 -72 -141h-54l21 300h721q38 0 38 -28q0 -20 -18 -38zM415 54q-97 0 -172.5 -52.5t-75.5 -144t93 -138.5q74 -38 173 -38q178 0 263 199q-110 174 -281 174z" />
+<glyph unicode="&#x294;" horiz-adv-x="884" d="M705.5 1300q143.5 -138 143.5 -327t-124.5 -319.5t-303.5 -150.5v-347q0 -39 10 -58q17 -33 113 -33q20 0 42 1v-66q-198 6 -236 6t-243 -6v66q28 -1 71.5 -1t69 16.5t25.5 80.5v395q33 -6 83.5 -6t117.5 33q188 92 188 385t-178 384q-65 33 -126 33q-146 0 -227 -80 q98 -5 98 -98q0 -42 -27.5 -69.5t-69.5 -27.5t-69.5 27.5t-27.5 69.5q0 111 113 176q94 54 213 54q201 0 344.5 -138z" />
+<glyph unicode="&#x295;" horiz-adv-x="884" d="M849 1208q0 -42 -27.5 -69.5t-69.5 -27.5t-69.5 27.5t-27.5 69.5q0 93 98 98q-81 80 -227 80q-61 0 -126 -33q-178 -91 -178 -384t188 -385q67 -33 117.5 -33t83.5 6v-395q0 -64 25.5 -80.5t69 -16.5t71.5 1v-66q-205 6 -243 6t-236 -6v66q22 -1 42 -1q96 0 113 33 q10 19 10 58v347q-179 20 -303.5 150.5t-124.5 319.5t143.5 327t344.5 138q119 0 213 -54q113 -65 113 -176z" />
+<glyph unicode="&#x296;" horiz-adv-x="884" d="M421 911q179 -20 303.5 -150.5t124.5 -319.5t-143.5 -327t-344.5 -138q-119 0 -213 54q-113 65 -113 176q0 42 27.5 69.5t69.5 27.5t69.5 -27.5t27.5 -69.5q0 -93 -98 -98q81 -80 227 -80q61 0 126 33q178 91 178 384t-188 385q-67 33 -117.5 33t-83.5 -6v395 q0 64 -25.5 80.5t-69 16.5t-71.5 -1v66q205 -6 243 -6t236 6v-66q-22 1 -42 1q-96 0 -113 -33q-10 -19 -10 -58v-347z" />
+<glyph unicode="&#x297;" horiz-adv-x="920" d="M839 -102q29 0 29 -22.5t-27 -74.5q-106 -203 -328 -203t-352 237q-108 196 -108 440.5t106 442.5q130 242 356 242q121 0 215 -54q113 -64 113 -170t-97 -106q-42 0 -70.5 28t-28.5 70q0 94 100 99q-79 78 -232 78q-149 0 -228 -245q-57 -176 -57 -370q0 -127 30 -275.5 t85 -236.5q79 -126 189 -126t178 64q40 37 74 109.5t53 72.5z" />
+<glyph unicode="&#x298;" horiz-adv-x="1090" d="M1037 468q0 -204 -144 -348t-348 -144t-348 144t-144 348t144 348t348 144t348 -144t144 -348zM873 468q0 177 -74 296q-88 142 -254 142t-254 -142q-74 -119 -74 -296t74 -296q88 -142 254 -142t254 142q74 119 74 296zM662 468q0 -48 -34.5 -82.5t-82.5 -34.5 t-82.5 34.5t-34.5 82.5t34.5 82.5t82.5 34.5t82.5 -34.5t34.5 -82.5z" />
+<glyph unicode="&#x299;" horiz-adv-x="1118" d="M1002 251q0 -49 -27 -97q-87 -154 -315 -154h-598v66q72 0 108.5 4t47.5 25t11 72v589q0 51 -11 72t-47.5 25t-108.5 4v66h557q223 0 312 -136q31 -47 31 -95q0 -82 -73.5 -137.5t-164.5 -72.5q105 -10 191.5 -71.5t86.5 -159.5zM797 690q0 80 -55.5 123.5t-137.5 43.5 h-148q-64 0 -78 -13t-14 -75v-266h199q168 0 219 121q15 36 15 66zM608 66q93 0 158 49.5t65 138t-54.5 145.5t-140.5 57h-272v-302q0 -62 14 -75t78 -13h152z" />
+<glyph unicode="&#x29a;" horiz-adv-x="977" d="M471 960q197 0 325 -144.5t128 -345.5t-129.5 -347.5t-329.5 -146.5q-149 0 -263 61q-140 76 -140 211q0 99 74 161.5t179 86.5q-93 22 -154 84t-61 153q0 123 132 182q98 45 239 45zM753 169q94 125 94 303.5t-106 309t-280 130.5q-97 0 -156.5 -50.5t-59.5 -143.5 q0 -188 199 -188q22 0 63 11t63 11q86 0 86 -55.5t-87 -55.5q-21 0 -62.5 11t-62.5 11q-224 0 -224 -205q0 -228 255 -228q175 0 278 139z" />
+<glyph unicode="&#x29b;" horiz-adv-x="1365" d="M1365 1289q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -149 -101q-43 -81 -43 -187v-519q0 -26 -29 -26t-36 28q-8 40 -34 118q-39 87 -114.5 140t-160.5 53t-155 -31q-230 -102 -230 -404.5t232 -404.5q71 -31 155 -31t146 34q77 41 77 120 v77q0 24 -6 33q-17 24 -182 24v64q58 -4 168.5 -4t271.5 4v-64h-42q-62 0 -62 -51v-236q0 -27 -20 -27q-29 0 -96 77q-80 -108 -287 -108t-365.5 141.5t-158.5 350.5t158 351t369 142q148 0 271 -106v255q0 142 90.5 238t231.5 96q72 0 132.5 -40.5t60.5 -108.5z" />
+<glyph unicode="&#x29c;" horiz-adv-x="1178" d="M1120 0q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v281h-435v-281q0 -49 9 -68q16 -33 159 -33v-66q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-242h435 v242q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-10 -18 -10 -71v-589q0 -53 10 -71q17 -30 157 -30v-66z" />
+<glyph unicode="&#x29d;" horiz-adv-x="588" d="M386 1276q0 -47 -33.5 -81t-80 -34t-79.5 34.5t-33 80t33.5 79.5t79.5 34t79.5 -33t33.5 -80zM555 -66h-170v-41q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 158 125 221q91 46 269 46v750q0 39 -9 60q-20 45 -148 45h-27v68l324 23v-946h170v-66z M245 -111v45q-149 0 -222 -26q-119 -43 -119 -163q0 -64 58 -100.5t125 -36.5q158 0 158 281z" />
+<glyph unicode="&#x29e;" horiz-adv-x="1139" d="M430 120q0 -50 61 -52v-68q-116 8 -214 8t-175 -8v68q133 6 270 114q174 137 174 156q0 2 -14 22l-273 383q-48 67 -89 91q-38 23 -111 23h-6v66q88 -6 168 -6t248 6v-66h-6q-70 0 -70 -49q0 -38 255 -385l136 116v222q0 51 -12 69.5t-48 23.5q-29 3 -82 3h-25v66 q121 -6 197 -6t272 6v-66q-10 0 -33 0.5t-35 0.5q-99 0 -99 -97v-995q0 -87 45 -108q21 -10 106 -10h16v-67l-307 -23v907l-302 -261q-47 -41 -47 -84z" />
+<glyph unicode="&#x29f;" horiz-adv-x="985" d="M56 0v67h6q135 0 151 30q10 18 10 70v583q0 53 -10 71q-17 30 -157 30v66q246 -6 344 -6t178 6v-66q-109 0 -150 -8.5t-51 -34.5q-7 -15 -7 -62v-591q0 -62 22.5 -75t92.5 -13q199 0 254 32q80 47 98 229h53l-38 -328h-796z" />
+<glyph unicode="&#x2a0;" horiz-adv-x="1325" d="M1325 1289q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -149 -101q-43 -81 -43 -187v-1357q0 -46 12 -67q17 -29 113 -29q19 0 41 1v-66q-166 5 -243 5t-239 -5v66q37 -2 77 -2t66 16.5t26 80.5v383q-115 -154 -284 -154q-192 0 -324 144.5 t-132 340t138 340.5t325.5 145t282.5 -169v322q0 141 96 240t237 99q72 0 132.5 -40.5t60.5 -108.5zM799 291v301q0 112 -76 206.5t-178.5 94.5t-176.5 -72q-138 -134 -138 -362q0 -152 66 -280q81 -155 219 -155q104 0 194 82t90 185z" />
+<glyph unicode="&#x2a1;" horiz-adv-x="884" d="M705.5 1300q143.5 -138 143.5 -327t-124.5 -319.5t-303.5 -150.5v-131h205v-68h-205v-148q0 -39 10 -58q17 -33 113 -33q20 0 42 1v-66q-198 6 -236 6t-243 -6v66q28 -1 71.5 -1t69 16.5t25.5 80.5v142h-206v68h206v185q33 -6 83.5 -6t117.5 33q188 92 188 385t-178 384 q-65 33 -126 33q-146 0 -227 -80q98 -5 98 -98q0 -42 -27.5 -69.5t-69.5 -27.5t-69.5 27.5t-27.5 69.5q0 111 113 176q94 54 213 54q201 0 344.5 -138z" />
+<glyph unicode="&#x2a2;" horiz-adv-x="884" d="M849 1208q0 -42 -27.5 -69.5t-69.5 -27.5t-69.5 27.5t-27.5 69.5q0 93 98 98q-81 80 -227 80q-61 0 -126 -33q-178 -91 -178 -384t188 -385q67 -33 117.5 -33t83.5 6v-185h206v-68h-206v-142q0 -64 25.5 -80.5t69 -16.5t71.5 1v-66q-205 6 -243 6t-236 -6v66q22 -1 42 -1 q96 0 113 33q10 19 10 58v148h-205v68h205v131q-179 20 -303.5 150.5t-124.5 319.5t143.5 327t344.5 138q119 0 213 -54q113 -65 113 -176z" />
+<glyph unicode="&#x2a3;" horiz-adv-x="1708" d="M793 118q-111 -142 -295 -142t-314.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q163 0 270 -133v464q0 88 -47 109q-20 10 -85 10q-16 0 -35 -1v67l308 23v-562h672q38 0 38 -28q0 -14 -18 -38l-595 -803h251q182 0 248 86q51 68 65 260h55l-38 -400h-512l-313 -24 v142zM1229 876q-169 0 -229 -65t-60 -233v-393q0 -15 1 -27l533 718h-245zM793 253v449q0 32 -24 68q-87 129 -236 129t-238 -138q-65 -100 -65 -300t61 -299q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="&#x2a4;" horiz-adv-x="1728" d="M1276 478q179 -12 295.5 -121t116.5 -293.5t-137.5 -311t-334.5 -126.5q-121 0 -215 54q-113 64 -113 170t97 106q42 0 70.5 -28t28.5 -70q0 -94 -100 -99q79 -78 221 -78t224 115t82 252.5t-76 220.5t-210 83q-39 0 -84 -12l-37 38l397 405h-325q-136 0 -186 -30.5 t-50 -129.5v-438q0 -88 46 -110q20 -10 85 -10q16 0 35 1v-66l-313 -24v142q-111 -142 -295 -142t-314.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q163 0 270 -133v464q0 88 -47 109q-20 10 -85 10q-16 0 -35 -1v67l308 23v-562h688q38 0 38 -28q0 -20 -18 -38zM793 253 v449q0 32 -24 68q-87 129 -236 129t-238 -138q-65 -100 -65 -300t61 -299q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="&#x2a5;" horiz-adv-x="1739" d="M1153 -217q-29 0 -29 24.5t107 192.5h-125l-313 -24v142q-111 -142 -295 -142t-314.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q163 0 270 -133v464q0 88 -47 109q-20 10 -85 10q-16 0 -35 -1v67l308 23v-562h672q38 0 38 -28q0 -14 -18 -38l-595 -803h230 q222 327 342 327t120 -106q0 -125 -120 -205q-105 -70 -237 -70h-75q-36 -53 -57 -90l-64 -112q-10 -15 -23 -15zM1229 876q-169 0 -229 -65t-60 -233v-393q0 -15 1 -27l533 718h-245zM1675 275q0 52 -63 52q-87 0 -279 -273h58q96 0 190 64.5t94 156.5zM793 253v449 q0 32 -24 68q-87 129 -236 129t-238 -138q-65 -100 -65 -300t61 -299q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="&#x2a6;" horiz-adv-x="1421" d="M1369 274q0 -146 -97 -222t-247 -76q-87 0 -142.5 29t-101.5 70t-61.5 41t-44.5 -42.5t-53 -61.5q-45 -36 -112 -36q-132 0 -203.5 78t-71.5 211v590h-182v49q142 5 215 145q59 111 61 268h53v-394h305v-68h-305v-594q0 -231 144 -231t144 245v56q0 32 27 32q21 0 30 -35 q37 -146 92 -214q73 -90 206 -90q103 0 172 48.5t69 146.5q0 147 -223 195q-128 28 -148 33q-82 25 -134 67q-91 75 -91 183q0 134 108 204q92 59 221.5 59t212.5 -61q60 61 82 61t22 -33v-254q0 -35 -29 -35q-23 0 -31 43l-6 60q-16 87 -81.5 132.5t-158.5 45.5t-157 -34 q-81 -43 -81 -129t94 -130q48 -22 169 -46q170 -33 243 -102q91 -86 91 -204z" />
+<glyph unicode="&#x2a7;" horiz-adv-x="1387" d="M1335 1359q0 -94 -95 -94q-39 0 -65.5 26t-26.5 65q0 69 64 91q-33 15 -70 15q-96 0 -151 -102q-46 -84 -46 -189v-1224q0 -141 -95.5 -240t-236.5 -99q-72 0 -132.5 40.5t-60.5 108.5q0 94 95 94q39 0 65.5 -26t26.5 -65q0 -69 -64 -91q33 -15 70 -15q96 0 151 102 q46 84 46 189v232q-103 -201 -300 -201q-132 0 -203.5 78t-71.5 211v590h-182v49q142 5 215 145q59 111 61 268h53v-394h428v246q0 141 95.5 240t236.5 99q72 0 132.5 -40.5t60.5 -108.5zM810 369v486h-428v-594q0 -231 144 -231q111 0 197.5 112.5t86.5 226.5z" />
+<glyph unicode="&#x2a8;" horiz-adv-x="1537" d="M1486 275q0 -123 -115.5 -211t-241.5 -88q-44 0 -86 8l-47 -74q-20 -38 -63 -112q-9 -15 -23 -15q-29 0 -29 26q0 24 107 190q-179 61 -267 240q-6 -106 -59 -184.5t-152 -78.5q-132 0 -203.5 78t-71.5 211v590h-182v49q142 5 215 145q59 111 61 268h53v-394h305v-68 h-305v-594q0 -231 144 -231q101 0 131 139q13 60 13 218v74q0 201 132 350t330 149q121 0 215 -54q113 -64 113 -170t-97 -106q-42 0 -70.5 28t-28.5 70q0 94 100 99q-79 78 -229 78q-60 0 -120 -34q-168 -94 -168 -403q0 -315 182 -406q219 319 338 319t119 -106zM1432 275 q0 52 -63 52q-89 0 -288 -287q34 -10 67 -10q102 0 193 72t91 173z" />
+<glyph unicode="&#x2a9;" horiz-adv-x="1768" d="M237 6l-183 -6v66q28 -1 69 -1t64 12q34 18 34 76v702h-168v68h168v202q0 180 131 281.5t317 101.5q100 0 192 -45q113 -55 113 -144q0 -47 -34.5 -81t-81 -34t-79.5 34.5t-33 80.5q0 74 63 100q-47 43 -133 43q-141 0 -230.5 -96.5t-89.5 -238.5v-204h301l301 23v-225 q101 225 316 225q292 0 292 -316v-737q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29q158 0 158 281v743q0 267 -166 267q-130 0 -209.5 -104.5t-79.5 -238.5v-400q0 -38 10 -58 q17 -33 117 -33q17 0 38 1v-66q-199 6 -236 6t-243 -6v66q29 -1 72 -1t68.5 16.5t25.5 80.5v574q0 87 -44 108q-23 11 -122 11h-296v-704q0 -21 7 -41q15 -44 179 -44h22v-66q-81 6 -145 6h-187z" />
+<glyph unicode="&#x2aa;" horiz-adv-x="1154" d="M53 66l68 -2q98 0 98 98v1115q0 87 -44 108q-21 10 -106 10h-16v67l306 23v-1323q0 -57 16 -73q68 -65 283 -65q341 0 341 195q0 147 -223 195q-128 28 -148 33q-82 25 -134 67q-91 75 -91 183q0 134 108 204q92 59 221.5 59t212.5 -61q60 61 82 61t22 -33v-254 q0 -35 -29 -35q-23 0 -31 43l-6 60q-16 87 -81.5 132.5t-158.5 45.5t-157 -34q-81 -43 -81 -129t94 -130q48 -22 169 -46q170 -33 243 -102q91 -86 91 -204q0 -298 -444 -298q-146 0 -227 27q-89 3 -134 3t-244 -6v66z" />
+<glyph unicode="&#x2ab;" horiz-adv-x="1127" d="M53 66l68 -2q98 0 98 98v1115q0 87 -44 108q-21 10 -106 10h-16v67l306 23v-562h672q38 0 38 -28q0 -14 -18 -38l-595 -803h251q182 0 248 86q51 68 65 260h55l-38 -400h-984v66zM648 876q-169 0 -229 -65t-60 -233v-393q0 -15 1 -27l533 718h-245z" />
+<glyph unicode="&#x2ac;" horiz-adv-x="1572" d="M1092 716q-23 -40 -45 -40t-45 40l-212 373l-218 -373q-23 -40 -45 -40t-45 40l-279 490q-28 49 -141 49h-9v68q120 -8 165 -8t275 8v-68h-6q-131 0 -131 -46q0 -9 8 -23l209 -367l187 321l-37 66q-28 49 -141 49h-9v68q120 -8 165 -8t275 8v-68h-6q-131 0 -131 -46 q0 -9 8 -23l209 -367l189 324q9 15 9 30q0 40 -37 60.5t-81 21.5v68q134 -8 194 -8t152 8v-68q-113 -1 -178 -112zM1092 16q-23 -40 -45 -40t-45 40l-212 373l-218 -373q-23 -40 -45 -40t-45 40l-279 490q-28 49 -141 49h-9v68q120 -8 165 -8t275 8v-68h-6q-131 0 -131 -46 q0 -9 8 -23l209 -367l187 321l-37 66q-28 49 -141 49h-9v68q120 -8 165 -8t275 8v-68h-6q-131 0 -131 -46q0 -9 8 -23l209 -367l189 324q9 15 9 30q0 40 -37 60.5t-81 21.5v68q134 -8 194 -8t152 8v-68q-113 -1 -178 -112z" />
+<glyph unicode="&#x2ad;" horiz-adv-x="1452" d="M1312 882q0 -36 -30.5 -36t-30.5 44v312h-1050v-312q0 -44 -30.5 -44t-30.5 41v416q0 40 45 40h1082q31 0 38 -11.5t7 -33.5v-416zM1312 62q0 -36 -30.5 -36t-30.5 44v312h-1050v-312q0 -44 -30.5 -44t-30.5 41v416q0 40 45 40h1082q31 0 38 -11.5t7 -33.5v-416z" />
+<glyph unicode="&#x2ae;" horiz-adv-x="1399" d="M1033 182h-2q-41 -93 -125 -149t-184 -56q-284 0 -284 314v321q0 106 -43 187q-53 101 -149 101q-37 0 -70 -15q64 -22 64 -91q0 -39 -26.5 -65t-65.5 -26q-95 0 -95 94q0 68 60.5 108.5t132.5 40.5q141 0 236.5 -99t95.5 -240v-356q0 -227 158 -227q130 0 209.5 104.5 t79.5 238.5v400q0 39 -10 58q-18 33 -117 33q-18 0 -38 -1v66q200 -6 236.5 -6t242.5 6v-66q-30 1 -72.5 1t-68 -16.5t-25.5 -80.5v-995q0 -87 44 -108q21 -10 96 -10h26v-67l-306 -23v624z" />
+<glyph unicode="&#x2af;" horiz-adv-x="1567" d="M1567 -267q0 -84 -83 -132q-69 -40 -159 -40q-130 0 -211 99.5t-81 232.5v289h-2q-41 -93 -125 -149t-184 -56q-284 0 -284 314v321q0 106 -43 187q-53 101 -149 101q-37 0 -70 -15q64 -22 64 -91q0 -39 -26.5 -65t-65.5 -26q-95 0 -95 94q0 68 60.5 108.5t132.5 40.5 q141 0 236.5 -99t95.5 -240v-356q0 -227 158 -227q130 0 209.5 104.5t79.5 238.5v400q0 39 -10 58q-18 33 -117 33q-18 0 -38 -1v66q200 -6 236.5 -6t242.5 6v-66q-30 1 -72.5 1t-68 -16.5t-25.5 -80.5v-872q0 -281 158 -281q56 0 114 29q-74 20 -74 96q0 42 28.5 70 t70.5 28t69.5 -28t27.5 -70z" />
+<glyph unicode="&#x2b0;" horiz-adv-x="905" d="M866 579q-150 4 -188 4t-193 -4v64q33 -1 60 -1t46 7.5t19 41.5v345q0 141 -108 141q-89 0 -148 -64.5t-59 -153.5v-266q0 -24 6 -34q10 -17 77 -17q19 0 41 1v-64q-150 4 -187 4t-192 -4v64q33 -1 61.5 -1t45.5 8t17 47v741q0 56 -38 66q-8 2 -52 2h-34v64l249 17v-471 q78 112 223 112q229 0 229 -219v-334q0 -33 90 -33q16 0 35 1v-64z" />
+<glyph unicode="&#x2b1;" horiz-adv-x="905" d="M866 579q-150 4 -188 4t-193 -4v64q33 -1 60 -1t46 7.5t19 41.5v345q0 141 -108 141q-89 0 -148 -64.5t-59 -153.5v-266q0 -23 6 -34q9 -17 77 -17q18 0 41 1v-64q-150 4 -187 4t-192 -4v64q33 -1 61.5 -1t45.5 8t17 47v623q0 103 77 169t182 66q56 0 105 -28.5t49 -80.5 q0 -73 -80 -73t-80 71q0 35 31 58q-10 2 -25 2q-65 0 -99.5 -56t-34.5 -125v-207q78 112 223 112q229 0 229 -219v-334q0 -33 90 -33q16 0 35 1v-64z" />
+<glyph unicode="&#x2b2;" horiz-adv-x="461" d="M309 1437q0 -37 -28.5 -61.5t-66 -24.5t-66 25t-28.5 61t29 60.5t66 24.5t65.5 -24t28.5 -61zM309 518q0 -97 -66 -164t-163 -67q-69 0 -130.5 31.5t-61.5 93.5q0 75 83.5 75t83.5 -75q0 -41 -38 -64q28 -9 58 -9q109 0 109 176v573q0 51 -57 58q-13 2 -40 2 q-17 0 -41 -1v65l263 17v-711z" />
+<glyph unicode="&#x2b3;" horiz-adv-x="637" d="M598 1131q0 -73 -79 -73t-79 72q0 25 17 46q-85 -9 -126 -86t-41 -171v-230q0 -40 63 -47h-1q0 1 94 1v-65q-76 5 -114 5h-144h3l-151 -4v64q9 0 29 -0.5t31 -0.5q65 0 65 55v381q0 56 -39 67q-7 2 -52 2h-34v65l242 17v-121q66 120 187 120q47 0 88 -26.5t41 -70.5z" />
+<glyph unicode="&#x2b4;" horiz-adv-x="637" d="M169 563q-47 0 -88 26.5t-41 70.5q0 73 79 73t79 -72q0 -25 -17 -46q85 9 126 86t41 171v230q0 40 -63 47h1q0 -1 -94 -1v65q76 -5 114 -5h144h-3l151 4v-64q-9 0 -29 0.5t-31 0.5q-65 0 -65 -55v-381q0 -56 39 -67q7 -2 52 -2h34v-65l-242 -17v121q-66 -120 -187 -120z " />
+<glyph unicode="&#x2b5;" horiz-adv-x="768" d="M768 412q0 -62 -61.5 -93.5t-130.5 -31.5q-97 0 -162.5 66.5t-65.5 164.5v153q-66 -107 -179 -107q-47 0 -88 26.5t-41 70.5q0 73 79 73t79 -72q0 -25 -17 -46q85 9 126 86t41 171v230q0 40 -63 47h1q0 -1 -94 -1v65q76 -5 114 -5h144h-3l151 4v-64q-9 0 -29 0.5t-31 0.5 q-65 0 -65 -55v-580q0 -176 108 -176q30 0 58 9q-38 23 -38 64q0 75 83.5 75t83.5 -75z" />
+<glyph unicode="&#x2b6;" horiz-adv-x="894" d="M846 1120q0 -31 -31 -31q-22 0 -34.5 46t-50.5 46q-35 0 -68.5 -121t-110.5 -159q159 -46 159 -145q0 -87 -114 -137q-90 -40 -191 -40h-380v64q6 0 20 -0.5t41 -0.5t40 5q25 9 25 47v398q0 34 -8.5 43.5t-32.5 11.5t-85 2v64q165 -4 197 -4t180 4v-64h-41q-48 0 -59 -4 q-25 -10 -25 -47v-177h117q110 0 120 83v69q0 160 208 160q49 0 86.5 -32t37.5 -81zM492 656q65 23 65 97t-55 100q-37 17 -118 17h-107v-196q0 -27 29 -32q-4 1 73.5 1t112.5 13z" />
+<glyph unicode="&#x2b7;" horiz-adv-x="1197" d="M793 563q-28 0 -41 33l-155 381l-153 -380q-14 -34 -41.5 -34t-42.5 38l-202 503q-14 34 -49 42q-8 1 -36 1h-33v66q121 -6 158 -6l185 6v-66l-21 1h-13q-60 0 -60 -26q0 -29 150 -381l127 317q-27 67 -44.5 78t-92.5 11v66q101 -6 152 -6l178 6v-66l-21 1h-16 q-59 0 -59 -28q0 -4 158 -396q143 355 143 366q0 56 -93 58v65q127 -6 163 -6t123 7v-66q-102 -2 -135 -85l-188 -467q-13 -33 -41 -33z" />
+<glyph unicode="&#x2b8;" horiz-adv-x="882" d="M197 287q-58 0 -107.5 35t-49.5 91q0 70 77.5 70t77.5 -69q0 -47 -49 -65q21 -10 51 -10q64 0 110 57q23 29 49 84l52 109l-239 515q-16 35 -56 42q-9 1 -38 1h-35v66q102 -6 140 -6t209 6v-66l-20 1h-12q-57 0 -57 -26q0 -16 177 -386q163 352 163 360q0 51 -76 52v65 q143 -6 165.5 -6t113.5 7v-67h-3q-108 0 -147 -84l-282 -607q-79 -169 -214 -169z" />
+<glyph unicode="&#x2b9;" horiz-adv-x="448" d="M403 1316q0 -21 -11.5 -54t-72.5 -164l-138 -295h-44l31 296q14 129 26 171q35 117 131 117q78 0 78 -71z" />
+<glyph unicode="&#x2ba;" horiz-adv-x="748" d="M403 1316q0 -21 -11.5 -54t-72.5 -164l-138 -295h-44l31 296q14 129 26 171q35 117 131 117q78 0 78 -71zM703 1316q0 -21 -11.5 -54t-72.5 -164l-138 -295h-44l31 296q14 129 26 171q35 117 131 117q78 0 78 -71z" />
+<glyph unicode="&#x2bb;" horiz-adv-x="861" d="M523 1158.5q33 -32.5 33 -81.5t-33.5 -81.5t-83.5 -32.5q-69 0 -101.5 62.5t-32.5 139.5q0 204 143 324q32 27 46 27q22 0 22 -23q0 -10 -25 -32l-45 -39q-42 -43 -69 -119t-27 -141v-13q33 42 86.5 42t86.5 -32.5z" />
+<glyph unicode="&#x2bc;" horiz-adv-x="861" d="M556 1314q0 -204 -143 -324q-32 -27 -46 -27q-22 0 -22 23q0 10 25 32l45 39q42 43 69 119t27 141v13q-33 -42 -86.5 -42t-86.5 32.5t-33 81.5t33.5 81.5t83.5 32.5q69 0 101.5 -62.5t32.5 -139.5z" />
+<glyph unicode="&#x2bd;" horiz-adv-x="861" d="M522.5 1483.5q33.5 -32.5 33.5 -81.5t-33 -81.5t-86.5 -32.5t-86.5 42v-13q0 -65 27 -141t69 -119l45 -39q25 -22 25 -32q0 -23 -22 -23q-14 0 -46 27q-143 120 -143 324q0 77 32.5 139.5t101.5 62.5q50 0 83.5 -32.5z" />
+<glyph unicode="&#x2be;" horiz-adv-x="682" d="M438 1233q0 -81 -55.5 -136.5t-135.5 -55.5v70q51 0 86.5 35.5t35.5 86.5t-35.5 86.5t-86.5 35.5v69q81 0 136 -55t55 -136z" />
+<glyph unicode="&#x2bf;" horiz-adv-x="682" d="M438 1041q-80 0 -135.5 55.5t-55.5 136.5t55 136t136 55v-69q-51 0 -86.5 -35.5t-35.5 -86.5t35.5 -86.5t86.5 -35.5v-70z" />
+<glyph unicode="&#x2c0;" horiz-adv-x="682" d="M281 1555q147 0 261 -91.5t114 -225.5t-95.5 -221.5t-224.5 -102.5v-335h-131v392q37 -6 71.5 -6t84.5 22q135 59 135 246t-128 246q-46 21 -90 21q-88 0 -145 -37q59 -16 59 -71q0 -74 -83 -74t-83 74q0 81 91 126q74 37 164 37z" />
+<glyph unicode="&#x2c1;" horiz-adv-x="682" d="M656 1392q0 -74 -82.5 -74t-82.5 74q0 55 58 71q-57 37 -145 37q-44 0 -90 -21q-128 -59 -128 -246t135 -246q50 -22 85 -22t72 6v-392h-131v335q-129 15 -225 102.5t-96 221.5t114.5 225.5t261.5 91.5q90 0 163 -37q91 -45 91 -126z" />
+<glyph unicode="&#x2c2;" horiz-adv-x="1155" d="M1115 187l-1076 470v49l1076 466v-87l-926 -402l926 -406v-90z" />
+<glyph unicode="&#x2c3;" horiz-adv-x="1155" d="M1113 653l-1076 -466v86l927 402l-927 406v91l1076 -470v-49z" />
+<glyph unicode="&#x2c4;" horiz-adv-x="1155" d="M1068 142h-90l-406 926l-402 -926h-87l466 1076h49z" />
+<glyph unicode="&#x2c5;" horiz-adv-x="1155" d="M1068 1218l-470 -1076h-49l-466 1076h87l402 -926l406 926h90z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="682" d="M623 1054h-31l-273 213l-229 -213h-30l189 331h184z" />
+<glyph unicode="&#x2c7;" horiz-adv-x="682" d="M623 1385l-189 -331h-184l-190 331h31l273 -212l229 212h30z" />
+<glyph unicode="&#x2c8;" horiz-adv-x="682" d="M392 1088h-103v332h103v-332z" />
+<glyph unicode="&#x2c9;" horiz-adv-x="682" d="M661 1225h-638v128h638v-128z" />
+<glyph unicode="&#x2ca;" horiz-adv-x="682" d="M565 1390l-295 -345h-34l105 345h224z" />
+<glyph unicode="&#x2cb;" horiz-adv-x="682" d="M447 1045h-35l-294 345h223z" />
+<glyph unicode="&#x2cc;" horiz-adv-x="682" d="M392 -420h-103v332h103v-332z" />
+<glyph unicode="&#x2cd;" horiz-adv-x="682" d="M653 -278h-624v128h624v-128z" />
+<glyph unicode="&#x2ce;" horiz-adv-x="682" d="M447 -438h-35l-294 345h223z" />
+<glyph unicode="&#x2cf;" horiz-adv-x="682" d="M565 -93l-295 -345h-34l105 345h224z" />
+<glyph unicode="&#x2d0;" horiz-adv-x="569" d="M387 929l-90 -205h-25l-90 205h205zM387 0h-205l90 205h25z" />
+<glyph unicode="&#x2d1;" horiz-adv-x="569" d="M387 929l-90 -205h-25l-90 205h205z" />
+<glyph unicode="&#x2d2;" horiz-adv-x="682" d="M438 292q0 -81 -55.5 -136.5t-135.5 -55.5v70q51 0 86.5 35.5t35.5 86.5t-35.5 86.5t-86.5 35.5v69q81 0 136 -55t55 -136z" />
+<glyph unicode="&#x2d3;" horiz-adv-x="682" d="M438 100q-80 0 -135.5 55.5t-55.5 136.5t55 136t136 55v-69q-51 0 -86.5 -35.5t-35.5 -86.5t35.5 -86.5t86.5 -35.5v-70z" />
+<glyph unicode="&#x2d4;" horiz-adv-x="682" d="M515 178h-349v103h123v229h103v-229h123v-103z" />
+<glyph unicode="&#x2d5;" horiz-adv-x="682" d="M515 407h-123v-229h-103v229h-123v103h349v-103z" />
+<glyph unicode="&#x2d6;" horiz-adv-x="682" d="M515 293h-123v-115h-103v115h-123v103h123v114h103v-114h123v-103z" />
+<glyph unicode="&#x2d7;" horiz-adv-x="682" d="M653 323h-624v149h624v-149z" />
+<glyph unicode="&#x2d8;" horiz-adv-x="682" d="M341 1078q-118 0 -197 80.5t-89 199.5h31q33 -60 76 -86q73 -43 181 -43t180 42q51 30 71 87h33q-9 -119 -88.5 -199.5t-197.5 -80.5z" />
+<glyph unicode="&#x2d9;" horiz-adv-x="682" d="M451 1228q0 -45 -32 -77t-77 -32t-77 32t-32 77.5t31.5 77t77 31.5t77.5 -32t32 -77z" />
+<glyph unicode="&#x2da;" horiz-adv-x="682" d="M477 1368.5q56 -55.5 56 -136t-55.5 -136t-136 -55.5t-136 56t-55.5 136t55.5 135.5t135.5 55.5t136 -55.5zM463 1233q0 51 -35.5 86.5t-86.5 35.5t-86.5 -35.5t-35.5 -86.5t35.5 -86.5t86.5 -35.5t86.5 35.5t35.5 86.5z" />
+<glyph unicode="&#x2db;" horiz-adv-x="682" d="M366 -339q-90 -90 -171 -90t-125 47q-40 43 -40 103v8q5 129 193 277l69 54h35l-57 -62q-108 -116 -111 -212v-7q0 -47 26 -80q28 -35 75.5 -35t90.5 26z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="682" d="M471 1093q-79 0 -182 70.5t-143 70.5t-64 -36q-11 -17 -28 -101h-32q8 259 188 259q41 0 70 -11t124 -69.5t131 -58.5q72 0 95 139h31v-7q0 -162 -96 -225q-47 -31 -94 -31z" />
+<glyph unicode="&#x2dd;" horiz-adv-x="682" d="M644 1390l-218 -346h-34l65 346h187zM331 1390l-220 -346h-33l66 346h187z" />
+<glyph unicode="&#x2de;" horiz-adv-x="682" d="M273 407q-37 0 -72 15q-132 56 -132 274v10q-28 -21 -69 -37l-17 43q85 24 92 87l38 -7q9 -191 137 -243q30 -12 62 -12q83 0 150 78l21 -48q-25 -68 -83 -114t-127 -46z" />
+<glyph unicode="&#x2df;" horiz-adv-x="782" d="M737 826l-96 -96l-250 251l-250 -251l-96 96l251 250l-251 250l96 96l250 -251l250 251l96 -96l-251 -250z" />
+<glyph unicode="&#x2e0;" horiz-adv-x="882" d="M843 1147q-93 0 -149 -89l-183 -289q139 -222 139 -310t-59.5 -131t-138.5 -43t-137.5 36t-58.5 102.5t53 156.5q18 31 93 138l-233 382q-22 36 -47 42q-21 5 -66 5h-16v66q101 -6 165 -6l184 6v-66l-19 1h-16q-56 0 -56 -26q0 -10 180 -299l154 245q9 14 9 28 q0 50 -77 51v66q110 -6 149.5 -6t129.5 7v-67zM533 429q0 67 -97 229q-103 -149 -103 -219q0 -46 34 -72t82 -26q84 0 84 88z" />
+<glyph unicode="&#x2e1;" horiz-adv-x="454" d="M415 579q-166 4 -195.5 4t-179.5 -4v64q8 0 29 -0.5t32 -0.5q63 0 63 55v741q0 56 -38 66q-8 2 -86 2v64l249 17v-890q0 -31 9 -40q13 -14 98 -14h19v-64z" />
+<glyph unicode="&#x2e2;" horiz-adv-x="623" d="M505 614.5q-78 -51.5 -185 -51.5t-181 58q-53 -58 -73 -58q-26 0 -26 32v214q0 31 30 31q24 0 32 -30q27 -97 74 -146t140 -49q170 0 170 120q0 88 -159 119q-97 19 -112 23q-63 16 -103 46q-72 53 -72 129q0 97 89 146q71 39 167 39t159 -38q41 38 61 38q28 0 28 -32 v-169q0 -33 -32 -33q-23 0 -31 29q-4 24 -7 48q-22 110 -169 110q-169 0 -169 -98q0 -53 72 -80q31 -12 139.5 -30.5t164.5 -66.5q71 -60 71 -154.5t-78 -146z" />
+<glyph unicode="&#x2e3;" horiz-adv-x="906" d="M867 578q-86 5 -150 5t-197 -4v64q58 2 58 26q0 5 -147 174q-133 -134 -133 -165.5t47 -35.5v-63q-106 4 -168.5 4t-136.5 -5v65q116 0 204 77q8 7 148 168l-154 177q-54 62 -78.5 72t-112.5 10v66q92 -6 133.5 -6t212.5 6v-65q-56 -1 -56 -25q0 -13 128 -155 q115 127 115 146q0 32 -47 34v65q91 -6 154 -6t151 6v-65q-114 -2 -194 -69q-16 -14 -141 -156l209 -239q36 -41 150 -41h5v-65z" />
+<glyph unicode="&#x2e4;" horiz-adv-x="682" d="M656 1392q0 -74 -82.5 -74t-82.5 74q0 55 58 71q-57 37 -145 37q-44 0 -90 -21q-128 -59 -128 -246t135 -246q50 -22 85 -22t72 6v-274q0 -39 17 -47t47 -8t60 1v-64q-154 4 -192 4t-187 -4v65q32 -2 60 -2t41 6q23 9 23 45v221q-129 15 -225 102.5t-96 221.5 t114.5 225.5t261.5 91.5q90 0 163 -37q91 -45 91 -126z" />
+<glyph unicode="&#x2e5;" horiz-adv-x="784" d="M634 0h-156v1310h-328v156h484v-1466z" />
+<glyph unicode="&#x2e6;" horiz-adv-x="784" d="M634 0h-156v982h-328v156h328v328h156v-1466z" />
+<glyph unicode="&#x2e7;" horiz-adv-x="784" d="M634 0h-156v655h-328v156h328v655h156v-1466z" />
+<glyph unicode="&#x2e8;" horiz-adv-x="784" d="M634 0h-156v328h-328v156h328v982h156v-1466z" />
+<glyph unicode="&#x2e9;" horiz-adv-x="784" d="M634 0h-484v156h328v1310h156v-1466z" />
+<glyph unicode="&#x2ea;" horiz-adv-x="682" d="M585 0h-487v880h94v-786h393v-94z" />
+<glyph unicode="&#x2eb;" horiz-adv-x="682" d="M585 393h-393v-393h-94v880h94v-393h393v-94z" />
+<glyph unicode="&#x2ec;" horiz-adv-x="682" d="M623 -107l-189 -331h-184l-190 331h31l253 -212l249 212h30z" />
+<glyph unicode="&#x2ed;" horiz-adv-x="682" d="M661 1005h-638v128h638v-128zM661 1225h-638v128h638v-128z" />
+<glyph unicode="&#x2ee;" horiz-adv-x="909" d="M851 1185q0 -114 -72.5 -195.5t-186.5 -118.5v42q164 85 164 205q0 62 -32 62q-11 0 -36 -8t-39 -8q-42 0 -72 31.5t-30 78t38 80t90 33.5q77 0 126.5 -61.5t49.5 -140.5zM372 1186q0 -234 -257 -315v42q81 45 122.5 91t41.5 111t-34 65q-11 0 -36.5 -8t-39.5 -8 q-43 0 -72.5 30t-29.5 77t40 81.5t92 34.5q76 0 124.5 -61.5t48.5 -139.5z" />
+<glyph unicode="&#x2ef;" horiz-adv-x="682" d="M537 -114l-122 -265h-147l-122 265h24l170 -180l172 180h25z" />
+<glyph unicode="&#x2f0;" horiz-adv-x="682" d="M537 -379h-25l-172 180l-170 -180h-24l122 265h147z" />
+<glyph unicode="&#x2f1;" horiz-adv-x="682" d="M474 -442l-265 122v147l265 122v-24l-180 -170l180 -172v-25z" />
+<glyph unicode="&#x2f2;" horiz-adv-x="682" d="M474 -320l-265 -122v25l180 172l-180 170v24l265 -122v-147z" />
+<glyph unicode="&#x2f3;" horiz-adv-x="682" d="M479 -110q55 -55 55 -136.5t-55 -136.5t-136 -55t-136.5 55.5t-55.5 136.5t55 136t136.5 55t136.5 -55zM428.5 -332.5q35.5 35.5 35.5 87t-35 86.5t-86.5 35t-87 -35.5t-35.5 -86t36 -86.5t86.5 -36t86 35.5z" />
+<glyph unicode="&#x2f4;" horiz-adv-x="682" d="M447 178h-35l-294 345h223z" />
+<glyph unicode="&#x2f5;" horiz-adv-x="682" d="M644 178h-33l-220 346h187zM330 178h-34l-218 346h187z" />
+<glyph unicode="&#x2f6;" horiz-adv-x="682" d="M644 524l-218 -346h-34l65 346h187zM331 524l-220 -346h-33l66 346h187z" />
+<glyph unicode="&#x2f7;" horiz-adv-x="682" d="M470 -387q-79 0 -182 70.5t-143 70.5t-64 -36q-11 -17 -28 -101h-32q8 259 188 259q41 0 69 -11t124.5 -69.5t131.5 -58.5q72 0 95 139h31v-7q0 -162 -96 -225q-47 -31 -94 -31z" />
+<glyph unicode="&#x2f8;" horiz-adv-x="569" d="M368 1355q32 -32 32 -78.5t-32.5 -79t-78 -32.5t-78.5 33t-33 78.5t32.5 78t79 32.5t78.5 -32zM366.5 605.5q32.5 -32.5 32.5 -79t-33 -79t-78.5 -32.5t-78.5 33t-33 78.5t32.5 78.5t79 33t79 -32.5z" />
+<glyph unicode="&#x2f9;" horiz-adv-x="682" d="M518 1253h-246v-229h-103v332h349v-103z" />
+<glyph unicode="&#x2fa;" horiz-adv-x="682" d="M518 1024h-103v229h-246v103h349v-332z" />
+<glyph unicode="&#x2fb;" horiz-adv-x="682" d="M518 -420h-349v332h103v-229h246v-103z" />
+<glyph unicode="&#x2fc;" horiz-adv-x="682" d="M518 -420h-349v103h246v229h103v-332z" />
+<glyph unicode="&#x2fd;" horiz-adv-x="814" d="M784 -420h-754v376h154v-222h446v222h154v-376z" />
+<glyph unicode="&#x2fe;" horiz-adv-x="814" d="M784 -420h-754v376h154v-222h600v-154z" />
+<glyph unicode="&#x2ff;" horiz-adv-x="682" d="M625 -177h-439l166 -243h-94l-200 283v14l200 283h94l-166 -243h439v-94z" />
+<glyph unicode="&#x300;" horiz-adv-x="0" d="M426 1476q-28 23 -28 54t23 53.5t54 22.5t53 -29l248 -322l-37 -35z" />
+<glyph unicode="&#x301;" horiz-adv-x="0" d="M753 1583.5q23 -22.5 23 -53.5t-28 -54l-313 -256l-37 35l248 322q22 29 53 29t54 -22.5z" />
+<glyph unicode="&#x302;" horiz-adv-x="0" d="M939 1339l-29 -41l-324 202l-323 -202l-28 41l351 267z" />
+<glyph unicode="&#x303;" horiz-adv-x="0" d="M832 1470q-65 -57 -119 -57t-136 49.5t-130 49.5q-79 0 -165 -99l-35 30q73 86 95 105q64 58 118 58t136.5 -50t130.5 -50q79 0 165 99l35 -31q-73 -84 -95 -104z" />
+<glyph unicode="&#x304;" horiz-adv-x="0" d="M878 1435h-582v82h582v-82z" />
+<glyph unicode="&#x305;" horiz-adv-x="0" d="M1099 1445q0 -41 -37 -41h-948q-39 0 -39 41t39 41h948q37 0 37 -41z" />
+<glyph unicode="&#x306;" horiz-adv-x="0" d="M587 1333q-111 0 -193 78t-105 195h49q24 -86 92 -140.5t157 -54.5t157.5 54.5t92.5 140.5h48q-23 -117 -105 -195t-193 -78z" />
+<glyph unicode="&#x307;" horiz-adv-x="0" d="M666 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32z" />
+<glyph unicode="&#x308;" horiz-adv-x="0" d="M440 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32zM892 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32z" />
+<glyph unicode="&#x30a;" horiz-adv-x="0" d="M708 1557q50 -49 50 -120.5t-49.5 -122t-120.5 -50.5t-121.5 51.5t-50.5 120.5t51 119.5t121 50.5t120 -49zM666 1356.5q32 32.5 32 79t-32 78.5t-77.5 32t-79 -33t-33.5 -77.5t33 -78t79 -33.5t78 32.5z" />
+<glyph unicode="&#x30b;" horiz-adv-x="0" d="M922.5 1586.5q22.5 -19.5 22.5 -42.5t-24 -56l-182 -248q-14 7 -41 23l107 286q21 57 67 57q28 0 50.5 -19.5zM592 1586.5q22 -19.5 22 -43t-23 -55.5l-181 -248q-14 7 -41 23l106 286q21 57 67 57q28 0 50 -19.5z" />
+<glyph unicode="&#x30c;" horiz-adv-x="0" d="M939 1565l-351 -267l-353 267l29 41l324 -202l322 202z" />
+<glyph unicode="&#x30f;" horiz-adv-x="0" d="M603 1488q-24 33 -24 56t22.5 42.5t50.5 19.5q46 0 67 -57l106 -286q-10 -8 -41 -23zM272 1488q-23 31 -23 55t22 43.5t50 19.5q46 0 67 -57l107 -286q-10 -7 -41 -23z" />
+<glyph unicode="&#x310;" horiz-adv-x="0" d="M695 1497q0 -44 -32 -76t-76 -32t-76.5 32t-32.5 76t32.5 76.5t76.5 32.5t76 -32.5t32 -76.5zM587 1149q-113 0 -194 79t-104 194h49q24 -86 92.5 -140.5t156.5 -54.5t156.5 54.5t92.5 140.5h49q-23 -115 -104 -194t-194 -79z" />
+<glyph unicode="&#x311;" horiz-adv-x="0" d="M587 1528q-88 0 -156.5 -54.5t-92.5 -140.5h-49q23 115 104 194t194 79t194 -79t104 -194h-49q-24 86 -92.5 140.5t-156.5 54.5z" />
+<glyph unicode="&#x312;" horiz-adv-x="0" d="M769 1579q0 -13 -34 -23t-61 -17q-129 -47 -157 -177q28 21 71 21t78 -32t35 -79.5t-32 -82t-86 -34.5t-86 42t-32 104q0 107 67 189t172 109q27 7 43 7q22 0 22 -27z" />
+<glyph unicode="&#x317;" horiz-adv-x="0" d="M723 -78.5q23 -22.5 23 -53.5t-28 -54l-313 -256l-37 35l248 322q22 29 53 29t54 -22.5z" />
+<glyph unicode="&#x323;" horiz-adv-x="0" d="M666 -226q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32z" />
+<glyph unicode="&#x326;" horiz-adv-x="0" d="M706 -166q0 -97 -60.5 -171t-155.5 -99q-22 -6 -40 -6q-22 0 -22 26q0 13 31 22l56 16q112 40 139 153q-25 -16 -62.5 -16t-70 29t-32.5 72.5t29.5 75.5t79 32t79 -38.5t29.5 -95.5z" />
+<glyph unicode="&#x327;" horiz-adv-x="0" d="M819 -185q0 -161 -376 -161h-88v43q327 0 327 118q0 56 -42 87t-101 32v127h96v-95q70 -11 127 -49.5t57 -101.5z" />
+<glyph unicode="&#x328;" horiz-adv-x="0" d="M518 -367q-68 0 -127 41t-59 108t71 126q41 35 145.5 91t136.5 87l20 -35l-135 -115q-92 -83 -92 -138q0 -34 31.5 -54.5t67.5 -20.5q97 0 158 108l37 -27q-98 -171 -254 -171z" />
+<glyph unicode="&#x32c;" horiz-adv-x="0" d="M939 -175l-351 -267l-353 267l29 41l324 -202l322 202z" />
+<glyph unicode="&#x32d;" horiz-adv-x="0" d="M939 -401l-29 -41l-324 202l-323 -202l-28 41l351 267z" />
+<glyph unicode="&#x32e;" horiz-adv-x="0" d="M587 -442q-111 0 -193 78t-105 195h49q24 -86 92 -140.5t157 -54.5t157.5 54.5t92.5 140.5h48q-23 -117 -105 -195t-193 -78z" />
+<glyph unicode="&#x330;" horiz-adv-x="0" d="M832 -350q-65 -57 -119 -57t-136 49.5t-130 49.5q-79 0 -165 -99l-35 30q73 86 95 105q64 58 118 58t136.5 -50t130.5 -50q79 0 165 99l35 -31q-73 -84 -95 -104z" />
+<glyph unicode="&#x333;" horiz-adv-x="0" d="M1099 -391q0 -41 -37 -41h-948q-39 0 -39 41t39 41h948q37 0 37 -41zM1099 -171q0 -41 -37 -41h-948q-39 0 -39 41t39 41h948q37 0 37 -41z" />
+<glyph unicode="&#x334;" horiz-adv-x="0" d="M1079 659q0 -111 -71.5 -195t-175.5 -84t-251.5 116.5t-233.5 116.5q-138 0 -179 -131q-6 -29 -15.5 -65t-27.5 -36q-30 0 -30 57q0 109 72.5 193.5t176.5 84.5t251 -117t236.5 -117t136.5 60q27 35 46 104t37 69q28 0 28 -56z" />
+<glyph unicode="&#x335;" horiz-adv-x="0" d="M1012 582q0 -41 -37 -41h-774q-39 0 -39 41t39 41h774q37 0 37 -41z" />
+<glyph unicode="&#x336;" horiz-adv-x="0" d="M2049 582q0 -41 -37 -41h-1674q-39 0 -39 41t39 41h1674q37 0 37 -41z" />
+<glyph unicode="&#x337;" horiz-adv-x="0" d="M854 1205q0 -7 -2 -13l-453 -1248q-9 -26 -40 -26q-39 0 -39 41q0 7 2 13l453 1248q9 26 40 26q39 0 39 -41z" />
+<glyph unicode="&#x338;" horiz-adv-x="0" d="M964 1505q0 -8 -2 -13l-673 -1848q-9 -26 -40 -26q-39 0 -39 41q0 8 2 13l673 1848q9 26 40 26q39 0 39 -41z" />
+<glyph unicode="&#x33f;" horiz-adv-x="0" d="M1099 1335q0 -41 -37 -41h-948q-39 0 -39 41t39 41h948q37 0 37 -41zM1099 1555q0 -41 -37 -41h-948q-39 0 -39 41t39 41h948q37 0 37 -41z" />
+<glyph unicode="&#x346;" horiz-adv-x="0" d="M878 1354h-81v100h-419v-100h-82v182h582v-182z" />
+<glyph unicode="&#x34d;" horiz-adv-x="0" d="M1117 -241q0 -18 -43 -41q-117 -62 -179 -127q-32 -33 -48 -33q-31 0 -31 32.5t128 129.5h-714q128 -97 128 -129.5t-31 -32.5q-16 0 -48 33q-62 65 -179 127q-43 23 -43 41t43 41q117 62 179 127q32 33 48 33q31 0 31 -32.5t-128 -129.5h714q-128 97 -128 129.5t31 32.5 q16 0 48 -33q62 -65 179 -127q43 -23 43 -41z" />
+<glyph unicode="&#x34f;" horiz-adv-x="0" />
+<glyph unicode="&#x359;" horiz-adv-x="0" d="M775 -313q0 -47 -43 -47q-14 0 -23 8l-102 86l23 -136q0 -40 -43 -40t-43 40v3l23 133l-102 -86q-9 -8 -22 -8q-44 0 -44 47q0 27 23 35l126 46l-126 47q-23 9 -23 35q0 47 44 47q13 0 22 -8l102 -86l-23 136q0 40 43 40t43 -40v-2l-23 -134l102 86q9 8 23 8q43 0 43 -47 q0 -27 -22 -35l-126 -47l126 -46q22 -8 22 -35z" />
+<glyph unicode="&#x35c;" horiz-adv-x="0" d="M2088 -121q0 -15 -15 -28q-174 -145 -413.5 -219t-485.5 -74t-485.5 74t-413.5 219q-15 13 -15 28q0 41 41 41q25 0 77 -30l95 -57q295 -160 701 -160t701 160l95 57q52 30 77 30q41 0 41 -41z" />
+<glyph unicode="&#x35d;" horiz-adv-x="0" d="M2088 1565q0 -15 -15 -28q-174 -145 -413.5 -219t-485.5 -74t-485.5 74t-413.5 219q-15 13 -15 28q0 41 41 41q25 0 77 -30l95 -57q295 -160 701 -160t701 160l95 57q52 30 77 30q41 0 41 -41z" />
+<glyph unicode="&#x35e;" horiz-adv-x="0" d="M2046 1445q0 -41 -37 -41h-1668q-39 0 -39 41t39 41h1668q37 0 37 -41z" />
+<glyph unicode="&#x35f;" horiz-adv-x="0" d="M2057 -377h-1766v92h1766v-92z" />
+<glyph unicode="&#x360;" horiz-adv-x="0" d="M2033 1606q26 0 26 -34t-37 -104q-117 -223 -382 -223q-169 0 -484 111.5t-489.5 111.5t-264.5 -118q-7 -9 -53 -102q-12 -24 -34 -24q-26 0 -26 34t37 104q117 223 382 223q169 0 484.5 -111t489.5 -111t264 117q7 9 53 102q12 24 34 24z" />
+<glyph unicode="&#x361;" horiz-adv-x="0" d="M2088 1285q0 -41 -41 -41q-25 0 -77 30l-95 57q-295 160 -701 160t-701 -160l-95 -57q-52 -30 -77 -30q-41 0 -41 41q0 15 15 28q174 145 413.5 219t485.5 74t485.5 -74t413.5 -219q15 -13 15 -28z" />
+<glyph unicode="&#x362;" horiz-adv-x="0" d="M291 -357v92l1528 9v76l238 -125v-12l-238 -125v76l13 9h-1541z" />
+<glyph unicode="&#x370;" horiz-adv-x="1153" d="M649 1284l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-477h375q134 0 173.5 46.5t39.5 182.5h54v-521h-54q0 136 -40 183t-173 47h-375v-525q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064 q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62z" />
+<glyph unicode="&#x371;" horiz-adv-x="849" d="M797 431h-446v-431h-141v739q0 86 -41 106q-20 11 -103 11h-14v67l299 23v-415h446v-100z" />
+<glyph unicode="&#x372;" horiz-adv-x="1511" d="M943 1271q-100 0 -100 -79v-1052q0 -53 40 -70q24 -11 64.5 -11t79.5 1v-61q-68 6 -113 6h-317q-45 0 -113 -6v61q39 -1 79.5 -1t64.5 11q40 17 40 70v1052q0 79 -100 79q-240 0 -332 -187q-53 -108 -80 -398h-76l42 657h1267l42 -657h-76q-27 290 -80 398 q-92 187 -332 187z" />
+<glyph unicode="&#x373;" horiz-adv-x="1122" d="M1073 630h-45q-6 76 -48.5 129.5t-115.5 53.5h-229v-813h-148v813h-229q-73 0 -115.5 -53.5t-48.5 -129.5h-45v35q0 95 72.5 176.5t166.5 81.5h546q94 0 166.5 -81.5t72.5 -176.5v-35z" />
+<glyph unicode="&#x374;" horiz-adv-x="506" d="M409 1490.5q27 -23.5 27 -49t-8 -44.5l-285 -664q-4 -10 -12 -10q-50 0 -50 33q0 5 2 12l187 684q17 62 77 62q35 0 62 -23.5z" />
+<glyph unicode="&#x375;" horiz-adv-x="506" d="M425 321q0 -5 -2 -12l-187 -684q-17 -62 -77 -62q-35 0 -62 23.5t-27 49t8 44.5l285 664q4 10 12 10q50 0 50 -33z" />
+<glyph unicode="&#x376;" horiz-adv-x="1631" d="M1564 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61q-71 6 -113 6h-361q-36 0 -107 -6v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v964l-734 -1008l1 -1q14 -30 90 -35q3 0 30 -0.5t77 0.5v-61q-71 6 -115 6h-358 q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-967l734 1009q-15 37 -149 37h-46v62q70 -6 112 -6h356q43 0 113 6v-62z" />
+<glyph unicode="&#x377;" horiz-adv-x="1123" d="M870 347v390l-519 -677v-60h-141v739q0 86 -41 106q-20 11 -103 11h-14v67l299 23v-760l565 737h102v-600q0 -140 40 -323h-148q-40 135 -40 347z" />
+<glyph unicode="&#x378;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x379;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x37a;" horiz-adv-x="982" d="M388 -359q0 -83 -89 -83t-89 81q0 14 3 27l55 242q6 26 30.5 26t30.5 -26l56 -242q3 -13 3 -25z" />
+<glyph unicode="&#x37b;" horiz-adv-x="920" d="M406 960q198 0 330 -149t132 -347.5t-132.5 -343t-326.5 -144.5q-223 0 -329 203q-27 52 -27 74.5t29 22.5q19 0 53 -72.5t74 -109.5q68 -64 181 -64q60 0 123 34q178 96 178 404t-168 403q-60 34 -120 34q-85 0 -128 -56q-4 -6 -52 -105q-27 -56 -74 -56q-81 0 -81 83 t131 141q108 48 207 48z" />
+<glyph unicode="&#x37c;" horiz-adv-x="920" d="M839 276q29 0 29 -22.5t-27 -74.5q-106 -203 -329 -203q-194 0 -326.5 144.5t-132.5 343t132 347.5t330 149q99 0 207 -48q131 -58 131 -141t-81 -83q-47 0 -74 56q-48 99 -52 105q-43 56 -128 56q-60 0 -120 -34q-168 -95 -168 -403t178 -404q63 -34 123 -34 q113 0 181 64q40 37 74 109.5t53 72.5zM620 466q0 -46 -32 -78t-78 -32t-78 32t-32 78t32 78t78 32t78 -32t32 -78z" />
+<glyph unicode="&#x37d;" horiz-adv-x="920" d="M406 960q198 0 330 -149t132 -347.5t-132.5 -343t-326.5 -144.5q-223 0 -329 203q-27 52 -27 74.5t29 22.5q19 0 53 -72.5t74 -109.5q68 -64 181 -64q60 0 123 34q178 96 178 404t-168 403q-60 34 -120 34q-85 0 -128 -56q-4 -6 -52 -105q-27 -56 -74 -56q-81 0 -81 83 t131 141q108 48 207 48zM521 466q0 -46 -32 -78t-78 -32t-78 32t-32 78t32 78t78 32t78 -32t32 -78z" />
+<glyph unicode="&#x37e;" horiz-adv-x="536" d="M334.5 801q30.5 -31 30.5 -72.5t-30.5 -71.5t-72 -30t-72 30t-30.5 71.5t30.5 72.5t72 31t72 -31zM263 204q107 0 107 -203.5t-124 -343.5q-25 -29 -36 -29q-19 0 -19 21q0 9 13 26q124 152 123 347q-15 -15 -49 -20q-3 -2 -11 -2q-107 0 -107 102q0 44 29 73t74 29z" />
+<glyph unicode="&#x37f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x380;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x381;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x382;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x383;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x384;" horiz-adv-x="564" d="M408 1457q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x385;" horiz-adv-x="574" d="M484 1561q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45zM574 1233q0 -42 -29.5 -72t-71 -30t-71 30.5t-29.5 71t30 70.5t71 30t70.5 -29t29.5 -71zM202 1233q0 -42 -29.5 -72t-71 -30t-71.5 30.5t-30 71t30.5 70.5 t71.5 30t70.5 -29t29.5 -71z" />
+<glyph unicode="&#x386;" horiz-adv-x="1484" d="M1417 0q-127 6 -297.5 6t-244.5 -6v61h5q157 0 157 59q0 29 -39 136l-70 192h-487l-61 -163q-34 -90 -34 -123q0 -51 52 -78q42 -23 97 -23v-61q-189 6 -239.5 6t-187.5 -6v61q174 2 219 133l409 1177q14 40 46 40t46 -40l425 -1231q21 -61 84 -75q19 -5 77 -5q19 0 43 1 v-61zM906 510l-222 641l-220 -641h442zM318 1324q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x387;" horiz-adv-x="547" d="M378 837q0 -42 -31 -73t-73.5 -31t-73.5 31t-31 73t31 73t73.5 31t73.5 -31t31 -73z" />
+<glyph unicode="&#x388;" horiz-adv-x="1797" d="M511 0v61q47 -1 53 -1q125 0 142 38q7 16 7 48v1053q0 30 -7 47q-15 36 -152 36q-20 0 -43 -1v62h1108l56 -442h-49q-24 218 -99.5 299t-288.5 81h-263q-54 0 -71 -13.5t-17 -65.5v-474h178q134 0 173.5 46.5t39.5 182.5h51v-521h-51q0 136 -40 183t-173 47h-178v-526 q0 -52 17 -65.5t71 -13.5h273q236 0 326 111q67 84 107 336h49l-84 -508h-1135zM271 1324q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x389;" horiz-adv-x="1923" d="M1856 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61q-71 6 -113 6h-361q-36 0 -107 -6v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v530h-590v-530q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61 q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-474h590v474q0 29 -8 45q-17 34 -148 34h-46v62q70 -6 112 -6h356q43 0 113 6v-62zM271 1324 q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x38a;" horiz-adv-x="1179" d="M1113 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62zM271 1324 q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x38b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x38c;" horiz-adv-x="1788" d="M1065 -43q-280 0 -467 214t-187 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503t-187.5 -499t-467.5 -213.5zM1518 696q0 438 -260 590q-92 54 -192 54t-191 -53q-262 -153 -262 -591q0 -469 265 -632q91 -56 185 -56t188 55q267 156 267 633zM271 1324q0 -20 -17 -48 l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x38d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x38e;" horiz-adv-x="1868" d="M1800 1068q0 -33 -31 -33q-23 0 -31 30q-4 24 -9 48q-16 49 -72.5 77.5t-112.5 28.5q-171 0 -252 -200q-59 -145 -59 -346v-529q0 -29 7 -44q19 -40 190 -40q26 0 55 1v-61q-76 6 -159 6h-362q-83 0 -159 -6v61l75 -1q147 0 170 41q8 14 8 42v530q0 201 -59 347 q-82 199 -253 199q-55 0 -108.5 -26.5t-70.5 -73.5q-6 -26 -14.5 -55t-31.5 -29q-30 0 -30 33q0 116 72 209t185 93q174 0 282 -159q84 -124 115 -319h2q30 194 115 319q108 159 280 159q113 0 185.5 -93t72.5 -209zM271 1324q0 -20 -17 -48l-144 -237q-25 -41 -51 -41 t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x38f;" horiz-adv-x="1725" d="M1266 0q-25 0 -31.5 7t-6.5 33q0 150 101 429t101 429q0 186 -107 317t-289 131t-289 -131t-107 -317q0 -150 101 -429t101 -429q0 -40 -39 -40h-326l-64 320h48q17 -115 35.5 -146t36 -38.5t58.5 -7.5h194q-27 111 -120 256q-144 223 -153 240q-76 141 -76 272 q0 221 194 364q177 130 406 130t405 -130q194 -143 194 -364q0 -131 -76 -272q-9 -18 -153 -240q-93 -145 -120 -256h195q41 0 58 7.5t35.5 38t35.5 146.5h49l-64 -320h-327zM271 1324q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36 q70 0 70 -45z" />
+<glyph unicode="&#x390;" horiz-adv-x="748" d="M695 266q0 -114 -48 -194q-58 -96 -164 -96q-133 0 -203 78t-70 212v473q0 86 -41 106q-20 11 -103 11h-14v67l299 23v-685q0 -231 148 -231q102 0 131 139q12 56 12 182v37h53v-122zM484 1561q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278 q13 36 60 36q70 0 70 -45zM574 1233q0 -42 -29.5 -72t-71 -30t-71 30.5t-29.5 71t30 70.5t71 30t70.5 -29t29.5 -71zM202 1233q0 -42 -29.5 -72t-71 -30t-71.5 30.5t-30 71t30.5 70.5t71.5 30t70.5 -29t29.5 -71z" />
+<glyph unicode="&#x391;" horiz-adv-x="1484" d="M1417 0q-127 6 -297.5 6t-244.5 -6v61h5q157 0 157 59q0 29 -39 136l-70 192h-487l-61 -163q-34 -90 -34 -123q0 -51 52 -78q42 -23 97 -23v-61q-189 6 -239.5 6t-187.5 -6v61q174 2 219 133l409 1177q14 40 46 40t46 -40l425 -1231q21 -61 84 -75q19 -5 77 -5q19 0 43 1 v-61zM906 510l-222 641l-220 -641h442z" />
+<glyph unicode="&#x392;" horiz-adv-x="1346" d="M1278 360q0 -161 -135.5 -260.5t-302.5 -99.5h-772v61q62 -2 63 -2q113 0 134 45q5 11 5 42v1051q0 31 -5 42q-19 43 -152 43q-21 0 -45 -1v62h720q161 0 290 -83q148 -95 148 -247q0 -120 -98.5 -203t-227.5 -108q147 -16 262.5 -109t115.5 -233zM720 721 q129 0 221.5 82t92.5 202.5t-73 198t-186 77.5h-255q-53 0 -69.5 -13t-16.5 -66v-481h286zM994 147q88 86 88 214t-76.5 222t-200.5 94h-371v-537q0 -53 16.5 -66t69.5 -13h257q129 0 217 86z" />
+<glyph unicode="&#x393;" horiz-adv-x="1216" d="M744 1281h-214q-51 0 -68.5 -13t-17.5 -66v-1065q0 -22 8 -39q17 -37 223 -37h22v-61q-74 6 -120 6h-382q-55 0 -127 -6v61q8 0 26 -0.5t28 -0.5q124 0 141 38q7 15 7 48v1053q0 31 -7 47q-15 35 -170 35h-25v62h1026l55 -442h-49q-24 212 -82 285q-74 95 -274 95z" />
+<glyph unicode="&#x394;" horiz-adv-x="1202" d="M1135 15q0 -15 -24 -15h-1021q-22 0 -22 11t130 377l319 898q10 30 33 89q16 36 52 36t49 -36l473 -1337q11 -31 11 -23zM918 149l-369 1046l-369 -1046h738z" />
+<glyph unicode="&#x395;" horiz-adv-x="1354" d="M68 0v61q47 -1 53 -1q125 0 142 38q7 16 7 48v1053q0 30 -7 47q-15 36 -152 36q-20 0 -43 -1v62h1108l56 -442h-49q-24 218 -99.5 299t-288.5 81h-263q-54 0 -71 -13.5t-17 -65.5v-474h178q134 0 173.5 46.5t39.5 182.5h51v-521h-51q0 136 -40 183t-173 47h-178v-526 q0 -52 17 -65.5t71 -13.5h273q236 0 326 111q67 84 107 336h49l-84 -508h-1135z" />
+<glyph unicode="&#x396;" horiz-adv-x="1128" d="M101 0q-33 0 -33 33q0 21 13 41l766 1207h-310q-206 0 -294 -87.5t-100 -293.5h-51l22 443h900q34 0 34 -32q0 -16 -14 -38l-764 -1205h324q239 0 329 114q76 95 89 344h49l-35 -526h-925z" />
+<glyph unicode="&#x397;" horiz-adv-x="1480" d="M1413 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61q-71 6 -113 6h-361q-36 0 -107 -6v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v530h-590v-530q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61 q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-474h590v474q0 29 -8 45q-17 34 -148 34h-46v62q70 -6 112 -6h356q43 0 113 6v-62z" />
+<glyph unicode="&#x398;" horiz-adv-x="1445" d="M722 -43q-280 0 -467 214t-187 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503t-187.5 -499t-467.5 -213.5zM1175 696q0 438 -260 590q-92 54 -192 54t-191 -53q-262 -153 -262 -591q0 -469 265 -632q91 -56 185 -56t188 55q267 156 267 633zM1054 532h-50v68h-564 v-68h-49v284h49v-68h564v68h50v-284z" />
+<glyph unicode="&#x399;" horiz-adv-x="736" d="M670 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62z" />
+<glyph unicode="&#x39a;" horiz-adv-x="1519" d="M649 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-636l618 588q36 34 36 67q0 61 -91 63v62q69 -6 217.5 -6t201.5 6v-62q-160 -2 -281 -118l-356 -340l456 -670q42 -62 83.5 -78.5t122.5 -16.5v-61q-127 6 -281.5 6t-225.5 -6v61h4q113 0 113 59q0 22 -31 68l-357 528 l-229 -218v-359q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-347q-43 0 -114 -6v61q8 0 26.5 -0.5t28.5 -0.5q125 0 141 40q6 15 6 44v1066q0 27 -7 41q-16 33 -176 33h-19v62q70 -6 119 -6h342q50 0 120 6v-62z" />
+<glyph unicode="&#x39b;" horiz-adv-x="1374" d="M963 6q-110 0 -182 -6v61h5q161 0 161 59q0 16 -59 199l-262 806l-296 -919q-9 -28 -9 -42q0 -51 47.5 -76.5t104.5 -26.5v-61q-183 6 -244 6t-161 -6v61h2q149 0 193 136l380 1172q14 42 45 42t45 -42l394 -1223q6 -20 25 -56q25 -29 141 -29h15v-61q-235 6 -345 6z" />
+<glyph unicode="&#x39c;" horiz-adv-x="1793" d="M1726 1281l-56 2q-125 0 -141 -41q-6 -15 -6 -45v-1058q0 -26 8 -43q17 -35 185 -35h10v-61q-75 6 -119 6h-334q-38 0 -113 -6v61h76q63 0 87 10q40 17 40 70v1140h-2l-483 -1245q-14 -36 -36 -36t-39 43l-476 1222h-2v-1064q0 -140 200 -140h3v-61q-209 6 -229 6 t-231 -6v61h3q199 0 199 140v1003q0 22 -6 38q-12 32 -89 39q-6 1 -32.5 1t-74.5 -1v62h341q45 0 61 -42l428 -1102l430 1108q14 36 49 36h349v-62z" />
+<glyph unicode="&#x39d;" horiz-adv-x="1480" d="M1209 1139v-1107q0 -32 -26 -32q-16 0 -34 26l-805 1178q-12 17 -19 25v-1028q0 -140 200 -140h3v-61q-208 6 -230 6t-230 -6v61h3q199 0 199 140v1032q0 29 -8 35q-19 13 -194 13v62h342q30 0 48 -26l696 -1019v847q0 139 -203 139v62q205 -6 231.5 -6t230.5 6v-62h-3 q-201 0 -201 -145z" />
+<glyph unicode="&#x39e;" horiz-adv-x="1282" d="M1024 1205h-765q-93 0 -110.5 -16.5t-23.5 -153.5h-47l15 308h1096l15 -308h-49q-5 137 -23 153.5t-108 16.5zM1022 524h-49v100h-664v-100h-49v338h49v-99h664v99h49v-338zM256 138h771q93 0 111.5 19.5t26.5 171.5h49l-16 -329h-1115l-15 329h48q2 -56 7 -107.5 t18 -63.5q20 -20 115 -20z" />
+<glyph unicode="&#x39f;" horiz-adv-x="1445" d="M722 -43q-280 0 -467 214t-187 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503t-187.5 -499t-467.5 -213.5zM1175 696q0 438 -260 590q-92 54 -192 54t-191 -53q-262 -153 -262 -591q0 -469 265 -632q91 -56 185 -56t188 55q267 156 267 633z" />
+<glyph unicode="&#x3a0;" horiz-adv-x="1480" d="M1300 6h-361q-36 0 -107 -6v61h78q60 0 85 11q39 17 39 69v1141h-590v-1141q0 -26 6 -41q13 -32 90 -39q6 0 33 -0.5t76 0.5v-61q-71 6 -113 6h-360q-37 0 -108 -6v61h78q60 0 85 11q39 17 39 69v1062q0 26 -6 41q-13 32 -90 38h-106v62h1345v-62q-8 0 -29 0.5t-32 0.5 q-121 0 -137 -39q-6 -14 -6 -41v-1062q0 -26 6 -41q13 -32 90 -39q5 0 32 -0.5t76 0.5v-61q-71 6 -113 6z" />
+<glyph unicode="&#x3a1;" horiz-adv-x="1295" d="M1074 1249q154 -106 154 -268t-142 -262t-307 -100h-335v-473q0 -32 7 -48q17 -37 181 -37h17v-61q-72 6 -133 6h-326q-50 0 -122 -6v61l55 -1q122 0 140 38q7 15 7 48v1051q0 32 -7 48q-16 37 -158 37q-18 0 -37 -1v62h695q174 0 311 -94zM1024 977q0 161 -75.5 232.5 t-237.5 71.5h-186q-53 0 -69.5 -13t-16.5 -66v-532h272q313 0 313 307z" />
+<glyph unicode="&#x3a2;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x3a3;" horiz-adv-x="1335" d="M106 0q-36 0 -36 22q0 9 18 32l470 596l-490 660q0 33 41 33h1103l54 -443h-47q-30 235 -137 313q-93 68 -338 68h-455l405 -532q13 -17 13 -26.5t-17 -31.5l-480 -608h529q244 0 342 69q114 81 138 314h47l-54 -466h-1106z" />
+<glyph unicode="&#x3a4;" horiz-adv-x="1413" d="M878 1282q-46 0 -65.5 -11.5t-19.5 -53.5v-1071q0 -25 10 -47q18 -38 243 -38h34v-61q-84 6 -154 6h-439q-71 0 -155 -6v61q9 0 35.5 -0.5t40.5 -0.5q184 0 202 39q8 17 8 47v1072q0 43 -29 56q-17 8 -66 8q-256 0 -321 -62.5t-86 -318.5h-48l36 442h1206l36 -442h-49 q-22 262 -88.5 321.5t-330.5 59.5z" />
+<glyph unicode="&#x3a5;" horiz-adv-x="1445" d="M1377 1068q0 -33 -31 -33q-23 0 -31 30q-4 24 -9 48q-16 49 -72.5 77.5t-112.5 28.5q-171 0 -252 -200q-59 -145 -59 -346v-529q0 -29 7 -44q19 -40 190 -40q26 0 55 1v-61q-76 6 -159 6h-362q-83 0 -159 -6v61l75 -1q147 0 170 41q8 14 8 42v530q0 201 -59 347 q-82 199 -253 199q-55 0 -108.5 -26.5t-70.5 -73.5q-6 -26 -14.5 -55t-31.5 -29q-30 0 -30 33q0 116 72 209t185 93q174 0 282 -159q84 -124 115 -319h2q30 194 115 319q108 159 280 159q113 0 185.5 -93t72.5 -209z" />
+<glyph unicode="&#x3a6;" horiz-adv-x="1394" d="M1025 1287l-82 2q-135 0 -157 -37q-14 -23 -14 -76v-81q215 -21 368 -118q186 -118 186 -304t-186 -303q-153 -97 -368 -117v-97q0 -39 7 -56q16 -40 202 -40q21 0 44 1v-61q-75 6 -154 6h-359q-80 0 -155 -6v61l81 -2q136 0 158 37q14 23 14 75v82q-210 21 -361 120 q-181 118 -181 300.5t181 300.5q152 99 361 121v99q0 37 -7 54q-16 39 -225 39h-21v62q75 -6 155 -6h359q79 0 154 6v-62zM1130 674q0 339 -358 376v-753q164 13 261 110t97 267zM610 1050q-347 -40 -347 -375.5t347 -375.5v751z" />
+<glyph unicode="&#x3a7;" horiz-adv-x="1518" d="M1450 0q-127 6 -299 6t-244 -6v61q128 5 128 59q0 10 -320 493l-281 -414q-19 -28 -19 -48q0 -43 38.5 -66t84.5 -24v-61q-74 6 -165 6t-305 -6v61q196 0 285 131l323 477l-362 547q-34 51 -99 64q-24 4 -81 4h-41v62q112 -6 292.5 -6t251.5 6v-62q-128 -5 -128 -58 q0 -13 268 -410l225 333q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62q81 -6 163.5 -6t306.5 6v-62q-198 -2 -285 -128l-271 -395l416 -629q35 -53 99 -66q25 -5 85 -5h38v-61z" />
+<glyph unicode="&#x3a8;" horiz-adv-x="1441" d="M1048 1287l-63 2q-162 0 -182 -42q-8 -17 -8 -41v-890q263 63 281 475q5 114 15 162q23 101 84 127q35 15 116.5 15t81.5 -25q0 -14 -25 -22q-108 -34 -108 -220q0 -508 -445 -563v-125q0 -22 8 -40q18 -39 208 -39h37v-61q-74 6 -143 6h-382q-69 0 -143 -6v61l83 -2 q140 0 160 40q11 22 11 51v63q-1 40 -1 52q-402 52 -432 516q-9 132 -9 136q-13 93 -53 114l-46 15q-25 9 -25 24q0 22 35 22h87q106 0 146 -92q24 -57 30 -219.5t49 -267.5q62 -156 218 -197v890q0 25 -7 42q-16 39 -225 39h-21v62q74 -6 143 -6h382q69 0 143 6v-62z" />
+<glyph unicode="&#x3a9;" horiz-adv-x="1382" d="M923 0q-25 0 -31.5 7t-6.5 33q0 150 101 429t101 429q0 186 -107 317t-289 131t-289 -131t-107 -317q0 -150 101 -429t101 -429q0 -40 -39 -40h-326l-64 320h48q17 -115 35.5 -146t36 -38.5t58.5 -7.5h194q-27 111 -120 256q-144 223 -153 240q-76 141 -76 272 q0 221 194 364q177 130 406 130t405 -130q194 -143 194 -364q0 -131 -76 -272q-9 -18 -153 -240q-93 -145 -120 -256h195q41 0 58 7.5t35.5 38t35.5 146.5h49l-64 -320h-327z" />
+<glyph unicode="&#x3aa;" horiz-adv-x="736" d="M670 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62zM257 1574 q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32zM629 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32z" />
+<glyph unicode="&#x3ab;" horiz-adv-x="1445" d="M1377 1068q0 -33 -31 -33q-23 0 -31 30q-4 24 -9 48q-16 49 -72.5 77.5t-112.5 28.5q-171 0 -252 -200q-59 -145 -59 -346v-529q0 -29 7 -44q19 -40 190 -40q26 0 55 1v-61q-76 6 -159 6h-362q-83 0 -159 -6v61l75 -1q147 0 170 41q8 14 8 42v530q0 201 -59 347 q-82 199 -253 199q-55 0 -108.5 -26.5t-70.5 -73.5q-6 -26 -14.5 -55t-31.5 -29q-30 0 -30 33q0 116 72 209t185 93q174 0 282 -159q84 -124 115 -319h2q30 194 115 319q108 159 280 159q113 0 185.5 -93t72.5 -209zM629 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5 t-33 78t33.5 77.5t79 33t77.5 -32zM1001 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32z" />
+<glyph unicode="&#x3ac;" horiz-adv-x="1228" d="M1151 187q0 -84 -47.5 -143.5t-128.5 -59.5q-139 0 -165 167q-137 -175 -301 -175q-192 0 -324 144.5t-132 340t138 340.5t334 145q92 0 169.5 -54t117.5 -140l81 194h47v-788q0 -39 21.5 -73.5t58.5 -34.5q78 0 78 171l-2 86h55v-120zM799 291v301q0 112 -76 206.5 t-178.5 94.5t-176.5 -72q-138 -134 -138 -362q0 -152 66 -280q81 -155 219 -155q104 0 194 82t90 185zM748 1457q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x3ad;" horiz-adv-x="883" d="M792 280q28 0 28 -28.5t-34 -86.5q-110 -189 -326 -189q-148 0 -260 61q-138 75 -138 211q0 99 74 161.5t179 86.5q-93 22 -154 84t-61 153q0 123 132 182q98 45 221 45t210 -28q123 -40 123 -122q0 -33 -24.5 -55.5t-60.5 -22.5t-67 47q-52 77 -61 86q-47 47 -126 47 q-202 0 -202 -194q0 -188 199 -188q22 0 63 11t63 11q86 0 86 -55.5t-87 -55.5q-21 0 -62.5 11t-62.5 11q-224 0 -224 -205q0 -228 255 -228q204 0 290 221q11 29 27 29zM628 1457q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36 q70 0 70 -45z" />
+<glyph unicode="&#x3ae;" horiz-adv-x="1098" d="M858 -81v757q0 237 -158 237q-129 0 -209 -100.5t-80 -232.5v-580h-149v778q0 39 -21 73.5t-58 34.5q-78 0 -78 -172q0 -8 2 -85h-55v120q0 84 47 143.5t130 59.5t128 -69q40 -59 40 -147q101 224 317 224q293 0 293 -317v-45q-1 -29 -1 -44v-659q0 -140 40 -323h-148 q-40 135 -40 347zM758 1457q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x3af;" horiz-adv-x="748" d="M695 266q0 -114 -48 -194q-58 -96 -164 -96q-133 0 -203 78t-70 212v473q0 86 -41 106q-20 11 -103 11h-14v67l299 23v-685q0 -231 148 -231q102 0 131 139q12 56 12 182v37h53v-122zM408 1457q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278 q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x3b0;" horiz-adv-x="1103" d="M1051 496q0 -211 -106 -357q-119 -163 -322 -163q-178 0 -269.5 100.5t-91.5 280.5v421q0 39 -21 73.5t-58 34.5q-79 0 -79 -173q0 -6 3 -84h-55v120q0 84 47 143.5t132 59.5t132.5 -62.5t47.5 -153.5v-357q0 -355 223 -355q159 0 241 173q64 134 64 313q0 328 -233 410 l5 32q160 -18 250 -152.5t90 -303.5zM764 1561q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45zM854 1233q0 -42 -29.5 -72t-71 -30t-71 30.5t-29.5 71t30 70.5t71 30t70.5 -29t29.5 -71zM482 1233q0 -42 -29.5 -72t-71 -30 t-71.5 30.5t-30 71t30.5 70.5t71.5 30t70.5 -29t29.5 -71z" />
+<glyph unicode="&#x3b1;" horiz-adv-x="1228" d="M1151 187q0 -84 -47.5 -143.5t-128.5 -59.5q-139 0 -165 167q-137 -175 -301 -175q-192 0 -324 144.5t-132 340t138 340.5t334 145q92 0 169.5 -54t117.5 -140l81 194h47v-788q0 -39 21.5 -73.5t58.5 -34.5q78 0 78 171l-2 86h55v-120zM799 291v301q0 112 -76 206.5 t-178.5 94.5t-176.5 -72q-138 -134 -138 -362q0 -152 66 -280q81 -155 219 -155q104 0 194 82t90 185z" />
+<glyph unicode="&#x3b2;" horiz-adv-x="951" d="M898 427q0 -200 -124.5 -325.5t-265 -125.5t-272.5 113q0 -22 0.5 -75t0.5 -79q0 -221 -37 -352h-148q37 173 37 311v1110q0 467 361 467q157 0 257.5 -88t100.5 -242q0 -183 -193 -308q283 -133 283 -406zM671 133q57 92 57 215.5t-46 258.5t-120 198q-56 -27 -98.5 -27 t-80.5 16.5t-38 42.5q0 47 87 47q54 0 131 -30q88 103 88 292q0 277 -211 277q-204 0 -204 -345v-845q0 -48 58 -119q74 -90 192 -90t185 109z" />
+<glyph unicode="&#x3b3;" horiz-adv-x="934" d="M884 847q0 -109 -133 -365l-201 -358q37 -229 37 -383t-78 -154q-82 0 -82 164t68 381q-44 204 -111 379q-107 280 -211 280q-76 0 -88 -155h-35v14q0 273 146 273q129 0 231 -307q18 -55 106 -423q147 307 174 509q13 97 25 133q27 88 82 88q70 0 70 -76z" />
+<glyph unicode="&#x3b4;" horiz-adv-x="929" d="M716 821q160 -165 160 -356.5t-130.5 -340t-311 -148.5t-281.5 123t-101 305t120 309.5t304 154.5q-35 39 -132 116.5t-135 128.5q-56 77 -56 173.5t116 152.5q92 44 207 44t208 -54q113 -64 113 -170.5t-98 -106.5q-43 0 -71 28t-28 71q0 95 101 99q-80 78 -229 78 q-80 0 -140 -31q-74 -38 -74 -111q0 -102 160 -227q271 -210 298 -238zM730 399q0 187 -210 421q-153 -24 -236 -131.5t-83 -262.5t59 -262q73 -134 208.5 -134t205.5 125q56 101 56 244z" />
+<glyph unicode="&#x3b5;" horiz-adv-x="883" d="M792 280q28 0 28 -28.5t-34 -86.5q-110 -189 -326 -189q-148 0 -260 61q-138 75 -138 211q0 99 74 161.5t179 86.5q-93 22 -154 84t-61 153q0 123 132 182q98 45 221 45t210 -28q123 -40 123 -122q0 -33 -24.5 -55.5t-60.5 -22.5t-67 47q-52 77 -61 86q-47 47 -126 47 q-202 0 -202 -194q0 -188 199 -188q22 0 63 11t63 11q86 0 86 -55.5t-87 -55.5q-21 0 -62.5 11t-62.5 11q-224 0 -224 -205q0 -228 255 -228q204 0 290 221q11 29 27 29z" />
+<glyph unicode="&#x3b6;" horiz-adv-x="835" d="M402 126l202 8q97 0 161 -67.5t64 -165.5q0 -147 -86.5 -243t-227.5 -96t-141 88q0 71 75 71q28 0 82.5 -14.5t82.5 -14.5q61 0 102 48.5t41 106.5t-40.5 100t-94.5 42l-185 -13q-385 0 -385 443q0 400 284 723h-5q-185 0 -185 148q0 118 174 167l16 -37 q-104 -45 -104 -123q0 -51 34.5 -83.5t85.5 -32.5q11 0 23 2q56 64 175.5 144.5t184.5 80.5q48 0 48 -38q0 -86 -148 -158q-108 -53 -225 -73q-145 -134 -222 -327.5t-77 -399.5q0 -153 68.5 -219.5t222.5 -66.5z" />
+<glyph unicode="&#x3b7;" horiz-adv-x="1098" d="M858 -81v757q0 237 -158 237q-129 0 -209 -100.5t-80 -232.5v-580h-149v778q0 39 -21 73.5t-58 34.5q-78 0 -78 -172q0 -8 2 -85h-55v120q0 84 47 143.5t130 59.5t128 -69q40 -59 40 -147q101 224 317 224q293 0 293 -317v-45q-1 -29 -1 -44v-659q0 -140 40 -323h-148 q-40 135 -40 347z" />
+<glyph unicode="&#x3b8;" horiz-adv-x="980" d="M836 1205q92 -217 92 -477.5t-94 -474.5q-121 -277 -343.5 -277t-344.5 277q-94 215 -94 475.5t91 476.5q120 284 346.5 284t346.5 -284zM768 765q0 211 -51 398q-75 272 -227 272t-227 -272q-51 -188 -51 -398h556zM768 709h-556q0 -212 51 -402q75 -277 227 -277 t227 276q51 191 51 403z" />
+<glyph unicode="&#x3b9;" horiz-adv-x="748" d="M695 266q0 -114 -48 -194q-58 -96 -164 -96q-133 0 -203 78t-70 212v473q0 86 -41 106q-20 11 -103 11h-14v67l299 23v-685q0 -231 148 -231q102 0 131 139q12 56 12 182v37h53v-122z" />
+<glyph unicode="&#x3ba;" horiz-adv-x="1140" d="M1088 0h-241l-356 502l-137 -118v-384h-134v737q0 88 -45 109q-21 10 -107 10h-16v67l309 23v-488l380 330q155 135 233 135q100 0 100 -98q0 -38 -30.5 -66.5t-64 -28.5t-61 29t-54.5 29q-45 0 -266 -193q2 -20 10 -31l271 -384q47 -67 88.5 -90.5t120.5 -23.5v-66z" />
+<glyph unicode="&#x3bb;" horiz-adv-x="1043" d="M990 259q0 -283 -151.5 -283t-241.5 325l-108 392l-287 -693h-150l377 916l-68 249q-54 188 -181 188q-80 0 -92 -161h-36v15q0 283 152 283t241 -325l237 -864q52 -188 181 -188q79 0 92 161h35v-15z" />
+<glyph unicode="&#x3bc;" horiz-adv-x="1120" d="M1043 187q0 -84 -47.5 -143.5t-130 -59.5t-125 64.5t-42.5 152.5q-101 -225 -317 -225q-83 0 -144 25v-66q0 -221 -37 -352h-148q37 173 37 311v1029h147v-663q0 -237 159 -237q129 0 209 101t80 233v566h148v-765q0 -39 21.5 -73.5t58.5 -34.5q78 0 78 171l-2 86h55 v-120z" />
+<glyph unicode="&#x3bd;" horiz-adv-x="1031" d="M979 871q0 -93 -83 -247l-327 -607q-22 -41 -41 -41q-25 0 -40 41l-234 640q-48 131 -86 152q-25 14 -116 14v49q83 1 195 88h30q55 -105 97 -221l208 -573l199 365q41 75 41 117.5t-16.5 110.5t-16.5 103q0 98 103 98q36 0 61.5 -26.5t25.5 -62.5z" />
+<glyph unicode="&#x3be;" horiz-adv-x="936" d="M420 123l262 12q106 0 172 -61.5t66 -166.5q0 -138 -86.5 -242.5t-221.5 -104.5q-47 0 -96.5 23.5t-49.5 65.5q0 25 22.5 46t48.5 21t78.5 -15t79.5 -15q75 0 117.5 45.5t42.5 109.5t-38 105.5t-91 41.5l-224 -12q-192 0 -312 84q-138 97 -138 281q0 263 252 437 q-116 85 -116 189t97 208q-156 36 -156 151.5t175 123.5v-33q-104 -13 -104 -89q0 -96 129 -105q202 179 327 179q44 0 44 -44q0 -82 -135 -132q-102 -38 -206 -41q-111 -109 -111 -209.5t122 -169.5q62 36 161 62t149.5 26t82.5 -14.5t32 -38.5q0 -49 -96 -74 q-66 -17 -143 -17t-182 17q-256 -184 -256 -394q0 -124 86.5 -187t215.5 -63z" />
+<glyph unicode="&#x3bf;" horiz-adv-x="998" d="M945 481.5q0 -201.5 -127.5 -353.5t-324.5 -152t-319 143.5t-122 341t126.5 348.5t321 151t320 -138.5t125.5 -340zM782 406q0 187 -65 326q-84 180 -250 180q-135 0 -200 -121q-52 -96 -52 -262.5t67 -311.5q87 -187 251 -187q249 0 249 376z" />
+<glyph unicode="&#x3c0;" horiz-adv-x="1134" d="M1084 823h-267v-162q0 -366 108 -563q21 -38 21 -53q0 -66 -80.5 -66t-117.5 197q-24 127 -24 272v375h-228l-80 -704q-16 -140 -90.5 -140t-74.5 62q0 11 10 41q102 311 168 741h-191q-57 0 -118 -41q-55 -36 -55 -40q0 -1 1 -1q-16 0 -16 16q0 39 63.5 102.5 t164.5 63.5h806v-100z" />
+<glyph unicode="&#x3c1;" horiz-adv-x="990" d="M184 818q107 142 305 142t323.5 -138.5t125.5 -340t-127.5 -353.5t-329.5 -152q-145 0 -245 113q0 -23 0.5 -79.5t0.5 -84.5q0 -214 -36 -342h-149q37 173 37 311v589q0 209 95 335zM775 406q0 187 -65 326q-84 180 -250 180q-108 0 -166 -84.5t-58 -197.5v-344 q0 -110 89 -183t201 -73q249 0 249 376z" />
+<glyph unicode="&#x3c2;" horiz-adv-x="905" d="M617 -14l-105 -10q-194 0 -326.5 144.5t-132.5 342.5t132 347.5t330 149.5q99 0 207 -48q131 -58 131 -143q0 -35 -23 -58t-64 -23t-68 56q-48 99 -52 105q-43 56 -128 56q-60 0 -120 -34q-168 -95 -168 -405q0 -109 58 -216q68 -126 168 -126l120 6q106 0 169.5 -62.5 t63.5 -169.5q0 -135 -91.5 -234.5t-228 -99.5t-136.5 84q0 22 22 44.5t47.5 22.5t78.5 -19t82 -19q67 0 112 51t45 118q0 140 -123 140z" />
+<glyph unicode="&#x3c3;" horiz-adv-x="1087" d="M1037 823h-282q155 -134 155 -344t-122.5 -356.5t-312.5 -146.5t-307.5 138.5t-117.5 328t121.5 335t309.5 145.5h556v-100zM753 390q0 307 -151 433h-150q-125 0 -185 -83.5t-60 -213.5q0 -179 65 -318q83 -180 241 -180q240 0 240 362z" />
+<glyph unicode="&#x3c4;" horiz-adv-x="936" d="M888 255q0 -109 -51.5 -194t-153.5 -85q-128 0 -196.5 75t-68.5 204v568h-180q-57 0 -118 -41q-55 -36 -55 -40q0 -1 1 -1q-16 0 -16 16q0 39 63.5 102.5t164.5 63.5h608v-100h-327v-572q0 -223 139 -223q98 0 127 134q11 55 11 173v38h52v-118z" />
+<glyph unicode="&#x3c5;" horiz-adv-x="1103" d="M1051 496q0 -211 -106 -357q-119 -163 -322 -163q-178 0 -269.5 100.5t-91.5 280.5v421q0 39 -21 73.5t-58 34.5q-79 0 -79 -173q0 -6 3 -84h-55v120q0 84 47 143.5t132 59.5t132.5 -62.5t47.5 -153.5v-357q0 -355 223 -355q159 0 241 173q64 134 64 313q0 328 -233 410 l5 32q160 -18 250 -152.5t90 -303.5z" />
+<glyph unicode="&#x3c6;" horiz-adv-x="1201" d="M642 959q225 -13 366 -151.5t141 -326t-138.5 -337t-368.5 -166.5v-390h-83v389q-228 10 -367.5 154.5t-139.5 329t140 334t367 164.5v164h83v-164zM905 165q70 98 79 259v32q0 142 -68 265q-93 167 -274 188v-878q174 10 263 134zM559 33v878q-180 -12 -270 -150 q-64 -97 -71 -244q-1 -13 -1 -26q0 -133 71 -262q94 -172 271 -196z" />
+<glyph unicode="&#x3c7;" horiz-adv-x="952" d="M900 -145q0 -279 -149 -279q-157 0 -226 320l-53 245l-274 -541h-147l380 750l-62 291q-17 74 -63.5 129.5t-114.5 55.5q-78 0 -90 -159h-35v15q0 278 149 278q157 0 226 -319l41 -189l254 502h147l-360 -711l75 -347q17 -74 63 -129.5t114 -55.5q78 0 90 158h35v-14z " />
+<glyph unicode="&#x3c8;" horiz-adv-x="1254" d="M1201 656q0 -244 -99 -438q-122 -241 -343 -241v-389h-83v389q-414 0 -414 386v415q0 39 -21 73.5t-58 34.5q-79 0 -79 -173q0 -7 3 -84h-55v120q0 84 47 143.5t132 59.5t132.5 -62.5t47.5 -153.5v-351q0 -186 39 -256q55 -100 226 -100v894h83v-894q151 0 248 146 q86 130 86 289q0 70 -42.5 200.5t-42.5 199.5q0 96 67 96q85 0 112 -118q14 -59 14 -186z" />
+<glyph unicode="&#x3c9;" horiz-adv-x="1328" d="M1276 430q0 -173 -79 -302q-93 -152 -255 -152q-185 0 -278 219q-93 -219 -278 -219q-162 0 -255 152q-79 129 -79 302q0 245 124.5 386t365.5 144v-48q-327 -10 -327 -470q0 -412 202 -412q135 0 224 241q-67 140 -67 291q0 219 90 219t90 -219q0 -151 -67 -291 q89 -241 224 -241q202 0 202 412q0 460 -327 470v48q241 -3 365.5 -144.5t124.5 -385.5z" />
+<glyph unicode="&#x3ca;" horiz-adv-x="748" d="M695 266q0 -114 -48 -194q-58 -96 -164 -96q-133 0 -203 78t-70 212v473q0 86 -41 106q-20 11 -103 11h-14v67l299 23v-685q0 -231 148 -231q102 0 131 139q12 56 12 182v37h53v-122zM167 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33 t77.5 -32zM539 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32z" />
+<glyph unicode="&#x3cb;" horiz-adv-x="1103" d="M1051 496q0 -211 -106 -357q-119 -163 -322 -163q-178 0 -269.5 100.5t-91.5 280.5v421q0 39 -21 73.5t-58 34.5q-79 0 -79 -173q0 -6 3 -84h-55v120q0 84 47 143.5t132 59.5t132.5 -62.5t47.5 -153.5v-357q0 -355 223 -355q159 0 241 173q64 134 64 313q0 328 -233 410 l5 32q160 -18 250 -152.5t90 -303.5zM467 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32zM839 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32z" />
+<glyph unicode="&#x3cc;" horiz-adv-x="998" d="M945 481.5q0 -201.5 -127.5 -353.5t-324.5 -152t-319 143.5t-122 341t126.5 348.5t321 151t320 -138.5t125.5 -340zM782 406q0 187 -65 326q-84 180 -250 180q-135 0 -200 -121q-52 -96 -52 -262.5t67 -311.5q87 -187 251 -187q249 0 249 376zM638 1457q0 -20 -17 -48 l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x3cd;" horiz-adv-x="1103" d="M1051 496q0 -211 -106 -357q-119 -163 -322 -163q-178 0 -269.5 100.5t-91.5 280.5v421q0 39 -21 73.5t-58 34.5q-79 0 -79 -173q0 -6 3 -84h-55v120q0 84 47 143.5t132 59.5t132.5 -62.5t47.5 -153.5v-357q0 -355 223 -355q159 0 241 173q64 134 64 313q0 328 -233 410 l5 32q160 -18 250 -152.5t90 -303.5zM728 1457q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x3ce;" horiz-adv-x="1328" d="M1276 430q0 -173 -79 -302q-93 -152 -255 -152q-185 0 -278 219q-93 -219 -278 -219q-162 0 -255 152q-79 129 -79 302q0 245 124.5 386t365.5 144v-48q-327 -10 -327 -470q0 -412 202 -412q135 0 224 241q-67 140 -67 291q0 219 90 219t90 -219q0 -151 -67 -291 q89 -241 224 -241q202 0 202 412q0 460 -327 470v48q241 -3 365.5 -144.5t124.5 -385.5zM818 1457q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x3cf;" horiz-adv-x="1519" d="M649 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-636l618 588q36 34 36 67q0 61 -91 63v62q69 -6 217.5 -6t201.5 6v-62q-159 -2 -281 -118l-306 -291l391 -478q107 -131 107 -322t-130.5 -340t-330.5 -149q-121 0 -215 54q-113 64 -113 170t97 106q42 0 70.5 -28 t28.5 -70q0 -94 -100 -99q79 -78 229 -78q59 0 120 34q182 102 182 353q0 180 -103 308l-347 430l-281 -268v-359q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-347q-43 0 -114 -6v61q8 0 26.5 -0.5t28.5 -0.5q125 0 141 40q6 15 6 44v1066q0 27 -7 41q-16 33 -176 33 h-19v62q70 -6 119 -6h342q50 0 120 6v-62z" />
+<glyph unicode="&#x3d0;" horiz-adv-x="1007" d="M822 736.5q125 -125.5 125 -307.5t-127 -317.5t-312 -135.5q-217 0 -340 185q-95 143 -95 381.5t77 446.5q91 247 266 361q129 84 259 84q78 0 137 -38.5t59 -113.5q0 -169 -247 -258q-180 -65 -390 -66q-51 -132 -56 -279q130 183 342 183q177 0 302 -125.5zM759 1263 q0 85 -108 85q-131 0 -235 -92t-156 -225q158 2 300 48q199 64 199 184zM785 367q0 168 -64 292q-80 157 -232 157q-122 0 -186 -108q-52 -88 -52 -237t66 -279q83 -162 234 -162q234 0 234 337z" />
+<glyph unicode="&#x3d1;" horiz-adv-x="1206" d="M1154 706q0 -17 -15 -17q-40 0 -103 19q0 -245 -85 -456q-111 -273 -315 -273q-246 0 -325 172q-49 108 -49 387q0 39 -21 73.5t-58 34.5q-79 0 -79 -165v-8h-52v36q0 84 47.5 143.5t132 59.5t129.5 -62t45 -154v-44q0 -431 230 -431q147 0 206 260q35 152 35 362v23v81 q-184 55 -301 156q-146 125 -146 292q0 114 53 205q63 108 169 108q201 0 306 -293q74 -209 78 -464q118 -16 118 -45zM668 1445q-82 0 -131 -96q-40 -79 -40 -170q0 -264 379 -382q-1 209 -33 374q-53 274 -175 274z" />
+<glyph unicode="&#x3d2;" horiz-adv-x="1566" d="M1499 1284q-173 0 -252 -128l-381 -619v-388q0 -34 10 -53q15 -29 90 -35h104v-61q-73 6 -127 6h-320q-55 0 -128 -6v61q8 0 25.5 -0.5t27.5 -0.5q124 0 142 36q7 14 7 43v398l-413 675q-34 56 -95 68q-21 4 -121 4v62q126 -6 299.5 -6t246.5 6v-62h-24q-112 0 -112 -48 q0 -14 13 -35l356 -581l325 529q21 34 21 58q0 77 -113 77v62q155 -6 240.5 -6t178.5 6v-62z" />
+<glyph unicode="&#x3d3;" horiz-adv-x="1979" d="M1912 1284q-173 0 -252 -128l-381 -619v-388q0 -34 10 -53q15 -29 90 -35h104v-61q-73 6 -127 6h-320q-55 0 -128 -6v61q8 0 25.5 -0.5t27.5 -0.5q124 0 142 36q7 14 7 43v398l-413 675q-34 56 -95 68q-21 4 -121 4v62q126 -6 299.5 -6t246.5 6v-62h-24q-112 0 -112 -48 q0 -14 13 -35l356 -581l325 529q21 34 21 58q0 77 -113 77v62q155 -6 240.5 -6t178.5 6v-62zM271 1324q0 -20 -17 -48l-144 -237q-25 -41 -51 -41t-26 24q0 11 8 33l100 278q13 36 60 36q70 0 70 -45z" />
+<glyph unicode="&#x3d4;" horiz-adv-x="1566" d="M1499 1284q-173 0 -252 -128l-381 -619v-388q0 -34 10 -53q15 -29 90 -35h104v-61q-73 6 -127 6h-320q-55 0 -128 -6v61q8 0 25.5 -0.5t27.5 -0.5q124 0 142 36q7 14 7 43v398l-413 675q-34 56 -95 68q-21 4 -121 4v62q126 -6 299.5 -6t246.5 6v-62h-24q-112 0 -112 -48 q0 -14 13 -35l356 -581l325 529q21 34 21 58q0 77 -113 77v62q155 -6 240.5 -6t178.5 6v-62zM717 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33t77.5 -32zM1089 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-79 33.5t-33 78t33.5 77.5t79 33 t77.5 -32z" />
+<glyph unicode="&#x3d5;" horiz-adv-x="1201" d="M1021.5 791.5q127.5 -138.5 127.5 -318t-138.5 -329t-367.5 -166.5v-390h-84v389q-228 10 -367.5 154.5t-139.5 329.5q0 160 108.5 298t291.5 183l-3 -53q-120 -44 -181 -164q-44 -87 -50 -191q-1 -15 -1 -30q0 -146 70 -275q95 -172 272 -196v590q0 149 21 206 q38 101 162 101q152 0 279.5 -138.5zM724 859q-81 0 -81 -193v-635q174 10 263 134q72 100 78 256v24q0 142 -60 263q-75 151 -200 151z" />
+<glyph unicode="&#x3d6;" horiz-adv-x="1666" d="M1614 823h-246q158 -113 158 -383q0 -174 -79 -307q-93 -157 -255 -157q-185 0 -278 219q-93 -219 -278 -219q-162 0 -255 157q-79 133 -79 307q0 270 158 383h-222q-57 0 -118 -41q-55 -36 -55 -40q0 -1 1 -1q-16 0 -16 16q0 39 63.5 102.5t164.5 63.5h1336v-100z M1363 462q0 274 -135 361h-628q-135 -87 -135 -361q0 -432 202 -432q135 0 224 241q-67 140 -67 261q0 199 90 199t90 -199q0 -121 -67 -261q89 -241 224 -241q202 0 202 432z" />
+<glyph unicode="&#x3d7;" horiz-adv-x="1028" d="M976 259q0 -202 -65 -370q-83 -218 -243 -259q-41 -11 -112 -11q-14 0 -28 1h-62q-43 0 -63 -2q-87 -10 -139 -60h-44q21 142 154 177l264 43q159 44 225 203q-18 -5 -39 -5q-105 0 -150 221q-26 130 -28 307l-293 -235q-8 -293 -123 -293q-64 0 -64 96q0 206 188 352 q-5 124 -38 236q-49 163 -136 163q-80 0 -92 -161h-36v15q0 283 152 283q108 0 152 -213q26 -127 26 -300l288 232q15 281 122 281q46 0 60 -37q8 -20 8 -76q0 -171 -187 -321q6 -129 40 -243q50 -170 135 -170q80 0 92 161h36v-15z" />
+<glyph unicode="&#x3d8;" horiz-adv-x="1445" d="M672 79q-259 19 -431.5 210t-172.5 447.5t188 455t466.5 198.5t466.5 -198t188 -455t-172 -448t-432 -210v-74q0 -73 25 -183.5t25 -150t-28 -76.5t-73.5 -37t-70.5 43t-25 86.5t23 147.5t23 194v50zM1175 756q0 403 -266 538q-90 46 -186.5 46t-184.5 -45 q-268 -135 -268 -539q0 -436 273 -581q88 -47 177 -47t181 47q144 73 215 246q59 145 59 335z" />
+<glyph unicode="&#x3d9;" horiz-adv-x="1054" d="M863 824.5q139 -135.5 139 -310t-125 -298t-308 -138.5v-93q0 -88 30 -192t30 -139t-28.5 -65.5t-73 -30.5t-70 36t-25.5 75.5t27.5 143.5t27.5 196v68q-183 14 -308.5 139t-125.5 299.5t138.5 309.5t335.5 135t336 -135.5zM773 261q50 81 50 268.5t-59 267.5 q-83 114 -242 114t-238 -118q-54 -78 -54 -269t58 -275q83 -119 244 -119t241 131z" />
+<glyph unicode="&#x3da;" horiz-adv-x="1149" d="M1128 1370q0 -110 -109 -146q-59 -19 -200 -19h-357q-161 0 -270 -164q-98 -145 -98 -314q0 -207 144 -317q130 -101 344 -101q59 0 90 -39t31 -91v-174q0 -73 25 -183.5t25 -150t-28 -76.5t-73.5 -37t-70.5 43t-25 86.5t23 147.5t23 179t-10 100q-16 41 -66 46 q-232 23 -367 178t-135 389t116 412q133 204 345 204h405q125 0 236 75q2 -23 2 -48z" />
+<glyph unicode="&#x3db;" horiz-adv-x="1264" d="M601 -10l-164 -14q-174 0 -278 124.5t-104 301.5q0 240 166 380.5t410 140.5h600v-119h-592q-329 0 -451 -242q-40 -79 -40 -166q0 -120 73.5 -193.5t193.5 -73.5l163 7q99 0 162.5 -69t63.5 -169q0 -134 -92.5 -234t-228.5 -100t-136 83q0 23 22 45.5t48 22.5t79 -18.5 t82 -18.5q66 0 111 50.5t45 117.5q0 144 -133 144z" />
+<glyph unicode="&#x3dc;" horiz-adv-x="1216" d="M744 1281h-214q-51 0 -68.5 -13t-17.5 -66v-279h440l44 -350h-50q-25 155 -96 221.5t-248 66.5h-90v-724q0 -22 8 -39q17 -37 223 -37h22v-61q-74 6 -120 6h-382q-55 0 -127 -6v61q8 0 26 -0.5t28 -0.5q124 0 141 38q7 15 7 48v1053q0 31 -7 47q-15 35 -170 35h-25v62 h1026l55 -442h-49q-24 212 -82 285q-74 95 -274 95z" />
+<glyph unicode="&#x3dd;" horiz-adv-x="924" d="M891 804h-412q-145 0 -205 -46t-60 -141q0 -59 22 -154h381v-119h-381v-419q0 -214 -36 -342h-148q37 173 37 311v552q0 209 95 335q107 142 309 142h398v-119z" />
+<glyph unicode="&#x3de;" horiz-adv-x="910" d="M874.5 781.5q29.5 -31.5 29.5 -85t-11 -85.5l-316 -913q-48 -140 -119 -140q-86 0 -86 115q0 49 36 114l63 105q170 327 356 755h-666q-29 0 -50 21t-21 46t4 38l152 506q-6 -1 -10 -1q-93 0 -93 91q0 37 28 65.5t65.5 28.5t68 -27.5t30.5 -68.5t-15 -92l-130 -441h607 q48 0 77.5 -31.5z" />
+<glyph unicode="&#x3df;" horiz-adv-x="815" d="M771 465q0 -21 -21 -80l-245 -694q-47 -133 -116 -133q-87 0 -87 103q0 58 99 221q156 257 295 539h-557q-69 0 -69 70q0 15 4 23l209 418q-7 -1 -10 -1q-92 0 -92 89q0 36 28 64.5t64.5 28.5t63 -28t26.5 -73.5t-19 -83.5l-181 -364h493q115 0 115 -99z" />
+<glyph unicode="&#x3e0;" horiz-adv-x="1474" d="M1063 6q-110 0 -182 -6v61h6q152 0 152 54q0 10 -163 462l-140 -371q-9 -24 -9 -42q0 -51 44 -76.5t100 -26.5v-61q-182 6 -234.5 6t-152.5 -6v61h2q133 0 183 136l173 472l-166 456l-346 -919q-9 -24 -9 -42q0 -51 47.5 -76.5t104.5 -26.5v-61q-183 6 -244 6t-161 -6v61 h2q143 0 193 136l430 1172q15 42 45 42t45 -42l444 -1223q6 -20 25 -56q25 -29 135 -29h21v-61q-235 6 -345 6z" />
+<glyph unicode="&#x3e1;" horiz-adv-x="1238" d="M1174 175q0 -158 -20 -189q-4 -7 -16 -7q-22 0 -22 57q0 205 -119 393q-166 -188 -235 -383q-26 -74 -67 -74q-37 0 -61.5 24.5t-24.5 61.5q0 136 325 459q-58 72 -134 141q-28 -36 -54 -65l-481 -543q-69 -78 -120 -78q-29 0 -55 23t-26 53.5t46 65.5q313 235 636 590 q-225 180 -504 180q-32 0 -32 23q0 11 7 16q31 20 188 20q338 0 553.5 -215t215.5 -553z" />
+<glyph unicode="&#x3e2;" horiz-adv-x="1686" d="M1026 -368l-212 8q-165 0 -263 -82h-44q16 123 116 170q62 29 208 41t207 19q291 33 408 304q-121 -135 -303 -135q-236 0 -296 247h-8q-60 -247 -295.5 -247t-366.5 222q-109 186 -109 438q0 345 161 546q174 218 511 227v-43q-470 -25 -470 -712q0 -626 295 -626 q94 0 156.5 99t62.5 205t-23 210.5t-23 122.5q0 125 105 125t105 -125q0 -18 -23 -122.5t-23 -210.5t62.5 -205t156.5 -99q295 0 295 626q0 687 -470 712v43q337 -9 511 -227q161 -201 161 -546q0 -306 -103 -574q-131 -344 -375 -401q-43 -10 -114 -10z" />
+<glyph unicode="&#x3e3;" horiz-adv-x="1294" d="M1241 430q0 -723 -318 -800q-42 -10 -116 -10h-26q-27 1 -49 1q-55 0 -82 -4q-80 -11 -131 -59h-44q21 151 178 183l294 56q166 72 209 321q-92 -142 -249 -142q-224 0 -256 267h-8q-32 -267 -256 -267q-162 0 -255 152q-79 129 -79 302q0 244 124.5 385.5t365.5 144.5 v-48q-327 -10 -327 -470q0 -169 25 -257q44 -155 169 -155q99 0 149 102q39 79 39 191.5t-23 219.5t-23 122q0 116 95 116t95 -116q0 -15 -23 -122t-23 -219.5t39 -191.5q50 -102 149 -102q125 0 169 155q25 88 25 257q0 460 -327 470v48q242 -3 366 -144t124 -386z" />
+<glyph unicode="&#x3e4;" horiz-adv-x="1567" d="M1500 1284l-75 2q-140 0 -140 -85v-1057q0 -27 11 -48q19 -35 186 -35h18v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 29 -0.5t32 -0.5q124 0 143 36q9 17 9 49v586q-43 -88 -119 -157q-185 -168 -420 -168q-196 0 -357.5 145.5t-161.5 343t132 346.5t330 149 q121 0 215 -54q113 -64 113 -170t-97 -106q-42 0 -70.5 28t-28.5 70q0 94 100 99q-79 78 -229 78q-60 0 -120 -34q-168 -95 -168 -405q0 -161 89 -291q99 -145 253 -145q220 0 392 164q147 140 147 358v219q0 32 -9 49q-15 28 -93 34h-111v62q70 -6 115 -6h376q42 0 111 6 v-62z" />
+<glyph unicode="&#x3e5;" horiz-adv-x="1204" d="M1151 0q-193 6 -236 6t-236 -6v66l44 -1q66 0 89 13q33 18 33 79v307q-27 -44 -72 -83q-135 -119 -307 -119t-292.5 97t-120.5 257t107 252t264 92q89 0 159 -39q85 -47 85 -126t-78.5 -79t-78.5 75q0 55 61 75q-60 39 -155.5 39t-151 -83.5t-55.5 -201t67.5 -211.5 t187.5 -94q154 0 267 102.5t113 254.5v94q0 61 -33 79q-23 13 -89 13l-44 -1v66q193 -6 236 -6t236 6v-66l-44 1q-66 0 -89 -13q-33 -18 -33 -79v-609q0 -61 33 -79q23 -13 89 -13l44 1v-66z" />
+<glyph unicode="&#x3e6;" horiz-adv-x="1533" d="M1465 369q0 -253 -114 -482q-140 -278 -367 -278q-84 0 -246 43t-246 43q-173 0 -206 -137h-68q33 136 141 189q82 40 239 40q64 0 188 -32.5t188 -32.5q154 0 233 242q56 173 56 371q0 278 -98 486q-127 269 -373 269q-197 0 -316 -170q-32 -46 -32 -72v-707 q0 -31 8 -45q20 -36 146 -36q24 0 51 1v-61q-68 6 -115 6h-358q-42 0 -108 -6v61q42 -1 62 -1q110 0 133 36q7 11 7 41v1068q0 32 -7 45q-19 35 -157 35q-18 0 -38 -1v62q66 -6 112 -6h354q48 0 115 6v-62q-42 2 -61 2q-114 0 -136 -36q-8 -13 -8 -45v-175q157 110 348 110 q320 0 504 -231q169 -212 169 -540z" />
+<glyph unicode="&#x3e7;" horiz-adv-x="1183" d="M1131 446q0 -294 -220 -421q-85 -49 -174 -49q-227 0 -402 286q-43 70 -100 70t-57 -64q0 -41 32 -104l-46 -26q-34 66 -34 127t46 111t114 50q113 0 206 -155q53 -88 136 -152t177 -64t149 67.5t55 166.5q0 143 -79.5 308t-189.5 289q-190 -168 -342 -168 q-204 0 -317 200q-33 58 -33 114q0 116 98.5 183.5t219.5 67.5q239 0 481 -223q54 73 84 73q12 0 12 -14q0 -30 -65 -88q249 -247 249 -585zM271 1201q-73 0 -119.5 -46.5t-46.5 -119.5q0 -111 101.5 -189t216.5 -78q135 0 292 150q-256 283 -444 283z" />
+<glyph unicode="&#x3e8;" horiz-adv-x="1017" d="M950 420q0 -189 -134.5 -326t-312.5 -137t-306.5 121.5t-128.5 288.5q0 131 69.5 231t191.5 150l195 66q102 35 156 84q72 67 72 175.5t-74.5 185t-183.5 76.5q-160 0 -245 -99q109 0 109 -100q0 -42 -29.5 -69.5t-71.5 -27.5q-96 0 -96 110.5t120 180.5q102 60 222 60 q159 0 270 -111.5t111 -270.5q0 -114 -61 -207t-165 -142q-48 -23 -142.5 -52t-111.5 -35q-108 -38 -156 -112t-48 -163q0 -114 97.5 -196.5t210 -82.5t204.5 60t143 159q30 58 48 177q5 32 24 32q23 0 23 -26z" />
+<glyph unicode="&#x3e9;" horiz-adv-x="928" d="M752 832q124 -128 124 -301.5t-160 -332.5q-37 -37 -298 -238q-160 -123 -160 -200.5t74 -115.5q60 -31 140 -31q148 0 229 78q-43 1 -72 29t-29 70.5t28 70.5t71 28q98 0 98 -106.5t-112 -170.5q-94 -54 -209 -54t-208 44q-115 56 -115 153q0 113 120 224l203 174 q-178 26 -301 141t-123 285.5t114.5 275.5t288 105t297.5 -128zM662 376q68 106 68 224t-70 212t-201.5 94t-199.5 -110q-58 -91 -58 -236t86 -240.5t233 -118.5q104 114 142 175z" />
+<glyph unicode="&#x3ea;" horiz-adv-x="1479" d="M1091 1390q122 0 193.5 -78.5t71.5 -188.5t-33 -110q-29 0 -34 26v49q0 66 -63.5 129t-129.5 63q-168 0 -293 -209q434 -1027 434 -1049t-28 -22h-905q-24 0 -24 22q0 13 10 37l383 911q-61 184 -86 233q-74 144 -177 144q-145 0 -217 -114h6q119 0 119 -110 q0 -47 -31 -78.5t-78.5 -31.5t-78.5 32.5t-31 81.5q0 117 97 190t222.5 73t206.5 -57t141 -179q145 236 325 236zM1010 149l-302 726l-306 -726h608z" />
+<glyph unicode="&#x3eb;" horiz-adv-x="1004" d="M894.5 906q56.5 -54 56.5 -130t-37.5 -76t-37.5 54q0 135 -119 135q-87 0 -187 -158q298 -688 298 -703q0 -28 -33 -28h-625q-31 0 -31 28q0 12 271 637q-39 118 -56 152q-48 96 -111 96q-93 0 -122 -50q75 -10 75 -91q0 -39 -26.5 -65.5t-66 -26.5t-65 27t-25.5 67 q0 85 72.5 135.5t160.5 50.5q162 0 244 -145q99 145 223 145q85 0 141.5 -54zM677 127l-188 439l-190 -439h378z" />
+<glyph unicode="&#x3ec;" horiz-adv-x="1695" d="M1628 1370q0 -110 -135 -146q-71 -19 -215.5 -19t-309.5 67.5t-255 67.5t-181 -53q-262 -153 -262 -591q0 -470 265 -632q92 -56 185.5 -56t187.5 55q267 156 267 633q0 137 -29 253l97 86q134 -169 134 -366q0 -284 -187.5 -498t-467 -214t-467 214.5t-187.5 498.5 t187 502t467 218q103 0 309 -23.5t309 -23.5q174 0 286 75q2 -23 2 -48z" />
+<glyph unicode="&#x3ed;" horiz-adv-x="1177" d="M1128 950q0 -45 -66.5 -88t-191.5 -43t-233.5 46.5t-169.5 46.5q-134 0 -200 -121q-52 -96 -52 -262.5t67 -311.5q87 -187 251 -187q249 0 249 376q0 148 -43 268l88 29q42 -30 80 -94t38 -123q0 -206 -127.5 -358t-324.5 -152t-319 143.5t-122 341t126.5 348.5 t321.5 151q57 0 170 -18.5t170 -18.5q173 0 286 75q2 -24 2 -48z" />
+<glyph unicode="&#x3ee;" horiz-adv-x="1286" d="M944 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-59q197 -20 328 -105q161 -104 161 -278q0 -106 -45 -187q-55 -97 -153 -97q-42 0 -69 28.5t-27 70.5t29 69.5t71 27.5q77 0 96 -83q46 67 46 155q0 151 -146 234q-112 64 -291 79v-912q0 -27 13.5 -52t91.5 -31h110v-61 q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v910q-178 -15 -290 -79q-145 -83 -145 -233q0 -88 46 -155q19 83 96 83q42 0 71 -27.5t29 -69.5t-27 -70.5t-69 -28.5q-98 0 -153 97q-45 81 -45 187q0 174 160 278q130 85 327 105v59 q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62z" />
+<glyph unicode="&#x3ef;" horiz-adv-x="970" d="M917 435q0 -62 -37.5 -119t-96.5 -57q-39 0 -68 31t-29 70t29.5 68.5t71 29.5t75.5 -37q1 11 1 18q0 223 -307 248v-530q0 -61 33 -79q23 -13 89 -13l44 1v-66q-193 6 -236 6t-236 -6v66l44 -1q66 0 89 13q33 18 33 79v530q-309 -24 -309 -248q0 -7 1 -18q34 37 75.5 37 t71 -29.5t29.5 -68.5t-29 -70t-68 -31q-59 0 -96.5 57t-37.5 119q0 145 114 228q95 70 249 84v19q0 61 -33 79q-23 13 -89 13l-44 -1v66q193 -6 236 -6t236 6v-66l-44 1q-66 0 -89 -13q-33 -18 -33 -79v-19q153 -15 248 -84q113 -83 113 -228z" />
+<glyph unicode="&#x3f0;" horiz-adv-x="1028" d="M976 259q0 -283 -152 -283q-105 0 -150 221q-26 130 -28 307l-293 -235q-8 -293 -123 -293q-64 0 -64 96q0 206 188 352q-5 124 -38 236q-49 163 -136 163q-80 0 -92 -161h-36v15q0 283 152 283q108 0 152 -213q26 -127 26 -300l288 232q15 281 122 281q46 0 60 -37 q8 -20 8 -76q0 -171 -187 -321q6 -129 40 -243q50 -170 135 -170q80 0 92 161h36v-15z" />
+<glyph unicode="&#x3f1;" horiz-adv-x="998" d="M52 459q0 200 126 350.5t321 150.5t320.5 -139t125.5 -340t-127.5 -353t-329.5 -152q-235 0 -360 207q32 -291 199 -376q23 -12 303 -64q166 -30 188 -185h-44q-64 61 -194 63q-181 2 -210 9q-318 80 -318 829zM782 406q0 187 -65 326q-84 180 -250 180q-134 0 -200 -121 q-52 -96 -52 -262.5t67 -311.5q87 -187 251 -187q249 0 249 376z" />
+<glyph unicode="&#x3f2;" horiz-adv-x="920" d="M839 276q29 0 29 -22.5t-27 -74.5q-106 -203 -329 -203q-194 0 -326.5 144.5t-132.5 343t132 347.5t330 149q99 0 207 -48q131 -58 131 -141t-81 -83q-47 0 -74 56q-48 99 -52 105q-43 56 -128 56q-60 0 -120 -34q-168 -95 -168 -403t178 -404q63 -34 123 -34 q113 0 181 64q40 37 74 109.5t53 72.5z" />
+<glyph unicode="&#x3f3;" horiz-adv-x="588" d="M385 -107q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29q158 0 158 281v861q0 39 -9 60q-20 45 -148 45h-27v68l324 23v-1053z" />
+<glyph unicode="&#x3f4;" horiz-adv-x="1445" d="M722 -43q-280 0 -467 214t-187 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503t-187.5 -499t-467.5 -213.5zM915 1286q-92 54 -192 54t-191 -53q-250 -146 -261 -556h903q-11 410 -259 555zM535 64q91 -56 185 -56t188 55q258 151 267 608h-905q8 -450 265 -607z" />
+<glyph unicode="&#x3f5;" horiz-adv-x="920" d="M839 276q29 0 29 -22.5t-27 -74.5q-106 -203 -329 -203q-194 0 -326.5 144.5t-132.5 343t132 347.5t330 149q99 0 207 -48q131 -58 131 -141t-81 -83q-47 0 -74 56q-48 99 -52 105q-43 56 -128 56q-60 0 -120 -34q-157 -88 -167 -371h330q59 0 59 -38.5t-59 -38.5h-330 q14 -271 177 -359q63 -34 123 -34q113 0 181 64q40 37 74 109.5t53 72.5z" />
+<glyph unicode="&#x3f6;" horiz-adv-x="920" d="M406 960q198 0 330 -149t132 -347.5t-132.5 -343t-326.5 -144.5q-223 0 -329 203q-27 52 -27 74.5t29 22.5q19 0 53 -72.5t74 -109.5q68 -64 181 -64q60 0 123 34q163 88 177 359h-330q-59 0 -59 38.5t59 38.5h330q-10 283 -167 371q-60 34 -120 34q-85 0 -128 -56 q-4 -6 -52 -105q-27 -56 -74 -56q-81 0 -81 83t131 141q108 48 207 48z" />
+<glyph unicode="&#x3f7;" horiz-adv-x="1076" d="M736 1287l-82 2q-137 0 -159 -37q-13 -22 -13 -58v-66q1 -34 1 -47q193 -16 344 -114q180 -118 180 -293.5t-181 -293.5q-152 -99 -343 -114v-110q0 -39 7 -56q16 -40 202 -40q21 0 44 1v-61q-75 6 -154 6h-359q-80 0 -155 -6v61l81 -2q137 0 160 37q12 20 12 60v1038 q0 37 -7 54q-16 39 -225 39h-21v62q75 -6 155 -6h359q79 0 154 6v-62zM483 311q328 36 328 364t-328 362v-726z" />
+<glyph unicode="&#x3f8;" horiz-adv-x="990" d="M493 960q194 0 319.5 -138.5t125.5 -340t-127.5 -353.5t-329.5 -152q-145 0 -245 113q0 -23 0.5 -79.5t0.5 -84.5q0 -214 -36 -342h-149q37 173 37 311v1085q-1 55 -1 82q0 214 36 342h149q-37 -173 -37 -311v-218q101 86 257 86zM775 406q0 187 -65 326 q-84 180 -250 180q-108 0 -166 -84.5t-58 -197.5v-344q0 -110 89 -183t201 -73q249 0 249 376z" />
+<glyph unicode="&#x3f9;" horiz-adv-x="1335" d="M1243 320q0 -11 -5 -23q-63 -157 -191.5 -248.5t-294.5 -91.5q-288 0 -486 213t-198 502.5t198.5 503.5t485.5 214q166 0 294.5 -91.5t191.5 -248.5q5 -12 5 -23q0 -24 -23 -24q-15 0 -27.5 28.5t-49.5 95.5q-132 203 -366 203q-102 0 -209 -52q-298 -145 -298 -613.5 t322 -606.5q96 -41 185 -41q234 0 366 203q20 31 52 101q10 23 25 23q23 0 23 -24z" />
+<glyph unicode="&#x3fa;" horiz-adv-x="2085" d="M2019 0q-242 6 -344.5 6t-175.5 -6v62h5q161 0 161 58q0 15 -4 27l-316 968l-323 -1001q-13 -39 -39.5 -39t-38.5 37l-329 1003l-296 -910q-10 -31 -10 -39q0 -53 63 -81q48 -22 109 -23v-62q-155 6 -239 6t-174 -6v62q152 0 195 132l378 1156q13 39 38.5 39t37.5 -37 l328 -1003l323 1001q13 39 39.5 39t38.5 -37l395 -1207q6 -19 23 -53q23 -30 134 -30h21v-62z" />
+<glyph unicode="&#x3fb;" horiz-adv-x="1531" d="M656 267q-25 0 -40 41l-167 462l-199 -365q-41 -75 -41 -117.5t16.5 -110.5t16.5 -103q0 -98 -103 -98q-36 0 -61.5 26.5t-25.5 62.5q0 93 83 247l327 607q22 41 41 41q25 0 40 -41l169 -463l250 463q22 41 41 41q25 0 40 -41l234 -640q48 -131 86 -152q25 -14 116 -14 v-49q-83 -1 -195 -88h-30q-55 105 -97 221l-208 573l-252 -462q-22 -41 -41 -41z" />
+<glyph unicode="&#x3fc;" horiz-adv-x="990" d="M184 818q107 142 305 142t323.5 -138.5t125.5 -340t-127.5 -353.5t-329.5 -152q-145 0 -245 113q0 -24 0.5 -82t0.5 -100.5t-2 -86.5h429v-100h-436q-8 -82 -27 -151h-149q17 80 26 151h-68v100h77q2 35 2 69v594q0 209 95 335zM775 406q0 187 -65 326q-84 180 -250 180 q-108 0 -166 -84.5t-58 -197.5v-344q0 -110 89 -183t201 -73q249 0 249 376z" />
+<glyph unicode="&#x3fd;" horiz-adv-x="1335" d="M583 1390q288 0 486 -213t198 -502.5t-199 -503.5t-485 -214q-167 0 -295.5 91.5t-190.5 248.5q-5 12 -5 23q0 24 23 24q14 0 27 -28.5t50 -95.5q132 -203 366 -203q102 0 209 52q298 145 298 613.5t-322 606.5q-96 41 -185 41q-234 0 -366 -203q-21 -31 -52 -101 q-11 -23 -25 -23q-23 0 -23 24q0 11 5 23q62 157 191 248.5t295 91.5z" />
+<glyph unicode="&#x3fe;" horiz-adv-x="1335" d="M1243 320q0 -11 -5 -23q-63 -157 -191.5 -248.5t-294.5 -91.5q-288 0 -486 213t-198 502.5t198.5 503.5t485.5 214q166 0 294.5 -91.5t191.5 -248.5q5 -12 5 -23q0 -24 -23 -24q-15 0 -27.5 28.5t-49.5 95.5q-132 203 -366 203q-102 0 -209 -52q-298 -145 -298 -613.5 t322 -606.5q96 -41 185 -41q234 0 366 203q20 31 52 101q10 23 25 23q23 0 23 -24zM870 672q0 -46 -32 -78t-78 -32t-78 32t-32 78t32 78t78 32t78 -32t32 -78z" />
+<glyph unicode="&#x3ff;" horiz-adv-x="1335" d="M583 1390q288 0 486 -213t198 -502.5t-199 -503.5t-485 -214q-167 0 -295.5 91.5t-190.5 248.5q-5 12 -5 23q0 24 23 24q14 0 27 -28.5t50 -95.5q132 -203 366 -203q102 0 209 52q298 145 298 613.5t-322 606.5q-96 41 -185 41q-234 0 -366 -203q-21 -31 -52 -101 q-11 -23 -25 -23q-23 0 -23 24q0 11 5 23q62 157 190.5 248.5t295.5 91.5zM685 675q0 -46 -32.5 -78t-78 -32t-77.5 32t-32 78t32 78t77.5 32t78 -32t32.5 -78z" />
+<glyph unicode="&#x400;" horiz-adv-x="1354" d="M68 0v61q47 -1 53 -1q125 0 142 38q7 16 7 48v1053q0 30 -7 47q-15 36 -152 36q-20 0 -43 -1v62h1108l56 -442h-49q-24 218 -99.5 299t-288.5 81h-263q-54 0 -71 -13.5t-17 -65.5v-474h178q134 0 173.5 46.5t39.5 182.5h51v-521h-51q0 136 -40 183t-173 47h-178v-526 q0 -52 17 -65.5t71 -13.5h273q236 0 326 111q67 84 107 336h49l-84 -508h-1135zM493 1532q0 28 20 51t44.5 23t43.5 -13l292 -195l-26 -50l-328 123q-46 17 -46 61z" />
+<glyph unicode="&#x401;" horiz-adv-x="1354" d="M68 0v61q47 -1 53 -1q125 0 142 38q7 16 7 48v1053q0 30 -7 47q-15 36 -152 36q-20 0 -43 -1v62h1108l56 -442h-49q-24 218 -99.5 299t-288.5 81h-263q-54 0 -71 -13.5t-17 -65.5v-474h178q134 0 173.5 46.5t39.5 182.5h51v-521h-51q0 136 -40 183t-173 47h-178v-526 q0 -52 17 -65.5t71 -13.5h273q236 0 326 111q67 84 107 336h49l-84 -508h-1135zM958 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM585.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33 t78 -32z" />
+<glyph unicode="&#x402;" horiz-adv-x="1668" d="M1503.5 711q111.5 -116 111.5 -293.5t-100 -307.5t-258 -130q-88 0 -161 47t-73 130q0 92 90.5 92t90.5 -90q0 -78 -80 -91q54 -39 129 -39q112 0 163 138q36 96 36 242t-74.5 257.5t-224.5 111.5q-100 0 -230 -87t-130 -182v-353q0 -40 10 -58q18 -33 114 -33q19 0 41 1 v-66q-199 6 -249.5 6t-256.5 -6v66q28 -1 71.5 -1t69 16.5t25.5 80.5v1055q0 64 -109 64t-189.5 -9.5t-126.5 -52.5t-65 -141h-46l22 264h1206l22 -264h-47q-20 102 -67 144t-151 53q-60 6 -179 6q-95 0 -95 -65v-571q152 182 408 182q191 0 302.5 -116z" />
+<glyph unicode="&#x403;" horiz-adv-x="1216" d="M744 1281h-214q-51 0 -68.5 -13t-17.5 -66v-1065q0 -22 8 -39q17 -37 223 -37h22v-61q-74 6 -120 6h-382q-55 0 -127 -6v61q8 0 26 -0.5t28 -0.5q124 0 141 38q7 15 7 48v1053q0 31 -7 47q-15 35 -170 35h-25v62h1026l55 -442h-49q-24 212 -82 285q-74 95 -274 95z M893 1532q0 -44 -46 -61l-328 -123l-26 50l292 195q19 13 43.5 13t44.5 -23t20 -51z" />
+<glyph unicode="&#x404;" horiz-adv-x="1335" d="M1266 934q0 -26 -28.5 -26t-35.5 32q-34 154 -155 271t-272 117q-105 0 -207 -50q-263 -129 -294 -510q144 95 274 95t224 -58l143 -108q80 -58 165 -58q53 0 105.5 30.5t48.5 30.5q19 0 19 -26t-31 -51q-111 -90 -214.5 -90t-179.5 67q-177 155 -355 155 q-122 0 -202 -45l-1 -38v-19q0 -454 322 -595q94 -41 185 -41q179 0 309 130q55 56 77 101.5t47 135.5q8 29 23 29q27 0 27 -22q0 -6 -2 -17q-35 -180 -178.5 -298.5t-327.5 -118.5q-288 0 -486 213t-198 502.5t198.5 503.5t485.5 214q193 0 363 -169l99 144q17 25 31 25 q21 0 21 -33v-423z" />
+<glyph unicode="&#x405;" horiz-adv-x="1007" d="M860.5 616.5q79.5 -107.5 79.5 -262.5t-110.5 -276t-277.5 -121q-236 0 -362 137l-72 -111q-16 -26 -30 -26q-20 0 -20 29v431q0 29 24 29q30 0 30 -72q0 -143 117 -250t311 -107q114 0 189 84t75 192.5t-59 184.5t-170 104q-88 17 -260 65q-116 42 -186.5 140t-70.5 221 q0 160 111 271t278 111t309 -139l69 112q17 27 29 27q24 0 24 -33v-429q0 -28 -28 -28q-18 0 -23 22q-7 41 -25 122q-81 290 -360 290q-109 0 -183.5 -74.5t-74.5 -183.5q0 -189 199 -250q85 -19 252 -62q136 -40 215.5 -147.5z" />
+<glyph unicode="&#x406;" horiz-adv-x="736" d="M670 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62z" />
+<glyph unicode="&#x407;" horiz-adv-x="736" d="M670 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62zM629 1574 q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM256.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x408;" horiz-adv-x="970" d="M752 284q0 -141 -112.5 -234t-245 -93t-229.5 73t-97 190q0 49 30.5 81.5t78.5 32.5t79 -31.5t31 -78.5q0 -110 -121 -110h-4q71 -114 217 -114q99 0 156 101q47 83 47 190v910q0 29 -9 47q-19 36 -223 36h-32v62q78 -6 161 -6h221q73 0 203 6v-62l-42 2q-60 0 -85 -14 t-25 -69z" />
+<glyph unicode="&#x409;" horiz-adv-x="2095" d="M1478 1281l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-477h256q188 0 334 -85q174 -101 174 -269t-135.5 -267.5t-302.5 -99.5h-703v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1053q0 32 -9 49q-18 34 -153 34h-67q-188 0 -215 -35q-11 -14 -11 -63 q0 -227 -12 -426q-46 -757 -354 -757q-86 0 -148 60t-62 146q0 45 30 76t74 31t74 -30t30 -75q0 -81 -77 -102q31 -14 75 -14q200 0 256 520q21 195 21 511q0 113 -13 132q-18 27 -187 27v61h1127v-62zM1743 147q88 86 88 221t-87 222t-210 87h-271v-537q0 -53 16.5 -66 t69.5 -13h177q129 0 217 86z" />
+<glyph unicode="&#x40a;" horiz-adv-x="2041" d="M1424 1284l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-480h256q188 0 334 -85q174 -101 174 -269t-135.5 -267.5t-302.5 -99.5h-703v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v530h-590v-530q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61 q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-474h590v474q0 29 -8 45q-17 34 -148 34h-46v62q70 -6 112 -6h367q43 0 113 6v-62zM1689 147q88 86 88 221 t-87 222t-210 87h-271v-537q0 -53 16.5 -66t69.5 -13h177q129 0 217 86z" />
+<glyph unicode="&#x40b;" horiz-adv-x="1647" d="M1595 0q-199 6 -238 6t-244 -6v66q28 -1 69.5 -1t64.5 12q33 19 33 76v429q0 95 -44 161t-134 66q-130 0 -219.5 -105.5t-89.5 -237.5v-310q0 -40 10 -58q18 -33 114 -33q19 0 41 1v-66q-199 6 -249.5 6t-256.5 -6v66q28 -1 71.5 -1t69 16.5t25.5 80.5v1055q0 64 -109 64 t-189.5 -9.5t-126.5 -52.5t-65 -141h-46l22 264h1206l22 -264h-47q-20 102 -67 144t-151 53q-60 6 -179 6q-95 0 -95 -65v-552q43 86 134 139t189 53q312 0 312 -314v-412q0 -65 130 -65q17 0 37 1v-66z" />
+<glyph unicode="&#x40c;" horiz-adv-x="1514" d="M649 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-447q324 0 480 158q72 73 163 294q65 158 167 158q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-41 -17 -97.5 -159.5t-116.5 -215.5q-106 -130 -287 -165v-8q116 -16 221 -77.5t151 -157.5 q25 -54 39 -150l25 -181q30 -158 118 -158q99 0 131 175q6 31 24 31q24 0 24 -33q0 -86 -51.5 -151t-134.5 -65q-330 0 -330 318q0 13 1 40v40q0 136 -83 239.5t-216 103.5h-188v-559q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-347q-43 0 -114 -6v61q8 0 26.5 -0.5 t28.5 -0.5q125 0 141 40q6 15 6 44v1066q0 27 -7 41q-16 33 -176 33h-19v62q70 -6 119 -6h342q50 0 120 6v-62zM1093 1532q0 -44 -46 -61l-328 -123l-26 50l292 195q19 13 43.5 13t44.5 -23t20 -51z" />
+<glyph unicode="&#x40d;" horiz-adv-x="1631" d="M1564 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61q-71 6 -113 6h-361q-36 0 -107 -6v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v964l-734 -1008l1 -1q14 -30 90 -35q3 0 30 -0.5t77 0.5v-61q-71 6 -115 6h-358 q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-967l734 1009q-15 37 -149 37h-46v62q70 -6 112 -6h356q43 0 113 6v-62zM563 1532 q0 28 20 51t44.5 23t43.5 -13l292 -195l-26 -50l-328 123q-46 17 -46 61z" />
+<glyph unicode="&#x40e;" horiz-adv-x="1591" d="M441 -20q-135 0 -214.5 72.5t-79.5 206.5q0 106 99 106q42 0 69.5 -27t27.5 -69.5t-28 -70t-71 -27.5q-14 0 -35 5q20 -70 87 -106t149.5 -36t168.5 135q53 83 136 234l-466 798q-10 19 -37 52q-33 29 -170 29h-9v64q196 -6 246 -6t234 6v-64h-4q-91 0 -91 -41 q0 -14 18 -45l371 -636l345 590q23 39 23 65q0 65 -73 67v64q183 -6 233.5 -6t152.5 6v-64q-171 -2 -248 -134l-550 -940q-133 -228 -284 -228zM1203 1516q0 -85 -140 -130q-101 -33 -211 -33t-211 33q-140 45 -140 130q0 39 25 64.5t64 25.5t64 -25.5t25 -70.5t-38 -70 q63 -24 174 -24h74q111 0 174 24q-38 25 -38 70t25 70.5t64 25.5t64 -25.5t25 -64.5z" />
+<glyph unicode="&#x40f;" horiz-adv-x="1481" d="M1413 0h-579q-30 -148 -36 -287h-115q-6 139 -36 287h-579v62h106q77 6 90 38q6 15 6 41v1062q0 52 -39 69q-25 11 -85 11h-78v61q71 -6 108 -6h360q42 0 113 6v-61q-49 1 -76 1t-33 -1q-77 -7 -90 -39q-6 -15 -6 -41v-1141h590v1141q0 52 -39 69q-25 11 -85 11h-78v61 q71 -6 107 -6h361q42 0 113 6v-61q-49 1 -76 1t-32 -1q-77 -7 -90 -39q-6 -15 -6 -41v-1062q0 -27 6 -41q16 -39 137 -39h31q22 1 30 1v-62z" />
+<glyph unicode="&#x410;" horiz-adv-x="1484" d="M1417 0q-127 6 -297.5 6t-244.5 -6v61h5q157 0 157 59q0 29 -39 136l-70 192h-487l-61 -163q-34 -90 -34 -123q0 -51 52 -78q42 -23 97 -23v-61q-189 6 -239.5 6t-187.5 -6v61q174 2 219 133l409 1177q14 40 46 40t46 -40l425 -1231q21 -61 84 -75q19 -5 77 -5q19 0 43 1 v-61zM906 510l-222 641l-220 -641h442z" />
+<glyph unicode="&#x411;" horiz-adv-x="1346" d="M1104 636q174 -101 174 -269t-135.5 -267.5t-302.5 -99.5h-772v61q62 -2 63 -2q113 0 134 45q5 11 5 42v1053q0 31 -7 47q-15 35 -170 35h-25v62h1016l55 -442h-49q-24 212 -82 285q-74 95 -274 95h-214q-51 0 -68.5 -13.5t-17.5 -65.5v-481h336q188 0 334 -85zM994 147 q88 86 88 221t-87 222t-210 87h-351v-537q0 -53 16.5 -66t69.5 -13h257q129 0 217 86z" />
+<glyph unicode="&#x412;" horiz-adv-x="1346" d="M1278 360q0 -161 -135.5 -260.5t-302.5 -99.5h-772v61q62 -2 63 -2q113 0 134 45q5 11 5 42v1051q0 31 -5 42q-19 43 -152 43q-21 0 -45 -1v62h720q161 0 290 -83q148 -95 148 -247q0 -120 -98.5 -203t-227.5 -108q147 -16 262.5 -109t115.5 -233zM720 721q130 0 222 82 t92 202.5t-73 198t-186 77.5h-255q-53 0 -69.5 -13t-16.5 -66v-481h286zM994 147q88 86 88 214t-76.5 222t-200.5 94h-371v-537q0 -53 16.5 -66t69.5 -13h257q129 0 217 86z" />
+<glyph unicode="&#x413;" horiz-adv-x="1216" d="M744 1281h-214q-51 0 -68.5 -13t-17.5 -66v-1065q0 -22 8 -39q17 -37 223 -37h22v-61q-74 6 -120 6h-382q-55 0 -127 -6v61q8 0 26 -0.5t28 -0.5q124 0 141 38q7 15 7 48v1053q0 31 -7 47q-15 35 -170 35h-25v62h1026l55 -442h-49q-24 212 -82 285q-74 95 -274 95z" />
+<glyph unicode="&#x414;" horiz-adv-x="1580" d="M1514 1281l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1054q0 -27 13.5 -52t92.5 -31h109q0 -81 9 -111q17 -57 76 -72q-77 0 -197 61t-197 61h-888q-81 0 -175 -61t-168 -61h-5v2q54 12 71 73q8 32 8 108q166 0 198 12q63 22 124 141q236 457 236 990q0 39 -14 53.5t-48 19 t-138 4.5v62h1108v-62zM1125 161v1014q0 44 -8 59q-25 47 -204 47t-205 -49q-9 -17 -11 -85q-5 -193 -52.5 -425.5t-142.5 -434.5l-80 -153q-4 -8 -4 -20q0 -35 56.5 -44t247.5 -9q276 0 331 12t66 37q6 13 6 51z" />
+<glyph unicode="&#x415;" horiz-adv-x="1354" d="M68 0v61q47 -1 53 -1q125 0 142 38q7 16 7 48v1053q0 30 -7 47q-15 36 -152 36q-20 0 -43 -1v62h1108l56 -442h-49q-24 218 -99.5 299t-288.5 81h-263q-54 0 -71 -13.5t-17 -65.5v-474h178q134 0 173.5 46.5t39.5 182.5h51v-521h-51q0 136 -40 183t-173 47h-178v-526 q0 -52 17 -65.5t71 -13.5h273q236 0 326 111q67 84 107 336h49l-84 -508h-1135z" />
+<glyph unicode="&#x416;" horiz-adv-x="2214" d="M1399 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-447q289 8 434 167q62 67 159 289q67 154 167 154q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-41 -17 -97.5 -159.5t-116.5 -215.5q-106 -130 -287 -165v-8q116 -16 221 -77t151 -158 q25 -54 39 -150l25 -181q30 -158 118 -158q99 0 131 175q6 31 24 31q24 0 24 -33q0 -86 -51.5 -151t-134.5 -65q-330 0 -330 318q0 13 1 40v40q0 136 -83 239.5t-216 103.5h-138v-559q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-344q-49 0 -120 -6v61h10 q169 0 186 33q9 17 9 45v559h-138q-133 0 -216 -103.5t-83 -239.5q0 -13 0.5 -40t0.5 -40q0 -318 -330 -318q-83 0 -134.5 65t-51.5 151q0 33 24 33q18 0 24 -31q32 -175 131 -175q88 0 118 158l23 169q16 108 41 162q46 97 151 158t221 77v8q-181 35 -287 165 q-60 73 -116.5 215.5t-97.5 159.5q10 -22 10 -53t-26 -56.5t-65 -25.5q-90 0 -90 92q0 54 39 95t92 41q100 0 167 -154q97 -222 159 -289q145 -159 434 -167v447q0 29 -6 44q-16 40 -142 40l-57 -2v62q70 -6 120 -6h344q50 0 120 6v-62z" />
+<glyph unicode="&#x417;" horiz-adv-x="1244" d="M1176 359q0 -85 -50 -164q-77 -122 -218.5 -180t-302.5 -58q-258 0 -386 70q-78 -70 -98 -70q-33 0 -34 33l-12 275q-1 32 41 32q22 0 26.5 -6t11.5 -51t26 -79q80 -144 421 -144q160 0 260 93t100 250t-98.5 247t-255.5 90h-117q-77 -1 -115.5 -1t-38.5 30q0 16 13 22.5 t170.5 18t256.5 77.5q150 100 150 257q0 111 -103 174q-87 53 -225.5 53t-242.5 -62.5t-130 -138.5q-4 -20 -17 -58q-10 -20 -35 -20q-41 0 -39 46l9 246q2 49 35 49q26 0 112 -85q136 85 318 85t326 -64q185 -82 185 -227q0 -261 -386 -360q172 -25 295 -115 q148 -108 148 -265z" />
+<glyph unicode="&#x418;" horiz-adv-x="1631" d="M1564 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61q-71 6 -113 6h-361q-36 0 -107 -6v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v964l-734 -1008l1 -1q14 -30 90 -35q3 0 30 -0.5t77 0.5v-61q-71 6 -115 6h-358 q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-967l734 1009q-15 37 -149 37h-46v62q70 -6 112 -6h356q43 0 113 6v-62z" />
+<glyph unicode="&#x419;" horiz-adv-x="1631" d="M1564 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61q-71 6 -113 6h-361q-36 0 -107 -6v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v964l-734 -1008l1 -1q14 -30 90 -35q3 0 30 -0.5t77 0.5v-61q-71 6 -115 6h-358 q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-967l734 1009q-15 37 -149 37h-46v62q70 -6 112 -6h356q43 0 113 6v-62zM1163 1516 q0 -85 -140 -130q-101 -33 -211 -33t-211 33q-140 45 -140 130q0 39 25 64.5t64 25.5t64 -25.5t25 -70.5t-38 -70q63 -24 174 -24h74q111 0 174 24q-38 25 -38 70t25 70.5t64 25.5t64 -25.5t25 -64.5z" />
+<glyph unicode="&#x41a;" horiz-adv-x="1514" d="M649 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-447q324 0 480 158q72 73 163 294q65 158 167 158q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-41 -17 -97.5 -159.5t-116.5 -215.5q-106 -130 -287 -165v-8q116 -16 221 -77.5t151 -157.5 q25 -54 39 -150l25 -181q30 -158 118 -158q99 0 131 175q6 31 24 31q24 0 24 -33q0 -86 -51.5 -151t-134.5 -65q-330 0 -330 318q0 13 1 40v40q0 136 -83 239.5t-216 103.5h-188v-559q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-347q-43 0 -114 -6v61q8 0 26.5 -0.5 t28.5 -0.5q125 0 141 40q6 15 6 44v1066q0 27 -7 41q-16 33 -176 33h-19v62q70 -6 119 -6h342q50 0 120 6v-62z" />
+<glyph unicode="&#x41b;" horiz-adv-x="1554" d="M1488 1281l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-1054q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1053q0 32 -9 49q-18 34 -153 34h-67q-188 0 -215 -35q-11 -14 -11 -63q0 -227 -12 -426 q-46 -757 -354 -757q-86 0 -148 60t-62 146q0 45 30 76t74 31t74 -30t30 -75q0 -81 -77 -102q31 -14 75 -14q200 0 256 520q21 195 21 511q0 113 -13 132q-18 27 -187 27v61h1137v-62z" />
+<glyph unicode="&#x41c;" horiz-adv-x="1793" d="M1726 1281l-56 2q-125 0 -141 -41q-6 -15 -6 -45v-1058q0 -26 8 -43q17 -35 185 -35h10v-61q-75 6 -119 6h-334q-38 0 -113 -6v61h76q63 0 87 10q40 17 40 70v1140h-2l-483 -1245q-14 -36 -36 -36t-39 43l-476 1222h-2v-1064q0 -140 200 -140h3v-61q-209 6 -229 6 t-231 -6v61h3q199 0 199 140v1003q0 22 -6 38q-12 32 -89 39q-6 1 -32.5 1t-74.5 -1v62h341q45 0 61 -42l428 -1102l430 1108q14 36 49 36h349v-62z" />
+<glyph unicode="&#x41d;" horiz-adv-x="1480" d="M1413 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61q-71 6 -113 6h-361q-36 0 -107 -6v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v530h-590v-530q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61 q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-474h590v474q0 29 -8 45q-17 34 -148 34h-46v62q70 -6 112 -6h356q43 0 113 6v-62z" />
+<glyph unicode="&#x41e;" horiz-adv-x="1445" d="M722 -43q-280 0 -467 214t-187 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503t-187.5 -499t-467.5 -213.5zM1175 696q0 438 -260 590q-92 54 -192 54t-191 -53q-262 -153 -262 -591q0 -469 265 -632q91 -56 185 -56t188 55q267 156 267 633z" />
+<glyph unicode="&#x41f;" horiz-adv-x="1480" d="M1300 6h-361q-36 0 -107 -6v61h78q60 0 85 11q39 17 39 69v1141h-590v-1141q0 -26 6 -41q13 -32 90 -39q6 0 33 -0.5t76 0.5v-61q-71 6 -113 6h-360q-37 0 -108 -6v61h78q60 0 85 11q39 17 39 69v1062q0 26 -6 41q-13 32 -90 38h-106v62h1345v-62q-8 0 -29 0.5t-32 0.5 q-121 0 -137 -39q-6 -14 -6 -41v-1062q0 -26 6 -41q13 -32 90 -39q5 0 32 -0.5t76 0.5v-61q-71 6 -113 6z" />
+<glyph unicode="&#x420;" horiz-adv-x="1295" d="M1074 1249q154 -106 154 -268t-142 -262t-307 -100h-335v-473q0 -32 7 -48q17 -37 181 -37h17v-61q-72 6 -133 6h-326q-50 0 -122 -6v61l55 -1q122 0 140 38q7 15 7 48v1051q0 32 -7 48q-16 37 -158 37q-18 0 -37 -1v62h695q174 0 311 -94zM1024 977q0 161 -75.5 232.5 t-237.5 71.5h-186q-53 0 -69.5 -13t-16.5 -66v-532h272q313 0 313 307z" />
+<glyph unicode="&#x421;" horiz-adv-x="1335" d="M1267 854q0 -26 -29 -26t-35 32q-12 60 -47 178q-51 127 -151 208.5t-217 81.5t-220 -50q-298 -145 -298 -613.5t322 -606.5q96 -41 185 -41q140 0 256 85t159 218q17 52 27 140q4 33 23 33q24 0 24 -35q0 -205 -154 -353t-360 -148q-288 0 -486 213t-198 502.5 t198.5 503.5t485.5 214q193 0 363 -169l99 144q17 25 31 25q22 0 22 -33v-503z" />
+<glyph unicode="&#x422;" horiz-adv-x="1413" d="M878 1282q-46 0 -65.5 -11.5t-19.5 -53.5v-1071q0 -25 10 -47q18 -38 243 -38h34v-61q-84 6 -154 6h-439q-71 0 -155 -6v61q9 0 35.5 -0.5t40.5 -0.5q184 0 202 39q8 17 8 47v1072q0 43 -29 56q-17 8 -66 8q-256 0 -321 -62.5t-86 -318.5h-48l36 442h1206l36 -442h-49 q-22 262 -88.5 321.5t-330.5 59.5z" />
+<glyph unicode="&#x423;" horiz-adv-x="1591" d="M441 -20q-135 0 -214.5 72.5t-79.5 206.5q0 106 99 106q42 0 69.5 -27t27.5 -69.5t-28 -70t-71 -27.5q-14 0 -35 5q20 -70 87 -106t149.5 -36t168.5 135q53 83 136 234l-466 798q-10 19 -37 52q-33 29 -170 29h-9v64q196 -6 246 -6t234 6v-64h-4q-91 0 -91 -41 q0 -14 18 -45l371 -636l345 590q23 39 23 65q0 65 -73 67v64q183 -6 233.5 -6t152.5 6v-64q-171 -2 -248 -134l-550 -940q-133 -228 -284 -228z" />
+<glyph unicode="&#x424;" horiz-adv-x="1394" d="M1025 1287l-82 2q-135 0 -157 -37q-14 -23 -14 -76v-81q215 -21 368 -118q186 -118 186 -304t-186 -303q-153 -97 -368 -117v-97q0 -39 7 -56q16 -40 202 -40q21 0 44 1v-61q-75 6 -154 6h-359q-80 0 -155 -6v61l81 -2q136 0 158 37q14 23 14 75v82q-210 21 -361 120 q-181 118 -181 300.5t181 300.5q152 99 361 121v99q0 37 -7 54q-16 39 -225 39h-21v62q75 -6 155 -6h359q79 0 154 6v-62zM1130 674q0 339 -358 376v-753q164 13 261 110t97 267zM610 1050q-347 -40 -347 -375.5t347 -375.5v751z" />
+<glyph unicode="&#x425;" horiz-adv-x="1518" d="M1450 0q-127 6 -299 6t-244 -6v61q128 5 128 59q0 10 -320 493l-281 -414q-19 -28 -19 -48q0 -43 38.5 -66t84.5 -24v-61q-74 6 -165 6t-305 -6v61q196 0 285 131l323 477l-362 547q-34 51 -99 64q-24 4 -81 4h-41v62q112 -6 292.5 -6t251.5 6v-62q-128 -5 -128 -58 q0 -13 268 -410l225 333q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62q81 -6 163.5 -6t306.5 6v-62q-198 -2 -285 -128l-271 -395l416 -629q35 -53 99 -66q25 -5 85 -5h38v-61z" />
+<glyph unicode="&#x426;" horiz-adv-x="1481" d="M1077 0h-1009v62h106q77 6 90 38q6 15 6 41v1062q0 52 -39 69q-25 11 -85 11h-78v61q71 -6 108 -6h360q42 0 113 6v-61q-49 1 -76 1t-33 -1q-77 -7 -90 -39q-6 -15 -6 -41v-1141h590v1141q0 52 -39 69q-25 11 -85 11h-78v61q71 -6 107 -6h361q42 0 113 6v-61q-49 1 -76 1 t-32 -1q-77 -7 -90 -39q-6 -15 -6 -41v-998q0 -69 14 -97q23 -47 173 -47h24q0 -12 -0.5 -39t-0.5 -40q0 -312 87 -376q-68 13 -125 92q-15 20 -73.5 125.5t-100 141t-130.5 35.5z" />
+<glyph unicode="&#x427;" horiz-adv-x="1601" d="M1535 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v545q-190 -218 -438 -218q-187 0 -312.5 111t-125.5 298v327q0 30 -7 43q-18 34 -156 34 q-19 0 -39 -1v62q73 -6 156 -6h270q84 0 156 6v-62q-48 1 -60 1q-118 0 -136 -34q-9 -17 -9 -51v-319q0 -149 90.5 -232t237.5 -83q208 0 373 205v430q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62z" />
+<glyph unicode="&#x428;" horiz-adv-x="2161" d="M2093 0h-2025v62h96q67 6 80 38q6 15 6 41v1062q0 52 -39 69q-25 11 -85 11h-58v61q71 -6 88 -6h350q32 0 103 6v-61q-45 1 -70 1t-29 -1q-67 -6 -80 -39q-6 -15 -6 -41v-1141h459q76 0 91 38q6 15 6 41v1062q0 52 -39 69q-25 11 -85 11h-58v61q71 -6 87 -6h341 q42 0 113 6v-61q-44 1 -69 1t-29 -1q-67 -6 -80 -39q-6 -15 -6 -41v-1062q0 -27 6 -41q16 -38 94 -38h459v1141q0 52 -39 69q-25 11 -85 11h-58v61q71 -6 87 -6h351q32 0 103 6v-61q-44 1 -69 1t-29 -1q-67 -6 -80 -39q-6 -15 -6 -41v-1062q0 -27 6 -41q16 -39 137 -39h31 q22 1 30 1v-62z" />
+<glyph unicode="&#x429;" horiz-adv-x="2161" d="M1757 0h-1689v62h96q67 6 80 38q6 15 6 41v1062q0 52 -39 69q-25 11 -85 11h-58v61q71 -6 88 -6h350q32 0 103 6v-61q-45 1 -70 1t-29 -1q-67 -6 -80 -39q-6 -15 -6 -41v-1141h459q76 0 91 38q6 15 6 41v1062q0 52 -39 69q-25 11 -85 11h-58v61q71 -6 87 -6h341 q42 0 113 6v-61q-44 1 -69 1t-29 -1q-67 -6 -80 -39q-6 -15 -6 -41v-1062q0 -27 6 -41q16 -38 94 -38h459v1141q0 52 -39 69q-25 11 -85 11h-58v61q71 -6 87 -6h351q32 0 103 6v-61q-44 1 -69 1t-29 -1q-67 -6 -80 -39q-6 -15 -6 -41v-998q0 -69 14 -97q23 -47 173 -47h24 q0 -12 -0.5 -39t-0.5 -40q0 -312 87 -376q-68 13 -125 92q-15 20 -73.5 125.5t-100 141t-130.5 35.5z" />
+<glyph unicode="&#x42a;" horiz-adv-x="1736" d="M1039 1281l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-477h336q188 0 334 -85q174 -101 174 -269t-135.5 -267.5t-302.5 -99.5h-772v61q62 -2 63 -2q113 0 134 45q5 11 5 42v1056q0 52 -17.5 65.5t-68.5 13.5h-101q-200 0 -274 -95q-58 -73 -82 -285h-49l55 442h916v-62z M1384 147q88 86 88 221t-87 222t-210 87h-351v-537q0 -53 16.5 -66t69.5 -13h257q129 0 217 86z" />
+<glyph unicode="&#x42b;" horiz-adv-x="1986" d="M649 1284l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-480h336q188 0 334 -85q174 -101 174 -269t-135.5 -267.5t-302.5 -99.5h-772v61q62 -2 63 -2q113 0 134 45q5 11 5 42v1055q0 32 -9 49q-18 34 -153 34h-40v62q71 -6 115 -6h355q41 0 111 6v-62zM994 147q88 86 88 221 t-87 222t-210 87h-351v-537q0 -53 16.5 -66t69.5 -13h257q129 0 217 86zM1920 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49 q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62z" />
+<glyph unicode="&#x42c;" horiz-adv-x="1346" d="M649 1284l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-480h336q188 0 334 -85q174 -101 174 -269t-135.5 -267.5t-302.5 -99.5h-772v61q62 -2 63 -2q113 0 134 45q5 11 5 42v1055q0 32 -9 49q-18 34 -153 34h-40v62q71 -6 115 -6h355q41 0 111 6v-62zM994 147q88 86 88 221 t-87 222t-210 87h-351v-537q0 -53 16.5 -66t69.5 -13h257q129 0 217 86z" />
+<glyph unicode="&#x42d;" horiz-adv-x="1335" d="M582 1390q287 0 485.5 -214t198.5 -503.5t-198 -502.5t-486 -213q-184 0 -327.5 118.5t-178.5 298.5q-2 11 -2 17q0 22 27 22q15 0 23 -29q25 -90 47 -135.5t77 -101.5q130 -130 309 -130q91 0 185 41q322 141 322 595v19l-1 38q-80 45 -202 45q-178 0 -355 -155 q-76 -67 -179.5 -67t-214.5 90q-31 25 -31 51t19 26q-4 0 48.5 -30.5t105.5 -30.5q85 0 161 56l147 110q94 58 224 58t274 -95q-31 381 -294 510q-102 50 -207 50q-151 0 -272 -117t-155 -271q-7 -32 -35.5 -32t-28.5 26v423q0 33 21 33q14 0 31 -25l99 -144 q170 169 363 169z" />
+<glyph unicode="&#x42e;" horiz-adv-x="1975" d="M649 1284l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-474h356q19 271 175.5 465t383.5 194t387.5 -215.5t160.5 -505t-160.5 -501t-394 -211.5t-394 211.5t-160.5 499.5v3h-354v-530q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5 t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62zM1705 700q0 448 -210 593q-69 47 -143 47q-182 0 -278 -226q-74 -177 -74 -418.5t72 -433.5q95 -254 280.5 -254t280.5 257q72 193 72 435z" />
+<glyph unicode="&#x42f;" horiz-adv-x="1508" d="M1297 6h-289q-69 0 -143 -6v61h26q157 0 171 34q7 17 7 46v511h-227q-113 0 -186 -69.5t-73 -227.5q0 -13 0.5 -40t0.5 -40q0 -318 -330 -318q-84 0 -135 65t-51 151q0 33 24 33q19 0 24 -31q30 -175 131 -175q87 0 118 158l25 182q14 97 39 149q59 125 224 182 q-135 33 -229 108q-115 91 -115 213q0 167 180 267q150 84 333 84h618v-62h-29q-153 0 -167 -40q-6 -18 -6 -45v-1055q0 -31 7 -46q17 -35 142 -35h27q20 1 26 1v-61q-74 6 -143 6zM1069 696v523q0 43 -32 57q-18 7 -69 7q-230 0 -314 -35q-143 -60 -143 -256 q0 -296 339 -296h219z" />
+<glyph unicode="&#x430;" horiz-adv-x="1070" d="M1018 190q0 -83 -47.5 -142.5t-122.5 -59.5t-120.5 51.5t-52.5 122.5q-35 -85 -111 -135.5t-186.5 -50.5t-205.5 50q-119 62 -119 178q0 179 213 279q131 61 394 76v78q0 110 -60.5 192t-166.5 82q-154 0 -231 -98q46 0 78 -26.5t32 -70t-28.5 -71.5t-71.5 -28 q-98 0 -98 99q0 113 102 178.5t222 65.5q183 0 293 -119q50 -54 63.5 -108t13.5 -144v-427q0 -40 20.5 -74t57.5 -34q79 0 79 175q0 28 -2 80h55v-119zM660 300v214q-171 -6 -291 -71q-152 -82 -152 -236q0 -78 56.5 -130.5t135.5 -52.5q111 0 181 81.5t70 194.5z" />
+<glyph unicode="&#x431;" horiz-adv-x="1054" d="M528 960q198 0 336 -151t138 -350.5t-139 -341t-326.5 -141.5t-319.5 119t-159 295q-21 133 -21 236q0 426 162 616q82 96 160 121.5t321 45.5q48 4 123 20q34 16 49 47h66q-14 -97 -82.5 -159.5t-193 -73.5t-239.5 -20q-131 -24 -202 -113q-89 -113 -111 -462 q54 138 172 225t266 87zM776 188q47 92 47 292.5t-56 292.5q-84 138 -244.5 138t-241.5 -143q-51 -90 -51 -294.5t55 -299.5q83 -144 246.5 -144t244.5 158z" />
+<glyph unicode="&#x432;" horiz-adv-x="1118" d="M1002 251q0 -49 -27 -97q-87 -154 -315 -154h-598v66q72 0 108.5 4t47.5 25t11 72v589q0 51 -11 72t-47.5 25t-108.5 4v66h557q223 0 312 -136q31 -47 31 -95q0 -82 -73.5 -137.5t-164.5 -72.5q105 -10 191.5 -71.5t86.5 -159.5zM797 690q0 80 -55.5 123.5t-137.5 43.5 h-148q-64 0 -78 -13t-14 -75v-266h199q168 0 219 121q15 36 15 66zM608 66q93 0 158 49.5t65 138t-54.5 145.5t-140.5 57h-272v-302q0 -62 14 -75t78 -13h152z" />
+<glyph unicode="&#x433;" horiz-adv-x="1035" d="M535 856q-112 0 -122 -2q-32 -6 -40 -31q-3 -10 -3 -55v-597q0 -47 7 -62q10 -26 51 -34.5t150 -8.5v-66q-80 6 -178 6t-344 -6v66q140 0 157 30q10 18 10 71v589q0 52 -10 70q-16 30 -151 30h-6v67h846l38 -328h-53q-18 182 -98 229q-55 32 -254 32z" />
+<glyph unicode="&#x434;" horiz-adv-x="1225" d="M1195 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-14 15 -64 93.5t-82 101t-99 22.5h-599q-73 0 -108 -34q-19 -18 -60 -97.5t-56 -95.5q-34 -39 -93 -39v3q83 16 83 229l-2 100q104 0 130 4q76 12 108 61q82 125 131 315.5t49 352.5q0 45 -65 56q-16 2 -100 2v66h850v-66 q-78 0 -111 -3.5t-44.5 -24.5t-11.5 -73v-589q0 -52 11.5 -73t44.5 -24.5t111 -3.5zM880 162v607q0 62 -42 79q-23 9 -108 9t-111.5 -17t-31.5 -99q-17 -277 -135 -548q-30 -69 -30 -86q0 -23 35.5 -32t161.5 -9q218 0 248 39q13 17 13 57z" />
+<glyph unicode="&#x435;" horiz-adv-x="933" d="M854 280q27 0 27 -28t-35 -88q-110 -188 -315 -188t-341.5 147.5t-136.5 344.5t127 344.5t312.5 147.5t287 -119t101.5 -302q0 -30 -7.5 -37.5t-38.5 -7.5h-605v-7q0 -210 64 -313q90 -144 242 -144q198 0 290 221q12 29 28 29zM740 539q0 143 -50 243q-64 129 -192 129 q-41 0 -90 -23q-165 -78 -175 -349h507z" />
+<glyph unicode="&#x436;" horiz-adv-x="1611" d="M737 471l-56 7q-128 0 -236 -69q-55 -35 -70.5 -71t-20 -119.5t-53.5 -158.5t-134 -75q-67 0 -101 67q-27 53 -27 128q0 34 27 34q22 0 26 -26q10 -62 16 -78q17 -44 57 -44q66 0 66 141.5t62.5 205t196.5 93.5q-68 33 -107 130l-53 156q-32 76 -89 76q-25 0 -25 -18 q0 -3 16 -29.5t16 -60t-27.5 -62t-66.5 -28.5q-102 0 -102 102q0 70 46 118t112 48q148 0 200 -178q37 -124 57 -151q51 -70 178 -70h92v226q0 41 -9 59q-17 33 -150 33h-8v66q208 -6 243.5 -6t237.5 6v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-226h92q127 0 178 70 q20 27 53.5 140.5t96.5 158.5q42 30 107.5 30t111.5 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18q-57 0 -89 -76l-53 -156q-39 -97 -107 -130q134 -30 196.5 -93.5t62.5 -205t66 -141.5q40 0 57 44q6 16 16 78q4 26 26 26 q27 0 27 -34q0 -75 -27 -128q-34 -67 -101 -67q-85 0 -134 75t-53.5 158.5t-20 119.5t-70.5 71q-108 69 -236 69l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -237 6t-244 -6v66q7 0 23.5 -0.5t54 -0.5t63.5 16t26 77v313z" />
+<glyph unicode="&#x437;" horiz-adv-x="920" d="M860 253q0 -59 -36 -116q-106 -167 -386 -167q-169 0 -263 43l-64 -43h-9q-23 0 -27 8q-5 11 -5 48v122q0 58 28 58q20 0 26 -20q2 -23 17 -71q45 -85 293.5 -85t248.5 222.5t-251 222.5h-118q-55 0 -55 23t29.5 25.5t79.5 5.5q122 8 192 62q86 66 86 151.5t-58.5 121 t-151 35.5t-165 -36.5t-94 -91t-36.5 -54.5q-28 0 -28 58v122q0 37 5 47q4 9 27 9h9q25 -19 77 -54q91 54 218 54t232 -43q136 -57 136 -160q0 -170 -254 -242q112 -21 195 -81q102 -73 102 -174z" />
+<glyph unicode="&#x438;" horiz-adv-x="1261" d="M1204 0q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v570l-499 -653q38 -18 148 -18v-66q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v589q0 49 -9 68q-16 33 -158 33v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-570l499 653q-38 18 -147 18 v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-589q0 -49 9 -68q16 -33 159 -33v-66z" />
+<glyph unicode="&#x439;" horiz-adv-x="1261" d="M1204 0q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v570l-499 -653q38 -18 148 -18v-66q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v589q0 49 -9 68q-16 33 -158 33v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-570l499 653q-38 18 -147 18 v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-589q0 -49 9 -68q16 -33 159 -33v-66zM892 1398q89 0 89 -96t-113.5 -158.5t-237.5 -62.5t-229 58q-122 67 -122 163t89 96t89 -90t-89 -90q99 -74 262 -74t262 74q-89 0 -89 90t89 90z" />
+<glyph unicode="&#x43a;" horiz-adv-x="1080" d="M409 478l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -237 6t-244 -6v66q7 0 23.5 -0.5t54 -0.5t63.5 16t26 77v607q0 41 -9 59q-17 33 -150 33h-8v66q208 -6 243.5 -6t237.5 6v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-226h92q127 0 178 70 q20 27 53.5 140.5t96.5 158.5q42 30 107.5 30t111.5 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18q-57 0 -89 -76l-53 -156q-39 -97 -107 -130q134 -30 196.5 -93.5t62.5 -205t66 -141.5q40 0 57 44q6 16 16 78q4 26 26 26 q27 0 27 -34q0 -75 -27 -128q-34 -67 -101 -67q-85 0 -134 75t-53.5 158.5t-20 119.5t-70.5 71q-108 69 -236 69z" />
+<glyph unicode="&#x43b;" horiz-adv-x="1267" d="M281 81q186 0 186 658q0 63 -6 80q-11 30 -72 37q-10 1 -89 1v66h876v-66q-140 0 -157 -30q-10 -18 -10 -71v-589q0 -53 10 -71q17 -30 157 -30v-66q-203 6 -237.5 6t-244.5 -6v66q140 0 157 30q10 18 10 71v585q0 49 -7 65q-18 40 -149 40q-69 0 -92 -5q-55 -11 -63 -53 q-3 -17 -4 -116q-6 -683 -261 -683q-70 0 -121 48.5t-51 118.5q0 88 86 88q36 0 60 -24.5t24 -61.5q0 -59 -50 -79q18 -9 48 -9z" />
+<glyph unicode="&#x43c;" horiz-adv-x="1428" d="M1362 0q-186 6 -238 6t-227 -6v66h85q60 5 73 32q9 18 9 69l-2 696l-347 -820q-18 -43 -40.5 -43t-40.5 43l-341 805l-2 -2v-629q0 -151 167 -151v-66q-82 6 -166 6t-228 -6v66q167 0 167 151v539q0 50 -9 68q-16 33 -158 33v66h262q41 0 50 -4q13 -7 27 -39l310 -732 l308 732q13 31 26.5 37t53.5 6h261v-66h-85q-60 -5 -73 -32q-9 -18 -9 -69v-589q0 -50 9 -68q16 -33 158 -33v-66z" />
+<glyph unicode="&#x43d;" horiz-adv-x="1178" d="M1120 0q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v281h-435v-281q0 -49 9 -68q16 -33 159 -33v-66q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-242h435 v242q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-10 -18 -10 -71v-589q0 -53 10 -71q17 -30 157 -30v-66z" />
+<glyph unicode="&#x43e;" horiz-adv-x="1054" d="M191.5 118.5q-138.5 142.5 -138.5 341.5t138 349.5t336.5 150.5t336.5 -151t138 -350.5t-139 -341t-336 -141.5t-335.5 142.5zM776 188q47 92 47 292.5t-56 292.5q-84 138 -244.5 138t-241.5 -143q-51 -90 -51 -294.5t55 -299.5q83 -144 246.5 -144t244.5 158z" />
+<glyph unicode="&#x43f;" horiz-adv-x="1178" d="M1120 0q-203 6 -237.5 6t-244.5 -6v66q140 0 157 30q10 18 10 71v585q0 54 -15 74q-23 31 -194 31t-198.5 -19.5t-27.5 -85.5v-585q0 -52 11 -71q17 -30 157 -30v-66q-203 6 -237.5 6t-244.5 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66h1064v-66 q-140 0 -157 -30q-10 -18 -10 -71v-589q0 -53 10 -71q17 -30 157 -30v-66z" />
+<glyph unicode="&#x440;" horiz-adv-x="1160" d="M360 805q127 141 308 141t310 -146.5t129 -342t-139 -338.5t-337 -143q-78 0 -158.5 42t-105.5 109v-388q0 -42 11 -59q19 -29 114 -29q19 0 41 1v-66q-169 5 -241.5 5t-238.5 -5v66q37 -2 76.5 -2t60.5 14q30 19 30 83v1002q0 51 -10 71.5t-44 28.5q-26 6 -83 6h-30v68 l307 23v-141zM855 176q74 128 74 282t-67 281q-81 154 -218 154q-179 0 -277 -172v-478q0 -46 30 -89q91 -130 230.5 -130t227.5 152z" />
+<glyph unicode="&#x441;" horiz-adv-x="920" d="M868 254q0 -22 -27 -75q-104 -203 -329 -203q-194 0 -326.5 144.5t-132.5 343t132 347.5t330 149q121 0 215 -54q113 -64 113 -170t-97 -106q-42 0 -70.5 28t-28.5 70q0 94 100 99q-79 78 -229 78q-60 0 -120 -34q-168 -94 -168 -402.5t178 -404.5q63 -34 123 -34 q113 0 181 64q40 37 74 109.5t53 72.5q29 0 29 -22z" />
+<glyph unicode="&#x442;" horiz-adv-x="1142" d="M756 857q-75 0 -88 -7q-23 -13 -23 -81v-598q0 -53 12.5 -72t61.5 -26t161 -7v-66q-73 6 -226 6h-168q-152 0 -225 -6v66q133 0 174 7.5t51.5 28t10.5 69.5v598q0 68 -23 81q-12 7 -91 7q-152 0 -193.5 -50t-52.5 -212h-53l25 328h921l26 -328h-54q-11 161 -48 207 q-46 55 -198 55z" />
+<glyph unicode="&#x443;" horiz-adv-x="1151" d="M249 -439q-76 0 -136 50t-60 124q0 91 89 91q39 0 65 -25.5t26 -63.5q0 -81 -85 -91q41 -38 101 -38q93 0 158 92q32 45 68 130l71 170l-321 781q-22 54 -70 68q-21 6 -74 6h-28v68q120 -8 178.5 -8t261.5 8v-68h-4q-116 0 -116 -54q0 -19 250 -616l217 528q14 34 14 50 q0 90 -101 92v68q170 -8 212 -8t134 8v-68h-2q-140 0 -197 -136l-377 -913q-101 -245 -274 -245z" />
+<glyph unicode="&#x444;" horiz-adv-x="1275" d="M1223 460q0 -108 -33 -211.5t-114 -188t-192.5 -84.5t-183.5 125h-2v-186q0 -32 49.5 -164.5t75.5 -179.5l-23 -13l-162 258l-162 -258l-23 13q26 47 75.5 179.5t49.5 164.5v186h-2q-72 -125 -183 -125t-192 84q-148 155 -148 403q0 106 33.5 210.5t114.5 189t192 84.5 t183 -125h2v304q0 32 -49.5 164.5t-75.5 179.5l23 13l162 -258l162 258l23 -13q-26 -47 -75.5 -179.5t-49.5 -164.5v-304h2q72 125 183.5 125t198.5 -92q74 -77 107.5 -182t33.5 -213zM1045 463q0 190 -28 282q-45 148 -133 148q-102 0 -158 -139q-28 -69 -28 -246v-131 q0 -139 26 -206q54 -141 160 -141q94 0 137 156q24 87 24 277zM578 415v131q0 139 -26 206q-54 141 -160 141q-94 0 -137 -156q-24 -87 -24 -277t28 -282q45 -148 133 -148q102 0 158 139q28 69 28 246z" />
+<glyph unicode="&#x445;" horiz-adv-x="1183" d="M1131 0q-91 6 -175.5 6t-261.5 -6v66q77 3 77 54q0 10 -208 285q-192 -223 -192 -272q0 -61 62 -67v-66q-141 6 -221 6t-159 -6v66q159 0 274 128l200 256l-212 276q-71 92 -105 110.5t-147 18.5v68q110 -8 171 -8t264 8v-68q-75 -2 -75 -52q0 -20 184 -255l134 167 q33 41 33 75q0 61 -63 65v68q108 -8 192.5 -8t188.5 8v-68q-152 -3 -255 -109q-26 -27 -197 -244l287 -369q37 -47 92 -60q28 -7 95 -7h17v-66z" />
+<glyph unicode="&#x446;" horiz-adv-x="1178" d="M1120 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-14 16 -64 94t-82 100.5t-99 22.5h-796v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-585q0 -54 15 -74q23 -31 202.5 -31t202.5 31 q15 20 15 74v585q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-10 -18 -10 -71v-589q0 -53 10 -71q17 -30 157 -30z" />
+<glyph unicode="&#x447;" horiz-adv-x="1261" d="M1204 0q-203 6 -237.5 6t-244.5 -6v66q140 0 157 30q10 18 10 71v274q-129 -143 -324 -143q-131 0 -236.5 81t-105.5 208q0 214 -5 229q-11 32 -72 40q-12 1 -90 1v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-143q0 -102 70.5 -160.5t174.5 -58.5 q137 0 246 109q28 28 28 75v178q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-589q0 -52 11 -71q17 -30 157 -30v-66z" />
+<glyph unicode="&#x448;" horiz-adv-x="1677" d="M1619 0h-1563v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-585q0 -49 13 -73t56.5 -28t131 -4t96.5 1q70 6 85 37q10 19 10 61v597q0 49 -11 67q-17 28 -154 28v66q174 -6 237 -6t243 6 v-66q-67 0 -103.5 -3t-49 -22.5t-12.5 -69.5v-597q0 -52 16.5 -71.5t57.5 -23.5t123 -4t124 4t56.5 26t14.5 75v585q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-10 -18 -10 -71v-589q0 -53 10 -71q17 -30 157 -30v-66z" />
+<glyph unicode="&#x449;" horiz-adv-x="1677" d="M1619 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-15 16 -64.5 94t-81.5 100.5t-99 22.5h-1295v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-585q0 -49 13 -73t56.5 -28t131 -4t96.5 1 q70 6 85 37q10 19 10 61v597q0 49 -11 67q-17 28 -154 28v66q174 -6 237 -6t243 6v-66q-67 0 -103.5 -3t-49 -22.5t-12.5 -69.5v-597q0 -52 16.5 -71.5t57.5 -23.5t123 -4t124 4t56.5 26t14.5 75v585q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66 q-140 0 -157 -30q-10 -18 -10 -71v-589q0 -53 10 -71q17 -30 157 -30z" />
+<glyph unicode="&#x44a;" horiz-adv-x="1451" d="M1305 351q31 -48 31 -100.5t-31 -103.5q-89 -147 -311 -147h-598v66q69 0 105.5 3t49 24t12.5 74v602q0 70 -26 83q-12 5 -98 5q-155 0 -216 -53.5t-65 -208.5h-53l15 328h662v-66h-7q-52 0 -64 -15q-13 -15 -13 -73v-283h289q230 0 318 -135zM942 66q93 0 158 49.5 t65 137.5t-54.5 145.5t-139.5 57.5h-273v-302q0 -62 14 -75t78 -13h152z" />
+<glyph unicode="&#x44b;" horiz-adv-x="1535" d="M1495 0q-203 6 -240.5 6t-241.5 -6v66q139 0 156 29q11 18 11 68v597q0 50 -11 68q-17 29 -156 29v66q203 -6 241 -6t241 6v-66q-80 0 -86 -1q-60 -5 -72 -34q-9 -21 -9 -72v-577q0 -51 9 -72q12 -29 72 -34q6 -1 86 -1v-66zM1004 251q0 -56 -34 -109q-90 -142 -310 -142 h-598v66h9q132 0 148 30q10 18 10 71v589q0 53 -10 71q-16 30 -148 30h-9v66q120 -6 196.5 -6t272.5 6v-66h-9q-132 0 -148 -30q-10 -18 -10 -71v-270h291q127 0 227 -53q122 -65 122 -182zM608 66q93 0 159 50t66 137.5t-56 145t-141 57.5h-272v-302q0 -62 14 -75t78 -13 h152z" />
+<glyph unicode="&#x44c;" horiz-adv-x="1118" d="M975 344q27 -46 27 -94t-26 -95q-86 -155 -316 -155h-598v66h9q132 0 148 30q10 18 10 71v589q0 53 -10 71q-16 30 -148 30h-9v66q120 -6 196.5 -6t272.5 6v-66h-9q-132 0 -148 -30q-10 -18 -10 -71v-270h289q238 0 322 -142zM608 66q93 0 158 49.5t65 138t-54.5 145.5 t-140.5 57h-272v-302q0 -62 14 -75t78 -13h152z" />
+<glyph unicode="&#x44d;" horiz-adv-x="1036" d="M92 953q3 0 107 -86q114 86 259 86q211 0 368 -142t157 -350t-157.5 -349.5t-367.5 -141.5q-141 0 -255 70q-133 82 -133 215q0 30 28 30q21 0 26 -32q15 -106 101 -161.5t199 -55.5q174 0 283 116q90 95 98 289q-69 60 -163 60q-135 0 -250 -109q-55 -52 -110 -52 t-130 38.5t-75 76.5t21 38q3 0 31 -18.5t61 -18.5q67 0 163.5 80.5t198.5 80.5q134 0 251 -94q-18 176 -119 270t-258 94q-188 0 -269 -152q-5 -9 -33 -93q-6 -19 -27 -19t-26 18q-1 4 -1 38v218q0 56 22 56z" />
+<glyph unicode="&#x44e;" horiz-adv-x="1767" d="M1505 807q146 -146 146 -350.5t-147 -345.5t-346.5 -141t-343 129.5t-157.5 322.5h-261v-257q0 -50 11 -69q17 -30 147 -30h9v-66q-202 6 -241 6t-241 -6v66h8q132 0 149 31q10 18 10 72v585q0 54 -10 72q-17 31 -149 31h-8v66q202 -6 241 -6t241 6v-66h-9 q-130 0 -147 -30q-11 -19 -11 -69v-270h261q11 196 156 330.5t345.5 134.5t346.5 -146zM1473 478q0 298 -192 391q-62 30 -125 30t-122 -26q-201 -89 -201 -403t194 -413q61 -31 124 -31t120 27q202 96 202 425z" />
+<glyph unicode="&#x44f;" horiz-adv-x="1166" d="M1103 0q-221 6 -249.5 6t-226.5 -6v66q142 0 158 33q9 19 9 68v272h-169q-86 0 -141 -58q-35 -37 -35 -123q0 -10 0.5 -31t0.5 -32q0 -126 -74.5 -175.5t-189.5 -49.5q-64 0 -108 45t-44 109q0 32 28 32q22 0 26 -30q15 -109 88 -109q44 0 72 74q5 13 31.5 118t51.5 147 q39 64 125 102q-91 21 -157 71q-83 62 -83 143.5t70 141.5q127 109 333 109h484v-66q-142 0 -158 -33q-9 -19 -9 -68v-589q0 -49 9 -68q16 -33 158 -33v-66zM794 486v291q0 65 -27 75q-13 5 -124.5 5t-165.5 -25q-83 -40 -83 -154.5t69 -157.5q54 -34 175 -34h156z" />
+<glyph unicode="&#x450;" horiz-adv-x="933" d="M854 280q27 0 27 -28t-35 -88q-110 -188 -315 -188t-341.5 147.5t-136.5 344.5t127 344.5t312.5 147.5t287 -119t101.5 -302q0 -30 -7.5 -37.5t-38.5 -7.5h-605v-7q0 -210 64 -313q90 -144 242 -144q198 0 290 221q12 29 28 29zM740 539q0 143 -50 243q-64 129 -192 129 q-41 0 -90 -23q-165 -78 -175 -349h507zM353 1300q-28 24 -28 54t23 53t54 23t54 -29l247 -322l-37 -35z" />
+<glyph unicode="&#x451;" horiz-adv-x="933" d="M854 280q27 0 27 -28t-35 -88q-110 -188 -315 -188t-341.5 147.5t-136.5 344.5t127 344.5t312.5 147.5t287 -119t101.5 -302q0 -30 -7.5 -37.5t-38.5 -7.5h-605v-7q0 -210 64 -313q90 -144 242 -144q198 0 290 221q12 29 28 29zM740 539q0 143 -50 243q-64 129 -192 129 q-41 0 -90 -23q-165 -78 -175 -349h507zM779 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM406.5 1318q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x452;" horiz-adv-x="1168" d="M1115 486q0 -245 -113.5 -462.5t-316.5 -348.5q-139 -90 -291 -90q-40 0 -40 34q0 21 7 24.5t33 7.5q238 34 382 215q127 160 167 414q9 57 9 126q0 181 -64 322q-83 184 -242 184q-123 0 -201 -107.5t-78 -235.5v-413q0 -40 10 -58q18 -33 114 -33q19 0 41 1v-66 q-197 6 -236 6t-243 -6v66q28 -1 71.5 -1t69 16.5t25.5 80.5v983h-173q-24 0 -24 31t24 31h173v70q0 87 -44 108q-21 10 -96 10h-26v67l306 23v-278h416q24 0 24 -31t-24 -31h-416v-390h2q41 93 125 149t184 56q194 0 319.5 -139t125.5 -335z" />
+<glyph unicode="&#x453;" horiz-adv-x="1035" d="M603 1401q22 29 53 29t54 -23t23 -53t-28 -54l-313 -256l-37 35zM535 850q-112 0 -122 -2q-32 -6 -40 -31q-3 -10 -3 -55v-591q0 -47 7 -62q10 -26 51 -34.5t150 -8.5v-66q-80 6 -178 6t-344 -6v66q140 0 157 30q10 18 10 71v583q0 52 -10 70q-16 30 -151 30h-6v67h846 l38 -328h-53q-18 182 -98 229q-55 32 -254 32z" />
+<glyph unicode="&#x454;" horiz-adv-x="1036" d="M966 255q0 -133 -133 -215q-114 -70 -255 -70q-211 0 -368 142t-157 350t157.5 349.5t367.5 141.5q154 0 259 -86q15 11 43 35q53 51 64 51q22 0 22 -56v-218q0 -34 -1 -38q-5 -18 -26 -18t-27 26q-27 111 -107.5 174.5t-194.5 63.5q-159 0 -260.5 -99t-116.5 -265 q117 94 251 94q101 0 198 -80.5t164 -80.5q31 0 58.5 18.5t33.5 18.5q21 0 21 -38t-74.5 -76.5t-130.5 -38.5t-107 48q-121 113 -253 113q-39 0 -101 -20.5t-62 -52.5q0 -171 105.5 -281.5t275.5 -110.5q99 0 184.5 45.5t107.5 133.5q2 18 8 51q6 19 26 19q28 0 28 -30z" />
+<glyph unicode="&#x455;" horiz-adv-x="804" d="M752 274q0 -146 -97 -222t-242 -76t-242 93q-77 -93 -97.5 -93t-20.5 33v322q0 32 27 32q21 0 30 -35q37 -146 92 -214q73 -90 206 -90q103 0 172 48.5t69 146.5q0 147 -223 195q-128 28 -148 33q-82 25 -134 67q-91 75 -91 183q0 134 108 204q92 59 221.5 59t212.5 -61 q60 61 82 61t22 -33v-254q0 -35 -29 -35q-23 0 -31 43l-6 60q-16 87 -81.5 132.5t-158.5 45.5t-157 -34q-81 -43 -81 -129t94 -130q48 -22 169 -46q170 -33 243 -102q91 -86 91 -204z" />
+<glyph unicode="&#x456;" horiz-adv-x="562" d="M510 0q-202 6 -233 6t-224 -6v66l44 -1q66 0 89 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66zM335.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33z" />
+<glyph unicode="&#x457;" horiz-adv-x="562" d="M510 0q-202 6 -233 6t-224 -6v66l44 -1q66 0 89 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66zM539 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM166.5 1318 q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x458;" horiz-adv-x="588" d="M385 -107q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29q158 0 158 281v861q0 39 -9 60q-20 45 -148 45h-27v68l324 23v-1053zM353 1356q33 -33 33 -80.5t-33.5 -81t-80 -33.5 t-79.5 34.5t-33 80t33.5 79.5t80 34t79.5 -33z" />
+<glyph unicode="&#x459;" horiz-adv-x="1640" d="M281 81q186 0 186 658q0 63 -6 80q-11 30 -72 37q-10 1 -89 1v66h876v-66h-43h-9q-69 0 -92 -15q-23 -16 -23 -86v-261h225q118 0 205.5 -63.5t87.5 -178t-87 -184t-206 -69.5h-540v66q140 0 157 30q10 18 10 71v585q0 49 -7 65q-18 40 -149 40q-69 0 -92 -5 q-55 -11 -63 -53q-3 -17 -4 -116q-6 -683 -261 -683q-70 0 -121 48.5t-51 118.5q0 88 86 88q36 0 60 -24.5t24 -61.5q0 -59 -50 -79q18 -9 48 -9zM1356 256q0 82 -38 145.5t-114 63.5h-195v-298q0 -73 32 -90q18 -11 62 -11h7h92q53 0 74.5 6.5t50.5 54t29 129.5z" />
+<glyph unicode="&#x45a;" horiz-adv-x="1660" d="M1546 255q0 -48 -25 -97q-80 -158 -300 -158h-581v66q112 0 130 8q37 18 37 106v268h-437v-281q0 -52 12 -73t45.5 -24.5t110.5 -3.5v-66q-203 6 -238 6t-244 -6v66q78 0 111 3.5t44.5 24.5t11.5 73v589q0 52 -11.5 73t-44.5 24.5t-111 3.5v66q209 -6 244 -6t238 6v-66 q-78 0 -111 -3.5t-45 -24.5t-12 -73v-242h437v229q0 88 -37 106q-18 8 -130 8v66q175 -6 234.5 -6t245.5 6v-66q-140 0 -156 -32q-9 -18 -9 -63v-267h266q123 0 216 -57q109 -67 109 -183zM1317 105q58 59 58 149t-46 150.5t-130 60.5h-244v-304q0 -48 9 -65.5t44.5 -23.5 t128.5 -6t103 1q46 6 77 38z" />
+<glyph unicode="&#x45b;" horiz-adv-x="1181" d="M1129 0q-200 6 -238 6t-244 -6v66q30 -1 70.5 -1t63.5 12q33 19 33 76v519q0 227 -158 227q-130 0 -209.5 -104.5t-79.5 -238.5v-400q0 -39 10 -58q18 -33 117 -33q18 0 38 1v-66q-200 6 -236.5 6t-242.5 -6v66q30 -1 72.5 -1t68 16.5t25.5 80.5v983h-173q-23 0 -23 23 v16q0 23 23 23h173v70q0 87 -44 108q-21 10 -96 10h-26v67l306 23v-278h416q22 0 22 -23v-16q0 -23 -22 -23h-416v-404h2q41 93 125 149t184 56q292 0 292 -314v-502q0 -65 135 -65q15 0 32 1v-66z" />
+<glyph unicode="&#x45c;" horiz-adv-x="1080" d="M409 478l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -237 6t-244 -6v66q7 0 23.5 -0.5t54 -0.5t63.5 16t26 77v607q0 41 -9 59q-17 33 -150 33h-8v66q208 -6 243.5 -6t237.5 6v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-226h92q127 0 178 70 q20 27 53.5 140.5t96.5 158.5q42 30 107.5 30t111.5 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18q-57 0 -89 -76l-53 -156q-39 -97 -107 -130q134 -30 196.5 -93.5t62.5 -205t66 -141.5q40 0 57 44q6 16 16 78q4 26 26 26 q27 0 27 -34q0 -75 -27 -128q-34 -67 -101 -67q-85 0 -134 75t-53.5 158.5t-20 119.5t-70.5 71q-108 69 -236 69zM683 1401q22 29 53 29t54 -23t23 -53t-28 -54l-313 -256l-37 35z" />
+<glyph unicode="&#x45d;" horiz-adv-x="1261" d="M1204 0q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v570l-499 -653q38 -18 148 -18v-66q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v589q0 49 -9 68q-16 33 -158 33v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-570l499 653q-38 18 -147 18 v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-589q0 -49 9 -68q16 -33 159 -33v-66zM473 1300q-28 24 -28 54t23 53t54 23t54 -29l247 -322l-37 -35z" />
+<glyph unicode="&#x45e;" horiz-adv-x="1151" d="M249 -439q-76 0 -136 50t-60 124q0 91 89 91q39 0 65 -25.5t26 -63.5q0 -81 -85 -91q41 -38 101 -38q93 0 158 92q32 45 68 130l71 170l-321 781q-22 54 -70 68q-21 6 -74 6h-28v68q120 -8 178.5 -8t261.5 8v-68h-4q-116 0 -116 -54q0 -19 250 -616l217 528q14 34 14 50 q0 90 -101 92v68q170 -8 212 -8t134 8v-68h-2q-140 0 -197 -136l-377 -913q-101 -245 -274 -245zM862 1398q89 0 89 -96t-113.5 -158.5t-237.5 -62.5t-229 58q-122 67 -122 163t89 96t89 -90t-89 -90q99 -74 262 -74t262 74q-89 0 -89 90t89 90z" />
+<glyph unicode="&#x45f;" horiz-adv-x="1182" d="M962 793v-574q0 -66 21.5 -93t86.5 -27q13 0 58 1v-100h-451q-28 -143 -33 -277h-105q-6 134 -34 277h-452v100h16q84 0 106 10q44 22 44 109v542q0 64 -25.5 80.5t-67 16.5t-73.5 -1v66q207 -6 243 -6t236 6v-66q-18 1 -35 1q-103 0 -120 -33q-10 -19 -10 -58v-699h447 v702q0 57 -28 72.5t-67 15.5t-72 -1v66q206 -6 243.5 -6t238.5 6v-66q-29 1 -50 1q-36 0 -53 -3q-64 -12 -64 -62z" />
+<glyph unicode="&#x460;" horiz-adv-x="1686" d="M1618 617q0 -252 -109 -438q-131 -222 -366.5 -222t-295.5 247h-8q-60 -247 -295.5 -247t-366.5 222q-109 186 -109 438q0 345 161 546q174 218 511 227v-43q-470 -25 -470 -712q0 -626 295 -626q94 0 156.5 99t62.5 205t-23 210.5t-23 122.5q0 125 105 125t105 -125 q0 -18 -23 -122.5t-23 -210.5t62.5 -205t156.5 -99q295 0 295 626q0 687 -470 712v43q337 -9 511 -227q161 -201 161 -546z" />
+<glyph unicode="&#x461;" horiz-adv-x="1294" d="M1241 430q0 -173 -79 -302q-93 -152 -255 -152q-224 0 -256 267h-8q-32 -267 -256 -267q-162 0 -255 152q-79 129 -79 302q0 244 124.5 385.5t365.5 144.5v-48q-327 -10 -327 -470q0 -169 25 -257q44 -155 169 -155q99 0 149 102q39 79 39 191.5t-23 219.5t-23 122 q0 116 95 116t95 -116q0 -15 -23 -122t-23 -219.5t39 -191.5q50 -102 149 -102q125 0 169 155q25 88 25 257q0 460 -327 470v48q241 -3 365.5 -144.5t124.5 -385.5z" />
+<glyph unicode="&#x462;" horiz-adv-x="1654" d="M957 1534l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-108h477l22 -266h-47q-28 140 -124 181q-58 24 -223 24q-105 0 -105 -67v-494h336q188 0 334 -85q174 -101 174 -269t-135.5 -267.5t-302.5 -99.5h-772v61q62 -2 63 -2q113 0 134 45q5 11 5 42v1069q0 67 -115 67 q-156 0 -216 -27q-93 -42 -119 -178h-46l22 266h474v108q0 32 -9 49q-18 34 -153 34h-40v62q71 -6 115 -6h355q41 0 111 6v-62zM1302 147q88 86 88 221t-87 222t-210 87h-351v-537q0 -53 16.5 -66t69.5 -13h257q129 0 217 86z" />
+<glyph unicode="&#x463;" horiz-adv-x="1386" d="M1243 344q27 -46 27 -94t-26 -95q-86 -155 -316 -155h-598v66l48 -1q68 0 93.5 15.5t25.5 78.5v610q0 54 -12 71t-61 17q-179 0 -227 -43t-60 -219h-53l25 328h391v203q0 32 -49.5 164.5t-75.5 179.5l23 13l166 -258l165 258l23 -13q-26 -47 -75.5 -179.5t-49.5 -164.5 v-203h390l26 -328h-54q-12 174 -59.5 218t-222.5 44q-52 0 -63.5 -17.5t-11.5 -70.5v-283h289q238 0 322 -142zM876 66q93 0 158 49.5t65 137.5t-54.5 145.5t-140.5 57.5h-272v-302q0 -60 14 -74t78 -14h152z" />
+<glyph unicode="&#x464;" horiz-adv-x="2024" d="M649 1284l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-474h316q22 271 216.5 465t465.5 194q193 0 363 -169l99 144q17 25 31 25q21 0 21 -33v-423q0 -26 -28.5 -26t-35.5 32q-34 154 -155 271t-272 117q-104 0 -207 -50q-276 -135 -297 -547h281q128 0 170.5 36t42.5 144h51 v-422h-51q0 108 -42.5 144t-170.5 36h-282q0 -473 322 -611q96 -41 185 -41q179 0 309 130q55 56 77 101.5t47 135.5q8 29 23 29q27 0 27 -22q0 -6 -2 -17q-35 -180 -178.5 -298.5t-327.5 -118.5q-288 0 -486 212.5t-198 501.5h-314v-530q0 -29 8 -45q18 -35 187 -35h10v-61 q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62z" />
+<glyph unicode="&#x465;" horiz-adv-x="1527" d="M1474 686q0 -34 -1 -38q-5 -18 -26 -18t-27 26q-28 115 -108 182t-194 67q-60 0 -120 -34q-153 -86 -167 -357h325q46 0 46 -33t-46 -33h-326q6 -291 178 -384q63 -34 123 -34q113 0 181 64q40 37 74 109.5t53 72.5q29 0 29 -22t-27 -75q-104 -203 -329 -203 q-191 0 -322.5 140t-136.5 332h-283v-281q0 -49 9 -68q16 -33 159 -33v-66q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-242h286q18 185 146.5 315.5t312.5 130.5 q146 0 245 -74q10 7 45.5 40.5t46.5 33.5q22 0 22 -56v-218z" />
+<glyph unicode="&#x466;" horiz-adv-x="1719" d="M1306 6q-110 0 -182 -6v61h5q161 0 161 59q0 48 -25 102l-216 468q-163 -130 -163 -497v-50q0 -28 8 -42q23 -40 150 -40v-61q-76 6 -139 6h-213q-63 0 -139 -6v61q127 0 150 40q8 14 8 42v50q0 353 -153 488l-224 -475q-9 -19 -9 -42q0 -51 46 -76.5t102 -26.5v-61 q-183 6 -244 6t-161 -6v61h2q129 0 193 136l552 1172q20 42 55.5 42t54.5 -42l565 -1223q29 -63 56 -74q25 -11 93 -11h12v-61q-235 6 -345 6zM1015 764l-207 448l-214 -455q157 -119 204 -415h2q48 306 215 422z" />
+<glyph unicode="&#x467;" horiz-adv-x="1332" d="M1279 0q-120 8 -164 8t-276 -8v66h5q117 0 117 44q0 21 -22 63l-144 274q-101 -98 -101 -306v-31q0 -34 40 -42q11 -2 68 -2v-66q-70 5 -116 5h-130q-46 0 -116 -5v66q54 0 68 3q40 8 40 41v31q0 200 -95 300l-123 -231q-25 -47 -25 -78q0 -64 94 -66v-66 q-135 8 -194.5 8t-151.5 -8v66q122 1 198 144l369 697q21 40 50 40t50 -40l399 -760q31 -59 66 -73q20 -8 80 -8h14v-66zM764 506l-138 262l-141 -266q95 -71 136 -228q42 161 143 232z" />
+<glyph unicode="&#x468;" horiz-adv-x="2360" d="M649 1284l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-435h730l282 599q20 42 55.5 42t54.5 -42l565 -1223q29 -63 56 -74q25 -11 93 -11h12v-61q-235 6 -345 6t-182 -6v61h5q161 0 161 59q0 48 -25 102l-216 468q-163 -130 -163 -497v-50q0 -28 8 -42q23 -40 150 -40v-61 q-76 6 -139 6h-213q-63 0 -139 -6v61q127 0 150 40q8 14 8 42v50q0 353 -153 488l-224 -475q-9 -19 -9 -42q0 -51 46 -76.5t102 -26.5v-61q-183 6 -244 6t-161 -6v61h2q129 0 193 136l242 513h-702v-569q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6 v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62zM1656 764l-207 448l-214 -455q157 -119 204 -415h2q48 306 215 422z" />
+<glyph unicode="&#x469;" horiz-adv-x="1902" d="M1849 0q-120 8 -164 8t-276 -8v66h5q117 0 117 44q0 21 -22 63l-144 274q-101 -98 -101 -306v-31q0 -34 40 -42q11 -2 68 -2v-66q-70 5 -116 5h-130q-46 0 -116 -5v66q54 0 68 3q40 8 40 41v31q0 200 -95 300l-123 -231q-25 -47 -25 -78q0 -64 94 -66v-66 q-135 8 -194.5 8t-151.5 -8v66q122 1 198 144l126 238h-577v-281q0 -49 9 -68q16 -33 159 -33v-66q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-242h612l208 393 q21 40 50 40t50 -40l399 -760q31 -59 66 -73q20 -8 80 -8h14v-66zM1334 506l-138 262l-141 -266q95 -71 136 -228q42 161 143 232z" />
+<glyph unicode="&#x46a;" horiz-adv-x="1588" d="M1520 22q0 -22 -35 -22h-87q-106 0 -146 92q-23 55 -29 184q-8 172 -95.5 295t-252.5 155v-583q0 -28 8 -42q22 -40 150 -40v-61q-76 6 -139 6h-200q-63 0 -139 -6v61q128 0 150 40q8 14 8 42v583q-165 -32 -252.5 -155t-95.5 -295q-6 -129 -29 -184q-40 -92 -146 -92 h-87q-35 0 -35 22q0 15 25 24l46 15q40 20 53 114q4 68 9 136q16 205 141.5 326t333.5 140l-402 491q-13 16 -13 35q0 40 79 40h867q88 0 88 -78q0 -35 -19 -57l-366 -431q209 -18 335 -139.5t142 -326.5q5 -68 9 -136q13 -94 53 -114l46 -15q25 -9 25 -24zM1159 1209 q0 78 -88 78h-469q-79 0 -79 -40q0 -19 13 -35l321 -393l283 333q19 22 19 57z" />
+<glyph unicode="&#x46b;" horiz-adv-x="1215" d="M1164 23q0 -23 -38 -23h-66q-84 0 -116 61q-20 38 -27 135q-19 253 -236 299v-332q0 -71 31 -88q18 -9 83 -9h14v-66l-200 6l-202 -6v66q5 0 18.5 -0.5t20.5 -0.5q53 0 70.5 20.5t17.5 73.5v336q-217 -46 -236 -299q-7 -97 -27 -135q-32 -61 -116 -61h-66q-38 0 -38 23 q0 14 24 23q18 5 36 11q26 13 34 72l6 86q14 142 106.5 225.5t237.5 100.5l-286 312q-13 14 -13 31q0 39 71 39h650q78 0 78 -64q0 -28 -17 -46l-258 -272q145 -17 237.5 -100.5t106.5 -225.5l6 -86q8 -59 34 -72q18 -6 36 -11q24 -9 24 -23zM869 822q0 40 -54 40h-366 q-33 0 -33 -15q0 -8 7 -16l232 -253l203 213q11 12 11 31z" />
+<glyph unicode="&#x46c;" horiz-adv-x="2248" d="M649 1284l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-420h885l-395 483q-13 16 -13 35q0 40 79 40h867q88 0 88 -78q0 -35 -19 -57l-366 -431q209 -18 335 -139.5t142 -326.5q5 -68 9 -136q13 -94 53 -114l46 -15q25 -9 25 -24q0 -22 -35 -22h-87q-106 0 -146 92 q-23 55 -29 184q-8 172 -95.5 295t-252.5 155v-583q0 -28 8 -42q22 -40 150 -40v-61q-76 6 -139 6h-200q-63 0 -139 -6v61q128 0 150 40q8 14 8 42v583q-165 -32 -252.5 -155t-95.5 -295q-6 -129 -29 -184q-40 -92 -146 -92h-87q-35 0 -35 22q0 15 25 24l46 15q40 20 53 114 q4 68 9 136q23 300 271 414h-688v-584q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62zM1819 1209q0 78 -88 78h-469 q-79 0 -79 -40q0 -19 13 -35l321 -393l283 333q19 22 19 57z" />
+<glyph unicode="&#x46d;" horiz-adv-x="1795" d="M1744 23q0 -23 -38 -23h-66q-84 0 -116 61q-20 38 -27 135q-19 253 -236 299v-332q0 -71 31 -88q18 -9 83 -9h14v-66l-200 6l-202 -6v66q5 0 18.5 -0.5t20.5 -0.5q53 0 70.5 20.5t17.5 73.5v336q-217 -46 -236 -299q-7 -97 -27 -135q-32 -61 -116 -61h-66q-38 0 -38 23 q0 14 24 23q18 5 36 11q26 13 34 72l6 86q18 181 163 268h-524v-316q0 -49 9 -68q16 -33 159 -33v-66q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-207h698l-279 304 q-13 14 -13 31q0 39 71 39h650q78 0 78 -64q0 -28 -17 -46l-258 -272q145 -17 237.5 -100.5t106.5 -225.5l6 -86q8 -59 34 -72q18 -6 36 -11q24 -9 24 -23zM1449 822q0 40 -54 40h-366q-33 0 -33 -15q0 -8 7 -16l232 -253l203 213q11 12 11 31z" />
+<glyph unicode="&#x46e;" horiz-adv-x="1178" d="M621 32l-189 15q-64 0 -107 -54t-43 -107t23 -89.5t67 -36.5t165.5 61.5t192.5 61.5q151 0 202 -94q33 -63 39 -231h-21q-20 85 -44 112q-33 40 -102 40t-177 -49t-168 -49q-105 0 -180 80t-75 181.5t63.5 182t158.5 80.5q31 0 91.5 -9t91.5 -9q286 0 286 241 q0 156 -98.5 247t-255.5 91h-116q-78 -1 -116.5 -1t-38.5 30q0 16 13 22.5t170.5 18t256.5 77.5q150 100 150 257q0 111 -103 174q-87 53 -225.5 53t-242.5 -62.5t-130 -138.5q-4 -20 -17 -58q-10 -20 -35 -20q-41 0 -39 46l9 246q2 49 35 49q26 0 112 -85q127 79 306 85 l-272 175l29 41l294 -152l292 152l29 -41l-274 -179q163 -16 278 -79q147 -80 147 -208q0 -261 -386 -360q172 -25 295 -115q148 -108 148 -265q0 -176 -166 -261q-128 -66 -323 -66z" />
+<glyph unicode="&#x46f;" horiz-adv-x="920" d="M395 50l69 -5q102 0 160.5 54t58.5 154q0 222 -251 222h-118q-55 0 -55 23t29.5 25.5t79.5 5.5q122 8 192 62q86 66 86 151.5t-58.5 121t-151 35.5t-165 -36.5t-94 -91t-36.5 -54.5q-28 0 -28 58v122q0 37 5 47.5t36 8.5q25 -19 77 -54q85 50 206 54l-284 287l29 41 l294 -252l292 252l29 -41l-285 -290q118 -12 200 -55q105 -55 105 -145q0 -170 -254 -242q112 -21 195 -81q102 -73 102 -174q0 -131 -96 -201.5t-231 -70.5l-142 -6q-62 0 -105 -43t-43 -105q0 -80 55 -80q38 0 154 53t176 53q129 0 173 -84q29 -55 34 -204l-18 -2 q-19 75 -38 98q-27 34 -86 34t-154 -42t-144 -42q-91 0 -155 64.5t-64 156t63.5 155t155.5 63.5z" />
+<glyph unicode="&#x470;" horiz-adv-x="1588" d="M460 61l83 -2q139 0 159 40q11 22 11 62v282q-218 9 -356.5 152.5t-155.5 363.5q-5 68 -9 136q-13 94 -53 114l-46 15q-25 9 -25 24q0 22 35 22h87q106 0 146 -92q23 -55 29 -184q8 -179 91 -313q95 -154 257 -185v710q0 25 -7 42q-16 39 -216 39h-30v62q74 -6 143 -6 h382q69 0 143 6v-62h-30q-200 0 -216 -39q-7 -17 -7 -42v-710q162 31 257 185q83 134 91 313q6 129 29 184q40 92 146 92h87q35 0 35 -22q0 -15 -25 -24l-46 -15q-40 -20 -53 -114q-4 -68 -9 -136q-17 -220 -155.5 -363.5t-356.5 -152.5v-282q0 -40 11 -62q20 -40 159 -40 l83 2v-61q-74 6 -143 6h-382q-69 0 -143 -6v61z" />
+<glyph unicode="&#x471;" horiz-adv-x="1254" d="M1201 656q0 -244 -99 -438q-122 -241 -343 -241v-389h-83v389q-414 0 -414 386v415q0 39 -21 73.5t-58 34.5q-79 0 -79 -173q0 -7 3 -84h-55v120q0 84 47 143.5t132 59.5t132.5 -62.5t47.5 -153.5v-351q0 -186 39 -256q55 -100 226 -100v894h83v-894q151 0 248 146 q86 130 86 289q0 70 -42.5 200.5t-42.5 199.5q0 96 67 96q85 0 112 -118q14 -59 14 -186z" />
+<glyph unicode="&#x472;" horiz-adv-x="1445" d="M722 -43q-280 0 -467 214t-187 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503t-187.5 -499t-467.5 -213.5zM1175 696q0 438 -260 590q-92 54 -192 54t-191 -53q-262 -153 -262 -591q0 -469 265 -632q91 -56 185 -56t188 55q267 156 267 633zM869 560q-70 0 -185 56.5 t-155 56.5q-100 0 -138 -113h-61q20 102 85 169.5t164 67.5q66 0 177 -54.5t158 -54.5q95 0 143 121h61q-32 -118 -79 -175q-62 -74 -170 -74z" />
+<glyph unicode="&#x473;" horiz-adv-x="1054" d="M191.5 118.5q-138.5 142.5 -138.5 341.5t138 349.5t336.5 150.5t336.5 -151t138 -350.5t-139 -341t-336 -141.5t-335.5 142.5zM776 188q47 92 47 292.5t-56 292.5q-84 138 -244.5 138t-241.5 -143q-51 -90 -51 -294.5t55 -299.5q83 -144 246.5 -144t244.5 158zM627 385 q-49 0 -127.5 39t-106.5 39q-65 0 -91 -78h-51q34 173 177 173q46 0 122 -37.5t108 -37.5q63 0 95 83h51q-49 -181 -177 -181z" />
+<glyph unicode="&#x474;" horiz-adv-x="1601" d="M1533 1205q0 -92 -91 -92q-38 0 -64 25.5t-26 64.5q0 71 63 91q-23 10 -51 10q-81 0 -134 -134l-470 -1184q-12 -31 -38 -31t-39 2l-426 1248q-12 35 -25 49q-26 28 -164 28v61q138 -6 299 -6t232 6v-61q-165 0 -165 -59q0 -13 9 -39l337 -985l387 975q76 191 197 191 q67 0 118 -47t51 -113z" />
+<glyph unicode="&#x475;" horiz-adv-x="1167" d="M1115 805q0 -75 -74 -75t-74 73q0 52 50 71q-23 10 -50 10q-49 0 -83 -68q-4 -7 -43 -105l-293 -735h-30q-2 1 -5.5 1t-11 -0.5t-11.5 -0.5l-259 763q-30 87 -55 102.5t-123 15.5v66q90 -6 175 -6t264 6v-66h-4q-125 0 -125 -60q0 -5 208 -615l242 598q68 158 154 158 q57 0 102.5 -38.5t45.5 -94.5z" />
+<glyph unicode="&#x476;" horiz-adv-x="1601" d="M1533 1205q0 -92 -91 -92q-38 0 -64 25.5t-26 64.5q0 71 63 91q-23 10 -51 10q-81 0 -134 -134l-470 -1184q-12 -31 -38 -31t-39 2l-426 1248q-12 35 -25 49q-26 28 -164 28v61q138 -6 299 -6t232 6v-61q-165 0 -165 -59q0 -13 9 -39l337 -985l387 975q76 191 197 191 q67 0 118 -47t51 -113zM813 1532q0 28 20 51t44.5 23t43.5 -13l292 -195l-26 -50l-328 123q-46 17 -46 61zM463 1532q0 28 20 51t44.5 23t43.5 -13l292 -195l-26 -50l-328 123q-46 17 -46 61z" />
+<glyph unicode="&#x477;" horiz-adv-x="1167" d="M1115 805q0 -75 -74 -75t-74 73q0 52 50 71q-23 10 -50 10q-49 0 -83 -68q-4 -7 -43 -105l-293 -735h-30q-2 1 -5.5 1t-11 -0.5t-11.5 -0.5l-259 763q-30 87 -55 102.5t-123 15.5v66q90 -6 175 -6t264 6v-66h-4q-125 0 -125 -60q0 -5 208 -615l242 598q68 158 154 158 q57 0 102.5 -38.5t45.5 -94.5zM595 1300q-29 24 -29 54t23.5 53t54 23t53.5 -29l248 -322l-37 -35zM225 1300q-29 24 -29 54t23.5 53t54 23t53.5 -29l248 -322l-37 -35z" />
+<glyph unicode="&#x478;" horiz-adv-x="2481" d="M2429 805q0 -75 -74 -75t-74 73q0 52 50 71q-23 10 -50 10q-49 0 -83 -68q-6 -12 -43 -105l-361 -905q-98 -245 -274 -245q-76 0 -136 50t-60 124q0 91 89 91q39 0 65 -25.5t26 -63.5q0 -81 -85 -91q41 -38 101 -38q93 0 158 92q32 45 86 173l42 100l-261 766 q-30 87 -55 102.5t-123 15.5v66q90 -6 175 -6t264 6v-66h-4q-125 0 -125 -60q0 -5 208 -615l242 598q68 158 154 158q57 0 102.5 -38.5t45.5 -94.5zM722 -43q-280 0 -467 214t-187 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503t-187.5 -499t-467.5 -213.5zM1177 605 q0 216 -65 385q-79 205 -240 296q-96 54 -195.5 54t-187.5 -53q-223 -135 -223 -509q0 -221 68 -401q81 -217 244 -313q95 -56 189 -56t184 55q226 139 226 542z" />
+<glyph unicode="&#x479;" horiz-adv-x="1951" d="M946 481.5q0 -201.5 -127.5 -353.5t-324.5 -152t-319 143.5t-122 341t126.5 348.5t321 151t320 -138.5t125.5 -340zM783 406q0 187 -65 326q-84 180 -250 180q-135 0 -200 -121q-52 -96 -52 -262.5t67 -311.5q87 -187 251 -187q249 0 249 376zM1899 805q0 -75 -74 -75 t-74 73q0 52 50 71q-23 10 -50 10q-49 0 -83 -68q-6 -12 -43 -105l-361 -905q-98 -245 -274 -245q-76 0 -136 50t-60 124q0 91 89 91q39 0 65 -25.5t26 -63.5q0 -81 -85 -91q41 -38 101 -38q93 0 158 92q32 45 86 173l42 100l-261 766q-30 87 -55 102.5t-123 15.5v66 q90 -6 175 -6t264 6v-66h-4q-125 0 -125 -60q0 -5 208 -615l242 598q68 158 154 158q57 0 102.5 -38.5t45.5 -94.5z" />
+<glyph unicode="&#x47a;" horiz-adv-x="1764" d="M1528 1121q168 -178 168 -444.5t-166 -446.5q-196 -212 -575 -231l28 -138q2 -10 2 -18q0 -38 -31.5 -62t-71.5 -24t-71.5 24t-31.5 62q0 8 2 18l28 138q-376 19 -573 227q-168 178 -168 444.5t166 446.5q196 212 575 231l-28 138q-2 10 -2 18q0 38 31.5 62t71.5 24 t71.5 -24t31.5 -62q0 -8 -2 -18l-28 -138q376 -19 573 -227zM1494 656q0 427 -340 584q-100 46 -209 57l-35 -175q-9 -45 -28 -45t-28 47l-35 173q-111 -10 -208 -53q-341 -150 -341 -552q0 -427 340 -584q100 -46 209 -57l35 174q9 45 28 45t28 -47l35 -172q111 10 208 53 q341 150 341 552z" />
+<glyph unicode="&#x47b;" horiz-adv-x="1336" d="M1113 802q170 -124 170 -328.5t-160.5 -328t-397.5 -137.5l24 -118q1 -5 1 -15q0 -31 -25 -50t-57 -19t-57 19t-25 50q0 10 1 15l24 118q-235 14 -388 126q-170 124 -170 328.5t160.5 328t397.5 137.5l-24 118q-1 5 -1 15q0 31 25 50t57 19t57 -19t25 -50q0 -10 -1 -15 l-24 -118q235 -14 388 -126zM1038 210q68 87 68 257.5t-73 262.5q-104 131 -318 149l-25 -124q-7 -36 -21.5 -36t-22.5 38l-25 122q-222 -19 -323 -148q-68 -87 -68 -257.5t73 -262.5q104 -131 319 -149l24 119q7 36 21.5 36t22.5 -38l24 -117q222 18 324 148z" />
+<glyph unicode="&#x47c;" horiz-adv-x="1686" d="M1198 1309q-108 0 -255.5 107t-268.5 107q-157 0 -239 -241l-37 43q79 281 352 281q100 0 203 -59l163 -110q90 -59 150.5 -59t125.5 33l21 -39q-107 -63 -215 -63zM695 1382l7 -49q0 -28 -20.5 -50t-48.5 -22q-79 0 -79 83q0 48 39.5 80.5t89.5 32.5q154 0 243 -161 l-27 -18q-74 129 -177 129q-27 0 -27 -25zM1618 598q0 -243 -113 -426q-133 -215 -366 -215t-292 247h-8q-59 -247 -292 -247t-366 215q-113 183 -113 426q0 462 470 619l13 -41q-168 -68 -231 -216q-49 -113 -49 -321q0 -630 294 -630q94 0 156.5 99t62.5 205t-23 210.5 t-23 122.5q0 125 105 125t105 -125q0 -18 -23 -122.5t-23 -210.5t62.5 -205t156.5 -99q294 0 294 630q0 208 -49 321q-63 148 -231 216l13 41q470 -157 470 -619z" />
+<glyph unicode="&#x47d;" horiz-adv-x="1294" d="M1123 1184q-94 -63 -189 -63t-223.5 107t-235.5 107q-137 0 -210 -241l-37 43q31 125 111 203t197 78t258.5 -114t205.5 -114q45 0 102 33zM493 1194l7 -49q0 -28 -20.5 -50t-48.5 -22q-79 0 -79 83q0 48 39.5 80.5t89.5 32.5q154 0 243 -161l-27 -18q-74 129 -177 129 q-27 0 -27 -25zM1241 430q0 -173 -79 -302q-93 -152 -255 -152q-224 0 -256 267h-8q-32 -267 -256 -267q-162 0 -255 152q-79 129 -79 302q0 244 124.5 385.5t365.5 144.5v-48q-327 -10 -327 -470q0 -169 25 -257q44 -155 169 -155q99 0 149 102q39 79 39 191.5t-23 219.5 t-23 122q0 116 95 116t95 -116q0 -15 -23 -122t-23 -219.5t39 -191.5q50 -102 149 -102q125 0 169 155q25 88 25 257q0 460 -327 470v48q241 -3 365.5 -144.5t124.5 -385.5z" />
+<glyph unicode="&#x47e;" horiz-adv-x="1686" d="M1094 1510h-60q-90 0 -109 -7q-40 -15 -40 -81v-71h-84v71q0 66 -40 81q-19 7 -109 7h-60q-142 0 -186 -30t-56 -137h-63l20 263h1072l20 -263h-63q-12 107 -56 137t-186 30zM1618 617q0 -252 -109 -438q-131 -222 -366.5 -222t-295.5 247h-8q-60 -247 -295.5 -247 t-366.5 222q-109 186 -109 438q0 533 428 701l14 -41q-133 -76 -194 -286q-46 -156 -46 -356q0 -626 295 -626q94 0 156.5 99t62.5 205t-23 210.5t-23 122.5q0 125 105 125t105 -125q0 -18 -23 -122.5t-23 -210.5t62.5 -205t156.5 -99q295 0 295 626q0 200 -46 356 q-61 210 -194 286l14 41q428 -168 428 -701z" />
+<glyph unicode="&#x47f;" horiz-adv-x="1294" d="M1241 430q0 -173 -79 -302q-93 -152 -255 -152q-224 0 -256 267h-8q-32 -267 -256 -267q-162 0 -255 152q-79 129 -79 302q0 244 124.5 385.5t365.5 144.5v-48q-327 -10 -327 -470q0 -169 25 -257q44 -155 169 -155q99 0 149 102q39 79 39 191.5t-23 219.5t-23 122 q0 116 95 116t95 -116q0 -15 -23 -122t-23 -219.5t39 -191.5q50 -102 149 -102q125 0 169 155q25 88 25 257q0 460 -327 470v48q241 -3 365.5 -144.5t124.5 -385.5zM833 1257q-87 0 -108 -8q-40 -15 -40 -80v-154h-74v154q0 66 -41 81q-20 7 -110 7q-155 0 -195.5 -42.5 t-50.5 -199.5h-53l25 328h921l26 -328h-54q-11 156 -51 199t-195 43z" />
+<glyph unicode="&#x480;" horiz-adv-x="1335" d="M1267 854q0 -26 -29 -26t-35 32q-12 60 -47 178q-51 127 -151 208.5t-217.5 81.5t-219.5 -50q-147 -72 -222.5 -224.5t-75.5 -333.5t82 -337.5t240 -224.5q95 -41 170 -41t133 17v-430q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61 q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v353q-267 12 -460 204.5t-193 462.5t204 467.5t480 197.5q193 0 363 -169l99 144q17 25 31 25q22 0 22 -33v-503z" />
+<glyph unicode="&#x481;" horiz-adv-x="896" d="M730 906q113 -64 113 -170t-97 -106q-42 0 -70.5 28t-28.5 70q0 94 100 99q-79 78 -229 78q-60 0 -120 -34q-168 -94 -168 -371q0 -119 43.5 -228t134.5 -158q63 -34 122.5 -34t105.5 17v-172q0 -214 -36 -342h-148q37 173 37 311v133q-183 9 -309.5 144t-126.5 323 t135 327t327 139q121 0 215 -54z" />
+<glyph unicode="&#x482;" horiz-adv-x="874" d="M789 960q-64 0 -124 -130l-107 -233l129 -41l-36 -73l-112 73l-152 -325l130 -38l-36 -73l-112 73l-79 -165q-42 -88 -42 -138.5t74 -94.5l-16 -36l-304 144l14 34q44 -15 68 -15q63 0 129 125q1 2 79 182l-122 35l33 73l107 -69l153 326l-124 35l34 73l108 -69l109 231 q36 76 36 122q0 66 -74 97l16 37l304 -144l-14 -35q-40 19 -69 19z" />
+<glyph unicode="&#x483;" horiz-adv-x="0" d="M1054 1372q-94 -63 -189 -63t-223.5 107t-235.5 107q-137 0 -210 -241l-37 43q31 125 111 203t197 78t258.5 -114t205.5 -114q45 0 102 33zM424 1382l7 -49q0 -28 -20.5 -50t-48.5 -22q-79 0 -79 83q0 48 39.5 80.5t89.5 32.5q154 0 243 -161l-27 -18q-74 129 -177 129 q-27 0 -27 -25z" />
+<glyph unicode="&#x484;" horiz-adv-x="0" d="M1003 1352q-85 -63 -182 -63t-211 107.5t-211 107.5t-165 -241l-24 32q66 291 273 291q100 0 229.5 -118.5t186.5 -118.5q37 0 90 31z" />
+<glyph unicode="&#x485;" horiz-adv-x="0" d="M631 1402l11 65q0 32 -37 32q-133 0 -233 -170l-27 18q121 219 313 219q66 0 118 -43t52 -99t-28.5 -87t-71.5 -31t-70 29t-27 67z" />
+<glyph unicode="&#x486;" horiz-adv-x="0" d="M532 1467l10 -65q0 -38 -26.5 -67t-69.5 -29t-72 31t-29 87t52.5 99t118.5 43q191 0 312 -219l-26 -18q-100 170 -233 170q-37 0 -37 -32z" />
+<glyph unicode="&#x487;" horiz-adv-x="0" d="M462 1521q-98 0 -156 -73q-23 -29 -85 -158h-114q70 149 128 206q85 85 221 85q40 0 237 -74t418 -136l-74 -81q-75 24 -274 109l-151 73q-104 49 -150 49z" />
+<glyph unicode="&#x488;" horiz-adv-x="0" d="M2257 1026h-32q-3 82 -79 137.5t-161 55.5t-161 -55.5t-79 -137.5h-32q0 120 77.5 216.5t194.5 96.5t194.5 -96.5t77.5 -216.5zM2519 433h-32q-3 82 -79 137.5t-161 55.5t-161 -55.5t-79 -137.5h-32q0 120 77.5 216.5t194.5 96.5t194.5 -96.5t77.5 -216.5zM1542 1293h-32 q-3 82 -79 137.5t-161 55.5t-161 -55.5t-79 -137.5h-32q0 120 77.5 216.5t194.5 96.5t194.5 -96.5t77.5 -216.5zM2257 -169h-32q-3 82 -79 137.5t-161 55.5t-161 -55.5t-79 -137.5h-32q0 120 77.5 216.5t194.5 96.5t194.5 -96.5t77.5 -216.5zM827 1019h-32q-3 82 -79 137.5 t-161 55.5t-161 -55.5t-79 -137.5h-32q0 120 77.5 216.5t194.5 96.5t194.5 -96.5t77.5 -216.5zM1542 -442h-32q-3 82 -79 137.5t-161 55.5t-161 -55.5t-79 -137.5h-32q0 120 77.5 216.5t194.5 96.5t194.5 -96.5t77.5 -216.5zM565 429h-32q-3 82 -79 137.5t-161 55.5 t-161 -55.5t-79 -137.5h-32q0 120 77.5 216.5t194.5 96.5t194.5 -96.5t77.5 -216.5zM827 -169h-32q-3 82 -79 137.5t-161 55.5t-161 -55.5t-79 -137.5h-32q0 120 77.5 216.5t194.5 96.5t194.5 -96.5t77.5 -216.5z" />
+<glyph unicode="&#x489;" horiz-adv-x="0" d="M2266 1000q0 -19 -27 -19l-62 21q-48 16 -98 16q-73 0 -73 -39q0 -10 13.5 -42.5t13.5 -62.5t-29 -56.5t-70.5 -26.5t-70.5 32.5t-29 76.5q0 82 69.5 128t140 46t146.5 -24.5t76 -49.5zM1609 1593q33 13 49.5 13t16.5 -15.5t-7 -20.5t-47.5 -22t-82.5 -53t-42 -73 q0 -17 60 -46t60 -76.5t-28.5 -77t-78 -29.5t-81.5 43.5t-32 100.5q0 171 213 256zM2308 199q12 -30 12 -48t-15 -18t-20 7t-21.5 47t-53.5 82.5t-73 42.5q-18 0 -47 -60t-76 -60t-76.5 29t-29.5 78.5t43.5 81t100.5 31.5q171 0 256 -213zM992.5 1345q26.5 -30 26.5 -71 t-32.5 -69.5t-76.5 -28.5q-82 0 -127.5 69t-45.5 140.5t17 124.5q31 96 56 96q19 0 19 -26q0 3 -18.5 -52t-18.5 -106q0 -74 39 -74q10 0 42.5 13.5t62.5 13.5t56.5 -30zM1795 -257q0 -39 -17.5 -112t-40.5 -73t-23 25q0 -8 14 44.5t14 94.5q0 92 -46 92q-8 0 -42 -17 t-65 -17t-58 29.5t-27 71.5t33.5 71.5t79.5 29.5q84 0 134 -81q44 -69 44 -158zM624.5 884q29.5 -29 29.5 -78.5t-43 -80.5t-100 -31q-172 0 -257 213q-12 30 -12 47.5t14.5 17.5t20.5 -7.5t22.5 -47t52.5 -82t72 -42.5q18 0 47.5 60t76.5 60t76.5 -29zM1083 -185 q0 -187 -248 -250q-28 -7 -39 -7q-25 0 -25 19q0 13 10.5 19t50.5 16t90 43t50 69q0 14 -52 47.5t-52 77t30.5 72t77.5 28.5t77 -39.5t30 -94.5zM651 201q0 -81 -69 -126.5t-139.5 -45.5t-146.5 24.5t-76 49.5q0 19 27 19q-4 0 52.5 -19t106.5 -19q73 0 73 39q0 10 -14 42.5 t-14 62.5t29.5 56.5t71 26.5t70.5 -32.5t29 -77.5z" />
+<glyph unicode="&#x48a;" horiz-adv-x="1631" d="M1564 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61l-329 -427l-29 22l91 184q66 139 66 176q0 45 -92 45h-288v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v964l-734 -1008l1 -1q14 -30 90 -35q3 0 30 -0.5t77 0.5v-61 q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-967l734 1009q-15 37 -149 37h-46v62q70 -6 112 -6h356q43 0 113 6 v-62zM1163 1516q0 -85 -140 -130q-101 -33 -211 -33t-211 33q-140 45 -140 130q0 39 25 64.5t64 25.5t64 -25.5t25 -70.5t-38 -70q63 -24 174 -24h74q111 0 174 24q-38 25 -38 70t25 70.5t64 25.5t64 -25.5t25 -64.5z" />
+<glyph unicode="&#x48b;" horiz-adv-x="1261" d="M1048 -45q0 45 -70 45h-256v66q142 0 158 33q9 19 9 68v570l-499 -653q38 -18 148 -18v-66q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v589q0 49 -9 68q-16 33 -158 33v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-570l499 653q-38 18 -147 18v66 q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-589q0 -49 9 -68q16 -33 159 -33v-66l-246 -336l-39 27q28 36 78.5 134t50.5 130zM892 1398q89 0 89 -96t-113.5 -158.5t-237.5 -62.5t-229 58q-122 67 -122 163t89 96t89 -90t-89 -90q99 -74 262 -74t262 74 q-89 0 -89 90t89 90z" />
+<glyph unicode="&#x48c;" horiz-adv-x="1346" d="M1104 636q174 -101 174 -269t-135.5 -267.5t-302.5 -99.5h-772v61q62 -2 63 -2q113 0 134 45q5 11 5 42v845h-202v62h202v287h164v-287h382v-62h-382v-270h336q188 0 334 -85zM994 147q88 86 88 221t-87 222t-210 87h-351v-537q0 -53 16.5 -66t69.5 -13h257q129 0 217 86 z" />
+<glyph unicode="&#x48d;" horiz-adv-x="1118" d="M975 344q27 -46 27 -94t-26 -95q-86 -155 -316 -155h-598v66h9q132 0 148 30q10 18 10 71v504h-167v62h167v190h135v-190h178v-62h-178v-185h289q238 0 322 -142zM608 66q93 0 158 49.5t65 138t-54.5 145.5t-140.5 57h-272v-302q0 -62 14 -75t78 -13h152z" />
+<glyph unicode="&#x48e;" horiz-adv-x="1295" d="M1074 1249q154 -106 154 -264.5t-130 -256.5t-289 -108l140 -243l-54 -31l-158 273h-293v-473q0 -32 7 -48q17 -37 181 -37h17v-61q-72 6 -133 6h-326q-50 0 -122 -6v61l55 -1q122 0 140 38q7 15 7 48v1051q0 32 -7 48q-16 37 -158 37q-18 0 -37 -1v62h695q174 0 311 -94 zM1024 977q0 161 -75.5 232.5t-237.5 71.5h-186q-53 0 -69.5 -13t-16.5 -66v-532h269l-137 237l54 31l153 -265q246 28 246 304z" />
+<glyph unicode="&#x48f;" horiz-adv-x="1160" d="M360 805q127 141 308 141t310 -146.5t129 -327.5t-105.5 -314.5t-266.5 -169.5l106 -184l-54 -31l-118 205q-19 -2 -38 -2q-78 0 -158.5 42t-105.5 109v-388q0 -42 11 -59q19 -29 114 -29q19 0 41 1v-66q-169 5 -241.5 5t-238.5 -5v66q37 -2 76.5 -2t60.5 14q30 19 30 83 v1002q0 51 -10 71.5t-44 28.5q-26 6 -83 6h-30v68l307 23v-141zM705 39q107 39 165.5 166t58.5 267t-67 267q-81 154 -218 154q-179 0 -277 -172v-478q0 -46 30 -89q91 -130 225 -130q10 0 20 1l-125 215l54 31z" />
+<glyph unicode="&#x490;" horiz-adv-x="1216" d="M530 1281q-51 0 -68.5 -13t-17.5 -66v-1065q0 -22 8 -39q17 -37 223 -37h22v-61q-74 6 -120 6h-382q-55 0 -127 -6v61q8 0 26 -0.5t28 -0.5q124 0 141 38q7 15 7 48v1053q0 31 -7 47q-15 35 -170 35h-25v62h676q170 0 241.5 61t97.5 202h51l-40 -325h-564z" />
+<glyph unicode="&#x491;" horiz-adv-x="934" d="M525 856q-78 0 -106 -11q-48 -20 -48 -86v-588q0 -47 6 -62q10 -26 47 -34t154 -8v-67q-87 6 -203 6h-83h3q0 -1 -240 -6v67h86q60 5 71 28.5t11 71.5v589q0 48 -11 71.5t-71 28.5h-86v67h380q198 0 253 33q80 47 98 229h53l-38 -329h-276z" />
+<glyph unicode="&#x492;" horiz-adv-x="1216" d="M744 1281h-214q-51 0 -68.5 -13.5t-17.5 -65.5v-559h593v-62h-593v-444q0 -22 8 -39q17 -37 223 -37h22v-61q-74 6 -120 6h-382q-55 0 -127 -6v61q8 0 26 -0.5t28 -0.5q124 0 141 38q7 15 7 48v435h-202v62h202v556q0 31 -7 47q-15 35 -170 35h-25v62h1026l55 -442h-49 q-24 212 -82 285q-74 95 -274 95z" />
+<glyph unicode="&#x493;" horiz-adv-x="1035" d="M535 856q-112 0 -122 -2q-32 -6 -40 -31q-3 -10 -3 -55v-305h325v-62h-325v-230q0 -47 7 -62q10 -26 51 -34.5t150 -8.5v-66q-80 6 -178 6t-344 -6v66q140 0 157 30q10 18 10 71v234h-167v62h167v293q0 52 -10 70q-16 30 -151 30h-6v67h846l38 -328h-53q-18 182 -98 229 q-55 32 -254 32z" />
+<glyph unicode="&#x494;" horiz-adv-x="1216" d="M556 793q284 0 463 -162t179 -442t-180.5 -450.5t-461.5 -170.5q-118 0 -233 59t-195 153l43 32q176 -175 392.5 -175t332.5 167q100 145 100 378.5t-102 379.5q-117 169 -338 169q-54 0 -112 -12v-582q0 -22 8 -39q17 -37 223 -37h22v-61q-74 6 -120 6h-382 q-55 0 -127 -6v61q8 0 26 -0.5t28 -0.5q124 0 141 38q7 15 7 48v1053q0 31 -7 47q-15 35 -170 35h-25v62h1026l55 -442h-49q-24 212 -82 285q-74 95 -274 95h-214q-51 0 -68.5 -13t-17.5 -66v-417q56 8 112 8z" />
+<glyph unicode="&#x495;" horiz-adv-x="1035" d="M946 251q0 -113 -58 -230q-153 -310 -568 -463l-14 48q194 72 327 220q150 165 150 357q0 114 -63 186t-176 72q-84 0 -174 -75v-195q0 -47 7 -62q10 -26 51 -34.5t150 -8.5v-66q-80 6 -178 6t-344 -6v66q140 0 157 30q10 18 10 71v589q0 52 -10 70q-16 30 -151 30h-6v67 h846l38 -328h-53q-18 182 -98 229q-55 32 -254 32q-112 0 -122 -2q-32 -6 -40 -31q-3 -10 -3 -55v-325q133 118 247 118q147 0 238 -82.5t91 -227.5z" />
+<glyph unicode="&#x496;" horiz-adv-x="2214" d="M1399 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-447q289 8 434 167q62 67 159 289q67 154 167 154q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-41 -17 -97.5 -159.5t-116.5 -215.5q-106 -130 -287 -165v-8q116 -16 221 -77t151 -158 q25 -54 39 -150l25 -181q3 -17 14 -50q24 -47 168 -47h29q0 -10 -0.5 -37.5t-0.5 -41.5q0 -312 87 -376q-93 17 -183 183t-167 197q-50 20 -84 52q-82 76 -82 237q0 13 1 40v40q0 136 -83 239.5t-216 103.5h-138v-559q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-344 q-49 0 -120 -6v61h10q169 0 186 33q9 17 9 45v559h-138q-133 0 -216 -103.5t-83 -239.5q0 -13 0.5 -40t0.5 -40q0 -318 -330 -318q-83 0 -134.5 65t-51.5 151q0 33 24 33q18 0 24 -31q32 -175 131 -175q88 0 118 158l23 169q16 108 41 162q46 97 151 158t221 77v8 q-181 35 -287 165q-60 73 -116.5 215.5t-97.5 159.5q10 -22 10 -53t-26 -56.5t-65 -25.5q-90 0 -90 92q0 54 39 95t92 41q100 0 167 -154q97 -222 159 -289q145 -159 434 -167v447q0 29 -6 44q-16 40 -142 40l-57 -2v62q70 -6 120 -6h344q50 0 120 6v-62z" />
+<glyph unicode="&#x497;" horiz-adv-x="1611" d="M1567 66l-2 -101q0 -212 94 -231q-86 0 -157 105q-97 146 -134 173q-92 69 -102 215q-5 76 -20 111.5t-70 70.5q-108 69 -236 69l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -237 6t-244 -6v66q7 0 23.5 -0.5t54 -0.5t63.5 16t26 77v313l-56 7 q-128 0 -236 -69q-55 -35 -70.5 -71t-20 -119.5t-53.5 -158.5t-134 -75q-67 0 -101 67q-27 53 -27 128q0 34 27 34q22 0 26 -26q10 -62 16 -78q17 -44 57 -44q66 0 66 141.5t62.5 205t196.5 93.5q-68 33 -107 130l-53 156q-32 76 -89 76q-25 0 -25 -18q0 -3 16 -29.5t16 -60 t-27.5 -62t-66.5 -28.5q-102 0 -102 102q0 70 46 118t112 48q148 0 200 -178q37 -124 57 -151q51 -70 178 -70h92v226q0 41 -9 59q-17 33 -150 33h-8v66q208 -6 243.5 -6t237.5 6v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-226h92q127 0 178 70q20 27 53.5 140.5 t96.5 158.5q42 30 107.5 30t111.5 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18q-57 0 -89 -76l-53 -156q-39 -97 -107 -130q134 -30 196.5 -93t62.5 -193q0 -92 20 -124q19 -30 149 -30h8z" />
+<glyph unicode="&#x498;" horiz-adv-x="1244" d="M1176 359q0 -85 -50 -164q-148 -235 -514 -238q172 -70 216 -159q14 -28 14 -55q0 -42 -35 -81q-57 -65 -154 -65q-143 0 -252 149l33 30q69 -95 158 -95q42 0 71.5 22.5t29.5 54.5q0 14 -7 28q-45 89 -186 174q-177 10 -281 67q-78 -70 -98 -70q-33 0 -34 33l-12 275 q-1 32 41 32q22 0 26.5 -6t11.5 -51t26 -79q80 -144 421 -144q160 0 260 93t100 250t-98.5 247t-255.5 90h-116q-78 -1 -116.5 -1t-38.5 30q0 16 13 22.5t170.5 18t256.5 77.5q150 100 150 257q0 111 -103 174q-87 53 -225.5 53t-242.5 -62.5t-130 -138.5q-4 -20 -17 -58 q-10 -20 -35 -20q-41 0 -39 46l9 246q2 49 35 49q26 0 112 -85q136 85 318 85t326 -64q185 -82 185 -227q0 -261 -386 -360q172 -25 295 -115q148 -108 148 -265z" />
+<glyph unicode="&#x499;" horiz-adv-x="920" d="M860 253q0 -59 -36 -116q-97 -152 -346 -166q180 -79 180 -171q0 -54 -48.5 -88t-105.5 -34q-118 0 -208 123l33 30q57 -78 129.5 -78t72.5 57q0 10 -5 21q-33 70 -153 141q-122 6 -198 41l-64 -43q-31 -2 -36 8.5t-5 47.5v122q0 58 28 58q20 0 26 -20q2 -23 17 -71 q45 -85 293.5 -85t248.5 222.5t-251 222.5h-118q-55 0 -55 23t29.5 25.5t79.5 5.5q122 8 192 62q86 66 86 151.5t-58.5 121t-151 35.5t-165 -36.5t-94 -91t-36.5 -54.5q-28 0 -28 58v122q0 37 5 47q4 9 27 9h9q25 -19 77 -54q91 54 218 54t232 -43q136 -57 136 -160 q0 -170 -254 -242q112 -21 195 -81q102 -73 102 -174z" />
+<glyph unicode="&#x49a;" horiz-adv-x="1514" d="M649 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-447q324 0 480 158q72 73 163 294q65 158 167 158q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-41 -17 -97.5 -159.5t-116.5 -215.5q-106 -130 -287 -165v-8q116 -16 221 -77t151 -158 q25 -54 39 -150l25 -181q3 -17 14 -50q24 -47 168 -47h29q0 -10 -0.5 -37.5t-0.5 -41.5q0 -312 87 -376q-93 17 -183 183t-167 197q-50 20 -84 52q-82 76 -82 237q0 13 1 40v40q0 136 -83 239.5t-216 103.5h-188v-559q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-347 q-43 0 -114 -6v61q8 0 26.5 -0.5t28.5 -0.5q125 0 141 40q6 15 6 44v1066q0 27 -7 41q-16 33 -176 33h-19v62q70 -6 119 -6h342q50 0 120 6v-62z" />
+<glyph unicode="&#x49b;" horiz-adv-x="1080" d="M1036 66l-2 -101q0 -212 94 -231q-86 0 -157 105q-97 146 -134 173q-92 69 -102 215q-5 76 -20 111.5t-70 70.5q-108 69 -236 69l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -237 6t-244 -6v66q7 0 23.5 -0.5t54 -0.5t63.5 16t26 77v607q0 41 -9 59 q-17 33 -150 33h-8v66q208 -6 243.5 -6t237.5 6v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-226h92q127 0 178 70q20 27 53.5 140.5t96.5 158.5q42 30 107.5 30t111.5 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18 q-57 0 -89 -76l-53 -156q-39 -97 -107 -130q134 -30 196.5 -93t62.5 -193q0 -92 20 -124q19 -30 149 -30h8z" />
+<glyph unicode="&#x49c;" horiz-adv-x="1514" d="M649 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-447q103 0 187 15v276h62v-262q192 51 292 204q4 7 116 253q57 124 153 124q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-41 -17 -97.5 -159.5t-116.5 -215.5q-106 -130 -287 -165v-8 q116 -16 221 -77.5t151 -157.5q25 -54 39 -150l25 -181q30 -158 118 -158q99 0 131 175q6 31 24 31q24 0 24 -33q0 -86 -51.5 -151t-134.5 -65q-330 0 -330 318q0 13 1 40v40q0 119 -65 216t-173 120v-393h-62v400h-187v-559q0 -28 9 -45q17 -33 186 -33h10v-61 q-71 6 -120 6h-347q-43 0 -114 -6v61q8 0 26.5 -0.5t28.5 -0.5q125 0 141 40q6 15 6 44v1066q0 27 -7 41q-16 33 -176 33h-19v62q70 -6 119 -6h342q50 0 120 6v-62z" />
+<glyph unicode="&#x49d;" horiz-adv-x="1080" d="M409 478l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -237 6t-244 -6v66q7 0 23.5 -0.5t54 -0.5t63.5 16t26 77v607q0 41 -9 59q-17 33 -150 33h-8v66q208 -6 243.5 -6t237.5 6v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-226h92q17 0 33 1v162h62v-151 q89 28 128.5 169t104.5 188q42 30 107.5 30t111.5 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18q-57 0 -89 -76l-53 -156q-39 -97 -107 -130q134 -30 196.5 -93.5t62.5 -205t66 -141.5q40 0 57 44q6 16 16 78q4 26 26 26q27 0 27 -34 q0 -75 -27 -128q-34 -67 -101 -67q-85 0 -134 75t-53.5 158.5t-19.5 119.5q-31 72 -176 117v-253h-62v268q-39 8 -69 8z" />
+<glyph unicode="&#x49e;" horiz-adv-x="1514" d="M649 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-149h372v-62h-372v-236q324 0 480 158q72 73 163 294q65 158 167 158q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-41 -17 -97.5 -159.5t-116.5 -215.5q-106 -130 -287 -165v-8q116 -16 221 -77.5 t151 -157.5q25 -54 39 -150l25 -181q30 -158 118 -158q99 0 131 175q6 31 24 31q24 0 24 -33q0 -86 -51.5 -151t-134.5 -65q-330 0 -330 318q0 13 1 40v40q0 136 -83 239.5t-216 103.5h-188v-559q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-347q-43 0 -114 -6v61 q8 0 26.5 -0.5t28.5 -0.5q125 0 141 40q6 15 6 44v847h-202v62h202v157q0 27 -7 41q-16 33 -176 33h-19v62q70 -6 119 -6h342q50 0 120 6v-62z" />
+<glyph unicode="&#x49f;" horiz-adv-x="1080" d="M409 478l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -237 6t-244 -6v66q7 0 23.5 -0.5t54 -0.5t63.5 16t26 77v513h-167v62h167v32q0 41 -9 59q-17 33 -150 33h-8v66q208 -6 243.5 -6t237.5 6v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-32h166v-62h-166 v-132h92q127 0 178 70q20 27 53.5 140.5t96.5 158.5q42 30 107.5 30t111.5 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18q-57 0 -89 -76l-53 -156q-39 -97 -107 -130q134 -30 196.5 -93.5t62.5 -205t66 -141.5q40 0 57 44q6 16 16 78 q4 26 26 26q27 0 27 -34q0 -75 -27 -128q-34 -67 -101 -67q-85 0 -134 75t-53.5 158.5t-20 119.5t-70.5 71q-108 69 -236 69z" />
+<glyph unicode="&#x4a0;" horiz-adv-x="1894" d="M1029 1281l-59 2q-84 0 -107 -11q-39 -20 -39 -94v-423q324 0 480 158q72 73 163 294q65 158 167 158q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-41 -17 -97.5 -159.5t-116.5 -215.5q-106 -130 -287 -165v-8q116 -16 221 -77.5t151 -157.5 q25 -54 39 -150l25 -181q30 -158 118 -158q99 0 131 175q6 31 24 31q24 0 24 -33q0 -86 -51.5 -151t-134.5 -65q-330 0 -330 318q0 13 1 40v40q0 136 -83 239.5t-216 103.5h-188v-559q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-337q-43 0 -114 -6v61q62 -2 63 -2 q113 0 134 45q5 11 5 42v1056q0 52 -17.5 65.5t-68.5 13.5h-101q-200 0 -274 -95q-58 -73 -82 -285h-49l55 442h906v-62z" />
+<glyph unicode="&#x4a1;" horiz-adv-x="1425" d="M754 478l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -231 6t-238 -6v66q69 0 105.5 3t49 24t12.5 74v602q0 70 -26 83q-12 5 -98 5q-155 0 -216 -53.5t-65 -208.5h-53l15 328h745v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-226h92q127 0 178 70 q20 27 53.5 140.5t96.5 158.5q42 30 107.5 30t111.5 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18q-57 0 -89 -76l-53 -156q-39 -97 -107 -130q134 -30 196.5 -93.5t62.5 -205t66 -141.5q40 0 57 44q6 16 16 78q4 26 26 26 q27 0 27 -34q0 -75 -27 -128q-34 -67 -101 -67q-85 0 -134 75t-53.5 158.5t-20 119.5t-70.5 71q-108 69 -236 69z" />
+<glyph unicode="&#x4a2;" horiz-adv-x="1480" d="M1413 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1000q0 -69 14 -97q23 -47 173 -47h24q0 -12 -0.5 -39t-0.5 -40q0 -312 87 -376q-68 13 -125 92q-15 20 -73.5 125.5t-100 141t-130.5 35.5h-245v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v530h-590v-530 q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-474h590v474q0 29 -8 45 q-17 34 -148 34h-46v62q70 -6 112 -6h356q43 0 113 6v-62z" />
+<glyph unicode="&#x4a3;" horiz-adv-x="1178" d="M1120 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-14 16 -64 94t-82 100.5t-99 22.5h-214v66q140 0 157 30q10 18 10 71v281h-435v-281q0 -49 9 -68q16 -33 159 -33v-66q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66 q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-242h435v242q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-10 -18 -10 -71v-589q0 -53 10 -71q17 -30 157 -30z" />
+<glyph unicode="&#x4a4;" horiz-adv-x="1980" d="M649 1284l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-474h590v474q0 29 -8 45q-17 34 -148 34h-46v59h1026l55 -442h-49q-24 212 -82 285q-74 95 -274 95h-214q-51 0 -68.5 -13.5t-17.5 -65.5l1 -1061q0 -29 8 -45q18 -35 186 -35h10v-61q-71 6 -113 6h-361q-36 0 -107 -6v61 q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v530h-590v-530q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62z" />
+<glyph unicode="&#x4a5;" horiz-adv-x="1618" d="M1118 850q-112 0 -122 -2q-32 -6 -40 -31q-3 -10 -3 -55v-595q0 -53 10 -71q17 -30 157 -30v-66q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v281h-435v-281q0 -49 9 -68q16 -33 159 -33v-66q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71 q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-242h435v242q0 53 -10 71q-17 30 -157 30v60h847l38 -328h-53q-18 182 -98 229q-55 32 -254 32z" />
+<glyph unicode="&#x4a6;" horiz-adv-x="2018" d="M1321 793q284 0 463 -162t179 -442t-180.5 -450.5t-461.5 -170.5q-118 0 -233 59t-195 153l43 32q176 -175 392.5 -175t332.5 167q100 145 100 378.5t-102 379.5q-117 169 -338 169q-54 0 -112 -12v-578q0 -26 6 -41q13 -32 90 -39q5 0 32 -0.5t76 0.5v-61q-71 6 -113 6 h-361q-36 0 -107 -6v61h78q60 0 85 11q39 17 39 69v1141h-590v-1141q0 -26 6 -41q13 -32 90 -39q6 0 33 -0.5t76 0.5v-61q-71 6 -113 6h-360q-37 0 -108 -6v61h78q60 0 85 11q39 17 39 69v1062q0 26 -6 41q-13 32 -90 38h-106v62h1345v-62q-8 0 -29 0.5t-32 0.5 q-121 0 -137 -39q-6 -14 -6 -41v-418q56 8 112 8z" />
+<glyph unicode="&#x4a7;" horiz-adv-x="1594" d="M1541 400q0 -278 -189 -509.5t-462 -332.5l-14 48q220 81 360.5 288t140.5 443q0 131 -45 215q-58 107 -178 107q-94 0 -201 -99v-393q0 -53 10 -71q17 -30 157 -30v-66q-203 6 -237.5 6t-244.5 -6v66q140 0 157 30q10 18 10 71v585q0 54 -15 74q-23 31 -194 31 t-198.5 -20t-27.5 -85v-585q0 -52 11 -71q17 -30 157 -30v-66q-203 6 -237.5 6t-244.5 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66h1064v-66q-140 0 -157 -30q-10 -18 -10 -71v-119q157 142 274 142q152 0 233 -110.5t81 -268.5z" />
+<glyph unicode="&#x4a8;" horiz-adv-x="1551" d="M1192 -43q-83 0 -185 46q-112 -46 -285 -46q-279 0 -466.5 214.5t-187.5 498.5t187 502t467 218q25 0 41 -1l9 -53q-27 4 -50 4q-98 0 -190 -53q-262 -151 -262 -591q0 -473 265 -632q93 -56 200 -56t190 40q-334 228 -334 609q0 207 101 402q120 234 310 234t317 -224 q108 -190 108 -390t-92 -372t-252 -266q54 -34 109 -34q175 0 246 166l45 -21q-86 -195 -291 -195zM1225 696q0 136 -56 318q-70 231 -170 231q-123 0 -175 -244q-31 -147 -31 -323.5t55.5 -328t160.5 -251.5q216 176 216 598z" />
+<glyph unicode="&#x4a9;" horiz-adv-x="1190" d="M906 -24q-64 0 -139 30q-85 -30 -213 -30q-204 0 -352.5 143t-148.5 347t148 349t353 145q21 0 39 -1l10 -57q-33 5 -49 5q-70 0 -138 -35q-191 -98 -191 -400t193 -406q67 -36 139 -36t127 19q-239 156 -239 408q0 150 82 284q93 154 236 154t241 -147 q88 -131 88 -271.5t-67.5 -254.5t-179.5 -179q44 -17 79 -17q125 0 180 119l34 -23q-71 -146 -232 -146zM921 483q0 93 -39 211q-49 149 -121 149q-144 0 -144 -386q0 -228 152 -364q152 118 152 390z" />
+<glyph unicode="&#x4aa;" horiz-adv-x="1335" d="M1267 854q0 -26 -29 -26t-35 32q-12 60 -47 178q-51 127 -151 208.5t-217 81.5t-220 -50q-298 -145 -298 -613.5t322 -606.5q96 -41 185 -41q140 0 256 85t159 218q17 52 27 140q4 33 23 33q24 0 24 -35q0 -206 -154 -354q-152 -147 -355 -147h-5h-10q172 -70 216 -159 q14 -28 14 -55q0 -42 -35 -81q-57 -65 -154 -65q-143 0 -252 149l33 30q69 -95 158 -95q42 0 71.5 22.5t29.5 54.5q0 14 -7 28q-48 94 -208 187q-236 52 -388 250.5t-152 449.5q0 289 198.5 503t485.5 214q193 0 363 -169l99 144q17 25 31 25q21 0 21 -33z" />
+<glyph unicode="&#x4ab;" horiz-adv-x="920" d="M868 254q0 -22 -27 -75q-103 -200 -322 -203q191 -83 191 -176q0 -54 -48.5 -88t-105.5 -34q-118 0 -208 123l33 30q57 -78 129.5 -78t72.5 57q0 10 -5 21q-36 76 -193 164q-147 44 -239.5 175t-92.5 291q0 201 132 350t330 149q121 0 215 -54q113 -64 113 -170t-97 -106 q-42 0 -70.5 28t-28.5 70q0 94 100 99q-79 78 -229 78q-60 0 -120 -34q-168 -94 -168 -402.5t178 -404.5q63 -34 123 -34q113 0 181 64q40 37 74 109.5t53 72.5q29 0 29 -22z" />
+<glyph unicode="&#x4ac;" horiz-adv-x="1413" d="M878 1282q-46 0 -65.5 -11.5t-19.5 -53.5v-1071q0 -25 10 -47q18 -38 243 -38h34q0 -12 -0.5 -39t-0.5 -40q0 -312 87 -376q-68 13 -125 92q-15 20 -73.5 125.5t-100 141t-130.5 35.5h-405v61q9 0 35.5 -0.5t40.5 -0.5q184 0 202 39q8 17 8 47v1072q0 43 -29 56 q-17 8 -66 8q-256 0 -321 -62.5t-86 -318.5h-48l36 442h1206l36 -442h-49q-22 262 -88.5 321.5t-330.5 59.5z" />
+<glyph unicode="&#x4ad;" horiz-adv-x="1142" d="M880 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-14 16 -64 94t-82 100.5t-99 22.5h-351v66q133 0 174 7.5t51.5 28t10.5 69.5v598q0 68 -23 81q-12 7 -91 7q-152 0 -193.5 -50t-52.5 -212h-53l25 328h921l26 -328h-54q-11 161 -48 207q-46 55 -198 55q-75 0 -88 -7 q-23 -13 -23 -81v-598q0 -53 12.5 -72t61.5 -26t161 -7z" />
+<glyph unicode="&#x4ae;" horiz-adv-x="1566" d="M1499 1284q-173 0 -252 -128l-381 -619v-388q0 -34 10 -53q15 -29 90 -35h104v-61q-73 6 -127 6h-320q-55 0 -128 -6v61q8 0 25.5 -0.5t27.5 -0.5q124 0 142 36q7 14 7 43v398l-413 675q-34 56 -95 68q-21 4 -121 4v62q126 -6 299.5 -6t246.5 6v-62h-24q-112 0 -112 -48 q0 -14 13 -35l356 -581l325 529q21 34 21 58q0 77 -113 77v62q155 -6 240.5 -6t178.5 6v-62z" />
+<glyph unicode="&#x4af;" horiz-adv-x="1151" d="M654 -322q0 -21 6 -32q11 -20 149 -20v-66q-68 5 -99 5h-255q-30 0 -99 -5v66q7 0 23 -0.5t25 -0.5q90 0 101 20q4 8 4 26v402l-286 703q-24 60 -68 73q-18 6 -83 6h-19v68q120 -8 164 -8t276 8v-68q-122 0 -122 -54q0 -15 252 -634l219 546q13 32 13 50q0 90 -102 92v68 q135 -8 194.5 -8t151.5 8v-68q-142 -1 -198 -142l-247 -617v-418z" />
+<glyph unicode="&#x4b0;" horiz-adv-x="1566" d="M1499 1284q-173 0 -252 -128l-381 -619h400v-62h-400v-326q0 -34 10 -53q15 -29 90 -35h104v-61q-73 6 -127 6h-320q-55 0 -128 -6v61q8 0 25.5 -0.5t27.5 -0.5q124 0 142 36q7 14 7 43v336h-400v62h400l-413 675q-34 56 -95 68q-21 4 -121 4v62q126 -6 299.5 -6t246.5 6 v-62h-24q-112 0 -112 -48q0 -14 13 -35l356 -581l325 529q21 34 21 58q0 77 -113 77v62q155 -6 240.5 -6t178.5 6v-62z" />
+<glyph unicode="&#x4b1;" horiz-adv-x="1151" d="M654 62h291v-62h-291v-322q0 -21 6 -32q11 -20 149 -20v-66q-68 5 -99 5h-255q-30 0 -99 -5v66q7 0 23 -0.5t25 -0.5q90 0 101 20q4 8 4 26v329h-309v62h309v11l-286 703q-24 60 -68 73q-18 6 -83 6h-19v68q120 -8 164 -8t276 8v-68q-122 0 -122 -54q0 -15 252 -634 l219 546q13 32 13 50q0 90 -102 92v68q135 -8 194.5 -8t151.5 8v-68q-142 -1 -198 -142l-247 -617v-34z" />
+<glyph unicode="&#x4b2;" horiz-adv-x="1518" d="M1107 0h-200v61q128 5 128 59q0 10 -320 493l-281 -414q-19 -28 -19 -48q0 -43 38.5 -66t84.5 -24v-61q-74 6 -165 6t-305 -6v61q196 0 285 131l323 477l-362 547q-34 51 -99 64q-24 4 -81 4h-41v62q112 -6 292.5 -6t251.5 6v-62q-128 -5 -128 -58q0 -13 268 -410 l225 333q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62q81 -6 163.5 -6t306.5 6v-62q-198 -2 -285 -128l-271 -395l416 -629q35 -53 99 -66q25 -5 85 -5h38q0 -12 -0.5 -39t-0.5 -40q0 -312 87 -376q-68 13 -125 92q-15 20 -73.5 125.5t-100 141t-130.5 35.5z" />
+<glyph unicode="&#x4b3;" horiz-adv-x="1183" d="M1131 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-14 16 -64 94t-82 100.5t-99 22.5h-169v66q77 3 77 54q0 10 -208 285q-192 -223 -192 -272q0 -61 62 -67v-66q-141 6 -221 6t-159 -6v66q159 0 274 128l200 256l-212 276q-71 92 -105 110.5t-147 18.5v68q110 -8 171 -8 t264 8v-68q-75 -2 -75 -52q0 -20 184 -255l134 167q33 41 33 75q0 61 -63 65v68q108 -8 192.5 -8t188.5 8v-68q-152 -3 -255 -109q-26 -27 -197 -244l287 -369q37 -47 92 -60q28 -7 95 -7h17z" />
+<glyph unicode="&#x4b4;" horiz-adv-x="2089" d="M1685 0h-1309v62h106q77 6 90 38q6 15 6 41v1074q0 67 -115 67q-156 0 -216 -27q-93 -42 -119 -178h-46l22 266h1125l22 -266h-47q-28 140 -124 181q-58 24 -223 24q-105 0 -105 -67v-1153h890v1141q0 52 -39 69q-25 11 -85 11h-78v61q71 -6 107 -6h361q42 0 113 6v-61 q-49 1 -76 1t-32 -1q-77 -7 -90 -39q-6 -15 -6 -41v-998q0 -69 14 -97q23 -47 173 -47h24q0 -12 -0.5 -39t-0.5 -40q0 -312 87 -376q-68 13 -125 92q-15 20 -73.5 125.5t-100 141t-130.5 35.5z" />
+<glyph unicode="&#x4b5;" horiz-adv-x="1722" d="M1664 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-14 16 -64 94t-82 100.5t-99 22.5h-1066v66q140 0 157 30q10 18 10 71v602q0 54 -12 71t-61 17q-179 0 -227 -43t-60 -219h-53l25 328h920l26 -328h-54q-12 174 -59.5 218t-222.5 44q-52 0 -63.5 -17.5t-11.5 -70.5v-598 q0 -54 15 -74q23 -31 204 -31h270q178 0 201 31q15 20 15 74v585q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-10 -18 -10 -71v-589q0 -53 10 -71q17 -30 157 -30z" />
+<glyph unicode="&#x4b6;" horiz-adv-x="1601" d="M1535 1284l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-996q0 -69 14 -97q23 -47 173 -47h24q0 -12 -0.5 -39t-0.5 -40q0 -312 87 -376q-68 13 -125 92q-15 20 -73.5 125.5t-100 141t-130.5 35.5h-255v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v545 q-190 -218 -438 -218q-187 0 -312.5 111t-125.5 298v327q0 30 -7 43q-18 34 -156 34q-19 0 -39 -1v62q73 -6 156 -6h270q84 0 156 6v-62q-48 1 -60 1q-118 0 -136 -34q-9 -17 -9 -51v-319q0 -149 90.5 -232t237.5 -83q208 0 373 205v430q0 32 -9 49q-18 34 -153 34h-51v62 q71 -6 115 -6h376q41 0 111 6v-62z" />
+<glyph unicode="&#x4b7;" horiz-adv-x="1261" d="M1203 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-14 16 -64 94t-82 100.5t-99 22.5h-213v66q140 0 157 30q10 18 10 71v274q-129 -143 -324 -143q-131 0 -236.5 81t-105.5 208q0 214 -5 229q-11 32 -72 40q-12 1 -90 1v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30 q-11 -19 -11 -71v-143q0 -102 70.5 -160.5t174.5 -58.5q137 0 246 109q28 28 28 75v178q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-589q0 -53 10 -71q17 -30 157 -30z" />
+<glyph unicode="&#x4b8;" horiz-adv-x="1601" d="M1535 1284l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v545q-156 -179 -353 -211v-181h-62v174h-23q-187 0 -312.5 111t-125.5 298v327q0 30 -7 43 q-18 34 -156 34q-19 0 -39 -1v62q73 -6 156 -6h270q84 0 156 6v-62q-48 1 -60 1q-118 0 -136 -34q-9 -17 -9 -51v-319q0 -137 78 -219t208 -94v478h62v-480q195 8 353 205v430q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62z" />
+<glyph unicode="&#x4b9;" horiz-adv-x="1261" d="M1204 0q-203 6 -237.5 6t-244.5 -6v66q140 0 157 30q10 18 10 71v274q-91 -101 -229 -132v-107h-62v97q-17 -1 -33 -1q-131 0 -236.5 81t-105.5 208q0 214 -5 229q-11 32 -72 40q-12 1 -90 1v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-143 q0 -98 65 -156t163 -63v308h62v-305q111 17 201 106q28 28 28 75v178q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-589q0 -52 11 -71q17 -30 157 -30v-66z" />
+<glyph unicode="&#x4ba;" horiz-adv-x="1482" d="M649 1284l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-453q154 122 339.5 122t311 -111t125.5 -298v-327q0 -30 7 -43q18 -34 156 -34q19 0 39 1v-62q-73 6 -156 6h-270q-84 0 -156 -6v62q48 -1 60 -1q118 0 136 34q9 17 9 51v319q0 149 -90.5 232t-240.5 83t-270 -101v-538 q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62z" />
+<glyph unicode="&#x4bb;" horiz-adv-x="1181" d="M1129 0q-200 6 -238 6t-244 -6v66q30 -1 70.5 -1t63.5 12q33 19 33 76v519q0 227 -158 227q-130 0 -209.5 -104.5t-79.5 -238.5v-400q0 -39 10 -58q18 -33 117 -33q18 0 38 1v-66q-200 6 -236.5 6t-242.5 -6v66q30 -1 72.5 -1t68 16.5t25.5 80.5v1115q0 87 -44 108 q-21 10 -96 10h-26v67l306 23v-744h2q41 93 125 149t184 56q292 0 292 -314v-502q0 -65 135 -65q15 0 32 1v-66z" />
+<glyph unicode="&#x4bc;" horiz-adv-x="1902" d="M728 714v-18v-10q0 -247 98 -433q124 -235 356 -235q297 0 487 304q11 20 35 57q12 16 30 16q31 0 31 -36q0 -11 -9 -28q-90 -173 -239 -273.5t-337 -100.5q-280 0 -467 214t-187 498q0 25 3 62q-192 37 -315 131q-146 113 -146 282q0 86 52 157t135 71q57 0 95.5 -36.5 t38.5 -92.5t-37.5 -93.5t-93.5 -37.5q-90 0 -122 75q-6 -17 -6 -29q0 -155 127 -254q105 -81 279 -113q40 250 217.5 424.5t437 174.5t443.5 -201t200 -475h-1106zM1373 1286q-92 54 -192 54t-191 -53q-234 -137 -259 -513h899q-25 376 -257 512z" />
+<glyph unicode="&#x4bd;" horiz-adv-x="1241" d="M1162 280q27 0 27 -28t-35 -88q-110 -188 -315 -188t-341.5 147.5t-136.5 347.5q0 18 1 36q-130 27 -220 98.5t-90 185.5q0 60 36.5 109.5t85.5 49.5t76 -25.5t27 -65t-26 -66t-66 -26.5q-64 0 -84 48q-2 -6 -2 -14q0 -195 268 -249q27 170 148 289t296 119t276.5 -119 t101.5 -302q0 -30 -7.5 -37.5t-38.5 -7.5h-605v-7q0 -210 64 -313q90 -144 242 -144q198 0 290 221q12 29 28 29zM1048 539q0 143 -50 243q-64 129 -192 129q-41 0 -90 -23q-165 -78 -175 -349h507z" />
+<glyph unicode="&#x4be;" horiz-adv-x="1902" d="M728 714v-18q0 -254 99 -443q124 -235 355 -235q297 0 487 304q11 20 35 57q12 16 30 16q31 0 31 -36q0 -11 -9 -28q-165 -317 -477 -366q-34 -113 -41 -272h-115q-7 159 -41 272q-243 39 -399.5 243.5t-156.5 460.5q0 25 3 62q-192 37 -315 131q-146 113 -146 282 q0 86 52 157t135 71q57 0 95.5 -36.5t38.5 -92.5t-37.5 -93.5t-93.5 -37.5q-90 0 -122 75q-6 -17 -6 -29q0 -155 127 -254q105 -81 279 -113q40 250 217.5 424.5t437 174.5t443.5 -201t200 -475h-1106zM1373 1286q-92 54 -192 54t-191 -53q-234 -136 -259 -513h899 q-25 376 -257 512z" />
+<glyph unicode="&#x4bf;" horiz-adv-x="1241" d="M1162 280q27 0 27 -28t-35 -88q-79 -134 -220 -174q-38 -119 -46 -287h-115q-8 168 -45 285q-160 38 -263.5 175t-103.5 308q0 22 1 36q-130 26 -212 92q-98 78 -98 192q0 60 36.5 109.5t85.5 49.5t76 -25.5t27 -65t-26 -66t-66 -26.5q-64 0 -84 48q-2 -6 -2 -14 q0 -196 268 -249q27 170 148 289t296 119t276.5 -119t101.5 -302q0 -30 -7.5 -37.5t-38.5 -7.5h-605v-7q0 -210 64 -313q90 -144 242 -144q198 0 290 221q12 29 28 29zM1048 539q0 143 -50 243q-64 129 -192 129q-41 0 -90 -23q-165 -78 -175 -349h507z" />
+<glyph unicode="&#x4c0;" horiz-adv-x="736" d="M670 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62z" />
+<glyph unicode="&#x4c1;" horiz-adv-x="2214" d="M1399 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-447q289 8 434 167q62 67 159 289q67 154 167 154q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-41 -17 -97.5 -159.5t-116.5 -215.5q-106 -130 -287 -165v-8q116 -16 221 -77t151 -158 q25 -54 39 -150l25 -181q30 -158 118 -158q99 0 131 175q6 31 24 31q24 0 24 -33q0 -86 -51.5 -151t-134.5 -65q-330 0 -330 318q0 13 1 40v40q0 136 -83 239.5t-216 103.5h-138v-559q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-344q-49 0 -120 -6v61h10 q169 0 186 33q9 17 9 45v559h-138q-133 0 -216 -103.5t-83 -239.5q0 -13 0.5 -40t0.5 -40q0 -318 -330 -318q-83 0 -134.5 65t-51.5 151q0 33 24 33q18 0 24 -31q32 -175 131 -175q88 0 118 158l23 169q16 108 41 162q46 97 151 158t221 77v8q-181 35 -287 165 q-60 73 -116.5 215.5t-97.5 159.5q10 -22 10 -53t-26 -56.5t-65 -25.5q-90 0 -90 92q0 54 39 95t92 41q100 0 167 -154q97 -222 159 -289q145 -159 434 -167v447q0 29 -6 44q-16 40 -142 40l-57 -2v62q70 -6 120 -6h344q50 0 120 6v-62zM1455 1516q0 -85 -140 -130 q-101 -33 -211 -33t-211 33q-140 45 -140 130q0 39 25 64.5t64 25.5t64 -25.5t25 -70.5t-38 -70q63 -24 174 -24h74q111 0 174 24q-38 25 -38 70t25 70.5t64 25.5t64 -25.5t25 -64.5z" />
+<glyph unicode="&#x4c2;" horiz-adv-x="1611" d="M737 471l-56 7q-128 0 -236 -69q-55 -35 -70.5 -71t-20 -119.5t-53.5 -158.5t-134 -75q-67 0 -101 67q-27 53 -27 128q0 34 27 34q22 0 26 -26q10 -62 16 -78q17 -44 57 -44q66 0 66 141.5t62.5 205t196.5 93.5q-68 33 -107 130l-53 156q-32 76 -89 76q-25 0 -25 -18 q0 -3 16 -29.5t16 -60t-27.5 -62t-66.5 -28.5q-102 0 -102 102q0 70 46 118t112 48q148 0 200 -178q37 -124 57 -151q51 -70 178 -70h92v226q0 41 -9 59q-17 33 -150 33h-8v66q208 -6 243.5 -6t237.5 6v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-226h92q127 0 178 70 q20 27 53.5 140.5t96.5 158.5q42 30 107.5 30t111.5 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18q-57 0 -89 -76l-53 -156q-39 -97 -107 -130q134 -30 196.5 -93.5t62.5 -205t66 -141.5q40 0 57 44q6 16 16 78q4 26 26 26 q27 0 27 -34q0 -75 -27 -128q-34 -67 -101 -67q-85 0 -134 75t-53.5 158.5t-20 119.5t-70.5 71q-108 69 -236 69l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -237 6t-244 -6v66q7 0 23.5 -0.5t54 -0.5t63.5 16t26 77v313zM1082 1398q89 0 89 -96t-113.5 -158.5 t-237.5 -62.5t-229 58q-122 67 -122 163t89 96t89 -90t-89 -90q99 -74 262 -74t262 74q-89 0 -89 90t89 90z" />
+<glyph unicode="&#x4c3;" horiz-adv-x="1514" d="M649 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-447q324 0 480 158q72 73 163 294q65 158 167 158q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-39 -16 -90.5 -141t-83.5 -176q-74 -120 -192 -178q217 -44 346 -198.5t129 -390.5 q0 -279 -180.5 -449.5t-461.5 -170.5q-118 0 -233 59t-195 153l43 32q176 -175 392.5 -175t332.5 167q100 145 100 375t-96 375q-111 167 -320 176q-105 -20 -261 -32v-559q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-347q-43 0 -114 -6v61q8 0 26.5 -0.5t28.5 -0.5 q125 0 141 40q6 15 6 44v1066q0 27 -7 41q-16 33 -176 33h-19v62q70 -6 119 -6h342q50 0 120 6v-62z" />
+<glyph unicode="&#x4c4;" horiz-adv-x="1080" d="M409 478l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -237 6t-244 -6v66q7 0 23.5 -0.5t54 -0.5t63.5 16t26 77v607q0 41 -9 59q-17 33 -150 33h-8v66q208 -6 243.5 -6t237.5 6v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-226h92q127 0 178 70 q20 27 53.5 140.5t96.5 158.5q42 30 107.5 30t111.5 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18q-65 0 -102 -113q-53 -158 -83 -196q128 -13 205 -94t77 -204t-58 -240q-153 -310 -568 -463l-14 48q194 72 327 220 q150 165 150 357q0 164 -127 238q-97 57 -247 57z" />
+<glyph unicode="&#x4c5;" horiz-adv-x="1554" d="M1488 1281l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-1054q0 -27 13.5 -52t91.5 -31h110v-61l-329 -427l-29 22l91 184q66 139 66 176q0 45 -92 45h-309v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1053q0 32 -9 49q-18 34 -153 34h-67q-188 0 -215 -35 q-11 -14 -11 -63q0 -227 -12 -426q-46 -757 -354 -757q-86 0 -148 60t-62 146q0 45 30 76t74 31t74 -30t30 -75q0 -81 -77 -102q31 -14 75 -14q200 0 256 520q21 195 21 511q0 113 -13 132q-18 27 -187 27v61h1137v-62z" />
+<glyph unicode="&#x4c6;" horiz-adv-x="1267" d="M281 81q186 0 186 658q0 63 -6 80q-11 30 -72 37q-10 1 -89 1v66h876v-66q-140 0 -157 -30q-10 -18 -10 -71v-589q0 -53 10 -71q17 -30 157 -30v-66l-246 -336l-39 27q28 36 78.5 134t50.5 130q0 45 -70 45h-256v66q140 0 157 30q10 18 10 71v585q0 49 -7 65 q-18 40 -149 40q-69 0 -92 -5q-55 -11 -63 -53q-3 -17 -4 -116q-6 -683 -261 -683q-70 0 -121 48.5t-51 118.5q0 88 86 88q36 0 60 -24.5t24 -61.5q0 -59 -50 -79q18 -9 48 -9z" />
+<glyph unicode="&#x4c7;" horiz-adv-x="1480" d="M649 1284l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-474h590v474q0 29 -8 45q-17 34 -148 34h-46v62q70 -6 112 -6h356q43 0 113 6v-62l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1318q0 -141 -114.5 -235t-247.5 -94t-230 73t-97 190q0 49 30.5 81.5t78.5 32.5t79 -31.5 t31 -78.5q0 -110 -121 -110h-4q71 -114 217 -114q99 0 156 101q47 83 47 190v779h-590v-530q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6 h354q45 0 115 6v-62z" />
+<glyph unicode="&#x4c8;" horiz-adv-x="1178" d="M1120 857q-140 0 -157 -30q-10 -18 -10 -71v-865q0 -132 -84.5 -232t-215.5 -100q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29q158 0 158 281v561h-435v-281q0 -49 9 -68q16 -33 159 -33v-66q-203 6 -238 6 t-244 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-242h435v242q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66z" />
+<glyph unicode="&#x4c9;" horiz-adv-x="1631" d="M1564 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61l-329 -427l-29 22l91 184q66 139 66 176q0 45 -92 45h-288v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v964l-734 -1008l1 -1q14 -30 90 -35q3 0 30 -0.5t77 0.5v-61 q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-967l734 1009q-15 37 -149 37h-46v62q70 -6 112 -6h356q43 0 113 6 v-62z" />
+<glyph unicode="&#x4ca;" horiz-adv-x="1261" d="M1048 -45q0 45 -70 45h-256v66q142 0 158 33q9 19 9 68v570l-499 -653q38 -18 148 -18v-66q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v589q0 49 -9 68q-16 33 -158 33v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-570l499 653q-38 18 -147 18v66 q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-589q0 -49 9 -68q16 -33 159 -33v-66l-246 -336l-39 27q28 36 78.5 134t50.5 130z" />
+<glyph unicode="&#x4cb;" horiz-adv-x="1601" d="M1535 1284l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-1056q0 -32 9 -49q19 -36 147 -36h28q21 1 29 1v-61h-255q-89 0 -130.5 -35.5t-100 -141t-73.5 -125.5q-57 -79 -125 -92q87 64 87 376v39q-1 28 -1 40h24q150 0 173 47q14 28 14 97v485q-190 -218 -438 -218 q-187 0 -312.5 111t-125.5 298v327q0 30 -7 43q-18 34 -156 34q-19 0 -39 -1v62q73 -6 156 -6h270q84 0 156 6v-62q-48 1 -60 1q-118 0 -136 -34q-9 -17 -9 -51v-319q0 -149 90.5 -232t237.5 -83q208 0 373 205v430q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376 q41 0 111 6v-62z" />
+<glyph unicode="&#x4cc;" horiz-adv-x="1261" d="M724 -35l-2 101q140 0 157 30q10 18 10 71v274q-129 -143 -324 -143q-131 0 -236.5 81t-105.5 208q0 214 -5 229q-11 32 -72 40q-12 1 -90 1v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-143q0 -102 70.5 -160.5t174.5 -58.5q137 0 246 109 q28 28 28 75v178q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-589q0 -53 10 -71q17 -30 157 -30v-66h-213q-67 0 -99 -22.5t-82 -100.5t-64 -94q-47 -49 -115 -49q94 19 94 231z" />
+<glyph unicode="&#x4cd;" horiz-adv-x="1793" d="M1726 1281l-56 2q-125 0 -141 -41q-6 -15 -6 -45v-1058q0 -26 8 -43q17 -35 185 -35h10v-61l-329 -427l-29 22l91 184q66 139 66 176q0 45 -92 45h-273v61h76q63 0 87 10q40 17 40 70v1140h-2l-483 -1245q-14 -36 -36 -36t-39 43l-476 1222h-2v-1064q0 -140 200 -140h3 v-61q-209 6 -229 6t-231 -6v61h3q199 0 199 140v1003q0 22 -6 38q-12 32 -89 39q-6 1 -32.5 1t-74.5 -1v62h341q45 0 61 -42l428 -1102l430 1108q14 36 49 36h349v-62z" />
+<glyph unicode="&#x4ce;" horiz-adv-x="1428" d="M1206 -45q0 45 -70 45h-239v66h85q60 5 73 32q9 18 9 69l-2 696l-347 -820q-18 -43 -40.5 -43t-40.5 43l-341 805l-2 -2v-629q0 -151 167 -151v-66q-82 6 -166 6t-228 -6v66q167 0 167 151v539q0 50 -9 68q-16 33 -158 33v66h262q41 0 50 -4q13 -7 27 -39l310 -732 l308 732q13 31 26.5 37t53.5 6h261v-66h-85q-60 -5 -73 -32q-9 -18 -9 -69v-589q0 -50 9 -68q16 -33 158 -33v-66l-246 -336l-39 27q28 36 78.5 134t50.5 130z" />
+<glyph unicode="&#x4cf;" horiz-adv-x="578" d="M525 0q-193 6 -236 6t-236 -6v66l44 -1q66 0 89 13q33 18 33 79v609q0 61 -33 79q-23 13 -89 13l-44 -1v66q193 -6 236 -6t236 6v-66l-44 1q-66 0 -89 -13q-33 -18 -33 -79v-609q0 -61 33 -79q23 -13 89 -13l44 1v-66z" />
+<glyph unicode="&#x4d0;" horiz-adv-x="1484" d="M1417 0q-127 6 -297.5 6t-244.5 -6v61h5q157 0 157 59q0 29 -39 136l-70 192h-487l-61 -163q-34 -90 -34 -123q0 -51 52 -78q42 -23 97 -23v-61q-189 6 -239.5 6t-187.5 -6v61q174 2 219 133l404 1161q-114 10 -193 43q-107 44 -107 118q0 39 25 64.5t64 25.5t64 -25.5 t25 -70.5t-38 -70q63 -24 174 -24h74q111 0 174 24q-38 25 -38 70t25 70.5t64 25.5t64 -25.5t25 -64.5q0 -74 -107 -118q-79 -33 -193 -43l420 -1215q21 -61 84 -75q19 -5 77 -5q19 0 43 1v-61zM906 510l-222 641l-220 -641h442z" />
+<glyph unicode="&#x4d1;" horiz-adv-x="1070" d="M1018 190q0 -83 -47.5 -142.5t-122.5 -59.5t-120.5 51.5t-52.5 122.5q-35 -85 -111 -135.5t-186.5 -50.5t-205.5 50q-119 62 -119 178q0 179 213 279q131 61 394 76v78q0 110 -60.5 192t-166.5 82q-154 0 -231 -98q46 0 78 -26.5t32 -70t-28.5 -71.5t-71.5 -28 q-98 0 -98 99q0 113 102 178.5t222 65.5q183 0 293 -119q50 -54 63.5 -108t13.5 -144v-427q0 -40 20.5 -74t57.5 -34q79 0 79 175q0 28 -2 80h55v-119zM660 300v214q-171 -6 -291 -71q-152 -82 -152 -236q0 -78 56.5 -130.5t135.5 -52.5q111 0 181 81.5t70 194.5zM762 1398 q89 0 89 -96t-113.5 -158.5t-237.5 -62.5t-229 58q-122 67 -122 163t89 96t89 -90t-89 -90q99 -74 262 -74t262 74q-89 0 -89 90t89 90z" />
+<glyph unicode="&#x4d2;" horiz-adv-x="1484" d="M1417 0q-127 6 -297.5 6t-244.5 -6v61h5q157 0 157 59q0 29 -39 136l-70 192h-487l-61 -163q-34 -90 -34 -123q0 -51 52 -78q42 -23 97 -23v-61q-189 6 -239.5 6t-187.5 -6v61q174 2 219 133l409 1177q14 40 46 40t46 -40l425 -1231q21 -61 84 -75q19 -5 77 -5q19 0 43 1 v-61zM906 510l-222 641l-220 -641h442zM1009 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM636.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4d3;" horiz-adv-x="1070" d="M1018 190q0 -83 -47.5 -142.5t-122.5 -59.5t-120.5 51.5t-52.5 122.5q-35 -85 -111 -135.5t-186.5 -50.5t-205.5 50q-119 62 -119 178q0 179 213 279q131 61 394 76v78q0 110 -60.5 192t-166.5 82q-154 0 -231 -98q46 0 78 -26.5t32 -70t-28.5 -71.5t-71.5 -28 q-98 0 -98 99q0 113 102 178.5t222 65.5q183 0 293 -119q50 -54 63.5 -108t13.5 -144v-427q0 -40 20.5 -74t57.5 -34q79 0 79 175q0 28 -2 80h55v-119zM660 300v214q-171 -6 -291 -71q-152 -82 -152 -236q0 -78 56.5 -130.5t135.5 -52.5q111 0 181 81.5t70 194.5zM751 1318 q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM378.5 1318q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4d4;" horiz-adv-x="1794" d="M681 1280l-168 2v61h1104l55 -443h-49q-25 215 -78 286q-72 96 -273 96h-187q-61 0 -79 -11.5t-18 -67.5v-525h168q130 0 166.5 47.5t36.5 182.5h49v-522h-49q0 135 -36.5 182.5t-166.5 47.5h-168v-476q0 -56 18 -67.5t79 -11.5h187q228 0 311 117q52 75 95 330h49 l-82 -508h-972v61q6 0 19.5 -0.5t49.5 -0.5t59.5 15t23.5 74v467h-318l-147 -413q-10 -28 -10 -44q0 -95 146 -98v-61q-189 6 -243.5 6t-184.5 -6v61q176 0 223 132zM825 678v515q0 79 -81 81l-215 -596h296z" />
+<glyph unicode="&#x4d5;" horiz-adv-x="1495" d="M1415 282q28 0 28 -28.5t-33 -89.5q-103 -188 -301 -188q-218 0 -357 190q-45 -92 -145.5 -141t-221 -49t-213.5 46q-119 58 -119 174q0 180 223 272q167 67 379 67v104q0 110 -59.5 192t-166.5 82q-154 0 -232 -98q110 -1 110 -100q0 -43 -28 -70.5t-71 -27.5 q-99 0 -99 107t102 171.5t222 64.5q228 0 328 -165q138 165 317.5 165t272 -120t92.5 -300q0 -34 -9.5 -39.5t-44.5 -5.5h-585q0 -332 188 -432q64 -33 126 -33q92 0 163.5 58t100.5 149q15 45 33 45zM1082 913q-45 0 -95 -23q-163 -79 -181 -350h495q-16 373 -219 373z M681 283q0 19 -13 81t-13 127q-168 -6 -285 -67q-151 -79 -151 -228q0 -74 55 -123t131 -49q110 0 193 75.5t83 183.5z" />
+<glyph unicode="&#x4d6;" horiz-adv-x="1354" d="M68 0v61q47 -1 53 -1q125 0 142 38q7 16 7 48v1053q0 30 -7 47q-15 36 -152 36q-20 0 -43 -1v62h1108l56 -442h-49q-24 218 -99.5 299t-288.5 81h-263q-54 0 -71 -13.5t-17 -65.5v-474h178q134 0 173.5 46.5t39.5 182.5h51v-521h-51q0 136 -40 183t-173 47h-178v-526 q0 -52 17 -65.5t71 -13.5h273q236 0 326 111q67 84 107 336h49l-84 -508h-1135zM1053 1516q0 -85 -140 -130q-101 -33 -211 -33t-211 33q-140 45 -140 130q0 39 25 64.5t64 25.5t64 -25.5t25 -70.5t-38 -70q63 -24 174 -24h74q111 0 174 24q-38 25 -38 70t25 70.5t64 25.5 t64 -25.5t25 -64.5z" />
+<glyph unicode="&#x4d7;" horiz-adv-x="933" d="M854 280q27 0 27 -28t-35 -88q-110 -188 -315 -188t-341.5 147.5t-136.5 344.5t127 344.5t312.5 147.5t287 -119t101.5 -302q0 -30 -7.5 -37.5t-38.5 -7.5h-605v-7q0 -210 64 -313q90 -144 242 -144q198 0 290 221q12 29 28 29zM740 539q0 143 -50 243q-64 129 -192 129 q-41 0 -90 -23q-165 -78 -175 -349h507zM782 1398q89 0 89 -96t-113.5 -158.5t-237.5 -62.5t-229 58q-122 67 -122 163t89 96t89 -90t-89 -90q99 -74 262 -74t262 74q-89 0 -89 90t89 90z" />
+<glyph unicode="&#x4d8;" horiz-adv-x="1445" d="M722 1390q280 0 467 -214t187 -498.5t-186.5 -502.5t-462 -218t-459.5 201t-200 475h1106v18q0 469 -265 632q-93 57 -187 57q-142 0 -283 -115t-187 -255q-10 -32 -37 -32t-27 26v393q0 33 21 33q14 0 31 -25l87 -127q184 152 395 152zM529 61q92 -54 192 -54t191 53 q234 137 259 513h-899q25 -376 257 -512z" />
+<glyph unicode="&#x4d9;" horiz-adv-x="933" d="M88 772q110 188 315 188t341.5 -147.5t136.5 -344.5t-127 -344.5t-312.5 -147.5t-287 119t-101.5 302q0 30 7.5 37.5t38.5 7.5h605v7q0 210 -64 313q-90 144 -242 144q-198 0 -290 -221q-12 -29 -28 -29q-27 0 -27 28t35 88zM194 397q0 -143 50 -243q64 -129 192 -129 q41 0 90 23q165 78 175 349h-507z" />
+<glyph unicode="&#x4da;" horiz-adv-x="1445" d="M722 1390q280 0 467 -214t187 -498.5t-186.5 -502.5t-462 -218t-459.5 201t-200 475h1106v18q0 469 -265 632q-93 57 -187 57q-142 0 -283 -115t-187 -255q-10 -32 -37 -32t-27 26v393q0 33 21 33q14 0 31 -25l87 -127q184 152 395 152zM529 61q92 -54 192 -54t191 53 q234 137 259 513h-899q25 -376 257 -512zM979 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM606.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4db;" horiz-adv-x="933" d="M88 772q110 188 315 188t341.5 -147.5t136.5 -344.5t-127 -344.5t-312.5 -147.5t-287 119t-101.5 302q0 30 7.5 37.5t38.5 7.5h605v7q0 210 -64 313q-90 144 -242 144q-198 0 -290 -221q-12 -29 -28 -29q-27 0 -27 28t35 88zM194 397q0 -143 50 -243q64 -129 192 -129 q41 0 90 23q165 78 175 349h-507zM711 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM338.5 1318q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4dc;" horiz-adv-x="2214" d="M1399 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-447q289 8 434 167q62 67 159 289q67 154 167 154q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-41 -17 -97.5 -159.5t-116.5 -215.5q-106 -130 -287 -165v-8q116 -16 221 -77t151 -158 q25 -54 39 -150l25 -181q30 -158 118 -158q99 0 131 175q6 31 24 31q24 0 24 -33q0 -86 -51.5 -151t-134.5 -65q-330 0 -330 318q0 13 1 40v40q0 136 -83 239.5t-216 103.5h-138v-559q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-344q-49 0 -120 -6v61h10 q169 0 186 33q9 17 9 45v559h-138q-133 0 -216 -103.5t-83 -239.5q0 -13 0.5 -40t0.5 -40q0 -318 -330 -318q-83 0 -134.5 65t-51.5 151q0 33 24 33q18 0 24 -31q32 -175 131 -175q88 0 118 158l23 169q16 108 41 162q46 97 151 158t221 77v8q-181 35 -287 165 q-60 73 -116.5 215.5t-97.5 159.5q10 -22 10 -53t-26 -56.5t-65 -25.5q-90 0 -90 92q0 54 39 95t92 41q100 0 167 -154q97 -222 159 -289q145 -159 434 -167v447q0 29 -6 44q-16 40 -142 40l-57 -2v62q70 -6 120 -6h344q50 0 120 6v-62zM1368 1574q32 -32 32 -78.5t-32 -79 t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM995.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4dd;" horiz-adv-x="1611" d="M737 471l-56 7q-128 0 -236 -69q-55 -35 -70.5 -71t-20 -119.5t-53.5 -158.5t-134 -75q-67 0 -101 67q-27 53 -27 128q0 34 27 34q22 0 26 -26q10 -62 16 -78q17 -44 57 -44q66 0 66 141.5t62.5 205t196.5 93.5q-68 33 -107 130l-53 156q-32 76 -89 76q-25 0 -25 -18 q0 -3 16 -29.5t16 -60t-27.5 -62t-66.5 -28.5q-102 0 -102 102q0 70 46 118t112 48q148 0 200 -178q37 -124 57 -151q51 -70 178 -70h92v226q0 41 -9 59q-17 33 -150 33h-8v66q208 -6 243.5 -6t237.5 6v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-226h92q127 0 178 70 q20 27 53.5 140.5t96.5 158.5q42 30 107.5 30t111.5 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18q-57 0 -89 -76l-53 -156q-39 -97 -107 -130q134 -30 196.5 -93.5t62.5 -205t66 -141.5q40 0 57 44q6 16 16 78q4 26 26 26 q27 0 27 -34q0 -75 -27 -128q-34 -67 -101 -67q-85 0 -134 75t-53.5 158.5t-20 119.5t-70.5 71q-108 69 -236 69l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -237 6t-244 -6v66q7 0 23.5 -0.5t54 -0.5t63.5 16t26 77v313zM1079 1318q32 -32 32 -78.5t-32 -79 t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM706.5 1318q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4de;" horiz-adv-x="1244" d="M879 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM506.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32zM1176 359q0 -85 -50 -164q-77 -122 -218.5 -180t-302.5 -58 q-258 0 -386 70q-78 -70 -98 -70q-33 0 -34 33l-12 275q-1 32 41 32q22 0 26.5 -6t11.5 -51t26 -79q80 -144 421 -144q160 0 260 93t100 250t-98.5 247t-255.5 90h-116q-78 -1 -116.5 -1t-38.5 30q0 16 13 22.5t170.5 18t256.5 77.5q150 100 150 257q0 111 -103 174 q-87 53 -225.5 53t-242.5 -62.5t-130 -138.5q-4 -20 -17 -58q-10 -20 -35 -20q-41 0 -39 46l9 246q2 49 35 49q26 0 112 -85q136 85 318 85t326 -64q185 -82 185 -227q0 -261 -386 -360q172 -25 295 -115q148 -108 148 -265z" />
+<glyph unicode="&#x4df;" horiz-adv-x="920" d="M860 253q0 -59 -36 -116q-106 -167 -386 -167q-169 0 -263 43l-64 -43h-9q-23 0 -27 8q-5 11 -5 48v122q0 58 28 58q20 0 26 -20q2 -23 17 -71q45 -85 293.5 -85t248.5 222.5t-251 222.5h-118q-55 0 -55 23t29.5 25.5t79.5 5.5q122 8 192 62q86 66 86 151.5t-58.5 121 t-151 35.5t-165 -36.5t-94 -91t-36.5 -54.5q-28 0 -28 58v122q0 37 5 47.5t36 8.5q25 -19 77 -54q91 54 218 54t232 -43q136 -57 136 -160q0 -170 -254 -242q112 -21 195 -81q102 -73 102 -174zM719 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5 t78.5 33t77.5 -32zM346.5 1318q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4e0;" horiz-adv-x="1181" d="M1113 419q0 -210 -159.5 -336t-366 -126t-350 120t-143.5 264q0 56 33.5 107t79.5 51t76 -30.5t30 -69.5t-29 -68.5t-66.5 -29.5t-68.5 24q13 -136 151 -226.5t281 -90.5q330 0 330 440q0 94 -62 189.5t-148 141.5q-39 21 -94 34t-55 29q0 8 291 439h-330 q-205 0 -293.5 -87.5t-100.5 -293.5h-51l22 443h920q34 0 34 -32q0 -17 -14 -38l-287 -425q154 -52 262 -165.5t108 -263.5z" />
+<glyph unicode="&#x4e1;" horiz-adv-x="948" d="M496 478q179 -12 295.5 -121t116.5 -293.5t-137.5 -311t-334.5 -126.5q-121 0 -215 54q-113 64 -113 170t97 106q42 0 70.5 -28t28.5 -70q0 -94 -100 -99q79 -78 221 -78t224 115t82 252.5t-76 220.5t-210 83q-39 0 -84 -12l-37 38l397 405h-325q-126 0 -164 -19 q-60 -30 -72 -141h-54l21 300h721q38 0 38 -28q0 -20 -18 -38z" />
+<glyph unicode="&#x4e2;" horiz-adv-x="1631" d="M1564 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61q-71 6 -113 6h-361q-36 0 -107 -6v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v964l-734 -1008l1 -1q14 -30 90 -35q3 0 30 -0.5t77 0.5v-61q-71 6 -115 6h-358 q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-967l734 1009q-15 37 -149 37h-46v62q70 -6 112 -6h356q43 0 113 6v-62zM1116 1494h-601 v102h601v-102z" />
+<glyph unicode="&#x4e3;" horiz-adv-x="1261" d="M1204 0q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v570l-499 -653q38 -18 148 -18v-66q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v589q0 49 -9 68q-16 33 -158 33v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-570l499 653q-38 18 -147 18 v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-589q0 -49 9 -68q16 -33 159 -33v-66zM927 1191h-601v102h601v-102z" />
+<glyph unicode="&#x4e4;" horiz-adv-x="1631" d="M1564 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-1064q0 -29 8 -45q18 -35 186 -35h10v-61q-71 6 -113 6h-361q-36 0 -107 -6v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v964l-734 -1008l1 -1q14 -30 90 -35q3 0 30 -0.5t77 0.5v-61q-71 6 -115 6h-358 q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-967l734 1009q-15 37 -149 37h-46v62q70 -6 112 -6h356q43 0 113 6v-62zM1089 1574 q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM716.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4e5;" horiz-adv-x="1261" d="M1204 0q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v570l-499 -653q38 -18 148 -18v-66q-203 6 -238 6t-244 -6v66q142 0 158 33q9 19 9 68v589q0 49 -9 68q-16 33 -158 33v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-570l499 653q-38 18 -147 18 v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-589q0 -49 9 -68q16 -33 159 -33v-66zM901 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM528.5 1318q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78 t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4e6;" horiz-adv-x="1445" d="M722 -43q-280 0 -467 214t-187 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503t-187.5 -499t-467.5 -213.5zM1175 696q0 438 -260 590q-92 54 -192 54t-191 -53q-262 -153 -262 -591q0 -469 265 -632q91 -56 185 -56t188 55q267 156 267 633zM979 1574 q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM606.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4e7;" horiz-adv-x="1054" d="M191.5 118.5q-138.5 142.5 -138.5 341.5t138 349.5t336.5 150.5t336.5 -151t138 -350.5t-139 -341t-336 -141.5t-335.5 142.5zM776 188q47 92 47 292.5t-56 292.5q-84 138 -244.5 138t-241.5 -143q-51 -90 -51 -294.5t55 -299.5q83 -144 246.5 -144t244.5 158zM811 1318 q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM438.5 1318q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4e8;" horiz-adv-x="1445" d="M722 -43q-280 0 -467 214t-187 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503t-187.5 -499t-467.5 -213.5zM915 1286q-92 54 -192 54t-191 -53q-250 -146 -261 -556h903q-11 410 -259 555zM535 64q91 -56 185 -56t188 55q258 151 267 608h-905q8 -450 265 -607z" />
+<glyph unicode="&#x4e9;" horiz-adv-x="1054" d="M191.5 118.5q-138.5 142.5 -138.5 341.5t138 349.5t336.5 150.5t336.5 -151t138 -350.5t-139 -341t-336 -141.5t-335.5 142.5zM767 773q-84 138 -244.5 138t-241.5 -143q-49 -87 -51 -254h593q-2 171 -56 259zM285 174q83 -144 246.5 -144t244.5 158q46 90 47 260h-593 q2 -181 55 -274z" />
+<glyph unicode="&#x4ea;" horiz-adv-x="1445" d="M722 -43q-280 0 -467 214t-187 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503t-187.5 -499t-467.5 -213.5zM915 1286q-92 54 -192 54t-191 -53q-250 -146 -261 -556h903q-11 410 -259 555zM535 64q91 -56 185 -56t188 55q258 151 267 608h-905q8 -450 265 -607z M979 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM606.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4eb;" horiz-adv-x="1054" d="M191.5 118.5q-138.5 142.5 -138.5 341.5t138 349.5t336.5 150.5t336.5 -151t138 -350.5t-139 -341t-336 -141.5t-335.5 142.5zM767 773q-84 138 -244.5 138t-241.5 -143q-49 -87 -51 -254h593q-2 171 -56 259zM285 174q83 -144 246.5 -144t244.5 158q46 90 47 260h-593 q2 -181 55 -274zM811 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM438.5 1318q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4ec;" horiz-adv-x="1335" d="M582 1390q287 0 485.5 -214t198.5 -503.5t-198 -502.5t-486 -213q-184 0 -327.5 118.5t-178.5 298.5q-2 11 -2 17q0 22 27 22q15 0 23 -29q25 -90 47 -135.5t77 -101.5q130 -130 309 -130q91 0 185 41q322 141 322 595v19l-1 38q-80 45 -202 45q-178 0 -355 -155 q-76 -67 -179.5 -67t-214.5 90q-31 25 -31 51t19 26q-4 0 48.5 -30.5t105.5 -30.5q85 0 161 56l147 110q94 58 224 58t274 -95q-31 381 -294 510q-102 50 -207 50q-151 0 -272 -117t-155 -271q-7 -32 -35.5 -32t-28.5 26v423q0 33 21 33q14 0 31 -25l99 -144 q170 169 363 169zM859 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM486.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4ed;" horiz-adv-x="1142" d="M135 953q3 0 107 -86q114 86 259 86q211 0 368 -142t157 -350t-157.5 -349.5t-367.5 -141.5q-141 0 -255 70q-133 82 -133 215q0 30 28 30q21 0 26 -32q15 -106 101 -161.5t199 -55.5q174 0 283 116q90 95 98 289q-69 60 -163 60q-135 0 -250 -109q-55 -52 -110 -52 t-130 38.5t-75 76.5t21 38q3 0 31 -18.5t61 -18.5q67 0 163.5 80.5t198.5 80.5q134 0 251 -94q-18 176 -119 270t-258 94q-188 0 -269 -152q-5 -9 -33 -93q-6 -19 -27 -19t-26 18q-1 4 -1 38v218q0 56 22 56zM811 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5 t-32.5 78t33 77.5t78.5 33t77.5 -32zM438.5 1318q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4ee;" horiz-adv-x="1591" d="M441 -20q-135 0 -214.5 72.5t-79.5 206.5q0 106 99 106q42 0 69.5 -27t27.5 -69.5t-28 -70t-71 -27.5q-14 0 -35 5q20 -70 87 -106t149.5 -36t168.5 135q53 83 136 234l-466 798q-10 19 -37 52q-33 29 -170 29h-9v64q196 -6 246 -6t234 6v-64h-4q-91 0 -91 -41 q0 -14 18 -45l371 -636l345 590q23 39 23 65q0 65 -73 67v64q183 -6 233.5 -6t152.5 6v-64q-171 -2 -248 -134l-550 -940q-133 -228 -284 -228zM1116 1494h-601v102h601v-102z" />
+<glyph unicode="&#x4ef;" horiz-adv-x="1151" d="M249 -439q-76 0 -136 50t-60 124q0 91 89 91q39 0 65 -25.5t26 -63.5q0 -81 -85 -91q41 -38 101 -38q93 0 158 92q32 45 68 130l71 170l-321 781q-22 54 -70 68q-21 6 -74 6h-28v68q120 -8 178.5 -8t261.5 8v-68h-4q-116 0 -116 -54q0 -19 250 -616l217 528q14 34 14 50 q0 90 -101 92v68q170 -8 212 -8t134 8v-68h-2q-140 0 -197 -136l-377 -913q-101 -245 -274 -245zM897 1191h-601v102h601v-102z" />
+<glyph unicode="&#x4f0;" horiz-adv-x="1591" d="M441 -20q-135 0 -214.5 72.5t-79.5 206.5q0 106 99 106q42 0 69.5 -27t27.5 -69.5t-28 -70t-71 -27.5q-14 0 -35 5q20 -70 87 -106t149.5 -36t168.5 135q53 83 136 234l-466 798q-10 19 -37 52q-33 29 -170 29h-9v64q196 -6 246 -6t234 6v-64h-4q-91 0 -91 -41 q0 -14 18 -45l371 -636l345 590q23 39 23 65q0 65 -73 67v64q183 -6 233.5 -6t152.5 6v-64q-171 -2 -248 -134l-550 -940q-133 -228 -284 -228zM1109 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM736.5 1574 q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4f1;" horiz-adv-x="1151" d="M249 -439q-76 0 -136 50t-60 124q0 91 89 91q39 0 65 -25.5t26 -63.5q0 -81 -85 -91q41 -38 101 -38q93 0 158 92q32 45 68 130l71 170l-321 781q-22 54 -70 68q-21 6 -74 6h-28v68q120 -8 178.5 -8t261.5 8v-68h-4q-116 0 -116 -54q0 -19 250 -616l217 528q14 34 14 50 q0 90 -101 92v68q170 -8 212 -8t134 8v-68h-2q-140 0 -197 -136l-377 -913q-101 -245 -274 -245zM871 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM498.5 1318q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78 t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4f2;" horiz-adv-x="1591" d="M441 -20q-135 0 -214.5 72.5t-79.5 206.5q0 106 99 106q42 0 69.5 -27t27.5 -69.5t-28 -70t-71 -27.5q-14 0 -35 5q20 -70 87 -106t149.5 -36t168.5 135q53 83 136 234l-466 798q-10 19 -37 52q-33 29 -170 29h-9v64q196 -6 246 -6t234 6v-64h-4q-91 0 -91 -41 q0 -14 18 -45l371 -636l345 590q23 39 23 65q0 65 -73 67v64q183 -6 233.5 -6t152.5 6v-64q-171 -2 -248 -134l-550 -940q-133 -228 -284 -228zM1313 1532q0 -44 -46 -61l-328 -123l-26 50l292 195q19 13 43.5 13t44.5 -23t20 -51zM963 1532q0 -44 -46 -61l-328 -123l-26 50 l292 195q19 13 43.5 13t44.5 -23t20 -51z" />
+<glyph unicode="&#x4f3;" horiz-adv-x="1151" d="M523 1401q22 29 53 29t54 -23t23 -53t-28 -54l-313 -256l-37 35zM893 1401q22 29 53 29t54 -23t23 -53t-28 -54l-313 -256l-37 35zM249 -439q-76 0 -136 50t-60 124q0 91 89 91q39 0 65 -25.5t26 -63.5q0 -81 -85 -91q41 -38 101 -38q93 0 158 92q32 45 68 130l71 170 l-321 781q-22 54 -70 68q-21 6 -74 6h-28v68q120 -8 178.5 -8t261.5 8v-68h-4q-116 0 -116 -54q0 -19 250 -616l217 528q14 34 14 50q0 90 -101 92v68q170 -8 212 -8t134 8v-68h-2q-140 0 -197 -136l-377 -913q-101 -245 -274 -245z" />
+<glyph unicode="&#x4f4;" horiz-adv-x="1601" d="M1535 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v545q-190 -218 -438 -218q-187 0 -312.5 111t-125.5 298v327q0 30 -7 43q-18 34 -156 34 q-19 0 -39 -1v62q73 -6 156 -6h270q84 0 156 6v-62q-48 1 -60 1q-118 0 -136 -34q-9 -17 -9 -51v-319q0 -149 90.5 -232t237.5 -83q208 0 373 205v430q0 32 -9 49q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62zM1069 1574q32 -32 32 -78.5t-32 -79t-78 -32.5 t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM696.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4f5;" horiz-adv-x="1261" d="M1204 0q-203 6 -237.5 6t-244.5 -6v66q140 0 157 30q10 18 10 71v274q-129 -143 -324 -143q-131 0 -236.5 81t-105.5 208q0 214 -5 229q-11 32 -72 40q-12 1 -90 1v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-143q0 -102 70.5 -160.5t174.5 -58.5 q137 0 246 109q28 28 28 75v178q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-589q0 -52 11 -71q17 -30 157 -30v-66zM891 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM518.5 1318 q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4f6;" horiz-adv-x="1216" d="M744 1281h-214q-51 0 -68.5 -13t-17.5 -66v-997q0 -69 14 -97q23 -47 173 -47h24q0 -12 -0.5 -39t-0.5 -40q0 -312 87 -376q-68 13 -125 92q-15 20 -73.5 125.5t-100 141t-130.5 35.5h-244v61q8 0 26 -0.5t28 -0.5q124 0 141 38q7 15 7 48v1053q0 31 -7 47 q-15 35 -170 35h-25v62h1026l55 -442h-49q-24 212 -82 285q-74 95 -274 95z" />
+<glyph unicode="&#x4f7;" horiz-adv-x="1035" d="M537 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-14 16 -64 94t-82 100.5t-99 22.5h-213v66q140 0 157 30q10 18 10 71v589q0 52 -10 70q-16 30 -151 30h-6v67h846l38 -328h-53q-18 182 -98 229q-55 32 -254 32q-112 0 -122 -2q-32 -6 -40 -31q-3 -10 -3 -55v-601 q0 -53 10 -71q17 -30 157 -30z" />
+<glyph unicode="&#x4f8;" horiz-adv-x="1986" d="M649 1284l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-480h336q188 0 334 -85q174 -101 174 -269t-135.5 -267.5t-302.5 -99.5h-772v61q62 -2 63 -2q113 0 134 45q5 11 5 42v1055q0 32 -9 49q-18 34 -153 34h-40v62q71 -6 115 -6h355q41 0 111 6v-62zM994 147q88 86 88 221 t-87 222t-210 87h-351v-537q0 -53 16.5 -66t69.5 -13h257q129 0 217 86zM1920 1284l-59 2q-75 0 -103 -9q-53 -18 -53 -76v-1057q0 -27 13.5 -52t91.5 -31h110v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49 q-18 34 -153 34h-51v62q71 -6 115 -6h376q41 0 111 6v-62zM1249 1574q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM876.5 1574q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4f9;" horiz-adv-x="1535" d="M1495 0q-203 6 -240.5 6t-241.5 -6v66q139 0 156 29q11 18 11 68v597q0 50 -11 68q-17 29 -156 29v66q203 -6 241 -6t241 6v-66q-80 0 -86 -1q-60 -5 -72 -34q-9 -21 -9 -72v-577q0 -51 9 -72q12 -29 72 -34q6 -1 86 -1v-66zM1004 251q0 -56 -34 -109q-90 -142 -310 -142 h-598v66h9q132 0 148 30q10 18 10 71v589q0 53 -10 71q-16 30 -148 30h-9v66q120 -6 196.5 -6t272.5 6v-66h-9q-132 0 -148 -30q-10 -18 -10 -71v-270h291q127 0 227 -53q122 -65 122 -182zM608 66q93 0 159 50t66 137.5t-56 145t-141 57.5h-272v-302q0 -62 14 -75t78 -13 h152zM1049 1318q32 -32 32 -78.5t-32 -79t-78 -32.5t-78.5 33.5t-32.5 78t33 77.5t78.5 33t77.5 -32zM636.5 1318q32.5 -32 32.5 -78.5t-32.5 -79t-78 -32.5t-78.5 33.5t-33 78t33 77.5t78.5 33t78 -32z" />
+<glyph unicode="&#x4fa;" horiz-adv-x="1216" d="M744 1281h-214q-51 0 -68.5 -13.5t-17.5 -65.5v-559h593v-62h-593v-444q0 -22 8 -39q17 -37 223 -37h22v-168q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29q158 0 158 281v117h-362 q-55 0 -127 -6v61q8 0 26 -0.5t28 -0.5q124 0 141 38q7 15 7 48v435h-202v62h202v556q0 31 -7 47q-15 35 -170 35h-25v62h1026l55 -442h-49q-24 212 -82 285q-74 95 -274 95z" />
+<glyph unicode="&#x4fb;" horiz-adv-x="1035" d="M535 856q-112 0 -122 -2q-32 -6 -40 -31q-3 -10 -3 -55v-305h325v-62h-325v-230q0 -47 7 -62q10 -26 51 -34.5t150 -8.5v-173q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29 q158 0 158 281v117h-103q-33 0 -279 -6v66q140 0 157 30q10 18 10 71v234h-167v62h167v293q0 52 -10 70q-16 30 -151 30h-6v67h846l38 -328h-53q-18 182 -98 229q-55 32 -254 32z" />
+<glyph unicode="&#x4fc;" horiz-adv-x="1518" d="M1336 -147q0 -136 -106 -217q-86 -66 -177 -66q-53 0 -97 33t-44 78.5t30.5 74.5t70.5 29t68.5 -29.5t28.5 -67t-21 -64.5q130 24 130 130q0 95 -106 256l-398 603l-281 -414q-19 -28 -19 -48q0 -43 38.5 -66t84.5 -24v-61q-74 6 -165 6t-305 -6v61q196 0 285 131 l323 477l-362 547q-34 51 -99 64q-24 4 -81 4h-41v62q112 -6 292.5 -6t251.5 6v-62q-128 -5 -128 -58q0 -13 268 -410l225 333q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62q81 -6 163.5 -6t306.5 6v-62q-198 -2 -285 -128l-271 -395l452 -685q72 -109 72 -223z" />
+<glyph unicode="&#x4fd;" horiz-adv-x="1183" d="M974 74q75 -96 75 -226.5t-109 -213.5q-87 -66 -177 -66q-53 0 -97 33t-44 78.5t30.5 74.5t70.5 29t68.5 -29.5t28.5 -67t-21 -64.5q159 30 159 148q0 113 -94 237l-301 398q-192 -223 -192 -272q0 -61 62 -67v-66q-141 6 -221 6t-159 -6v66q159 0 274 128l200 256 l-212 276q-71 92 -105 110.5t-147 18.5v68q110 -8 171 -8t264 8v-68q-75 -2 -75 -52q0 -20 184 -255l134 167q33 41 33 75q0 61 -63 65v68q108 -8 192.5 -8t188.5 8v-68q-152 -3 -255 -109q-26 -27 -197 -244z" />
+<glyph unicode="&#x4fe;" horiz-adv-x="1518" d="M1450 0q-127 6 -299 6t-244 -6v61q128 5 128 59q0 10 -320 493l-281 -414q-19 -28 -19 -48q0 -43 38.5 -66t84.5 -24v-61q-74 6 -165 6t-305 -6v61q196 0 285 131l323 477l-11 16h-408v62h367l-310 469q-34 51 -99 64q-24 4 -81 4h-41v62q112 -6 292.5 -6t251.5 6v-62 q-128 -5 -128 -58q0 -13 268 -410l225 333q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62q81 -6 163.5 -6t306.5 6v-62q-198 -2 -285 -128l-271 -395l9 -14h405v-62h-364l366 -553q35 -53 99 -66q25 -5 85 -5h38v-61z" />
+<glyph unicode="&#x4ff;" horiz-adv-x="1183" d="M1131 0q-91 6 -175.5 6t-261.5 -6v66q77 3 77 54q0 10 -208 285q-192 -223 -192 -272q0 -61 62 -67v-66q-141 6 -221 6t-159 -6v66q159 0 274 128q9 9 195 250h-325v62h287l-169 220q-71 92 -105 110.5t-147 18.5v68q110 -8 171 -8t264 8v-68q-75 -2 -75 -52 q0 -20 184 -255l134 167q33 41 33 75q0 61 -63 65v68q108 -8 192.5 -8t188.5 8v-68q-152 -3 -255 -109q-30 -30 -194 -240h323v-62h-281l242 -311q37 -47 92 -60q28 -7 95 -7h17v-66z" />
+<glyph unicode="&#x500;" horiz-adv-x="1295" d="M1228 0h-695q-174 0 -311 94q-154 106 -154 268t142 262t307 100h335v473q0 32 -7 48q-17 37 -181 37h-17v61q72 -6 133 -6h326q50 0 122 6v-61l-55 1q-122 0 -140 -38q-7 -15 -7 -48v-1051q0 -32 7 -48q16 -37 158 -37q18 0 37 1v-62zM857 141v532h-272 q-313 0 -313 -307q0 -161 75.5 -232.5t237.5 -71.5h186q53 0 69.5 13t16.5 66z" />
+<glyph unicode="&#x501;" horiz-adv-x="1159" d="M793 118q-111 -142 -295 -142t-314.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q163 0 270 -133v464q0 88 -47 109q-20 10 -85 10q-16 0 -35 -1v67l308 23v-1300q0 -88 46 -110q20 -10 85 -10q16 0 35 1v-66l-313 -24v142zM793 253v449q0 32 -24 68q-87 129 -236 129 t-238 -138q-65 -100 -65 -300t61 -299q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="&#x502;" horiz-adv-x="1838" d="M1771 516q-6 0 -22.5 0.5t-25.5 0.5q-72 0 -96 -17.5t-24 -84.5v-169q0 -133 -124 -216q-109 -73 -249 -73q-201 0 -312 127q-112 -84 -265 -84h-120q-174 0 -311 94q-154 106 -154 268t142 262t307 100h335v473q0 32 -7 48q-17 37 -181 37h-17v61q72 -6 133 -6h326 q50 0 122 6v-61l-55 1q-122 0 -140 -38q-7 -15 -7 -48v-970q0 -100 52.5 -159.5t151.5 -59.5t151.5 59.5t52.5 159.5v188q0 52 -11 71q-18 30 -141 30h-16v66q202 -6 249.5 -6t255.5 6v-66zM857 270v403h-272q-313 0 -313 -307q0 -161 75.5 -232.5t237.5 -71.5h48q56 0 86 5 q138 24 138 203z" />
+<glyph unicode="&#x503;" horiz-adv-x="1743" d="M1685 435q-140 0 -157 -30q-11 -19 -11 -71v-69q0 -125 -105.5 -207t-256.5 -82q-234 0 -328 163q-135 -163 -324 -163t-319.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q163 0 270 -133v464q0 88 -47 109q-20 10 -85 10q-16 0 -35 -1v67l308 23v-1236 q0 -101 58.5 -160t156.5 -59t156.5 59t58.5 160v85q0 52 -11 71q-17 30 -157 30v66q203 -6 238.5 -6t244.5 6v-66zM793 253v449q0 32 -24 68q-87 129 -236 129t-238 -138q-65 -100 -65 -300t61 -299q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="&#x504;" horiz-adv-x="1922" d="M1855 516q-6 0 -22.5 0.5t-25.5 0.5q-72 0 -96 -17.5t-24 -84.5v-169q0 -133 -124 -216q-109 -73 -249 -73t-249 73q-124 83 -124 216v129q0 101 -108 203q-123 118 -292 118h-233q-38 0 -38 30q0 16 13 22.5t170.5 18t256.5 77.5q150 100 150 257q0 111 -103 174 q-87 53 -225.5 53t-242.5 -62.5t-130 -138.5q-4 -20 -17 -58q-10 -20 -35 -20q-41 0 -39 46l9 246q2 49 35 49q26 0 112 -85q136 85 318 85t326 -64q185 -82 185 -227q0 -261 -386 -360q172 -25 295 -115q148 -108 148 -265v-132q0 -100 52.5 -159.5t151.5 -59.5t151.5 59.5 t52.5 159.5v188q0 52 -11 71q-18 30 -141 30h-16v66q202 -6 249.5 -6t255.5 6v-66z" />
+<glyph unicode="&#x505;" horiz-adv-x="1580" d="M1562 435q-140 0 -157 -30q-11 -19 -11 -71v-69q0 -125 -105.5 -207t-249.5 -82t-245 68.5t-144 188.5q-55 159 -63 169q-51 73 -198 73h-118q-55 0 -55 23t29.5 25.5t79.5 5.5q122 8 192 62q86 66 86 151.5t-58.5 121t-151 35.5t-165 -36.5t-94 -91t-36.5 -54.5 q-28 0 -28 58v122q0 37 5 47q4 9 27 9h9q25 -19 77 -54q91 54 218 54t232 -43q136 -57 136 -160q0 -170 -254 -242q199 -38 264 -164l62 -210q40 -104 186 -104q98 0 156.5 59t58.5 160v85q0 52 -11 71q-17 30 -157 30v66q203 -6 238.5 -6t244.5 6v-66z" />
+<glyph unicode="&#x506;" horiz-adv-x="1287" d="M938 0h-245v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45v220q0 156 -98.5 246t-255.5 90h-116q-78 -1 -116.5 -1t-38.5 30q0 16 13 22.5t170.5 18t256.5 77.5q150 100 150 257q0 111 -103 174q-87 53 -225.5 53t-242.5 -62.5t-130 -138.5q-4 -20 -17 -58 q-10 -20 -35 -20q-41 0 -39 46l9 246q2 49 35 49q26 0 112 -85q136 85 318 85t326 -64q185 -82 185 -227q0 -261 -386 -360q164 -24 275 -117q128 -107 128 -267v-150q0 -69 14 -97q23 -47 173 -47h24q0 -12 -0.5 -39t-0.5 -40q0 -312 87 -376q-68 13 -125 92 q-15 20 -73.5 125.5t-100 141t-130.5 35.5z" />
+<glyph unicode="&#x507;" horiz-adv-x="1010" d="M998 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-14 16 -64 94t-82 100.5t-99 22.5h-214v66q140 0 157 30q10 18 10 71v86q0 222 -251 222h-118q-55 0 -55 23t29.5 25.5t79.5 5.5q122 8 192 62q86 66 86 151.5t-58.5 121t-151 35.5t-165 -36.5t-94 -91t-36.5 -54.5 q-28 0 -28 58v122q0 37 5 47q4 9 27 9h9q25 -19 77 -54q91 54 218 54t232 -43q136 -57 136 -160q0 -170 -254 -242q268 -51 268 -240v-101q0 -53 10 -71q17 -30 157 -30z" />
+<glyph unicode="&#x508;" horiz-adv-x="2085" d="M1488 1281l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-971q0 -100 52.5 -159.5t151.5 -59.5t151.5 59.5t52.5 159.5v188q0 52 -11 71q-18 30 -141 30h-16v66q202 -6 249.5 -6t255.5 6v-66q-6 0 -22.5 0.5t-25.5 0.5q-72 0 -96 -17.5t-24 -84.5v-169q0 -133 -124 -216 q-109 -73 -248.5 -73t-251.5 76q-127 86 -127 220v945q0 32 -9 49q-18 34 -153 34h-67q-188 0 -215 -35q-11 -14 -11 -63q0 -227 -12 -426q-46 -757 -354 -757q-86 0 -148 60t-62 146q0 45 30 76t74 31t74 -30t30 -75q0 -81 -77 -102q31 -14 75 -14q200 0 256 520 q21 195 21 511q0 113 -13 132q-18 27 -187 27v61h1137v-62z" />
+<glyph unicode="&#x509;" horiz-adv-x="1812" d="M281 81q186 0 186 658q0 63 -6 80q-11 30 -72 37q-10 1 -89 1v66h876v-66q-140 0 -157 -30q-10 -18 -10 -71v-507q0 -101 58.5 -160t156.5 -59t156.5 59t58.5 160v85q0 52 -11 71q-17 30 -157 30v66q203 -6 238.5 -6t244.5 6v-66q-140 0 -157 -30q-11 -19 -11 -71v-69 q0 -125 -105.5 -207t-256.5 -82t-256.5 82t-105.5 207v487q0 47 -8 65q-18 40 -149 40q-69 0 -92 -5q-55 -11 -63 -53q-3 -17 -4 -116q-6 -683 -261 -683q-70 0 -121 48.5t-51 118.5q0 88 86 88q36 0 60 -24.5t24 -61.5q0 -59 -50 -79q18 -9 48 -9z" />
+<glyph unicode="&#x50a;" horiz-adv-x="2021" d="M1413 1284l-56 2q-122 0 -140 -36q-8 -16 -8 -45v-978q0 -100 52.5 -159.5t151.5 -59.5t151.5 59.5t52.5 159.5v188q0 52 -11 71q-18 30 -141 30h-16v66q202 -6 249.5 -6t255.5 6v-66q-6 0 -22.5 0.5t-25.5 0.5q-72 0 -96 -17.5t-24 -84.5v-169q0 -133 -124 -216 q-109 -73 -248.5 -73t-252.5 77q-127 86 -127 220v417h-590v-530q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62l-55 2 q-123 0 -142 -36q-8 -16 -8 -45v-474h590v474q0 29 -8 45q-17 34 -148 34h-46v62q70 -6 112 -6h356q43 0 113 6v-62z" />
+<glyph unicode="&#x50b;" horiz-adv-x="1756" d="M1698 435q-140 0 -157 -30q-11 -19 -11 -71v-69q0 -125 -105.5 -207t-256.5 -82t-256.5 82t-105.5 207v183h-436v-281q0 -49 9 -68q16 -33 159 -33v-66q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66 q-143 0 -159 -33q-9 -19 -9 -68v-242h436v242q0 53 -10 71q-17 30 -157 30v66q209 -6 243.5 -6t237.5 6v-66q-140 0 -157 -30q-10 -18 -10 -71v-507q0 -101 58.5 -160t156.5 -59t156.5 59t58.5 160v85q0 52 -11 71q-17 30 -157 30v66q203 -6 238.5 -6t244.5 6v-66z" />
+<glyph unicode="&#x50c;" horiz-adv-x="1421" d="M1353 516q-6 0 -22.5 0.5t-25.5 0.5q-72 0 -96 -17.5t-24 -84.5v-169q0 -133 -140 -215q-125 -74 -293 -74q-288 0 -486 213t-198 502.5t198.5 503.5t485.5 214q193 0 363 -169l99 144q17 25 31 25q22 0 22 -33v-503q0 -26 -29 -26t-35 32q-12 60 -47 178 q-51 127 -151 208.5t-217 81.5t-220 -50q-298 -145 -298 -613.5t322 -606.5q96 -41 187.5 -41t164 54t72.5 156v188q0 52 -11 71q-18 30 -141 30h-16v66q202 -6 249.5 -6t255.5 6v-66z" />
+<glyph unicode="&#x50d;" horiz-adv-x="1100" d="M1042 435q-140 0 -157 -30q-11 -19 -11 -71v-69q0 -125 -105.5 -207t-256.5 -82q-194 0 -326.5 144.5t-132.5 343t132 347.5t330 149q146 0 245 -74q10 7 45.5 40.5t46.5 33.5q22 0 22 -56v-218q0 -34 -1 -38q-5 -18 -26 -18t-27 26q-28 115 -108 182t-194 67 q-60 0 -120 -34q-168 -94 -168 -402.5t178 -404.5q63 -34 130 -34t128 58t61 158v88q0 52 -11 71q-17 30 -157 30v66q203 -6 238.5 -6t244.5 6v-66z" />
+<glyph unicode="&#x50e;" horiz-adv-x="1606" d="M1538 516q-6 0 -22.5 0.5t-25.5 0.5q-72 0 -96 -17.5t-24 -84.5v-169q0 -133 -124 -216q-109 -73 -248.5 -73t-259.5 83t-120 217v961q0 43 -29 56q-17 8 -66 8q-256 0 -321 -62.5t-86 -318.5h-48l36 442h1206l36 -442h-49q-22 262 -88.5 321.5t-330.5 59.5 q-46 0 -65.5 -11.5t-19.5 -53.5v-990q0 -100 52.5 -159.5t151.5 -59.5t151.5 59.5t52.5 159.5v188q0 52 -11 71q-18 30 -141 30h-16v66q202 -6 249.5 -6t255.5 6v-66z" />
+<glyph unicode="&#x50f;" horiz-adv-x="1448" d="M1390 435q-140 0 -157 -30q-11 -19 -11 -71v-69q0 -125 -105.5 -207t-256.5 -82t-256.5 82t-105.5 207v504q0 68 -23 81q-13 7 -92 7q-152 0 -193.5 -50t-52.5 -212h-53l25 328h921l26 -328h-54q-11 161 -48 207q-46 55 -198 55q-75 0 -88 -7q-23 -13 -23 -81v-520 q0 -101 58.5 -160t156.5 -59t156.5 59t58.5 160v85q0 52 -11 71q-17 30 -157 30v66q203 -6 238.5 -6t244.5 6v-66z" />
+<glyph unicode="&#x510;" horiz-adv-x="1244" d="M1177 321q0 -10 -5 -23q-135 -341 -512 -341q-212 0 -381 94q-204 113 -204 308q0 157 148 265q123 90 295 115q-386 98 -386 360q0 145 185 227q144 64 326 64t318 -85q85 85 112 85q33 0 35 -49l9 -246q2 -46 -39 -46q-25 0 -35 20q-5 20 -17 58q-26 76 -130 138.5 t-242.5 62.5t-225.5 -53q-103 -63 -103 -174q0 -157 150 -257q99 -66 279 -79q66 -4 149 -17q12 -6 12 -22q0 -30 -38.5 -30t-116 0.5t-116.5 0.5q-157 0 -255.5 -90t-98.5 -253.5t107.5 -250.5t281.5 -87q265 0 398 205q14 22 52 101q11 23 25 23q23 0 23 -24z" />
+<glyph unicode="&#x511;" horiz-adv-x="920" d="M835 276q29 0 29 -23t-27 -74q-107 -203 -340 -203q-155 0 -276 61q-151 76 -151 216q0 101 102 174q82 60 195 81q-254 72 -254 242q0 103 136 163q106 47 232.5 47t217.5 -54l77 54h9q32 0 32 -35v-165q0 -36 -28 -36q-16 0 -37 54.5t-93.5 91t-164 36.5t-151 -38.5 t-59.5 -124.5t78.5 -146.5t199.5 -67.5l64 -2q45 -5 45 -28.5t-55 -23.5h-118q-251 0 -251 -223t266 -223q140 0 216 87q28 33 57.5 96.5t48.5 63.5z" />
+<glyph unicode="&#x512;" horiz-adv-x="1554" d="M1488 1281l-59 2q-76 0 -103 -9q-53 -18 -53 -76v-1303q0 -141 -112.5 -234t-245 -93t-229.5 73t-97 190q0 49 30.5 81.5t78.5 32.5t79 -31.5t31 -78.5q0 -110 -121 -110h-4q71 -114 217 -114q99 0 156 101q47 83 47 190v1296q0 32 -9 49q-18 34 -153 34h-71 q-188 0 -215 -35q-11 -14 -11 -63q0 -227 -12 -426q-46 -757 -354 -757q-86 0 -148 60t-62 146q0 45 30 76t74 31t74 -30t30 -75q0 -81 -77 -102q31 -14 75 -14q200 0 256 520q21 195 21 511q0 113 -13 132q-18 27 -187 27v61h1137v-62z" />
+<glyph unicode="&#x513;" horiz-adv-x="1267" d="M281 81q186 0 186 658q0 63 -6 80q-11 30 -72 37q-10 1 -89 1v66h876v-66q-140 0 -157 -30q-10 -18 -10 -71v-863q0 -133 -81 -232.5t-211 -99.5q-90 0 -159 40q-83 48 -83 132q0 42 27.5 70t69.5 28t70.5 -28t28.5 -70q0 -76 -74 -96q58 -29 114 -29q158 0 158 281v863 q0 49 -7 65q-18 40 -159.5 40t-152.5 -58q-3 -17 -4 -116q-6 -683 -261 -683q-70 0 -121 48.5t-51 118.5q0 88 86 88q36 0 60 -24.5t24 -61.5q0 -59 -50 -79q18 -9 48 -9z" />
+<glyph unicode="&#x514;" horiz-adv-x="2261" d="M833 1343l301 -3q175 0 246 6v-62q-128 -5 -128 -58q0 -13 268 -410l225 333q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62q81 -6 163.5 -6t306.5 6v-62q-198 -2 -285 -128l-271 -395l416 -629q35 -53 99 -66q25 -5 85 -5h38v-61q-127 6 -299 6t-244 -6v61q128 5 128 59 q0 10 -320 493l-281 -414q-19 -28 -19 -48q0 -43 38.5 -66t84.5 -24v-61q-74 6 -165 6t-305 -6v61q196 0 285 131l323 477l-362 547q-28 42 -68.5 53.5t-118.5 11.5q-188 0 -215 -35q-11 -14 -11 -63q0 -227 -12 -426q-46 -757 -354 -757q-86 0 -148 60t-62 146q0 45 30 76 t74 31t74 -30t30 -75q0 -81 -77 -102q31 -14 75 -14q200 0 256 520q21 195 21 511q0 113 -13 132q-18 27 -187 27v61h482z" />
+<glyph unicode="&#x515;" horiz-adv-x="1813" d="M281 81q186 0 186 658q0 63 -6 80q-11 30 -72 37q-10 1 -89 1v66h828v-68q-75 -2 -75 -52q0 -20 184 -255l134 167q33 41 33 75q0 61 -63 65v68q108 -8 192.5 -8t188.5 8v-68q-152 -3 -255 -109q-26 -27 -197 -244l287 -369q37 -47 92 -60q28 -7 95 -7h17v-66 q-91 6 -175.5 6t-261.5 -6v66q77 3 77 54q0 10 -208 285q-192 -223 -192 -272q0 -61 62 -67v-66q-141 6 -221 6t-159 -6v66q159 0 274 128l200 256l-212 276q-65 84 -104 107.5t-122 23.5t-106 -5q-55 -11 -63 -53q-3 -17 -4 -116q-6 -683 -261 -683q-70 0 -121 48.5 t-51 118.5q0 88 86 88q36 0 60 -24.5t24 -61.5q0 -59 -50 -79q18 -9 48 -9z" />
+<glyph unicode="&#x516;" horiz-adv-x="1850" d="M1782 0q-127 6 -299 6t-244 -6v61q128 5 128 59q0 12 -379 580q-129 -81 -279 -81h-265v-473q0 -32 7 -48q17 -37 181 -37h17v-61q-72 6 -133 6h-326q-50 0 -122 -6v61l55 -1q122 0 140 38q7 15 7 48v1051q0 32 -7 48q-16 37 -158 37q-18 0 -37 -1v62h625q174 0 311 -94 q154 -106 154 -272q0 -79 -41 -149l217 321q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62q81 -6 163.5 -6t306.5 6v-62q-198 -2 -285 -128l-271 -395l416 -629q35 -53 99 -66q25 -5 85 -5h38v-61zM954 977q0 161 -75.5 232.5t-237.5 71.5h-116q-53 0 -69.5 -13t-16.5 -66 v-532h202q313 0 313 307z" />
+<glyph unicode="&#x517;" horiz-adv-x="1649" d="M1597 0q-91 6 -175.5 6t-261.5 -6v66q77 3 77 54q0 16 -148 208q-43 -153 -169.5 -252.5t-288.5 -99.5q-78 0 -158.5 42t-105.5 109v-388q0 -42 11 -59q19 -29 114 -29q19 0 41 1v-66q-169 5 -241.5 5t-238.5 -5v66q37 -2 76.5 -2t60.5 14q30 19 30 83v1002 q0 51 -10 71.5t-44 28.5q-26 6 -83 6h-30v68l307 23v-141q127 141 293 141t285.5 -107t155.5 -265l113 141q33 41 33 75q0 61 -63 65v68q108 -8 192.5 -8t188.5 8v-68q-152 -3 -255 -109q-26 -27 -197 -244l287 -369q37 -47 92 -60q28 -7 95 -7h17v-66zM855 176 q74 128 74 282t-67 281q-81 154 -218 154q-179 0 -277 -172v-478q0 -46 30 -89q91 -130 230.5 -130t227.5 152z" />
+<glyph unicode="&#x518;" horiz-adv-x="2128" d="M865 0v61q39 -1 55 -1q126 0 142 35q7 15 7 46v511h-227q-259 0 -259 -297q0 -13 0.5 -40t0.5 -40q0 -318 -330 -318q-83 0 -134.5 65t-51.5 151q0 33 24 33q18 0 24 -31q32 -175 131 -175q88 0 118 158l23 169q16 108 41 162q65 137 224 192q-138 34 -228 102 q-116 87 -116 209q0 167 180 267q151 84 333 84h1128l56 -442h-49q-24 218 -99.5 299t-288.5 81h-243q-54 0 -71 -13.5t-17 -65.5v-496h158q133 0 174 46q39 46 39 176v7h51v-513h-51v5q0 133 -41 179t-172 46h-158v-512q0 -52 17 -65.5t71 -13.5h253q236 0 326 111 q68 84 107 336h49l-84 -508h-1112zM1069 706v513q0 43 -32 56q-18 8 -69 8q-230 0 -313 -35q-144 -60 -144 -256q0 -286 339 -286h219z" />
+<glyph unicode="&#x519;" horiz-adv-x="1639" d="M1560 280q27 0 27 -29t-35 -87q-113 -188 -315 -188t-338 144t-140 341h-128q-37 0 -81 -24.5t-65 -54.5t-21.5 -121t-10.5 -131q-22 -80 -92.5 -120t-174.5 -40q-64 0 -108 45t-44 109q0 32 28 32q20 0 26 -30q21 -109 88 -109q52 0 80 99l55 198q48 121 145 164 q-240 56 -240 204q0 82 70 142q127 109 333 109q48 0 142 -15t144 -15t148 28.5t151 28.5q185 0 284 -131.5t99 -322.5q0 -29 -7.5 -37t-38.5 -8h-605q0 -184 64 -287q89 -144 242 -144q196 0 290 221q12 29 28 29zM1446 506q0 153 -46 260q-64 145 -196 145q-42 0 -90 -23 q-165 -79 -175 -382h507zM836 783q0 84 -168 84q-136 0 -190 -25q-84 -40 -84 -160q0 -89 74 -132.5t170 -43.5h122q6 93 54 199q22 49 22 78z" />
+<glyph unicode="&#x51a;" horiz-adv-x="1457" d="M1390 -19q0 -135 -52 -236q-65 -127 -189 -127t-183 130q-34 73 -56 239q-95 -30 -186 -30q-281 0 -468.5 214t-187.5 498.5t186.5 502.5t468 218t468 -217.5t186.5 -503.5q0 -209 -107 -390.5t-292 -265.5q62 -192 188 -192q138 0 180 166q9 35 21 35q23 0 23 -41z M1180 669q0 455 -262 613q-96 58 -194.5 58t-193.5 -56q-267 -157 -267 -615q0 -213 69 -375q86 -199 259 -263q-28 45 -28 103.5t47.5 107.5t115.5 49q144 0 221 -208q233 172 233 586zM726 248q-50 0 -84.5 -36.5t-34.5 -87t33 -84.5t84 -34q92 0 174 46q-36 196 -172 196 z" />
+<glyph unicode="&#x51b;" horiz-adv-x="1159" d="M1106 -414q-166 5 -243 5t-239 -5v66q37 -2 77 -2t66 16.5t26 80.5v383q-115 -154 -284 -154q-192 0 -324 144.5t-132 340t138 340.5t334 145q92 0 169.5 -54t117.5 -140l81 194h47v-1199q0 -46 12 -67q17 -29 113 -29q19 0 41 1v-66zM799 291v301q0 112 -76 206.5 t-178.5 94.5t-176.5 -72q-138 -134 -138 -362q0 -152 66 -280q81 -155 219 -155q104 0 194 82t90 185z" />
+<glyph unicode="&#x51c;" horiz-adv-x="2087" d="M2019 1284q-152 0 -195 -132l-378 -1156q-13 -39 -38.5 -39t-37.5 37l-328 1003l-323 -1001q-13 -39 -39.5 -39t-38.5 37l-395 1207q-6 19 -23 53q-23 30 -134 30h-21v62q242 -6 344.5 -6t175.5 6v-62h-5q-161 0 -161 -58q0 -15 4 -27l316 -968l275 845l-35 127 q-16 48 -52 64.5t-134 16.5v62q242 -6 344.5 -6t175.5 6v-62h-5q-160 0 -160 -58q0 -15 5 -30l316 -965l296 910q10 31 10 39q0 53 -63 81q-48 22 -109 23v62q155 -6 239 -6t174 6v-62z" />
+<glyph unicode="&#x51d;" horiz-adv-x="1571" d="M1045 -24q-28 0 -42 40l-220 608l-216 -606q-15 -42 -42.5 -42t-44.5 48l-270 757q-19 54 -62 68q-20 6 -78 6h-17v68q143 -8 170.5 -8t260.5 8v-68h-4q-121 0 -121 -56q0 -38 77 -245l137 -366l183 518q-38 105 -54 121q-29 28 -129 28v68q120 -8 189 -8l224 8v-68h-4 q-124 0 -124 -56q0 -11 11 -42l213 -595l195 546q10 28 10 46q0 98 -125 101v68q151 -8 209.5 -8t146.5 8v-68q-131 -3 -179 -136l-252 -703q-14 -40 -42 -40z" />
+<glyph unicode="&#x51e;" horiz-adv-x="1514" d="M649 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-447q376 0 530 217l-297 158l29 55l301 -160l102 231q53 109 145 109q53 0 92 -41t39 -95q0 -92 -90 -92q-39 0 -65 25.5t-26 56.5t10 53q-38 -16 -74 -102q-68 -160 -76 -175l303 -161l-29 -55l-306 162 q-110 -168 -319 -209v-8q117 -16 221.5 -77t150.5 -158q25 -54 39 -150l25 -181q30 -158 118 -158q99 0 131 175q6 31 24 31q24 0 24 -33q0 -86 -51.5 -151t-134.5 -65q-330 0 -330 318q0 13 1 40v40q0 136 -83 239.5t-216 103.5h-188v-559q0 -28 9 -45q17 -33 186 -33h10 v-61q-71 6 -120 6h-347q-43 0 -114 -6v61q8 0 26.5 -0.5t28.5 -0.5q125 0 141 40q6 15 6 44v1066q0 27 -7 41q-16 33 -176 33h-19v62q70 -6 119 -6h342q50 0 120 6v-62z" />
+<glyph unicode="&#x51f;" horiz-adv-x="1080" d="M409 478l-56 -7v-313q0 -41 9 -59q17 -33 150 -33h8v-66q-203 6 -237 6t-244 -6v66q7 0 23.5 -0.5t54 -0.5t63.5 16t26 77v607q0 41 -9 59q-17 33 -150 33h-8v66q208 -6 243.5 -6t237.5 6v-66q-7 0 -23.5 0.5t-54 0.5t-63.5 -16t-26 -77v-226h92q157 0 203 116l-156 63 l23 58l152 -62q21 76 34 104q55 120 175 120q70 0 116 -48t46 -118q0 -102 -102 -102q-39 0 -66.5 28.5t-27.5 62t16 60t16 29.5q0 18 -25 18q-49 0 -79 -55q-12 -22 -44 -123l160 -64l-23 -58l-158 64q-39 -93 -105 -126q134 -30 196.5 -93t62.5 -205t66 -142q40 0 57 44 q6 16 16 78q4 26 26 26q27 0 27 -34q0 -75 -27 -128q-34 -67 -101 -67q-85 0 -134 75t-53.5 158.5t-20 119.5t-70.5 71q-108 69 -236 69z" />
+<glyph unicode="&#x520;" horiz-adv-x="2082" d="M1385 793q284 0 463 -162t179 -442t-180.5 -450.5t-461.5 -170.5q-118 0 -233 59t-195 153l43 32q176 -175 392.5 -175t332.5 167q100 145 100 378.5t-102 379.5q-117 169 -338 169q-54 0 -112 -12v-578q0 -26 6 -41q13 -32 90 -39q5 0 32 -0.5t76 0.5v-61q-71 6 -117 6 h-362q-41 0 -112 -6v61q8 0 27.5 -0.5t29.5 -0.5q128 0 147 36q9 17 9 49v1053q0 32 -9 49q-18 34 -153 34h-67q-188 0 -215 -35q-11 -14 -11 -63q0 -227 -12 -426q-46 -757 -354 -757q-86 0 -148 60t-62 146q0 45 30 76t74 31t74 -30t30 -75q0 -81 -77 -102q31 -14 75 -14 q200 0 256 520q21 195 21 511q0 113 -13 132q-18 27 -187 27v61h1126v-62q-8 0 -29 0.5t-32 0.5q-121 0 -137 -39q-6 -14 -6 -41v-417q56 8 112 8z" />
+<glyph unicode="&#x521;" horiz-adv-x="1650" d="M281 81q186 0 186 658q0 63 -6 80q-11 30 -72 37q-10 1 -89 1v66h876v-66q-140 0 -157 -30q-10 -18 -10 -71v-119q157 142 274 142q152 0 233 -110.5t81 -268.5q0 -278 -189 -509.5t-462 -332.5l-14 48q220 81 360.5 288t140.5 443q0 131 -45 215q-58 107 -178 107 q-94 0 -201 -99v-393q0 -53 10 -71q17 -30 157 -30v-66q-203 6 -237.5 6t-244.5 -6v66q140 0 157 30q10 18 10 71v585q0 49 -7 65q-18 40 -149 40q-69 0 -92 -5q-55 -11 -63 -53q-3 -17 -4 -116q-6 -683 -261 -683q-70 0 -121 48.5t-51 118.5q0 88 86 88q36 0 60 -24.5 t24 -61.5q0 -59 -50 -79q18 -9 48 -9z" />
+<glyph unicode="&#x522;" horiz-adv-x="2018" d="M649 1284l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-474h590v474q0 29 -8 45q-17 34 -148 34h-46v62q70 -6 112 -6h356q43 0 113 6v-64q-8 0 -29 0.5t-32 0.5q-121 0 -137 -39q-6 -14 -6 -41v-418q56 8 112 8q284 0 463 -162t179 -442t-180.5 -450.5t-461.5 -170.5 q-118 0 -233 59t-195 153l43 32q176 -175 392.5 -175t332.5 167q100 145 100 378.5t-102 379.5q-117 169 -338 169q-54 0 -112 -12v-578q0 -26 6 -41q13 -32 90 -39q5 0 32 -0.5t76 0.5v-61q-71 6 -113 6h-361q-36 0 -107 -6v61q9 0 28 -0.5t29 -0.5q119 0 137 36q8 16 8 45 v530h-590v-530q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62z" />
+<glyph unicode="&#x523;" horiz-adv-x="1594" d="M1541 400q0 -278 -189 -509.5t-462 -332.5l-14 48q220 81 360.5 288t140.5 443q0 131 -45 215q-58 107 -178 107q-94 0 -201 -99v-393q0 -53 10 -71q17 -30 157 -30v-66q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v281h-435v-281q0 -49 9 -68q16 -33 159 -33 v-66q-203 6 -238 6t-244 -6v66q140 0 157 30q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-143 0 -159 -33q-9 -19 -9 -68v-242h435v242q0 53 -10 71q-17 30 -157 30v66q209 -6 244 -6t238 6v-66q-140 0 -157 -30q-10 -18 -10 -71v-119 q157 142 274 142q152 0 233 -110.5t81 -268.5z" />
+<glyph unicode="&#x524;" horiz-adv-x="1480" d="M1077 0h-245v61h78q60 0 85 11q39 17 39 69v1141h-590v-1141q0 -26 6 -41q13 -32 90 -39q6 0 33 -0.5t76 0.5v-61q-71 6 -113 6h-360q-37 0 -108 -6v61h78q60 0 85 11q39 17 39 69v1062q0 26 -6 41q-13 32 -90 38h-106v62h1345v-62q-8 0 -29 0.5t-32 0.5q-121 0 -137 -39 q-6 -14 -6 -41v-998q0 -69 14 -97q23 -47 173 -47h24q0 -12 -0.5 -39t-0.5 -40q0 -312 87 -376q-68 13 -125 92q-15 20 -73.5 125.5t-100 141t-130.5 35.5z" />
+<glyph unicode="&#x525;" horiz-adv-x="1178" d="M1120 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-14 16 -64 94t-82 100.5t-99 22.5h-214v66q140 0 157 30q10 18 10 71v585q0 54 -15 74q-23 31 -194 31t-198.5 -20t-27.5 -85v-585q0 -52 11 -71q17 -30 157 -30v-66q-203 6 -237.5 6t-244.5 -6v66q140 0 157 30 q10 18 10 71v589q0 53 -10 71q-17 30 -157 30v66h1065v-66q-140 0 -157 -30q-11 -20 -11 -71v-589q0 -53 10 -71q17 -30 157 -30z" />
+<glyph unicode="&#x526;" horiz-adv-x="1482" d="M649 1284l-55 2q-123 0 -142 -36q-8 -16 -8 -45v-453q154 122 339.5 122t311 -111t125.5 -298v-260q0 -69 14 -97q23 -47 173 -47h24q0 -12 -0.5 -39t-0.5 -40q0 -312 87 -376q-68 13 -125 92q-15 20 -73.5 125.5t-100 141t-130.5 35.5h-248v62q48 -1 60 -1q118 0 136 34 q9 17 9 51v319q0 149 -90.5 232t-240.5 83t-270 -101v-538q0 -29 8 -45q18 -35 187 -35h10v-61q-71 6 -115 6h-358q-37 0 -108 -6v61q9 0 27.5 -0.5t28.5 -0.5q121 0 139 36q7 14 7 45v1064q0 31 -7 45q-17 34 -149 34h-46v62q70 -6 112 -6h354q45 0 115 6v-62z" />
+<glyph unicode="&#x527;" horiz-adv-x="1181" d="M1129 66l-2 -101q0 -212 94 -231q-68 0 -115 49q-14 16 -64 94t-82 100.5t-99 22.5h-214v66q30 -1 70.5 -1t63.5 12q33 19 33 76v519q0 227 -158 227q-130 0 -209.5 -104.5t-79.5 -238.5v-400q0 -39 10 -58q18 -33 117 -33q18 0 38 1v-66q-200 6 -236.5 6t-242.5 -6v66 q30 -1 72.5 -1t68 16.5t25.5 80.5v1115q0 87 -44 108q-21 10 -96 10h-26v67l306 23v-744h2q41 93 125 149t184 56q292 0 292 -314v-465q0 -53 10 -71q17 -30 157 -30z" />
+<glyph unicode="&#x528;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x529;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x52a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x52b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x52c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x52d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x52e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x52f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x6f0;" horiz-adv-x="1218" d="M798 510q-53 -164 -85 -335q-129 73 -283 196q38 166 102 344q105 -92 266 -205z" />
+<glyph unicode="&#x660;" horiz-adv-x="1218" d="M798 510q-53 -164 -85 -335q-129 73 -283 196q38 166 102 344q105 -92 266 -205z" />
+<glyph unicode="&#x6f1;" horiz-adv-x="1218" d="M672 0l5 175q0 406 -206 735q-45 72 -129 174l108 244q164 -198 236 -397.5t72 -457.5q0 -135 -47 -473h-39z" />
+<glyph unicode="&#x661;" horiz-adv-x="1218" d="M672 0l5 175q0 406 -206 735q-45 72 -129 174l108 244q164 -198 236 -397.5t72 -457.5q0 -135 -47 -473h-39z" />
+<glyph unicode="&#x6f2;" horiz-adv-x="1218" d="M711 201l-5 -201h-34q-82 346 -97 403q-64 232 -142 379t-226 332l75 229q180 -255 362 -255q118 0 166 72q35 52 51 181l36 2q9 -79 9 -199t-60.5 -198.5t-180.5 -78.5q-15 0 -78 9q42 -89 61 -144q63 -185 63 -531z" />
+<glyph unicode="&#x662;" horiz-adv-x="1218" d="M711 201l-5 -201h-34q-82 346 -97 403q-64 232 -142 379t-226 332l75 229q180 -255 362 -255q118 0 166 72q35 52 51 181l36 2q9 -79 9 -199t-60.5 -198.5t-180.5 -78.5q-15 0 -78 9q42 -89 61 -144q63 -185 63 -531z" />
+<glyph unicode="&#x6f3;" horiz-adv-x="1218" d="M1085 1343l6 -114q0 -291 -220 -291q-137 0 -182 83q-78 -128 -239 -128q72 -142 100 -252.5t28 -251t-39 -389.5h-46q0 352 -67.5 545.5t-279.5 505.5l83 268q122 -202 296.5 -202t213.5 226h36q16 -188 131 -188q119 0 142 188h37z" />
+<glyph unicode="&#x663;" horiz-adv-x="1218" d="M1085 1343l6 -114q0 -291 -220 -291q-137 0 -182 83q-78 -128 -239 -128q72 -142 100 -252.5t28 -251t-39 -389.5h-46q0 352 -67.5 545.5t-279.5 505.5l83 268q122 -202 296.5 -202t213.5 226h36q16 -188 131 -188q119 0 142 188h37z" />
+<glyph unicode="&#x664;" horiz-adv-x="1218" d="M361 188q0 97 104 222q41 49 181 181l-179 67q-128 57 -128 109q0 201 463 554l-35 -217q-267 -99 -267 -156q0 -45 165 -104t165 -95t-148 -186.5t-148 -208.5q0 -92 387 -125l-71 -229q-152 0 -287 33q-202 51 -202 155z" />
+<glyph unicode="&#x665;" horiz-adv-x="1218" d="M1014 711q0 -219 -136 -344.5t-356 -125.5q-124 0 -203 40q-104 53 -104 165q0 169 111 398q127 265 276 265q134 0 273 -132.5t139 -265.5zM930 591q0 92 -170 195t-269 103q-74 0 -119.5 -91t-45.5 -175q0 -175 289 -175q101 0 189 27q126 39 126 116z" />
+<glyph unicode="&#x666;" horiz-adv-x="1218" d="M198 1085l7 225l41 5q27 -63 52 -83q51 -42 165 -42t329 48q-41 -248 -41 -346q0 -316 109 -487q18 -28 89 -116l-43 -258q-73 48 -111 90q-137 151 -137 482q0 91 31 360q-165 -31 -217 -31q-179 0 -226.5 33t-47.5 120z" />
+<glyph unicode="&#x6f7;" horiz-adv-x="1218" d="M1064 1315l-10 -325q-321 -328 -410 -990h-16q-65 313 -161 518q-119 253 -321 434l41 358q332 -388 471 -969h12q86 616 394 974z" />
+<glyph unicode="&#x667;" horiz-adv-x="1218" d="M1064 1315l-10 -325q-321 -328 -410 -990h-16q-65 313 -161 518q-119 253 -321 434l41 358q332 -388 471 -969h12q86 616 394 974z" />
+<glyph unicode="&#x6f8;" horiz-adv-x="1218" d="M1093 378l-41 -358q-177 183 -299 443t-175 533h-8q-67 -352 -128 -519q-88 -241 -268 -463v323q309 285 418 991h21q106 -493 286 -740q72 -98 194 -210z" />
+<glyph unicode="&#x668;" horiz-adv-x="1218" d="M1093 378l-41 -358q-177 183 -299 443t-175 533h-8q-67 -352 -128 -519q-88 -241 -268 -463v323q309 285 418 991h21q106 -493 286 -740q72 -98 194 -210z" />
+<glyph unicode="&#x6f9;" horiz-adv-x="1218" d="M708 706q-122 -43 -212.5 -43t-160.5 42q-87 51 -87 155q0 69 34 173q103 315 333 315q168 0 195 -335q2 -96 8 -288q12 -236 61 -365q18 -48 77 -119l-69 -241q-112 68 -149 232q-30 132 -30 474zM548 1133q-57 0 -126 -46t-69 -100t72 -81q51 -19 101.5 -19t172.5 17 q0 229 -151 229z" />
+<glyph unicode="&#x669;" horiz-adv-x="1218" d="M708 706q-122 -43 -212.5 -43t-160.5 42q-87 51 -87 155q0 69 34 173q103 315 333 315q168 0 195 -335q2 -96 8 -288q12 -236 61 -365q18 -48 77 -119l-69 -241q-112 68 -149 232q-30 132 -30 474zM548 1133q-57 0 -126 -46t-69 -100t72 -81q51 -19 101.5 -19t172.5 17 q0 229 -151 229z" />
+<glyph unicode="&#x66d;" horiz-adv-x="1218" d="M986 1200q0 -73 -73.5 -73t-174.5 35q-20 8 -62 22q-3 -16 -14 -32l60 -28q171 -83 171 -153q0 -28 -22 -50t-50 -22q-70 0 -153 171q-8 21 -28 60q-16 -11 -32 -14l32 -92q25 -71 25 -144.5t-73 -73.5t-73 73.5t35 174.5q8 20 22 62q-16 3 -32 14l-28 -60 q-83 -171 -153 -171q-28 0 -50 22t-22 50q0 70 171 153q21 8 60 28q-11 16 -14 32l-92 -32q-71 -25 -144.5 -25t-73.5 73t73.5 73t174.5 -35q20 -8 62 -22q3 17 13 32q-20 9 -59 28q-171 83 -171 153q0 28 22 50t50 22q70 0 153 -171q8 -20 28 -59q15 10 32 13l-32 92 q-25 71 -25 144.5t73 73.5t73 -73.5t-35 -174.5q-8 -20 -22 -62q18 -3 33 -13l27 59q83 171 153 171q28 0 50 -22t22 -50q0 -70 -171 -153q-20 -8 -59 -27q10 -15 13 -33l92 32q71 25 144.5 25t73.5 -73zM637 1200q0 45 -45 45t-45 -45t45 -45t45 45z" />
+<glyph unicode="&#x6f4;" horiz-adv-x="1218" d="M709 737q-113 0 -190 56q45 -103 58.5 -174t13.5 -208t-58 -402h-40q0 620 -314 1048l85 271q44 -83 143 -237q44 -56 122 -102q30 348 227 348q123 0 231 -132l-9 -14q-126 32 -151 32q-204 0 -266 -250q111 -35 192.5 -35t145 34t129.5 114l26 -9q-65 -340 -345 -340z " />
+<glyph unicode="&#x6f5;" horiz-adv-x="1218" d="M1022 460q0 -134 -71 -252q-83 -137 -208 -137q-66 0 -117 42q-90 -76 -201.5 -76t-182 61t-70.5 168q0 155 147 379q82 124 258 329l-90 87l74 248q461 -459 461 -849zM953 385q0 164 -349 555q-96 -101 -184 -254.5t-88 -263.5q0 -156 145 -156q89 0 191 79 q59 -62 157 -62q50 0 89 27t39 75z" />
+<glyph unicode="&#x6f6;" horiz-adv-x="1218" d="M389 9q0 404 172 686q-331 0 -331 141q0 110 158 302.5t268.5 192.5t272.5 -205l-11 -12q-137 47 -233 47t-181 -25q-122 -35 -122 -108q0 -129 230 -129q172 0 396 102l-51 -216q-110 -38 -217 -138q-260 -243 -304 -638h-47z" />
+<glyph unicode="&#x2000;" horiz-adv-x="1024" />
+<glyph unicode="&#x2001;" d="M0 1606zM2048 1606z" />
+<glyph unicode="&#x2002;" horiz-adv-x="1024" />
+<glyph unicode="&#x2003;" d="M0 1606zM2048 1606z" />
+<glyph unicode="&#x2004;" horiz-adv-x="683" />
+<glyph unicode="&#x2005;" horiz-adv-x="512" />
+<glyph unicode="&#x2006;" horiz-adv-x="341" />
+<glyph unicode="&#x2007;" horiz-adv-x="1043" />
+<glyph unicode="&#x2008;" horiz-adv-x="256" />
+<glyph unicode="&#x2009;" horiz-adv-x="410" />
+<glyph unicode="&#x200a;" horiz-adv-x="128" />
+<glyph unicode="&#xfe00;" horiz-adv-x="0" />
+<glyph unicode="&#x200b;" horiz-adv-x="0" />
+<glyph unicode="&#x200c;" horiz-adv-x="0" />
+<glyph unicode="&#x200d;" horiz-adv-x="0" />
+<glyph unicode="&#x200e;" horiz-adv-x="0" />
+<glyph unicode="&#x200f;" horiz-adv-x="0" />
+<glyph unicode="&#x2010;" horiz-adv-x="512" d="M417 582q0 -41 -37 -41h-246q-39 0 -39 41t39 41h246q37 0 37 -41z" />
+<glyph unicode="&#x2011;" horiz-adv-x="512" />
+<glyph unicode="&#x2012;" horiz-adv-x="1043" d="M948 582q0 -41 -37 -41h-777q-39 0 -39 41t39 41h777q37 0 37 -41z" />
+<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M929 582q0 -41 -37 -41h-758q-39 0 -39 41t39 41h758q37 0 37 -41z" />
+<glyph unicode="&#x2014;" d="M1953 582q0 -41 -37 -41h-1782q-39 0 -39 41t39 41h1782q37 0 37 -41z" />
+<glyph unicode="&#x2015;" d="M1858 582q0 -41 -37 -41h-1782q-39 0 -39 41t39 41h1782q37 0 37 -41z" />
+<glyph unicode="&#x2016;" horiz-adv-x="790" d="M246 -311q0 -41 -41 -41t-41 41v1788q0 39 41 39t41 -39v-1788zM626 -311q0 -41 -41 -41t-41 41v1788q0 39 41 39t41 -39v-1788z" />
+<glyph unicode="&#x2017;" horiz-adv-x="1024" d="M1024 -359q0 -41 -37 -41h-948q-39 0 -39 41t39 41h948q37 0 37 -41zM1024 -139q0 -41 -37 -41h-948q-39 0 -39 41t39 41h948q37 0 37 -41z" />
+<glyph unicode="&#x2018;" horiz-adv-x="536" d="M341.5 935q28.5 -29 28.5 -73.5t-29 -73t-73 -28.5q-68 0 -103 71q-26 55 -26 132q0 205 141 345q29 28 41 28q18 0 18 -21q0 -9 -22 -32q-135 -135 -135 -332q0 -15 4 -24q1 2 5 6q32 31 77 31t73.5 -29z" />
+<glyph unicode="&#x2019;" horiz-adv-x="536" d="M397 1136q0 -206 -141 -346q-29 -28 -41 -28q-18 0 -18 21q0 9 22 32q136 136 136 332q0 15 -4 24q-1 -2 -5 -6q-33 -31 -77.5 -31t-73.5 29t-29 73.5t29 73t73 28.5q69 0 103 -71q26 -55 26 -131z" />
+<glyph unicode="&#x201a;" horiz-adv-x="482" d="M231 204q123 0 123 -203.5t-137 -343.5q-28 -29 -39 -29q-19 0 -19 21q0 8 13 22q140 151 140 331q0 22 -5 29q-27 -31 -74 -31t-76 28.5t-29 73t29.5 73.5t73.5 29z" />
+<glyph unicode="&#x201b;" horiz-adv-x="536" d="M295 1134q-46 0 -83 37q-4 -9 -4 -24q0 -196 136 -332q23 -23 23 -32q0 -21 -19 -21q-11 0 -40 28q-142 140 -142 346q0 76 27 131q34 71 102 71q44 0 73 -28.5t29 -73t-28.5 -73.5t-73.5 -29z" />
+<glyph unicode="&#x201c;" horiz-adv-x="964" d="M714 927q37 37 82 37t74 -29t29 -73.5t-29.5 -73t-73.5 -28.5q-68 0 -102 71q-26 55 -26 132q0 201 142 345q28 28 38 28q20 0 20 -21q0 -8 -23 -32q-135 -135 -135 -332q0 -15 4 -24zM496 935q29 -29 29 -73.5t-29 -73t-73 -28.5q-69 0 -103 71q-27 55 -27 132 q0 203 143 345q28 28 39 28q19 0 19 -21q0 -9 -23 -32q-136 -136 -136 -332q0 -15 4 -24q1 0 7 6q35 31 78 31t72 -29z" />
+<glyph unicode="&#x201d;" horiz-adv-x="964" d="M671 1136q0 -204 -142 -346q-29 -28 -39 -28q-19 0 -19 21q0 9 23 32q135 136 135 332q0 15 -4 24q-1 0 -7 -6q-34 -31 -77.5 -31t-72.5 29t-29 73.5t29.5 73t73.5 28.5q68 0 103 -71q26 -55 26 -131zM251 1171q-37 -37 -84 -37q-44 0 -72.5 29t-28.5 73.5t28.5 73 t72.5 28.5q68 0 103 -71q27 -55 27 -131q0 -202 -143 -346q-28 -28 -38 -28q-20 0 -20 21q0 8 24 32q135 135 135 332q0 15 -4 24z" />
+<glyph unicode="&#x201e;" horiz-adv-x="857" d="M231 204q123 0 123 -203.5t-137 -343.5q-28 -29 -39 -29q-19 0 -19 21q0 8 13 22q140 151 140 331q0 22 -5 29q-27 -31 -74 -31t-76 28.5t-29 73t29.5 73.5t73.5 29zM606 204q123 0 123 -203.5t-137 -343.5q-28 -29 -39 -29q-19 0 -19 21q0 8 13 22q139 151 139 331 q0 22 -5 29q-26 -31 -73 -31t-76.5 28.5t-29.5 73t29.5 73.5t74.5 29z" />
+<glyph unicode="&#x201f;" horiz-adv-x="964" d="M643 1163q-28 -29 -73.5 -29t-82.5 37q-4 -9 -4 -24q0 -197 134 -332q24 -24 24 -32q0 -21 -20 -21q-10 0 -38 28q-143 144 -143 346q0 76 27 131q35 71 103 71q44 0 72.5 -28.5t28.5 -73t-28 -73.5zM269 1309.5q29 -28.5 29 -73t-29 -73.5t-72 -29t-78 31q-2 2 -7 6 q-4 -9 -4 -24q0 -196 136 -332q22 -23 22 -32q0 -21 -18 -21q-11 0 -40 28q-142 142 -142 346q0 76 27 131q34 71 103 71q44 0 73 -28.5z" />
+<glyph unicode="&#x2020;" horiz-adv-x="857" d="M678 962q70 0 70 -65t-70 -65q-43 0 -120.5 21.5t-109.5 25.5q4 -47 25.5 -180.5t21.5 -206.5q0 -501 -39 -783q-5 -38 -27.5 -38t-27.5 38q-38 282 -38 783q0 73 21 206.5t25 180.5q-32 -4 -109 -25.5t-121 -21.5q-71 0 -71 65t71 65q43 0 120 -21.5t110 -25.5 q-2 67 -24 211t-22 222t66 78t66 -78t-22 -222t-25 -211q33 4 110 25.5t120 21.5z" />
+<glyph unicode="&#x2021;" horiz-adv-x="857" d="M748 986q0 -63 -71 -63q-43 0 -119.5 21.5t-110.5 24.5q3 -54 25 -169t22 -183.5t-65 -68.5t-65 68.5t22 183.5t24 169q-33 -3 -110 -24.5t-120 -21.5q-72 0 -72 63q0 66 72 66q44 0 121 -21.5t109 -24.5q-2 55 -24 169.5t-22 175.5q0 75 65 75t65 -75 q0 -61 -22.5 -175.5t-24.5 -169.5q33 3 110 24.5t120 21.5q71 0 71 -66zM748 108q0 -63 -71 -63q-43 0 -119.5 21.5t-110.5 24.5q3 -54 25 -169t22 -183t-65 -68t-65 68t22 183t24 169q-33 -3 -110 -24.5t-120 -21.5q-72 0 -72 63q0 66 72 66q44 0 121 -21.5t109 -24.5 q-2 55 -24 169.5t-22 175.5q0 75 65 75t65 -75q0 -61 -22.5 -175.5t-24.5 -169.5q33 3 110 24.5t120 21.5q71 0 71 -66z" />
+<glyph unicode="&#x2022;" horiz-adv-x="738" d="M698 582q0 -137 -96 -233t-233 -96t-233 96t-96 233t96 233t233 96t233 -96t96 -233z" />
+<glyph unicode="&#x2023;" horiz-adv-x="512" d="M464 582l-399 -248v496z" />
+<glyph unicode="&#x2024;" horiz-adv-x="682" d="M420.5 -25.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x2025;" horiz-adv-x="1365" d="M420.5 -25.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1103 -26.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x2026;" d="M1103 -26.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM420.5 -25.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1786 -26.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5z" />
+<glyph unicode="&#x2027;" horiz-adv-x="512" d="M367 494h-222v222h222v-222z" />
+<glyph unicode="&#x2028;" horiz-adv-x="0" />
+<glyph unicode="&#x2029;" horiz-adv-x="0" />
+<glyph unicode="&#x202a;" horiz-adv-x="0" />
+<glyph unicode="&#x202b;" horiz-adv-x="0" />
+<glyph unicode="&#x202c;" horiz-adv-x="0" />
+<glyph unicode="&#x202d;" horiz-adv-x="0" />
+<glyph unicode="&#x202e;" horiz-adv-x="0" />
+<glyph unicode="&#x202f;" horiz-adv-x="256" />
+<glyph unicode="&#x2030;" horiz-adv-x="2342" d="M1331 878q281 0 281 -456t-281 -456t-281 456t281 456zM1358 1470q0 -12 -17 -37l-1037 -1536q-21 -31 -41 -31q-41 0 -41 41q0 13 19 41l920 1364q-106 -70 -270 -70t-301 99q22 -86 22 -222q0 -453 -281 -453t-281 456t281 456q149 0 223 -142q165 -149 331 -149 q235 0 389 195q23 29 43 29q41 0 41 -41zM1493 351v141q0 150 -19 217q-35 130 -143.5 130t-143.5 -128q-18 -67 -18 -216v-145q0 -345 162 -345t162 346zM493 1051q0 205 1 205v-2q-5 132 -34 197l-84 81q-22 7 -46 7q-108 0 -143 -128q-18 -67 -18 -216v-145 q0 -345 162 -345t162 346zM2011 878q281 0 281 -456t-281 -456t-281 456t281 456zM2173 351v141q0 150 -19 217q-35 130 -143.5 130t-143.5 -128q-18 -67 -18 -216v-145q0 -345 162 -345t162 346z" />
+<glyph unicode="&#x2031;" horiz-adv-x="3022" d="M2011 878q281 0 281 -456t-281 -456t-281 456t281 456zM2173 351v141q0 150 -19 217q-35 130 -143.5 130t-143.5 -128q-18 -67 -18 -216v-145q0 -345 162 -345t162 346zM1331 878q281 0 281 -456t-281 -456t-281 456t281 456zM1358 1470q0 -12 -17 -37l-1037 -1536 q-21 -31 -41 -31q-41 0 -41 41q0 13 19 41l920 1364q-106 -70 -270 -70t-301 99q22 -86 22 -222q0 -453 -281 -453t-281 456t281 456q149 0 223 -142q165 -149 331 -149q235 0 389 195q23 29 43 29q41 0 41 -41zM1493 351v141q0 150 -19 217q-35 130 -143.5 130t-143.5 -128 q-18 -67 -18 -216v-145q0 -345 162 -345t162 346zM493 1051q0 205 1 205v-2q-5 132 -34 197l-84 81q-22 7 -46 7q-108 0 -143 -128q-18 -67 -18 -216v-145q0 -345 162 -345t162 346zM2691 878q281 0 281 -456t-281 -456t-281 456t281 456zM2853 351v141q0 150 -19 217 q-35 130 -143.5 130t-143.5 -128q-18 -67 -18 -216v-145q0 -345 162 -345t162 346z" />
+<glyph unicode="&#x2032;" horiz-adv-x="506" d="M481 1458q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5z" />
+<glyph unicode="&#x2033;" horiz-adv-x="870" d="M481 1458q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5zM841 1458q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5z" />
+<glyph unicode="&#x2034;" horiz-adv-x="1230" d="M481 1458q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5zM841 1458q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5zM1201 1458q0 -16 -9 -32 l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5z" />
+<glyph unicode="&#x2035;" horiz-adv-x="506" d="M481 751q0 -17 -22 -17t-36 25l-385 667q-9 16 -9 32q0 37 36.5 58.5t76.5 21.5q76 0 94 -54l239 -707q6 -18 6 -26z" />
+<glyph unicode="&#x2036;" horiz-adv-x="870" d="M481 751q0 -17 -22 -17t-36 25l-385 667q-9 16 -9 32q0 37 36.5 58.5t76.5 21.5q76 0 94 -54l239 -707q6 -18 6 -26zM841 751q0 -17 -22 -17t-36 25l-385 667q-9 16 -9 32q0 37 36.5 58.5t76.5 21.5q76 0 94 -54l239 -707q6 -18 6 -26z" />
+<glyph unicode="&#x2037;" horiz-adv-x="1230" d="M481 751q0 -17 -22 -17t-36 25l-385 667q-9 16 -9 32q0 37 36.5 58.5t76.5 21.5q76 0 94 -54l239 -707q6 -18 6 -26zM841 751q0 -17 -22 -17t-36 25l-385 667q-9 16 -9 32q0 37 36.5 58.5t76.5 21.5q76 0 94 -54l239 -707q6 -18 6 -26zM1201 751q0 -17 -22 -17t-36 25 l-385 667q-9 16 -9 32q0 37 36.5 58.5t76.5 21.5q76 0 94 -54l239 -707q6 -18 6 -26z" />
+<glyph unicode="&#x2038;" horiz-adv-x="722" d="M697 -395h-138l-199 395l-197 -395h-138l336 673z" />
+<glyph unicode="&#x2039;" horiz-adv-x="717" d="M528 5q0 -27 -48 -27q-20 0 -36 37l-30 68q-79 165 -266 268q-29 14 -86 45q-15 10 -15 25t15 25l87 46q186 100 265 266l26 65q20 41 54 41t34 -27q0 -3 -3 -10q-123 -284 -344 -406q223 -124 344 -406q3 -7 3 -10z" />
+<glyph unicode="&#x203a;" horiz-adv-x="717" d="M670 421q0 -15 -15 -25l-87 -45q-188 -104 -266 -268l-26 -64q-20 -41 -46 -41q-41 0 -41 27q0 5 2 10q116 279 345 406q-227 125 -345 406q-2 4 -2 10q0 27 34 27t50 -36.5t29 -69.5q78 -165 265 -266q31 -14 88 -46q15 -10 15 -25z" />
+<glyph unicode="&#x203b;" horiz-adv-x="1591" d="M1321 100q0 -44 -43 -44q-15 0 -25 10l-458 458l-456 -456q-11 -11 -27 -11q-42 0 -42 42q0 16 11 27l457 456l-457 456q-11 11 -11 27q0 42 42 42q16 0 27 -11l456 -456l458 458q10 10 25 10q43 0 43 -44q0 -14 -10 -24l-458 -458l458 -458q10 -10 10 -24zM875 1109.5 q34 -33.5 34 -80t-33.5 -79.5t-80.5 -33t-80.5 33t-33.5 79.5t34 80t80 33.5t80 -33.5zM1356 582q0 -46 -33.5 -80t-80 -34t-79.5 33.5t-33 80.5t33 80.5t79.5 33.5t80 -34t33.5 -80zM460 582q0 -47 -33 -80.5t-79.5 -33.5t-80 34t-33.5 80t33.5 80t80 34t79.5 -33.5 t33 -80.5zM875.5 214q33.5 -33 33.5 -79.5t-34 -80t-80 -33.5t-80 33.5t-34 80t33.5 79.5t80.5 33t80.5 -33z" />
+<glyph unicode="&#x203c;" horiz-adv-x="1142" d="M418 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM341 383q-25 0 -29 47l-79 932v10q0 40 30 66q34 28 78 28t78 -28q30 -26 30 -66v-10l-79 -934q-4 -45 -29 -45zM878 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5 t77 32t77 -32zM801 383q-25 0 -29 47l-79 932v10q0 40 30 66q34 28 78 28t78 -28q30 -26 30 -66v-10l-79 -934q-4 -45 -29 -45z" />
+<glyph unicode="&#x203d;" horiz-adv-x="909" d="M822 1167q0 -124 -98 -200q-239 -185 -252 -347l-16 -192q-4 -45 -29 -45t-29 47l-67 792q-1 7 -1 15q0 40 28.5 64.5t68.5 24.5t68.5 -24.5t28.5 -64.5q0 -9 -1 -15l-30 -361q37 66 90 124q69 75 69 193.5t-51 169.5t-172 51q-187 0 -268 -139h2q112 0 112 -93 q0 -94 -94 -94t-94 98q0 126 115 204q101 69 245.5 69t247.5 -59q127 -73 127 -218zM536 109q0 -44 -32.5 -76.5t-76.5 -32.5t-76.5 32.5t-32.5 76.5t32.5 76t76.5 32t76.5 -32t32.5 -76z" />
+<glyph unicode="&#x203e;" horiz-adv-x="1478" d="M1478 1550h-1478v56h1478v-56z" />
+<glyph unicode="&#x203f;" horiz-adv-x="896" d="M985 -224q-192 -218 -446.5 -218t-359.5 218h42q97 -134 333.5 -134t389.5 134h41z" />
+<glyph unicode="&#x2040;" horiz-adv-x="896" d="M943 1125q-96 135 -333 135t-389 -135h-42q192 218 446.5 218t359.5 -218h-42z" />
+<glyph unicode="&#x2041;" horiz-adv-x="952" d="M903 1086l-473 -946l267 -535h-138l-199 395l-197 -395h-138l740 1481h138z" />
+<glyph unicode="&#x2042;" horiz-adv-x="1876" d="M1305 931l-45 -85l-297 197l25 -352h-99l25 352l-293 -197l-49 85l317 155l-317 154l49 86l293 -198l-25 352h98l-24 -352l293 198l49 -86l-317 -154zM1704 240l-50 -85l-292 197l24 -352h-98l24 352l-292 -197l-49 85l317 155l-317 154l49 86l292 -197l-24 352h98 l-24 -353l292 198l50 -85l-318 -155zM906 240l-49 -85l-293 197l25 -352h-99l25 352l-293 -197l-49 85l317 155l-317 154l49 86l293 -197l-25 352h99l-25 -353l293 198l49 -85l-317 -155z" />
+<glyph unicode="&#x2043;" horiz-adv-x="666" d="M555 494h-444v222h444v-222z" />
+<glyph unicode="&#x2044;" horiz-adv-x="0" d="M576 1416q0 -13 -6 -22l-1071 -1649q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1649q11 17 35 17q40 0 40 -40z" />
+<glyph unicode="&#x2045;" horiz-adv-x="682" d="M571 -309q0 -41 -68 -41h-391v1864h391q68 0 68 -40.5t-68 -40.5h-309v-810h340q37 0 37 -41t-37 -41h-340v-809h309q68 0 68 -41z" />
+<glyph unicode="&#x2046;" horiz-adv-x="682" d="M570 -350h-391q-68 0 -68 41t68 41h309v809h-340q-37 0 -37 41t37 41h340v810h-309q-68 0 -68 40.5t68 40.5h391v-1864z" />
+<glyph unicode="&#x2047;" horiz-adv-x="1709" d="M1304 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM1543 1350q79 -73 79 -191.5t-98 -191.5q-270 -200 -270 -457v-72q0 -55 -26 -55t-26 49v92q0 267 181 461q69 74 69 182t-28 152q-49 80 -195 80q-187 0 -268 -139q114 0 114 -93.5 t-94 -93.5t-94 102.5t95.5 185.5t252.5 83q207 0 308 -94zM504 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM743 1350q79 -73 79 -191.5t-98 -191.5q-270 -200 -270 -457v-72q0 -55 -26 -55t-26 49v92q0 267 181 461q69 74 69 182 t-28 152q-49 80 -195 80q-187 0 -268 -139q114 0 114 -93.5t-94 -93.5t-94 102.5t95.5 185.5t252.5 83q207 0 308 -94z" />
+<glyph unicode="&#x2048;" horiz-adv-x="1552" d="M504 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM743 1350q79 -73 79 -191.5t-98 -191.5q-270 -200 -270 -457v-72q0 -55 -26 -55t-26 49v92q0 267 181 461q69 74 69 182t-28 152q-49 80 -195 80q-187 0 -268 -139q114 0 114 -93.5 t-94 -93.5t-94 102.5t95.5 185.5t252.5 83q207 0 308 -94zM1288 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM1211 383q-25 0 -29 47l-79 932v10q0 40 30 66q34 28 78 28t78 -28q30 -26 30 -66v-10l-79 -934q-4 -45 -29 -45z" />
+<glyph unicode="&#x2049;" horiz-adv-x="1607" d="M1202 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM1441 1350q79 -73 79 -191.5t-98 -191.5q-270 -200 -270 -457v-72q0 -55 -26 -55t-26 49v92q0 267 181 461q69 74 69 182t-28 152q-49 80 -195 80q-187 0 -268 -139q114 0 114 -93.5 t-94 -93.5t-94 102.5t95.5 185.5t252.5 83q207 0 308 -94zM418 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM341 383q-25 0 -29 47l-79 932v10q0 40 30 66q34 28 78 28t78 -28q30 -26 30 -66v-10l-79 -934q-4 -45 -29 -45z" />
+<glyph unicode="&#x204a;" horiz-adv-x="1024" d="M354 515q-119 0 -288 64q22 38 69.5 73t87.5 35q10 0 22 -4q184 -62 259 -62q157 0 273 192l181 104l-434 -1024q-9 -22 -47 -46t-65 -28l311 846q-189 -150 -369 -150z" />
+<glyph unicode="&#x204b;" horiz-adv-x="964" d="M927 933q0 -358 -447 -358h-5v-982h-69v1642h-177v-1642h-68v1642h-125v51h467q184 0 297 -83q127 -93 127 -270z" />
+<glyph unicode="&#x204c;" horiz-adv-x="1455" d="M1233 0h-419q-248 0 -420 172t-172 420t172 420t420 172h419v-1184zM1164 99v987h-350v-987h350z" />
+<glyph unicode="&#x204d;" horiz-adv-x="1455" d="M1233 592q0 -248 -172 -420t-420 -172h-419v1184h419q248 0 420 -172t172 -420zM641 99v987h-350v-987h350z" />
+<glyph unicode="&#x204e;" horiz-adv-x="987" d="M877 248l-303 -66q2 6 3 15q0 41 -29 67l284 125zM494 283q-25 0 -43 -11l-31 308h148l-31 -308q-18 11 -43 11zM777 -62l-120 -87l-157 267q51 6 70 51zM440 264q-29 -25 -29 -62q0 -10 2 -20l-303 66l46 141zM487 118l-156 -267l-120 87l206 231q20 -45 70 -51z" />
+<glyph unicode="&#x204f;" horiz-adv-x="569" d="M367 851q32 -32 32 -76.5t-32 -76.5t-77 -32t-76.5 31.5t-31.5 76.5t32 77t76.5 32t76.5 -32zM370 184.5q29 -32.5 29 -76t-28.5 -76t-76 -32.5t-73.5 23q0 -218 131 -369q14 -16 14 -27q0 -22 -20 -22q-31 0 -100.5 124t-69.5 277q0 211 114 211q51 0 80 -32.5z" />
+<glyph unicode="&#x2050;" horiz-adv-x="1476" d="M739 1028q-316 0 -481 -179h-57q201 290 538 290t536 -290h-55q-165 179 -481 179zM1275 425q-200 -291 -536.5 -291t-537.5 291h57q165 -178 480.5 -178t481.5 178h55z" />
+<glyph unicode="&#x2051;" horiz-adv-x="987" d="M877 248l-303 -66q2 6 3 15q0 41 -29 67l284 125zM494 283q-25 0 -43 -11l-31 308h148l-31 -308q-18 11 -43 11zM777 -62l-120 -87l-157 267q51 6 70 51zM440 264q-29 -25 -29 -62q0 -10 2 -20l-303 66l46 141zM487 118l-156 -267l-120 87l206 231q20 -45 70 -51z M877 1148l-303 -66q2 6 3 15q0 41 -29 67l284 125zM494 1183q-25 0 -43 -11l-31 308h148l-31 -308q-18 11 -43 11zM777 838l-120 -87l-157 267q51 6 70 51zM440 1164q-29 -25 -29 -62q0 -10 2 -20l-303 66l46 141zM487 1018l-156 -267l-120 87l206 231q20 -45 70 -51z" />
+<glyph unicode="&#x2052;" horiz-adv-x="1520" d="M1336 1416q0 -13 -6 -22l-1071 -1649q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1649q11 17 35 17q40 0 40 -40zM468 1295q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM1206 42q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5 t32 76.5t77 32t77 -32z" />
+<glyph unicode="&#x2053;" horiz-adv-x="1058" d="M1021 659q0 -111 -71.5 -195t-175.5 -84t-251.5 116.5t-233.5 116.5q-136 0 -179 -131q-6 -29 -15.5 -65t-27.5 -36q-30 0 -30 57q0 109 72.5 193.5t176 84.5t251 -117t233.5 -117q155 0 192 184q9 49 31 49q28 0 28 -56z" />
+<glyph unicode="&#x2054;" horiz-adv-x="896" d="M943 -442q-96 135 -333 135t-389 -135h-42q192 218 446.5 218t359.5 -218h-42z" />
+<glyph unicode="&#x2055;" horiz-adv-x="660" d="M607 468q0 -27 -18.5 -48t-37.5 -21t-51.5 27t-53.5 27q-32 0 -32 -34q0 -28 65 -37t65 -61q0 -26 -20 -44.5t-46 -18.5q-45 0 -53.5 67.5t-44.5 67.5q-41 0 -41 -39q0 -14 27 -48t27 -57q0 -51 -64.5 -51t-64.5 51q0 18 28 50t28 55q0 39 -39 39q-34 0 -43 -67.5 t-62 -67.5q-23 0 -43 21.5t-20 44.5q0 52 66 58.5t66 38.5t-32 32q-22 0 -53.5 -25.5t-46.5 -25.5q-60 0 -60 63t57 63q21 0 55.5 -25t48.5 -25q34 0 34 29q0 36 -69 44t-69 55q0 24 21 45t45 21q49 0 60 -65t43 -65q38 0 38 37q0 19 -26.5 51t-26.5 51.5t21.5 36.5t46.5 17 t44.5 -18t19.5 -40.5t-27 -53t-27 -47.5q0 -39 43 -39q29 0 37.5 66t61.5 66q60 0 60 -60q0 -54 -65 -59.5t-65 -36.5q0 -37 31 -37q19 0 51 27.5t55 27.5q56 0 56 -63zM283 465q0 -45 47 -45t47 46.5t-44 46.5q-50 0 -50 -48z" />
+<glyph unicode="&#x2056;" horiz-adv-x="1052" d="M961 1079.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM961 191.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM249 635.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5z" />
+<glyph unicode="&#x2057;" horiz-adv-x="1590" d="M1201 1458q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5zM1561 1458q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5zM481 1458q0 -16 -9 -32 l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5zM841 1458q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5z" />
+<glyph unicode="&#x2058;" horiz-adv-x="1364" d="M1273 635.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM761 1079.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM761 191.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5zM249 635.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x2059;" horiz-adv-x="1364" d="M1273 1079.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM1273 191.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM761 635.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5zM249 1079.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM249 191.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x205a;" horiz-adv-x="340" d="M249 1356.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM249 148.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x205b;" horiz-adv-x="1564" d="M861 1572.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM1473 660.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM249 660.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5zM861 -250.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x205c;" horiz-adv-x="1364" d="M1118 992.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM1118 279.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM1307 557q0 -41 -37 -41h-547v-545q0 -39 -41 -39t-41 39v545h-545 q-39 0 -39 41t39 41h545v547q0 37 41 37t41 -37v-547h547q37 0 37 -41zM404 992.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM404 279.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x205d;" horiz-adv-x="340" d="M249 1356.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM249 148.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM249 752.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5z" />
+<glyph unicode="&#x205e;" horiz-adv-x="340" d="M249 1572.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM249 964.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM249 357.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5zM249 -250.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x205f;" horiz-adv-x="455" />
+<glyph unicode="&#x2060;" horiz-adv-x="0" />
+<glyph unicode="&#x2061;" horiz-adv-x="0" />
+<glyph unicode="&#x2062;" horiz-adv-x="0" />
+<glyph unicode="&#x2063;" horiz-adv-x="0" />
+<glyph unicode="&#x2064;" horiz-adv-x="0" />
+<glyph unicode="&#x2065;" horiz-adv-x="0" />
+<glyph unicode="&#x2066;" horiz-adv-x="0" />
+<glyph unicode="&#x2067;" horiz-adv-x="0" />
+<glyph unicode="&#x2068;" horiz-adv-x="0" />
+<glyph unicode="&#x2069;" horiz-adv-x="0" />
+<glyph unicode="&#x206a;" horiz-adv-x="0" />
+<glyph unicode="&#x206b;" horiz-adv-x="0" />
+<glyph unicode="&#x206c;" horiz-adv-x="0" />
+<glyph unicode="&#x206d;" horiz-adv-x="0" />
+<glyph unicode="&#x206e;" horiz-adv-x="0" />
+<glyph unicode="&#x206f;" horiz-adv-x="0" />
+<glyph unicode="&#x2070;" horiz-adv-x="801" d="M676 1362q63 -111 63 -325.5t-59 -321.5q-91 -166 -273.5 -166t-273.5 144q-71 112 -71 331t58 328q91 170 278 170t278 -160zM590 964v173q0 335 -190 335t-190 -336q0 -27 0.5 -80.5t0.5 -80.5q0 -158 25 -238q42 -138 164 -138q190 0 190 365z" />
+<glyph unicode="&#x2071;" horiz-adv-x="441" d="M297 1437q0 -39 -28 -67t-67 -28t-67.5 28t-28.5 67t28.5 67t67.5 28t67 -28t28 -67zM242 583h-40q-17 0 -162 -4v64l43 -1q44 0 57 5q24 10 24 46v387q0 54 -35 65q-9 2 -83 2v65l243 17v-544q0 -35 43 -42q5 0 22.5 -0.5t47.5 0.5v-64q-152 4 -160 4z" />
+<glyph unicode="&#x2072;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2073;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2074;" horiz-adv-x="801" d="M757 808h-156v-120q0 -18 5 -27q10 -19 134 -19h13v-64q-78 5 -105 5h-236q-25 0 -103 -5v64q53 -1 79.5 -1t40.5 4q32 9 32 43v120h-416v56l481 653q15 21 40 21q35 0 35 -47v-620h156v-63zM470 871v476l-352 -476h352z" />
+<glyph unicode="&#x2075;" horiz-adv-x="801" d="M633.5 1089q88.5 -92 88.5 -225t-105.5 -224t-232 -91t-216 75.5t-89.5 187.5q0 84 86 84q36 0 62.5 -21.5t26.5 -58t-30 -58.5q-27 -18 -60 -18h-9q26 -60 86.5 -96.5t127.5 -36.5q103 0 159 86q35 54 35 178t-26 176q-42 84 -126.5 84t-152.5 -55l-67 -56q-32 0 -32 38 v430q0 33 25 33q9 0 22 -4q128 -40 197.5 -40t223.5 43q7 2 9 2q25 0 25 -26q0 -14 -30 -44q-109 -110 -281 -110q-60 0 -122 15v-235q80 59 198.5 59t207 -92z" />
+<glyph unicode="&#x2076;" horiz-adv-x="801" d="M641 1099q94 -92 94 -228t-97 -229t-235 -93q-180 0 -267 158q-69 125 -69 321q0 143 63 264.5t182 184.5q85 45 172.5 45t150 -39.5t62.5 -118t-82 -78.5t-82 74q0 65 73 71q-42 37 -107.5 37t-118.5 -30q-146 -82 -152 -354q67 107 193 107t220 -92zM575 836v69 q0 234 -163 234q-89 0 -135.5 -71.5t-46.5 -165.5q0 -136 27 -196q45 -99 146 -99q172 0 172 229z" />
+<glyph unicode="&#x2077;" horiz-adv-x="801" d="M746 1472q0 -26 -16 -46l-212 -262q-74 -91 -97 -253q-14 -92 -14 -276q0 -86 -82 -86t-82 86q0 256 194 527q1 2 161 203h-373q-65 0 -77.5 -7t-34.5 -128h-60l56 306h56q2 -17 9 -24q21 -20 182 -20h390v-20z" />
+<glyph unicode="&#x2078;" horiz-adv-x="801" d="M735 821q0 -123 -104 -197.5t-229.5 -74.5t-230 66t-104.5 183q0 157 213 257q-171 93 -171 226q0 108 90.5 174.5t200.5 66.5t195 -53q99 -61 99 -163q0 -129 -178 -216q219 -115 219 -269zM605 1306q0 73 -64 117.5t-137.5 44.5t-140 -34.5t-66.5 -93.5t75 -108 q31 -20 187 -109q146 77 146 183zM165 798q0 -86 73.5 -138.5t160 -52.5t163 44.5t76.5 120t-114 144.5q-49 30 -187 104q-172 -86 -172 -222z" />
+<glyph unicode="&#x2079;" horiz-adv-x="801" d="M735 1046q0 -115 -39.5 -225t-138.5 -191t-224 -81q-90 0 -151 34q-76 42 -76 125q0 77 81 77q34 0 58.5 -20.5t24.5 -53.5q0 -60 -66 -72q47 -32 114 -32t119 30q132 77 137 352q-67 -108 -193.5 -108t-220 92.5t-93.5 229.5t99 228t240 91q178 0 262 -158 q67 -125 67 -318zM391 934q90 0 135.5 72t45.5 185t-25 173q-44 104 -142 104t-147 -82q-30 -50 -30 -159v-71q0 -222 163 -222z" />
+<glyph unicode="&#x207a;" horiz-adv-x="1212" d="M1085 976q0 -37 -38 -37h-404v-402q0 -40 -37 -40t-37 40v402h-402q-40 0 -40 37t40 37h402v404q0 38 37 38t37 -38v-404h404q38 0 38 -37z" />
+<glyph unicode="&#x207b;" horiz-adv-x="1212" d="M1085 976q0 -37 -38 -37h-880q-40 0 -40 37t40 37h880q38 0 38 -37z" />
+<glyph unicode="&#x207c;" horiz-adv-x="1212" d="M1047 1208q38 0 38 -37.5t-38 -37.5h-880q-40 0 -40 37.5t40 37.5h880zM1047 819q38 0 38 -37.5t-38 -37.5h-880q-40 0 -40 37.5t40 37.5h880z" />
+<glyph unicode="&#x207d;" horiz-adv-x="531" d="M450 368q0 -22 -24 -22q-11 0 -41 22q-168 122 -242.5 263t-74.5 345t74.5 345t242.5 263q30 22 41 22q24 0 24 -22q0 -10 -21 -29q-222 -196 -222 -579t222 -579q21 -19 21 -29z" />
+<glyph unicode="&#x207e;" horiz-adv-x="531" d="M463 976q0 -204 -74.5 -345t-242.5 -263q-30 -22 -41 -22q-24 0 -24 22q0 10 21 29q222 196 222 579t-222 579q-21 19 -21 29q0 22 24 22q11 0 41 -22q168 -122 242.5 -263t74.5 -345z" />
+<glyph unicode="&#x207f;" horiz-adv-x="905" d="M866 579q-150 4 -188 4t-193 -4v64q32 -1 59.5 -1t46.5 7.5t19 41.5v345q0 141 -108 141q-89 0 -148 -64.5t-59 -153.5v-266q0 -45 52 -50q13 -1 31 -1t41 1v-64q-150 4 -187 4t-192 -4v64q32 -1 61 -1t46 8t17 47v381q0 56 -38 67q-8 2 -53 2h-33v65l245 17v-123 q80 122 227 122q229 0 229 -220v-333q0 -33 90 -33q16 0 35 1v-64z" />
+<glyph unicode="&#x2080;" horiz-adv-x="801" d="M676 514q63 -111 63 -325.5t-59 -321.5q-91 -166 -273.5 -166t-273.5 144q-71 112 -71 331t58 328q91 170 278 170t278 -160zM590 116v173q0 335 -190 335t-190 -336q0 -27 0.5 -80.5t0.5 -80.5q0 -158 25 -238q42 -138 164 -138q190 0 190 365z" />
+<glyph unicode="&#x2081;" horiz-adv-x="801" d="M142 -206l84 -2q93 0 106 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -105 5h-316q-38 0 -105 -5v64z" />
+<glyph unicode="&#x2082;" horiz-adv-x="801" d="M79 -269v22q0 26 21 47l300 296q160 158 160 299q0 93 -53.5 154.5t-145.5 61.5q-136 0 -195 -119q98 -2 98 -83q0 -36 -27 -59.5t-64 -23.5q-94 0 -94 87q0 113 93.5 187t219.5 74t228 -74t102 -205q0 -82 -60 -158q-33 -42 -125 -121l-300 -259h300q82 0 95 9.5 t33 125.5h59l-46 -261h-599z" />
+<glyph unicode="&#x2083;" horiz-adv-x="801" d="M735 -22q0 -124 -106.5 -200.5t-229.5 -76.5t-218 54q-114 64 -114 173q0 90 97 90q40 0 69 -24t29 -63q0 -82 -93 -87q74 -85 219 -85q86 0 126 64t40 155q0 220 -176 220q-72 0 -72 -1h3q-47 3 -47 27t91 29.5t133.5 67.5t42.5 153q0 146 -140 146q-122 0 -187 -67 q86 -7 86 -79q0 -80 -89.5 -80t-89.5 81q0 96 100 152q83 47 188 47t192 -47q105 -57 105 -154q0 -81 -55.5 -145.5t-137.5 -96.5q97 -26 165.5 -93t68.5 -160z" />
+<glyph unicode="&#x2084;" horiz-adv-x="801" d="M757 -40h-156v-120q0 -18 5 -27q10 -19 134 -19h13v-64q-78 5 -105 5h-236q-25 0 -103 -5v64q53 -1 79.5 -1t40.5 4q32 9 32 43v120h-416v56l481 653q15 21 40 21q35 0 35 -47v-620h156v-63zM470 23v476l-352 -476h352z" />
+<glyph unicode="&#x2085;" horiz-adv-x="801" d="M633.5 241q88.5 -92 88.5 -225t-105.5 -224t-232 -91t-216 75.5t-89.5 187.5q0 84 86 84q36 0 62.5 -21.5t26.5 -58t-30 -58.5q-27 -18 -60 -18h-9q26 -60 86.5 -96.5t127.5 -36.5q103 0 159 86q35 54 35 178t-26 176q-42 84 -126.5 84t-152.5 -55l-67 -56q-32 0 -32 38 v430q0 33 25 33q9 0 22 -4q128 -40 197.5 -40t223.5 43q7 2 9 2q25 0 25 -26q0 -14 -30 -44q-109 -110 -281 -110q-60 0 -122 15v-235q80 59 198.5 59t207 -92z" />
+<glyph unicode="&#x2086;" horiz-adv-x="801" d="M641 251q94 -92 94 -228t-97 -229t-235 -93q-180 0 -267 158q-69 125 -69 321q0 143 63 264.5t182 184.5q85 45 172.5 45t150 -39.5t62.5 -118t-82 -78.5t-82 74q0 65 73 71q-42 37 -107.5 37t-118.5 -30q-146 -82 -152 -354q67 107 193 107t220 -92zM575 -12v69 q0 234 -163 234q-89 0 -135.5 -71.5t-46.5 -165.5q0 -136 27 -196q45 -99 146 -99q172 0 172 229z" />
+<glyph unicode="&#x2087;" horiz-adv-x="801" d="M746 624q0 -26 -16 -46l-212 -262q-74 -91 -97 -253q-14 -92 -14 -276q0 -86 -82 -86t-82 86q0 256 194 527q1 2 161 203h-373q-65 0 -77.5 -7t-34.5 -128h-60l56 306h56q2 -17 9 -24q21 -20 182 -20h390v-20z" />
+<glyph unicode="&#x2088;" horiz-adv-x="801" d="M735 -27q0 -123 -104 -197.5t-229.5 -74.5t-230 66t-104.5 183q0 157 213 257q-171 93 -171 226q0 108 90.5 174.5t200.5 66.5t195 -53q99 -61 99 -163q0 -129 -178 -216q219 -115 219 -269zM605 458q0 73 -64 117.5t-137.5 44.5t-140 -34.5t-66.5 -93.5t75 -108 q31 -20 187 -109q146 77 146 183zM165 -50q0 -86 73.5 -138.5t160 -52.5t163 44.5t76.5 120t-114 144.5q-49 30 -187 104q-172 -86 -172 -222z" />
+<glyph unicode="&#x2089;" horiz-adv-x="801" d="M735 198q0 -115 -39.5 -225t-138.5 -191t-224 -81q-90 0 -151 34q-76 42 -76 125q0 77 81 77q34 0 58.5 -20.5t24.5 -53.5q0 -60 -66 -72q47 -32 114 -32t119 30q132 77 137 352q-67 -108 -193.5 -108t-220 92.5t-93.5 229.5t99 228t240 91q178 0 262 -158 q67 -125 67 -318zM391 86q90 0 135.5 72t45.5 185t-25 173q-44 104 -142 104t-147 -82q-30 -50 -30 -159v-71q0 -222 163 -222z" />
+<glyph unicode="&#x208a;" horiz-adv-x="1212" d="M1085 128q0 -37 -38 -37h-404v-402q0 -40 -37 -40t-37 40v402h-402q-40 0 -40 37t40 37h402v404q0 38 37 38t37 -38v-404h404q38 0 38 -37z" />
+<glyph unicode="&#x208b;" horiz-adv-x="1212" d="M1085 128q0 -37 -38 -37h-880q-40 0 -40 37t40 37h880q38 0 38 -37z" />
+<glyph unicode="&#x208c;" horiz-adv-x="1212" d="M1047 360q38 0 38 -37.5t-38 -37.5h-880q-40 0 -40 37.5t40 37.5h880zM1047 -29q38 0 38 -37.5t-38 -37.5h-880q-40 0 -40 37.5t40 37.5h880z" />
+<glyph unicode="&#x208d;" horiz-adv-x="531" d="M450 -420q0 -22 -24 -22q-11 0 -41 22q-168 122 -242.5 263t-74.5 345t74.5 345t242.5 263q30 22 41 22q24 0 24 -22q0 -10 -21 -29q-222 -196 -222 -579t222 -579q21 -19 21 -29z" />
+<glyph unicode="&#x208e;" horiz-adv-x="531" d="M463 188q0 -204 -74.5 -345t-242.5 -263q-30 -22 -41 -22q-24 0 -24 22q0 10 21 29q222 196 222 579t-222 579q-21 19 -21 29q0 22 24 22q11 0 41 -22q168 -122 242.5 -263t74.5 -345z" />
+<glyph unicode="&#x208f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2090;" horiz-adv-x="822" d="M783 -133q0 -62 -40 -103t-102 -41q-98 0 -129 97q-67 -105 -206 -105q-96 0 -170 34q-96 44 -96 128q0 125 165 194q99 41 289 51v43q0 73 -44 122.5t-127 49.5t-139 -47q70 -13 70 -74q0 -34 -25.5 -54.5t-59.5 -20.5q-84 0 -84 76q0 83 81.5 127.5t171.5 44.5 q142 0 227 -82q60 -58 60 -174v-284q0 -62 49 -62q48 0 48 130q0 18 -1 40h62v-90zM494 -60v132q-116 -5 -198 -43q-113 -52 -113 -150q0 -50 40.5 -81t104 -31t115 49t51.5 124z" />
+<glyph unicode="&#x2091;" horiz-adv-x="719" d="M680 -90q0 -23 -28 -65q-86 -130 -240 -130t-263 97.5t-109 239.5t101.5 239.5t237.5 97.5t218.5 -79t82.5 -211q0 -40 -44 -40h-444q0 -129 47 -196q64 -92 173 -92q82 0 124 34t87 114q10 18 27 18q30 0 30 -27zM383 337q-27 0 -63 -15q-114 -48 -125 -213h359 q-2 92 -40 153q-46 75 -131 75z" />
+<glyph unicode="&#x2092;" horiz-adv-x="810" d="M771 46.5q0 -143.5 -111 -237.5t-255.5 -94t-254.5 94.5t-110 238t110 242.5t255.5 99t255.5 -99.5t110 -243zM583 -129q34 60 34 189t-41 189q-60 88 -174.5 88t-172.5 -91q-37 -58 -37 -190t40 -194q59 -91 176.5 -91t174.5 100z" />
+<glyph unicode="&#x2093;" horiz-adv-x="906" d="M867 -270q-86 5 -150 5t-197 -4v64q58 2 58 26q0 5 -147 174q-133 -134 -133 -165.5t47 -35.5v-63q-106 4 -168.5 4t-136.5 -5v65q116 0 204 77q8 7 148 168l-154 177q-54 62 -78.5 72t-112.5 10v66q92 -6 133.5 -6t212.5 6v-65q-56 -1 -56 -25q0 -13 128 -155 q115 127 115 146q0 32 -47 34v65q91 -6 154 -6t151 6v-65q-114 -2 -194 -69q-16 -14 -141 -156l209 -239q36 -41 150 -41h5v-65z" />
+<glyph unicode="&#x2094;" horiz-adv-x="719" d="M68 259q86 130 240 130t263 -97.5t109 -239.5t-101.5 -239.5t-238 -97.5t-218.5 79t-82 211q0 40 44 40h444q0 129 -47 196q-64 92 -173 92q-82 0 -124 -34t-87 -114q-10 -18 -27 -18q-30 0 -30 27q0 23 28 65zM337 -233q27 0 63 15q114 48 125 213h-359q2 -92 40 -153 q46 -75 131 -75z" />
+<glyph unicode="&#x2095;" horiz-adv-x="905" d="M866 -269q-150 4 -188 4t-193 -4v64q33 -1 60 -1t46 7.5t19 41.5v345q0 141 -108 141q-89 0 -148 -64.5t-59 -153.5v-266q0 -24 6 -34q10 -17 77 -17q19 0 41 1v-64q-150 4 -187 4t-192 -4v64q33 -1 61.5 -1t45.5 8t17 47v741q0 56 -38 66q-8 2 -52 2h-34v64l249 17v-471 q78 112 223 112q229 0 229 -219v-334q0 -33 90 -33q16 0 35 1v-64z" />
+<glyph unicode="&#x2096;" horiz-adv-x="873" d="M834 -270q-82 5 -144 5t-188 -4v64h12q45 0 45 23.5t-183 241.5l-90 -69v-142q0 -31 7 -40q11 -14 99 -14h19v-64q-91 4 -157 4t-214 -4v64q9 0 29.5 -0.5t31.5 -0.5q64 0 64 55v741q0 56 -39 66q-7 2 -52 2h-34v64l250 17v-673l210 161q31 24 31 48t-46 25v65 q98 -6 167 -6t145 7v-66q-105 -4 -217 -82t-116 -88q23 -16 92 -104l121 -159q36 -45 67 -58.5t90 -13.5v-65z" />
+<glyph unicode="&#x2097;" horiz-adv-x="454" d="M415 -269q-166 4 -195.5 4t-179.5 -4v64q8 0 29 -0.5t32 -0.5q63 0 63 55v741q0 56 -38 66q-8 2 -86 2v64l249 17v-890q0 -31 9 -40q13 -14 98 -14h19v-64z" />
+<glyph unicode="&#x2098;" horiz-adv-x="1350" d="M1311 -269q-149 4 -188.5 4t-192.5 -4v64q28 -1 58.5 -1t48.5 7.5t18 47.5v331q0 149 -108 149q-88 0 -147 -64.5t-59 -153.5v-267q0 -45 53 -49q12 -1 30 -1t42 1v-64q-149 4 -188 4t-193 -4v64q28 -1 58.5 -1t48.5 7.5t18 47.5v331q0 149 -108 149q-89 0 -148 -64.5 t-59 -153.5v-272q0 -20 6 -29q10 -16 80 -16q17 0 38 1v-64q-149 4 -187 4t-192 -4v64q28 -1 58.5 -1t42.5 5q23 11 23 50v381q0 56 -38 67q-9 2 -53 2h-33v65l245 17v-123q80 122 227 122q177 0 216 -123q78 123 230 123q229 0 229 -225v-28q-1 -19 -1 -28v-272 q0 -34 77 -34q12 0 48 2v-64z" />
+<glyph unicode="&#x2099;" horiz-adv-x="905" d="M866 -269q-150 4 -188 4t-193 -4v64q32 -1 59.5 -1t46.5 7.5t19 41.5v345q0 141 -108 141q-89 0 -148 -64.5t-59 -153.5v-266q0 -45 52 -50q13 -1 31 -1t41 1v-64q-150 4 -187 4t-192 -4v64q32 -1 61 -1t46 8t17 47v381q0 56 -38 67q-8 2 -53 2h-33v65l245 17v-123 q80 122 227 122q229 0 229 -220v-333q0 -33 90 -33q16 0 35 1v-64z" />
+<glyph unicode="&#x209a;" horiz-adv-x="889" d="M746 283q103 -97 103 -237.5t-110.5 -235.5t-244 -95t-199.5 76v-127q0 -20 6 -28q11 -15 75 -15q19 0 43 1v-64q-114 3 -190.5 3t-188.5 -3v64q40 -2 65.5 -2t37.5 6q22 10 22 49v564q0 50 -40 59q-9 2 -38 2q-19 0 -47 -1v65l250 17v-82q93 81 223 81t233 -97z M476 -233q100 0 160 88t60 191t-50 184q-58 95 -153 95q-127 0 -198 -108v-314q0 -54 61.5 -95t119.5 -41z" />
+<glyph unicode="&#x209b;" horiz-adv-x="623" d="M505 -233.5q-78 -51.5 -185 -51.5t-181 58q-53 -58 -73 -58q-26 0 -26 32v214q0 31 30 31q24 0 32 -30q27 -97 74 -146t140 -49q170 0 170 120q0 88 -159 119q-97 19 -112 23q-63 16 -103 46q-72 53 -72 129q0 97 89 146q71 39 167 39t159 -38q41 38 61 38q28 0 28 -32 v-169q0 -33 -32 -33q-23 0 -31 29q-4 24 -7 48q-22 110 -169 110q-169 0 -169 -98q0 -53 72 -80q31 -12 139.5 -30.5t164.5 -66.5q71 -60 71 -154.5t-78 -146z" />
+<glyph unicode="&#x209c;" horiz-adv-x="601" d="M561 -83q0 -83 -44 -142.5t-134 -59.5t-148.5 52.5t-58.5 149.5v382h-136v53q105 3 160 90q46 73 47 185h59v-262h229v-66h-229v-384q0 -144 98 -144t98 208v29h59v-91z" />
+<glyph unicode="&#x209d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x209e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x209f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20a0;" horiz-adv-x="1372" d="M396 -259v58q123 0 123 49v345q-194 22 -330.5 159t-136.5 338t158.5 343t369.5 142q148 0 275 -110l70 90q16 20 30 20q25 0 25 -31v-340q0 -25 -29 -25t-36 28q-9 40 -35 118q-39 86 -114 138.5t-161 52.5t-161 -33q-221 -97 -221 -407q0 -346 296 -420v303 q0 30 -26.5 38t-96.5 8v59h827l45 -315h-54q-19 153 -76 205t-212 52h-200q-37 0 -47.5 -6t-10.5 -39v-312h127q96 0 124.5 29.5t28.5 125.5h56v-369h-56q0 96 -28.5 125.5t-124.5 29.5h-127v-346q0 -33 10.5 -39t47.5 -6h208q172 0 237 69q54 57 85 233h54l-67 -360h-847z " />
+<glyph unicode="&#x20a1;" horiz-adv-x="1335" d="M1267 854q0 -26 -29 -26t-35 32q-12 60 -47 178q-89 223 -285 277v-1287q112 25 198.5 103.5t122.5 188.5q17 52 27 140q4 33 23 33q24 0 24 -35q0 -173 -113.5 -309t-281.5 -178v-79h-60v69q-29 -4 -62 -4t-68 4v-69h-60v78q-241 48 -397 248.5t-156 454t156.5 454.5 t396.5 250v69h60v-60q35 4 68.5 4t61.5 -3v59h60v-71q120 -31 244 -154l99 144q17 25 31 25q21 0 21 -33zM811 1326q-18 2 -50 2t-80 -10v-1290q49 -11 81 -11t49 1v1308zM270 672q0 -497 351 -626v1254q-27 -9 -53 -22q-298 -145 -298 -606z" />
+<glyph unicode="&#x20a2;" horiz-adv-x="1335" d="M1267 854q0 -26 -29 -26t-35 32q-12 60 -47 178q-51 127 -151 208.5t-217 81.5t-220 -50q-298 -145 -298 -613.5t322 -606.5q54 -23 106 -33v541q0 87 -45 109q-22 10 -106 10h-16v68l297 23v-235q76 235 262 235q60 0 109.5 -36.5t49.5 -85.5t-25.5 -76t-65 -27t-66 26 t-26.5 66q0 64 48 84q-6 2 -14 2q-136 0 -207 -140q-55 -111 -55 -262v-306q122 18 219 99.5t135 199.5q17 52 27 140q4 33 23 33q24 0 24 -35q0 -205 -154 -353t-360 -148q-288 0 -486 213t-198 502.5t198.5 503.5t485.5 214q193 0 363 -169l99 144q17 25 31 25 q21 0 21 -33z" />
+<glyph unicode="&#x20a3;" horiz-adv-x="1271" d="M779 1281h-252q-45 0 -64 -11.5t-19 -67.5v-421h140q132 0 171 48t39 183h48v-522h-48q0 136 -39 183.5t-171 47.5h-140v-344h379q23 0 23 -23v-16q0 -23 -23 -23h-379v-171q0 -27 7 -44q16 -39 209 -39h37v-61q-74 6 -135 6h-373q-49 0 -121 -6v61h75q64 0 88 10 q39 18 39 73v171h-136q-22 0 -22 23v16q0 23 22 23h136v823q0 25 -6 42q-14 39 -166 39h-30v62h1081l54 -442h-49q-24 217 -89 291q-77 89 -286 89z" />
+<glyph unicode="&#x20a4;" horiz-adv-x="1051" d="M958 310q18 0 18 -23t-22 -86q-78 -225 -264 -225q-85 0 -177 56q-32 19 -153 112q-81 -168 -182 -168q-50 0 -78.5 35t-28.5 93t44 99.5t110 41.5q35 0 94 -10q4 50 4 121t-13 238h-221v60h216q-7 83 -10 130h-206v60h203q-3 61 -3 113q0 171 97 299t263 128 q117 0 180 -64t63 -133q0 -27 -20.5 -50t-47.5 -23q-49 0 -61 61q-22 109 -24 112q-27 61 -114 61q-192 0 -192 -294q0 -53 16 -210h364v-60h-359q3 -44 3 -76v-54h356v-60h-357q-6 -197 -65 -374l167 -56q101 -30 172 -30q135 0 189 107l17 45q10 24 22 24zM213 203 q-105 0 -105 -99q0 -89 75 -89q88 0 126 154q-52 34 -96 34z" />
+<glyph unicode="&#x20a5;" horiz-adv-x="1775" d="M1485 6q-40 0 -244 -6v66q26 -1 70 -1t65 13q32 19 32 84v499q0 238 -157 238q-16 0 -32 -2l-257 -396v-346q0 -39 12 -60q18 -30 118 -30q17 0 37 1v-66q-198 6 -237.5 6t-244.5 -6v16l-228 -351q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l464 714v237q0 238 -158 238 q-130 0 -209.5 -104.5t-79.5 -238.5v-397q0 -47 11 -64q18 -30 114 -30q19 0 40 1v-66q-198 6 -236 6t-243 -6v66q26 -1 69.5 -1t70 16t26.5 81v574q0 87 -44 109q-21 10 -96 10h-26v68l301 23v-225q101 225 316 225q251 0 284 -210q58 130 181 183l286 440q11 17 35 17 q40 0 40 -40q0 -13 -6 -22l-239 -368h15q158 0 224.5 -81t66.5 -243v-42q-1 -27 -1 -41v-409q0 -65 132 -65q17 0 35 1v-66q-198 6 -238 6zM1081 835q-66 -57 -98 -150zM814 162v111l-135 -208h11h9q62 0 83 13q32 19 32 84z" />
+<glyph unicode="&#x20a6;" horiz-adv-x="1480" d="M1209 1139v-295h174v-60h-174v-130h174v-60h-174v-562q0 -32 -26 -32q-16 0 -34 26l-388 568h-436v-393q0 -140 200 -140h3v-61q-208 6 -230 6t-230 -6v61h3q199 0 199 140v393h-181v60h181v130h-181v60h181v389q0 29 -8 35q-19 13 -194 13v62h342q30 0 48 -26l323 -473 h373v301q0 139 -203 139v62q205 -6 231.5 -6t230.5 6v-62h-3q-201 0 -201 -145zM1154 654v130h-332l89 -130h243zM1154 594h-202l202 -296v296zM325 844h265l-246 360q-12 17 -19 25v-385zM325 784v-130h395l-89 130h-306z" />
+<glyph unicode="&#x20a7;" horiz-adv-x="2385" d="M2333 274q0 -146 -97 -222t-242 -76t-242 93q-77 -93 -97.5 -93t-20.5 33v57q-58 -90 -160 -90q-132 0 -203.5 78t-71.5 211v585q-51 -106 -172.5 -168.5t-247.5 -62.5h-335v-473q0 -32 7 -48q17 -37 181 -37h17v-61q-72 6 -133 6h-326q-50 0 -122 -6v61l55 -1 q122 0 140 38q7 15 7 48v1051q0 32 -7 48q-16 37 -158 37q-18 0 -37 -1v62h695q157 0 296 -84.5t164 -226.5q68 114 70 285h53v-394h305v-68h-305v-594q0 -231 144 -231t144 265v36q0 32 27 32q21 0 30 -35q37 -146 92 -214q73 -90 206 -90q103 0 172 48.5t69 146.5 q0 147 -223 195q-128 28 -148 33q-82 25 -134 67q-91 75 -91 183q0 134 108 204q92 59 221.5 59t212.5 -61q60 61 82 61t22 -33v-254q0 -35 -29 -35q-23 0 -31 43l-6 60q-16 87 -81.5 132.5t-158.5 45.5t-157 -34q-81 -43 -81 -129t94 -130q48 -22 169 -46q170 -33 243 -102 q91 -86 91 -204zM1024 977q0 161 -75.5 232.5t-237.5 71.5h-186q-53 0 -69.5 -13t-16.5 -66v-532h272q313 0 313 307z" />
+<glyph unicode="&#x20a8;" horiz-adv-x="1814" d="M1762 274q0 -146 -97 -222t-247 -76q-211 0 -315.5 92t-136.5 287q-23 141 -117 230q-70 67 -183 67h-227v-511q0 -29 7 -46q14 -34 171 -34h26v-61q-74 6 -143 6h-289q-69 0 -143 -6v61q6 0 24.5 -0.5t28.5 -0.5q125 0 142 35q7 15 7 46v1055q0 27 -6 45q-14 40 -167 40 h-29v62h618q183 0 333 -84q180 -100 180 -267q0 -43 -15 -84q89 52 213.5 52t207.5 -61q60 61 82 61t22 -33v-254q0 -35 -29 -35q-23 0 -31 43l-6 60q-16 87 -81.5 132.5t-158.5 45.5t-157 -34q-81 -43 -81 -129t94 -130q48 -22 169 -46q170 -33 243 -102q91 -86 91 -204z M997 992q0 196 -143 256q-84 35 -314 35q-51 0 -69 -7q-32 -14 -32 -57v-523h219q339 0 339 296zM1659 219q0 147 -223 195q-128 28 -148 33q-82 25 -134 67q-91 75 -91 183q0 39 10 73q-92 -68 -218 -99q163 -56 224 -182q23 -48 50 -189t72 -195q67 -81 217 -81 q103 0 172 48.5t69 146.5z" />
+<glyph unicode="&#x20a9;" horiz-adv-x="2087" d="M2019 1284q-152 0 -195 -132l-101 -308h190v-60h-209l-43 -130h252v-60h-271l-196 -598q-13 -39 -38.5 -39t-37.5 37l-196 600h-262l-193 -598q-13 -39 -39.5 -39t-38.5 37l-196 600h-306v60h286l-43 130h-243v60h224l-117 357q-6 19 -23 53q-23 30 -134 30h-21v62 q242 -6 344.5 -6t175.5 6v-62h-5q-161 0 -161 -58q0 -15 4 -27l116 -355h399l76 232l-35 127q-16 48 -52 64.5t-134 16.5v62q242 -6 344.5 -6t175.5 6v-62h-5q-160 0 -160 -58q0 -15 5 -30l115 -352h400l97 297q10 31 10 39q0 53 -63 81q-48 22 -109 23v62q155 -6 239 -6 t174 6v-62zM1652 784h-361l42 -130h277zM1092 844l-50 153l-49 -153h99zM1590 594h-237l119 -363zM1154 654l-42 130h-139l-42 -130h223zM922 784h-361l43 -130h276zM860 594h-236l118 -363z" />
+<glyph unicode="&#x20aa;" horiz-adv-x="1590" d="M1440 295q0 -123 -77 -209t-202 -86h-636v668h151v-563h443q96 0 133 48.5t37 148.5v754h151v-761zM1065 387h-151v366q0 101 -36.5 150t-133.5 49h-443v-952h-151v1056h636q152 0 215.5 -71t63.5 -225v-373z" />
+<glyph unicode="&#x20ab;" horiz-adv-x="1159" d="M1136 1168q0 -23 -23 -23h-173v-960q0 -88 46 -110q20 -10 85 -10q16 0 35 1v-66l-313 -24v142q-111 -142 -295 -142t-314.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q163 0 270 -133v332h-415q-22 0 -22 23v16q0 23 22 23h415v70q0 88 -47 109q-20 10 -85 10 q-16 0 -35 -1v67l308 23v-278h173q23 0 23 -23v-16zM1076 -242q0 -23 -23 -23h-889q-22 0 -22 23v16q0 23 22 23h889q23 0 23 -23v-16zM793 253v449q0 32 -24 68q-87 129 -236 129t-238 -138q-65 -100 -65 -300t61 -299q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="&#x20ac;" horiz-adv-x="1548" d="M1489 1246q0 -7 -6 -20l-93 -196q-11 -23 -27 -23q-32 0 -28 30q2 12 2 24q0 126 -164 213q-105 56 -218 56t-215 -55q-222 -120 -273 -412h842l-56 -117h-799q-1 -26 -1 -63.5t4 -84.5h725l-56 -117h-653q58 -284 270 -405q102 -58 209 -58t211.5 56t186.5 177 q8 12 19 12q24 0 24 -29v-124q-189 -153 -434 -153t-433 148t-250 376h-217l56 117h140q-4 35 -4 72.5t4 75.5h-196l56 117h162q63 229 250 378t426.5 149t424.5 -144q62 23 86.5 23t24.5 -23z" />
+<glyph unicode="&#x20ad;" horiz-adv-x="1519" d="M649 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-445h201l417 397q36 34 36 67q0 61 -91 63v62q69 -6 217.5 -6t201.5 6v-62q-160 -2 -281 -118l-356 -340l47 -69h387q23 0 23 -23v-16q0 -23 -23 -23h-345l367 -539q42 -62 83.5 -78.5t122.5 -16.5v-61q-127 6 -281.5 6 t-225.5 -6v61h4q113 0 113 59q0 22 -31 68l-343 507h-36l-207 -197v-359q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-347q-43 0 -114 -6v61q8 0 26.5 -0.5t28.5 -0.5q125 0 141 40q6 15 6 44v551h-136q-22 0 -22 23v16q0 23 22 23h136v453q0 27 -7 41q-16 33 -176 33 h-19v62q70 -6 119 -6h342q50 0 120 6v-62zM444 695v-129l136 129h-136z" />
+<glyph unicode="&#x20ae;" horiz-adv-x="1413" d="M878 1282q-46 0 -65.5 -11.5t-19.5 -53.5v-554l429 91v-60l-429 -91v-130l429 91v-60l-429 -91v-267q0 -25 10 -47q18 -38 243 -38h34v-61q-84 6 -154 6h-439q-71 0 -155 -6v61q9 0 35.5 -0.5t40.5 -0.5q184 0 202 39q8 17 8 47v229l-429 -91v60l429 91v130l-429 -91v60 l429 91v593q0 43 -29 56q-17 8 -66 8q-256 0 -321 -62.5t-86 -318.5h-48l36 442h1206l36 -442h-49q-22 262 -88.5 321.5t-330.5 59.5z" />
+<glyph unicode="&#x20af;" horiz-adv-x="1363" d="M1311 -145q0 -279 -149 -279q-157 0 -226 320l-53 245l-274 -541h-151l244 481q-121 -105 -271 -105q-177 0 -278 123t-101 305t120 309.5t304 154.5q-35 39 -132 116.5t-135 128.5q-56 77 -56 173.5t115 152.5q93 44 208 44t208 -54q113 -64 113 -170.5t-98 -106.5 q-43 0 -71 28t-28 71q0 95 101 99q-80 78 -229 78q-80 0 -140 -31q-74 -38 -74 -111q0 -96 139 -210l274 -211q159 -142 192 -295l26 -118l254 502h151l-360 -711l75 -347q17 -74 63 -129.5t114 -55.5q78 0 90 158h35v-14zM730 399q0 187 -210 421q-153 -24 -236 -131.5 t-83 -262.5t59 -262q73 -134 208.5 -134t205.5 125q56 101 56 244z" />
+<glyph unicode="&#x20b0;" horiz-adv-x="1107" d="M1041 -15q0 -145 -117.5 -227.5t-268.5 -82.5l-6 34q95 18 155 106t60 188q0 238 -238 585l-172 -491l-112 269l-148 -260h-134l307 528l106 -248l97 285q-122 176 -161 252q-78 151 -78 281t79 208t205 78q91 0 142.5 -51.5t51.5 -142.5q0 -184 -129 -531 q175 -258 235 -370q126 -236 126 -410zM712 1281q0 126 -89 126q-72 0 -107 -62.5t-35 -140.5q0 -151 141 -354q90 285 90 431z" />
+<glyph unicode="&#x20b1;" horiz-adv-x="1472" d="M1404 864h-199q-47 -112 -171 -178.5t-255 -66.5h-335v-473q0 -32 7 -48q17 -37 181 -37h17v-61q-72 6 -133 6h-326q-50 0 -122 -6v61l55 -1q122 0 140 38q7 15 7 48v718h-99v60h99v130h-99v60h99v83q0 32 -7 48q-16 37 -158 37q-18 0 -37 -1v62h695q131 0 255 -61 t178 -168h208v-60h-186q10 -37 10 -70.5t-5 -59.5h181v-60zM711 1281h-186q-53 0 -69.5 -13t-16.5 -66v-88h567q-54 167 -295 167zM1022 924q2 25 2 60t-5 70h-580v-130h583zM439 864v-194h272q255 0 301 194h-573z" />
+<glyph unicode="&#x20b2;" horiz-adv-x="1472" d="M1405 478q-80 0 -97 -6q-40 -15 -40 -81v-360q0 -29 -16 -29q-42 0 -127 122q-97 -167 -369 -167v-65h-60v68q-269 23 -448.5 230.5t-179.5 482t180.5 483.5t447.5 232v58h60v-56q195 -1 361 -169l99 144q17 25 31 25q21 0 21 -33l1 -503q0 -26 -29 -26t-35 32 q-12 60 -46 177q-51 128 -151.5 209.5t-230.5 81.5q-10 0 -21 -1v-1309q16 -1 32 -1q124 0 208 56q98 65 98 183v126q0 40 -9 56q-23 40 -175 40h-63v59q65 -5 221.5 -5t336.5 5v-59zM579 1282q-309 -152 -309 -608.5t312 -609.5q53 -26 114 -38v1294q-62 -11 -117 -38z" />
+<glyph unicode="&#x20b3;" horiz-adv-x="1374" d="M963 6q-110 0 -182 -6v61h5q161 0 161 59q0 16 -59 199l-24 75h-473l-61 -188q-9 -28 -9 -42q0 -51 47.5 -76.5t104.5 -26.5v-61q-183 6 -244 6t-161 -6v61h2q149 0 193 136l64 197h-156v60h175l42 130h-217v60h237l235 725q14 42 45 42t45 -42l234 -725h237v-60h-218 l42 -130h176v-60h-157l80 -248q6 -20 25 -56q25 -29 141 -29h15v-61q-235 6 -345 6zM783 644l-157 481l-155 -481h312zM844 454l-42 130h-350l-42 -130h434z" />
+<glyph unicode="&#x20b4;" horiz-adv-x="1169" d="M1101 524h-724q-21 -17 -40 -42q-62 -80 -62 -188.5t75 -192.5t189 -84q194 0 311 107t117 250q0 72 30 72q24 0 24 -29v-431q0 -29 -20 -29q-14 0 -34 31l-68 106q-126 -137 -362 -137q-167 0 -277.5 121t-110.5 289q0 83 28 157h-109v60h139q47 79 126 130h-265v60h412 q73 15 216 52q199 61 199 250q0 109 -74.5 183.5t-183.5 74.5q-279 0 -360 -290q-8 -41 -25 -122q-5 -22 -23 -22q-28 0 -28 28v429q0 33 24 33q12 0 29 -27l69 -112q142 139 309 139t278 -111t111 -271q0 -131 -80 -234h160v-60h-219q-53 -43 -118 -67q-6 -2 -252 -63h589 v-60z" />
+<glyph unicode="&#x20b5;" horiz-adv-x="1335" d="M1267 854q0 -26 -29 -26t-35 32q-12 60 -47 178q-50 126 -149 207t-226 83v-1311q139 1 253.5 86t157.5 217q17 52 27 140q4 33 23 33q24 0 24 -35q0 -197 -143.5 -343t-341.5 -157v-66h-60v66q-277 12 -465 222.5t-188 492t188.5 492.5t464.5 224v57h60v-57 q174 -9 334 -168l99 144q17 25 31 25q22 0 22 -33v-503zM568 1278q-298 -145 -298 -613.5t322 -606.5q66 -28 129 -37v1304q-78 -10 -153 -47z" />
+<glyph unicode="&#x20b6;" horiz-adv-x="1355" d="M53 66l68 -2q98 0 98 98v693h-166v68h166v354q0 87 -44 108q-21 10 -106 10h-16v67l306 23v-562h332q107 0 169 151q47 116 49 243h53v-394h305v-68h-305v-594q0 -231 144.5 -231t144.5 290q0 18 -1 67h52v-122q0 -113 -48 -193q-58 -96 -164 -96q-132 0 -203.5 78 t-71.5 211v590h-456v-693q0 -50 13.5 -69t49.5 -23q29 -4 81 -4h24v-66q-220 6 -247.5 6t-226.5 -6v66z" />
+<glyph unicode="&#x20b7;" horiz-adv-x="1107" d="M961 616.5q79 -106.5 79 -256.5t-87.5 -249.5t-232.5 -135.5v-40h-89v25q-31 -3 -69.5 -3t-79.5 6v-28h-89v48q-82 24 -149 63v-111h-89v177q-103 97 -103 222q0 44 29.5 87t71.5 43q78 0 86 -88q56 89 111 89q85 0 119 -94q49 94 120 94q131 0 131 -216v-206 q194 69 194 257q0 102 -58.5 177.5t-170.5 104.5q-88 17 -260 65q-116 43 -186.5 140.5t-70.5 220.5q0 160 111 271t278 111t309 -139l69 112q17 27 29 27q24 0 24 -33v-429q0 -28 -28 -28q-18 0 -23 22q-7 41 -25 122q-80 290 -360 290q-109 0 -183.5 -74.5t-74.5 -183.5 q0 -188 199 -250q85 -19 252 -62q137 -41 216 -147.5zM631 324q0 111 -48 111q-51 0 -80 -82q-21 -62 -21 -126v-202q45 -8 79 -8t70 5v302zM394 332q0 103 -50 103t-79 -82q-21 -62 -21 -126v-114q66 -40 149 -66zM155 325q0 59 -20 59q-38 0 -38 -69.5t58 -131.5v142z" />
+<glyph unicode="&#x20b8;" horiz-adv-x="1200" d="M1130 1187h-1060v156h1060v-156zM1130 904h-452v-904h-156v904h-452v156h1060v-156z" />
+<glyph unicode="&#x20b9;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20ba;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20bb;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20bc;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20bd;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20be;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20bf;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20c0;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20c1;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20c2;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20c3;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20c4;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20c5;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20c6;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20c7;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20c8;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20c9;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20ca;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20cb;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20cc;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20cd;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20ce;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20cf;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20d0;" horiz-adv-x="0" d="M1117 1405q0 -39 -45 -39h-959q-56 0 -56 28.5t45 51.5q113 58 179 127q32 33 48 33q31 0 31 -32t-128 -130h840q45 0 45 -39z" />
+<glyph unicode="&#x20d1;" horiz-adv-x="0" d="M1072 1446q45 -23 45 -51.5t-56 -28.5h-959q-45 0 -45 39t45 39h840q-128 98 -128 130t31 32q16 0 48 -33q66 -69 179 -127z" />
+<glyph unicode="&#x20d2;" horiz-adv-x="0" d="M628 -341q0 -41 -41 -41t-41 41v1848q0 39 41 39t41 -39v-1848z" />
+<glyph unicode="&#x20d3;" horiz-adv-x="0" d="M628 -41q0 -41 -41 -41t-41 41v1248q0 39 41 39t41 -39v-1248z" />
+<glyph unicode="&#x20d4;" horiz-adv-x="0" d="M1080 1123q0 -41 -41 -41t-41 41q0 166 -117.5 283.5t-283.5 117.5q-136 0 -242 -81.5t-143 -208.5q118 79 151.5 79t33.5 -34q0 -19 -63.5 -47.5t-163.5 -121.5q-30 -28 -49.5 -28t-28.5 54q-23 139 -61 211q-17 32 -17 45q0 31 35 31t86 -158q46 150 173.5 245.5 t288.5 95.5q200 0 341.5 -141.5t141.5 -341.5z" />
+<glyph unicode="&#x20d5;" horiz-adv-x="0" d="M1160 1392q0 -13 -17 -45q-38 -72 -61 -211q-9 -54 -28.5 -54t-49.5 28q-100 93 -163.5 121.5t-63.5 47.5q0 34 33.5 34t151.5 -79q-37 127 -143 208.5t-242 81.5q-166 0 -283.5 -117.5t-117.5 -283.5q0 -41 -41 -41t-41 41q0 200 141.5 341.5t341.5 141.5 q161 0 288.5 -95.5t173.5 -245.5q51 158 86 158t35 -31z" />
+<glyph unicode="&#x20d6;" horiz-adv-x="0" d="M1117 1405q0 -39 -45 -39h-842q128 -97 128 -129.5t-31 -32.5q-16 0 -48 33q-62 65 -179 127q-43 23 -43 41t43 41q117 62 179 127q32 33 48 33q31 0 31 -32.5t-128 -129.5h842q45 0 45 -39z" />
+<glyph unicode="&#x20d7;" horiz-adv-x="0" d="M1117 1405q0 -18 -43 -41q-117 -62 -179 -127q-32 -33 -48 -33q-31 0 -31 32.5t128 129.5h-842q-45 0 -45 39t45 39h842q-128 97 -128 129.5t31 32.5q16 0 48 -33q62 -65 179 -127q43 -23 43 -41z" />
+<glyph unicode="&#x20d8;" horiz-adv-x="0" d="M995 582q0 -200 -141.5 -341.5t-341.5 -141.5t-341.5 141.5t-141.5 341.5t141.5 341.5t341.5 141.5t341.5 -141.5t141.5 -341.5zM913 582q0 166 -117.5 283.5t-283.5 117.5t-283.5 -117.5t-117.5 -283.5t117.5 -283.5t283.5 -117.5t283.5 117.5t117.5 283.5z" />
+<glyph unicode="&#x20d9;" horiz-adv-x="0" d="M995 582q0 -200 -141.5 -341.5t-337 -141.5t-334.5 130t-152 319q-34 -36 -96 -77t-95 -41q-39 0 -39 41q0 22 25 36q22 10 44 19q90 42 173 168q38 161 169.5 266t300.5 105q200 0 341.5 -141.5t141.5 -341.5zM913 582q0 166 -117.5 283.5t-272.5 117.5t-265.5 -91 t-138.5 -229q69 -98 152 -137q22 -9 44 -19q25 -14 25 -36q0 -41 -39 -41q-33 0 -92.5 39.5t-95.5 75.5q14 -154 128.5 -259t275.5 -105t278.5 117.5t117.5 283.5z" />
+<glyph unicode="&#x20da;" horiz-adv-x="0" d="M995 582q0 -200 -141.5 -341.5t-341.5 -141.5q-169 0 -300.5 105t-169.5 266q-83 126 -173 168q-22 9 -44 19q-25 14 -25 36q0 41 39 41q33 0 95 -41t96 -77q13 189 152 319t334.5 130t337 -141.5t141.5 -341.5zM913 582q0 166 -117.5 283.5t-278.5 117.5t-275.5 -105 t-128.5 -259q36 36 95.5 75.5t92.5 39.5q39 0 39 -41q0 -22 -25 -36q-22 -10 -44 -19q-83 -39 -152 -137q28 -138 138.5 -229t265.5 -91t272.5 117.5t117.5 283.5z" />
+<glyph unicode="&#x20db;" horiz-adv-x="0" d="M1087 1442q0 -41 -30.5 -72t-72 -31t-69.5 30.5t-28 72t29 72t69.5 30.5t71 -30.5t30.5 -71.5zM687 1442q0 -41 -30.5 -72t-72 -31t-69.5 30.5t-28 72t29 72t69.5 30.5t71 -30.5t30.5 -71.5zM287 1442q0 -41 -30.5 -72t-72 -31t-69.5 30.5t-28 72t29 72t69.5 30.5 t71 -30.5t30.5 -71.5z" />
+<glyph unicode="&#x20dc;" horiz-adv-x="0" d="M1222 1442q0 -41 -29.5 -70.5t-71 -29.5t-70.5 29t-29 70t30 71t70.5 30t70 -29.5t29.5 -70.5zM882 1442q0 -41 -29.5 -70.5t-71 -29.5t-70.5 29t-29 70t30 71t70.5 30t70 -29.5t29.5 -70.5zM542 1442q0 -41 -29.5 -70.5t-71 -29.5t-70.5 29t-29 70t30 71t70.5 30 t70 -29.5t29.5 -70.5zM202 1442q0 -41 -29.5 -70.5t-71 -29.5t-70.5 29t-29 70t30 71t70.5 30t70 -29.5t29.5 -70.5z" />
+<glyph unicode="&#x20dd;" horiz-adv-x="0" d="M2083 582q0 -410 -287 -697t-697 -287t-697 287t-287 697t287 697t697 287t697 -287t287 -697zM1983 582q0 368 -258 626t-626.5 258t-626 -257.5t-257.5 -626.5t257.5 -626.5t626 -257.5t626.5 258t258 626z" />
+<glyph unicode="&#x20de;" horiz-adv-x="0" d="M1983 -252q0 -50 -50 -50h-1668q-50 0 -50 50v1668q0 50 50 50h1668q50 0 50 -50v-1668zM1883 -202v1568h-1568v-1568h1568z" />
+<glyph unicode="&#x20df;" horiz-adv-x="0" d="M2102 582q0 -21 -14 -35l-954 -954q-14 -14 -35 -14t-35 14l-954 954q-14 14 -14 35t14 35l954 954q14 14 35 14t35 -14l954 -954q14 -14 14 -35zM1981 582l-882 882l-882 -882l882 -882z" />
+<glyph unicode="&#x20e0;" horiz-adv-x="0" d="M2083 582q0 -410 -287 -697t-697 -287t-697 287t-287 697t287 697t697 287t697 -287t287 -697zM1754 -15q229 251 229 608t-258 615t-615 258t-608 -229zM444 1179q-229 -251 -229 -608.5t257.5 -615t615 -257.5t608.5 229z" />
+<glyph unicode="&#x20e1;" horiz-adv-x="0" d="M1117 1405q0 -18 -43 -41q-117 -62 -179 -127q-32 -33 -48 -33q-31 0 -31 32.5t128 129.5h-714q128 -97 128 -129.5t-31 -32.5q-16 0 -48 33q-62 65 -179 127q-43 23 -43 41t43 41q117 62 179 127q32 33 48 33q31 0 31 -32.5t-128 -129.5h714q-128 97 -128 129.5t31 32.5 q16 0 48 -33q62 -65 179 -127q43 -23 43 -41z" />
+<glyph unicode="&#x20e2;" horiz-adv-x="0" d="M2034 856q3 -121 3 -273t-3 -274q-7 -284 -87 -363t-371 -89t-477 -10t-477 10t-371 89t-87 363q-3 122 -3 273.5t3 273.5q7 285 86.5 363.5t372.5 88t475.5 9.5t476 -9.5t373 -88t86.5 -363.5zM1944 311q3 131 3 272t-3 271q-6 248 -60.5 301.5t-338.5 62.5t-446.5 9 t-446 -9t-338 -62.5t-60.5 -301.5q-3 -130 -3 -271t3 -272q6 -247 61 -301.5t336 -63.5t448 -9t448 9t336 63.5t61 301.5z" />
+<glyph unicode="&#x20e3;" horiz-adv-x="0" d="M2113 -113q0 -137 -96.5 -233t-233.5 -96h-1368q-137 0 -233.5 96t-96.5 233v1367q0 137 96.5 234.5t233.5 97.5h1368q137 0 233.5 -97.5t96.5 -234.5v-1367zM2041 -70v1324q0 124 -88.5 211.5t-212.5 87.5h-1325q-124 0 -211.5 -87.5t-87.5 -211.5v-1324 q0 -124 87.5 -211.5t211.5 -87.5h1325q124 0 212.5 87.5t88.5 211.5zM1920 35q0 -117 -83.5 -201t-200.5 -84h-1180q-117 0 -200 84t-83 201v1178q0 117 83 201t200 84h1180q117 0 200.5 -84t83.5 -201v-1178zM1847 78v1135q0 104 -74 178t-178 74h-1139q-104 0 -178 -74 t-74 -178v-1135q0 -104 74 -179t178 -75h1139q104 0 178 75t74 179z" />
+<glyph unicode="&#x20e4;" horiz-adv-x="0" d="M2198 -138q0 -42 -53 -42h-2092q-53 0 -53 42q0 16 11 34l1046 1682q17 28 42 28t42 -28l1046 -1682q11 -18 11 -34zM2055 -80l-956 1537l-956 -1537h1912z" />
+<glyph unicode="&#x20e5;" horiz-adv-x="0" d="M964 -341q0 -41 -39 -41q-31 0 -40 26l-673 1848q-2 5 -2 13q0 41 39 41q31 0 40 -26l673 -1848q2 -5 2 -13z" />
+<glyph unicode="&#x20e6;" horiz-adv-x="0" d="M468 -341q0 -41 -41 -41t-41 41v1848q0 39 41 39t41 -39v-1848zM788 -341q0 -41 -41 -41t-41 41v1848q0 39 41 39t41 -39v-1848z" />
+<glyph unicode="&#x20e7;" horiz-adv-x="0" d="M1335 39q0 -39 -41 -39t-41 39v1214h-1214q-39 0 -39 41t39 41h1255q14 0 27.5 -13.5t13.5 -27.5v-1255z" />
+<glyph unicode="&#x20e8;" horiz-adv-x="0" d="M1107 -278q0 -41 -30.5 -72t-72 -31t-69.5 30.5t-28 72t29 72t69.5 30.5t71 -30.5t30.5 -71.5zM687 -278q0 -41 -30.5 -72t-72 -31t-69.5 30.5t-28 72t29 72t69.5 30.5t71 -30.5t30.5 -71.5zM267 -278q0 -41 -30.5 -72t-72 -31t-69.5 30.5t-28 72t29 72t69.5 30.5 t71 -30.5t30.5 -71.5z" />
+<glyph unicode="&#x20e9;" horiz-adv-x="0" d="M1089 1332q0 -45 -39 -45t-39 45v122h-848v-122q0 -45 -39 -45t-39 45v200h1004v-200z" />
+<glyph unicode="&#x20ea;" horiz-adv-x="0" d="M1703 582q0 -39 -45 -39h-1485q128 -97 128 -129.5t-31 -32.5q-16 0 -48 33q-62 65 -179 127q-43 23 -43 41t43 41q117 62 179 127q32 33 48 33q31 0 31 -32.5t-128 -129.5h1485q45 0 45 -39z" />
+<glyph unicode="&#x20eb;" horiz-adv-x="0" d="M769 1505q0 -8 -2 -13l-673 -1848q-9 -26 -40 -26q-39 0 -39 41q0 8 2 13l673 1848q9 26 40 26q39 0 39 -41zM1159 1505q0 -8 -2 -13l-673 -1848q-9 -26 -40 -26q-39 0 -39 41q0 8 2 13l673 1848q9 26 40 26q39 0 39 -41z" />
+<glyph unicode="&#x20ec;" horiz-adv-x="0" d="M1061 -202q56 0 56 -28.5t-45 -51.5q-113 -58 -179 -127q-32 -33 -48 -33q-31 0 -31 32t128 130h-840q-45 0 -45 39t45 39h959z" />
+<glyph unicode="&#x20ed;" horiz-adv-x="0" d="M1117 -241q0 -39 -45 -39h-840q128 -98 128 -130t-31 -32q-16 0 -48 33q-66 69 -179 127q-45 23 -45 51.5t56 28.5h959q45 0 45 -39z" />
+<glyph unicode="&#x20ee;" horiz-adv-x="0" d="M1117 -241q0 -39 -45 -39h-842q128 -97 128 -129.5t-31 -32.5q-16 0 -48 33q-62 65 -179 127q-43 23 -43 41t43 41q117 62 179 127q32 33 48 33q31 0 31 -32.5t-128 -129.5h842q45 0 45 -39z" />
+<glyph unicode="&#x20ef;" horiz-adv-x="0" d="M1117 -241q0 -18 -43 -41q-117 -62 -179 -127q-32 -33 -48 -33q-31 0 -31 32.5t128 129.5h-842q-45 0 -45 39t45 39h842q-128 97 -128 129.5t31 32.5q16 0 48 -33q62 -65 179 -127q43 -23 43 -41z" />
+<glyph unicode="&#x20f0;" horiz-adv-x="0" d="M775 1314q0 -47 -43 -47q-14 0 -23 8l-102 86l23 -136q0 -40 -43 -40t-43 40v3l23 133l-102 -86q-9 -8 -22 -8q-44 0 -44 47q0 27 23 35l126 46l-126 47q-23 9 -23 35q0 47 44 47q13 0 22 -8l102 -86l-23 136q0 40 43 40t43 -40v-2l-23 -134l102 86q9 8 23 8q43 0 43 -47 q0 -27 -22 -35l-126 -47l126 -46q22 -8 22 -35z" />
+<glyph unicode="&#x20f1;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20f2;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20f3;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20f4;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20f5;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20f6;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20f7;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20f8;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20f9;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20fa;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20fb;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20fc;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20fd;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20fe;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x20ff;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2100;" horiz-adv-x="1419" d="M783 715q0 -62 -40 -103t-102 -41q-98 0 -129 97q-67 -105 -206 -105q-96 0 -170 34q-96 44 -96 128q0 125 165 194q99 41 289 51v43q0 73 -44 122.5t-127 49.5t-139 -47q70 -13 70 -74q0 -34 -25.5 -54.5t-59.5 -20.5q-84 0 -84 76q0 83 81.5 127.5t171.5 44.5 q142 0 227 -82q60 -58 60 -174v-284q0 -62 49 -62q48 0 48 130q0 18 -1 40h62v-90zM494 788v132q-116 -5 -198 -43q-113 -52 -113 -150q0 -50 40.5 -81t104 -31t115 49t51.5 124zM1470 1455l-1155 -1746h-89l1155 1746h89zM1380 -90q0 -12 -8 -30q-75 -165 -268 -165 q-142 0 -248 96t-106 238.5t105.5 241t250.5 98.5q91 0 164 -36q92 -45 92 -127q0 -76 -83.5 -76t-83.5 75q0 56 60 72q-56 36 -147 36q-41 0 -85 -22q-121 -61 -121 -258.5t128 -259.5q45 -22 88 -22q83 0 132 43q26 22 52.5 71.5t46.5 49.5q31 0 31 -25z" />
+<glyph unicode="&#x2101;" horiz-adv-x="1433" d="M783 715q0 -62 -40 -103t-102 -41q-98 0 -129 97q-67 -105 -206 -105q-96 0 -170 34q-96 44 -96 128q0 125 165 194q99 41 289 51v43q0 73 -44 122.5t-127 49.5t-139 -47q70 -13 70 -74q0 -34 -25.5 -54.5t-59.5 -20.5q-84 0 -84 76q0 83 81.5 127.5t171.5 44.5 q142 0 227 -82q60 -58 60 -174v-284q0 -62 49 -62q48 0 48 130q0 18 -1 40h62v-90zM494 788v132q-116 -5 -198 -43q-113 -52 -113 -150q0 -50 40.5 -81t104 -31t115 49t51.5 124zM1315 -233.5q-78 -51.5 -185 -51.5t-181 58q-53 -58 -73 -58q-26 0 -26 32v214q0 31 30 31 q24 0 32 -30q27 -97 74 -146t140 -49q170 0 170 120q0 88 -159 119q-97 19 -112 23q-63 16 -103 46q-72 53 -72 129q0 97 89 146q71 39 167 39t159 -38q41 38 61 38q28 0 28 -32v-169q0 -33 -32 -33q-23 0 -31 29q-4 24 -7 48q-22 110 -169 110q-169 0 -169 -98 q0 -53 72 -80q31 -12 139.5 -30.5t164.5 -66.5q71 -60 71 -154.5t-78 -146zM1470 1455l-1155 -1746h-89l1155 1746h89z" />
+<glyph unicode="&#x2102;" horiz-adv-x="1389" d="M1336 258q0 -11 -7 -22q-80 -121 -248.5 -197t-324.5 -76q-318 0 -510 198t-192 516.5t192.5 517t509.5 198.5q97 0 218.5 -46t179.5 -46q41 0 54 46t39 46q32 0 32 -30v-397q0 -34 -32 -34q-22 0 -35 26q-13 35 -44 102q-55 100 -179 182.5t-233 82.5q-192 0 -286 -241 q-69 -176 -69 -406q0 -620 379 -620q249 0 418 156l68 68q15 14 28 14q42 0 42 -38zM1210 1248q-25 -15 -51 -15t-49 3q62 -56 100 -112v124zM332 678q0 412 180 607q-192 -69 -291 -232t-99 -381t106.5 -383.5t313.5 -227.5q-210 159 -210 617z" />
+<glyph unicode="&#x2103;" horiz-adv-x="2024" d="M1957 854q0 -26 -29 -26t-35 32q-12 60 -47 178q-51 127 -151 208.5t-217 81.5t-220 -50q-298 -145 -298 -613.5t322 -606.5q96 -41 185 -41q140 0 256 85t159 218q17 52 27 140q4 33 23 33q24 0 24 -35q0 -205 -154 -353t-360 -148q-288 0 -486 213t-198 502.5 t198.5 503.5t485.5 214q193 0 363 -169l99 144q17 25 31 25q21 0 21 -33zM623.5 1296.5q89.5 -89.5 89.5 -218t-90 -218t-218 -89.5t-217.5 89.5t-89.5 218t89 218t218 89.5t218.5 -89.5zM563 921q65 65 65 158.5t-64.5 158t-158.5 64.5t-158.5 -64.5t-64.5 -158t65 -158.5 t158 -65t158 65z" />
+<glyph unicode="&#x2104;" horiz-adv-x="1370" d="M851 1284l-66 2q-156 0 -177 -36q-8 -14 -10 -35q106 -16 182.5 -73t76.5 -154.5t-97 -97.5q-42 0 -70.5 28t-28.5 70q0 94 100 99q-60 59 -163 74v-867q89 13 145 76q30 34 60.5 100t49.5 66q29 0 29 -22t-27 -75q-86 -168 -257 -197v-102q0 -52 17.5 -65.5t68.5 -13.5 h173q212 0 303 123q70 96 94 324h49l-55 -508h-1026v61q8 0 25.5 -0.5t27.5 -0.5q124 0 142 35q7 14 7 46v107q-157 37 -257 171t-100 303.5t99.5 308t257.5 176.5q0 30 -7 44q-17 33 -185 33h-10v62q71 -6 126 -6h383q47 0 120 6v-62zM424 1137q-180 -90 -180 -404 q0 -320 180 -410v814z" />
+<glyph unicode="&#x2105;" horiz-adv-x="1530" d="M1491 46.5q0 -143.5 -111 -237.5t-255.5 -94t-254.5 94.5t-110 238t110 242.5t255.5 99t255.5 -99.5t110 -243zM1303 -129q34 60 34 189t-41 189q-60 88 -174.5 88t-172.5 -91q-37 -58 -37 -190t40 -194q59 -91 176.5 -91t174.5 100zM1440 1455l-1155 -1746h-89 l1155 1746h89zM670 758q0 -12 -8 -30q-75 -165 -268 -165q-142 0 -248 96t-106 238.5t105.5 241t250.5 98.5q91 0 164 -36q92 -45 92 -127q0 -76 -83.5 -76t-83.5 75q0 56 60 72q-56 36 -147 36q-41 0 -85 -22q-121 -61 -121 -258.5t128 -259.5q45 -22 88 -22q83 0 132 43 q26 22 52.5 71.5t46.5 49.5q31 0 31 -25z" />
+<glyph unicode="&#x2106;" horiz-adv-x="1735" d="M1440 1455l-1155 -1746h-89l1155 1746h89zM1445 -183q-71 -102 -205 -102t-190 55.5t-56 195.5v250q0 67 -30 79q-10 4 -69 4h-25v65l255 17v-483q0 -75 28 -103t108 -28t129.5 62t49.5 149v252q0 56 -39 67q-8 2 -53 2h-33v65l256 17v-517q0 -56 39 -67q8 -2 52 -2h34 v-63l-251 -18v103zM670 758q0 -12 -8 -30q-75 -165 -268 -165q-142 0 -248 96t-106 238.5t105.5 241t250.5 98.5q91 0 164 -36q92 -45 92 -127q0 -76 -83.5 -76t-83.5 75q0 56 60 72q-56 36 -147 36q-41 0 -85 -22q-121 -61 -121 -258.5t128 -259.5q45 -22 88 -22 q83 0 132 43q26 22 52.5 71.5t46.5 49.5q31 0 31 -25z" />
+<glyph unicode="&#x2107;" horiz-adv-x="1259" d="M1245 408q0 -241 -255 -355q-189 -84 -466 -84q-207 0 -337 64q-173 85 -173 270q0 208 155 340q131 111 353 155q-124 41 -175 81q-82 62 -82 166q0 177 174 269q139 73 334 73t316 -72.5t121 -133.5q0 -29 -80 -89.5t-112 -60.5q-3 0 -7.5 1t-6.5 1q38 22 38 69 q0 98 -82 161.5t-190.5 63.5t-214.5 -73t-106 -190.5t128 -189.5q106 -59 241 -59q67 0 115 24l8 -8q-28 -83 -97 -83q-360 0 -508 -164q-89 -98 -89 -203q0 -149 126 -247.5t279 -98.5q186 0 318.5 129t132.5 315q0 83 -46 117q80 0 134 -54t54 -134z" />
+<glyph unicode="&#x2108;" horiz-adv-x="1110" d="M1080 1143q0 -150 -134 -304q-116 -131 -270 -208q176 -67 176 -218q0 -188 -216 -329q-194 -125 -400 -125t-206 131q0 74 59 135t133 61q13 0 13 -18q0 -7 -15.5 -38.5t-15.5 -53.5q0 -101 181 -101q118 0 205.5 69t87.5 184q0 171 -235 211l-65 4q-49 5 -49 20 q0 32 56 63.5t85 34.5l71 7q132 15 233 114q132 130 132 275q0 104 -98 162q-82 50 -192 50t-192 -65l-119 -122q-66 -65 -135 -65q-13 0 -13 13t8 25q93 142 259 237t332 95q124 0 216 -59q108 -68 108 -185z" />
+<glyph unicode="&#x2109;" horiz-adv-x="1971" d="M1479 1281h-252q-45 0 -64 -11.5t-19 -67.5v-501h170q132 0 171 48t39 183h48v-522h-48q0 136 -39 183.5t-171 47.5h-170v-497q0 -27 7 -44q16 -39 209 -39h37v-61q-74 6 -135 6h-373q-49 0 -121 -6v61h75q64 0 88 10q39 18 39 73v1056q0 25 -6 42q-14 39 -166 39h-30v62 h1081l54 -442h-49q-24 217 -89 291q-77 89 -286 89zM623.5 1296.5q89.5 -89.5 89.5 -218t-90 -218t-218 -89.5t-217.5 89.5t-89.5 218t89 218t218 89.5t218.5 -89.5zM563 921q65 65 65 158.5t-64.5 158t-158.5 64.5t-158.5 -64.5t-64.5 -158t65 -158.5t158 -65t158 65z" />
+<glyph unicode="&#x210a;" horiz-adv-x="1004" d="M99 -442q-55 0 -100 26t-45 77q0 92 174 187q55 30 258 112l74 166q-125 -145 -247 -145q-80 0 -128 60.5t-48 139.5t38 181l-48 -59l-27 17q51 71 125 152q219 238 421 238q87 0 124 -54q24 -35 24 -69v-8l59 107l247 20q-231 -391 -370 -682q207 74 381 305l28 -17 q-194 -261 -427 -325q-76 -160 -207 -283q-155 -146 -306 -146zM659 575q0 97 -79 97q-94 0 -239 -259.5t-145 -368.5q0 -29 31 -29q79 0 161.5 79t135.5 169q135 231 135 312zM19 -356q0 -25 21.5 -41t46.5 -16q131 0 282 333q-350 -162 -350 -276z" />
+<glyph unicode="&#x210b;" horiz-adv-x="1688" d="M2176 1284q0 -138 -187 -283q-130 -101 -312 -182l-165 -68q-257 -585 -257 -708q0 -31 40 -31q87 0 207 109t193 213l28 -17q-91 -123 -191 -211q-141 -124 -239 -124t-147 87q-39 70 -39 174t31 193.5t99 227.5q-108 -31 -209 -65q-141 -429 -480 -566 q-129 -52 -268 -52t-236 64q-112 74 -112 205q0 76 48.5 134.5t123.5 58.5q50 0 91.5 -30t41.5 -81.5t-45 -87.5q-13 -10 -108 -33q-70 -18 -70 -66q0 -62 98 -101q77 -31 151 -31q206 0 337 229q63 110 143 274q-185 -73 -358 -215l-19 23q174 149 394 229q169 348 361 576 q-169 -132 -210 -161q-160 -111 -231 -111q-40 0 -66 27t-26 67q0 62 64 149t64 92q0 18 -23 18q-127 0 -416 -354l-25 15q287 369 453 369q45 0 78 -32.5t33 -77.5q0 -69 -60.5 -146t-60.5 -84.5t21 -7.5q40 0 227 142l394 299l17 -21q-112 -110 -192 -316l-121 -353l-3 -8 l221 71q124 205 212 314q334 414 562 414q64 0 103.5 -42.5t39.5 -107.5zM2081 1248q29 60 29 91t-23.5 48t-50.5 17q-152 0 -291 -210q-88 -132 -214 -405q209 87 323 174q144 111 227 285z" />
+<glyph unicode="&#x210c;" horiz-adv-x="1358" d="M823 952q203 -63 329 -207t126 -343t-114 -346q-62 -80 -213.5 -196.5t-178.5 -183.5q-144 162 -276 162q-88 0 -156 -82l-23 19q175 192 304 192q105 0 245 -127q242 164 242 459q0 169 -100 323q-112 173 -269 173q-81 0 -225 -97q143 -169 143 -290t-129 -238 l-221 -182l-151 121l-74 -58l-25 27l222 176l153 -119q90 67 90 153t-78 193l-145 185q-78 116 -78 231q0 151 138 285l249 217q112 -119 233.5 -119t176.5 96l31 -10q-135 -211 -291 -211q-89 0 -244 111q-152 -106 -152 -260.5t125 -272.5q221 118 336 219z" />
+<glyph unicode="&#x210d;" horiz-adv-x="1676" d="M1463 76q48 0 48 -38t-35 -38h-599q-33 0 -33 39q0 36 55 36q78 0 97 19t19 92v446h-467v-457q0 -69 30 -87q20 -12 94 -12q48 0 48 -38t-35 -38h-599q-33 0 -33 39q0 36 57 36q78 0 96.5 19t18.5 92v982q0 69 -31 87q-20 11 -92 11q-49 0 -49 38.5t33 38.5h599 q35 0 35 -37.5t-57 -37.5q-78 0 -96.5 -19t-18.5 -92v-429h467v440q0 69 -31 88q-20 11 -92 11q-48 0 -48 38t33 38h599q35 0 35 -37.5t-57 -37.5q-78 0 -97 -19t-19 -92v-982q0 -69 30 -87q20 -12 95 -12zM1263 175v982q0 72 17 111h-208q18 -38 18 -100v-982 q0 -72 -17 -111h208q-18 38 -18 100zM473 175v982q0 72 17 111h-208q18 -38 18 -100v-982q0 -71 -17 -111h208q-18 38 -18 100z" />
+<glyph unicode="&#x210e;" horiz-adv-x="1062" d="M1062 695q0 -301 -211 -568q-119 -151 -222 -151t-103 78q0 32 22 54.5t55.5 22.5t57.5 -24t35 -24q63 0 127 168q41 110 62.5 217.5t21.5 174.5q0 162 -83.5 162t-159.5 -66q-45 -39 -117 -134q-194 -258 -264 -540q-3 -15 -11 -46q-14 -43 -46 -43q-91 0 -91 39 q0 7 4 23l310 1243q6 24 6 47q0 52 -64.5 71.5t-64.5 24.5q0 36 30 53q55 7 132 18q11 2 64.5 19t72 17t18.5 -15t-17 -83l-251 -1001q99 180 215 310q166 185 305 185q167 0 167 -232z" />
+<glyph unicode="&#x210f;" horiz-adv-x="1162" d="M1165 329q23 0 23 -19.5t-26 -87.5q-94 -246 -253 -246q-76 0 -124.5 49.5t-48.5 125.5q0 37 30 120q133 368 133 492q0 152 -117 152q-137 0 -236.5 -104.5t-135.5 -246.5l-118 -473q-15 -61 -26 -78q-21 -37 -67 -37q-57 0 -57 57q0 22 7 50l253 1009l-162 -59 q-19 -7 -28 -7q-29 0 -29 35q0 19 36 32l202 74l45 178q5 20 5 36q0 37 -78 40.5t-78 24.5q0 24 21 39q6 4 129.5 15t149.5 11t26 -22q0 3 -9 -33l-58 -234l376 137q19 7 28 7q29 0 29 -35q0 -19 -36 -32l-415 -151l-90 -361q135 172 322 172q111 0 176.5 -59.5t65.5 -170.5 t-137 -488q-36 -99 -36 -150q0 -72 58 -72q86 0 145 95q31 49 72 171q15 44 33 44z" />
+<glyph unicode="&#x2110;" horiz-adv-x="1185" d="M1293 819q0 37 -12 106l31 3q13 -71 13 -108q0 -133 -91 -233.5t-226 -147.5q-154 -311 -459 -418q-128 -45 -261 -45t-230 65q-112 74 -112 204q0 80 51.5 137t130.5 57q51 0 87.5 -32.5t36.5 -90t-57 -84.5l-107 -31q-57 -19 -57 -64q0 -59 91 -97q73 -30 143 -30 q164 0 277 135q46 53 165 275q-134 35 -220.5 124.5t-86.5 220.5q0 211 226 381q166 125 418.5 205.5t507.5 83.5l1 -31q-139 0 -225 -113q-70 -92 -136 -286q-25 -76 -70 -238.5t-95 -286.5q115 48 190.5 136t75.5 203zM516 636q0 -152 205 -189l173 361q104 204 222.5 349 t290.5 240q-130 -17 -239 -45q-202 -52 -369.5 -206.5t-248.5 -353.5q-34 -84 -34 -156z" />
+<glyph unicode="&#x2111;" horiz-adv-x="1257" d="M1147 1339q-18 -110 -96 -188t-189 -78t-260.5 108.5t-243.5 108.5t-152.5 -55.5t-58.5 -133t51.5 -125.5t123.5 -48q32 0 57 8l8 -33q-34 -12 -70 -12q-93 0 -154 64t-61 157q0 126 103 208.5t221.5 82.5t224.5 -58q19 -11 161 -107q84 -58 144.5 -58t105 51.5 t58.5 122.5zM1135 920q-68 63 -110.5 63t-69.5 -22.5t-27 -55.5q0 -51 109.5 -219.5t109.5 -282.5q0 -186 -173 -305q-153 -106 -347 -106q-132 0 -227 71q-38 28 -127 132q-61 71 -117.5 71t-94.5 -80l-38 2q31 74 97 123t153 49t174 -80l140 -149q85 -80 174 -80t166 65.5 t77 159.5t-105.5 265t-105.5 264.5t58 157t142 63.5t162 -78z" />
+<glyph unicode="&#x2112;" horiz-adv-x="1465" d="M1744 1260q0 -162 -226 -385q-193 -190 -377 -278l-44 -21q-59 -165 -129.5 -268.5t-200.5 -198.5q173 -82 277 -82q202 0 428 307l26 -17q-250 -325 -480 -325q-106 0 -297 89q-164 -100 -360 -100q-91 0 -169 29q-106 39 -106 110.5t70 106.5q56 28 131 28 q129 0 342 -86q74 141 171 364q-34 -3 -57 -3q-162 0 -282.5 113.5t-120.5 274.5q0 217 240 373q215 139 444 139q80 0 173 -23l-9 -29q-86 20 -160 20q-238 0 -404 -168t-166 -394q0 -134 77 -204.5t212 -70.5q27 0 66 5q287 667 584 826q90 48 164 48t128.5 -51.5 t54.5 -128.5zM1658 1317q0 93 -103 93q-126 0 -227 -161q-73 -118 -139 -337l-81 -296q360 171 513 558q37 94 37 143zM287 225q-55 0 -112.5 -26t-57.5 -74q0 -60 92 -92q66 -22 142 -22q119 0 188 48q23 16 70 79q-199 87 -322 87z" />
+<glyph unicode="&#x2113;" horiz-adv-x="863" d="M945 1347q0 -312 -361 -725q-56 -64 -112 -118l-93 -92q-7 -8 -7 -58q0 -102 39 -190q51 -113 140 -113q107 0 297 188h7q20 0 20 -23q0 -43 -120 -129.5t-208 -86.5q-245 0 -306 255q-107 -112 -131.5 -112t-24.5 19.5t144 159.5q-12 81 -12 154q0 344 207 735 q63 119 168 220t213 101q140 0 140 -185zM892 1365q0 116 -78 116q-90 0 -213 -249q-84 -168 -148 -373t-68 -366q507 539 507 872z" />
+<glyph unicode="&#x2114;" horiz-adv-x="1670" d="M53 66l68 -2q98 0 98 98v919h-112q-68 0 -68 41t68 41h112v114q0 87 -44 108q-21 10 -106 10h-16v67l306 23v-322h371v114q0 88 -47 109q-20 10 -85 10q-16 0 -35 -1v67l307 23v-322h377q68 0 68 -41t-68 -41h-377v-274q121 139 303.5 139t313 -145.5t130.5 -342 t-139 -339.5t-327.5 -143t-290.5 157q-24 -46 -77 -133h-53v1081h-371v-919q0 -50 13.5 -69t49.5 -23q29 -4 81 -4h24v-66q-220 6 -247.5 6t-226.5 -6v66zM1375 162q64 99 64 300t-60 299q-85 138 -225 138q-91 0 -184 -64t-93 -150v-442q0 -45 30 -89q89 -130 234 -130 t234 138z" />
+<glyph unicode="&#x2115;" horiz-adv-x="1540" d="M1347 1343q33 0 33 -33.5t-29 -40.5l-53 -4q-50 -9 -63 -51q-7 -22 -7 -87v-1130q0 -34 -36 -34q-19 0 -30 14l-851 1125v-884q0 -89 28.5 -116t118.5 -27q36 0 36 -37.5t-36 -37.5h-370q-35 0 -35 39q0 34 44 36q66 3 83 13q44 24 44 112v1009q-53 59 -113 59 q-33 0 -33 37.5t33 37.5h407q14 0 26 -16l596 -802v596q0 92 -27 119.5t-119 27.5q-36 0 -36 37.5t36 37.5h353zM1140 129v269l-646 870h-214z" />
+<glyph unicode="&#x2116;" horiz-adv-x="1954" d="M1795 853q89 -91 89 -224.5t-78 -223.5t-208.5 -90t-221 98t-90.5 229t78 216.5t210 85.5t221 -91zM1884 0h-598v112h598v-112zM1273 1370q63 0 112.5 -32.5t49.5 -84t-31 -80.5t-74.5 -29t-90 29t-67.5 29q-53 0 -66 -90q-3 -23 -3 -128v-1015h-45l-619 1107v-652 q0 -167 -10 -228q-24 -141 -109 -189q-65 -38 -136 -38t-119.5 31t-48.5 83t30.5 78.5t72.5 26.5t95 -28.5t74 -28.5q51 0 62 121q1 15 1 154v697q0 91 -5 114q-13 62 -60.5 81.5t-129.5 20.5v37h355l504 -913v435q0 191 5 233q17 141 86.5 200t166.5 59zM1738 526 q0 111 -39 223q-51 148 -139 148q-119 0 -119 -176q0 -109 41 -218q54 -142 145 -142q111 0 111 165z" />
+<glyph unicode="&#x2117;" horiz-adv-x="1975" d="M1915 547q0 -384 -271.5 -655.5t-655 -271.5t-656 272t-272.5 655.5t272 655t656 271.5t655.5 -271.5t271.5 -655.5zM1585.5 -51q247.5 248 247.5 598.5t-247 597.5t-597.5 247t-597.5 -247.5t-247 -597t247.5 -598t597 -248.5t597 248zM1171 1151q162 0 298 -95 t136 -247t-132 -246t-287 -94h-287v-410q0 -39 15.5 -49t49.5 -12q20 -2 54 -2q28 0 66 1v-86q-84 7 -135 7h-293q-42 0 -125 -7v86q56 -1 71 -1q93 0 106 25q5 10 5 29v954q0 25 -5 38q-10 24 -120 24q-26 0 -57 -1v86h640zM1391 806q0 138 -63.5 198.5t-202.5 60.5h-168 q-42 0 -52 -8.5t-10 -47.5v-464h230q266 0 266 261z" />
+<glyph unicode="&#x2118;" horiz-adv-x="1518" d="M1428 1015q0 -156 -83 -296t-221 -239t-241.5 -99t-168 53t-64.5 133t35.5 135t101.5 55q74 0 74 -73q0 -30 -22 -52.5t-83 -40.5q-43 -12 -43 -57t49 -77t101 -32t124 46q116 74 192 253.5t76 331.5q0 72 -39.5 129t-105.5 57t-129 -30q-124 -59 -291 -211t-276 -287 q145 -297 145 -435q0 -84 -34 -165.5t-95.5 -119t-113 -37.5t-109.5 30q-117 61 -117 217q0 97 54 204q29 58 114 181q-61 150 -61 244q0 185 158 366q122 141 318 258l26 -43q-341 -202 -341 -494q0 -83 32 -157q346 367 499 454.5t274.5 87.5t193 -84.5t71.5 -205.5z M431 151q0 132 -150 387q-84 -130 -99 -158q-46 -90 -46 -172.5t46 -143t113.5 -60.5t101.5 42.5t34 104.5z" />
+<glyph unicode="&#x2119;" horiz-adv-x="1207" d="M681 599l-86 2q-14 0 -57 -1v-418q0 -78 33 -96q20 -11 107 -11q34 0 34 -37.5t-34 -37.5h-591q-34 0 -34 39q0 36 40 36q84 0 102.5 16.5t18.5 94.5v975q0 71 -18 89t-94 18q-49 0 -49 37.5t34 37.5h596q214 0 347 -78q165 -96 165 -289t-171 -294q-142 -83 -343 -83z M1120 970q0 219 -250 278q59 -79 59 -271.5t-63 -279.5q254 69 254 273zM821 766q33 64 33 209.5t-30 204.5q-44 88 -180 88q-39 0 -72.5 -19.5t-33.5 -55.5v-518h105q130 0 178 91zM289 1161v-975q0 -72 -15 -111h208q-19 39 -19 107v1011q0 42 23 75h-213q16 -38 16 -107z " />
+<glyph unicode="&#x211a;" horiz-adv-x="1493" d="M1261 -223l127 17q37 0 37 -38q0 -46 -144 -76.5t-224 -30.5q-168 0 -311.5 94t-210.5 248q-233 64 -357.5 248t-124.5 432q0 315 192 511.5t507 196.5t506.5 -196.5t191.5 -511.5q0 -260 -135.5 -446.5t-384.5 -241.5q46 -94 136 -150t195 -56zM1033 95 q165 72 253.5 223.5t88.5 354.5t-91 354.5t-254 222.5q145 -178 145 -576.5t-142 -578.5zM402 671q0 -634 349 -634t349 634t-349 634t-349 -634zM128 671q0 -417 340 -574q-141 182 -141 576.5t144 575.5q-162 -72 -252.5 -223t-90.5 -355zM853 -26q-47 -12 -108 -12 t-119 20q151 -258 431 -258q15 0 50 4q-148 54 -254 246z" />
+<glyph unicode="&#x211b;" horiz-adv-x="1828" d="M1943 1085q0 -103 -94 -200q-117 -122 -372 -183q104 -98 104 -235q0 -66 -35.5 -199.5t-35.5 -196.5q0 -35 23 -35q83 0 302 298l27 -17q-240 -341 -412 -341q-79 0 -130.5 51t-51.5 135.5t78 235.5t78 223q0 34 -20 69q-43 -6 -73 -6q-61 0 -61 31q0 42 63 42 q45 0 113 -32q120 15 206.5 153t86.5 265.5t-121 198.5q-111 -49 -176 -136q-100 -133 -186 -422q-26 -95 -89 -278q-60 -141 -158 -257q-226 -268 -581 -268q-144 0 -241 61q-115 72 -115 209q0 78 52.5 133.5t129.5 55.5q50 0 88.5 -34t38.5 -90.5t-57 -82.5l-107 -31 q-57 -18 -57 -64q0 -61 95 -98q74 -29 147 -29q159 0 275 128q79 87 218 381q51 108 160 318q209 365 528 522q-111 39 -261 39q-248 0 -506.5 -100t-406.5 -275q-103 -122 -103 -252q0 -68 40 -113.5t114.5 -45.5t169.5 70q252 185 273 517h30q14 -95 14 -172 q0 -196 -118 -328.5t-312 -132.5q-102 0 -173 53.5t-71 152.5q0 135 110 268q147 178 413.5 283t517.5 105q156 0 326 -44q89 31 154 48l7 -28q-62 -17 -116 -35q258 -99 258 -285z" />
+<glyph unicode="&#x211c;" horiz-adv-x="1458" d="M988 376v68q1 45 1 66q0 69 -29 131q-36 78 -98 78q-14 0 -127 -47q0 -167 -20 -256q-30 -133 -119 -223q-43 -44 -137.5 -106.5t-130.5 -94.5l-125 141l-68 -51l-22 29l217 168l123 -146q57 31 75 79q13 34 13 112v585q0 432 -217 432q-75 0 -135 -51.5t-60 -125 t64 -133.5l120 -102q64 -68 64 -157t-47 -162.5t-125 -95.5l-6 33q96 39 96 110q0 54 -68 109q-120 96 -126 103q-68 72 -68 169q0 140 100.5 246.5t239.5 106.5q112 0 210 -56.5t119 -156.5q179 87 357 217l160 -124q73 -74 73 -186q0 -170 -256 -286q102 -70 128 -244 q8 -140 18 -277t78 -137q28 0 83 56l23 -31l-219 -174q-159 89 -159 384zM1122 1020q0 82 -61 144.5t-143 62.5q-57 0 -205 -88q22 -102 22 -426q187 69 245 104q142 85 142 203z" />
+<glyph unicode="&#x211d;" horiz-adv-x="1548" d="M1366 75q33 0 33 -37.5t-33 -37.5h-339q-16 0 -25 14l-387 598h-65v-430q0 -71 23 -89t87 -18t64 -36q0 -39 -34 -39h-603q-34 0 -34 39q0 36 67.5 36t87 19t19.5 92v975q0 71 -23.5 89t-87 18t-63.5 37.5t34 37.5h645q201 0 346 -81q177 -99 177 -285q0 -281 -342 -343 q356 -559 453 -559zM925 713q255 58 255 261.5t-263 271.5q72 -88 72 -269t-64 -264zM596 686q186 0 252 54.5t66 221t-54.5 236.5t-200.5 70q-109 0 -109 -75v-507h46zM1231 75q-147 136 -411 564q-48 -17 -118 -24l350 -540h179zM302 1161v-975q0 -71 -18 -111h210 q-19 40 -19 107v1011q0 42 22 75h-214q19 -40 19 -107z" />
+<glyph unicode="&#x211e;" horiz-adv-x="1596" d="M802 -1l-286 7h-326q-50 0 -122 -6v61l55 -1q122 0 140 38q7 15 7 48v1051q0 32 -7 48q-16 37 -158 37q-18 0 -37 -1v62h695q174 0 311 -94q154 -106 154 -272q0 -112 -74.5 -196t-188.5 -127q10 -27 144 -195l105 131q26 32 26 58q0 45 -52 47v68q95 -7 164 -7t160 7 v-68q-127 -2 -210 -87q-25 -26 -159 -196l233 -299q30 -39 77 -48q24 -5 91 -5v-66q-81 5 -150 5t-220 -5v66q63 2 63 38q0 10 -165 225q-151 -173 -151 -216t51 -47v-66q-121 5 -170 5zM1024 977q0 161 -75.5 232.5t-237.5 71.5h-186q-53 0 -69.5 -13t-16.5 -66v-532h272 q313 0 313 307zM779 619h-335v-467q0 -32 7 -48q20 -44 198 -44q133 0 226 103q5 6 161 206l-196 254q-31 -4 -61 -4z" />
+<glyph unicode="&#x211f;" horiz-adv-x="1508" d="M1440 173q0 -86 -51 -151t-135 -65q-330 0 -330 318q0 13 1 40v40q0 158 -76 230q-64 61 -165 67l-245 -526q2 -18 7 -31q14 -34 171 -34h26v-61q-74 6 -143 6h-117l-98 -211q-23 -49 -48 -49q-8 0 -24.5 7.5t-16.5 26t15 49.5l82 177h-82q-69 0 -143 -6v61 q6 0 24.5 -0.5t28.5 -0.5q125 0 142 35q7 15 7 46v1055q0 27 -6 45q-14 40 -167 40h-29v62h618q106 0 215 -34l28 60l-320 148q-48 22 -48 47q0 42 37 42q16 0 46 -14l333 -155q47 -22 47 -44q0 -14 -15 -46l-31 -67q221 -101 221 -288q0 -122 -115 -213q-94 -75 -229 -108 q165 -57 224 -182q25 -52 39 -149l25 -182q31 -158 118 -158q101 0 131 175q5 31 24 31q24 0 24 -33zM997 992q0 130 -61 199l-230 -493q291 19 291 294zM540 1283q-51 0 -69 -7q-32 -14 -32 -57v-523h176l254 545q-85 42 -329 42zM439 652v-333l155 333h-155z" />
+<glyph unicode="&#x2120;" horiz-adv-x="2174" d="M2122 1435l-78 2q-78 0 -78 -45v-707q0 -13 5 -23q9 -17 136 -17h15v-67q-72 5 -99 5h-266q-23 0 -95 -5v67q116 0 136 7t20 34v706l-349 -781q-14 -32 -39 -32t-41 36l-344 767v-656q0 -81 152 -81h4v-66q-160 4 -188.5 4t-190.5 -4v66h4q152 0 152 81v670q0 12 -4 21 q-8 18 -138 18h-14v67h275q43 0 59 -36l317 -710l319 714q14 32 49 32h281v-67zM512 1115q105 -27 170.5 -100.5t65.5 -187.5t-92.5 -195.5t-218.5 -81.5q-175 0 -276 86q-64 -86 -81 -86q-28 0 -28 32v288q0 32 31 32q36 0 36 -60q0 -90 85 -158t232 -68q78 0 134 50 t56 119.5t-43.5 118t-140.5 69.5l-183 39q-90 29 -148.5 96t-58.5 157q0 118 93 193t220 75t234 -87q62 87 78 87q31 0 31 -34v-287q0 -31 -34 -31q-22 0 -28 25l-21 80q-58 185 -265 185q-74 0 -130 -44t-56 -116q0 -104 126 -148z" />
+<glyph unicode="&#x2121;" horiz-adv-x="3030" d="M2631 858l-90 2q-87 0 -99 -19q-5 -8 -5 -25v-710q0 -30 9.5 -35t43.5 -5h133q155 0 215 69.5t79 229.5h63l-45 -365h-813v66q8 0 28 -0.5t31 -0.5q84 0 93 18q4 8 4 20v721q0 11 -4 19q-8 15 -136 15h-16v68q68 -5 100 -5h314q25 0 95 5v-68zM1122 0v66q53 -1 54 -1 q88 0 98 19q4 7 4 26v704q0 16 -5 26q-8 17 -102 17q-22 0 -49 -1v67h876l47 -321h-64q-19 153 -75.5 203.5t-211.5 50.5h-202q-36 0 -45.5 -5t-9.5 -35v-304h124q97 0 124 28.5t27 124.5h65v-374h-65q0 96 -27.5 125t-123.5 29h-124v-339q0 -30 9.5 -35t45.5 -5h210 q172 0 237 67q53 56 85 232h64l-70 -365h-896zM688 857q-53 0 -53 -31v-716q0 -14 6 -25q10 -19 169 -19h46v-67q-80 5 -123 5h-354q-44 0 -124 -5v67q10 0 36 -0.5t40 -0.5q129 0 140 20q4 8 4 25v717q0 30 -60 30q-188 0 -236.5 -38.5t-65.5 -216.5h-62l30 321h950 l30 -321h-63q-17 182 -72 222q-44 33 -238 33z" />
+<glyph unicode="&#x2122;" horiz-adv-x="2444" d="M2392 1435l-78 2q-78 0 -78 -45v-707q0 -13 5 -23q9 -17 136 -17h15v-67q-72 5 -99 5h-266q-23 0 -95 -5v67q116 0 136 7t20 34v706l-349 -781q-14 -32 -39 -32t-41 36l-344 767v-656q0 -81 152 -81h4v-66q-160 4 -188.5 4t-190.5 -4v66h4q152 0 152 81v670q0 12 -4 21 q-8 18 -138 18h-14v67h275q43 0 59 -36l317 -710l319 714q14 32 49 32h281v-67zM688 1436q-53 0 -53 -31v-716q0 -14 6 -25q10 -19 169 -19h46v-67q-80 5 -123 5h-354q-44 0 -124 -5v67q10 0 36 -0.5t40 -0.5q129 0 140 20q4 8 4 25v717q0 30 -60 30q-188 0 -236.5 -38.5 t-65.5 -216.5h-62l30 321h950l30 -321h-63q-17 182 -72 222q-44 33 -238 33z" />
+<glyph unicode="&#x2123;" horiz-adv-x="1536" d="M814 -6q-14 -37 -46.5 -37t-48.5 43l-165 436l-299 -641q-23 -49 -48 -49q-41 0 -41 37q0 14 15 46l333 714l-252 666q-22 57 -81 71q-20 5 -67 5q-20 0 -46 -1v62q213 -6 336 -6t196 6v-62h-18q-144 0 -144 -56q0 -31 172 -477l289 618l-320 148q-48 22 -48 47 q0 42 37 42q16 0 46 -14l333 -155q47 -22 47 -44q0 -14 -15 -46l-328 -702l175 -448l361 950q9 24 9 40q0 94 -143 97v62q153 -6 237.5 -6t177.5 6v-62q-164 -1 -214 -132z" />
+<glyph unicode="&#x2124;" horiz-adv-x="1351" d="M1157 0h-1069q-35 0 -35 39q0 10 749 1229h-147q-326 0 -431 -191l-23 -73q-16 -50 -43 -50q-37 0 -37 33v7l35 314q4 35 33 35h961q35 0 35 -37q0 -12 -4 -19l-744 -1212h277q135 0 247 66.5t173 184.5l38 121q12 32 37 32q37 0 37 -29q0 -3 -1 -7l-56 -407 q-5 -36 -32 -36zM318 1268h-91l-8 -74q42 43 99 74zM1081 1268h-191l-731 -1193h190zM1135 192q-59 -70 -139 -117h123z" />
+<glyph unicode="&#x2125;" horiz-adv-x="904" d="M755.5 304.5q112.5 -119.5 112.5 -305.5t-132 -309.5t-330 -123.5q-121 0 -215 54q-113 64 -113 170t97 106q42 0 70.5 -28t28.5 -70q0 -94 -100 -99q79 -78 229 -78q59 0 120 34q168 94 168 344q0 112 -44.5 210.5t-133.5 146.5q-63 34 -123 34q-113 0 -181 -64 q-40 -37 -74 -109.5t-53 -72.5q-29 0 -29 22.5t32.5 84.5t116.5 133l436 370h-504q-43 0 -43 29q0 17 20 36l517 476h-193q-147 0 -211 -51t-73 -188h-54l19 287h665q43 0 43 -28q0 -16 -20 -34l-520 -479h507q43 0 43 -28q0 -17 -20 -34l-348 -299q177 -17 289.5 -136.5z " />
+<glyph unicode="&#x2126;" horiz-adv-x="1462" d="M984 0q-25 0 -31.5 7t-6.5 33q0 150 101 423t101 423q0 184 -117 322t-300 138t-300 -138t-117 -322q0 -150 101.5 -423t101.5 -423q0 -40 -39 -40h-347l-64 320h49q17 -111 36.5 -144t36.5 -40.5t57 -7.5h214q-27 111 -120 256q-144 223 -153 240q-76 141 -76 272 q0 220 204 364q185 130 416 130t416 -130q204 -144 204 -364q0 -131 -76 -272q-9 -18 -153 -240q-93 -145 -120 -256h214q40 0 57 7.5t36.5 40.5t36.5 144h49l-64 -320h-347z" />
+<glyph unicode="&#x2127;" horiz-adv-x="1462" d="M1216 1215h-214q27 -111 120 -256q144 -223 153 -240q76 -141 76 -272q0 -220 -204 -364q-185 -130 -416 -130t-415 130q-205 144 -205 364q0 131 76 272q9 17 153 240q93 145 120 256h-214q-40 0 -57 -7.5t-36.5 -40.5t-36.5 -144h-49l64 320h347q39 0 39 -40 q0 -150 -101.5 -423t-101.5 -423q0 -184 117 -322t300 -138t300 138t117 322q0 150 -101 423t-101 423q0 26 6.5 33t31.5 7h347l64 -320h-49q-17 111 -36.5 144t-36.5 40.5t-57 7.5z" />
+<glyph unicode="&#x2128;" horiz-adv-x="1358" d="M1184 164q0 -236 -187 -373q-167 -123 -411 -123q-174 0 -270 94q-44 43 -110 173q-47 94 -102 94q-76 0 -86 -103h-32q9 76 66.5 123t133.5 47q122 0 195 -100l112 -186q71 -101 189 -101q291 0 291 402q0 483 -252 483q-146 0 -197 -141l-30 16q39 103 149 143 q-95 39 -143 125l26 21q70 -117 174 -117q123 0 187 101q55 85 55 212q0 169 -72 272q-82 117 -243 117q-138 0 -255.5 -87.5t-117.5 -221.5q0 -54 20 -98l-26 -14q-27 60 -27 116q0 155 132 248.5t306 93.5t315 -96q161 -109 161 -289q0 -135 -108 -239q-91 -88 -234 -135 q179 -38 285 -157.5t106 -299.5z" />
+<glyph unicode="&#x2129;" horiz-adv-x="748" d="M396 662q0 231 -148 231q-102 0 -131 -139q-12 -56 -12 -182v-37h-53v122q0 114 48 194q58 96 164 96q133 0 203 -78t70 -212v-473q0 -86 41 -106q20 -11 103 -11h14v-67l-299 -23v685z" />
+<glyph unicode="&#x212a;" horiz-adv-x="2219" d="M1349 1284l-57 2q-126 0 -142 -40q-6 -15 -6 -44v-636l618 588q36 34 36 67q0 61 -91 63v62q69 -6 217.5 -6t201.5 6v-62q-160 -2 -281 -118l-356 -340l456 -670q42 -62 83.5 -78.5t122.5 -16.5v-61q-127 6 -281.5 6t-225.5 -6v61h4q113 0 113 59q0 22 -31 68l-357 528 l-229 -218v-359q0 -28 9 -45q17 -33 186 -33h10v-61q-71 6 -120 6h-347q-43 0 -114 -6v61q8 0 26.5 -0.5t28.5 -0.5q125 0 141 40q6 15 6 44v1066q0 27 -7 41q-16 33 -176 33h-19v62q70 -6 119 -6h342q50 0 120 6v-62zM623.5 1296.5q89.5 -89.5 89.5 -218t-90 -218 t-218 -89.5t-217.5 89.5t-89.5 218t89 218t218 89.5t218.5 -89.5zM563 921q65 65 65 158.5t-64.5 158t-158.5 64.5t-158.5 -64.5t-64.5 -158t65 -158.5t158 -65t158 65z" />
+<glyph unicode="&#x212b;" horiz-adv-x="1484" d="M1417 0q-127 6 -297.5 6t-244.5 -6v61h5q157 0 157 59q0 29 -39 136l-70 192h-487l-61 -163q-34 -90 -34 -123q0 -51 52 -78q42 -23 97 -23v-61q-189 6 -239.5 6t-187.5 -6v61q174 2 219 133l358 1029q-104 58 -104 178q0 84 58.5 144.5t142.5 60.5t142.5 -59.5 t58.5 -143.5q0 -121 -104 -180l374 -1083q21 -61 84 -75q19 -5 77 -5q19 0 43 1v-61zM873 1403q0 54 -38.5 93.5t-92 39.5t-92.5 -40.5t-39 -94.5t38.5 -93.5t92 -39.5t92.5 40.5t39 94.5zM906 510l-222 641l-220 -641h442z" />
+<glyph unicode="&#x212c;" horiz-adv-x="1734" d="M1828 1119q0 -127 -133 -234q-73 -58 -245 -143q251 -100 251 -297q0 -169 -165.5 -314t-336.5 -145q-66 0 -110 37t-44 101q0 179 214 295l16 -27q-80 -43 -139 -116t-59 -154q0 -40 25.5 -70.5t64.5 -30.5q81 0 189 165q129 198 129 380q0 109 -79 159 q-82 -31 -129.5 -31t-47.5 31q0 46 80 46q42 0 95 -15q99 36 165.5 172.5t66.5 253.5t-72 164q-161 -88 -240 -238q-42 -80 -111 -323l-42 -148q-83 -294 -276 -466q-209 -187 -501 -187q-146 0 -243 60q-116 73 -116 211q0 81 49 135.5t128 54.5q49 0 88.5 -31.5 t39.5 -86.5t-57 -86l-108 -39q-55 -19 -55 -56q0 -62 96 -101q75 -30 149 -30q157 0 273 132q74 82 163 270l129 271q150 314 323 478q116 110 279 196q-117 42 -276 42q-245 0 -488 -87.5t-383 -254.5q-104 -124 -104 -243q0 -65 40.5 -110.5t110 -45.5t169.5 65 q126 82 204.5 216.5t89.5 285.5l27 8q14 -93 14 -151q0 -184 -94 -306q-127 -165 -341 -165q-104 0 -178 51.5t-74 151.5q0 128 111 260q150 178 395.5 267t505.5 89q167 0 327 -45q55 25 147 49l8 -29q-67 -19 -114 -37q199 -88 199 -254z" />
+<glyph unicode="&#x212d;" horiz-adv-x="1257" d="M713 -8q-277 0 -451 226q-160 208 -160 493q0 216 74 405q98 250 279 250q139 0 188 -160l154 193q148 -96 233 -96t139 71l29 -16q-125 -182 -278 -182q-78 0 -201 65q-70 -70 -70 -129q0 -84 106.5 -256t106.5 -260q0 -167 -182 -326l-21 29q66 56 66 138.5 t-96.5 245.5t-96.5 259.5t82 224.5q-8 63 -47 110.5t-98 47.5q-207 0 -207 -465q0 -287 95 -473q123 -242 382 -242q348 0 453 224h33q-133 -377 -512 -377z" />
+<glyph unicode="&#x212e;" horiz-adv-x="1188" d="M1120 648q0 -34 -8.5 -42t-42.5 -8h-755v-294q0 -15 33 -77q101 -194 326 -194q267 0 382 267q14 33 30 33q28 0 28 -33t-41 -100q-64 -105 -176 -164.5t-237 -59.5q-262 0 -426.5 173t-164.5 437q0 229 165.5 396t387.5 167t360.5 -143t138.5 -358zM921 644v211 q-90 243 -293 243q-225 0 -314 -245v-209h607z" />
+<glyph unicode="&#x212f;" horiz-adv-x="940" d="M966 236q0 -17 -46 -67q-179 -193 -439 -193q-157 0 -243 112.5t-86 282.5t92 315.5t252 221.5q107 51 205.5 51t167 -48.5t68.5 -134.5q0 -183 -230 -243q-118 -30 -377 -30q-34 -147 -34 -224q0 -260 191 -260q221 0 365 148q90 93 92 93q22 0 22 -24zM872 776 q0 66 -47 102.5t-115 36.5q-139 0 -243 -119q-85 -98 -128 -249h110q423 0 423 229z" />
+<glyph unicode="&#x2130;" horiz-adv-x="1204" d="M1429 1172q0 -100 -63.5 -183t-161.5 -83q-63 0 -102 45t-39 109q0 121 157 215l20 -22q-122 -103 -122 -220q0 -40 25.5 -69.5t65.5 -29.5q82 0 135 77.5t53 168.5t-61 155.5t-157 64.5q-140 0 -251.5 -125t-111.5 -267q0 -71 33 -137q31 1 68.5 1t98.5 -16 q87 -23 87 -66q0 -49 -79 -49q-100 0 -232 78q-168 -54 -275 -213.5t-107 -340.5q0 -252 261 -252q156 0 278 82t168 228q16 51 16 100t-35.5 92t-104.5 43t-141 -74q-116 -119 -120 -315h-31q-25 61 -25 123q0 126 86.5 215t212.5 89q81 0 136.5 -51.5t55.5 -131.5 q0 -148 -119 -275q-147 -157 -381 -157q-197 0 -334 107q-156 122 -156 312t190 321q151 103 370 139q-120 109 -120 244.5t132 236.5t346 101q146 0 233 -60q101 -70 101 -210zM1010 773q38 0 38 22t-47.5 34t-73.5 12t-55 -4q68 -64 138 -64z" />
+<glyph unicode="&#x2131;" horiz-adv-x="1414" d="M1623 1225q-100 0 -284.5 77.5t-292.5 77.5q-168 0 -338 -100q-135 -79 -232.5 -201t-97.5 -257q0 -72 44 -123.5t115 -51.5q115 0 249 202q104 157 104 280q0 58 -28 127l31 7q70 -156 70 -277q0 -156 -117.5 -264.5t-274.5 -108.5q-99 0 -162.5 55t-63.5 152 q0 206 210 387q270 233 639 233q103 0 189 -16q274 -51 351 -51t146 60l24 -17q-126 -191 -281 -191zM1563 793q0 -47 -46 -94q-16 -15 -86 -68q-2 -165 -61 -261q-94 -15 -165 -34q75 118 130 260q-56 -18 -110 -23q-36 -145 -136 -280q-234 -314 -615 -314 q-181 0 -269.5 83t-88.5 186q0 77 51.5 133.5t128.5 56.5q48 0 88.5 -31.5t40.5 -85t-56 -83.5l-104 -39q-56 -23 -56 -63t63.5 -81.5t164.5 -41.5q157 0 271 130q69 79 159 269l69 146q-194 -29 -346 -178l-22 23q93 89 176 131t206 58q215 441 490 613l22 -22 q-59 -42 -89 -102t-65 -197l-74 -277q57 5 116 25q40 104 56 133q46 81 101.5 81t55.5 -53zM1528 791q0 23 -24 23q-48 0 -69 -141q93 67 93 118z" />
+<glyph unicode="&#x2132;" horiz-adv-x="1271" d="M1203 0h-1081l-54 442h49q24 -217 89 -291q77 -89 286 -89h252q45 0 64 11.5t19 67.5v501h-170q-132 0 -171 -48t-39 -183h-48v522h48q0 -136 39 -183.5t171 -47.5h170v497q0 27 -7 44q-16 39 -209 39h-37v61q74 -6 135 -6h373q49 0 121 6v-61h-75q-64 0 -88 -10 q-39 -18 -39 -73v-1056q0 -25 6 -42q14 -39 166 -39h30v-62z" />
+<glyph unicode="&#x2133;" horiz-adv-x="2418" d="M2539 1341q109 87 142 87t33 -21.5t-47 -87.5t-125 -201.5t-129 -241.5q-347 -726 -347 -829q0 -31 29 -31q54 0 177 132q90 96 153 186l28 -17q-253 -337 -384 -337q-76 0 -117 72t-41 153q0 246 275 626q133 184 460 546q-373 -239 -846 -960l-164 -243 q-29 -43 -91 -123q-61 -69 -96.5 -69t-72 48.5t-36.5 147.5q0 243 229 617q112 182 397 556q-221 -192 -586 -648q-249 -310 -692 -599q-186 -121 -222 -121t-36 25q0 14 45 59q493 488 622 937q32 111 32 198q0 201 -205 201q-236 0 -482.5 -214t-246.5 -446 q0 -81 47.5 -139t127.5 -58q135 0 278.5 223t143.5 375q0 32 -9 95l28 6q48 -138 48 -258q0 -154 -85.5 -277.5t-230.5 -174.5q-71 -25 -137 -25q-110 0 -176.5 62.5t-66.5 171.5q0 182 156 364q134 158 306 244.5t337 86.5t282.5 -93.5t117.5 -255.5q0 -299 -445 -786 q260 204 471.5 467t273.5 332q163 185 317 299q34 25 49 25q29 0 29 -23q0 -11 -13 -34q-158 -275 -350 -774l-118 -315q-27 -75 -74 -228q62 64 271 382q408 621 766 906z" />
+<glyph unicode="&#x2134;" horiz-adv-x="854" d="M458 247l9 -125q0 -13 -19.5 -13t-22.5 11q-9 37 -9 142.5t38.5 246.5t104 216t129.5 75q142 0 142 -194t-115 -397q-132 -233 -303 -233q-143 0 -217.5 91.5t-74.5 237.5q0 243 165.5 448.5t402.5 205.5q70 0 123 -40.5t53 -108.5q0 -17 -21.5 -17t-21.5 20 q0 47 -36.5 76.5t-84.5 29.5q-180 0 -304 -261q-103 -217 -103 -429t119 -212q151 0 261 230q92 194 92 366q0 147 -75 147q-61 0 -123 -96q-50 -77 -79.5 -196.5t-29.5 -220.5z" />
+<glyph unicode="&#x2135;" horiz-adv-x="1417" d="M248 1363l-14 -72q0 -86 94 -182q73 -75 135 -126l360 -297l264 330q-126 102 -126 190q0 139 181 175q-38 -54 -38 -93q0 -64 111.5 -157.5t111.5 -171.5t-89 -128q-28 94 -102 149l-268 -333l213 -179q145 -130 178 -196q21 -42 21 -81q0 -88 -78 -175q-48 -53 -67 -53 t-19 17q0 8 13 43t13 57q0 73 -77 154q-26 28 -135 118l-586 485q-124 -148 -124 -251.5t138 -241.5t138 -215q0 -166 -250 -166q-83 0 -83 31q0 3 46.5 31t46.5 73.5t-51 151.5t-62.5 146.5t-11.5 104.5q0 155 175 368l-142 136q-74 71 -74 149q0 47 26 98q66 129 112 129 q20 0 20 -18z" />
+<glyph unicode="&#x2136;" horiz-adv-x="1366" d="M1186 179l40 2q50 0 50 -41q0 -17 -9 -26l-109 -104q-10 -10 -27 -10h-1006q-35 0 -35 39q0 17 14 33.5t66 61.5t67 45h871v804q0 60 -86 60h-450q-191 0 -272 38q-122 57 -122 226q0 74 35 74q17 0 41 -45.5t29 -50.5q61 -62 289 -62h456q101 0 135 -60q23 -42 23 -152 v-832z" />
+<glyph unicode="&#x2137;" horiz-adv-x="950" d="M757 1223q103 0 103 -91q0 -89 -101 -89h-2q0 -22 35 -366t35 -552t-76 -208q-48 0 -66 167q-80 -84 -98 -84h-462q-35 0 -35 39q0 17 15 34.5t66 61.5t66 44h441v864q-19 0 -61 -0.5t-63 -0.5q-178 0 -261 43q-115 60 -115 222q0 74 35 74q17 0 41.5 -46t28.5 -50 q58 -62 289 -62h185z" />
+<glyph unicode="&#x2138;" horiz-adv-x="1297" d="M1103 1223q104 0 104 -91q0 -89 -102 -89h-2q0 -27 35.5 -371.5t35.5 -549.5t-76 -205q-39 0 -60 119q-14 82 -14 159v848h-541q-191 0 -271 38q-122 57 -122 226q0 74 35 74q17 0 42.5 -46.5t28.5 -49.5q58 -62 287 -62h620z" />
+<glyph unicode="&#x2139;" horiz-adv-x="922" d="M831 1267q0 -68 -54 -116.5t-123 -48.5q-151 0 -151 166q0 62 55 110t118 48q155 0 155 -159zM723 349q28 -11 28 -33.5t-20 -47.5q-228 -290 -462 -290q-133 0 -133 125q0 95 51 225l195 497q4 10 4 20q0 31 -29 31q-42 0 -129 -96t-98 -96q-7 0 -11 4q-18 5 -18 25 t44 72q200 236 410 236q150 0 150 -141q0 -52 -20 -106l-177 -475q-25 -67 -25 -102.5t23 -35.5q39 0 123 93.5t94 94.5z" />
+<glyph unicode="&#x213a;" horiz-adv-x="1457" d="M734 1267q281 0 468.5 -214t187.5 -498.5t-186.5 -502.5t-468 -218t-468 217.5t-186.5 503.5q0 209 107 390.5t292 265.5q-62 192 -188 192q-138 0 -180 -166q-9 -35 -21 -35q-23 0 -23 41q0 135 52 236q65 127 189 127t183 -130q34 -73 56 -239q95 30 186 30z M816.5 1012.5q34.5 36.5 34.5 87t-33 84.5t-84 34q-92 0 -174 -46q36 -196 172 -196q50 0 84.5 36.5zM1195 555q0 213 -69 375q-86 199 -259 263q28 -45 28 -103.5t-47.5 -107.5t-115.5 -49q-144 0 -221 208q-233 -172 -233 -586q0 -455 262 -613q96 -58 194.5 -58t193.5 56 q267 157 267 615z" />
+<glyph unicode="&#x213b;" horiz-adv-x="3003" d="M2950 -1q-122 5 -248 5t-195 -5v67q99 3 99 27q0 3 -234 309q-218 -279 -218 -288q0 -46 95 -48v-67q-71 5 -147 5t-240 -4v66q157 0 222 83l243 311l-273 358q-25 32 -80 39q-11 2 -42 2q-20 0 -50 -1v68q107 -5 240.5 -5t202.5 5v-67q-98 -3 -98 -27q0 -9 193 -253 q174 224 174 232q0 46 -93 48v67q78 -5 146.5 -5t239.5 4v-67q-160 -1 -222 -80l-202 -257l314 -413q26 -34 80 -41q11 -2 42 -2q21 0 51 1v-67zM1835 -1q-122 5 -246.5 5t-195.5 -5v67h25q99 0 99 27q0 18 -79 206h-358q-69 -159 -69 -178q0 -55 115 -55v-66q-145 4 -197 4 t-157 -4v66q138 2 170 81l314 787q14 34 47 34t47 -34l327 -823q15 -38 69 -45q5 -1 27.5 -0.5t61.5 0.5v-67zM612 856h-194q-33 0 -42 -5.5t-9 -34.5v-322h118q97 0 123 30.5t26 123.5h62v-374h-62q0 94 -26 124t-123 30h-118v-319q0 -15 4 -24q9 -19 149 -19h41v-67 q-71 5 -109 5h-301q-30 0 -99 -5v67q117 0 136.5 7.5t19.5 35.5v706q0 13 -4 23q-8 19 -111 19q-19 0 -41 -1v67h855l45 -321h-63q-19 152 -71.5 203t-205.5 51zM1411 366l-152 382l-151 -382h303z" />
+<glyph unicode="&#x213c;" horiz-adv-x="1421" d="M1498 897.5q25 -25.5 25 -67t-34.5 -77t-82.5 -35.5h-254q-6 -81 -6 -127q0 -105 28 -197t73 -174.5t45 -101.5q0 -57 -52.5 -100.5t-111.5 -43.5q-91 0 -140 135q-35 100 -35 235t50 374h-246l-103 -492q-29 -141 -44 -169q-40 -81 -142 -81q-43 0 -86 27t-43 63.5 t55 155.5l101 214q69 152 111 282h-153q-172 0 -230 -75q-36 -47 -65.5 -47t-29.5 28q0 7 6 17q162 282 374 282h930q35 0 60 -25.5zM1448 837q0 11 -10 11h-930q-82 0 -161 -63q45 8 106 8h953q42 0 42 44zM1071 591q0 44 4 105q-47 -230 -47 -373q0 -69 22 -156 q30 -118 78 -118q33 0 60 25t27 46l-100 225q-44 117 -44 246zM468 51q63 0 88 68l119 575q-64 -180 -144.5 -352.5t-117.5 -267.5q17 -23 55 -23z" />
+<glyph unicode="&#x213d;" horiz-adv-x="1424" d="M1509 897q0 -9 -13 -26q-208 -269 -313 -505q-65 -146 -77 -313q-2 -77 -10 -230q-18 -265 -181 -265q-44 0 -72 34.5t-28 79.5q0 108 111 333.5t111 372.5q0 178 -148 268q-122 74 -297.5 74t-248.5 -86l-39 -60q-28 -42 -50 -42q-37 0 -37 37q0 5 3 12 q153 378 482.5 378t419.5 -554q278 530 352 530q35 0 35 -38zM966 685q-95 199 -261.5 199t-280.5 -114q75 25 153 25q241 0 389 -110zM890 -328q0 -39 25 -39q115 0 115 341v32q0 43 2 61l-95 -205q-47 -111 -47 -190z" />
+<glyph unicode="&#x213e;" horiz-adv-x="1268" d="M1167 991q0 -37 -35 -37q-39 0 -39 37q0 133 -129 211q-109 66 -252 66h-121q-55 0 -55 -111v-988q0 -70 51 -86q26 -8 125 -8q41 0 41 -36q0 -39 -35 -39h-631q-34 0 -34 39q0 36 57 36q78 0 96.5 19t18.5 92v975q0 74 -27 92q-19 14 -97 14q-48 0 -48 38t34 38h1048 q32 0 32 -35v-317zM1092 1268h-92q54 -32 92 -74v74zM300 1161v-975q0 -71 -17 -111h197q-19 36 -19 94v988q0 64 21 111h-200q18 -39 18 -107z" />
+<glyph unicode="&#x213f;" horiz-adv-x="1666" d="M1463 76q48 0 48 -38t-35 -38h-599q-33 0 -33 39q0 36 55 36q78 0 97 19t19 92v982q0 63 -22 81.5t-84 18.5h-255q-53 0 -76 -12q-30 -14 -30 -99v-982q0 -69 30 -87q19 -12 94 -12q48 0 48 -38t-35 -38h-599q-33 0 -33 39q0 36 57 36q78 0 96.5 19t18.5 92v982 q0 99 -87 99q-6 0 -17.5 -0.5t-16.5 -0.5q-51 0 -51 38.5t33 38.5h1390q35 0 35 -37.5t-57 -37.5q-77 0 -96.5 -19t-19.5 -92v-982q0 -69 25.5 -84t99.5 -15zM1263 175v982q0 72 17 111h-208q18 -38 18 -100v-982q0 -72 -17 -111h208q-18 38 -18 100zM300 1168v-982 q0 -71 -17 -111h208q-18 38 -18 100v982q0 71 18 111h-213q22 -41 22 -100z" />
+<glyph unicode="&#x2140;" horiz-adv-x="1377" d="M1157 0h-1069q-35 0 -35 39q0 10 383 631l-379 617q-4 7 -4 19q0 37 34 37h1085q31 0 35 -35l34 -314v-7q0 -33 -37 -33q-26 0 -40 44l-26 79q-51 101 -187 151q-109 40 -244 40h-272l368 -598l-366 -595h277q133 0 247 67t173 184q11 41 38 121q12 32 37 32q37 0 37 -29 q0 -3 -1 -7l-56 -407q-5 -36 -32 -36zM1144 1197l-8 71h-90q57 -30 98 -71zM1135 192q-59 -70 -140 -117h124zM715 670l-368 598h-190l367 -598l-353 -573q-6 -11 -15 -22h193z" />
+<glyph unicode="&#x2141;" horiz-adv-x="1438" d="M638 1390q317 0 495 -201.5t178 -516.5t-168 -509q-177 -206 -481 -206q-236 0 -430 100q-52 27 -78.5 46.5t-26.5 47.5t19.5 49t41 21t40.5 -11q210 -123 434 -123q250 0 384.5 162t134.5 423t-140 424.5t-403 163.5q-170 0 -348 -69v-364h311q65 0 65 -65t-65 -65h-376 q-26 0 -45.5 19.5t-19.5 45.5v473q0 74 206 120q154 35 272 35z" />
+<glyph unicode="&#x2142;" horiz-adv-x="1122" d="M1019 22q0 -65 -65 -65t-65 65v1191h-770q-65 0 -65 65t65 65h835q26 0 45.5 -19.5t19.5 -45.5v-1256z" />
+<glyph unicode="&#x2143;" horiz-adv-x="1122" d="M1019 65q0 -26 -19.5 -45.5t-45.5 -19.5h-835q-65 0 -65 65t65 65h770v1191q0 65 65 65t65 -65v-1256z" />
+<glyph unicode="&#x2144;" horiz-adv-x="1131" d="M1050 78q11 -17 11 -39.5t-20.5 -42t-50.5 -19.5t-50 31l-374 589l-375 -589q-20 -31 -50 -31t-50.5 19.5t-20.5 42t11 39.5l420 659v584q0 65 65 65t65 -65v-584z" />
+<glyph unicode="&#x2145;" horiz-adv-x="1410" d="M1393 853q0 -80 -17 -155q-70 -310 -292.5 -504t-534.5 -194h-606l-22 13q-3 7 -3 17q0 36 40 45q14 3 68 3q64 0 87 108l206 970q8 38 8 59q0 41 -41 49q-9 2 -74 2l-22 13q-3 7 -3 20t13.5 28.5t29.5 15.5h605q243 0 400.5 -126.5t157.5 -363.5zM1316 836 q0 299 -274 397q84 -110 84 -314t-85.5 -442.5t-225.5 -359.5q190 67 316.5 222.5t169.5 358.5q15 71 15 138zM1049 906q0 360 -260 360q-120 0 -137 -79l-220 -1033q-2 -9 -2 -14q0 -63 93 -63q372 0 503 618q23 109 23 211zM399 1268q4 -16 4 -43t-9 -69l-206 -970 q-14 -68 -43 -111h220q-11 22 -11 43.5t3 35.5l220 1033q10 47 42 81h-220z" />
+<glyph unicode="&#x2146;" horiz-adv-x="1349" d="M1419 309q0 -112 -89.5 -222.5t-200.5 -110.5q-182 0 -281 113q-143 -113 -293 -113q-181 0 -292 97.5t-111 276.5q0 254 173.5 431.5t426.5 177.5q119 0 210 -73l93 431q3 13 3 24q0 47 -46 47h-6l-53 -3q-39 -2 -39 38q0 35 36 37l380 16h4q41 0 41 -36q0 -2 -1 -6 l-261 -1217q-7 -33 -7 -78q0 -85 31 -85q129 0 188 192q5 24 20 71q12 29 36 29q38 0 38 -37zM1042 60q-11 25 -11 95.5t9 112.5l250 1131l-163 -7q7 -19 7 -43q0 -22 -6 -48l-235 -1108q-2 -13 -7 -38q68 -77 156 -95zM934 767q-48 106 -169.5 106t-196.5 -143 q-43 -83 -79 -250t-36 -253q0 -166 126 -166q134 0 239 132q0 18 3 34zM227 350q0 -216 187 -278q-36 62 -36 162t38.5 271.5t85.5 259.5q25 47 56 83q-152 -60 -241.5 -196.5t-89.5 -301.5z" />
+<glyph unicode="&#x2147;" horiz-adv-x="1175" d="M1195 198q0 -13 -9 -24q-159 -198 -551 -198q-205 0 -344 103.5t-139 302.5q0 264 213 428q195 149 467 149q121 0 213 -49q113 -60 113 -170q0 -189 -264 -253q-139 -34 -414 -34q-25 -103 -25 -187t50 -149.5t130 -65.5q286 0 434 114q18 14 59 57q14 14 28 14 q39 0 39 -38zM1083 740q0 63 -72.5 103.5t-172 40.5t-132 -17t-82.5 -78q-69 -83 -124 -261q583 0 583 212zM227 382q0 -220 209 -298q-56 83 -56 198.5t57 290.5t131 264q-154 -58 -247.5 -176.5t-93.5 -278.5z" />
+<glyph unicode="&#x2148;" horiz-adv-x="894" d="M804 1473q44 -43 44 -112.5t-58.5 -126t-128 -56.5t-114 42.5t-44.5 112.5t58.5 126.5t128.5 56.5t114 -43zM919 314q0 -6 -2 -13q-105 -325 -359 -325q-101 0 -184 48q-99 56 -99 149q0 32 14 70l173 474q23 63 23 114t-25 51q-77 0 -171 -87t-94 -164q0 -37 -37.5 -37 t-37.5 37q0 117 120.5 222.5t230.5 105.5t193 -48q99 -57 99 -151q0 -31 -13 -66l-174 -475q-25 -68 -25 -118t21 -50q149 0 239 187q10 29 34 86q13 26 35 26q39 0 39 -36zM737 1287q36 34 36 72.5t-22 60t-61 21.5t-75.5 -34.5t-36.5 -80.5q0 -73 77 -73q46 0 82 34z M688 760q0 82 -132 115q4 -18 4 -38q0 -70 -28 -146l-173 -474q-9 -26 -9 -44q0 -79 129 -112q-3 15 -3 31q0 72 30 153l174 475q8 23 8 40z" />
+<glyph unicode="&#x2149;" horiz-adv-x="770" d="M839 1472.5q45 -43.5 45 -113.5t-58 -125.5t-128.5 -55.5t-115 42.5t-44.5 112t58 126.5t128 57t115 -43.5zM790 743q0 -18 -5 -41l-180 -830q-32 -148 -193 -236q-141 -77 -309 -77q-87 0 -159 37q-89 46 -89 125q0 64 46.5 110t102 46t88.5 -30.5t33 -77.5 q0 -78 -65 -121q14 -3 24 -3q87 0 149.5 78t83.5 173l175 812q14 66 14 105q0 70 -46 70q-81 0 -162.5 -54t-128.5 -127l-43 -83q-13 -24 -34 -24q-39 0 -39 36q0 7 3 15q52 134 167.5 223.5t242 89.5t216.5 -50q108 -61 108 -166zM773 1286.5q36 33.5 36 72.5t-23.5 60.5 t-62.5 21.5t-74.5 -34.5t-35.5 -80.5q0 -73 78 -73q46 0 82 33.5zM715 743q0 92 -141 129q7 -26 7 -66t-16 -114l-175 -812q-28 -129 -111 -219q218 68 253 227l180 830q3 15 3 25zM-22 -337q7 19 39.5 46.5t32.5 60t-35.5 32.5t-60 -24t-24.5 -57t48 -58z" />
+<glyph unicode="&#x214a;" horiz-adv-x="1595" d="M1299 1039q196 -91 196 -334.5t-202 -339.5q-142 -68 -420 -68h-78v-167h546q65 0 65 -65t-65 -65h-611q-26 0 -45.5 19.5t-19.5 45.5v907h-370v-610q0 -65 -65 -65t-65 65v675q0 26 19.5 45.5t45.5 19.5h435v219q0 65 65 65t65 -65v-219h99q269 0 405 -63zM1198 468 q167 65 167 237t-163 231q-98 36 -303 36h-104v-546h84q213 0 319 42z" />
+<glyph unicode="&#x214b;" horiz-adv-x="1500" d="M1411 1091q0 -73 -42 -136q-20 -31 -105 -119l-166 -177q79 -200 79 -392q0 -121 -72 -215t-190 -94q-87 0 -132 85q-36 68 -36 163q0 130 235 390q-99 258 -319 514q-61 -75 -174.5 -246.5t-113.5 -211.5q0 -85 134 -85h3v-61q-87 6 -199 6t-224 -6v61q116 1 177 49 q44 34 121.5 166.5t128 211t116.5 154.5q-145 173 -266 173q-90 0 -151.5 -63.5t-65.5 -153.5h-48q3 117 79 196.5t193 79.5q172 0 340 -146q163 146 349 146q136 0 242.5 -78.5t106.5 -210.5zM1081 703q91 87 130.5 154t39.5 175t-47 190q-56 99 -158 99q-157 0 -297 -125 q192 -192 332 -493zM1056 223q0 154 -58 326q-202 -218 -202 -345q0 -73 23 -128q30 -76 99 -76t108 78q30 61 30 145z" />
+<glyph unicode="&#x214c;" horiz-adv-x="1483" d="M1293 801q95 -99 95 -237t-127 -231l-30 43q98 74 98 187q0 93 -74 160q-161 -199 -402 -255q18 -126 18 -209q0 -309 -216 -309q-137 0 -194 64t-57 187t29 269q-285 63 -285 246q0 115 126 192q101 62 258 88q17 134 17 222t-52 114q-35 18 -104.5 18t-116.5 -17 q-63 -23 -63 -64.5t40 -51.5q15 -4 73 -4q18 0 18 -19q0 -58 -85 -58h-3q-161 40 -161 192t148 152q32 0 94 -14t88.5 -14t64 15t57.5 15q55 0 55 -74q0 -169 -14 -404q49 6 86 6t71 -2q-3 63 -3 122q0 210 77 284q59 57 143 57q119 0 237 -102q143 -124 143 -365 q0 -80 -49 -203zM1150 1017q0 419 -187 419q-116 0 -152 -124q-19 -64 -19 -219q0 -43 2 -90q202 -22 354 -99q2 50 2 113zM1142 818q-146 93 -343 107q15 -208 46 -407q138 29 209.5 95.5t87.5 204.5zM750 928h-54q-40 0 -114 -10l-27 -414q53 -5 111 -5t128 10 q-17 140 -44 419zM219 679q0 -111 225 -158q24 101 63 305l12 82q-300 -59 -300 -229zM817 245q0 53 -17 212q-71 -11 -133.5 -11t-114.5 5q-6 -140 -6 -234t34 -150.5t100 -56.5q137 0 137 235z" />
+<glyph unicode="&#x214d;" horiz-adv-x="2070" d="M1782 267q105 -27 170.5 -100.5t65.5 -187.5t-92.5 -195.5t-218.5 -81.5q-175 0 -276 86q-64 -86 -81 -86q-28 0 -28 32v288q0 32 31 32q36 0 36 -60q0 -90 85 -158t232 -68q78 0 134 50t56 119.5t-43.5 118t-140.5 69.5l-183 39q-90 29 -148.5 96t-58.5 157 q0 118 93 193t220 75t234 -87q62 87 78 87q31 0 31 -34v-287q0 -31 -34 -31q-22 0 -28 25l-21 80q-58 185 -265 185q-74 0 -130 -44t-56 -116q0 -104 126 -148zM1840 1455l-1155 -1746h-89l1155 1746h89zM1115 578q-122 5 -246.5 5t-195.5 -5v67h25q99 0 99 27q0 18 -79 206 h-358q-69 -159 -69 -178q0 -55 115 -55v-66q-145 4 -197 4t-157 -4v66q138 2 170 81l314 787q14 34 47 34t47 -34l327 -823q15 -38 69 -45q5 0 27.5 -0.5t61.5 0.5v-67zM691 945l-152 382l-151 -382h303z" />
+<glyph unicode="&#x214e;" horiz-adv-x="1003" d="M952 -1h-855l-45 321h63q19 -152 71.5 -203t205.5 -51h194q33 0 42 5.5t9 34.5v322h-118q-97 0 -123 -30.5t-26 -123.5h-62v374h62q0 -94 26 -124t123 -30h118v319q0 15 -4 24q-9 19 -149 19h-41v67q71 -5 109 -5h301q30 0 99 5v-67q-117 0 -136.5 -7.5t-19.5 -35.5v-706 q0 -13 4 -23q8 -19 111 -19q19 0 41 1v-67z" />
+<glyph unicode="&#x214f;" horiz-adv-x="1632" d="M1265 139q-110 -137 -230.5 -137t-227.5 120q-109 -122 -215 -122q-129 0 -231 130q-126 -122 -296 -122l-15 114h3q146 0 260 85q-65 154 -65 268q0 74 30 130q36 70 102.5 70t99.5 -60.5t33 -131.5q0 -158 -103 -295q71 -74 170 -74t179 78q-80 138 -80 279 q0 76 29 132q36 72 101.5 72t100 -60t34.5 -129q0 -135 -94 -302q60 -70 170 -70t192 85q-95 142 -95 278q0 74 35 136t101 62t99.5 -59.5t33.5 -129.5q0 -134 -76 -273q118 -89 272 -91l-13 -114q-178 8 -304 131zM1259 261q64 104 64 199t-68 95q-77 0 -77 -116 q0 -94 81 -178zM802 240q79 112 79 213.5t-66 101.5q-39 0 -58 -39t-19 -82q0 -109 64 -194zM361 252q89 97 89 201t-66 104q-39 0 -58 -40.5t-19 -84.5q0 -108 54 -180z" />
+<glyph unicode="&#x2150;" horiz-adv-x="1722" d="M142 643l67 -2q109 0 123 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -112 5h-302q-45 0 -112 -5v64zM1419 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667 q11 17 35 17q40 0 40 -40zM1686 564q0 -26 -16 -46l-212 -262q-73 -91 -97 -253q-14 -94 -14 -276q0 -86 -82 -86t-82 86q0 258 194 527q1 1 161 203h-353q-84 0 -97 -7t-35 -128h-60l56 306h56q2 -17 9 -24q20 -20 182 -20h390v-20z" />
+<glyph unicode="&#x2151;" horiz-adv-x="1722" d="M1661 138q0 -263 -169 -408q-103 -89 -233 -89q-92 0 -153 35q-74 42 -74 124q0 77 81 77q35 0 59 -21t24 -53q0 -60 -66 -72q47 -32 114.5 -32t118.5 30q132 77 137 352q-67 -108 -185 -108q-141 0 -231.5 95.5t-90.5 229t100 225t239 91.5q78 0 145 -37 q184 -101 184 -439zM142 643l67 -2q109 0 123 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -112 5h-302q-45 0 -112 -5v64zM1439 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40 q0 13 6 22l1071 1667q11 17 35 17q40 0 40 -40zM1458 107q40 66 40 177.5t-25 171.5q-44 104 -141.5 104t-147.5 -82q-30 -49 -30 -159v-58q0 -105 26 -153q45 -82 137 -82t141 81z" />
+<glyph unicode="&#x2152;" horiz-adv-x="2386" d="M142 643l67 -2q109 0 123 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -112 5h-302q-45 0 -112 -5v64zM1419 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667 q11 17 35 17q40 0 40 -40zM2236 514q63 -111 63 -325.5t-59 -321.5q-91 -166 -277 -166t-277 160q-63 111 -63 325.5t59 321.5q91 166 277 166t277 -160zM1052 -206l67 -2q109 0 123 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28 q11 -21 175 -21h15v-64q-67 5 -112 5h-302q-45 0 -112 -5v64zM2150 116v173q0 335 -190 335t-190 -365v-173q0 -335 190 -335t190 365z" />
+<glyph unicode="&#x2153;" horiz-adv-x="1722" d="M142 643l67 -2q109 0 123 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -112 5h-302q-45 0 -112 -5v64zM1419 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667 q11 17 35 17q40 0 40 -40zM1655 -82q0 -120 -103.5 -198.5t-231.5 -78.5t-223 56q-110 65 -110 171q0 90 97 90q42 0 70 -24.5t28 -62.5q0 -82 -93 -87q74 -85 219 -85q88 0 131 72q35 58 35 147q0 220 -176 220h-81q-35 0 -35 25.5t90.5 30.5t133.5 67t43 153 q0 146 -140 146q-123 0 -187 -67q86 -8 86 -79q0 -80 -89.5 -80t-89.5 81q0 94 97 150q83 49 191 49t195 -49q102 -57 102 -152q0 -79 -54.5 -144t-138.5 -98q100 -27 167 -94.5t67 -158.5z" />
+<glyph unicode="&#x2154;" horiz-adv-x="1722" d="M79 580v22q0 26 21 47l300 296q160 158 160 299q0 89 -52 152.5t-147 63.5q-136 0 -195 -119q98 -2 98 -83q0 -35 -26.5 -59t-64.5 -24q-94 0 -94 87q0 109 90.5 185t222.5 76t231 -76.5t99 -202.5q0 -82 -61 -159q-32 -40 -124 -120l-300 -259h285q97 0 110 9.5 t33 125.5h59l-46 -261h-599zM1655 -82q0 -120 -103.5 -198.5t-231.5 -78.5t-223 56q-110 65 -110 171q0 90 97 90q42 0 70 -24.5t28 -62.5q0 -82 -93 -87q74 -85 219 -85q88 0 131 72q35 58 35 147q0 220 -176 220h-81q-35 0 -35 25.5t90.5 30.5t133.5 67t43 153 q0 146 -140 146q-123 0 -187 -67q86 -8 86 -79q0 -80 -89.5 -80t-89.5 81q0 94 97 150q83 49 191 49t195 -49q102 -57 102 -152q0 -79 -54.5 -144t-138.5 -98q100 -27 167 -94.5t67 -158.5zM1439 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22 l1071 1667q11 17 35 17q40 0 40 -40z" />
+<glyph unicode="&#x2155;" horiz-adv-x="1722" d="M142 643l67 -2q109 0 123 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -112 5h-302q-45 0 -112 -5v64zM1419 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667 q11 17 35 17q40 0 40 -40zM1336 273q135 0 220.5 -95t85.5 -222t-102 -221t-235 -94t-219.5 78t-86.5 185q0 84 86 84q37 0 63 -22t26 -56t-26 -56t-63 -22h-10q25 -58 84.5 -95.5t129.5 -37.5q103 0 159 86q35 54 35 177.5t-26 176.5q-42 84 -133.5 84t-165.5 -73 q-38 -38 -47 -38q-32 0 -32 38v430q0 33 25 33q10 0 22 -4q125 -40 197 -40t121.5 13.5t79.5 22.5t32 9q25 0 25 -26q0 -14 -30 -44q-111 -110 -281 -110q-60 0 -122 15v-235q80 59 188 59z" />
+<glyph unicode="&#x2156;" horiz-adv-x="1722" d="M79 580v22q0 26 21 47l300 296q160 158 160 299q0 89 -52 152.5t-147 63.5q-136 0 -195 -119q98 -2 98 -83q0 -35 -26.5 -59t-64.5 -24q-94 0 -94 87q0 109 90.5 185t222.5 76t231 -76.5t99 -202.5q0 -82 -61 -159q-32 -40 -124 -120l-300 -259h285q97 0 110 9.5 t33 125.5h59l-46 -261h-599zM1336 273q135 0 220.5 -95t85.5 -222t-102 -221t-235 -94t-219.5 78t-86.5 185q0 84 86 84q37 0 63 -22t26 -56t-26 -56t-63 -22h-10q25 -58 84.5 -95.5t129.5 -37.5q103 0 159 86q35 54 35 177.5t-26 176.5q-42 84 -133.5 84t-165.5 -73 q-38 -38 -47 -38q-32 0 -32 38v430q0 33 25 33q10 0 22 -4q125 -40 197 -40t121.5 13.5t79.5 22.5t32 9q25 0 25 -26q0 -14 -30 -44q-111 -110 -281 -110q-60 0 -122 15v-235q80 59 188 59zM1429 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22 l1071 1667q11 17 35 17q40 0 40 -40z" />
+<glyph unicode="&#x2157;" horiz-adv-x="1722" d="M1336 273q135 0 220.5 -95t85.5 -222t-102 -221t-235 -94t-219.5 78t-86.5 185q0 84 86 84q37 0 63 -22t26 -56t-26 -56t-63 -22h-10q25 -58 84.5 -95.5t129.5 -37.5q103 0 159 86q35 54 35 177.5t-26 176.5q-42 84 -133.5 84t-165.5 -73q-38 -38 -47 -38q-32 0 -32 38 v430q0 33 25 33q10 0 22 -4q125 -40 197 -40t121.5 13.5t79.5 22.5t32 9q25 0 25 -26q0 -14 -30 -44q-111 -110 -281 -110q-60 0 -122 15v-235q80 59 188 59zM735 827q0 -120 -103.5 -198.5t-231.5 -78.5t-223 56q-110 65 -110 171q0 90 97 90q42 0 70 -24.5t28 -62.5 q0 -82 -93 -87q74 -85 219 -85q88 0 131 72q35 58 35 147q0 220 -176 220h-81q-35 0 -35 25.5t90.5 30.5t133.5 67t43 153q0 146 -140 146q-123 0 -187 -67q86 -8 86 -79q0 -80 -89.5 -80t-89.5 81q0 94 97 150q83 49 191 49t195 -49q102 -57 102 -152q0 -79 -54.5 -144 t-138.5 -98q100 -27 167 -94.5t67 -158.5zM1419 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667q11 17 35 17q40 0 40 -40z" />
+<glyph unicode="&#x2158;" horiz-adv-x="1722" d="M757 809h-156v-120q0 -18 5 -27q10 -19 134 -19h13v-64q-78 5 -117 5h-213q-36 0 -114 -5v64l58 -1q76 0 88 20q6 10 6 27v120h-416v56l481 653q15 21 40 21q35 0 35 -47v-620h156v-63zM1336 273q135 0 220.5 -95t85.5 -222t-102 -221t-235 -94t-219.5 78t-86.5 185 q0 84 86 84q37 0 63 -22t26 -56t-26 -56t-63 -22h-10q25 -58 84.5 -95.5t129.5 -37.5q103 0 159 86q35 54 35 177.5t-26 176.5q-42 84 -133.5 84t-165.5 -73q-38 -38 -47 -38q-32 0 -32 38v430q0 33 25 33q10 0 22 -4q125 -40 197 -40t121.5 13.5t79.5 22.5t32 9 q25 0 25 -26q0 -14 -30 -44q-111 -110 -281 -110q-60 0 -122 15v-235q80 59 188 59zM1439 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667q11 17 35 17q40 0 40 -40zM470 872v476l-352 -476h352z" />
+<glyph unicode="&#x2159;" horiz-adv-x="1722" d="M142 643l67 -2q109 0 123 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -112 5h-302q-45 0 -112 -5v64zM1332 283q142 0 232.5 -95.5t90.5 -225t-93.5 -225.5t-238.5 -96q-187 0 -273 170 q-63 124 -63 285.5t61 284.5t184 188q85 45 174 45t150 -40t61 -118t-82 -78t-82 74q0 64 73 71q-42 37 -107 37t-119 -30q-146 -82 -152 -354q68 107 184 107zM1439 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667q11 17 35 17 q40 0 40 -40zM1495 -72v69q0 102 -28 153q-44 81 -135 81t-136.5 -73t-45.5 -164q0 -135 27 -196q44 -99 144.5 -99t147.5 85q26 48 26 144z" />
+<glyph unicode="&#x215a;" horiz-adv-x="1722" d="M1332 283q142 0 232.5 -95.5t90.5 -225t-93.5 -225.5t-238.5 -96q-187 0 -273 170q-63 124 -63 285.5t61 284.5t184 188q85 45 174 45t150 -40t61 -118t-82 -78t-82 74q0 64 73 71q-42 37 -107 37t-119 -30q-146 -82 -152 -354q68 107 184 107zM416 1182q135 0 220.5 -95 t85.5 -222t-102 -221t-235 -94t-219.5 78t-86.5 185q0 84 86 84q37 0 63 -22t26 -56t-26 -56t-63 -22h-10q25 -58 84.5 -95.5t129.5 -37.5q103 0 159 86q35 54 35 177.5t-26 176.5q-42 84 -133.5 84t-165.5 -73q-38 -38 -47 -38q-32 0 -32 38v430q0 33 25 33q10 0 22 -4 q125 -40 197 -40t121.5 13.5t79.5 22.5t32 9q25 0 25 -26q0 -14 -30 -44q-111 -110 -281 -110q-60 0 -122 15v-235q80 59 188 59zM1429 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667q11 17 35 17q40 0 40 -40zM1495 -72v69 q0 102 -28 153q-44 81 -135 81t-136.5 -73t-45.5 -164q0 -135 27 -196q44 -99 144.5 -99t147.5 85q26 48 26 144z" />
+<glyph unicode="&#x215b;" horiz-adv-x="1722" d="M142 643l67 -2q109 0 123 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -112 5h-302q-45 0 -112 -5v64zM1575 92q80 -79 80 -188t-101 -186t-231.5 -77t-233 67.5t-102.5 181.5q0 157 213 257 q-35 19 -100 66q-71 68 -71 166t88 166.5t202.5 68.5t204.5 -58.5t90 -157.5q0 -128 -178 -216q50 -25 139 -90zM1439 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667q11 17 35 17q40 0 40 -40zM1525 398q0 69 -61.5 115.5t-141 46.5 t-142.5 -36.5t-63 -94t75 -105.5q34 -22 187 -109q146 77 146 183zM1085 -110q0 -81 70.5 -136t163.5 -55t166 46.5t73 120t-114 142.5q-51 31 -187 104q-172 -86 -172 -222z" />
+<glyph unicode="&#x215c;" horiz-adv-x="1722" d="M1575 92q80 -79 80 -188t-101 -186t-231.5 -77t-233 67.5t-102.5 181.5q0 157 213 257q-35 19 -100 66q-71 68 -71 166t88 166.5t202.5 68.5t204.5 -58.5t90 -157.5q0 -128 -178 -216q50 -25 139 -90zM1439 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40 q0 13 6 22l1071 1667q11 17 35 17q40 0 40 -40zM735 827q0 -120 -103.5 -198.5t-231.5 -78.5t-223 56q-110 65 -110 171q0 90 97 90q42 0 70 -24.5t28 -62.5q0 -82 -93 -87q74 -85 219 -85q88 0 131 72q35 58 35 147q0 220 -176 220h-81q-35 0 -35 25.5t90.5 30.5t133.5 67 t43 153q0 146 -140 146q-123 0 -187 -67q86 -8 86 -79q0 -80 -89.5 -80t-89.5 81q0 94 97 150q83 49 191 49t195 -49q102 -57 102 -152q0 -79 -54.5 -144t-138.5 -98q100 -27 167 -94.5t67 -158.5zM1525 398q0 69 -61.5 115.5t-141 46.5t-142.5 -36.5t-63 -94t75 -105.5 q34 -22 187 -109q146 77 146 183zM1085 -110q0 -81 70.5 -136t163.5 -55t166 46.5t73 120t-114 142.5q-51 31 -187 104q-172 -86 -172 -222z" />
+<glyph unicode="&#x215d;" horiz-adv-x="1722" d="M1575 92q80 -79 80 -188t-101 -186t-231.5 -77t-233 67.5t-102.5 181.5q0 157 213 257q-35 19 -100 66q-71 68 -71 166t88 166.5t202.5 68.5t204.5 -58.5t90 -157.5q0 -128 -178 -216q50 -25 139 -90zM416 1182q135 0 220.5 -95t85.5 -222t-102 -221t-235 -94t-219.5 78 t-86.5 185q0 84 86 84q37 0 63 -22t26 -56t-26 -56t-63 -22h-10q25 -58 84.5 -95.5t129.5 -37.5q103 0 159 86q35 54 35 177.5t-26 176.5q-42 84 -133.5 84t-165.5 -73q-38 -38 -47 -38q-32 0 -32 38v430q0 33 25 33q10 0 22 -4q125 -40 197 -40t121.5 13.5t79.5 22.5t32 9 q25 0 25 -26q0 -14 -30 -44q-111 -110 -281 -110q-60 0 -122 15v-235q80 59 188 59zM1429 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667q11 17 35 17q40 0 40 -40zM1525 398q0 69 -61.5 115.5t-141 46.5t-142.5 -36.5t-63 -94 t75 -105.5q34 -22 187 -109q146 77 146 183zM1085 -110q0 -81 70.5 -136t163.5 -55t166 46.5t73 120t-114 142.5q-51 31 -187 104q-172 -86 -172 -222z" />
+<glyph unicode="&#x215e;" horiz-adv-x="1722" d="M1575 92q80 -79 80 -188t-101 -186t-231.5 -77t-233 67.5t-102.5 181.5q0 157 213 257q-35 19 -100 66q-71 68 -71 166t88 166.5t202.5 68.5t204.5 -58.5t90 -157.5q0 -128 -178 -216q50 -25 139 -90zM746 1473q0 -26 -16 -46l-212 -262q-73 -91 -97 -253 q-14 -94 -14 -276q0 -86 -82 -86t-82 86q0 258 194 527q1 1 161 203h-353q-84 0 -97 -7t-35 -128h-60l56 306h56q2 -17 9 -24q20 -20 182 -20h390v-20zM1399 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667q11 17 35 17q40 0 40 -40z M1525 398q0 69 -61.5 115.5t-141 46.5t-142.5 -36.5t-63 -94t75 -105.5q34 -22 187 -109q146 77 146 183zM1085 -110q0 -81 70.5 -136t163.5 -55t166 46.5t73 120t-114 142.5q-51 31 -187 104q-172 -86 -172 -222z" />
+<glyph unicode="&#x215f;" horiz-adv-x="939" d="M142 643l67 -2q109 0 123 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -112 5h-302q-45 0 -112 -5v64zM1419 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667 q11 17 35 17q40 0 40 -40z" />
+<glyph unicode="&#x2160;" horiz-adv-x="738" d="M670 1284l-75 2q-140 0 -140 -85v-1057q0 -27 13.5 -52t91.5 -31q4 0 31.5 -0.5t78.5 0.5v-61q-71 6 -111 6h-385q-35 0 -106 -6v61q9 0 28 -0.5t29 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-18 34 -153 34h-51v62q70 -6 109 -6h388q35 0 105 6v-62z" />
+<glyph unicode="&#x2161;" horiz-adv-x="1340" d="M1272 1284l-75 2q-140 0 -140 -85v-1057q0 -27 13.5 -52t91.5 -31q4 0 31.5 -0.5t78.5 0.5v-61q-71 6 -111 6h-987q-35 0 -106 -6v61q9 0 28 -0.5t29 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-18 34 -153 34h-51v62q70 -6 109 -6h990q35 0 105 6v-62zM670 1284 l-75 2q-140 0 -140 -85v-1057q0 -57 50 -75q27 -9 68.5 -9t63.5 0.5t80 0.5h63q78 6 94 35q9 17 9 49v1056q0 32 -9 49q-15 29 -95 34h-109z" />
+<glyph unicode="&#x2162;" horiz-adv-x="1942" d="M1874 1284l-75 2q-140 0 -140 -85v-1057q0 -27 13.5 -52t91.5 -31q4 0 32 -0.5t78 0.5v-61q-71 6 -111 6h-1589q-35 0 -106 -6v61q9 0 28 -0.5t29 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-18 34 -153 34h-51v62q70 -6 109 -6h1592q35 0 105 6v-62zM1272 1284 l-75 2q-140 0 -140 -85v-1057q0 -57 50 -75q27 -9 68.5 -9t63.5 0.5t80 0.5h63q78 6 94 35q9 17 9 49v1056q0 32 -9 49q-15 29 -95 34h-109zM670 1284l-75 2q-140 0 -140 -85v-1057q0 -57 50 -75q27 -9 68.5 -9t63.5 0.5t80 0.5h63q78 6 94 35q9 17 9 49v1056q0 32 -9 49 q-15 29 -95 34h-109z" />
+<glyph unicode="&#x2163;" horiz-adv-x="2138" d="M670 1284l-75 2q-140 0 -140 -85v-1057q0 -27 11 -48q18 -35 194 -35h10v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q9 0 28 -0.5t29 -0.5q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-15 29 -95 34h-109v62q70 -6 115 -6h850q90 0 169 6v-62h-18q-144 0 -144 -56 q0 -33 141 -396l247 -635l361 950q9 24 9 40q0 94 -143 97v62q153 -6 237.5 -6t177.5 6v-62q-164 -1 -214 -132l-440 -1158q-14 -37 -46.5 -37t-48.5 43l-457 1209q-22 57 -81 71q-20 4 -74 4h-39z" />
+<glyph unicode="&#x2164;" horiz-adv-x="1536" d="M814 -6q-14 -37 -46.5 -37t-48.5 43l-457 1209q-22 57 -81 71q-20 5 -68 5q-20 0 -45 -1v62q214 -6 336 -6t196 6v-62h-18q-144 0 -144 -56q0 -33 141 -396l247 -635l361 950q9 24 9 40q0 95 -143 97v62q153 -6 237.5 -6t177.5 6v-62q-164 -1 -214 -132z" />
+<glyph unicode="&#x2165;" horiz-adv-x="2138" d="M2070 1284l-75 2q-140 0 -140 -85v-1057q0 -28 11 -48q19 -35 194 -35h10v-61q-71 6 -117 6h-373q-41 0 -112 -6v61q9 0 28 -0.5t29 -0.5q128 0 147 36q9 17 9 49v1056q0 56 -40 73q-23 10 -122 10t-144 -14q-86 -25 -121 -118l-440 -1158q-14 -37 -46.5 -37t-48.5 43 l-457 1209q-22 57 -81 71q-20 5 -67 5q-20 0 -46 -1v62q213 -6 335.5 -6t196.5 6v-62h-18q-144 0 -144 -56q0 -33 141 -396l247 -635l361 950q9 24 9 40q0 94 -143 97v62q153 -6 213 -6h693q41 0 111 6v-62z" />
+<glyph unicode="&#x2166;" horiz-adv-x="2740" d="M2672 1284l-75 2q-140 0 -140 -85v-1057q0 -28 11 -48q19 -35 194 -35h10v-61q-71 6 -117 6h-975q-41 0 -112 -6v61q9 0 28 -0.5t29 -0.5q128 0 147 36q9 17 9 49v1056q0 56 -40 73q-23 10 -122 10t-144 -14q-86 -25 -121 -118l-440 -1158q-14 -37 -46.5 -37t-48.5 43 l-457 1209q-22 57 -81 71q-20 5 -67 5q-20 0 -46 -1v62q213 -6 335.5 -6t196.5 6v-62h-18q-144 0 -144 -56q0 -33 141 -396l247 -635l361 950q9 24 9 40q0 94 -143 97v62q153 -6 213 -6h1295q41 0 111 6v-62zM2070 1284l-75 2q-140 0 -140 -85v-1057q0 -57 50 -75 q27 -9 68.5 -9t63.5 0.5t80 0.5h63q78 6 94 35q9 17 9 49v1056q0 32 -9 49q-15 29 -95 34h-109z" />
+<glyph unicode="&#x2167;" horiz-adv-x="3342" d="M3274 1284l-75 2q-140 0 -140 -85v-1057q0 -28 11 -48q19 -35 194 -35h10v-61q-71 6 -117 6h-1577q-41 0 -112 -6v61q9 0 28 -0.5t29 -0.5q128 0 147 36q9 17 9 49v1056q0 56 -40 73q-23 10 -122 10t-144 -14q-86 -25 -121 -118l-440 -1158q-14 -37 -46.5 -37t-48.5 43 l-457 1209q-22 57 -81 71q-20 5 -67 5q-20 0 -46 -1v62q213 -6 335.5 -6t196.5 6v-62h-18q-144 0 -144 -56q0 -33 141 -396l247 -635l361 950q9 24 9 40q0 94 -143 97v62q153 -6 213 -6h1897q41 0 111 6v-62zM2672 1284l-75 2q-140 0 -140 -85v-1057q0 -57 50 -75 q27 -9 68.5 -9t63.5 0.5t80 0.5h63q78 6 94 35q9 17 9 49v1056q0 32 -9 49q-15 29 -95 34h-109zM2070 1284l-75 2q-140 0 -140 -85v-1057q0 -57 50 -75q27 -9 68.5 -9t63.5 0.5t80 0.5h63q78 6 94 35q9 17 9 49v1056q0 32 -9 49q-15 29 -95 34h-109z" />
+<glyph unicode="&#x2168;" horiz-adv-x="2120" d="M670 1284l-75 2q-140 0 -140 -85v-1057q0 -57 50 -75q27 -9 130 -9t165 18q96 27 155 114l323 477l-362 547q-34 51 -99 64q-25 4 -81 4h-41v62q112 -6 292 -6t252 6v-62q-128 -5 -128 -58q0 -14 268 -410l225 333q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62 q81 -6 164.5 -6t305.5 6v-62q-198 -2 -285 -128l-271 -395l416 -629q35 -53 99 -66q26 -5 86 -5h37v-61q-127 6 -299 6t-244 -6v61q128 5 128 59q0 10 -320 493l-281 -414q-19 -28 -19 -48q0 -43 38.5 -66t84.5 -24v-61q-74 6 -169 6h-791q-41 0 -112 -6v61q9 0 28 -0.5 t29 -0.5q128 0 147 36q9 17 9 49v1056q0 31 -9 49q-14 28 -94 34h-110v62q70 -6 115 -6h376q41 0 111 6v-62z" />
+<glyph unicode="&#x2169;" horiz-adv-x="1518" d="M1450 0q-128 6 -299.5 6t-243.5 -6v61q128 5 128 59q0 10 -320 493l-281 -414q-19 -28 -19 -48q0 -43 38.5 -66t84.5 -24v-61q-74 6 -165 6t-305 -6v61q196 0 285 131l323 477l-362 547q-33 51 -99 64q-25 4 -81 4h-41v62q112 -6 292 -6t252 6v-62q-128 -5 -128 -58 q0 -14 268 -410l225 333q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62q81 -6 164.5 -6t305.5 6v-62q-198 -2 -285 -128l-271 -395l416 -629q35 -53 99 -66q26 -5 86 -5h37v-61z" />
+<glyph unicode="&#x216a;" horiz-adv-x="2120" d="M2052 1284l-75 2q-140 0 -140 -85v-1057q0 -28 11 -48q19 -35 194 -35h10v-61q-71 6 -117 6h-856q-100 0 -172 -6v61q128 5 128 59q0 10 -320 493l-281 -414q-19 -28 -19 -48q0 -43 38.5 -66t84.5 -24v-61q-74 6 -165 6t-305 -6v61q196 0 285 131l323 477l-362 547 q-34 51 -99 64q-24 4 -81 4h-41v62q112 -6 292 -6t252 6v-62q-128 -5 -128 -58q0 -14 268 -410l225 333q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62q81 -6 164.5 -6t305.5 6v-62q-198 -2 -285 -128l-271 -395l416 -629q35 -53 99 -66q30 -6 75 -6h8q25 1 42.5 1t27.5 -1h27 q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-15 29 -94 34h-110v62q70 -6 115 -6h376q41 0 111 6v-62z" />
+<glyph unicode="&#x216b;" horiz-adv-x="2722" d="M2654 1284l-75 2q-140 0 -140 -85v-1057q0 -28 11 -48q19 -35 194 -35h10v-61q-71 6 -117 6h-1458q-100 0 -172 -6v61q128 5 128 59q0 10 -320 493l-281 -414q-19 -28 -19 -48q0 -43 38.5 -66t84.5 -24v-61q-74 6 -165 6t-305 -6v61q196 0 285 131l323 477l-362 547 q-34 51 -99 64q-24 4 -81 4h-41v62q112 -6 292 -6t252 6v-62q-128 -5 -128 -58q0 -14 268 -410l225 333q17 25 17 46q0 43 -37.5 65.5t-83.5 23.5v62q81 -6 164.5 -6t305.5 6v-62q-198 -2 -285 -128l-271 -395l416 -629q35 -53 99 -66q30 -6 75 -6h8q25 1 42.5 1t27.5 -1h27 q128 0 147 36q9 17 9 49v1056q0 32 -9 49q-15 29 -94 34h-110v62q70 -6 115 -6h978q41 0 111 6v-62zM2052 1284l-75 2q-140 0 -140 -85v-1057q0 -57 50 -75q27 -9 68.5 -9t63.5 0.5t80 0.5h63q78 6 94 35q9 17 9 49v1056q0 32 -9 49q-15 29 -95 34h-109z" />
+<glyph unicode="&#x216c;" horiz-adv-x="1217" d="M697 1284l-66 2q-156 0 -177 -36q-10 -17 -10 -48v-1062q0 -52 17.5 -65.5t68.5 -13.5h173q212 0 303 123q70 96 94 324h49l-55 -508h-1026v61q8 0 25.5 -0.5t27.5 -0.5q124 0 142 35q7 14 7 46v1064q0 32 -7 46q-17 33 -185 33h-10v62q71 -6 126 -6h383q47 0 120 6v-62z " />
+<glyph unicode="&#x216d;" horiz-adv-x="1335" d="M1267 854q0 -26 -29 -26t-35 32q-12 60 -47 178q-51 127 -151 208.5t-217 81.5t-220 -50q-298 -145 -298 -613.5t322 -606.5q96 -41 185 -41q140 0 256 85t159 218q17 52 27 140q4 33 23 33q24 0 24 -35q0 -205 -154 -353t-360 -148q-288 0 -486 213t-198 502.5 t198.5 503.5t485.5 214q193 0 363 -169l99 144q17 25 31 25q22 0 22 -33v-503z" />
+<glyph unicode="&#x216e;" horiz-adv-x="1460" d="M1226 1130q166 -200 166 -466t-172 -465t-432 -199h-720v61l62 -2q108 0 130 31q10 14 10 52v1060q0 36 -10 50q-21 29 -157 29h-35v62h720q263 0 438 -213zM1085 229q110 148 110 436.5t-103 433.5q-129 182 -359 182h-207q-53 0 -70 -13t-17 -66v-1062q0 -53 17.5 -66 t69.5 -13h209q225 0 350 168z" />
+<glyph unicode="&#x216f;" horiz-adv-x="1794" d="M1726 1281l-56 2q-125 0 -141 -41q-6 -15 -6 -45v-1058q0 -26 8 -43q17 -35 185 -35h10v-61q-75 6 -119 6h-334q-38 0 -113 -6v61h76q63 0 87 10q40 17 40 70v1140h-2l-483 -1245q-14 -36 -36 -36t-39 43l-476 1222h-2v-1064q0 -140 200 -140h3v-61q-209 6 -229 6 t-231 -6v61h3q199 0 199 140v1003q0 22 -6 38q-12 32 -89 39q-6 1 -32.5 1t-74.5 -1v62h341q45 0 61 -42l428 -1102l430 1108q14 36 49 36h349v-62z" />
+<glyph unicode="&#x2170;" horiz-adv-x="563" d="M510 0q-202 6 -233 6t-224 -6v66l44 -1q66 0 89 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66zM335.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33z" />
+<glyph unicode="&#x2171;" horiz-adv-x="1020" d="M792.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM335.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM510 0l-223 6q-41 0 -234 -6v66l44 -1q66 0 89 13q33 18 33 79v582 q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q20 -6 59 -6q3 0 6 1q43 0 57.5 -0.5t51 -0.5t59.5 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66q-202 6 -223 6z" />
+<glyph unicode="&#x2172;" horiz-adv-x="1477" d="M1249.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM792.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM335.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5 t-33 80t33.5 79.5t80 34t80 -33zM510 0l-223 6q-41 0 -234 -6v66l44 -1q66 0 89 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q20 -6 59 -6q3 0 6 1q43 0 57.5 -0.5t51 -0.5t59.5 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14 v68l298 23v-802q0 -59 51 -73q20 -6 59 -6q3 0 6 1q43 0 57.5 -0.5t51 -0.5t59.5 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66q-202 6 -223 6l-234 -6l-223 6z" />
+<glyph unicode="&#x2173;" horiz-adv-x="1571" d="M997 -24q-29 0 -45 40l-309 760q-24 60 -68 73q-18 6 -83 6h-19v68q120 -8 164 -8t276 8v-68q-122 0 -122 -54q0 -15 252 -634l219 546q13 32 13 50q0 90 -102 92v68q135 -8 194.5 -8t151.5 8v-68q-142 -1 -198 -142l-279 -697q-16 -40 -45 -40zM510 0q-202 6 -233 6 t-224 -6v66l44 -1q66 0 89 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66zM335.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33z" />
+<glyph unicode="&#x2174;" horiz-adv-x="1152" d="M577 -24q-29 0 -45 40l-309 760q-24 60 -68 73q-18 6 -83 6h-19v68q120 -8 164 -8t276 8v-68q-122 0 -122 -54q0 -15 252 -634l219 546q13 32 13 50q0 90 -102 92v68q135 -8 194.5 -8t151.5 8v-68q-142 -1 -198 -142l-279 -697q-16 -40 -45 -40z" />
+<glyph unicode="&#x2175;" horiz-adv-x="1601" d="M1373.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM1548 0q-202 6 -233 6t-224 -6v66l44 -1q66 0 89 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14q-142 -1 -198 -142l-279 -697q-16 -40 -45 -40t-45 40l-309 760 q-24 60 -68 73q-18 6 -83 6h-19v68q120 -8 164 -8t276 8v-68q-122 0 -122 -54q0 -15 252 -634l219 546q13 32 13 50q0 90 -102 92v68q135 -8 188.5 -8t157.5 8l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66z" />
+<glyph unicode="&#x2176;" horiz-adv-x="2058" d="M1830.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM1373.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM1548 0l-223 6q-41 0 -234 -6v66l44 -1q66 0 89 13q33 18 33 79 v582q0 85 -41 105q-21 11 -103 11h-14q-142 -1 -198 -142l-279 -697q-16 -40 -45 -40t-45 40l-309 760q-24 60 -68 73q-18 6 -83 6h-19v68q120 -8 164 -8t276 8v-68q-122 0 -122 -54q0 -15 252 -634l219 546q13 32 13 50q0 90 -102 92v68q135 -8 188.5 -8t157.5 8l298 23 v-802q0 -59 51 -73q20 -6 59 -6q3 0 6 1q43 0 57.5 -0.5t51 -0.5t59.5 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66q-202 6 -223 6z" />
+<glyph unicode="&#x2177;" horiz-adv-x="2515" d="M2287.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM1830.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM1373.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5 t-33 80t33.5 79.5t80 34t80 -33zM1548 0l-223 6q-41 0 -234 -6v66l44 -1q66 0 89 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14q-142 -1 -198 -142l-279 -697q-16 -40 -45 -40t-45 40l-309 760q-24 60 -68 73q-18 6 -83 6h-19v68q120 -8 164 -8t276 8v-68 q-122 0 -122 -54q0 -15 252 -634l219 546q13 32 13 50q0 90 -102 92v68q135 -8 188.5 -8t157.5 8l298 23v-802q0 -59 51 -73q20 -6 59 -6q3 0 6 1q43 0 57.5 -0.5t51 -0.5t59.5 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73 q20 -6 59 -6q3 0 6 1q43 0 57.5 -0.5t51 -0.5t59.5 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66q-202 6 -223 6l-234 -6l-223 6z" />
+<glyph unicode="&#x2178;" horiz-adv-x="1641" d="M335.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM1588 0q-91 6 -175.5 6t-261.5 -6v66q77 3 77 54q0 10 -208 285q-192 -223 -192 -272q0 -61 62 -67v-66q-141 6 -221 6t-159 -6q-202 6 -233 6t-224 -6v66l44 -1 q66 0 89 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -58 51 -73q18 -5 79 -5h21q160 1 274 128l200 256l-212 276q-71 92 -105 110.5t-147 18.5v68q110 -8 171 -8t264 8v-68q-75 -2 -75 -52q0 -20 184 -255l134 167q33 41 33 75q0 61 -63 65v68 q108 -8 192.5 -8t188.5 8v-68q-152 -3 -255 -109q-26 -27 -197 -244l287 -369q37 -47 92 -60q28 -7 95 -7h17v-66z" />
+<glyph unicode="&#x2179;" horiz-adv-x="1184" d="M1131 0q-91 6 -175.5 6t-261.5 -6v66q77 3 77 54q0 10 -208 285q-192 -223 -192 -272q0 -61 62 -67v-66q-141 6 -221 6t-159 -6v66q159 0 274 128l200 256l-212 276q-71 92 -105 110.5t-147 18.5v68q110 -8 171 -8t264 8v-68q-75 -2 -75 -52q0 -20 184 -255l134 167 q33 41 33 75q0 61 -63 65v68q108 -8 192.5 -8t188.5 8v-68q-152 -3 -255 -109q-26 -27 -197 -244l287 -369q37 -47 92 -60q28 -7 95 -7h17v-66z" />
+<glyph unicode="&#x217a;" horiz-adv-x="1641" d="M1413.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM1588 0q-202 6 -233 6t-224 -6q-91 6 -175.5 6t-261.5 -6v66q77 3 77 54q0 10 -208 285q-192 -223 -192 -272q0 -61 62 -67v-66q-141 6 -221 6t-159 -6v66 q159 0 274 128l200 256l-212 276q-71 92 -105 110.5t-147 18.5v68q110 -8 171 -8t264 8v-68q-75 -2 -75 -52q0 -20 184 -255l134 167q33 41 33 75q0 61 -63 65v68q108 -8 192.5 -8t188.5 8v-68q-152 -3 -255 -109q-26 -27 -197 -244l287 -369q37 -47 80.5 -57t87.5 -10h58 q15 -1 51.5 -1t59.5 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66z" />
+<glyph unicode="&#x217b;" horiz-adv-x="2098" d="M1870.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM1413.5 1356q33.5 -33 33.5 -80.5t-33.5 -81t-80.5 -33.5t-80 34.5t-33 80t33.5 79.5t80 34t80 -33zM1588 0l-223 6q-41 0 -234 -6q-91 6 -175.5 6t-261.5 -6v66 q77 3 77 54q0 10 -208 285q-192 -223 -192 -272q0 -61 62 -67v-66q-141 6 -221 6t-159 -6v66q159 0 274 128l200 256l-212 276q-71 92 -105 110.5t-147 18.5v68q110 -8 171 -8t264 8v-68q-75 -2 -75 -52q0 -20 184 -255l134 167q33 41 33 75q0 61 -63 65v68q108 -8 192.5 -8 t188.5 8v-68q-152 -3 -255 -109q-26 -27 -197 -244l287 -369q37 -47 80.5 -57t87.5 -10h58q15 -1 51.5 -1t59.5 13q33 18 33 79v582q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q20 -6 59 -6q3 0 6 1q43 0 57.5 -0.5t51 -0.5t59.5 13q33 18 33 79v582 q0 85 -41 105q-21 11 -103 11h-14v68l298 23v-802q0 -59 51 -73q19 -5 69 -5h31v-66q-202 6 -223 6z" />
+<glyph unicode="&#x217c;" horiz-adv-x="579" d="M53 66l68 -2q98 0 98 98v1115q0 87 -44 108q-21 10 -106 10h-16v67l306 23v-1323q0 -50 13.5 -69t49.5 -23q29 -4 81 -4h24v-66q-220 6 -247.5 6t-226.5 -6v66z" />
+<glyph unicode="&#x217d;" horiz-adv-x="920" d="M868 254q0 -22 -27 -75q-104 -203 -329 -203q-194 0 -326.5 144.5t-132.5 343t132 347.5t330 149q121 0 215 -54q113 -64 113 -170t-97 -106q-42 0 -70.5 28t-28.5 70q0 94 100 99q-79 78 -229 78q-60 0 -120 -34q-168 -94 -168 -402.5t178 -404.5q63 -34 123 -34 q113 0 181 64q40 37 74 109.5t53 72.5q29 0 29 -22z" />
+<glyph unicode="&#x217e;" horiz-adv-x="1159" d="M793 118q-111 -142 -295 -142t-314.5 144.5t-130.5 340.5t139.5 340.5t336.5 144.5q163 0 270 -133v464q0 88 -47 109q-20 10 -85 10q-16 0 -35 -1v67l308 23v-1300q0 -88 46 -110q20 -10 85 -10q16 0 35 1v-66l-313 -24v142zM793 253v449q0 32 -24 68q-87 129 -236 129 t-238 -138q-65 -100 -65 -300t61 -299q85 -138 224 -138q93 0 185.5 69.5t92.5 159.5z" />
+<glyph unicode="&#x217f;" horiz-adv-x="1775" d="M1485 6q-40 0 -244 -6v66q26 -1 70 -1t65 13q32 19 32 84v499q0 238 -157 238q-130 0 -209.5 -104.5t-79.5 -238.5v-401q0 -39 12 -60q18 -30 118 -30q17 0 37 1v-66q-198 6 -237.5 6t-244.5 -6v66q26 -1 70 -1t65 13q32 19 32 84v499q0 238 -158 238 q-130 0 -209.5 -104.5t-79.5 -238.5v-397q0 -47 11 -64q18 -30 114 -30q19 0 40 1v-66q-198 6 -236 6t-243 -6v66q26 -1 69.5 -1t70 16t26.5 81v574q0 87 -44 109q-21 10 -96 10h-26v68l301 23v-225q101 225 316 225q251 0 284 -210q43 95 126.5 152.5t185.5 57.5 q158 0 224.5 -81t66.5 -243v-42q-1 -27 -1 -41v-409q0 -65 132 -65q17 0 35 1v-66q-198 6 -238 6z" />
+<glyph unicode="&#x2180;" horiz-adv-x="2211" d="M1539 1343q263 0 433.5 -206.5t170.5 -472.5t-172 -465t-432 -199h-867q-260 0 -432 199t-172 465t170.5 472.5t433.5 206.5h867zM1836 229q110 148 110 436.5t-103 433.5q-129 182 -359 182h-207q-53 0 -70 -13t-17 -66v-1062q0 -53 17.5 -66t69.5 -13h209 q225 0 350 168zM1021 140v1062q0 53 -17 66t-70 13h-207q-230 0 -359 -182q-103 -145 -103 -433.5t110 -436.5q125 -168 350 -168h209q52 0 69.5 13t17.5 66z" />
+<glyph unicode="&#x2181;" horiz-adv-x="1460" d="M1226 1130q166 -200 166 -466t-172 -465t-432 -199h-720v61l62 -2q108 0 130 31q10 14 10 52v1060q0 36 -10 50q-21 29 -157 29h-35v62h720q263 0 438 -213zM1085 229q110 148 110 436.5t-103 433.5q-129 182 -359 182h-207q-53 0 -70 -13t-17 -66v-209h150 q131 0 216.5 -103.5t85.5 -236.5t-86 -232.5t-216 -99.5h-150v-181q0 -53 17.5 -66t69.5 -13h209q225 0 350 168zM483 382q230 0 230 275t-231 275q-27 0 -35 -7t-8 -33v-471q0 -39 44 -39z" />
+<glyph unicode="&#x2182;" horiz-adv-x="2211" d="M1539 1343q263 0 433.5 -206.5t170.5 -472.5t-172 -465t-432 -199h-867q-260 0 -432 199t-172 465t170.5 472.5t433.5 206.5h867zM1836 229q110 148 110 436.5t-103 433.5q-129 182 -359 182h-207q-53 0 -70 -13t-17 -66v-209h150q131 0 216.5 -103.5t85.5 -236.5 t-86 -232.5t-216 -99.5h-150v-181q0 -53 17.5 -66t69.5 -13h209q225 0 350 168zM1234 382q230 0 230 275t-231 275q-27 0 -35 -7t-8 -33v-471q0 -39 44 -39zM1021 421v471q0 26 -8 33t-34 7q-231 0 -231 -275t230 -275q43 0 43 39zM1021 140v181h-150q-130 0 -216 99.5 t-86 232.5t85.5 236.5t216.5 103.5h150v209q0 53 -17 66t-70 13h-207q-230 0 -359 -182q-103 -145 -103 -433.5t110 -436.5q125 -168 350 -168h209q52 0 69.5 13t17.5 66z" />
+<glyph unicode="&#x2183;" horiz-adv-x="1335" d="M583 1390q287 0 485.5 -214t198.5 -503.5t-198 -502.5t-486 -213q-206 0 -360 148t-154 353q0 35 24 35q19 0 23 -33q10 -88 27 -140q43 -133 159 -218t256 -85q89 0 185 41q322 138 322 606.5t-298 613.5q-103 50 -220 50t-217 -81.5t-151 -208.5q-22 -56 -47 -178 q-6 -32 -35 -32t-29 26l1 503q0 33 21 33q14 0 31 -25l99 -144q170 169 363 169z" />
+<glyph unicode="&#x2184;" horiz-adv-x="920" d="M406 960q198 0 330 -149t132 -347.5t-132.5 -343t-326.5 -144.5q-225 0 -329 203q-27 53 -27 75t29 22q19 0 53 -72.5t74 -109.5q68 -64 181 -64q60 0 123 34q178 96 178 404.5t-168 402.5q-60 34 -120 34q-150 0 -229 -78q100 -5 100 -99q0 -42 -28.5 -70t-70.5 -28 q-97 0 -97 106t113 170q94 54 215 54z" />
+<glyph unicode="&#x2185;" horiz-adv-x="1354" d="M1286 1246q0 -7 -6 -20l-93 -196q-11 -23 -27 -23q-32 0 -28 30q2 12 2 24q0 126 -164 213q-101 54 -199 54t-192 -46q-170 -83 -239.5 -220t-69.5 -339.5t66 -330.5q74 -145 246 -228q97 -47 206 -47q288 0 359 290h121v-809h-174v583q-110 -124 -338 -124 q-292 0 -490 188t-198 476.5t198 478.5t486 190q238 0 423 -144q62 23 86.5 23t24.5 -23z" />
+<glyph unicode="&#x2186;" horiz-adv-x="1396" d="M610 1343h174v-1254l417 547l127 -97l-567 -744h-128l-565 744l127 97l415 -546v1253z" />
+<glyph unicode="&#x2187;" horiz-adv-x="1554" d="M882 1343q263 0 433.5 -206.5t170.5 -472.5t-172 -465t-432 -199h-814v61l62 -2q108 0 130 31q10 14 10 52v1060q0 36 -10 50q-21 29 -157 29h-35v62h814zM1179 229q110 148 110 436.5t-103 433.5q-129 182 -359 182h-301q-53 0 -70 -13t-17 -66v-31h278q208 0 335 -158 t127 -348.5t-128 -342t-332 -151.5h-280v-31q0 -53 17.5 -66t69.5 -13h303q225 0 350 168zM589 211q181 0 296.5 135t115.5 306.5t-108 303.5q-119 147 -304 147h-150v-110h150q131 0 216.5 -103.5t85.5 -236.5t-86 -232.5t-216 -99.5h-150v-110h150zM483 382q230 0 230 275 t-231 275q-27 0 -35 -7t-8 -33v-471q0 -39 44 -39z" />
+<glyph unicode="&#x2188;" horiz-adv-x="2399" d="M1727 1343q263 0 433.5 -206.5t170.5 -472.5t-172 -465t-432 -199h-1055q-260 0 -432 199t-172 465t170.5 472.5t433.5 206.5h1055zM2024 229q110 148 110 436.5t-103 433.5q-129 182 -359 182h-301q-53 0 -70 -13t-17 -66v-31h278q208 0 335 -158t127 -348.5t-128 -342 t-332 -151.5h-280v-31q0 -53 17.5 -66t69.5 -13h303q225 0 350 168zM1434 211q181 0 296.5 135t115.5 306.5t-108 303.5q-119 147 -304 147h-150v-110h150q131 0 216.5 -103.5t85.5 -236.5t-86 -232.5t-216 -99.5h-150v-110h150zM1328 382q230 0 230 275t-231 275 q-27 0 -35 -7t-8 -33v-471q0 -39 44 -39zM1115 421v471q0 26 -8 33t-34 7q-231 0 -231 -275t230 -275q43 0 43 39zM1115 211v110h-150q-130 0 -216 99.5t-86 232.5t85.5 236.5t216.5 103.5h150v110h-150q-185 0 -304 -147q-108 -132 -108 -303.5t115.5 -306.5t296.5 -135 h150zM1115 140v31h-280q-204 0 -332 151.5t-128 342t127 348.5t335 158h278v31q0 53 -17 66t-70 13h-301q-230 0 -359 -182q-103 -145 -103 -433.5t110 -436.5q125 -168 350 -168h303q52 0 69.5 13t17.5 66z" />
+<glyph unicode="&#x2189;" horiz-adv-x="1722" d="M1655 -82q0 -120 -103.5 -198.5t-231.5 -78.5t-223 56q-110 65 -110 171q0 90 97 90q42 0 70 -24.5t28 -62.5q0 -82 -93 -87q74 -85 219 -85q88 0 131 72q35 58 35 147q0 220 -176 220h-81q-35 0 -35 25.5t90.5 30.5t133.5 67t43 153q0 146 -140 146q-123 0 -187 -67 q86 -8 86 -79q0 -80 -89.5 -80t-89.5 81q0 94 97 150q83 49 191 49t195 -49q102 -57 102 -152q0 -79 -54.5 -144t-138.5 -98q100 -27 167 -94.5t67 -158.5zM676 1363q63 -111 63 -325.5t-59 -321.5q-91 -166 -277 -166t-277 160q-63 111 -63 325.5t59 321.5q91 166 277 166 t277 -160zM1419 1415q0 -13 -6 -22l-1071 -1667q-11 -17 -35 -17q-40 0 -40 40q0 13 6 22l1071 1667q11 17 35 17q40 0 40 -40zM590 965v173q0 335 -190 335t-190 -365v-173q0 -335 190 -335t190 365z" />
+<glyph unicode="&#x218a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x218b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x218c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x218d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x218e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x218f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2190;" d="M1931 582q0 -41 -39 -41h-1554q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h1554 q39 0 39 -41z" />
+<glyph unicode="&#x2191;" horiz-adv-x="1024" d="M471 1200q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q132 46 229.5 150.5t132.5 238.5q3 23 13 67q6 18 24 18t22 -18q4 -22 13 -66q35 -135 132.5 -239.5t229.5 -150.5q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59 q-158 84 -248 232v-1481q0 -37 -41 -37t-41 37v1481z" />
+<glyph unicode="&#x2192;" d="M1906 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-1554q-39 0 -39 41t39 41h1554q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163 q105 -217 317 -310z" />
+<glyph unicode="&#x2193;" horiz-adv-x="1024" d="M553 -36q136 223 414 293q22 0 22 -18q0 -60 -14 -64q-22 -6 -65 -19q-132 -46 -229.5 -150.5t-132.5 -239.5q-4 -22 -13 -66q-4 -18 -22 -18t-24 18q-4 23 -13 67q-35 134 -132.5 238.5t-229.5 150.5q-22 6 -65 19q-14 6 -14 19q0 51 -1 40q2 23 23 23l6 -2 q104 -29 161 -59q157 -83 247 -232v1481q0 37 41 37t41 -37v-1481z" />
+<glyph unicode="&#x2194;" d="M1917 605q14 -8 14 -22.5t-14 -20.5q-223 -79 -343 -283q-43 -74 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-1370q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-35 177 -143 305t-277 191q-16 6 -16 20.5t59 39.5 q138 59 233.5 171.5t133.5 261.5q3 15 10 43q5 18 25 20q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h1370q-154 111 -238 288q-57 121 -57 179q0 24 21 27h41q15 0 20 -19q49 -191 144 -303t225 -169q19 -6 53 -21z" />
+<glyph unicode="&#x2195;" horiz-adv-x="1024" d="M553 -35q135 222 414 292q20 0 23 -24q-1 9 -1 -39q0 -14 -14 -18q-76 -23 -117.5 -40.5t-90.5 -52.5q-173 -124 -222 -329q-3 -18 -10 -54q-5 -18 -23 -18t-22 18l-18 80q-14 62 -60 137q-109 177 -304 243q-20 4 -59 16q-14 5 -14 63q0 18 22 18l6 -2q102 -28 158 -57 q158 -82 250 -233v1234q-136 -223 -414 -292q-22 0 -22 63q0 13 14 18q20 5 59 16q194 66 304 244q44 72 65 154q3 21 12 62q5 18 23.5 18t22.5 -18q4 -22 13 -66q34 -133 131.5 -237.5t220.5 -150.5l75 -22q14 -5 14 -63q0 -18 -22 -18l-6 2q-277 76 -408 290v-1234z" />
+<glyph unicode="&#x2196;" d="M1924 -274q0 -44 -44 -44q-14 0 -24 10l-1556 1556q19 -77 19 -150q0 -173 -101 -345q-8 -13 -18.5 -13t-30.5 20t-20 30l35 69q56 112 56 249q0 160 -76 283q-40 66 -40 68q0 23 24 23l67 -40q127 -76 273 -76t259 56q71 35 67 35q10 0 30.5 -19t20.5 -31t-12 -19 q-165 -100 -346 -100q-76 0 -149 18l1556 -1556q10 -10 10 -24z" />
+<glyph unicode="&#x2197;" d="M1924 1459q0 -2 -40 -68q-76 -123 -76 -271.5t56 -260.5l35 -69q0 -10 -20 -30t-30.5 -20t-18.5 13q-101 172 -101 345q0 73 19 150l-1556 -1556q-10 -10 -24 -10q-44 0 -44 44q0 14 10 24l1556 1556q-73 -18 -149 -18q-181 0 -346 100q-12 7 -12 19t20.5 31t30.5 19 q-4 0 67 -35q113 -56 259 -56t273 76l67 40q24 0 24 -23z" />
+<glyph unicode="&#x2198;" d="M1924 -295q0 -23 -24 -23l-67 40q-127 76 -273 76t-259 -56q-71 -35 -67 -35q-10 0 -30.5 19t-20.5 31t12 19q165 100 346 100q76 0 149 -18l-1556 1556q-10 10 -10 24q0 44 44 44q14 0 24 -10l1556 -1556q-19 77 -19 150q0 173 101 345q8 13 18.5 13t30.5 -20t20 -30 l-35 -69q-56 -112 -56 -249q0 -160 76 -283q40 -66 40 -68z" />
+<glyph unicode="&#x2199;" d="M1924 1438q0 -14 -10 -24l-1556 -1556q73 18 149 18q181 0 346 -100q12 -7 12 -19t-20.5 -31t-30.5 -19q4 0 -67 35q-113 56 -259 56t-273 -76l-67 -40q-24 0 -24 23q0 2 40 68q76 123 76 271.5t-56 260.5l-35 69q0 10 20 30t30.5 20t18.5 -13q101 -172 101 -345 q0 -73 -19 -150l1556 1556q10 10 24 10q44 0 44 -44z" />
+<glyph unicode="&#x219a;" d="M1931 582q0 -41 -39 -41h-644l-257 -445q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l233 404h-815q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5 q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h863l257 446q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-234 -405h597q39 0 39 -41z" />
+<glyph unicode="&#x219b;" d="M1906 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-860l-257 -445q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l233 404h-599q-39 0 -39 41t39 41h647l257 446q23 39 45 39 q41 0 41 -38q0 -16 -15 -42l-234 -405h813q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310z" />
+<glyph unicode="&#x219c;" d="M1980 582q0 -14 -11 -27q-105 -121 -164 -167q-101 -78 -205 -78t-206 78q-59 46 -160.5 161t-153.5 156q-83 65 -164 65t-240.5 -114.5t-264.5 -114.5h-73q244 -175 295 -467q0 -27 -20 -27h-41q-18 0 -21 19q-31 171 -144.5 304.5t-276.5 188.5q-15 8 -15 23.5t15 19.5 q163 57 276.5 191t144.5 305q3 19 21 19h41q20 0 20 -27q-51 -292 -295 -467h73q84 0 240.5 114.5t263 114.5t207.5 -77q63 -48 162.5 -161t152.5 -156q84 -66 163 -66t162 66q50 41 148 151q12 14 31 14q39 0 39 -41z" />
+<glyph unicode="&#x219d;" d="M1980 582q0 -16 -15 -20q-163 -57 -276.5 -191t-144.5 -305q-3 -19 -21 -19h-41q-20 0 -20 27q51 292 295 467h-73q-84 0 -240.5 -114.5t-263 -114.5t-207.5 77q-63 48 -162.5 161t-152.5 156q-84 66 -163 66t-162 -66q-50 -41 -148 -151q-12 -14 -31 -14q-39 0 -39 41 q0 14 11 27q105 121 164 167q101 78 205 78t206 -78q59 -46 160.5 -161t153.5 -156q83 -65 164 -65t240.5 114.5t264.5 114.5h73q-244 175 -295 467q0 27 20 27h41q18 0 21 -19q31 -171 144.5 -304.5t276.5 -188.5q15 -7 15 -23z" />
+<glyph unicode="&#x219e;" d="M1931 582q0 -41 -39 -41h-1164q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -134.5 295t-234.5 180h-234q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18 q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h229q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h1164q39 0 39 -41z" />
+<glyph unicode="&#x219f;" horiz-adv-x="1024" d="M471 1200q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q132 46 229.5 150.5t132.5 238.5q3 23 13 67q6 18 24 18t22 -18q4 -22 13 -66q35 -135 132.5 -239.5t229.5 -150.5q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59 q-158 84 -248 232v-140q38 -129 134 -228.5t223 -143.5q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59q-158 84 -248 232v-1161q0 -37 -41 -37t-41 37v1161q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q127 44 223 143.5 t134 227.5v141z" />
+<glyph unicode="&#x21a0;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-234q-133 -60 -226 -170q-94 -111 -132 -258q-3 -16 -10 -41t-21 -25h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-1164q-39 0 -39 41 t39 41h1164q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h229q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z " />
+<glyph unicode="&#x21a1;" horiz-adv-x="1024" d="M553 -36q136 223 414 293q22 0 22 -18q0 -60 -14 -64q-22 -6 -65 -19q-132 -46 -229.5 -150.5t-132.5 -239.5q-4 -22 -13 -66q-4 -18 -22 -18t-24 18q-4 23 -13 67q-35 134 -132.5 238.5t-229.5 150.5q-22 6 -65 19q-14 6 -14 19q0 51 -1 40q2 23 23 23l6 -2 q104 -29 161 -59q157 -83 247 -232v141q-38 128 -134 227.5t-223 143.5q-22 6 -65 19q-14 6 -14 19q0 51 -1 40q2 23 23 23l6 -2q104 -29 161 -59q157 -83 247 -232v1161q0 37 41 37t41 -37v-1161q136 223 414 293q22 0 22 -18q0 -60 -14 -64q-22 -6 -65 -19 q-127 -44 -223 -143.5t-134 -228.5v-140z" />
+<glyph unicode="&#x21a2;" d="M1963 74q0 -27 -21 -27q-45 0 -36 -1q-20 2 -24 19t-12 48q-38 146 -132.5 257.5t-230.5 170.5h-1169q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5 q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h1169q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-26 -118 -93 -224q-97 -154 -247 -249q150 -95 247 -249q67 -106 93 -224q7 -31 7 -35z" />
+<glyph unicode="&#x21a3;" d="M1963 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-1169q-282 -122 -363 -428q-3 -16 -9.5 -40.5t-26.5 -26.5q9 1 -36 1q-21 0 -21 27q0 4 7 35q26 118 93 224q97 154 247 249 q-150 95 -247 249q-67 106 -93 224q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h1169q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18 q16 -9 16 -23z" />
+<glyph unicode="&#x21a4;" d="M1965 44q0 -62 -41 -62t-41 62v497h-1545q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432 h1545v498q0 61 41 61t41 -61v-1077z" />
+<glyph unicode="&#x21a5;" horiz-adv-x="1024" d="M471 1200q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q132 46 229.5 150.5t132.5 238.5q3 23 13 67q6 18 24 18t22 -18q4 -22 13 -66q35 -135 132.5 -239.5t229.5 -150.5q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59 q-158 84 -248 232v-1481q0 -37 -41 -37t-41 37v1481zM926 1606q63 0 63 -40.5t-63 -40.5h-828q-63 0 -63 40.5t63 40.5h828z" />
+<glyph unicode="&#x21a6;" d="M1906 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-1543v-497q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-498h1543q-154 111 -238 288q-57 121 -57 179q0 24 21 28 q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310z" />
+<glyph unicode="&#x21a7;" horiz-adv-x="1024" d="M553 -36q136 223 414 293q22 0 22 -18q0 -60 -14 -64q-22 -6 -65 -19q-132 -46 -229.5 -150.5t-132.5 -239.5q-4 -22 -13 -66q-4 -18 -22 -18t-24 18q-4 23 -13 67q-35 134 -132.5 238.5t-229.5 150.5q-22 6 -65 19q-14 6 -14 19q0 51 -1 40q2 23 23 23l6 -2 q104 -29 161 -59q157 -83 247 -232v1481q0 37 41 37t41 -37v-1481zM926 -361q63 0 63 -40.5t-63 -40.5h-828q-63 0 -63 40.5t63 40.5h828z" />
+<glyph unicode="&#x21a8;" horiz-adv-x="1024" d="M553 -35q135 222 414 292q20 0 23 -24q-1 9 -1 -39q0 -14 -14 -18q-76 -23 -117.5 -40.5t-90.5 -52.5q-173 -124 -222 -329q-3 -18 -10 -54q-5 -18 -23 -18t-22 18l-18 80q-14 62 -60 137q-109 177 -304 243q-20 4 -59 16q-14 5 -14 63q0 18 22 18l6 -2q102 -28 158 -57 q158 -82 250 -233v1234q-136 -223 -414 -292q-22 0 -22 63q0 13 14 18q20 5 59 16q194 66 304 244q44 72 65 154q3 21 12 62q5 18 23.5 18t22.5 -18q4 -22 13 -66q34 -133 131.5 -237.5t220.5 -150.5l75 -22q14 -5 14 -63q0 -18 -22 -18l-6 2q-277 76 -408 290v-1234z M926 -361q63 0 63 -40.5t-63 -40.5h-828q-63 0 -63 40.5t63 40.5h828z" />
+<glyph unicode="&#x21a9;" d="M1624 1168l-89 -10q-41 0 -41 44q0 48 130 48q348 0 348 -355q0 -244 -194 -316q-104 -38 -401 -38h-1039q222 -158 288 -432q7 -29 7 -35q0 -28 -37.5 -28t-43 18t-12.5 49q-37 146 -134.5 261t-274.5 188q-16 7 -16 21t62 40q133 56 229 170q114 135 141 294 q7 23 16 27t20 4q50 0 50 -28q0 -6 -7 -35q-65 -270 -288 -432h1159q184 0 271 44q122 62 122 228q0 142 -62 207.5t-204 65.5z" />
+<glyph unicode="&#x21aa;" d="M552 1158l-89 10q-142 0 -204 -65.5t-62 -207.5q0 -166 122 -228q87 -44 271 -44h1159q-223 162 -288 432q-7 29 -7 35q0 28 50 28q24 0 32 -20q4 -16 11 -47q37 -144 133.5 -258t229.5 -170q62 -26 62 -40t-16 -21q-177 -73 -274.5 -188t-134.5 -261q-3 -16 -11 -47 q-7 -20 -44.5 -20t-37.5 28q0 6 7 35q66 274 288 432h-1039q-297 0 -401 38q-194 72 -194 316q0 355 348 355q130 0 130 -48q0 -44 -41 -44z" />
+<glyph unicode="&#x21ab;" d="M1972 895q0 -249 -203 -319q-102 -35 -413 -35v-520q0 -37 -41 -37t-41 37v520h-936q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1 q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h936v59q0 261 50 381q78 187 300 187q348 0 348 -355zM1356 623l141 -2q183 0 269 44q124 62 124 230q0 142 -62 207.5t-204 65.5q-184 0 -239 -164q-29 -85 -29 -322v-59z" />
+<glyph unicode="&#x21ac;" d="M1933 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-936v-520q0 -37 -41 -37t-41 37v520q-311 0 -413 35q-203 70 -203 319q0 355 348 355q222 0 300 -187q50 -120 50 -381v-59h936 q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23zM551 621l141 2v59q0 237 -29 322q-55 164 -239 164q-142 0 -204 -65.5t-62 -207.5q0 -168 124 -230q86 -44 269 -44z" />
+<glyph unicode="&#x21ad;" horiz-adv-x="2560" d="M2399 582q0 -16 -15 -20q-163 -57 -276.5 -191t-144.5 -305q-3 -19 -21 -19h-41q-20 0 -20 27q51 292 295 467h-72q-84 0 -241 -115t-263 -115t-208 77q-64 48 -163.5 161.5t-151.5 155.5q-83 66 -162.5 66t-240 -115t-264.5 -115h-72q244 -175 295 -467q0 -27 -20 -27 h-41q-18 0 -21 19q-31 171 -144.5 304.5t-276.5 188.5q-15 8 -15 23.5t15 19.5q163 57 276.5 191t144.5 305q3 19 21 19h41q20 0 20 -27q-51 -292 -295 -467h72q82 0 239.5 115t263.5 115t208 -78q59 -46 160.5 -161t153.5 -156q83 -65 163.5 -65t241 115t264.5 115h72 q-244 175 -295 467q0 27 20 27h41q18 0 21 -19q31 -171 144.5 -304.5t276.5 -188.5q15 -7 15 -23z" />
+<glyph unicode="&#x21ae;" horiz-adv-x="2560" d="M2420 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-924l-257 -445q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l233 404h-865q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41 q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h913l257 446q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-234 -405h877q-154 111 -238 288 q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310z" />
+<glyph unicode="&#x21af;" d="M1924 1488q0 -21 -18 -31l-992 -573l590 -400l-1113 -643q271 -6 456 -207q8 -9 8 -19t-22 -24t-37 -14q-1 0 -60 52q-156 138 -375 138q-76 0 -147.5 -21t-67.5 -21q-22 0 -22 22q0 9 58 63q166 155 166 406q0 55 -10 102l-16 71q0 12 22.5 26.5t35 14.5t18.5 -18 q29 -89 29 -201q0 -159 -77 -299l1001 579l-589 400l1103 637q7 4 17 4q42 0 42 -44z" />
+<glyph unicode="&#x21b0;" horiz-adv-x="1024" d="M906 41q0 -41 -41 -41t-41 41v1052h-527q126 -107 178 -251q3 -8 3 -15q0 -39 -42 -39q-24 0 -34 22l-27 62q-76 149 -230 236q-27 15 -27 26t27 26q155 88 230 237q8 20 25 59q12 26 36 26q42 0 42 -39q0 -7 -3 -15q-52 -146 -179 -253h569q41 0 41 -41v-1093z" />
+<glyph unicode="&#x21b1;" horiz-adv-x="1024" d="M906 1134q0 -11 -27 -26q-154 -87 -230 -236l-25 -58q-12 -26 -36 -26q-42 0 -42 39q0 7 3 15q52 144 178 251h-527v-1052q0 -41 -41 -41t-41 41v1093q0 41 41 41h569q-127 107 -179 253q-3 8 -3 15q0 39 42 39q24 0 34 -23l27 -62q75 -149 230 -237q27 -15 27 -26z" />
+<glyph unicode="&#x21b2;" horiz-adv-x="1024" d="M906 348q0 -41 -41 -41h-569q127 -107 179 -253q3 -8 3 -15q0 -39 -42 -39q-24 0 -34 23l-27 62q-75 149 -230 237q-27 15 -27 26t27 26q154 87 230 236l25 58q12 26 36 26q42 0 42 -39q0 -7 -3 -15q-52 -144 -178 -251h527v1052q0 41 41 41t41 -41v-1093z" />
+<glyph unicode="&#x21b3;" horiz-adv-x="1024" d="M906 348q0 -11 -27 -26q-155 -88 -230 -237q-8 -20 -25 -59q-12 -26 -36 -26q-42 0 -42 39q0 7 3 15q52 146 179 253h-569q-41 0 -41 41v1093q0 41 41 41t41 -41v-1052h527q-126 107 -178 251q-3 8 -3 15q0 39 42 39q24 0 34 -22l27 -62q76 -149 230 -236q27 -15 27 -26z " />
+<glyph unicode="&#x21b4;" horiz-adv-x="1024" d="M906 318q0 -24 -23 -34l-62 -27q-149 -75 -237 -230q-15 -27 -26 -27t-26 27q-87 154 -236 230l-58 25q-26 12 -26 36q0 42 39 42q7 0 15 -3q144 -52 251 -178v1221h-358q-41 0 -41 41t41 41h399q41 0 41 -41v-1263q107 127 253 179q8 3 15 3q39 0 39 -42z" />
+<glyph unicode="&#x21b5;" d="M1748 582q0 -41 -41 -41h-1369q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h1328v818 q0 41 41 41t41 -41v-859z" />
+<glyph unicode="&#x21b6;" d="M1972 4q0 -45 -41 -45t-41 37q0 160 -49 320q-77 251 -244 403q-184 168 -432 168q-295 0 -509.5 -207.5t-217.5 -501.5q107 127 253 179q8 3 15 3q39 0 39 -42q0 -24 -23 -34l-62 -27q-149 -75 -237 -230q-15 -27 -26 -27t-26 27q-87 154 -236 230l-58 25q-26 12 -26 36 q0 42 39 42q7 0 15 -3q144 -52 251 -178q2 328 240.5 559t568.5 231q361 0 594 -309q213 -283 213 -656z" />
+<glyph unicode="&#x21b7;" d="M1997 318q0 -24 -23 -34l-61 -27q-149 -76 -236 -230q-15 -27 -26 -27t-26 27q-88 155 -237 230q-20 8 -59 25q-26 12 -26 36q0 42 39 42q7 0 15 -3q146 -52 253 -179q-3 294 -217.5 501.5t-509.5 207.5q-248 0 -432 -168q-167 -152 -244 -403q-49 -160 -49 -320 q0 -37 -41 -37t-41 45q0 373 213 656q233 309 594 309q330 0 568.5 -231t240.5 -559q107 126 251 178q8 3 15 3q39 0 39 -42z" />
+<glyph unicode="&#x21b8;" d="M1924 -274q0 -44 -44 -44q-14 0 -24 10l-1556 1556q19 -77 19 -150q0 -173 -101 -345q-8 -13 -18.5 -13t-30.5 20t-20 30l35 69q56 112 56 249q0 160 -76 283q-40 66 -40 68q0 23 24 23l67 -40q127 -76 273 -76t259 56q71 35 67 35q10 0 30.5 -19t20.5 -31t-12 -19 q-165 -100 -346 -100q-76 0 -149 18l1556 -1556q10 -10 10 -24zM1931 1565q0 -41 -39 -41h-1738q-39 0 -39 41t39 41h1738q39 0 39 -41z" />
+<glyph unicode="&#x21b9;" d="M1918 -255q0 -63 -41 -63t-41 63v930q0 63 41 63t41 -63v-930zM597 913q223 -136 293 -414q0 -22 -18 -22q-60 0 -64 14q-6 22 -19 65q-46 132 -150.5 229.5t-239.5 132.5q-22 4 -66 13q-18 4 -18 22t18 24q23 4 67 13q134 35 238.5 132.5t150.5 229.5q6 23 19 65 q6 14 19 14q51 0 40 1q23 -2 23 -23l-2 -6q-29 -104 -59 -161q-83 -157 -232 -247h1299q37 0 37 -41t-37 -41h-1299zM1451 251q-223 134 -293 414q0 22 18 22q58 0 64 -14q6 -22 19 -65q67 -192 239 -298q75 -46 164 -67q22 -3 43 -7q28 -7 28 -25.5t-18 -23.5 q-22 -4 -66 -13q-134 -35 -240 -133t-151 -229l-18 -65q-4 -14 -19 -14q-48 0 -39 -1q-24 3 -24 23l2 6q38 139 109 239.5t182 168.5h-1299q-37 0 -37 41t37 41h1299zM212 489q0 -63 -41 -63t-41 63v930q0 63 41 63t41 -63v-930z" />
+<glyph unicode="&#x21ba;" horiz-adv-x="1590" d="M1516 582q0 -297 -211.5 -509.5t-509 -212.5t-509.5 212t-212 510q0 205 111.5 385.5t296.5 264.5q9 5 18 5q39 0 39 -42q0 -25 -23 -35q-164 -75 -263 -235.5t-99 -342.5q0 -265 188.5 -453.5t453 -188.5t452.5 189t188 453q0 183 -97 339t-259 236q38 -109 38 -185 q1 -3 1 -7q0 -71 -9 -120q-4 -21 -23 -29.5t-39 3t-17 36t7 67.5q1 17 1 33q0 148 -81 287q-16 27 -11 36q6 9 37 9h4q174 0 313 90l51 37q13 10 26 10q9 0 18 -5q24 -14 24 -33q0 -10 -7 -22q-4 -6 -10 -11q-118 -100 -279 -128q179 -92 285.5 -266t106.5 -377z" />
+<glyph unicode="&#x21bb;" horiz-adv-x="1590" d="M1516 582q0 -298 -212 -510t-509.5 -212t-509 212.5t-211.5 509.5q0 203 106.5 377t285.5 266q-161 28 -279 128q-6 5 -10 11q-7 12 -7 22q0 19 24 33q9 5 18 5q12 0 23 -8l54 -39q139 -90 313 -90h4q31 0 36.5 -9t-10.5 -36q-81 -139 -81 -287q0 -16 1 -33 q2 -21 6 -56.5t-16 -47t-39 -3t-23 29.5q-9 49 -9 120q0 4 1 7q0 76 38 185q-162 -80 -259 -236t-97 -339q0 -264 188 -453t452.5 -189t453 188.5t188.5 453.5q0 182 -99 342.5t-263 235.5q-23 10 -23 35q0 42 39 42q9 0 18 -5q185 -84 296.5 -264.5t111.5 -385.5z" />
+<glyph unicode="&#x21bc;" d="M1931 582q0 -41 -39 -41h-1710q-67 0 -67 41q0 16 62 41q132 54 230 170t133 258q2 16 11 47q8 20 45 20t37 -28q0 -7 -7 -35q-69 -273 -288 -432h1554q39 0 39 -41z" />
+<glyph unicode="&#x21bd;" d="M1931 582q0 -41 -39 -41h-1554q224 -163 288 -432q7 -30 7 -35q0 -28 -50 -28q-25 0 -30.5 18t-12.5 49q-37 145 -133 258t-230 170q-19 7 -40.5 16t-21.5 25q0 41 67 41h1710q39 0 39 -41z" />
+<glyph unicode="&#x21be;" horiz-adv-x="1024" d="M969 1062q20 -8 20 -45t-28 -37q-7 0 -35 7q-273 69 -432 288v-1554q0 -39 -41 -39t-41 39v1710q0 67 41 67q16 0 41 -62q54 -132 170 -230t258 -133q16 -2 47 -11z" />
+<glyph unicode="&#x21bf;" horiz-adv-x="1024" d="M612 -279q0 -39 -41 -39t-41 39v1554q-159 -219 -432 -288q-28 -7 -35 -7q-28 0 -28 37t20 45q16 4 47 11q142 35 258 133t170 230q25 62 41 62q41 0 41 -67v-1710z" />
+<glyph unicode="&#x21c0;" d="M1931 582q0 -41 -67 -41h-1710q-39 0 -39 41t39 41h1554q-219 159 -288 432q-7 28 -7 35q0 28 37 28t45 -20q4 -16 11 -47q35 -142 133 -258t230 -170q62 -25 62 -41z" />
+<glyph unicode="&#x21c1;" d="M1931 582q0 -16 -21.5 -25t-40.5 -16q-134 -57 -230 -170t-133 -258q-3 -28 -25 -64q-6 -3 -18 -3q-50 0 -50 28q0 5 7 35q64 269 288 432h-1554q-39 0 -39 41t39 41h1710q67 0 67 -41z" />
+<glyph unicode="&#x21c2;" horiz-adv-x="1024" d="M961 200q28 0 28 -37t-20 -45q-16 -4 -47 -11q-142 -35 -258 -133t-170 -230q-25 -62 -41 -62q-41 0 -41 67v1710q0 39 41 39t41 -39v-1554q159 219 432 288q28 7 35 7z" />
+<glyph unicode="&#x21c3;" horiz-adv-x="1024" d="M612 -251q0 -67 -41 -67q-16 0 -41 62q-54 132 -170 230t-258 133q-16 2 -47 11q-20 8 -20 45t28 37q7 0 35 -7q273 -69 432 -288v1554q0 39 41 39t41 -39v-1710z" />
+<glyph unicode="&#x21c4;" d="M1651 995q-223 135 -293 414q0 21 23 23q-11 -1 40 -1q13 0 19 -14q6 -22 19 -65q46 -132 150.5 -229.5t238.5 -132.5q23 -3 67 -13q18 -6 18 -24t-18 -22q-22 -4 -66 -13q-135 -35 -239.5 -132.5t-150.5 -229.5q-6 -22 -19 -65q-4 -14 -64 -14q-18 0 -18 22l2 6 q28 102 59 160q84 158 232 248h-1499q-37 0 -37 41t37 41h1499zM397 231q224 -137 293 -414q0 -20 -24 -23q9 1 -39 1q-15 0 -19 14q-5 22 -18 65q-45 131 -151 229t-240 133q-22 4 -66 13q-18 5 -18 23.5t24.5 24t46.5 8.5q205 48 329 221q46 64 74 144q6 23 19 65 q6 14 64 14q18 0 18 -22l-2 -6q-38 -143 -108 -241.5t-183 -166.5h1499q37 0 37 -41t-37 -41h-1499z" />
+<glyph unicode="&#x21c5;" horiz-adv-x="1704" d="M1233 -36q136 223 414 293q22 0 22 -18q0 -60 -14 -64q-22 -6 -65 -19q-132 -46 -229.5 -150.5t-132.5 -239.5q-4 -22 -13 -66q-4 -18 -22 -18t-24 18q-4 23 -13 67q-35 134 -132.5 238.5t-229.5 150.5q-22 6 -65 19q-14 6 -14 19q0 51 -1 40q2 23 23 23l6 -2 q104 -29 161 -59q157 -83 247 -232v1481q0 37 41 37t41 -37v-1481zM471 1200q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q132 46 229.5 150.5t132.5 238.5q3 23 13 67q6 18 24 18t22 -18q4 -22 13 -66q35 -135 132.5 -239.5t229.5 -150.5 q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59q-158 84 -248 232v-1481q0 -37 -41 -37t-41 37v1481z" />
+<glyph unicode="&#x21c6;" d="M397 913q223 -136 293 -414q0 -22 -18 -22q-60 0 -64 14q-6 22 -19 65q-46 132 -150.5 229.5t-239.5 132.5q-22 4 -66 13q-18 4 -18 22t18 24q23 4 67 13q134 35 238.5 132.5t150.5 229.5q6 23 19 65q6 14 19 14q51 0 40 1q23 -2 23 -23l-2 -6q-29 -104 -59 -161 q-83 -157 -232 -247h1499q37 0 37 -41t-37 -41h-1499zM1651 313q-223 134 -293 414q0 22 18 22q58 0 64 -14q6 -22 19 -65q67 -192 239 -298q75 -46 164 -67q22 -3 43 -7q28 -7 28 -25.5t-18 -23.5q-22 -4 -66 -13q-134 -35 -240 -133t-151 -229l-18 -65q-4 -14 -19 -14 q-48 0 -39 -1q-24 3 -24 23l2 6q38 139 109 239.5t182 168.5h-1499q-37 0 -37 41t37 41h1499z" />
+<glyph unicode="&#x21c7;" d="M397 881q180 -108 256 -299q-76 -191 -256 -299h1499q37 0 37 -41t-37 -41h-1499q223 -135 293 -414q0 -21 -23 -23q11 1 -40 1q-13 0 -19 14q-6 22 -19 65q-46 132 -150.5 229.5t-238.5 132.5q-23 3 -67 13q-18 6 -18 24t18 22q22 4 66 13q252 65 366 304 q-114 239 -366 304q-22 4 -66 13q-18 4 -18 22t18 24q23 4 67 13q134 35 238.5 132.5t150.5 229.5q6 22 19 65q6 14 19 14q51 0 40 1q23 -2 23 -23l-2 -6q-29 -104 -59 -161q-83 -157 -232 -247h1499q37 0 37 -41t-37 -41h-1499z" />
+<glyph unicode="&#x21c8;" horiz-adv-x="1704" d="M471 1200q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q132 46 229.5 150.5t132.5 238.5q3 23 13 67q6 18 24 18t22 -18q4 -22 13 -66q65 -252 304 -366q239 114 304 366q4 22 13 66q4 18 22 18t24 -18q4 -23 13 -67q35 -134 132.5 -238.5 t229.5 -150.5q22 -6 65 -19q14 -6 14 -19q0 -51 1 -40q-2 -23 -23 -23l-6 2q-104 29 -161 59q-157 83 -247 232v-1481q0 -37 -41 -37t-41 37v1481q-108 -180 -299 -256q-191 76 -299 256v-1481q0 -37 -41 -37t-41 37v1481z" />
+<glyph unicode="&#x21c9;" d="M1651 963q-223 135 -293 414q0 21 23 23q-11 -1 40 -1q13 0 19 -14q6 -22 19 -65q46 -132 150.5 -229.5t238.5 -132.5q23 -3 67 -13q18 -6 18 -24t-18 -22q-22 -4 -66 -13q-252 -65 -366 -304q114 -239 366 -304q22 -4 66 -13q18 -4 18 -22t-18 -24q-23 -4 -67 -13 q-134 -35 -238.5 -132.5t-150.5 -229.5q-6 -22 -19 -65q-6 -14 -19 -14q-51 0 -40 -1q-23 2 -23 23l2 6q29 104 59 161q83 157 232 247h-1499q-37 0 -37 41t37 41h1499q-180 108 -256 299q76 191 256 299h-1499q-37 0 -37 41t37 41h1499z" />
+<glyph unicode="&#x21ca;" horiz-adv-x="1704" d="M1233 -36q135 223 414 293q21 0 23 -23q-1 11 -1 -40q0 -13 -14 -19q-22 -6 -65 -19q-132 -46 -229.5 -150.5t-132.5 -238.5q-3 -23 -13 -67q-6 -18 -24 -18t-22 18q-4 22 -13 66q-65 252 -304 366q-239 -114 -304 -366q-4 -22 -13 -66q-4 -18 -22 -18t-24 18 q-4 23 -13 67q-35 134 -132.5 238.5t-229.5 150.5q-22 6 -65 19q-14 6 -14 19q0 51 -1 40q2 23 23 23l6 -2q104 -29 161 -59q157 -83 247 -232v1481q0 37 41 37t41 -37v-1481q108 180 299 256q191 -76 299 -256v1481q0 37 41 37t41 -37v-1481z" />
+<glyph unicode="&#x21cb;" d="M1931 782q0 -41 -67 -41h-1710q-39 0 -39 41t39 41h1554q-219 159 -288 432q-7 28 -7 35q0 28 37 28t45 -20q4 -16 11 -47q35 -142 133 -258t230 -170q62 -25 62 -41zM1931 382q0 -41 -39 -41h-1554q224 -163 288 -432q7 -30 7 -35q0 -28 -50 -28q-25 0 -30.5 18 t-12.5 49q-37 145 -133 258t-230 170q-19 7 -40.5 16t-21.5 25q0 41 67 41h1710q39 0 39 -41z" />
+<glyph unicode="&#x21cc;" d="M1931 382q0 -16 -21.5 -25t-40.5 -16q-134 -57 -230 -170t-133 -258q-3 -28 -25 -64q-6 -3 -18 -3q-50 0 -50 28q0 5 7 35q64 269 288 432h-1554q-39 0 -39 41t39 41h1710q67 0 67 -41zM1931 782q0 -41 -39 -41h-1710q-67 0 -67 41q0 16 62 41q132 54 230 170t133 258 q2 16 11 47q8 20 45 20t37 -28q0 -7 -7 -35q-69 -273 -288 -432h1554q39 0 39 -41z" />
+<glyph unicode="&#x21cd;" d="M1932 383q0 -41 -37 -41h-462l-142 -246q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l118 205h-684q45 -44 126 -155t81 -146q0 -20 -23 -23q7 1 -38 1q-11 0 -17 12q-74 142 -162 238q-175 191 -418 272l-71 21q-16 5 -16 20t16 23l68 20q172 56 323 177.5t260 330.5 q6 12 58 12q20 0 20 -28.5t-80.5 -138.5t-126.5 -156h961l143 247q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-119 -206h185q37 0 37 -41t-37 -41h-232l-183 -316h415q37 0 37 -41zM1568 740h-1004q-120 -99 -262 -158q142 -59 262 -158h822z" />
+<glyph unicode="&#x21ce;" horiz-adv-x="2560" d="M2444 605q14 -8 14 -22.5t-14 -20.5q-201 -89 -318.5 -204t-188.5 -255l-32 -70q-7 -14 -59 -14q-21 0 -21 22q0 38 67.5 142.5t113.5 158.5h-833l-142 -246q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l118 205h-524q43 -47 111.5 -155t68.5 -146q0 -22 -61 -22 q-11 0 -19 19l-30 64q-85 171 -219 285t-287 175q-16 6 -16 20.5t16 22.5q31 13 92 41q276 140 414 417l31 68q7 14 59 14q20 0 20 -22q0 -38 -68 -144.5t-112 -156.5h801l143 247q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-119 -206h556q-48 58 -114.5 160.5t-66.5 140.5 q0 22 62 22q11 0 18 -14l57 -115q31 -55 72 -108q135 -174 332 -269q28 -11 78 -34zM2303 582q-122 66 -219 158h-681l-183 -316h864q97 92 219 158zM1308 740h-832q-97 -92 -219 -158q122 -66 219 -158h650z" />
+<glyph unicode="&#x21cf;" d="M1932 582q0 -15 -14 -20q-36 -10 -107 -34q-357 -136 -546 -497q-6 -12 -58 -12q-20 0 -20 22q0 36 80.5 145.5t126.5 155.5h-961l-142 -246q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l118 205h-183q-39 0 -39 41t39 41h231l182 316h-413q-39 0 -39 41t39 41h460l143 247 q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-119 -206h684q-50 52 -128.5 158.5t-78.5 142.5q0 20 23 23q-5 -1 38 -1q11 0 17 -12q110 -208 259.5 -329.5t324.5 -178.5q28 -6 69 -20q14 -8 14 -23zM1746 582q-142 59 -262 158h-821l-183 -316h1004q120 99 262 158z" />
+<glyph unicode="&#x21d0;" d="M1932 383q0 -41 -37 -41h-1241q45 -44 126 -155t81 -146q0 -20 -23 -23q7 1 -38 1q-11 0 -17 12q-74 142 -162 238q-175 191 -418 272l-71 21q-16 5 -16 20t16 23l68 20q172 56 323 177.5t260 330.5q6 12 58 12q20 0 20 -28.5t-80.5 -138.5t-126.5 -156h1241q37 0 37 -41 t-37 -41h-1331q-120 -99 -262 -158q142 -59 262 -158h1331q37 0 37 -41z" />
+<glyph unicode="&#x21d1;" horiz-adv-x="1251" d="M1189 755q0 -18 -29 -18t-134.5 78t-160.5 129v-1225q0 -37 -41 -37t-41 37v1315q-99 122 -157 264q-56 -139 -158 -264v-1315q0 -37 -41 -37t-41 37v1225q-47 -47 -156 -127t-145 -80q-23 0 -23 63q0 8 13 15q214 120 330.5 262t173.5 307l24 80q6 18 23 18t22 -18 q48 -163 115.5 -274t163 -199.5t250.5 -175.5q12 -7 12 -60z" />
+<glyph unicode="&#x21d2;" d="M1932 582q0 -15 -14 -20q-36 -10 -107 -34q-357 -136 -546 -497q-6 -12 -58 -12q-20 0 -20 22q0 36 80.5 145.5t126.5 155.5h-1239q-39 0 -39 41t39 41h1329q120 99 262 158q-142 59 -262 158h-1329q-39 0 -39 41t39 41h1239q-50 52 -128.5 158.5t-78.5 142.5q0 20 23 23 q-5 -1 38 -1q11 0 17 -12q110 -208 259.5 -329.5t324.5 -178.5q28 -6 69 -20q14 -8 14 -23z" />
+<glyph unicode="&#x21d3;" horiz-adv-x="1251" d="M1189 364q0 -8 -12 -15q-158 -89 -238 -163q-196 -181 -273 -422q-5 -22 -18 -64q-6 -18 -22.5 -18t-22.5 18q-7 27 -24 81q-56 165 -174.5 309t-329.5 259q-13 7 -13 15v45q0 18 29 18t141 -81.5t154 -125.5v1225q0 37 41 37t41 -37v-1315q101 -125 158 -264 q57 142 157 264v1315q0 37 41 37t41 -37v-1225q46 46 156 126.5t145 80.5q21 0 24 -24q-1 7 -1 -39z" />
+<glyph unicode="&#x21d4;" horiz-adv-x="2560" d="M2444 605q14 -8 14 -22.5t-14 -20.5q-201 -89 -318.5 -204t-188.5 -255l-32 -70q-7 -14 -59 -14q-21 0 -21 22q0 38 67.5 142.5t113.5 158.5h-1452q43 -47 111.5 -155t68.5 -146q0 -22 -61 -22q-11 0 -19 19l-30 64q-88 176 -242 304q-116 97 -264 156q-16 6 -16 20.5 t16 22.5q31 13 92 41q276 140 414 417l31 68q7 14 59 14q20 0 20 -22q0 -38 -68 -144.5t-112 -156.5h1452q-48 58 -114.5 160.5t-66.5 140.5q0 22 62 22q11 0 18 -14l57 -115q31 -55 72 -108q135 -174 332 -269q28 -11 78 -34zM2303 582q-122 66 -219 158h-1608 q-97 -92 -219 -158q122 -66 219 -158h1608q97 92 219 158z" />
+<glyph unicode="&#x21d5;" horiz-adv-x="1251" d="M1189 127q0 -11 -17 -18q-334 -143 -490 -461l-21 -53q-17 -37 -35 -37q-14 0 -21 12q-11 26 -34 76q-101 204 -269 335q-76 59 -223 128q-17 8 -18 27q1 -17 1 36q0 19 30 19t139.5 -69.5t154.5 -110.5v1142q-48 -42 -156.5 -111t-144.5 -69q-23 0 -23 64q0 11 17 18 q343 147 500 477q9 22 28 64q5 10 19 10t22 -20l29 -66q66 -138 187.5 -261.5t307.5 -203.5q17 -7 17 -18v-45q0 -19 -29 -19t-134.5 67.5t-160.5 112.5v-1142q49 42 157 111t144 69q21 0 24 -24q-1 5 -1 -40zM783 -67v1298q-92 99 -157 219q-64 -117 -158 -219v-1298 q94 -102 158 -219q65 120 157 219z" />
+<glyph unicode="&#x21d6;" d="M1924 5q0 -42 -43 -42q-16 0 -25 9l-1297 1298q-157 16 -297 75q59 -138 75 -298l1296 -1297q10 -10 10 -25q0 -43 -43 -43q-15 0 -25 10l-1233 1233q0 -75 -23 -220.5t-58 -145.5q-10 0 -29.5 17.5t-19.5 24t2 13.5q53 191 53 327q0 230 -99 432q-44 90 -44 87 q0 22 23 22q5 0 13 -4q166 -85 275 -111.5t233.5 -26.5t324.5 54h6q11 0 29.5 -17.5t18.5 -27.5t-7 -18q-23 -25 -155 -45t-204 -22l1233 -1234q10 -10 10 -25z" />
+<glyph unicode="&#x21d7;" d="M1924 1460q0 3 -44 -87q-99 -202 -99 -432q0 -136 53 -327q2 -7 2 -13.5t-19.5 -24t-29.5 -17.5q-35 0 -58 145.5t-23 220.5l-1233 -1233q-10 -10 -25 -10q-43 0 -43 43q0 15 10 25l1296 1297q16 160 75 298q-140 -59 -297 -75l-1297 -1298q-9 -9 -25 -9q-43 0 -43 42 q0 15 10 25l1233 1234q-72 2 -204 22t-155 45q-7 8 -7 18t18.5 27.5t26.5 17.5h9q200 -54 324.5 -54t233.5 26.5t275 111.5q8 4 13 4q23 0 23 -22z" />
+<glyph unicode="&#x21d8;" d="M1924 -296q0 -22 -23 -22q-5 0 -13 4q-166 85 -275 111.5t-233.5 26.5t-324.5 -54h-6q-11 0 -29.5 17.5t-18.5 27.5t7 18q23 25 155 45t204 22l-1233 1234q-10 10 -10 25q0 42 43 42q16 0 25 -9l1297 -1298q157 -16 297 -75q-59 138 -75 298l-1296 1297q-10 10 -10 25 q0 43 43 43q15 0 25 -10l1233 -1233q0 75 23 220.5t58 145.5q10 0 29.5 -17.5t19.5 -24t-2 -13.5q-53 -191 -53 -327q0 -230 99 -432q44 -90 44 -87z" />
+<glyph unicode="&#x21d9;" d="M1924 1159q0 -15 -10 -25l-1233 -1234q72 -2 204 -22t155 -45q7 -8 7 -18t-18.5 -27.5t-26.5 -17.5h-9q-200 54 -324.5 54t-233.5 -26.5t-275 -111.5q-8 -4 -13 -4q-23 0 -23 22q0 -3 44 87q99 202 99 432q0 136 -53 327q-2 7 -2 13.5t19.5 24t29.5 17.5q35 0 58 -145.5 t23 -220.5l1233 1233q10 10 25 10q43 0 43 -43q0 -15 -10 -25l-1296 -1297q-16 -160 -75 -298q140 59 297 75l1297 1298q9 9 25 9q43 0 43 -42z" />
+<glyph unicode="&#x21da;" d="M1931 185q0 -41 -37 -41h-1222q71 -117 118 -247q3 -8 3 -15q0 -39 -42 -39q-22 0 -36 27q-18 46 -57 136q-136 277 -394 462l-124 79q-25 17 -25 35t25 35q42 25 124 78q255 182 394 464q18 46 57 135q14 27 36 27q42 0 42 -39q0 -7 -3 -15q-47 -130 -118 -247h1222 q37 0 37 -41t-37 -41h-1277q-132 -186 -317 -315h1590q41 0 41 -41t-41 -41h-1590q186 -131 318 -315h1276q37 0 37 -41z" />
+<glyph unicode="&#x21db;" d="M1931 582q0 -18 -25 -35q-42 -25 -124 -79q-258 -185 -394 -462q-17 -46 -57 -136q-14 -27 -36 -27q-42 0 -42 39q0 7 3 15q47 130 118 247h-1222q-37 0 -37 41t37 41h1276q132 184 318 315h-1590q-41 0 -41 41t41 41h1590q-185 129 -317 315h-1277q-37 0 -37 41t37 41 h1222q-71 117 -118 247q-3 8 -3 15q0 39 42 39q22 0 36 -27q18 -46 57 -135q139 -282 394 -464q42 -25 124 -78q25 -17 25 -35z" />
+<glyph unicode="&#x21dc;" d="M1931 582q0 -20 -10 -29l-190 -170q-13 -12 -31 -12t-31 12l-348 314l-348 -314q-13 -12 -31 -12t-31 12l-176 158h-442q127 -107 179 -253q3 -8 3 -15q0 -39 -42 -39q-24 0 -34 23l-27 62q-75 149 -230 237q-27 15 -27 26t27 26q154 87 230 236l25 58q12 26 36 26 q42 0 42 -39q0 -7 -3 -15q-52 -144 -178 -251h458q16 0 32 -14l158 -142l348 314q13 12 31 12t31 -12l348 -314l160 142q16 14 30 14q41 0 41 -41z" />
+<glyph unicode="&#x21dd;" d="M1931 582q0 -11 -27 -26q-154 -87 -230 -236l-25 -58q-12 -26 -36 -26q-42 0 -42 39q0 7 3 15q52 144 178 251h-458q-16 0 -32 14l-158 142l-348 -314q-13 -12 -31 -12t-31 12l-348 314l-160 -142q-16 -14 -30 -14q-41 0 -41 41q0 20 10 29l190 170q13 12 31 12t31 -12 l348 -314l348 314q13 12 31 12t31 -12l176 -158h442q-127 107 -179 253q-3 8 -3 15q0 39 42 39q24 0 34 -23l27 -62q75 -149 230 -237q27 -15 27 -26z" />
+<glyph unicode="&#x21de;" horiz-adv-x="1024" d="M471 1200q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q132 46 229.5 150.5t132.5 238.5q3 23 13 67q6 18 24 18t22 -18q4 -22 13 -66q35 -135 132.5 -239.5t229.5 -150.5q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59 q-158 84 -248 232v-718h298q61 0 61 -41t-61 -41h-298v-318h298q61 0 61 -41t-61 -41h-298v-281q0 -37 -41 -37t-41 37v281h-303q-56 0 -56 41t62 41h297v318h-303q-56 0 -56 41t62 41h297v718z" />
+<glyph unicode="&#x21df;" horiz-adv-x="1024" d="M553 -36q136 223 414 293q22 0 22 -18q0 -60 -14 -64q-22 -6 -65 -19q-132 -46 -229.5 -150.5t-132.5 -239.5q-4 -22 -13 -66q-4 -18 -22 -18t-24 18q-4 23 -13 67q-35 134 -132.5 238.5t-229.5 150.5q-22 6 -65 19q-14 6 -14 19q0 51 -1 40q2 23 23 23l6 -2 q104 -29 161 -59q157 -83 247 -232v718h-303q-56 0 -56 41t62 41h297v318h-303q-56 0 -56 41t62 41h297v281q0 37 41 37t41 -37v-281h298q61 0 61 -41t-61 -41h-298v-318h298q61 0 61 -41t-61 -41h-298v-718z" />
+<glyph unicode="&#x21e0;" d="M1931 582q0 -41 -39 -41h-195q-39 0 -39 41t39 41h195q39 0 39 -41zM1531 582q0 -41 -39 -41h-195q-39 0 -39 41t39 41h195q39 0 39 -41zM1131 582q0 -41 -39 -41h-195q-39 0 -39 41t39 41h195q39 0 39 -41zM731 582q0 -41 -39 -41h-354q228 -162 288 -432q7 -31 7 -35 q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h354q39 0 39 -41z" />
+<glyph unicode="&#x21e1;" horiz-adv-x="1024" d="M471 1200q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q132 46 229.5 150.5t132.5 238.5q3 23 13 67q6 18 24 18t22 -18q4 -22 13 -66q35 -135 132.5 -239.5t229.5 -150.5q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59 q-158 84 -248 232v-281q0 -37 -41 -37t-41 37v281zM553 521q0 -39 -41 -39t-41 39v195q0 39 41 39t41 -39v-195zM553 121q0 -39 -41 -39t-41 39v195q0 39 41 39t41 -39v-195zM553 -279q0 -39 -41 -39t-41 39v195q0 39 41 39t41 -39v-195z" />
+<glyph unicode="&#x21e2;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-354q-39 0 -39 41t39 41h354q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5 t230.5 -170.5q16 -5 46 -18q16 -9 16 -23zM1188 582q0 -41 -39 -41h-195q-39 0 -39 41t39 41h195q39 0 39 -41zM788 582q0 -41 -39 -41h-195q-39 0 -39 41t39 41h195q39 0 39 -41zM388 582q0 -41 -39 -41h-195q-39 0 -39 41t39 41h195q39 0 39 -41z" />
+<glyph unicode="&#x21e3;" horiz-adv-x="1024" d="M553 1248q0 -39 -41 -39t-41 39v195q0 39 41 39t41 -39v-195zM553 848q0 -39 -41 -39t-41 39v195q0 39 41 39t41 -39v-195zM553 448q0 -39 -41 -39t-41 39v195q0 39 41 39t41 -39v-195zM553 -36q136 223 414 293q22 0 22 -18q0 -60 -14 -64q-22 -6 -65 -19 q-132 -46 -229.5 -150.5t-132.5 -239.5q-4 -22 -13 -66q-4 -18 -22 -18t-24 18q-4 23 -13 67q-35 134 -132.5 238.5t-229.5 150.5q-22 6 -65 19q-14 6 -14 19q0 51 -1 40q2 23 23 23l6 -2q104 -29 161 -59q157 -83 247 -232v281q0 37 41 37t41 -37v-281z" />
+<glyph unicode="&#x21e4;" d="M1918 582q0 -41 -39 -41h-1354q222 -157 287 -431q8 -34 8 -36q0 -27 -21 -27q-47 0 -53 6t-8 13q-22 84 -35.5 123t-43.5 90q-106 182 -296 265l-47 18q-14 6 -14 22t25 27l40 14q210 91 317 310q24 49 54 163q5 19 20 19q44 0 41 1q21 -4 21 -28q0 -58 -57 -179 q-84 -177 -238 -288h1354q39 0 39 -41zM212 44q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-1077z" />
+<glyph unicode="&#x21e5;" d="M1918 44q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-1077zM1721 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-1354q-39 0 -39 41t39 41h1354q-154 111 -238 288 q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310z" />
+<glyph unicode="&#x21e6;" d="M1933 380q0 -37 -41 -37h-1005q-27 0 -27 -26v-276q0 -24 -36 -24q-4 0 -13.5 0.5t-15 0.5t-13.5 13q-128 221 -266.5 335t-302.5 169q-27 7 -80 24q-18 7 -18 23t18 23l80 24q164 55 302.5 169t266.5 335q8 13 13.5 13t15 0.5t13.5 0.5q36 0 36 -24v-276q0 -26 27 -26 h1005q41 0 41 -37v-404zM1853 449v266q0 24 -27 24h-1007q-41 0 -41 39v198q-74 -101 -125 -154q-155 -160 -354 -240q199 -80 354 -240q51 -53 125 -154v198q0 39 41 39h1007q27 0 27 24z" />
+<glyph unicode="&#x21e7;" horiz-adv-x="1250" d="M1190 773q0 -36 -24 -36h-276q-26 0 -26 -27v-987q0 -41 -37 -41h-404q-37 0 -37 41v987q0 27 -26 27h-276q-24 0 -24 36q0 4 0.5 13.5t0.5 15t13 13.5q221 128 335 266.5t169 302.5q7 27 24 80q7 18 23 18t23 -18l24 -80q55 -164 169 -302.5t335 -266.5q13 -8 13 -13.5 t0.5 -15t0.5 -13.5zM429 819q39 0 39 -41v-989q0 -27 24 -27h266q24 0 24 27v989q0 41 39 41h198q-101 74 -154 125q-160 155 -240 354q-80 -199 -240 -354q-53 -51 -154 -125h198z" />
+<glyph unicode="&#x21e8;" d="M1933 582q0 -16 -18 -23l-80 -24q-164 -55 -302.5 -169t-266.5 -335q-8 -13 -14 -13h-14q-10 -1 -14 -1q-36 0 -36 24v276q0 26 -27 26h-1005q-41 0 -41 37v404q0 37 41 37h1005q27 0 27 26v276q0 24 36 24h14q9 -1 14.5 -1t13.5 -13q128 -221 266.5 -335t302.5 -169 q27 -7 80 -24q18 -7 18 -23zM1270 778q0 -39 -41 -39h-1007q-27 0 -27 -24v-266q0 -24 27 -24h1007q41 0 41 -39v-198q74 101 125 154q155 160 354 240q-199 80 -354 240q-51 53 -125 154v-198z" />
+<glyph unicode="&#x21e9;" horiz-adv-x="1250" d="M1190 391v-14q-1 -9 -1 -14.5t-13 -13.5q-221 -128 -335 -266.5t-169 -302.5q-7 -27 -24 -80q-7 -18 -23 -18t-23 18l-24 80q-55 164 -169 302.5t-335 266.5q-13 8 -13 13v15q-1 10 -1 14q0 36 24 36h276q26 0 26 27v987q0 41 37 41h404q37 0 37 -41v-987q0 -27 26 -27 h276q24 0 24 -36zM821 345q-39 0 -39 41v989q0 27 -24 27h-266q-24 0 -24 -27v-989q0 -41 -39 -41h-198q101 -74 154 -125q160 -155 240 -354q80 199 240 354q53 51 154 125h-198z" />
+<glyph unicode="&#x21ea;" horiz-adv-x="1250" d="M1190 773q0 -36 -24 -36h-276q-26 0 -26 -27v-357q0 -41 -37 -41h-404q-37 0 -37 41v357q0 27 -26 27h-276q-24 0 -24 36q0 4 0.5 13.5t0.5 15t13 13.5q221 128 335 266.5t169 302.5q7 27 24 80q7 18 23 18t23 -18l24 -80q55 -164 169 -302.5t335 -266.5q13 -8 13 -13.5 t0.5 -15t0.5 -13.5zM864 -277q0 -41 -37 -41h-404q-37 0 -37 41v388q0 41 37 41h404q37 0 37 -41v-388zM429 819q39 0 39 -41v-359q0 -27 24 -27h266q24 0 24 27v359q0 41 39 41h198q-101 74 -154 125q-160 155 -240 354q-80 -199 -240 -354q-53 -51 -154 -125h198z M782 -211v256q0 27 -24 27h-266q-24 0 -24 -27v-256q0 -27 24 -27h266q24 0 24 27z" />
+<glyph unicode="&#x21eb;" horiz-adv-x="1250" d="M1190 773q0 -36 -24 -36h-276q-26 0 -26 -27v-728h163q37 0 37 -41v-218q0 -41 -37 -41h-804q-37 0 -37 41v218q0 41 37 41h163v728q0 27 -26 27h-276q-24 0 -24 36q0 4 0.5 13.5t0.5 15t13 13.5q221 128 335 266.5t169 302.5q7 27 24 80q7 18 23 18t23 -18l24 -80 q55 -164 169 -302.5t335 -266.5q13 -8 13 -13.5t0.5 -15t0.5 -13.5zM429 819q39 0 39 -41v-849q0 -27 -24 -27h-152q-24 0 -24 -27v-86q0 -27 24 -27h666q24 0 24 27v86q0 27 -24 27h-152q-24 0 -24 27v849q0 41 39 41h198q-101 74 -154 125q-160 155 -240 354 q-80 -199 -240 -354q-53 -51 -154 -125h198z" />
+<glyph unicode="&#x21ec;" horiz-adv-x="1250" d="M1190 773q0 -36 -24 -36h-276q-26 0 -26 -27v-728h163q37 0 37 -41v-218q0 -41 -37 -41h-804q-37 0 -37 41v218q0 41 37 41h163v728q0 27 -26 27h-276q-24 0 -24 36q0 4 0.5 13.5t0.5 15t13 13.5q221 128 335 266.5t169 302.5q7 27 24 80q7 18 23 18t23 -18l24 -80 q55 -164 169 -302.5t335 -266.5q13 -8 13 -13.5t0.5 -15t0.5 -13.5zM776 1043q-97 122 -151 255q-54 -133 -151 -255h302zM1019 819q-128 94 -171 142h-446q-43 -48 -171 -142h198q39 0 39 -41v-849q0 -27 -24 -27h-152q-24 0 -24 -27v-86q0 -27 24 -27h666q24 0 24 27v86 q0 27 -24 27h-152q-24 0 -24 27v849q0 41 39 41h198z" />
+<glyph unicode="&#x21ed;" horiz-adv-x="1250" d="M1190 773q0 -36 -24 -36h-276q-26 0 -26 -27v-728h163q37 0 37 -41v-218q0 -41 -37 -41h-804q-37 0 -37 41v218q0 41 37 41h163v728q0 27 -26 27h-276q-24 0 -24 36q0 4 0.5 13.5t0.5 15t13 13.5q221 128 335 266.5t169 302.5q7 27 24 80q7 18 23 18t23 -18l24 -80 q55 -164 169 -302.5t335 -266.5q13 -8 13 -13.5t0.5 -15t0.5 -13.5zM666 -238h292q24 0 24 27v86q0 27 -24 27h-152q-24 0 -24 27v849q0 41 39 41h198q-101 74 -154 125q-119 116 -199 266v-1448zM584 -238v1448q-80 -150 -199 -266q-53 -51 -154 -125h198q39 0 39 -41v-849 q0 -27 -24 -27h-152q-24 0 -24 -27v-86q0 -27 24 -27h292z" />
+<glyph unicode="&#x21ee;" horiz-adv-x="1250" d="M1190 473q0 -36 -24 -36h-276q-26 0 -26 -27v-687q0 -41 -37 -41h-404q-37 0 -37 41v687q0 27 -26 27h-276q-24 0 -24 36q0 4 0.5 13.5t0.5 15t13 13.5q194 113 296 222h-286q-24 0 -24 36q0 4 0.5 13.5t0.5 15t13 13.5q221 128 335 266.5t169 302.5q7 27 24 80 q7 18 23 18t23 -18l24 -80q55 -164 169 -302.5t335 -266.5q13 -8 13 -13.5t0.5 -15t0.5 -13.5q0 -36 -24 -36h-286q102 -109 296 -222q13 -8 13 -13.5t0.5 -15t0.5 -13.5zM625 1182q16 0 23 -18l24 -80q48 -142 140 -265h207q-101 74 -154 125q-160 155 -240 354 q-80 -199 -240 -354q-53 -51 -154 -125h207q92 123 140 265q7 27 24 80q7 18 23 18zM429 519q39 0 39 -41v-689q0 -27 24 -27h266q24 0 24 27v689q0 41 39 41h198q-101 74 -154 125q-160 155 -240 354q-80 -199 -240 -354q-53 -51 -154 -125h198z" />
+<glyph unicode="&#x21ef;" horiz-adv-x="1250" d="M1190 473q0 -36 -24 -36h-276q-26 0 -26 -27v-428h163q37 0 37 -41v-218q0 -41 -37 -41h-804q-37 0 -37 41v218q0 41 37 41h163v428q0 27 -26 27h-276q-24 0 -24 36q0 4 0.5 13.5t0.5 15t13 13.5q194 113 296 222h-286q-24 0 -24 36q0 4 0.5 13.5t0.5 15t13 13.5 q221 128 335 266.5t169 302.5q7 27 24 80q7 18 23 18t23 -18l24 -80q55 -164 169 -302.5t335 -266.5q13 -8 13 -13.5t0.5 -15t0.5 -13.5q0 -36 -24 -36h-286q102 -109 296 -222q13 -8 13 -13.5t0.5 -15t0.5 -13.5zM625 1182q16 0 23 -18l24 -80q48 -142 140 -265h207 q-101 74 -154 125q-160 155 -240 354q-80 -199 -240 -354q-53 -51 -154 -125h207q92 123 140 265q7 27 24 80q7 18 23 18zM429 519q39 0 39 -41v-549q0 -27 -24 -27h-152q-24 0 -24 -27v-86q0 -27 24 -27h666q24 0 24 27v86q0 27 -24 27h-152q-24 0 -24 27v549q0 41 39 41 h198q-101 74 -154 125q-160 155 -240 354q-80 -199 -240 -354q-53 -51 -154 -125h198z" />
+<glyph unicode="&#x21f0;" d="M1933 582q0 -16 -18 -23l-80 -24q-164 -55 -302.5 -169t-266.5 -335q-8 -13 -14 -13h-14q-10 -1 -14 -1q-36 0 -36 24v276q0 26 -27 26h-728v-163q0 -37 -41 -37h-218q-41 0 -41 37v804q0 37 41 37h218q41 0 41 -37v-163h728q27 0 27 26v276q0 24 36 24h14q9 -1 14.5 -1 t13.5 -13q128 -221 266.5 -335t302.5 -169q27 -7 80 -24q18 -7 18 -23zM1270 778q0 -39 -41 -39h-849q-27 0 -27 24v152q0 24 -27 24h-86q-27 0 -27 -24v-666q0 -24 27 -24h86q27 0 27 24v152q0 24 27 24h849q41 0 41 -39v-198q74 101 125 154q155 160 354 240 q-199 80 -354 240q-51 53 -125 154v-198z" />
+<glyph unicode="&#x21f1;" horiz-adv-x="1573" d="M556 860q18 -73 18 -159q0 -159 -100 -336q-1 -2 -3 -5q-16 -16 -28 -3q-17 14 -37 42q-2 7 5 19l29 53q56 117 56 248v22q-6 143 -76 262l-38 56q-9 16 3.5 28.5t29.5 4.5q19 -14 57 -39q130 -76 278 -76q48 0 98 8q81 14 155 49q19 12 59 33q14 6 23 -4q37 -36 37 -44 q0 -11 -13 -19q-94 -53 -172 -77t-163 -24t-160 19l809 -809q26 -26 -3 -55t-55 -3zM1439 1299q0 -41 -68 -41h-1155v-1255q0 -68 -41 -68t-41 68v1269q0 61 35 66q11 2 33 2h1169q68 0 68 -41z" />
+<glyph unicode="&#x21f2;" horiz-adv-x="1573" d="M1439 68q0 -61 -35 -66q-11 -2 -33 -2h-1169q-68 0 -68 41t68 41h1155v1255q0 68 41 68t41 -68v-1269zM451 321q0 11 13 19q94 53 172 77t163 24t160 -19l-809 809q-12 12 -12 25q0 15 15 30t30 15q13 0 25 -12l809 -809q-18 73 -18 159q0 159 100 336q1 2 3 5 q16 16 28 3q17 -14 37 -42q2 -7 -5 -19l-29 -53q-56 -116 -56 -246q0 -12 1 -24q5 -143 75 -262l38 -56q4 -7 4 -13q0 -8 -7 -16q-8 -7 -17 -7q-6 0 -13 3q-19 14 -57 39q-130 76 -278 76q-48 0 -98 -8q-81 -14 -155 -49q-19 -12 -59 -33q-14 -6 -23 4q-37 36 -37 44z" />
+<glyph unicode="&#x21f3;" horiz-adv-x="1250" d="M1190 127q0 -10 -17 -18q-192 -85 -312 -206.5t-184 -258.5q-10 -25 -24 -55.5t-28 -30.5t-28 30.5t-24 55.5q-64 137 -184 258.5t-312 206.5q-17 8 -17 18v40q3 24 23 24h277q26 0 26 27v728q0 27 -26 27h-277q-20 0 -23 24v40q0 10 17 18q192 85 312 206.5t184 258.5 q10 25 24 55.5t28 30.5t28 -30.5t24 -55.5q64 -137 184 -258.5t312 -206.5q17 -8 17 -18v-40q-3 -24 -23 -24h-277q-26 0 -26 -27v-728q0 -27 26 -27h277q20 0 23 -24v-40zM821 109q-39 0 -39 41v864q0 41 39 41h182q-88 57 -138 98q-142 115 -240 297q-98 -182 -240 -297 q-50 -41 -138 -98h182q39 0 39 -41v-864q0 -41 -39 -41h-182q88 -57 138 -98q142 -115 240 -297q98 182 240 297q50 41 138 98h-182z" />
+<glyph unicode="&#x21f4;" d="M1906 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-515q-16 -145 -125 -243.5t-256 -98.5t-256 98.5t-125 243.5h-277q-39 0 -39 41t39 41h277q16 145 125 243.5t256 98.5 t256 -98.5t125 -243.5h515q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310zM812 883q-113 0 -198 -74.5t-100 -185.5h596q-15 111 -100 185.5t-198 74.5zM812 281q113 0 198 74.5t100 185.5h-596 q15 -111 100 -185.5t198 -74.5z" />
+<glyph unicode="&#x21f5;" horiz-adv-x="1706" d="M1153 1200q-134 -223 -414 -293q-22 0 -22 18q0 58 14 64q22 6 65 19q192 67 298 239q46 75 67 164q3 22 8.5 46.5t24 24.5t23.5 -18q4 -22 13 -66q35 -134 133 -240t229 -151l65 -18q14 -4 14 -19q0 -48 1 -39q-3 -24 -23 -24l-6 2q-139 38 -239.5 109t-168.5 182v-1481 q0 -37 -41 -37t-41 37v1481zM553 -36q136 223 414 293q22 0 22 -18q0 -60 -14 -64q-22 -6 -65 -19q-132 -46 -229.5 -150.5t-132.5 -239.5q-4 -22 -13 -66q-4 -18 -22 -18t-24 18q-4 23 -13 67q-35 134 -132.5 238.5t-229.5 150.5q-23 6 -65 19q-14 6 -14 19q0 51 -1 40 q2 23 23 23l6 -2q104 -29 161 -59q157 -83 247 -232v1481q0 37 41 37t41 -37v-1481z" />
+<glyph unicode="&#x21f6;" d="M1651 1164q-223 135 -293 414q0 22 63 22q13 0 19 -14q6 -22 19 -65q46 -132 150.5 -229.5t238.5 -132.5q23 -3 67 -13q18 -6 18 -23t-18 -23q-23 -4 -67 -13q-205 -54 -325 -234q120 -181 325 -235q23 -3 67 -13q18 -6 18 -23t-18 -23q-23 -4 -67 -13 q-205 -54 -325 -234q120 -181 325 -235q23 -3 67 -13q18 -6 18 -23t-18 -23q-23 -4 -67 -13q-134 -35 -238.5 -132.5t-150.5 -229.5q-6 -22 -19 -65q-6 -14 -19 -14q-63 0 -63 22l2 6q29 104 59 161q83 157 232 247h-1499q-37 0 -37 41t37 41h1499q-140 85 -222 230 q82 144 222 229h-1499q-37 0 -37 41t37 41h1499q-140 85 -222 230q82 144 222 229h-1499q-37 0 -37 41t37 41h1499z" />
+<glyph unicode="&#x21f7;" d="M1931 582q0 -41 -39 -41h-578v-395q0 -39 -41 -39t-41 39v395h-894q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27 q0 -4 -7 -35q-59 -266 -288 -432h894v397q0 37 41 37t41 -37v-397h578q39 0 39 -41z" />
+<glyph unicode="&#x21f8;" d="M1906 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-894v-395q0 -39 -41 -39t-41 39v395h-578q-39 0 -39 41t39 41h578v397q0 37 41 37t41 -37v-397h894q-154 111 -238 288 q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310z" />
+<glyph unicode="&#x21f9;" d="M1918 605q14 -8 14 -22.5t-14 -20.5q-223 -79 -343 -283q-43 -74 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-644v-395q0 -39 -41 -39t-41 39v395h-644q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-35 177 -143 305 t-277 191q-16 6 -16 20.5t59 39.5q138 59 233.5 171.5t133.5 261.5q3 15 10 43q5 18 25 20q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h644v397q0 37 41 37t41 -37v-397h644q-154 111 -238 288q-57 121 -57 179q0 24 21 27h41q15 0 20 -19q49 -191 144 -303 t225 -169q19 -6 53 -21z" />
+<glyph unicode="&#x21fa;" d="M1931 582q0 -41 -39 -41h-378v-395q0 -39 -41 -39t-41 39v395h-218v-395q0 -39 -41 -39t-41 39v395h-794q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5 t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h794v397q0 37 41 37t41 -37v-397h218v397q0 37 41 37t41 -37v-397h378q39 0 39 -41z" />
+<glyph unicode="&#x21fb;" d="M1906 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-794v-395q0 -39 -41 -39t-41 39v395h-218v-395q0 -39 -41 -39t-41 39v395h-378q-39 0 -39 41t39 41h378v397q0 37 41 37 t41 -37v-397h218v397q0 37 41 37t41 -37v-397h794q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310z" />
+<glyph unicode="&#x21fc;" d="M1918 605q14 -8 14 -22.5t-14 -20.5q-223 -79 -343 -283q-43 -74 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-494v-395q0 -39 -41 -39t-41 39v395h-218v-395q0 -39 -41 -39t-41 39v395h-494q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41 q-14 0 -20 19q-35 177 -143 305t-277 191q-16 6 -16 20.5t59 39.5q138 59 233.5 171.5t133.5 261.5q3 15 10 43q5 18 25 20q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h494v397q0 37 41 37t41 -37v-397h218v397q0 37 41 37t41 -37v-397h494q-154 111 -238 288 q-57 121 -57 179q0 24 21 27h41q15 0 20 -19q49 -191 144 -303t225 -169q19 -6 53 -21z" />
+<glyph unicode="&#x21fd;" d="M1933 582q0 -41 -37 -41h-1036v-500q0 -24 -36 -24q-4 0 -13.5 0.5t-15 0.5t-13.5 13q-128 221 -266.5 335t-302.5 169q-27 7 -80 24q-18 7 -18 23t18 23l80 24q164 55 302.5 169t266.5 335q8 13 13.5 13t15 0.5t13.5 0.5q36 0 36 -24v-500h1036q37 0 37 -41zM778 188 v788q-74 -101 -125 -154q-155 -160 -354 -240q199 -80 354 -240q51 -53 125 -154z" />
+<glyph unicode="&#x21fe;" d="M1933 582q0 -16 -18 -23l-80 -24q-164 -55 -302.5 -169t-266.5 -335q-8 -13 -14 -13h-14q-10 -1 -14 -1q-36 0 -36 24v500h-1036q-37 0 -37 41t37 41h1036v500q0 24 36 24h14q9 -1 14.5 -1t13.5 -13q128 -221 266.5 -335t302.5 -169q27 -7 80 -24q18 -7 18 -23zM1749 582 q-199 80 -354 240q-51 53 -125 154v-788q74 101 125 154q155 160 354 240z" />
+<glyph unicode="&#x21ff;" d="M1919 605q14 -8 14 -22.5t-14 -20.5q-223 -79 -343 -283q-43 -74 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27v467h-782v-467q0 -27 -21 -27q-47 0 -53 6t-8 13q-36 139 -79 213q-105 179 -293 263q-17 6 -50 20q-14 6 -14 20.5t14 22.5l53 21q130 57 225 169t144 303 q5 19 20 19h41q21 -3 21 -27v-467h782v467q0 24 21 27h41q15 0 20 -19q49 -191 144 -303t225 -169q19 -6 53 -21zM1771 582q-178 101 -274 281v-562q96 180 274 281zM551 301v562q-96 -180 -274 -281q178 -101 274 -281z" />
+<glyph unicode="&#x2200;" horiz-adv-x="1137" d="M1139 1380q0 -9 -531 -1400q-10 -25 -38 -25t-38 25q-532 1397 -532 1400q0 41 41 41q30 0 39 -24l178 -473h623l180 473q9 24 37 24q41 0 41 -41zM848 842h-557l278 -731z" />
+<glyph unicode="&#x2201;" horiz-adv-x="1024" d="M875 151q0 -139 -141 -210q-102 -51 -222 -51t-222 51q-141 71 -141 210v1186q0 137 142 208q103 51 221 51t221 -51q142 -71 142 -208v-230q0 -60 -60 -60t-60 60v230q0 61 -74.5 100t-168.5 39t-168.5 -39t-74.5 -100v-1186q0 -63 73.5 -102t169.5 -39t169.5 39 t73.5 102v227q0 60 60 60t60 -60v-227z" />
+<glyph unicode="&#x2202;" horiz-adv-x="1087" d="M1036 810q0 -313 -128 -556q-159 -299 -443 -299q-183 0 -308 127t-125 316t130 345q161 193 390 193q108 0 187 -67.5t111 -174.5h2q16 132 16 218q0 199 -76 335q-95 168 -278 168q-208 0 -271 -162q7 1 14 1q38 0 65 -27t27 -64.5t-27.5 -65t-66 -27.5t-65 29 t-26.5 63t19 86q80 218 326.5 218t394.5 -212q132 -188 132 -444zM827 562q0 135 -69.5 232t-198.5 97q-186 0 -284 -182q-34 -63 -53.5 -184t-19.5 -214q0 -131 67 -215t194 -84q180 0 282 194q82 158 82 356z" />
+<glyph unicode="&#x2203;" horiz-adv-x="1137" d="M1022 39q0 -39 -37 -39h-831q-39 0 -39 41t39 41h786v588h-760q-37 0 -37 41t37 41h760v587h-786q-39 0 -39 41t39 41h831q37 0 37 -37v-1345z" />
+<glyph unicode="&#x2204;" horiz-adv-x="1137" d="M1022 39q0 -39 -37 -39h-611l-122 -336q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l112 308h-132q-39 0 -39 41t39 41h162l214 588h-350q-37 0 -37 41t37 41h380l214 587h-620q-39 0 -39 41t39 41h650l29 80q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-19 -52h94q37 0 37 -37 v-1345zM940 752v587h-79l-213 -587h292zM940 82v588h-322l-214 -588h536z" />
+<glyph unicode="&#x2205;" horiz-adv-x="1591" d="M1518 582q0 -298 -211.5 -510.5t-509.5 -212.5q-205 0 -380 109l-214 -305q-12 -17 -34 -17q-40 0 -40 41q0 13 7 23l214 305q-276 218 -276 567q0 300 211.5 511.5t511.5 211.5q206 0 380 -109l214 306q11 15 33 15q41 0 41 -41q0 -11 -7 -21l-214 -306 q274 -218 274 -567zM1436 582q0 306 -239 499l-733 -1046q154 -94 333 -94q264 0 451.5 188.5t187.5 452.5zM797 1223q-266 0 -453.5 -187.5t-187.5 -453.5q0 -307 241 -500l733 1047q-153 94 -333 94z" />
+<glyph unicode="&#x2206;" horiz-adv-x="1694" d="M1596 17q0 -17 -24 -17h-1450q-24 0 -24 17q0 6 4 14l695 1401q17 35 50.5 35t50.5 -35l694 -1401q4 -8 4 -14zM1346 146l-557 1126l-558 -1126h1115z" />
+<glyph unicode="&#x2207;" horiz-adv-x="1694" d="M1596 1373q0 -6 -4 -14l-695 -1401q-17 -35 -50.5 -35t-50.5 35l-694 1401q-4 8 -4 14q0 17 24 17h1450q24 0 24 -17zM1463 1244h-1115l557 -1126z" />
+<glyph unicode="&#x2208;" horiz-adv-x="1364" d="M1194 41q0 -41 -37 -41h-364q-253 0 -438 166t-185 416t185 416t438 166h364q37 0 37 -41t-37 -41h-358q-201 0 -373 -132t-172 -327h903q37 0 37 -41t-37 -41h-903q0 -195 172 -327t373 -132h358q37 0 37 -41z" />
+<glyph unicode="&#x2209;" horiz-adv-x="1364" d="M1194 41q0 -41 -37 -41h-364q-72 0 -143 15l-128 -351q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l126 346q-177 63 -288.5 208.5t-111.5 335.5q0 250 185 416t438 166h187l123 337q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-112 -309h89q37 0 37 -41t-37 -41h-119l-167 -459 h286q37 0 37 -41t-37 -41h-316l-162 -446q61 -13 120 -13h358q37 0 37 -41zM799 1082q-201 0 -373 -132t-172 -327h529l167 459h-151zM254 541q0 -144 98.5 -256.5t246.5 -166.5l154 423h-499z" />
+<glyph unicode="&#x220a;" horiz-adv-x="1164" d="M994 41q0 -41 -37 -41h-293q-201 0 -347.5 132t-146.5 330t146.5 330t347.5 132h293q37 0 37 -41t-37 -41h-293q-158 0 -275.5 -96.5t-134.5 -242.5h703q37 0 37 -41t-37 -41h-703q17 -146 134.5 -242.5t275.5 -96.5h293q37 0 37 -41z" />
+<glyph unicode="&#x220b;" horiz-adv-x="1364" d="M1194 582q0 -250 -185 -416t-438 -166h-364q-37 0 -37 41t37 41h358q201 0 373 132t172 327h-903q-37 0 -37 41t37 41h903q0 195 -172 327t-373 132h-358q-37 0 -37 41t37 41h364q253 0 438 -166t185 -416z" />
+<glyph unicode="&#x220c;" horiz-adv-x="1364" d="M1194 582q0 -250 -185 -416t-438 -166h-117l-122 -336q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l112 308h-159q-37 0 -37 41t37 41h189l167 459h-356q-37 0 -37 41t37 41h386l156 428q-93 31 -184 31h-358q-37 0 -37 41t37 41h364q107 0 207 -33l135 370q17 46 43 46 q42 0 42 -37q0 -15 -8 -37l-135 -372q153 -72 246 -209t93 -310zM1110 623q0 128 -79.5 232.5t-205.5 164.5l-144 -397h429zM1110 541h-459l-167 -459h81q201 0 373 132t172 327z" />
+<glyph unicode="&#x220d;" horiz-adv-x="1164" d="M994 462q0 -198 -146.5 -330t-347.5 -132h-293q-37 0 -37 41t37 41h293q158 0 275.5 96.5t134.5 242.5h-703q-37 0 -37 41t37 41h703q-17 146 -134.5 242.5t-275.5 96.5h-293q-37 0 -37 41t37 41h293q201 0 347.5 -132t146.5 -330z" />
+<glyph unicode="&#x220e;" horiz-adv-x="567" d="M453 39q0 -39 -37 -39h-262q-39 0 -39 39v307q0 37 39 37h262q37 0 37 -37v-307z" />
+<glyph unicode="&#x220f;" horiz-adv-x="1652" d="M1551 -255q0 -35 -27 -35h-478q-27 0 -27 35t27 35h81q72 0 72 55v1549h-746v-1549q0 -55 72 -55h81q27 0 27 -35t-27 -35h-478q-27 0 -27 35t27 35h81q72 0 72 55v1494q0 55 -72 55h-81q-27 0 -27 35t27 35h1396q27 0 27 -35t-27 -35h-81q-72 0 -72 -55v-1494 q0 -55 72 -55h81q27 0 27 -35z" />
+<glyph unicode="&#x2210;" horiz-adv-x="1652" d="M1551 -255q0 -35 -27 -35h-1396q-27 0 -27 35t27 35h81q72 0 72 55v1494q0 55 -72 55h-81q-27 0 -27 35t27 35h478q27 0 27 -35t-27 -35h-81q-72 0 -72 -55v-1549h746v1549q0 55 -72 55h-81q-27 0 -27 35t27 35h478q27 0 27 -35t-27 -35h-81q-72 0 -72 -55v-1494 q0 -55 72 -55h81q27 0 27 -35z" />
+<glyph unicode="&#x2211;" horiz-adv-x="1700" d="M829 1382h-597l560 -778q6 -8 6 -22t-8 -24l-604 -747h680q284 0 439 50q235 77 309 287h50l-148 -438h-1463q-17 0 -17 20q0 6 5 12l628 775l-628 872q-6 8 -6 36.5t19 28.5h1462l149 -410h-51q-80 215 -328 291q-156 47 -457 47z" />
+<glyph unicode="&#x2212;" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2213;" horiz-adv-x="1591" d="M1477 342q0 -41 -37 -41h-602v-604q0 -37 -41 -37t-41 37v604h-602q-39 0 -39 41t39 41h602v559h-602q-39 0 -39 41t39 41h1286q37 0 37 -41t-37 -41h-602v-559h602q37 0 37 -41z" />
+<glyph unicode="&#x2214;" horiz-adv-x="1591" d="M872 1535.5q27 -33.5 27 -75t-33.5 -69t-75 -27.5t-69 33.5t-27.5 75t34 69t75.5 27.5t68.5 -33.5zM1479 512q0 -41 -37 -41h-604v-627q0 -37 -41 -37t-41 37v627h-602q-39 0 -39 41t39 41h602v627q0 37 41 37t41 -37v-627h604q37 0 37 -41z" />
+<glyph unicode="&#x2215;" horiz-adv-x="1024" d="M889 1505q0 -8 -2 -13l-673 -1848q-9 -26 -40 -26q-39 0 -39 41q0 8 2 13l673 1848q9 26 40 26q39 0 39 -41z" />
+<glyph unicode="&#x2216;" horiz-adv-x="1024" d="M889 -341q0 -41 -39 -41q-31 0 -40 26l-673 1848q-2 5 -2 13q0 41 39 41q31 0 40 -26l673 -1848q2 -5 2 -13z" />
+<glyph unicode="&#x2217;" horiz-adv-x="964" d="M824 416q26 -12 26 -39.5t-16.5 -47t-35.5 -19.5t-31 9l-258 182l30 -319q0 -49 -56.5 -49t-56.5 49v5l29 314l-257 -182q-13 -9 -31.5 -9t-35.5 19.5t-17 47t27 39.5l287 132l-287 132q-27 13 -27 40t17 47t35.5 20t31.5 -9l257 -183l-29 319q0 49 56.5 49t56.5 -49v-5 l-30 -314l258 183q12 9 31 9t35.5 -20t16.5 -47t-26 -40l-287 -132z" />
+<glyph unicode="&#x2218;" horiz-adv-x="580" d="M540 582q0 -104 -73 -177t-177 -73t-177 73t-73 177t73 177t177 73t177 -73t73 -177zM440 582q0 63 -43.5 106.5t-106.5 43.5t-106.5 -43.5t-43.5 -106.5t43.5 -106.5t106.5 -43.5t106.5 43.5t43.5 106.5z" />
+<glyph unicode="&#x2219;" horiz-adv-x="580" d="M540 582q0 -104 -73 -177t-177 -73t-177 73t-73 177t73 177t177 73t177 -73t73 -177z" />
+<glyph unicode="&#x221a;" horiz-adv-x="1706" d="M1747 1565q0 -10 -2 -14l-952 -1975q-9 -18 -56 -18q-13 0 -18 12l-408 897q-129 -98 -135 -98q-29 0 -29 29q0 9 9 16l243 184q8 6 18.5 6t16.5 -14l367 -807l870 1804q9 19 35 19q41 0 41 -41z" />
+<glyph unicode="&#x221b;" horiz-adv-x="1706" d="M1747 1565q0 -10 -2 -14l-952 -1975q-9 -18 -56 -18q-13 0 -18 12l-408 897q-129 -98 -135 -98q-29 0 -29 29q0 9 9 16l243 184q8 6 18.5 6t16.5 -14l367 -807l870 1804q9 19 35 19q41 0 41 -41zM1038 935q0 -118 -97 -192.5t-213.5 -74.5t-203.5 53q-103 62 -103 166 q0 89 91 89t91 -85q0 -79 -83 -85q68 -79 197 -79q151 0 151 209t-160 209q-68 0 -68 -1t4 -1q-44 4 -44 27t35 29q27 1 53 3q80 6 118.5 64.5t38.5 145.5q0 138 -126 138q-111 0 -169 -61q78 -8 78 -77q0 -79 -84.5 -79t-84.5 80q0 92 90 146q77 47 175.5 47t179.5 -47 q95 -55 95 -148q0 -158 -173 -232q89 -26 150.5 -91t61.5 -153z" />
+<glyph unicode="&#x221c;" horiz-adv-x="1706" d="M1747 1565q0 -10 -2 -14l-952 -1975q-9 -18 -56 -18q-13 0 -18 12l-408 897q-129 -98 -135 -98q-29 0 -29 29q0 9 9 16l243 184q8 6 18.5 6t16.5 -14l367 -807l870 1804q9 19 35 19q41 0 41 -41zM1057 903h-143v-105q0 -40 30 -49q10 -3 68 -3h41v-64q-74 5 -166 5h-78 q-92 0 -166 -5v64h41q58 0 68 3q30 9 30 49v105h-381v55l442 628q14 20 38 20q33 0 33 -46v-594h143v-63zM790 966v451l-317 -451h317z" />
+<glyph unicode="&#x221d;" horiz-adv-x="1591" d="M1401 -23q-245 0 -428 277l-45 68q-176 -345 -459 -345q-168 0 -267 154q-87 134 -87 311t90 311q102 152 263.5 152t286.5 -107q84 -72 193 -237q174 344 459 344q39 0 70 -8l2 -63q-28 6 -54 6q-142 0 -262 -114q-100 -95 -164 -245l95 -145q81 -123 138 -177 q93 -89 198 -89q16 0 49 4v-86q-49 -11 -78 -11zM446 813q-132 0 -210 -125q-68 -108 -68 -252t67 -258q79 -135 216 -135q270 0 426 358l-113 177q-70 102 -142.5 168.5t-175.5 66.5z" />
+<glyph unicode="&#x221e;" d="M1542 905q175 0 282 -141.5t107 -322.5t-109 -322.5t-286 -141.5q-134 0 -258.5 73.5t-210.5 189.5l-61 82q-212 -345 -502 -345q-174 0 -281.5 142.5t-107.5 323t109.5 321.5t285.5 141q132 0 258.5 -74.5t210.5 -187.5l61 -82q216 344 502 344zM1569 84 q136 0 222.5 109.5t86.5 253.5t-86 265.5t-229 121.5q-260 0 -465 -349l142 -180q74 -94 148.5 -157.5t180.5 -63.5zM477 799q-137 0 -223 -109.5t-86 -253t87 -265.5t228 -122q260 0 465 348l-133 173q-81 101 -156.5 165t-181.5 64z" />
+<glyph unicode="&#x221f;" horiz-adv-x="1573" d="M1434 41q0 -41 -68 -41h-1139q-61 0 -66 35q-2 11 -2 33v1269q0 68 41 68t41 -68v-1255h1125q68 0 68 -41z" />
+<glyph unicode="&#x2220;" horiz-adv-x="1479" d="M1362 41q0 -41 -37 -41h-1171q-39 0 -39 41q0 18 10 29l1165 1339q10 12 31 12q41 0 41 -41q0 -14 -10 -26l-1106 -1272h1079q37 0 37 -41z" />
+<glyph unicode="&#x2221;" horiz-adv-x="1479" d="M1362 41q0 -41 -37 -41h-430q0 -41 -41 -41q-36 0 -43 41h-657q-39 0 -39 41q0 17 10 29l1165 1380q10 12 31 12q41 0 41 -41q0 -14 -10 -26l-678 -805q84 -98 150.5 -245.5t66.5 -262.5h434q37 0 37 -41zM809 82q-25 255 -191 444l-374 -444h565z" />
+<glyph unicode="&#x2222;" horiz-adv-x="1479" d="M1362 -63q0 -41 -41 -41q-10 0 -14 2l-1166 577q-26 13 -26 37.5t20 34.5l1172 579q4 2 14 2q41 0 41 -41q0 -25 -19 -34l-266 -131q86 -190 86 -408t-86 -412l260 -129q25 -12 25 -36zM1081 512q0 196 -77 373l-756 -373l756 -373q77 177 77 373z" />
+<glyph unicode="&#x2223;" horiz-adv-x="626" d="M354 -401q0 -41 -41 -41t-41 41v1968q0 39 41 39t41 -39v-1968z" />
+<glyph unicode="&#x2224;" horiz-adv-x="626" d="M633 1070q0 -16 -15 -42l-264 -457v-976q0 -37 -41 -37t-41 37v834l-192 -333q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l263 456v976q0 37 41 37t41 -37v-834l193 334q23 39 45 39q41 0 41 -38z" />
+<glyph unicode="&#x2225;" horiz-adv-x="1024" d="M752 -405q0 -37 -41 -37t-41 37v1974q0 37 41 37t41 -37v-1974zM354 -405q0 -37 -41 -37t-41 37v1974q0 37 41 37t41 -37v-1974z" />
+<glyph unicode="&#x2226;" horiz-adv-x="1024" d="M977 1090q0 -18 -23 -45l-202 -241v-1209q0 -37 -41 -37t-41 37v1112l-316 -377v-735q0 -37 -41 -37t-41 37v638l-139 -166q-27 -32 -46 -32q-40 0 -40 39q0 17 24 46l201 240v1209q0 37 41 37t41 -37v-1111l316 376v735q0 37 41 37t41 -37v-637l139 166q26 31 46 31 q40 0 40 -39z" />
+<glyph unicode="&#x2227;" horiz-adv-x="1364" d="M1249 -4q0 -41 -41 -41q-26 0 -37 25l-489 1103l-489 -1103q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l526 1188q11 25 39 25t39 -25l526 -1188q2 -5 2 -16z" />
+<glyph unicode="&#x2228;" horiz-adv-x="1364" d="M1249 1183q0 -11 -2 -16l-526 -1188q-11 -25 -39 -25t-39 25l-526 1188q-2 5 -2 16q0 41 41 41q26 0 37 -25l489 -1103l489 1103q11 25 37 25q41 0 41 -41z" />
+<glyph unicode="&#x2229;" horiz-adv-x="1364" d="M1249 -8q0 -37 -41 -37t-41 37v792q0 171 -163 273q-140 86 -322.5 86t-321.5 -87q-163 -101 -163 -272v-792q0 -37 -41 -37t-41 37v799q0 202 189 326q164 108 378 108t379 -107q188 -124 188 -327v-799z" />
+<glyph unicode="&#x222a;" horiz-adv-x="1364" d="M1249 389q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v799q0 37 41 37t41 -37v-793q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v793q0 37 41 37t41 -37v-799z" />
+<glyph unicode="&#x222b;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-30 -89 -45 -268l-18 -279q-25 -376 -100 -924q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39 q98 0 144 118q40 102 66 478t54 602l52 396q24 172 84 277q78 137 210 137z" />
+<glyph unicode="&#x222c;" horiz-adv-x="1559" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-30 -89 -45 -268l-18 -279q-25 -376 -100 -924q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39 q98 0 144 118q40 102 66 478t54 602l52 396q24 172 84 277q78 137 210 137zM1354 1606q77 0 141 -42t64 -116t-76.5 -74t-76.5 75q0 69 68 78q-47 38 -120 38q-86 0 -126 -118q-30 -89 -45 -268l-18 -279q-25 -377 -100 -924q-23 -165 -90 -274q-88 -144 -231 -144 q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q39 99 64 468t56 604l52 398q24 178 84 283q78 137 210 137z" />
+<glyph unicode="&#x222d;" horiz-adv-x="2099" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-30 -89 -45 -268l-18 -279q-25 -376 -100 -924q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39 q98 0 144 118q40 102 66 478t54 602l52 396q24 172 84 277q78 137 210 137zM1894 1606q77 0 141 -42t64 -116t-76.5 -74t-76.5 75q0 69 68 78q-47 38 -120 38q-86 0 -126 -118q-30 -89 -45 -268l-18 -279q-25 -376 -100 -924q-23 -165 -90 -274q-88 -144 -231 -144 q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q39 99 64 468t56 604l52 398q24 178 84 283q78 137 210 137zM1354 1606q77 0 141 -42t64 -116t-76.5 -74t-76.5 75q0 69 68 78q-47 38 -120 38q-86 0 -126 -118q-30 -89 -45 -268 l-18 -279q-25 -376 -100 -924q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q39 99 64 468t56 604l52 398q24 178 84 283q78 137 210 137z" />
+<glyph unicode="&#x222e;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-35 -104 -60 -511q117 -35 190.5 -133.5t73.5 -231t-97 -238t-239 -118.5l-31 -239q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75 q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q34 86 50 251l18 262q-116 35 -189 133t-73 230t96.5 238t238.5 119l31 237q57 420 294 420zM763 369.5q81 91.5 81 203.5t-61 196.5t-159 117.5q-16 -239 -62 -624q120 15 201 106.5zM282 794.5q-80 -91.5 -80 -203.5t60.5 -196 t157.5 -117q24 319 62 623q-120 -15 -200 -106.5z" />
+<glyph unicode="&#x222f;" horiz-adv-x="1559" d="M1354 1606q77 0 141 -42t64 -116t-76.5 -74t-76.5 75q0 69 68 78q-47 38 -120 38q-86 0 -124 -112.5t-63 -519.5q265 -124 265 -351q0 -261 -338 -381l-29 -225q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78 q48 -39 121 -39q98 0 144 118q31 79 46 219q8 114 17 228q-82 -15 -179 -15t-220 34q-17 -135 -27 -206q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q34 87 50 253l18 263 q-262 124 -262 350q0 261 336 380l30 224q57 420 294 420q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-35 -103 -56 -447q86 16 182 16t219 -34q40 301 66 382q77 242 255 242zM1384 582q0 189 -220 299q-16 -236 -63 -626 q283 109 283 327zM1027 934q-120 34 -216.5 34t-181.5 -17l-4 -51q-27 -338 -62 -629l-5 -41q120 -34 215.5 -34t181.5 17q35 479 72 721zM202 582q0 -188 218 -298q24 305 63 625q-281 -109 -281 -327z" />
+<glyph unicode="&#x2230;" horiz-adv-x="2099" d="M1894 1606q77 0 141 -42t64 -116t-76.5 -74t-76.5 75q0 69 68 78q-47 38 -120 38q-86 0 -124 -112t-62 -512q263 -134 263 -359q0 -256 -339 -393l-27 -213q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78 q48 -39 121 -39q98 0 143 115.5t62 427.5q-200 -54 -410 -57q-5 -36 -14 -108q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q40 103 58 372q-213 17 -396 80l-25 -192q-23 -165 -90 -274 q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q34 87 50 249l18 259q-262 135 -262 358q0 256 338 393q40 305 67 389q78 242 255 242q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38 q-86 0 -126 -118q-35 -102 -55 -425q202 55 413 58q30 231 70 331q77 195 238 195q77 0 141 -42t64 -116t-76.5 -74t-76.5 75q0 69 68 78q-47 38 -120 38q-86 0 -126 -118q-33 -97 -52 -371q218 -17 399 -79q38 288 66 374q78 235 253 235zM1924 582q0 188 -220 307 q-27 -406 -65 -645q285 124 285 338zM1568 948q-179 63 -395 80q-25 -397 -88 -897q206 4 408 61q27 381 75 756zM1040 1033q-207 -4 -410 -62q-21 -337 -74 -755q177 -62 393 -80q31 447 91 897zM202 582q0 -187 218 -306q18 239 30.5 373.5t34.5 270.5 q-283 -124 -283 -338z" />
+<glyph unicode="&#x2231;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -123.5 -111.5t-62.5 -517.5q117 -35 190.5 -133.5t73.5 -231t-97 -238t-239 -118.5l-31 -239q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75 q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q34 88 50 252l18 261q-114 35 -186.5 130t-75.5 214q-113 -102 -144 -102q-23 0 -23 35q0 4 32 20q103 51 135 128q15 37 24 37t24 -37q32 -77 135 -128q31 -15 31 -20q0 -35 -22 -35q-31 0 -144 102q3 -100 63 -181.5 t155 -113.5q27 348 51 535l49 373q24 177 84 283q78 137 210 137zM763 369.5q81 91.5 81 203.5t-61 196.5t-159 117.5q-23 -336 -62 -624q120 15 201 106.5z" />
+<glyph unicode="&#x2232;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-35 -104 -60 -511q117 -35 190.5 -133.5t73.5 -231t-97 -238t-239 -118.5l-31 -239q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75 q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q34 86 50 252l18 261q-114 35 -186.5 130t-75.5 214q-113 -102 -144 -102q-23 0 -23 35q0 4 32 20q102 50 135 128q3 11 15 34q32 107 120 179t200 82l31 237q57 420 294 420zM763 369.5q81 91.5 81 203.5t-61 196.5t-159 117.5 q-16 -239 -62 -624q120 15 201 106.5zM368 506q0 -35 -22 -35q-31 0 -144 102q3 -100 63 -181.5t155 -113.5q24 317 62 623q-103 -13 -179 -85t-96 -174q38 -70 130 -116q31 -16 31 -20z" />
+<glyph unicode="&#x2233;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-35 -104 -60 -511q117 -35 190.5 -133.5t73.5 -231t-97 -238t-239 -118.5l-31 -239q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75 q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q34 86 50 252l18 261q-190 58 -247 247q-2 2 -15 34q-33 78 -135 128q-32 16 -32 20q0 35 23 35q31 0 144 -102q4 140 100 242.5t235 115.5l31 237q57 420 294 420zM763 369.5q81 91.5 81 203.5t-61 196.5t-159 117.5 q-16 -239 -62 -624q120 15 201 106.5zM346 693q22 0 22 -35q0 -4 -31 -20q-92 -46 -130 -116q35 -183 213 -244q24 317 62 623q-117 -15 -197 -103.5t-83 -206.5q113 102 144 102z" />
+<glyph unicode="&#x2234;" horiz-adv-x="1364" d="M1273.5 192.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM249.5 192.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM761 1078.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5z" />
+<glyph unicode="&#x2235;" horiz-adv-x="1364" d="M761.5 192.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1273 1078.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM249 1078.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5z" />
+<glyph unicode="&#x2236;" horiz-adv-x="683" d="M421 1078.5q34 -33.5 34 -79t-34 -79t-80 -33.5t-79 33.5t-33 80t33 79t79 32.5t80 -33.5zM421 192.5q34 -33.5 34 -80t-33 -79.5t-80.5 -33t-80 33t-32.5 80t32.5 80t79 33t80.5 -33.5z" />
+<glyph unicode="&#x2237;" horiz-adv-x="1364" d="M1273.5 192.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM249.5 192.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1273 1078.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5zM249 1078.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x2238;" horiz-adv-x="1591" d="M875.5 1111.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1421 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2239;" horiz-adv-x="1591" d="M1475.5 271.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1475.5 1051.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1421 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x223a;" horiz-adv-x="1591" d="M1387.5 218.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM363.5 218.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1387 1104.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5zM363 1104.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM1421 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x223b;" horiz-adv-x="1591" d="M1477 746q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM875.5 11.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM875.5 1311.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x223c;" horiz-adv-x="1591" d="M1477 746q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63z" />
+<glyph unicode="&#x223d;" horiz-adv-x="1591" d="M1477 418q0 -63 -29 -63q-24 0 -28 43.5t-23 116.5q-33 80 -104 130t-156 50q-111 0 -235 -88l-207 -164q-125 -88 -240 -88q-149 0 -244.5 119.5t-95.5 271.5q0 63 28 63q24 0 29 -51q9 -90 38 -142q83 -147 245 -147q113 0 236 88l208 164q124 88 238 88 q148 0 244 -119.5t96 -271.5z" />
+<glyph unicode="&#x223e;" horiz-adv-x="1591" d="M1518 584q0 -14 -11 -27q-105 -121 -164 -167q-101 -78 -205 -78t-206 78q-59 46 -160.5 161t-153.5 156q-83 65 -163 65t-163 -66q-50 -41 -148 -151q-12 -14 -31 -14q-39 0 -39 41q0 14 11 27q105 121 164 167q101 78 205.5 78t205.5 -77q63 -48 162.5 -161t152.5 -156 q84 -66 163 -66t162 66q50 41 148 151q12 14 31 14q39 0 39 -41z" />
+<glyph unicode="&#x223f;" horiz-adv-x="1591" d="M1427 244q0 -28 -28 -39q-168 -67 -271.5 -67t-171.5 40q-117 68 -171 275l-84 332q-66 161 -222 161q-71 0 -262 -61q-9 -3 -13 -3q-39 0 -39 40q0 28 28 39q168 67 271.5 67t171.5 -40q119 -70 174 -276l83 -331q64 -161 220 -161q71 0 262 61q9 3 13 3q39 0 39 -40z " />
+<glyph unicode="&#x2240;" horiz-adv-x="1024" d="M739 -70q0 -29 -63 -29q-152 0 -271.5 96t-119.5 244q0 115 88 239l164 206q88 124 88 237q0 162 -147 245q-44 25 -142 38q-51 7 -51 29q0 28 63 28q152 0 271.5 -95.5t119.5 -244.5q0 -116 -88 -240l-164 -207q-88 -123 -88 -235q0 -84 50.5 -156t129.5 -104 q28 -11 94 -20t66 -31z" />
+<glyph unicode="&#x2241;" horiz-adv-x="1591" d="M1477 746q0 -152 -96 -271.5t-238.5 -119.5t-333.5 158l-241 -417q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l248 429q-161 129 -290 129q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t239.5 119.5t341 -163l244 423q23 39 45 39 q41 0 41 -38q0 -16 -15 -42l-251 -435q156 -124 282 -124q85 0 156 50t104 130q15 36 21 98t30 62q29 0 29 -63z" />
+<glyph unicode="&#x2242;" horiz-adv-x="1591" d="M1477 438q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1477 882q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2243;" horiz-adv-x="1591" d="M1477 1054q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1477 282q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2244;" horiz-adv-x="1591" d="M1477 282q0 -41 -37 -41h-708l-210 -577q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l200 549h-490q-39 0 -39 41t39 41h520l171 469q-159 127 -181 142q-107 69 -209 69q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5 q110 0 228 -79l195 -155l225 618q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-232 -638q96 -58 185 -58t160 50t104 130q15 36 21 98t30 62q29 0 29 -63q0 -152 -96 -271.5t-244 -119.5q-109 0 -223 78l-152 -418h678q37 0 37 -41z" />
+<glyph unicode="&#x2245;" horiz-adv-x="1591" d="M1477 1115q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1477 441q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 41q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2246;" horiz-adv-x="1591" d="M1477 1115q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1477 41q0 -41 -37 -41h-789l-170 -294q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l146 253h-402q-39 0 -39 41t39 41h449l184 318h-633q-39 0 -39 41t39 41h680l114 197q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-90 -156h511q37 0 37 -41t-37 -41h-558 l-184 -318h742q37 0 37 -41z" />
+<glyph unicode="&#x2247;" horiz-adv-x="1591" d="M1477 41q0 -41 -37 -41h-796l-122 -336q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l112 308h-402q-39 0 -39 41t39 41h432l116 318h-548q-39 0 -39 41t39 41h578l130 357l-189 150q-112 75 -218 75q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63 q0 152 95.5 271.5t244.5 119.5q114 0 237 -86l203 -161l208 570q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-214 -588q86 -47 171 -47t156 50t104 130q15 36 21 98t30 62q29 0 29 -63q0 -152 -96 -271.5t-244 -119.5q-101 0 -205 66l-112 -308h620q37 0 37 -41t-37 -41h-650 l-116 -318h766q37 0 37 -41z" />
+<glyph unicode="&#x2248;" horiz-adv-x="1591" d="M1477 495q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1477 995q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98 t30 62q29 0 29 -63z" />
+<glyph unicode="&#x2249;" horiz-adv-x="1591" d="M1477 495q0 -152 -96 -271.5t-244 -119.5q-101 0 -205 66q-37 23 -176 136l-234 -642q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l243 667q-121 85 -232 85q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q124 0 266 -107 l107 296q-133 108 -173 133q-102 64 -200 64q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q107 0 219 -74q5 -3 187 -147l242 664q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-250 -686q107 -69 199.5 -69t163.5 50t104 130 q15 36 21 98t30 62q29 0 29 -63q0 -152 -96 -271.5t-244 -119.5q-115 0 -240 90l-108 -297q111 -92 162 -123q94 -56 182.5 -56t159.5 50t104 130q15 36 21 98t30 62q29 0 29 -63z" />
+<glyph unicode="&#x224a;" horiz-adv-x="1591" d="M1477 495q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1477 995q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98 t30 62q29 0 29 -63zM1477 -179q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x224b;" horiz-adv-x="1591" d="M1477 246q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1477 746q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98 t30 62q29 0 29 -63zM1477 1246q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130 q15 36 21 98t30 62q29 0 29 -63z" />
+<glyph unicode="&#x224c;" horiz-adv-x="1591" d="M1477 787q0 -63 -29 -63q-24 0 -28 43.5t-23 116.5q-33 80 -104 130t-156 50q-111 0 -235 -88l-207 -164q-125 -88 -240 -88q-149 0 -244.5 119.5t-95.5 271.5q0 63 28 63q24 0 29 -51q9 -90 38 -142q83 -147 245 -147q113 0 236 88l208 164q124 88 238 88 q148 0 244 -119.5t96 -271.5zM1477 441q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 41q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x224d;" horiz-adv-x="1591" d="M1477 1025q0 -17 -17 -32q-139 -122 -314.5 -196.5t-348.5 -74.5t-350.5 75t-315.5 196q-16 14 -16 32q0 41 41 41q14 0 24 -8q328 -254 615 -254t616 254q10 8 25 8q41 0 41 -41zM1477 139q0 -41 -41 -41q-15 0 -25 8q-327 254 -616.5 254t-614.5 -254q-10 -8 -24 -8 q-41 0 -41 41q0 18 16 32q138 121 315.5 196t350.5 75t348.5 -74.5t314.5 -196.5q17 -15 17 -32z" />
+<glyph unicode="&#x224e;" horiz-adv-x="1591" d="M1477 782q0 -41 -37 -41h-391q-13 0 -25 13t-12 26q0 87 -64 152t-152 65t-151 -64t-63 -153q0 -39 -39 -39h-389q-39 0 -39 41t39 41h348q17 111 100 183.5t193.5 72.5t195.5 -74t99 -182h350q37 0 37 -41zM1477 382q0 -41 -37 -41h-350q-15 -109 -99 -182.5 t-194.5 -73.5t-195 73t-99.5 183h-348q-39 0 -39 41t39 41h389q39 0 39 -37q0 -90 62.5 -154.5t151.5 -64.5t152.5 65.5t63.5 153.5q0 37 37 37h391q37 0 37 -41z" />
+<glyph unicode="&#x224f;" horiz-adv-x="1591" d="M1477 782q0 -41 -37 -41h-391q-13 0 -25 13t-12 26q0 87 -64 152t-152 65t-151 -64t-63 -153q0 -39 -39 -39h-389q-39 0 -39 41t39 41h348q17 111 100 183.5t193.5 72.5t195.5 -74t99 -182h350q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286 q37 0 37 -41z" />
+<glyph unicode="&#x2250;" horiz-adv-x="1591" d="M875.5 1309.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2251;" horiz-adv-x="1591" d="M1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM875.5 1309.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM876 14q33 -33 33 -79.5 t-33.5 -80t-80 -33.5t-79.5 33t-33 80t33 80t80 33t80 -33z" />
+<glyph unicode="&#x2252;" horiz-adv-x="1591" d="M275.5 1309.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1475.5 13.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z M1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2253;" horiz-adv-x="1591" d="M1475.5 1309.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM275.5 13.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z M1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2254;" horiz-adv-x="1971" d="M307.5 861.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM307.5 461.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1857 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1857 382 q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2255;" horiz-adv-x="1971" d="M1823.5 861.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1823.5 461.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z M1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2256;" horiz-adv-x="1591" d="M1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h485q-68 66 -68 158t68 160h-485q-39 0 -39 41t39 41h1286q37 0 37 -41t-37 -41h-488q67 -67 67 -159.5t-69 -158.5h490q37 0 37 -41zM898 479.5q44 43.5 44 102.5t-44 103.5t-103 44.5t-103 -44.5t-44 -103.5 t44 -102.5t103 -43.5t103 43.5z" />
+<glyph unicode="&#x2257;" horiz-adv-x="1591" d="M953 1440q66 -67 66 -158t-67 -157t-157.5 -66t-157 65.5t-66.5 156.5t66.5 158.5t158 67.5t157.5 -67zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM898 1179.5 q44 43.5 44 102.5t-44 103.5t-103 44.5t-103 -44.5t-44 -103.5t44 -102.5t103 -43.5t103 43.5z" />
+<glyph unicode="&#x2258;" horiz-adv-x="1591" d="M1477 1089q0 -41 -41 -41q-15 0 -25 8q-327 254 -616.5 254t-614.5 -254q-10 -8 -24 -8q-41 0 -41 41q0 18 16 32q138 121 315.5 196t350.5 75t348.5 -74.5t314.5 -196.5q17 -15 17 -32zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 382 q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2259;" horiz-adv-x="1591" d="M1148 908q0 -41 -41 -41q-27 0 -45 39l-265 563l-268 -563q-19 -39 -45 -39q-41 0 -41 41q0 5 309 659q18 39 45 39t45 -39l292 -622q14 -30 14 -37zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41 t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x225a;" horiz-adv-x="1591" d="M1148 1565q0 -7 -14 -37l-292 -622q-18 -39 -45 -39t-45 39q-309 654 -309 659q0 41 41 41q26 0 45 -39l268 -563l265 563q18 39 45 39q41 0 41 -41zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41 t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x225b;" horiz-adv-x="1591" d="M837 1320q230 44 236 44t6 -10.5t-7 -13.5l-209 -99l113 -207q0 -13 -13 -13q-5 0 -167 172q-162 -172 -168 -172q-13 0 -13 13l113 207l-206 98q-10 5 -10 15t6 10t236 -44l29 230q1 10 12.5 10t12.5 -10zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286 q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x225c;" horiz-adv-x="1591" d="M1190 949q0 -37 -33 -37h-723q-33 0 -33 37q0 10 6 20l357 619q10 18 31.5 18t31.5 -18l358 -619q5 -9 5 -20zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1082 990 l-286 496l-287 -496h573z" />
+<glyph unicode="&#x225d;" horiz-adv-x="1591" d="M1335 1495q0 -34 -33 -34q-19 0 -45 36.5t-55 36.5q-44 0 -54 -57q-2 -14 -2 -91v-27h95v-29h-95v-249q0 -52 15 -65t70 -13v-15h-222v15q45 0 57.5 17t12.5 61v249h-72v29h72q0 79 18 118q40 86 137 86q32 0 66.5 -19t34.5 -49zM937 1020q-42 -43 -109.5 -43t-110.5 57 t-43 138.5t44 139.5t118 58t113 -42.5t39 -108.5h-257q0 -69 35 -122.5t105.5 -53.5t103.5 89l13 -9q-9 -60 -51 -103zM516 977v53q-51 -53 -114.5 -53t-104.5 55t-41 131t50 141.5t129 65.5q49 0 81 -31v76q0 96 -29 96q-11 0 -27 -6l-6 14l111 45h18v-429q0 -105 28 -105 q12 0 30 7l4 -14l-110 -46h-19zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM822 1342q-82 0 -91 -99h172q-6 99 -81 99zM516 1249q0 36 -25.5 66t-60.5 30q-52 0 -76 -49 t-24 -109t26 -107q31 -59 89 -59q36 0 71 37v191z" />
+<glyph unicode="&#x225e;" horiz-adv-x="1591" d="M1266 987h-272v22q59 0 74 20t15 68v257q0 127 -91 127q-63 0 -142 -75v-28q-1 -13 -1 -43.5t1 -78.5v-151t14.5 -75.5t75.5 -20.5v-22h-278v22q57 0 73 19.5t16 75.5v250q0 129 -93 129q-78 0 -141 -77v-302q0 -49 9 -67q14 -28 80 -28v-22h-272v22q54 0 69 21.5 t15 74.5v237q0 109 -19 124q-9 7 -25.5 7t-39.5 -9l-9 22l166 67h26v-117q64 64 84 79q52 38 107 38q112 0 138 -117q100 117 192 117q145 0 145 -205v-236q0 -59 14 -81t69 -22v-22zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 382 q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x225f;" horiz-adv-x="1591" d="M667 1384q-55 0 -55 73t55 111t129 38t128.5 -41t54.5 -115t-65 -151q-88 -104 -103 -135.5t-18 -91.5h-21q3 63 13.5 97.5t56 124.5t45.5 146t-31 97t-86 41q-93 0 -93 -65q0 -17 15 -45.5t15 -41.5q0 -42 -40 -42zM786 1010q56 0 56 -55.5t-56 -55.5t-56 55.5t56 55.5z M1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2260;" horiz-adv-x="1591" d="M1477 382q0 -41 -37 -41h-768l-291 -505q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l268 464h-424q-39 0 -39 41t39 41h471l184 318h-655q-39 0 -39 41t39 41h702l292 506q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-268 -465h489q37 0 37 -41t-37 -41h-537l-183 -318h720 q37 0 37 -41z" />
+<glyph unicode="&#x2261;" horiz-adv-x="1591" d="M1477 982q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 582q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 182q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2262;" horiz-adv-x="1591" d="M1477 182q0 -41 -37 -41h-843l-176 -305q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l152 264h-348q-39 0 -39 41t39 41h396l183 318h-579q-39 0 -39 41t39 41h627l183 318h-810q-39 0 -39 41t39 41h857l177 306q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-153 -265h334 q37 0 37 -41t-37 -41h-381l-184 -318h565q37 0 37 -41t-37 -41h-612l-184 -318h796q37 0 37 -41z" />
+<glyph unicode="&#x2263;" horiz-adv-x="1591" d="M1477 1182q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 -18q0 -41 -37 -41h-1286q-39 0 -39 41t39 41 h1286q37 0 37 -41z" />
+<glyph unicode="&#x2264;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2265;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2266;" horiz-adv-x="1591" d="M1421 331q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1421 41q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 -259q0 -41 -37 -41h-1175 q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2267;" horiz-adv-x="1591" d="M1421 882q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 41q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 -259q0 -41 -37 -41h-1175 q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2268;" horiz-adv-x="1591" d="M1421 331q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1421 -259q0 -41 -37 -41h-720l-127 -129q-13 -13 -29 -13q-42 0 -42 42q0 16 13 29l70 71h-340q-39 0 -39 41 t39 41h421l216 218h-637q-39 0 -39 41t39 41h718l127 129q13 13 29 13q42 0 42 -42q0 -16 -13 -29l-70 -71h342q37 0 37 -41t-37 -41h-423l-216 -218h639q37 0 37 -41z" />
+<glyph unicode="&#x2269;" horiz-adv-x="1591" d="M1421 882q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 -259q0 -41 -37 -41h-720l-127 -129q-13 -13 -29 -13q-42 0 -42 42q0 16 13 29l70 71h-340 q-39 0 -39 41t39 41h421l216 218h-637q-39 0 -39 41t39 41h718l127 129q13 13 29 13q42 0 42 -42q0 -16 -13 -29l-70 -71h342q37 0 37 -41t-37 -41h-423l-216 -218h639q37 0 37 -41z" />
+<glyph unicode="&#x226a;" horiz-adv-x="2211" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM2041 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37 l-1090 -514l1090 -514q24 -11 24 -37z" />
+<glyph unicode="&#x226b;" horiz-adv-x="2211" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM2041 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514 q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37z" />
+<glyph unicode="&#x226c;" horiz-adv-x="1024" d="M870 582q0 -437 -313 -776q88 -90 184 -154q23 -13 68 -41q12 -8 12 -22q0 -31 -30 -31q-53 0 -279 201q-223 -201 -281 -201q-30 0 -30 31q0 14 12 22q23 13 93.5 59t158.5 136q-313 339 -313 777.5t313 774.5q-88 90 -184 154q-23 13 -68 41q-12 8 -12 22q0 31 29.5 31 t131 -77t150.5 -124q51 48 151 124.5t129 76.5t29 -31q0 -14 -12 -22q-23 -13 -93.5 -59t-158.5 -136q313 -339 313 -776zM770 582q0 412 -258 723q-260 -305 -260 -721t260 -725q258 311 258 723z" />
+<glyph unicode="&#x226d;" horiz-adv-x="1591" d="M1477 1025q0 -17 -17 -32q-139 -122 -314.5 -196.5t-348.5 -74.5t-350.5 75t-315.5 196q-16 14 -16 32q0 41 41 41q14 0 24 -8q328 -254 615 -254t616 254q10 8 25 8q41 0 41 -41zM1477 139q0 -41 -41 -41q-15 0 -25 8q-327 254 -616.5 254t-614.5 -254q-10 -8 -24 -8 q-41 0 -41 41q0 18 16 32q138 121 315.5 196t350.5 75t348.5 -74.5t314.5 -196.5q17 -15 17 -32zM1274 1330q0 -16 -15 -42l-838 -1452q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l838 1452q23 39 45 39q41 0 41 -38z" />
+<glyph unicode="&#x226e;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-618 292l-226 -621q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l229 628l-476 225q-27 13 -27 37t27 37l706 333l200 549q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-171 -471l357 169q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-427 -202 l-194 -533l621 -293q24 -11 24 -37zM864 845l-557 -263l394 -186z" />
+<glyph unicode="&#x226f;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-666 -314l-206 -567q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l178 488l-397 -187q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l467 220l183 502l-650 306q-24 11 -24 37q0 41 41 41q8 0 14 -3l647 -305l231 635q17 46 43 46q42 0 42 -37q0 -15 -8 -37 l-234 -643l448 -211q27 -13 27 -37zM1284 582l-365 172l-152 -416z" />
+<glyph unicode="&#x2270;" horiz-adv-x="1591" d="M1421 -259q0 -41 -37 -41h-827l-35 -95q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l24 67h-259q-39 0 -39 41t39 41h289l193 530l-494 233q-27 13 -27 37t27 37l732 346l174 477q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-145 -399l331 156q6 3 14 3q41 0 41 -41 q0 -26 -24 -37l-402 -189l-201 -555l603 -284q24 -11 24 -37q0 -41 -41 -41q-8 0 -14 3l-600 283l-180 -494h798q37 0 37 -41zM890 857l-583 -275l412 -194z" />
+<glyph unicode="&#x2271;" horiz-adv-x="1591" d="M1421 -259q0 -41 -37 -41h-827l-35 -95q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l24 67h-259q-39 0 -39 41t39 41h289l150 411l-423 -200q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l493 233l175 480l-668 315q-24 11 -24 37q0 41 41 41q8 0 14 -3l665 -314l213 585 q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-215 -592l429 -203q27 -13 27 -37t-27 -37l-640 -302l-168 -461h798q37 0 37 -41zM1284 582l-347 164l-144 -395z" />
+<glyph unicode="&#x2272;" horiz-adv-x="1591" d="M1477 46q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1421 331q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37z" />
+<glyph unicode="&#x2273;" horiz-adv-x="1591" d="M1477 46q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1421 882q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37z" />
+<glyph unicode="&#x2274;" horiz-adv-x="1591" d="M1477 46q0 -152 -96 -271.5t-244 -119.5q-105 0 -214 71q-16 11 -183 144l-46 -257q-10 -55 -41 -55q-42 0 -42 42q0 10 3 27l52 297q-108 71 -211 71q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q111 0 230 -81 l95 541l-583 276q-27 13 -27 37t27 37l704 332l53 301q10 54 41 54q42 0 42 -41q0 -16 -2 -27l-43 -244l374 177q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-422 -199l-103 -581l525 -248q24 -11 24 -37q0 -41 -41 -41q-8 0 -14 3l-509 240l-99 -560q146 -118 176 -137 q104 -67 196 -67t163 50t104 130q15 36 21 98t30 62q29 0 29 -63zM884 1154l-577 -272l488 -230z" />
+<glyph unicode="&#x2275;" horiz-adv-x="1591" d="M1477 46q0 -152 -96 -271.5t-244 -119.5q-105 0 -214 71q-16 11 -183 144l-46 -257q-10 -55 -41 -55q-42 0 -42 42q0 10 3 27l52 297q-108 71 -211 71q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q111 0 230 -81 l93 526l-553 -261q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l601 283l75 426l-676 319q-24 11 -24 37q0 41 41 41q8 0 14 -3l660 -311l69 392q10 54 41 54q42 0 42 -41q0 -16 -2 -27l-73 -415l432 -204q27 -13 27 -37t-27 -37l-526 -248l-110 -624q146 -118 176 -137 q104 -67 196 -67t163 50t104 130q15 36 21 98t30 62q29 0 29 -63zM1284 882l-337 159l-61 -347z" />
+<glyph unicode="&#x2276;" horiz-adv-x="1591" d="M1421 150q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 463q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41 q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37z" />
+<glyph unicode="&#x2277;" horiz-adv-x="1591" d="M1421 1014q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 -401q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41 q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37z" />
+<glyph unicode="&#x2278;" horiz-adv-x="1591" d="M1421 150q0 -24 -27 -37l-698 -329l-30 -171q-10 -55 -41 -55q-42 0 -42 42q0 10 3 27l20 114l-381 -180q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l429 202l102 576l-531 250q-24 11 -24 37q0 41 41 41q8 0 14 -3l514 -243l37 208l-579 273q-27 13 -27 37t27 37l699 330 l30 171q10 54 41 54q42 0 42 -41q0 -16 -2 -27l-20 -114l379 179q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-427 -202l-103 -576l530 -250q24 -11 24 -37q0 -41 -41 -41q-8 0 -14 3l-513 242l-37 -207l578 -273q27 -13 27 -37zM879 1284l-572 -270l484 -228zM1284 150l-483 228 l-88 -497z" />
+<glyph unicode="&#x2279;" horiz-adv-x="1591" d="M1421 -401q0 -41 -41 -41q-8 0 -14 3l-654 309l-46 -257q-10 -55 -41 -55q-42 0 -42 42q0 10 3 27l49 279l-438 207q-27 13 -27 37t27 37l532 251l44 246l-548 -259q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l596 281l76 430l-672 317q-24 11 -24 37q0 41 41 41q8 0 14 -3 l655 -309l46 258q10 54 41 54q42 0 42 -41q0 -16 -2 -27l-50 -281l437 -206q27 -13 27 -37t-27 -37l-531 -251l-43 -245l546 258q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-594 -280l-77 -432l671 -316q24 -11 24 -37zM1284 1014l-341 161l-63 -351zM712 341l-405 -191l343 -162 z" />
+<glyph unicode="&#x227a;" horiz-adv-x="1591" d="M1421 35q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-268 78 -704 78q-39 0 -39 41t39 41q436 0 706 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295 q12 -52 12 -75z" />
+<glyph unicode="&#x227b;" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41q-267 0 -500 -31.5t-415.5 -142.5t-216.5 -338q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37q35 -232 215 -342t418 -142t499 -32q37 0 37 -41z" />
+<glyph unicode="&#x227c;" horiz-adv-x="1591" d="M1421 35q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-268 78 -704 78q-39 0 -39 41t39 41q436 0 706 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295 q12 -52 12 -75zM1194 -275q0 -43 -41 -43q-34 0 -41 37q-23 156 -108.5 252t-221.5 155q-248 107 -573 107q-39 0 -39 41t45 41q257 0 470 -65q261 -80 397 -245q112 -136 112 -280z" />
+<glyph unicode="&#x227d;" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41q-267 0 -500 -31.5t-415.5 -142.5t-216.5 -338q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37q35 -232 215 -342t418 -142t499 -32q37 0 37 -41zM1421 274 q0 -41 -37 -41q-326 0 -573 -107q-137 -60 -221.5 -155t-110.5 -252q-6 -37 -41 -37q-41 0 -41 43q0 9 6 43q24 135 109 237q138 165 397 245q212 65 469 65q43 0 43 -41z" />
+<glyph unicode="&#x227e;" horiz-adv-x="1591" d="M1421 335q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-268 78 -704 78q-39 0 -39 41t39 41q436 0 706 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295 q12 -52 12 -75zM1477 46q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130 q15 36 21 98t30 62q29 0 29 -63z" />
+<glyph unicode="&#x227f;" horiz-adv-x="1591" d="M1421 882q0 -41 -37 -41q-267 0 -500 -31.5t-415.5 -142.5t-216.5 -338q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37q35 -232 215 -342t418 -142t499 -32q37 0 37 -41zM1477 46 q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62q29 0 29 -63z " />
+<glyph unicode="&#x2280;" horiz-adv-x="1591" d="M1421 35q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-119 35 -256 53l-182 -539q-10 -28 -38 -28q-42 0 -42 39q0 8 2 15l177 523q-152 15 -365 15q-39 0 -39 41t39 41q236 0 404 20l184 546q10 28 38 28q42 0 42 -39q0 -8 -2 -15l-171 -508 q112 19 211 48q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295q12 -52 12 -75z" />
+<glyph unicode="&#x2281;" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41q-233 0 -437 -24l-182 -540q-10 -28 -38 -28q-42 0 -42 39q0 8 2 15l170 502q-219 -35 -395 -142t-210 -334q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37 q35 -232 216 -342t419 -142l19 -3l181 537q10 28 38 28q42 0 42 -39q0 -8 -2 -15l-176 -520q190 -20 395 -20q37 0 37 -41z" />
+<glyph unicode="&#x2282;" horiz-adv-x="1591" d="M1421 41q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h584q39 0 39 -41z" />
+<glyph unicode="&#x2283;" horiz-adv-x="1591" d="M1421 582q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41t39 41h584q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5z" />
+<glyph unicode="&#x2284;" horiz-adv-x="1591" d="M1421 41q0 -41 -39 -41h-590q-24 0 -47 2l-123 -338q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l117 322q-208 43 -349.5 200.5t-141.5 367.5q0 245 187 413.5t435 168.5h288l123 337q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-112 -309h214q39 0 39 -41t-39 -41h-244 l-364 -999q12 -1 24 -1h584q39 0 39 -41zM798 1082q-216 0 -381 -143.5t-165 -356.5q0 -185 127 -319.5t311 -170.5l360 990h-252z" />
+<glyph unicode="&#x2285;" horiz-adv-x="1591" d="M1421 582q0 -245 -187 -413.5t-435 -168.5h-255l-122 -336q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l112 308h-247q-39 0 -39 41t39 41h277l363 997q-28 3 -56 3h-584q-39 0 -39 41t39 41h590q40 0 79 -5l125 342q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-120 -330 q197 -51 329 -205t132 -356zM1339 582q0 176 -117 308t-290 175l-358 -983h219q216 0 381 143.5t165 356.5z" />
+<glyph unicode="&#x2286;" horiz-adv-x="1591" d="M1421 41q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h584q39 0 39 -41zM1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2287;" horiz-adv-x="1591" d="M1421 582q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41t39 41h584q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5zM1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2288;" horiz-adv-x="1591" d="M1421 -259q0 -41 -37 -41h-821l-42 -115q-10 -27 -37 -27q-43 0 -43 40q0 7 3 15l32 87h-267q-39 0 -39 41t39 41h297l90 249q-185 59 -305.5 208.5t-120.5 342.5q0 245 187 413.5t435 168.5h218l59 161q10 28 37 28q43 0 43 -40q0 -8 -3 -16l-49 -133h285q39 0 39 -41 t-39 -41h-315l-362 -992q47 -8 93 -8h584q39 0 39 -41t-39 -41h-590q-58 0 -116 11l-83 -229h791q37 0 37 -41zM798 1082q-216 0 -381 -143.5t-165 -356.5q0 -167 105.5 -295t267.5 -178l355 973h-182z" />
+<glyph unicode="&#x2289;" horiz-adv-x="1591" d="M1421 -259q0 -41 -37 -41h-829l-42 -115q-10 -27 -37 -27q-43 0 -43 40q0 7 3 15l32 87h-259q-39 0 -39 41t39 41h289l79 218h-368q-39 0 -39 41t39 41h398l356 974q-84 26 -170 26h-584q-39 0 -39 41t39 41h590q98 0 192 -30l70 191q10 28 37 28q43 0 43 -40 q0 -8 -3 -16l-70 -192q157 -72 255 -211t98 -312q0 -245 -187 -413.5t-435 -168.5h-135l-79 -218h799q37 0 37 -41zM1339 582q0 147 -83 264.5t-217 180.5l-345 -945h99q216 0 381 143.5t165 356.5z" />
+<glyph unicode="&#x228a;" horiz-adv-x="1591" d="M1421 41q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h584q39 0 39 -41zM1421 -259q0 -41 -37 -41h-574l-177 -133q-12 -9 -25 -9q-42 0 -42 43 q0 19 17 32l90 67h-464q-39 0 -39 41t39 41h573l176 133q12 8 25 8q42 0 42 -42q0 -19 -17 -32l-89 -67h465q37 0 37 -41z" />
+<glyph unicode="&#x228b;" horiz-adv-x="1591" d="M1421 582q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41t39 41h584q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5zM1421 -259q0 -41 -37 -41h-574l-177 -133q-12 -9 -25 -9q-42 0 -42 43q0 19 17 32 l90 67h-464q-39 0 -39 41t39 41h573l176 133q12 8 25 8q42 0 42 -42q0 -19 -17 -32l-89 -67h465q37 0 37 -41z" />
+<glyph unicode="&#x228c;" horiz-adv-x="1364" d="M1249 389q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v799q0 37 41 37t41 -37v-793q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v793q0 37 41 37t41 -37v-799zM1188 541h-583q158 -123 214 -336q6 -23 6 -29q0 -31 -35 -31 q-4 0 -11.5 0.5t-11.5 0.5q-19 0 -33 59q-26 112 -98.5 197t-222.5 156q-19 9 -19 25t55 39q105 44 181.5 135t103.5 202q2 13 9 38q9 22 45.5 22t36.5 -31q0 -6 -6 -29q-55 -211 -214 -336h583v-82z" />
+<glyph unicode="&#x228d;" horiz-adv-x="1364" d="M1249 389q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v799q0 37 41 37t41 -37v-793q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v793q0 37 41 37t41 -37v-799zM1061 394q0 -62 -60 -62q-15 0 -29 10l-262 191l31 -338 q0 -53 -59 -53q-23 0 -42.5 17t-17.5 40l31 334l-262 -191q-14 -10 -29 -10q-59 0 -59 62q0 36 28 49l295 139l-295 139q-28 13 -28 49q0 62 59 62q15 0 29 -10l262 -191l-31 340q0 53 60 53q25 0 43 -17t16 -42l-31 -334l262 191q14 10 29 10q60 0 60 -62q0 -35 -29 -49 l-295 -139l295 -139q29 -14 29 -49z" />
+<glyph unicode="&#x228e;" horiz-adv-x="1364" d="M1249 389q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v799q0 37 41 37t41 -37v-793q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v793q0 37 41 37t41 -37v-799zM1090 582q0 -41 -37 -41h-330v-330q0 -37 -41 -37t-41 37v330h-330 q-37 0 -37 41t37 41h330v330q0 37 41 37t41 -37v-330h330q37 0 37 -41z" />
+<glyph unicode="&#x228f;" horiz-adv-x="1591" d="M1421 41q0 -41 -37 -41h-1175q-39 0 -39 37v1090q0 37 39 37h1175q37 0 37 -41t-37 -41h-1132v-1000h1132q37 0 37 -41z" />
+<glyph unicode="&#x2290;" horiz-adv-x="1591" d="M1421 37q0 -37 -39 -37h-1175q-37 0 -37 41t37 41h1132v1000h-1132q-37 0 -37 41t37 41h1175q39 0 39 -37v-1090z" />
+<glyph unicode="&#x2291;" horiz-adv-x="1591" d="M1421 41q0 -41 -37 -41h-1175q-39 0 -39 37v1090q0 37 39 37h1175q37 0 37 -41t-37 -41h-1132v-1000h1132q37 0 37 -41zM1421 -318q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2292;" horiz-adv-x="1591" d="M1421 37q0 -37 -39 -37h-1175q-37 0 -37 41t37 41h1132v1000h-1132q-37 0 -37 41t37 41h1175q39 0 39 -37v-1090zM1421 -318q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2293;" horiz-adv-x="1364" d="M1239 39q0 -39 -41 -39t-41 39v1104h-950v-1104q0 -39 -41 -39t-41 39v1149q0 37 39 37h1038q37 0 37 -37v-1149z" />
+<glyph unicode="&#x2294;" horiz-adv-x="1364" d="M1239 39q0 -39 -37 -39h-1038q-39 0 -39 39v1149q0 37 41 37t41 -37v-1106h950v1106q0 37 41 37t41 -37v-1149z" />
+<glyph unicode="&#x2295;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM837 623h598q-16 241 -187 412.5t-411 186.5v-599zM755 623v599q-241 -16 -412 -187t-186 -412h598zM837 541v-599q239 15 410.5 187t187.5 412 h-598zM755 541h-598q16 -240 187 -411.5t411 -187.5v599z" />
+<glyph unicode="&#x2296;" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188 t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5z" />
+<glyph unicode="&#x2297;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1277 161q159 181 159 421.5t-159 422.5l-423 -423zM1219 1063q-181 160 -423 160t-423 -160l424 -424zM315 1004q-159 -181 -159 -421t158 -422 l423 421zM373 103q182 -162 423.5 -162t423.5 161l-423 423z" />
+<glyph unicode="&#x2298;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1219 1063q-181 160 -434.5 160t-441 -187.5t-187.5 -453.5q0 -240 160 -422zM1248.5 129.5q187.5 188.5 187.5 441t-159 434.5l-903 -903 q182 -161 434.5 -161t440 188.5z" />
+<glyph unicode="&#x2299;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582q0 270 -189.5 459.5t-459.5 189.5t-459.5 -189.5t-189.5 -459.5t189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5zM979 582 q0 -79 -55.5 -134.5t-134.5 -55.5t-134.5 55.5t-55.5 134.5t55.5 134.5t134.5 55.5t134.5 -55.5t55.5 -134.5z" />
+<glyph unicode="&#x229a;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582q0 270 -189.5 459.5t-459.5 189.5t-459.5 -189.5t-189.5 -459.5t189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5zM1072 582 q0 -118 -82.5 -200.5t-200.5 -82.5t-200.5 82.5t-82.5 200.5t82.5 200.5t200.5 82.5t200.5 -82.5t82.5 -200.5zM972 582q0 77 -53 130t-130 53t-130 -53t-53 -130t53 -130t130 -53t130 53t53 130z" />
+<glyph unicode="&#x229b;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1174 394 q0 -62 -60 -62q-15 0 -29 10l-262 191l31 -338q0 -53 -59 -53q-23 0 -42.5 17t-17.5 40l31 334l-262 -191q-14 -10 -29 -10q-59 0 -59 62q0 36 28 49l295 139l-295 139q-28 13 -28 49q0 62 59 62q15 0 29 -10l262 -191l-31 340q0 53 60 53q25 0 43 -17t16 -42l-31 -334 l262 191q14 10 29 10q60 0 60 -62q0 -35 -29 -49l-295 -139l295 -139q29 -14 29 -49z" />
+<glyph unicode="&#x229c;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1321 784 q0 -41 -37 -41h-975q-39 0 -39 41t39 41h975q37 0 37 -41zM1321 380q0 -41 -37 -41h-975q-39 0 -39 41t39 41h975q37 0 37 -41z" />
+<glyph unicode="&#x229d;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1221 582 q0 -41 -37 -41h-775q-39 0 -39 41t39 41h775q37 0 37 -41z" />
+<glyph unicode="&#x229e;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 623v570h-569v-570h569zM755 623v570h-569v-570h569zM1406 -29v570h-569v-570h569zM755 -29v570h-569v-570h569z" />
+<glyph unicode="&#x229f;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 623v570h-1220v-570h1220zM1406 -29v570h-1220v-570h1220z" />
+<glyph unicode="&#x22a0;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 -29v1222h-1220v-1222h1220zM1290 129q0 -41 -41 -41q-15 0 -30 15l-422 422l-424 -422q-15 -15 -31 -15q-41 0 -41 41q0 19 10 29l426 424l-426 426q-10 10 -10 27q0 41 41 41 q18 0 31 -13l424 -424l422 424q13 13 30 13q41 0 41 -41q0 -17 -10 -27l-426 -426l426 -424q10 -10 10 -29z" />
+<glyph unicode="&#x22a1;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 -29v1222h-1220v-1222h1220zM874.5 661.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x22a2;" horiz-adv-x="1251" d="M1135 711q0 -41 -37 -41h-901v-631q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-632h901q37 0 37 -41z" />
+<glyph unicode="&#x22a3;" horiz-adv-x="1251" d="M1135 39q0 -39 -41 -39t-41 39v631h-899q-39 0 -39 41t39 41h899v632q0 37 41 37t41 -37v-1345z" />
+<glyph unicode="&#x22a4;" horiz-adv-x="1591" d="M1479 1323q0 -41 -37 -41h-604v-1243q0 -39 -41 -39t-41 39v1243h-602q-39 0 -39 41t39 41h1288q37 0 37 -41z" />
+<glyph unicode="&#x22a5;" horiz-adv-x="1591" d="M1479 41q0 -41 -37 -41h-1288q-39 0 -39 41t39 41h602v1245q0 37 41 37t41 -37v-1245h604q37 0 37 -41z" />
+<glyph unicode="&#x22a6;" horiz-adv-x="751" d="M635 711q0 -41 -37 -41h-401v-631q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-632h401q37 0 37 -41z" />
+<glyph unicode="&#x22a7;" horiz-adv-x="751" d="M635 512q0 -41 -37 -41h-401v-432q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-434h401q37 0 37 -41t-37 -41h-401v-315h401q37 0 37 -41z" />
+<glyph unicode="&#x22a8;" horiz-adv-x="1251" d="M1135 512q0 -41 -37 -41h-901v-432q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-434h901q37 0 37 -41t-37 -41h-901v-315h901q37 0 37 -41z" />
+<glyph unicode="&#x22a9;" horiz-adv-x="1479" d="M1362 711q0 -41 -37 -41h-731v-631q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-632h731q37 0 37 -41zM197 39q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-1345z" />
+<glyph unicode="&#x22aa;" horiz-adv-x="1819" d="M1704 711q0 -41 -37 -41h-729v-631q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-632h729q37 0 37 -41zM567 39q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-1345zM197 39q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-1345z" />
+<glyph unicode="&#x22ab;" horiz-adv-x="1479" d="M1362 512q0 -41 -37 -41h-731v-432q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-434h731q37 0 37 -41t-37 -41h-731v-315h731q37 0 37 -41zM197 39q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-1345z" />
+<glyph unicode="&#x22ac;" horiz-adv-x="1251" d="M1194 1330q0 -16 -15 -42l-309 -536h228q37 0 37 -41t-37 -41h-276l-481 -834q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l458 793h-531v-631q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-632h578l333 577q23 39 45 39q41 0 41 -38z" />
+<glyph unicode="&#x22ad;" horiz-adv-x="1251" d="M1194 1330q0 -16 -15 -42l-195 -338h114q37 0 37 -41t-37 -41h-161l-182 -315h343q37 0 37 -41t-37 -41h-391l-366 -635q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l343 594h-416v-432q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-434h692l219 379q23 39 45 39 q41 0 41 -38zM197 868v-315h463l182 315h-645z" />
+<glyph unicode="&#x22ae;" horiz-adv-x="1479" d="M1362 711q0 -41 -37 -41h-493l-238 -413v-218q0 -39 -41 -39t-41 39v76l-161 -279q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l232 402v1105q0 37 41 37t41 -37v-632h191l333 577q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-309 -536h445q37 0 37 -41zM197 39q0 -39 -41 -39 t-41 39v1345q0 37 41 37t41 -37v-1345zM594 670v-249l144 249h-144z" />
+<glyph unicode="&#x22af;" horiz-adv-x="1479" d="M1362 512q0 -41 -37 -41h-608l-123 -214v-218q0 -39 -41 -39t-41 39v76l-161 -279q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l232 402v1105q0 37 41 37t41 -37v-434h305l219 379q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-195 -338h331q37 0 37 -41t-37 -41h-378 l-182 -315h560q37 0 37 -41zM197 39q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-1345zM594 868v-315h76l182 315h-258zM594 471v-50l29 50h-29z" />
+<glyph unicode="&#x22b0;" horiz-adv-x="1591" d="M1381 157q0 -115 -88 -189t-205 -74q-40 0 -40 40t40 40q84 0 148.5 50t64.5 131q0 192 -386 306q-271 80 -706 80q-39 0 -39 41t39 41q435 0 706 80q386 114 386 306q0 81 -64.5 131t-148.5 50q-40 0 -40 40t40 40q117 0 205 -74t88 -189q0 -179 -232 -300 q-160 -83 -391 -125q231 -42 391 -125q232 -121 232 -300z" />
+<glyph unicode="&#x22b1;" horiz-adv-x="1591" d="M1421 582q0 -41 -39 -41q-435 0 -706 -80q-386 -114 -386 -306q0 -81 64.5 -131t148.5 -50q40 0 40 -40t-40 -40q-117 0 -205 74t-88 189q0 179 232 300q160 83 391 125q-231 42 -391 125q-232 121 -232 300q0 115 88 189t205 74q40 0 40 -40t-40 -40q-84 0 -148.5 -50 t-64.5 -131q0 -192 386 -306q271 -80 706 -80q39 0 39 -41z" />
+<glyph unicode="&#x22b2;" horiz-adv-x="1591" d="M1421 25q0 -37 -41 -37q-10 0 -14 2l-1169 553q-27 13 -27 39t20 35l1176 555q4 2 14 2q41 0 41 -37v-1112zM1339 93v976l-1032 -487z" />
+<glyph unicode="&#x22b3;" horiz-adv-x="1591" d="M1421 582q0 -26 -18 -35l-1176 -557q-4 -2 -16 -2q-41 0 -41 37v1112q0 37 41 37q12 0 16 -2l1170 -553q24 -11 24 -37zM1284 582l-1032 487v-976z" />
+<glyph unicode="&#x22b4;" horiz-adv-x="1591" d="M1421 25q0 -37 -41 -37q-10 0 -14 2l-1169 553q-27 13 -27 39t20 35l1176 555q4 2 14 2q41 0 41 -37v-1112zM1339 93v976l-1032 -487zM1421 -318q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x22b5;" horiz-adv-x="1591" d="M1421 582q0 -26 -18 -35l-1176 -557q-4 -2 -16 -2q-41 0 -41 37v1112q0 37 41 37q12 0 16 -2l1170 -553q24 -11 24 -37zM1284 582l-1032 487v-976zM1421 -318q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x22b6;" d="M1903 812q95 -96 95 -229.5t-95.5 -230t-223.5 -96.5t-220.5 81.5t-108.5 203.5h-652q-16 -122 -108.5 -203.5t-220.5 -81.5t-223.5 96.5t-95.5 230t95 229.5t223 96t221.5 -82t108.5 -203h652q15 121 108.5 203t221.5 82t223 -96zM618 582q0 100 -72 172t-171.5 72 t-171 -72.5t-71.5 -171.5t71.5 -171.5t171 -72.5t171.5 72t72 172z" />
+<glyph unicode="&#x22b7;" d="M1903 812q95 -96 95 -229.5t-95.5 -230t-223.5 -96.5t-220.5 81.5t-108.5 203.5h-652q-16 -122 -108.5 -203.5t-220.5 -81.5t-223.5 96.5t-95.5 230t95 229.5t223 96t221.5 -82t108.5 -203h652q15 121 108.5 203t221.5 82t223 -96zM1916 582q0 99 -71.5 171.5t-171 72.5 t-171.5 -72t-72 -172t72 -172t171.5 -72t171 72.5t71.5 171.5z" />
+<glyph unicode="&#x22b8;" d="M1853 812q95 -96 95 -229.5t-95.5 -230t-223.5 -96.5t-220.5 81.5t-108.5 203.5h-1163q-37 0 -37 41t37 41h1163q15 121 108.5 203t221.5 82t223 -96zM1866 582q0 99 -71.5 171.5t-171 72.5t-171.5 -72t-72 -172t72 -172t171.5 -72t171 72.5t71.5 171.5z" />
+<glyph unicode="&#x22b9;" horiz-adv-x="1591" d="M837 716q0 -39 -41 -39t-41 39v475q0 37 41 37t41 -37v-475zM1441 582q0 -41 -37 -41h-475q-39 0 -39 41t39 41h475q37 0 37 -41zM701 582q0 -41 -37 -41h-475q-39 0 -39 41t39 41h475q37 0 37 -41zM837 -25q0 -39 -41 -39t-41 39v476q0 37 41 37t41 -37v-476z" />
+<glyph unicode="&#x22ba;" horiz-adv-x="1137" d="M1019 795q0 -22 -20.5 -41.5t-42.5 -19.5h-320v-1096q0 -23 -22 -41t-45 -18q-46 0 -62 43q-4 11 -5 16v1096h-319q-63 0 -63 75q0 20 21 39.5t42 19.5h773q63 0 63 -73z" />
+<glyph unicode="&#x22bb;" horiz-adv-x="1251" d="M1135 1425q0 -12 -2 -16l-469 -987q-12 -25 -38.5 -25t-35.5 18l-471 994q-4 8 -4 16q0 41 41 41q24 0 34 -20l435 -914l432 907q13 27 37 27q41 0 41 -41zM1135 41q0 -41 -37 -41h-944q-39 0 -39 41t39 41h944q37 0 37 -41z" />
+<glyph unicode="&#x22bc;" horiz-adv-x="1251" d="M1135 1425q0 -41 -37 -41h-944q-39 0 -39 41t39 41h944q37 0 37 -41zM1135 41q0 -41 -41 -41q-24 0 -37 27l-432 907l-435 -914q-10 -20 -34 -20q-41 0 -41 41q0 8 4 16l471 994q9 18 35.5 18t38.5 -25l469 -987q2 -4 2 -16z" />
+<glyph unicode="&#x22bd;" horiz-adv-x="1251" d="M1135 1425q0 -41 -37 -41h-944q-39 0 -39 41t39 41h944q37 0 37 -41zM1135 1028q0 -12 -2 -16l-469 -987q-12 -25 -38.5 -25t-35.5 18l-471 994q-4 8 -4 16q0 41 41 41q24 0 34 -20l435 -914l432 907q13 27 37 27q41 0 41 -41z" />
+<glyph unicode="&#x22be;" horiz-adv-x="1573" d="M1434 41q0 -41 -68 -41h-1139q-61 0 -66 35q-2 11 -2 33v1269q0 68 41 68t41 -68v-580q276 -2 473.5 -199t200.5 -476h451q68 0 68 -41zM241 82h592q-3 243 -175 416.5t-417 176.5v-593z" />
+<glyph unicode="&#x22bf;" horiz-adv-x="1820" d="M1671 37q0 -37 -41 -37h-1470q-39 0 -39 41q0 17 18 35l1469 1468q6 6 22 6q41 0 41 -39v-1474zM1589 82v1319l-1319 -1319h1319z" />
+<glyph unicode="&#x22c0;" horiz-adv-x="1364" d="M1249 -4q0 -41 -41 -41q-26 0 -37 25l-489 1103l-487 -1103q-11 -25 -39 -25q-41 0 -41 41q0 7 530 1204q11 25 38 25t38 -25l526 -1188q2 -5 2 -16z" />
+<glyph unicode="&#x22c1;" horiz-adv-x="1364" d="M1249 1184q0 -10 -2 -15l-526 -1189q-11 -25 -38 -25t-38 25q-530 1198 -530 1204q0 41 41 41q28 0 39 -25l487 -1104l489 1104q11 25 37 25q41 0 41 -41z" />
+<glyph unicode="&#x22c2;" horiz-adv-x="1704" d="M1569 -352q0 -50 -60 -50q-17 0 -33 16.5t-16 33.5v1205q0 247 -179.5 415t-428.5 168t-428.5 -168t-179.5 -415v-1205q0 -50 -60 -50q-17 0 -33 16.5t-16 33.5v1216q0 289 215.5 485.5t504.5 196.5t501.5 -199t212.5 -483v-1216z" />
+<glyph unicode="&#x22c3;" horiz-adv-x="1704" d="M1569 280q0 -284 -212.5 -483t-501.5 -199t-504.5 196.5t-215.5 485.5v1216q0 17 16 33.5t33 16.5q60 0 60 -50v-1205q0 -247 179.5 -415t428.5 -168t428.5 168t179.5 415v1205q0 17 16 33.5t33 16.5q60 0 60 -50v-1216z" />
+<glyph unicode="&#x22c4;" horiz-adv-x="738" d="M712 582l-343 -343l-343 343l343 343zM571 582l-202 202l-202 -202l202 -202z" />
+<glyph unicode="&#x22c5;" horiz-adv-x="460" d="M420 582q0 -79 -55.5 -134.5t-134.5 -55.5t-134.5 55.5t-55.5 134.5t55.5 134.5t134.5 55.5t134.5 -55.5t55.5 -134.5z" />
+<glyph unicode="&#x22c6;" horiz-adv-x="1208" d="M1168 766l-349 -255l133 -408l-348 253l-348 -253l133 408l-349 255h431l133 408l133 -408h431z" />
+<glyph unicode="&#x22c7;" horiz-adv-x="1591" d="M875 1109.5q34 -33.5 34 -80t-33.5 -79.5t-80.5 -33t-80.5 33t-33.5 79.5t34 80t80 33.5t80 -33.5zM1421 582q0 -41 -37 -41h-490l417 -417q10 -10 10 -24q0 -44 -43 -44q-15 0 -25 10l-458 458l-456 -456q-11 -11 -27 -11q-42 0 -42 42q0 16 11 27l416 415h-488 q-39 0 -39 41t39 41h488l-416 415q-11 11 -11 27q0 42 42 42q16 0 27 -11l456 -456l458 458q10 10 25 10q43 0 43 -44q0 -14 -10 -24l-417 -417h490q37 0 37 -41zM875.5 214q33.5 -33 33.5 -79.5t-34 -80t-80 -33.5t-80 33.5t-34 80t33.5 79.5t80.5 33t80.5 -33z" />
+<glyph unicode="&#x22c8;" horiz-adv-x="1591" d="M1290 127q0 -39 -41 -39q-15 0 -30 15l-422 422l-424 -422q-15 -15 -31 -15q-41 0 -41 39v912q0 37 41 37q18 0 31 -13l424 -424l422 424q13 13 30 13q41 0 41 -37v-912zM1208 228v708l-354 -354zM737 582l-354 354v-708z" />
+<glyph unicode="&#x22c9;" horiz-adv-x="1591" d="M1290 129q0 -41 -41 -41q-15 0 -30 15l-422 422l-424 -422q-15 -15 -31 -15q-41 0 -41 39v912q0 37 41 37q18 0 31 -13l424 -424l422 424q13 13 30 13q41 0 41 -41q0 -17 -10 -27l-426 -426l426 -424q10 -10 10 -29zM737 582l-354 354v-708z" />
+<glyph unicode="&#x22ca;" horiz-adv-x="1591" d="M1290 127q0 -39 -41 -39q-15 0 -30 15l-422 422l-424 -422q-15 -15 -31 -15q-41 0 -41 41q0 19 10 29l426 424l-426 426q-10 10 -10 27q0 41 41 41q18 0 31 -13l424 -424l422 424q13 13 30 13q41 0 41 -37v-912zM1208 228v708l-354 -354z" />
+<glyph unicode="&#x22cb;" horiz-adv-x="1591" d="M1477 -4q0 -41 -41 -41q-20 0 -31 12l-608 660l-611 -660q-11 -12 -30 -12q-41 0 -41 41q0 18 10 29l614 663l-614 666q-10 11 -10 26q0 41 41 41q19 0 30 -12l1280 -1384q11 -12 11 -29z" />
+<glyph unicode="&#x22cc;" horiz-adv-x="1591" d="M1477 -4q0 -41 -41 -41q-20 0 -31 12l-608 660l-611 -660q-11 -12 -30 -12q-41 0 -41 41q0 18 10 29l1280 1384q11 12 31 12q41 0 41 -41q0 -14 -11 -26l-614 -666l614 -663q11 -12 11 -29z" />
+<glyph unicode="&#x22cd;" horiz-adv-x="1591" d="M1477 726q0 -63 -29 -63q-24 0 -28 43.5t-23 116.5q-33 80 -104 130t-156 50q-111 0 -235 -88l-207 -164q-125 -88 -240 -88q-149 0 -244.5 119.5t-95.5 271.5q0 63 28 63q24 0 29 -51q9 -90 38 -142q83 -147 245 -147q113 0 236 88l208 164q124 88 238 88 q148 0 244 -119.5t96 -271.5zM1477 282q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x22ce;" horiz-adv-x="1556" d="M1384 1143q0 -35 -38 -41q-120 -19 -198 -64t-140 -141q-117 -181 -153 -419t-36 -486q0 -37 -41 -37t-41 37q0 420 -87 696q-53 168 -156 276.5t-285 137.5q-16 3 -27.5 14.5t-11.5 26.5q0 41 45 41q24 0 77 -12q194 -44 313 -215q126 -185 173 -449q71 384 280 561 q97 82 227 107q41 8 54 8q45 0 45 -41z" />
+<glyph unicode="&#x22cf;" horiz-adv-x="1556" d="M1384 -4q0 -41 -45 -41q-20 0 -76 13q-189 44 -301 201q-133 187 -184 462q-49 -276 -182 -462q-112 -157 -304 -201q-57 -13 -77 -13q-45 0 -45 41q0 16 11 27t28 14q181 30 284.5 139t156.5 275q87 274 87 696q0 37 41 37t41 -37q0 -248 36 -485t149.5 -412.5 t341.5 -212.5q38 -6 38 -41z" />
+<glyph unicode="&#x22d0;" horiz-adv-x="1591" d="M1421 41q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h584q39 0 39 -41zM1411 329q0 -38 -39 -38h-555q-129 0 -230 82.5t-101 208.5t101 208.5t230 82.5 h555q39 0 39 -38t-39 -38h-552q-97 0 -175 -60.5t-78 -154.5t78 -154.5t175 -60.5h552q39 0 39 -38z" />
+<glyph unicode="&#x22d1;" horiz-adv-x="1591" d="M1421 582q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41t39 41h584q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5zM1105 582q0 -126 -101 -208.5t-230 -82.5h-555q-39 0 -39 38t39 38h552 q97 0 175 60.5t78 154.5t-78 154.5t-175 60.5h-552q-39 0 -39 38t39 38h555q129 0 230 -82.5t101 -208.5z" />
+<glyph unicode="&#x22d2;" horiz-adv-x="1364" d="M1249 389q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v799q0 37 41 37t41 -37v-793q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v793q0 37 41 37t41 -37v-799zM965 537q0 -108 -86 -172.5t-197.5 -64.5t-197.5 64.5t-86 172.5 v639q0 39 38 39t38 -39v-636q0 -74 65 -116.5t143.5 -42.5t143 42t64.5 117v636q0 39 37.5 39t37.5 -39v-639z" />
+<glyph unicode="&#x22d3;" horiz-adv-x="1364" d="M1249 -8q0 -37 -41 -37t-41 37v792q0 171 -163 273q-140 86 -322.5 86t-321.5 -87q-163 -101 -163 -272v-792q0 -37 -41 -37t-41 37v799q0 202 189 326q164 108 378 108t379 -107q188 -124 188 -327v-799zM965 4q0 -39 -37.5 -39t-37.5 39v636q0 75 -64.5 117t-143 42 t-143.5 -42.5t-65 -116.5v-636q0 -39 -38 -39t-38 39v639q0 108 86 172.5t197.5 64.5t197.5 -64.5t86 -172.5v-639z" />
+<glyph unicode="&#x22d4;" horiz-adv-x="1364" d="M1249 -8q0 -37 -41 -37t-41 37v792q0 161 -145 261q-125 85 -299 97v-998q0 -62 -41 -62t-41 62v998q-175 -12 -299 -97q-145 -100 -145 -261v-792q0 -37 -41 -37t-41 37v799q0 192 171 314q149 107 355 119v197q0 61 41 61t41 -61v-197q206 -12 355 -118 q171 -122 171 -315v-799z" />
+<glyph unicode="&#x22d5;" horiz-adv-x="1024" d="M912 382q0 -41 -61 -41h-99v-746q0 -37 -41 -37t-41 37v746h-316v-746q0 -37 -41 -37t-41 37v746h-104q-56 0 -56 41t62 41h98v318h-104q-56 0 -56 41t62 41h98v746q0 37 41 37t41 -37v-746h316v746q0 37 41 37t41 -37v-746h99q61 0 61 -41t-61 -41h-99v-318h99 q61 0 61 -41zM670 423v318h-316v-318h316z" />
+<glyph unicode="&#x22d6;" horiz-adv-x="1591" d="M1335.5 661.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37z" />
+<glyph unicode="&#x22d7;" horiz-adv-x="1591" d="M414.5 661.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37z" />
+<glyph unicode="&#x22d8;" horiz-adv-x="2831" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM2041 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37 l-1090 -514l1090 -514q24 -11 24 -37zM2661 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37z" />
+<glyph unicode="&#x22d9;" horiz-adv-x="2831" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM2041 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514 q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM2661 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37z" />
+<glyph unicode="&#x22da;" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 800q0 -45 -39 -45q-6 0 -15 3l-1170 384q-27 9 -27 39t27 39l1170 384q6 2 13 2q41 0 41 -41q0 -31 -25 -39l-1051 -345l1051 -345q25 -8 25 -36zM1421 -16q0 -30 -27 -39l-1170 -384 q-9 -3 -15 -3q-39 0 -39 45q0 28 25 36l1051 345l-1051 345q-25 8 -25 39q0 41 41 41q7 0 13 -2l1170 -384q27 -9 27 -39z" />
+<glyph unicode="&#x22db;" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 1181q0 -30 -27 -39l-1170 -384q-9 -3 -15 -3q-39 0 -39 45q0 28 25 36l1051 345l-1051 345q-25 8 -25 39q0 41 41 41q7 0 13 -2l1170 -384q27 -9 27 -39zM1421 -397q0 -45 -39 -45q-6 0 -15 3 l-1170 384q-27 9 -27 39t27 39l1170 384q6 2 13 2q41 0 41 -41q0 -31 -25 -39l-1051 -345l1051 -345q25 -8 25 -36z" />
+<glyph unicode="&#x22dc;" horiz-adv-x="1591" d="M1421 -259q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1421 1133q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x22dd;" horiz-adv-x="1591" d="M1421 292q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 1133q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x22de;" horiz-adv-x="1591" d="M1421 35q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-268 78 -704 78q-39 0 -39 41t39 41q436 0 706 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295 q12 -52 12 -75zM1194 1439q0 -144 -112 -280q-136 -165 -397 -245q-213 -65 -470 -65q-45 0 -45 41t39 41q325 0 573 107q136 59 221.5 155t108.5 252q7 37 41 37q41 0 41 -43z" />
+<glyph unicode="&#x22df;" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41q-267 0 -500 -31.5t-415.5 -142.5t-216.5 -338q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37q35 -232 215 -342t418 -142t499 -32q37 0 37 -41zM1421 890 q0 -41 -43 -41q-257 0 -469 65q-259 80 -397 245q-85 102 -109 237q-6 34 -6 43q0 43 41 43q35 0 41 -37q26 -157 110.5 -252t221.5 -155q247 -107 573 -107q37 0 37 -41z" />
+<glyph unicode="&#x22e0;" horiz-adv-x="1591" d="M1421 35q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-100 29 -213 47l-38 -253q278 -80 420 -252q112 -136 112 -280q0 -43 -41 -43q-34 0 -41 37q-23 156 -104 247q-123 138 -359 208l-75 -498q-6 -35 -40 -35q-43 0 -43 36q0 5 1 11l77 507 q-167 38 -360 38q-39 0 -39 41t45 41q194 0 367 -38l37 244q-168 20 -410 20q-39 0 -39 41t39 41q252 0 429 23l81 536q6 35 40 35q43 0 43 -36q0 -5 -1 -11l-78 -511q101 17 192 44q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297 q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295q12 -53 12 -75z" />
+<glyph unicode="&#x22e1;" horiz-adv-x="1591" d="M1421 274q0 -41 -37 -41q-238 0 -435 -57l-75 -500q-6 -35 -40 -35q-43 0 -43 36q0 5 1 11l70 459q-176 -67 -277 -181q-80 -90 -106 -247q-6 -37 -41 -37q-41 0 -41 43q0 9 6 43q24 135 109 237q129 154 364 234l42 275l-30 -4q-234 -31 -418 -142.5t-218 -338.5 q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37q35 -232 211 -339q193 -118 475 -152l81 534q6 35 40 35q43 0 43 -36q0 -5 -1 -11l-81 -530q176 -17 364 -17q37 0 37 -41t-37 -41 q-202 0 -382 -18l-39 -258q192 50 415 50q43 0 43 -41z" />
+<glyph unicode="&#x22e2;" horiz-adv-x="1591" d="M1421 -148q0 -41 -37 -41h-809l-53 -147q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l43 119h-278q-39 0 -39 41t39 41h308l101 277h-409q-39 0 -39 37v1090q0 37 39 37h833l61 167q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-51 -139h255q37 0 37 -41t-37 -41h-284l-364 -1000 h648q37 0 37 -41t-37 -41h-678l-101 -277h779q37 0 37 -41zM252 1252v-1000h396l364 1000h-760z" />
+<glyph unicode="&#x22e3;" horiz-adv-x="1591" d="M1421 -148q0 -41 -37 -41h-809l-53 -147q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l43 119h-278q-39 0 -39 41t39 41h308l101 277h-411q-37 0 -37 41t37 41h441l364 1000h-805q-37 0 -37 41t37 41h835l61 167q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-51 -139h253 q39 0 39 -37v-1090q0 -37 -39 -37h-676l-101 -277h779q37 0 37 -41zM1339 252v1000h-239l-364 -1000h603z" />
+<glyph unicode="&#x22e4;" horiz-adv-x="1591" d="M1421 141q0 -41 -37 -41h-1175q-39 0 -39 37v1090q0 37 39 37h1175q37 0 37 -41t-37 -41h-1132v-1000h1132q37 0 37 -41zM1421 -218q0 -41 -37 -41h-549l-283 -164q-26 -15 -43 -15q-38 0 -38 41q0 23 40 46l160 92h-462q-39 0 -39 41t39 41h604l284 164q26 15 42 15 q38 0 38 -41q0 -22 -39 -45l-161 -93h407q37 0 37 -41z" />
+<glyph unicode="&#x22e5;" horiz-adv-x="1591" d="M1421 137q0 -37 -39 -37h-1175q-37 0 -37 41t37 41h1132v1000h-1132q-37 0 -37 41t37 41h1175q39 0 39 -37v-1090zM1421 -218q0 -41 -37 -41h-549l-283 -164q-26 -15 -43 -15q-38 0 -38 41q0 23 40 46l160 92h-462q-39 0 -39 41t39 41h604l284 164q26 15 42 15 q38 0 38 -41q0 -22 -39 -45l-161 -93h407q37 0 37 -41z" />
+<glyph unicode="&#x22e6;" horiz-adv-x="1591" d="M1421 331q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1477 46q0 -152 -96 -271.5t-244 -119.5q-92 0 -185 54q-56 32 -159 118l-324 -259q-13 -10 -26 -10q-42 0 -42 43 q0 18 16 31l311 248q-148 115 -273 115q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q93 0 168 -43t177 -128l322 258q13 9 26 9q42 0 42 -42q0 -18 -16 -31l-309 -247q149 -116 272 -116q85 0 156 50t104 130q15 36 21 98 t30 62q29 0 29 -63z" />
+<glyph unicode="&#x22e7;" horiz-adv-x="1591" d="M1421 882q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1477 46q0 -152 -96 -271.5t-244 -119.5q-92 0 -185 54q-56 32 -159 118l-324 -259q-13 -10 -26 -10 q-42 0 -42 43q0 18 16 31l311 248q-148 115 -273 115q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q93 0 168 -43t177 -128l322 258q13 9 26 9q42 0 42 -42q0 -18 -16 -31l-309 -247q149 -116 272 -116q85 0 156 50 t104 130q15 36 21 98t30 62q29 0 29 -63z" />
+<glyph unicode="&#x22e8;" horiz-adv-x="1591" d="M1421 335q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-268 78 -704 78q-39 0 -39 41t39 41q436 0 706 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295 q12 -52 12 -75zM1477 46q0 -152 -96 -271.5t-244 -119.5q-92 0 -185 54q-56 32 -159 118l-324 -259q-13 -10 -26 -10q-42 0 -42 43q0 18 16 31l311 248q-148 115 -273 115q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5 q93 0 168 -43t177 -128l322 258q13 9 26 9q42 0 42 -42q0 -18 -16 -31l-309 -247q149 -116 272 -116q85 0 156 50t104 130q15 36 21 98t30 62q29 0 29 -63z" />
+<glyph unicode="&#x22e9;" horiz-adv-x="1591" d="M1421 882q0 -41 -37 -41q-267 0 -500 -31.5t-415.5 -142.5t-216.5 -338q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37q35 -232 215 -342t418 -142t499 -32q37 0 37 -41zM1477 46 q0 -152 -96 -271.5t-244 -119.5q-92 0 -185 54q-56 32 -159 118l-324 -259q-13 -10 -26 -10q-42 0 -42 43q0 18 16 31l311 248q-148 115 -273 115q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q93 0 168 -43t177 -128 l322 258q13 9 26 9q42 0 42 -42q0 -18 -16 -31l-309 -247q149 -116 272 -116q85 0 156 50t104 130q15 36 21 98t30 62q29 0 29 -63z" />
+<glyph unicode="&#x22ea;" horiz-adv-x="1591" d="M1421 25q0 -37 -41 -37q-10 0 -14 2l-735 348l-290 -502q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l286 496l-359 170q-27 13 -27 39t20 35l697 329l221 383q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-162 -281l349 165q4 2 14 2q41 0 41 -37v-1112zM1339 93v976 l-394 -186l-273 -474zM815 822l-508 -240l290 -138z" />
+<glyph unicode="&#x22eb;" horiz-adv-x="1591" d="M1421 582q0 -26 -18 -35l-704 -334l-218 -377q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l159 275l-342 -162q-4 -2 -16 -2q-41 0 -41 37v1112q0 37 41 37q12 0 16 -2l731 -346l290 503q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-287 -497l365 -172q24 -11 24 -37z M1284 582l-293 138l-220 -381zM917 755l-665 314v-976l389 184z" />
+<glyph unicode="&#x22ec;" horiz-adv-x="1591" d="M1421 -118q0 -41 -37 -41h-898l-64 -177q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l54 149h-189q-39 0 -39 41t39 41h219l221 606l-452 214q-27 13 -27 39t20 35l681 321l132 363q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-104 -285l390 184q4 2 14 2q41 0 41 -37v-1112 q0 -37 -41 -37q-10 0 -14 2l-642 304l-208 -571h868q37 0 37 -41zM1339 293v976l-402 -190l-185 -508zM831 1029l-524 -247l370 -175z" />
+<glyph unicode="&#x22ed;" horiz-adv-x="1591" d="M1421 -118q0 -41 -37 -41h-898l-64 -177q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l54 149h-189q-39 0 -39 41t39 41h219l160 438l-361 -171q-4 -2 -16 -2q-41 0 -41 37v1112q0 37 41 37q12 0 16 -2l622 -294l154 423q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-156 -430 l473 -224q24 -11 24 -37t-18 -35l-709 -336l-178 -488h868q37 0 37 -41zM1284 782l-389 183l-161 -444zM821 1001l-569 268v-976l376 178z" />
+<glyph unicode="&#x22ee;" horiz-adv-x="682" d="M420.5 -25.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM420 1347.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM420 660.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5z" />
+<glyph unicode="&#x22ef;" d="M1103 660.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM420.5 661.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1786 660.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5z" />
+<glyph unicode="&#x22f0;" d="M420.5 -25.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1786 1347.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM1103 660.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5z" />
+<glyph unicode="&#x22f1;" d="M421 1348.5q33 -32.5 33 -79t-33.5 -80t-79 -33.5t-79.5 33.5t-34 79t34 79t80 33.5t79 -32.5zM1104 661.5q33 -32.5 33 -79t-33.5 -80t-79 -33.5t-79.5 33.5t-34 79t34 79t80 33.5t79 -32.5zM1820 -105q0 -47 -33 -80t-80 -33t-80 33t-33 79.5t33.5 80t80 33.5t79.5 -33 t33 -80z" />
+<glyph unicode="&#x22f2;" horiz-adv-x="1634" d="M1464 41q0 -41 -37 -41h-294q-242 0 -423.5 153t-198.5 388h-304q-37 0 -37 41t37 41h304q17 235 198.5 388t423.5 153h294q37 0 37 -41t-37 -41h-288q-201 0 -373 -132t-172 -327h833q37 0 37 -41t-37 -41h-833q0 -195 172 -327t373 -132h288q37 0 37 -41z" />
+<glyph unicode="&#x22f3;" horiz-adv-x="1364" d="M1194 41q0 -41 -37 -41h-364q-253 0 -438 166t-185 416t185 416t438 166h364q37 0 37 -41t-37 -41h-358q-201 0 -373 -132t-172 -327h858v247q0 37 41 37t41 -37v-574q0 -39 -41 -39t-41 39v245h-858q0 -195 172 -327t373 -132h358q37 0 37 -41z" />
+<glyph unicode="&#x22f4;" horiz-adv-x="1164" d="M994 41q0 -41 -37 -41h-293q-201 0 -347.5 132t-146.5 330t146.5 330t347.5 132h293q37 0 37 -41t-37 -41h-293q-158 0 -275.5 -96.5t-134.5 -242.5h658v187q0 37 41 37t41 -37v-454q0 -39 -41 -39t-41 39v185h-658q17 -146 134.5 -242.5t275.5 -96.5h293q37 0 37 -41z " />
+<glyph unicode="&#x22f5;" horiz-adv-x="1364" d="M1194 41q0 -41 -37 -41h-364q-253 0 -438 166t-185 416t185 416t438 166h364q37 0 37 -41t-37 -41h-358q-201 0 -373 -132t-172 -327h903q37 0 37 -41t-37 -41h-903q0 -195 172 -327t373 -132h358q37 0 37 -41zM880.5 1572.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33 t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x22f6;" horiz-adv-x="1364" d="M1194 41q0 -41 -37 -41h-364q-253 0 -438 166t-185 416t185 416t438 166h364q37 0 37 -41t-37 -41h-358q-201 0 -373 -132t-172 -327h903q37 0 37 -41t-37 -41h-903q0 -195 172 -327t373 -132h358q37 0 37 -41zM1194 1482q0 -41 -37 -41h-948q-39 0 -39 41t39 41h948 q37 0 37 -41z" />
+<glyph unicode="&#x22f7;" horiz-adv-x="1164" d="M994 41q0 -41 -37 -41h-293q-201 0 -347.5 132t-146.5 330t146.5 330t347.5 132h293q37 0 37 -41t-37 -41h-293q-158 0 -275.5 -96.5t-134.5 -242.5h703q37 0 37 -41t-37 -41h-703q17 -146 134.5 -242.5t275.5 -96.5h293q37 0 37 -41zM994 1185q0 -41 -37 -41h-748 q-39 0 -39 41t39 41h748q37 0 37 -41z" />
+<glyph unicode="&#x22f8;" horiz-adv-x="1364" d="M1194 41q0 -41 -37 -41h-364q-253 0 -438 166t-185 416t185 416t438 166h364q37 0 37 -41t-37 -41h-358q-201 0 -373 -132t-172 -327h903q37 0 37 -41t-37 -41h-903q0 -195 172 -327t373 -132h358q37 0 37 -41zM1194 -318q0 -41 -37 -41h-948q-39 0 -39 41t39 41h948 q37 0 37 -41z" />
+<glyph unicode="&#x22f9;" horiz-adv-x="1364" d="M1194 41q0 -41 -37 -41h-364q-253 0 -438 166t-185 416t185 416t438 166h364q37 0 37 -41t-37 -41h-364q-164 0 -302 -84t-200 -225h866q37 0 37 -41t-37 -41h-893q-12 -53 -12 -109t12 -109h893q37 0 37 -41t-37 -41h-866q62 -141 200 -225t302 -84h364q37 0 37 -41z " />
+<glyph unicode="&#x22fa;" horiz-adv-x="1634" d="M1464 582q0 -41 -37 -41h-304q-17 -235 -198.5 -388t-423.5 -153h-294q-37 0 -37 41t37 41h288q201 0 373 132t172 327h-833q-37 0 -37 41t37 41h833q0 195 -172 327t-373 132h-288q-37 0 -37 41t37 41h294q242 0 423.5 -153t198.5 -388h304q37 0 37 -41z" />
+<glyph unicode="&#x22fb;" horiz-adv-x="1364" d="M1194 582q0 -250 -185 -416t-438 -166h-364q-37 0 -37 41t37 41h358q201 0 373 132t172 327h-858v-245q0 -39 -41 -39t-41 39v574q0 37 41 37t41 -37v-247h858q0 195 -172 327t-373 132h-358q-37 0 -37 41t37 41h364q253 0 438 -166t185 -416z" />
+<glyph unicode="&#x22fc;" horiz-adv-x="1164" d="M994 462q0 -198 -146.5 -330t-347.5 -132h-293q-37 0 -37 41t37 41h293q158 0 275.5 96.5t134.5 242.5h-658v-185q0 -39 -41 -39t-41 39v454q0 37 41 37t41 -37v-187h658q-17 146 -134.5 242.5t-275.5 96.5h-293q-37 0 -37 41t37 41h293q201 0 347.5 -132t146.5 -330z " />
+<glyph unicode="&#x22fd;" horiz-adv-x="1364" d="M1194 582q0 -250 -185 -416t-438 -166h-364q-37 0 -37 41t37 41h358q201 0 373 132t172 327h-903q-37 0 -37 41t37 41h903q0 195 -172 327t-373 132h-358q-37 0 -37 41t37 41h364q253 0 438 -166t185 -416zM1194 1482q0 -41 -39 -41h-948q-37 0 -37 41t37 41h948 q39 0 39 -41z" />
+<glyph unicode="&#x22fe;" horiz-adv-x="1164" d="M994 462q0 -198 -146.5 -330t-347.5 -132h-293q-37 0 -37 41t37 41h293q158 0 275.5 96.5t134.5 242.5h-703q-37 0 -37 41t37 41h703q-17 146 -134.5 242.5t-275.5 96.5h-293q-37 0 -37 41t37 41h293q201 0 347.5 -132t146.5 -330zM994 1185q0 -41 -39 -41h-748 q-37 0 -37 41t37 41h748q39 0 39 -41z" />
+<glyph unicode="&#x22ff;" horiz-adv-x="1547" d="M1377 41q0 -41 -39 -41h-1131q-37 0 -37 39v1345q0 37 37 37h1131q39 0 39 -41t-39 -41h-1086v-587h1060q37 0 37 -41t-37 -41h-1060v-588h1086q39 0 39 -41z" />
+<glyph unicode="&#x2300;" horiz-adv-x="1591" d="M1477 1159q0 -19 -11 -29l-192 -167q125 -164 125 -365q0 -249 -176.5 -426.5t-425 -177.5t-426.5 176l-185 -162q-16 -14 -30 -14q-41 0 -41 43q0 17 10 26l192 168q-122 162 -122 367q0 249 176.5 425.5t422 176.5t427.5 -176l184 162q16 14 31 14q41 0 41 -41z M1159 969q-151 149 -364 149t-366 -152.5t-153 -367.5q0 -178 103 -311zM1317 598q0 173 -105 309l-780 -682q153 -147 366 -147t366 153t153 367z" />
+<glyph unicode="&#x2301;" horiz-adv-x="2176" d="M2068 230q0 -41 -41 -41q-16 0 -26 10l-872 896v-869q0 -39 -41 -39q-19 0 -29 10l-939 965q-12 12 -12 31q0 41 41 41q16 0 26 -10l872 -895v868q0 39 41 39q19 0 29 -10l939 -965q12 -12 12 -31z" />
+<glyph unicode="&#x2302;" horiz-adv-x="1628" d="M1368 0h-1108v761l553 623l555 -623v-761zM1271 97v623l-458 512l-456 -512v-623h914z" />
+<glyph unicode="&#x2303;" horiz-adv-x="1235" d="M1095 1029q0 -18 -23 -18q-2 0 -6 2q-124 27 -251.5 122.5t-196.5 208.5q-69 -112 -197 -208t-252 -123q-4 -2 -6 -2q-23 0 -23 18v45q0 14 15 19q172 38 293.5 169t146.5 306q3 18 22.5 18t22.5 -18q25 -175 146.5 -306t293.5 -169q15 -5 15 -19v-45z" />
+<glyph unicode="&#x2304;" horiz-adv-x="1235" d="M1095 123q0 -14 -15 -19q-172 -38 -293.5 -169t-146.5 -306q-3 -18 -22.5 -18t-22.5 18q-25 175 -146.5 306t-293.5 169q-15 5 -15 19v45q0 18 23 18q2 0 6 -2q124 -27 252 -123t197 -208q69 113 196.5 208.5t251.5 122.5q4 2 6 2q23 0 23 -18v-45z" />
+<glyph unicode="&#x2305;" horiz-adv-x="1235" d="M1095 230q0 -18 -23 -18q-2 0 -6 2q-124 27 -251.5 122.5t-196.5 208.5q-69 -112 -197 -208t-252 -123q-4 -2 -6 -2q-23 0 -23 18v45q0 14 15 19q172 38 293.5 169t146.5 306q3 18 22.5 18t22.5 -18q25 -175 146.5 -306t293.5 -169q15 -5 15 -19v-45zM1141 1023 q0 -41 -68 -41h-910q-68 0 -68 41t68 41h910q68 0 68 -41z" />
+<glyph unicode="&#x2306;" horiz-adv-x="1235" d="M1141 1023q0 -41 -68 -41h-910q-68 0 -68 41t68 41h910q68 0 68 -41zM1095 230q0 -18 -23 -18q-2 0 -6 2q-124 27 -251.5 122.5t-196.5 208.5q-69 -112 -197 -208t-252 -123q-4 -2 -6 -2q-23 0 -23 18v45q0 14 15 19q172 38 293.5 169t146.5 306q3 18 22.5 18t22.5 -18 q25 -175 146.5 -306t293.5 -169q15 -5 15 -19v-45zM1141 1423q0 -41 -68 -41h-910q-68 0 -68 41t68 41h910q68 0 68 -41z" />
+<glyph unicode="&#x2307;" horiz-adv-x="810" d="M604 270q12 -12 12 -30.5t-12 -30.5l-310 -303l136 -136q16 -16 16 -32v-115q0 -39 -41 -39t-41 39v96l-158 156q-12 12 -12 30.5t12 30.5l310 303l-310 304q-12 12 -12 30.5t12 30.5l310 303l-310 303q-12 12 -12 31t12 31l158 155v94q0 39 41 39t41 -39v-112 q0 -17 -16 -33l-136 -135l310 -303q12 -12 12 -31t-12 -31l-310 -303z" />
+<glyph unicode="&#x2308;" horiz-adv-x="909" d="M864 1565q0 -41 -37 -41h-389v-1929q0 -37 -41 -37t-41 37v1974q0 37 39 37h432q37 0 37 -41z" />
+<glyph unicode="&#x2309;" horiz-adv-x="909" d="M551 -405q0 -37 -41 -37t-41 37v1929h-389q-37 0 -37 41t37 41h434q37 0 37 -37v-1974z" />
+<glyph unicode="&#x230a;" horiz-adv-x="909" d="M864 -401q0 -41 -37 -41h-432q-39 0 -39 37v1974q0 37 41 37t41 -37v-1929h389q37 0 37 -41z" />
+<glyph unicode="&#x230b;" horiz-adv-x="909" d="M551 -405q0 -37 -37 -37h-434q-37 0 -37 41t37 41h389v1929q0 37 41 37t41 -37v-1974z" />
+<glyph unicode="&#x230c;" horiz-adv-x="1024" d="M907 1380q0 -41 -37 -41h-673v-673q0 -39 -41 -39t-41 39v718q0 37 37 37h718q37 0 37 -41z" />
+<glyph unicode="&#x230d;" horiz-adv-x="1024" d="M907 666q0 -39 -41 -39t-41 39v673h-673q-37 0 -37 41t37 41h718q37 0 37 -37v-718z" />
+<glyph unicode="&#x230e;" horiz-adv-x="1024" d="M907 -4q0 -41 -37 -41h-718q-37 0 -37 37v719q0 39 41 39t41 -39v-674h673q37 0 37 -41z" />
+<glyph unicode="&#x230f;" horiz-adv-x="1024" d="M907 -8q0 -37 -37 -37h-718q-37 0 -37 41t37 41h673v674q0 39 41 39t41 -39v-719z" />
+<glyph unicode="&#x2310;" horiz-adv-x="1591" d="M1421 688q0 -41 -39 -41h-1013v-428q0 -37 -41 -37t-41 37v473q0 37 37 37h1058q39 0 39 -41z" />
+<glyph unicode="&#x2311;" horiz-adv-x="1036" d="M814 296h-592v592h592v-592zM715 395v394h-394v-394h394z" />
+<glyph unicode="&#x2312;" horiz-adv-x="1574" d="M1496 582q0 -67 -35.5 -67t-35.5 67q0 266 -186 452t-452 186t-452 -186t-186 -452q0 -67 -35.5 -67t-35.5 67q0 296 206.5 502t502.5 206t502.5 -206t206.5 -502z" />
+<glyph unicode="&#x2313;" horiz-adv-x="1574" d="M1496 582q0 -41 -68 -41h-1282q-68 0 -68 41q0 296 206.5 502t502.5 206t502.5 -206t206.5 -502zM787 1220q-255 0 -438 -172.5t-199 -424.5h1274q-16 252 -199 424.5t-438 172.5z" />
+<glyph unicode="&#x2314;" horiz-adv-x="1574" d="M1431 859q0 -24 -49 -47l-595 -278l-595 278q-49 23 -49 47q0 8 5 19q88 188 260 299t379 111t379 -111t260 -299q5 -11 5 -19zM787 1217q-174 0 -323 -89.5t-233 -243.5l556 -259l556 259q-84 154 -233 243.5t-323 89.5z" />
+<glyph unicode="&#x2315;" horiz-adv-x="1148" d="M926 592q0 -147 -102.5 -249.5t-249.5 -102.5q-116 0 -206 65l-264 -264q-31 -31 -50 -31q-39 0 -39 39q0 19 31 50l262 262q-86 98 -86 238t102.5 242.5t249.5 102.5t249.5 -102.5t102.5 -249.5zM753 413q74 74 74 179.5t-73.5 179.5t-179.5 74t-179.5 -74t-73.5 -179.5 t74 -179.5t179 -74t179 74z" />
+<glyph unicode="&#x2316;" horiz-adv-x="1155" d="M1115 640h-189q-13 -121 -101.5 -208.5t-209.5 -99.5v-191h-80v191q-120 13 -208 100.5t-101 207.5h-189v82h189q12 121 100 209t209 101v187h80v-187q121 -12 209.5 -100.5t101.5 -209.5h189v-82zM615 722h211q-12 80 -71.5 140t-139.5 71v-211zM535 722v211 q-80 -12 -138.5 -71.5t-70.5 -139.5h209zM615 640v-208q79 11 138.5 70t72.5 138h-211zM535 640h-209q13 -79 71.5 -137.5t137.5 -70.5v208z" />
+<glyph unicode="&#x2317;" horiz-adv-x="1155" d="M1116 375h-234v-235h-82v235h-444v-235h-82v235h-237v82h237v444h-237v82h237v236h82v-236h444v236h82v-236h234v-82h-234v-444h234v-82zM800 457v444h-444v-444h444z" />
+<glyph unicode="&#x2318;" horiz-adv-x="1155" d="M1077 479.5q64 -64.5 64 -155t-64 -154.5t-154.5 -64t-154.5 64t-64 155v136h-253v-136q0 -90 -64.5 -154.5t-154.5 -64.5t-154 64t-64 154.5t64 155t154 64.5h137v252h-137q-90 0 -154 64.5t-64 155t64 154.5t154.5 64t154.5 -64t64 -155v-136h253v136q0 91 64 155 t154.5 64t154.5 -64t64 -154.5t-64 -155t-154 -64.5h-137v-252h137q90 0 154 -64.5zM1059 1015q0 56 -40 96.5t-96.5 40.5t-96.5 -40t-40 -97v-136h137q56 0 96 40t40 96zM704 544v252h-253v-252h253zM1059 325q0 56 -40 96t-96 40h-137v-136q0 -56 40.5 -96.5t96.5 -40.5 t96 40.5t40 96.5zM369 879v136q0 56 -40.5 96.5t-96.5 40.5t-96 -40.5t-40 -96.5t40 -96t96 -40h137zM369 325v136h-137q-56 0 -96 -40t-40 -96t40 -96.5t96 -40.5t96.5 40.5t40.5 96.5z" />
+<glyph unicode="&#x2319;" horiz-adv-x="1591" d="M1421 582q0 -41 -39 -41h-1058q-37 0 -37 37v473q0 37 41 37t41 -37v-428h1013q39 0 39 -41z" />
+<glyph unicode="&#x231a;" horiz-adv-x="1628" d="M1322 1175q209 -209 209 -507.5t-209 -507.5t-508 -209t-508 209t-209 507.5t209.5 507.5t508 209t507.5 -209zM1272.5 209.5q188.5 188.5 188.5 458t-188.5 458t-458 188.5t-458.5 -188.5t-189 -458t188.5 -458t458.5 -188.5t458.5 188.5zM1255 1108.5 q181 -181.5 181 -441t-181 -441t-441 -181.5t-441 181.5t-181 440.5t181.5 441t441 182t440.5 -181.5zM1423 657q11 0 11 10.5t-11 10.5h-39q-3 143 -70 266l33 19q9 5 4 14q-6 9 -15 4l-33 -19q-73 122 -195 194l20 34q5 9 -4 14t-14 -4l-20 -33q-123 68 -265 70l-1 40 q0 10 -10.5 10t-10.5 -10l1 -40q-143 -2 -266 -70l-20 33q-5 9 -14 4t-4 -14l20 -34q-122 -73 -195 -194l-33 19q-9 5 -14.5 -4t3.5 -14l34 -19q-68 -124 -71 -266h-39q-11 0 -11 -10.5t11 -10.5h39q3 -143 70 -266l-33 -19q-9 -5 -3.5 -14.5t14.5 -3.5l33 19 q73 -122 195 -195l-20 -33q-5 -9 4 -14.5t14 4.5l20 33q123 -68 266 -70l-1 -40q0 -10 10.5 -10t10.5 10l1 40q142 2 265 70l20 -33q5 -10 14 -4.5t4 14.5l-20 33q122 73 195 195l33 -19q9 -6 14.5 3.5t-3.5 14.5l-33 19q67 123 70 266h39zM1280 662h-164q-2 -76 -37 -142 l141 -81q4 -3 1.5 -7t-6.5 -2l-141 82q-39 -66 -104 -104l81 -142q3 -4 -1.5 -6.5t-6.5 1.5l-82 142q-66 -36 -142 -37v-165q0 -4 -5 -4t-5 4v165q-76 1 -142 37l-82 -142q-2 -4 -6.5 -1.5t-1.5 6.5l81 142q-46 27 -79 69q-25 -17 -142 -33l-24 -14q-5 3 -5 9l24 13l46 60 q27 33 54 47q-19 50 -20 103h-164q-4 0 -5 5q1 5 5 5h164q2 77 38 142l-142 82q-4 3 -2 7q3 4 7 2l142 -82q38 65 104 104l-82 141q-3 5 1.5 7.5t6.5 -2.5l82 -141q51 28 110 35q-4 59 -4 123.5t41 132.5q41 -68 41 -132.5t-4 -123.5q59 -7 110 -35l82 141q2 5 6.5 2.5 t1.5 -7.5l-81 -141q65 -39 104 -104l141 82q4 2 6.5 -2t-1.5 -7l-141 -82q35 -65 37 -142h164q4 0 4 -5t-4 -5zM1021.5 460q84.5 85 84.5 202.5t-73 199.5t-183 95q-6 -103 -27 -253q29 -5 29 -37q0 -37 -38 -37q-16 0 -26 9q-67 -58 -201 -157q87 -107 218.5 -107t216 85z M522 667q0 -54 18 -103q55 30 237 95q-1 4 -1 8q0 32 29 37q-21 150 -27 253q-110 -13 -183 -95t-73 -195z" />
+<glyph unicode="&#x231b;" horiz-adv-x="1354" d="M1254 -178q0 -242 -577 -242t-577 242v91q0 126 30 196t208.5 261t178.5 217.5t-180 213t-208.5 260.5t-28.5 222v82q0 221 577 221t577 -221v-82q0 -148 -28.5 -222t-208.5 -260.5t-180 -213t178.5 -217.5t208.5 -261t30 -196v-91zM1158 1407q0 66 -211 97 q-129 18 -270 18t-270 -18q-211 -31 -211 -97q0 -45 154 -85t327 -40t327 40t154 85zM1191 -158v76q0 110 -25.5 169t-209 248.5t-183.5 248t183 249.5t208.5 244t25.5 136v118q-182 -113 -513 -113t-513 113v-118q0 -83 25.5 -136t208.5 -244t183 -249.5t-183.5 -248 t-209 -248.5t-25.5 -169v-76q0 -78 62 -117q129 -81 452 -81t452 81q62 39 62 117zM677 959q184 0 376 122q-41 -67 -118 -151l-132 -139q-36 -39 -88 -109q-16 -31 -23 -88l-15 -107l-15 107q-7 57 -22 87t-85 105l-136 144q-77 84 -118 151q192 -122 376 -122zM677 -265 q-283 0 -448 83q17 64 113 124q18 11 114.5 60t172.5 98q22 22 48 87q26 -65 47.5 -86.5t145.5 -84.5t142 -74q96 -60 113 -124q-165 -83 -448 -83z" />
+<glyph unicode="&#x231c;" horiz-adv-x="1024" d="M907 1380q0 -41 -37 -41h-673v-673q0 -39 -41 -39t-41 39v718q0 37 37 37h718q37 0 37 -41z" />
+<glyph unicode="&#x231d;" horiz-adv-x="1024" d="M907 666q0 -39 -41 -39t-41 39v673h-673q-37 0 -37 41t37 41h718q37 0 37 -37v-718z" />
+<glyph unicode="&#x231e;" horiz-adv-x="1024" d="M907 -4q0 -41 -37 -41h-718q-37 0 -37 37v719q0 39 41 39t41 -39v-674h673q37 0 37 -41z" />
+<glyph unicode="&#x231f;" horiz-adv-x="1024" d="M907 -8q0 -37 -37 -37h-718q-37 0 -37 41t37 41h673v674q0 39 41 39t41 -39v-719z" />
+<glyph unicode="&#x2320;" horiz-adv-x="1329" d="M1329 889q0 -105 -108 -105q-46 0 -75.5 29.5t-29.5 75.5q0 95 95 107q-67 54 -167 54q-119 0 -177 -169q-30 -88 -51 -288t-21 -467v-568h-216v242q0 214 31.5 530t91.5 479q109 297 342 297q107 0 196 -58t89 -159zM0 1606zM1329 -442z" />
+<glyph unicode="&#x2321;" horiz-adv-x="1329" d="M582 1145l-3 209v252h216v-318q0 -304 -65 -748q-34 -232 -125 -382q-122 -200 -322 -200q-108 0 -195.5 57.5t-87.5 160.5q0 46 29.5 75.5t75.5 29.5q107 0 107 -105q0 -97 -97 -108q66 -53 168 -53q135 0 200 163q55 138 77 468t22 499zM0 1606zM1329 -442z" />
+<glyph unicode="&#x2322;" horiz-adv-x="1410" d="M1410 403q0 -23 -25 -23q-11 0 -19 10q-25 33 -79 95q-217 219 -582 219t-582 -219l-79 -95q-8 -10 -19 -10q-25 0 -25 23q0 8 5 16q115 172 302.5 269t397.5 97t397.5 -97t302.5 -269q5 -8 5 -16z" />
+<glyph unicode="&#x2323;" horiz-adv-x="1410" d="M1410 762q0 -8 -5 -16q-115 -172 -302.5 -269t-397.5 -97t-397.5 97t-302.5 269q-5 8 -5 16q0 23 25 23q11 0 19 -10q25 -33 79 -95q217 -219 582 -219t582 219l79 95q8 10 19 10q25 0 25 -23z" />
+<glyph unicode="&#x2324;" horiz-adv-x="1628" d="M1442 1023q0 -46 -73 -46h-390q-73 0 -73 46t73 46h390q73 0 73 -46zM722 1023q0 -46 -73 -46h-390q-73 0 -73 46t73 46h390q73 0 73 -46zM1297 230q0 -23 -28 -23h-3q-1 0 -5 2q-123 27 -249.5 121t-196.5 206q-71 -112 -198 -206q-121 -89 -255 -123h-2q-28 0 -28 23 v45q0 18 18 24q171 38 291.5 167.5t145.5 303.5q3 22 27 22t27 -22q25 -174 145.5 -303.5t291.5 -167.5q19 -6 19 -24v-45z" />
+<glyph unicode="&#x2325;" horiz-adv-x="1628" d="M1362 1023q0 -46 -73 -46h-320q-73 0 -73 46t73 46h320q73 0 73 -46zM1362 46q0 -46 -73 -46h-350q-50 0 -68 63l-260 914h-272q-73 0 -73 46t73 46h333q49 0 67 -63l261 -914h289q73 0 73 -46z" />
+<glyph unicode="&#x2326;" horiz-adv-x="2327" d="M1641 0h-1520q-54 0 -54 54v1220q0 52 54 52h1520q23 0 60 -38l569 -568q30 -30 30 -58t-30 -58l-569 -569q-35 -35 -60 -35zM173 1220v-1114h1463l556 556l-558 558h-1461zM1417 125q-15 -15 -35.5 -15t-54.5 34l-447 447l-447 -447q-34 -34 -54.5 -34t-35.5 15 t-15 35.5t34 54.5l447 447l-447 447q-34 34 -34 54.5t15 35.5t35.5 15t54.5 -34l447 -447l447 447q34 34 54.5 34t35.5 -15t15 -35.5t-34 -54.5l-447 -447l447 -447q34 -34 34 -54.5t-15 -35.5z" />
+<glyph unicode="&#x2327;" horiz-adv-x="1760" d="M1693 54q0 -54 -52 -54h-1520q-54 0 -54 54v1220q0 52 54 52h1520q52 0 52 -52v-1220zM1587 106v1114h-1414v-1114h1414zM1417 125q-15 -15 -35.5 -15t-54.5 34l-447 447l-447 -447q-34 -34 -54.5 -34t-35.5 15t-15 35.5t34 54.5l447 447l-447 447q-34 34 -34 54.5 t15 35.5t35.5 15t54.5 -34l447 -447l447 447q34 34 54.5 34t35.5 -15t15 -35.5t-34 -54.5l-447 -447l447 -447q34 -34 34 -54.5t-15 -35.5z" />
+<glyph unicode="&#x2328;" horiz-adv-x="2196" d="M2062 197q0 -83 -58.5 -141.5t-141.5 -58.5h-1528q-83 0 -141.5 58.5t-58.5 141.5v639q0 83 58.5 141.5t141.5 58.5h1528q83 0 141.5 -58.5t58.5 -141.5v-639zM1962 197v639q0 41 -29.5 70.5t-70.5 29.5h-1528q-41 0 -70.5 -29.5t-29.5 -70.5v-639q0 -41 29.5 -70.5 t70.5 -29.5h1528q41 0 70.5 29.5t29.5 70.5zM1726 757q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1846 627q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1476 757q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67 q34 0 34 -34v-56zM1596 627q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1726 497q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1846 367q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1226 757 q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1346 627q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1476 497q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1596 367q0 -34 -34 -34h-67q-34 0 -34 34 v56q0 34 34 34h67q34 0 34 -34v-56zM1726 237q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM976 757q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1096 627q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56 zM1226 497q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1346 367q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM726 757q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM846 627q0 -34 -34 -34h-67 q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM976 497q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1096 367q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM1476 237q0 -34 -34 -34h-817q-34 0 -34 34v56q0 34 34 34h817 q34 0 34 -34v-56zM476 757q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM596 627q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM726 497q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM846 367 q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM476 497q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM596 367q0 -34 -34 -34h-67q-34 0 -34 34v56q0 34 34 34h67q34 0 34 -34v-56zM476 237q0 -34 -34 -34h-67q-34 0 -34 34v56 q0 34 34 34h67q34 0 34 -34v-56z" />
+<glyph unicode="&#x2329;" horiz-adv-x="795" d="M680 -401q0 -41 -41 -41q-28 0 -37 25q-377 996 -377 1000t377 998q9 25 37 25q41 0 41 -41q0 -9 -371 -983q371 -974 371 -983z" />
+<glyph unicode="&#x232a;" horiz-adv-x="795" d="M567 598q2 -5 2 -15t-374 -1000q-9 -25 -39 -25q-41 0 -41 41q0 3 370 983q-370 980 -370 983q0 41 41 41q30 0 39 -25z" />
+<glyph unicode="&#x232b;" horiz-adv-x="2327" d="M2300 52q0 -52 -54 -52h-1520q-23 0 -61 38l-568 568q-30 30 -30 58t30 58l568 569q36 35 61 35h1520q54 0 54 -54v-1220zM2194 106v1114h-1463l-556 -556l558 -558h1461zM2024 1201q15 -15 15 -35.5t-34 -54.5l-447 -447l447 -447q34 -34 34 -54.5t-15 -35.5t-35.5 -15 t-54.5 34l-447 447l-447 -447q-34 -34 -54.5 -34t-35.5 15t-15 35.5t34 54.5l447 447l-447 447q-34 34 -34 54.5t15 35.5t35.5 15t54.5 -34l447 -447l447 447q34 34 54.5 34t35.5 -15z" />
+<glyph unicode="&#x232c;" horiz-adv-x="1864" d="M1694 166q0 -24 -21 -36l-721 -416q-5 -3 -20 -3t-20 3l-721 416q-21 12 -21 36v832q0 24 21 36l721 416q5 3 20 3t20 -3l721 -416q21 -12 21 -36v-832zM1612 190v784l-680 393l-680 -393v-784l680 -393zM1506 914q0 -43 -40 -43q-12 0 -22 6l-512 296q-21 12 -21 35 q0 43 40 43q10 0 22 -7l512 -296q21 -12 21 -34zM1506 250q0 -22 -21 -34l-512 -296q-12 -7 -22 -7q-40 0 -40 43q0 23 21 35l512 296q10 6 22 6q40 0 40 -43zM420 286q0 -41 -41 -41t-41 41v592q0 41 41 41t41 -41v-592z" />
+<glyph unicode="&#x232d;" horiz-adv-x="1628" d="M1589 1140l-378 -1038l-94 34l378 1038zM999 189q-92 -42 -177 -42t-163 28q-173 63 -251 229q-42 91 -42 184q0 76 28 155q63 174 229 252q92 43 177 43t163 -29q173 -63 251 -229q43 -92 43 -177t-29 -163q-63 -173 -229 -251zM509 1065l-378 -1038l-94 34l378 1038z M1155 594q0 106 -61 194.5t-165 126.5q-58 21 -119 21q-106 0 -195 -61.5t-126 -164.5q-21 -58 -21 -119q0 -106 61 -195t165 -126q60 -22 125.5 -22t137.5 33q129 60 177 194q21 58 21 119z" />
+<glyph unicode="&#x232e;" horiz-adv-x="1628" d="M1614 561q0 -52 -49 -52q-13 0 -41 10q-23 -201 -173.5 -336t-352.5 -135q-175 0 -317 103.5t-194 269.5q-165 -118 -303 -315l-76 -118q-17 -25 -42 -25q-52 0 -52 49q0 13 8 27q178 313 443 488q-2 21 -2 51q0 220 155 377t369 157t368.5 -140.5t170.5 -347.5 q52 -16 56 -19q32 -15 32 -44zM1279 915.5q-124 104.5 -295.5 104.5t-299.5 -129t-129 -310q229 121 504 121q178 0 370 -50q-26 159 -150 263.5zM1060 602q-270 0 -492 -129q36 -147 156.5 -240t282.5 -93t288 117.5t139 289.5q-197 55 -374 55z" />
+<glyph unicode="&#x232f;" horiz-adv-x="1628" d="M1237 789q0 -41 -68 -41h-710q-68 0 -68 41t68 41h710q68 0 68 -41zM1556 453h-1484v73h1484v-73zM1237 189q0 -41 -68 -41h-710q-68 0 -68 41t68 41h710q68 0 68 -41z" />
+<glyph unicode="&#x2330;" horiz-adv-x="1628" d="M1496 976l-280 -976h-1084l280 976h99l-252 -877h887l252 877h98z" />
+<glyph unicode="&#x2331;" horiz-adv-x="1628" d="M1460 640h-590q-13 -121 -101.5 -208.5t-208.5 -99.5v-191h-80v191q-120 13 -215.5 108.5t-95.5 241.5t95.5 241.5t215.5 108.5v187h80v-187q121 -12 209.5 -100.5t100.5 -209.5h590v-82zM560 722h211q-12 80 -71.5 140t-139.5 71v-211zM560 640v-208q79 11 138.5 70 t71.5 138h-210zM480 933q-79 -12 -145.5 -79t-66.5 -171.5t74 -178.5q59 -60 138 -72v501z" />
+<glyph unicode="&#x2332;" horiz-adv-x="1628" d="M1406 592l-1184 -592v1184zM321 642h766l-766 383v-383zM321 543v-383l766 383h-766z" />
+<glyph unicode="&#x2333;" horiz-adv-x="1628" d="M178 540v637l1272 -637h-1272zM278 640h749l-749 375v-375z" />
+<glyph unicode="&#x2334;" horiz-adv-x="1628" d="M1406 0h-1184v1076h99v-977h987v977h98v-1076z" />
+<glyph unicode="&#x2335;" horiz-adv-x="1628" d="M1464 923l-649 -919l-651 919h132l519 -732l517 732h132z" />
+<glyph unicode="&#x2336;" horiz-adv-x="1591" d="M1479 41q0 -41 -37 -41h-1288q-39 0 -39 41t39 41h602v1200h-602q-39 0 -39 41t39 41h1288q37 0 37 -41t-37 -41h-604v-1200h604q37 0 37 -41z" />
+<glyph unicode="&#x2337;" horiz-adv-x="992" d="M888 -72q0 -39 -37 -39h-708q-39 0 -39 39v1310q0 37 39 37h708q37 0 37 -37v-1310zM806 -29v1222h-620v-1222h620z" />
+<glyph unicode="&#x2338;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37v-1510zM1406 925v468h-1220v-468h1220zM1406 521v322h-1220v-322h1220zM1406 -29v468h-1220v-468h1220z" />
+<glyph unicode="&#x2339;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37v-1510zM1406 723v670h-1220v-670h1220zM1406 -29v670h-1220v-670h1220zM890 1220q40 -40 40 -95t-40.5 -95.5t-95 -40.5t-93.5 40.5t-39 95.5t38.5 95t94 40t95.5 -40zM930 240 q0 -55 -40.5 -95.5t-95 -40.5t-93.5 40.5t-39 96t38.5 95t94 39.5t95.5 -40t40 -95z" />
+<glyph unicode="&#x233a;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37v-1510zM1406 1393h-1220v-623l583 582q26 27 52 0l585 -585v626zM1376 681l-581 582l-580 -580l581 -582zM1406 -29v624l-582 -582q-11 -11 -28 -11t-27 11l-583 583v-625h1220z" />
+<glyph unicode="&#x233b;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37v-1510zM1406 -29v1422h-1220v-1422h1220zM1016 903q92 -92 92 -221.5t-91.5 -221t-221.5 -91.5t-221.5 91.5t-91.5 221.5t91.5 221.5t221 91.5t221.5 -92zM946 531q62 62 62 150t-63 151 t-151 63t-150 -62t-62 -151t62 -151t151 -62t151 62z" />
+<glyph unicode="&#x233c;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37v-1510zM1406 1393h-1220v-645q25 232 199 389.5t411 157.5t413 -161.5t197 -396.5v656zM1158.5 319q150.5 150 150.5 362t-151.5 363t-363.5 151t-361.5 -150t-149.5 -363t149.5 -363 t362.5 -150t363.5 150zM1406 -29v655q-21 -236 -196 -396.5t-413 -160.5t-412 157.5t-199 389.5v-645h1220z" />
+<glyph unicode="&#x233d;" horiz-adv-x="1591" d="M1320 1079q198 -209 198 -496.5t-198 -497t-483 -225.5v-126q0 -62 -41 -62t-41 62v126q-285 17 -483 226t-198 496.5t197.5 496t483.5 225.5v127q0 61 41 61t41 -61v-127q285 -16 483 -225zM1262 143.5q174 185.5 174 439t-174 438.5t-425 201v-1280q251 16 425 201.5z M329.5 1020.5q-173.5 -184.5 -173.5 -438t174 -438.5t425 -202v1280q-252 -17 -425.5 -201.5z" />
+<glyph unicode="&#x233e;" horiz-adv-x="1578" d="M1222 582q0 -180 -126.5 -306.5t-306.5 -126.5t-306.5 126.5t-126.5 306.5t126.5 306.5t306.5 126.5t306.5 -126.5t126.5 -306.5zM1122 582q0 139 -97 236t-236 97t-236 -97t-97 -236t97 -236t236 -97t236 97t97 236zM1538 582q0 -312 -218.5 -530.5t-530.5 -218.5 t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582q0 270 -189.5 459.5t-459.5 189.5t-459.5 -189.5t-189.5 -459.5t189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5z" />
+<glyph unicode="&#x233f;" horiz-adv-x="1305" d="M1267 582q0 -41 -37 -41h-558l-174 -478q-17 -47 -46 -47q-40 0 -40 37q0 16 8 38l164 450h-528q-37 0 -37 41t37 41h558l175 479q17 46 45 46q40 0 40 -37q0 -15 -8 -37l-165 -451h529q37 0 37 -41z" />
+<glyph unicode="&#x2340;" horiz-adv-x="1305" d="M1267 582q0 -41 -37 -41h-528l164 -450q8 -22 8 -38q0 -37 -40 -37q-29 0 -46 47l-174 478h-558q-37 0 -37 41t37 41h529l-165 451q-8 22 -8 37q0 37 40 37q28 0 45 -46l175 -479h558q37 0 37 -41z" />
+<glyph unicode="&#x2341;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 -29v1222h-1220v-1222h1220zM1382 1111l-1114 -1114q-13 -14 -27 -14t-29 15t-15 30q0 14 13 27l1114 1114q12 12 25 12q15 0 30 -15t15 -30q0 -13 -12 -25z" />
+<glyph unicode="&#x2342;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 -29v1222h-1220v-1222h1220zM1381 55q14 -14 14 -28t-15 -29t-29 -15t-28 14l-1113 1113q-13 13 -13 26q0 14 15 29t30 15q13 0 26 -12z" />
+<glyph unicode="&#x2343;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 87v990l-1049 -495zM1406 -29v27l-1159 547q-27 13 -27 37t27 37l1159 547v27h-1220v-1222h1220z" />
+<glyph unicode="&#x2344;" horiz-adv-x="1591" d="M1488 -72q0 -39 -39 -39h-1308q-37 0 -37 39v1310q0 37 37 37h1308q39 0 39 -37v-1310zM1406 -29v1222h-1220v-22l1169 -552q27 -13 27 -37t-27 -37l-1169 -552v-22h1220zM1245 582l-1059 499v-998z" />
+<glyph unicode="&#x2345;" d="M1931 582q0 -41 -39 -41h-728v-942q0 -41 -41 -41t-41 41v942h-744q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27 q0 -4 -7 -35q-59 -266 -288 -432h744v944q0 39 41 39t41 -39v-944h728q39 0 39 -41z" />
+<glyph unicode="&#x2346;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-544v-942q0 -41 -41 -41t-41 41v942h-928q-39 0 -39 41t39 41h928v944q0 39 41 39t41 -39v-944h544q-229 166 -288 432q-7 31 -7 35 q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x2347;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37v-1510zM1406 -29v640h-838q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5 t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h838v700h-1220v-1422h1220z" />
+<glyph unicode="&#x2348;" horiz-adv-x="1591" d="M1488 -72q0 -39 -39 -39h-1308q-37 0 -37 39v1510q0 37 37 37h1308q39 0 39 -37v-1510zM1406 -29v1422h-1220v-700h838q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23t-16 -20 q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-838v-640h1220z" />
+<glyph unicode="&#x2349;" horiz-adv-x="1591" d="M471 1228q152 77 333 77t350 -95.5t266.5 -264.5t97.5 -356t-85.5 -349t-240.5 -263l64 -109q15 -27 15 -44.5t-15.5 -26.5t-25.5 -9q-23 0 -46 39l-63 109q-152 -76 -332.5 -76t-350 95t-267 264.5t-97.5 356t85.5 348t240.5 263.5l-64 110q-15 26 -15 43.5t15.5 26.5 t25.5 9q23 0 45 -38zM1151 48q136 90 210.5 233t74.5 308t-86.5 315t-236.5 234.5t-309 84.5t-292 -66zM441 1115q-136 -90 -210.5 -232t-74.5 -307t86.5 -315t236.5 -234.5t309 -84.5t292 66z" />
+<glyph unicode="&#x234a;" horiz-adv-x="1479" d="M1449 225q0 -41 -37 -41h-1345q-39 0 -39 41t39 41h631v1031q0 37 41 37t41 -37v-1031h632q37 0 37 -41zM1449 -172q0 -41 -37 -41h-1345q-39 0 -39 41t39 41h1345q37 0 37 -41z" />
+<glyph unicode="&#x234b;" horiz-adv-x="1694" d="M1596 17q0 -17 -24 -17h-701v-341q0 -41 -41 -41t-41 41v341h-667q-24 0 -24 17q0 6 4 14l687 1385v91q0 39 41 39t41 -39v-21l721 -1455q4 -8 4 -14zM871 146h475l-475 960v-960zM789 146v1126l-558 -1126h558z" />
+<glyph unicode="&#x234c;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 1193h-1220v-770q168 45 318 187q203 192 259 423q3 17 13 50q6 17 20 17t18.5 -12.5t17.5 -64.5q53 -220 253 -410q153 -145 321 -190v770zM1406 -29v361q-446 163 -610 528 q-164 -365 -610 -528v-361h1220z" />
+<glyph unicode="&#x234d;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37v-1510zM1406 -29v1422h-1220v-1422h1220zM1319 74q0 -26 -27 -26h-988q-28 0 -28 26q0 6 4 15l473 1121q15 36 45 36t45 -36l472 -1121q4 -9 4 -15zM1119 189l-361 858l-361 -858h722z" />
+<glyph unicode="&#x234e;" horiz-adv-x="1591" d="M1479 41q0 -41 -37 -41h-1288q-39 0 -39 41t39 41h602v241q-160 15 -272.5 135.5t-112.5 284t111.5 286.5t273.5 138v160q0 37 41 37t41 -37v-160q161 -17 271 -139.5t110 -285t-111 -282.5t-270 -137v-241h604q37 0 37 -41zM1142 743q0 130 -87.5 230t-216.5 116v-688 q127 16 215.5 114t88.5 228zM537 974.5q-89 -100.5 -89 -232t89.5 -229.5t218.5 -113v690q-130 -15 -219 -115.5z" />
+<glyph unicode="&#x234f;" horiz-adv-x="1652" d="M1647 482q0 -41 -39 -41h-744v-728q0 -39 -41 -39t-41 39v728h-742q-41 0 -41 41t41 41h742v744q-162 -228 -432 -288q-31 -7 -35 -7q-24 0 -27 21v41q0 14 19 20q175 33 303.5 142t192.5 278q6 16 20 16t23 -16l18 -46q122 -282 428 -363q16 -3 47 -11q18 -5 20 -25 q-1 9 -1 -36q0 -21 -27 -21q-4 0 -35 7q-266 59 -432 288v-744h744q39 0 39 -41z" />
+<glyph unicode="&#x2350;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37v-1510zM1406 -29v1422h-1220v-1422h569v1156q-163 -228 -432 -288q-32 -7 -35 -7q-24 0 -28 21q1 -3 1 41q0 14 19 20q176 35 305 143q127 108 191 277q6 16 20 16t23 -16q5 -16 18 -46 q95 -221 314 -323q49 -23 89 -33l72 -18q17 -5 20 -25q-1 9 -1 -36q0 -21 -27 -21q-4 0 -35 7q-266 59 -432 288v-1156h569z" />
+<glyph unicode="&#x2351;" horiz-adv-x="1479" d="M1449 1293q0 -41 -37 -41h-1345q-39 0 -39 41t39 41h1345q37 0 37 -41zM1449 896q0 -41 -37 -41h-632v-1031q0 -37 -41 -37t-41 37v1031h-631q-39 0 -39 41t39 41h1345q37 0 37 -41z" />
+<glyph unicode="&#x2352;" horiz-adv-x="1694" d="M1596 1373q0 -6 -4 -14l-687 -1385v-317q0 -39 -41 -39t-41 39v247l-721 1455q-4 8 -4 14q0 17 24 17h701v115q0 41 41 41t41 -41v-115h667q24 0 24 -17zM905 1244v-1126l558 1126h-558zM823 1244h-475l475 -960v960z" />
+<glyph unicode="&#x2353;" horiz-adv-x="1591" d="M1488 -74q0 -37 -39 -37h-1308q-37 0 -37 37v1310q0 39 37 39h1308q39 0 39 -39v-1310zM1406 1193h-1220v-361q446 -163 610 -528q164 365 610 528v361zM1406 -29v770q-168 -45 -318 -187q-203 -192 -259 -423q-3 -17 -13 -50q-6 -17 -20 -17t-18.5 12.5t-17.5 64.5 q-53 220 -253 410q-153 145 -321 190v-770h1220z" />
+<glyph unicode="&#x2354;" horiz-adv-x="1591" d="M1488 -74q0 -37 -39 -37h-1308q-37 0 -37 37v1510q0 39 37 39h1308q39 0 39 -39v-1510zM1406 -29v1422h-1220v-1422h1220zM1316 1290q0 -6 -4 -15l-473 -1121q-15 -36 -45 -36t-45 36l-472 1121q-4 10 -4 15q0 26 27 26h988q28 0 28 -26zM1195 1175h-722l361 -858z" />
+<glyph unicode="&#x2355;" horiz-adv-x="1591" d="M1479 1323q0 -41 -37 -41h-604v-241q159 -17 270 -137t111 -282.5t-110 -285t-271 -139.5v-160q0 -37 -41 -37t-41 37v160q-162 15 -273.5 138.5t-111.5 286.5t112.5 283.5t272.5 135.5v241h-602q-39 0 -39 41t39 41h1288q37 0 37 -41zM1142 621q0 130 -88.5 228 t-215.5 114v-688q129 16 216.5 116t87.5 230zM537.5 851q-89.5 -98 -89.5 -229.5t89 -232t219 -115.5v690q-129 -15 -218.5 -113z" />
+<glyph unicode="&#x2356;" horiz-adv-x="1652" d="M1647 682q0 -41 -39 -41h-744v-744q166 229 432 288q31 7 35 7q27 0 27 -21q0 -45 1 -36q-2 -20 -19 -24t-48 -12q-146 -38 -257.5 -132.5t-170.5 -230.5q-5 -16 -18 -46q-9 -16 -23 -16t-20 16q-98 259 -334 369q-49 23 -90 33l-72 18q-19 6 -19 20v41q3 21 27 21 q4 0 35 -7q270 -60 432 -288v744h-742q-41 0 -41 41t41 41h742v728q0 39 41 39t41 -39v-728h744q39 0 39 -41z" />
+<glyph unicode="&#x2357;" horiz-adv-x="1591" d="M1488 -74q0 -37 -37 -37h-1308q-39 0 -39 37v1510q0 39 39 39h1308q37 0 37 -39v-1510zM1406 -29v1422h-569v-1156q166 229 432 288q31 7 35 7q27 0 27 -21q0 -45 1 -36q-3 -20 -20 -24l-47 -12q-147 -38 -258.5 -132.5t-169.5 -230.5l-18 -46q-9 -16 -23 -16t-20 16 q-97 257 -334 369q-50 23 -90 33l-72 18q-19 6 -19 20q0 44 -1 41q4 21 28 21q3 0 35 -7q269 -60 432 -288v1156h-569v-1422h1220z" />
+<glyph unicode="&#x2358;" horiz-adv-x="1591" d="M1421 382q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM867.5 1357q28.5 -30 28.5 -73.5t-26 -185.5l-54 -295h-44l-54 296q-23 126 -23 166q0 122 97 122q47 0 75.5 -30z" />
+<glyph unicode="&#x2359;" horiz-adv-x="1694" d="M1596 17q0 -17 -24 -17h-1450q-24 0 -24 17q0 6 4 14l695 1401q17 35 50.5 35t50.5 -35l694 -1401q4 -8 4 -14zM1346 146l-557 1126l-558 -1126h1115zM1611 -268q0 -41 -37 -41h-1445q-39 0 -39 41t39 41h1445q37 0 37 -41z" />
+<glyph unicode="&#x235a;" horiz-adv-x="1591" d="M1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1550 609q11 -11 11 -27.5t-10 -26.5l-727 -727q-11 -11 -27.5 -11t-27.5 11l-728 729q-10 10 -10 26t11 27l727 727q10 10 26 10t26 -10zM1461 581l-666 666l-664 -664l666 -666z" />
+<glyph unicode="&#x235b;" horiz-adv-x="1591" d="M1421 382q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1016 1303q92 -92 92 -221.5t-91.5 -221t-221.5 -91.5t-221.5 91.5t-91.5 221.5t91.5 221.5t221 91.5t221.5 -92zM946 931q62 62 62 150t-63 151t-151 63t-150 -62t-62 -151t62 -151t151 -62t151 62z " />
+<glyph unicode="&#x235c;" horiz-adv-x="1591" d="M1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188 t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5z" />
+<glyph unicode="&#x235d;" horiz-adv-x="1706" d="M1152.5 1150.5q124.5 -126.5 124.5 -300t-126 -297.5t-298.5 -124t-298 123.5t-125.5 297.5t124.5 300.5t299.5 126.5t299.5 -126.5zM1589 -372q0 -31 -24.5 -50.5t-52.5 -19.5t-50 22.5t-22 47.5v1265q0 239 -173.5 401t-414.5 162t-414.5 -162t-173.5 -401v-1265 q0 -31 -24.5 -50.5t-52.5 -19.5t-50 22.5t-22 47.5v1276q0 298 221 500t519 202t516 -204.5t218 -497.5v-1276zM1200 851q0 142 -102 245.5t-245 103.5t-245 -103.5t-102 -245.5t103 -243.5t244 -101.5t244 101.5t103 243.5z" />
+<glyph unicode="&#x235e;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37v-1510zM1406 -29v1422h-1220v-1422h1220zM867.5 1257q28.5 -30 28.5 -73.5t-26 -185.5l-54 -295h-44l-54 296q-23 126 -23 166q0 122 97 122q47 0 75.5 -30z" />
+<glyph unicode="&#x235f;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1302 731 q0 -15 -12 -21l-373 -176q201 -369 201 -371q0 -22 -23 -22q-11 0 -14 4l-285 303l-281 -299q-8 -8 -18 -8q-23 0 -23 22q0 3 201 371l-368 174q-17 8 -17 23q0 27 25 22l407 -78l51 410q2 18 22.5 18t23.5 -18l51 -410l407 78q25 5 25 -22z" />
+<glyph unicode="&#x2360;" horiz-adv-x="1591" d="M875 1218.5q34 -33.5 34 -79t-34 -79t-80 -33.5t-79 33.5t-33 80t33 79t79 32.5t80 -33.5zM875 332.5q34 -33.5 34 -80t-33 -79.5t-80.5 -33t-80 33t-32.5 80t32.5 80t79 33t80.5 -33.5zM1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37 v-1510zM1406 -29v1422h-1220v-1422h1220z" />
+<glyph unicode="&#x2361;" horiz-adv-x="1591" d="M1479 1203q0 -41 -37 -41h-604v-1243q0 -39 -41 -39t-41 39v1243h-602q-39 0 -39 41t39 41h1288q37 0 37 -41zM1387 1558.5q34 -33.5 34 -79t-34 -79t-80 -33.5t-79 33.5t-33 80t33 79t79 32.5t80 -33.5zM363 1558.5q34 -33.5 34 -79t-34 -79t-80 -33.5t-79 33.5t-33 80 t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x2362;" horiz-adv-x="1694" d="M1596 1173q0 -6 -4 -14l-695 -1401q-17 -35 -50.5 -35t-50.5 35l-694 1401q-4 8 -4 14q0 17 24 17h1450q24 0 24 -17zM1463 1044h-1115l557 -1126zM1387 1562.5q34 -33.5 34 -79t-34 -79t-80 -33.5t-79 33.5t-33 80t33 79t79 32.5t80 -33.5zM463 1562.5q34 -33.5 34 -79 t-34 -79t-80 -33.5t-79 33.5t-33 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x2363;" horiz-adv-x="1024" d="M903 1558.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM279 1558.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM1018 731q0 -15 -12 -21l-373 -176q201 -369 201 -371q0 -22 -23 -22 q-10 0 -14 4l-285 303l-281 -299q-8 -8 -18 -8q-23 0 -23 22q0 3 201 371l-368 174q-17 8 -17 23q0 27 25 22l407 -78l51 410q2 18 23 18t23 -18l51 -410l407 78q25 5 25 -22z" />
+<glyph unicode="&#x2364;" horiz-adv-x="1024" d="M903 1558.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM279 1558.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM670 740q66 -67 66 -158t-67 -157t-157.5 -66t-157 65.5t-66.5 156.5 t66.5 158.5t158 67.5t157.5 -67zM615 479.5q44 43.5 44 102.5t-44 103.5t-103 44.5t-103 -44.5t-44 -103.5t44 -102.5t103 -43.5t103 43.5z" />
+<glyph unicode="&#x2365;" horiz-adv-x="1591" d="M1187 1558.5q34 -33.5 34 -79t-34 -79t-80 -33.5t-79 33.5t-33 80t33 79t79 32.5t80 -33.5zM563 1558.5q34 -33.5 34 -79t-34 -79t-80 -33.5t-79 33.5t-33 80t33 79t79 32.5t80 -33.5zM1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5 t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5z" />
+<glyph unicode="&#x2366;" horiz-adv-x="1364" d="M1249 546q0 -193 -171 -315q-149 -106 -355 -118v-197q0 -61 -41 -61t-41 61v197q-206 12 -355 119q-171 122 -171 314v799q0 37 41 37t41 -37v-792q0 -161 145 -261q124 -85 299 -97v998q0 62 41 62t41 -62v-998q174 12 299 97q145 100 145 261v792q0 37 41 37t41 -37 v-799z" />
+<glyph unicode="&#x2367;" horiz-adv-x="1591" d="M1421 41q0 -41 -39 -41h-418v-201q0 -41 -41 -41t-41 41v201h-90q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h90v203q0 39 41 39t41 -39v-203h418q39 0 39 -41t-39 -41h-418v-1000h418q39 0 39 -41zM882 82v1000h-84q-216 0 -381 -143.5t-165 -356.5t165 -356.5 t381 -143.5h84z" />
+<glyph unicode="&#x2368;" horiz-adv-x="1591" d="M1477 746q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1393 1508.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM369 1508.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x2369;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1393 1508.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM369 1508.5 q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x236a;" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM958 50q0 -233 -298 -331v44q91 30 153.5 98.5t62.5 158.5q0 41 -23 41q-10 0 -37.5 -14.5t-48.5 -14.5q-107 0 -107 109q0 51 38.5 85t90.5 34q78 0 123.5 -64.5t45.5 -145.5z" />
+<glyph unicode="&#x236b;" horiz-adv-x="1694" d="M1596 1373q0 -6 -4 -14l-425 -857q20 -3 40 -3q85 0 156 50t104 130q15 36 21 98t30 62q29 0 29 -63q0 -152 -96 -271.5t-244 -119.5q-46 0 -92 13l-218 -440q-17 -35 -50.5 -35t-50.5 35l-370 748q-95 -38 -146 -128q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63 q0 109 52 207t141 147l-276 557q-4 8 -4 14q0 17 24 17h1450q24 0 24 -17zM1463 1244h-1115l201 -406q124 -9 299 -151.5t255 -169.5zM1055 421q-65 31 -208.5 149t-236.5 143l295 -595z" />
+<glyph unicode="&#x236c;" horiz-adv-x="1326" d="M1276 885q0 -100 -50 -191.5t-137 -133.5q-30 -225 -117 -378q-118 -206 -309 -206q-222 0 -344 277q-94 214 -94 471q0 32 3 78q-106 -65 -127 -223q-6 -46 -26 -46q-25 0 -25 56q0 102 50.5 193.5t138.5 132.5q32 224 118 373q116 201 306 201q224 0 344 -279 q94 -217 94 -490q0 -24 -1 -46q74 46 104 123q11 28 18.5 86t27.5 58q26 0 26 -56zM941 736q0 226 -48 414q-73 285 -230 285q-213 0 -266 -496q107 -15 271 -152.5t270 -149.5q3 54 3 99zM385 737q0 -227 48 -418q74 -289 230 -289q214 0 267 505q-105 15 -270 152.5 t-272 149.5q-3 -53 -3 -100z" />
+<glyph unicode="&#x236d;" horiz-adv-x="1221" d="M1150 812q0 -123 -78 -220.5t-191.5 -97.5t-239.5 101v-996q0 -41 -41 -41t-41 41v1063q-129 104 -232 104q-128 0 -191 -115q-19 -32 -30 -111q-7 -46 -28 -46q-28 0 -28 56q0 124 76 217q80 101 193.5 101t239.5 -100v799q0 39 41 39t41 -39v-866q130 -105 232 -105 q78 0 139.5 52.5t75.5 129.5q4 27 7 53q8 37 27 37q28 0 28 -56z" />
+<glyph unicode="&#x236e;" horiz-adv-x="1251" d="M728 1105q0 -46 -32.5 -78.5t-79 -32.5t-78.5 32.5t-32 78.5t32 78t78.5 32t79 -32t32.5 -78zM1135 41q0 -41 -37 -41h-471q-61 -42 -150 -71v44q34 11 63 27h-386q-39 0 -39 41t39 41h485q54 70 54 148q0 41 -23 41q-11 0 -38.5 -14.5t-47.5 -14.5q-107 0 -107 109 q0 51 38 85t91 34q77 0 123 -64.5t46 -152.5t-62 -171h385q37 0 37 -41z" />
+<glyph unicode="&#x236f;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37v-1510zM1406 923v470h-1220v-470h670l119 206q23 39 45 39q41 0 41 -38q0 -16 -15 -42l-95 -165h455zM1406 523v318h-503l-183 -318h686zM186 841v-318h439l184 318h-623zM1406 -29v470 h-734l-176 -305q-23 -40 -46 -40q-41 0 -41 38q0 15 16 43l153 264h-392v-470h1220z" />
+<glyph unicode="&#x2370;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1510q0 37 39 37h1308q37 0 37 -37v-1510zM1406 -29v1422h-1220v-1422h1220zM1089 994q0 -123 -112 -250.5t-135 -167.5q-45 -74 -51 -184h-33q6 106 28.5 175t88.5 195t66 217t-49 156.5t-137 65.5q-54 0 -101.5 -27 t-47.5 -77q0 -27 24 -72.5t24 -66.5q0 -68 -64 -68q-43 0 -65.5 40t-22.5 86q0 108 93 172q82 58 194 58q165 0 243 -96q57 -71 57 -156zM843.5 267q25.5 -26 25.5 -63.5t-26 -63.5t-63 -26t-63 26t-26 63.5t25.5 63.5t63.5 26t63.5 -26z" />
+<glyph unicode="&#x2371;" horiz-adv-x="1364" d="M1249 1184q0 -10 -2 -15l-250 -565q134 38 158 174q3 26 9 58t25 32q28 0 28 -56q0 -121 -75.5 -217.5t-193.5 -100.5l-227 -514q-11 -25 -36 -25t-40 25q-1 1 -30 67l-311 698q-66 -31 -95 -84q-23 -40 -36 -121q-8 -46 -28 -46q-28 0 -28 56q0 192 149 282 q-151 342 -151 352q0 41 41 41q28 0 39 -25l149 -337q25 5 50 5q113 0 267.5 -128t243.5 -141l266 601q11 25 37 25q41 0 41 -41zM863 505q-69 21 -217 143q-142 118 -250 118h-9l295 -670z" />
+<glyph unicode="&#x2372;" horiz-adv-x="1364" d="M1249 -4q0 -41 -41 -41q-26 0 -37 25l-266 601q-89 -13 -243.5 -141t-267.5 -128q-25 0 -50 5l-149 -337q-11 -25 -39 -25q-41 0 -41 41q0 10 151 352q-149 90 -149 282q0 56 28 56q20 0 28 -46q13 -81 36 -121q29 -53 95 -84l311 698q9 23 30 67q15 25 40 25t36 -25 l227 -514q118 -4 193.5 -100.5t75.5 -217.5q0 -56 -28 -56q-19 0 -25 32t-9 58q-24 136 -158 174l250 -565q2 -5 2 -15zM863 675l-181 409l-295 -670h9q108 0 250 118q148 122 217 143z" />
+<glyph unicode="&#x2373;" horiz-adv-x="748" d="M695 266q0 -114 -48 -194q-58 -96 -164 -96q-133 0 -203 78t-70 212v473q0 86 -41 106q-20 11 -103 11h-14v67l299 23v-685q0 -231 148 -231q102 0 131 139q12 56 12 182v37h53v-122z" />
+<glyph unicode="&#x2374;" horiz-adv-x="990" d="M184 818q107 142 305 142t323.5 -138.5t125.5 -340t-127.5 -353.5t-329.5 -152q-145 0 -245 113q0 -23 0.5 -79.5t0.5 -84.5q0 -214 -36 -342h-149q37 173 37 311v589q0 209 95 335zM775 406q0 187 -65 326q-84 180 -250 180q-108 0 -166 -84.5t-58 -197.5v-344 q0 -110 89 -183t201 -73q249 0 249 376z" />
+<glyph unicode="&#x2375;" horiz-adv-x="1328" d="M1276 430q0 -173 -79 -302q-93 -152 -255 -152q-185 0 -278 219q-93 -219 -278 -219q-162 0 -255 152q-79 129 -79 302q0 245 124.5 386t365.5 144v-48q-327 -10 -327 -470q0 -412 202 -412q135 0 224 241q-67 140 -67 291q0 219 90 219t90 -219q0 -151 -67 -291 q89 -241 224 -241q202 0 202 412q0 460 -327 470v48q241 -3 365.5 -144.5t124.5 -385.5z" />
+<glyph unicode="&#x2376;" horiz-adv-x="1250" d="M1197 190q0 -84 -46.5 -143t-128.5 -59q-125 0 -173 162q-161 -174 -357 -174t-318 143.5t-122 341t126.5 348.5t321.5 151q160 0 255 -98q75 -78 119 -232q9 -34 58 -273q49 97 77.5 247t28.5 274q0 72 43 72q47 0 47 -72q0 -125 -54.5 -299t-124.5 -293 q49 -233 118 -233q79 0 79 173l-3 85h54v-121zM467 912q-135 0 -200 -121q-52 -96 -52 -262.5t67 -311.5q87 -187 245 -187t307 177l-61 266q-46 196 -106 298q-81 141 -200 141zM1181 -268q0 -41 -37 -41h-1055q-39 0 -39 41t39 41h1055q37 0 37 -41z" />
+<glyph unicode="&#x2377;" horiz-adv-x="883" d="M802 280q28 0 28 -28.5t-34 -86.5q-110 -189 -326 -189q-148 0 -270 66q-148 80 -148 216q0 177 263 238q-93 22 -154 84t-61 153q0 123 132 182q98 45 221 45t210 -28q123 -40 123 -122q0 -33 -24.5 -55.5t-60.5 -22.5t-67 47q-52 77 -61 86q-47 47 -126 47 q-202 0 -202 -194q0 -188 199 -188q22 0 63 11t63 11q86 0 86 -55.5t-87 -55.5q-21 0 -62.5 11t-62.5 11q-214 0 -214 -205q0 -228 255 -228q204 0 290 221q11 29 27 29zM851 -268q0 -41 -37 -41h-735q-39 0 -39 41t39 41h735q37 0 37 -41z" />
+<glyph unicode="&#x2378;" horiz-adv-x="748" d="M695 266q0 -114 -48 -194q-58 -96 -164 -96q-133 0 -203 78t-70 212v473q0 86 -41 106q-20 11 -103 11h-14v67l299 23v-685q0 -231 148 -231q102 0 131 139q12 56 12 182v37h53v-122zM711 -268q0 -41 -37 -41h-595q-39 0 -39 41t39 41h595q37 0 37 -41z" />
+<glyph unicode="&#x2379;" horiz-adv-x="1328" d="M1276 430q0 -173 -79 -302q-93 -152 -255 -152q-185 0 -278 219q-93 -219 -278 -219q-162 0 -255 152q-79 129 -79 302q0 245 124.5 386t365.5 144v-48q-327 -10 -327 -470q0 -412 202 -412q135 0 224 241q-67 140 -67 291q0 219 90 219t90 -219q0 -151 -67 -291 q89 -241 224 -241q202 0 202 412q0 460 -327 470v48q241 -3 365.5 -144.5t124.5 -385.5zM1271 -268q0 -41 -37 -41h-1135q-39 0 -39 41t39 41h1135q37 0 37 -41z" />
+<glyph unicode="&#x237a;" horiz-adv-x="1250" d="M1197 190q0 -84 -46.5 -143t-128.5 -59q-125 0 -173 162q-161 -174 -357 -174t-318 143.5t-122 341t126.5 348.5t321.5 151q160 0 255 -98q75 -78 119 -232q9 -34 58 -273q49 97 77.5 247t28.5 274q0 72 43 72q47 0 47 -72q0 -125 -54.5 -299t-124.5 -293 q49 -233 118 -233q79 0 79 173l-3 85h54v-121zM467 912q-135 0 -200 -121q-52 -96 -52 -262.5t67 -311.5q87 -187 245 -187t307 177l-61 266q-46 196 -106 298q-81 141 -200 141z" />
+<glyph unicode="&#x237b;" horiz-adv-x="1546" d="M1411 782q0 -41 -37 -41h-432q-554 -783 -617 -783q-79 0 -147 191q-58 161 -58 262q0 40 36.5 68t68.5 28t49 -11q7 -4 48.5 -121t97.5 -117q35 0 372 483h-393q-39 0 -39 41t39 41h450l185 264l117 156q39 46 104 92t111 46q16 0 16 -20t-48 -81l-87 -109 q-22 -29 -247 -348h374q37 0 37 -41z" />
+<glyph unicode="&#x237c;" horiz-adv-x="1858" d="M1719 41q0 -41 -68 -41h-1019q-106 -145 -106 -229v-35q107 127 253 179q8 3 15 3q39 0 39 -42q0 -24 -23 -34l-62 -27q-149 -75 -237 -230q-15 -27 -26 -27t-26 27q-87 154 -236 230l-58 25q-26 12 -26 36q0 42 39 42q7 0 15 -3q144 -52 251 -178v34q0 99 90 229h-22 q-61 0 -66 35q-2 11 -2 33v532q-112 100 -158 162q-73 97 -73 197.5t73 197.5q46 62 158 160v20q0 68 41 68t41 -68v-700q110 -97 157 -162q72 -98 72 -193t-66 -200h962q68 0 68 -41zM444 1209q-149 -139 -149 -249.5t149 -249.5v499zM673 277q0 111 -147 250v-445h66 q81 117 81 195z" />
+<glyph unicode="&#x237d;" horiz-adv-x="1591" d="M1563 969q0 -41 -37 -41h-238v-889q0 -39 -37 -39h-908q-39 0 -39 39v929h-237q-39 0 -39 41t39 41h282q37 0 37 -39v-929h820v891q0 37 37 37h283q37 0 37 -41z" />
+<glyph unicode="&#x237e;" horiz-adv-x="1628" d="M1523 517q0 -41 -68 -41h-348v-395h238q37 0 37 -41t-37 -41h-283q-37 0 -37 37v440h-421v-437q0 -39 -37 -39h-282q-39 0 -39 41t39 41h237v394h-349q-68 0 -68 41q0 296 206.5 502t502.5 206t502.5 -206t206.5 -502zM814 1155q-255 0 -438 -172.5t-199 -424.5h1274 q-16 252 -199 424.5t-438 172.5z" />
+<glyph unicode="&#x237f;" horiz-adv-x="626" d="M585 582q0 -103 -65.5 -178.5t-165.5 -90.5v-714q0 -41 -41 -41t-41 41v714q-100 15 -165.5 90.5t-65.5 178.5t65.5 178.5t165.5 90.5v716q0 39 41 39t41 -39v-716q100 -15 165.5 -90.5t65.5 -178.5z" />
+<glyph unicode="&#x2380;" horiz-adv-x="1364" d="M1249 807q0 -11 -2 -16l-526 -1188q-11 -25 -39 -25t-39 25l-526 1188q-2 5 -2 16q0 41 41 41q26 0 37 -25l489 -1103l489 1103q11 25 37 25q41 0 41 -41zM1053 1056q0 -59 -38.5 -101.5t-103.5 -42.5q-98 0 -129 97q-67 -105 -206 -105q-97 0 -171 34q-95 44 -95 128 q0 125 165 194q99 41 289 51v43q0 70 -42.5 121t-127 51t-140.5 -47q70 -13 70 -74q0 -75 -84.5 -75t-84.5 76q0 81 80.5 126.5t172.5 45.5q141 0 227 -82q60 -57 60 -174v-284q0 -62 49 -62t49 106q0 18 -2 64h62v-90zM764 1129v132q-124 -6 -208 -48q-103 -52 -103 -145 q0 -47 39 -79.5t106 -32.5t116.5 51t49.5 122z" />
+<glyph unicode="&#x2381;" d="M1878 324q0 -41 -31 -72t-72.5 -31t-72 30.5t-30.5 73t30 72t72 29.5t73 -30.5t31 -71.5zM1555 324q0 -41 -31 -72t-72.5 -31t-72 30.5t-30.5 73t30 72t72 29.5t73 -30.5t31 -71.5zM1201.5 396.5q30.5 -30.5 30.5 -73t-30 -72.5t-73 -30t-73 30t-30 73t30 73t72.5 30 t73 -30.5zM913 365q0 -59 -38.5 -101.5t-103.5 -42.5q-98 0 -129 97q-67 -105 -206 -105q-97 0 -171 34q-95 44 -95 128q0 125 165 194q99 41 289 51v43q0 70 -42.5 121t-127 51t-140.5 -47q70 -13 70 -74q0 -75 -84.5 -75t-84.5 76q0 81 80.5 126.5t172.5 45.5 q141 0 227 -82q60 -57 60 -174v-284q0 -62 49 -62t49 106q0 18 -2 64h62v-90zM1878 41q0 -41 -37 -41h-1632q-39 0 -39 41t39 41h1632q37 0 37 -41zM624 438v132q-124 -6 -208 -48q-103 -52 -103 -145q0 -47 39 -79.5t106 -32.5t116.5 51t49.5 122z" />
+<glyph unicode="&#x2382;" d="M1843 365q0 -59 -38.5 -101.5t-103.5 -42.5q-98 0 -129 97q-67 -105 -206 -105q-97 0 -171 34q-95 44 -95 128q0 125 165 194q100 41 289 51v43q0 70 -42.5 121t-127 51t-140.5 -47q70 -13 70 -74q0 -75 -84.5 -75t-84.5 76q0 81 80.5 126.5t172.5 45.5q141 0 227 -82 q60 -57 60 -174v-284q0 -62 49 -62t49 106q0 18 -2 64h62v-90zM1878 41q0 -41 -37 -41h-702q-39 0 -39 41t39 41h702q37 0 37 -41zM913 365q0 -59 -38.5 -101.5t-103.5 -42.5q-98 0 -129 97q-67 -105 -206 -105q-97 0 -171 34q-95 44 -95 128q0 125 165 194q100 41 289 51 v43q0 70 -42.5 121t-127 51t-140.5 -47q70 -13 70 -74q0 -75 -84.5 -75t-84.5 76q0 81 80.5 126.5t172.5 45.5q141 0 227 -82q60 -57 60 -174v-284q0 -62 49 -62t49 106q0 18 -2 64h62v-90zM948 41q0 -41 -37 -41h-702q-39 0 -39 41t39 41h702q37 0 37 -41zM1554 438v132 q-124 -6 -208 -48q-103 -52 -103 -145q0 -47 39 -79.5t106 -32.5t116.5 51t49.5 122zM624 438v132q-124 -6 -208 -48q-103 -52 -103 -145q0 -47 39 -79.5t106 -32.5t116.5 51t49.5 122z" />
+<glyph unicode="&#x2383;" horiz-adv-x="1992" d="M1426 1245l-181 -313q-23 37 -56 66l166 288q11 20 29 20q11 0 25 -8q36 -21 17 -53zM1822 582q0 -41 -37 -41h-326v82h326q37 0 37 -41zM775 1048q-40 -18 -71 -42l-137 237q-7 12 -7 23q0 18 23 32q14 7 25 7q18 0 30 -21zM1373 446q0 -59 -38.5 -101.5t-103.5 -42.5 q-98 0 -129 97q-67 -105 -206 -105q-97 0 -171 34q-95 44 -95 128q0 125 165 194q99 41 289 51v43q0 70 -42.5 121t-127 51t-140.5 -47q70 -13 70 -74q0 -75 -84.5 -75t-84.5 76q0 81 80.5 126.5t172.5 45.5q141 0 227 -82q60 -57 60 -174v-284q0 -62 49 -62t49 106 q0 18 -2 64h62v-90zM1171 196q24 -5 48.5 -5t47.5 4l159 -276q7 -11 7 -21q0 -18 -24 -32q-14 -8 -25 -8q-18 0 -29 20zM209 541q-39 0 -39 41t39 41h401q-29 -38 -44 -82h-357zM818 192l-180 -312q-12 -21 -30 -21q-11 0 -25 7q-23 14 -23 32q0 11 7 23l171 296 q38 -16 80 -25zM1084 519v132q-124 -6 -208 -48q-103 -52 -103 -145q0 -47 39 -79.5t106 -32.5t116.5 51t49.5 122z" />
+<glyph unicode="&#x2384;" horiz-adv-x="1920" d="M1618.5 1182q201.5 -204 201.5 -488t-202 -489t-485 -205h-996q-37 0 -37 37v1314q0 35 37 35h995q285 0 486.5 -204zM1575 274q166 178 166 419.5t-166 419t-407 193.5v-1226q241 16 407 194zM680 1113.5q-166 -177.5 -166 -420t167 -420t408 -193.5v1226 q-243 -15 -409 -192.5zM536 334.5q-101 165.5 -101 359t100 358.5t272 255h-628v-1228h630q-172 90 -273 255.5z" />
+<glyph unicode="&#x2385;" horiz-adv-x="1584" d="M1484 37q0 -37 -35 -37h-619v-194q0 -36 -40 -36t-40 36v194h-613q-37 0 -37 37v1314q0 35 37 35h613v165q0 38 40 38t40 -38v-165h619q35 0 35 -35v-1314zM1405 79v1228h-575v-1228h575zM750 79v1228h-571v-1228h571z" />
+<glyph unicode="&#x2386;" d="M2018 610q11 -11 11 -27.5t-10 -26.5l-925 -925q-11 -11 -27.5 -11t-27.5 11l-693 693h116l605 -604l862 862l-864 864l-605 -605l-116 1l695 694q10 10 26 10t26 -10zM1335 582q0 -23 -32 -38q-116 -53 -185 -112t-156 -170q-18 -23 -38 -23q-36 0 -36 47v137h-757 q-61 0 -61 59v200q0 59 61 59l757 -1v138q0 47 36 47q20 0 38 -23q87 -111 156 -170t185 -112q32 -15 32 -38zM970 729q0 -30 -22 -50t-50 -20h-746v-154h746q28 0 50 -20t22 -50v-30q88 103 223 177q-135 74 -223 177v-30z" />
+<glyph unicode="&#x2387;" horiz-adv-x="1784" d="M1535 718q0 -11 -27 -26q-154 -87 -230 -236l-25 -58q-12 -26 -36 -26q-42 0 -42 39q0 7 3 15q52 144 178 251h-349q-94 0 -142 -169l-94 -332q-75 -176 -227 -176h-333q-41 0 -41 41t41 41h333q114 0 171 176l88 325q67 176 204 176h350q-127 107 -179 253q-3 8 -3 15 q0 39 42 39q24 0 34 -23l27 -62q75 -149 230 -237q27 -15 27 -26zM1614 41q0 -41 -37 -41h-696q-39 0 -39 41t39 41h696q37 0 37 -41z" />
+<glyph unicode="&#x2388;" horiz-adv-x="1991" d="M1821 582q0 -41 -37 -41h-168q-14 -209 -153 -369l119 -119q26 -26 -3 -55t-55 -3l-119 119q-159 -140 -368 -154v-165q0 -39 -41 -39t-41 39v165q-210 15 -369 155l-118 -118q-13 -14 -27 -14t-29 15t-15 30q0 14 13 27l118 118q-139 159 -153 368h-166q-39 0 -39 41 t39 41h166q13 210 152 369l-117 117q-13 13 -13 27q0 15 15 30t29 15t27 -14l117 -117q159 140 370 154v167q0 37 41 37t41 -37v-167q210 -14 369 -154l118 119q26 26 55 -3t3 -55l-118 -119q138 -159 152 -369h168q37 0 37 -41zM1348 992q-135 116 -311 130v-441zM1534 623 q-13 176 -129 311l-311 -311h440zM955 681v440q-177 -13 -312 -129zM1534 541h-440l311 -311q116 135 129 311zM897 623l-311 311q-116 -135 -129 -311h440zM1347 172l-310 311v-441q175 14 310 130zM897 541h-440q13 -175 129 -310zM955 43v440l-311 -310 q135 -117 311 -130z" />
+<glyph unicode="&#x2389;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1234.5 1048.5q-184.5 174.5 -438.5 174.5t-438.5 -174t-200.5 -426h241q23 0 35 -20l363 -590l363 590q12 20 35 20h241q-16 251 -200.5 425.5z M1435 541h-218l-368 -598q236 19 403.5 190t182.5 408zM743 -57l-368 598h-218q15 -236 182.5 -407t403.5 -191z" />
+<glyph unicode="&#x238a;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1432 588 q0 -18 -17 -35l-589 -591q-12 -12 -29 -12t-29 12l-591 591q-17 17 -17 35q0 35 46 35h1180q46 0 46 -35zM1287 541h-982l492 -492z" />
+<glyph unicode="&#x238b;" horiz-adv-x="1591" d="M1307 1093q211 -211 211 -510.5t-211.5 -511t-511.5 -211.5t-510 210.5t-210 510.5q0 222 121 403q20 -58 30 -110q-69 -135 -69 -293q0 -266 186 -452.5t452 -186.5t453.5 187.5t187.5 453t-187 452.5t-452 187q-157 0 -293 -70q-52 10 -110 30q181 122 403 122 q299 0 510 -211zM336 771q0 126 -55 272q-5 14 -5 25q0 15 9.5 24.5t24.5 9.5q11 0 25 -5q146 -55 272 -55q65 0 168 13q28 3 44 -11q11 -11 11 -23q0 -16 -19 -35l-180 -181l610 -610q12 -12 12 -25q0 -15 -15 -30t-30 -15q-13 0 -25 12l-610 610l-181 -180 q-18 -18 -34 -18q-14 0 -26 12q-12 15 -9 42q13 103 13 168zM669 960q-28 -2 -56 -2q-110 0 -227 34q34 -117 34 -227q0 -28 -2 -56z" />
+<glyph unicode="&#x238c;" horiz-adv-x="1592" d="M1488 936q0 -39 -42 -39q-28 0 -39 32q-12 43 -54 139q-76 138 -212 221t-292 83q-316 0 -484 -255q-23 -52 -74 -140q33 2 76.5 2t147 -23.5t103.5 -66t-37 -42.5l-79 28q-79 28 -161.5 28t-168.5 -23q-19 -5 -25 -5q-17 0 -17 17q0 6 14 58.5t14 135.5t-27 161l-27 77 q0 38 42 38q48 0 69 -117q18 -98 18 -174q0 -14 -1 -28q181 411 617 411q204 0 413 -155q226 -166 226 -363zM1404 503q87 -87 87 -209t-86 -208t-209 -86t-209 86t-86 209t86 209t208 86t209 -87zM604 503q87 -87 87 -209t-86 -208t-209 -86t-209 86t-86 209t86 209t208 86 t209 -87zM1347 144q62 62 62 150t-63 151t-151 63t-150 -62t-62 -151t62 -151t151 -62t151 62zM547 144q62 62 62 150t-63 151t-151 63t-150 -62t-62 -151t62 -151t151 -62t151 62z" />
+<glyph unicode="&#x238d;" horiz-adv-x="1591" d="M1463 41q0 -41 -37 -41h-283q-37 0 -37 37v1231h-620v-1229q0 -39 -37 -39h-282q-39 0 -39 41t39 41h237v1229q0 39 39 39h708q37 0 37 -39v-1229h238q37 0 37 -41z" />
+<glyph unicode="&#x238e;" horiz-adv-x="1748" d="M1648 1309q0 -41 -63 -41q-173 0 -271.5 -110t-98.5 -285v-441q0 -182 -135 -307t-318 -125h-621q-41 0 -41 41t41 41h21q149 0 260 101t111 249v441q0 209 122.5 343t329.5 134h622q41 0 41 -41zM985 1268q-173 0 -271.5 -110t-98.5 -285v-441q0 -221 -188 -350h335 q149 0 260 101t111 249v441q0 264 181 395h-329z" />
+<glyph unicode="&#x238f;" horiz-adv-x="1591" d="M1466 707q9 -9 9 -26t-11 -28l-643 -643q-10 -10 -26 -10t-26 10l-642 642q-12 12 -12 27.5t10 25.5l573 573h-524q-39 0 -39 41t39 41h1245q37 0 37 -41t-37 -41h-524zM1376 681l-580 580l-581 -582l580 -580z" />
+<glyph unicode="&#x2390;" horiz-adv-x="1591" d="M1464 707q11 -11 11 -28t-9 -26l-571 -571h524q37 0 37 -41t-37 -41h-1245q-39 0 -39 41t39 41h524l-573 573q-10 10 -10 25.5t12 27.5l642 642q10 10 26 10t26 -10zM1376 679l-581 582l-580 -580l581 -582z" />
+<glyph unicode="&#x2391;" horiz-adv-x="1591" d="M1466 707q9 -9 9 -26t-11 -28l-643 -643q-10 -10 -26 -10t-26 10l-642 642q-12 12 -12 27.5t10 25.5l573 573h-524q-39 0 -39 41t39 41h1245q37 0 37 -41t-37 -41h-524zM1336 721l-540 540l-539 -540h1079zM1334 639h-1079l540 -540z" />
+<glyph unicode="&#x2392;" horiz-adv-x="1591" d="M1464 707q11 -11 11 -28t-9 -26l-571 -571h524q37 0 37 -41t-37 -41h-1245q-39 0 -39 41t39 41h524l-573 573q-10 10 -10 25.5t12 27.5l642 642q10 10 26 10t26 -10zM1334 721l-539 540l-540 -540h1079zM1336 639h-1079l539 -540z" />
+<glyph unicode="&#x2393;" horiz-adv-x="1591" d="M1456 432q0 -41 -37 -41h-283q-39 0 -39 41t39 41h283q37 0 37 -41zM1456 732q0 -41 -37 -41h-1245q-39 0 -39 41t39 41h1245q37 0 37 -41zM975 432q0 -41 -37 -41h-283q-39 0 -39 41t39 41h283q37 0 37 -41zM494 432q0 -41 -37 -41h-283q-39 0 -39 41t39 41h283 q37 0 37 -41z" />
+<glyph unicode="&#x2394;" horiz-adv-x="1654" d="M1636 582l-404 -702h-810l-404 702l404 702h810zM1521 582l-347 602h-694l-347 -602l347 -602h694z" />
+<glyph unicode="&#x2395;" horiz-adv-x="1591" d="M1488 39q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 82v1222h-1220v-1222h1220z" />
+<glyph unicode="&#x2396;" horiz-adv-x="700" d="M621 1344l-468 -698h-22l210 698h280z" />
+<glyph unicode="&#x2397;" horiz-adv-x="1760" d="M1248 1292h-82v106h-106v82h147q41 0 41 -41v-147zM952 1398h-224v82h224v-82zM620 1398h-224v82h224v-82zM288 1398h-106v-106h-82v147q0 41 41 41h147v-82zM1660 -359q0 -41 -41 -41h-1066q-41 0 -41 41v359h-116v82h116v437l-47 29l-82 -145l-168 387l297 34v215 q0 41 41 41h613v104h82v-104h371q41 0 41 -41v-1398zM182 960h-82v224h82v-224zM182 628h-82v224h82v-224zM182 296h-82v224h82v-224zM288 0h-147q-41 0 -41 41v147h82v-106h106v-82zM1578 -318v1316h-984v-164l46 5l-46 -81v-104q141 -93 260 -129q108 -32 258 -32h34v-149 q-18 -1 -63 -1q-239 0 -489 130v-791h984z" />
+<glyph unicode="&#x2398;" horiz-adv-x="1760" d="M1660 892h-82v106h-106v82h147q41 0 41 -41v-147zM1660 560h-82v224h82v-224zM1032 998h-224v82h224v-82zM1660 228h-82v224h82v-224zM1660 -104h-82v224h82v-224zM700 998h-106v-106h-82v147q0 41 41 41h147v-82zM1364 998h-224v82h26v318h-984v-1316h330v38h82v-224 h-82v104h-371q-41 0 -41 41v1398q0 41 41 41h1066q41 0 41 -41v-359h116v-82zM594 560h-82v33q-58 6 -122 6h-33v149q18 1 62 1t93 -5v40h82v-51q212 -41 444 -189l83 145l167 -387l-425 -49l89 156q-202 139 -358 172v-21zM1660 -359q0 -41 -41 -41h-147v82h106v106h82 v-147zM594 228h-82v224h82v-224zM1364 -400h-224v82h224v-82zM1032 -400h-224v82h224v-82zM700 -400h-147q-41 0 -41 41v147h82v-106h106v-82z" />
+<glyph unicode="&#x2399;" horiz-adv-x="2100" d="M2000 37q0 -288 -90.5 -378.5t-378.5 -90.5h-962q-288 0 -378.5 90.5t-90.5 378.5v543q0 270 77 364t314 103v147l402 402h716v-549q237 -9 314 -103t77 -364v-543zM880 1208v259l-259 -259h259zM1527 226v1288h-565v-388h-389v-900h954zM1918 37v543q0 237 -55 308 t-254 77v-821h-1118v821q-199 -6 -254 -77t-55 -308v-543q0 -254 66.5 -320.5t320.5 -66.5h962q254 0 320.5 66.5t66.5 320.5z" />
+<glyph unicode="&#x239a;" horiz-adv-x="2100" d="M2000 469q0 -288 -90.5 -378.5t-378.5 -90.5h-962q-288 0 -378.5 90.5t-90.5 378.5v543q0 288 90 378t379 90h962q289 0 379 -90t90 -378v-543zM1918 469v543q0 254 -66 320t-321 66h-962q-255 0 -321 -66t-66 -320v-543q0 -254 66.5 -320.5t320.5 -66.5h962 q254 0 320.5 66.5t66.5 320.5zM1798 1123l-1229 -928q-31 0 -70 2l1287 980q8 -26 12 -54zM1704 1263l-1345 -1024q-19 16 -33 38l1316 1002q31 -5 62 -16zM1456 1285l-1159 -882q-2 32 -2 62l1077 820h84z" />
+<glyph unicode="&#x239b;" horiz-adv-x="1024" d="M940 1178q0 -19 -41 -43q-237 -140 -410 -415q-264 -419 -264 -1055v-107h-120v107q0 414 118 756q138 397 416 631q51 43 141 98.5t125 55.5t35 -28zM0 1606zM1024 -442z" />
+<glyph unicode="&#x239c;" horiz-adv-x="1024" d="M225 -442h-120v2048h120v-2048zM0 1606zM1024 -442z" />
+<glyph unicode="&#x239d;" horiz-adv-x="1024" d="M940 -14q0 -28 -35 -28t-125 55.5t-141 98.5q-278 234 -416 631q-118 342 -118 756v107h120v-107q0 -636 264 -1055q173 -275 410 -415q41 -24 41 -43zM0 1606zM1024 -442z" />
+<glyph unicode="&#x239e;" horiz-adv-x="1024" d="M919 -442h-120v107q0 636 -264 1055q-173 275 -410 415q-41 24 -41 43q0 28 35 28t125 -55.5t141 -98.5q278 -234 416 -631q118 -342 118 -756v-107zM0 1606zM1024 -442z" />
+<glyph unicode="&#x239f;" horiz-adv-x="1024" d="M919 -442h-120v2048h120v-2048zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23a0;" horiz-adv-x="1024" d="M919 1499q0 -414 -118 -756q-138 -397 -416 -631q-51 -43 -141 -98.5t-125 -55.5t-35 28q0 19 41 43q237 140 410 415q264 419 264 1055v107h120v-107zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23a1;" horiz-adv-x="1024" d="M864 642q55 0 55 -60t-55 -60h-639v-964h-120v1029q0 55 59 55h700zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23a2;" horiz-adv-x="1024" d="M225 -442h-120v2048h120v-2048zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23a3;" horiz-adv-x="1024" d="M864 642q55 0 55 -60t-55 -60h-700q-22 0 -40.5 17t-18.5 40v1027h120v-964h639zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23a4;" horiz-adv-x="1024" d="M919 -442h-120v964h-639q-55 0 -55 60t55 60h700q22 0 40.5 -17t18.5 -40v-1027zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23a5;" horiz-adv-x="1024" d="M919 -442h-120v2048h120v-2048zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23a6;" horiz-adv-x="1024" d="M919 577q0 -55 -59 -55h-700q-55 0 -55 60t55 60h639v964h120v-1029zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23a7;" horiz-adv-x="1024" d="M882 582q0 -31 -28 -31q-104 0 -189.5 -60t-85.5 -156v-777h-134v777q0 145 143 219q111 59 266 59q28 0 28 -31zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23a8;" horiz-adv-x="1024" d="M579 -442h-134v770q0 104 -80 163.5t-195 59.5q-28 0 -28 31t28 31q115 0 195 59.5t80 163.5v770h134v-770q0 -186 -212 -254q212 -68 212 -254v-770zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23a9;" horiz-adv-x="1024" d="M882 582q0 -31 -28 -31q-155 0 -266 59q-143 74 -143 219v777h134v-777q0 -96 85.5 -156t189.5 -60q28 0 28 -31zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23aa;" horiz-adv-x="1024" d="M579 -442h-134v2048h134v-2048zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23ab;" horiz-adv-x="1024" d="M579 -442h-134v777q0 96 -85.5 156t-189.5 60q-28 0 -28 31t28 31q155 0 266 -59q143 -74 143 -219v-777zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23ac;" horiz-adv-x="1024" d="M882 582q0 -31 -28 -31q-115 0 -195 -59.5t-80 -163.5v-770h-134v770q0 186 212 254q-212 68 -212 254v770h134v-770q0 -104 80 -163.5t195 -59.5q28 0 28 -31zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23ad;" horiz-adv-x="1024" d="M579 829q0 -145 -143 -219q-111 -59 -266 -59q-28 0 -28 31t28 31q104 0 189.5 60t85.5 156v777h134v-777zM0 1606zM1024 -442z" />
+<glyph unicode="&#x23ae;" horiz-adv-x="1329" d="M795 -442h-216v2048h216v-2048zM0 1606zM1329 -442z" />
+<glyph unicode="&#x23af;" d="M2131 582q0 -41 -39 -41h-2138q-39 0 -39 41t39 41h2138q39 0 39 -41z" />
+<glyph unicode="&#x23b0;" horiz-adv-x="1024" d="M916 1606q37 0 37 -25t-39 -32q-29 -2 -59 -5q-167 -28 -241.5 -123t-74.5 -266v-1216q0 -208 -107.5 -294.5t-320.5 -86.5q-40 0 -40 27q0 24 39 31q29 2 59 5q165 28 225 129q48 82 48 261v1215q0 380 474 380z" />
+<glyph unicode="&#x23b1;" horiz-adv-x="1024" d="M953 -415q0 -27 -40 -27q-213 0 -320.5 86.5t-107.5 294.5v1216q0 171 -74.5 266t-241.5 123q-30 3 -59 5q-39 7 -39 32t37 25q474 0 474 -380v-1215q0 -179 48 -261q60 -101 225 -129q30 -3 59 -5q39 -7 39 -31z" />
+<glyph unicode="&#x23b2;" horiz-adv-x="2636" d="M1287 745h-894l852 -1169q7 -10 7 -18h-273l-869 1197q-10 14 -10 54t27 40h2186l223 -604h-74q-116 320 -491 431q-232 69 -684 69z" />
+<glyph unicode="&#x23b3;" horiz-adv-x="2636" d="M127 315q-26 0 -26 30q0 6 947 1166l-69 95h273q0 -9 -7 -18l-921 -1124h976q451 0 679 68q373 110 483 431h74l-223 -648h-2186z" />
+<glyph unicode="&#x23b4;" horiz-adv-x="1864" d="M1864 -356q0 -62 -40.5 -62t-40.5 68v309h-1701v-309q0 -68 -41 -68t-41 62v397h1864v-397z" />
+<glyph unicode="&#x23b5;" horiz-adv-x="1864" d="M1864 -41h-1864v397q0 62 40.5 62t40.5 -68v-309h1701v309q0 68 41 68t41 -62v-397z" />
+<glyph unicode="&#x23b6;" horiz-adv-x="1864" d="M1864 363h-1864v397q0 62 40.5 62t40.5 -68v-309h1701v309q0 68 41 68t41 -62v-397zM1864 -356q0 -62 -40.5 -62t-40.5 68v309h-1701v-309q0 -68 -41 -68t-41 62v397h1864v-397z" />
+<glyph unicode="&#x23b7;" horiz-adv-x="1364" d="M1405 1565q0 -8 -2 -14l-610 -1975q-6 -18 -56 -18q-13 0 -18 12l-408 897q-129 -98 -135 -98q-29 0 -29 29q0 9 9 16l243 184q8 6 18.5 6t16.5 -14l350 -769l545 1766q6 19 35 19q41 0 41 -41z" />
+<glyph unicode="&#x23b8;" horiz-adv-x="1591" d="M282 -4q0 -39 -41 -39t-41 39v1175q0 37 41 37t41 -37v-1175z" />
+<glyph unicode="&#x23b9;" horiz-adv-x="1591" d="M1391 -4q0 -39 -41 -39t-41 39v1175q0 37 41 37t41 -37v-1175z" />
+<glyph unicode="&#x23ba;" horiz-adv-x="1591" d="M1391 1167q0 -41 -37 -41h-1115q-39 0 -39 41t39 41h1115q37 0 37 -41z" />
+<glyph unicode="&#x23bb;" horiz-adv-x="1591" d="M1391 1167q0 -41 -37 -41h-1115q-39 0 -39 41t39 41h1115q37 0 37 -41z" />
+<glyph unicode="&#x23bc;" horiz-adv-x="1591" d="M1391 1167q0 -41 -37 -41h-1115q-39 0 -39 41t39 41h1115q37 0 37 -41z" />
+<glyph unicode="&#x23bd;" horiz-adv-x="1591" d="M1391 1167q0 -41 -37 -41h-1115q-39 0 -39 41t39 41h1115q37 0 37 -41z" />
+<glyph unicode="&#x23be;" horiz-adv-x="577" d="M437 1050q40 0 40 -30.5t-44 -30.5h-272v-946q0 -44 -30.5 -44t-30.5 45v961q0 30 10.5 37.5t34.5 7.5h292z" />
+<glyph unicode="&#x23bf;" horiz-adv-x="577" d="M433 61q44 0 44 -30.5t-44 -30.5h-288q-30 0 -37.5 10.5t-7.5 34.5v961q0 45 30.5 45t30.5 -44v-946h272z" />
+<glyph unicode="&#x23c0;" horiz-adv-x="1210" d="M994 944q142 -153 142 -361.5t-142.5 -361.5t-347.5 -169v-187q0 -39 -41 -39t-41 39v187q-206 16 -348 169t-142 362t141.5 361.5t348.5 167.5v225q0 37 41 37t41 -37v-225q206 -15 348 -168zM935.5 279q118.5 129 118.5 303.5t-118 303t-290 144.5v-896 q171 16 289.5 145zM273.5 886.5q-117.5 -128.5 -117.5 -303.5t118 -304t290 -145v896q-173 -15 -290.5 -143.5z" />
+<glyph unicode="&#x23c1;" horiz-adv-x="1210" d="M994 944q142 -153 142 -361.5t-142.5 -361.5t-347.5 -169v-187q0 -39 -41 -39t-41 39v187q-206 16 -348 169t-142 362t141.5 361.5t348.5 167.5v180h-355q-39 0 -39 41t39 41h794q37 0 37 -41t-37 -41h-357v-180q206 -15 348 -168zM935.5 279q118.5 129 118.5 303.5 t-118 303t-290 144.5v-896q171 16 289.5 145zM273.5 886.5q-117.5 -128.5 -117.5 -303.5t118 -304t290 -145v896q-173 -15 -290.5 -143.5z" />
+<glyph unicode="&#x23c2;" horiz-adv-x="1210" d="M994 944q142 -153 142 -361.5t-142.5 -361.5t-347.5 -169v-144h357q37 0 37 -41t-37 -41h-794q-39 0 -39 41t39 41h355v144q-206 16 -348 169t-142 362t141.5 361.5t348.5 167.5v223q0 39 41 39t41 -39v-223q206 -15 348 -168zM935.5 279q118.5 129 118.5 303.5t-118 303 t-290 144.5v-896q171 16 289.5 145zM273.5 886.5q-117.5 -128.5 -117.5 -303.5t118 -304t290 -145v896q-173 -15 -290.5 -143.5z" />
+<glyph unicode="&#x23c3;" horiz-adv-x="1210" d="M1158 94q0 -35 -43 -35h-469v-194q0 -39 -41 -39t-41 39v194h-469q-43 0 -43 35q0 12 6 24l506 1002v217q0 37 41 37t41 -37v-217l506 -1002q6 -12 6 -24zM646 141h402l-402 797v-797zM564 141v797l-402 -797h402z" />
+<glyph unicode="&#x23c4;" horiz-adv-x="1210" d="M1158 94q0 -35 -43 -35h-469v-194q0 -39 -41 -39t-41 39v194h-469q-43 0 -43 35q0 12 6 24l506 1002v172h-355q-39 0 -39 41t39 41h794q37 0 37 -41t-37 -41h-357v-172l506 -1002q6 -12 6 -24zM646 141h402l-402 797v-797zM564 141v797l-402 -797h402z" />
+<glyph unicode="&#x23c5;" horiz-adv-x="1210" d="M1158 94q0 -35 -43 -35h-469v-151h357q37 0 37 -41t-37 -41h-794q-39 0 -39 41t39 41h355v151h-469q-43 0 -43 35q0 12 6 24l506 1002v215q0 39 41 39t41 -39v-215l506 -1002q6 -12 6 -24zM646 141h402l-402 797v-797zM564 141v797l-402 -797h402z" />
+<glyph unicode="&#x23c6;" horiz-adv-x="1210" d="M1167 730q0 -130 -80.5 -241t-196 -111t-244.5 111v-624q0 -39 -41 -39t-41 39v697q-130 112 -235 112q-126 0 -189 -123q-12 -24 -30 -127q-8 -47 -32 -47q-35 0 -35 57q0 130 80 241t196.5 111t244.5 -110v661q0 37 41 37t41 -37v-733q131 -114 235 -114q145 0 201 152 q2 5 18 98q8 47 32 47q35 0 35 -57z" />
+<glyph unicode="&#x23c7;" horiz-adv-x="1210" d="M1167 730q0 -130 -80.5 -241t-196 -111t-244.5 111v-624q0 -39 -41 -39t-41 39v697q-130 112 -235 112q-126 0 -189 -123q-12 -24 -30 -127q-8 -47 -32 -47q-35 0 -35 57q0 130 80 241t196.5 111t244.5 -110v616h-355q-39 0 -39 41t39 41h794q37 0 37 -41t-37 -41h-357 v-688q131 -114 235 -114q145 0 201 152q2 5 18 98q8 47 32 47q35 0 35 -57z" />
+<glyph unicode="&#x23c8;" horiz-adv-x="1210" d="M1167 730q0 -130 -80.5 -241t-196 -111t-244.5 111v-581h357q37 0 37 -41t-37 -41h-794q-39 0 -39 41t39 41h355v654q-130 112 -235 112q-126 0 -189 -123q-12 -24 -30 -127q-8 -47 -32 -47q-35 0 -35 57q0 130 80 241t196.5 111t244.5 -110v659q0 39 41 39t41 -39v-731 q131 -114 235 -114q145 0 201 152q2 5 18 98q8 47 32 47q35 0 35 -57z" />
+<glyph unicode="&#x23c9;" horiz-adv-x="1210" d="M1040 1333q0 -41 -37 -41h-357v-1427q0 -39 -41 -39t-41 39v1427h-355q-39 0 -39 41t39 41h794q37 0 37 -41z" />
+<glyph unicode="&#x23ca;" horiz-adv-x="1210" d="M1040 -133q0 -41 -37 -41h-794q-39 0 -39 41t39 41h355v1427q0 39 41 39t41 -39v-1427h357q37 0 37 -41z" />
+<glyph unicode="&#x23cb;" horiz-adv-x="577" d="M477 44q0 -45 -30.5 -45t-30.5 44v946h-273q-43 0 -43 30.5t39 30.5h293q30 0 37.5 -10.5t7.5 -34.5v-961z" />
+<glyph unicode="&#x23cc;" horiz-adv-x="577" d="M477 45q0 -30 -10.5 -37.5t-34.5 -7.5h-289q-43 0 -43 30.5t43 30.5h273v946q0 44 30.5 44t30.5 -45v-961z" />
+<glyph unicode="&#x23cd;" horiz-adv-x="1372" d="M781 1050l-286 -538h-56l162 538h180zM1272 45q0 -31 -11.5 -38t-33.5 -7h-1082q-45 0 -45 40v965q0 30 10.5 37.5t34.5 7.5h292q40 0 40 -30.5t-44 -30.5h-272v-928h1050v928h-272q-44 0 -44 30.5t40 30.5h292q30 0 37.5 -10.5t7.5 -34.5v-960z" />
+<glyph unicode="&#x23ce;" horiz-adv-x="1757" d="M1587 913q0 -65 -36 -101l-632 -629q-38 -38 -183 -38v-206q0 -46 -35 -46q-18 0 -35 17l-484 485q-12 12 -12 29t12 29l484 485q17 17 35 17q35 0 35 -46v-206h292v741q0 46 35 46q18 0 35 -17l209 -210l210 210q17 17 35 17q35 0 35 -46v-531zM1505 913v432l-169 -169 q-11 -11 -28.5 -11t-28.5 11l-169 169v-642h215l168 167q12 12 12 43zM695 621q-41 0 -41 41v148l-385 -386l385 -386v148q0 41 41 41q152 0 166 14l381 380h-547z" />
+<glyph unicode="&#x23cf;" horiz-adv-x="1628" d="M1406 512h-1184l592 984zM1406 0h-1184v300h1184v-300z" />
+<glyph unicode="&#x23d0;" horiz-adv-x="1024" d="M553 -401q0 -41 -41 -41t-41 41v1966q0 41 41 41t41 -41v-1966z" />
+<glyph unicode="&#x23d1;" horiz-adv-x="1110" d="M1090 429q0 -7 -15 -27q-204 -268 -520 -268t-520 268q-15 20 -15 27q0 18 20 18q11 0 40 -27q184 -173 475 -173t475 173q29 27 40 27q20 0 20 -18z" />
+<glyph unicode="&#x23d2;" horiz-adv-x="1110" d="M1090 429q0 -7 -15 -27q-204 -268 -520 -268t-520 268q-15 20 -15 27q0 18 20 18q11 0 40 -27q184 -173 475 -173t475 173q29 27 40 27q20 0 20 -18zM1090 632q0 -41 -37 -41h-994q-39 0 -39 41t39 41h994q37 0 37 -41z" />
+<glyph unicode="&#x23d3;" horiz-adv-x="1110" d="M1090 829q0 -7 -15 -27q-204 -268 -520 -268t-520 268q-15 20 -15 27q0 18 20 18q11 0 40 -27q184 -173 475 -173t475 173q29 27 40 27q20 0 20 -18zM1090 332q0 -41 -37 -41h-994q-39 0 -39 41t39 41h994q37 0 37 -41z" />
+<glyph unicode="&#x23d4;" horiz-adv-x="2220" d="M2200 429q0 -7 -15 -27q-204 -268 -520 -268t-520 268q-15 20 -15 27q0 18 20 18q11 0 40 -27q184 -173 475 -173t475 173q29 27 40 27q20 0 20 -18zM1090 429q0 -7 -15 -27q-204 -268 -520 -268t-520 268q-15 20 -15 27q0 18 20 18q11 0 40 -27q184 -173 475 -173 t475 173q29 27 40 27q20 0 20 -18zM2200 632q0 -41 -37 -41h-2104q-39 0 -39 41t39 41h2104q37 0 37 -41z" />
+<glyph unicode="&#x23d5;" horiz-adv-x="2220" d="M2200 829q0 -7 -15 -27q-204 -268 -520 -268t-520 268q-15 20 -15 27q0 18 20 18q11 0 40 -27q184 -173 475 -173t475 173q29 27 40 27q20 0 20 -18zM1090 829q0 -7 -15 -27q-204 -268 -520 -268t-520 268q-15 20 -15 27q0 18 20 18q11 0 40 -27q184 -173 475 -173 t475 173q29 27 40 27q20 0 20 -18zM2200 332q0 -41 -37 -41h-2104q-39 0 -39 41t39 41h2104q37 0 37 -41z" />
+<glyph unicode="&#x23d6;" horiz-adv-x="2220" d="M2200 429q0 -7 -15 -27q-204 -268 -537.5 -268t-537.5 262q-204 -262 -537.5 -262t-537.5 268q-15 20 -15 27q0 18 20 18q11 0 40 -27q184 -173 495 -173t495 173q29 27 40 27t40 -27q184 -173 495 -173t495 173q29 27 40 27q20 0 20 -18z" />
+<glyph unicode="&#x23d7;" horiz-adv-x="1110" d="M1090 41q0 -41 -37 -41h-994q-39 0 -39 41t39 41h949v432q0 37 41 37t41 -37v-473z" />
+<glyph unicode="&#x23d8;" horiz-adv-x="1110" d="M1090 41q0 -41 -37 -41h-996q-37 0 -37 41v473q0 37 41 37t41 -37v-432h906v432q0 37 41 37t41 -37v-473z" />
+<glyph unicode="&#x23d9;" horiz-adv-x="1110" d="M1090 41q0 -41 -37 -41h-996q-37 0 -37 41v473q0 37 41 37t41 -37v-432h412v432q0 37 41 37t41 -37v-432h412v432q0 37 41 37t41 -37v-473z" />
+<glyph unicode="&#x23da;" horiz-adv-x="1480" d="M1451 513q0 -41 -37 -41h-1346q-39 0 -39 41t39 41h631v898q0 37 41 37t41 -37v-898h633q37 0 37 -41zM1301 236q0 -41 -37 -41h-1046q-39 0 -39 41t39 41h1046q37 0 37 -41zM1151 -41q0 -41 -37 -41h-746q-39 0 -39 41t39 41h746q37 0 37 -41zM1001 -318q0 -41 -37 -41 h-446q-39 0 -39 41t39 41h446q37 0 37 -41z" />
+<glyph unicode="&#x23db;" d="M1878 390q0 -40 -36 -40h-194v-313q0 -37 -37 -37h-1203q-35 0 -35 37v313h-165q-38 0 -38 40t38 40h165v319q0 35 35 35h1203q37 0 37 -35v-319h194q36 0 36 -40zM1569 430v275h-1117v-275h1117zM1569 79v271h-1117v-271h1117z" />
+<glyph unicode="&#x23dc;" horiz-adv-x="1864" d="M1864 -210q0 -24 -27 -24q-11 0 -20 11q-33 44 -105 127q-291 293 -780 293t-780 -293q-24 -24 -105 -127q-9 -11 -20 -11q-27 0 -27 24q0 10 5 17q153 229 400.5 356.5t526.5 127.5t526.5 -127.5t400.5 -356.5q5 -7 5 -17z" />
+<glyph unicode="&#x23dd;" horiz-adv-x="1864" d="M1864 267q0 -10 -5 -17q-153 -229 -400.5 -356.5t-526.5 -127.5t-526.5 127.5t-400.5 356.5q-5 7 -5 17q0 24 27 24q11 0 20 -11q33 -44 105 -127q291 -293 780 -293t780 293q24 24 105 127q9 11 20 11q27 0 27 -24z" />
+<glyph unicode="&#x23de;" horiz-adv-x="1864" d="M1864 -332q0 -41 -20.5 -41t-24.5 18q-9 154 -94 237q-43 42 -114 54q-34 5 -129 5h-277q-89 0 -132 21q-96 47 -141 202q-45 -155 -141 -202q-42 -21 -131 -21h-277q-95 0 -129 -5q-71 -12 -114 -54q-85 -83 -94 -237q-4 -18 -23 -18q-23 0 -23 41q0 174 78 285 q51 73 116 93q42 13 149 13h313q117 0 181 72t73 190q2 33 21 33t22 -18t4 -35q31 -242 252 -242h313q107 0 149 -13q65 -20 116 -93q77 -109 77 -285z" />
+<glyph unicode="&#x23df;" horiz-adv-x="1864" d="M1864 332q0 -174 -78 -285q-51 -73 -116 -93q-42 -13 -149 -13h-313q-117 0 -181 -72t-73 -190q-2 -33 -21 -33t-22 18t-4 35q-31 242 -252 242h-313q-107 0 -149 13q-65 20 -116 93q-77 109 -77 285q0 41 20.5 41t24.5 -18q9 -154 94 -237q43 -42 114 -54q34 -5 129 -5 h277q89 0 132 -21q96 -47 141 -202q45 155 141 202q42 21 131 21h277q95 0 129 5q71 12 114 54q85 83 94 237q4 18 23 18q23 0 23 -41z" />
+<glyph unicode="&#x23e0;" horiz-adv-x="1864" d="M1442 -56h-1020q-47 0 -188.5 -122.5t-161.5 -155.5h-72l287 390h1290l287 -390h-72q-20 33 -161.5 155.5t-188.5 122.5z" />
+<glyph unicode="&#x23e1;" horiz-adv-x="1864" d="M422 56h1020q47 0 188.5 122.5t161.5 155.5h72l-287 -390h-1290l-287 390h72q20 -33 161.5 -155.5t188.5 -122.5z" />
+<glyph unicode="&#x23e2;" horiz-adv-x="1591" d="M1556 78q0 -78 -83 -78h-1283q-34 0 -58 24t-24 58v6l93 1222q2 31 26.5 53.5t55.5 22.5h725q57 0 77 -53l465 -1222q6 -16 6 -33zM1473 82l-465 1222h-725l-93 -1222h1283z" />
+<glyph unicode="&#x23e3;" horiz-adv-x="1864" d="M1694 166q0 -24 -21 -36l-721 -416q-5 -3 -20 -3t-20 3l-721 416q-21 12 -21 36v832q0 24 21 36l721 416q5 3 20 3t20 -3l721 -416q21 -12 21 -36v-832zM1612 190v784l-680 393l-680 -393v-784l680 -393zM1401 582q0 -192 -138.5 -330.5t-331 -138.5t-330.5 138t-138 331 t138 331t330.5 138t331 -138.5t138.5 -330.5zM1319 582q0 158 -114.5 272.5t-273 114.5t-272.5 -114t-114 -273t114 -273t272.5 -114t273 114.5t114.5 272.5z" />
+<glyph unicode="&#x23e4;" horiz-adv-x="1930" d="M1780 582q0 -41 -37 -41h-1554q-39 0 -39 41t39 41h1554q37 0 37 -41z" />
+<glyph unicode="&#x23e5;" horiz-adv-x="1930" d="M1815 823q0 -12 -8 -26l-448 -776q-12 -21 -36 -21h-1165q-43 0 -43 35q0 12 8 26l448 776q12 21 36 21h1165q43 0 43 -35zM1700 776h-1070l-400 -694h1070z" />
+<glyph unicode="&#x23e6;" horiz-adv-x="1674" d="M1559 584q0 -14 -11 -27q-105 -121 -164 -167q-101 -78 -203 -78t-199 72q-62 46 -161 157h-667q-39 0 -39 41q0 14 11 27q105 121 164 167q101 78 204 78t201 -72q65 -48 162 -159h663q39 0 39 -39zM931 541q138 -147 247.5 -147t247.5 147h-495zM747 623 q-139 149 -250.5 149t-250.5 -149h501z" />
+<glyph unicode="&#x23e7;" d="M1801 916q0 -25 -24 -36l-629 -279q8 -30 8 -59q0 -113 -90 -186l387 -698q6 -11 6 -21q0 -41 -43 -41q-23 0 -35 22l-386 698q-39 -14 -80.5 -14t-84.5 17l-411 -684q-13 -21 -34 -21q-43 0 -43 41q0 12 6 22l412 684q-84 73 -84 181q0 154 143 219l-166 668q-2 8 -2 11 q0 40 43 40q30 0 38 -32l167 -667q13 1 17 1q125 0 198 -107l629 280q9 4 19 4q39 0 39 -43zM640 1071q0 -11 -22 -46q-48 -75 -80 -204q-13 -52 -34 -52q-17 0 -46 32q-89 98 -166 142q-45 26 -45 46q0 32 33.5 32t146.5 -91l-108 433q-2 8 -2 11q0 40 43 40q30 0 38 -32 l108 -432q64 152 103 152q31 0 31 -31z" />
+<glyph unicode="&#x23e8;" horiz-adv-x="1401" d="M1276 514q63 -111 63 -325.5t-59 -321.5q-91 -166 -273.5 -166t-273.5 144q-71 112 -71 331t58 328q91 170 278 170t278 -160zM1190 116v173q0 335 -190 335t-190 -336q0 -27 0.5 -80.5t0.5 -80.5q0 -158 25 -238q42 -138 164 -138q190 0 190 365zM142 -206l84 -2 q93 0 106 24q5 9 5 30v708q-80 -31 -204 -31v62q193 0 290 89h12q38 0 38 -45v-786q0 -18 5 -28q11 -21 175 -21h15v-64q-67 5 -105 5h-316q-38 0 -105 -5v64z" />
+<glyph unicode="&#x23e9;" d="M1942 628l-836 -628v1256zM1042 628l-836 -628v1256z" />
+<glyph unicode="&#x23ea;" d="M1842 0l-836 628l836 628v-1256zM942 0l-836 628l836 628v-1256z" />
+<glyph unicode="&#x23eb;" horiz-adv-x="1656" d="M1456 664h-1256l628 836zM1456 -236h-1256l628 836z" />
+<glyph unicode="&#x23ec;" horiz-adv-x="1656" d="M1456 1400l-628 -836l-628 836h1256zM1456 500l-628 -836l-628 836h1256z" />
+<glyph unicode="&#x23ed;" d="M1918 0h-233v1256h233v-1256zM1577 628l-689 -628v1256zM834 628l-689 -628v1256z" />
+<glyph unicode="&#x23ee;" d="M1903 0l-689 628l689 628v-1256zM1160 0l-689 628l689 628v-1256zM363 0h-233v1256h233v-1256z" />
+<glyph unicode="&#x23ef;" d="M1750 0h-233v1256h233v-1256zM1236 0h-233v1256h233v-1256zM895 628l-689 -628v1256z" />
+<glyph unicode="&#x23f0;" d="M1900 1145q0 -71 -40 -141l-630 357q81 143 235 143q85 0 184 -47l35 61l78 -44l-34 -61q172 -115 172 -268zM148 1145q0 153 172 268l-34 61l78 44l35 -61q99 47 184 47q154 0 235 -143l-630 -357q-40 70 -40 141zM1782 470q0 -357 -276 -585l156 -227q10 -15 10 -30 q0 -44 -44 -44q-18 0 -35 17l-202 206q-171 -95 -367 -95t-367 95l-202 -206q-17 -17 -35 -17q-44 0 -44 44q0 15 10 30l156 227q-276 228 -276 585q0 310 216.5 530.5t525.5 227.5v146h-85q-50 0 -50 50t50 50h202q50 0 50 -50t-50 -50h-85v-146q309 -7 525.5 -227.5 t216.5 -530.5zM1511 440v60h85q-6 122 -61 230l-74 -42l-30 51l74 43q-67 102 -169 169l-43 -74l-51 30l42 74q-108 55 -230 61v-85h-60v85q-122 -6 -230 -61l42 -74l-51 -30l-43 74q-102 -67 -169 -169l74 -43l-30 -51l-74 42q-55 -108 -61 -230h85v-60h-85q6 -122 61 -230 l74 42l30 -51l-74 -43q67 -102 169 -169l43 74l51 -30l-42 -74q108 -55 230 -61v85h60v-85q122 6 230 61l-42 74l51 30l43 -74q102 67 169 169l-74 43l30 51l74 -42q55 108 61 230h-85zM1072 462q-6 -41 -50.5 -41t-46.5 46l-206 156l36 48l204 -154q7 2 16 2t19 -4l373 224 l31 -52z" />
+<glyph unicode="&#x23f1;" d="M1802 1240l-111 -112l-116 112l112 115zM1176 1419h-299v159h299v-159zM1591.5 1148.5q231.5 -230.5 231.5 -565t-233 -564.5t-566 -230t-566 230t-233 564.5t231.5 565t567.5 230.5t567.5 -230.5zM1516.5 92.5q199.5 196.5 199.5 488.5t-200.5 491.5t-491.5 199.5 t-491.5 -199.5t-200.5 -491.5t199.5 -488.5t492.5 -196.5t492.5 196.5zM1369 1107q-12 -18 -31 -56q-20 11 -56 38l35 56zM1586 865l-56 -31q-12 20 -31 60l59 27q10 -18 28 -56zM1652 551h-66v66h66v-66zM1065 1049v-578h-78v577h-47l84 170l86 -169h-45zM1586 295l-35 -55 q-24 12 -55 38l31 52q4 -2 59 -35zM766 1089q-2 -2 -56 -38q-5 12 -31 56q18 12 52 38zM1369 54l-56 -31q-19 28 -31 59q23 14 56 27q12 -18 31 -55zM549 894l-31 -60l-56 31q10 18 28 56zM462 551h-66v66h66v-66zM1060 -47h-66v66h66v-66zM552 278q-2 -5 -55 -38l-35 55 q19 12 59 35zM766 82q-12 -31 -31 -59l-56 31q5 11 31 55q33 -13 56 -27z" />
+<glyph unicode="&#x23f2;" d="M1942 586q0 -468 -391 -754q-220 -162 -523 -162q-379 0 -650.5 267t-271.5 644.5t269.5 647t647 269.5t648.5 -267t271 -645zM1816 588q0 192 -75 338q-110 214 -297 332t-424 118q-325 0 -558 -232.5t-233 -558t233.5 -557.5t560 -232t560 232.5t233.5 559.5zM1662 909 q-9 -4 -63 -36l-36 64l68 44zM1413 1190l-36 -64l-67 40q0 1 36 60q32 -13 67 -36zM991 1272v11q0 11 -3 23h76v-74q-31 1 -50 1t-26 -1q3 32 3 40zM1667 548v79q14 -2 31 -2h11q15 0 33 3l1 -80h-76zM735 1162q-22 -12 -68 -32l-36 60q32 24 64 40q14 -22 40 -68zM1663 259 q-14 -35 -36 -68l-64 36l36 67q22 -11 64 -35zM1164 599q0 -54 -42 -106.5t-95 -52.5t-153 78l-231 201q-25 21 -83.5 59.5t-58.5 64.5t15.5 47.5t39.5 21.5q-5 0 147 -61l268 -94q193 -80 193 -158zM482 942l-36 -69l-68 40q14 21 36 64zM1413 -22l-63 -40l-36 63 q10 10 60 40zM988 -59h76v-77q-14 2 -33 2t-43 -2v77zM374 545h-76v74q14 -2 32 -2h10q16 0 34 3v-75zM482 231q-31 -23 -59 -40q-7 1 -41 56q24 25 56 44q20 -20 44 -60zM727 9q-13 -32 -36 -67q-6 4 -63 36l35 67z" />
+<glyph unicode="&#x23f3;" horiz-adv-x="1552" d="M966 594q281 -199 287 -815h141q58 0 58 -73.5t-58 -73.5h-1236q-58 0 -58 71q0 26 14.5 51t38.5 25h146q0 602 287 808q-281 199 -287 815h-141q-58 0 -58 73.5t58 73.5h1236q58 0 58 -71q0 -26 -14.5 -51t-38.5 -25h-146q0 -602 -287 -808zM989 437q-17 21 -73 68.5 t-56 88t48 81.5q25 21 73 69q171 205 172 658h-754q4 -463 164 -658q17 -21 73 -68.5t56 -88t-48 -81.5q-25 -21 -73 -69q-171 -205 -172 -658h754q-4 463 -164 658zM1028 926q-10 -26 -22 -50h-465q-12 23 -23 50h510zM981 830q-17 -28 -35 -50h-341q-22 27 -37 50h413z M914 747q-19 -16 -56 -50h-170l-54 50h280zM801 175h-50v455h50v-455zM1085 55h-614l9 50h597q3 -17 8 -50zM1097 -60h-641q3 32 5 50h632q2 -23 4 -50zM451 -146q0 17 2 50h646l2 -50h-650z" />
+<glyph unicode="&#x23f4;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x23f5;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x23f6;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x23f7;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x23f8;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x23f9;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x23fa;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x23fb;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x23fc;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x23fd;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x23fe;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x23ff;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2400;" d="M2016 1350h-98v126h-126v98h224v-224zM1664 1476h-224v98h224v-98zM2016 998h-98v224h98v-224zM1312 1476h-224v98h224v-98zM2016 646h-98v224h98v-224zM960 1476h-224v98h224v-98zM2016 294h-98v224h98v-224zM608 1476h-224v98h224v-98zM2016 -58h-98v224h98v-224z M256 1476h-126v-126h-98v224h224v-98zM2016 -410h-224v98h126v126h98v-224zM130 998h-98v224h98v-224zM1664 -410h-224v98h224v-98zM130 646h-98v224h98v-224zM1312 -410h-224v98h224v-98zM130 294h-98v224h98v-224zM960 -410h-224v98h224v-98zM130 -58h-98v224h98v-224z M608 -410h-224v98h224v-98zM256 -410h-224v224h98v-126h126v-98z" />
+<glyph unicode="&#x2401;" d="M1879 582q0 -356 -249.5 -605.5t-606 -249.5t-605.5 249t-249 606t249 606t605.5 249t606 -249.5t249.5 -605.5zM1716 582q0 289 -201.5 490.5t-490.5 201.5t-490.5 -201.5t-201.5 -490.5t201.5 -490.5t490.5 -201.5t490.5 201.5t201.5 490.5zM1431 854q0 -56 -39.5 -96 t-95.5 -40t-96.5 40t-40.5 96t40.5 95.5t96.5 39.5t95.5 -39.5t39.5 -95.5zM849 950q40 -39 40 -95.5t-40.5 -96.5t-96.5 -40t-95.5 40t-39.5 96t39.5 95.5t96 39.5t96.5 -39zM1024 25q-219 0 -358 143.5t-171 366.5h122q79 -332 407 -332t407 332h122q-32 -223 -171 -366.5 t-358 -143.5z" />
+<glyph unicode="&#x2402;" d="M1879 582q0 -356 -249.5 -605.5t-606 -249.5t-605.5 249t-249 606t249 606t605.5 249t606 -249.5t249.5 -605.5zM1431 854q0 56 -39.5 95.5t-95.5 39.5t-96.5 -39.5t-40.5 -95.5t40.5 -96t96.5 -40t95.5 40t39.5 96zM848.5 758q40.5 40 40.5 96.5t-40 95.5t-96.5 39 t-96 -39.5t-39.5 -95.5t39.5 -96t95.5 -40t96.5 40zM1024 203q-328 0 -407 332h-122q32 -223 171 -366.5t358 -143.5t358 143.5t171 366.5h-122q-79 -332 -407 -332z" />
+<glyph unicode="&#x2403;" d="M1706 893q0 -283 -328 -612l-138 -135q-76 -80 -110 -141t-46 -92l-21 -56q-14 -25 -39 -25t-34.5 21t-29 70t-57 105.5t-234.5 252.5q-90 89 -163 185q-164 215 -164 420.5t80.5 342.5t259.5 137q109 0 201 -63.5t141 -165.5q50 104 140.5 166.5t201.5 62.5 q180 0 260 -136t80 -337z" />
+<glyph unicode="&#x2404;" d="M1706 578q0 -15 -11 -27l-119 -116q-269 -280 -467 -651q-15 -35 -51 -99q-13 -19 -34.5 -19t-34.5 19l-51 99q-197 370 -467 651q-41 37 -119 116q-10 11 -10 26.5t10 28.5l79 74q76 74 165 181q190 228 335 497q17 39 58 112q14 19 35 19t34 -19l58 -112 q145 -270 335 -497q89 -106 165 -181q28 -23 79 -74q11 -13 11 -28z" />
+<glyph unicode="&#x2405;" d="M1692 620q72 -115 72 -269.5t-98 -275t-252 -120.5q-95 0 -170.5 49t-75.5 139h-102q0 -131 28.5 -252t28.5 -116q0 -41 -38 -41h-122q-37 0 -37 41q0 -5 28 116t28 252h-102q0 -90 -75.5 -139t-170.5 -49q-154 0 -252 120.5t-98 275t72 269.5q83 134 225 134 q120 0 190 -88l48 94q-158 118 -158 330q0 158 103.5 278.5t259.5 120.5t259.5 -120.5t103.5 -278.5q0 -212 -158 -330l48 -94q70 88 190 88q142 0 225 -134z" />
+<glyph unicode="&#x2406;" d="M1588 760q118 -163 118 -340t-47 -295q-68 -170 -222 -170q-103 0 -178 42q-92 51 -92 146h-102q0 -136 28.5 -254.5t28.5 -113.5q0 -41 -37 -41h-121q-39 0 -39 41q0 1 2 8q56 184 56 360h-103q0 -95 -91 -146q-74 -42 -177 -42q-151 0 -210.5 140.5t-59.5 320.5 t118 343q69 96 248 263q134 125 236 345l43 97q12 25 37 25t39 -25q16 -41 50 -122q87 -190 226 -320q182 -171 249 -262z" />
+<glyph unicode="&#x2407;" d="M1446 582q0 -176 -123 -299t-299 -123t-299 123t-123 299t123 299t299 123t299 -123t123 -299z" />
+<glyph unicode="&#x2408;" d="M2048 -442h-2048v2048h2048v-2048zM1446 582q0 176 -123 299t-299 123t-299 -123t-123 -299t123 -299t299 -123t299 123t123 299z" />
+<glyph unicode="&#x2409;" d="M1879 582q0 -356 -249.5 -605.5t-606 -249.5t-605.5 249t-249 606t249 606t605.5 249t606 -249.5t249.5 -605.5zM1736 582q0 297 -207.5 504.5t-504.5 207.5t-504.5 -207.5t-207.5 -504.5t207.5 -504.5t504.5 -207.5t504.5 207.5t207.5 504.5z" />
+<glyph unicode="&#x240a;" d="M2048 -442h-2048v2048h2048v-2048zM1630 -24q249 249 249 605.5t-249.5 606t-605.5 249.5t-605.5 -249.5t-249.5 -605.5t249.5 -605.5t606 -249.5t605.5 249zM1736 582q0 -297 -207.5 -504.5t-504.5 -207.5t-504.5 207.5t-207.5 504.5t207.5 504.5t504.5 207.5 t504.5 -207.5t207.5 -504.5z" />
+<glyph unicode="&#x240b;" d="M1874 774h-152v380l-328 -325q139 -199 139 -420q0 -281 -200.5 -480t-482 -199t-479 198.5t-197.5 482.5t198 480.5t484 196.5q232 0 432 -152l317 316h-386v151h655v-629zM1382 409q0 221 -153.5 374.5t-374.5 153.5t-375 -153.5t-154 -374.5t154 -374.5t375 -153.5 t374.5 153.5t153.5 374.5z" />
+<glyph unicode="&#x240c;" d="M1504 1386.5q199 -199.5 199 -472t-174.5 -462t-438.5 -226.5v-237h450v-154h-450v-257h-154v257h-450v154h450v238q-261 47 -426 232t-165 458.5t196.5 471t480 197.5t482.5 -199.5zM1551 906q0 220 -154.5 374.5t-374.5 154.5t-374.5 -154.5t-154.5 -374.5t154.5 -374 t374.5 -154t374.5 154t154.5 374z" />
+<glyph unicode="&#x240d;" d="M1587 582q0 -211 -181 -516h-32q86 199 98 232q51 139 51 243q0 180 -136 341t-313 171v-1159q0 -146 -126 -241t-278 -95q-89 0 -149 45t-60 131q0 136 125.5 236t255 100t182.5 -47v1583h50q32 -211 116 -332q33 -47 147 -175.5t166 -217.5q84 -143 84 -299z" />
+<glyph unicode="&#x240e;" d="M1721 -106q0 -146 -126 -241t-278 -95q-89 0 -149 45t-60 131q0 136 125.5 236t255 100t182.5 -47v1128l-731 207v-1264q0 -146 -126 -241t-278 -95q-89 0 -149 45t-60 131q0 136 125.5 236t255 100t182.5 -47v1383l831 -236v-1476z" />
+<glyph unicode="&#x240f;" d="M1942 493h-302q-29 -157 -118 -284l211 -211l-125 -126l-212 212q-136 -93 -283 -118v-302h-178v302q-147 25 -283 118l-212 -212l-126 126l212 211q-89 127 -118 284h-302v178h302q29 157 118 284l-212 211l126 126l212 -212q136 93 283 118v302h178v-302 q147 -25 283 -118l212 212l125 -126l-211 -211q89 -127 118 -284h302v-178zM1468 582q0 185 -129.5 314.5t-315 129.5t-314.5 -129t-129 -314.5t129.5 -315t314.5 -129.5t314.5 129.5t129.5 314.5z" />
+<glyph unicode="&#x2410;" d="M1734 582l-1420 -710v1420z" />
+<glyph unicode="&#x2411;" d="M1734 -128l-1420 710l1420 710v-1420z" />
+<glyph unicode="&#x2412;" d="M1686 279l-662 -687l-662 687l69 -10l533 -309v1244l-533 -309l-69 -10l662 687l662 -687l-69 10l-533 309v-1244l533 309z" />
+<glyph unicode="&#x2413;" d="M1430 1220q0 -40 -4 -76l-102 -918h-43l-100 918q-7 64 -7 90q0 63 34 110t95 47q127 0 127 -171zM874 1220q0 -31 -5 -76l-102 -918h-43l-99 918q-7 65 -7 90q0 63 34 110t95 47q127 0 127 -171zM1427 -86q0 -52 -37 -89t-89 -37t-89 37t-37 89t37 88t89 36t89 -36 t37 -88zM870 -86q0 -52 -36.5 -89t-88.5 -37t-89 37t-37 89t37 88t89 36t88.5 -36t36.5 -88z" />
+<glyph unicode="&#x2414;" d="M1564 1365h-147v-1707h-99v1707h-205v-1707h-101v967q-172 7 -267 38q-140 46 -206 162q-55 97 -55 218q0 247 218 358q108 55 277 55h585v-91z" />
+<glyph unicode="&#x2415;" d="M1147 1254l14 98q0 97 -112 97q-75 0 -126 -52t-51 -120.5t28 -114.5q41 -67 174 -165t199 -171q114 -126 114 -254q0 -214 -225 -349q125 -137 125 -260t-83 -207t-195.5 -84t-190 65.5t-77.5 164.5q0 35 23 62t57 27q77 0 77 -88l-17 -111q0 -39 40 -59.5t94.5 -20.5 t111 51t56.5 117q0 109 -135 228l-252 208q-135 133 -135 278q0 211 225 346q-126 139 -126 262.5t83.5 206.5t195 83t190.5 -63t79 -158t-81 -95q-33 0 -56.5 22.5t-23.5 55.5zM1128 253q156 94 156 216.5t-137 250.5l-228 188q-154 -92 -154 -226q0 -118 135 -243z" />
+<glyph unicode="&#x2416;" d="M1675 275h-1302v620h1302v-620z" />
+<glyph unicode="&#x2417;" d="M964 1572h120v-1462l533 309l69 10l-662 -687l-662 687l69 -10l533 -309v1462zM1619 -442h-1190v120h1190v-120z" />
+<glyph unicode="&#x2418;" d="M1084 -408h-120v1612l-533 -309l-69 -10l662 687l662 -687l-69 10l-533 309v-1612z" />
+<glyph unicode="&#x2419;" d="M964 1572h120v-1612l533 309l69 10l-662 -687l-662 687l69 -10l533 -309v1612z" />
+<glyph unicode="&#x241a;" d="M34 522v120h1612l-309 533l-10 69l687 -662l-687 -662l10 69l309 533h-1612z" />
+<glyph unicode="&#x241b;" d="M2014 522h-1612l309 -533l10 -69l-687 662l687 662l-10 -69l-309 -533h1612v-120z" />
+<glyph unicode="&#x241c;" d="M2014 522h-1794v850h120v-730h1674v-120z" />
+<glyph unicode="&#x241d;" d="M2014 582l-687 -662l10 69l309 533h-1244l309 -533l10 -69l-687 662l687 662l-10 -69l-309 -533h1244l-309 533l-10 69z" />
+<glyph unicode="&#x241e;" d="M1734 0h-1420l710 1420z" />
+<glyph unicode="&#x241f;" d="M1734 1420l-710 -1420l-710 1420h1420z" />
+<glyph unicode="&#x2420;" d="M2016 1350h-98v126h-126v98h224v-224zM1664 1476h-224v98h224v-98zM2016 998h-98v224h98v-224zM1312 1476h-224v98h224v-98zM2016 646h-98v224h98v-224zM960 1476h-224v98h224v-98zM2016 294h-98v224h98v-224zM608 1476h-224v98h224v-98zM2016 -58h-98v224h98v-224z M256 1476h-126v-126h-98v224h224v-98zM2016 -410h-224v98h126v126h98v-224zM130 998h-98v224h98v-224zM1664 -410h-224v98h224v-98zM130 646h-98v224h98v-224zM1312 -410h-224v98h224v-98zM130 294h-98v224h98v-224zM960 -410h-224v98h224v-98zM130 -58h-98v224h98v-224z M608 -410h-224v98h224v-98zM256 -410h-224v224h98v-126h126v-98zM1687 705q0 -153 -141 -212q-45 -19 -228 -19v-217h-152v650h268q253 0 253 -202zM843 615q98 -48 98 -156.5t-98 -166.5q-80 -47 -202.5 -47t-240.5 49v147h9q109 -88 242 -88t133 75q0 51 -99 74 q-154 38 -182 52q-99 50 -99 156.5t95 162.5q79 46 195.5 46t220.5 -42v-141h-8q-95 76 -220 76t-125 -73q0 -50 98 -74q157 -38 183 -50zM1529 701q0 97 -153 97h-58v-215h61q150 0 150 118z" />
+<glyph unicode="&#x2421;" d="M2016 1350h-98v126h-126v98h224v-224zM1664 1476h-224v98h224v-98zM2016 998h-98v224h98v-224zM1312 1476h-224v98h224v-98zM2016 646h-98v224h98v-224zM960 1476h-224v98h224v-98zM2016 294h-98v224h98v-224zM608 1476h-224v98h224v-98zM2016 -58h-98v224h98v-224z M256 1476h-126v-126h-98v224h224v-98zM2016 -410h-224v98h126v126h98v-224zM130 998h-98v224h98v-224zM1664 -410h-224v98h224v-98zM130 646h-98v224h98v-224zM1312 -410h-224v98h224v-98zM130 294h-98v224h98v-224zM960 -410h-224v98h224v-98zM130 -58h-98v224h98v-224z M608 -410h-224v98h224v-98zM256 -410h-224v224h98v-126h126v-98zM1889 257h-453v650h152v-537h301v-113zM1341 257h-455v650h455v-113h-304v-131h282v-113h-282v-180h304v-113zM763.5 783q61.5 -84 61.5 -201t-66.5 -204t-178.5 -110q-53 -11 -133 -11h-221v650h228 q80 0 135 -13q113 -27 174.5 -111zM438 366q229 0 229 216t-229 216h-60v-432h60z" />
+<glyph unicode="&#x2422;" horiz-adv-x="1346" d="M1100 804q75 -125 75 -324t-100 -339q-113 -157 -304 -157q-128 0 -253 69l-10 -53h-145v929l-298 -251v141l298 252v415h155v-284l283 239h168l-451 -380v-225q149 123 304 123q186 0 278 -155zM740 124q275 0 275 343.5t-231 343.5q-131 0 -266 -105v-529 q118 -53 222 -53z" />
+<glyph unicode="&#x2423;" horiz-adv-x="704" d="M704 -264h-704v264h118v-146h468v146h118v-264z" />
+<glyph unicode="&#x2424;" d="M2016 1350h-98v126h-126v98h224v-224zM1664 1476h-224v98h224v-98zM2016 998h-98v224h98v-224zM1312 1476h-224v98h224v-98zM2016 646h-98v224h98v-224zM960 1476h-224v98h224v-98zM2016 294h-98v224h98v-224zM608 1476h-224v98h224v-98zM2016 -58h-98v224h98v-224z M256 1476h-126v-126h-98v224h224v-98zM2016 -410h-224v98h126v126h98v-224zM130 998h-98v224h98v-224zM1664 -410h-224v98h224v-98zM130 646h-98v224h98v-224zM1312 -410h-224v98h224v-98zM130 294h-98v224h98v-224zM960 -410h-224v98h224v-98zM130 -58h-98v224h98v-224z M608 -410h-224v98h224v-98zM256 -410h-224v224h98v-126h126v-98zM1699 257h-453v650h152v-537h301v-113zM1022 257h-150l-288 476v-476h-138v650h188l249 -400v400h139v-650z" />
+<glyph unicode="&#x2425;" d="M1449 1361l-1204 -1204v141l1063 1063h141zM1752 1239l-1385 -1385l-71 71l1385 1385zM1803 866l-1063 -1063h-141l1204 1204v-141z" />
+<glyph unicode="&#x2426;" horiz-adv-x="976" d="M884 1223h-8q-148 92 -337 92q-116 0 -194 -74t-78 -189q0 -231 382 -412v-281h-179v213q-378 184 -378 494q0 178 126.5 284t310 106t355.5 -65v-168zM649 0h-179v187h179v-187z" />
+<glyph unicode="&#x2427;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2428;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2429;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x242a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x242b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x242c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x242d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x242e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x242f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2430;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2431;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2432;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2433;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2434;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2435;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2436;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2437;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2438;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2439;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x243a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x243b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x243c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x243d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x243e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x243f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2440;" horiz-adv-x="1546" d="M1324 966q0 -37 -41 -37t-41 37v373h-428v-1302q0 -37 -37 -37h-518q-37 0 -37 37v418q0 37 41 37t41 -37v-373h428v1302q0 37 37 37h518q37 0 37 -37v-418z" />
+<glyph unicode="&#x2441;" horiz-adv-x="1236" d="M1014 37q0 -37 -41 -37t-41 37v673h-628v-673q0 -39 -41 -39t-41 39v718q0 37 37 37h673v592q0 37 41 37t41 -37v-1347z" />
+<glyph unicode="&#x2442;" horiz-adv-x="1236" d="M1014 664q0 -37 -37 -37h-318v-592q0 -37 -41 -37t-41 37v592h-318q-37 0 -37 37v718q0 39 41 39t41 -39v-673h628v673q0 37 41 37t41 -37v-718z" />
+<glyph unicode="&#x2443;" horiz-adv-x="1236" d="M1014 37q0 -37 -41 -37t-41 37v673h-628v-673q0 -39 -41 -39t-41 39v718q0 37 37 37h318v592q0 37 41 37t41 -37v-592h318q37 0 37 -37v-718z" />
+<glyph unicode="&#x2444;" horiz-adv-x="1236" d="M1014 37q0 -37 -37 -37h-718q-37 0 -37 37v418q0 39 41 39t41 -39v-373h273v1257h-273v-373q0 -39 -41 -39t-41 39v418q0 37 37 37h718q37 0 37 -37v-418q0 -37 -41 -37t-41 37v373h-273v-1257h273v373q0 37 41 37t41 -37v-418z" />
+<glyph unicode="&#x2445;" horiz-adv-x="1628" d="M1406 250l-592 342l592 342v-684zM814 592l-592 -342v684zM1307 421v342l-296 -174zM617 589l-296 174v-342z" />
+<glyph unicode="&#x2446;" horiz-adv-x="1576" d="M1354 960h-432v432h432v-432zM1354 0h-432v432h432v-432zM614 200h-392v984h392v-984z" />
+<glyph unicode="&#x2447;" horiz-adv-x="1604" d="M1382 816h-382v432h382v-432zM900 332h-196v584h196v-584zM604 0h-382v432h382v-432z" />
+<glyph unicode="&#x2448;" horiz-adv-x="1526" d="M1304 960h-382v432h382v-432zM738 0h-196v1184h196v-1184zM418 0h-196v1184h196v-1184z" />
+<glyph unicode="&#x2449;" horiz-adv-x="1804" d="M1582 0h-196v432h196v-432zM1186 0h-382v432h382v-432zM604 0h-382v432h382v-432z" />
+<glyph unicode="&#x244a;" horiz-adv-x="1271" d="M1049 0h-94l-473 1421h94zM789 0h-94l-473 1421h94z" />
+<glyph unicode="&#x244b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x244c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x244d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x244e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x244f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2450;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2451;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2452;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2453;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2454;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2455;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2456;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2457;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2458;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2459;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x245a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x245b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x245c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x245d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x245e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x245f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2500;" d="M2048 508h-2048v148h2048v-148z" />
+<glyph unicode="&#x2501;" d="M2048 483h-2048v198h2048v-198z" />
+<glyph unicode="&#x2502;" d="M1098 -442h-148v2048h148v-2048z" />
+<glyph unicode="&#x2503;" d="M1122 -442h-197v2048h197v-2048z" />
+<glyph unicode="&#x2504;" d="M1974 508h-535v148h535v-148zM1291 508h-534v148h534v-148zM609 508h-535v148h535v-148z" />
+<glyph unicode="&#x2505;" d="M1974 483h-535v198h535v-198zM1291 483h-534v198h534v-198zM609 483h-535v198h535v-198z" />
+<glyph unicode="&#x2506;" d="M1098 997h-148v535h148v-535zM1098 315h-148v534h148v-534zM1098 -368h-148v535h148v-535z" />
+<glyph unicode="&#x2507;" d="M1122 997h-197v535h197v-535zM1122 315h-197v534h197v-534zM1122 -368h-197v535h197v-535z" />
+<glyph unicode="&#x2508;" d="M1974 508h-364v148h364v-148zM1462 508h-364v148h364v-148zM950 508h-364v148h364v-148zM438 508h-364v148h364v-148z" />
+<glyph unicode="&#x2509;" d="M1974 483h-364v198h364v-198zM1462 483h-364v198h364v-198zM950 483h-364v198h364v-198zM438 483h-364v198h364v-198z" />
+<glyph unicode="&#x250a;" d="M1098 1168h-148v364h148v-364zM1098 656h-148v364h148v-364zM1098 144h-148v364h148v-364zM1098 -368h-148v364h148v-364z" />
+<glyph unicode="&#x250b;" d="M1122 1168h-197v364h197v-364zM1122 656h-197v364h197v-364zM1122 144h-197v364h197v-364zM1122 -368h-197v364h197v-364z" />
+<glyph unicode="&#x250c;" d="M2048 508h-950v-950h-148v1098h1098v-148z" />
+<glyph unicode="&#x250d;" d="M2048 483h-950v-925h-148v1123h1098v-198z" />
+<glyph unicode="&#x250e;" d="M2048 508h-926v-950h-197v1098h1123v-148z" />
+<glyph unicode="&#x250f;" d="M2048 483h-926v-925h-197v1123h1123v-198z" />
+<glyph unicode="&#x2510;" d="M1098 -442h-148v950h-950v148h1098v-1098z" />
+<glyph unicode="&#x2511;" d="M1098 -442h-148v925h-950v198h1098v-1123z" />
+<glyph unicode="&#x2512;" d="M1123 -442h-198v950h-925v148h1123v-1098z" />
+<glyph unicode="&#x2513;" d="M1123 -442h-198v925h-925v198h1123v-1123z" />
+<glyph unicode="&#x2514;" d="M2048 508h-1098v1098h148v-950h950v-148z" />
+<glyph unicode="&#x2515;" d="M2048 483h-1098v1123h148v-925h950v-198z" />
+<glyph unicode="&#x2516;" d="M2048 508h-1123v1098h197v-950h926v-148z" />
+<glyph unicode="&#x2517;" d="M2048 483h-1123v1123h197v-925h926v-198z" />
+<glyph unicode="&#x2518;" d="M1098 508h-1098v148h950v950h148v-1098z" />
+<glyph unicode="&#x2519;" d="M1098 483h-1098v198h950v925h148v-1123z" />
+<glyph unicode="&#x251a;" d="M1123 508h-1123v148h925v950h198v-1098z" />
+<glyph unicode="&#x251b;" d="M1123 483h-1123v198h925v925h198v-1123z" />
+<glyph unicode="&#x251c;" d="M2048 508h-950v-950h-148v2048h148v-950h950v-148z" />
+<glyph unicode="&#x251d;" d="M2048 483h-950v-925h-148v2048h148v-925h950v-198z" />
+<glyph unicode="&#x251e;" d="M2048 508h-950v-950h-148v1098h-25v950h197v-950h926v-148z" />
+<glyph unicode="&#x251f;" d="M2048 508h-926v-950h-197v950h25v1098h148v-950h950v-148z" />
+<glyph unicode="&#x2520;" d="M2048 508h-926v-950h-197v2048h197v-950h926v-148z" />
+<glyph unicode="&#x2521;" d="M2048 490h-950v-932h-148v925h-25v1123h197v-925h926v-191z" />
+<glyph unicode="&#x2522;" d="M2048 483h-926v-925h-197v1123h25v925h148v-925h950v-198z" />
+<glyph unicode="&#x2523;" d="M2048 483h-926v-925h-197v2048h197v-925h926v-198z" />
+<glyph unicode="&#x2524;" d="M1098 -442h-148v950h-950v148h950v950h148v-2048z" />
+<glyph unicode="&#x2525;" d="M1098 -442h-148v925h-950v198h950v925h148v-2048z" />
+<glyph unicode="&#x2526;" d="M1123 656h-25v-1098h-148v950h-950v148h925v950h198v-950z" />
+<glyph unicode="&#x2527;" d="M1123 -442h-198v950h-925v148h950v950h148v-1098h25v-950z" />
+<glyph unicode="&#x2528;" d="M1123 -442h-198v950h-925v148h925v950h198v-2048z" />
+<glyph unicode="&#x2529;" d="M1123 483h-25v-925h-148v925h-950v198h925v925h198v-1123z" />
+<glyph unicode="&#x252a;" d="M1123 -442h-198v925h-925v198h950v925h148v-925h25v-1123z" />
+<glyph unicode="&#x252b;" d="M1123 -442h-198v925h-925v198h925v925h198v-2048z" />
+<glyph unicode="&#x252c;" d="M2048 508h-950v-950h-148v950h-950v148h2048v-148z" />
+<glyph unicode="&#x252d;" d="M2048 508h-950v-950h-148v925h-950v198h950v-25h1098v-148z" />
+<glyph unicode="&#x252e;" d="M2048 483h-950v-925h-148v950h-950v148h1098v25h950v-198z" />
+<glyph unicode="&#x252f;" d="M2048 483h-950v-925h-148v925h-950v198h2048v-198z" />
+<glyph unicode="&#x2530;" d="M2048 508h-925v-950h-198v950h-925v148h2048v-148z" />
+<glyph unicode="&#x2531;" d="M2048 508h-925v-950h-198v925h-925v198h1123v-25h925v-148z" />
+<glyph unicode="&#x2532;" d="M2048 483h-925v-925h-198v950h-925v148h925v25h1123v-198z" />
+<glyph unicode="&#x2533;" d="M2048 483h-925v-925h-198v925h-925v198h2048v-198z" />
+<glyph unicode="&#x2534;" d="M2048 508h-2048v148h950v950h148v-950h950v-148z" />
+<glyph unicode="&#x2535;" d="M2048 508h-1098v-25h-950v198h950v925h148v-950h950v-148z" />
+<glyph unicode="&#x2536;" d="M2048 483h-950v25h-1098v148h950v950h148v-925h950v-198z" />
+<glyph unicode="&#x2537;" d="M2048 483h-2048v198h950v925h148v-925h950v-198z" />
+<glyph unicode="&#x2538;" d="M2048 508h-2048v148h925v950h198v-950h925v-148z" />
+<glyph unicode="&#x2539;" d="M2048 508h-925v-25h-1123v198h925v925h198v-950h925v-148z" />
+<glyph unicode="&#x253a;" d="M2048 483h-1123v25h-925v148h925v950h198v-925h925v-198z" />
+<glyph unicode="&#x253b;" d="M2048 483h-2048v198h925v925h198v-925h925v-198z" />
+<glyph unicode="&#x253c;" d="M2048 508h-950v-950h-148v950h-950v148h950v950h148v-950h950v-148z" />
+<glyph unicode="&#x253d;" d="M2048 508h-950v-950h-148v925h-950v198h950v925h148v-950h950v-148z" />
+<glyph unicode="&#x253e;" d="M2048 483h-950v-925h-148v950h-950v148h950v950h148v-925h950v-198z" />
+<glyph unicode="&#x253f;" d="M2048 483h-950v-925h-148v925h-950v198h950v925h148v-925h950v-198z" />
+<glyph unicode="&#x2540;" d="M2048 508h-950v-950h-148v950h-950v148h925v950h198v-950h925v-148z" />
+<glyph unicode="&#x2541;" d="M2048 508h-925v-950h-198v950h-925v148h950v950h148v-950h950v-148z" />
+<glyph unicode="&#x2542;" d="M2048 508h-925v-950h-198v950h-925v148h925v950h198v-950h925v-148z" />
+<glyph unicode="&#x2543;" d="M2048 508h-950v-950h-148v925h-950v198h925v925h198v-950h925v-148z" />
+<glyph unicode="&#x2544;" d="M2048 483h-950v-925h-148v950h-950v148h925v950h198v-925h925v-198z" />
+<glyph unicode="&#x2545;" d="M2048 508h-925v-950h-198v925h-925v198h950v925h148v-950h950v-148z" />
+<glyph unicode="&#x2546;" d="M2048 483h-925v-925h-198v950h-925v148h950v950h148v-925h950v-198z" />
+<glyph unicode="&#x2547;" d="M2048 483h-950v-925h-148v925h-950v198h925v925h198v-925h925v-198z" />
+<glyph unicode="&#x2548;" d="M2048 483h-925v-925h-198v925h-925v198h950v925h148v-925h950v-198z" />
+<glyph unicode="&#x2549;" d="M2048 508h-925v-950h-198v925h-925v198h925v925h198v-950h925v-148z" />
+<glyph unicode="&#x254a;" d="M2048 483h-925v-925h-198v950h-925v148h925v950h198v-925h925v-198z" />
+<glyph unicode="&#x254b;" d="M2048 483h-925v-925h-198v925h-925v198h925v925h198v-925h925v-198z" />
+<glyph unicode="&#x254c;" d="M1974 508h-876v148h876v-148zM950 508h-876v148h876v-148z" />
+<glyph unicode="&#x254d;" d="M1974 483h-876v198h876v-198zM950 483h-876v198h876v-198z" />
+<glyph unicode="&#x254e;" d="M1098 656h-148v876h148v-876zM1098 -368h-148v876h148v-876z" />
+<glyph unicode="&#x254f;" d="M1122 656h-197v876h197v-876zM1122 -368h-197v876h197v-876z" />
+<glyph unicode="&#x2550;" d="M2048 360h-2048v148h2048v-148zM2048 656h-2048v148h2048v-148z" />
+<glyph unicode="&#x2551;" d="M950 -442h-148v2048h148v-2048zM1246 -442h-148v2048h148v-2048z" />
+<glyph unicode="&#x2552;" d="M2048 360h-975v-802h-148v1246h1123v-148h-975v-148h975v-148z" />
+<glyph unicode="&#x2553;" d="M2048 508h-802v-950h-148v950h-148v-950h-148v1098h1246v-148z" />
+<glyph unicode="&#x2554;" d="M2048 656h-1098v-1098h-148v1246h1246v-148zM2048 360h-802v-802h-148v950h950v-148z" />
+<glyph unicode="&#x2555;" d="M1098 -442h-148v802h-950v148h950v148h-950v148h1098v-1246z" />
+<glyph unicode="&#x2556;" d="M1246 -442h-148v950h-148v-950h-148v950h-802v148h1246v-1098z" />
+<glyph unicode="&#x2557;" d="M1246 -442h-148v1098h-1098v148h1246v-1246zM950 -442h-148v802h-802v148h950v-950z" />
+<glyph unicode="&#x2558;" d="M2048 360h-1246v1246h148v-802h1098v-148h-1098v-148h1098v-148z" />
+<glyph unicode="&#x2559;" d="M2048 508h-1246v1098h148v-950h148v950h148v-950h802v-148z" />
+<glyph unicode="&#x255a;" d="M2048 656h-950v950h148v-802h802v-148zM2048 360h-1246v1246h148v-1098h1098v-148z" />
+<glyph unicode="&#x255b;" d="M1098 360h-1098v148h950v148h-950v148h950v802h148v-1246z" />
+<glyph unicode="&#x255c;" d="M1246 508h-1246v148h802v950h148v-950h148v950h148v-1098z" />
+<glyph unicode="&#x255d;" d="M950 656h-950v148h802v802h148v-950zM1246 360h-1246v148h1098v1098h148v-1246z" />
+<glyph unicode="&#x255e;" d="M2048 360h-950v-802h-148v2048h148v-802h950v-148h-950v-148h950v-148z" />
+<glyph unicode="&#x255f;" d="M950 -442h-148v2048h148v-2048zM2048 508h-802v-950h-148v2048h148v-950h802v-148z" />
+<glyph unicode="&#x2560;" d="M950 -442h-148v2048h148v-2048zM2048 656h-950v950h148v-802h802v-148zM2048 360h-802v-802h-148v950h950v-148z" />
+<glyph unicode="&#x2561;" d="M1098 -442h-148v802h-950v148h950v148h-950v148h950v802h148v-2048z" />
+<glyph unicode="&#x2562;" d="M1246 -442h-148v2048h148v-2048zM950 -442h-148v950h-802v148h802v950h148v-2048z" />
+<glyph unicode="&#x2563;" d="M1246 -442h-148v2048h148v-2048zM950 656h-950v148h802v802h148v-950zM950 -442h-148v802h-802v148h950v-950z" />
+<glyph unicode="&#x2564;" d="M2048 656h-2048v148h2048v-148zM2048 360h-950v-802h-148v802h-950v148h2048v-148z" />
+<glyph unicode="&#x2565;" d="M2048 508h-802v-950h-148v950h-148v-950h-148v950h-802v148h2048v-148z" />
+<glyph unicode="&#x2566;" d="M2048 656h-2048v148h2048v-148zM2048 360h-802v-802h-148v950h950v-148zM950 -442h-148v802h-802v148h950v-950z" />
+<glyph unicode="&#x2567;" d="M2048 360h-2048v148h2048v-148zM2048 656h-2048v148h950v802h148v-802h950v-148z" />
+<glyph unicode="&#x2568;" d="M2048 508h-2048v148h802v950h148v-950h148v950h148v-950h802v-148z" />
+<glyph unicode="&#x2569;" d="M2048 360h-2048v148h2048v-148zM2048 656h-950v950h148v-802h802v-148zM950 656h-950v148h802v802h148v-950z" />
+<glyph unicode="&#x256a;" d="M2048 360h-950v-802h-148v802h-950v148h950v148h-950v148h950v802h148v-802h950v-148h-950v-148h950v-148z" />
+<glyph unicode="&#x256b;" d="M2048 508h-802v-950h-148v950h-148v-950h-148v950h-802v148h802v950h148v-950h148v950h148v-950h802v-148z" />
+<glyph unicode="&#x256c;" d="M2048 656h-950v950h148v-802h802v-148zM950 656h-950v148h802v802h148v-950zM2048 360h-802v-802h-148v950h950v-148zM950 -442h-148v802h-802v148h950v-950z" />
+<glyph unicode="&#x256d;" d="M2048 508q-397 0 -673.5 -276.5t-276.5 -673.5h-148q0 458 320 778t778 320v-148z" />
+<glyph unicode="&#x256e;" d="M1098 -442h-148q0 397 -276.5 673.5t-673.5 276.5v148q458 0 778 -320t320 -778z" />
+<glyph unicode="&#x256f;" d="M1098 1606q0 -457 -320.5 -777.5t-777.5 -320.5v148q397 0 673.5 276.5t276.5 673.5h148z" />
+<glyph unicode="&#x2570;" d="M2048 508q-457 0 -777.5 320.5t-320.5 777.5h148q0 -397 276.5 -673.5t673.5 -276.5v-148z" />
+<glyph unicode="&#x2571;" d="M2158 1606l-2048 -2048h-220l2048 2048h220z" />
+<glyph unicode="&#x2572;" d="M2158 -442h-220l-2048 2048h220z" />
+<glyph unicode="&#x2573;" d="M2158 -442h-220l-914 914l-914 -914h-220l1024 1024l-1024 1024h220l914 -914l914 914h220l-1024 -1024z" />
+<glyph unicode="&#x2574;" d="M1024 508h-1024v148h1024v-148z" />
+<glyph unicode="&#x2575;" d="M1098 582h-148v1024h148v-1024z" />
+<glyph unicode="&#x2576;" d="M2048 508h-1024v148h1024v-148z" />
+<glyph unicode="&#x2577;" d="M1098 -442h-148v1024h148v-1024z" />
+<glyph unicode="&#x2578;" d="M1024 483h-1024v198h1024v-198z" />
+<glyph unicode="&#x2579;" d="M1123 582h-198v1024h198v-1024z" />
+<glyph unicode="&#x257a;" d="M2048 483h-1024v198h1024v-198z" />
+<glyph unicode="&#x257b;" d="M1123 -442h-198v1024h198v-1024z" />
+<glyph unicode="&#x257c;" d="M2048 483h-1024v25h-1024v148h1024v25h1024v-198z" />
+<glyph unicode="&#x257d;" d="M1123 -442h-198v1024h25v1024h148v-1024h25v-1024z" />
+<glyph unicode="&#x257e;" d="M2048 508h-1024v-25h-1024v198h1024v-25h1024v-148z" />
+<glyph unicode="&#x257f;" d="M1123 582h-25v-1024h-148v1024h-25v1024h198v-1024z" />
+<glyph unicode="&#x2580;" d="M2048 582h-2048v1024h2048v-1024z" />
+<glyph unicode="&#x2581;" d="M2048 -442h-2048v256h2048v-256z" />
+<glyph unicode="&#x2582;" d="M2048 -442h-2048v512h2048v-512z" />
+<glyph unicode="&#x2583;" d="M2048 -442h-2048v768h2048v-768z" />
+<glyph unicode="&#x2584;" d="M2048 -442h-2048v1024h2048v-1024z" />
+<glyph unicode="&#x2585;" d="M2048 -442h-2048v1280h2048v-1280z" />
+<glyph unicode="&#x2586;" d="M2048 -442h-2048v1536h2048v-1536z" />
+<glyph unicode="&#x2587;" d="M2048 -442h-2048v1792h2048v-1792z" />
+<glyph unicode="&#x2588;" d="M2048 -442h-2048v2048h2048v-2048z" />
+<glyph unicode="&#x2589;" d="M1792 -442h-1792v2048h1792v-2048z" />
+<glyph unicode="&#x258a;" d="M1536 -442h-1536v2048h1536v-2048z" />
+<glyph unicode="&#x258b;" d="M1280 -442h-1280v2048h1280v-2048z" />
+<glyph unicode="&#x258c;" d="M1024 -442h-1024v2048h1024v-2048z" />
+<glyph unicode="&#x258d;" d="M768 -442h-768v2048h768v-2048z" />
+<glyph unicode="&#x258e;" d="M512 -442h-512v2048h512v-2048z" />
+<glyph unicode="&#x258f;" d="M256 -442h-256v2048h256v-2048z" />
+<glyph unicode="&#x2590;" d="M2048 -442h-1024v2048h1024v-2048z" />
+<glyph unicode="&#x2591;" d="M1920 1478h-128v128h128v-128zM1664 1478h-128v128h128v-128zM1920 1222h-128v128h128v-128zM1408 1478h-128v128h128v-128zM1664 1222h-128v128h128v-128zM1920 966h-128v128h128v-128zM1152 1478h-128v128h128v-128zM1408 1222h-128v128h128v-128zM1664 966h-128v128 h128v-128zM1920 710h-128v128h128v-128zM896 1478h-128v128h128v-128zM1152 1222h-128v128h128v-128zM1408 966h-128v128h128v-128zM1664 710h-128v128h128v-128zM1920 454h-128v128h128v-128zM640 1478h-128v128h128v-128zM896 1222h-128v128h128v-128zM1152 966h-128v128 h128v-128zM1408 710h-128v128h128v-128zM1664 454h-128v128h128v-128zM1920 198h-128v128h128v-128zM384 1478h-128v128h128v-128zM640 1222h-128v128h128v-128zM896 966h-128v128h128v-128zM1152 710h-128v128h128v-128zM1408 454h-128v128h128v-128zM1664 198h-128v128 h128v-128zM1920 -58h-128v128h128v-128zM128 1478h-128v128h128v-128zM384 1222h-128v128h128v-128zM640 966h-128v128h128v-128zM896 710h-128v128h128v-128zM1152 454h-128v128h128v-128zM1408 198h-128v128h128v-128zM1664 -58h-128v128h128v-128zM1920 -314h-128v128 h128v-128zM128 1222h-128v128h128v-128zM384 966h-128v128h128v-128zM640 710h-128v128h128v-128zM896 454h-128v128h128v-128zM1152 198h-128v128h128v-128zM1408 -58h-128v128h128v-128zM1664 -314h-128v128h128v-128zM128 966h-128v128h128v-128zM384 710h-128v128h128 v-128zM640 454h-128v128h128v-128zM896 198h-128v128h128v-128zM1152 -58h-128v128h128v-128zM1408 -314h-128v128h128v-128zM128 710h-128v128h128v-128zM384 454h-128v128h128v-128zM640 198h-128v128h128v-128zM896 -58h-128v128h128v-128zM1152 -314h-128v128h128v-128z M128 454h-128v128h128v-128zM384 198h-128v128h128v-128zM640 -58h-128v128h128v-128zM896 -314h-128v128h128v-128zM128 198h-128v128h128v-128zM384 -58h-128v128h128v-128zM640 -314h-128v128h128v-128zM128 -58h-128v128h128v-128zM384 -314h-128v128h128v-128z M128 -314h-128v128h128v-128z" />
+<glyph unicode="&#x2592;" d="M1920 1478h-128v128h128v-128zM2048 1350h-128v128h128v-128zM1664 1478h-128v128h128v-128zM1792 1350h-128v128h128v-128zM1920 1222h-128v128h128v-128zM2048 1094h-128v128h128v-128zM1408 1478h-128v128h128v-128zM1536 1350h-128v128h128v-128zM1664 1222h-128v128 h128v-128zM1792 1094h-128v128h128v-128zM1920 966h-128v128h128v-128zM2048 838h-128v128h128v-128zM1152 1478h-128v128h128v-128zM1280 1350h-128v128h128v-128zM1408 1222h-128v128h128v-128zM1536 1094h-128v128h128v-128zM1664 966h-128v128h128v-128zM1792 838h-128 v128h128v-128zM1920 710h-128v128h128v-128zM2048 582h-128v128h128v-128zM896 1478h-128v128h128v-128zM1024 1350h-128v128h128v-128zM1152 1222h-128v128h128v-128zM1280 1094h-128v128h128v-128zM1408 966h-128v128h128v-128zM1536 838h-128v128h128v-128zM1664 710 h-128v128h128v-128zM1792 582h-128v128h128v-128zM1920 454h-128v128h128v-128zM2048 326h-128v128h128v-128zM640 1478h-128v128h128v-128zM768 1350h-128v128h128v-128zM896 1222h-128v128h128v-128zM1024 1094h-128v128h128v-128zM1152 966h-128v128h128v-128zM1280 838 h-128v128h128v-128zM1408 710h-128v128h128v-128zM1536 582h-128v128h128v-128zM1664 454h-128v128h128v-128zM1792 326h-128v128h128v-128zM1920 198h-128v128h128v-128zM2048 70h-128v128h128v-128zM384 1478h-128v128h128v-128zM512 1350h-128v128h128v-128zM640 1222 h-128v128h128v-128zM768 1094h-128v128h128v-128zM896 966h-128v128h128v-128zM1024 838h-128v128h128v-128zM1152 710h-128v128h128v-128zM1280 582h-128v128h128v-128zM1408 454h-128v128h128v-128zM1536 326h-128v128h128v-128zM1664 198h-128v128h128v-128zM1792 70 h-128v128h128v-128zM1920 -58h-128v128h128v-128zM2048 -186h-128v128h128v-128zM128 1478h-128v128h128v-128zM256 1350h-128v128h128v-128zM384 1222h-128v128h128v-128zM512 1094h-128v128h128v-128zM640 966h-128v128h128v-128zM768 838h-128v128h128v-128zM896 710 h-128v128h128v-128zM1024 582h-128v128h128v-128zM1152 454h-128v128h128v-128zM1280 326h-128v128h128v-128zM1408 198h-128v128h128v-128zM1536 70h-128v128h128v-128zM1664 -58h-128v128h128v-128zM1792 -186h-128v128h128v-128zM1920 -314h-128v128h128v-128zM2048 -442 h-128v128h128v-128zM128 1222h-128v128h128v-128zM256 1094h-128v128h128v-128zM384 966h-128v128h128v-128zM512 838h-128v128h128v-128zM640 710h-128v128h128v-128zM768 582h-128v128h128v-128zM896 454h-128v128h128v-128zM1024 326h-128v128h128v-128zM1152 198h-128 v128h128v-128zM1280 70h-128v128h128v-128zM1408 -58h-128v128h128v-128zM1536 -186h-128v128h128v-128zM1664 -314h-128v128h128v-128zM1792 -442h-128v128h128v-128zM128 966h-128v128h128v-128zM256 838h-128v128h128v-128zM384 710h-128v128h128v-128zM512 582h-128v128 h128v-128zM640 454h-128v128h128v-128zM768 326h-128v128h128v-128zM896 198h-128v128h128v-128zM1024 70h-128v128h128v-128zM1152 -58h-128v128h128v-128zM1280 -186h-128v128h128v-128zM1408 -314h-128v128h128v-128zM1536 -442h-128v128h128v-128zM128 710h-128v128h128 v-128zM256 582h-128v128h128v-128zM384 454h-128v128h128v-128zM512 326h-128v128h128v-128zM640 198h-128v128h128v-128zM768 70h-128v128h128v-128zM896 -58h-128v128h128v-128zM1024 -186h-128v128h128v-128zM1152 -314h-128v128h128v-128zM1280 -442h-128v128h128v-128z M128 454h-128v128h128v-128zM256 326h-128v128h128v-128zM384 198h-128v128h128v-128zM512 70h-128v128h128v-128zM640 -58h-128v128h128v-128zM768 -186h-128v128h128v-128zM896 -314h-128v128h128v-128zM1024 -442h-128v128h128v-128zM128 198h-128v128h128v-128zM256 70 h-128v128h128v-128zM384 -58h-128v128h128v-128zM512 -186h-128v128h128v-128zM640 -314h-128v128h128v-128zM768 -442h-128v128h128v-128zM128 -58h-128v128h128v-128zM256 -186h-128v128h128v-128zM384 -314h-128v128h128v-128zM512 -442h-128v128h128v-128zM128 -314 h-128v128h128v-128zM256 -442h-128v128h128v-128z" />
+<glyph unicode="&#x2593;" d="M2048 -314h-128v-128h-128v128h-128v-128h-128v128h-128v-128h-128v128h-128v-128h-128v128h-128v-128h-128v128h-128v-128h-128v128h-128v-128h-128v128h-128v-128h-128v2048h2048v-128h-128v-128h128v-128h-128v-128h128v-128h-128v-128h128v-128h-128v-128h128v-128 h-128v-128h128v-128h-128v-128h128v-128h-128v-128h128v-128zM1792 1350v128h-128v-128h128zM1536 1350v128h-128v-128h128zM1792 1094v128h-128v-128h128zM1280 1350v128h-128v-128h128zM1536 1094v128h-128v-128h128zM1792 838v128h-128v-128h128zM1024 1350v128h-128 v-128h128zM1280 1094v128h-128v-128h128zM1536 838v128h-128v-128h128zM1792 582v128h-128v-128h128zM768 1350v128h-128v-128h128zM1024 1094v128h-128v-128h128zM1280 838v128h-128v-128h128zM1536 582v128h-128v-128h128zM1792 326v128h-128v-128h128zM512 1350v128h-128 v-128h128zM768 1094v128h-128v-128h128zM1024 838v128h-128v-128h128zM1280 582v128h-128v-128h128zM1536 326v128h-128v-128h128zM1792 70v128h-128v-128h128zM256 1350v128h-128v-128h128zM512 1094v128h-128v-128h128zM768 838v128h-128v-128h128zM1024 582v128h-128 v-128h128zM1280 326v128h-128v-128h128zM1536 70v128h-128v-128h128zM1792 -186v128h-128v-128h128zM256 1094v128h-128v-128h128zM512 838v128h-128v-128h128zM768 582v128h-128v-128h128zM1024 326v128h-128v-128h128zM1280 70v128h-128v-128h128zM1536 -186v128h-128 v-128h128zM256 838v128h-128v-128h128zM512 582v128h-128v-128h128zM768 326v128h-128v-128h128zM1024 70v128h-128v-128h128zM1280 -186v128h-128v-128h128zM256 582v128h-128v-128h128zM512 326v128h-128v-128h128zM768 70v128h-128v-128h128zM1024 -186v128h-128v-128 h128zM256 326v128h-128v-128h128zM512 70v128h-128v-128h128zM768 -186v128h-128v-128h128zM256 70v128h-128v-128h128zM512 -186v128h-128v-128h128zM256 -186v128h-128v-128h128z" />
+<glyph unicode="&#x2594;" d="M2048 1350h-2048v256h2048v-256z" />
+<glyph unicode="&#x2595;" d="M2048 -442h-256v2048h256v-2048z" />
+<glyph unicode="&#x2596;" d="M1024 -442h-1024v1024h1024v-1024z" />
+<glyph unicode="&#x2597;" d="M2048 -442h-1024v1024h1024v-1024z" />
+<glyph unicode="&#x2598;" d="M1024 582h-1024v1024h1024v-1024z" />
+<glyph unicode="&#x2599;" d="M2048 -442h-2048v2048h1024v-1024h1024v-1024z" />
+<glyph unicode="&#x259a;" d="M2048 -442h-1024v1024h1024v-1024zM1024 582h-1024v1024h1024v-1024z" />
+<glyph unicode="&#x259b;" d="M2048 582h-1024v-1024h-1024v2048h2048v-1024z" />
+<glyph unicode="&#x259c;" d="M2048 -442h-1024v1024h-1024v1024h2048v-2048z" />
+<glyph unicode="&#x259d;" d="M2048 582h-1024v1024h1024v-1024z" />
+<glyph unicode="&#x259e;" d="M1024 -442h-1024v1024h1024v-1024zM2048 582h-1024v1024h1024v-1024z" />
+<glyph unicode="&#x259f;" d="M2048 -442h-2048v1024h1024v1024h1024v-2048z" />
+<glyph unicode="&#x25a0;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344z" />
+<glyph unicode="&#x25a1;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 10v1144h-1144v-1144h1144z" />
+<glyph unicode="&#x25a2;" horiz-adv-x="1628" d="M1406 352q0 -147 -102.5 -249.5t-249.5 -102.5h-480q-147 0 -249.5 102.5t-102.5 249.5v480q0 148 102 250t250 102h480q147 0 249.5 -102.5t102.5 -249.5v-480zM1308 352v480q0 106 -74 180t-180 74h-480q-106 0 -179.5 -73.5t-73.5 -180.5v-480q0 -105 74 -179t179 -74 h480q105 0 179.5 74t74.5 179z" />
+<glyph unicode="&#x25a3;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 10v1144h-1144v-1144h1144zM1085 286h-592v592h592v-592z" />
+<glyph unicode="&#x25a4;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 943v211h-1144v-211h1144zM1361 632v211h-1144v-211h1144zM1361 321v211h-1144v-211h1144zM1361 10v211h-1144v-211h1144z" />
+<glyph unicode="&#x25a5;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 10v1144h-211v-1144h211zM1050 10v1144h-211v-1144h211zM739 10v1144h-211v-1144h211zM428 10v1144h-211v-1144h211z" />
+<glyph unicode="&#x25a6;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 943v211h-211v-211h211zM1050 943v211h-211v-211h211zM1361 632v211h-211v-211h211zM739 943v211h-211v-211h211zM1050 632v211h-211v-211h211zM1361 321v211h-211v-211h211zM428 943v211h-211v-211h211zM739 632v211h-211v-211 h211zM1050 321v211h-211v-211h211zM1361 10v211h-211v-211h211zM428 632v211h-211v-211h211zM739 321v211h-211v-211h211zM1050 10v211h-211v-211h211zM428 321v211h-211v-211h211zM739 10v211h-211v-211h211zM428 10v211h-211v-211h211z" />
+<glyph unicode="&#x25a7;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 1154h-194l194 -194v194zM1361 521v298l-335 335h-298zM1361 81v298l-775 775h-298zM1290 10l-1073 1073v-298l775 -775h298zM850 10l-633 633v-298l335 -335h298zM217 10h194l-194 194v-194z" />
+<glyph unicode="&#x25a8;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM217 1154v-194l194 194h-194zM850 1154h-298l-335 -335v-298zM1290 1154h-298l-775 -775v-298zM1361 785v298l-1073 -1073h298zM1361 345v298l-633 -633h298zM1361 10v194l-194 -194h194z" />
+<glyph unicode="&#x25a9;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1290 1154h-123l62 -61zM1361 960v123l-61 -61zM1158 1022l-132 132h-34l-132 -132l149 -149zM1361 785v34l-132 132l-149 -149l149 -149zM850 1154h-122l61 -61zM1361 521v122l-61 -61zM938 802l-149 149l-149 -149l149 -149zM1158 582 l-149 149l-149 -149l149 -149zM718 1022l-132 132h-34l-132 -132l149 -149zM1361 345v34l-132 132l-149 -149l149 -149zM411 1154h-123l61 -61zM1361 81v123l-61 -62zM278 1022l-61 61v-123zM1290 10l-61 61l-62 -61h123zM498 802l-149 149l-132 -132v-34l132 -132z M1158 142l-149 149l-149 -149l132 -132h34zM718 582l-149 149l-149 -149l149 -149zM938 362l-149 149l-149 -149l149 -149zM278 582l-61 61v-122zM850 10l-61 61l-61 -61h122zM498 362l-149 149l-132 -132v-34l132 -132zM718 142l-149 149l-149 -149l132 -132h34zM278 142 l-61 62v-123zM411 10l-62 61l-61 -61h123z" />
+<glyph unicode="&#x25aa;" horiz-adv-x="738" d="M665 286h-592v592h592v-592z" />
+<glyph unicode="&#x25ab;" horiz-adv-x="738" d="M665 286h-592v592h592v-592zM565 386v392h-392v-392h392z" />
+<glyph unicode="&#x25ac;" horiz-adv-x="1338" d="M1265 286h-1192v592h1192v-592z" />
+<glyph unicode="&#x25ad;" horiz-adv-x="1338" d="M1265 286h-1192v592h1192v-592zM1165 386v392h-992v-392h992z" />
+<glyph unicode="&#x25ae;" horiz-adv-x="738" d="M665 -14h-592v1192h592v-1192z" />
+<glyph unicode="&#x25af;" horiz-adv-x="738" d="M665 -14h-592v1192h592v-1192zM565 86v992h-392v-992h392z" />
+<glyph unicode="&#x25b0;" horiz-adv-x="1638" d="M1565 878l-300 -592h-1192l300 592h1192z" />
+<glyph unicode="&#x25b1;" horiz-adv-x="1638" d="M1565 878l-300 -592h-1192l300 592h1192zM1402 778h-968l-198 -392h968z" />
+<glyph unicode="&#x25b2;" horiz-adv-x="1578" d="M1530 18h-1482l741 1191z" />
+<glyph unicode="&#x25b3;" horiz-adv-x="1578" d="M1530 18h-1482l741 1191zM1350 118l-561 902l-561 -902h1122z" />
+<glyph unicode="&#x25b4;" horiz-adv-x="738" d="M695 334h-652l326 524z" />
+<glyph unicode="&#x25b5;" horiz-adv-x="738" d="M695 334h-652l326 524zM515 434l-146 235l-146 -235h292z" />
+<glyph unicode="&#x25b6;" horiz-adv-x="1356" d="M1308 582l-1191 -741v1482z" />
+<glyph unicode="&#x25b7;" horiz-adv-x="1356" d="M1308 582l-1191 -741v1482zM1119 582l-902 561v-1122z" />
+<glyph unicode="&#x25b8;" horiz-adv-x="645" d="M597 582l-524 -326v652z" />
+<glyph unicode="&#x25b9;" horiz-adv-x="645" d="M597 582l-524 -326v652zM408 582l-235 146v-292z" />
+<glyph unicode="&#x25ba;" horiz-adv-x="1888" d="M1808 582l-1606 -564v1128z" />
+<glyph unicode="&#x25bb;" horiz-adv-x="1888" d="M1808 582l-1606 -564v1128zM1506 582l-1204 423v-846z" />
+<glyph unicode="&#x25bc;" horiz-adv-x="1578" d="M1530 1209l-741 -1191l-741 1191h1482z" />
+<glyph unicode="&#x25bd;" horiz-adv-x="1578" d="M1530 1209l-741 -1191l-741 1191h1482zM1350 1109h-1122l561 -902z" />
+<glyph unicode="&#x25be;" horiz-adv-x="738" d="M695 858l-326 -524l-326 524h652z" />
+<glyph unicode="&#x25bf;" horiz-adv-x="738" d="M695 858l-326 -524l-326 524h652zM515 758h-292l146 -235z" />
+<glyph unicode="&#x25c0;" horiz-adv-x="1356" d="M1239 -159l-1191 741l1191 741v-1482z" />
+<glyph unicode="&#x25c1;" horiz-adv-x="1356" d="M1239 -159l-1191 741l1191 741v-1482zM1139 21v1122l-902 -561z" />
+<glyph unicode="&#x25c2;" horiz-adv-x="645" d="M572 256l-524 326l524 326v-652z" />
+<glyph unicode="&#x25c3;" horiz-adv-x="645" d="M572 256l-524 326l524 326v-652zM472 436v292l-235 -146z" />
+<glyph unicode="&#x25c4;" horiz-adv-x="1888" d="M1686 18l-1606 564l1606 564v-1128z" />
+<glyph unicode="&#x25c5;" horiz-adv-x="1888" d="M1686 18l-1606 564l1606 564v-1128zM1586 159v846l-1204 -423z" />
+<glyph unicode="&#x25c6;" horiz-adv-x="1578" d="M1568 582l-779 -779l-779 779l779 779z" />
+<glyph unicode="&#x25c7;" horiz-adv-x="1578" d="M1568 582l-779 -779l-779 779l779 779zM1427 582l-638 638l-638 -638l638 -638z" />
+<glyph unicode="&#x25c8;" horiz-adv-x="1578" d="M1568 582l-779 -779l-779 779l779 779zM1427 582l-638 638l-638 -638l638 -638zM1132 582l-343 -343l-343 343l343 343z" />
+<glyph unicode="&#x25c9;" horiz-adv-x="1578" d="M1222 582q0 -180 -126.5 -306.5t-306.5 -126.5t-306.5 126.5t-126.5 306.5t126.5 306.5t306.5 126.5t306.5 -126.5t126.5 -306.5zM1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582 q0 270 -189.5 459.5t-459.5 189.5t-459.5 -189.5t-189.5 -459.5t189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5z" />
+<glyph unicode="&#x25ca;" horiz-adv-x="1578" d="M1378 582l-589 -779l-589 779l589 779zM1253 582l-464 613l-464 -613l464 -613z" />
+<glyph unicode="&#x25cb;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582q0 270 -189.5 459.5t-459.5 189.5t-459.5 -189.5t-189.5 -459.5t189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5z" />
+<glyph unicode="&#x25cc;" horiz-adv-x="1174" d="M1021 896q0 -23 -18 -38t-41 -15t-38 18t-15 41t17.5 38t41 15t38.5 -18t15 -41zM833 953q-14 0 -27 7q-29 17 -29 49q0 15 8 28q16 28 49 28q14 0 28 -8q28 -16 28 -39.5t-8 -36.5q-16 -28 -49 -28zM1106 751q0 -56 -56 -56t-56 56t56 56t56 -56zM617 1077q9 47 50 47 q7 0 15 -2q47 -8 47 -49q0 -7 -1 -15q-9 -47 -50 -47q-7 0 -15 1q-47 9 -47 50q0 7 1 15zM1136 582q0 -56 -56 -56t-56 56t56 56t56 -56zM446 1058q-1 8 -1 15q0 41 47 49q8 2 15 2q41 0 49 -47q2 -8 2 -15q0 -41 -47 -50q-8 -1 -15 -1q-41 0 -50 47zM1050 357q-56 0 -56 56 t56 56t56 -56t-56 -56zM389 1037q8 -13 8 -36.5t-21 -35.5t-35 -12q-33 0 -49 28q-8 13 -8 28q0 32 29 48q13 8 27 8q33 0 49 -28zM967.5 209q-23.5 0 -41 15t-17.5 38t15 41t38 18t41 -15t18 -38t-15 -41t-38.5 -18zM212 843q-23 0 -41 15t-18 38t15 41t38.5 18t41 -15 t17.5 -38t-15 -41t-38 -18zM882 183q8 -13 8 -36.5t-21 -35.5t-35 -12q-33 0 -49 28q-8 13 -8 28q0 32 29 49q13 7 27 7q33 0 49 -28zM124 695q-56 0 -56 56t56 56t56 -56t-56 -56zM617 87q-1 8 -1 15q0 41 47 50q8 1 15 1q41 0 50 -47q1 -8 1 -15q0 -41 -47 -49 q-8 -2 -15 -2q-41 0 -50 47zM150 582q0 -56 -56 -56t-56 56t56 56t56 -56zM446 106q9 47 50 47q7 0 15 -1q47 -9 47 -50q0 -7 -2 -15q-8 -47 -49 -47q-7 0 -15 2q-47 8 -47 49q0 7 1 15zM180 413q0 -56 -56 -56t-56 56t56 56t56 -56zM340 99q-14 0 -27 8q-29 16 -29 48 q0 15 8 28q16 28 49 28q14 0 35 -12t21 -35.5t-8 -36.5q-16 -28 -49 -28zM265 262q0 -23 -17.5 -38t-41 -15t-38.5 18t-15 41t18 38t41 15t38 -18t15 -41z" />
+<glyph unicode="&#x25cd;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582q0 310 -238 504v-1008q238 194 238 504zM1100 11v1142q-121 66 -261 76v-1294q140 10 261 76zM739 -65v1294q-140 -10 -261 -76 v-1142q121 -66 261 -76zM140 582q0 -310 238 -504v1008q-238 -194 -238 -504z" />
+<glyph unicode="&#x25ce;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582q0 270 -189.5 459.5t-459.5 189.5t-459.5 -189.5t-189.5 -459.5t189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5zM1288 582 q0 -208 -145.5 -353.5t-353.5 -145.5t-353.5 145.5t-145.5 353.5t145.5 353.5t353.5 145.5t353.5 -145.5t145.5 -353.5zM1188 582q0 167 -116 283t-283 116t-283 -116t-116 -283t116 -283t283 -116t283 116t116 283z" />
+<glyph unicode="&#x25cf;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5z" />
+<glyph unicode="&#x25d0;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582q0 270 -189.5 459.5t-459.5 189.5v-1298q270 0 459.5 189.5t189.5 459.5z" />
+<glyph unicode="&#x25d1;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM789 -67v1298q-270 0 -459.5 -189.5t-189.5 -459.5t189.5 -459.5t459.5 -189.5z" />
+<glyph unicode="&#x25d2;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582q0 270 -189.5 459.5t-459.5 189.5t-459.5 -189.5t-189.5 -459.5h1298z" />
+<glyph unicode="&#x25d3;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582h-1298q0 -270 189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5z" />
+<glyph unicode="&#x25d4;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582h-649v649q-270 0 -459.5 -189.5t-189.5 -459.5t189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5z" />
+<glyph unicode="&#x25d5;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM789 582v649q-270 0 -459.5 -189.5t-189.5 -459.5h649z" />
+<glyph unicode="&#x25d6;" horiz-adv-x="906" d="M789 -167q-312 0 -530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5v-1498z" />
+<glyph unicode="&#x25d7;" horiz-adv-x="906" d="M866 582q0 -312 -218.5 -530.5t-530.5 -218.5v1498q312 0 530.5 -218.5t218.5 -530.5z" />
+<glyph unicode="&#x25d8;" d="M2048 -442h-2048v2048h2048v-2048zM1457 582q0 180 -126.5 306.5t-306.5 126.5t-306.5 -126.5t-126.5 -306.5t126.5 -306.5t306.5 -126.5t306.5 126.5t126.5 306.5z" />
+<glyph unicode="&#x25d9;" d="M2048 -442h-2048v2048h2048v-2048zM1773 582q0 312 -218.5 530.5t-530.5 218.5t-530.5 -218.5t-218.5 -530.5t218.5 -530.5t530.5 -218.5t530.5 218.5t218.5 530.5zM1673 582q0 -270 -189.5 -459.5t-459.5 -189.5t-459.5 189.5t-189.5 459.5t189.5 459.5t459.5 189.5 t459.5 -189.5t189.5 -459.5z" />
+<glyph unicode="&#x25da;" d="M2048 582h-275q0 312 -218.5 530.5t-530.5 218.5t-530.5 -218.5t-218.5 -530.5h-275v1024h2048v-1024zM1673 582h-1298q0 270 189.5 459.5t459.5 189.5t459.5 -189.5t189.5 -459.5z" />
+<glyph unicode="&#x25db;" d="M1673 582q0 -270 -189.5 -459.5t-459.5 -189.5t-459.5 189.5t-189.5 459.5h1298zM2048 -442h-2048v1024h275q0 -312 218.5 -530.5t530.5 -218.5t530.5 218.5t218.5 530.5h275v-1024z" />
+<glyph unicode="&#x25dc;" horiz-adv-x="1578" d="M789 1231q-270 0 -459.5 -189.5t-189.5 -459.5h-100q0 312 218.5 530.5t530.5 218.5v-100z" />
+<glyph unicode="&#x25dd;" horiz-adv-x="1578" d="M1538 582h-100q0 270 -189.5 459.5t-459.5 189.5v100q312 0 530.5 -218.5t218.5 -530.5z" />
+<glyph unicode="&#x25de;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5v100q270 0 459.5 189.5t189.5 459.5h100z" />
+<glyph unicode="&#x25df;" horiz-adv-x="1578" d="M789 -167q-312 0 -530.5 218.5t-218.5 530.5h100q0 -270 189.5 -459.5t459.5 -189.5v-100z" />
+<glyph unicode="&#x25e0;" horiz-adv-x="1578" d="M1538 582h-100q0 270 -189.5 459.5t-459.5 189.5t-459.5 -189.5t-189.5 -459.5h-100q0 312 218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5z" />
+<glyph unicode="&#x25e1;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5h100q0 -270 189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5h100z" />
+<glyph unicode="&#x25e2;" horiz-adv-x="1578" d="M1461 -90h-1344l1344 1344v-1344z" />
+<glyph unicode="&#x25e3;" horiz-adv-x="1578" d="M117 -90v1344l1344 -1344h-1344z" />
+<glyph unicode="&#x25e4;" horiz-adv-x="1578" d="M117 1254h1344l-1344 -1344v1344z" />
+<glyph unicode="&#x25e5;" horiz-adv-x="1578" d="M1461 1254v-1344l-1344 1344h1344z" />
+<glyph unicode="&#x25e6;" horiz-adv-x="738" d="M698 582q0 -137 -96 -233t-233 -96t-233 96t-96 233t96 233t233 96t233 -96t96 -233zM598 582q0 96 -66.5 162.5t-162.5 66.5t-162.5 -66.5t-66.5 -162.5t66.5 -162.5t162.5 -66.5t162.5 66.5t66.5 162.5z" />
+<glyph unicode="&#x25e7;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 10v1144h-572v-1144h572z" />
+<glyph unicode="&#x25e8;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM789 10v1144h-572v-1144h572z" />
+<glyph unicode="&#x25e9;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 10v1144l-1144 -1144h1144z" />
+<glyph unicode="&#x25ea;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM217 1154v-1144l1144 1144h-1144z" />
+<glyph unicode="&#x25eb;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 10v1144h-522v-1144h522zM739 10v1144h-522v-1144h522z" />
+<glyph unicode="&#x25ec;" horiz-adv-x="1578" d="M1530 18h-1482l741 1191zM1350 118l-561 902l-561 -902h1122zM873 535q35 -35 35 -83.5t-35 -83.5t-84 -35t-84 35t-35 83.5t35 83.5t84 35t84 -35z" />
+<glyph unicode="&#x25ed;" horiz-adv-x="1578" d="M1530 18h-1482l741 1191zM789 118h561l-561 902v-902z" />
+<glyph unicode="&#x25ee;" horiz-adv-x="1578" d="M1530 18h-1482l741 1191zM789 118v902l-561 -902h561z" />
+<glyph unicode="&#x25ef;" d="M2008 582q0 -410 -287 -697t-697 -287t-697 287t-287 697t287 697t697 287t697 -287t287 -697zM1908 582q0 368 -258 626t-626.5 258t-626 -257.5t-257.5 -626.5t257.5 -626.5t626 -257.5t626.5 258t258 626z" />
+<glyph unicode="&#x25f0;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM739 632v522h-522v-522h522zM1361 10v1144h-522v-622h-622v-522h1144z" />
+<glyph unicode="&#x25f1;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 10v1144h-1144v-522h622v-622h522zM739 10v522h-522v-522h522z" />
+<glyph unicode="&#x25f2;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 632v522h-1144v-1144h522v622h622zM1361 10v522h-522v-522h522z" />
+<glyph unicode="&#x25f3;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 632v522h-522v-522h522zM1361 10v522h-622v622h-522v-1144h1144z" />
+<glyph unicode="&#x25f4;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM739 632v597q-240 -18 -409.5 -187.5t-187.5 -409.5h597zM1248.5 122.5q189.5 189.5 189.5 453t-172.5 449t-426.5 204.5v-697h-697 q19 -254 204.5 -426.5t449 -172.5t453 189.5z" />
+<glyph unicode="&#x25f5;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1265.5 139.5q172.5 185.5 172.5 449t-189.5 453t-453 189.5t-449 -172.5t-204.5 -426.5h697v-697q254 19 426.5 204.5zM739 532h-597 q18 -240 187.5 -409.5t409.5 -187.5v597z" />
+<glyph unicode="&#x25f6;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1231.5 1058.5q-185.5 172.5 -449 172.5t-453 -189.5t-189.5 -453t172.5 -449t426.5 -204.5v697h697q-19 254 -204.5 426.5zM839 532v-597 q240 18 409.5 187.5t187.5 409.5h-597z" />
+<glyph unicode="&#x25f7;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM839 632h597q-18 240 -187.5 409.5t-409.5 187.5v-597zM739 532v697q-254 -19 -426.5 -204.5t-172.5 -449t189.5 -453t453 -189.5 t449 172.5t204.5 426.5h-697z" />
+<glyph unicode="&#x25f8;" horiz-adv-x="1578" d="M117 1254h1344l-1344 -1344v1344zM217 1154v-1003l1003 1003h-1003z" />
+<glyph unicode="&#x25f9;" horiz-adv-x="1578" d="M1461 1254v-1344l-1344 1344h1344zM1361 1154h-1003l1003 -1003v1003z" />
+<glyph unicode="&#x25fa;" horiz-adv-x="1578" d="M117 -90v1344l1344 -1344h-1344zM217 10h1003l-1003 1003v-1003z" />
+<glyph unicode="&#x25fb;" horiz-adv-x="1218" d="M1121 70h-1024v1024h1024v-1024zM1021 170v824h-824v-824h824z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="1218" d="M1121 70h-1024v1024h1024v-1024z" />
+<glyph unicode="&#x25fd;" horiz-adv-x="946" d="M862 193h-778v778h778v-778zM762 293v578h-578v-578h578z" />
+<glyph unicode="&#x25fe;" horiz-adv-x="946" d="M862 193h-778v778h778v-778z" />
+<glyph unicode="&#x25ff;" horiz-adv-x="1578" d="M1461 -90h-1344l1344 1344v-1344zM1361 10v1003l-1003 -1003h1003z" />
+<glyph unicode="&#x2600;" d="M1686 460q-29 -2 -29 -29.5t16 -38.5l214 -147l-257 47q-15 3 -31.5 -4.5t-16.5 -22.5q0 -5 193 -239l-233 119q-10 5 -28 5q-39 0 -39 -30q0 -7 121 -257l-209 171q-11 9 -23.5 9t-21 -18t-5.5 -35l44 -247l-157 221q-7 10 -21 10q-33 0 -36 -30l-25 -269l-90 249 q-10 27 -32 27t-30 -21l-91 -249l-20 251q-3 40 -38 40q-17 0 -30 -19l-150 -218l52 275q2 12 -11 23.5t-23.5 11.5t-17.5 -6l-215 -184q125 254 125 265q0 31 -32 31q-6 0 -269 -131l186 221q7 8 7 22t-17 23t-33 6l-273 -57l231 157q22 15 22 36q0 29 -38 32l-257 20 l237 84q34 12 34 36.5t-40 38.5l-245 84l283 20q28 2 28 29t-22 41l-239 149l287 -51q6 -1 11 -1q31 0 31 36q0 10 -5 16l-190 219q275 -132 280 -132q22 0 22 33q0 10 -124 268l207 -171q18 -15 31 -15q31 0 31 30q0 8 -2 17l-56 263l168 -239q6 -8 16 -8q33 0 36 38 l25 273l77 -236q16 -48 40.5 -48t36.5 33l88 247l19 -253q4 -50 38 -50q15 0 31 23l155 222l-52 -259q-3 -16 3.5 -35.5t20 -19.5t26.5 11l219 190l-123 -255q-6 -12 -6 -23q0 -29 33 -29q14 0 30 8l225 113l-165 -201q-14 -17 -14 -34q0 -29 26 -29q6 0 16 2l277 57 l-227 -157q-24 -17 -24 -36q0 -26 38 -29l272 -23l-251 -86q-38 -13 -38 -37q0 -19 30 -30l261 -92zM1429 196.5q167 166.5 167 406t-166.5 406t-406 166.5t-405.5 -167t-166 -405.5t166.5 -405.5t405 -167t405.5 166.5z" />
+<glyph unicode="&#x2601;" d="M968 309l-144 -13q-109 0 -183 59q-53 42 -71.5 51.5t-70.5 9.5t-148 -22.5t-145 -22.5q-206 0 -206 122q0 85 320 132q2 57 19.5 86.5t67.5 80.5q98 244 201 244q27 0 50 -10q15 82 100 168.5t165 86.5q59 0 100 -59q85 148 217 148q94 0 165.5 -62t71.5 -154 q0 -39 -11 -74q38 11 86 11q84 0 142 -58t58 -141q0 -54 -26 -110q19 4 37 4q88 0 186.5 -60t98.5 -142q0 -78 -241 -198q-69 -93 -247 -93q-112 0 -308 -36q-22 -4 -49.5 -4t-109 28t-125.5 28zM1943 597q0 54 -78 82q-56 20 -132 20t-130 -59q24 -36 24 -58 q0 -102 -144 -102q-87 0 -145 33q-26 15 -26 40t26 33q113 -38 147 -38q66 0 66 36q0 17 -58 59q53 82 53 158q0 35 -33.5 54t-71.5 19q-84 0 -145 -56q-14 -4 -28 -4q-34 0 -34 25q0 12 11 25q71 84 207 84q66 0 119.5 -39.5t53.5 -103.5q0 -23 -3 -47q45 60 45 110.5 t-35.5 93t-86.5 42.5q-118 0 -164 -57q-57 2 -73 32q49 53 66.5 81.5t17.5 83t-48.5 92.5t-105.5 38q-119 0 -222 -239q-31 139 -105 139q-56 0 -126.5 -69.5t-70.5 -171.5l-47 -62q-33 92 -60 92q-50 0 -96 -99q-61 -134 -67 -141l-36 -39q-12 -17 -15 -52l170 14 q4 -8 4 -17q0 -30 -28 -58q-123 0 -311 -34q-42 -6 -96 -16t-54 -28q0 -49 128 -49q50 0 146 23t146 23q94 0 175.5 -58.5t150.5 -58.5q214 0 214 118q13 18 34 18t37 -18q0 -74 -54 -119q126 -45 176 -45t179.5 22t152.5 22q125 0 167 69l123 69q90 56 90 88zM900 876 q-6 0 -12 2q-6 63 -13 63q-40 0 -58 -60q-10 -46 -19 -92q-9 -34 -42 -36q-19 39 -25 39q-27 0 -43 -43l-17 -65q-25 -84 -91 -148q63 331 153 331q8 0 16 -3q13 52 46.5 102t75.5 50q71 0 70 -108q-12 -32 -41 -32z" />
+<glyph unicode="&#x2602;" horiz-adv-x="2156" d="M2056 267q0 -52 -20 -52q-15 0 -19 34.5t-6 62.5q-12 76 -63 137.5t-122 61.5q-140 0 -213 -208q-7 -25 -23 -74q-6 -17 -20.5 -17t-19.5 19q-2 38 -25 129q-61 151 -207 151q-163 0 -197 -192q-9 -51 -9 -70v-489q0 -89 -45.5 -145.5t-128.5 -56.5t-138.5 53.5 t-55.5 132.5q0 34 34 34t34 -34q0 -51 35.5 -84.5t86.5 -33.5q110 0 110 134v489q0 19 -9 70q-34 192 -197 192q-146 0 -207 -151q-12 -30 -16.5 -71t-9 -59t-19 -18t-20.5 21l-23 70q-73 208 -213 208q-71 0 -122 -61.5t-63 -137.5q-2 -28 -6 -62.5t-19 -34.5q-20 0 -20 52 q0 337 311 571q278 207 633 229v35q0 34 34 34t34 -34v-35q355 -22 633 -229q311 -234 311 -571z" />
+<glyph unicode="&#x2603;" d="M1602 739q0 -99 -229 -179q161 -109 161 -295q0 -53 -30 -123l-56 -132q-49 -124 -171 -201l139 -9l48 29l26 -4l-72 -46q-54 2 -163 8l-57 18q-130 41 -182 41q-88 0 -197 -61l-42 6v20l40 -6l26 12q-24 0 -116 69l-91 -8l-31 -23l-41 4l4 14l30 -4l30 25l81 8 q-159 125 -159 303.5t91 288.5q-320 79 -320 221q0 80 83 116l-52 73l-75 -25l-86 29l12 13l74 -25l66 21l-66 89l-59 36l-86 -8l-29 -48l-55 -28l-8 14l48 24l22 36l-36 -2l-24 -17l-16 11l34 24l127 7l-52 29l-7 105l-40 36l14 14l45 -42l5 -100l127 -75l111 -151l12 -4 l-83 119q-7 48 -26 142q-2 10 -18.5 50.5t-16.5 56t1 22.5l18 5q-1 -8 -1 -16q0 -40 31 -95l28 66l15 -4l-11 -26l22 14l18 61l15 -2l-19 -69l-38 -23l-24 -38l22 -136l40 -54l65 66v114l17 21v-141l-71 -74l48 -82q62 0 211 -55q-10 14 -10 30q0 53 66 73q-48 47 -48 130 t30 148l-82 -17l7 62l87 26q2 9 2 26q0 63 -23 90q-6 7 -35 21t-29 26q0 49 145 112.5t261 63.5q32 0 32 -25q0 -9 -21 -52.5t-21 -68.5q0 -45 36 -70l70 36l50 -36l-42 -29q184 -73 184 -230q0 -127 -69 -188q71 0 71 -102q97 73 150 73q24 0 57 -17l3 97l-49 76l9 22 l58 -92l-6 -90l29 31l17 123l29 17q18 39 18 118q0 33 -3 74l16 34l21 2l-16 -36q3 -40 3 -73q0 -76 -18 -110l105 52l77 194l12 -13l-63 -164l179 -3l-4 -16l-177 -1l-156 -81l-5 -18l99 28l90 -36l58 12l6 -12l-68 -14l-88 34l-99 -28l-14 -92l-40 -41l14 -15l93 21 l146 -48l75 71l36 8l19 80h17l-18 -78l84 13l4 -15l-135 -25l-59 -62l59 -36l-13 -12q-61 50 -215 87l-82 -21q33 -36 33 -94zM990 1388q-17 19 -17 32t13 46l-22 -12q-14 -25 -14 -38t16 -30zM1038 1550q0 8 -12 15h-22q12 -9 12 -17q0 -50 -267 -138v-18q289 85 289 158z M1293 842q0 34 -34 54q18 -25 18 -56.5t-10 -50.5l22 17q4 19 4 36zM1291 1105q0 152 -184 218q-315 -148 -396 -148q-31 -68 -31 -149q0 -120 102 -158q56 -20 204 -20q21 60 74.5 60t79.5 -35q69 0 113 85q38 71 38 147zM1243 777q8 29 8 51t-44 56l-22 -17 q39 -31 39 -100zM1205 769q0 53 -35 92l-19 -5q14 -12 14 -41t-6 -50l-16 6q6 18 6 40t-24 50.5t-51 28.5q-53 0 -62 -38q42 -30 51 -70q4 -16 4 -91q71 0 128 28q10 28 10 50zM908 733q54 0 136 22q0 73 -48 82q-19 -4 -48 -4q-40 -50 -40 -100zM1195 604v33 q-99 -27 -126 -27v-55q0 -17 8.5 -58t8.5 -65q24 14 47.5 14t57.5 -10q4 102 4 168zM739 797q0 -13 10 -32q61 -26 107 -26q-2 15 -2 24q0 40 27 72q-32 0 -102 19q-40 -20 -40 -57zM665 817q0 -17 7 -34l31 -8q-10 21 -10 29q0 51 54 67l-18 8q-64 -16 -64 -62zM1120 369 q-22 0 -42 -13l-20 -143q69 18 93 18t36 -10v117q-21 31 -67 31zM1222 749q-11 -62 -11 -546q0 -16 16 -46t16 -40t-7 -28.5t-7 -29t8 -25.5l-26 -4v63l-22 -15l-7 -54l-17 -4l4 60l-22 9l-13 -79l-19 8l11 66l-32 7l-18 -83l-24 8l18 73l-36 -13l-20 -64l-20 2q24 37 24 89 q-11 -8 -18 -8q-29 0 -29 29q0 34 35 34q8 0 20 -15l27 193q12 90 12 103.5t-9.5 51.5t-9.5 82t2 162q-105 -20 -140 -20q-74 0 -249 54t-189.5 54t-19.5 -6l30 -48l22 10l8 -12l-72 -32v16l24 9l-45 57q0 1 -3 1.5t-36 -28t-33 -73.5q0 -61 80 -111q48 -29 139.5 -62.5 t92.5 -43.5q-55 -116 -70 -159t-15 -131q0 -234 290 -381q76 36 148.5 36t234.5 -52q89 57 144 145q30 46 75.5 150.5t45.5 174.5q0 122 -121 231q-42 38 -42 45t115.5 65t115.5 117.5t-34 83.5l-26 -10l12 -20l-9 -6l-39 40l24 2l10 21q-30 13 -57.5 13t-115 -58 t-121.5 -58zM1205 103q14 11 14 23t-20 36q-22 11 -47 11t-104 -13l-12 -57q44 9 79.5 9t89.5 -9zM1080 1237q-24 0 -32 -52l-14 14q0 18 14.5 40.5t32 22.5t45.5 -13l-4 -18q-28 6 -42 6zM1130 1191.5q13 -13.5 13 -24.5t-10 -32.5t-20 -21.5q-46 0 -46 57q0 9 15.5 22 t25 13t22.5 -13.5zM1195 1013q0 -37 -26 -37q-20 0 -20 24q0 7 12 20.5t19 13.5q15 0 15 -21zM1071 1058q48 -43 48 -56.5t-20 -13.5t-77.5 27.5t-57.5 45.5q0 40 44 40q15 0 63 -43zM1113 984q9 0 9 -19t-17 -19q-23 0 -23 19t31 19zM902 1145q0 -65 -40 -65q-46 0 -46 59 q0 19 57 33q29 -17 29 -27zM1056 956q0 -32 -21 -32t-21 25t18 25q24 0 24 -18zM990 940q0 -28 -48 -28q-13 0 -13 30q0 20 30.5 20t30.5 -22zM912 972q0 -24 -26 -24t-26 23t19.5 23t32.5 -22zM994 450q30 0 30 -34t-36 -34q-26 0 -26 29q0 10 11 24.5t21 14.5zM1032 257 q0 -38 -28 -38q-35 0 -35 35t27 35q36 0 36 -32zM1128 1170q-11 13 -23 13t-23 -15v-19q15 14 23 14t21 -16zM1004 1084q-24 0 -24 -21q0 -12 53 -37.5t70 -25.5q-84 84 -99 84zM881 1139q-6 16 -15 16t-25 -14l2 -17q11 6 18 6t20 -8v17z" />
+<glyph unicode="&#x2604;" d="M462 -107q-119 -119 -214.5 -119t-171.5 75.5t-76 173.5q0 164 211 318q250 182 617.5 310t739.5 193q257 45 480 45l-225 -74q-418 -146 -857 -465q-173 -126 -504 -457zM20 23q0 -90 70 -159.5t155.5 -69.5t205.5 116l242 235q143 133 261 221q441 327 925 489 q-200 -7 -461 -69q-431 -102 -809 -264q-589 -253 -589 -499zM1581 757q-713 -221 -1103 -638q167 219 490 400.5t613 237.5zM1572 769q-667 -163 -1197 -568q223 213 553 367.5t644 200.5zM333.5 96.5q37.5 -35.5 37.5 -86.5t-38.5 -86t-87.5 -35t-85 36t-36 84.5 t35.5 85.5t86 37t88 -35.5zM318 -58.5q33 27.5 33 68.5t-32.5 69t-73.5 28t-71 -29t-30 -68.5t30.5 -67.5t70.5 -28t73 27.5z" />
+<glyph unicode="&#x2605;" horiz-adv-x="1564" d="M1524 824l-459 -335l175 -537l-458 332l-458 -332l175 537l-459 335h567l175 537l175 -537h567z" />
+<glyph unicode="&#x2606;" horiz-adv-x="1564" d="M1524 824l-459 -335l175 -537l-458 332l-458 -332l175 537l-459 335h567l175 537l175 -537h567zM1217 724h-333l-102 314l-102 -314h-333l270 -197l-103 -313l268 194l268 -194l-103 313z" />
+<glyph unicode="&#x2607;" horiz-adv-x="959" d="M806 240q0 -78 24 -216q-144 25 -216 25q-159 0 -327 -54l-39 119q178 58 343 60l-511 511v88l613 613l88 -88l-569 -569l469 -469q3 170 59 346l119 -39q-53 -165 -53 -327z" />
+<glyph unicode="&#x2608;" horiz-adv-x="1382" d="M1199 240q0 -78 24 -216q-144 25 -216 25q-159 0 -327 -54l-39 119q179 58 343 60l-511 511v88l462 463h-710v-1465h-125v1527l62 63h924l44 -107l-525 -525l469 -468q3 170 59 345l119 -39q-53 -165 -53 -327z" />
+<glyph unicode="&#x2609;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582q0 270 -189.5 459.5t-459.5 189.5t-459.5 -189.5t-189.5 -459.5t189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5zM1039 582 q0 -104 -73 -177t-177 -73t-177 73t-73 177t73 177t177 73t177 -73t73 -177z" />
+<glyph unicode="&#x260a;" horiz-adv-x="1938" d="M1773 551q84 -99 84 -237.5t-102.5 -241t-249.5 -102.5t-249.5 102.5t-102.5 246.5t97.5 246t238.5 109q-32 227 -166 376q-148 166 -366 166t-366 -166q-134 -149 -166 -376q141 -7 238.5 -109t97.5 -246t-102.5 -246.5t-249.5 -102.5t-250 102.5t-103 241t84 237.5 t213 119q31 259 192 437.5t412 178.5t412 -178.5t192 -437.5q128 -20 212 -119zM1683.5 143.5q73.5 73.5 73.5 179t-73 178.5t-178.5 73t-179.5 -73.5t-74 -179t73.5 -178.5t179 -73t179 73.5zM588 143q73 73 73 178.5t-73.5 179t-179 73.5t-178.5 -73t-73 -178.5t73.5 -179 t179 -73.5t178.5 73z" />
+<glyph unicode="&#x260b;" horiz-adv-x="1938" d="M1754.5 1183.5q102.5 -102.5 102.5 -241t-84 -237.5t-212 -119q-31 -259 -192 -437.5t-412 -178.5t-412 178.5t-192 437.5q-129 20 -213 119t-84 237.5t103 241t250 102.5t249.5 -102.5t102.5 -246.5t-97.5 -246t-238.5 -109q32 -227 166 -376q148 -166 366 -166t366 166 q134 149 166 376q-141 7 -238.5 109t-97.5 246t102.5 246.5t249.5 102.5t249.5 -102.5zM1684 755q73 73 73 178.5t-73.5 179t-179 73.5t-179 -73t-73.5 -178.5t74 -179t179.5 -73.5t178.5 73zM587.5 755.5q73.5 73.5 73.5 179t-73 178.5t-178.5 73t-179 -73.5t-73.5 -179 t73 -178.5t178.5 -73t179 73.5z" />
+<glyph unicode="&#x260c;" horiz-adv-x="1148" d="M1016 905q0 -19 -31 -50l-262 -262q86 -97 86 -237.5t-102.5 -243t-249.5 -102.5t-249.5 102.5t-102.5 249.5t102.5 249.5t249.5 102.5q118 0 206 -65l264 264q31 31 50 31q39 0 39 -39zM634.5 184q73.5 74 73.5 178.5t-73 177.5t-178 73t-178 -73t-73 -177.5 t73.5 -178.5t177.5 -74t177.5 74z" />
+<glyph unicode="&#x260d;" horiz-adv-x="1591" d="M1543 912q0 -147 -102.5 -249.5t-249.5 -102.5q-118 0 -206 65l-322 -322q86 -97 86 -237.5t-102.5 -243t-249.5 -102.5t-249.5 102.5t-102.5 249.5t102.5 249.5t249.5 102.5q118 0 206 -65l322 322q-86 97 -86 237.5t102.5 243t249.5 102.5t249.5 -102.5t102.5 -249.5z M1368.5 734.5q73.5 73.5 73.5 178t-73 178t-178 73.5t-178 -73.5t-73 -178t73.5 -178t177.5 -73.5t177.5 73.5zM574.5 -106q73.5 74 73.5 178.5t-73 177.5t-178 73t-178 -73t-73 -177.5t73.5 -178.5t177.5 -74t177.5 74z" />
+<glyph unicode="&#x260e;" horiz-adv-x="2090" d="M1945 746q-3 0 -130 5.5t-148 9.5q-67 13 -87 58q-8 18 -8 28.5t3 15.5q126 -30 291.5 -30t203.5 16q0 -5 -14 -34.5t-36.5 -49t-74.5 -19.5zM1888 878q-205 0 -338 38q-12 92 -160 106q-9 -33 -9 -61q0 -68 75.5 -154.5t90.5 -125.5l185 -489q12 -32 12 -77 q0 -115 -66 -115h-1266q-66 0 -66 115q0 45 12 77l185 489q15 39 90.5 125.5t75.5 154.5q0 28 -9 61q-148 -14 -160 -106q-133 -38 -338 -38q-107 0 -166 13q18 170 59 232q51 78 204 122q327 94 746 94t746 -94q153 -44 204 -122q41 -62 59 -232q-59 -13 -166 -13zM515 863 q3 -5 3 -15.5t-8 -28.5q-20 -45 -87 -58q-21 -4 -148 -9.5t-130 -5.5q-52 0 -74.5 19.5t-36.5 49t-14 34.5q38 -16 203.5 -16t291.5 30zM1045 1063q-169 0 -289 -28q19 -68 54 -119q221 9 235 9t235 -9q35 51 54 119q-120 28 -289 28zM1290 264.5q100 101.5 100 244 t-102.5 245t-242.5 102.5t-242.5 -102.5t-102.5 -245t100 -244t245 -101.5t245 101.5zM1206 722q-17 -29 -46 -12t-12 46t46 12t12 -46zM1302 660q17 -29 -12 -46t-46 12t12 46t46 -12zM1342 511.5q0 -33.5 -33.5 -33.5t-33.5 33.5t33.5 33.5t33.5 -33.5zM1045 808 q34 0 34 -33.5t-34 -33.5t-34 33.5t34 33.5zM884 722q-17 29 12 46q11 6 20 6q16 0 26 -18q17 -29 -12 -46t-46 12zM1162 392q-2 2 -2 8t13.5 22t17.5 11q48 -62 118 -95q-4 -14 -17 -25q-77 37 -130 79zM1111 577q29 -29 29 -69t-27.5 -67.5t-67.5 -27.5t-67.5 27.5 t-27.5 67.5t29 69t66 29t66 -29zM846 626q-17 -29 -46 -12t-12 46q11 18 26 18q9 0 20 -6q29 -17 12 -46zM1045 281q34 0 34 -33.5t-34 -33.5t-34 33.5t34 33.5zM815 510.5q0 -33.5 -33.5 -33.5t-33.5 33.5t33.5 33.5t33.5 -33.5zM846 396q17 -29 -12 -46t-46 12 q-6 11 -6 20q0 15 18 26q11 6 20 6q15 0 26 -18zM942 266q-11 -18 -26 -18q-9 0 -20 6q-18 11 -18 26q0 9 6 20q11 18 26 18q9 0 20 -6q18 -11 18 -26q0 -9 -6 -20z" />
+<glyph unicode="&#x260f;" horiz-adv-x="2090" d="M1945 746q-3 0 -130 5.5t-148 9.5q-67 13 -87 58q-8 18 -8 28.5t3 15.5q126 -30 291.5 -30t203.5 16q0 -5 -14 -34.5t-36.5 -49t-74.5 -19.5zM1888 878q-205 0 -338 38q-12 92 -160 106q-9 -33 -9 -61q0 -68 75.5 -154.5t90.5 -125.5l185 -489q12 -32 12 -77 q0 -115 -66 -115h-1266q-66 0 -66 115q0 45 12 77l185 489q15 39 90.5 125.5t75.5 154.5q0 28 -9 61q-148 -14 -160 -106q-133 -38 -338 -38q-107 0 -166 13q18 170 59 232q51 78 204 122q327 94 746 94t746 -94q153 -44 204 -122q41 -62 59 -232q-59 -13 -166 -13zM515 863 q3 -5 3 -15.5t-8 -28.5q-20 -45 -87 -58q-21 -4 -148 -9.5t-130 -5.5q-52 0 -74.5 19.5t-36.5 49t-14 34.5q38 -16 203.5 -16t291.5 30zM1045 1289q-421 0 -732 -92q-124 -37 -165.5 -86.5t-56.5 -177.5q45 -5 111 -5q178 0 297 29q35 88 241 129q138 27 306 27t304 -26 q205 -40 241 -130q119 -29 297 -29q66 0 111 5q-15 128 -56.5 177.5t-165.5 86.5q-311 92 -732 92zM1045 1063q-169 0 -289 -28q19 -68 54 -119q221 9 235 9t235 -9q35 51 54 119q-120 28 -289 28zM1045 875l-247 -10q-20 0 -44 45q-13 -60 -80.5 -132t-83.5 -115l-185 -489 q-9 -24 -9 -74t16 -50h1266q16 0 16 50t-9 74l-185 489q-16 43 -83.5 115t-80.5 132q-24 -45 -44 -45zM1287.5 753.5q102.5 -102.5 102.5 -245t-100 -244t-245 -101.5t-245 101.5t-100 244t102.5 245t242.5 102.5t242.5 -102.5zM1206 722q17 29 -12 46t-46 -12t12 -46t46 12 zM1302 660q-17 29 -46 12t-12 -46t46 -12t12 46zM1342 511.5q0 33.5 -33.5 33.5t-33.5 -33.5t33.5 -33.5t33.5 33.5zM1045 741q34 0 34 33.5t-34 33.5t-34 -33.5t34 -33.5zM930 710q29 17 12 46q-10 18 -26 18q-9 0 -20 -6q-29 -17 -12 -46t46 -12zM1309 338q-70 33 -118 95 q-4 5 -17 -11q-19 -23 -12 -30q53 -42 130 -79q6 -3 14 10q5 8 5 12q0 2 -2 3zM1112.5 440.5q27.5 27.5 27.5 67.5t-29 69t-66 29t-66 -29t-29 -69t27.5 -67.5t67.5 -27.5t67.5 27.5zM846 626q17 29 -12 46q-11 6 -20 6q-15 0 -26 -18q-17 -29 12 -46t46 12zM1045 214 q34 0 34 33.5t-34 33.5t-34 -33.5t34 -33.5zM815 510.5q0 33.5 -33.5 33.5t-33.5 -33.5t33.5 -33.5t33.5 33.5zM846 396q-11 18 -26 18q-9 0 -20 -6q-18 -11 -18 -26q0 -9 6 -20q17 -29 46 -12t12 46zM942 266q6 11 6 20q0 15 -18 26q-11 6 -20 6q-15 0 -26 -18 q-6 -11 -6 -20q0 -15 18 -26q11 -6 20 -6q15 0 26 18z" />
+<glyph unicode="&#x2610;" d="M2016 -410h-1984v1984h1984v-1984zM1866 -260v1684h-1684v-1684h1684z" />
+<glyph unicode="&#x2611;" d="M2016 -410h-1984v1984h1984v-1984zM1866 -260v1684h-1684v-1684h1684zM565.5 -124q-13.5 13 -40.5 69q-125 260 -125 402q0 36 47 69q93 66 158 66q26 0 39 -23l18 -45q72 -170 88 -170q11 0 53 62l474 702q3 4 55 68l110 135q49 60 153 91.5t198 31.5l14 -33 q-66 -74 -190 -225l-426 -563l-295 -457l-72 -123q-11 -23 -43 -57q-23 -13 -112.5 -13t-103 13z" />
+<glyph unicode="&#x2612;" d="M2016 -410h-1984v1984h1984v-1984zM1866 -260v1684h-1684v-1684h1684zM474 -62l12 58q0 9 -9.5 17.5t-9.5 18t50 95.5l49 84q129 221 375 493l-152 418q-23 63 -23 73t21.5 34t33.5 24t34 -18q12 10 32 10q7 3 19.5 17t21.5 14q19 0 37 -37l156 -307l51 63 q280 330 297 330q25 0 72 -39q43 41 46.5 41t8.5 -11.5t24 -33.5t19 -31t-20.5 -28.5t-71.5 -85.5l-291 -377l-23 -33q67 -126 224 -469q-9 -20 -29 -29v-16l-24 -15q-17 -11 -17 -19t10 -28q-3 -18 -25.5 -34.5t-42 -16.5t-77.5 90l-193 297l-405 -628q-34 -25 -107 -25 q-18 0 -45.5 44.5t-27.5 59.5z" />
+<glyph unicode="&#x2613;" horiz-adv-x="1826" d="M1476 106q0 -25 -18.5 -42.5t-43.5 -17.5t-46 23l-152 199q-209 269 -415 478q-238 -239 -352 -438l-89 -186q-19 -37 -54 -37q-61 0 -61 59q0 12 4 23q116 314 466 664l-332 323q-48 44 -139 137q-18 20 -18 43t18.5 41.5t41.5 18.5t43 -18l191 -189l281 -272l301 287 q47 52 145 152q20 19 43 19q61 0 61 -60q0 -20 -21 -47t-141 -145l-302 -290q126 -128 357.5 -399.5t231.5 -325.5z" />
+<glyph unicode="&#x2614;" horiz-adv-x="2156" d="M2056 267q0 -52 -20 -52q-15 0 -19 34.5t-6 62.5q-12 76 -63 137.5t-122 61.5q-140 0 -213 -208q-7 -25 -23 -74q-6 -17 -20.5 -17t-19.5 19q-2 38 -25 129q-61 151 -207 151q-163 0 -197 -192q-9 -51 -9 -70v-489q0 -89 -45.5 -145.5t-128.5 -56.5t-138.5 53.5 t-55.5 132.5q0 34 34 34t34 -34q0 -51 35.5 -84.5t86.5 -33.5q110 0 110 134v489q0 19 -9 70q-34 192 -197 192q-146 0 -207 -151q-12 -30 -16.5 -71t-9 -59t-19 -18t-20.5 21l-23 70q-73 208 -213 208q-71 0 -122 -61.5t-63 -137.5q-2 -28 -6 -62.5t-19 -34.5q-20 0 -20 52 q0 337 311 571q278 207 633 229v35q0 34 34 34t34 -34v-35q355 -22 633 -229q311 -234 311 -571zM1625 1423q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5q-9 -35 -48 -35zM1760 1193q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5 q-9 -35 -48 -35zM1895 963q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5q-9 -35 -48 -35zM1355 1423q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5q-9 -35 -48 -35zM1490 1193q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5 q-9 -35 -48 -35zM1625 963q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5q-9 -35 -48 -35zM1085 1423q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5q-9 -35 -48 -35zM1220 1193q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5 q-9 -35 -48 -35zM815 1423q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5q-9 -35 -48 -35zM950 1193q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5q-9 -35 -48 -35zM545 1423q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5 q-9 -35 -48 -35zM680 1193q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5q-9 -35 -48 -35zM410 1193q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5q-9 -35 -48 -35zM545 963q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5 q-9 -35 -48 -35zM275 923q-53 0 -53 51q0 82 117 132q-10 -38 -11.5 -88.5t-4.5 -59.5q-9 -35 -48 -35z" />
+<glyph unicode="&#x2615;" horiz-adv-x="2064" d="M1271 1048q0 -132 -129 -204q28 62 28 103q0 107 -69.5 197t-69.5 156q0 148 163 197q-68 -93 -68 -163t72.5 -144t72.5 -142zM993 1055q0 -150 -143 -226q44 67 44 114q0 106 -38 178q-1 2 -70 100q-38 53 -38 119t44 128t112 83q-56 -82 -56 -169.5t72.5 -168.5 t72.5 -158zM704 1048q0 -131 -119 -198q18 59 18 126q0 95 -72.5 176t-72.5 148t50 123t120 74q-69 -52 -69 -159q0 -82 72.5 -144.5t72.5 -145.5zM105 525l-5 86q0 51 13 79q31 65 334 102q217 27 388 27t388 -27q303 -37 334 -102q13 -28 13 -62.5t-2 -57.5q64 40 134 40 q109 0 185.5 -72t76.5 -180q0 -174 -136 -256q-61 -38 -290 -101q-54 -13 -144 -53q-18 -19 -42 -39q-48 -26 -135 -88q-15 -23 -51 -66q-58 -53 -295 -53h-72q-237 0 -295 53q-15 23 -51 66q-20 19 -68 45.5t-67 42.5q-213 178 -213 616zM1839 358q0 56 -40 91.5t-86 35.5 t-97 -33t-56 -65q-9 -67 -20 -135t-36 -130l133 33q76 22 126 53q76 46 76 150zM835 749q-211 0 -423 -31q14 -26 11 -59q206 30 429 30t466 -43q62 -11 55 -11q31 0 102 33q-235 81 -640 81zM1475 515q0 11 -1 84q-80 -40 -287.5 -62t-353.5 -22t-353.5 22t-287.5 62 l-1 -84q0 -205 39 -322q53 -160 196 -249q35 -20 101 -65q11 -10 34 -27q55 -30 247.5 -30t263.5 18l-387 42q302 36 412 163t110 430q122 13 203 30q1 -31 1 -42q0 -282 -87 -454q151 148 151 506z" />
+<glyph unicode="&#x2616;" horiz-adv-x="1566" d="M1454 0h-1342l100 801l571 541l571 -541zM1341 100l-82 653l-476 451l-476 -451l-82 -653h1116z" />
+<glyph unicode="&#x2617;" horiz-adv-x="1566" d="M1454 0h-1342l100 801l571 541l571 -541z" />
+<glyph unicode="&#x2618;" horiz-adv-x="1841" d="M119 607l-11 107q0 200 205 200q98 0 233 -75l214 -134q-23 75 -149 242.5t-126 286.5t70.5 195.5t186.5 76.5q45 0 134 -17.5t126.5 -17.5t96.5 14.5t89 14.5q106 0 159.5 -85.5t53.5 -197.5q0 -88 -133 -262l-193 -250l233 131q123 68 222 68q227 0 227 -242 q0 -40 -17.5 -116.5t-17.5 -116.5l12 -135q0 -87 -62 -133t-156 -46t-220 80q-63 40 -178.5 134.5t-143.5 94.5q-25 0 -25 -29q0 10 4 -44t4 -117t-26.5 -216.5t-55.5 -218t-88.5 -64.5t-59.5 45q0 -2 76 189t76 322t-36 131q-28 0 -112.5 -75.5t-208.5 -142t-213.5 -66.5 t-157 55t-67.5 151q0 45 17.5 131.5t17.5 131.5z" />
+<glyph unicode="&#x2619;" d="M1962 246q-6 -94 -70.5 -161t-146.5 -67t-128.5 37.5t-46.5 106.5q0 18 3 50l4 43q50 -48 117 -48q110 0 133 112q-143 59 -241 158q-117 120 -115 254q-191 -1 -267 -137q168 -85 168 -227q0 -181 -208 -281q-165 -80 -386 -80t-412.5 113.5t-310.5 322.5 q-31 54 -31 102q0 88 87 88q54 0 86 -54q-22 -40 -22 -94.5t43.5 -97t98.5 -42.5t86 18q74 43 94 175q34 221 45 252q51 153 199 246q83 52 194 52t191.5 -65.5t80.5 -174.5q0 -77 -48 -167l5 -6q131 116 257 116q24 0 52 -4q28 76 157.5 167t129.5 158q0 50 -38 80 q207 -4 207 -159q0 -87 -70 -129q-25 -15 -163 -40q-107 -20 -136 -79q152 -29 276.5 -143.5t128.5 -260.5q44 -47 59 -116q-32 -14 -62 -18zM1838 432q0 114 -91.5 203.5t-206.5 94.5q-6 -19 -6 -40q0 -88 111 -172q88 -67 193 -100v14z" />
+<glyph unicode="&#x261a;" horiz-adv-x="1929" d="M1830 882q56 -116 56 -245.5t-62 -276.5l-55 23q57 135 57 250.5t-63 249.5l54 26zM1703 869q53 -113 53 -234.5t-48 -235.5h-143q-115 -125 -224 -175q-41 -5 -78 -5t-100 20l-37 -16l-35 -2q-11 -1 -21 -1q-129 0 -129 109q0 5 2 16q-112 16 -112 111q0 21 11 49 q-90 24 -90 103q0 57 50 87l-36 8l-360 4q-233 3 -233 107q0 62 52.5 85.5t200.5 26.5l409 9l41 38l275 25q190 -55 338 -129h214z" />
+<glyph unicode="&#x261b;" horiz-adv-x="1929" d="M1886 814q0 -104 -233 -107l-360 -4l-36 -8q50 -30 50 -87q0 -79 -90 -103q11 -28 11 -49q0 -95 -112 -111q2 -11 2 -16q0 -109 -129 -109q-10 0 -21 1l-35 2l-37 16q-63 -20 -100 -20t-78 5q-109 50 -224 175h-143q-48 114 -48 235.5t53 234.5h214q148 74 338 129 l275 -25l41 -38l409 -9q148 -3 200.5 -26.5t52.5 -85.5zM296 883q-63 -134 -63 -249.5t57 -250.5l-55 -23q-62 147 -62 276.5t56 245.5l13 27z" />
+<glyph unicode="&#x261c;" horiz-adv-x="1929" d="M1830 882q56 -116 56 -245.5t-62 -276.5l-55 23q57 135 57 250.5t-63 249.5l54 26zM1703 869q53 -113 53 -234.5t-48 -235.5h-143q-115 -125 -224 -175q-41 -5 -78 -5t-100 20l-37 -16l-35 -2q-11 -1 -21 -1q-129 0 -129 109q0 5 2 16q-112 16 -112 111q0 21 11 49 q-90 24 -90 103q0 57 50 87l-36 8l-360 4q-233 3 -233 107q0 62 52.5 85.5t200.5 26.5l409 9l41 38l275 25q190 -55 338 -129h214zM1674 451q31 93 31 184.5t-35 184.5h-182q-254 102 -340 127l-253 -22l-157 -144q44 -39 100 -39q86 0 171 89q92 -52 175 -52h14l17 1 l-2 -50l-23 -1h-13q-77 0 -158 43q-59 -46 -109 -65l90 -1q52 29 104 29q115 0 183 -133l-70 -30q66 -21 121 -115l-62 -28q56 -46 81 -105l-125 -53q51 -7 63.5 -7t37.5 4q116 68 206 183h135zM1104 687q-44 0 -90 -32h-129q-82 0 -82 -46q0 -65 115 -65h4l106 1l190 77 q-38 65 -114 65zM883 455q0 -63 92 -63h6l90 2l194 84q-35 53 -117 64l-104 -46l-146 1q-15 -24 -15 -42zM991 345q0 -75 88 -75h5l39 1l164 77q-22 29 -65 56l-134 -59h-97zM222 813q0 -56 242 -57l227 -1q-10 9 -24 25l116 106l-366 -9q-195 -5 -195 -64z" />
+<glyph unicode="&#x261d;" horiz-adv-x="1929" d="M1290 -65q-113 -53 -234.5 -53t-235.5 48v143q-125 115 -175 224q-5 41 -5 78t20 100l-16 37l-2 35q-1 11 -1 21q0 129 109 129q5 0 16 -2q16 112 111 112q21 0 49 -11q24 90 103 90q57 0 87 -50l8 36l4 360q3 233 107 233q62 0 85.5 -52.5t26.5 -200.5l9 -409l38 -41 l25 -275q-55 -190 -129 -338v-214zM1303 -192q-116 -56 -245.5 -56t-276.5 62l23 55q135 -57 250.5 -57t249.5 63l26 -54zM1234 1416q-56 0 -57 -242l-1 -227q9 10 25 24l106 -116l-9 366q-5 195 -64 195zM1108 534q0 44 -32 90v129q0 82 -46 82q-66 0 -65 -119l1 -106 l77 -190q65 38 65 114zM876 755q-63 0 -63 -92v-6l2 -90l84 -194q53 35 64 117l-46 104l1 146q-24 15 -42 15zM1163 800q0 -86 89 -171q-52 -92 -52 -175v-14l1 -17l-50 2l-1 23v13q0 77 43 158q-46 59 -65 109l-1 -90q29 -52 29 -104q0 -115 -133 -183l-30 70 q-21 -66 -115 -121l-28 62q-46 -56 -105 -81l-53 125q-7 -51 -7 -63.5t4 -37.5q68 -116 183 -206v-135q93 -31 184.5 -31t184.5 35v182q102 254 127 340l-22 253l-144 157q-39 -44 -39 -100zM766 647q-77 0 -75 -93l1 -39l77 -164q29 22 56 65l-59 134v97z" />
+<glyph unicode="&#x261e;" horiz-adv-x="1929" d="M1886 814q0 -104 -233 -107l-360 -4l-36 -8q50 -30 50 -87q0 -79 -90 -103q11 -28 11 -49q0 -95 -112 -111q2 -11 2 -16q0 -109 -129 -109q-10 0 -21 1l-35 2l-37 16q-63 -20 -100 -20t-78 5q-109 50 -224 175h-143q-48 114 -48 235.5t53 234.5h214q148 74 338 129 l275 -25l41 -38l409 -9q148 -3 200.5 -26.5t52.5 -85.5zM296 883q-63 -134 -63 -249.5t57 -250.5l-55 -23q-62 147 -62 276.5t56 245.5l13 27zM1837 813q0 59 -195 64l-366 9l116 -106q-14 -16 -24 -25l227 1q242 1 242 57zM1256 609q0 46 -82 46h-129q-46 32 -90 32 q-76 0 -114 -65l190 -77l106 -1h4q115 0 115 65zM1176 455q0 18 -15 42l-146 -1l-104 46q-82 -11 -117 -64l194 -84l90 -2h6q92 0 92 63zM389 820q-35 -93 -35 -184.5t31 -184.5h135q90 -115 206 -183q25 -4 37.5 -4t63.5 7l-125 53q25 59 81 105l-62 28q55 94 121 115 l-70 30q68 133 183 133q52 0 104 -29l90 1q-50 19 -109 65q-81 -43 -158 -43h-13l-23 1l-2 50l17 -1h14q83 0 175 52q85 -89 171 -89q56 0 100 39l-157 144l-253 22q-86 -25 -340 -127h-182zM1068 345h-97l-134 59q-43 -27 -65 -56l164 -77l39 -1h5q88 0 88 75z" />
+<glyph unicode="&#x261f;" horiz-adv-x="1929" d="M1255 1348q-135 57 -250.5 57t-249.5 -63l-26 54l27 13q116 56 245.5 56t276.5 -62zM1414 920q5 -41 5 -78t-20 -100l16 -37l2 -35q1 -11 1 -21q0 -129 -109 -129q-5 0 -16 2q-16 -112 -111 -112q-21 0 -49 11q-24 -90 -103 -90q-57 0 -87 50l-8 -36l-4 -360 q-3 -233 -107 -233q-62 0 -85.5 52.5t-26.5 200.5l-9 409l-38 41l-25 275q55 190 129 338v214q113 53 234.5 53t235.5 -48v-143q125 -115 175 -224zM1293 570q77 0 75 93l-1 39l-77 164q-29 -22 -56 -65l59 -134v-97zM1367 811q7 51 7 63.5t-4 37.5q-68 116 -183 206v135 q-93 31 -184.5 31t-184.5 -35v-182q-102 -254 -127 -340l22 -253l144 -157q39 44 39 100q0 86 -89 171q52 92 52 175v14l-1 17l50 -2l1 -23v-13q0 -77 -43 -158q46 -59 65 -109l1 90q-29 52 -29 104q0 115 133 183l30 -70q21 66 115 121l28 -62q46 56 105 81zM1183 462 q63 0 63 92v6l-2 90l-84 194q-53 -35 -64 -117l46 -104l-1 -146q24 -15 42 -15zM951 683q0 -44 32 -90v-129q0 -82 46 -82q66 0 65 119l-1 106l-77 190q-65 -38 -65 -114zM825 -199q56 0 57 242l1 227q-9 -10 -25 -24l-106 116l9 -366q5 -195 64 -195z" />
+<glyph unicode="&#x2620;" horiz-adv-x="1490" d="M1209 1184q0 -97 -43 -188t-51 -146l-15 -107q-2 -13 -14 -19l-167 -80l-21 -56q-7 -17 -62.5 -28.5t-87.5 -11.5q-98 0 -139 26q-25 16 -37 70l-167 80q-10 5 -12.5 14.5t-11.5 71t-53.5 144t-44.5 230.5q0 191 134 298.5t329 107.5t329 -107.5t134 -298.5zM743 311 q-87 0 -136 52q-9 12 -28 35l-80 65q-7 6 -26 67t-19 74q0 18 26.5 29t48.5 11q12 0 45 -55t49 -65q31 -19 115 -19t115 13t48.5 47t27.5 57q14 22 39 22q63 0 63 -43l-13 -50q-18 -70 -28 -82t-83 -71q-52 -87 -164 -87zM1400 -255q0 -78 -134 -102q-60 -73 -106.5 -73 t-81.5 63q-10 18 -43 103q-163 135 -294 207q-158 -92 -295 -217q-24 -156 -108 -156q-53 0 -109 81q-139 4 -139 96q0 79 99 114q37 13 164 32q104 77 225 145q-167 81 -281 104q-63 -54 -113 -54q-92 0 -92 80q0 32 53 103q-11 47 -11 73q0 100 84 100q69 0 202 -157 q137 -50 330 -149q109 59 324 149q149 154 203 154q78 0 78 -93q0 -25 -8 -75q52 -68 52 -109q0 -82 -85 -82q-33 0 -128 61q-101 -21 -274 -106l244 -151q244 -29 244 -141zM1158 1184q0 169 -119 262t-293 93t-293 -93t-119 -262q0 -111 44.5 -213t53.5 -163l6 -43 l178 -86q4 -22 20 -62q39 -18 104.5 -18t114.5 19l23 63l173 83q21 152 64 244t43 176zM954 553q-53 -99 -183 -99t-160 17t-98 119l-4 -1q14 -52 30 -93q71 -60 104 -97t108.5 -37t116.5 70q74 60 80 68.5t28 91.5l-4 1zM1349 -255q0 67 -210 92l-335 204q137 67 218.5 102 t173.5 54q99 -64 118 -64q34 0 34 31q0 25 -55 95q11 66 11 89q0 43 -32 40q-48 -19 -169 -144q-215 -90 -352 -164q-218 112 -361 164q-126 149 -172 149q-33 0 -33 -49q0 -23 15 -85q-57 -75 -57 -91q0 -29 36.5 -29t103.5 58q143 -29 405 -156q-204 -115 -315 -197 q-118 -17 -137 -22q-95 -25 -95 -75q0 -44 115 -46q54 -80 82 -80q41 0 60 130q157 144 342 251q161 -89 338 -235q56 -146 80.5 -146t80.5 69q110 19 110 55zM1052 987q0 -143 -117.5 -143t-117.5 131.5t121 131.5q114 0 114 -120zM849 756q0 -67 -72 -67q-14 0 -30 7 q-16 -7 -31 -7q-71 0 -71 66q0 26 37 70q3 4 43 63q10 15 22 15t22 -15q13 -22 43 -63q37 -44 37 -69zM681 987q0 -143 -117 -143t-117 131.5t119 131.5q115 0 115 -120zM797 758q0 -1 -1 -1q-4 0 -49 71q-51 -78 -51 -73q0 -15 20 -15q5 0 31 12q23 -12 30 -12q20 0 20 18z " />
+<glyph unicode="&#x2621;" horiz-adv-x="1320" d="M1208 125q62 0 62 -62.5t-62 -62.5h-842q-111 0 -185 44q-90 54 -90 158t97 202l825 833q47 47 47 83t-39.5 57t-77.5 21h-658q80 -85 159.5 -235.5t79.5 -247.5q0 -63 -62 -63q-38 0 -52 28l-16 60q-50 178 -117 270q-41 56 -203 207q-24 23 -24 49q0 58 69 58h824 q92 0 166.5 -57t74.5 -145.5t-83 -172.5l-825 -834q-61 -62 -61 -114q0 -76 151 -76h842z" />
+<glyph unicode="&#x2622;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1848 582h-650q0 104 -86 152l325 563q188 -108 299.5 -298t111.5 -417z M1148 582q0 -54 -35 -89t-89 -35t-89 35t-35 89t35 89t89 35t89 -35t35 -89zM850 582h-650q0 227 111.5 417t299.5 298l325 -563q-86 -48 -86 -152zM1024 -242q-223 0 -413 109l325 563q39 -22 87 -22t88 22l326 -563q-190 -109 -413 -109z" />
+<glyph unicode="&#x2623;" d="M1536 686q-102 0 -214 -65q-64 -37 -111 -103l-71 37q3 15 3 27q0 92 -85 115l3 80q81 8 145 45q207 119 207 325t-159 378q125 -80 202.5 -214.5t77.5 -252.5t-67 -219q14 1 27 1q233 0 376 -247q78 -135 85 -282q-81 264 -298 351q-59 24 -121 24zM1024 933 q-84 0 -159 -37q-41 21 -71 52q105 65 230 65t230 -65q-30 -31 -71 -52q-75 37 -159 37zM1455 582q0 -122 -60.5 -223t-162.5 -156q-10 39 -12 86q146 97 155 275q40 25 80 36v-18zM905 582q0 -12 3 -27l-71 -37q-47 66 -111 103q-112 65 -214 65q-62 0 -121 -24 q-217 -87 -298 -351q7 147 85 282q143 247 376 247q13 0 27 -1q-67 101 -67 219t77.5 252.5t202.5 214.5q-159 -172 -159 -371q0 -213 207 -332q64 -37 145 -45l3 -80q-85 -23 -85 -115zM1438 -155q-301 0 -414 226q-113 -226 -414 -226q-155 0 -287 68q75 -17 150 -17 q177 0 306 101.5t129 308.5q0 73 -34 148l66 41q33 -32 84 -32t84 32l66 -41q-34 -75 -34 -148q0 -207 129 -308.5t306 -101.5q75 0 150 17q-132 -68 -287 -68zM593 582v18q40 -11 80 -36q9 -178 155 -275q-2 -42 -13 -86q-102 55 -162 156t-60 223z" />
+<glyph unicode="&#x2624;" d="M2016 1491q0 -30 -43 -51.5t-82.5 -21.5t-98.5 17l-112 33q-2 1 -5 1q-15 0 -19 -15l4 -5q95 -54 212 -54q8 0 20 1q1 -78 -110 -78q-88 0 -137 21q-8 3 -51 30.5t-50 27.5t-9 -8q7 -28 74.5 -57.5t101.5 -29.5q4 0 9 1q-33 -82 -136 -82q-76 0 -132.5 46.5t-60.5 46.5 t-4 -7q0 -20 49 -59q48 -38 69 -38h1q-28 -43 -114 -48q-44 -79 -248 -147q73 -48 73 -108q0 -86 -83 -145q97 -52 97 -136t-100 -142q60 -43 60 -110.5t-84 -126.5q89 -56 89 -117t-87 -96q49 -37 49 -87.5t-71 -94.5l72 -52l-11 -23q-53 14 -104 34v-221h-40v221 q-51 -20 -104 -34l-11 23l72 52q-71 44 -71 94.5t49 87.5q-87 35 -87 96t89 117q-84 59 -84 126.5t60 110.5q-100 58 -100 142t97 136q-83 59 -83 145q0 60 73 108q-204 68 -248 147q-86 5 -114 48h1q21 0 69 38q49 39 49 59q0 7 -4 7t-60.5 -46.5t-132.5 -46.5 q-103 0 -136 82q5 -1 9 -1q34 0 101.5 29.5t74.5 57.5q-2 8 -9 8t-50 -27.5t-51 -30.5q-49 -21 -137 -21q-111 0 -110 78q12 -1 20 -1q117 0 212 54l4 5q-4 15 -19 15q-2 0 -31 -9l-81 -24q-64 -18 -103.5 -18t-82.5 21.5t-43 51.5v83h863q-14 -28 -14 -59q0 -87 106 -101 v-153q0 -98 -98 -98q-39 0 -98 34q36 20 69 71q-8 4 -24 10q-36 -48 -73 -78q19 -30 93 -62l148 -56v378q-55 13 -55 56q0 26 24 42t51 16t51 -16t24 -42q0 -43 -55 -56v-378l148 56q74 32 93 62q-37 30 -73 78l-24 -10q33 -51 69 -71q-59 -34 -98 -34q-98 0 -98 98v153 q106 14 106 101q0 31 -14 59h863v-83zM729 1225q0 21 29.5 53t49.5 32t52 -14t48 -14q35 0 35 25q0 29 -47 47.5t-94 18.5t-93 -38t-46 -95q0 -81 88 -133q46 -28 183 -74q24 13 54 26q-140 52 -176 71q-83 44 -83 95zM1191 907q0 53 -79 98l-57 -20q76 -41 76 -96.5 t-74 -92.5l50 -21q84 53 84 132zM1044 819q61 30 61 70t-61 73v-143zM1004 962q-61 -33 -61 -73t61 -70v143zM1385 1240q0 57 -46 95t-93 38t-94 -18.5t-47 -47.5q0 -25 35 -25q16 0 48 14t52 14t49.5 -32t29.5 -53q0 -59 -120 -112l-222 -87q-120 -55 -120 -119 q0 -75 74 -126l139 -73q74 -40 74 -89q0 -58 -130.5 -113.5t-130.5 -126.5q0 -59 64 -105q5 -4 120 -68q64 -35 64 -68q0 -42 -107.5 -88t-107.5 -108q0 -57 161 -115q-113 80 -113 116q0 64 103 103t103 88t-119.5 116t-119.5 117q0 45 69 81l134 68q71 46 71 111t-75 107 l-138 62q-75 37 -75 89q0 72 121 121l226 83q121 58 121 151zM1044 547q74 34 74 71t-74 74v-145zM1004 692q-74 -37 -74 -74t74 -71v145zM939 745q-96 -46 -96 -119.5t99 -125.5q21 12 49 24q-87 40 -87 93t90 99q-35 17 -55 29zM1083 262q82 52 82 112t-59 97 q-21 -11 -52 -25q63 -35 63 -78.5t-67 -86.5q11 -6 33 -19zM1091 367q0 28 -47 54v-113q47 31 47 59zM957 367q0 -28 47 -59v113q-47 -26 -47 -54zM1105 138q0 19 -61 51v-102q61 26 61 51zM943 138q0 -25 61 -51v102q-61 -32 -61 -51zM878 134q0 -50 88 -83l25 13 q-74 33 -74 74q0 35 78 76q-18 9 -30 17q-87 -51 -87 -97zM1132 -58q0 49 -52 81q-19 -7 -30 -12q34 -26 34 -68q0 -22 -40 -59l20 -15q68 39 68 73zM1044 -80q14 15 14 30t-14 31v-61zM1004 -19q-14 -16 -14 -31t14 -30v61zM991 -165l-5 3l-15 -11q6 2 20 8zM1191 1323 q0 -24 -30 -24t-30 19q0 24 30 24t30 -19zM917 1318q0 -19 -30 -19t-30 24q0 19 30 19t30 -24zM1178 1324q0 6 -16.5 6t-16.5 -12q0 -6 16.5 -6t16.5 12zM903 1318q0 12 -16.5 12t-16.5 -6q0 -12 16.5 -12t16.5 6z" />
+<glyph unicode="&#x2625;" horiz-adv-x="1224" d="M1174 308h-495v-700h-133v700h-496v133h467q-132 120 -213 286t-81 343.5t103 286t287 108.5t287 -108.5t103 -286t-81 -343.5t-213 -286h465v-133zM882 1077q0 267 -269 267t-269 -267q0 -144 78 -307t191 -258q113 95 191 258t78 307z" />
+<glyph unicode="&#x2626;" horiz-adv-x="1270" d="M1173 809h-467v-550l353 -248l-67 -95l-286 201v-409h-141v508l-349 244l67 96l282 -198v451h-468v137h468v224h-301v119h301v204h141v-204h303v-119h-303v-224h467v-137z" />
+<glyph unicode="&#x2627;" horiz-adv-x="1480" d="M1268 1256q0 -241 -296 -336q-88 -28 -88 -56t40 -48l-40 -64q-80 40 -80 117.5t144 154.5q123 66 123 203q0 95 -81 149q-70 48 -170 48h-40q-48 0 -48 -56v-840l-160 128v712q0 21 -21.5 38.5t-42.5 17.5h-72v96h464q368 0 368 -264zM1380 0h-376v96h64l-328 240 l-328 -240h72v-96h-384v96h128l416 312l-416 312h-128v96h384v-96h-80l336 -248l328 248h-64v96h376v-96h-128l-424 -312l416 -312h136v-96zM876 -200h-440v96h72q64 0 64 48v208l160 128v-336q0 -48 64 -48h80v-96z" />
+<glyph unicode="&#x2628;" horiz-adv-x="1270" d="M1173 809h-466v-1101h-141v1101h-469v137h469v224h-302v119h302v204h141v-204h302v-119h-302v-224h466v-137z" />
+<glyph unicode="&#x2629;" d="M1827 310h-119v202h-614v-614h202v-119h-544v119h202v614h-614v-202h-119v544h119v-202h614v614h-202v119h544v-119h-202v-614h614v202h119v-544z" />
+<glyph unicode="&#x262a;" horiz-adv-x="1812" d="M1640 825l-209 -151l80 -246l-208 151l-209 -151l80 246l-209 151h258l80 244l79 -244h258zM1106 1381q-265 0 -451.5 -187.5t-186.5 -451.5t184.5 -453.5t446.5 -189.5q94 0 220 40l6 -13q-191 -126 -413 -126q-309 0 -524.5 215.5t-215.5 526t217 524.5t529 214 q222 0 408 -125l-6 -13q-126 39 -214 39z" />
+<glyph unicode="&#x262b;" d="M1402 1550q4 -1 4 -4.5t-1 -4.5q-37 -64 -103 -110.5t-136 -46.5t-122 28q-77 -58 -183 -58t-162.5 60.5t-56.5 162.5q1 6 4 6l48 -34q89 -59 193 -59q64 0 117 83q1 2 5 2h-1q0 -4 66 -42q74 -42 137 -42t187 58q2 1 4 1zM1983 516q0 -319 -220 -577q-39 -46 -68 -65 q-13 -3 -13 10.5t48 113.5q121 252 121 517.5t-151 508.5l-67 97q-55 79 -55 87q0 17 21 17t108 -83q276 -262 276 -626zM1642 632q0 -247 -121.5 -450t-338.5 -328l217 -92q24 -8 70 -27q11 -6 11 -16q0 -17 -40 -17q-125 0 -325 56q-26 -116 -91 -142q-65 26 -91 142 q-200 -56 -325 -56q-40 0 -40 17q0 10 9 15t41 16.5t248 103.5q-217 125 -338.5 328t-121.5 450q0 293 163 528q44 63 63 63q12 0 12 -13t-22 -86q-64 -211 -64 -434q0 -468 375 -710q17 188 17 289.5t-18 398t-18 444.5q0 37 36.5 73.5t73.5 36.5t73.5 -36.5t36.5 -73.5 q0 -148 -18 -444.5t-18 -398t17 -289.5q375 242 375 710q0 223 -64 434q-22 73 -22 86t12 13q19 0 63 -63q163 -235 163 -528zM470 1208q0 -8 -61 -96l-61 -88q-151 -243 -151 -508.5t121 -517.5q48 -100 48 -114q0 -11 -9 -11q-2 0 -4 1q-29 19 -68 65q-220 258 -220 577 q0 364 276 626q87 83 108 83t21 -17z" />
+<glyph unicode="&#x262c;" horiz-adv-x="1724" d="M1474 1115q130 -161 130 -347t-73 -415q-42 -131 -158 -400q-57 245 -359 245q66 -54 128 -140t73 -158q50 -22 50 -77q0 -35 -24.5 -59.5t-59.5 -24.5t-59.5 24.5t-24.5 63.5t34 64q-18 110 -230 248v-281q89 -28 89 -122q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5q0 94 89 122v281q-212 -138 -230 -248q34 -25 34 -64t-24.5 -63.5t-59.5 -24.5t-59.5 24.5t-24.5 59.5q0 55 50 77q11 72 73 158t128 140q-302 0 -359 -245q-116 269 -158 400q-73 229 -73 415t130 347q114 139 293 229q-109 -75 -180 -222.5t-71 -284.5 q0 -225 161 -358q123 -102 370 -167v108h-182l34 93q-116 42 -193 151t-77 243t83 246t222 142q-30 83 -69 132l221 113l221 -113q-39 -49 -69 -132q139 -30 222 -142t83 -246t-77 -243t-193 -151l34 -93h-182v-108q247 65 370 167q161 133 161 358q0 137 -71 284.5 t-180 222.5q179 -90 293 -229zM1196 896q0 225 -211 286q-30 -158 -30 -271t54 -290q187 71 187 275zM715 621q54 177 54 290t-30 271q-211 -61 -211 -286q0 -204 187 -275z" />
+<glyph unicode="&#x262d;" horiz-adv-x="1688" d="M1577 144q19 -19 19 -51.5t-31.5 -64.5t-61.5 -32t-55 25l-223 219q-138 -86 -320 -86q-141 0 -254 59q-124 63 -182 183l-41 -39q54 -43 54 -68q0 -37 -37 -37q-32 0 -64 51q-149 -237 -231 -237q-39 0 -63.5 27.5t-24.5 64.5t26 65q85 92 209 164q-53 38 -53 68 q0 11 14 23t25 12q28 0 65 -54l105 101h72q117 -187 327 -187q90 0 205 58l-504 508l-157 -152l-195 197l328 323l336 -55l-189 -188l520 -521q103 95 103 279t-128.5 374t-298.5 288l8 19q276 -55 449.5 -245.5t173.5 -462t-147 -407.5z" />
+<glyph unicode="&#x262e;" horiz-adv-x="1726" d="M1414.5 1292q226.5 -227 226.5 -551.5t-227 -551.5t-550.5 -227t-551 227.5t-227.5 551t227 551t551.5 227.5t551 -227zM1377 295q164 190 164 452.5t-181 456.5t-447 213v-664zM1306 225l-393 387v-548q224 16 393 161zM366 1203.5q-181 -194.5 -181 -456t165 -451.5 l463 457v664q-266 -19 -447 -213.5zM813 64v548l-392 -387q169 -145 392 -161z" />
+<glyph unicode="&#x262f;" horiz-adv-x="1726" d="M1414.5 1292q226.5 -227 226.5 -551.5t-227 -551.5t-550.5 -227t-551 227.5t-227.5 551t227 551t551.5 227.5t551 -227zM1541 740q0 282 -198 480.5t-480 198.5q-162 0 -306.5 -73t-240.5 -203q80 32 177 32q185 0 297 -115.5t136 -303.5q41 -323 308 -323 q134 0 220.5 86.5t86.5 220.5zM615 740q0 51 -36 87t-87.5 36t-87.5 -35.5t-36 -87.5t36 -87.5t87.5 -35.5t87.5 36t36 87zM1358 740q0 -52 -36 -87.5t-87.5 -35.5t-87.5 36t-36 87t36 87t87.5 36t87.5 -35.5t36 -87.5z" />
+<glyph unicode="&#x2630;" d="M1724 212h-1400v192h1400v-192zM1724 636h-1400v192h1400v-192zM1724 1060h-1400v192h1400v-192z" />
+<glyph unicode="&#x2631;" d="M1724 212h-1400v192h1400v-192zM1724 636h-1400v192h1400v-192zM1724 1060h-516v192h516v-192zM840 1060h-516v192h516v-192z" />
+<glyph unicode="&#x2632;" d="M1724 636h-516v192h516v-192zM840 636h-516v192h516v-192zM1724 212h-1400v192h1400v-192zM1724 1060h-1400v192h1400v-192z" />
+<glyph unicode="&#x2633;" d="M1724 636h-516v192h516v-192zM840 636h-516v192h516v-192zM1724 212h-1400v192h1400v-192zM1724 1060h-516v192h516v-192zM840 1060h-516v192h516v-192z" />
+<glyph unicode="&#x2634;" d="M1724 636h-1400v192h1400v-192zM1724 1060h-1400v192h1400v-192zM1724 212h-516v192h516v-192zM840 212h-516v192h516v-192z" />
+<glyph unicode="&#x2635;" d="M1724 212h-516v192h516v-192zM840 212h-516v192h516v-192zM1724 636h-1400v192h1400v-192zM1724 1060h-516v192h516v-192zM840 1060h-516v192h516v-192z" />
+<glyph unicode="&#x2636;" d="M1724 212h-516v192h516v-192zM840 212h-516v192h516v-192zM1724 636h-516v192h516v-192zM840 636h-516v192h516v-192zM1724 1060h-1400v192h1400v-192z" />
+<glyph unicode="&#x2637;" d="M1724 212h-516v192h516v-192zM840 212h-516v192h516v-192zM1724 636h-516v192h516v-192zM840 636h-516v192h516v-192zM1724 1060h-516v192h516v-192zM840 1060h-516v192h516v-192z" />
+<glyph unicode="&#x2638;" d="M1677 874q-30 56 -93 144q16 16 34 29q49 -112 59 -173zM1964 582q0 -26 -23.5 -43.5t-52.5 -17.5t-93 11t-85 11t-33 -3q-14 -222 -162 -391q5 -8 14 -17q53 -37 151 -120q24 -24 24 -52t-15 -43t-43 -15t-52 24q-37 53 -120 151q-9 9 -17 14q-169 -149 -391 -163 q-3 -13 -3 -33t11 -84t11 -93t-17.5 -52.5t-43.5 -23.5t-43.5 23.5t-17.5 52.5t11 93t11 84t-3 33q-222 14 -391 163q-25 -16 -69.5 -79t-68 -86.5t-51.5 -23.5t-43 15t-15 43t23.5 51.5t76.5 60.5q73 52 89 77q-148 169 -162 391q-12 3 -33 3t-85 -11t-93 -11t-52.5 17.5 t-23.5 43.5t23.5 43.5t52.5 17.5t93 -11t85 -11t33 3q14 222 162 391q-5 8 -14 17q-53 37 -151 120q-24 24 -24 52t15 43t43 15t52 -24q37 -53 120 -151q9 -9 17 -14q169 149 391 163q3 13 3 33t-11 84t-11 93t17.5 52.5t43.5 23.5t43.5 -23.5t17.5 -52.5t-11 -93t-11 -84 t3 -33q222 -14 391 -163q25 16 69.5 79t68 86.5t51.5 23.5t43 -15t15 -43t-23.5 -51.5t-76.5 -60.5q-73 -52 -89 -77q148 -169 162 -391q12 -3 33 -3t85 11t93 11t52.5 -17.5t23.5 -43.5zM1493 0q-73 -36 -186 -67q76 44 153 96q17 -12 33 -29zM370 810q-35 -63 -35 -135 q0 -9 1 -18q-25 7 -52 7q23 105 86 146zM393 252v22q20 -35 86 -123l-25 -28q-18 17 -39.5 61.5t-21.5 67.5zM1528 582q0 209 -147.5 357t-356.5 148t-356.5 -148t-147.5 -357t147.5 -357t356.5 -148t356.5 148t147.5 357zM1162 689q-31 0 -31 31t49 80q15 15 52 39 q57 37 64 56l-17 18l48 48q41 -33 76 -77l-48 -47l-18 17q-19 -7 -50 -54q-72 -111 -125 -111zM1078 996h-25q-4 -8 -4 -25.5t9.5 -59.5t9.5 -64q0 -103 -44 -103t-44 103q0 22 9.5 64t9.5 59.5t-4 25.5h-25v68q27 3 54 3t54 -3v-68zM1508 582q0 -27 -3 -54h-67v25 q-8 4 -25.5 4t-59.5 -9.5t-64 -9.5q-103 0 -103 44t103 44q22 0 64 -9.5t59.5 -9.5t25.5 4v25h67q3 -27 3 -54zM911 1050q-19 -14 -120 -106q-18 10 -39 32q86 68 159 74zM1178 582q0 -65 -45 -110t-109 -45t-109 45t-45 110t45 110t109 45t109 -45t45 -110zM1131 444 q0 31 28 31q34 0 83 -49q15 -15 39 -52q37 -57 56 -64l18 17l48 -47q-35 -44 -76 -77l-48 48l17 18q-7 19 -54 50q-111 72 -111 125zM917 720q0 -31 -31 -31t-80 49q-15 15 -39 52q-37 57 -56 64l-18 -17l-48 47q35 44 76 77l48 -48l-17 -18q7 -19 54 -50q111 -72 111 -125z M1312 192q-80 -53 -142 -71q37 30 101 100q20 -8 41 -29zM862 582q0 -44 -103 -44q-22 0 -64 9.5t-59.5 9.5t-25.5 -4v-25h-67q-3 27 -3 54t3 54h67v-25q8 -4 25.5 -4t59.5 9.5t64 9.5q103 0 103 -44zM1024 97q-27 0 -54 3v68h25q4 8 4 25.5t-9.5 59.5t-9.5 64q0 103 44 103 t44 -103q0 -22 -9.5 -64t-9.5 -59.5t4 -25.5h25v-68q-27 -3 -54 -3zM889 475q28 0 28 -31t-49 -80q-15 -15 -52 -39q-57 -37 -64 -56l17 -18l-48 -48q-41 33 -76 77l48 47l18 -17q19 7 49.5 54t45.5 62q49 49 83 49zM1118 582q0 40 -27.5 67.5t-66.5 27.5t-66.5 -27.5 t-27.5 -67.5t27.5 -67.5t66.5 -27.5t66.5 27.5t27.5 67.5zM1068 582q0 -45 -44 -45t-44 45t44 45t44 -45z" />
+<glyph unicode="&#x2639;" horiz-adv-x="1726" d="M1414.5 1292q226.5 -227 226.5 -551.5t-227 -551.5t-550.5 -227t-551 227.5t-227.5 551t227 551t551.5 227.5t551 -227zM1343.5 259.5q197.5 197.5 197.5 481t-197.5 481t-480 197.5t-480.5 -198.5t-198 -480.5t198 -480t480.5 -198t480 197.5zM1234 987q0 -52 -36 -87.5 t-87.5 -35.5t-87.5 36t-36 87t36 87t87.5 36t87.5 -35.5t36 -87.5zM740 987q0 -52 -36 -87.5t-87.5 -35.5t-87.5 36t-36 87t36 87t87.5 36t87.5 -35.5t36 -87.5zM863 574q-322 0 -395 -321h-62q22 201 140.5 322.5t316.5 121.5t316.5 -121.5t140.5 -322.5h-62 q-73 321 -395 321z" />
+<glyph unicode="&#x263a;" horiz-adv-x="1726" d="M1414.5 1292q226.5 -227 226.5 -551.5t-227 -551.5t-550.5 -227t-551 227.5t-227.5 551t227 551t551.5 227.5t551 -227zM1343.5 259.5q197.5 197.5 197.5 481t-197.5 481t-480 197.5t-480.5 -198.5t-198 -480.5t198 -480t480.5 -198t480 197.5zM1234 987q0 -52 -36 -87.5 t-87.5 -35.5t-87.5 36t-36 87t36 87t87.5 36t87.5 -35.5t36 -87.5zM740 987q0 -52 -36 -87.5t-87.5 -35.5t-87.5 36t-36 87t36 87t87.5 36t87.5 -35.5t36 -87.5zM863 253q-198 0 -316.5 121.5t-140.5 322.5h62q73 -321 395 -321t395 321h62q-22 -201 -140.5 -322.5 t-316.5 -121.5z" />
+<glyph unicode="&#x263b;" horiz-adv-x="1726" d="M1414.5 1292q226.5 -227 226.5 -551.5t-227 -551.5t-550.5 -227t-551 227.5t-227.5 551t227 551t551.5 227.5t551 -227zM1234 987q0 52 -36 87.5t-87.5 35.5t-87.5 -36t-36 -87t36 -87t87.5 -36t87.5 35.5t36 87.5zM740 987q0 52 -36 87.5t-87.5 35.5t-87.5 -36t-36 -87 t36 -87t87.5 -36t87.5 35.5t36 87.5zM863 376q-322 0 -395 321h-62q22 -201 140.5 -322.5t316.5 -121.5t316.5 121.5t140.5 322.5h-62q-73 -321 -395 -321z" />
+<glyph unicode="&#x263c;" horiz-adv-x="1542" d="M1536 666h-252q-24 -132 -98 -237l176 -176l-104 -105l-177 177q-113 -77 -236 -98v-252h-148v252q-123 21 -236 98l-177 -177l-105 105l177 176q-74 105 -98 237h-252v148h252q24 132 98 237l-177 176l105 105l177 -177q113 77 236 98v252h148v-252q123 -21 236 -98 l177 177l104 -105l-176 -176q74 -105 98 -237h252v-148zM1033 478q108 108 108 262.5t-107.5 262t-262.5 107.5t-262.5 -107.5t-107.5 -262t108 -262.5t262 -108t262 108z" />
+<glyph unicode="&#x263d;" horiz-adv-x="1526" d="M1186.5 1299.5q230.5 -230.5 230.5 -561t-231.5 -559.5t-564.5 -229q-267 0 -470 158q-28 22 -28 47q0 45 51 45q6 0 16 -2l243 -49q245 0 416.5 173t171.5 416.5t-170 418t-411 174.5l-250 -50q-10 -2 -16 -2q-51 0 -51 45q0 26 30 48q219 158 474 158 q329 0 559.5 -230.5zM1114.5 249.5q202.5 199.5 202.5 489t-201 490.5t-489 201q-49 0 -96 -6q254 -36 422 -231.5t168 -452t-168 -453t-421 -231.5q43 -6 89 -6q291 0 493.5 199.5z" />
+<glyph unicode="&#x263e;" horiz-adv-x="1526" d="M1417 156q0 -26 -30 -48q-219 -158 -474 -158q-329 0 -559.5 230.5t-230.5 561t231.5 559.5t564.5 229q267 0 470 -158q28 -22 28 -47q0 -45 -51 -45q-6 0 -16 2l-243 49q-245 0 -416.5 -173t-171.5 -416.5t170 -418t411 -174.5l250 50q10 2 16 2q51 0 51 -45zM587 287.5 q-168 195.5 -168 452t168 453t421 231.5q-43 6 -89 6q-291 0 -493.5 -199.5t-202.5 -489t201 -490.5t489 -201q49 0 96 6q-254 36 -422 231.5z" />
+<glyph unicode="&#x263f;" horiz-adv-x="1226" d="M1146 750q0 -205 -134.5 -355.5t-335.5 -173.5v-266h281v-125h-281v-270h-125v270h-281v125h281v265q-201 23 -336 173.5t-135 356.5q0 154 79 281.5t210 194.5q-183 114 -212 379h61q73 -321 395 -321t395 321h62q-29 -265 -213 -379q131 -67 210 -194.5t79 -281.5z M1021 750q0 171 -118.5 290t-289.5 119t-289.5 -119t-118.5 -290t118.5 -289.5t289.5 -118.5t289.5 118.5t118.5 289.5z" />
+<glyph unicode="&#x2640;" horiz-adv-x="1475" d="M1203 1400q192 -192 192 -457t-170 -450t-425 -213v-280h296v-125h-296v-285h-125v285h-296v125h296v280q-255 28 -425 213t-170 450t191.5 457t465.5 192t466 -192zM1270 934q0 222 -155.5 377.5t-377.5 155.5t-377 -155.5t-155 -377.5t155 -377t377 -155t377.5 155 t155.5 377z" />
+<glyph unicode="&#x2641;" horiz-adv-x="1475" d="M1225 689q170 -185 170 -450t-192 -457t-466 -192t-465.5 192t-191.5 457t170 450t425 213v280h-296v125h296v285h125v-285h296v-125h-296v-280q255 -28 425 -213zM1270 248q0 222 -155.5 377t-377.5 155t-377 -155t-155 -377t155 -377.5t377 -155.5t377.5 155.5 t155.5 377.5z" />
+<glyph unicode="&#x2642;" horiz-adv-x="1800" d="M1720 852h-125v426l-350 -349q150 -182 150 -420q0 -274 -192 -466t-466 -192t-465.5 192t-191.5 466t191.5 466t465.5 192q238 0 420 -150l349 349h-426v126h576l64 -64v-576zM1270 509q0 222 -155.5 377.5t-377.5 155.5t-377 -155.5t-155 -377.5t155 -377.5t377 -155.5 t377.5 155.5t155.5 377.5z" />
+<glyph unicode="&#x2643;" horiz-adv-x="1620" d="M1500 -200h-125v383h-1180v125h363q147 0 254.5 121t107.5 280.5t-97.5 265.5t-264 106t-265 -90t-98.5 -253v-63h-125v62q0 215 135 342t353.5 127t352.5 -142.5t134 -368t-177 -387.5h507v1184h125v-1692z" />
+<glyph unicode="&#x2644;" horiz-adv-x="1216" d="M813 910q157 0 255 -91.5t98 -237.5t-111 -373.5t-111 -337.5q0 -44 55 -55q16 -3 90 -3v-125h-62q-87 0 -147.5 49t-60.5 134q0 134 111 361.5t111 339.5q0 214 -222.5 214t-450.5 -289v-696h-125v1350h-193v125h193v217h125v-217h351v-125h-351v-465q223 225 445 225z " />
+<glyph unicode="&#x2645;" horiz-adv-x="1517" d="M1467 381h-369l-62 63v986l62 62h369v-125h-306v-861h306v-125zM954.5 151q52.5 -67 52.5 -160t-73 -167t-175 -74t-175 74t-73 167t52 160.5t133 88.5v712h-165v125h165v415h125v-415h166v-125h-166v-712q81 -22 133.5 -89zM50 381v125h307v861h-307v125h369l63 -62 v-986l-63 -63h-369zM882 0q0 50 -36.5 86.5t-86.5 36.5t-86.5 -36.5t-36.5 -86.5t36.5 -87.5t86.5 -37.5t86.5 37.5t36.5 87.5z" />
+<glyph unicode="&#x2646;" horiz-adv-x="1943" d="M1034 180h200v-125h-200v-255h-125v255h-200v125h200v226q-337 37 -487 229q-135 173 -154 522l-131 -126l-87 90l233 224h87l233 -224l-87 -90l-123 118q15 -292 125 -432.5t391 -182.5v766l-127 -122l-87 90l233 224h87l233 -224l-87 -90l-127 122v-768q276 33 396 190 q105 139 120 427l-123 -118l-87 90l233 224h87l233 -224l-87 -90l-131 126q-19 -353 -153 -520q-146 -182 -488 -229v-228z" />
+<glyph unicode="&#x2647;" horiz-adv-x="1045" d="M995 -200h-832l-63 63v1567l63 62h196q261 0 440 -157.5t179 -415t-179 -416t-440 -158.5h-134v-420h770v-125zM853 920q0 205 -142.5 326t-351.5 121h-134v-897h134q209 0 351.5 122.5t142.5 327.5z" />
+<glyph unicode="&#x2648;" horiz-adv-x="2369" d="M1839 1518q164 0 260.5 -120t96.5 -290t-107 -368h-151q110 196 110 360q0 115 -46 195q-56 99 -162 99q-200 0 -373 -445q-95 -245 -151.5 -602.5t-56.5 -648.5v-93h-148v99q0 276 -54 620t-142 580q-179 478 -386 478q-105 0 -161 -97q-47 -80 -47 -193 q0 -170 110 -352h-150q-108 196 -108 365.5t97 291t261 121.5q311 0 490 -489q117 -322 151 -741h25q28 411 151 742q180 488 491 488z" />
+<glyph unicode="&#x2649;" horiz-adv-x="2159" d="M1986 1369h-26q-138 0 -247 -195l-59 -106q-67 -120 -127.5 -185t-166.5 -107q355 -196 355 -565q0 -257 -188.5 -443.5t-446 -186.5t-447 186.5t-189.5 443.5q0 181 95 327.5t260 237.5q-106 42 -166.5 107t-127.5 185l-59 106q-109 195 -246 195h-27v111h73 q196 0 353 -274l81 -141q77 -133 165.5 -192t234.5 -59t234.5 59t165.5 192l81 141q157 274 352 274h73v-111zM1424 -131.5q143 139.5 143 341t-142 341.5t-345 140t-345.5 -140t-142.5 -342t143.5 -341t344.5 -139t344 139.5z" />
+<glyph unicode="&#x264a;" horiz-adv-x="1975" d="M987 0q-437 0 -814 -99v123q206 55 382 76v1275q-190 18 -382 73v124q332 -92 814.5 -92t814.5 92v-124q-192 -55 -383 -73v-1275q176 -21 383 -76v-123q-378 99 -815 99zM987 1357q-170 0 -284 8v-1256q127 14 284 14t284 -14v1256q-114 -8 -284 -8z" />
+<glyph unicode="&#x264b;" horiz-adv-x="2234" d="M1162 1333q-284 0 -463 -75q227 -113 227 -351q0 -157 -111 -267t-267.5 -110t-265.5 109.5t-109 265.5q0 302 403 459q299 117 674 117t811 -200v-161q-465 213 -899 213zM2061 575q0 -301 -403 -459q-299 -116 -673.5 -116t-811.5 199v161q465 -212 899 -212 q284 0 462 74q-226 116 -226 351q0 156 111.5 266.5t267.5 110.5t265 -109.5t109 -265.5zM1882 375.5q80 79.5 80 195.5t-79.5 198t-196.5 82t-198 -81t-81 -196.5t83 -196.5t197.5 -81t194.5 79.5zM746 710q81 81 81 197t-83 196.5t-198.5 80.5t-194.5 -79t-79 -195 t80 -198.5t196.5 -82.5t197.5 81z" />
+<glyph unicode="&#x264c;" horiz-adv-x="1928" d="M1423 -419q-136 0 -230.5 90.5t-94.5 226.5q0 178 188 578l96 204q111 236 111 384q0 186 -107.5 301t-283.5 115t-281 -100.5t-105 -260t98 -363.5l39 -81q97 -201 97 -296q0 -156 -115.5 -267.5t-275.5 -111.5t-273 114t-113 274.5t111 274.5t268 114q56 0 124 -21 q-108 207 -108 366q0 216 153 349t386 133t383.5 -143.5t150.5 -388.5q0 -132 -41 -254q-21 -64 -102 -240l-69 -150q-184 -400 -184 -515q0 -83 50.5 -140t132.5 -57q105 0 240 119l87 -95q-173 -159 -332 -159zM749 192q78 81 78 197t-78 196.5t-193.5 80.5t-193.5 -81 t-78 -196.5t78 -196.5t193.5 -81t193.5 81z" />
+<glyph unicode="&#x264d;" horiz-adv-x="1912" d="M1739 652q0 -428 -378 -752q18 -130 153 -295h-174q-63 80 -112 212q-139 -79 -340 -111v127q190 39 311 111q-15 96 -15 193v900q0 220 -64 332q-157 -169 -232 -476v-893h-149v987q0 275 -65 382q-153 -178 -231 -441v-928h-148v1075q0 223 -122 405h156 q83 -114 114 -293q75 185 174 293l145 27q100 -128 126 -340q51 160 181 313l143 27q120 -167 120 -369v-282q60 170 127 266l122 45q158 -245 158 -515zM1591 644q0 178 -78 345q-110 -136 -181 -363v-587q259 263 259 605z" />
+<glyph unicode="&#x264e;" horiz-adv-x="1937" d="M1764 592h-629v138q161 104 161 279q0 134 -96.5 228.5t-230.5 94.5t-230.5 -94.5t-96.5 -228.5q0 -175 160 -279v-138h-629v148h441q-120 123 -120 276q0 193 141 328.5t334.5 135.5t334 -135.5t140.5 -328.5q0 -153 -120 -276h440v-148zM1764 148h-1591v148h1591v-148z " />
+<glyph unicode="&#x264f;" horiz-adv-x="2099" d="M1692 -271h-136q-204 0 -292 115q-78 101 -78 313v892q0 225 -65 323q-166 -191 -231 -478v-894h-148v996q0 269 -65 376q-159 -179 -231 -445v-927h-148v1056q0 264 -125 424h159q84 -128 114 -291q70 174 174 291l143 29q100 -117 127 -336q55 157 179 307l146 29 q119 -162 119 -383v-921q0 -122 3 -150q10 -91 52 -136q63 -67 212 -67h91v148l234 -211l-234 -204v144z" />
+<glyph unicode="&#x2650;" horiz-adv-x="1902" d="M1729 686l-146 -23l-75 531l-667 -668l314 -314l-105 -104l-314 314l-461 -459l-102 102l461 459l-314 314l104 105l314 -314l668 667l-531 75l23 146l729 -102z" />
+<glyph unicode="&#x2651;" horiz-adv-x="2246" d="M1967 638q106 -103 106 -258t-106.5 -267.5t-264.5 -112.5q-211 0 -369 164q-100 -261 -159 -333q-106 -127 -324 -127h-134v123h63q152 0 231 58.5t129 175.5q4 10 84 246q-54 95 -76 194q-7 36 -30 210l-37 283q-36 279 -86 385q-129 -152 -220 -405.5t-91 -455.5v-80 h-147v52q0 133 -47 395t-97 357q-61 116 -191 116h-28v122h111q155 0 215 -122q71 -145 129 -487q84 376 280 609l195 38q71 -158 120 -489l27 -181q11 -75 24 -187t39 -193q143 273 395 273q153 0 259 -103zM1877.5 189q72.5 78 72.5 187t-69.5 181t-172.5 72 q-218 0 -342 -340q161 -178 325 -178q114 0 186.5 78z" />
+<glyph unicode="&#x2652;" horiz-adv-x="2182" d="M2009 939l-115 -51l-119 284l-433 -284l-120 284l-428 -284l-120 284l-432 -284l-68 102l555 367l122 -284l430 284l120 -284l430 284zM2008 174l-115 -51l-119 284l-432 -284l-120 284l-428 -284l-121 284l-432 -284l-68 102l555 367l122 -284l430 284l120 -284l430 284 z" />
+<glyph unicode="&#x2653;" horiz-adv-x="1598" d="M952 716h-306q0 -193 -87.5 -394.5t-224.5 -358.5h-161q326 344 326 753h-315v111h315q-20 355 -326 690h153q280 -300 320 -690h306q40 390 320 690h153q-306 -335 -326 -690h315v-111h-315q0 -409 326 -753h-161q-136 155 -224 358.5t-88 394.5z" />
+<glyph unicode="&#x2654;" horiz-adv-x="1903" d="M936 1521l99 -2q48 0 82.5 -29.5t34.5 -76.5v-193l147 44q88 25 150 25q165 0 283 -130q91 -101 91 -279.5t-149 -445.5q-27 -48 -27 -99.5t-80 -167.5q26 -40 26 -103q0 -89 -70 -118q27 -35 27 -88q0 -204 -605.5 -204t-605.5 213q0 45 25 79q-69 35 -69 111t34 119 q-31 56 -69 157q0 13 -3 36t-25 51.5t-60 106.5q-92 190 -92 362t101.5 286t272.5 114q126 0 290 -62v116q0 69 1 80q6 70 93 91q30 7 98 7zM1080 1246v156l-95 -78zM1054 1441q0 14 -27 14h-167q-16 0 -16 -14q0 -1 105 -89q105 88 105 89zM1751 890q0 143 -83.5 235.5 t-225.5 92.5q-45 0 -145.5 -21.5t-125.5 -42.5q25 -52 34 -111q97 115 226 115q104 0 169 -79.5t65 -185.5q0 -178 -151 -469q21 -24 61 -35q8 35 32 77q144 245 144 424zM1531 647q62 160 62 240t-48.5 139t-124.5 59q-142 0 -224 -187q-20 -45 -44 -94q7 -9 17 -9 q50 70 117 70q31 0 66.5 -23t49 -46.5t24.5 -62.5q65 -2 105 -86zM911 1325l-94 76l8 -146zM1080.5 875q54.5 55 54.5 135.5t-57.5 139t-132.5 58.5t-137 -59t-62 -135.5t57.5 -135t140 -58.5t137 55zM1477 540q0 130 -52 130q-23 0 -44 -34l-26 -54q-2 212 -69 212 q-10 0 -30 -17q-38 -34 -45 -96t-7 -63q-12 105 -44 105q-23 0 -34 -26q-16 -92 -35 -141q187 -15 360 -96q26 35 26 80zM1070 783q-50 -35 -124.5 -35t-119.5 26q43 -107 60 -218h133zM1541 63q0 95 -63 95q-52 0 -52 -65q0 -84 62 -84q53 0 53 54zM1362 159q0 50 -23.5 67 t-83 36t-85.5 19q-35 0 -35 -46.5t12 -62.5t70 -42.5t78 -26.5q67 0 67 56zM476 1085q-74 0 -127 -60.5t-53 -139.5t70 -239q49 88 95 88q5 0 10 -1q39 132 139 132q73 0 117 -70q8 0 17 8q-7 27 -44 97q-97 185 -224 185zM986 488q-360 0 -628 -206q18 -22 25 -51 q241 157 548 157h73q284 0 510 -167q32 31 51 96q-285 171 -579 171zM815 555q0 18 -17 72t-30 75t-31.5 21t-28.5 -37l-16 -68q1 45 1 47q0 41 -28 85t-67 44q-3 0 -11 -4q-53 -28 -53 -152q0 -9 4 -27.5t4 -28.5q-20 55 -22 57q-17 31 -48 31q-53 0 -53 -141l44 -96 q163 77 352 114v8zM454 1218q-140 0 -220.5 -99t-80.5 -241.5t105 -349.5l47 -88q24 -46 26 -86q33 17 68 43q-175 355 -175 491t113 222q62 47 114 47q129 0 232 -105q6 32 35 103q-156 63 -264 63zM851 226q0 -59 110.5 -59t110.5 75t-97.5 75t-115.5 -58q-5 -16 -8 -33z M1445 -152q24 0 24 38t-64.5 82t-121.5 66q-162 61 -369 61q-107 0 -255.5 -46.5t-206.5 -113.5q-25 -29 -25 -49q0 -39 48 -39q8 0 32 22q50 46 182 75t224 29h113q69 0 196 -33t166 -70q24 -23 30 -23t16 3q9 -2 11 -2zM764 252q0 29 -32 29q-40 0 -172 -53 q-26 -15 -26 -60.5t15.5 -55t48.5 -9.5t81 22.5t66.5 44t18.5 82.5zM1319 -205q0 29 -98.5 68t-256 39t-214.5 -12.5t-115 -39.5t-58 -55q0 -38 97 -57q65 -12 135 -12h279q70 0 135 12q96 19 96 57zM410 9q61 0 61 74.5t-52 74.5q-62 0 -62 -84q0 -65 53 -65zM966 899 q-45 0 -45 24t47 43.5t58 44.5q1 3 6.5 43t19.5 40q6 0 22 -7l-1 -3q11 -22 11 -42l-8 -57q-25 -86 -110 -86z" />
+<glyph unicode="&#x2655;" horiz-adv-x="1993" d="M370 893l-8 -59q0 -24 54 -66l76 -54q35 -28 44 -28q18 0 18 20t-13 77l-75 332q-71 39 -71 129t95 130q33 14 46.5 14t44.5 -8q105 -27 105 -127q0 -49 -25 -94l91 -260q34 -99 66 -99q22 0 25 23v40l2 21q1 8 25 396q-36 55 -36 108t44 97t109.5 44t106.5 -47.5 t41 -118.5q0 -38 -36 -80v-5v1q1 0 11 -168q1 -91 19 -272q7 -39 23 -39q29 0 47 49l109 310q-34 46 -34 97t47.5 91.5t104 40.5t102 -42.5t45.5 -98.5q0 -89 -79 -132l-61 -286q0 -2 -13.5 -48t-13.5 -70.5t17 -24.5t53 26l73 53q41 32 58 70q-18 43 -18 83 q0 66 49.5 106.5t116.5 40.5t112.5 -38t45.5 -105t-38 -101q-15 -14 -71.5 -40.5t-72.5 -60.5q-100 -217 -106 -287q35 -95 35 -145.5t-43 -101.5v-53q50 -45 50 -130t-39 -119q-16 -7 -46 -24q-5 -12 -16 -35q-94 -192 -591.5 -192t-587.5 227q-88 27 -88 146q0 84 53 128 v51q-43 44 -43 112q0 25 17 68t17 68.5t-41 122.5l-76 175q-10 24 -56 41q-90 32 -90 137q0 59 44.5 102.5t104.5 43.5q87 0 129 -82q12 -23 12 -80zM1480.5 1182.5q30.5 22.5 30.5 58.5t-25 65t-61.5 29t-63 -26.5t-26.5 -60t23.5 -61t57.5 -27.5t64.5 22.5zM1072 1379 q0 34 -26.5 61t-59 27t-61.5 -24.5t-29 -60t24.5 -63t61 -27.5t63.5 26.5t27 60.5zM634 1240q0 95 -104 95q-31 0 -55.5 -28t-24.5 -64t29 -60.5t64.5 -24.5t63 26t27.5 56zM1652 906l9 -42q0 -27 -3 -45q-8 -46 -94.5 -117t-133.5 -71q-27 0 -52.5 15.5t-25.5 46t39 239.5 l31 166q-36 0 -68 17l-60 -177q-47 -135 -66 -159q-33 -41 -77 -41q-78 0 -89 121l-25 388q-24 -18 -55 -18t-59 18l-17 -405q-4 -104 -88 -104q-71 0 -115 113q-3 8 -88 263q-27 -14 -78 -16l53 -263q26 -120 26 -133q0 -45 -22.5 -58t-70 -13t-136 84t-88.5 129 q0 8 8.5 28.5t8.5 44t-26 49.5t-61.5 26t-61 -27.5t-25.5 -64.5t63.5 -78.5t81 -70t69.5 -152.5t52 -153.5t-18.5 -85t-19.5 -60.5l10 -43q286 263 600.5 263t609.5 -263q8 20 8 41.5t-17.5 65.5t-17.5 68q0 46 113 311q16 36 56 61l76 47q38 30 38 68.5t-28 60.5t-64 22 q-102 0 -102 -96zM1562 -79q45 0 45 84.5t-42 84.5q-45 0 -45 -84.5t42 -84.5zM1018 457h-6v-50q0 3 60.5 -69.5t78.5 -90.5l89 -28q101 -36 235 -128q34 52 78 60v52q-197 177 -416 233q-83 21 -119 21zM1153 184q-3 0 -141 -131v-104q180 -11 255 -28q176 -40 174 -138 q56 35 77 87q-61 35 -60 157q-129 100 -241 138q-56 19 -64 19zM1097 221l-112 122l-113 -123l113 -112zM948 457h-13q-27 0 -99 -17q-199 -47 -421 -238v-51q53 -4 70 -60q153 105 332 156q32 27 66 72l65 86v52zM1388 -211q0 11 -46 38.5t-144.5 47.5t-168.5 20h-96 q-74 0 -197.5 -24.5t-145.5 -62.5q-1 -4 -5 -11.5t-4 -8.5q0 -53 150 -78q98 -17 204 -17h171q84 0 165 18q117 27 117 78zM948 -51v104l-132 131q-152 -40 -314 -157v-11q0 -115 -60 -146q21 -50 77 -87q3 94 177 138q114 28 252 28zM404 -79q45 0 45 84.5t-42 84.5 q-45 0 -45 -84.5t42 -84.5z" />
+<glyph unicode="&#x2656;" horiz-adv-x="1698" d="M1618 -342h-1538v280l154 173v106l186 211v488l-208 141v430h293v-199h207v199h274v-199h207v199h294v-430l-209 -141v-488l185 -210v-106l155 -174v-280zM1422 1103v319h-164v-199h-337v199h-144v-199h-337v199h-163v-319h1145zM1339 1036h-981l120 -81h741zM1213 462 v429h-728v-429h728zM1371 224l-155 176h-734l-155 -176h1044zM1398 160h-1099v-74l-136 -153h1372l-137 154v73zM1553 -277v146h-1408v-146h1408z" />
+<glyph unicode="&#x2657;" horiz-adv-x="2156" d="M2076 -381h-265q-2 41 -65 41q-21 0 -152.5 -17t-211 -17t-163.5 40q-99 46 -129 132q-8 22 -12 38q-4 -16 -12 -38q-30 -86 -129 -132q-84 -40 -163.5 -40t-211 17t-152.5 17q-63 0 -65 -41h-265v61q0 82 77 149q105 91 308 91q45 0 133 -12.5t145 -12.5t87.5 18 t71.5 77q-75 15 -125 31t-82 49v304q-165 119 -165 297q0 128 95 237q20 22 141 126l249 212q-101 49 -101 154q0 70 47 117t117 47t117 -47t47 -117q0 -105 -101 -154l194 -164q176 -152 196 -174q95 -109 95 -237q0 -178 -165 -297v-304q-48 -49 -207 -80q41 -59 71.5 -77 t87.5 -18t145 12.5t133 12.5q203 0 308 -91q77 -67 77 -149v-61zM1142 1337q28 27 28 63.5t-27.5 63t-64.5 26.5t-64.5 -26.5t-27.5 -63t28 -63.5t64 -27t64 27zM1513.5 517q45.5 70 45.5 161t-76.5 174t-188.5 180l-216 187l-205 -177q-123 -107 -199.5 -190t-76.5 -174 t45.5 -161t120.5 -100q191 53 315 53t315 -53q75 30 120.5 100zM1703 -148q-47 0 -139 -13t-139 -13q-87 0 -137.5 37t-103.5 121h-70v-30q0 -36 15 -85q53 -174 277 -174q46 0 188.5 16.5t150.5 16.5q64 0 106 -42h156q-39 166 -304 166zM1121 401h-86q-120 0 -272 -52v-48 l58 -39l-58 -65v-61q107 37 233 37h164q126 0 233 -37v61l-58 65l58 39v48q-152 52 -272 52zM1162 106h-168q-91 0 -192 -24q93 -38 208 -38h136q128 0 209 38q-100 24 -193 24zM1042 -46v30h-70q-53 -84 -103.5 -121t-137.5 -37q-47 0 -139 13t-139 13q-265 0 -304 -166 h156q42 42 106 42q8 0 150.5 -16.5t188.5 -16.5q224 0 277 174q15 49 15 85zM1255 725h-143v-144h-70v144h-144v69h144v143h70v-143h143v-69zM1175 290l-97 -61l-97 61l97 65z" />
+<glyph unicode="&#x2658;" horiz-adv-x="1958" d="M1864 652l14 -115q0 -63 -19.5 -186.5t-19.5 -200t35 -182.5q-65 -116 -290 -182q-165 -49 -439 -75l-373 -30q-127 -14 -307 -75l-18 23q0 13 29 156q8 71 35 211q10 37 66 159l38 93q18 40 63 90l92 103q69 81 69 109t-22 48q-44 -13 -76 -31q-23 -4 -51 -4l-141 8 q-29 0 -39 -16l-56 -41q-34 -25 -62.5 -25t-70.5 28.5t-59.5 28.5t-30.5 10.5t-13 22.5q0 67 119 67q22 0 22 14q0 36 -41 36t-87.5 -33.5t-51.5 -33.5q-29 0 -42 25q-50 32 -50 62t21 48q-28 31 -28 59.5t93 77t155 71.5l186 60q98 32 163 70q49 37 153 104q48 15 143 49 q34 20 107 49q2 99 87 147q47 26 167.5 51t152.5 54q155 -100 222 -298q7 -22 24 -65q131 -290 131 -541zM930.5 1108.5q10.5 7.5 10.5 13t-10.5 13t-17.5 7.5t-18 -10.5t-11 -20.5t18 -10t28.5 7.5zM1818 537v6q-55 18 -127 24l2 30q68 -5 121 -21q-3 16 -8 48 q-74 14 -134 18l2 30q58 -3 130 -17q0 15 -2 48q-51 15 -83 15t-52 -2l-2 30q23 2 54 2t81 -13q-2 18 -5 41q-41 10 -101 10q-18 0 -38 -1l-2 30q39 2 67 2t69 -9q-3 16 -9 44q-35 10 -59.5 10t-84.5 -7l-4 30q61 7 85 7t55 -7l-3 14q-29 5 -84 5v30h26q26 0 49 -3 q-4 14 -13 41q-11 1 -19 1q-49 0 -110 -33l-14 26q67 37 124 37h9l-9 28q-26 5 -48.5 5t-96.5 -20l-7 29q78 21 101 21t39 -2l-7 20q-13 -3 -34 -10l-9 29l33 9l-10 25q-55 -6 -129 -44l-13 27q74 38 132 46l-20 54q-62 -15 -135 -64l-17 25q73 49 142 67q-24 63 -61 120 q-90 -108 -177 -143q-15 -34 -61 -67.5t-82.5 -33.5t-90.5 22l23 56q43 -18 64.5 -18t55 25.5t37.5 42.5l20 25q40 13 76 41l-145 -30q-74 -20 -137 -66l-36 48q88 65 225.5 90t192.5 56q-13 16 -28 31q-56 -48 -136 -50l-1 30q67 0 115 40q-6 5 -17 15 q-34 -16 -137.5 -37.5t-144.5 -46.5q-65 -38 -65 -114l-32 -36q-12 -2 -101 -44q27 -26 51 -66l-26 -16q-27 47 -56 70q-18 -6 -36 -11q62 -19 62 -82q-14 -3 -41.5 -21.5t-46.5 -18.5t-49 16.5t-48 14.5l20 29q4 9 11 28q-46 -34 -141 -97q-67 -39 -167 -72l-192 -62 q-44 -16 -81 -32q22 -5 22 -33.5t-40.5 -46.5t-79.5 -20l-8 -56l-14 -6q5 -7 29 -27q86 61 140 61q21 0 41 -9q27 32 60.5 32t65.5 -20.5t32 -44.5q0 -41 -33 -68q-32 -27 -72 -27h-3q-25 -35 -68 -35q-6 0 -13 1q58 -36 65 -36q19 0 77 51q34 30 80 31q30 30 45 41 q49 37 146 43t134 19l10 -28q-28 -10 -135.5 -19.5t-156.5 -56.5l99 -7q32 0 67 16t53.5 16t62 -13.5t82.5 -13.5t120.5 40.5t105.5 81.5q43 73 43 159q0 30 -4 71l60 6q4 -41 4 -77q0 -103 -51 -189q-32 -55 -127 -103.5t-162 -48.5q-25 0 -47 4q2 -12 2 -18 q0 -62 -104 -175.5t-119 -140.5l-45 -108q-24 -49 -62 -150q-9 -69 -33 -207q-8 -29 -22 -88q143 44 252 56l524 48q373 50 491 159q-44 13 -78 29l13 27q41 -20 88 -32l4 5q-6 20 -9 34q-58 12 -105 15l2 30q43 -2 96 -13q-4 18 -7 42q-58 9 -102 12l2 30q41 -3 96 -11 q-2 18 -2 29q-45 11 -99 13l1 29q57 -2 98 -11q1 31 3 57q-52 -13 -99 -32l-12 28q49 21 115 36l3 24h-9q-41 0 -95 -15l-8 28q61 17 102 17q-9 0 14 -1l5 28q-46 19 -103 24l2 30q59 -5 106 -23l3 23q-36 20 -108 21v30q73 -1 112 -20q2 13 5 40q-32 15 -56 15t-54 -4 l-4 30q30 4 55.5 4t60.5 -14q1 19 1 35zM454 711q-13 8 -26 8t-41 -34q38 -6 25 -6q36 0 42 32zM216 855l-3 3q-16 -7 -47 -23q50 6 50 20zM1574 748q0 -149 -63 -243q-32 -48 -137.5 -138.5t-152.5 -174.5l-27 14q46 82 150.5 173t136.5 137q63 92 63 232q0 68 -42 146 l27 15q45 -83 45 -161zM1112 842q-32 -3 -55.5 -3t-63.5 12l8 29q36 -11 56 -11t52 3zM1625 297q-27 3 -53 3t-74 -11l-7 29q53 12 82 12t56 -3zM1625 216q-77 -5 -139 -23l-9 29q63 19 146 24zM973 960q-106 -40 -322 -105l-7 30q63 14 174 53.5t146 50.5zM1610 113h-12 q-58 0 -125 -16l-7 29q71 17 131 17h13v-30zM1188 560q-176 -67 -216.5 -67t-74.5 20l16 26q26 -16 48 -16q47 0 217 65zM1155 495q-113 -59 -168.5 -59t-101.5 23l13 27q38 -20 88 -20t155 55zM604 734l-30 -4q-5 30 -20 68l28 11q17 -42 22 -75zM1447 -4q-95 14 -175.5 14 t-166.5 -29l-10 28q90 31 175.5 31t180.5 -14zM569 695l-30 -1q-2 49 -52 81l17 25q63 -40 65 -105zM477 875q-113 -52 -182 -115l-20 23q69 64 189 119zM1436 -102q-48 7 -85 7t-118 -17.5t-112 -20.5l-3 29q33 3 114.5 21t120 18t87.5 -7z" />
+<glyph unicode="&#x2659;" horiz-adv-x="1588" d="M1508 -374h-1428v101q0 112 59 199t163 124q37 9 84 25q9 7 58 90q162 273 192 475q7 47 7 147h-278v64q0 71 72.5 131t154.5 89q-72 83 -72 195.5t80 192t194 79.5t194 -79.5t80 -191t-73 -195.5l64 -29q164 -85 164 -200v-56h-278v-84q0 -10 8 -65q35 -237 249 -563 q258 -51 297 -273q9 -51 9 -64v-112zM1150 854v5q0 6 -10 28q-38 83 -239 161q99 101 99 217q0 86 -60 146.5t-146 60.5t-146 -60.5t-60 -146.5q0 -113 98 -217q-113 -48 -151 -72q-92 -57 -97 -122h712zM1440 -309v30q0 -5 -2 17q-11 119 -65.5 181.5t-170.5 94.5 q-23 5 -50 13q-9 7 -51 77q-223 375 -223 678v5h-169v-5q0 -326 -255 -730q-6 -11 -17 -25l-96 -28q-194 -73 -194 -308h1293z" />
+<glyph unicode="&#x265a;" horiz-adv-x="1979" d="M1518 1280q177 0 279 -124.5t102 -298t-115 -314.5l-61 -69q-43 -51 -43 -74l27 -26q20 -24 20 -65q0 -82 -74 -92q-3 -27 -7.5 -40t-19.5 -24q26 -42 26 -97t-53 -93v-36q26 -28 26 -78q0 -110 -227 -162q-148 -33 -361 -33t-322 11q-262 26 -339 115q-24 28 -24 74.5 t29 73.5v35q-54 29 -54 104q0 45 26 87q-18 24 -25 61l-2 2q-76 11 -76 79.5t49 102.5q-5 26 -37 65l-60 73q-122 161 -122 328t104 291t279 124q145 0 317 -90v331h419v-331q184 90 319 90zM1680 1129q0 69 -62 69q-56 0 -56 -52q0 -58 49 -58h29q40 0 40 41zM1717 943 q0 -54 58 -54t58 54t-58 54t-58 -54zM1435 1128q0 70 -62 70q-56 0 -56 -51q0 -59 50 -59h28q40 0 40 40zM1670 653q0 -54 55 -54t55 58t-50 58q-60 0 -60 -62zM1125 1407l-63 61l-73 -80l-73 80l-62 -61l73 -82l-63 -73l63 -62l63 71l63 -71l62 62l-62 74zM1651 817 q0 94 -49.5 169t-138.5 75q-1 0 -35 -5q-130 -19 -209 -181q-65 -135 -65 -284q235 -72 380 -82q117 162 117 308zM1107 871q54 49 54 115t-51 120.5t-114 54.5q-41 0 -90.5 -30.5t-68.5 -64.5t-19 -78q0 -67 52.5 -119t113.5 -52t97 28q8 9 26 26zM1572 377q0 50 -55.5 50 t-55.5 -54.5t55.5 -54.5t55.5 59zM664 1129q0 69 -62 69q-56 0 -56 -51q0 -59 49 -59h28q41 0 41 41zM1336 465q0 42 -59.5 42t-59.5 -57q0 -51 56 -51q63 0 63 66zM1045 669q0 48 -48 48q-61 0 -61 -54.5t54.5 -54.5t54.5 61zM1617 49q0 27 -28.5 47.5t-55.5 20.5 t-53 -28.5t-26 -56.5t26 -52.5t58 -24.5q47 0 78 51q1 8 1 25l-2 4q2 6 2 14zM417 1143q0 55 -58.5 55t-58.5 -55t41 -55h28q48 0 48 55zM936 499q0 -55 54.5 -55t54.5 55t-51 55q-58 0 -58 -55zM826 607q0 81 -38.5 197t-88.5 172q-76 85 -174.5 85t-150.5 -80 q-46 -69 -46 -164q0 -146 118 -309q153 13 380 83v16zM1571 208q0 29 -30 46q-240 135 -594 135q-100 0 -234 -34t-226 -82l-49 -24q-28 -18 -28 -43q0 -42 42 -42q8 0 82.5 32.5t80.5 34.5q168 61 379.5 61t428.5 -90q91 -38 103 -38q45 0 45 44zM1135 164q0 46 -47 72 t-98.5 26t-98 -27t-46.5 -77q0 -18 24 -46q40 -48 96 -48t68 3q102 25 102 97zM712 389q43 0 43 59t-55 59t-55 -54q0 -64 67 -64zM209 880q46 0 46 58.5t-54.5 58.5t-54.5 -54q0 -63 63 -63zM309 667q-2 48 -50.5 48t-67.5 -62q16 -54 68.5 -54t50.5 41zM1497 -147 q0 45 -99 93q-68 32 -163.5 57t-273.5 25q-239 0 -436 -119q-42 -25 -42 -50q0 -58 44 -58q11 0 24 4q8 5 23 16q166 116 430 116q112 0 199 -26t163.5 -68t87.5 -42q43 0 43 52zM468 427q-58 0 -58 -54.5t54 -54.5t54 54.5t-50 54.5zM503.5 -16.5q24.5 28.5 24.5 55.5 t-31.5 52.5t-59.5 25.5t-50 -24.5t-22 -55.5t27 -56.5t57 -25.5t54.5 28.5zM1575 790q0 -108 -86 -210l-74 54q39 52 39 143q0 29 -25 29q-28 0 -54.5 -75.5t-39.5 -78.5q-26 -29 -78 -29l-32 3q18 32 27.5 88.5t15.5 74.5q46 137 176.5 137t130.5 -136zM952 868 q-23 0 -54 28.5t-34 45.5t-3 40q0 54 46 89l2 -1q47 -115 155 -145q-50 -57 -112 -57zM731 623q-86 0 -112 80q-34 103 -62 103q-21 0 -21 -49t28 -124l-73 -53q-85 105 -85 209q0 137 118 137q123 0 172 -99l67 -201q-30 -3 -32 -3z" />
+<glyph unicode="&#x265b;" horiz-adv-x="1993" d="M1870 1007.5q43 -42.5 43 -96t-35 -98.5t-81 -45t-67 10q-105 -182 -105 -375q0 -32 27 -67.5t27 -67t-27 -57.5t-27 -51.5t27 -72.5t27 -75.5t-35 -77.5l-63 -89q-9 -52 -28 -85q-75 -128 -428 -128q-442 0 -581 47q-37 13 -70 38q-56 43 -68 108q0 8 -4 22 q-94 104 -94 157q0 30 31 82.5t31 86.5q0 7 -25 41t-29 51q7 41 25 70.5t18 58.5q0 201 -105 384q-14 -10 -58.5 -10t-80 46.5t-35.5 98.5t45.5 94.5t98 42.5t90.5 -39t38 -94.5t-18 -84.5q148 -218 217 -218q44 0 44 76q0 185 -88 411q-130 11 -130 131q0 141 132 141 q141 0 141 -159q0 -48 -37 -78q33 -104 84 -220q77 -172 121 -172q60 0 85 218q15 128 15 274v14q-72 35 -72 123q0 69 44 112.5t108.5 43.5t106 -45t41.5 -105q0 -87 -72 -129q2 -151 10 -249.5t32.5 -182t49.5 -83.5h10q39 0 109 159t94 243q-42 32 -42 94t39.5 102 t100 40t100.5 -32t40 -90q0 -140 -131 -150l-1 -1q-86 -249 -86 -389q0 -97 44 -97q81 0 216 217q-27 32 -27 83t42.5 93.5t97.5 42.5t98 -42.5zM1493 1302q0 52 -51 52q-46 0 -46 -44q0 -52 53 -52q44 0 44 44zM1811 956q0 -4 -4 24q-5 36 -50.5 36t-45.5 -42q0 -55 54 -55 q46 0 46 37zM1091 1450q0 52 -55 52q-41 0 -41 -43q0 -53 53 -53q43 0 43 44zM587 1281q0 64 -44 64q-51 0 -51 -51q0 -45 39 -45h26q30 0 30 32zM1623 4l-87 94l-86 -95l87 -94zM1590 211q0 12 -6 22q-45 77 -155 159q-190 142 -472 142q-8 0 -65 -7q-281 -34 -461 -267 q-28 -36 -28 -49q0 -42 36 -42q22 0 83 52.5t97.5 81t78.5 49.5q123 61 332 61t386 -141q51 -47 113 -98q12 -5 23 -5q38 0 38 42zM282 970q0 46 -48 46t-48 -48.5t43 -48.5q53 0 53 51zM1145 195l-149 155l-148 -155l150 -164zM1511 -217q0 13 -10 28q-61 91 -217 137 t-296 46q-298 0 -462 -147q-44 -39 -44 -64q0 -35 47 -35q5 0 15 11q37 39 104 65q120 47 265 47h167q201 0 321 -74l37 -27q27 -19 39 -19q34 0 34 32zM542 4l-86 94l-86 -95l86 -95z" />
+<glyph unicode="&#x265c;" horiz-adv-x="1698" d="M1618 -342h-1538v280l154 173v106l186 211v488l-208 141v430h293v-199h207v199h274v-199h207v199h294v-430l-209 -141v-488l185 -210v-106l155 -174v-280zM1422 1103h-1145v-12l82 -55h981l82 56v11zM485 891h728v60l7 4l-735 -5v-59zM1213 462h-728v-59l-3 -3l731 3v59z M1398 160v33l-27 31h-1044l-28 -32v-32h1099zM1553 -131v44l-18 20h-1372l-18 -20v-44h1408z" />
+<glyph unicode="&#x265d;" horiz-adv-x="2156" d="M2076 -381h-265q-2 41 -65 41q-21 0 -152.5 -17t-211 -17t-163.5 40q-99 46 -129 132q-8 22 -12 38q-4 -16 -12 -38q-30 -86 -129 -132q-84 -40 -163.5 -40t-211 17t-152.5 17q-63 0 -65 -41h-265v61q0 82 77 149q105 91 308 91q45 0 133 -12.5t145 -12.5t87.5 18 t71.5 77q-75 15 -125 31t-82 49v304q-165 119 -165 297q0 128 95 237q20 22 141 126l249 212q-101 49 -101 154q0 70 47 117t117 47t117 -47t47 -117q0 -105 -101 -154l194 -164q176 -152 196 -174q95 -109 95 -237q0 -178 -165 -297v-304q-48 -49 -207 -80q41 -59 71.5 -77 t87.5 -18t145 12.5t133 12.5q203 0 308 -91q77 -67 77 -149v-61zM1142 1337q28 27 28 63.5t-27.5 63t-64.5 26.5t-64.5 -26.5t-27.5 -63t28 -63.5t64 -27t64 27zM1255 725v69h-143v143h-70v-143h-144v-69h144v-144h70v144h143zM1393 197v104l-58 -39zM1078 470 q-124 0 -315 -53v-68q152 52 272 52h86q120 0 272 -52v68q-191 53 -315 53zM1175 290l-97 65l-97 -65l97 -61zM1160 173h-164q-126 0 -233 -37v-64q121 34 231 34h168q110 0 231 -34v64q-107 37 -233 37zM821 262l-58 39v-104z" />
+<glyph unicode="&#x265e;" horiz-adv-x="1958" d="M1864 652l14 -115q0 -63 -19.5 -186.5t-19.5 -200t35 -182.5q-65 -116 -289 -182q-165 -49 -439 -75l-374 -30q-127 -14 -307 -75l-18 23q0 13 29 156q8 71 35 211q10 37 66 159l38 93q18 40 63 90l92 103q69 81 69 109t-22 48q-44 -13 -76 -31q-23 -4 -51 -4l-141 8 q-29 0 -39 -16l-56 -41q-34 -25 -62.5 -25t-70.5 28.5t-59.5 28.5t-30.5 10.5t-13 22.5q0 67 119 67q22 0 22 14q0 36 -41 36t-87.5 -33.5t-51.5 -33.5q-29 0 -42 25q-50 32 -50 62t21 48q-28 31 -28 59.5t93 77t155 71.5l186 60q98 32 163 70q49 37 153 104q48 15 143 49 q34 20 107 49q2 99 87 147q47 26 167.5 51t152.5 54q155 -101 222 -298q7 -22 24 -65q131 -290 131 -541zM1527 1446l-22 21q-48 -40 -116 -40l1 -30q82 2 137 49zM1680 1224l-10 28q-79 -15 -162 -71l17 -25q83 55 155 68zM1729 1089l-10 28q-28 -7 -52 -14l9 -29z M1711 1139l-11 29q-68 -5 -152 -48l13 -27q84 43 150 46zM1740 1060q-29 6 -57 6t-106 -21l7 -29q74 20 103 20t65 -10zM1729 1003q-57 0 -124 -37l14 -26q61 33 97.5 33t54.5 -4q-3 11 -10 32q-15 2 -32 2zM1712 934h-26v-30q56 0 88 -6l6 30q-32 6 -68 6zM1327 1202 q-36 -28 -62 -28t-59 15l-16 -37q42 -18 77.5 -18t80 33t57.5 66q90 35 179 143l-26 31q-58 -32 -196 -57.5t-212 -81.5l24 -33q61 45 149 65l170 38q-56 -52 -111 -71l-14 -16q-5 -21 -41 -49zM1796 879q-42 13 -72 13t-91 -7l4 -30q60 7 88.5 7t78.5 -18zM1812 802 q-56 15 -87.5 15t-70.5 -2l2 -30q19 1 36 1q70 0 124 -16q-1 11 -4 32zM1696 748q-8 0 -31 -2l2 -30q20 2 29 2q70 0 127 -21q-1 19 -2 32q-58 19 -125 19zM1827 620q-3 20 -3 31q-86 17 -150 21l-2 -30q69 -4 155 -22zM1838 540q0 10 -3 29q-62 22 -142 28l-2 -30 q86 -7 146 -30zM1837 493q-44 23 -75 23t-61 -4l4 -30q30 4 39 4q48 0 90 -25zM1829 421q-49 29 -131 30v-30q77 -1 126 -32q2 11 5 32zM1059 1135q-36 71 -99 101l-13 -27q54 -25 85 -88zM1821 369q-56 26 -124 31l-2 -30q68 -6 122 -32zM1813 317q-20 2 -47.5 2t-88.5 -17 l8 -28q54 15 79 15t45 -2zM909 1186q3 0 -18 -10q-8 0 -24 -5q-12 -6 -20.5 -28.5t-12.5 -28.5l-17 -24q18 2 48 -14.5t49 -16.5t46.5 18.5t41.5 21.5q0 38 -27 62.5t-66 24.5zM1807 270q-80 -18 -136 -41l12 -28q53 21 120 37q0 3 4 32zM1574 748q0 78 -45 161l-27 -15 q42 -78 42 -146q0 -140 -63 -232q-32 -46 -136.5 -137t-150.5 -173l27 -14q47 84 152.5 174.5t137.5 138.5q63 94 63 243zM1109 872q-32 -3 -52 -3t-56 11l-8 -29q40 -12 63.5 -12t55.5 3zM1799 164v6q-53 15 -118 17l-1 -29q66 -2 120 -19q-1 20 -1 25zM1629 327 q-27 3 -56 3t-82 -12l7 -29q48 11 74 11t53 -3zM1248 766q36 99 36 139t-2 70l-40 -3q2 -30 2 -65.5t-34 -128.5q-22 -60 -110 -110t-156 -50q-26 0 -76 13q20 -23 27 -47q30 -6 49 -6q82 0 179.5 57.5t124.5 130.5zM1805 82l-3 31q-64 11 -117 14l-2 -30q56 -4 122 -15z M1821 6q-3 11 -8 32q-70 16 -117 18l-2 -30q54 -3 127 -20zM1625 216l-2 30q-83 -5 -146 -24l9 -29q62 18 139 23zM1826 -33q-63 14 -110 37l-13 -27q43 -21 101 -35q15 16 22 25zM973 960l-9 29q-105 -40 -320 -104l7 -30q63 14 173.5 54t148.5 51zM1610 113v30h-13 q-60 0 -131 -17l7 -29q67 16 125 16h12zM961 523q-22 0 -48 16l-16 -26q34 -20 74.5 -20t216.5 67l-10 28q-170 -65 -217 -65zM1141 521q-105 -55 -155 -55t-88 20l-13 -27q46 -23 101.5 -23t168.5 59zM781 717q-150 0 -233 -86h7q22 0 36 -1q49 47 156.5 56.5t135.5 19.5 l-10 28q-50 -17 -92 -17zM604 734q-5 33 -22 75l-28 -11q15 -38 20 -68zM1451 26q-95 14 -180.5 14t-175.5 -31l10 -28q86 29 166.5 29t175.5 -14zM569 695q-2 65 -65 105l-17 -25q50 -32 52 -81zM477 875l-13 27q-120 -55 -189 -119l20 -23q69 63 182 115zM1440 -72 q-49 7 -87.5 7t-120 -18t-114.5 -21l3 -29q31 3 112 20.5t118 17.5t85 -7zM465 675q20 16 20 40t-50 24t-50 -43q0 -37 37 -37q23 0 43 16zM279 853q0 7 -13 21q-14 0 -61.5 -14.5t-53 -23.5t-5.5 -23q0 -19 18 -19q36 0 75.5 15t39.5 44zM951 1121q0 -10 -13.5 -20 t-23.5 -10q-40 0 -40 22q0 12 14 25.5t25 13.5t24.5 -10.5t13.5 -20.5z" />
+<glyph unicode="&#x265f;" horiz-adv-x="1588" d="M1508 -374h-1428v101q0 112 59 199t163 124q37 9 84 25q9 7 58 90q162 273 192 475q7 47 7 147h-278v64q0 71 72.5 131t154.5 89q-72 83 -72 195.5t80 192t194 79.5t194 -79.5t80 -191t-73 -195.5l64 -29q164 -85 164 -200v-56h-278v-84q0 -10 8 -65q35 -237 249 -563 q258 -51 297 -273q9 -51 9 -64v-112z" />
+<glyph unicode="&#x2660;" horiz-adv-x="1414" d="M1225 855q89 -115 89 -232.5t-79.5 -198t-188.5 -80.5t-192 67t-129 169h-4v-26q0 -491 472 -506l9 -48h-990l9 48q472 15 472 506v26h-4q-46 -102 -129 -169t-192 -67t-188.5 80.5t-79.5 198t89 232.5q46 61 185.5 188t205.5 217q95 127 127 276q32 -149 127 -276 q66 -90 205.5 -217t185.5 -188z" />
+<glyph unicode="&#x2661;" horiz-adv-x="1560" d="M1365 1445q95 -91 95 -227.5t-88 -294.5q-55 -99 -200.5 -282.5t-220.5 -301.5q-123 -192 -171 -370q-48 178 -171 370q-75 118 -220.5 301.5t-200.5 282.5q-88 158 -88 294.5t95 227.5t228.5 91t230.5 -92t126 -222q29 130 126 222t230.5 92t228.5 -91zM1294 951 q84 146 84 257.5t-71 178.5t-176 67q-156 0 -240 -165q-10 -19 -33 -91t-78 -72t-80 78q-8 28 -31 85q-84 165 -240 165q-105 0 -176 -67t-71 -178.5t84 -257.5q50 -87 164 -231q258 -326 350 -519q92 193 350 519q114 144 164 231z" />
+<glyph unicode="&#x2662;" horiz-adv-x="1346" d="M1246 754q-327 -370 -573 -782q-246 412 -573 782q327 370 573 782q246 -412 573 -782zM1137 754q-256 298 -464 626q-208 -328 -464 -626q256 -298 464 -626q208 328 464 626z" />
+<glyph unicode="&#x2663;" horiz-adv-x="1738" d="M1342 1033q126 0 211 -106.5t85 -245.5t-101 -240t-240 -101t-248.5 86t-162.5 212h-4v-52q0 -246 161 -403q65 -63 161 -96q51 -17 184 -43l11 -44h-1060l12 44q132 26 183 43q96 33 161 96q161 157 161 403v52h-4q-53 -126 -162.5 -212t-248.5 -86t-240 101t-101 240 t85 245.5t211 106.5q88 0 205 -63l5 4q-85 130 -85 224q0 145 101 241.5t247 96.5t247 -96.5t101 -241.5q0 -94 -85 -224l5 -4q117 63 205 63z" />
+<glyph unicode="&#x2664;" horiz-adv-x="1414" d="M1225 855q89 -115 89 -232.5t-79.5 -198t-188.5 -80.5t-192 67t-129 169h-4v-26q0 -491 472 -506l9 -48h-990l9 48q472 15 472 506v26h-4q-46 -102 -129 -169t-192 -67t-188.5 80.5t-79.5 198t89 232.5q46 61 185.5 188t205.5 217q95 127 127 276q32 -149 127 -276 q66 -90 205.5 -217t185.5 -188zM1176.5 482.5q55.5 56.5 55.5 142.5t-62.5 167.5t-230 238.5t-232.5 274q-65 -117 -232.5 -274t-230 -238.5t-62.5 -167.5t55.5 -142.5t135.5 -56.5q130 0 320 236l14 17l14 -17q190 -236 320 -236q80 0 135.5 56.5zM832 82q-79 62 -125 153 q-46 -91 -125 -153h250z" />
+<glyph unicode="&#x2665;" horiz-adv-x="1560" d="M1365 1445q95 -91 95 -227.5t-88 -294.5q-55 -99 -200.5 -282.5t-220.5 -301.5q-123 -192 -171 -370q-48 178 -171 370q-75 118 -220.5 301.5t-200.5 282.5q-88 158 -88 294.5t95 227.5t228.5 91t230.5 -92t126 -222q29 130 126 222t230.5 92t228.5 -91z" />
+<glyph unicode="&#x2666;" horiz-adv-x="1346" d="M1246 754q-327 -370 -573 -782q-246 412 -573 782q327 370 573 782q246 -412 573 -782z" />
+<glyph unicode="&#x2667;" horiz-adv-x="1738" d="M1342 1033q126 0 211 -106.5t85 -245.5t-101 -240t-240 -101t-248.5 86t-162.5 212h-4v-52q0 -246 161 -403q65 -63 161 -96q51 -17 184 -43l11 -44h-1060l12 44q132 26 183 43q96 33 161 96q161 157 161 403v52h-4q-53 -126 -162.5 -212t-248.5 -86t-240 101t-101 240 t85 245.5t211 106.5q88 0 205 -63l5 4q-85 130 -85 224q0 145 101 241.5t247 96.5t247 -96.5t101 -241.5q0 -94 -85 -224l5 -4q117 63 205 63zM1479 499q77 77 77 185.5t-64.5 187.5t-149.5 79q-44 0 -118.5 -34.5t-91 -34.5t-25.5 7q-71 56 -71 78q0 11 7 21q92 141 92 210 q0 110 -76.5 183t-189.5 73t-189.5 -73t-76.5 -183q0 -61 49 -139.5t49 -96t-15 -29.5q-65 -52 -79 -52t-21 4q-122 66 -198.5 66t-141 -79t-64.5 -187.5t77 -185.5t191 -77t196 77q45 42 99 131.5t80 89.5h16q15 0 28 -12q13 12 28 12h16q26 0 80 -89.5t99 -131.5 q82 -77 196 -77t191 77zM1036 82q-104 77 -167 205q-63 -128 -167 -205h334z" />
+<glyph unicode="&#x2668;" horiz-adv-x="2100" d="M1456.5 760q93.5 -114 93.5 -207t-57 -239.5t-66 -210.5l-47 35q3 46 30 144.5t27 156.5q0 104 -94 224t-94 231q0 191 138 432l41 -22q-25 -56 -45 -153.5t-20 -160.5q0 -116 93.5 -230zM1047 832.5q93 -182.5 93 -278.5t-56.5 -245t-66.5 -206l-48 35v3q0 37 29.5 139 t29.5 159q0 107 -93 293.5t-93 287t41 229.5t94 211l41 -22q-64 -157 -64 -314q0 -109 93 -291.5zM736 544q0 -75 -57.5 -238.5t-66.5 -202.5l-49 36q5 42 32 142t27 159q0 103 -93.5 222.5t-93.5 220.5t42 230.5t94 212.5l41 -20q-63 -175 -63 -304.5t93.5 -242.5 t93.5 -215zM2050 228q0 -241 -289 -393q-222 -116 -507 -141q-103 -9 -288 -9q-302 0 -574 124q-342 156 -342 420q0 137 143 236q109 76 269 113l9 -59q-115 -23 -194 -80q-100 -71 -100 -173q0 -217 405 -305q238 -52 566 -52q227 0 462 78q313 103 313 279 q0 101 -100 173q-82 60 -194 80l8 59q163 -38 270 -112q143 -99 143 -238z" />
+<glyph unicode="&#x2669;" horiz-adv-x="818" d="M668 -56q0 -147 -128.5 -241.5t-280.5 -94.5q-89 0 -149 45t-60 131q0 136 125.5 236t254.5 100t183 -47v1483h55v-1612z" />
+<glyph unicode="&#x266a;" horiz-adv-x="1280" d="M1180 532q0 -211 -181 -516h-32q86 199 98 232q51 139 51 243q0 180 -135.5 341t-312.5 171v-1059q0 -146 -128.5 -241t-280.5 -95q-89 0 -149 45t-60 131q0 136 125.5 236t255 100t182.5 -47v1483h55q32 -211 116 -332q33 -47 147 -175t166 -218q83 -142 83 -299z" />
+<glyph unicode="&#x266b;" horiz-adv-x="1604" d="M1454 -56q0 -147 -128.5 -241.5t-280.5 -94.5q-89 0 -149 45t-60 131q0 136 125.5 236t254.5 100t183 -47v1037l-731 197v-1156q0 -147 -128.5 -241.5t-280.5 -94.5q-89 0 -149 45t-60 131q0 136 125.5 236t254.5 100t183 -47v1276l841 -227v-1385z" />
+<glyph unicode="&#x266c;" horiz-adv-x="1604" d="M1454 171q0 -147 -128.5 -241.5t-280.5 -94.5q-89 0 -149 45t-60 131q0 136 125.5 236t254.5 100t183 -47v647l-731 -180v-823q0 -147 -128.5 -241.5t-280.5 -94.5q-89 0 -149 45t-60 131q0 136 125.5 236t254.5 100t183 -47v1276l841 207v-1385zM1399 1152v185 l-731 -180v-184z" />
+<glyph unicode="&#x266d;" horiz-adv-x="913" d="M813 439q0 -357 -433 -695q-174 -136 -202 -136t-28 39v1909h55v-891q99 110 284 110q138 0 231 -98.5t93 -237.5zM632 439q0 101 -34 168q-44 88 -135 88q-113 0 -187 -52q-45 -31 -58 -61.5t-13 -87.5v-806q427 382 427 751z" />
+<glyph unicode="&#x266e;" horiz-adv-x="836" d="M686 -392h-55v550l-460 -132q-21 -6 -21 14v1516h55v-551l460 132q21 6 21 -14v-1515zM631 327v631l-426 -122v-631z" />
+<glyph unicode="&#x266f;" horiz-adv-x="836" d="M756 170q0 -20 -20 -26l-93 -27v-359h-55v344l-340 -98v-396h-55v381l-93 -27q-20 -6 -20 14v129q0 20 20 26l93 27v721l-93 -27q-20 -6 -20 14v129q0 20 20 26l93 27v358h55v-343l340 98v395h55v-380l93 27q20 6 20 -14v-129q0 -20 -20 -26l-93 -27v-721l93 27 q20 6 20 -14v-129zM588 271v721l-340 -98v-721z" />
+<glyph unicode="&#x2670;" horiz-adv-x="1470" d="M1433 623q0 -15 -14 -15l-127 60q-128 59 -171 59h-316v-695q0 -43 59 -170l60 -128q0 -14 -15 -14q-9 0 -77.5 85t-96.5 85t-96.5 -85t-77.5 -85q-15 0 -15 14l60 128q59 127 59 170v695h-316q-43 0 -171 -59l-127 -60q-14 0 -14 15q0 9 85 77.5t85 96.5t-85 96.5 t-85 77.5q0 15 14 15l127 -60q128 -59 171 -59h316v309q0 43 -59 170l-60 128q0 14 15 14q9 0 77.5 -85t96.5 -85t96.5 85t77.5 85q15 0 15 -14l-60 -128q-59 -127 -59 -170v-309h316q43 0 171 59l127 60q14 0 14 -15q0 -9 -85 -77.5t-85 -96.5t85 -96.5t85 -77.5z" />
+<glyph unicode="&#x2671;" horiz-adv-x="1581" d="M1531 798q0 -28 -35 -96t-35 -80.5t-14 -12.5q-3 0 -128 59.5t-170 59.5h-288v-696q0 -45 59.5 -170t59.5 -128q0 -14 -12.5 -14t-80.5 -35t-96 -35t-96 35t-80.5 35t-12.5 14q0 3 59.5 128t59.5 170v696h-289q-45 0 -170 -59.5t-128 -59.5q-14 0 -14 12.5t-35 80.5 t-35 96t35 96t35 80.5t14 12.5q3 0 128 -59.5t170 -59.5h289v308q0 45 -59.5 170t-59.5 128q0 14 12.5 14t80.5 35t96 35t96 -35t80.5 -35t12.5 -14q0 -3 -59.5 -128t-59.5 -170v-308h288q45 0 170 59.5t128 59.5q14 0 14 -12.5t35 -80.5t35 -96zM1417 692q49 98 49 105.5 t-49 105.5q-207 -100 -268 -100h-288q-26 0 -45.5 19.5t-19.5 45.5v308q0 61 100 268q-98 49 -105.5 49t-105.5 -49q101 -209 101 -268v-308q0 -26 -19.5 -45.5t-45.5 -19.5h-289q-61 0 -268 100q-49 -98 -49 -105.5t49 -105.5q209 101 268 101h289q26 0 45.5 -19.5 t19.5 -45.5v-696q0 -59 -101 -268q98 -49 105.5 -49t105.5 49q-100 207 -100 268v696q0 26 19.5 45.5t45.5 19.5h288q59 0 268 -101z" />
+<glyph unicode="&#x2672;" d="M1707.5 1282q18.5 -15 18.5 -35t-13 -41l-227 -361l-407 34q-62 5 -62 34q0 21 31 43l48 29l-99 204l-258 -423l-435 263l245 403q62 102 176 102h11l596 -25q119 -5 162 -92l82 -166q83 46 98 46t33.5 -15zM1991 592q37 -59 37 -107.5t-46 -137.5l-269 -520 q-47 -91 -143 -91h-186v-85q0 -45 -45 -45q-22 0 -47 37l-235 354l208 355q23 39 56.5 39t33.5 -28v-71h221l-264 422l432 271zM1005 -236h-468q-130 0 -206 130l-286 490q-25 43 -25 97t20 87l97 158l-73 45q-19 13 -19 42q0 43 61 44l421 6l196 -360q15 -28 15 -44.5 t-15.5 -28.5t-29.5 -12q-9 4 -74 40l-115 -182h501v-512zM1466 878q226 356 226 369.5t-17 13.5t-114 -50l-98 195q-34 67 -124 71l-496 22q54 -28 84 -91l211 -436q-39 -20 -83 -52q26 -13 32 -13zM1991 471q0 52 -38 114l-219 355l-377 -235l256 -413h177q74 0 137.5 53 t63.5 126zM718 1495q-93 0 -156 -103l-214 -352l380 -227l253 411l-79 158q-56 113 -184 113zM1318 258l2 61q0 38 -8 39q-6 -5 -16 -17l-197 -342l216 -326q23 -32 25 -32q12 0 12 16v117h224q68 0 109 78l238 450q-68 -43 -128 -43zM93 825q-11 0 -11 -13t11 -19l89 -52 l-114 -196q-15 -26 -15 -62.5t24 -77.5l253 -437q0 100 26 141l248 394q36 -17 89 -46l6 6l-189 366zM969 -209v446h-491l-92 -147q-23 -37 -23 -109q0 -190 191 -190h415z" />
+<glyph unicode="&#x2673;" d="M1520 569l-445 257l221 13l-273 473l-264 -459l-101 58l365 633l374 -648l123 187v-514zM2032 -201l-815 -1l100 -198l-445 257l445 257l-100 -199h613l-299 517l101 58zM748 -86v-116l-732 1l407 705l-221 13l445 257v-514l-123 187l-306 -533h530zM1172 123h-326v83 h103v303h-113v77q59 1 90.5 16.5t36.5 58.5h108v-455h101v-83z" />
+<glyph unicode="&#x2674;" d="M1520 569l-445 257l221 13l-273 473l-264 -459l-101 58l365 633l374 -648l123 187v-514zM2032 -201l-815 -1l100 -198l-445 257l445 257l-100 -199h613l-299 517l101 58zM748 -86v-116l-732 1l407 705l-221 13l445 257v-514l-123 187l-306 -533h530zM1208 123h-409v81 q255 189 255 287q0 85 -98 85q-68 0 -140 -49h-3v111q77 32 169 32q201 0 201 -159q0 -128 -229 -296h254v-92z" />
+<glyph unicode="&#x2675;" d="M1520 569l-445 257l221 13l-273 473l-264 -459l-101 58l365 633l374 -648l123 187v-514zM2032 -201l-815 -1l100 -198l-445 257l445 257l-100 -199h613l-299 517l101 58zM748 -86v-116l-732 1l407 705l-221 13l445 257v-514l-123 187l-306 -533h530zM1211 283 q0 -171 -225 -171q-110 0 -186 32v110h6q77 -47 155 -47q122 0 122 85q0 53 -58 65q-17 4 -100 4v86q76 0 95 5q54 13 54 64q0 61 -101 61q-74 0 -152 -47h-6v109q82 32 178 32q204 0 204 -131q0 -101 -101 -123v-15q115 -16 115 -119z" />
+<glyph unicode="&#x2676;" d="M1520 569l-445 257l221 13l-273 473l-264 -459l-101 58l365 633l374 -648l123 187v-514zM2032 -201l-815 -1l100 -198l-445 257l445 257l-100 -199h613l-299 517l101 58zM748 -86v-116l-732 1l407 705l-221 13l445 257v-514l-123 187l-306 -533h530zM1214 250h-73v-129 h-120v129h-260v95l248 315h132v-323h73v-87zM1021 337v223l-175 -223h175z" />
+<glyph unicode="&#x2677;" d="M1520 569l-445 257l221 13l-273 473l-264 -459l-101 58l365 633l374 -648l123 187v-514zM2032 -201l-815 -1l100 -198l-445 257l445 257l-100 -199h613l-299 517l101 58zM748 -86v-116l-732 1l407 705l-221 13l445 257v-514l-123 187l-306 -533h530zM1202 303 q0 -95 -65 -143t-166 -48t-174 31v111h7q77 -46 148 -46q122 0 122 91q0 81 -133 81q-21 0 -69 -9t-55 -8v298h370v-93h-252v-103q46 3 65 3q202 0 202 -165z" />
+<glyph unicode="&#x2678;" d="M1520 569l-445 257l221 13l-273 473l-264 -459l-101 58l365 633l374 -648l123 187v-514zM2032 -201l-815 -1l100 -198l-445 257l445 257l-100 -199h613l-299 517l101 58zM748 -86v-116l-732 1l407 705l-221 13l445 257v-514l-123 187l-306 -533h530zM1203 303 q0 -90 -59 -141t-150 -51q-218 0 -218 250q0 308 289 308q42 0 93 -8v-96h-6q-37 17 -88 17q-143 0 -162 -150q72 44 133 44q168 0 168 -173zM1076 296q0 96 -102 96q-34 0 -71 -14v-19q-1 -13 -1 -19q0 -148 92 -148q82 0 82 104z" />
+<glyph unicode="&#x2679;" d="M1520 569l-445 257l221 13l-273 473l-264 -459l-101 58l365 633l374 -648l123 187v-514zM2032 -201l-815 -1l100 -198l-445 257l445 257l-100 -199h613l-299 517l101 58zM748 -86v-116l-732 1l407 705l-221 13l445 257v-514l-123 187l-306 -533h530zM782 568v92h409v-101 l-241 -436h-140l253 445h-281z" />
+<glyph unicode="&#x267a;" d="M1520 569l-445 257l221 13l-273 473l-264 -459l-101 58l365 633l374 -648l123 187v-514zM2032 -201l-815 -1l100 -198l-445 257l445 257l-100 -199h613l-299 517l101 58zM748 -86v-116l-732 1l407 705l-221 13l445 257v-514l-123 187l-306 -533h530z" />
+<glyph unicode="&#x267b;" d="M1675 1261q17 0 17 -13.5t-226 -369.5l-379 29q-6 0 -32 13q2 5 83 52l-211 436q-30 63 -84 91l496 -22q90 -4 124 -71l98 -195q97 50 114 50zM1991 471q0 -73 -63.5 -126t-137.5 -53h-177l-256 413l377 235l219 -355q38 -62 38 -114zM718 1495q128 0 184 -113l79 -158 l-253 -411l-380 227l214 352q63 103 156 103zM1320 319l-2 -61l477 1q60 0 128 43l-238 -450q-41 -78 -109 -78h-224v-117q0 -16 -12 -16q-6 0 -241 358l197 342q3 4 16 17q8 -1 8 -39zM77 405q-24 41 -24 77.5t15 62.5l114 196l-89 52q-11 6 -11 19t11 13l417 4l189 -366 l-6 -6q-53 29 -89 46l-248 -394q-26 -41 -26 -141zM969 -209h-415q-191 0 -191 190q0 72 23 109l92 147h491v-446z" />
+<glyph unicode="&#x267c;" d="M2048 582q0 -426 -299 -725t-725.5 -299t-725 298.5t-298.5 725.5t298.5 725.5t725 298.5t725.5 -299t299 -725zM1424 847q203 319 203 332t-15.5 13t-102.5 -45l-88 175q-30 60 -112 64l-446 20q49 -26 76 -82l189 -392q-35 -18 -74 -47q11 -6 28 -12zM1839 367.5 q57 47.5 57 104t-34 111.5l-197 320l-340 -212l231 -371h159q67 0 124 47.5zM750 1402q-84 0 -140 -92l-193 -317l342 -204l228 370l-71 142q-50 101 -166 101zM1290 289l2 55q0 34 -7 35q-5 -5 -14 -15l-178 -308l195 -293q10 -15 22 -29q11 0 11 14v106h202q61 0 98 70 l214 405q-61 -39 -115 -39zM188 799q-10 0 -10 -11t10 -17l80 -47l-103 -177q-13 -22 -13 -54.5t22 -70.5l227 -394q0 89 24 127l223 355l80 -42l5 6q-4 9 -170 329zM976 -131v401h-442l-82 -132q-21 -34 -21 -98q0 -171 172 -171h373z" />
+<glyph unicode="&#x267d;" d="M2048 582q0 -426 -299 -725t-725.5 -299t-725 298.5t-298.5 725.5t298.5 725.5t725 298.5t725.5 -299t299 -725zM1998 582q0 406 -284 690t-690 284t-690 -284t-284 -690t284 -690t690 -284t690 284t284 690zM1509 1147q87 45 102.5 45t15.5 -13t-203 -332l-342 26 q-4 0 -28 12q2 5 74 47l-189 392q-27 56 -76 82l446 -20q82 -4 112 -64zM1862 583q34 -55 34 -111.5t-57 -104t-124 -47.5h-159l-231 371l340 212zM750 1402q116 0 166 -101l71 -142l-228 -370l-342 204l193 317q56 92 140 92zM1292 344l-2 -55l430 1q53 0 115 39l-214 -405 q-37 -70 -98 -70h-202v-106q0 -14 -11 -14q-14 14 -217 322l178 308q2 4 14 15q7 -1 7 -35zM174 422q-22 38 -22 70.5t13 54.5l103 177l-80 47q-10 6 -10 17t10 11l375 4l170 -329l-5 -6l-80 42l-223 -355q-24 -38 -24 -127zM976 -131h-373q-172 0 -172 171q0 64 21 98 l82 132h442v-401z" />
+<glyph unicode="&#x267e;" d="M2048 582q0 -426 -299 -725t-725 -299t-725 299t-299 725t299 725t725 299t725 -299t299 -725zM1948 582q0 385 -269.5 654.5t-654.5 269.5t-654.5 -269.5t-269.5 -654.5t269.5 -654.5t654.5 -269.5t654.5 269.5t269.5 654.5zM1481 989q154 0 248 -124.5t94 -283.5 t-96 -283.5t-252 -124.5q-237 0 -412 231l-54 72q-186 -303 -442 -303q-153 0 -247.5 125.5t-94.5 284t96.5 282.5t251.5 124q117 0 226.5 -64.5t185.5 -165.5l54 -72q190 302 442 302zM1484 307q102 0 167 84.5t65 194.5t-64.5 205.5t-175 95.5t-214.5 -78t-172 -189 q106 -137 171 -199q121 -114 223 -114zM564 856q-103 0 -167.5 -84.5t-64.5 -194t65 -205.5t175 -96t214 78t172 188q-240 314 -394 314z" />
+<glyph unicode="&#x267f;" d="M540 1322q0 75 53.5 128.5t128.5 53.5t128.5 -53.5t53.5 -127t-50 -126.5t-122 -57l33 -287h351l20 -172h-351l15 -126h557l186 -502l160 57l58 -162l-320 -115l-204 550h-591l-106 921v18zM855 -355q-238 0 -406.5 168.5t-168.5 406.5q0 154 75.5 284.5t202.5 207.5 l23 -202q-125 -118 -125 -286.5t117 -285.5t279 -117t276.5 108.5t124.5 265.5l99 -265q-76 -130 -208.5 -207.5t-288.5 -77.5z" />
+<glyph unicode="&#x2680;" d="M72 -291v1497l529 249h1375v-1432l-416 -314h-1488zM1838 1395h-1223l-379 -178h1306zM1916 52v1320l-336 -202v-1371zM1520 -231v1388h-1388v-1388h1388zM933.5 571.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5z" />
+<glyph unicode="&#x2681;" d="M72 -291v1497l529 249h1375v-1432l-416 -314h-1488zM1838 1395h-1223l-379 -178h1306zM1916 52v1320l-336 -202v-1371zM1520 -231v1388h-1388v-1388h1388zM523.5 981.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5z M1343.5 161.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5z" />
+<glyph unicode="&#x2682;" d="M72 -291v1497l529 249h1375v-1432l-416 -314h-1488zM1838 1395h-1223l-379 -178h1306zM1916 52v1320l-336 -202v-1371zM1520 -231v1388h-1388v-1388h1388zM933.5 571.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5z M523.5 981.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM1343.5 161.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5z" />
+<glyph unicode="&#x2683;" d="M72 -291v1497l529 249h1375v-1432l-416 -314h-1488zM1838 1395h-1223l-379 -178h1306zM1916 52v1320l-336 -202v-1371zM1520 -231v1388h-1388v-1388h1388zM523.5 981.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5z M1343.5 161.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM1343.5 981.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM523.5 161.5q45.5 -45.5 45.5 -108t-45 -107.5 t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5z" />
+<glyph unicode="&#x2684;" d="M523.5 981.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM1343.5 161.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM72 -291v1497l529 249h1375v-1432l-416 -314h-1488z M1838 1395h-1223l-379 -178h1306zM1916 52v1320l-336 -202v-1371zM1520 -231v1388h-1388v-1388h1388zM933.5 571.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM1343.5 981.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45 t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM523.5 161.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5z" />
+<glyph unicode="&#x2685;" d="M1343.5 981.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM523.5 161.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM72 -291v1497l529 249h1375v-1432l-416 -314h-1488z M1838 1395h-1223l-379 -178h1306zM1916 52v1320l-336 -202v-1371zM1520 -231v1388h-1388v-1388h1388zM523.5 981.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM1343.5 161.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45 t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM1343.5 571.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5zM523.5 571.5q45.5 -45.5 45.5 -108t-45 -107.5t-108 -45t-108 45t-45 107t45.5 108t107.5 46t107.5 -45.5z" />
+<glyph unicode="&#x2686;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1689 582q0 -68 -48.5 -116.5t-116.5 -48.5t-116.5 48.5t-48.5 116.5 t48.5 116.5t116.5 48.5t116.5 -48.5t48.5 -116.5z" />
+<glyph unicode="&#x2687;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1689 582q0 -68 -48.5 -116.5t-116.5 -48.5t-116.5 48.5t-48.5 116.5 t48.5 116.5t116.5 48.5t116.5 -48.5t48.5 -116.5zM689 582q0 -68 -48.5 -116.5t-116.5 -48.5t-116.5 48.5t-48.5 116.5t48.5 116.5t116.5 48.5t116.5 -48.5t48.5 -116.5z" />
+<glyph unicode="&#x2688;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1689 582q0 68 -48.5 116.5t-116.5 48.5t-116.5 -48.5t-48.5 -116.5t48.5 -116.5t116.5 -48.5t116.5 48.5t48.5 116.5z" />
+<glyph unicode="&#x2689;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1689 582q0 68 -48.5 116.5t-116.5 48.5t-116.5 -48.5t-48.5 -116.5t48.5 -116.5t116.5 -48.5t116.5 48.5t48.5 116.5zM689 582q0 68 -48.5 116.5t-116.5 48.5t-116.5 -48.5 t-48.5 -116.5t48.5 -116.5t116.5 -48.5t116.5 48.5t48.5 116.5z" />
+<glyph unicode="&#x268a;" d="M1724 636h-1400v192h1400v-192z" />
+<glyph unicode="&#x268b;" d="M1724 636h-516v192h516v-192zM840 636h-516v192h516v-192z" />
+<glyph unicode="&#x268c;" d="M1724 424h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x268d;" d="M1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 424h-1400v192h1400v-192z" />
+<glyph unicode="&#x268e;" d="M1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x268f;" d="M1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192z" />
+<glyph unicode="&#x2690;" d="M1760 323q-164 0 -473.5 97.5t-473.5 97.5q-255 0 -487 -208v-720h-116v1984h116v-197q242 197 484 197q162 0 468 -101t468 -101q36 0 92 5v-1051q-45 -3 -78 -3zM1722 1256q-154 5 -452 103.5t-447 98.5t-275 -70q-78 -43 -222 -161v-767q225 174 487 174 q164 0 462 -93.5t447 -100.5v816z" />
+<glyph unicode="&#x2691;" d="M1760 323q-164 0 -473.5 97.5t-473.5 97.5q-255 0 -487 -208v-720h-116v1984h116v-197q242 197 484 197q162 0 468 -101t468 -101q36 0 92 5v-1051q-45 -3 -78 -3z" />
+<glyph unicode="&#x2692;" horiz-adv-x="2326" d="M2246 671q0 -164 -92 -381q-20 122 -79.5 261t-136.5 199l-83 -10l-435 -447l418 -407q31 -30 31 -78.5t-51 -97t-99 -48.5t-76 29l-404 416l-403 -414q-30 -31 -78.5 -31t-96.5 51t-48 99t29 76l416 404l-434 446l-232 -232q-27 -27 -45 -27t-42 24l-197 197 q-28 28 -28 45.5t27 44.5l219 219q-34 38 -34 83t49 92t95 47t84 -28l219 218q28 28 45 28t45 -28l197 -197q24 -24 24 -42t-27 -45l-233 -232l449 -436l450 438l9 82l-139 140l-66 -26l-101 101l332 331l100 -100l-25 -67q210 -177 304 -303q143 -192 143 -394zM681 -153 q-12 -12 -12 -36t31.5 -58.5t56.5 -34.5t39 14l1019 1047l-87 87zM1778.5 -250.5q34.5 31.5 34.5 56.5t-14 39l-419 407l-102 -105l405 -417q12 -12 36.5 -12t59 31.5zM1198 430l-446 434l-87 -87l433 -445z" />
+<glyph unicode="&#x2693;" horiz-adv-x="1860" d="M980 -392h-100v148q-276 11 -574 396l-71 -131l-155 468l441 -243l-160 -44q86 -100 239 -177.5t280 -81.5v1119h-359v100h221q-54 67 -54 159.5t71 163.5t171 71t171 -71t71 -163.5t-54 -159.5h221v-100h-359v-1119q127 4 280 81.5t239 177.5l-160 44l441 243l-155 -468 l-71 131q-298 -385 -574 -396v-148zM1082 1314q0 63 -44.5 107.5t-107.5 44.5t-107.5 -44.5t-44.5 -107.5t44.5 -107.5t107.5 -44.5t107.5 44.5t44.5 107.5z" />
+<glyph unicode="&#x2694;" d="M2022 263q0 -67 -53.5 -151.5t-122.5 -154.5q-93 -95 -154 -95q-42 0 -99 44q-9 7 -66 58l-133 120q-102 -85 -102 -139t39 -111q-153 40 -153 143t131 211l-285 280l-285 -280q131 -108 131 -212q0 -101 -153 -142q39 57 39 111t-103 139l-113 -102q-75 -68 -85 -76 q-57 -44 -99 -44q-61 0 -154 95q-69 70 -122.5 154.5t-53.5 151.5q0 123 84 194.5t209 71.5q231 0 398 -188l218 215l-728 716q124 -3 251 -96q35 -25 114 -98l451 -434l453 434q36 34 113 98q127 93 252 96l-728 -716l217 -215q167 188 399 188q125 0 209 -71.5t84 -194.5z M1833 96q77 75 77 156t-60 123t-143 42q-157 0 -313 -136q257 -281 296 -281q18 0 68.5 36.5t74.5 59.5zM341 417q-83 0 -143.5 -42t-60.5 -123t88.5 -166.5t130 -85.5t298.5 281q-156 136 -313 136z" />
+<glyph unicode="&#x2695;" horiz-adv-x="1280" d="M1200 972q0 -57 -67 -57t-147 90l-110 -184q154 -166 154 -263q0 -171 -250 -171q-67 0 -159 13l-123 -204q103 -121 103 -200q0 -112 -178 -112q-53 0 -110 7l-126 -208l-57 33l103 188q-153 30 -153 68q0 9 4 16q10 3 27 3l160 -18l105 193q-90 104 -106 127 q-65 88 -65 144q0 105 175 105q58 0 193 -17l142 261q-176 201 -176 306q0 86 68 132.5t161.5 46.5t188.5 -42l99 180q25 45 73 45q69 0 69 -75q0 -25 -12 -45l-111 -183q125 -107 125 -179zM1151 1009q0 26 -26 26q-19 0 -19 -17q0 -22 30 -22q15 0 15 13zM805 1099 q-84 0 -84 -58q0 -45 66 -123l94 171q-34 10 -76 10zM857 572q0 41 -61 118l-107 -178q25 -2 55 -2q113 0 113 62zM404 428q-54 0 -54 -32.5t83 -125.5l80 146q-78 12 -109 12zM462 25q0 27 -27 67l-75 -124q102 2 102 57z" />
+<glyph unicode="&#x2696;" horiz-adv-x="2266" d="M1986 902l-14 67q0 62 78 62q92 0 92 -101q0 -146 -241 -146q-23 0 -44 2q14 47 14 88q15 -2 31 -2q84 0 84 30zM1651 926q-10 -27 -10 -52t6 -55q-165 77 -244 77l-63 -9l-34 147q34 15 86.5 15t121.5 -41zM1259 1038l-46 -199h-160l-46 199l79 72l19 466h56l19 -466z M1756 -412q-331 0 -500 383l12 13q28 -22 60 -39l382 838q-17 48 -17 90q0 72 63 72t63 -72q0 -42 -17 -90l382 -838q32 17 60 39l12 -13q-169 -383 -500 -383zM619 819q6 30 6 55t-10 52l137 82q69 41 121.5 41t86.5 -15l-34 -147l-63 9q-79 0 -244 -77zM294 969l-14 -67 q0 -30 84 -30q16 0 31 2q0 -41 14 -88q-21 -2 -44 -2q-241 0 -241 146q0 101 92 101q78 0 78 -62zM510 -412q-331 0 -500 383l12 13q28 -22 60 -39l382 838q-17 48 -17 90q0 72 63 72t63 -72q0 -42 -17 -90l382 -838q32 17 60 39l12 -13q-169 -383 -500 -383zM2111 -87 l-311 669v-723q179 5 311 54zM1203 974q0 29 -20.5 49t-49.5 20t-49.5 -20t-20.5 -49q0 -69 70 -69t70 69zM1712 -141v723l-311 -669q132 -49 311 -54zM865 -87l-311 669v-723q179 5 311 54zM466 -141v723l-311 -669q132 -49 311 -54z" />
+<glyph unicode="&#x2697;" horiz-adv-x="1896" d="M1645 955q0 -182 -123 -292.5t-314.5 -110.5t-305.5 125t-114 326q0 70 16 139q-163 -68 -321.5 -243.5t-261.5 -363.5q-7 24 -59 63q-48 37 -71 37h-2q187 339 402 553q294 293 590 293q237 0 400.5 -146t163.5 -380zM1285 314v-514h-112v514h-288l-127 -514h-116 l145 583l54 43h776l54 -43l145 -583h-116l-127 514h-288zM205 519q0 -9 -16.5 -9t-62 36.5t-45.5 58.5q0 10 15 10t62 -38t47 -58z" />
+<glyph unicode="&#x2698;" horiz-adv-x="1169" d="M1089 839q0 -107 -73 -231l-137 -219q-73 -137 -73 -273q0 -176 41 -402l-28 -6l-154 324q-83 173 -170 235q-79 42 -226 145q-161 147 -189 342q5 3 13 3q57 0 189 -99q12 30 32 30q57 0 158 -104.5t131 -114.5q4 8 4 34t-24 87q-43 109 -120 162q-136 93 -186 151 q-83 95 -83 232t78.5 240t222 103t229.5 -116.5t86 -262.5q0 -103 -42 -185q-23 -44 -72 -102t-49 -83q0 -60 70 -134q101 77 160 178l59 113q42 63 103 63q21 0 39 -9q11 -50 11 -101zM684 925q50 66 50 162t-64 196q-72 114 -174.5 114t-159.5 -82.5t-57 -194.5t75 -150 q25 26 42.5 26t67.5 -42q23 33 59 33q46 0 49 -44q22 15 34 15t32.5 -16t45.5 -17z" />
+<glyph unicode="&#x2699;" horiz-adv-x="1904" d="M952 -104q-47 0 -92 6l-167 -168q-77 24 -157 66v236q-74 56 -130 130h-236q-42 80 -66 157l168 167q-6 45 -6 92t6 92l-168 167q24 77 66 157h236q56 74 130 130v236q80 42 157 66l167 -168q45 6 92 6t92 -6l167 168q77 -24 157 -66v-236q74 -56 130 -130h236 q42 -80 66 -157l-168 -167q6 -45 6 -92t-6 -92l168 -167q-24 -77 -66 -157h-236q-56 -74 -130 -130v-236q-80 -42 -157 -66l-167 168q-45 -6 -92 -6zM1518 582q0 234 -166 400t-400 166t-400 -166t-166 -400t166 -400t400 -166t400 166t166 400zM1478 582q0 -218 -154 -372 t-372 -154t-372 154t-154 372t154 372t372 154t372 -154t154 -372zM1151 582q0 82 -58.5 140.5t-140.5 58.5t-140.5 -58.5t-58.5 -140.5t58.5 -140.5t140.5 -58.5t140.5 58.5t58.5 140.5z" />
+<glyph unicode="&#x269a;" horiz-adv-x="2242" d="M1235 1342q0 -48 -33 -81t-81 -33t-81 33t-33 81t33 81t81 33t81 -33t33 -81zM1526 888q-91 0 -170 16q44 -68 44 -161.5t-64.5 -170t-163.5 -94.5v-831q0 -49 -51 -49t-51 49v831q-99 18 -163.5 94.5t-64.5 170t44 161.5q-79 -16 -170 -16q-208 0 -387 80 q-206 91 -289 258q66 -12 131 -12q125 0 285 49l121 41q74 23 124 23q115 0 156 -69q18 -32 34.5 -139t60.5 -144q52 39 118 51v181q24 -9 51 -9t51 9v-181q66 -12 118 -51q44 37 60.5 144t34.5 139q41 69 156 69q50 0 117 -22l128 -42q160 -49 285 -49q65 0 131 12 q-83 -167 -289 -258q-179 -80 -387 -80zM1111 1268q54 0 54 79t-54 79q-31 0 -52.5 -26t-21.5 -58q0 -74 74 -74zM1310 752q0 65 -38.5 115t-99.5 67v-364q61 17 99.5 67t38.5 115zM932 752q0 -65 38.5 -115t99.5 -67v364q-61 -17 -99.5 -67t-38.5 -115z" />
+<glyph unicode="&#x269b;" horiz-adv-x="1862" d="M1762 214q0 -209 -311 -209q-90 0 -197 22q-123 -376 -324 -376q-197 0 -320 376q-107 -24 -202 -24q-307 0 -307 211q0 155 185 368q-186 208 -186 363q0 213 302 213q93 0 204 -25q130 380 324 380q201 0 324 -380q113 25 221.5 25t186.5 -42q100 -54 100 -167 q0 -158 -187 -367q187 -210 187 -368zM1685 916q0 191 -284 191q-63 0 -135 -11q37 -123 55 -287q135 -105 220 -190q144 164 144 297zM930 1427q-164 0 -279 -301q133 -29 276 -97q155 70 283 97q-113 301 -280 301zM1277 835q-9 69 -52 253q-98 -23 -250 -78 q149 -76 189.5 -98.5t112.5 -76.5zM1333 597v-37q0 -93 -8 -153q67 55 190 175q-64 68 -186 171q4 -56 4 -156zM1690 250q0 123 -145 295q-89 -90 -224 -194q-18 -159 -55 -283q75 -12 137 -12q287 0 287 194zM882 1006q-127 56 -246 79q-26 -86 -52 -254q97 82 220 138z M1284 377q11 92 11 202t-11 208q-56 39 -171 112q-81 47 -183 89q-167 -63 -350 -201q-14 -119 -14 -204.5t14 -209.5q185 -128 350 -201q144 54 354 205zM1280 325q-112 -72 -171.5 -107t-129.5 -64q159 -63 246 -78q33 113 55 249zM457 1105q-115 0 -188 -39 q-95 -50 -95 -155q0 -130 146 -299q98 105 223 193q15 148 56 287q-76 13 -142 13zM536 407q-8 111 -8 186.5t11 163.5q-112 -86 -193 -179q79 -85 190 -171zM886 154q-204 99 -302 175q25 -169 56 -253q111 19 246 78zM930 -267q169 0 280 305q-133 28 -276 93 q-162 -69 -283 -93q118 -305 279 -305zM175 246q0 -190 286 -190q62 0 138 12q-40 129 -56 283q-106 78 -227 194q-141 -170 -141 -299zM1084 580q0 -61 -46 -103.5t-107 -42.5t-107 42.5t-46 103.5t46 103.5t107 42.5t107 -42.5t46 -103.5zM1047 640q0 25 -37.5 46 t-66.5 24q40 -39 48 -81q2 -1 9 -1q47 0 47 12zM1067 569q1 9 1 21.5t-8 33.5q-34 -12 -64 -12q9 -22 9 -56q30 0 62 13z" />
+<glyph unicode="&#x269c;" horiz-adv-x="1664" d="M1507 793q97 -89 97 -210.5t-86 -204t-202 -82.5q-94 0 -188 103q75 36 75 77q0 27 -43 27q-81 0 -117 -105q38 0 64 -26t26 -64t-26 -64t-64 -26h-18q7 -90 40 -90q17 0 17 23.5t-5 43.5q22 29 56 29q62 0 103.5 -47.5t41.5 -114.5t-46 -111t-127.5 -44t-145.5 66 q-6 -54 -61.5 -139t-65.5 -130q-10 45 -65.5 130t-61.5 139q-64 -66 -145.5 -66t-127.5 44t-46 111t41.5 114.5t103.5 47.5q34 0 56 -29q-5 -20 -5 -43.5t17 -23.5q33 0 40 90h-18q-38 0 -64 26t-26 64t26 64t64 26q-36 105 -117 105q-43 0 -43 -27q0 -41 75 -77 q-94 -103 -188 -103q-116 0 -202 82.5t-86 204t97 210.5t235 89t247 -110q-22 90 -22 163q0 98 100 237t115 211q15 -72 115 -211t100 -237q0 -73 -22 -163q109 110 247 110t235 -89zM1475.5 421q68.5 65 68.5 161.5t-79.5 168t-183.5 71.5q-165 0 -270 -163 q-89 -139 -100 -321h-59q7 96 71 292t64 305q0 69 -57 157l-98 141l-98 -141q-57 -88 -57 -157q0 -109 64 -305t71 -292h-59q-11 182 -100 321q-105 163 -270 163q-104 0 -183.5 -71.5t-79.5 -168t68.5 -161.5t159.5 -65q49 0 97 39q-44 47 -44 82.5t32 60.5t71 25 q81 0 129.5 -66.5t62.5 -158.5h-75q-30 0 -30 -30t30 -30h80v-3q0 -207 -102 -207q-36 0 -57 30q-20 26 -20 59v6q-76 -10 -76 -97q0 -99 101.5 -99t157.5 109q44 85 49 202h60q-2 -46 -26 -140.5t-24 -142t68 -152.5q68 105 68 152.5t-24 142t-26 140.5h60q5 -117 49 -202 q56 -109 157.5 -109t101.5 99q0 87 -76 97v-6q0 -33 -20 -59q-21 -30 -57 -30q-102 0 -102 207v3h80q30 0 30 30t-30 30h-75q14 92 62.5 158.5t129.5 66.5q39 0 71 -25t32 -60.5t-44 -82.5q48 -39 97 -39q91 0 159.5 65z" />
+<glyph unicode="&#x269d;" d="M1953 794q0 -116 -292 -363l-46 54q267 231 267 299q0 59 -341 92q-235 22 -388 22t-254 -7l-5 69q83 6 289 6t402 -22q368 -42 368 -150zM1017 1419q-63 0 -217 -375q-123 -299 -181 -531l-67 17q60 242 182 541q170 418 283 418q116 0 275 -393l-65 -27 q-40 95 -108.5 222.5t-101.5 127.5zM1420 773q80 -196 154.5 -472.5t74.5 -433.5t-95 -157q-126 0 -400 170l37 60q272 -164 359 -164q31 0 31 67q0 155 -74.5 434.5t-150.5 469.5zM95 784q0 126 462 161l6 -70q-107 -9 -221 -30q-178 -33 -178 -68q0 -70 268.5 -297.5 t470.5 -354.5l-36 -59q-205 128 -446 329q-326 273 -326 389zM499 -303q-95 0 -95 158q0 129 51 336l68 -16q-50 -213 -50 -355q0 -56 31 -56q88 0 373.5 176.5t464.5 326.5l44 -53q-177 -149 -430 -310q-327 -207 -457 -207z" />
+<glyph unicode="&#x269e;" d="M1774 904l-54 -127l-1423 603l54 127zM1720 513h-1545v138h1545v-138zM1774 260l-1423 -603l-54 127l1423 603z" />
+<glyph unicode="&#x269f;" d="M1751 1380l-1423 -603l-54 127l1423 603zM1873 513h-1545v138h1545v-138zM1751 -216l-54 -127l-1423 603l54 127z" />
+<glyph unicode="&#x26a0;" d="M1101 155q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM2032 -201h-2016l1007 1745zM1862 -103l-839 1451l-837 -1451h1676zM1024 253q-34 0 -39 47l-69 632q-1 6 -1 12q0 39 31 64q34 28 78 28t78 -28q31 -25 31 -64q0 -6 -1 -12l-69 -634 q-5 -45 -39 -45z" />
+<glyph unicode="&#x26a1;" horiz-adv-x="963" d="M883 943l-289 -1001l139 23l-293 -365l-84 455l113 -86l80 665l-469 -235l307 1147h346l-352 -809z" />
+<glyph unicode="&#x26a2;" horiz-adv-x="1606" d="M1397 896q129 -129 129 -307t-113 -303.5t-281 -143.5v-171h196v-98h-196v-189h-98v189h-196v98h196v171q-130 14 -231 96q-101 -82 -231 -96v-171h196v-98h-196v-189h-98v189h-196v98h196v171q-168 18 -281 143.5t-113 303.5t129 307t314 129q158 0 280 -99 q122 99 280 99q185 0 314 -129zM1428 582q0 144 -100.5 244.5t-232 100.5t-223.5 -71q94 -120 94 -274t-94 -274q92 -71 223.5 -71t232 100.5t100.5 244.5zM868 582q0 113 -65 203q-65 -90 -65 -203t65 -203q65 90 65 203zM640 582q0 154 94 274q-92 71 -223.5 71 t-232 -100.5t-100.5 -244.5t100.5 -244.5t232 -100.5t223.5 71q-94 120 -94 274z" />
+<glyph unicode="&#x26a3;" horiz-adv-x="1629" d="M1466 282q0 -185 -129 -314t-314 -129q-147 0 -263 85.5t-159 221.5q-40 -7 -78 -7q-185 0 -314 129t-129 314t129 314t314 129q93 0 178 -37l89 154l-175 100l377 152l57 -402l-175 101l-88 -153q115 -85 159 -222q40 7 78 7q93 0 178 -37l89 154l-175 100l377 152 l57 -402l-175 101l-88 -153q180 -132 180 -358zM1368 282q0 144 -100.5 244.5t-244.5 100.5q-29 0 -59 -5q2 -23 2 -40q0 -137 -74.5 -247.5t-196.5 -161.5q34 -105 124 -170.5t204 -65.5q144 0 244.5 100.5t100.5 244.5zM868 582v9q-86 -43 -138 -126t-52 -183v-9 q86 43 138 126t52 183zM523 927q-144 0 -244.5 -100.5t-100.5 -244.5t100.5 -244.5t244.5 -100.5q29 0 59 5q-2 23 -2 40q0 137 74.5 247.5t196.5 161.5q-34 105 -124 170.5t-204 65.5z" />
+<glyph unicode="&#x26a4;" horiz-adv-x="1529" d="M1366 784q0 -178 -120.5 -305t-296.5 -137q-37 -128 -139.5 -214.5t-237.5 -101.5v-171h196v-98h-196v-189h-98v189h-196v98h196v171q-168 18 -281 143.5t-113 300t120.5 301.5t296.5 137q40 140 157.5 229.5t268.5 89.5q93 0 178 -37l89 154l-175 100l377 152l57 -402 l-175 101l-88 -153q180 -132 180 -358zM1181 555q87 97 87 235t-100.5 238.5t-244.5 100.5q-111 0 -199.5 -62.5t-124.5 -163.5q158 -27 262.5 -150t104.5 -287q0 -5 -1 -24q129 16 216 113zM868 466q0 129 -82 225t-207 116q-1 -16 -1 -23q0 -129 82 -225t207 -116 q1 16 1 23zM480 784q0 5 1 24q-129 -16 -216 -113t-87 -235t100.5 -238.5t244.5 -100.5q111 0 199.5 62.5t124.5 163.5q-158 27 -262.5 150t-104.5 287z" />
+<glyph unicode="&#x26a5;" horiz-adv-x="1129" d="M966 582q0 -171 -113 -296.5t-281 -143.5v-171h196v-98h-196v-189h-98v189h-196v98h196v171q-168 18 -281 143.5t-113 303.5t129 307t314 129q93 0 178 -37l89 154l-175 100l377 152l57 -402l-175 101l-88 -153q180 -132 180 -358zM868 582q0 144 -100.5 244.5 t-244.5 100.5t-244.5 -100.5t-100.5 -244.5t100.5 -244.5t244.5 -100.5t244.5 100.5t100.5 244.5z" />
+<glyph unicode="&#x26a6;" horiz-adv-x="1249" d="M966 418q0 -185 -129 -314t-314 -129t-314 129t-129 314t129 314t314 129q93 0 178 -37l85 148l-170 98l49 85l170 -98l75 129l-175 100l377 152l57 -402l-175 101l-74 -129l170 -98l-49 -85l-170 98l-85 -147q180 -132 180 -358zM868 418q0 144 -100.5 244.5 t-244.5 100.5t-244.5 -100.5t-100.5 -244.5t100.5 -244.5t244.5 -100.5t244.5 100.5t100.5 244.5z" />
+<glyph unicode="&#x26a7;" horiz-adv-x="1452" d="M1169 532q0 -171 -113 -296.5t-281 -143.5v-171h196v-98h-196v-189h-98v189h-196v98h196v171q-168 18 -281 143.5t-113 296.5q0 225 180 357l-85 148l-170 -98l-49 85l170 98l-74 129l-175 -101l57 402l377 -152l-175 -100l75 -129l170 98l49 -85l-170 -98l85 -148 q85 37 178 37t178 -37l209 362l-175 100l377 152l57 -402l-175 101l-208 -361q180 -132 180 -358zM1071 532q0 144 -100.5 244.5t-244.5 100.5t-244.5 -100.5t-100.5 -244.5t100.5 -244.5t244.5 -100.5t244.5 100.5t100.5 244.5z" />
+<glyph unicode="&#x26a8;" horiz-adv-x="1046" d="M853 714.5q113 -125.5 113 -303.5t-129 -307t-314 -129t-314 129t-129 307t113 303.5t281 143.5v171h-196v98h196v149h-201l250 320l250 -320h-201v-149h196v-98h-196v-171q168 -18 281 -143.5zM868 418q0 144 -100.5 244.5t-244.5 100.5t-244.5 -100.5t-100.5 -244.5 t100.5 -244.5t244.5 -100.5t244.5 100.5t100.5 244.5z" />
+<glyph unicode="&#x26a9;" horiz-adv-x="1781" d="M1381 533h-149v-196h-98v196h-171q-18 -168 -143.5 -281t-303.5 -113t-307 129t-129 314t129 314t307 129t303.5 -113t143.5 -281h171v196h98v-196h149v201l320 -250l-320 -250v201zM868 582q0 144 -100.5 244.5t-244.5 100.5t-244.5 -100.5t-100.5 -244.5t100.5 -244.5 t244.5 -100.5t244.5 100.5t100.5 244.5z" />
+<glyph unicode="&#x26aa;" horiz-adv-x="1218" d="M1178 582q0 -237 -166 -403t-403 -166t-403 166t-166 403t166 403t403 166t403 -166t166 -403zM1078 582q0 196 -136.5 332.5t-332.5 136.5t-332.5 -136.5t-136.5 -332.5t136.5 -332.5t332.5 -136.5t332.5 136.5t136.5 332.5z" />
+<glyph unicode="&#x26ab;" horiz-adv-x="1218" d="M1178 582q0 -237 -166 -403t-403 -166t-403 166t-166 403t166 403t403 166t403 -166t166 -403z" />
+<glyph unicode="&#x26ac;" horiz-adv-x="946" d="M906 582q0 -180 -126.5 -306.5t-306.5 -126.5t-306.5 126.5t-126.5 306.5t126.5 306.5t306.5 126.5t306.5 -126.5t126.5 -306.5zM806 582q0 139 -97 236t-236 97t-236 -97t-97 -236t97 -236t236 -97t236 97t97 236z" />
+<glyph unicode="&#x26ad;" horiz-adv-x="1606" d="M1526 582q0 -185 -129 -314t-314 -129q-158 0 -280 99q-122 -99 -280 -99q-185 0 -314 129t-129 314t129 314t314 129q158 0 280 -99q122 99 280 99q185 0 314 -129t129 -314zM1428 582q0 144 -100.5 244.5t-232 100.5t-223.5 -71q94 -120 94 -274t-94 -274 q92 -71 223.5 -71t232 100.5t100.5 244.5zM868 582q0 113 -65 203q-65 -90 -65 -203t65 -203q65 90 65 203zM640 582q0 154 94 274q-92 71 -223.5 71t-232 -100.5t-100.5 -244.5t100.5 -244.5t232 -100.5t223.5 71q-94 120 -94 274z" />
+<glyph unicode="&#x26ae;" horiz-adv-x="2030" d="M1950 582q0 -185 -129 -314t-314 -129t-314 129t-129 314v-492h-98v492q0 -185 -129 -314t-314 -129t-314 129t-129 314t129 314t314 129t314 -129t129 -314v492h98v-492q0 185 129 314t314 129t314 -129t129 -314zM1852 582q0 144 -100.5 244.5t-244.5 100.5 t-244.5 -100.5t-100.5 -244.5t100.5 -244.5t244.5 -100.5t244.5 100.5t100.5 244.5zM868 582q0 144 -100.5 244.5t-244.5 100.5t-244.5 -100.5t-100.5 -244.5t100.5 -244.5t244.5 -100.5t244.5 100.5t100.5 244.5z" />
+<glyph unicode="&#x26af;" horiz-adv-x="2530" d="M2450 582q0 -185 -129 -314t-307 -129t-303.5 113t-143.5 281h-604q-18 -168 -143.5 -281t-303.5 -113t-307 129t-129 314t129 314t307 129t303.5 -113t143.5 -281h604q18 168 143.5 281t303.5 113t307 -129t129 -314zM2352 582q0 144 -100.5 244.5t-244.5 100.5 t-244.5 -100.5t-100.5 -244.5t100.5 -244.5t244.5 -100.5t244.5 100.5t100.5 244.5zM868 582q0 144 -100.5 244.5t-244.5 100.5t-244.5 -100.5t-100.5 -244.5t100.5 -244.5t244.5 -100.5t244.5 100.5t100.5 244.5z" />
+<glyph unicode="&#x26b0;" horiz-adv-x="1857" d="M1745 438l-1188 -149l-445 150v435l445 150l1188 -149v-437zM1633 537v239l-1065 134l-344 -116v-275l344 -116z" />
+<glyph unicode="&#x26b1;" horiz-adv-x="1307" d="M1176 719q19 -51 19 -80.5t-50 -136.5q-213 -456 -294 -831l-55 -44h-285l-55 44q-81 375 -294 831q-50 107 -50 136.5t19 80.5q57 151 140.5 232t236.5 129l-38 22l-29 49v274h-155v112h735v-112h-155v-274l-29 -49l-38 -22q153 -48 236.5 -129t140.5 -232zM662 1062 q0 68 92 122v241h-201v-241q92 -54 92 -122q0 -50 -69 -81l-115 -39q-57 -24 -107.5 -68t-90 -129.5t-39.5 -106.5q2 -6 70.5 -161.5t141.5 -345.5t120 -392h195q70 301 318 866q7 15 14 33q0 21 -39.5 106.5t-90 129.5t-107.5 68l-115 39q-69 31 -69 81z" />
+<glyph unicode="&#x26b2;" horiz-adv-x="1046" d="M837 896q129 -129 129 -307t-113 -303.5t-281 -143.5v-458h-98v458q-168 18 -281 143.5t-113 303.5t129 307t314 129t314 -129zM868 582q0 144 -100.5 244.5t-244.5 100.5t-244.5 -100.5t-100.5 -244.5t100.5 -244.5t244.5 -100.5t244.5 100.5t100.5 244.5z" />
+<glyph unicode="&#x26b3;" horiz-adv-x="1316" d="M958 1311q156 -156 156 -370.5t-135.5 -365.5t-337.5 -174v-401h296v-125h-296v-285h-125v285h-296v125h296v522h63q171 0 290.5 119.5t119.5 290.5t-119.5 290.5t-290.5 119.5q-143 0 -300 -122l-77 99q187 148 377 148q223 0 379 -156z" />
+<glyph unicode="&#x26b4;" horiz-adv-x="1480" d="M800 0h296v-125h-296v-285h-125v285h-296v125h296v381l-502 510l567 576l567 -576l-507 -515v-376zM1132 891l-392 398l-392 -398l392 -398z" />
+<glyph unicode="&#x26b5;" horiz-adv-x="1474" d="M1258 798h-371l262 -262l-88 -89l-262 262v-709h296v-125h-296v-285h-125v285h-296v125h296v709l-262 -262l-88 89l262 262h-370v125h370l-262 261l88 89l262 -262v409h125v-409l262 262l88 -89l-262 -261h371v-125z" />
+<glyph unicode="&#x26b6;" horiz-adv-x="1592" d="M859 635h-125v639h125v-639zM1342 561h-186l-360 -428l-360 428h-186v125h244l302 -359l302 359h244v-125zM1502 0h-346l-360 -347l-360 347h-346v125h396l310 -298l310 298h396v-125z" />
+<glyph unicode="&#x26b7;" horiz-adv-x="1014" d="M931 -117q0 -141 -148 -222q-123 -67 -275 -67t-276 68q-149 82 -149 214t119 211q99 65 242 81v1252h125v-279l250 236l86 -91l-275 -259l275 -260l-86 -91l-250 237v-745q142 -16 242 -82q120 -79 120 -203zM691 -244q115 47 115 126t-115 127q-91 38 -185 38t-183 -37 q-115 -47 -115 -126t115 -127q91 -38 185 -38t183 37z" />
+<glyph unicode="&#x26b8;" horiz-adv-x="1234" d="M1061 270q-118 -30 -213 -30t-188 28v-268h296v-125h-296v-285h-125v285h-296v125h296v319q-162 86 -262 238.5t-100 330.5q0 264 204 456t470 192q96 0 214 -30l-1 -8q-202 -2 -333 -212q-114 -183 -114 -398t114 -398q131 -210 333 -212z" />
+<glyph unicode="&#x26b9;" horiz-adv-x="1713" d="M1623 498h-658l329 -570l-108 -63l-329 570l-330 -570l-108 63l329 570h-658v125h658l-329 570l108 63l329 -571l330 571l108 -63l-329 -570h658v-125z" />
+<glyph unicode="&#x26ba;" horiz-adv-x="1364" d="M1274 0h-1184v125h458l-424 1076l117 46l441 -1122l441 1122l117 -46l-424 -1076h458v-125z" />
+<glyph unicode="&#x26bb;" horiz-adv-x="1364" d="M1274 1122h-458l424 -1076l-117 -46l-441 1122l-441 -1122l-117 46l424 1076h-458v125h1184v-125z" />
+<glyph unicode="&#x26bc;" horiz-adv-x="1416" d="M1247 -362h-602v362h-445v1016h1016v-1016h-446v-237h477v-125zM1085 125v766h-760v-766h320v362h125v-362h315z" />
+<glyph unicode="&#x26bd;" d="M2015 582q0 -410 -290.5 -700.5t-700.5 -290.5t-700.5 290.5t-290.5 700.5t290.5 700.5t700.5 290.5t700.5 -290.5t290.5 -700.5zM1880 1018q-98 192 -271 325l5 -58zM1897 971l-4 4h1l-292 294l-277 -93v-346l290 -245l272 84zM1978 474l-87 176l-271 -85l-191 -356 l75 -215l286 9q159 210 188 471zM1305 831v346l-323 165l-296 -232l15 -313l283 -143zM969 1357l-59 178q-333 -39 -569 -278l19 -110l312 -22zM341 1139l-17 100q-215 -229 -253 -541l118 82zM1486 -13l-75 215l-360 102l-263 -212l111 -296l339 -25zM1038 319l-62 317 l-283 143l-283 -251l62 -291l303 -131zM788 -349q115 -29 249 -29t274 44l-75 85l-340 25zM64 582q0 -240 110 -448l132 -84l147 182l-63 295l-195 233l-127 -88q-4 -43 -4 -90zM326 -77l-26 107l-105 67q54 -93 131 -174z" />
+<glyph unicode="&#x26be;" d="M2015 582q0 -410 -290.5 -700.5t-700.5 -290.5t-700.5 290.5t-290.5 700.5t290.5 700.5t700.5 290.5t700.5 -290.5t290.5 -700.5zM1966 582q0 220 -94.5 412t-259.5 324q-66 -56 -120 -117l-70 61q52 60 113 111q-232 151 -511 151t-511 -151q61 -51 113 -111l-70 -61 q-54 61 -120 117q-165 -132 -259.5 -324t-94.5 -412t94.5 -412t259.5 -324q66 56 120 117l70 -61q-52 -60 -113 -111q232 -151 511 -151t511 151q-61 51 -113 111l70 61q54 -61 120 -117q165 132 259.5 324t94.5 412zM1424 1114q-59 -84 -98 -176l-83 31q44 109 111 206z M1291 834q-26 -95 -32 -197h-90q7 117 38 228zM805 969l-83 -31q-39 92 -98 176l70 61q67 -97 111 -206zM1291 330l-84 -31q-31 111 -38 228h90q6 -102 32 -197zM879 637h-90q-6 102 -32 197l84 31q31 -111 38 -228zM1424 50l-70 -61q-67 97 -111 206l83 31q39 -92 98 -176z M879 527q-7 -117 -38 -228l-84 31q26 95 32 197h90zM805 195q-44 -109 -111 -206l-70 61q59 84 98 176z" />
+<glyph unicode="&#x26bf;" d="M1975 -366h-1902v1903h1902v-1903zM1862 -257v1681h-1676v-1681h1676zM1445 1001q0 -276 -326 -343v-482h226v-200h-224v-137h-192v819q-326 67 -326 343q0 159 136 249q118 78 285 78t285 -78q136 -90 136 -249zM1024 842q82 0 145.5 36t63.5 113t-69 116 q-55 33 -140 33t-140 -33q-69 -39 -69 -116t63.5 -113t145.5 -36z" />
+<glyph unicode="&#x26c0;" d="M1709 420q0 -144 -284 -221q-201 -55 -401 -55t-401 55q-284 77 -284 221v339q0 136 289 209q203 52 396 52t396 -52q289 -73 289 -209v-339zM1670 420v214q-24 -30 -53 -51v-258q53 43 53 95zM1537 278v261q-26 -12 -58 -23v-260q36 12 58 22zM1670 742q0 127 -270 193 q-188 46 -376 46t-376 -46q-270 -66 -270 -193q0 -137 266 -209q186 -50 380 -50t380 50q266 72 266 209zM1404 234v258q-15 -3 -46 -10v-259q20 4 46 11zM1300 212v258q-31 -6 -73 -11v-259q27 4 73 12zM1188 453q-83 -9 -190.5 -9t-252.5 26v-258q159 -29 250.5 -29 t192.5 12v258zM706 219v259q-33 7 -80 20v-259q53 -14 80 -20zM565 257v260q-21 7 -60 23v-260q20 -9 60 -23zM378 420q0 -57 62 -102v259q-36 25 -62 57v-214zM1543 761q0 -109 -215 -160q-142 -35 -304 -35t-304 35q-215 51 -215 160t215 160q142 35 303.5 35t304.5 -35 q215 -51 215 -160zM1504 761q0 83 -204 126q-140 30 -276 30t-275 -29q-205 -44 -205 -127t205 -127q139 -29 275 -29t275 29q205 44 205 127zM1188 761q0 -78 -164 -78t-164 78t164 78t164 -78zM899 761q0 -19 47 -29t78.5 -10t78 9.5t46.5 29t-47 29.5t-78 10t-78 -10 t-47 -29zM2048 1606zM0 1606zM2048 -442zM0 -442z" />
+<glyph unicode="&#x26c1;" d="M1709 624q0 -144 -284 -221q-201 -55 -401 -55t-401 55q-284 77 -284 221v339q0 136 289 209q203 52 396 52t396 -52q289 -73 289 -209v-339zM1709 265q0 -144 -284 -221q-201 -54 -401 -54t-401 54q-284 77 -284 221v338q0 -144 284 -221q201 -54 401 -54t401 54 q284 77 284 221v-338zM1670 624v214q-22 -27 -53 -50v-259q53 43 53 95zM1537 482v261q-26 -12 -58 -23v-260q36 12 58 22zM1670 265v213q-22 -27 -53 -50v-258q53 43 53 95zM1670 946q0 127 -270 193q-188 46 -376 46t-376 -46q-270 -66 -270 -193q0 -137 266 -208 q185 -50 379.5 -50t380.5 50q266 71 266 208zM1404 438v259l-46 -11v-258q15 3 46 10zM1300 416v259l-73 -12v-259q27 4 73 12zM1537 123v260q-26 -12 -58 -23v-259q36 12 58 22zM1404 79v258l-46 -11v-257q15 3 46 10zM1188 658q-83 -9 -190.5 -9t-252.5 26v-259 q159 -29 250.5 -29t192.5 12v259zM1300 57v258l-73 -12v-258q27 4 73 12zM706 424v258q-33 7 -80 20v-259q37 -10 80 -19zM1188 298q-83 -9 -190.5 -9t-252.5 26v-258q154 -28 252.5 -28t190.5 11v258zM565 461v260q-36 13 -60 24v-260q29 -13 60 -24zM378 624 q0 -56 62 -101v258q-36 25 -62 57v-214zM706 65v257q-33 7 -80 20v-258q37 -10 80 -19zM565 103v258q-36 13 -60 24v-259q20 -9 60 -23zM378 265q0 -56 62 -101v257q-36 25 -62 57v-213zM1543 966q0 -109 -215 -160q-142 -35 -304 -35t-304 35q-215 51 -215 160t215 160 q142 35 303.5 35t304.5 -35q215 -51 215 -160zM1504 966q0 83 -204 126q-140 30 -276 30t-275 -29q-205 -44 -205 -127t205 -127q139 -29 275 -29t275 29q205 44 205 127zM1188 966q0 -78 -164 -78t-164 78t164 78t164 -78zM899 966q0 -19 47 -29t78.5 -10t78 9.5t46.5 29 t-47 29.5t-78 10t-78 -10t-47 -29zM2048 1606zM0 1606zM2048 -442zM0 -442z" />
+<glyph unicode="&#x26c2;" d="M1709 420q0 -81 -92 -142v300q92 61 92 142v-300zM1537 236q-31 -13 -58 -22v300q16 5 58 23v-301zM1709 759q0 -144 -284 -221q-201 -55 -401 -55t-401 55q-284 77 -284 221q0 136 289 209q203 52 396 52t396 -52q289 -73 289 -209zM1404 193q-30 -8 -46 -11v300l46 12 v-301zM1300 171q-28 -5 -73 -11v300q21 3 73 12v-301zM1188 154q-88 -10 -190 -10t-253 27v301q157 -28 251.5 -28t191.5 11v-301zM706 179q-54 11 -80 18v301q42 -11 80 -19v-300zM565 215q-20 7 -60 24v300q30 -13 60 -23v-301zM339 420v300q0 -84 101 -147v-300 q-101 63 -101 147zM1543 761q0 109 -215 160q-143 35 -304.5 35t-303.5 -35q-215 -51 -215 -160t215 -160q142 -35 304 -35t304 35q215 51 215 160zM1504 761q0 -83 -205 -127q-139 -29 -275 -29t-275 29q-205 44 -205 127t205 127q139 29 275 29t276 -30q204 -43 204 -126z M1188 761q0 78 -164 78t-164 -78t164 -78t164 78zM1024 800q31 0 78 -10t47 -29.5t-46.5 -29t-78 -9.5t-78.5 10t-47 29t47 29t78 10zM2048 1606zM0 1606zM2048 -442zM0 -442z" />
+<glyph unicode="&#x26c3;" d="M1709 624q0 -81 -92 -142v300q92 61 92 142v-300zM1537 441q-31 -13 -58 -22v300q27 9 58 22v-300zM1709 265q0 -81 -92 -142v299q92 61 92 142v-299zM1709 963q0 -144 -284 -221q-201 -54 -401 -54t-401 54q-284 77 -284 221q0 136 289 209q203 52 396 52t396 -52 q289 -73 289 -209zM1404 398l-46 -12v300l46 12v-300zM1300 376l-73 -12v300q21 3 73 12v-300zM1537 82q-31 -13 -58 -22v299q27 9 58 22v-299zM1404 39l-46 -12v299l46 12v-299zM1709 584q0 -144 -282 -221q-202 -55 -403 -55t-403 55q-282 77 -282 221v20q0 -144 282 -220 q201 -55 403 -55t403 55q282 76 282 220v-20zM1188 359q-97 -11 -191.5 -11t-251.5 28v300q151 -27 253 -27t190 10v-300zM1300 17l-73 -12v299q21 3 73 12v-299zM706 383q-38 8 -80 19v300q26 -7 80 -18v-301zM1188 0q-88 -10 -190 -10t-253 27v299q151 -27 253 -27t190 10 v-299zM565 420q-30 10 -60 23v300q30 -13 60 -23v-300zM339 624v300q0 -84 101 -147v-300q-101 63 -101 147zM706 25q-54 11 -80 18v299q26 -7 80 -18v-299zM565 61q-30 10 -60 23v299q30 -13 60 -23v-299zM339 265v299q0 -84 101 -147v-299q-101 63 -101 147zM1543 966 q0 109 -215 160q-143 35 -304.5 35t-303.5 -35q-215 -51 -215 -160t215 -160q142 -35 304 -35t304 35q215 51 215 160zM1504 966q0 -83 -205 -127q-139 -29 -275 -29t-275 29q-205 44 -205 127t205 127q139 29 275 29t276 -30q204 -43 204 -126zM1188 966q0 78 -164 78 t-164 -78t164 -78t164 78zM1024 1005q31 0 78 -10t47 -29.5t-46.5 -29t-78 -9.5t-78.5 10t-47 29t47 29t78 10zM2048 1606zM0 1606zM2048 -442zM0 -442z" />
+<glyph unicode="&#x26c4;" d="M1719 159q0 -516 -695 -516t-695 516q0 297 255 447q-118 119 -118 281q0 110 51 193q141 230 507 230q227 0 377 -95q177 -113 177 -328q0 -166 -114 -281q255 -141 255 -447zM1619 159q0 146 -75 247q-47 63 -130 115.5t-83 67.5q0 10 75.5 110t75.5 188 q0 169 -152 254q-123 69 -306 69t-306 -69q-152 -85 -152 -254q0 -88 75.5 -188t75.5 -110q0 -15 -83 -67.5t-130 -115.5q-75 -101 -75 -247q0 -241 188 -341q141 -75 407 -75t407 75q188 100 188 341zM1269 945q25 -25 25 -58.5t-25.5 -60t-58.5 -26.5t-58 25.5t-25 58.5 t25 59.5t58.5 26.5t58.5 -25zM896 945q25 -25 25 -58.5t-26 -60t-59 -26.5t-57.5 25.5t-24.5 59.5t24.5 59.5t58.5 25.5t59 -25z" />
+<glyph unicode="&#x26c5;" d="M968 309l-144 -13q-110 0 -183 59q-52 42 -71 51.5t-71 9.5t-148 -22.5t-145 -22.5q-206 0 -206 122q0 85 320 132q2 72 43 120q-30 -14 -82 -42l-8 3q42 49 88 114q-10 20 -20 27q-21 -2 -122 -57l-9 2q42 50 89 115l-10 12h-18l-110 -23l-13 3q49 34 113 88v6l-7 14 l-139 15q3 7 67.5 26t64.5 35t-138 61q5 7 78 11.5t74 24.5q-16 22 -37 35l-48 29q-26 15 -28 30l134 -25l17 13v12l-89 100q34 -1 129 -49q15 10 15 20t-55 109v17q10 -6 110 -88l24 16q-8 42 -29 124l7 11l51 -72q28 -40 44 -40q6 0 9 12q0 46 14 132q1 -2 27 -65.5 t39 -65.5q15 8 32 51l31 80q5 -27 9 -85.5t14 -58.5q18 0 52 45l43 63l7 4v-10q0 -21 -11.5 -65.5t-11.5 -59.5t23 -16q33 33 107 88q-2 -15 -55 -129q6 -17 20 -17t61 31.5t64 34.5l-54 -110q57 -2 97 -59q85 148 217 148q94 0 165.5 -62t71.5 -154q0 -39 -11 -74 q38 11 86 11q84 0 142 -58t58 -141q0 -54 -26 -110q19 4 37 4q88 0 186.5 -60t98.5 -142q0 -78 -241 -198q-69 -93 -247 -93q-111 0 -308 -36q-22 -4 -49.5 -4t-109 28t-125.5 28zM1943 597q0 54 -78 82q-56 20 -132 20t-130 -59q24 -36 24 -58q0 -102 -144 -102 q-87 0 -145 33q-26 15 -26 40t26 33q113 -38 147 -38q66 0 66 36q0 17 -58 59q53 82 53 158q0 35 -33.5 54t-71.5 19q-84 0 -145 -56q-14 -4 -28 -4q-34 0 -34 25q0 12 11 25q71 84 207 84q66 0 119.5 -39.5t53.5 -103.5q0 -23 -3 -47q45 60 45 110.5t-35.5 93t-86.5 42.5 q-118 0 -164 -57q-57 2 -73 32q49 53 66.5 81.5t17.5 83t-48.5 92.5t-105.5 38q-119 0 -222 -239q-31 139 -105 139q-56 0 -126.5 -69.5t-70.5 -171.5l-47 -62q-33 92 -60 92q-50 0 -96 -99q-61 -134 -67 -141l-36 -39q-12 -17 -15 -52l170 14q4 -8 4 -17q0 -30 -28 -58 q-123 0 -311 -34q-42 -6 -96 -16t-54 -28q0 -49 128 -49q50 0 146 23t146 23q94 0 175.5 -58.5t150.5 -58.5q214 0 214 118q13 18 34 18t37 -18q0 -74 -54 -119q126 -45 176 -45t179.5 22t152.5 22q125 0 167 69l123 69q90 56 90 88zM838 1256q-90 112 -216.5 112 t-213.5 -87.5t-87 -214t111 -216.5q89 186 176 186q27 0 50 -10q11 59 63.5 127t116.5 103zM900 876q-6 0 -12 2q-6 63 -13 63q-40 0 -58 -60q-10 -46 -19 -92q-9 -34 -42 -36q-19 39 -25 39q-27 0 -43 -43l-17 -65q-25 -84 -91 -148q63 331 153 331q8 0 16 -3 q13 52 46.5 102t75.5 50q71 0 70 -108q-12 -32 -41 -32z" />
+<glyph unicode="&#x26c6;" d="M1966 1231q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1666 1231q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1837 931q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38z M1366 1231q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1537 931q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1698 631q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38z M1066 1231q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1869 331q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1237 931q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38z M1398 631q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM766 1231q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1569 331q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38z M937 931q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1720 31q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1098 631q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38z M466 1231q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1881 -269q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1269 331q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38z M637 931q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1420 31q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM798 631q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38z M166 1231q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1581 -269q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM969 331q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38z M337 931q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1120 31q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM498 631q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38z M1281 -269q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM669 331q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM820 31q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38z M198 631q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM981 -269q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM369 331q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM520 31 q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM681 -269q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM69 331q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM220 31 q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM381 -269q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM81 -269q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38z" />
+<glyph unicode="&#x26c7;" d="M1931 1449q0 -22 -17.5 -40t-39 -18t-39.5 17.5t-18 38.5q0 55 57 55t57 -53zM1569 1400q0 -53 -57 -53t-57 53q0 22 17.5 40t39.5 18t39.5 -18t17.5 -40zM1704 1262q57 0 57 -55.5t-55.5 -55.5t-55.5 55.5t54 55.5zM1950 1012q0 -57 -54 -57q-21 0 -39 18t-18 38.5 t18.5 39.5t39.5 19t37 -18t16 -40zM1118 1426q0 54 55.5 54t55.5 -55.5t-53 -55.5q-22 0 -40 17.5t-18 39.5zM1708 859q53 0 53 -55.5t-55.5 -55.5t-55.5 55.5t58 55.5zM1896 656q54 0 54 -55.5t-55.5 -55.5t-55.5 53q0 22 17.5 40t39.5 18zM817 1502q54 0 54 -55.5 t-54 -55.5q-23 0 -40 17.5t-17 40.5q0 53 57 53zM499 1458q54 0 54 -55.5t-54 -55.5q-57 0 -57 55q0 21 18 38.5t39 17.5zM178 1480q53 0 53 -55.5t-53 -55.5q-22 0 -40 17t-18 38q0 56 58 56zM365 1246q18 -16 18 -37.5t-17.5 -39.5t-38.5 -18q-55 0 -55 55.5t53 55.5 q22 0 40 -16zM1719 159q0 -516 -695 -516t-695 516q0 297 255 447q-118 119 -118 281q0 110 51 193q141 230 507 230q227 0 377 -95q177 -113 177 -328q0 -166 -114 -281q255 -141 255 -447zM209 1012q0 -57 -54 -57q-21 0 -39 18t-18 38.5t18.5 39.5t39.5 19t37 -18t16 -40 zM344 859q54 0 54 -55.5t-56 -55.5q-20 0 -37.5 17.5t-17.5 38.5q0 55 57 55zM155 656q54 0 54 -55.5t-54 -55.5q-57 0 -57 53q0 22 17.5 40t39.5 18zM1268.5 826.5q25.5 26.5 25.5 60t-25 58.5t-58.5 25t-58.5 -26.5t-25 -59.5t25 -58.5t58 -25.5t58.5 26.5zM895 826.5 q26 26.5 26 60t-25 58.5t-59 25t-58.5 -25.5t-24.5 -59.5t24.5 -59.5t57.5 -25.5t59 26.5z" />
+<glyph unicode="&#x26c8;" d="M1560 -21q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM968 309l-144 -13q-109 0 -183 59q-53 42 -71.5 51.5t-70.5 9.5t-148 -22.5t-145 -22.5q-206 0 -206 122q0 85 320 132q2 57 19.5 86.5t67.5 80.5q98 244 201 244q27 0 50 -10 q15 82 100 168.5t165 86.5q59 0 100 -59q85 148 217 148q94 0 165.5 -62t71.5 -154q0 -39 -11 -74q38 11 86 11q84 0 142 -58t58 -141q0 -54 -26 -110q19 4 37 4q88 0 186.5 -60t98.5 -142q0 -78 -241 -198q-69 -93 -247 -93q-73 0 -196 -19t-131 -20l-206 -445l-80 96 l-313 -347h-39l339 698l71 -87l61 121q-59 19 -98 19zM1260 -21q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1410 -321q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1110 -321q-59 0 -59 56q0 91 131 147 q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM660 -21q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM360 -21q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM510 -321q-59 0 -59 56q0 91 131 147 q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM210 -321q-59 0 -59 56q0 91 131 147q-12 -45 -13.5 -99.5t-4.5 -65.5q-11 -38 -54 -38zM1943 597q0 54 -78 82q-56 20 -132 20t-130 -59q24 -36 24 -58q0 -102 -144 -102q-87 0 -145 33q-26 15 -26 40t26 33 q113 -38 147 -38q66 0 66 36q0 17 -58 59q53 82 53 158q0 35 -33.5 54t-71.5 19q-84 0 -145 -56q-14 -4 -28 -4q-34 0 -34 25q0 12 11 25q71 84 207 84q66 0 119.5 -39.5t53.5 -103.5q0 -23 -3 -47q45 60 45 110.5t-35.5 93t-86.5 42.5q-118 0 -164 -57q-57 2 -73 32 q49 53 66.5 81.5t17.5 83t-48.5 92.5t-105.5 38q-119 0 -222 -239q-31 139 -105 139q-56 0 -126.5 -69.5t-70.5 -171.5l-47 -62q-33 92 -60 92q-50 0 -96 -99q-61 -134 -67 -141l-36 -39q-12 -17 -15 -52l170 14q4 -8 4 -17q0 -30 -28 -58q-123 0 -311 -34q-42 -6 -96 -16 t-54 -28q0 -49 128 -49q50 0 146 23t146 23q94 0 175.5 -58.5t150.5 -58.5q214 0 214 118q13 18 34 18t37 -18q0 -74 -54 -119q126 -45 176 -45t179.5 22t152.5 22q125 0 167 69l123 69q90 56 90 88zM1179 256l-66 18l-97 -197l-71 87l-196 -404l200 222l66 -80zM900 876 q-6 0 -12 2q-6 63 -13 63q-40 0 -58 -60q-10 -46 -19 -92q-9 -34 -42 -36q-19 39 -25 39q-27 0 -43 -43l-17 -65q-25 -84 -91 -148q63 331 153 331q8 0 16 -3q13 52 46.5 102t75.5 50q71 0 70 -108q-12 -32 -41 -32z" />
+<glyph unicode="&#x26c9;" horiz-adv-x="1566" d="M1454 1292l-100 -801l-571 -541l-571 541l-100 801h1342zM1341 1192h-1116l82 -653l476 -451l476 451z" />
+<glyph unicode="&#x26ca;" horiz-adv-x="1566" d="M1454 1292l-100 -801l-571 -541l-571 541l-100 801h1342z" />
+<glyph unicode="&#x26cb;" d="M1928 -262q0 -24 -18 -42t-42 -18h-1688q-24 0 -42 18t-18 42v1688q0 24 18 42t42 18h1688q24 0 42 -18t18 -42v-1688zM1808 -202v1568h-1568v-1568h1568zM1768 582q0 -25 -17 -42l-685 -685q-17 -17 -42 -17t-42 17l-685 685q-17 17 -17 42t17 42l685 685q17 17 42 17 t42 -17l685 -685q17 -17 17 -42zM1638 582l-614 614l-614 -614l614 -614z" />
+<glyph unicode="&#x26cc;" d="M1134 692v129l326 326h129v-129l-326 -326h-129zM1588 16h-129l-999 1003v129h127l1001 -1003v-129zM459 17v129l326 326h129v-129l-326 -326h-129z" />
+<glyph unicode="&#x26cd;" d="M1279 1172v-59l-73 -47q-11 42 -36 106h109zM1227 801h-20v-35h-50v-109h-142v109h-682v-109h-142v109h-50v35h-20v67h20v127q0 92 139 382q160 28 394 28t394 -28q139 -290 139 -382v-127h20v-67zM1984 -312h-1173l587 944zM69 1172h109q-25 -64 -36 -106l-73 47v59z M1166 882v98h-164v-98h164zM674 1349q-230 0 -353 -17q-63 -113 -95 -218q205 9 448 9t448 -9q-32 105 -95 218q-123 17 -353 17zM961 942v38h-574v-38h574zM961 882v38h-574v-38h574zM1207 821v27h-1066v-27h1066zM1779 -197l-381 612l-381 -612h762zM346 882v98h-164v-98 h164z" />
+<glyph unicode="&#x26ce;" d="M1917 634q0 -118 -77.5 -197.5t-195.5 -79.5q-39 0 -132 23v-214q0 -201 139 -201q85 0 136 77q-31 -203 -294 -203q-173 0 -247 160q-90 -160 -349 -160q-111 0 -189 33q-106 46 -106 141v745q-28 17 -94 38t-95 21q-69 0 -117.5 -44.5t-48.5 -112.5q0 -92 99 -202 l-75 -76q-59 49 -99.5 130t-40.5 155q0 116 77.5 195.5t193.5 79.5q41 0 115.5 -20.5t84.5 -22.5v469h264v-573l380 -177v750h266v-853q101 -33 123 -33q69 0 117.5 44t48.5 113q0 95 -99 202l76 75q139 -124 139 -282zM1246 144v332l-380 173v-548q0 -115 156 -115 q80 0 152 42t72 116z" />
+<glyph unicode="&#x26cf;" d="M1960 -179l-179 -176l-1120 1113q-282 -330 -484 -875l-89 17q8 289 93 588.5t238 511.5l-311 433l61 64l422 -317q272 203 555 275q227 57 618 60l22 -90q-535 -101 -945 -484z" />
+<glyph unicode="&#x26d0;" d="M1958 871l-29 -51l-87 -5q12 44 22 110zM1005 1421q-51 -41 -84 -74l-40 78l30 51zM1878 1154q-24 -321 -70 -401l-64 -110l17 -10l-33 -58l-17 10l-18 -30l-43 25l-55 -94l-123 71l55 94l-591 341l-54 -94l-123 71l54 94l-43 25l17 30l-17 10l34 58l17 -10l63 110 q48 81 312 262q159 -58 355.5 -171.5t326.5 -222.5zM1776 -374h-160v155q0 159 -135 159h-315v160h315q138 0 216.5 -89.5t78.5 -229.5v-155zM816 562h-413q-86 0 -115 -53q-20 -38 -20 -130t21 -125q28 -45 114 -45h253v-160h-253q-140 0 -217.5 79.5t-77.5 219.5v65 q0 140 78.5 224.5t216.5 84.5h413v-160zM1300 300h-197q-73 0 -94 -28.5t-21 -100.5v-230q0 -139 -88 -229t-227 -90h-633v160h633q72 0 113.5 43t41.5 116v230q0 289 275 289h197v-160zM1820 1135q-98 76 -298 191.5t-313 161.5q-111 -66 -191 -141q392 -204 775 -448 q25 109 27 236zM1765 761l-142 82l-49 -85l142 -82zM1587 863l-497 287l-19 -33l497 -287zM1557 811l-497 287l-19 -33l497 -287zM1734 626l-923 533l-14 -23l924 -533zM1054 1171l-142 82l-49 -85l142 -82z" />
+<glyph unicode="&#x26d1;" d="M1995 524h-220q-7 -112 -33 -216q-70 -277 -255 -438.5t-463 -161.5t-463 161.5t-255 438.5q-26 104 -33 216h-220v81q90 41 208 100q4 106 14 161q35 191 168 350q215 257 581 257t581 -257q133 -159 168 -350q10 -55 14 -161q118 -59 208 -100v-81zM1363 899v179h-243 v241h-193v-243h-242v-178h242v-242h194v243h242zM1621 524h-1194q0 -62 24 -166q51 -226 201.5 -372.5t371.5 -146.5t371.5 146.5t201.5 372.5q24 104 24 166z" />
+<glyph unicode="&#x26d2;" d="M1948 582q0 -385 -269.5 -654.5t-654.5 -269.5t-654.5 269.5t-269.5 654.5t269.5 654.5t654.5 269.5t654.5 -269.5t269.5 -654.5zM1024 1294q-245 0 -436 -147l326 -326v-129h-129l-326 326q-147 -191 -147 -436t148 -437l1001 1001q-192 148 -437 148zM1736 582 q0 245 -148 437l-1001 -1001q192 -148 437 -148t436 147l-326 326v129h129l326 -326q147 191 147 436z" />
+<glyph unicode="&#x26d3;" d="M1778 114q0 -377 -240 -388v-80h-119v76q-244 19 -244 396q0 325 179 375q22 5 65 17v154q-32 6 -94 28q-150 75 -150 376.5t168 364.5q2 1 76 22v77h119v-77q72 -18 101 -34q139 -76 139 -361q0 -369 -244 -392v-158q6 -2 21 -6q132 -31 184 -147q39 -87 39 -243z M873 -354h-130q-9 74 -17 148q-19 76 -88 113h-9q-5 -59 -6 -64q-10 -27 -50.5 -27t-52.5 29q-6 14 -10 62q-71 -20 -93 -108q-6 -24 -17 -153h-130v59q0 9 5 44q19 130 69 197.5t169 90.5v155l-10 5q-129 11 -188 144q-45 99 -45 248q0 368 244 390v158l-50 12 q-100 26 -147 125t-47 195v63h130l14 -154q19 -80 96 -111q3 48 10 64q13 30 52 30t49 -30l8 -64q72 21 96 110q9 33 18 155h130v-53q0 -33 -12 -94q-42 -214 -211 -243q-8 -1 -24 -8v-153q0 -4 25.5 -4t71.5 -24q150 -78 150 -366q0 -332 -216 -387q-20 -5 -31 -9v-150 q25 -7 75 -23q172 -61 172 -372zM1574 811q74 50 74 238.5t-70 253.5q-20 18 -43 18q0 -48 -6 -63q-11 -27 -52 -27q-59 0 -59 84v6h-13q-99 -43 -99 -274.5t112 -248.5q0 46 7 63q12 28 52 28q58 0 58 -83v-8h13q7 0 26 13zM1535 -147q113 20 113 263t-113 263q1 -15 1 -22 q0 -72 -59 -72q-60 0 -60 73q0 10 1 21q-112 -19 -112 -264t112 -262q-1 11 -1 19q0 75 61 75q57 0 57 -85v-9zM742 587q0 89 -21 159q-31 99 -95 106q2 -21 2 -35q0 -59 -57 -59q-59 0 -59 73q0 10 1 21q-113 -20 -113 -253.5t112 -272.5v26q0 64 59 64q42 0 52 -28 q6 -14 3 -62h13q11 0 32 15q71 50 71 246z" />
+<glyph unicode="&#x26d4;" d="M1948 582q0 -385 -269.5 -654.5t-654.5 -269.5t-654.5 269.5t-269.5 654.5t269.5 654.5t654.5 269.5t654.5 -269.5t269.5 -654.5zM1754 412v344h-1460v-344h1460z" />
+<glyph unicode="&#x26d5;" d="M1361 183q0 71 -53 71h-303q-12 0 -41 6q-133 28 -214 122t-81 220t64.5 216t175.5 129q48 17 70 17h311q71 0 71 82v450h275v-603q0 -2 -6 -25q-15 -59 -64 -108.5t-106 -49.5h-365q-151 0 -151 -101q0 -46 35.5 -72t83.5 -26h386l26 -6q115 -25 149 -129q12 -37 12 -51 v-401l194 192l82 -89l-411 -400l-415 397q33 44 81 92l194 -192v259zM690 947q-159 -132 -159 -341t159 -331v-592h-277v1572l-192 -189l-85 88l415 401l415 -401l-81 -88l-195 192v-311z" />
+<glyph unicode="&#x26d6;" d="M1980 582q0 -36 -30 -67l-854 -871q-28 -29 -72 -29t-72 29l-854 871q-30 31 -30 67t30 67l854 871q28 29 72 29t72 -29l854 -871q30 -31 30 -67zM1345 1068h-179v-754l-175 108v-79l264 -303l264 303v79l-174 -108v754zM703 96h179v754l175 -108v79l-264 303l-264 -303 v-79l174 108v-754z" />
+<glyph unicode="&#x26d7;" d="M1980 582q0 -36 -30 -67l-854 -871q-28 -29 -72 -29t-72 29l-854 871q-30 31 -30 67t30 67l854 871q28 29 72 29t72 -29l854 -871q30 -31 30 -67zM1876 582l-852 868l-852 -868l852 -868zM1166 1068h179v-754l174 108v-79l-264 -303l-264 303v79l175 -108v754zM882 96 h-179v754l-174 -108v79l264 303l264 -303v-79l-175 108v-754z" />
+<glyph unicode="&#x26d8;" d="M1875 -353h-803v189h-96v-189h-803v1072l336 422v375h467v-192h96v192h803v-1869zM1072 988v192h-96v-192h96zM1072 656v188h-96v-188h96zM1072 320v188h-96v-188h96zM1072 -16v188h-96v-188h96z" />
+<glyph unicode="&#x26d9;" d="M1072 1324h-96v192h96v-192zM1875 -353h-166v1869h166v-1869zM1072 988h-96v192h96v-192zM1072 656h-96v188h96v-188zM1072 320h-96v188h96v-188zM1072 -16h-96v188h96v-188zM339 -353h-166v1072l336 422v375h166v-433l-336 -422v-1014zM1072 -353h-96v189h96v-189z" />
+<glyph unicode="&#x26da;" d="M1948 1132h-131q-97 0 -170 69t-73 166v139h374v-374zM474 1367q0 -97 -73 -166t-170 -69h-131v374h374v-139zM1948 -342h-374v139q0 97 73 166t170 69h131v-374zM474 -342h-374v374h131q97 0 170 -69t73 -166v-139z" />
+<glyph unicode="&#x26db;" d="M1927 1315q0 -24 -15 -51l-818 -1466q-27 -49 -70 -49t-70 49l-818 1466q-15 27 -15 51q0 68 84 68h1638q84 0 84 -68zM1706 1223h-1364l682 -1222z" />
+<glyph unicode="&#x26dc;" d="M1405 1324h-96v192h96v-192zM2002 -353h-166v1869h166v-1869zM1405 988h-96v192h96v-192zM1405 656h-96v188h96v-188zM1405 320h-96v188h96v-188zM1405 -16h-96v188h96v-188zM1405 -353h-96v189h96v-189zM212 -353h-166v842l666 682v345h166v-413l-666 -682v-774z M878 -353h-166v495h166v-495z" />
+<glyph unicode="&#x26dd;" d="M1958 -352h-1868v1868h1868v-1868zM1717 1416h-1386l693 -693zM1858 -111v1386l-693 -693zM883 582l-693 693v-1386zM1717 -252l-693 693l-693 -693h1386z" />
+<glyph unicode="&#x26de;" d="M1958 -352h-1868v1868h1868v-1868zM1948 582q0 385 -269.5 654.5t-654.5 269.5q-327 0 -580 -203l1301 -1301q203 253 203 580zM100 582q0 -385 269.5 -654.5t654.5 -269.5q327 0 580 203l-1301 1301q-203 -253 -203 -580z" />
+<glyph unicode="&#x26df;" d="M1948 172h-100v37q0 98 -65 169t-162 71q-124 0 -188 -120v499h195q54 0 75 -50l101 -245q71 0 96 -9q48 -16 48 -73v-279zM1809 198q0 -81 -54 -139.5t-134 -58.5t-134 58.5t-54 139.5t54 139.5t134 58.5t134 -58.5t54 -139.5zM1398 172h-795v37q0 98 -65.5 169 t-162.5 71t-162.5 -71t-65.5 -169v-37h-47v769h1298v-769zM560 198q0 -81 -54 -139.5t-134 -58.5t-134 58.5t-54 139.5t54 139.5t134 58.5t134 -58.5t54 -139.5zM1466 775v-242h297l-92 242h-205z" />
+<glyph unicode="&#x26e0;" d="M1426 1118h-96v192h96v-192zM1426 786h-96v188h96v-188zM1426 450h-96v188h96v-188zM1979 -353h-115v1754h-976v-283l-220 -216l-598 614h1909v-1869zM1426 114h-96v188h96v-188zM1426 -223h-96v189h96v-189z" />
+<glyph unicode="&#x26e1;" d="M150 -242v1819l571 -577l-478 -432v-716h97l588 491v-490h792l-659 644l74 74l834 -813h-1819z" />
+<glyph unicode="&#x26e2;" horiz-adv-x="1326" d="M1093 578.5q147 -164.5 147 -394t-169 -398.5t-408 -169t-408 169t-169 398.5t147 394t366 188.5v447q-182 -143 -402 -238v91q370 279 440 468h52q70 -189 440 -468v-91q-220 95 -402 238v-447q219 -24 366 -188.5zM1120 194q0 189 -134 323t-323 134t-323 -134 t-134 -323t134 -323t323 -134t323 134t134 323zM820 194q0 -65 -46 -111t-111 -46t-111 46t-46 111t46 111t111 46t111 -46t46 -111z" />
+<glyph unicode="&#x26e3;" d="M1640 1184q0 -68 -47.5 -116t-115.5 -48t-116 48t-48 116t48 116t116 48t115.5 -48t47.5 -116zM687.5 1298.5q47.5 -49.5 47.5 -117.5t-46.5 -114.5t-115.5 -46.5t-117 47.5t-48 116t48.5 116.5t116 48t115 -49.5zM1661 322q0 -261 -187 -449t-449 -188t-450 187 t-188 440.5t157.5 432t400.5 205.5v561h163v-558q0 -5 15 -5h4q303 -56 447 -306q87 -151 87 -320zM1358 -13q139 138 139 332.5t-139.5 335t-332.5 140.5t-333.5 -140.5t-140.5 -332.5t140.5 -332.5t334 -140.5t332.5 138z" />
+<glyph unicode="&#x26e4;" d="M1948 789l-571 -415l218 -671l-571 415l-571 -415l218 671l-571 415h706l218 672l218 -672h706zM1579 669h-298l57 -175zM1116 789l-92 283l-92 -283h184zM1236 420l-81 249h-262l-81 -249l212 -154zM1367 17l-92 283l-149 -108zM767 669h-298l241 -175zM922 192 l-149 108l-92 -283z" />
+<glyph unicode="&#x26e5;" d="M1331 514l-102 -73l-205 631l-85 -263h-127l212 652zM1948 789l-805 -585l-102 74l538 391h-278l-39 120h686zM1595 -297l-805 585l39 119l538 -390l-86 264l102 74zM1134 669h-665l225 -163l-39 -120l-555 403h995zM1008 106l-555 -403l307 946h126l-205 -632l225 163z " />
+<glyph unicode="&#x26e6;" d="M1948 789l-555 -403l-39 120l225 163h-665l39 120h995zM1236 809h-127l-85 263l-205 -631l-102 73l307 947zM1595 -297l-555 403l102 74l225 -163l-205 632h126zM1007 278l-102 -74l-805 585h686l-39 -120h-278zM1258 288l-805 -585l212 652l102 -74l-86 -264l538 390z " />
+<glyph unicode="&#x26e7;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x26e8;" horiz-adv-x="1566" d="M1454 371q0 -206 -229.5 -433t-441.5 -268q-212 41 -441.5 268t-229.5 433v1051h1342v-1051zM1339 371v936h-1112v-936q0 -161 193 -348.5t363 -234.5q170 47 363 234.5t193 348.5zM1222 619h-342v-343h-194v342h-342v178h342v343h193v-341h343v-179z" />
+<glyph unicode="&#x26e9;" d="M2016 1205h-323v-1541h-204v950h-930v-950h-202v1539h-325v181h1984v-179zM1488 800v404h-928v-404h928z" />
+<glyph unicode="&#x26ea;" d="M1976 230h-111v-520h-379v546l-464 355l-464 -355v-546h-377v518h-109v51l873 616v285h-231v156h230v202h155v-199h231v-157h-230v-287l876 -616v-49zM1254 -290h-460v371q0 80 73 137.5t155.5 57.5t157 -57.5t74.5 -137.5v-371z" />
+<glyph unicode="&#x26eb;" d="M1886 -273h-180v1102h-386v450h-590v-448h-386v-1104h-182v1275h386v449h952v-447h386v-1277z" />
+<glyph unicode="&#x26ec;" d="M1206 1283q75 -75 75 -180.5t-76.5 -180t-180.5 -74.5t-180.5 74.5t-76.5 180t75 180.5t182 75t182 -75zM1737.5 384.5q75.5 -75.5 75.5 -180t-75 -179.5t-180 -75t-180 76t-75 182t74 179t179.5 73t181 -75.5zM672.5 385.5q76.5 -74.5 76.5 -178.5t-78.5 -180.5 t-181.5 -76.5t-178.5 75.5t-75.5 179.5t75.5 179.5t180.5 75.5t181.5 -74.5z" />
+<glyph unicode="&#x26ed;" horiz-adv-x="1610" d="M1570 508h-252q-24 -132 -98 -237l176 -176l-104 -105l-177 177q-113 -77 -236 -98v-252h-148v252q-123 21 -236 98l-177 -177l-105 105l177 176q-74 105 -98 237h-252v148h252q24 132 98 237l-177 176l105 105l177 -177q113 77 236 98v252h148v-252q123 -21 236 -98 l177 177l104 -105l-176 -176q74 -105 98 -237h252v-148zM1074 313q111 111 111 269.5t-110.5 269t-269.5 110.5t-269.5 -110.5t-110.5 -269t111 -269.5t269 -111t269 111z" />
+<glyph unicode="&#x26ee;" d="M1937 508h-400q-24 -132 -98 -237l176 -176l-104 -105l-177 177q-113 -77 -236 -98v-252h-148v252q-123 21 -236 98l-177 -177l-105 105l177 176q-74 105 -98 237h-252v-304h-148v452h400q24 132 98 237l-177 176l105 105l177 -177q113 77 236 98v252h148v-252 q123 -21 236 -98l177 177l104 -105l-176 -176q74 -105 98 -237h252v304h148v-452zM1293 313q111 111 111 269.5t-110.5 269t-269.5 110.5t-269.5 -110.5t-110.5 -269t111 -269.5t269 -111t269 111z" />
+<glyph unicode="&#x26ef;" horiz-adv-x="1610" d="M1570 508h-252q-24 -132 -98 -237l176 -176l-104 -105l-177 177q-113 -77 -236 -98v-252h-148v252q-123 21 -236 98l-177 -177l-105 105l177 176q-74 105 -98 237h-252v148h252q24 132 98 237l-177 176l105 105l177 -177q113 77 236 98v252h148v-252q123 -21 236 -98 l177 177l104 -105l-176 -176q74 -105 98 -237h252v-148zM1074 313q111 111 111 269.5t-110.5 269t-269.5 110.5t-269.5 -110.5t-110.5 -269t111 -269.5t269 -111t269 111zM933 710q52 -52 52 -127.5t-52.5 -128t-127.5 -52.5t-127.5 52.5t-52.5 128t52 127.5t128 52t128 -52 z" />
+<glyph unicode="&#x26f0;" d="M1997 -224h-1590q26 86 91 251q17 35 72 108t71 112q3 52 10 129l62 207l22 81q22 79 70 142.5t69 119.5q4 11 39 158q15 62 70 189.5t68 199.5l51 60q66 -34 176.5 -182.5t156.5 -242.5q28 -71 90 -211l122 -212q101 -190 140 -313q16 -90 62 -266q17 -51 74 -158.5 t74 -171.5zM883 999q-13 -43 -48 -124q-32 -40 -86 -127q-6 -12 -50 -159q-24 -69 -62 -209q-3 -17 -9 -125q-51 -71 -142 -220q-23 -46 -51.5 -135t-43.5 -124h-340q31 70 82 215q8 62 33 183q35 122 171 297q9 56 43.5 153.5t41.5 128t19 72.5q8 21 51 90.5t68 115.5 t39 103l54 48q90 -34 230 -183z" />
+<glyph unicode="&#x26f1;" d="M1982 -272h-1916v179h718l178 649q-24 9 -68 9q-115 0 -181 -33q-62 85 -158.5 139.5t-198 54.5t-168.5 -31q29 123 95.5 250t186.5 218t244.5 125t245 34t199.5 -19q18 63 42 137q19 32 54 32q69 0 69 -59q0 -10 -35 -142q255 -95 415 -272q182 -200 182 -451 q0 -147 -61 -291q-131 160 -348 160q-110 0 -186 -41q-61 92 -196 156l-174 -623h1061v-181zM1760 473l4 54q0 207 -118 360t-319 238q100 -178 100 -373q0 -107 -25 -219q71 5 100 5q138 0 258 -65zM1311 770q0 209 -120 402q-134 -75 -240.5 -207t-141.5 -276q40 6 101 6 q212 0 372 -135q29 115 29 210zM943 1210q-407 0 -590 -359q187 -6 342 -128q40 148 137.5 280t225.5 199q-101 8 -115 8z" />
+<glyph unicode="&#x26f2;" d="M1927 894h-101v142q0 127 -65 236q-74 125 -191 137v94h13q38 0 95 -22q201 -78 243 -377q6 -42 6 -43v-167zM1399 1409q-10 2 -20 2q-60 0 -111.5 -77.5t-51.5 -149.5q0 -12 2 -23h-105v17q0 123 83 223.5t203 101.5v-94zM931 1161h-101q1 6 1 19q0 75 -55.5 152 t-127.5 77v94h8q96 0 172.5 -79.5t96.5 -177.5l6 -28v-57zM1120 847l173 -2v-176h-538v176q182 0 181 1v180h176v-180q1 1 8 1zM222 1045v-151h-101v170q0 13 4.5 37.5t5.5 33.5q10 115 98 232t196 129q29 3 49 7l4 -93q-115 -10 -185.5 -125.5t-70.5 -239.5zM1927 520 q0 -17 -26 -52q-76 -101 -190 -146q-47 -19 -234 -60q-2 -2 -2 -5l66 -447h229v-157h-1492v157h225l70 446l-117 28q-157 40 -248 114q-17 14 -52 59t-35 60v72h1806v-69z" />
+<glyph unicode="&#x26f3;" d="M1087 837v-700q0 -18 -32.5 -32.5t-56.5 -14.5t-53.5 17.5t-29.5 42.5v1406l873 -719h-701zM1968 86q0 -224 -305 -353q-239 -102 -502 -102h-274q-19 0 -56 4.5t-52 5.5q-237 12 -441 114q-258 128 -258 331q0 150 192 271q156 100 331 128q54 6 154 22q1 -140 5 -419 q1 -21 20 -56q29 -53 92.5 -85.5t109.5 -32.5t94 10t107.5 64t59.5 104v415q14 -4 43 -6q203 -13 416 -117q264 -128 264 -298z" />
+<glyph unicode="&#x26f4;" d="M2005 494q0 -4 -8 -46q-58 -304 -192 -515h-1483q-209 264 -279 599h221v80h140l63 421h301v281h258v-281h717l48 -421h94v-98h120v-20zM1366 853v-218h261l-23 218h-238zM1223 635v218h-238v-218h238zM844 635v218h-232l-29 -218h261z" />
+<glyph unicode="&#x26f5;" d="M1936 204q0 -3 -35 -61q-155 -256 -345 -479h-868q-5 0 -69 52q-291 235 -503 481v90h903v1283l906 -1126h-793v-155h804v-85zM922 444h-810l810 1030v-1030zM1133 547h562l-562 718v-718zM812 547v633l-477 -633h477zM745 -229h751q195 229 291 409h-1498 q131 -157 369 -343q85 -66 87 -66z" />
+<glyph unicode="&#x26f6;" d="M1966 861h-168v399q0 36 -34.5 66t-70.5 30h-390v168h448q71 0 143 -65.5t72 -135.5v-462zM745 1356h-390q-36 0 -70.5 -30t-34.5 -66v-399h-168v462q0 70 72 135.5t143 65.5h448v-168zM1966 -159q0 -70 -72 -135.5t-143 -65.5h-448v168h390q36 0 70.5 30t34.5 66v399 h168v-462zM745 -360h-448q-71 0 -143 65.5t-72 135.5v462h168v-399q0 -36 34.5 -66t70.5 -30h390v-168z" />
+<glyph unicode="&#x26f7;" d="M524 1485q65 -65 65 -159.5t-62.5 -156.5t-157 -62t-159.5 64.5t-65 156t65.5 157t157 65.5t156.5 -65zM77 590l137 5l235 324q32 44 91 135q8 29 33 82q92 133 190 133q65 0 115 -32l290 -207q92 -62 119 -88q61 -60 61 -123.5t-81 -174.5q6 -3 5 -3t341 14l24 62 q16 35 51.5 35t54.5 -45t19 -86.5t-18.5 -82.5t-51 -41t-51.5 29.5t-20 60.5q-16 5 -182.5 5t-220.5 -20q-27 -10 -59.5 -64.5t-32.5 -55.5l380 -173l412 230q20 -25 53 -83l-867 -483q-368 -196 -594 -281q-37 -14 -120 -14t-160 35q9 16 18 54q65 -8 110 -8t97 18t126 52 l397 195q34 13 91 54q13 16 26.5 54t17.5 47v12q-29 23 -123.5 58.5t-132.5 63.5q-64 48 -64 122q0 54 77 152l-377 -9q-16 -1 -47 -6q-14 -10 -42 -27q-31 -14 -75.5 -14t-93.5 17t-54 17h-104v55zM539 608q70 0 198 8.5t179 9.5q11 15 27 44l-267 181l-177 -243h40z" />
+<glyph unicode="&#x26f8;" d="M1993 -309h-1938v36q0 54 56 148.5t108 94.5h380v193h-8q-49 0 -137 10q-198 54 -198 252q0 232 217 322q79 33 315 76q33 3 65.5 7.5t61.5 24.5q19 14 19 51v512h784v-1043q0 -62 -53.5 -130t-113.5 -68v-207h283q14 0 53.5 -26.5t72.5 -95.5t33 -110v-47zM1360 -29v195 h-568v-195h568z" />
+<glyph unicode="&#x26f9;" d="M1060.5 1458q62.5 -64 62.5 -152t-63.5 -152.5t-150 -64.5t-151 65t-64.5 151t64.5 151.5t152 65.5t150 -64zM1754 662q57 -57 57 -134.5t-59 -136t-136.5 -58.5t-133.5 57t-56 138t54.5 136t135.5 55t138 -57zM1930 -299h-697q-115 0 -152 89q-12 28 -45 141l-98 339 h-54q-36 -112 -102 -337q-31 -120 -55 -158q-45 -74 -139 -74h-470v79h358l200 687v312l-353 -418q-106 43 -106 141q0 39 39 85l112 132l128 160q95 114 145.5 144t114.5 30h975q-51 -191 -125 -191h-467v-387l210 -695h581v-79z" />
+<glyph unicode="&#x26fa;" d="M1972 611l-101 -866l-654 46v579l-520 32v-574l-621 41l945 1572l949 -814q2 -2 2 -10v-6zM1872 576l-747 673l663 -1322z" />
+<glyph unicode="&#x26fb;" d="M1525.5 -203q-223.5 -154 -501 -154t-506 155t-320.5 413q142 50 232 149.5t90 238t-92 239.5t-230 146q98 261 322 414.5t502 153.5t507 -155.5t321 -412.5q-137 -39 -229.5 -144t-92.5 -243.5t90.5 -239t231.5 -146.5q-101 -260 -324.5 -414zM1024 1395 q-194 0 -355 -89.5t-261 -254.5q108 -49 190.5 -188.5t82.5 -264.5t-81 -263.5t-192 -191.5q90 -160 257.5 -251.5t358.5 -91.5t352 89t259 254q-115 63 -191.5 193t-76.5 261q0 262 241 436q10 7 28 24q-217 338 -612 338z" />
+<glyph unicode="&#x26fc;" d="M1454 726h-862v167h336v598h192v-597h334v-168zM2030 -308h-862v167h332v603h193v-601h337v-169zM877 -308h-859v167h337v603h186v-603h336v-167z" />
+<glyph unicode="&#x26fd;" d="M1970 602q4 -172 4 -317.5t-35 -225.5q-53 -122 -202 -122q-115 0 -169 77q-41 59 -55 170t-14 126v269q0 295 -85 295h-102v-1063h333v-134h-1571v132h310v1400l7 29q18 78 84.5 154t139.5 76h465q60 0 122 -60q85 -83 102 -175q7 -36 7 -27v-182q68 -1 196 -24 q69 -26 95 -100q37 -106 43 -267v-269q0 -166 29 -241q21 -53 67 -53q87 0 87 187q0 405 -34 679q-7 59 -44.5 115.5t-82.5 78.5t-296 106l47 132q94 -29 276 -98q167 -74 223 -218q35 -93 43 -315q2 -56 4 -81zM1114 898v241h-533v-241h533z" />
+<glyph unicode="&#x26fe;" d="M1973 -354h-1898v1900h1898v-1900zM1869 757q0 134 -69 220t-200 86h-115v137h-1066v-559q0 -130 106 -244.5t237 -145.5q42 -10 112 -10h177q101 0 199.5 35t138 79t63.5 100h165q9 0 38 6q214 45 214 296zM1853 131q0 66 -113 104l-169 40q-134 -183 -575 -183 q-524 0 -604 183l-146 -40q-90 -34 -90 -108.5t126 -132.5q268 -123 731.5 -123t729.5 132q110 55 110 128zM1711 759q0 -142 -107 -142h-118v283h118q53 0 80 -42.5t27 -98.5z" />
+<glyph unicode="&#x26ff;" d="M1760 323q-164 0 -473.5 97.5t-473.5 97.5q-255 0 -487 -208v-720h-116v1984h116v-197q242 197 484 197q162 0 468 -101t468 -101q36 0 92 5v-1051q-45 -3 -78 -3zM1722 1256q-154 5 -452 103.5t-447 98.5t-275 -70q-78 -43 -222 -161v-177q225 174 487 174 q164 0 462 -93.5t447 -100.5v226zM1722 666q-154 5 -452 103.5t-447 98.5t-275 -70q-78 -43 -222 -161v-177q225 174 487 174q164 0 462 -93.5t447 -100.5v226z" />
+<glyph unicode="&#x2700;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2701;" horiz-adv-x="2051" d="M553 442q-42 0 -42 -36q0 -10 3 -21q8 -34 8 -59q0 -81 -55 -130t-141 -49t-156 66t-70 150t55 130t135 46q40 0 122 -20.5t122 -20.5q143 0 260 125q-26 58 -92 116q-102 90 -258 129q-47 10 -137 41q-139 66 -139 195q0 74 51 121t132 47t153.5 -67t72.5 -154 q0 -37 -19.5 -79.5t-19.5 -47.5q0 -28 137 -78q87 -32 228 -168l645 37q14 1 29 1q185 0 374 -130l-850 -109l199 -229l-190 -17l-207 234l-291 -23h-59zM225 1092q0 -58 63 -103t117.5 -45t81.5 35.5t27 88.5t-55.5 101t-114.5 48q-119 0 -119 -125zM421.5 240.5 q38.5 35.5 38.5 97t-50.5 102.5t-112 41t-100 -32.5t-38.5 -90.5t52.5 -105.5t112 -47.5t98 35.5z" />
+<glyph unicode="&#x2702;" horiz-adv-x="2027" d="M1728 340q-86 0 -225 51l-612 225q-8 -3 -132.5 -45.5t-209.5 -52.5q-48 -5 -48 -37q0 -6 16.5 -45.5t16.5 -70.5q0 -87 -61.5 -143t-151 -56t-152.5 50t-63 140q0 142 135 199q55 24 173 24q18 0 36 -1h25q128 0 194 38q72 42 84 97q-26 68 -100 101q-70 32 -145 32h-9 l-129 -4h-15q-88 0 -146 32q-109 60 -109 164.5t61.5 158.5t151 54t152.5 -55t63 -135q0 -32 -15.5 -74.5t-15.5 -48.5q0 -32 78 -37q116 -8 316 -94l618 231q150 56 227 56q101 0 191 -84l-774 -297l774 -289q-73 -84 -199 -84zM427 950q35 41 35 103.5t-46 99.5t-108.5 37 t-102 -39.5t-39.5 -100.5t50.5 -101t113 -40t97.5 41zM424 268.5q43 39.5 43 102t-37.5 101t-101.5 38.5t-111 -46.5t-47 -108t44.5 -94t105.5 -32.5t104 39.5z" />
+<glyph unicode="&#x2703;" horiz-adv-x="2051" d="M538 496q0 -5 19.5 -47.5t19.5 -79.5q0 -88 -72.5 -155t-153.5 -67t-132 47t-51 121q0 129 139 195q30 14 137 41q156 39 258 129q65 57 92 117q-117 125 -260 125q-40 0 -122 -20.5t-122 -20.5q-80 0 -135 46t-55 130t70 149.5t156 65.5t141 -48.5t55 -129.5 q0 -26 -8 -60q-3 -11 -3 -21q0 -36 42 -36h59l291 -23l207 234l190 -17l-199 -229l850 -108q-188 -130 -374 -130q-14 0 -29 1l-645 36q-141 -136 -228 -168l-79 -28q-58 -24 -58 -49zM409.5 979.5q50.5 41.5 50.5 103t-38.5 96.5t-98 35t-112 -47.5t-52.5 -105t38.5 -90.5 t100 -33t112 41.5zM458.5 250.5q55.5 47.5 55.5 100.5t-27 88.5t-81.5 35.5t-117.5 -44.5t-63 -102.5q0 -125 119 -125q59 0 114.5 47.5z" />
+<glyph unicode="&#x2704;" horiz-adv-x="2064" d="M1665 154q-139 0 -310 114l-370 246l-45 -27q-72 -43 -88.5 -43t-58 9.5t-78 9.5t-72.5 -14q61 -88 61 -196.5t-90.5 -180.5t-220 -72t-208.5 85t-79 226q0 166 135 248q102 62 303 62h19h7q148 0 148 84q0 73 -147 81q-108 6 -179 15t-126 35q-166 78 -166 274 q0 135 82.5 221t209.5 86t218.5 -76.5t91.5 -195.5q0 -89 -59 -176q25 -11 60.5 -11t98.5 13.5t78 13.5q48 0 103 -55l313 182q222 129 375 129q195 0 293 -147l-668 -396l655 -419q-45 -55 -128 -90t-158 -35zM1677 203q95 0 192 67l-626 400l-211 -129l301 -199 q210 -139 344 -139zM1898 1112q-103 72 -214.5 72t-340.5 -133l-579 -336v-15q0 -97 -92 -124q-36 -10 -146.5 -12.5t-166 -10.5t-101.5 -37q-105 -66 -105 -213q0 -114 67.5 -183t173.5 -69t175.5 61.5t69.5 156t-47 151.5q-15 15 -15 29q0 29 51 46q43 14 114 14h26 q53 -2 77 -2q16 0 20 1q9 2 52 27zM929 901q-22 27 -50.5 27t-83 -10.5t-72.5 -10.5q-150 0 -150 60q0 6 31 50.5t31 115.5q0 102 -71 166.5t-175.5 64.5t-172 -70.5t-67.5 -175.5q0 -167 131 -229q63 -30 178 -35l86 -4q71 -3 106 -12q62 -14 89 -52zM1055 790.5 q26 -30.5 26 -70.5t-24.5 -76t-65.5 -36t-66.5 31.5t-25.5 75.5t24.5 75t65 31t66.5 -30.5zM519.5 1255q53.5 -52 53.5 -130t-52.5 -131.5t-130 -53.5t-129.5 56t-52 130.5t55 127.5t128.5 53t127 -52zM524 416q53 -55 53 -129t-52 -127.5t-127.5 -53.5t-130 53t-54.5 130 t53.5 129.5t129 52.5t128.5 -55zM989 784q-51 0 -51 -58t48 -58t48 58t-45 58zM493.5 1035q36.5 38 36.5 89.5t-36 91t-87.5 39.5t-90 -35.5t-38.5 -89.5t35.5 -93.5t89.5 -39.5t90.5 38zM495.5 193.5q38.5 35.5 38.5 87.5t-33 93.5t-86.5 41.5t-93 -35t-39.5 -89t35.5 -94 t87.5 -40t90.5 35.5z" />
+<glyph unicode="&#x2705;" horiz-adv-x="1787" d="M1687 1239q0 -40 -14 -60l-184 -200l-498 -524l-266 -256q-237 -228 -297 -228h-2l-47 4q-43 4 -140 82q-43 34 -82 80q-18 21 -18 76l-29 248q-12 105 -12 184q0 27 2 51q5 95 10 107.5t52 68.5t67 76t62 33.5t83 13.5t70 -20q29 -25 29 -62.5t20 -154.5l19 -111 q4 -35 26 -90q24 -27 56 -27q15 0 43 27l747 727l158 131q35 29 80.5 29t55 -12t9.5 -60v-133zM1587 1232v90l-136 -113q-42 -38 -292 -282l-418 -409q-90 -88 -147 -88q-78 0 -131 61q-31 36 -45 110.5t-23.5 132.5t-21.5 161q-44 -3 -67 -13q-9 -4 -55.5 -58.5 t-47.5 -62.5q-5 -31 -5 -110.5t41 -431.5l-1 -23q105 -116 149 -121l47 -4q2 0 18 14q284 253 468 441l495 521z" />
+<glyph unicode="&#x2706;" d="M1416 1125q0 -32 -26 -86q-68 -141 -164 -141q-35 0 -100 32q156 111 187 297q103 -49 103 -102zM1998 582q0 -406 -284 -690t-690 -284q-173 0 -328 96q-176 109 -176 272q0 35 18 72l37 72q-30 34 -54 69q28 293 170.5 585t355.5 493q34 3 50 3q92 0 187 -28 q-42 -178 -191 -296q-25 13 -41 13q-91 0 -214 -252q-88 -180 -88 -272q0 -69 53 -85q1 -14 1 -41q0 -179 -117 -291q-28 20 -60 49q-29 -27 -29 -70q0 -131 154 -216q130 -73 272 -73q364 0 619 255t255 619t-255 619t-619 255t-619 -255t-255 -619q0 -338 225 -587 q-23 -13 -38 -13q-88 0 -172 159q-115 217 -115 441q0 406 284 690t690 284t690 -284t284 -690zM956 185q0 -61 -39.5 -139.5t-93.5 -78.5q-32 0 -105 36q123 124 123 295q0 16 -1 33q116 -56 116 -146z" />
+<glyph unicode="&#x2707;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1024 920q-107 0 -190 -55l64 483q48 16 126 16t126 -16l64 -483 q-83 55 -190 55zM1750 308q-10 -50 -49 -117t-77 -101l-450 186q90 44 143 136q48 84 48 173q0 10 -1 20zM1288 582q0 -109 -77.5 -186.5t-186.5 -77.5t-186.5 77.5t-77.5 186.5t77.5 186.5t186.5 77.5t186.5 -77.5t77.5 -186.5zM874 276l-450 -186q-38 34 -77 101t-49 117 l386 297q-1 -10 -1 -20q0 -89 48 -173q53 -92 143 -136z" />
+<glyph unicode="&#x2708;" horiz-adv-x="1940" d="M1123 1053l111 2q66 0 66 -42q0 -33 -41 -43l-67 -6l182 -241q156 0 324.5 -17.5t168.5 -82.5t-168 -82.5t-325 -17.5l-182 -241l67 -6q41 -10 41 -43q0 -42 -66 -42l-111 2l-120 -164l89 -15q19 -7 19 -32q0 -39 -71 -39q-32 0 -106 -5q-57 -81 -140 -182 q-24 -18 -66 -18q-4 0 -82 1q271 609 271 727q0 47 -53 61q-10 3 -90 10l-381 32l-194 -243l-126 -20l92 282l-82 35l82 35l-92 282l126 -20l194 -243l381 32q80 7 90 10q53 14 53 61q0 118 -271 727l82 1q42 0 66 -18q1 -1 140 -182q74 -5 106 -5q71 0 71 -39 q0 -25 -19 -32l-89 -15z" />
+<glyph unicode="&#x2709;" horiz-adv-x="1470" d="M1370 283h-1270v850h1270v-850zM1331 365v688l-426 -320l2 -22l-2 -25zM731 881q121 0 164 -113l436 332h-1194l434 -332q17 48 63 80.5t97 32.5zM897 649q-46 -114 -163 -114t-163 114l-430 -327h1186zM563 686l-2 25l2 22l-426 320v-688z" />
+<glyph unicode="&#x270a;" horiz-adv-x="1637" d="M556 1059l-16 72q0 75 51.5 124.5t126 49.5t169.5 -56q62 117 134 117q141 0 206 -99q37 -57 78 -227q115 -15 147.5 -36.5t58.5 -144t26 -182.5q0 -345 -143 -537q-101 -136 -261.5 -222t-325.5 -86q-311 0 -509 187t-198 497q0 79 48 133q28 30 83.5 60.5t55.5 45.5 q0 21 -9.5 62.5t-9.5 70t40 80.5t76.5 70.5t91.5 27.5l78 -18q2 6 2 11zM1054 1279q-44 0 -76.5 -37t-32.5 -70t22 -89q129 -5 256 -28q-30 113 -48 147q-42 77 -121 77zM724 1223q-101 0 -101 -89q0 -49 37 -127q40 87 117 87q18 0 52 -2t49 -2q-32 71 -55 95 q-36 38 -99 38zM1007 684q-138 11 -246 59q52 -101 86 -191q60 77 160 132zM1455 677q0 155 -53 258q-157 44 -644 76q-41 -53 -41 -91q0 -4 1 -7q42 -149 404 -149q37 0 123 2l39 -61q-197 -54 -295 -128q-137 -103 -137 -275q0 -95 38 -220l-41 -22q-101 135 -101 286 q-20 -7 -43.5 -7t-36.5 5q3 -21 3 -40q0 -165 -137 -165q-90 0 -190 98t-100 187q0 18 5 18q25 0 117.5 -110.5t167.5 -110.5q55 0 55 83q0 54 -122 194t-171 140t-81.5 -38t-32.5 -84q0 -275 174.5 -438.5t450.5 -163.5q144 0 289 78t233 197q126 171 126 488zM465 974 q-9 0 -17 -3q-97 -37 -97 -107q0 -98 169 -300q118 -142 178 -142q76 0 84 73q-58 149 -129 277q-113 202 -188 202z" />
+<glyph unicode="&#x270b;" horiz-adv-x="1557" d="M1457 485q0 -30 -29 -64l-55 -63l-67 -127q-152 -285 -280 -379q-42 -31 -173 -84.5t-212 -53.5q-151 0 -244 32q-1 0 -68 31q-133 61 -185 168q-44 90 -44 249v268q0 5 11 246q0 88 15 263q9 53 53 127t88 74q10 0 28 -8q18 75 33 108q28 56 79 76q10 4 56 2 q30 71 66 95t113 24q33 0 67.5 -43t48.5 -51l52 10q123 -43 142 -148q5 -25 9 -186l7 -284q6 -141 21 -244q2 -11 44 -143q18 9 28 34l19 47q30 62 97.5 117t129.5 55q26 0 76.5 -23t62 -44t11.5 -81zM672 1257q0 23 -10 63.5t-11 48.5q-33 13 -49.5 13t-39 -24t-22.5 -44 q0 3 1 3q2 0 16 -63q26 -118 28 -297l-1 45q-1 0 -1 -346l89 8v593zM497 1194q0 8 -19 53q-40 19 -49 19q-24 0 -41 -30t-17 -56v1q1 0 16 -145q16 -155 27 -410l83 18v550zM763 1024l-7 -114v-259q68 -27 68 -56q0 -20 -15 -20q-22 0 -63 12.5t-63 12.5q-248 0 -400 -123 l-32 -26l-22 34q4 20 44 57l59 49q1 3 1 8q0 270 -29 483l-18 12q-69 -1 -90 -198q-6 -128 -13 -256q-5 -44 -5 -49v-392q0 -35 11 -91q25 -128 80.5 -188.5t181.5 -92.5q64 -16 143.5 -16t163.5 28l149 57q20 6 58 24q92 57 179 182q44 64 131 223q29 53 131 175 q-44 50 -85 50q-101 0 -168 -111l-101 -191h-17q-17 0 -32 11q-30 22 -80 214q-26 99 -28 167l-15 511q-4 138 -66 138q-68 0 -56 -1zM646 91l6 -87q-15 -7 -45 -19l-31 131l67 142q38 66 109 114q15 -17 39 -55q-145 -160 -145 -226z" />
+<glyph unicode="&#x270c;" horiz-adv-x="1197" d="M1054 762q43 -79 43 -201.5t-34 -229t-93 -173.5q-161 -181 -388 -181t-341 125q-55 60 -98 164.5t-43 173t38 112.5q35 42 90 42h5q-16 62 -16 101t45.5 89t83.5 50q15 0 86 -19q-9 37 -79.5 230t-70.5 274q0 49 37 87t86 38q68 0 132 -137q1 -2 73 -199l70 -190l88 229 q48 124 68 162q58 104 122 104q51 0 79 -37t28 -100.5t-45 -199.5l-86 -251l68 -20q36 -14 52 -43zM860 842q137 384 137 437.5t-45 53.5q-38 0 -76 -86l-139 -387zM395 1370q-43 0 -43 -55q0 -102 137 -451q14 17 29 15l100 -11l-133 381q-42 121 -90 121zM718 563l-139 27 l47 -113zM1034 561q0 149 -94 185t-396 61q-16 -28 -16 -53q0 -63 78 -101q48 -23 142 -27h-1q0 1 148 1l16 -33l-8 -19q-91 -17 -150 -71q-135 -123 -135 -219q0 -26 15.5 -75t17.5 -60l-19 -19q-81 70 -86 184h-47q2 -17 2 -38.5t-8 -36.5q-28 -52 -89.5 -52t-129.5 62 q-35 32 -74 110v46l17 -3q17 -39 68.5 -87t88.5 -48q18 0 40 12t22 32t-119 175q-34 45 -64.5 45t-61 -30.5t-30.5 -55.5q0 -52 54 -167.5t110 -157.5q82 -62 232 -62q228 0 352.5 147.5t124.5 354.5zM569 432q0 35 -117 234q-30 50 -48 69.5t-60 26.5q-62 -44 -62 -74 q0 -50 94 -174.5t143.5 -124.5t49.5 43z" />
+<glyph unicode="&#x270d;" horiz-adv-x="1806" d="M914 282l-249 -16q-102 0 -254 47l-110 -120l-152 -58q-37 -14 -43 -14q-11 0 -11 8q0 5 5 14l100 213l19 23l-25 27l64 167q9 38 30 113l60 168q118 116 203.5 185.5t187.5 111.5l125 -72l160 178q33 37 63.5 37t55 -34.5t24.5 -73.5q0 -18 -31 -53l-135 -154l170 -111 q76 -49 154 -51l24 43l307 -20l41 -146l9 -209l-54 -286l-303 -6l-28 108l-187 -39l-188 19q-14 1 -32 1zM1591 262q33 123 33 272.5t-49 260.5h-177l5 -31l20 -209q0 -141 -45 -311zM1386 545q0 100 -43 229l-133 12l-246 150l-116 -131l2 -41v-8q0 -33 -15 -78l-90 -109 l27 -2h5q42 0 165 49q-11 -38 -66 -77l-229 -11q-63 -3 -76.5 -6.5t-73.5 -32.5q-78 -37 -78 -104q0 -29 23 -39q6 -3 45.5 -9.5t48.5 -6.5q37 0 37 49q0 19 -7 54t-5 40q19 0 30 -29t11 -53.5t-13.5 -41.5t-13.5 -19q0 -21 80 -21q19 -2 52 -2t116 15.5t119 17.5l35 -6 q111 -19 161 -19t226 47q22 132 22 183zM696 565q43 0 80 74q32 65 32 109q0 6 -1 12l-162 -189q24 -6 51 -6zM739 1098q-57 0 -190 -121l-115 -105q-43 -39 -53 -52t-25 -56l-53 -154l39 -20l14 -62l-47 -114h33q77 72 112 151l45 103l328 370l-44 35q-31 25 -44 25z M323 539q0 35 -26 51l-72 -176l25 -2h6q67 0 67 127zM174 244q-19 -34 -19 -53t16 -19t99 37q18 8 18 21t-24 47t-37 34q-6 0 -21 -10z" />
+<glyph unicode="&#x270e;" horiz-adv-x="1922" d="M1822 158q0 -56 -95 -56h-3l-555 7q-58 7 -117 43l-868 522l-84 313l166 277l305 51l844 -508q50 -30 63.5 -40t28.5 -38l289 -504q26 -57 26 -67zM1437 676v65l-817 490l58 -215l745 -447q14 48 14 107zM1652 195q39 51 39 83t-49 115l-153 260q-14 -306 -291 -485 l383 -10q47 6 71 37zM1411 522l-756 455l-129 -213l758 -455q99 92 127 213zM624 1022l-69 242l-256 -45l-142 -236l68 -266l248 53zM1249 274l-748 449l-227 -43l850 -510q67 40 125 104zM483 1071q0 -72 -47 -132t-92 -60q-64 0 -64 73q0 57 46.5 123t101.5 66 q24 0 39.5 -22t15.5 -48z" />
+<glyph unicode="&#x270f;" horiz-adv-x="1969" d="M1794 791q75 -50 75 -83.5t-75 -86.5l-420 -295q-46 -33 -55.5 -37t-51.5 -4h-956l-211 245v369l211 227h932q43 0 59 -8t72 -45zM1691 616q11 48 11 94t-19 87l-326 221l-4 -4q76 -174 76 -309.5t-61 -311.5l4 -4zM1339 909q-30 93 -72 166h-858l142 -166h788zM1355 575 q15 51 15 121t-15 148h-804v-269h804zM1345 510h-805l-143 -162h899q26 60 49 162zM495 545v338l-166 192l-174 -192v-326l174 -209zM313 881q80 0 80 -161t-86 -161q-70 0 -70 161t76 161z" />
+<glyph unicode="&#x2710;" horiz-adv-x="1922" d="M1822 1260q0 -11 -26 -68l-289 -504q-18 -34 -92 -78l-844 -508l-305 52l-166 276l84 313l868 523q43 26 57.5 31.5t59.5 11.5l555 6h3q95 0 95 -55zM1642 1024q49 83 49 115.5t-39 83.5q-24 31 -71 37h-35l-348 -11q277 -179 291 -485zM1411 895q-28 121 -127 213 l-758 -455l129 -213zM1249 1143q-58 64 -125 104l-850 -510l227 -43zM1437 741q0 59 -14 107l-745 -447l-58 -215l817 490v65zM624 395l-151 252l-248 53l-68 -266l142 -235l256 -45zM483 346q0 -26 -15.5 -48t-39.5 -22q-55 0 -101.5 66t-46.5 123q0 74 64 74 q44 0 91.5 -60.5t47.5 -132.5z" />
+<glyph unicode="&#x2711;" horiz-adv-x="1990" d="M1140 285q-63 0 -107 41q-28 25 -69 94q-70 117 -141 117q-113 0 -141 -138h-301q-66 0 -92.5 5t-67.5 36q-121 90 -121 274.5t145 270.5q52 31 148 31h289q36 -135 137 -135q67 0 114 65l77 122q53 65 137 65q107 0 436 -201q216 -132 307 -223q-100 -103 -334 -244 q-297 -180 -416 -180zM1210 543q-66 0 -103.5 48t-37.5 117t37.5 117.5t105.5 48.5q93 0 127 -131l195 -8v152q-271 172 -373 172q-69 0 -120 -66l-83 -122q-56 -66 -139 -66q-130 0 -182 145h-242q-81 0 -125 -28q-111 -70 -111 -203t84 -205q50 -43 136 -43h258 q20 64 74 103.5t124 39.5t124 -66l81 -122q49 -66 111 -66q121 0 383 175v149l-195 -8q-35 -133 -129 -133z" />
+<glyph unicode="&#x2712;" horiz-adv-x="2049" d="M1274 213q-93 0 -166 78q-40 43 -67 140.5t-41 120.5q-31 52 -93.5 52t-97.5 -55q-54 -85 -88.5 -109t-124.5 -24h-177q-108 0 -132 3q-81 9 -118 49q-69 75 -69 260t113 245q38 20 262 20h114q88 0 126.5 -18t81 -93t106 -75t92.5 43q16 23 36 95t30.5 100.5t39.5 64.5 q73 92 184.5 92t231.5 -166q103 -142 182 -209q110 -93 250 -118q-235 -44 -430 -326q-118 -170 -245 -170zM1742 690q54 3 54 18.5t-164 22.5l-234 10q-36 109 -127 109q-59 0 -95 -42.5t-36 -100t35 -101t88 -43.5q96 0 135 113h48z" />
+<glyph unicode="&#x2713;" horiz-adv-x="1607" d="M481 -14q-28 -13 -111 -13t-98.5 8.5t-46.5 73.5q-125 259 -125 402q0 36 47 69q94 66 158 66q26 0 39 -22q85 -216 106 -216q11 0 53 62l474 702l165 203q48 59 152 91t199 32l14 -33l-190 -225l-426 -563l-295 -457l-72 -123q-11 -22 -43 -57z" />
+<glyph unicode="&#x2714;" horiz-adv-x="1787" d="M1687 1239q0 -40 -14 -60l-184 -200l-498 -524l-266 -256q-237 -228 -297 -228h-2l-47 4q-43 4 -140 82q-43 34 -82 80q-18 21 -18 76l-29 248q-12 105 -12 184q0 27 2 51q5 95 10 107.5t52 68.5t67 76t62 33.5t83 13.5t70 -20q29 -25 29 -62.5t20 -154.5l19 -111 q4 -35 26 -90q24 -27 56 -27q15 0 43 27l747 727l158 131q35 29 80.5 29t55 -12t9.5 -60v-133z" />
+<glyph unicode="&#x2715;" horiz-adv-x="1617" d="M1517 121l-121 -121l-587 590l-588 -590l-121 121l592 588l-592 587l121 121l588 -590l587 590l121 -123l-590 -585z" />
+<glyph unicode="&#x2716;" horiz-adv-x="1617" d="M1517 356l-354 -356l-354 358l-355 -358l-354 356l358 353l-358 352l354 356l355 -356l354 356l354 -356l-356 -352z" />
+<glyph unicode="&#x2717;" horiz-adv-x="1371" d="M1218 1354q5 0 10.5 -13t24 -33t18.5 -30t-20 -29t-72 -86l-313 -409l63 -127l160 -342q-9 -21 -28 -29v-16q-1 -1 -21 -13.5t-20 -20.5t10 -28q-3 -18 -26 -34.5t-42.5 -16.5t-77.5 90l-192 297l-406 -629q-32 -24 -106 -24q-17 0 -45.5 45t-28.5 58t7.5 39t-3 35.5 t-10.5 20.5t49 95l49 84q79 135 351 464l24 29l-151 418q-23 64 -23 71.5t27 41.5q21 18 30 18t31 -18q12 10 33 10q6 3 18 14q10 17 23 17q19 0 37 -37l155 -308l52 64l100 115q187 215 196 215q25 0 72 -39l23 20q14 21 22 21z" />
+<glyph unicode="&#x2718;" horiz-adv-x="1441" d="M1243 1372l-10 -20q0 -8 14.5 -19t24.5 -11t18.5 2.5t19.5 -13.5l31 -45q0 -8 -13.5 -27t-13.5 -22q-8 3 -436 -498l-10 -12l127 -164l176 -211q-4 -23 -29 -68t-38 -45h-17q-4 0 -14.5 -16.5t-6.5 -26.5t-24.5 -35.5t-33.5 -25.5t-34 18.5t-24 18.5q-2 0 -34.5 -35 t-51.5 -35l-16 4q-53 54 -132.5 169t-97.5 138l-313 -420h-27l-39 43l6 29q0 10 -8 10t-51 -16q-19 9 -48.5 58t-29.5 46q0 6 12.5 22.5t12.5 29.5t-15.5 42t-17.5 39l176 213l166 195q-178 332 -238 537q22 42 74 90q5 -1 23.5 -20t21.5 -19q31 0 29 39q-1 19 15.5 34 t36.5 15t44 -37l242 -362q51 60 257 271.5t222 211.5q6 0 40 -28t34 -44z" />
+<glyph unicode="&#x2719;" horiz-adv-x="1619" d="M1519 475h-473v-475h-473v475h-473v469h473v473h473v-473h473v-469zM1456 532v353h-471v469h-353v-469h-473v-353h473v-469h353v469h471zM1380 610h-471v-471h-201v471h-473v195h473v471h201v-471h471v-195z" />
+<glyph unicode="&#x271a;" horiz-adv-x="1615" d="M1515 475h-473v-475h-475v475h-467v471h467v471h475v-471h473v-471z" />
+<glyph unicode="&#x271b;" horiz-adv-x="1613" d="M1513 586h-588v-586h-239v586h-586v245h586v586h239v-586h588v-245zM913 600v217h-211v-217h211z" />
+<glyph unicode="&#x271c;" horiz-adv-x="1603" d="M1503 481h-477v-481h-453v481h-473v445h473v491h453v-491h477v-445zM1015 498v413h-432v-413h432z" />
+<glyph unicode="&#x271d;" horiz-adv-x="1070" d="M970 856h-335v-856h-197v856h-338v195h338v366h197v-366h335v-195z" />
+<glyph unicode="&#x271e;" horiz-adv-x="1187" d="M1087 717h-285v-717h-227l-178 141v576h-115l-182 155v244h297v301h246l159 -147v-154h136l149 -141v-258zM927 879v186h-290v299h-187v-299h-301v-186h301v-727h187v727h290z" />
+<glyph unicode="&#x271f;" horiz-adv-x="1158" d="M1058 721h-284v-721h-391v721h-283v387h283v309h391v-309h284v-387zM1007 768v289h-282v309h-291v-309h-285v-289h285v-717h291v717h282zM944 831h-281v-718h-166v718h-284v162h284v307h166v-307h281v-162z" />
+<glyph unicode="&#x2720;" horiz-adv-x="1702" d="M104 1163l11 2q12 0 18 -10q231 -415 698 -424q-9 469 -423 699q-11 6 -11 14q0 24 21 24h866q13 0 19 -12q2 -2 2 -11t-11 -15q-416 -231 -422 -699q466 9 697 424q6 10 15 10q24 0 24 -20v-866q0 -12 -7.5 -16.5t-16.5 -4.5t-15 10q-228 413 -697 422q6 -465 422 -696 q11 -6 11 -19q0 -20 -21 -20h-866q-21 0 -21 20q0 13 11 19q414 230 423 696q-468 -9 -698 -422q-6 -10 -13.5 -10t-15.5 2q-10 7 -10 19v866q0 11 10 18z" />
+<glyph unicode="&#x2721;" horiz-adv-x="1474" d="M1374 346h-422l-215 -375l-217 375h-420l207 363l-207 364h420l217 371l215 -371h422l-209 -364zM1245 999h-250l127 -211zM864 1073l-127 227l-131 -227h258zM1243 418l-121 213l-123 -213h244zM1077 709l-168 290h-344l-168 -290l168 -291h344zM475 999h-246l123 -211z M870 346h-254l121 -221zM479 418l-127 213l-127 -213h254z" />
+<glyph unicode="&#x2722;" horiz-adv-x="1666" d="M1251 836q71 24 138 24t122 -40t55 -110.5t-53 -114.5t-116.5 -44t-137.5 24l-108 35q-175 57 -283 66q8 -117 55 -266l35 -111q29 -92 29 -155t-42.5 -118t-112 -55t-111 53.5t-41.5 114.5t26 154l84 299q11 37 11 69q0 8 -1 15q-98 -11 -276 -64l-100 -30 q-90 -27 -150.5 -27t-117 41.5t-56.5 110.5t50 113t117 44t142 -26l119 -41q119 -41 272 -58q-9 112 -69 308l-27 88q-24 78 -24 138t42 115.5t110.5 55.5t112.5 -52t44 -115t-59.5 -247.5t-61.5 -290.5l285 64z" />
+<glyph unicode="&#x2723;" horiz-adv-x="1668" d="M1511.5 847.5q56.5 -55.5 56.5 -140t-59.5 -143t-150.5 -58.5t-177 110q-18 24 -67 60q-38 15 -89 15q-12 0 -24 -1l-37 -2q-20 -95 -112 -110v-56q0 -79 13.5 -103.5t80.5 -78.5q92 -74 92 -162.5t-57 -147.5t-139.5 -59t-142.5 56.5t-60 148t108 180.5q47 39 58.5 72 t11.5 104v43q-102 31 -113 115h-47q-69 0 -102.5 -14.5t-73.5 -69.5q-75 -102 -184 -102q-81 0 -139 61.5t-58 143t58 137t150 55.5t171 -100q44 -55 82 -66.5t125 -11.5h18q11 107 111 117l4 49q1 11 1 22q0 86 -58 133q-64 54 -95.5 97t-31.5 117t59.5 130t139.5 56 t139 -59.5t59 -150.5t-98 -167q-37 -29 -48.5 -40.5t-19.5 -39.5q-16 -42 -16 -92v-16l2 -39q46 -3 78 -37t34 -80l41 -2q12 -1 22 -1q54 0 84 13q36 15 79 68q83 102 174 102t147.5 -55.5z" />
+<glyph unicode="&#x2724;" horiz-adv-x="1670" d="M1570 709q0 -110 -73 -187.5t-178.5 -77.5t-178.5 57l-112 109q-68 61 -156 66q-2 -98 117 -211.5t119 -229.5t-81.5 -190t-189 -74t-185 81t-77.5 189t115.5 220t114.5 215q-102 -7 -213 -121.5t-223.5 -114.5t-190.5 79.5t-78 186.5t79 188t180.5 81t175.5 -60 l114 -112q69 -60 156 -60q-8 96 -121 212t-113 224.5t78 186.5t184 78t187 -74.5t81 -178.5t-57 -177l-108 -112q-60 -70 -64 -159h3q99 0 205 115q107 117 218.5 117t191.5 -78t80 -188z" />
+<glyph unicode="&#x2725;" horiz-adv-x="1677" d="M1536 804q41 -40 41 -94.5t-40.5 -92t-95.5 -37.5q-28 0 -57 16q-2 -61 -39 -103t-95.5 -42t-94 36.5t-35.5 90t33 102.5l-285 -6l-6 -275q58 35 108 35t89.5 -37t39.5 -92.5t-43 -94.5t-98 -44q14 -28 14 -72t-38.5 -83.5t-93 -39.5t-92.5 38t-38 91q0 29 17 66h-6 q-55 0 -97 36q-43 37 -43 94t38 97.5t88.5 40.5t99.5 -35l-5 275l-276 4q33 -45 33 -101.5t-41 -93.5t-98.5 -37t-91 45t-35.5 105q-48 -16 -76 -16q-49 0 -83 39.5t-34 92t40.5 91.5t96.5 39q27 0 56 -13q3 55 42 96.5t94.5 41.5t93.5 -37t38 -85t-35 -110l276 4l5 285 q-39 -39 -96 -39t-94.5 35.5t-37.5 93.5q0 113 144 137q-17 47 -17 66q0 51 37 89t92 38t95 -39.5t40 -99.5q0 -18 -12 -54q58 -5 97.5 -41t39.5 -91.5t-36.5 -94.5t-91.5 -39t-103 39l4 -285l285 -4q-37 50 -37 106t38.5 92t95 36t94.5 -42t40 -98q34 15 55 15q56 0 97 -40 z" />
+<glyph unicode="&#x2726;" horiz-adv-x="1683" d="M1583 709q0 -11 -23 -17q-243 -62 -413 -221q-223 -208 -299 -461q-11 -37 -20 -37h-1q-7 -1 -16 31q-71 258 -240 426q-81 81 -203 157t-227 109q-41 8 -41 23q0 9 35 20q247 76 414 244q195 197 266 418q14 43 22.5 43t18.5 -33q70 -243 257 -426.5t427 -251.5 q43 -17 43 -24z" />
+<glyph unicode="&#x2727;" horiz-adv-x="1683" d="M1583 694q-260 -54 -462 -256.5t-271 -464.5h-37q-54 259 -251.5 453.5t-461.5 267.5v41q254 62 447.5 257.5t265.5 451.5h37q66 -260 268 -455.5t465 -253.5v-41zM1499 715q-196 36 -304 64t-212 87q-85 150 -152 492q-37 -178 -67.5 -285t-88.5 -207q-102 -57 -246 -95 q-53 -14 -259 -56q228 -49 259 -57q147 -39 246 -99q57 -98 97 -238q15 -52 59 -251q34 176 64 283t88 206q101 61 251 100z" />
+<glyph unicode="&#x2728;" d="M1948 482q-202 -7 -251 -69q-40 -50 -49 -259h-31q-6 124 -19 173q-26 100 -100 130q-46 18 -185 26v34q201 6 251 67q42 50 52 258h31q13 -171 21 -204q17 -67 71 -89t209 -34v-33zM1428 800q-294 -14 -407 -52q-137 -48 -187 -178q-46 -118 -55 -408h-34 q-9 287 -56.5 412.5t-173.5 170.5t-415 55v34q289 11 402 49q134 46 185 175q46 116 57 402h36v-10q0 -262 54 -388q55 -128 199 -178q120 -41 395 -50v-34zM1535 49q-104 -1 -148 -7q-98 -13 -127.5 -49t-41 -96.5t-24.5 -215.5h-29q-11 180 -24 228q-21 77 -84 104 t-231 37v35q175 17 234 40t78 95q11 39 27 228h29q20 -197 28 -229q19 -74 78.5 -97.5t234.5 -36.5v-36zM1716 498q-57 25 -86 83q-29 -56 -92 -83q63 -29 92 -89q29 61 86 89zM1067 817q-243 61 -307 289q-31 -125 -98.5 -192t-192.5 -97q125 -31 193.5 -99.5t99.5 -193.5 q32 128 103 195.5t202 97.5zM1278 70q-71 29 -98 101q-29 -74 -112 -103q81 -30 111 -101q27 73 99 103z" />
+<glyph unicode="&#x2729;" horiz-adv-x="1740" d="M1640 909l-436 -383l143 -555l-477 314l-477 -314l125 555l-418 383l565 39l205 496l205 -496zM1570 885l-571 -43l-129 536l-129 -536l-571 43l473 -322l-207 -532l434 381l432 -381l-219 532z" />
+<glyph unicode="&#x272a;" horiz-adv-x="1673" d="M1358 1228.5q215 -215.5 215 -520t-215.5 -521t-520 -216.5t-521 214.5t-216.5 521t215.5 522t521.5 215.5t521 -215.5zM1491 930h-500l-156 461l-153 -461h-496l393 -297l-164 -481l420 299l398 -299l-148 481z" />
+<glyph unicode="&#x272b;" horiz-adv-x="1781" d="M1681 872l-543 -319l232 -582l-492 391l-479 -391l213 582l-512 319l604 -24l164 596l174 -596zM1030 485.5q63 65.5 63 155t-64.5 153.5t-155 64t-155.5 -63.5t-65 -155t66 -155.5t157 -64t154 65.5z" />
+<glyph unicode="&#x272c;" horiz-adv-x="1744" d="M1644 903l-430 -377l143 -555l-483 314l-473 -314l129 555l-430 377l567 43l207 498l207 -498zM1114 641q0 -36 -13 -78l476 318l-568 -43q105 -84 105 -197zM747 842q61 32 128 32t128 -32l-129 534zM1314 29l-215 530q-65 -139 -217 -151zM643 645q0 110 100 193 l-577 43l489 -318q-12 52 -12 82zM874 408q-141 0 -217 151l-211 -530z" />
+<glyph unicode="&#x272d;" horiz-adv-x="1763" d="M1663 885l-455 -350l184 -564l-510 334l-506 -334l160 564l-436 350h567l215 559l219 -559h562zM1507 829h-442l-183 467l-180 -467h-446l344 -274l-127 -457l409 273l408 -273l-146 457zM1323 764l-252 -189l114 -339l-303 206l-311 -206l94 339l-239 189h319l137 366 l142 -366h299z" />
+<glyph unicode="&#x272e;" horiz-adv-x="1730" d="M1347 -14q0 -13 -16.5 -13t-26.5 19l-436 284l-442 -278q-36 -18 -33 -18q-12 0 -12 14q0 5 6 31l121 520l-381 303q-27 27 -27 29q0 12 41 16l504 51l198 465q15 35 25 35q14 0 23 -35l200 -465l498 -51q12 -1 26.5 -3t14.5 -13l-29 -29l-375 -303l115 -527q6 -27 6 -32 zM1409 817l-391 27l-150 375l-150 -375l-393 -27l299 -231l-108 -426l352 243l342 -243l-102 426zM1204 760l-189 -146l70 -268l-217 160l-227 -160l75 268l-180 146h238l94 239l92 -239h244z" />
+<glyph unicode="&#x272f;" horiz-adv-x="1759" d="M1659 889l-453 -340l209 -578l-527 361l-509 -361l198 578l-477 340h590l198 555l195 -555h576zM1548 846h-500l-160 -201zM888 645v696l-170 -495zM1345 61l-184 500l-273 84zM888 645l-682 201l418 -285zM888 377v266l-436 -582z" />
+<glyph unicode="&#x2730;" horiz-adv-x="1947" d="M1847 866l-440 -321l186 -541l-272 10l-301 226l-365 -269l-268 54l176 532l-463 352h582l180 535l24 -2l228 -35l170 -498h436zM1556 866h-506l-170 504l-166 -504h-489l391 -288l-166 -492l430 311l414 -311l-154 492z" />
+<glyph unicode="&#x2731;" horiz-adv-x="1582" d="M1482 479l-161 -268l-383 238l12 -449h-318l13 449l-385 -238l-160 268l401 230l-401 229l160 268l385 -248l-13 459h318l-12 -459l383 248l161 -268l-403 -229z" />
+<glyph unicode="&#x2732;" horiz-adv-x="1537" d="M1437 971l-428 -252l-112 188l424 260zM882 918h-225v499h225v-499zM1437 446l-110 -196l-428 252l110 196zM643 907l-115 -188l-428 252l109 196zM882 0h-225v492h225v-492zM643 502l-424 -252l-117 196l428 252z" />
+<glyph unicode="&#x2733;" horiz-adv-x="1591" d="M1491 668l-646 12l476 -438l-64 -66l-442 471l22 -647h-88l21 647l-424 -471l-68 66l463 438l-641 -12v88l641 -19l-477 434l63 66l443 -475l-29 655h94l-20 -655l442 465l64 -64l-476 -432l646 25v-88z" />
+<glyph unicode="&#x2734;" horiz-adv-x="1679" d="M1579 713q0 -17 -39 -17l-553 -53l342 -422q18 -18 18 -26q0 -13 -10 -13t-33 23l-411 344l-41 -545q-7 -33 -15 -33q-18 0 -18 39l-55 545l-422 -352q-23 -19 -27 -19q-14 0 -14 15q0 10 20 30l350 418l-536 39q-35 3 -35 16q0 9 39 17l530 53l-354 422q-16 19 -16 27 q0 14 10 14t33 -23l422 -346l43 547q6 31 14 31q12 0 16 -37l60 -547l428 369q19 16 26 16q15 0 15 -14q0 -8 -23 -31l-348 -426l551 -45q33 -3 33 -16z" />
+<glyph unicode="&#x2735;" horiz-adv-x="1681" d="M1581 707l-445 -103l238 -399l-17 -17l-387 244l-112 -461h-25l-94 445l-408 -244l-16 16l244 390l-459 108v21l459 102l-244 416l16 16l383 -250l119 453h25l96 -447l414 254l16 -18l-256 -393l453 -111v-22zM1319 1186l-365 -230l-88 -221zM1501 715l-402 94l-221 -94 h623zM845 741v633l-98 -418zM1314 248l-227 356l-213 82zM817 729l-443 447l226 -367zM942 459l-97 219v-633zM807 707l-644 -7l433 -96zM827 686l-457 -461l369 234z" />
+<glyph unicode="&#x2736;" horiz-adv-x="1482" d="M1382 1067q0 -6 -25 -25l-391 -335l383 -338q23 -20 23 -23q0 -10 -12 -10q-1 0 -31 10l-467 158l-105 -502q-10 -31 -19 -31t-17 37l-103 496l-473 -158q-37 -18 -37 2q0 3 27 27l379 332l-394 340q-20 17 -20 20q0 12 10 12q-3 0 29 -8l479 -166l109 510q7 31 16 31 q7 0 14 -35l105 -506l483 166q37 13 37 -4z" />
+<glyph unicode="&#x2737;" horiz-adv-x="1646" d="M1116 1413l-4 -31l-82 -446l475 84q41 7 41 -8q0 -10 -29 -25l-391 -276l391 -277q29 -21 29 -26q0 -13 -10 -13q-3 0 -33 6l-473 95l90 -465q4 -21 4 -32t-12.5 -11t-26.5 28l-266 377l-268 -379q-26 -26 -25 -26q-10 0 -10 10l88 498l-461 -78q-24 -4 -31 -4 q-12 0 -12 9t31 30l383 258l-381 274l-29 29q0 10 12 10l33 -4l455 -84l-84 453q0 1 -2 15q-6 28 10 28q11 0 25 -29l266 -377l258 371q14 28 26.5 28t12.5 -12z" />
+<glyph unicode="&#x2738;" horiz-adv-x="1632" d="M1532 422l-449 39l31 -475l-303 346l-303 -346l34 475l-442 -39l344 301l-344 301l442 -39l-34 447l303 -347l303 347l-31 -447l440 39l-338 -301z" />
+<glyph unicode="&#x2739;" horiz-adv-x="1679" d="M1579 709l-363 -111l262 -258l-356 90l104 -356l-290 266l-103 -369l-92 361l-268 -271l92 359l-361 -92l269 276l-373 105l373 102l-269 276l361 -92l-92 361l268 -271l92 359l103 -369l290 266l-104 -356l356 90l-262 -258z" />
+<glyph unicode="&#x273a;" horiz-adv-x="1613" d="M100 739h557l-520 205l29 70l512 -217l-400 385l55 55l385 -395l-221 508l72 28l201 -512v551h75l-12 -551l199 512l72 -28l-213 -508l385 395l57 -55l-395 -385l505 217l31 -70l-514 -205l553 11v-80l-553 10l514 -207l-31 -72l-505 226l395 -391l-51 -56l-391 404 l225 -514l-72 -29l-211 520l12 -561h-75l6 561l-199 -520l-74 29l215 514l-385 -404l-55 56l400 391l-512 -226l-29 72l520 207l-557 -10v69z" />
+<glyph unicode="&#x273b;" horiz-adv-x="1505" d="M1370.5 1096q34.5 -37 34.5 -91.5t-56 -86.5q-20 -12 -108 -39q-179 -56 -307 -66l184 199q112 121 165 121t87.5 -37zM860 1339q0 -76 -43 -209l-68 -210q-39 81 -78 214t-39 190t33.5 87.5t77.5 30.5q117 0 117 -103zM1346 489q50 -31 50 -85.5t-33.5 -92t-81.5 -37.5 t-173 119l-166 195l297 -64q76 -16 107 -35zM871.5 828.5q51.5 -52.5 51.5 -124t-50.5 -123t-121.5 -51.5t-123.5 51t-52.5 123t50.5 124.5t122.5 52.5t123.5 -52.5zM155 919q-55 32 -55 86t33.5 92t85.5 38t166 -123l184 -199q-137 11 -265.5 52.5t-148.5 53.5zM860 76 q0 -47 -33.5 -75t-81 -28t-80.5 30.5t-33 74.5q0 71 38.5 202.5t78.5 215.5l68 -211q43 -133 43 -209zM397 391q-123 -117 -172 -117t-84 37.5t-35 90t52 82.5q17 10 106 38l299 66z" />
+<glyph unicode="&#x273c;" horiz-adv-x="1505" d="M983 709l-6 -54q0 -40 111 -64q170 -35 206 -50q111 -46 111 -140q0 -49 -36.5 -83.5t-86.5 -34.5q-79 0 -204.5 129t-152.5 129q-2 0 -15 -7l-81 -43q-31 -16 -31 -50.5t40 -146t40 -174t-34 -106t-90 -43.5t-92 42.5t-36 106t36 187t36 147.5t-25.5 32t-57.5 32.5 t-40 24.5q-36 0 -152.5 -132t-201.5 -132q-50 0 -84.5 36t-34.5 84q0 90 109 139q41 18 202 56q109 26 109 61l-4 45l6 66q0 40 -110 65q-175 40 -204 52q-110 45 -110 131q0 51 35.5 88t94 37t137.5 -67q28 -25 105 -109t103 -84q12 0 28.5 13t73.5 39q25 11 25 50.5 t-36 147t-36 167t32 104t83.5 44.5t93 -33.5t41.5 -106.5t-37.5 -186t-37.5 -148t25.5 -43t53.5 -31.5t41 -23.5q45 0 127 99q138 166 226 166q50 0 86 -35.5t36 -85.5q0 -90 -109 -139q-43 -19 -203 -57q-109 -26 -109 -60zM855.5 601q43.5 46 43.5 108.5t-45 106.5 t-108 44t-104.5 -46t-41.5 -109t44.5 -106.5t106 -43.5t105 46z" />
+<glyph unicode="&#x273d;" horiz-adv-x="1453" d="M1353 995q0 -77 -59 -131q-43 -39 -172 -57.5t-205.5 -36.5t-148.5 -61q117 -60 256 -80l131 -19q84 -12 139 -63.5t55 -132.5q0 -28 -8 -76q-73 -66 -145 -66q-106 0 -199 131q-143 201 -248 261l-2 -29v-13q0 -84 68 -237l43 -96q30 -67 30 -121q0 -154 -157 -197 q-160 45 -160 189q0 46 33 135l31 84q65 176 65 264v21q-103 -60 -254 -271q-86 -121 -178 -121q-71 0 -158 66q-10 70 -10 86q0 153 217 186l111 17q160 24 254 82q-105 60 -276.5 85t-221.5 52q-81 43 -81 138q0 10 1 20l6 75q90 66 156 66t124 -52q33 -31 87 -108 q129 -185 223 -229v45q0 81 -67.5 242t-67.5 212q0 144 166 189q62 -21 108.5 -67.5t46.5 -106t-36 -144.5q-101 -239 -101 -361v-9q33 13 62 39l125 139l61 80q98 129 186 129q71 0 158 -66q12 -52 12 -82z" />
+<glyph unicode="&#x273e;" horiz-adv-x="1494" d="M1390 420q0 -35 -3 -80q-131 -72 -207 -72q-113 0 -202 115l-185 240l123 -279q43 -98 43 -147q0 -86 -66 -144q-40 -35 -143 -82q-100 52 -138 86q-68 60 -68 140q0 52 41 147l120 279l-184 -240q-99 -129 -186 -129t-226 86l-8 96q-1 14 -1 27q0 176 249 207l311 39 l-309 34q-141 16 -193 72t-52 179q0 35 3 81q130 92 217.5 92t190.5 -137l188 -250l-123 287q-45 105 -45 160q0 125 213 217q97 -46 137 -81q66 -58 66 -130.5t-39 -165.5l-121 -287l183 250q91 125 200 125q73 0 211 -80l6 -94q1 -12 1 -24q0 -104 -64 -154 q-57 -45 -190 -60l-302 -34l302 -39q145 -19 197.5 -73t52.5 -177zM892 1198q0 147 -144 199q-145 -53 -145 -189q0 -43 29 -125l102 -288h29l102 288q27 76 27 115zM1209 305q67 0 137 55l7 60q0 94 -78 153q-49 37 -142 52l-299 49l-14 -29l197 -231q93 -109 192 -109z M748 752q-47 0 -47 -44t47 -44t47 44t-47 44zM294 305q88 0 184 109l203 231l-19 29l-305 -49q-206 -33 -206 -190q0 -10 1 -21l4 -52q72 -57 138 -57z" />
+<glyph unicode="&#x273f;" horiz-adv-x="1748" d="M860 317l4 -45q0 -114 -53 -186q-85 -115 -236 -115q-119 0 -204 85t-85 212t97 207q62 51 143 66q47 0 47 26q0 13 -18 13q-2 0 -59 -21.5t-109 -21.5q-116 0 -201.5 85.5t-85.5 201t84 202t201 86.5q92 0 162 -50q43 -32 83 -88t50 -56t10 10q0 -2 -51.5 75t-51.5 166 q0 115 85 195t199 80t205 -83t91 -194q0 -48 -24 -112.5t-58 -93.5q-25 -25 -16 -46q18 0 35 35q30 62 104.5 105t144.5 43q121 0 208 -82t87 -198.5t-80 -205t-186.5 -88.5t-151.5 31q-26 18 -38.5 18t-12.5 -12q0 -20 45 -26q97 -12 168.5 -96t71.5 -192.5t-82.5 -192 t-207 -83.5t-207.5 86.5t-83 216.5l4 43q0 25 -14 25t-14 -25zM1049.5 488.5q72.5 72.5 72.5 174t-72.5 174t-175.5 72.5t-176.5 -72t-73.5 -174.5t73.5 -174.5t176.5 -72t175.5 72.5z" />
+<glyph unicode="&#x2740;" horiz-adv-x="1726" d="M1551 1001q75 -80 75 -196t-77.5 -189.5t-196.5 -73.5q-14 0 -29 1l-146 12q273 -148 273 -324q0 -102 -80.5 -181t-182.5 -79q-260 0 -317 377q-18 -92 -32.5 -143t-45.5 -99q-86 -135 -227 -135q-111 0 -191.5 79.5t-80.5 188.5t80 190q51 52 176 122l-117 -6 q-12 -1 -23 -1q-119 0 -209 66q-100 71 -100 194t75.5 200t190.5 77q137 0 305 -168q-73 180 -73 280.5t71 175.5t183.5 75t193 -73.5t80.5 -178.5t-76 -268q176 157 320 157q106 0 181 -80zM1241 594q105 0 184.5 55t79.5 148t-58 145.5t-143 52.5q-183 0 -274 -161l51 -62 l164 39q20 5 33 5q24 0 24 -17t-45 -37l-151 -68v-82q79 -18 135 -18zM974 872q80 110 80 212.5t-51 169.5t-146.5 67t-143.5 -70.5t-48 -174.5t80 -204l76 27l14 170q4 51 23 51q11 0 24 -51l27 -170zM1341 276q0 97 -77.5 171.5t-178.5 99.5l-41 -58l90 -143 q23 -28 23 -45.5t-17 -17.5q-11 0 -45 34l-118 119l-68 -24q-2 -16 -2 -33q0 -109 72 -200t178 -91q75 0 129.5 57t54.5 131zM419 991q-81 0 -138.5 -55t-57.5 -143.5t84 -148.5t186 -60q40 0 131 26v82l-153 64q-52 15 -52 36q0 15 26 15q14 0 34 -4l166 -31l45 59 q-108 160 -271 160zM606 281q-14 0 -14 14t16 43l84 151l-47 60q-242 -86 -242 -277q0 -73 56.5 -128.5t129.5 -55.5q103 0 174 91t71 197q0 19 -3 36l-74 24l-116 -127q-21 -28 -35 -28z" />
+<glyph unicode="&#x2741;" horiz-adv-x="1673" d="M1573 709q0 -191 -205 -230q51 -82 51 -133q0 -78 -66 -150.5t-143 -72.5q-55 0 -149 49q-19 -90 -80 -145.5t-149 -55.5t-146.5 58.5t-69.5 144.5q-84 -53 -135 -53q-94 0 -162.5 68.5t-68.5 162.5q0 48 55 133q-85 11 -145 72t-60 145q0 186 205 228q-53 93 -53 139 q0 89 65 154t154 65q58 0 145 -53q11 96 71.5 152.5t151.5 56.5t150.5 -59t64.5 -146q82 53 136 53q98 0 165.5 -65.5t67.5 -163.5q0 -54 -55 -135q88 -13 146.5 -73t58.5 -146zM1370 1075q0 65 -50.5 113.5t-115.5 48.5q-117 0 -174 -131l-80 -184l18 -13l109 170 q55 86 123 86q47 0 74.5 -30t27.5 -76q0 -65 -88 -119l-172 -106l10 -21l187 84q131 59 131 178zM1005 1221q0 70 -50.5 121t-122 51t-117.5 -54t-46 -129q0 -33 19 -86l67 -186l25 8l-39 191q-6 28 -6 52q0 44 19 77q28 53 81 53q80 0 105 -82q5 -16 5 -36q0 -27 -9 -62 l-50 -197l25 -6l72 188q22 57 22 97zM1521 700q0 76 -52 125t-130 49q-28 0 -84 -22l-188 -74l4 -22l200 43q28 6 53 6q42 0 74 -17q50 -28 50 -93t-72 -93q-19 -7 -43.5 -7t-54.5 7l-205 49l-6 -24l192 -74q55 -21 94.5 -21t79.5 23q88 51 88 145zM469 1241q-66 0 -116 -50 t-50 -116q0 -117 127 -174l182 -82l12 23l-172 100q-84 49 -84 119q0 42 31.5 75t73.5 33q79 0 127 -84l98 -172l27 15l-80 182q-58 131 -176 131zM966 576q54 54 54 130.5t-54.5 131.5t-131 55t-131 -53.5t-54.5 -130.5t54 -132t131.5 -55t131.5 54zM1368 352 q0 106 -123 158l-195 82l-10 -21l178 -106q80 -48 80 -121q0 -38 -32.5 -70t-71.5 -32q-71 0 -119 80l-107 178l-22 -15l86 -186q57 -123 166 -123q73 0 121.5 51.5t48.5 124.5zM1007 195q0 34 -20 86l-74 192l-22 -4l45 -201q6 -26 6 -50q0 -122 -111 -122q-71 0 -98 76 q-5 15 -5 35q0 24 7 55l47 205l-25 8l-71 -192q-19 -52 -19 -96t29 -83q61 -81 134 -81t125 50.5t52 121.5zM413 854q-55 20 -96.5 20t-85.5 -24q-80 -45 -80 -145q0 -72 51.5 -119t122.5 -47q30 0 82 20l193 74l-4 24l-203 -51q-33 -8 -60 -8q-36 0 -61 14q-47 34 -47 93 q0 79 78 102q17 5 39 5q25 0 57 -7l197 -43l6 22zM473 242q-44 0 -73.5 31.5t-29.5 76.5q0 67 84 119l170 106l-8 21l-190 -82q-125 -54 -125 -164q0 -72 48 -124t120 -52q113 0 170 125l86 188l-25 15l-113 -180q-50 -80 -114 -80z" />
+<glyph unicode="&#x2742;" horiz-adv-x="1673" d="M1357 1228.5q216 -215.5 216 -520t-215 -521t-520 -216.5t-521.5 215.5t-216.5 521.5t215.5 521t520.5 215t521 -215.5zM1347 1219l-342 -140q139 -73 201 -205zM696 1090q61 24 145.5 24t137.5 -24l-142 335zM1218 850q25 -82 25 -153.5t-25 -135.5l336 144zM675 1079 l-337 148l131 -353q64 148 206 205zM1083 457q104 101 104 246t-101 251.5t-247 106.5t-251 -100.5t-105 -247t102 -252t248 -105.5t250 101zM1343 193l-135 339q-70 -134 -203 -196zM458 561q-26 85 -26 144.5t26 144.5l-333 -145zM981 328q-72 -25 -141 -25t-144 25 l143 -342zM667 336q-135 73 -194 196l-131 -339z" />
+<glyph unicode="&#x2743;" horiz-adv-x="1509" d="M1409 965q0 -115 -164 -170q-114 -38 -303 -68l-115 -18l100 -17q106 -17 303 -63q177 -56 177 -174q0 -56 -13 -115q-106 -96 -172 -96q-83 0 -234 162q-14 14 -198 235q144 -341 144 -481q0 -85 -48 -126q-28 -25 -127 -63q-97 33 -131 58q-59 44 -59 127.5t55 242.5 l94 242l-94 -117q-223 -278 -336 -278q-59 0 -172 94q-16 72 -16 111q0 117 154 167l309 68l123 23l-357 69q-229 44 -229 191q0 40 16 108q97 97 164 97q118 0 344 -281l94 -117l-94 244q-55 159 -55 241.5t60 126.5q38 27 130 56q101 -38 128 -61q47 -41 47 -128 q0 -138 -144 -479l198 237q150 161 236 161q63 0 170 -97q15 -67 15 -112zM1247 1126q-94 0 -237 -151l-193 -230l530 310q-49 71 -100 71zM648.5 1358q-32.5 -33 -32.5 -118.5t52 -227.5l91 -226v613q-78 -8 -110.5 -41zM1372 449q0 108 -229 171q-76 21 -322 58l530 -303 q21 50 21 74zM133 975q0 -128 356 -195l197 -32l-531 307q-22 -53 -22 -80zM893 160q0 152 -134 473v-610q134 6 134 137zM266 299q153 0 424 381l-529 -307q49 -74 105 -74z" />
+<glyph unicode="&#x2744;" horiz-adv-x="1460" d="M1360 389l-50 -74l-196 117l8 -217l-61 21l-19 241l-278 166v-328l210 -139l-26 -61l-184 121l4 -236h-78l4 236l-184 -121l-27 61l211 139v328l-277 -166l-20 -241l-61 -21l8 217l-197 -117l-47 74l203 115l-195 94l39 55l225 -110l293 166l-293 163l-225 -108l-39 55 l195 92l-203 117l47 72l197 -117l-8 219l61 -20l20 -244l277 -166v328l-211 141l27 62l184 -121l-4 235h78l-4 -235l184 121l26 -62l-210 -141v-328l278 166l19 244l61 20l-8 -219l196 117l50 -72l-203 -117l192 -92l-39 -55l-225 108l-293 -163l293 -166l225 110l39 -55 l-192 -94z" />
+<glyph unicode="&#x2745;" horiz-adv-x="1482" d="M1353 420q29 -15 29 -20.5t-14 -20.5l-19 -21q-19 -45 -24 -45q-12 0 -29 17l-242 147v-315l-276 155l14 -278l1 -27q0 -11 -18 -11q-5 0 -11 1l-29 4l-17 -2q-15 -3 -24 -3q-14 0 -14 7v31l18 278l-272 -155v315l-238 -147q-28 -17 -32.5 -17t-12.5 23l-10 22l-13 13 q-20 27 -20 30.5t10 8.5l271 141l-267 158l267 153l-252 129q-29 15 -29 22t12 19l15 21l4 14q10 31 18 31q12 0 29 -17l248 -145v311l272 -155l-18 286q-1 8 -1 21q-1 13 3 15q2 1 6 1q7 0 18 -2l25 -4l18 2q35 7 35 -4v-29l-6 -284l276 153v-311l234 158q18 18 29 18 q5 0 14 -22l10 -25l12 -12q21 -31 21 -29q0 -6 -29 -23l-244 -139l269 -153l-269 -158zM1015 920v258l-235 -134v-270zM1286 709l-232 127l-239 -127l239 -134zM698 774v270l-231 134v-269zM1015 233v271l-235 137v-276zM657 709l-231 127l-230 -127l230 -134zM698 365v276 l-231 -137v-271z" />
+<glyph unicode="&#x2746;" horiz-adv-x="1470" d="M1370 549l-193 -68l185 -104l-31 -47l-184 106l45 -200l-109 -19l-98 322l-223 123v-252l223 -250l-64 -88l-159 145l8 -217h-72l10 217l-162 -145l-61 88l223 250v252l-223 -123l-98 -322l-111 19l45 200l-184 -106l-29 47l185 104l-193 68l37 102l330 -73l217 131 l-217 131l-330 -74l-37 102l193 68l-185 104l29 47l184 -108l-45 201l111 18l98 -319l223 -125v252l-223 249l61 91l162 -148l-10 219h72l-8 -219l159 148l64 -91l-223 -249v-252l223 125l98 319l109 -18l-45 -201l184 108l31 -47l-185 -104l193 -68l-39 -102l-328 74 l-219 -131l219 -131l328 73z" />
+<glyph unicode="&#x2747;" horiz-adv-x="1668" d="M1462 1268l-451 -416q-30 0 -35 4.5t-4 32.5l420 448q20 -47 70 -69zM729 1288l-2 71q0 39 19 55t87 30q64 -17 72 -21q31 -17 31 -61v-84q-6 -69 -13.5 -142.5t-25.5 -129.5q0 -10 -28.5 -78t-41.5 -68q-25 0 -78 184q-20 69 -20 244zM1484 600h-81l-137 12 q-80 9 -136 27q-9 0 -77 28.5t-68 41.5q0 24 184 77q73 21 244 21q16 0 38.5 0.5t30.5 0.5q40 0 56 -18.5t30 -87.5q-16 -63 -21 -72q-17 -30 -63 -30zM1462 147q-45 -24 -70 -71l-415 448q-2 29 2 35t32 6zM688 889q3 -27 -2.5 -32t-34.5 -5l-457 416q48 21 72 69zM950 709 q0 -51 -36 -87t-87 -36t-87 36t-36 87t36 86.5t87 35.5t87 -35.5t36 -86.5zM185 811l71 -2q91 -1 143 -4t100 -17q185 -53 185 -79q0 -15 -146 -70q-86 -26 -272 -35l-82 -4h-5q-41 0 -58 30q-4 8 -21 75q14 68 30 87t55 19zM729 56l2 71q0 175 20 244q53 184 78 184 q12 0 41 -67t29 -76q37 -114 37 -275v-82q0 -44 -30 -61q-6 -4 -71 -23q-68 14 -87 30t-19 55zM692 522l-420 -446q-22 46 -68 71l449 418q10 1 17 1q13 0 16 -4q4 -6 6 -40z" />
+<glyph unicode="&#x2748;" horiz-adv-x="1668" d="M1470 1309l-407 -410l-45 39l405 414zM1374 537q-50 0 -111 28l-178 97q-63 34 -63 46t20 19l161 97q100 59 171 59q146 0 194 -174q-24 -88 -65 -130t-129 -42zM1005 1253q0 -72 -80 -209l-45 -77q-42 -72 -51 -72q-6 0 -29 41l-59 104q-82 145 -82 201q0 167 178 203 q168 -45 168 -191zM651 938l-45 -39l-404 410l43 43zM1480 119l-43 -43l-413 401l41 47zM951.5 828q49.5 -49 49.5 -119.5t-49 -120t-118.5 -49.5t-119 49.5t-49.5 119t48 119.5t118.5 50t120 -49zM649 707q0 -2 -37 -27l-153 -90q-91 -51 -166 -51q-151 0 -193 170 q43 176 186 176q75 0 166 -52l136 -85q61 -39 61 -41zM1007 170q0 -142 -176 -199q-170 53 -170 201q0 68 50 150l96 157q29 43 30 43q23 0 39 -63q1 -1 83 -136q48 -78 48 -153zM651 477l-410 -401l-45 43l410 405z" />
+<glyph unicode="&#x2749;" horiz-adv-x="1517" d="M1364.5 560.5q52.5 -53.5 52.5 -127.5t-51.5 -124.5t-126.5 -50.5t-128 53.5t-53 128.5q0 14 9 54l-273 155v-319q62 -20 104 -67t42 -116t-52.5 -122.5t-129.5 -53.5t-128 53t-51 121.5t42 117t102 67.5v319l-273 -155q10 -33 10 -64q0 -68 -54 -120t-125.5 -52 t-126 47.5t-54.5 122t51 130.5t130 56t138 -65l269 160l-269 157q-62 -65 -137.5 -65t-128.5 54t-53 128t52 124t127.5 50t128 -52.5t52.5 -127.5q0 -26 -10 -53l273 -158v321q-61 18 -102.5 66t-41.5 117t51.5 121.5t128.5 52.5t129 -52.5t52 -121.5t-42.5 -117t-103.5 -66 v-321l273 158q-9 30 -9 61q0 69 53.5 120.5t126 51.5t126 -47.5t53.5 -122t-50 -129.5t-129 -55t-139 63l-268 -157l268 -160q62 65 137.5 65t128 -53.5z" />
+<glyph unicode="&#x274a;" horiz-adv-x="1677" d="M1355.5 1234q26.5 -28 26.5 -68.5t-30 -68.5q-8 -7 -68 -46l-250 -160l-21 20l162 254q38 59 45 67q28 30 68.5 30t67 -28zM1548 772q29 -27 29 -62.5t-28.5 -63.5t-58.5 -28t-87 13l-295 67v29l295 59q65 13 79 13q37 0 66 -27zM931 1350q0 -5 -16 -80l-63 -295h-29 l-74 338q-5 22 -5 40t5 31q21 60 84 60q39 0 68.5 -28t29.5 -66zM288 1165q0 40 27.5 66t68 26t68.5 -30q6 -7 43 -64l164 -254l-16 -18l-256 160q-55 35 -66 44q-33 30 -33 70zM1357 319q29 -27 29 -66.5t-27 -67t-71 -27.5t-76 49l-197 305l19 16l260 -166q54 -35 63 -43z M974 845q58 -56 58 -136.5t-55.5 -139.5t-136.5 -59t-139 57t-58 138t56 138.5t136.5 57.5t138.5 -56zM934 61q0 -36 -30.5 -63t-66 -27t-64 28.5t-28.5 61.5q0 12 14 80l62 301h29l69 -301q15 -65 15 -80zM100 709q0 37 28 60.5t66 23.5l375 -66v-29l-342 -84 q-19 -5 -34 -5q-19 0 -34 7q-59 26 -59 93zM379 164q-37 0 -63 25.5t-26 63.5t30 66q9 8 63 43l256 166l20 -16l-188 -293q-35 -55 -92 -55z" />
+<glyph unicode="&#x274b;" horiz-adv-x="1664" d="M1564 709q0 -107 -116 -107q-20 0 -86 10l-371 56l-19 -47l351 -234q69 -46 69 -101t-31.5 -92.5t-82 -37.5t-85.5 30q-18 15 -59 72l-221 305l-41 -18l74 -408q5 -27 5 -48.5t-5 -37.5q-24 -80 -106 -80t-117 68q-12 23 -12 54q0 15 3 32l76 420l-45 18l-215 -297 q-80 -110 -129 -110t-82 32t-33 77q0 77 93 141l309 215l-19 45l-364 -52q-84 -12 -90 -12q-115 0 -115 107q0 52 37 87t88 35q21 0 82 -12l362 -71l19 43l-303 200q-62 41 -78 57q-35 36 -35 87t36.5 83.5t83 32.5t83.5 -38q10 -10 55 -72l215 -293l45 20l-74 410 q-6 30 -6 52q0 18 4 30q23 84 111 84q51 0 85 -38t34 -89q0 -25 -10 -84l-62 -365l41 -20l234 340q54 78 122 78q47 0 81 -38t34 -93.5t-65 -100.5l-347 -241l19 -45l366 71q62 12 86 12q49 0 85 -35t36 -87z" />
+<glyph unicode="&#x274c;" horiz-adv-x="1373" d="M1273 1121l-416 -415l414 -415l-169 -169l-414 415l-414 -415l-174 174l415 414l-415 414l169 169l415 -414l415 416z" />
+<glyph unicode="&#x274d;" horiz-adv-x="1845" d="M346 1250q231 194 573.5 194t584 -199.5t241.5 -537.5t-253 -544q-235 -192 -579.5 -192t-578.5 201.5t-234 536.5t246 541zM1493 705q0 274 -194.5 469.5t-469.5 195.5t-471.5 -191t-196.5 -467t195.5 -472.5t471.5 -196.5t470.5 194t194.5 468z" />
+<glyph unicode="&#x274e;" horiz-adv-x="1613" d="M1513 0h-1413v1417h1413v-1417zM1393 1121l-174 174l-415 -416l-415 414l-169 -169l415 -414l-415 -414l174 -174l414 415l414 -415l169 169l-414 415z" />
+<glyph unicode="&#x274f;" horiz-adv-x="1617" d="M1517 0h-1198v217h-219v1200h1194v-213h223v-1204zM1237 274v1082h-1078v-1082h1078z" />
+<glyph unicode="&#x2750;" horiz-adv-x="1617" d="M1517 213h-223v-213h-1194v1200h219v217h1198v-1204zM1237 61v1082h-1078v-1082h1078z" />
+<glyph unicode="&#x2751;" horiz-adv-x="1613" d="M1513 0h-1171l-242 236v1181h1165l248 -243v-1174zM1253 252v1100h-1090v-1100h1090z" />
+<glyph unicode="&#x2752;" horiz-adv-x="1613" d="M100 0v1182l242 235h1171v-1173l-248 -244h-1165zM1253 66v1099h-1090v-1099h1090z" />
+<glyph unicode="&#x2753;" horiz-adv-x="1439" d="M1339 994q0 -173 -129 -301q-21 -21 -235 -177q-118 -86 -118 -166v-8h-395q0 171 121 309q57 66 224 190q121 90 121 142q0 68 -78 101q-57 24 -151.5 24t-284 -49.5t-314.5 -102.5v387q104 44 299 80.5t315 36.5q234 0 415 -113q210 -132 210 -353zM885 -2 q0 -93 -66.5 -159.5t-159.5 -66.5t-159 66.5t-66 159.5t66 159.5t159 66.5t159.5 -66.5t66.5 -159.5z" />
+<glyph unicode="&#x2754;" horiz-adv-x="1439" d="M1339 994q0 -173 -129 -301q-21 -21 -235 -177q-118 -86 -118 -166v-8h-395q0 171 121 309q57 66 224 190q121 90 121 142q0 68 -78 101q-57 24 -151.5 24t-284 -49.5t-314.5 -102.5v387q104 44 299 80.5t315 36.5q234 0 415 -113q210 -132 210 -353zM885 -2 q0 -93 -66.5 -159.5t-159.5 -66.5t-159 66.5t-66 159.5t66 159.5t159 66.5t159.5 -66.5t66.5 -159.5zM1239 994q0 176 -183 280q-152 86 -342 86q-237 0 -514 -87v-174q329 109 514 109q123 0 209 -50q105 -61 105 -175q0 -86 -100 -173l-200 -157q-120 -102 -152 -211h199 q37 85 163 172q172 120 202 150q99 98 99 230zM785 -2q0 51 -37.5 88.5t-88.5 37.5t-88 -37.5t-37 -88.5t37 -88.5t88 -37.5t88.5 37.5t37.5 88.5z" />
+<glyph unicode="&#x2755;" horiz-adv-x="825" d="M725 1469l-140 -1127h-345l-140 1127h625zM638 -2q0 -93 -66.5 -159.5t-159.5 -66.5t-159 66.5t-66 159.5t66 159.5t159 66.5t159.5 -66.5t66.5 -159.5zM612 1369h-399l115 -927h169zM538 -2q0 51 -37.5 88.5t-88.5 37.5t-88 -37.5t-37 -88.5t37 -88.5t88 -37.5 t88.5 37.5t37.5 88.5z" />
+<glyph unicode="&#x2756;" horiz-adv-x="1662" d="M1562 700l-329 -290l-304 303l308 307zM1134 1114l-303 -303l-305 305l305 328zM731 713l-305 -303l-326 303l322 307zM1140 307l-309 -336l-305 336l305 307z" />
+<glyph unicode="&#x2757;" horiz-adv-x="840" d="M681 1255q0 -199 -223 -964h-76q-34 105 -101 359q-122 463 -122 605q0 112 75 190.5t186 78.5t186 -78.5t75 -190.5zM589 78q70 -69 70 -166t-72 -168t-167 -71t-167 71t-72 166t72 166t169 71t167 -69z" />
+<glyph unicode="&#x2758;" horiz-adv-x="341" d="M241 0h-141v1417h141v-1417z" />
+<glyph unicode="&#x2759;" horiz-adv-x="624" d="M524 0h-424v1417h424v-1417z" />
+<glyph unicode="&#x275a;" horiz-adv-x="907" d="M807 0h-707v1417h707v-1417z" />
+<glyph unicode="&#x275b;" horiz-adv-x="862" d="M675 1043q87 -86 87 -213t-97 -210t-243 -83t-234 103.5t-88 257.5q0 255 144.5 400.5t464.5 145.5l18 -49q-255 0 -381 -121q-61 -58 -61 -113.5t55 -55.5q-3 0 43.5 12t87.5 12q117 0 204 -86z" />
+<glyph unicode="&#x275c;" horiz-adv-x="862" d="M762 1083q0 -255 -144.5 -400.5t-464.5 -145.5l-18 49q255 0 381 121q61 58 61 113.5t-55 55.5q3 0 -43.5 -12t-87.5 -12q-117 0 -204 86t-87 213t97 210t243 83t234 -103.5t88 -257.5z" />
+<glyph unicode="&#x275d;" horiz-adv-x="1425" d="M1234 1068.5q91 -92.5 91 -223t-92 -218.5t-224 -88q-203 0 -291 211q-28 -90 -109.5 -150t-176.5 -61h-3q-148 0 -238 105q-91 106 -91 259q0 230 175 390q166 151 381 151h24l41 -51h-11q-136 0 -264 -71q-133 -73 -174 -200q78 39 145 39q184 0 279 -164 q50 200 200.5 323.5t354.5 123.5h18l41 -51h-10q-130 0 -264 -73q-139 -76 -174 -198q78 39 151 39q130 0 221 -92.5z" />
+<glyph unicode="&#x275e;" horiz-adv-x="1425" d="M1325 1079q0 -229 -175 -389q-167 -151 -383 -151h-22l-41 51h11q136 0 264 70q133 73 174 200q-82 -41 -146 -41q-180 0 -280 166q-48 -200 -199.5 -323t-355.5 -123h-17l-41 51h7q134 0 267 74q138 75 173 196q-81 -37 -150 -37q-130 0 -220.5 92t-90.5 222.5 t91.5 218.5t221.5 88q208 0 291 -211q29 91 111.5 151t177.5 60q150 0 241 -106t91 -259z" />
+<glyph unicode="&#x275f;" horiz-adv-x="862" d="M762 112q0 -255 -144.5 -400.5t-464.5 -145.5l-18 49q255 0 381 121q61 58 61 113.5t-55 55.5q3 0 -43.5 -12t-87.5 -12q-117 0 -204 86t-87 213t97 210t243 83t234 -103.5t88 -257.5z" />
+<glyph unicode="&#x2760;" horiz-adv-x="1425" d="M1325 108q0 -229 -175 -389q-167 -151 -383 -151h-22l-41 51h11q136 0 264 70q133 73 174 200q-82 -41 -146 -41q-180 0 -280 166q-48 -200 -199.5 -323t-355.5 -123h-17l-41 51h7q134 0 267 74q138 75 173 196q-81 -37 -150 -37q-130 0 -220.5 92t-90.5 222.5 t91.5 218.5t221.5 88q208 0 291 -211q29 91 111.5 151t177.5 60q150 0 241 -106t91 -259z" />
+<glyph unicode="&#x2761;" horiz-adv-x="1556" d="M1126 1257h-31v-696q0 -409 -56.5 -569t-169.5 -257.5t-260 -97.5t-249 84t-102 221q0 97 64.5 168.5t160.5 71.5q65 0 117.5 -46t52.5 -106t-32 -98.5t-87 -38.5q-69 0 -69 -60t57 -94t121 -34q119 0 201 86t120 211.5t43 431.5l-350 -27q-19 -1 -39 -1q-192 0 -340 110 q-178 133 -178 356q0 135 66.5 244t190 170t488.5 61h162v213l88 21v-234h361l-37 -53q-88 -37 -293 -37zM1009 1255h-194q-31 -223 -31 -327.5t4 -159.5l19 -238q110 -53 202 -61v786z" />
+<glyph unicode="&#x2762;" horiz-adv-x="1085" d="M985 1151q0 -91 -49 -170q-32 -52 -61 -73t-116 -59t-137.5 -87t-79.5 -152q-29 103 -78.5 151.5t-136 86.5t-114 56.5t-58.5 64.5q-55 82 -55 194q0 178 131 241q88 42 305.5 42t301.5 -35q147 -60 147 -260zM748 468q85 -85 85 -205.5t-85 -206t-205.5 -85.5 t-205.5 85.5t-85 206t85 205.5t205.5 85t205.5 -85z" />
+<glyph unicode="&#x2763;" horiz-adv-x="1171" d="M585 1202q26 99 90 170.5t166 71.5t166 -80.5t64 -189t-43.5 -188t-161.5 -130.5q-223 -96 -281 -248q-34 93 -100.5 146t-153 91t-115.5 58t-59 66q-57 86 -57 196.5t62 194.5t180 84q91 0 157 -73t86 -169zM792.5 468q85.5 -85 85.5 -205.5t-85.5 -206t-206 -85.5 t-205 85.5t-84.5 206t85 205.5t205 85t205.5 -85z" />
+<glyph unicode="&#x2764;" horiz-adv-x="1920" d="M1820 909q0 -149 -81 -265.5t-220 -166.5l-129 -47q-334 -122 -430 -348q-95 225 -432 348l-129 47q-129 47 -214 163t-85 267q0 185 115 305.5t288.5 120.5t293 -100.5t163.5 -261.5q50 164 165 263t289.5 99t290 -120t115.5 -304z" />
+<glyph unicode="&#x2765;" horiz-adv-x="1425" d="M1251 651q-147 0 -272 -119q-91 -86 -160 -276q-105 -285 -363 -285q-148 0 -252 106.5t-104 247.5t89 241.5t222 125.5v33q-132 23 -221.5 124.5t-89.5 244.5t108.5 246.5t256.5 103.5t251 -105q51 -52 122 -229.5t175 -253.5q123 -90 238 -90h45l29 4v-123l-29 4h-45z " />
+<glyph unicode="&#x2766;" horiz-adv-x="1808" d="M1748 1292q0 -136 -151.5 -244.5t-293.5 -108.5q-92 0 -208 52l-147 -322q-7 15 -7 45q0 134 76 313l-300 180q-203 118 -299.5 118t-164 -64.5t-67.5 -149.5q0 -47 29.5 -89.5t29.5 -49.5q0 -30 -33 -56.5t-64 -26.5q-88 0 -88 102q0 142 137 283t269.5 141t307.5 -129 l-10 76q81 92 171 92t147 -74.5t57 -168.5q0 -50 -20 -141q111 -71 230 -71q72 0 131.5 43t59.5 106t-39 96t-39 58q0 65 38.5 111t103.5 46t104.5 -50t39.5 -117zM1552 523q0 -180 -152 -299q-33 -25 -282 -157q-152 -81 -152 -169q0 -54 41 -92.5t95 -38.5q155 0 193 162 q4 22 8.5 43t18 34.5t51.5 13.5t71 -23.5t33 -63.5q0 -108 -143 -175q-116 -53 -239 -53q-301 0 -528.5 219t-227.5 519q0 181 78 304q92 146 263 146q110 0 178 -83q63 -75 63 -174q0 -10 -1 -20l23 -9q127 221 320 221q126 0 207.5 -89t81.5 -216zM1029 1090q14 42 14 100 t-38 118t-100 60q-80 0 -80 -87q0 -94 204 -191z" />
+<glyph unicode="&#x2767;" d="M2024 544q0 -48 -31 -102q-119 -209 -310.5 -322.5t-412.5 -113.5t-386 80q-208 100 -208 281q0 142 168 227q-76 136 -267 137q2 -134 -115 -254q-98 -99 -241 -158q23 -112 133 -112q67 0 117 48l4 -46q3 -29 3 -47q0 -69 -46.5 -106.5t-128.5 -37.5t-146.5 67 t-70.5 161q-30 4 -62 18q15 69 59 116q4 146 128.5 260.5t276.5 143.5q-29 59 -136 79q-138 25 -163 40q-70 42 -70 129q0 155 207 159q-38 -30 -38 -80q0 -67 129.5 -158t157.5 -167q28 4 52 4q126 0 257 -116l5 6q-48 90 -48 167q0 109 80.5 174.5t191.5 65.5t194 -52 q148 -93 199 -246q11 -31 45 -252q20 -132 94 -175q31 -18 86 -18t98.5 42.5t43.5 97t-22 94.5q32 54 86 54q87 0 87 -88zM514 690q0 21 -6 40q-115 -5 -206.5 -94.5t-91.5 -203.5v-14q105 33 193 100q111 84 111 172z" />
+<glyph unicode="&#x2768;" horiz-adv-x="948" d="M49 582q0 409 209 653.5t612 301.5l29 -41q-234 -52 -384 -303.5t-150 -610.5t150 -610.5t384 -303.5l-29 -41q-403 57 -612 301.5t-209 653.5z" />
+<glyph unicode="&#x2769;" horiz-adv-x="870" d="M860 582q0 -409 -209 -653.5t-612 -301.5l-29 41q234 52 384 303.5t150 610.5t-150 610.5t-384 303.5l29 41q403 -57 612 -301.5t209 -653.5z" />
+<glyph unicode="&#x276a;" horiz-adv-x="815" d="M82 582q0 488 356 920h295q-229 -412 -229 -920t229 -920h-295q-356 432 -356 920z" />
+<glyph unicode="&#x276b;" horiz-adv-x="779" d="M715 582q0 -488 -356 -920h-295q229 412 229 920t-229 920h295q356 -432 356 -920z" />
+<glyph unicode="&#x276c;" horiz-adv-x="692" d="M629 -367h-291l-275 949l275 949h291l-277 -949z" />
+<glyph unicode="&#x276d;" horiz-adv-x="692" d="M629 582l-275 -949h-291l277 949l-277 949h291z" />
+<glyph unicode="&#x276e;" horiz-adv-x="1053" d="M1016 -131h-398l-581 713l581 713h398l-584 -713z" />
+<glyph unicode="&#x276f;" horiz-adv-x="1053" d="M1016 582l-581 -713h-398l584 713l-584 713h398z" />
+<glyph unicode="&#x2770;" horiz-adv-x="1128" d="M1032 -367h-661l-275 949l275 949h661l-276 -949z" />
+<glyph unicode="&#x2771;" horiz-adv-x="1128" d="M1032 582l-275 -949h-661l276 949l-276 949h661z" />
+<glyph unicode="&#x2772;" horiz-adv-x="651" d="M545 -336l-60 -33l-379 228v1446l379 228l60 -33l-301 -221v-1394z" />
+<glyph unicode="&#x2773;" horiz-adv-x="487" d="M463 -141l-379 -228l-60 33l301 221v1394l-301 221l60 33l379 -228v-1446z" />
+<glyph unicode="&#x2774;" horiz-adv-x="1024" d="M549 -378q-162 0 -218.5 72.5t-56.5 300t-1 251.5q-10 164 -55 227q-56 77 -200 93v32q144 16 200 93q45 63 55 227q1 24 1 251.5t56.5 300t218.5 72.5h457l-1 -57q-136 -5 -185.5 -48t-49.5 -273t-1 -251q-9 -170 -54 -231q-57 -78 -199 -100q142 -22 199 -100 q45 -61 54 -231q1 -21 1 -251t49.5 -273t185.5 -48l1 -57h-457z" />
+<glyph unicode="&#x2775;" horiz-adv-x="1024" d="M751 246q-1 -24 -1 -251.5t-56.5 -300t-218.5 -72.5h-457l1 57q136 5 185.5 48t49.5 273t1 251q9 170 54 231q57 78 199 100q-142 22 -199 100q-45 61 -54 231q-1 21 -1 251t-49.5 273t-185.5 48l-1 57h457q162 0 218.5 -72.5t56.5 -300t1 -251.5q10 -164 55 -227 q56 -77 200 -93v-32q-144 -16 -200 -93q-45 -63 -55 -227z" />
+<glyph unicode="&#x2776;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1355 17v75h-152q-60 0 -60 61v992h-59q-170 -92 -391 -106v-72h172q63 0 63 -54v-736q0 -85 -83 -85h-119v-75h629z" />
+<glyph unicode="&#x2777;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1194 227h-374q72 80 243.5 205.5t232.5 199.5q90 112 90 245t-102 214t-249 81t-250.5 -84.5t-103.5 -231.5q0 -75 33.5 -133t96.5 -58t101 36.5t38 93t-43 84.5 q-9 5 -81 31q-43 16 -43 44q0 60 61.5 96.5t125.5 36.5q170 0 170 -210q0 -136 -95 -286q-58 -91 -205 -255t-197 -244v-69h737l25 389h-82q-14 -86 -31 -122q-31 -63 -98 -63z" />
+<glyph unicode="&#x2778;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM891 564l91 12q171 0 171 -252.5t-195 -252.5q-49 0 -107 24t-58 65q0 15 55.5 55t55.5 94t-34.5 86.5t-92.5 32.5t-92 -45t-34 -112q0 -139 110 -213q95 -65 252 -65t263 76 q121 87 121 249q0 236 -267 307q224 91 224 267q0 136 -103.5 208t-236.5 72t-227 -67.5t-94 -186.5q0 -57 33 -98.5t85.5 -41.5t86 32t33.5 81t-45.5 89t-45.5 54q0 58 114 58q174 0 174 -217.5t-155 -217.5l-73 6q-56 0 -56 -49.5t47 -49.5z" />
+<glyph unicode="&#x2779;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1360 296v90h-161v782h-76l-553 -762v-110h416v-112q0 -74 -55 -89q-13 -3 -116 -3v-75h505v75q-64 0 -81 5q-40 13 -40 61v138h161zM986 386h-335l335 464v-464z" />
+<glyph unicode="&#x277a;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1278.5 101q115.5 108 115.5 280.5t-106 278.5t-270 106q-96 0 -215 -54l17 223q96 -16 177 -16q192 0 278 123q42 60 42 114q0 16 -12 16q-4 0 -34 -10q-79 -26 -202 -26 t-307 37l-35 -519q-42 -59 -42 -94q0 -48 50 -48q59 0 59 111q96 55 169 55q181 0 181 -284q0 -321 -195 -321q-49 0 -97 18q-62 23 -62 63q0 12 61.5 49.5t61.5 92.5t-35 88t-93 33t-94.5 -46t-36.5 -113q0 -125 98 -195t229 -70q182 0 297.5 108z" />
+<glyph unicode="&#x277b;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1037 -7q173 0 275 109.5t102 278t-91 251.5t-211 83t-225 -112v19q0 478 213 478q69 0 69 -45q0 -10 -16.5 -44t-16.5 -71t30.5 -70t82.5 -33t87 38.5t35 94.5q0 97 -91 153 q-77 49 -180 49q-191 0 -321 -161q-145 -180 -145 -477q0 -222 88 -367q106 -174 315 -174zM1043 607q137 0 137 -269t-145 -269q-83 0 -122 106q-27 75 -27 189t47 178.5t110 64.5z" />
+<glyph unicode="&#x277c;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1398 1147h-557q-61 0 -105 16h-32l-54 -404h74q31 129 54.5 157t74.5 28h398l-204 -365q-161 -288 -161 -459q0 -127 116 -127q88 0 121 80q14 33 23.5 144.5t38.5 314.5 q42 202 213 545v70z" />
+<glyph unicode="&#x277d;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1414 363q0 125 -63 196.5t-190 125.5q198 102 198 248q0 114 -114 182q-96 57 -229 57t-236 -90t-103 -231q0 -186 214 -288q-257 -87 -257 -276q0 -147 121 -226 q103 -68 268.5 -68t278 98.5t112.5 271.5zM1211 908q0 -117 -113 -201q-122 44 -170 76q-91 60 -91 143t52 128.5t134 45.5t135 -52.5t53 -139.5zM962 534q181 -70 241.5 -123.5t60.5 -143t-67 -144.5t-168.5 -55t-159.5 62.5t-58 167.5q0 172 151 236z" />
+<glyph unicode="&#x277e;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1414 643q0 218 -87 359q-105 170 -310 170q-176 0 -279.5 -110t-103.5 -287q0 -136 81.5 -228.5t215.5 -92.5q106 0 232 104q-3 -350 -114 -446q-51 -44 -112 -44t-61 42 q0 15 17 50t17 57q0 49 -32 83t-84 34t-87 -40.5t-35 -97.5q0 -94 95 -152q82 -51 182 -51q189 0 318 163q147 185 147 487zM1168 841q0 -106 -31 -179q-43 -100 -134 -100q-138 0 -138 250q0 287 151.5 287t151.5 -258z" />
+<glyph unicode="&#x277f;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1668 203q73 160 73 376.5t-72 378.5q-94 214 -285.5 214t-287.5 -213q-72 -160 -72 -376t75 -380q98 -210 285.5 -210t283.5 210zM867 17v75q-57 0 -72 5q-35 11 -35 56v992 h-59q-103 -56 -169 -77.5t-169 -28.5v-72h119q63 0 63 -54v-736q0 -66 -46 -80q-14 -5 -103 -5v-75h471zM1385 1097q110 0 110 -513t-115 -513q-110 0 -110 485q0 541 115 541z" />
+<glyph unicode="&#x2780;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1348 46h-648v149h225v642h-225v137h3q241 0 250 148h175v-927h220v-149z" />
+<glyph unicode="&#x2781;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1416 46h-784v164q175 139 258 212q165 147 214 230.5t49 155.5 q0 166 -195 166q-139 0 -283 -96h-15v195q147 67 319.5 67t273.5 -70q116 -81 116 -244t-172 -348q-85 -92 -310 -268h529v-164z" />
+<glyph unicode="&#x2782;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1412 368q0 -171 -132 -263q-115 -81 -302.5 -81t-341.5 68v193h20 q148 -93 304 -93q238 0 238 189q0 114 -110 145q-48 14 -203 14v156q136 0 190 17q104 31 104 134q0 127 -199 127q-146 0 -296 -93h-17v191q155 68 323 68t268 -53q129 -67 129 -210q0 -89 -58.5 -157.5t-147.5 -86.5v-11q231 -35 231 -254z" />
+<glyph unicode="&#x2783;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1412 321h-154v-276h-201v276h-516v184l511 613h206v-642h154v-155zM1057 476 v436l-363 -436h363z" />
+<glyph unicode="&#x2784;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1407 398q0 -180 -129 -281q-117 -93 -306.5 -93t-330.5 63v195h21 q147 -90 292 -90q240 0 240 202q0 175 -268 175q-65 0 -111.5 -8.5t-130.5 -20.5v578h704v-165h-504v-230q52 4 118 4q405 0 405 -329z" />
+<glyph unicode="&#x2785;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1339 655.5q94 -90.5 94 -257t-113.5 -270.5t-286.5 -104q-216 0 -323 145 q-94 129 -94 352q0 286 133 445q143 172 424 172q91 0 163 -17v-174h-18q-65 31 -157 31q-144 0 -230 -81.5t-101 -225.5q123 75 252 75q163 0 257 -90.5zM1221 393q0 200 -217 200q-89 0 -176 -42q-2 -40 -2 -67q0 -310 208 -310q93 0 140 61.5t47 157.5z" />
+<glyph unicode="&#x2786;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM631 953v165h787v-187l-485 -885h-232l510 907h-580z" />
+<glyph unicode="&#x2787;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1441 345q0 -157 -126.5 -240.5t-294 -83.5t-280.5 72q-133 85 -133 246 q0 177 205 264v5q-176 86 -176 248q0 140 130 220q110 67 260.5 67t256.5 -59q130 -73 130 -213q0 -164 -185 -245v-5q213 -85 213 -276zM1207 855q0 71 -53.5 107t-126 36t-121.5 -30q-60 -35 -60 -99.5t109 -129.5q56 -34 158 -65q94 78 94 181zM1230 332q0 56 -27.5 93 t-127.5 78l-147 53q-112 -75 -112 -195q0 -89 62.5 -141.5t149.5 -52.5t144.5 42.5t57.5 122.5z" />
+<glyph unicode="&#x2788;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1433 645q0 -286 -139.5 -453t-419.5 -167q-95 0 -162 18v174h17 q67 -32 158 -32q145 0 230.5 81t100.5 227q-126 -75 -252 -75q-162 0 -256 90t-94 256.5t115 271t287 104.5q415 0 415 -495zM1222 680q0 310 -206 310q-92 0 -140.5 -62.5t-48.5 -157.5q0 -199 218 -199q93 0 175 42q2 54 2 67z" />
+<glyph unicode="&#x2789;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1898 582q0 364 -255 619t-619 255t-619 -255t-255 -619t255 -619t619 -255t619 255t255 619zM1663 955q58 -128 58 -374.5t-57 -372.5q-84 -184 -300 -184t-299 184 q-57 127 -57 374t57 374q84 184 299 184t299 -185zM867 46h-448v149h125v642h-125v137h4q76 0 110 34q35 34 39 114h175v-927h120v-149zM1509 541v82q0 359 -145 359t-145 -352v-86q0 -361 145 -361t145 358z" />
+<glyph unicode="&#x278a;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1366 17v157h-232v977h-185q-9 -156 -264 -156h-3v-144h238v-677h-238v-157h684z" />
+<glyph unicode="&#x278b;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1437 17v173h-557q237 186 327 282q181 194 181 366.5t-123 257.5q-106 74 -288.5 74t-336.5 -70v-206h16q152 101 298 101q206 0 206 -175q0 -75 -46 -155 q-80 -140 -503 -475v-173h826z" />
+<glyph unicode="&#x278c;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1433 356q0 112 -65.5 181.5t-178.5 86.5v12q93 19 155.5 91t62.5 166q0 150 -136 222q-105 55 -283 55t-340 -71v-202h18q158 98 312 98q209 0 209 -134q0 -108 -111 -142 q-56 -17 -199 -17v-164q163 0 214 -15q116 -33 116 -153q0 -199 -250 -199q-165 0 -321 98h-21v-204q161 -71 359 -71t320 85q139 97 139 277z" />
+<glyph unicode="&#x278d;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1433 307v163h-162v677h-217l-539 -646v-194h544v-291h212v291h162zM1059 470h-383l383 460v-460z" />
+<glyph unicode="&#x278e;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM666 538q156 30 255 30q282 0 282 -184q0 -108 -70.5 -160.5t-182.5 -52.5q-153 0 -308 95h-22v-206q148 -66 348 -66t324 98q136 106 136 296q0 347 -427 347q-73 0 -125 -4 v242h532v174h-742v-609z" />
+<glyph unicode="&#x278f;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1033 -6q182 0 302 109.5t120 285t-99 271t-271 95.5q-135 0 -265 -79q16 152 106.5 237.5t241.5 85.5q98 0 166 -32h19v183q-77 18 -172 18q-296 0 -447 -181 q-140 -167 -140 -469q0 -235 99 -370q113 -154 340 -154zM1232 383q0 -101 -49.5 -166t-147.5 -65q-220 0 -220 327q0 31 2 70q93 45 186 45q229 0 229 -211z" />
+<glyph unicode="&#x2790;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1439 1147h-829v-174h611l-537 -956h244l511 933v197z" />
+<glyph unicode="&#x2791;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1464 332q0 202 -225 291v5q195 85 195 259q0 147 -138 224q-111 62 -269.5 62t-274.5 -71q-137 -84 -137 -231q0 -172 186 -262v-5q-217 -91 -217 -278q0 -169 141 -259 q119 -76 295.5 -76t300.5 81q143 95 143 260zM1217 870q0 -110 -99 -191q-282 86 -282 204q0 68 58 103t134 35t132.5 -38t56.5 -113zM1241 318q0 -84 -61 -128.5t-152.5 -44.5t-157 55t-65.5 149q0 127 118 206l155 -56q106 -44 134.5 -83t28.5 -98z" />
+<glyph unicode="&#x2792;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1455 648q0 522 -437 522q-182 0 -303 -110t-121 -285t99 -270.5t270 -95.5q134 0 265 79q-16 -153 -105.5 -238.5t-242.5 -85.5q-97 0 -167 33h-18v-183q71 -19 171 -19 q295 0 448 182q141 170 141 471zM1233 685q0 -22 -2 -70q-88 -45 -185 -45q-230 0 -230 210q0 100 51.5 166t148.5 66q217 0 217 -327z" />
+<glyph unicode="&#x2793;" d="M1998 582q0 -406 -284 -690t-690 -284t-690 284t-284 690t284 690t690 284t690 -284t284 -690zM1698 188q61 134 61 393t-62 394q-89 195 -315.5 195t-314.5 -195q-60 -134 -60 -393.5t60 -392.5q88 -195 315.5 -195t315.5 194zM859 17v157h-127v977h-184 q-4 -84 -41 -121q-36 -35 -117 -35h-4v-144h132v-677h-132v-157h473zM1535 519q0 -358 -152.5 -358t-152.5 353v144q0 346 152.5 346t152.5 -355v-130z" />
+<glyph unicode="&#x2794;" horiz-adv-x="1890" d="M100 569v279h1184l-443 450h367l582 -589l-582 -590h-367l443 450h-1184z" />
+<glyph unicode="&#x2795;" horiz-adv-x="1613" d="M1513 586h-588v-586h-239v586h-586v245h586v586h239v-586h588v-245z" />
+<glyph unicode="&#x2796;" horiz-adv-x="1613" d="M1513 586h-1413v245h1413v-245z" />
+<glyph unicode="&#x2797;" horiz-adv-x="1613" d="M1513 586h-1413v245h1413v-245zM925 1172h-239v245h239v-245zM925 0h-239v245h239v-245z" />
+<glyph unicode="&#x2798;" horiz-adv-x="1558" d="M1458 193l-774 104l172 231l-756 441l180 254l666 -568l160 238z" />
+<glyph unicode="&#x2799;" horiz-adv-x="1951" d="M1851 709l-805 -422l164 366l-1110 -137v385l1110 -137l-164 366z" />
+<glyph unicode="&#x279a;" horiz-adv-x="1558" d="M1458 1223l-352 -701l-160 238l-666 -567l-180 253l756 441l-172 231z" />
+<glyph unicode="&#x279b;" horiz-adv-x="1939" d="M1839 709l-615 -136l-587 -233l-13 6l219 344l-743 -26v90l743 -27l-219 342l13 8l587 -233z" />
+<glyph unicode="&#x279c;" horiz-adv-x="1955" d="M1376 166q-88 -100 -167.5 -100t-133 53t-53.5 135t71 160l127 106h-884q-114 0 -164 39q-72 56 -72 143t54 141t173 54h893l-114 109q-84 80 -84 156.5t53.5 133t133.5 56.5t161 -92l485 -551z" />
+<glyph unicode="&#x279d;" horiz-adv-x="1953" d="M1409 677h-1309v64h1309v410l444 -442l-444 -442v410z" />
+<glyph unicode="&#x279e;" horiz-adv-x="2034" d="M1934 582l-621 -502l78 318l-1291 -72l63 256l-63 254l1291 -71l-78 320z" />
+<glyph unicode="&#x279f;" horiz-adv-x="2042" d="M1942 582l-622 -460l71 248l-627 -35l72 247l-72 246l627 -34l-71 248zM776 582l-72 -251l-188 -9l71 260l-71 260l188 -10zM500 582l-70 -265l-114 -6l71 271l-71 271l114 -6zM233 582l-72 -280l-61 -3l71 283l-71 283l61 -2z" />
+<glyph unicode="&#x27a0;" horiz-adv-x="2134" d="M2034 582q-460 -187 -651 -602h-18l42 256l-409 -22l71 368l-71 368l409 -21l-42 255h18q191 -416 651 -602zM1012 582l-72 -372l-177 -8l71 380l-71 382l177 -10zM741 582l-71 -385l-122 -7l70 392l-70 394l122 -8zM399 582l-71 406l80 -5l70 -401l-70 -400l-80 -4z M228 582q0 3 -24 -138l-47 -276l-57 -2l71 416l-71 416l57 -2z" />
+<glyph unicode="&#x27a1;" horiz-adv-x="2134" d="M2034 582l-651 -602h-18l42 256l-1307 -70v832l1307 -69l-42 255h18z" />
+<glyph unicode="&#x27a2;" horiz-adv-x="1949" d="M1849 709l-1749 -508l602 508l-602 508zM1656 709l-1308 360l446 -360h862z" />
+<glyph unicode="&#x27a3;" horiz-adv-x="1949" d="M1849 709l-1749 -508l602 508l-602 508zM1656 709h-862l-446 -361z" />
+<glyph unicode="&#x27a4;" horiz-adv-x="1935" d="M1835 709l-1735 -709l412 709l-412 708z" />
+<glyph unicode="&#x27a5;" horiz-adv-x="1963" d="M1144 340h-669q-194 0 -281 92q-62 66 -78 135.5t-16 184.5v493h82v-33q0 -170 85 -223q62 -39 241 -39h636v172l719 -475l-719 -475v168z" />
+<glyph unicode="&#x27a6;" horiz-adv-x="1963" d="M1144 465h-634q-181 0 -242 -38q-86 -52 -86 -222v-33h-82v494q0 113 16.5 183t77.5 134q90 94 281 94h669v168l719 -475l-719 -475v170z" />
+<glyph unicode="&#x27a7;" horiz-adv-x="1007" d="M362 0h-262v1233h262v295l545 -911l-545 -912v295z" />
+<glyph unicode="&#x27a8;" horiz-adv-x="1865" d="M909 145v191h-809v747h809v193h22q140 -226 360 -375.5t474 -179.5v-19q-242 -37 -438 -157q-115 -70 -265 -240q-97 -109 -131 -160h-22z" />
+<glyph unicode="&#x27a9;" horiz-adv-x="1771" d="M862 90v322h-762v594h762v321h282l527 -618l-527 -619h-282zM915 954h-762v-491h762v-330l512 576l-512 575v-330z" />
+<glyph unicode="&#x27aa;" horiz-adv-x="1771" d="M835 90v322h-735v594h735v321h254l582 -618l-582 -619h-254zM1058 954h-749v-491h749v-330l541 576l-541 575v-330z" />
+<glyph unicode="&#x27ab;" horiz-adv-x="1832" d="M815 395h-715v264l371 377h788l139 174l334 -376v-238l-917 -389v188zM1687 821l-287 324l-122 -152h-791l-344 -354h850l-121 -162z" />
+<glyph unicode="&#x27ac;" horiz-adv-x="1832" d="M100 1022h715v188l917 -389v-237l-334 -377l-139 174h-788l-371 377v264zM1687 596l-815 344l121 -162h-850l344 -354h791l122 -152z" />
+<glyph unicode="&#x27ad;" horiz-adv-x="1482" d="M604 252h-328l-176 168v692h504v215l778 -663l-602 -574l-176 129v33zM657 1053h-500v-598h500v-203l528 500l-528 454v-153z" />
+<glyph unicode="&#x27ae;" horiz-adv-x="1482" d="M604 305h-504v692l176 168h328v33l176 129l602 -573l-778 -664v215zM657 963h-500v-598h500v-154l528 455l-528 499v-202z" />
+<glyph unicode="&#x27af;" horiz-adv-x="1849" d="M1187 354h-946l-141 140l141 266l-137 321h1083v187l562 -559l-562 -551v196zM1237 1028h-1051l111 -268l-140 -266h1080v-109l381 375l-381 391v-123z" />
+<glyph unicode="&#x27b0;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x27b1;" horiz-adv-x="1849" d="M1187 336h-1083l137 321l-141 267l141 139h946v197l562 -551l-562 -559v186zM1237 924h-1080l140 -267l-111 -268h1051v-123l381 391l-381 375v-108z" />
+<glyph unicode="&#x27b2;" horiz-adv-x="1613" d="M1513 709q0 -291 -213.5 -500t-595.5 -209q-198 0 -367 61q-229 83 -237 242h725v-246l639 652l-639 651v-246h-725q24 161 223 236q177 67 381 67q346 0 563 -182q246 -206 246 -526z" />
+<glyph unicode="&#x27b3;" horiz-adv-x="1994" d="M1527 328q-69 75 -69 181t69 175h-450l-248 -356h-729l268 381l-268 383h729l248 -359h450q-69 72 -69 178t69 181q125 -307 367 -383q-246 -85 -367 -381zM1013 733l-215 307h-100l213 -307h102zM845 733l-213 307h-100l211 -307h102zM680 733l-213 307h-105l215 -307 h103zM1011 684h-100l-209 -305h98zM512 733l-215 307h-99l213 -307h101zM845 684h-100l-211 -305h103zM680 684h-105l-209 -305h107zM510 684h-101l-207 -305h99z" />
+<glyph unicode="&#x27b4;" horiz-adv-x="1638" d="M993 862q0 -129 33 -309l-533 446l-33 342l533 -446v-33zM1228 125q-83 0 -143 -21q1 55 51.5 107.5t104.5 60.5l-256 215l49 60l256 -215q6 64 47 120t100 72l-6 -61q0 -170 107 -369l-15 -18q-150 49 -295 49zM977 492l-342 -29l-535 448l346 27z" />
+<glyph unicode="&#x27b5;" horiz-adv-x="1828" d="M1374 434q-29 46 -29 116.5t39 117.5h-334v82h334q-41 53 -41 123.5t31 109.5q106 -162 354 -262v-25q-247 -101 -354 -262zM1040 750h-692l-248 235h694q114 -136 246 -235zM1040 668l-244 -244h-696l248 244h692z" />
+<glyph unicode="&#x27b6;" horiz-adv-x="1638" d="M1228 1292q145 0 295 49l15 -18q-107 -199 -107 -369l6 -61q-59 16 -100 72t-47 120l-256 -215l-49 60l256 215q-54 8 -104.5 60.5t-51.5 107.5q60 -21 143 -21zM977 926l-531 -447h-16l-330 27l535 448l18 -4zM993 555v-33l-533 -446l33 342l533 446q-33 -180 -33 -309z " />
+<glyph unicode="&#x27b7;" horiz-adv-x="1877" d="M1777 -39q-141 47 -331 47t-388 -39q205 205 385 226l-192 159q-186 154 -305 154q-77 0 -166.5 -38t-149.5 -93l-530 444q159 152 354 152q77 0 146 -27q-56 103 -56 234t91 278l530 -444q-80 -125 -80 -271q0 -104 67 -193q41 -55 148 -144l189 -158l-3 41q-1 11 -1 22 q0 156 157 355v-82q0 -361 135 -623z" />
+<glyph unicode="&#x27b8;" horiz-adv-x="2037" d="M1282 674q-229 0 -318 -64q-64 -46 -113 -139.5t-59 -177.5h-692q13 140 93 255t208 161q-260 101 -301 415h692q18 -187 144 -295q66 -57 166 -75q61 -11 184 -11h246q-142 142 -150 420q240 -322 555 -454q-274 -110 -555 -455q23 286 150 420h-250z" />
+<glyph unicode="&#x27b9;" horiz-adv-x="1877" d="M1642 836v-82q-157 199 -157 354q0 11 1 22l3 41l-189 -157q-106 -88 -148 -144q-67 -90 -67 -194q0 -145 80 -270l-530 -445q-91 147 -91 278t56 234q-69 -27 -146 -27q-195 0 -354 152l530 444q60 -55 149.5 -93t166.5 -38q120 0 305 154l192 160q-181 21 -385 225 q198 -39 388 -39t331 47q-135 -262 -135 -622z" />
+<glyph unicode="&#x27ba;" horiz-adv-x="1759" d="M1288 309q-50 -78 -122 -78t-114.5 41.5t-42.5 106.5t53.5 118t122.5 78l283 103l51 12l-4 4l-452 -37l-463 -108q-227 -53 -275 -53q-102 0 -163.5 55.5t-61.5 157.5q0 215 225 215q41 0 262 -52l451 -106l477 -41l4 4l-309 105q-78 27 -140.5 82t-62.5 122.5 t43.5 107.5t108.5 40q105 0 149 -121q57 -157 127.5 -231t223.5 -115v-21q-134 -32 -212.5 -103.5t-125.5 -201.5q-9 -30 -33 -84z" />
+<glyph unicode="&#x27bb;" horiz-adv-x="1842" d="M1195 352.5q-44 71.5 -44 145t31 115.5t100 83v4h-49q-115 0 -227.5 -35t-216 -125t-152.5 -120q-85 -51 -178 -51t-166 75q-37 38 -75.5 151.5t-117.5 113.5q78 16 117 126.5t86 158.5q62 63 170 63t216 -86q182 -146 206 -160q147 -86 348 -86h39v4q-133 74 -133 193 q0 76 45 149.5t112 112.5q26 -137 157 -270t279 -205q-145 -66 -277 -198.5t-159 -268.5q-67 39 -111 110.5z" />
+<glyph unicode="&#x27bc;" horiz-adv-x="1953" d="M1777 821q76 -73 76 -117.5t-80 -119.5l-184 -172q-88 -82 -132 -82t-91 23t-47 59q0 19 22.5 66.5t22.5 70.5q0 51 -93 51h-114q-107 0 -140.5 -16.5t-101.5 -100.5l-65 -80q-59 -73 -83.5 -84.5t-117.5 -11.5h-451q-98 0 -98 62q0 21 16 45l25 37l121 196q26 35 26 60 t-53 108l-90 141q-45 71 -45 95q0 59 115 59h446q81 0 102.5 -9t71.5 -69l80 -96q70 -83 101 -100t133 -17h116q49 0 63 4q36 9 36 40t-22.5 76t-22.5 60q0 82 135 82q53 0 110 -55z" />
+<glyph unicode="&#x27bd;" horiz-adv-x="2035" d="M1872 815q63 -64 63 -106.5t-63 -106.5l-336 -340q-75 -76 -126 -76t-85.5 35t-34.5 75.5t8 72.5l25 100q10 40 10 59q0 62 -74 62t-110 -43q-15 -17 -74 -123l-78 -139q-48 -86 -114 -111q-47 -18 -162 -18h-467q-154 0 -154 149q0 40 20 103l72 227q14 44 14 72.5 t-14 72.5l-72 228q-20 63 -20 108q0 146 154 146h467q110 0 157 -16q70 -24 113 -101l84 -152q52 -94 64 -109q44 -57 104 -57q90 0 90 62q0 19 -10 59l-25 101q-8 32 -8 72t34.5 75t85.5 35t126 -76z" />
+<glyph unicode="&#x27be;" horiz-adv-x="1941" d="M1841 709q-336 -204 -527 -506h-124q211 322 483 506q-286 196 -486 505h127q166 -280 527 -505zM100 788v97h1047q-162 166 -248 329h114q142 -231 390 -426h-1303zM100 530v99h1303q-239 -187 -385 -426h-115q109 198 244 327h-1047z" />
+<glyph unicode="&#x27bf;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x27c0;" horiz-adv-x="1573" d="M1434 41q0 -41 -68 -41h-1139q-61 0 -66 35q-2 11 -2 33v1269q0 68 41 68t41 -68v-1192l884 1017q13 15 30 15q43 0 43 -42q0 -14 -11 -27l-892 -1026h1071q68 0 68 -41z" />
+<glyph unicode="&#x27c1;" d="M1986 35q0 -35 -44 -35h-1836q-44 0 -44 35q0 14 9 28l918 1466q14 23 35 23t35 -23l918 -1466q9 -14 9 -28zM1868 82l-844 1348l-844 -1348h1688zM1461 326q0 -35 -44 -35h-786q-44 0 -44 35q0 14 9 28l393 627q16 25 35 25t35 -25l393 -627q9 -14 9 -28zM1343 373 l-319 509l-319 -509h638z" />
+<glyph unicode="&#x27c2;" horiz-adv-x="1591" d="M1479 41q0 -41 -37 -41h-1288q-39 0 -39 41t39 41h602v1245q0 37 41 37t41 -37v-1245h604q37 0 37 -41z" />
+<glyph unicode="&#x27c3;" horiz-adv-x="1591" d="M1421 41q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h584q39 0 39 -41zM1301 810q95 -95 95 -228.5t-94.5 -228t-227.5 -94.5t-227.5 94.5t-94.5 228 t95 228.5t227 95t227 -95zM1243.5 411.5q70.5 70.5 70.5 170t-71 170.5t-169 71t-169 -71t-71 -170.5t70.5 -170t169.5 -70.5t169.5 70.5z" />
+<glyph unicode="&#x27c4;" horiz-adv-x="1591" d="M1421 582q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41t39 41h584q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5zM744.5 810.5q94.5 -94.5 94.5 -228t-95 -228.5t-227 -95t-227 95t-95 228.5 t94.5 228t227.5 94.5t227.5 -94.5zM686 412q71 71 71 170.5t-70.5 170t-169.5 70.5t-169.5 -70.5t-70.5 -170t71 -170.5t169 -71t169 71z" />
+<glyph unicode="&#x27c5;" horiz-adv-x="1024" d="M739 -317q0 -33 -63 -33q-173 0 -282 143.5t-109 310t88 337.5l164 285q88 169 88 323q0 236 -147 345q-43 32 -142 52q-51 10 -51 35q0 33 63 33q173 0 282 -143.5t109 -311t-88 -338.5l-164 -285q-88 -169 -88 -321q0 -236 147 -345q43 -32 142 -52q51 -10 51 -35z" />
+<glyph unicode="&#x27c6;" horiz-adv-x="1024" d="M651 441q88 -171 88 -337.5t-109 -310t-282 -143.5q-63 0 -63 33q0 25 56.5 36t79.5 18.5t57 32.5q147 109 147 345q0 152 -88 321l-164 285q-88 171 -88 338.5t109 311t282 143.5q63 0 63 -33q0 -25 -56.5 -36t-79.5 -18.5t-57 -32.5q-147 -109 -147 -345 q0 -154 88 -323z" />
+<glyph unicode="&#x27c7;" horiz-adv-x="1364" d="M1249 1183q0 -11 -2 -16l-526 -1188q-11 -25 -39 -25t-39 25l-526 1188q-2 5 -2 16q0 41 41 41q26 0 37 -25l489 -1103l489 1103q11 25 37 25q41 0 41 -41zM791 867q0 -45 -32 -77t-77 -32t-77 32t-32 77t32 77t77 32t77 -32t32 -77z" />
+<glyph unicode="&#x27c8;" horiz-adv-x="1991" d="M1821 41q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h584q39 0 39 -41zM569 -311q0 -41 -39 -41q-33 0 -40 26l-488 1788q-2 7 -2 13q0 41 39 41 q33 0 40 -26l488 -1788q2 -7 2 -13z" />
+<glyph unicode="&#x27c9;" horiz-adv-x="1991" d="M1421 582q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41t39 41h584q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5zM1991 1475q0 -6 -2 -13l-488 -1788q-7 -26 -40 -26q-39 0 -39 41q0 6 2 13 l488 1788q7 26 40 26q39 0 39 -41z" />
+<glyph unicode="&#x27ca;" horiz-adv-x="1194" d="M1024 582q0 -41 -37 -41h-349v-846q0 -37 -41 -37t-41 37v846h-347q-39 0 -39 41t39 41h347v846q0 37 41 37t41 -37v-846h349q37 0 37 -41z" />
+<glyph unicode="&#x27cb;" horiz-adv-x="1174" d="M964 1505q0 -8 -2 -13l-673 -1848q-9 -26 -40 -26q-39 0 -39 41q0 8 2 13l673 1848q9 26 40 26q39 0 39 -41z" />
+<glyph unicode="&#x27cc;" horiz-adv-x="1221" d="M1083 1294q0 -41 -41 -41h-787q63 -225 63 -483t-60 -494q-5 -24 -19 -70q-12 -29 -38 -29q-42 0 -42 39q0 7 2 14q75 268 75 537t-75 514q-3 10 -3 17q0 37 42 37h842q41 0 41 -41z" />
+<glyph unicode="&#x27cd;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x27ce;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 -29v1222h-1220v-1222h44l527 1189q11 25 38.5 25t39.5 -25l526 -1189h45zM1271 -29l-475 1072l-474 -1072h949z" />
+<glyph unicode="&#x27cf;" horiz-adv-x="1591" d="M1488 -74q0 -37 -39 -37h-1308q-37 0 -37 37v1310q0 39 37 39h1308q39 0 39 -39v-1310zM1270 1193h-949l476 -1072zM1406 -29v1222h-44l-526 -1189q-12 -25 -39.5 -25t-38.5 25l-527 1189h-45v-1222h1220z" />
+<glyph unicode="&#x27d0;" horiz-adv-x="1591" d="M1550 609q11 -11 11 -27.5t-10 -26.5l-727 -727q-11 -11 -27.5 -11t-27.5 11l-728 729q-10 10 -10 26t11 27l727 727q10 10 26 10t26 -10zM1461 581l-666 666l-664 -664l666 -666zM1046 582q0 -104 -73 -177t-177.5 -73t-177 73t-72.5 177t72.5 177t177 73t177.5 -73 t73 -177z" />
+<glyph unicode="&#x27d1;" horiz-adv-x="1364" d="M1249 -4q0 -41 -41 -41q-26 0 -37 25l-489 1103l-489 -1103q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l526 1188q11 25 39 25t39 -25l526 -1188q2 -5 2 -16zM791 312q0 -45 -32 -77t-77 -32t-77 32t-32 77t32 77t77 32t77 -32t32 -77z" />
+<glyph unicode="&#x27d2;" horiz-adv-x="1364" d="M1264 623q0 -253 -166 -438t-416 -185t-416 185t-166 438v364q0 37 41 37t41 -37v-358q0 -201 132 -373t327 -172v903q0 37 41 37t41 -37v-903q195 0 327 172t132 373v358q0 37 41 37t41 -37v-364z" />
+<glyph unicode="&#x27d3;" horiz-adv-x="1024" d="M907 -8q0 -37 -37 -37h-718q-37 0 -37 41t37 41h673v674q0 39 41 39t41 -39v-719zM526 445q0 -45 -32 -77t-77 -32t-77 32t-32 77t32 77t77 32t77 -32t32 -77z" />
+<glyph unicode="&#x27d4;" horiz-adv-x="1024" d="M907 1380q0 -41 -37 -41h-673v-673q0 -39 -41 -39t-41 39v718q0 37 37 37h718q37 0 37 -41zM714 931q0 -45 -32 -77t-77 -32t-77 32t-32 77t32 77t77 32t77 -32t32 -77z" />
+<glyph unicode="&#x27d5;" d="M1933 -100q0 -59 -61 -59q-22 0 -45 23l-633 633l-636 -633q-23 -23 -47 -23h-359q-37 0 -37 41t37 41h298v1318h-298q-37 0 -37 41t37 41h359q27 0 47 -20l636 -635l633 635q20 20 45 20q61 0 61 -55v-1368zM1851 -45v1257l-627 -630zM1163 582l-631 632v-1261z" />
+<glyph unicode="&#x27d6;" d="M1933 -118q0 -41 -37 -41h-359q-24 0 -47 23l-636 633l-633 -633q-23 -23 -45 -23q-61 0 -61 59v1368q0 55 61 55q25 0 45 -20l633 -635l636 635q20 20 47 20h359q37 0 37 -41t-37 -41h-298v-1318h298q37 0 37 -41zM1516 -47v1261l-631 -632zM824 582l-627 630v-1257z " />
+<glyph unicode="&#x27d7;" horiz-adv-x="2383" d="M2268 -118q0 -41 -37 -41h-359q-22 0 -45 23l-633 633l-636 -633q-23 -23 -47 -23h-359q-37 0 -37 41t37 41h298v1318h-298q-37 0 -37 41t37 41h359q27 0 47 -20l636 -635l633 635q20 20 45 20h359q37 0 37 -41t-37 -41h-298v-1318h298q37 0 37 -41zM1851 -45v1257 l-627 -630zM1163 582l-631 632v-1261z" />
+<glyph unicode="&#x27d8;" horiz-adv-x="1591" d="M1506 41q0 -41 -39 -41h-1345q-37 0 -37 41t37 41h632v1402q0 39 41 39t41 -39v-1402h631q39 0 39 -41z" />
+<glyph unicode="&#x27d9;" horiz-adv-x="1591" d="M1506 1482q0 -41 -39 -41h-631v-1402q0 -39 -41 -39t-41 39v1402h-632q-37 0 -37 41t37 41h1345q39 0 39 -41z" />
+<glyph unicode="&#x27da;" d="M2002 512q0 -41 -37 -41h-701v-432q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-434h701q37 0 37 -41t-37 -41h-701v-315h701q37 0 37 -41zM867 39q0 -39 -41 -39t-41 39v432h-701q-37 0 -37 41t37 41h701v315h-701q-37 0 -37 41t37 41h701v434q0 37 41 37t41 -37 v-1345z" />
+<glyph unicode="&#x27db;" d="M2032 711q0 -41 -37 -41h-731v-631q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-632h731q37 0 37 -41zM867 39q0 -39 -41 -39t-41 39v631h-731q-37 0 -37 41t37 41h731v632q0 37 41 37t41 -37v-1345z" />
+<glyph unicode="&#x27dc;" d="M1948 582q0 -41 -37 -41h-1163q-16 -122 -108.5 -203.5t-220.5 -81.5t-223.5 96.5t-95.5 230t95 229.5t223 96t221.5 -82t108.5 -203h1163q37 0 37 -41zM668 582q0 100 -72 172t-171.5 72t-171 -72.5t-71.5 -171.5t71.5 -171.5t171 -72.5t171.5 72t72 172z" />
+<glyph unicode="&#x27dd;" horiz-adv-x="1756" d="M1671 582q0 -41 -39 -41h-1380v-631q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-632h1380q39 0 39 -41z" />
+<glyph unicode="&#x27de;" horiz-adv-x="1756" d="M1586 -90q0 -39 -41 -39t-41 39v631h-1380q-39 0 -39 41t39 41h1380v632q0 37 41 37t41 -37v-1345z" />
+<glyph unicode="&#x27df;" horiz-adv-x="722" d="M722 -301q0 -41 -37 -41h-646q-39 0 -39 41t39 41h281v1118q-121 15 -203 108.5t-82 221.5t96 223t229.5 95t230 -95.5t96.5 -223.5t-81.5 -220.5t-203.5 -108.5v-1118h283q37 0 37 -41zM533 1010q72 72 72 171.5t-72.5 171t-171.5 71.5t-171.5 -71.5t-72.5 -171 t72 -171.5t172 -72t172 72z" />
+<glyph unicode="&#x27e0;" horiz-adv-x="1364" d="M682 -353q-25 0 -39 25l-503 910l503 910q14 25 39 25t39 -25l503 -910l-503 -910q-14 -25 -39 -25zM1098 623l-416 752l-416 -752h832zM1098 541h-832l416 -752z" />
+<glyph unicode="&#x27e1;" horiz-adv-x="1946" d="M1831 590q0 -23 -34 -38q-60 -25 -178 -80q-353 -186 -532 -532q-2 -4 -75 -174q-15 -34 -39 -34t-39 34q-23 58 -75 174q-179 346 -532 532q-14 7 -178 80q-34 15 -34 38t34 38q60 25 178 80q353 186 532 532q2 4 75 174q15 34 39 34t39 -34q23 -58 75 -174 q179 -346 532 -532q14 -7 178 -80q34 -15 34 -38zM1674 590q-492 218 -701 698q-209 -480 -701 -698q492 -218 701 -698q209 480 701 698z" />
+<glyph unicode="&#x27e2;" horiz-adv-x="2141" d="M2131 582q0 -23 -34 -38q-60 -25 -178 -80q-353 -186 -532 -532q-2 -4 -75 -174q-15 -34 -39 -34t-39 34q-23 58 -75 174q-179 346 -532 532q-22 11 -171 77h-407q-39 0 -39 41t39 41h407q57 24 171 77q353 186 532 532q2 4 75 174q15 34 39 34t39 -34q23 -58 75 -174 q179 -346 532 -532q14 -7 178 -80q34 -15 34 -38zM1974 582q-492 218 -701 698q-209 -480 -701 -698q492 -218 701 -698q209 480 701 698z" />
+<glyph unicode="&#x27e3;" horiz-adv-x="2141" d="M2131 582q0 -41 -39 -41h-407q-57 -24 -171 -77q-353 -186 -532 -532q-2 -4 -75 -174q-15 -34 -39 -34t-39 34q-23 58 -75 174q-179 346 -532 532q-14 7 -178 80q-34 15 -34 38t34 38q60 25 178 80q353 186 532 532q2 4 75 174q15 34 39 34t39 -34q23 -58 75 -174 q179 -346 532 -532q22 -11 171 -77h407q39 0 39 -41zM1569 582q-492 218 -701 698q-209 -480 -701 -698q492 -218 701 -698q209 480 701 698z" />
+<glyph unicode="&#x27e4;" d="M1948 -2q0 -39 -37 -39h-1168q-39 0 -39 39v543h-495q-39 0 -39 41t39 41h495v545q0 37 39 37h1168q37 0 37 -37v-1170zM1866 41v1082h-1080v-1082h1080z" />
+<glyph unicode="&#x27e5;" d="M1948 582q0 -41 -39 -41h-495v-543q0 -39 -39 -39h-1168q-37 0 -37 39v1170q0 37 37 37h1168q39 0 39 -37v-545h495q39 0 39 -41zM1332 41v1082h-1080v-1082h1080z" />
+<glyph unicode="&#x27e6;" horiz-adv-x="682" d="M571 -309q0 -41 -68 -41h-391v1864h391q68 0 68 -40.5t-68 -40.5h-109v-1701h109q68 0 68 -41zM313 -268v1701h-120v-1701h120z" />
+<glyph unicode="&#x27e7;" horiz-adv-x="682" d="M570 -350h-391q-68 0 -68 41t68 41h109v1701h-109q-68 0 -68 40.5t68 40.5h391v-1864zM489 -268v1701h-120v-1701h120z" />
+<glyph unicode="&#x27e8;" horiz-adv-x="666" d="M558 -312q0 -38 -42 -38q-23 0 -43 47l-382 885l382 885q20 47 43 47q42 0 42 -38q0 -17 -8 -36l-371 -858l371 -858q8 -19 8 -36z" />
+<glyph unicode="&#x27e9;" horiz-adv-x="666" d="M150 -350q-42 0 -42 38q0 17 8 36l371 858l-371 858q-8 19 -8 36q0 38 42 38q23 0 43 -47l382 -885l-382 -885q-20 -47 -43 -47z" />
+<glyph unicode="&#x27ea;" horiz-adv-x="966" d="M558 -312q0 -38 -42 -38q-23 0 -43 47l-382 885l382 885q20 47 43 47q42 0 42 -38q0 -17 -8 -36l-371 -858l371 -858q8 -19 8 -36zM858 -312q0 -38 -42 -38q-23 0 -43 47l-382 885l382 885q20 47 43 47q42 0 42 -38q0 -17 -8 -36l-371 -858l371 -858q8 -19 8 -36z" />
+<glyph unicode="&#x27eb;" horiz-adv-x="966" d="M150 -350q-42 0 -42 38q0 17 8 36l371 858l-371 858q-8 19 -8 36q0 38 42 38q23 0 43 -47l382 -885l-382 -885q-20 -47 -43 -47zM450 -350q-42 0 -42 38q0 17 8 36l371 858l-371 858q-8 19 -8 36q0 38 42 38q23 0 43 -47l382 -885l-382 -885q-20 -47 -43 -47z" />
+<glyph unicode="&#x27ec;" horiz-adv-x="873" d="M663 -275q46 -35 46 -55t-17 -20q-77 0 -228 118q-193 150 -300 331v966q107 181 300 331q151 118 228 118q17 0 17 -20t-46 -55q-142 -109 -231 -332v-1050q89 -223 231 -332zM393 -53q-24 49 -42 94v1082q21 54 41 94q-107 -112 -147 -175v-920q38 -60 148 -175z" />
+<glyph unicode="&#x27ed;" horiz-adv-x="873" d="M181 -350q-17 0 -17 20t46 55q142 109 231 332v1050q-89 223 -231 332q-46 35 -46 55t17 20q77 0 228 -118q193 -150 300 -331v-966q-107 -181 -300 -331q-151 -118 -228 -118zM628 122v920q-38 60 -148 175q24 -49 42 -94v-1082q-21 -52 -50 -110q94 92 156 191z" />
+<glyph unicode="&#x27ee;" horiz-adv-x="582" d="M474 -332q0 -18 -19 -18q-10 0 -46 29q-156 128 -216 212t-82 212q-14 79 -17 195.5t-3 283.5t3 283.5t17 195.5q22 128 82 212t216 212q36 29 46 29q19 0 19 -18q0 -9 -24 -32q-90 -87 -131 -176q-70 -154 -70 -532v-347q0 -379 70 -533q41 -89 131 -176q24 -23 24 -32z " />
+<glyph unicode="&#x27ef;" horiz-adv-x="582" d="M491 582q0 -167 -3 -283.5t-17 -195.5q-22 -128 -82 -212t-216 -212q-36 -29 -46 -29q-19 0 -19 18q0 9 24 32q90 87 131 176q70 154 70 532v347q0 379 -70 533q-41 89 -131 176q-24 23 -24 32q0 18 19 18q10 0 46 -29q156 -128 216 -212t82 -212q14 -79 17 -195.5 t3 -283.5z" />
+<glyph unicode="&#x27f0;" horiz-adv-x="1602" d="M1540 846q0 -42 -39 -42q-6 0 -44 13t-105 47v-1145q0 -37 -41 -37t-41 37v1188q-141 82 -258 192v-1380q0 -37 -41 -37t-41 37v1464q-78 88 -129 179q-51 -91 -129 -179v-1464q0 -37 -41 -37t-41 37v1380q-117 -110 -258 -192v-1188q0 -37 -41 -37t-41 37v1145 q-67 -34 -105 -47t-44 -13q-39 0 -39 42q0 22 27 36q46 18 135 57q281 138 464 394q25 42 78 124q17 25 35 25t35 -25q25 -42 78 -124q183 -256 464 -394q46 -17 135 -57q27 -14 27 -36z" />
+<glyph unicode="&#x27f1;" horiz-adv-x="1602" d="M1540 318q0 -22 -27 -36q-46 -18 -135 -57q-281 -138 -464 -394q-25 -42 -78 -124q-17 -25 -35 -25t-35 25q-25 42 -78 124q-183 256 -464 394q-46 17 -135 57q-27 14 -27 36q0 42 39 42q6 0 44 -13t105 -47v1145q0 37 41 37t41 -37v-1188q141 -82 258 -192v1380 q0 37 41 37t41 -37v-1464q78 -88 129 -179q51 91 129 179v1464q0 37 41 37t41 -37v-1380q117 110 258 192v1188q0 37 41 37t41 -37v-1145q67 34 105 47t44 13q39 0 39 -42z" />
+<glyph unicode="&#x27f2;" horiz-adv-x="1024" d="M995 582q0 -200 -141.5 -341.5t-341.5 -141.5q-91 0 -190 38.5t-152 102.5q-10 12 -10 27q0 42 42 42q12 0 26 -11q144 -117 284 -117q166 0 283.5 117.5t117.5 283.5t-117.5 283.5t-278.5 117.5t-275.5 -105t-128.5 -259q36 36 95.5 75.5t92.5 39.5q39 0 39 -41 q0 -22 -25 -36q-22 -10 -44 -19q-90 -42 -177 -174q-13 -20 -24 -20t-24 20q-87 132 -177 174q-22 9 -44 19q-25 14 -25 36q0 41 39 41q33 0 95 -41t96 -77q13 189 152 319t334.5 130t337 -141.5t141.5 -341.5z" />
+<glyph unicode="&#x27f3;" horiz-adv-x="1024" d="M1224 693q0 -22 -25 -36q-22 -10 -44 -19q-90 -42 -177 -174q-13 -20 -24 -20t-24 20q-87 132 -177 174q-22 9 -44 19q-25 14 -25 36q0 41 39 41q33 0 92.5 -39.5t95.5 -75.5q-14 154 -128.5 259t-275.5 105t-278.5 -117.5t-117.5 -283.5t117.5 -283.5t283.5 -117.5 q140 0 284 117q14 11 26 11q42 0 42 -42q0 -15 -10 -27q-53 -64 -152 -102.5t-190 -38.5q-200 0 -341.5 141.5t-141.5 341.5t141.5 341.5t337 141.5t334.5 -130t152 -319q34 36 96 77t95 41q39 0 39 -41z" />
+<glyph unicode="&#x27f4;" horiz-adv-x="3008" d="M2866 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-591q-16 -284 -224.5 -483t-495.5 -199t-496.5 198.5t-225.5 483.5h-481q-39 0 -39 41t39 41h481q16 286 224.5 484t497 198 t496.5 -198.5t224 -483.5h591q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310zM1397 623h598q-16 241 -187 412.5t-411 186.5v-599zM1315 623v599q-241 -16 -412 -187t-186 -412h598zM1397 541v-599 q239 15 410.5 187t187.5 412h-598zM1315 541h-598q16 -240 187 -411.5t411 -187.5v599z" />
+<glyph unicode="&#x27f5;" horiz-adv-x="3008" d="M2891 582q0 -41 -39 -41h-2514q222 -157 287 -431q8 -34 8 -36q0 -27 -21 -27q-47 0 -53 6t-8 13q-22 84 -35.5 123t-43.5 90q-106 182 -296 265l-47 18q-14 6 -14 22t25 27l40 14q210 91 317 310q24 49 54 163q5 19 20 19q44 0 41 1q21 -4 21 -28q0 -58 -57 -179 q-84 -177 -238 -288h2514q39 0 39 -41z" />
+<glyph unicode="&#x27f6;" horiz-adv-x="3008" d="M2866 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-2514q-39 0 -39 41t39 41h2514q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163 q105 -217 317 -310z" />
+<glyph unicode="&#x27f7;" horiz-adv-x="3008" d="M2866 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-2330q222 -157 287 -431q8 -34 8 -36q0 -27 -21 -27q-47 0 -53 6t-8 13q-22 84 -35.5 123t-43.5 90q-106 182 -296 265l-47 18 q-14 6 -14 22t25 27l40 14q210 91 317 310q24 49 54 163q5 19 20 19q44 0 41 1q21 -4 21 -28q0 -58 -57 -179q-84 -177 -238 -288h2330q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310z" />
+<glyph unicode="&#x27f8;" horiz-adv-x="3008" d="M2891 383q0 -41 -37 -41h-2200q45 -44 126 -155t81 -146q0 -20 -23 -23q7 1 -38 1q-11 0 -17 12q-74 142 -162 238q-175 191 -418 272l-71 21q-16 5 -16 20t16 23l68 20q172 56 323 177.5t260 330.5q6 12 58 12q20 0 20 -28.5t-80.5 -138.5t-126.5 -156h2200q37 0 37 -41 t-37 -41h-2290q-120 -99 -262 -158q142 -59 262 -158h2290q37 0 37 -41z" />
+<glyph unicode="&#x27f9;" horiz-adv-x="3008" d="M2891 582q0 -15 -14 -20q-36 -10 -107 -34q-357 -136 -546 -497q-6 -12 -58 -12q-20 0 -20 22q0 36 80.5 145.5t126.5 155.5h-2198q-39 0 -39 41t39 41h2288q120 99 262 158q-142 59 -262 158h-2288q-39 0 -39 41t39 41h2198q-50 52 -128.5 158.5t-78.5 142.5q0 20 23 23 q-5 -1 38 -1q11 0 17 -12q110 -208 259.5 -329.5t324.5 -178.5q28 -6 69 -20q14 -8 14 -23z" />
+<glyph unicode="&#x27fa;" horiz-adv-x="3008" d="M2892 605q14 -8 14 -22.5t-14 -20.5q-201 -89 -318.5 -204t-188.5 -255l-32 -70q-7 -14 -59 -14q-21 0 -21 22q0 38 67.5 142.5t113.5 158.5h-1900q43 -47 111.5 -155t68.5 -146q0 -22 -61 -22q-11 0 -19 19l-30 64q-88 175 -241 303q-116 98 -265 157q-16 6 -16 20.5 t16 22.5q31 13 92 41q276 140 414 417l31 68q7 14 59 14q20 0 20 -22q0 -38 -68 -144.5t-112 -156.5h1900q-48 58 -114.5 160.5t-66.5 140.5q0 22 62 22q11 0 18 -14l57 -115q31 -55 72 -108q135 -174 332 -269q28 -11 78 -34zM2751 582q-122 66 -219 158h-2056 q-97 -92 -219 -158q122 -66 219 -158h2056q97 92 219 158z" />
+<glyph unicode="&#x27fb;" horiz-adv-x="3008" d="M2925 44q0 -62 -41 -62t-41 62v497h-2505q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432 h2505v498q0 61 41 61t41 -61v-1077z" />
+<glyph unicode="&#x27fc;" horiz-adv-x="3008" d="M2866 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-2503v-497q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-498h2503q-154 111 -238 288q-57 121 -57 179q0 24 21 28 q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310z" />
+<glyph unicode="&#x27fd;" horiz-adv-x="3008" d="M2925 44q0 -62 -41 -62t-41 62v298h-2189q45 -44 126 -155t81 -146q0 -20 -23 -23q7 1 -38 1q-11 0 -17 12q-74 142 -162 238q-175 191 -418 272l-71 21q-16 5 -16 20t16 23l68 20q172 56 323 177.5t260 330.5q6 12 58 12q20 0 20 -28.5t-80.5 -138.5t-126.5 -156h2189 v299q0 61 41 61t41 -61v-1077zM2843 424v316h-2279q-120 -99 -262 -158q142 -59 262 -158h2279z" />
+<glyph unicode="&#x27fe;" horiz-adv-x="3008" d="M2891 582q0 -15 -14 -20q-36 -10 -107 -34q-357 -136 -546 -497q-6 -12 -58 -12q-20 0 -20 22q0 36 80.5 145.5t126.5 155.5h-2188v-298q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-299h2188q-50 52 -128.5 158.5t-78.5 142.5q0 20 23 23q-5 -1 38 -1q11 0 17 -12 q110 -208 259.5 -329.5t324.5 -178.5q28 -6 69 -20q14 -8 14 -23zM165 740v-316h2278q120 99 262 158q-142 59 -262 158h-2278z" />
+<glyph unicode="&#x27ff;" horiz-adv-x="3008" d="M2891 582q0 -11 -27 -26q-154 -87 -230 -236l-25 -58q-12 -26 -36 -26q-42 0 -42 39q0 7 3 15q52 144 178 251h-658q-16 0 -32 14l-158 142l-348 -314q-13 -12 -31 -12t-31 12l-348 314l-348 -314q-13 -12 -31 -12t-31 12l-348 314l-160 -142q-16 -14 -30 -14 q-41 0 -41 41q0 20 10 29l190 170q13 12 31 12t31 -12l348 -314l348 314q13 12 31 12t31 -12l348 -314l348 314q13 12 31 12t31 -12l176 -158h642q-127 107 -179 253q-3 8 -3 15q0 39 42 39q24 0 34 -23l27 -62q75 -149 230 -237q27 -15 27 -26z" />
+<glyph unicode="&#x2900;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-234q-133 -60 -226 -170q-94 -111 -132 -258q-3 -16 -10 -41t-21 -25h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-667v-395 q0 -39 -41 -39t-41 39v395h-415q-39 0 -39 41t39 41h415v397q0 37 41 37t41 -37v-397h667q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h229q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1 q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x2901;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-234q-133 -60 -226 -170q-94 -111 -132 -258q-3 -16 -10 -41t-21 -25h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-567v-395 q0 -39 -41 -39t-41 39v395h-218v-395q0 -39 -41 -39t-41 39v395h-215q-39 0 -39 41t39 41h215v397q0 37 41 37t41 -37v-397h218v397q0 37 41 37t41 -37v-397h567q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5 t230.5 -170.5h229q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x2902;" d="M1932 383q0 -41 -37 -41h-581v-196q0 -39 -41 -39t-41 39v196h-578q45 -44 126 -155t81 -146q0 -20 -23 -23q7 1 -38 1q-11 0 -17 12q-74 142 -162 238q-175 191 -418 272l-71 21q-16 5 -16 20t16 23l68 20q172 56 323 177.5t260 330.5q6 12 58 12q20 0 20 -28.5 t-80.5 -138.5t-126.5 -156h578v198q0 37 41 37t41 -37v-198h581q37 0 37 -41t-37 -41h-581v-316h581q37 0 37 -41zM1232 424v316h-668q-120 -99 -262 -158q142 -59 262 -158h668z" />
+<glyph unicode="&#x2903;" d="M1932 582q0 -15 -14 -20q-36 -10 -107 -34q-357 -136 -546 -497q-6 -12 -58 -12q-20 0 -20 22q0 36 80.5 145.5t126.5 155.5h-578v-196q0 -39 -41 -39t-41 39v196h-579q-39 0 -39 41t39 41h579v316h-579q-39 0 -39 41t39 41h579v198q0 37 41 37t41 -37v-198h578 q-50 52 -128.5 158.5t-78.5 142.5q0 20 23 23q-5 -1 38 -1q11 0 17 -12q110 -208 259.5 -329.5t324.5 -178.5q28 -6 69 -20q14 -8 14 -23zM816 740v-316h668q120 99 262 158q-142 59 -262 158h-668z" />
+<glyph unicode="&#x2904;" horiz-adv-x="2560" d="M2444 605q14 -8 14 -22.5t-14 -20.5q-201 -89 -318.5 -204t-188.5 -255l-32 -70q-7 -14 -59 -14q-21 0 -21 22q0 38 67.5 142.5t113.5 158.5h-685v-196q0 -39 -41 -39t-41 39v196h-685q43 -47 111.5 -155t68.5 -146q0 -22 -61 -22q-11 0 -19 19l-30 64q-85 169 -230 295 q-121 103 -276 165q-16 6 -16 20.5t16 22.5q31 13 92 41q276 140 414 417l31 68q7 14 59 14q20 0 20 -22q0 -38 -68 -144.5t-112 -156.5h685v198q0 37 41 37t41 -37v-198h685q-48 58 -114.5 160.5t-66.5 140.5q0 22 62 22q11 0 18 -14l57 -115q31 -55 72 -108 q135 -174 332 -269q28 -11 78 -34zM1321 740v-316h763q97 92 219 158q-122 66 -219 158h-763zM1239 424v316h-763q-97 -92 -219 -158q122 -66 219 -158h763z" />
+<glyph unicode="&#x2905;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-234q-133 -60 -226 -170q-94 -111 -132 -258q-3 -16 -10 -41t-21 -25h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-1153v-497 q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-498h1153q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h229q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48 q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x2906;" d="M1965 44q0 -62 -41 -62t-41 62v298h-1229q45 -44 126 -155t81 -146q0 -20 -23 -23q7 1 -38 1q-11 0 -17 12q-74 142 -162 238q-175 191 -418 272l-71 21q-16 5 -16 20t16 23l68 20q172 56 323 177.5t260 330.5q6 12 58 12q20 0 20 -28.5t-80.5 -138.5t-126.5 -156h1229 v299q0 61 41 61t41 -61v-1077zM1883 424v316h-1319q-120 -99 -262 -158q142 -59 262 -158h1319z" />
+<glyph unicode="&#x2907;" d="M1932 582q0 -15 -14 -20q-36 -10 -107 -34q-357 -136 -546 -497q-6 -12 -58 -12q-20 0 -20 22q0 36 80.5 145.5t126.5 155.5h-1229v-298q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-299h1229q-50 52 -128.5 158.5t-78.5 142.5q0 20 23 23q-5 -1 38 -1q11 0 17 -12 q110 -208 259.5 -329.5t324.5 -178.5q28 -6 69 -20q14 -8 14 -23zM165 740v-316h1319q120 99 262 158q-142 59 -262 158h-1319z" />
+<glyph unicode="&#x2908;" horiz-adv-x="1024" d="M553 -36q136 223 414 293q22 0 22 -18q0 -60 -14 -64q-22 -6 -65 -19q-132 -46 -229.5 -150.5t-132.5 -239.5q-4 -22 -13 -66q-4 -18 -22 -18t-24 18q-4 23 -13 67q-35 134 -132.5 238.5t-229.5 150.5q-22 6 -65 19q-14 6 -14 19q0 51 -1 40q2 23 23 23l6 -2 q104 -29 161 -59q157 -83 247 -232v835h-347q-37 0 -37 41t37 41h347v564q0 37 41 37t41 -37v-564h345q39 0 39 -41t-39 -41h-345v-835z" />
+<glyph unicode="&#x2909;" horiz-adv-x="1024" d="M471 1200q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q132 46 229.5 150.5t132.5 238.5q3 23 13 67q6 18 24 18t22 -18q4 -22 13 -66q35 -135 132.5 -239.5t229.5 -150.5q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59 q-158 84 -248 232v-835h345q39 0 39 -41t-39 -41h-345v-564q0 -37 -41 -37t-41 37v564h-347q-37 0 -37 41t37 41h347v835z" />
+<glyph unicode="&#x290a;" horiz-adv-x="1602" d="M1540 846q0 -42 -39 -42q-7 0 -15 3q-129 47 -247 118v-1206q0 -37 -41 -37t-41 37v1261q-186 132 -315 317v-1574q0 -41 -41 -41t-41 41v1574q-131 -186 -315 -318v-1260q0 -37 -41 -37t-41 37v1206q-117 -71 -247 -118q-8 -3 -15 -3q-39 0 -39 42q0 22 27 36 q46 18 136 57q277 136 462 394l79 124q17 25 35 25t35 -25q25 -42 78 -124q182 -255 464 -394q46 -18 135 -57q27 -14 27 -36z" />
+<glyph unicode="&#x290b;" horiz-adv-x="1602" d="M1540 318q0 -22 -27 -36q-46 -18 -135 -57q-282 -139 -464 -394q-25 -42 -78 -124q-17 -25 -35 -25t-35 25q-25 42 -79 124q-185 258 -462 394q-46 17 -136 57q-27 14 -27 36q0 42 39 42q7 0 15 -3q130 -47 247 -118v1206q0 37 41 37t41 -37v-1260q184 -132 315 -318 v1574q0 41 41 41t41 -41v-1574q129 185 315 317v1261q0 37 41 37t41 -37v-1206q118 71 247 118q8 3 15 3q39 0 39 -42z" />
+<glyph unicode="&#x290c;" d="M1931 582q0 -41 -37 -41h-624q-39 0 -39 41t39 41h624q37 0 37 -41zM1041 582q0 -41 -39 -41h-664q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5 q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h664q39 0 39 -41z" />
+<glyph unicode="&#x290d;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-664q-39 0 -39 41t39 41h664q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5 t230.5 -170.5q16 -5 46 -18q16 -9 16 -23zM815 582q0 -41 -39 -41h-624q-37 0 -37 41t37 41h624q39 0 39 -41z" />
+<glyph unicode="&#x290e;" d="M1931 582q0 -41 -37 -41h-304q-39 0 -39 41t39 41h304q37 0 37 -41zM1361 582q0 -41 -37 -41h-304q-39 0 -39 41t39 41h304q37 0 37 -41zM791 582q0 -41 -39 -41h-414q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5 q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h414q39 0 39 -41z" />
+<glyph unicode="&#x290f;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-414q-39 0 -39 41t39 41h414q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5 t230.5 -170.5q16 -5 46 -18q16 -9 16 -23zM1065 582q0 -41 -39 -41h-304q-37 0 -37 41t37 41h304q39 0 39 -41zM495 582q0 -41 -39 -41h-304q-37 0 -37 41t37 41h304q39 0 39 -41z" />
+<glyph unicode="&#x2910;" d="M1963 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-234q-133 -60 -226 -170q-94 -111 -132 -258q-3 -16 -10 -41t-21 -25h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-54q-39 0 -39 41 t39 41h54q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h229q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z M1087 582q0 -41 -39 -41h-194q-37 0 -37 41t37 41h194q39 0 39 -41zM647 582q0 -41 -39 -41h-37q-282 -122 -363 -428q-3 -16 -9.5 -40.5t-26.5 -26.5q9 1 -36 1q-21 0 -21 27q0 4 7 35q26 118 93 224q97 154 247 249q-150 95 -247 249q-67 106 -93 224q-7 31 -7 35 q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h37q39 0 39 -41z" />
+<glyph unicode="&#x2911;" d="M1931 582q0 -14 -16 -21.5t-46 -19.5q-282 -122 -363 -428q-3 -16 -9.5 -40.5t-26.5 -26.5q9 1 -36 1q-21 0 -21 27q0 4 7 35q59 266 288 432h-54q-39 0 -39 41t39 41h54q-228 162 -288 432q-7 31 -7 35q0 24 21 27h41q14 0 20 -19q33 -175 142 -303.5t278 -192.5 q16 -6 16 -20zM1445 582q0 -41 -39 -41h-54q-37 0 -37 41t37 41h54q39 0 39 -41zM1145 582q0 -41 -39 -41h-54q-37 0 -37 41t37 41h54q39 0 39 -41zM845 582q0 -41 -39 -41h-54q-37 0 -37 41t37 41h54q39 0 39 -41zM545 582q0 -41 -39 -41h-54q-37 0 -37 41t37 41h54 q39 0 39 -41zM245 582q0 -41 -39 -41h-54q-37 0 -37 41t37 41h54q39 0 39 -41z" />
+<glyph unicode="&#x2912;" horiz-adv-x="1024" d="M471 1200q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q132 46 229.5 150.5t132.5 238.5q3 23 13 67q6 18 24 18t22 -18q4 -22 13 -66q35 -135 132.5 -239.5t229.5 -150.5q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59 q-158 84 -248 232v-1481q0 -37 -41 -37t-41 37v1481zM926 1606q63 0 63 -40.5t-63 -40.5h-828q-63 0 -63 40.5t63 40.5h828z" />
+<glyph unicode="&#x2913;" horiz-adv-x="1024" d="M553 -36q136 223 414 293q22 0 22 -18q0 -60 -14 -64q-22 -6 -65 -19q-132 -46 -229.5 -150.5t-132.5 -239.5q-4 -22 -13 -66q-4 -18 -22 -18t-24 18q-4 23 -13 67q-35 134 -132.5 238.5t-229.5 150.5q-22 6 -65 19q-14 6 -14 19q0 51 -1 40q2 23 23 23l6 -2 q104 -29 161 -59q157 -83 247 -232v1481q0 37 41 37t41 -37v-1481zM926 -361q63 0 63 -40.5t-63 -40.5h-828q-63 0 -63 40.5t63 40.5h828z" />
+<glyph unicode="&#x2914;" d="M1963 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-759v-395q0 -39 -41 -39t-41 39v395h-328q-282 -122 -363 -428q-3 -16 -9.5 -40.5t-26.5 -26.5q9 1 -36 1q-21 0 -21 27q0 4 7 35 q26 118 93 224q97 154 247 249q-150 95 -247 249q-67 106 -93 224q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h328v397q0 37 41 37t41 -37v-397h759q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19 t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x2915;" d="M1963 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-569v-395q0 -39 -41 -39t-41 39v395h-218v-395q0 -39 -41 -39t-41 39v395h-218q-282 -122 -363 -428q-3 -16 -9.5 -40.5t-26.5 -26.5 q9 1 -36 1q-21 0 -21 27q0 4 7 35q26 118 93 224q97 154 247 249q-150 95 -247 249q-67 106 -93 224q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h218v397q0 37 41 37t41 -37v-397h218v397q0 37 41 37t41 -37v-397h569 q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x2916;" d="M1963 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-234q-133 -60 -226 -170q-94 -111 -132 -258q-3 -16 -10 -41t-21 -25h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-779 q-282 -122 -363 -428q-3 -16 -9.5 -40.5t-26.5 -26.5q9 1 -36 1q-21 0 -21 27q0 4 7 35q26 118 93 224q97 154 247 249q-150 95 -247 249q-67 106 -93 224q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h779q-229 166 -288 432 q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h229q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x2917;" d="M1963 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-234q-133 -60 -226 -170q-94 -111 -132 -258q-3 -16 -10 -41t-21 -25h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-509v-395 q0 -39 -41 -39t-41 39v395h-188q-282 -122 -363 -428q-3 -16 -9.5 -40.5t-26.5 -26.5q9 1 -36 1q-21 0 -21 27q0 4 7 35q26 118 93 224q97 154 247 249q-150 95 -247 249q-67 106 -93 224q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5 t230.5 -170.5h188v397q0 37 41 37t41 -37v-397h509q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h229q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5 t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x2918;" horiz-adv-x="2248" d="M2163 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-234q-133 -60 -226 -170q-94 -111 -132 -258q-3 -16 -10 -41t-21 -25h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-469v-395 q0 -39 -41 -39t-41 39v395h-218v-395q0 -39 -41 -39t-41 39v395h-128q-282 -122 -363 -428q-3 -16 -9.5 -40.5t-26.5 -26.5q9 1 -36 1q-21 0 -21 27q0 4 7 35q26 118 93 224q97 154 247 249q-150 95 -247 249q-67 106 -93 224q-7 31 -7 35q0 27 21 27q45 0 36 1 q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h128v397q0 37 41 37t41 -37v-397h218v397q0 37 41 37t41 -37v-397h469q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h229q-229 166 -288 432 q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x2919;" d="M1931 74q0 -27 -21 -27q-45 0 -36 -1q-20 2 -24 19t-12 48q-38 146 -132.5 257.5t-230.5 170.5h-1321q-39 0 -39 41t39 41h1321q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-26 -118 -93 -224q-97 -154 -247 -249q150 -95 247 -249 q67 -106 93 -224q7 -31 7 -35z" />
+<glyph unicode="&#x291a;" d="M1931 582q0 -41 -39 -41h-1321q-282 -122 -363 -428q-3 -16 -9.5 -40.5t-26.5 -26.5q9 1 -36 1q-21 0 -21 27q0 4 7 35q26 118 93 224q97 154 247 249q-150 95 -247 249q-67 106 -93 224q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5 t230.5 -170.5h1321q39 0 39 -41z" />
+<glyph unicode="&#x291b;" d="M1931 74q0 -27 -21 -27q-45 0 -36 -1q-20 2 -24 19t-12 48q-38 146 -132.5 257.5t-230.5 170.5h-229q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -134.5 295t-234.5 180h-936q-39 0 -39 41t39 41h931q282 122 363 428q3 16 9.5 40.5 t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h229q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-26 -118 -93 -224q-97 -154 -247 -249q150 -95 247 -249q67 -106 93 -224q7 -31 7 -35z" />
+<glyph unicode="&#x291c;" d="M1931 582q0 -41 -39 -41h-936q-133 -60 -226 -170q-94 -111 -132 -258q-3 -16 -10 -41t-21 -25h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-229q-282 -122 -363 -428q-3 -16 -9.5 -40.5t-26.5 -26.5q9 1 -36 1q-21 0 -21 27q0 4 7 35q26 118 93 224q97 154 247 249 q-150 95 -247 249q-67 106 -93 224q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h229q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5h931q39 0 39 -41z" />
+<glyph unicode="&#x291d;" d="M1931 582q0 -41 -39 -41h-1154q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h1154 q39 0 39 -41zM427 582l-156 -156l-156 156l156 156z" />
+<glyph unicode="&#x291e;" d="M1931 582l-156 -156l-156 156l156 156zM1531 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-1154q-39 0 -39 41t39 41h1154q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1 q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x291f;" d="M1965 44q0 -62 -41 -62t-41 62v497h-1145q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432 h1145v498q0 61 41 61t41 -61v-1077zM427 582l-156 -156l-156 156l156 156z" />
+<glyph unicode="&#x2920;" d="M1931 582l-156 -156l-156 156l156 156zM1506 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-1143v-497q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-498h1143 q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310z" />
+<glyph unicode="&#x2921;" d="M1924 -295q0 -23 -24 -23l-67 40q-127 76 -273 76t-259 -56q-71 -35 -67 -35q-10 0 -30.5 19t-20.5 31t12 19q165 100 346 100q76 0 149 -18l-1390 1390q19 -77 19 -150q0 -173 -101 -345q-8 -13 -18.5 -13t-30.5 20t-20 30l35 69q56 112 56 249q0 160 -76 283 q-40 66 -40 68q0 23 24 23l67 -40q127 -76 273 -76t259 56q71 35 67 35q10 0 30.5 -19t20.5 -31t-12 -19q-165 -100 -346 -100q-76 0 -149 18l1390 -1390q-19 77 -19 150q0 173 101 345q8 13 18.5 13t30.5 -20t20 -30l-35 -69q-56 -112 -56 -249q0 -160 76 -283 q40 -66 40 -68z" />
+<glyph unicode="&#x2922;" d="M1924 1459q0 -2 -40 -68q-76 -123 -76 -271.5t56 -260.5l35 -69q0 -10 -20 -30t-30.5 -20t-18.5 13q-101 172 -101 345q0 73 19 150l-1390 -1390q73 18 149 18q181 0 346 -100q12 -7 12 -19t-20.5 -31t-30.5 -19q4 0 -67 35q-113 56 -259 56t-273 -76l-67 -40 q-24 0 -24 23q0 2 40 68q76 123 76 271.5t-56 260.5l-35 69q0 10 20 30t30.5 20t18.5 -13q101 -172 101 -345q0 -73 -19 -150l1390 1390q-73 -18 -149 -18q-181 0 -346 100q-12 7 -12 19t20.5 31t30.5 19q-4 0 67 -35q113 -56 259 -56t273 76l67 40q24 0 24 -23z" />
+<glyph unicode="&#x2923;" horiz-adv-x="1503" d="M1277 375q102 -131 102 -247.5t-122 -235.5t-244.5 -119t-246.5 122q-68 67 -68 103.5t42 36.5q15 0 28 -12q18 -24 56 -70q95 -98 187.5 -98t186.5 94.5t94 187.5q0 119 -172 291l-820 820q19 -77 19 -150q0 -173 -101 -345q-8 -13 -18.5 -13t-30.5 20t-20 30l35 69 q56 112 56 249q0 160 -76 283q-40 66 -40 68q0 23 24 23l67 -40q127 -76 273 -76t259 56q71 35 67 35q10 0 30.5 -19t20.5 -31t-12 -19q-165 -100 -346 -100q-76 0 -149 18l735 -735q142 -142 184 -196z" />
+<glyph unicode="&#x2924;" horiz-adv-x="1503" d="M1379 1459q0 -2 -41 -68q-75 -123 -75 -271.5t56 -260.5l35 -69q0 -10 -20 -30t-30.5 -20t-18.5 13q-101 172 -101 345q0 73 19 150l-820 -820q-172 -172 -172 -291q0 -93 94 -187.5t186.5 -94.5t187.5 98q17 25 56 70q13 12 28 12q42 0 42 -36.5t-68 -103.5 q-124 -122 -246.5 -122t-244.5 119t-122 235.5t102 247.5q42 54 184 196l735 735q-73 -18 -149 -18q-181 0 -346 100q-12 7 -12 19t20.5 31t30.5 19q-4 0 67 -35q113 -56 259 -56t273 76l67 40q24 0 24 -23z" />
+<glyph unicode="&#x2925;" horiz-adv-x="1503" d="M1379 -204q0 -23 -24 -23l-67 40q-127 76 -273 76t-259 -56q-71 -35 -67 -35q-10 0 -30.5 19t-20.5 31t12 19q165 100 346 100q76 0 149 -18l-735 735q-142 142 -184 196q-102 131 -102 247.5t122 235.5t244.5 119t246.5 -122q68 -67 68 -103.5t-42 -36.5q-15 0 -28 12 q-18 24 -56 70q-95 98 -187.5 98t-186.5 -94.5t-94 -187.5q0 -119 172 -291l820 -820q-19 77 -19 150q0 173 101 345q8 13 18.5 13t30.5 -20t20 -30l-35 -69q-56 -112 -56 -249q0 -160 75 -283q41 -66 41 -68z" />
+<glyph unicode="&#x2926;" horiz-adv-x="1503" d="M1257 1363q122 -119 122 -235.5t-102 -247.5q-42 -54 -184 -196l-735 -735q73 18 149 18q181 0 346 -100q12 -7 12 -19t-20.5 -31t-30.5 -19q4 0 -67 35q-113 56 -259 56t-273 -76l-67 -40q-24 0 -24 23q0 2 40 68q76 123 76 271.5t-56 260.5l-35 69q0 10 20 30t30.5 20 t18.5 -13q101 -172 101 -345q0 -73 -19 -150l820 820q172 172 172 291q0 93 -94 187.5t-186.5 94.5t-187.5 -98q-17 -25 -56 -70q-13 -12 -28 -12q-42 0 -42 36.5t68 103.5q124 122 246.5 122t244.5 -119z" />
+<glyph unicode="&#x2927;" d="M1924 -274q0 -44 -44 -44q-14 0 -24 10l-832 832l-832 -832q-10 -10 -24 -10q-44 0 -44 44q0 14 10 24l832 832l-666 666q19 -77 19 -150q0 -173 -101 -345q-8 -13 -18.5 -13t-30.5 20t-20 30l35 69q56 112 56 249q0 160 -76 283q-40 66 -40 68q0 23 24 23l67 -40 q127 -76 273 -76t259 56q71 35 67 35q10 0 30.5 -19t20.5 -31t-12 -19q-165 -100 -346 -100q-76 0 -149 18l666 -666l666 666q-73 -18 -149 -18q-181 0 -346 100q-12 7 -12 19t20.5 31t30.5 19q-4 0 67 -35q113 -56 259 -56t273 76l67 40q24 0 24 -23q0 -2 -40 -68 q-76 -123 -76 -271.5t56 -260.5l35 -69q0 -10 -20 -30t-30.5 -20t-18.5 13q-101 172 -101 345q0 73 19 150l-666 -666l832 -832q10 -10 10 -24z" />
+<glyph unicode="&#x2928;" d="M1924 -295q0 -23 -24 -23l-67 40q-127 76 -273 76t-259 -56q-71 -35 -67 -35q-10 0 -30.5 19t-20.5 31t12 19q165 100 346 100q76 0 149 -18l-666 666l-832 -832q-10 -10 -24 -10q-44 0 -44 44q0 14 10 24l832 832l-832 832q-10 10 -10 24q0 44 44 44q14 0 24 -10 l832 -832l666 666q-73 -18 -149 -18q-181 0 -346 100q-12 7 -12 19t20.5 31t30.5 19q-4 0 67 -35q113 -56 259 -56t273 76l67 40q24 0 24 -23q0 -2 -40 -68q-76 -123 -76 -271.5t56 -260.5l35 -69q0 -10 -20 -30t-30.5 -20t-18.5 13q-101 172 -101 345q0 73 19 150 l-666 -666l666 -666q-19 77 -19 150q0 173 101 345q8 13 18.5 13t30.5 -20t20 -30l-35 -69q-56 -112 -56 -249q0 -160 76 -283q40 -66 40 -68z" />
+<glyph unicode="&#x2929;" d="M1924 -295q0 -23 -24 -23l-67 40q-127 76 -273 76t-259 -56q-71 -35 -67 -35q-10 0 -30.5 19t-20.5 31t12 19q165 100 346 100q76 0 149 -18l-666 666l-666 -666q73 18 149 18q181 0 346 -100q12 -7 12 -19t-20.5 -31t-30.5 -19q4 0 -67 35q-113 56 -259 56t-273 -76 l-67 -40q-24 0 -24 23q0 2 40 68q76 123 76 271.5t-56 260.5l-35 69q0 10 20 30t30.5 20t18.5 -13q101 -172 101 -345q0 -73 -19 -150l666 666l-832 832q-10 10 -10 24q0 44 44 44q14 0 24 -10l832 -832l832 832q10 10 24 10q44 0 44 -44q0 -14 -10 -24l-832 -832l666 -666 q-19 77 -19 150q0 173 101 345q8 13 18.5 13t30.5 -20t20 -30l-35 -69q-56 -112 -56 -249q0 -160 76 -283q40 -66 40 -68z" />
+<glyph unicode="&#x292a;" d="M1924 -274q0 -44 -44 -44q-14 0 -24 10l-832 832l-666 -666q73 18 149 18q181 0 346 -100q12 -7 12 -19t-20.5 -31t-30.5 -19q4 0 -67 35q-113 56 -259 56t-273 -76l-67 -40q-24 0 -24 23q0 2 40 68q76 123 76 271.5t-56 260.5l-35 69q0 10 20 30t30.5 20t18.5 -13 q101 -172 101 -345q0 -73 -19 -150l666 666l-666 666q19 -77 19 -150q0 -173 -101 -345q-8 -13 -18.5 -13t-30.5 20t-20 30l35 69q56 112 56 249q0 160 -76 283q-40 66 -40 68q0 23 24 23l67 -40q127 -76 273 -76t259 56q71 35 67 35q10 0 30.5 -19t20.5 -31t-12 -19 q-165 -100 -346 -100q-76 0 -149 18l666 -666l832 832q10 10 24 10q44 0 44 -44q0 -14 -10 -24l-832 -832l832 -832q10 -10 10 -24z" />
+<glyph unicode="&#x292b;" d="M1924 1438q0 -14 -10 -24l-1722 -1722q-10 -10 -24 -10q-44 0 -44 44q0 14 10 24l1722 1722q10 10 24 10q44 0 44 -44zM124 1438q0 44 44 44q14 0 24 -10l774 -774l-58 -58l-774 774q-10 10 -10 24zM1924 -274q0 -44 -44 -44q-14 0 -24 10l-774 774l58 58l774 -774 q10 -10 10 -24z" />
+<glyph unicode="&#x292c;" d="M1924 1438q0 -14 -10 -24l-774 -774l-58 58l774 774q10 10 24 10q44 0 44 -44zM1924 -274q0 -44 -44 -44q-14 0 -24 10l-1722 1722q-10 10 -10 24q0 44 44 44q14 0 24 -10l1722 -1722q10 -10 10 -24zM168 -318q-44 0 -44 44q0 14 10 24l774 774l58 -58l-774 -774 q-10 -10 -24 -10z" />
+<glyph unicode="&#x292d;" d="M1924 -295q0 -23 -24 -23l-67 40q-127 76 -273 76t-259 -56q-71 -35 -67 -35q-10 0 -30.5 19t-20.5 31t12 19q165 100 346 100q76 0 149 -18l-1556 1556q-10 10 -10 24q0 44 44 44q14 0 24 -10l1556 -1556q-19 77 -19 150q0 173 101 345q8 13 18.5 13t30.5 -20t20 -30 l-35 -69q-56 -112 -56 -249q0 -160 76 -283q40 -66 40 -68zM1924 1459q0 -2 -40 -68q-76 -123 -76 -271.5t56 -260.5l35 -69q0 -10 -20 -30t-30.5 -20t-18.5 13q-101 172 -101 345q0 73 19 150l-608 -608l-58 58l608 608q-73 -18 -149 -18q-181 0 -346 100q-12 7 -12 19 t20.5 31t30.5 19q-4 0 67 -35q113 -56 259 -56t273 76l67 40q24 0 24 -23zM168 -318q-44 0 -44 44q0 14 10 24l774 774l58 -58l-774 -774q-10 -10 -24 -10z" />
+<glyph unicode="&#x292e;" d="M1924 1459q0 -2 -40 -68q-76 -123 -76 -271.5t56 -260.5l35 -69q0 -10 -20 -30t-30.5 -20t-18.5 13q-101 172 -101 345q0 73 19 150l-1556 -1556q-10 -10 -24 -10q-44 0 -44 44q0 14 10 24l1556 1556q-73 -18 -149 -18q-181 0 -346 100q-12 7 -12 19t20.5 31t30.5 19 q-4 0 67 -35q113 -56 259 -56t273 76l67 40q24 0 24 -23zM124 1438q0 44 44 44q14 0 24 -10l774 -774l-58 -58l-774 774q-10 10 -10 24zM1924 -295q0 -23 -24 -23l-67 40q-127 76 -273 76t-259 -56q-71 -35 -67 -35q-10 0 -30.5 19t-20.5 31t12 19q165 100 346 100 q76 0 149 -18l-608 608l58 58l608 -608q-19 77 -19 150q0 173 101 345q8 13 18.5 13t30.5 -20t20 -30l-35 -69q-56 -112 -56 -249q0 -160 76 -283q40 -66 40 -68z" />
+<glyph unicode="&#x292f;" d="M1924 1459q0 -2 -40 -68q-76 -123 -76 -271.5t56 -260.5l35 -69q0 -10 -20 -30t-30.5 -20t-18.5 13q-101 172 -101 345q0 73 19 150l-608 -608l-58 58l608 608q-73 -18 -149 -18q-181 0 -346 100q-12 7 -12 19t20.5 31t30.5 19q-4 0 67 -35q113 -56 259 -56t273 76l67 40 q24 0 24 -23zM1924 -274q0 -44 -44 -44q-14 0 -24 10l-1722 1722q-10 10 -10 24q0 44 44 44q14 0 24 -10l1722 -1722q10 -10 10 -24zM168 -318q-44 0 -44 44q0 14 10 24l774 774l58 -58l-774 -774q-10 -10 -24 -10z" />
+<glyph unicode="&#x2930;" d="M124 1438q0 44 44 44q14 0 24 -10l774 -774l-58 -58l-774 774q-10 10 -10 24zM1924 -295q0 -23 -24 -23l-67 40q-127 76 -273 76t-259 -56q-71 -35 -67 -35q-10 0 -30.5 19t-20.5 31t12 19q165 100 346 100q76 0 149 -18l-608 608l58 58l608 -608q-19 77 -19 150 q0 173 101 345q8 13 18.5 13t30.5 -20t20 -30l-35 -69q-56 -112 -56 -249q0 -160 76 -283q40 -66 40 -68zM1924 1438q0 -14 -10 -24l-1722 -1722q-10 -10 -24 -10q-44 0 -44 44q0 14 10 24l1722 1722q10 10 24 10q44 0 44 -44z" />
+<glyph unicode="&#x2931;" d="M1924 1459q0 -2 -40 -68q-76 -123 -76 -271.5t56 -260.5l35 -69q0 -10 -20 -30t-30.5 -20t-18.5 13q-101 172 -101 345q0 73 19 150l-1556 -1556q-10 -10 -24 -10q-44 0 -44 44q0 14 10 24l1556 1556q-73 -18 -149 -18q-181 0 -346 100q-12 7 -12 19t20.5 31t30.5 19 q-4 0 67 -35q113 -56 259 -56t273 76l67 40q24 0 24 -23zM319 1098q0 -173 -101 -345q-8 -13 -18.5 -13t-30.5 20t-20 30l35 69q56 112 56 249q0 160 -76 283q-40 66 -40 68q0 23 24 23l67 -40q127 -76 273 -76t259 56q71 35 67 35q10 0 30.5 -19t20.5 -31t-12 -19 q-165 -100 -346 -100q-76 0 -149 18l608 -608l-58 -58l-608 608q19 -77 19 -150zM1924 -274q0 -44 -44 -44q-14 0 -24 10l-774 774l58 58l774 -774q10 -10 10 -24z" />
+<glyph unicode="&#x2932;" d="M1924 -274q0 -44 -44 -44q-14 0 -24 10l-1556 1556q19 -77 19 -150q0 -173 -101 -345q-8 -13 -18.5 -13t-30.5 20t-20 30l35 69q56 112 56 249q0 160 -76 283q-40 66 -40 68q0 23 24 23l67 -40q127 -76 273 -76t259 56q71 35 67 35q10 0 30.5 -19t20.5 -31t-12 -19 q-165 -100 -346 -100q-76 0 -149 18l1556 -1556q10 -10 10 -24zM1924 1459q0 -2 -40 -68q-76 -123 -76 -271.5t56 -260.5l35 -69q0 -10 -20 -30t-30.5 -20t-18.5 13q-101 172 -101 345q0 73 19 150l-608 -608l-58 58l608 608q-73 -18 -149 -18q-181 0 -346 100q-12 7 -12 19 t20.5 31t30.5 19q-4 0 67 -35q113 -56 259 -56t273 76l67 40q24 0 24 -23zM168 -318q-44 0 -44 44q0 14 10 24l774 774l58 -58l-774 -774q-10 -10 -24 -10z" />
+<glyph unicode="&#x2933;" d="M1980 582q0 -16 -15 -20q-163 -57 -276.5 -191t-144.5 -305q-3 -19 -21 -19h-41q-20 0 -20 27q51 292 295 467h-73q-84 0 -240.5 -114.5t-263 -114.5t-207.5 77q-63 48 -162.5 161t-152.5 156q-84 66 -163 66t-162 -66q-50 -41 -148 -151q-12 -14 -31 -14q-39 0 -39 41 q0 14 11 27q105 121 164 167q101 78 205 78t206 -78q59 -46 160.5 -161t153.5 -156q83 -65 164 -65t240.5 114.5t264.5 114.5h73q-244 175 -295 467q0 27 20 27h41q18 0 21 -19q31 -171 144.5 -304.5t276.5 -188.5q15 -7 15 -23z" />
+<glyph unicode="&#x2934;" horiz-adv-x="1731" d="M1098 1324q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q132 46 229.5 150.5t132.5 238.5q3 23 13 67q6 18 24 18t22 -18q4 -22 13 -66q35 -135 132.5 -239.5t229.5 -150.5q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59 q-158 84 -248 232v-429q0 -244 -194 -316q-104 -38 -401 -38h-431q-39 0 -39 41t39 41h551q184 0 271 44q122 62 122 228v429z" />
+<glyph unicode="&#x2935;" horiz-adv-x="1731" d="M1180 -160q136 223 414 293q22 0 22 -18q0 -60 -14 -64q-22 -6 -65 -19q-132 -46 -229.5 -150.5t-132.5 -239.5q-4 -22 -13 -66q-4 -18 -22 -18t-24 18q-4 23 -13 67q-35 134 -132.5 238.5t-229.5 150.5q-22 6 -65 19q-14 6 -14 19q0 51 -1 40q2 23 23 23l6 -2 q104 -29 161 -59q157 -83 247 -232v429q0 166 -122 228q-87 44 -271 44h-551q-39 0 -39 41t39 41h431q297 0 401 -38q194 -72 194 -316v-429z" />
+<glyph unicode="&#x2936;" horiz-adv-x="1731" d="M397 541q223 -136 293 -414q0 -22 -18 -22q-60 0 -64 14q-6 22 -19 65q-46 132 -150.5 229.5t-239.5 132.5q-22 4 -66 13q-18 4 -18 22t18 24q23 4 67 13q134 35 238.5 132.5t150.5 229.5q6 22 19 65q6 14 19 14q51 0 40 1q23 -2 23 -23l-2 -6q-29 -104 -59 -161 q-83 -157 -232 -247h429q166 0 228 122q44 87 44 271v551q0 39 41 39t41 -39v-431q0 -297 -38 -401q-72 -194 -316 -194h-429z" />
+<glyph unicode="&#x2937;" horiz-adv-x="1731" d="M898 623q-223 135 -293 414q0 21 23 23q-11 -1 40 -1q13 0 19 -14q6 -22 19 -65q46 -132 150.5 -229.5t238.5 -132.5q23 -3 67 -13q18 -6 18 -24t-18 -22q-22 -4 -66 -13q-135 -35 -239.5 -132.5t-150.5 -229.5q-6 -22 -19 -65q-4 -14 -64 -14q-18 0 -18 22l2 6 q28 102 59 160q84 158 232 248h-429q-244 0 -316 194q-38 104 -38 401v431q0 39 41 39t41 -39v-551q0 -184 44 -271q62 -122 228 -122h429z" />
+<glyph unicode="&#x2938;" horiz-adv-x="1024" d="M706.5 1141q120.5 -253 120.5 -512.5t-118.5 -500.5t-323.5 -409q16 1 35 1q67 0 166 -16q126 -22 126 -71q0 -42 -38 -42l-77 27q-78 27 -161 27t-169 -23q-19 -5 -25 -5q-17 0 -17 17q0 6 14 58.5t14 135t-28 161.5l-28 79q0 37 42.5 37t66 -103.5t23.5 -147t-2 -78.5 q418 368 418 853q0 397 -278 729l-136 138q-14 15 -14 30q0 43 41 43q15 0 28 -11q200 -164 320.5 -417z" />
+<glyph unicode="&#x2939;" horiz-adv-x="1024" d="M827 68l-28 -79q-28 -79 -28 -161.5t23 -168.5q5 -19 5 -25q0 -17 -17 -17q-6 0 -58.5 14t-135.5 14t-161 -27l-77 -27q-38 0 -38 42q0 49 126 71q99 16 166 16q19 0 35 -1q-205 168 -323.5 409t-118.5 500.5t120.5 512.5t320.5 417q13 11 28 11q41 0 41 -43 q0 -15 -14 -30q-47 -44 -136 -138q-278 -332 -278 -729q0 -485 418 -853q-2 35 -2 78.5t23.5 147t66 103.5t42.5 -37z" />
+<glyph unicode="&#x293a;" d="M2013 743q0 -41 -43 -41q-15 0 -30 14q-44 47 -138 136q-332 278 -729 278q-485 0 -853 -418q35 2 78.5 2t147 -23.5t103.5 -66t-37 -42.5l-79 28q-79 28 -161.5 28t-168.5 -23q-19 -5 -25 -5q-17 0 -17 17q0 6 14 58.5t14 135.5t-27 161l-27 77q0 38 42 38q49 0 71 -126 q16 -99 16 -166q0 -19 -1 -35q168 205 409 323.5t500.5 118.5t512.5 -120.5t417 -320.5q11 -13 11 -28z" />
+<glyph unicode="&#x293b;" d="M1971 697q-49 0 -71 126q-16 99 -16 166q0 19 1 35q-168 -205 -409 -323.5t-500.5 -118.5t-512.5 120.5t-417 320.5q-11 13 -11 28q0 41 43 41q15 0 30 -14q44 -47 138 -136q332 -278 729 -278q485 0 853 418q-35 -2 -78.5 -2t-147 23.5t-103.5 66t37 42.5l79 -28 q79 -28 161.5 -28t168.5 23q19 5 25 5q17 0 17 -17q0 -6 -14 -58.5t-14 -135.5t27 -161l27 -77q0 -38 -42 -38z" />
+<glyph unicode="&#x293c;" d="M1986 982q-27 -78 -27 -161t23 -169q5 -19 5 -25q0 -17 -17 -17q-6 0 -58.5 14t-135 14t-161.5 -28l-79 -28q-37 0 -37 42.5t103.5 66t147 23.5t78.5 -2q-368 418 -853 418q-397 0 -729 -278l-138 -136q-15 -14 -30 -14q-43 0 -43 41q0 15 11 28q164 200 417 320.5 t512.5 120.5t500.5 -118.5t409 -323.5q-1 16 -1 35q0 67 16 166q22 126 71 126q42 0 42 -38zM1260 582q0 -41 -39 -41h-574q-37 0 -37 41t37 41h574q39 0 39 -41z" />
+<glyph unicode="&#x293d;" d="M2013 743q0 -41 -43 -41q-15 0 -30 14q-44 47 -138 136q-332 278 -729 278q-485 0 -853 -418q35 2 78.5 2t147 -23.5t103.5 -66t-37 -42.5l-79 28q-79 28 -161.5 28t-168.5 -23q-19 -5 -25 -5q-17 0 -17 17q0 6 14 58.5t14 135.5t-27 161l-27 77q0 38 42 38q49 0 71 -126 q16 -99 16 -166q0 -19 -1 -35q168 205 409 323.5t500.5 118.5t512.5 -120.5t417 -320.5q11 -13 11 -28zM1438 582q0 -41 -37 -41h-247v-245q0 -39 -41 -39t-41 39v245h-245q-39 0 -39 41t39 41h245v247q0 37 41 37t41 -37v-247h247q37 0 37 -41z" />
+<glyph unicode="&#x293e;" d="M1687 732q0 -321 -231.5 -538t-556.5 -217t-553 225q2 -23 2 -72.5t-22.5 -152t-65 -102.5t-42.5 38q0 -3 27.5 79.5t27.5 163t-14 131.5t-14 58q0 17 17 17q6 0 57.5 -14t133 -14t164.5 28t78 28q38 0 38 -42.5t-103.5 -66t-153 -23.5t-72.5 2q204 -200 495 -200 t499.5 192.5t208.5 478.5q0 209 -114 424q-61 115 -144 210l-47 51q-10 11 -10 25q0 43 41 43q15 0 32 -16q143 -136 232.5 -338.5t89.5 -397.5z" />
+<glyph unicode="&#x293f;" d="M1687 -87q0 -38 -42.5 -38t-65 102.5t-22.5 152t2 72.5q-228 -225 -553 -225t-556.5 217t-231.5 538q0 195 89.5 397.5t232.5 338.5q17 16 32 16q41 0 41 -43q0 -14 -13 -28l-44 -48q-83 -95 -144 -210q-114 -215 -114 -424q0 -286 208.5 -478.5t499.5 -192.5t495 200 q-23 -2 -72.5 -2t-153 23.5t-103.5 66t38 42.5q-5 0 78 -28t164.5 -28t133 14t57.5 14q17 0 17 -17q0 -7 -14 -58t-14 -131.5t28 -163.5z" />
+<glyph unicode="&#x2940;" horiz-adv-x="1591" d="M1312.5 1087q205.5 -211 205.5 -507t-211.5 -508.5t-509.5 -212.5t-510.5 212.5t-212.5 510.5q0 263 168.5 464.5t427.5 247.5q152 89 222 227q8 20 25 59q13 26 36 26q42 0 42 -39q0 -7 -3 -15q-55 -143 -178 -247q293 -7 498.5 -218zM1248.5 129.5 q187.5 188.5 187.5 450.5t-181.5 449t-441.5 194v-1q125 -105 179 -246q3 -8 3 -15q0 -39 -42 -39q-23 0 -33 23l-28 61q-63 124 -194 209q-234 -36 -388 -216t-154 -417q0 -264 188.5 -452.5t452.5 -188.5t451.5 188.5z" />
+<glyph unicode="&#x2941;" horiz-adv-x="1591" d="M1518 582q0 -298 -212.5 -510.5t-510.5 -212.5t-509.5 212.5t-211.5 508.5t205.5 507t498.5 218q-123 104 -178 247q-3 8 -3 15q0 39 42 39q23 0 33 -23l28 -62q70 -138 222 -227q259 -46 427.5 -247.5t168.5 -464.5zM1436 582q0 237 -154 417t-388 216 q-131 -85 -194 -209q-8 -20 -25 -58q-13 -26 -36 -26q-42 0 -42 39q0 7 3 15q54 141 179 246v1q-260 -7 -441.5 -194t-181.5 -449t187.5 -450.5t451.5 -188.5t452.5 188.5t188.5 452.5z" />
+<glyph unicode="&#x2942;" d="M1651 995q-223 135 -293 414q0 21 23 23q-11 -1 40 -1q13 0 19 -14q6 -22 19 -65q46 -132 150.5 -229.5t238.5 -132.5q23 -3 67 -13q18 -6 18 -24t-18 -22q-22 -4 -66 -13q-135 -35 -239.5 -132.5t-150.5 -229.5q-6 -22 -19 -65q-4 -14 -64 -14q-18 0 -18 22l2 6 q28 102 59 160q84 158 232 248h-1499q-37 0 -37 41t37 41h1499zM397 231q224 -137 293 -414q0 -20 -24 -23q9 1 -39 1q-15 0 -19 14q-5 22 -18 65q-45 131 -151 229t-240 133q-22 4 -66 13q-18 5 -18 23.5t24.5 24t46.5 8.5q205 48 329 221q46 64 74 144q6 23 19 65 q6 14 64 14q18 0 18 -22l-2 -6q-38 -143 -108 -241.5t-183 -166.5h639q37 0 37 -41t-37 -41h-639z" />
+<glyph unicode="&#x2943;" d="M397 913q223 -136 293 -414q0 -22 -18 -22q-60 0 -64 14q-6 22 -19 65q-46 132 -150.5 229.5t-239.5 132.5q-22 4 -66 13q-18 4 -18 22t18 24q23 4 67 13q134 35 238.5 132.5t150.5 229.5q6 23 19 65q6 14 19 14q51 0 40 1q23 -2 23 -23l-2 -6q-29 -104 -59 -161 q-83 -157 -232 -247h1499q37 0 37 -41t-37 -41h-1499zM1651 313q-223 134 -293 414q0 22 18 22q58 0 64 -14q6 -22 19 -65q67 -192 239 -298q75 -46 164 -67q22 -3 43 -7q28 -7 28 -25.5t-18 -23.5q-22 -4 -66 -13q-134 -35 -240 -133t-151 -229l-18 -65q-4 -14 -19 -14 q-48 0 -39 -1q-24 3 -24 23l2 6q38 139 109 239.5t182 168.5h-639q-37 0 -37 41t37 41h639z" />
+<glyph unicode="&#x2944;" d="M1651 995q-224 137 -293 414q0 20 24 23q-9 -1 39 -1q15 0 19 -14q5 -22 18 -65q45 -131 151 -229t240 -133q22 -4 66 -13q18 -5 18 -23.5t-24.5 -24t-46.5 -8.5q-205 -48 -329 -221q-46 -64 -74 -144q-6 -23 -19 -65q-6 -14 -64 -14q-18 0 -18 22l2 6q38 143 108 241.5 t183 166.5h-639q-37 0 -37 41t37 41h639zM397 231q223 -135 293 -414q0 -21 -23 -23q11 1 -40 1q-13 0 -19 14q-6 22 -19 65q-46 132 -150.5 229.5t-238.5 132.5q-23 3 -67 13q-18 6 -18 24t18 22q22 4 66 13q135 35 239.5 132.5t150.5 229.5q6 22 19 65q4 14 64 14 q18 0 18 -22l-2 -6q-28 -102 -59 -160q-84 -158 -232 -248h1499q37 0 37 -41t-37 -41h-1499z" />
+<glyph unicode="&#x2945;" d="M1651 895q-223 135 -293 414q0 21 23 23q-11 -1 40 -1q13 0 19 -14q6 -22 19 -65q46 -132 150.5 -229.5t238.5 -132.5q23 -3 67 -13q18 -6 18 -24t-18 -22q-22 -4 -66 -13q-135 -35 -239.5 -132.5t-150.5 -229.5q-6 -22 -19 -65q-4 -14 -64 -14q-18 0 -18 22l2 6 q28 102 59 160q84 158 232 248h-1499q-37 0 -37 41t37 41h1499zM965 272q0 -41 -37 -41h-347v-345q0 -39 -41 -39t-41 39v345h-345q-39 0 -39 41t39 41h345v347q0 37 41 37t41 -37v-347h347q37 0 37 -41z" />
+<glyph unicode="&#x2946;" d="M397 813q223 -136 293 -414q0 -22 -18 -22q-60 0 -64 14q-6 22 -19 65q-46 132 -150.5 229.5t-239.5 132.5q-22 4 -66 13q-18 4 -18 22t18 24q23 4 67 13q134 35 238.5 132.5t150.5 229.5q6 22 19 65q6 14 19 14q51 0 40 1q23 -2 23 -23l-2 -6q-29 -104 -59 -161 q-83 -157 -232 -247h1499q37 0 37 -41t-37 -41h-1499zM1933 272q0 -41 -39 -41h-345v-345q0 -39 -41 -39t-41 39v345h-347q-37 0 -37 41t37 41h347v347q0 37 41 37t41 -37v-347h345q39 0 39 -41z" />
+<glyph unicode="&#x2947;" d="M1906 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-906l274 -274q13 -13 13 -27t-15 -29t-29 -15t-27 13l-315 315l-315 -315q-13 -13 -27 -13t-29 15t-15 29t13 27l274 274h-450 q-39 0 -39 41t39 41h450l-275 275q-26 26 3 55t55 3l316 -316l316 316q26 26 55 -3t3 -55l-275 -275h906q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310z" />
+<glyph unicode="&#x2948;" d="M1917 605q14 -8 14 -22.5t-14 -20.5q-223 -79 -343 -283q-43 -74 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-354q-15 -124 -109 -208t-221 -84t-221 84t-109 208h-356q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19 q-35 177 -143 305t-277 191q-16 6 -16 20.5t59 39.5q138 59 233.5 171.5t133.5 261.5q3 15 10 43q5 18 25 20q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h356q15 124 109 208t221 84t221 -84t109 -208h354q-154 111 -238 288q-57 121 -57 179q0 24 21 27h41 q15 0 20 -19q49 -191 144 -303t225 -169q19 -6 53 -21zM1024 835q-94 0 -164.5 -60.5t-85.5 -151.5h500q-15 91 -85.5 151.5t-164.5 60.5zM1024 329q94 0 164.5 60.5t85.5 151.5h-500q15 -91 85.5 -151.5t164.5 -60.5z" />
+<glyph unicode="&#x2949;" horiz-adv-x="1024" d="M471 1200q-135 -223 -414 -293q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q132 46 229.5 150.5t132.5 238.5q3 23 13 67q6 18 24 18t22 -18q4 -22 13 -66q35 -135 132.5 -239.5t229.5 -150.5q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59 q-158 84 -248 232v-140q38 -129 134 -228.5t223 -143.5q22 -6 65 -19q14 -4 14 -64q0 -18 -22 -18l-6 2q-102 28 -160 59q-158 84 -248 232v-535q124 -15 208 -109t84 -226.5t-97.5 -230t-235.5 -97.5t-235.5 97.5t-97.5 230t84 226.5t208 109v535q-135 -223 -414 -293 q-21 0 -23 23q1 -11 1 40q0 13 14 19q22 6 65 19q127 44 223 143.5t134 227.5v141zM765 15q0 105 -74 179t-179 74t-179 -74t-74 -179t74 -179t179 -74t179 74t74 179z" />
+<glyph unicode="&#x294a;" d="M1931 582q0 -16 -21.5 -25t-40.5 -16q-134 -57 -230 -170t-133 -258q-3 -28 -25 -64q-6 -3 -18 -3q-50 0 -50 28q0 5 7 35q64 269 288 432h-1526q-67 0 -67 41q0 16 62 41q132 54 230 170t133 258q2 16 11 47q8 20 45 20t37 -28q0 -7 -7 -35q-69 -273 -288 -432h1526 q67 0 67 -41z" />
+<glyph unicode="&#x294b;" d="M1931 582q0 -41 -67 -41h-1526q219 -159 288 -432q7 -28 7 -35q0 -28 -37 -28t-45 20q-4 16 -11 47q-35 142 -133 258t-230 170q-62 25 -62 41q0 41 67 41h1526q-224 163 -288 432q-7 30 -7 35q0 28 50 28q25 0 30.5 -18t12.5 -49q37 -145 133 -258t230 -170 q19 -7 40.5 -16t21.5 -25z" />
+<glyph unicode="&#x294c;" horiz-adv-x="1142" d="M1087 1062q20 -8 20 -45t-28 -37q-7 0 -35 7q-273 69 -432 288v-1526q0 -67 -41 -67q-16 0 -41 62q-54 132 -170 230t-258 133q-16 2 -47 11q-20 8 -20 45t28 37q7 0 35 -7q273 -69 432 -288v1526q0 67 41 67q16 0 41 -62q54 -132 170 -230t258 -133q16 -2 47 -11z" />
+<glyph unicode="&#x294d;" horiz-adv-x="1142" d="M1079 200q28 0 28 -37t-20 -45q-16 -4 -47 -11q-142 -35 -258 -133t-170 -230q-25 -62 -41 -62q-41 0 -41 67v1526q-159 -219 -432 -288q-28 -7 -35 -7q-28 0 -28 37t20 45q16 4 47 11q142 35 258 133t170 230q25 62 41 62q41 0 41 -67v-1526q159 219 432 288q28 7 35 7z " />
+<glyph unicode="&#x294e;" d="M1931 582q0 -41 -67 -41h-1682q-67 0 -67 41q0 16 62 41q132 54 230 170t133 258q2 16 11 47q8 20 45 20t37 -28q0 -7 -7 -35q-69 -273 -288 -432h1370q-219 159 -288 432q-7 28 -7 35q0 28 37 28t45 -20q4 -16 11 -47q35 -142 133 -258t230 -170q62 -25 62 -41z" />
+<glyph unicode="&#x294f;" horiz-adv-x="1024" d="M961 200q28 0 28 -37t-20 -45q-16 -4 -47 -11q-142 -35 -258 -133t-170 -230q-25 -62 -41 -62q-41 0 -41 67v1682q0 67 41 67q16 0 41 -62q54 -132 170 -230t258 -133q16 -2 47 -11q20 -8 20 -45t-28 -37q-7 0 -35 7q-273 69 -432 288v-1370q159 219 432 288q28 7 35 7z " />
+<glyph unicode="&#x2950;" d="M1931 582q0 -16 -62 -41q-132 -54 -230 -170t-133 -258q-2 -16 -11 -47q-8 -20 -45 -20t-37 28q0 7 7 35q69 273 288 432h-1370q219 -159 288 -432q7 -28 7 -35q0 -28 -37 -28t-45 20q-4 16 -11 47q-35 142 -133 258t-230 170q-62 25 -62 41q0 41 67 41h1682q67 0 67 -41 z" />
+<glyph unicode="&#x2951;" horiz-adv-x="1024" d="M612 -251q0 -67 -41 -67q-16 0 -41 62q-54 132 -170 230t-258 133q-16 2 -47 11q-20 8 -20 45t28 37q7 0 35 -7q273 -69 432 -288v1370q-159 -219 -432 -288q-28 -7 -35 -7q-28 0 -28 37t20 45q16 4 47 11q142 35 258 133t170 230q25 62 41 62q41 0 41 -67v-1682z" />
+<glyph unicode="&#x2952;" d="M1931 582q0 -41 -39 -41h-1650q-67 0 -67 41q0 16 62 41q132 54 230 170t133 258q2 16 11 47q8 20 45 20t37 -28q0 -7 -7 -35q-69 -273 -288 -432h1494q39 0 39 -41zM165 44q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-1077z" />
+<glyph unicode="&#x2953;" d="M1963 44q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-1077zM1871 582q0 -41 -67 -41h-1650q-39 0 -39 41t39 41h1494q-219 159 -288 432q-7 28 -7 35q0 28 37 28t45 -20q4 -16 11 -47q35 -142 133 -258t230 -170q62 -25 62 -41z" />
+<glyph unicode="&#x2954;" horiz-adv-x="1024" d="M1053 1489q0 -41 -61 -41h-1077q-62 0 -62 41t62 41h1077q61 0 61 -41zM969 1002q20 -8 20 -45t-28 -37q-7 0 -35 7q-273 69 -432 288v-1494q0 -39 -41 -39t-41 39v1650q0 67 41 67q16 0 41 -62q54 -132 170 -230t258 -133q16 -2 47 -11z" />
+<glyph unicode="&#x2955;" horiz-adv-x="1024" d="M961 260q28 0 28 -37t-20 -45q-16 -4 -47 -11q-142 -35 -258 -133t-170 -230q-25 -62 -41 -62q-41 0 -41 67v1650q0 39 41 39t41 -39v-1494q159 219 432 288q28 7 35 7zM1053 -309q0 -41 -61 -41h-1077q-62 0 -62 41t62 41h1077q61 0 61 -41z" />
+<glyph unicode="&#x2956;" d="M1931 582q0 -41 -39 -41h-1494q219 -159 288 -432q7 -28 7 -35q0 -28 -37 -28t-45 20q-4 16 -11 47q-35 142 -133 258t-230 170q-62 25 -62 41q0 41 67 41h1650q39 0 39 -41zM165 44q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-1077z" />
+<glyph unicode="&#x2957;" d="M1963 44q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-1077zM1871 582q0 -16 -62 -41q-132 -54 -230 -170t-133 -258q-2 -16 -11 -47q-8 -20 -45 -20t-37 28q0 7 7 35q69 273 288 432h-1494q-39 0 -39 41t39 41h1650q67 0 67 -41z" />
+<glyph unicode="&#x2958;" horiz-adv-x="1024" d="M1053 1489q0 -41 -61 -41h-1077q-62 0 -62 41t62 41h1077q61 0 61 -41zM494 -279q0 -39 -41 -39t-41 39v1494q-159 -219 -432 -288q-28 -7 -35 -7q-28 0 -28 37t20 45q16 4 47 11q142 35 258 133t170 230q25 62 41 62q41 0 41 -67v-1650z" />
+<glyph unicode="&#x2959;" horiz-adv-x="1024" d="M494 -191q0 -67 -41 -67q-16 0 -41 62q-54 132 -170 230t-258 133q-16 2 -47 11q-20 8 -20 45t28 37q7 0 35 -7q273 -69 432 -288v1494q0 39 41 39t41 -39v-1650zM1053 -309q0 -41 -61 -41h-1077q-62 0 -62 41t62 41h1077q61 0 61 -41z" />
+<glyph unicode="&#x295a;" d="M1965 44q0 -62 -41 -62t-41 62v497h-1701q-67 0 -67 41q0 16 62 41q132 54 230 170t133 258q2 16 11 47q8 20 45 20t37 -28q0 -7 -7 -35q-69 -273 -288 -432h1545v498q0 61 41 61t41 -61v-1077z" />
+<glyph unicode="&#x295b;" d="M1931 582q0 -41 -67 -41h-1701v-497q0 -62 -41 -62t-41 62v1077q0 61 41 61t41 -61v-498h1545q-219 159 -288 432q-7 28 -7 35q0 28 37 28t45 -20q4 -16 11 -47q35 -142 133 -258t230 -170q62 -25 62 -41z" />
+<glyph unicode="&#x295c;" horiz-adv-x="1024" d="M1053 -311q0 -41 -61 -41h-1077q-62 0 -62 41t62 41h497v1701q0 67 41 67q16 0 41 -62q54 -132 170 -230t258 -133q16 -2 47 -11q20 -8 20 -45t-28 -37q-7 0 -35 7q-273 69 -432 288v-1545h498q61 0 61 -41z" />
+<glyph unicode="&#x295d;" horiz-adv-x="1024" d="M1053 1491q0 -41 -61 -41h-498v-1545q159 219 432 288q28 7 35 7q28 0 28 -37t-20 -45q-16 -4 -47 -11q-142 -35 -258 -133t-170 -230q-25 -62 -41 -62q-41 0 -41 67v1701h-497q-62 0 -62 41t62 41h1077q61 0 61 -41z" />
+<glyph unicode="&#x295e;" d="M1965 43q0 -61 -41 -61t-41 61v498h-1545q219 -159 288 -432q7 -28 7 -35q0 -28 -37 -28t-45 20q-4 16 -11 47q-35 142 -133 258t-230 170q-62 25 -62 41q0 41 67 41h1701v497q0 62 41 62t41 -62v-1077z" />
+<glyph unicode="&#x295f;" d="M1931 582q0 -16 -62 -41q-132 -54 -230 -170t-133 -258q-2 -16 -11 -47q-8 -20 -45 -20t-37 28q0 7 7 35q69 273 288 432h-1545v-498q0 -61 -41 -61t-41 61v1077q0 62 41 62t41 -62v-497h1701q67 0 67 -41z" />
+<glyph unicode="&#x2960;" horiz-adv-x="1024" d="M1171 -311q0 -41 -62 -41h-1077q-61 0 -61 41t61 41h498v1545q-159 -219 -432 -288q-28 -7 -35 -7q-28 0 -28 37t20 45q16 4 47 11q142 35 258 133t170 230q25 62 41 62q41 0 41 -67v-1701h497q62 0 62 -41z" />
+<glyph unicode="&#x2961;" horiz-adv-x="1024" d="M1171 1491q0 -41 -62 -41h-497v-1701q0 -67 -41 -67q-16 0 -41 62q-54 132 -170 230t-258 133q-16 2 -47 11q-20 8 -20 45t28 37q7 0 35 -7q273 -69 432 -288v1545h-498q-61 0 -61 41t61 41h1077q62 0 62 -41z" />
+<glyph unicode="&#x2962;" d="M1931 342q0 -41 -39 -41h-1554q224 -163 288 -432q7 -30 7 -35q0 -28 -50 -28q-25 0 -30.5 18t-12.5 49q-37 145 -133 258t-230 170q-19 7 -40.5 16t-21.5 25q0 41 67 41h1710q39 0 39 -41zM1931 822q0 -41 -39 -41h-1710q-67 0 -67 41q0 16 62 41q132 54 230 170 t133 258q2 16 11 47q8 20 45 20t37 -28q0 -7 -7 -35q-69 -273 -288 -432h1554q39 0 39 -41z" />
+<glyph unicode="&#x2963;" horiz-adv-x="1622" d="M1567 1054q20 -8 20 -45t-28 -37q-7 0 -35 7q-273 69 -432 288v-1554q0 -39 -41 -39t-41 39v1710q0 67 41 67q16 0 41 -62q54 -132 170 -230t258 -133q16 -2 47 -11zM612 -287q0 -39 -41 -39t-41 39v1554q-163 -224 -432 -288q-30 -7 -35 -7q-28 0 -28 50q0 25 18 30.5 t49 12.5q145 37 258 133t170 230q7 19 16 40.5t25 21.5q41 0 41 -67v-1710z" />
+<glyph unicode="&#x2964;" d="M1931 342q0 -16 -21.5 -25t-40.5 -16q-134 -57 -230 -170t-133 -258q-3 -28 -25 -64q-6 -3 -18 -3q-50 0 -50 28q0 5 7 35q64 269 288 432h-1554q-39 0 -39 41t39 41h1710q67 0 67 -41zM1931 822q0 -41 -67 -41h-1710q-39 0 -39 41t39 41h1554q-219 159 -288 432 q-7 28 -7 35q0 28 37 28t45 -20q4 -16 11 -47q35 -142 133 -258t230 -170q62 -25 62 -41z" />
+<glyph unicode="&#x2965;" horiz-adv-x="1622" d="M1559 192q28 0 28 -37t-20 -45q-16 -4 -47 -11q-142 -35 -258 -133t-170 -230q-25 -62 -41 -62q-41 0 -41 67v1710q0 39 41 39t41 -39v-1554q159 219 432 288q28 7 35 7zM612 -259q0 -67 -41 -67q-16 0 -25 21.5t-16 40.5q-57 134 -170 230t-258 133q-28 3 -64 25 q-3 6 -3 18q0 50 28 50q5 0 35 -7q269 -64 432 -288v1554q0 39 41 39t41 -39v-1710z" />
+<glyph unicode="&#x2966;" d="M1931 292q0 -41 -67 -41h-1710q-39 0 -39 41t39 41h1554q-219 159 -288 432q-7 28 -7 35q0 28 37 28t45 -20q4 -16 11 -47q35 -142 133 -258t230 -170q62 -25 62 -41zM1931 872q0 -41 -39 -41h-1710q-67 0 -67 41q0 16 62 41q132 54 230 170t133 258q2 16 11 47 q8 20 45 20t37 -28q0 -7 -7 -35q-69 -273 -288 -432h1554q39 0 39 -41z" />
+<glyph unicode="&#x2967;" d="M1931 872q0 -41 -39 -41h-1554q219 -159 288 -432q7 -28 7 -35q0 -28 -37 -28t-45 20q-4 16 -11 47q-35 142 -133 258t-230 170q-62 25 -62 41q0 41 67 41h1710q39 0 39 -41zM1931 292q0 -16 -62 -41q-132 -54 -230 -170t-133 -258q-2 -16 -11 -47q-8 -20 -45 -20t-37 28 q0 7 7 35q69 273 288 432h-1554q-39 0 -39 41t39 41h1710q67 0 67 -41z" />
+<glyph unicode="&#x2968;" d="M1931 872q0 -41 -67 -41h-1710q-39 0 -39 41t39 41h1554q-219 159 -288 432q-7 28 -7 35q0 28 37 28t45 -20q4 -16 11 -47q35 -142 133 -258t230 -170q62 -25 62 -41zM1931 292q0 -41 -39 -41h-1710q-67 0 -67 41q0 16 62 41q132 54 230 170t133 258q2 16 11 47 q8 20 45 20t37 -28q0 -7 -7 -35q-69 -273 -288 -432h1554q39 0 39 -41z" />
+<glyph unicode="&#x2969;" d="M1931 872q0 -16 -62 -41q-132 -54 -230 -170t-133 -258q-2 -16 -11 -47q-8 -20 -45 -20t-37 28q0 7 7 35q69 273 288 432h-1554q-39 0 -39 41t39 41h1710q67 0 67 -41zM1931 292q0 -41 -39 -41h-1554q219 -159 288 -432q7 -28 7 -35q0 -28 -37 -28t-45 20q-4 16 -11 47 q-35 142 -133 258t-230 170q-62 25 -62 41q0 41 67 41h1710q39 0 39 -41z" />
+<glyph unicode="&#x296a;" d="M1931 872q0 -41 -39 -41h-1710q-67 0 -67 41q0 16 62 41q132 54 230 170t133 258q2 16 11 47q8 20 45 20t37 -28q0 -7 -7 -35q-69 -273 -288 -432h1554q39 0 39 -41zM1931 292q0 -41 -39 -41h-1738q-39 0 -39 41t39 41h1738q39 0 39 -41z" />
+<glyph unicode="&#x296b;" d="M1931 872q0 -41 -39 -41h-1738q-39 0 -39 41t39 41h1738q39 0 39 -41zM1931 292q0 -41 -39 -41h-1554q219 -159 288 -432q7 -28 7 -35q0 -28 -37 -28t-45 20q-4 16 -11 47q-35 142 -133 258t-230 170q-62 25 -62 41q0 41 67 41h1710q39 0 39 -41z" />
+<glyph unicode="&#x296c;" d="M1931 872q0 -41 -67 -41h-1710q-39 0 -39 41t39 41h1554q-219 159 -288 432q-7 28 -7 35q0 28 37 28t45 -20q4 -16 11 -47q35 -142 133 -258t230 -170q62 -25 62 -41zM1931 292q0 -41 -39 -41h-1738q-39 0 -39 41t39 41h1738q39 0 39 -41z" />
+<glyph unicode="&#x296d;" d="M1931 872q0 -41 -39 -41h-1738q-39 0 -39 41t39 41h1738q39 0 39 -41zM1931 292q0 -16 -62 -41q-132 -54 -230 -170t-133 -258q-2 -16 -11 -47q-8 -20 -45 -20t-37 28q0 7 7 35q69 273 288 432h-1554q-39 0 -39 41t39 41h1710q67 0 67 -41z" />
+<glyph unicode="&#x296e;" horiz-adv-x="1622" d="M1559 192q28 0 28 -37t-20 -45q-16 -4 -47 -11q-142 -35 -258 -133t-170 -230q-25 -62 -41 -62q-41 0 -41 67v1710q0 39 41 39t41 -39v-1554q159 219 432 288q28 7 35 7zM612 -287q0 -39 -41 -39t-41 39v1554q-163 -224 -432 -288q-30 -7 -35 -7q-28 0 -28 50 q0 25 18 30.5t49 12.5q145 37 258 133t170 230q7 19 16 40.5t25 21.5q41 0 41 -67v-1710z" />
+<glyph unicode="&#x296f;" horiz-adv-x="1622" d="M1567 1054q20 -8 20 -45t-28 -37q-7 0 -35 7q-273 69 -432 288v-1554q0 -39 -41 -39t-41 39v1710q0 67 41 67q16 0 41 -62q54 -132 170 -230t258 -133q16 -2 47 -11zM612 -259q0 -67 -41 -67q-16 0 -25 21.5t-16 40.5q-57 134 -170 230t-258 133q-28 3 -64 25q-3 6 -3 18 q0 50 28 50q5 0 35 -7q269 -64 432 -288v1554q0 39 41 39t41 -39v-1710z" />
+<glyph unicode="&#x2970;" d="M1792 582q0 -122 -147 -189q-114 -51 -251 -51h-1239q-39 0 -39 41t39 41h1239q97 0 191 33q125 45 125 125t-125 125q-94 33 -191 33h-1239q-39 0 -39 41t39 41h1239q137 0 251 -51q147 -67 147 -189z" />
+<glyph unicode="&#x2971;" d="M1906 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-1554q-39 0 -39 41t39 41h1554q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163 q105 -217 317 -310zM1015 1102q0 -41 -37 -41h-724q-39 0 -39 41t39 41h724q37 0 37 -41zM1015 842q0 -41 -37 -41h-724q-39 0 -39 41t39 41h724q37 0 37 -41z" />
+<glyph unicode="&#x2972;" d="M1906 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-1554q-39 0 -39 41t39 41h1554q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163 q105 -217 317 -310zM1018 1057q0 -101 -59.5 -179t-153.5 -78t-217.5 102t-196.5 102q-123 0 -157 -153q-11 -51 -30 -51q-28 0 -28 56q0 110 55 186t153 76t221.5 -102t195.5 -102q53 0 97 35t55 86l8 49q9 34 26 34q31 0 31 -61z" />
+<glyph unicode="&#x2973;" d="M1931 582q0 -41 -39 -41h-1554q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h1554 q39 0 39 -41zM1873 303q0 -101 -59.5 -179t-153.5 -78t-217.5 102t-196.5 102q-123 0 -157 -153q-11 -51 -30 -51q-28 0 -28 56q0 110 55 186t153 76t221.5 -102t195.5 -102q53 0 97 35t55 86l8 49q9 34 26 34q31 0 31 -61z" />
+<glyph unicode="&#x2974;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-1554q-39 0 -39 41t39 41h1554q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5 t230.5 -170.5q16 -5 46 -18q16 -9 16 -23zM1015 303q0 -101 -59.5 -179t-153.5 -78t-217.5 102t-196.5 102q-123 0 -157 -153q-11 -51 -30 -51q-28 0 -28 56q0 110 55 186t153 76t221.5 -102t195.5 -102q53 0 97 35t55 86l8 49q9 34 26 34q31 0 31 -61z" />
+<glyph unicode="&#x2975;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-1554q-39 0 -39 41t39 41h1554q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5 t230.5 -170.5q16 -5 46 -18q16 -9 16 -23zM1015 303q0 -101 -59.5 -179t-153.5 -78t-217.5 102t-196.5 102q-123 0 -157 -153q-11 -51 -30 -51q-28 0 -28 56q0 110 55 186t153 76t221.5 -102t195.5 -102q53 0 97 35t55 86l8 49q9 34 26 34q31 0 31 -61zM1015 -37 q0 -101 -59.5 -179t-153.5 -78t-217.5 102t-196.5 102q-123 0 -157 -153q-11 -51 -30 -51q-28 0 -28 56q0 110 55 186t153 76t221.5 -102t195.5 -102q53 0 97 35t55 86l8 49q9 34 26 34q31 0 31 -61z" />
+<glyph unicode="&#x2976;" horiz-adv-x="1591" d="M1421 349q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1421 0q0 -41 -37 -41h-1035q126 -107 178 -251q3 -8 3 -15q0 -39 -42 -39q-24 0 -34 22l-27 62q-76 149 -230 236 q-27 15 -27 26t27 26q155 88 230 237q8 20 25 59q12 26 36 26q42 0 42 -39q0 -7 -3 -15q-52 -146 -179 -253h1036q37 0 37 -41z" />
+<glyph unicode="&#x2977;" d="M2030 31q0 -41 -41 -41q-8 0 -14 3l-1160 548h-477q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35 q-59 -266 -288 -432h477l1160 548q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1001 -473h697q39 0 39 -41t-39 -41h-697l1001 -473q24 -11 24 -37z" />
+<glyph unicode="&#x2978;" horiz-adv-x="1591" d="M1421 900q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 0q0 -11 -27 -26q-154 -87 -230 -236l-25 -58q-12 -26 -36 -26q-42 0 -42 39q0 7 3 15q52 144 178 251 h-1035q-37 0 -37 41t37 41h1036q-127 107 -179 253q-3 8 -3 15q0 39 42 39q24 0 34 -23l27 -62q75 -149 230 -237q27 -15 27 -26z" />
+<glyph unicode="&#x2979;" horiz-adv-x="1591" d="M1421 459q0 -41 -39 -41h-590q-254 0 -438 145.5t-184 386.5t184 386.5t438 145.5h590q39 0 39 -41t-39 -41h-584q-223 0 -384.5 -120.5t-161.5 -329.5t161.5 -329.5t384.5 -120.5h584q39 0 39 -41zM1421 0q0 -11 -27 -26q-154 -87 -230 -236l-25 -58q-12 -26 -36 -26 q-42 0 -42 39q0 7 3 15q52 144 178 251h-1035q-37 0 -37 41t37 41h1036q-127 107 -179 253q-3 8 -3 15q0 39 42 39q24 0 34 -23l27 -62q75 -149 230 -237q27 -15 27 -26z" />
+<glyph unicode="&#x297a;" d="M2041 41q0 -41 -39 -41h-480q-237 0 -420 155t-200 386h-564q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35 q-59 -266 -288 -432h564q17 231 200 386t420 155h480q39 0 39 -41t-39 -41h-474q-205 0 -366 -130.5t-178 -328.5h908q39 0 39 -41t-39 -41h-908q17 -198 178 -328.5t366 -130.5h474q39 0 39 -41z" />
+<glyph unicode="&#x297b;" horiz-adv-x="1591" d="M1421 950q0 -241 -184 -386.5t-438 -145.5h-590q-39 0 -39 41t39 41h584q223 0 384.5 120.5t161.5 329.5t-161.5 329.5t-384.5 120.5h-584q-39 0 -39 41t39 41h590q254 0 438 -145.5t184 -386.5zM1421 0q0 -41 -37 -41h-1035q126 -107 178 -251q3 -8 3 -15q0 -39 -42 -39 q-24 0 -34 22l-27 62q-76 149 -230 236q-27 15 -27 26t27 26q155 88 230 237q8 20 25 59q12 26 36 26q42 0 42 -39q0 -7 -3 -15q-52 -146 -179 -253h1036q37 0 37 -41z" />
+<glyph unicode="&#x297c;" horiz-adv-x="1386" d="M552 1158l-89 10q-142 0 -204 -65.5t-62 -207.5q0 -166 122 -228q87 -44 271 -44h642q39 0 39 -41t-39 -41h-642q-184 0 -271 -44q-122 -62 -122 -228q0 -142 62 -207.5t204 -65.5l89 10q41 0 41 -44q0 -48 -130 -48q-348 0 -348 355q0 240 188 313q-188 73 -188 313 q0 355 348 355q130 0 130 -48q0 -44 -41 -44z" />
+<glyph unicode="&#x297d;" horiz-adv-x="1386" d="M923 1168l-89 -10q-41 0 -41 44q0 48 130 48q348 0 348 -355q0 -240 -188 -313q188 -73 188 -313q0 -355 -348 -355q-130 0 -130 48q0 44 41 44l89 -10q142 0 204 65.5t62 207.5q0 166 -122 228q-87 44 -271 44h-642q-39 0 -39 41t39 41h642q184 0 271 44q122 62 122 228 q0 142 -62 207.5t-204 65.5z" />
+<glyph unicode="&#x297e;" horiz-adv-x="1406" d="M117 1158l10 -89q0 -41 -44 -41q-48 0 -48 130q0 348 355 348q240 0 313 -188q73 188 313 188q355 0 355 -348q0 -130 -48 -130q-44 0 -44 41l10 89q0 142 -65.5 204t-207.5 62q-166 0 -228 -122q-44 -87 -44 -271v-642q0 -39 -41 -39t-41 39v642q0 184 -44 271 q-62 122 -228 122q-142 0 -207.5 -62t-65.5 -204z" />
+<glyph unicode="&#x297f;" horiz-adv-x="1406" d="M1289 6l-10 89q0 41 44 41q48 0 48 -130q0 -348 -355 -348q-240 0 -313 188q-73 -188 -313 -188q-355 0 -355 348q0 130 48 130q44 0 44 -41l-10 -89q0 -142 65.5 -204t207.5 -62q166 0 228 122q44 87 44 271v642q0 39 41 39t41 -39v-642q0 -184 44 -271 q62 -122 228 -122q142 0 207.5 62t65.5 204z" />
+<glyph unicode="&#x2980;" horiz-adv-x="1422" d="M1150 -405q0 -37 -41 -37t-41 37v1974q0 37 41 37t41 -37v-1974zM752 -405q0 -37 -41 -37t-41 37v1974q0 37 41 37t41 -37v-1974zM354 -405q0 -37 -41 -37t-41 37v1974q0 37 41 37t41 -37v-1974z" />
+<glyph unicode="&#x2981;" horiz-adv-x="946" d="M906 582q0 -180 -126.5 -306.5t-306.5 -126.5t-306.5 126.5t-126.5 306.5t126.5 306.5t306.5 126.5t306.5 -126.5t126.5 -306.5z" />
+<glyph unicode="&#x2982;" horiz-adv-x="711" d="M542 743q0 -77 -55.5 -131.5t-131.5 -54.5t-131 55t-55 131t55 131t131 55t131.5 -54.5t55.5 -131.5zM542 104q0 -77 -55.5 -131.5t-131.5 -54.5t-131 55t-55 131t55 131t131 55t131.5 -54.5t55.5 -131.5zM460 743q0 42 -31 73t-73.5 31t-73.5 -31t-31 -73t31 -73 t73.5 -31t73.5 31t31 73zM460 104q0 42 -31 73t-73.5 31t-73.5 -31t-31 -73t31 -73t73.5 -31t73.5 31t31 73z" />
+<glyph unicode="&#x2983;" horiz-adv-x="983" d="M809.5 -305q17.5 -3 17.5 -24t-41 -21q-391 0 -391 342v313q0 226 -262 254q-33 4 -33 23t33 23q262 28 262 254v313q0 342 391 342q41 0 41 -21t-17.5 -24t-44.5 -6v-1762q27 -3 44.5 -6zM477 1132v-277q0 -112 -41.5 -177.5t-145.5 -95.5q104 -30 145.5 -95.5 t41.5 -177.5v-277q0 -260 206 -318v1736q-206 -58 -206 -318z" />
+<glyph unicode="&#x2984;" horiz-adv-x="983" d="M883 582q0 -19 -33 -23q-262 -28 -262 -254v-313q0 -342 -391 -342q-41 0 -41 21t17.5 24t44.5 6v1762q-27 3 -44.5 6t-17.5 24t41 21q391 0 391 -342v-313q0 -226 262 -254q33 -4 33 -23zM506 855v277q0 260 -206 318v-1736q206 58 206 318v277q0 112 41.5 177.5 t145.5 95.5q-104 30 -145.5 95.5t-41.5 177.5z" />
+<glyph unicode="&#x2985;" horiz-adv-x="875" d="M721 -275q46 -36 46 -55.5t-17 -19.5q-77 0 -228 118q-431 337 -431 814t431 814q151 118 228 118q17 0 17 -19.5t-46 -55.5q-163 -127 -246.5 -372t-83.5 -485t83.5 -485t246.5 -372zM460 -74q-151 290 -151 651t142 648q-278 -277 -278 -648t287 -651z" />
+<glyph unicode="&#x2986;" horiz-adv-x="875" d="M784 582q0 -477 -431 -814q-151 -118 -228 -118q-17 0 -17 19.5t46 55.5q163 127 246.5 372t83.5 485t-83.5 485t-246.5 372q-46 36 -46 55.5t17 19.5q77 0 228 -118q431 -337 431 -814zM415 -74q287 280 287 651t-278 648q142 -287 142 -648t-151 -651z" />
+<glyph unicode="&#x2987;" horiz-adv-x="682" d="M574 -332q0 -18 -19 -18q-11 0 -46 29q-226 186 -322 396t-96 507t96 507t322 396q35 29 46 29q19 0 19 -18v-1828zM173 582q0 -506 319 -786v1565q-172 -159 -245.5 -341.5t-73.5 -437.5z" />
+<glyph unicode="&#x2988;" horiz-adv-x="682" d="M574 582q0 -297 -96 -507t-322 -396q-35 -29 -46 -29q-19 0 -19 18v1828q0 18 19 18q11 0 46 -29q226 -186 322 -396t96 -507zM492 582q0 255 -73.5 437.5t-245.5 341.5v-1565q319 280 319 786z" />
+<glyph unicode="&#x2989;" horiz-adv-x="666" d="M558 -312q0 -38 -42 -38q-23 0 -43 47l-382 885l382 885q20 47 43 47q42 0 42 -38v-1788zM476 -105v1374l-297 -687z" />
+<glyph unicode="&#x298a;" horiz-adv-x="666" d="M150 -350q-42 0 -42 38v1788q0 38 42 38q23 0 43 -47l382 -885l-382 -885q-20 -47 -43 -47zM487 582l-297 687v-1374z" />
+<glyph unicode="&#x298b;" horiz-adv-x="682" d="M571 -201q0 -41 -68 -41h-391v1848h391q68 0 68 -40.5t-68 -40.5h-309v-1685h309q68 0 68 -41zM571 -401q0 -41 -37 -41h-383q-39 0 -39 41t39 41h383q37 0 37 -41z" />
+<glyph unicode="&#x298c;" horiz-adv-x="682" d="M570 -242h-391q-68 0 -68 41t68 41h309v1685h-309q-68 0 -68 40.5t68 40.5h391v-1848zM570 -401q0 -41 -37 -41h-383q-39 0 -39 41t39 41h383q37 0 37 -41z" />
+<glyph unicode="&#x298d;" horiz-adv-x="682" d="M571 -309q0 -41 -68 -41h-391v1864h391q68 0 68 -40.5t-68 -40.5h-252l228 -228q13 -13 13 -27t-15 -29t-29 -15t-27 13l-227 227v-1642h309q68 0 68 -41z" />
+<glyph unicode="&#x298e;" horiz-adv-x="682" d="M570 -350h-391q-68 0 -68 41t68 41h251l-227 227q-13 13 -13 27t15 29t29 15t27 -13l227 -227v1643h-309q-68 0 -68 40.5t68 40.5h391v-1864z" />
+<glyph unicode="&#x298f;" horiz-adv-x="682" d="M571 -309q0 -41 -68 -41h-391v1864h391q68 0 68 -40.5t-68 -40.5h-309v-1643l227 227q13 13 27 13t29 -15t15 -29t-13 -27l-227 -227h251q68 0 68 -41z" />
+<glyph unicode="&#x2990;" horiz-adv-x="682" d="M570 -350h-391q-68 0 -68 41t68 41h309v1642l-227 -227q-13 -13 -27 -13t-29 15t-15 29t13 27l228 228h-252q-68 0 -68 40.5t68 40.5h391v-1864z" />
+<glyph unicode="&#x2991;" horiz-adv-x="666" d="M558 -312q0 -38 -42 -38q-23 0 -43 47l-382 885l382 885q20 47 43 47q42 0 42 -38q0 -17 -8 -36l-371 -858l371 -858q8 -19 8 -36zM531.5 661.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x2992;" horiz-adv-x="666" d="M150 -350q-42 0 -42 38q0 17 8 36l371 858l-371 858q-8 19 -8 36q0 38 42 38q23 0 43 -47l382 -885l-382 -885q-20 -47 -43 -47zM327 582q0 -47 -33 -80t-80 -33t-80 33t-33 79.5t33.5 80t80 33.5t79.5 -33t33 -80z" />
+<glyph unicode="&#x2993;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-531 251q70 -209 222 -391l136 -138q14 -15 14 -30q0 -43 -41 -43q-15 0 -28 11q-297 243 -402 637l-539 255q-27 13 -27 37t27 37l539 255q105 394 402 637q13 11 28 11q41 0 41 -43q0 -15 -14 -30q-47 -44 -136 -138 q-152 -182 -222 -391l531 251q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-591 -279q-27 -116 -27 -235t27 -235l591 -279q24 -11 24 -37zM697 582q0 95 17 192l-407 -192l407 -192q-17 97 -17 192z" />
+<glyph unicode="&#x2994;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-539 -255q-105 -394 -402 -637q-13 -11 -28 -11q-41 0 -41 43q0 15 14 30q47 44 136 138q152 182 222 391l-531 -251q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l591 279q27 116 27 235t-27 235l-591 279q-24 11 -24 37q0 41 41 41q8 0 14 -3 l531 -251q-70 209 -222 391l-136 138q-14 15 -14 30q0 43 41 43q15 0 28 -11q297 -243 402 -637l539 -255q27 -13 27 -37zM894 582q0 -95 -17 -192l407 192l-407 192q17 -97 17 -192z" />
+<glyph unicode="&#x2995;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-570 -269q69 -227 233 -423l136 -138q14 -15 14 -30q0 -43 -41 -43q-15 0 -28 11q-275 225 -387 588l-265 -125q67 -138 171 -263l136 -138q14 -15 14 -30q0 -43 -41 -43q-15 0 -28 11q-205 168 -326 428l-187 -88q-6 -3 -14 -3q-41 0 -41 41 q0 26 24 37l186 88q-83 214 -83 426t83 426l-186 88q-24 11 -24 37q0 41 41 41q8 0 14 -3l187 -88q121 260 326 428q13 11 28 11q41 0 41 -43q0 -15 -14 -30q-47 -44 -136 -138q-104 -125 -171 -263l265 -125q112 363 387 588q13 11 28 11q41 0 41 -43q0 -15 -14 -30 q-47 -44 -136 -138q-164 -196 -233 -423l570 -269q27 -13 27 -37zM779 582q0 -114 25 -226l480 226l-480 226q-25 -112 -25 -226zM379 582q0 -201 75 -391l275 129q-32 133 -32 262t32 262l-275 129q-75 -190 -75 -391z" />
+<glyph unicode="&#x2996;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-187 88q-121 -260 -326 -428q-13 -11 -28 -11q-41 0 -41 43q0 15 14 30q47 44 136 138q104 125 171 263l-265 125q-112 -363 -387 -588q-13 -11 -28 -11q-41 0 -41 43q0 15 14 30q47 44 136 138q164 196 233 423l-570 269 q-27 13 -27 37t27 37l570 269q-69 227 -233 423l-136 138q-14 15 -14 30q0 43 41 43q15 0 28 -11q275 -225 387 -588l265 125q-67 138 -171 263l-136 138q-14 15 -14 30q0 43 41 43q15 0 28 -11q205 -168 326 -428l187 88q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-186 -88 q83 -214 83 -426t-83 -426l186 -88q24 -11 24 -37zM1212 582q0 201 -75 391l-275 -129q32 -133 32 -262t-32 -262l275 -129q75 190 75 391zM812 582q0 114 -25 226l-480 -226l480 -226q25 112 25 226z" />
+<glyph unicode="&#x2997;" horiz-adv-x="873" d="M663 -275q46 -35 46 -55t-17 -20q-77 0 -228 118q-193 150 -300 331v966q107 181 300 331q151 118 228 118q17 0 17 -20t-46 -55q-142 -109 -231 -332v-1050q89 -223 231 -332z" />
+<glyph unicode="&#x2998;" horiz-adv-x="873" d="M181 -350q-17 0 -17 20t46 55q142 109 231 332v1050q-89 223 -231 332q-46 35 -46 55t17 20q77 0 228 -118q193 -150 300 -331v-966q-107 -181 -300 -331q-151 -118 -228 -118z" />
+<glyph unicode="&#x2999;" horiz-adv-x="410" d="M268 1452q0 -63 -63 -63t-63 63t63 63q25 0 44 -19t19 -44zM268 1162q0 -63 -63 -63t-63 63t63 63q25 0 44 -19t19 -44zM268 872q0 -63 -63 -63t-63 63t63 63q25 0 44 -19t19 -44zM268 582q0 -63 -63 -63t-63 63t63 63q25 0 44 -19t19 -44zM268 292q0 -63 -63 -63t-63 63 t63 63q25 0 44 -19t19 -44zM268 2q0 -63 -63 -63t-63 63t63 63q25 0 44 -19t19 -44zM268 -288q0 -63 -63 -63t-63 63t63 63q25 0 44 -19t19 -44z" />
+<glyph unicode="&#x299a;" horiz-adv-x="706" d="M564 203q0 -18 -12 -31l-314 -348l142 -160q14 -16 14 -30q0 -41 -41 -41q-20 0 -29 10l-170 190q-12 13 -12 31t12 31l314 348l-314 348q-12 13 -12 31t12 31l314 348l-314 348q-12 13 -12 31t12 31l170 190q9 10 29 10q41 0 41 -41q0 -14 -14 -30l-142 -160l314 -348 q12 -13 12 -31t-12 -31l-314 -348l314 -348q12 -13 12 -31z" />
+<glyph unicode="&#x299b;" horiz-adv-x="1479" d="M1362 41q0 -41 -39 -41h-939q21 -69 43 -110t22 -49q0 -42 -42 -42q-20 0 -32 18q-48 76 -75 183h-148q-37 0 -37 41t37 41h132q-7 52 -7 101q0 189 90 351.5t243 262.5l-249 286q-10 12 -10 26q0 41 41 41q21 0 31 -12l260 -299q154 77 327 77q37 0 37 -40t-37 -40 q-143 0 -273 -59l615 -707q10 -11 10 -29zM357 183q0 -52 8 -101h866l-568 654q-141 -88 -223.5 -234.5t-82.5 -318.5z" />
+<glyph unicode="&#x299c;" horiz-adv-x="1573" d="M1434 41q0 -41 -68 -41h-1139q-61 0 -66 35q-2 11 -2 33v1269q0 68 41 68t41 -68v-571h645q37 0 37 -37v-647h443q68 0 68 -41zM841 82v602h-600v-602h600z" />
+<glyph unicode="&#x299d;" horiz-adv-x="1573" d="M621.5 462.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1434 41q0 -41 -68 -41h-1139q-61 0 -66 35q-2 11 -2 33v1269q0 68 41 68t41 -68v-473q25 2 51 2q304 0 518.5 -215t214.5 -518q0 -26 -2 -51h343q68 0 68 -41zM945 133 q0 270 -191.5 461.5t-461.5 191.5q-26 0 -51 -2v-702h702q2 25 2 51z" />
+<glyph unicode="&#x299e;" horiz-adv-x="1479" d="M1362 41q0 -41 -37 -41h-1171q-39 0 -39 41q0 18 10 29l929 1068q10 12 31 12q41 0 41 -41q0 -14 -10 -26l-870 -1001h1079q37 0 37 -41z" />
+<glyph unicode="&#x299f;" horiz-adv-x="1479" d="M1362 41q0 -41 -37 -41h-1171q-39 0 -39 41q0 28 24 44l1159 781q9 6 20 6q44 0 44 -42q0 -21 -18 -33l-1059 -715h1040q37 0 37 -41z" />
+<glyph unicode="&#x29a0;" horiz-adv-x="1479" d="M1342 617q20 -10 20 -34.5t-26 -37.5l-839 -415q25 -26 48.5 -45.5t121.5 -82.5q19 -12 19 -34q0 -41 -39 -41q-9 0 -17 4q-119 62 -208 162l-252 -125q-4 -2 -14 -2q-41 0 -41 41q0 24 25 36l231 114q-135 191 -135 425t134 424l-236 117q-19 9 -19 34q0 41 41 41 q10 0 14 -2l252 -125q89 100 208 162q8 4 17 4q39 0 39 -41q0 -22 -19 -34q-40 -24 -118 -79q-27 -23 -52 -49zM443 970q-127 -174 -127 -388.5t128 -388.5l785 389z" />
+<glyph unicode="&#x29a1;" horiz-adv-x="1480" d="M1395 574q0 -39 -41 -39q-22 0 -34 19q-24 40 -79 118q-38 44 -83 82l-383 -776q-10 -20 -34.5 -20t-37.5 26l-381 770q-45 -38 -72 -70t-90 -130q-12 -19 -34 -19q-41 0 -41 39q0 9 4 17q73 139 197 237l-160 323q-2 4 -2 14q0 41 41 41q24 0 36 -25l151 -307 q178 111 388 111t387 -110l154 312q9 19 34 19q41 0 41 -41q0 -10 -2 -14l-160 -323q124 -98 197 -237q4 -8 4 -17zM740 905q-190 0 -352 -103l352 -710l351 710q-161 103 -351 103z" />
+<glyph unicode="&#x29a2;" horiz-adv-x="1479" d="M1362 1109q0 -18 -10 -29l-929 -1068q-10 -12 -31 -12q-41 0 -41 41q0 14 10 26l870 1001h-1079q-37 0 -37 41t37 41h1171q39 0 39 -41z" />
+<glyph unicode="&#x29a3;" horiz-adv-x="1479" d="M1362 41q0 -41 -39 -41h-1171q-37 0 -37 41t37 41h1079l-870 1001q-10 12 -10 26q0 41 41 41q21 0 31 -12l929 -1068q10 -11 10 -29z" />
+<glyph unicode="&#x29a4;" horiz-adv-x="1479" d="M1362 41q0 -41 -37 -41h-1171q-39 0 -39 41q0 18 10 29l929 1068q10 12 31 12q41 0 41 -41q0 -14 -10 -26l-870 -1001h1079q37 0 37 -41zM1362 -223q0 -41 -37 -41h-1171q-39 0 -39 41t39 41h1171q37 0 37 -41z" />
+<glyph unicode="&#x29a5;" horiz-adv-x="1479" d="M1362 41q0 -41 -39 -41h-1171q-37 0 -37 41t37 41h1079l-870 1001q-10 12 -10 26q0 41 41 41q21 0 31 -12l929 -1068q10 -11 10 -29zM1362 -223q0 -41 -37 -41h-1171q-39 0 -39 41t39 41h1171q37 0 37 -41z" />
+<glyph unicode="&#x29a6;" horiz-adv-x="2016" d="M1899 41q0 -41 -37 -41h-1154q-24 0 -48 41l-560 971q-4 7 -4 17q0 42 44 42q21 0 31 -18l561 -971h1130q37 0 37 -41z" />
+<glyph unicode="&#x29a7;" horiz-adv-x="2016" d="M1899 1030q0 -41 -37 -41h-1130l-561 -971q-10 -18 -31 -18q-44 0 -44 42q0 10 4 17l560 971q24 41 48 41h1154q37 0 37 -41z" />
+<glyph unicode="&#x29a8;" horiz-adv-x="1479" d="M1362 41q0 -41 -37 -41h-148q-27 -107 -75 -183q-12 -18 -32 -18q-42 0 -42 42q0 8 22 49t43 110h-939q-39 0 -39 41q0 18 10 29l615 707q-130 59 -273 59q-37 0 -37 40t37 40q173 0 327 -77l250 287q-48 -7 -96 -7q-113 0 -212 39q-20 8 -25 28q-4 20 11 38q10 12 25 12 q6 0 14 -3q24 -8 78 -22.5t135 -14.5t181 35q17 6 27 6q7 0 10 -3q9 -7 -1 -54t-10 -129.5t41 -182.5l24 -50q15 -33 -1 -51q-16 -17 -31 -17q-13 0 -26 11q-5 4 -9 12q-73 131 -73 291v9l-239 -276q153 -100 243 -262.5t90 -351.5q0 -49 -7 -101h132q37 0 37 -41zM1120 183 q0 172 -82.5 318.5t-223.5 234.5l-568 -654h866q8 49 8 101z" />
+<glyph unicode="&#x29a9;" horiz-adv-x="1479" d="M1362 41q0 -41 -39 -41h-939q21 -69 43 -110t22 -49q0 -42 -42 -42q-20 0 -32 18q-48 76 -75 183h-148q-37 0 -37 41t37 41h132q-7 52 -7 101q0 189 90 351.5t243 262.5l-239 276v-9q0 -160 -73 -291q-4 -8 -9 -12q-13 -11 -26 -11q-16 0 -31 17q-16 18 -5 40.5t28 60.5 q41 100 41 182.5t-10 129.5t-2 54q4 3 11 3q10 0 27 -6q100 -35 181 -35t149 17q20 7 54 17q13 4 23 4q17 0 26 -10q15 -18 10.5 -38t-24.5 -28q-99 -39 -212 -39q-48 0 -96 7l250 -287q154 77 327 77q37 0 37 -40t-37 -40q-143 0 -273 -59l615 -707q10 -11 10 -29zM357 183 q0 -52 8 -101h866l-568 654q-141 -88 -223.5 -234.5t-82.5 -318.5z" />
+<glyph unicode="&#x29aa;" horiz-adv-x="1479" d="M1362 993q0 -41 -37 -41h-132q7 -52 7 -101q0 -190 -90 -352t-243 -262l239 -276v9q0 159 73 290q4 8 9 12q13 12 26 12q16 0 31 -18q16 -18 5 -40q-69 -138 -69 -265q0 -60 10 -107.5t1 -54.5q-3 -3 -9 -3q-10 0 -28 7q-100 35 -181 35t-149 -17q-20 -7 -54 -17.5t-49 7 t-11 37.5q5 20 25 28q99 39 212 39q48 0 96 -8l-250 287q-154 -76 -327 -76q-37 0 -37 40t37 40q143 0 273 59l-615 707q-10 11 -10 29q0 41 39 41h939q-21 68 -61 142q-4 8 -4 17q0 41 42 41q20 0 32 -18q48 -76 75 -182h148q37 0 37 -41zM1120 850q0 52 -8 102h-866 l568 -654q141 88 223.5 234.5t82.5 317.5z" />
+<glyph unicode="&#x29ab;" horiz-adv-x="1479" d="M1362 993q0 -18 -10 -29l-615 -707q130 -59 273 -59q37 0 37 -40t-37 -40q-173 0 -327 76l-250 -287q48 8 96 8q113 0 212 -39q20 -8 24.5 -28t-10.5 -38q-11 -12 -25 -12q-7 0 -14 2l-64 21q-68 17 -149 17t-181 -35q-18 -7 -28 -7q-6 0 -10 3q-8 7 2 54.5t10 129.5 t-41 182l-27 57q-12 26 4 44q15 18 31 18q13 0 26 -12q5 -4 9 -12q73 -131 73 -290v-9l239 276q-153 100 -243 262t-90 352q0 49 7 101h-132q-37 0 -37 41t37 41h148q27 106 75 182q12 18 32 18q42 0 42 -41q0 -9 -4 -17q-40 -74 -61 -142h939q39 0 39 -41zM357 850 q0 -171 82.5 -317.5t223.5 -234.5l568 654h-866q-8 -50 -8 -102z" />
+<glyph unicode="&#x29ac;" horiz-adv-x="1615" d="M1522 1040q-35 -100 -35 -181t17 -149q7 -20 17.5 -54t-8.5 -50q-15 -13 -29 -13q-15 0 -28 15q-3 4 -7 13q-39 100 -39 213q0 48 7 95l-287 -250q77 -154 77 -327q0 -37 -40 -37t-40 37q0 145 -59 273l-707 -615q-11 -10 -29 -10q-41 0 -41 39v939q-67 -20 -108.5 -42.5 t-50.5 -22.5q-42 0 -42 42q0 20 18 32q75 48 183 75v148q0 37 41 37t41 -37v-132q50 7 101 7q189 0 351.5 -90t262.5 -243l276 239h-12q-158 0 -288 73q-8 5 -12 9q-12 13 -12 26q0 16 18 31q18 16 40.5 5t60.5 -28q101 -41 183.5 -41t129.5 9.5t54 2.5q2 -3 2 -10 q0 -10 -6 -28zM474 1005q-52 0 -101 -8v-866l654 568q-88 140 -234.5 223t-318.5 83z" />
+<glyph unicode="&#x29ad;" horiz-adv-x="1615" d="M1525 955q0 -42 -42 -42q-9 0 -50.5 22.5t-108.5 42.5v-939q0 -39 -41 -39q-18 0 -29 10l-707 615q-59 -128 -59 -273q0 -37 -40 -37t-40 37q0 173 77 327l-287 250q7 -47 7 -95q0 -113 -39 -213q-4 -9 -7 -13q-13 -15 -28 -15q-14 0 -29 13q-14 11 -14 27q0 6 2 13 l21 64q17 68 17 149t-35 181q-6 18 -6 28q0 7 3 10q6 7 53 -2.5t129.5 -9.5t183.5 41l57 27q26 12 44 -4q18 -15 18 -31q0 -13 -12 -26q-4 -4 -12 -9q-130 -73 -288 -73h-12l276 -239q100 153 262.5 243t351.5 90q51 0 101 -7v132q0 37 41 37t41 -37v-148q108 -27 183 -75 q18 -12 18 -32zM1141 1005q-172 0 -318.5 -83t-234.5 -223l654 -568v866q-49 8 -101 8z" />
+<glyph unicode="&#x29ae;" horiz-adv-x="1615" d="M1522 207q6 -18 6 -28q0 -7 -2 -9q-7 -8 -54 1.5t-129.5 9.5t-183.5 -41l-57 -27q-26 -12 -44 4q-18 15 -18 31q0 13 12 26q4 4 12 9q130 73 288 73h12l-276 239q-100 -153 -262.5 -243t-351.5 -90q-51 0 -101 7v-132q0 -37 -41 -37t-41 37v148q-108 27 -183 75 q-18 12 -18 32q0 42 42 42q9 0 50.5 -22.5t108.5 -42.5v939q0 39 41 39q18 0 29 -10l707 -615q59 128 59 273q0 37 40 37t40 -37q0 -173 -77 -327l287 -250q-7 47 -7 95q0 113 39 213q4 9 7 13q13 15 28 15q14 0 29 -13q14 -11 14 -27q0 -6 -3 -12l-20 -65q-17 -68 -17 -149 t35 -181zM474 242q172 0 318.5 83t234.5 223l-654 568v-866q49 -8 101 -8z" />
+<glyph unicode="&#x29af;" horiz-adv-x="1615" d="M1525 292q0 -20 -18 -32q-75 -48 -183 -75v-148q0 -37 -41 -37t-41 37v132q-50 -7 -101 -7q-189 0 -351.5 90t-262.5 243l-276 -239h12q158 0 288 -73q8 -5 12 -9q12 -13 12 -26q0 -16 -18 -31q-18 -16 -40.5 -5t-60.5 28q-101 41 -183.5 41t-129.5 -9.5t-53 -1.5 q-3 2 -3 9q0 10 6 28q35 100 35 181t-17 149q-7 20 -17.5 54t8.5 50q15 13 29 13q15 0 28 -15q3 -4 7 -13q39 -100 39 -213q0 -48 -7 -95l287 250q-77 154 -77 327q0 37 40 37t40 -37q0 -145 59 -273l707 615q11 10 29 10q41 0 41 -39v-939q67 20 108.5 42.5t50.5 22.5 q42 0 42 -42zM1141 242q52 0 101 8v866l-654 -568q88 -140 234.5 -223t318.5 -83z" />
+<glyph unicode="&#x29b0;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -498.5t-184 -493.5l107 -106q27 -27 27 -46q0 -39 -39 -39q-19 0 -46 27l-106 106q-206 -184 -492 -184t-498.5 212.5t-212.5 499.5t183 492l-106 106q-27 27 -27 46q0 39 39 39q19 0 46 -27l106 -106q206 184 493.5 184t498.5 -212zM1276 160 q160 182 160 434.5t-187.5 440.5t-441 188t-434.5 -160zM315 1005q-159 -181 -159 -434t188.5 -441.5t440.5 -188.5t434 160z" />
+<glyph unicode="&#x29b1;" horiz-adv-x="1592" d="M1422 1565q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1335 1063q183 -205 183 -492t-212.5 -499.5t-498.5 -212.5t-492 184l-106 -106q-27 -27 -46 -27q-39 0 -39 39q0 19 27 46l107 106q-184 207 -184 493.5t211 498.5t498.5 212t493.5 -184l106 106 q27 27 46 27q39 0 39 -39q0 -19 -27 -46zM1219 1063q-181 160 -435 160t-441 -188t-187 -440.5t160 -434.5zM1247.5 129.5q188.5 188.5 188.5 441.5t-159 434l-904 -904q182 -160 434 -160t440.5 188.5z" />
+<glyph unicode="&#x29b2;" horiz-adv-x="1592" d="M953 1536q66 -67 66 -158t-67 -157t-157.5 -66t-157 65.5t-66.5 156.5t66.5 158.5t158 67.5t157.5 -67zM1335 803q183 -205 183 -492t-212.5 -499.5t-498.5 -212.5t-492 184l-106 -106q-27 -27 -46 -27q-39 0 -39 39q0 19 27 46l107 106q-184 207 -184 493.5t211 498.5 t498.5 212t493.5 -184l106 106q27 27 46 27q39 0 39 -39q0 -19 -27 -46zM898 1275.5q44 43.5 44 102.5t-44 103.5t-103 44.5t-103 -44.5t-44 -103.5t44 -102.5t103 -43.5t103 43.5zM1219 803q-181 160 -435 160t-441 -188t-187 -440.5t160 -434.5zM1247.5 -130.5 q188.5 188.5 188.5 441.5t-159 434l-904 -904q182 -160 434 -160t440.5 188.5z" />
+<glyph unicode="&#x29b3;" horiz-adv-x="1592" d="M1276 1396q0 -18 -43 -41q-117 -62 -179 -127q-32 -33 -48 -33q-31 0 -31 32.5t128 129.5h-741q-45 0 -45 39t45 39h741q-128 97 -128 129.5t31 32.5q16 0 48 -33q62 -65 179 -127q43 -23 43 -41zM1335 853q183 -205 183 -492t-212.5 -499.5t-498.5 -212.5t-492 184 l-106 -106q-27 -27 -46 -27q-39 0 -39 39q0 19 27 46l107 106q-184 207 -184 493.5t211 498.5t498.5 212t493.5 -184l106 106q27 27 46 27q39 0 39 -39q0 -19 -27 -46zM1219 853q-181 160 -435 160t-441 -188t-187 -440.5t160 -434.5zM1247.5 -80.5q188.5 188.5 188.5 441.5 t-159 434l-904 -904q182 -160 434 -160t440.5 188.5z" />
+<glyph unicode="&#x29b4;" horiz-adv-x="1592" d="M1276 1396q0 -39 -45 -39h-741q128 -97 128 -129.5t-31 -32.5q-17 0 -48 33q-63 65 -179 127q-43 23 -43 41t43 41q116 62 179 127q31 33 48 33q31 0 31 -32.5t-128 -129.5h741q45 0 45 -39zM1335 853q183 -205 183 -492t-212.5 -499.5t-498.5 -212.5t-492 184l-106 -106 q-27 -27 -46 -27q-39 0 -39 39q0 19 27 46l107 106q-184 207 -184 493.5t211 498.5t498.5 212t493.5 -184l106 106q27 27 46 27q39 0 39 -39q0 -19 -27 -46zM1219 853q-181 160 -435 160t-441 -188t-187 -440.5t160 -434.5zM1247.5 -80.5q188.5 188.5 188.5 441.5t-159 434 l-904 -904q182 -160 434 -160t440.5 188.5z" />
+<glyph unicode="&#x29b5;" horiz-adv-x="2205" d="M2035 582q0 -41 -61 -41h-150q-16 -284 -224.5 -483t-495.5 -199t-496.5 198.5t-225.5 483.5h-151q-61 0 -61 41t61 41h151q16 286 224.5 484t497 198t496.5 -198.5t224 -483.5h150q61 0 61 -41zM1541.5 1048.5q-184.5 174.5 -438.5 174.5t-438.5 -174t-200.5 -426h1278 q-16 251 -200.5 425.5zM1104 -59q253 0 437.5 174.5t200.5 425.5h-1278q16 -251 201.5 -425.5t438.5 -174.5z" />
+<glyph unicode="&#x29b6;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1262 143.5q174 185.5 174 439t-174 438.5t-425 201v-1280q251 16 425 201.5zM329.5 1020.5q-173.5 -184.5 -173.5 -438t174 -438.5t425 -202 v1280q-252 -17 -425.5 -201.5z" />
+<glyph unicode="&#x29b7;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM989 96 q0 -39 -41 -39t-41 39v975q0 37 41 37t41 -37v-975zM685 96q0 -39 -41 -39t-41 39v975q0 37 41 37t41 -37v-975z" />
+<glyph unicode="&#x29b8;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1436 582q0 265 -187.5 453t-440 188t-433.5 -158l903 -903q158 181 158 420zM317 1007q-161 -181 -161 -435t188.5 -442.5t441.5 -188.5 t435 163z" />
+<glyph unicode="&#x29b9;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1321 282 q0 -41 -37 -41h-974q-39 0 -39 41t39 41h445v847q0 37 41 37t41 -37v-847h447q37 0 37 -41z" />
+<glyph unicode="&#x29ba;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM837 623h598q-16 241 -187 412.5t-411 186.5v-599zM755 623v599q-241 -16 -412 -187t-186 -412h598zM797 -59q253 0 437.5 174.5t200.5 425.5 h-1278q16 -251 201.5 -425.5t438.5 -174.5z" />
+<glyph unicode="&#x29bb;" horiz-adv-x="1592" d="M1335 1063q183 -206 183 -480.5t-184 -481.5l107 -106q27 -27 27 -46q0 -39 -39 -39q-19 0 -46 27l-106 106q-206 -184 -480.5 -184t-480.5 185l-107 -107q-27 -27 -46 -27q-39 0 -39 39q0 19 27 46l107 107q-184 206 -184 481t183 480l-106 106q-27 27 -27 46 q0 39 39 39q19 0 46 -27l106 -106q206 184 481.5 184t480.5 -184l106 106q27 27 46 27q39 0 39 -39q0 -19 -27 -46zM1219 1063q-181 160 -423 160t-423 -160l423 -423zM1276 160q160 182 160 422.5t-159 422.5l-423 -423zM315 1005q-159 -181 -159 -422t160 -423l422 422z M374 102q182 -161 422.5 -161t422.5 160l-423 423z" />
+<glyph unicode="&#x29bc;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1241 969 l-831 -831q-14 -14 -28 -14t-29 15t-15 29t14 28l831 831q12 12 25 12q15 0 30 -15t15 -30q0 -13 -12 -25zM664 829q0 -47 -34 -81t-81 -34t-79.5 32.5t-32.5 80.5t33 81t81 33t80.5 -32.5t32.5 -79.5zM1155 337q0 -48 -33 -81t-81 -33t-80.5 32.5t-32.5 79.5t34 81t81 34 t79.5 -32.5t32.5 -80.5z" />
+<glyph unicode="&#x29bd;" horiz-adv-x="1592" d="M1320 987.5q198 -209.5 198 -497t-198.5 -497.5t-483.5 -225v-149q0 -61 -41 -61t-41 61v149q-284 17 -482 226t-198 496.5t197.5 496t482.5 225.5v215q-107 -126 -251 -178q-8 -3 -15 -3q-39 0 -39 42q0 24 23 34l61 27q149 76 236 230q15 27 26 27t26 -27 q88 -155 237 -230q20 -8 59 -25q26 -12 26 -36q0 -42 -39 -42q-7 0 -15 3q-146 52 -253 179v-216q286 -15 484 -224.5zM1261.5 51.5q174.5 185.5 174.5 439t-174 439t-426 200.5v-1280q251 16 425.5 201.5zM329.5 928.5q-173.5 -184.5 -173.5 -438t174 -438.5t424 -202v1280 q-251 -17 -424.5 -201.5z" />
+<glyph unicode="&#x29be;" horiz-adv-x="1578" d="M1118 582q0 -137 -96 -233t-233 -96t-233 96t-96 233t96 233t233 96t233 -96t96 -233zM1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582q0 270 -189.5 459.5t-459.5 189.5 t-459.5 -189.5t-189.5 -459.5t189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5zM1018 582q0 96 -66.5 162.5t-162.5 66.5t-162.5 -66.5t-66.5 -162.5t66.5 -162.5t162.5 -66.5t162.5 66.5t66.5 162.5z" />
+<glyph unicode="&#x29bf;" horiz-adv-x="1578" d="M1538 582q0 -312 -218.5 -530.5t-530.5 -218.5t-530.5 218.5t-218.5 530.5t218.5 530.5t530.5 218.5t530.5 -218.5t218.5 -530.5zM1438 582q0 270 -189.5 459.5t-459.5 189.5t-459.5 -189.5t-189.5 -459.5t189.5 -459.5t459.5 -189.5t459.5 189.5t189.5 459.5zM1118 582 q0 -137 -96 -233t-233 -96t-233 96t-96 233t96 233t233 96t233 -96t96 -233z" />
+<glyph unicode="&#x29c0;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1233 207 q0 -41 -41 -41q-9 0 -14 2l-926 377q-26 11 -26 37.5t20 34.5l932 379q5 2 14 2q41 0 41 -41q0 -26 -19 -34l-839 -341l833 -339q25 -10 25 -36z" />
+<glyph unicode="&#x29c1;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1346 617 q20 -8 20 -34.5t-26 -37.5l-926 -377q-5 -2 -14 -2q-41 0 -41 41q0 26 25 36l833 339l-839 341q-19 8 -19 34q0 41 41 41q9 0 14 -2z" />
+<glyph unicode="&#x29c2;" horiz-adv-x="1982" d="M1908.5 739.5q67.5 -66.5 67.5 -158t-67 -157.5t-158 -66t-157 67t-66 157.5t65.5 157t156.5 66.5t158.5 -66.5zM1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1899 582q0 59 -44.5 103 t-103.5 44t-102.5 -44t-43.5 -103t43.5 -103t102.5 -44t103.5 44t44.5 103zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5z" />
+<glyph unicode="&#x29c3;" horiz-adv-x="1987" d="M1981 430q0 -41 -37 -41h-452q-65 -231 -257.5 -380.5t-437.5 -149.5q-298 0 -510.5 212.5t-212.5 511.5t211.5 510.5t511.5 211.5q246 0 438.5 -149.5t256.5 -380.5h452q37 0 37 -41t-37 -41h-434q8 -55 8 -111t-9 -111h435q37 0 37 -41zM1248.5 129.5 q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5z" />
+<glyph unicode="&#x29c4;" horiz-adv-x="1592" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM186 1193v-1163l1163 1163h-1163zM1406 -29v1163l-1163 -1163h1163z" />
+<glyph unicode="&#x29c5;" horiz-adv-x="1592" d="M1488 -72q0 -39 -39 -39h-1308q-37 0 -37 39v1310q0 37 37 37h1308q39 0 39 -37v-1310zM1406 1193h-1163l1163 -1163v1163zM186 -29h1163l-1163 1163v-1163z" />
+<glyph unicode="&#x29c6;" horiz-adv-x="1592" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 -29v1222h-1220v-1222h1220zM1175 394q0 -62 -60 -62q-15 0 -29 10l-262 191l31 -338q0 -53 -59 -53q-23 0 -42.5 17t-17.5 40l31 334l-262 -191q-14 -10 -29 -10q-59 0 -59 62 q0 36 28 49l295 139l-295 139q-28 13 -28 49q0 62 59 62q15 0 29 -10l262 -191l-31 340q0 53 60 53q25 0 43 -17t16 -42l-31 -334l262 191q14 10 29 10q60 0 60 -62q0 -35 -29 -49l-295 -139l295 -139q29 -14 29 -49z" />
+<glyph unicode="&#x29c7;" horiz-adv-x="1592" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 -29v1222h-1220v-1222h1220zM1023.5 810.5q94.5 -94.5 94.5 -228t-95 -228.5t-227 -95t-227 95t-95 228.5t94.5 228t227.5 94.5t227.5 -94.5zM965 412q71 71 71 170.5 t-70.5 170t-169.5 70.5t-169.5 -70.5t-70.5 -170t71 -170.5t169 -71t169 71z" />
+<glyph unicode="&#x29c8;" horiz-adv-x="1592" d="M1488 -72q0 -39 -37 -39h-1308q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-1310zM1406 -29v1222h-1220v-1222h1220zM1268 148q0 -39 -37 -39h-868q-39 0 -39 39v870q0 37 39 37h868q37 0 37 -37v-870zM1186 191v782h-780v-782h780z" />
+<glyph unicode="&#x29c9;" horiz-adv-x="2282" d="M2178 -372q0 -39 -37 -39h-1308q-39 0 -39 39v561h-651q-39 0 -39 39v1310q0 37 39 37h1308q37 0 37 -37v-563h653q37 0 37 -37v-1310zM2096 -329v1222h-608v-665q0 -39 -37 -39h-575v-518h1220zM1406 271v622h-530v-622h530zM1406 975v518h-1220v-1222h608v667 q0 37 39 37h573z" />
+<glyph unicode="&#x29ca;" horiz-adv-x="1592" d="M1515 -76q0 -35 -43 -35h-1352q-43 0 -43 35q0 12 6 24l676 1355q14 28 36.5 28t36.5 -28l677 -1355q6 -12 6 -24zM1406 -29l-610 1222l-610 -1222h1220zM875.5 1572.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x29cb;" horiz-adv-x="1592" d="M1515 -76q0 -35 -43 -35h-1352q-43 0 -43 35q0 12 6 24l676 1355q14 28 36.5 28t36.5 -28l677 -1355q6 -12 6 -24zM1406 -29l-610 1222l-610 -1222h1220zM1515 -326q0 -41 -37 -41h-1362q-39 0 -39 41t39 41h1362q37 0 37 -41z" />
+<glyph unicode="&#x29cc;" horiz-adv-x="1592" d="M1515 -76q0 -35 -43 -35h-1352q-43 0 -43 35q0 12 6 24l676 1355q14 28 36.5 28t36.5 -28l677 -1355q6 -12 6 -24zM1406 -29l-610 1222l-610 -1222h1220z" />
+<glyph unicode="&#x29cd;" horiz-adv-x="1592" d="M1615 -70q0 -41 -37 -41h-1562q-39 0 -39 41t39 41h78l665 1332q14 28 36.5 28t36.5 -28l666 -1332h80q37 0 37 -41zM1406 -29l-610 1222l-610 -1222h1220z" />
+<glyph unicode="&#x29ce;" horiz-adv-x="1839" d="M1669 932q0 -28 -36 -39l-1410 -445q-8 -3 -16 -3q-37 0 -37 42v888q0 42 37 42q8 0 16 -3l1410 -443q36 -11 36 -39zM1669 -213q0 -42 -37 -42q-8 0 -16 3l-1410 445q-36 11 -36 39t36 39l1410 443q8 3 15 3q38 0 38 -42v-888zM1484 932l-1232 387v-776zM1587 -157v776 l-1232 -387z" />
+<glyph unicode="&#x29cf;" horiz-adv-x="1978" d="M1808 144q0 -62 -41 -62t-41 62v877q0 61 41 61t41 -61v-877zM1584 137q0 -42 -37 -42q-6 0 -16 3l-1410 445q-36 11 -36 39t36 39l1410 443q10 3 15 3q38 0 38 -42v-888zM1502 193v776l-1232 -387z" />
+<glyph unicode="&#x29d0;" horiz-adv-x="1978" d="M1893 582q0 -28 -36 -39l-1410 -445q-10 -3 -16 -3q-37 0 -37 42v888q0 42 38 42q5 0 15 -3l1410 -443q36 -11 36 -39zM252 144q0 -62 -41 -62t-41 62v877q0 61 41 61t41 -61v-877zM1708 582l-1232 387v-776z" />
+<glyph unicode="&#x29d1;" horiz-adv-x="1591" d="M1290 127q0 -39 -41 -39q-15 0 -30 15l-422 422l-424 -422q-15 -15 -31 -15q-41 0 -41 39v912q0 37 41 37q18 0 31 -13l424 -424l422 424q13 13 30 13q41 0 41 -37v-912zM1208 228v708l-354 -354z" />
+<glyph unicode="&#x29d2;" horiz-adv-x="1591" d="M1290 127q0 -39 -41 -39q-15 0 -30 15l-422 422l-424 -422q-15 -15 -31 -15q-41 0 -41 39v912q0 37 41 37q18 0 31 -13l424 -424l422 424q13 13 30 13q41 0 41 -37v-912zM737 582l-354 354v-708z" />
+<glyph unicode="&#x29d3;" horiz-adv-x="1591" d="M1290 127q0 -39 -41 -39q-15 0 -30 15l-422 422l-424 -422q-15 -15 -31 -15q-41 0 -41 39v912q0 37 41 37q18 0 31 -13l424 -424l422 424q13 13 30 13q41 0 41 -37v-912z" />
+<glyph unicode="&#x29d4;" horiz-adv-x="1591" d="M1290 129q0 -41 -41 -41q-15 0 -30 15l-422 422l-424 -422q-15 -15 -31 -15q-41 0 -41 39v912q0 37 41 37q18 0 31 -13l424 -424l422 424q13 13 30 13q41 0 41 -41q0 -17 -10 -27l-426 -426l426 -424q10 -10 10 -29z" />
+<glyph unicode="&#x29d5;" horiz-adv-x="1591" d="M1290 127q0 -39 -41 -39q-15 0 -30 15l-422 422l-424 -422q-15 -15 -31 -15q-41 0 -41 41q0 19 10 29l426 424l-426 426q-10 10 -10 27q0 41 41 41q18 0 31 -13l424 -424l422 424q13 13 30 13q41 0 41 -37v-912z" />
+<glyph unicode="&#x29d6;" horiz-adv-x="1362" d="M1175 127q0 -41 -39 -41h-912q-37 0 -37 41q0 18 13 31l424 424l-424 422q-13 13 -13 30q0 41 37 41h912q39 0 39 -41q0 -15 -15 -30l-422 -422l422 -424q15 -15 15 -31zM1035 993h-708l354 -354zM1035 168l-354 354l-354 -354h708z" />
+<glyph unicode="&#x29d7;" horiz-adv-x="1362" d="M1175 127q0 -41 -39 -41h-912q-37 0 -37 41q0 18 13 31l424 424l-424 422q-13 13 -13 30q0 41 37 41h912q39 0 39 -41q0 -15 -15 -30l-422 -422l422 -424q15 -15 15 -31z" />
+<glyph unicode="&#x29d8;" horiz-adv-x="706" d="M564 -176q0 -18 -12 -31l-170 -190q-9 -10 -29 -10q-41 0 -41 41q0 14 14 30l142 160l-314 348q-12 13 -12 31t12 31l314 348l-314 348q-12 13 -12 31t12 31l314 348l-142 160q-14 16 -14 30q0 41 41 41q20 0 29 -10l170 -190q12 -13 12 -31t-12 -31l-314 -348l314 -348 q12 -13 12 -31t-12 -31l-314 -348l314 -348q12 -13 12 -31z" />
+<glyph unicode="&#x29d9;" horiz-adv-x="706" d="M564 203q0 -18 -12 -31l-314 -348l142 -160q14 -16 14 -30q0 -41 -41 -41q-20 0 -29 10l-170 190q-12 13 -12 31t12 31l314 348l-314 348q-12 13 -12 31t12 31l314 348l-314 348q-12 13 -12 31t12 31l170 190q9 10 29 10q41 0 41 -41q0 -14 -14 -30l-142 -160l314 -348 q12 -13 12 -31t-12 -31l-314 -348l314 -348q12 -13 12 -31z" />
+<glyph unicode="&#x29da;" horiz-adv-x="1206" d="M564 -176q0 -18 -12 -31l-170 -190q-9 -10 -29 -10q-41 0 -41 41q0 14 14 30l142 160l-314 348q-12 13 -12 31t12 31l314 348l-314 348q-12 13 -12 31t12 31l314 348l-142 160q-14 16 -14 30q0 41 41 41q20 0 29 -10l170 -190q12 -13 12 -31t-12 -31l-314 -348l314 -348 q12 -13 12 -31t-12 -31l-314 -348l314 -348q12 -13 12 -31zM1064 -176q0 -18 -12 -31l-170 -190q-9 -10 -29 -10q-41 0 -41 41q0 14 14 30l142 160l-314 348q-12 13 -12 31t12 31l314 348l-314 348q-12 13 -12 31t12 31l314 348l-142 160q-14 16 -14 30q0 41 41 41 q20 0 29 -10l170 -190q12 -13 12 -31t-12 -31l-314 -348l314 -348q12 -13 12 -31t-12 -31l-314 -348l314 -348q12 -13 12 -31z" />
+<glyph unicode="&#x29db;" horiz-adv-x="1206" d="M564 203q0 -18 -12 -31l-314 -348l142 -160q14 -16 14 -30q0 -41 -41 -41q-20 0 -29 10l-170 190q-12 13 -12 31t12 31l314 348l-314 348q-12 13 -12 31t12 31l314 348l-314 348q-12 13 -12 31t12 31l170 190q9 10 29 10q41 0 41 -41q0 -14 -14 -30l-142 -160l314 -348 q12 -13 12 -31t-12 -31l-314 -348l314 -348q12 -13 12 -31zM1064 203q0 -18 -12 -31l-314 -348l142 -160q14 -16 14 -30q0 -41 -41 -41q-20 0 -29 10l-170 190q-12 13 -12 31t12 31l314 348l-314 348q-12 13 -12 31t12 31l314 348l-314 348q-12 13 -12 31t12 31l170 190 q9 10 29 10q41 0 41 -41q0 -14 -14 -30l-142 -160l314 -348q12 -13 12 -31t-12 -31l-314 -348l314 -348q12 -13 12 -31z" />
+<glyph unicode="&#x29dc;" d="M1931 442q0 -182 -109 -323.5t-286 -141.5q-134 0 -258.5 73.5t-210.5 189.5l-61 82q-212 -345 -502 -345q-174 0 -281.5 142.5t-107.5 323t109.5 321.5t285.5 141q131 0 257.5 -74.5t211.5 -187.5l119 -158q100 -133 157 -202.5t132.5 -134t181.5 -64.5 q136 0 222.5 109.5t86.5 248.5q0 27 26.5 27t26.5 -27zM477 799q-137 0 -223 -109.5t-86 -253t87 -265.5t228 -122q260 0 465 348l-133 173q-81 101 -156.5 165t-181.5 64z" />
+<glyph unicode="&#x29dd;" d="M1841 963q0 -24 -23 -24q-10 0 -18 11q-28 43 -91 124q-255 286 -685 286t-685 -286q-17 -19 -91 -124q-8 -11 -18 -11q-23 0 -23 24q0 9 4 16q131 218 347 345.5t466 127.5t466 -127.5t347 -345.5q4 -7 4 -16zM1542 905q175 0 282 -141.5t107 -322.5t-109 -322.5 t-286 -141.5q-134 0 -258.5 74t-210.5 189l-61 82q-212 -345 -502 -345q-174 0 -281.5 142.5t-107.5 323t109.5 321.5t285.5 141q132 0 258.5 -74.5t210.5 -187.5l61 -82q216 344 502 344zM1569 84q136 0 222.5 109.5t86.5 253.5t-86 265.5t-229 121.5q-260 0 -465 -349 l142 -180q74 -94 148.5 -157.5t180.5 -63.5zM477 799q-137 0 -223 -109.5t-86 -253t87 -265.5t228 -122q260 0 465 348l-133 173q-81 101 -156.5 165t-181.5 64z" />
+<glyph unicode="&#x29de;" d="M1542 905q175 0 282 -141.5t107 -322.5t-109 -322.5t-286 -141.5q-134 0 -258 74q-125 74 -214 193v-310q0 -62 -41 -62t-41 62v351q-206 -308 -478 -308q-174 0 -281.5 142.5t-107.5 323t109.5 321.5t285.5 141q132 0 258 -75q126 -73 214 -191v372q0 61 41 61t41 -61 v-413q209 307 478 307zM1569 84q136 0 222.5 109.5t86.5 253.5t-86 265.5t-229 121.5q-260 0 -465 -349l142 -180q74 -94 148.5 -157.5t180.5 -63.5zM477 799q-137 0 -223 -109.5t-86 -253t87 -265.5t228 -122q260 0 465 348l-133 173q-81 101 -156.5 165t-181.5 64z" />
+<glyph unicode="&#x29df;" horiz-adv-x="2275" d="M2064 812q95 -96 95 -229.5t-95.5 -230t-223.5 -96.5t-220.5 81.5t-108.5 203.5h-748q-16 -122 -108.5 -203.5t-220.5 -81.5t-223.5 96.5t-95.5 230t95 229.5t223 96t221.5 -82t108.5 -203h748q15 121 108.5 203t221.5 82t223 -96zM2077 582q0 99 -71.5 171.5t-171 72.5 t-171.5 -72t-72 -172t72 -172t171.5 -72t171 72.5t71.5 171.5zM683 582q0 100 -72 172t-171.5 72t-171 -72.5t-71.5 -171.5t71.5 -171.5t171 -72.5t171.5 72t72 172z" />
+<glyph unicode="&#x29e0;" horiz-adv-x="1591" d="M1488 -72q0 -39 -37 -39h-1238l-109 109v1240q0 37 39 37h1238l107 -107v-1240zM1406 -29v1152h-1150v-1152h1150z" />
+<glyph unicode="&#x29e1;" horiz-adv-x="1590" d="M1420 182q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1420 582q0 -41 -41 -41h-1162q-44 0 -44 33q0 24 24 39l1162 725q16 10 29 10q32 0 32 -41v-725zM1338 623v606l-969 -606h969z" />
+<glyph unicode="&#x29e2;" horiz-adv-x="1497" d="M1359 37q0 -37 -37 -37h-1145q-39 0 -39 37v731q0 39 41 39t41 -39v-686h488v660q0 37 41 37t41 -37v-660h487v686q0 39 41 39t41 -39v-731z" />
+<glyph unicode="&#x29e3;" horiz-adv-x="1590" d="M1420 382q0 -41 -37 -41h-479l-242 -419q-23 -39 -46 -39q-41 0 -41 37q0 17 15 43l218 378h-304l-242 -419q-23 -39 -46 -39q-41 0 -41 37q0 17 15 43l218 378h-199q-39 0 -39 41t39 41h247l184 318h-431q-39 0 -39 41t39 41h478l242 419q23 39 45 39q41 0 41 -37 q0 -17 -15 -43l-218 -378h305l242 419q23 39 45 39q41 0 41 -37q0 -17 -15 -43l-218 -378h201q37 0 37 -41t-37 -41h-248l-184 -318h432q37 0 37 -41zM1040 741h-305l-184 -318h305z" />
+<glyph unicode="&#x29e4;" horiz-adv-x="1590" d="M1420 382q0 -41 -37 -41h-479l-242 -419q-23 -39 -46 -39q-41 0 -41 37q0 17 15 43l218 378h-304l-242 -419q-23 -39 -46 -39q-41 0 -41 37q0 17 15 43l218 378h-199q-39 0 -39 41t39 41h247l184 318h-431q-39 0 -39 41t39 41h478l242 419q23 39 45 39q41 0 41 -37 q0 -17 -15 -43l-218 -378h305l242 419q23 39 45 39q41 0 41 -37q0 -17 -15 -43l-218 -378h201q37 0 37 -41t-37 -41h-248l-184 -318h432q37 0 37 -41zM1040 741h-305l-184 -318h305zM1216 1545q0 -101 -59.5 -179t-153.5 -78t-217.5 102t-196.5 102q-123 0 -157 -153 q-11 -51 -30 -51q-28 0 -28 56q0 110 55 186t153 76t221.5 -102t195.5 -102q53 0 97 35t55 86l8 49q9 34 26 34q31 0 31 -61z" />
+<glyph unicode="&#x29e5;" horiz-adv-x="1590" d="M1420 182q0 -41 -37 -41h-595l-126 -219q-23 -39 -46 -39q-41 0 -41 37q0 17 15 43l103 178h-305l-126 -219q-23 -39 -46 -39q-41 0 -41 37q0 17 15 43l103 178h-84q-39 0 -39 41t39 41h131l184 318h-315q-39 0 -39 41t39 41h362l184 318h-546q-39 0 -39 41t39 41h593 l127 219q23 39 45 39q41 0 41 -37q0 -17 -15 -43l-103 -178h305l127 219q23 39 45 39q41 0 41 -37q0 -17 -15 -43l-103 -178h86q37 0 37 -41t-37 -41h-133l-184 -318h317q37 0 37 -41t-37 -41h-364l-183 -318h547q37 0 37 -41zM1155 941h-305l-184 -318h305zM924 541h-305 l-183 -318h304z" />
+<glyph unicode="&#x29e6;" horiz-adv-x="1593" d="M1466 107q0 -39 -41 -39t-41 39v232h-1175v-232q0 -39 -41 -39t-41 39v952q0 37 41 37t41 -37v-234h1175v234q0 37 41 37t41 -37v-952zM1384 421v322h-1175v-322h1175z" />
+<glyph unicode="&#x29e7;" horiz-adv-x="1346" d="M1198 382q0 -41 -37 -41h-447v-245q0 -39 -41 -39t-41 39v245h-445q-39 0 -39 41t39 41h445v318h-445q-39 0 -39 41t39 41h445v247q0 37 41 37t41 -37v-247h447q37 0 37 -41t-37 -41h-447v-318h447q37 0 37 -41z" />
+<glyph unicode="&#x29e8;" horiz-adv-x="1592" d="M1515 1296q0 -12 -6 -24l-677 -1355q-14 -28 -36.5 -28t-36.5 28l-676 1355q-6 12 -6 24q0 35 43 35h1352q43 0 43 -35zM796 1249v-1222l610 1222h-610z" />
+<glyph unicode="&#x29e9;" horiz-adv-x="1592" d="M1515 1296q0 -12 -6 -24l-677 -1355q-14 -28 -36.5 -28t-36.5 28l-676 1355q-6 12 -6 24q0 35 43 35h1352q43 0 43 -35zM796 1249h-610l610 -1222v1222z" />
+<glyph unicode="&#x29ea;" horiz-adv-x="1592" d="M1550 803q11 -11 11 -27.5t-10 -26.5l-715 -715v-298q107 127 253 179q8 3 15 3q39 0 39 -42q0 -24 -23 -34l-62 -27q-149 -75 -237 -230q-15 -27 -26 -27t-26 27q-87 154 -236 230l-58 25q-26 12 -26 36q0 42 39 42q7 0 15 -3q144 -52 251 -178v300l-713 714 q-10 10 -10 26t11 27l727 727q10 10 26 10t26 -10z" />
+<glyph unicode="&#x29eb;" horiz-adv-x="1218" d="M1198 582l-589 -779l-589 779l589 779z" />
+<glyph unicode="&#x29ec;" horiz-adv-x="1592" d="M1307 1287q211 -212 211 -505t-198.5 -503t-483.5 -225v-318q107 127 253 179q8 3 15 3q39 0 39 -42q0 -24 -23 -34l-62 -27q-149 -75 -237 -230q-15 -27 -26 -27t-26 27q-87 154 -236 230l-58 25q-26 12 -26 36q0 42 39 42q7 0 15 -3q144 -52 251 -178v317 q-284 17 -482 226t-198 502.5t211.5 505t511 211.5t510.5 -212zM1248.5 323.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5z" />
+<glyph unicode="&#x29ed;" horiz-adv-x="1592" d="M1307 1287q211 -212 211 -505t-198.5 -503t-483.5 -225v-318q107 127 253 179q8 3 15 3q39 0 39 -42q0 -24 -23 -34l-62 -27q-149 -75 -237 -230q-15 -27 -26 -27t-26 27q-87 154 -236 230l-58 25q-26 12 -26 36q0 42 39 42q7 0 15 -3q144 -52 251 -178v317 q-284 17 -482 226t-198 502.5t211.5 505t511 211.5t510.5 -212z" />
+<glyph unicode="&#x29ee;" horiz-adv-x="1024" d="M984 148q0 -39 -37 -39h-394v-369h309q62 0 62 -41t-62 -41h-701q-61 0 -61 41t61 41h310v369h-392q-39 0 -39 39v870q0 37 39 37h392v369h-310q-61 0 -61 41t61 41h701q62 0 62 -41t-62 -41h-309v-369h394q37 0 37 -37v-870zM902 191v782h-780v-782h780z" />
+<glyph unicode="&#x29ef;" horiz-adv-x="1024" d="M984 148q0 -39 -37 -39h-394v-369h309q62 0 62 -41t-62 -41h-701q-61 0 -61 41t61 41h310v369h-392q-39 0 -39 39v870q0 37 39 37h392v369h-310q-61 0 -61 41t61 41h701q62 0 62 -41t-62 -41h-309v-369h394q37 0 37 -37v-870z" />
+<glyph unicode="&#x29f0;" horiz-adv-x="1024" d="M991 611q10 -10 10 -28t-10 -28l-438 -438v-377h309q62 0 62 -41t-62 -41h-701q-61 0 -61 41t61 41h310v377l-438 438q-10 10 -10 28t10 28l438 438v375h-310q-61 0 -61 41t61 41h701q62 0 62 -41t-62 -41h-309v-375zM902 582l-391 391l-389 -391l389 -389z" />
+<glyph unicode="&#x29f1;" horiz-adv-x="1024" d="M991 611q10 -10 10 -28t-10 -28l-438 -438v-377h309q62 0 62 -41t-62 -41h-701q-61 0 -61 41t61 41h310v377l-438 438q-10 10 -10 28t10 28l438 438v375h-310q-61 0 -61 41t61 41h701q62 0 62 -41t-62 -41h-309v-375z" />
+<glyph unicode="&#x29f2;" horiz-adv-x="1024" d="M964 582q0 -176 -119.5 -306t-291.5 -145v-391h309q62 0 62 -41t-62 -41h-701q-61 0 -61 41t61 41h310v391q-173 16 -292 146t-119 305.5t118.5 305t292.5 145.5v391h-310q-61 0 -61 41t61 41h701q62 0 62 -41t-62 -41h-309v-391q173 -15 292 -145t119 -306zM882 582 q0 153 -108.5 262t-261.5 109t-261.5 -108.5t-108.5 -261.5t109.5 -262.5t261 -109.5t260.5 109t109 262z" />
+<glyph unicode="&#x29f3;" horiz-adv-x="1024" d="M964 582q0 -176 -119.5 -306t-291.5 -145v-391h309q62 0 62 -41t-62 -41h-701q-61 0 -61 41t61 41h310v391q-173 16 -292 146t-119 305.5t118.5 305t292.5 145.5v391h-310q-61 0 -61 41t61 41h701q62 0 62 -41t-62 -41h-309v-391q173 -15 292 -145t119 -306z" />
+<glyph unicode="&#x29f4;" d="M307.5 861.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM307.5 461.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1906 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213 q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-1154q-39 0 -39 41t39 41h1154q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163q105 -217 317 -310z" />
+<glyph unicode="&#x29f5;" horiz-adv-x="569" d="M569 -312q0 -38 -42 -38q-30 0 -43 47l-476 1743q-8 29 -8 36q0 38 42 38q30 0 43 -47l476 -1743q8 -29 8 -36z" />
+<glyph unicode="&#x29f6;" horiz-adv-x="569" d="M569 1565q0 -41 -37 -41h-493q-39 0 -39 41t39 41h493q37 0 37 -41zM569 1384q0 -7 -8 -36l-476 -1743q-13 -47 -43 -47q-42 0 -42 38q0 7 8 36l476 1743q13 47 43 47q42 0 42 -38z" />
+<glyph unicode="&#x29f7;" horiz-adv-x="1146" d="M998 582q0 -41 -37 -41h-334l223 -817q8 -29 8 -36q0 -38 -42 -38q-30 0 -43 47l-230 844h-356q-39 0 -39 41t39 41h333l-223 817q-8 29 -8 36q0 38 42 38q30 0 43 -47l230 -844h357q37 0 37 -41z" />
+<glyph unicode="&#x29f8;" horiz-adv-x="669" d="M669 1568q0 -9 -8 -36l-576 -1927q-14 -47 -43 -47q-42 0 -42 38q0 9 8 36l576 1927q14 47 43 47q42 0 42 -38z" />
+<glyph unicode="&#x29f9;" horiz-adv-x="669" d="M669 -404q0 -38 -42 -38q-29 0 -43 47l-576 1927q-8 27 -8 36q0 38 42 38q29 0 43 -47l576 -1927q8 -27 8 -36z" />
+<glyph unicode="&#x29fa;" horiz-adv-x="1646" d="M1498 582q0 -41 -37 -41h-447v-445q0 -39 -41 -39t-41 39v445h-218v-445q0 -39 -41 -39t-41 39v445h-445q-39 0 -39 41t39 41h445v447q0 37 41 37t41 -37v-447h218v447q0 37 41 37t41 -37v-447h447q37 0 37 -41z" />
+<glyph unicode="&#x29fb;" horiz-adv-x="1946" d="M1798 582q0 -41 -37 -41h-447v-445q0 -39 -41 -39t-41 39v445h-218v-445q0 -39 -41 -39t-41 39v445h-218v-445q0 -39 -41 -39t-41 39v445h-445q-39 0 -39 41t39 41h445v447q0 37 41 37t41 -37v-447h218v447q0 37 41 37t41 -37v-447h218v447q0 37 41 37t41 -37v-447h447 q37 0 37 -41z" />
+<glyph unicode="&#x29fc;" horiz-adv-x="1024" d="M944 -341q0 -41 -43 -41q-16 0 -32 19l-111 156q-235 326 -508 621q-46 45 -131 139q-11 14 -11 29t11 29l131 139q272 294 508 621q35 54 111 156q16 19 32 19q43 0 43 -41q0 -11 -8 -24q-260 -409 -731 -899q471 -490 731 -899q8 -13 8 -24z" />
+<glyph unicode="&#x29fd;" horiz-adv-x="1024" d="M916 582q0 -15 -11 -29l-131 -139q-273 -295 -508 -621q-35 -54 -111 -156q-16 -19 -32 -19q-43 0 -43 41q0 11 8 24q260 409 731 899q-471 490 -731 899q-8 13 -8 24q0 41 43 41q16 0 32 -19l111 -156q236 -327 508 -621q46 -45 131 -139q11 -14 11 -29z" />
+<glyph unicode="&#x29fe;" horiz-adv-x="1591" d="M1421 582q0 -22 -31 -82t-35 -73q-209 114 -287 114h-231v-231q0 -79 114 -287q-13 -5 -73 -36t-82.5 -31t-82.5 31t-72 36q114 208 114 287v231h-232q-78 0 -287 -114q-4 13 -35 73t-31 82t31 82t35 73q208 -114 287 -114h232v232q0 78 -114 287q12 4 72 35t82.5 31 t82.5 -31t73 -35q-114 -209 -114 -287v-232h231q79 0 287 114q4 -13 35 -73t31 -82z" />
+<glyph unicode="&#x29ff;" horiz-adv-x="1591" d="M1421 582q0 -22 -31 -82t-35 -73q-209 114 -287 114h-545q-78 0 -287 -114q-4 13 -35 73t-31 82t31 82t35 73q208 -114 287 -114h545q79 0 287 114q4 -13 35 -73t31 -82z" />
+<glyph unicode="&#x2a00;" d="M1214 582q0 -79 -55.5 -134.5t-134.5 -55.5t-134.5 55.5t-55.5 134.5t55.5 134.5t134.5 55.5t134.5 -55.5t55.5 -134.5zM2008 582q0 -410 -287 -697t-697 -287t-697 287t-287 697t287 697t697 287t697 -287t287 -697zM1908 582q0 368 -258 626t-626.5 258t-626 -257.5 t-257.5 -626.5t257.5 -626.5t626 -257.5t626.5 258t258 626z" />
+<glyph unicode="&#x2a01;" d="M1713 1271q285 -286 285 -688.5t-286 -689t-687.5 -286.5t-688 286.5t-286.5 689.5t285.5 688.5t689 285.5t688.5 -286zM1635 -29q254 255 254 611.5t-253.5 611t-611.5 254.5t-611.5 -253.5t-253.5 -611.5t254.5 -612.5t611 -254.5t610.5 255zM1866 582q0 -54 -48 -54 h-740v-740q0 -48 -54 -48t-54 48v740h-737q-51 0 -51 54t51 54h737v737q0 51 54 51t54 -51v-737h740q48 0 48 -54z" />
+<glyph unicode="&#x2a02;" d="M1713 1271q285 -286 285 -688.5t-286 -689t-687.5 -286.5t-688 286.5t-286.5 689.5t285.5 688.5t689 285.5t688.5 -286zM1635 -29q254 255 254 611.5t-253.5 611t-611.5 254.5t-611.5 -253.5t-253.5 -611.5t254.5 -612.5t611 -254.5t610.5 255zM1624 59q16 -16 16 -33 q0 -19 -20.5 -39.5t-39.5 -20.5q-17 0 -33 16l-523 524l-521 -522q-17 -17 -35 -17q-20 0 -39.5 19.5t-19.5 39.5q0 18 17 35l522 521l-522 521q-17 17 -17 35q0 20 19.5 39.5t39.5 19.5q18 0 35 -17l521 -522l523 524q16 16 33 16q19 0 39.5 -20.5t20.5 -39.5 q0 -17 -16 -33l-524 -523z" />
+<glyph unicode="&#x2a03;" horiz-adv-x="1704" d="M1569 280q0 -284 -212.5 -483t-501.5 -199t-504.5 196.5t-215.5 485.5v1216q0 17 16 33.5t33 16.5q60 0 60 -50v-1205q0 -247 179.5 -415t428.5 -168t428.5 168t179.5 415v1205q0 17 16 33.5t33 16.5q60 0 60 -50v-1216zM931 660.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5 t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5z" />
+<glyph unicode="&#x2a04;" horiz-adv-x="1704" d="M1569 280q0 -284 -212.5 -483t-501.5 -199t-504.5 196.5t-215.5 485.5v1216q0 17 16 33.5t33 16.5q60 0 60 -50v-1205q0 -247 179.5 -415t428.5 -168t428.5 168t179.5 415v1205q0 17 16 33.5t33 16.5q60 0 60 -50v-1216zM1394 582q0 -54 -48 -54h-440v-440q0 -48 -54 -48 t-54 48v440h-437q-51 0 -51 54t51 54h437v437q0 51 54 51t54 -51v-437h440q48 0 48 -54z" />
+<glyph unicode="&#x2a05;" horiz-adv-x="1704" d="M1569 -340q0 -52 -54.5 -52t-54.5 52v1787h-1216v-1787q0 -52 -54.5 -52t-54.5 52v1847q0 19 16.5 34t35.5 15h1332q50 0 50 -49v-1847z" />
+<glyph unicode="&#x2a06;" horiz-adv-x="1704" d="M1569 -343q0 -49 -50 -49h-1332q-19 0 -35.5 15t-16.5 34v1847q0 52 54.5 52t54.5 -52v-1787h1216v1787q0 52 54.5 52t54.5 -52v-1847z" />
+<glyph unicode="&#x2a07;" horiz-adv-x="1864" d="M1749 -4q0 -41 -41 -41q-26 0 -37 25l-489 1103l-204 -463l269 -608q2 -5 2 -16q0 -41 -41 -41q-26 0 -37 25l-238 538l-238 -538q-11 -25 -39 -25q-41 0 -41 41q0 14 272 625l-205 462l-487 -1103q-11 -25 -39 -25q-41 0 -41 41q0 7 530 1204q11 25 38 25t38 -25 l211 -477l213 477q11 25 38 25t38 -25l526 -1188q2 -5 2 -16z" />
+<glyph unicode="&#x2a08;" horiz-adv-x="1864" d="M1749 1184q0 -10 -2 -15l-526 -1189q-11 -25 -38 -25t-38 25l-213 477l-211 -477q-11 -25 -38 -25t-38 25q-530 1198 -530 1204q0 41 41 41q28 0 39 -25l487 -1104l205 463q-272 612 -272 625q0 41 41 41q28 0 39 -25l238 -538l238 538q11 25 37 25q41 0 41 -41 q0 -10 -2 -15l-270 -609l205 -464l489 1104q11 25 37 25q41 0 41 -41z" />
+<glyph unicode="&#x2a09;" horiz-adv-x="2132" d="M1678 27q0 -57 -57 -57q-20 0 -32 12l-523 524l-521 -522q-13 -13 -35 -13q-55 0 -55 55q0 22 13 35l522 521l-522 521q-13 13 -13 35q0 55 55 55q22 0 35 -13l521 -522l523 524q12 12 32 12q57 0 57 -57q0 -20 -12 -32l-524 -523l524 -523q12 -12 12 -32z" />
+<glyph unicode="&#x2a0a;" horiz-adv-x="1700" d="M829 1382h-597l304 -423q67 24 136 24q166 0 283.5 -117.5t117.5 -283.5t-117.5 -283.5t-283.5 -117.5q-84 0 -160 33l-326 -403h680q284 0 439 50q235 77 309 287h50l-148 -438h-1463q-17 0 -17 20q0 6 5 12l410 506q-180 119 -180 334q0 180 135 300l-365 507 q-6 8 -6 36.5t19 28.5h1462l149 -410h-51q-80 215 -328 291q-156 47 -457 47zM1023 582q0 145 -103 248t-248 103q-54 0 -105 -16l225 -313q6 -8 6 -22t-8 -24l-245 -303q62 -24 127 -24q145 0 248 103t103 248zM321 582q0 -191 161 -295l187 230l-234 324 q-114 -104 -114 -259z" />
+<glyph unicode="&#x2a0b;" horiz-adv-x="1314" d="M399 -442q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q30 76 45 210h-531q-21 0 -21 24q0 9 5 15l467 576l-467 648q-6 8 -6 35.5t23 27.5h667q24 128 74 217q78 137 210 137q77 0 141 -42t64 -116t-76 -74t-76 75 q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-24 -70 -38 -195h316l118 -325h-50q-80 215 -392 246l-17 -273q-22 -334 -94 -880q188 4 298 47q154 60 205 206h49l-117 -347h-449q-71 -368 -313 -368zM646 1180h-437l410 -569q6 -8 6 -22t-8 -24l-441 -545h421 q25 446 79 873l38 286q-52 1 -68 1z" />
+<glyph unicode="&#x2a0c;" horiz-adv-x="2639" d="M2434 1606q77 0 141 -42t64 -116t-76.5 -74t-76.5 75q0 69 68 78q-47 38 -120 38q-86 0 -126 -118q-30 -89 -45 -268l-18 -279q-25 -376 -100 -924q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -71 -78q48 -39 122 -39 q98 0 144 118q39 99 64 468t54 600l54 402q58 420 294 420zM1894 1606q77 0 141 -42t64 -116t-76.5 -74t-76.5 75q0 69 68 78q-47 38 -120 38q-86 0 -126 -118q-30 -89 -45 -268l-18 -279q-25 -376 -100 -924q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116 t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q39 99 64 468t54 600l54 402q24 178 84 283q78 137 210 137zM1354 1606q77 0 141 -42t64 -116t-76.5 -74t-76.5 75q0 69 68 78q-47 38 -120 38q-86 0 -126 -118q-30 -89 -45 -268l-18 -279 q-25 -376 -100 -924q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q39 99 64 468t55 600l53 402q24 178 84 283q78 137 210 137zM814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78 q-47 38 -120 38q-86 0 -126 -118q-30 -89 -45 -268l-18 -279q-25 -377 -100 -924q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q40 102 66 478t54 598l52 397q24 175 84 280 q78 137 210 137z" />
+<glyph unicode="&#x2a0d;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-87 0 -126 -118q-30 -91 -45 -269l-19 -288q-9 -149 -21 -271h269q33 0 33 -37t-33 -37h-276q-12 -116 -28 -245l-43 -324q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116 t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q40 103 58.5 370t36.5 459h-268q-35 0 -35 37t35 37h275q21 204 70 567q57 420 294 420z" />
+<glyph unicode="&#x2a0e;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-87 0 -126 -118q-31 -93 -42.5 -250.5t-20.5 -296.5l-7 -101h254q33 0 33 -37t-33 -37h-260q-12 -150 -28 -286h288q33 0 33 -37t-33 -37h-297q-30 -247 -51.5 -400.5t-88.5 -262.5 q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 141 111t64 415q9 132 18 241h-252q-35 0 -35 37t35 37h258q14 162 28 286h-286q-35 0 -35 37t35 37h295q17 144 50 387q57 420 294 420z" />
+<glyph unicode="&#x2a0f;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-87 0 -126 -118q-30 -91 -45 -269l-19 -281q-9 -142 -18 -246q341 124 343 124q37 0 37 -38q0 -26 -21 -34l-367 -133q-15 -147 -31 -272l-42 -322q-23 -165 -90 -274q-88 -144 -231 -144 q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q40 103 59 379t32 417q-337 -123 -343 -123q-37 0 -37 38q0 26 23 34l365 133q20 201 73 592q57 420 294 420z" />
+<glyph unicode="&#x2a10;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-87 0 -124 -112t-62 -517q110 -33 176 -116q6 -8 6 -15q0 -24 -24 -24q-9 0 -18 9q-76 74 -143 97q-22 -318 -63 -624q76 9 160 67q9 6 15 6q24 0 24 -25q0 -9 -10 -18q-76 -67 -195 -78 l-31 -239q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q34 88 50 252l18 261q-116 35 -189 133.5t-73 230t96.5 237.5t238.5 119l31 237q57 420 294 420zM282 794.5q-80 -91.5 -80 -203.5 t60.5 -196t157.5 -117q28 359 62 623q-120 -15 -200 -106.5z" />
+<glyph unicode="&#x2a11;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -123.5 -111.5t-62.5 -517.5q117 -35 190.5 -133.5t73.5 -231t-97 -238t-239 -118.5l-31 -239q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75 q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q40 103 66 483.5t68 701.5q-117 -14 -197 -103t-83 -207q113 102 144 102q22 0 22 -35q0 -5 -31 -20q-103 -51 -135 -128q-15 -37 -24 -37t-24 37q-32 77 -135 128q-32 16 -32 20q0 35 23 35q31 0 144 -102q4 139 100 242 t235 116l31 237q57 420 294 420zM763 369.5q81 91.5 81 203.5t-61 196.5t-159 117.5q-23 -336 -62 -624q120 15 201 106.5z" />
+<glyph unicode="&#x2a12;" horiz-adv-x="1019" d="M628 582q0 -43 -31 -74t-74 -31t-74 31t-31 74t31 74t74 31t74 -31t31 -74zM814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-87 0 -124 -112t-61 -502h229q34 0 34 -33v-670q0 -35 -34 -35h-302l-31 -237q-23 -165 -90 -274 q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q36 92 52 267l18 278h426v642h-361l37 283q57 420 294 420z" />
+<glyph unicode="&#x2a13;" horiz-adv-x="1019" d="M628 582q0 -43 -31 -74t-74 -31t-74 31t-31 74t31 74t74 31t74 -31t31 -74zM814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-35 -104 -60 -511q117 -35 190.5 -133.5t73.5 -231t-97 -238t-239 -118.5l-31 -239 q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q36 93 53 275q9 144 19 287q50 -17 103 -17q132 0 226.5 94.5t94.5 226.5t-94.5 226.5t-226.5 94.5q-25 0 -41 -2l38 285q57 420 294 420z " />
+<glyph unicode="&#x2a14;" horiz-adv-x="1108" d="M844 582q0 -43 -31 -74t-74 -31t-74.5 31t-31.5 74t31.5 74t74.5 31t74 -31t31 -74zM1108 582q0 -152 -108.5 -260.5t-260.5 -108.5q-93 0 -177 46l-37 -283q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78 q48 -39 121 -39q98 0 144 118q40 103 58 361.5t30 397.5q34 -96 117.5 -155t185.5 -59q132 0 226.5 94.5t94.5 226.5t-94.5 226.5t-226.5 94.5q-181 0 -275 -155q19 167 56 438q57 420 294 420q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38 q-86 0 -126 -118q-35 -103 -60 -513q54 17 111 17q152 0 260.5 -108.5t108.5 -260.5z" />
+<glyph unicode="&#x2a15;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-35 -104 -60 -511q117 -35 190.5 -133.5t73.5 -231t-97 -238t-239 -118.5l-31 -239q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75 q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q34 87 50 251l18 262q-116 35 -189 133.5t-73 230t96.5 237.5t238.5 119l31 237q57 420 294 420zM844 582q0 132 -94.5 226.5t-226.5 94.5t-226.5 -94.5t-94.5 -226.5t94.5 -226.5t226.5 -94.5t226.5 94.5t94.5 226.5zM628 582 q0 -43 -31 -74t-74 -31t-74 31t-31 74t31 74t74 31t74 -31t31 -74z" />
+<glyph unicode="&#x2a16;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-87 0 -124 -112.5t-61 -501.5h229q34 0 34 -33v-670q0 -35 -34 -35h-302l-31 -237q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78 q48 -39 121 -39q98 0 144 118q33 86 49 244l18 253h-226q-35 0 -35 35v670q0 33 35 33h300l31 235q55 420 294 420zM844 261v642h-218q-21 -326 -64 -642h282zM202 903v-642h216q26 345 65 642h-281z" />
+<glyph unicode="&#x2a17;" horiz-adv-x="1117" d="M914 922l-51 -5q-25 0 -25 27t76 27q203 0 203 -206q0 -133 -98 -178q-64 -29 -215 -29h-144q-14 -134 -30 -260l-42 -322q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 141 111t62 386t37 463 h-376q58 -43 114.5 -126t56.5 -145q0 -19 -22.5 -19t-29.5 27q-25 98 -83 166.5t-131 96.5q-36 14 -36 24t36 24q73 28 133 98.5t78 151.5q2 9 7 27q6 13 27 13t21 -18q0 -8 -4 -22q-44 -160 -167 -250h381q22 218 71 580q57 420 294 420q77 0 141 -42t64 -116t-76 -74 t-76 75q0 69 67 78q-47 38 -120 38q-87 0 -126 -118q-31 -93 -46 -269q-23 -399 -40 -572h175q105 0 156 26q72 36 72 133q0 157 -154 157z" />
+<glyph unicode="&#x2a18;" horiz-adv-x="1020" d="M1020 148q0 -39 -38 -39q-14 0 -23 9l-369 369q-8 -78 -24 -197l-41 -314q-23 -165 -90 -274q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q99 0 144 118q40 105 58 367.5t29 383.5l-347 -348q-9 -9 -24 -9 q-38 0 -38 37q0 15 10 25l411 410l-411 410q-10 10 -10 25q0 37 38 37q14 0 24 -10l368 -367q18 170 64 509q57 420 294 420q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-87 0 -126 -118q-31 -93 -46 -269q-19 -331 -32 -481l349 349q9 9 23 9 q38 0 38 -39q0 -13 -9 -22l-412 -412l412 -412q9 -9 9 -22z" />
+<glyph unicode="&#x2a19;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-35 -104 -60 -510q127 -35 207.5 -141t80.5 -238v-377q0 -25 -24.5 -25t-24.5 25v377q0 113 -67 204t-175 125q-24 -357 -100 -911q-23 -165 -90 -274q-88 -144 -231 -144 q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q40 102 66 481.5t68 702.5q-129 -15 -216.5 -113.5t-87.5 -228.5v-377q0 -25 -24 -25t-24 25v377q0 152 103.5 265t255.5 126l31 237q57 420 294 420z" />
+<glyph unicode="&#x2a1a;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-30 -89 -45 -268l-18 -279q-22 -336 -63 -636q130 15 217.5 113t87.5 229v377q0 25 24.5 25t24.5 -25v-377q0 -153 -104 -266t-256 -126l-31 -238q-23 -165 -90 -274 q-88 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -69 -70 -78q48 -39 121 -39q98 0 144 118q34 87 50 251l18 261q-127 36 -206.5 141t-79.5 237v377q0 25 24 25t24 -25v-377q0 -112 67.5 -203.5t174.5 -125.5q27 351 52 541l48 368q24 178 84 283 q78 137 210 137z" />
+<glyph unicode="&#x2a1b;" horiz-adv-x="1019" d="M992 1569q0 -37 -33 -37h-897q-35 0 -35 37t35 37h897q33 0 33 -37zM814 1442q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-32 -92 -43.5 -250t-28 -415.5t-70.5 -641.5q-23 -166 -90 -274q-87 -144 -231 -144q-78 0 -141 41.5 t-63 116t76.5 74.5t76.5 -75q0 -70 -70 -78q49 -39 121 -39q97 0 144 118q40 101 65 467.5t56 614t35 272.5q26 143 79 235q78 137 210 137z" />
+<glyph unicode="&#x2a1c;" horiz-adv-x="1019" d="M814 1606q77 0 141 -42t64 -116t-76 -74t-76 75q0 69 67 78q-47 38 -120 38q-86 0 -126 -118q-32 -92 -43.5 -250t-28 -415.5t-70.5 -641.5q-23 -166 -90 -274q-87 -144 -231 -144q-78 0 -141 41.5t-63 116t76.5 74.5t76.5 -75q0 -70 -70 -78q49 -39 121 -39 q97 0 144 118q40 101 65 467.5t56 614t35 272.5q26 143 79 235q78 137 210 137zM992 -405q0 -37 -33 -37h-897q-35 0 -35 37t35 37h897q33 0 33 -37z" />
+<glyph unicode="&#x2a1d;" horiz-adv-x="1883" d="M1683 -100q0 -59 -61 -59q-22 0 -45 23l-633 633l-636 -633q-23 -23 -47 -23q-61 0 -61 59v1368q0 21 18 38t44 17t46 -20l636 -635l633 635q20 20 45 20q61 0 61 -55v-1368zM1601 -45v1257l-627 -630zM913 582l-631 632v-1261z" />
+<glyph unicode="&#x2a1e;" horiz-adv-x="1817" d="M1617 -305q0 -44 -35 -44q-14 0 -28 9l-1416 887q-23 14 -23 35t23 35l1416 887q14 9 28 9q35 0 35 -44v-1774zM1535 -231v1626l-1298 -813z" />
+<glyph unicode="&#x2a1f;" horiz-adv-x="711" d="M542 743q0 -77 -55.5 -131.5t-131.5 -54.5t-131 55t-55 131t55 131t131 55t131.5 -54.5t55.5 -131.5zM508 211q37 -57 37 -165.5t-71 -248t-175 -198.5q-12 -6 -23 -6q-41 0 -41 43v6q4 15 19 27q149 119 191 273q-42 -24 -90 -24q-76 0 -131 55t-55 131t55 131t131 55 q103 0 153 -79zM460 743q0 42 -31 73t-73.5 31t-73.5 -31t-31 -73t31 -73t73.5 -31t73.5 31t31 73zM460 104q0 42 -31 73t-73.5 31t-73.5 -31t-31 -73t31 -73t73.5 -31t73.5 31t31 73z" />
+<glyph unicode="&#x2a20;" horiz-adv-x="2190" d="M2020 582q0 -24 -27 -37l-1168 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1088 514l-1088 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1168 -552q27 -13 27 -37zM1420 582q0 -24 -27 -37l-1168 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1088 514l-1088 514 q-24 11 -24 37q0 41 41 41q8 0 14 -3l1168 -552q27 -13 27 -37z" />
+<glyph unicode="&#x2a21;" horiz-adv-x="1024" d="M969 1062q20 -8 20 -45t-28 -37q-7 0 -35 7q-273 69 -432 288v-1554q0 -39 -41 -39t-41 39v1710q0 67 41 67q16 0 41 -62q54 -132 170 -230t258 -133q16 -2 47 -11z" />
+<glyph unicode="&#x2a22;" horiz-adv-x="1592" d="M965 1438q0 -69 -50 -119t-119 -50t-119 50t-50 119t50 118.5t119 49.5t119 -49.5t50 -118.5zM1422 582q0 -41 -37 -41h-548v-546q0 -39 -41 -39t-41 39v546h-546q-39 0 -39 41t39 41h546v548q0 37 41 37t41 -37v-548h548q37 0 37 -41zM873 1361q32 32 32 76.5t-32 76.5 t-77 32t-77 -32t-32 -76.5t32 -76.5t77 -32t77 32z" />
+<glyph unicode="&#x2a23;" horiz-adv-x="1592" d="M1149 1340l-29 -41l-324 201l-322 -201l-29 41l351 266zM1422 582q0 -41 -37 -41h-548v-546q0 -39 -41 -39t-41 39v546h-546q-39 0 -39 41t39 41h546v548q0 37 41 37t41 -37v-548h548q37 0 37 -41z" />
+<glyph unicode="&#x2a24;" horiz-adv-x="1592" d="M1041 1470q-65 -57 -119 -57t-136 49.5t-130 49.5q-80 0 -165 -98l-35 30q74 85 95 105q65 57 119 57t136 -49.5t130 -49.5q79 0 165 99l35 -31q-74 -85 -95 -105zM1422 582q0 -41 -37 -41h-548v-546q0 -39 -41 -39t-41 39v546h-546q-39 0 -39 41t39 41h546v548 q0 37 41 37t41 -37v-548h548q37 0 37 -41z" />
+<glyph unicode="&#x2a25;" horiz-adv-x="1592" d="M1422 582q0 -41 -37 -41h-548v-546q0 -39 -41 -39t-41 39v546h-546q-39 0 -39 41t39 41h546v548q0 37 41 37t41 -37v-548h548q37 0 37 -41zM873 -257q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32z" />
+<glyph unicode="&#x2a26;" horiz-adv-x="1592" d="M1422 582q0 -41 -37 -41h-548v-546q0 -39 -41 -39t-41 39v546h-546q-39 0 -39 41t39 41h546v548q0 37 41 37t41 -37v-548h548q37 0 37 -41zM1041 -385q-65 -57 -119 -57t-136 49.5t-130 49.5q-80 0 -165 -98l-35 30q74 85 95 105q65 57 119 57t136 -49.5t130 -49.5 q79 0 165 99l35 -31q-74 -85 -95 -105z" />
+<glyph unicode="&#x2a27;" horiz-adv-x="1592" d="M1422 582q0 -41 -37 -41h-548v-546q0 -39 -41 -39t-41 39v546h-546q-39 0 -39 41t39 41h546v548q0 37 41 37t41 -37v-548h548q37 0 37 -41zM969 -286v14q0 23 14 38l201 211q107 112 107 211q0 64 -34.5 108t-96.5 44q-89 0 -128 -81q65 0 65 -61t-64 -61t-64 64 q0 80 62 134t149.5 54t155.5 -54.5t68 -146.5q0 -68 -57 -133q-22 -25 -70 -69l-196 -178h180q72 0 79 6t21 89h45l-32 -189h-405z" />
+<glyph unicode="&#x2a28;" horiz-adv-x="1592" d="M1422 582q0 -41 -37 -41h-570q10 -9 22 -33q60 -113 129 -179q33 -32 33 -48q0 -31 -32.5 -31t-129.5 128v-383q0 -39 -41 -39t-41 39v383q-97 -128 -129.5 -128t-32.5 31q0 16 33 48q69 66 129 179q6 12 22 33h-568q-39 0 -39 41t39 41h546v548q0 37 41 37t41 -37v-548 h548q37 0 37 -41z" />
+<glyph unicode="&#x2a29;" horiz-adv-x="1592" d="M1422 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM877 1224q-33 -33 -83 -33t-78.5 32.5t-28.5 76t29 76t85 32.5t91 -58t35 -157q0 -152 -76.5 -274.5t-110.5 -122.5q-20 0 -20 22q0 8 14 23q148 157 148 352q0 30 -5 31z" />
+<glyph unicode="&#x2a2a;" horiz-adv-x="1592" d="M1422 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM875.5 214q33.5 -33 33.5 -79.5t-34 -80t-80 -33.5t-80 33.5t-34 80t33.5 79.5t80.5 33t80.5 -33z" />
+<glyph unicode="&#x2a2b;" horiz-adv-x="1592" d="M370.5 1109.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1380.5 213.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1422 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2a2c;" horiz-adv-x="1592" d="M370.5 213.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1380.5 1109.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1422 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2a2d;" horiz-adv-x="1592" d="M1422 582q0 -41 -37 -41h-548v-546q0 -39 -41 -39t-41 39v546h-546q-39 0 -39 41t39 41h546v548q0 37 41 37t41 -37v-548h548q37 0 37 -41zM834 -100q0 -41 -39 -41q-298 0 -509.5 212.5t-211.5 511t211 510.5t510 212q39 0 39 -41t-39 -41q-265 0 -452 -188t-187 -452.5 t187.5 -453t451.5 -188.5q39 0 39 -41z" />
+<glyph unicode="&#x2a2e;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5q-39 0 -39 41t39 41q264 0 451.5 188.5t187.5 453t-187 452.5t-452 188q-39 0 -39 41t39 41q299 0 510 -212zM1422 582q0 -41 -37 -41h-548v-546q0 -39 -41 -39t-41 39v546h-546q-39 0 -39 41t39 41h546v548 q0 37 41 37t41 -37v-548h548q37 0 37 -41z" />
+<glyph unicode="&#x2a2f;" horiz-adv-x="1592" d="M1322 98q0 -42 -42 -42q-16 0 -27 11l-457 457l-457 -457q-11 -11 -27 -11q-42 0 -42 42q0 16 11 27l457 457l-458 458q-10 10 -10 25q0 43 43 43q15 0 25 -10l458 -458l458 458q10 10 25 10q43 0 43 -43q0 -15 -10 -25l-458 -458l457 -457q11 -11 11 -27z" />
+<glyph unicode="&#x2a30;" horiz-adv-x="1592" d="M873 1396q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM1241 969l-387 -387l386 -386q14 -14 14 -28t-15 -29t-29 -15t-28 14l-386 386l-386 -386q-14 -14 -28 -14t-29 15t-15 29t14 28l386 386l-387 387q-13 13 -13 27t15 29t29 15t27 -13 l387 -387l387 387q13 13 27 13t29 -15t15 -29t-13 -27z" />
+<glyph unicode="&#x2a31;" horiz-adv-x="1592" d="M1241 969l-387 -387l386 -386q14 -14 14 -28t-15 -29t-29 -15t-28 14l-386 386l-386 -386q-14 -14 -28 -14t-29 15t-15 29t14 28l386 386l-387 387q-13 13 -13 27t15 29t29 15t27 -13l387 -387l387 387q13 13 27 13t29 -15t15 -29t-13 -27zM1322 -41q0 -41 -37 -41h-976 q-39 0 -39 41t39 41h976q37 0 37 -41z" />
+<glyph unicode="&#x2a32;" horiz-adv-x="1592" d="M1322 98q0 -42 -42 -42h-968q-42 0 -42 42q0 16 11 27l457 457l-458 458q-10 10 -10 25q0 43 43 43q15 0 25 -10l458 -458l458 458q10 10 25 10q43 0 43 -43q0 -15 -10 -25l-458 -458l457 -457q11 -11 11 -27zM1182 138l-386 386l-386 -386h772z" />
+<glyph unicode="&#x2a33;" horiz-adv-x="1592" d="M1522 98q0 -42 -42 -42q-16 0 -27 11l-457 457l-142 -142l257 -257q11 -11 11 -27q0 -42 -42 -42q-16 0 -27 11l-257 257l-257 -257q-11 -11 -27 -11q-42 0 -42 42q0 16 11 27l257 257l-142 142l-457 -457q-11 -11 -27 -11q-42 0 -42 42q0 16 11 27l457 457l-458 458 q-10 10 -10 25q0 43 43 43q15 0 25 -10l458 -458l142 142l-258 258q-10 10 -10 25q0 43 43 43q15 0 25 -10l258 -258l258 258q10 10 25 10q43 0 43 -43q0 -15 -10 -25l-258 -258l142 -142l458 458q10 10 25 10q43 0 43 -43q0 -15 -10 -25l-458 -458l457 -457q11 -11 11 -27z M938 582l-142 142l-142 -142l142 -142z" />
+<glyph unicode="&#x2a34;" horiz-adv-x="1592" d="M1240 196q13 -13 13 -26q0 -14 -15 -29t-30 -15q-13 0 -26 12l-386 386l-386 -386q-26 -26 -55 3t-3 55l386 386l-386 386q-13 14 -13 27q0 15 15 30t29 15t27 -14l386 -386l386 386q14 14 28 14t29 -15t15 -29t-14 -28l-386 -386zM834 -100q0 -41 -39 -41 q-298 0 -509.5 212.5t-211.5 511t211 510.5t510 212q39 0 39 -41t-39 -41q-265 0 -452 -188t-187 -452.5t187.5 -453t451.5 -188.5q39 0 39 -41z" />
+<glyph unicode="&#x2a35;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5q-39 0 -39 41t39 41q264 0 451.5 188.5t187.5 453t-187 452.5t-452 188q-39 0 -39 41t39 41q299 0 510 -212zM1240 196q13 -13 13 -26q0 -14 -15 -29t-30 -15q-13 0 -26 12l-386 386l-386 -386q-12 -12 -25 -12 q-15 0 -30 15t-15 30q0 13 12 25l386 386l-386 386q-13 14 -13 27q0 15 15 30t29 15t27 -14l386 -386l386 386q14 14 28 14t29 -15t15 -29t-14 -28l-386 -386z" />
+<glyph unicode="&#x2a36;" horiz-adv-x="1592" d="M1149 1340l-29 -41l-324 201l-322 -201l-29 41l351 266zM1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5 t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1240 196q13 -13 13 -26q0 -14 -15 -29t-30 -15q-13 0 -26 12l-386 386l-386 -386q-12 -12 -25 -12q-15 0 -30 15t-15 30q0 13 12 25l386 386l-386 386q-13 14 -13 27q0 15 15 30t29 15t27 -14l386 -386l386 386 q14 14 28 14t29 -15t15 -29t-14 -28l-386 -386z" />
+<glyph unicode="&#x2a37;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5z M1165 951.5q153 -153.5 153 -369t-153 -369.5t-368 -154t-369 154t-154 370t153 369t369 153t369 -153.5zM1106.5 271q129.5 130 129.5 311.5t-129 311t-311 129.5t-311 -129t-129 -311t130 -312t310.5 -130t310 130zM1100 337q12 -12 12 -25q0 -15 -15 -30t-30 -15 q-13 0 -25 12l-245 245l-244 -245q-12 -12 -25 -12q-15 0 -30 15t-15 30q0 13 12 25l244 245l-244 244q-14 14 -14 28t15 29t29 15t28 -14l244 -244l245 244q14 14 28 14t29 -15t15 -29t-14 -28l-245 -244z" />
+<glyph unicode="&#x2a38;" horiz-adv-x="1592" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1421 582 q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM876 1009.5q34 -33.5 34 -80t-33.5 -79.5t-80.5 -33t-80.5 33t-33.5 79.5t34 80t80 33.5t80 -33.5zM876.5 314q33.5 -33 33.5 -79.5t-34 -80t-80 -33.5t-80 33.5t-34 80t33.5 79.5t80.5 33t80.5 -33z" />
+<glyph unicode="&#x2a39;" horiz-adv-x="1592" d="M1515 -76q0 -35 -43 -35h-1352q-43 0 -43 35q0 12 6 24l676 1355q14 28 36.5 28t36.5 -28l677 -1355q6 -12 6 -24zM1406 -29l-610 1222l-610 -1222h1220zM1162 388q0 -41 -37 -41h-288v-288q0 -37 -41 -37t-41 37v288h-285q-39 0 -39 41t39 41h285v285q0 39 41 39t41 -39 v-285h288q37 0 37 -41z" />
+<glyph unicode="&#x2a3a;" horiz-adv-x="1592" d="M1515 -76q0 -35 -43 -35h-1352q-43 0 -43 35q0 12 6 24l676 1355q14 28 36.5 28t36.5 -28l677 -1355q6 -12 6 -24zM1406 -29l-610 1222l-610 -1222h1220zM1162 388q0 -41 -37 -41h-655q-39 0 -39 41t39 41h655q37 0 37 -41z" />
+<glyph unicode="&#x2a3b;" horiz-adv-x="1592" d="M1515 -76q0 -35 -43 -35h-1352q-43 0 -43 35q0 12 6 24l676 1355q14 28 36.5 28t36.5 -28l677 -1355q6 -12 6 -24zM1406 -29l-610 1222l-610 -1222h1220zM1057 184q12 -12 12 -25q0 -15 -15 -30t-30 -15q-13 0 -25 12l-203 204l-202 -202q-13 -14 -27 -14t-29 15t-15 30 q0 13 13 27l202 201l-202 202q-13 13 -13 27q0 15 15 30t29 15t27 -14l202 -202l203 204q12 12 25 12q15 0 30 -15t15 -30q0 -13 -12 -25l-203 -204z" />
+<glyph unicode="&#x2a3c;" horiz-adv-x="1592" d="M1372 580q0 -39 -41 -39h-1072q-39 0 -39 41t39 41h1031v433q0 37 41 37t41 -37v-476z" />
+<glyph unicode="&#x2a3d;" horiz-adv-x="1592" d="M1372 582q0 -41 -39 -41h-1072q-41 0 -41 39v476q0 37 41 37t41 -37v-433h1031q39 0 39 -41z" />
+<glyph unicode="&#x2a3e;" horiz-adv-x="711" d="M542 743q0 -77 -55.5 -131.5t-131.5 -54.5t-131 55t-55 131t55 131t131 55t131.5 -54.5t55.5 -131.5zM508 211q37 -57 37 -165.5t-71 -248t-175 -198.5q-12 -6 -23 -6q-41 0 -41 43v6q4 15 19 27q149 119 191 273q-42 -24 -90 -24q-76 0 -131 55t-55 131t55 131t131 55 q103 0 153 -79zM460 743q0 42 -31 73t-73.5 31t-73.5 -31t-31 -73t31 -73t73.5 -31t73.5 31t31 73zM460 104q0 42 -31 73t-73.5 31t-73.5 -31t-31 -73t31 -73t73.5 -31t73.5 31t31 73z" />
+<glyph unicode="&#x2a3f;" horiz-adv-x="1876" d="M1745 -150q31 0 31 -46t-31 -46h-1614q-30 0 -30 46v17q0 29 30 29q158 0 169.5 15t11.5 44v1354q0 32 -15 38q-30 13 -166 13q-31 0 -31 46t33 46h555q36 0 34 -43l-1 -20q-1 -29 -31 -29q-159 0 -169.5 -15t-10.5 -41v-1408h856v1414q0 31 -18.5 39t-68.5 9t-87 2.5 t-37 28.5v34q0 29 33 29h555q33 0 33 -43v-10q-1 -7 -1 -10q0 -29 -30 -29q-159 0 -172 -18q-9 -12 -9 -42v-1353q0 -32 15 -38q30 -13 166 -13z" />
+<glyph unicode="&#x2a40;" horiz-adv-x="1364" d="M1249 -8q0 -37 -41 -37t-41 37v792q0 171 -163 273q-140 86 -322.5 86t-321.5 -87q-163 -101 -163 -272v-792q0 -37 -41 -37t-41 37v799q0 202 189 326q164 108 378 108t379 -107q188 -124 188 -327v-799zM759 659q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5 t32 76.5t77 32t77 -32z" />
+<glyph unicode="&#x2a41;" horiz-adv-x="1364" d="M1249 389q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v799q0 37 41 37t41 -37v-793q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v793q0 37 41 37t41 -37v-799zM1108 582q0 -41 -37 -41h-776q-39 0 -39 41t39 41h776q37 0 37 -41z " />
+<glyph unicode="&#x2a42;" horiz-adv-x="1364" d="M1249 389q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v799q0 37 41 37t41 -37v-793q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v793q0 37 41 37t41 -37v-799zM1208 1482q0 -41 -37 -41h-976q-39 0 -39 41t39 41h976q37 0 37 -41 z" />
+<glyph unicode="&#x2a43;" horiz-adv-x="1364" d="M1249 -8q0 -37 -41 -37t-41 37v792q0 171 -163 273q-140 86 -322.5 86t-321.5 -87q-163 -101 -163 -272v-792q0 -37 -41 -37t-41 37v799q0 202 189 326q164 108 378 108t379 -107q188 -124 188 -327v-799zM1208 1482q0 -41 -37 -41h-976q-39 0 -39 41t39 41h976 q37 0 37 -41z" />
+<glyph unicode="&#x2a44;" horiz-adv-x="1364" d="M1249 -8q0 -37 -41 -37t-41 37v792q0 171 -163 273q-140 86 -322.5 86t-321.5 -87q-163 -101 -163 -272v-792q0 -37 -41 -37t-41 37v799q0 202 189 326q164 108 378 108t379 -107q188 -124 188 -327v-799zM1006 16q0 -41 -41 -41q-26 0 -37 25l-246 553l-246 -553 q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l283 638q11 25 39 25t39 -25l283 -638q2 -5 2 -16z" />
+<glyph unicode="&#x2a45;" horiz-adv-x="1364" d="M1249 389q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v799q0 37 41 37t41 -37v-793q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v793q0 37 41 37t41 -37v-799zM1006 1164q0 -11 -2 -16l-283 -638q-11 -25 -39 -25t-39 25 l-283 638q-2 5 -2 16q0 41 41 41q26 0 37 -25l246 -553l246 553q11 25 37 25q41 0 41 -41z" />
+<glyph unicode="&#x2a46;" horiz-adv-x="1364" d="M1249 1216q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v299q0 37 41 37t41 -37v-293q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v293q0 37 41 37t41 -37v-299zM1249 -351q0 -37 -41 -37t-41 37v292q0 171 -163 273 q-140 86 -322.5 86t-321.5 -87q-163 -101 -163 -272v-292q0 -37 -41 -37t-41 37v299q0 202 189 326q164 108 378 108t379 -107q188 -124 188 -327v-299z" />
+<glyph unicode="&#x2a47;" horiz-adv-x="1364" d="M1249 819q0 -37 -41 -37t-41 37v293q0 171 -163 272q-140 86 -321.5 86t-321.5 -87q-164 -102 -164 -271v-293q0 -37 -41 -37t-41 37v299q0 203 188 327q165 107 379 107t379 -107q188 -124 188 -327v-299zM1249 46q0 -203 -188 -327q-165 -107 -379 -107t-378 108 q-189 124 -189 326v299q0 37 41 37t41 -37v-292q0 -171 163 -272q139 -87 321.5 -87t322.5 86q163 102 163 273v292q0 37 41 37t41 -37v-299z" />
+<glyph unicode="&#x2a48;" horiz-adv-x="1364" d="M1249 1216q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v299q0 37 41 37t41 -37v-293q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v293q0 37 41 37t41 -37v-299zM1249 -351q0 -37 -41 -37t-41 37v292q0 171 -163 273 q-140 86 -322.5 86t-321.5 -87q-163 -101 -163 -272v-292q0 -37 -41 -37t-41 37v299q0 202 189 326q164 108 378 108t379 -107q188 -124 188 -327v-299zM1207 582q0 -41 -37 -41h-974q-39 0 -39 41t39 41h974q37 0 37 -41z" />
+<glyph unicode="&#x2a49;" horiz-adv-x="1364" d="M1249 819q0 -37 -41 -37t-41 37v293q0 171 -163 272q-140 86 -321.5 86t-321.5 -87q-164 -102 -164 -271v-293q0 -37 -41 -37t-41 37v299q0 203 188 327q165 107 379 107t379 -107q188 -124 188 -327v-299zM1249 46q0 -203 -188 -327q-165 -107 -379 -107t-378 108 q-189 124 -189 326v299q0 37 41 37t41 -37v-292q0 -171 163 -272q139 -87 321.5 -87t322.5 86q163 102 163 273v292q0 37 41 37t41 -37v-299zM1207 582q0 -41 -37 -41h-974q-39 0 -39 41t39 41h974q37 0 37 -41z" />
+<glyph unicode="&#x2a4a;" horiz-adv-x="2416" d="M2301 389q0 -203 -188 -327q-165 -107 -379 -107q-160 0 -310 69t-216 195q-66 -126 -216 -195t-310 -69q-214 0 -379 107q-188 124 -188 327v799q0 37 41 37t41 -37v-793q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v793q0 37 41 37t41 -37v-793 q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272v793q0 37 41 37t41 -37v-799z" />
+<glyph unicode="&#x2a4b;" horiz-adv-x="2416" d="M2301 -8q0 -37 -41 -37t-41 37v792q0 171 -163 273q-140 86 -322.5 86t-321.5 -87q-163 -101 -163 -272v-792q0 -37 -41 -37t-41 37v792q0 171 -163 273q-140 86 -322.5 86t-321.5 -87q-163 -101 -163 -272v-792q0 -37 -41 -37t-41 37v799q0 202 189 326q164 108 378 108 q161 0 310.5 -69t215.5 -195q67 125 216.5 194.5t309.5 69.5q214 0 379 -107q188 -124 188 -327v-799z" />
+<glyph unicode="&#x2a4c;" horiz-adv-x="1364" d="M1308 1184q0 -41 -37 -41h-22v-754q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v754h-20q-39 0 -39 41t39 41h1176q37 0 37 -41zM1167 395v748h-970v-748q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272z" />
+<glyph unicode="&#x2a4d;" horiz-adv-x="1364" d="M1308 -4q0 -41 -37 -41h-1176q-39 0 -39 41t39 41h20v754q0 202 189 326q164 108 378 108t379 -107q188 -124 188 -327v-754h22q37 0 37 -41zM1167 37v747q0 171 -163 273q-140 86 -322.5 86t-321.5 -87q-163 -101 -163 -272v-747h970z" />
+<glyph unicode="&#x2a4e;" horiz-adv-x="1364" d="M1239 39q0 -39 -37 -39h-1038q-39 0 -39 39v1149q0 37 41 37t41 -37v-1106h950v1106q0 37 41 37t41 -37v-1149zM1039 239q0 -39 -37 -39h-638q-39 0 -39 39v949q0 37 41 37t41 -37v-906h550v906q0 37 41 37t41 -37v-949z" />
+<glyph unicode="&#x2a4f;" horiz-adv-x="1364" d="M1239 39q0 -39 -41 -39t-41 39v1104h-950v-1104q0 -39 -41 -39t-41 39v1149q0 37 39 37h1038q37 0 37 -37v-1149zM1039 39q0 -39 -41 -39t-41 39v904h-550v-904q0 -39 -41 -39t-41 39v949q0 37 39 37h638q37 0 37 -37v-949z" />
+<glyph unicode="&#x2a50;" horiz-adv-x="1364" d="M1308 1184q0 -41 -37 -41h-22v-754q0 -203 -188 -327q-165 -107 -379 -107t-379 107q-188 124 -188 327v754h-20q-39 0 -39 41t39 41h1176q37 0 37 -41zM1167 395v748h-970v-748q0 -169 164 -271q140 -87 321.5 -87t321.5 86q163 101 163 272zM1061 394q0 -62 -60 -62 q-15 0 -29 10l-262 191l31 -338q0 -53 -59 -53q-23 0 -42.5 17t-17.5 40l31 334l-262 -191q-14 -10 -29 -10q-59 0 -59 62q0 36 28 49l295 139l-295 139q-28 13 -28 49q0 62 59 62q15 0 29 -10l262 -191l-31 340q0 53 60 53q25 0 43 -17t16 -42l-31 -334l262 191 q14 10 29 10q60 0 60 -62q0 -35 -29 -49l-295 -139l295 -139q29 -14 29 -49z" />
+<glyph unicode="&#x2a51;" horiz-adv-x="1364" d="M1249 -4q0 -41 -41 -41q-26 0 -37 25l-489 1103l-489 -1103q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l526 1188q11 25 39 25t39 -25l526 -1188q2 -5 2 -16zM761.5 1572.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x2a52;" horiz-adv-x="1364" d="M1249 1183q0 -11 -2 -16l-526 -1188q-11 -25 -39 -25t-39 25l-526 1188q-2 5 -2 16q0 41 41 41q26 0 37 -25l489 -1103l489 1103q11 25 37 25q41 0 41 -41zM762 -234q33 -33 33 -79.5t-33.5 -80t-80 -33.5t-79.5 33t-33 80t33 80t80 33t80 -33z" />
+<glyph unicode="&#x2a53;" horiz-adv-x="1364" d="M1249 -4q0 -41 -41 -41q-26 0 -37 25l-489 1103l-489 -1103q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l526 1188q11 25 39 25t39 -25l526 -1188q2 -5 2 -16zM1006 -4q0 -41 -41 -41q-26 0 -37 25l-246 553l-246 -553q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l283 638 q11 25 39 25t39 -25l283 -638q2 -5 2 -16z" />
+<glyph unicode="&#x2a54;" horiz-adv-x="1364" d="M1249 1183q0 -11 -2 -16l-526 -1188q-11 -25 -39 -25t-39 25l-526 1188q-2 5 -2 16q0 41 41 41q26 0 37 -25l489 -1103l489 1103q11 25 37 25q41 0 41 -41zM1006 1183q0 -11 -2 -16l-283 -638q-11 -25 -39 -25t-39 25l-283 638q-2 5 -2 16q0 41 41 41q26 0 37 -25 l246 -553l246 553q11 25 37 25q41 0 41 -41z" />
+<glyph unicode="&#x2a55;" horiz-adv-x="1664" d="M1549 -4q0 -41 -41 -41q-26 0 -37 25l-489 1103l-105 -236l370 -835q2 -5 2 -16q0 -41 -41 -41q-26 0 -37 25l-339 765l-339 -765q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l370 835l-105 236l-489 -1103q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l526 1188q11 25 39 25 t39 -25l111 -251l111 251q11 25 39 25t39 -25l526 -1188q2 -5 2 -16z" />
+<glyph unicode="&#x2a56;" horiz-adv-x="1664" d="M1549 1183q0 -11 -2 -16l-526 -1188q-11 -25 -39 -25t-39 25l-111 251l-111 -251q-11 -25 -39 -25t-39 25l-526 1188q-2 5 -2 16q0 41 41 41q26 0 37 -25l489 -1103l105 236l-370 835q-2 5 -2 16q0 41 41 41q26 0 37 -25l339 -765l339 765q11 25 37 25q41 0 41 -41 q0 -11 -2 -16l-370 -835l105 -236l489 1103q11 25 37 25q41 0 41 -41z" />
+<glyph unicode="&#x2a57;" horiz-adv-x="1691" d="M1581 1171q0 -21 -12 -31l-1339 -1165q-11 -10 -29 -10q-41 0 -41 39v1171q0 37 41 37t41 -37v-1079l1272 1106q12 10 26 10q41 0 41 -41z" />
+<glyph unicode="&#x2a58;" horiz-adv-x="1691" d="M1531 2q0 -37 -41 -37t-41 37v1079l-1272 -1106q-12 -10 -26 -10q-41 0 -41 41q0 21 12 31l1339 1165q11 10 29 10q41 0 41 -39v-1171z" />
+<glyph unicode="&#x2a59;" horiz-adv-x="1364" d="M1249 -212q0 -41 -41 -41q-26 0 -37 25l-314 708l-136 -308q-11 -25 -39 -25t-39 25l-136 308l-314 -708q-11 -25 -37 -25q-41 0 -41 41q0 12 2 16l344 778l-344 778q-2 4 -2 16q0 41 41 41q26 0 37 -25l314 -708l136 309q11 25 39 25t39 -25l136 -309l314 708 q11 25 37 25q41 0 41 -41q0 -12 -2 -16l-344 -778l344 -778q2 -4 2 -16zM812 582l-130 294l-130 -294l130 -293z" />
+<glyph unicode="&#x2a5a;" horiz-adv-x="1414" d="M1299 -3q0 -41 -41 -41q-26 0 -37 24l-473 1004v-989q0 -39 -41 -39t-41 39v989l-473 -1004q-11 -24 -37 -24q-41 0 -41 41q0 8 3 15l552 1169q13 27 37 27t37 -27l552 -1169q3 -7 3 -15z" />
+<glyph unicode="&#x2a5b;" horiz-adv-x="1414" d="M1299 1167q0 -8 -3 -14l-552 -1170q-13 -27 -37 -27t-37 27l-552 1170q-3 6 -3 14q0 41 41 41q26 0 37 -24l473 -1004v989q0 39 41 39t41 -39v-989l473 1004q11 24 37 24q41 0 41 -41z" />
+<glyph unicode="&#x2a5c;" horiz-adv-x="1364" d="M1249 -4q0 -41 -41 -41q-26 0 -37 25l-249 561h-480l-249 -561q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l234 529h-155q-39 0 -39 41t39 41h192l255 577q11 25 39 25t39 -25l255 -577h194q37 0 37 -41t-37 -41h-157l234 -529q2 -5 2 -16zM886 623l-204 460l-204 -460h408 z" />
+<glyph unicode="&#x2a5d;" horiz-adv-x="1364" d="M1249 1183q0 -11 -2 -16l-241 -544h164q37 0 37 -41t-37 -41h-200l-249 -562q-11 -25 -39 -25t-39 25l-249 562h-198q-39 0 -39 41t39 41h162l-241 544q-2 5 -2 16q0 41 41 41q26 0 37 -25l255 -576h468l255 576q11 25 37 25q41 0 41 -41zM879 541h-394l197 -445z" />
+<glyph unicode="&#x2a5e;" horiz-adv-x="1364" d="M1249 -4q0 -41 -41 -41q-26 0 -37 25l-489 1103l-489 -1103q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l526 1188q11 25 39 25t39 -25l526 -1188q2 -5 2 -16zM1249 1565q0 -41 -37 -41h-1058q-39 0 -39 41t39 41h1058q37 0 37 -41zM1249 1325q0 -41 -37 -41h-1058 q-39 0 -39 41t39 41h1058q37 0 37 -41z" />
+<glyph unicode="&#x2a5f;" horiz-adv-x="1364" d="M1249 -4q0 -41 -41 -41q-26 0 -37 25l-489 1103l-489 -1103q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l526 1188q11 25 39 25t39 -25l526 -1188q2 -5 2 -16zM1249 -281q0 -41 -37 -41h-1058q-39 0 -39 41t39 41h1058q37 0 37 -41z" />
+<glyph unicode="&#x2a60;" horiz-adv-x="1364" d="M1249 -4q0 -41 -41 -41q-26 0 -37 25l-489 1103l-489 -1103q-11 -25 -37 -25q-41 0 -41 41q0 11 2 16l526 1188q11 25 39 25t39 -25l526 -1188q2 -5 2 -16zM1249 -161q0 -41 -37 -41h-1058q-39 0 -39 41t39 41h1058q37 0 37 -41zM1249 -401q0 -41 -37 -41h-1058 q-39 0 -39 41t39 41h1058q37 0 37 -41z" />
+<glyph unicode="&#x2a61;" horiz-adv-x="1164" d="M906 633q0 -11 -2 -16l-283 -638q-11 -25 -39 -25t-39 25l-283 638q-2 5 -2 16q0 41 41 41q26 0 37 -25l246 -553l246 553q11 25 37 25q41 0 41 -41zM1049 -281q0 -41 -37 -41h-858q-39 0 -39 41t39 41h858q37 0 37 -41z" />
+<glyph unicode="&#x2a62;" horiz-adv-x="1364" d="M1249 1183q0 -11 -2 -16l-526 -1188q-11 -25 -39 -25t-39 25l-526 1188q-2 5 -2 16q0 41 41 41q26 0 37 -25l489 -1103l489 1103q11 25 37 25q41 0 41 -41zM1249 1565q0 -41 -37 -41h-1058q-39 0 -39 41t39 41h1058q37 0 37 -41zM1249 1325q0 -41 -37 -41h-1058 q-39 0 -39 41t39 41h1058q37 0 37 -41z" />
+<glyph unicode="&#x2a63;" horiz-adv-x="1364" d="M1249 1183q0 -11 -2 -16l-526 -1188q-11 -25 -39 -25t-39 25l-526 1188q-2 5 -2 16q0 41 41 41q26 0 37 -25l489 -1103l489 1103q11 25 37 25q41 0 41 -41zM1249 -161q0 -41 -37 -41h-1058q-39 0 -39 41t39 41h1058q37 0 37 -41zM1249 -401q0 -41 -37 -41h-1058 q-39 0 -39 41t39 41h1058q37 0 37 -41z" />
+<glyph unicode="&#x2a64;" horiz-adv-x="1712" d="M1552 -94q0 -43 -35 -43q-12 0 -24 6l-1355 676q-28 14 -28 36.5t28 36.5l1355 677q12 6 24 6q35 0 35 -43v-1352zM1470 623v569l-1140 -569h1140zM1470 541h-1140l1140 -569v569z" />
+<glyph unicode="&#x2a65;" horiz-adv-x="1712" d="M1574 618q28 -14 28 -36.5t-28 -36.5l-1355 -676q-12 -6 -24 -6q-35 0 -35 43v1352q0 43 35 43q12 0 24 -6zM242 623h1140l-1140 569v-569zM242 541v-569l1140 569h-1140z" />
+<glyph unicode="&#x2a66;" horiz-adv-x="1592" d="M875.5 11.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1422 382q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 782q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2a67;" horiz-adv-x="1592" d="M1422 982q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 182q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM876 1512q33 -33 33 -79.5t-33.5 -80t-80 -33.5 t-79.5 33t-33 80t33 80t80 33t80 -33z" />
+<glyph unicode="&#x2a68;" horiz-adv-x="1592" d="M1422 182q0 -41 -37 -41h-348v-146q0 -39 -41 -39t-41 39v146h-318v-146q0 -39 -41 -39t-41 39v146h-346q-39 0 -39 41t39 41h346v318h-346q-39 0 -39 41t39 41h346v318h-346q-39 0 -39 41t39 41h346v148q0 37 41 37t41 -37v-148h318v148q0 37 41 37t41 -37v-148h348 q37 0 37 -41t-37 -41h-348v-318h348q37 0 37 -41t-37 -41h-348v-318h348q37 0 37 -41zM955 623v318h-318v-318h318zM955 223v318h-318v-318h318z" />
+<glyph unicode="&#x2a69;" horiz-adv-x="1592" d="M1422 182q0 -41 -37 -41h-148v-146q0 -39 -41 -39t-41 39v146h-318v-146q0 -39 -41 -39t-41 39v146h-318v-146q0 -39 -41 -39t-41 39v146h-146q-39 0 -39 41t39 41h146v318h-146q-39 0 -39 41t39 41h146v318h-146q-39 0 -39 41t39 41h146v148q0 37 41 37t41 -37v-148h318 v148q0 37 41 37t41 -37v-148h318v148q0 37 41 37t41 -37v-148h148q37 0 37 -41t-37 -41h-148v-318h148q37 0 37 -41t-37 -41h-148v-318h148q37 0 37 -41zM1155 623v318h-318v-318h318zM755 623v318h-318v-318h318zM1155 223v318h-318v-318h318zM755 223v318h-318v-318h318z " />
+<glyph unicode="&#x2a6a;" horiz-adv-x="1592" d="M1477 746q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM876 1204q33 -33 33 -79.5t-33.5 -80t-80 -33.5t-79.5 33t-33 80t33 80t80 33t80 -33z" />
+<glyph unicode="&#x2a6b;" horiz-adv-x="1592" d="M1477 746q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM475.5 311.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1275.5 1011.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x2a6c;" horiz-adv-x="1592" d="M1477 1115q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1477 95q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98 t30 62q29 0 29 -63zM1477 441q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2a6d;" horiz-adv-x="1592" d="M1477 441q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 41q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 1115q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142 q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62q29 0 29 -63zM876 1573q33 -33 33 -79.5t-33.5 -80t-80 -33.5t-79.5 33t-33 80t33 80t80 33t80 -33z" />
+<glyph unicode="&#x2a6e;" horiz-adv-x="1591" d="M837 1320q230 44 236 44t6 -10.5t-7 -13.5l-209 -99l113 -207q0 -13 -13 -13q-5 0 -167 172q-162 -172 -168 -172q-13 0 -13 13l113 207l-206 98q-10 5 -10 15t6 10t236 -44l29 230q1 10 12.5 10t12.5 -10zM1477 782q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286 q37 0 37 -41zM1477 382q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2a6f;" horiz-adv-x="1592" d="M1477 495q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1477 995q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98 t30 62q29 0 29 -63zM1149 1340l-29 -41l-324 201l-322 -201l-29 41l351 266z" />
+<glyph unicode="&#x2a70;" horiz-adv-x="1592" d="M1477 856q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1477 182q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 -218q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 1356q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147 q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62q29 0 29 -63z" />
+<glyph unicode="&#x2a71;" horiz-adv-x="1592" d="M1422 1474q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 1074q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 274q0 -41 -37 -41h-548v-546q0 -39 -41 -39t-41 39v546h-546q-39 0 -39 41t39 41h546v548q0 37 41 37t41 -37v-548h548 q37 0 37 -41z" />
+<glyph unicode="&#x2a72;" horiz-adv-x="1592" d="M1422 89q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 -311q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 889q0 -41 -37 -41h-548v-548q0 -37 -41 -37t-41 37v548h-546q-39 0 -39 41t39 41h546v546q0 39 41 39t41 -39v-546h548 q37 0 37 -41z" />
+<glyph unicode="&#x2a73;" horiz-adv-x="1591" d="M1477 391q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1477 1137q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 737q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41z" />
+<glyph unicode="&#x2a74;" d="M687.5 861.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM307.5 861.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM687.5 461.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80 t79.5 33t80 -33.5zM307.5 461.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1925 782q0 -41 -37 -41h-974q-39 0 -39 41t39 41h974q37 0 37 -41zM1925 382q0 -41 -37 -41h-974q-39 0 -39 41t39 41h974q37 0 37 -41z" />
+<glyph unicode="&#x2a75;" d="M1900 782q0 -41 -37 -41h-678q-39 0 -39 41t39 41h678q37 0 37 -41zM1900 382q0 -41 -37 -41h-678q-39 0 -39 41t39 41h678q37 0 37 -41zM902 782q0 -41 -37 -41h-678q-39 0 -39 41t39 41h678q37 0 37 -41zM902 382q0 -41 -37 -41h-678q-39 0 -39 41t39 41h678 q37 0 37 -41z" />
+<glyph unicode="&#x2a76;" horiz-adv-x="3046" d="M2898 782q0 -41 -37 -41h-678q-39 0 -39 41t39 41h678q37 0 37 -41zM2898 382q0 -41 -37 -41h-678q-39 0 -39 41t39 41h678q37 0 37 -41zM1900 782q0 -41 -37 -41h-678q-39 0 -39 41t39 41h678q37 0 37 -41zM1900 382q0 -41 -37 -41h-678q-39 0 -39 41t39 41h678 q37 0 37 -41zM902 782q0 -41 -37 -41h-678q-39 0 -39 41t39 41h678q37 0 37 -41zM902 382q0 -41 -37 -41h-678q-39 0 -39 41t39 41h678q37 0 37 -41z" />
+<glyph unicode="&#x2a77;" horiz-adv-x="1592" d="M1422 782q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 382q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1175.5 11.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM575.5 11.5q33.5 -33.5 33.5 -80 t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1176 1312q33 -33 33 -79.5t-33.5 -80t-80 -33.5t-79.5 33t-33 80t33 80t80 33t80 -33zM576 1312q33 -33 33 -79.5t-33.5 -80t-80 -33.5t-79.5 33t-33 80t33 80t80 33t80 -33z" />
+<glyph unicode="&#x2a78;" horiz-adv-x="1592" d="M1422 982q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 182q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1389 1512q33 -33 33 -79.5t-33.5 -80t-80 -33.5 t-79.5 33t-33 80t33 80t80 33t80 -33zM1047 1512q33 -33 33 -79.5t-33.5 -80t-80 -33.5t-79.5 33t-33 80t33 80t80 33t80 -33zM705 1512q33 -33 33 -79.5t-33.5 -80t-80 -33.5t-79.5 33t-33 80t33 80t80 33t80 -33zM363 1512q33 -33 33 -79.5t-33.5 -80t-80 -33.5t-79.5 33 t-33 80t33 80t80 33t80 -33z" />
+<glyph unicode="&#x2a79;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1354 741q66 -67 66 -158t-67 -157t-157.5 -66t-157 65.5t-66.5 156.5t66.5 158.5t158 67.5t157.5 -67zM1299 480.5 q44 43.5 44 102.5t-44 103.5t-103 44.5t-103 -44.5t-44 -103.5t44 -102.5t103 -43.5t103 43.5z" />
+<glyph unicode="&#x2a7a;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM619 582q0 -91 -66.5 -156.5t-157 -65.5t-157.5 66t-67 157t66 158t157.5 67t158 -67.5t66.5 -158.5z M498 480.5q44 43.5 44 102.5t-44 103.5t-103 44.5t-103 -44.5t-44 -103.5t44 -102.5t103 -43.5t103 43.5z" />
+<glyph unicode="&#x2a7b;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM267 1384q-55 0 -55 73t55 111t129 38t128.5 -41t54.5 -115t-65 -151q-88 -104 -103 -135.5t-18 -91.5h-21 q3 63 13.5 97.5t56 124.5t45.5 146t-31 97t-86 41q-93 0 -93 -65q0 -17 15 -45.5t15 -41.5q0 -42 -40 -42zM386 1010q56 0 56 -55.5t-56 -55.5t-56 55.5t56 55.5z" />
+<glyph unicode="&#x2a7c;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1067 1384q-55 0 -55 73t55 111t129 38t128.5 -41t54.5 -115t-65 -151q-88 -104 -103 -135.5t-18 -91.5h-21 q3 63 13.5 97.5t56 124.5t45.5 146t-31 97t-86 41q-93 0 -93 -65q0 -17 15 -45.5t15 -41.5q0 -42 -40 -42zM1186 1010q56 0 56 -55.5t-56 -55.5t-56 55.5t56 55.5z" />
+<glyph unicode="&#x2a7d;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-10 0 -14 2l-1169 553q-27 13 -27 37.5t20 33.5l1176 555q4 5 14 5q41 0 41 -41q0 -26 -18 -35l-1096 -518l1090 -514q24 -11 24 -37zM1421 -367q0 -41 -41 -41q-8 0 -14 3l-1176 555q-20 9 -20 34q0 41 41 41q12 0 16 -2l1176 -555q18 -8 18 -35 z" />
+<glyph unicode="&#x2a7e;" horiz-adv-x="1591" d="M1401 616q20 -9 20 -33.5t-27 -37.5l-1169 -553q-4 -2 -14 -2q-41 0 -41 41q0 26 24 37l1090 514l-1096 518q-18 9 -18 35q0 41 41 41q10 0 14 -5zM1421 184q0 -25 -20 -34l-1176 -555q-6 -3 -14 -3q-41 0 -41 41q0 27 18 35l1176 555q4 2 16 2q41 0 41 -41z" />
+<glyph unicode="&#x2a7f;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-10 0 -14 2l-1169 553q-27 13 -27 37.5t20 33.5l1176 555q4 5 14 5q41 0 41 -41q0 -26 -18 -35l-1096 -518l1090 -514q24 -11 24 -37zM1421 -367q0 -41 -41 -41q-8 0 -14 3l-1176 555q-20 9 -20 34q0 41 41 41q12 0 16 -2l1176 -555q18 -8 18 -35 zM1335.5 661.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x2a80;" horiz-adv-x="1591" d="M1401 616q20 -9 20 -33.5t-27 -37.5l-1169 -553q-4 -2 -14 -2q-41 0 -41 41q0 26 24 37l1090 514l-1096 518q-18 9 -18 35q0 41 41 41q10 0 14 -5zM1421 184q0 -25 -20 -34l-1176 -555q-6 -3 -14 -3q-41 0 -41 41q0 27 18 35l1176 555q4 2 16 2q41 0 41 -41zM414.5 661.5 q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x2a81;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-10 0 -14 2l-1169 553q-27 13 -27 37.5t20 33.5l1176 555q4 5 14 5q41 0 41 -41q0 -26 -18 -35l-1096 -518l1090 -514q24 -11 24 -37zM1421 -367q0 -41 -41 -41q-8 0 -14 3l-1176 555q-20 9 -20 34q0 41 41 41q12 0 16 -2l1176 -555q18 -8 18 -35 zM362.5 1161.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x2a82;" horiz-adv-x="1591" d="M1401 616q20 -9 20 -33.5t-27 -37.5l-1169 -553q-4 -2 -14 -2q-41 0 -41 41q0 26 24 37l1090 514l-1096 518q-18 9 -18 35q0 41 41 41q10 0 14 -5zM1421 184q0 -25 -20 -34l-1176 -555q-6 -3 -14 -3q-41 0 -41 41q0 27 18 35l1176 555q4 2 16 2q41 0 41 -41z M1387.5 1161.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x2a83;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-10 0 -14 2l-1169 553q-27 13 -27 37.5t20 33.5l1176 555q4 5 14 5q41 0 41 -41q0 -26 -18 -35l-1096 -518l1090 -514q24 -11 24 -37zM1421 -367q0 -41 -41 -41q-8 0 -14 3l-1176 555q-20 9 -20 34q0 41 41 41q12 0 16 -2l1176 -555q18 -8 18 -35 zM1362.5 1561.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x2a84;" horiz-adv-x="1591" d="M1401 616q20 -9 20 -33.5t-27 -37.5l-1169 -553q-4 -2 -14 -2q-41 0 -41 41q0 26 24 37l1090 514l-1096 518q-18 9 -18 35q0 41 41 41q10 0 14 -5zM1421 184q0 -25 -20 -34l-1176 -555q-6 -3 -14 -3q-41 0 -41 41q0 27 18 35l1176 555q4 2 16 2q41 0 41 -41z M387.5 1561.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5z" />
+<glyph unicode="&#x2a85;" horiz-adv-x="1591" d="M1421 463q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1477 310q0 -158 -103 -250t-236.5 -92t-346 142t-334.5 142t-202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59 t-29.5 59q0 156 104 248t237.5 92t345.5 -141.5t334.5 -141.5t203 72t80.5 154q0 57 28.5 57t28.5 -57zM1477 -100q0 -158 -103 -250t-236.5 -92t-346 142t-334.5 142t-202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t237.5 92t345.5 -141.5 t334.5 -141.5t203 72t80.5 154q0 57 28.5 57t28.5 -57z" />
+<glyph unicode="&#x2a86;" horiz-adv-x="1591" d="M1421 1014q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1477 310q0 -158 -103 -250t-236.5 -92t-346 142t-334.5 142t-202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59 t-29.5 59q0 156 104 248t237.5 92t345.5 -141.5t334.5 -141.5t203 72t80.5 154q0 57 28.5 57t28.5 -57zM1477 -100q0 -158 -103 -250t-236.5 -92t-346 142t-334.5 142t-202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t237.5 92t345.5 -141.5 t334.5 -141.5t203 72t80.5 154q0 57 28.5 57t28.5 -57z" />
+<glyph unicode="&#x2a87;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1421 -259q0 -41 -37 -41h-574l-177 -133q-12 -9 -25 -9q-42 0 -42 43q0 19 17 32l90 67h-464q-39 0 -39 41t39 41 h573l176 133q12 8 25 8q42 0 42 -42q0 -19 -17 -32l-89 -67h465q37 0 37 -41z" />
+<glyph unicode="&#x2a88;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 -259q0 -41 -37 -41h-574l-177 -133q-12 -9 -25 -9q-42 0 -42 43q0 19 17 32l90 67h-464q-39 0 -39 41 t39 41h573l176 133q12 8 25 8q42 0 42 -42q0 -19 -17 -32l-89 -67h465q37 0 37 -41z" />
+<glyph unicode="&#x2a89;" horiz-adv-x="1591" d="M1421 463q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1477 -100q0 -158 -103 -250t-226 -92t-255 77l-221 141l-199 -205q-12 -13 -29 -13q-42 0 -42 42q0 16 13 28 l180 186q-71 28 -138 28q-122 0 -202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t238 92q102 0 217 -62l173 179q-180 115 -188 119q-108 59 -216 59t-188.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t227 92t255 -77l220 -140 l198 203q12 13 29 13q42 0 42 -42q0 -15 -13 -28l-178 -184q71 -28 138 -28q122 0 202.5 72t80.5 154q0 57 28.5 57t28.5 -57q0 -158 -103 -250t-237 -92q-102 0 -218 62l-173 -178q179 -114 188 -119q108 -59 216.5 -59t189 72t80.5 154q0 57 28.5 57t28.5 -57z" />
+<glyph unicode="&#x2a8a;" horiz-adv-x="1591" d="M1421 1014q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1477 -100q0 -158 -103 -250t-226 -92t-255 77l-221 141l-199 -205q-12 -13 -29 -13q-42 0 -42 42 q0 16 13 28l180 186q-71 28 -138 28q-122 0 -202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t238 92q102 0 217 -62l173 179q-180 115 -188 119q-108 59 -216 59t-188.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t227 92t255 -77 l220 -140l198 203q12 13 29 13q42 0 42 -42q0 -15 -13 -28l-178 -184q71 -28 138 -28q122 0 202.5 72t80.5 154q0 57 28.5 57t28.5 -57q0 -158 -103 -250t-237 -92q-102 0 -218 62l-173 -178q179 -114 188 -119q108 -59 216.5 -59t189 72t80.5 154q0 57 28.5 57t28.5 -57z " />
+<glyph unicode="&#x2a8b;" horiz-adv-x="1591" d="M1421 732q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 432q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 900q0 -45 -39 -45q-4 0 -15 3l-1170 334q-27 8 -27 39t27 39l1170 334q7 2 13 2q41 0 41 -41q0 -32 -25 -39l-1032 -295 l1032 -295q25 -7 25 -36zM1421 -66q0 -31 -27 -39l-1170 -334q-11 -3 -15 -3q-39 0 -39 45q0 29 25 36l1032 295l-1032 295q-25 7 -25 39q0 41 41 41q6 0 13 -2l1170 -334q27 -8 27 -39z" />
+<glyph unicode="&#x2a8c;" horiz-adv-x="1591" d="M1421 732q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 432q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 1231q0 -31 -27 -39l-1170 -334q-11 -3 -15 -3q-39 0 -39 45q0 29 25 36l1032 295l-1032 295q-25 7 -25 39q0 41 41 41 q6 0 13 -2l1170 -334q27 -8 27 -39zM1421 -397q0 -45 -39 -45q-4 0 -15 3l-1170 334q-27 8 -27 39t27 39l1170 334q7 2 13 2q41 0 41 -41q0 -32 -25 -39l-1032 -295l1032 -295q25 -7 25 -36z" />
+<glyph unicode="&#x2a8d;" horiz-adv-x="1591" d="M1477 -318q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 454q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88 l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62q29 0 29 -63zM1421 651q0 -45 -39 -45q-7 0 -15 3l-1170 434q-27 10 -27 39t27 39l1170 434q5 2 13 2q41 0 41 -41q0 -30 -25 -39l-1063 -395l1063 -395q25 -9 25 -36z" />
+<glyph unicode="&#x2a8e;" horiz-adv-x="1591" d="M1477 -318q0 -41 -37 -41h-1286q-39 0 -39 41t39 41h1286q37 0 37 -41zM1477 454q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88 l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62q29 0 29 -63zM1421 1082q0 -29 -27 -39l-1170 -434q-8 -3 -15 -3q-39 0 -39 45q0 27 25 36l1063 395l-1063 395q-25 9 -25 39q0 41 41 41q8 0 13 -2l1170 -434q27 -10 27 -39z" />
+<glyph unicode="&#x2a8f;" horiz-adv-x="1591" d="M1421 900q0 -45 -39 -45q-4 0 -15 3l-1170 334q-27 8 -27 39t27 39l1170 334q7 2 13 2q41 0 41 -41q0 -32 -25 -39l-1032 -295l1032 -295q25 -7 25 -36zM1477 705q0 -146 -96.5 -234.5t-236.5 -88.5t-352 142.5t-335 142.5q-101 0 -192 -55.5t-91 -150.5q0 -39 -29.5 -39 t-29.5 39q0 145 97.5 233t237.5 88t351.5 -142t335.5 -142q101 0 185 52q98 60 98 155q0 37 28.5 37t28.5 -37zM1421 -66q0 -31 -27 -39l-1170 -334q-11 -3 -15 -3q-39 0 -39 45q0 29 25 36l1032 295l-1032 295q-25 7 -25 39q0 41 41 41q6 0 13 -2l1170 -334q27 -8 27 -39z " />
+<glyph unicode="&#x2a90;" horiz-adv-x="1591" d="M1421 1231q0 -31 -27 -39l-1170 -334q-11 -3 -15 -3q-39 0 -39 45q0 29 25 36l1032 295l-1032 295q-25 7 -25 39q0 41 41 41q6 0 13 -2l1170 -334q27 -8 27 -39zM1477 705q0 -146 -96.5 -234.5t-236.5 -88.5t-352 142.5t-335 142.5q-101 0 -192 -55.5t-91 -150.5 q0 -39 -29.5 -39t-29.5 39q0 145 97.5 233t237.5 88t351.5 -142t335.5 -142q101 0 185 52q98 60 98 155q0 37 28.5 37t28.5 -37zM1421 -397q0 -45 -39 -45q-4 0 -15 3l-1170 334q-27 8 -27 39t27 39l1170 334q7 2 13 2q41 0 41 -41q0 -32 -25 -39l-1032 -295l1032 -295 q25 -7 25 -36z" />
+<glyph unicode="&#x2a91;" horiz-adv-x="1591" d="M1421 -101q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 -401q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 900q0 -45 -39 -45q-4 0 -15 3l-1170 334q-27 8 -27 39t27 39l1170 334q7 2 13 2q41 0 41 -41q0 -32 -25 -39 l-1032 -295l1032 -295q25 -7 25 -36zM1421 497q0 -31 -27 -39l-1170 -334q-7 -2 -13 -2q-41 0 -41 41q0 32 25 39l1032 295l-1032 295q-25 7 -25 36q0 45 39 45q4 0 15 -3l1170 -334q27 -8 27 -39z" />
+<glyph unicode="&#x2a92;" horiz-adv-x="1591" d="M1421 -101q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 -401q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 1231q0 -31 -27 -39l-1170 -334q-11 -3 -15 -3q-39 0 -39 45q0 29 25 36l1032 295l-1032 295q-25 7 -25 39q0 41 41 41 q6 0 13 -2l1170 -334q27 -8 27 -39zM1421 163q0 -41 -41 -41q-6 0 -13 2l-1170 334q-27 8 -27 39t27 39l1170 334q11 3 15 3q39 0 39 -45q0 -29 -25 -36l-1032 -295l1032 -295q25 -7 25 -39z" />
+<glyph unicode="&#x2a93;" horiz-adv-x="1591" d="M1421 881q0 -41 -41 -41q-7 0 -14 2l-1169 343q-27 8 -27 36.5t20 34.5l1176 345q17 5 19 5q36 0 36 -41q0 -30 -18 -35l-1047 -307l1041 -305q24 -7 24 -37zM1421 583q0 -41 -41 -41q-4 0 -14 3l-1176 345q-20 6 -20 34q0 41 41 41q9 0 16 -2l1176 -345q18 -5 18 -35z M1401 272q20 -6 20 -34.5t-27 -36.5l-1169 -343q-7 -2 -14 -2q-41 0 -41 41q0 30 24 37l1041 305l-1047 307q-18 5 -18 35q0 41 36 41q2 0 19 -5zM1421 -60q0 -28 -20 -34l-1176 -345q-10 -3 -14 -3q-41 0 -41 41q0 30 18 35l1176 345q7 2 16 2q41 0 41 -41z" />
+<glyph unicode="&#x2a94;" horiz-adv-x="1591" d="M1401 1256q20 -6 20 -34.5t-27 -36.5l-1169 -343q-7 -2 -14 -2q-41 0 -41 41q0 30 24 37l1041 305l-1047 307q-18 5 -18 35q0 41 36 41q2 0 19 -5zM1421 924q0 -28 -20 -34l-1176 -345q-10 -3 -14 -3q-41 0 -41 41q0 30 18 35l1176 345q7 2 16 2q41 0 41 -41zM1421 -103 q0 -41 -41 -41q-7 0 -14 2l-1169 343q-27 8 -27 36.5t20 34.5l1176 345q17 5 19 5q36 0 36 -41q0 -30 -18 -35l-1047 -307l1041 -305q24 -7 24 -37zM1421 -401q0 -41 -41 -41q-4 0 -14 3l-1176 345q-20 6 -20 34q0 41 41 41q9 0 16 -2l1176 -345q18 -5 18 -35z" />
+<glyph unicode="&#x2a95;" horiz-adv-x="1591" d="M1421 1333q0 -27 -18 -35l-1176 -555q-4 -2 -16 -2q-41 0 -41 41q0 25 20 34l1176 555q6 3 14 3q41 0 41 -41zM1421 -169q0 -41 -41 -41q-10 0 -14 5l-1176 555q-20 9 -20 33.5t27 37.5l1169 553q4 2 14 2q41 0 41 -41q0 -26 -24 -37l-1090 -514l1096 -518q18 -9 18 -35z " />
+<glyph unicode="&#x2a96;" horiz-adv-x="1591" d="M1421 782q0 -41 -41 -41q-12 0 -16 2l-1176 555q-18 8 -18 35q0 41 41 41q8 0 14 -3l1176 -555q20 -9 20 -34zM1394 421q27 -13 27 -37.5t-20 -33.5l-1176 -555q-4 -5 -14 -5q-41 0 -41 41q0 26 18 35l1096 518l-1090 514q-24 11 -24 37q0 41 41 41q10 0 14 -2z" />
+<glyph unicode="&#x2a97;" horiz-adv-x="1591" d="M1421 1333q0 -27 -18 -35l-1176 -555q-4 -2 -16 -2q-41 0 -41 41q0 25 20 34l1176 555q6 3 14 3q41 0 41 -41zM1421 -169q0 -41 -41 -41q-10 0 -14 5l-1176 555q-20 9 -20 33.5t27 37.5l1169 553q4 2 14 2q41 0 41 -41q0 -26 -24 -37l-1090 -514l1096 -518q18 -9 18 -35z M1336 464q33 -33 33 -79.5t-33.5 -80t-80 -33.5t-79.5 33t-33 80t33 80t80 33t80 -33z" />
+<glyph unicode="&#x2a98;" horiz-adv-x="1591" d="M1421 782q0 -41 -41 -41q-12 0 -16 2l-1176 555q-18 8 -18 35q0 41 41 41q8 0 14 -3l1176 -555q20 -9 20 -34zM1394 421q27 -13 27 -37.5t-20 -33.5l-1176 -555q-4 -5 -14 -5q-41 0 -41 41q0 26 18 35l1096 518l-1090 514q-24 11 -24 37q0 41 41 41q10 0 14 -2zM415 464 q33 -33 33 -79.5t-33.5 -80t-80 -33.5t-79.5 33t-33 80t33 80t80 33t80 -33z" />
+<glyph unicode="&#x2a99;" horiz-adv-x="1591" d="M1421 -259q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1421 1133q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 1433q0 -41 -37 -41h-1175 q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2a9a;" horiz-adv-x="1591" d="M1421 292q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 1133q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 1433q0 -41 -37 -41h-1175 q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2a9b;" horiz-adv-x="1591" d="M1421 1135q0 -27 -18 -35l-1176 -555q-4 -2 -16 -2q-41 0 -41 41q0 25 20 34l1176 555q6 3 14 3q41 0 41 -41zM1421 -367q0 -41 -41 -41q-10 0 -14 5l-1176 555q-20 9 -20 33.5t27 37.5l1169 553q4 2 14 2q41 0 41 -41q0 -26 -24 -37l-1090 -514l1096 -518q18 -9 18 -35z M1421 1532q0 -27 -18 -35l-1176 -555q-4 -2 -16 -2q-41 0 -41 41q0 25 20 34l1176 555q6 3 14 3q41 0 41 -41z" />
+<glyph unicode="&#x2a9c;" horiz-adv-x="1591" d="M1421 584q0 -41 -41 -41q-12 0 -16 2l-1176 555q-18 8 -18 35q0 41 41 41q8 0 14 -3l1176 -555q20 -9 20 -34zM1394 223q27 -13 27 -37.5t-20 -33.5l-1176 -555q-4 -5 -14 -5q-41 0 -41 41q0 26 18 35l1096 518l-1090 514q-24 11 -24 37q0 41 41 41q10 0 14 -2zM1421 981 q0 -41 -41 -41q-12 0 -16 2l-1176 555q-18 8 -18 35q0 41 41 41q8 0 14 -3l1176 -555q20 -9 20 -34z" />
+<glyph unicode="&#x2a9d;" horiz-adv-x="1591" d="M1477 1411q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1421 -304q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37z" />
+<glyph unicode="&#x2a9e;" horiz-adv-x="1591" d="M1477 1411q0 -152 -96 -271.5t-244 -119.5q-114 0 -238 88l-208 164q-123 88 -236 88q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5q115 0 240 -88l207 -164q124 -88 235 -88q85 0 156 50t104 130q15 36 21 98t30 62 q29 0 29 -63zM1421 247q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37z" />
+<glyph unicode="&#x2a9f;" horiz-adv-x="1591" d="M1421 -101q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 -401q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1477 1529q0 -146 -96.5 -234.5t-236.5 -88.5t-352 142.5t-335 142.5q-101 0 -192 -55.5t-91 -150.5q0 -39 -29.5 -39 t-29.5 39q0 145 97.5 233t237.5 88t351.5 -142t335.5 -142q101 0 185 52q98 60 98 155q0 37 28.5 37t28.5 -37zM1421 81q0 -41 -41 -41q-7 0 -14 3l-1169 502q-27 12 -27 37t27 37l1169 502q7 3 14 3q41 0 41 -41q0 -27 -24 -37l-1081 -464l1081 -464q24 -10 24 -37z" />
+<glyph unicode="&#x2aa0;" horiz-adv-x="1591" d="M1421 -101q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 -401q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1477 1529q0 -146 -96.5 -234.5t-236.5 -88.5t-352 142.5t-335 142.5q-101 0 -192 -55.5t-91 -150.5q0 -39 -29.5 -39 t-29.5 39q0 145 97.5 233t237.5 88t351.5 -142t335.5 -142q101 0 185 52q98 60 98 155q0 37 28.5 37t28.5 -37zM1421 582q0 -25 -27 -37l-1169 -502q-7 -3 -14 -3q-41 0 -41 41q0 27 24 37l1081 464l-1081 464q-24 10 -24 37q0 41 41 41q7 0 14 -3l1169 -502q27 -12 27 -37z " />
+<glyph unicode="&#x2aa1;" horiz-adv-x="1591" d="M1421 314q0 -41 -41 -41q-10 0 -14 2l-569 270q-27 13 -27 37.5t20 33.5l576 272q8 4 14 4q41 0 41 -41q0 -27 -18 -35l-496 -234l490 -231q24 -11 24 -37zM1421 31q0 -41 -41 -41q-10 0 -14 2l-1169 553q-27 13 -27 37.5t20 33.5l1176 556q8 4 14 4q41 0 41 -41 q0 -26 -18 -35l-1096 -518l1090 -514q24 -11 24 -37z" />
+<glyph unicode="&#x2aa2;" horiz-adv-x="1591" d="M1401 616q20 -9 20 -33.5t-27 -37.5l-1169 -553q-4 -2 -14 -2q-41 0 -41 41q0 26 24 37l1090 514l-1096 518q-18 9 -18 35q0 41 41 41q6 0 14 -4zM801 616q20 -9 20 -33.5t-27 -37.5l-569 -270q-4 -2 -14 -2q-41 0 -41 41q0 26 24 37l490 231l-496 234q-18 8 -18 35 q0 41 41 41q6 0 14 -4z" />
+<glyph unicode="&#x2aa3;" horiz-adv-x="2211" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM2041 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37 l-1090 -514l1090 -514q24 -11 24 -37zM2041 -318q0 -41 -37 -41h-1795q-39 0 -39 41t39 41h1795q37 0 37 -41z" />
+<glyph unicode="&#x2aa4;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-570 269l-571 -269q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l507 239l-504 238q-27 13 -27 37t27 37l504 238l-507 239q-24 11 -24 37q0 41 41 41q8 0 14 -3l570 -269l571 269q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-507 -239l504 -238 q27 -13 27 -37t-27 -37l-504 -238l507 -239q24 -11 24 -37zM1284 582l-488 230l-489 -230l489 -230z" />
+<glyph unicode="&#x2aa5;" horiz-adv-x="2891" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM2721 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41 q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37z" />
+<glyph unicode="&#x2aa6;" horiz-adv-x="1742" d="M1416 1152q156 -265 156 -567.5t-155 -570.5q-14 -24 -37 -24q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q24 0 36 -22zM1363 84q127 233 127 498.5t-127 497.5l-1056 -498z" />
+<glyph unicode="&#x2aa7;" horiz-adv-x="1742" d="M1572 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-23 0 -37 24q-155 268 -155 570.5t156 567.5q12 22 36 22q8 0 14 -3l1169 -552q27 -13 27 -37zM379 1080q-127 -232 -127 -497.5t127 -498.5l1056 498z" />
+<glyph unicode="&#x2aa8;" horiz-adv-x="1742" d="M1416 1152q156 -265 156 -567.5t-155 -570.5q-14 -24 -37 -24q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q24 0 36 -22zM1363 84q127 233 127 498.5t-127 497.5l-1056 -498zM1421 -367q0 -41 -41 -41q-8 0 -14 3l-1176 555q-20 9 -20 34q0 41 41 41 q12 0 16 -2l1176 -555q18 -8 18 -35z" />
+<glyph unicode="&#x2aa9;" horiz-adv-x="1742" d="M1572 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-23 0 -37 24q-155 268 -155 570.5t156 567.5q12 22 36 22q8 0 14 -3l1169 -552q27 -13 27 -37zM379 1080q-127 -232 -127 -497.5t127 -498.5l1056 498zM1572 184q0 -25 -20 -34l-1176 -555q-6 -3 -14 -3q-41 0 -41 41 q0 27 18 35l1176 555q4 2 16 2q41 0 41 -41z" />
+<glyph unicode="&#x2aaa;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1003 -473h988q39 0 39 -41t-39 -41h-988l1003 -473q24 -11 24 -37z" />
+<glyph unicode="&#x2aab;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1003 473h-988q-39 0 -39 41t39 41h988l-1003 473q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37z" />
+<glyph unicode="&#x2aac;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1003 -473h988q39 0 39 -41t-39 -41h-988l1003 -473q24 -11 24 -37zM1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2aad;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1003 473h-988q-39 0 -39 41t39 41h988l-1003 473q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2aae;" horiz-adv-x="1592" d="M1422 582q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 182q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1422 982q0 -41 -37 -41h-336q-13 0 -25 13t-12 26q0 87 -64 152t-152 65t-151 -64t-63 -153q0 -39 -39 -39h-334q-39 0 -39 41 t39 41h293q17 111 100 183.5t193.5 72.5t195.5 -74t99 -182h295q37 0 37 -41z" />
+<glyph unicode="&#x2aaf;" horiz-adv-x="1591" d="M1421 35q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-268 78 -704 78q-39 0 -39 41t39 41q436 0 706 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295 q12 -52 12 -75zM1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2ab0;" horiz-adv-x="1591" d="M1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 582q0 -41 -37 -41q-267 0 -500 -31.5t-415.5 -142.5t-216.5 -338q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43 q35 0 41 -37q35 -232 215 -342t418.5 -142t498.5 -32q37 0 37 -41z" />
+<glyph unicode="&#x2ab1;" horiz-adv-x="1591" d="M1421 35q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-268 78 -704 78q-39 0 -39 41t39 41q436 0 706 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295 q12 -52 12 -75zM1421 -259q0 -41 -37 -41h-574l-177 -133q-12 -9 -25 -9q-42 0 -42 43q0 19 17 32l90 67h-464q-39 0 -39 41t39 41h573l176 133q12 8 25 8q42 0 42 -42q0 -19 -17 -32l-89 -67h465q37 0 37 -41z" />
+<glyph unicode="&#x2ab2;" horiz-adv-x="1591" d="M1421 582q0 -41 -37 -41q-267 0 -500 -31.5t-415.5 -142.5t-216.5 -338q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37q35 -232 215 -342t418.5 -142t498.5 -32q37 0 37 -41z M1421 -259q0 -41 -37 -41h-574l-177 -133q-12 -9 -25 -9q-42 0 -42 43q0 19 17 32l90 67h-464q-39 0 -39 41t39 41h573l176 133q12 8 25 8q42 0 42 -42q0 -19 -17 -32l-89 -67h465q37 0 37 -41z" />
+<glyph unicode="&#x2ab3;" horiz-adv-x="1591" d="M1421 335q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-268 78 -704 78q-39 0 -39 41t39 41q436 0 706 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295 q12 -52 12 -75zM1421 41q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2ab4;" horiz-adv-x="1591" d="M1421 41q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 -259q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 882q0 -41 -37 -41q-267 0 -500 -31.5t-415.5 -142.5t-216.5 -338q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53 q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37q35 -232 215 -342t418.5 -142t498.5 -32q37 0 37 -41z" />
+<glyph unicode="&#x2ab5;" horiz-adv-x="1591" d="M1421 335q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-268 78 -704 78q-39 0 -39 41t39 41q436 0 706 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295 q12 -53 12 -75zM1421 -259q0 -41 -37 -41h-720l-127 -129q-13 -13 -29 -13q-42 0 -42 42q0 16 13 29l70 71h-340q-39 0 -39 41t39 41h421l216 218h-637q-39 0 -39 41t39 41h718l127 129q13 13 29 13q42 0 42 -42q0 -16 -13 -29l-70 -71h342q37 0 37 -41t-37 -41h-423 l-216 -218h639q37 0 37 -41z" />
+<glyph unicode="&#x2ab6;" horiz-adv-x="1591" d="M1421 882q0 -41 -37 -41q-267 0 -500 -31.5t-415.5 -142.5t-216.5 -338q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37q35 -232 215 -342t418.5 -142t498.5 -32q37 0 37 -41z M1421 -259q0 -41 -37 -41h-720l-127 -129q-13 -13 -29 -13q-42 0 -42 42q0 16 13 29l70 71h-340q-39 0 -39 41t39 41h421l216 218h-637q-39 0 -39 41t39 41h718l127 129q13 13 29 13q42 0 42 -42q0 -16 -13 -29l-70 -71h342q37 0 37 -41t-37 -41h-423l-216 -218h639 q37 0 37 -41z" />
+<glyph unicode="&#x2ab7;" horiz-adv-x="1591" d="M1421 465q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-268 78 -704 78q-39 0 -39 41t39 41q436 0 706 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295 q12 -53 12 -75zM1475 310q0 -158 -103 -250t-236.5 -92t-346 142t-334.5 142t-202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t237.5 92t345.5 -141.5t334.5 -141.5t203 72t80.5 154q0 57 28.5 57t28.5 -57zM1475 -100q0 -158 -103 -250t-236.5 -92 t-346 142t-334.5 142t-202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t237.5 92t345.5 -141.5t334.5 -141.5t203 72t80.5 154q0 57 28.5 57t28.5 -57z" />
+<glyph unicode="&#x2ab8;" horiz-adv-x="1591" d="M1421 1012q0 -41 -37 -41q-267 0 -500 -31.5t-415.5 -142.5t-216.5 -338q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37q35 -232 215 -342t418.5 -142t498.5 -32q37 0 37 -41z M1475 310q0 -158 -103 -250t-236.5 -92t-346 142t-334.5 142t-202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t237.5 92t345.5 -141.5t334.5 -141.5t203 72t80.5 154q0 57 28.5 57t28.5 -57zM1475 -100q0 -158 -103 -250t-236.5 -92t-346 142t-334.5 142 t-202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t237.5 92t345.5 -141.5t334.5 -141.5t203 72t80.5 154q0 57 28.5 57t28.5 -57z" />
+<glyph unicode="&#x2ab9;" horiz-adv-x="1591" d="M1421 465q0 -45 -41 -45q-34 0 -41 39q-28 180 -141.5 282t-284.5 152q-268 78 -704 78q-39 0 -39 41t39 41q436 0 706 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q269 -47 453 -177q156 -110 198 -295 q12 -53 12 -75zM1475 -100q0 -158 -103 -250t-226 -92t-255 77l-221 141l-199 -205q-12 -13 -29 -13q-42 0 -42 42q0 16 13 28l180 186q-71 28 -138 28q-122 0 -202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t238 92q102 0 217 -62l173 179 q-180 115 -188 119q-108 59 -216 59t-188.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t227 92t255 -77l220 -140l198 203q12 13 29 13q42 0 42 -42q0 -15 -13 -28l-178 -184q71 -28 138 -28q122 0 202.5 72t80.5 154q0 57 28.5 57t28.5 -57 q0 -158 -103 -250t-237 -92q-102 0 -218 62l-173 -178q179 -114 188 -119q108 -59 216.5 -59t189 72t80.5 154q0 57 28.5 57t28.5 -57z" />
+<glyph unicode="&#x2aba;" horiz-adv-x="1591" d="M1421 1012q0 -41 -37 -41q-267 0 -500 -31.5t-415.5 -142.5t-216.5 -338q-6 -39 -41 -39q-41 0 -41 45q0 12 8 53q25 130 106 225q172 203 550 269q-435 77 -590 327q-74 119 -74 224q0 43 41 43q35 0 41 -37q35 -232 215 -342t418.5 -142t498.5 -32q37 0 37 -41z M1475 -100q0 -158 -103 -250t-226 -92t-255 77l-221 141l-199 -205q-12 -13 -29 -13q-42 0 -42 42q0 16 13 28l180 186q-71 28 -138 28q-122 0 -202.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t238 92q102 0 217 -62l173 179q-180 115 -188 119 q-108 59 -216 59t-188.5 -71.5t-80.5 -153.5q0 -59 -29.5 -59t-29.5 59q0 156 104 248t227 92t255 -77l220 -140l198 203q12 13 29 13q42 0 42 -42q0 -15 -13 -28l-178 -184q71 -28 138 -28q122 0 202.5 72t80.5 154q0 57 28.5 57t28.5 -57q0 -158 -103 -250t-237 -92 q-102 0 -218 62l-173 -178q179 -114 188 -119q108 -59 216.5 -59t189 72t80.5 154q0 57 28.5 57t28.5 -57z" />
+<glyph unicode="&#x2abb;" d="M1878 31q0 -43 -41 -43q-35 0 -41 37q-27 183 -139 284t-285 152q-270 80 -506 80q-39 0 -39 41t39 41q236 0 506 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q277 -52 455 -178q154 -109 196 -297 q12 -54 12 -76zM1221 31q0 -43 -41 -43q-35 0 -41 37q-27 183 -139 284t-285 152q-270 80 -506 80q-39 0 -39 41t39 41q236 0 506 80q173 51 285 152t139 284q6 37 41 37q41 0 41 -43q0 -22 -12 -76q-42 -188 -196 -297q-178 -126 -455 -178q277 -52 455 -178 q154 -109 196 -297q12 -54 12 -76z" />
+<glyph unicode="&#x2abc;" d="M1878 582q0 -41 -39 -41q-236 0 -506 -80q-173 -51 -285 -152t-139 -284q-6 -37 -41 -37q-41 0 -41 43q0 22 12 76q42 188 196 297q178 126 455 178q-277 52 -455 178q-154 109 -196 297q-12 54 -12 76q0 43 41 43q35 0 41 -37q27 -183 139 -284t285 -152 q270 -80 506 -80q39 0 39 -41zM1221 582q0 -41 -39 -41q-236 0 -506 -80q-173 -51 -285 -152t-139 -284q-6 -37 -41 -37q-41 0 -41 43q0 22 12 76q42 188 196 297q178 126 455 178q-277 52 -455 178q-154 109 -196 297q-12 54 -12 76q0 43 41 43q35 0 41 -37 q27 -183 139 -284t285 -152q270 -80 506 -80q39 0 39 -41z" />
+<glyph unicode="&#x2abd;" horiz-adv-x="1591" d="M1421 41q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h584q39 0 39 -41zM875 661.5q34 -33.5 34 -80t-33 -79.5t-80.5 -33t-80 33t-32.5 80t32.5 80t79 33 t80.5 -33.5z" />
+<glyph unicode="&#x2abe;" horiz-adv-x="1591" d="M1421 582q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41t39 41h584q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5zM875 661.5q34 -33.5 34 -80t-33 -79.5t-80.5 -33t-80 33t-32.5 80t32.5 80t79 33 t80.5 -33.5z" />
+<glyph unicode="&#x2abf;" horiz-adv-x="1190" d="M1020 623q0 -41 -37 -41h-319q-201 0 -347.5 132t-146.5 330t146.5 330t347.5 132h319q37 0 37 -41t-37 -41h-319q-167 0 -289.5 -108t-122.5 -272t122.5 -272t289.5 -108h319q37 0 37 -41zM1020 83q0 -41 -37 -41h-347v-345q0 -39 -41 -39t-41 39v345h-345q-39 0 -39 41 t39 41h345v347q0 37 41 37t41 -37v-347h347q37 0 37 -41z" />
+<glyph unicode="&#x2ac0;" horiz-adv-x="1190" d="M1020 1044q0 -198 -146.5 -330t-347.5 -132h-319q-37 0 -37 41t37 41h319q167 0 289.5 108t122.5 272t-122.5 272t-289.5 108h-319q-37 0 -37 41t37 41h319q201 0 347.5 -132t146.5 -330zM1020 83q0 -41 -37 -41h-347v-345q0 -39 -41 -39t-41 39v345h-345q-39 0 -39 41 t39 41h345v347q0 37 41 37t41 -37v-347h347q37 0 37 -41z" />
+<glyph unicode="&#x2ac1;" horiz-adv-x="1190" d="M1020 623q0 -41 -37 -41h-319q-201 0 -347.5 132t-146.5 330t146.5 330t347.5 132h319q37 0 37 -41t-37 -41h-319q-167 0 -289.5 -108t-122.5 -272t122.5 -272t289.5 -108h319q37 0 37 -41zM969 399l-316 -316l315 -315q13 -13 13 -27t-15 -29t-29 -15t-27 13l-315 315 l-315 -315q-13 -13 -27 -13t-29 15t-15 29t13 27l315 315l-316 316q-12 12 -12 25q0 15 15 30t30 15q13 0 25 -12l316 -316l316 316q12 12 25 12q15 0 30 -15t15 -30q0 -13 -12 -25z" />
+<glyph unicode="&#x2ac2;" horiz-adv-x="1190" d="M1020 1044q0 -198 -146.5 -330t-347.5 -132h-319q-37 0 -37 41t37 41h319q167 0 289.5 108t122.5 272t-122.5 272t-289.5 108h-319q-37 0 -37 41t37 41h319q201 0 347.5 -132t146.5 -330zM969 399l-316 -316l315 -315q13 -13 13 -27t-15 -29t-29 -15t-27 13l-315 315 l-315 -315q-13 -13 -27 -13t-29 15t-15 29t13 27l315 315l-316 316q-12 12 -12 25q0 15 15 30t30 15q13 0 25 -12l316 -316l316 316q12 12 25 12q15 0 30 -15t15 -30q0 -13 -12 -25z" />
+<glyph unicode="&#x2ac3;" horiz-adv-x="1190" d="M1020 -261q0 -41 -37 -41h-774q-39 0 -39 41t39 41h774q37 0 37 -41zM754.5 1351.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1020 41q0 -41 -37 -41h-319q-201 0 -347.5 132t-146.5 330t146.5 330t347.5 132h319q37 0 37 -41 t-37 -41h-319q-167 0 -289.5 -108t-122.5 -272t122.5 -272t289.5 -108h319q37 0 37 -41z" />
+<glyph unicode="&#x2ac4;" horiz-adv-x="1190" d="M1020 -261q0 -41 -37 -41h-774q-39 0 -39 41t39 41h774q37 0 37 -41zM754.5 1351.5q33.5 -33.5 33.5 -80t-33 -79.5t-80 -33t-80 33t-33 80t33 80t79.5 33t80 -33.5zM1020 462q0 -198 -146.5 -330t-347.5 -132h-319q-37 0 -37 41t37 41h319q167 0 289.5 108t122.5 272 t-122.5 272t-289.5 108h-319q-37 0 -37 41t37 41h319q201 0 347.5 -132t146.5 -330z" />
+<glyph unicode="&#x2ac5;" horiz-adv-x="1591" d="M1421 341q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h584q39 0 39 -41zM1421 41q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 -259 q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2ac6;" horiz-adv-x="1591" d="M1421 882q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41t39 41h584q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5zM1421 41q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41zM1421 -259 q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2ac7;" horiz-adv-x="1591" d="M1421 131q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h584q39 0 39 -41zM1421 -114q0 -137 -88 -232.5t-217 -95.5t-324 136.5t-299 136.5t-186.5 -62 t-82.5 -154q0 -57 -27 -57t-27 57q0 137 89 231.5t218 94.5t323.5 -136t299 -136t187 62.5t82.5 154.5q0 55 26 55t26 -55z" />
+<glyph unicode="&#x2ac8;" horiz-adv-x="1591" d="M1421 672q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41t39 41h584q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5zM1421 -114q0 -137 -88 -232.5t-217 -95.5t-324 136.5t-299 136.5t-186.5 -62 t-82.5 -154q0 -57 -27 -57t-27 57q0 137 89 231.5t218 94.5t323.5 -136t299 -136t187 62.5t82.5 154.5q0 55 26 55t26 -55z" />
+<glyph unicode="&#x2ac9;" horiz-adv-x="1190" d="M1020 401q0 -41 -37 -41h-319q-201 0 -347.5 132t-146.5 330t146.5 330t347.5 132h319q37 0 37 -41t-37 -41h-319q-167 0 -289.5 -108t-122.5 -272t122.5 -272t289.5 -108h319q37 0 37 -41zM1020 196q0 -111 -53.5 -194.5t-158.5 -83.5q-84 0 -215.5 111.5t-207 111.5 t-117 -51t-41.5 -125q0 -47 -28.5 -47t-28.5 57q0 111 50 187q58 89 163 89q84 0 215.5 -111t207 -111t117.5 51.5t42 125.5q0 45 27.5 45t27.5 -55zM1020 -164q0 -111 -53.5 -194.5t-158.5 -83.5q-84 0 -215.5 111.5t-207 111.5t-117 -51t-41.5 -125q0 -47 -28.5 -47 t-28.5 57q0 111 50 187q58 89 163 89q84 0 215.5 -111t207 -111t117.5 51.5t42 125.5q0 45 27.5 45t27.5 -55z" />
+<glyph unicode="&#x2aca;" horiz-adv-x="1190" d="M1020 822q0 -198 -146.5 -330t-347.5 -132h-319q-37 0 -37 41t37 41h319q167 0 289.5 108t122.5 272t-122.5 272t-289.5 108h-319q-37 0 -37 41t37 41h319q201 0 347.5 -132t146.5 -330zM1020 196q0 -111 -53.5 -194.5t-158.5 -83.5q-84 0 -215.5 111.5t-207 111.5 t-117 -51t-41.5 -125q0 -47 -28.5 -47t-28.5 57q0 111 50 187q58 89 163 89q84 0 215.5 -111t207 -111t117.5 51.5t42 125.5q0 45 27.5 45t27.5 -55zM1020 -164q0 -111 -53.5 -194.5t-158.5 -83.5q-84 0 -215.5 111.5t-207 111.5t-117 -51t-41.5 -125q0 -47 -28.5 -47 t-28.5 57q0 111 50 187q58 89 163 89q84 0 215.5 -111t207 -111t117.5 51.5t42 125.5q0 45 27.5 45t27.5 -55z" />
+<glyph unicode="&#x2acb;" horiz-adv-x="1591" d="M1421 341q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h584q39 0 39 -41zM1421 -259q0 -41 -37 -41h-720l-127 -129q-13 -13 -29 -13q-42 0 -42 42 q0 16 13 29l70 71h-340q-39 0 -39 41t39 41h421l216 218h-637q-39 0 -39 41t39 41h718l127 129q13 13 29 13q42 0 42 -42q0 -16 -13 -29l-70 -71h342q37 0 37 -41t-37 -41h-423l-216 -218h639q37 0 37 -41z" />
+<glyph unicode="&#x2acc;" horiz-adv-x="1591" d="M1421 882q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41t39 41h584q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5zM1421 -259q0 -41 -37 -41h-720l-127 -129q-13 -13 -29 -13q-42 0 -42 42 q0 16 13 29l70 71h-340q-39 0 -39 41t39 41h421l216 218h-637q-39 0 -39 41t39 41h718l127 129q13 13 29 13q42 0 42 -42q0 -16 -13 -29l-70 -71h342q37 0 37 -41t-37 -41h-423l-216 -218h639q37 0 37 -41z" />
+<glyph unicode="&#x2acd;" d="M1878 1123q0 -41 -37 -41h-1589v-1000h802q37 0 37 -41t-37 -41h-845q-39 0 -39 37v1090q0 37 39 37h1632q37 0 37 -41z" />
+<glyph unicode="&#x2ace;" d="M1878 37q0 -37 -39 -37h-845q-37 0 -37 41t37 41h802v1000h-1589q-37 0 -37 41t37 41h1632q39 0 39 -37v-1090z" />
+<glyph unicode="&#x2acf;" horiz-adv-x="1591" d="M1421 41q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41v-1082zM1339 82v1000h-541q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h541z" />
+<glyph unicode="&#x2ad0;" horiz-adv-x="1591" d="M1421 582q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41v1082q0 41 39 41h590q248 0 435 -168.5t187 -413.5zM1339 582q0 213 -165 356.5t-381 143.5h-541v-1000h541q216 0 381 143.5t165 356.5z" />
+<glyph unicode="&#x2ad1;" horiz-adv-x="1591" d="M1421 41q0 -41 -39 -41h-590q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41v-1082zM1339 82v1000h-541q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h541zM1421 -318q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175q37 0 37 -41z" />
+<glyph unicode="&#x2ad2;" horiz-adv-x="1591" d="M1421 582q0 -245 -187 -413.5t-435 -168.5h-590q-39 0 -39 41v1082q0 41 39 41h590q248 0 435 -168.5t187 -413.5zM1339 582q0 213 -165 356.5t-381 143.5h-541v-1000h541q216 0 381 143.5t165 356.5zM1421 -318q0 -41 -37 -41h-1175q-39 0 -39 41t39 41h1175 q37 0 37 -41z" />
+<glyph unicode="&#x2ad3;" horiz-adv-x="1190" d="M1020 711q0 -41 -37 -41h-319q-201 0 -347.5 132t-146.5 330t146.5 330t347.5 132h319q37 0 37 -41t-37 -41h-319q-167 0 -289.5 -108t-122.5 -272t122.5 -272t289.5 -108h319q37 0 37 -41zM1020 32q0 -198 -146.5 -330t-347.5 -132h-319q-37 0 -37 41t37 41h319 q167 0 289.5 108t122.5 272t-122.5 272t-289.5 108h-319q-37 0 -37 41t37 41h319q201 0 347.5 -132t146.5 -330z" />
+<glyph unicode="&#x2ad4;" horiz-adv-x="1190" d="M1020 1132q0 -198 -146.5 -330t-347.5 -132h-319q-37 0 -37 41t37 41h319q167 0 289.5 108t122.5 272t-122.5 272t-289.5 108h-319q-37 0 -37 41t37 41h319q201 0 347.5 -132t146.5 -330zM1020 -389q0 -41 -37 -41h-319q-201 0 -347.5 132t-146.5 330t146.5 330 t347.5 132h319q37 0 37 -41t-37 -41h-319q-167 0 -289.5 -108t-122.5 -272t122.5 -272t289.5 -108h319q37 0 37 -41z" />
+<glyph unicode="&#x2ad5;" horiz-adv-x="1190" d="M1020 711q0 -41 -37 -41h-319q-201 0 -347.5 132t-146.5 330t146.5 330t347.5 132h319q37 0 37 -41t-37 -41h-319q-167 0 -289.5 -108t-122.5 -272t122.5 -272t289.5 -108h319q37 0 37 -41zM1020 -389q0 -41 -37 -41h-319q-201 0 -347.5 132t-146.5 330t146.5 330 t347.5 132h319q37 0 37 -41t-37 -41h-319q-167 0 -289.5 -108t-122.5 -272t122.5 -272t289.5 -108h319q37 0 37 -41z" />
+<glyph unicode="&#x2ad6;" horiz-adv-x="1190" d="M1020 1132q0 -198 -146.5 -330t-347.5 -132h-319q-37 0 -37 41t37 41h319q167 0 289.5 108t122.5 272t-122.5 272t-289.5 108h-319q-37 0 -37 41t37 41h319q201 0 347.5 -132t146.5 -330zM1020 32q0 -198 -146.5 -330t-347.5 -132h-319q-37 0 -37 41t37 41h319 q167 0 289.5 108t122.5 272t-122.5 272t-289.5 108h-319q-37 0 -37 41t37 41h319q201 0 347.5 -132t146.5 -330z" />
+<glyph unicode="&#x2ad7;" horiz-adv-x="2200" d="M2030 41q0 -41 -37 -41h-319q-201 0 -347.5 132t-146.5 330t146.5 330t347.5 132h319q37 0 37 -41t-37 -41h-319q-167 0 -289.5 -108t-122.5 -272t122.5 -272t289.5 -108h319q37 0 37 -41zM1020 462q0 -198 -146.5 -330t-347.5 -132h-319q-37 0 -37 41t37 41h319 q167 0 289.5 108t122.5 272t-122.5 272t-289.5 108h-319q-37 0 -37 41t37 41h319q201 0 347.5 -132t146.5 -330z" />
+<glyph unicode="&#x2ad8;" horiz-adv-x="2200" d="M2030 41q0 -41 -37 -41h-319q-189 0 -332.5 119t-159.5 302h-164q-16 -183 -159.5 -302t-332.5 -119h-319q-37 0 -37 41t37 41h319q155 0 274 95t136 244h-427q-39 0 -39 41t39 41h427q-17 149 -136 244t-274 95h-319q-37 0 -37 41t37 41h319q189 0 332.5 -119 t159.5 -302h164q16 183 159.5 302t332.5 119h319q37 0 37 -41t-37 -41h-319q-155 0 -274 -95t-136 -244h427q39 0 39 -41t-39 -41h-427q17 -149 136 -244t274 -95h319q37 0 37 -41z" />
+<glyph unicode="&#x2ad9;" horiz-adv-x="1364" d="M1264 37q0 -37 -41 -37t-41 37v358q0 201 -132 373t-327 172v-903q0 -37 -41 -37t-41 37v903q-195 0 -327 -172t-132 -373v-358q0 -37 -41 -37t-41 37v364q0 253 166 438t416 185t416 -185t166 -438v-364z" />
+<glyph unicode="&#x2ada;" horiz-adv-x="1364" d="M1264 137q0 -37 -41 -37t-41 37v258q0 201 -132 373t-327 172v-903q0 -37 -41 -37t-41 37v903q-195 0 -327 -172t-132 -373v-258q0 -37 -41 -37t-41 37v264q0 242 153 423.5t388 198.5v189h-247q-37 0 -37 41t37 41h574q39 0 39 -41t-39 -41h-245v-189 q235 -17 388 -198.5t153 -423.5v-264z" />
+<glyph unicode="&#x2adb;" horiz-adv-x="1364" d="M1264 137q0 -37 -41 -37t-41 37v258q0 201 -132 373t-327 172v-903q0 -37 -41 -37t-41 37v903q-195 0 -327 -172t-132 -373v-258q0 -37 -41 -37t-41 37v264q0 242 153 423.5t388 198.5v234q0 37 41 37t41 -37v-234q235 -17 388 -198.5t153 -423.5v-264z" />
+<glyph unicode="&#x2adc;" horiz-adv-x="1364" d="M1284 594q0 -227 -188 -410.5t-413.5 -183.5t-414 184t-188.5 410q0 40 42 40q28 0 39 -34l12 -54q13 -58 31 -104q128 -335 437 -358v1003q0 37 41 37t41 -37v-1003q309 23 437 358q18 46 26 84t18 73t38 35q42 0 42 -40z" />
+<glyph unicode="&#x2add;" horiz-adv-x="1364" d="M1284 594q0 -227 -188 -410.5t-414 -183.5q-144 0 -260 60l-79 -137q-12 -21 -30 -21q-11 0 -25 8q-23 13 -23 32q0 10 7 22l81 139q-95 70 -184 225.5t-89 265.5q0 40 42 40q28 0 39 -34l12 -54q57 -246 222 -370l246 427v484q0 37 41 37t41 -37v-342l207 359 q19 32 54.5 11.5t16.5 -52.5l-278 -482v-497q309 23 437 358q18 46 26 84t18 73t38 35q42 0 42 -40zM641 84v355l-177 -307q82 -41 177 -48z" />
+<glyph unicode="&#x2ade;" horiz-adv-x="878" d="M708 -90q0 -39 -41 -39t-41 39v631h-502q-39 0 -39 41t39 41h502v632q0 37 41 37t41 -37v-1345z" />
+<glyph unicode="&#x2adf;" horiz-adv-x="1591" d="M1506 582q0 -41 -39 -41h-631v-502q0 -39 -41 -39t-41 39v502h-632q-37 0 -37 41t37 41h1345q39 0 39 -41z" />
+<glyph unicode="&#x2ae0;" horiz-adv-x="1591" d="M1506 41q0 -41 -39 -41h-1345q-37 0 -37 41t37 41h632v502q0 39 41 39t41 -39v-502h631q39 0 39 -41z" />
+<glyph unicode="&#x2ae1;" horiz-adv-x="1591" d="M1479 41q0 -41 -37 -41h-1288q-39 0 -39 41t39 41h602v1245q0 37 41 37t41 -37v-1245h604q37 0 37 -41zM1105 738q34 -16 136 -35.5t159 -74t57 -146.5t-68 -145t-169.5 -53t-169.5 65q-53 -65 -67.5 -65t-14.5 23v225q0 23 19 23q15 0 21 -25q26 -103 64 -150 q51 -63 144 -63q169 0 169 137q0 71 -68 106q-31 16 -138 41.5t-147 58.5q-64 52 -64 136.5t70 130t160.5 45.5t148.5 -42q40 42 56.5 42t16.5 -23v-178q0 -24 -20 -24q-16 0 -20 25.5t-6 46.5q-22 125 -167 125q-168 0 -168 -114q0 -60 66 -92z" />
+<glyph unicode="&#x2ae2;" horiz-adv-x="1251" d="M1135 232q0 -41 -37 -41h-901v-281q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-282h901q37 0 37 -41t-37 -41h-901v-268h901q37 0 37 -41t-37 -41h-901v-268h901q37 0 37 -41z" />
+<glyph unicode="&#x2ae3;" horiz-adv-x="1479" d="M1362 39q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-1345zM965 39q0 -39 -41 -39t-41 39v631h-731q-37 0 -37 41t37 41h731v632q0 37 41 37t41 -37v-1345z" />
+<glyph unicode="&#x2ae4;" horiz-adv-x="1251" d="M1135 39q0 -39 -41 -39t-41 39v432h-901q-37 0 -37 41t37 41h901v315h-901q-37 0 -37 41t37 41h901v434q0 37 41 37t41 -37v-1345z" />
+<glyph unicode="&#x2ae5;" horiz-adv-x="1479" d="M1362 39q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-1345zM965 39q0 -39 -41 -39t-41 39v432h-731q-37 0 -37 41t37 41h731v315h-731q-37 0 -37 41t37 41h731v434q0 37 41 37t41 -37v-1345z" />
+<glyph unicode="&#x2ae6;" horiz-adv-x="1479" d="M1362 711q0 -41 -37 -41h-731v-631q0 -39 -41 -39t-41 39v631h-315v-631q0 -39 -41 -39t-41 39v1345q0 37 41 37t41 -37v-632h315v632q0 37 41 37t41 -37v-632h731q37 0 37 -41z" />
+<glyph unicode="&#x2ae7;" horiz-adv-x="1591" d="M1506 582q0 -41 -39 -41h-631v-502q0 -39 -41 -39t-41 39v502h-632q-37 0 -37 41t37 41h1345q39 0 39 -41zM1506 882q0 -41 -39 -41h-1345q-37 0 -37 41t37 41h1345q39 0 39 -41z" />
+<glyph unicode="&#x2ae8;" horiz-adv-x="1591" d="M1506 41q0 -41 -39 -41h-1345q-37 0 -37 41t37 41h632v502q0 39 41 39t41 -39v-502h631q39 0 39 -41zM1506 -259q0 -41 -39 -41h-1345q-37 0 -37 41t37 41h1345q39 0 39 -41z" />
+<glyph unicode="&#x2ae9;" horiz-adv-x="1591" d="M1506 882q0 -41 -39 -41h-1345q-37 0 -37 41t37 41h632v502q0 39 41 39t41 -39v-502h631q39 0 39 -41zM1506 582q0 -41 -39 -41h-631v-502q0 -39 -41 -39t-41 39v502h-632q-37 0 -37 41t37 41h1345q39 0 39 -41z" />
+<glyph unicode="&#x2aea;" horiz-adv-x="1591" d="M1479 1323q0 -41 -37 -41h-404v-1243q0 -39 -41 -39t-41 39v1243h-318v-1243q0 -39 -41 -39t-41 39v1243h-402q-39 0 -39 41t39 41h1288q37 0 37 -41z" />
+<glyph unicode="&#x2aeb;" horiz-adv-x="1591" d="M1479 41q0 -41 -37 -41h-1288q-39 0 -39 41t39 41h402v1243q0 39 41 39t41 -39v-1243h318v1243q0 39 41 39t41 -39v-1243h404q37 0 37 -41z" />
+<glyph unicode="&#x2aec;" horiz-adv-x="1592" d="M1372 37q0 -37 -41 -37t-41 37v422h-953q-48 0 -82.5 37t-34.5 86t34.5 86t82.5 37h994q41 0 41 -39v-629zM1290 541v82h-953q-35 0 -35 -41t35 -41h953z" />
+<glyph unicode="&#x2aed;" horiz-adv-x="1592" d="M1372 582q0 -49 -34.5 -86t-82.5 -37h-953v-422q0 -37 -41 -37t-41 37v629q0 39 41 39h994q48 0 82.5 -37t34.5 -86zM1290 582q0 41 -35 41h-953v-82h953q35 0 35 41z" />
+<glyph unicode="&#x2aee;" horiz-adv-x="455" d="M283 -4q0 -41 -41 -41t-41 41v414l-156 -160q-15 -16 -30 -16q-13 0 -27 14t-14 28t14 29l213 223v312q0 43 41 43t41 -43v-226l155 160q15 15 30 15t28 -13q15 -15 15 -30q0 -13 -13 -27l-215 -223v-500z" />
+<glyph unicode="&#x2aef;" horiz-adv-x="722" d="M590.5 1410.5q96.5 -95.5 96.5 -223.5t-81.5 -220.5t-203.5 -108.5v-1163q0 -37 -41 -37t-41 37v1163q-121 15 -203 108.5t-82 221.5t96 223t229.5 95t230 -95.5zM533 1010q72 72 72 171.5t-72.5 171t-171.5 71.5t-171.5 -71.5t-72.5 -171t72 -171.5t172 -72t172 72z" />
+<glyph unicode="&#x2af0;" horiz-adv-x="722" d="M605.5 197.5q81.5 -92.5 81.5 -220.5t-96.5 -223.5t-230 -95.5t-229.5 95t-96 223t82 221.5t203 108.5v1163q0 37 41 37t41 -37v-1163q122 -16 203.5 -108.5zM532.5 -188.5q72.5 71.5 72.5 171t-72 171.5t-172 72t-172 -72t-72 -171.5t72.5 -171t171.5 -71.5t171.5 71.5z " />
+<glyph unicode="&#x2af1;" horiz-adv-x="722" d="M722 1465q0 -41 -37 -41h-283v-1118q122 -16 203.5 -108.5t81.5 -220.5t-96.5 -223.5t-230 -95.5t-229.5 95t-96 223t82 221.5t203 108.5v1118h-281q-39 0 -39 41t39 41h646q37 0 37 -41zM532.5 -188.5q72.5 71.5 72.5 171t-72 171.5t-172 72t-172 -72t-72 -171.5 t72.5 -171t171.5 -71.5t171.5 71.5z" />
+<glyph unicode="&#x2af2;" horiz-adv-x="797" d="M690 -4q0 -41 -41 -41t-41 41v588l-399 -238v-350q0 -41 -41 -41t-41 41v301l-94 -55q-13 -8 -24 -8q-19 0 -32 22q-8 14 -8 25q0 19 23 32l135 80v447q0 43 41 43t41 -43v-400l399 238v162q0 43 41 43t41 -43v-113l94 55q13 8 24 8q19 0 32 -22q8 -14 8 -25 q0 -19 -23 -32l-135 -80v-635z" />
+<glyph unicode="&#x2af3;" horiz-adv-x="1592" d="M1477 746q0 -152 -96 -271.5t-244 -119.5q-51 0 -101 16v-776q0 -37 -41 -37t-41 37v812q-56 33 -158.5 118t-157.5 117v-1047q0 -37 -41 -37t-41 37v1084q-50 16 -101 16q-162 0 -245 -147q-29 -52 -38 -142q-5 -51 -29 -51q-28 0 -28 63q0 152 95.5 271.5t244.5 119.5 q51 0 101 -16v776q0 37 41 37t41 -37v-812q58 -32 160.5 -117t155.5 -117v1046q0 37 41 37t41 -37v-1083q50 -17 101 -17q85 0 156 50t104 130q15 36 21 98t30 62q29 0 29 -63z" />
+<glyph unicode="&#x2af4;" horiz-adv-x="1422" d="M1150 -205q0 -37 -41 -37t-41 37v1574q0 37 41 37t41 -37v-1574zM752 -205q0 -37 -41 -37t-41 37v1574q0 37 41 37t41 -37v-1574zM354 -205q0 -37 -41 -37t-41 37v1574q0 37 41 37t41 -37v-1574z" />
+<glyph unicode="&#x2af5;" horiz-adv-x="1990" d="M1820 582q0 -41 -37 -41h-349v-846q0 -37 -41 -37t-41 37v846h-316v-846q0 -37 -41 -37t-41 37v846h-316v-846q0 -37 -41 -37t-41 37v846h-347q-39 0 -39 41t39 41h347v846q0 37 41 37t41 -37v-846h316v846q0 37 41 37t41 -37v-846h316v846q0 37 41 37t41 -37v-846h349 q37 0 37 -41z" />
+<glyph unicode="&#x2af6;" horiz-adv-x="683" d="M421 1160.5q34 -33.5 34 -79t-34 -79t-80 -33.5t-79 33.5t-33 80t33 79t79 32.5t80 -33.5zM421 660.5q34 -33.5 34 -79t-34 -79t-80 -33.5t-79 33.5t-33 80t33 79t79 32.5t80 -33.5zM421 160.5q34 -33.5 34 -79t-34 -79t-80 -33.5t-79 33.5t-33 80t33 79t79 32.5 t80 -33.5z" />
+<glyph unicode="&#x2af7;" horiz-adv-x="2506" d="M2336 184q0 -41 -41 -41q-7 0 -14 3l-844 399q-27 13 -27 37t27 37l844 399q7 3 14 3q41 0 41 -41q0 -26 -24 -37l-765 -361l765 -361q24 -11 24 -37zM2336 -108q0 -41 -41 -41q-7 0 -14 3l-1464 691q-27 13 -27 37t27 37l1464 691q7 3 14 3q41 0 41 -41q0 -26 -24 -37 l-1385 -653l1385 -653q24 -11 24 -37zM2336 -401q0 -41 -41 -41q-7 0 -14 3l-2084 984q-27 13 -27 37t27 37l2084 984q7 3 14 3q41 0 41 -41q0 -26 -24 -37l-2005 -946l2005 -946q24 -11 24 -37z" />
+<glyph unicode="&#x2af8;" horiz-adv-x="2506" d="M2336 582q0 -24 -27 -37l-2084 -984q-7 -3 -14 -3q-41 0 -41 41q0 26 24 37l2005 946l-2005 946q-24 11 -24 37q0 41 41 41q7 0 14 -3l2084 -984q27 -13 27 -37zM1716 582q0 -24 -27 -37l-1464 -691q-7 -3 -14 -3q-41 0 -41 41q0 26 24 37l1385 653l-1385 653 q-24 11 -24 37q0 41 41 41q7 0 14 -3l1464 -691q27 -13 27 -37zM1096 582q0 -24 -27 -37l-844 -399q-7 -3 -14 -3q-41 0 -41 41q0 26 24 37l765 361l-765 361q-24 11 -24 37q0 41 41 41q7 0 14 -3l844 -399q27 -13 27 -37z" />
+<glyph unicode="&#x2af9;" horiz-adv-x="1591" d="M1421 428q0 -41 -41 -41q-10 0 -14 2l-1169 553q-27 13 -27 37.5t20 33.5l1176 555q4 5 14 5q41 0 41 -41q0 -26 -18 -35l-1096 -518l1090 -514q24 -11 24 -37zM1421 30q0 -41 -41 -41q-8 0 -14 3l-1176 555q-20 9 -20 34q0 41 41 41q12 0 16 -2l1176 -555q18 -8 18 -35z M1421 -367q0 -41 -41 -41q-8 0 -14 3l-1176 555q-20 9 -20 34q0 41 41 41q12 0 16 -2l1176 -555q18 -8 18 -35z" />
+<glyph unicode="&#x2afa;" horiz-adv-x="1591" d="M1401 1013q20 -9 20 -33.5t-27 -37.5l-1169 -553q-4 -2 -14 -2q-41 0 -41 41q0 26 24 37l1090 514l-1096 518q-18 9 -18 35q0 41 41 41q10 0 14 -5zM1421 581q0 -25 -20 -34l-1176 -555q-6 -3 -14 -3q-41 0 -41 41q0 27 18 35l1176 555q4 2 16 2q41 0 41 -41zM1421 184 q0 -25 -20 -34l-1176 -555q-6 -3 -14 -3q-41 0 -41 41q0 27 18 35l1176 555q4 2 16 2q41 0 41 -41z" />
+<glyph unicode="&#x2afb;" horiz-adv-x="1469" d="M669 1568q0 -9 -8 -36l-576 -1927q-14 -47 -43 -47q-42 0 -42 38q0 9 8 36l576 1927q14 47 43 47q42 0 42 -38zM1069 1568q0 -9 -8 -36l-576 -1927q-14 -47 -43 -47q-42 0 -42 38q0 9 8 36l576 1927q14 47 43 47q42 0 42 -38zM1469 1568q0 -9 -8 -36l-576 -1927 q-14 -47 -43 -47q-42 0 -42 38q0 9 8 36l576 1927q14 47 43 47q42 0 42 -38z" />
+<glyph unicode="&#x2afc;" horiz-adv-x="1422" d="M1150 -405q0 -37 -41 -37t-41 37v1974q0 37 41 37t41 -37v-1974zM752 -405q0 -37 -41 -37t-41 37v1974q0 37 41 37t41 -37v-1974zM354 -405q0 -37 -41 -37t-41 37v1974q0 37 41 37t41 -37v-1974z" />
+<glyph unicode="&#x2afd;" horiz-adv-x="1069" d="M669 1568q0 -9 -8 -36l-576 -1927q-14 -47 -43 -47q-42 0 -42 38q0 9 8 36l576 1927q14 47 43 47q42 0 42 -38zM1069 1568q0 -9 -8 -36l-576 -1927q-14 -47 -43 -47q-42 0 -42 38q0 9 8 36l576 1927q14 47 43 47q42 0 42 -38z" />
+<glyph unicode="&#x2afe;" horiz-adv-x="790" d="M518 -125q0 -48 -37 -82.5t-86 -34.5t-86 34.5t-37 82.5v1414q0 48 37 82.5t86 34.5t86 -34.5t37 -82.5v-1414zM436 -125v1414q0 35 -41 35t-41 -35v-1414q0 -35 41 -35t41 35z" />
+<glyph unicode="&#x2aff;" horiz-adv-x="790" d="M518 -325q0 -48 -37 -82.5t-86 -34.5t-86 34.5t-37 82.5v1814q0 48 37 82.5t86 34.5t86 -34.5t37 -82.5v-1814zM436 -325v1814q0 35 -41 35t-41 -35v-1814q0 -35 41 -35t41 35z" />
+<glyph unicode="&#x2b00;" d="M1943 -49q12 -12 12 -29t-9 -26l-286 -285q-10 -10 -26.5 -10t-28.5 12l-1122 1123q-8 8 -19 8t-19 -8l-195 -195q-7 -7 -16 -7t-28.5 17.5t-19.5 23.5t2 14q53 201 53 331q0 228 -99 428l-44 88q0 22 23 22q-2 0 87 -44q198 -98 428 -98q61 0 176.5 27t165.5 27 q9 0 26.5 -19.5t17.5 -28.5t-7 -16l-195 -195q-7 -7 -7 -18t8 -19zM1840 -96q7 7 7 17t-9 19l-1123 1124q-13 13 -13 29t11 27l140 140q-128 -20 -212 -20q-217 0 -405 80q81 -190 81 -405q0 -78 -21 -212l140 140q11 11 28 11t29 -12l1123 -1124q8 -8 19 -8t17 6z" />
+<glyph unicode="&#x2b01;" d="M1812 920q0 -130 53 -331q2 -8 2 -14t-19.5 -23.5t-28.5 -17.5t-16 7l-195 195q-8 8 -19 8t-19 -8l-1122 -1123q-12 -12 -28.5 -12t-26.5 10l-286 285q-9 9 -9 26t12 29l1122 1123q8 8 8 19t-7 18l-195 195q-7 7 -7 16t17.5 28.5t26.5 19.5q50 0 165.5 -27t176.5 -27 q230 0 428 98l87 44q23 0 23 -22l-44 -88q-99 -200 -99 -428zM1412 1240q-84 0 -212 20l140 -140q11 -11 11 -27t-13 -29l-1123 -1124q-9 -9 -9 -19t7 -17l188 -188q6 -6 17 -6t19 8l1123 1124q12 12 29 12t28 -11l140 -140q-21 134 -21 212q0 215 81 405q-188 -80 -405 -80 z" />
+<glyph unicode="&#x2b02;" d="M1932 -399q2 0 -87 44q-198 98 -428 98q-61 0 -176.5 -27t-165.5 -27q-9 0 -26.5 19.5t-17.5 28.5t7 16l195 195q7 7 7 18t-8 19l-1122 1123q-12 12 -12 29t9 26l286 285q10 10 26.5 10t28.5 -12l1122 -1123q8 -8 19 -8t19 8l195 195q7 7 16 7t28.5 -17.5t19.5 -23.5 t-2 -14q-53 -201 -53 -331q0 -228 99 -428l44 -88q0 -22 -23 -22zM1736 144q0 78 21 212l-140 -140q-11 -11 -28 -11t-29 12l-1123 1124q-8 8 -19 8t-17 -6l-188 -188q-7 -7 -7 -17t9 -19l1123 -1124q13 -13 13 -29t-11 -27l-140 -140q128 20 212 20q217 0 405 -80 q-81 190 -81 405z" />
+<glyph unicode="&#x2b03;" d="M1946 1163q9 -9 9 -26t-12 -29l-1122 -1123q-8 -8 -8 -19t7 -18l195 -195q7 -7 7 -16t-17.5 -28.5t-26.5 -19.5q-50 0 -165.5 27t-176.5 27q-230 0 -428 -98l-87 -44q-23 0 -23 22l44 88q99 200 99 428q0 130 -53 331q-2 8 -2 14t19.5 23.5t28.5 17.5t16 -7l195 -195 q8 -8 19 -8t19 8l1122 1123q12 12 28.5 12t26.5 -10zM1838 1119q9 9 9 19t-7 17l-188 188q-6 6 -17 6t-19 -8l-1123 -1124q-12 -12 -29 -12t-28 11l-140 140q21 -134 21 -212q0 -215 -81 -405q188 80 405 80q84 0 212 -20l-140 140q-11 11 -11 27t13 29z" />
+<glyph unicode="&#x2b04;" horiz-adv-x="2548" d="M2433 582q0 -16 -18 -23l-80 -24q-164 -55 -302.5 -169t-266.5 -335q-8 -13 -14 -13h-14q-10 -1 -14 -1q-36 0 -36 24v276q0 26 -27 26h-774q-27 0 -27 -26v-276q0 -24 -36 -24q-4 0 -13.5 0.5t-15 0.5t-13.5 13q-128 221 -266.5 335t-302.5 169q-27 7 -80 24 q-18 7 -18 23t18 23l80 24q164 55 302.5 169t266.5 335q8 13 13.5 13t15 0.5t13.5 0.5q36 0 36 -24v-276q0 -26 27 -26h774q27 0 27 26v276q0 24 36 24h14q9 -1 14.5 -1t13.5 -13q128 -221 266.5 -335t302.5 -169q27 -7 80 -24q18 -7 18 -23zM1770 778q0 -39 -41 -39h-910 q-41 0 -41 39v198q-74 -101 -125 -154q-155 -160 -354 -240q199 -80 354 -240q51 -53 125 -154v198q0 39 41 39h910q41 0 41 -39v-198q74 101 125 154q155 160 354 240q-199 80 -354 240q-51 53 -125 154v-198z" />
+<glyph unicode="&#x2b05;" d="M1933 380q0 -37 -41 -37h-1005q-27 0 -27 -26v-276q0 -24 -36 -24q-4 0 -13.5 0.5t-15 0.5t-13.5 13q-128 221 -266.5 335t-302.5 169q-27 7 -80 24q-18 7 -18 23t18 23l80 24q164 55 302.5 169t266.5 335q8 13 13.5 13t15 0.5t13.5 0.5q36 0 36 -24v-276q0 -26 27 -26 h1005q41 0 41 -37v-404z" />
+<glyph unicode="&#x2b06;" horiz-adv-x="1250" d="M1190 773q0 -36 -24 -36h-276q-26 0 -26 -27v-987q0 -41 -37 -41h-404q-37 0 -37 41v987q0 27 -26 27h-276q-24 0 -24 36q0 4 0.5 13.5t0.5 15t13 13.5q221 128 335 266.5t169 302.5q7 27 24 80q7 18 23 18t23 -18l24 -80q55 -164 169 -302.5t335 -266.5q13 -8 13 -13.5 t0.5 -15t0.5 -13.5z" />
+<glyph unicode="&#x2b07;" horiz-adv-x="1250" d="M1190 391v-14q-1 -9 -1 -14.5t-13 -13.5q-221 -128 -335 -266.5t-169 -302.5q-7 -27 -24 -80q-7 -18 -23 -18t-23 18l-24 80q-55 164 -169 302.5t-335 266.5q-13 8 -13 13v15q-1 10 -1 14q0 36 24 36h276q26 0 26 27v987q0 41 37 41h404q37 0 37 -41v-987q0 -27 26 -27 h276q24 0 24 -36z" />
+<glyph unicode="&#x2b08;" d="M1943 -49q12 -12 12 -29t-9 -26l-286 -285q-10 -10 -26.5 -10t-28.5 12l-1122 1123q-8 8 -19 8t-19 -8l-195 -195q-7 -7 -16 -7t-28.5 17.5t-19.5 23.5t2 14q53 201 53 331q0 228 -99 428l-44 88q0 22 23 22q-2 0 87 -44q198 -98 428 -98q61 0 176.5 27t165.5 27 q9 0 26.5 -19.5t17.5 -28.5t-7 -16l-195 -195q-7 -7 -7 -18t8 -19z" />
+<glyph unicode="&#x2b09;" d="M1812 920q0 -130 53 -331q2 -8 2 -14t-19.5 -23.5t-28.5 -17.5t-16 7l-195 195q-8 8 -19 8t-19 -8l-1122 -1123q-12 -12 -28.5 -12t-26.5 10l-286 285q-9 9 -9 26t12 29l1122 1123q8 8 8 19t-7 18l-195 195q-7 7 -7 16t17.5 28.5t26.5 19.5q50 0 165.5 -27t176.5 -27 q230 0 428 98l87 44q23 0 23 -22l-44 -88q-99 -200 -99 -428z" />
+<glyph unicode="&#x2b0a;" d="M1932 -399q2 0 -87 44q-198 98 -428 98q-61 0 -176.5 -27t-165.5 -27q-9 0 -26.5 19.5t-17.5 28.5t7 16l195 195q7 7 7 18t-8 19l-1122 1123q-12 12 -12 29t9 26l286 285q10 10 26.5 10t28.5 -12l1122 -1123q8 -8 19 -8t19 8l195 195q7 7 16 7t28.5 -17.5t19.5 -23.5 t-2 -14q-53 -201 -53 -331q0 -228 99 -428l44 -88q0 -22 -23 -22z" />
+<glyph unicode="&#x2b0b;" d="M1946 1163q9 -9 9 -26t-12 -29l-1122 -1123q-8 -8 -8 -19t7 -18l195 -195q7 -7 7 -16t-17.5 -28.5t-26.5 -19.5q-50 0 -165.5 27t-176.5 27q-230 0 -428 -98l-87 -44q-23 0 -23 22l44 88q99 200 99 428q0 130 -53 331q-2 8 -2 14t19.5 23.5t28.5 17.5t16 -7l195 -195 q8 -8 19 -8t19 8l1122 1123q12 12 28.5 12t26.5 -10z" />
+<glyph unicode="&#x2b0c;" horiz-adv-x="2548" d="M2433 582q0 -16 -18 -23l-80 -24q-164 -55 -302.5 -169t-266.5 -335q-8 -13 -14 -13h-14q-10 -1 -14 -1q-36 0 -36 24v276q0 26 -27 26h-774q-27 0 -27 -26v-276q0 -24 -36 -24q-4 0 -13.5 0.5t-15 0.5t-13.5 13q-128 221 -266.5 335t-302.5 169q-27 7 -80 24 q-18 7 -18 23t18 23l80 24q164 55 302.5 169t266.5 335q8 13 13.5 13t15 0.5t13.5 0.5q36 0 36 -24v-276q0 -26 27 -26h774q27 0 27 26v276q0 24 36 24h14q9 -1 14.5 -1t13.5 -13q128 -221 266.5 -335t302.5 -169q27 -7 80 -24q18 -7 18 -23z" />
+<glyph unicode="&#x2b0d;" horiz-adv-x="1250" d="M1190 267v-14q-1 -9 -1 -14.5t-13 -13.5q-221 -128 -335 -266.5t-169 -302.5q-7 -27 -24 -80q-7 -18 -23 -18t-23 18l-24 80q-55 164 -169 302.5t-335 266.5q-13 8 -13 13v15q-1 10 -1 14q0 36 24 36h276q26 0 26 27v504q0 27 -26 27h-276q-24 0 -24 36q0 4 0.5 13.5 t0.5 15t13 13.5q221 128 335 266.5t169 302.5q7 27 24 80q7 18 23 18t23 -18l24 -80q55 -164 169 -302.5t335 -266.5q13 -8 13 -13.5t0.5 -15t0.5 -13.5q0 -36 -24 -36h-276q-26 0 -26 -27v-504q0 -27 26 -27h276q24 0 24 -36z" />
+<glyph unicode="&#x2b0e;" d="M1931 153q0 -24 -23 -34l-62 -27q-149 -75 -237 -230q-15 -27 -26 -27t-26 27q-87 154 -236 230l-58 25q-26 12 -26 36q0 42 39 42q7 0 15 -3q144 -52 251 -178v527h-1386q-41 0 -41 41t41 41h1427q41 0 41 -41v-569q107 127 253 179q8 3 15 3q39 0 39 -42z" />
+<glyph unicode="&#x2b0f;" d="M1931 1011q0 -42 -39 -42q-7 0 -15 3q-146 52 -253 179v-569q0 -41 -41 -41h-1427q-41 0 -41 41t41 41h1386v527q-107 -126 -251 -178q-8 -3 -15 -3q-39 0 -39 42q0 24 23 34l61 27q149 76 236 230q15 27 26 27t26 -27q88 -155 237 -230q20 -8 59 -25q26 -12 26 -36z" />
+<glyph unicode="&#x2b10;" d="M1931 582q0 -41 -41 -41h-1386v-527q107 126 251 178q8 3 15 3q39 0 39 -42q0 -24 -23 -34l-61 -27q-149 -76 -236 -230q-15 -27 -26 -27t-26 27q-88 155 -237 230q-20 8 -59 25q-26 12 -26 36q0 42 39 42q7 0 15 -3q146 -52 253 -179v569q0 41 41 41h1427q41 0 41 -41z " />
+<glyph unicode="&#x2b11;" d="M1931 582q0 -41 -41 -41h-1427q-41 0 -41 41v569q-107 -127 -253 -179q-8 -3 -15 -3q-39 0 -39 42q0 24 23 34l62 27q149 75 237 230q15 27 26 27t26 -27q87 -154 236 -230l58 -25q26 -12 26 -36q0 -42 -39 -42q-7 0 -15 3q-144 52 -251 178v-527h1386q41 0 41 -41z" />
+<glyph unicode="&#x2b12;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 10v572h-1144v-572h1144z" />
+<glyph unicode="&#x2b13;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 582v572h-1144v-572h1144z" />
+<glyph unicode="&#x2b14;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM217 10h1144l-1144 1144v-1144z" />
+<glyph unicode="&#x2b15;" horiz-adv-x="1578" d="M1461 -90h-1344v1344h1344v-1344zM1361 1154h-1144l1144 -1144v1144z" />
+<glyph unicode="&#x2b16;" horiz-adv-x="1578" d="M1568 582l-779 -779l-779 779l779 779zM1427 582l-638 638v-1276z" />
+<glyph unicode="&#x2b17;" horiz-adv-x="1578" d="M1568 582l-779 -779l-779 779l779 779zM789 -56v1276l-638 -638z" />
+<glyph unicode="&#x2b18;" horiz-adv-x="1578" d="M1568 582l-779 -779l-779 779l779 779zM1427 582h-1276l638 -638z" />
+<glyph unicode="&#x2b19;" horiz-adv-x="1578" d="M1568 582l-779 -779l-779 779l779 779zM1427 582l-638 638l-638 -638h1276z" />
+<glyph unicode="&#x2b1a;" horiz-adv-x="1578" d="M1461 1102h-100v52h-52v100h152v-152zM1223 1154h-152v100h152v-100zM1461 864h-100v152h100v-152zM984 1154h-152v100h152v-100zM1461 625h-100v152h100v-152zM746 1154h-152v100h152v-100zM1461 387h-100v152h100v-152zM507 1154h-152v100h152v-100zM1461 148h-100v152 h100v-152zM269 1154h-52v-52h-100v152h152v-100zM1461 -90h-152v100h52v52h100v-152zM217 864h-100v152h100v-152zM1223 -90h-152v100h152v-100zM217 625h-100v152h100v-152zM984 -90h-152v100h152v-100zM217 387h-100v152h100v-152zM746 -90h-152v100h152v-100zM217 148 h-100v152h100v-152zM507 -90h-152v100h152v-100zM269 -90h-152v152h100v-52h52v-100z" />
+<glyph unicode="&#x2b1b;" d="M1908 -302h-1768v1768h1768v-1768z" />
+<glyph unicode="&#x2b1c;" d="M1908 -302h-1768v1768h1768v-1768zM1808 -202v1568h-1568v-1568h1568z" />
+<glyph unicode="&#x2b1d;" horiz-adv-x="580" d="M515 357h-450v450h450v-450z" />
+<glyph unicode="&#x2b1e;" horiz-adv-x="580" d="M515 357h-450v450h450v-450zM415 457v250h-250v-250h250z" />
+<glyph unicode="&#x2b1f;" horiz-adv-x="1734" d="M1636 833l-294 -903h-950l-294 903l769 558z" />
+<glyph unicode="&#x2b20;" horiz-adv-x="1734" d="M1636 833l-294 -903h-950l-294 903l769 558zM1518 795l-651 472l-651 -472l249 -765h804z" />
+<glyph unicode="&#x2b21;" horiz-adv-x="1638" d="M1521 177l-702 -404l-702 404v810l702 404l702 -404v-810zM1421 235v694l-602 347l-602 -347v-694l602 -347z" />
+<glyph unicode="&#x2b22;" horiz-adv-x="1638" d="M1521 177l-702 -404l-702 404v810l702 404l702 -404v-810z" />
+<glyph unicode="&#x2b23;" horiz-adv-x="1654" d="M1636 582l-404 -702h-810l-404 702l404 702h810z" />
+<glyph unicode="&#x2b24;" d="M2008 582q0 -410 -287 -697t-697 -287t-697 287t-287 697t287 697t697 287t697 -287t287 -697z" />
+<glyph unicode="&#x2b25;" horiz-adv-x="946" d="M924 582l-451 -451l-451 451l451 451z" />
+<glyph unicode="&#x2b26;" horiz-adv-x="946" d="M924 582l-451 -451l-451 451l451 451zM783 582l-310 310l-310 -310l310 -310z" />
+<glyph unicode="&#x2b27;" horiz-adv-x="738" d="M710 582l-341 -451l-341 451l341 451z" />
+<glyph unicode="&#x2b28;" horiz-adv-x="946" d="M814 582l-341 -451l-341 451l341 451zM689 582l-216 285l-216 -285l216 -285z" />
+<glyph unicode="&#x2b29;" horiz-adv-x="738" d="M712 582l-343 -343l-343 343l343 343z" />
+<glyph unicode="&#x2b2a;" horiz-adv-x="580" d="M549 582l-259 -343l-259 343l259 343z" />
+<glyph unicode="&#x2b2b;" horiz-adv-x="738" d="M628 582l-259 -343l-259 343l259 343zM503 582l-134 177l-134 -177l134 -177z" />
+<glyph unicode="&#x2b2c;" horiz-adv-x="1750" d="M1710 582q0 -260 -300 -416q-247 -128 -535 -128t-535 128q-300 156 -300 416t300 416q247 128 535 128t535 -128q300 -156 300 -416z" />
+<glyph unicode="&#x2b2d;" horiz-adv-x="1750" d="M1710 582q0 -260 -300 -416q-247 -128 -535 -128t-535 128q-300 156 -300 416t300 416q247 128 535 128t535 -128q300 -156 300 -416zM1610 582q0 196 -246 327q-221 117 -489 117t-489 -117q-246 -131 -246 -327t246 -327q221 -117 489 -117t489 117q246 131 246 327z " />
+<glyph unicode="&#x2b2e;" horiz-adv-x="1288" d="M1188 582q0 -288 -128 -535q-156 -300 -416 -300t-416 300q-128 247 -128 535t128 535q156 300 416 300t416 -300q128 -247 128 -535z" />
+<glyph unicode="&#x2b2f;" horiz-adv-x="1288" d="M1188 582q0 -288 -128 -535q-156 -300 -416 -300t-416 300q-128 247 -128 535t128 535q156 300 416 300t416 -300q128 -247 128 -535zM1088 582q0 268 -117 489q-131 246 -327 246t-327 -246q-117 -221 -117 -489t117 -489q131 -246 327 -246t327 246q117 221 117 489z " />
+<glyph unicode="&#x2b30;" d="M1931 582q0 -41 -39 -41h-277q-16 -145 -125 -243.5t-256 -98.5t-256 98.5t-125 243.5h-515q222 -157 287 -431q8 -34 8 -36q0 -27 -21 -27q-47 0 -53 6t-8 13q-22 84 -35.5 123t-43.5 90q-106 182 -296 265l-47 18q-14 6 -14 22t25 27l40 14q210 91 317 310 q24 49 54 163q5 19 20 19q44 0 41 1q21 -4 21 -28q0 -58 -57 -179q-84 -177 -238 -288h515q16 145 125 243.5t256 98.5t256 -98.5t125 -243.5h277q39 0 39 -41zM1234 883q-113 0 -198 -74.5t-100 -185.5h596q-15 111 -100 185.5t-198 74.5zM1234 281q113 0 198 74.5 t100 185.5h-596q15 -111 100 -185.5t198 -74.5z" />
+<glyph unicode="&#x2b31;" d="M397 0q223 -135 293 -414q0 -22 -63 -22q-13 0 -19 14q-6 22 -19 65q-46 132 -150.5 229.5t-238.5 132.5q-23 3 -67 13q-18 6 -18 23t18 23q23 4 67 13q205 54 325 235q-120 180 -325 234q-23 3 -67 13q-18 6 -18 23t18 23q23 4 67 13q205 54 325 235q-120 180 -325 234 q-23 3 -67 13q-18 6 -18 23t18 23q23 4 67 13q134 35 238.5 132.5t150.5 229.5q6 22 19 65q6 14 19 14q63 0 63 -22l-2 -6q-29 -104 -59 -161q-83 -157 -232 -247h1499q37 0 37 -41t-37 -41h-1499q140 -85 222 -229q-82 -145 -222 -230h1499q37 0 37 -41t-37 -41h-1499 q140 -85 222 -229q-82 -145 -222 -230h1499q37 0 37 -41t-37 -41h-1499z" />
+<glyph unicode="&#x2b32;" horiz-adv-x="3008" d="M2891 582q0 -41 -39 -41h-481q-16 -285 -225.5 -483.5t-496.5 -198.5t-495.5 199t-224.5 483h-591q222 -157 287 -431q8 -34 8 -36q0 -27 -21 -27q-47 0 -53 6t-8 13q-22 84 -35.5 123t-43.5 90q-106 182 -296 265l-47 18q-14 6 -14 22t25 27l40 14q210 91 317 310 q24 49 54 163q5 19 20 19q44 0 41 1q21 -4 21 -28q0 -58 -57 -179q-84 -177 -238 -288h591q16 285 224 483.5t496.5 198.5t497 -198t224.5 -484h481q39 0 39 -41zM1692 623h597q-15 241 -186 412t-411 187v-599zM1610 623v599q-241 -15 -412 -186.5t-187 -412.5h599z M1692 541v-599q239 16 410 187.5t187 411.5h-597zM1610 541h-599q16 -240 187.5 -412t411.5 -187v599z" />
+<glyph unicode="&#x2b33;" horiz-adv-x="3008" d="M2891 582q0 -41 -41 -41q-14 0 -30 14l-160 142l-348 -314q-13 -12 -31 -12t-31 12l-348 314l-348 -314q-13 -12 -31 -12t-31 12l-348 314l-158 -142q-16 -14 -32 -14h-658q126 -107 178 -251q3 -8 3 -15q0 -39 -42 -39q-24 0 -34 22l-27 62q-76 149 -230 236 q-27 15 -27 26t27 26q155 88 230 237q8 20 25 59q12 26 36 26q42 0 42 -39q0 -7 -3 -15q-52 -146 -179 -253h642l176 158q13 12 31 12t31 -12l348 -314l348 314q13 12 31 12t31 -12l348 -314l348 314q13 12 31 12t31 -12l190 -170q10 -9 10 -29z" />
+<glyph unicode="&#x2b34;" d="M1931 582q0 -41 -39 -41h-415v-395q0 -39 -41 -39t-41 39v395h-667q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -134.5 295t-234.5 180h-234q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5 q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h229q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h667v397q0 37 41 37t41 -37v-397h415 q39 0 39 -41z" />
+<glyph unicode="&#x2b35;" d="M1931 582q0 -41 -39 -41h-215v-395q0 -39 -41 -39t-41 39v395h-218v-395q0 -39 -41 -39t-41 39v395h-567q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -134.5 295t-234.5 180h-234q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41 q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h229q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35 q-59 -266 -288 -432h567v397q0 37 41 37t41 -37v-397h218v397q0 37 41 37t41 -37v-397h215q39 0 39 -41z" />
+<glyph unicode="&#x2b36;" d="M1931 44q0 -62 -41 -62t-41 62v497h-1153q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -134.5 295t-234.5 180h-234q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18 q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h229q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h1153v498q0 61 41 61t41 -61v-1077z" />
+<glyph unicode="&#x2b37;" d="M1963 74q0 -27 -21 -27q-45 0 -36 -1q-20 2 -24 19t-12 48q-38 146 -132.5 257.5t-230.5 170.5h-37q-39 0 -39 41t39 41h37q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-26 -118 -93 -224q-97 -154 -247 -249q150 -95 247 -249 q67 -106 93 -224q7 -31 7 -35zM1261 582q0 -41 -37 -41h-194q-39 0 -39 41t39 41h194q37 0 37 -41zM1023 74q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -134.5 295t-234.5 180h-234q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5 t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h229q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h54q39 0 39 -41t-39 -41 h-54q228 -162 288 -432q7 -31 7 -35z" />
+<glyph unicode="&#x2b38;" d="M1931 582q0 -41 -37 -41h-54q-39 0 -39 41t39 41h54q37 0 37 -41zM1631 582q0 -41 -37 -41h-54q-39 0 -39 41t39 41h54q37 0 37 -41zM1331 582q0 -41 -37 -41h-54q-39 0 -39 41t39 41h54q37 0 37 -41zM1031 582q0 -41 -37 -41h-54q-39 0 -39 41t39 41h54q37 0 37 -41z M731 582q0 -41 -37 -41h-54q-39 0 -39 41t39 41h54q37 0 37 -41zM633 74q0 -27 -21 -27q-45 0 -36 -1q-20 2 -24 19t-12 48q-38 146 -132.5 257.5t-230.5 170.5q-16 5 -46 18q-16 9 -16 23t16 20q259 98 369 334q23 49 33 90l18 72q6 19 20 19h41q21 -3 21 -27q0 -4 -7 -35 q-60 -270 -288 -432h54q39 0 39 -41t-39 -41h-54q229 -166 288 -432q7 -31 7 -35z" />
+<glyph unicode="&#x2b39;" d="M1963 74q0 -27 -21 -27q-45 0 -36 -1q-20 2 -24 19t-12 48q-38 146 -132.5 257.5t-230.5 170.5h-328v-395q0 -39 -41 -39t-41 39v395h-759q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18 q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h759v397q0 37 41 37t41 -37v-397h328q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-26 -118 -93 -224q-97 -154 -247 -249 q150 -95 247 -249q67 -106 93 -224q7 -31 7 -35z" />
+<glyph unicode="&#x2b3a;" d="M1963 74q0 -27 -21 -27q-45 0 -36 -1q-20 2 -24 19t-12 48q-38 146 -132.5 257.5t-230.5 170.5h-218v-395q0 -39 -41 -39t-41 39v395h-218v-395q0 -39 -41 -39t-41 39v395h-569q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5 t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h569v397q0 37 41 37t41 -37v-397h218v397q0 37 41 37t41 -37v-397h218q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1 q21 0 21 -27q0 -4 -7 -35q-26 -118 -93 -224q-97 -154 -247 -249q150 -95 247 -249q67 -106 93 -224q7 -31 7 -35z" />
+<glyph unicode="&#x2b3b;" d="M1963 74q0 -27 -21 -27q-45 0 -36 -1q-20 2 -24 19t-12 48q-38 146 -132.5 257.5t-230.5 170.5h-779q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -134.5 295t-234.5 180h-234q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19 q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h229q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h779 q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-26 -118 -93 -224q-97 -154 -247 -249q150 -95 247 -249q67 -106 93 -224q7 -31 7 -35z" />
+<glyph unicode="&#x2b3c;" d="M1963 74q0 -27 -21 -27q-45 0 -36 -1q-20 2 -24 19t-12 48q-38 146 -132.5 257.5t-230.5 170.5h-188v-395q0 -39 -41 -39t-41 39v395h-509q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -134.5 295t-234.5 180h-234q228 -162 288 -432 q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h229q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1 q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h509v397q0 37 41 37t41 -37v-397h188q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-26 -118 -93 -224q-97 -154 -247 -249q150 -95 247 -249q67 -106 93 -224q7 -31 7 -35z" />
+<glyph unicode="&#x2b3d;" horiz-adv-x="2248" d="M2163 74q0 -27 -21 -27q-45 0 -36 -1q-20 2 -24 19t-12 48q-38 146 -132.5 257.5t-230.5 170.5h-128v-395q0 -39 -41 -39t-41 39v395h-218v-395q0 -39 -41 -39t-41 39v395h-469q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -134.5 295 t-234.5 180h-234q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h229q282 122 363 428 q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h469v397q0 37 41 37t41 -37v-397h218v397q0 37 41 37t41 -37v-397h128q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-26 -118 -93 -224 q-97 -154 -247 -249q150 -95 247 -249q67 -106 93 -224q7 -31 7 -35z" />
+<glyph unicode="&#x2b3e;" d="M1980 582q0 -41 -39 -41q-19 0 -31 14q-98 110 -148 151q-83 66 -162 66t-163 -66q-53 -43 -152.5 -156t-162.5 -161q-101 -77 -207.5 -77t-263 114.5t-240.5 114.5h-73q244 -175 295 -467q0 -27 -20 -27h-41q-18 0 -21 19q-31 171 -144.5 305t-276.5 191q-15 4 -15 20 t15 23q163 55 276.5 188.5t144.5 304.5q3 19 21 19h41q20 0 20 -27q-51 -292 -295 -467h73q105 0 264.5 -114.5t240.5 -114.5t164 65q52 41 153.5 156t160.5 161q102 78 206 78t205 -78q59 -46 164 -167q11 -13 11 -27z" />
+<glyph unicode="&#x2b3f;" d="M1931 582q0 -41 -39 -41h-450l274 -274q13 -13 13 -27t-15 -29t-29 -15t-27 13l-315 315l-315 -315q-13 -13 -27 -13t-29 15t-15 29t13 27l274 274h-906q222 -157 287 -431q8 -34 8 -36q0 -27 -21 -27q-47 0 -53 6t-8 13q-22 84 -35.5 123t-43.5 90q-106 182 -296 265 l-47 18q-14 6 -14 22t25 27l40 14q210 91 317 310q24 49 54 163q5 19 20 19q44 0 41 1q21 -4 21 -28q0 -58 -57 -179q-84 -177 -238 -288h906l-275 275q-26 26 3 55t55 3l316 -316l316 316q26 26 55 -3t3 -55l-275 -275h450q39 0 39 -41z" />
+<glyph unicode="&#x2b40;" d="M1831 1102q0 -41 -39 -41h-724q-37 0 -37 41t37 41h724q39 0 39 -41zM1831 842q0 -41 -39 -41h-724q-37 0 -37 41t37 41h724q39 0 39 -41zM1931 582q0 -41 -39 -41h-1554q222 -157 287 -431q8 -34 8 -36q0 -27 -21 -27q-47 0 -53 6t-8 13q-22 84 -35.5 123t-43.5 90 q-106 182 -296 265l-47 18q-14 6 -14 22t25 27l40 14q210 91 317 310q24 49 54 163q5 19 20 19q44 0 41 1q21 -4 21 -28q0 -58 -57 -179q-84 -177 -238 -288h1554q39 0 39 -41z" />
+<glyph unicode="&#x2b41;" d="M1870 856q0 -56 -28 -56q-19 0 -30 51q-34 153 -157 153q-73 0 -196.5 -102t-217.5 -102t-153.5 78t-59.5 179q0 61 31 61q17 0 26 -34l8 -49q11 -51 55 -86t97 -35q72 0 195.5 102t221.5 102t153 -76t55 -186zM1931 582q0 -41 -39 -41h-1554q222 -157 287 -431 q8 -34 8 -36q0 -27 -21 -27q-47 0 -53 6t-8 13q-22 84 -35.5 123t-43.5 90q-106 182 -296 265l-47 18q-14 6 -14 22t25 27l40 14q210 91 317 310q24 49 54 163q5 19 20 19q44 0 41 1q21 -4 21 -28q0 -58 -57 -179q-84 -177 -238 -288h1554q39 0 39 -41z" />
+<glyph unicode="&#x2b42;" d="M1873 102q0 -56 -28 -56q-19 0 -30 51q-34 153 -157 153q-73 0 -196.5 -102t-217.5 -102t-153.5 78t-59.5 179q0 61 31 61q17 0 26 -34l8 -49q11 -51 55 -86t97 -35q72 0 195.5 102t221.5 102t153 -76t55 -186zM1931 582q0 -41 -39 -41h-1554q228 -162 288 -432 q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h1554q39 0 39 -41zM1873 -238q0 -56 -28 -56q-19 0 -30 51 q-34 153 -157 153q-73 0 -196.5 -102t-217.5 -102t-153.5 78t-59.5 179q0 61 31 61q17 0 26 -34l8 -49q11 -51 55 -86t97 -35q72 0 195.5 102t221.5 102t153 -76t55 -186z" />
+<glyph unicode="&#x2b43;" d="M2030 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-477l-1160 -548q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1001 473h-697q-39 0 -39 41t39 41h697l-1001 473q-24 11 -24 37q0 41 41 41 q8 0 14 -3l1160 -548h477q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x2b44;" d="M2041 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-564q-17 -231 -200 -386t-420 -155h-480q-39 0 -39 41t39 41h474q205 0 366 130.5t178 328.5h-908q-39 0 -39 41t39 41h908 q-17 198 -178 328.5t-366 130.5h-474q-39 0 -39 41t39 41h480q237 0 420 -155t200 -386h564q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5t230.5 -170.5q16 -5 46 -18q16 -9 16 -23z" />
+<glyph unicode="&#x2b45;" horiz-adv-x="2032" d="M1916 72q0 -41 -37 -41h-1145q34 -67 47 -105t13 -44q0 -39 -42 -39q-22 0 -36 27q-18 46 -57 135q-138 281 -394 464q-42 25 -124 78q-25 17 -25 35t25 35q42 25 124 78q256 183 394 464q17 46 57 135q14 27 36 27q42 0 42 -39q0 -6 -13 -44t-47 -105h1145q37 0 37 -41 t-37 -41h-1188q-82 -141 -192 -258h1380q37 0 37 -41t-37 -41h-1464q-88 -78 -179 -129q91 -51 179 -129h1464q37 0 37 -41t-37 -41h-1380q110 -117 192 -258h1188q37 0 37 -41z" />
+<glyph unicode="&#x2b46;" horiz-adv-x="2032" d="M1916 582q0 -18 -25 -35q-42 -25 -124 -78q-256 -183 -394 -464q-17 -46 -57 -135q-14 -27 -36 -27q-42 0 -42 39q0 6 13 44t47 105h-1145q-37 0 -37 41t37 41h1188q82 141 192 258h-1380q-37 0 -37 41t37 41h1464q88 78 179 129q-91 51 -179 129h-1464q-37 0 -37 41 t37 41h1380q-110 117 -192 258h-1188q-37 0 -37 41t37 41h1145q-34 67 -47 105t-13 44q0 39 42 39q22 0 36 -27q18 -46 57 -135q138 -281 394 -464q42 -25 124 -78q25 -17 25 -35z" />
+<glyph unicode="&#x2b47;" d="M1906 611q25 -11 25 -27t-15 -22l-46 -18q-190 -83 -296 -265q-41 -70 -79 -213q-2 -7 -8 -13t-53 -6q-21 0 -21 27q0 2 8 36q65 274 287 431h-1554q-39 0 -39 41t39 41h1554q-154 111 -238 288q-57 121 -57 179q0 24 21 28q-3 -1 41 -1q15 0 20 -19q14 -55 54 -163 q105 -217 317 -310zM1018 856q0 -56 -28 -56q-19 0 -30 51q-34 153 -157 153q-73 0 -196.5 -102t-217.5 -102t-153.5 78t-59.5 179q0 61 31 61q17 0 26 -34l8 -49q11 -51 55 -86t97 -35q72 0 195.5 102t221.5 102t153 -76t55 -186z" />
+<glyph unicode="&#x2b48;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-1554q-39 0 -39 41t39 41h1554q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5 t230.5 -170.5q16 -5 46 -18q16 -9 16 -23zM1015 102q0 -56 -28 -56q-19 0 -30 51q-34 153 -157 153q-73 0 -196.5 -102t-217.5 -102t-153.5 78t-59.5 179q0 61 31 61q17 0 26 -34l8 -49q11 -51 55 -86t97 -35q72 0 195.5 102t221.5 102t153 -76t55 -186zM1015 -238 q0 -56 -28 -56q-19 0 -30 51q-34 153 -157 153q-73 0 -196.5 -102t-217.5 -102t-153.5 78t-59.5 179q0 61 31 61q17 0 26 -34l8 -49q11 -51 55 -86t97 -35q72 0 195.5 102t221.5 102t153 -76t55 -186z" />
+<glyph unicode="&#x2b49;" d="M1870 1057q0 -101 -59.5 -179t-153.5 -78t-217.5 102t-196.5 102q-123 0 -157 -153q-11 -51 -30 -51q-28 0 -28 56q0 110 55 186t153 76t221.5 -102t195.5 -102q53 0 97 35t55 86l8 49q9 34 26 34q31 0 31 -61zM1931 582q0 -41 -39 -41h-1554q222 -157 287 -431 q8 -34 8 -36q0 -27 -21 -27q-47 0 -53 6t-8 13q-22 84 -35.5 123t-43.5 90q-106 182 -296 265l-47 18q-14 6 -14 22t25 27l40 14q210 91 317 310q24 49 54 163q5 19 20 19q44 0 41 1q21 -4 21 -28q0 -58 -57 -179q-84 -177 -238 -288h1554q39 0 39 -41z" />
+<glyph unicode="&#x2b4a;" d="M1873 303q0 -101 -59.5 -179t-153.5 -78t-217.5 102t-196.5 102q-123 0 -157 -153q-11 -51 -30 -51q-28 0 -28 56q0 110 55 186t153 76t221.5 -102t195.5 -102q53 0 97 35t55 86l8 49q9 34 26 34q31 0 31 -61zM1931 582q0 -41 -39 -41h-1554q228 -162 288 -432 q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h1554q39 0 39 -41zM1873 -37q0 -101 -59.5 -179t-153.5 -78 t-217.5 102t-196.5 102q-123 0 -157 -153q-11 -51 -30 -51q-28 0 -28 56q0 110 55 186t153 76t221.5 -102t195.5 -102q53 0 97 35t55 86l8 49q9 34 26 34q31 0 31 -61z" />
+<glyph unicode="&#x2b4b;" d="M1931 582q0 -41 -39 -41h-1554q228 -162 288 -432q7 -31 7 -35q0 -24 -21 -27h-41q-14 0 -20 19q-33 175 -142 303.5t-278 192.5q-16 6 -16 20t16 23l46 18q282 122 363 428q3 16 9.5 40.5t26.5 26.5q-9 -1 36 -1q21 0 21 -27q0 -4 -7 -35q-59 -266 -288 -432h1554 q39 0 39 -41zM1873 102q0 -56 -28 -56q-19 0 -30 51q-34 153 -157 153q-73 0 -196.5 -102t-217.5 -102t-153.5 78t-59.5 179q0 61 31 61q17 0 26 -34l8 -49q11 -51 55 -86t97 -35q72 0 195.5 102t221.5 102t153 -76t55 -186z" />
+<glyph unicode="&#x2b4c;" d="M1931 582q0 -14 -16 -20q-259 -98 -369 -334q-23 -49 -33 -90l-18 -72q-6 -19 -20 -19h-41q-21 3 -21 27q0 4 7 35q60 270 288 432h-1554q-39 0 -39 41t39 41h1554q-229 166 -288 432q-7 31 -7 35q0 27 21 27q45 0 36 1q20 -2 24 -19t12 -48q38 -146 132.5 -257.5 t230.5 -170.5q16 -5 46 -18q16 -9 16 -23zM1015 102q0 -56 -28 -56q-19 0 -30 51q-34 153 -157 153q-73 0 -196.5 -102t-217.5 -102t-153.5 78t-59.5 179q0 61 31 61q17 0 26 -34l8 -49q11 -51 55 -86t97 -35q72 0 195.5 102t221.5 102t153 -76t55 -186z" />
+<glyph unicode="&#x2b4d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b4e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b4f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b50;" horiz-adv-x="1208" d="M1168 766l-349 -255l133 -408l-348 253l-348 -253l133 408l-349 255h431l133 408l133 -408h431zM862 666h-198l-60 185l-60 -185h-198l161 -117l-60 -184l157 115l157 -115l-60 184z" />
+<glyph unicode="&#x2b51;" horiz-adv-x="908" d="M868 722l-265 -194l101 -310l-265 192l-265 -192l101 310l-265 194h328l101 310l101 -310h328z" />
+<glyph unicode="&#x2b52;" horiz-adv-x="908" d="M868 722l-265 -194l101 -310l-265 192l-265 -192l101 310l-265 194h328l101 310l101 -310h328zM562 622h-95l-28 87l-28 -87h-95l77 -56l-29 -87l75 54l75 -54l-29 87z" />
+<glyph unicode="&#x2b53;" horiz-adv-x="1644" d="M1578 582l-558 -769l-903 294v950l903 294z" />
+<glyph unicode="&#x2b54;" horiz-adv-x="1644" d="M1578 582l-558 -769l-903 294v950l903 294zM1454 582l-472 651l-765 -249v-804l765 -249z" />
+<glyph unicode="&#x2b55;" d="M1948 582q0 -385 -269.5 -654.5t-654.5 -269.5t-654.5 269.5t-269.5 654.5t269.5 654.5t654.5 269.5t654.5 -269.5t269.5 -654.5zM1748 582q0 302 -211 513t-513 211t-513 -211t-211 -513t211 -513t513 -211t513 211t211 513z" />
+<glyph unicode="&#x2b56;" d="M1995 655q0 -277 -202 -471q-178 -172 -464 -238q-131 -30 -305 -30q-376 0 -651 177q-320 206 -320 562q0 254 175 440q156 165 416 247q165 52 382 52q374 0 650 -178q319 -207 319 -561zM1826 655q0 287 -269 446q-225 133 -533 133q-189 0 -321 -39 q-213 -63 -337 -188q-144 -145 -144 -350q0 -288 269 -447q225 -134 533 -134q432 0 655 223q147 147 147 356zM1445 987q226 -115 226 -332.5t-226 -331.5q-179 -91 -420.5 -91t-418.5 90q-224 114 -224 332t223 333q177 92 418.5 92t421.5 -92zM1376 389q198 94 198 266.5 t-197 265.5q-155 73 -350 73t-353 -74q-200 -94 -200 -264t201 -265q159 -75 352.5 -75t348.5 73z" />
+<glyph unicode="&#x2b57;" d="M1848 582q0 -341 -241.5 -582.5t-582.5 -241.5t-582.5 241.5t-241.5 582.5t241.5 582.5t582.5 241.5t582.5 -241.5t241.5 -582.5zM1679 582q0 271 -192 463t-463 192t-463 -192t-192 -463t192 -463t463 -192t463 192t192 463zM1519 582q0 -205 -145 -350t-350 -145 t-350 145t-145 350t145 350t350 145t350 -145t145 -350zM1427 582q0 167 -118 285t-285 118t-285 -118t-118 -285t118 -285t285 -118t285 118t118 285z" />
+<glyph unicode="&#x2b58;" d="M1758 582q0 -306 -214 -520t-520 -214t-520 214t-214 520t214 520t520 214t520 -214t214 -520zM1558 582q0 223 -155.5 378.5t-378.5 155.5t-378.5 -155.5t-155.5 -378.5t155.5 -378.5t378.5 -155.5t378.5 155.5t155.5 378.5z" />
+<glyph unicode="&#x2b59;" d="M1948 582q0 -385 -269.5 -654.5t-654.5 -269.5t-654.5 269.5t-269.5 654.5t269.5 654.5t654.5 269.5t654.5 -269.5t269.5 -654.5zM1024 1306q-246 0 -438 -145l438 -438l438 438q-192 145 -438 145zM1748 582q0 246 -145 438l-438 -438l438 -438q145 192 145 438z M300 582q0 -246 145 -438l438 438l-438 438q-145 -192 -145 -438zM1024 -142q246 0 438 145l-438 438l-438 -438q192 -145 438 -145z" />
+<glyph unicode="&#x2b5a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b5b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b5c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b5d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b5e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b5f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b60;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b61;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b62;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b63;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b64;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b65;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b66;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b67;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b68;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b69;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b6a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b6b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b6c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b6d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b6e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b6f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b70;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b71;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b72;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b73;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b74;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b75;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b76;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b77;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b78;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b79;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b7a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b7b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b7c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b7d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b7e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b7f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b80;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b81;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b82;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b83;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b84;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b85;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b86;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b87;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b88;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b89;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b8a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b8b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b8c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b8d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b8e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b8f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b90;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b91;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b92;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b93;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b94;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b95;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b96;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b97;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b98;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b99;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b9a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b9b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b9c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b9d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b9e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2b9f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2ba0;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2ba1;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2ba2;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2ba3;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2ba4;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2ba5;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2ba6;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2ba7;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2ba8;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2ba9;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2baa;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bab;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bac;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bad;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bae;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2baf;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bb0;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bb1;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bb2;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bb3;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bb4;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bb5;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bb6;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bb7;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bb8;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bb9;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bba;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bbb;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bbc;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bbd;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bbe;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bbf;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bc0;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bc1;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bc2;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bc3;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bc4;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bc5;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bc6;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bc7;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bc8;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bc9;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bca;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bcb;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bcc;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bcd;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bce;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bcf;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bd0;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bd1;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bd2;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bd3;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bd4;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bd5;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bd6;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bd7;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bd8;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bd9;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bda;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bdb;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bdc;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bdd;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bde;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bdf;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2be0;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2be1;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2be2;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2be3;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2be4;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2be5;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2be6;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2be7;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2be8;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2be9;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bea;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2beb;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bec;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bed;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bee;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bef;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bf0;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bf1;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bf2;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bf3;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bf4;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bf5;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bf6;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bf7;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bf8;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bf9;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bfa;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bfb;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bfc;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bfd;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bfe;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2bff;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e00;" horiz-adv-x="774" d="M662 1454h-438v-438h-112v550h550v-112z" />
+<glyph unicode="&#x2e01;" horiz-adv-x="774" d="M662 1454h-438v-438h-112v550h550v-112zM632 1122q0 -31 -22.5 -53.5t-53.5 -22.5t-53.5 22.5t-22.5 53.5t22.5 53.5t53.5 22.5t53.5 -22.5t22.5 -53.5z" />
+<glyph unicode="&#x2e02;" horiz-adv-x="618" d="M506 1566q-263 -254 -283 -634l-111 7q14 347 247 627h147z" />
+<glyph unicode="&#x2e03;" horiz-adv-x="618" d="M506 939l-111 -7q-20 380 -283 634h147q233 -280 247 -627z" />
+<glyph unicode="&#x2e04;" horiz-adv-x="744" d="M506 1566q-263 -254 -283 -634l-111 7q14 347 247 627h147zM632 1122q0 -31 -22.5 -53.5t-53.5 -22.5t-53.5 22.5t-22.5 53.5t22.5 53.5t53.5 22.5t53.5 -22.5t22.5 -53.5z" />
+<glyph unicode="&#x2e05;" horiz-adv-x="744" d="M632 939l-111 -7q-20 380 -283 634h147q233 -280 247 -627zM264 1122q0 -31 -22.5 -53.5t-53.5 -22.5t-53.5 22.5t-22.5 53.5t22.5 53.5t53.5 22.5t53.5 -22.5t22.5 -53.5z" />
+<glyph unicode="&#x2e06;" horiz-adv-x="1212" d="M1100 1454h-438v-438h-112v438h-438v112h988v-112z" />
+<glyph unicode="&#x2e07;" horiz-adv-x="1212" d="M1100 1454h-438v-438h-112v438h-438v112h988v-112zM1070 1122q0 -31 -22.5 -53.5t-53.5 -22.5t-53.5 22.5t-22.5 53.5t22.5 53.5t53.5 22.5t53.5 -22.5t22.5 -53.5z" />
+<glyph unicode="&#x2e08;" horiz-adv-x="841" d="M593 1454q-93 0 -130 -66q-25 -44 -52.5 -190t-58.5 -205q-50 -98 -148 -98q-25 0 -92 14l19 110q55 -12 78 -12q33 0 49 53q3 9 36.5 156t72 218.5t87 101.5t131.5 30q33 0 87 -5l-10 -111q-42 4 -69 4zM729 1122q0 -31 -22.5 -53.5t-53.5 -22.5t-53.5 22.5t-22.5 53.5 t22.5 53.5t53.5 22.5t53.5 -22.5t22.5 -53.5z" />
+<glyph unicode="&#x2e09;" horiz-adv-x="784" d="M593 1454q-93 0 -130 -66q-25 -44 -52.5 -190t-58.5 -205q-50 -98 -148 -98q-25 0 -92 14l19 110q55 -12 78 -12q33 0 49 53q3 9 36.5 156t72 218.5t87 101.5t131.5 30q33 0 87 -5l-10 -111q-42 4 -69 4z" />
+<glyph unicode="&#x2e0a;" horiz-adv-x="784" d="M580 895q-98 0 -148 98q-31 59 -59 205t-52 190q-37 66 -130 66q-27 0 -69 -4l-10 111q54 5 87 5q83 0 131 -30q98 -60 151 -276l31 -142q12 -53 22 -81q15 -30 39.5 -30t79.5 12l19 -110q-66 -14 -92 -14z" />
+<glyph unicode="&#x2e0b;" horiz-adv-x="814" d="M702 976h-590v590h590v-590zM590 1088v366h-366v-366h366z" />
+<glyph unicode="&#x2e0c;" horiz-adv-x="787" d="M675 1072l-79 -79l-484 484l79 79z" />
+<glyph unicode="&#x2e0d;" horiz-adv-x="787" d="M675 1477l-484 -484l-79 79l484 484z" />
+<glyph unicode="&#x2e0e;" horiz-adv-x="1392" d="M691 1442l54 13q61 0 61 -60q0 -68 -92 -68q-54 0 -88.5 38.5t-34.5 93.5q0 121 179 147v-36q-115 -17 -115 -88q0 -40 36 -40zM800 1164h-208v56h208v-56zM930 991h-468v56h468v-56zM1050 798h-708v56h708v-56zM1280 554h-465q-21 -108 -119 -108t-119 108h-465v56h465 q21 108 119 108t119 -108h465v-56zM1050 310h-708v56h708v-56zM930 117h-468v56h468v-56zM800 -56h-208v56h208v-56zM706 -278l-54 -13q-61 0 -61 60q0 68 92 68q54 0 88.5 -38.5t34.5 -93.5q0 -121 -179 -147v36q115 17 115 88q0 40 -36 40zM696 662q-45 0 -62 -52h124 q-17 52 -62 52zM696 502q45 0 62 52h-124q17 -52 62 -52z" />
+<glyph unicode="&#x2e0f;" horiz-adv-x="0" d="M1024 -336h-2048v112h2048v-112z" />
+<glyph unicode="&#x2e10;" horiz-adv-x="0" d="M1024 -336h-1843l-136 -106l-69 89l166 129h1882v-112z" />
+<glyph unicode="&#x2e11;" horiz-adv-x="0" d="M-1024 -336v112h1882l166 -129l-69 -89l-136 106h-1843z" />
+<glyph unicode="&#x2e12;" horiz-adv-x="607" d="M495 -80q0 -147 -114 -235q-95 -74 -253 -97l-16 110l55 9q89 15 152.5 71.5t63.5 141.5q0 182 -271 222l16 110q158 -23 253 -97q114 -88 114 -235z" />
+<glyph unicode="&#x2e13;" horiz-adv-x="1186" d="M340 982q0 -47 -33.5 -80.5t-80.5 -33.5t-80.5 33.5t-33.5 80.5t33.5 80.5t80.5 33.5t80.5 -33.5t33.5 -80.5zM1069 1514l-850 -1909l-102 46l850 1909zM1074 182q0 -47 -33.5 -80.5t-80.5 -33.5t-80.5 33.5t-33.5 80.5t33.5 80.5t80.5 33.5t80.5 -33.5t33.5 -80.5z" />
+<glyph unicode="&#x2e14;" horiz-adv-x="1441" d="M1329 716q0 -141 -84 -270l-93 60q72 106 72 195q0 129 -89 243l-943 -944l-80 80l944 943q-107 83 -221.5 83t-216.5 -66l-60 94q128 83 270 83q201 0 351 -150t150 -351z" />
+<glyph unicode="&#x2e15;" horiz-adv-x="1442" d="M629 112q89 0 195 72l60 -93q-137 -91 -254 -91q-201 0 -359.5 154t-158.5 354q0 140 84 270l94 -60q-66 -102 -66 -216.5t83 -221.5l943 944l80 -80l-944 -943q114 -89 243 -89z" />
+<glyph unicode="&#x2e16;" horiz-adv-x="1151" d="M1039 975q0 -43 -30.5 -73.5t-73.5 -30.5t-73.5 30.5t-30.5 73.5t30.5 73.5t73.5 30.5t73.5 -30.5t30.5 -73.5zM1039 496q-590 -157 -798 -486h-129q188 353 662 529q-474 176 -662 529h129q208 -329 798 -486v-86zM1039 103q0 -43 -30.5 -73.5t-73.5 -30.5t-73.5 30.5 t-30.5 73.5t30.5 73.5t73.5 30.5t73.5 -30.5t30.5 -73.5z" />
+<glyph unicode="&#x2e17;" horiz-adv-x="781" d="M669 834l-501 -288l-56 96l501 288zM669 434l-501 -288l-56 96l501 288z" />
+<glyph unicode="&#x2e18;" horiz-adv-x="886" d="M671 1277q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM630 0h-112v120q-406 112 -406 420q0 133 105 210t243 77q29 0 58 -4v167h112v-782q66 -13 144 -21l-11 -111q-80 8 -133 18v-94zM460 715 q-89 0 -162.5 -45.5t-73.5 -129.5q0 -213 294 -304v474q-29 5 -58 5z" />
+<glyph unicode="&#x2e19;" horiz-adv-x="1333" d="M1011 1348l-8 -64l4 -8l54 86q49 76 114 79q1 -14 1 -21q0 -38 -39.5 -94.5t-39.5 -86.5q107 48 136.5 48t29.5 -22q0 -37 -97 -86l-131 -67q-23 -18 -52 -68q18 -13 44.5 -13t83.5 24t92.5 24t35.5 -24q0 -51 -161.5 -99t-176 -58.5t-34.5 -56.5q6 -2 13 -4 q42 0 123.5 23t109 23t38.5 -2v-57q-13 -4 -156.5 -30t-191.5 -59q-27 -18 -47 -82q8 -4 34.5 -4t116 25t118.5 25t39 -2v-51q-181 -55 -396 -114q-22 -40 -38 -87l3 -3q6 0 90 26t254 60v-56l-245 -76q-133 -42 -185 -81q-4 -3 -33 -63q63 2 186.5 40t190.5 38v-85 q-18 -5 -200 -37.5t-241 -66.5q-32 -19 -37 -58q15 -8 63 -8t169 28.5t183 28.5q5 -14 5 -21q0 -71 -201 -107l-264 -42q-38 -14 -94 -129.5t-103 -115.5q-25 0 -63 22.5t-38 49.5t68 120t68 127q0 69 -39.5 202.5t-39.5 202.5t40 69q33 0 69 -118l64 -211q60 53 60 115.5 t-46 181.5t-46 184t39 65q28 0 50 -80l23 -106q12 -44 40 -85q44 69 41 95l-29 259q0 45 55 61q18 -161 59 -255q30 30 35.5 39t5.5 49.5t-19.5 133.5t-19.5 140q0 87 51 87q18 0 29 -8q5 -26 12.5 -130.5t31.5 -156.5q45 56 45 68t-19.5 84t-19.5 194.5t51 122.5 q11 0 19.5 -15t27 -123.5t31.5 -141.5q45 53 45 65q0 -4 -10 47t-10 137.5t17 126.5q32 0 38.5 -89.5t30.5 -117.5q31 30 31 87l-4 84q0 96 44 96q1 0 6 -2q16 -15 16 -45z" />
+<glyph unicode="&#x2e1a;" horiz-adv-x="808" d="M696 1141q0 -40 -28 -69t-68 -29t-69 29t-29 69t29 68t69 28t68 -28t28 -68zM306 1141q0 -40 -28 -69t-68 -29t-69 29t-29 69t29 68t69 28t68 -28t28 -68zM696 631h-584v112h584v-112z" />
+<glyph unicode="&#x2e1b;" horiz-adv-x="1206" d="M708 1205q43 -43 43 -103.5t-42.5 -105t-104 -44.5t-105.5 44t-44 105.5t44.5 104t105 42.5t103.5 -43zM1094 776q-16 -131 -75.5 -198.5t-149 -67.5t-242 121t-247.5 121q-125 0 -158 -200l-110 19q49 293 268 293q99 0 202 -63q15 -9 158 -116q84 -63 136 -63 q80 0 108 173zM669 1101q0 65 -65 65q-28 0 -47.5 -19t-19.5 -46t20 -47t47 -20t46 19.5t19 47.5z" />
+<glyph unicode="&#x2e1c;" horiz-adv-x="787" d="M675 -328l-79 -79l-484 484l79 79z" />
+<glyph unicode="&#x2e1d;" horiz-adv-x="787" d="M675 77l-484 -484l-79 79l484 484z" />
+<glyph unicode="&#x2e1e;" horiz-adv-x="1206" d="M700 1101q0 -40 -28 -69t-68 -29t-69 29t-29 69t29 68t69 28t68 -28t28 -68zM1094 776q-16 -131 -75.5 -198.5t-149 -67.5t-242 121t-247.5 121q-125 0 -158 -200l-110 19q49 293 268 293q99 0 202 -63q15 -9 158 -116q84 -63 136 -63q80 0 108 173z" />
+<glyph unicode="&#x2e1f;" horiz-adv-x="1206" d="M1094 776q-16 -131 -75.5 -198.5t-149 -67.5t-242 121t-247.5 121q-125 0 -158 -200l-110 19q49 293 268 293q99 0 202 -63q15 -9 158 -116q84 -63 136 -63q80 0 108 173zM700 275q0 -40 -28 -69t-68 -29t-69 29t-29 69t29 68t69 28t68 -28t28 -68z" />
+<glyph unicode="&#x2e20;" horiz-adv-x="673" d="M561 631h-337v-863h-112v1838h112v-863h337v-112z" />
+<glyph unicode="&#x2e21;" horiz-adv-x="673" d="M561 -232h-112v863h-337v112h337v863h112v-1838z" />
+<glyph unicode="&#x2e22;" horiz-adv-x="571" d="M459 1493h-235v-806h-112v862l56 57h291v-113z" />
+<glyph unicode="&#x2e23;" horiz-adv-x="571" d="M459 687h-112v806h-235v113h291l56 -57v-862z" />
+<glyph unicode="&#x2e24;" horiz-adv-x="571" d="M459 -232h-291l-56 57v862h112v-806h235v-113z" />
+<glyph unicode="&#x2e25;" horiz-adv-x="571" d="M112 -232v113h235v806h112v-862l-56 -57h-291z" />
+<glyph unicode="&#x2e26;" horiz-adv-x="1326" d="M1214 160h-543q-246 0 -402.5 141.5t-156.5 385.5t156.5 385.5t402.5 141.5h543v-112h-543q-200 0 -323.5 -109t-123.5 -306t123.5 -306t323.5 -109h543v-112z" />
+<glyph unicode="&#x2e27;" horiz-adv-x="1326" d="M1214 687q0 -244 -156.5 -385.5t-402.5 -141.5h-543v112h543q200 0 323.5 109t123.5 306t-123.5 306t-323.5 109h-543v112h543q246 0 402.5 -141.5t156.5 -385.5z" />
+<glyph unicode="&#x2e28;" horiz-adv-x="1082" d="M574 -332q0 -18 -19 -18q-11 0 -46 29q-226 186 -322 396t-96 507t96 507t322 396q35 29 46 29q19 0 19 -18q0 -8 -24 -32q-300 -295 -300 -882t300 -882q24 -24 24 -32zM974 -332q0 -18 -19 -18q-11 0 -46 29q-226 186 -322 396t-96 507t96 507t322 396q35 29 46 29 q19 0 19 -18q0 -8 -24 -32q-300 -295 -300 -882t300 -882q24 -24 24 -32z" />
+<glyph unicode="&#x2e29;" horiz-adv-x="1082" d="M591 582q0 -297 -96 -507t-322 -396q-35 -29 -46 -29q-19 0 -19 18q0 8 24 32q300 295 300 882t-300 882q-24 24 -24 32q0 18 19 18q11 0 46 -29q226 -186 322 -396t96 -507zM991 582q0 -297 -96 -507t-322 -396q-35 -29 -46 -29q-19 0 -19 18q0 8 24 32q300 295 300 882 t-300 882q-24 24 -24 32q0 18 19 18q11 0 46 -29q226 -186 322 -396t96 -507z" />
+<glyph unicode="&#x2e2a;" horiz-adv-x="1426" d="M1314 942q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71zM314 942q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71zM814 101q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71z" />
+<glyph unicode="&#x2e2b;" horiz-adv-x="1426" d="M814 942q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71zM1314 101q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71zM314 101q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71z" />
+<glyph unicode="&#x2e2c;" horiz-adv-x="1267" d="M1155 942q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71zM314 942q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71zM1155 101q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71zM314 101q0 -41 -30 -71t-71 -30 t-71 30t-30 71t30 71t71 30t71 -30t30 -71z" />
+<glyph unicode="&#x2e2d;" horiz-adv-x="1426" d="M814 1082q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71zM1314 582q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71zM814 582q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71zM314 582q0 -41 -30 -71t-71 -30 t-71 30t-30 71t30 71t71 30t71 -30t30 -71zM814 82q0 -41 -30 -71t-71 -30t-71 30t-30 71t30 71t71 30t71 -30t30 -71z" />
+<glyph unicode="&#x2e2e;" horiz-adv-x="849" d="M224 958q0 -200 227 -200q85 0 165 37l80 -51v-360h-112v280q-66 -18 -133 -18q-149 0 -244 82.5t-95 229.5q0 191 202 309q158 93 376 116l12 -112q-170 -18 -301 -84q-177 -89 -177 -229zM737 97q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5 t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x2e2f;" horiz-adv-x="506" d="M309 1252.5q85 -119.5 85 -210.5t-49 -149.5t-132 -58.5h-46v112h46q69 0 69 89q0 67 -85 182t-85 186.5t56 125t125 53.5h46v-112h-46q-23 0 -46 -20.5t-23 -49t85 -148z" />
+<glyph unicode="&#x2e30;" horiz-adv-x="738" d="M698 582q0 -137 -96 -233t-233 -96t-233 96t-96 233t96 233t233 96t233 -96t96 -233zM598 582q0 96 -66.5 162.5t-162.5 66.5t-162.5 -66.5t-66.5 -162.5t66.5 -162.5t162.5 -66.5t162.5 66.5t66.5 162.5z" />
+<glyph unicode="&#x2e31;" horiz-adv-x="300" d="M260 582q0 -46 -32 -78t-78 -32t-78 32t-32 78t32 78t78 32t78 -32t32 -78z" />
+<glyph unicode="&#x2e32;" horiz-adv-x="1720" d="M1586 759q-165 32 -299 32t-281 -41q222 -150 222 -395q0 -144 -111.5 -249.5t-256.5 -105.5t-256 105.5t-111 249.5q0 245 221 395q-147 41 -278.5 41t-301.5 -32l-22 118q181 34 305 34q237 0 443 -84q205 84 443 84q124 0 305 -34zM1108 355q0 221 -248 341 q-247 -120 -247 -341q0 -95 75.5 -165t171.5 -70t172 70t76 165z" />
+<glyph unicode="&#x2e33;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e34;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e35;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e36;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e37;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e38;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e39;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e3a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e3b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e3c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e3d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e3e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x2e3f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x3008;" horiz-adv-x="795" d="M680 -401q0 -41 -41 -41q-28 0 -37 25q-377 996 -377 1000t377 998q9 25 37 25q41 0 41 -41q0 -9 -371 -983q371 -974 371 -983z" />
+<glyph unicode="&#x3009;" horiz-adv-x="795" d="M193 1581q377 -994 377 -998t-377 -1000q-9 -25 -37 -25q-41 0 -41 41q0 9 371 983q-371 974 -371 983q0 41 41 41q28 0 37 -25z" />
+<glyph unicode="&#x300a;" horiz-adv-x="1105" d="M680 -401q0 -41 -41 -41q-28 0 -37 25q-377 996 -377 1000t377 998q9 25 37 25q41 0 41 -41q0 -9 -371 -983q371 -974 371 -983zM990 -401q0 -41 -41 -41q-28 0 -37 25q-377 996 -377 1000t377 998q9 25 37 25q41 0 41 -41q0 -9 -371 -983q371 -974 371 -983z" />
+<glyph unicode="&#x300b;" horiz-adv-x="1105" d="M193 1581q377 -994 377 -998t-377 -1000q-9 -25 -37 -25q-41 0 -41 41q0 9 371 983q-371 974 -371 983q0 41 41 41q28 0 37 -25zM503 1581q377 -994 377 -998t-377 -1000q-9 -25 -37 -25q-41 0 -41 41q0 9 371 983q-371 974 -371 983q0 41 41 41q28 0 37 -25z" />
+<glyph unicode="&#x300c;" horiz-adv-x="682" d="M503 1514q68 0 68 -40.5t-68 -40.5h-309v-1783h-82v1864h391z" />
+<glyph unicode="&#x300d;" horiz-adv-x="682" d="M570 -350h-391q-68 0 -68 41t68 41h309v1782h82v-1864z" />
+<glyph unicode="&#x300e;" horiz-adv-x="860" d="M581 1514q168 0 168 -140.5t-168 -140.5h-187v-1583h-282v1864h469zM581 1314q87 0 87 59.5t-87 59.5h-388v-1702h120v1583h268z" />
+<glyph unicode="&#x300f;" horiz-adv-x="860" d="M748 -350h-469q-168 0 -168 140.5t168 140.5h187v1583h282v-1864zM667 -269v1702h-120v-1583h-268q-87 0 -87 -59.5t87 -59.5h388z" />
+<glyph unicode="&#x3010;" horiz-adv-x="787" d="M623 -329q0 -21 -52 -21h-407v1864h407q52 0 52 -21q0 -11 -11 -20q-44 -33 -127 -105q-239 -247 -239 -786t239 -786q16 -16 127 -105q11 -9 11 -20z" />
+<glyph unicode="&#x3011;" horiz-adv-x="787" d="M623 -350h-407q-52 0 -52 21q0 11 11 20q44 33 127 105q239 247 239 786t-239 786q-16 16 -127 105q-11 9 -11 20q0 21 52 21h407v-1864z" />
+<glyph unicode="&#x3014;" horiz-adv-x="718" d="M276 1092v-1020q0 -47 122.5 -188.5t155.5 -161.5v-72l-390 287v1290l390 287v-72q-33 -20 -155.5 -161.5t-122.5 -188.5z" />
+<glyph unicode="&#x3015;" horiz-adv-x="718" d="M442 72v1020q0 47 -122.5 188.5t-155.5 161.5v72l390 -287v-1290l-390 -287v72q33 20 155.5 161.5t122.5 188.5z" />
+<glyph unicode="&#x3016;" horiz-adv-x="951" d="M787 -329q0 -21 -52 -21h-571v1864h571q52 0 52 -21q0 -11 -11 -20q-44 -33 -127 -105q-239 -247 -239 -786t239 -786q16 -16 127 -105q11 -9 11 -20zM328 582q0 247 55 454q70 261 214 396h-351v-1700h351q-144 134 -214 396q-55 207 -55 454z" />
+<glyph unicode="&#x3017;" horiz-adv-x="951" d="M787 -350h-571q-52 0 -52 21q0 11 11 20q44 32 127 105q239 247 239 786t-239 786q-16 16 -127 105q-11 9 -11 20q0 21 52 21h571v-1864zM705 -268v1700h-351q144 -134 214 -396q55 -207 55 -454t-55 -454q-70 -261 -214 -396h351z" />
+<glyph unicode="&#x3018;" horiz-adv-x="758" d="M410 1152v-1140q0 -41 72.5 -152t111.5 -138v-72l-430 287v1290l430 287v-72q-39 -27 -111.5 -138t-72.5 -152zM328 12v1140q0 39 35 109l-117 -78v-1202l117 -78q-35 70 -35 109z" />
+<glyph unicode="&#x3019;" horiz-adv-x="758" d="M348 12v1140q0 41 -72.5 152t-111.5 138v72l430 -287v-1290l-430 -287v72q39 27 111.5 138t72.5 152zM430 1152v-1140q0 -39 -35 -109l117 78v1202l-117 78q35 -70 35 -109z" />
+<glyph unicode="&#x301a;" horiz-adv-x="682" d="M571 -309q0 -41 -68 -41h-391v1864h391q68 0 68 -40.5t-68 -40.5h-109v-1701h109q68 0 68 -41zM313 -268v1701h-120v-1701h120z" />
+<glyph unicode="&#x301b;" horiz-adv-x="682" d="M570 -350h-391q-68 0 -68 41t68 41h109v1701h-109q-68 0 -68 40.5t68 40.5h391v-1864zM489 -268v1701h-120v-1701h120z" />
+<glyph unicode="&#x301c;" horiz-adv-x="1591" d="M1477 418q0 -63 -29 -63q-24 0 -28 43.5t-23 116.5q-33 80 -104 130t-156 50q-111 0 -235 -88l-207 -164q-125 -88 -240 -88q-149 0 -244.5 119.5t-95.5 271.5q0 63 28 63q24 0 29 -51q9 -90 38 -142q83 -147 245 -147q113 0 236 88l208 164q124 88 238 88 q148 0 244 -119.5t96 -271.5z" />
+<glyph unicode="&#x301d;" horiz-adv-x="870" d="M481 751q0 -17 -22 -17t-36 25l-385 667q-9 16 -9 32q0 37 36.5 58.5t76.5 21.5q76 0 94 -54l239 -707q6 -18 6 -26zM841 751q0 -17 -22 -17t-36 25l-385 667q-9 16 -9 32q0 37 36.5 58.5t76.5 21.5q76 0 94 -54l239 -707q6 -18 6 -26z" />
+<glyph unicode="&#x301e;" horiz-adv-x="870" d="M481 1458q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5zM841 1458q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5z" />
+<glyph unicode="&#x301f;" horiz-adv-x="870" d="M481 287q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5zM841 287q0 -16 -9 -32l-385 -667q-14 -25 -36 -25t-22 17q0 8 6 26l239 707q18 54 94 54q40 0 76.5 -21.5t36.5 -58.5z" />
+<glyph unicode="&#x306e;" horiz-adv-x="1919" d="M1697 1131q154 -171 154 -417.5t-174 -434.5q-150 -163 -400 -255q-211 -78 -301 -78q-39 0 -39 33q0 24 131 61q199 56 365 188q255 202 255 494q0 438 -465 564q-92 25 -239 25q-34 0 -72 -2q137 -96 137 -139.5t-54 -50.5l-53 -142q-107 -289 -232 -527 q-205 -388 -343 -388q-31 0 -42 17.5t-19 31.5l-64 28q-91 47 -137 176q-37 103 -37 228q0 485 441 737q208 119 486 119q182 0 312 -38q250 -73 390 -230zM803 1050q39 123 39 152t-11.5 62t-27.5 33q-37 0 -145.5 -42.5t-211 -139t-160.5 -199.5q-81 -144 -81 -332 t47.5 -285t114.5 -97q37 0 80 53q21 26 78 129q157 285 278 666z" />
+<glyph unicode="&#x4dc0;" d="M1724 1353h-1400v153h1400v-153zM1724 1014h-1400v153h1400v-153zM1724 675h-1400v153h1400v-153zM1724 336h-1400v153h1400v-153zM1724 -3h-1400v153h1400v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4dc1;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM1724 675h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516 v-153zM840 336h-516v153h516v-153zM840 -3h-516v153h516v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dc2;" d="M1724 1353h-516v153h516v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM1724 -3h-516v153h516v-153zM840 675h-516v153h516v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153h1400 v-153zM840 -3h-516v153h516v-153z" />
+<glyph unicode="&#x4dc3;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 336h-516v153h516v-153zM840 1014h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516 v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dc4;" d="M1724 1353h-516v153h516v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4dc5;" d="M1724 1353h-1400v153h1400v-153zM1724 1014h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dc6;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM1724 675h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM840 1014h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400 v-153zM840 336h-516v153h516v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dc7;" d="M1724 1353h-516v153h516v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM1724 -3h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM840 336h-516v153h516 v-153zM840 -3h-516v153h516v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dc8;" d="M1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4dc9;" d="M1724 1353h-1400v153h1400v-153zM1724 1014h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4dca;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM1724 675h-516v153h516v-153zM840 1353h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM1724 -342h-1400v153 h1400v-153z" />
+<glyph unicode="&#x4dcb;" d="M1724 1353h-1400v153h1400v-153zM1724 1014h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 -3h-516v153h516v-153zM1724 -342h-516v153h516v-153zM840 336h-516v153h516v-153zM840 -3h-516v153h516v-153zM840 -342h-516v153h516 v-153z" />
+<glyph unicode="&#x4dcc;" d="M1724 1353h-1400v153h1400v-153zM1724 1014h-1400v153h1400v-153zM1724 675h-1400v153h1400v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-1400v153h1400v-153zM840 -3h-516v153h516v-153z" />
+<glyph unicode="&#x4dcd;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -3h-1400v153h1400v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4dce;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM1724 675h-516v153h516v-153zM840 1353h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516 v-153zM840 -3h-516v153h516v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dcf;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 -342h-516v153h516v-153zM840 336h-516v153h516 v-153zM840 -3h-516v153h516v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dd0;" d="M1724 1353h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 -3h-516v153h516v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153h1400v-153zM840 -3h-516v153h516 v-153z" />
+<glyph unicode="&#x4dd1;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 -342h-516v153 h516v-153z" />
+<glyph unicode="&#x4dd2;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM1724 675h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM840 1014h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516 v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4dd3;" d="M1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM1724 -3h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM840 336h-516v153h516v-153zM840 -3h-516v153h516 v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dd4;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153h1400v-153zM840 -3h-516v153h516 v-153z" />
+<glyph unicode="&#x4dd5;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-1400v153h1400v-153zM840 -3h-516v153h516 v-153z" />
+<glyph unicode="&#x4dd6;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 336h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM840 336h-516v153h516 v-153zM840 -3h-516v153h516v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dd7;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM1724 675h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM840 675h-516v153h516v-153zM840 336h-516v153h516v-153z M1724 -342h-1400v153h1400v-153zM840 -3h-516v153h516v-153z" />
+<glyph unicode="&#x4dd8;" d="M1724 1353h-1400v153h1400v-153zM1724 1014h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 -3h-516v153h516v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153h1400v-153zM840 -3h-516v153h516v-153z" />
+<glyph unicode="&#x4dd9;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4dda;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 336h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM840 675h-516v153h516v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153h1400 v-153zM840 -3h-516v153h516v-153z" />
+<glyph unicode="&#x4ddb;" d="M1724 1353h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4ddc;" d="M1724 1353h-516v153h516v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516 v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4ddd;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-1400v153h1400v-153zM840 -3h-516v153h516v-153z" />
+<glyph unicode="&#x4dde;" d="M1724 1353h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-516v153h516v-153zM840 -3h-516v153h516v-153zM840 -342h-516v153 h516v-153z" />
+<glyph unicode="&#x4ddf;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 -342h-516v153 h516v-153z" />
+<glyph unicode="&#x4de0;" d="M1724 1353h-1400v153h1400v-153zM1724 1014h-1400v153h1400v-153zM1724 675h-1400v153h1400v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-516v153h516v-153zM840 -3h-516v153h516v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4de1;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -3h-1400v153h1400v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4de2;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 -342h-516v153h516v-153zM840 336h-516v153h516v-153zM840 -3h-516v153h516 v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4de3;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM1724 675h-516v153h516v-153zM840 1353h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-1400v153h1400 v-153zM840 -3h-516v153h516v-153z" />
+<glyph unicode="&#x4de4;" d="M1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-1400v153h1400v-153zM840 -3h-516v153h516v-153z" />
+<glyph unicode="&#x4de5;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4de6;" d="M1724 1353h-516v153h516v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM840 -3h-516v153h516 v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4de7;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516 v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4de8;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 336h-516v153h516v-153zM840 1014h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153 h1400v-153z" />
+<glyph unicode="&#x4de9;" d="M1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM1724 -3h-516v153h516v-153zM840 675h-516v153h516v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153h1400v-153zM840 -3h-516v153h516 v-153z" />
+<glyph unicode="&#x4dea;" d="M1724 1353h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 336h-1400v153h1400v-153zM1724 -3h-1400v153h1400v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4deb;" d="M1724 1353h-1400v153h1400v-153zM1724 1014h-1400v153h1400v-153zM1724 675h-1400v153h1400v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dec;" d="M1724 1353h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 -3h-516v153h516v-153zM1724 -342h-516v153h516v-153zM840 336h-516v153h516v-153zM840 -3h-516v153h516 v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4ded;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM1724 675h-516v153h516v-153zM840 1353h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400 v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dee;" d="M1724 1353h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516v-153zM840 -342h-516v153 h516v-153z" />
+<glyph unicode="&#x4def;" d="M1724 1353h-516v153h516v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 -342h-516v153 h516v-153z" />
+<glyph unicode="&#x4df0;" d="M1724 1353h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-1400v153h1400v-153zM840 -3h-516v153h516v-153z" />
+<glyph unicode="&#x4df1;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4df2;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153h1400 v-153zM840 -3h-516v153h516v-153z" />
+<glyph unicode="&#x4df3;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM840 -3h-516v153h516 v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4df4;" d="M1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM840 -3h-516v153h516v-153zM840 -342h-516v153h516 v-153z" />
+<glyph unicode="&#x4df5;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153 h1400v-153z" />
+<glyph unicode="&#x4df6;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-1400v153h1400v-153zM840 -3h-516v153 h516v-153z" />
+<glyph unicode="&#x4df7;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-516v153h516v-153zM840 -3h-516v153h516v-153zM840 -342h-516v153 h516v-153z" />
+<glyph unicode="&#x4df8;" d="M1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4df9;" d="M1724 1353h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4dfa;" d="M1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516v-153zM840 -342h-516v153 h516v-153z" />
+<glyph unicode="&#x4dfb;" d="M1724 1353h-516v153h516v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 336h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153 h1400v-153z" />
+<glyph unicode="&#x4dfc;" d="M1724 1353h-1400v153h1400v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM840 675h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516v-153zM1724 -342h-1400v153h1400v-153z" />
+<glyph unicode="&#x4dfd;" d="M1724 1353h-516v153h516v-153zM1724 1014h-516v153h516v-153zM840 1353h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM1724 -342h-516v153h516v-153zM840 -3h-516v153h516 v-153zM840 -342h-516v153h516v-153z" />
+<glyph unicode="&#x4dfe;" d="M1724 1353h-516v153h516v-153zM1724 675h-516v153h516v-153zM1724 1014h-1400v153h1400v-153zM840 1353h-516v153h516v-153zM1724 -3h-516v153h516v-153zM1724 336h-1400v153h1400v-153zM840 675h-516v153h516v-153zM1724 -342h-1400v153h1400v-153zM840 -3h-516v153h516 v-153z" />
+<glyph unicode="&#x4dff;" d="M1724 1014h-516v153h516v-153zM1724 1353h-1400v153h1400v-153zM1724 336h-516v153h516v-153zM1724 675h-1400v153h1400v-153zM840 1014h-516v153h516v-153zM1724 -342h-516v153h516v-153zM1724 -3h-1400v153h1400v-153zM840 336h-516v153h516v-153zM840 -342h-516v153 h516v-153z" />
+<glyph unicode="&#x4e2d;" horiz-adv-x="1790" d="M1722 1054q0 -30 -83 -40v-643q-69 -56 -106.5 -56t-37.5 36v82h-582v-682q-63 -57 -100 -57q-15 0 -29.5 12t-14.5 27v700h-555v-77q-69 -56 -102 -56q-44 0 -44 49v841l157 -82h544v361h31q12 0 147 -24q47 -8 47 -27.5t-29 -35.5t-52 -20v-254h562l67 77 q180 -112 180 -131zM1495 512v519h-582v-519h582zM769 512v519h-555v-519h555z" />
+<glyph unicode="&#xf700;" horiz-adv-x="1364" d="M1358 0q-126 4 -160 4t-160 -4v67l47 -2q72 0 72 73v700q0 169 -159 271q-137 87 -317 87t-316 -87q-158 -100 -158 -271v-700q0 -56 36 -68q11 -4 48 -4q16 0 35 1v-67q-126 4 -160 4t-160 -4v67l47 -2q72 0 72 73v706q0 203 183 326q160 108 374 108t374 -108 q183 -123 183 -326v-706q0 -56 36 -68q11 -4 48 -4q16 0 35 1v-67z" />
+<glyph unicode="&#xf701;" horiz-adv-x="1364" d="M1239 1140v-706q0 -203 -183 -326q-160 -108 -374 -108t-374 108q-183 123 -183 326v706q0 56 -36 68q-11 4 -48 4q-16 0 -35 -1v67q126 -4 160 -4t160 4v-67l-47 2q-72 0 -72 -73v-700q0 -169 159 -271q137 -87 317 -87t316 87q158 100 158 271v700q0 56 -36 68 q-11 4 -48 4q-16 0 -35 -1v67q126 -4 160 -4t160 4v-67l-47 2q-72 0 -72 -73z" />
+<glyph unicode="&#xf702;" horiz-adv-x="1591" d="M1421 331q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1421 -259q0 -41 -37 -41h-548v-103q0 -39 -41 -39t-41 39v103h-545q-39 0 -39 41t39 41h545v218h-545 q-39 0 -39 41t39 41h545v105q0 37 41 37t41 -37v-105h548q37 0 37 -41t-37 -41h-548v-218h548q37 0 37 -41z" />
+<glyph unicode="&#xf703;" horiz-adv-x="1591" d="M1421 882q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 -259q0 -41 -37 -41h-548v-103q0 -39 -41 -39t-41 39v103h-545q-39 0 -39 41t39 41h545v218h-545 q-39 0 -39 41t39 41h545v105q0 37 41 37t41 -37v-105h548q37 0 37 -41t-37 -41h-548v-218h548q37 0 37 -41z" />
+<glyph unicode="&#xf704;" horiz-adv-x="1591" d="M1421 397q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1407 99q20 0 20 -22t-11 -49q-45 -109 -146.5 -183t-216.5 -74q-148 0 -255 136l-169 254q-105 136 -248 136 q-101 0 -174 -56q-45 -35 -87.5 -98t-55.5 -63q-19 0 -19 21.5t11 48.5q45 109 146.5 183t216.5 74q148 0 261 -136l175 -254q106 -136 235 -136q102 0 176 57q45 34 86.5 97.5t54.5 63.5z" />
+<glyph unicode="&#xf705;" horiz-adv-x="1591" d="M1421 948q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1446 420q0 -156 -90.5 -254.5t-244.5 -98.5q-56 0 -167.5 16t-167.5 16q-158 0 -244 -105 q-68 -83 -68 -181q0 -48 18.5 -112.5t18.5 -75.5q0 -21 -17 -21q-22 0 -46 45q-49 91 -49 201q0 163 96.5 260.5t258.5 97.5q55 0 163 -13.5t163 -13.5q156 0 234 95q68 82 68 181q0 51 -19.5 116.5t-19.5 72.5q0 21 18 21q22 0 47 -46q48 -90 48 -201z" />
+<glyph unicode="&#xf706;" horiz-adv-x="1591" d="M1421 150q0 -24 -27 -37l-557 -263v-251q0 -41 -41 -41t-41 41v212l-530 -250q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l561 265v498l-561 265q-24 11 -24 37q0 41 41 41q8 0 14 -3l530 -250v225l-558 263q-27 13 -27 37t27 37l558 263v253q0 39 41 39t41 -39v-214l529 250 q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-560 -264v-500l560 -264q24 -11 24 -37q0 -41 -41 -41q-8 0 -14 3l-529 250v-225l557 -263q27 -13 27 -37zM755 803v422l-448 -211zM1284 150l-447 211v-422z" />
+<glyph unicode="&#xf707;" horiz-adv-x="1591" d="M1421 -401q0 -41 -41 -41q-8 0 -14 3l-528 249v-211q0 -41 -41 -41t-41 41v250l-559 264q-27 13 -27 37t27 37l559 264v225l-531 -251q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l562 265v498l-562 265q-24 11 -24 37q0 41 41 41q8 0 14 -3l531 -251v215q0 39 41 39t41 -39 v-253l556 -263q27 -13 27 -37t-27 -37l-556 -263v-224l528 249q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-559 -264v-500l559 -264q24 -11 24 -37zM1284 1014l-446 210v-420zM756 -62v424l-449 -212z" />
+<glyph unicode="&#xf708;" horiz-adv-x="1591" d="M1421 -259q0 -41 -37 -41h-578l-35 -95q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l24 67h-508q-39 0 -39 41t39 41h538l80 218h-35q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584q-216 0 -381 -143.5t-165 -356.5t165 -356.5 t381 -143.5h59l165 454q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-155 -426h438q39 0 39 -41t-39 -41h-468l-79 -218h549q37 0 37 -41z" />
+<glyph unicode="&#xf709;" horiz-adv-x="1591" d="M1421 -259q0 -41 -37 -41h-818l-35 -95q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l24 67h-268q-39 0 -39 41t39 41h298l80 218h-378q-39 0 -39 41t39 41h408l165 454q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-155 -426h89q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5 h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5t-187 -413.5t-435 -168.5h-125l-79 -218h789q37 0 37 -41z" />
+<glyph unicode="&#xf70a;" horiz-adv-x="1364" d="M1358 0q-126 4 -160 4t-160 -4v67l47 -2q72 0 72 73v1054h-950v-1054q0 -56 36 -68q11 -4 48 -4q16 0 35 1v-67q-126 4 -160 4t-160 -4v67l47 -2q72 0 72 73v1099q0 37 39 37h1038q37 0 37 -37v-1099q0 -56 36 -68q11 -4 48 -4q16 0 35 1v-67z" />
+<glyph unicode="&#xf70b;" horiz-adv-x="1364" d="M1239 1140v-1101q0 -39 -37 -39h-1038q-39 0 -39 39v1101q0 56 -36 68q-11 4 -48 4q-16 0 -35 -1v67q126 -4 160 -4t160 4v-67l-47 2q-72 0 -72 -73v-1058h950v1058q0 56 -36 68q-11 4 -48 4q-16 0 -35 -1v67q126 -4 160 -4t160 4v-67l-47 2q-72 0 -72 -73z" />
+<glyph unicode="&#xf70c;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1351 582 q0 -41 -37 -41h-477v-477q0 -37 -41 -37t-41 37v477h-476q-39 0 -39 41t39 41h476v476q0 39 41 39t41 -39v-476h477q37 0 37 -41z" />
+<glyph unicode="&#xf70d;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1248.5 129.5q187.5 188.5 187.5 453t-187.5 452.5t-452.5 188t-452.5 -187.5t-187.5 -452.5t188.5 -453.5t452.5 -188.5t451.5 188.5zM1201 219 q0 -43 -43 -43q-15 0 -25 10l-337 338l-337 -337q-10 -10 -26 -10q-42 0 -42 42q0 16 10 26l337 337l-337 336q-10 10 -10 27q0 42 42 42q15 0 26 -11l337 -336l337 337q10 10 25 10q43 0 43 -43q0 -15 -10 -25l-337 -337l337 -338q10 -10 10 -25z" />
+<glyph unicode="&#xf70e;" horiz-adv-x="1591" d="M1307 1093q211 -212 211 -510.5t-211.5 -511t-509.5 -212.5t-510.5 212.5t-212.5 511.5t211.5 510.5t511 211.5t510.5 -212zM1388 825q-73 178 -233.5 288t-358 110t-359 -110t-233.5 -288h1184zM1436 582q0 82 -20 161h-1240q-20 -79 -20 -161t21 -161h1238 q21 79 21 161zM797 -59q197 0 357.5 110.5t233.5 287.5h-1184q73 -177 234.5 -287.5t358.5 -110.5z" />
+<glyph unicode="&#xf70f;" horiz-adv-x="1591" d="M1421 800q0 -45 -39 -45q-6 0 -15 3l-1170 384q-27 9 -27 39t27 39l1170 384q6 2 13 2q41 0 41 -41q0 -31 -25 -39l-1051 -345l1051 -345q25 -8 25 -36zM1421 392q0 -45 -39 -45q-6 0 -15 3l-1172 385q-25 8 -25 39q0 41 41 41q7 0 13 -2l1172 -385q25 -8 25 -36z M1421 -16q0 -30 -27 -39l-1170 -384q-9 -3 -15 -3q-39 0 -39 45q0 28 25 36l1051 345l-1051 345q-25 8 -25 39q0 41 41 41q7 0 13 -2l1170 -384q27 -9 27 -39z" />
+<glyph unicode="&#xf710;" horiz-adv-x="1591" d="M1421 1181q0 -30 -27 -39l-1170 -384q-9 -3 -15 -3q-39 0 -39 45q0 28 25 36l1051 345l-1051 345q-25 8 -25 39q0 41 41 41q7 0 13 -2l1170 -384q27 -9 27 -39zM1421 774q0 -31 -25 -39l-1172 -385q-9 -3 -15 -3q-39 0 -39 45q0 28 25 36l1172 385q6 2 13 2q41 0 41 -41z M1421 -397q0 -45 -39 -45q-6 0 -15 3l-1170 384q-27 9 -27 39t27 39l1170 384q6 2 13 2q41 0 41 -41q0 -31 -25 -39l-1051 -345l1051 -345q25 -8 25 -36z" />
+<glyph unicode="&#xf711;" horiz-adv-x="1024" d="M788 1113v-1072q0 -41 -39 -41h-476q-37 0 -37 41t37 41h433v1031q0 39 41 39t41 -39z" />
+<glyph unicode="&#xf712;" horiz-adv-x="1024" d="M788 41q0 -41 -37 -41h-476q-39 0 -39 41v1072q0 39 41 39t41 -39v-1031h433q37 0 37 -41z" />
+<glyph unicode="&#xf713;" horiz-adv-x="1591" d="M1421 -353q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1090 -514l1090 -514q24 -11 24 -37zM1202 1296q0 -163 -96.5 -260.5t-258.5 -97.5q-55 0 -163 13.5t-163 13.5q-156 0 -234 -95q-68 -82 -68 -181 q0 -51 19.5 -116.5t19.5 -72.5q0 -21 -18 -21q-22 0 -47 46q-48 90 -48 201q0 156 90.5 254.5t244.5 98.5q56 0 167.5 -16t167.5 -16q158 0 244 105q68 83 68 181q0 48 -18.5 112.5t-18.5 75.5q0 21 17 21q22 0 46 -45q49 -91 49 -201z" />
+<glyph unicode="&#xf714;" horiz-adv-x="1591" d="M1421 198q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1090 514l-1090 514q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1527 1066q19 0 19 -21.5t-11 -48.5q-45 -109 -146.5 -183t-216.5 -74q-148 0 -261 136l-175 254 q-106 136 -235 136q-102 0 -176 -57q-45 -34 -86.5 -97.5t-54.5 -63.5q-20 0 -20 22t11 49q45 109 146.5 183t216.5 74q148 0 255 -136l169 -254q105 -136 248 -136q101 0 174 56q45 35 87.5 98t55.5 63z" />
+<glyph unicode="&#xf715;" horiz-adv-x="1591" d="M1421 31q0 -41 -41 -41q-8 0 -14 3l-1169 552q-27 13 -27 37t27 37l1169 552q6 3 14 3q41 0 41 -41q0 -26 -24 -37l-1003 -473h988q39 0 39 -41t-39 -41h-988l1003 -473q24 -11 24 -37zM1421 -367q0 -41 -41 -41q-8 0 -14 3l-1176 555q-20 9 -20 34q0 41 41 41 q12 0 16 -2l1176 -555q18 -8 18 -35z" />
+<glyph unicode="&#xf716;" horiz-adv-x="1591" d="M1421 582q0 -24 -27 -37l-1169 -552q-6 -3 -14 -3q-41 0 -41 41q0 26 24 37l1003 473h-988q-39 0 -39 41t39 41h988l-1003 473q-24 11 -24 37q0 41 41 41q8 0 14 -3l1169 -552q27 -13 27 -37zM1421 184q0 -25 -20 -34l-1176 -555q-6 -3 -14 -3q-41 0 -41 41q0 27 18 35 l1176 555q4 2 16 2q41 0 41 -41z" />
+<glyph unicode="&#xf717;" horiz-adv-x="1591" d="M1421 -259q0 -41 -37 -41h-618l-35 -95q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l24 67h-468q-39 0 -39 41t39 41h498l80 218h-578q-39 0 -39 41t39 41h608l79 218h-104q-248 0 -435 168.5t-187 413.5t187 413.5t435 168.5h590q39 0 39 -41t-39 -41h-584 q-216 0 -381 -143.5t-165 -356.5t165 -356.5t381 -143.5h128l107 294q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-97 -266h369q39 0 39 -41t-39 -41h-398l-80 -218h480q37 0 37 -41t-37 -41h-509l-80 -218h589q37 0 37 -41z" />
+<glyph unicode="&#xf718;" horiz-adv-x="1591" d="M1421 -259q0 -41 -37 -41h-878l-35 -95q-17 -47 -44 -47q-42 0 -42 38q0 15 8 37l24 67h-208q-39 0 -39 41t39 41h238l80 218h-318q-39 0 -39 41t39 41h348l79 218h-427q-39 0 -39 41t39 41h457l107 294q17 46 43 46q42 0 42 -37q0 -15 -8 -37l-97 -266h40 q216 0 381 143.5t165 356.5t-165 356.5t-381 143.5h-584q-39 0 -39 41t39 41h590q248 0 435 -168.5t187 -413.5t-187 -413.5t-435 -168.5h-75l-80 -218h740q37 0 37 -41t-37 -41h-769l-80 -218h849q37 0 37 -41z" />
+<glyph unicode="&#xfe10;" horiz-adv-x="512" d="M326 33q-33 -33 -83 -33t-78.5 32.5t-28.5 76t29 76t85 32.5t91 -58t35 -157q0 -152 -76.5 -274.5t-110.5 -122.5q-20 0 -20 22q0 8 14 23q148 157 148 352q0 30 -5 31z" />
+<glyph unicode="&#xfe11;" horiz-adv-x="512" d="M262 -219l16 90q0 85 -83.5 147.5t-170.5 62.5q47 50 141 50q125 0 225 -111.5t100 -238.5q0 -46 -34 -80t-80 -34t-80 34t-34 80z" />
+<glyph unicode="&#xfe12;" horiz-adv-x="512" d="M333 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32z" />
+<glyph unicode="&#xfe13;" horiz-adv-x="547" d="M378 104q0 -42 -31 -73t-73.5 -31t-73.5 31t-31 73t31 73t73.5 31t73.5 -31t31 -73zM378 743q0 -42 -31 -73t-73.5 -31t-73.5 31t-31 73t31 73t73.5 31t73.5 -31t31 -73z" />
+<glyph unicode="&#xfe14;" horiz-adv-x="569" d="M387 774q0 -45 -31.5 -76.5t-76.5 -31.5t-77 32t-32 76.5t32 76.5t76.5 32t76.5 -32t32 -77zM348 23q-26 -23 -73.5 -23t-76 32.5t-28.5 76t29 76t80 32.5q114 0 114 -211q0 -153 -69.5 -277t-100.5 -124q-20 0 -20 22q0 11 14 27q131 151 131 369z" />
+<glyph unicode="&#xfe15;" horiz-adv-x="682" d="M418 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM341 383q-25 0 -29 47l-79 932v10q0 40 30 66q34 28 78 28t78 -28q30 -26 30 -66v-10l-79 -934q-4 -45 -29 -45z" />
+<glyph unicode="&#xfe16;" horiz-adv-x="909" d="M504 185q32 -32 32 -76.5t-32 -76.5t-77 -32t-77 32t-32 76.5t32 76.5t77 32t77 -32zM743 1350q79 -73 79 -191.5t-98 -191.5q-270 -200 -270 -457v-72q0 -55 -26 -55t-26 49v92q0 267 181 461q69 74 69 182t-28 152q-49 80 -195 80q-187 0 -268 -139q114 0 114 -93.5 t-94 -93.5t-94 102.5t95.5 185.5t252.5 83q207 0 308 -94z" />
+<glyph unicode="&#xfe17;" horiz-adv-x="1864" d="M1864 -370q0 -52 -21 -52q-11 0 -20 11q-32 44 -105 127q-249 239 -786 239t-786 -239l-105 -127q-9 -11 -20 -11q-21 0 -21 52v507h1864v-507zM1782 55h-1700v-291q282 273 853.5 273t846.5 -271v289z" />
+<glyph unicode="&#xfe18;" horiz-adv-x="1864" d="M1864 -137h-1864v507q0 52 21 52q11 0 20 -11q32 -44 105 -127q249 -239 786 -239t786 239l105 127q9 11 20 11q21 0 21 -52v-507zM1782 -55v291q-282 -273 -853.5 -273t-846.5 271v-289h1700z" />
+<glyph unicode="&#xfe19;" horiz-adv-x="800" d="M479 1399.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM479 191.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79t79 32.5t80 -33.5zM479 795.5q34 -33.5 34 -79t-34 -79t-79.5 -33.5t-79 33.5t-33.5 80t33 79 t79 32.5t80 -33.5z" />
+<glyph unicode="&#xfe1a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe1b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe1c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe1d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe1e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe1f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe20;" horiz-adv-x="0" d="M587 1475q-623 0 -989 -314q-23 -20 -132 -137q-11 -12 -26 -12q-34 0 -34 26q0 9 6 17q203 255 517.5 388.5t657.5 133.5v-102z" />
+<glyph unicode="&#xfe21;" horiz-adv-x="0" d="M594 1038q0 -26 -34 -26q-15 0 -26 12q-42 48 -132 137q-367 314 -989 314v102q344 0 658 -133.5t517 -388.5q6 -8 6 -17z" />
+<glyph unicode="&#xfe22;" horiz-adv-x="0" d="M63 1500q-240 0 -316 -304h-56q31 177 145.5 290t267 113t386.5 -99l97 -41v-123l-139 59q-247 105 -385 105z" />
+<glyph unicode="&#xfe23;" horiz-adv-x="0" d="M309 1599q-35 -171 -140 -287t-263 -116t-426 112l-67 28v123l107 -46q270 -116 410 -116q252 0 323 302h56z" />
+<glyph unicode="&#xfe24;" horiz-adv-x="0" d="M1244 1462h-672v114h672v-114z" />
+<glyph unicode="&#xfe25;" horiz-adv-x="0" d="M572 1462h-672v114h672v-114z" />
+<glyph unicode="&#xfe26;" horiz-adv-x="0" d="M1244 1462h-1344v114h1344v-114z" />
+<glyph unicode="&#xfe27;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe28;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe29;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe2a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe2b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe2c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe2d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe2e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe2f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#xfe30;" horiz-adv-x="800" d="M479.5 875q33.5 -34 33.5 -79.5t-33.5 -79t-80 -33.5t-79 33t-32.5 79t33.5 80t79 34t79 -34zM513 113q0 -47 -33 -80t-80 -33t-80 33t-33 79.5t33.5 80t80 33.5t79.5 -33t33 -80z" />
+<glyph unicode="&#xfe31;" horiz-adv-x="626" d="M354 -308q0 -39 -41 -39t-41 39v1782q0 37 41 37t41 -37v-1782z" />
+<glyph unicode="&#xfe32;" horiz-adv-x="626" d="M354 204q0 -39 -41 -39t-41 39v758q0 37 41 37t41 -37v-758z" />
+<glyph unicode="&#xfe33;" horiz-adv-x="626" d="M354 -8q0 -39 -41 -39t-41 39v1182q0 37 41 37t41 -37v-1182z" />
+<glyph unicode="&#xfe34;" horiz-adv-x="810" d="M604 270q12 -12 12 -30.5t-12 -30.5l-310 -303l136 -136q16 -16 16 -32v-115q0 -39 -41 -39t-41 39v96l-158 156q-12 12 -12 30.5t12 30.5l310 303l-310 304q-12 12 -12 30.5t12 30.5l310 303l-310 303q-12 12 -12 31t12 31l158 155v94q0 39 41 39t41 -39v-112 q0 -17 -16 -33l-136 -135l310 -303q12 -12 12 -31t-12 -31l-310 -303z" />
+<glyph unicode="&#xfe35;" horiz-adv-x="1864" d="M1864 -210q0 -24 -27 -24q-11 0 -20 11q-33 44 -105 127q-291 293 -780 293t-780 -293q-24 -24 -105 -127q-9 -11 -20 -11q-27 0 -27 24q0 10 5 17q153 229 400.5 356.5t526.5 127.5t526.5 -127.5t400.5 -356.5q5 -7 5 -17z" />
+<glyph unicode="&#xfe36;" horiz-adv-x="1864" d="M1864 267q0 -10 -5 -17q-153 -229 -400.5 -356.5t-526.5 -127.5t-526.5 127.5t-400.5 356.5q-5 7 -5 17q0 24 27 24q11 0 20 -11q33 -44 105 -127q291 -293 780 -293t780 293q24 24 105 127q9 11 20 11q27 0 27 -24z" />
+<glyph unicode="&#xfe37;" horiz-adv-x="1864" d="M1864 -332q0 -41 -20.5 -41t-24.5 18q-9 154 -94 237q-43 42 -114 54q-34 5 -129 5h-277q-89 0 -132 21q-96 47 -141 202q-45 -155 -141 -202q-42 -21 -131 -21h-277q-95 0 -129 -5q-71 -12 -114 -54q-85 -83 -94 -237q-4 -18 -23 -18q-23 0 -23 41q0 174 78 285 q51 73 116 93q42 13 149 13h313q117 0 181 72t73 190q2 33 21 33t22 -18t4 -35q31 -242 252 -242h313q107 0 149 -13q65 -20 116 -93q77 -109 77 -285z" />
+<glyph unicode="&#xfe38;" horiz-adv-x="1864" d="M1864 332q0 -174 -78 -285q-51 -73 -116 -93q-42 -13 -149 -13h-313q-117 0 -181 -72t-73 -190q-2 -33 -21 -33t-22 18t-4 35q-31 242 -252 242h-313q-107 0 -149 13q-65 20 -116 93q-77 109 -77 285q0 41 20.5 41t24.5 -18q9 -154 94 -237q43 -42 114 -54q34 -5 129 -5 h277q89 0 132 -21q96 -47 141 -202q45 155 141 202q42 21 131 21h277q95 0 129 5q71 12 114 54q85 83 94 237q4 18 23 18q23 0 23 -41z" />
+<glyph unicode="&#xfe39;" horiz-adv-x="1864" d="M1442 -56h-1020q-47 0 -188.5 -122.5t-161.5 -155.5h-72l287 390h1290l287 -390h-72q-20 33 -161.5 155.5t-188.5 122.5z" />
+<glyph unicode="&#xfe3a;" horiz-adv-x="1864" d="M422 56h1020q47 0 188.5 122.5t161.5 155.5h72l-287 -390h-1290l-287 390h72q20 -33 161.5 -155.5t188.5 -122.5z" />
+<glyph unicode="&#xfe3b;" horiz-adv-x="1864" d="M1864 -366q0 -52 -21 -52q-11 0 -20 11q-33 44 -105 127q-247 239 -786 239t-786 -239q-16 -16 -105 -127q-9 -11 -20 -11q-21 0 -21 52v407h1864v-407z" />
+<glyph unicode="&#xfe3c;" horiz-adv-x="1864" d="M1864 -41h-1864v407q0 52 21 52q11 0 20 -11q33 -44 105 -127q247 -239 786 -239t786 239q16 16 105 127q9 11 20 11q21 0 21 -52v-407z" />
+<glyph unicode="&#xfe3d;" horiz-adv-x="1864" d="M1864 -390q0 -42 -38 -42q-12 0 -41 15l-853 444l-853 -444q-29 -15 -41 -15q-38 0 -38 42q0 24 39 44l893 465l893 -465q39 -20 39 -44zM1864 -101q0 -42 -38 -42q-12 0 -41 15l-853 444l-853 -444q-29 -15 -41 -15q-38 0 -38 42q0 24 39 44l893 465l893 -465 q39 -20 39 -44z" />
+<glyph unicode="&#xfe3e;" horiz-adv-x="1864" d="M1864 77q0 -24 -39 -44l-893 -465l-893 465q-39 20 -39 44q0 42 38 42q12 0 41 -15l853 -444l853 444q29 15 41 15q38 0 38 -42zM1864 366q0 -24 -39 -44l-893 -465l-893 465q-39 20 -39 44q0 42 38 42q12 0 41 -15l853 -444l853 444q29 15 41 15q38 0 38 -42z" />
+<glyph unicode="&#xfe3f;" horiz-adv-x="1864" d="M1864 -200q0 -42 -38 -42q-12 0 -41 15l-853 444l-853 -444q-29 -15 -41 -15q-38 0 -38 42q0 24 39 44l893 465l893 -465q39 -20 39 -44z" />
+<glyph unicode="&#xfe40;" horiz-adv-x="1864" d="M1864 267q0 -24 -39 -44l-893 -465l-893 465q-39 20 -39 44q0 42 38 42q12 0 41 -15l853 -444l853 444q29 15 41 15q38 0 38 -42z" />
+<glyph unicode="&#xfe41;" horiz-adv-x="1556" d="M1556 -350q0 -68 -40.5 -68t-40.5 68v309h-1475v82h1556v-391z" />
+<glyph unicode="&#xfe42;" horiz-adv-x="1556" d="M1556 -41h-1556v391q0 68 40.5 68t40.5 -68v-309h1475v-82z" />
+<glyph unicode="&#xfe43;" horiz-adv-x="1556" d="M1556 -350q0 -68 -41 -68t-41 68v109h-1474v82h1474v118h-1474v82h1556v-391z" />
+<glyph unicode="&#xfe44;" horiz-adv-x="1556" d="M1556 -41h-1556v391q0 68 41 68t41 -68v-109h1474v-82h-1474v-118h1474v-82z" />
+<glyph unicode="&#xfe45;" horiz-adv-x="1315" d="M1174 442q0 -96 -66 -154.5t-167 -58.5t-178 62q-46 37 -62.5 72.5t-31.5 105.5q-30 142 -135 227.5t-251 85.5q-79 0 -142 -24q138 205 428 205q220 0 412.5 -152.5t192.5 -368.5z" />
+<glyph unicode="&#xfe46;" horiz-adv-x="1315" d="M1174 442q0 -96 -66 -154.5t-167 -58.5t-178 62q-46 37 -62.5 72.5t-31.5 105.5q-30 142 -135 227.5t-251 85.5q-79 0 -142 -24q138 205 428 205q220 0 412.5 -152.5t192.5 -368.5zM569 903q-145 0 -253 -62q158 -10 267 -107t145 -253q15 -64 25.5 -88.5t47.5 -54.5 q62 -49 142.5 -49t128.5 45q42 40 42 107v14v3q-33 198 -187.5 321.5t-357.5 123.5z" />
+<glyph unicode="&#xfe47;" horiz-adv-x="1864" d="M1864 -356q0 -62 -40.5 -62t-40.5 68v309h-1701v-309q0 -68 -41 -68t-41 62v397h1864v-397z" />
+<glyph unicode="&#xfe48;" horiz-adv-x="1864" d="M1864 -41h-1864v397q0 62 40.5 62t40.5 -68v-309h1701v309q0 68 41 68t41 -62v-397z" />
+<glyph unicode="&#xfe49;" horiz-adv-x="1074" d="M1074 1506q0 -41 -39 -41h-196q-39 0 -39 41t39 41h196q39 0 39 -41zM674 1506q0 -41 -39 -41h-196q-39 0 -39 41t39 41h196q39 0 39 -41zM274 1506q0 -41 -39 -41h-196q-39 0 -39 41t39 41h196q39 0 39 -41z" />
+<glyph unicode="&#xfe4a;" horiz-adv-x="1074" d="M1074 1506q0 -41 -39 -41h-296q-39 0 -39 41t39 41h296q39 0 39 -41zM624 1506q0 -41 -39 -41h-96q-39 0 -39 41t39 41h96q39 0 39 -41zM374 1506q0 -41 -39 -41h-296q-39 0 -39 41t39 41h296q39 0 39 -41z" />
+<glyph unicode="&#xfe4b;" horiz-adv-x="2076" d="M2026 1375q0 -41 -39 -41h-112q-17 0 -33 16l-135 136l-303 -310q-12 -12 -31 -12t-31 12l-303 310l-303 -310q-12 -12 -30.5 -12t-30.5 12l-303 310l-136 -136q-16 -16 -32 -16h-115q-39 0 -39 41t39 41h96l156 158q12 12 30.5 12t30.5 -12l303 -310l304 310 q12 12 30.5 12t30.5 -12l303 -310l303 310q12 12 31 12t31 -12l155 -158h94q39 0 39 -41z" />
+<glyph unicode="&#xfe4c;" horiz-adv-x="2076" d="M2026 262q0 -41 -39 -41h-112q-17 0 -33 16l-135 136l-303 -310q-12 -12 -31 -12t-31 12l-303 310l-303 -310q-12 -12 -30.5 -12t-30.5 12l-303 310l-136 -136q-16 -16 -32 -16h-115q-39 0 -39 41t39 41h96l156 158q12 12 30.5 12t30.5 -12l303 -310l304 310 q12 12 30.5 12t30.5 -12l303 -310l303 310q12 12 31 12t31 -12l155 -158h94q39 0 39 -41zM2026 762q0 -41 -39 -41h-112q-17 0 -33 16l-135 136l-303 -310q-12 -12 -31 -12t-31 12l-303 310l-303 -310q-12 -12 -30.5 -12t-30.5 12l-303 310l-136 -136q-16 -16 -32 -16h-115 q-39 0 -39 41t39 41h96l156 158q12 12 30.5 12t30.5 -12l303 -310l304 310q12 12 30.5 12t30.5 -12l303 -310l303 310q12 12 31 12t31 -12l155 -158h94q39 0 39 -41z" />
+<glyph unicode="&#xfe4d;" horiz-adv-x="1074" d="M1074 -300q0 -41 -39 -41h-196q-39 0 -39 41t39 41h196q39 0 39 -41zM674 -300q0 -41 -39 -41h-196q-39 0 -39 41t39 41h196q39 0 39 -41zM274 -300q0 -41 -39 -41h-196q-39 0 -39 41t39 41h196q39 0 39 -41z" />
+<glyph unicode="&#xfe4e;" horiz-adv-x="1074" d="M1074 -300q0 -41 -39 -41h-296q-39 0 -39 41t39 41h296q39 0 39 -41zM624 -300q0 -41 -39 -41h-96q-39 0 -39 41t39 41h96q39 0 39 -41zM374 -300q0 -41 -39 -41h-296q-39 0 -39 41t39 41h296q39 0 39 -41z" />
+<glyph unicode="&#xfe4f;" horiz-adv-x="2076" d="M2026 -211q0 -41 -39 -41h-112q-17 0 -33 16l-135 136l-303 -310q-12 -12 -31 -12t-31 12l-303 310l-303 -310q-12 -12 -30.5 -12t-30.5 12l-303 310l-136 -136q-16 -16 -32 -16h-115q-39 0 -39 41t39 41h96l156 158q12 12 30.5 12t30.5 -12l303 -310l304 310 q12 12 30.5 12t30.5 -12l303 -310l303 310q12 12 31 12t31 -12l155 -158h94q39 0 39 -41z" />
+<glyph unicode="&#xfe61;" horiz-adv-x="987" d="M877 1148l-303 -66q2 6 3 15q0 41 -29 67l284 125zM494 1183q-25 0 -43 -11l-31 308h148l-31 -308q-18 11 -43 11zM777 838l-120 -87l-157 267q51 6 70 51zM440 1164q-29 -25 -29 -62q0 -10 2 -20l-303 66l46 141zM487 1018l-156 -267l-120 87l206 231q20 -45 70 -51z " />
+<glyph unicode="&#xfff9;" horiz-adv-x="0" />
+<glyph unicode="&#xfffa;" horiz-adv-x="0" />
+<glyph unicode="&#xfffb;" horiz-adv-x="0" />
+<glyph unicode="&#xfffc;" d="M2023 -72q0 -142 -101.5 -242.5t-243.5 -100.5h-1308q-142 0 -243.5 100.5t-101.5 242.5v1308q0 142 101.5 243.5t243.5 101.5h1308q142 0 243.5 -101.5t101.5 -243.5v-1308zM1922 -29v1265q0 117 -85 200t-202 83h-1265q-117 0 -200.5 -83t-83.5 -200v-1265 q0 -117 83.5 -200.5t200.5 -83.5h554v-92h83v75h89v-75h82v75h90v-75h82v75h82q18 -81 106 -81q33 0 82 22v73h-30q-27 -24 -48.5 -24t-27.5 27h121q117 0 202 83.5t85 200.5zM1805 849q0 -183 -228 -183q-82 0 -140 11v113h7q53 -20 111.5 -20t81.5 31.5t23 103.5v273h-140 v101h285v-430zM1401 858q0 -95 -70 -139t-170 -44h-274v604h265q208 0 208 -137q0 -87 -90 -127v-13q131 -26 131 -144zM1823 393h-192v-498h-145v498h-193v106h530v-106zM826 977q0 -146 -82.5 -230t-227.5 -84t-228 84.5t-83 230t82.5 229.5t228.5 84t228 -84t82 -230z M1538 -391q-90 0 -90 93.5t90 93.5q32 0 62 -15v-41h-3q-27 24 -52 24q-52 0 -52 -62t53 -62q25 0 52 24h2v-40q-33 -15 -62 -15zM1033 -117q-145 0 -226 84t-81 229t82 230.5t225 85.5q107 0 212 -51v-138h-9q-96 83 -181 83t-131 -60t-46 -151t45.5 -148.5t134 -57.5 t180.5 82h7v-136q-116 -52 -212 -52zM1428 -240h-98v-38h92v-32h-92v-78h-42v180h140v-32zM1256 -240h-98v-38h92v-32h-92v-78h-42v180h140v-32zM1084 -240h-97v-38h91v-32h-91v-78h-43v180h140v-32zM674 -105h-433v604h433v-106h-288v-120h266v-106h-266v-166h288v-106z M1033 1036l70 -2q108 0 108 78q0 66 -95 66h-83v-142zM1033 776l84 -2q133 0 133 86q0 83 -125 83l-92 -2v-165zM516 765q82 0 120 62t38 149.5t-38 149t-120 61.5q-159 0 -159 -210q0 -87 38.5 -149.5t120.5 -62.5z" />
+<glyph unicode="&#xfffd;" d="M1877 180q99 0 99 -90.5t-101 -90.5h-50v181h52zM1798 148h-98v-38h92v-32h-92v-78h-42v180h140v-32zM1626 148h-98v-38h92v-32h-92v-78h-42v180h140v-32zM1474 200v-71h-8v71h-172v-220h80q-181 -204 -350 -422q-436 561 -942 1024q506 463 942 1024q436 -561 942 -1024 q-200 -183 -390 -382h-102zM1454 148h-97v-38h91v-32h-91v-78h-43v180h140v-32zM1377 58h67l-67 -75v75zM1873 30q59 0 59 59.5t-64 59.5v-119h5zM1134 135l-2 98q0 99 29 164t121 150.5t116 118.5q58 81 58 194q0 164 -132 251q-114 75 -274 75t-345 -56v-195 q176 76 310 76q86 0 149 -36.5t63 -121.5t-130.5 -252.5t-155.5 -231t-25 -234.5h218zM1134 -178v218h-218v-218h218z" />
+<glyph unicode="&#x1d300;" d="M1724 636h-304v192h304v-192zM1176 636h-304v192h304v-192zM628 636h-304v192h304v-192z" />
+<glyph unicode="&#x1d301;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192z" />
+<glyph unicode="&#x1d302;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 424h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d303;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d304;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192z" />
+<glyph unicode="&#x1d305;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192z" />
+<glyph unicode="&#x1d306;" d="M1724 0h-1400v192h1400v-192zM1724 424h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d307;" d="M1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d308;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d309;" d="M1724 1272h-1400v192h1400v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 0h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d30a;" d="M1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-1400v192h1400v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192z" />
+<glyph unicode="&#x1d30b;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-1400v192h1400v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192z" />
+<glyph unicode="&#x1d30c;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 0h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d30d;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d30e;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d30f;" d="M1724 1272h-1400v192h1400v-192zM1724 0h-1400v192h1400v-192zM1724 424h-1400v192h1400v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192z" />
+<glyph unicode="&#x1d310;" d="M1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 424h-1400v192h1400v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d311;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 424h-1400v192h1400v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d312;" d="M1724 1272h-1400v192h1400v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 0h-1400v192h1400v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192z" />
+<glyph unicode="&#x1d313;" d="M1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d314;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d315;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 0h-1400v192h1400v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d316;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d317;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d318;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-1400v192h1400v-192zM1724 0h-1400v192h1400v-192zM1724 424h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d319;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-1400v192h1400v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d31a;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-1400v192h1400v-192zM1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d31b;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-1400v192h1400v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 0h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d31c;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-1400v192h1400v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192z" />
+<glyph unicode="&#x1d31d;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-1400v192h1400v-192zM1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192z" />
+<glyph unicode="&#x1d31e;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-1400v192h1400v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 0h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d31f;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-1400v192h1400v-192z " />
+<glyph unicode="&#x1d320;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192z M1724 1272h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d321;" d="M1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192zM1724 0h-1400v192h1400v-192zM1724 424h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d322;" d="M1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d323;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d324;" d="M1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 0h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d325;" d="M1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d326;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d327;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 0h-1400v192h1400v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d328;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-1400v192h1400v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d329;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d32a;" d="M1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192zM1724 0h-1400v192h1400v-192zM1724 424h-1400v192h1400v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192z" />
+<glyph unicode="&#x1d32b;" d="M1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 424h-1400v192h1400v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d32c;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 424h-1400v192h1400v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d32d;" d="M1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 0h-1400v192h1400v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192z" />
+<glyph unicode="&#x1d32e;" d="M1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d32f;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d330;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 0h-1400v192h1400v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d331;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d332;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 1272h-516v192h516v-192z M840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d333;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192zM1724 0h-1400v192h1400v-192zM1724 424h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d334;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d335;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-1400v192h1400v-192zM1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d336;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 0h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d337;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192z" />
+<glyph unicode="&#x1d338;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192zM1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-516v192h516v-192z M840 424h-516v192h516v-192z" />
+<glyph unicode="&#x1d339;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 0h-1400v192h1400v-192zM1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z " />
+<glyph unicode="&#x1d33a;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-516v192h516v-192z M840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d33b;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192z M1724 1272h-516v192h516v-192zM840 1272h-516v192h516v-192z" />
+<glyph unicode="&#x1d33c;" d="M1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-1400v192h1400v-192zM1724 424h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d33d;" d="M1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 424h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192z" />
+<glyph unicode="&#x1d33e;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 424h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d33f;" d="M1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 0h-1400v192h1400v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d340;" d="M1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d341;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-1400v192h1400v-192z " />
+<glyph unicode="&#x1d342;" d="M1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 848h-1400v192h1400v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 0h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d343;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-1400v192h1400v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192z " />
+<glyph unicode="&#x1d344;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192z M1724 848h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d345;" d="M1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-1400v192h1400v-192zM1724 424h-1400v192h1400v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192z" />
+<glyph unicode="&#x1d346;" d="M1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-1400v192h1400v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192z" />
+<glyph unicode="&#x1d347;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 424h-1400v192h1400v-192z " />
+<glyph unicode="&#x1d348;" d="M1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 0h-1400v192h1400v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192z" />
+<glyph unicode="&#x1d349;" d="M1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192z" />
+<glyph unicode="&#x1d34a;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 848h-516v192h516v-192z M840 848h-516v192h516v-192z" />
+<glyph unicode="&#x1d34b;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-1400v192h1400v-192 z" />
+<glyph unicode="&#x1d34c;" d="M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 848h-516v192h516v-192zM840 848h-516v192h516v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-516v192h516v-192z M840 0h-516v192h516v-192z" />
+<glyph unicode="&#x1d34d;" d="M1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192z M1724 848h-516v192h516v-192zM840 848h-516v192h516v-192z" />
+<glyph unicode="&#x1d34e;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-1400v192h1400v-192zM1724 424h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d34f;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-1400v192h1400v-192z " />
+<glyph unicode="&#x1d350;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192z M1724 424h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d351;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 424h-516v192h516v-192zM840 424h-516v192h516v-192zM1724 0h-1400v192h1400v-192 z" />
+<glyph unicode="&#x1d352;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192zM1724 424h-516v192h516v-192z M840 424h-516v192h516v-192z" />
+<glyph unicode="&#x1d353;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192z M1724 424h-516v192h516v-192zM840 424h-516v192h516v-192z" />
+<glyph unicode="&#x1d354;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192 zM1724 0h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d355;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192 zM1724 0h-516v192h516v-192zM840 0h-516v192h516v-192z" />
+<glyph unicode="&#x1d356;" d="M1724 848h-304v192h304v-192zM1176 848h-304v192h304v-192zM628 848h-304v192h304v-192zM1724 1272h-304v192h304v-192zM1176 1272h-304v192h304v-192zM628 1272h-304v192h304v-192zM1724 0h-304v192h304v-192zM1176 0h-304v192h304v-192zM628 0h-304v192h304v-192z M1724 424h-304v192h304v-192zM1176 424h-304v192h304v-192zM628 424h-304v192h304v-192z" />
+<glyph unicode="&#x1d360;" d="M1724 486h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d361;" d="M1724 274h-1400v192h1400v-192zM1724 698h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d362;" d="M1724 62h-1400v192h1400v-192zM1724 486h-1400v192h1400v-192zM1724 910h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d363;" d="M1724 -150h-1400v192h1400v-192zM1724 274h-1400v192h1400v-192zM1724 698h-1400v192h1400v-192zM1724 1122h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d364;" d="M1724 -362h-1400v192h1400v-192zM1724 62h-1400v192h1400v-192zM1724 486h-1400v192h1400v-192zM1724 910h-1400v192h1400v-192zM1724 1334h-1400v192h1400v-192z" />
+<glyph unicode="&#x1d365;" d="M1724 -362h-1400v192h604v1696h192v-1696h604v-192z" />
+<glyph unicode="&#x1d366;" d="M1724 -362h-1400v192h1400v-192zM1724 62h-1400v192h604v1272h192v-1272h604v-192z" />
+<glyph unicode="&#x1d367;" d="M1724 -362h-1400v192h1400v-192zM1724 62h-1400v192h1400v-192zM1724 486h-1400v192h604v848h192v-848h604v-192z" />
+<glyph unicode="&#x1d368;" d="M1724 486h-1400v192h1400v-192zM1724 62h-1400v192h1400v-192zM1724 -362h-1400v192h1400v-192zM1724 910h-1400v192h604v424h192v-424h604v-192z" />
+<glyph unicode="&#x1d369;" horiz-adv-x="840" d="M516 -150h-192v1464h192v-1464z" />
+<glyph unicode="&#x1d36a;" horiz-adv-x="1264" d="M516 -150h-192v1464h192v-1464zM940 -150h-192v1464h192v-1464z" />
+<glyph unicode="&#x1d36b;" horiz-adv-x="1688" d="M516 -150h-192v1464h192v-1464zM940 -150h-192v1464h192v-1464zM1364 -150h-192v1464h192v-1464z" />
+<glyph unicode="&#x1d36c;" horiz-adv-x="2112" d="M1364 -150h-192v1464h192v-1464zM1788 -150h-192v1464h192v-1464zM516 -150h-192v1464h192v-1464zM940 -150h-192v1464h192v-1464z" />
+<glyph unicode="&#x1d36d;" horiz-adv-x="2536" d="M1364 -150h-192v1464h192v-1464zM1788 -150h-192v1464h192v-1464zM2212 -150h-192v1464h192v-1464zM516 -150h-192v1464h192v-1464zM940 -150h-192v1464h192v-1464z" />
+<glyph unicode="&#x1d36e;" d="M1724 1334h-604v-1696h-192v1696h-604v192h1400v-192z" />
+<glyph unicode="&#x1d36f;" d="M1724 1334h-392v-1696h-192v1696h-232v-1696h-192v1696h-392v192h1400v-192z" />
+<glyph unicode="&#x1d370;" d="M1724 1334h-180v-1696h-192v1696h-232v-1696h-192v1696h-232v-1696h-192v1696h-180v192h1400v-192z" />
+<glyph unicode="&#x1d371;" horiz-adv-x="2472" d="M2148 1334h-180v-1696h-192v1696h-232v-1696h-192v1696h-232v-1696h-192v1696h-232v-1696h-192v1696h-180v192h1824v-192z" />
+<glyph unicode="&#x1d400;" horiz-adv-x="1460" d="M265 6l-206 -6v100q168 0 175 18l425 1213q12 36 71 36t71 -36l430 -1231h169v-100l-292 6l-329 -6v100h161l-86 247h-422l-78 -231q-3 -8 27.5 -11t124.5 -5v-100zM819 446l-176 503l-176 -503h352z" />
+<glyph unicode="&#x1d401;" horiz-adv-x="1333" d="M1274 366q0 -174 -121.5 -270t-300.5 -96h-793v100h185v1142h-185v101h738q175 0 291 -81q132 -93 132 -260q0 -118 -82 -196.5t-204 -103.5q145 -17 242.5 -106t97.5 -230zM891 825q43 73 43 170t-26 160q-35 87 -111 87h-289v-505h235q97 0 148 88zM978 371 q0 103 -29 180q-40 109 -125 109h-316v-560h289q94 0 142 94q39 74 39 177z" />
+<glyph unicode="&#x1d402;" horiz-adv-x="1310" d="M1251 460q0 -202 -147 -342t-349 -140q-314 0 -505 189.5t-191 503t191 503.5t505 190q172 0 307 -119l125 111q8 8 36 8t28 -23v-486q0 -28 -65 -28q-35 0 -46 28l-8 64q-18 133 -114.5 239t-225.5 106q-240 0 -351 -184q-74 -122 -74 -409.5t74 -409.5 q110 -182 355 -182q149 0 252.5 114t103.5 264q0 32 76 32q23 0 23 -29z" />
+<glyph unicode="&#x1d403;" horiz-adv-x="1442" d="M1233 1139q150 -187 150 -476.5t-158 -476t-440 -186.5h-726v100h185v1142h-185v101h726q286 0 448 -204zM1013 243q74 108 74 397t-56 414q-86 188 -322 188h-191v-1142h191q206 0 304 143z" />
+<glyph unicode="&#x1d404;" horiz-adv-x="1280" d="M59 0v100h185v1142h-185v101h1045l62 -480h-100q-25 207 -89 284q-78 95 -276 95h-172v-494h38q114 0 152 61q28 44 28 160v8h99v-558h-99v6q0 133 -40.5 178t-171.5 45h-6v-548h188q215 0 302 122q61 84 101 322h100l-90 -544h-1071z" />
+<glyph unicode="&#x1d405;" horiz-adv-x="1197" d="M387 6l-328 -6v100h185v1142h-185v101h1019l60 -480h-99q-25 204 -84 280q-76 99 -268 99h-158v-520h32q113 0 149 65q25 45 25 164h100v-557h-100q0 136 -37 183q-36 46 -164 46h-5v-523h232v-100z" />
+<glyph unicode="&#x1d406;" horiz-adv-x="1447" d="M1110 534l278 6v-99h-135v-415q0 -26 -25 -26t-93.5 37t-99.5 61q-90 -120 -280 -120q-314 0 -505 189.5t-191 503t191 503.5t505 190q170 0 309 -119l124 111q9 8 37 8t28 -23v-486q0 -28 -66 -28q-34 0 -45 28q-2 20 -6 55q-15 136 -112.5 245t-229.5 109 q-242 0 -353 -184q-74 -122 -74 -408.5t74 -408.5q111 -184 360 -184q68 0 117.5 45t49.5 112v205h-245v99z" />
+<glyph unicode="&#x1d407;" horiz-adv-x="1516" d="M1130 1337l327 6v-101h-183v-1142h183v-100l-327 6l-327 -6v100h183v548h-457v-548h184v-100l-326 6l-328 -6v100h185v1142h-185v101l328 -6l326 6v-101h-184v-494h457v494h-183v101z" />
+<glyph unicode="&#x1d408;" horiz-adv-x="793" d="M397 1337l337 6v-101h-194v-1142h194v-100l-337 6l-338 -6v100h195v1142h-195v101z" />
+<glyph unicode="&#x1d409;" horiz-adv-x="1025" d="M689 1337l277 6v-101h-139v-964q0 -152 -143 -233q-117 -67 -264.5 -67t-244.5 56q-116 68 -116 189q0 66 45 110t110 44t109 -45t44 -109q0 -101 -91 -141q58 -26 132.5 -26t113.5 79q31 60 31 150v957h-241v101z" />
+<glyph unicode="&#x1d40a;" horiz-adv-x="1503" d="M1246 1337l170 6v-101q-161 0 -178 -17l-399 -398l449 -709q11 -18 156 -18v-100l-257 6l-327 -6v100q114 0 128 16l-333 529l-126 -126v-419h184v-100l-326 6l-328 -6v100h185v1142h-185v101l328 -6l326 6v-101h-184v-580l567 565q-24 15 -126 15v101z" />
+<glyph unicode="&#x1d40b;" horiz-adv-x="1143" d="M387 1337l374 6v-101h-232v-1142h132q164 0 245 148q55 101 76 296h102l-61 -544h-964v100h185v1142h-185v101z" />
+<glyph unicode="&#x1d40c;" horiz-adv-x="1843" d="M59 100q185 0 185 18v1124h-185v101h445q37 0 51 -36l368 -982l368 982q14 36 50 36h443v-101h-185v-1142h185v-100l-309 6l-311 -6v100h183v1125l-444 -1190q-13 -35 -58 -35t-58 35l-431 1158v-1075q0 -10 33.5 -13t149.5 -5v-100l-239 6l-241 -6v100z" />
+<glyph unicode="&#x1d40d;" horiz-adv-x="1516" d="M1218 1337l239 6v-101q-183 0 -183 -17v-1193q0 -32 -82 -32q-12 0 -20 11l-816 1130v-1023q0 -10 33.5 -13t149.5 -5v-100l-239 6l-241 -6v100q185 0 185 18v1124h-185v101h449q14 0 23 -12l631 -875v769q0 9 -38 12t-146 5v101z" />
+<glyph unicode="&#x1d40e;" horiz-adv-x="1366" d="M684 1364q296 0 459 -199t163 -499t-164.5 -494t-457.5 -194t-459 193.5t-166 494t159 492.5q170 206 466 206zM999 704q0 574 -316 574t-316 -586q0 -623 316 -623t316 635z" />
+<glyph unicode="&#x1d40f;" horiz-adv-x="1278" d="M387 6l-328 -6v100h185v1142h-185v101h700q194 0 319 -94q140 -104 140 -289.5t-143 -287.5q-126 -90 -316 -90h-230v-482h184v-100zM879 747q32 53 32 213.5t-34 212.5q-46 69 -195 69h-164v-571h164q152 0 197 76z" />
+<glyph unicode="&#x1d410;" horiz-adv-x="1379" d="M1319 -10q0 -140 -48 -240q-62 -129 -190 -129t-186 131q-30 69 -52 244q-82 -18 -159 -18q-293 0 -459 193.5t-166 494t159 492.5q170 206 466 206t459 -199t163 -501q0 -208 -81 -368q-91 -179 -267 -259q61 -110 146 -110q100 0 133 44q1 1 14 40q8 24 33 24 q35 0 35 -45zM1011 671q0 607 -327.5 607t-327.5 -623q0 -182 21 -283q34 -159 131 -243q-1 77 49 127.5t127 50.5q124 0 205 -147q80 89 107 242q15 91 15 269zM684 230q-37 0 -67.5 -24t-30.5 -60q0 -82 98 -82q72 0 136 40q-37 126 -136 126z" />
+<glyph unicode="&#x1d411;" horiz-adv-x="1532" d="M1369 157q0 74 55 74q49 0 49 -41q0 -83 -54 -147.5t-135 -64.5q-430 0 -430 265v170q0 83 -41.5 151.5t-119.5 68.5h-175v-533h183v-100l-320 6l-322 -6v100h185v1142h-185v101h638q208 0 354 -78q182 -98 182 -288q0 -118 -83 -198.5t-206 -116.5q133 -59 175 -168 q16 -41 42 -239.5t121 -198.5q71 0 87 101zM872 766.5q55 56.5 55 212.5t-55.5 209.5t-210.5 53.5h-143v-532h143q156 0 211 56.5z" />
+<glyph unicode="&#x1d412;" horiz-adv-x="986" d="M927 403q0 -182 -100.5 -303.5t-289 -121.5t-320.5 99l-93 -90q-9 -9 -37 -9t-28 26v418q0 24 78 24q21 0 24 -52t16 -93q72 -222 371 -222q89 0 135 65.5t46 150t-39.5 148.5t-148.5 93l-205 48q-124 41 -200.5 144.5t-76.5 238.5q0 175 103 286t273 111t284 -98l90 90 q8 8 37 8t29 -23v-419q0 -26 -76 -26q-20 0 -24.5 30.5t-6.5 55.5q-18 128 -109.5 209t-219.5 81q-85 0 -133 -57.5t-48 -150.5t63 -147q48 -41 139 -62l176 -39q133 -36 212 -154t79 -259z" />
+<glyph unicode="&#x1d413;" horiz-adv-x="1335" d="M669 6l-406 -6v100h263v1142h-96q-131 0 -196 -74q-53 -60 -75 -305h-100l42 480h1133l42 -480h-100q-14 190 -50 261q-59 118 -221 118h-94v-1142h263v-100z" />
+<glyph unicode="&#x1d414;" horiz-adv-x="1490" d="M1190 1337l240 6v-101q-184 0 -184 -17v-781q0 -207 -126.5 -336.5t-344 -129.5t-374.5 121.5t-157 344.5v798h-185v101l328 -6l326 6v-101h-184v-798q0 -172 43 -253q59 -112 222.5 -112t251.5 100t88 273v773q0 15 -184 17v101z" />
+<glyph unicode="&#x1d415;" horiz-adv-x="1511" d="M1255 1337l197 6v-101q-160 0 -166 -17l-457 -1206q-13 -35 -73.5 -35t-73.5 35l-461 1223h-162v101l286 -6l327 6v-101h-158l329 -868l323 853q-20 14 -153 15v101z" />
+<glyph unicode="&#x1d416;" horiz-adv-x="2058" d="M1817 1337l182 6v-101q-150 0 -156 -17l-405 -1206q-11 -34 -80 -34q-37 0 -49 34l-280 831l-279 -831q-12 -34 -81 -34q-38 0 -49 34l-411 1223h-150v101l274 -6l329 6v-101h-163l279 -827l198 591l-80 236h-148v101l274 -6l326 6v-101h-161l278 -827l272 812 q-25 14 -173 15v101z" />
+<glyph unicode="&#x1d417;" horiz-adv-x="1487" d="M1105 1337l239 6v-101q-213 0 -224 -17l-278 -439l412 -686h173v-100l-288 6l-333 -6v100h141l-264 438l-269 -422q26 -16 164 -16v-100l-281 6l-238 -6v100h21q190 0 201 18l337 527l-362 597h-170v101l287 -6l331 6v-101h-138l210 -349l213 334q-27 15 -164 15v101z " />
+<glyph unicode="&#x1d418;" horiz-adv-x="1534" d="M1278 1337l197 6v-101q-169 0 -179 -17l-393 -689v-436h186v-100l-322 6l-322 -6v100h185v436l-399 706h-172v101l293 -6l335 6v-101h-141l314 -555l308 540q-21 15 -133 15v101z" />
+<glyph unicode="&#x1d419;" horiz-adv-x="1106" d="M95 0q-36 0 -36 73q0 9 658 1169h-171q-362 0 -361 -379h-100l24 480h890q36 0 36 -67q0 -11 -656 -1168h184q210 0 303 127q80 110 80 329h101l-36 -564h-916z" />
+<glyph unicode="&#x1d41a;" horiz-adv-x="1042" d="M997 60q0 -60 -34 -60h-144q-63 0 -116.5 33t-53.5 92v16q-88 -165 -255 -165q-131 0 -231 61q-118 72 -118 195q0 177 207 267q154 66 361 68v83q0 94 -41.5 160t-130.5 66q-56 0 -113 -10q44 -41 44 -100.5t-37.5 -98t-95 -38.5t-96.5 38t-39 96q0 196 345 196 q163 0 276 -69q134 -82 134 -235v-508q0 -26 69 -36t69 -51zM613 272v220q-121 0 -218.5 -71.5t-97.5 -188.5q0 -65 31.5 -119.5t91.5 -54.5q80 0 136.5 66.5t56.5 147.5z" />
+<glyph unicode="&#x1d41b;" horiz-adv-x="1147" d="M673 946q200 0 314 -139t114 -347t-123 -346t-331 -138q-135 0 -255 122l-97 -98h-107v1263q0 56 -126 56h-17v108l376 15v-591q130 95 252 95zM803 209q24 83 24 252.5t-21 250.5q-39 152 -155 152q-57 0 -118 -38.5t-99 -89.5v-548q80 -130 194 -130q131 0 175 151z " />
+<glyph unicode="&#x1d41c;" horiz-adv-x="885" d="M839 232q0 -6 -2 -12q-87 -244 -343 -244q-207 0 -328 140t-121 350t121 351.5t328 141.5q124 0 208 -38q114 -50 114 -158q0 -57 -38 -95.5t-95.5 -38.5t-96 38t-38.5 97.5t39 94.5q-43 9 -91 9q-176 0 -176 -400t214 -400q132 0 180 120q6 21 22 55q14 18 58.5 18 t44.5 -29z" />
+<glyph unicode="&#x1d41d;" horiz-adv-x="1147" d="M476 -24q-201 0 -316 141t-115 348.5t123 344t331 136.5q126 0 226 -77v394q0 56 -134 56h-9v108l376 15v-1278q0 -58 134 -58h9v-106l-389 -12v83q-118 -95 -236 -95zM520 864q-131 0 -175 -149q-25 -83 -25 -252t21 -251q39 -154 160 -154t211 143v555 q-78 108 -192 108z" />
+<glyph unicode="&#x1d41e;" horiz-adv-x="953" d="M908 227q0 -102 -141 -181q-123 -70 -236 -70q-217 0 -351.5 140t-134.5 353.5t125 351.5t329 138t306.5 -127t102.5 -333q0 -42 -33 -42h-555v-4q0 -385 233 -385q163 0 223 112q13 28 25 57q18 32 47 32q60 0 60 -42zM702 535q0 124 -40 217q-53 124 -160 124 q-182 0 -182 -334v-7h382z" />
+<glyph unicode="&#x1d41f;" horiz-adv-x="875" d="M305 6l-260 -6v106h145v711h-116v106h116v222q0 157 144 242q119 69 288 69q81 0 144 -53t63 -133q0 -55 -38 -94t-93.5 -39t-94 38.5t-38.5 98t46 98.5h-9q-94 0 -143 -67.5t-49 -164.5v-217h201v-106h-189v-711h182v-106z" />
+<glyph unicode="&#x1d420;" horiz-adv-x="1049" d="M354 169l151 3q219 0 328 -56q150 -77 150 -275q0 -148 -173 -217q-124 -49 -296.5 -49t-297.5 51q-171 70 -171 215q0 124 143 175q-79 69 -79 185t67 199q-97 82 -97 231t112.5 233.5t263 84.5t250.5 -65q78 75 188 75q47 0 79 -38.5t32 -82t-26.5 -70.5t-66.5 -27 t-67 26.5t-27 56t4 43.5q-28 -8 -60 -29q74 -85 74 -207q0 -150 -111.5 -235.5t-254.5 -85.5t-233 51q-19 -31 -19 -68q0 -124 137 -124zM597 597v66q0 96 -22 140q-31 64 -117 64q-140 0 -140 -204v-66q0 -203 140 -203q86 0 117 63q22 45 22 140zM796 -159q0 120 -262 120 h-198q-103 0 -103 -120q0 -97 98 -145q76 -38 183 -38t184 39q98 49 98 144z" />
+<glyph unicode="&#x1d421;" horiz-adv-x="1200" d="M311 6l-266 -6v106h143v1157q0 56 -138 56h-5v108l377 15v-679q105 183 302 183q286 0 286 -298v-542h145v-106l-268 6l-249 -6v106h128v568q0 190 -68 190q-117 0 -190.5 -96t-73.5 -216v-446h143v-106z" />
+<glyph unicode="&#x1d422;" horiz-adv-x="599" d="M442 1279q0 -68 -49 -117.5t-117 -49.5t-116.5 49t-48.5 117.5t48.5 117t116.5 48.5t117 -48.5t49 -116.5zM305 6l-260 -6v106h143v649q0 58 -132 58h-4v106l370 17v-830h131v-106z" />
+<glyph unicode="&#x1d423;" horiz-adv-x="489" d="M394 1395q49 -49 49 -116.5t-49 -117t-117.5 -49.5t-117 49t-48.5 118t48.5 117t117 48t117.5 -49zM443 -102q0 -138 -112 -226t-254 -88q-106 0 -184 44q-95 53 -95 151q0 56 38.5 95t95 39t96 -38.5t39.5 -100t-48 -100.5q33 -7 62 -7q72 0 105 88q24 63 24 151v849 q0 58 -153 58h-5v106l391 17v-1038z" />
+<glyph unicode="&#x1d424;" horiz-adv-x="1125" d="M881 917l149 6v-106q-140 0 -160 -19l-235 -219l306 -454q13 -19 138 -19v-106l-207 6l-259 -6v106h12q55 0 65 17l-209 311l-70 -63v-265h141v-106l-251 6l-256 -6v106h143v1157q0 56 -138 56h-5v108l376 15v-916l293 274q-15 16 -92 17v106z" />
+<glyph unicode="&#x1d425;" horiz-adv-x="611" d="M305 6l-260 -6v106h143v1157q0 56 -138 56h-5v108l377 15v-1336h143v-106z" />
+<glyph unicode="&#x1d426;" horiz-adv-x="1775" d="M311 6l-266 -6v106h143v649q0 58 -138 58h-5v106l367 17v-191q46 90 129.5 145.5t182.5 55.5q233 0 274 -181q109 181 302 181q287 0 287 -298v-542h143v-106l-266 6l-251 -6v106h128v569q0 189 -67 189q-117 0 -190.5 -96t-73.5 -216v-446h145v-106l-268 6l-249 -6v106 h128v569q0 189 -68 189q-117 0 -190.5 -96t-73.5 -216v-446h143v-106z" />
+<glyph unicode="&#x1d427;" horiz-adv-x="1200" d="M311 6l-266 -6v106h143v649q0 58 -138 58h-5v106l367 17v-191q46 90 129.5 145.5t182.5 55.5q286 0 286 -298v-542h145v-106l-268 6l-249 -6v106h128v568q0 190 -68 190q-117 0 -190.5 -96t-73.5 -216v-446h143v-106z" />
+<glyph unicode="&#x1d428;" horiz-adv-x="1042" d="M175.5 107.5q-130.5 131.5 -130.5 350.5t128.5 360t347.5 141t347.5 -141.5t128.5 -359.5t-130 -350t-345.5 -132t-346 131.5zM697 222q24 84 24 257.5t-24 253.5q-44 143 -174 143t-176 -138q-27 -82 -27 -252t25 -259q46 -159 177 -159t175 154z" />
+<glyph unicode="&#x1d429;" horiz-adv-x="1147" d="M311 -397l-266 -6v105h143v1076q0 35 -135 35h-8v106l376 17v-86q127 96 259 96q199 0 310 -139.5t111 -347t-123 -345.5t-331 -138q-122 0 -213 72v-346h143v-105zM792 214q35 107 35 245t-30 240q-46 154 -146 154q-126 0 -217 -118v-559q72 -118 189 -118t169 156z " />
+<glyph unicode="&#x1d42a;" horiz-adv-x="1147" d="M835 -397l-266 -6v105h143v361q-106 -87 -233 -87q-202 0 -318 140.5t-116 348t122 344.5t329 137q156 0 262 -152l106 142h94v-1234h143v-105zM725 640q0 16 -17 54q-71 159 -185.5 159t-166.5 -152q-37 -106 -37 -242t32 -243q47 -158 145 -158q149 0 229 170v412z" />
+<glyph unicode="&#x1d42b;" horiz-adv-x="894" d="M305 6l-260 -6v106h143v649q0 58 -138 58h-5v106l354 17v-161q62 171 214 171q90 0 162.5 -45.5t72.5 -129.5q0 -55 -38.5 -92.5t-94 -37.5t-93 37t-37.5 92.5t34 93.5h-6q-192 0 -192 -394v-364h183v-106z" />
+<glyph unicode="&#x1d42c;" horiz-adv-x="771" d="M725 289q0 -313 -339 -313q-117 0 -195 57q-87 -57 -107 -57q-39 0 -39 26v289q0 26 68 26q26 0 39 -26l22 -73q52 -160 212 -160q183 0 183 159q0 88 -93 130q-28 13 -155.5 43t-201.5 99.5t-74 172.5q0 150 93.5 223.5t247.5 73.5q95 0 162 -36q69 36 97 36t28 -25 v-229q0 -28 -49 -28q-5 0 -15.5 0.5t-15.5 0.5q-19 0 -25 32t-10 58q-29 116 -176 116q-74 0 -127.5 -35.5t-53.5 -109t96 -107.5l160 -35q120 -28 194 -107.5t74 -200.5z" />
+<glyph unicode="&#x1d42d;" horiz-adv-x="744" d="M698 232q0 -99 -58.5 -177.5t-154.5 -78.5q-312 0 -312 256v585h-128v84q140 0 210 147q55 113 56 271h107v-396h247v-106h-247v-579q0 -170 88 -170t88 208q0 24 -2 80h106v-124z" />
+<glyph unicode="&#x1d42e;" horiz-adv-x="1200" d="M551 -24q-363 0 -363 266v513q0 58 -138 58h-5v106l389 17v-723q0 -84 25 -119.5t113.5 -35.5t141 84.5t52.5 181.5v431q0 58 -139 58h-5v106l388 17v-772q0 -58 140 -58h5v-106l-378 -12v131q-87 -143 -226 -143z" />
+<glyph unicode="&#x1d42f;" horiz-adv-x="1094" d="M887 917l162 6v-106h-12q-118 0 -126 -19l-292 -769q-14 -37 -71.5 -37t-71.5 37l-300 788h-131v106l231 -6l267 6v-106h-115l187 -497l183 480q-11 17 -110 17v106z" />
+<glyph unicode="&#x1d430;" horiz-adv-x="1502" d="M1302 917l155 6v-106h-11q-110 0 -117 -19l-269 -769q-13 -37 -69.5 -37t-69.5 37l-168 488l-171 -488q-13 -37 -70 -37t-70 37l-274 788h-123v106l225 -6l222 6v-106h-76l164 -469l116 330l-49 139h-94v106l177 -6l247 6v-106h-118l181 -522l176 505q4 15 -127 17v106z " />
+<glyph unicode="&#x1d431;" horiz-adv-x="1118" d="M843 917l193 6v-106h-16q-158 0 -171 -19l-202 -281l277 -411h149v-106l-224 6l-256 -6v106h91l-162 240l-160 -223q19 -16 97 -17v-106l-222 6l-192 -6v106h16q156 0 169 19l229 313l-258 379h-146v106l221 -6l256 6v-106h-90l142 -205l134 188q-18 16 -94 17v106z" />
+<glyph unicode="&#x1d432;" horiz-adv-x="1101" d="M892 917l164 6v-106h-12q-119 0 -127 -19l-368 -958q-41 -107 -124 -181.5t-188 -74.5q-79 0 -135.5 59t-56.5 138q0 52 37 87.5t88.5 35.5t87.5 -36t36 -87q0 -82 -70 -112q8 -2 13 -2q136 0 200 173l59 160l-312 817h-132v106l230 -6l267 6v-106h-115l188 -491l181 474 q-19 17 -109 17v106z" />
+<glyph unicode="&#x1d433;" horiz-adv-x="867" d="M83 0q-38 0 -38 60q0 11 7 22l483 757h-90q-149 0 -207 -67.5t-58 -220.5h-104l25 372h678q38 0 38 -56q0 -12 -6 -21l-480 -755h99q167 0 227 91q40 62 58 246h106l-38 -428h-700z" />
+<glyph unicode="&#x1d434;" horiz-adv-x="1388" d="M239 4l-149 -4q-23 0 -23 19q0 33 37 38q145 20 229 161l690 1152q20 33 48.5 33t33.5 -43l119 -1226q6 -55 36 -69q17 -8 72.5 -8t55.5 -20q0 -37 -35 -37l-185 4h-143l-99 -4q-29 0 -29 22q0 29 24 34l91 10q59 10 59 55q0 57 -13.5 161.5t-15.5 125.5l-5 56h-501 l-149 -247q-36 -59 -36 -92q0 -46 54.5 -64t54.5 -24q0 -37 -36 -37zM1032 521l-66 661l-395 -661h461z" />
+<glyph unicode="&#x1d435;" horiz-adv-x="1294" d="M1317 1280q117 -75 117 -213.5t-137 -245.5q-116 -90 -271 -120q123 -11 211.5 -84t88.5 -194t-100 -233q-89 -97 -204 -143.5t-229 -46.5h-673q-53 0 -53 22q0 37 68 38h36q73 1 94 32q10 14 20 54l264 1057q8 31 8 45q0 29 -46 35q-5 1 -63 1t-58 22q0 37 47 37h639 q142 0 241 -63zM1228 927q45 78 45 164t-61.5 140.5t-161.5 54.5h-255q-55 0 -72 -12t-30 -65l-121 -491h281q117 0 218 54.5t157 154.5zM1161 446q0 106 -63.5 169t-169.5 63h-370l-137 -553q-7 -28 -7 -45q0 -23 66 -23h266q164 0 289.5 113.5t125.5 275.5z" />
+<glyph unicode="&#x1d436;" horiz-adv-x="1425" d="M1401 846l7 107q0 159 -75 260q-84 114 -226 114t-276 -67q-209 -105 -333 -344t-124 -488q0 -184 103.5 -298.5t284.5 -114.5q141 0 272 82t208 208q8 13 73 164q9 21 24 21q21 0 21 -17.5t-16 -59.5q-74 -192 -244.5 -323.5t-369.5 -131.5q-232 0 -374.5 150 t-142.5 384q0 334 267 613.5t598 279.5q216 0 323 -186q154 186 164 186q18 0 18 -12t-39 -173l-84 -335q-12 -37 -33 -37q-26 0 -26 18z" />
+<glyph unicode="&#x1d437;" horiz-adv-x="1407" d="M1526 850q0 -316 -236.5 -583t-547.5 -267h-622q-53 0 -53 22q0 31 45 37q35 0 83 1t68 28q11 15 22 58l264 1057q8 31 8 45q0 29 -46 35q-7 1 -64 1t-57 22q0 37 46 37h640q210 0 330 -140t120 -353zM1308 567q63 178 63 349t-91.5 270.5t-262.5 99.5h-216 q-55 0 -72.5 -12t-30.5 -65l-271 -1084q-7 -28 -7 -45q0 -23 67 -23h224q420 0 597 510z" />
+<glyph unicode="&#x1d438;" horiz-adv-x="1260" d="M1459 1321q0 11 -5 -30l-41 -343q-5 -44 -26 -44t-21 22q0 2 6 34.5t6 110.5q0 134 -82 181q-59 34 -199 34h-301q-49 0 -64.5 -12.5t-28.5 -62.5l-122 -487h201q112 0 157 35.5t82 158.5q10 35 27 35q21 0 21 -13q0 -5 -26 -110l-87 -352q-10 -41 -28 -41q-21 0 -21 19 q0 1 9.5 34t9.5 76t-7 57q-22 44 -147 44h-205l-136 -542q-8 -32 -8 -45q0 -23 45 -23h309q222 0 333 94q83 71 182 299q23 53 40 53q20 0 20 -18.5t-187 -450.5q-10 -24 -19.5 -29t-39.5 -5h-1000q-39 0 -39 22q0 32 46 37q36 1 71 1q70 2 87 44q5 13 13 42l266 1065 q8 31 8 39q0 29 -48 34h-69q-52 0 -52 23q0 36 47 36h980q43 0 43 -22z" />
+<glyph unicode="&#x1d439;" horiz-adv-x="1231" d="M198 4l-101 -4q-30 0 -30 22q0 25 16 32t50 7h63q53 4 70 32q8 13 18 53l266 1065q8 31 8 39q0 29 -49 34h-69q-51 0 -51 23q0 36 48 36h952q41 0 41 -22l-44 -373q-6 -44 -27 -44t-21 22l6 42q7 49 7 115t-18 105q-45 98 -255 98h-289q-46 0 -60 -14.5t-26 -60.5 l-127 -514h191q108 0 157 38q32 24 65.5 108.5t43.5 84.5q19 0 19 -15q0 -6 -28 -123l-85 -340q-10 -39 -26 -39q-22 0 -22 22q0 1 10 34t10 74t-8 57q-22 44 -143 44h-199l-126 -503q-8 -31 -8 -42t6 -20q11 -17 110 -19t99 -23q0 -35 -49 -35l-113 4h-282z" />
+<glyph unicode="&#x1d43a;" horiz-adv-x="1423" d="M1375 529l102 4q25 0 25 -25t-29 -32q-9 -2 -44.5 -2t-47.5 -7q-25 -15 -42 -73q-39 -136 -57 -226t-39 -160q-3 -6 -15 -6q-34 0 -79 128q-136 -172 -417 -172q-233 0 -376 150t-143 384q0 334 265 613.5t597 279.5q212 0 325 -184q153 184 163 184q18 0 18 -13 q0 -16 -55 -241t-67.5 -264t-33.5 -39q-25 0 -25 18l8 107q0 160 -80 267t-234 107q-130 0 -264 -68q-210 -107 -332 -341t-122 -483q0 -188 105 -304t291 -116q101 0 201 40t146 115q16 25 45.5 126.5t29.5 126t-4 30.5q-16 23 -201 23q-16 0 -16 21q0 36 54 36z" />
+<glyph unicode="&#x1d43b;" horiz-adv-x="1416" d="M1536 1339l98 4q29 0 29 -22q0 -34 -89 -38t-108 -33q-10 -14 -19 -51l-269 -1074q-4 -16 -4 -33q0 -33 83.5 -34.5t83.5 -20.5q0 -37 -38 -37l-102 4h-260l-99 -4q-28 0 -28 19q0 31 35 37q5 1 60 1q91 0 117 62q1 2 12 51l125 501h-596l-136 -546q-4 -16 -4 -33 q0 -33 83.5 -34.5t83.5 -20.5q0 -37 -37 -37l-104 4h-258l-100 -4q-28 0 -28 19q0 41 68 41h38q70 0 92 32q8 12 19 54l265 1057q8 31 8 45q0 29 -48 35q-4 1 -62.5 1t-58.5 22q0 37 37 37l101 -4h262l99 4q30 0 30 -22q0 -34 -89.5 -38t-109.5 -33q-8 -11 -18 -51 l-118 -471h594l120 475q7 31 7 45q0 29 -47 35q-4 1 -63 1t-59 22q0 37 39 37l100 -4h263z" />
+<glyph unicode="&#x1d43c;" horiz-adv-x="687" d="M812 1339l94 4q29 0 29 -20q0 -27 -17 -35q-4 -2 -87 -5t-103 -33q-5 -8 -17 -53l-267 -1056q-7 -27 -7 -45q0 -30 46 -36q4 -1 67 -1t63 -24q0 -35 -44 -35l-96 4h-282l-94 -4q-30 0 -30 19q0 38 47 38q140 0 162 36q6 9 17 53l265 1059q9 35 9 43q0 36 -88.5 37 t-88.5 21q0 37 37 37l104 -4h281z" />
+<glyph unicode="&#x1d43d;" horiz-adv-x="930" d="M1050 1339l100 4q27 0 27 -22q0 -31 -62 -36.5t-70 -10.5q-21 -14 -34 -67l-234 -925q-34 -137 -155.5 -230.5t-262.5 -93.5q-101 0 -172 56.5t-71 154.5q0 147 117 147q79 0 79 -73q0 -46 -35 -79.5t-81 -33.5q-12 0 -26 4q30 -136 185 -136q100 0 181 102q67 84 95 195 l227 899q8 31 8 46.5t-6 24.5q-13 21 -200 21q-15 0 -15 22q0 35 55 35l195 -4h155z" />
+<glyph unicode="&#x1d43e;" horiz-adv-x="1449" d="M1607 1339l65 4q24 0 24 -22q0 -29 -35 -35q-138 -25 -312 -154l-363 -281q-24 -18 -36 -29q3 -14 58 -144l226 -532q24 -54 47 -70q8 -5 63 -16t55 -23q0 -37 -34 -37l-187 4l-211 -4q-26 0 -26 19q0 38 36 38q97 0 97 62q0 26 -251 607l-300 -234l-77 -304 q-19 -74 -19 -96q0 -33 83.5 -34.5t83.5 -20.5q0 -37 -37 -37l-112 4h-237l-111 -4q-30 0 -30 22q0 32 46 37q35 1 84 2t68 31q9 15 19 54l265 1057q8 31 8 45q0 37 -107 37q-60 0 -60 21q0 37 37 37l110 -4h239l111 4q30 0 30 -20q0 -24 -16 -34q-3 -2 -83.5 -6t-98.5 -31 q-9 -13 -19 -53l-163 -649l771 599q75 58 75 99q0 26 -36.5 35t-36.5 25q0 35 48 35l175 -4h74z" />
+<glyph unicode="&#x1d43f;" horiz-adv-x="1125" d="M821 1339l112 4q29 0 29 -20q0 -38 -50 -40t-103 -2q-71 -4 -91 -33q-9 -13 -20 -56l-267 -1067q-8 -32 -8 -45q0 -23 44 -23h211q201 0 316 106q94 86 169 289q19 51 35 51q19 0 19 -15.5t-159 -450.5q-4 -13 -19 -32q-8 -5 -34 -5h-899q-39 0 -39 22q0 32 46 37 q35 1 84 2t68 31q8 13 19 54l265 1057q8 31 8 45q0 29 -45 35q-5 1 -63.5 2t-58.5 21q0 37 37 37l114 -4h280z" />
+<glyph unicode="&#x1d440;" horiz-adv-x="1725" d="M272 4l-179 -4q-26 0 -26 22q0 32 49 38q75 10 99 22q61 30 83 119l251 1002q8 31 8 45q0 29 -45 35q-5 1 -63.5 2t-58.5 21q0 37 47 37h261q30 0 38 -7t12 -37l148 -1125l717 1135q21 34 62 34h257q40 0 40 -20q0 -26 -15 -34q-4 -3 -84 -6.5t-99 -32.5q-6 -10 -17 -51 l-270 -1074q-4 -16 -4 -33q0 -33 84 -34.5t84 -20.5q0 -37 -38 -37l-103 4h-246l-97 -4q-31 0 -31 22q0 32 46 37q36 1 84.5 2t68.5 32q9 14 19 53l285 1138h-2l-791 -1250q-22 -34 -41 -34t-26 53l-163 1221h-2l-271 -1082q-9 -36 -9 -51q0 -49 41 -68q19 -9 67.5 -15 t48.5 -21q0 -37 -36 -37z" />
+<glyph unicode="&#x1d441;" horiz-adv-x="1416" d="M1460 1339l179 4q24 0 24 -22q0 -32 -48 -38q-74 -9 -99 -22q-61 -32 -84 -125l-275 -1096q-10 -40 -31 -40q-16 0 -30 35l-469 1166q-11 27 -20 41l-264 -1050q-9 -36 -9 -51q0 -49 41 -68q19 -9 67.5 -15t48.5 -21q0 -37 -36 -37l-183 4l-179 -4q-26 0 -26 19 q0 34 48 41q78 10 100 21q60 30 83 120l260 1041l7 26q0 14 -88.5 16t-88.5 22q0 37 48 37h258q36 0 50 -34l421 -1046l222 886q8 36 8 52q0 47 -40 66q-18 9 -66.5 16.5t-48.5 22.5q0 37 35 37l90 -4h95z" />
+<glyph unicode="&#x1d442;" horiz-adv-x="1427" d="M1546 861q0 -333 -258 -618t-587 -285q-222 0 -355 147.5t-133 372.5q0 330 260 618.5t585 288.5q224 0 356 -148.5t132 -375.5zM1388 933q0 171 -87 289.5t-253 118.5q-241 0 -441 -243q-104 -127 -165 -312.5t-61 -358.5t78 -289q90 -134 256 -134q286 0 492 331 q181 293 181 598z" />
+<glyph unicode="&#x1d443;" horiz-adv-x="1252" d="M207 4l-110 -4q-30 0 -30 22q0 32 48 37q36 1 83 2t66 29q11 15 21 56l264 1057q8 31 8 45q0 29 -46 35q-5 1 -63 1t-58 22q0 37 46 37h616q151 0 256 -69q122 -81 122 -224q0 -181 -186 -310q-167 -115 -357 -115h-330l-126 -500q-4 -16 -4 -35q0 -32 83.5 -33t83.5 -20 q0 -37 -37 -37l-111 4h-239zM1264 1092q0 194 -269 194h-194q-55 0 -72.5 -12t-30.5 -65l-133 -538h277q296 0 390 254q32 85 32 167z" />
+<glyph unicode="&#x1d444;" horiz-adv-x="1427" d="M1546 861q0 -271 -168 -508.5t-423 -341.5q5 -99 24 -145q32 -75 113 -75q144 0 231 196q13 30 22 30q17 0 17 -23t-30 -99q-107 -276 -290 -276q-157 0 -157 205q0 51 12 165q-101 -31 -196 -31q-222 0 -355 147.5t-133 372.5q0 330 260 618.5t585 288.5 q224 0 356 -148.5t132 -375.5zM1388 920q0 174 -87 297.5t-255 123.5q-143 0 -284 -101q-176 -126 -283 -359.5t-107 -461.5q0 -135 56.5 -246t173.5 -151q-17 32 -17 64q0 77 60.5 140t136.5 63q148 0 167 -218q308 181 410 622q29 130 29 227zM902 69q0 180 -120 180 q-60 0 -108.5 -50t-48.5 -111q0 -86 88.5 -86t187.5 43q1 10 1 24z" />
+<glyph unicode="&#x1d445;" horiz-adv-x="1430" d="M204 4l-109 -4q-28 0 -28 19q0 32 28 39q4 1 55 1q94 0 115 33q10 15 20 54l264 1057q8 31 8 45q0 29 -48 35q-4 1 -62.5 1t-58.5 22q0 37 46 37h543q159 0 281 -67q148 -81 148 -226t-151 -256q-121 -89 -284 -125q192 -61 192 -233q0 -16 -18.5 -143.5t-18.5 -184.5 q0 -110 82 -110q65 0 110 53q27 31 53 90.5t37 59.5q22 0 22 -19.5t-23 -66.5q-75 -157 -205 -157q-105 0 -175.5 52t-70.5 153q0 52 30.5 154t30.5 152q0 92 -63.5 138t-158.5 46h-237l-131 -528q-4 -16 -4 -33q0 -33 83.5 -34.5t83.5 -20.5q0 -37 -37 -37l-112 4h-237z M1238 1082q0 204 -295 204h-142q-55 0 -72.5 -12t-30.5 -65l-129 -517h222q318 0 416 237q31 76 31 153z" />
+<glyph unicode="&#x1d446;" horiz-adv-x="1052" d="M217 428l-15 -123q0 -145 95 -217.5t241.5 -72.5t257.5 114t111 258q0 97 -48.5 150t-213.5 90t-222 74q-111 72 -111 241.5t148 306t327 136.5q201 0 277 -150q117 150 129 150q17 0 17 -11t-27 -124l-79 -315q-11 -38 -28 -38q-21 0 -21 17l9 113q0 304 -283 304 q-134 0 -244 -101t-110 -226t99 -179q46 -25 198.5 -60.5t204.5 -86.5q95 -92 95 -228q0 -189 -149 -340.5t-338 -151.5q-231 0 -331 150q-112 -150 -125 -150q-20 0 -20 18q0 -6 9 30l100 402q9 38 28 38t19 -18z" />
+<glyph unicode="&#x1d447;" horiz-adv-x="1404" d="M508 4l-125 -4q-30 0 -30 19q0 29 18 36q4 2 59.5 2.5t114 6t75 24.5t28.5 65l265 1066q11 44 11 46q0 21 -54 21h-145q-182 0 -264 -89q-43 -47 -122 -259q-12 -33 -27 -33q-20 0 -20 19q0 1 128 382q4 14 18 33q7 4 31 4h1086q50 0 50 -22q0 -3 -4 -27l-56 -347 q-7 -42 -26.5 -42t-19.5 28t10.5 93t10.5 99q0 99 -68 136q-48 26 -187.5 26t-154.5 -5q-30 -10 -46 -73l-265 -1058q-9 -35 -9 -49t7 -23q14 -18 124.5 -21t110.5 -21q0 -37 -42 -37l-125 4h-357z" />
+<glyph unicode="&#x1d448;" horiz-adv-x="1439" d="M1570 1339l90 4q26 0 26 -22q0 -31 -35 -38q-30 -3 -61 -5q-69 -13 -95.5 -50.5t-46.5 -116.5l-150 -590q-11 -52 -42 -155q-62 -165 -207.5 -286.5t-310 -121.5t-268 104t-103.5 267q0 57 18 129l171 688q24 96 24 102q0 29 -48 35q-4 1 -63.5 1t-59.5 22q0 37 38 37 l110 -4h245l108 4q30 0 30 -22q0 -33 -91.5 -38t-108.5 -34q-8 -13 -17 -50l-193 -773q-21 -83 -21 -152q0 -116 61.5 -187.5t176.5 -71.5q169 0 302.5 131.5t177.5 305.5l176 697q8 31 8 52q0 50 -40 69q-18 8 -66.5 14t-48.5 22q0 37 35 37z" />
+<glyph unicode="&#x1d449;" horiz-adv-x="1514" d="M1593 1339l147 4q21 0 21 -20q0 -32 -36 -37q-139 -20 -228 -162l-710 -1128q-23 -38 -52 -38t-35 48l-157 1212q-6 49 -42 62q-17 6 -65.5 6t-48.5 22q0 35 47 35l163 -4h157l89 4q27 0 27 -20q0 -37 -47 -37q-125 0 -125 -55v-7l139 -1059l618 979q28 46 28 76 q0 44 -53 61t-53 25q0 37 36 37z" />
+<glyph unicode="&#x1d44a;" horiz-adv-x="2052" d="M2137 1339l140 4q22 0 22 -22q0 -30 -35 -35q-82 -14 -120.5 -47t-85.5 -115l-647 -1128q-21 -38 -41 -38q-25 0 -28 46l-73 1017l-586 -1025q-21 -38 -40 -38q-26 0 -29 46l-86 1207q-4 52 -23 66q-7 5 -62.5 8t-55.5 21q0 37 34 37l95 -4h102l213 4q29 0 29 -22 q0 -33 -43 -35q-134 -9 -134 -68v-5l74 -1014l508 895q-5 77 -19 168q-14 19 -73 23t-59 21q0 37 35 37l197 -4l213 4q28 0 28 -20q0 -35 -44 -37q-133 -8 -133 -50v-14l71 -1023l536 939q28 49 28 73q0 54 -64 68.5t-64 26.5q0 37 34 37z" />
+<glyph unicode="&#x1d44b;" horiz-adv-x="1418" d="M1557 1339l84 4q24 0 24 -22q0 -29 -38 -35q-122 -19 -179 -53t-152 -133l-325 -349l261 -610q27 -61 55 -75q5 -2 70.5 -7t65.5 -22q0 -37 -35 -37l-100 4h-226l-102 -4q-30 0 -30 19q0 32 34 38q103 22 106 58l-217 508l-364 -393q-82 -86 -82 -115q0 -42 45.5 -54 t45.5 -26q0 -35 -49 -35l-274 4l-84 -4q-24 0 -24 19q0 33 39 38q173 26 301 160l427 454l-234 547q-20 49 -57 61q-15 5 -71 6.5t-56 20.5q0 37 35 37l209 -4h112l107 4q30 0 30 -22q0 -26 -61 -41t-82 -52l186 -430l344 371q30 33 30 59q0 40 -45 52.5t-45 27.5 q0 35 49 35z" />
+<glyph unicode="&#x1d44c;" horiz-adv-x="1543" d="M1695 1339l71 4q24 0 24 -20q0 -31 -40 -37q-130 -20 -228 -115q-25 -25 -45 -47l-493 -567q-19 -22 -30 -65l-70 -283q-26 -104 -26 -117q0 -29 47 -34h68q55 0 55 -23q0 -35 -44 -35l-101 4h-245l-106 -4q-28 0 -28 19q0 33 38 38h63q88 0 111 66q15 44 58 214.5 t43 190t-8 41.5l-243 653q-17 46 -64 58q-16 4 -65.5 6t-49.5 20q0 37 34 37l102 -4h227l102 4q30 0 30 -22q0 -34 -74 -38t-75 -42l234 -634l467 537q56 65 56 96.5t-43 43t-43 22.5q0 37 36 37l174 -4h81z" />
+<glyph unicode="&#x1d44d;" horiz-adv-x="1105" d="M1352 1327q0 -22 -21 -45l-1080 -1222h341q229 0 341 97q88 77 170 310q18 52 33 52q20 0 20 -20q0 -39 -143 -462q-4 -13 -19 -32q-7 -5 -41 -5h-838q-48 0 -48 15q0 24 25 52l1078 1219h-322q-204 0 -311 -79q-90 -67 -169 -268q-14 -35 -28 -35q-20 0 -20 20 q0 37 115 382q4 14 19 33q8 4 39 4h812q47 0 47 -16z" />
+<glyph unicode="&#x1d44e;" horiz-adv-x="1096" d="M1100 329q22 0 22 -22t-26 -106q-70 -225 -197 -225q-74 0 -125.5 45.5t-63.5 119.5q-139 -165 -277 -165t-209.5 102t-71.5 233t55 268t182.5 258.5t269 121.5t202.5 -143q15 102 92 102q56 0 56 -55q0 -15 -28 -123q-22 -99 -71 -296l-46 -167q-24 -87 -24 -157 q0 -101 67 -101q89 0 164 266q12 44 29 44zM665 915q-222 0 -334 -455q-37 -150 -37 -232q0 -209 139 -209q87 0 176.5 76t111.5 162l116 462q0 21 -16 64q-49 132 -156 132z" />
+<glyph unicode="&#x1d44f;" horiz-adv-x="1008" d="M474 821q130 138 259.5 138t202 -102.5t72.5 -233t-47 -248.5q-62 -157 -189.5 -278t-269 -121t-213.5 110q-61 94 -61 234q0 80 59 314l159 630q26 103 26 117q0 36 -77.5 41t-77.5 24q0 25 21 39q3 2 130.5 14t145.5 12q25 0 25 -22q0 -5 -7 -33zM865 707 q0 208 -138 208q-78 0 -160 -66.5t-121 -143.5q-5 -9 -50.5 -194t-45.5 -270q0 -222 146 -222q218 0 332 451q37 147 37 237z" />
+<glyph unicode="&#x1d450;" horiz-adv-x="951" d="M955 260q21 0 21 -21t-43 -68q-180 -195 -441 -195q-155 0 -247.5 102t-92.5 259q0 227 173.5 424.5t397.5 197.5q96 0 173.5 -48t77.5 -138q0 -52 -30 -91.5t-81 -39.5q-74 0 -74 71q0 51 38.5 78t91.5 27q-44 97 -193 97q-91 0 -183 -70q-139 -106 -208 -362 q-37 -137 -37 -231t50.5 -163.5t148.5 -69.5q213 0 358 141l51 55q41 45 49 45z" />
+<glyph unicode="&#x1d451;" horiz-adv-x="1096" d="M1168 1489q0 -9 -6 -33l-308 -1220q-14 -55 -14 -116q0 -101 67 -101q93 0 164 266q12 44 29 44q22 0 22 -22.5t-29 -115t-61 -139.5q-52 -76 -129.5 -76t-129 45.5t-63.5 119.5q-139 -165 -277 -165t-209.5 102t-71.5 234t48 250q63 156 180 267q137 130 278 130 t203 -143l133 529q7 28 7 36q0 37 -78.5 41t-78.5 24q0 25 21 39q3 2 131.5 14t146.5 12q25 0 25 -22zM665 915q-222 0 -334 -455q-37 -150 -37 -232q0 -209 139 -209q87 0 176.5 76t111.5 162l116 462q0 21 -16 64q-49 132 -156 132z" />
+<glyph unicode="&#x1d452;" horiz-adv-x="940" d="M966 236q0 -17 -46 -67q-179 -193 -439 -193q-157 0 -243 112.5t-86 282.5t91.5 315.5t252.5 221.5q107 51 205.5 51t167 -48.5t68.5 -134.5q0 -183 -230 -243q-118 -30 -377 -30q-34 -147 -34 -224q0 -260 191 -260q221 0 365 148q90 93 92 93q22 0 22 -24zM872 776 q0 66 -47 102.5t-115 36.5q-139 0 -243 -119q-85 -98 -128 -249h110q423 0 423 229z" />
+<glyph unicode="&#x1d453;" horiz-adv-x="675" d="M860 1391q0 -48 -31 -84t-78 -36q-74 0 -74 70q0 94 112 108q-47 40 -120 40t-108 -103q-12 -35 -35 -157l-55 -291h193q39 0 39 -23q0 -42 -48 -42h-198q-8 -55 -53 -288l-103 -519q-115 -508 -338 -508q-70 0 -125.5 37.5t-55.5 94t31.5 93t78.5 36.5q73 0 73 -70 q0 -44 -32.5 -73t-78.5 -34q41 -41 109 -41q80 0 130 139q18 49 49 210l178 923h-160q-37 0 -37 25q0 40 49 40h162q50 289 81 371q84 223 258 223q72 0 129.5 -36.5t57.5 -104.5z" />
+<glyph unicode="&#x1d454;" horiz-adv-x="1007" d="M1007 863q0 -7 -7 -35l-240 -971q-14 -55 -56 -113q-137 -186 -405.5 -186t-268.5 124q0 47 31 81t78 34q74 0 74 -74.5t-88 -98.5q73 -23 174 -23t181.5 56t121.5 149q29 65 49 154l38 173q-123 -136 -256.5 -136t-205.5 100t-72 231t55 264.5t172 242.5 q136 124 276 124t203 -143q8 102 90 102q56 0 56 -55zM663 915q-220 0 -329 -434q-37 -148 -37 -232q0 -209 139 -209q77 0 174 79.5t116 155.5l102 417l8 31q0 17 -14 56q-49 136 -159 136z" />
+<glyph unicode="&#x1d455;" horiz-adv-x="1162" d="M1165 329q23 0 23 -19.5t-26 -87.5q-94 -246 -253 -246q-76 0 -124.5 49.5t-48.5 125.5q0 37 30 120q133 368 133 492q0 152 -117 152q-137 0 -236.5 -104.5t-135.5 -246.5l-118 -473q-15 -61 -26 -78q-21 -37 -67 -37q-57 0 -57 57q0 22 7 50l317 1262q5 20 5 36 q0 37 -78 40.5t-78 24.5q0 24 21 39q6 4 129.5 15t149.5 11t26 -22q0 3 -9 -33l-166 -669q135 172 322 172q111 0 176.5 -59.5t65.5 -170.5t-137 -488q-36 -99 -36 -150q0 -72 58 -72q86 0 145 95q31 49 72 171q15 44 33 44z" />
+<glyph unicode="&#x1d456;" horiz-adv-x="657" d="M660 329q23 0 23 -19t-27 -89q-95 -245 -254 -245q-76 0 -123.5 49.5t-47.5 125.5q0 39 26 111l116 297q83 220 83 288t-58 68q-89 0 -148 -96q-30 -50 -72 -175q-13 -39 -30 -39q-25 0 -25 20.5t27 89.5q96 244 254 244q75 0 124 -50t49 -124q0 -36 -22 -99l-117 -306 q-86 -227 -86 -294t58 -67q86 0 145 95q31 49 72 171q15 44 33 44zM642.5 1408.5q21.5 -21.5 21.5 -56.5t-34 -67t-75 -32q-71 0 -71 72q0 41 33 73t68.5 32t57 -21.5z" />
+<glyph unicode="&#x1d457;" horiz-adv-x="714" d="M735 1358q0 -41 -33.5 -73t-74.5 -32q-74 0 -74 72q0 41 34 73t75 32q73 0 73 -72zM654 763q0 -39 -9 -75l-202 -802q-35 -138 -149 -233t-254 -95q-71 0 -128.5 31t-57.5 95q0 46 32 79.5t78 33.5q74 0 74 -69q0 -84 -94 -104q45 -23 96 -23q99 0 174 95q61 77 89 188 l207 818q15 59 15 114q0 99 -69 99q-89 0 -161 -80q-43 -49 -89.5 -139.5t-59.5 -90.5q-23 0 -23 21q0 14 30 74q128 259 309 259q83 0 137.5 -56t54.5 -140z" />
+<glyph unicode="&#x1d458;" horiz-adv-x="1039" d="M628 186l17 117q0 167 -251 195l-102 -407q-31 -115 -93 -115q-57 0 -57 57q0 22 7 50l313 1246q9 36 9 52q0 36 -76.5 41t-76.5 24q0 23 21 39q3 2 130 14t149.5 12t22.5 -22q0 3 -9 -33l-222 -896q83 31 184 138q153 162 169 175q100 86 202 86q60 0 104 -35.5 t44 -88.5t-31.5 -88.5t-79.5 -35.5q-72 0 -72 69q0 97 111 109q-28 26 -78 26q-82 0 -173 -72q-48 -38 -148 -148t-176 -156q316 -41 316 -235q0 -31 -13 -90t-13 -90q0 -105 71 -105q113 0 188 266q12 44 31 44q22 0 22 -24t-29 -102q-84 -227 -215 -227q-88 0 -142 60.5 t-54 149.5z" />
+<glyph unicode="&#x1d459;" horiz-adv-x="571" d="M642 1489q0 -9 -6 -33l-308 -1220q-15 -59 -15 -116q0 -101 67 -101q94 0 164 266q12 44 32 44t20 -25.5t-25 -103.5q-72 -224 -197 -224q-83 0 -137 56t-54 140q0 37 10 77l270 1080q12 48 12 52q0 36 -78 40.5t-78 24.5q0 26 22 39q7 4 128 15t147 11t26 -22z" />
+<glyph unicode="&#x1d45a;" horiz-adv-x="1843" d="M1846 329q22 0 22 -20.5t-25 -86.5q-94 -246 -254 -246q-76 0 -124 49.5t-48 125.5q0 37 30 120q132 365 132 492q0 152 -116 152q-191 0 -319 -210q-27 -44 -39 -79l-132 -522q-17 -67 -26 -84q-23 -44 -69 -44q-57 0 -57 54q0 6 23 99l117 474q26 105 26 160 q0 152 -116 152q-162 0 -297 -177q-65 -86 -107 -254l-59 -277q-14 -72 -49 -185q-25 -46 -74 -46q-56 0 -56 54q0 25 26 127l56 221l63 217q36 130 36 225t-68 95q-91 0 -161 -257q-14 -53 -33 -53q-25 0 -25 21q0 26 31 118.5t62 138.5q53 76 133.5 76t133 -54.5 t57.5 -137.5q137 192 336 192q230 0 242 -211q142 211 351 211q111 0 176 -59.5t65 -171t-136 -487.5q-36 -100 -36 -150q0 -72 58 -72q87 0 145 95q31 49 72 171q15 44 33 44z" />
+<glyph unicode="&#x1d45b;" horiz-adv-x="1250" d="M1252 329q24 0 24 -19.5t-26 -87.5q-94 -246 -254 -246q-76 0 -124.5 49.5t-48.5 125.5q0 38 30 120q134 368 134 492q0 152 -116 152q-163 0 -297 -177q-46 -61 -57 -92t-42 -156l-82 -339q-8 -47 -34 -129q-25 -46 -74 -46q-56 0 -56 54q0 26 26 128l56 220l63 218 q36 133 36 226t-68 93q-90 0 -161 -257q-15 -53 -33 -53q-25 0 -25 21q0 27 31.5 119t62.5 137q52 77 132.5 77t133 -54.5t57.5 -137.5q137 192 336 192q111 0 176.5 -59.5t65.5 -173t-136 -485.5q-37 -101 -37 -150q0 -72 58 -72q86 0 146 95q33 53 72 171q14 44 31 44z " />
+<glyph unicode="&#x1d45c;" horiz-adv-x="1057" d="M1057 597q0 -228 -173 -424.5t-398 -196.5q-151 0 -242.5 104t-91.5 257q0 226 174.5 424t397.5 198q150 0 241.5 -104.5t91.5 -257.5zM871 441q41 141 41 236.5t-49 166.5t-142 71q-181 0 -308 -224q-43 -76 -79 -210t-36 -226.5t48.5 -164t141.5 -71.5q260 0 383 422z " />
+<glyph unicode="&#x1d45d;" horiz-adv-x="1095" d="M99 -420l-87 -5q-25 0 -25 21q0 38 58.5 43t67.5 12q21 16 34 69l245 982q17 68 17 114q0 99 -68 99q-93 0 -161 -257q-14 -53 -33 -53q-24 0 -24 21q0 26 31.5 120t60.5 137q52 76 129 76t129.5 -46.5t64.5 -119.5q130 166 281 166q132 0 208 -109q68 -96 68 -228 t-55.5 -268t-181.5 -257t-269.5 -121t-201.5 146l-85 -332q-27 -104 -27 -119q0 -26 79.5 -30.5t79.5 -27.5q0 -38 -58 -38zM954 707q0 208 -139 208q-80 0 -176 -79.5t-115 -157.5l-106 -427q-6 -24 -6 -43.5t11 -52.5q45 -136 160 -136q216 0 332 451q39 152 39 237z" />
+<glyph unicode="&#x1d45e;" horiz-adv-x="1030" d="M512 -420l-99 -5q-29 0 -29 21q0 33 30 41q9 2 56 2q88 0 114 67q30 78 55 190l48 214l-2 3q-124 -137 -257 -137t-204.5 102t-71.5 234t56 269t182.5 257.5t269 120.5t206.5 -157q21 36 71 95t71.5 59t21.5 -13q0 -2 -1 -5l-304 -1226q-7 -28 -7 -41q0 -26 79 -29.5 t79 -24.5q0 -42 -39 -42l-102 5h-223zM665 915q-222 0 -334 -455q-37 -150 -37 -232q0 -209 139 -209q86 0 176.5 76.5t111.5 161.5l116 462q0 21 -16 64q-49 132 -156 132z" />
+<glyph unicode="&#x1d45f;" horiz-adv-x="994" d="M818 959q66 0 121 -34.5t55 -89t-32 -89.5t-79 -35q-73 0 -73 69q0 89 104 109q-38 26 -98 26q-131 0 -241 -156q-38 -54 -47 -78.5t-64 -248.5q-25 -90 -69 -271q-7 -43 -31 -126q-25 -59 -80 -59t-55 54q0 25 26 127l56 221l63 218q36 133 36 226t-68 93 q-93 0 -161 -257q-14 -53 -33 -53q-25 0 -25 21q0 28 31.5 121t61.5 136q52 76 130 76t129.5 -48t62.5 -124q118 172 280 172z" />
+<glyph unicode="&#x1d460;" horiz-adv-x="942" d="M942 773q0 -45 -24 -80t-68 -35q-62 0 -62 59q0 38 31.5 61.5t70.5 23.5q-32 113 -201.5 113t-229.5 -128q-20 -43 -20 -72q0 -68 76 -105q30 -15 147 -46.5t155 -67.5q71 -68 71 -163q0 -65 -36 -138q-108 -219 -394 -219q-117 0 -201 46q-105 56 -105 163q0 55 29 95 t82 40q75 0 75 -69q0 -52 -40 -81q-33 -26 -76 -26q-7 0 -15 1q45 -126 253.5 -126t286.5 151q26 51 26 93q0 87 -79 128q-32 15 -155 44q-213 49 -213 209q0 55 29 118q91 197 334 197q98 0 175.5 -47t77.5 -139z" />
+<glyph unicode="&#x1d461;" horiz-adv-x="709" d="M773 899q0 -40 -63 -40h-200l-165 -669q-7 -28 -7 -68q0 -103 68 -103q152 0 272 262q6 13 21 38q8 9 17 9q24 0 24 -19q0 -12 -31 -73q-133 -260 -309 -260q-85 0 -139 55.5t-54 140.5q0 34 23 126l141 561h-214q-38 0 -38 22q0 42 63 42h206l89 361q18 75 80 75t62 -54 q0 -14 -9 -49l-85 -333h213q35 0 35 -24z" />
+<glyph unicode="&#x1d462;" horiz-adv-x="1190" d="M1164 285q13 44 32 44t19 -25t-28.5 -114.5t-59.5 -136.5q-52 -77 -133 -77q-148 0 -186 148q-122 -148 -251.5 -148t-197 67.5t-67.5 191t106 406.5q58 155 58 202q0 72 -58 72q-89 0 -148 -96q-32 -52 -72 -175q-13 -39 -30 -39q-25 0 -25 20.5t27 89.5q96 244 254 244 q75 0 124 -50t49 -124q0 -45 -37 -143q-118 -313 -118 -444q0 -179 135 -179q121 0 218 132q11 15 29 47q1 2 15 60l140 570q27 110 91 110q59 0 59 -56q0 -8 -22 -96l-82 -324l-47 -169q-26 -99 -26 -173q0 -101 66 -101q89 0 166 266z" />
+<glyph unicode="&#x1d463;" horiz-adv-x="1061" d="M1061 813q0 -83 -34 -225q-146 -612 -452 -612q-281 0 -281 265q0 126 104 400q58 153 58 202q0 72 -58 72q-89 0 -148 -96q-29 -47 -72 -175q-13 -39 -30 -39q-25 0 -25 20t27 89q97 245 254 245q75 0 124 -50t49 -124q0 -42 -43 -155q-109 -287 -109 -418 q0 -193 158 -193q228 0 360 439q33 110 33 172t-51 146t-51 87q0 37 31 66.5t68 29.5q88 0 88 -146z" />
+<glyph unicode="&#x1d464;" horiz-adv-x="1536" d="M1536 813q0 -96 -53 -304.5t-118 -327.5q-112 -205 -285 -205q-207 0 -264 155q-87 -155 -222.5 -155t-217.5 68.5t-82 200.5q0 92 44 226l79 217q39 108 39 155q0 72 -58 72q-82 0 -137 -80q-32 -46 -64.5 -138t-48.5 -92q-25 0 -25 20t25 85q96 249 256 249 q74 0 123.5 -50t49.5 -124q0 -42 -37 -141q-113 -303 -113 -424q0 -201 173 -201q71 0 130 64t67 137q15 139 46 269.5t85 340.5q30 108 92 108q58 0 58 -56q0 -7 -30 -128l-91 -366q-29 -117 -29 -176q0 -193 162 -193q200 0 323 410q40 133 40 202t-52 147.5t-52 84.5 q0 37 32 66.5t69 29.5q86 0 86 -146z" />
+<glyph unicode="&#x1d465;" horiz-adv-x="1112" d="M1112 826q0 -46 -33.5 -80.5t-79.5 -34.5q-71 0 -71 69q0 89 95 107q-48 28 -110 28q-141 0 -208 -227q-119 -406 -119 -523q0 -146 117 -146q100 0 170 80q42 47 83.5 138.5t59.5 91.5q21 0 21 -23.5t-30 -85.5q-117 -244 -310 -244q-176 0 -225 171q-86 -171 -225 -171 q-74 0 -128 29q-68 35 -68 103q0 46 32 81t78 35q73 0 73 -70q0 -86 -95 -106q49 -29 111 -29q146 0 211 250l75 300q39 153 39 202q0 144 -118 144q-156 0 -240 -179q-13 -37 -44 -108q-12 -23 -26 -23q-24 0 -24 21q0 26 30 88q119 245 310 245q171 0 225 -172 q81 172 227 172q74 0 129 -30q68 -36 68 -103z" />
+<glyph unicode="&#x1d466;" horiz-adv-x="1107" d="M1107 882q0 -9 -7 -37l-213 -850q-44 -175 -184.5 -306t-313.5 -131q-90 0 -155 49.5t-65 137.5q0 54 30.5 93.5t82.5 39.5q73 0 73 -67q0 -42 -33 -75t-75 -33q-10 0 -21 3q33 -105 163 -105q261 0 381 473l-3 2q-95 -100 -217.5 -100t-190 66t-67.5 192.5t106 406.5 q58 153 58 202q0 72 -58 72q-89 0 -148 -96q-29 -48 -72 -175q-13 -39 -30 -39q-25 0 -25 20.5t27 89.5q96 244 254 244q75 0 124 -50t49 -124q0 -40 -37 -139q-118 -316 -118 -448q0 -179 133 -179q84 0 156 60t93 143l162 641q19 75 80 75t61 -56z" />
+<glyph unicode="&#x1d467;" horiz-adv-x="940" d="M969 942q0 -31 -99 -151t-318.5 -318t-309.5 -299q26 9 70.5 9t133.5 -35t137 -35q176 0 262 181q14 30 27 30q23 0 23 -24.5t-31 -86.5q-118 -237 -305 -237q-63 0 -138 81.5t-127 81.5t-92 -34t-74.5 -81.5t-43.5 -47.5q-24 0 -24 17q0 29 102.5 154t318 315.5 t300.5 291.5q-16 -2 -49.5 -2t-123 34.5t-137.5 34.5q-120 0 -182 -102q-15 -25 -25 -25q-24 0 -24 21t25 70q89 174 231 174q61 0 135 -82t126.5 -82t119.5 82t69 82q23 0 23 -17z" />
+<glyph unicode="&#x1d468;" horiz-adv-x="1470" d="M252 6l-158 -6q-27 0 -27 47.5t34 52.5q46 3 92 5q56 7 75 43l666 1208q20 36 52 36h80q31 0 36 -36l158 -1252q121 0 139.5 -6t18.5 -30.5t-9.5 -46t-23.5 -21.5l-264 6l-290 -6q-25 0 -25 41t14.5 50t52.5 9.5t101 7.5l-34 271h-441l-145 -261q44 -17 99 -17 q39 0 39 -41q0 -60 -31 -60zM927 480l-71 550l-302 -550h373z" />
+<glyph unicode="&#x1d469;" horiz-adv-x="1312" d="M1340 1284q112 -71 112 -214t-109 -245q-97 -93 -245 -123q120 -15 195.5 -83t75.5 -173t-50 -198q-134 -248 -455 -248h-770q-27 0 -27 42.5t22 53.5q10 4 55 4.5t116 5.5l241 1132q-122 0 -146.5 4.5t-24.5 38.5q0 16 9.5 39t23.5 23h734q150 0 243 -59zM1168 1087 q0 155 -123 155h-271q-13 0 -23 -1l-99 -504h232q128 0 206 108t78 242zM1091 475q0 185 -135 185h-319l-111 -559l20 -1h265q133 0 212 126q68 108 68 249z" />
+<glyph unicode="&#x1d46a;" horiz-adv-x="1326" d="M1381 867l3 63q0 139 -64 235q-74 111 -206 111q-445 0 -582 -563q-42 -171 -42 -296q0 -170 94.5 -260t265.5 -90q131 0 244.5 82t172.5 205q12 41 40 120q6 15 83 15q20 0 20 -25.5t-24.5 -92.5t-41.5 -98q-83 -152 -233 -229.5t-332 -77.5q-254 0 -410.5 138.5 t-156.5 390.5q0 181 73 359q103 248 306 385t473 137q204 0 315 -140q66 63 159 140h38q21 0 21 -23q1 -3 1 -4.5t-1 -1.5l-104 -499q-4 -18 -33.5 -19t-56.5 -1q-22 4 -22 39z" />
+<glyph unicode="&#x1d46b;" horiz-adv-x="1433" d="M1552 859q0 -339 -199 -589q-216 -270 -544 -270h-715q-27 0 -27 45.5t34 54.5q61 0 159 6l241 1132q-128 0 -144 4q-27 7 -27 39q0 16 9.5 39t23.5 23h730q220 0 339.5 -130.5t119.5 -353.5zM1285 940q0 302 -296 302h-197q-14 0 -24 -1l-234 -1140l21 -1h192 q211 0 333 144q94 111 149.5 325t55.5 371z" />
+<glyph unicode="&#x1d46c;" horiz-adv-x="1251" d="M1256 907l7 114q0 135 -69 183q-55 38 -197 38h-167q-31 0 -48 -4l-106 -491h44q90 0 139.5 25.5t71.5 106.5q6 29 15 63.5t28 34.5h62q28 0 28 -35q0 -2 -105 -500q-5 -24 -52.5 -24t-54.5 11t-7 20t7.5 46.5t7.5 70.5q0 62 -79 77q-25 5 -125 5l-116 -546q20 -2 42 -2 h152q186 0 282 68t170 243l43 110q10 23 25 23h62q27 0 27 -35q0 -18 -178 -485q-9 -24 -25 -24h-1046q-27 0 -27 43t24 53q10 4 55 4.5t114 5.5l241 1132q-40 4 -144 4q-27 0 -27 39q0 62 33 62h1017q11 0 19.5 -14.5t7.5 -25.5l-35 -408q-2 -27 -35 -32h-54q-27 0 -27 44z " />
+<glyph unicode="&#x1d46d;" horiz-adv-x="1170" d="M379 6l-285 -6q-27 0 -27 43t24 53q10 4 55 4.5t114 5.5l241 1132q-130 0 -144 4q-27 8 -27 39q0 62 33 62h991q10 0 18.5 -14.5t7.5 -25.5l-34 -408q-2 -26 -35 -31q-3 -1 -53 -1q-25 0 -25 39l6 125q0 131 -68 177q-55 38 -192 38h-147q-34 0 -50 -4l-111 -516h42 q89 0 136 25.5t69 106.5q6 29 15.5 63t28.5 34h60q26 0 26 -34q0 -2 -105 -500q-4 -20 -34 -24h-14q-11 0 -37 1t-26 39l15 107q0 61 -75 77q-26 6 -121 6l-110 -519q24 -2 91.5 -2.5t97.5 -1.5q27 -7 27 -40q0 -16 -10 -38t-24 -22z" />
+<glyph unicode="&#x1d46e;" horiz-adv-x="1449" d="M1286 534l238 6q25 0 25 -39q0 -56 -40 -61l-106 -3q-20 -89 -44.5 -211.5t-43.5 -208.5q-5 -17 -26.5 -17t-77.5 36t-76 62q-115 -132 -363.5 -132t-404 138.5t-155.5 390.5q0 183 74 361.5t205 301.5q231 218 571 218q202 0 315 -140q66 63 159 140h29q21 0 21 -23 q0 -2 -1 -6l-103 -499q-4 -19 -20 -19h-82q-20 0 -20 32l3 69q0 139 -54 232q-67 114 -197 114q-441 0 -579 -562q-41 -166 -41 -294q0 -173 96.5 -263t270.5 -90q86 0 157 44.5t88 123.5l41 202l-202 4q-25 0 -25 39q0 60 32 60z" />
+<glyph unicode="&#x1d46f;" horiz-adv-x="1493" d="M1428 1337l306 6q25 0 25 -43t-20 -53q-10 -5 -68.5 -5t-105.5 -6l-238 -1132q120 0 145.5 -4.5t25.5 -39.5q0 -16 -10 -38t-24 -22l-309 6l-276 -6q-26 0 -26 42t22 53q10 5 54 5.5t118 5.5l114 542h-505l-115 -544q121 0 146 -4.5t25 -39.5q0 -16 -9.5 -38t-24.5 -22 l-299 6l-285 -6q-27 0 -27 42t22 53q10 5 54 5.5t117 5.5l241 1132q-129 0 -144 4q-27 8 -27 39q0 62 48 62l284 -6l286 6q25 0 25 -43t-14.5 -50.5t-73 -7.5t-105.5 -6l-104 -489h506l104 491q-128 0 -143 4q-27 8 -27 39q0 62 33 62z" />
+<glyph unicode="&#x1d470;" horiz-adv-x="724" d="M668 1337l297 6q26 0 26 -43t-21 -53q-10 -5 -73 -5t-110 -6l-237 -1132q137 0 151 -4q27 -7 27 -40q0 -17 -9.5 -38.5t-24.5 -21.5l-306 6l-296 -6q-25 0 -25 42.5t23 53.5q10 4 56 4.5t123 5.5l241 1132q-51 0 -154 4q-26 3 -26 39q0 62 48 62z" />
+<glyph unicode="&#x1d471;" horiz-adv-x="951" d="M955 1337l237 6q25 0 25 -40q0 -59 -51 -64q-48 -1 -95 -1l-206 -968q-65 -304 -458 -304q-114 0 -195 49q-97 58 -97 165q0 72 40.5 131t108.5 59q46 0 75.5 -34.5t29.5 -85.5t-30.5 -101t-81.5 -65q51 -39 132.5 -39t142.5 85q47 66 68 163l200 945q-188 0 -199 4 q-26 9 -26 39q0 62 33 62z" />
+<glyph unicode="&#x1d472;" horiz-adv-x="1458" d="M1548 1337l125 6q25 0 25 -48t-33 -53q-16 0 -49 -1q-71 -4 -137 -46q-8 0 -463 -373l307 -708q9 -7 74 -11.5t65 -42.5q0 -60 -32 -60l-233 6l-292 -6q-25 0 -25 39q0 56 43 62q48 4 96 9l-226 528l-169 -137l-83 -397h17q47 0 127 -4q27 -4 27 -40q0 -16 -9.5 -38 t-24.5 -22l-299 6l-285 -6q-27 0 -27 42.5t22 53.5q10 4 55 4.5t116 5.5l241 1132q-48 0 -144 4q-27 3 -27 39q0 62 48 62l284 -6l286 6q25 0 25 -43.5t-20 -52.5q-10 -5 -69 -5t-104 -6l-128 -603l732 598q-35 11 -86 11q-27 0 -27 39q0 62 33 62z" />
+<glyph unicode="&#x1d473;" horiz-adv-x="1151" d="M662 1337l331 6q25 0 25 -50t-32 -51h-18q-68 0 -188 -6l-240 -1134q20 -2 141 -2q175 0 277 134q53 69 141 287q7 19 31 24q27 0 53 -1q27 -4 27 -32.5t-152 -487.5q-8 -24 -25 -24h-939q-27 0 -27 42t22 53q10 5 54 5.5t117 5.5l241 1132q-129 0 -144 4q-27 7 -27 39 q0 62 48 62z" />
+<glyph unicode="&#x1d474;" horiz-adv-x="1743" d="M287 6l-193 -6q-27 0 -27 47t34 53l91 4q69 5 73 25l236 1109q-40 4 -145 4q-26 0 -26 39q0 62 33 62h374q34 0 40 -36l177 -1046l617 1046q22 36 55 36h358q25 0 25 -42.5t-15 -50.5t-73.5 -8t-103.5 -6l-240 -1132q35 -4 145 -4q27 0 27 -40q0 -16 -10 -38t-24 -22 l-262 6l-253 -6q-26 0 -26 42t22 53q10 5 54 5.5t118 5.5l239 1136l-714 -1207q-21 -35 -58 -35t-43 35l-200 1182l-234 -1099q32 -13 82.5 -15t60.5 -3q27 -4 27 -40q0 -16 -10 -38t-24 -22z" />
+<glyph unicode="&#x1d475;" horiz-adv-x="1472" d="M1518 1337l195 6q25 0 25 -47.5t-31 -53.5q-46 -2 -104 -6t-62 -23l-252 -1189q-5 -24 -25 -24h-83q-14 0 -22 15l-577 1152l-224 -1049q30 -12 82 -14.5t61 -3.5q27 -4 27 -40q0 -16 -10 -38t-24 -22l-207 6l-193 -6q-27 0 -27 47t34 53l91 4q69 5 73 25l236 1111 q-130 0 -144 2q-27 4 -27 39q0 62 33 62h392q44 0 52 -16l466 -926l174 824q-29 12 -67.5 14t-73.5 3q-26 3 -26 39q0 62 42 62z" />
+<glyph unicode="&#x1d476;" horiz-adv-x="1390" d="M1512 865q0 -358 -219 -620q-233 -279 -581 -279q-236 0 -369 134t-133 370q0 358 224 632t575 274q236 0 369.5 -137t133.5 -374zM1178 582q60 217 60 371t-54 238q-64 99 -193 99q-309 0 -443 -511q-57 -216 -57 -371.5t50 -242.5q63 -108 191 -108q302 0 446 525z" />
+<glyph unicode="&#x1d477;" horiz-adv-x="1258" d="M379 6l-285 -6q-27 0 -27 47.5t34 52.5l61 1q33 0 98 5l241 1132q-20 2 -95.5 2t-75.5 41q0 17 10 39.5t23 22.5h703q162 0 262 -69q115 -80 115 -235q0 -105 -51 -199q-139 -257 -487 -257h-262l-102 -479q124 0 144 -4q27 -5 27 -40q0 -17 -9.5 -38.5t-24.5 -21.5z M1161 1105q0 137 -188 137h-181q-14 0 -24 -1l-112 -571h185q141 0 201 56.5t89.5 182.5t29.5 196z" />
+<glyph unicode="&#x1d478;" horiz-adv-x="1401" d="M1512 862q0 -273 -137.5 -506t-379.5 -345q45 -106 109 -106q76 0 114 42q15 17 38 68.5t51 51.5q51 0 51 -50q0 -116 -102 -256t-218 -140t-148 130q-13 54 -13 223q-81 -15 -165 -15q-236 0 -369 134.5t-133 371.5q0 359 216 626q231 285 583 285q237 0 370 -138 t133 -376zM1243 976q0 135 -61.5 224.5t-190.5 89.5q-166 0 -297 -154q-90 -106 -153 -349t-63 -417.5t102 -273.5q0 85 56 148t140 63q112 0 178 -178q133 107 211 370.5t78 476.5zM775 229q-49 0 -88.5 -34.5t-39.5 -82.5q0 -59 75.5 -59t152.5 31q0 145 -100 145z" />
+<glyph unicode="&#x1d479;" horiz-adv-x="1537" d="M374 6l-280 -6q-27 0 -27 41t16 50t58.5 9.5t118.5 5.5l241 1132q-20 2 -95.5 2t-75.5 41q0 16 9.5 39t23.5 23h634q178 0 292 -61q147 -78 147 -240q0 -138 -99.5 -236t-243.5 -142q135 -67 135 -212q0 -48 -16 -143.5t-16 -143.5q0 -120 79 -120q83 0 125 119 q4 14 14 39.5t25 25.5h50q27 0 27 -35q0 -3 -2 -12q-22 -96 -93.5 -156t-168.5 -60q-349 0 -349 221q0 49 25 144.5t25 154t-39.5 103t-106.5 44.5h-164l-111 -529q122 0 145.5 -4.5t23.5 -39.5q0 -16 -9.5 -38t-23.5 -22zM1151 1099q0 143 -211 143h-153q-10 0 -19 -1 l-104 -531h156q139 0 207.5 51t101.5 182q22 86 22 156z" />
+<glyph unicode="&#x1d47a;" horiz-adv-x="1000" d="M1027 934l4 69q0 280 -260 280q-108 0 -185 -75.5t-77 -190.5t111 -146l234 -63q100 -27 153.5 -118t53.5 -201q0 -204 -141.5 -363.5t-342.5 -159.5q-229 0 -339 113l-106 -109l-11 -4h-38q-22 0 -22 24q0 6 93 441q3 15 80 15q23 0 22 -29q0 1 -1 0q0 -4 -2 -12l-4 -23 q-5 -29 -5 -63q0 -131 99 -197q84 -55 223 -55q114 0 190.5 88.5t76.5 204.5q0 135 -111 167l-215 56q-122 41 -175 124.5t-53 184.5t42 198q125 286 436 286q192 0 284 -112q51 54 119 112h39q20 -7 20 -23q0 -1 -92 -439q-3 -17 -33 -19h-44q-23 5 -23 39z" />
+<glyph unicode="&#x1d47b;" horiz-adv-x="1338" d="M711 6l-360 -6q-26 0 -26 46t32 54q105 3 236 8l239 1132q-20 2 -103 2q-131 0 -198 -60.5t-110 -193.5q-9 -34 -31 -101q-9 -24 -25 -24h-51q-27 0 -27 35q0 20 124 421q7 24 25 24h1103q9 0 18 -15t7 -25l-50 -408q-4 -26 -30 -31q-3 -1 -47 -1q-27 0 -27 39 q0 4 7.5 66t7.5 105q0 118 -74 151q-42 18 -131.5 18t-106.5 -4l-240 -1132q91 0 217 -6q26 -5 26 -40q0 -60 -31 -60z" />
+<glyph unicode="&#x1d47c;" horiz-adv-x="1488" d="M1534 1337l196 6q25 0 25 -47t-32 -54q-46 -2 -103.5 -5.5t-62.5 -23.5l-165 -776q-44 -205 -200.5 -338t-359 -133t-326.5 91q-141 102 -141 292q0 61 9 103l168 786q-126 0 -148 5t-22 38q0 62 33 62l276 -6l309 6q25 0 25 -44t-23 -53q-9 -4 -68 -4t-103 -6l-167 -792 q-23 -108 -23 -170q0 -207 223 -207q177 0 293 107.5t154 285.5l162 765q-20 8 -140 17q-27 2 -27 39q0 62 33 62z" />
+<glyph unicode="&#x1d47d;" horiz-adv-x="1519" d="M1608 1337l151 6q26 0 26 -40q0 -61 -48 -61q-121 0 -149 -47l-692 -1193q-21 -36 -52 -36h-81q-32 0 -38 36l-192 1236q-91 0 -122 4q-26 4 -26 39q0 62 44 62l244 -6l290 6q26 0 26 -41t-14 -50.5t-66.5 -9.5t-84.5 -7l146 -932l533 924q-39 15 -109 15q-27 0 -27 39 q0 62 33 62z" />
+<glyph unicode="&#x1d47e;" horiz-adv-x="2096" d="M2201 1337l136 6q26 0 26 -40q0 -61 -50 -61q-107 0 -132 -47l-635 -1193q-16 -30 -53 -35q-6 -1 -68 -1q-30 0 -34 36l-100 900l-478 -900q-16 -30 -53 -35q-5 -1 -68 -1q-30 0 -33 36l-136 1236q-79 0 -111 4q-27 4 -27 39q0 17 10 39.5t24 22.5l245 -6l288 6 q27 0 27 -42t-15.5 -50.5t-69.5 -8.5t-87 -7l99 -889l370 698l-21 194h-20q-62 0 -90 4t-28 39q0 62 33 62l246 -6l288 6q27 0 27 -42t-19 -52q-11 -7 -65 -7t-86 -7l97 -889l466 879q-46 17 -130 17q-26 0 -26 39q0 62 43 62z" />
+<glyph unicode="&#x1d47f;" horiz-adv-x="1436" d="M1411 1337l184 6q25 0 25 -40.5t-13.5 -50.5t-44.5 -10q-151 0 -195 -51l-357 -416l267 -669q50 -1 136 -6q26 -4 26 -40q0 -60 -33 -60l-263 6l-295 -6q-25 0 -25 40.5t12.5 49.5t57.5 12t72 8l-179 448l-374 -440q31 -12 69.5 -14.5t43.5 -3.5q27 -4 27 -40 q0 -16 -10 -38t-24 -22l-242 6l-184 -6q-25 0 -25 47.5t31 52.5q153 0 211 44q5 1 12 7l427 503l-233 582q-42 5 -74 5t-62 1q-27 3 -27 39q0 17 10 39.5t24 22.5l263 -6l295 6q27 0 27 -41t-13.5 -50t-53.5 -11t-76 -8l145 -364l302 356q-44 17 -112 17q-27 0 -27 39 q0 62 33 62z" />
+<glyph unicode="&#x1d480;" horiz-adv-x="1540" d="M1627 1337l152 6q27 0 27 -40q0 -61 -51 -61q-127 0 -168 -51l-517 -655l-91 -432q33 -4 143 -4q27 0 27 -40q0 -60 -33 -60l-294 6l-281 -6q-26 0 -26 42.5t22 52.5q10 5 54.5 5.5t118.5 5.5l91 430l-256 700q-42 5 -73 5t-60 1q-27 3 -27 39q0 62 45 62l254 -6l300 6 q26 0 26 -40.5t-13.5 -50.5t-57 -10t-76.5 -6l204 -559l437 554q-4 2 -79 10q-41 5 -41 40q0 62 33 62z" />
+<glyph unicode="&#x1d481;" horiz-adv-x="1087" d="M1313 1343q23 0 23 -32t-17 -54l-908 -1149h192q173 0 272.5 67.5t160.5 228.5q13 46 44 136q9 24 75 24q27 0 27 -35q0 -12 -62.5 -242.5t-71.5 -258.5t-26 -28h-926q-23 0 -23 34.5t18 57.5l909 1150h-180q-293 0 -397 -239q-12 -39 -39 -116q-9 -24 -76 -24 q-25 0 -25 35q0 11 49.5 203t57 217t25.5 25h898z" />
+<glyph unicode="&#x1d482;" horiz-adv-x="1182" d="M1207 308q0 -4 -2 -12q-78 -320 -251 -320q-167 0 -231 112q-112 -112 -257.5 -112t-229.5 97t-84 255q0 241 137 427q151 204 383 204q112 0 185 -86q39 49 112 49q39 0 72 -28.5t33 -67.5q0 -10 -4 -29l-119 -569q-11 -53 -11 -95q0 -72 38 -72q86 0 118 208 q2 21 10 52q10 19 55.5 19t45.5 -32zM817 767q-37 106 -139 106t-171 -152q-36 -80 -72 -250t-36 -268q0 -142 100 -142q111 0 203 131q0 16 4 35z" />
+<glyph unicode="&#x1d483;" horiz-adv-x="995" d="M1073 606q0 -238 -151.5 -434t-382.5 -196q-152 0 -240.5 97t-89.5 248q15 42 15 92t2 59l182 861q0 4 1 12q-6 0 -20 -0.5t-22 -0.5q-84 0 -84 48q0 19 10 43t26 25l319 16h4q33 0 33 -36q0 -18 -35 -178l-81 -367q90 64 193 64q155 0 238 -98t83 -255zM826 730 q0 143 -99 143q-110 0 -200 -125l-60 -298q-33 -164 -33 -231q0 -158 108 -158t176 151q34 78 71 251t37 267z" />
+<glyph unicode="&#x1d484;" horiz-adv-x="1004" d="M1014.5 221q16.5 -21 16.5 -35.5t-5 -22.5q-124 -187 -479 -187q-176 0 -285.5 97.5t-109.5 271.5q0 250 171 432t419 182q103 0 178 -46q90 -55 90 -151q0 -64 -42 -117.5t-105 -53.5q-91 0 -91 107.5t89 140.5q-47 34 -115 34q-222 0 -311 -391q-33 -145 -33 -230 q0 -191 170 -191q216 0 339 118l69 66q18 -3 34.5 -24z" />
+<glyph unicode="&#x1d485;" horiz-adv-x="1136" d="M1207 308q0 -4 -2 -12q-79 -320 -251 -320q-167 0 -231 112q-112 -112 -257.5 -112t-229.5 97t-84 255q0 241 137 427q151 204 383 204q99 0 172 -73l97 459h-44q-81 0 -81 47q0 18 10.5 42.5t26.5 25.5l317 16h4q32 0 32 -36q0 -2 -1 -6l-256 -1217q-9 -43 -9 -84 q0 -72 38 -72q85 0 117 202q2 24 11 58q11 19 56 19t45 -32zM817 767q-37 106 -139 106t-171 -152q-36 -80 -72 -250t-36 -268q0 -142 100 -142q111 0 203 132q1 17 4 34z" />
+<glyph unicode="&#x1d486;" horiz-adv-x="998" d="M1009 221.5q18 -23.5 18 -36t-7 -22.5q-132 -187 -478 -187q-177 0 -283.5 103.5t-106.5 280.5q0 253 166.5 426t418.5 173q104 0 184.5 -54.5t80.5 -153.5q0 -190 -208 -258q-121 -39 -366 -40q-27 -118 -27 -198.5t41.5 -137t124.5 -56.5q217 0 329 109q77 75 80 75 q15 0 33 -23.5zM850 754q0 51 -33.5 85t-84.5 34q-209 0 -282 -334q400 0 400 215z" />
+<glyph unicode="&#x1d487;" horiz-adv-x="735" d="M980 1320q0 -62 -37 -113.5t-86.5 -51.5t-75 30t-25.5 71q0 94 74 142q-32 10 -63 10t-57 -44l-66 -422h239q28 0 28 -54.5t-33 -54.5h-249l-76 -503q-46 -306 -65 -376q-57 -219 -179 -325q-80 -70 -163 -70t-150 46t-67 118t37 123.5t87.5 51.5t76.5 -29.5t26 -70.5 q0 -97 -74 -142q26 -11 53 -11q55 0 87 130q8 30 30 177l132 881h-203q-29 0 -29 42q0 19 10 43t26 24h214q37 247 84 354q89 197 270 197q88 0 156 -45t68 -128z" />
+<glyph unicode="&#x1d488;" horiz-adv-x="1016" d="M1001 894q24 -28 24 -55.5t-3 -41.5l-202 -954q-30 -142 -179 -219q-126 -65 -286 -65q-328 0 -328 153q0 62 37.5 113.5t88 51.5t75.5 -30t25 -71q0 -75 -50 -122q50 -9 138 -9t151.5 63.5t90.5 165.5l37 181q-91 -63 -189 -63q-155 0 -240.5 96t-85.5 253 q0 238 143.5 428t374.5 190q115 0 185 -86q41 49 130 49q39 0 63 -28zM768 770q-35 103 -138 103t-171 -147q-35 -78 -71 -247t-36 -261q0 -140 102 -140q107 0 200 125z" />
+<glyph unicode="&#x1d489;" horiz-adv-x="1327" d="M1352 308q0 -2 -2 -9q-29 -127 -110.5 -225t-198.5 -98q-88 0 -159 53.5t-71 138.5q0 29 27 114l68 211q44 149 44 264.5t-83 115.5q-146 0 -264 -181q-32 -49 -50 -135l-100 -470q-9 -44 -50.5 -77.5t-88.5 -33.5t-76 32t-29 81q0 9 1 14l263 1242h-40q-85 0 -85 47 q0 19 10 43t26 25l318 16h4q32 0 30 -36q-1 -23 -17 -97l-108 -510q120 126 257 126t220 -56q97 -65 97 -184.5t-121 -499.5q-23 -72 -23 -115t23 -43q119 0 169 194q5 27 18 66q12 19 56.5 19t44.5 -32z" />
+<glyph unicode="&#x1d48a;" horiz-adv-x="750" d="M534 1427.5q39 48.5 86.5 48.5t72 -31.5t24.5 -80.5t-38.5 -97.5t-86.5 -48.5t-72.5 31t-24.5 80.5t39 98zM775 308q0 -2 -2 -9q-34 -127 -106 -215q-88 -108 -203 -108q-88 0 -158.5 53.5t-70.5 138.5q0 33 14 75l159 474q23 69 23 112.5t-25 43.5q-60 0 -108 -65 q-39 -51 -50.5 -99.5t-26.5 -93.5q-11 -21 -56 -21t-45 31q0 109 102 221.5t200 112.5t168 -53.5t70 -139.5q0 -33 -13 -72l-160 -475q-24 -71 -24 -114.5t27 -43.5q110 0 164 186q6 29 21 74q11 19 55.5 19t44.5 -32z" />
+<glyph unicode="&#x1d48b;" horiz-adv-x="658" d="M707 1444.5q25 -31.5 25 -81t-38 -97.5t-86.5 -48t-73.5 31t-25 80t38.5 98t86.5 49t73 -31.5zM667 751q0 -26 -5 -49l-177 -830q-29 -137 -156 -225t-272 -88q-76 0 -139 42.5t-63 109t38.5 116.5t88.5 50t75 -30t25 -71q0 -83 -58 -128q17 -3 20 -3q75 0 136 91 q47 71 66 160l172 812q12 57 12 92q0 73 -39 73q-81 0 -142 -72q-39 -45 -74.5 -125t-44.5 -80h-59q-23 0 -23 29q0 7 2 13q43 129 141.5 225t222.5 96q99 0 176 -56.5t77 -151.5z" />
+<glyph unicode="&#x1d48c;" horiz-adv-x="1207" d="M959 302l-17 -163q0 -78 40 -78q99 0 139 200q4 24 14 60q11 19 55.5 19t44.5 -32q0 -2 -2 -9q-32 -120 -93 -207q-81 -116 -181.5 -116t-177 60.5t-76.5 159.5l9 96q0 122 -183 156l-79 -362q-10 -44 -51 -77t-87.5 -33t-75.5 32t-29 81q0 9 1 14l261 1230q0 4 1 12 q-38 1 -77 3q-47 7 -47 44q0 19 10 43t26 25l318 16h4q32 0 32 -36q0 -2 -1 -6l-180 -852q52 35 158.5 147t162.5 155q98 75 174.5 75t124.5 -56t48 -127t-30 -124q-37 -66 -105 -66q-41 0 -72 30.5t-31 80.5t35.5 98.5t92.5 50.5q-13 27 -41 27q-89 0 -244 -134 q-17 -14 -214 -206q122 0 222 -54q121 -65 121 -177z" />
+<glyph unicode="&#x1d48d;" horiz-adv-x="686" d="M714 1440q0 -2 -1 -6l-256 -1217q-9 -43 -9 -84q0 -72 37 -72q85 0 119 207q2 20 10 53q8 19 39 19q52 0 52 -32q0 -3 -2 -12q-73 -320 -241 -320q-99 0 -176 55.5t-77 150.5q0 23 6 51l232 1100q0 4 1 12q-9 1 -41 1q-83 0 -83 46q0 66 35 68l319 16h4q32 0 32 -36z" />
+<glyph unicode="&#x1d48e;" horiz-adv-x="1885" d="M1910 308q0 -2 -2 -9q-36 -132 -108 -218q-89 -105 -210 -105q-88 0 -159 53.5t-71 138.5q0 31 13 75l81 257q44 150 44 261.5t-66 111.5q-75 0 -133 -55q-31 -30 -75 -96t-50.5 -82t-10.5 -34l-111 -520q-9 -44 -51 -77t-86.5 -33t-75 29.5t-30.5 73.5q0 13 2 22 l109 512q18 85 18 138q0 122 -83 122q-77 0 -143 -64t-117 -178l-29 -141q-25 -136 -86 -404q-13 -46 -52.5 -78t-85.5 -32t-76.5 29.5t-30.5 73.5q0 8 3 22l127 607q12 57 12 92q0 73 -39 73q-56 0 -78 -112q-28 -145 -28 -146q-13 -21 -41 -21q-71 0 -71 31q0 94 76.5 214 t163 120t159 -41t89.5 -118q65 79 119.5 119t132.5 40q270 0 309 -177q135 177 285 177q280 0 280 -248q0 -117 -121 -492q-24 -74 -24 -116t24 -42q115 0 165 187q6 30 20 73q12 19 62 19t50 -32z" />
+<glyph unicode="&#x1d48f;" horiz-adv-x="1326" d="M1351 308q0 -5 -1 -9q-32 -123 -102 -212q-87 -111 -197 -111q-89 0 -159 53t-70 139q0 34 12 75l80 250q44 148 44 264t-83 116q-129 0 -245 -181q-22 -34 -35 -61q-1 -3 -32 -149l-55 -263q-8 -45 -28 -133q-13 -47 -52.5 -78.5t-85.5 -31.5t-76.5 29.5t-30.5 73.5 q0 8 3 22l127 607q12 57 12 92q0 73 -39 73q-62 0 -92 -111l-36 -147q-12 -21 -36 -21q-54 0 -54 31q0 94 76.5 214t163 120t159 -41t89.5 -118q131 159 269 159t221 -56q98 -65 98 -192q0 -99 -43 -249l-79 -243q-23 -72 -23 -115t23 -43q115 0 166 187q5 30 19 73 q12 19 42 19q50 0 50 -32z" />
+<glyph unicode="&#x1d490;" horiz-adv-x="1062" d="M1139 584q0 -252 -169.5 -430t-420.5 -178q-180 0 -288.5 98t-108.5 276q0 253 170.5 431t422.5 178q179 0 286.5 -98.5t107.5 -276.5zM890 693q0 180 -152 180q-136 0 -216 -138q-51 -87 -85.5 -247.5t-34.5 -245.5q0 -181 153 -181q136 0 215 137q50 87 85 249.5 t35 245.5z" />
+<glyph unicode="&#x1d491;" horiz-adv-x="1038" d="M203 -417l-190 -5q-27 0 -27 47t36 59q9 3 79 6l217 1027q10 47 10 83q0 73 -39 73q-51 0 -79 -72q-12 -29 -31 -117t-38 -88h-47q-23 0 -23 29q0 94 76.5 214t164.5 120q170 0 232 -113q113 113 258.5 113t229 -98t83.5 -255q0 -240 -136 -425q-149 -205 -380 -205 q-104 0 -176 72l-76 -360l49 2q77 0 77 -47q0 -65 -36 -65zM869 730q0 143 -100 143q-114 0 -204 -131q-1 -8 -6 -35l-108 -540q36 -106 138 -106t170 152q37 81 73.5 252t36.5 265z" />
+<glyph unicode="&#x1d492;" horiz-adv-x="1098" d="M692 -417l-221 -5q-29 0 -29 47.5t45 60.5q15 4 87 4h18l74 349q-91 -63 -190 -63q-156 0 -240 97t-84 255q0 241 137 427q151 204 383 204q115 0 185 -86q23 22 92 54t90 32t40 -12t19 -25q0 -1 -1 -5l-261 -1229l50 2q78 0 78 -47q0 -65 -36 -65zM817 767 q-37 106 -139 106t-170 -152q-37 -81 -73 -251t-36 -267q0 -142 100 -142q112 0 201 124z" />
+<glyph unicode="&#x1d493;" horiz-adv-x="998" d="M968.5 901.5q55.5 -57.5 55.5 -130.5t-39 -129t-102 -56q-41 0 -70 30.5t-29 71.5q0 125 109 156q-21 29 -76.5 29t-125.5 -54.5t-83 -116.5l-128 -616q-9 -44 -52 -77t-87.5 -33t-75 29.5t-30.5 73.5q0 8 3 22l127 607q12 57 12 92q0 73 -39 73q-84 0 -116 -203 q-2 -20 -12 -55q-10 -21 -36 -21q-54 0 -54 31q0 94 76.5 214t164.5 120q172 0 235 -122q103 122 237 122q80 0 135.5 -57.5z" />
+<glyph unicode="&#x1d494;" horiz-adv-x="831" d="M870 771q0 -58 -29.5 -104t-84.5 -46q-80 0 -80 89t70 123q-48 40 -133.5 40t-143.5 -40t-58 -118q0 -61 77 -89l127 -30q220 -54 220 -253q0 -83 -39 -163q-100 -204 -392 -204q-127 0 -213 41q-114 54 -114 167q0 66 36 121t99 55q41 0 66 -30.5t25 -72.5 q0 -115 -93 -149q63 -47 174.5 -47t182.5 43q87 51 87 151q0 75 -88 108l-151 36q-86 22 -136 82t-50 146q0 158 103 245t263 87q107 0 182 -40q93 -50 93 -148z" />
+<glyph unicode="&#x1d495;" horiz-adv-x="922" d="M947 308q0 -4 -2 -10q-42 -124 -139.5 -223t-205.5 -99t-185 55.5t-77 150.5q0 23 6 51l123 581h-177q-29 0 -29 42q0 19 10.5 43t26.5 24h192l68 333q9 44 52.5 77.5t86 33.5t75.5 -29t33 -67q0 -6 -5 -30l-67 -318h176q28 0 28 -43q0 -18 -10.5 -42t-25.5 -24h-190 l-125 -586q-11 -52 -11 -95q0 -73 39 -73q136 0 215 192q7 26 26 69q14 19 53 19t39 -32z" />
+<glyph unicode="&#x1d496;" horiz-adv-x="1286" d="M1068 -24q-169 0 -231 114q-100 -114 -239.5 -114t-227 68.5t-87.5 208.5q0 103 39 236l75 228q23 72 23 114t-23 42q-118 0 -168 -192q-5 -22 -19 -66q-8 -19 -20 -19h-47q-23 0 -23 29q0 103 99.5 218.5t194.5 115.5t165.5 -53.5t70.5 -139.5q0 -27 -26 -109l-65 -201 q-40 -139 -40 -246q0 -149 105 -149t192 137q0 13 5 35l126 598q9 44 51.5 77.5t86.5 33.5t75.5 -31.5t31.5 -73.5q0 -8 -3 -22l-124 -587q-12 -57 -12 -95q0 -72 38 -72q81 0 115 194q3 26 15 66q11 19 50.5 19t39.5 -32q-83 -332 -243 -332z" />
+<glyph unicode="&#x1d497;" horiz-adv-x="1080" d="M1079 766q0 -218 -121 -479q-144 -311 -330 -311q-343 0 -343 285q0 101 39 232l73 224q23 73 23 114.5t-23 41.5q-119 0 -168 -191q-4 -24 -19 -67q-11 -21 -36 -21q-54 0 -54 31q0 103 99.5 218.5t194.5 115.5t165.5 -53.5t70.5 -139.5q0 -26 -26 -107l-63 -197 q-40 -136 -40 -239q0 -162 131 -162q156 0 266 339q38 117 38 167.5t-72 112t-72 117.5t41 110t103 54t96 -69q27 -53 27 -126z" />
+<glyph unicode="&#x1d498;" horiz-adv-x="1578" d="M1551 891q27 -54 27 -144t-47 -275q-81 -317 -208 -426q-82 -70 -166 -70q-229 0 -303 116q-80 -116 -207 -116q-362 0 -362 292q0 99 37 219l75 230q23 72 23 114t-23 42q-117 0 -167 -187q-5 -24 -20 -71q-8 -19 -20 -19h-47q-23 0 -23 29q0 103 99.5 218.5 t194.5 115.5t165.5 -53.5t70.5 -139.5q0 -27 -26 -106l-63 -195q-39 -133 -39 -236q0 -168 147 -168q88 0 147 130q-6 44 -6 86.5t13 103.5l96 450q10 45 51.5 78t85.5 33t75 -31.5t31 -73.5q0 -13 -2 -22l-94 -439q-19 -89 -19 -153q0 -162 132 -162q139 0 236 321 q39 130 39 183t-71.5 114.5t-71.5 117.5t40.5 110t102.5 54t97 -70z" />
+<glyph unicode="&#x1d499;" horiz-adv-x="1077" d="M1041.5 903q60.5 -56 60.5 -132t-36.5 -130.5t-98.5 -54.5q-42 0 -67 29.5t-25 76t28 91t74 58.5q-34 32 -89 32t-97 -65q-32 -49 -46 -114l-84 -395q-19 -89 -19 -140q0 -98 99 -98q70 0 137 56.5t91 126.5q7 30 25 77q12 19 51.5 19t39.5 -32q0 -2 -2 -9 q-41 -136 -129.5 -229.5t-217.5 -93.5q-187 0 -255 123q-32 -51 -90.5 -87t-115.5 -36q-91 0 -158.5 55t-67.5 143q0 65 37 119.5t99 54.5q40 0 65.5 -30.5t25.5 -75.5t-28 -90.5t-74 -59.5q31 -31 87.5 -31t93.5 58.5t51 123.5l81 386q21 100 21 146q0 98 -99 98 q-71 0 -136 -55t-91 -126q-7 -26 -25 -77q-8 -19 -21 -19h-48q-23 0 -23 29q0 118 124.5 226t244.5 108q201 0 271 -124q78 124 188 124q88 0 148.5 -56z" />
+<glyph unicode="&#x1d49a;" horiz-adv-x="1192" d="M1192 837q0 -9 -60 -298l-120 -559q-41 -175 -193 -298t-329 -123q-103 0 -184 42q-101 52 -101 145q0 64 37 115.5t98 51.5q41 0 71.5 -30t30.5 -71q0 -98 -80 -143q48 -24 116 -24q119 0 206 141q63 102 96 249q-74 -59 -178 -59q-143 0 -231 69t-88 208q0 103 39 236 l75 228q23 73 23 114.5t-23 41.5q-56 0 -103.5 -61.5t-63.5 -125.5q-3 -17 -12 -51q-13 -41 -44 -41q-54 0 -54 31q0 103 99.5 218.5t194.5 115.5t165.5 -53.5t70.5 -139.5q0 -26 -26 -108l-64 -202q-41 -140 -41 -246q0 -149 106 -149q101 0 187 130l135 640 q9 44 51.5 77.5t86.5 33.5t75.5 -31.5t31.5 -73.5z" />
+<glyph unicode="&#x1d49b;" horiz-adv-x="993" d="M1022 929q0 -7 -19 -34q-163 -230 -427 -475l-236 -220q113 9 340 21q135 5 180 64l18 37q14 26 27 26h57q27 0 27 -31q0 -6 -2 -13q-98 -328 -350 -328q-65 0 -149.5 70t-139.5 70t-114 -48l-94 -92h-19q-62 0 -62 28q0 14 3 19q88 155 310 373q7 6 364 336 q-100 -8 -219.5 -14t-140.5 -9t-42 -20t-29 -18q15 2 -46 2q-27 0 -27 29q0 9 9 37q71 220 255 220q64 0 149 -70t133 -70t99 70t67 70q78 0 78 -30z" />
+<glyph unicode="&#x1d49c;" horiz-adv-x="1762" d="M230 -17q-119 0 -205.5 70.5t-86.5 186.5q0 78 51.5 132.5t129.5 54.5q47 0 84 -31.5t37 -77.5q0 -64 -56 -91l-104 -33q-56 -20 -56 -64q0 -57 78 -91q61 -27 127 -27q257 0 532 311q-107 153 -107 289q0 95 50.5 156.5t142.5 61.5q142 0 241 -134q268 303 435 444 q269 227 538 299q-96 -128 -151 -219q-97 -159 -260.5 -538t-294.5 -605q257 25 414 257l26 -17q-180 -253 -460 -273l-25 -44q-105 -3 -269 -11q38 64 52 101q-192 63 -310 208q-287 -315 -553 -315zM1179 381q0 -69 -14 -156l241 385l160 266q134 205 394 502 q-239 -102 -466 -306q-132 -118 -387 -403q72 -115 72 -288zM1065 672q-56 61 -137 61t-139.5 -72t-58.5 -149.5t54 -162.5zM1102 119q45 144 45 284.5t-62 240.5l-282 -321q112 -134 299 -204z" />
+<glyph unicode="&#x1d49d;" horiz-adv-x="1734" d="M1828 1119q0 -127 -133 -234q-73 -58 -245 -143q251 -100 251 -297q0 -169 -165.5 -314t-336.5 -145q-66 0 -110 37t-44 101q0 179 214 295l16 -27q-80 -43 -139 -116t-59 -154q0 -40 25.5 -70.5t64.5 -30.5q81 0 189 165q129 198 129 380q0 109 -79 159 q-82 -31 -129.5 -31t-47.5 31q0 46 80 46q42 0 95 -15q99 36 165.5 172.5t66.5 253.5t-72 164q-161 -88 -240 -238q-42 -80 -111 -323l-42 -148q-83 -294 -276 -466q-209 -187 -501 -187q-146 0 -243 60q-116 73 -116 211q0 81 49 135.5t128 54.5q49 0 88.5 -31.5 t39.5 -86.5t-57 -86l-108 -39q-55 -19 -55 -56q0 -62 96 -101q75 -30 149 -30q157 0 273 132q74 82 163 270l129 271q150 314 323 478q116 110 279 196q-117 42 -276 42q-245 0 -488 -87.5t-383 -254.5q-104 -124 -104 -243q0 -65 40.5 -110.5t110 -45.5t169.5 65 q126 82 204.5 216.5t89.5 285.5l27 8q14 -93 14 -151q0 -184 -94 -306q-127 -165 -341 -165q-104 0 -178 51.5t-74 151.5q0 128 111 260q150 178 395.5 267t505.5 89q167 0 327 -45q55 25 147 49l8 -29q-67 -19 -114 -37q199 -88 199 -254z" />
+<glyph unicode="&#x1d49e;" horiz-adv-x="1533" d="M1801 1270q0 -178 -241 -347q-192 -134 -411 -194q-70 -19 -215 -43q-81 -160 -109 -235q-52 -136 -52 -252q0 -186 200 -186q128 0 245.5 71t179.5 184q44 81 44 150t-35.5 116t-96.5 47q-80 0 -163.5 -88.5t-107.5 -289.5h-30q-20 83 -20 136q0 116 87 197.5t204 81.5 q84 0 140 -53t56 -136q0 -157 -148.5 -301.5t-355.5 -144.5q-169 0 -294.5 112t-125.5 279q0 140 91 314q-146 26 -247 116t-101 220t86 232q158 188 474 188q70 0 161 -12l-5 -31q-59 9 -131 9q-163 0 -295 -110q-187 -156 -187 -345t260 -238q145 215 356 402t432 279 q113 47 186 47t121 -50.5t48 -124.5zM1729 1328q0 38 -30 61.5t-69 23.5q-241 0 -678 -695q109 20 167 37q299 87 499 346q111 144 111 227z" />
+<glyph unicode="&#x1d49f;" horiz-adv-x="1715" d="M1756 819q0 -203 -84 -412q-169 -421 -545 -421q-112 0 -257 60q-189 -60 -296.5 -60t-187.5 25q-115 36 -115 110q0 103 194 103q155 0 369 -83q70 77 141 223l126 259q191 393 435 604q-100 94 -196 133.5t-231 39.5q-388 0 -592 -350q-106 -182 -106 -336 q0 -198 195 -198q199 0 333 207q119 182 119 392q0 34 -5 92h33q5 -57 5 -88q0 -221 -129 -416q-144 -218 -355 -218q-145 0 -235.5 96.5t-90.5 241.5q0 232 272 427q250 179 556 179q268 0 453 -180q80 67 183 111l13 -28q-105 -42 -164 -110q86 -108 124 -195t38 -208z M1711 757q0 248 -143 434q-62 -81 -110 -252l-95 -345q-54 -170 -142.5 -288t-259.5 -216q139 -65 227 -65q114 0 242 94t204.5 278.5t76.5 359.5zM770 86q-249 104 -357.5 104t-108.5 -70q0 -56 98 -84q69 -20 147 -20q116 0 221 70z" />
+<glyph unicode="&#x1d4a0;" horiz-adv-x="1204" d="M1429 1172q0 -100 -63.5 -183t-161.5 -83q-63 0 -102 45t-39 109q0 121 157 215l20 -22q-122 -103 -122 -220q0 -40 25.5 -69.5t65.5 -29.5q82 0 135 77.5t53 168.5t-61 155.5t-157 64.5q-140 0 -251.5 -125t-111.5 -267q0 -71 33 -137q31 1 68.5 1t98.5 -16 q87 -23 87 -66q0 -49 -79 -49q-100 0 -232 78q-168 -54 -275 -213.5t-107 -340.5q0 -252 261 -252q156 0 278 82t168 228q16 51 16 100t-35.5 92t-104.5 43t-141 -74q-116 -119 -120 -315h-31q-25 61 -25 123q0 126 86.5 215t212.5 89q81 0 136.5 -51.5t55.5 -131.5 q0 -148 -119 -275q-147 -157 -381 -157q-197 0 -334 107q-156 122 -156 312t190 321q151 103 370 139q-120 109 -120 244.5t132 236.5t346 101q146 0 233 -60q101 -70 101 -210zM1010 773q38 0 38 22t-47.5 34t-73.5 12t-55 -4q68 -64 138 -64z" />
+<glyph unicode="&#x1d4a1;" horiz-adv-x="1414" d="M1623 1225q-100 0 -284.5 77.5t-292.5 77.5q-168 0 -338 -100q-135 -79 -232.5 -201t-97.5 -257q0 -72 44 -123.5t115 -51.5q115 0 249 202q104 157 104 280q0 58 -28 127l31 7q70 -156 70 -277q0 -156 -117.5 -264.5t-274.5 -108.5q-99 0 -162.5 55t-63.5 152 q0 206 210 387q270 233 639 233q103 0 189 -16q274 -51 351 -51t146 60l24 -17q-126 -191 -281 -191zM1563 793q0 -47 -46 -94q-16 -15 -86 -68q-2 -165 -61 -261q-94 -15 -165 -34q75 118 130 260q-56 -18 -110 -23q-36 -145 -136 -280q-234 -314 -615 -314 q-181 0 -269.5 83t-88.5 186q0 77 51.5 133.5t128.5 56.5q48 0 88.5 -31.5t40.5 -85t-56 -83.5l-104 -39q-56 -23 -56 -63t63.5 -81.5t164.5 -41.5q157 0 271 130q69 79 159 269l69 146q-194 -29 -346 -178l-22 23q93 89 176 131t206 58q215 441 490 613l22 -22 q-59 -42 -89 -102t-65 -197l-74 -277q57 5 116 25q40 104 56 133q46 81 101.5 81t55.5 -53zM1528 791q0 23 -24 23q-48 0 -69 -141q93 67 93 118z" />
+<glyph unicode="&#x1d4a2;" horiz-adv-x="1462" d="M1202 56q-146 -81 -366 -81t-326 107q-76 77 -76 161.5t50.5 135.5t114.5 51t101.5 -30t37.5 -86.5t-53 -81.5l-100 -30q-53 -18 -53 -62q0 -63 103 -101q79 -29 156 -29q112 0 192 74q53 49 124 170l69 118q49 84 152 186q-186 -105 -318.5 -105t-253.5 131 q-63 -5 -87 -5q-160 0 -282 107.5t-122 265.5q0 185 171 318q139 108 343 154l6 -28q-162 -38 -264 -160q-150 -179 -150 -369q0 -122 87 -189.5t213 -67.5q34 0 63 4q-55 92 -55 205q0 233 204 409q231 199 494 199q79 0 133.5 -44.5t54.5 -122.5q0 -144 -165 -320 q-196 -209 -412 -295q-79 -32 -165 -52q44 -111 177.5 -111t281 83t267.5 193l21 -22q-78 -82 -110 -183q-6 -19 -46 -210.5t-212 -286.5zM1521 1291q0 43 -31 70.5t-75 27.5q-139 0 -317 -216q-136 -165 -220 -344q-50 -108 -60 -204q285 54 504 299q199 222 199 367z" />
+<glyph unicode="&#x1d4a3;" horiz-adv-x="1688" d="M2176 1284q0 -138 -187 -283q-130 -101 -312 -182l-165 -68q-257 -585 -257 -708q0 -31 40 -31q87 0 207 109t193 213l28 -17q-91 -123 -191 -211q-141 -124 -239 -124t-147 87q-39 70 -39 174t31 193.5t99 227.5q-108 -31 -209 -65q-141 -429 -480 -566 q-129 -52 -268 -52t-236 64q-112 74 -112 205q0 76 48.5 134.5t123.5 58.5q50 0 91.5 -30t41.5 -81.5t-45 -87.5q-13 -10 -108 -33q-70 -18 -70 -66q0 -62 98 -101q77 -31 151 -31q206 0 337 229q63 110 143 274q-185 -73 -358 -215l-19 23q174 149 394 229q169 348 361 576 q-169 -132 -210 -161q-160 -111 -231 -111q-40 0 -66 27t-26 67q0 62 64 149t64 92q0 18 -23 18q-127 0 -416 -354l-25 15q287 369 453 369q45 0 78 -32.5t33 -77.5q0 -69 -60.5 -146t-60.5 -84.5t21 -7.5q40 0 227 142l394 299l17 -21q-112 -110 -192 -316l-121 -353l-3 -8 l221 71q124 205 212 314q334 414 562 414q64 0 103.5 -42.5t39.5 -107.5zM2081 1248q29 60 29 91t-23.5 48t-50.5 17q-152 0 -291 -210q-88 -132 -214 -405q209 87 323 174q144 111 227 285z" />
+<glyph unicode="&#x1d4a4;" horiz-adv-x="1185" d="M1293 819q0 37 -12 106l31 3q13 -71 13 -108q0 -133 -91 -233.5t-226 -147.5q-154 -311 -459 -418q-128 -45 -261 -45t-230 65q-112 74 -112 204q0 80 51.5 137t130.5 57q51 0 87.5 -32.5t36.5 -90t-57 -84.5l-107 -31q-57 -19 -57 -64q0 -59 91 -97q73 -30 143 -30 q164 0 277 135q46 53 165 275q-134 35 -220.5 124.5t-86.5 220.5q0 211 226 381q166 125 418.5 205.5t507.5 83.5l1 -31q-139 0 -225 -113q-70 -92 -136 -286q-25 -76 -70 -238.5t-95 -286.5q115 48 190.5 136t75.5 203zM516 636q0 -152 205 -189l173 361q104 204 222.5 349 t290.5 240q-130 -17 -239 -45q-202 -52 -369.5 -206.5t-248.5 -353.5q-34 -84 -34 -156z" />
+<glyph unicode="&#x1d4a5;" horiz-adv-x="1089" d="M1109 32q0 -130 -138 -219q-106 -70 -256 -95l-1 30q137 25 209 68q155 93 155 218q0 80 -59 126t-142 50q-135 -255 -315 -428q-235 -224 -476 -224q-82 0 -126.5 62t-44.5 146q0 190 259 328q181 98 420 143l298 515q135 234 242 363q150 181 332 278 q-207 -13 -322 -48q-195 -59 -383.5 -222.5t-276.5 -347.5q-41 -86 -41 -144.5t38 -89t91.5 -30.5t108.5 31l16 -27q-62 -34 -119 -34q-100 0 -153.5 74t-53.5 178q0 426 693 627q224 65 558 70l1 -30q-143 0 -258 -139q-84 -102 -176 -309q-18 -41 -125.5 -310t-172.5 -403 q95 -9 156.5 -62t61.5 -145zM-25 -299q0 -48 32.5 -80.5t80.5 -32.5q146 0 488 614q-197 -37 -388 -181q-213 -160 -213 -320z" />
+<glyph unicode="&#x1d4a6;" horiz-adv-x="1674" d="M1418 454q0 -59 -16 -197.5t-16 -154.5q0 -41 23 -41q78 0 272 273l26 -17q-239 -328 -403 -328q-74 0 -120.5 53.5t-46.5 127.5t71.5 231.5t71.5 226.5q0 24 -19 55q-56 -24 -96.5 -24t-40.5 36q0 48 73 48q23 0 81 -18q77 31 128 101q29 39 79 145q205 430 589 463 l1 -30q-102 -7 -169 -46q-84 -49 -162 -189q-113 -201 -150 -248q-112 -143 -286 -216q110 -87 110 -251zM1118 1121q-314 -267 -429 -267q-39 0 -67 26.5t-28 64.5q0 61 64 149t64 91q0 20 -26 20q-123 0 -403 -352l-26 20q294 363 450 363q43 0 73 -27.5t30 -69.5 q0 -72 -59.5 -154t-59.5 -89t14 -7q55 0 271.5 165t358.5 325l26 -20q-139 -156 -215 -402l-145 -467q-98 -241 -289 -374t-429 -133q-144 0 -239 56q-117 69 -117 203q0 83 49.5 139t131.5 56q50 0 85.5 -32.5t35.5 -88.5t-57 -83l-106 -31q-57 -19 -57 -64q0 -64 100 -98 q74 -26 154 -26q144 0 246 100q83 82 210 361q172 379 389 646z" />
+<glyph unicode="&#x1d4a7;" horiz-adv-x="1465" d="M1744 1260q0 -162 -226 -385q-193 -190 -377 -278l-44 -21q-59 -165 -129.5 -268.5t-200.5 -198.5q173 -82 277 -82q202 0 428 307l26 -17q-250 -325 -480 -325q-106 0 -297 89q-164 -100 -360 -100q-91 0 -169 29q-106 39 -106 110.5t70 106.5q56 28 131 28 q129 0 342 -86q74 141 171 364q-34 -3 -57 -3q-162 0 -282.5 113.5t-120.5 274.5q0 217 240 373q215 139 444 139q80 0 173 -23l-9 -29q-86 20 -160 20q-238 0 -404 -168t-166 -394q0 -134 77 -204.5t212 -70.5q27 0 66 5q287 667 584 826q90 48 164 48t128.5 -51.5 t54.5 -128.5zM1658 1317q0 93 -103 93q-126 0 -227 -161q-73 -118 -139 -337l-81 -296q360 171 513 558q37 94 37 143zM287 225q-55 0 -112.5 -26t-57.5 -74q0 -60 92 -92q66 -22 142 -22q119 0 188 48q23 16 70 79q-199 87 -322 87z" />
+<glyph unicode="&#x1d4a8;" horiz-adv-x="2093" d="M2214 1341q109 87 142 87t33 -21.5t-47 -87.5t-125 -201.5t-129 -241.5q-347 -725 -347 -829q0 -31 29 -31q54 0 177 132q90 96 153 186l28 -17q-253 -337 -384 -337q-76 0 -117 72t-41 153q0 246 275 626q133 184 460 546q-373 -239 -846 -960l-164 -243 q-29 -43 -91 -123q-61 -69 -96.5 -69t-72 48.5t-36.5 147.5q0 243 229 617q112 182 397 556q-289 -247 -663 -750l-139 -187q-81 -106 -148 -178q-237 -254 -476 -254q-122 0 -207.5 63t-85.5 180q0 81 51.5 143.5t130.5 62.5q48 0 85.5 -32.5t37.5 -79.5q0 -64 -70 -100 l-99 -24q-60 -15 -60 -64q0 -62 84 -95q63 -24 137 -24q167 0 310 124q89 78 217 235l202 252q119 155 368 455q207 229 338 324q35 25 49 25q29 0 29 -23q0 -11 -13 -34q-158 -275 -350 -774l-118 -315q-27 -75 -74 -228q62 64 271 382q408 621 766 906z" />
+<glyph unicode="&#x1d4a9;" horiz-adv-x="1650" d="M2090 1109l-74 4q-51 0 -107 -55q-114 -112 -476 -764l-14 -196l-265 -121q43 582 79 793.5t92.5 336t158.5 256.5q-213 -162 -366 -409q-45 -72 -198 -339.5t-272 -400.5q-208 -232 -431 -232q-115 0 -199 63.5t-84 175.5q0 84 59 144t143 60q50 0 87.5 -34t37.5 -88 t-56 -85q-8 -5 -122 -18q-79 -9 -79 -67q0 -61 80 -95q62 -26 132 -26q145 0 260.5 94t324.5 409l285 449q182 285 402 442q45 32 60 32q21 0 21 -19q0 -13 -19 -51.5t-34 -103.5t-32 -279l-48 -611q22 42 201 342q44 76 138 223q192 282 325 282q62 0 62 -53q0 -59 -72 -59 z" />
+<glyph unicode="&#x1d4aa;" horiz-adv-x="1193" d="M1491 1265q0 -46 -30 -118l-33 11q27 61 27 105q0 71 -59.5 111.5t-133.5 40.5q-183 0 -382 -192q-144 -139 -276.5 -397t-192.5 -480q-36 -134 -36 -206q0 -131 135 -131q341 0 639 576q158 306 158 476q0 107 -99.5 107t-233.5 -144q-109 -117 -209.5 -322t-131.5 -367 q-7 -34 -20 -135h-32q23 292 208 615q219 383 420 383q80 0 118 -60t38 -144q0 -251 -250 -582q-327 -434 -603 -434q-158 0 -247 130q-77 114 -77 279q0 313 270 610q162 179 364 301q240 146 441 146q86 0 152 -46q76 -51 76 -133z" />
+<glyph unicode="&#x1d4ab;" horiz-adv-x="1455" d="M1633 1344q173 -128 173 -282t-134 -268q-112 -94 -273 -135q-51 -13 -146 -27q-91 -288 -231 -425q-233 -227 -543 -227q-178 0 -268 80.5t-90 186.5q0 81 51.5 137t131.5 56q48 0 88 -32.5t40 -79.5q0 -66 -57 -94l-107 -33q-57 -19 -57 -64q0 -59 87 -95 q69 -28 138 -28q146 0 251.5 105.5t283.5 495.5q-128 -12 -250 -97l-19 22q119 93 283 106q235 507 571 692q-103 71 -309 71t-440.5 -99.5t-356.5 -257.5q-87 -113 -87 -218q0 -72 42.5 -116.5t114.5 -44.5q154 0 326 221q127 163 131 359h26q16 -91 16 -163 q0 -194 -121 -330t-313 -136q-108 0 -181.5 52.5t-73.5 163.5t96 232q131 166 368.5 266t443 100t364.5 -75q75 39 162 62l6 -27q-86 -25 -137 -54zM1631 1161q0 79 -52 155q-120 -81 -188 -236q-31 -69 -69 -204l-59 -210q142 30 232 139q136 166 136 356z" />
+<glyph unicode="&#x1d4ac;" horiz-adv-x="1419" d="M1512 1056q0 -230 -249 -503q-188 -206 -448 -373q244 -81 327 -81q112 0 284 235l26 -17q-246 -339 -494 -339q-107 0 -313 100q-188 -97 -336 -97q-75 0 -129 27q-69 35 -69 109.5t98 122.5q79 39 170 39q134 0 370 -75q239 221 394 546q129 270 129 446 q0 203 -171 203q-180 0 -364.5 -114t-291 -274t-106.5 -294q0 -79 48.5 -129t135 -50t173.5 89t162 240t75 268q0 30 -9 90l29 6q49 -147 49 -266q0 -186 -134.5 -326t-319.5 -140q-107 0 -174 57.5t-67 163.5q0 144 114.5 311.5t305 283t373 115.5t297.5 -102t115 -272z M276 209q-133 0 -133 -101q0 -96 169 -96q138 0 290 85q-216 112 -326 112z" />
+<glyph unicode="&#x1d4ad;" horiz-adv-x="1828" d="M1943 1085q0 -103 -94 -200q-117 -122 -372 -183q104 -98 104 -235q0 -66 -35.5 -199.5t-35.5 -196.5q0 -35 23 -35q83 0 302 298l27 -17q-240 -341 -412 -341q-79 0 -130.5 51t-51.5 135.5t78 235.5t78 223q0 34 -20 69q-43 -6 -73 -6q-61 0 -61 31q0 42 63 42 q45 0 113 -32q120 15 206.5 153t86.5 265.5t-121 198.5q-111 -49 -176 -136q-100 -133 -186 -422q-26 -95 -89 -278q-60 -141 -158 -257q-226 -268 -581 -268q-144 0 -241 61q-115 72 -115 209q0 78 52.5 133.5t129.5 55.5q50 0 88.5 -34t38.5 -90.5t-57 -82.5l-107 -31 q-57 -18 -57 -64q0 -61 95 -98q74 -29 147 -29q159 0 275 128q79 87 218 381q51 108 160 318q209 365 528 522q-111 39 -261 39q-248 0 -506.5 -100t-406.5 -275q-103 -122 -103 -252q0 -68 40 -113.5t114.5 -45.5t169.5 70q252 185 273 517h30q14 -95 14 -172 q0 -196 -118 -328.5t-312 -132.5q-102 0 -173 53.5t-71 152.5q0 135 110 268q147 178 413.5 283t517.5 105q156 0 326 -44q89 31 154 48l7 -28q-62 -17 -116 -35q258 -99 258 -285z" />
+<glyph unicode="&#x1d4ae;" horiz-adv-x="1433" d="M1821 1255q0 -152 -215 -371q-179 -182 -436 -297q-69 -203 -166 -322q-231 -285 -585 -285q-137 0 -238 62q-119 72 -119 201q0 80 52 138t131 58q50 0 88.5 -35t38.5 -92t-56 -83l-105 -31q-56 -18 -56 -63q0 -58 86 -93q68 -27 136 -27q135 0 234 87q76 67 145 202 l107 231q-283 3 -404 212q-51 88 -51 178q0 209 242 371q215 144 449 144q79 0 169 -21l-4 -27q-101 17 -161 17q-190 0 -338 -115t-209 -299q-29 -87 -29 -166q0 -123 79.5 -193.5t204.5 -70.5q22 0 66 3q123 276 223 435q150 241 322 357q118 80 207 80t140.5 -54.5 t51.5 -130.5zM1738 1320q0 89 -96 89q-225 0 -378 -490q-31 -97 -85 -295q351 162 515 536q44 100 44 160z" />
+<glyph unicode="&#x1d4af;" horiz-adv-x="1298" d="M1612 1215q-90 0 -274 81.5t-329 81.5t-294 -88.5t-242 -198.5q-114 -135 -114 -263q0 -71 45 -124t115 -53q126 0 242.5 174.5t116.5 308.5q0 27 -15 94l26 9q63 -128 63 -243q0 -159 -114.5 -268.5t-274.5 -109.5q-104 0 -170 55.5t-66 169t104 248.5q265 344 751 344 q121 0 284 -34.5t256.5 -34.5t145.5 58l24 -18q-84 -189 -280 -189zM753 43q-156 -64 -305.5 -64t-247.5 65q-112 74 -112 206q0 78 50 134t127 56q49 0 89.5 -32.5t40.5 -79.5q0 -65 -57 -93l-107 -34q-57 -19 -57 -60q0 -59 95 -98q76 -31 146 -31q150 0 262 121 q73 79 159 254q65 140 208 403q174 278 386 404l15 -24q-70 -58 -119 -188q-19 -53 -72 -257.5t-122 -328.5q-142 -255 -379 -353z" />
+<glyph unicode="&#x1d4b0;" horiz-adv-x="1785" d="M1407 39q0 -19 21 -19q46 0 131 62q125 91 233 252l28 -17q-85 -119 -180 -208q-135 -125 -232 -125q-65 0 -103 55t-38 121.5t43 168.5q-121 -158 -183 -219q-131 -130 -230.5 -130t-148 81t-48.5 191t79 253q31 56 154 229t177 267q85 150 85 236t-85 127 q-64 31 -158 31q-266 0 -511 -237t-245 -456q0 -73 45 -122.5t118 -49.5q140 0 276 227t136 378q0 23 -10 89l31 4q46 -140 46 -257q0 -208 -151 -350q-133 -125 -298 -125q-100 0 -163 54t-63 153q0 169 136 343.5t303.5 276.5t339.5 102t288 -93t116 -257q0 -119 -79 -261 q-9 -16 -60 -92l-156 -227q-218 -316 -218 -433q0 -51 55 -51q39 0 98 30q150 77 354 393q31 48 209.5 344.5t310.5 481.5q107 11 243 16q-164 -238 -320 -515l-219 -391q-40 -68 -113 -205q-44 -91 -44 -126z" />
+<glyph unicode="&#x1d4b1;" horiz-adv-x="1381" d="M648 12q-86 -49 -105.5 -49t-19.5 18q0 3 47.5 83t75 253.5t42 245.5t40.5 144q84 231 322 483l-271 -202q-106 -72 -173 -72q-43 0 -75.5 26t-32.5 75.5t64 138.5t64 96q0 13 -22 13q-119 0 -412 -353l-25 18q99 129 203 226q153 142 248 142q45 0 75 -29t30 -82 t-58 -140.5t-58 -89.5q0 -11 17 -11q64 0 313 193q168 131 310 258l21 -18q-32 -43 -92 -133q-70 -114 -135 -378q-39 -157 -64 -234q-116 -355 -369 -608q259 137 549 486q23 27 251.5 335t395.5 441q107 85 256 129l6 -29q-184 -52 -356 -227q-97 -99 -242 -301l-197 -270 q-100 -131 -187 -224q-209 -224 -436 -354z" />
+<glyph unicode="&#x1d4b2;" horiz-adv-x="1958" d="M1523 11q-18 -35 -45 -35t-73.5 73.5t-46.5 226t70.5 297.5t244.5 392t232 347q-344 -432 -557 -654q-320 -333 -660 -554q-186 -121 -222 -121t-36 25q0 14 45 59q493 488 622 937q32 111 32 198q0 201 -205 201q-236 0 -482.5 -214t-246.5 -446q0 -81 47.5 -139 t127.5 -58q135 0 278.5 223t143.5 375q0 32 -9 95l28 6q48 -138 48 -258q0 -154 -85.5 -277.5t-230.5 -174.5q-71 -25 -137 -25q-110 0 -176.5 62.5t-66.5 171.5q0 182 156 364q134 158 306 244.5t335 86.5q264 0 364 -195q38 -74 38 -157q0 -358 -533 -793l-310 -253 q460 250 907 744q463 557 501 605.5t54 48.5q26 0 26 -22q0 -9 -128 -324.5t-171 -429.5q-129 -337 -193 -586q189 371 343 587q228 320 478 467l18 -25q-275 -159 -557 -589q-100 -153 -194 -338z" />
+<glyph unicode="&#x1d4b3;" horiz-adv-x="1593" d="M1902 1367q68 0 123 -36.5t55 -93t-33 -89.5t-76.5 -33t-73.5 25t-30 66t35.5 72t35.5 36q0 23 -38 23q-201 0 -436 -399q-294 -500 -294 -787q0 -130 80 -130q118 0 350 313l27 -18q-253 -325 -376 -325q-117 0 -117 182q0 155 70 331q-275 -354 -606 -475 q-129 -47 -234.5 -47t-186.5 56t-81 157q0 77 52 129.5t129 52.5q50 0 89.5 -30t39.5 -77.5t-32 -76t-79.5 -28.5t-87.5 39t-48 39q-30 0 -30 -55q0 -87 82 -135q68 -40 160 -40t171 40t165 130q187 196 349.5 494t162.5 522q0 204 -213 204q-173 0 -343 -116 q-151 -105 -255 -268.5t-104 -296.5q0 -75 47 -131.5t120 -56.5q51 0 92 21q93 48 207.5 236t114.5 345q0 41 -12 99l30 6q51 -162 51 -273q0 -191 -131.5 -331.5t-320.5 -140.5q-101 0 -165.5 63.5t-64.5 164.5q0 140 109 310t277 285t356.5 115t302.5 -141 q92 -114 92 -254q0 -60 -19 -144q135 211 232 318q139 154 280 154z" />
+<glyph unicode="&#x1d4b4;" horiz-adv-x="1448" d="M737 -24q-145 0 -249 61q-124 73 -124 209q0 80 52.5 134.5t131.5 54.5q53 0 91 -32t38 -90t-57 -86l-107 -33q-57 -20 -57 -60t55 -75q77 -49 192 -49q167 0 278 129q60 69 160 275l197 395q-111 -145 -179 -208q-125 -115 -236 -115q-72 0 -121 56t-49 129 q0 103 75 243q18 33 140 224q75 117 75 167q0 97 -181 97q-226 0 -420 -192q-76 -76 -135.5 -178t-59.5 -190q0 -121 106 -121q84 0 179 112q68 81 119.5 185.5t60.5 216.5h28q5 -62 5 -82q0 -166 -101 -308q-111 -157 -270 -157t-159 153q0 145 118 293.5t253 223.5 t269.5 75t231.5 -73t97 -199q0 -85 -41 -165q-5 -9 -128.5 -210t-123.5 -241q0 -29 41 -29q146 0 397 333l153 201q150 187 300 309l23 -19q-71 -80 -131.5 -182.5t-107.5 -275.5l-89 -332q-103 -319 -366 -474q-170 -100 -374 -100z" />
+<glyph unicode="&#x1d4b5;" horiz-adv-x="1411" d="M1836 1381q0 -80 -92.5 -186t-176.5 -148q-50 -25 -127 -39l-168 -213q-31 -43 -99 -125q-70 -76 -173 -157q174 -114 174 -282q0 -38 -9 -79q93 29 144.5 65.5t108.5 113.5l26 -17q-58 -84 -120 -125t-167 -71q-84 -241 -270.5 -400.5t-428.5 -159.5q-198 0 -198 185 q0 201 613 351q76 151 76 282q0 47 -20 88q-195 -124 -333 -124q-36 0 -67 19.5t-31 54.5q0 78 97 125q79 38 175 38t199 -48q119 93 170.5 149.5t256.5 328.5h-15q-83 0 -205 69l-236 134q-140 71 -253 71q-152 0 -245 -123.5t-93 -280.5q0 -61 18 -154l-32 -4 q-18 91 -18 157q0 236 167.5 392.5t404.5 156.5q269 0 462 -240q43 -53 58 -70t42 -32q101 151 146 205q115 140 189 140q50 0 50 -47zM1799 1372q0 24 -23 24q-52 0 -147 -117t-145 -204q16 -2 28 -2q73 0 180 113t107 186zM762 546q-69 0 -122 -21q-73 -28 -73 -86.5 t70 -58.5q96 0 276 109q-54 57 -151 57zM332 -278q0 -129 126 -129q102 0 236 186q89 124 163 281q-155 -41 -310 -123q-215 -113 -215 -215z" />
+<glyph unicode="&#x1d4b6;" horiz-adv-x="1044" d="M844 45q-77 -59 -147 -59t-109.5 38t-39.5 90t19 126q-170 -254 -333 -254q-83 0 -140.5 62t-57.5 142.5t35 168.5l-43 -56l-28 17q280 390 566 390q168 0 175 -120l53 86l252 35q-356 -596 -356 -668q0 -19 23 -19q78 0 189 121q32 34 149 187l28 -17l-119 -151 q-68 -82 -116 -119zM575 314q131 218 131 261t-25.5 67.5t-62.5 24.5q-81 0 -232 -227q-188 -282 -188 -376q0 -40 56 -40q77 0 183 111q80 82 138 179z" />
+<glyph unicode="&#x1d4b7;" horiz-adv-x="871" d="M273 48q0 -28 41 -28q115 0 287 173q-69 60 -69 153q0 139 118 287q65 82 126 82q73 0 73 -97q0 -180 -197 -417q18 -5 38 -5q57 0 109 46q23 20 79 92l27 -17q-59 -76 -91 -102q-58 -49 -124 -49q-30 0 -60 11q-194 -191 -341 -191q-76 0 -123.5 47t-47.5 123 q0 115 121 335q24 44 193 315q-48 -48 -100 -115l-99 -128l-206 -258l-27 17q68 91 263 328l287 351l228 367l233 19q-190 -288 -413 -669q-325 -556 -325 -670zM773 483q0 20 -16 36t-36 16q-59 0 -103.5 -73t-44.5 -138t50 -109q150 179 150 268z" />
+<glyph unicode="&#x1d4b8;" horiz-adv-x="746" d="M285 -14q-105 0 -177.5 66t-72.5 170q0 61 29 129l-36 -48l-28 17q278 390 558 390q81 0 143.5 -37.5t62.5 -113.5q0 -44 -28 -73t-67.5 -29t-68.5 25t-29 61q0 61 56 85q31 13 31 20q0 28 -50 28q-107 0 -244.5 -242t-137.5 -365q0 -46 65 -46q140 0 265 98 q79 62 197 211l26 -17q-129 -166 -208 -228q-128 -101 -286 -101z" />
+<glyph unicode="&#x1d4b9;" horiz-adv-x="1028" d="M680 39q0 -15 20 -15q74 0 186 123q34 37 149 187l27 -18l-149 -178q-63 -75 -116 -113.5t-120.5 -38.5t-107.5 38.5t-40 91.5t22 114q-173 -244 -346 -244q-82 0 -136.5 56t-54.5 134t42 166l-28 -37l-28 17q280 392 545 392q148 0 173 -148l389 640l249 9 q-676 -1040 -676 -1176zM570 324q114 170 116.5 185t2.5 45.5t-25 73t-68 42.5q-83 0 -254.5 -257.5t-171.5 -348.5q0 -39 43 -39q156 0 357 299z" />
+<glyph unicode="&#x1d4ba;" horiz-adv-x="744" d="M290 -14q-113 0 -188.5 63.5t-75.5 175.5q0 44 13 91l-11 -13l-28 17q18 30 52 35q69 144 164 221q166 134 356.5 134t190.5 -144q0 -69 -68 -136q-134 -132 -406 -132q-63 -139 -63 -225q0 -50 63 -50q139 0 265 98q89 68 197 211l27 -17q-126 -162 -206 -226 q-130 -103 -282 -103zM658 624q0 56 -61 56q-128 0 -295 -353q117 3 218 83q138 109 138 214z" />
+<glyph unicode="&#x1d4bb;" horiz-adv-x="609" d="M1096.5 1345.5q35.5 -29.5 35.5 -84t-52 -147.5q-143 -257 -612 -589q-75 -169 -235 -502q167 31 383 308l27 -18q-108 -140 -184 -205q-117 -101 -243 -120q-102 -226 -226 -430h-229q120 202 275 505q-44 41 -44 84.5t28 75.5t66 32q18 0 45 -8l101 203 q-153 -73 -206 -148l-26 18q59 87 252 176q148 291 318 521q263 358 444 358q47 0 82.5 -29.5zM1046 1310q0 34 -41 34q-97 0 -192 -136q-65 -93 -166 -303l-156 -325q211 151 319 291q142 182 210 352q26 65 26 87z" />
+<glyph unicode="&#x1d4bc;" horiz-adv-x="1004" d="M99 -442q-55 0 -100 26t-45 77q0 92 174 187q55 30 258 112l74 166q-125 -145 -247 -145q-80 0 -128 60.5t-48 139.5t38 181l-48 -59l-27 17q51 71 125 152q219 238 421 238q87 0 124 -54q24 -35 24 -69v-8l59 107l247 20q-231 -391 -370 -682q207 74 381 305l28 -17 q-194 -261 -427 -325q-76 -160 -207 -283q-155 -146 -306 -146zM659 575q0 97 -79 97q-94 0 -239 -259.5t-145 -368.5q0 -29 31 -29q79 0 161.5 79t135.5 169q135 231 135 312zM19 -356q0 -25 21.5 -41t46.5 -16q131 0 282 333q-350 -162 -350 -276z" />
+<glyph unicode="&#x1d4bd;" horiz-adv-x="1112" d="M754 -14q-68 0 -107.5 45.5t-39.5 129t70 203.5q38 65 118.5 167.5t80.5 124.5q0 15 -20 15q-97 0 -346 -291q-30 -34 -305 -384l-257 -10l496 834l-417 -515l-27 17q29 39 207 256l314 387q11 12 29 36l203 368l241 10l-687 -1189q423 525 564 525q61 0 94 -48t33 -112 q0 -96 -66 -217q-38 -69 -113 -170.5t-75 -119.5q0 -24 37 -24q74 0 188 124q34 36 150 186l26 -17q-58 -78 -183 -225q-103 -106 -208 -106z" />
+<glyph unicode="&#x1d4be;" horiz-adv-x="572" d="M738 1131.5q28 -29.5 28 -80.5t-40.5 -92t-91 -41t-79.5 29.5t-29 78.5t43 92t92 43t77 -29.5zM371 46q-77 -60 -148.5 -60t-110 44.5t-38.5 109.5q0 91 127 309l109 188q-112 -103 -282 -332l-28 17q175 231 331 378l263 13q-370 -592 -370 -671q0 -17 24 -17 q103 0 317 290l14 19l27 -18l-119 -151q-67 -81 -116 -119z" />
+<glyph unicode="&#x1d4bf;" horiz-adv-x="614" d="M773 1058q0 -56 -42 -97.5t-91 -41.5t-80 31.5t-31 80t42.5 89.5t98.5 41q103 0 103 -103zM-292 -442q-55 0 -100 26t-45 77q0 93 179 202q115 71 266 128l323 626q-164 -121 -304 -315l-27 17q144 207 354 352l256 29q-237 -393 -372 -677q110 20 217 118q63 58 166 190 l26 -18q-109 -141 -184 -206q-119 -104 -243 -119q-96 -203 -230.5 -316.5t-281.5 -113.5zM-372 -356q0 -25 21.5 -41t46.5 -16q127 0 289 358q-110 -52 -212 -126q-145 -105 -145 -175z" />
+<glyph unicode="&#x1d4c0;" horiz-adv-x="1026" d="M1006 1387q-188 -307 -793 -1383l-249 -16l480 832l-417 -515l-27 17q39 53 107 137l377 463q26 29 65 80l212 368zM649 -14q-174 0 -174 123q0 59 52.5 155t52.5 117t-10 35q-10 -2 -44.5 -15.5t-57 -13.5t-22.5 18q0 37 124 46q24 2 56 29l127 142q86 93 149 93 q46 0 87 -33t41 -74.5t-26.5 -69t-62 -27.5t-61.5 23t-26 53.5t23.5 58t23.5 28.5q0 8 -12 8q-47 0 -131.5 -104t-138.5 -138q124 -51 124 -156q0 -51 -33.5 -140t-33.5 -99q0 -20 23 -20q73 0 186 124q28 31 148 185l27 -17l-119 -151q-66 -81 -116 -120q-77 -60 -176 -60z " />
+<glyph unicode="&#x1d4c1;" horiz-adv-x="592" d="M298 170q-50 -99 -50 -122.5t20 -23.5q76 0 195 144l136 165l28 -17q-141 -178 -166 -204q-121 -126 -216 -126q-62 0 -100 40.5t-38 112t58 191t276 486.5l-413 -511l-28 17q94 127 232 292l265 317q65 80 171 249l118 190l232 17l-287 -463q-58 -92 -223 -380 q-73 -123 -210 -374z" />
+<glyph unicode="&#x1d4c2;" horiz-adv-x="1665" d="M1315 -14q-140 0 -140 163q0 101 56 213q11 22 98 144.5t87 144t-21 21.5q-57 0 -166 -105q-198 -190 -415 -560l-268 -14q89 137 206 354t117 290q0 22 -18 22q-116 0 -556 -649l-269 -16q363 556 363 663q0 12 -10 12q-75 0 -351 -366l-28 17q132 174 185 232 q144 158 233 158q58 0 91 -40t33 -110.5t-43 -164.5q-15 -32 -88 -160l135 180q79 100 146 171q117 124 217 124q60 0 91.5 -45.5t31.5 -108.5q0 -111 -102 -305q328 459 484 459q64 0 99.5 -50.5t35.5 -117.5q0 -127 -143 -342q-93 -140 -93 -155q0 -22 26 -22 q71 0 184 126l149 183l26 -17l-119 -151q-68 -82 -116 -119q-77 -59 -148 -59z" />
+<glyph unicode="&#x1d4c3;" horiz-adv-x="1187" d="M827 -14q-151 0 -151 173q0 95 67 209q34 58 112 158t78 125q0 16 -21 16q-162 0 -615 -652l-276 -30q370 551 370 665q0 18 -14 18q-75 0 -350 -365l-27 17l134 173q86 105 156 161t133 56q120 0 120 -131q0 -80 -50 -190q-19 -42 -93 -177q185 242 310.5 370t215.5 128 q64 0 99.5 -45t35.5 -115t-34 -158q-16 -41 -115.5 -187t-99.5 -164.5t33 -18.5q85 0 197 119q30 32 152 191l27 -17l-119 -151q-68 -83 -115 -119q-77 -59 -160 -59z" />
+<glyph unicode="&#x1d4c4;" horiz-adv-x="794" d="M541 132q7 -7 21 -7q77 0 239 207l28 -17q-85 -108 -123 -144q-85 -80 -164 -80q-20 0 -38 5q-127 -110 -231.5 -110t-169 68.5t-64.5 169.5q0 56 33 139l-45 -60l-27 17q280 390 550 390q197 0 197 -187q0 -183 -206 -391zM678 565q0 109 -81 109q-106 0 -237 -241.5 t-131 -363.5q0 -47 55 -47q90 0 187 91q-11 17 -11 35q0 59 63 59q7 0 15 -2q140 221 140 360z" />
+<glyph unicode="&#x1d4c5;" horiz-adv-x="1079" d="M727 -17q-147 0 -147 158q0 109 68 226q34 56 115 157t81 133q0 13 -18 13q-57 0 -148 -84t-350 -367l-78 -85l-328 -576h-233l750 1256l-413 -512l-26 18q82 110 278 348l271 332l118 199h192l-529 -926q103 115 317 335q113 105 190 105q60 0 95 -50t35 -112 q0 -92 -67 -212q-35 -62 -113 -169.5t-78 -130.5q0 -20 31 -20q81 0 195 122q38 41 151 191l26 -18q-164 -232 -272 -299q-51 -32 -113 -32z" />
+<glyph unicode="&#x1d4c6;" horiz-adv-x="964" d="M688 -154q0 -122 -63.5 -205t-181.5 -83q-136 0 -136 143.5t132 389.5q-127 -110 -216 -110t-138 63t-49 141.5t36 174.5l-45 -60l-27 17q279 393 551 393q145 0 159 -133l61 105l245 22l-376 -658q134 29 331 283l28 -17q-189 -246 -342 -297q31 -83 31 -169zM676 578 q0 39 -22 67t-60 28q-95 0 -244.5 -253.5t-149.5 -370.5q0 -35 35 -35q65 0 152.5 74.5t155.5 188.5q133 225 133 301zM613 -318q42 74 42 165t-31 172q-180 -337 -180 -400q0 -26 28 -26q91 0 141 89z" />
+<glyph unicode="&#x1d4c7;" horiz-adv-x="774" d="M574.5 45.5q-76.5 -59.5 -149.5 -59.5t-115.5 49t-42.5 115q0 107 108.5 284.5t108.5 197.5q0 14 -112 71l-194 -207q-51 -60 -150 -192l-28 17q53 74 168 211l177 188q-23 25 -23 53t25 54t52 26q37 0 37 -36q0 -24 -43 -90l125 -57q84 -38 112 -64.5t28 -69.5t-27 -101 l-51 -94q-145 -278 -145 -297.5t18 -19.5q97 0 328 309l28 -17l-15 -20q-143 -191 -219.5 -250.5z" />
+<glyph unicode="&#x1d4c8;" horiz-adv-x="680" d="M253 -14q-101 0 -178 52.5t-77 152.5t94 100q37 0 66 -25t29 -67.5t-53 -72t-53 -39.5q0 -19 22 -31t42 -12q75 0 163 171q75 145 75 310q0 28 -7 88q-6 52 -6 83v8q-207 -222 -342 -400l-28 17q116 154 371 434q19 116 97 116q26 0 26 -18.5t-87 -111.5q-1 -15 -1 -16 q0 -40 80 -181t80 -244q0 -75 -35 -154q45 41 156 187l27 -17q-122 -165 -192 -225q-123 -105 -269 -105z" />
+<glyph unicode="&#x1d4c9;" horiz-adv-x="611" d="M254 47q0 -23 32 -23q70 0 185 126q29 32 147 184l27 -17q-153 -192 -166 -206q-119 -126 -215 -126q-65 0 -107 46.5t-42 123.5t83 229l246 437l-417 -516l-27 17q75 101 266 332l284 347l51 79q71 110 127 186l226 18l-186 -300h192l1 -35h-217q-490 -816 -490 -902z " />
+<glyph unicode="&#x1d4ca;" horiz-adv-x="1098" d="M897 45q-77 -59 -148.5 -59t-111.5 40.5t-40 110.5t57 192l98 190q-190 -283 -331 -421q-112 -110 -199 -110q-59 0 -97.5 41.5t-38.5 101.5q0 127 224 503q-108 -97 -282 -331l-28 17q56 75 174 219q49 54 157 157l262 16q-95 -155 -271 -472q-86 -172 -86 -193.5 t23 -21.5q53 0 199.5 157.5t374.5 515.5l270 14l-163 -280q-94 -165 -141 -270t-47 -122t20 -17q72 0 185 124q33 36 148 185l27 -17l-119 -151q-68 -82 -116 -119z" />
+<glyph unicode="&#x1d4cb;" horiz-adv-x="943" d="M762 166q-31 0 -61 11q-189 -191 -330 -191q-91 0 -141 54t-50 142.5t58 201.5q33 62 100 160t67 117q0 7 -16 7q-85 0 -361 -365l-28 17q98 129 134 173q85 103 155 160t133 57q119 0 119 -152q0 -113 -107 -298.5t-107 -207.5q0 -34 51 -34q114 0 295 174 q-71 46 -71 150q0 154 116 288q69 80 128 80q76 0 76 -100t-65 -217q-37 -67 -133 -192q20 -5 37 -5q57 0 109 45q25 22 80 91l26 -17q-58 -74 -91 -101q-57 -48 -123 -48zM864 508q0 34 -35 34q-66 0 -128 -77t-62 -144t53 -105q172 205 172 292z" />
+<glyph unicode="&#x1d4cc;" horiz-adv-x="1354" d="M1188 173q-32 0 -65 12q-181 -199 -326 -199q-78 0 -128.5 57.5t-50.5 136.5q0 106 105 308l-169 -232q-105 -138 -182 -198t-143 -60t-102.5 43t-36.5 107q0 124 219 486q-108 -98 -282 -331l-27 17q56 75 173 219q52 59 157 157l270 15q-204 -294 -333 -562 q-38 -79 -38 -98t24 -19q143 0 569 664l272 15q-75 -106 -208.5 -353t-133.5 -313q0 -27 45 -27q123 0 299 186q-54 45 -54 142q0 137 95 272q77 109 146 109q74 0 74 -93q0 -163 -213 -424q21 -7 43 -7q71 0 174 129l27 -17q-56 -72 -85 -96q-54 -46 -115 -46zM1289 525 q0 33 -33 33q-50 0 -111.5 -74.5t-61.5 -167.5q0 -55 34 -88q51 58 111.5 154t60.5 143z" />
+<glyph unicode="&#x1d4cd;" horiz-adv-x="902" d="M953 610q0 -86 -88 -86q-58 0 -81 48q-1 3 -6.5 33t-13.5 30q-25 0 -83 -91.5t-86 -149.5v-20q0 -65 -26 -174.5t-26 -136.5q0 -40 34 -40q70 0 184 125q36 39 148 184l26 -17l-14 -19q-136 -185 -214.5 -247.5t-154.5 -62.5q-154 0 -200 267q-144 -267 -262 -267 q-45 0 -79.5 30.5t-34.5 75.5q0 93 96 93q57 0 82 -47.5t34 -47.5q40 0 160 226q8 100 29.5 206.5t21.5 126t-22 19.5q-75 0 -351 -365l-26 17q133 176 186 234q143 156 236 156q134 0 169 -244q136 244 255 244q45 0 76 -27.5t31 -72.5z" />
+<glyph unicode="&#x1d4ce;" horiz-adv-x="1122" d="M216 -442q-55 0 -100 26t-45 77q0 92 171 187q60 32 256 112l222 454q-140 -194 -193 -255q-155 -178 -252 -178q-65 0 -99 49t-34 116q0 106 71 230q45 78 124 172.5t79 107.5t-21 13q-89 0 -367 -369l-28 17q296 393 412 393q57 0 90.5 -46.5t33.5 -106.5 q0 -90 -70 -215q-39 -69 -120 -180.5t-81 -131.5q0 -16 22 -16q111 0 436 458q45 64 132 215l256 19q-68 -114 -195 -345l-174 -347q24 8 71 25q135 56 316 290l27 -17q-200 -257 -367 -315l-67 -22q-220 -417 -506 -417zM136 -356q0 -25 21.5 -41t46.5 -16q127 0 277 333 q-345 -160 -345 -276z" />
+<glyph unicode="&#x1d4cf;" horiz-adv-x="880" d="M892 710q37 0 37 -38.5t-48 -102.5q-73 -97 -218 -174q-97 -159 -196 -232q96 -40 122 -99q121 36 298 265l27 -18q-185 -238 -311 -277q18 -55 18 -107q0 -162 -137 -265.5t-305 -103.5q-37 0 -62 32.5t-25 70.5q0 103 143 221q115 94 239 144q7 27 7 47q0 45 -35 72 q-77 -56 -102 -69q-57 -31 -117.5 -31t-60.5 48q0 43 74 69q56 19 104 19t94 -8q96 76 179 212q-84 -23 -144.5 -23t-108 32.5t-47.5 86.5t33.5 115.5t33.5 66.5t-6 5q-74 0 -352 -368l-26 18l156 201q158 191 266.5 191t108.5 -105q0 -53 -44.5 -120t-44.5 -73 q0 -18 54 -18t137 19q183 297 259 297zM142 -340q0 -65 37 -65q74 0 174 163q74 122 112 234q-323 -181 -323 -332z" />
+<glyph unicode="&#x1d4d0;" horiz-adv-x="1567" d="M1551 70q0 -25 -53 -58q-116 -71 -189.5 -71t-97.5 65q-43 119 -61 318h-400q-126 0 -133 2q-282 -424 -403 -424q-65 0 -122.5 49t-57.5 113q0 31 23 92t48 61l5 -1q5 -3 9 -19q11 -47 57.5 -80.5t96.5 -33.5q90 0 334 360q289 426 495 868h11v12q0 29 58.5 63t82.5 34 t28 -13q-1 3 -1 -89q0 -983 97 -1222q19 -46 59 -46q9 0 42.5 16t52.5 16t19 -12zM759 433h381q-29 366 -29 753q-190 -398 -445 -789q48 36 93 36z" />
+<glyph unicode="&#x1d4d1;" horiz-adv-x="1309" d="M706 694l-100 -10q-18 0 -18 13q0 27 69 68q19 11 151.5 58t169.5 67q161 86 161 217q0 81 -58.5 126.5t-141.5 45.5q-341 0 -558 -833q-70 -268 -157 -405q-19 -30 -65.5 -57.5t-72.5 -27.5t-26 9.5t3 15.5q109 223 151 389q107 429 171 885q-85 -48 -111 -48t-26 12 q0 31 126.5 99.5t165.5 68.5q19 0 19 -14q0 -6 -11 -83l-34 -213q232 310 554 310q97 0 168 -52t71 -145q0 -223 -387 -394q135 -23 223.5 -107.5t88.5 -216.5q0 -223 -241 -378q-213 -137 -449 -137q-77 0 -169 36.5t-116 97.5q2 28 60 63t80 35t35 -15l25 -28 q87 -81 217 -81q168 0 279 79.5t111 231.5t-106.5 235t-251.5 83z" />
+<glyph unicode="&#x1d4d2;" horiz-adv-x="1049" d="M1124 1264q0 -49 -39.5 -147t-67 -137.5t-73 -66.5t-71.5 -27t-26 13l55 113q55 114 55 167q0 99 -113 99q-401 0 -546 -569q-30 -117 -30 -229q0 -178 78 -291q90 -129 261 -129q140 0 238 121l42 59q21 29 67 56t71.5 27t25.5 -10t-4 -16q-90 -145 -253 -245t-337 -100 t-272 135q-86 119 -86 309q0 119 31 237q85 323 295 528q233 227 549 227q150 0 150 -124z" />
+<glyph unicode="&#x1d4d3;" horiz-adv-x="1442" d="M1304 1248q202 -117 202 -364.5t-183 -461.5q-164 -193 -425 -307.5t-506 -114.5h-219q-18 0 -18 12q0 47 121 93q225 554 270 1130q-241 -4 -312 -120q-7 -21 -24 -61q-17 -31 -66 -62t-75.5 -31t-27.5 11q24 60 53 115q82 119 260 187.5t342 68.5h185q260 0 423 -95z M1338 804q0 228 -190 340q-154 91 -399 91h-42q-57 -563 -294 -1127h108q278 0 494 135q236 148 302 404q21 82 21 157z" />
+<glyph unicode="&#x1d4d4;" horiz-adv-x="1068" d="M1144 1256q0 -103 -102 -163q-50 -29 -74 -29t-24 13q0 3 16 36t16 58q0 107 -182 107q-246 0 -297 -205q-7 -28 -7 -55q0 -114 116 -175q93 -49 218 -49q19 0 19 -13q0 -27 -60 -62t-91 -35q-155 0 -271.5 -96t-152.5 -248q-7 -29 -7 -56q0 -107 98 -167 q83 -52 190.5 -52t170.5 41.5t133 135.5q22 29 68.5 55t71 26t24.5 -12q0 -5 -6 -14q-94 -142 -259 -241t-328 -99q-128 0 -222 56q-111 66 -111 186q0 29 9 64q35 139 149.5 259.5t255.5 190.5q-183 65 -183 220q0 183 215 326q194 129 387 129q220 0 220 -132z" />
+<glyph unicode="&#x1d4d5;" horiz-adv-x="1504" d="M1611 1269q0 -14 -3 -23q-9 -28 -63 -60t-78 -32t-25 11q1 -9 1 22q0 48 -124 48h-360q-60 -268 -153 -531h489q20 0 20 -10q0 -39 -57 -78.5t-98 -39.5q-21 0 -18 20h-378q-97 -248 -200 -448q-60 -115 -201 -184q-37 -18 -59 -18q-6 0 -11 1q-23 -12 -43 -12 q-181 0 -233 153q0 1 -1 4q0 28 59.5 62.5t90.5 34.5q15 0 24 -19l17 -36q54 -86 169 -89q9 10 24 39q295 584 407 1151q-234 -5 -307 -116q-7 -11 -28 -65q-11 -30 -63.5 -61.5t-78.5 -31.5t-26 16q0 29 39 90q83 130 262.5 203t353.5 73h494q158 0 158 -74z" />
+<glyph unicode="&#x1d4d6;" horiz-adv-x="1146" d="M1228 1256q0 -48 -46 -128q-117 -199 -229 -199q-19 0 -19 14q0 4 63 92.5t63 135.5q0 107 -210 107q-403 0 -526 -480q-23 -90 -23 -179q0 -155 71 -257q82 -118 230 -118q107 0 198 73.5t142 179.5q15 46 49 136q12 31 63 62t77.5 31t26.5 -17q0 -21 -57 -227 q-198 -716 -632 -716q-190 0 -315 86q-5 3 -5 10q0 29 58 63t90 34q7 0 14 -4q144 -81 291 -81q164 0 300 439q-206 -180 -427 -180q-169 0 -255.5 114t-86.5 289q0 99 24 188q78 289 303 476.5t519 187.5q249 0 249 -132z" />
+<glyph unicode="&#x1d4d7;" horiz-adv-x="1582" d="M1609 1331q0 -6 -3 -12q-162 -325 -239 -555q-107 -318 -107 -592q0 -156 88 -156q45 5 47 6t11.5 30t64 61t80 32t25.5 -12l-2 -5q-30 -90 -142.5 -155t-206 -65t-119.5 69q-15 39 -15 143q0 230 116 586q-40 -22 -67 -22h-532q-64 -232 -152 -475q-18 -56 -62 -164 q-14 -29 -64 -58.5t-76 -29.5t-26 10q0 4 2 9q141 350 244 763q66 266 66 410q0 36 -24 61t-60 25q-171 0 -222 -111q-7 -24 -24 -70q-13 -30 -66.5 -61.5t-77.5 -31.5t-25 11q26 66 47 109q73 122 211.5 192t287.5 70q122 0 122 -110q0 -144 -78 -460q39 21 67 21h540 q116 316 207 465q17 29 65 57t73.5 28t25.5 -13z" />
+<glyph unicode="&#x1d4d8;" horiz-adv-x="1213" d="M1300 1331q0 -28 -57.5 -62t-91.5 -34h-235q-69 -61 -186 -526q-61 -242 -91 -321q-66 -178 -175 -280h357q36 0 46 9t24.5 43.5t65 65t77.5 30.5t28 -11q-44 -110 -161.5 -177.5t-235.5 -67.5h-647q-17 0 -17 12q0 29 69 69q46 27 80 27h175q82 0 172 284q18 57 98 378 t216 465h-192q-250 0 -310 -57q-17 -16 -37 -65q-13 -31 -64 -62t-74.5 -31t-28.5 6v10q0 38 46 103q145 204 642 204h489q18 0 18 -12z" />
+<glyph unicode="&#x1d4d9;" horiz-adv-x="1454" d="M1559 1332q0 -29 -57.5 -63t-89.5 -34q-134 0 -274 -398q-31 -87 -152 -531q-59 -214 -248.5 -377t-405.5 -163q-140 0 -236 80t-96 217q0 64 14 93t65 59.5t76 30.5t26 -11q-13 -22 -13 -86q0 -123 84.5 -199t212.5 -76t230 116q86 98 124 240l55 227q148 580 382 778 h-272q-241 0 -344 -192l-39 -99q-13 -32 -63 -62.5t-77.5 -30.5t-27.5 12q0 1 1 4q60 200 263.5 338t418.5 138h425q18 0 18 -11z" />
+<glyph unicode="&#x1d4da;" horiz-adv-x="1345" d="M1319 1189l5 34q0 81 -67 81q-103 0 -366.5 -173t-292.5 -266q-3 -10 -3 -27q0 -147 165.5 -473t289.5 -326q168 0 237 109q8 19 26 58q30 61 92 61q25 0 25 -16q0 -4 -1 -7q-35 -128 -171.5 -207.5t-278.5 -79.5q-152 0 -334 346q-167 318 -167 492q0 92 168 232.5 t378 250.5t303 110q114 0 114 -117q0 -57 -49 -87q-28 -17 -50.5 -17t-22.5 22zM559 1375q0 -218 -75.5 -519t-164.5 -562q-29 -90 -92 -249q-14 -29 -65 -59t-77 -30t-26 12q0 6 15 46l73 198q219 623 240 1043q-102 -48 -120.5 -48t-18.5 12q0 33 127.5 100.5t164.5 67.5 q19 0 19 -12z" />
+<glyph unicode="&#x1d4db;" horiz-adv-x="1148" d="M1230 276q0 -1 -1 -4q-37 -123 -165.5 -219t-244.5 -96t-313.5 56t-300.5 56q-94 -113 -183 -113q-19 0 -19 11t76 96q120 133 184 385q24 103 82 306q209 634 653 634q78 0 120 -52.5t42 -119.5t-10.5 -97.5t-74.5 -67t-90.5 -36.5t-27.5 9q11 28 11 85.5t-33 107 t-96 49.5q-138 0 -257 -300q-52 -131 -128 -426q-53 -205 -160 -360q36 9 68 9q104 0 304 -56t304 -56q29 0 47 39l23 63q11 32 74 69.5t89.5 37.5t26.5 -10z" />
+<glyph unicode="&#x1d4dc;" horiz-adv-x="2115" d="M2147 70q0 -37 -94 -82t-138 -45q-77 0 -93 70q-9 41 -9 134q0 300 97 873l-529 -615q-180 -201 -319 -328q-11 -10 -19.5 -10t-14.5 8q-172 243 -317 1032q-68 -316 -187 -635q-213 -570 -345 -570q-48 0 -111.5 27.5t-63.5 64.5t23.5 95.5t49.5 60.5q77 -67 156 -67 q61 0 143 175q27 58 111 284q113 303 175 681q3 28 13 81q8 30 51.5 56.5t75.5 26.5q20 0 28 -38l6 -57q17 -102 36 -197q114 -573 238 -834q153 145 318 332l617 724q57 70 67 70q14 0 14 -21.5t-15 -83.5t-56.5 -321.5t-57.5 -441.5t-16 -279.5t9 -137.5q11 -50 53 -51 q51 32 77.5 32t26.5 -13z" />
+<glyph unicode="&#x1d4dd;" horiz-adv-x="1859" d="M1977 1523q15 0 15 -31t-24 -90t-50 -59q-199 0 -290 -80l1 -1l-94 -318q-122 -442 -229 -914l-2 6q-5 -29 -48 -56.5t-74 -27.5q-17 0 -70 84q-98 156 -167 326q-143 354 -272 775q-58 -340 -167 -694q-166 -541 -314 -541q-48 0 -113.5 26.5t-65.5 67.5q0 32 23.5 93 t49.5 61q-8 0 51 -33.5t113.5 -33.5t112.5 134q19 42 65 186q151 465 196 901q3 28 48 55.5t68 27.5t27 -10l27 -94q126 -426 294 -842q73 -180 171 -333q269 1196 395 1318q101 97 323 97z" />
+<glyph unicode="&#x1d4de;" horiz-adv-x="1467" d="M1532 949q0 -123 -31 -240q-80 -299 -347 -525.5t-569 -226.5q-222 0 -344 149.5t-122 376.5q0 270 161 507.5t411 367.5q54 28 76.5 28t22.5 -11q0 -20 -58 -59l-102 -69q-160 -120 -251.5 -300.5t-91.5 -385.5t111.5 -350.5t325 -145.5t382.5 169.5t228 398.5 q30 117 30 231q0 171 -69 282q-83 132 -241 132t-281 -259q-9 -25 -32 -72q-18 -31 -65.5 -60t-74.5 -29t-27 13q0 5 1 7q78 204 233 347q176 163 364.5 163t280.5 -135q79 -116 79 -304z" />
+<glyph unicode="&#x1d4df;" horiz-adv-x="1346" d="M1442 1032q0 -36 -11 -79q-60 -234 -317 -392t-512 -158q-19 0 -19 12q0 29 58 62.5t90 33.5q191 0 340.5 94.5t192.5 270.5q10 41 10 71q0 151 -167 229q-128 59 -299 59h-102q-50 -452 -207 -924q-39 -124 -120 -321q-17 -30 -65.5 -59t-74.5 -29t-26 10q0 2 3 9 q272 675 330 1314q-234 -4 -305 -111l-31 -70q-14 -30 -65 -61.5t-77 -31.5t-27 11q24 60 53 115q83 119 260 187.5t342 68.5h244q187 0 323 -63q179 -83 179 -248z" />
+<glyph unicode="&#x1d4e0;" horiz-adv-x="1499" d="M1360.5 25q47.5 30 75.5 30t28 -17.5t-27 -62.5q-55 -91 -169 -156t-220 -65q-148 0 -425 95.5t-425 95.5q-17 0 -17 14q0 27 59.5 61.5t89.5 34.5h26q290 0 424 47q216 76 353.5 281t137.5 437q0 192 -103.5 325t-290.5 133q-228 0 -398.5 -198.5t-170.5 -429.5 q0 -144 81 -241.5t222 -97.5q94 0 172 39.5t99.5 39.5t21.5 -13q0 -22 -66 -64q-177 -112 -346.5 -112t-260.5 102t-91 261q0 304 280 564t589 260q204 0 317 -137t113 -346q0 -319 -235 -577q-213 -233 -536 -338l251 -84q145 -43 260 -43q62 0 82 25l36 75q16 32 63.5 62z " />
+<glyph unicode="&#x1d4e1;" horiz-adv-x="1560" d="M1647 243q0 -6 -5 -13q-78 -115 -206.5 -194t-259.5 -79q-100 0 -182 150l-129 280q-76 150 -158 150q-18 0 -18 12q0 26 60.5 62t89.5 36q155 0 271.5 74t151.5 217q11 46 11 76q0 221 -475 221h-92q-43 -431 -196 -884q-35 -109 -116 -306q-16 -30 -65 -59t-75 -29 t-26 10q0 4 2 9q262 625 316 1259q-242 -5 -310 -119q-8 -21 -24.5 -56.5t-67 -67t-76.5 -31.5t-27 11q24 60 53 115q84 120 260.5 188t341.5 68h233q512 0 512 -246q0 -171 -160 -322q-135 -127 -320 -191q50 -56 99 -166l95 -214q75 -139 152 -139q89 0 139 58 q75 89 113 111t63 22t25 -13z" />
+<glyph unicode="&#x1d4e2;" horiz-adv-x="1248" d="M1270 1198q0 -102 -83 -150q-50 -29 -74.5 -29t-24.5 17q0 1 7 30.5t7 45.5q0 69 -52 105q-89 61 -226 61q-222 0 -265 -175q-7 -28 -7 -54q0 -151 238 -259q157 -71 226 -126q118 -95 118 -217q0 -210 -249 -359q-218 -131 -444 -131q-253 0 -364 176q-32 51 -32 110 q0 157 154 247q46 27 72 27t26 -12q0 -22 -49 -55q-34 -64 -34 -120t28 -100q106 -165 328 -165q329 0 387 234q9 36 9 64q0 113 -114 203q-66 52 -215 120q-253 116 -253 284t205 300q183 118 352.5 118t268.5 -67q60 -41 60 -123z" />
+<glyph unicode="&#x1d4e3;" horiz-adv-x="1463" d="M1568 1400q0 -29 -54 -73q-85 -69 -164.5 -86.5t-364.5 -17.5q-44 -110 -110.5 -381t-115.5 -399q-82 -211 -204 -321h280q17 0 17 -11q0 -27 -71 -69t-102 -42h-439q-17 0 -17 11q0 29 71.5 70t104.5 41q123 0 252 503q77 302 80 312q62 220 108 286h-428 q-88 0 -148 -164q-5 -18 -17.5 -51.5t-76.5 -71t-99 -37.5q-11 0 -15 5v10q0 24 39 99q74 141 200.5 235.5t273.5 94.5h708q97 0 140 6q91 62 135 62q17 0 17 -11z" />
+<glyph unicode="&#x1d4e4;" horiz-adv-x="1337" d="M1329.5 1314.5q49.5 29.5 76 29.5t26.5 -8t-87.5 -248t-201.5 -694q-43 -171 -43 -289q0 -42 40 -52q47 29 73.5 29t26.5 -12q0 -35 -90.5 -80t-129.5 -45q-89 0 -89 72q0 124 39 289q11 47 78 283q-174 -245 -352 -405q-253 -227 -461 -227q-97 0 -144 66.5t-47 167.5 q0 130 120 414l122 282q81 200 81 274t-56 74q-51 0 -107 -34t-81.5 -34t-25.5 13q0 20 45 53q149 110 302 110q97 0 97 -92q0 -79 -80 -271l-121 -272q-128 -299 -128 -432q0 -85 37.5 -148t117.5 -63q125 0 349 252q154 173 286 377.5t187 341.5q21 75 76 219 q15 30 64.5 59.5z" />
+<glyph unicode="&#x1d4e5;" horiz-adv-x="1214" d="M1301 1116q0 -54 -16 -114q-127 -477 -776 -996q-7 -28 -49.5 -55t-65 -27t-25.5 5.5t-4 10.5v7q0 9 8.5 43t27.5 211t19 349q0 696 -328 696q-21 0 -21 14q0 26 49 54.5t77 28.5q368 0 368 -717q0 -215 -32 -459q214 173 392 366q239 259 286 433q3 11 3 29 q0 73 -50 120t-124 47q-14 0 -14 31t23.5 90.5t49.5 59.5q96 0 149 -64.5t53 -162.5z" />
+<glyph unicode="&#x1d4e6;" horiz-adv-x="2033" d="M2041 1137q0 -360 -542 -1042q-147 -185 -163 -185t-17 30q-23 668 -186 1199q-264 -519 -628 -991l-179 -221q-15 -17 -29 -17q-10 0 -10 26.5t15 73.5q94 295 94 644q0 592 -304 592q-21 0 -21 14q0 26 49 54.5t77 28.5q326 0 326 -594q0 -223 -45 -501 q370 470 625 975q-11 33 -11 38q0 25 47.5 53.5t75.5 28.5q21 0 32 -34t19 -63q166 -553 193 -1067q162 196 298 403q197 301 197 431q0 149 -127 149q-13 0 -13 30.5t22.5 90.5t48.5 60q80 0 118 -60.5t38 -145.5z" />
+<glyph unicode="&#x1d4e7;" horiz-adv-x="1418" d="M1519 1234q0 -32 -6 -54q-33 -123 -604 -465l35 -371q22 -236 130 -236q132 96 172 96q13 0 17 -7q-20 -88 -121 -142.5t-197 -54.5t-135 88q-24 52 -35 170l-33 359q-240 -142 -296 -178q-226 -145 -241 -199q-6 -22 -6 -46q0 -86 59 -86q19 0 19 -11q0 -28 -58.5 -62.5 t-90.5 -34.5q-97 0 -97 108q0 29 7 55q36 132 698 520l-32 315q-23 237 -129 237l-81 -61q-52 -35 -92 -35q-18 0 -18 15.5t21 49.5q39 62 129.5 100.5t177.5 38.5t126 -89q23 -51 35 -169l30 -303q181 108 246 151q186 123 198 175q4 17 4 40q0 87 -61 87q-17 0 -17 12 q0 28 59 62t90 34q97 0 97 -109z" />
+<glyph unicode="&#x1d4e8;" horiz-adv-x="1397" d="M1410 1117q0 -53 -14 -108q-122 -485 -604 -950q-109 -105 -228 -195q-172 -129 -251 -129q-208 0 -250 210q-1 5 -1 22.5t20 63t44 45.5q9 0 13 -21q35 -171 219 -171q86 0 297 173q12 142 12 304q0 885 -393 885q-16 -25 -52.5 -46t-62 -21t-25.5 13q0 8 10 21 q42 54 109.5 92t131.5 38q258 0 362 -349q65 -218 65 -560q0 -120 -8 -243q170 167 326 390q201 288 201 446q0 73 -46.5 119.5t-119.5 46.5q-16 0 -16 30t19 75t43 45q94 0 146.5 -65t52.5 -161z" />
+<glyph unicode="&#x1d4e9;" horiz-adv-x="1348" d="M1444 1332q0 -6 -12 -21q-202 -250 -491 -536q165 -3 165 -64q0 -28 -33.5 -51.5t-62.5 -23.5q-21 0 -21 26.5t-135 27.5q-294 -284 -574 -523q43 8 118.5 8t294.5 -26.5t330 -26.5q7 0 19 9q38 28 56 77l33 94q13 32 77 69.5t89.5 37.5t26.5 -10q-197 -399 -458 -399 q-111 0 -330 27.5t-330 27.5q-47 0 -102.5 -27.5t-76.5 -27.5t-21 11q0 14 32 42l704 637h-208q-24 0 -24 17q0 25 34 46.5t60 21.5h223q195 198 369 401q-29 -8 -81 -8t-202.5 27.5t-232.5 27.5t-113.5 -20.5t-64.5 -103.5q-13 -33 -75.5 -70t-89 -37t-28.5 10q16 39 46 95 q72 104 215 175t272 71q77 0 227.5 -27t226.5 -27l4 -2q76 57 127 57q17 0 17 -12z" />
+<glyph unicode="&#x1d4ea;" horiz-adv-x="1241" d="M1020 58q-166 0 -166 275q0 52 5 155q-98 -202 -242 -345t-243 -143t-147 91q-38 72 -38 175q0 240 145 422t336 182q116 0 250 -72q20 71 163 71q8 0 29 -1q-102 -158 -102 -502q0 -167 79 -167q105 0 283 197q121 134 225 294l60 -42q-142 -254 -324 -422t-313 -168z M895 672q-158 104 -270 104t-196.5 -139.5t-84.5 -334.5q0 -155 101 -155q76 0 242 224z" />
+<glyph unicode="&#x1d4eb;" horiz-adv-x="1030" d="M1148 534q-74 0 -145 20q11 -38 11 -77q0 -189 -132.5 -333t-319.5 -144q-130 0 -215 78t-85 207q0 88 34 261l128 650q-36 -7 -66 -7q-165 0 -164 171q51 -48 153 -48t261 49l-180 -906q-18 -91 -18 -170.5t47 -141.5t132 -62q133 0 215 124q73 109 73 249q0 77 -25 149 q-77 26 -137 68q-82 57 -82 117q0 29 21 68q206 -16 314 -179q101 -48 211 -48t228 69l39 -62q-134 -102 -298 -102z" />
+<glyph unicode="&#x1d4ec;" horiz-adv-x="896" d="M533 -22q-154 0 -243 103.5t-89 259.5q0 214 158 371.5t373 157.5q71 0 126 -24q72 -33 72 -94q0 -87 -144 -126q8 18 8 35q0 124 -133 124q-113 0 -209 -128t-96 -279q0 -114 60 -196.5t170 -82.5q282 0 660 585l65 -39q-151 -253 -325 -427q-241 -240 -453 -240z" />
+<glyph unicode="&#x1d4ed;" horiz-adv-x="1236" d="M986 0q-154 0 -154 249q0 110 18 219q-94 -169 -200 -291q-156 -177 -282 -177q-94 0 -141 90q-38 72 -38 175q0 241 144 423t335 182q115 0 248 -72l83 412q-66 -14 -125 -14t-90 37t-47 114q56 -37 185 -37t258 51l-167 -838q-28 -141 -28 -240q0 -132 75 -132 t244 170.5t285 362.5l63 -40q-137 -251 -340.5 -447.5t-325.5 -196.5zM891 672q-157 104 -268 104t-195 -140t-84 -334q0 -155 101 -155q74 0 241 224q46 61 205 301z" />
+<glyph unicode="&#x1d4ee;" horiz-adv-x="917" d="M488 0q-144 0 -221 92.5t-77 239.5q0 216 140.5 377t353.5 161q92 0 155 -47t63 -136q0 -136 -164.5 -242t-380.5 -106v-5q0 -220 190 -220q194 0 416 201q170 155 304 370l67 -36q-134 -249 -349 -433q-254 -216 -497 -216zM753 697q0 97 -87 97q-121 0 -210 -135 q-73 -111 -92 -247q138 7 252 76q137 83 137 209z" />
+<glyph unicode="&#x1d4ef;" horiz-adv-x="567" d="M337 -28q-19 -96 -19 -154.5t19 -93.5q-75 -25 -117 -25q-63 0 -63 72q0 58 25 183l135 675h-16q-115 0 -199 -56q20 109 75 136q32 15 158 15q39 197 60 264q47 148 129 233q136 140 308 140q56 0 108.5 -26.5t52.5 -75.5t-99 -105q-27 118 -125 118q-131 0 -208 -218 q-25 -74 -75 -330h298q150 0 237 20q-34 -77 -82 -99q-36 -16 -472 -16z" />
+<glyph unicode="&#x1d4f0;" horiz-adv-x="1119" d="M448 -442q-103 0 -172 39q-85 48 -85 143q0 132 247 280l365 189l26 271q-66 -135 -203 -259.5t-265 -124.5q-86 0 -137 58.5t-51 145.5q0 211 160.5 390.5t350.5 179.5q99 0 211 -56q10 65 40 89.5t152 34.5q-62 -129 -124 -621q313 161 508 373l63 -40 q-186 -230 -576 -450q-9 -127 -16 -186q-25 -233 -208 -363q-130 -93 -286 -93zM868 679q-99 106 -215.5 106t-216.5 -142t-100 -302q0 -113 83 -113q101 0 256 179q117 134 193 272zM350 -252q0 -106 153 -106q292 0 292 466l-264 -150q-181 -118 -181 -210z" />
+<glyph unicode="&#x1d4f1;" horiz-adv-x="1175" d="M1054 62q-129 0 -162 175q-4 23 -18 326q-8 175 -77 175q-111 0 -286.5 -309.5t-175.5 -370.5q0 -21 14 -38q-38 -20 -90 -20q-68 0 -68 61q0 54 17 123l31 132l178 889q-51 -19 -104 -19q-149 0 -148 175q73 -55 171 -55q136 0 262 55l-125 -633q-32 -123 -89 -372 q228 514 466 514q128 0 164 -157q16 -66 16 -257q0 -257 71 -257q76 0 234 204q101 130 192 281l63 -35q-126 -251 -280.5 -419t-255.5 -168z" />
+<glyph unicode="&#x1d4f2;" horiz-adv-x="695" d="M443 898q-32 0 -32 44t19 90h11q54 0 151.5 53t146.5 99q-32 -101 -121 -177q-127 -109 -175 -109zM444 0q-88 0 -140 57.5t-52 146.5q0 31 35 201t35 248q0 43 -26 72q90 22 125 22q57 0 57 -76t-37 -251t-37 -211q0 -95 80 -95q121 0 317 229q134 156 246 341l64 -39 q-135 -236 -279 -400q-215 -245 -388 -245z" />
+<glyph unicode="&#x1d4f3;" horiz-adv-x="447" d="M444 898q-31 0 -31 45.5t17 88.5h11q53 0 152 53.5t147 98.5q-32 -101 -121 -177q-127 -109 -175 -109zM470 667q0 -51 -23 -168l-79 -402q-52 -264 -141 -373q-136 -166 -307 -166q-56 0 -113 26.5t-57 77.5t101 121q-3 -18 -3 -26q0 -49 33.5 -87t81.5 -38 q123 0 189 186q19 54 66 290l57 289q38 193 38 246.5t-25 81.5q92 22 124 22q58 0 58 -80z" />
+<glyph unicode="&#x1d4f4;" horiz-adv-x="1017" d="M869 77q-111 0 -243.5 127.5t-199.5 251.5q-55 -270 -55 -331.5t19 -97.5q-78 -27 -117 -27q-63 0 -63 72q0 58 25 184l187 945q-70 -26 -120 -26q-90 0 -90 81q0 29 16 94q55 -55 147 -55t229 66l-170 -863q90 109 216 221q170 151 247 151q38 0 82 -103 q-87 -10 -214 -87.5t-203 -152.5q193 -305 336 -305q64 0 134 49.5t173 181t164 233.5l65 -37q-106 -196 -237 -350q-187 -222 -328 -222z" />
+<glyph unicode="&#x1d4f5;" horiz-adv-x="637" d="M450 0q-98 0 -149 74.5t-51 176.5q0 57 24 178l152 767q-29 -5 -53 -5q-176 0 -175 165q92 -52 207.5 -52t201.5 57l-177 -921q-24 -125 -24 -171q0 -128 94 -128q89 0 182 100t309 445l61 -42q-120 -229 -249 -392q-199 -252 -353 -252z" />
+<glyph unicode="&#x1d4f6;" horiz-adv-x="1685" d="M1520 0q-158 0 -158 207q0 88 36.5 259t36.5 202.5t-34 31.5q-84 0 -287 -312.5t-203 -357.5q0 -6 3 -15q-60 -16 -72 -16q-72 0 -72 70q0 20 24 124l49 242q35 171 35 217t-37 46q-82 0 -243.5 -295.5t-161.5 -351.5q0 -16 13 -32q-42 -19 -77 -19q-80 0 -80 87 q0 8 25.5 231.5t25.5 313t-38 133.5q89 33 125 33q68 0 68 -81q0 -30 -18 -209l-22 -219q274 581 487 581q93 0 93 -134q0 -47 -41 -258l-45 -232q100 210 218 374q179 250 312 250q116 0 116 -136q0 -86 -40 -252t-40 -255.5t66 -89.5q147 0 452 548l64 -36 q-332 -649 -580 -649z" />
+<glyph unicode="&#x1d4f7;" horiz-adv-x="1265" d="M1139 20q-129 0 -161 185q-6 33 -15 344q-6 185 -72 185q-96 0 -326 -404q-130 -229 -130 -275q0 -19 10 -36q-42 -19 -75 -19q-78 0 -78 87q0 41 24 256t24 294t-37 128q96 35 131 35q59 0 59 -87q0 -52 -15 -205l-21 -214q271 576 488 576q124 0 156 -185 q4 -24 17 -344q7 -185 72.5 -185t149 102t275.5 424l64 -37q-330 -625 -540 -625z" />
+<glyph unicode="&#x1d4f8;" horiz-adv-x="1051" d="M1217 549q-89 0 -193 34q2 -16 2 -31q0 -214 -145.5 -383t-356.5 -169q-156 0 -252 99.5t-96 265.5t123.5 297.5t297.5 131.5q30 0 55 -6q-19 31 -19 63t25 65q188 -15 311 -190q129 -88 266 -88q88 0 192 61l39 -64q-123 -86 -249 -86zM869 528q0 65 -19 121 q-62 19 -117 62q-31 7 -65 7q-139 0 -235.5 -120.5t-96.5 -263.5q0 -103 58 -175.5t159 -72.5q130 0 223 129t93 313z" />
+<glyph unicode="&#x1d4f9;" horiz-adv-x="959" d="M1038 548q0 -212 -146.5 -370t-357.5 -158q-110 0 -185 48l-46 -237q-19 -98 -19 -154.5t20 -93.5q-75 -25 -118 -25q-63 0 -63 72q0 49 26 181l212 1077q-62 -13 -123 -13t-91 36.5t-47 113.5q58 -38 184 -38t259 53l-59 -296q130 126 263.5 126t212 -95.5t78.5 -226.5z M887 484q0 103 -48.5 183t-151 80t-226.5 -120l-88 -441q76 -90 189 -90q146 0 235.5 119t89.5 269z" />
+<glyph unicode="&#x1d4fa;" horiz-adv-x="997" d="M875 -169q-19 -95 -19 -153t20 -95q-75 -25 -118 -25q-63 0 -63 72q0 55 25 181l131 659q-264 -470 -484 -470q-93 0 -141 92q-37 72 -37 175q0 239 145 421t335 182q113 0 247 -72q22 70 195 70q-44 -74 -65 -178zM891 672q-158 104 -268.5 104t-194.5 -140t-84 -334 q0 -155 101 -155q75 0 242 224q13 18 204 301z" />
+<glyph unicode="&#x1d4fb;" horiz-adv-x="848" d="M1066 788q0 -55 -116 -143q-28 60 -82 60q-99 0 -249 -206q-78 -107 -157 -253q-74 -135 -74 -209q0 -6 1 -12q-51 -25 -83 -25q-79 0 -79 69q0 38 27 162l49 234q25 128 25 223q0 43 -26 74q78 27 132 27t54 -67q0 -46 -14 -106l-25 -115l-43 -224q111 215 228 364 q181 229 329 229q39 0 71 -22.5t32 -59.5z" />
+<glyph unicode="&#x1d4fc;" horiz-adv-x="673" d="M684 178q0 -123 -100.5 -206.5t-226.5 -83.5q-68 0 -127 35.5t-59 99.5q0 113 324 267q-88 141 -110 182q-63 120 -63 197q0 146 169 234q105 -38 105 -100q0 -87 -133 -165l155 -284q230 137 409 343l61 -39q-163 -218 -430 -368q26 -57 26 -112zM504.5 17 q41.5 46 41.5 102.5t-18 101.5q-226 -121 -226 -188q0 -62 92 -62q69 0 110.5 46z" />
+<glyph unicode="&#x1d4fd;" horiz-adv-x="689" d="M935 833h-429q-106 -347 -106 -519.5t129 -172.5q71 0 146.5 56.5t107.5 124.5q21 -36 21 -64q0 -76 -127 -167t-231 -91t-161 99q-47 83 -47 197.5t38 270.5l74 266h-130q-77 0 -129 -24q39 74 69 99t103 25h117q40 140 71 183q55 74 174 74q19 0 36 -1 q-59 -77 -123 -256h404q106 0 162 27q-19 -80 -53.5 -103.5t-115.5 -23.5z" />
+<glyph unicode="&#x1d4fe;" horiz-adv-x="1224" d="M1066 43q-175 0 -175 305q0 74 5 144q-83 -171 -190 -304q-152 -188 -279 -188q-88 0 -138 61.5t-50 151.5q0 127 82 443q22 85 22 110t-15 50l106 1q69 0 69 -52q0 -33 -54 -220.5t-54 -297.5t78 -110q126 0 324 318q161 259 161 368q0 15 -9 29q62 18 107 18 q67 0 67 -41q0 -8 -42 -171t-42 -320t81 -157q181 0 456 505l64 -38q-314 -605 -574 -605z" />
+<glyph unicode="&#x1d4ff;" horiz-adv-x="885" d="M1019 716q0 -67 -130 -270q-174 -271 -267 -370q-30 -31 -66.5 -51t-133.5 -26q17 65 17 117q0 183 -76.5 410.5t-191.5 352.5q65 34 119 34q85 0 171 -221.5t123 -533.5q294 373 320 661q115 -43 115 -103z" />
+<glyph unicode="&#x1d500;" horiz-adv-x="1313" d="M1388 714q0 -213 -147 -483q-130 -239 -283 -239q-174 0 -174 269q0 12 6 204q-95 -215 -190.5 -338t-246.5 -123q20 71 20 155q0 184 -46.5 402.5t-136.5 319.5q70 32 117 32q171 0 217 -711l1 -21q105 135 178 282q90 179 90 299v13q63 24 102 24q67 0 67 -50 q0 -8 -23 -139.5t-23 -281.5q0 -214 98 -214q90 0 158.5 154.5t68.5 359.5q0 144 -73 174q68 54 129 54q91 0 91 -142z" />
+<glyph unicode="&#x1d501;" horiz-adv-x="1008" d="M1180 280q-182 -212 -358 -212t-308 208q-155 -213 -193 -414q-92 54 -92 113q0 119 240 374q-48 82 -99 214t-51 202q0 65 152 89q-5 -16 -5 -30q0 -141 119 -370q200 228 200 361q0 7 -1 14q31 4 51 4q83 0 83 -45q0 -111 -294 -401q113 -178 244 -178q230 0 492 476 l64 -37q-135 -241 -244 -368z" />
+<glyph unicode="&#x1d502;" horiz-adv-x="902" d="M1048 780q0 -76 -120 -302q-278 -525 -580 -767q-157 -126 -266 -126t-109 87q0 40 18 83q45 -27 105 -27q224 0 428 296q-30 189 -109.5 392t-187.5 321q56 48 108.5 48t94.5 -49t109 -254t95 -328q258 408 280 716q134 -17 134 -90z" />
+<glyph unicode="&#x1d503;" horiz-adv-x="975" d="M907 27q0 -187 -122 -328t-306 -141q-91 0 -157 40.5t-66 126.5q0 103 173 236q124 95 268 162q-64 29 -132 29q-114 0 -235 -56q-2 16 -2 32q0 99 69 125q44 64 157 200l196 237q-81 -23 -181.5 -36t-126.5 -19q-84 -20 -132 -69q16 137 69 187q43 40 230.5 40.5 t247.5 51.5q27 -40 27 -85t-66 -128l-280 -355q48 7 84 7q119 0 208 -73q290 195 497 479l63 -39q-171 -272 -509 -514q26 -64 26 -110zM791 -51q0 58 -31 113q-120 -61 -224 -141q-148 -116 -148 -198q0 -91 115.5 -91t201.5 98t86 219z" />
+<glyph unicode="&#x1d504;" horiz-adv-x="1358" d="M537 860v191q0 116 -42 199q-54 106 -159 106q-70 0 -133.5 -55t-63.5 -122.5t61 -128.5l112 -106q61 -69 61 -148.5t-51.5 -146t-122.5 -90.5l-13 31q95 31 95 92t-61 116l-118 106q-63 71 -63 163q0 131 106 232.5t238 101.5q170 0 259 -104.5t89 -276.5v-158 q0 -196 -84 -306q-43 -58 -241 -212q88 -86 239 -197q150 95 283 168v711q0 183 -135 285l24 26q74 -57 160 -57q50 0 164.5 57.5t169.5 65.5v-47q-215 -25 -215 -391v-605q0 -194 106 -194q35 0 92 43l19 -37q-140 -70 -228 -180q-14 25 -101 116q-51 53 -58 160 q-171 -97 -205 -120q-115 -75 -176 -156q-153 210 -357 246v18q219 94 290 234q59 114 59 370z" />
+<glyph unicode="&#x1d505;" horiz-adv-x="1561" d="M1454 498q0 -217 -197 -370q-182 -142 -405 -142q-128 0 -247 67q-43 24 -152.5 108.5t-161.5 84.5q-83 0 -146 -117l-28 18q129 207 307 207q37 0 68 -8q91 90 120 189.5t29 246.5q0 15 1 55v64q0 428 -222 428q-66 0 -132.5 -48t-66.5 -112q0 -83 110.5 -185 t110.5 -191q0 -190 -194 -254l-8 32q112 41 112 109q0 46 -57 98q-99 92 -105 99q-57 68 -57 151q0 148 106 255.5t255 107.5q206 0 290 -174q236 86 340 184l176 -103q84 -65 84 -176q0 -139 -202 -278q272 -102 272 -346zM1233 1030q0 88 -60.5 156.5t-151 68.5 t-220.5 -79q29 -100 29 -283q0 -61 -3 -131q153 19 258 72q148 74 148 196zM1307 367q0 156 -120.5 260t-279.5 104q-46 0 -82 -8q-17 -136 -105 -227l-192 -166l220 -170q141 -101 245 -101q129 0 221.5 89.5t92.5 218.5z" />
+<glyph unicode="&#x1d506;" horiz-adv-x="1257" d="M713 -8q-277 0 -451 226q-160 208 -160 493q0 216 74 405q98 250 279 250q139 0 188 -160l154 193q148 -96 233 -96t139 71l29 -16q-125 -182 -278 -182q-78 0 -201 65q-70 -70 -70 -129q0 -84 106.5 -256t106.5 -260q0 -167 -182 -326l-21 29q66 56 66 138.5 t-96.5 245.5t-96.5 259.5t82 224.5q-8 63 -47 110.5t-98 47.5q-207 0 -207 -465q0 -287 95 -473q123 -242 382 -242q348 0 453 224h33q-133 -377 -512 -377z" />
+<glyph unicode="&#x1d507;" horiz-adv-x="1561" d="M1452 633q0 -261 -150 -444q-160 -197 -415 -197q-105 0 -209 55l-162 103q-87 55 -151 55q-89 0 -168 -113l-29 17q128 221 321 221q52 0 101 -19q67 89 67 150t-66.5 179.5t-66.5 210.5t75 188q18 24 146 155q-56 12 -169.5 12t-233.5 -46q-160 -62 -160 -179 q0 -29 17 -55l-23 -13q-41 47 -41 127q0 167 178 262q145 76 328 76q316 0 563.5 -216.5t247.5 -528.5zM1399 563q0 252 -173 421t-429 204q-135 -114 -135 -207q0 -60 70.5 -175t70.5 -199t-63 -171l-115 -141l188 -118q113 -66 209 -66q177 0 282 141q95 127 95 311z" />
+<glyph unicode="&#x1d508;" horiz-adv-x="1257" d="M719 -8q-279 0 -454 228q-161 209 -161 497q0 215 76 403q100 246 281 246q143 0 184 -168l158 201q142 -96 231 -96t144 71l26 -18q-131 -180 -280 -180q-92 0 -201 65q-72 -72 -72 -131t63 -176q1 -3 99 -170q144 190 254 190q106 0 145 -147l-153 -109 q-36 127 -109 127q-53 0 -116 -98q32 -80 32 -145q0 -142 -184 -314l-23 27q70 63 70 145t-97 245.5t-97 258.5t83 221q-8 63 -45.5 111.5t-95.5 48.5q-213 0 -213 -461q0 -299 96 -481q125 -238 398 -238q139 0 254 52q137 60 184 174l29 -2q-56 -179 -188 -278t-318 -99z " />
+<glyph unicode="&#x1d509;" horiz-adv-x="1358" d="M1145 649q-117 0 -117 -197v-16q102 -145 102 -293q0 -182 -144 -315t-321 -133t-317.5 123.5t-140.5 290.5q0 95 82 239t82 188t-40 67.5t-85 23.5l8 30h12q90 0 167 -59.5t77 -150t-75 -225.5t-75 -210q0 -117 92 -195.5t219.5 -78.5t217.5 83t90 207.5t-77 247.5 l-143 202q-77 119 -77 224q0 189 145 396q-37 12 -195 94q-110 57 -204.5 57t-166 -50.5t-71.5 -127t48 -129.5t114.5 -53t130.5 47l4 -37q-70 -49 -149.5 -49t-137 68t-57.5 157q0 135 115 225.5t245.5 90.5t311.5 -92.5t243.5 -92.5t98.5 40q33 36 33 92v10h35 q0 -114 -79.5 -195.5t-193.5 -81.5q-52 0 -92 14q-74 -120 -74 -211q0 -144 209 -393q0 153 22 220q40 122 161 122q70 0 112 -67l-45 -146q-49 39 -100 39z" />
+<glyph unicode="&#x1d50a;" horiz-adv-x="1561" d="M1440 539q0 -246 -176 -396.5t-426 -150.5q-299 0 -482.5 207.5t-183.5 511.5q0 212 107 414q128 241 321 241q137 0 197 -139q100 97 164 176q133 -121 237 -121q82 0 145 78l25 -23q-152 -180 -281 -180q-94 0 -215 92q-100 -74 -100 -170.5t133 -312.5q62 160 234 160 q136 0 218.5 -122t82.5 -265zM1249 563q0 137 -18 201q-35 119 -137 119q-66 0 -109 -52.5t-53 -121.5q41 -99 41 -160q0 -121 -79.5 -216t-199.5 -147l-12 27q133 76 133 172.5t-92 279.5t-92 288t131 245q-37 131 -160 131q-229 0 -229 -559q0 -343 63 -498 q101 -247 393 -247q250 0 346 152q74 120 74 386z" />
+<glyph unicode="&#x1d50b;" horiz-adv-x="1358" d="M823 952q203 -63 329 -207t126 -343t-114 -346q-62 -80 -213.5 -196.5t-178.5 -183.5q-144 162 -276 162q-88 0 -156 -82l-23 19q175 192 304 192q105 0 245 -127q242 164 242 459q0 169 -100 323q-112 173 -269 173q-81 0 -225 -97q143 -169 143 -290t-129 -238 l-221 -182l-151 121l-74 -58l-25 27l222 176l153 -119q90 67 90 153t-78 193l-145 185q-78 116 -78 231q0 151 138 285l249 217q112 -119 233.5 -119t176.5 96l31 -10q-135 -211 -291 -211q-89 0 -244 111q-152 -106 -152 -260.5t125 -272.5q221 118 336 219z" />
+<glyph unicode="&#x1d50c;" horiz-adv-x="1257" d="M1147 1339q-18 -110 -96 -188t-189 -78t-260.5 108.5t-243.5 108.5t-152.5 -55.5t-58.5 -133t51.5 -125.5t123.5 -48q32 0 57 8l8 -33q-34 -12 -70 -12q-93 0 -154 64t-61 157q0 126 103 208.5t221.5 82.5t224.5 -58q19 -11 161 -107q84 -58 144.5 -58t105 51.5 t58.5 122.5zM1135 920q-68 63 -110.5 63t-69.5 -22.5t-27 -55.5q0 -51 109.5 -219.5t109.5 -282.5q0 -186 -173 -305q-153 -106 -347 -106q-132 0 -227 71q-38 28 -127 132q-61 71 -117.5 71t-94.5 -80l-38 2q31 74 97 123t153 49t174 -80l140 -149q85 -80 174 -80t166 65.5 t77 159.5t-105.5 265t-105.5 264.5t58 157t142 63.5t162 -78z" />
+<glyph unicode="&#x1d50d;" horiz-adv-x="1257" d="M854 1051q-105 0 -209 61l-165 115q-93 61 -170 61t-128 -57.5t-51 -134t55 -131t121 -54.5t115 31l22 -29q-67 -36 -133 -36q-94 0 -155.5 66t-61.5 161q0 126 102.5 210.5t220 84.5t219.5 -63l160 -120q81 -61 144 -61t108.5 40.5t51.5 104.5l28 -4 q-15 -104 -92 -174.5t-182 -70.5zM1141 190q0 -203 -164 -354t-371 -151q-153 0 -248 91q-37 36 -119 171q-56 92 -114 92q-75 0 -90 -113h-37q14 89 75 149t155 60t178 -100l134 -187q82 -100 177 -100q123 0 196.5 91.5t73.5 215t-126 332t-126 318t62 195t156 85.5 t155 -82l-16 -29q-56 78 -131 78q-43 0 -76 -31t-33 -75q0 -84 144.5 -312t144.5 -344z" />
+<glyph unicode="&#x1d50e;" horiz-adv-x="1358" d="M666 709q-31 0 -172 -43q96 -123 96 -255.5t-135 -246.5l-234 -172l-135 137l-68 -53l-14 35l203 161l135 -143q102 55 102 144t-133 312t-133 341q0 203 138 335t343 132t311 -128q56 -67 112 -236q43 -128 94 -128q22 0 67 12v-34l-373 -107q87 -49 147 -215l82 -278 q45 -138 103 -138q30 0 80 35v-43q-124 -69 -188 -141q-117 89 -164 200q-23 53 -68 250q-60 267 -196 267zM805 1236q-59 107 -185.5 107t-200 -88.5t-73.5 -224.5t129 -332l592 174q-121 27 -179 152z" />
+<glyph unicode="&#x1d50f;" horiz-adv-x="1257" d="M1174 291q-51 -117 -168 -208t-234.5 -91t-275 98t-224.5 98q-112 0 -174 -112l-26 16q129 228 325 234q56 77 56 153.5t-107.5 229t-107.5 260.5q0 165 133 297.5t291 132.5t298 -119t140 -266q0 -89 -76 -208t-76 -159q0 -59 68 -102l-19 -27q-168 98 -168 250 q0 67 61.5 180t61.5 178q0 104 -89 171t-196.5 67t-198.5 -68.5t-91 -175.5t98 -250t98 -223q0 -115 -137 -323q69 -16 218.5 -109.5t240 -93.5t155.5 54.5t93 133.5z" />
+<glyph unicode="&#x1d510;" horiz-adv-x="1864" d="M1804 975l17 2v-35q-128 -28 -172.5 -92.5t-44.5 -200.5v-280q0 -219 98 -219q43 0 96 49l21 -25l-228 -182q-116 108 -145 195q-21 63 -21 276.5t47 303.5q62 121 275 189q-150 29 -195 132l-35 174q-18 86 -108 86q-190 0 -190 -411l6 -218q0 -294 -84 -431 q-68 -111 -324 -296l-135 135l-76 -64l-22 29l221 174l135 -135q100 70 100 357v6l-2 575q0 274 -153 274q-82 0 -127 -74t-45 -161v-438q0 -264 -107 -405q-58 -78 -321 -273l-125 135l-74 -59l-25 28l218 168l131 -129q114 70 114 350v433q0 425 -217 425 q-78 0 -139.5 -57t-61.5 -131.5t66 -136.5l121 -105q65 -69 65 -154.5t-43 -158t-116 -106.5l-17 26q92 46 92 123q0 53 -65 108q-112 95 -123 107q-66 76 -66 178q0 150 100 251.5t249 101.5q108 0 196 -64.5t115 -167.5q49 229 254 229q241 0 272 -239q8 110 71 174.5 t173 64.5q181 0 232 -102q15 -30 31 -193q10 -108 91 -116z" />
+<glyph unicode="&#x1d511;" horiz-adv-x="1458" d="M1147 -8q-115 114 -147.5 198.5t-32.5 281t58 290.5t257 192q-141 27 -179.5 70.5t-59 182.5t-125.5 139q-87 0 -135 -84q-40 -70 -40 -164v-533q0 -276 -247 -459q-55 -34 -154 -118l-137 143l-80 -63l-25 28l228 176l139 -143q88 57 88 248v399q0 232 -24 342 q-50 221 -201 221q-82 0 -145.5 -56t-63.5 -127t64 -128l125 -113q67 -75 67 -166t-46.5 -162t-121.5 -104l-6 35q92 50 92 112.5t-66 120.5l-130 114q-68 77 -68 175q0 142 106 245.5t248 103.5q107 0 195.5 -62t132.5 -164q16 101 80 165.5t163 64.5q192 0 248 -112 q3 -5 41 -205q20 -103 120 -103h9v-33q-153 -11 -205 -136q-32 -79 -32 -259q0 -379 135 -379q45 0 98 49l23 -31q-163 -102 -246 -192z" />
+<glyph unicode="&#x1d512;" horiz-adv-x="1561" d="M1303 1156q163 -204 163 -487t-172.5 -480t-455.5 -197q-124 0 -240 61q-29 15 -173 113q-90 61 -149 61q-103 0 -167 -125l-27 17q39 96 115 167.5t172 80.5q65 77 65 150t-109.5 201.5t-109.5 233.5q0 226 229 424q37 -45 97 -45t161.5 22.5t153.5 22.5q272 0 447 -220 zM1314 290q101 154 101 377.5t-131.5 372t-365.5 148.5q-54 0 -159.5 -20.5t-169.5 -20.5t-105 54q-23 31 -54 122q-96 -89 -96 -205q0 -86 111.5 -219.5t111.5 -232.5q0 -141 -147 -297q92 -20 272 -138t315 -118q200 0 317 177z" />
+<glyph unicode="&#x1d513;" horiz-adv-x="1561" d="M1391 961q-217 0 -217 -125q0 -52 99 -164.5t99 -206.5q0 -154 -150.5 -300.5t-306.5 -146.5q-68 0 -155 50q-21 -184 -60 -385h-47q-54 268 -59 456q-108 76 -186 76t-156 -90l-25 22q131 186 320 186q22 0 45 -3v583q0 447 -221 447q-74 0 -147.5 -58.5t-73.5 -125.5 t67 -130l131 -122q70 -78 70 -163t-50.5 -150t-127.5 -97l-7 37q97 29 97 106q0 50 -67 105q-111 93 -124 108q-67 76 -67 174q0 146 99.5 251.5t244.5 105.5q105 0 195 -65t132 -165q41 232 250 232q113 0 193 -64t80 -165.5t15 -132.5q24 -46 103 -46h7v-34zM1079 1196 q0 65 -35 112.5t-98 47.5q-98 0 -146 -107q-36 -80 -36 -192v-781q177 -155 289 -155q79 0 133.5 55.5t54.5 138.5t-103.5 201t-103.5 213t76.5 163.5t179.5 94.5q-111 19 -161 61.5t-50 147.5z" />
+<glyph unicode="&#x1d514;" horiz-adv-x="1561" d="M1366 2q-83 0 -170 104q-169 -114 -360 -114q-123 0 -239 60q-28 15 -174 113q-90 60 -149 60q-103 0 -168 -125l-26 17q38 97 114.5 168t172.5 80q65 77 65 150t-109.5 202t-109.5 235q0 224 229 422q39 -45 98 -45t160.5 22.5t153.5 22.5q272 0 447 -220 q163 -204 163 -481.5t-145 -451.5q88 -100 141 -100t92 59l4 -45q-87 -133 -190 -133zM1290 262q123 158 123 392t-130.5 383t-367.5 149q-53 0 -158.5 -19.5t-158.5 -19.5q-76 0 -116 53q-20 27 -54 121q-96 -89 -96 -205q0 -86 111.5 -219.5t111.5 -232.5 q0 -146 -147 -297q93 -20 273 -138t314 -118q89 0 164 41q-95 139 -168 139q-46 0 -84 -45l-26 22q134 129 206 129q56 0 113 -46q18 -14 90 -89z" />
+<glyph unicode="&#x1d515;" horiz-adv-x="1458" d="M988 376v68q1 45 1 66q0 69 -29 131q-36 78 -98 78q-14 0 -127 -47q0 -167 -20 -256q-30 -133 -119 -223q-43 -44 -137.5 -106.5t-130.5 -94.5l-125 141l-68 -51l-22 29l217 168l123 -146q57 31 75 79q13 34 13 112v585q0 432 -217 432q-75 0 -135 -51.5t-60 -125 t64 -133.5l120 -102q64 -68 64 -157t-47 -162.5t-125 -95.5l-6 33q96 39 96 110q0 54 -68 109q-120 96 -126 103q-68 72 -68 169q0 140 100.5 246.5t239.5 106.5q112 0 210 -56.5t119 -156.5q179 87 357 217l160 -124q73 -74 73 -186q0 -170 -256 -286q102 -70 128 -244 q8 -140 18 -277t78 -137q28 0 83 56l23 -31l-219 -174q-159 89 -159 384zM1122 1020q0 82 -61 144.5t-143 62.5q-57 0 -205 -88q22 -102 22 -426q187 69 245 104q142 85 142 203z" />
+<glyph unicode="&#x1d516;" horiz-adv-x="1561" d="M1124 1104q-67 0 -229.5 68.5t-271.5 68.5q-187 0 -292 -170q-89 -145 -89 -344q0 -543 678 -543q510 0 510 299q0 85 -62 143t-149 58t-229.5 -68.5t-230.5 -68.5t-165.5 59t-77.5 154q0 69 49 112l21 -24q-31 -31 -31 -73t30.5 -67.5t71.5 -25.5q67 0 202 73.5 t243 73.5q155 0 259.5 -106.5t104.5 -261.5q0 -222 -191 -354q-169 -115 -401 -115q-302 0 -487.5 212t-185.5 519q0 255 158 453t405 198q101 0 261.5 -65.5t234.5 -65.5q116 0 184 109l29 -11q-129 -237 -349 -237z" />
+<glyph unicode="&#x1d517;" horiz-adv-x="1358" d="M903 -8q-107 0 -294.5 100.5t-272.5 100.5q-122 0 -201 -142l-31 15q58 104 155.5 184t202 80t228.5 -66q72 76 72 132.5t-65.5 165t-65.5 192.5q0 125 176 315l-227 109q-135 59 -230.5 59t-163 -52.5t-67.5 -130t42.5 -124t111.5 -46.5q16 0 32 3l-8 -29q-18 -6 -43 -6 q-81 0 -126.5 58.5t-45.5 142.5q0 135 117.5 229t263 94t335 -98t275.5 -98q132 0 230 149l28 -18q-186 -271 -366 -271q-49 0 -119 19q-88 -78 -88 -137t69.5 -170t69.5 -189q0 -147 -178 -313q217 -121 323 -121q154 0 267 182l30 -16q-184 -303 -436 -303z" />
+<glyph unicode="&#x1d518;" horiz-adv-x="1358" d="M532 924l3 -177q0 -124 -37.5 -199.5t-165.5 -172.5q180 -161 309 -232l283 195v661q0 208 -129 285l24 37q75 -51 148 -51t186.5 63.5t175.5 63.5v-37q-149 -19 -203 -203q-32 -110 -32 -311v-438q0 -242 102 -242q47 0 107 47l12 -39q-169 -88 -246 -182 q-106 126 -109 132q-38 62 -38 167q-161 -102 -244.5 -161t-161.5 -138q-45 72 -165.5 156t-200.5 98v14q121 65 167 178q35 85 35 231l-4 195q0 361 -135 361q-42 0 -98 -43l-19 35q113 66 252 184q114 -107 149 -207t35 -270z" />
+<glyph unicode="&#x1d519;" horiz-adv-x="1561" d="M1242 906q-71 -34 -71 -93t99.5 -171.5t99.5 -197.5q0 -181 -180.5 -316.5t-368.5 -135.5q-119 0 -228 66q-28 16 -162 122q-84 66 -140 66q-85 0 -162 -111l-33 15q164 211 336 211q22 0 45 -3q123 73 123 338v269q0 142 -42 238q-57 130 -181 130q-65 0 -129 -52 t-64 -120t65 -124l119 -97q64 -65 64 -160q0 -172 -160 -245l-10 28q94 45 94 111q0 44 -68 100q-113 93 -126 107q-68 74 -68 161q0 143 105.5 242.5t249.5 99.5q219 0 301 -190q57 195 251 195q178 0 239 -105q24 -41 48 -198q17 -109 84 -115l-6 -35q-69 -2 -124 -30z M780 1028l11 -229q0 -254 -277 -459q53 -22 214 -161q131 -111 232 -111t183 67.5t82 160.5t-97.5 204.5t-97.5 204t87 165.5q70 60 177 91q-147 33 -190 134q-16 83 -34 164.5t-114 81.5q-176 0 -176 -313z" />
+<glyph unicode="&#x1d51a;" horiz-adv-x="1864" d="M540 660l-3 169q0 502 -222 502q-70 0 -122 -54.5t-52 -123t59 -123.5l114 -108q61 -72 61 -172q0 -164 -168 -246l-17 31q105 52 105 113.5t-61 116.5l-121 108q-64 73 -64 169q0 135 103.5 237.5t238.5 102.5q90 0 169 -55t120 -139q16 93 84.5 144.5t163.5 51.5 q191 0 256 -180q12 86 79 134t156 48q180 0 230 -105l35 -193q18 -97 116 -97h10v-33q-71 0 -143 -35.5t-72 -98t104.5 -175t104.5 -217.5q0 -151 -125.5 -285.5t-275.5 -134.5q-94 0 -206.5 80t-172.5 80q-36 0 -151 -84t-218.5 -84t-222.5 87t-178 87q-82 0 -135 -88 l-27 19q131 198 275 198q26 0 53 -10q120 80 120 363zM1212 1151l13 -354q0 -174 -38 -289t-140 -256q60 29 114 29q81 0 194.5 -83t178 -83t111.5 50.5t47 127.5t-115 198.5t-115 215.5t72.5 166.5t171.5 103.5q-146 19 -188 115l-32 166q-19 85 -114 85q-74 0 -117 -57.5 t-43 -134.5zM711 1130l12 -366q0 -165 -64 -277.5t-204 -205.5q30 -13 152.5 -98t178.5 -85t127 68q125 118 125 528v262q0 385 -166 385q-78 0 -119.5 -64.5t-41.5 -146.5z" />
+<glyph unicode="&#x1d51b;" horiz-adv-x="1257" d="M586 496v166h-271v90h271v36q0 441 -232 441q-87 0 -176 -74l-20 31q191 109 272 213q264 -110 303 -346q26 106 121 200q50 49 186 146l131 -146l35 31l19 -31l-181 -149l-131 149q-153 -103 -153 -292v-209h293v-90h-293v-101q0 -142 65 -250q77 -127 209 -127 q80 0 178 86l13 -30q-108 -85 -165.5 -135t-107.5 -113l-215 143q-79 67 -135 225q-23 -105 -127 -209q-48 -48 -192 -159l-148 155l-57 -45l-21 29l199 170l156 -158q94 79 134 156.5t40 196.5z" />
+<glyph unicode="&#x1d51c;" horiz-adv-x="1458" d="M721 1111l6 -165q0 -267 -44.5 -365.5t-250.5 -250.5l223 -162q64 46 117 78l25 -27q-128 -73 -248 -201q-161 171 -342 201v21q219 102 278 218q47 93 47 353v217q0 122 -42 209q-55 113 -164 113q-77 0 -138 -55.5t-61 -131.5q0 -54 62 -107q111 -97 115 -102 q63 -71 63 -159t-48.5 -162t-121.5 -90l-11 30q93 31 93 101q0 52 -63 107q-112 98 -116 104q-63 72 -63 166q0 146 102 246t250 100q220 0 295 -209q36 211 217 211q221 0 300 -244q46 -143 46 -424.5t-36 -434.5q-53 -222 -207 -376q-56 -55 -176.5 -141t-139.5 -101 q-137 109 -241 109t-168 -74l-25 19q147 178 315 178q123 0 222 -103q108 69 151 130q79 110 102 427q11 140 11 463q0 529 -183 529q-151 0 -151 -245z" />
+<glyph unicode="&#x1d51d;" horiz-adv-x="1358" d="M1184 164q0 -236 -187 -373q-167 -123 -411 -123q-174 0 -270 94q-44 43 -110 173q-47 94 -102 94q-76 0 -86 -103h-32q9 76 66.5 123t133.5 47q122 0 195 -100l112 -186q71 -101 189 -101q291 0 291 402q0 483 -252 483q-146 0 -197 -141l-30 16q39 103 149 143 q-95 39 -143 125l26 21q70 -117 174 -117q123 0 187 101q55 85 55 212q0 169 -72 272q-82 117 -243 117q-138 0 -255.5 -87.5t-117.5 -221.5q0 -54 20 -98l-26 -14q-27 60 -27 116q0 155 132 248.5t306 93.5t315 -96q161 -109 161 -289q0 -135 -108 -239q-91 -88 -234 -135 q179 -38 285 -157.5t106 -299.5z" />
+<glyph unicode="&#x1d51e;" horiz-adv-x="932" d="M336 -10q-119 82 -162 181t-43 257t46 260.5t171 185.5q51 31 141 107q163 -117 345 -150v-22q-72 -12 -72 -129v-426q0 -133 67 -133q35 0 82 39l2 -43q-69 -38 -180 -129q-112 92 -112 180q-191 -94 -285 -178zM285 440q0 -317 143 -317q66 0 193 90v518 q-55 61 -236 123q-100 -47 -100 -414z" />
+<glyph unicode="&#x1d51f;" horiz-adv-x="932" d="M848 516q0 -208 -62 -302q-36 -54 -140 -108.5t-148 -123.5q-220 117 -373 155v17q57 20 57 102v702q0 115 -21 168q-29 73 -116 117l12 29q82 -35 143.5 -35t164.5 42.5t151 49.5l4 -37q-194 -24 -194 -258v-233l153 73q79 39 135 80q234 -114 234 -438zM692 440 q0 387 -190 387q-66 0 -178 -59l2 -535q0 -27 105 -75.5t140 -48.5q121 0 121 331z" />
+<glyph unicode="&#x1d520;" horiz-adv-x="729" d="M516 760q-49 0 -147 84q-56 -52 -56 -316q0 -166 22 -245q40 -148 161 -148q65 0 172 53l16 -30q-151 -58 -260 -166q-161 87 -214 199q-44 94 -44 266t30 242t108 137l159 137q80 -107 139 -107q41 0 74 27l16 -19q-70 -114 -176 -114z" />
+<glyph unicode="&#x1d521;" horiz-adv-x="932" d="M769 862q101 -124 101 -362t-91 -323l-273 -185q-213 149 -393 160v20q84 17 84 107v538q163 31 284 80l-228 108q-149 83 -149 180t123 169l19 -25q-56 -35 -56 -72q0 -78 247.5 -185t331.5 -210zM711 434q0 177 -24 253q-39 123 -163 187q-14 -6 -190 -63v-569 q206 -119 278 -119q99 0 99 311z" />
+<glyph unicode="&#x1d522;" horiz-adv-x="831" d="M152 514q0 158 40 237.5t133 130.5q32 17 222 97l192 -352l-436 -195q9 -116 81 -208.5t181 -92.5q72 0 197 70v-43q-195 -92 -287 -168q-193 105 -258 207.5t-65 316.5zM440 895q-91 -34 -118 -81.5t-27 -146.5t6 -194l297 133z" />
+<glyph unicode="&#x1d523;" horiz-adv-x="629" d="M190 1059l-16 174q0 59 40.5 105t90.5 46t107.5 -31.5t81 -31.5t35 25t3.5 53h33q4 -15 4 -41q0 -65 -36.5 -118.5t-98.5 -53.5q-36 0 -93 33.5t-81 33.5q-43 0 -43 -57q0 -135 107 -209q93 -65 235 -65v-78h-178q0 -341 -70 -1159h-30q-68 851 -68 1159h-160v76 q137 6 137 139z" />
+<glyph unicode="&#x1d524;" horiz-adv-x="932" d="M774 666v-390q0 -64 43 -150.5t43 -139.5q0 -147 -138 -232q-118 -71 -276 -71q-323 0 -323 170q0 36 27 77l159 -36q-18 -34 -18 -70q0 -105 170 -105q108 0 177 44q83 53 83 155q0 45 -40 133t-46 129q-176 -76 -309 -170q-222 127 -222 418q0 207 63 303 q36 56 143 117t155 135q140 -137 397 -176v-23q-88 -18 -88 -118zM272 736q-20 -57 -20 -199t18 -227q36 -175 148 -175q43 0 217 94v486q-29 39 -109 75l-147 64q-79 -36 -107 -118z" />
+<glyph unicode="&#x1d525;" horiz-adv-x="932" d="M852 420q0 -501 -397 -742h-62q309 198 309 678q0 169 -31 288q-50 192 -169 192q-71 0 -187 -70v-563q38 -46 99 -92l98 67l12 -35q-101 -62 -190 -151q-96 112 -232 133v18q74 13 74 115v737q0 108 -20 161q-27 74 -107 118l14 31q71 -39 129 -39t160 42t154 46v-39 q-191 -35 -191 -258v-242q167 56 310 160q131 -106 179 -236t48 -319z" />
+<glyph unicode="&#x1d526;" horiz-adv-x="526" d="M201 1342q31 26 72 26t77.5 -20.5t36.5 -60.5t-42 -102l-69 -91q-106 118 -106 184q0 38 31 64zM188 215l13 490q0 96 -64 96q-34 0 -76 -27v35q127 79 211 166q53 -64 88.5 -97.5t85.5 -48.5v-18q-100 -12 -106 -141q-10 -213 -10 -414q0 -123 63 -123q32 0 109 43v-41 q-114 -63 -209 -143q-105 91 -105 223z" />
+<glyph unicode="&#x1d527;" horiz-adv-x="526" d="M201 1345.5q31 26.5 72 26.5t77.5 -20.5t36.5 -60.5t-42 -102l-69 -91q-106 112 -106 182q0 39 31 65.5zM346 651v-694q0 -135 72 -172v-33q-38 10 -68 10q-63 0 -150 -45t-122 -47l-8 35q137 41 137 328v655q0 129 -51 129q-37 0 -95 -37v35q133 83 211 166 q95 -119 174 -145v-17q-100 -15 -100 -168z" />
+<glyph unicode="&#x1d528;" horiz-adv-x="970" d="M634 315q0 32 4 105q-156 88 -177 88t-129 -77v-228q37 -44 99 -92l98 67l12 -35q-102 -63 -190 -151q-95 112 -232 133v18q74 12 74 115v737q0 107 -20 161q-27 75 -107 118l14 31q70 -39 128 -39t160.5 42t154.5 46v-39q-191 -35 -191 -258v-267q236 172 274 172 q51 0 130 -75.5t79 -126.5q-5 -6 -51 -38l-193 -133l120 -61q91 -50 91 -76v-188q0 -155 69 -155q20 0 82 36l13 -34q-79 -46 -185 -119q-127 57 -127 323zM515 861q-22 0 -94.5 -51.5t-88.5 -68.5v-264q31 19 347 226q-14 48 -66.5 103t-97.5 55z" />
+<glyph unicode="&#x1d529;" horiz-adv-x="526" d="M211 283v708q0 205 -129 256l14 31q74 -21 126 -21t142.5 47.5t139.5 49.5l2 -37q-154 -15 -154 -320v-749q0 -37 25 -82t54 -45t77 43l8 -39l-92 -62q-51 -37 -84 -73q-93 114 -213 116v19q84 11 84 158z" />
+<glyph unicode="&#x1d52a;" horiz-adv-x="1561" d="M1194 322l10 311q0 192 -90 192q-13 0 -254 -114v-711h-141v631q0 200 -82 200q-36 0 -260 -120v-711h-141v700q0 131 -64 131q-37 0 -106 -51l-19 33q143 94 209 156q104 -54 123 -217q244 120 356 217q121 -85 123 -217q259 113 387 219q93 -116 197 -148v-22 q-101 -3 -101 -121v-416q0 -155 72 -155q14 0 82 36l10 -34q-61 -37 -184 -119q-127 57 -127 330z" />
+<glyph unicode="&#x1d52b;" horiz-adv-x="1032" d="M696 315l13 322q0 188 -93 188q-10 0 -256 -116v-709h-141v700q0 131 -63 131q-40 0 -105 -51l-20 33q133 85 211 156q96 -53 118 -217q259 113 388 219q93 -116 196 -148l2 -22q-102 -3 -102 -121v-416q0 -155 69 -155q19 0 82 36l13 -34q-77 -45 -185 -119 q-127 57 -127 323z" />
+<glyph unicode="&#x1d52c;" horiz-adv-x="932" d="M870 432q0 -147 -59 -221q-31 -39 -131.5 -96t-147.5 -123q-215 132 -397 151v23q80 7 80 80v596h8q180 0 398 135q151 -89 207 -233q42 -111 42 -312zM710 216q13 39 13 195q0 443 -223 443q-82 0 -146 -47v-567q81 -67 262 -129q74 41 94 105z" />
+<glyph unicode="&#x1d52d;" horiz-adv-x="1032" d="M965 559q0 -216 -87 -319l-239 -222q-112 77 -199 117q-14 -150 -59 -448h-29q-43 179 -51 465h-18q-81 0 -138 -37l-8 28q87 87 164 117v467q0 129 -84 129q-38 0 -84 -27v39q114 56 199 113q85 -74 112 -172q179 81 299 174q222 -134 222 -424zM821 481q0 359 -170 359 q-79 0 -211 -80v-502q95 -27 262 -129q83 53 107 157q12 55 12 195z" />
+<glyph unicode="&#x1d52e;" horiz-adv-x="932" d="M797 670l8 -430q0 -373 -57 -568h-31q-52 177 -64 473q-194 -69 -311 -153q-126 80 -169.5 188t-43.5 275.5t55 251.5q32 48 135 117t158 147q74 -63 190.5 -111t217.5 -59v-19q-88 -14 -88 -112zM399 840q-70 0 -100 -142q-18 -87 -18 -198q0 -383 161 -383q49 0 110 25 l103 48v543q-245 107 -256 107z" />
+<glyph unicode="&#x1d52f;" horiz-adv-x="729" d="M360 571v-368q0 -22 49.5 -51t75 -29t121.5 70l19 -27l-117 -81q-64 -48 -107 -93q-179 123 -301 143v15q119 16 119 139v354q0 195 -100 195q-19 0 -86 -37v41q96 64 170 135q71 -50 97 -97t52 -147q70 145 219 248l134 -145l-130 -113l-104 123q-111 -114 -111 -275z " />
+<glyph unicode="&#x1d530;" horiz-adv-x="831" d="M724 537q73 -71 73 -185.5t-106 -210.5l-197 -153q-88 108 -209 108q-87 0 -150 -69l-26 24q144 158 268 158q96 0 198 -107q103 62 103 177q0 80 -49.5 140t-128.5 60q-40 0 -77 -41q-11 -12 -54 -76q-107 14 -171.5 85.5t-64.5 178.5t96 201l179 146q69 -101 188 -101 q77 0 131 72l31 -24q-138 -152 -243 -152t-196 90q-83 -47 -83 -153q0 -73 54.5 -140t125.5 -67q54 0 125 114q110 -4 183 -75z" />
+<glyph unicode="&#x1d531;" horiz-adv-x="629" d="M215 240v587h-178v70q155 0 213 164q36 100 39 293h65v-441h211v-86h-211v-643q80 -69 98.5 -69t53.5 24l63 43v-43q-69 -47 -200 -151q-114 117 -236 139v14q82 21 82 99z" />
+<glyph unicode="&#x1d532;" horiz-adv-x="1032" d="M371 631l-9 -305q0 -195 76 -195q65 0 273 123l-2 444q-1 107 -80 107v35q103 53 151 129h70v-740q0 -110 59 -110q30 0 82 35l6 -37q-65 -36 -192 -117q-96 69 -96 200v11q-173 -86 -198 -100q-133 -72 -175 -119q-70 97 -201 141v14q92 31 92 160v381q0 156 -84 156 q-25 0 -77 -31l-17 33q115 56 203 129q119 -51 119 -344z" />
+<glyph unicode="&#x1d533;" horiz-adv-x="932" d="M844 506q0 -212 -99 -311l-251 -203q-183 136 -373 145v25q92 29 92 104v430q0 47 -14 86q-20 54 -58 54q-25 0 -82 -33l-4 35q112 62 187 127q103 -83 110 -168q124 49 287 168q130 -87 172 -200q33 -86 33 -259zM692 438v109q0 287 -157 287q-48 0 -183 -78v-457 q0 -71 89 -121q29 -17 151 -61q100 40 100 321z" />
+<glyph unicode="&#x1d534;" horiz-adv-x="1458" d="M1378 535q0 -149 -40.5 -246.5t-151.5 -175.5l-79 -55q-44 -32 -69 -66q-47 42 -147 94.5t-151 52.5t-134 -50t-112 -97q-204 158 -321 158h-9v24q78 19 78 131v383q0 162 -76 162q-29 0 -76 -33v41l162 107q117 -44 127 -191q111 63 328 201q122 -74 147 -178 q204 74 322 178q202 -100 202 -440zM1229 506q0 140 -17 208q-33 132 -131 132q-44 0 -105 -30l-114 -58v-461q0 -53 95.5 -114.5t152.5 -61.5q119 0 119 385zM719 336v356q0 148 -113 148q-51 0 -227 -109v-467q0 -33 14 -49t88.5 -55t93.5 -39q71 0 111 76q33 62 33 139z " />
+<glyph unicode="&#x1d535;" horiz-adv-x="831" d="M487 676v-119h144v-78h-144v-117q0 -80 32 -143q41 -80 107 -80t140 66l8 -35l-194 -178q-137 64 -211 203q-64 -117 -191 -203l-119 119l109 110l104 -96q74 71 74 180v174h-139v78h139v8q0 273 -149 273q-57 0 -107 -37l-16 24q68 48 200 154q145 -76 193 -197 q57 108 203 197l112 -121l-125 -108l-94 98q-76 -56 -76 -172z" />
+<glyph unicode="&#x1d536;" horiz-adv-x="1032" d="M866 728q39 -115 39 -343.5t-89 -394t-296 -307.5h-69q188 128 255 302q52 136 52 394q0 463 -195 463q-58 0 -190 -84v-553q35 -44 71 -51q37 27 80 55l15 -33q-103 -66 -189 -162q-76 96 -209 127v19q58 10 75 44t17 99v399q0 154 -71 154q-31 0 -92 -31v35 q113 58 194 123q91 -62 109 -182q208 102 297 182q144 -103 196 -255z" />
+<glyph unicode="&#x1d537;" horiz-adv-x="729" d="M406 520q118 -49 191 -173.5t73 -266t-73 -261.5q-85 -141 -224 -141q-108 0 -175 88.5t-67 209t119 253.5l18 -14q-63 -87 -63 -246q0 -97 31 -165q42 -91 129 -91q161 0 161 252q0 168 -50 288q-69 163 -214 163q-57 0 -143 -43l-2 37q158 67 217 103q137 84 137 173 q0 70 -48 115t-122 45t-225 -82v41q189 93 299 178q106 -45 152 -80q79 -60 79 -146t-51 -138.5t-149 -98.5z" />
+<glyph unicode="&#x1d538;" horiz-adv-x="1521" d="M1332 81q11 -2 37.5 -8.5t26.5 -39.5t-33 -33h-577q-35 0 -35 37.5t35 37.5q27 0 74 18t47 39q0 57 -72 253h-424q-27 -123 -27 -189q0 -97 50 -116q22 -5 45 -9q25 -7 25 -32q0 -39 -35 -39h-383q-33 0 -33 37.5t33 37.5q87 0 119 83l460 1200q8 21 34 21t35 -21 l504 -1159q45 -103 94 -118zM982 132q0 -31 -20 -57h258q-23 29 -51 94l-467 1075l-69 -179l37 -84q112 -254 170 -400l76 -197q66 -170 66 -252zM807 459q-97 245 -206 492q-62 -162 -171 -492h377zM309 196q0 12 1 25l-35 -90q-12 -30 -33 -56h90q-23 40 -23 121z" />
+<glyph unicode="&#x1d539;" horiz-adv-x="1313" d="M1254 366q0 -189 -193 -288q-153 -78 -362 -78h-611q-35 0 -35 39q0 36 69 36t94.5 19t25.5 92v971q0 81 -41 101q-21 10 -113 10q-35 0 -35 37.5t35 37.5h611q479 0 479 -343q0 -171 -212 -279q129 -37 208.5 -131t79.5 -224zM1103 1000q0 224 -259 260 q82 -99 82 -272.5t-105 -257.5q282 134 282 270zM851 1000q0 106 -42 179q-52 89 -150 89q-39 0 -72.5 -19.5t-33.5 -55.5v-460h2q152 0 224 59.5t72 207.5zM1179 366q0 129 -93 206q-66 55 -205 96q106 -85 106 -302q0 -170 -83 -267q275 70 275 267zM912 366 q0 149 -54.5 220.5t-198.5 71.5h-106v-509q0 -36 33.5 -55t72.5 -19q253 0 253 291zM317 1157v-971q0 -70 -21 -111h204q-22 33 -22 74v1044q0 42 22 75h-204q21 -41 21 -111z" />
+<glyph unicode="&#x1d53a;" horiz-adv-x="1381" d="M1323 257q0 -13 -7 -24q-78 -120 -245.5 -195t-321.5 -75q-314 0 -505 197t-191 512t191 511t505 196q95 0 215 -45.5t176 -45.5q38 0 51 45.5t41 45.5q35 0 35 -33v-391q0 -36 -35 -36q-23 0 -36 27q-13 34 -44 100q-54 98 -175 178.5t-228 80.5q-188 0 -281 -237 q-68 -173 -68 -407t67 -387q93 -211 306 -211q246 0 410 152l66 68q17 16 30 16q44 0 44 -42zM1192 1222q-22 -9 -44 -9t-37 1q48 -44 81 -91v99zM325 671q0 390 167 587q-172 -68 -268 -221.5t-96 -369.5t104.5 -374t288.5 -220q-196 165 -196 598z" />
+<glyph unicode="&#x1d53b;" horiz-adv-x="1410" d="M692 1343q297 0 487.5 -175.5t190.5 -477t-185 -496t-493 -194.5h-606l-25 13q-8 13 -8 26t8 25q21 14 91 14q64 0 64 108v970q0 80 -27 98q-18 12 -103 12l-25 13q-8 13 -8 26q0 38 34 38h605zM1199 334.5q96 153.5 96 357.5t-100 343.5t-273 197.5q174 -177 174 -538 q0 -405 -163 -578q170 64 266 217.5zM1021 695q0 214 -73 369q-96 202 -285 202q-121 0 -121 -79v-1033q0 -38 33.5 -57.5t73.5 -19.5q372 0 372 618zM291 1156v-970q0 -68 -19 -111h219q-24 35 -24 79v1033q0 46 25 81h-219q18 -40 18 -112z" />
+<glyph unicode="&#x1d53c;" horiz-adv-x="1434" d="M1194 0h-1109q-42 0 -42 39q0 36 42 36q85 0 108 16q31 20 31 95v978q0 74 -36 93q-21 11 -103 11q-42 0 -42 37.5t42 37.5h1071q33 -13 33 -35v-319q0 -35 -37 -35q-14 0 -31 13q-9 18 -12.5 54.5t-11.5 53.5q-46 98 -153.5 145.5t-229.5 47.5h-125q-54 0 -54 -106v-429 q283 0 283 276q0 36 37.5 36t37.5 -36v-591q0 -33 -37.5 -33t-37.5 33q0 238 -283 238v-475q0 -106 54 -106h145q130 0 252 86.5t188 208.5q11 21 20.5 65.5t19.5 64.5q18 14 32 14t26.5 -13t10.5 -28l-55 -439q-1 -9 -10 -21q-19 -13 -24 -13zM1114 1268h-98q59 -34 98 -79 v79zM818 630v143q-40 -48 -98 -76q59 -25 98 -67zM1178 241q-80 -102 -188 -166h168zM460 181v981q0 61 20 106h-201q20 -39 20 -104v-978q0 -70 -21 -111h202q-20 45 -20 106z" />
+<glyph unicode="&#x1d53d;" horiz-adv-x="1300" d="M1167 991q0 -37 -35 -37q-39 0 -39 37q0 133 -129 211q-110 66 -252 66h-121q-55 0 -55 -111v-424q286 0 286 276q0 36 36 36t36 -36v-591q0 -33 -36 -33t-36 33q0 238 -286 238v-487q0 -70 51 -86q26 -8 125 -8q41 0 41 -36q0 -39 -35 -39h-631q-34 0 -34 39q0 36 57 36 q78 0 96.5 19t18.5 92v975q0 74 -27 92q-19 14 -97 14q-48 0 -48 38t34 38h1048q32 0 32 -35v-317zM1092 1268h-92q54 -32 92 -74v74zM819 632v139q-40 -46 -98 -74q58 -25 98 -65zM300 1161v-975q0 -71 -17 -111h197q-19 36 -19 94v988q0 64 21 111h-200q18 -39 18 -107z " />
+<glyph unicode="&#x1d53e;" horiz-adv-x="1434" d="M1448 535q0 -27 -25.5 -33t-48.5 -12q-88 -50 -88 -141v-227q0 -16 -19 -30q-79 -58 -238 -93.5t-280 -35.5q-314 0 -505 197t-191 512t191 511t505 196q97 0 213 -45.5t177 -45.5q38 0 51 45.5t41 45.5q35 0 35 -33v-391q0 -36 -35 -36q-24 0 -37 27q-12 34 -41 101 q-50 96 -174 177t-230 81q-187 0 -280 -237q-68 -173 -68 -397q0 -633 355 -633q224 0 224 87v224q0 63 -51 106t-115 43q-34 0 -34 37t34 37h599q35 0 35 -37zM1191 1222q-22 -9 -43 -9t-34 1q45 -42 77 -86v94zM1055 349v-224q0 -24 -6 -44q107 28 162 63v205q0 80 51 148 h-268q61 -62 61 -148zM224.5 1037q-96.5 -154 -96.5 -362t90.5 -359.5t252.5 -222.5q-145 177 -145 572.5t166 592.5q-171 -67 -267.5 -221z" />
+<glyph unicode="&#x1d53f;" horiz-adv-x="1676" d="M1463 76q48 0 48 -38t-35 -38h-599q-33 0 -33 39q0 36 55 36q78 0 97 19t19 92v446h-467v-457q0 -69 30 -87q20 -12 94 -12q48 0 48 -38t-35 -38h-599q-33 0 -33 39q0 36 57 36q78 0 96.5 19t18.5 92v982q0 69 -31 87q-20 11 -92 11q-49 0 -49 38.5t33 38.5h599 q35 0 35 -37.5t-57 -37.5q-78 0 -96.5 -19t-18.5 -92v-429h467v440q0 69 -31 88q-20 11 -92 11q-48 0 -48 38t33 38h599q35 0 35 -37.5t-57 -37.5q-78 0 -97 -19t-19 -92v-982q0 -69 30 -87q20 -12 95 -12zM1263 175v982q0 72 17 111h-208q18 -38 18 -100v-982 q0 -72 -17 -111h208q-18 38 -18 100zM473 175v982q0 72 17 111h-208q18 -38 18 -100v-982q0 -71 -17 -111h208q-18 38 -18 100z" />
+<glyph unicode="&#x1d540;" horiz-adv-x="901" d="M687 76q50 0 50 -38t-35 -38h-614q-35 0 -35 39q0 36 66.5 36t90 19.5t23.5 91.5v975q0 74 -31 93q-21 13 -100 13q-49 0 -49 38t35 38h614q35 0 35 -37.5t-66.5 -37.5t-90 -19.5t-23.5 -91.5v-971q0 -78 24 -94t106 -16zM308 1161v-975q0 -70 -20 -111h213 q-19 40 -19 111v971q0 70 20 111h-214q20 -39 20 -107z" />
+<glyph unicode="&#x1d541;" horiz-adv-x="1131" d="M940 1343q35 0 35 -37.5t-57 -37.5q-78 0 -96.5 -19t-18.5 -92v-937q0 -186 -128 -282q-113 -85 -305 -85q-119 0 -209 51q-108 61 -108 171q0 57 43 97.5t100 40.5t100 -40.5t43 -87.5t-27.5 -92.5t-27.5 -48.5q0 -17 77 -17q47 0 83 34t36 80v1120q0 69 -36 91 q-25 16 -94 16t-69 37.5t34 37.5h625zM555 1161v-1120q0 -50 -25 -92q198 59 198 271v937q0 72 17 111h-213q23 -41 23 -107zM211 -38q4 17 28.5 56.5t24.5 60t-20.5 40t-47.5 19.5t-47.5 -19.5t-20.5 -43.5q0 -71 83 -113z" />
+<glyph unicode="&#x1d542;" horiz-adv-x="1637" d="M1478.5 75q34.5 0 34.5 -37.5t-34 -37.5h-502q-34 0 -34 39q0 24 26 33q1 0 29 4t28 8q0 12 -55 78l-370 444l-52 -51v-373q0 -71 22.5 -89t86 -18t63.5 -36q0 -39 -34 -39h-599q-35 0 -35 39q0 36 57 36q78 0 97 19t19 92v975q0 78 -32 96q-20 11 -106 11 q-35 0 -35 37.5t35 37.5h599q34 0 34 -37.5t-57 -37.5q-78 0 -96.5 -19t-18.5 -92v-479l419 402q42 40 42 86t-24 74t-60 28q-32 0 -32 37.5t32 37.5h479q35 0 35 -37q0 -29 -32 -37q-27 -4 -54 -9q-79 -23 -173 -101q-35 -29 -149 -138l-212 -204l575 -690q49 -52 83.5 -52 zM1085 1176v-1q67 56 123 93h-150q27 -42 27 -92zM1340 75q0 1 -71 85l-511 614l-111 -106l415 -495q39 -48 39 -89v-9h239zM474 182v975q0 72 17 111h-208q18 -39 18 -107v-975q0 -71 -17 -111h208q-18 39 -18 107z" />
+<glyph unicode="&#x1d543;" horiz-adv-x="1352" d="M1189 0h-1102q-34 0 -34 39q0 36 57 36q78 0 96.5 19t18.5 92v975q0 71 -22.5 89t-86 18t-63.5 37.5t34 37.5h581q35 0 35 -37.5t-41 -37.5q-84 0 -102.5 -16.5t-18.5 -94.5v-971q0 -111 55 -111h135q129 0 254.5 69t188.5 179l24 71q17 49 44 49q14 0 26 -12t10 -26 l-55 -377q-4 -28 -34 -28zM1171 194q-65 -70 -155 -119h138zM466 186v971q0 72 15 111h-200q19 -40 19 -107v-975q0 -71 -17 -111h204q-21 47 -21 111z" />
+<glyph unicode="&#x1d544;" horiz-adv-x="1990" d="M1798 75q36 0 36 -37.5t-36 -37.5h-589q-34 0 -34 34t33 41q13 1 46 6.5t61.5 35.5t28.5 69v986l-483 -1149q-10 -23 -33 -23t-33 23l-484 1149v-954q0 -89 28.5 -116t118.5 -27q36 0 36 -37.5t-36 -37.5h-370q-35 0 -35 39q0 34 44 36q66 3 83 13q44 24 44 112v1050 q-51 18 -129 18q-34 0 -34 37.5t34 37.5h430q22 0 31 -22l377 -900l379 900q9 22 30 22h444q35 0 35 -37q0 -26 -26 -35q-23 -3 -54.5 -8.5t-60 -36t-28.5 -69.5v-971q0 -52 45.5 -81.5t100.5 -29.5zM1577 186v971q0 70 38 111h-196v-1082q0 -68 -38 -111h236 q-40 46 -40 111zM892 324l-395 944h-145l469 -1113z" />
+<glyph unicode="&#x1d545;" horiz-adv-x="1540" d="M1347 1343q33 0 33 -33.5t-29 -40.5l-53 -4q-50 -9 -63 -51q-7 -22 -7 -87v-1130q0 -34 -36 -34q-19 0 -30 14l-851 1125v-884q0 -89 28.5 -116t118.5 -27q36 0 36 -37.5t-36 -37.5h-370q-35 0 -35 39q0 34 44 36q66 3 83 13q44 24 44 112v1009q-53 59 -113 59 q-33 0 -33 37.5t33 37.5h407q14 0 26 -16l596 -802v596q0 92 -27 119.5t-119 27.5q-36 0 -36 37.5t36 37.5h353zM1140 129v269l-646 870h-214z" />
+<glyph unicode="&#x1d546;" horiz-adv-x="1493" d="M1258.5 1183q191.5 -196 191.5 -511.5t-191.5 -512t-506.5 -196.5t-507 196.5t-192 512t192 511.5t507 196t506.5 -196zM1284 314.5q91 151.5 91 357t-91 356.5t-254 222q145 -178 145 -578t-144 -580q162 71 253 222.5zM1100 671.5q0 633.5 -349 633.5t-349 -633.5 t349 -633.5t349 633.5zM473 93q-146 180 -146 577.5t144 578.5q-162 -71 -252.5 -222t-90.5 -355.5t91 -356t254 -222.5z" />
+<glyph unicode="&#x1d547;" horiz-adv-x="1207" d="M681 599l-86 2q-14 0 -57 -1v-418q0 -78 33 -96q20 -11 107 -11q34 0 34 -37.5t-34 -37.5h-591q-34 0 -34 39q0 36 40 36q84 0 102.5 16.5t18.5 94.5v975q0 71 -18 89t-94 18q-49 0 -49 37.5t34 37.5h596q214 0 347 -78q165 -96 165 -289t-171 -294q-142 -83 -343 -83z M1120 970q0 219 -250 278q59 -79 59 -271.5t-63 -279.5q254 69 254 273zM821 766q33 64 33 209.5t-30 204.5q-44 88 -180 88q-39 0 -72.5 -19.5t-33.5 -55.5v-518h105q130 0 178 91zM289 1161v-975q0 -72 -15 -111h208q-19 39 -19 107v1011q0 42 23 75h-213q16 -38 16 -107z " />
+<glyph unicode="&#x1d548;" horiz-adv-x="1493" d="M1261 -223l127 17q37 0 37 -38q0 -46 -144 -76.5t-224 -30.5q-168 0 -311.5 94t-210.5 248q-233 64 -357.5 248t-124.5 432q0 315 192 511.5t507 196.5t506.5 -196.5t191.5 -511.5q0 -260 -135.5 -446.5t-384.5 -241.5q46 -94 136 -150t195 -56zM1033 95 q165 72 253.5 223.5t88.5 354.5t-91 354.5t-254 222.5q145 -178 145 -576.5t-142 -578.5zM402 671q0 -634 349 -634t349 634t-349 634t-349 -634zM128 671q0 -417 340 -574q-141 182 -141 576.5t144 575.5q-162 -72 -252.5 -223t-90.5 -355zM853 -26q-47 -12 -108 -12 t-119 20q151 -258 431 -258q15 0 50 4q-148 54 -254 246z" />
+<glyph unicode="&#x1d549;" horiz-adv-x="1548" d="M1366 75q33 0 33 -37.5t-33 -37.5h-339q-16 0 -25 14l-387 598h-65v-430q0 -71 23 -89t87 -18t64 -36q0 -39 -34 -39h-603q-34 0 -34 39q0 36 67.5 36t87 19t19.5 92v975q0 71 -23.5 89t-87 18t-63.5 37.5t34 37.5h645q201 0 346 -81q177 -99 177 -285q0 -281 -342 -343 q356 -559 453 -559zM925 713q255 58 255 261.5t-263 271.5q72 -88 72 -269t-64 -264zM596 686q186 0 252 54.5t66 221t-54.5 236.5t-200.5 70q-109 0 -109 -75v-507h46zM1231 75q-147 136 -411 564q-48 -17 -118 -24l350 -540h179zM302 1161v-975q0 -71 -18 -111h210 q-19 40 -19 107v1011q0 42 22 75h-214q19 -40 19 -107z" />
+<glyph unicode="&#x1d54a;" horiz-adv-x="1127" d="M1038 377q0 -199 -175 -308q-148 -93 -359 -93q-48 0 -138.5 28t-132 28t-80.5 -28t-45 -28q-38 0 -38 37v409q0 52 38 52q35 0 35 -37v-17q0 -128 118 -248.5t245 -120.5t193 48t66 166.5t-116 206.5q-66 50 -226 119.5t-244 139.5q-126 107 -126 248q0 200 123 300 t328 100q48 0 140.5 -27t133.5 -27t81 27t47 27q37 0 37 -33v-361q0 -37 -37 -37q-26 0 -39.5 39.5t-23.5 73.5q-33 89 -139 166.5t-199.5 77.5t-153.5 -54t-60 -148.5t148 -177.5q27 -15 234 -102q365 -154 365 -446zM868 1170v100q-36 -17 -73 -20q43 -38 73 -80zM963 377 q0 188 -194 308l-359 173q-194 102 -194 247q0 75 32 135q-120 -82 -120 -261q0 -145 185 -248l342 -172q185 -116 185 -290q0 -83 -27 -143q150 90 150 251zM220 107q-43 40 -75 88v-108q37 18 75 20z" />
+<glyph unicode="&#x1d54b;" horiz-adv-x="1366" d="M1234 973q0 -36 -37.5 -36t-37.5 36q0 127 -111 209t-243 84v-1084q0 -74 37 -94q22 -11 101 -11q52 0 52 -38.5t-36 -38.5h-633q-33 0 -33 33.5t29 40.5q7 1 61 1t76.5 23.5t22.5 87.5v1080q-104 -1 -198.5 -54t-136.5 -143q-8 -50 -27 -117q-9 -15 -30 -15 q-37 0 -37 36v335q0 35 35 35h1112q34 0 34 -35v-335zM1159 1268h-108q66 -35 108 -84v84zM128 1268v-88q42 53 101 88h-101zM730 182v1086h-173v-1082q0 -69 -23 -111h217q-21 40 -21 107z" />
+<glyph unicode="&#x1d54c;" horiz-adv-x="1562" d="M1409 1306q0 -28 -29 -37q-26 -5 -51 -11q-92 -37 -92 -246v-519q0 -247 -131 -388.5t-372 -141.5t-380.5 121t-139.5 354v723q0 71 -18 89t-94 18q-49 0 -49 37.5t34 37.5h591q34 0 34 -37q0 -30 -29 -36q-7 -2 -61.5 -2t-73 -24.5t-18.5 -86.5v-714q0 -176 39 -263 q58 -129 214 -129q366 0 366 445v516q0 256 -136 256q-36 0 -36 37.5t36 37.5h363q33 0 33 -37zM1228 1268h-69q21 -28 35 -63q14 36 34 63zM455 443v714q0 69 21 111h-203q16 -38 16 -107v-723q0 -307 272 -380q-106 110 -106 385z" />
+<glyph unicode="&#x1d54d;" horiz-adv-x="1581" d="M1429 1343q35 0 35 -37.5t-35 -37.5q-87 0 -123 -87l-497 -1196q-9 -22 -34 -22t-35 22l-525 1158q-47 104 -95 118q-11 2 -39 10t-28 35q0 37 35 37h579q34 0 34 -37.5t-34 -37.5q-122 0 -122 -55q0 -122 330 -841q118 276 159 390q93 257 93 399q0 70 -29 93 q-10 7 -54 17q-29 5 -29 35q0 37 34 37h380zM1202 1161q0 -18 -1 -38l36 87q13 31 35 58h-91q21 -40 21 -107zM470 1213q0 31 13 55h-252q23 -28 52 -94l490 -1080l70 168q-373 798 -373 951z" />
+<glyph unicode="&#x1d54e;" horiz-adv-x="2114" d="M1949 1343q34 0 34 -37.5t-34 -37.5q-50 0 -79 -82l-425 -1196q-10 -27 -36.5 -27t-36.5 27l-329 869l-380 -874q-10 -22 -36.5 -22t-36.5 27l-410 1159q-23 66 -31 81q-21 38 -51 38q-45 0 -45 37.5t35 37.5h483q34 0 34 -37.5t-34 -37.5q-74 0 -74 -43q0 -119 101 -417 l155 -423l250 579l-74 195q-33 86 -79 103q-21 5 -42 12t-21 32q0 37 34 37h539q35 0 35 -37.5t-35 -37.5q-24 0 -62 -15.5t-38 -35.5q0 -107 99 -389l151 -395q95 262 120 347q64 214 64 355q0 108 -56 128q-22 5 -45.5 11t-23.5 32q0 37 36 37h344zM1826 1268h-84 q27 -42 27 -127v-6v-9l30 85q12 32 27 57zM1185 1217q0 27 16 51h-247q41 -51 70 -134l54 -157l329 -869l71 198q-293 736 -293 911zM422 1225q0 23 9 43h-218q13 -25 38 -94l380 -1075l79 182q-141 372 -183 499q-105 313 -105 445z" />
+<glyph unicode="&#x1d54f;" horiz-adv-x="1534" d="M1400 39q0 -39 -34 -39h-588q-34 0 -34 37.5t34 37.5q133 0 133 30q0 67 -202 355l-40 57l-216 -247q-43 -49 -43 -93t23 -73t58 -29t35 -37.5t-34 -37.5h-405q-34 0 -34 39q0 23 26 33q22 6 45 11q60 18 250 233l244 277q-60 96 -289 428l-80 120q-59 85 -88 104l-60 21 q-40 14 -40 40q0 37 34 37h569q34 0 34 -37.5t-34 -37.5q-103 0 -103 -30q0 -47 212 -355l144 191q38 50 38 111.5t-53.5 79t-53.5 41.5q0 37 36 37h458q34 0 34 -37q0 -30 -40 -40l-64 -8q-127 -26 -279 -227l-170 -224q438 -679 496 -716q25 -8 53 -18t28 -34zM1120 1268 h-109q17 -32 19 -80q49 51 90 80zM486 1238q0 16 5 30h-248q36 -33 73 -90l556 -831q114 -182 114 -242q0 -16 -5 -30h248q-3 3 -46 63t-283 420l-318 475q-96 153 -96 205zM362 75q-24 39 -27 84q-50 -50 -90 -84h117z" />
+<glyph unicode="&#x1d550;" horiz-adv-x="1511" d="M1393 1306q0 -23 -32 -37q-62 -27 -117 -102q-4 -5 -85 -135l-274 -440v-374q0 -96 23.5 -119.5t125.5 -23.5q34 0 34 -37.5t-34 -37.5h-619q-33 0 -33 39q0 36 39 36q95 0 118 22.5t23 111.5v306l-348 623q-17 34 -58 98q-21 25 -62 33t-41 37q0 37 35 37h500 q33 0 33 -33t-40 -42q-32 -4 -63 -9q1 -20 36 -82l289 -515l252 408q20 32 20 77.5t-35.5 83t-85.5 37.5q-36 0 -36 37.5t36 37.5h366q33 0 33 -37zM1232 1268h-86q22 -28 33 -62q38 48 53 62zM810 218v348l-345 615q-19 37 -23 87h-216q6 -8 53 -93l358 -640v-326 q0 -89 -22 -134h218q-23 46 -23 143z" />
+<glyph unicode="&#x1d551;" horiz-adv-x="1351" d="M1157 0h-1069q-35 0 -35 39q0 10 749 1229h-147q-326 0 -431 -191l-23 -73q-16 -50 -43 -50q-37 0 -37 33v7l35 314q4 35 33 35h961q35 0 35 -37q0 -12 -4 -19l-744 -1212h277q135 0 247 66.5t173 184.5l38 121q12 32 37 32q37 0 37 -29q0 -3 -1 -7l-56 -407 q-5 -36 -32 -36zM318 1268h-91l-8 -74q42 43 99 74zM1081 1268h-191l-731 -1193h190zM1135 192q-59 -70 -139 -117h123z" />
+<glyph unicode="&#x1d552;" horiz-adv-x="1411" d="M1173 75q61 0 61 -37.5t-36 -37.5h-222q-181 0 -210 102q-39 -52 -121 -82.5t-156 -30.5q-163 0 -281 47q-163 64 -163 201q0 185 281 271q192 59 435 59v77q0 100 -57 170t-155 70q-49 0 -155 -24q43 -44 43 -106t-48.5 -98.5t-107.5 -36.5t-107.5 36t-48.5 94 q0 210 427 210q183 0 322 -65q180 -84 180 -245v-515q0 -59 119 -59zM979 134v515q0 144 -211 205q68 -89 68 -210v-377q0 -48 -16 -91q16 -60 44 -80.5t112 -20.5h16q-13 25 -13 59zM200 749q0 -19 22 -37t58.5 -18t59 18.5t22.5 43.5t-20 50l-44 45q-98 -35 -98 -102z M761 267v225q-148 -1 -268 -55q-155 -71 -155 -200q0 -69 55 -121.5t136.5 -52.5t156.5 57t75 147zM120 237q0 -116 203 -157q-60 70 -60 157q0 120 95 202q-238 -68 -238 -202z" />
+<glyph unicode="&#x1d553;" horiz-adv-x="1350" d="M1065 795q135 -128 135 -341.5t-146 -339t-365 -125.5q-176 0 -297 122l-97 -111h-216q-34 0 -34 37.5t34 37.5q59 0 59 116v1010q0 117 -59 117q-34 0 -34 37.5t34 37.5h306q35 0 35 -34v-527q126 91 298 91q212 0 347 -128zM921 115q204 102 204 346t-202 343 q79 -113 79 -343t-81 -346zM652 63q275 0 275 392.5t-248 392.5q-160 0 -259 -122v-529q84 -134 232 -134zM345 1318h-155q23 -50 23 -117v-1010q0 -67 -23 -116h71l84 97v1146z" />
+<glyph unicode="&#x1d554;" horiz-adv-x="1109" d="M960 759q0 -58 -39.5 -99t-97 -41t-98 41t-40.5 99t36 96q-66 29 -136 29q-247 0 -247 -410.5t294 -410.5q95 0 160 58q39 36 73.5 101.5t48.5 65.5q42 0 42 -30q0 -9 -3 -17q-43 -121 -141 -186.5t-229 -65.5q-228 0 -383 129.5t-155 353.5t154.5 355.5t383.5 131.5 q377 0 377 -200zM824 694q61 0 61 63t-68 94q-57 -53 -57 -92q0 -65 64 -65zM369 103q-106 129 -106 368t78 361q-221 -107 -221 -367.5t249 -361.5z" />
+<glyph unicode="&#x1d555;" horiz-adv-x="1317" d="M1165 75q35 0 35 -37.5t-35 -37.5h-340v86q-110 -97 -269 -97q-219 0 -365 125.5t-146 339t135 341.5t347 128q171 0 298 -91v369q0 117 -58 117q-35 0 -35 37.5t35 37.5h306q34 0 34 -34v-1168q0 -116 58 -116zM1032 191v1127h-155q23 -49 23 -117v-1126h155 q-23 49 -23 116zM565 848q-248 0 -248 -392.5t275 -392.5q148 0 233 134v529q-99 122 -260 122zM322 115q-80 117 -80 344.5t79 343.5q-201 -100 -201 -342.5t202 -345.5z" />
+<glyph unicode="&#x1d556;" horiz-adv-x="1242" d="M1119 504q0 -44 -37 -44h-743v-5q0 -183 40 -267q58 -125 220 -125q223 0 356 131q82 81 90 81q34 0 34 -25t-29 -64q-147 -197 -458 -197q-240 0 -393.5 127t-153.5 355t155 358t378.5 130t382 -120t158.5 -335zM898 535h145q-17 215 -232 306q87 -123 87 -306zM823 535 q0 135 -53 231q-66 118 -191.5 118t-189.5 -117q-50 -93 -50 -227v-5h484zM340 832q-220 -107 -220 -359t212 -356q-70 114 -70 352t78 363z" />
+<glyph unicode="&#x1d557;" horiz-adv-x="873" d="M935 1266q0 -55 -42 -98t-97.5 -43t-99 42.5t-43.5 101.5t52 106q-13 10 -31 10q-193 0 -193 -368v-94h146q35 0 35 -37.5t-35 -37.5h-146v-657q0 -87 33 -109l38 -14q20 -8 20 -31q0 -37 -34 -37h-399q-34 0 -34 37.5t34 37.5q58 0 58 116v657h-117q-35 0 -35 37.5 t35 37.5h117v132q0 193 111.5 299t305.5 106q321 0 321 -194zM860 1266q0 67 -78 96q-4 -22 -29 -45t-25 -49t21 -47t46 -21t45 20.5t20 45.5zM272 1055v-864q0 -67 -23 -116h176q-19 38 -19 116v826q0 243 80 352q-214 -60 -214 -314z" />
+<glyph unicode="&#x1d558;" horiz-adv-x="1390" d="M413 154l168 2q259 0 392 -47q215 -77 215 -286q0 -153 -225 -221q-147 -44 -351 -44t-348 44q-219 68 -219 221q0 125 178 176q-104 91 -104 230q0 106 67 188q-105 84 -105 221q0 159 165 246q133 69 326.5 69t307.5 -66q101 77 231 77q52 0 91 -38t39 -84t-28.5 -74.5 t-68 -28.5t-68.5 28.5t-29 57.5t6 46q-56 -10 -108 -34q81 -84 81 -199q0 -160 -164 -246q-132 -69 -317 -69t-293 52q-17 -28 -17 -60q0 -62 57.5 -111.5t120.5 -49.5zM1166 836q0 40 -43 51v-26q-1 -18 -1 -25q0 -22 22 -22t22 22zM951 638q0 165 -190 218q47 -74 47 -212 t-39 -211q182 66 182 205zM705 471q28 53 28 169t-31 169q-41 69 -149.5 69t-149.5 -74q-28 -53 -28 -169t31 -169q41 -69 149.5 -69t149.5 74zM347 420q-47 75 -47 213t39 210q-183 -66 -183 -205q0 -81 54 -138t137 -80zM610 82l-197 -3q-135 0 -216 119q8 -34 57 -114.5 t49 -105.5q0 -5 -1 -9q45 44 132 44h205q330 0 330 -196q0 -90 -54 -150q198 49 198 156q0 259 -503 259zM894 -183q0 121 -268 121h-192q-63 0 -84.5 -28.5t-21.5 -92.5q0 -100 97 -151q77 -41 186 -41t186 41q97 51 97 151zM306 -332q-53 60 -53 144t28 131l-95 -40 q-66 -31 -66 -80q0 -106 186 -155z" />
+<glyph unicode="&#x1d559;" horiz-adv-x="1352" d="M1175 75q35 0 35 -37.5t-35 -37.5h-399q-35 0 -35 37.5t35 37.5q59 0 59 116v469q0 188 -107 188q-122 0 -215 -95t-93 -217v-345q0 -116 59 -116q35 0 35 -37.5t-35 -37.5h-400q-34 0 -34 37.5t34 37.5q59 0 59 116v1010q0 117 -59 117q-34 0 -34 37.5t34 37.5h306 q35 0 35 -34v-619q54 84 144 133.5t189 49.5q364 0 364 -291v-441q0 -116 58 -116zM1042 191v441q0 170 -169 205q37 -68 37 -177v-469q0 -66 -23 -116h177q-22 48 -22 116zM345 191v1127h-155q23 -50 23 -117v-1010q0 -66 -23 -116h177q-22 49 -22 116z" />
+<glyph unicode="&#x1d55a;" horiz-adv-x="633" d="M440 1245q0 -67 -49 -116t-116 -49t-115 49t-48 116t48 115.5t115 48.5t116 -48.5t49 -115.5zM479 75q35 0 35 -37.5t-35 -37.5h-400q-34 0 -34 37.5t34 37.5q59 0 59 108v560q0 105 -59 105q-34 0 -34 37.5t34 37.5h306q35 0 35 -34v-698q0 -116 59 -116zM338 1182 q27 27 27 62.5t-27 62.5t-63 27t-62 -26.5t-26 -63t26.5 -63t62 -26.5t62.5 27zM345 191v657h-155q23 -47 23 -105v-560q0 -60 -23 -108h177q-22 49 -22 116z" />
+<glyph unicode="&#x1d55b;" horiz-adv-x="947" d="M757 1245q0 -67 -48 -116t-115 -49t-116 49t-49 116t49 115.5t116 48.5t115 -48.5t48 -115.5zM738 -4q0 -193 -112 -298.5t-306 -105.5q-320 0 -320 194q0 55 42 98t97.5 43t99 -42.5t43.5 -100.5t-52 -106q18 -11 41 -11q185 0 185 325v738q0 118 -59 118 q-35 0 -35 37.5t35 37.5h306q35 0 35 -34v-893zM655.5 1181.5q26.5 26.5 26.5 63t-26 63t-62 26.5t-63 -26.5t-27 -62.5t27 -63t62.5 -27t62 26.5zM663 -4v852h-155q23 -50 23 -118v-738q0 -202 -74 -307q206 63 206 311zM139 -304q68 63 68 88.5t-21 46.5t-46 21t-45 -20.5 t-20 -45.5q0 -62 64 -90z" />
+<glyph unicode="&#x1d55c;" horiz-adv-x="1265" d="M1065 75q35 0 35 -37.5t-35 -37.5h-430q-36 0 -36 35.5t40.5 38.5t47.5 11q-2 22 -50 83l-190 239l-27 -23v-197q0 -112 59 -112q35 0 35 -37.5t-35 -37.5h-400q-34 0 -34 37.5t34 37.5q59 0 59 116v1010q0 117 -59 117q-34 0 -34 37.5t34 37.5h306q35 0 35 -34v-875 l225 204q52 47 52 98t-38 62t-38 39q0 36 34 36h369q35 0 35 -37.5t-35 -37.5q-95 0 -385 -266l293 -369q110 -138 133 -138zM839 848h-75q7 -21 8 -49q35 28 67 49zM950 75q-131 126 -360 441q-35 -34 -77 -69q158 -192 216 -275q29 -41 34 -97h187zM345 187v1131h-155 q23 -50 23 -117v-1010q0 -66 -23 -116h178q-23 48 -23 112z" />
+<glyph unicode="&#x1d55d;" horiz-adv-x="710" d="M479 75q35 0 35 -37.5t-35 -37.5h-400q-34 0 -34 37.5t34 37.5q59 0 59 112v1018q0 67 -24 93q-10 11 -45 24q-24 10 -24 35q0 36 34 36h306q35 0 35 -34v-1168q0 -116 59 -116zM345 191v1127h-154q22 -42 22 -113v-1018q0 -63 -23 -112h177q-22 49 -22 116z" />
+<glyph unicode="&#x1d55e;" horiz-adv-x="2099" d="M1871 75q35 0 35 -37.5t-35 -37.5h-399q-35 0 -35 37.5t35 37.5q59 0 59 116v462q0 195 -106 195q-122 0 -215 -95t-93 -217v-345q0 -116 58 -116q35 0 35 -37.5t-35 -37.5h-399q-35 0 -35 37.5t35 37.5q59 0 59 116v462q0 195 -107 195q-122 0 -215 -95t-93 -217v-345 q0 -116 59 -116q35 0 35 -37.5t-35 -37.5h-400q-34 0 -34 37.5t34 37.5q59 0 59 116v539q0 118 -59 118q-34 0 -34 37.5t34 37.5h306q35 0 35 -34v-149q54 84 144 133.5t189 49.5q302 0 353 -200q135 200 344 200q363 0 363 -291v-441q0 -116 58 -116zM1738 191v441 q0 170 -169 205q37 -68 37 -184v-462q0 -66 -23 -116h177q-22 48 -22 116zM1042 191v345q0 45 12 90q-27 102 -62.5 149t-119.5 64q38 -70 38 -186v-462q0 -66 -23 -116h177q-22 48 -22 116zM345 191v657h-156q24 -50 24 -118v-539q0 -66 -23 -116h177q-22 49 -22 116z" />
+<glyph unicode="&#x1d55f;" horiz-adv-x="1403" d="M1175 75q35 0 35 -37.5t-35 -37.5h-399q-35 0 -35 37.5t35 37.5q59 0 59 116v469q0 188 -107 188q-122 0 -215 -95t-93 -217v-345q0 -116 59 -116q35 0 35 -37.5t-35 -37.5h-400q-34 0 -34 37.5t34 37.5q59 0 59 116v539q0 118 -59 118q-34 0 -34 37.5t34 37.5h306 q35 0 35 -34v-149q54 84 144 133.5t189 49.5q364 0 364 -291v-441q0 -116 58 -116zM1042 191v441q0 170 -169 205q37 -68 37 -177v-469q0 -67 -23 -116h177q-22 48 -22 116zM345 191v657h-155q23 -50 23 -118v-539q0 -67 -23 -116h177q-22 49 -22 116z" />
+<glyph unicode="&#x1d560;" horiz-adv-x="1281" d="M589 959q235 0 390.5 -133t155.5 -361t-157.5 -352t-388.5 -124t-387.5 124t-156.5 352t154.5 361t389.5 133zM852 121q208 104 208 345t-201 354q58 -101 58 -345.5t-65 -353.5zM810 205q32 84 32 277.5t-35 274.5q-56 127 -218 127t-217 -127q-35 -81 -35 -275t31 -277 q55 -142 221 -142t221 142zM326 121q-64 109 -64 351t58 348q-200 -112 -200 -353.5t206 -345.5z" />
+<glyph unicode="&#x1d561;" horiz-adv-x="1330" d="M688 923q219 0 365 -125.5t146 -339t-134.5 -341.5t-346.5 -128q-172 0 -298 91v-436q0 -33 -35 -33h-306q-34 0 -34 37.5t34 37.5q59 0 59 117v927q0 118 -59 118q-34 0 -34 37.5t34 37.5h341v-96q109 96 268 96zM923 108q201 100 201 343.5t-203 345.5q80 -116 80 -344 t-78 -345zM679 63q247 0 247 392.5t-274 392.5q-147 0 -232 -135v-528q98 -122 259 -122zM345 -314v1162h-155q23 -50 23 -118v-927q0 -67 -23 -117h155z" />
+<glyph unicode="&#x1d562;" horiz-adv-x="1347" d="M1199 -354q0 -35 -34 -35h-307q-34 0 -34 33v436q-126 -91 -299 -91q-212 0 -346 128t-134 341.5t146 339t365 125.5q174 0 295 -122l98 112h216q34 0 34 -37.5t-34 -37.5q-59 0 -59 -118v-917q0 -71 24 -98q10 -11 39.5 -22t29.5 -37zM899 -314h154q-22 43 -22 117v917 q0 68 23 118h-71l-87 -99l3 -4v-1049zM591 848q-274 0 -274 -392.5t247 -392.5q161 0 260 122v528q-85 135 -233 135zM322 796q-202 -102 -202 -345t200 -342q-78 116 -78 344t80 343z" />
+<glyph unicode="&#x1d563;" horiz-adv-x="1023" d="M900 751q0 -54 -37.5 -92t-91.5 -38t-92 38t-38 95t30 94q-127 -3 -197 -161q-54 -123 -54 -270v-226q0 -116 59 -116q34 0 34 -37.5t-34 -37.5h-400q-34 0 -34 37.5t34 37.5q59 0 59 116v539q0 118 -59 118q-34 0 -34 37.5t34 37.5h306q35 0 35 -34v-163q79 197 253 197 q87 0 157 -45t70 -127zM716 751q0 -55 54.5 -55t54.5 56t-75 83q-34 -46 -34 -84zM345 191v657h-155q23 -50 23 -118v-539q0 -67 -23 -116h177q-22 49 -22 116z" />
+<glyph unicode="&#x1d564;" horiz-adv-x="1248" d="M1106 302q0 -166 -193 -250q-145 -63 -337 -63q-257 0 -370 64q-89 -64 -125 -64t-36 28v298q0 35 37.5 35t37.5 -35q0 -124 174 -196q136 -56 282 -56q95 0 158 34q80 43 80 130q0 97 -199 150l-371 89q-199 69 -199 209q0 155 199 230q144 54 355.5 54t307.5 -40 q68 40 111 40q28 0 28 -28v-239q0 -35 -37.5 -35t-37.5 35q0 92 -157 148q-123 44 -242 44q-234 0 -234 -130q0 -78 199 -127q337 -83 370 -96q199 -79 199 -229zM971 840v28q-10 -5 -22 -12q12 -8 22 -16zM1031 302q0 116 -199 177l-370 90q-199 63 -199 185q0 48 19 85 q-162 -55 -162 -164q0 -101 199 -154l371 -89q199 -68 199 -205q0 -67 -30 -116q172 64 172 191zM157 110q-20 16 -37 32v-57z" />
+<glyph unicode="&#x1d565;" horiz-adv-x="945" d="M771 923q35 0 35 -37.5t-35 -37.5h-244v-577q0 -193 85.5 -193t85.5 216q0 41 37.5 41t37.5 -35q0 -147 -41 -218q-54 -93 -191 -93q-302 0 -302 260v599h-159q-35 0 -35 37.5t35 37.5q243 0 290 329q17 119 89 119q68 0 68 -92v-356h244zM452 271v1004l-46 -187 q-27 -99 -103 -165h11v-674q0 -168 184 -183q-46 70 -46 205z" />
+<glyph unicode="&#x1d566;" horiz-adv-x="1406" d="M1175 75q35 0 35 -37.5t-35 -37.5h-306q-34 0 -34 34v149q-54 -84 -144 -133.5t-189 -49.5q-364 0 -364 292v438q0 118 -59 118q-34 0 -34 37.5t34 37.5h400q35 0 35 -37.5t-35 -37.5q-59 0 -59 -118v-468q0 -187 107 -187q122 0 215 95t93 217v343q0 118 -59 118 q-35 0 -35 37.5t35 37.5h399q35 0 35 -37.5t-35 -37.5q-58 0 -58 -118v-539q0 -116 58 -116zM910 730v-655h155q-23 49 -23 116v539q0 68 23 118h-178q23 -49 23 -118zM345 262v468q0 68 24 118h-179q23 -49 23 -118v-438q0 -170 169 -206q-37 68 -37 176z" />
+<glyph unicode="&#x1d567;" horiz-adv-x="1409" d="M1233 923q34 0 34 -37.5t-34 -37.5q-66 0 -145.5 -75t-110.5 -145l-266 -599q-18 -40 -101.5 -40t-102.5 41l-316 680q-16 35 -53 86.5t-59 51.5q-34 0 -34 37.5t34 37.5h397q35 0 35 -36t-40 -38t-47 -11q1 -20 31 -84l255 -542l212 476q22 49 22 88q0 59 -57.5 70.5 t-57.5 40.5q0 36 35 36h369zM1060 848h-56q9 -19 13 -42q21 23 43 42zM574 69q15 -5 33 -5t40 6q6 13 21 53l-302 642q-15 34 -17 83h-156q38 -48 66 -106z" />
+<glyph unicode="&#x1d568;" horiz-adv-x="1990" d="M1814 923q34 0 34 -37.5t-34 -37.5q-66 0 -145.5 -75t-110.5 -145l-267 -599q-18 -40 -101 -40t-102 41l-193 413l-184 -414q-18 -40 -101.5 -40t-102.5 41l-316 680q-16 35 -53 86.5t-59 51.5q-34 0 -34 37.5t34 37.5h397q35 0 35 -36t-40 -38t-47 -11q1 -20 31 -84 l255 -542l143 322q-138 314 -193 314q-35 0 -35 37.5t35 37.5h396q36 0 36 -36t-40.5 -38t-47.5 -11q1 -20 31 -84l255 -542l213 476q21 47 21 88q0 59 -57 70.5t-57 40.5q0 36 34 36h370zM1641 848h-57q9 -19 13 -43q22 24 44 43zM1155 69q15 -5 32.5 -5t39.5 6q6 13 21 53 q-221 456 -302 642q-14 34 -17 83h-155q47 -60 99 -171l62 -143zM574 69q16 -5 33.5 -5t39.5 6l22 50q-221 458 -303 645q-14 34 -17 83h-156q38 -48 66 -106z" />
+<glyph unicode="&#x1d569;" horiz-adv-x="1324" d="M1125 75q35 0 35 -37.5t-35 -37.5h-430q-34 0 -34 35t30 39q40 4 47 12q-6 27 -183 239l-97 -90q-52 -48 -52 -98.5t38.5 -61.5t38.5 -39q0 -36 -35 -36h-369q-34 0 -34 37.5t34 37.5q70 0 224 127q46 38 204 185l-256 322q-111 139 -131 139q-35 0 -35 37.5t35 37.5h429 q35 0 35 -35.5t-39.5 -38t-47.5 -11.5q4 -34 149 -207l74 71q38 46 38 91.5t-38 56t-38 37.5q0 36 33 36h369q36 0 36 -37.5t-36 -37.5q-68 0 -205 -111q-43 -36 -184 -167l288 -364q104 -131 142 -131zM902 848h-77q8 -22 8 -52q37 30 69 52zM995 75q-23 24 -71 84 l-309 392l-117 139q-64 84 -77 158h-183l366 -462l124 -149q70 -89 89 -162h178zM339 75q-8 22 -8 52q-37 -29 -71 -52h79z" />
+<glyph unicode="&#x1d56a;" horiz-adv-x="1430" d="M1254 923q34 0 34 -37.5t-34 -37.5q-66 0 -144.5 -74.5t-110.5 -145.5l-364 -807q-46 -102 -135 -166.5t-197 -64.5q-258 0 -258 185q0 56 42.5 99t98 43t98 -43t42.5 -101t-50 -105q13 -3 27 -3q113 0 182 66q52 49 104 168l-378 811q-17 36 -53 87t-58 51 q-34 0 -34 37.5t34 37.5h396q36 0 36 -39q0 -32 -40 -35t-48 -11q1 -21 31 -84l255 -543l214 477q22 49 22 88q0 59 -57.5 70.5t-57.5 40.5q0 36 35 36h368zM1082 848h-56q9 -19 13 -42q21 23 43 42zM682 134q-214 441 -295 631q-15 33 -19 83h-154q37 -47 65 -106l348 -746 zM184 -315q67 62 67 88.5t-21 47.5t-45 21t-44.5 -21t-20.5 -46q0 -63 64 -90z" />
+<glyph unicode="&#x1d56b;" horiz-adv-x="1156" d="M965 868q0 -14 -9 -26l-575 -767h157q310 0 340 230q5 39 6 42q7 20 35 20q37 0 35 -36l-23 -331h-849q-37 0 -37 59q0 12 11 27l572 762h-133q-309 0 -339 -230q-5 -38 -7 -42q-8 -20 -35 -20q-39 0 -36 36l23 331h826q38 0 38 -55zM209 848h-38l-2 -35q18 19 40 35z M866 848h-144l-580 -773h145zM863 108q-18 -18 -39 -33h37z" />
+<glyph unicode="&#x1d56c;" horiz-adv-x="1655" d="M1027 233q0 43 -9 79l-383 -339q-57 88 -143.5 149.5t-179.5 61.5q-56 0 -109 -37t-80 -89l-24 7q38 139 338 345q28 19 40 30t25 35q32 57 32 314q0 485 -247 485q-63 0 -114.5 -35t-51.5 -99t80 -95q124 -49 147 -69q80 -65 80 -216q0 -223 -275 -305v31 q48 15 105.5 47.5t57.5 63.5q0 28 -88.5 75t-129.5 89q-76 77 -76 197q0 181 125 294.5t308 113.5q456 0 456 -464q0 -187 -83 -285q-68 -81 -346 -211q233 -36 379 -184l162 139v698q0 122 -90 282q15 0 27 9q65 -95 105 -233q44 123 214 185q132 48 293 48v-29q-8 1 -19 1 q-56 0 -108 -46t-52 -101v-883q0 -25 21 -44t46 -19q54 0 115 60v-32q-62 -60 -344 -284q-78 31 -141 106t-63 154z" />
+<glyph unicode="&#x1d56d;" horiz-adv-x="1750" d="M1607 903l44 3q23 0 20 -20q-115 -19 -189.5 -33.5t-104.5 -31.5q249 -102 249 -298q0 -233 -296 -409q-237 -141 -435 -141q-129 0 -261 80q-26 16 -201 150q-106 80 -171 80q-115 0 -121 -151h-36q0 161 117 247.5t285 91.5q43 102 43 375q0 428 -240 428 q-53 0 -98.5 -31t-45.5 -78t70 -93q111 -74 131 -93q70 -68 70 -163q0 -122 -107 -218.5t-231 -97.5v29q53 1 102 26q61 30 61 77q0 27 -85.5 87t-116.5 115t-31 155q0 168 168 279q149 98 326 98q114 0 217.5 -53t143.5 -151q37 204 298 204q165 0 237.5 -83t87.5 -253 q0 -23 7 -68q18 -59 93 -59zM919 1148l15 -205q0 -100 -21 -210l518 133q-187 3 -248 115q-20 35 -46 205q-17 110 -98 110q-120 0 -120 -148zM1393 289q0 156 -167 283.5t-329 129.5q-59 -89 -162 -148q-52 -30 -201 -90q108 -2 239 -94l215 -171q121 -91 203.5 -91 t142 50.5t59.5 130.5z" />
+<glyph unicode="&#x1d56e;" horiz-adv-x="1653" d="M1602 1209q0 -12 -56 -68t-105.5 -81.5t-133 -25.5t-198 67.5t-109.5 67.5q-25 0 -49.5 -27.5t-24.5 -53.5q0 -47 92 -146q139 -152 169 -194q92 -126 92 -242.5t-102.5 -196.5t-227.5 -80q-267 0 -330 361h34q11 -96 70 -192q70 -115 154 -115q36 0 65 21.5t29 56.5 q0 68 -80 152l-149 149q-80 94 -80 188q0 70 68 153q44 52 120 115.5t76 70.5q0 49 -59.5 86t-112.5 37q-161 0 -226 -257q-39 -156 -39 -387q0 -293 95 -445q118 -189 394 -189q208 0 357.5 110t201.5 309h35q-102 -480 -690 -480q-343 0 -590 206t-247 543 q0 266 183.5 455t448.5 189q219 0 292 -166l278 173q84 -173 224 -173q71 0 131 45v-36z" />
+<glyph unicode="&#x1d56f;" horiz-adv-x="1709" d="M1604 632q0 -288 -193 -473.5t-482 -185.5q-145 0 -374.5 109t-294.5 109q-125 0 -141 -135q-18 0 -36 9q35 159 155.5 252t284.5 93q67 0 173 -26t170 -57q60 32 60 78.5t-103 88.5q-172 69 -193 81q-103 61 -103 154t166 301q-19 4 -45 4q-196 0 -344 -45 q-221 -67 -221 -215q0 -82 71.5 -129.5t157.5 -47.5q36 0 155 22v-27q-117 -25 -155 -25q-283 0 -283 299q0 242 244 382q204 118 465 118q350 0 596 -188q270 -207 270 -546zM1543 500q0 228 -287 392q-249 142 -496 142q-23 0 -41.5 -24t-18.5 -48q0 -30 129 -76t184 -80 q109 -71 109 -178q0 -77 -77 -175q-15 -19 -134 -146q207 -107 334 -107t212.5 81.5t85.5 218.5z" />
+<glyph unicode="&#x1d570;" horiz-adv-x="1729" d="M1637 1231q-28 -61 -139 -118t-195 -57t-152 42q-39 23 -130 109q-29 -2 -55 -23t-26 -52t63 -114l114 -150q40 -55 90 -150q37 240 204 240q92 0 157 -59t65 -138.5t-43.5 -121.5t-108 -42t-107 36t-42.5 97.5t83 141.5q-17 34 -49 34q-68 0 -103 -66q-29 -53 -29 -107 t19 -117.5t19 -97.5q0 -131 -105 -207t-240.5 -76t-222.5 114.5t-87 253.5h38q0 -96 66 -205t156 -109q72 0 72 79q0 56 -136 230.5t-136 283t89 195.5q33 32 183 134q-58 101 -200 101q-253 0 -253 -691q0 -284 78 -419q102 -177 366 -177q172 0 326.5 71.5t234.5 208.5 q10 -9 15 -20q-77 -155 -257 -233.5t-375 -78.5q-344 0 -588 203.5t-244 541.5q0 271 175 459.5t444 188.5q159 0 271 -101q40 -36 45 -36q37 0 298 150q62 -157 209 -157q88 0 161 74q-7 -40 -18 -65z" />
+<glyph unicode="&#x1d571;" horiz-adv-x="1624" d="M1140 846l-108 9q-61 0 -61 -72q0 -100 137 -247q-9 78 -9 83q0 91 62 139.5t145 48.5t144.5 -44t61.5 -111t-42 -106t-108 -39q-151 0 -151 125q0 67 61 113q-10 11 -29 11q-48 0 -77 -43t-29 -94q0 -90 128 -265.5t128 -297.5q0 -228 -217 -372q-191 -126 -417 -126 t-410 109q-214 126 -214 324q0 90 57 188q23 40 92.5 131t69.5 123q0 58 -70.5 58t-128.5 -60t-90 -133q-14 2 -27 11q109 252 334 252q120 0 205 -76.5t85 -185t-112.5 -259.5t-112.5 -237q0 -104 90.5 -159t214.5 -55t221.5 67.5t97.5 199.5l-323 646q0 102 78 203 q36 47 155 159l-361 148q-171 67 -275 67t-171 -41q-81 -49 -81 -140.5t99 -147.5q84 -48 184 -48q181 0 300 137l34 -20q-135 -146 -343 -146q-149 0 -238.5 76t-89.5 222q0 188 169 299q147 96 333 96t366 -81q1 -1 204.5 -115t271.5 -114q103 0 103 65t-80 109 q-31 17 -138 53v29q254 -62 254 -211q0 -132 -126 -200q-102 -55 -246 -55z" />
+<glyph unicode="&#x1d572;" horiz-adv-x="1864" d="M1799 541q0 -274 -284 -434q-236 -134 -533 -134q-364 0 -616 169q-290 195 -290 542q0 275 196 478.5t470 203.5q164 0 301 -99q33 23 146 81l-11 -40q-50 -24 -110 -61q40 -36 98 -128l-35 -9q-43 71 -97 119q-78 -42 -78 -108q0 -45 73 -166t128 -192q191 85 191 148 q0 8 -57 66.5t-57 117.5q0 114 160 191q133 64 261 64v-36q-63 -10 -89 -19q-52 -20 -61 -59q104 -54 120 -66q62 -47 62 -110.5t-77.5 -119.5t-149.5 -76q42 -9 126 -30q213 -63 213 -293zM1384 451q0 327 -101 327q-17 0 -110 -47q83 -107 83 -234t-103 -212t-236 -85 q-162 0 -253 159q-40 71 -52 157h36q56 -265 213 -265q72 0 72 65q0 58 -68 147q-124 161 -126 164q-68 106 -68 207q0 127 112 246q64 70 217 176q-101 56 -190 56q-188 0 -254 -232q-36 -129 -36 -412t65 -435q99 -231 366 -231q237 0 335 105t98 344z" />
+<glyph unicode="&#x1d573;" horiz-adv-x="1747" d="M1694 451q0 -171 -126 -305q-97 -103 -288 -199l-311 -144q-33 -17 -101 -48q-87 142 -213 142q-55 0 -95 -35t-40 -89q0 -90 108 -146q89 -47 189.5 -47t214 50t184.5 125l27 -7q-169 -190 -427 -190q-130 0 -220 56q-107 67 -107 196t103.5 218t241.5 89 q97 0 181 -57.5t127 -147.5q175 85 175 346q0 204 -114 339.5t-315 135.5q-92 0 -181 -58q58 -93 70 -117q35 -70 35 -130q0 -156 -167 -266q-149 -99 -313 -99q-118 0 -210.5 69t-92.5 184q0 63 46 108t107.5 45t109 -40t47.5 -104t-56 -124.5t-56 -61.5q0 -54 107 -54 q68 0 119.5 39t51.5 104.5t-80 171.5q-144 189 -150 198q-80 127 -80 243q0 141 162 238q36 21 249.5 108.5t384.5 178.5q75 -211 274 -211q144 0 233 128q14 -2 14 -25.5t-75 -102.5q-179 -188 -398 -188q-123 0 -201.5 55.5t-148.5 170.5q-162 -68 -162 -177t155 -314 q186 109 243 135q138 62 268 62q205 0 353 -123.5t148 -324.5z" />
+<glyph unicode="&#x1d574;" horiz-adv-x="1458" d="M1310 1193q0 -105 -92.5 -173.5t-196 -68.5t-324.5 113.5t-340 113.5q-79 0 -143 -40t-64 -115q0 -168 240 -168q117 0 195 42l-2 -36q-102 -38 -208 -38t-178 47q-85 55 -85 164q0 157 137.5 255.5t300.5 98.5q123 0 338 -90.5t267 -90.5q94 0 94 49q0 60 -105 105 q10 10 9 25q157 -68 157 -193zM1137 861q-69 0 -69 -56q0 -39 110 -237.5t110 -284.5q0 -175 -176 -274q-146 -81 -336 -81q-273 0 -397 121q-59 57 -119 225q-43 121 -103 121q-87 0 -87 -160q0 -62 13 -109h-52q-2 21 -2 63v46q0 125 78.5 209.5t202.5 84.5 q185 0 258 -148q8 -16 30.5 -79.5t74.5 -196.5q64 -148 177 -148q59 0 104.5 35t45.5 93q0 79 -108.5 259t-108.5 294.5t84 194.5t210 80q167 0 278 -191l-27 -27q-76 166 -191 166z" />
+<glyph unicode="&#x1d575;" horiz-adv-x="1451" d="M1323 1169q0 -172 -86 -273.5t-255 -101.5q-126 0 -263 89l-224 167q-129 89 -226.5 89t-152.5 -58.5t-55 -147.5q0 -123 87.5 -199.5t219.5 -76.5t240 83q3 -15 16 -27q-116 -85 -266 -85t-243 84t-93 232q0 181 151.5 301.5t337.5 120.5q145 0 296 -94q67 -41 202 -154 t184 -113q96 0 95 164h35zM1326 523q-14 66 -66.5 122.5t-122 56.5t-69.5 -56q0 -29 86 -159t121 -199q73 -139 73 -241q0 -225 -233 -367q-201 -122 -456 -122t-385 144q-65 71 -128 264q-47 142 -101 142q-90 0 -90 -117q0 -45 29 -130h-4q-18 0 -29 -9q-34 86 -34 148 q0 114 90 179t208 65q200 0 278 -161l110 -298q78 -166 240 -166q80 0 149 42t69 117q0 58 -161.5 310.5t-161.5 375t102.5 207.5t236.5 85q207 0 291 -233h-42z" />
+<glyph unicode="&#x1d576;" horiz-adv-x="1604" d="M655 644q-54 0 -54 -20q0 1 60.5 -91.5t60.5 -231.5t-103 -233.5t-237 -94.5t-235 62q-118 72 -118 189q0 63 46 109t112.5 46t120 -43.5t53.5 -111.5q0 -27 -22.5 -75t-22.5 -76t35.5 -49.5t65.5 -21.5q58 0 98.5 40.5t40.5 98.5q0 93 -127 205q-215 192 -235 215 q-127 148 -127 327q0 243 270 374q213 104 485 104t461 -144q206 -158 206 -421v-29h-29q0 245 -172.5 392.5t-421.5 147.5q-163 0 -281 -83t-118 -230t65 -275l-4 91q0 179 93.5 278.5t271.5 99.5q284 0 383 -260q34 -89 34 -161l-332 -50q117 -36 131 -42q76 -34 93 -92 q0 -1 6 -46l17 -127l14 -131q20 -71 88.5 -71t143.5 61q11 -12 18 -27l-374 -274q-204 74 -233 206q-9 39 -13 183.5t-38 200.5q-48 81 -176 81zM940 789q0 82 -59 149t-139 67q-109 0 -150 -84q-29 -59 -29 -178q0 -46 5 -77l372 76v47z" />
+<glyph unicode="&#x1d577;" horiz-adv-x="1285" d="M1211 655q-122 -171 -241 -171t-206 81.5t-87 194.5q0 78 105.5 203.5t105.5 180.5q0 97 -95 149q-77 42 -186 42t-187 -37q-104 -48 -104 -147q0 -74 139 -202t139 -219.5t-94 -168.5q-27 -22 -206 -142q30 7 72 7q98 0 294.5 -121t279.5 -121q166 0 191 173h29 q0 -161 -129.5 -272.5t-292.5 -111.5q-125 0 -247 74q-25 15 -186 137q-97 74 -159 74q-84 0 -101 -132h-36q6 33 22 98q26 77 111 140l142 90q70 45 70 87q0 18 -90 101.5t-134 141.5q-78 103 -78 194q0 188 183 297q153 91 355 91t364 -87q197 -106 197 -290 q0 -96 -57 -182q-21 -32 -91 -108.5t-70 -113.5q0 -47 67 -47q98 0 184 135q12 -14 27 -18z" />
+<glyph unicode="&#x1d578;" horiz-adv-x="2154" d="M1468 1068l10 -286q0 -99 -13 -158q-30 -135 -193 -321l-296 -330l-256 204q-60 -61 -159 -182q-12 14 -27 18l334 397q15 -15 81 -68l168 -136q0 44 -9 197l-22 380q-3 81 -14 244q-25 234 -128 234q-71 0 -71 -117q0 -67 26.5 -196.5t26.5 -208t-27 -140.5 q-41 -94 -226 -303l-285 -323l-249 204q-49 -46 -119 -137l-36 27l312 357l240 -195q7 22 7 68t-6.5 132t-8.5 167l-7 218q-14 196 -63 304q-65 143 -201 143t-136 -110q0 -62 84 -107q149 -79 155 -84q84 -65 84 -177q0 -227 -235 -285q-81 -20 -133 -20v29q65 0 129 19 q89 26 89 75q0 30 -87.5 73t-125.5 79q-74 69 -74 180q0 194 129 313.5t324 119.5q112 0 214.5 -52.5t157.5 -144.5q49 197 283 197q217 0 325 -182q27 90 114 136t180.5 46t163.5 -34q90 -44 113 -130q10 -39 10 -173.5t106 -134.5q11 0 24 3v-27q-141 0 -186 -48.5 t-45 -190.5q0 -425 130 -425q20 0 108 52q10 -17 18 -25l-381 -260q-168 140 -196 233q-11 37 -11 142q0 278 52 354q70 103 347 170q-71 9 -143 17q-79 12 -126 64q-30 33 -34.5 134.5t-10.5 122.5q-18 64 -91 64t-99 -70q-15 -40 -15 -136z" />
+<glyph unicode="&#x1d579;" horiz-adv-x="1752" d="M962 1115l16 -204v-249q0 -149 -211 -353q-50 -49 -372 -343l-249 218q-16 -11 -128 -106l-18 18l350 328l260 -211v319q0 351 -81 581q-6 18 -13 29q-73 119 -206 119q-153 0 -153 -110q0 -59 86 -105q148 -78 160 -88q86 -67 86 -180q0 -145 -137 -243 q-80 -57 -238 -57v29q74 0 136 18q89 25 89 76q0 29 -89.5 72.5t-128.5 78.5q-76 70 -76 177q0 201 133.5 319t337.5 118q137 0 242 -45q128 -55 173 -166q22 211 280 211q196 0 266 -108q42 -64 47 -201.5t38 -156.5q32 -19 87 -19h6v-26q-26 2 -53 2q-118 0 -163 -80 q-34 -59 -34 -212.5t7 -203.5q22 -161 109 -161q45 0 132 58l11 -18l-383 -267q-172 79 -220 220q-22 65 -22 224q0 213 58 282t357 151q-113 19 -145 29q-80 25 -118 81q-22 32 -30.5 127t-19.5 125q-22 62 -84 62q-95 0 -95 -159z" />
+<glyph unicode="&#x1d57a;" horiz-adv-x="1716" d="M1640 650q0 -304 -203.5 -490.5t-510.5 -186.5q-132 0 -295 78q-47 23 -255 145q-133 78 -192 78q-106 0 -148 -142h-36q37 144 165 237t277 93t399 -139t405 -139t248.5 111.5t93.5 278.5q0 284 -283 373q-83 26 -121 26h-381q-75 0 -149.5 60t-74.5 136.5t56 140.5 q-6 2 -14 2q-59 0 -110 -46t-51 -104.5t101 -198t101 -223.5q0 -119 -124 -193q-106 -63 -229.5 -63t-208 76t-84.5 194h29q0 -78 53 -147t128 -69t75 59q0 14 -75.5 136.5t-75.5 195.5q0 210 241 335q197 102 430 102q353 0 576 -178q243 -193 243 -538z" />
+<glyph unicode="&#x1d57b;" horiz-adv-x="1743" d="M545 563l9 285q0 448 -227 448q-46 0 -100 -23t-54 -62t76 -102q128 -106 142 -120q76 -78 76 -155q0 -124 -97.5 -211.5t-225.5 -106.5v27q44 2 97 28t53 64q0 27 -88 70t-130 86q-76 78 -76 203q0 170 142.5 271t304 101t274.5 -49q139 -59 183 -178q67 227 316 227 q115 0 202 -47q106 -58 106 -164q0 -34 -22.5 -96.5t-22.5 -96.5q0 -55 60 -68q19 -4 67 -5q17 0 36 1v-29q-126 -2 -140 -3q-88 -7 -129 -39q13 -33 57 -50l85 -31q130 -55 130 -177q0 -196 -191.5 -388.5t-376.5 -192.5q-69 0 -188 38l-164 -458h-43q-42 100 -71 249 l-45 256q-21 104 -80.5 141.5t-173.5 37.5q-56 0 -93.5 -60t-49.5 -61q0 180 97 282q90 95 252 95h23l5 5q-5 24 -5 58zM1436 208q40 40 40 83t-100 101q-177 104 -184 109q-100 73 -100 161t101 148q91 55 179 55q11 0 21 -1q-242 16 -242 255v72q0 54 -16 76.5t-70 22.5 q-74 0 -112 -107q-27 -77 -27 -169v-633q370 -213 429 -213q41 0 81 40z" />
+<glyph unicode="&#x1d57c;" horiz-adv-x="2001" d="M1140 983l-317 -11q-296 0 -296 190q0 92 61 148q-6 2 -16 2q-41 0 -99 -47t-58 -119q0 -45 116.5 -187t116.5 -235q0 -118 -110.5 -201t-233.5 -83t-203 82t-101 209h36q2 -76 60.5 -158t136 -82t77.5 70q0 24 -102.5 146t-102.5 215q0 226 265 348q207 96 458 96 t441 -94q211 -104 312 -308q68 -137 68 -219v-400q0 -56 33 -94t88 -38q78 0 105 56q16 35 16 107v16h36q1 -41 1 -51q0 -361 -212 -361q-153 0 -153 190q0 32 5.5 90.5t6.5 80.5q-99 -173 -263.5 -270.5t-377.5 -97.5t-458 137q-200 112 -257 112t-108 -48q-16 -15 -77 -89 l-18 11q66 157 195 247t296 90q131 0 364 -110t363 -110q183 0 280 102t97 286q0 382 -471 382z" />
+<glyph unicode="&#x1d57d;" horiz-adv-x="1801" d="M1624 802l-113 8q-56 0 -96 -21q26 -13 54.5 -56t28.5 -71v-453q0 -41 61 -41q42 0 139 61l11 -18q-26 -20 -202.5 -129t-185.5 -109q-33 0 -96 49q-103 80 -103 182v420q0 43 -32.5 73.5t-66.5 30.5t-36 -15q-5 -65 -28 -206q-54 -237 -188 -376q-152 -158 -381 -158 q-128 0 -221 76.5t-93 201.5q0 173 186 173q76 0 129 -40.5t53 -112t-36 -97.5q-18 -13 -76.5 -25t-82.5 -37q5 -110 139 -110q200 0 200 366v239q0 241 -39 407q-65 276 -226 276q-58 0 -107.5 -34t-49.5 -89t80 -107q135 -88 147 -99q80 -73 80 -176q0 -139 -122 -218 q-105 -67 -252 -67v29q202 14 202 79q0 34 -84 89.5t-117 93.5q-71 79 -71 191q0 179 154 287q137 97 324 97q321 0 415 -233q10 60 41 116q64 117 237 117q38 0 116 -12.5t156 -83t78 -155.5v-229q0 -56 79 -56q30 0 56 13q-9 -14 -7 -33q-22 -8 -54 -8zM1417 820 q-77 0 -166 78t-89 154q0 238 -85 238q-114 0 -114 -182q0 -12 2 -40l22 -303l451 56q-11 -1 -21 -1z" />
+<glyph unicode="&#x1d57e;" horiz-adv-x="1624" d="M1148 944q-109 0 -310 78.5t-311 78.5q-176 0 -295.5 -110t-119.5 -284q0 -231 244 -331q172 -71 443 -71q713 0 713 262q0 70 -42 118t-115 48t-194 -91q-182 -135 -185 -137q-144 -81 -310.5 -81t-280.5 93.5t-114 245.5q0 105 77.5 162t176.5 57t204 -40v-36 q-124 45 -202.5 45t-147.5 -42.5t-69 -123.5q0 -51 33 -93t76.5 -42t181 78t202.5 106q146 65 258 65q192 0 327 -81q162 -97 162 -277q0 -271 -223 -429q-198 -139 -481 -139q-341 0 -555.5 192.5t-214.5 529.5q0 281 199 476t481 195q152 0 385.5 -105.5t262.5 -105.5 q93 0 126 119h36q-90 -330 -418 -330z" />
+<glyph unicode="&#x1d57f;" horiz-adv-x="1523" d="M1207 34q-102 -61 -259 -61t-327 70q-73 30 -228.5 115.5t-204.5 85.5t-86.5 -45t-37.5 -95q0 -11 3 -23h-36q0 168 107.5 271t276.5 103q99 0 215 -41.5t124 -41.5q36 0 36 29q0 34 -78 79q-115 68 -145 94q-78 68 -78 151t73 158q30 31 138 111q-78 48 -194 82t-205 34 q-240 0 -240 -163q0 -81 69 -132.5t146.5 -51.5t151.5 35v-33q-93 -32 -145 -32q-113 0 -194.5 72.5t-81.5 183.5q0 197 157 305q137 94 325 94t381 -92q95 -45 260 -153.5t207 -108.5q69 0 69 61q0 68 -76.5 118t-154.5 63v36q270 -87 270 -233q0 -115 -101 -179 q-85 -54 -220 -54t-397 136q-27 -13 -27 -35q0 -30 84 -78q122 -69 155 -96q84 -69 84 -149q0 -132 -233 -272q67 -55 213 -111.5t228 -56.5q121 0 193 173l30 -11q-33 -88 -102 -177.5t-145 -134.5z" />
+<glyph unicode="&#x1d580;" horiz-adv-x="1476" d="M65 267q28 0 64.5 16t36.5 40v662q0 41 -28.5 67.5t-69.5 26.5t-95 -45l-18 20l328 312q89 -46 158 -109q93 -85 93 -158v-774q60 -38 150 -81l144 117v624q0 38 -40 63.5t-83 25.5q-10 0 -19 -2v29q80 5 180.5 90.5t138.5 165.5q159 -211 341 -256v-29q-9 2 -21 2 q-127 0 -127 -80v-649q0 -37 27.5 -65.5t62 -28.5t109.5 45q7 -9 9 -20l-347 -303q-119 83 -137 98q-84 71 -92 131q-2 39 -7 116l-390 -345q-195 207 -424 265v36q73 -7 56 -7z" />
+<glyph unicode="&#x1d581;" horiz-adv-x="1752" d="M1534 1061l-7 -109q0 -64 47 -75q48 -6 97 -11q-25 -20 -73.5 -20t-117 15.5t-94.5 15.5t-43 -15t-17 -32q0 -40 80 -79q115 -58 147 -86q80 -68 80 -176q0 -228 -249 -386q-205 -130 -408 -130q-136 0 -283 94q-5 3 -230 173q-123 94 -201 94q-106 0 -136 -157 q-16 9 -34 7q13 94 100.5 187.5t179.5 110.5q25 5 164 18q43 77 43 144v221q0 431 -229 431q-54 0 -95 -23q-51 -27 -51 -77q0 -65 71 -104l140 -78q74 -59 74 -164q0 -141 -142 -231q-103 -65 -248 -65v27h4q198 0 198 96q0 36 -71 83q-110 74 -130 93q-71 66 -71 147 q0 169 171 275q147 91 327 91q330 0 411 -227q17 130 77.5 178.5t200.5 48.5t229 -80t89 -225zM834 398l256 -192q130 -98 196 -98t120 39.5t54 101t-102 129.5l-188 119q-102 76 -102 160q0 150 271 231q-89 39 -126.5 101t-48.5 166q-1 27 -9 79q-15 62 -83 62 q-32 0 -63 -34t-31 -66v-330q0 -131 -147 -235q-70 -49 -263 -135h4q112 0 262 -98z" />
+<glyph unicode="&#x1d582;" horiz-adv-x="2306" d="M2008 904q-44 0 -88.5 -16.5t-44.5 -55.5t76 -82q110 -62 140 -91q76 -71 76 -181q0 -198 -204 -359q-185 -146 -364 -146q-89 0 -191 53q-44 22 -138.5 86.5t-125.5 64.5q-16 0 -93 -60.5t-132 -90.5q-95 -53 -177 -53q-114 0 -288 113.5t-250 113.5q-50 0 -86.5 -42 t-36.5 -93l-36 7q0 125 117.5 246.5t241.5 121.5q44 0 87 -16q74 82 74 430q0 451 -204 451q-54 0 -105.5 -37.5t-51.5 -91.5t75 -106l148 -103q78 -68 78 -155q0 -125 -121 -233t-247 -108v29q57 0 126 33.5t69 83.5q0 35 -79 74q-110 53 -145 85q-79 69 -79 179 q0 190 147.5 300.5t343.5 110.5q225 0 357 -159q48 77 75 105q52 54 113 54q116 0 205 -159q139 159 374 159q293 0 371 -208q12 -83 49 -200q19 -25 33.5 -28.5t45 -3.5t46.5 -4q-39 -18 -181 -18zM2003 224q0 55 -100 115q-177 107 -186 114q-100 80 -100 179 q0 163 272 270q-31 5 -92 20q-104 34 -141 136l-42 166q-28 81 -116 81q-63 0 -130 -54t-67 -116q0 -44 65 -119q116 -134 119 -139q65 -88 65 -166q0 -186 -222 -307q19 1 57.5 1t93.5 -15.5t191.5 -133t218.5 -117.5q36 0 75 25.5t39 59.5zM1288 444q0 53 -117 180.5 t-117 214.5q0 140 195 350q-106 72 -190 72t-164 -72q70 -137 70 -276q0 -384 -431 -489q82 -25 184 -85l141 -88q91 -51 163 -51t169 82t97 162z" />
+<glyph unicode="&#x1d583;" horiz-adv-x="1492" d="M1422 1144q0 -80 -52.5 -136.5t-126 -56.5t-131.5 44.5t-58 105.5t90 186q-7 18 -38 18q-99 0 -158 -135q-46 -106 -46 -221v-202h244q36 0 73.5 38t38.5 74h30q0 -87 -42 -173q-51 -103 -129 -103h-209q-4 -9 -4 -27q0 -124 49 -212q61 -109 175 -109q92 0 263 122 l-3 -34q-462 -350 -471 -350q-45 0 -186 92q-75 49 -109 96t-63 135h-7q-60 -323 -319 -323q-96 0 -175.5 60.5t-79.5 148.5t51.5 142.5t132 54.5t132 -44.5t51.5 -112.5t-43 -111q-20 -21 -91 -68q3 -41 56 -41q137 0 210 145q57 115 57 268v168h-229q-35 0 -71 -38 t-39 -74h-29q35 140 49 173q46 103 128 103h186q5 11 5 36q0 125 -72.5 215t-187.5 90t-243 -115q-2 11 -9 25l397 368q150 -25 288 -122.5t170 -231.5q67 354 289 354q107 0 181.5 -58.5t74.5 -163.5z" />
+<glyph unicode="&#x1d584;" horiz-adv-x="1653" d="M505 -366l-33 6q-9 0 -12 -6q67 -45 217 -45q216 0 307.5 89t114.5 289.5t23 227.5v601q0 82 -16 241.5t-38 193.5q-38 59 -79 59q-94 0 -94 -151q0 -50 15.5 -149t15.5 -149q0 -176 -69 -263t-323 -197q14 -17 36.5 -20.5t44.5 -6.5q118 -22 240 -148q54 45 127 99 l18 -20l-394 -312q-43 87 -134.5 152.5t-184.5 65.5q-113 0 -168 -104h-36q41 111 171 206q121 88 228 88h16q52 132 52 476q0 186 -29 276q-50 157 -194 157q-60 0 -110.5 -33.5t-50.5 -88.5t72 -107q117 -84 134 -101q72 -76 72 -198.5t-79 -216.5t-212 -135l-9 18 q49 17 110.5 61.5t61.5 84t-74 78.5q-105 56 -139 89q-74 75 -74 203q0 188 138 305t329 117q120 0 221 -50.5t138 -153.5q39 195 226 195q250 0 365 -297q82 -211 82 -511q0 -991 -828 -991q-151 0 -275 40q-176 57 -176 175q0 162 217.5 162t217.5 -146 q0 -72 -52.5 -113.5t-126.5 -41.5z" />
+<glyph unicode="&#x1d585;" horiz-adv-x="1344" d="M1256 85q0 -274 -208 -411q-177 -116 -464 -116t-416 121q-71 67 -113.5 206.5t-81.5 139.5q-72 0 -72 -225v-6h-36q0 170 38 239q53 97 203 97t226.5 -101t76.5 -250q0 -190 181 -190q160 0 211 157q27 85 27 303.5t-40 328.5q-67 183 -256 183q-132 0 -241.5 -83 t-126.5 -211h-43q19 100 93.5 189.5t169.5 115.5q-227 72 -227 229q0 70 49.5 113.5t117 43.5t116.5 -34.5t49 -93.5t-41 -91q-12 -10 -64 -33.5t-52 -48.5q0 -67 184 -67q267 0 267 309q0 397 -323 397q-155 0 -262 -91.5t-117 -244.5h-36q0 199 173 310q148 95 367.5 95 t389.5 -95q207 -116 207 -326q0 -323 -482 -365q260 -49 386 -139q170 -123 170 -355z" />
+<glyph unicode="&#x1d586;" horiz-adv-x="1088" d="M854 439l-6 -135q0 -160 66 -160q33 0 72 27l17 -19q-173 -113 -259 -201q-167 96 -180 206q-120 -72 -290 -206q-52 23 -107 69.5t-65 89.5t-10 126v167q0 244 24 284.5t136 79.5q180 62 342 172q153 -151 360 -195q11 -7 13 -19q-113 -18 -113 -81v-205zM386 191 q0 -62 55 -62q34 0 121 57v482q-112 55 -176 108v-585z" />
+<glyph unicode="&#x1d587;" horiz-adv-x="1016" d="M919 374q0 -137 -58 -200q-41 -44 -162.5 -81.5t-179.5 -69t-89 -72.5q-189 183 -373 223v25q8 -2 26.5 -2t46 22t27.5 50v645q0 41 -45 139.5t-76 125.5l25 17q55 -74 96 -157l38 69q23 39 49 62q107 95 439 95v-25q-19 2 -38 2q-79 0 -138.5 -46t-59.5 -123v-312 l318 178q95 -104 113 -134q41 -67 41 -170v-261zM625 689q0 27 -21.5 49.5t-48.5 22.5q-53 0 -106 -45v-449l176 -132v554z" />
+<glyph unicode="&#x1d588;" horiz-adv-x="895" d="M100 231q-10 46 -10 198q0 258 53 328q30 39 94 57l401 125l144 -267l-239 -129l-155 296l-7 4q-4 -4 -4 -10v-452q0 -18 24 -70q61 -133 224 -133q88 0 176 57l17 -25q-259 -136 -400 -259q-141 69 -193 107q-104 77 -125 173z" />
+<glyph unicode="&#x1d589;" horiz-adv-x="1013" d="M872 784q31 -85 31 -292t-24 -270.5t-110 -94.5l-162 -52q-96 -40 -141 -124q-178 153 -402 214l4 17q74 10 74 57v501q55 -22 115 -22q143 0 142 71q-16 9 -54 23q-239 84 -239 237q0 103 77 161t184 58q44 0 72 -9v-27q-17 6 -49 6q-127 0 -127 -55.5t85 -88.5l97 -30 q147 -46 227 -83q153 -70 200 -197zM611 659q0 46 -63 84t-113 39v-517q98 -47 176 -108v502z" />
+<glyph unicode="&#x1d58a;" horiz-adv-x="927" d="M181 113q-88 100 -88 301t33 270t143 119q24 11 333 136l223 -316l-435 -256q29 -90 101.5 -146t165.5 -56q40 0 105.5 32.5t83.5 37.5v-5q0 -11 -6 -18q-9 -8 -85.5 -55.5t-222.5 -156.5q-19 -20 -63 -49q-215 78 -288 162zM577 515l-191 303v-411z" />
+<glyph unicode="&#x1d58b;" horiz-adv-x="740" d="M632 691h-127q-42 -420 -172 -1130h-34q-127 698 -155 1124q-26 6 -55.5 6t-58.5 -6v33q10 -1 18 -1q75 0 92 89q4 23 4 146q0 316 170 316q63 0 140.5 -58.5t80.5 -58.5q29 0 29 91v23h38q3 -22 3 -50q0 -261 -160 -261q-67 0 -134 49.5t-84 49.5q-43 0 -43 -48 q0 -65 83 -117t157 -61q86 -10 162 -10q24 0 46 1v-127z" />
+<glyph unicode="&#x1d58c;" horiz-adv-x="1031" d="M960 -113q0 -162 -162 -253q-134 -75 -310 -75q-132 0 -227 31q-140 47 -140 151q0 58 45 91.5t105.5 33.5t112 -31.5t51.5 -86t-35 -82.5q-18 -14 -80 -39q18 -39 120 -39t177 39q95 49 95 146q0 51 -55 134t-72 122t-27 121q-13 -8 -143 -103.5t-140 -95.5t-76 49.5 t-76 64.5q-30 45 -30 83v509q0 50 151 108q213 82 322 174q150 -139 350 -188q10 -2 30 -7q13 -5 14 -21q-34 -1 -70 -18t-36 -46v-564q0 -1 53 -67.5t53 -140.5zM392 197q0 -25 13 -50.5t33 -25.5t124 67v473q-61 7 -170 87v-551z" />
+<glyph unicode="&#x1d58d;" horiz-adv-x="1011" d="M903 188q0 -14 -21.5 -111t-68.5 -184.5t-145 -153.5q-15 -10 -120 -64l-226 -116q-7 16 -17 27q135 36 221.5 157t86.5 263v672q0 28 -20 49t-48 21q-45 0 -119 -63v-497q0 -44 57 -44q34 0 64 19v-25q-194 -107 -259 -187q-40 55 -116 106l-136 81q34 0 67 17.5 t33 47.5v719q0 93 -115 257l19 17q67 -92 94 -157q13 10 26 46t14 38q73 142 494 142v-25q-15 1 -29 1q-90 0 -151.5 -41t-61.5 -127v-348l331 214q40 -18 93 -101.5t53 -127.5v-522z" />
+<glyph unicode="&#x1d58e;" horiz-adv-x="655" d="M384 1234q42 -34 42 -81.5t-60.5 -112.5t-102.5 -65q-30 0 -89 87q-32 47 -32 93t46 79.5t100 33.5t96 -34zM136 155v553q0 13 -14 26.5t-34.5 13.5t-55.5 -36l-17 19l273 208q141 -137 253 -178q-3 -7 -54.5 -17t-51.5 -36v-504q0 -47 63 -47q34 0 77 29q1 -10 8 -19 l-286 -216q-47 13 -104 87t-57 117z" />
+<glyph unicode="&#x1d58f;" horiz-adv-x="592" d="M384 1234q42 -34 42 -84t-58 -112.5t-105 -62.5q-30 0 -89 87q-32 47 -32 92.5t46.5 79.5t100 34t95.5 -34zM66 -376h-151v28q24 -4 49 -4q65 0 118.5 34t53.5 95v931q0 32 -43 32q-20 0 -61 -28l-17 19l273 208q65 -69 253 -187q-106 -38 -106 -72v-727 q0 -44 44.5 -125.5t82.5 -101.5q-9 -8 -26 -32q-55 65 -103 157q-4 -15 -13 -44q-26 -76 -144 -129.5t-210 -53.5z" />
+<glyph unicode="&#x1d590;" horiz-adv-x="1134" d="M513 470q-2 0 -87 -48v-240q0 -38 53 -38q25 0 53 13l9 -17q-110 -70 -158 -104t-95 -85q-58 65 -252 182q100 21 100 70v719q0 93 -115 257l19 17q67 -92 94 -157q79 226 405 226h114v-25q-19 2 -38 2q-76 0 -132.5 -51.5t-56.5 -126.5v-339l174 117q145 97 157.5 97 t77 -57t81 -81.5t16.5 -42t-1 -25.5l-176 -110q93 -80 137 -180q28 -64 62 -218q12 -54 55 -54q12 0 34 2.5t32 2.5l-293 -225q-25 7 -68 49t-58 111l-18 135q-13 74 -58.5 149t-66.5 75zM681 608q-110 132 -152 132t-103 -51v-233z" />
+<glyph unicode="&#x1d591;" horiz-adv-x="698" d="M61 178q14 -13 35.5 -13t39.5 19v738q0 51 -39.5 126t-81.5 122l25 26q67 -92 94 -155h4q42 166 278 210q76 14 101 14h94v-25q-12 2 -22 2q-61 0 -112 -51t-51 -112v-854q0 -68 76 -68q44 0 109 36q-1 -15 8 -26q-102 -59 -318 -216q-42 55 -117 113l-133 97q2 9 10 17z " />
+<glyph unicode="&#x1d592;" horiz-adv-x="1584" d="M1353 588l6 -355q0 -76 64 -76q14 0 84 19l-279 -225q-50 18 -106 86t-56 118v547q0 12 -18 29t-30 17q-40 0 -115 -63v-503l57 -59q-50 -1 -118.5 -61.5t-82.5 -110.5q-118 155 -231 172l2 17q83 14 83 63v511q0 34 -51 34q-25 0 -115 -55v-511q0 1 58 -59 q-50 -1 -118 -61t-84 -111q-44 63 -117 113.5t-144 58.5q8 15 43 22.5t44 13.5q28 20 28 121v347q0 106 -74 106q-43 0 -64 -36l-19 26l269 216q60 -14 122 -84t63 -130l275 214q162 -79 181 -212l324 212q89 -117 231 -178q-2 -8 -42.5 -18.5t-55 -41.5t-14.5 -113z" />
+<glyph unicode="&#x1d593;" horiz-adv-x="1139" d="M625 155v547q0 46 -57 46q-30 0 -112 -55v-511q0 -7 26 -31t29 -28q-49 0 -117 -61t-84 -111q-39 59 -117 114t-142 58q5 15 43 23.5t44 12.5q27 18 27 262t-11 272q-16 40 -62 40t-67 -36l-19 26l272 216q96 -51 129.5 -85.5t52.5 -126.5l333 212q89 -117 231 -178 q-2 -7 -42 -15.5t-54.5 -44t-14.5 -127.5v-189q0 -156 13.5 -192t52 -36t79.5 29q1 -10 8 -19l-279 -216q-49 17 -105.5 86.5t-56.5 117.5z" />
+<glyph unicode="&#x1d594;" horiz-adv-x="1011" d="M867 750q30 -80 30 -270t-28 -259.5t-117 -101.5l-163 -47q-93 -36 -129 -121q-178 157 -396 216q40 29 72 72v543q202 12 293 32q154 34 264 125q132 -75 174 -189zM604 653q0 47 -63 87.5t-113 41.5v-517q118 -59 176 -108v496z" />
+<glyph unicode="&#x1d595;" horiz-adv-x="1079" d="M982 470l12 -133q0 -66 -29 -121q-18 -35 -74 -59l-107 -44q-51 -20 -98 -62t-63 -94l-127 87q-55 -304 -127 -483h-26q-62 174 -77 273l-48 304q-32 27 -80 27q-84 0 -84 -83q0 -11 1 -23q-19 12 -19 59q0 95 42 167.5t130 76.5v352q-130 72 -130 172q0 120 82.5 175.5 t208.5 55.5v-27q-44 0 -85 -13q-57 -17 -57 -51q0 -29 99.5 -64t125.5 -71q17 -23 48 -143l344 199q98 -73 125 -218q13 -69 13 -259zM689 674q0 30 -25.5 55.5t-57.5 25.5t-108 -45v-409q127 -57 191 -123v496z" />
+<glyph unicode="&#x1d596;" horiz-adv-x="1011" d="M854 659v-549q0 -108 -44 -276l-79 -273h-25q-112 235 -148 596q-188 -117 -284 -206q-181 98 -181 197v509q0 42 127 100l170 68q103 48 176 114q149 -138 388 -195q12 -8 13 -21q-37 -1 -75 -16.5t-38 -47.5zM386 250q0 -30 29 -68t58 -38q10 0 48 20.5t41 21.5v475 q-103 38 -176 87v-498z" />
+<glyph unicode="&#x1d597;" horiz-adv-x="933" d="M477 246q0 -35 39 -62t76 -27q58 0 180 93l17 -19l-380 -280q-60 53 -189 140l-163 70l71 23q35 11 56 43v424q0 61 -70 61q-35 0 -82 -36l-17 19l286 244q157 -74 180 -233l248 220l168 -239q-59 -65 -210 -202q-42 71 -151 233l-59 -53v-419z" />
+<glyph unicode="&#x1d598;" horiz-adv-x="1018" d="M946 409q0 -115 -98 -214l-282 -259q-65 40 -179 74t-187.5 34t-110.5 -57q-8 7 -17 9q107 140 191 277q-178 92 -178 214q0 92 81 170q13 13 139.5 107t182.5 175q95 -100 190 -100q64 0 113 35t49 97q0 97 -101 152q-83 45 -192 45t-196.5 -57t-102.5 -164h-34 q9 122 108.5 185.5t236 63.5t245 -78t108.5 -217q0 -113 -142 -250l-8 -29l-1 3q83 -18 134 -75.5t51 -140.5zM625 612q-152 0 -288 136q-32 -34 -32 -78q0 -77 58.5 -141.5t130 -64.5t142 52.5t95.5 117.5q-51 -22 -106 -22zM740 220q0 90 -52.5 152t-135.5 62t-154 -51 t-105 -125q194 0 424 -129q23 44 23 91z" />
+<glyph unicode="&#x1d599;" horiz-adv-x="765" d="M66 171q37 -6 45 -6t30 12.5t22 25.5v488h-127q6 21 36 33l57 24q172 98 293 439h32v-367h207v-129h-205v-409q0 -96 80 -96q48 0 123 49l17 -17l-330 -267q-142 180 -280 193v27z" />
+<glyph unicode="&#x1d59a;" horiz-adv-x="1139" d="M98.5 147.5q39.5 8.5 53 39t13.5 260.5t-11 258t-54 28q-14 0 -85 -19l280 225q51 -19 106 -84.5t55 -116.5v-550q0 -17 18 -30.5t36.5 -13.5t108.5 55v509q0 9 -21 27l-36 32q48 1 116.5 62t86.5 110q37 -61 114.5 -114t144.5 -58q-6 -16 -40.5 -22t-47.5 -16 q-26 -20 -26 -73v-431q0 -28 23.5 -48t56.5 -20t68 36q0 -15 8 -26l-269 -216q-67 23 -124.5 85.5t-59.5 128.5l-325 -214q-89 116 -231 180q2 8 41.5 16.5z" />
+<glyph unicode="&#x1d59b;" horiz-adv-x="1054" d="M939 351q0 -70 -10 -105q-19 -68 -100 -106q-96 -36 -284 -113q-57 -26 -93 -76q-74 72 -181.5 139t-192.5 84v25h3q97 0 97 70v430q-129 71 -129 172q0 118 99 175q79 46 207 46q20 0 50 -2q0 -23 6 -34q-22 6 -57 6q-134 0 -134 -55q0 -27 104 -67.5t113 -51.5 q16 -21 23 -58l15 -69l303 186q96 -67 128.5 -147.5t32.5 -210.5v-238zM647 702q0 23 -23.5 45t-53 22t-99.5 -44v-458l176 -132v567z" />
+<glyph unicode="&#x1d59c;" horiz-adv-x="1469" d="M1392 725q5 -37 5 -241.5t-6 -231.5q-12 -54 -89 -87l-214 -79q-125 -53 -181 -135q-202 157 -345 187q30 22 72 59v511q0 61 -68 61q-34 0 -110 -48v-518q0 -33 74 -51l2 -14q-60 -15 -133 -73t-104 -114q-24 59 -96.5 124t-132.5 77v17q39 3 60 9t37 27v494 q-121 63 -121 169.5t89 166.5t198 60q32 0 61 -5q-1 -21 9 -34q-24 6 -57 6q-128 0 -128 -55q0 -27 97 -62t109 -48q35 -37 35 -139l317 189q66 -66 157 -186l313 184l71 -74q70 -76 79 -146zM1102 710q0 22 -22 40.5t-50.5 18.5t-105.5 -44v-503l178 -72v560z" />
+<glyph unicode="&#x1d59d;" horiz-adv-x="1049" d="M93 15q-52 0 -106 -64q0 82 50.5 172.5t128 90.5t158.5 -49q34 39 68 132q-6 24 -90 184.5t-105 190.5q-32 46 -78.5 46t-93.5 -42l-19 19q252 244 276 244q89 0 167 -118l102 -194l134 312q132 -70 176 -70q71 0 87 85h25q-16 -105 -56 -180q-55 -104 -139 -104 q-55 0 -148 48q-23 -39 -62 -120q1 -3 146 -289q20 -48 70 -133q34 -41 70 -41q7 0 119 28v-25l-409 -187l-155 314l-142 -314q-95 64 -174 64z" />
+<glyph unicode="&#x1d59e;" horiz-adv-x="1047" d="M939 195q0 -120 -45 -219q-101 -222 -536 -415l-8 25q130 38 213.5 159.5t83.5 260.5v672q0 26 -19.5 51.5t-50.5 25.5t-108 -62v-477q0 -45 57 -45q39 0 85 28q-40 -51 -140.5 -123.5t-139.5 -118.5q-117 147 -238 187v27q85 1 85 41v502q-129 71 -129 170t80 167 t179 68q16 0 31 -2v-27q-10 1 -31 1t-65 -17t-44 -48q0 -22 50 -41l90 -33q71 -30 101 -88q20 -39 35 -131l326 214q43 -40 90.5 -113t47.5 -118v-521z" />
+<glyph unicode="&#x1d59f;" horiz-adv-x="815" d="M740 25q0 -190 -121.5 -328t-308.5 -138q-138 0 -224 100t-86 241q0 329 356 475q-29 25 -42 25q-63 0 -124.5 -43t-74 -43t-28 13t-15.5 27q0 33 68 51q104 27 127 39q68 37 68 107t-34.5 115.5t-86 45.5t-125.5 -51l-17 26l358 252q99 -98 112 -113q62 -75 62 -141 q0 -85 -80 -145q-41 -31 -155 -80q43 -7 125 -26l208 79q-1 -16 10 -26l-178 -70q101 -56 153.5 -162.5t52.5 -229.5zM421 -185q15 101 15 299t-69 236q-246 -95 -246 -450q0 -114 29 -195q42 -117 134 -117q104 0 137 227z" />
+<glyph unicode="&#x1d5a0;" horiz-adv-x="1223" d="M1206 0h-174l-132 379h-591l-132 -379h-165l483 1343h228zM850 518l-246 697l-247 -697h493z" />
+<glyph unicode="&#x1d5a1;" horiz-adv-x="1227" d="M912 1287q137 -71 137 -246t-179 -264v-18q140 -29 216.5 -119.5t76.5 -229.5q0 -192 -138 -301t-391 -109h-469v1343h391q250 0 356 -56zM878 1022q0 51 -17 87q-37 77 -161 89q-61 6 -151 6h-220v-407h238q159 0 235 49t76 176zM992 403q0 158 -116 219q-71 37 -259 37 h-288v-520h244q234 0 319 59q100 70 100 205z" />
+<glyph unicode="&#x1d5a2;" horiz-adv-x="1250" d="M739 -24q-299 0 -469 169q-181 182 -181 525q0 167 46 298q92 259 338 353q120 46 267 46q215 0 448 -116v-202h-4q-213 179 -456 179q-208 0 -338 -142.5t-130 -414t139 -420.5q125 -135 331 -135q257 0 455 179h3v-199q-62 -29 -190 -79q-130 -41 -259 -41z" />
+<glyph unicode="&#x1d5a3;" horiz-adv-x="1381" d="M1285 670q0 -172 -74.5 -323.5t-214.5 -239.5q-171 -107 -499 -107h-332v1343h328q336 0 505 -106q287 -181 287 -567zM1113 673q0 530 -609 530h-175v-1063h175q264 0 406 91q203 132 203 442z" />
+<glyph unicode="&#x1d5a4;" horiz-adv-x="1130" d="M1035 0h-870v1343h870v-145h-706v-388h706v-145h-706v-520h706v-145z" />
+<glyph unicode="&#x1d5a5;" horiz-adv-x="1026" d="M1008 1198h-679v-399h584v-145h-584v-654h-164v1343h843v-145z" />
+<glyph unicode="&#x1d5a6;" horiz-adv-x="1390" d="M778 115q177 0 331 64v346h-360v143h522v-570q-270 -124 -485 -124q-156 0 -286 43q-262 88 -361 348q-50 131 -50 308q0 324 186 509t511 185q234 0 484 -119v-202h-6q-99 76 -186 116q-145 66 -323 66q-239 0 -367 -153t-128 -402.5t133.5 -403.5t384.5 -154z" />
+<glyph unicode="&#x1d5a7;" horiz-adv-x="1346" d="M1178 0h-164v665h-685v-665h-164v1343h164v-533h685v533h164v-1343z" />
+<glyph unicode="&#x1d5a8;" horiz-adv-x="748" d="M624 0h-515v123h175v1097h-175v123h515v-123h-176v-1097h176v-123z" />
+<glyph unicode="&#x1d5a9;" horiz-adv-x="809" d="M643 346q0 -177 -105.5 -271t-284.5 -94q-112 0 -228 25v155h1q117 -40 203 -40q160 0 211 77q39 59 39 216v800h-284v129h448v-997z" />
+<glyph unicode="&#x1d5aa;" horiz-adv-x="1240" d="M333 0h-163v1343h163v-720l663 720h196l-592 -631l621 -712h-212l-534 608l-142 -152v-456z" />
+<glyph unicode="&#x1d5ab;" horiz-adv-x="993" d="M1000 0h-835v1343h164v-1198h671v-145z" />
+<glyph unicode="&#x1d5ac;" horiz-adv-x="1512" d="M1346 0h-163v1196l-386 -822h-97l-383 823v-1197h-152v1343h232l363 -766l351 766h235v-1343z" />
+<glyph unicode="&#x1d5ad;" horiz-adv-x="1340" d="M1175 0h-209l-649 1238v-1238h-152v1343h265l593 -1132v1132h152v-1343z" />
+<glyph unicode="&#x1d5ae;" horiz-adv-x="1411" d="M1321 671q0 -331 -166.5 -515t-450.5 -184q-140 0 -254 47q-231 94 -318 355q-43 130 -43 297q0 329 164 514.5t451 185.5q143 0 257 -47q231 -97 317 -355q43 -131 43 -298zM1150 671q0 240 -100 388q-116 171 -345 171t-346 -171q-99 -147 -99 -387.5t100 -387.5 q117 -171 345.5 -171t344.5 171q100 147 100 387z" />
+<glyph unicode="&#x1d5af;" horiz-adv-x="1077" d="M1029 940q0 -178 -116 -296q-137 -138 -398 -138h-186v-506h-164v1343h357q120 0 203 -20q184 -45 263 -190q41 -76 41 -193zM487 645q209 0 290 83t81 218.5t-102 202.5q-82 54 -243 54h-184v-558h158z" />
+<glyph unicode="&#x1d5b0;" horiz-adv-x="1411" d="M793 -17q-48 -8 -89 -8q-140 0 -254 47q-231 94 -318 354q-43 129 -43 296q0 329 164 514t451 185q143 0 257 -47q231 -96 317 -355q43 -130 43 -297q0 -246 -99.5 -414t-271.5 -237q4 -112 51 -171.5t170 -59.5q84 0 162 31h15v-152q-97 -23 -207 -23q-154 0 -247 84.5 t-101 252.5zM1050 286q100 147 100 386.5t-100 386.5q-116 171 -345 171t-345 -170q-100 -147 -100 -387t100 -387q117 -171 345.5 -171t344.5 171z" />
+<glyph unicode="&#x1d5b1;" horiz-adv-x="1244" d="M1031 981q0 -281 -280 -392l502 -589h-212l-449 540h-263v-540h-164v1343h369q121 0 202 -16q176 -34 255 -170q40 -69 40 -176zM859 968q0 235 -312 235h-218v-528h188q182 0 262 75t80 218z" />
+<glyph unicode="&#x1d5b2;" horiz-adv-x="1223" d="M1126 380q0 -171 -143 -287.5t-391 -116.5t-486 106v213h2q214 -179 489 -179q141 0 236 49q122 62 122 190q0 91 -44 136.5t-138 70.5q-105 19 -314 60q-345 73 -345 365q0 184 162 290q140 90 335 90q249 0 461 -92v-201h-2q-180 153 -460 153q-124 0 -214 -49 q-111 -60 -111 -174q0 -168 201 -215q116 -19 345 -68q295 -78 295 -341z" />
+<glyph unicode="&#x1d5b3;" horiz-adv-x="1101" d="M1108 1198h-480v-1198h-163v1198h-480v145h1123v-145z" />
+<glyph unicode="&#x1d5b4;" horiz-adv-x="1311" d="M1161 538q0 -300 -133 -433t-376.5 -133t-374.5 134.5t-131 431.5v805h163v-814q0 -196 66 -294q83 -123 278.5 -123t278.5 123q66 98 66 289v819h163v-805z" />
+<glyph unicode="&#x1d5b5;" horiz-adv-x="1223" d="M1206 1343l-483 -1343h-228l-483 1343h175l426 -1210l427 1210h166z" />
+<glyph unicode="&#x1d5b6;" horiz-adv-x="1776" d="M1711 1343l-345 -1343h-189l-289 1151l-281 -1151h-185l-352 1343h168l288 -1153l284 1153h169l286 -1164l287 1164h159z" />
+<glyph unicode="&#x1d5b7;" horiz-adv-x="1226" d="M1168 1343l-458 -664l457 -679h-188l-370 565l-379 -565h-177l463 671l-452 672h187l366 -558l374 558h177z" />
+<glyph unicode="&#x1d5b8;" horiz-adv-x="1099" d="M628 0h-163v571l-469 772h180l371 -614l375 614h173l-467 -753v-590z" />
+<glyph unicode="&#x1d5b9;" horiz-adv-x="1226" d="M1132 0h-1033v158l831 1040h-801v145h983v-153l-840 -1045h860v-145z" />
+<glyph unicode="&#x1d5ba;" horiz-adv-x="1016" d="M870 0h-154v98q-40 -29 -124 -79q-95 -45 -215 -45t-205.5 83.5t-85.5 210.5q0 195 173 272q122 53 457 70v24q0 101 -72 142q-57 32 -180 32t-288 -63h-8v158q154 42 301 42q197 0 299 -74.5t102 -244.5v-626zM246 278q0 -159 194 -159q135 0 276 108v257 q-126 -7 -193.5 -13t-126.5 -23q-150 -42 -150 -170z" />
+<glyph unicode="&#x1d5bb;" horiz-adv-x="1054" d="M890 794q75 -126 75 -340t-118.5 -347t-285.5 -133q-128 0 -253 69l-10 -43h-145v1286h155v-460q149 123 304 123q186 0 278 -155zM530 114q275 0 275 343.5t-231 343.5q-131 0 -266 -105v-529q118 -53 222 -53z" />
+<glyph unicode="&#x1d5bc;" horiz-adv-x="882" d="M540 -21q-208 0 -330.5 122t-122.5 349t119 360.5t334 133.5q144 0 295 -76v-173h-8q-147 115 -294 115t-221 -105q-64 -91 -64 -244.5t69 -250t216 -96.5q96 0 172 39t122 76h8v-171q-164 -79 -295 -79z" />
+<glyph unicode="&#x1d5bd;" horiz-adv-x="1054" d="M902 0h-156v97q-141 -123 -297 -123q-186 0 -281 154q-79 128 -79 340t119.5 346.5t290.5 134.5q126 0 247 -63v400h156v-1286zM526 806q-144 0 -215 -106q-61 -91 -61 -242q0 -336 236 -336q127 0 260 105v530q-111 49 -220 49z" />
+<glyph unicode="&#x1d5be;" horiz-adv-x="1008" d="M925 445h-680q0 -164 91.5 -247.5t236.5 -83.5q78 0 175.5 32t150.5 80h8v-170q-184 -77 -332 -77q-230 0 -358.5 124t-128.5 346.5t118 361t320.5 138.5t300.5 -112t98 -307v-85zM528 821q-118 0 -195 -70t-88 -187h529q-1 257 -246 257z" />
+<glyph unicode="&#x1d5bf;" horiz-adv-x="595" d="M649 1135h-8q-79 23 -139 23q-107 0 -148.5 -47.5t-41.5 -156.5v-31h280v-131h-276v-792h-155v792h-105v131h105v31q0 340 318 340q84 0 170 -17v-142z" />
+<glyph unicode="&#x1d5c0;" horiz-adv-x="1054" d="M902 105q0 -455 -435 -455q-140 0 -281 40v159h8q150 -59 293 -59t205 72q54 61 54 179v85q-139 -112 -297 -112q-185 0 -279 141q-81 121 -81 327.5t119.5 336.5t288.5 130q130 0 249 -66l10 40h146v-818zM525 809q-142 0 -208.5 -94t-66.5 -242q0 -315 235 -315 q136 0 261 96v503q-115 52 -221 52z" />
+<glyph unicode="&#x1d5c1;" horiz-adv-x="1071" d="M925 0h-156v526q0 149 -34 206q-42 69 -161.5 69t-265.5 -112v-689h-155v1286h155v-465q155 128 310 128q307 0 307 -350v-599z" />
+<glyph unicode="&#x1d5c2;" horiz-adv-x="464" d="M320 1078h-175v161h175v-161zM310 0h-155v923h155v-923z" />
+<glyph unicode="&#x1d5c3;" horiz-adv-x="583" d="M440 1078h-175v161h175v-161zM431 -22q0 -152 -77.5 -240t-227.5 -88q-92 0 -177 24v148h8q82 -33 139 -33q114 0 150 66q29 53 29 194v743h-192v131h348v-945z" />
+<glyph unicode="&#x1d5c4;" horiz-adv-x="1001" d="M315 0h-156v1286h156v-825l449 462h195l-429 -426l461 -497h-205l-370 404l-101 -96v-308z" />
+<glyph unicode="&#x1d5c5;" horiz-adv-x="464" d="M310 0h-155v1286h155v-1286z" />
+<glyph unicode="&#x1d5c6;" horiz-adv-x="1646" d="M1500 0h-156v526q0 150 -28 203q-38 72 -153 72t-265 -116q6 -44 6 -94v-591h-155v526q0 151 -28 204q-38 71 -152.5 71t-260.5 -112v-689h-155v923h155v-102q155 128 299 128q190 0 258 -150q178 150 338 150q297 0 297 -350v-599z" />
+<glyph unicode="&#x1d5c7;" horiz-adv-x="1071" d="M925 0h-156v526q0 149 -34 206q-42 69 -161.5 69t-265.5 -112v-689h-155v923h155v-102q155 128 310 128q307 0 307 -350v-599z" />
+<glyph unicode="&#x1d5c8;" horiz-adv-x="1027" d="M940 461q0 -212 -109.5 -349.5t-317 -137.5t-316.5 137t-109 350t109 350.5t316.5 137.5t317 -138t109.5 -350zM779 461.5q0 353.5 -265.5 353.5t-265.5 -353.5t265.5 -353.5t265.5 353.5z" />
+<glyph unicode="&#x1d5c9;" horiz-adv-x="1054" d="M890 796q75 -124 75 -337t-119 -345t-289 -132q-131 0 -249 64v-386h-155v1263h155v-97q146 123 304 123q186 0 278 -153zM805 469q0 332 -232 332q-127 0 -265 -105v-523q114 -52 222 -52q275 0 275 348z" />
+<glyph unicode="&#x1d5ca;" horiz-adv-x="1054" d="M902 -340h-156v444q-142 -122 -296 -122q-185 0 -281 152q-80 128 -80 339t119.5 343.5t288.5 132.5q129 0 249 -66l10 40h146v-1263zM525 809q-143 0 -214 -104q-61 -89 -61 -239q0 -336 234 -336q129 0 262 105v522q-116 52 -221 52z" />
+<glyph unicode="&#x1d5cb;" horiz-adv-x="722" d="M729 754h-8q-66 15 -145 15q-128 0 -268 -114v-655h-155v923h155v-136q170 136 308 136q50 0 113 -10v-159z" />
+<glyph unicode="&#x1d5cc;" horiz-adv-x="882" d="M812 266q0 -146 -128 -223q-106 -65 -272 -65t-321 77v175h8q160 -121 336 -121q219 0 219 137q0 63 -47 94q-30 20 -105 37q-62 11 -184 39q-223 59 -223 248q0 118 98 199.5t273 81.5t310 -69v-166h-8q-142 104 -312 104q-78 0 -132 -26q-70 -34 -70 -104 q0 -98 148 -133l185 -38q225 -52 225 -247z" />
+<glyph unicode="&#x1d5cd;" horiz-adv-x="667" d="M445 -18q-289 0 -289 320v490h-105v131h105v265h156v-265h320v-131h-320v-420q0 -143 26 -190q35 -64 147 -64q66 0 139 30h8v-140q-100 -26 -187 -26z" />
+<glyph unicode="&#x1d5ce;" horiz-adv-x="1071" d="M918 0h-155v102q-163 -128 -309 -128q-308 0 -308 350v599h156v-526q0 -148 34 -205q43 -70 164 -70t263 112v689h155v-923z" />
+<glyph unicode="&#x1d5cf;" horiz-adv-x="1001" d="M951 923l-373 -923h-157l-371 923h169l286 -735l283 735h163z" />
+<glyph unicode="&#x1d5d0;" horiz-adv-x="1385" d="M1314 923l-241 -923h-143l-238 711l-235 -711h-143l-243 923h162l169 -715l231 715h128l236 -715l161 715h156z" />
+<glyph unicode="&#x1d5d1;" horiz-adv-x="1001" d="M952 0h-196l-262 354l-263 -354h-181l360 460l-357 463h196l260 -349l261 349h182l-363 -454z" />
+<glyph unicode="&#x1d5d2;" horiz-adv-x="1001" d="M951 923l-539 -1263h-166l172 385l-368 878h169l283 -684l286 684h163z" />
+<glyph unicode="&#x1d5d3;" horiz-adv-x="889" d="M822 0h-745v115l538 678h-527v130h720v-111l-540 -681h554v-131z" />
+<glyph unicode="&#x1d5d4;" horiz-adv-x="1375" d="M1360 0h-325l-93 278h-520l-93 -278h-316l485 1343h377zM869 498l-187 558l-187 -558h374z" />
+<glyph unicode="&#x1d5d5;" horiz-adv-x="1349" d="M1185 1039q0 -195 -196 -284v-31q139 -28 212 -108t73 -211q0 -188 -142 -296.5t-405 -108.5h-571v1343h506q267 0 380 -58q143 -74 143 -246zM845.5 885q16.5 38 16.5 80.5t-19 80.5q-35 72 -166 75q-57 2 -159 2h-48v-323h70q188 0 238.5 23.5t67 61.5zM924 315 q22 42 22 104t-28 102q-48 71 -208 73l-240 1v-375h41l209 1q156 3 204 94z" />
+<glyph unicode="&#x1d5d6;" horiz-adv-x="1280" d="M804 207q190 0 389 182h15v-303q-60 -27 -182 -73q-133 -39 -278 -39q-305 0 -487.5 179t-182.5 509.5t180.5 518.5t490.5 188q152 0 252.5 -28t206.5 -80v-308h-19q-137 119 -258 162q-61 21 -129 21q-266 0 -361 -251q-34 -89 -34 -216q0 -244 130 -364 q107 -98 267 -98z" />
+<glyph unicode="&#x1d5d7;" horiz-adv-x="1472" d="M1394 670q0 -171 -77 -323.5t-217 -239.5q-172 -107 -486 -107h-458v1343h472q307 0 475 -106q291 -183 291 -567zM876 281q191 110 191 395.5t-209 393.5q-93 48 -283 48h-103v-892h103q204 0 301 55z" />
+<glyph unicode="&#x1d5d8;" horiz-adv-x="1206" d="M1097 0h-941v1343h941v-234h-627v-269h582v-234h-582v-372h627v-234z" />
+<glyph unicode="&#x1d5d9;" horiz-adv-x="1147" d="M1088 1109h-618v-288h573v-234h-573v-587h-314v1343h932v-234z" />
+<glyph unicode="&#x1d5da;" horiz-adv-x="1438" d="M889 193q46 0 103 5v300h-267v227h588v-651q-265 -102 -520 -102q-337 0 -526 186t-189 507t191 512.5t535 191.5q267 0 504 -116v-296h-18q-169 128 -291 166q-72 21 -153 21q-191 0 -315 -120t-124 -350t122.5 -355.5t359.5 -125.5z" />
+<glyph unicode="&#x1d5db;" horiz-adv-x="1486" d="M1329 0h-315v606h-542v-606h-316v1343h316v-503h542v503h315v-1343z" />
+<glyph unicode="&#x1d5dc;" horiz-adv-x="958" d="M851 0h-755v212h220v919h-220v212h755v-212h-220v-919h220v-212z" />
+<glyph unicode="&#x1d5dd;" horiz-adv-x="975" d="M825 1343v-955q0 -185 -127 -297t-371 -112q-179 0 -304 24v250h14q119 -45 213 -45q183 0 232 107q28 59 28 244v563h-308v221h623z" />
+<glyph unicode="&#x1d5de;" horiz-adv-x="1365" d="M472 0h-316v1343h316v-652l503 652h360l-511 -620l539 -723h-385l-409 560l-97 -121v-439z" />
+<glyph unicode="&#x1d5df;" horiz-adv-x="1123" d="M1094 0h-938v1343h316v-1109h622v-234z" />
+<glyph unicode="&#x1d5e0;" horiz-adv-x="1685" d="M1533 0h-313v982l-275 -659h-218l-275 659v-982h-296v1343h377l312 -713l312 713h376v-1343z" />
+<glyph unicode="&#x1d5e1;" horiz-adv-x="1502" d="M1347 0h-310l-594 984v-984h-287v1343h390l514 -826v826h287v-1343z" />
+<glyph unicode="&#x1d5e2;" horiz-adv-x="1508" d="M1251 1183.5q180 -187.5 180 -511t-179.5 -512t-497 -188.5t-497 188.5t-179.5 512t179.5 511t496.5 187.5t497 -187.5zM998 1033q-93 110 -241.5 110t-249 -114.5t-100.5 -353.5t98 -357t250.5 -118t250 120t97.5 354t-105 359z" />
+<glyph unicode="&#x1d5e3;" horiz-adv-x="1296" d="M1234 925q0 -198 -117 -318q-157 -159 -414 -159h-231v-448h-316v1343h555q232 0 363 -88q160 -107 160 -330zM838.5 734q68.5 59 68.5 184.5t-112 171.5q-68 28 -248 28h-75v-443h114q184 0 252.5 59z" />
+<glyph unicode="&#x1d5e4;" horiz-adv-x="1508" d="M1431 674q0 -239 -105.5 -411t-316.5 -244q4 -110 54 -153.5t149.5 -43.5t176.5 36h15v-214q-120 -27 -275 -27q-202 0 -303 94t-111 270q-309 18 -473 201t-164 499t179.5 503t496.5 187t497 -187t180 -510zM1103 677q0 233 -99 350t-247.5 117t-249 -114t-100.5 -351.5 t98 -355.5t250.5 -118t250 119.5t97.5 352.5z" />
+<glyph unicode="&#x1d5e5;" horiz-adv-x="1386" d="M470 504v-504h-314v1343h566q240 0 357 -72q158 -96 158 -290q0 -147 -66.5 -239.5t-208.5 -162.5l441 -579h-384l-366 504h-183zM834 769q75 60 75 174t-101 156q-53 23 -197 23h-141v-402h122q179 0 242 49z" />
+<glyph unicode="&#x1d5e6;" horiz-adv-x="1256" d="M1200 416q0 -225 -201 -343q-166 -97 -420 -97t-496 100v303h17q226 -181 502 -181q113 0 163.5 21t80 49.5t29.5 84.5q0 105 -159 143q-107 21 -317 76q-308 102 -308 377q0 209 198 323q163 95 403 95t455 -87v-290h-16q-194 156 -444 156q-102 0 -175 -29 q-95 -39 -95 -121q0 -63 45 -95.5t161 -56.5l142 -31q268 -57 365 -175q70 -85 70 -222z" />
+<glyph unicode="&#x1d5e7;" horiz-adv-x="1204" d="M1176 1109h-419v-1109h-316v1109h-419v234h1154v-234z" />
+<glyph unicode="&#x1d5e8;" horiz-adv-x="1440" d="M1301 482q0 -247 -146.5 -378.5t-435.5 -131.5t-435.5 131.5t-146.5 377.5v862h318v-841q0 -149 62.5 -224.5t200.5 -75.5t202 72.5t64 227.5v841h317v-861z" />
+<glyph unicode="&#x1d5e9;" horiz-adv-x="1352" d="M1336 1343l-478 -1343h-366l-479 1343h331l335 -999l336 999h321z" />
+<glyph unicode="&#x1d5ea;" horiz-adv-x="2012" d="M1974 1343l-353 -1343h-360l-253 940l-246 -940h-359l-354 1343h329l218 -997l260 997h322l248 -997l228 997h320z" />
+<glyph unicode="&#x1d5eb;" horiz-adv-x="1352" d="M1329 0h-363l-297 465l-304 -465h-344l465 677l-455 666h361l288 -441l296 441h345l-458 -652z" />
+<glyph unicode="&#x1d5ec;" horiz-adv-x="1303" d="M812 0h-316v504l-491 839h357l300 -549l289 549h344l-483 -823v-520z" />
+<glyph unicode="&#x1d5ed;" horiz-adv-x="1222" d="M1163 0h-1097v236l686 873h-653v234h1028v-241l-685 -868h721v-234z" />
+<glyph unicode="&#x1d5ee;" horiz-adv-x="1124" d="M992 0h-293v98q-41 -32 -126 -84q-84 -39 -204 -39t-209 80.5t-89 209.5q0 270 377 319q122 15 252 23v4q0 135 -246 135q-105 0 -276 -65h-27v222q175 46 377 46t312 -54q152 -76 152 -267v-628zM371 288q0 -56 34 -84.5t125.5 -28.5t168.5 66v192q-86 -7 -236 -34 q-92 -28 -92 -111z" />
+<glyph unicode="&#x1d5ef;" horiz-adv-x="1177" d="M1024 800q79 -123 79 -325t-108 -341q-117 -152 -313 -152q-138 0 -246 64l-13 -46h-283v1279h296v-452q153 121 303 121q191 0 285 -148zM798 468q0 257 -191 257q-88 0 -171 -49v-464q55 -20 129 -20q233 0 233 276z" />
+<glyph unicode="&#x1d5f0;" horiz-adv-x="990" d="M621 -25q-251 0 -400 121.5t-149 366t164 373.5q143 112 375 112q168 0 323 -73v-253h-41q-60 51 -102 73q-78 42 -167 42q-122 0 -184 -77t-62 -202q0 -271 251 -271q102 0 175 42q40 24 89 70h41v-252q-151 -72 -313 -72z" />
+<glyph unicode="&#x1d5f1;" horiz-adv-x="1177" d="M1037 0h-296v96q-148 -121 -296 -121q-187 0 -286 152q-85 130 -85 340.5t127 351.5q118 129 295 129q117 0 245 -62v393h296v-1279zM612 732q-233 0 -233 -274q0 -258 197 -258q88 0 165 55v453q-58 24 -129 24z" />
+<glyph unicode="&#x1d5f2;" horiz-adv-x="1118" d="M1049 407h-678q14 -224 307 -224q181 0 321 106h32v-237q-190 -77 -385 -77q-258 0 -406 109q-168 124 -168 366t143.5 372t381.5 130q452 0 452 -442v-103zM573 767q-190 0 -202 -187h384q-5 187 -182 187z" />
+<glyph unicode="&#x1d5f3;" horiz-adv-x="711" d="M738 1062h-22q-71 20 -119 20q-88 0 -118.5 -32t-30.5 -120v-7h228v-201h-218v-722h-296v722h-127v201h127v25q0 339 362 339q123 0 214 -16v-209z" />
+<glyph unicode="&#x1d5f4;" horiz-adv-x="1177" d="M1037 106q0 -251 -133.5 -352.5t-379.5 -101.5q-188 0 -351 40v231h36q144 -57 285.5 -57t194 54t52.5 170v18q-116 -95 -263 -95q-404 0 -404 472q0 212 118.5 337.5t299.5 125.5q141 0 248 -66l10 41h287v-817zM612 732q-233 0 -233 -254q0 -238 197 -238q87 0 165 51 v418q-55 23 -129 23z" />
+<glyph unicode="&#x1d5f5;" horiz-adv-x="1199" d="M1067 0h-298v458q0 145 -28 198t-120.5 53t-184.5 -55v-654h-296v1279h296v-458q163 127 313 127q318 0 318 -347v-601z" />
+<glyph unicode="&#x1d5f6;" horiz-adv-x="575" d="M444 1054h-312v225h312v-225zM436 0h-296v923h296v-923z" />
+<glyph unicode="&#x1d5f7;" horiz-adv-x="678" d="M539 1054h-315v225h315v-225zM539 -16q0 -154 -94.5 -243t-249.5 -89t-243 22v212h23q60 -20 120 -20q93 0 126 67q22 46 22 152v637h-175v201h471v-939z" />
+<glyph unicode="&#x1d5f8;" horiz-adv-x="1129" d="M436 0h-296v1279h296v-764l319 408h341l-332 -398l355 -525h-344l-259 402l-80 -98v-304z" />
+<glyph unicode="&#x1d5f9;" horiz-adv-x="575" d="M436 0h-296v1279h296v-1279z" />
+<glyph unicode="&#x1d5fa;" horiz-adv-x="1781" d="M1649 0h-298v461q0 149 -20 192q-28 56 -130 56q-64 0 -159 -55v-654h-297v461q0 149 -22 192q-28 56 -129 56q-67 0 -158 -55v-654h-296v923h296v-102q162 127 300 127q191 0 271 -160q190 160 337 160q305 0 305 -347v-601z" />
+<glyph unicode="&#x1d5fb;" horiz-adv-x="1199" d="M1067 0h-298v458q0 145 -28 198t-120.5 53t-184.5 -55v-654h-296v923h296v-102q163 127 313 127q318 0 318 -347v-601z" />
+<glyph unicode="&#x1d5fc;" horiz-adv-x="1155" d="M1083 461q0 -234 -135.5 -362t-370.5 -128t-370 128.5t-135 361.5t135.5 362t370.5 129t370 -128.5t135 -362.5zM671 197q105 54 105 260q0 229 -119 274q-37 14 -80 14q-90 0 -144 -62.5t-54 -219t52.5 -221t148.5 -64.5q53 0 91 19z" />
+<glyph unicode="&#x1d5fd;" horiz-adv-x="1177" d="M1023 800q80 -125 80 -338.5t-123.5 -346.5t-297.5 -133q-125 0 -246 64v-385h-296v1262h296v-96q153 121 303 121q189 0 284 -148zM798 468q0 257 -191 257q-88 0 -171 -49v-465q46 -18 129 -18q233 0 233 275z" />
+<glyph unicode="&#x1d5fe;" horiz-adv-x="1177" d="M1037 -339h-296v429q-143 -115 -296 -115q-188 0 -287 152q-84 130 -84 340.5t127 351.5q118 129 295 129q118 0 244 -66l10 41h287v-1262zM612 732q-233 0 -233 -274q0 -258 197 -258q88 0 165 55v453q-58 24 -129 24z" />
+<glyph unicode="&#x1d5ff;" horiz-adv-x="837" d="M809 641h-27q-37 13 -140.5 13t-205.5 -36v-618h-296v923h296v-136q162 139 303 139q40 0 70 -3v-282z" />
+<glyph unicode="&#x1d600;" horiz-adv-x="999" d="M105 292q169 -120 351.5 -120t182.5 76q0 39 -42 58q-16 8 -78 19t-189 38q-248 65 -248 276q0 160 165 244q129 65 317.5 65t335.5 -65v-234h-25q-149 102 -319.5 102t-170.5 -75q0 -43 44 -63q19 -9 84.5 -21t199.5 -41q229 -58 229 -258q0 -168 -165 -253 q-129 -65 -333.5 -65t-365.5 73v244h27z" />
+<glyph unicode="&#x1d601;" horiz-adv-x="767" d="M498 -18q-173 0 -257 70t-84 239v431h-122v201h122v264h296v-264h277v-201h-277v-327q0 -116 14 -149q26 -63 126 -63q62 0 112 28h25v-203q-102 -26 -232 -26z" />
+<glyph unicode="&#x1d602;" horiz-adv-x="1199" d="M1059 0h-295v102q-168 -127 -314 -127q-318 0 -318 347v601h298v-458q0 -145 28 -198t123.5 -53t182.5 55v654h295v-923z" />
+<glyph unicode="&#x1d603;" horiz-adv-x="1094" d="M1069 923l-356 -923h-335l-353 923h313l213 -635l212 635h306z" />
+<glyph unicode="&#x1d604;" horiz-adv-x="1649" d="M1612 923l-286 -923h-314l-188 622l-185 -622h-318l-284 923h311l157 -636l198 636h262l187 -636l156 636h304z" />
+<glyph unicode="&#x1d605;" horiz-adv-x="1126" d="M1105 0h-346l-197 276l-202 -276h-339l364 461l-358 462h345l194 -271l195 271h340l-360 -455z" />
+<glyph unicode="&#x1d606;" horiz-adv-x="1096" d="M1071 923l-513 -1262h-320l146 346l-359 916h310l221 -597l211 597h304z" />
+<glyph unicode="&#x1d607;" horiz-adv-x="1004" d="M936 0h-867v190l487 517h-467v216h838v-187l-479 -516h488v-220z" />
+<glyph unicode="&#x1d608;" horiz-adv-x="1240" d="M1114 0h-166l-44 382h-590l-221 -382h-171l792 1343h226zM886 515l-87 701l-408 -701h495z" />
+<glyph unicode="&#x1d609;" horiz-adv-x="1245" d="M939 748q222 -50 222 -259q0 -112 -55 -215q-149 -274 -564 -274h-484l308 1343h380q132 0 178 -5q103 -10 168 -50q96 -60 96 -177q-1 -119 -68 -207q-66 -89 -181 -138v-18zM1008 1059q0 75 -51 111q-60 40 -246 40h-210l-96 -418h244q156 0 240 49q119 69 119 218z M950 314q38 76 38 167.5t-82 142.5q-62 38 -253 38h-277l-123 -529h256q120 0 196 13q176 31 245 168z" />
+<glyph unicode="&#x1d60a;" horiz-adv-x="1268" d="M1299 1059q-175 175 -426 175t-417 -204t-166 -516q0 -190 97.5 -297t284.5 -107q256 0 492 186h1l-41 -197q-244 -123 -483 -123t-383 129t-144 375q0 379 218.5 633t585.5 254q218 0 424 -115l-39 -193h-4z" />
+<glyph unicode="&#x1d60b;" horiz-adv-x="1392" d="M412 0h-353l309 1343h306q324 0 483 -107q192 -130 192 -403q0 -226 -111 -423q-112 -197 -305 -303.5t-521 -106.5zM1176 814q0 395 -520 395h-155l-249 -1075h196q260 0 426 95q147 85 224.5 245t77.5 340z" />
+<glyph unicode="&#x1d60c;" horiz-adv-x="1147" d="M1236 1343l-31 -139h-707l-90 -398h706l-32 -138h-706l-122 -529h706l-32 -139h-869l308 1343h869z" />
+<glyph unicode="&#x1d60d;" horiz-adv-x="1041" d="M1210 1343l-31 -139h-678l-95 -409h583l-32 -138h-582l-152 -657h-165l309 1343h843z" />
+<glyph unicode="&#x1d60e;" horiz-adv-x="1410" d="M899 1234q-150 0 -264 -60q-226 -120 -306 -388q-39 -130 -39 -261q0 -417 426 -417q162 0 328 62l79 361h-358l31 137h522l-131 -569l-104 -43q-200 -82 -388 -82q-266 0 -423.5 132t-157.5 393q0 378 225.5 623t611.5 245q240 0 468 -118l-39 -195h-7 q-191 180 -474 180z" />
+<glyph unicode="&#x1d60f;" horiz-adv-x="1366" d="M1379 1343l-308 -1343h-163l153 668h-685l-154 -668h-163l308 1343h163l-122 -537h685l123 537h163z" />
+<glyph unicode="&#x1d610;" horiz-adv-x="759" d="M827 1343l-27 -117h-179l-254 -1109h177l-26 -117h-517l27 117h176l254 1109h-174l26 117h517z" />
+<glyph unicode="&#x1d611;" horiz-adv-x="821" d="M145 -19q-111 0 -221 25l35 149h3q111 -40 194 -40q159 0 227 82q51 61 86 215l184 808h-293l29 123h457l-228 -996q-40 -175 -165.5 -270.5t-307.5 -95.5z" />
+<glyph unicode="&#x1d612;" horiz-adv-x="1259" d="M1380 1343l-728 -642l478 -701h-193l-415 610l-193 -165l-102 -445h-165l310 1343h165l-167 -719l806 719h204z" />
+<glyph unicode="&#x1d613;" horiz-adv-x="1008" d="M925 139l-32 -139h-835l309 1343h165l-277 -1204h670z" />
+<glyph unicode="&#x1d614;" horiz-adv-x="1534" d="M1549 1343l-309 -1343h-165l274 1182l-567 -808h-96l-194 841l-281 -1215h-153l309 1343h234l182 -767l532 767h234z" />
+<glyph unicode="&#x1d615;" horiz-adv-x="1360" d="M1378 1343l-309 -1343h-201l-372 1237l-285 -1237h-153l309 1343h257l340 -1131l261 1131h153z" />
+<glyph unicode="&#x1d616;" horiz-adv-x="1432" d="M1389 870q0 -370 -205 -625q-219 -273 -567 -273q-240 0 -371 131t-131 371q0 372 212.5 634.5t558.5 262.5q240 0 371.5 -130.5t131.5 -370.5zM858 1238q-131 0 -237 -61q-212 -122 -293 -399q-40 -134 -40 -276q0 -182 90 -289.5t269 -107.5q253 0 410.5 217t158.5 522 q0 181 -90.5 287.5t-267.5 106.5z" />
+<glyph unicode="&#x1d617;" horiz-adv-x="1093" d="M542 509h-202l-117 -509h-165l309 1343h348q224 0 330 -83.5t105 -235.5q0 -227 -181 -379q-162 -136 -427 -136zM974 993q0 107 -70 161.5t-229 54.5h-173l-132 -568h170q207 0 309 85q125 105 125 267z" />
+<glyph unicode="&#x1d618;" horiz-adv-x="1432" d="M710 -19l-48 -3q-21 -2 -45 -2q-239 0 -371 130t-132 381t116.5 476.5t337.5 334.5q145 73 318 73q240 0 372 -130.5t132 -369.5q0 -285 -138 -522.5t-385 -328.5l-4 -39q-2 -18 -2 -28q0 -100 48 -136t132 -36t174 31h14l-29 -142q-101 -24 -212 -24q-284 0 -284 258 q0 21 6 77zM1215 845q0 181 -90 287t-267 106q-131 0 -236 -61q-213 -122 -294 -398q-39 -134 -39 -275q0 -182 90 -289.5t268 -107.5q254 0 411 216.5t157 521.5z" />
+<glyph unicode="&#x1d619;" horiz-adv-x="1263" d="M726 1343q231 0 332.5 -75t100.5 -214q0 -166 -103.5 -292.5t-281.5 -179.5l383 -582h-192l-352 543h-266l-124 -543h-165l308 1343h360zM980 1013q0 95 -62.5 145.5t-208.5 50.5h-208l-124 -538h198q178 0 277 75q128 99 128 267z" />
+<glyph unicode="&#x1d61a;" horiz-adv-x="1241" d="M1196 1089q-76 69 -198 107t-251 38t-230 -60q-123 -72 -123 -209t165 -178q106 -21 314 -70q255 -70 255 -276q0 -192 -169 -328.5t-434 -136.5t-484 109l41 196h4q85 -81 210 -126.5t266.5 -45.5t250.5 59q136 75 136 222q0 132 -149 174l-293 64q-291 67 -291 295 q0 214 189 338q162 106 396 106t437 -96l-38 -182h-4z" />
+<glyph unicode="&#x1d61b;" horiz-adv-x="1118" d="M1310 1343l-32 -139h-478l-278 -1204h-165l278 1204h-479l31 139h1123z" />
+<glyph unicode="&#x1d61c;" horiz-adv-x="1330" d="M545 -28q-412 0 -412 356q0 90 27 208l186 807h165l-187 -812q-24 -108 -24 -182q0 -243 276 -243q194 0 303 122q86 98 131 295l189 820h165l-185 -803q-71 -305 -231.5 -436.5t-402.5 -131.5z" />
+<glyph unicode="&#x1d61d;" horiz-adv-x="1240" d="M1391 1343l-792 -1343h-227l-175 1343h171l147 -1209l704 1209h172z" />
+<glyph unicode="&#x1d61e;" horiz-adv-x="1805" d="M1904 1343l-640 -1343h-195l-38 1149l-535 -1149h-186l-52 1343h166l35 -1152l539 1152h169l35 -1163l543 1163h159z" />
+<glyph unicode="&#x1d61f;" horiz-adv-x="1244" d="M1370 1343l-619 -668l309 -675h-179l-248 555l-507 -555h-179l626 674l-307 669h179l245 -549l500 549h180z" />
+<glyph unicode="&#x1d620;" horiz-adv-x="1116" d="M1291 1343l-635 -751l-136 -592h-165l131 569l-295 774h175l234 -617l515 617h176z" />
+<glyph unicode="&#x1d621;" horiz-adv-x="1244" d="M1309 1343l-33 -145l-1062 -1059h847l-32 -139h-1032l34 155l1053 1049h-796l32 139h989z" />
+<glyph unicode="&#x1d622;" horiz-adv-x="1030" d="M824 -13q-159 0 -178 121q-79 -57 -166 -95.5t-198 -38.5t-180.5 62.5t-69.5 169.5q0 212 192 309q166 83 525 94q12 54 12 75q0 73 -61 104q-49 26 -168 26t-290 -68h-8l30 156q167 43 313 43q343 0 343 -224q0 -41 -12 -95l-100 -433q-3 -13 -3 -24q0 -52 54 -52 q40 0 103 25h8l-28 -134q-86 -21 -118 -21zM196 235q0 -122 167 -122q135 0 299 114l60 260q-267 -11 -389 -61q-137 -57 -137 -191z" />
+<glyph unicode="&#x1d623;" horiz-adv-x="1054" d="M984 631q0 -275 -154.5 -466t-365.5 -191q-140 0 -252 71l-20 -45h-146l297 1286h155l-106 -460q175 123 315 123t208.5 -86.5t68.5 -231.5zM463 108q167 0 262.5 147t95.5 349t-180 202q-115 0 -279 -110l-122 -528q112 -60 223 -60z" />
+<glyph unicode="&#x1d624;" horiz-adv-x="882" d="M868 702q-128 114 -269 114q-172 0 -274 -152q-89 -133 -89 -314q0 -242 231 -242q143 0 318 120h9l-33 -169q-177 -80 -315 -80q-175 0 -274.5 88t-99.5 267t85.5 333.5t247.5 228.5q106 48 239 48t267 -75l-33 -167h-10z" />
+<glyph unicode="&#x1d625;" horiz-adv-x="1062" d="M837 169q0 -52 54 -52q40 0 103 25h8l-29 -134q-85 -21 -117 -21q-159 0 -179 120l-15 -10q-180 -123 -315 -123t-206 89t-71 234q0 267 153 459.5t370 192.5q144 0 251 -63l93 400h155l-252 -1093q-3 -13 -3 -24zM592 813q-165 0 -268 -154q-91 -136 -91 -339t184 -203 q111 0 275 110l123 530q-108 56 -223 56z" />
+<glyph unicode="&#x1d626;" horiz-adv-x="1008" d="M954 651q0 -68 -30 -203h-680q-9 -44 -9 -90q0 -123 74 -186.5t198 -63.5q180 0 349 116h9l-34 -168q-51 -19 -158 -52q-106 -25 -190 -25q-186 0 -298 87t-112 266q0 248 156.5 432.5t400.5 184.5q150 0 237 -75t87 -223zM801 639q0 187 -204 187q-119 0 -209 -73.5 t-122 -190.5h527q8 43 8 77z" />
+<glyph unicode="&#x1d627;" horiz-adv-x="595" d="M654 1164q-102 0 -152.5 -52t-75.5 -158l-8 -31h280l-30 -124h-275l-180 -799h-157l180 799h-105l30 124h105l7 31q73 340 386 340q86 0 171 -17l-33 -136h-8q-67 23 -135 23z" />
+<glyph unicode="&#x1d628;" horiz-adv-x="1052" d="M293 -350q-144 0 -276 40l36 155h8q132 -59 276.5 -59t213.5 68.5t98 190.5l19 81q-91 -61 -154.5 -86.5t-155.5 -25.5q-141 0 -214 85.5t-73 228.5q0 248 150 434.5t370 186.5q146 0 250 -66l19 40h146l-188 -821q-52 -227 -175.5 -339.5t-349.5 -112.5zM591 815 q-160 0 -259 -134.5t-99 -324.5q0 -204 188 -204q119 0 276 102l115 503q-112 58 -221 58z" />
+<glyph unicode="&#x1d629;" horiz-adv-x="1071" d="M971 712q0 -52 -14 -113l-139 -599h-155l121 526q21 89 21 141q0 139 -158 139q-110 0 -286 -117l-159 -689h-156l297 1286h155l-107 -465q183 128 325 128q255 0 255 -237z" />
+<glyph unicode="&#x1d62a;" horiz-adv-x="571" d="M499 1239l-37 -161h-175l37 161h175zM344 -18q-239 0 -239 208q0 51 14 112l143 621h155l-127 -551q-21 -93 -21 -141q0 -119 143 -119q70 0 144 30h8l-28 -134q-106 -26 -192 -26z" />
+<glyph unicode="&#x1d62b;" horiz-adv-x="583" d="M621 1239l-37 -161h-177l38 161h176zM-47 -350q-94 0 -175 24l32 141h8q70 -31 132 -31q112 0 162 71q34 49 67 194l173 749h-193l29 125h350l-218 -945q-76 -328 -367 -328z" />
+<glyph unicode="&#x1d62c;" horiz-adv-x="993" d="M1060 923l-526 -436l360 -487h-188l-295 406l-134 -109l-68 -297h-157l298 1286h157l-192 -827l541 464h204z" />
+<glyph unicode="&#x1d62d;" horiz-adv-x="571" d="M344 -18q-239 0 -239 208q0 51 14 112l227 984h156l-212 -914q-21 -93 -21 -141q0 -119 143 -119q70 0 144 30h8l-28 -134q-106 -26 -192 -26z" />
+<glyph unicode="&#x1d62e;" horiz-adv-x="1647" d="M1547 719q0 -56 -15 -120l-139 -599h-155l121 526q23 96 23 150q0 130 -152 130q-103 0 -282 -121q-4 -51 -14 -94l-137 -591h-155l122 526q23 103 23 150q0 130 -152 130q-96 0 -274 -117l-159 -689h-156l213 923h156l-24 -102q184 128 316 128q189 0 229 -150 q206 150 367 150q244 0 244 -230z" />
+<glyph unicode="&#x1d62f;" horiz-adv-x="1071" d="M971 712q0 -52 -14 -113l-139 -599h-155l121 526q21 89 21 141q0 139 -158 139q-110 0 -286 -117l-159 -689h-156l213 923h156l-24 -102q183 128 325 128q255 0 255 -237z" />
+<glyph unicode="&#x1d630;" horiz-adv-x="1027" d="M954 597q0 -260 -149.5 -441.5t-382.5 -181.5q-165 0 -256.5 94t-91.5 267.5t80.5 329.5t233.5 233q100 51 218 51q165 0 256.5 -93.5t91.5 -258.5zM792 584q0 235 -211 235q-155 0 -250.5 -139.5t-95.5 -339.5q0 -236 212 -236q157 0 251 140t94 340z" />
+<glyph unicode="&#x1d631;" horiz-adv-x="1054" d="M984 631q0 -274 -154.5 -461.5t-366.5 -187.5q-146 0 -251 66l-89 -388h-155l291 1263h156l-23 -97q175 123 316 123q276 0 276 -318zM462 116q165 0 262 143t97 345t-180 202q-115 0 -279 -110l-121 -523q106 -57 221 -57z" />
+<glyph unicode="&#x1d632;" horiz-adv-x="1054" d="M354 -18q-284 0 -284 315q0 267 153 459.5t370 192.5q144 0 251 -63l19 37h145l-292 -1263h-155l103 444q-173 -122 -310 -122zM592 814q-165 0 -268 -155q-91 -136 -91 -335.5t184 -199.5q113 0 277 111l121 522q-109 57 -223 57z" />
+<glyph unicode="&#x1d633;" horiz-adv-x="722" d="M653 775q-131 0 -301 -120l-149 -655h-157l211 923h157l-31 -136q195 136 333 136q52 0 111 -10l-35 -154h-9q-62 16 -130 16z" />
+<glyph unicode="&#x1d634;" horiz-adv-x="882" d="M814 715q-129 105 -290 105q-91 0 -154 -35q-78 -43 -78 -126t127 -114q57 -11 170 -37q193 -47 193 -201q0 -136 -122 -232.5t-309.5 -96.5t-336.5 81l35 166h8q53 -46 116 -75q97 -47 196 -47q248 0 248 170q0 75 -131 105q-57 12 -169 38q-189 53 -189 205 q0 130 115 227t302.5 97t309.5 -72l-33 -158h-8z" />
+<glyph unicode="&#x1d635;" horiz-adv-x="667" d="M269 231q0 -119 144 -119q70 0 144 30h8l-29 -134q-105 -26 -191 -26q-239 0 -239 208q0 51 14 112l115 495h-105l28 126h105l62 265h155l-62 -265h321l-28 -126h-321l-99 -425q-22 -92 -22 -141z" />
+<glyph unicode="&#x1d636;" horiz-adv-x="1075" d="M853 169q0 -52 54 -52q39 0 103 25h8l-28 -134q-85 -21 -118 -21q-164 0 -179 125q-188 -138 -339 -138q-253 0 -253 235q0 54 14 115l138 599h155l-121 -526q-21 -89 -21 -138q0 -142 159 -142q116 0 286 117l158 689h156l-169 -730q-3 -13 -3 -24z" />
+<glyph unicode="&#x1d637;" horiz-adv-x="1000" d="M1046 923l-587 -923h-154l-158 923h159l116 -735l453 735h171z" />
+<glyph unicode="&#x1d638;" horiz-adv-x="1385" d="M1409 923l-429 -923h-145l-93 713l-381 -713h-144l-58 923h159l24 -714l377 714h130l90 -714l307 714h163z" />
+<glyph unicode="&#x1d639;" horiz-adv-x="1001" d="M1059 923l-471 -465l258 -458h-175l-191 354l-346 -354h-191l474 467l-258 456h175l190 -352l344 352h191z" />
+<glyph unicode="&#x1d63a;" horiz-adv-x="1000" d="M1044 923l-831 -1263h-171l269 394l-167 869h159l131 -687l441 687h169z" />
+<glyph unicode="&#x1d63b;" horiz-adv-x="889" d="M911 923l-26 -111l-689 -688h553l-29 -124h-746l27 115l686 684h-528l29 124h723z" />
+<glyph unicode="&#x1d63c;" horiz-adv-x="1400" d="M1267 0h-317l-30 281h-517l-158 -281h-326l794 1343h379zM899 495l-59 560l-316 -560h375z" />
+<glyph unicode="&#x1d63d;" horiz-adv-x="1373" d="M611 0h-562l310 1343h477q192 0 314 -54q168 -74 168 -239q0 -121 -65 -200q-64 -77 -206 -120l-8 -31q119 -36 171.5 -93t52.5 -161q-2 -242 -218 -356q-169 -89 -434 -89zM791 1123h-168l-75 -323h177q119 0 188 48.5t69 142.5q1 71 -51.5 101.5t-139.5 30.5zM694 595 h-193l-87 -375h194q332 0 333 216q0 84 -61 121.5t-186 37.5z" />
+<glyph unicode="&#x1d63e;" horiz-adv-x="1303" d="M915 1136q-228 0 -362 -193q-119 -171 -119 -412q0 -324 297 -324q220 0 447 182h11l-74 -301q-62 -28 -190 -75q-131 -39 -275 -39q-266 0 -408 132t-142 378q0 389 240 638q238 247 592 247q267 0 454 -106l-75 -310h-21q-168 183 -375 183z" />
+<glyph unicode="&#x1d63f;" horiz-adv-x="1499" d="M515 0h-466l310 1343h422q336 0 490 -110q194 -138 194 -408q0 -222 -116 -419q-115 -197 -303.5 -301.5t-530.5 -104.5zM742 1124h-117l-210 -904h163q111 0 169 16q213 56 316 257q69 134 70 297q0 98 -35 169q-55 110 -180 146q-65 19 -176 19z" />
+<glyph unicode="&#x1d640;" horiz-adv-x="1228" d="M1300 1343l-52 -229h-627l-65 -277h582l-54 -230h-581l-88 -378h627l-52 -229h-941l310 1343h941z" />
+<glyph unicode="&#x1d641;" horiz-adv-x="1168" d="M1290 1343l-54 -234h-617l-67 -288h572l-53 -234h-572l-136 -587h-314l310 1343h931z" />
+<glyph unicode="&#x1d642;" horiz-adv-x="1464" d="M966 1144q-122 0 -221 -51q-195 -100 -273 -330q-38 -114 -38 -237q0 -169 92 -250q93 -83 298 -83q48 0 99 5l70 300h-268l53 227h588l-151 -650q-296 -103 -523 -103q-280 0 -436 134q-156 133 -156 378q0 388 245 638q243 247 628 247q289 0 509 -114l-73 -298h-20 q-194 187 -423 187z" />
+<glyph unicode="&#x1d643;" horiz-adv-x="1513" d="M1533 1343l-310 -1343h-317l141 607h-542l-140 -607h-316l310 1343h316l-117 -506h541l118 506h316z" />
+<glyph unicode="&#x1d644;" horiz-adv-x="975" d="M1054 1343l-49 -212h-219l-212 -919h219l-49 -212h-755l49 212h219l212 919h-219l49 212h755z" />
+<glyph unicode="&#x1d645;" horiz-adv-x="992" d="M211 -21q-172 0 -294 24l59 256h17q113 -46 202 -46q145 0 217 71t119 271l131 567h-307l51 221h623l-209 -902q-54 -236 -202 -349t-407 -113z" />
+<glyph unicode="&#x1d646;" horiz-adv-x="1390" d="M1535 1343l-661 -621l398 -722h-346l-304 566l-159 -141l-98 -425h-316l309 1343h316l-147 -639l643 639h365z" />
+<glyph unicode="&#x1d647;" horiz-adv-x="1144" d="M1041 234l-55 -234h-937l310 1343h316l-255 -1109h621z" />
+<glyph unicode="&#x1d648;" horiz-adv-x="1716" d="M1737 1343l-310 -1343h-315l223 966l-415 -643h-218l-127 674l-230 -997h-296l310 1343h373l148 -713l476 713h381z" />
+<glyph unicode="&#x1d649;" horiz-adv-x="1530" d="M1550 1343l-310 -1343h-272l-404 987l-228 -987h-287l310 1343h365l348 -831l191 831h287z" />
+<glyph unicode="&#x1d64a;" horiz-adv-x="1536" d="M669 -28q-270 0 -420 141q-148 139 -148 382v6q1 365 231.5 617.5t603.5 252.5q270 0 420 -141q149 -141 149 -380q-1 -363 -218 -609q-236 -269 -618 -269zM891 1149q-180 0 -317 -170q-140 -172 -140 -455q0 -161 74 -245q75 -85 207 -85q189 0 322 178t134 451 q0 150 -72 237q-73 89 -208 89z" />
+<glyph unicode="&#x1d64b;" horiz-adv-x="1320" d="M612 448h-144l-103 -448h-316l310 1343h470q266 0 390 -80q136 -86 136 -282q-1 -278 -246 -419q-198 -114 -497 -114zM1016 944q0 174 -240 174h-153l-102 -443h144q163 0 256.5 69.5t94.5 199.5z" />
+<glyph unicode="&#x1d64c;" horiz-adv-x="1536" d="M693 -22h-24q-269 0 -419 140q-149 140 -149 384v3q2 363 232.5 614.5t603.5 251.5q270 0 420 -141q148 -138 148 -374v-6q-1 -274 -133 -490q-65 -106 -163 -192t-228 -136q-8 -29 -11 -76q0 -70 43.5 -102t136.5 -32t174 36h12l-50 -214q-127 -27 -248 -27 q-179 0 -268 69q-87 67 -87 194q0 38 10 98zM892 1150q-180 0 -318 -170q-139 -170 -139 -452q0 -160 73 -244q75 -85 208 -85q189 0 322 177.5t134 448.5q0 150 -72 237q-73 88 -208 88z" />
+<glyph unicode="&#x1d64d;" horiz-adv-x="1411" d="M871 1343q241 0 369 -82q128 -81 128 -242q0 -165 -96 -275q-96 -108 -278 -170l303 -574h-351l-250 504h-217l-116 -504h-314l310 1343h512zM806 1122h-183l-94 -402h190q143 0 225 62q81 61 82 164q0 99 -57 138q-57 38 -163 38z" />
+<glyph unicode="&#x1d64e;" horiz-adv-x="1279" d="M791 1146q-295 0 -296 -165q0 -36 12 -61q24 -47 144 -89q63 -22 147 -45q189 -52 273 -110q132 -89 132 -243q-1 -228 -188 -343q-187 -114 -488 -114t-526 99l65 304h20q197 -181 496 -181t300 174q0 33 -13 57q-26 48 -141 89q-108 31 -320 105q-234 97 -234 305 q0 233 223 349q174 90 447.5 90t468.5 -85l-62 -292h-18q-169 156 -442 156z" />
+<glyph unicode="&#x1d64f;" horiz-adv-x="1226" d="M1380 1343l-54 -234h-419l-255 -1109h-317l256 1109h-418l53 234h1154z" />
+<glyph unicode="&#x1d650;" horiz-adv-x="1466" d="M646 -26q-520 0 -520 373q0 72 20 157l195 839h318l-193 -832q-15 -66 -15 -115q0 -92 55 -140q55 -49 177.5 -49t197.5 68t108 210l199 858h318l-195 -839q-65 -278 -219 -404t-446 -126z" />
+<glyph unicode="&#x1d651;" horiz-adv-x="1377" d="M1538 1343l-789 -1343h-365l-169 1343h323l106 -1017l559 1017h335z" />
+<glyph unicode="&#x1d652;" horiz-adv-x="2049" d="M2176 1343l-645 -1343h-347l-56 956l-462 -956h-361l-53 1343h330l-3 -999l482 999h321l37 -999l439 999h318z" />
+<glyph unicode="&#x1d653;" horiz-adv-x="1377" d="M1522 1343l-619 -666l320 -677h-343l-204 470l-420 -470h-340l632 690l-315 653h342l201 -445l405 445h341z" />
+<glyph unicode="&#x1d654;" horiz-adv-x="1327" d="M1497 1343l-670 -820l-121 -523h-316l115 500l-298 843h338l175 -556l417 556h360z" />
+<glyph unicode="&#x1d655;" horiz-adv-x="1244" d="M1328 1343l-54 -233l-915 -880h749l-54 -230h-1096l53 229l917 884h-680l52 230h1028z" />
+<glyph unicode="&#x1d656;" horiz-adv-x="1173" d="M871 -13q-206 0 -235 126q-17 -13 -90 -60t-135.5 -62.5t-133.5 -15.5q-111 0 -186 62.5t-75 170.5q0 306 433 368q132 19 285 28q6 35 6 41q0 105 -216 105q-117 0 -294 -65h-27l43 218q181 46 377 46q420 0 420 -232q0 -43 -11 -89l-95 -411q-7 -32 31 -32q62 0 120 28 h25l-46 -198q-113 -28 -196 -28zM325 256q0 -87 136 -87q87 0 187 72l45 195q-139 -12 -182 -20q-119 -22 -160 -73q-26 -33 -26 -87z" />
+<glyph unicode="&#x1d657;" horiz-adv-x="1177" d="M1124 628q0 -262 -153 -450q-157 -196 -383 -196q-155 0 -248 64l-22 -46h-285l295 1279h297l-104 -452q176 121 312 121q291 0 291 -320zM741 310q69 106 69 263.5t-150 157.5q-70 0 -174 -55l-107 -464q64 -25 133 -25q149 0 229 123z" />
+<glyph unicode="&#x1d658;" horiz-adv-x="990" d="M925 622q-95 115 -242.5 115t-230.5 -100t-83 -246q0 -204 215 -204q144 0 276 112h42l-63 -252q-164 -72 -329 -72q-202 0 -325.5 99.5t-123.5 287.5q0 265 190 425.5t456 160.5q177 0 323 -73l-63 -253h-42z" />
+<glyph unicode="&#x1d659;" horiz-adv-x="1218" d="M1014 185q62 0 120 28h25l-46 -198q-114 -28 -196 -28q-207 0 -236 126l-99 -66q-71 -47 -126 -59.5t-105 -12.5q-145 0 -219.5 92.5t-74.5 241.5q0 261 158 450t378 189q131 0 246 -62l92 393h297l-245 -1062q-8 -32 31 -32zM668 738q-139 0 -219.5 -111t-80.5 -272 t156 -161q71 0 170 61l104 453q-63 30 -130 30z" />
+<glyph unicode="&#x1d65a;" horiz-adv-x="1118" d="M1078 622q0 -98 -40 -215h-685v-19q0 -205 273 -205q166 0 335 106h33l-55 -237q-175 -77 -386.5 -77t-340.5 88q-150 102 -150 305q0 251 163.5 417.5t436.5 166.5q416 0 416 -330zM785 633q0 134 -156 134q-180 0 -248 -187h399q5 30 5 53z" />
+<glyph unicode="&#x1d65b;" horiz-adv-x="711" d="M856 1062q-59 20 -131 20t-109.5 -34t-58.5 -118l-1 -7h228l-44 -195h-219l-168 -728h-298l169 728h-127l44 195h127l6 24q41 169 139.5 254.5t294.5 85.5q132 0 218 -16l-48 -209h-22z" />
+<glyph unicode="&#x1d65c;" horiz-adv-x="1177" d="M343 -348q-187 0 -345 40l46 227h36q149 -58 262 -58q158 0 222 53q67 55 98 194q-139 -95 -270 -95q-330 0 -330 314q0 249 142.5 435t383.5 186q157 0 248 -66l20 41h289l-186 -817q-57 -250 -222 -358q-148 -96 -394 -96zM667 739q-142 0 -218 -104.5t-76 -250.5 q0 -150 159 -150q75 0 172 57l94 418q-66 30 -131 30z" />
+<glyph unicode="&#x1d65d;" horiz-adv-x="1199" d="M1114 714q0 -53 -13 -113l-139 -601h-300l106 458q25 106 25 153q0 104 -127 104q-71 0 -184 -61l-152 -654h-297l295 1279h297l-105 -458q192 127 332 127q262 0 262 -234z" />
+<glyph unicode="&#x1d65e;" horiz-adv-x="736" d="M635 1279l-52 -225h-314l52 225h314zM372 -18q-285 0 -285 200q0 45 15 109l145 632h297l-122 -528q-23 -99 -23 -129q0 -88 113 -88q62 0 120 28h25l-46 -198q-107 -26 -239 -26z" />
+<glyph unicode="&#x1d65f;" horiz-adv-x="678" d="M727 1279l-52 -225h-314l52 225h314zM434 3q-38 -164 -148.5 -257.5t-269.5 -93.5t-246 22l48 212h23q56 -20 116 -20q148 1 189 180l156 676h-175l47 201h473z" />
+<glyph unicode="&#x1d660;" horiz-adv-x="1129" d="M1204 923l-427 -402l246 -521h-311l-182 408l-131 -117l-68 -291h-297l295 1279h297l-176 -764l413 408h341z" />
+<glyph unicode="&#x1d661;" horiz-adv-x="736" d="M372 -18q-285 0 -285 200q0 45 15 109l228 988h296l-204 -884q-23 -100 -23 -129q0 -88 113 -88q62 0 120 28h25l-46 -198q-107 -26 -239 -26z" />
+<glyph unicode="&#x1d662;" horiz-adv-x="1781" d="M1697 718q0 -53 -15 -117l-138 -601h-300l107 461q28 121 28 162q0 92 -120 92q-56 0 -171 -61l-151 -654h-299l107 461q27 117 27 159q0 95 -119 95q-57 0 -171 -61l-152 -654h-297l214 923h297l-24 -102q192 127 321 127q191 0 241 -160q221 160 365 160 q250 0 250 -230z" />
+<glyph unicode="&#x1d663;" horiz-adv-x="1199" d="M1114 714q0 -52 -14 -113l-138 -601h-300l106 458q24 107 24 154q0 103 -126 103q-70 0 -185 -61l-151 -654h-297l213 923h297l-24 -102q194 127 332 127q263 0 263 -234z" />
+<glyph unicode="&#x1d664;" horiz-adv-x="1154" d="M1097 585q0 -267 -168 -440.5t-442 -173.5q-192 0 -309 92.5t-117 280.5t92.5 338t261.5 222q114 48 256 48q191 0 308.5 -90.5t117.5 -276.5zM526 173q114 0 188.5 112.5t74.5 288.5t-154 176q-118 0 -192 -114t-74 -288.5t157 -174.5z" />
+<glyph unicode="&#x1d665;" horiz-adv-x="1177" d="M1123 628q0 -265 -157 -455.5t-378 -190.5q-142 0 -248 64l-88 -385h-298l292 1262h297l-22 -96q177 121 316.5 121t212.5 -86.5t73 -233.5zM512 187q146 0 222 112.5t76 272t-150 159.5q-70 0 -174 -55l-107 -465q54 -24 133 -24z" />
+<glyph unicode="&#x1d666;" horiz-adv-x="1177" d="M351 -25q-145 0 -219.5 92.5t-74.5 241.5q0 270 161 454.5t375 184.5q133 0 244 -66l20 41h289l-292 -1262h-298l100 429q-48 -31 -146 -84q-74 -31 -159 -31zM667 738q-139 0 -219.5 -113t-80.5 -272t157 -159q70 0 170 61l104 453q-63 30 -131 30z" />
+<glyph unicode="&#x1d667;" horiz-adv-x="837" d="M825 641q-39 13 -140.5 13t-211.5 -36l-143 -618h-297l214 923h297l-31 -136q189 139 335 139q40 0 69 -3l-66 -282h-26z" />
+<glyph unicode="&#x1d668;" horiz-adv-x="999" d="M910 649q-132 102 -319 102t-187 -92q0 -56 164.5 -92t233.5 -76q110 -65 110 -184q0 -179 -183 -266q-139 -66 -365.5 -66t-374.5 73l57 244h27q50 -43 142.5 -81.5t206.5 -38.5q199 0 199 89q0 40 -74 66q-12 4 -132.5 32t-190.5 70q-111 67 -111 183q0 181 179 269 q137 67 350.5 67t347.5 -65l-55 -234h-25z" />
+<glyph unicode="&#x1d669;" horiz-adv-x="767" d="M414 266q0 -88 113 -88q62 0 120 28h24l-46 -198q-106 -26 -238 -26q-285 0 -285 200q0 44 15 109l100 437h-122l46 195h121l61 264h297l-61 -264h278l-46 -195h-277l-77 -333q-23 -100 -23 -129z" />
+<glyph unicode="&#x1d66a;" horiz-adv-x="1239" d="M937 -13q-214 0 -236 129q-209 -141 -353 -141q-263 0 -263 230q0 57 14 117l139 601h300l-107 -458q-24 -106 -24 -161t31 -75.5t99 -20.5t181 61l152 654h297l-164 -706v-7q0 -25 31 -25q62 0 120 28h25l-46 -198q-113 -28 -196 -28z" />
+<glyph unicode="&#x1d66b;" horiz-adv-x="1092" d="M1166 923l-569 -923h-337l-140 923h305l67 -635l356 635h318z" />
+<glyph unicode="&#x1d66c;" horiz-adv-x="1649" d="M1719 923l-483 -923h-314l-61 622l-312 -622h-318l-87 923h302l27 -636l328 636h263l56 -636l286 636h313z" />
+<glyph unicode="&#x1d66d;" horiz-adv-x="1126" d="M1207 923l-472 -463l263 -460h-319l-149 284l-274 -284h-341l479 469l-260 454h319l147 -281l265 281h342z" />
+<glyph unicode="&#x1d66e;" horiz-adv-x="1096" d="M1178 923l-805 -1262h-325l236 357l-152 905h302l80 -605l351 605h313z" />
+<glyph unicode="&#x1d66f;" horiz-adv-x="1004" d="M1031 923l-42 -178l-599 -533h485l-49 -212h-867l43 182l606 533h-464l48 208h839z" />
+<glyph unicode="&#x1d670;" horiz-adv-x="1140" d="M1086 66q0 -66 -87 -66h-239q-85 0 -85 66q0 50 42 63q18 6 82 6l-51 227h-356l-50 -227q64 0 82 -6q41 -13 41 -63q0 -66 -85 -66h-239q-88 0 -88 66q0 52 45 65q17 4 87 4l266 1151q12 54 36 68.5t83.5 14.5t82 -15t35.5 -70l266 -1149q68 0 86 -6q46 -13 46 -63z M715 497l-145 690l-145 -690h290z" />
+<glyph unicode="&#x1d671;" horiz-adv-x="1140" d="M1075 366q0 -156 -111.5 -261t-269.5 -105h-540q-89 0 -89 66q0 54 54 66q14 4 57 4q18 0 40 -1v1073l-55 -1q-96 0 -96 70q0 66 89 66h497q151 0 264 -96t113 -245q0 -103 -67.5 -183t-170.5 -116q123 -29 204 -121t81 -216zM593 765q114 0 199 63t85 166t-68.5 158.5 t-166.5 55.5h-276v-443h227zM646 135q112 0 194.5 64t82.5 173t-71.5 184t-180.5 75h-305v-496h280z" />
+<glyph unicode="&#x1d672;" horiz-adv-x="1140" d="M1058 368q0 -166 -137.5 -279t-307 -113t-298 118.5t-187.5 291.5q-46 134 -46 286t46 286q59 172 187 290.5t293 118.5t289 -105q27 58 34 68q25 37 61 37q66 0 66 -90v-305q0 -48 -14.5 -70t-59 -22t-57 14.5t-23.5 59.5q-70 279 -284 279q-119 0 -211 -93 q-175 -178 -175 -468q0 -134 41 -254.5t133.5 -214t213.5 -93.5q85 0 159 46t103 122l22 99q10 39 24 52t51 13q77 0 77 -74z" />
+<glyph unicode="&#x1d673;" horiz-adv-x="1140" d="M967 1108q115 -198 115 -445t-116 -438q-136 -225 -365 -225h-453q-90 0 -90 66q0 53 48 65q16 4 68 4h23v1073l-45 -1q-94 0 -94 68t90 68h453q230 0 366 -235zM844 315q86 151 86 348.5t-85 353.5q-103 191 -286 191h-211v-1073h211q182 0 285 180z" />
+<glyph unicode="&#x1d674;" horiz-adv-x="1140" d="M203 1208l-59 -2q-97 0 -97 71q0 66 83 66h827q71 0 83 -42q5 -17 5 -48v-169q0 -82 -76.5 -82t-76.5 90v116h-537v-445h287q-1 34 -1 43q0 82 78 82q75 0 75 -82v-221q0 -82 -75 -82q-57 0 -71 38q-6 15 -6 70v17h-287v-493h587v150q0 48 14.5 69t61.5 21q75 0 75 -80 v-205q0 -53 -17 -71.5t-71 -18.5h-875q-83 0 -83 66q0 56 56 67q11 2 100 2v1073z" />
+<glyph unicode="&#x1d675;" horiz-adv-x="1140" d="M225 1208l-62 -2q-101 0 -101 68.5t83 68.5h845q71 0 83 -42q5 -17 5 -48v-169q0 -82 -77 -82q-74 0 -74 90v116h-550v-469h299l-2 43q0 82 79 82q74 0 74 -83v-219q0 -83 -74 -83q-57 0 -71 38q-6 17 -6 87h-299v-469h114q88 0 88 -69q0 -66 -80 -66h-354q-83 0 -83 66 q0 71 100 71l63 -2v1073z" />
+<glyph unicode="&#x1d676;" horiz-adv-x="1140" d="M1074 527q0 -68 -95 -68h-8v-369q0 -90 -76 -90q-77 0 -77 85v7q-101 -116 -261 -116t-286 130q-108 111 -156.5 261.5t-48.5 305t42 284.5q54 169 162 280q127 130 278 130t266 -99q40 99 90 99q67 0 67 -90v-305q0 -92 -78 -92q-60 0 -75 65q-6 33 -24 99 q-28 81 -88.5 135t-139.5 54q-113 0 -205 -111q-142 -171 -142 -451q0 -278 139 -449q92 -112 207.5 -112t183.5 121q51 91 65 228h-92q-88 0 -88 67t88 67h261q91 0 91 -66z" />
+<glyph unicode="&#x1d677;" horiz-adv-x="1140" d="M1097 66q0 -66 -81 -66h-275q-80 0 -80 68q0 52 50 64q14 3 92 3v496h-466v-496h26q17 1 26 1q91 0 91 -70q0 -66 -81 -66h-275q-81 0 -81 66q0 54 49 66q13 3 93 3v1073h-25q-16 -1 -24 -1q-93 0 -93 68t81 68h275q81 0 81 -68q0 -52 -51 -64q-14 -3 -92 -3v-443h466 v443h-26q-16 -1 -25 -1q-91 0 -91 70q0 66 80 66h275q81 0 81 -68q0 -52 -51 -64q-14 -3 -92 -3v-1073h26q17 1 26 1q91 0 91 -70z" />
+<glyph unicode="&#x1d678;" horiz-adv-x="1140" d="M974 66q0 -66 -84 -66h-639q-85 0 -85 67.5t91 67.5h237v1073h-237q-91 0 -91 69q0 66 84 66h640q84 0 84 -67.5t-91 -67.5h-237v-1073h237q91 0 91 -69z" />
+<glyph unicode="&#x1d679;" horiz-adv-x="1140" d="M1017 1277q0 -56 -56 -67q-11 -2 -61 -2h-38v-913q0 -146 -112 -232.5t-255 -86.5t-245 53q-127 66 -127 189q0 103 98 103q40 0 68.5 -28t28.5 -66.5t-18 -59.5q65 -57 175 -57t172 51t62 147v900h-180q-89 0 -89 69q0 66 89 66h398q90 0 90 -66z" />
+<glyph unicode="&#x1d67a;" horiz-adv-x="1140" d="M1085 66q0 -66 -84 -66h-178q-83 0 -83 67.5t88 67.5l-308 548l-204 -257v-291h23q15 1 22 1q93 0 93 -70q0 -66 -84 -66h-232q-84 0 -84 68q0 51 49 63q16 4 89 4v1073h-23q-14 -1 -22 -1q-93 0 -93 70q0 66 85 66h231q84 0 84 -68q0 -51 -49 -63q-16 -4 -89 -4v-584 l463 584q-90 0 -90 67.5t84 67.5h207q84 0 84 -66q0 -50 -43 -63q-18 -6 -83 -6l-335 -422l369 -651q57 0 77 -7q36 -14 36 -62z" />
+<glyph unicode="&#x1d67b;" horiz-adv-x="1140" d="M238 1208l-69 -2q-100 0 -100 68.5t81 68.5h370q84 0 84 -67.5t-90 -67.5h-124v-1073h531v150q0 48 14 69t62 21q74 0 74 -82v-203q0 -46 -14 -68t-73 -22h-834q-81 0 -81 66q0 69 88 69h81v1073z" />
+<glyph unicode="&#x1d67c;" horiz-adv-x="1140" d="M1109 66q0 -66 -88 -66h-181q-87 0 -87 66q0 49 38 62q19 7 78 7v1048h-2q-15 -67 -59 -200l-118 -362q-10 -43 -43 -124q-30 -49 -73 -49t-66.5 29.5t-117.5 324t-116 381.5h-3v-1048q60 0 79 -7q39 -13 39 -62q0 -66 -88 -66h-181q-89 0 -89 66q0 49 39 62q20 7 79 7 v1073q-60 0 -79 7q-39 13 -39 62q0 66 89 66h123q79 0 107 -53q4 -9 29 -83l146 -447q17 -52 46 -156h2q15 73 59 207l147 444q18 54 40 71t79 17h123q88 0 88 -66q0 -49 -38 -62q-19 -7 -78 -7v-1073q60 0 78 -7q38 -13 38 -62z" />
+<glyph unicode="&#x1d67d;" horiz-adv-x="1140" d="M1084 1275q0 -52 -51 -64q-14 -3 -92 -3v-1118q0 -68 -32 -82q-18 -8 -65.5 -8t-72.5 15t-43 64l-404 1099h-2v-1043h26q17 1 25 1q92 0 92 -70q0 -66 -82 -66h-246q-82 0 -82 68q0 52 51 64q14 3 92 3v1073h-25q-17 -1 -25 -1q-93 0 -93 70q0 66 82 66h156 q52 0 76.5 -15.5t42.5 -63.5l404 -1100h2v1044h-25q-17 -1 -25 -1q-93 0 -93 68t81 68h247q81 0 81 -68z" />
+<glyph unicode="&#x1d67e;" horiz-adv-x="1140" d="M1035 567q0 -172 -14 -266q-28 -192 -144 -264q-96 -61 -301 -61t-301 61q-116 72 -144 264q-14 94 -14 266v210q0 171 14 265q28 192 144 264q95 61 301 61t301 -61q115 -72 144 -264q14 -94 14 -265v-210zM883 514v315q0 227 -39 297q-60 107 -268 107t-268 -107 q-39 -70 -39 -297v-315q0 -227 39 -297q60 -107 268 -107t268 107q39 70 39 297z" />
+<glyph unicode="&#x1d67f;" horiz-adv-x="1140" d="M227 1208l-57 -2q-99 0 -99 71q0 66 90 66h492q172 0 294 -115.5t122 -287t-121.5 -287t-294.5 -115.5h-274v-403l57 2q99 0 99 -71q0 -66 -90 -66h-284q-90 0 -90 66q0 56 57 67q11 2 61 2h38v1073zM917 941q0 120 -91 193.5t-213 73.5h-234v-536h234q122 0 213 74.5 t91 194.5z" />
+<glyph unicode="&#x1d680;" horiz-adv-x="1140" d="M1035 567q0 -172 -14 -266q-32 -217 -179 -283l111 -201q22 -39 22 -72t-39 -54q-20 -11 -38 -11q-43 0 -78 63l-132 238q-49 -5 -112 -5q-205 0 -302 61q-115 72 -143 264q-14 94 -14 266v210q0 171 14 265q28 192 144 264q95 61 301 61t301 -61q115 -72 144 -264 q14 -94 14 -265v-210zM883 514v315q0 227 -39 297q-60 107 -268 107t-268 -107q-39 -70 -39 -297v-315q0 -227 39 -297q60 -107 268 -107q21 0 40 1l-64 115q-22 38 -22 71.5t39 54.5q20 11 38 11q43 0 78 -63l86 -154q75 40 98 138q14 63 14 230z" />
+<glyph unicode="&#x1d681;" horiz-adv-x="1140" d="M865 390l-2 -113q0 -167 64 -167q24 0 33 39l8 59q9 66 74 66q78 0 78 -70q0 -88 -53 -158t-138 -70q-114 0 -174 101q-34 59 -41 155v163q0 102 -49 148q-65 61 -165 61h-185v-469h26q16 1 25 1q93 0 93 -70q0 -66 -89 -66h-262q-88 0 -88 66q0 54 51 66q12 3 64 3h29 v1073h-25q-16 -1 -26 -1q-93 0 -93 68t88 68h390q168 0 297.5 -102t129.5 -266q0 -202 -188 -306q79 -62 103.5 -124t24.5 -155zM474 739q114 0 206 63t92 172.5t-92 171.5t-206 62h-159v-469h159z" />
+<glyph unicode="&#x1d682;" horiz-adv-x="1140" d="M927 626q105 -106 105 -267.5t-122 -272t-291 -110.5q-228 0 -363 101q-24 -101 -81 -101q-67 0 -67 90v290q0 90 78 90q43 0 55.5 -16t18.5 -62q16 -130 103 -190q100 -68 257 -68q108 0 189 69t81 175q0 191 -245 248q-85 17 -252 60q-126 39 -205.5 129t-79.5 215 q0 159 124 260t298 101t296 -103q23 103 81 103q66 0 66 -90v-290q0 -90 -77 -90q-37 0 -51 12.5t-22 47t-26 99.5q-67 177 -281 177q-101 0 -182.5 -60.5t-81.5 -157.5q0 -75 50 -130.5t125 -75.5l179 -39q125 -28 190 -53t131 -91z" />
+<glyph unicode="&#x1d683;" horiz-adv-x="1140" d="M1088 1084q0 -82 -77 -82q-74 0 -74 90v116h-290v-1073h114q88 0 88 -69q0 -66 -81 -66h-394q-81 0 -81 67.5t88 67.5h114v1073h-293v-116q0 -47 -14 -68.5t-61 -21.5q-75 0 -75 82v169q0 61 21.5 75.5t68.5 14.5h858q72 0 84 -42q4 -17 4 -48v-169z" />
+<glyph unicode="&#x1d684;" horiz-adv-x="1140" d="M829 1208l-58 -2q-98 0 -98 71q0 66 91 66h283q90 0 90 -66q0 -56 -56 -67q-11 -2 -62 -2h-38v-760q0 -185 -115 -328.5t-295.5 -143.5t-296.5 143.5t-116 328.5v760l-58 -2q-97 0 -97 71q0 66 90 66h284q90 0 90 -66q0 -55 -56 -67q-12 -2 -62 -2h-38v-749 q0 -230 154 -318q53 -31 104.5 -31t104.5 31q155 89 155 318v749z" />
+<glyph unicode="&#x1d685;" horiz-adv-x="1140" d="M1107 1277q0 -50 -42 -63q-19 -6 -83 -6l-291 -1144q-14 -52 -39 -67t-82.5 -15t-82 15t-38.5 69l-290 1142q-65 0 -84 6q-42 13 -42 63q0 66 91 66h224q90 0 90 -66q0 -50 -41 -63q-19 -6 -82 -6l213 -854q28 -111 40 -196h3q18 112 85 378l170 672q-64 0 -83 6 q-41 13 -41 63q0 66 91 66h224q90 0 90 -66z" />
+<glyph unicode="&#x1d686;" horiz-adv-x="1140" d="M1122 1275q0 -67 -75 -67h-9l-157 -1149q-11 -77 -91 -77q-64 0 -88 55q-4 8 -31 130l-68 311q-13 55 -30 167h-2q-7 -56 -65 -328t-70 -291q-26 -44 -86 -44q-79 0 -90 77l-158 1149h-2q-82 0 -82 67q0 68 90 68h174q88 0 88 -68q0 -52 -51 -64q-13 -3 -64 -3h-28 l115 -869q17 -126 17 -172h2q9 100 105 524q3 24 17 68q24 48 89 48t89 -51q1 -2 24 -105l51 -229q33 -149 43 -255h2q2 58 36 310l97 731h-26q-16 -1 -25 -1q-93 0 -93 68t88 68h174q90 0 90 -68z" />
+<glyph unicode="&#x1d687;" horiz-adv-x="1140" d="M1085 66q0 -66 -83 -66h-242q-82 0 -82 66q0 69 99 69l-216 426l-203 -426q104 0 104 -69q0 -66 -84 -66h-242q-82 0 -82 66q0 53 47 65q15 4 89 4l293 580l-263 493h-23q-16 -1 -24 -1q-95 0 -95 70q0 66 83 66h243q81 0 81 -66q0 -69 -94 -69l170 -320l155 320 q-102 0 -102 69q0 66 81 66h243q83 0 83 -68q0 -51 -48 -63q-16 -4 -90 -4l-248 -491l309 -582h23q15 1 23 1q95 0 95 -70z" />
+<glyph unicode="&#x1d688;" horiz-adv-x="1140" d="M1104 1277q0 -69 -88 -69h-46l-325 -672v-401h52q92 0 92 -69q0 -66 -79 -66h-280q-79 0 -79 66q0 69 92 69h52v401l-325 672h-46q-88 0 -88 69q0 66 79 66h246q79 0 79 -66q0 -45 -30 -60q-20 -9 -71 -9l231 -518l231 518q-51 0 -71 9q-30 15 -30 60q0 66 79 66h246 q79 0 79 -66z" />
+<glyph unicode="&#x1d689;" horiz-adv-x="1140" d="M1046 90q0 -53 -17.5 -71.5t-70.5 -18.5h-781q-83 0 -83 75q0 37 22 69l724 1064h-568v-116q0 -90 -77 -90q-74 0 -74 83v168q0 61 25 77q18 13 65 13h741q83 0 83 -75q0 -37 -22 -69l-724 -1064h605v157q0 91 76 91t76 -83v-210z" />
+<glyph unicode="&#x1d68a;" horiz-adv-x="1140" d="M1081 66q0 -46 -34 -59q-18 -7 -73 -7q-181 0 -230 68q-124 -81 -313 -81q-136 0 -244.5 78.5t-108.5 209.5q0 179 246 260q162 54 395 58q1 219 -308 219q-29 0 -43 -1q-48 -3 -48 -42q0 -6 -5 -18q-27 -63 -86 -63q-95 0 -95 98q0 156 310 156q171 0 288 -78 q135 -90 135 -253v-464q42 -16 128 -16t86 -65zM719 287v180q-162 -4 -290 -37q-204 -51 -204 -155q0 -75 70 -116t168 -41t159 29.5t79 57t18 82.5z" />
+<glyph unicode="&#x1d68b;" horiz-adv-x="1140" d="M399 832q114 104 283.5 104t288 -144.5t118.5 -331.5t-127.5 -330t-314.5 -143q-142 0 -248 109v-10q0 -86 -73.5 -86t-73.5 87v1090h-96q-86 0 -86 66t87 66h156q52 0 69 -18.5t17 -69.5v-389zM641 118q130 0 214.5 106t84.5 237.5t-78 238t-204 106.5q-99 0 -179 -72 t-80 -169v-157q0 -108 69 -199t173 -91z" />
+<glyph unicode="&#x1d68c;" horiz-adv-x="1140" d="M1000 233q0 -31 -30 -80q-101 -166 -341 -166q-197 0 -334 139.5t-137 336.5q0 91 36 181q120 298 461 298q319 0 319 -156q0 -42 -27.5 -70t-69.5 -28q-61 0 -82 48q-6 28 -13 56q-16 20 -91 20q-276 0 -359 -213q-26 -67 -26 -136q0 -141 98 -243t238 -102q81 0 126 28 t86 99q19 33 28.5 40.5t42.5 7.5q75 0 75 -60z" />
+<glyph unicode="&#x1d68d;" horiz-adv-x="1140" d="M1003 131q86 0 86 -65.5t-88 -65.5h-157q-59 0 -72 22q-13 20 -13 77v8q-116 -120 -270 -120q-181 0 -300 145t-119 332.5t126 329.5t313 142q142 0 250 -95v336h-97q-84 0 -84 66t87 66h156q52 0 69 -18.5t17 -69.5v-1090h96zM759 414v153q0 95 -73.5 167t-168.5 72 q-130 0 -215 -105.5t-85 -236.5t78 -238.5t194 -107.5t193 92.5t77 203.5z" />
+<glyph unicode="&#x1d68e;" horiz-adv-x="1140" d="M1017 233q0 -33 -33 -82q-110 -164 -351 -164q-201 0 -346 138.5t-145 336t133.5 339t327.5 141.5t304 -127.5t110 -325.5q0 -47 -19 -63.5t-67 -16.5h-638q24 -127 124 -209t227.5 -82t191.5 72q9 10 30 48t32 46.5t43 8.5q76 0 76 -60zM602 812q-114 0 -199 -80 t-107 -195h568q-22 275 -262 275z" />
+<glyph unicode="&#x1d68f;" horiz-adv-x="1140" d="M1002 1192q0 -38 -27 -66t-64 -28t-65 28t-30 64h-2q-205 0 -205 -167v-100h260q85 0 85 -67q0 -64 -85 -64h-260v-661h215q88 0 88 -65.5t-88 -65.5h-580q-88 0 -88 65.5t88 65.5h218v661h-218q-86 0 -86 64q0 67 88 67h216v112q0 132 99 208.5t235 76.5q206 0 206 -128 z" />
+<glyph unicode="&#x1d690;" horiz-adv-x="1140" d="M1092 832q0 -37 -24 -62.5t-61 -25.5q-66 0 -83 73q-68 -5 -125 -37q56 -92 56 -187q0 -145 -104 -245t-249 -100q-106 0 -192 55q-13 -31 -13 -61q0 -101 96 -107q43 -3 112 -3h49q238 0 351 -64q149 -85 149 -220q0 -162 -175 -236q-127 -54 -312 -54t-320 57 q-181 77 -181 228t158 246q-50 67 -50 152.5t43 148.5q-68 86 -68 203q0 142 105 242.5t248 100.5q115 0 208 -64q101 74 226 74q61 0 108.5 -28.5t47.5 -85.5zM648 442q60 64 60 150.5t-60.5 151.5t-146 65t-145 -65.5t-59.5 -152t60 -150t145.5 -63.5t145.5 64zM929 -152 q0 107 -140 142q-73 19 -226 19q-22 0 -66 0.5t-66 0.5q-95 0 -159 -34q-83 -42 -83 -127.5t152 -131.5q110 -34 222 -34t219 34q147 46 147 131z" />
+<glyph unicode="&#x1d691;" horiz-adv-x="1140" d="M1026 131q88 0 88 -65.5t-86 -65.5h-327q-87 0 -87 65.5t87 65.5h84v487q0 92 -24 132q-32 56 -120 56q-119 0 -192.5 -86.5t-73.5 -208.5v-380h94q86 0 86 -65.5t-84 -65.5h-341q-85 0 -85 65.5t87 65.5h95v1046h-97q-85 0 -85 66t87 66h156q72 0 83 -45q4 -16 4 -43 v-398q113 113 280 113q277 0 277 -308v-497h94z" />
+<glyph unicode="&#x1d692;" horiz-adv-x="1140" d="M639 1275.5q31 -31.5 31 -76t-31 -75.5t-75.5 -31t-76 31t-31.5 75.5t31.5 76t76 31.5t75.5 -31.5zM895 131q88 0 88 -65.5t-81 -65.5h-646q-81 0 -81 65.5t88 65.5h259v661h-240q-89 0 -89 65.5t82 65.5h310q68 0 80 -38q5 -17 5 -49v-705h225z" />
+<glyph unicode="&#x1d693;" horiz-adv-x="1140" d="M639 1275.5q31 -31.5 31 -76t-31 -75.5t-75.5 -31t-76 31t-31.5 75.5t31.5 76t76 31.5t75.5 -31.5zM710 -48q0 -173 -107.5 -283.5t-280.5 -110.5q-297 0 -297 163q0 41 28.5 70t68 29t68 -30t28.5 -68q0 -12 -4 -24q66 -9 119 -9q115 0 172.5 78.5t57.5 187.5v837h-278 q-86 0 -86 64q0 67 88 67h337q66 0 79 -35q7 -17 7 -52v-884z" />
+<glyph unicode="&#x1d694;" horiz-adv-x="1140" d="M946 131l58 2q96 0 96 -68q0 -65 -81 -65h-265q-78 0 -78 65q0 49 39 61q15 5 62 5h17l-253 332l-172 -160v-172h105q84 0 84 -65.5t-78 -65.5h-342q-79 0 -79 65.5t86 65.5h103v1046h-103q-86 0 -86 66t79 66h145q52 0 69 -18.5t17 -69.5v-754l346 325l-67 -2 q-98 0 -98 66.5t79 66.5h344q81 0 81 -66.5t-100 -66.5l-63 2l-264 -246z" />
+<glyph unicode="&#x1d695;" horiz-adv-x="1140" d="M931 131q86 0 86 -65.5t-80 -65.5h-716q-79 0 -79 65.5t87 65.5h277v1046h-279q-85 0 -85 66t81 66h345q52 0 68 -18.5t16 -69.5v-1090h279z" />
+<glyph unicode="&#x1d696;" horiz-adv-x="1140" d="M120 925l58 -2q84 0 86 -65q85 78 191.5 78t155.5 -111q80 111 212 111q191 0 191 -286v-519q63 0 81 -5q41 -13 41 -61q0 -65 -87 -65h-161q-90 0 -90 66q0 65 93 65h3v525q0 150 -79 150q-90 0 -139 -106q-38 -82 -38 -185v-384q63 0 82 -5q42 -13 42 -61 q0 -65 -89 -65h-161q-86 0 -86 66q0 65 90 65h3v525q0 150 -78 150q-90 0 -139 -106q-38 -82 -38 -185v-384q63 0 81 -5q41 -13 41 -61q0 -65 -87 -65h-189q-88 0 -88 65q0 48 42 61q17 5 64 5h17v661q-63 0 -81 5q-42 13 -42 61q0 67 98 67z" />
+<glyph unicode="&#x1d697;" horiz-adv-x="1140" d="M1026 131q88 0 88 -65.5t-86 -65.5h-327q-87 0 -87 65.5t87 65.5h84v487q0 92 -24 132q-32 56 -120 56q-119 0 -192.5 -86.5t-73.5 -208.5v-380h94q86 0 86 -65.5t-84 -65.5h-341q-85 0 -85 65.5t87 65.5h95v661h-97q-85 0 -85 64q0 67 87 67h156q58 0 72.5 -21t14.5 -79 q113 113 280 113q277 0 277 -308v-497h94z" />
+<glyph unicode="&#x1d698;" horiz-adv-x="1140" d="M580 942q188 0 313 -144.5t125 -335t-125.5 -333t-313 -142.5t-313 142.5t-125.5 333t125.5 335t313.5 144.5zM580 812q-127 0 -209.5 -102.5t-82.5 -234.5t81 -244.5t210.5 -112.5t210 112t80.5 245t-81.5 235t-208.5 102z" />
+<glyph unicode="&#x1d699;" horiz-adv-x="1140" d="M399 832q114 104 283.5 104t288 -144.5t118.5 -331.5t-127.5 -330t-314.5 -143q-142 0 -248 109v-407h95q88 0 88 -67q0 -64 -87 -64h-339q-86 0 -86 64q0 67 87 67h95v1103h-96q-86 0 -86 64q0 67 87 67h156q53 0 70 -19q16 -17 16 -66v-6zM641 118q130 0 214.5 106 t84.5 237.5t-78 238t-204 106.5q-99 0 -179 -72t-80 -169v-157q0 -108 69 -199t173 -91z" />
+<glyph unicode="&#x1d69a;" horiz-adv-x="1140" d="M1110 -378q0 -64 -85 -64h-357q-85 0 -85 65.5t85 65.5h105v426q-117 -128 -296.5 -128t-304 143t-124.5 333.5t133 331.5t324 141q159 0 268 -117q-1 25 -1 38q0 79 74.5 79t74.5 -89v-1158h104q85 0 85 -67zM773 414v85q0 116 -72.5 211.5t-184.5 95.5 q-136 0 -228.5 -103t-92.5 -238t84 -241t205 -106t205 91t84 205z" />
+<glyph unicode="&#x1d69b;" horiz-adv-x="1140" d="M1067 803q0 -39 -26 -65.5t-65 -26.5t-64.5 28t-27.5 67q-172 0 -279 -117t-107 -291v-267h239q87 0 87 -65.5t-87 -65.5h-560q-85 0 -85 65.5t85 65.5h175v661h-175q-85 0 -85 65.5t85 65.5h236q89 0 89 -87q0 -13 -2 -37.5t-2 -35.5q151 173 360 173t209 -133z" />
+<glyph unicode="&#x1d69c;" horiz-adv-x="1140" d="M813 501q181 -72 181 -226.5t-137 -228.5q-109 -59 -273 -59t-275 81q-20 -81 -79 -81q-65 0 -65 88v207q0 88 75 88q38 0 48 -10.5t27 -51.5q44 -107 102 -148.5t172 -41.5q273 0 273 150q0 99 -181 140l-335 70q-181 61 -181 204.5t143 209.5q108 50 252 50t240 -44 q8 44 64 44q65 0 65 -88v-147q0 -87 -74 -87q-56 0 -69 50q-19 75 -35 92q-46 50 -184 50q-94 0 -166 -22q-105 -32 -105 -101q0 -76 181 -112q290 -58 336 -76z" />
+<glyph unicode="&#x1d69d;" horiz-adv-x="1140" d="M1033 270q0 -130 -99 -206.5t-235 -76.5t-218 73.5t-82 209.5v522h-188q-85 0 -85 64q0 67 87 67h186v175q0 88 74 88t74 -88v-175h352q84 0 84 -67q0 -64 -84 -64h-352v-518q0 -156 165 -156q152 0 172 154q6 49 15 61q14 21 58 21q76 0 76 -84z" />
+<glyph unicode="&#x1d69e;" horiz-adv-x="1140" d="M1028 131q86 0 86 -65.5t-88 -65.5h-156q-86 0 -85 68q-107 -81 -254 -81q-304 0 -304 256v549h-97q-85 0 -85 64q0 67 87 67h156q64 0 79 -31q8 -19 8 -56v-580q0 -87 46 -117q33 -21 130.5 -21t165.5 56.5t68 160.5v457h-96q-85 0 -85 64q0 67 88 67h156q70 0 80 -42 q4 -16 4 -45v-705h96z" />
+<glyph unicode="&#x1d69f;" horiz-adv-x="1140" d="M812 792l-55 -2q-90 0 -90 68q0 65 79 65h263q80 0 80 -67q0 -52 -55 -63q-8 -1 -48 -1h-48l-246 -729q-13 -38 -37.5 -55t-74.5 -17q-90 0 -115 74l-246 727l-57 -2q-92 0 -92 66.5t78 66.5h264q79 0 79 -67q0 -51 -53 -62q-10 -2 -57 -2h-36l235 -690z" />
+<glyph unicode="&#x1d6a0;" horiz-adv-x="1140" d="M1105 858q0 -46 -35 -59q-17 -7 -62 -7h-12l-128 -719q-9 -48 -27.5 -65t-72 -17t-84.5 37q-15 18 -54 175.5t-44 203.5h-2q-9 -64 -48 -209.5t-49 -161.5q-27 -45 -87 -45t-80 16t-29 66l-130 719q-56 0 -74 7q-34 13 -34 59q0 65 90 65h245q90 0 90 -67q0 -64 -90 -64 h-103l110 -638h2q63 295 100 355q29 46 79.5 46t67.5 -15t33 -58q64 -171 88 -328h3l106 638h-104q-90 0 -90 65.5t90 65.5h246q89 0 89 -65z" />
+<glyph unicode="&#x1d6a1;" horiz-adv-x="1140" d="M993 131q89 0 89 -65.5t-83 -65.5h-263q-78 0 -78 65q0 46 34 59q19 7 73 7l-191 263l-185 -263h21q91 0 91 -65.5t-79 -65.5h-263q-82 0 -82 65.5t87 65.5h87l265 344l-253 317h-86q-87 0 -87 64q0 67 80 67h266q78 0 78 -65q0 -45 -32 -58q-19 -8 -71 -8l163 -217 l159 217q-53 0 -72 7q-34 14 -34 59q0 65 79 65h264q81 0 81 -67q0 -64 -88 -64h-86l-244 -317l275 -344h85z" />
+<glyph unicode="&#x1d6a2;" horiz-adv-x="1140" d="M1087 856q0 -52 -56 -62q-9 -2 -58 -2h-37l-316 -930q-42 -122 -124.5 -213t-194.5 -91q-73 0 -125 51t-52 123q0 93 94 93q40 0 66 -26t26 -59t-11 -54q109 6 171 124q12 22 39 97.5t27 89.5t-312 795q-8 0 -27.5 -0.5t-29.5 -0.5q-95 0 -95 66t81 66h264q78 0 78 -65 q0 -52 -49 -64q-10 -2 -56 -2h-35l198 -513q17 -42 46 -127h2q15 67 55 184l155 456q-8 0 -26.5 -0.5t-28.5 -0.5q-92 0 -92 66t79 66h263q81 0 81 -67z" />
+<glyph unicode="&#x1d6a3;" horiz-adv-x="1140" d="M1053 80q0 -80 -49 -80h-819q-79 0 -79 73q0 39 48 85l667 634h-532q0 -9 0.5 -27t0.5 -28q0 -87 -77 -87q-72 0 -72 79v107q0 58 20 72.5t67 14.5h736q80 0 80 -73q0 -40 -47 -85l-669 -634h577v81q0 88 74 88t74 -80v-140z" />
+<glyph unicode="&#x1d6a4;" horiz-adv-x="657" d="M660 329q23 0 23 -19t-27 -89q-95 -245 -254 -245q-76 0 -123.5 49.5t-47.5 125.5q0 39 26 111l116 297q83 220 83 288t-58 68q-89 0 -148 -96q-30 -50 -72 -175q-13 -39 -30 -39q-25 0 -25 20.5t27 89.5q96 244 254 244q75 0 124 -50t49 -124q0 -36 -22 -99l-117 -306 q-86 -227 -86 -294t58 -67q86 0 145 95q31 49 72 171q15 44 33 44z" />
+<glyph unicode="&#x1d6a5;" horiz-adv-x="714" d="M654 763q0 -39 -9 -75l-202 -802q-35 -138 -149 -233t-254 -95q-71 0 -128.5 31t-57.5 95q0 46 32 79.5t78 33.5q74 0 74 -69q0 -84 -94 -104q45 -23 96 -23q99 0 174 95q61 77 89 188l207 818q15 59 15 114q0 99 -69 99q-89 0 -161 -80q-43 -49 -89.5 -139.5 t-59.5 -90.5q-23 0 -23 21q0 13 30 74q128 259 309 259q83 0 137.5 -56t54.5 -140z" />
+<glyph unicode="&#x1d6a6;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1d6a7;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1d6a8;" horiz-adv-x="1460" d="M265 6l-206 -6v100q168 0 175 18l425 1213q12 36 71 36t71 -36l430 -1231h169v-100l-292 6l-329 -6v100h161l-86 247h-422l-78 -231q-3 -8 27.5 -11t124.5 -5v-100zM819 446l-176 503l-176 -503h352z" />
+<glyph unicode="&#x1d6a9;" horiz-adv-x="1333" d="M1274 366q0 -174 -121.5 -270t-300.5 -96h-793v100h185v1142h-185v101h738q175 0 291 -81q132 -93 132 -260q0 -118 -82 -196.5t-204 -103.5q145 -17 242.5 -106t97.5 -230zM891 825q43 73 43 170t-26 160q-35 87 -111 87h-289v-505h235q97 0 148 88zM978 371 q0 103 -29 180q-40 109 -125 109h-316v-560h289q94 0 142 94q39 74 39 177z" />
+<glyph unicode="&#x1d6aa;" horiz-adv-x="1143" d="M387 6l-328 -6v100h185v1142h-185v101h964l61 -480h-102q-22 198 -72 272q-70 107 -249 107h-132v-1142h232v-100z" />
+<glyph unicode="&#x1d6ab;" horiz-adv-x="1192" d="M526 1331q13 37 71.5 37t71.5 -37l464 -1331h-1074zM757 245l-247 704l-246 -704h493z" />
+<glyph unicode="&#x1d6ac;" horiz-adv-x="1280" d="M59 0v100h185v1142h-185v101h1045l62 -480h-100q-25 207 -89 284q-78 95 -276 95h-172v-494h38q114 0 152 61q28 44 28 160v8h99v-558h-99v6q0 133 -40.5 178t-171.5 45h-6v-548h188q215 0 302 122q61 84 101 322h100l-90 -544h-1071z" />
+<glyph unicode="&#x1d6ad;" horiz-adv-x="1106" d="M95 0q-36 0 -36 73q0 9 658 1169h-171q-362 0 -361 -379h-100l24 480h890q36 0 36 -67q0 -11 -656 -1168h184q210 0 303 127q80 110 80 329h101l-36 -564h-916z" />
+<glyph unicode="&#x1d6ae;" horiz-adv-x="1516" d="M1130 1337l327 6v-101h-183v-1142h183v-100l-327 6l-327 -6v100h183v548h-457v-548h184v-100l-326 6l-328 -6v100h185v1142h-185v101l328 -6l326 6v-101h-184v-494h457v494h-183v101z" />
+<glyph unicode="&#x1d6af;" horiz-adv-x="1366" d="M684 1364q296 0 459 -199t163 -499t-164.5 -494t-457.5 -194t-459 193.5t-166 494t159 492.5q170 206 466 206zM999 704q0 574 -316 574t-316 -586q0 -623 316 -623t316 635zM924 486h-100v67h-286v-67h-100v377h100v-66h286v66h100v-377z" />
+<glyph unicode="&#x1d6b0;" horiz-adv-x="793" d="M397 1337l337 6v-101h-194v-1142h194v-100l-337 6l-338 -6v100h195v1142h-195v101z" />
+<glyph unicode="&#x1d6b1;" horiz-adv-x="1503" d="M1246 1337l170 6v-101q-161 0 -178 -17l-399 -398l449 -709q11 -18 156 -18v-100l-257 6l-327 -6v100q114 0 128 16l-333 529l-126 -126v-419h184v-100l-326 6l-328 -6v100h185v1142h-185v101l328 -6l326 6v-101h-184v-580l567 565q-24 15 -126 15v101z" />
+<glyph unicode="&#x1d6b2;" horiz-adv-x="1351" d="M246 6l-187 -6v100h14q133 0 139 18l394 1213q12 36 69.5 36t69.5 -36l399 -1231h147v-100l-278 6l-333 -6v100h163l-259 802l-255 -786q16 -11 157 -16v-100z" />
+<glyph unicode="&#x1d6b3;" horiz-adv-x="1843" d="M59 100q185 0 185 18v1124h-185v101h445q37 0 51 -36l368 -982l368 982q14 36 50 36h443v-101h-185v-1142h185v-100l-309 6l-311 -6v100h183v1125l-444 -1190q-13 -35 -58 -35t-58 35l-431 1158v-1075q0 -10 33.5 -13t149.5 -5v-100l-239 6l-241 -6v100z" />
+<glyph unicode="&#x1d6b4;" horiz-adv-x="1516" d="M1218 1337l239 6v-101q-183 0 -183 -17v-1193q0 -32 -82 -32q-12 0 -20 11l-816 1130v-1023q0 -10 33.5 -13t149.5 -5v-100l-239 6l-241 -6v100q185 0 185 18v1124h-185v101h449q14 0 23 -12l631 -875v769q0 9 -38 12t-146 5v101z" />
+<glyph unicode="&#x1d6b5;" horiz-adv-x="1259" d="M916 1115h-580q-127 0 -144.5 -16t-22.5 -152h-99l18 396h1084l17 -396h-100q-3 134 -21 151t-152 17zM1009 495h-99v89h-560v-89h-99v407h99v-90h560v90h99v-407zM322 228h621q114 0 132.5 16.5t23.5 172.5h100l-16 -417h-1106l-18 417h100q5 -156 23 -172.5t140 -16.5z " />
+<glyph unicode="&#x1d6b6;" horiz-adv-x="1366" d="M684 1364q296 0 459 -199t163 -499t-164.5 -494t-457.5 -194t-459 193.5t-166 494t159 492.5q170 206 466 206zM999 704q0 574 -316 574t-316 -586q0 -623 316 -623t316 635z" />
+<glyph unicode="&#x1d6b7;" horiz-adv-x="1516" d="M387 6l-328 -6v100h185v1142h-185v101h1398v-101h-183v-1142h183v-100l-327 6l-327 -6v100h183v1142h-457v-1142h184v-100z" />
+<glyph unicode="&#x1d6b8;" horiz-adv-x="1278" d="M387 6l-328 -6v100h185v1142h-185v101h700q194 0 319 -94q140 -104 140 -289.5t-143 -287.5q-126 -90 -316 -90h-230v-482h184v-100zM879 747q32 53 32 213.5t-34 212.5q-46 69 -195 69h-164v-571h164q152 0 197 76z" />
+<glyph unicode="&#x1d6b9;" horiz-adv-x="1366" d="M684 1364q296 0 459 -199t163 -499t-164.5 -494t-457.5 -194t-459 193.5t-166 494t159 492.5q170 206 466 206zM684 1278q-304 0 -316 -530h631q-11 530 -315 530zM368 648q9 -579 315 -579t316 579h-631z" />
+<glyph unicode="&#x1d6ba;" horiz-adv-x="1310" d="M91 0q-32 0 -32 35q0 10 11 22l502 551l-506 650q-7 9 -7 47t32 38h1099l61 -480h-99q-29 234 -143 312q-96 67 -342 67h-239l394 -506q7 -9 7 -21t-9 -22l-509 -556h348q250 0 347 64q118 79 146 316h99l-61 -517h-1099z" />
+<glyph unicode="&#x1d6bb;" horiz-adv-x="1335" d="M669 6l-406 -6v100h263v1142h-96q-131 0 -196 -74q-53 -60 -75 -305h-100l42 480h1133l42 -480h-100q-14 190 -50 261q-59 118 -221 118h-94v-1142h263v-100z" />
+<glyph unicode="&#x1d6bc;" horiz-adv-x="1421" d="M711 6l-372 -6v100h229v560q0 461 -245 461h-15q-115 0 -138 -58l-8 -26q-5 -9 -25 -9h-42q-36 0 -36 35q0 115 75.5 202t188.5 87q158 0 264 -133q84 -107 124 -281q37 172 123 281q105 133 262 133q113 0 189.5 -87.5t76.5 -201.5q0 -35 -55 -35h-21q-22 0 -27 8 q-5 14 -9 27q-23 58 -135 58h-19q-242 0 -242 -461v-560h231v-100z" />
+<glyph unicode="&#x1d6bd;" horiz-adv-x="1330" d="M667 1337l362 6v-101h-232v-207q185 -16 314 -97q160 -101 160 -267.5t-160 -266.5q-127 -79 -314 -97v-207h232v-100l-362 6l-365 -6v100h232v207q-186 18 -313 97q-160 100 -160 266.5t159 267.5q130 81 314 97v207h-232v101zM976 671q0 121 -29 179q-40 80 -150 101 v-559q110 22 150 100q29 58 29 179zM356 671q0 -121 29 -179q39 -78 149 -100v559q-109 -21 -149 -101q-29 -58 -29 -179z" />
+<glyph unicode="&#x1d6be;" horiz-adv-x="1487" d="M1105 1337l239 6v-101q-213 0 -224 -17l-278 -439l412 -686h173v-100l-288 6l-333 -6v100h141l-264 438l-269 -422q26 -16 164 -16v-100l-281 6l-238 -6v100h21q190 0 201 18l337 527l-362 597h-170v101l287 -6l331 6v-101h-138l210 -349l213 334q-27 15 -164 15v101z " />
+<glyph unicode="&#x1d6bf;" horiz-adv-x="1421" d="M701 1337l363 6v-101h-231v-837q180 77 180 405q0 257 115 257h202q32 0 32 -47q0 -17 -16 -24l-30 -12q-38 -22 -38 -181q0 -212 -117 -340.5t-328 -153.5v-209h231v-100l-363 6l-362 -6v100h229v209q-208 27 -316 157t-108 342q0 147 -39 176q-46 3 -46 51q0 32 32 32 h201q116 0 116 -257q0 -320 160 -401v833h-229v101z" />
+<glyph unicode="&#x1d6c0;" horiz-adv-x="1358" d="M878 0q-32 0 -32 39q0 145 61 428.5t61 428.5q0 391 -289 391t-289 -391q0 -145 61 -428.5t61 -428.5q0 -39 -32 -39h-347l-74 399h101q23 -151 45 -170t193 -19q-34 84 -127.5 229.5t-125.5 211.5q-61 127 -61 244q0 233 189 360q163 109 407.5 109t407.5 -109 q188 -127 188 -360q0 -116 -61 -243q-33 -69 -127 -214.5t-128 -227.5h77q94 0 117 17.5t45 171.5h99l-71 -399h-349z" />
+<glyph unicode="&#x1d6c1;" horiz-adv-x="1696" d="M1598 1366q0 -10 -4 -18l-689 -1387q-19 -39 -57 -39t-57 39l-689 1387q-4 8 -4 18q0 25 32 25h1436q32 0 32 -25zM1445 1230h-1077l538 -1088z" />
+<glyph unicode="&#x1d6c2;" horiz-adv-x="1284" d="M1234 240q0 -97 -58.5 -174.5t-152.5 -77.5q-207 0 -270 129q-13 -17 -41 -47q-104 -94 -233 -94q-202 0 -318 140.5t-116 348t122 344.5t329 137q156 0 262 -152l106 142h94v-690q0 -168 86 -168q67 0 83 117q4 27 4 101q0 29 -1 66h104v-122zM725 650q0 12 -17 49 q-72 154 -186 154t-166 -152q-37 -106 -37 -242t32 -243q47 -158 145 -158q146 0 229 176v416z" />
+<glyph unicode="&#x1d6c3;" horiz-adv-x="1053" d="M1001 455q0 -199 -125 -339t-321 -140q-149 0 -215 93q0 -335 -48 -498h-240q47 208 47 341v1058q0 490 408 490q183 0 309 -91.5t126 -264t-152 -290.5q115 -64 163 -146t48 -213zM714 168q46 81 46 182t-32 210t-88 169q-50 -18 -96 -18t-101.5 30t-55.5 68.5t45.5 64 t94 25.5t108.5 -19q58 86 58 211.5t-41 195.5q-51 87 -155 87q-158 0 -158 -303v-776q0 -87 67.5 -156t160 -69t147.5 98z" />
+<glyph unicode="&#x1d6c4;" horiz-adv-x="1031" d="M861 959q118 0 118 -120t-133 -368q-36 -66 -211 -353q35 -207 35 -372q0 -186 -126 -186q-122 0 -122 204q0 99 30.5 228.5t75.5 211.5q-19 143 -86 315q-90 226 -185 226q-113 0 -127 -152h-78v17q0 349 167 349q228 0 373 -661q103 228 131 413q17 116 31 154 q34 94 107 94z" />
+<glyph unicode="&#x1d6c5;" horiz-adv-x="1003" d="M776 821q175 -152 175 -365.5t-132 -346.5t-333 -133t-317.5 115.5t-116.5 294.5t105.5 304t270.5 172l-184 142q-89 87 -89 207q0 72 67 133q130 116 303 116q123 0 208 -38q114 -50 114 -158q0 -57 -38.5 -95.5t-95 -38.5t-95.5 38.5t-39 97.5t39 94q-43 9 -104 9 t-149 -42t-88 -107q0 -92 175 -194q267 -155 324 -205zM674 186q36 85 36 189t-33.5 198t-85.5 152.5t-89 58.5q-209 0 -209 -367q0 -128 48 -225q61 -122 172.5 -122t160.5 116z" />
+<glyph unicode="&#x1d6c6;" horiz-adv-x="904" d="M576 451l-87 15q-81 0 -122 -63t-41 -148q0 -185 170 -185q148 0 218 117l30 63q18 27 62.5 27t44.5 -39q0 -6 -2 -12q-41 -119 -143.5 -184.5t-242.5 -65.5t-260 57q-151 73 -151 207q0 194 334 249q-112 15 -192 71q-97 67 -97 168q0 127 142 187q104 44 251 44 q314 0 314 -163q0 -97 -111 -97q-40 0 -74 19.5t-34 56.5l13 58q0 40 -80 40q-187 0 -187 -167q0 -175 155 -175l90 16q73 0 73 -50q0 -46 -73 -46z" />
+<glyph unicode="&#x1d6c7;" horiz-adv-x="860" d="M439 203l203 12q110 0 186.5 -82.5t76.5 -193.5q0 -158 -99 -254.5t-257 -96.5q-65 0 -113 23q-63 29 -63 87q0 43 34.5 68.5t70.5 25.5t90.5 -13.5t93.5 -13.5t72.5 35.5t33.5 83.5t-30.5 76.5t-77.5 28.5l-185 -13q-423 0 -423 452q0 205 64.5 357.5t206.5 338.5 q-69 9 -118 51t-49 108q0 138 192 178l11 -39q-86 -42 -86 -126q0 -43 29.5 -76.5t71.5 -34.5q230 244 366 244q74 0 74 -58q0 -101 -159 -178q-130 -62 -251 -69q-224 -286 -224 -612q0 -137 63.5 -223t195.5 -86z" />
+<glyph unicode="&#x1d6c8;" horiz-adv-x="1286" d="M928 -37v698q0 207 -69 207q-120 0 -196 -98t-76 -221v-549h-246v684q0 176 -91 176t-91 -217q0 -32 2 -80h-109v128q0 102 61.5 182.5t167.5 80.5t183 -44q93 -53 105 -157q105 201 316 201q154 0 221 -75t67 -231v-736q0 -133 47 -341h-244q-48 163 -48 392z" />
+<glyph unicode="&#x1d6c9;" horiz-adv-x="1104" d="M947 1225q105 -206 105 -494t-106 -495q-135 -260 -395 -260t-393 260q-106 205 -106 493t106 496q134 263 394.5 263t394.5 -263zM772 787q0 607 -219.5 607t-219.5 -596v-11h439zM772 678h-439q0 -608 219.5 -608t219.5 608z" />
+<glyph unicode="&#x1d6ca;" horiz-adv-x="741" d="M694 240q0 -97 -58.5 -174.5t-152.5 -77.5q-295 0 -295 252v517q0 58 -137 58h-5v104l366 17v-690q0 -168 92 -168q67 0 83 117q3 29 3 118v49h104v-122z" />
+<glyph unicode="&#x1d6cb;" horiz-adv-x="1134" d="M1077 0h-306l-299 444l-62 -74v-370h-222v754q0 58 -137 58h-5v107l374 16v-414q24 27 70 84q124 174 171 220q113 110 249 110t136 -106q0 -41 -30 -67.5t-75.5 -26.5t-86 29t-77.5 29q-82 0 -178 -162l340 -506q13 -20 138 -20v-105z" />
+<glyph unicode="&#x1d6cc;" horiz-adv-x="1163" d="M1111 337q0 -350 -167 -350q-99 0 -182 123q-61 90 -96 214l-96 335l-287 -659h-231l425 984q-37 138 -54 179q-50 114 -124 114q-112 0 -128 -152h-77v17q0 349 166 349q99 0 183 -123q61 -91 96 -214l189 -659q44 -154 55 -179q49 -114 123 -114q111 0 127 151h78v-16z " />
+<glyph unicode="&#x1d6cd;" horiz-adv-x="1286" d="M1236 240q0 -97 -58.5 -174.5t-152.5 -77.5q-211 0 -270 139q-101 -139 -268 -139q-82 0 -144 25q0 -311 -37 -442h-254q45 198 45 332v1020h245v-612q0 -237 159 -237q147 0 231 131q-12 64 -12 153v565h240v-677q0 -168 86 -168q67 0 83 117q4 29 4 93q0 33 -1 74h104 v-122z" />
+<glyph unicode="&#x1d6ce;" horiz-adv-x="1045" d="M992 833q0 -127 -117 -327l-281 -480q-29 -50 -87 -50t-74 50l-218 682q-24 75 -55 99q-29 23 -102 23h-6v67q152 2 240 60h95l232 -726l146 261q39 70 39 116t-26.5 123t-26.5 122.5t37 75.5t85 30t83.5 -40t35.5 -86z" />
+<glyph unicode="&#x1d6cf;" horiz-adv-x="957" d="M439 203l203 12q110 0 186.5 -82.5t76.5 -193.5q0 -158 -99 -254.5t-257 -96.5q-65 0 -113 23q-63 29 -63 87q0 43 34.5 68.5t70.5 25.5t90.5 -13.5t93.5 -13.5t72.5 35.5t33.5 83.5t-30.5 76.5t-77.5 28.5l-185 -13q-199 0 -311 105t-112 303q0 238 207 394 q-71 54 -71 150t87 196q-69 9 -118 51t-49 108q0 138 192 178l11 -39q-86 -42 -86 -126q0 -43 29.5 -76.5t71.5 -34.5q230 244 366 244q73 0 73 -58q0 -101 -159 -178q-130 -62 -250 -69q-80 -91 -80 -164t59 -115q139 68 321 68q41 0 85 -20t44 -56q0 -58 -96 -95 q-76 -30 -158 -30t-184 15q-105 -73 -147 -129q-60 -78 -60 -179t105 -163q89 -53 194 -53z" />
+<glyph unicode="&#x1d6d0;" horiz-adv-x="1054" d="M182 107.5q-130 131.5 -130 350.5t128 360t347.5 141t347 -141.5t127.5 -359.5t-129.5 -350t-345 -132t-345.5 131.5zM761 408q0 176 -48 296q-68 169 -217 169q-203 0 -203 -330q0 -173 51 -300q71 -173 218 -173q199 0 199 338z" />
+<glyph unicode="&#x1d6d1;" horiz-adv-x="1235" d="M1182 763h-264v-109q0 -342 103 -518q26 -44 26 -64q0 -45 -35 -70.5t-82 -25.5q-88 0 -140 197q-39 146 -39 273v317h-160l-75 -627q-19 -160 -128.5 -160t-109.5 92q0 14 12 48q94 268 159 647h-178q-51 0 -107.5 -41t-64.5 -41q-46 0 -46 49t72 121t186 72h871v-160z " />
+<glyph unicode="&#x1d6d2;" horiz-adv-x="1074" d="M97 471q0 217 118.5 352.5t334 135.5t344 -142.5t128.5 -359t-130.5 -349t-343.5 -132.5q-151 0 -227 105q0 -353 -46 -510h-223q45 198 45 332v568zM781 408q0 171 -50 295q-70 170 -215 170q-99 0 -151 -86q-44 -72 -44 -177v-315q0 -89 84.5 -157t175.5 -68 q200 0 200 338z" />
+<glyph unicode="&#x1d6d3;" horiz-adv-x="945" d="M439 203l182 12q109 0 186 -83t77 -193q0 -156 -99.5 -253.5t-256.5 -97.5q-66 0 -114 23q-62 29 -62 87q0 42 35 68t70.5 26t90.5 -13.5t94 -13.5t72 35.5t33 83.5t-31 76.5t-77 28.5l-164 -13q-198 0 -310.5 105.5t-112.5 314t147 386t363 177.5q123 0 208 -38 q114 -50 114 -158q0 -57 -38.5 -95.5t-95 -38.5t-95.5 38.5t-39 97.5t39 94q-43 9 -91 9q-159 0 -267.5 -121.5t-108.5 -282.5q0 -118 66.5 -189.5t184.5 -71.5z" />
+<glyph unicode="&#x1d6d4;" horiz-adv-x="1147" d="M1097 763h-235q103 -132 103 -332.5t-124.5 -327.5t-332 -127t-333 126.5t-125.5 337.5t124 347t335 136h588v-160zM733 392q0 251 -95 371h-209q-147 0 -147 -241q0 -167 49 -288q68 -167 210 -167q192 0 192 325z" />
+<glyph unicode="&#x1d6d5;" horiz-adv-x="1025" d="M972 763h-302v-527q0 -169 86 -169q67 0 83 118q5 31 5 110q0 26 -1 58h105v-123q0 -98 -59 -176t-154 -78q-309 0 -309 254v533h-155q-51 0 -107.5 -41t-64.5 -41q-46 0 -46 49t72 121t186 72h661v-160z" />
+<glyph unicode="&#x1d6d6;" horiz-adv-x="1257" d="M1205 487q0 -217 -126.5 -364t-339.5 -147q-188 0 -293 100.5t-105 287.5v319q0 176 -91 176t-91 -217q0 -17 2 -80h-109v127q0 102 61.5 183t159.5 81q292 0 292 -250v-319q0 -314 211 -314q153 0 231 146q63 116 63 284q0 296 -234 371l12 70q165 -18 261 -150t96 -304 z" />
+<glyph unicode="&#x1d6d7;" horiz-adv-x="1364" d="M1135 824q184 -137 184 -363t-187 -357q-161 -113 -397 -127l-1 -400h-105l1 400q-237 14 -398 127q-187 131 -187 357t184 363q161 120 401 133l-1 224h105l1 -224q239 -13 400 -133zM735 71q149 19 229 136t80 279.5t-80 266.5t-229 120v-802zM630 873 q-150 -16 -230 -120t-80 -266.5t80 -279.5t230 -136v802z" />
+<glyph unicode="&#x1d6d8;" horiz-adv-x="1104" d="M1052 -91q0 -349 -166 -349q-101 0 -184 122q-66 96 -94 215l-42 181l-275 -516h-239l443 829q-35 157 -56 213q-54 141 -136 141q-113 0 -127 -152h-78v17q0 349 167 349q101 0 185 -122q67 -97 93 -215l22 -98l223 418h239l-390 -732l32 -143q66 -293 179 -293t127 152 h77v-17z" />
+<glyph unicode="&#x1d6d9;" horiz-adv-x="1327" d="M1275 603q0 -239 -86 -409q-110 -217 -325 -217v-400h-110v400q-413 0 -413 391v315q0 176 -91 176t-91 -217q0 -16 2 -80h-109v127q0 102 61.5 183t159.5 81q292 0 292 -250v-263q0 -165 22 -234q40 -128 167 -135v882h110v-882q115 14 186.5 135.5t71.5 246.5 q0 80 -19 145l-35 119q-16 59 -16 109q0 127 100 127q123 0 123 -350z" />
+<glyph unicode="&#x1d6da;" horiz-adv-x="1403" d="M1351 433q0 -182 -93 -311q-103 -146 -278 -146q-197 0 -278 133q-81 -133 -278 -133q-175 0 -279 145q-93 130 -93 312q0 260 150 391.5t415 134.5l-19 -86q-170 -4 -229 -160q-36 -95 -36 -300q0 -343 122 -343q63 0 119 58.5t85 128.5q-64 132 -64 272 q0 239 106.5 239t106.5 -239q0 -142 -63 -272q29 -70 84.5 -128.5t118.5 -58.5q133 0 133 315q0 215 -38 317q-61 166 -238 171l-19 86q265 -3 415 -134.5t150 -391.5z" />
+<glyph unicode="&#x1d6db;" horiz-adv-x="1311" d="M1231 824q0 -88 -15 -189q-99 -670 -631 -670q-195 0 -316 80q-189 125 -189 356.5t163.5 381t404.5 149.5q218 0 304 -211q19 140 19 229q0 426 -354 426q-173 0 -261 -130q44 -8 73 -42t29 -81t-36 -83t-85 -36t-86 35t-37 81.5t28 109.5q101 226 378 226t444 -174.5 t167 -457.5zM926 552q0 127 -66 216.5t-188 89.5q-180 0 -258 -141q-31 -57 -50.5 -193.5t-19.5 -228.5q0 -242 240 -242q182 0 272 164q70 128 70 335z" />
+<glyph unicode="&#x1d6dc;" horiz-adv-x="959" d="M640 775l13 58q0 40 -137 40q-223 0 -223 -321v-9v-14h287q55 0 55 -49t-55 -49h-280q41 -361 262 -361q137 0 207 117l30 63q18 27 62.5 27t44.5 -39q0 -6 -2 -12q-41 -119 -143.5 -184.5t-232.5 -65.5q-216 0 -346 131.5t-130 350.5t128 360t348 141q121 0 206 -29 q125 -41 125 -134q0 -97 -111 -97q-40 0 -74 19.5t-34 56.5z" />
+<glyph unicode="&#x1d6dd;" horiz-adv-x="1442" d="M1390 712q0 -38 -29 -38t-78 13q-6 -268 -115 -465q-136 -246 -378 -246q-449 0 -449 388v119q0 176 -90 176t-90 -151v-19h-109v27q0 84 60.5 160.5t160.5 76.5q292 0 292 -310v-59q0 -144 37 -216q52 -98 183 -98q219 0 219 602v71q-502 130 -502 460q0 124 80.5 204.5 t204.5 80.5q249 0 382 -246q104 -192 115 -471q106 0 106 -59zM792 1394q-80 0 -129.5 -61t-49.5 -143q0 -247 391 -362q-1 195 -33 334q-53 232 -179 232z" />
+<glyph unicode="&#x1d6de;" horiz-adv-x="1070" d="M1017 303q0 -327 -178 -327q-186 0 -186 426l-242 -181q-24 -245 -173 -245q-63 0 -97.5 51t-34.5 117q0 167 218 320v37q0 257 -109 257q-97 0 -96 -181h-65q-2 46 -2 56q0 121 30 205q44 121 140.5 121t144.5 -95.5t48 -332.5l242 186q25 242 168 242q68 0 103 -49.5 t35 -120.5q0 -166 -217 -317v-33q0 -263 108 -263q97 0 96 180h65q2 -41 2 -53z" />
+<glyph unicode="&#x1d6df;" horiz-adv-x="1200" d="M717 956q193 0 312 -151.5t119 -361.5t-138.5 -338t-363.5 -128v-400h-113v400q-220 0 -350.5 131t-130.5 353t130 360t353 138q-45 -35 -62 -93q-137 -43 -137 -372q0 -187 21 -266q41 -157 173 -157h3v531q0 157 22 227q40 127 162 127zM865 467q0 400 -155 400 q-64 0 -64 -138v-658h2q146 0 192 136q25 73 25 260z" />
+<glyph unicode="&#x1d6e0;" horiz-adv-x="1069" d="M788 -373l-238 -13q-194 0 -272 29q-125 47 -171.5 195t-46.5 617q0 222 128 363t347 141t346.5 -141.5t127.5 -359.5t-129.5 -350t-344.5 -132q-264 0 -357 196v-25q0 -133 12 -179q25 -96 114 -125q52 -17 390 -17q135 0 193 -31q82 -43 82 -167q0 -56 -47 -56 q-21 0 -41.5 27.5t-92.5 27.5zM769 408q0 176 -49 296q-68 169 -217 169q-203 0 -203 -330q0 -173 51 -300q71 -173 218 -173q200 0 200 338z" />
+<glyph unicode="&#x1d6e1;" horiz-adv-x="1728" d="M1675 765h-242q112 -127 112 -342q0 -173 -88 -296q-99 -139 -265 -139q-188 0 -265 126q-77 -126 -253.5 -126t-275.5 139q-88 123 -88 296q0 213 110 340h-149q-51 0 -107.5 -41t-64.5 -41q-46 0 -46 49t72 121t186 72h1364v-158zM1287 389q0 276 -84 374h-552 q-84 -98 -84 -374q0 -311 125 -311q60 0 112.5 55t80.5 122q-61 124 -61 233q0 203 103 203t103 -203q0 -109 -61 -233q28 -67 80.5 -122t112.5 -55q125 0 125 311z" />
+<glyph unicode="&#x1d6e2;" horiz-adv-x="1388" d="M239 4l-149 -4q-23 0 -23 19q0 33 37 38q145 20 229 161l690 1152q20 33 48.5 33t33.5 -43l119 -1226q6 -55 36 -69q17 -8 72.5 -8t55.5 -20q0 -37 -35 -37l-185 4h-143l-99 -4q-29 0 -29 22q0 29 24 34l91 10q59 10 59 55q0 57 -13.5 161.5t-15.5 125.5l-5 56h-501 l-149 -247q-36 -59 -36 -92q0 -46 54.5 -64t54.5 -24q0 -37 -36 -37zM1032 521l-66 661l-395 -661h461z" />
+<glyph unicode="&#x1d6e3;" horiz-adv-x="1294" d="M1317 1280q117 -75 117 -213.5t-137 -245.5q-116 -90 -271 -120q123 -11 211.5 -84t88.5 -194t-100 -233q-89 -97 -204 -143.5t-229 -46.5h-673q-53 0 -53 22q0 37 68 38h36q73 1 94 32q10 14 20 54l264 1057q8 31 8 45q0 29 -46 35q-5 1 -63 1t-58 22q0 37 47 37h639 q142 0 241 -63zM1228 927q45 78 45 164t-61.5 140.5t-161.5 54.5h-255q-55 0 -72 -12t-30 -65l-121 -491h281q117 0 218 54.5t157 154.5zM1161 446q0 106 -63.5 169t-169.5 63h-370l-137 -553q-7 -28 -7 -45q0 -23 66 -23h266q164 0 289.5 113.5t125.5 275.5z" />
+<glyph unicode="&#x1d6e4;" horiz-adv-x="1179" d="M189 4l-92 -4q-30 0 -30 22q0 25 16 32t50 7h63q53 4 70 32q8 13 18 53l266 1065q8 31 8 39q0 29 -49 34h-69q-51 0 -51 23q0 36 49 36h895q45 0 45 -22l-45 -373q-5 -44 -26 -44t-21 22q0 10 6.5 51.5t6.5 105.5q0 123 -70 168q-54 35 -185 35h-253q-47 0 -61.5 -14.5 t-26.5 -60.5l-268 -1074q-8 -31 -8 -39q0 -39 107.5 -41t107.5 -22q0 -35 -49 -35l-104 4h-300z" />
+<glyph unicode="&#x1d6e5;" horiz-adv-x="1074" d="M1011 35l2 -10q0 -25 -41 -25h-881q-24 0 -24 16t11 35l755 1317q20 35 48.5 35t32.5 -45zM846 130l-77 1028l-547 -953q-15 -25 -30 -75h654z" />
+<glyph unicode="&#x1d6e6;" horiz-adv-x="1260" d="M1459 1321q0 11 -5 -30l-41 -343q-5 -44 -26 -44t-21 22q0 2 6 34.5t6 110.5q0 134 -82 181q-59 34 -199 34h-301q-49 0 -64.5 -12.5t-28.5 -62.5l-122 -487h201q112 0 157 35.5t82 158.5q10 35 27 35q21 0 21 -13q0 -5 -26 -110l-87 -352q-10 -41 -28 -41q-21 0 -21 19 q0 1 9.5 34t9.5 76t-7 57q-22 44 -147 44h-205l-136 -542q-8 -32 -8 -45q0 -23 45 -23h309q222 0 333 94q83 71 182 299q23 53 40 53q20 0 20 -18.5t-187 -450.5q-10 -24 -19.5 -29t-39.5 -5h-1000q-39 0 -39 22q0 32 46 37q36 1 71 1q70 2 87 44q5 13 13 42l266 1065 q8 31 8 39q0 29 -48 34h-69q-52 0 -52 23q0 36 47 36h980q43 0 43 -22z" />
+<glyph unicode="&#x1d6e7;" horiz-adv-x="1105" d="M1352 1327q0 -22 -21 -45l-1080 -1222h341q229 0 341 97q88 77 170 310q18 52 33 52q20 0 20 -20q0 -39 -143 -462q-4 -13 -19 -32q-7 -5 -41 -5h-838q-48 0 -48 15q0 24 25 52l1078 1219h-322q-204 0 -311 -79q-90 -67 -169 -268q-14 -35 -28 -35q-20 0 -20 20 q0 37 115 382q4 14 19 33q8 4 39 4h812q47 0 47 -16z" />
+<glyph unicode="&#x1d6e8;" horiz-adv-x="1416" d="M1536 1339l98 4q29 0 29 -22q0 -34 -89 -38t-108 -33q-10 -14 -19 -51l-269 -1074q-4 -16 -4 -33q0 -33 83.5 -34.5t83.5 -20.5q0 -37 -38 -37l-102 4h-260l-99 -4q-28 0 -28 19q0 31 35 37q5 1 60 1q91 0 117 62q1 2 12 51l125 501h-596l-136 -546q-4 -16 -4 -33 q0 -33 83.5 -34.5t83.5 -20.5q0 -37 -37 -37l-104 4h-258l-100 -4q-28 0 -28 19q0 41 68 41h38q70 0 92 32q8 12 19 54l265 1057q8 31 8 45q0 29 -48 35q-4 1 -62.5 1t-58.5 22q0 37 37 37l101 -4h262l99 4q30 0 30 -22q0 -34 -89.5 -38t-109.5 -33q-8 -11 -18 -51 l-118 -471h594l120 475q7 31 7 45q0 29 -47 35q-4 1 -63 1t-59 22q0 37 39 37l100 -4h263z" />
+<glyph unicode="&#x1d6e9;" horiz-adv-x="1427" d="M1546 861q0 -333 -258 -618t-587 -285q-222 0 -355 147.5t-133 372.5q0 330 260 618.5t585 288.5q224 0 356 -148.5t132 -375.5zM1388 933q0 171 -87 289.5t-253 118.5q-241 0 -441 -243q-104 -128 -165 -313t-61 -358t78 -289q90 -134 256 -134q286 0 492 331 q181 293 181 598zM1278 785q0 -10 -50 -204q-10 -41 -28 -41t-18 21q0 9 10 46h-655q-14 -67 -33.5 -67t-19.5 21q0 7 49 203q10 41 27 41q21 0 21 -20q0 -10 -10 -47h653q14 67 34 67t20 -20z" />
+<glyph unicode="&#x1d6ea;" horiz-adv-x="687" d="M812 1339l94 4q29 0 29 -20q0 -27 -17 -35q-4 -2 -87 -5t-103 -33q-5 -8 -17 -53l-267 -1056q-7 -27 -7 -45q0 -30 46 -36q4 -1 67 -1t63 -24q0 -35 -44 -35l-96 4h-282l-94 -4q-30 0 -30 19q0 38 47 38q140 0 162 36q6 9 17 53l265 1059q9 35 9 43q0 36 -88.5 37 t-88.5 21q0 37 37 37l104 -4h281z" />
+<glyph unicode="&#x1d6eb;" horiz-adv-x="1449" d="M1607 1339l65 4q24 0 24 -22q0 -29 -35 -35q-138 -25 -312 -154l-363 -281q-24 -18 -36 -29q3 -14 58 -144l226 -532q24 -54 47 -70q8 -5 63 -16t55 -23q0 -37 -34 -37l-187 4l-211 -4q-26 0 -26 19q0 38 36 38q97 0 97 62q0 26 -251 607l-300 -234l-77 -304 q-19 -74 -19 -96q0 -33 83.5 -34.5t83.5 -20.5q0 -37 -37 -37l-112 4h-237l-111 -4q-30 0 -30 22q0 32 46 37q35 1 84 2t68 31q9 15 19 54l265 1057q8 31 8 45q0 37 -107 37q-60 0 -60 21q0 37 37 37l110 -4h239l111 4q30 0 30 -20q0 -24 -16 -34q-3 -2 -83.5 -6t-98.5 -31 q-9 -13 -19 -53l-163 -649l771 599q75 58 75 99q0 26 -36.5 35t-36.5 25q0 35 48 35l175 -4h74z" />
+<glyph unicode="&#x1d6ec;" horiz-adv-x="1284" d="M226 4l-138 -4q-21 0 -21 19q0 34 27 38q138 23 215 158l660 1153q21 35 49.5 35t31.5 -45l90 -1228q4 -51 27 -65q8 -4 62.5 -7.5t54.5 -20.5q0 -37 -36 -37l-97 4h-101l-217 -4q-26 0 -26 19q0 35 41 38q134 10 134 76q0 7 -1 20l-75 1005l-548 -953q-30 -52 -30 -79 q0 -51 56.5 -64t56.5 -27q0 -35 -46 -35z" />
+<glyph unicode="&#x1d6ed;" horiz-adv-x="1725" d="M272 4l-179 -4q-26 0 -26 22q0 32 49 38q75 10 99 22q61 30 83 119l251 1002q8 31 8 45q0 29 -45 35q-5 1 -63.5 2t-58.5 21q0 37 47 37h261q30 0 38 -7t12 -37l148 -1125l717 1135q21 34 62 34h257q40 0 40 -20q0 -26 -15 -34q-4 -3 -84 -6.5t-99 -32.5q-6 -10 -17 -51 l-270 -1074q-4 -16 -4 -33q0 -33 84 -34.5t84 -20.5q0 -37 -38 -37l-103 4h-246l-97 -4q-31 0 -31 22q0 32 46 37q36 1 84.5 2t68.5 32q9 14 19 53l285 1138h-2l-791 -1250q-22 -34 -41 -34t-26 53l-163 1221h-2l-271 -1082q-9 -36 -9 -51q0 -49 41 -68q19 -9 67.5 -15 t48.5 -21q0 -37 -36 -37z" />
+<glyph unicode="&#x1d6ee;" horiz-adv-x="1416" d="M1460 1339l179 4q24 0 24 -22q0 -32 -48 -38q-74 -9 -99 -22q-61 -32 -84 -125l-275 -1096q-10 -40 -31 -40q-16 0 -30 35l-469 1166q-11 27 -20 41l-264 -1050q-9 -36 -9 -51q0 -49 41 -68q19 -9 67.5 -15t48.5 -21q0 -37 -36 -37l-183 4l-179 -4q-26 0 -26 19 q0 34 48 41q78 10 100 21q60 30 83 120l260 1041l7 26q0 14 -88.5 16t-88.5 22q0 37 48 37h258q36 0 50 -34l421 -1046l222 886q8 36 8 52q0 47 -40 66q-18 9 -66.5 16.5t-48.5 22.5q0 37 35 37l90 -4h95z" />
+<glyph unicode="&#x1d6ef;" horiz-adv-x="1288" d="M1401 1079l15 117q0 27 -102 27h-765q-95 0 -109 -13t-38 -85t-40 -72q-19 0 -19 20q0 12 6 31l63 202q12 37 53 37h987q37 0 37 -14.5t-43 -233.5q-8 -42 -26.5 -42t-18.5 26zM1202 826q0 -7 -6 -30l-56 -215q-11 -41 -26 -41q-20 0 -20 21q0 10 16 71h-660 q-23 -92 -42 -92q-23 0 -18 21l58 244q10 41 28 41q22 0 22 -20q0 -8 -18 -73h660q21 93 40 93q22 0 22 -20zM1234 311q21 0 21 -21.5t-81 -259.5q-8 -23 -15.5 -26.5t-34.5 -3.5h-999q-43 0 -43 19q0 4 13 71l36 178q10 43 24 43q22 0 22 -20q0 -1 -10 -48t-10 -115 q55 -7 123 -7h755q103 0 114.5 13t40.5 95t44 82z" />
+<glyph unicode="&#x1d6f0;" horiz-adv-x="1427" d="M1546 861q0 -333 -258 -618t-587 -285q-222 0 -355 147.5t-133 372.5q0 330 260 618.5t585 288.5q224 0 356 -148.5t132 -375.5zM1388 933q0 171 -87 289.5t-253 118.5q-241 0 -441 -243q-104 -127 -165 -312.5t-61 -358.5t78 -289q90 -134 256 -134q286 0 492 331 q181 293 181 598z" />
+<glyph unicode="&#x1d6f1;" horiz-adv-x="1414" d="M187 4l-92 -4q-28 0 -28 19q0 39 44 40l86 2q53 5 69 32q8 12 18 53l268 1069q6 24 6 35q0 34 -87 34h-15q-67 0 -67 21q0 38 46 38h1187q40 0 40 -20q0 -27 -12.5 -33t-88.5 -7t-96 -34q-10 -15 -19 -53l-268 -1071q-4 -16 -4 -33q0 -33 83.5 -34.5t83.5 -20.5 q0 -37 -38 -37l-96 4h-273l-92 -4q-28 0 -28 19q0 38 46 38q131 0 154 36q7 11 17 53l286 1140h-596l-290 -1161q-4 -16 -4 -33q0 -33 83.5 -34.5t83.5 -20.5q0 -37 -37 -37l-97 4h-273z" />
+<glyph unicode="&#x1d6f2;" horiz-adv-x="1252" d="M207 4l-110 -4q-30 0 -30 22q0 32 48 37q36 1 83 2t66 29q11 15 21 56l264 1057q8 31 8 45q0 29 -46 35q-5 1 -63 1t-58 22q0 37 46 37h616q151 0 256 -69q122 -81 122 -224q0 -181 -186 -310q-167 -115 -357 -115h-330l-126 -500q-4 -16 -4 -35q0 -32 83.5 -33t83.5 -20 q0 -37 -37 -37l-111 4h-239zM1264 1092q0 194 -269 194h-194q-55 0 -72.5 -12t-30.5 -65l-133 -538h277q296 0 390 254q32 85 32 167z" />
+<glyph unicode="&#x1d6f3;" horiz-adv-x="1427" d="M1546 861q0 -333 -258 -618t-587 -285q-222 0 -355 147.5t-133 372.5q0 330 260 618.5t585 288.5q224 0 356 -148.5t132 -375.5zM1388 933q0 171 -87 289.5t-253 118.5q-241 0 -441 -243q-120 -147 -183 -370h941q23 110 23 205zM381 428q0 -174 78 -290 q90 -134 256 -134q224 0 406 213q158 185 230 454h-941q-29 -126 -29 -243z" />
+<glyph unicode="&#x1d6f4;" horiz-adv-x="1324" d="M1432 928l8 114q0 157 -107 209q-70 35 -245 35h-508l256 -615q-2 -10 -19 -25l-617 -571h549q244 0 348 61q70 42 125 130q24 38 83 162q14 28 27 28q20 0 20 -19q0 -3 -68.5 -189.5t-76.5 -206.5t-23 -38q-6 -3 -39 -3h-1019q-52 0 -52 19q0 9 19 26l600 553l-298 703 q-2 42 56 42h1021q53 0 50 -24l-45 -368q-5 -47 -25 -47t-20 24z" />
+<glyph unicode="&#x1d6f5;" horiz-adv-x="1404" d="M508 4l-125 -4q-30 0 -30 19q0 29 18 36q4 2 59.5 2.5t114 6t75 24.5t28.5 65l265 1066q11 44 11 46q0 21 -54 21h-145q-182 0 -264 -89q-43 -47 -122 -259q-12 -33 -27 -33q-20 0 -20 19q0 1 128 382q4 14 18 33q7 4 31 4h1086q50 0 50 -22q0 -3 -4 -27l-56 -347 q-7 -42 -26.5 -42t-19.5 28t10.5 93t10.5 99q0 99 -68 136q-48 26 -187.5 26t-154.5 -5q-30 -10 -46 -73l-265 -1058q-9 -35 -9 -49t7 -23q14 -18 124.5 -21t110.5 -21q0 -37 -42 -37l-125 4h-357z" />
+<glyph unicode="&#x1d6f6;" horiz-adv-x="1429" d="M562 4l-126 -4q-33 0 -33 19q0 38 46 38q142 0 173 15t49 87l85 333q80 316 80 448q0 296 -211 296q-154 0 -237 -168q-16 -32 -37.5 -32t-21.5 16q0 22 30 83q112 230 300 230q274 0 274 -379q0 -21 -7 -110q79 199 191 324q147 165 322 165q91 0 139.5 -61.5 t48.5 -164.5t-45 -103q-21 0 -21 16l4 44q0 64 -45.5 102t-111.5 38q-305 0 -463 -588q-84 -314 -109 -427t-25 -125t7 -20q14 -16 111 -18t97 -23q0 -35 -50 -35l-131 4h-283z" />
+<glyph unicode="&#x1d6f7;" horiz-adv-x="1300" d="M1130 1339l128 4q29 0 29 -20q0 -30 -20 -37q-9 -3 -46 -3h-23q-128 0 -155 -39q-11 -17 -47 -162q163 -12 282 -93q141 -95 141 -241t-124 -269q-192 -190 -503 -217q-39 -154 -39 -162q0 -40 107 -42t107 -23q0 -35 -49 -35l-119 4h-285l-127 -4q-32 0 -32 19 q0 26 21 36q4 3 84.5 4t104.5 10q38 16 59 83l25 107q-165 15 -283 94q-141 96 -141 243.5t127 270.5q104 103 238 154t262 61q38 143 38 159.5t-5 23.5q-12 18 -107 18h-31q-41 0 -55.5 4t-14.5 19q0 37 40 37l127 -4h286zM1256 785q0 228 -269 256l-185 -740 q314 34 418 304q36 92 36 180zM389 558q0 -229 270 -257l184 740q-325 -35 -425 -319q-29 -84 -29 -164z" />
+<glyph unicode="&#x1d6f8;" horiz-adv-x="1418" d="M1557 1339l84 4q24 0 24 -22q0 -29 -38 -35q-122 -19 -179 -53t-152 -133l-325 -349l261 -610q27 -61 55 -75q5 -2 70.5 -7t65.5 -22q0 -37 -35 -37l-100 4h-226l-102 -4q-30 0 -30 19q0 32 34 38q103 22 106 58l-217 508l-364 -393q-82 -86 -82 -115q0 -42 45.5 -54 t45.5 -26q0 -35 -49 -35l-274 4l-84 -4q-24 0 -24 19q0 33 39 38q173 26 301 160l427 454l-234 547q-20 49 -57 61q-15 5 -71 6.5t-56 20.5q0 37 35 37l209 -4h112l107 4q30 0 30 -22q0 -26 -61 -41t-82 -52l186 -430l344 371q30 33 30 59q0 40 -45 52.5t-45 27.5 q0 35 49 35z" />
+<glyph unicode="&#x1d6f9;" horiz-adv-x="1418" d="M1184 1339l126 4q30 0 30 -20q0 -27 -20 -36q-4 -2 -100.5 -4.5t-119.5 -31.5q-13 -16 -24 -59l-223 -887q290 70 412 507q48 174 118 233q54 46 131 47q21 -1 61.5 0t40.5 -21q0 -11 -29 -19q-80 -20 -125 -102q-22 -38 -60 -160q-150 -483 -559 -528q-37 -148 -37 -163 t9 -26.5t107 -14t98 -23.5q0 -35 -48 -35l-121 4h-284l-127 -4q-33 0 -33 19q0 37 41 40q52 1 112.5 2t84.5 25q14 15 55 176q-318 44 -318 357q0 54 23 159.5t23 160.5q0 94 -71 113q-25 7 -25 19q0 19 44 22h2q108 0 144 -23q48 -31 48 -131q0 -60 -26 -177t-26 -177 q0 -235 194 -282l224 891q7 31 7 46.5t-5 24.5q-11 17 -109 19.5t-98 21.5q0 37 38 37l127 -4h288z" />
+<glyph unicode="&#x1d6fa;" horiz-adv-x="1356" d="M1504 989q0 -150 -113 -314q-46 -67 -217 -258.5t-222 -303.5h158q106 0 132 31q3 4 41 81.5t56 77.5q22 0 22 -18.5t-65.5 -147t-76 -133t-39.5 -4.5h-250q-50 0 -50 19q0 98 222 447q116 183 157 269q79 164 79 302t-87.5 223t-229.5 85q-106 0 -214 -53 q-168 -83 -253 -239t-85 -351q0 -83 22.5 -246.5t22.5 -246.5q0 -171 -24 -196q-13 -13 -49 -13h-266q-29 0 -35 16q-2 5 -2 115t4 141t21 31q21 0 24 -29q-2 20 -2 -46q0 -88 13.5 -101.5t101.5 -13.5h167q2 9 2 22q0 112 -82.5 321t-82.5 322q0 261 233 440 q215 167 484 167q194 0 331 -99q152 -110 152 -297z" />
+<glyph unicode="&#x1d6fb;" horiz-adv-x="1794" d="M1794 1373q0 -6 -4 -14l-695 -1401q-17 -35 -50.5 -35t-50.5 35l-694 1401q-4 8 -4 14q0 17 24 17h1450q24 0 24 -17zM1661 1244h-1115l557 -1126z" />
+<glyph unicode="&#x1d6fc;" horiz-adv-x="1203" d="M1216 959q23 0 23 -23t-9 -72q-26 -142 -93 -310t-146 -263q-1 -43 -1 -78q0 -194 68 -194q56 0 98 63t50 63q23 0 23 -16.5t-14 -41.5q-61 -111 -162 -111q-146 0 -194 194q-185 -194 -388 -194q-154 0 -236.5 101.5t-82.5 259.5q0 229 158.5 425.5t381.5 196.5 q157 0 235 -133q64 -109 64 -277v-186q134 191 199 550q8 46 26 46zM849 311l3 206q0 398 -171 398q-179 0 -292 -248q-91 -201 -91 -407q0 -241 178 -241q183 0 377 203q-4 47 -4 89z" />
+<glyph unicode="&#x1d6fd;" horiz-adv-x="1169" d="M1128 1458q82 -76 82 -194t-67 -221t-169 -163q143 -103 143 -312t-145 -402.5t-361 -193.5t-290 264l-138 -551q-28 -112 -86.5 -112t-58.5 56q0 13 6 37l322 1282q58 232 188 391q158 195 368 195q124 0 206 -76zM845 880q-38 15 -96 15t-97 -22q35 -10 75 -10h37 q41 0 81 17zM1084 1312q0 72 -43.5 125.5t-113.5 53.5q-216 0 -368 -382q-52 -129 -162 -570q-37 -148 -37 -209q0 -123 57.5 -218t172.5 -95q192 0 297 234q82 182 82 402q0 126 -68 192q-73 -26 -186 -26t-113 52q0 67 160 67q82 0 145 -25q80 58 128.5 174.5t48.5 224.5z " />
+<glyph unicode="&#x1d6fe;" horiz-adv-x="1309" d="M1267 938q42 0 42 -38.5t-176 -397t-199 -440.5l-41 -286q-39 -218 -114 -218q-46 0 -46 61q0 88 31 201l62 215q32 122 32 227q0 554 -347 554q-218 0 -335 -243q-16 -34 -31 -34q-22 0 -22 27.5t39 104.5q146 288 376 288q200 0 295 -263q64 -175 73 -433 q120 318 249 573q52 102 112 102z" />
+<glyph unicode="&#x1d6ff;" horiz-adv-x="1057" d="M1146 1398q0 -45 -33 -80t-78 -35q-74 0 -74 69q0 37 26.5 67.5t63.5 36.5q-72 45 -156 45t-140.5 -36.5t-56.5 -106.5t93 -198q154 -209 173 -243q93 -160 93 -320q0 -228 -173 -424.5t-398 -196.5q-151 0 -242.5 104t-91.5 257q0 223 175.5 423t390.5 200q21 0 50 -4 q-124 241 -124 367q0 222 250 222q83 0 157 -33q95 -42 95 -114zM778 213q107 171 107 341t-84 343q-36 18 -80 18q-182 0 -308 -224q-43 -76 -79 -210t-36 -226.5t48.5 -164t141.5 -71.5q169 0 290 194z" />
+<glyph unicode="&#x1d700;" horiz-adv-x="1006" d="M1006 840q0 -27 -24.5 -52.5t-53 -25.5t-107.5 28t-125 28q-124 0 -228 -35q-147 -48 -147 -145q0 -55 74 -93q84 37 212.5 37t128.5 -56q0 -64 -158 -64q-116 0 -185 28q-66 -33 -119 -89t-53 -117q0 -91 104 -133q75 -31 183 -31q194 0 289 78q28 23 53 23q47 0 47 -34 q0 -23 -38 -69q-118 -142 -370 -142q-132 0 -227 63q-110 73 -110 198q0 84 54 159t134 120q-82 59 -82 147q0 136 169 223q142 73 292 73q70 0 166 -30q121 -37 121 -89zM682 524q-47 13 -108 13t-116 -19q38 -10 81 -10h70q39 0 73 16z" />
+<glyph unicode="&#x1d701;" horiz-adv-x="844" d="M753 1493l-9 -76q0 -47 21 -92q59 24 161 24q144 0 144 -53q0 -65 -187 -65q-90 0 -132 38q-200 -117 -343.5 -367t-143.5 -486.5t202 -306.5l200 -69q101 -35 146 -76q62 -55 62 -150t-70 -175.5t-167 -80.5q-72 0 -137.5 41t-65.5 63.5t23 21.5q113 -83 173.5 -83 t97.5 46t37 102q0 101 -158 160l-153 51q-91 31 -144 68q-158 108 -158 337q0 266 168 541.5t404 398.5q-27 51 -27 116q0 94 36 94q20 0 20 -22zM923 1305h-49q-42 0 -75 -15q25 -16 63 -16h37q75 0 120 19q-48 12 -96 12z" />
+<glyph unicode="&#x1d702;" horiz-adv-x="1118" d="M1118 730q0 -58 -18 -129l-244 -969q-19 -74 -80 -74t-61 54q0 14 6 38l247 974q19 75 19 139q0 152 -116 152q-163 0 -297 -177q-70 -92 -117 -281l-52 -253q-20 -100 -46 -182q-24 -46 -74 -46q-56 0 -56 54q0 24 26 126l56 222l63 218q36 133 36 226t-68 93 q-93 0 -161 -257q-14 -53 -33 -53q-25 0 -25 21q0 26 31 118.5t62 138.5q53 76 133.5 76t133 -54.5t57.5 -137.5q137 192 336 192q111 0 176.5 -59.5t65.5 -169.5z" />
+<glyph unicode="&#x1d703;" horiz-adv-x="977" d="M1024 1370q46 -115 46 -293.5t-69 -407.5t-201 -428q-177 -265 -360 -265q-140 0 -204 161q-46 115 -46 290t68 406.5t200 430.5q176 268 362 268q140 0 204 -162zM938 1219q0 270 -120 270q-115 0 -244 -236q-84 -153 -164 -466h459q69 265 69 432zM321 288 q0 -269 121 -269q109 0 232 214q102 178 180 488h-464q-69 -284 -69 -433z" />
+<glyph unicode="&#x1d704;" horiz-adv-x="698" d="M724 309q0 -14 -31 -73q-136 -260 -309 -260q-85 0 -139 55.5t-54 140.5q0 35 23 126l139 551q28 110 91 110q59 0 59 -53q0 -13 -11 -57l-163 -659q-7 -28 -7 -68q0 -103 68 -103q153 0 272 262q6 13 21 38q8 9 17 9q24 0 24 -19z" />
+<glyph unicode="&#x1d705;" horiz-adv-x="1113" d="M628 186l17 117q0 166 -249 195l-111 -445q-19 -77 -81 -77t-62 57q0 22 7 50l200 799q19 77 81 77t62 -57q0 -22 -7 -50l-73 -291q88 29 208 136q190 169 199 175q116 87 214 87q80 0 80 -71q0 -43 -33 -74.5t-76 -31.5q-72 0 -72 69q0 26 12 46q-94 -37 -244.5 -182 t-233.5 -176q316 -40 316 -235q0 -31 -13 -90t-13 -90q0 -105 71 -105q112 0 188 266q12 44 31 44q22 0 22 -24t-29 -102q-84 -227 -215 -227q-88 0 -142 60.5t-54 149.5z" />
+<glyph unicode="&#x1d706;" horiz-adv-x="1102" d="M1102 -7q0 -18 -45 -18q-81 0 -107 19.5t-54 92.5q-62 162 -194 554l-403 -483q-49 -68 -141 -167q-26 -18 -46 -18q-61 0 -61 57q0 29 43 72q575 581 587 594l-145 412q-89 246 -100 268q-26 57 -53 70q-22 6 -48 14.5t-26 23.5q0 24 39 24q212 0 266 -155l432 -1251 q20 -57 38 -81.5t18 -27.5z" />
+<glyph unicode="&#x1d707;" horiz-adv-x="1161" d="M1165 329q22 0 22 -24.5t-25 -103.5q-71 -225 -197 -225q-73 0 -124 44t-65 116q-118 -160 -285 -160q-135 0 -211 70l-95 -378q-30 -110 -90.5 -110t-60.5 54q0 10 7 38l308 1232q19 77 81.5 77t62.5 -54q0 -10 -29 -125l-99 -392q-28 -111 -28 -176q0 -193 162 -193 q137 0 248 155q28 39 39 83l152 606q19 75 81 75t62 -56q0 -6 -25 -110l-55 -223l-63 -212q-35 -125 -35 -221.5t66.5 -96.5t113.5 104q20 43 52 162q12 44 30 44z" />
+<glyph unicode="&#x1d708;" horiz-adv-x="1159" d="M1159 905q0 -28 -18 -83q-93 -284 -306 -491t-502 -306q-82 -28 -157 -28q-23 0 -23 17q0 2 1 5l192 770q6 24 6 43q0 37 -79 38t-79 24q0 33 47 43q49 4 147 13t106 9q25 0 25 -17q0 -8 -50 -209l-167 -671q284 94 459 320q132 169 258 503q28 74 84 74t56 -54z" />
+<glyph unicode="&#x1d709;" horiz-adv-x="938" d="M725 1493l-8 -84q0 -42 12 -70q62 10 168 10q144 0 144 -53q0 -65 -181 -65q-104 0 -143 45q-108 -50 -180 -152t-72 -217.5t75 -179.5q85 27 203 27q150 0 150 -55q0 -62 -184 -62q-98 0 -167 16l-31 8q-19 0 -64 -35q-211 -162 -211 -338q0 -130 187 -205l230 -92 q141 -56 157 -66q81 -50 81 -138.5t-68 -158.5t-157 -70q-82 0 -156.5 41.5t-74.5 64t22 20.5v-1q36 -30 100 -56t109.5 -26t77.5 36.5t32 82.5t-38 77q-14 12 -201.5 83.5t-245.5 106.5q-160 98 -160 237t96 265.5t225 198.5q-146 80 -146 229.5t121 264.5q104 100 256 145 q-15 34 -15 94q0 94 35 94q22 0 22 -22zM895 1305h-58q-42 0 -72 -9q28 -22 76 -22h48q57 0 102 19q-48 12 -96 12zM843 696q-71 15 -131 15t-120 -15q38 -16 87 -16h69q60 0 95 16z" />
+<glyph unicode="&#x1d70a;" horiz-adv-x="1057" d="M1057 597q0 -228 -173 -424.5t-398 -196.5q-151 0 -242.5 104t-91.5 257q0 226 174.5 424t397.5 198q150 0 241.5 -104.5t91.5 -257.5zM871 441q41 141 41 236.5t-49 166.5t-142 71q-181 0 -308 -224q-43 -76 -79 -210t-36 -226.5t48.5 -164t141.5 -71.5q260 0 383 422z " />
+<glyph unicode="&#x1d70b;" horiz-adv-x="1212" d="M1271 875q0 -71 -102 -71h-244q-42 -183 -42 -367t58 -335q16 -42 16 -48q0 -31 -26.5 -54.5t-57.5 -23.5q-91 0 -91 265q0 178 93 563h-248q-42 -168 -179 -680q-7 -33 -31 -95q-30 -53 -74 -53q-60 0 -60 57q0 15 17 53q197 446 277 718h-130q-87 0 -158 -51 q-44 -32 -89 -89.5t-56 -57.5q-25 0 -25 18t55 97q140 202 288 202h728q81 0 81 -48z" />
+<glyph unicode="&#x1d70c;" horiz-adv-x="1069" d="M1069 597q0 -228 -173.5 -424.5t-398.5 -196.5q-145 0 -206 155l-106 -427q-7 -37 -26 -94q-29 -52 -76 -52q-60 0 -60 54q0 6 8 38l206 820q46 184 176 327q147 162 321 162q152 0 243.5 -104t91.5 -258zM882 441q40 138 40 235t-48.5 168t-141.5 71q-231 0 -357 -445 q-62 -219 -62 -248t15 -67q54 -136 171 -136q261 0 383 422z" />
+<glyph unicode="&#x1d70d;" horiz-adv-x="923" d="M880 947q94 -17 94 -53.5t-37 -36.5q-5 0 -33 13q-89 41 -167 41q-165 0 -311 -105q-161 -115 -161 -274q0 -85 41.5 -132t129.5 -98q82 -43 242 -134q63 -38 89.5 -72.5t26.5 -98.5q0 -90 -66 -162.5t-156 -72.5q-32 0 -83 14t-51 36t25 22q16 0 52 -11.5t57 -11.5 q44 0 71.5 35t27.5 80q0 66 -85 114l-204 114q-115 64 -164 122q-66 77 -66 189q0 208 191 351t406 143q67 0 131 -12z" />
+<glyph unicode="&#x1d70e;" horiz-adv-x="1186" d="M1247 876q0 -69 -99 -69h-189q78 -99 78 -238q0 -217 -172 -405t-387 -188q-147 0 -236.5 102t-89.5 251q0 221 170 407.5t389 186.5h462q74 0 74 -47zM894 598q0 95 -55 152t-150 57q-183 0 -299 -195q-99 -167 -99 -363q0 -96 47.5 -163.5t139.5 -67.5q167 0 298 212 q118 190 118 368z" />
+<glyph unicode="&#x1d70f;" horiz-adv-x="1050" d="M1110 875q0 -71 -100 -71h-330l-145 -737q-18 -91 -85 -91q-60 0 -60 55q0 8 11 44l223 729h-176q-89 0 -161 -51q-43 -32 -87.5 -89.5t-55.5 -57.5q-24 0 -24 18t55 97q140 202 285 202h580q70 0 70 -48z" />
+<glyph unicode="&#x1d710;" horiz-adv-x="1061" d="M1061 813q0 -83 -34 -225q-146 -612 -452 -612q-281 0 -281 265q0 126 104 400q58 153 58 202q0 72 -58 72q-89 0 -148 -96q-29 -47 -72 -175q-13 -39 -30 -39q-25 0 -25 20t27 89q97 245 254 245q75 0 124 -50t49 -124q0 -42 -43 -155q-109 -287 -109 -418 q0 -193 158 -193q228 0 360 439q33 110 33 172t-51 146t-51 87q0 37 31 66.5t68 29.5q88 0 88 -146z" />
+<glyph unicode="&#x1d711;" horiz-adv-x="1207" d="M1161 531q0 -206 -189 -377t-431 -178l-77 -302q-9 -39 -22 -81q-9 -8 -21 -8q-24 0 -24 22q0 5 30 123l61 246q-180 10 -284.5 113.5t-104.5 252.5q0 207 189.5 377.5t430.5 177.5l117 468q11 41 31 41q23 0 24 -21l-119 -488q195 -14 300 -131q89 -99 89 -235z M1029 573q0 129 -74.5 201t-194.5 79l-209 -833q214 17 346 187.5t132 365.5zM231 300q0 -139 88 -214q72 -60 179 -66l209 833q-214 -19 -351 -196q-125 -160 -125 -357z" />
+<glyph unicode="&#x1d712;" horiz-adv-x="1141" d="M1161 937q0 -6 -467 -640q44 -181 108 -369q95 -277 159 -317q16 -10 33 -10q58 0 96 59t45 59q24 0 24 -19.5t-17 -47.5q-57 -94 -163.5 -94t-167.5 45q-73 54 -152 301l-82 260l-440 -596q-7 -10 -21 -10q-21 0 -21 20q0 10 467 640q-189 697 -300 697 q-52 0 -95.5 -58.5t-50.5 -58.5q-24 0 -24 20q0 14 20 45q62 96 171.5 96t180.5 -61q54 -46 126 -255q10 -30 89 -290l425 582q18 24 34 24q23 0 23 -22z" />
+<glyph unicode="&#x1d713;" horiz-adv-x="1363" d="M1363 813q0 -301 -179 -555q-198 -280 -487 -282l-50 -219q-43 -179 -52 -189t-20 -10q-25 0 -25 19q0 9 33 138l66 264q-349 25 -349 304q0 101 78 287t78 265.5t-58 79.5q-84 0 -139 -80q-31 -46 -63 -138t-48 -92q-25 0 -25 19t24 82q97 253 257 253q74 0 123.5 -51 t49.5 -126q0 -41 -39 -145q-103 -275 -103 -370q0 -217 228 -243l360 1442q11 45 29 45q25 0 25 -20q0 -5 -7 -33l-359 -1439q203 0 385 198t182 403q0 68 -51.5 155t-51.5 88q0 37 32 66.5t69 29.5q87 0 87 -146z" />
+<glyph unicode="&#x1d714;" horiz-adv-x="1379" d="M1379 813q0 -100 -40 -252q-60 -227 -159 -376q-138 -209 -323 -209q-173 0 -189 212q-135 -212 -307 -212q-209 0 -209 299q0 269 159 551q62 110 84 110t22 -23q0 -8 -17 -35q-188 -298 -188 -510q0 -101 37 -166q47 -82 140 -82q155 0 281 200q31 310 108 310 q38 0 38 -45q0 -79 -83 -274q11 -191 152 -191q158 0 282 167t124 331q0 68 -50 156t-50 89q0 37 31 66.5t69 29.5q88 0 88 -146z" />
+<glyph unicode="&#x1d715;" horiz-adv-x="1167" d="M1167 936q0 -145 -55 -329q-80 -266 -224 -437q-181 -215 -421 -215q-259 0 -350 230q-27 68 -27 134q0 238 187 427.5t415 189.5q108 0 177.5 -66.5t86.5 -175.5h2q56 216 56 360.5t-68 244.5q-78 116 -225 116q-196 0 -294 -161h5q38 0 65 -27t27 -65t-27 -65t-65 -27 t-65 27t-27 55.5t3 38.5q38 125 143.5 200t238.5 75q210 0 332 -164q110 -148 110 -366zM919 621q0 118 -56 194t-171 76q-185 0 -309 -182q-46 -68 -90.5 -223t-44.5 -251t59.5 -159.5t165.5 -63.5q151 0 267 138q90 108 143 277q36 116 36 194z" />
+<glyph unicode="&#x1d716;" horiz-adv-x="928" d="M928 894q0 -33 -32 -33q-17 0 -83.5 27t-102.5 27q-138 0 -240 -115q-83 -94 -128 -244h376q42 0 42 -29q0 -35 -71 -35h-363q-30 -129 -30 -225t49.5 -172t141.5 -76q93 0 282 95q21 1 21 -25q0 -22 -80 -58.5t-122.5 -45.5t-95.5 -9q-157 0 -248.5 113.5t-91.5 284 t90 312.5t254 222q104 51 214 51q218 0 218 -65z" />
+<glyph unicode="&#x1d717;" horiz-adv-x="1257" d="M1257 734q0 -23 -19 -23q-27 0 -100 19q-65 -253 -195 -466q-175 -288 -370 -288q-282 0 -282 244q0 77 30.5 203t30.5 193q0 99 -67.5 99t-100.5 -55t-36 -55q-25 0 -25 21q0 63 50.5 98t125.5 35t128 -56t53 -140q0 -35 -30 -159t-30 -211q0 -174 159 -174 q124 0 254 258q89 175 163 494q-349 113 -349 365q0 134 93 265t223.5 131t189.5 -159q40 -108 40 -262t-44 -338q108 -23 108 -39zM1073 1237q0 252 -116 252q-108 0 -184.5 -118t-76.5 -233q0 -218 313 -322q64 284 64 421z" />
+<glyph unicode="&#x1d718;" horiz-adv-x="981" d="M1007 912q0 -27 -11 -66q-49 -175 -267 -321q-22 -112 -22 -212q0 -200 94 -200q57 0 102.5 97t64.5 97t19 -20q-78 -311 -245 -311q-95 0 -95 185q0 141 49 343l-350 -236q-79 -292 -197 -292q-46 0 -46 56q0 14 7 41q52 204 275 350q22 105 22 201q0 198 -97 198 q-53 0 -102 -100t-67 -100t-18 24q0 8 2 16q71 297 244 297q98 0 98 -180q0 -139 -49 -333l347 233q84 280 190 280q52 0 52 -47z" />
+<glyph unicode="&#x1d719;" horiz-adv-x="1212" d="M1212 642q0 -253 -183.5 -459.5t-433.5 -206.5q-36 0 -69 5q-29 -178 -67 -370q-33 -53 -79 -53q-56 0 -56 54q0 36 40 160l74 223q-286 62 -286 360q0 219 146 479q58 104 91 104q23 0 23 -19q0 -4 -25 -37q-177 -231 -177 -465q0 -260 265 -311q41 140 113 356t114 294 q109 203 259 203q251 0 251 -317zM1157 598q0 244 -216 244q-116 0 -200 -125q-63 -95 -112 -269l-61 -250q-19 -75 -19 -94q0 -11 52 -11q155 0 293 81.5t200.5 207.5t62.5 216z" />
+<glyph unicode="&#x1d71a;" horiz-adv-x="1057" d="M1057 597q0 -228 -173 -424.5t-398 -196.5q-125 0 -212.5 75t-112.5 199q-46 -170 -46 -251q0 -165 130 -215l245 -44q125 -22 125 -126q0 -25 -6 -56h-34q-45 65 -195 65h-35q-23 -1 -35 -1q-131 0 -188 42q-85 61 -85 234q0 139 68.5 382t127.5 349q78 142 209.5 236 t281.5 94t241.5 -104.5t91.5 -257.5zM871 441q41 140 41 235.5t-49 167t-142 71.5q-182 0 -308 -224q-43 -77 -79 -210.5t-36 -226t48.5 -164t141.5 -71.5q260 0 383 422z" />
+<glyph unicode="&#x1d71b;" horiz-adv-x="1471" d="M1530 875q0 -71 -100 -71h-51q-4 -252 -138 -515q-160 -313 -384 -313q-173 0 -189 212q-135 -212 -307 -212q-209 0 -209 299q0 268 159 551q62 110 84 110t22 -23q0 -8 -17 -35q-188 -295 -188 -510q0 -101 37 -166q47 -82 140 -82q155 0 281 200q31 310 108 310 q38 0 38 -45q0 -80 -83 -274q11 -191 152 -191q206 0 318 252q84 189 91 432q-232 3 -460 61q-331 84 -331 240q0 112 129 176q103 51 228 51q441 0 511 -409h89q70 0 70 -48zM904 1264q-98 0 -173 -28q-105 -40 -105 -121q0 -113 286 -162q174 -30 381 -30 q-25 157 -128 249t-261 92z" />
+<glyph unicode="&#x1d71c;" horiz-adv-x="1470" d="M252 6l-158 -6q-27 0 -27 47.5t34 52.5q46 3 92 5q56 7 75 43l666 1208q20 36 52 36h80q31 0 36 -36l158 -1252q121 0 139.5 -6t18.5 -30.5t-9.5 -46t-23.5 -21.5l-264 6l-290 -6q-25 0 -25 41t14.5 50t52.5 9.5t101 7.5l-34 271h-441l-145 -261q44 -17 99 -17 q39 0 39 -41q0 -60 -31 -60zM927 480l-71 550l-302 -550h373z" />
+<glyph unicode="&#x1d71d;" horiz-adv-x="1312" d="M1340 1284q112 -71 112 -214t-109 -245q-97 -93 -245 -123q120 -15 195.5 -83t75.5 -173t-50 -198q-134 -248 -455 -248h-770q-27 0 -27 42.5t22 53.5q10 4 55 4.5t116 5.5l241 1132q-122 0 -146.5 4.5t-24.5 38.5q0 16 9.5 39t23.5 23h734q150 0 243 -59zM1168 1087 q0 155 -123 155h-271q-13 0 -23 -1l-99 -504h232q128 0 206 108t78 242zM1091 475q0 185 -135 185h-319l-111 -559l20 -1h265q133 0 212 126q68 108 68 249z" />
+<glyph unicode="&#x1d71e;" horiz-adv-x="1146" d="M379 6l-285 -6q-27 0 -27 43t24 53q10 4 55 4.5t114 5.5l241 1132q-130 0 -144 4q-27 8 -27 39q0 62 33 62h966q27 0 27 -34v-6l-34 -408q-2 -26 -34 -31q-4 -1 -53 -1q-27 0 -27 44l6 129q0 121 -54.5 163.5t-178.5 42.5h-158q-21 0 -41 -4l-241 -1134q25 -2 92 -2.5 t97 -1.5q27 -7 27 -40q0 -16 -10 -38t-24 -22z" />
+<glyph unicode="&#x1d71f;" horiz-adv-x="1124" d="M1010 0h-903q-37 0 -37 26q0 18 16 48l675 1282q19 36 89.5 36t74.5 -36l135 -1305q0 -4 1 -10q0 -41 -51 -41zM745 238l-77 752l-394 -752h471z" />
+<glyph unicode="&#x1d720;" horiz-adv-x="1251" d="M1256 907l7 114q0 135 -69 183q-55 38 -197 38h-167q-31 0 -48 -4l-106 -491h44q90 0 139.5 25.5t71.5 106.5q6 29 15 63.5t28 34.5h62q28 0 28 -35q0 -2 -105 -500q-5 -24 -52.5 -24t-54.5 11t-7 20t7.5 46.5t7.5 70.5q0 62 -79 77q-25 5 -125 5l-116 -546q20 -2 42 -2 h152q186 0 282 68t170 243l43 110q10 23 25 23h62q27 0 27 -35q0 -18 -178 -485q-9 -24 -25 -24h-1046q-27 0 -27 43t24 53q10 4 55 4.5t114 5.5l241 1132q-40 4 -144 4q-27 0 -27 39q0 62 33 62h1017q11 0 19.5 -14.5t7.5 -25.5l-35 -408q-2 -27 -35 -32h-54q-27 0 -27 44z " />
+<glyph unicode="&#x1d721;" horiz-adv-x="1087" d="M1313 1343q23 0 23 -32t-17 -54l-908 -1149h192q173 0 272.5 67.5t160.5 228.5q13 46 44 136q9 24 75 24q27 0 27 -35q0 -12 -62.5 -242.5t-71.5 -258.5t-26 -28h-926q-23 0 -23 34.5t18 57.5l909 1150h-180q-293 0 -397 -239q-12 -39 -39 -116q-9 -24 -76 -24 q-25 0 -25 35q0 11 49.5 203t57 217t25.5 25h898z" />
+<glyph unicode="&#x1d722;" horiz-adv-x="1493" d="M1428 1337l306 6q25 0 25 -43t-20 -53q-10 -5 -68.5 -5t-105.5 -6l-238 -1132q120 0 145.5 -4.5t25.5 -39.5q0 -16 -10 -38t-24 -22l-309 6l-276 -6q-26 0 -26 42t22 53q10 5 54 5.5t118 5.5l114 542h-505l-115 -544q121 0 146 -4.5t25 -39.5q0 -16 -9.5 -38t-24.5 -22 l-299 6l-285 -6q-27 0 -27 42t22 53q10 5 54 5.5t117 5.5l241 1132q-129 0 -144 4q-27 8 -27 39q0 62 48 62l284 -6l286 6q25 0 25 -43t-14.5 -50.5t-73 -7.5t-105.5 -6l-104 -489h506l104 491q-128 0 -143 4q-27 8 -27 39q0 62 33 62z" />
+<glyph unicode="&#x1d723;" horiz-adv-x="1390" d="M1512 865q0 -358 -219 -620q-233 -279 -581 -279q-236 0 -369 134t-133 370q0 358 224 632t575 274q236 0 369.5 -137t133.5 -374zM1178 582q60 217 60 371t-54 238q-64 99 -193 99q-309 0 -443 -511q-57 -216 -57 -371.5t50 -242.5q63 -108 191 -108q302 0 446 525z M661 860h10l34 -1q26 -1 26 -39q0 -3 -5 -28h329q8 50 19.5 58.5t65.5 8.5q27 0 27 -35l-66 -313q-5 -24 -75 -24q-26 0 -26 40q0 3 5 28h-331q-8 -52 -18 -60t-64 -8q-27 0 -27 35q0 5 65 314q4 20 31 24z" />
+<glyph unicode="&#x1d724;" horiz-adv-x="724" d="M668 1337l297 6q26 0 26 -43t-21 -53q-10 -5 -73 -5t-110 -6l-237 -1132q137 0 151 -4q27 -7 27 -40q0 -17 -9.5 -38.5t-24.5 -21.5l-306 6l-296 -6q-25 0 -25 42.5t23 53.5q10 4 56 4.5t123 5.5l241 1132q-51 0 -154 4q-26 3 -26 39q0 62 48 62z" />
+<glyph unicode="&#x1d725;" horiz-adv-x="1458" d="M1548 1337l125 6q25 0 25 -48t-33 -53q-16 0 -49 -1q-71 -4 -137 -46q-8 0 -463 -373l307 -708q9 -7 74 -11.5t65 -42.5q0 -60 -32 -60l-233 6l-292 -6q-25 0 -25 39q0 56 43 62q48 4 96 9l-226 528l-169 -137l-83 -397h17q47 0 127 -4q27 -4 27 -40q0 -16 -9.5 -38 t-24.5 -22l-299 6l-285 -6q-27 0 -27 42.5t22 53.5q10 4 55 4.5t116 5.5l241 1132q-48 0 -144 4q-27 3 -27 39q0 62 48 62l284 -6l286 6q25 0 25 -43.5t-20 -52.5q-10 -5 -69 -5t-104 -6l-128 -603l732 598q-35 11 -86 11q-27 0 -27 39q0 62 33 62z" />
+<glyph unicode="&#x1d726;" horiz-adv-x="1368" d="M236 6l-142 -6q-27 0 -27 48.5t34 51.5q41 3 82 7q50 9 66 41l637 1208q19 36 50 36h78q34 0 38 -36l128 -1252q18 0 85 -2q51 -2 51 -42q0 -60 -32 -60l-251 6l-293 -6q-27 0 -27 40.5t18 52.5q12 7 50.5 7.5t103.5 7.5l-92 882l-458 -872q24 -10 68.5 -14t45.5 -4 q27 -4 27 -40q0 -16 -10 -38t-24 -22z" />
+<glyph unicode="&#x1d727;" horiz-adv-x="1743" d="M287 6l-193 -6q-27 0 -27 47t34 53l91 4q69 5 73 25l236 1109q-40 4 -145 4q-26 0 -26 39q0 62 33 62h374q34 0 40 -36l177 -1046l617 1046q22 36 55 36h358q25 0 25 -42.5t-15 -50.5t-73.5 -8t-103.5 -6l-240 -1132q35 -4 145 -4q27 0 27 -40q0 -16 -10 -38t-24 -22 l-262 6l-253 -6q-26 0 -26 42t22 53q10 5 54 5.5t118 5.5l239 1136l-714 -1207q-21 -35 -58 -35t-43 35l-200 1182l-234 -1099q32 -13 82.5 -15t60.5 -3q27 -4 27 -40q0 -16 -10 -38t-24 -22z" />
+<glyph unicode="&#x1d728;" horiz-adv-x="1472" d="M1518 1337l195 6q25 0 25 -47.5t-31 -53.5q-46 -2 -104 -6t-62 -23l-252 -1189q-5 -24 -25 -24h-83q-14 0 -22 15l-577 1152l-224 -1049q30 -12 82 -14.5t61 -3.5q27 -4 27 -40q0 -16 -10 -38t-24 -22l-207 6l-193 -6q-27 0 -27 47t34 53l91 4q69 5 73 25l236 1111 q-130 0 -144 2q-27 4 -27 39q0 62 33 62h392q44 0 52 -16l466 -926l174 824q-29 12 -67.5 14t-73.5 3q-26 3 -26 39q0 62 42 62z" />
+<glyph unicode="&#x1d729;" horiz-adv-x="1229" d="M1306 992l14 110v13q-34 5 -122 5h-633q-100 0 -132 -7q-18 -24 -29 -63l-20 -73q-8 -24 -25 -24h-55q-26 0 -26 35q0 10 84 331q6 24 25 24h1053q10 0 19 -15t8 -25l-53 -318q-5 -27 -31 -32h-50q-27 0 -27 39zM463 905h10l37 -1q27 -1 27 -39q0 -3 -11 -57h567 q15 75 19 80q12 16 75 16q27 0 27 -35q0 -3 -75 -354q-5 -25 -41.5 -25t-43.5 2q-21 7 -21 39q0 4 14 56h-568q-16 -75 -21 -81q-12 -15 -76 -15q-27 0 -27 35q0 3 75 355q4 19 33 24zM247 372l-17 -132q0 -6 2 -11q44 -8 135 -8h620q109 0 149 10q20 29 32 79 q24 101 45 101h55q27 0 27 -36q0 -4 -88 -351q-6 -24 -25 -24h-1073q-27 0 -27 35v4l57 340q4 27 31 32h51q26 0 26 -39z" />
+<glyph unicode="&#x1d72a;" horiz-adv-x="1390" d="M1512 865q0 -358 -219 -620q-233 -279 -581 -279q-236 0 -369 134t-133 370q0 358 224 632t575 274q236 0 369.5 -137t133.5 -374zM1178 582q60 217 60 371t-54 238q-64 99 -193 99q-309 0 -443 -511q-57 -216 -57 -371.5t50 -242.5q63 -108 191 -108q302 0 446 525z" />
+<glyph unicode="&#x1d72b;" horiz-adv-x="1495" d="M379 6l-285 -6q-27 0 -27 43t23 53q9 4 54 4.5t116 5.5l241 1132h-17q-47 0 -127 4q-27 3 -27 39q0 62 33 62h1370q26 0 26 -43t-21 -53q-10 -5 -69 -5t-104 -6l-238 -1132h17q47 0 127 -4q27 -4 27 -40q0 -16 -10 -38t-24 -22l-299 6l-286 -6q-26 0 -26 42.5t23 53.5 q9 4 54 4.5t117 5.5l239 1136h-504l-241 -1138h17q47 0 127 -4q27 -4 27 -40q0 -16 -9.5 -38t-24.5 -22z" />
+<glyph unicode="&#x1d72c;" horiz-adv-x="1258" d="M379 6l-285 -6q-27 0 -27 47.5t34 52.5l61 1q33 0 98 5l241 1132q-20 2 -95.5 2t-75.5 41q0 17 10 39.5t23 22.5h703q162 0 262 -69q115 -80 115 -235q0 -105 -51 -199q-139 -257 -487 -257h-262l-102 -479q124 0 144 -4q27 -5 27 -40q0 -17 -9.5 -38.5t-24.5 -21.5z M1161 1105q0 137 -188 137h-181q-14 0 -24 -1l-112 -571h185q141 0 201 56.5t89.5 182.5t29.5 196z" />
+<glyph unicode="&#x1d72d;" horiz-adv-x="1390" d="M1512 865q0 -358 -219 -620q-233 -279 -581 -279q-236 0 -369 134t-133 370q0 358 224 632t575 274q236 0 369.5 -137t133.5 -374zM1217 747q21 119 21 239.5t-54 204.5q-64 99 -193 99q-313 0 -443 -511l-8 -32h677zM518 648q-27 -138 -27 -267t50 -216 q63 -108 191 -108q302 0 446 525q10 33 17 66h-677z" />
+<glyph unicode="&#x1d72e;" horiz-adv-x="1283" d="M1354 902l4 69q0 171 -114 231q-78 40 -263 40h-292q249 -518 249 -530t-10 -22l-565 -555h367q191 0 285 36q131 52 204 201q15 40 48 119q11 25 33 25q43 0 48 -1q23 -6 23 -39.5t-146 -451.5q-8 -24 -25 -24h-1099q-27 0 -27 35q0 18 10 28l564 555l-308 640 q-5 11 -5 25.5t10 37t24 22.5h1099q10 0 19 -14.5t8 -25.5l-34 -408q-2 -26 -31 -31q-3 -1 -49 -1q-27 0 -27 39z" />
+<glyph unicode="&#x1d72f;" horiz-adv-x="1338" d="M711 6l-360 -6q-26 0 -26 46t32 54q105 3 236 8l239 1132q-20 2 -103 2q-131 0 -198 -60.5t-110 -193.5q-9 -34 -31 -101q-9 -24 -25 -24h-51q-27 0 -27 35q0 20 124 421q7 24 25 24h1103q9 0 18 -15t7 -25l-50 -408q-4 -26 -30 -31q-3 -1 -47 -1q-27 0 -27 39 q0 4 7.5 66t7.5 105q0 118 -74 151q-42 18 -131.5 18t-106.5 -4l-240 -1132q91 0 217 -6q26 -5 26 -40q0 -60 -31 -60z" />
+<glyph unicode="&#x1d730;" horiz-adv-x="1438" d="M761 6l-329 -6q-27 0 -27 45.5t34 54.5q90 0 205 6l116 555q21 99 21 183q0 285 -180 285q-134 0 -166 -51l-16 -40q-12 -24 -32 -24h-35q-24 0 -24 29.5t33 95.5q105 212 308 212q162 0 241 -155q60 -120 62 -299q75 181 179 299q138 155 296 155q91 0 144.5 -67.5 t53.5 -168.5t-45 -101h-34q-21 0 -22 20q1 6 1 34q0 61 -143.5 61t-249.5 -178q-77 -131 -114 -306l-114 -541q25 -2 90 -2t98 -2q27 -5 27 -40q0 -17 -9.5 -38.5t-23.5 -21.5z" />
+<glyph unicode="&#x1d731;" horiz-adv-x="1333" d="M966 1337l322 6q25 0 25 -50t-32 -51h-18q-67 0 -187 -6l-43 -199q151 0 271 -76q138 -88 138 -231q0 -184 -196 -311q-173 -114 -368 -114l-42 -201q24 -2 89 -2t101 -2q26 -6 26 -40q0 -17 -9.5 -38.5t-23.5 -21.5l-335 6l-322 -6q-26 0 -26 46t33 54q94 0 206 6 l43 201q-145 0 -262 79q-132 89 -132 227q0 179 189 306q169 114 358 116l43 203q-50 4 -188 4q-26 0 -26 39q0 17 9 39.5t23 22.5zM1165 781q0 145 -153 174l-110 -565q263 45 263 391zM501 561q0 -140 138 -170l109 559q-247 -55 -247 -389z" />
+<glyph unicode="&#x1d732;" horiz-adv-x="1436" d="M1411 1337l184 6q25 0 25 -40.5t-13.5 -50.5t-44.5 -10q-151 0 -195 -51l-357 -416l267 -669q50 -1 136 -6q26 -4 26 -40q0 -60 -33 -60l-263 6l-295 -6q-25 0 -25 40.5t12.5 49.5t57.5 12t72 8l-179 448l-374 -440q31 -12 69.5 -14.5t43.5 -3.5q27 -4 27 -40 q0 -16 -10 -38t-24 -22l-242 6l-184 -6q-25 0 -25 47.5t31 52.5q153 0 211 44q5 1 12 7l427 503l-233 582q-42 5 -74 5t-62 1q-27 3 -27 39q0 17 10 39.5t24 22.5l263 -6l295 6q27 0 27 -41t-13.5 -50t-53.5 -11t-76 -8l145 -364l302 356q-44 17 -112 17q-27 0 -27 39 q0 62 33 62z" />
+<glyph unicode="&#x1d733;" horiz-adv-x="1504" d="M1074 1337l321 6q25 0 25 -49.5t-31 -51.5h-18q-68 0 -189 -6l-176 -839q219 69 298 421q56 249 177 249h195q27 0 27 -35.5t-29 -43.5q-9 -1 -28 -6q-56 -22 -96 -188q-53 -226 -192 -350q-57 -50 -172.5 -94.5t-198.5 -44.5l-43 -201q21 -2 87 -2t101 -2q27 -5 27 -40 q0 -17 -9.5 -38.5t-24.5 -21.5l-333 6l-322 -6q-27 0 -27 45t34 55q83 1 204 6l43 201q-159 22 -255 113.5t-96 246.5q0 42 13 123t13 130t-34 67.5t-34 40.5q0 39 28 39h197q94 0 94 -147q0 -51 -18 -151t-18 -151q0 -175 128 -222l179 842q-48 4 -167 4q-48 0 -48 39 q0 62 33 62z" />
+<glyph unicode="&#x1d734;" horiz-adv-x="1392" d="M1537 985q0 -146 -87 -292q-52 -88 -189.5 -246.5t-187.5 -242.5h81q110 0 126 13t49 95t49 82h51q27 0 27 -36q0 -4 -64.5 -166.5t-71 -177t-20.5 -14.5h-371q-27 0 -27 35q0 2 2 12q28 132 146.5 377.5t134.5 283.5q77 189 77 340q0 250 -255 250q-231 0 -349 -206 q-95 -167 -95 -417q0 -72 10.5 -217.5t10.5 -218.5q0 -239 -46 -239h-380q-28 0 -27 39l7 323q0 32 78 32q24 0 24 -49v-31q-1 -21 -1 -47.5t5 -52.5q39 -10 218 -10q-12 82 -96.5 278t-84.5 321.5t66 248.5q87 162 253 243t363 81h78q211 0 342 -88q154 -102 154 -303z" />
+<glyph unicode="&#x1d735;" horiz-adv-x="1804" d="M1804 1366q0 -10 -4 -18l-689 -1387q-19 -39 -57 -39t-57 39l-689 1387q-4 8 -4 18q0 25 32 25h1436q32 0 32 -25zM1651 1230h-1077l538 -1088z" />
+<glyph unicode="&#x1d736;" horiz-adv-x="1284" d="M1312 903q0 -3 -1 -8q-54 -298 -233 -550v-15q0 -271 54 -271q23 0 62.5 45t61.5 45q43 0 43 -30q0 -61 -69 -102t-140 -41t-137 46.5t-96 119.5q-198 -166 -325 -166q-175 0 -277.5 97.5t-102.5 271.5q0 240 156 427t392 187q174 0 278 -147q94 -131 94 -312 q45 74 143 381q11 34 19.5 44.5t43 10.5t34.5 -33zM695 873q-94 0 -180 -157q-64 -116 -90.5 -229t-26.5 -190q0 -236 157 -236q104 0 279 171q-11 180 -21 360q-30 281 -118 281z" />
+<glyph unicode="&#x1d737;" horiz-adv-x="1222" d="M1252 1207q0 -205 -134 -351q114 -98 114 -284q0 -243 -152 -426.5t-389.5 -183.5t-349.5 206l-121 -574q-5 -22 -60.5 -22t-55.5 36q0 14 15 81t75 359l193 907q52 223 178 367q149 171 358 171q135 0 232 -77.5t97 -208.5zM811 856h-39q-79 0 -87 -30q20 -13 86 -13 t108 33q-30 10 -68 10zM1026 1238q0 174 -145 174q-150 0 -258 -173q-77 -123 -127.5 -340t-78 -365.5t-27.5 -180.5q0 -124 68.5 -214.5t188.5 -90.5q162 0 261 216q79 174 79 359q0 81 -25 145q-80 -40 -182 -40q-187 0 -187 93q0 121 225 121q69 0 126 -15q82 181 82 311 z" />
+<glyph unicode="&#x1d738;" horiz-adv-x="1196" d="M817 -442q-47 0 -47 67v8q4 105 84 394q37 134 37 212q0 228 -47 327q-70 149 -272 149q-163 0 -213 -90q-10 -27 -30 -66q-18 -21 -65 -21t-47 32q0 5 2 12q42 158 133 258q108 119 257 119q169 0 269 -198q70 -138 97 -348q162 439 216 511q15 20 36 20q53 0 54 -32 l-81 -180q-64 -142 -164 -417q-23 -58 -57 -176q-3 -39 -11 -121.5t-40 -237.5q-47 -222 -111 -222z" />
+<glyph unicode="&#x1d739;" horiz-adv-x="1074" d="M1151 1345q0 -59 -39 -98.5t-98.5 -39.5t-99 39t-39.5 98.5t41 98.5q-48 10 -94 10q-191 0 -191 -93q0 -49 127 -176l154 -147q81 -82 123 -164.5t42 -198.5q0 -241 -118 -451q-140 -247 -363 -247q-193 0 -311 88q-133 98 -133 285q0 220 143.5 387.5t361.5 217.5 q-125 220 -125 354q0 239 292 239q124 0 211 -40q116 -53 116 -162zM772 247q51 145 51 288.5t-115 332.5q-209 -70 -293 -379q-34 -125 -34 -220q0 -207 222 -207q103 0 169 185z" />
+<glyph unicode="&#x1d73a;" horiz-adv-x="1034" d="M1095 817q0 -35 -21 -64.5t-54 -29.5t-68 16q-97 44 -244 44t-237 -30q-130 -44 -130 -137q0 -40 25 -72q109 51 272.5 51t163.5 -84q0 -113 -212 -113q-147 0 -232 45q-103 -75 -103 -173q0 -71 132 -110q95 -28 191 -28q200 0 300 71q8 6 32 31t49 25q45 0 45 -49 q0 -28 -47 -86q-120 -148 -414 -148q-156 0 -259 55q-130 70 -130 212t134 253q-44 51 -44 118.5t44 135.5q135 209 479 209q85 0 192 -34q136 -44 136 -108zM705 511q-30 10 -107 10t-152 -27q56 -22 174 -22q73 0 85 39z" />
+<glyph unicode="&#x1d73b;" horiz-adv-x="959" d="M1028 1224q0 -124 -219 -124q-73 0 -111 64q-151 -119 -253 -326t-102 -397q0 -230 190 -295l221 -76q67 -23 108.5 -86t41.5 -150t-70.5 -181t-166.5 -94q-65 0 -141 24q-99 31 -99 79q0 45 37 45h3q129 -62 177 -62q24 0 42.5 27.5t18.5 52.5q0 79 -148 131 q-103 36 -167.5 62.5t-106.5 60.5q-147 116 -147 363t155 506t375 403q-5 35 -5 78q0 173 66 173q51 0 51 -58q0 -26 -13.5 -75t-13.5 -75q58 21 102 21q175 0 175 -91zM899 1215q-18 14 -55 14t-76 -18q16 -25 53 -25q75 0 78 29z" />
+<glyph unicode="&#x1d73c;" horiz-adv-x="1176" d="M1177 711q0 -58 -10 -105l-198 -937q-9 -45 -52 -78t-85.5 -33t-75 28.5t-32.5 67.5q0 16 3 30l196 929q18 85 18 151q0 109 -66 109q-129 0 -245 -181q-24 -37 -32.5 -55t-37.5 -163q-23 -130 -80 -388q-12 -46 -52.5 -78t-86 -32t-76 29.5t-30.5 73.5q0 8 3 22l127 607 q12 57 12 92q0 73 -39 73q-63 0 -93 -112l-35 -146q-13 -21 -36 -21q-54 0 -54 31q0 94 76.5 214t163 120t159 -41t89.5 -118q132 159 291 159q278 0 278 -248z" />
+<glyph unicode="&#x1d73d;" horiz-adv-x="1061" d="M1137 1036q0 -335 -152 -659q-188 -401 -475 -401q-167 0 -253 153q-68 123 -68 305q0 333 153 658q189 401 476 401q167 0 252 -153q67 -122 67 -304zM902 1202q0 206 -90 206q-176 0 -300 -618h335q55 277 55 412zM425 266q0 -205 91 -205q180 0 301 619h-334 q-58 -293 -58 -414z" />
+<glyph unicode="&#x1d73e;" horiz-adv-x="840" d="M844 308q0 -4 -2 -10q-43 -125 -140 -223.5t-205 -98.5t-185 55.5t-77 150.5q0 22 6 51l128 615q9 44 50.5 78t87 34t75 -33t29.5 -79q0 -9 -1 -14l-127 -606q-11 -52 -11 -95q0 -73 39 -73q70 0 127.5 58.5t87.5 133.5q7 27 26 69q15 19 53.5 19t38.5 -32z" />
+<glyph unicode="&#x1d73f;" horiz-adv-x="1193" d="M669 196l9 96q0 129 -148 157l-78 -363q-9 -44 -51.5 -77t-88 -33t-74.5 32t-29 79q0 9 1 14l159 747q9 44 50.5 78t87 34t75 -33t29.5 -79q0 -9 -1 -14l-54 -260q65 35 182.5 146t168.5 148q104 74 197 74q41 0 66.5 -30.5t25.5 -81t-37.5 -99t-87.5 -48.5t-75 31 t-25 74q0 11 5 33q-76 -42 -192 -152t-149 -136q113 -5 201.5 -65t88.5 -166q0 -27 -9.5 -81.5t-9.5 -81.5q0 -78 41 -78q100 0 138 200q3 23 15 60q12 19 39 19q50 0 50 -32q0 -2 -2 -9q-87 -323 -262 -323q-102 0 -179 60.5t-77 159.5z" />
+<glyph unicode="&#x1d740;" horiz-adv-x="1203" d="M1244 -14h-198q-22 0 -47.5 17t-33.5 37l-199 535l-441 -546q-43 -53 -86.5 -53t-69 32.5t-25.5 72.5q0 63 47 107l532 503l-210 563q-32 86 -44 102q-27 39 -93 54q-32 7 -32 36q0 41 64 41q246 0 312 -69q21 -22 40 -73l438 -1174q12 -32 70 -157q1 -28 -24 -28z" />
+<glyph unicode="&#x1d741;" horiz-adv-x="1315" d="M1318 308q0 -95 -76.5 -213.5t-165.5 -118.5q-177 0 -235 123q-113 -123 -248 -123q-112 0 -181 30l-71 -337q-9 -44 -52 -77.5t-85 -33.5t-74.5 28.5t-32.5 67.5q0 16 3 30l248 1163q9 44 50.5 78t87 34t75 -33t29.5 -79q0 -9 -1 -14l-98 -457q-20 -93 -20 -153 q0 -162 132 -162q60 0 127.5 50t94.5 108q4 9 31 146.5t99 465.5q11 45 52.5 78t85.5 33t75 -31.5t31 -73.5q0 -13 -2 -22l-124 -587q-11 -52 -11 -95q0 -72 38 -72q76 0 115 196q3 26 13 64q10 19 50 19t40 -32z" />
+<glyph unicode="&#x1d742;" horiz-adv-x="1194" d="M1279 860q0 -124 -106 -301q-232 -388 -719 -546q-65 -21 -84 -21h-105q-16 0 -27 14q-10 10 -10 22q0 4 1 7l165 780q0 4 1 13q-6 0 -20 -0.5t-22 -0.5q-83 0 -83 48q0 65 37 67l318 17h4q33 0 33 -37q0 -1 -1 -5l-170 -801q273 114 439 440q22 43 59 133l46 158 q15 46 54 79t82.5 33t75.5 -29.5t32 -69.5z" />
+<glyph unicode="&#x1d743;" horiz-adv-x="936" d="M1003 1224q0 -124 -219 -124q-72 0 -111 64q-143 -141 -143 -355q0 -64 13 -103q82 29 150 29q187 0 187 -90q0 -124 -219 -124q-109 0 -192 42q-150 -130 -150 -273q0 -100 141 -157l370 -150q101 -41 101 -164q0 -93 -70 -176.5t-161 -83.5q-64 0 -166.5 29.5 t-102.5 74t39 44.5q3 0 16 -6q119 -56 199 -56q40 0 40 59q0 32 -36 47l-349 141q-96 39 -156 119t-60 188t66 225.5t164 196.5q-90 84 -90 225.5t111 262t261 173.5q0 6 -0.5 19.5t-0.5 20.5q0 180 64 180q42 0 42 -58q0 -26 -7.5 -73t-8.5 -66q45 10 93 10q185 0 185 -91z M873 1215q-18 14 -55.5 14t-76.5 -18q16 -25 51 -25q76 0 81 29zM753 635q-21 14 -64.5 14t-97.5 -18q31 -25 94 -25t68 29z" />
+<glyph unicode="&#x1d744;" horiz-adv-x="1062" d="M1139 584q0 -252 -169.5 -430t-420.5 -178q-180 0 -288.5 98t-108.5 276q0 253 170.5 431t422.5 178q179 0 286.5 -98.5t107.5 -276.5zM890 693q0 180 -152 180q-136 0 -216 -138q-51 -87 -85.5 -247.5t-34.5 -245.5q0 -181 153 -181q136 0 215 137q50 87 85 249.5 t35 245.5z" />
+<glyph unicode="&#x1d745;" horiz-adv-x="1292" d="M1363.5 896.5q20.5 -26.5 20.5 -67t-30.5 -80t-76.5 -39.5h-207q-9 -96 -9 -166q0 -148 89 -360q18 -42 18 -63q0 -54 -46 -100.5t-100 -46.5q-73 0 -112 122q-29 89 -29 184q0 171 54 430h-195l-100 -483q-28 -138 -40 -163q-38 -88 -128 -88q-41 0 -75.5 29t-34.5 64 t51 155l91 214q65 157 100 272h-96q-135 0 -190 -72q-10 -19 -40 -45q-8 -3 -20 -3q-54 0 -54 32q0 8 6 19q148 282 325 282h775q33 0 53.5 -26.5z" />
+<glyph unicode="&#x1d746;" horiz-adv-x="1130" d="M1144 602q0 -243 -148.5 -434.5t-384.5 -191.5q-116 0 -188 78l-83 -385q-10 -44 -52 -77.5t-84.5 -33.5t-75 28.5t-32.5 67.5q0 16 3 30l168 796q42 198 184.5 338.5t336.5 140.5q159 0 257.5 -99t98.5 -258zM894 720q0 153 -112 153q-122 0 -196 -158q-42 -87 -78 -264 l-59 -287q38 -103 148 -103q178 0 261 396q36 171 36 263z" />
+<glyph unicode="&#x1d747;" horiz-adv-x="892" d="M956 870q0 -68 -54 -68q-6 0 -67.5 35.5t-100.5 35.5q-144 0 -265 -89t-121 -227q0 -110 104 -171l287 -167q98 -57 98 -178q0 -98 -72 -185.5t-168 -87.5q-48 0 -104.5 16t-56.5 51q0 42 40 42q19 0 54 -11.5t54 -11.5q44 0 44 67q0 47 -41 71l-262 152 q-173 100 -173 308t177 357.5t402 149.5t225 -89z" />
+<glyph unicode="&#x1d748;" horiz-adv-x="1309" d="M1382.5 896.5q20.5 -26.5 20.5 -66.5t-30.5 -80t-76.5 -40h-178q30 -83 30 -168q0 -232 -182 -399t-417 -167q-176 0 -287 98.5t-111 271.5q0 249 166 413t416 164h596q33 0 53.5 -26.5zM892 616q0 174 -177 174q-152 0 -232.5 -186.5t-80.5 -353.5q0 -190 153 -190 q158 0 257 208q80 169 80 348z" />
+<glyph unicode="&#x1d749;" horiz-adv-x="1172" d="M1235.5 896.5q20.5 -26.5 20.5 -67t-30 -80t-76 -39.5h-335l-81 -606q-7 -51 -49 -89.5t-87.5 -38.5t-78.5 28t-33 60t7 56l172 590h-153q-135 0 -190 -72q-9 -14 -28 -38q-12 -10 -33 -10q-53 0 -53 32q0 6 7 19q147 282 324 282h643q33 0 53.5 -26.5z" />
+<glyph unicode="&#x1d74a;" horiz-adv-x="1064" d="M1079 766q0 -218 -121 -479q-144 -311 -330 -311q-343 0 -343 285q0 101 39 232l73 224q23 73 23 114.5t-23 41.5q-119 0 -168 -191q-4 -24 -19 -67q-11 -21 -36 -21q-54 0 -54 31q0 103 99.5 218.5t194.5 115.5t165.5 -53.5t70.5 -139.5q0 -26 -26 -107l-63 -197 q-40 -136 -40 -239q0 -162 131 -162q156 0 266 339q38 117 38 167.5t-72 112t-72 117.5t41 110t103 54t96 -69q27 -53 27 -126z" />
+<glyph unicode="&#x1d74b;" horiz-adv-x="1360" d="M1434 517q0 -251 -226 -406q-195 -133 -461 -144l-70 -326q-14 -64 -64 -64q-18 0 -37 14t-19 28t5 37l68 315q-200 19 -324 116q-144 113 -144 306q0 252 221 405q190 131 456 144l92 427q14 64 64 64q18 0 37 -14t19 -28t-5 -37l-89 -413q202 -17 330 -115 q147 -113 147 -309zM1187 567q0 267 -248 293l-174 -809q204 19 313 159t109 357zM409 341q0 -259 238 -290l174 807q-199 -23 -305.5 -162.5t-106.5 -354.5z" />
+<glyph unicode="&#x1d74c;" horiz-adv-x="1346" d="M1442 891q0 -21 -16 -40l-468 -547q65 -303 151.5 -481t131 -178t79 59t36.5 59h47q23 0 23 -30q0 -64 -73 -119t-140 -55q-127 0 -192 21q-98 30 -148 117q-68 119 -127 400l-427 -501q-15 -18 -38 -18q-41 0 -41 51q0 22 14 38l467 548q-62 299 -147.5 478.5 t-137.5 179.5q-61 0 -84 -71q-2 -11 -7 -29q-11 -19 -51 -19t-40 32q0 64 72 118.5t138 54.5q128 0 194 -20q99 -30 155.5 -126t120.5 -390l428 499q17 20 38 20q42 0 42 -51z" />
+<glyph unicode="&#x1d74d;" horiz-adv-x="1389" d="M1231.5 679.5q-72.5 61.5 -72.5 117.5t41 110t104.5 54t98 -63.5t34.5 -150t-36 -224.5q-57 -219 -215.5 -380.5t-369.5 -166.5l-72 -335q-14 -64 -64 -64q-18 0 -37 14t-19 28t5 37l69 322q-159 3 -275 82q-133 91 -133 241q0 86 38 211l69 205q23 72 23 114t-23 42 q-112 0 -165 -184q-6 -25 -22 -74q-8 -19 -20 -19h-47q-23 0 -23 29q0 103 99.5 218.5t194.5 115.5t165.5 -53.5t70.5 -139.5q0 -27 -24 -100l-59 -176q-37 -120 -37 -210q0 -180 188 -211l280 1300q14 64 64 64q18 0 37 -14t19 -28t-5 -37l-278 -1293q245 8 416 337 q53 102 53 170q0 50 -72.5 111.5z" />
+<glyph unicode="&#x1d74e;" horiz-adv-x="1354" d="M1112 909.5q51 51.5 121.5 51.5t106 -62t35.5 -158.5t-45 -244.5q-83 -273 -272 -426q-116 -94 -214 -94q-121 0 -189 143q-146 -143 -274 -143t-186 124q-43 93 -43 232q0 236 174 503q70 107 107 107q51 0 50 -51q-4 -3 -38 -61q-171 -293 -171 -405q0 -206 148 -206 q90 0 196 85q0 325 160 325q85 0 85 -96.5t-82 -244.5q51 -69 137 -69q116 0 211.5 103t95.5 220q0 64 -82 134.5t-82 115.5q0 66 51 117.5z" />
+<glyph unicode="&#x1d74f;" horiz-adv-x="1345" d="M1345 940q0 -129 -50 -305q-190 -670 -725 -670q-196 0 -305 80q-145 106 -145 277q0 249 188.5 429.5t460.5 180.5q218 0 274 -211q60 218 60 342q0 313 -303 313q-174 0 -280 -132q92 -24 92 -118q0 -50 -36 -86t-86 -36t-86 36t-36 79.5t34 106.5q125 230 408 230 q244 0 389.5 -137t145.5 -379zM998 606q0 252 -215 252q-182 0 -278 -141q-43 -63 -89 -233.5t-46 -254.5q0 -176 211 -176q182 0 295 164q44 64 83 188t39 201z" />
+<glyph unicode="&#x1d750;" horiz-adv-x="861" d="M922 912q0 -64 -50 -64h-116q-229 0 -302 -285h345q41 0 41 -55.5t-51 -55.5h-358q-19 -106 -19 -159q0 -231 221 -231q47 0 113 36l122 71q39 -4 39 -74q0 -44 -119 -81.5t-179 -37.5q-200 0 -327.5 105.5t-127.5 301.5q0 248 170.5 412t419.5 164h141q37 0 37 -47z" />
+<glyph unicode="&#x1d751;" horiz-adv-x="1209" d="M1333 730q0 -54 -35 -54q-20 0 -62 14q-58 -255 -186 -453q-167 -261 -377 -261q-348 0 -348 259q0 71 15 141l43 202q12 56 12 92q0 73 -39 73q-45 0 -71 -54q-15 -33 -30.5 -109t-27.5 -96t-35 -20q-54 0 -54 31q0 94 76.5 214t170.5 120t171 -56t77 -152q0 -15 -7 -49 l-42 -204q-22 -107 -22 -171.5t22.5 -100t93.5 -35.5q126 0 218 287q24 75 93 398q-337 110 -337 371q0 140 97 258t241.5 118t225.5 -152q65 -122 65 -288q0 -120 -29 -280q81 -1 81 -43zM1058 1208q0 200 -97 200t-156 -92.5t-59 -194.5q0 -191 262 -290q50 251 50 377z " />
+<glyph unicode="&#x1d752;" horiz-adv-x="1178" d="M1219 822q0 -184 -320 -341q-31 -139 -31 -197q0 -113 94 -113q59 0 117 80.5t71 80.5q29 0 29 -28q0 -4 -3 -14q-90 -314 -272 -314q-134 0 -134 195q0 106 34 245l-301 -186q-80 -252 -211 -252q-113 0 -113 122q0 205 316 357q35 144 35 187q0 117 -91 117 q-61 0 -118 -79.5t-66 -79.5q-27 0 -27 27q0 6 2 13q93 317 261 317q137 0 137 -209q0 -69 -34 -226l299 181q72 254 214 254q52 0 82 -41.5t30 -95.5z" />
+<glyph unicode="&#x1d753;" horiz-adv-x="1409" d="M1428 598q0 -252 -219.5 -433t-500.5 -181q-29 0 -49 2l-40 -280q-21 -144 -140 -144q-41 0 -68.5 24.5t-27.5 54.5t39.5 137t78.5 228q-182 37 -289 138t-107 241q0 80 48.5 226t138.5 251q33 39 74.5 39t41.5 -29q0 -9 -29 -40q-83 -93 -128.5 -226.5t-45.5 -191.5 q0 -188 361 -227q119 334 212 480q159 250 370 250q132 0 206 -91.5t74 -227.5zM1325 540q0 82 -60 132t-151 50q-172 0 -301 -168q-63 -84 -85 -158.5t-40 -217.5q272 0 430 82q207 106 207 280z" />
+<glyph unicode="&#x1d754;" horiz-adv-x="1062" d="M636 -390l-225 -12q-199 0 -252 23q-118 51 -118 225q0 137 75 434l44 175q56 220 211.5 362t373.5 142q179 0 286.5 -98.5t107.5 -276.5q0 -252 -169.5 -430t-422 -178t-350.5 179l-25 -100q-20 -81 -20 -123q0 -88 80 -120q37 -15 211 -15h148q114 0 161 -18 q70 -27 70 -104q0 -28 -9 -64q-13 -53 -57 -53q-6 0 -36.5 26t-83.5 26zM890 693q0 180 -152 180q-136 0 -216 -138q-51 -87 -85.5 -247.5t-34.5 -245.5q0 -181 153 -181q136 0 215 137q50 87 85 249.5t35 245.5z" />
+<glyph unicode="&#x1d755;" horiz-adv-x="1452" d="M1515.5 896.5q20.5 -26.5 20.5 -67t-30 -80t-76 -39.5h-57q-17 -232 -156 -463q-164 -271 -373 -271q-121 0 -189 143q-146 -143 -274 -143t-186 124q-43 93 -43 232q0 235 174 503q69 107 107 107q50 0 50 -51v1q-7 0 -105 -178q-104 -191 -104 -289q0 -206 148 -206 q90 0 196 85q0 325 160 325q85 0 85 -96.5t-82 -244.5q51 -69 137 -69q290 0 341 492q-324 7 -541 126q-161 90 -161 206t121.5 189.5t241.5 73.5q195 0 319 -97q121 -95 121 -277v-9h102q33 0 53.5 -26.5zM921 1248q-79 0 -145 -35q-81 -43 -81 -115q0 -90 250 -139 q162 -31 344 -36q-6 156 -107.5 240.5t-260.5 84.5z" />
+<glyph unicode="&#x1d756;" horiz-adv-x="1375" d="M1360 0h-325l-93 278h-520l-93 -278h-316l485 1343h377zM869 498l-187 558l-187 -558h374z" />
+<glyph unicode="&#x1d757;" horiz-adv-x="1349" d="M1185 1039q0 -195 -196 -284v-31q139 -28 212 -108t73 -211q0 -188 -142 -296.5t-405 -108.5h-571v1343h506q267 0 380 -58q143 -74 143 -246zM845.5 885q16.5 38 16.5 80.5t-19 80.5q-35 72 -166 75q-57 2 -159 2h-48v-323h70q188 0 238.5 23.5t67 61.5zM924 315 q22 42 22 104t-28 102q-48 71 -208 73l-240 1v-375h41l209 1q156 3 204 94z" />
+<glyph unicode="&#x1d758;" horiz-adv-x="1123" d="M1094 1109h-622v-1109h-316v1343h938v-234z" />
+<glyph unicode="&#x1d759;" horiz-adv-x="1428" d="M1405 0h-1382l502 1343h377zM1004 232l-295 821l-295 -821h590z" />
+<glyph unicode="&#x1d75a;" horiz-adv-x="1206" d="M1097 0h-941v1343h941v-234h-627v-269h582v-234h-582v-372h627v-234z" />
+<glyph unicode="&#x1d75b;" horiz-adv-x="1222" d="M1163 0h-1097v236l686 873h-653v234h1028v-241l-685 -868h721v-234z" />
+<glyph unicode="&#x1d75c;" horiz-adv-x="1486" d="M1329 0h-315v606h-542v-606h-316v1343h316v-503h542v503h315v-1343z" />
+<glyph unicode="&#x1d75d;" horiz-adv-x="1508" d="M1251 1183.5q180 -187.5 180 -511t-179.5 -512t-497 -188.5t-497 188.5t-179.5 512t179.5 511t496.5 187.5t497 -187.5zM998 1033q-93 110 -241.5 110t-249 -114.5t-100.5 -353.5t98 -357t250.5 -118t250 120t97.5 354t-105 359zM953 545h-397v253h397v-253z" />
+<glyph unicode="&#x1d75e;" horiz-adv-x="958" d="M851 0h-755v212h220v919h-220v212h755v-212h-220v-919h220v-212z" />
+<glyph unicode="&#x1d75f;" horiz-adv-x="1365" d="M472 0h-316v1343h316v-652l503 652h360l-511 -620l539 -723h-385l-409 560l-97 -121v-439z" />
+<glyph unicode="&#x1d760;" horiz-adv-x="1375" d="M1360 0h-328l-350 1027l-350 -1027h-318l492 1343h361z" />
+<glyph unicode="&#x1d761;" horiz-adv-x="1685" d="M1533 0h-313v982l-275 -659h-218l-275 659v-982h-296v1343h377l312 -713l312 713h376v-1343z" />
+<glyph unicode="&#x1d762;" horiz-adv-x="1502" d="M1347 0h-310l-594 984v-984h-287v1343h390l514 -826v826h287v-1343z" />
+<glyph unicode="&#x1d763;" horiz-adv-x="1264" d="M1151 1090h-1042v253h1042v-253zM1106 571h-952v252h952v-252zM1151 0h-1042v253h1042v-253z" />
+<glyph unicode="&#x1d764;" horiz-adv-x="1508" d="M1251 1183.5q180 -187.5 180 -511t-179.5 -512t-497 -188.5t-497 188.5t-179.5 512t179.5 511t496.5 187.5t497 -187.5zM998 1033q-93 110 -241.5 110t-249 -114.5t-100.5 -353.5t98 -357t250.5 -118t250 120t97.5 354t-105 359z" />
+<glyph unicode="&#x1d765;" horiz-adv-x="1486" d="M1329 0h-315v1109h-542v-1109h-316v1343h1173v-1343z" />
+<glyph unicode="&#x1d766;" horiz-adv-x="1296" d="M1234 925q0 -198 -117 -318q-157 -159 -414 -159h-231v-448h-316v1343h555q232 0 363 -88q160 -107 160 -330zM838.5 734q68.5 59 68.5 184.5t-112 171.5q-68 28 -248 28h-75v-443h114q184 0 252.5 59z" />
+<glyph unicode="&#x1d767;" horiz-adv-x="1508" d="M1251 1183.5q180 -187.5 180 -511t-179.5 -512t-497 -188.5t-497 188.5t-179.5 512t179.5 511t496.5 187.5t497 -187.5zM998 1033q-93 110 -241.5 110t-243.5 -108q-76 -87 -98 -245h680q-20 151 -97 243zM411 576q18 -166 105 -271t239.5 -105t239 107t103.5 269h-687z " />
+<glyph unicode="&#x1d768;" horiz-adv-x="1207" d="M1149 0h-1070v243l483 455l-467 407v238h1024v-234h-649l447 -385v-57l-468 -433h700v-234z" />
+<glyph unicode="&#x1d769;" horiz-adv-x="1204" d="M1176 1109h-419v-1109h-316v1109h-419v234h1154v-234z" />
+<glyph unicode="&#x1d76a;" horiz-adv-x="1280" d="M795 358v-358h-314v358q0 267 -96 484q-126 285 -363 294v233q125 -3 233 -57.5t222.5 -204t160.5 -303.5q47 154 161 303.5t222 204t233 57.5v-233q-237 -9 -363 -294q-96 -217 -96 -484z" />
+<glyph unicode="&#x1d76b;" horiz-adv-x="1693" d="M1629 682q0 -247 -166 -387q-81 -69 -190 -108t-267 -50v-150h-314v150q-451 32 -580 324q-43 96 -43 221q0 489 623 537v139h314v-139q459 -26 581 -314q42 -97 42 -223zM1240.5 449.5q61.5 86.5 61.5 231.5q0 302 -296 341v-690q173 31 234.5 117.5zM396 688 q0 -181 88 -266q66 -64 208 -90v691q-155 -24 -225.5 -107.5t-70.5 -227.5z" />
+<glyph unicode="&#x1d76c;" horiz-adv-x="1352" d="M1329 0h-363l-297 465l-304 -465h-344l465 677l-455 666h361l288 -441l296 441h345l-458 -652z" />
+<glyph unicode="&#x1d76d;" horiz-adv-x="1737" d="M1632 981q0 -276 -163 -460.5t-443 -227.5v-293h-310v293q-280 43 -443 227.5t-163 460.5v362h311v-362q0 -362 295 -442v804h310v-804q295 80 295 442v362h311v-362z" />
+<glyph unicode="&#x1d76e;" horiz-adv-x="1497" d="M1465 0h-615v362q126 86 176 170t50 239t-84 263.5t-243.5 108.5t-243.5 -108.5t-84 -263.5t50.5 -239t176.5 -170v-362h-615v234h427v24q-368 160 -368 541q0 249 180 410.5t476.5 161.5t476.5 -161.5t180 -410.5q0 -381 -368 -541v-24h428v-234z" />
+<glyph unicode="&#x1d76f;" horiz-adv-x="1428" d="M1405 1343l-503 -1343h-377l-502 1343h1382zM1004 1111h-590l295 -821z" />
+<glyph unicode="&#x1d770;" horiz-adv-x="1376" d="M1304 775q-221 -52 -221 -316.5t214 -327.5l-89 -192q-151 54 -239 183q-134 -151 -380.5 -151t-381.5 128t-135 362t135 362.5t383 128.5t382 -155q89 122 243 171zM822 461q0 149 -56.5 216.5t-188.5 67.5q-198 0 -198 -283.5t198 -283.5q132 0 188.5 67t56.5 216z" />
+<glyph unicode="&#x1d771;" horiz-adv-x="1295" d="M1221 400q0 -204 -153.5 -321t-364.5 -117q-142 0 -267 66v-468h-296v1386q0 195 144 307.5t331.5 112.5t313.5 -82q146 -96 146 -262q0 -135 -114 -240q120 -43 190 -148t70 -234zM917 404q0 209 -184 209q-78 0 -172 -32l-46 197h4q110 0 181 57q72 58 72 169 q0 61 -43.5 110t-104.5 49q-188 0 -188 -208v-733q98 -51 242 -51q239 0 239 233z" />
+<glyph unicode="&#x1d772;" horiz-adv-x="1505" d="M533 -442q-137 0 -137 135q0 84 87 237t87 233q0 138 -99 342q-112 232 -232 232q-37 0 -124 -43l-55 217q104 34 181 34q380 0 531 -549q171 265 424 527h299q-464 -510 -654 -869q-31 -58 -65 -173.5t-55 -163.5q-71 -159 -188 -159z" />
+<glyph unicode="&#x1d773;" horiz-adv-x="1155" d="M918 773q164 -139 164 -354t-141.5 -331.5t-360.5 -116.5t-355 99q-153 112 -153 322q0 306 316 404q-241 77 -241 257q0 133 125.5 221.5t355.5 88.5q148 0 388 -127v-233h-26q-220 163 -361 163q-180 0 -180 -76q0 -66 164 -144q228 -108 305 -173zM775 408 q0 205 -160 294q-111 -18 -173.5 -99.5t-62.5 -190t50.5 -171.5t150.5 -63q195 0 195 230z" />
+<glyph unicode="&#x1d774;" horiz-adv-x="985" d="M933 46q-198 -71 -390.5 -71t-307.5 50q-160 69 -160 230.5t193 222.5v6q-163 47 -163 198t164 218q118 49 282 49t347 -53v-220h-32q-135 66 -267 66q-186 0 -186 -88q0 -65 85 -81q24 -4 135 -4h103v-188h-139q-101 0 -135 -9q-78 -19 -78 -89q0 -101 218 -101 q165 0 299 86h32v-222z" />
+<glyph unicode="&#x1d775;" horiz-adv-x="1002" d="M1019 -61q0 -191 -158 -288q-130 -81 -334 -81q-33 0 -84 6v222q89 -15 135 -15q180 0 180 97.5t-150 97.5q-230 0 -353 52q-180 78 -180 276q0 379 408 791q-121 24 -273 105l59 220h36q121 -111 277 -111q90 0 194.5 29.5t161.5 81.5h38v-211q-601 -473 -601 -833 q0 -135 135 -161l275 -23q166 -27 217 -159q17 -44 17 -96z" />
+<glyph unicode="&#x1d776;" horiz-adv-x="1297" d="M1165 -440h-298v949q0 115 -18 153q-29 62 -127.5 62t-223.5 -84v-640h-296v679q0 50 -50 50q-14 0 -29 -2l-52 207q76 11 134 11q168 0 241 -108q161 112 340 112t279 -99.5t100 -271.5v-1018z" />
+<glyph unicode="&#x1d777;" horiz-adv-x="1331" d="M1278 609h-79q-14 -258 -131 -429q-143 -209 -402.5 -209t-402.5 209q-117 171 -131 429h-79v201h87q32 233 148 378q141 175 377.5 175t377.5 -175q116 -145 148 -378h87v-201zM884 810q-48 346 -220 346t-217 -346h437zM491 336q62 -158 175.5 -158t173.5 158 q43 112 52 273h-453q9 -162 52 -273z" />
+<glyph unicode="&#x1d778;" horiz-adv-x="757" d="M687 41q-75 -54 -202 -54t-202 48q-88 56 -88 171v502q0 28 -31 22l-53 204q80 11 134 11q106 0 176 -57.5t70 -160.5v-510q0 -27 35 -27t109 51z" />
+<glyph unicode="&#x1d779;" horiz-adv-x="1191" d="M491 0h-296v708q0 28 -31 22l-53 204q80 11 134 11q106 0 176 -57.5t70 -160.5v-206l339 402h351l-350 -416l343 -507h-344l-259 402l-80 -101v-301z" />
+<glyph unicode="&#x1d77a;" horiz-adv-x="1257" d="M1240 -2q-75 -11 -160 -11t-145.5 33.5t-96.5 122.5l-172 426l-316 -569h-300l490 883q-101 262 -182 262q-94 0 -204 -77l-56 221q142 77 270 77q167 0 274 -106q83 -80 153 -254l318 -786q8 -20 23 -20t52 5z" />
+<glyph unicode="&#x1d77b;" horiz-adv-x="1372" d="M1302 41q-76 -54 -215.5 -54t-215.5 69q-108 -100 -250 -100q-102 0 -185 54v-97q0 -103 31.5 -175.5t104.5 -159.5v-20h-334q-98 151 -98 355v1010h296v-675q73 -67 190 -67t184 71v671h296v-706q0 -27 33.5 -27t110.5 51z" />
+<glyph unicode="&#x1d77c;" horiz-adv-x="1202" d="M1130 798q0 -199 -140 -429q-74 -122 -276 -369h-274l-233 692q-12 34 -24 41q-13 6 -60 0l-52 201q77 11 129 11q211 0 280 -206l146 -433q218 284 218 473q0 95 -47 118v26h266q67 -55 67 -125z" />
+<glyph unicode="&#x1d77d;" horiz-adv-x="978" d="M985 -50q0 -191 -158 -288q-131 -81 -334 -81q-37 0 -84 6v222q85 -15 135 -15q180 0 180 98q0 89 -135 97q-241 14 -350 67q-168 82 -168 288q0 131 79 231t206 131v9q-93 21 -156 97.5t-63 171.5q0 183 138 287q124 95 298.5 95t356.5 -53v-220h-32q-135 66 -267 66 q-80 0 -133 -39.5t-53 -124.5t77.5 -137.5t174.5 -52.5h177v-213h-263q-89 0 -160.5 -57.5t-71.5 -148.5t71 -132q51 -29 209.5 -45.5t222.5 -52.5q103 -59 103 -206z" />
+<glyph unicode="&#x1d77e;" horiz-adv-x="1155" d="M1083 461q0 -234 -135.5 -362t-370.5 -128t-370 128.5t-135 361.5t135.5 362t370.5 129t370 -128.5t135 -362.5zM671 197q105 54 105 260q0 229 -119 274q-37 14 -80 14q-90 0 -144 -62.5t-54 -219t52.5 -221t148.5 -64.5q53 0 91 19z" />
+<glyph unicode="&#x1d77f;" horiz-adv-x="1416" d="M1416 722h-231v-505q0 -27 35 -27t109 51l52 -200q-75 -54 -202 -54t-202 48q-88 56 -88 171v516h-268v-722h-296v722h-86q-84 0 -157 -95h-29v205q95 91 230 91h1133v-201z" />
+<glyph unicode="&#x1d780;" horiz-adv-x="1225" d="M140 461q0 233 135.5 362t370 129t370 -128.5t135.5 -358.5t-127.5 -361.5t-352.5 -131.5q-112 0 -235 65v-477h-296v901zM671 180q173 0 173 282.5t-199 282.5q-209 0 -209 -286v-228q99 -51 235 -51z" />
+<glyph unicode="&#x1d781;" horiz-adv-x="946" d="M942 -50q0 -191 -158 -288q-130 -81 -334 -81q-36 0 -84 6v222q87 -15 135 -15q180 0 180 98q0 91 -131.5 96.5t-200.5 28.5q-139 46 -208 166t-69 275q0 232 147 361t383 129q166 0 315 -71v-247h-38q-121 111 -267 111q-113 0 -173 -66.5t-60 -180.5q0 -194 125 -257 q43 -22 174 -45.5t184 -60.5q80 -57 80 -181z" />
+<glyph unicode="&#x1d782;" horiz-adv-x="1281" d="M1273 722h-279q89 -142 89 -261q0 -234 -135 -362t-370 -128t-370.5 128t-135.5 361.5t136 362.5t370 129q73 0 137.5 -14.5t71.5 -14.5h486v-201zM580 178q197 0 197 283.5t-199 283.5t-199 -283.5t201 -283.5z" />
+<glyph unicode="&#x1d783;" horiz-adv-x="1040" d="M1032 722h-331v-505q0 -27 35 -27t109 51l52 -200q-75 -54 -202 -54t-202 48q-88 56 -88 171v516h-166q-84 0 -157 -95h-29v205q95 91 230 91h749v-201z" />
+<glyph unicode="&#x1d784;" horiz-adv-x="1468" d="M1273 708v-199q0 -245 -142 -391.5t-397 -146.5t-397 146.5t-142 391.5v199q0 28 -31 22l-53 204q80 11 134 11q106 0 176 -57.5t70 -160.5v-205q0 -344 243 -344t243 344v205q0 103 70 160.5t176 57.5q54 0 134 -11l-53 -204q-31 6 -31 -22z" />
+<glyph unicode="&#x1d785;" horiz-adv-x="1655" d="M1583 457q0 -258 -274 -395q-137 -69 -332 -88v-414h-298v416q-252 28 -410 131q-197 129 -197 350t197 350q158 104 410 132v124h298v-124q252 -28 409 -131q197 -129 197 -351zM1277 456q0 220 -300 273v-543q300 53 300 270zM379 456q0 -217 300 -270v543 q-300 -53 -300 -273z" />
+<glyph unicode="&#x1d786;" horiz-adv-x="1225" d="M1077 -227q11 0 34 3l52 -207q-75 -11 -144 -11q-111 0 -193 73q-62 55 -121 168l-94 191l-259 -430h-301l414 687l-182 325q-29 52 -93 151q-8 11 -18 11t-49 -7l-52 207q75 11 133.5 11t130 -27.5t100.5 -78.5l189 -329l249 414h301l-404 -670l263 -458q13 -23 44 -23z " />
+<glyph unicode="&#x1d787;" horiz-adv-x="1708" d="M1578 694q0 -645 -576 -715v-419h-296v419q-576 70 -576 715v229h297v-226q0 -205 47 -317q65 -153 232 -195v878h296v-878q167 42 232 195q47 112 47 317v226h297v-229z" />
+<glyph unicode="&#x1d788;" horiz-adv-x="1545" d="M1470 412q0 -141 -63 -259q-96 -180 -339 -180q-183 0 -291 132h-10q-108 -132 -296 -132t-292 121.5t-104 317.5q0 271 215 511h317v-19q-232 -199 -232 -486q0 -239 144 -239q43 0 84 30t41 71v329h256v-329q0 -42 41 -71.5t85 -29.5q144 0 144 239q0 285 -232 486v19 h317q215 -230 215 -511z" />
+<glyph unicode="&#x1d789;" horiz-adv-x="1178" d="M1099 725q0 -161 -47 -313q-137 -441 -539 -441q-190 0 -315.5 108.5t-125.5 299t116.5 325t307.5 134.5q162 0 292 -111v31q1 21 1 31q0 290 -264 290q-113 0 -289 -90h-16v236q176 75 372 75q276 0 398 -153q109 -138 109 -422zM778 557q-85 75 -185 75t-152 -72.5 t-52 -183.5q0 -198 163 -198q189 0 226 379z" />
+<glyph unicode="&#x1d78a;" horiz-adv-x="1019" d="M615 170q170 0 285 107h40v-234q-150 -68 -318 -68q-249 0 -399.5 122t-150.5 365t165 374q142 112 377 112q176 0 326 -69v-235h-40q-128 109 -290 109q-208 0 -245 -183h417v-189h-424q23 -211 257 -211z" />
+<glyph unicode="&#x1d78b;" horiz-adv-x="1186" d="M1178 567h-177q-11 -230 -126 -397q-134 -195 -350 -195q-307 0 -381 284q-7 24 -19.5 27.5t-58.5 -2.5l-52 207q75 11 114 11q190 0 258 -209q39 -119 140.5 -119t146.5 154q29 99 30 239q-49 -1 -92 -1q-284 0 -381 75q-129 100 -129 276t138.5 313t315.5 137 q204 0 322 -196q88 -145 119 -381h182v-223zM525 1165q-79 0 -130 -80t-51 -164q0 -131 189 -131h177q-10 375 -185 375z" />
+<glyph unicode="&#x1d78c;" horiz-adv-x="1243" d="M939 536v-151q0 -170 138 -170q34 0 107 7v-211q-98 -33 -180 -33q-303 0 -315 393q-55 -36 -132 -92q-46 -188 -322 -306l-170 77q68 212 245 341q4 37 4 74q0 156 -32.5 202.5t-115.5 46.5q-19 0 -92 -13v223q119 26 178 26q302 0 309 -391q67 43 142 76 q58 222 332 319l158 -84q-78 -207 -254 -334z" />
+<glyph unicode="&#x1d78d;" horiz-adv-x="1539" d="M1308 832q159 -125 159 -354t-166 -361q-147 -118 -387 -133v-426h-294v429q-230 17 -377 127q-171 128 -171 337t121 351.5t319 142.5q46 0 96 -11l-52 -201q-11 2 -27 2q-79 0 -119 -84q-31 -64 -31 -153q0 -271 241 -312v458q0 131 89.5 216t220.5 85q234 0 378 -113z M1162 487q0 101 -54 181t-151 80q-43 0 -43 -95v-471q248 30 248 305z" />
+<glyph unicode="&#x1d78e;" horiz-adv-x="1225" d="M140 461q0 233 135.5 362t370 129t370 -128.5t135.5 -358.5t-127.5 -361.5t-352.5 -131.5q-112 0 -235 65v-13q0 -265 260 -265q127 0 272 57h36v-211q-162 -39 -351 -39q-513 0 -513 473v422zM671 180q173 0 173 282.5t-199 282.5q-209 0 -209 -286v-228q99 -51 235 -51 z" />
+<glyph unicode="&#x1d78f;" horiz-adv-x="1703" d="M1668 722h-190q71 -142 71 -296.5t-63 -272.5q-97 -180 -339 -180q-183 0 -291 132h-10q-108 -132 -296 -132t-292 121.5t-104 303.5t73 324h-192v201h1633v-201zM1249 418q0 164 -80 304h-635q-80 -141 -80 -304q0 -239 144 -239q43 0 84 30t41 71v229h256v-229 q0 -42 41 -71.5t85 -29.5q144 0 144 239z" />
+<glyph unicode="&#x1d790;" horiz-adv-x="1400" d="M1267 0h-317l-30 281h-517l-158 -281h-326l794 1343h379zM899 495l-59 560l-316 -560h375z" />
+<glyph unicode="&#x1d791;" horiz-adv-x="1373" d="M611 0h-562l310 1343h477q192 0 314 -54q168 -74 168 -239q0 -121 -65 -200q-64 -77 -206 -120l-8 -31q119 -36 171.5 -93t52.5 -161q-2 -242 -218 -356q-169 -89 -434 -89zM791 1123h-168l-75 -323h177q119 0 188 48.5t69 142.5q1 71 -51.5 101.5t-139.5 30.5zM694 595 h-193l-87 -375h194q332 0 333 216q0 84 -61 121.5t-186 37.5z" />
+<glyph unicode="&#x1d792;" horiz-adv-x="1144" d="M1296 1343l-55 -234h-620l-256 -1109h-316l310 1343h937z" />
+<glyph unicode="&#x1d793;" horiz-adv-x="1454" d="M1302 0h-1381l812 1343h377zM965 226l-107 829l-488 -829h595z" />
+<glyph unicode="&#x1d794;" horiz-adv-x="1228" d="M1300 1343l-52 -229h-627l-65 -277h582l-54 -230h-581l-88 -378h627l-52 -229h-941l310 1343h941z" />
+<glyph unicode="&#x1d795;" horiz-adv-x="1244" d="M1328 1343l-54 -233l-915 -880h749l-54 -230h-1096l53 229l917 884h-680l52 230h1028z" />
+<glyph unicode="&#x1d796;" horiz-adv-x="1513" d="M1533 1343l-310 -1343h-317l141 607h-542l-140 -607h-316l310 1343h316l-117 -506h541l118 506h316z" />
+<glyph unicode="&#x1d797;" horiz-adv-x="1536" d="M936 1371q258 0 413.5 -135t155.5 -391.5t-128.5 -478t-356.5 -325.5q-152 -69 -351 -69q-262 0 -415 135.5t-153 393.5q0 368 234.5 619t600.5 251zM1171 822q0 144 -65 230q-72 97 -217.5 97t-254 -103.5t-154.5 -239t-46 -278.5q0 -334 281 -334q150 0 259 108 q197 192 197 520zM1031 800l-58 -256h-397l58 256h397z" />
+<glyph unicode="&#x1d798;" horiz-adv-x="975" d="M1054 1343l-49 -212h-219l-212 -919h219l-49 -212h-755l49 212h219l212 919h-219l49 212h755z" />
+<glyph unicode="&#x1d799;" horiz-adv-x="1390" d="M1535 1343l-661 -621l398 -722h-346l-304 566l-159 -141l-98 -425h-316l309 1343h316l-147 -639l643 639h365z" />
+<glyph unicode="&#x1d79a;" horiz-adv-x="1400" d="M1267 0h-318l-113 1030l-591 -1030h-325l804 1343h360z" />
+<glyph unicode="&#x1d79b;" horiz-adv-x="1716" d="M1737 1343l-310 -1343h-315l223 966l-415 -643h-218l-127 674l-230 -997h-296l310 1343h373l148 -713l476 713h381z" />
+<glyph unicode="&#x1d79c;" horiz-adv-x="1530" d="M1550 1343l-310 -1343h-272l-404 987l-228 -987h-287l310 1343h365l348 -831l191 831h287z" />
+<glyph unicode="&#x1d79d;" horiz-adv-x="1287" d="M1353 1343l-57 -249h-1041l56 249h1042zM1187 821l-57 -249h-951l56 249h952zM1101 249l-58 -249h-1041l57 249h1042z" />
+<glyph unicode="&#x1d79e;" horiz-adv-x="1536" d="M669 -28q-270 0 -420 141q-148 139 -148 382v6q1 365 231.5 617.5t603.5 252.5q270 0 420 -141q149 -141 149 -380q-1 -363 -218 -609q-236 -269 -618 -269zM891 1149q-180 0 -317 -170q-140 -172 -140 -455q0 -161 74 -245q75 -85 207 -85q189 0 322 178t134 451 q0 150 -72 237q-73 89 -208 89z" />
+<glyph unicode="&#x1d79f;" horiz-adv-x="1513" d="M1533 1343l-310 -1343h-317l257 1113h-541l-257 -1113h-316l310 1343h1174z" />
+<glyph unicode="&#x1d7a0;" horiz-adv-x="1320" d="M612 448h-144l-103 -448h-316l310 1343h470q266 0 390 -80q136 -86 136 -282q-1 -278 -246 -419q-198 -114 -497 -114zM1016 944q0 174 -240 174h-153l-102 -443h144q163 0 256.5 69.5t94.5 199.5z" />
+<glyph unicode="&#x1d7a1;" horiz-adv-x="1536" d="M669 -28q-270 0 -420 141q-148 139 -148 382v6q1 365 231.5 617.5t603.5 252.5q270 0 420 -141q149 -141 149 -380q-1 -363 -218 -609q-236 -269 -618 -269zM891 1149q-180 0 -313 -164q-63 -78 -101 -188h694v22v8q0 140 -69 229q-70 93 -211 93zM715 194q189 0 320 175 q72 97 106 218h-705q-2 -29 -2 -63q0 -161 74 -245q75 -85 207 -85z" />
+<glyph unicode="&#x1d7a2;" horiz-adv-x="1229" d="M1320 1343l-53 -229h-654l363 -388l-14 -60l-580 -437h711l-52 -229h-1070l54 235l597 461l-380 412l55 235h1023z" />
+<glyph unicode="&#x1d7a3;" horiz-adv-x="1226" d="M1380 1343l-54 -234h-419l-255 -1109h-317l256 1109h-418l53 234h1154z" />
+<glyph unicode="&#x1d7a4;" horiz-adv-x="1304" d="M484 651q0 470 -311 485l54 233q125 -2 220.5 -56.5t174.5 -204t90 -305.5q82 154 231.5 303.5t269.5 203.5t245 59l-54 -233q-239 -7 -430 -290q-146 -217 -208 -484l-84 -362h-313l82 354q33 146 33 297z" />
+<glyph unicode="&#x1d7a5;" horiz-adv-x="1724" d="M1489 326q-202 -167 -560 -188l-35 -151h-312l35 152q-377 34 -481 264q-33 74 -33 164v5q0 144 53 259q106 233 390 329q141 47 320 58l32 140h313l-33 -141q250 -23 383 -133q132 -108 132 -297q-1 -292 -204 -461zM1364 760q0 119 -64 188q-51 54 -165 78l-162 -696 q200 24 295 137t96 293zM822 1026q-201 -24 -295 -138q-95 -116 -95 -296q0 -99 49 -168q50 -69 180 -93z" />
+<glyph unicode="&#x1d7a6;" horiz-adv-x="1377" d="M1522 1343l-619 -666l320 -677h-343l-204 470l-420 -470h-340l632 690l-315 653h342l201 -445l405 445h341z" />
+<glyph unicode="&#x1d7a7;" horiz-adv-x="1737" d="M207 803q0 82 22 178l83 362h311l-83 -362q-18 -79 -18 -142q0 -239 210 -300l186 804h310l-185 -804q312 80 396 442l84 362h311l-84 -362q-65 -279 -271 -462.5t-493 -225.5l-68 -293h-310l67 293q-215 34 -341.5 165.5t-126.5 344.5z" />
+<glyph unicode="&#x1d7a8;" horiz-adv-x="1524" d="M1498 934q0 -60 -17 -135q-87 -381 -492 -541l-6 -24h428l-55 -234h-614l83 362q142 84 214 168.5t105 231.5q15 67 15 121q0 123 -66 191.5t-189 68.5q-192 0 -312.5 -158t-120.5 -357q0 -144 152 -266l-84 -362h-614l54 234h427l6 24q-262 127 -262 388q0 345 294 564 q217 161 513 161t438 -161q103 -117 103 -276z" />
+<glyph unicode="&#x1d7a9;" horiz-adv-x="1454" d="M1594 1343l-813 -1343h-376l-192 1343h1381zM1141 1111h-590l106 -822z" />
+<glyph unicode="&#x1d7aa;" horiz-adv-x="1376" d="M1072 353q0 -175 151 -222l-134 -192q-139 54 -197 183q-169 -151 -426 -151q-184 0 -290 80q-120 90 -120 267q0 65 18 143q53 231 217 361t413 130t347 -155q118 122 283 171l44 -193q-142 -31 -224 -151t-82 -271zM840 580q0 165 -197 165t-263 -286q-17 -74 -17 -128 q0 -153 150 -153q138 0 208 70.5t103 212.5q16 69 16 119z" />
+<glyph unicode="&#x1d7ab;" horiz-adv-x="1295" d="M1217 498q0 -235 -202 -391q-187 -145 -428 -145q-141 0 -251 66l-108 -468h-296l320 1386q44 192 212 306t372 114q147 0 251 -61q126 -74 126 -210q0 -178 -178 -313q182 -70 182 -284zM828.5 258.5q84.5 87.5 84.5 221t-145 133.5q-79 0 -180 -32v197h4q112 0 196 58 q84 59 109 168q4 17 4 35q0 52 -32 88t-83 36q-188 0 -236 -208l-170 -733q87 -51 225.5 -51t223 87.5z" />
+<glyph unicode="&#x1d7ac;" horiz-adv-x="1505" d="M598 -283q-108 -159 -222 -159t-114 93.5t135.5 263t152.5 248.5q9 41 9 106q0 142 -42 278q-58 190 -166 190q-38 0 -134 -43l-5 217q111 34 189 34q380 0 404 -549q231 265 546 527h299q-591 -518 -855 -869q-42 -56 -103 -172.5t-94 -164.5z" />
+<glyph unicode="&#x1d7ad;" horiz-adv-x="1155" d="M744 1166q-199 0 -199 -93q0 -56 128 -125q184 -98 238 -145q128 -111 128 -270q0 -52 -14 -113q-49 -213 -216 -331t-391 -118q-176 0 -287 67q-135 82 -135 257.5t118.5 311t303.5 189.5q-188 65 -188 210q0 22 6 47q48 199 301 277q107 33 253.5 33t356.5 -127 l-53 -233h-26q-181 163 -324 163zM467 178q123 0 191.5 98t68.5 228.5t-104 197.5q-132 -21 -222.5 -129.5t-90.5 -242.5q0 -152 157 -152z" />
+<glyph unicode="&#x1d7ae;" horiz-adv-x="985" d="M664 742q-209 0 -209 -107q0 -52 82 -64q16 -2 121 -2h103l-44 -188h-178q-198 0 -198 -116q0 -83 196 -83q165 0 319 86h32l-51 -222q-214 -71 -419 -71q-399 0 -399 214.5t253 288.5l1 6q-122 37 -122 156q0 164 187 247q142 62 315.5 62t344.5 -53l-51 -220h-32 q-120 66 -251 66z" />
+<glyph unicode="&#x1d7af;" horiz-adv-x="1002" d="M341 326q0 -98 139 -113t274 -28q144 -37 144 -183q0 -28 -8 -63q-43 -188 -218 -285q-150 -84 -359 -84q-35 0 -82 6l51 222q83 -15 131 -15q206 0 206 122q0 73 -131 73q-467 0 -467 247q0 36 10 81q85 377 591 791q-116 25 -249 105l110 220h36q95 -111 251 -111 q94 0 204 30.5t178 80.5h38l-49 -211q-705 -469 -793 -833q-7 -29 -7 -52z" />
+<glyph unicode="&#x1d7b0;" horiz-adv-x="1297" d="M1253 685q0 -51 -13 -107l-235 -1018h-298l219 949q21 91 21 122q0 93 -121 93q-95 0 -239 -84l-148 -640h-296l157 679q2 9 2 19q0 31 -46 31q-11 0 -24 -2l-4 207q78 11 136 11q168 0 216 -108q187 112 372 112q136 0 218.5 -66t82.5 -198z" />
+<glyph unicode="&#x1d7b1;" horiz-adv-x="1331" d="M504 -29q-204 0 -308 133q-93 119 -93 329q0 86 16 176h-79l46 201h87q87 239 242 384q179 169 411 169q205 0 303.5 -126t98.5 -336q0 -49 -4 -91h87l-46 -201h-79q-76 -267 -239 -438q-190 -200 -443 -200zM922 906q0 250 -144 250q-174 0 -298 -346h437q5 50 5 96z M409 426q0 -248 145 -248q115 0 213 164q67 111 112 267h-453q-17 -97 -17 -183z" />
+<glyph unicode="&#x1d7b2;" horiz-adv-x="757" d="M368 -13q-240 0 -240 164q0 25 7 55l116 502q1 4 1 8q0 19 -27 14l-6 204q82 11 152 11t128.5 -40.5t58.5 -122.5q0 -24 -7 -55l-117 -510q-1 -5 -1 -7q0 -20 31.5 -20t118.5 51l6 -200q-87 -54 -221 -54z" />
+<glyph unicode="&#x1d7b3;" horiz-adv-x="1191" d="M250 716q0 19 -27 14l-5 204q82 11 152 11t128.5 -41t58.5 -123q0 -24 -7 -54l-48 -206l432 402h351l-446 -416l226 -507h-344l-166 402l-104 -101l-69 -301h-296q164 712 164 716z" />
+<glyph unicode="&#x1d7b4;" horiz-adv-x="1257" d="M1083 -2q-79 -11 -162 -11t-136.5 32.5t-69.5 123.5l-74 426l-447 -569h-300l694 883q-40 262 -122 262q-94 0 -222 -77l-5 221q160 77 288 77q165 0 247 -102q66 -82 97 -258l137 -786q3 -20 22 -20q15 0 49 5z" />
+<glyph unicode="&#x1d7b5;" horiz-adv-x="1372" d="M1100 211q0 -21 30 -21t120 51l6 -200q-88 -54 -228 -54t-200 69q-131 -100 -273 -100q-102 0 -172 54q-37 -160 -37 -211q0 -100 73 -221l-5 -20h-334q-37 88 -37 176t21 179l234 1010h296l-156 -675q58 -67 174.5 -67t200.5 71l155 671h296z" />
+<glyph unicode="&#x1d7b6;" horiz-adv-x="1202" d="M1209 829q0 -14 -4 -31q-49 -203 -244 -435q-98 -117 -356 -363h-274l-73 692q-5 44 -35 44q-17 0 -40 -3l-5 201q80 11 131 11q211 0 233 -206l46 -433q334 334 334 527q0 48 -27 64l6 26h266q42 -42 42 -94z" />
+<glyph unicode="&#x1d7b7;" horiz-adv-x="978" d="M790 1159q-92 0 -160 -53.5t-68 -137t71 -126.5q59 -37 141 -37h177l-49 -213h-263q-106 0 -195.5 -74t-89.5 -177q0 -80 87 -104q43 -12 173.5 -15t171.5 -28q89 -54 89 -170q0 -29 -8 -64q-42 -181 -222 -288q-160 -95 -359 -95q-35 0 -82 6l52 225q78 -14 132 -14 q205 0 205 124q0 84 -90 84q-205 0 -303 32q-170 56 -170 215.5t111 290t269 166.5l2 9q-74 17 -119 75t-45 135q0 28 7 59q41 180 194.5 281t329 101t345.5 -53l-51 -220h-32q-119 66 -251 66z" />
+<glyph unicode="&#x1d7b8;" horiz-adv-x="1155" d="M1101 605q0 -65 -18 -144q-53 -231 -217.5 -360.5t-401.5 -129.5q-183 0 -290 80q-120 89 -120 267q0 64 18 143q53 230 217.5 360.5t400.5 130.5q184 0 297.5 -84.5t113.5 -262.5zM793 586q0 159 -151 159q-44 0 -78 -11q-94 -30 -148 -157t-54 -242q0 -157 153 -157 q195 0 260 281q18 78 18 127z" />
+<glyph unicode="&#x1d7b9;" horiz-adv-x="1416" d="M1129 211q0 -21 31.5 -21t119.5 51l5 -200q-88 -54 -220 -54q-240 0 -240 164q0 25 7 55l119 516h-268l-167 -722h-296l167 722h-86q-84 0 -179 -95h-29l47 205q116 91 251 91h1133l-46 -201h-231z" />
+<glyph unicode="&#x1d7ba;" horiz-adv-x="1225" d="M1216 605q0 -66 -18 -144q-51 -224 -208.5 -356.5t-384.5 -132.5q-112 0 -220 65l-110 -477h-296l208 901q53 230 217.5 360.5t401.5 130.5q184 0 290 -80q120 -90 120 -267zM908 587q0 158 -150 158q-209 0 -275 -286l-53 -228q88 -51 223 -51q174 0 238 279 q17 74 17 128z" />
+<glyph unicode="&#x1d7bb;" horiz-adv-x="946" d="M963 630q-95 111 -238.5 111t-224.5 -102t-81 -239t119 -180l221 -51q119 -37 119 -149q0 -31 -9 -70q-43 -187 -218 -285q-151 -84 -359 -84q-36 0 -82 6l51 222q83 -15 131 -15q206 0 206 123q0 66 -116 72q-69 4 -109 8.5t-81 19.5q-192 69 -192 302q0 68 17 139 q55 230 229 360t414 130q165 0 298 -71l-57 -247h-38z" />
+<glyph unicode="&#x1d7bc;" horiz-adv-x="1281" d="M1092 542q0 -40 -9 -81q-51 -230 -216 -360t-402 -130q-184 0 -297.5 85t-113.5 262q0 66 18 143q54 231 217.5 361t401.5 130q73 0 128.5 -14.5t74.5 -14.5h486l-47 -201h-279q38 -96 38 -180zM793 587q0 158 -150 158q-199 0 -265 -286q-17 -74 -17 -124 q0 -157 154 -157q196 0 261 281q17 74 17 128z" />
+<glyph unicode="&#x1d7bd;" horiz-adv-x="1040" d="M645 211q0 -21 31.5 -21t119.5 51l5 -200q-88 -54 -220 -54q-240 0 -240 164q0 25 7 55l119 516h-166q-84 0 -179 -95h-29l47 205q116 91 251 91h749l-46 -201h-331z" />
+<glyph unicode="&#x1d7be;" horiz-adv-x="1468" d="M1358 731q-22 0 -27 -23l-46 -199q-57 -248 -233.5 -393t-429.5 -145q-197 0 -315.5 96t-118.5 287q0 71 33 202t33 160q0 19 -27 14l-6 204q82 11 151.5 11t128.5 -41t59 -123q0 -24 -14 -82l-35 -144q-24 -108 -24 -176q0 -201 182 -201q244 0 323 344l47 205 q23 102 106 160t190 58q55 0 132 -11l-100 -204q-5 1 -9 1z" />
+<glyph unicode="&#x1d7bf;" horiz-adv-x="1655" d="M1629 555q0 -162 -104.5 -288.5t-262.5 -199.5t-363 -93l-95 -414h-298l96 416q-205 23 -336 102q-172 103 -172 282q0 44 12 97q50 220 277 349q183 105 441 133l28 124h298l-28 -124q205 -23 335 -101q172 -103 172 -283zM1317 515q0 169 -244 214l-125 -543 q151 25 249 99q120 91 120 230zM405 398q0 -167 245 -212l125 543q-151 -26 -250 -101q-120 -91 -120 -230z" />
+<glyph unicode="&#x1d7c0;" horiz-adv-x="1225" d="M967 -227q12 0 34 3l4 -207q-79 -11 -146 -11q-111 0 -176 73q-50 55 -83 169l-49 190l-359 -430h-301l573 687l-107 325q-15 54 -58 151q-7 11 -19.5 11t-46.5 -7l-4 207q78 11 134.5 11t123 -27t84.5 -79l113 -329l344 414h301l-558 -670l157 -458q8 -23 39 -23z" />
+<glyph unicode="&#x1d7c1;" horiz-adv-x="1708" d="M187 448q0 102 28 240l56 235h297l-55 -229q-30 -141 -30 -233q0 -225 194 -276l202 878h296l-202 -878q157 37 254 164q76 99 125 274q4 12 70 300h297l-53 -229q-149 -646 -741 -715l-96 -419h-296l96 419q-442 54 -442 469z" />
+<glyph unicode="&#x1d7c2;" horiz-adv-x="1545" d="M1345 950q134 -181 134 -367t-89 -349q-143 -261 -435 -261q-183 0 -260 132h-10q-138 -132 -322 -132q-149 0 -232.5 78t-83.5 225q0 62 17 136q67 292 362 538l181 -129q-109 -102 -182.5 -240t-73.5 -270t103 -132q44 0 91.5 30.5t56.5 70.5l76 329h256l-76 -329 q-2 -9 -2 -16q0 -37 33.5 -61t71.5 -24q107 0 168 143q47 111 47 246.5t-72 252.5z" />
+<glyph unicode="&#x1d7c3;" horiz-adv-x="1178" d="M1116 856q0 -341 -162 -593q-188 -292 -511 -292q-173 0 -287 92.5t-114 261.5q0 206 136 359.5t339 153.5q163 0 281 -111q11 87 11 123q0 229 -237 229q-116 0 -299 -90h-16l25 236q185 75 380 75q231 0 342.5 -107t111.5 -337zM601 632q-115 0 -178 -86t-63 -205 q0 -163 144 -163q190 0 266 379q-76 75 -169 75z" />
+<glyph unicode="&#x1d7c4;" horiz-adv-x="1019" d="M677 753q-208 0 -287 -183h417l-44 -189h-424q-2 -16 -2 -36q0 -175 211 -175q170 0 309 107h40l-54 -234q-166 -68 -348 -68t-299 75q-141 90 -141 276q0 62 16 132q54 236 231 363t424 127q176 0 310 -69l-54 -235h-40q-105 109 -265 109z" />
+<glyph unicode="&#x1d7c5;" horiz-adv-x="1186" d="M364 -25q-249 0 -302 184q-9 31 -13 93q-2 36 -27 36q-15 0 -45 -4l-5 207q75 11 117 11q103 0 149.5 -51.5t61 -164t113.5 -112.5t179 151q53 101 87 242q-49 -1 -92 -1q-203 0 -292 35q-148 57 -148 227q0 200 183.5 369.5t385.5 169.5q314 0 314 -445q0 -61 -7 -132 h182l-51 -223h-177q-64 -230 -218 -398q-179 -194 -395 -194zM759 977q0 188 -120 188q-85 0 -163.5 -98t-78.5 -185q0 -92 163 -92h177q22 107 22 187z" />
+<glyph unicode="&#x1d7c6;" horiz-adv-x="1243" d="M911 314q0 -99 109 -99q35 0 108 7l-48 -211q-105 -33 -188 -33q-240 0 -240 248q0 66 16 145q-71 -40 -154 -92q-89 -188 -392 -306l-152 77q117 213 323 341q44 129 44 224q0 99 -113 99q-21 0 -95 -13l51 223q125 26 184 26q237 0 237 -239q0 -67 -18 -152 q76 42 160 76q109 223 405 319l139 -84q-126 -207 -331 -334q-45 -164 -45 -222z" />
+<glyph unicode="&#x1d7c7;" horiz-adv-x="1539" d="M1535 600q0 -55 -15 -120q-52 -228 -246 -360q-176 -121 -422 -136l-98 -426h-294l99 429q-187 14 -307 95q-145 98 -145 271q0 49 13 106q45 200 199.5 343t352.5 143q47 0 94 -11l-99 -201q-11 2 -26 2q-100 0 -165 -128q-54 -106 -54 -217q0 -172 183 -204l106 458 q30 129 138 215t241 86q188 0 306 -77q139 -90 139 -268zM1225 565q0 183 -153 183q-43 0 -65 -95l-109 -471q256 30 318 305q9 40 9 78z" />
+<glyph unicode="&#x1d7c8;" horiz-adv-x="1225" d="M1216 605q0 -66 -18 -144q-51 -223 -209 -356t-384 -133q-112 0 -220 65q-15 -59 -15 -106q0 -172 211 -172q89 0 209 33q29 11 76 24h36l-49 -211q-171 -39 -360 -39q-424 0 -424 319q0 68 20 154l98 422q54 231 217.5 361t400.5 130q184 0 297.5 -85t113.5 -262z M907 587q0 158 -150 158q-210 0 -275 -286l-52 -228q88 -51 223 -51q173 0 237 279q17 74 17 128z" />
+<glyph unicode="&#x1d7c9;" horiz-adv-x="1545" d="M1479 578q0 -181 -89 -344q-143 -261 -435 -261q-183 0 -260 132h-10q-138 -132 -322 -132q-149 0 -232.5 78t-83.5 225q0 62 17 136q54 232 235 421h313l-4 -19q-40 -29 -79 -76q-178 -214 -178 -430q0 -129 103 -129q44 0 91.5 30.5t56.5 70.5l71 309h256l-71 -309 q-2 -9 -2 -16q0 -37 33.5 -61t71.5 -24q107 0 168 143q47 110 47 217t-28 187q-212 29 -378 106q-235 110 -235 273q0 89 68 135.5t162 46.5q207 0 353 -100q124 -84 245 -273q95 1 196 9l-49 -201q-12 -2 -48 -6q17 -67 17 -138zM789 1129q-55 0 -55 -51q0 -33 60 -68 q117 -67 290 -87q-168 206 -295 206z" />
+<glyph unicode="&#x1d7ca;" horiz-adv-x="1273" d="M387 6l-328 -6v100h185v1142h-185v101h1094l61 -480h-102q-22 198 -72 272q-70 107 -249 107h-262v-429h394l61 -480h-102q-22 198 -72 272q-70 107 -249 107h-32v-612h232v-100z" />
+<glyph unicode="&#x1d7cb;" horiz-adv-x="1070" d="M1020 763h-559q-167 0 -167 -83q0 -20 13.5 -80t13.5 -96v-137q64 28 144 28h300v-142h-361q-46 0 -64.5 -22.5t-18.5 -84.5v-65q0 -353 -46 -510h-223q45 198 45 332v532q0 217 118.5 352.5t332.5 135.5h472v-160z" />
+<glyph unicode="&#x1d7cc;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1d7cd;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1d7ce;" horiz-adv-x="1042" d="M889 1129q71 -161 71 -463t-72 -460q-103 -229 -367 -229t-368 231q-71 159 -71 460.5t73 463.5q105 233 368 233t366 -236zM685 474v436q0 192 -14 238q-42 135 -150.5 135t-151.5 -135q-12 -38 -12 -245v-461q0 -173 15 -236q33 -145 151 -145t150 161q12 60 12 252z " />
+<glyph unicode="&#x1d7cf;" horiz-adv-x="1042" d="M532 6l-358 -6v106h228v1054q-115 -34 -258 -34v106q291 0 432 133h50q34 0 34 -32v-1227h238v-106z" />
+<glyph unicode="&#x1d7d0;" horiz-adv-x="1042" d="M105 0v82q0 6 8 16l319 400q209 262 209 468q0 115 -41 194q-52 100 -157 100q-87 0 -152 -58q123 -27 123 -152q0 -66 -44.5 -110.5t-110.5 -44.5t-110 44.5t-44 110.5q0 145 118.5 230t269.5 85q185 0 314.5 -109t129.5 -290q0 -148 -132 -288l-245 -219l-199 -190h210 q199 0 212 12q27 26 48 190h106l-65 -471h-767z" />
+<glyph unicode="&#x1d7d1;" horiz-adv-x="1042" d="M954 380q0 -192 -137 -297.5t-335 -105.5q-154 0 -274 87t-120 235q0 69 48 115.5t117 46.5t116 -47t47 -115q0 -131 -127 -162q81 -62 193 -62q96 0 128 120q16 63 16 198q0 292 -148 292h-102q-27 0 -27 57q0 22 39.5 26t71.5 6q143 17 143 304q0 198 -121 198 q-101 0 -169 -68q56 -8 93 -50t37 -101.5t-43 -102.5t-106 -43t-106.5 42t-43.5 106q0 132 102 219t251 87t261 -62q140 -76 140 -227q0 -118 -76 -209.5t-192 -138.5q142 -31 233 -120.5t91 -227.5z" />
+<glyph unicode="&#x1d7d2;" horiz-adv-x="1042" d="M695 6l-338 -6v106h203v217h-501v107l642 911q13 19 90 19q38 0 38 -38v-892h154v-107h-154v-217h154v-106zM582 430v581l-410 -581h410z" />
+<glyph unicode="&#x1d7d3;" horiz-adv-x="1042" d="M821.5 733.5q115.5 -120.5 115.5 -320.5t-138.5 -318t-348.5 -118q-146 0 -245.5 105t-99.5 252q0 61 41.5 102t102.5 41t102.5 -41.5t41.5 -101.5t-39.5 -103.5t-99.5 -43.5q70 -112 193.5 -112t163.5 124q22 69 22 223q0 348 -119 348q-79 0 -129.5 -30.5t-87 -71.5 t-43.5 -41h-37q-11 0 -22.5 11.5t-11.5 22.5v672q0 27 34 32q225 -66 313 -66t213 40q69 26 84 26q29 0 29 -55q0 -34 -76 -109q-169 -166 -383 -166q-50 0 -95 8v-255q88 66 212 66q192 0 307.5 -120.5z" />
+<glyph unicode="&#x1d7d4;" horiz-adv-x="1042" d="M545 876q196 0 302.5 -123.5t106.5 -325.5t-114.5 -326t-317.5 -124q-434 0 -434 697q0 285 129 474q148 217 420 217q119 0 192 -74.5t73 -193.5q0 -56 -39 -95t-96 -39t-95.5 38t-38.5 93t33.5 92.5t84.5 43.5q-40 46 -114 46q-162 0 -221 -178q-35 -107 -36 -313 q58 91 165 91zM662 356v179q0 133 -10 167q-24 90 -120 90q-150 0 -150 -340q0 -377 140 -377q99 0 129 88q11 32 11 193z" />
+<glyph unicode="&#x1d7d5;" horiz-adv-x="1042" d="M968 1270q0 -6 -143 -200.5t-144 -195.5q-86 -122 -112 -366q-13 -121 -13 -395q0 -57 -38 -96.5t-96 -39.5t-96.5 38.5t-38.5 97.5q0 416 287 803l118 159h-218q-232 0 -246 -14q-27 -28 -48 -189h-106l72 538h108q1 -67 338 -67h376v-73z" />
+<glyph unicode="&#x1d7d6;" horiz-adv-x="1042" d="M954 400q0 -193 -119.5 -308t-308.5 -115t-313.5 93t-124.5 272q0 210 221 339q-165 109 -165 310q0 170 104 272t268.5 102t266.5 -75q115 -84 115 -237q0 -170 -175 -277q231 -145 231 -376zM733 1053q0 98 -58 160.5t-150.5 62.5t-154 -38.5t-61.5 -116.5t75 -126 l246 -159q103 89 103 217zM276 342q0 -116 65.5 -191.5t174.5 -75.5t179.5 54.5t70.5 155.5t-99 165l-262 169q-129 -101 -129 -277z" />
+<glyph unicode="&#x1d7d7;" horiz-adv-x="1042" d="M954 674q0 -281 -117 -470q-139 -227 -403 -227q-128 0 -211 72t-83 198q0 57 39.5 96t96 39t95 -39.5t38.5 -95.5q0 -112 -107 -132q45 -40 132 -40q147 0 199 185q28 101 29 304q-59 -94 -166 -94q-195 0 -301.5 124t-106.5 326t119 323.5t325 121.5q422 0 422 -691z M662 925q0 351 -130 351q-152 0 -152 -325v-150q0 -126 11 -162q25 -86 119 -86q102 0 135 146q17 73 17 226z" />
+<glyph unicode="&#x1d7d8;" horiz-adv-x="1394" d="M1133 1162q101 -170 101 -497t-102 -493q-129 -209 -434.5 -209t-434.5 208q-102 166 -102 494t101 498q128 216 435.5 216t435.5 -217zM1101 276q58 139 58 388t-56 391q-66 167 -222 221q60 -100 60 -294v-645q0 -170 -67 -275q159 51 227 214zM866 337v645 q0 322 -168 322q-171 0 -171 -328v-618q0 -320 171 -320q92 0 136 110q32 79 32 189zM452 358v618q0 199 61 300q-155 -55 -221 -222q-56 -141 -56 -390t57 -388q68 -162 226 -213q-67 106 -67 295z" />
+<glyph unicode="&#x1d7d9;" horiz-adv-x="1394" d="M1050 75q66 0 66 -37.5t-54 -37.5h-704q-52 0 -52 37.5t65 37.5h173v1139q-100 -30 -212 -30q-54 0 -54 38q0 32 43 36q148 14 212 31q108 30 186 103h112q34 0 34 -33v-1284h185zM790 75v1242h-43q-60 -51 -128 -78v-1164h171z" />
+<glyph unicode="&#x1d7da;" horiz-adv-x="1394" d="M1138 970q0 -111 -130 -256q-86 -95 -279 -250t-235 -198h367q115 0 153 48q28 35 44 158h75l-62 -472h-834v74q0 5 10 17l342 407q211 251 211 472q0 146 -29 220q-46 114 -169 114q-85 0 -176 -88q65 -3 108 -49.5t43 -112t-47 -112t-113 -46.5t-113 46.5t-47 112.5 q0 147 122 235.5t274 88.5q213 0 341 -96q144 -107 144 -313zM1063 970q0 259 -263 319q75 -99 75 -309t-144 -420l98 85q234 206 234 325zM502 1055q0 83 -79 86l-71 3q-20 -42 -20 -83t24.5 -65.5t60.5 -24.5t60.5 24.5t24.5 59.5zM861 191h-432l-98 -116h674l20 151 q-58 -35 -164 -35z" />
+<glyph unicode="&#x1d7db;" horiz-adv-x="1394" d="M1167 374q0 -199 -130 -305t-319.5 -106t-325.5 75q-164 92 -164 253q0 70 49 118.5t118.5 48.5t117 -49t47.5 -117t-47 -115.5t-114 -51.5q99 -87 228 -87q154 0 154 341q0 310 -158 310h-94q-37 0 -37 37.5t112 37.5q86 0 127 126q29 87 29 197q0 217 -133 217 q-103 0 -190 -83q62 -4 106 -48.5t44 -107t-43 -106t-106.5 -43.5t-108 43.5t-44.5 106.5q0 156 137 241q117 72 279 72t274 -66q135 -80 135 -228q0 -250 -332 -356q389 -88 389 -355zM1035 1085q0 88 -70 143.5t-182 70.5q52 -78 52 -231t-59 -265q259 102 259 282z M512 1066q0 31 -23 54.5t-56 25.5l-56 3q-17 -38 -17 -76t22.5 -60t55.5 -22q74 0 74 75zM1092 374q0 179 -282 270q46 -95 46 -265q0 -234 -72 -336q143 19 225.5 103.5t82.5 227.5zM459 228.5q26 26.5 26 64t-26 64t-64 26.5t-65 -27t-27 -71.5t26 -88.5l66 4 q38 2 64 28.5z" />
+<glyph unicode="&#x1d7dc;" horiz-adv-x="1394" d="M1132 75q66 0 66 -37.5t-55 -37.5h-596q-55 0 -55 37.5t66 37.5h146v275h-508v85l632 901q30 43 97 43q101 0 101 -76v-878h106q66 0 66 -37.5t-66 -37.5h-106v-275h106zM951 74v1226q-6 4 -30 4t-32 -11l-110 -157v-1062h172zM704 425v604l-424 -604h424z" />
+<glyph unicode="&#x1d7dd;" horiz-adv-x="1394" d="M386 734q136 128 318.5 128t318 -127.5t135.5 -323.5t-150 -322t-358 -126q-176 0 -294.5 97.5t-118.5 270.5q0 60 41.5 102t101.5 42t101.5 -42t41.5 -106t-47 -103.5t-116 -41.5q76 -144 225 -144q188 0 188 350q0 403 -124 403q-81 0 -143 -41q-36 -23 -76 -69.5 t-55 -46.5q-58 0 -58 32v683q0 30 31 30q3 0 8 -2q208 -66 343 -66t340 66q6 2 9 2q27 0 27 -41v-12q0 -34 -92 -104.5t-148 -99.5q-150 -77 -299 -77q-58 0 -150 17v-328zM931 1268q-135 -32 -254 -32t-285 51v-151q88 -16 155.5 -16t185 43t198.5 105zM772 52 q138 33 224.5 131.5t86.5 232.5t-82.5 232.5t-210.5 128.5q58 -105 58 -389q0 -232 -76 -336zM320 256q128 3 128 73.5t-68 70.5t-68 -69q0 -39 8 -75z" />
+<glyph unicode="&#x1d7de;" horiz-adv-x="1394" d="M732 881q224 0 350 -116.5t126 -340.5t-140.5 -342.5t-369.5 -118.5q-295 0 -418 221q-93 169 -93 473.5t131 498.5q150 223 425 223q155 0 269 -59q143 -74 143 -215q0 -57 -39 -96.5t-96 -39.5t-97 39.5t-40 94.5t33.5 93.5t86.5 46.5q-87 61 -229 61q-128 0 -183 -203 q-36 -132 -36 -313q70 93 177 93zM1080 1105q0 38 -19 71q-53 -8 -68 -15q-35 -16 -35 -56q0 -61 61 -61t61 61zM1133 425q0 308 -267 368q56 -86 64 -250q2 -36 2 -105q0 -271 -65 -379q266 75 266 366zM857 438q0 365 -149 365q-153 0 -153 -279v-146q0 -340 143 -340 q107 0 142 157q17 79 17 243zM589 1279q-160 -57 -243.5 -222.5t-83.5 -399.5t55 -376q67 -171 225 -221q-62 108 -62 318v410q0 338 109 491z" />
+<glyph unicode="&#x1d7df;" horiz-adv-x="1394" d="M358 1412q8 -69 379 -69h451v-61q0 -14 -141.5 -201.5t-151.5 -202.5q-166 -257 -166 -775q0 -58 -39.5 -99t-97.5 -41t-98 41t-40 99q0 254 159 529q102 176 334 449h-346q-253 0 -268 -14q-33 -30 -50 -192h-75l73 537h77zM320 1139q52 17 281 17h411q47 61 81 112 h-356q-303 0 -393 51zM529 103q0 -65 62.5 -65t62.5 65q0 330 65 558q-190 -296 -190 -558z" />
+<glyph unicode="&#x1d7e0;" horiz-adv-x="1394" d="M1255 395q0 -207 -181 -327q-157 -105 -371 -105t-369 81q-195 102 -195 297t301 339q-231 134 -231 316.5t160 289.5q139 93 325 93t322 -68q171 -87 171 -249t-244 -285q312 -162 312 -382zM1112 1061q0 123 -141 189q60 -81 60 -184t-57 -184q138 90 138 179z M956 1061q0 109 -74.5 176t-177 67t-183 -45.5t-80.5 -126.5t90 -130l300 -162q125 92 125 221zM1028 127q152 100 152 265t-241 302q-73 42 -444 242q-129 70 -129 189q0 39 11 73q-93 -82 -93 -202t170 -235q80 -54 216 -125l242 -125q158 -86 158 -234q0 -83 -42 -150z M485 122.5q85 -84.5 206.5 -84.5t212.5 65t91 171.5t-119 170.5l-320 173q-156 -103 -156 -282q0 -129 85 -213.5zM413 90q-88 102 -88 242.5t83 245.5q-194 -113 -194 -242q0 -164 199 -246z" />
+<glyph unicode="&#x1d7e1;" horiz-adv-x="1394" d="M1114 1158q94 -169 94 -473.5t-131 -498.5q-150 -223 -425 -223q-155 0 -269 59q-143 74 -143 215q0 57 39 97t95.5 40t97 -40t40.5 -95t-34 -92.5t-86 -45.5q90 -63 229 -63q127 0 182 203q36 132 36 313q-68 -91 -177 -91q-224 0 -349.5 115.5t-125.5 339.5t140 342.5 t369 118.5q296 0 418 -221zM805 63q160 56 244 221.5t84 400t-56 376.5q-67 171 -225 221q61 -106 61 -317v-411q0 -340 -108 -491zM839 819v146q0 339 -143 339q-111 0 -144 -171q-14 -74 -14 -260q0 -334 147 -334q154 0 154 280zM463 873q0 303 64 410 q-265 -75 -265 -373.5t265 -357.5q-64 101 -64 321zM437 237q0 62 -63 62q-59 0 -59 -62q0 -37 17 -69q55 8 69 14q36 15 36 55z" />
+<glyph unicode="&#x1d7e2;" horiz-adv-x="1137" d="M944 1141q79 -164 79 -470t-78 -470q-109 -229 -379.5 -229t-379.5 228q-77 163 -77 469.5t78 470.5q109 230 378.5 230t378.5 -229zM800 255q54 128 54 419.5t-55 414.5q-66 146 -233 146q-87 0 -145 -37q-110 -71 -133 -289q-11 -109 -11 -239q0 -287 53 -412 q63 -151 235 -151t235 148z" />
+<glyph unicode="&#x1d7e3;" horiz-adv-x="1137" d="M948 0h-712v123h279v926h-279v109q149 1 216 38q88 48 96 151h126v-1224h274v-123z" />
+<glyph unicode="&#x1d7e4;" horiz-adv-x="1137" d="M1024 0h-894v180l187 161q91 79 210.5 196t169.5 186q102 138 102 263t-75 183.5t-195 58.5q-185 0 -365 -118v179q169 82 364 82t310 -87q130 -97 130 -279q0 -147 -68.5 -256t-186 -225t-218.5 -204l-206 -179h735v-141z" />
+<glyph unicode="&#x1d7e5;" horiz-adv-x="1137" d="M1005 395q0 -138 -75 -243q-128 -180 -404 -180q-206 0 -390 83v178h3q180 -118 383 -118q149 0 231.5 79t82.5 217t-89 200q-74 50 -227 50h-74v136h56q130 0 211 51q96 61 96 184q0 102 -82 153q-68 43 -187 43q-185 0 -366 -118v178q171 83 371 83q304 0 400 -178 q32 -61 32 -142q0 -110 -77 -192.5t-188 -104.5v-26q49 -8 104 -31q189 -78 189 -302z" />
+<glyph unicode="&#x1d7e6;" horiz-adv-x="1137" d="M1055 382h-199v-382h-158v382h-644v200l647 761h155v-830h199v-131zM698 513v641l-545 -641h545z" />
+<glyph unicode="&#x1d7e7;" horiz-adv-x="1137" d="M845 425q0 267 -362 267q-115 0 -272 -32v683h794v-144h-635v-377q86 8 158 8q217 0 337 -84q149 -103 149 -311t-129 -335.5t-346 -127.5t-385 77v180h3q179 -114 370 -114q150 0 234 82.5t84 227.5z" />
+<glyph unicode="&#x1d7e8;" horiz-adv-x="1137" d="M1044 433q0 -199 -129.5 -330t-326.5 -131t-320 121q-159 156 -159 504.5t162.5 559.5t487.5 211q93 0 154 -19v-161q-73 39 -181 39q-198 0 -315.5 -125t-137.5 -351q88 54 160.5 77.5t167.5 23.5q169 0 281 -79q156 -110 156 -340zM588 105q143 0 215.5 87.5t72.5 243 t-109 233.5q-69 49 -207.5 49t-279.5 -78q-4 -48 -4 -90q0 -258 112 -365q84 -80 200 -80z" />
+<glyph unicode="&#x1d7e9;" horiz-adv-x="1137" d="M124 1199v144h904v-194l-605 -1149h-176l647 1199h-770z" />
+<glyph unicode="&#x1d7ea;" horiz-adv-x="1137" d="M1034 371q0 -185 -139.5 -293.5t-333.5 -108.5t-323 99q-143 108 -143 299q0 233 248 346v15q-111 59 -161.5 126.5t-50.5 169.5q0 165 139 263q123 87 296 87t293 -80q139 -92 139 -258q0 -90 -55.5 -177t-167.5 -138v-16q129 -56 194 -134.5t65 -199.5zM836 1034 q0 107 -80.5 164t-190.5 57t-183 -50q-85 -57 -85 -160q0 -130 152 -206q110 -55 222 -88q165 111 165 283zM863 354q0 95 -43.5 146t-139.5 97q-16 7 -231 87q-187 -103 -187 -303q0 -129 87 -210t217.5 -81t213.5 68t83 196z" />
+<glyph unicode="&#x1d7eb;" horiz-adv-x="1137" d="M1023 753q0 -177 -40 -321q-81 -292 -323 -402q-122 -56 -287 -56q-95 0 -155 19v161q75 -39 182 -39q202 0 317.5 123t134.5 353q-96 -58 -169 -79.5t-159 -21.5q-168 0 -281 79q-156 109 -156 340q0 199 129.5 330t328 131t320.5 -120q158 -155 158 -497zM855 792 q0 261 -110 366q-83 79 -213 79t-203.5 -88.5t-73.5 -243.5t110 -232q69 -49 201 -49q150 0 286 78q1 23 2 42t1 48z" />
+<glyph unicode="&#x1d7ec;" horiz-adv-x="1257" d="M1166 672q0 -172 -30 -307q-59 -262 -258 -349q-102 -44 -252 -44q-288 0 -414 172t-126 526.5t126.5 527t413.5 172.5q151 0 253 -45q199 -89 258 -351q29 -130 29 -302zM821 376q27 99 27 297.5t-26 294.5q-49 180 -196 180t-196 -181q-26 -95 -26 -294t28 -298 q50 -181 194.5 -181t194.5 182z" />
+<glyph unicode="&#x1d7ed;" horiz-adv-x="1257" d="M1090 0h-865v208h283v759h-283v192q145 2 215 37q92 45 105 151h269v-1139h276v-208z" />
+<glyph unicode="&#x1d7ee;" horiz-adv-x="1257" d="M1175 0h-1023v203q274 204 432 360q206 205 206 359q0 101 -64 156.5t-181 55.5q-167 0 -349 -124h-9v279q193 80 432 80t366.5 -104t127.5 -295q0 -238 -253 -478q-79 -75 -163 -140l-158 -121h636v-231z" />
+<glyph unicode="&#x1d7ef;" horiz-adv-x="1257" d="M1140 401q0 -200 -149 -314.5t-418 -114.5t-462 81v276h16q194 -118 386 -118q155 0 230.5 52.5t75.5 160.5q0 66 -30 103q-54 65 -190 68q-62 1 -115 1h-59v214h61q89 0 140 6q108 13 149 73q23 33 23 87.5t-25 84.5q-60 73 -237.5 73t-371.5 -116h-14v271 q209 82 446.5 82t373 -82.5t135.5 -245.5q0 -109 -66 -194.5t-187 -112.5v-39q192 -27 264 -166q24 -48 24 -130z" />
+<glyph unicode="&#x1d7f0;" horiz-adv-x="1257" d="M1194 317h-183v-321h-300v321h-650v239l620 787h330v-807h183v-219zM711 536v558l-438 -558h438z" />
+<glyph unicode="&#x1d7f1;" horiz-adv-x="1257" d="M1146 450q0 -217 -152 -347.5t-415 -130.5t-446 78v277h18q194 -116 365 -116t241 63.5t70 163t-83.5 152t-249.5 52.5q-116 0 -288 -42h-23v743h925v-231h-630v-257q86 5 178.5 5t177.5 -21q312 -78 312 -389z" />
+<glyph unicode="&#x1d7f2;" horiz-adv-x="1257" d="M829 1368q96 0 231 -20v-241h-16q-91 42 -218 42q-179 0 -279.5 -90.5t-125.5 -284.5q95 59 170.5 84.5t161.5 25.5q157 0 262 -75q158 -112 158 -357q0 -214 -142.5 -347t-380.5 -133q-387 0 -502 331q-42 123 -42 294q0 361 169 559q181 212 554 212zM423 639l-2 -95 q0 -218 86 -310q55 -60 141.5 -60t141.5 60q65 73 65 202q0 195 -160 230q-46 10 -110.5 10t-161.5 -37z" />
+<glyph unicode="&#x1d7f3;" horiz-adv-x="1257" d="M126 1112v231h1021v-253l-601 -1090h-350l631 1112h-701z" />
+<glyph unicode="&#x1d7f4;" horiz-adv-x="1257" d="M1178 369q0 -205 -183 -312q-151 -88 -371 -88q-277 0 -421 115q-129 102 -129 272q0 98 56.5 173.5t207.5 138.5v26q-123 58 -175.5 138t-52.5 186q0 180 178 277q144 79 341.5 79t334.5 -66q180 -87 180 -265q0 -93 -57 -165.5t-185 -128.5v-27q146 -57 211 -145 t65 -208zM817 899q19 42 19 114.5t-60.5 115.5t-142.5 43t-145.5 -37t-63.5 -104t33.5 -101t81.5 -55q87 -38 209 -77q50 59 69 101zM497 619q-113 -106 -113 -216.5t74 -169.5t171 -59t156 38q79 52 79 133t-35 118q-53 56 -228 118z" />
+<glyph unicode="&#x1d7f5;" horiz-adv-x="1257" d="M420 -26q-123 0 -231 20v241h17q92 -42 217 -42q253 0 355 187q36 64 53 187q-105 -61 -170.5 -85t-162.5 -24q-157 0 -262 75q-157 112 -157 345.5t150 362.5t385.5 129t371.5 -132q160 -156 160 -505t-171 -545q-186 -214 -555 -214zM829 704l3 96q0 216 -84 308 q-55 60 -144 60q-136 0 -189 -143q-18 -50 -18 -120q0 -239 254 -239q90 0 178 38z" />
+<glyph unicode="&#x1d7f6;" horiz-adv-x="1140" d="M846 1231q103 -114 146.5 -263.5t43.5 -300t-47.5 -301.5t-147.5 -260q-120 -130 -272.5 -130t-275.5 135q-103 115 -146 263t-43 301.5t47 303t148 258.5q120 130 272.5 130t274.5 -136zM765 237q119 180 119 461q0 270 -128 431q-82 104 -186.5 104t-186.5 -105 q-128 -161 -128 -433q0 -278 119 -458q85 -127 196 -127t195 127z" />
+<glyph unicode="&#x1d7f7;" horiz-adv-x="1140" d="M853 134q87 0 87 -67t-79 -67h-568q-80 0 -80 67t88 67h200v927q-111 -96 -228 -96q-73 0 -73 66q0 39 18.5 50.5t62.5 17.5q143 20 239 215q26 53 67 53q66 0 66 -90v-1143h200z" />
+<glyph unicode="&#x1d7f8;" horiz-adv-x="1140" d="M1033 148l-2 -58q0 -60 -22 -75t-67 -15h-744q-91 0 -91 68q0 30 34 59l486 409q252 212 252 402q0 138 -103.5 216.5t-246.5 78.5q-86 0 -158 -45.5t-98 -124.5q30 -26 30 -68t-28 -71t-70 -29t-70 30t-28 75q0 162 133 264.5t300 102.5q201 0 346 -116t145 -313 q0 -219 -240 -439l-435 -365h523v9q0 47 10 65q15 30 67 30q77 0 77 -90z" />
+<glyph unicode="&#x1d7f9;" horiz-adv-x="1140" d="M1050 383q0 -180 -145.5 -293.5t-327.5 -113.5t-318 72q-169 88 -169 251q0 45 27.5 74t70 29t71 -28t28.5 -70t-27 -66q72 -128 314 -128q125 0 224 76t99 198.5t-100.5 197.5t-229.5 75h-100q-88 0 -88 69q0 40 26 54q15 9 42.5 11.5t89.5 6.5q136 9 205 66 q92 76 92 191q0 87 -91 137q-75 41 -169 41q-171 0 -243 -68q19 -24 19 -62t-28 -67.5t-69.5 -29.5t-69.5 30t-28 74q0 138 148 206q112 51 268 51t276 -76q138 -87 138 -234q0 -205 -184 -323q110 -50 179.5 -143t69.5 -208z" />
+<glyph unicode="&#x1d7fa;" horiz-adv-x="1140" d="M1083 437q0 -65 -89 -65h-171v-238h136q88 0 88 -67t-82 -67h-408q-82 0 -82 67t88 67h137v238h-554q-58 0 -73.5 20t-15.5 66.5t20 77.5l501 787q20 31 36.5 38.5t42 7.5t47.5 0.5t33 0.5q49 0 67.5 -20t18.5 -71v-774h171q89 0 89 -68zM700 505v768l-488 -768h488z" />
+<glyph unicode="&#x1d7fb;" horiz-adv-x="1140" d="M907.5 727q124.5 -128 124.5 -314.5t-149 -311.5t-344 -125q-161 0 -288 86q-143 96 -143 250q0 45 27.5 75.5t70.5 30.5t70.5 -29t27.5 -72t-28 -68q71 -139 263 -139q136 0 238.5 87.5t102.5 215.5t-79 218t-200 90q-169 0 -277 -110q-32 -33 -66 -33q-70 0 -70 90v585 q0 53 17.5 71.5t70.5 18.5h591q87 0 87 -67t-87 -67h-528v-417q118 63 264 63q180 0 304.5 -128z" />
+<glyph unicode="&#x1d7fc;" horiz-adv-x="1140" d="M904.5 739.5q125.5 -130.5 125.5 -317t-133.5 -316.5t-322.5 -130q-249 0 -370 229q-94 178 -94 452q0 203 86.5 379t253.5 266q120 65 244.5 65t211 -56.5t86.5 -169.5q0 -45 -27 -74.5t-70 -29.5t-71 28.5t-28 69.5t22 63q-42 35 -120 35q-179 0 -303 -160 q-109 -141 -128 -330q139 127 325.5 127t312 -130.5zM790.5 202q87.5 92 87.5 221t-83.5 220t-204 91t-213.5 -68t-93 -178q0 -11 3.5 -41t1.5 -47q71 -290 285 -290q129 0 216.5 92z" />
+<glyph unicode="&#x1d7fd;" horiz-adv-x="1140" d="M1050 1275q0 -28 -50 -75q-355 -332 -453 -853q-8 -94 -28 -283q-12 -88 -74 -88q-77 0 -77 103q0 307 121 605t334 525h-580v-9q0 -47 -10 -65q-15 -30 -67 -30q-76 0 -76 91v92q0 90 76 90q55 0 70 -35h725q89 0 89 -68z" />
+<glyph unicode="&#x1d7fe;" horiz-adv-x="1140" d="M1050 383q0 -179 -148 -293t-331.5 -114t-332 114.5t-148.5 292.5q0 122 90.5 214t215.5 127q-113 37 -194 111.5t-81 179.5q0 158 150 261q133 91 299 91t307 -97t141 -255q0 -200 -274 -291q125 -36 215.5 -128t90.5 -213zM766 847q101 63 101 165.5t-94.5 161.5 t-202.5 59t-195 -55q-101 -63 -101 -165t94 -161.5t202.5 -59.5t195.5 55zM897 385q0 122 -100.5 197t-226 75t-226.5 -75.5t-101 -197t100.5 -198t226.5 -76.5t226.5 76.5t100.5 198.5z" />
+<glyph unicode="&#x1d7ff;" horiz-adv-x="1140" d="M1030 686q0 -199 -80.5 -375.5t-238.5 -268.5q-114 -66 -242.5 -66t-213.5 48q-106 59 -106 178q0 104 98 104q41 0 69 -28.5t28 -68t-20 -62.5q55 -37 145 -37q173 0 289 164q100 141 115 326q-139 -127 -325.5 -127t-312 130.5t-125.5 318.5t137 316.5t329 128.5 q245 0 363 -231q91 -179 91 -450zM849 921l2 20q0 35 -28.5 100t-54.5 98q-75 94 -199 94t-215 -91.5t-91 -221t83 -221t203 -91.5t214.5 69t94.5 178z" />
+<glyph unicode="&#x1f000;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM793 820l207 39q15 0 66 -24.5t55 -30.5t4 -19t-32.5 -62.5 t-37.5 -60.5q-26 -66 -72 -171h-34q-11 29 -17 32t-25 3t-122 -17q0 1 -6 -5q222 -206 501 -262q24 -5 74 -14q12 -3 22 -22q-143 -37 -196 -37t-64 5q-96 38 -332 278q-5 -5 -5 -8v-210l7 -97q0 -68 -37 -138q-59 39 -59 91l28 141l-2 179l-198 -157q-156 -119 -212 -119 h-54l237 162q135 98 198 197q-5 5 -37.5 5t-63.5 -12q-10 -4 -17 -30q-21 0 -24.5 6.5t-50.5 119t-90 161.5v34h54q1 0 30 -16q1 -1 31.5 -1t206.5 52v79l-119 -14q-30 0 -83 27l202 39v80l-42 136q68 -17 126 -53q-22 -114 -24 -114v1q0 -13 14 -21l136 29q32 -2 73 -27 q-53 -28 -203 -67q-15 -3 -27 -22v-62q2 -3 14 -3zM948 573q36 138 36 170.5t-12 41.5h-124q-14 0 -69 -19v-59q30 -9 46 -6l24 6q63 0 71 -29q-31 -17 -141 -46v-58q9 -12 47 -12zM722 756h-27l-185 -36l64 -193l112 17q15 -4 35 -14v84q-2 6 -7 7q-55 -6 -76.5 -6t-26.5 2 q-15 4 -31 27l142 35v77z" />
+<glyph unicode="&#x1f001;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM690 813l-62 -4q-43 0 -83 31l113 19q76 16 83 48l15 71 q5 29 5 71.5t-17 95.5h54q11 0 42 -23.5t34 -30.5l-60 -176q45 0 96 12.5t58 12.5t69 -18q-21 -35 -116 -54t-117.5 -37t-39.5 -63l-32 -87q22 -5 45 -6l377 60q22 -2 78 -27.5t56 -55.5q0 -2 -19 -47t-21 -57t-14 -181q-25 -355 -122 -355q-5 0 -11 2l-117 161q36 -9 71 -9 h36q44 26 60 92q1 6 13 108q0 95 -2 98l4 81v14q0 42 -10 64q-24 52 -96 52t-168 -24q7 -13 35 -34l-103 -126h146q-19 -22 -90 -33.5t-88 -18.5v-76l125 15q54 0 91 -30q0 -5 -10 -17.5t-16 -12.5l-180 -4q-11 -19 -16 -56l-8 -52q-3 -15 -6 -45q-8 -39 -37 -55 q-1 90 -14 185q-3 3 -8 9q-100 -28 -117 -28t-40.5 13.5t-24.5 28.5q64 10 195 38v79q-53 -14 -86 -14t-67 20q65 7 182 34q9 3 46.5 58t37.5 63v45q-8 5 -23 3l-370 -49v-421q0 -9 -29 -57q-49 15 -49 83l18 194q0 137 -33 205l-13 26v36h37q3 0 26 -14t29 -14h-2 q0 3 247 36q50 48 49 142q-8 6 -36 6zM704 506q-11 -11 -27 -11t-38.5 31t-22.5 42v32h44q25 0 38 -40q9 -24 9 -39q0 -9 -3 -15z" />
+<glyph unicode="&#x1f002;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1323 673q0 -4 -18.5 -31t-22.5 -37q-24 -48 -39.5 -132 t-40.5 -203q-18 -71 -62 -126.5t-61 -55.5t-23 15q-13 45 -45 134q-21 49 -96 49q-23 0 -428 -35q-3 -1 -14 -24q-7 -21 -33 -58q-30 115 -39 189q-25 205 -96 313l130 -10h4q33 0 177 28v147q0 9 -12 42t-22 36q-1 1 -60.5 11.5t-89.5 42.5q8 0 108 11.5t298 51.5 q186 38 186 40h-1q85 0 85 -32q0 -17 -43 -34.5t-77.5 -22.5t-138.5 -26q30 -32 64 -86l-39 -129q2 -2 16 -2l274 39q22 0 90.5 -39.5t68.5 -65.5zM687 867v-160h29q16 0 97 18v229l-186 -29q60 -40 60 -58zM918 534l55 10q57 0 71 -44q-35 -27 -105 -27t-106.5 28.5 t-36.5 109.5q0 38 7 74q-39 -10 -123 -18q-19 -121 -32 -156q-33 -91 -114 -126v12q14 27 48 107t34 95v51l-177 -29v-18q0 -4 6 -41q15 -90 23 -265l480 49q43 0 70 -25q10 -10 48 -63h30q27 35 51 153.5t24 191t-18.5 86.5t-100.5 14h-185v-147q37 -22 51 -22z" />
+<glyph unicode="&#x1f003;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM864 977l-25 82v19q90 -29 120 -68l-39 -310v-118l6 -2 q170 111 179 197h32q14 0 44 -26t40 -43l-305 -170v-254q0 -18 23 -36q46 -36 137.5 -36t136.5 43.5t84 168.5q2 -84 41 -217q-34 -35 -106.5 -59.5t-134.5 -24.5q-172 0 -213 97q-20 46 -20 50v707zM612 167l18 135q0 15 -6 44l-241 -170q-20 2 -93 77q209 53 351 142v225 q-6 6 -14 6l-177 -53h-1q-27 0 -67 39q63 25 196 62q22 3 53 5q10 14 10 46.5t-19 107.5l-34 139h36q11 0 40.5 -24.5t35 -33t11.5 -28.5l-17 -117v-609q0 -5 -13 -36t-17 -43q-52 17 -52 86z" />
+<glyph unicode="&#x1f004;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM832 1101l-18 -95v-109q4 -3 21 -3l266 32q23 0 81 -33t78 -53 q-82 -84 -99 -105q-53 -65 -53 -113q0 -4 6 -46h-111l-150 -11q-24 -1 -40 8l-3 -317q-9 -75 -20 -148.5t-31 -122.5q-23 45 -23 70v119l7 79v278q0 18 -32 13q-40 0 -184 -12q-22 -39 -29 -62q-7 0 -15 11q-23 53 -32 124.5t-17 99.5l-65 150h11l100 -10q53 0 122 13 l128 23l13 8q1 12 1 24q0 105 -53 261h78q27 0 45 -24t18 -49zM1079 799q0 45 -11 56q-9 9 -40 9q-9 0 -19 -1l-176 -15q-6 0 -18 11v-254h53q-7 0 51 9q160 25 160 185zM739 594v240l-247 -36q17 -73 24 -143q0 -28 5 -86z" />
+<glyph unicode="&#x1f005;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1408 599q-2 0 -75.5 -18.5t-111.5 -18.5t-53 12 q-43 35 -213 218l-109 123q-69 76 -113 109q18 12 33 12q45 0 71 -43q63 35 63 115q0 11 -1 23h15q28 0 76 -15l19 -22l-142 -124q36 -46 83 -93q37 19 81.5 71.5t52.5 94.5q61 -31 94 -54q-23 -38 -82 -71l-112 -65q142 -177 424 -254zM832 707l102 42q8 0 74 -36l-33 -77 q-14 -31 -14 -59q0 -7 1 -13q15 -14 38 -17l60 -8q55 -8 55 -18q0 -23 -99 -41q-95 0 -95 81l4 78q0 35 -11 57q-52 -12 -75 -31q-18 -109 -26 -130q-30 -79 -107 -110q73 95 73 204q0 51 -18 95h37zM915 374l-99 -28q-9 0 -32.5 10t-29.5 21l216 61q18 -6 51.5 -27.5 t33.5 -41.5q0 -5 -36 -63.5t-46 -77.5l92 -66q60 -51 60 -92q0 -1 -11 -42q-57 30 -189 141q-103 -95 -232 -95h-24q57 25 163 93q35 31 35 36q0 15 -46 49l-85 61q54 -13 161 -55q14 6 31 41.5t17 50.5q0 24 -30 24zM463 402l89 8q15 0 52 -16.5t37 -33.5q0 -4 -9.5 -30.5 t-15.5 -62t-44 -160.5q-26 -59 -75 -79q-33 36 -111 137q102 -22 102 -24h-1q36 0 56 64t20 113t-46 49q-38 0 -133 -70q-19 6 -19 26q0 3 29.5 57t37.5 75.5t8 104.5q59 -34 87 -34t55 24.5t27 48.5v52l-108 28q-134 -153 -285 -212l248 259q-43 42 -103 122h55 q16 0 36 -24l35 -46q48 44 94 196q-6 5 -16 5l-87 -14q-17 0 -64 23q185 66 190.5 66t92.5 -48l-187 -311q9 -9 17 -9l121 39q30 0 74 -48l-88 -109q10 -6 35 -51q-54 -6 -161 -20q-11 -2 -18.5 -15.5t-26.5 -79.5z" />
+<glyph unicode="&#x1f006;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1428 -117q0 -125 -117 -125h-994q-117 0 -117 125v1398 q0 125 117 125h994q117 0 117 -125v-1398zM1394 -117v1398q0 91 -83 91h-994q-83 0 -83 -91v-1398q0 -91 83 -91h994q83 0 83 91z" />
+<glyph unicode="&#x1f007;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM441 1026l90 -3q117 0 274 25l299 49q23 0 69.5 -20t46.5 -44 t-55 -24l-109 14q-152 0 -361 -35.5t-199 -35.5q-16 0 -54 18t-38 39q0 17 37 17zM878 463q-6 6 -39 6q-18 0 -96 -7q0 -27 -15 -84q-2 2 -15.5 37.5t-26.5 35.5q-26 0 -78.5 -12.5t-83 -12.5t-63.5 34l226 25l-46 89h51q-5 0 32 -15q-2 -19 15 -73q17 2 147 22 q21 23 22 69.5t3 53.5l43 -24q33 -20 33 -29q0 2 -32 -51q6 -6 22.5 -6t52.5 10.5t50.5 10.5t41 -13.5t31.5 -22.5v-16q-11 -11 -28 -11l-104 7q-71 0 -96 -20l-68 -71q4 9 21 68zM576 -127l-10 -52q0 -8 4 -12h-23q-12 0 -15 15q-3 61 -16 180q-2 14 -19 72q20 -3 59 -10 l203 31l2 3v45q-6 6 -40 6t-50 -15q-20 18 -48 104t-45 111q120 6 171 13.5t116.5 24t80.5 16.5q30 0 83 -51q-15 -26 -45 -83q-16 -42 -66 -120q-24 21 -49.5 21t-65.5 -17v-44q8 -5 22 -3l254 28h2q21 0 86 -43q-16 -34 -32 -146.5t-79 -166.5q-23 31 -97 112 q60 -10 69 -10q51 0 51 87v94q-17 24 -55 24q-135 0 -228 -27v-56q13 -12 32 -12t57 19q-11 8 -11 33q25 -3 60 -29.5t35 -54.5t-24 -28q-11 0 -33 24.5t-29 28.5l-208 -60q-14 -4 -29.5 10t-18.5 28q44 7 130 25q1 3 1 8v40q-3 19 -27.5 19t-147.5 -12l-13 -4v-92zM826 296 l23 6q26 0 36 -26q-25 -17 -81 -31v-45h64q30 0 48 41.5t18 65.5t-8 48h-122v-52q13 -7 22 -7zM760 340l-77 -13q-7 0 -27 10l24 -158q52 5 81 15v48q-45 3 -50 0q-7 6 -17 19q2 1 67 21q-2 53 -1 58z" />
+<glyph unicode="&#x1f008;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1007 1221l-175 -29q-99 -17 -151 -17t-107 44l372 58h6 q46 0 70 -40q0 -14 -15 -16zM1105 913q27 0 78 -17.5t51 -48.5t-23 -29l-275 18q-23 1 -50 1q-128 0 -336 -31q-64 -9 -70 -9q-63 0 -86 48q29 12 58 12h124zM878 463q-6 6 -39 6q-18 0 -96 -7q0 -27 -15 -84q-2 2 -15.5 37.5t-26.5 35.5q-26 0 -78.5 -12.5t-83 -12.5 t-63.5 34l226 25l-46 89h51q-5 0 32 -15q-2 -19 15 -73q17 2 147 22q21 23 22 69.5t3 53.5l43 -24q33 -20 33 -29q0 2 -32 -51q6 -6 22.5 -6t52.5 10.5t50.5 10.5t41 -13.5t31.5 -22.5v-16q-11 -11 -28 -11l-104 7q-71 0 -96 -20l-68 -71q4 9 21 68zM576 -127l-10 -52 q0 -8 4 -12h-23q-12 0 -15 15q-3 61 -16 180q-2 14 -19 72q20 -3 59 -10l203 31l2 3v45q-6 6 -40 6t-50 -15q-20 18 -48 104t-45 111q120 6 171 13.5t116.5 24t80.5 16.5q30 0 83 -51q-15 -26 -45 -83q-16 -42 -66 -120q-24 21 -49.5 21t-65.5 -17v-44q8 -5 22 -3l254 28h2 q21 0 86 -43q-16 -34 -32 -146.5t-79 -166.5q-23 31 -97 112q60 -10 69 -10q51 0 51 87v94q-17 24 -55 24q-135 0 -228 -27v-56q13 -12 32 -12t57 19q-11 8 -11 33q25 -3 60 -29.5t35 -54.5t-24 -28q-11 0 -33 24.5t-29 28.5l-208 -60q-14 -4 -29.5 10t-18.5 28q44 7 130 25 q1 3 1 8v40q-3 19 -27.5 19t-147.5 -12l-13 -4v-92zM826 296l23 6q26 0 36 -26q-25 -17 -81 -31v-45h64q30 0 48 41.5t18 65.5t-8 48h-122v-52q13 -7 22 -7zM760 340l-77 -13q-7 0 -27 10l24 -158q52 5 81 15v48q-45 3 -50 0q-7 6 -17 19q2 1 67 21q-2 53 -1 58z" />
+<glyph unicode="&#x1f009;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1047 1281q-23 -17 -48 -24.5t-135 -27t-164.5 -19.5t-97.5 30 l383 79q20 -4 62 -15v-23zM708 984q-23 0 -85 30l295 58q68 -6 94 -37q-20 -21 -34 -22q-33 -1 -95 -6q-177 -21 -177 -23h2zM1245 767q0 -21 -37 -23q-3 0 -44 8q-74 13 -221 13t-315.5 -24.5t-159.5 -24.5q-49 0 -85 44l738 79q51 0 87.5 -22.5t36.5 -49.5zM878 463 q-6 6 -39 6q-18 0 -96 -7q0 -27 -15 -84q-2 2 -15.5 37.5t-26.5 35.5q-26 0 -78.5 -12.5t-83 -12.5t-63.5 34l226 25l-46 89h51q-5 0 32 -15q-2 -19 15 -73q17 2 147 22q21 23 22 69.5t3 53.5l43 -24q33 -20 33 -29q0 2 -32 -51q6 -6 22.5 -6t52.5 10.5t50.5 10.5t41 -13.5 t31.5 -22.5v-16q-11 -11 -28 -11l-104 7q-71 0 -96 -20l-68 -71q4 9 21 68zM576 -127l-10 -52q0 -8 4 -12h-23q-12 0 -15 15q-3 61 -16 180q-2 14 -19 72q20 -3 59 -10l203 31l2 3v45q-6 6 -40 6t-50 -15q-20 18 -48 104t-45 111q120 6 171 13.5t116.5 24t80.5 16.5 q30 0 83 -51q-15 -26 -45 -83q-16 -42 -66 -120q-24 21 -49.5 21t-65.5 -17v-44q8 -5 22 -3l254 28h2q21 0 86 -43q-16 -34 -32 -146.5t-79 -166.5q-23 31 -97 112q60 -10 69 -10q51 0 51 87v94q-17 24 -55 24q-135 0 -228 -27v-56q13 -12 32 -12t57 19q-11 8 -11 33 q25 -3 60 -29.5t35 -54.5t-24 -28q-11 0 -33 24.5t-29 28.5l-208 -60q-14 -4 -29.5 10t-18.5 28q44 7 130 25q1 3 1 8v40q-3 19 -27.5 19t-147.5 -12l-13 -4v-92zM826 296l23 6q26 0 36 -26q-25 -17 -81 -31v-45h64q30 0 48 41.5t18 65.5t-8 48h-122v-52q13 -7 22 -7z M760 340l-77 -13q-7 0 -27 10l24 -158q52 5 81 15v48q-45 3 -50 0q-7 6 -17 19q2 1 67 21q-2 53 -1 58z" />
+<glyph unicode="&#x1f00a;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM434 1259l73 -14l588 64q14 0 62.5 -30.5t48.5 -49.5 q0 -3 -21.5 -36t-27.5 -49q-2 -16 -15 -80l-33 -160q-27 -111 -92 -167q-13 10 -15 19q-23 91 -35 104.5t-74 13.5l-305 -28q-15 0 -43 7q-9 -14 -14 -38h-12q-13 0 -15 15q-10 92 -34 275q-5 32 -26.5 85t-21.5 48q0 21 12 21zM878 463q-6 6 -39 6q-18 0 -96 -7 q0 -27 -15 -84q-2 2 -15.5 37.5t-26.5 35.5q-26 0 -78.5 -12.5t-83 -12.5t-63.5 34l226 25l-46 89h51q-5 0 32 -15q-2 -19 15 -73q17 2 147 22q21 23 22 69.5t3 53.5l43 -24q33 -20 33 -29q0 2 -32 -51q6 -6 22.5 -6t52.5 10.5t50.5 10.5t41 -13.5t31.5 -22.5v-16 q-11 -11 -28 -11l-104 7q-71 0 -96 -20l-68 -71q4 9 21 68zM576 -127l-10 -52q0 -8 4 -12h-23q-12 0 -15 15q-3 61 -16 180q-2 14 -19 72q20 -3 59 -10l203 31l2 3v45q-6 6 -40 6t-50 -15q-20 18 -48 104t-45 111q120 6 171 13.5t116.5 24t80.5 16.5q30 0 83 -51 q-15 -26 -45 -83q-16 -42 -66 -120q-24 21 -49.5 21t-65.5 -17v-44q8 -5 22 -3l254 28h2q21 0 86 -43q-16 -34 -32 -146.5t-79 -166.5q-23 31 -97 112q60 -10 69 -10q51 0 51 87v94q-17 24 -55 24q-135 0 -228 -27v-56q13 -12 32 -12t57 19q-11 8 -11 33q25 -3 60 -29.5 t35 -54.5t-24 -28q-11 0 -33 24.5t-29 28.5l-208 -60q-14 -4 -29.5 10t-18.5 28q44 7 130 25q1 3 1 8v40q-3 19 -27.5 19t-147.5 -12l-13 -4v-92zM669 1173l-4 45l4 5q-28 -1 -165 -14l35 -327h76l310 45q17 -1 49.5 -31t35.5 -32q19 19 49 139.5t30 173.5t-18.5 64 t-62.5 11l-162 -15q19 -11 49 -34q-17 -86 -17 -111t13.5 -31t37.5 -6l56 7q38 0 55 -37q-8 -9 -13 -12q-51 -15 -88 -15q-113 0 -113 101l4 80q0 59 -50 59q-2 0 -35.5 -4t-50.5 -4q5 -10 20 -25.5t15 -36.5t-26 -78.5t-46.5 -86t-53.5 -45.5l-24 -13q-8 0 -6.5 -1.5 t5.5 16.5q91 104 91 213zM826 296l23 6q26 0 36 -26q-25 -17 -81 -31v-45h64q30 0 48 41.5t18 65.5t-8 48h-122v-52q13 -7 22 -7zM760 340l-77 -13q-7 0 -27 10l24 -158q52 5 81 15v48q-45 3 -50 0q-7 6 -17 19q2 1 67 21q-2 53 -1 58z" />
+<glyph unicode="&#x1f00b;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1040 831l113 8q78 0 113 -59q-14 -2 -37 -8l-335 -4l-208 -31 q-12 -4 -36 9t-26 32l152 12q8 6 12 20q54 168 54 190.5t-10 22.5l-60 -11q-28 0 -53 15q0 9 4 12q40 4 117 20q12 3 26 53q13 42 13 90q0 10 -1 20l-102 31v13l298 67q25 -5 54 -21v-17q-39 -18 -110.5 -34t-90.5 -22q25 -37 25 -34.5t-43 -126.5q34 0 81.5 14.5t54.5 14.5 t45 -22t38 -36q0 -3 -22 -35q-39 -59 -66 -183zM715 1363q0 -11 -56.5 -91t-56.5 -76q0 14 9 -18t9 -53l-4 -157q0 -3 -17 -226q-7 -101 -32 -101q-16 0 -26 29.5t-10 52.5l43 376q0 17 -6 40l-104 -99q-56 -52 -102 -55q216 233 253 365q3 12 9 63q1 10 15 16 q76 -35 76 -66zM878 463q-6 6 -39 6q-18 0 -96 -7q0 -27 -15 -84q-2 2 -15.5 37.5t-26.5 35.5q-26 0 -78.5 -12.5t-83 -12.5t-63.5 34l226 25l-46 89h51q-5 0 32 -15q-2 -19 15 -73q17 2 147 22q21 23 22 69.5t3 53.5l43 -24q33 -20 33 -29q0 2 -32 -51q6 -6 22.5 -6 t52.5 10.5t50.5 10.5t41 -13.5t31.5 -22.5v-16q-11 -11 -28 -11l-104 7q-71 0 -96 -20l-68 -71q4 9 21 68zM576 -127l-10 -52q0 -8 4 -12h-23q-12 0 -15 15q-3 61 -16 180q-2 14 -19 72q20 -3 59 -10l203 31l2 3v45q-6 6 -40 6t-50 -15q-20 18 -48 104t-45 111 q120 6 171 13.5t116.5 24t80.5 16.5q30 0 83 -51q-15 -26 -45 -83q-16 -42 -66 -120q-24 21 -49.5 21t-65.5 -17v-44q8 -5 22 -3l254 28h2q21 0 86 -43q-16 -34 -32 -146.5t-79 -166.5q-23 31 -97 112q60 -10 69 -10q51 0 51 87v94q-17 24 -55 24q-135 0 -228 -27v-56 q13 -12 32 -12t57 19q-11 8 -11 33q25 -3 60 -29.5t35 -54.5t-24 -28q-11 0 -33 24.5t-29 28.5l-208 -60q-14 -4 -29.5 10t-18.5 28q44 7 130 25q1 3 1 8v40q-3 19 -27.5 19t-147.5 -12l-13 -4v-92zM1018.5 992q7.5 32 7.5 39t-5 13h-78q-6 0 -22.5 -7.5t-18.5 -11.5 l-59 -224h22l113 15q25 58 29 101t11.5 75zM826 296l23 6q26 0 36 -26q-25 -17 -81 -31v-45h64q30 0 48 41.5t18 65.5t-8 48h-122v-52q13 -7 22 -7zM760 340l-77 -13q-7 0 -27 10l24 -158q52 5 81 15v48q-45 3 -50 0q-7 6 -17 19q2 1 67 21q-2 53 -1 58z" />
+<glyph unicode="&#x1f00c;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM852 1310q36 -30 36 -65t-33 -35q-26 0 -76 50t-60 80h72 q25 0 61 -30zM1096 1146q31 0 76 -15.5t45 -40t-64 -25.5l-178 7q-23 1 -47 1q-119 0 -260 -25q-169 -29 -179 -29q-41 0 -77 38zM1089 763q0 -13 -12 -50q-12 -5 -14 -5q-11 0 -51 56l-148 209q225 -97 225 -210zM656 969q16 -4 51.5 -24t35.5 -35.5t-19 -30.5l-34 -27 q-177 -143 -210 -143h-23q117 110 129 123q69 77 70 137zM878 463q-6 6 -39 6q-18 0 -96 -7q0 -27 -15 -84q-2 2 -15.5 37.5t-26.5 35.5q-26 0 -78.5 -12.5t-83 -12.5t-63.5 34l226 25l-46 89h51q-5 0 32 -15q-2 -19 15 -73q17 2 147 22q21 23 22 69.5t3 53.5l43 -24 q33 -20 33 -29q0 2 -32 -51q6 -6 22.5 -6t52.5 10.5t50.5 10.5t41 -13.5t31.5 -22.5v-16q-11 -11 -28 -11l-104 7q-71 0 -96 -20l-68 -71q4 9 21 68zM576 -127l-10 -52q0 -8 4 -12h-23q-12 0 -15 15q-3 61 -16 180q-2 14 -19 72q20 -3 59 -10l203 31l2 3v45q-6 6 -40 6 t-50 -15q-20 18 -48 104t-45 111q120 6 171 13.5t116.5 24t80.5 16.5q30 0 83 -51q-15 -26 -45 -83q-16 -42 -66 -120q-24 21 -49.5 21t-65.5 -17v-44q8 -5 22 -3l254 28h2q21 0 86 -43q-16 -34 -32 -146.5t-79 -166.5q-23 31 -97 112q60 -10 69 -10q51 0 51 87v94 q-17 24 -55 24q-135 0 -228 -27v-56q13 -12 32 -12t57 19q-11 8 -11 33q25 -3 60 -29.5t35 -54.5t-24 -28q-11 0 -33 24.5t-29 28.5l-208 -60q-14 -4 -29.5 10t-18.5 28q44 7 130 25q1 3 1 8v40q-3 19 -27.5 19t-147.5 -12l-13 -4v-92zM826 296l23 6q26 0 36 -26 q-25 -17 -81 -31v-45h64q30 0 48 41.5t18 65.5t-8 48h-122v-52q13 -7 22 -7zM760 340l-77 -13q-7 0 -27 10l24 -158q52 5 81 15v48q-45 3 -50 0q-7 6 -17 19q2 1 67 21q-2 53 -1 58z" />
+<glyph unicode="&#x1f00d;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1144 1175q69 -26 69 -42t-19 -21l-176 -41q-117 -29 -194 -62 v-84q0 14 6 -42q8 -68 52 -92q31 -15 100 -15q116 0 145 41q3 4 46 110l33 -152q-7 -20 -22 -27q-106 -43 -188 -43q-23 0 -75 8q-94 14 -125 115q-1 2 -25 164q-1 2 -4 2l-272 -95q-53 8 -83 38q226 53 356 106v225q0 16 -38 143h43q10 0 76 -46q-10 -44 -24 -139 q0 -156 -4 -159q5 -5 10 -5zM878 463q-6 6 -39 6q-18 0 -96 -7q0 -27 -15 -84q-2 2 -15.5 37.5t-26.5 35.5q-26 0 -78.5 -12.5t-83 -12.5t-63.5 34l226 25l-46 89h51q-5 0 32 -15q-2 -19 15 -73q17 2 147 22q21 23 22 69.5t3 53.5l43 -24q33 -20 33 -29q0 2 -32 -51 q6 -6 22.5 -6t52.5 10.5t50.5 10.5t41 -13.5t31.5 -22.5v-16q-11 -11 -28 -11l-104 7q-71 0 -96 -20l-68 -71q4 9 21 68zM576 -127l-10 -52q0 -8 4 -12h-23q-12 0 -15 15q-3 61 -16 180q-2 14 -19 72q20 -3 59 -10l203 31l2 3v45q-6 6 -40 6t-50 -15q-20 18 -48 104t-45 111 q120 6 171 13.5t116.5 24t80.5 16.5q30 0 83 -51q-15 -26 -45 -83q-16 -42 -66 -120q-24 21 -49.5 21t-65.5 -17v-44q8 -5 22 -3l254 28h2q21 0 86 -43q-16 -34 -32 -146.5t-79 -166.5q-23 31 -97 112q60 -10 69 -10q51 0 51 87v94q-17 24 -55 24q-135 0 -228 -27v-56 q13 -12 32 -12t57 19q-11 8 -11 33q25 -3 60 -29.5t35 -54.5t-24 -28q-11 0 -33 24.5t-29 28.5l-208 -60q-14 -4 -29.5 10t-18.5 28q44 7 130 25q1 3 1 8v40q-3 19 -27.5 19t-147.5 -12l-13 -4v-92zM826 296l23 6q26 0 36 -26q-25 -17 -81 -31v-45h64q30 0 48 41.5t18 65.5 t-8 48h-122v-52q13 -7 22 -7zM760 340l-77 -13q-7 0 -27 10l24 -158q52 5 81 15v48q-45 3 -50 0q-7 6 -17 19q2 1 67 21q-2 53 -1 58z" />
+<glyph unicode="&#x1f00e;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1270 784q-47 -16 -82 -16q-94 0 -151 27q-24 22 -49 64 l-143 249q-61 102 -92 143.5t-69 68.5q-8 7 -8 14.5t5 12.5h46q50 0 96 -84l48 -100q108 -152 157 -208q107 -121 198 -142q7 -2 44 -29zM385 758h-26q254 222 254 377v11h29q19 0 52 -70q0 -12 -115 -169q-30 -42 -66 -70q-99 -79 -128 -79zM878 463q-6 6 -39 6 q-18 0 -96 -7q0 -27 -15 -84q-2 2 -15.5 37.5t-26.5 35.5q-26 0 -78.5 -12.5t-83 -12.5t-63.5 34l226 25l-46 89h51q-5 0 32 -15q-2 -19 15 -73q17 2 147 22q21 23 22 69.5t3 53.5l43 -24q33 -20 33 -29q0 2 -32 -51q6 -6 22.5 -6t52.5 10.5t50.5 10.5t41 -13.5t31.5 -22.5 v-16q-11 -11 -28 -11l-104 7q-71 0 -96 -20l-68 -71q4 9 21 68zM576 -127l-10 -52q0 -8 4 -12h-23q-12 0 -15 15q-3 61 -16 180q-2 14 -19 72q20 -3 59 -10l203 31l2 3v45q-6 6 -40 6t-50 -15q-20 18 -48 104t-45 111q120 6 171 13.5t116.5 24t80.5 16.5q30 0 83 -51 q-15 -26 -45 -83q-16 -42 -66 -120q-24 21 -49.5 21t-65.5 -17v-44q8 -5 22 -3l254 28h2q21 0 86 -43q-16 -34 -32 -146.5t-79 -166.5q-23 31 -97 112q60 -10 69 -10q51 0 51 87v94q-17 24 -55 24q-135 0 -228 -27v-56q13 -12 32 -12t57 19q-11 8 -11 33q25 -3 60 -29.5 t35 -54.5t-24 -28q-11 0 -33 24.5t-29 28.5l-208 -60q-14 -4 -29.5 10t-18.5 28q44 7 130 25q1 3 1 8v40q-3 19 -27.5 19t-147.5 -12l-13 -4v-92zM826 296l23 6q26 0 36 -26q-25 -17 -81 -31v-45h64q30 0 48 41.5t18 65.5t-8 48h-122v-52q13 -7 22 -7zM760 340l-77 -13 q-7 0 -27 10l24 -158q52 5 81 15v48q-45 3 -50 0q-7 6 -17 19q2 1 67 21q-2 53 -1 58z" />
+<glyph unicode="&#x1f00f;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM780 1157l152 63q39 0 73 -47q-1 -2 -2 -8q-48 -33 -81.5 -133 t-33.5 -181t35 -104q21 -14 102 -14t112 21q45 31 63 133q1 4 15 19l16 -173q0 -36 -62.5 -53t-114.5 -17q-203 0 -212 169l46 267v41q-4 3 -23 3q-53 0 -114 -42q-20 -117 -85 -220q-79 -128 -196 -170q-51 -19 -47 -20h-26q113 63 192 175t109 221q-2 3 -6 3l-181 -57 q-16 -2 -36 15.5t-24 33.5q71 9 174 31q26 3 73 20q10 6 22.5 59.5t12.5 82.5t-5 81l-9 22v33q70 -21 109 -58q-9 -17 -32.5 -81t-23.5 -78v-35q2 -2 8 -2zM878 463q-6 6 -39 6q-18 0 -96 -7q0 -27 -15 -84q-2 2 -15.5 37.5t-26.5 35.5q-26 0 -78.5 -12.5t-83 -12.5 t-63.5 34l226 25l-46 89h51q-5 0 32 -15q-2 -19 15 -73q17 2 147 22q21 23 22 69.5t3 53.5l43 -24q33 -20 33 -29q0 2 -32 -51q6 -6 22.5 -6t52.5 10.5t50.5 10.5t41 -13.5t31.5 -22.5v-16q-11 -11 -28 -11l-104 7q-71 0 -96 -20l-68 -71q4 9 21 68zM576 -127l-10 -52 q0 -8 4 -12h-23q-12 0 -15 15q-3 61 -16 180q-2 14 -19 72q20 -3 59 -10l203 31l2 3v45q-6 6 -40 6t-50 -15q-20 18 -48 104t-45 111q120 6 171 13.5t116.5 24t80.5 16.5q30 0 83 -51q-15 -26 -45 -83q-16 -42 -66 -120q-24 21 -49.5 21t-65.5 -17v-44q8 -5 22 -3l254 28h2 q21 0 86 -43q-16 -34 -32 -146.5t-79 -166.5q-23 31 -97 112q60 -10 69 -10q51 0 51 87v94q-17 24 -55 24q-135 0 -228 -27v-56q13 -12 32 -12t57 19q-11 8 -11 33q25 -3 60 -29.5t35 -54.5t-24 -28q-11 0 -33 24.5t-29 28.5l-208 -60q-14 -4 -29.5 10t-18.5 28q44 7 130 25 q1 3 1 8v40q-3 19 -27.5 19t-147.5 -12l-13 -4v-92zM826 296l23 6q26 0 36 -26q-25 -17 -81 -31v-45h64q30 0 48 41.5t18 65.5t-8 48h-122v-52q13 -7 22 -7zM760 340l-77 -13q-7 0 -27 10l24 -158q52 5 81 15v48q-45 3 -50 0q-7 6 -17 19q2 1 67 21q-2 53 -1 58z" />
+<glyph unicode="&#x1f010;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM185 753l50 -3q37 0 107 23t118 23t116 -27.5t107 -68.5l232 47 q79 16 83 18q45 14 65.5 42.5t65.5 132.5q108 250 207 313q22 14 71 14t86 -43.5t37 -107.5t-8 -100q-19 -87 -208 -362q32 -7 49 -14q-5 -10 -46.5 -69t-41.5 -64l9 -54q0 -66 -29.5 -101.5t-96.5 -75.5l-3 -11q-27 -29 -125 -92t-113 -86.5t-19 -57.5t-7 -64 q-11 18 -36 52q-19 -16 -54 -59q-9 16 -9 33t23 73q-14 10 -71 10h-11q6 21 24.5 29t36.5 15q-9 14 -41 22q-1 13 -7 19h-7q-66 0 -133 -59q14 32 37 77q-6 3 -15.5 3t-34.5 -5t-39 -5q58 45 154.5 59.5t128.5 38.5q-154 9 -246 51t-160 127l-112 157q-43 56 -104 82 q-14 6 -127 38q54 30 97 30zM1433 1244q-8 0 -17.5 -11.5t-9.5 -19.5v-12h19q17 0 28 31q-12 12 -20 12zM1506 1151l-4 14h-3q-21 0 -21 -21q0 -11 10 -25q18 21 18 32zM1353 1187h17q24 30 36 60h-16q-25 -15 -37 -29v-31zM1392 1149v-12h17q15 22 47 64l-42 -25 q-22 -14 -22 -27zM1292 1163v-22q28 7 45 22q-4 41 0 63q-45 -53 -45 -63zM1374 1149l-4 20h-12q-19 -10 -28 -34l-16 -47h16q44 29 44 61zM1452 1099l6 -34q0 -1 -1 -7q-11 7 -20 26q-24 -40 -59 -110q8 -9 27 -22q23 34 23 39.5t-9 13.5t-9 16.5t12 12.5q9 -17 19 -22 q5 8 47 92q-8 3 -27 22q-9 -13 -9 -27zM1491 1009l6 49q0 14 -7 18l-50 -101l-1 -8q14 -14 14 -22t-3 -8q-5 9 -15 25q-22 -26 -22 -32.5t7.5 -18t7.5 -20.5l-2 -4l-25 25q-20 -20 -20 -35t24 -29q80 109 80 130l-18 29l9 9q7 -7 15 -7zM1334 1037q-49 -62 -49 -73.5 t5 -15.5h16q17 36 86 162h-8q-16 -25 -50 -73zM1278 1053v-30q23 18 50 45q-10 0 -16 -2q-9 9 -15 21q-1 -4 -10 -16.5t-9 -17.5zM1243.5 1099.5q-22.5 -40.5 -22.5 -51t5 -14.5q23 7 43.5 37t36.5 31l3 20q-24 0 -35 7q3 6 3 22q-11 -11 -33.5 -51.5zM1399 940q-4 1 -31 15 q0 -4 -12 -27q7 -6 20 -19q15 15 23 31zM1254.5 953.5q19.5 23.5 19.5 33.5t-12 32q-41 -50 -41 -55v-33q14 -1 33.5 22.5zM1358 802q14 0 34 30l-27 38l-26 -49q0 -19 19 -19zM1213 638l75 12q43 80 43 89.5t-20 27t-31 17.5t-20 -12q25 -23 25 -30.5t-5 -11.5 q-8 14 -29 20.5t-27 13.5v11q26 20 58 20t62 -43q12 12 12 23q0 -1 -35 43q42 62 42 68l-12 33q-23 -46 -75 -117l-5 9l199 365q-52 -45 -102 -151q-25 -45 -114 -220q-12 6 -13 14q-9 -2 -26 -8q-2 -1 -27 -33.5t-34 -32.5t-28 21q-5 -10 -15 -19v-62q16 -8 26 -8 q28 0 27.5 36.5t17.5 45.5v-38q9 -5 28 -14v-20q-10 -3 -24 4q4 -7 4 -21t-19 -32h42zM1238 1022q-19 -3 -21.5 -3t-8.5 7q-32 -70 -32 -81q51 35 52 54zM1221 885v-51q25 13 39 42l28 57q-9 0 -23 8q-44 -44 -44 -56zM1150 930q-29 -53 -29 -70t5 -22q55 36 55 81 q-17 11 -31 11zM1190.5 823q23.5 50 23.5 66.5t-9 33.5l-59 -142q1 -6 4 -18q17 10 40.5 60zM1108 827q-41 -74 -41 -82t2 -14q25 11 62 88q-9 0 -23 8zM1126 663q-36 0 -38 53q-10 -1 -29 -7q-12 31 -12 36.5t5 15.5l-7 9q-4 -4 -6 -34q9 -26 36 -62t46 -36q6 0 46 31 q-37 -6 -41 -6zM490 438l32 11q8 0 7 -16q-15 -12 -18 -22q38 -70 226 -108q138 -29 250 -29t184 35q93 46 93 134q0 8 -12 52l-212 -90q-108 -49 -151 -65t-109 -16q-197 0 -197 109q0 16 15 16l16 -46q9 -25 25 -26q-7 10 -7 26t16 21q9 -8 9 -20q0 14 -3 -33 q35 -14 60 -18q-21 40 -21 50t9 17q9 -22 26 -70q35 -7 58 -7q65 0 150 37l162 71q45 18 133 57q-5 -1 -285 -97q-44 -18 -134 -44l-5 2q7 14 27.5 20t39.5 11l376 145l2 7l-256 -94q-103 -38 -119.5 -38t-19.5 6q6 11 15.5 16t107.5 35q306 95 343 126q8 7 15 19l-19 5 l-407 -164l-30 6l374 157h-15q-40 0 -144.5 -29t-162.5 -58.5t-50 -29.5q-8 0 -6 9q39 39 95 59l109 38l-86 23q-14 0 -39 -12.5t-37.5 -12.5t-16.5 12q13 25 150 25h11q-40 51 -51 98l-327 -72q0 -105 -59 -145l-5 5q43 89 43 112.5t-9 38.5q-19 32 -91.5 59t-110.5 27 t-96.5 -18t-60.5 -19q9 -8 25 -25q-13 -13 -37.5 -13t-33.5 3q53 -39 81 -73l84 -122q48 -68 74 -68zM1023 251l-91 7q-11 0 -65.5 -42.5t-54.5 -50.5v-15q51 -17 61 -17q24 0 161 118h-11zM862 114q-9 0 -47 10q9 -20 31 -58q-5 -6 -27 -52q28 28 40.5 28t24.5 -19v22 q0 30 6 41q12 22 117 95t121 92h-13q-28 -13 -82 -46l-81 -69q-56 -44 -90 -44zM759 210l-36 3q-12 0 -69 -19q14 0 25 -5q0 -10 -7 -21q38 10 65 10t23 -2q6 -11 29 -19q0 28 37 55l70 51h-15q-9 0 -54 -26.5t-68 -26.5zM235 727l-53 7q-10 0 -29 -6q26 -5 77 -19z M1253 714l-17 -15q0 4 3 8q-9 9 -40 26h35zM873 567q9 -8 9 -28.5t-37 -61.5l19 35q12 21 12 34t-3 21zM825 579q0 -43 -56 -105l31 56q15 27 15 51t-3 32l7 -7q6 -6 6 -27zM761 579q0 -43 -56 -105l30 56q15 28 15 51.5t-3 31.5q14 -12 14 -34zM454 667q-18 -18 -39.5 -18 t-56.5 37q35 12 46.5 12t49.5 -15v-16z" />
+<glyph unicode="&#x1f011;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM814 1338q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4 l-102 -4q4 171 4 341.5t-4 340.5q51 -4 102 -4zM814 500q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 170 4 341t-4 341q51 -4 102 -4zM756 1059h116q0 116 3 240q-30 -1 -61 -1l-61 1q3 -124 3 -240zM872 981v40h-116v-40h116zM872 943h-116q0 -114 -3 -240 q30 1 61 1l61 -1q-3 131 -3 240zM756 221h116q0 116 3 240q-30 -1 -61 -1l-61 1q3 -124 3 -240zM872 143v40h-116v-40h116zM872 105h-116q0 -114 -3 -240q30 1 61 1l61 -1q-3 131 -3 240z" />
+<glyph unicode="&#x1f012;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM814 1338q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4 l-102 -4q4 171 4 341.5t-4 340.5q51 -4 102 -4zM1214 500q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 170 4 341t-4 341q51 -4 102 -4zM414 500q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 170 4 341t-4 341q51 -4 102 -4zM756 1059h116 q0 116 3 240q-30 -1 -61 -1l-61 1q3 -124 3 -240zM872 981v40h-116v-40h116zM872 943h-116q0 -114 -3 -240q30 1 61 1l61 -1q-3 131 -3 240zM1156 221h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM1272 143v40h-116v-40h116zM1272 105h-116q0 -114 -3 -240 q31 1 61 1l61 -1q-3 131 -3 240zM356 221h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM472 143v40h-116v-40h116zM472 105h-116q0 -114 -3 -240q31 1 61 1l61 -1q-3 131 -3 240z" />
+<glyph unicode="&#x1f013;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1214 1338q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4 l-102 -4q4 171 4 341.5t-4 340.5q51 -4 102 -4zM414 1338q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 171 4 341.5t-4 340.5q51 -4 102 -4zM1214 500q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 170 4 341t-4 341q51 -4 102 -4zM414 500 q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 170 4 341t-4 341q51 -4 102 -4zM1156 1059h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM1272 981v40h-116v-40h116zM1272 943h-116q0 -114 -3 -240q31 1 61 1l61 -1q-3 131 -3 240zM356 1059h116 q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM1156 221h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM472 981v40h-116v-40h116zM1272 143v40h-116v-40h116zM472 943h-116q0 -114 -3 -240q31 1 61 1l61 -1q-3 131 -3 240zM1272 105h-116q0 -114 -3 -240 q31 1 61 1l61 -1q-3 131 -3 240zM356 221h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM472 143v40h-116v-40h116zM472 105h-116q0 -114 -3 -240q31 1 61 1l61 -1q-3 131 -3 240z" />
+<glyph unicode="&#x1f014;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1214 1338q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4 l-102 -4q4 171 4 341.5t-4 340.5q51 -4 102 -4zM414 1338q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 171 4 341.5t-4 340.5q51 -4 102 -4zM1214 500q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 170 4 341t-4 341q51 -4 102 -4zM414 500 q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 170 4 341t-4 341q51 -4 102 -4zM1156 1059h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM1272 981v40h-116v-40h116zM1272 943h-116q0 -114 -3 -240q31 1 61 1l61 -1q-3 131 -3 240zM356 1059h116 q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM1156 221h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM472 981v40h-116v-40h116zM1272 143v40h-116v-40h116zM472 943h-116q0 -114 -3 -240q31 1 61 1l61 -1q-3 131 -3 240zM1272 105h-116q0 -114 -3 -240 q31 1 61 1l61 -1q-3 131 -3 240zM356 221h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM472 143v40h-116v-40h116zM472 105h-116q0 -114 -3 -240q31 1 61 1l61 -1q-3 131 -3 240zM814 919q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 171 4 341 t-4 341q51 -4 102 -4zM756 640h116q0 116 3 240q-30 -2 -61 -2l-61 2q3 -124 3 -240zM872 562v40h-116v-40h116zM872 524h-116q0 -114 -3 -240q30 2 61 2l61 -2q-3 131 -3 240z" />
+<glyph unicode="&#x1f015;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM814 1338q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4 l-102 -4q4 171 4 341.5t-4 340.5q51 -4 102 -4zM814 500q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 170 4 341t-4 341q51 -4 102 -4zM756 1059h116q0 116 3 240q-30 -1 -61 -1l-61 1q3 -124 3 -240zM872 981v40h-116v-40h116zM872 943h-116q0 -114 -3 -240 q30 1 61 1l61 -1q-3 131 -3 240zM756 221h116q0 116 3 240q-30 -1 -61 -1l-61 1q3 -124 3 -240zM872 143v40h-116v-40h116zM872 105h-116q0 -114 -3 -240q30 1 61 1l61 -1q-3 131 -3 240zM1214 1338q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 171 4 341.5 t-4 340.5q51 -4 102 -4zM414 1338q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 171 4 341.5t-4 340.5q51 -4 102 -4zM1214 500q51 0 102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 170 4 341t-4 341q51 -4 102 -4zM414 500q51 0 102 4 q-4 -170 -4 -341t4 -341q-51 4 -102 4l-102 -4q4 170 4 341t-4 341q51 -4 102 -4zM1156 1059h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM1272 981v40h-116v-40h116zM1272 943h-116q0 -114 -3 -240q31 1 61 1l61 -1q-3 131 -3 240zM356 1059h116q0 116 3 240 q-31 -1 -61 -1l-61 1q3 -124 3 -240zM1156 221h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM472 981v40h-116v-40h116zM1272 143v40h-116v-40h116zM472 943h-116q0 -114 -3 -240q31 1 61 1l61 -1q-3 131 -3 240zM1272 105h-116q0 -114 -3 -240q31 1 61 1l61 -1 q-3 131 -3 240zM356 221h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM472 143v40h-116v-40h116zM472 105h-116q0 -114 -3 -240q31 1 61 1l61 -1q-3 131 -3 240z" />
+<glyph unicode="&#x1f016;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM916 924q-51 4 -102 4l-102 -4q3 128 3 257t-3 259q51 -4 102 -4 l102 4q-3 -129 -3 -258t3 -258zM1316 324q-51 4 -102 4l-102 -4q3 128 3 257.5t-3 258.5q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM916 324q-51 4 -102 4l-102 -4q3 128 3 257.5t-3 258.5q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM1316 -276q-51 4 -102 4l-102 -4 q3 128 3 257t-3 259q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM516 324q-51 4 -102 4l-102 -4q3 128 3 257.5t-3 258.5q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM916 -276q-51 4 -102 4l-102 -4q3 128 3 257t-3 259q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258z M516 -276q-51 4 -102 4l-102 -4q3 128 3 257t-3 259q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM872 1240q0 14 3 157q-30 -1 -61 -1l-61 1l3 -157h116zM872 1162v40h-116v-40h116zM1272 640q0 14 3 157q-31 -1 -61 -1l-61 1l3 -157h116zM872 1124h-116q0 -11 -3 -157 q30 1 61 1l61 -1q-3 136 -3 157zM1272 562v40h-116v-40h116zM1272 524h-116q0 -11 -3 -157q31 1 61 1l61 -1q-3 136 -3 157zM872 640q0 14 3 157q-30 -1 -61 -1l-61 1l3 -157h116zM872 562v40h-116v-40h116zM1272 40q0 14 3 157q-31 -1 -61 -1l-61 1l3 -157h116zM872 524 h-116q0 -11 -3 -157q30 1 61 1l61 -1q-3 136 -3 157zM1272 -38v40h-116v-40h116zM472 640q0 14 3 157q-31 -1 -61 -1l-61 1l3 -157h116zM1272 -76h-116q0 -11 -3 -157q31 1 61 1l61 -1q-3 136 -3 157zM472 562v40h-116v-40h116zM872 40q0 14 3 157q-30 -1 -61 -1l-61 1 l3 -157h116zM472 524h-116q0 -11 -3 -157q31 1 61 1l61 -1q-3 136 -3 157zM872 -38v40h-116v-40h116zM872 -76h-116q0 -11 -3 -157q30 1 61 1l61 -1q-3 136 -3 157zM472 40q0 14 3 157q-31 -1 -61 -1l-61 1l3 -157h116zM472 -38v40h-116v-40h116zM472 -76h-116 q0 -11 -3 -157q31 1 61 1l61 -1q-3 136 -3 157z" />
+<glyph unicode="&#x1f017;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM414 1338q51 0 102 4q-4 -177 -4 -358l244 355q27 -22 58 -45 q31 23 58 45l244 -355q0 187 -4 358q51 -4 102 -4t102 4q-4 -170 -4 -340.5t4 -341.5q-51 4 -102 4l-102 -4v16l-16 -13l-282 409l-282 -409l-16 13v-16q-51 4 -102 4l-102 -4q4 171 4 341.5t-4 340.5q51 -4 102 -4zM1214 -174q-51 0 -102 -4q4 177 4 358l-244 -355 q-27 22 -58 45q-31 -23 -58 -45l-244 355q0 -187 4 -358q-51 4 -102 4t-102 -4q4 170 4 341t-4 341q51 -4 102 -4l102 4v-16l16 13l282 -409l282 409l16 -13v16q51 -4 102 -4l102 4q-4 -170 -4 -341t4 -341q-51 4 -102 4zM1156 1059h116q0 116 3 240q-31 -1 -61 -1l-61 1 q3 -124 3 -240zM1272 981v40h-116v-40h116zM887 1244l-24 36l-14 -11zM1272 943h-116q0 -93 -3 -240q31 1 61 1l61 -1q-3 126 -3 240zM998 1082l-86 125l-74 -101l65 -91zM1043 1018l-23 33l-95 -67l23 -33zM1116 915l-51 72l-95 -67l135 -198l8 6zM865 1210q-52 33 -100 70 l-135 -198l95 -67zM703 984l-95 67l-23 -33l95 -67zM356 1059h116q0 116 3 240q-31 -1 -61 -1l-61 1q3 -124 3 -240zM1156 221h116q0 114 3 240q-31 -1 -61 -1l-61 1q3 -131 3 -240zM658 920l-95 67l-51 -72q0 -39 3 -187l8 -6zM472 981v40h-116v-40h116zM1272 143v40h-116 v-40h116zM1116 249q0 39 -3 187l-8 6l-135 -198l95 -67zM472 943h-116q0 -114 -3 -240q31 1 61 1l61 -1q-3 131 -3 240zM1272 105h-116q0 -116 -3 -240q31 1 61 1l61 -1q-3 124 -3 240zM1043 146l-95 67l-23 -33l95 -67zM998 82l-95 67l-140 -195q52 -33 100 -70zM658 244 l-135 198l-8 -6l-3 -187l51 -72zM703 180l-23 33l-95 -67l23 -33zM790 58l-65 91l-95 -67l86 -125zM356 221h116q0 93 3 240q-31 -1 -61 -1l-61 1q3 -126 3 -240zM779 -105l-38 25l24 -36zM472 143v40h-116v-40h116zM472 105h-116q0 -116 -3 -240q31 1 61 1l61 -1 q-3 124 -3 240z" />
+<glyph unicode="&#x1f018;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1316 924q-51 4 -102 4l-102 -4q3 128 3 257t-3 259 q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM916 924q-51 4 -102 4l-102 -4q3 128 3 257t-3 259q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM1316 324q-51 4 -102 4l-102 -4q3 128 3 257.5t-3 258.5q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM516 924q-51 4 -102 4 l-102 -4q3 128 3 257t-3 259q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM916 324q-51 4 -102 4l-102 -4q3 128 3 257.5t-3 258.5q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM1316 -276q-51 4 -102 4l-102 -4q3 128 3 257t-3 259q51 -4 102 -4l102 4q-3 -129 -3 -258 t3 -258zM516 324q-51 4 -102 4l-102 -4q3 128 3 257.5t-3 258.5q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM916 -276q-51 4 -102 4l-102 -4q3 128 3 257t-3 259q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM516 -276q-51 4 -102 4l-102 -4q3 128 3 257t-3 259 q51 -4 102 -4l102 4q-3 -129 -3 -258t3 -258zM1272 1240q0 14 3 157q-31 -1 -61 -1l-61 1l3 -157h116zM1272 1162v40h-116v-40h116zM1272 1124h-116q0 -11 -3 -157q31 1 61 1l61 -1q-3 136 -3 157zM872 1240q0 14 3 157q-30 -1 -61 -1l-61 1l3 -157h116zM872 1162v40h-116 v-40h116zM1272 640q0 14 3 157q-31 -1 -61 -1l-61 1l3 -157h116zM872 1124h-116q0 -11 -3 -157q30 1 61 1l61 -1q-3 136 -3 157zM1272 562v40h-116v-40h116zM472 1240q0 14 3 157q-31 -1 -61 -1l-61 1l3 -157h116zM1272 524h-116q0 -11 -3 -157q31 1 61 1l61 -1 q-3 136 -3 157zM472 1162v40h-116v-40h116zM872 640q0 14 3 157q-30 -1 -61 -1l-61 1l3 -157h116zM472 1124h-116q0 -11 -3 -157q31 1 61 1l61 -1q-3 136 -3 157zM872 562v40h-116v-40h116zM1272 40q0 14 3 157q-31 -1 -61 -1l-61 1l3 -157h116zM872 524h-116q0 -11 -3 -157 q30 1 61 1l61 -1q-3 136 -3 157zM1272 -38v40h-116v-40h116zM472 640q0 14 3 157q-31 -1 -61 -1l-61 1l3 -157h116zM1272 -76h-116q0 -11 -3 -157q31 1 61 1l61 -1q-3 136 -3 157zM472 562v40h-116v-40h116zM872 40q0 14 3 157q-30 -1 -61 -1l-61 1l3 -157h116zM472 524 h-116q0 -11 -3 -157q31 1 61 1l61 -1q-3 136 -3 157zM872 -38v40h-116v-40h116zM872 -76h-116q0 -11 -3 -157q30 1 61 1l61 -1q-3 136 -3 157zM472 40q0 14 3 157q-31 -1 -61 -1l-61 1l3 -157h116zM472 -38v40h-116v-40h116zM472 -76h-116q0 -11 -3 -157q31 1 61 1l61 -1 q-3 136 -3 157z" />
+<glyph unicode="&#x1f019;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1370 577q0 -230 -163 -393t-393 -163t-393 163t-163 393 t163 393t393 163t393 -163t163 -393zM1330 577q0 214 -151 365t-365 151t-365 -151t-151 -365t151 -365t365 -151t365 151t151 365zM1270 577q0 -189 -133.5 -322.5t-322.5 -133.5t-322.5 133.5t-133.5 322.5t133.5 322.5t322.5 133.5t322.5 -133.5t133.5 -322.5zM1230 577 q0 172 -122 294t-294 122t-294 -122t-122 -294t122 -294t294 -122t294 122t122 294zM1206 574q0 -50 -32.5 -80.5t-83.5 -30.5h-79q56 -96 56 -135.5t-35 -73.5t-83.5 -34t-83.5 44q-9 11 -51 85q-42 -74 -52 -86q-34 -41 -83 -41t-84.5 32t-35.5 71t58 138h-79 q-50 0 -83 33.5t-33 83.5t32.5 80.5t83.5 30.5h79q-56 96 -56 135.5t35 73.5t83.5 34t83.5 -44q9 -11 51 -85q42 74 52 86q34 41 83 41t84.5 -32t35.5 -71t-58 -138h79q50 0 83 -33.5t33 -83.5zM1166 577q0 74 -76 74h-148l74 128q13 22 13 47t-23.5 45.5t-59 20.5 t-58.5 -39l-74 -128l-74 128q-24 41 -58 41t-57.5 -22t-23.5 -48t11 -45l74 -128h-148q-76 0 -76 -74t76 -74h148l-74 -128q-13 -22 -13 -47t23.5 -45.5t59 -20.5t58.5 39l74 128l74 -128q24 -41 58 -41t57.5 22t23.5 48t-11 45l-74 128h148q76 0 76 74zM934 577 q0 -50 -35 -85t-85 -35t-85 35t-35 85t35 85t85 35t85 -35t35 -85zM894 577q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM854 577q0 -40 -40 -40t-40 40t40 40t40 -40z" />
+<glyph unicode="&#x1f01a;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1231 1027q0 -173 -122 -295t-295 -122t-295 122t-122 295 t122 295t295 122t295 -122t122 -295zM1231 127q0 -173 -122 -295t-295 -122t-295 122t-122 295t122 295t295 122t295 -122t122 -295zM1201 1027q0 160 -113.5 273.5t-273.5 113.5t-273.5 -113.5t-113.5 -273.5t113.5 -273.5t273.5 -113.5t273.5 113.5t113.5 273.5zM1201 127 q0 160 -113.5 273.5t-273.5 113.5t-273.5 -113.5t-113.5 -273.5t113.5 -273.5t273.5 -113.5t273.5 113.5t113.5 273.5zM1156 1027q0 -142 -100 -242t-242 -100t-242 100t-100 242t100 242t242 100t242 -100t100 -242zM1156 127q0 -142 -100 -242t-242 -100t-242 100 t-100 242t100 242t242 100t242 -100t100 -242zM1126 1027q0 129 -91.5 220.5t-220.5 91.5t-220.5 -91.5t-91.5 -220.5t91.5 -220.5t220.5 -91.5t220.5 91.5t91.5 220.5zM1126 127q0 129 -91.5 220.5t-220.5 91.5t-220.5 -91.5t-91.5 -220.5t91.5 -220.5t220.5 -91.5 t220.5 91.5t91.5 220.5zM1108 1025q0 -83 -87 -83h-59q42 -72 42 -102t-26.5 -55.5t-62.5 -25.5t-63 33q-6 8 -38 64q-31 -55 -39 -64q-26 -31 -62.5 -31t-63.5 24t-27 52.5t44 103.5l-59 1q-87 1 -87 86t87 85h59q-42 72 -42 101.5t26.5 55t62.5 25.5t63 -33q6 -8 38 -64 q31 55 39 64q26 31 62.5 31t63.5 -24t27 -52.5t-44 -103.5h59q38 0 62.5 -25t24.5 -63zM1108 125q0 -83 -87 -83h-59q42 -72 42 -102t-26.5 -55.5t-62.5 -25.5t-63 33q-6 8 -38 64q-31 -55 -39 -64q-26 -31 -62.5 -31t-63.5 24t-27 52.5t44 103.5l-59 1q-87 1 -87 86t87 85 h59q-42 72 -42 101.5t26.5 55t62.5 25.5t63 -33q6 -8 38 -64q31 55 39 64q26 31 62.5 31t63.5 -24t27 -52.5t-44 -103.5h59q38 0 62.5 -25t24.5 -63zM1021 972q57 0 57 55.5t-57 55.5h-111l56 96q9 15 9 34t-18 34.5t-44 15.5t-43 -29l-56 -96l-55 96q-18 31 -46 31 q-59 0 -59 -56q0 -14 9 -30l55 -96h-111q-57 0 -57 -55t57 -56l111 -1l-55 -95q-10 -17 -10 -35.5t18 -34t44.5 -15.5t43.5 29l55 96l56 -96q18 -31 45 -31q59 0 59 56q0 17 -8 31l-56 96h111zM1021 72q57 0 57 55.5t-57 55.5h-111l56 96q9 15 9 34t-18 34.5t-44 15.5 t-43 -29l-56 -96l-55 96q-18 31 -46 31q-59 0 -59 -56q0 -14 9 -30l55 -96h-111q-57 0 -57 -55t57 -56l111 -1l-55 -95q-10 -17 -10 -35.5t18 -34t44.5 -15.5t43.5 29l55 96l56 -96q18 -31 45 -31q59 0 59 56q0 17 -8 31l-56 96h111zM904 1027q0 -37 -26.5 -63.5 t-63.5 -26.5t-63.5 26.5t-26.5 63.5t26.5 63.5t63.5 26.5t63.5 -26.5t26.5 -63.5zM904 127q0 -37 -26.5 -63.5t-63.5 -26.5t-63.5 26.5t-26.5 63.5t26.5 63.5t63.5 26.5t63.5 -26.5t26.5 -63.5zM874 1027q0 60 -60 60t-60 -60t60 -60t60 60zM874 127q0 60 -60 60t-60 -60 t60 -60t60 60zM844 1027q0 -30 -30 -30t-30 30t30 30t30 -30zM844 127q0 -30 -30 -30t-30 30t30 30t30 -30z" />
+<glyph unicode="&#x1f01b;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM792 1177q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5 t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM1092 577q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM1392 -23q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5 t196.5 81.5t196.5 -81.5t81.5 -196.5zM772 1177q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM1072 577q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5 t75.5 182.5zM1372 -23q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM742 1177q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM1042 577q0 -94 -67 -161t-161 -67t-161 67t-67 161 t67 161t161 67t161 -67t67 -161zM1342 -23q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM722 1177q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM1022 577q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61 t147 61t61 147zM1322 -23q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM710 1175q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64 q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM1010 575q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65 q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM1310 -25q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54 q0 -17 -29 -66h39q58 0 58 -59zM690 1177q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64 q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM990 577q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35 q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM1290 -23q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64 q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM574 1177q0 -60 -60 -60t-60 60t60 60t60 -60zM874 577q0 -60 -60 -60t-60 60t60 60t60 -60zM1174 -23q0 -60 -60 -60t-60 60t60 60t60 -60zM554 1177 q0 40 -40 40t-40 -40t40 -40t40 40zM854 577q0 40 -40 40t-40 -40t40 -40t40 40zM1154 -23q0 40 -40 40t-40 -40t40 -40t40 40zM534 1177q0 -20 -20 -20t-20 20t20 20t20 -20zM834 577q0 -20 -20 -20t-20 20t20 20t20 -20zM1134 -23q0 -20 -20 -20t-20 20t20 20t20 -20z" />
+<glyph unicode="&#x1f01c;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1392 897q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5 t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM792 897q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM1392 257q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5 t196.5 81.5t196.5 -81.5t81.5 -196.5zM792 257q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM1372 897q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5 t75.5 182.5zM772 897q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM1372 257q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM772 257 q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM1342 897q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM742 897q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67 t67 -161zM1342 257q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM742 257q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM1322 897q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147z M722 897q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM1322 257q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM722 257q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM1310 895 q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM710 895q0 -55 -58 -55h-39 q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM1310 255q0 -55 -58 -55h-39q28 -48 28 -64 q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM710 255q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58 q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM1290 897q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64 l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM690 897q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35 q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM1290 257q0 37 -38 37h-74l37 64 q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM690 257 q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74 q38 0 38 37zM1174 897q0 -60 -60 -60t-60 60t60 60t60 -60zM574 897q0 -60 -60 -60t-60 60t60 60t60 -60zM1174 257q0 -60 -60 -60t-60 60t60 60t60 -60zM574 257q0 -60 -60 -60t-60 60t60 60t60 -60zM1154 897q0 40 -40 40t-40 -40t40 -40t40 40zM554 897q0 40 -40 40 t-40 -40t40 -40t40 40zM1154 257q0 40 -40 40t-40 -40t40 -40t40 40zM554 257q0 40 -40 40t-40 -40t40 -40t40 40zM1134 897q0 -20 -20 -20t-20 20t20 20t20 -20zM534 897q0 -20 -20 -20t-20 20t20 20t20 -20zM1134 257q0 -20 -20 -20t-20 20t20 20t20 -20zM534 257 q0 -20 -20 -20t-20 20t20 20t20 -20z" />
+<glyph unicode="&#x1f01d;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1392 1177q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5 t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM792 1177q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM1092 577q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5 t196.5 81.5t196.5 -81.5t81.5 -196.5zM1392 -23q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM792 -23q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5 t81.5 -196.5zM1372 1177q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM772 1177q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM1072 577 q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM1372 -23q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM772 -23q0 107 -75.5 182.5t-182.5 75.5 t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM1342 1177q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM742 1177q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM1042 577 q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM1342 -23q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM742 -23q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM1322 1177q0 86 -61 147 t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM722 1177q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM1022 577q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM1322 -23q0 86 -61 147t-147 61t-147 -61 t-61 -147t61 -147t147 -61t147 61t61 147zM722 -23q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM1310 1175q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59 q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM710 1175q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39 q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM1010 575q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64 q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM1310 -25q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65 q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM710 -25q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54 q0 -17 -29 -66h39q58 0 58 -59zM1290 1177q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64 q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM690 1177q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35 q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM990 577q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64 q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM1290 -23q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74 q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM690 -23q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38 q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM1174 1177q0 -60 -60 -60t-60 60t60 60t60 -60zM574 1177q0 -60 -60 -60t-60 60t60 60t60 -60z M874 577q0 -60 -60 -60t-60 60t60 60t60 -60zM1174 -23q0 -60 -60 -60t-60 60t60 60t60 -60zM574 -23q0 -60 -60 -60t-60 60t60 60t60 -60zM1154 1177q0 40 -40 40t-40 -40t40 -40t40 40zM554 1177q0 40 -40 40t-40 -40t40 -40t40 40zM854 577q0 40 -40 40t-40 -40t40 -40 t40 40zM1154 -23q0 40 -40 40t-40 -40t40 -40t40 40zM554 -23q0 40 -40 40t-40 -40t40 -40t40 40zM1134 1177q0 -20 -20 -20t-20 20t20 20t20 -20zM534 1177q0 -20 -20 -20t-20 20t20 20t20 -20zM834 577q0 -20 -20 -20t-20 20t20 20t20 -20zM1134 -23q0 -20 -20 -20t-20 20 t20 20t20 -20zM534 -23q0 -20 -20 -20t-20 20t20 20t20 -20z" />
+<glyph unicode="&#x1f01e;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1392 1177q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5 t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM792 1177q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM1392 577q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5 t196.5 81.5t196.5 -81.5t81.5 -196.5zM792 577q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM1392 -23q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5 t81.5 -196.5zM792 -23q0 -115 -81.5 -196.5t-196.5 -81.5t-196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5t196.5 -81.5t81.5 -196.5zM1372 1177q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM772 1177 q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM1372 577q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM772 577q0 107 -75.5 182.5t-182.5 75.5 t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM1372 -23q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM772 -23q0 107 -75.5 182.5t-182.5 75.5t-182.5 -75.5t-75.5 -182.5 t75.5 -182.5t182.5 -75.5t182.5 75.5t75.5 182.5zM1342 1177q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM742 1177q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM1342 577q0 -94 -67 -161t-161 -67t-161 67 t-67 161t67 161t161 67t161 -67t67 -161zM742 577q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM1342 -23q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161t161 67t161 -67t67 -161zM742 -23q0 -94 -67 -161t-161 -67t-161 67t-67 161t67 161 t161 67t161 -67t67 -161zM1322 1177q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM722 1177q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM1322 577q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61 t61 147zM722 577q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM1322 -23q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM722 -23q0 86 -61 147t-147 61t-147 -61t-61 -147t61 -147t147 -61t147 61t61 147zM1310 1175 q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM710 1175q0 -55 -58 -55h-39 q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM1310 575q0 -55 -58 -55h-39q28 -48 28 -64 q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM710 575q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58 q-30 0 -67 65q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM1310 -25q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65 q-36 -63 -68 -63q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM710 -25q0 -55 -58 -55h-39q28 -48 28 -64q0 -58 -60 -58q-30 0 -67 65q-36 -63 -68 -63 q-60 0 -60 54q0 17 29 66h-39q-58 0 -58 59q0 55 58 55h39q-28 48 -28 64q0 58 60 58q30 0 67 -65q36 63 68 63q60 0 60 -54q0 -17 -29 -66h39q58 0 58 -59zM1290 1177q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21 q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM690 1177q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64 l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM1290 577q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35 q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM690 577q0 37 -38 37h-74l37 64 q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74q38 0 38 37zM1290 -23 q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38q0 10 -6 20l-37 64h74 q38 0 38 37zM690 -23q0 37 -38 37h-74l37 64q7 12 7 22q0 35 -39 35q-20 0 -32 -20l-37 -64l-37 64q-12 21 -30 21q-40 0 -40 -38q0 -10 6 -20l37 -64h-74q-38 0 -38 -37t38 -37h74l-37 -64q-7 -12 -7 -22q0 -35 39 -35q20 0 32 20l37 64l37 -64q12 -21 30 -21q40 0 40 38 q0 10 -6 20l-37 64h74q38 0 38 37zM1174 1177q0 -60 -60 -60t-60 60t60 60t60 -60zM574 1177q0 -60 -60 -60t-60 60t60 60t60 -60zM1174 577q0 -60 -60 -60t-60 60t60 60t60 -60zM574 577q0 -60 -60 -60t-60 60t60 60t60 -60zM1174 -23q0 -60 -60 -60t-60 60t60 60t60 -60z M574 -23q0 -60 -60 -60t-60 60t60 60t60 -60zM1154 1177q0 40 -40 40t-40 -40t40 -40t40 40zM554 1177q0 40 -40 40t-40 -40t40 -40t40 40zM1154 577q0 40 -40 40t-40 -40t40 -40t40 40zM554 577q0 40 -40 40t-40 -40t40 -40t40 40zM1154 -23q0 40 -40 40t-40 -40t40 -40 t40 40zM554 -23q0 40 -40 40t-40 -40t40 -40t40 40zM1134 1177q0 -20 -20 -20t-20 20t20 20t20 -20zM534 1177q0 -20 -20 -20t-20 20t20 20t20 -20zM1134 577q0 -20 -20 -20t-20 20t20 20t20 -20zM534 577q0 -20 -20 -20t-20 20t20 20t20 -20zM1134 -23q0 -20 -20 -20 t-20 20t20 20t20 -20zM534 -23q0 -20 -20 -20t-20 20t20 20t20 -20z" />
+<glyph unicode="&#x1f01f;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1499 945q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5 t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM1031 1095q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM563 1245q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5 t153.5 63.5t153.5 -63.5t63.5 -153.5zM1331 445q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM1331 -55q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5 t63.5 -153.5zM731 445q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM731 -55q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM1483 945 q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM1015 1095q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM547 1245q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM1315 445q0 83 -59 142 t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM1315 -55q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM715 445q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM715 -55q0 83 -59 142t-142 59t-142 -59 t-59 -142t59 -142t142 -59t142 59t59 142zM1460 945q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM992 1095q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM524 1245q0 -74 -52 -126t-126 -52t-126 52t-52 126 t52 126t126 52t126 -52t52 -126zM1292 445q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM1292 -55q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM692 445q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52 t126 -52t52 -126zM692 -55q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM1444 945q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM976 1095q0 67 -47.5 114.5t-114.5 47.5 t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM508 1245q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM1276 445q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5 t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM1276 -55q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM676 445q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5 t114.5 47.5t47.5 114.5zM676 -55q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM1390 989q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31 q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM922 1139q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31 q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM454 1289q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45 q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM1222 489q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49 q47 0 47 -42q0 -13 -23 -52h31zM1222 -11q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31z M622 489q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM622 -11q45 0 45 -44t-45 -44h-31 q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM1419 945q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15 l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM951 1095q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27 q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM483 1245q0 29 -29 29h-58l29 50 q5 9 5 17q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM1251 445 q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58 q29 0 29 29zM1251 -55q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30 q0 8 -4 15l-29 50h58q29 0 29 29zM651 445q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50 q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM651 -55q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15 l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM1329 945q0 -47 -47 -47t-47 47t47 47t47 -47zM861 1095q0 -47 -47 -47t-47 47t47 47t47 -47zM393 1245q0 -47 -47 -47t-47 47t47 47t47 -47zM1161 445q0 -47 -47 -47t-47 47t47 47t47 -47zM1161 -55 q0 -47 -47 -47t-47 47t47 47t47 -47zM561 445q0 -47 -47 -47t-47 47t47 47t47 -47zM561 -55q0 -47 -47 -47t-47 47t47 47t47 -47zM1313 945q0 31 -31 31t-31 -31t31 -31t31 31zM845 1095q0 31 -31 31t-31 -31t31 -31t31 31zM377 1245q0 31 -31 31t-31 -31t31 -31t31 31z M1145 445q0 31 -31 31t-31 -31t31 -31t31 31zM1145 -55q0 31 -31 31t-31 -31t31 -31t31 31zM545 445q0 31 -31 31t-31 -31t31 -31t31 31zM545 -55q0 31 -31 31t-31 -31t31 -31t31 31zM1298 945q0 -16 -16 -16t-16 16t16 16t16 -16zM830 1095q0 -16 -16 -16t-16 16t16 16 t16 -16zM362 1245q0 -16 -16 -16t-16 16t16 16t16 -16zM1130 445q0 -16 -16 -16t-16 16t16 16t16 -16zM1130 -55q0 -16 -16 -16t-16 16t16 16t16 -16zM530 445q0 -16 -16 -16t-16 16t16 16t16 -16zM530 -55q0 -16 -16 -16t-16 16t16 16t16 -16z" />
+<glyph unicode="&#x1f020;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1306 1266q0 -88 -62.5 -150t-150.5 -62t-150 62t-62 150 t62 150.5t150 62.5t150.5 -62.5t62.5 -150.5zM1306 808q0 -88 -62.5 -150.5t-150.5 -62.5t-150 62.5t-62 150.5t62 150t150 62t150.5 -62t62.5 -150zM747 1266q0 -88 -62 -150t-150 -62t-150.5 62t-62.5 150t62.5 150.5t150.5 62.5t150 -62.5t62 -150.5zM1306 349 q0 -88 -62.5 -150.5t-150.5 -62.5t-150 62.5t-62 150.5t62 150t150 62t150.5 -62t62.5 -150zM747 808q0 -88 -62 -150.5t-150 -62.5t-150.5 62.5t-62.5 150.5t62.5 150t150.5 62t150 -62t62 -150zM1306 -110q0 -88 -62.5 -150t-150.5 -62t-150 62t-62 150t62 150.5t150 62.5 t150.5 -62.5t62.5 -150.5zM747 349q0 -88 -62 -150.5t-150 -62.5t-150.5 62.5t-62.5 150.5t62.5 150t150.5 62t150 -62t62 -150zM747 -110q0 -88 -62 -150t-150 -62t-150.5 62t-62.5 150t62.5 150.5t150.5 62.5t150 -62.5t62 -150.5zM1291 1266q0 82 -58 139.5t-140 57.5 t-139.5 -57.5t-57.5 -139.5t57.5 -139.5t139.5 -57.5t140 57.5t58 139.5zM1291 808q0 82 -58 139.5t-140 57.5t-139.5 -57.5t-57.5 -139.5t57.5 -140t139.5 -58t140 58t58 140zM732 1266q0 82 -57.5 139.5t-139.5 57.5t-140 -57.5t-58 -139.5t58 -139.5t140 -57.5 t139.5 57.5t57.5 139.5zM1291 349q0 82 -58 139.5t-140 57.5t-139.5 -57.5t-57.5 -139.5t57.5 -139.5t139.5 -57.5t140 57.5t58 139.5zM732 808q0 82 -57.5 139.5t-139.5 57.5t-140 -57.5t-58 -139.5t58 -140t140 -58t139.5 58t57.5 140zM1291 -110q0 82 -58 139.5 t-140 57.5t-139.5 -57.5t-57.5 -139.5t57.5 -139.5t139.5 -57.5t140 57.5t58 139.5zM732 349q0 82 -57.5 139.5t-139.5 57.5t-140 -57.5t-58 -139.5t58 -139.5t140 -57.5t139.5 57.5t57.5 139.5zM732 -110q0 82 -57.5 139.5t-139.5 57.5t-140 -57.5t-58 -139.5t58 -139.5 t140 -57.5t139.5 57.5t57.5 139.5zM1268 1266q0 -72 -51.5 -123t-123.5 -51t-123 51t-51 123t51 123.5t123 51.5t123.5 -51.5t51.5 -123.5zM1268 808q0 -72 -51.5 -123.5t-123.5 -51.5t-123 51.5t-51 123.5t51 123t123 51t123.5 -51t51.5 -123zM709 1266q0 -72 -51 -123 t-123 -51t-123.5 51t-51.5 123t51.5 123.5t123.5 51.5t123 -51.5t51 -123.5zM1268 349q0 -72 -51.5 -123t-123.5 -51t-123 51t-51 123t51 123t123 51t123.5 -51t51.5 -123zM709 808q0 -72 -51 -123.5t-123 -51.5t-123.5 51.5t-51.5 123.5t51.5 123t123.5 51t123 -51t51 -123 zM1268 -110q0 -72 -51.5 -123t-123.5 -51t-123 51t-51 123t51 123t123 51t123.5 -51t51.5 -123zM709 349q0 -72 -51 -123t-123 -51t-123.5 51t-51.5 123t51.5 123t123.5 51t123 -51t51 -123zM709 -110q0 -72 -51 -123t-123 -51t-123.5 51t-51.5 123t51.5 123t123.5 51 t123 -51t51 -123zM1252 1266q0 66 -46.5 112.5t-112.5 46.5t-112.5 -46.5t-46.5 -112.5t46.5 -112.5t112.5 -46.5t112.5 46.5t46.5 112.5zM1252 808q0 66 -46.5 112.5t-112.5 46.5t-112.5 -46.5t-46.5 -112.5t46.5 -113t112.5 -47t112.5 47t46.5 113zM694 1266 q0 66 -46.5 112.5t-112.5 46.5t-112.5 -46.5t-46.5 -112.5t46.5 -112.5t112.5 -46.5t112.5 46.5t46.5 112.5zM1252 349q0 66 -46.5 112.5t-112.5 46.5t-112.5 -46.5t-46.5 -112.5t46.5 -112.5t112.5 -46.5t112.5 46.5t46.5 112.5zM694 808q0 66 -46.5 112.5t-112.5 46.5 t-112.5 -46.5t-46.5 -112.5t46.5 -113t112.5 -47t112.5 47t46.5 113zM1252 -110q0 66 -46.5 112.5t-112.5 46.5t-112.5 -46.5t-46.5 -112.5t46.5 -112.5t112.5 -46.5t112.5 46.5t46.5 112.5zM694 349q0 66 -46.5 112.5t-112.5 46.5t-112.5 -46.5t-46.5 -112.5t46.5 -112.5 t112.5 -46.5t112.5 46.5t46.5 112.5zM694 -110q0 66 -46.5 112.5t-112.5 46.5t-112.5 -46.5t-46.5 -112.5t46.5 -112.5t112.5 -46.5t112.5 46.5t46.5 112.5zM1243 1265q0 -42 -44 -42h-30q21 -36 21 -49q0 -44 -45 -44q-24 0 -52 49q-27 -48 -52 -48q-45 0 -45 42 q0 12 22 50h-30q-45 0 -45 43.5t45 43.5h30q-21 36 -21 49q0 44 45 44q23 0 51 -50q28 49 53 49q45 0 45 -42q0 -12 -22 -50h30q44 0 44 -45zM1243 806q0 -42 -44 -42h-30q21 -36 21 -49q0 -44 -45 -44q-24 0 -52 49q-27 -48 -52 -48q-45 0 -45 42q0 12 22 50h-30 q-45 0 -45 45q0 42 45 42h30q-21 36 -21 49q0 44 45 44q23 0 51 -49q27 48 53 48q45 0 45 -42q0 -12 -22 -50h30q44 0 44 -45zM685 1265q0 -42 -45 -42h-30q21 -36 21 -49q0 -44 -45 -44q-23 0 -51 49q-27 -48 -53 -48q-45 0 -45 42q0 12 22 50h-30q-44 0 -44 43.5t44 43.5 h30q-21 36 -21 49q0 44 45 44q24 0 52 -50q28 49 52 49q45 0 45 -42q0 -12 -22 -50h30q45 0 45 -45zM1199 392q44 0 44 -43.5t-44 -43.5h-30q21 -36 21 -49q0 -44 -45 -44q-24 0 -52 50q-28 -49 -52 -49q-45 0 -45 42q0 12 22 50h-30q-45 0 -45 45q0 42 45 42h30 q-21 36 -21 49q0 44 45 44q23 0 51 -49q27 48 53 48q45 0 45 -41q0 -13 -22 -51h30zM685 806q0 -42 -45 -42h-30q21 -36 21 -49q0 -44 -45 -44q-23 0 -51 49q-27 -48 -53 -48q-45 0 -45 42q0 12 22 50h-30q-44 0 -44 45q0 42 44 42h30q-21 36 -21 49q0 44 45 44q24 0 52 -49 q27 48 52 48q45 0 45 -42q0 -12 -22 -50h30q45 0 45 -45zM1243 -111q0 -42 -44 -42h-30q21 -36 21 -49q0 -44 -45 -44q-24 0 -52 49q-27 -48 -52 -48q-45 0 -45 41q0 13 22 51h-30q-45 0 -45 43.5t45 43.5h30q-21 36 -21 49q0 44 45 44q23 0 51 -50q28 49 53 49q45 0 45 -42 q0 -12 -22 -50h30q44 0 44 -45zM640 392q45 0 45 -43.5t-45 -43.5h-30q21 -36 21 -49q0 -44 -45 -44q-23 0 -51 50q-28 -49 -53 -49q-45 0 -45 42q0 12 22 50h-30q-44 0 -44 45q0 42 44 42h30q-21 36 -21 49q0 44 45 44q24 0 52 -49q27 48 52 48q45 0 45 -41q0 -13 -22 -51 h30zM685 -111q0 -42 -45 -42h-30q21 -36 21 -49q0 -44 -45 -44q-23 0 -51 49q-27 -48 -53 -48q-45 0 -45 41q0 13 22 51h-30q-44 0 -44 43.5t44 43.5h30q-21 36 -21 49q0 44 45 44q24 0 52 -50q28 49 52 49q45 0 45 -42q0 -12 -22 -50h30q45 0 45 -45zM1199 1238 q29 0 29 28.5t-29 28.5h-57l29 48q5 8 5 17q0 27 -30 27q-15 0 -24 -15l-29 -49l-28 49q-9 15 -23 15q-30 0 -30 -28q0 -9 4 -16l28 -48h-56q-29 0 -29 -28.5t29 -28.5h56l-28 -49q-5 -9 -5 -17q0 -26 29 -26q16 0 25 15l28 49l29 -49q9 -16 23 -16q30 0 30 29q0 8 -4 15 l-29 49h57zM1199 779q29 0 29 28.5t-29 28.5h-57l29 49q5 8 5 16q0 27 -30 27q-15 0 -24 -15l-29 -49l-28 49q-9 16 -23 16q-30 0 -30 -29q0 -8 4 -15l28 -49h-56q-29 0 -29 -28.5t29 -28.5h56l-28 -49q-5 -9 -5 -16q0 -27 29 -27q16 0 25 15l28 49l29 -49q9 -16 23 -16 q30 0 30 29q0 8 -4 15l-29 49h57zM640 1238q29 0 29 28.5t-29 28.5h-56l28 48q5 9 5 17q0 27 -29 27q-16 0 -25 -15l-28 -49l-29 49q-9 15 -23 15q-30 0 -30 -28q0 -9 4 -16l29 -48h-57q-29 0 -29 -28.5t29 -28.5h57l-29 -49q-5 -8 -5 -17q0 -26 30 -26q15 0 24 15l29 49 l28 -49q9 -16 23 -16q30 0 30 29q0 8 -4 15l-28 49h56zM1228 349q0 28 -29 28h-57l29 49q5 8 5 17q0 26 -30 26q-15 0 -24 -15l-29 -49l-28 49q-9 16 -23 16q-30 0 -30 -29q0 -8 4 -15l28 -49h-56q-29 0 -29 -28t29 -28h56l-28 -49q-5 -9 -5 -17q0 -27 29 -27q16 0 25 15 l28 49l29 -49q9 -15 23 -15q30 0 30 28q0 9 -4 16l-29 49h57q29 0 29 28zM640 779q29 0 29 28.5t-29 28.5h-56l28 49q5 9 5 16q0 27 -29 27q-16 0 -25 -15l-28 -49l-29 49q-9 16 -23 16q-30 0 -30 -29q0 -8 4 -15l29 -49h-57q-29 0 -29 -28.5t29 -28.5h57l-29 -49 q-5 -8 -5 -16q0 -27 30 -27q15 0 24 15l29 49l28 -49q9 -16 23 -16q30 0 30 29q0 8 -4 15l-28 49h56zM1228 -110q0 28 -29 28h-57l29 49q5 8 5 17q0 27 -30 27q-15 0 -24 -15l-29 -49l-28 49q-9 15 -23 15q-30 0 -30 -28q0 -9 4 -16l28 -49h-56q-29 0 -29 -28t29 -28h56 l-28 -49q-5 -9 -5 -17q0 -26 29 -26q16 0 25 15l28 49l29 -49q9 -16 23 -16q30 0 30 29q0 8 -4 15l-29 49h57q29 0 29 28zM669 349q0 28 -29 28h-56l28 49q5 9 5 17q0 26 -29 26q-16 0 -25 -15l-28 -49l-29 49q-9 16 -23 16q-30 0 -30 -29q0 -8 4 -15l29 -49h-57 q-29 0 -29 -28t29 -28h57l-29 -49q-5 -8 -5 -17q0 -27 30 -27q15 0 24 15l29 49l28 -49q9 -15 23 -15q30 0 30 28q0 9 -4 16l-28 49h56q29 0 29 28zM669 -110q0 28 -29 28h-56l28 49q5 9 5 17q0 27 -29 27q-16 0 -25 -15l-28 -49l-29 49q-9 15 -23 15q-30 0 -30 -28 q0 -9 4 -16l29 -49h-57q-29 0 -29 -28t29 -28h57l-29 -49q-5 -8 -5 -17q0 -26 30 -26q15 0 24 15l29 49l28 -49q9 -16 23 -16q30 0 30 29q0 8 -4 15l-28 49h56q29 0 29 28zM1139 1266q0 -46 -46 -46t-46 46t46 46t46 -46zM1093 853q46 0 46 -45.5t-46 -45.5t-46 45.5 t46 45.5zM581 1266q0 -46 -46 -46t-46 46t46 46t46 -46zM1139 349q0 -46 -46 -46t-46 46t46 46t46 -46zM535 853q46 0 46 -45.5t-46 -45.5t-46 45.5t46 45.5zM1139 -110q0 -46 -46 -46t-46 46t46 46t46 -46zM581 349q0 -46 -46 -46t-46 46t46 46t46 -46zM581 -110 q0 -46 -46 -46t-46 46t46 46t46 -46zM1124 1266.5q0 30.5 -30.5 30.5t-30.5 -30.5t30.5 -30.5t30.5 30.5zM1124 807.5q0 30.5 -30.5 30.5t-30.5 -30.5t30.5 -30.5t30.5 30.5zM565 1266.5q0 30.5 -30.5 30.5t-30.5 -30.5t30.5 -30.5t30.5 30.5zM1124 348.5q0 30.5 -30.5 30.5 t-30.5 -30.5t30.5 -30.5t30.5 30.5zM565 807.5q0 30.5 -30.5 30.5t-30.5 -30.5t30.5 -30.5t30.5 30.5zM1124 -109.5q0 30.5 -30.5 30.5t-30.5 -30.5t30.5 -30.5t30.5 30.5zM565 348.5q0 30.5 -30.5 30.5t-30.5 -30.5t30.5 -30.5t30.5 30.5zM565 -109.5q0 30.5 -30.5 30.5 t-30.5 -30.5t30.5 -30.5t30.5 30.5zM1109 1266.5q0 -15.5 -15.5 -15.5t-15.5 15.5t15.5 15.5t15.5 -15.5zM1109 807.5q0 -15.5 -15.5 -15.5t-15.5 15.5t15.5 15.5t15.5 -15.5zM550 1266.5q0 -15.5 -15.5 -15.5t-15.5 15.5t15.5 15.5t15.5 -15.5zM1109 349q0 -15 -15.5 -15 t-15.5 15t15.5 15t15.5 -15zM550 807.5q0 -15.5 -15.5 -15.5t-15.5 15.5t15.5 15.5t15.5 -15.5zM1109 -110q0 -15 -15.5 -15t-15.5 15t15.5 15t15.5 -15zM550 349q0 -15 -15.5 -15t-15.5 15t15.5 15t15.5 -15zM550 -110q0 -15 -15.5 -15t-15.5 15t15.5 15t15.5 -15z" />
+<glyph unicode="&#x1f021;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1499 1145q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5 t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM1031 1145q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM1499 577q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5 t153.5 63.5t153.5 -63.5t63.5 -153.5zM563 1145q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM1031 577q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5 t63.5 -153.5zM1499 9q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM563 577q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM1031 9 q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM563 9q0 -90 -63.5 -153.5t-153.5 -63.5t-153.5 63.5t-63.5 153.5t63.5 153.5t153.5 63.5t153.5 -63.5t63.5 -153.5zM1483 1145q0 83 -59 142t-142 59t-142 -59 t-59 -142t59 -142t142 -59t142 59t59 142zM1015 1145q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM1483 577q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM547 1145q0 83 -59 142t-142 59t-142 -59t-59 -142 t59 -142t142 -59t142 59t59 142zM1015 577q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM1483 9q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM547 577q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59 t142 59t59 142zM1015 9q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM547 9q0 83 -59 142t-142 59t-142 -59t-59 -142t59 -142t142 -59t142 59t59 142zM1460 1145q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126z M992 1145q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM1460 577q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM524 1145q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM992 577 q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM1460 9q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM524 577q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM992 9q0 -74 -52 -126 t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM524 9q0 -74 -52 -126t-126 -52t-126 52t-52 126t52 126t126 52t126 -52t52 -126zM1444 1145q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM976 1145 q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM1444 577q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM508 1145q0 67 -47.5 114.5t-114.5 47.5 t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM976 577q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM1444 9q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5 t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM508 577q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM976 9q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5 t47.5 114.5zM508 9q0 67 -47.5 114.5t-114.5 47.5t-114.5 -47.5t-47.5 -114.5t47.5 -114.5t114.5 -47.5t114.5 47.5t47.5 114.5zM1390 1189q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44 t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM922 1189q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45 q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM1390 621q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49 q47 0 47 -42q0 -13 -23 -52h31zM454 1189q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31z M922 621q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM1390 53q45 0 45 -44t-45 -44h-31 q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM454 621q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45 q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM922 53q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49 q-47 0 -47 42q0 13 23 52h-31q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM454 53q45 0 45 -44t-45 -44h-31q22 -38 22 -50q0 -45 -46 -45q-25 0 -53 50q-28 -49 -53 -49q-47 0 -47 42q0 13 23 52h-31 q-45 0 -45 44t45 44h31q-22 38 -22 50q0 45 46 45q25 0 53 -50q28 49 53 49q47 0 47 -42q0 -13 -23 -52h31zM1419 1145q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29 h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM951 1145q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58 q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM1419 577q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30 q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM483 1145q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16 q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM951 577q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50 q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM1419 9q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15 l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM483 577q0 29 -29 29h-58l29 50q5 9 5 17q0 27 -30 27 q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM951 9q0 29 -29 29h-58l29 50q5 9 5 17 q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM483 9q0 29 -29 29h-58 l29 50q5 9 5 17q0 27 -30 27q-16 0 -25 -15l-29 -50l-29 50q-9 16 -24 16q-30 0 -30 -30q0 -8 4 -15l29 -50h-58q-29 0 -29 -29t29 -29h58l-29 -50q-5 -9 -5 -17q0 -27 30 -27q16 0 25 15l29 50l29 -50q9 -16 24 -16q30 0 30 30q0 8 -4 15l-29 50h58q29 0 29 29zM1329 1145 q0 -47 -47 -47t-47 47t47 47t47 -47zM861 1145q0 -47 -47 -47t-47 47t47 47t47 -47zM1329 577q0 -47 -47 -47t-47 47t47 47t47 -47zM393 1145q0 -47 -47 -47t-47 47t47 47t47 -47zM861 577q0 -47 -47 -47t-47 47t47 47t47 -47zM1329 9q0 -47 -47 -47t-47 47t47 47t47 -47z M393 577q0 -47 -47 -47t-47 47t47 47t47 -47zM861 9q0 -47 -47 -47t-47 47t47 47t47 -47zM393 9q0 -47 -47 -47t-47 47t47 47t47 -47zM1313 1145q0 31 -31 31t-31 -31t31 -31t31 31zM845 1145q0 31 -31 31t-31 -31t31 -31t31 31zM1313 577q0 31 -31 31t-31 -31t31 -31t31 31 zM377 1145q0 31 -31 31t-31 -31t31 -31t31 31zM845 577q0 31 -31 31t-31 -31t31 -31t31 31zM1313 9q0 31 -31 31t-31 -31t31 -31t31 31zM377 577q0 31 -31 31t-31 -31t31 -31t31 31zM845 9q0 31 -31 31t-31 -31t31 -31t31 31zM377 9q0 31 -31 31t-31 -31t31 -31t31 31z M1298 1145q0 -16 -16 -16t-16 16t16 16t16 -16zM830 1145q0 -16 -16 -16t-16 16t16 16t16 -16zM1298 577q0 -16 -16 -16t-16 16t16 16t16 -16zM362 1145q0 -16 -16 -16t-16 16t16 16t16 -16zM830 577q0 -16 -16 -16t-16 16t16 16t16 -16zM1298 9q0 -16 -16 -16t-16 16t16 16 t16 -16zM362 577q0 -16 -16 -16t-16 16t16 16t16 -16zM830 9q0 -16 -16 -16t-16 16t16 16t16 -16zM362 9q0 -16 -16 -16t-16 16t16 16t16 -16z" />
+<glyph unicode="&#x1f022;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM559 1291l-26 3q-18 0 -81 -63l58 107q30 57 30 81t-2 34h23 q17 0 37 -35l-63 -108q2 -2 14 -2l168 46q9 0 33 -8v-16zM733 1153l54 14q21 0 52 -35h-125q-17 -85 -17 -97v-14l60 -19q32 -10 36 -32q-5 -5 -16 -5h1q0 2 -82 22l-26 -77q-15 -40 -53 -58q-13 24 -36 70q18 -6 34.5 -6t28 25t11.5 37v23h-157q-1 0 -65 -22q-5 5 -5 13 t24 40t37 56v12l-38 -8q-13 0 -30 17q53 8 77 15q12 42 12 71q0 23 -7 38q29 -1 47 2.5t64 17t50 13.5q28 0 62 -37q-15 -29 -15 -55v-9q13 -12 22 -12zM376 1176l36 5q14 0 23 -19v-20h-33q-3 0 -26 34zM368 1211v-291q0 -5 -19 -43q-32 22 -27 51l25 180q-1 22 -6 69 q-74 -140 -160 -179q126 153 156 230q-17 0 -56.5 -7.5t-45 -7.5t-33.5 14q51 13 145 52v116l-24 58h25q6 0 41 -26l-21 -138q8 -7 36 -8t31 -2q-2 -13 -23 -23l-40 -18q-4 -21 -4 -27zM1369 249q0 -92 -65.5 -157.5t-157.5 -65.5q-35 0 -69 11q43 -59 43 -141.5t-65.5 -148 t-157.5 -65.5t-157.5 66t-65.5 158q-67 -92 -181 -92q-92 0 -157.5 65t-65.5 147.5t42.5 141.5t111.5 81q-69 22 -111.5 81t-42.5 141t65.5 147.5t157.5 65.5q114 0 181 -92q0 92 65.5 157.5t157.5 65.5t157.5 -65.5t65.5 -147.5t-43 -141q34 11 69 11q92 0 157.5 -65.5 t65.5 -157.5zM672 1222q-16 16 -25 16t-49.5 -8.5t-58.5 -10.5q-7 -59 -15 -91q51 7 148 18v76zM668 1022q-2 5 -1 32.5t1 72.5q-51 -7 -147 -22q-13 -30 -32 -83h179zM1339 249q0 80 -56.5 136.5t-127.5 56.5t-122 -37q-9 14 -23 31q80 58 80 147t-56.5 145.5t-136.5 56.5 t-136.5 -56.5t-56.5 -136.5q0 -31 9 -59q-16 -4 -36 -12q-19 59 -70.5 96t-122.5 37t-127.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5q-1 -15 -1 -19t1 -19q-80 0 -136.5 -57t-56.5 -137t56.5 -136t127.5 -56t122.5 37t70.5 96q20 -8 36 -12q-9 -28 -9 -60 q0 -80 56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 145.5t-80 147q14 17 23 31q50 -36 121.5 -36t128 56.5t56.5 136.5zM616.5 1195.5q9.5 -9.5 9.5 -22t-8 -20.5q-31 8 -30 30v22h12q7 0 16.5 -9.5zM605 1062q0 -9 -7 -26q-8 -2 -19.5 9t-11.5 18v33q38 -7 38 -34zM1008 249 q0 -92 -65.5 -157.5t-157.5 -65.5t-157.5 65.5t-65.5 157.5t65.5 157.5t157.5 65.5t157.5 -65.5t65.5 -157.5zM978 249q0 80 -56.5 136.5t-136.5 56.5t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5z" />
+<glyph unicode="&#x1f023;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM533 1291l79 17q31 0 52 -23q-2 3 -2 -13v-192l14 -141 q0 -35 -41 -91q-24 26 -76 77q9 0 62 2q13 11 13 118q0 12 -4 120q-4 9 -39.5 9t-64.5 -18q-14 9 -15.5 41t-2.5 60q-5 37 -11 37t-10 -3t-5 -3q6 25 17 53q-9 3 -39 3l-61 -5q-8 -5 -8 -21l1 -27q-13 3 -21.5 24.5t-21.5 17.5l-99 -18q-23 -3 -48 24q43 6 76 10q29 0 76 15 l-35 56q5 5 19.5 5t42.5 -18q2 -18 8 -49h19l96 15q10 12 12.5 38t4.5 49h11q6 0 41 -26q-6 -13 -24 -49q15 -8 53 0t44 8q29 0 48 -26q0 -4 -8 -12h-149q-18 -30 -38 -55q14 -9 34 -9zM474 1121l55 14q25 0 41 -19l-47 -98q-21 14 -38.5 14t-34.5 -9q1 13 2 -57q1 -7 1 -14 q0 -58 -12 -79q-21 16 -21 38l9 53v19q1 0 -6 7q-51 -55 -115 -70q28 22 99 93q-1 2 -16 2t-32 -11l-33 87v15h100q1 8 6 23l-43 19q9 0 26 8.5t17 20t-14 39.5q30 -8 45 -15q0 4 -7 -38q-4 -1 43 -1q-9 -4 -42 -29q6 -12 17 -12zM552 941q-35 8 -92 55h30h1q13 0 61 -32 v-23zM283 1266l73 14q6 0 44 -18q-12 -26 -18 -62l-11 -68q-17 3 -45.5 3t-48.5 -13q0 -2 -4.5 -96.5t-22.5 -150.5q-27 15 -27 48q0 2 7 27q18 58 18 164.5t-17 154.5zM1126 650q136 0 225 -115.5t89 -245t-76 -241.5t-190 -112q-68 0 -101 50l-64 136q-48 100 -88 100 q-35 0 -34 -48l2 -5q13 18 55 31q-6 -11 -6 -27.5t19 -59t19 -60t-18 -27.5l-35 -18q15 -6 30.5 -31t15.5 -40.5t-32 -69t-32 -57.5q0 -16 20 -16q33 0 62.5 65t37.5 112q5 -21 5 -65t-26 -99q-32 -69 -90 -69q-19 0 -55 19t-40 19t-40 -19t-55 -19q-58 0 -90 69 q-26 55 -26 99t5 65q8 -47 37.5 -112t62.5 -65q20 0 20 16q0 4 -32 57.5t-32 69t15.5 40.5t30.5 31l-35 18q-18 10 -18 27.5t19 60t19 59t-6 27.5q21 -7 55 -31l2 5q1 48 -34 48q-40 0 -88 -100l-64 -136q-33 -50 -101 -50q-114 0 -190 112t-76 241.5t89 245t225 115.5 q92 0 155 -88q53 205 152 205t152 -205q63 88 155 88zM623 1192v65q0 23 -35 23q12 0 -6 -1.5t-27.5 -4t-15.5 5.5v-46l40 11q13 0 19 -19q-40 -14 -59 -14v-20h84zM513 1051q0 1 7 51q-6 12 -12 10q-24 -3 -51 -10q0 -28 -3 -52q40 1 59 1zM354 1206l-4 43l4 6h-26 q-5 0 -23 -3.5t-24 -4.5q-8 -13 -8 -19.5t2 -13.5t2 -8q35 7 51 7t19 -12q-34 -15 -62 -15q-6 0 -12 1q8 -28 7 -41q57 8 65.5 13.5t8.5 46.5zM362 1033q34 3 47.5 3t21.5 -3v63q-27 -3 -69 -11q3 -49 0 -52zM1176 -40q102 0 172 108t70 223.5t-86 221t-206 105.5 q-76 0 -125 -58q-26 -32 -69 -123t-78 -125l-4 -1q-8 0 -8 9l54 96q55 98 55 131.5t-27 93.5q-45 97 -105 97t-105 -97q-27 -60 -27 -93.5t55 -131.5l54 -96q0 -9 -8 -9l-4 1q-35 34 -78 125t-69 123q-49 58 -125 58q-120 0 -206 -105.5t-86 -221t70 -223.5t172 -108 q63 0 103 73l60 137q37 73 92 73q41 0 55 -50l22 -84h50l22 84q14 50 55 50q55 0 92 -73l60 -137q40 -73 103 -73zM936 35q15 13 15 23t-40 108q-9 -18 -9 -30t18 -39t18 -36t-3 -9q-28 57 -57 67q17 -26 17 -50.5t-7 -33.5h48zM760 119q-29 -10 -57 -67q-3 0 -3 9t18 36 t18 39t-9 30q-40 -98 -40 -108t15 -23h48q-7 9 -7 33.5t17 50.5zM920 -224q-42 0 -42 29q0 6 33 65.5t33 65.5q0 30 -30 56.5t-60 27.5q14 37 14 73l-16 -47q-8 -27 -21 -26q14 28 14 67h-52q0 -39 14 -67q-13 -1 -21 26l-16 47q0 -36 14 -73q-30 -1 -60 -27.5t-30 -56.5 q0 -6 33 -65.5t33 -65.5q0 -29 -42 -29q-26 0 -51 32q5 -47 50.5 -47t101.5 40q56 -40 101.5 -40t50.5 47q-25 -32 -51 -32zM499 1091q-12 -17 -35 -33q6 13 15 41q4 0 20 -8zM410 1047h-16q-13 20 -18 34h19q11 -10 15 -10v-24z" />
+<glyph unicode="&#x1f024;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1283 1199l-3 323h-83l-11 -162q0 -18 36 -71zM1544 1408q0 114 -104 114h-145v-259l-5 -59q-3 -34 6 -54q29 -65 125.5 -190.5t122.5 -167.5v616zM1003 1522h-132 l72 -150q11 28 60 48l73 24q-67 78 -73 78zM1544 748q0 2 -36 27t-42 34q-37 70 -105 187l-103 152q-28 47 -53 85l-102 142q-25 -1 -58 -22.5t-33 -51t18 -44.5q39 -31 59 -58q134 -182 187 -268q14 -28 42 -78q36 -49 89 -128q54 -72 137 -206v229zM1330 591v12 q-6 46 -9 134q2 41 1 43q-27 52 -113 181q-4 7 -16 7l-7 -420q21 13 62 30q32 7 82 13zM1185 353l-5 59q0 50 33 78.5t85 28.5t61 -33t11 -89.5t7 -134.5l11 -173q3 -38 6 -97.5t8 -120t14 -199.5q1 -16 24 -30q104 0 104 114v436q-3 13 -4 39q1 1 2 1t2 2v218 q-21 -5 -45 -14q-16 71 -69 162l-99 170v-65l14 -120q0 -20 -16 -20l-37 7q-40 0 -89 -38l94 21q23 0 55 -26l-62 8q-37 0 -55.5 -13.5t-61.5 -57.5q-3 3 -2.5 11.5t13.5 28.5l12 20q-12 0 -19 -7l-6 404q0 42 1 51q7 9 17 25l-226 299q51 113 127 113q27 0 40 -13l37 -47 q3 40 3 85.5t-3 85.5h-133q24 -32 74 -88l-92 -35q-57 -25 -57 -70q0 -7 1 -14q-3 0 -19 -3q-69 156 -107 210h-646q-104 0 -104 -114v-871q170 81 277 81q8 0 9 -1q-50 -38 -130 -57l-156 -38v-102q122 105 271 172q36 16 65 16l46 -7q8 0 100.5 37t125.5 37q-11 0 36 -13 v-38q-38 -21 -71 -32q42 -27 56 -27l57 7q25 0 46 -12l40 -22h34l-131 106q58 -22 149 -106.5t99 -148.5q97 -5 178 -36zM1366 0v146q0 70 -33 305q-4 29 -59 29q-71 0 -71 -67q0 -3 16 -96.5t21.5 -137.5t16.5 -277q5 -51 10 -110v-150q88 6 141 8q-7 12 -16 33 q-7 158 -16.5 237t-9.5 80zM152 264q89 0 130 -13v-13q0 -31 -116 -53q-29 -7 -82 -17v-98q24 -2 24 -23q0 -12 -24 -27v-17q0 -22 2 -27q3 -6 10 -25q12 -98 12 -113v-145q7 -15 37 -33t43 -18h1057v108l-17 145l-4 198q-4 77 -30 219q-30 9 -78 25q-128 44 -196 44 l-157 -5q51 -20 111 -38q31 -9 66 -55l65 -85q51 -62 51 -81.5t-1 -21.5q-46 63 -119 109l-128 73q-23 9 -56 33q-5 21 -18 64h-33q-82 0 -291 -103v-70q4 25 27 25q17 0 22 -3v-147q-1 -82 -37 -234q-5 -23 -31 -23q-1 0 -7 6l-35 247q-3 32 11 52l45 64q0 8 -5 9 l-265 -269q15 112 182 286l-171 -109q-6 6 -6 12q72 49 257 152l68 40q71 32 197 62.5t197.5 30.5t132.5 -9q-40 100 -100 126q-10 -10 -14 -10l-25 10q-7 0 -22.5 -11t-20.5 -13l-294 -99q-153 -57 -235 -111q60 131 400 275q-40 30 -60.5 30t-242.5 -118q-23 -17 -76 -52 l153 169h-20q-48 -43 -114 -97l-237 -126v-122q61 20 68 20zM886 1322q2 -2 2 2t-13 30q28 -18 37 -63l-116 87q34 -9 90 -56zM535 965q33 0 33 67q0 150 -37 188h-35q-23 -48 -79 -85q115 204 115 292q0 16 -2 30h22q11 0 48 -37l-92 -177q5 -5 12 -5l156 46q20 -5 48 -19 q0 -15 -16 -19q-50 -7 -154 -25l49 -30v-256l4 -29q2 -14 -7 -26q-57 17 -99 88q13 -3 34 -3zM264 1206l133 35q16 0 33 -12q-16 -18 -60.5 -30.5t-52.5 -16.5l13 -30q5 -13 5 -50.5t-9 -101.5t-21 -74q-20 9 -23 50l21 155q-5 57 -43 57q-8 0 -11 -1q-56 -79 -107 -94 q76 106 106 162q52 94 55 166h22q14 0 38 -42l-106 -171q2 -2 7 -2zM685 266l-183 -391q12 86 22 278q4 67 30 119q36 71 102 80q-3 -9 -14 -26q13 -26 43 -19v-41z" />
+<glyph unicode="&#x1f025;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM356 1340l-105 -21q-18 0 -42 24q48 5 142 21l-36 60 q17 0 38 -2.5t27 -19.5t7 -34q12 -7 19.5 -7t93.5 12l5 5q3 27 9 86h22q7 0 20.5 -11.5t13.5 -18.5t-25 -49q11 -5 46 1.5t52.5 6.5t39.5 -18q1 -10 -4 -20h-142q-28 -29 -58 -64q6 14 13 58l-2 3q-49 -7 -94 -8l-11 -36q-32 32 -29 32zM429 1136l21 30q10 15 17 29t16.5 14 t36.5 -27zM1202 647q27 -27 27 -61t-35 -58l-321 -222q-5 7 -12 12l222 321q24 35 58 35t61 -27zM375 1223l-49 11q-8 0 -81 -52q43 54 78 112q14 -4 38 -15q-6 -14 -18 -29q4 -2 25 -2l203 32q12 2 46 -11.5t34 -30.5l-14 -37v-252q0 -14 -23.5 -55.5t-43.5 -41.5 q-5 0 -28 30l-39 50q24 -6 46 -6q53 0 53 181q0 69 -5 91q-9 46 -45 50zM1049 751q28 -22 28 -49t-14 -49l-212 -327q-5 3 -16 6l82 381q13 60 70 60q34 0 62 -22zM1328 432q0 -57 -60 -70l-381 -82q-3 11 -6 16l327 212q22 14 49 14t49 -28t22 -62zM503 972q-21 0 -92 78 h36q8 0 36 -16.5t34 -23.5v-30q-8 -8 -14 -8zM329 1121l-16 -4q-27 0 -51 57h30q15 1 37 -30v-23zM410 1113l80 8q26 0 48 -12q0 -9 -12 -20h-106l-20 -10v-155q0 -7 -19 -26q-27 12 -18 51.5t9 42.5v62l-81 -71q-46 -41 -92 -41l79 61q47 36 62 69q-14 3 -57 -4t-56 -7 t-46 20q88 4 185 23q9 7 9 22.5t-17 75.5l14 4q16 0 38 -15v-78zM895 735q0 -6 -2 -17l-71 -383q-8 1 -16 0l-71 383q-2 11 -2 17q0 72 81 72t81 -72zM1362 259q0 -81 -72 -81q-6 0 -17 2l-383 71q1 8 0 16l383 71q11 2 17 2q72 0 72 -81zM565 653q-14 22 -14 49t28 49 t62 22q57 0 70 -60l82 -381q-11 -3 -16 -6zM1328 86q0 -34 -22 -62t-49 -28t-49 14l-327 212q3 5 6 16l381 -82q60 -13 60 -70zM434 528q-35 24 -35 58t27 61t61 27t58 -35l222 -321q-7 -5 -12 -12zM880 259q0 -66 -66 -66t-66 66t66 66t66 -66zM1194 -10q35 -24 35 -58 t-27 -61t-61 -27t-58 35l-222 321q7 5 12 12zM300 432q0 34 22 62t49 28t49 -14l327 -212q-3 -5 -6 -16l-381 82q-60 13 -60 70zM1063 -135q14 -22 14 -49t-28 -49t-62 -22q-57 0 -70 60l-82 381q11 3 16 6zM338 178q-72 0 -72 81t72 81q6 0 17 -2l383 -71q-1 -8 0 -16 l-383 -71q-11 -2 -17 -2zM895 -217q0 -72 -81 -72t-81 72q0 6 2 17l71 383q8 -1 16 0l71 -383q2 -11 2 -17zM420 10q-22 -14 -49 -14t-49 28t-22 62q0 57 60 70l381 82q3 -11 6 -16zM641 -255q-34 0 -62 22t-28 49t14 49l212 327q5 -3 16 -6l-82 -381q-13 -60 -70 -60z M545 -121q-24 -35 -58 -35t-61 27t-27 61t35 58l321 222q5 -7 12 -12zM1183 544q26 18 26 42.5t-21.5 46t-46 21.5t-42.5 -26l-186 -270zM1046 664q11 17 11 36t-23 36t-48 17q-41 0 -50 -44l-68 -320zM1308 431q0 26 -16.5 48.5t-36 22.5t-36.5 -11l-275 -178l320 68 q44 9 44 50zM875 735q0 52 -61 52t-61 -52q0 -2 2 -13l59 -323l59 323q2 11 2 13zM1342 259q0 61 -52 61q-2 0 -13 -2l-323 -59l323 -59q11 -2 13 -2q52 0 52 61zM643 753q-25 0 -49 -17t-24 -35t12 -37l178 -275l-68 320q-9 44 -49 44zM1308 86q0 42 -44 51l-320 68 l275 -178q19 -12 37 -12t35 23t17 48zM529 628q-18 26 -42 26t-46 -22t-22 -46t26 -42l270 -186zM860 259q0 46 -46 46t-46 -46t46 -46t46 46zM1187 -114q22 22 22 46t-26 42l-270 186l186 -270q18 -26 42 -26t46 22zM409 491q-19 12 -37 12t-35 -24t-17 -49q0 -40 44 -49 l320 -68zM1034 -218q24 17 24 35t-12 37l-178 275l68 -320q9 -44 49 -44q25 0 49 17zM338 320q-52 0 -52 -61t52 -61q2 0 13 2l323 59l-323 59q-11 2 -13 2zM875 -217q0 2 -2 13l-59 323l-59 -323q-2 -11 -2 -13q0 -52 61 -52t61 52zM320 88q0 -25 17 -49t35 -24t37 12 l275 178l-320 -68q-44 -9 -44 -49zM582 -146q-12 -19 -12 -37t24 -35t49 -17q40 0 49 44l68 320zM445 -26q-26 -18 -26 -42t22 -46t46 -22t42 26l186 270z" />
+<glyph unicode="&#x1f026;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM481 1284l88 28h65q-14 -19 -65 -34q-24 -4 -81 -20 q-34 -12 -34 -28v-25q1 -1 3 -2l235 46l25 -8q18 -8 26 -30l-197 -28q193 -171 345 -189q0 -4 8 -12q-56 -19 -107 -19t-60 5t-87 73l-83 91q-46 50 -73 50q-43 0 -63 -35l-43 -73q5 -20 24 -12l141 28l75 -43q-5 -25 -9 -58q2 16 2 -45v-93q0 -21 -29 -65q-13 0 -28.5 34.5 t-29.5 47.5h-8q-44 0 -100 -9q-13 -20 -21 -55q-24 9 -24 30l-6 214q-20 -20 -62 -56q-94 -71 -123 -71h-2h-19q205 138 237 237q-5 3 -20 3l-98 -18q-30 0 -41 27q54 2 167 23q18 6 20 37v26q-5 -3 -22 -3q-23 0 -66 5q33 3 89 20q12 8 21 53q-70 7 -106 7q0 4 -8 12 q39 6 109 22q8 14 8 28t-5.5 42.5t-1.5 42.5h15q15 0 52 -28q0 -1 -21 -65q10 -9 19 -9l113 28q13 0 37 -8v-12q-56 -13 -163 -45q-5 -2 -14.5 -18.5t-9.5 -23.5v-14zM1042 239q-101 0 -110 123q-34 -81 -114 -81q-116 0 -124 165l39 208q-4 93 -85 195l76 -39 q41 -21 67 -56q41 73 121 117l-31 -75q-25 -63 -25 -93t26 -98l44 -113q7 -28 14 -87q19 47 44 91l59 96q36 65 36 106.5t-13 108.5q58 -56 89 -130q62 42 153 55l-70 -67q-42 -44 -49 -75q-9 -108 -19 -215q-23 -136 -128 -136zM1427 259l-46 -31q-31 -24 -44 -52 q-29 -66 -94 -198q-17 -32 -115 -97q-48 -29 -133 -94q9 35 23 101q45 250 235 327q12 5 51 18t123 26zM1001 57v-137h-81v140q0 10 40 193l76 -33q-35 -102 -35 -163zM1012 -300l-66 -47q-17 21 -34 53q-67 126 -83 206q-36 183 -36 291v6v47q6 -10 15 -4q20 0 62 4 q17 -220 28 -278q30 -161 114 -278zM962 355q0 -84 82 -84q105 0 105 174v110q0 25 20.5 63.5t36.5 53.5q-34 -18 -75 -48q0 52 -23 88q1 -7 1 -14q0 -55 -42 -128l-67 -109q-38 -65 -38 -106zM566 882l4 88q0 91 -46 92l-113 -19l1 -73q68 17 92.5 17t27.5 -15 q-59 -20 -85.5 -20t-34.5 3v-73q29 2 67 8t40 6q-11 0 47 -14zM761 656l-39 -207q0 -51 24 -95.5t70 -44.5q93 0 93 110q0 49 -40.5 149t-40.5 133t13 78q-18 -26 -38 -71q1 -9 -2 -28q-18 32 -64 86q24 -70 24 -110zM1326 214h-13q-11 -5 -42 -17q-182 -70 -227 -325 q132 71 178 124q27 31 58.5 113t45.5 105zM993 210l-16 4q-30 -106 -29 -147v-117h25v139q0 12 10.5 53.5t10.5 52.5t-1 15zM845 224l-20 -3v-58l5 -57q12 -228 116 -403q6 -8 12 -8l11 12q-69 116 -92.5 231.5t-31.5 285.5z" />
+<glyph unicode="&#x1f027;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM438 1055l141 31q11 0 65 -29l-91 -110q72 -74 291 -109 q11 -2 23 -13q-88 -32 -135 -32t-126 62t-82.5 62t-17 -12.5t-18.5 -14.5q-123 -58 -149 -58q-2 0 -21.5 4.5t-29.5 4.5q120 26 208 99q-1 7 -45 38t-59 31q-4 0 -42.5 -37.5t-58 -51.5t-64 -37t-51.5 -22h-15q180 114 240 242v9q-6 6 -7 6l-28 -3v149q0 12 -18 65l40 -3 q23 0 37 21l22 45v10q-3 2 -21 2l-126 -18q-8 0 -29.5 11.5t-24.5 23.5l453 54q57 0 69 -35l-283 -31q6 -3 15 -10q-18 -23 -57 -60q3 -3 18 -1l79 14q58 10 62 10q27 0 64 -30q-19 -36 -27 -115.5t-28 -101.5q-35 21 -41 21t-58.5 -8t-76.5 -10l-6 -5l21 -21l-24 -36 q1 -1 12 -1zM1122 551l-75 -129q-8 -13 -27.5 -13.5t-30.5 10.5t-10.5 30.5t13.5 27.5zM812 482q-40 0 -40 38v5l40 254l40 -259q0 -38 -40 -38zM1052 242q0 40 38 40h5l254 -40l-259 -40q-38 0 -38 40zM1122 -67l-130 75q-13 8 -13.5 27.5t10.5 30.5t30.5 10.5t27.5 -13.5z M636 419q-11 -11 -30.5 -10.5t-27.5 13.5l-75 129l130 -74q13 -8 13.5 -27.5t-10.5 -30.5zM1032 242q0 -91 -64.5 -155.5t-155.5 -64.5t-155.5 64.5t-64.5 155.5t64.5 155.5t155.5 64.5t155.5 -64.5t64.5 -155.5zM572 242q0 -40 -38 -40h-5l-254 40l259 40q38 0 38 -40z M812 2q40 0 40 -38v-5l-40 -254l-40 259q0 38 40 38zM636 66q11 -11 10.5 -30.5t-13.5 -27.5l-130 -75l75 130q8 13 27.5 13.5t30.5 -10.5zM602 1211v115q-21 7 -32 7l-166 -25q-5 -32 1 -45q92 25 117 25t34 -16l-6 -6q-70 -18 -129 -18h-16v-52l128 28q8 -1 23 -6v-12 q-32 -16 -76 -20l-82 -9v-45h25q4 0 27 6t71.5 11.5t62.5 4.5q18 46 18 57zM463 1037l-37 3q-16 0 -32 -16q19 -8 69.5 -33t55.5 -25q13 0 30.5 31.5t17.5 39t-2 14t-2 7.5q-63 -21 -100 -21zM980 242q0 70 -49 119t-119 49t-119 -49t-49 -119t49 -119t119 -49t119 49 t49 119z" />
+<glyph unicode="&#x1f028;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM807 1264q-103 -62 -112 -61h-15q73 96 71 113q27 -15 40 -25.5 t16 -26.5zM832 889q-68 0 -96 28q-16 16 -41.5 81t-62.5 113q-22 -67 -84.5 -137.5t-117.5 -77.5q-4 6 -3 9q25 17 70 55q119 128 119 379q0 97 -21 121h33h4q20 0 39 -21q6 -6 5 -19l-42 -265q21 -62 94 -141t141 -99l23 -14q-30 -12 -60 -12zM552 1150q-20 4 -38 33 t-18 36t5 12q17 1 39.5 -15t22.5 -34zM337 1206l-111 -31q-21 0 -51 30l191 33v104q-2 2 -11 2l-81 -24l85 58q48 36 61 72q27 -11 69 -37l-106 -57q8 -8 32 -23q-11 -70 -14 -70v3q0 -8 6 -14h9q4 0 19.5 9t17 9t25.5 -12q-8 -16 -35 -22t-37.5 -17.5t-9.5 -37.5l1 -43 q3 -2 46 -11.5t43 -36.5q0 -13 -13 -25q-37 25 -70 53q-9 -18 -9 -44v-152q0 -19 -26 -97q-27 11 -27 58q0 8 14 83.5t14 123t-6 71.5q-11 -25 -42 -74q-13 -15 -70 -64t-68 -49h-19q166 131 187 230q-1 2 -14 2zM923 761l13 4q2 0 21 -21q-1 -2 -1 24q23 -17 62 -49l7 -17 q2 -1 18 -1q7 -19 24 -56q9 8 17 25q15 -17 39 -51q16 -29 16 -52t-32 -121q6 -6 7 -6q31 0 296 159v-49q-50 -20 -136.5 -75.5t-95.5 -60.5l45 -20q30 -14 38 -33q17 -40 36 -114q-15 1 -20 -3q16 -26 16 -62q0 -3 -1 -6q-1 -40 5 -57h-21q-5 -19 -1 -49q-16 -9 -20 -30.5 t-8 -40.5q-24 19 -77 49q2 -18 -15.5 -53t-16.5 -56l-18 17q-69 -92 -68 -92q-5 0 -28 15q-6 -10 -21 -28q-1 -1 -24 -5q-15 -15 -40 -45l-10 11l-143 -103q35 88 35 113q0 2 -9 5q-3 21 6 40q0 1 -5.5 4t-5.5 8l14 40q0 1 -5 14q-1 1 -15 3q-14 14 -32 70l-60 -46 q2 17 0 25q-26 -15 -34 -15l-16 7l-36 -17q-4 0 -9.5 3.5t-9.5 3.5h1q0 -2 -84 -21q14 44 14 35q0 8 -13 21q-20 -10 -33.5 -10t-24 3.5t-14.5 3.5q11 0 -45 -14q1 21 -4 21l-61 -9l-22 -9l-21 4q-2 0 -76 -21q37 35 96 108l44 42q-4 17 13.5 50t36.5 45q-9 13 -49 13 q13 29 22 41.5t28 27.5q-3 15 16.5 25t21 14t-2.5 10l50 54l42 30q-30 34 -96 96q7 3 21 14q-8 7 -64 44q0 1 4 5q-65 33 -113 50l82 -2q7 0 64 16q16 1 49 2q7 10 7 20q13 1 43 -3q3 3 -4 10h67q0 -5 -11 44l56 -8l22 7q6 0 33 -10q5 2 14 21l27 -14l17 3l33 -11 q0 21 -7 85h43l52 -21l10 4q3 0 16.5 -11t18.5 -11zM609 -5l13 -3q5 0 23 17.5t22 20.5q7 -6 14 -24l43 24q10 -10 15 -10q29 28 45 39q10 -32 34 -95h25q9 -26 5 -56.5t-5 -20.5q5 -46 5 -72q0 -20 -3 -28q44 36 81 59q5 1 14 2l35 45l10 -11q17 22 39 39q7 -8 22 -18 q25 36 77 101q1 7 2 17q7 9 12 11q9 24 10 42q5 6 24 6t55 -28q6 12 17 36q0 22 5 66h18v27l-28 77q0 12 21 24q-7 23 -26 65q-12 21 -116 48q-3 6 -8 15q-34 8 -34 35l32 113q0 9 -7.5 32.5t-15.5 26.5q-16 -13 -28 -18q-8 22 -32 63q-11 4 -26 17q-3 11 -13 26 q-11 -11 -19 -11t-36 34q-8 0 -18 2l-26 17q-4 0 -4 -1.5t-8.5 -1.5t-51.5 17q0 4 5 -35t-5 -53h-23l-43 21l-51 -7l-27 6q-8 1 -24.5 -1t-19.5 -2q6 -12 0.5 -20t-109.5 -30l-10 -20q-21 7 -35 7l-36 -5q-11 -7 -11 -12q20 -6 29 -20q-2 -8 7 -15q29 -16 41 -34 q-15 -15 -14 -19l85 -98q-87 -70 -85 -97q-61 -34 -81 -73q17 -8 46 -24q-20 -19 -52 -59q-4 -11 -14 -29q-1 -7 9 -25q-22 -18 -58 -52q-7 -15 -23 -37q12 6 21 6l16 -7l60 18q3 0 10 -18q28 7 29 7l25 -11q16 0 25.5 13t16.5 16l49 -71q21 14 34 14zM1012 365 q-51 -73 -121 -108q-40 -20 -126.5 -41t-129.5 -44q-8 8 -8 17l195 67q103 35 177 117q8 -8 13 -8z" />
+<glyph unicode="&#x1f029;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM888 1053q-94 -27 -138 -27t-110 48l-124 94q-48 -49 -149 -102 q-99 -53 -155 -53h-2h-32q137 63 154 72q86 47 143 109q-65 69 -92 69q2 0 -77 -45l102 122q61 80 61 134q43 -14 69 -31v-21q-48 -45 -70 -76q2 -2 12 -2l127 39q24 -1 52 -51l-124 -135q0 -6 3 -8q75 -55 175 -88zM570 981l-17 -4q-22 0 -59 32l-65 59h61q18 1 49 -25.5 t31 -38.5v-23zM588 830q-10 -12 -31.5 -12t-72.5 40l-87 72h65h3q31 0 90 -40q27 -19 33 -60zM1300 22l-38 -56l-151 90l6 -167l-47 16l-15 185l-214 128v-252l162 -108l-20 -46l-142 93l3 -182h-60l3 182l-141 -93l-21 46l162 108v252l-213 -128l-15 -185l-47 -16l6 167 l-152 -90l-36 56l156 89l-150 72l30 43l173 -85l226 128l-226 125l-173 -83l-30 43l150 70l-156 91l36 55l152 -90l-6 168l47 -15l15 -188l213 -128v253l-162 109l21 47l141 -93l-3 181h60l-3 -181l142 93l20 -47l-162 -109v-253l214 128l15 188l47 15l-6 -168l151 90 l38 -55l-156 -91l148 -70l-30 -43l-174 83l-225 -125l225 -128l174 85l30 -43l-148 -72zM570 1329q-54 -6 -75 -6t-43 11q-26 -25 -51 -59q32 -13 49 -24.5t48 -29.5q30 35 72 108z" />
+<glyph unicode="&#x1f02a;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1058 1049q0 -4 -10 -19q-31 -51 -32.5 -156t-4.5 -123 q-13 -71 -72 -127l-33 95q-15 32 -69 32q9 0 -176 -15q-17 -39 -21 -73q-36 15 -40 60q0 -5 1 -5t1 77v158q0 16 -14 56.5t-21 51.5h18q79 0 96 8q7 3 38 75.5t31 84.5q0 32 -33 27l-235 -32q-24 7 -48.5 16.5t-32.5 32.5l704 71q65 0 119 -51q-6 -13 -27 -19l-408 -10 l43 -42l-106 -138q4 -8 15 -8l207 32h2q20 0 63 -22q45 -23 45 -37zM1035 433l58 14q32 0 60 -26q-17 -17 -73.5 -22.5t-64.5 -10t-62 -78.5q0 1 10 71q-7 3 -47.5 3t-87.5 -8q-8 -28 -19 -86q-15 16 -24 66q-13 10 -22 10l-37 -7q-14 0 -31 12v6q29 7 77 27q3 10 -15 43.5 t-20 37.5q14 2 25 2q55 0 55 -51q0 -13 -3 -29q3 -2 26 -2h-3q0 2 126 15q21 24 21 75q0 23 -4 51h44q8 0 41 -33q-14 -21 -39 -64v-10q6 -6 9 -6zM1270 64q-38 -23 -105 -23t-135 71l-126 141l-96 -137q-65 -84 -133 -115q-13 -4 -37 -16q0 12 1 16q176 129 222 319 q19 -7 47 -25q0 -6 5 -18q97 -119 267 -182zM984 108q0 -18 -44.5 -30t-62 -12t-49.5 19q84 44 120 44t36 -21zM1100 -53q0 -4 -22 -33q-34 -45 -34 -58.5t13 -32.5q-75 -9 -240 -27q-8 -8 -19 -23q-17 61 -25 99.5t-19 67t-11 40.5t11 12q3 0 26 -7.5t34 -7.5l189 36 q18 -3 57.5 -22.5t39.5 -43.5zM567 264l-88 -8q-15 0 -43 13q68 23 135 53v14q0 27 -3 70l-6 109q-9 14 -9 16v29q45 -13 84 -32v-12q0 4 -1 4q-4 0 -30 -121l2 -79q21 7 36 7t50 -8q-1 -11 -31 -25l-58 -26q0 -34 7 -97l45 27q23 13 42 11q-93 -76 -93 -88v-266v1 q-3 0 -36 -76h-1q-13 0 -38 34l-52 71l40 -3q14 0 22.5 6t18.5 54t10 66v83q-1 2 -3 3l-164 -116h-2q-29 0 -49 51q103 32 218 121v108zM952 975q0 49 -3 59q-9 28 -48 28l-249 -29v-109l180 28l38 -6q21 -4 29 -20q-43 -27 -108 -30l-135 -8v-116h58l132 28q55 -12 80 -39 q26 85 26 214zM982 -131q16 17 16 47.5t-8 46.5h-121q-25 0 -62 -15v-112h93h3q47 0 79 33z" />
+<glyph unicode="&#x1f02b;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 98 -70 111v-1873q70 17 70 110zM1405 -358v1880h-70v-1880h70zM1266 -358v1880h-70v-1880h70zM1127 -358v1880h-70v-1880h70zM988 -358v1880h-70 v-1880h70zM849 -358v1880h-70v-1880h70zM710 -358v1880h-70v-1880h70zM571 -358v1880h-70v-1880h70zM432 -358v1880h-70v-1880h70zM293 -358v1880h-70v-1880h70zM84 1408v-1652q0 -98 70 -111v1873q-70 -17 -70 -110z" />
+<glyph unicode="&#x1f02c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f02d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f02e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f02f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f030;" d="M2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-1918v-984h1918zM1933 140h-884v884h884v-884zM999 140h-884v884h884v-884z" />
+<glyph unicode="&#x1f031;" d="M2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934z" />
+<glyph unicode="&#x1f032;" d="M2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f033;" d="M2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f034;" d="M1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM1313 907 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f035;" d="M1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50 v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f036;" d="M1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f037;" d="M1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984z M1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM1913 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f038;" d="M2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f039;" d="M1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM629 582 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f03a;" d="M1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50 v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f03b;" d="M1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f03c;" d="M1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984z M1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f03d;" d="M1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f03e;" d="M1913 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984 h934zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f03f;" d="M2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f040;" d="M1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f041;" d="M1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50 v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5 t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f042;" d="M1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f043;" d="M1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984z M1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f044;" d="M1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f045;" d="M1913 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984 h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f046;" d="M629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f047;" d="M629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50 v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5 t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f048;" d="M629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f049;" d="M629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984z M1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f04a;" d="M629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f04b;" d="M629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984 h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f04c;" d="M629 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50 h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f04d;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984 q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5 t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f04e;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f04f;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984z M1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f050;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f051;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984 h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f052;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50 h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f053;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5 t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f054;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f055;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984z M1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f056;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f057;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984 h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f058;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50 h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f059;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5 t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f05a;" d="M329 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM629 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984 q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5 t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f05b;" d="M929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984z M1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f05c;" d="M929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5zM329 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f05d;" d="M929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984 h934zM929 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f05e;" d="M929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50 h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 582q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f05f;" d="M929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 582q0 -40 -28.5 -68.5 t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f060;" d="M929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1313 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1613 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984 q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5 t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f061;" d="M929 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 907q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM929 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1313 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 257 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1313 907q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1913 257q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM2033 90q0 -50 -50 -50h-1918q-50 0 -50 50v984q0 50 50 50h1918q50 0 50 -50v-984zM1983 90v984h-934v-984h934zM999 90v984h-934v-984h934zM929 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5 t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 582q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f062;" horiz-adv-x="1114" d="M1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 -377v1918h-984v-1918h984zM999 607h-884v884h884v-884zM999 -327h-884v884h884v-884z" />
+<glyph unicode="&#x1f063;" horiz-adv-x="1114" d="M1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984z" />
+<glyph unicode="&#x1f064;" horiz-adv-x="1114" d="M1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f065;" horiz-adv-x="1114" d="M1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f066;" horiz-adv-x="1114" d="M654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 390 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f067;" horiz-adv-x="1114" d="M979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50 v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f068;" horiz-adv-x="1114" d="M979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f069;" horiz-adv-x="1114" d="M979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918z M1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f06a;" horiz-adv-x="1114" d="M1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f06b;" horiz-adv-x="1114" d="M654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM654 1074 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f06c;" horiz-adv-x="1114" d="M979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50 v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f06d;" horiz-adv-x="1114" d="M979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f06e;" horiz-adv-x="1114" d="M979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918z M1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f06f;" horiz-adv-x="1114" d="M979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f070;" horiz-adv-x="1114" d="M979 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934 h-984v-934h984zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f071;" horiz-adv-x="1114" d="M1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f072;" horiz-adv-x="1114" d="M654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f073;" horiz-adv-x="1114" d="M979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50 v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f074;" horiz-adv-x="1114" d="M979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f075;" horiz-adv-x="1114" d="M979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918z M1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f076;" horiz-adv-x="1114" d="M979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f077;" horiz-adv-x="1114" d="M979 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934 h-984v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f078;" horiz-adv-x="1114" d="M654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f079;" horiz-adv-x="1114" d="M654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50 v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f07a;" horiz-adv-x="1114" d="M654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f07b;" horiz-adv-x="1114" d="M654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918z M1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f07c;" horiz-adv-x="1114" d="M654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f07d;" horiz-adv-x="1114" d="M654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984 v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f07e;" horiz-adv-x="1114" d="M654 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 90q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50 h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5 t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f07f;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50 v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f080;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f081;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918z M1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f082;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f083;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934 h-984v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f084;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50 h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5 t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f085;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 90q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f086;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f087;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918z M1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f088;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f089;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984 v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f08a;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50 h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5 t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f08b;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f08c;" horiz-adv-x="1114" d="M979 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 1074q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918 q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f08d;" horiz-adv-x="1114" d="M979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918z M1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5z" />
+<glyph unicode="&#x1f08e;" horiz-adv-x="1114" d="M979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5 t28.5 -68.5zM329 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f08f;" horiz-adv-x="1114" d="M979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934 h-984v-934h984zM979 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f090;" horiz-adv-x="1114" d="M979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50 h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1074q0 -40 -28.5 -68.5 t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f091;" horiz-adv-x="1114" d="M979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1074 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f092;" horiz-adv-x="1114" d="M979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM329 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM654 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918 q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f093;" horiz-adv-x="1114" d="M979 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1374q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 1374q0 -40 -28.5 -68.5t-68.5 -28.5 t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 774q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5 t68.5 -28.5t28.5 -68.5zM329 90q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 390 q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM979 390q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 -210q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5 t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM1099 -377q0 -50 -50 -50h-984q-50 0 -50 50v1918q0 50 50 50h984q50 0 50 -50v-1918zM1049 607v934h-984v-934h984zM1049 -377v934h-984v-934h984zM979 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5 t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5zM329 1074q0 -40 -28.5 -68.5t-68.5 -28.5t-68.5 28.5t-28.5 68.5t28.5 68.5t68.5 28.5t68.5 -28.5t28.5 -68.5z" />
+<glyph unicode="&#x1f094;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f095;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f096;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f097;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f098;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f099;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f09a;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f09b;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f09c;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f09d;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f09e;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f09f;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f0a0;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1403 -188h-1178v1540h1178v-1540zM1379 -164v1492h-1130v-1492 h1130zM1373 1178l-108 -144l-109 144l109 144zM1156 1178l-108 -144l-109 144l109 144zM1373 880l-108 -144l-109 144l109 144zM928 1178l-108 -144l-109 144l109 144zM1156 880l-108 -144l-109 144l109 144zM1373 582l-108 -144l-109 144l109 144zM700 1178l-108 -144 l-109 144l109 144zM928 880l-108 -144l-109 144l109 144zM1156 582l-108 -144l-109 144l109 144zM1373 284l-108 -144l-109 144l109 144zM472 1178l-109 -144l-108 144l108 144zM700 880l-108 -144l-109 144l109 144zM928 582l-108 -144l-109 144l109 144zM1156 284 l-108 -144l-109 144l109 144zM1373 -14l-108 -144l-109 144l109 144zM472 880l-109 -144l-108 144l108 144zM700 582l-108 -144l-109 144l109 144zM928 284l-108 -144l-109 144l109 144zM1156 -14l-108 -144l-109 144l109 144zM472 582l-109 -144l-108 144l108 144zM700 284 l-108 -144l-109 144l109 144zM928 -14l-108 -144l-109 144l109 144zM472 284l-109 -144l-108 144l108 144zM700 -14l-108 -144l-109 144l109 144zM472 -14l-109 -144l-108 144l108 144z" />
+<glyph unicode="&#x1f0a1;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM321 1252h-79v25h24l-16 46h-74l-16 -46h24v-25h-79v25h25 l54 155h-24v23h106v-23h-24l54 -155h25v-25zM1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37zM1085 713q78 -85 78 -158.5t-42.5 -119.5t-107.5 -46q-120 0 -181 136h-1 q0 -296 262 -304l4 -27h-566l4 27q263 8 263 304h-2q-61 -136 -181 -136q-65 0 -107.5 46t-42.5 119.5t78 158.5l156 152q92 100 115 207q23 -107 115 -207zM291 1096q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26t-34 37 q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1523 -113h-25l-54 -155h24v-23h-106v23h24l-54 155h-25v25h79v-25h-24l16 -46h74l16 46h-24v25h79v-25zM243 1347l-28 85h-4l-28 -85h60zM1445 -183h-60l28 -85h4z" />
+<glyph unicode="&#x1f0a2;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM910 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16 t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM146 1252q0 20 10 45t44 50t40.5 34.5t6.5 19.5q0 33 -33 33q-36 0 -36 -48v-8h-27v9q0 71 61 71q64 0 64 -55q0 -17 -9 -29t-48.5 -43 t-42.5 -53h76l1 46h24l-1 -72h-130zM1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37zM291 1096q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3 q14 26 22 84q-7 -26 -41 -26t-34 37q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1482 -88q0 -20 -10 -45t-44 -50t-40.5 -34.5t-6.5 -19.5q0 -33 33 -33q36 0 36 48v8h27v-9q0 -71 -61 -71q-64 0 -64 55q0 17 9 29t48.5 43t42.5 53h-76l-1 -46h-24l1 72h130zM925.5 43 q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18z" />
+<glyph unicode="&#x1f0a3;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM910 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16 t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM214 1272q39 0 39 37q0 36 -55 36h-5v25q51 0 51 32t-30 32q-34 0 -35 -40h-28q0 34 17.5 49t42.5 15q61 0 61 -54q0 -33 -28 -46 q38 -11 38 -44.5t-21 -49.5t-49 -16q-71 0 -71 72h28q1 -48 45 -48zM1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37zM910 650q33 -38 33 -59.5t-17.5 -39.5t-41.5 -18 t-44.5 15.5t-20.5 38.5q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18t-17.5 39.5t33 59.5l96 110zM291 1096q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26t-34 37 q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1414 -108q-39 0 -39 -37q0 -36 55 -36h5v-25q-51 0 -51 -32t30 -32q34 0 35 40h28q0 -34 -17.5 -49t-42.5 -15q-61 0 -61 54q0 33 28 46q-38 11 -38 44.5t21 49.5t49 16q71 0 71 -72h-28q-1 48 -45 48zM925.5 43q17.5 -18 17.5 -40 t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18z" />
+<glyph unicode="&#x1f0a4;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1249 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16 t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM571 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150 q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM282 1306h-33v-30h19v-24h-67v24h21v30h-68l-13 23l85 127h23v-126h33v-24zM1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3 q-14 -26 -22 -84q7 26 41 26t34 -37zM291 1096q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26t-34 37q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1379 -292v126h-33v24h33v30h-19v24h67v-24h-21v-30h68l13 -23l-85 -127h-23z M1264.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM586.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59 t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM222 1330v80l-53 -80h53zM1406 -166v-80l53 80h-53z" />
+<glyph unicode="&#x1f0a5;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1249 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16 t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM571 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150 q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM281 1316q0 -68 -70 -68q-64 0 -68 68h26q5 -44 42 -44q41 0 41 43.5t-38 43.5q-25 0 -41 -24q-9 9 -20 14l7 106h109v-54h-25v27h-62l-5 -60q20 16 42 16q62 0 62 -68zM1494 68q0 -12 -20 -35l-58 -66 l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37zM910 650q33 -38 33 -59.5t-17.5 -39.5t-41.5 -18t-44.5 15.5t-20.5 38.5q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -38.5 t-44.5 -15.5t-41.5 18t-17.5 39.5t33 59.5l96 110zM291 1096q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26t-34 37q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1417 -108q-41 0 -41 -43.5t38 -43.5q25 0 41 24q9 -9 20 -14 l-7 -106h-109v54h25v-27h62l5 60q-20 -16 -42 -16q-62 0 -62 68t70 68q64 0 68 -68h-26q-5 44 -42 44zM1264.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151 q0 23 20.5 39t44.5 16t41.5 -18zM586.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18z" />
+<glyph unicode="&#x1f0a6;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1249 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16 t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM1249 650q33 -38 33 -59.5t-17.5 -39.5t-41.5 -18t-44.5 15.5t-20.5 38.5q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150 q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18t-17.5 39.5t33 59.5l96 110zM571 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM221 1381 q56 0 56 -66.5t-61 -66.5q-32 0 -51 26t-19 78q0 106 71 106q57 0 59 -63h-26q-5 39 -35 39q-41 0 -42 -76q21 23 48 23zM1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37 zM291 1096q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26t-34 37q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1482 -188q0 -106 -71 -106q-57 0 -59 63h26q5 -39 35 -39q41 0 42 76q-21 -23 -48 -23q-56 0 -56 66.5t61 66.5 q32 0 51 -26t19 -78zM1264.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM571 650q33 -38 33 -59.5t-17.5 -39.5t-41.5 -18 t-44.5 15.5t-20.5 38.5q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18t-17.5 39.5t33 59.5l96 110zM586.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92 t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM215 1272q37 0 37 41t-35 41q-22 0 -43 -26q7 -56 41 -56zM1413 -108q-37 0 -37 -41t35 -41q22 0 43 26q-7 56 -41 56z" />
+<glyph unicode="&#x1f0a7;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1249 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16 t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM1249 650q33 -38 33 -59.5t-17.5 -39.5t-41.5 -18t-44.5 15.5t-20.5 38.5q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150 q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18t-17.5 39.5t33 59.5l96 110zM910 904q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM571 1221 q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM220 1276h23v-24h-80v24h28q5 85 52 152h-70v-27h-24v54h127v-22q-56 -67 -56 -157z M1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37zM291 1096q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26t-34 37 q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1479 -291h-127v22q56 67 56 157h-23v24h80v-24h-28q-5 -85 -52 -152h70v27h24v-54zM1264.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5 t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM571 650q33 -38 33 -59.5t-17.5 -39.5t-41.5 -18t-44.5 15.5t-20.5 38.5q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18t-17.5 39.5t33 59.5l96 110zM586.5 43 q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18z" />
+<glyph unicode="&#x1f0a8;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1249 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16 t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM1249 650q33 -38 33 -59.5t-17.5 -39.5t-41.5 -18t-44.5 15.5t-20.5 38.5q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150 q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18t-17.5 39.5t33 59.5l96 110zM910 904q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM571 1221 q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM282 1307q0 -59 -70.5 -59t-70.5 59q0 37 36 51q-29 17 -29 47q0 53 64 53t64 -53 q0 -30 -29 -47q35 -14 35 -51zM1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37zM291 1096q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84 q-7 -26 -41 -26t-34 37q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1487 -143q0 -37 -36 -51q29 -17 29 -47q0 -53 -64 -53t-64 53q0 30 29 47q-35 14 -35 51q0 59 70.5 59t70.5 -59zM925.5 392q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18 t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM1264.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5 q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM571 650q33 -38 33 -59.5t-17.5 -39.5t-41.5 -18t-44.5 15.5t-20.5 38.5q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18t-17.5 39.5t33 59.5l96 110zM586.5 43 q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM249 1402q0 32 -37.5 32t-37.5 -32t37.5 -32t37.5 32zM253 1308.5 q0 36.5 -41.5 36.5t-41.5 -36.5t41.5 -36.5t41.5 36.5zM1458 -144.5q0 36.5 -41.5 36.5t-41.5 -36.5t41.5 -36.5t41.5 36.5zM1454 -238q0 32 -37.5 32t-37.5 -32t37.5 -32t37.5 32z" />
+<glyph unicode="&#x1f0a9;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1249 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16 t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM1249 841q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 15.5t-20.5 38.5q9 -61 15 -90t22 -59q-15 5 -42 5t-42 -5q21 40 37 149 q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18.5t-17.5 40.5t33 59l96 109zM571 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM277 1354 q0 -106 -71 -106q-56 0 -58 63h25q5 -39 36 -39q40 0 41 76q-21 -23 -47 -23q-57 0 -57 66.5t61 66.5q32 0 51 -26t19 -78zM1264.5 423.5q17.5 -17.5 17.5 -39t-33 -59.5l-96 -110l-96 110q-33 38 -33 59.5t17.5 39t41.5 17.5t44.5 -15.5t20.5 -38.5q-9 63 -15 92t-22 59 q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 38.5t44.5 15.5t41.5 -17.5zM1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37zM910 650q33 -38 33 -59.5t-17.5 -39.5 t-41.5 -18t-44.5 15.5t-20.5 38.5q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18t-17.5 39.5t33 59.5l96 110zM291 1096q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26 t-34 37q0 12 20 35l58 66l59 -66q20 -22 20 -35zM571 841q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 15.5t-20.5 38.5q9 -61 15 -90t22 -59q-15 5 -42 5t-42 -5q21 40 37 149q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18.5t-17.5 40.5t33 59l96 109zM1425 -161 q57 0 57 -66.5t-61 -66.5q-32 0 -51 26t-19 78q0 106 71 106q56 0 58 -63h-25q-5 39 -36 39q-40 0 -41 -76q21 23 47 23zM1264.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5 q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM586.5 423.5q17.5 -17.5 17.5 -39t-33 -59.5l-96 -110l-96 110q-33 38 -33 59.5t17.5 39t41.5 17.5t44.5 -15.5t20.5 -38.5q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 38.5t44.5 15.5t41.5 -17.5z M586.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM209 1434q-37 0 -37 -41t34 -41q22 0 43 26q-6 56 -40 56zM1419 -270 q37 0 37 41t-34 41q-22 0 -43 -26q6 -56 40 -56z" />
+<glyph unicode="&#x1f0aa;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1249 1221q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16 t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM1249 841q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 15.5t-20.5 38.5q9 -61 15 -90t22 -59q-15 5 -42 5t-42 -5q21 40 37 149 q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18.5t-17.5 40.5t33 59l96 109zM910 1031q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM571 1221 q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 16t-20.5 39q9 -62 15 -91t22 -59q-15 5 -42 5t-42 -5q21 39 37 150q0 -23 -20.5 -39t-44.5 -16t-41.5 18.5t-17.5 40.5t33 59l96 109zM314 1353q0 -105 -61.5 -105t-61.5 105t61.5 105t61.5 -105zM1264.5 423.5 q17.5 -17.5 17.5 -39t-33 -59.5l-96 -110l-96 110q-33 38 -33 59.5t17.5 39t41.5 17.5t44.5 -15.5t20.5 -38.5q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 38.5t44.5 15.5t41.5 -17.5zM191 1252h-83v24h28v154h-28v25h56v-179h27v-24zM1494 68 q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37zM291 1096q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26t-34 37q0 12 20 35 l58 66l59 -66q20 -22 20 -35zM1520 -291h-56v179h-27v24h83v-24h-28v-154h28v-25zM571 841q33 -37 33 -59t-17.5 -40.5t-41.5 -18.5t-44.5 15.5t-20.5 38.5q9 -61 15 -90t22 -59q-15 5 -42 5t-42 -5q21 40 37 149q0 -23 -20.5 -38.5t-44.5 -15.5t-41.5 18.5t-17.5 40.5 t33 59l96 109zM1437 -189q0 -105 -61.5 -105t-61.5 105t61.5 105t61.5 -105zM1264.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16 t41.5 -18zM925.5 265q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM586.5 423.5q17.5 -17.5 17.5 -39t-33 -59.5l-96 -110 l-96 110q-33 38 -33 59.5t17.5 39t41.5 17.5t44.5 -15.5t20.5 -38.5q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 38.5t44.5 15.5t41.5 -17.5zM586.5 43q17.5 -18 17.5 -40t-33 -59l-96 -109l-96 109q-33 37 -33 59t17.5 40t41.5 18t44.5 -16 t20.5 -39q-9 63 -15 92t-22 59q15 -5 42 -5t42 5q-21 -39 -37 -151q0 23 20.5 39t44.5 16t41.5 -18zM285 1353q0 81 -32.5 81t-32.5 -81t32.5 -81t32.5 81zM1408 -189q0 81 -32.5 81t-32.5 -81t32.5 -81t32.5 81z" />
+<glyph unicode="&#x1f0ab;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM285 1429h-28v-110q0 -80 -71 -80q-46 0 -56 48l26 9 q10 -31 33 -31q37 0 37 53v111h-41v26h100v-26zM1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37zM1284 -166h-940v1496h940v-1496zM291 1096q0 -37 -36 -37q-32 0 -39 26 q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26t-34 37q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1439 -101q-37 0 -37 -53v-111h41v-26h-100v26h28v110q0 80 71 80q46 0 56 -48l-26 -9q-10 31 -33 31zM1162 1196v25h-14q-6 -5 -6 -11q0 -15 12 -14h8z M1150 1057l-3 -13q0 -7 18 -17q-3 -2 -7 -2q-14 0 -14 24q0 2 12 29q6 20 24.5 74.5t18.5 62.5q0 35 -43 35t-43 -39q0 -8 8.5 -25t21.5 -17h14q1 8 5 21q-23 -2 -23 17.5t18 19.5q13 1 13 -11q0 -52 -22 -52q-9 0 -11 2q6 -28 6 -31q2 6 7 16v-3q-32 -86 -32 -96t9 -36 q15 -14 35 -14q40 0 40 40.5t-30 40.5q-11 0 -20 -20q11 0 16 -2q13 -11 13 -20t-11 -13q5 22 5 23q-2 1 -8 6h-17zM1188 1081q-3 12 -14 33l-11 -28q18 0 25 -5zM1225 988v4h-18v-4h18zM1178 960q-17 0 -21 -2q22 1 46.5 3.5t31.5 -3.5q-2 14 -2 25zM1239 1000l5 -56 q0 -25 -10 -66h-35l73 -43v483h-180l-55 -123q13 -29 13 -37.5t-1 -6.5q-18 34 -18 41.5t13 33.5h-167l-10 -13q-8 -21 -8 -42t8 -32q39 0 39 -30q0 -39 -42 -39q-7 0 -13 2v-28q48 -34 128 -34q40 0 44 14v35q-14 -5 -21 -15q0 13 5 20q13 1 23.5 17t10.5 17q6 2 17 7 q-7 37 -7 43l15 -45q-11 -5 -28 -14q-9 -12 -6.5 -37.5t1.5 -29.5q-11 -19 -27 -20t-30 -1l112 -62q5 6 11 36t22 30q5 0 12 -3q-20 21 -20 48l26 81q0 4 -12 37l-6 6q-11 24 -11 36q0 46 47 46t47 -38l-26 -96l29 -77q0 -19 -21 -42q35 0 53 -3zM1233 938v11h-24 q-13 1 -57 -11h81zM1230 910v15q-12 -3 -56 1v-6q36 -10 48 -10h8zM1207 985l-12 6h-79l-16 -54q16 -8 43 -24q5 40 11 63q19 3 53 9zM1230 902h-55q-3 3 -2 8h-16q4 -5 29.5 -14t32.5 -9t11 3v12zM1170 920v4l-18 3v-5zM880 1130q-9 0 -17 -17l2 -14q-5 4 -10 5q2 12 3 33 q-10 50 -10 49t8 38h-20q-12 -21 -12 -52q0 -89 40 -89q34 0 34 29q-3 18 -18 18zM814 1190q0 6 1 20t-1 17h-10q-16 -16 -16 -49t11.5 -66.5t28.5 -33.5q-3 0 12 3q-26 50 -26 109zM780 1173q0 5 8 51h-23q-14 -16 -14 -46.5t2.5 -51t15 -33.5t15.5 -13t17 4q-21 27 -21 89 zM756 1090q-18 30 -18 61.5t13 69.5q-4 1 -6 3q-11 0 -14 -6q-17 -32 -17 -58q0 -82 29 -82q-4 0 13 3v9zM712 1224q-32 -62 -32 -85t4 -32q10 -27 30 -26v9q-10 29 -10 61.5t18 72.5h-10zM845 1055v20l-4 -4l-72 4q-22 0 -51 -11q-8 -10 -23 -26l-4 4q10 7 15 19 q-4 3 -12 6q-21 -43 -21 -51t14 -14q1 0 2 16t13 21q-6 -11 -1.5 -22.5t16.5 -12.5q-3 26 14 35q-1 -31 3 -34h17q-3 29 11 34q3 15 3 -37h15q-4 17 4.5 33t23.5 12q4 9 14 20q0 -9 -4 -15t-4 -11q5 -15 -1 -23q-1 8 -5 20h-14q-9 -8 -9 -18q0 -18 18.5 -18t30 19t11.5 34z M1272 458v96l-51 21l-11 -11zM650 1038q-12 -11 -12 -14t3 -19q18 -3 23 -3q-4 18 0 36h-14zM1011 652q-4 -1 -25.5 -1t-27.5 2v351q-36 3 -106 27q-20 -37 -62 -37q8 0 -18 3t-32 -4v-347h-60v143q1 30 -19 76.5t-40 65.5t-25 19t-57 -23q92 -47 115 -144l14 -152h353 l60 308q-2 0 -10 4l-41 -204q-6 -29 -19 -87zM356 1318v-460l296 138q-21 -1 -21 21t24.5 27t30.5 30q-6 5 -13 13q-8 31 -8 49.5t28 94.5l-24 87h-313zM1144 392l29 -49l-16 -34h17q25 0 25 30q0 13 -11 25q-18 18 -18 28l19 55q0 16 -21.5 31t-28.5 31q1 23 -1 53 q-6 13 -21 15.5t-26 3.5q-18 8 -27.5 35.5t-25.5 37.5q-2 -9 -6 -23q12 -5 14 -21l5 -31q28 -6 66 -32q-5 -15 4 -59q5 -9 23 -21t18 -21zM487 779l-29 50q0 4 15 29h-28q-16 -22 -16 -30.5t31 -39.5v-11q0 -9 -1 -11l-20 -47q0 -11 12.5 -20t31.5 -24q9 -10 9 -36.5 t1 -28.5q10 -19 31 -22l21 -3q15 -8 25.5 -35.5t22.5 -34.5q6 18 6 23q-12 4 -14.5 21t-4.5 32q-10 8 -33.5 13t-33.5 20l4 45q-2 10 -25.5 26t-23.5 27zM1272 -154v465l-296 -137q7 -2 24 -13q1 -22 -10 -30q-12 -4 -31 -12q-5 -8 -14 -24q13 -13 15 -18q6 -23 6 -40.5 t-3.5 -31.5t-14.5 -39t-11 -26l24 -94h311zM617 512q9 1 28 1t25 -2v-348q43 0 112 -27q12 33 44.5 33.5t63.5 1.5v347h58q-1 -16 -1 -32q0 -91 22 -182q10 -15 25 -42q23 -45 43 -45q5 0 55 22q-91 52 -110 129q-13 54 -16 168h-356l-61 -302q2 -3 7 -9q12 53 28 135 t33 152zM992 150q0 4 -8 14h-19q6 -17 0 -35h10q17 -1 17 21zM943 162q0 -17 -7 -33q4 -3 -9 -21q2 -2 3 -6h9q19 38 19 35v22zM439 593l-83 121v-112l71 -19q9 0 12 10zM934 159q-13 3 -17 3q0 -10 -17 -37q0 3 2.5 15.5t1.5 17.5q-3 7 -14 7q3 0 -10 -3q10 -20 -7 -36 l-4 4q4 17 -1 32h-14q5 -37 -32 -46q-5 -13 -10 -17h-3v7q2 15 9 43q2 -8 10 -23q17 11 17 21q0 15 -19 15q-39 0 -38 -56v-14h77q-4 0 51 11q13 18 13 21.5t5 17.5v17zM914 -60q36 52 36 87.5t-21 58.5h-10q9 -25 9 -51q0 -28 -10 -57q-12 -36 -12 -30q0 -3 8 -8zM892 -57 q24 16 24 81t-34 65q-4 0 -10 -6q18 -36 18 -65.5t-13 -74.5h15zM830 83q21 -32 21 -72.5t-11 -70.5h26q14 41 14 70q-4 76 -37 76zM815 86h-14q21 -12 21 -93q0 -21 -4 -34.5t4 -18.5h6q6 0 10.5 22t4.5 51q-8 73 -28 73zM763 84q-30 0 -30 -25q0 -20 22 -20q11 0 11 29 q18 -10 8 -30q9 -31 9 -40.5t-8 -54.5q12 -3 17 -3q7 9 13 22l4 37q0 53 -13 69t-33 16zM780 95v27q-36 35 -122 35q-37 0 -45 -7q-3 -7 -6 -10v-30q16 1 22 13l2 -11q-1 -4 -5 -9q-17 -7 -21 -13q-16 -25 -32 -28q26 -71 26 -86.5t-10 -35.5h167q16 16 16 45t-6 46l-12 -2 q-29 0 -29 34q0 4 8.5 16.5t15.5 14t31 1.5zM479 242l-18 4v-8zM458 257h15q-18 21 -46 20h-26l-3 -12q60 0 60 -1v-7zM433 175h82l16 57q-20 12 -44 22l-8 -63q-28 -5 -82 -12q17 -5 28 -1zM458 243q-16 8 -57 7l-3 -7h60zM398 227v-10h16q15 0 42 11q8 -8 6 -8q4 0 17 7 h-81zM473 207h-78q4 -12 3 -24q19 8 53 24l7 -6q2 2 15 6zM500 162q13 -22 13 -38.5t-17 -58.5l-9 -23q0 -17 14 -42.5t14 -36.5q0 -49 -44 -49q-17 0 -34.5 13t-15.5 32l26 93q-8 20 -22 61q16 -27 31 -27q1 0 17 21q-19 -2 -24 11q25 -8 16 -8h8q6 12 6 17q0 12 -15 12 q-6 0 -16 -16q0 2 -3 7q13 14 19 14q17 0 17 -22q0 -5 -27.5 -74t-27.5 -92q0 -37 43.5 -37t43.5 42t-31 42h-13q-2 -8 -7 -21q-1 1 -1 3q0 13 21 59q25 53 25 79q0 42 -40 42q-34 0 -43 -27q1 -8 -2 -20q-4 9 -4 17t19 26q-27 0 -43 3q-7 68 -7 78.5t10 45.5h37l-78 41 v-483h180q58 127 58 130v-2q-4 0 -29 92q11 4 28 11q4 9 8 27q-4 6 -4 7q7 11 1 34q10 21 26 21h30l-113 64q-6 -19 -23 -67q-13 -2 -18 -1zM460 80q-12 0 -20 9q4 -12 14 -31q0 10 6 22zM491 6q-6 29 -6 31q-6 -12 -14 -31h20zM1023 1218q-2 -5 -8 -14q-57 -3 -70 -11 q8 16 40 19t38 6zM993 1185q8 0 -30 -10q13 6 40 14q-2 0 -6 -3q3 -3 21 1q-3 -11 -8 -33q-17 2 -47 14q12 3 32 13q5 4 -2 4zM1034 1111h11q-16 -6 -27 -6q13 6 16 6zM1018 1090q-21 -12 -29.5 -12t-14.5 1zM982 1098q-13 -3 -13 -15q-4 7 0 15h13zM789 1062q-1 -5 -5 -16 q-1 2 -4 7q4 3 9 9zM763 1058l-7 -10l-3 3l6 9zM736 1056l-8 -15l-4 1l9 15zM759 977q0 -16 59 -27h34q78 0 95 26v-303q1 -22 -95 -22t-96 33zM624 1096q0 -57 -59 -57q-51 0 -51 52q0 10 10 31l-5 1q-16 -27 -16 -53.5t32 -92.5h-70q31 66 31 92.5t-15 53.5l-6 -1 q10 -21 10 -31q0 -52 -51 -52q-58 0 -58 57q0 36 57 105.5t67 94.5q9 -25 66.5 -94.5t57.5 -105.5zM1252 68q0 -36 -57 -105.5t-67 -94.5q-9 25 -66.5 94.5t-57.5 105.5q0 57 59 57q51 0 51 -52q0 -10 -10 -31l5 -1q16 27 16 53.5t-32 92.5h70q-31 -66 -31 -92.5t15 -53.5 l6 1q-10 21 -10 31q0 52 51 52q58 0 58 -57zM874 194q-23 23 -81 23t-98 -14q-9 -4 -9 -11l-3 301q0 20 20 21q11 1 91 1t80 -16v-305zM907 121l-7 -9l-3 2l6 10zM880 119l-8 -12l-4 2l9 12zM849 116l-6 -9l-4 2l6 9zM652 86q14 0 -42 -9q50 12 36 12q13 0 19 -6 q-2 -9 -5 -12q2 6 2 11q-4 4 -10 4zM607 60l-20 -6v4l20 6v-4zM665 -11l-34 -13v3l32 14zM667 1q-2 0 -57 -24q1 2 8 33q16 1 49 -9zM685 -26q-3 -8 -27 -16t-37 -8l-13 3q3 0 5.5 5.5t4.5 6.5q5 -1 10 -1q22 0 57 10zM455 -46l3 22h20q9 -8 9 -17q0 -17 -20 -17 q-12 0 -12 12zM992 1162l-3 10l-14 -7q16 -3 17 -3zM942 681v266q-38 -24 -97.5 -24t-77.5 26v-257q0 -30 87 -32h11q77 0 77 21zM851.5 503.5q-12.5 1.5 -76.5 1.5t-70 -1q-18 -3 -16 -22v-262q17 23 91 23t83 -21v271q1 9 -11.5 10.5zM656 -1v5h-17v-5h17zM475 -52 q9 8 9 9t-3 14h-18v-23h12zM890 819q0 -16 -15 -16t-19 11q4 -26 10 -37q-4 1 -11 1t-12 -1q7 11 10 37q-3 -11 -18 -11t-15 16q0 6 9 16l26 29l26 -29q9 -10 9 -16zM810 347q0 -5 -9 -15l-25 -30l-27 30q-9 9 -9 15q0 17 15.5 17t18.5 -12q-4 26 -10 37q4 -1 11.5 -1 t11.5 1q-6 -11 -10 -37q3 12 18 12t15 -17z" />
+<glyph unicode="&#x1f0ac;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM283 1267q-43 -19 -72 -19q-102 0 -102 105t102 105q34 0 72 -18 v-36h-6q-32 26 -68 26q-67 0 -67 -77t68 -77q37 0 67 26h6v-35zM1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37zM1284 -166h-940v1496h940v-1496zM291 1096 q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26t-34 37q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1345 -103q43 19 72 19q102 0 102 -105t-102 -105q-34 0 -72 18v36h6q32 -26 68 -26q67 0 67 77t-68 77q-37 0 -67 -26h-6v35z M1272 1318h-234q12 -28 60 -68q-5 -10 -37 -26t-32 -63v-13l13 3q2 -43 26 -68q8 -2 34 -27q33 -10 33 -40t-15 -57q79 -10 152 -98v457zM1024 1181l-7 -17v-24h6q3 -1 6 -1h1q-6 4 -6 16v26zM1009 1170q-1 5 -6 26q-4 -19 -4 -45q2 2 10 19zM994 1185l-6 24q-7 -38 -7 -52 q10 16 13 28zM955 1169l14 43l-6 9l-11 -52q0 -15 14 -29l10 3l-3 8q0 10 1.5 30.5t1.5 30.5q-12 -23 -12 -34t2 -20l-2 -6q-9 9 -9 17zM1027 1130q-10 0 -25 10q1 -18 22 -19zM1047 1074v20q-6 2 -21 18v-21q-7 9 -21 24l-2 -3q0 -12 15.5 -24.5t28.5 -13.5zM1078 1038 q0 -16 -13 -16h-30q4 -1 19 -10.5t19.5 -9.5t15.5 7t15 8q-8 -6 -23 -19q16 8 42 15q-4 8 -31 18q6 4 18 13q-9 3 -23 2q-3 10 -5.5 19.5t-16.5 8.5q13 -27 13 -36zM988 1086q0 -19 44 -27q-13 -4 -32 -4q13 -5 53 -5q-9 -3 -53 -12q10 -1 35 -1t34 -3l3 7q0 16 -32.5 29 t-37.5 21q-1 17 -14 36v-41zM1110 1005q-10 0 -24 -19q11 4 36 7l-3 12h-9zM970 1104q3 -9 3 -14.5t-3 -15.5l-3 8q-1 -3 -1 -14t16 -16l-9 76q-5 -17 -6 -30zM1069 981q0 22 -38 33t-46 18q2 -17 34.5 -30.5t34.5 -33.5l8 6l3 -9q4 8 4 16zM1044 956q0 30 -34 39t-40 37 q-12 -23 -12 -27q0 -29 41.5 -32.5t41.5 -9t-6 -15.5l-9 5l9 7l-9 5l-6 -9l3 -12h18q3 4 3 12zM739 1245q0 4 -6 9q-6 -12 -6 -31q12 18 12 22zM849 941l39 -14q13 0 41.5 22.5t28.5 35t-10 28.5q-55 -49 -113 -50l-7 3v3q4 -1 10 -1q35 0 81.5 26.5t46.5 52.5l-9 33v22 q1 15 1 22l-10 40l4 59q0 22 -54 38t-84 16q-72 0 -72 -33v-23q20 5 23 5q49 0 49 -48l-7 -75v-11q3 -4 9 -4t12.5 2t8.5 2.5t7 14.5q5 0 5 -9q0 -16 -21 -16t-36 15q0 2 9 9q6 34 6 73t-50 39q-8 0 -18 -10l-1 -12q0 -11 9 -11q2 0 21 11l6 -2q-7 -3 -20 -12l3 -1l21 4 q20 0 20 -19q0 -10 -11 -20q-11 6 -21.5 6t-12.5 -6l-6 6q-5 -14 -5 -28q0 -99 75 -152l-4 -1q-5 0 -38 34h-15q22 -70 60 -70zM1006 945q0 -5 3 -18q-7 4 -15 21q0 -8 9 -27h24l5 9q-20 13 -24 27q-1 -2 -2 -6v-6zM721 1218v23h-6v-23h6zM783 1160q-1 1 -14 9h-9l5 -9h18z M634 1295q-2 9 -8 23h-13q6 -8 21 -23zM1248 671v12q-55 46 -159 141l3 -15q77 -91 156 -138zM1034 794l2 -28q-15 -15 -15 -18.5t10 -22.5q31 130 98 214q-4 12 -15 12q-3 0 -18 -17l-29 -24q-1 -2 -1 0.5t4 -36.5q-8 -7 -22 -23q2 -10 4 -33q-18 -12 -18 -24zM645 1265v12 h-6v-12h6zM724 1193v12q-8 -7 -21 -24q8 3 21 12zM724 1176l-4 5l-11 -17l5 -1zM1152 704l28 3v-44q3 -1 24 -1.5t20 -16.5q7 1 13 6v15q-39 32 -147 134q-7 3 -13 3q0 -11 -3 -18q25 5 25 -29l-1 -10q15 0 30 -2q7 -6 9 -23t15 -17zM564 1314v4h-12l-6 -4h18zM610 1259 l-4 9l-5 -2l5 -9zM1028 802q18 11 18 24t-9 28q10 5 27 18q0 12 -4 33l30 30q0 9 7 19l-1 6h-15q-57 -90 -89 -274l2 -6q12 5 12 23q11 11 12 45q4 8 13 24q-3 17 -3 30zM969 956l-5 18q-25 -27 -78 -78q64 4 83 60zM699 1125v-13l36 64q-36 -37 -36 -51zM577 1318h-2 q-10 -24 -10 -30.5t7.5 -18t7.5 -16.5t-3 -10.5t-3 -9.5q-6 1 -12 15q0 -11 -3 -15q2 -18 20 -18q8 0 12 5q0 66 -2 58l9 -7q-3 5 -3 19q14 -6 23 -19q-3 5 -5 16l6 3l-16 18l1 10h-19l-6 -8q-2 4 -2 8zM618 1212q4 -10 13.5 -10t28.5 19q-25 0 -35 5q8 5 18 4q-3 1 -16 8 q-6 -2 -18 -5zM727 1142l-4 1l-11 -18l5 -1zM1189.5 654q-18.5 0 -20.5 22.5t-8 22.5q-29 0 -31 3q-3 15 -5 30q-7 8 -25 8t-8 -2q-2 13 -6 36h-15q-5 -3 -5 -10q0 -17 60 -70.5t84 -66.5l5 26q-7 1 -25.5 1zM1272 582v17q-28 22 -40 22t-34 -22q17 6 32 6q10 0 10 -10v-13 h32zM558 1262v42q-5 -5 -9 -15q2 -9 9 -27zM604 1217q0 -32 32 -32q5 0 15 5q-6 -1 -11 -1q-28 0 -36 37v-9zM1062 749q-15 -11 -15 -21.5t57 -58.5t81 -64l13 12l-118 111q-1 -9 -11 -12q-1 12 6 18zM865 896q9 10 9 14t-9 22v-36zM745 1037l-3 3l-13 -15l3 -3zM843 935 q-14 -12 -14 -21t9 -18q-5 21 17 24q-2 9 -12 15zM1071 647l28 3q16 0 18.5 -19t7.5 -22q31 1 43 -21l5 9q-1 3 -128 114q0 -4 -13 -24q4 1 7 1q28 0 32 -41zM757 1035q-36 -22 -38 -22t-6.5 1.5t-6.5 1.5l5 -18q8 2 25 7l2 -1l-6 -6q14 0 28 15zM946 903q-17 0 -69 -18 q17 -62 23 -109l4 -8q40 108 42 135zM1153 582v20l-24 -5q6 -5 24 -15zM1030 701v17q-6 -2 -15 -9q0 -9 7 -17zM726 969q0 -26 63 -64q-4 10 2.5 10t12.5 -7q3 6 10 16q-35 35 -54 69q-15 -3 -34 -10v-14zM1107 617q0 27 -12 27q-6 0 -20 -8q10 -10 32 -25v6zM1060 650 l-4 28q-13 0 -24 -6q10 -16 28 -22zM873 777q7 7 7 18.5t-9 39.5t-10 40q-6 -12 -6 -21q0 -66 18 -77zM872 872l13 -81q0 -19 -17 -19q-14 0 -18 71q-1 -11 0.5 -46.5t14.5 -35.5q18 0 28 20zM675 1019l-20 7q-19 0 -28 -16q-2 -18 -13 -26.5t-14 -14.5q6 -14 15 -15l1 11 l-3 4q4 5 11.5 4t13 -1t10.5 9t22.5 9t21 3.5t8.5 32.5q16 4 41 24q-15 -12 -44 -12h-3q4 12 23.5 19t20.5 14q-19 -3 -50 -16q-5 -4 -8 -20t-5 -16zM931 765q-14 0 -19 -11v-18q5 -10 16.5 -10t22.5 10v18q-6 11 -20 11zM982 697q0 21 -21 21t-21 -21t21 -21t21 21z M811 879h-4l-9 -72h4zM816 764h14q13 43 13 87v6l-3 13l-2 -51q-2 -30 -14 -46l-12 2l9 6q2 33 9 100q-6 -43 -29 -102q-1 -7 -3 22q-1 -10 -4 -34q9 -3 22 -3zM804 891q-47 13 -93 90l-5 -9q31 -69 72 -184q12 16 16.5 46.5t9.5 56.5zM991 670q-22 0 -22 -19.5t21 -19.5 q8 0 19 11v18q-11 10 -18 10zM1041 612q-10 9 -19.5 9t-18.5 -9v-23q9 -10 18 -10t20 10v23zM1051 576q-22 0 -22 -21q0 -18 21 -18q10 0 19 9v19q-11 11 -18 11zM869 729l-3 18h-6l3 -18h6zM855 726v21h-6v-21h6zM1083 481q19 0 19 21t-19 21q-9 0 -20 -10v-21 q11 -11 20 -11zM1132 457q0 17 -19 17q-12 0 -21 -9v-20q8 -9 19 -9q21 0 21 21zM814 747v5h-12v-5h12zM1161 421q-9 8 -17.5 8t-18.5 -11v-19q8 -9 17 -9t19 9v22zM990 561v17q-6 -2 -15 -9q0 -9 7 -17zM796 747l-3 8l-6 -2l5 -9zM1020 543q-10 -8 -29 -21v-11q8 -5 24 -13 q0 26 5 45zM1054 486l-9 12q-6 -15 -16 -26q5 -4 10 -15q6 9 15 29zM994 501l-7 -15q0 -7 9 -44q42 52 42 63t-8 18q-2 -11 -4 -34l-3 -2q-16 0 -29 14zM699 1148l-3 25q0 9 7.5 27t7.5 36.5t-19 31.5l-38 25v-25q24 -22 24 -59q0 -30 -41 -30q-15 0 -28.5 13t-19.5 16 q-12 1 -34 13q-18 21 -18 57l7 26q-5 11 -2 14h-186v-720q13 3 40 8q2 -13 7 -36q18 2 53 13q-34 22 -82 69q29 91 56 130q20 12 56 42q19 33 61 96q14 10 39 33q-2 7 32 37q-1 42 45 42q1 0 9 -3q-5 9 -5 15q0 24 30 39q-6 17 -6 32zM1081 436q-5 -10 -33 -12v-40 q16 17 33 52zM987 489l-8 12v-20zM1038 432q7 3 14.5 3t16.5 -3v31l-7 8q-12 -14 -53 -74q8 0 24 -7q5 14 5 42zM1024 465q-24 -34 -24 -41.5t5 -11.5q1 2 33 45q-10 -1 -14 8zM1047 384l-9 -5q-7 2 -21 5q1 -15 13 -27q6 8 17 27zM976 405l-6 -27l30 -20q-6 -15 -6 -23.5 t2 -12.5q24 -5 24 -36v-13q28 -5 28 -45q18 5 18 21l-24 48q-49 97 -69 169q-6 49 -27 128q-6 12 -27 13l-4 -7q0 -4 8 -12t8 -14l-9 -24h-1l7 23q0 4 -18 25l-1 5l1 9l-6 6h-10q30 -234 136 -402q11 9 11 33v7q-18 11 -27 21q8 27 -26 47l2 34q-9 5 -24 17q0 54 1 37 q-4 3 -9 11q18 -9 18 -18zM700 591l20 -30l-2 -9l6 -6h11q-31 234 -137 402q-10 -9 -10 -33v-7q17 -11 27 -21q-9 -27 25 -47q0 -4 -1 -16t0 -18q8 -5 24 -17q0 -54 -2 -37q4 -3 9 -11q-18 9 -18 18l6 27l-30 20q6 15 6 23.5t-1 12.5q-24 5 -24 36v13q-29 5 -29 45 q-18 -5 -18 -21l24 -48q49 -97 69 -169q6 -49 27 -128q6 -12 27 -13l5 7q-1 4 -9 12t-8 14l9 24h2zM862 716h-23q-2 3 -3.5 10.5t5.5 58.5q-7 -20 -18 -60q-14 -9 -35 -9q-2 -30 -4 -134l-26 -78q-8 -18 -17 -53q1 10 13 -40q-1 10 -4 30q3 7 14 7h23q2 -3 6 -12 q0 -6 -6 -57q7 20 17 60q13 9 34 9q3 75 3 116v18q10 32 22 64t22 67q-1 -10 -11 40q0 -10 3 -30q-4 -7 -15 -7zM612 780q-2 15 -14 27q-6 -8 -16 -27l9 5q6 -2 21 -5zM604 699q24 34 24 41.5t-4 11.5q-2 -2 -33 -45q9 1 13 -8zM591 732q-8 -3 -15.5 -3t-16.5 3v-31l8 -8 q11 14 52 74q-8 0 -24 7q-5 -14 -4 -42zM649 663v20l-7 -8zM580 740v40q-16 -17 -33 -52q5 10 33 12zM1084 -140q5 -11 2 -14h186v720q-13 -3 -39 -8l-8 36q-18 -2 -52 -13q33 -22 81 -69q-29 -91 -56 -130q-20 -12 -55 -42q-20 -33 -62 -96q-14 -10 -39 -33q2 -7 -31 -37 q0 -42 -45 -42q-2 0 -9 3q4 -9 4 -15q0 -24 -30 -39q6 -17 6 -32l-7 -33l3 -25q0 -9 -7.5 -27t-7.5 -36.5t18.5 -31.5t38.5 -25v25q-24 22 -24 59q0 30 40 30q15 0 28.5 -13t19.5 -16q12 -1 35 -13q18 -21 18 -57zM634 663l8 15q0 7 -9 44q-42 -52 -42 -63t7 -18q2 11 5 34 l3 2q15 0 28 -14zM600 692q-6 4 -11 15q-6 -9 -15 -29l9 -12q6 15 17 26zM637 642v11q-8 5 -24 13q0 -26 -4 -45q9 8 28 21zM841 411l-4 9l-5 -3l3 -8zM654 595q-1 9 -8 17l-7 -9v-17q5 2 15 9zM486 774q-9 0 -18 -9v-22q8 -8 16.5 -8t19.5 11v19q-9 9 -18 9zM826 412v5h-12 v-5h12zM517 728q-21 0 -21 -21q0 -17 20 -17q11 0 21 9v20q-9 9 -20 9zM546 683q-20 0 -20 -21t20 -21q8 0 19 10v21q-11 11 -19 11zM779 417v21h-6v-21h6zM769 417l-3 18h-6l3 -18h6zM600 609q0 18 -21 18q-11 0 -20 -9v-19q11 -11 18 -11q23 0 23 21zM607 585 q-9 0 -19 -10v-23q9 -9 18.5 -9t18.5 9v23q-9 10 -18 10zM637 494q23 0 23 19.5t-21 19.5q-9 0 -20 -11v-18q11 -10 18 -10zM922 192q-31 69 -72 184q-12 -16 -16 -46l-9 -57q46 -13 93 -90zM812 400h-14q-13 -43 -13 -87v-6l3 -13l2 51q2 30 14 46l12 -2l-9 -6 q-2 -33 -9 -100q6 43 29 102q1 7 3 -22q1 10 4 34q-9 3 -22 3zM831 357h-5l-9 -72h5zM688 467q0 21 -21 21t-21 -21t21 -21t21 21zM717 428q-6 10 -17.5 10t-21.5 -10v-18q5 -11 19 -11t20 11v18zM954 145l19 -7q19 0 29 16q1 18 9 25q14 10 18 16q-7 14 -15 15l-2 -11l3 -4 q-4 -5 -11.5 -4t-13 1t-10.5 -9t-11 -9q-29 0 -32.5 -3.5t-8.5 -32.5q-16 -4 -40 -24q14 12 43 12h3q-4 -12 -23.5 -19t-19.5 -14q18 3 49 16q5 4 8 20t6 16zM756 292l-13 81q0 19 17 19q14 0 18 -71q1 11 -0.5 46.5t-14.5 35.5q-18 0 -28 -20zM774 310q0 66 -18 77 q-8 -7 -8 -18.5t9 -39.5t11 -40q6 12 6 21zM597 492q-11 16 -29 22l5 -28q12 0 24 6zM522 547q0 -27 12 -27q5 0 19 8q-10 10 -31 25v-6zM903 195q0 26 -63 64q3 -10 -3.5 -10t-11.5 7l-11 -16q35 -35 54 -69q15 3 35 10v14zM614 455q-1 9 -8 17l-7 -9v-17q5 2 15 9z M499 567q-6 5 -24 15v-20zM751 279q-17 62 -22 109l-5 8q-40 -108 -42 -135q17 0 69 18zM909 151q2 0 6.5 -1.5t6.5 -1.5l-4 18q-9 -2 -26 -7l-1 1l6 6q-15 0 -29 -15l3 -22q36 22 38 22zM558 517l-29 -3q-16 0 -18.5 19t-6.5 22q-32 -1 -44 21l-4 -9q0 -3 127 -114 q0 4 14 24q-4 -1 -8 -1q-27 0 -31 41zM786 229q13 12 13 21t-9 18q5 -21 -16 -24q1 -9 12 -15zM900 139l-3 3l-14 -15l3 -3zM763 268q-9 -10 -9 -14t9 -22v36zM567 415q15 11 15 21.5t-57.5 58.5t-80.5 64l-14 -12l119 -111q0 9 10 12q1 -12 -6 -18zM1024 -53q0 32 -31 32 q-6 0 -15 -5q6 1 10 1q28 0 36 -37v9zM1080 -125l-9 27v-42q4 5 9 15zM399 559q-11 0 -11 15v8h-32v-17q28 -22 40 -22t34 22q-17 -6 -31 -6zM562 400q0 17 -60 70.5t-84 66.5l-4 -26q6 -1 27 -1q16 0 18 -22.5t9 -22.5q28 0 30 -3l6 -30q6 -8 24 -8t9 2q1 -13 6 -36h15 q4 3 4 10zM916 39l-4 1l-11 -18l5 -1zM1010.5 -48.5q-4.5 10.5 -14 10.5t-27.5 -19q24 0 34 -5q-8 -5 -18 -4q3 -1 17 -8q5 2 18 5q-5 10 -9.5 20.5zM1050 -51q-9 0 -12 -5q0 -66 1 -58l-9 7q3 -5 3 -19q-14 6 -22 19q2 -5 4 -16l-6 -3l17 -18l-2 -10h19q3 4 7 8q1 -4 1 -8 h2q10 24 10 30.5t-7.5 18t-7.5 16.5t3 10.5t3 9.5q6 -1 12 -15q0 11 3 15q-2 18 -19 18zM930 39v13q-13 -21 -36 -64q36 37 36 51zM742 268q-64 -4 -82 -60l4 -18q25 27 78 78zM600 362q-18 -11 -18 -24t9 -28q-10 -5 -27 -18q0 -12 5 -33q-11 -10 -30 -30q-1 -9 -8 -19 l2 -6h15q56 90 88 274l-1 6q-13 -5 -12 -23q-12 -11 -12 -45q-5 -8 -14 -24q3 -17 3 -30zM1027 -102l-4 9l-5 -2l5 -9zM1065 -150v-4h11l7 4h-18zM477 460l-29 -3v44q-3 1 -24 1.5t-19 16.5q-8 -1 -14 -6v-15q39 -32 147 -134q7 -3 14 -3q-1 11 3 18q-26 -5 -26 29l2 10 q-16 0 -30 2q-8 6 -10 23t-14 17zM919 0l-4 1l-11 -13l5 -5zM925 -17q-8 -3 -21 -12v-12q8 7 21 24zM990 -113v12h-6v-12h6zM593 398q15 15 15 18.5t-11 22.5q-31 -130 -97 -214q3 -12 15 -12q2 0 14.5 12.5t31.5 28.5q1 2 1.5 -0.5t-4.5 36.5q8 7 23 23q-3 10 -5 33 q18 12 18 20t-1 17.5t0 14.5zM540 340l-3 15q-78 91 -156 138v-12zM1015 -154q-6 8 -21 23q2 -9 8 -23h13zM846 4q0 -1 13 -9h9l-4 9h-18zM913 -77v23h-6v-23h6zM622 219q0 5 -3 18q7 -4 15 -21q0 8 -9 27h-24l-4 -9q19 -13 24 -27q0 2 1 6v6zM784 57q-4 0 -4 9 q0 16 20.5 16t36.5 -15q-1 -2 -9 -9q-6 -34 -6 -73t49 -39q8 0 18 10q2 22 2 12q0 11 -9 11q-3 0 -21 -11l-6 2q6 3 19 12l-3 1l-21 -4q-19 0 -19 19q0 10 10 20q11 -6 21.5 -6t13.5 6l6 -6q4 14 4 28q0 99 -75 152l5 1q4 0 37 -34h15q-22 70 -60 70l-28 -6l-39 14 q-14 0 -42.5 -22.5t-28.5 -35t11 -28.5q54 49 112 50l8 -3v-3q-5 1 -11 1q-35 0 -81 -26.5t-46 -52.5l9 -33l-2 -44l11 -40l-5 -59q0 -22 54 -38t84 -16q72 0 72 33v23q-20 -5 -22 -5q-50 0 -50 48l8 75v11q-4 4 -10 4t-12.5 -2t-8.5 -2.5t-7 -14.5zM889 -81q0 -4 6 -9 q6 12 6 31q-12 -18 -12 -22zM670 159q0 29 -41 32.5t-41 9t6 15.5l9 -5l-9 -7l9 -5l6 9l-3 12h-18q-3 -4 -3 -12q0 -30 33.5 -39t39.5 -37q12 23 12 27zM559 183q0 -22 38 -33t46 -18q-2 17 -34.5 30.5t-34.5 33.5l-7 -6l-3 9q-5 -8 -5 -16zM658 60q-3 9 -3 14.5t3 15.5 l3 -8q1 3 2 8q0 17 -17 22l9 -76q5 17 6 30zM519 159q9 0 24 19q-12 -4 -36 -7l3 -12h9zM640 78q0 19 -43 27q12 4 31 4q-13 5 -52 5q8 3 52 12l-10 1q-50 0 -59 3l-3 -7q0 -16 32.5 -29t38.5 -21q0 -17 13 -36v41zM594 142l-39 20q-5 0 -16 -7t-14 -8l22 19q-16 -8 -42 -15 q4 -8 32 -18q-7 -4 -18 -13q8 -3 22 -2q3 -10 5.5 -19.5t17.5 -8.5q-14 27 -14 36q0 16 14 16h30zM625 52q0 12 -15.5 24.5t-27.5 13.5v-20q5 -2 21 -18v21q6 -9 21 -24zM627 24q-2 18 -23 19l-3 -9q10 0 26 -10zM673 -5l-13 -43l6 -9l10 52q0 15 -13 29l-11 -3l3 -8 q0 -10 -1.5 -30.5t-1.5 -30.5q12 23 12 45l-1 9l1 6q9 -9 9 -17zM648 7q-11 -16 -14 -28l6 -24q7 38 8 52zM630 13q-3 -2 -11 -19q1 -5 6 -26q4 19 5 45zM604 -17l8 17v24h-7q-3 1 -5 1h-2q6 -4 6 -16v-26zM600 3v13l-14 -3q-2 43 -25 68q-9 2 -35 27q-33 10 -33 40t15 57 q-79 10 -152 98v-457h234q-12 28 -59 68q4 10 36.5 26t32.5 63zM873 1214.5q-15 -0.5 -21 -0.5q23 12 36 12t30.5 -10.5t18.5 -19.5q-17 19 -33 19t-31 -0.5zM843 1161q13 21 29.5 21t32.5 -4t25 -5q-7 -21 -21 -30l1 5l-3 4q-17 -2 -51 -12q-5 7 -13 21zM865 1188l-15 -10 l-3 4l15 11zM1023 981l-26 -4q-18 0 -27 16q12 -11 23 -12l4 3q-19 13 -24 26q8 -12 26.5 -18.5t23.5 -10.5zM841 1059l14 2v-12h-42q-3 0 -17 7q0 4 9 11h9q-6 0 -10 -6l16 -2h21zM579 1290h-6v14h6v-14zM949 932l-16 -8l-3 3l19 9v-4zM840 1014q-9 5 -15 5t-12.5 -4.5 t-8.5 -4.5q5 12 13 12t23 -8zM1134 626l-2 -5l-6 2l2 6zM696 1005l-15 -10l-3 4l13 11zM624 1096q0 -57 -59 -57q-51 0 -51 52q0 10 10 31l-5 1q-16 -27 -16 -53.5t32 -92.5h-70q31 66 31 92.5t-15 53.5l-6 -1q10 -21 10 -31q0 -52 -51 -52q-58 0 -58 57q0 36 57 105.5 t67 94.5q9 -25 66.5 -94.5t57.5 -105.5zM1027 597l-4 -2l-5 8l5 3zM1087 498h-6l-3 7l5 2zM1117 453h-9v6h9v-6zM1146 408l-3 -2l-5 8l5 1zM1065 448l-6 -4l-3 4l4 5zM1009 472h-7v6h7v-6zM1014 435l-3 -11l-6 3l4 8h5zM1033 403h-4l-5 8l5 1zM943 531l-9 -42q0 -3 11.5 -11 t11.5 -13l-8 -35q0 -1 2 -6q-5 7 -5 15l3 26q-5 6 -21 21l12 36q0 12 -16 21q17 -9 19 -12zM942 457l-5 -3l-4 9l4 2zM696 701l-5 -2l-4 8l4 3zM839 711l-23 -129q-8 -60 -21 -126l-8 -3l18 129q20 120 26 126zM685 633l9 42q0 3 -11 11t-11 13l7 35q0 1 -1 6q4 -7 4 -15 l-3 -26q5 -6 21 -21l-12 -36q0 -12 17 -21q-18 9 -20 12zM604 753l-4 -1l-5 9h5zM624 737l-5 -8h-4l3 11zM627 686h-8v6h8v-6zM573 716l-5 -5l-4 5l6 4zM490 750l-4 -1l-3 7l3 2zM520 705h-9v6h9v-6zM550 659l-4 -2l-5 9h6zM610 561l-4 -3l-5 9l5 2zM1253 68 q0 -36 -57.5 -105.5t-67.5 -94.5q-9 25 -66.5 94.5t-57.5 105.5q0 57 59 57q51 0 51 -52q0 -10 -10 -31l5 -1q16 27 16 53.5t-32 92.5h70q-31 -66 -31 -92.5t15 -53.5l6 1q-10 21 -10 31q0 52 51 52q59 0 59 -57zM951 165l-14 -11l-4 5l15 10zM502 541l-1 -6l-6 3l1 5z M825 154q-6 -12 -14 -12t-22 8q8 -5 14 -5t12.5 4.5t9.5 4.5zM699 237l-20 -9v4l17 8zM1056 -140h-6v14h6v-14zM787 105l-13 -2v12h42q2 0 16 -7q0 -4 -9 -11h-9q6 0 11 6l-17 2h-21zM606 183l25 4q18 0 27 -16q-12 11 -22 12l-5 -3q19 -13 24 -26q-8 12 -26.5 18.5 t-22.5 10.5zM781 -18l-15 -11l-3 5l15 10zM786 3q-14 -21 -30.5 -21t-32.5 4t-24 5q6 21 21 30l-2 -5l3 -4q17 2 51 12q5 -7 14 -21zM777 -50q-24 -12 -37 -12t-30.5 10.5t-18.5 19.5q17 -19 33 -19t31 0.5t22 0.5zM895 1164q-13 0 -30 9q2 -7 8 -21l19 5zM763 -9 q-2 7 -7 21l-20 -5l-3 -7q13 0 30 -9z" />
+<glyph unicode="&#x1f0ad;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM316 1353q0 -88 -82 -103q18 -11 26.5 -11t22.5 4l-13 -32 q-3 -1 -13 -1.5t-34 11t-36.5 11.5t-22.5 -9l-11 17q10 10 20 15q-66 25 -66 99q0 46 29 75t75 29t75.5 -29.5t29.5 -75.5zM1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26 t34 -37zM1284 -166h-940v1496h940v-1496zM291 1096q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26t-34 37q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1521 -190q0 -46 -29 -75t-75 -29t-75.5 29.5t-29.5 75.5q0 88 82 103 q-18 11 -26.5 11t-22.5 -4l13 32q3 1 13 1.5t34 -11t36.5 -11.5t22.5 9l11 -17q-10 -10 -20 -15q66 -25 66 -99zM1174 1148q23 53 23 56.5t-17 37.5l-9 -18q2 4 8 8q0 -47 -5 -84zM1073 1315h-15q0 -20 -1 -21q-2 10 -25 21q15 -23 15 -26.5t-2 -1.5q-21 2 -30 31h-9v-14 q-1 -5 22.5 -20.5t28.5 -26.5q0 8 -5 17q20 0 14 -2q1 5 -6 18q1 1 13 -3v28zM1025 1232q17 -3 24 -19q4 21 0 42q-6 -10 -14 -10l-21 2q-15 0 -29 -30q19 3 49 1q-5 4 -21 12zM1038 1207l-4 1l-5 -9l4 -1zM1272 1318h-185l3 -4q-3 -63 -3 -77.5t4.5 -38t18 -78t13.5 -74 t-11 -66.5q-1 -2 -20 -30q17 -13 49 -40v174q0 -5 -9 29q-1 11 -6 52.5t-4 61.5q11 -11 32 -27q8 18 26 50q10 -16 31 -44q13 9 25 16l-17 -91q-7 -15 -16 -42q-1 -21 -4 -62l-2 -134q0 -26 2.5 -29.5t72.5 -73.5v528zM1150 628h9l29 13l9 453q7 14 17 37q3 28 14 80 q-25 -11 -40 -50l-16 -39l-12 47q-10 31 -31 47v-9l13 -89q4 -7 8 -19v-471zM744 1318v-36q14 18 23 36h-23zM911 1318l-45 -18q-6 0 -4 1l37 17h-20q-17 0 -31 -38q6 -1 5 -4q-16 -20 -34.5 -69t-19.5 -53q5 0 7 -3v-69q0 -17 -13 -41t-29 -27l-27 -4q-12 -2 -17 -18 q14 -3 30 -1t55 30q17 29 20.5 102.5t5 81t5.5 11.5l2 -124q11 -26 53.5 -51.5t63 -25.5t26.5 3q26 14 39 47q28 71 27 95v48q-3 0 -7 -1q0 -17 -20 -17q10 0 -30 7v-13q0 12 7 -47q-18 -14 -27 -20q-1 2 -4 6q24 24 24 25l-11 56q0 51 33 51q3 0 11 -2.5t8.5 -2.5t15.5 6 q-2 11 -18 20l-16 8q-7 7 -25 34q-17 -35 -50.5 -43t-66.5 -15q0 5 3 5q32 8 75 20q17 6 25 33h-10q-6 -16 -45 -30t-47.5 -14t-10.5 1q13 17 45.5 23t41.5 20h-37zM673 1312q1 1 4 1q13 0 58 -29v34h-83q3 -12 11 -31q23 -35 23 -81.5t-26 -93.5h12l152 206h-38 q-13 -21 -39 -46q-1 -13 -5.5 -38.5t-41.5 -36.5q0 9 11.5 20t14.5 16.5t9 29.5h-16q-7 -3 -18 -3h-2q14 6 31 15q-28 20 -57 37zM992 1015l-42 -8q-27 0 -76 32q-12 12 -36 33q-9 -38 -22 -61q-3 -4 -49 -33q17 -7 48 -15q100 -14 126.5 -14t110.5 22q-50 44 -60 44z M780 1079q0 -24 -23 -34q-5 -4 -15 -8q-3 -7 -9 -19h14q9 -1 24.5 15.5t21.5 36.5q5 16 5 55q0 13 -1 28l-47 -101q11 2 18 18t10 18q2 -2 2 -9zM845 1302l-139 -233l-91 -121q0 3 3 -9q5 -1 12 -3q115 145 215 366zM1170 578q-1 4 -3 10l-117 -26v-7zM402 988l24 6 q4 0 6 -2v-27q6 0 7 -1q-7 -4 -13 -2q19 -13 26 -22q3 3 -10 3q10 -8 26 -23q-8 -4 -12 -3q5 -1 35 -17q-11 13 -36 37q8 0 12 -6q2 8 27 21q-9 -6 -20 -26q5 13 20.5 14t29.5 2t19 12q-7 -10 -26.5 -10t-22.5 -1v2q9 3 42 8h-36q13 4 50 9q2 -1 2 -6q-12 -19 -39.5 -23 t-36.5 -11q15 -10 27 -25l113 104q62 60 80 105q-27 -1 -47 2q26 68 26 87.5t-32 122.5h-287v-531l115 82q-4 -9 -13 -9q13 -23 16 -39q6 6 12 6v11q1 14 -13 34l19 16q-21 19 -38 19q-41 0 -41 -30q0 -5 6 -22q-22 18 -22 30.5t14 24.5q2 -7 -3 -14t-5 -7.5t3 -17.5 q0 14 23 43q-8 -1 -8 2q18 7 37 5q-14 14 -37 31q2 -3 -14 -29q-8 8 -18 25q4 3 8 9q-6 -3 -14 -8q0 -4 4 10q-8 4 -19 25l28 2q1 -1 1.5 -2.5t1.5 -2.5q0 2 3 7zM283 1353q0 77 -71.5 77t-71.5 -77t71.5 -77t71.5 77zM1199 398l3 20l-147 31q3 14 3 31q0 19 -4 40 q-6 41 -23 54q66 17 192 64h-17l-171 -52q-4 0 -14 4q0 161 55 333q-71 -29 -121.5 -29t-72.5 5t-70 21q4 -13 13 -33q79 -97 121.5 -155t64.5 -116h-3q-110 112 -205 180q-42 31 -136 87t-101.5 56t-29.5 -15l145 -72q15 -11 42 -27q111 -54 246 -181q20 -17 46 -50 q2 -5 -5 -41q-2 -13 -2 -28q0 -28 8 -66q6 -27 28 -46q1 10 14 21l134 -39q4 1 7 3zM1147 326q0 13 14 -31q2 6 6 6q-3 26 -8 38h-9q-3 3 -3 -13zM1155 350q10 0 14 -23q7 20 12 57l-109 34h-17q6 -48 22 -142q6 -6 14 -16q0 25 1 70q3 4 7 6q71 14 56 14zM1157 291 q-9 31 -19 45q-2 1 -10 -3q7 -1 11 -5q-5 -4 -10 -4q5 -13 11 -44q6 11 17 11zM532 906l-4 2l-3 -7l3 -2zM1108 332v-22q0 16 10 -40q9 1 13 5l-13 57h-10zM1228 196v28q-4 3 -9 9q-7 -8 -12 -18q8 0 11 -2v-7q-6 -13 -10 -13q-10 0 -11 -1q2 -3 3 -11l17 2q-1 5 -5 9l10 9 q4 -5 6 -5zM1168 247l-34 19l25 -25q3 5 9 6zM517 902q-12 -12 -12 -16t2 -11t2 -9zM1110 267q0 2 -3 16t-3 22q0 -10 -2 -27.5t-2 -23.5q10 4 10 13zM388 962q5 6 7.5 6t7.5 -5v-8q3 3 14 18q6 -6 9 -2l-3 17q-6 -1 -18 -6q5 -3 8 -8l-7 -6q-4 1 -14 4q1 4 2 11h-14 q-3 -10 8 -21zM514 853v10h-5v-10h5zM507 829q0 3 -11 55q-5 -3 -15 -12q12 -30 14 -46q3 3 12 3zM444 909v5h-15v-5h15zM395 949v-10q6 -2 12 -8l11 21q-11 -3 -23 -3zM500 816v10h-4v-10h4zM560 747q0 13 -22 125q-6 9 -13 25q-1 -26 -5 -77q-24 -7 -63 -20q-6 11 -14 32 l-9 -63q55 -14 126 -37v15zM465 808v23q-6 10 -11 24q-5 -5 -9 -6q5 -12 10 -41h10zM1272 -154v591q-3 -69 -130 -169q19 -14 33 -14t36 21l1 -9q-3 -6 -11 -17q19 15 19 21v15q-1 0 -6 -5q-7 13 -7 18t2 3q16 -17 16 -29.5t-19.5 -23.5t-34.5 -8q13 -11 33 -31v10 q0 4 15 19q12 -12 15 -23q6 2 7 1q-1 -2 -5 -4.5t-5 -4.5q8 1 10 -2q-2 -2 -10 -2q-1 3 -7 -25q-2 2 -2 10q-6 -13 -15 -13t-9.5 2t-2 7t-1.5 8t5 8q-8 0 -13 3q2 2 11 2q-22 18 -36 25q-12 -18 -26 -18q-6 0 -1 3t18 15q-9 -6 -27 -6q6 0 6 -5q-13 -3 -37 -9h34 q-35 -10 -47 -4q7 21 34 24.5t37 8.5l-22 22q-97 -67 -201 -182q24 -11 29 -22l-13 -83q2 -11 53 -128h274zM1345 -189q0 -77 71.5 -77t71.5 77t-71.5 77t-71.5 -77zM607 561l8 34v73q0 40 -33 72q-4 -9 -16 -23l-136 39q-2 -9 -6 -23l147 -32v-13q0 -70 20 -108 q-69 -19 -188 -64l10 -3l176 54q-2 0 13 -6q-1 -122 -43 -323q81 16 131 16t129 -10q-163 179 -204 291h2q41 -42 106 -103q57 -46 207 -146l126 -69q9 0 20 12q-26 22 -82 47q-180 83 -306 200q-81 75 -81 85zM573 591v10l-126 -35q3 -2 3 -11zM1013 219q4 0 -15 6 q-110 -146 -199 -335q87 166 214 329zM891 146q-25 1 -43 -34t-18 -69.5t1 -29.5l43 99q-10 -5 -15 -18l-9 -23q-2 1 -2 18t13.5 24.5t27.5 17.5q6 9 2 15zM636 149l31 5q67 0 122 -55q26 82 63 82h4q-111 28 -156 28t-56.5 -2t-28.5 -7l-39 -10q57 -41 60 -41zM974 -151v9 q-39 68 -39 130v21q13 48 13 38q0 7 -13 8l-139 -204h41q1 18 36 50q1 13 5 35q7 28 46 38q-16 -16 -36 -65q24 7 36 2q-12 -3 -34 -12q16 -9 58 -39q-26 2 -60 27q1 -14 -2 -23q-2 9 -9 26q-7 -15 -21 -41h118zM904 173l-39 2q-19 0 -36 -24t-20 -37q-2 -57 -9 -149 q-5 -42 -38 -67q-7 -5 -48 -9t-57 -29q2 -3 5 -7q22 19 57.5 26.5t51.5 13.5q33 13 47 134q2 32 5 64q11 62 77 67q8 15 4 15zM638 22l14 -61q0 -10 -8 -27q-9 -23 -24 -23q-50 0 -35 3q-2 2 -2 5h31q19 0 24 23q-19 -5 -23.5 -5t-36.5 10v-29l12 -24q11 -1 27.5 -12 t20.5 -31q11 18 44 41q16 2 41.5 6t55.5 22q17 35 17 92t-4 63q-41 71 -121 71q-22 0 -24 -1q-28 -14 -47 -63.5t-19 -96.5v-11h33q18 0 24 -21q6 4 6 10.5t-5 27t-8 24.5t-3 8.5t10 14t17 9.5t4.5 -2.5t-12 -11t-9.5 -11.5zM799 -111l-4 1l-6 -12l4 -1zM490 -26 q-27 39 -27 81q0 4 1 5q4 -1 11 -5v455q-7 0 -25 -3q-4 -151 -22 -451q-8 -12 -17 -34q-3 -28 -12 -74q20 11 33 43.5t21 39.5q16 -43 24 -62t22 -26v11q1 12 -8 74q-1 4 -14 24q14 -44 13 -78zM753 -149q15 0 16 13q-2 -1 -31 -13h15zM778 -113q-42 -11 -92 -29l6 -7 q43 9 62 14.5t24 21.5zM625 -47q-3 6 -10 7v-9zM544 -154v27q0 38 -10 84l-17 84q-12 76 -12 90.5t8 47.5q7 12 18 34q-36 32 -52 35v-181q0 -3 6.5 -15t8 -25.5t4.5 -36.5t7.5 -34t4.5 -16t-7 -5t-31 18q-5 -15 -26 -37q-23 23 -34 32q-12 -11 -15 -11t-8 4q3 29 14 83 q5 5 12 16q11 34 11 102v11v142q-21 21 -70 63v-512h188zM623 -138q0 5 -23.5 22.5t-25.5 26.5v-21q-7 3 -8 8q0 -29 2 -24q-3 1 -10 8q-1 -8 -6 -25q15 -3 18 -3q0 19 -1 18q8 -3 15 -15h12q-8 15 -20 27q2 2 9.5 -5t33.5 -26q4 4 4 9zM449 16l-18 -45l17 -42q8 8 8 17 q0 -1 -5 -6l-6 9q9 14 4 17v50zM1162 1104q-14 9 -16 27t-9 59q8 -15 19 -43q1 -15 6 -43zM964 1263q-7 -12 -35 -12.5t-35 -8.5q-2 12 8 12q39 3 62 9zM924 1231h-13v4h13v-4zM910 1198q15 0 -30 11q6 12 2 20q11 -1 29 2q-4 -2 -13 -6q45 -4 52 -13q-29 -14 -40 -14z M941 1133h-5v7h5v-7zM947 1126h-7v5h7v-5zM963 1106q12 0 28 -4q0 -2 3 -6l6 5q-5 -5 -6 -13q-26 5 -35 5t-25 -5q5 10 4 10q4 0 3 -1t3 -1zM1186 1090l-8 -336l-4 -44q-2 -23 -19 -27l8 407q8 5 23 0zM963 1069h-18v4h18v-4zM846 888l102 -9l64 8l26 10h12q-9 -45 -22 -130 q-3 -6 -7 -28t-11 -85l-40 68q-37 60 -124 166zM624 1096q0 -57 -59 -57q-51 0 -51 52q0 10 10 31l-5 1q-16 -27 -16 -53.5t32 -92.5h-70q31 66 31 92.5t-15 53.5l-6 -1q10 -21 10 -31q0 -52 -51 -52q-58 0 -58 57q0 36 57 105.5t67 94.5q9 -25 66.5 -94.5t57.5 -105.5z M1250 189h-4l-3 6l4 1zM1252 181h-16l3 5zM1253 68q0 -36 -57.5 -105.5t-67.5 -94.5q-9 25 -66.5 94.5t-57.5 105.5q0 57 59 57q51 0 51 -52q0 -10 -10 -31l5 -1q16 27 16 53.5t-32 92.5h70q-31 -66 -31 -92.5t15 -53.5l6 1q-10 21 -10 31q0 52 51 52q59 0 59 -57zM780 265 l-105 2q-61 0 -102 -13q15 46 27 142.5t13 102.5q58 -106 167 -234zM675 93h-31v5h31v-5zM684 63h-22q-16 0 -31 18q11 -8 20.5 -8t41.5 8q2 -2 6 -10zM461 68h-19l19 418v-418zM690 29q0 5 -4.5 5t-16 -3.5t-15.5 -3.5q28 10 32 10t4 -8zM680 -35q27 9 35 9t36 -11 q-4 -10 -45 -16q-2 -2 0 -4q-3 2 -23 2q3 15 -3 20zM722 -61h-12v4h12v-4zM684 -81q44 0 41 -1l-9 -6h-46q8 7 14 7zM938 1209q12 0 3 10q-1 -3 -2 -5.5t-1 -4.5zM900 1218h-12l-2 -5q4 -2 11 -7q0 8 3 12zM1003 819q0 14 -41 54q-14 -21 -14 -43.5t9 -31.5q16 6 22 3 q3 -11 10 -27v10q-4 7 -5 19q19 -4 19 16zM666 303q12 29 12 40.5t-6 26.5q-8 0 -24 2q-7 10 -10 25q2 -9 1 -26q-24 4 -24 -14q0 -13 24.5 -32t26.5 -22z" />
+<glyph unicode="&#x1f0ae;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM302 1252h-82v25h22l-64 81l66 71h-24v26h80v-26h-22l-62 -71 l64 -81h22v-25zM203 1429h-25v-152h23v-25h-80v25h25v152h-25v26h82v-26zM1494 68q0 -12 -20 -35l-58 -66l-59 66q-20 22 -20 35q0 37 36 37q32 0 39 -26q-8 58 -22 84q9 -3 25.5 -3t25.5 3q-14 -26 -22 -84q7 26 41 26t34 -37zM1284 -166h-940v1496h940v-1496zM291 1096 q0 -37 -36 -37q-32 0 -39 26q8 -58 22 -84q-9 3 -25.5 3t-25.5 -3q14 26 22 84q-7 -26 -41 -26t-34 37q0 12 20 35l58 66l59 -66q20 -22 20 -35zM1507 -291h-82v26h25v152h-23v25h80v-25h-25v-152h25v-26zM1408 -265v-26h-80v26h22l62 71l-64 81h-22v25h82v-25h-22l64 -81 l-66 -71h24zM1169 1208v7h-5v-7h5zM1073 1063l-2 -44q31 -7 31 -27q0 -15 -11 -28t-15 -43q28 -14 65 -26l3 298q19 33 38 52q24 -34 33 -52l8 -348q17 -7 49 -19v492h-161q-59 -91 -59 -108.5t10.5 -68.5t10.5 -78zM1057 1298l26 -8q1 3 11 23h-327q5 -2 15 -7 q-7 -7 -10 -7q13 -15 32.5 -15t31.5 11q-1 6 0 13q-3 0 11 -5q2 7 7 8q2 -4 6 -8q6 6 9 4l-8 -11q35 -14 44 -14t37 11q0 16 -1 15q7 -1 11 -5q0 9 6 8q3 -3 3 -11q6 6 18 6q-5 -5 -11 -13q18 -9 32.5 -9t30.5 6q-3 6 -3 18q6 -1 10 -5q0 9 7 8q2 -4 6 -8q4 5 12 3 q-1 -3 -6 -8zM1176 1189l10 -36q0 -10 -6.5 -43t-6.5 -70.5t10.5 -73t10.5 -48.5t-9 -43q-6 -12 -14 -32q-1 -13 -6 -38l19 -76q15 0 23 -3v454q-1 7 -4 19l-14 8q0 3 -7 17q-6 -26 -6 -35zM670 1284l3 -18h394q7 3 9 12q-34 9 -30 9l-47 -13q-9 0 -28 8l-19 8l-52 -14 q-21 0 -32 8t-13 8q-30 -16 -48.5 -16t-31 7t-13.5 7q-36 -14 -54 -14t-38 8zM1092 1002q-10 8 -27.5 8t-9.5 -3q11 37 11 46.5t-8 61.5t-9 77q-18 -58 -18 -78v-92q0 -55 -1 -46q10 5 25.5 5t24.5 -18q4 3 12 8v31zM1160 1044l18 98q0 3 -6.5 28.5t-7.5 37.5q-9 -20 -9 -43 t-3 -32l-8 -410h23v9q-12 43 -12 63.5t10.5 67t10.5 43t-8 56t-8 82.5zM956 1132l17 -3v10l-12 3q-1 -5 -5 -10zM1269 815q-22 -22 -43 -37v-42q29 11 37 34zM707 1282q33 0 44 17q-4 4 -13 10q17 0 23 3h-107q6 -6 14 -19q43 -11 39 -11zM809 977l22 -6q6 0 6.5 7.5 t11.5 21.5q2 -2 2 -11.5t-9 -37.5q-6 -17 -17.5 -17t-15.5 8q15 0 20 3v17l-19 3l-8 -3q-6 -9 -6 -15q0 -32 34 -32q15 0 24.5 24.5t15.5 41.5q2 -1 2 -17.5t-12 -35.5t-28 -25h14q26 -2 38 29q1 15 14 31v-7q-6 -19 -21 -51h9q19 4 38 55q3 -3 3 -2.5t-6 -39.5q31 21 28 21 q6 0 24 -18q-4 10 -12 24q5 3 6 1q20 -41 49 -43q-20 8 -34 63l3 5l3 -2q8 -64 50 -64q38 0 38 42q0 26 -24 26q-9 0 -15 -3l3 -17h12q2 2 6 5l2 -9q-7 -7 -11 -7t-17 7q-14 68 -14 51l5 56v67q-14 -2 -29.5 -2t-29.5 5q10 -46 10 -57t-7 -16q-19 -12 -25 -19l-2 17 q8 5 23 18q-16 75 -18 75v-2q0 28 20 50q17 -5 52 -6l9 -9v-4l-2 -2h-38q-5 4 -14 10q-5 -11 -16 -33q23 6 31 6q-10 2 -11 7l20 2q10 -6 24 -18q7 27 22 68h-172q-24 -43 -41 -164q-4 -26 -20 -72zM1074 701h185l-34 -24q2 -3 7 -9l40 33q-2 0 -2 14q-64 6 -113 6.5 t-83 -6.5v-14zM848 1213h-23q-27 -38 -40 -140.5t-51 -143.5q22 5 53 24q23 40 38 166q2 17 23 94zM1142 679v7h-4v-7h4zM1147 644q0 -12 -3 -16q-7 10 -12 10v-17q4 2 21 2t47 -2l2 -2q-1 -3 -27 -3q-16 0 -41 1v-23q30 -2 88 -10v112q-35 -6 -72 -10v-15q29 4 49 -1 q-38 -11 -52 0v-26q31 5 52 1q-12 -1 -52 -1zM687 922q11 0 29 5q20 11 29 26q22 40 28.5 98t12.5 105q5 20 25 57h-20q-12 -20 -39 -106q-8 -46 -18.5 -98.5t-34.5 -79.5q-6 -7 -12 -7zM1129 662v-12h15q-4 3 -10 8q1 2 10 4h-15zM780 1213h-20q-19 -26 -29 -64.5 t-16 -68.5q-6 -53 -21 -91.5t-22.5 -45.5t-30.5 -17h30q20 -1 35.5 26.5t29.5 127.5q3 21 44 133zM1207 561q0 22 -25 22t-25 -22t25 -22t25 22zM604 946l17 -12q63 0 76 106q6 54 15 78.5t39 94.5h-57q-33 -27 -52 -159q-2 -12 -17 -71q-7 -4 -13.5 -4t-9.5 3q23 9 23 19 q0 14 -22 14t-22 -28.5t25 -28.5q18 0 24 6q22 22 29 60t15.5 89t38.5 90q-10 -25 -24 -75q-7 -51 -20 -121q-20 -60 -65 -61zM819 826l19 2q6 0 11 -13q12 8 12 14.5t-8 48.5q-7 -1 -20.5 -19.5t-13.5 -23.5v-9zM945 904q-29 -16 -73 -87q-14 -46 -46 -99l-18 75 q-9 23 -19 55t-37 72q33 -98 48.5 -149t22.5 -106q27 77 51 129t71 110zM833 812h-4l-3 -15h5zM927 562q0 -4 10 56t60 135.5t119 140.5q-133 -68 -193 -256q-15 -47 -15 -72q0 -88 45 -174q54 -105 145 -128q37 -10 48 -10t35 7h-11q-38 0 -78 18q-46 21 -58 33 q-107 105 -107 250zM680 1228q0 2 -32 90h-292v-437l200 83q9 3 13 10q3 19 19 49q22 1 40 1q13 91 49 174q3 7 3 30zM1236 289l-49 125q-31 79 -60 114q-9 10 -51 38l45 32q-3 2 -7 4q-18 -9 -59 -33q73 -49 111 -136l55 -147q-3 0 15 3zM1121 473q0 11 -23 18.5t-27 17.5 q-3 14 -14 39q-44 12 -44 26t21 16.5t30 6.5q7 15 7 24q3 6 25 8.5t22 18.5l-5 20q-4 15 5 20h-15q-16 -14 -49 -28.5t-56 -30.5q-20 -9 -52 -26q-11 -9 -11 -22t20 -25l35 -21q51 -41 69 -72q45 -73 57 -115t29 -75h23q-7 40 -34 101q3 18 3 31q0 22 -7 32q-8 0 -20 3 q11 44 11 33zM853 558q0 -129 95 -301h23q-27 43 -70 131q-29 83 -29 145q0 148 113 299q16 21 54 54l-11 3q-12 0 -48 -43q-63 -76 -95 -154.5t-32 -133.5zM772 641q0 -218 -168 -357q5 0 9 -4q6 0 15 7q160 146 160 349q0 124 -60 213q-10 15 -30 61h-23q97 -145 97 -269z M537 677l5 -17q11 -1 28 -7q-1 -5 -1 -10q0 -29 49 -38v-9q0 -13 -45 -24q-6 -9 -18 -25q-10 0 -28 -2q-12 -15 -12 -16.5t3 -20t3 -27.5q10 2 28 8q17 14 44 33q62 28 78.5 38t16.5 33.5t-29.5 33t-72.5 64.5t-51.5 75.5t-38.5 124.5q-10 6 -19 6h-14q-8 -43 -8 -38l17 -35 v-36q10 -8 24 -22q5 -10 4 -42q13 -4 38 -16q-1 12 -1 -31zM405 880q0 -44 37.5 -129t112.5 -150q-11 -10 -45 -29q2 -5 3 -12q22 10 65 38q-23 18 -54 46q-74 86 -109 245q-10 -2 -10 -9zM1272 -154v442l-217 -82q8 -15 8 -27q0 -30 -38 -30q-21 0 -26 10 q-19 -35 -25.5 -105t-31.5 -101l51 -107h279zM803 361l-5 2q-2 -4 -1 -17q0 9 6 15zM893 258q-73 116 -88 183q-25 -69 -110 -177q-7 -10 -17 -14q2 -2 5 -7q69 70 122 177q34 -108 81 -169zM814 321v14q-13 0 -17 -2l-10 12q-2 1 -6 0q-5 -2 -6 -13q0 12 9 -49zM904 -46 l27 3q31 41 34 106q6 133 61 133q6 0 13 -14l-4 -4q-9 5 -18 4.5t-9 -10.5q0 4 3 -13h28q8 13 8 27q0 26 -29 26t-36 -14q-18 -42 -24.5 -63t-9 -76t-28.5 -95q-6 7 -6 10.5t7.5 32t11 52t15.5 88.5q10 41 27 60.5t46 16.5l-41 4q-31 -14 -47 -70q-2 -9 -15.5 -82.5 t-29.5 -121.5h16zM445 633q-27 0 -27 -23q0 -27 29 -27q10 0 21 11v28q-11 11 -23 11zM969 238q-11 0 -31 -14t-31 -38.5t-24.5 -112.5t-29.5 -116h21q25 68 35.5 136.5t18.5 87.5q17 40 56 57h-15zM406 585q2 -2 2 -24.5t-1.5 -48t-0.5 -39.5q31 7 75 11v14q-28 -4 -47 1 q12 3 47 3q1 5 9 13q3 -7 14 -10q0 10 -3 33t3 31zM496 481l-3 12h-5l3 -12h5zM938 240q-5 -1 -18 -2.5t-32.5 -30.5t-22.5 -41q-5 -33 -14 -100t-29 -109q17 -3 20 -3q20 47 27 101l13 99q13 54 56 86zM900 240h-14q-6 1 -26.5 -17t-25.5 -30t-17.5 -93t-31.5 -143l23 -3 q22 50 29.5 100t13.5 96q12 58 49 90zM717 637q0 54 -42 141.5t-102 112t-96 24.5q-2 0 -44 -9h13q104 0 176 -76q77 -82 77 -201q0 -85 -27.5 -142t-109.5 -157l-49 -48q5 -5 3 -7q-5 3 -16 8l-6 -257q1 -19 -3 -57l-32 -55q-20 26 -45 81q-12 79 -12 271q-1 19 -3 53 q-17 14 -43 30v-503h172v3q55 102 55 122q0 3 -7 39q-14 79 -14 146q-31 -5 -31 26q0 8 13 26.5t13 32.5q0 9 -36 33q196 165 196 363zM557 447v18h-193l-6 -7q3 -3 3 -11h196zM400 494l-37 -26h13q10 7 24 26zM613 25l-22 -62q0 -3 6 -9h169q21 39 35 125.5t23 113.5l-23 8 q-4 0 -6 -2q-3 6 2.5 20t12.5 14t12 -7q-2 -2 -15 1l-6 -11q0 -17 18.5 -17t18.5 30q0 22 -28 22q6 0 -21 -3q-8 -23 -23 -60q-4 10 -4 20t14 32t22 23l-14 4q-25 -11 -32.5 -30t-12.5 -36l-4 5q4 24 22 61q-21 -8 -36 -22q-2 -18 -12 -39q0 9 3 25t3 20q-13 -6 -31 -23 q-4 8 -21 22q0 -4 5 -14t0 -16q-15 36 -45 46q11 -2 20 -22.5t9 -32t-3 -12.5l-14 44q-7 19 -38 19q-40 0 -40 -41q0 -23 32 -32q-1 -1 -9 -1t-29 16q-15 -14 -15 -25q0 -20 22 -20t20 1q-7 -30 -10 -52l22 -128q17 74 17 144.5t-11 92.5h-12q-2 -3 -6 -6q2 17 13 17 q24 0 24 -78l-1 -45q-1 -45 -1 -67q10 11 26.5 11t30.5 -10q-4 -4 -3 -6q8 5 8 12.5t-5 20.5q-8 21 -8 44q19 14 30 26l1 -12q-2 -9 -20 -21q15 -71 15 -76q0 -28 -25 -52q-7 5 -25 4t-28 10v8l1 1h18q17 0 35 -10l16 31q-41 -6 -35 -6t9 -2v-3q-2 -2 -12 -2q-12 0 -29 19z M971 -134q-16 14 -36.5 14t-52.5 -7q7 -2 19 -10q-15 -6 -23 -6h82q9 1 11 9zM361 376v-27l39 32v33q-7 -1 -23 -14.5t-16 -23.5zM866 -143v7q-7 -2 -11 9q-8 4 -22 4t-37 -6q1 -8 -8 -14h78zM442 272q0 2 12 -36t12 -63t-5.5 -76.5t-5.5 -49t9 -107.5l17 41l8 454h-28 q8 -29 8 -57q0 -31 -10 -62q-17 -52 -17 -44zM684 -120l54 13q26 0 43 -18q18 18 43 18t28 -1q31 -12 24 -12q3 0 12 6q13 7 37.5 7t43.5 -4q-2 5 -6 12h-400q17 -18 27 -18l48 13q15 0 22 -4zM430 441l-22 -3q4 -147 19 -438l22 -48q-7 71 -7 93q0 20 10 73l8 49 q0 3 -13 54.5t-13 54.5q0 -14 10 19q19 58 19 102t-33 44zM594 -139l-37 11q-15 0 -20 -15l243 -3q-4 3 -12 12q-3 11 -18.5 11t-31.5 -1.5t-22 -1.5q3 -5 -0.5 -10t-15.5 -5t-18 9l5 6q-11 3 -34 3q-13 0 -31 -1q5 -4 3 -12zM937 1192q-7 -17 -17 -18q-20 0 -58 -5 q4 11 25 15l41 8h9zM1045 1015l-3 -10l-4 1l4 9h3zM881 1160h17q-2 -3 -5 -8q10 -3 31 -11q-1 -7 -3 -9l-39 -8l-31 8q0 6 -3 9q38 19 33 19zM1010 1021l-11 -3q-11 0 -22 8l-19 12q11 2 36 -12h7q4 4 -1 10q4 0 10 -3v-12zM920 1060q33 0 25 4q-10 -4 -33 -11q-5 15 1 15 q4 -8 7 -8zM1011 945h-4l-5 33h4zM1049.5 921q-7.5 -3 -14.5 -3t-22 21q8 -13 24 -13t28 8q-2 -7 -5 -8.5t-10.5 -4.5zM965 1014l14 -6q4 0 4 4q0 -4 -1 -6.5t-1 -5.5q-16 10 -42 10t-38 -10q1 3 1 18q0 -3 3 -10q7 7 30.5 7t29.5 -1zM865 1023l40 16h21q0 -5 -5 -10 q-55 -11 -46 -11h-21q-6 11 -3 18h13q-4 -1 -11 -4v-7q2 -2 12 -2zM1150 600h-4v12h4v-12zM624 1096q0 -57 -59 -57q-51 0 -51 52q0 10 10 31l-5 1q-16 -27 -16 -53.5t32 -92.5h-70q31 66 31 92.5t-15 53.5l-6 -1q10 -21 10 -31q0 -52 -51 -52q-58 0 -58 57q0 36 57 105.5 t67 94.5q9 -25 66.5 -94.5t57.5 -105.5zM1253 68q0 -36 -57.5 -105.5t-67.5 -94.5q-9 25 -66.5 94.5t-57.5 105.5q0 57 59 57q51 0 51 -52q0 -10 -10 -31l5 -1q16 27 16 53.5t-32 92.5h70q-31 -66 -31 -92.5t15 -53.5l6 1q-10 21 -10 31q0 52 51 52q59 0 59 -57zM487 555h-4 v10h4v-10zM487 531h-4v7h4v-7zM782 148v-12l-6 -6q-4 4 -8 4q7 1 12 6q0 8 2 8zM710 138q30 11 37 16l25 -4q-13 5 -40 -16l-22 -6v10zM709 171h-12v5h12v-5zM693 174h-12v5h12v-5zM721 157l-42 -11q-4 0 -22 12q4 0 15.5 -0.5t26 -0.5t33.5 10v-13zM677 177h-15v4h15v-4z M581 245l22 4q15 -8 19 -15q3 -5 9 -31q0 -8 -2 -15v9q0 49 -35 49q-6 0 -13 -1zM686 102q22 15 28.5 15t12.5 -9q-7 4 -13 4zM576 242l-6 -7l-3 3l7 6zM672 135q0 -7 -4.5 -7t-18.5 9t-21 11q22 -4 44 -13zM784 26q-30 -20 -35 -20t-9.5 2t-6.5 2q1 0 5 3q-20 10 -31 18 q12 12 39 12t39 -11q0 -2 -1 -6zM630 133q-8 8 -3 13q1 -4 -2 -7q3 -2 5 -6zM734 -8q27 0 38 9q-6 -8 -19 -18q-21 -5 -39 -5h-6h-12q11 14 38 14zM593 64q-10 48 -10 65t12 35q0 3 -4 -24q-2 -11 -2 -25q0 -22 4 -51zM921 1135q-3 7 -13 9q5 -5 5.5 -7.5t7.5 -1.5z M871 1150q-11 -5 -15 -15q8 -2 12 -6q0 3 1.5 10.5t1.5 10.5zM780 28q-2 4 -7 7q-2 -5 -6 -12q5 3 13 5zM725 26q-1 9 -4 9q-4 -1 -7 -4q7 -6 9 -6q1 0 2 1z" />
+<glyph unicode="&#x1f0af;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f0b0;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f0b1;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM321 1252h-79v25h24l-16 46h-74l-16 -46h24v-25h-79v25h25 l54 155h-24v23h106v-23h-24l54 -155h25v-25zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM960 700q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72 zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM1523 -113h-25l-54 -155h24v-23h-106v23h24l-54 155h-25v25h79v-25h-24l16 -46h74l16 46h-24v25h79v-25zM243 1347l-28 85h-4l-28 -85h60zM1445 -183h-60l28 -85h4z" />
+<glyph unicode="&#x1f0b2;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM960 1258q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143 q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM146 1252q0 20 10 45t44 50t40.5 34.5t6.5 19.5q0 33 -33 33q-36 0 -36 -48v-8h-27v9q0 71 61 71q64 0 64 -55q0 -17 -9 -29t-48.5 -43t-42.5 -53h76l1 46h24l-1 -72h-130zM1499 4 q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM1482 -88q0 -20 -10 -45t-44 -50t-40.5 -34.5t-6.5 -19.5q0 -33 33 -33q36 0 36 48v8h27v-9 q0 -71 -61 -71q-64 0 -64 55q0 17 9 29t48.5 43t42.5 53h-76l-1 -46h-24l1 72h130zM960 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24.5 -44.5t-50.5 -19.5q-71 0 -71 72q0 45 58 143l88 139l88 -139q58 -98 58 -143z" />
+<glyph unicode="&#x1f0b3;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM960 1258q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143 q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM214 1272q39 0 39 37q0 36 -55 36h-5v25q51 0 51 32t-30 32q-34 0 -35 -40h-28q0 34 17.5 49t42.5 15q61 0 61 -54q0 -33 -28 -46q38 -11 38 -44.5t-21 -49.5t-49 -16q-71 0 -71 72h28 q1 -48 45 -48zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM960 700q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM296 1160q0 -23 -84 -161 q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM1414 -108q-39 0 -39 -37q0 -36 55 -36h5v-25q-51 0 -51 -32t30 -32q34 0 35 40h28q0 -34 -17.5 -49t-42.5 -15q-61 0 -61 54q0 33 28 46q-38 11 -38 44.5t21 49.5t49 16q71 0 71 -72h-28q-1 48 -45 48zM960 -94 q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24.5 -44.5t-50.5 -19.5q-71 0 -71 72q0 45 58 143l88 139l88 -139q58 -98 58 -143z" />
+<glyph unicode="&#x1f0b4;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1286 1258q0 -45 -58 -143l-88 -139l-88 139q-57 98 -57 143 q0 72 71 72q26 0 50 -19.5t24 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM634 1258q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM282 1306h-33v-30h19v-24h-67v24h21v30h-68l-13 23 l85 127h23v-126h33v-24zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM1379 -292v126h-33v24h33v30h-19v24h67v-24h-21v-30h68l13 -23l-85 -127 h-23zM1286 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24 -44.5t-50 -19.5q-71 0 -71 72q0 45 57 143l88 139l88 -139q58 -98 58 -143zM634 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24.5 -44.5t-50.5 -19.5q-71 0 -71 72q0 45 58 143l88 139 l88 -139q58 -98 58 -143zM222 1330v80l-53 -80h53zM1406 -166v-80l53 80h-53z" />
+<glyph unicode="&#x1f0b5;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1286 1258q0 -45 -58 -143l-88 -139l-88 139q-57 98 -57 143 q0 72 71 72q26 0 50 -19.5t24 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM634 1258q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM281 1316q0 -68 -70 -68q-64 0 -68 68h26 q5 -44 42 -44q41 0 41 43.5t-38 43.5q-25 0 -41 -24q-9 9 -20 14l7 106h109v-54h-25v27h-62l-5 -60q20 16 42 16q62 0 62 -68zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM960 700q0 -45 -58 -143l-88 -139l-88 139 q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM1417 -108q-41 0 -41 -43.5t38 -43.5q25 0 41 24q9 -9 20 -14l-7 -106h-109v54h25v-27 h62l5 60q-20 -16 -42 -16q-62 0 -62 68t70 68q64 0 68 -68h-26q-5 44 -42 44zM1286 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24 -44.5t-50 -19.5q-71 0 -71 72q0 45 57 143l88 139l88 -139q58 -98 58 -143zM634 -94q0 -72 -71 -72q-26 0 -50.5 19.5 t-24.5 44.5q0 -25 -24.5 -44.5t-50.5 -19.5q-71 0 -71 72q0 45 58 143l88 139l88 -139q58 -98 58 -143z" />
+<glyph unicode="&#x1f0b6;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1286 1258q0 -45 -58 -143l-88 -139l-88 139q-57 98 -57 143 q0 72 71 72q26 0 50 -19.5t24 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM1286 700q0 -45 -58 -143l-88 -139l-88 139q-57 98 -57 143q0 72 71 72q26 0 50 -19.5t24 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM634 1258q0 -45 -58 -143l-88 -139l-88 139 q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM221 1381q56 0 56 -66.5t-61 -66.5q-32 0 -51 26t-19 78q0 106 71 106q57 0 59 -63h-26q-5 39 -35 39q-41 0 -42 -76q21 23 48 23zM1499 4q0 -41 -41.5 -41t-41.5 37 q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM1482 -188q0 -106 -71 -106q-57 0 -59 63h26q5 -39 35 -39q41 0 42 76q-21 -23 -48 -23q-56 0 -56 66.5t61 66.5q32 0 51 -26 t19 -78zM1286 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24 -44.5t-50 -19.5q-71 0 -71 72q0 45 57 143l88 139l88 -139q58 -98 58 -143zM634 700q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5 t50.5 19.5q71 0 71 -72zM634 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24.5 -44.5t-50.5 -19.5q-71 0 -71 72q0 45 58 143l88 139l88 -139q58 -98 58 -143zM215 1272q37 0 37 41t-35 41q-22 0 -43 -26q7 -56 41 -56zM1413 -108q-37 0 -37 -41t35 -41 q22 0 43 26q-7 56 -41 56z" />
+<glyph unicode="&#x1f0b7;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1286 1258q0 -45 -58 -143l-88 -139l-88 139q-57 98 -57 143 q0 72 71 72q26 0 50 -19.5t24 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM1286 700q0 -45 -58 -143l-88 -139l-88 139q-57 98 -57 143q0 72 71 72q26 0 50 -19.5t24 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM960 954q0 -45 -58 -143l-88 -139l-88 139 q-58 98 -58 143q0 72 71 72q26 0 50.5 -20t24.5 -45q0 25 24.5 45t50.5 20q71 0 71 -72zM634 1258q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM220 1276h23v-24h-80v24h28q5 85 52 152 h-70v-27h-24v54h127v-22q-56 -67 -56 -157zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM1479 -291h-127v22q56 67 56 157h-23v24h80v-24h-28 q-5 -85 -52 -152h70v27h24v-54zM1286 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24 -44.5t-50 -19.5q-71 0 -71 72q0 45 57 143l88 139l88 -139q58 -98 58 -143zM634 700q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5 t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM634 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24.5 -44.5t-50.5 -19.5q-71 0 -71 72q0 45 58 143l88 139l88 -139q58 -98 58 -143z" />
+<glyph unicode="&#x1f0b8;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1286 1258q0 -45 -58 -143l-88 -139l-88 139q-57 98 -57 143 q0 72 71 72q26 0 50 -19.5t24 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM1286 700q0 -45 -58 -143l-88 -139l-88 139q-57 98 -57 143q0 72 71 72q26 0 50 -19.5t24 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM960 954q0 -45 -58 -143l-88 -139l-88 139 q-58 98 -58 143q0 72 71 72q26 0 50.5 -20t24.5 -45q0 25 24.5 45t50.5 20q71 0 71 -72zM634 1258q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM282 1307q0 -59 -70.5 -59t-70.5 59 q0 37 36 51q-29 17 -29 47q0 53 64 53t64 -53q0 -30 -29 -47q35 -14 35 -51zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM1487 -143 q0 -37 -36 -51q29 -17 29 -47q0 -53 -64 -53t-64 53q0 30 29 47q-35 14 -35 51q0 59 70.5 59t70.5 -59zM960 237q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24.5 -44.5t-50.5 -19.5q-71 0 -71 72q0 45 58 143l88 139l88 -139q58 -98 58 -143zM1286 -94 q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24 -44.5t-50 -19.5q-71 0 -71 72q0 45 57 143l88 139l88 -139q58 -98 58 -143zM634 700q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72 zM634 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24.5 -44.5t-50.5 -19.5q-71 0 -71 72q0 45 58 143l88 139l88 -139q58 -98 58 -143zM249 1402q0 32 -37.5 32t-37.5 -32t37.5 -32t37.5 32zM253 1308.5q0 36.5 -41.5 36.5t-41.5 -36.5t41.5 -36.5t41.5 36.5z M1458 -144.5q0 36.5 -41.5 36.5t-41.5 -36.5t41.5 -36.5t41.5 36.5zM1454 -238q0 32 -37.5 32t-37.5 -32t37.5 -32t37.5 32z" />
+<glyph unicode="&#x1f0b9;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1286 1258q0 -45 -58 -143l-88 -139l-88 139q-57 98 -57 143 q0 72 71 72q26 0 50 -19.5t24 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM1286 877q0 -45 -58 -143l-88 -138l-88 138q-57 98 -57 143q0 73 71 73q26 0 50 -20t24 -45q0 25 24.5 45t50.5 20q71 0 71 -73zM634 1258q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143 q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM277 1354q0 -106 -71 -106q-56 0 -58 63h25q5 -39 36 -39q40 0 41 76q-21 -23 -47 -23q-57 0 -57 66.5t61 66.5q32 0 51 -26t19 -78zM1286 286q0 -72 -71 -72q-26 0 -50.5 20t-24.5 45 q0 -25 -24 -45t-50 -20q-71 0 -71 72q0 45 57 143l88 139l88 -139q58 -98 58 -143zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM960 700q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5 q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM634 877q0 -45 -58 -143l-88 -138l-88 138q-58 98 -58 143q0 73 71 73q26 0 50.5 -20t24.5 -45q0 25 24.5 45t50.5 20q71 0 71 -73zM1425 -161 q57 0 57 -66.5t-61 -66.5q-32 0 -51 26t-19 78q0 106 71 106q56 0 58 -63h-25q-5 39 -36 39q-40 0 -41 -76q21 23 47 23zM1286 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24 -44.5t-50 -19.5q-71 0 -71 72q0 45 57 143l88 139l88 -139q58 -98 58 -143zM634 286 q0 -72 -71 -72q-26 0 -50.5 20t-24.5 45q0 -25 -24.5 -45t-50.5 -20q-71 0 -71 72q0 45 58 143l88 139l88 -139q58 -98 58 -143zM634 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24.5 -44.5t-50.5 -19.5q-71 0 -71 72q0 45 58 143l88 139l88 -139 q58 -98 58 -143zM209 1434q-37 0 -37 -41t34 -41q22 0 43 26q-6 56 -40 56zM1419 -270q37 0 37 41t-34 41q-22 0 -43 -26q6 -56 40 -56z" />
+<glyph unicode="&#x1f0ba;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1286 1258q0 -45 -58 -143l-88 -139l-88 139q-57 98 -57 143 q0 72 71 72q26 0 50 -19.5t24 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM1286 877q0 -45 -58 -143l-88 -138l-88 138q-57 98 -57 143q0 73 71 73q26 0 50 -20t24 -45q0 25 24.5 45t50.5 20q71 0 71 -73zM960 1080q0 -45 -58 -143l-88 -138l-88 138q-58 98 -58 143 q0 73 71 73q26 0 50.5 -20t24.5 -45q0 25 24.5 45t50.5 20q71 0 71 -73zM634 1258q0 -45 -58 -143l-88 -139l-88 139q-58 98 -58 143q0 72 71 72q26 0 50.5 -19.5t24.5 -44.5q0 25 24.5 44.5t50.5 19.5q71 0 71 -72zM314 1353q0 -105 -61.5 -105t-61.5 105t61.5 105 t61.5 -105zM1286 286q0 -72 -71 -72q-26 0 -50.5 20t-24.5 45q0 -25 -24 -45t-50 -20q-71 0 -71 72q0 45 57 143l88 139l88 -139q58 -98 58 -143zM191 1252h-83v24h28v154h-28v25h56v-179h27v-24zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161 q83 -137 83 -161zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM1520 -291h-56v179h-27v24h83v-24h-28v-154h28v-25zM634 877q0 -45 -58 -143l-88 -138l-88 138q-58 98 -58 143q0 73 71 73q26 0 50.5 -20t24.5 -45q0 25 24.5 45 t50.5 20q71 0 71 -73zM1437 -189q0 -105 -61.5 -105t-61.5 105t61.5 105t61.5 -105zM1286 -94q0 -72 -71 -72q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24 -44.5t-50 -19.5q-71 0 -71 72q0 45 57 143l88 139l88 -139q58 -98 58 -143zM960 110q0 -72 -71 -72q-26 0 -50.5 20 t-24.5 45q0 -25 -24.5 -45t-50.5 -20q-71 0 -71 72q0 45 58 143l88 139l88 -139q58 -98 58 -143zM634 286q0 -72 -71 -72q-26 0 -50.5 20t-24.5 45q0 -25 -24.5 -45t-50.5 -20q-71 0 -71 72q0 45 58 143l88 139l88 -139q58 -98 58 -143zM634 -94q0 -72 -71 -72 q-26 0 -50.5 19.5t-24.5 44.5q0 -25 -24.5 -44.5t-50.5 -19.5q-71 0 -71 72q0 45 58 143l88 139l88 -139q58 -98 58 -143zM285 1353q0 81 -32.5 81t-32.5 -81t32.5 -81t32.5 81zM1408 -189q0 81 -32.5 81t-32.5 -81t32.5 -81t32.5 81z" />
+<glyph unicode="&#x1f0bb;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM285 1429h-28v-110q0 -80 -71 -80q-46 0 -56 48l26 9 q10 -31 33 -31q37 0 37 53v111h-41v26h100v-26zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM1284 -166h-940v1496h940v-1496zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM1439 -101 q-37 0 -37 -53v-111h41v-26h-100v26h28v110q0 80 71 80q46 0 56 -48l-26 -9q-10 31 -33 31zM1272 1318h-49q24 -13 42 -38l7 -455v493zM1125 1245q0 13 10 34q-26 -8 -45 -39t-19 -55q0 -86 56 -103q-5 9 -5 22q0 49 42 57v29q-39 18 -39 55zM1165 1042l-6 -103q0 -10 9 -23 l22 364q23 18 30 18q19 0 30 -29v-436q7 -7 12 -8v451q-32 37 -38 37t-26 -13t-21.5 -18t-11.5 -240zM1087 1043q48 0 48 -43q0 -30 -18 -45q12 -8 30 -22l16 217q-35 -19 -35 -34.5t6 -33.5t6 -8q0 -1 -4 -5q-32 11 -52.5 43t-20.5 70.5t21 63.5q38 44 60 44q6 0 4 -2 q-15 -40 -15 -42q0 -39 30 -47l6 89l44 30h-147l-58 -123q14 -27 40 -178q17 26 39 26zM876 1279l60 16q16 0 33.5 -12t24.5 -12q34 0 43 45h-18q-15 -24 -20 -24q-12 0 -25 13.5t-31 13.5t-38 -8t-26 -8t-18 6.5t-16.5 8t-35 1.5t-53.5 -5.5t-28 -5.5l-38 10h-34l27 -8 q34 -15 47 -15l74 13q21 0 43.5 -14.5t28.5 -14.5zM1264 807v15q-98 92 -150 125q-3 1 -10 -2q34 -20 94.5 -76.5t65.5 -61.5zM1122 996q0 36 -35 36q-32 0 -32 -34q0 -29 31 -29q16 0 16 20t-18 20q-3 -7 -12 -16l-4 4q4 17 19 17q22 0 22 -20q0 -32 -29 -32q-1 0 -13 3 q-11 14 -24 35q-8 45 -20.5 103t-16.5 71q-10 25 -47 23q22 -31 47 -142q2 -9 8.5 -25.5t6.5 -21t-1 -2.5q-9 4 -12.5 13.5t-20.5 80t-44 102.5l-71 12q-3 0 -3.5 -6.5t-1.5 -6.5q-11 18 -29 18h-11q15 -40 15 -44.5t-1 -5.5q-2 3 -14 27.5t-30 29.5q-8 0 -24 3l57 -140 q39 -83 100 -118q-57 69 -82 175q2 3 5.5 -2t11.5 -21q12 -50 50 -109t80 -67q-49 40 -73 110q-39 114 -41 118q3 3 4 2q15 -15 39 -92t49 -109.5t59 -32.5q2 0 13.5 2t17.5 2q-10 8 -24 21q7 0 18.5 -8.5t23.5 -8.5q41 0 41 45zM1183 809l-8 -5h-20q-7 11 -3 24t3 18 q-28 -10 -44 -3v37q-26 -16 -37.5 -16t-11.5 16q0 3 2.5 14t2.5 15l-44 -35q38 -32 115 -90q48 -31 126 -124v62q-33 0 -33 15q7 31 1 36l-21 -8q-5 0 -14 4q3 30 0 40h-14zM680 1055l-6 -44q0 -23 23 -23q6 0 54 10t61 16t30 20q-20 31 -43 108.5t-53 91.5q-16 7 -43 6h-21 v-15q0 -48 -17 -71q-20 -28 -20 -35t9.5 -15.5t16.5 -15.5q0 -5 4 -15q8 -2 20 -6v-22l-4 -5q-5 10 -11 15zM848 1017q2 0 2 -1q0 -2 -62 -22l56 -8h32q-22 31 -28 31zM808 981l-34 7q-2 0 -24 -3.5t-32 -3.5q87 -16 87 -18q0 -1 -2 -1h104q-15 17 -44 17.5t-55 1.5z M1049 297q84 156 95.5 244t11.5 111.5t-13.5 76t-32.5 70.5q38 -82 38 -155q0 -168 -102 -331l-58 95q58 177 87 329q2 13 2 54v31q-22 -239 -100 -413zM651 938l-16 -9q33 -96 173 -261q33 106 161 240l-137 -7q-94 0 -159 27zM632 1120l37 58v71q0 1 -42 69h-271v-572 l116 77q-4 8 -34 61q24 35 71 83l29 -29q2 10 4 25q8 24 64 57q4 3 18 23q11 -13 11 -34.5t-25 -36t-49 -26.5q-3 -6 -9 -15l30 -32l108 77q-7 3 -14 7q-8 8 -8 21v38q-1 4 -4 10q4 14 -4 35q0 1 -14 13.5t-14 19.5zM710 634h262l-3 5h-266zM985 613q-5 6 -6 9h-266 q3 -3 8 -9h264zM520 909l-15 42q-10 -5 -15 -15q15 -11 30 -27zM1125 294q0 -2 -3 -6q14 -9 35 -25l7 7q-19 25 -28 24h-11zM513 900q-21 22 -32 27q-2 -3 -7 -9q13 -10 36 -24q1 3 3 6zM1138 295l32 -16q6 0 7 4q-7 6 -16 18q2 2 10 2l-24 41q-18 -4 -92 -64q14 -16 42 -42 q7 -2 17 -6q-7 16 -23 46q36 43 38 43q16 0 30 -17h-24q3 -2 3 -9zM522 935q15 -30 15 -34t-14.5 -25.5t-24 -21.5t-39.5 15q9 -15 21 -41q53 35 90 69q-11 14 -34 35q-6 0 -14 3zM1151 251q-5 7 -27 27h-12l32 -33q2 3 7 6zM500 884l-26 25h-10q-1 -14 33 -31q2 2 3 6z M1135 238q0 2 -25 28q5 -16 16 -45zM460 893h-9q0 -2 -2 -7l37 -22q3 3 4 7q-29 22 -30 22zM661 534h264q-2 9 -6 12h-263q5 -5 5 -12zM674 518h262l-4 6h-266zM993 251q0 27 -77 135q-28 41 -96 113q-47 -83 -81 -135t-83 -100l126 4q82 0 116 -8q79 -21 79 -23h-1 q17 0 17 14zM512 715q-32 -98 -32 -174t34 -159q5 -12 12 -7q-7 10 -17 32q-24 72 -24 133q0 163 102 319l61 -98q-54 -159 -73.5 -256t-19.5 -107.5t2 -25.5t2 -20q10 174 97 409l-66 114q-46 -62 -78 -160zM818 -149l80 8q18 0 20 -1q33 -11 22 -12h332v564l-121 -59 q34 -54 34 -63.5t-67 -76.5l-22 23h-12q8 -22 -12 -42q-27 -19 -70 -60q-14 19 -14 38t22 29q68 28 68 47q0 4 -14 16t-20.5 12t-53 -35.5t-54.5 -45.5q20 -4 22 -18q-2 -15 -3 -39l13 -55q24 -11 24 -22.5t-19 -35t-19 -32.5v-62q0 1 47 -78l-17 -2q-55 31 -80.5 31t-45 -8 t-34 -8t-39.5 14.5t-40 14.5t-27.5 -7.5t-23.5 -7.5t-30.5 11.5t-32.5 11.5t-16 -1q-24 -10 -24 -29q0 3 3 -14h14q22 21 26.5 21t19.5 -12t36 -12l55 10zM846 208h-122q0 -5 8 -13h75q3 0 28 -5.5t28 -5.5q-16 0 44 10q-57 14 -61 14zM779 156q-3 0 63 25q7 0 -17 1.5 t-71 1.5q21 -28 25 -28zM921 184q-50 0 -138 -43q23 -34 44 -97t27 -77q8 -8 21 -23q63 -9 63 -11h-3h11q0 47 5 63.5t17.5 35t12.5 24.5t-2 8q-27 7 -24 33l-14 8q-3 9 -11 25l9 2q5 -10 12 -16v57q-3 4 -8 10q-14 1 -22 1zM397 420q0 -7 -8 -22q17 0 44 -1q-3 -33 1 -44 q39 7 29 7q12 0 19 -9q-5 -20 -5 -35q44 8 35 8q5 0 8 -5q0 -13 2 -35q13 8 32 16h9q4 -19 0 -39q13 10 41 38q-43 29 -125 91q-27 22 -115 117v-69q15 3 33 0v-18zM708 196l28 -48q19 -32 31.5 -71.5t12.5 -45t-2 -7.5l-45 104q-28 61 -78 92h-15q35 -28 59 -86l33 -95 l17 -45q0 -6 -5 -1q-9 11 -51 122q-29 107 -104 116l5 -5q-6 0 -16 1t-13 1l26 -26h-3q-11 3 -19 10t-23 7q-43 0 -43 -44q0 -38 36 -38q31 0 31 31.5t-23 31.5t-23 -22q0 -14 20 -14q2 6 9 15l4 -4q-6 -17 -17 -17q-24 0 -24 29q0 24 28 24q12 0 28 -15q19 -45 27.5 -102 t10.5 -64l26 -47q18 -6 30 -5q-10 14 -23 37q-12 53 -25.5 103t-12.5 51q22 -31 36.5 -99t41.5 -97q39 -12 54.5 -12t25.5 5q14 -12 40 -12l-20 41h2q12 -19 40 -46q11 -1 30 -4l-55 134q-30 70 -92 117zM360 362q0 -11 70 -68.5t91 -66.5l-157 141zM539 132q-46 0 -46 47 q0 16 15 41q-12 12 -30 25l-13 -221q33 28 33 46.5t-13 31.5l4 4q74 -31 74 -111.5t-84 -109.5q-1 1 1 9q13 18 13 41.5t-31 41.5q-1 -31 -7 -90q-44 -31 -47 -31t-45 28l-7 455v-493h206l58 136q-16 32 -41 179q-8 -29 -40 -29zM366 -112q39 -24 40.5 -24t40.5 25 q1 19 4 50l12 316l-5 -3q-8 -135 -23 -357l-24 -18q2 0 -33 18v436q-7 7 -12 8v-451zM555 2q0 26 -15 57t-38 31q-2 0 -2 -19t-1 -23q-5 -18 -34 -36l-3 -16v-11q39 -15 39 -56q0 -17 -8 -30q62 24 62 103zM1017 966l-4 -2l-13 17l3 2zM757 1198q-30 5 -70 28l22 -6 q16 -1 48 -22zM687 1195q10 -5 16.5 -5t1.5 5q10 -1 36 -15q-6 3 -23 3l31 -15q-7 -2 -29 6q-9 -9 -1 -9q-14 1 -24 -4q0 18 -8 34zM749 1072q-9 -8 -13 -8t-62 25q14 3 32 -8.5t26 -11.5t12 5v12q-8 4 -15 -3q2 10 8 10t12 -6v-15zM694 1101q-12 -3 -13 -3t-23 15 q18 1 25 -10q10 6 11 12v-14zM625 1236q0 -38 -59 -120.5t-55 -103.5q-4 32 -59 109t-55 107.5t17 47t36 16.5q44 0 54 -35q0 -10 3 -33h6q5 68 60 68q23 0 37.5 -18.5t14.5 -37.5zM817 841q0 -7 -24 -48q-24 41 -24 48q0 12 12 12t12 -11q0 11 12 11t12 -12zM832 366 q25 -40 25 -50t-12 -10t-13 11q0 -11 -12 -11t-12 12q0 7 24 48zM1241 -48q0 -59 -52 -59q-41 0 -61 68v-2q-11 -66 -60.5 -66t-49.5 61q0 28 54.5 108.5t57.5 107.5q-3 -30 54 -104.5t57 -113.5zM936 71h16q5 0 17 -12q-7 0 -22 10h-7q-2 -4 -7 -7q3 3 3 9zM876 96l3 12h18 q7 0 54 -23h-14l-34 18h-20q-2 2 -2 -4l7 -15q7 2 10 8q0 -13 -11 -13q-11 12 -11 17zM906 -13l-8 -2q-7 0 -13 6q-2 5 -6 14l14 6h47q-11 -15 1 -34q-14 8 -18 8l-9 -3zM882 -23q1 0 52 -17q6 -10 6 -13q-19 4 -41 10t-25 20h8zM717 -27q-20 31 -46.5 110.5t-53.5 118.5 q26 -26 51 -96zM909 -1v5l-12 3v-5zM905 -10l-12 6l-1 -4l11 -5z" />
+<glyph unicode="&#x1f0bc;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM283 1267q-43 -19 -72 -19q-102 0 -102 105t102 105q34 0 72 -18 v-36h-6q-32 26 -68 26q-67 0 -67 -77t68 -77q37 0 67 26h6v-35zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM1284 -166h-940v1496h940v-1496zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41z M1345 -103q43 19 72 19q102 0 102 -105t-102 -105q-34 0 -72 18v36h6q32 -26 68 -26q67 0 67 77t-68 77q-37 0 -67 -26h-6v35zM1036 1230q-2 -6 -6 -19q-3 4 -3 18q-2 -4 -7 -12l-6 12v-18l6 -8h10q6 13 6 27zM1059 1178l-2 -36q6 0 16 -7t19 -7l3 3q6 0 31 -18l-6 -6l-13 5 q-8 0 -12 -12q30 -2 37 -26l-15 -3q10 -5 26 -19q-22 -3 -36 0q17 -14 28 -36l-3 -3q-9 4 -27 13q4 -14 15 -42q10 3 22.5 3t34.5 -27q-21 0 -34 3q17 -18 49 -57q4 -10 15 -28q4 -5 65 -45v485h-203q9 -7 9 -17t-13.5 -42.5t-13.5 -50.5zM1110 1116v6l-15 5v-6zM1000 1200 q8 7 8 14t-5 18v-14q0 -10 -1 -15q-6 32 -14 45q1 -17 12 -48zM1053 1157v28q-9 10 -15 11q2 -15 15 -39zM990 1202v10q0 19 -18 44l6 -38q0 -10 -6 -16h18zM1030 1148q8 15 8 28t-18 21q5 -29 10 -49zM1114 1086q-1 9 -8 9t-14 -9h22zM1018 1163v4q0 8 -7 20v-39q7 8 7 15z M1108 1067l-3 7h-6l5 -7h4zM997 1151q9 9 9 16t-7 18q-5 3 -14 5q3 -9 3 -33l8 7q2 -2 1 -13zM961 1173l8 45q0 50 -32 50h-13q6 -15 15 -47q1 -17 3 -35.5t15 -28.5h21l3 19l-15 5q0 -7 -5 -8zM1069 1095v5l-21 7v-6zM1012 1131q-7 0 -21.5 7t-24.5 7v-2q0 -9 12.5 -20 t23.5 -11h57q1 6 3 19h-50zM1114 1034q-9 5 -27 16q-1 2 -27 30q7 4 12 5q-6 5 -61 15q-14 6 -42 15v-12q11 -19 22 -23h6q21 0 60 -12q18 -13 57 -34zM1039 1068h-10q2 -2 27 -15q-8 15 -17 15zM1008 1026q14 -6 37.5 -6t43.5 -21t24 -24l-10 33q-8 20 -27 26l-44 12 q-25 8 -47 30l-4 -32q14 -25 31 -27l-4 8v1zM1078 987v5l-10 4l-2 -6zM1066 1007v4l-46 6v-4zM1189 745q9 9 9 18.5t-22 29.5q3 6 3 14l-2 7q-2 -9 -12 -21q-8 10 -18 38v-69q5 -5 15 -14l9 12q1 -4 6 -10q0 19 9 24q2 -7 3 -29zM921 986q54 9 54 57.5t-33 125.5 q-3 5 -11 47t-22 50.5t-50.5 8.5t-105.5 -17t-69 -52q0 3 1 3q3 0 23 -67q24 -82 44 -114q37 -60 98 -60q32 0 57.5 20t38.5 23zM1140 750v-3q-2 0 -14 129q-12 -15 -38 -69t-26 -68t8.5 -35.5t21.5 -21.5q9 0 28.5 28t19.5 40zM855 962q-37 0 -55 13l-37 29l5 -12l-5 -12 q2 -20 38.5 -34t60.5 -14q98 0 135 81l-22 4q-57 -55 -120 -55zM1227 720q-8 6 -13.5 6t-15.5 -2q-70 -98 -70 -91q0 -14 19 -21q-3 5 -6 18l5 10q17 -3 37 -3h2q-12 18 -12 32l3 7q13 -1 22 -1h15q-8 10 -22 33q12 3 36 12zM688 1115q9 9 9 25.5t-22 56.5v-24q0 -9 6.5 -28 t6.5 -30zM1188 729l-6 3q-9 -1 -35 -33.5t-30 -35.5l-4 -12l10 -5q38 25 65 83zM1165 741h-10l-56 -66v-12q39 19 66 78zM1249 514h17l6 8v39q-17 -7 -42 -27q13 0 19 -3v-17zM1272 617q-40 -74 -87 -74t-45 40l1 2q11 -35 35 -35q1 0 9 3l-69 71v-14q0 -28 18 -54.5 t48 -26.5q53 0 90 67v21zM1272 497v12q-12 -12 -24 -22h10q5 2 14 10zM712 1095q0 12 -7 26q-7 -18 -32.5 -26.5t-27.5 -24.5q28 3 60 19l1 -3q0 -13 -25 -20t-29 -13v-10q13 -6 24 -6q35 0 36 30q-11 -10 -37 -24v3q37 16 37 49zM1213 519q-14 0 -22 -5q12 -16 22 -16h15 q1 7 6 21h-21zM901 876q-5 0 -18 -9t-17 -10q-4 16 -14 16q-15 0 -20 -19q-9 -33 28 -33q41 0 51 36q5 19 -10 19zM1054 620q0 -18 20.5 -18t20.5 20t-20.5 20t-20.5 -22zM858 810q-3 0 -28 5q15 -17 29.5 -17t38.5 21q-37 -9 -40 -9zM613 1005l63 -10q13 0 33 13 q-2 -18 -18.5 -18t-38 3t-31.5 3q14 -19 36 -17t27 2l-23 -33q0 -33 30 -33q24 0 24 23q-11 -17 -24 -17q-10 0 -10 20q0 11 25 19q-7 1 -13 8q-19 -11 -21 -11q7 14 25.5 22.5t35.5 15.5l2 -5q-4 -9 -35 -22h23q8 0 22 30q5 -10 2 -30q12 10 12 22t-14 39.5t-22 29.5 q-24 -30 -44 -30l-40 8q-20 0 -27 -17l66 -3q1 0 31 11q-10 -21 -37 -21l-42 6q-8 0 -17 -8zM1204 480v9q-23 15 -28 15q-32 0 -45 -32l7 -7q11 4 35 9l3 -2q-3 -9 -3 -16t3 -12h12q16 9 16 36zM778 877q0 21 -21 21t-21 -21t21 -21t21 21zM699 948q-5 0 -12 -7 q5 -12 12 -12l1 9v3q-1 3 -1 7zM848 737q27 0 37 34q4 17 -13 20q-6 -13 -20 -20q-4 9 -15 17q-6 -6 -13 -18q-9 -33 24 -33zM1066 571q0 22 -20 22t-20 -22t20 -22t20 22zM595 978q0 -10 3 -19h15q7 7 8 15q-5 3 -20 3l-6 13v-12zM681 1130q0 43 -27 102q-8 17 -51 67 l26 19h-273v-511q11 18 24.5 31.5t54.5 58.5q4 14 21 35q17 13 59.5 24t56.5 21.5t29 38t38 31.5q-5 9 -5 22t23.5 29t23.5 32zM824 725q9 -12 19.5 -12t26.5 15q-13 -3 -46 -3zM1159 435v25q-21 -6 -55 -30v-10q6 2 21 4l4 -6q0 -8 -4 -19q4 -2 15 -3q19 26 19 39zM728 850 q-20 0 -20 -20t20 -20t20 20t-20 20zM1038 525q0 21 -20.5 21t-20.5 -21t20.5 -21t20.5 21zM1242 477q-34 -24 -103.5 -102t-64.5 -101q23 42 84.5 106.5t83.5 96.5zM828 654q25 0 32 26q3 10 -10 19q-1 -3 -12 -12q-8 13 -13 12l-10 -10q-2 -7 2.5 -21t10.5 -14zM1147 520 l-12 2q-80 -95 -120 -218q38 85 132 216zM723 786q0 21 -20.5 21t-20.5 -21t20.5 -21t20.5 21zM808 316q0 -35 23 -35q-7 39 -7 87q0 75 18 172q16 85 51.5 195t64.5 158q-35 -11 -59 -104l-70 -267q-21 -82 -21 -206zM809 647q9 -12 18 -12t18 12h-36zM1009 483 q-11 11 -21.5 11t-15.5 -8v-21q5 -10 16 -10t21 10v18zM1062 363l25 7q7 0 6 -24q7 1 11 3q10 23 10 29v30q-47 -15 -52 -45zM582 882h-5l3 -18q5 2 23 11q-15 7 -21 7zM818 612q-8 0 -8 9q-3 -2 -8 -19t14 -17t25 24q2 7 0 17q-28 -14 -23 -14zM574 848q-11 0 -12 19 q-7 -7 -15 -24l5 -28q38 19 39 39q-12 -6 -17 -6zM691 736q0 21 -20 21t-20 -21t18 -21q22 0 22 21zM978 428q0 21 -18 21q-23 0 -23 -21t20.5 -21t20.5 21zM1054 316q11 0 12 -19q7 7 15 24l-4 28q-39 -19 -39 -39q11 6 16 6zM823 549q9 27 -10.5 27t-25.5 -24q-2 -7 0 -16 q28 13 23 13q8 0 8 -9q4 3 5 9zM1047 282h4l-3 18q-5 -2 -22 -11q14 -7 21 -7zM567 801l-26 -7q-7 0 -6 24q-7 -1 -10 -3q-11 -23 -11 -29v-30q47 15 53 45zM657 699q-6 10 -17 10t-21 -10v-18q11 -11 21.5 -11t16.5 8v21zM818 515q-8 12 -17 12t-19 -12h36zM820 846 q0 35 -23 35q5 -27 5 -67q0 -76 -18 -199q-7 -50 -46 -174.5t-68 -171.5q35 11 59 103l11 41q9 31 24 93l34 133q22 87 22 207zM946 378q0 21 -20 21t-20 -21t20 -21t20 21zM613 860q-38 -85 -132 -216l12 -2q80 95 120 218zM800 507q-26 0 -32 -25q-3 -10 9 -20q2 3 13 12 q8 -12 13 -12q3 4 10 11q2 6 -2.5 20t-10.5 14zM555 890q-24 -42 -85.5 -106.5t-82.5 -96.5q33 24 102.5 102t65.5 101zM631 639q0 21 -20 21t-20 -21t20 -21t20 21zM880 336q0 -22 20.5 -22t20.5 20t-20.5 20t-20.5 -18zM469 729v-25q21 6 56 30v10q-7 -2 -21 -4l-5 6 q0 8 5 19q-5 2 -15 3q-20 -26 -20 -39zM804 437q-9 12 -19.5 12t-26.5 -15q12 3 46 3zM1272 -157v511q-11 -17 -15 -24q-23 -20 -63 -66q-5 -13 -21 -35q-18 -12 -60.5 -23.5t-56.5 -21.5t-29 -38t-37 -32q4 -9 4 -21.5t-23 -28.5t-23 -33q0 -43 27 -102q7 -16 51 -67 q-13 -8 -27 -19h273zM1033 183q0 10 -3 19h-15q-7 -7 -7 -15q4 -3 19 -3l6 -13v12zM603 593q0 22 -20.5 22t-20.5 -22t20.5 -22t20.5 22zM779 425q-27 0 -36 -35q-4 -16 13 -19q6 12 20 19q4 -8 15 -16q5 5 13 18q8 33 -25 33zM873 266q19 0 19 21t-19 21q-23 0 -23 -21 t23 -21zM928 223v-3q1 -2 2 -7q4 0 12 7q-6 12 -12 12zM453 692q3 9 3 16t-3 12h-12q-17 -9 -17 -36v-9q23 -15 29 -15q31 0 45 32l-8 7q-11 -4 -34 -9zM1017 141l-66 3q-2 0 -32 -11q10 21 38 21l42 -6q7 0 16 8l-63 10q-13 0 -33 -13q2 18 18.5 18t38 -3t32.5 -3 q-16 21 -37.5 18t-25.5 -3l22 33q0 33 -30 33q-24 0 -24 -23q11 17 23 17t12 -20q0 -10 -26 -19q7 -1 14 -8q18 11 21 11q-8 -14 -27 -22l-35 -16l-1 5q3 9 34 22h-22q-9 0 -23 -30q-5 11 -1 30q-12 -9 -12 -21.5t13.5 -40t22.5 -29.5q23 30 43 30l41 -8q19 0 27 17z M797 347q-14 16 -29 16t-38 -21q37 9 40 9t27 -4zM574 542q0 20 -20 20t-20 -20t20 -20t20 20zM415 666h-15q-1 -7 -6 -21h21q14 0 23 5q-13 16 -23 16zM796 308q9 33 -30 33t-49 -36q-5 -20 10 -20q5 0 18 9t17 11q4 -17 14 -17q15 0 20 20zM381 677h-11q-5 -2 -14 -10v-12 q12 12 25 22zM952 124q-35 0 -36 -30q11 11 38 24v-3q-38 -15 -38 -49q0 -12 8 -26q6 18 31.5 27t28.5 24q-29 -2 -60 -19l-2 3q0 14 25 20.5t29 12.5v10q-13 6 -24 6zM513 554q0 28 -18.5 54.5t-48.5 26.5q-53 0 -90 -67v-21q40 74 87 74t46 -40l-2 -2q-11 35 -34 35 q-2 0 -9 -3q22 -24 69 -71v14zM379 650h-16q-4 -4 -7 -8v-39q17 7 43 27q-14 0 -20 3v17zM529 489v12q-39 -19 -66 -78h11zM516 513l-11 5q-38 -25 -64 -83l6 -3q8 1 34 33.5t30 35.5zM954 -12q0 10 -7 28.5t-7 29.5q-9 -9 -9 -25.5t23 -56.5v24zM501 531q0 14 -20 21 q3 -5 6 -18l-4 -10q-18 3 -38 3h-1q11 -18 12 -32l-3 -7q-14 1 -23 1h-15q8 -10 23 -33q-13 -3 -36 -12q7 -6 18 -6l10 2q71 98 71 91zM766 229q-98 0 -135 -81l23 -4q56 55 120 55q36 0 54 -13l37 -29l-4 12l4 12q-2 20 -38.5 34t-60.5 14zM567 425q0 14 -9 35.5t-20 21.5 t-30 -28t-19 -40v3q2 0 13 -129q12 15 38.5 69t26.5 68zM945 -45q0 -3 -1 -3q-3 0 -24 68q-24 82 -44 114q-37 59 -98 59q-32 0 -57.5 -19.5t-38.5 -23.5l26 25q-54 -9 -54 -57t33 -126q2 -4 10 -46t24 -53q12 -7 48.5 -7t106 17t69.5 52zM439 419q-9 -9 -9 -18.5t23 -29.5 q-3 -6 -3 -11t1 -10q2 9 12 21q8 -10 18 -38v69q-5 5 -15 14l-9 -12q-1 4 -6 10q0 -19 -9 -24q-2 7 -3 29zM609 144v4l-47 6v-4zM562 171l-12 3v-5l11 -4zM621 135q-15 6 -38.5 6t-43.5 21.5t-23 23.5q13 -50 31 -57l51 -14q23 -7 45 -30l5 32q-15 26 -32 27l5 -8v-1z M589 93h11q-3 2 -27 15q7 -15 16 -15zM660 46v12q-12 20 -23 23h-3q-22 0 -63 12q-18 14 -57 34q9 -5 27 -16q1 -1 27 -30q-7 -4 -12 -5q6 -5 62 -15q13 -5 42 -15zM663 16v2q0 10 -13 20.5t-23 10.5h-57q-2 -6 -3 -19h49q7 0 21.5 -7t25.5 -7zM580 54v6l-21 6v-5zM667 -12 l-7 -45q0 -50 31 -50h14q-7 16 -15 47q-2 17 -4 36t-14 28h-21l-3 -19l15 -5q-1 8 4 8zM631 10q-9 -9 -9 -15.5t8 -18.5q4 -2 13 -5q-3 10 -3 33l-7 -7q-3 3 -2 13zM529 87l-4 7h-5l3 -7h6zM618 -26v39q-8 -7 -8 -15v-4q0 -7 8 -20zM525 66q4 0 12 9h-23q1 -9 11 -9zM598 13 q-7 -14 -7 -27.5t18 -21.5q-6 30 -11 49zM639 -41v-10q0 -18 18 -44l-6 38q0 11 6 16h-18zM591 -35q-3 15 -15 39v-28q8 -10 15 -11zM628 -39q-7 -7 -7 -14t4 -18v14q0 11 2 15q5 -31 13 -45q-1 17 -12 48zM534 34v6l-15 5v-6zM577 -47l-7 30v19q1 12 1 17q-6 1 -16 7.5 t-18 6.5l-3 -3q-7 0 -32 18l6 6l14 -5q7 0 12 12q-31 3 -38 26l15 3q-10 5 -25 19q21 3 36 0q-18 14 -29 36l3 3q9 -4 27 -13q-4 14 -15 42q-10 -3 -22.5 -3t-34.5 27q21 0 35 -3q-18 18 -50 57q-4 10 -15 28q-4 5 -65 45v-485h203q-9 7 -9 10q0 18 13.5 50.5t13.5 49.5z M615 -68v18l-6 8h-11q-6 -13 -6 -27q2 7 6 19q3 -4 3 -18q2 5 8 12q1 -4 6 -12zM918 1223q-35 13 -52.5 13t-55.5 -16q14 22 51 22t57 -19zM901 1184l-34 -11q-10 0 -35 8q7 39 30 39q15 0 53 -23v-3q0 -2 -9 -30l1 11q0 9 -6 9zM855 1163l-5 -2l-3 9h5zM988 1008l-10 -12 l-3 5l10 10zM1173 775l-8 -1l-6 1l9 12q2 -4 5 -12zM1161 766l-5 -9l-4 3l4 9zM727 1212q1 0 6 -1q-11 0 -43 -17q5 18 37 18zM789 1076q-18 0 -23 25q-1 19 -3 38q-5 4 -15 13h-24l-1 -7l4 -9l-18 21q7 12 20 18l1 3l2 -1q5 2 15 5q-4 5 -13.5 5t-24.5 -17q12 24 24.5 24 t22.5 -10v6q0 7 -5 16q17 -11 17 -64v-15q0 -44 16 -44q5 0 13.5 8.5t14 8.5t11.5 -5q3 7 2 20q4 -5 4 -24v-2q-51 -13 -40 -13zM937 965l-10 -8l-3 5l10 7zM847 1061l-69 -18v7q7 13 26 16l36 7q2 -4 7 -12zM877 987h-4v9h4v-9zM835 1043q-13 -14 -22.5 -14t-20.5 6h6 q5 -1 7 -1h5q12 0 25 9zM868 992l-7 -12l-5 4l9 11zM904 951l-13 -4v6l13 3v-5zM835 1019q2 0 -31 -18v12q17 6 31 6zM876 944h-11v6h11v-6zM844 941l-12 4l2 5l10 -5v-4zM814 950l-4 -2l-3 9h3zM736 1017h-6v17h6v-17zM625 1236q0 -38 -59 -120.5t-55 -103.5q-4 32 -59 109 t-55 107.5t17 47t36 16.5q44 0 54 -35q0 -10 3 -33h6q5 68 60 68q23 0 37.5 -18.5t14.5 -37.5zM993 473h-8v6h8v-6zM643 685h-7v6h7v-6zM1241 -48q0 -59 -52 -59q-40 0 -61 68v-2q-10 -66 -59.5 -66t-49.5 61q0 28 54 108.5t57 107.5q-3 -30 54 -104.5t57 -113.5zM898 127 h-6v17h6v-17zM822 204h-3l-5 7l5 2zM796 216l-1 -5l-11 5v4zM763 211h-10v6h10v-6zM825 148q-18 -5 -32 -6q-2 0 32 18v-12zM738 208l-14 -3v5l14 4v-6zM772 177l-9 -11l-3 3l8 12zM837 126q-3 0 -8 0.5t-14 0.5t-22 -9q13 14 22.5 14t21.5 -6zM756 165h-5v9h5v-9zM850 111 q-7 -12 -26 -15.5t-35 -7.5q-3 5 -8 12l69 18v-7zM705 199l-11 -7l-3 4l11 8zM919 -9q-12 -24 -24.5 -24t-21.5 10v-6q0 -7 4 -16q-16 11 -16 64v15q0 44 -17 44q-5 0 -13.5 -8.5t-14 -8.5t-11.5 5q-3 -7 -1 -20q-5 6 -5 24v2q51 13 41 13q17 0 22 -24q1 -19 3 -39 q5 -4 15 -13h24l2 7l-5 9l18 -21q-7 -11 -20 -18l-1 -3l-2 2q-5 -2 -14 -6q3 -5 12.5 -5t24.5 17zM901 -51q-1 0 -6 1q11 0 44 17q-6 -18 -38 -18zM477 404l-5 -9l-4 3l4 9zM469 389l-9 -12q-2 4 -4 12l7 1zM654 160l-11 -10l-3 3l11 12zM781 -9h-4l-3 7l4 2zM727 -23l35 11 q9 0 34 -8q-7 -39 -30 -39q-15 0 -52 23v3q0 3 9 30l-2 -11q0 -9 6 -9zM819 -59q-15 -22 -52 -22t-56 19q34 -13 51.5 -13t56.5 16zM892 1202q-22 15 -31.5 15t-14.5 -14q41 1 46 -1zM876 1190q-9 -2 -26 -5l23 -4zM736 1175l-4 2l-3 -2l-2 -6l5 -2zM738 1157v4h-15v-4h15z M805 1062q-16 0 -16 -12l37 12h-21zM823 99q16 0 17 12l-38 -12h21zM906 0v4h-15v-4h15zM901 -8l-4 2l-5 -8l4 -1l3 1zM778 -24l-22 4l-3 -9q8 3 25 5zM736 -41q22 -15 31.5 -15t15.5 14q-42 0 -47 1z" />
+<glyph unicode="&#x1f0bd;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM316 1353q0 -88 -82 -103q18 -11 26.5 -11t22.5 4l-13 -32 q-3 -1 -13 -1.5t-34 11t-36.5 11.5t-22.5 -9l-11 17q10 10 20 15q-66 25 -66 99q0 46 29 75t75 29t75.5 -29.5t29.5 -75.5zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM1284 -166h-940v1496h940v-1496zM296 1160q0 -23 -84 -161 q-83 137 -83 161q0 41 41.5 41t41.5 -37q0 37 42 37t42 -41zM1521 -190q0 -46 -29 -75t-75 -29t-75.5 29.5t-29.5 75.5q0 88 82 103q-18 11 -26.5 11t-22.5 -4l13 32q3 1 13 1.5t34 -11t36.5 -11.5t22.5 9l11 -17q-10 -10 -20 -15q66 -25 66 -99zM1016 1315h-35 q10 -21 19 -30q6 -3 16 -11v41zM1120 1185q-26 61 -26 74.5t8 58.5h-75q-2 -12 4 -34q43 32 48.5 32t7.5 -2q-2 -10 -53 -44q26 -4 45 -13l-4 -4l-40 2q4 -34 52 -66l-22 -2q-23 3 -37 32q-14 25 -10 38q0 1 -15 8.5t-44 52.5h-30l130 -162q28 29 61 29zM1178 892l-4 -21 q0 -11 6 -19l61 -83q10 -16 31 -47v596h-156l-16 -32q0 -47 28 -105q-56 -9 -75 -47l93 -141q-10 -13 -39 -37q16 -21 25 -27l5 13l4 -20q2 -9 13 -9v12q-6 12 -6 32l-8 -13q-1 15 10 32q2 -20 9 -55h10q0 12 1 12h2v-13q-1 -34 -17 -103q7 37 21 101q10 -10 11 -10 q11 8 9.5 31t9.5 34q8 -65 10 -65v2q0 -13 -12 -28q-3 0 -8 -3q-6 7 -18 13zM840 1318h-27q23 -11 44 -15q-15 15 -17 15zM1208 930q0 -3 -6 12q1 -19 -7 -32t-8 -14q0 -12 13 -12q4 11 4 17q-1 -6 -7 -6t-7 1q1 1 9 2l9 11v21zM938 1187q-1 4 -1 -50t16 -90q23 -52 110 -65 l-29 -1q-59 6 -84 44q-10 15 -20 54q2 -7 2 28v85q0 3 -11.5 21t-13.5 24q0 -24 -5 -73l-4 -48q0 -88 62 -142q26 -22 87 -22l26 4q17 3 24 -3zM1164 907q-3 0 -9 -1.5t-9 -1.5q11 -16 18 -22v25zM731 1318q-24 -17 -24 -24.5t4 -11.5q1 21 32 36h-12zM1182 838q-5 10 -9 15 q-5 -14 -7 -29q4 2 16 14zM696 1301q0 3 4 -11q9 18 21 27q-25 3 -25 -16zM779 1234q-2 2 -6 3q-4 -5 -9 -12h9q6 4 6 9zM759 1274l-22 -3q-3 0 -12 9q16 4 27 4q40 0 40 -43q0 -38 -11.5 -55t-11.5 -19.5t3 -9.5q20 -11 20 -18q0 -6 -5 -1t-15.5 11.5t-10.5 14t10.5 29 t12.5 28.5q-37 -7 -41.5 -7t-19.5 5q-6 -30 -6 -47q0 -42 60 -133q5 -3 15 -3t93 29l13 153q0 77 -92 90q-6 1 -18 7t-16 6t-29.5 -17t-25.5 -26v-33q34 5 36 5q-8 0 34 -10v9q-10 25 -28 25zM1147 751l10 -3l56 21q4 1 5 -1l-72 -34l6 -7l10 8q-3 0 6 -5l71 24 q-15 27 -47 74q-2 1 -6 1q-20 -14 -58 -43q6 -1 9 -4l51 34q-9 -18 -33 -33.5t-27 -20.5q15 7 12 7q6 0 6 -3l55 31h2l-67 -48q2 -2 3 -6zM1092 698l3 -26h9q47 18 114 65q-63 -16 -63 -18h1q-15 0 -41 59q13 8 36 64h-2q-20 0 -38 -51q-19 -53 -19 -93zM1129 784h-4l-3 -9 l4 -1zM810 1026l20 -3q26 3 42 6t20 -3l-2 31q-27 -12 -80 -31zM708 1167q-58 -116 -58 -143v-9q8 2 20 6q-2 21 10 43l23 40q1 -11 -10.5 -32t-11.5 -29.5t6 -14.5q6 2 34 57l1 -9q-4 -9 -10 -32q20 4 39 14q-19 40 -43 109zM782 1026q-7 5 -25 23q-10 -6 -32 -12 q55 -11 57 -11zM900 1023q-64 -13 -89 -13t-48 4.5t-35.5 10.5t-16.5 6t-56 -23q94 -30 149.5 -30t111.5 14q-6 11 -16 31zM1071 943q-19 -4 -45 -4t-54 11q-18 7 -15 7q-96 -18 -142 -18q-100 0 -196 44l-65 -30q15 -12 37 -26q123 -48 222 -48t229 48q11 7 29 16zM807 796 q36 36 36 44t-18 8t-18 -9q0 9 -17 9t-17 -8.5t34 -43.5zM691 1318h-335v-494q60 53 228 158q-1 8 -1 17q0 37 31 91l56 98q22 51 21 87v43zM895 875h-7l-87 -209l-81 217l78 -233zM283 1353q0 77 -71.5 77t-71.5 -77t71.5 -77t71.5 77zM1081 508v82q0 3 -3 18q-7 35 -7 106 t29 113q5 7 54 56q-32 48 -48 68q-26 -11 -71 -36v-474q0 -3 4.5 -13.5t4.5 -14.5q-7 15 -14 35v465l-9 -3v-175q-23 -4 -47.5 -7.5t-42.5 -18.5l82 171v20l-99 -201q3 1 5 2l-36 -66q-57 7 -146 22l-60 146q-33 78 -55 107l106 -264q155 -12 159 -20q1 -23 14 -71 q22 -47 114 -49q7 -2 7 -17t-1 -16q-5 12 -19 29l110 -274l-62 165q6 6 6 -6q29 32 32 59q12 83 12 103l-13 152q0 26 11 79q4 25 59 93q-30 -23 -40.5 -35.5t-25.5 -47t-15 -38.5l13 -188q0 -91 -14 -117q0 16 3 39zM647 670l-109 274l-4 -4l104 -270h9zM623 437 q50 0 97 26l-91 -177q5 -9 4 -14l125 262q49 -5 151 -19q108 -238 108 -249.5t-2 -9.5q-86 32 -161.5 32t-104.5 -4q-15 -5 -41 -11q-31 -2 -82.5 -24t-55.5 -23q6 2 39 2t64 -8t21 -8q3 0 31 5l40 7q29 4 65 4q90 0 197 -42l65 30q-33 21 -73 39q6 5 5 8l-106 259 q-86 10 -160 22q0 -9 -4 38q-6 76 -128 85q0 26 -9 52v-462l6 3v177zM928 283l-78 232l-97 -224h8l87 209zM1345 -189q0 -77 71.5 -77t71.5 77t-71.5 77t-71.5 -77zM947 -90l10 -49q0 -7 -7 -15h322v489q-113 -109 -214 -150q1 -9 1 -17q0 -37 -12 -62l-40 -61 q-60 -99 -60 -135zM876 328q0 6 -35 42q-35 -36 -35 -42q0 -11 17.5 -11t17.5 10q0 -10 17.5 -10t17.5 11zM587 787q-46 -50 -46 -144l16 -160q0 -45 -11 -93t-62 -94q81 54 81 164l-11 161q0 70 27 149q1 2 5 4q2 -3 -4 -17t-17 -52q-3 -26 -3 -69l10 -163q0 -119 -82 -184 q20 -25 52 -72l64 37v485q0 -6 -11 38q-8 -1 -10 1q2 2 2 9zM916 135l-54 5q7 -4 24 -17q12 6 30 12zM528 620q-38 -34 -79 -92.5t-49 -93.5q31 62 64 108q23 26 64 78zM746 144q30 10 71 10t57.5 -2t33.5 -7.5t31 -5.5t8 3q-9 -18 -27 -51q4 12 6 34l-38 -11 q27 -41 45 -107q3 7 29 60.5t29 86.5h-9q-5 -2 -11 -6q1 -17 -11 -40l-22 -43q-1 3 -1 8t10 23.5t10 22.5v24q-2 0 -5 2q23 12 34 16q-64 30 -171 30q-26 0 -93 -11q4 -4 24 -36zM495 437q-1 4 -4 8q-2 -4 -6 -10q3 1 10 2zM823 143h-24q-18 -2 -53 -2q6 -19 5 -28 q42 21 72 30zM522 394l-4 1l-5 -9l4 -2zM549 435v64h-9q-60 -23 -115 -64q60 15 61 15q14 0 28 -25t15 -34q-17 -10 -42 -69q21 4 41.5 48t20.5 65zM488 424l-60 -24q-4 0 -5 1q20 11 62 32l-7 6q-26 -8 -73 -21l29 -47q30 20 70 52q-3 0 -10 -7q-8 8 -6 8zM916 -59l-7 1v-6 q1 4 7 5zM498 403l-62 -32q9 -19 21 -31l56 43q-2 3 -6 4q-28 -15 -51 -32q3 15 28.5 29.5t28.5 25.5q-2 -4 -7 -10zM400 434h-4l-3 -9l4 -2zM877 -105l20 3q15 0 19 -6q-31 -7 -32 -7q-38 0 -38 55q0 15 12 39t14 30q-10 6 -26 23q5 5 31 -15q3 -26 -20 -57l3 -7q29 4 58 0 q6 32 6 54.5t-28 70.5q-7 20 -30 49q-10 6 -36.5 6t-72.5 -29q-17 -132 -17 -147t13.5 -44t28.5 -38q19 -3 52 -12q37 -15 30 -15q4 0 51 27q6 14 6 29.5t-3 22.5q-16 -8 -25.5 -8t-35.5 13v-14q0 -5 8 -14t12 -9zM862 -65h10q1 5 5 9l-18 -2q3 -3 3 -7zM479 345 q-6 -3 -18 -12q10 -9 9 -14zM945 -127q0 5 -5 9q-1 -21 -29 -31h10q24 2 24 22zM934 -128q0 10 -4 18q-1 -15 -38 -38q19 1 42 20zM495 265l-12 23q-2 -12 -6 -29q6 6 18 6zM504 246l-9 11l-4 -3l9 -10zM496 236l-3 10l-4 -1l3 -9h4zM743 64q0 66 -38 109.5t-109 43.5 q-2 0 -22.5 -3t-29.5 -3q9 -14 14 -24q5 0 10 -3q-1 -2 -2 -3q13 -19 23 -31q7 0 22 -2q-8 -3 -20 -2l112 -159q0 12 0.5 32.5t0.5 22.5q0 137 -125 142q-2 1 -4 3l48 1q13 -4 35 -14q25 -15 33 -27q19 -33 20 -49v-26q0 -40 2 -94l24 -42q-1 10 -1 24q0 21 2 48q5 47 5 56z M501 224h-4l-3 -12h4zM444 272q-8 -26 -8 -25t3 -8l4 21q2 10 13 8zM473 225v10h-5v-10h5zM475 178v23h-4v-23h4zM531 -154l10 61q0 50 -31 83l46 13q24 6 37 48l-98 133q39 23 39 34t-23 25q-4 -16 -15 -44q-4 17 -7.5 33.5t-13.5 18.5v-48v-9q0 -29 11 -55q9 -8 24 -23 q2 -12 1 -17l13 16q4 -7 0 -15q2 2 12 2q15 0 16 -25q-12 -7 -23 -7q7 -4 18 -16q-3 -3 -18 0q5 -9 1 -18q-12 -10 -21 -10t-12 16q-16 -8 -13 -8q-2 5 -2 13l-14 -3q-14 0 -14 19t17 19q-1 5 -10 13h21v35q0 3 -4 14q-9 22 -17 120h-9q0 -23 -15 -65q-8 63 -9 63v-2 q0 14 6 20v-18q2 25 22 16q-6 3 -18 8l16 2q7 -7 12 -8l3 17l-113 169v-620h175zM526 96l-2 -17h20l-8 17h-10zM505 112q-11 -3 -23 -3q4 -8 18 -15q5 17 5 18zM518 76q0 16 -17 16q-8 0 -16 -9v-15q8 -8 16 -8q17 0 17 16zM557 -99q0 -11 -10 -52h77q-4 14 -2 36 q-57 -34 -61 -34t-1 1q22 29 59 47q-19 3 -49 13h46v14q0 20 -49 51l25 2q37 -17 43 -69q15 -7 31.5 -20t27.5 -44h31l-136 167q-15 -30 -60 -32q28 -30 28 -80zM526 39q-10 13 -18 13q-2 -5 -8 -11q3 -3 4 -7q8 2 22 5zM462 70l5 -20h12q3 17 3 18q-17 2 -20 2zM678 -154 q-2 23 -35 47q0 -9 -1 -47h36zM1164 1078l-5 -30q0 -4 6.5 -17.5t7.5 -17.5q4 -16 7 -44l-2 -38q1 17 -5 58q-2 -4 -2 -19q0 6 -8.5 37.5t-15.5 40.5q-3 1 -11 1q-1 7 0 19q-2 2 -6 2t-12 -13q-1 1 0 11q-5 4 -6 4l-7 -2q-3 0 -16 22q2 2 3 6h16l4 4l-15 17q6 1 19 -2 q0 3 -6 17q10 9 20 9t18 -16q7 7 10 13q0 -13 3 -21q3 3 9 8h12q5 -17 5 -28q-4 -4 -20 -10l13 -13zM864 1277l-43 -3q-6 0 -16 10q7 -5 29 -2.5t30 -4.5zM1147 932h-5v12h5v-12zM1048 1021q-5 -1 -10 -1q-31 0 -47 22q-18 26 -17 56v21q3 -59 27 -80.5t47 -17.5zM836 1216 l-23 6l-3 9q0 19 35 19q16 0 34 -13q2 -4 3 -10q-32 -11 -46 -11zM808 1151l-2 -4l-19 11l1 4zM820 1096l-34 5q-15 0 -21 -1l-3 -4v10h66v-10h-8zM812 1084l-38 3v5l38 -3v-5zM805 1058h-20v5h20v-5zM625 1236q0 -38 -59 -120.5t-55 -103.5q-4 32 -59 109t-55 107.5t17 47 t36 16.5q44 0 54 -35q0 -10 3 -33h6q5 68 60 68q23 0 37.5 -18.5t14.5 -37.5zM1017 515h-19q-22 0 -40 6q-39 15 -51 49.5t-12 45.5q0 61 55 94q20 12 37 12h30v-207zM1064 415l-6 -18l-3 2l5 16h4zM719 627q29 -29 29 -78.5t-42 -82.5q-22 -17 -50 -16h-29v206h21 q42 0 71 -29zM1241 -48q0 -59 -52 -59q-40 0 -61 68v-2q-10 -66 -59.5 -66t-49.5 61q0 28 54 108.5t57 107.5q-3 -30 54 -104.5t57 -113.5zM856 109h-22v4h22v-4zM867 77l-38 3v5l38 -3v-5zM813 72l39 -4q18 0 30 8v-13h-7q-22 0 -62 9zM630 146q18 0 37 -50q1 -2 1 -6 l-1 -1v-21q2 19 -13 44.5t-38 33.5h14zM800 -81q-3 0 -17.5 4.5t-22.5 6.5q-3 23 37 23q22 0 34 -12q-12 -22 -31 -22zM817 -107l-22 -3q-9 0 -21 7h59q1 -3 5 -9q-9 5 -21 5zM1159 1104l23 -2q0 4 -8 20h-9zM1141 1137h-20l-3 -9q6 -4 14 -8q9 8 9 17zM1156 1096 q0 16 -16.5 16t-16.5 -16t16.5 -16t16.5 16zM1162 1063q-12 12 -18 12q-5 -17 -5 -18q9 2 23 6zM1097 1096l5 -21h10q1 6 5 18q-16 3 -20 3zM1173 989v7h-5v-7h5zM831 1225q-6 3 -6 12q-6 -6 -10 -6q13 -6 16 -6zM823 -62q-4 3 -12 8q6 -6 5 -11q3 1 7 3zM777 -57l-2 3 l-7 -7l3 -2z" />
+<glyph unicode="&#x1f0be;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM302 1252h-82v25h22l-64 81l66 71h-24v26h80v-26h-22l-62 -71 l64 -81h22v-25zM203 1429h-25v-152h23v-25h-80v25h25v152h-25v26h82v-26zM1499 4q0 -41 -41.5 -41t-41.5 37q0 -37 -42 -37t-42 41q0 23 84 161q83 -137 83 -161zM1284 -166h-940v1496h940v-1496zM296 1160q0 -23 -84 -161q-83 137 -83 161q0 41 41.5 41t41.5 -37 q0 37 42 37t42 -41zM1507 -291h-82v26h25v152h-23v25h80v-25h-25v-152h25v-26zM1408 -265v-26h-80v26h22l62 71l-64 81h-22v25h82v-25h-22l64 -81l-66 -71h24zM1205 1136q6 33 -7 43v-46zM1174 1133l15 3v53q-6 5 -15 9v-65zM1165 1184q0 19 -12 27v-75h12v48zM1200 1284 q0 21 -24 21q-7 0 -10 -1q-10 -10 -25 -33q-46 -74 -71 -74h-4q5 -11 5 -26q0 -21 -9 -50q-9 -31 -9 -19q0 -5 10 -24q3 5 51 108t62 103q13 2 13 -10q0 -4 -4 -8q-5 11 -11 13q-6 -6 -6 -11.5t6 -11.5h14q12 11 12 23zM1132 1197h-4l-7 -13l4 -2zM1141 1138q1 34 1 54 t-1 24l-12 -12q10 -8 6 -26.5t-9 -39.5h15zM1200 1096q18 4 18 18t-15 13h-56q58 -31 53 -31zM1062 1203q12 0 30 12l-51 25q-3 -8 -9 -20q34 -17 30 -17zM1095 1122q0 14 11 -52h80q6 17 8 22l-73 45q3 17 12 50q-38 -50 -38 -65zM1065 1179q-1 10 -13 19l-20 16v-21 q20 -10 33 -14zM1062 1143l4 26q-9 6 -34 18v-22q14 -7 30 -22zM1186 1057v7h-80q-1 -4 -3 -7h83zM1272 1318h-187l-43 -67q45 -30 53 -30t37.5 44t31.5 46t11 2q30 0 30 -29t-26 -29q-5 0 -18 14q-10 -18 -19 -41q26 -15 70 -53q-1 -17 1 -42q10 -30 10 -19q0 -22 -25 -21 q-2 -5 -9 -28l83 -309v562zM1061 1140l-23 13q4 -14 11 -41q5 8 12 28zM1194 1024l-96 4v-8zM660 1272l22 -6h360q6 13 12 20q-17 -7 -27.5 -7t-23.5 2t-23 8t-12 6l-53 -13q-13 0 -30 6.5t-18 6.5q-35 -16 -53 -16l-44 18q-2 0 -16.5 -9t-33.5 -9l-46 13q-5 0 -17 -6 q0 3 3 -14zM1080 989q15 80 15 84.5t-2 18.5t-2 20q-25 -52 -25 -46q0 -3 6 -14q10 -21 8 -63zM1080 975v13h-5v-13h5zM1254 740q-12 49 -37 140q-45 7 -127 22zM686 1122q-3 -8 -3 -24t3 -40v-65q0 -5 -14.5 -27t-23.5 -22q-17 0 -17 17q0 10 11 12v-18h9q9 4 9 10t-24 23 q0 6 -1.5 16.5t-1.5 9t18 61.5q-9 -17 -22 -51q3 -35 -5.5 -45t-8.5 -16q0 -32 24 -32q15 0 28 9q7 8 22 20v-3q-20 -31 -35 -30l11 -1l40 26v-3q-14 -20 -22 -25q10 2 46 41q4 -29 -24 -41q18 14 42 31q12 -26 25 -26q-10 14 -10 22.5t3 8.5q2 -14 20 -30t32 -16 q-9 2 -21.5 19.5t-12.5 25.5q0 6 1 4q34 -45 49 -45q23 0 23 28q0 10 -10 20h10q-11 28 -11 36q7 -11 20 -26q7 6 10 3q-11 -21 -11 -28q0 -33 35 -33q30 0 38.5 11t10.5 11q-9 -18 -21 -29h11q12 -1 30 11l18 22q2 -2 -1 -10.5t-13 -17.5h9q30 12 30 55t-21 99.5t-23 84.5 t-6 49q2 2 6 2q0 -54 30 -128.5t30 -95.5t-9 -41q-5 -6 -11 -17q20 8 31 20q6 -5 4 -5q2 0 10 8q16 23 16 50t-23.5 97.5t-23.5 118.5h-112l-3 -18q0 -44 26 -122.5t26 -87t-1 -9.5q-58 143 -58 221q0 7 1 14h-25q-6 -23 -6 -42t26.5 -95t26.5 -95.5t-1 -21.5q-4 11 -7 18 q3 4 4 13q-55 134 -55 208q0 8 1 15h-180q0 -17 -1 -29h43q-2 1 13 8q15 -16 15 -43.5t-18 -94.5q23 -17 23 -23.5t-2 -8.5q-3 5 -11 15q-18 14 -18 19q0 17 18 65q-3 3 -9 6q-16 -6 -27 -6t-24 3zM746 1158q0 2 -9 19q-17 -3 -51 -8v-28q3 1 50 6q-8 4 -17 4t-26 -6 q0 -3 3 9h35q7 -1 15 -8v12zM743 1135h-10q0 -2 10 -10v10zM1100 849q33 -35 42.5 -59t9.5 -66t-35 -97t-89 -76q-1 -3 -1 -7q78 20 123 120v-154h16v262q25 -15 106 -102l4 14l-204 205l-4 -8zM701 1128q-3 5 -10 9q-1 -2 -5 -3q12 -7 15 -6zM663 1084l-16 -58v-35 q5 24 15 63q1 -29 7 -81l8 38v163q-1 -2 -21 -91q0 5 5 10q2 -3 2 -9zM1024 669q0 40 24 177q10 43 27 127q-28 -67 -132 -76l-21 -402h94l8 76v98zM725 878q0 -25 30 -44q36 29 35 43.5t-12 14.5l-20 -11l-10 11h-17q-6 -12 -6 -14zM673 1207.5q0 11.5 -13 54.5t-30 56 h-274v-473q131 92 219 117q19 5 42 25q-1 8 -1 18q10 26 27 76q10 73 20 94t10 32.5zM935 899l-26 3q-7 0 -10 -1q-78 -86 -132 -157q11 -5 12 -11l4 -16q0 -4 -7 -20t-9 -22q-14 -5 -57 -11v-86q59 34 165 181l51 58q9 20 9 56v7v19zM1270 342l-18 3q-6 0 -94 -51l27 -4 q16 0 47.5 19t37.5 33zM773 734l-10 4l-1 -3l9 -5zM1068 486q-4 -5 -6 -48.5t-1 -46.5l4 -4q4 46 4 77q0 12 -1 22zM738 763v4l-18 3v-5zM1035 393l-2 88h-5l3 -88h4zM769 697v5h-12v-5h12zM707 810q0 21 -14 54.5t-26 44.5q-9 2 -24 7q-34 14 -36 44h-11q-26 0 -163 -78 q9 1 17 1q44 0 92 -25q58 -31 65 -86h10q11 4 90 7v31zM764 688q-76 0 -76 3q16 2 32 2t33 -2v17l-4 -3q-45 -3 -60 2v3q1 2 75 2q-2 8 -6 12h-64q-6 1 -6 4h71v12q-24 2 -68 9q18 2 47 8q-3 0 -22 8.5t-37.5 8.5t-38.5 -2l-28 -4l-4 6v-101q30 -6 42 -6l96 8q1 7 4 8l7 -6 q7 0 7 11zM912 388l45 -3q1 0 59 8v90q-24 4 -59 4q-26 0 -58 -2l-21 -1q-1 -7 -5 -11q-5 5 -4 6h-10v-13q44 2 63 2q12 0 13 -1q-14 -2 -28 -2q-18 0 -37 3v-18q19 3 37 3q14 0 28 -2l-2 -4l-84 -3q4 -7 7 -2q-3 1 -3 3h7q3 -3 5 -10q30 0 65 -5q-21 0 -63 -3l-3 -5 q24 -4 68 -14q-12 -3 -44 -3q-1 -4 -3 -7q24 1 27 -10zM1018 387q-55 -10 -59 -10l-12 -1h-28v-29q0 -43 38 -103q10 -1 22 -4t46 -39q53 11 165 73q-5 -1 -10 -1q-33 0 -94 23q-26 10 -47 41t-21 50zM866 454v5h-12v-5h12zM596 679l-3 88h-4l2 -88h5zM906 389v4l-18 3v-5z M563 769l-4 4q-4 -46 -4 -77q0 -12 1 -22q4 5 6 48.5t1 46.5zM858 423v4h-9v-4h9zM481 867q-11 4 -27.5 4t-54.5 -27t-44 -29q14 -7 19.5 -7t51 27t55.5 32zM846 418q0 7 -6 25q0 5 16 40q18 5 56 12v85q-49 -26 -161 -178q-25 -24 -54 -60q-8 -18 -8 -54v-15v-16h33 q74 72 134 158q-4 0 -10 3zM1272 -154v455q-113 -68 -244 -111q-11 -19 -22 -27q0 -14 -4 -38q-11 -21 -27 -61l-12 -65q-1 -4 -6.5 -14t-5.5 -12q0 -42 45 -127h276zM839 262l22 10q7 0 28 -16l9 6v17q0 5 -14.5 24t-23.5 19t-21 -16.5t-12 -30t12 -13.5zM557 97l-13 56 q0 47 40 75t96 29l24 404h-96q-4 -83 -16 -228q-21 -146 -66 -338q0 13 12 -43q19 50 19 45zM471 640h-10q4 -21 -1 -37l-9 -221l-97 97q-1 -4 -4 -7l204 -205v9q0 1 -91 92q15 181 115 227q5 4 16 11h-9q-84 -27 -114 -125v159zM961 62q19 75 19 100q0 5 -1 8q3 -1 6 -1 q26 0 26 26.5t-29 26.5q-13 0 -23 -3q-5 -5 -17 -13q8 11 23 23q-6 1 -47 -30q-3 2 14 25q-3 -1 -21 -10q3 11 11 18h-13q-21 -15 -31 -28q-7 8 -21 22q5 -19 5 -25q-33 40 -45 36q26 -26 26 -35.5t-2 -10.5q-13 47 -53 47q-21 0 -21 -23q0 -13 11 -23q-2 -1 -6 -1t-5 -1 q5 -5 1 -10l-14 -2q-1 0 -1 2l5 30q0 28 -38 28q-10 0 -41 -18l-4 4q6 10 16 16h-11q-14 0 -25.5 -11.5t-16.5 -14.5v7q3 6 9 17q-7 -2 -18 -6q-3 -2 -14 -23t-11 -35.5t12.5 -50.5t30.5 -81t18 -63q0 -19 -4 -23l-3 2q-3 24 -13 70l-37 102q-9 23 -9 43.5t20 58.5 q-35 -19 -35 -32q0 -62 32 -147l11 -31q4 -17 4 -37t-1 -22q-7 34 -21 88q-39 111 -39 119.5t8 38.5q-23 -10 -23 -53q0 -12 23.5 -90t23.5 -121h112q3 17 3 40t-9 55t-15 56q-26 58 -26 67t2 10q57 -113 57 -207q0 -10 -1 -20h23v77v-1q-3 0 -24 73q-25 82 -25 113 q0 9 26 14q6 0 21 -9v-18q-10 -9 -16 -9t-8 1q2 1 5 7q8 0 11 3v14l-23 3q-8 -17 -8 -15.5t6.5 -27.5t27.5 -85.5t21 -97.5v-42h180q-4 9 0 33q-19 -8 -34 -8t-16 1t-4 6q6 8 21 7t28 -3q1 31 -1 36q-4 -13 -28 -13t-17 3q-7 1 -10 5q0 -11 -3 -16q0 3 -4 5l-2 37l15 70 q-15 7 -23 20l9 2q9 -7 22 -23l-15 -62q3 -11 3 -22q6 1 10 4q-6 0 -8 2q1 2 4 7l30 2q8 0 26 -5v62l-6 58q0 53 35 53q18 0 18 -15q0 -5 -8 -9q0 16 -3 21l-14 -3q1 -9 1 -20q0 -30 -8 -79q1 11 1 25q0 25 -4 61l-12 -41l8 -62q1 -11 1 -23q0 -36 -5 -80q8 35 23 90 q23 59 23 60v33q-3 -16 -10.5 -44.5t-20.5 -60.5q-2 1 -3 2zM541 239l-174 171l47 -150q45 -7 127 -21zM661 -133l50 13q17 0 30.5 -6.5t15.5 -6.5q39 13 56.5 13t44.5 -19q10 19 39.5 19t54.5 -16q12 6 12 13t-9 16h-373q-3 -7 -9 -18q12 5 37 5t27 -1q27 -12 24 -12z M531 132v5l-96 3v-5zM588 8q-4 14 -11 42q-10 -16 -14 -28q11 -4 25 -14zM544 -62l37 -16l10 19q-18 17 -28 17q-35 0 -65.5 -55t-47.5 -55q-32 0 -32 33q0 22 28 22q7 0 21 -8l17 41l-70 45q0 18 -2 47q-1 4 -6.5 12t-5.5 11q0 18 25 18q9 16 9 38t-14 67l-64 208v-536h190 q24 43 37 69zM440 104v-10h71q8 0 9 10h-80zM594 -26v20q-19 14 -34 22v-21q17 -8 34 -21zM591 -50v18q-11 7 -31 16v-9q7 -7 31 -25zM506 -12q22 40 22 49.5t-8 51.5h-83q-1 -8 -5 -20q19 -11 70 -44q-3 -16 -10 -48q7 5 14 11zM428 65q-20 0 -20 -14v-8q14 -9 42 -9l29 1 q-46 30 -51 30zM557 -36l-5 27q0 20 9 50t9 19q0 2 -9 29l-96 -205q-8 -15 -19 -15q-3 5 -12 15q1 2 4 6l10 -13q3 3 7 3v18l-10 3q-19 0 -19 -22.5t21 -22.5q12 0 48 54.5t55 54.5q4 0 7 -1zM489 -55l5 13q-10 5 -5 33t5 30h-10l-5 -30v-43q-7 0 10 -3zM473 23h-15v-47 q0 -11 15 -26v73zM452 26q-1 0 -18 -3q3 -5 3 -29t15 -30v62zM425 29q-7 -7 -7 -24.5t10 -22.5q0 32 -3 47zM1004 1146h-5v7h5v-7zM1003 1139q0 5 25 -55q21 -53 21 -100v-11q0 23 -2 32q-41 135 -44 135v-1zM935 1206q0 -49 25 -123.5t29 -96.5l-54 161v59zM851 1165l-29 4 l-13 -2q-7 0 -37 14q9 -2 37.5 -0.5t41.5 -15.5zM835 1147l-31 3v4l31 -2v-5zM853 1125l-17 -5h-45l-6 6q14 20 38 20t30 -12v-9zM908 987q-7 0 -30 -3q-2 6 -9 21l13 -19q6 0 14 7q0 7 -4 15q4 -9 16 -21zM885 952q0 -10 12 -10t21 13q3 -24 -19 -24l-22 14q1 10 13 22 q-5 -10 -5 -15zM787 1041q-6 0 -25 9q-5 0 30 -6q4 5 3 11l3 -11zM828 968v12q0 -2 10 -12h-10zM809 965l16 2q-9 -4 -13 -19l12 -12q5 0 13 8q-3 -9 -11 -13q-9 5 -17 17v17zM729 1003l29 7q13 0 39 -10q-19 3 -68 3zM780 982h-26v5h26v-5zM625 1236q0 -38 -58.5 -120.5 t-55.5 -103.5q-4 32 -59 109t-55 107.5t17 47t36 16.5q44 0 54 -35q0 -10 3 -33h6q5 68 60 68q23 0 37.5 -18.5t14.5 -37.5zM1242 -48q0 -59 -53 -59q-40 0 -61 68v-2q-10 -66 -59.5 -66t-49.5 61q0 28 54 108.5t57 107.5q-3 -30 54.5 -104.5t57.5 -113.5zM871 169h-28v5h28 v-5zM894 153l-31 -4q-19 0 -38 10q34 -5 38 -5t29 5q0 -6 2 -6zM812 205q0 13 -19 17h13q4 -11 13 -33q-5 3 -13 5q6 6 6 11zM791 217l-3 -11l-4 2l4 9h3zM861 108l-25 5q-6 0 -8 -3q1 4 3 8h10q1 0 20 -10zM899 48l-9 -9l-3 2l9 9zM760 148q-5 9 -19 23q2 2 7 4 q6 -17 12 -27zM767 27q5 10 31 10t40 -4q-6 -15 -37 -30q3 0 -8 3q5 -2 11 2q-13 2 -37 19zM851 -23l-49 -3q-26 0 -29 23q12 -8 38.5 -8.5t39.5 -11.5zM690 -6v-20q1 26 -20 87t-25 83q1 -3 15 -38q19 -45 31 -94q-1 -8 -1 -18zM846 1130l-2 3l-6 -3v-4zM806 1125 q-1 3 -1.5 5t-1.5 5q-4 -3 -11 -6h-1q0 -1 15 -4zM830 31h-10q1 -4 3 -7z" />
+<glyph unicode="&#x1f0bf;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f0c0;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f0c1;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM321 1252h-79v25h24l-16 46h-74l-16 -46h24v-25h-79v25h25 l54 155h-24v23h106v-23h-24l54 -155h25v-25zM1490 63l-74 -100l-75 100l75 100zM942 595l-128 -172l-128 172l128 171zM287 1101l-75 -100l-74 100l74 100zM1523 -113h-25l-54 -155h24v-23h-106v23h24l-54 155h-25v25h79v-25h-24l16 -46h74l16 46h-24v25h79v-25zM243 1347 l-28 85h-4l-28 -85h60zM1445 -183h-60l28 -85h4z" />
+<glyph unicode="&#x1f0c2;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM942 1159l-128 -171l-128 171l128 171zM146 1252q0 20 10 45 t44 50t40.5 34.5t6.5 19.5q0 33 -33 33q-36 0 -36 -48v-8h-27v9q0 71 61 71q64 0 64 -55q0 -17 -9 -29t-48.5 -43t-42.5 -53h76l1 46h24l-1 -72h-130zM1490 63l-74 -100l-75 100l75 100zM287 1101l-75 -100l-74 100l74 100zM1482 -88q0 -20 -10 -45t-44 -50t-40.5 -34.5 t-6.5 -19.5q0 -33 33 -33q36 0 36 48v8h27v-9q0 -71 -61 -71q-64 0 -64 55q0 17 9 29t48.5 43t42.5 53h-76l-1 -46h-24l1 72h130zM942 5l-128 -171l-128 171l128 171z" />
+<glyph unicode="&#x1f0c3;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM942 1159l-128 -171l-128 171l128 171zM214 1272q39 0 39 37 q0 36 -55 36h-5v25q51 0 51 32t-30 32q-34 0 -35 -40h-28q0 34 17.5 49t42.5 15q61 0 61 -54q0 -33 -28 -46q38 -11 38 -44.5t-21 -49.5t-49 -16q-71 0 -71 72h28q1 -48 45 -48zM1490 63l-74 -100l-75 100l75 100zM942 595l-128 -172l-128 172l128 171zM287 1101l-75 -100 l-74 100l74 100zM1414 -108q-39 0 -39 -37q0 -36 55 -36h5v-25q-51 0 -51 -32t30 -32q34 0 35 40h28q0 -34 -17.5 -49t-42.5 -15q-61 0 -61 54q0 33 28 46q-38 11 -38 44.5t21 49.5t49 16q71 0 71 -72h-28q-1 48 -45 48zM942 5l-128 -171l-128 171l128 171z" />
+<glyph unicode="&#x1f0c4;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1268 1159l-128 -171l-128 171l128 171zM616 1159l-128 -171 l-128 171l128 171zM282 1306h-33v-30h19v-24h-67v24h21v30h-68l-13 23l85 127h23v-126h33v-24zM1490 63l-74 -100l-75 100l75 100zM287 1101l-75 -100l-74 100l74 100zM1379 -292v126h-33v24h33v30h-19v24h67v-24h-21v-30h68l13 -23l-85 -127h-23zM1268 5l-128 -171 l-128 171l128 171zM616 5l-128 -171l-128 171l128 171zM222 1330v80l-53 -80h53zM1406 -166v-80l53 80h-53z" />
+<glyph unicode="&#x1f0c5;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1268 1159l-128 -171l-128 171l128 171zM616 1159l-128 -171 l-128 171l128 171zM281 1316q0 -68 -70 -68q-64 0 -68 68h26q5 -44 42 -44q41 0 41 43.5t-38 43.5q-25 0 -41 -24q-9 9 -20 14l7 106h109v-54h-25v27h-62l-5 -60q20 16 42 16q62 0 62 -68zM1490 63l-74 -100l-75 100l75 100zM942 595l-128 -172l-128 172l128 171zM287 1101 l-75 -100l-74 100l74 100zM1417 -108q-41 0 -41 -43.5t38 -43.5q25 0 41 24q9 -9 20 -14l-7 -106h-109v54h25v-27h62l5 60q-20 -16 -42 -16q-62 0 -62 68t70 68q64 0 68 -68h-26q-5 44 -42 44zM1268 5l-128 -171l-128 171l128 171zM616 5l-128 -171l-128 171l128 171z" />
+<glyph unicode="&#x1f0c6;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1268 1159l-128 -171l-128 171l128 171zM1268 595l-128 -172 l-128 172l128 171zM616 1159l-128 -171l-128 171l128 171zM221 1381q56 0 56 -66.5t-61 -66.5q-32 0 -51 26t-19 78q0 106 71 106q57 0 59 -63h-26q-5 39 -35 39q-41 0 -42 -76q21 23 48 23zM1490 63l-74 -100l-75 100l75 100zM287 1101l-75 -100l-74 100l74 100zM1482 -188 q0 -106 -71 -106q-57 0 -59 63h26q5 -39 35 -39q41 0 42 76q-21 -23 -48 -23q-56 0 -56 66.5t61 66.5q32 0 51 -26t19 -78zM1268 5l-128 -171l-128 171l128 171zM616 595l-128 -172l-128 172l128 171zM616 5l-128 -171l-128 171l128 171zM215 1272q37 0 37 41t-35 41 q-22 0 -43 -26q7 -56 41 -56zM1413 -108q-37 0 -37 -41t35 -41q22 0 43 26q-7 56 -41 56z" />
+<glyph unicode="&#x1f0c7;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1268 1159l-128 -171l-128 171l128 171zM1268 595l-128 -172 l-128 172l128 171zM942 848l-128 -171l-128 171l128 172zM616 1159l-128 -171l-128 171l128 171zM220 1276h23v-24h-80v24h28q5 85 52 152h-70v-27h-24v54h127v-22q-56 -67 -56 -157zM1490 63l-74 -100l-75 100l75 100zM287 1101l-75 -100l-74 100l74 100zM1479 -291h-127 v22q56 67 56 157h-23v24h80v-24h-28q-5 -85 -52 -152h70v27h24v-54zM1268 5l-128 -171l-128 171l128 171zM616 595l-128 -172l-128 172l128 171zM616 5l-128 -171l-128 171l128 171z" />
+<glyph unicode="&#x1f0c8;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1268 1159l-128 -171l-128 171l128 171zM1268 595l-128 -172 l-128 172l128 171zM942 848l-128 -171l-128 171l128 172zM616 1159l-128 -171l-128 171l128 171zM282 1307q0 -59 -70.5 -59t-70.5 59q0 37 36 51q-29 17 -29 47q0 53 64 53t64 -53q0 -30 -29 -47q35 -14 35 -51zM1490 63l-74 -100l-75 100l75 100zM287 1101l-75 -100 l-74 100l74 100zM1487 -143q0 -37 -36 -51q29 -17 29 -47q0 -53 -64 -53t-64 53q0 30 29 47q-35 14 -35 51q0 59 70.5 59t70.5 -59zM942 341l-128 -171l-128 171l128 171zM1268 5l-128 -171l-128 171l128 171zM616 595l-128 -172l-128 172l128 171zM616 5l-128 -171 l-128 171l128 171zM249 1402q0 32 -37.5 32t-37.5 -32t37.5 -32t37.5 32zM253 1308.5q0 36.5 -41.5 36.5t-41.5 -36.5t41.5 -36.5t41.5 36.5zM1458 -144.5q0 36.5 -41.5 36.5t-41.5 -36.5t41.5 -36.5t41.5 36.5zM1454 -238q0 32 -37.5 32t-37.5 -32t37.5 -32t37.5 32z" />
+<glyph unicode="&#x1f0c9;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1268 1159l-128 -171l-128 171l128 171zM1268 779l-128 -172 l-128 172l128 171zM616 1159l-128 -171l-128 171l128 171zM277 1354q0 -106 -71 -106q-56 0 -58 63h25q5 -39 36 -39q40 0 41 76q-21 -23 -47 -23q-57 0 -57 66.5t61 66.5q32 0 51 -26t19 -78zM1268 385l-128 -171l-128 171l128 172zM1490 63l-74 -100l-75 100l75 100z M942 595l-128 -172l-128 172l128 171zM287 1101l-75 -100l-74 100l74 100zM616 779l-128 -172l-128 172l128 171zM1425 -161q57 0 57 -66.5t-61 -66.5q-32 0 -51 26t-19 78q0 106 71 106q56 0 58 -63h-25q-5 39 -36 39q-40 0 -41 -76q21 23 47 23zM1268 5l-128 -171 l-128 171l128 171zM616 385l-128 -171l-128 171l128 172zM616 5l-128 -171l-128 171l128 171zM209 1434q-37 0 -37 -41t34 -41q22 0 43 26q-6 56 -40 56zM1419 -270q37 0 37 41t-34 41q-22 0 -43 -26q6 -56 40 -56z" />
+<glyph unicode="&#x1f0ca;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1268 1159l-128 -171l-128 171l128 171zM1268 779l-128 -172 l-128 172l128 171zM942 975l-128 -171l-128 171l128 171zM616 1159l-128 -171l-128 171l128 171zM314 1353q0 -105 -61.5 -105t-61.5 105t61.5 105t61.5 -105zM1268 385l-128 -171l-128 171l128 172zM191 1252h-83v24h28v154h-28v25h56v-179h27v-24zM1490 63l-74 -100 l-75 100l75 100zM287 1101l-75 -100l-74 100l74 100zM1520 -291h-56v179h-27v24h83v-24h-28v-154h28v-25zM616 779l-128 -172l-128 172l128 171zM1437 -189q0 -105 -61.5 -105t-61.5 105t61.5 105t61.5 -105zM1268 5l-128 -171l-128 171l128 171zM942 214l-128 -171 l-128 171l128 171zM616 385l-128 -171l-128 171l128 172zM616 5l-128 -171l-128 171l128 171zM285 1353q0 81 -32.5 81t-32.5 -81t32.5 -81t32.5 81zM1408 -189q0 81 -32.5 81t-32.5 -81t32.5 -81t32.5 81z" />
+<glyph unicode="&#x1f0cb;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM285 1429h-28v-110q0 -80 -71 -80q-46 0 -56 48l26 9 q10 -31 33 -31q37 0 37 53v111h-41v26h100v-26zM1490 63l-74 -100l-75 100l75 100zM1284 -166h-940v1496h940v-1496zM287 1101l-75 -100l-74 100l74 100zM1439 -101q-37 0 -37 -53v-111h41v-26h-100v26h28v110q0 80 71 80q46 0 56 -48l-26 -9q-10 31 -33 31zM1153 910h32 v136q7 -1 21 -7v-129h9v126q2 0 7 -5v-121h9v284q-38 24 -35 24t-38 -21q0 -75 -1 -77q-59 31 -79 80v-19q-1 -20 28 -65.5t47 -53.5v-152zM1069 1002q26 0 26 22t-19 22l-13 -3l-3 -10q0 -13 16 -18q5 4 8 10t2 6q2 -2 2 -8q0 -13 -13 -13q-8 0 -15 7l-69 208h-22 q14 -21 38 -122l10 -37q0 -4 -1 -5q-13 62 -53 164h-22q30 -61 38 -117t31 -94q13 -22 45 -19l-16 16q21 -9 30 -9zM626 1313l77 -25q5 0 32 7.5t42.5 7.5t38.5 -14t33 -14t26 7.5t30.5 7.5t29 -11.5t27.5 -11.5t27 12.5t12 30.5h-16q-10 -22 -22 -22t-23 12.5t-30 12.5 l-65 -15q-3 0 -14.5 6.5t-16 7.5t-37 1t-46 -5t-28.5 -5l-39 10h-38zM1229 829q0 -4 1.5 -9.5t1.5 -7.5q33 37 29 57zM1223 882v22h-72v-22h72zM1029 988q-39 37 -69 152q-10 40 -27 83h-19q15 -45 33 -109t25 -79q21 -43 57 -47zM1223 854v22h-75v-22h75zM981 999 q-25 36 -43.5 114.5t-34.5 109.5h-25q20 -40 59 -176zM1223 823v25h-75v-25h75zM938 1027q-14 23 -30 94t-43 104h-20q2 -10 6 -27l31 -90q19 -52 56 -81zM915 1031q8 0 -50 -31h76q-18 31 -26 31zM708 1059l30 13q6 0 4 -3q4 -7 0 -10l-40 -8q25 -87 50 -87q18 0 125 54 q18 11 26 27l-61 150q-3 -3 -18 -3q-38 0 -52 14l21 2q15 1 47 -13l-10 31h-151v-35l8 -32q15 10 23.5 10t23.5 -7l2 27q-17 0 -52 20l58 2q5 -14 5 -22l-18 -86q15 -5 17 -11l6 -12h-2q-8 11 -29 22q4 15 10 44q-16 -11 -42 0v-37l8 -34q8 -1 14 -7q-5 -2 -12 -6zM724 1152 q12 0 3 9q0 -6 -3 -9zM689 1150q9 -3 10.5 -5.5t-1.5 16.5q-3 -4 -9 -11zM1082 984h-9l-248 -320l6 -6zM661 1018h-18q-1 2 -5 6v10q2 2 6 2q0 -5 3 -13q7 2 11 6l-2 14h-20q-5 -6 -5 -14q0 -24 20 -24q12 0 31 13q5 -11 -12 -20q26 2 26 26q0 1 -9 40t-9 56v46q-8 47 -8 50 l-7 -43l13 -98q0 -25 -15 -57zM1120 904q-146 -180 -242 -310q96 112 140 168t102 142zM1223 800v17h-74v-18q27 4 51 1v-590q-9 -7 -12 -6t-9 6v584l-5 -588l16 -8q3 0 15 8v594h18zM1140 722q-80 -91 -80 -128t12.5 -57t62.5 -82v14q0 3 -26 42t-31.5 51t-5.5 32.5 t33.5 64t34.5 63.5zM1224 794h-7v-589q-32 -15 -29 -15q-7 0 -25 12v594h-12v-603q39 -16 36 -16q6 0 37 24v593zM921 905l40 -8q6 0 58 26q4 3 18 25h-14q5 0 5 -1q0 -3 -65 -12q-83 -12 -154 -12q-174 0 -257 70q24 11 68 36q4 5 10 14q6 5 16 5t17 -7q6 29 6 42l-13 100 q7 41 4 47l-62 84h439l-35 -88q17 -35 35 -104.5t21 -78.5q6 8 17 8q30 0 30 -30t-23 -35q23 -9 63 -30v105q-30 14 -54 63t-24 90q0 5 1 12q31 -65 85 -95v65q39 30 43.5 30t42.5 -35v-281q13 -9 33 -21v429h-916v-424q15 11 41 32q1 13 2 36l39 25q5 0 3 -2q-6 -3 -20 -12 l-20 -13q0 -113 -1 -115q-1 1 -31 39v-11q-1 -11 32 -50v-458h12v592q24 14 27.5 14t23.5 -14v-594h17v595q-11 7 -32 22q39 -16 34 -16l35 15q18 0 43 -28t42 -28l26 2q21 0 35.5 -13t17.5 -13l41 8q15 0 24.5 -9t23.5 -9t28 6l21 10l53 -16q4 0 15.5 8t32.5 8zM785 858 q-155 0 -277 85v-6q75 -62 177 -75l23 -6q46 -3 79 -3q124 0 194 26q-39 -8 -87 -11l-51 -5q-42 -5 -58 -5zM1260 298q4 4 4 13t-14.5 23t-22.5 28v-19q-1 -4 33 -45zM813 664q-53 72 -135 173q-7 2 -12 3l145 -182zM1120 281l-236 295l-6 -7l223 -280zM875 585 q-30 40 -56 70l-55 -73l57 -68q20 24 54 71zM759 603q0 3 -190 242q-34 43 -46 43h-1l237 -294v9zM828 511q126 -183 142 -183l6 2zM836 313q-96 0 -180 -25h8q4 0 24 5.5t42 6.5l76 6q20 2 48 2q159 0 279 -80q-93 85 -297 85zM550 515q25 33 25 73t-23 70l-47 59v-22 q55 -71 55 -98t-3 -38t-31.5 -52t-28.5 -49v-8zM440 964q3 0 -19 -11l5 -4q12 8 15 5.5t7 -5.5v-584l6 582q0 17 -14 17zM812 506q-1 2 -3 5l-254 -322q5 -5 12 -6zM968 -42l3 39l-12 103q1 2 6 23t16.5 21t15.5 -4v-12l-2 -2q-2 0 -6 4q2 2 2 8h-12v-3q0 -1 -3 -9 q-3 0 -6.5 -11t-3.5 -19.5t4.5 -31t5.5 -29.5l2 -62l-3 -37q21 -32 55 -90h241v413q-14 -8 -39 -24q0 -13 -1 -35q-36 -33 -48 -33q-80 0 -130 65q-8 9 -26 9l-24 -2q-11 0 -27 13t-27 13l-38 -8q-10 0 -20 9t-27.5 9t-31.5 -8t-21 -8l-47 16l-53 -16l-32 8q-16 0 -32.5 -9 t-24.5 -12t-24 -30h13q5 0 19 7q48 7 131 17q26 1 67 1q180 0 257 -67l-69 -36q-3 -2 -8.5 -12t-13.5 -10t-15 3q9 1 25 5v19q0 14 -16 14t-20 -3t-15 -10l-2 8q6 5 11 12q-4 0 -13 -3q-10 -8 -10 -18l17 -70v-64q0 -2 6 -22.5t6 -28.5zM910 18q-5 -6 -9 -6l7 -7q0 3 1 6.5 t1 6.5zM956 -64l3 20q0 38 -20 60q9 -19 -14 -19q-3 0 -24 8q0 -20 -3 -33q18 2 53 -17l-58 -2q0 13 -5 28l15 77q-6 5 -18 23q9 -5 28 -19q-3 -15 -12 -44q29 16 45 0v45l-5 24q-10 -1 -15 2l7 13q-4 2 -8 2q-31 -14 -27 -14q-2 0 -7 11q29 12 34 12t8 -2v16q0 12 -14 38.5 t-21.5 29.5t-15.5 3q-26 0 -119 -53q-18 -11 -31 -25l64 -153q0 5 3.5 5t51.5 -6q6 -1 15 -11l-24 -1q-17 -2 -44 12q4 -11 10 -30h148zM720 131h-1q0 3 55 35l-83 -8q27 -27 29 -27zM481 337v17h-80v-17h80zM789 -62v12q1 12 -25 76.5t-32.5 75t-32.5 36.5q16 -31 31 -93 t22 -78t21 -29h16zM481 311v20h-80v-20h80zM759 -64l-59 179q-4 13 -13.5 22t-30.5 24q24 -30 43 -109.5t36 -115.5h24zM481 283v22h-80v-22h80zM622 172h-11q33 -29 51 -88l18 -77q9 -34 24 -68h20q-23 69 -37 119q-33 114 -65 114zM481 257v20h-80v-20h80zM836 -149l80 10 q2 0 38 -5t53 -6q-11 -1 -47 11.5t-51 12.5t-36 -7.5t-29.5 -7.5t-29.5 13q-27 17 -43 17l-55 -15l-58 23q-34 0 -42 -43h16q17 23 27 23t24.5 -13t24 -13t26.5 6.5t32 6.5t34 -6.5t36 -6.5zM595 156l-27 8q-28 -5 -28 -16q0 -27 19 -27q4 0 16 5v15q-6 5 -12.5 5t-12.5 -6 q5 -5 -1 -7l-2 12q10 9 18 9t12 -9q22 -51 52 -152q8 -18 20 -54h17q-5 8 -12 21q-33 99 -33 139q0 6 1 4q12 -57 52 -164h22q-17 37 -32 101.5t-19 76.5q-18 55 -51 55h-14q6 -6 15 -16zM481 249h-14v-70q-2 -45 -4 -66v136h-12v-131q-9 1 -23 5v126h-11l1 -126v126h-14 v-279q33 -26 37.5 -26t35.5 26q0 69 1 71q19 0 41 -25l40 -47q-10 88 -78 133v147zM559 113q-29 0 -29 36q0 7 9.5 19t15.5 10l-65 32v-104q31 -16 55.5 -70t24.5 -74t-1 -21q-32 70 -84 95v-68q-15 -11 -44 -30l-43 30v288q-14 9 -42 24v-434h239l38 95q-13 31 -54 182 q-10 -10 -20 -10zM1197 1200q23 0 23 -46q0 -23 -6 -57v81l-17 17q-4 -1 -24 -15q0 -53 -4 -65v66q26 19 28 19zM1206 1105q-7 0 -22 6v60q4 3 10 8q6 -2 12 -8v-66zM820 1155q-4 -11 -21 -11t-35 8q17 17 30.5 17t25.5 -14zM830 1067q-2 3 -3 3q9 -5 3 -16q-4 1 -6 -2 q6 7 6 15zM761 1102q12 -6 17 -6t9 3q-4 -6 -17 -4l-23 3zM820 1050q-19 -2 -56 19h14q-4 -1 42 -19zM792 1033q-5 5 -27 5t-38 1l-3 6q-11 1 49 1q12 0 19 -13zM774 1019h-39v5h39v-5zM635 1155q-74 -96 -112 -160q-26 46 -116 157q64 64 116 153q35 -51 112 -150zM839 584 l-18 -24l-20 23l19 25q10 -12 19 -24zM1221 12q-64 -64 -116 -153q-35 51 -112 150q74 96 112 160q26 -46 116 -157zM901 140h-23l3 4zM910 116h-20q13 0 -39 3q-1 3 -6 9q12 -6 61 -4l4 4v-12zM862 93l-31 15h-23q-6 -9 -2 -16q-10 21 18 21q40 0 46 -20h-8zM883 56 q8 0 -23 13h11q3 0 20 -8q-4 -5 -8 -5zM854 69l-4 -10l-3 1l3 9h4zM870 14q-16 -17 -31.5 -17t-26.5 15q14 14 28 14t30 -12zM429 -1v60q7 0 22 -6v-63l-11 -8q-11 10 -11 17zM440 -31q-2 0 22 15q0 27 4 65v-66q-10 -9 -26 -22q-19 13 -24 27q1 39 5 78v-78q13 -19 19 -19z M817 1152q-1 4 -6 9q-2 -4 -3 -12zM782 1161q-2 0 -10 -9q4 -1 7 -3q3 3 3 12zM827 18q-6 -6 -9 -6l6 -7q1 3 1.5 6.5t1.5 6.5z" />
+<glyph unicode="&#x1f0cc;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM283 1267q-43 -19 -72 -19q-102 0 -102 105t102 105q34 0 72 -18 v-36h-6q-32 26 -68 26q-67 0 -67 -77t68 -77q37 0 67 26h6v-35zM1490 63l-74 -100l-75 100l75 100zM1284 -166h-940v1496h940v-1496zM287 1101l-75 -100l-74 100l74 100zM1345 -103q43 19 72 19q102 0 102 -105t-102 -105q-34 0 -72 18v36h6q32 -26 68 -26q67 0 67 77 t-68 77q-37 0 -67 -26h-6v35zM1011 1088l19 12q17 0 17 -38q10 -16 34 -45q11 0 24 -10l2 -3l-3 -5q-12 2 -45 -12q31 3 45 -13l31 -32q14 -10 45.5 -15.5t46.5 -14t45 -59.5v465h-241l83 -85q-56 -7 -82 -58q-6 -21 -30 -69v-14q3 -4 9 -4zM1000 1182h-6l-3 -36h6z M1018 1166q0 2 -9 19q1 -6 1 -13q0 -25 -16 -63q24 21 24 57zM994 1145h-4l-5 -15h5zM987 1158v30q-1 -3 -24 -61h3l1 -5l-1 -9q21 22 21 45zM940 1110q35 63 35 79t-14 25h-12q5 -21 -2 -42.5t-7 -29.5v-32zM937 1178l-16 -60q0 -10 19 -30.5t21 -25.5q5 -28 18 -57v2 q6 3 15 3q33 0 47.5 -20.5t18.5 -20.5q32 0 44 -12q-2 23 -18 23l-18 -3q-10 0 -21.5 20.5t-20.5 28.5q-20 -10 -24 -10q-15 0 -23 18q-1 14 -9 40q-4 6 -22 19t-18 28l16 60q0 21 -16 37zM984 1122h-5l-6 -25h5zM1039 1083q-24 -16 -31 -16t-18 13q11 -25 24.5 -25t24.5 16 v12zM828 1238v15h-5v-15h5zM985 1061q-1 -2 -1 -13.5t16 -28.5q0 7 -7 15q28 0 48 -8h12q-8 13 -34 17.5t-34 17.5zM835 1178q18 25 18 35.5t-9 27.5q0 -32 -9 -63zM835 1140q36 50 36 81t-22 32q7 -23 7 -40t-21 -62v-11zM909 1182q0 5 -2 17q1 -13 -26 -47.5t-31 -51.5 q-1 2 -1 4q0 20 24.5 48.5t24.5 52t-24 42.5q6 -25 6 -42.5t-17 -47t-17 -43.5t4 -23q59 70 59 91zM835 1224v8q-4 -6 -13 -18q0 -12 12 -12v11q1 8 1 11zM958 1047q0 13 -24.5 33t-24.5 31.5t10.5 34t10.5 38t-11 31.5q2 -29 -9.5 -59t-11.5 -42.5t18 -35.5t18 -37t-13 -19 h12q9 5 9 25v20q10 -16 10 -24.5t-8.5 -20.5t-13.5 -12q-20 0 -20 19q0 9 8 14q-12 -5 -12 -12q0 -29 28 -29q24 0 24 45zM828 1146v12h-5v-12h5zM1272 657q0 25 -57 118t-84 124l70 -123q24 -46 34 -73.5t31 -55.5q6 4 6 10zM825 1137v8h-5v-8h5zM1188 722l-3 -38l33 -22 v-21q0 -13 -2 -20q12 5 17 56q-12 5 -33 18v10q0 37 -2 42q-16 2 -39 26q5 25 5 34v6q-14 7 -39 23v3q0 38 -6 43l-11 -55q26 -11 44 -23v-9l-5 -36q3 -3 22 -13.5t19 -23.5zM772 899l90 -5q11 0 110 104l-5 7q-23 -12 -37 -12q-32 0 -32 33q0 17 20 26q-11 10 -30 31 q-8 1 -14.5 -7.5t-11.5 -8.5q-9 0 -30.5 31.5t-21.5 41.5l4 38q-6 17 -12 51q-1 1 -21 13l18 6v15q-38 9 -88 9h-17q-11 -20 -16.5 -62t-15.5 -70.5t-10 -36.5v-20q25 8 29 8q-7 0 12 -8q0 3 1 8l-1 13l7 -9v-9q-7 -6 -19 -6q5 -22 16 -22q7 0 11 3q4 -5 4 -14l-9 -4 q-19 -36 -19 -41q0 -22 49 -22q76 0 120 69q4 6 9 6q-20 -53 -106 -86q0 -30 2.5 -43.5t13.5 -26.5zM1209 629v31q-20 7 -33 21q2 20 1 47q-14 7 -39 25v47q-29 13 -39 25q1 15 8 57q-8 -6 -14 -7l-1 -5l4 -10q-1 -4 -12 -9q12 -46 51.5 -142.5t56.5 -96.5t17 17zM1180 600 q0 5 -37.5 71.5t-70.5 177.5q28 -123 95 -253l10 -5q2 4 3 9zM1272 543q-7 0 -32 -20h18l2 -1v-6q-9 -11 -15 -14q9 0 27 9v32zM1059 775l-48 70l-63 -73l48 -68zM1201 603l20 6q16 0 19 -32q-13 -9 -25 -9h-9q-6 6 -6 17q-22 -42 -41 -42q-8 0 -19 6q-23 -26 -26 -26 q-11 0 -19 18l9 18q-32 -25 -32 -42q0 10 6 -13q59 0 191 69q-1 14 -17.5 29.5t-26.5 15.5t-24 -15zM1164 571v6h-15v-6h15zM688 1035v12h-6v-12h6zM1272 560v2q-100 -45 -180 -67q34 0 92 21t88 44zM1156 559q-6 0 -24 11.5t-24 11.5q5 0 -12 -5q17 1 35.5 -12t27.5 -13 q20 0 25 30h-3q-13 -23 -25 -23zM1225 499q-1 2 -1 7t4 13q-23 -9 -69 -24q12 -1 23 -6q-6 -12 -15 -17q34 9 78 27h-20zM1132 552v4h-12v-4h12zM1272 492v6l-146 -53q54 1 146 47zM1096 573l-4 4l-8 -9l3 -4zM1082 582h-15q-17 -4 -31 -5q5 -5 6 -12l11 11h9q1 -8 7 -17 q5 17 13 23zM828 813l7 -3q5 0 17.5 18t14.5 24h-102q14 -52 28 -94q27 18 27 42q0 2 -3 9q3 4 11 4zM1144 478q0 10 12 15q-22 -4 -58 -16q-1 -23 19 -23q-14 0 50 17h-18q-5 4 -5 7zM1004 609q0 20 -20 20t-20 -20t20 -20t20 20zM1038 554q0 20 -20 20t-20 -20t20 -20 t20 20zM1073 502q0 20 -20 20t-20 -20t20 -20t20 20zM681 1001l3 21q0 7 -7.5 19t-7.5 19.5t3 12.5q-10 3 -26 13q2 52 38 182q0 4 -29 50h-299v-634q38 9 57 21.5t53 86.5q18 10 51 33q13 25 44 69q29 34 80 47t100 24q-1 10 -30.5 12t-29.5 24zM1103 454q0 20 -20 20 t-20 -20t20 -20t20 20zM644 887q0 20 -20 20t-20 -20t20 -20t20 20zM673 843q0 20 -20 20t-20 -20t20 -20t20 20zM880 710h-16v-157q3 -8 16 -17v174zM793 722q-7 -23 -7 -30.5t7 -23.5v54zM775 710q0 7 -3 14h-12l15 -26v12zM705 792q0 20 -20 20t-20 -20t20 -20t20 20z M823 722q-13 0 -14.5 -27.5t-1.5 -48.5q2 -5 9 -12q0 11 6 22h10q6 -11 6 -19.5t-12 -20.5l32 -51v145q-17 12 -35 12zM732 745q0 20 -20 20t-20 -20t20 -20t20 20zM764 696q0 20 -20 20t-20 -20t20 -20t20 20zM595 827v22h-6v-22h6zM793 649q0 20 -20 20t-20 -20t20 -20 t20 20zM1060 366l3 -14l-4 -1l-11 3q0 -8 -6 -20q9 3 26 14v39q-8 -15 -8 -21zM1084 387l-6 -41q-3 -20 -30 -19v-31q1 6 3 19q6 6 27 18zM821 602q0 20 -20 20t-20 -20t20 -20t20 20zM580 837v31q-1 -6 -3 -19q-6 -6 -27 -18l-6 -54l6 41q3 20 30 19zM849 553q0 20 -20 20 t-20 -20t20 -20t20 20zM568 798l-3 14l5 1l10 -3q0 8 6 20q-9 -3 -25 -14v-39q7 15 7 21zM877 506q0 20 -20 20t-20 -20t20 -20t20 20zM1039 315v22h-6v-22h6zM904 462q0 20 -20 20t-20 -20t20 -20t20 20zM936 413q0 20 -20 20t-20 -20t20 -20t20 20zM792 508q-6 10 -6 19 t12 21q-11 17 -31 51v-145q16 -12 34 -12q13 0 14.5 27t2.5 49l-9 12q-1 -11 -6 -22h-11zM965 366q0 20 -20 20t-20 -20t20 -20t20 20zM849 454q0 -8 3 -14h12q-5 8 -15 26v-12zM831 442q8 22 8 30t-8 24v-54zM761 454v157q-4 8 -17 17v-174h17zM994 315q0 20 -20 20 t-20 -20t20 -20t20 20zM1023 271q0 20 -20 20t-20 -20t20 -20t20 20zM565 710q0 20 -20 20t-20 -20t20 -20t20 20zM948 163l-3 -21q0 -7 7.5 -19t7.5 -19.5t-3 -12.5q9 -3 25 -13q-2 -52 -37 -182q0 -4 28 -50h299v634q-38 -9 -57 -21.5t-53 -86.5q-18 -10 -51 -33 q-13 -25 -43 -69q-30 -34 -81 -47t-99 -24q0 -10 30 -12t30 -24zM595 662q0 20 -20 20t-20 -20t20 -20t20 20zM630 610q0 20 -20 20t-20 -20t20 -20t20 20zM664 555q0 20 -20 20t-20 -20t20 -20t20 20zM511 710q14 0 -49 -17h18q4 -4 4 -7q0 -10 -12 -15q22 4 59 16 q0 23 -20 23zM801 351l-8 3q-5 0 -17.5 -18t-13.5 -24h102q-15 52 -29 94q-27 -18 -27 -42q0 -2 3 -9q-3 -4 -10 -4zM592 587q-5 5 -6 12l-10 -11h-9q-2 8 -8 17q-5 -17 -13 -23h15q17 4 31 5zM544 596l-3 4l-9 -9l5 -4zM502 719q-54 -1 -146 -47v-6zM508 608v4h-12v-4h12z M469 669q-12 1 -22 6q5 12 15 17q-35 -9 -78 -27h19q4 -8 -3 -20q23 9 69 24zM469 612q-20 0 -25 -30h3q13 23 25 23q6 0 24 -11.5t24 -11.5q-5 0 12 5q-17 -1 -35.5 12t-27.5 13zM537 669q-35 0 -93 -21t-88 -44v-2q100 45 181 67zM946 117v12h-6v-12h6zM480 587v6h-15v-6 h15zM427 561l-19 -6q-17 0 -20 32q13 9 26 9h9q5 -6 6 -17q21 42 40 42q8 0 20 -6q22 26 25 26q11 0 20 -18l-9 -18q31 25 31 42q0 -10 -6 13q-59 0 -190 -69q0 -14 16.5 -29.5t26.5 -15.5t24 15zM680 392l-48 68l-63 -71l48 -70zM356 621h1q6 0 31 20h-18l-1 1v6 q8 11 15 14q-10 0 -28 -9v-32zM556 315q-28 123 -94 253l-11 5q-2 -8 -2 -9q0 -7 37 -72q37 -66 70 -177zM544 313q-12 46 -51.5 142.5t-56 96.5t-16.5 -17v-31q19 -7 33 -21q-3 -20 -2 -47q14 -7 39 -25v-47q29 -13 39 -25q-1 -15 -7 -57q7 6 13 7l2 5l-5 10q1 4 12 9z M819 24l-5 -38q6 -17 12 -51q1 -1 21 -13l-18 -6v-15q38 -9 89 -9h16q11 20 16.5 62t15.5 70.5t10 36.5v20q-25 -8 -28 -8q6 0 -12 8q-1 -3 -2 -8l2 -13l-8 9v9q7 6 20 6q-6 22 -17 22q-7 0 -10 -3q-5 5 -5 14l9 4q20 36 20 41q0 22 -50 22q-76 0 -120 -69q-4 -6 -9 -6 q20 53 107 86q-1 30 -3.5 43.5t-13.5 26.5l-90 5q-11 0 -109 -104l4 -7q23 12 38 12q31 0 31 -33q0 -17 -19 -26l30 -31q7 -1 13.5 7.5t11.5 8.5q9 0 31 -31.5t22 -41.5zM441 442l3 38q-12 7 -33 22v21q0 13 1 20q-12 -5 -16 -56q11 -5 33 -18v-10q0 -37 1 -42q16 -2 39 -26 q-4 -25 -4 -34v-6q13 -7 39 -23v-3q0 -38 6 -43l10 55q-26 11 -43 23v9l4 36q-3 3 -21.5 13.5t-18.5 23.5zM808 19v8h-4v-8h4zM357 507q0 -25 56.5 -118t84.5 -124q-25 41 -60 105t-45 91.5t-30 55.5q-6 -4 -6 -10zM805 6v12h-4v-12h4zM718.5 8q11.5 30 11.5 42.5t-18 35.5 t-18 37t14 19h-12q-9 -5 -9 -25v-20q-11 16 -11 24.5t8.5 20.5t14.5 12q19 0 19 -19q0 -9 -7 -14q12 5 12 12q0 29 -29 29q-24 0 -24 -45q0 -13 25 -33t25 -31.5t-10.5 -34t-10.5 -38t10 -31.5q-2 29 9.5 59zM795 -38q-2 -8 -2 -22v-8q4 6 14 18q-1 12 -12 12zM765.5 6.5 q17.5 29.5 17.5 43.5t-5 23q-58 -70 -58 -91q0 -5 1 -17q-1 13 26 47.5t31 51.5q1 -2 1.5 -13t-24.5 -39.5t-25 -52t24 -42.5q-6 25 -6 42.5t17.5 47zM793 24q-36 -50 -36 -81t23 -32q-8 23 -8 40t21 62v11zM793 -14q-18 -25 -18 -35.5t9 -27.5q0 32 9 63zM643 103 q1 2 1.5 13.5t-16.5 28.5q0 -7 8 -15q-29 0 -48 8h-12q7 -13 33 -17.5t34 -17.5zM805 -89v15h-4v-15h4zM639 84q-12 25 -25.5 25t-24.5 -16v-12q24 16 31 16t19 -13zM655 67h-4l-6 -25h4zM543 184l18 3q9 0 20.5 -20.5t21.5 -28.5q19 10 24 10q14 0 22 -18q1 -14 9 -40 q4 -6 22.5 -19t18.5 -26t-8.5 -32t-8.5 -35t17 -32l-5 20q-3 12 -3 21.5t8.5 28.5t8.5 29.5t-19.5 31t-21.5 25.5q-5 28 -18 57v-2q-6 -3 -15 -3q-33 0 -47.5 20.5t-18.5 20.5q-32 0 -43 12q1 -23 18 -23zM688 22v32q-34 -63 -34 -79t13 -25h12q-5 21 2 42.5t7 29.5zM642 6 v-30q0 3 24 61h-3l-2 5l2 9q-21 -22 -21 -45zM643 34h-4l-5 -15h5zM610 -2q0 -2 9 -19q-1 6 -1 13q0 25 16 63q-24 -21 -24 -57zM637 18h-6l-3 -36h6zM618 76q-5 0 -10.5 -6t-9.5 -6q-16 0 -16 38q-11 16 -35 45q-11 0 -24 10l-1 3l3 5q11 -2 45 12q-32 -3 -46 13l-31 32 q-14 10 -45.5 15.5t-46.5 14t-45 59.5v-465h241l-83 85q56 7 83 58q5 21 30 69v14q-4 4 -9 4zM721 1212h-34q25 9 33 9q64 0 63 -39q-16 30 -62 30zM712 1140q-13 36 -13 45.5t4 13.5h11q16 -11 51 -30v-12q-5 -7 -15 -14l1 12q-8 -5 -31 -7zM1159 714l-10 -4v12zM1029 773 l-28 -31l-22 31l28 33zM846 830q-12 0 -12 12h12v-12zM635 1155q-74 -96 -112 -160q-26 46 -116 157q64 64 117 153q34 -51 111 -150zM807 830v12l7 7q8 -4 8 -9v-4l-5 -6h-10zM778 846q6 3 12 3h3v-16l-12 -3q-1 5 -3 16zM805 804q-4 -2 -10 -7l-5 16h12zM989 609 q0 -5 -5 -5t-5 5t5 5t5 -5zM1023 554q0 -5 -5 -5t-5 5t5 5t5 -5zM1058 502q0 -5 -5 -5t-5 5t5 5t5 -5zM1088 454q0 -5 -5 -5t-5 5t5 5t5 -5zM831 715q10 -10 10 -22.5t-13 -19.5q-8 15 -8 25.5t11 16.5zM629 887q0 -5 -5 -5t-5 5t5 5t5 -5zM658 843q0 -5 -5 -5t-5 5t5 5 t5 -5zM690 792q0 -5 -5 -5t-5 5t5 5t5 -5zM717 745q0 -5 -5 -5t-5 5t5 5t5 -5zM749 696q0 -5 -5 -5t-5 5t5 5t5 -5zM778 649q0 -5 -5 -5t-5 5t5 5t5 -5zM806 602q0 -5 -5 -5t-5 5t5 5t5 -5zM834 553q0 -5 -5 -5t-5 5t5 5t5 -5zM862 506q0 -5 -5 -5t-5 5t5 5t5 -5zM889 462 q0 -5 -5 -5t-5 5t5 5t5 -5zM921 413q0 -5 -5 -5t-5 5t5 5t5 -5zM950 366q0 -5 -5 -5t-5 5t5 5t5 -5zM979 315q0 -5 -5 -5t-5 5t5 5t5 -5zM1008 271q0 -5 -5 -5t-5 5t5 5t5 -5zM797 491q7 -15 7 -26t-10 -16q-11 9 -11 22t14 20zM550 710q0 -5 -5 -5t-5 5t5 5t5 -5zM580 662 q0 -5 -5 -5t-5 5t5 5t5 -5zM615 610q0 -5 -5 -5t-5 5t5 5t5 -5zM649 555q0 -5 -5 -5t-5 5t5 5t5 -5zM838 351h-12l-3 9q4 2 11 7zM850 318q-6 -3 -12 -3h-3v16l12 3q1 -5 3 -16zM807 324v4l4 6h11v-12l-8 -7q-7 4 -7 9zM1222 12q-65 -64 -117 -153q-35 51 -112 150 q75 96 112 160q26 -46 117 -157zM783 322v12q11 0 12 -12h-12zM649 391l-28 -33l-22 33l28 31zM480 442l-11 8l11 4v-12zM916 24q14 -36 14 -45.5t-5 -13.5h-10q-17 11 -51 30v12q4 7 15 14l-2 -12q8 5 32 7zM909 -57q-65 0 -63 39q15 -30 61 -30h35q-26 -9 -33 -9z M736 1173v5l-10 4l-2 -4zM736 1161l-7 5l-3 -8l3 -4zM903 6l-3 4l-8 -7l8 -5zM904 -14l-12 5v-5l11 -4z" />
+<glyph unicode="&#x1f0cd;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM316 1353q0 -88 -82 -103q18 -11 26.5 -11t22.5 4l-13 -32 q-3 -1 -13 -1.5t-34 11t-36.5 11.5t-22.5 -9l-11 17q10 10 20 15q-66 25 -66 99q0 46 29 75t75 29t75.5 -29.5t29.5 -75.5zM1490 63l-74 -100l-75 100l75 100zM1284 -166h-940v1496h940v-1496zM287 1101l-75 -100l-74 100l74 100zM1521 -190q0 -46 -29 -75t-75 -29 t-75.5 29.5t-29.5 75.5q0 88 82 103q-18 11 -26.5 11t-22.5 -4l13 32q3 1 13 1.5t34 -11t36.5 -11.5t22.5 9l11 -17q-10 -10 -20 -15q66 -25 66 -99zM1272 1318h-91q-29 -62 -29 -94.5t11 -58.5q14 -20 28 -60l-34 -25q-26 -19 -26 -34.5t49 -54.5l92 -73v400zM1176 1115 q-35 79 -35 102t24 98h-155q14 -25 44 -50q3 15 10 43q6 -15 13 -52q53 54 60 54t5 -2q1 -6 -58 -65q17 -4 50 -14h-50q15 -64 84 -111q-11 -1 -44 19t-44.5 43.5t-18.5 56.5q-24 12 -41 25.5t-42 52.5h-25q1 -28 69.5 -112t117.5 -118zM889 1315v-9q13 -9 31 -17 q-8 27 -19 26h-12zM858 1309q0 -14 30 -31t43 -17q-6 15 -30.5 29t-27.5 25h-12zM1215 890q-7 15 -14 17q-52 0 -84.5 12t-69.5 69q-14 22 -21 60q0 11 -3 28l5 4q3 1 5 -2q22 -123 96 -151q33 -13 57 -8q-9 12 -25 14.5t-25 8.5q-39 24 -54 54q-7 26 -26 73q-4 7 -53 56 v-43v-11q0 -58 37 -116q5 -8 29 -33q3 -3 34.5 -18t44.5 -14h67zM826 1315h-10q-47 -59 -45 -62q26 21 55 62zM793 1315q-3 -6 -18 -25.5t-15 -26.5t2 -10q6 29 43 62h-12zM761 1315q-14 -13 -14 -23t7 -21q10 16 25 44h-18zM984 1147q0 25 -38 84q-15 24 -33.5 30t-50.5 24 q-7 12 -22 31q-6 -22 -41.5 -53t-35.5 -45q0 -27 2 -81.5t73 -141.5q19 -1 38.5 -1t47.5 19l60 42v92zM753 982q34 -9 98.5 -9t150.5 14l-11 54l-46 -31q-48 -27 -79 -27q-13 0 -33 4q-13 22 -29 38zM1033 941l-40 8q-11 0 -27 -11.5t-23 -11.5l-47 10q-15 0 -24 -9t-21 -9 l-50 16l-41 -16q-17 0 -36 13t-15 13q-7 0 -30 -22q5 -2 6 -6q14 0 27.5 -4t87 -7t47.5 -3q110 0 197 26q-6 9 -11 13zM902 845l-103 -5q-60 0 -116 11t-63.5 14t-12.5 3t-15 -9q100 -30 188 -30l57 3q24 0 31 -5l292 48q-40 6 -45.5 6t-93.5 -18t-119 -18zM597 939l27 6 q-2 -27 -30 -27q-11 0 -12 1q12 0 34 20q-22 -5 -24 -5h-18q-15 1 -23 1q12 0 28 -5q-5 -3 -14 -3q8 0 12 -5q-17 -3 -42 -2q0 -6 -3 -9q11 1 27 -22t21 -26q25 14 53 32q6 11 5 37l-3 32q3 39 29 91.5t48 104.5q2 53 25 158h-381v-472l102 -56q0 120 17 120q8 0 9 -1 q-7 -3 -14 -2l15 -5q5 -3 4 -6q17 -3 39 -21q3 -7 2 -43q28 17 41 30l-32 42q-15 0 -41 4q6 1 18 6q-5 12 -29 12q-39 0 -39 -29q0 -14 1 -13q-5 0 -6 2q-11 30 -11 26q0 5 10.5 17.5t32 12.5t30.5 -2q-13 20 -21 20l-9 -3q-8 0 -8 15q0 -4 -4 -9q-3 2 -3 10 q-10 -10 -12 -10q-16 0 -16 17q0 8 13 10q-10 0 -21 5q3 3 16 2q-11 11 -11 17.5t5 10.5h17q3 -4 9 -10q1 8 5 21q5 -15 5 -24q5 11 12 11q13 0 13 -12q0 -3 -8 -16q10 0 13 -5q-6 -3 -18 -2q10 -4 14 -22q24 -17 29 -37q16 13 44 13zM283 1353q0 77 -71.5 77t-71.5 -77 t71.5 -77t71.5 77zM1262 428l-21 49q0 3 11 21q13 23 13 36t-13 34t-13 25.5t10 17.5t16 31q0 17 -37 50q-72 64 -138 76q-13 0 -41 3l158 107h-11q-20 2 -49.5 -21.5t-63.5 -44.5l-101 -65q-155 -104 -162 -104t-36 8l39 173h-12l-30 -128v125h-7l-18 -165l-156 44 q13 -12 17 -19l55 -19q177 -45 276 -53q33 -59 58.5 -94.5t61.5 -57.5q8 -7 22 -17l172 -87v75zM477 1002h12q2 5 3 12q-11 3 -12 3q-3 -5 -3 -15zM1167 343v13h-11q-16 0 -41 -12q10 0 27.5 -0.5t24.5 -0.5zM1122 330q-6 5 -9 5t-3 -4q3 -2 3 -6h54l3 12h-47q1 -5 -1 -7z M455 1005q0 15 -15 15q-3 -6 3 -18q5 1 12 3zM511 949l-9 9l-2 -3l9 -9zM1020 424l6 17q0 1 -9 19q-7 -6 -12 -17q9 -9 15 -19zM1110 308h60q-2 4 -6 8q-35 -2 -54 0v-8zM489 978h-17l2 -15l15 3v12zM450 993q0 -7 15 -15l6 6v12q-6 3 -14 6q-7 -2 -7 -9zM523 916v9l-11 22 q1 -10 -4 -17q6 -6 15 -14zM1193 272q-3 -10 -17 -23q9 2 10 1q-4 -4 -20 -14q28 2 27 36zM452 986h-12l-2 -15l14 -3q5 9 0 18zM1063 318l31 -34q14 -15 23 -15t20.5 3.5t17.5 3.5q-15 4 -42 17q-12 28 -9 47q-16 -8 -41 -22zM467 879h31q5 -8 13 -7q-3 3 -3 9 q-16 3 -41 19v-21zM437 912q0 3 4 -10q7 17 29 36q-7 -1 -20 -10t-13 -16zM1179 188q-2 3 -4 3t-13 -9q3 -3 3 -9h13q1 5 5 12q3 1 7 4l3 12l-12 3q1 -5 -2 -16zM1125 228q-4 16 -12 32q2 3 10 3q-12 6 -21 6q9 -13 23 -41zM1186 152l16 3v14q-10 5 -16 6l-5 -9q0 3 5 -14z M464 865q2 -4 24 -4t22 -3t4 -3t7 4l-3 9q-20 1 -54 -3zM1129 220v7h-4v-7h4zM617 717l7 18q0 6 -7 18q-12 -12 -12 -17q0 5 12 -19zM1136 200q15 -14 14.5 -14t11.5 3v12q-24 1 -26 -1zM521 851q-13 -2 -54 0l-3 -14h41q1 3 4 8q4 -8 9 -8zM1159 157q5 10 0 21 q-4 -2 -17 -9v-11q1 -1 17 -1zM473 811l32 6q1 2 4 7l6 -5q6 0 6 3v9h-55q-2 -16 -2 -17zM374 771l21 -61q0 -3 -9 -20q-15 -28 -15 -40t4.5 -22t13.5 -23.5t9 -17t-14.5 -24.5t-14.5 -23q0 -27 61 -76q33 -27 58 -36.5t50 -16.5q17 -1 46 -5l-155 -107q19 0 23 3l287 188 q72 46 78.5 46t29.5 -7l-36 -173h17l28 136l2 -28q-7 -42 -11 -108h21q0 56 13 162l134 -34q1 4 3 10q-195 64 -332 69q-13 28 -42 77q-73 97 -270 181v-50zM1345 -189q0 -77 71.5 -77t71.5 77t-71.5 77t-71.5 -77zM1094 240l-31 -2q-18 0 -37 4q21 3 59 3q-10 0 -12 2 q10 3 26 13q-27 33 -43 49l-64 -44q0 -25 -9 -104q-6 -33 -35.5 -93.5t-42 -92.5t-13 -68.5t-16.5 -60.5h399v493l-99 48v-66q0 -18 -7 -31q-42 13 -54 10q5 -5 6 -9q22 -4 46 -13q1 3 2 5q3 -9 -3 -19l-13 8h-9q0 -8 1 -7q-19 -2 -27 -7q16 -12 30 -12q35 0 40 47 q11 -13 11 -27q0 -36 -43 -36q-13 0 -27 5q9 -15 13 -25l13 2q6 0 12 -8q0 9 5 18q2 -7 2 -23q5 10 12 10q13 0 13 -9t-5 -13q11 0 21 -5q-6 -3 -18 -2q10 -7 10 -20t-13 -13q-4 0 -13 4q-1 5 -3 9q-2 -7 -6 -19q-6 11 -6 16q2 -10 -18 -10q-14 0 -14 17q0 10 13 15 q-14 0 -19 3q10 3 19 2q-11 -2 -14.5 5.5t0.5 16.5q-17 16 -24 40q-25 -18 -33 -18h-64v11q3 15 25 15t33 -4q-12 -3 -49 -2q0 -9 -3 -12l56 -3q13 0 20 7zM471 299l44 -6q3 0 53 11q107 23 181 26q17 2 53 4q57 3 70 3h4l147 -28q11 0 16 9q-25 9 -51 16q-16 1 -50 6 t-138.5 5t-328.5 -46zM599 236q33 -8 44 -8t22.5 11.5t23.5 11.5t24 -8t24.5 -8t19.5 9.5t25 9.5t29.5 -8t15 -8t18 8t32 8t26 -7t22.5 -17l34 31q-63 11 -137 11l-163 -11q-24 -6 -69 -13q6 -7 9 -12zM774 186q23 0 53 -37l57 46l-92 9q-53 0 -158 -19q7 -19 14 -54 q67 55 126 55zM647 111q3 -27 3.5 -55t5.5 -53q21 -54 42 -80q6 -8 47 -27t46 -48q9 30 44.5 52t35.5 61q0 77 -24.5 133.5t-47.5 76.5q-7 7 -26.5 7t-34.5 -5.5t-53 -29t-38 -32.5zM883 -130v31q-17 -26 -30 -52h20q10 29 10 21zM862 -92l-35 -23q-21 -16 -18 -37q4 2 11 6 zM642 55q0 86 -42 151q-53 82 -151 82q-4 0 -14 -1.5t-13 -1.5q3 -15 21.5 -16.5t34.5 -2.5q32 -8 50 -15.5t35 -30.5q45 -60 45 -121q0 -13 -1 -15q-8 20 -9 33q-5 48 -50 97q-40 42 -85 42q-6 0 -13 -1q19 -14 56 -35q33 -11 45 -32.5t22 -55.5q0 -6 2 -14q29 -34 67 -92 v29zM773 -151v17q0 8 -30.5 24.5t-36.5 20.5q0 -14 28 -32.5t29 -29.5h10zM747 -151v9l-31 19q0 -26 31 -28zM684 -154v9q-23 52 -48 84q-61 79 -102.5 110.5t-38 31.5t-37.5 -27q32 -45 32 -102t-24 -106h160q-22 38 -46 56q-1 -16 -9 -43q-6 19 -11 55q-23 -23 -66 -60 l-4 4q2 11 29 37t28 28q-30 9 -49 21q11 3 49 -1v9q-22 67 -81 96l17 2q35 -17 64.5 -53t29.5 -66q19 -9 37 -23q42 -34 42 -62h28zM500 131q0 17 -144 125v-410h91q27 52 27 110t-32 97q58 45 58 78zM852 1228q7 0 15 -0.5t19.5 0.5t33.5 1q1 -5 6 -9q-12 2 -37 4t-37 4z M934 1175q-15 -8 -25.5 -8t-45.5 13q3 6 42 19l-13 7h17q8 0 25 -17v-14zM885 1114l-4 -10l-3 1l3 9h4zM837 1181q0 -22 -14 -57v-11q3 0 7 -4l14 8q4 0 13.5 -7t13.5 -8q-15 -1 -25 2q-3 -7 1 -16l-31 22q2 18 13 60q2 -1 -18 -1t-43 11v20q17 8 23 8h19l-23 -6 q13 -1 42 -5q-9 24 -24 25.5t-31 2.5q13 7 25 7q38 0 38 -51zM811 1064l30 -2q5 0 42 8v-21q-23 8 -37 8t-32 -3q-3 3 -3 10zM868 1040q-12 -7 -18.5 -7t-20.5 7q18 -3 39 0zM862 1019l-25 3v4l25 -2v-5zM1247.5 434.5q1.5 -6.5 1.5 -15t-6 -32.5q-20 4 -63 28l-51 28v302 q18 -5 69 -37.5t51 -58t-23 -51.5q23 -32 23 -55.5t-10.5 -48t-10.5 -17.5q0 -2 9 -19t10.5 -23.5zM1089 665l-63 -71l-48 68l63 73zM635 1155q-74 -96 -112 -160q-26 46 -116 157q64 64 117 153q34 -51 111 -150zM920 625q-2 0 -26 6.5t-42 7.5l96 64q-1 -17 -1 -36.5 t1 -41.5h-28zM861 495h-4v9h4v-9zM685 552h34q-3 0 -3 -1q0 -2 63 -11l-93 -67l-5 4q4 59 4 75zM1222 12q-65 -64 -117 -153q-35 51 -112 150q75 96 112 160q26 -46 117 -157zM650 502l-63 -73l-48 70l63 71zM385 661l21 47q0 2 -8 18q-13 24 -13 42t6 30h8q8 0 108 -58 v-300h-10l-25 14q-87 50 -87 80q0 16 21 53l-21 42v32zM792 145h-21v5h21v-5zM766 129q14 7 19.5 7t19.5 -7q-17 4 -39 0zM776 112q42 0 45 -1q-5 -2 -11 -6q-13 5 -33 1t-27 2v15q16 -11 26 -11zM779 55q-5 10 -13.5 10t-14.5 -10q-1 5 3.5 10.5t16 5.5t23.5 -9l3 -7h-18z M858 -59l-29 -4q-32 0 -32 64q0 11 13 58q-23 25 -23 22q9 -3 31 -19q-4 -21 -13 -63l29 4q12 0 29 -12v-19q-10 -5 -37 -10q8 0 13 3q-2 5 -31 8q1 -10 17 -25q12 1 33 -7zM698 -3q17 6 29.5 6t40.5 -11q0 -5 -39 -22q2 -3 13 -3q-39 -6 -44 30zM779 -60l-26 2l-20 -2 q-14 0 -22 12q4 -1 14 -4q18 0 51 -2zM928 1178v12l-10 -12h10zM889 1190q-6 0 -18 -7q8 -2 22 -7q-4 2 -4 14zM827 1177v13h-5v-13h5zM792 1178q-7 7 -8 14q-3 -4 -8 -12zM1059 663l-22 33l-28 -33l22 -31zM925 638l6 19q0 5 -6 18q-12 -12 -12 -17q0 4 12 -20zM712 507 l6 19q0 3 -6 15q-12 -12 -12 -14q0 5 12 -20zM619 501l-22 31l-28 -31l22 -33zM853 -20v9h-4v-9h4zM849 -32v4h-7v-4h7zM806 -6q3 0 3 -12q3 5 9 12h-12zM763 -12q-8 3 -20 9l2 -15q7 0 18 6zM706 -6v-12q3 5 10 12h-10zM726 -30v5h-10v-5h10z" />
+<glyph unicode="&#x1f0ce;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM302 1252h-82v25h22l-64 81l66 71h-24v26h80v-26h-22l-62 -71 l64 -81h22v-25zM203 1429h-25v-152h23v-25h-80v25h25v152h-25v26h82v-26zM1490 63l-74 -100l-75 100l75 100zM1284 -166h-940v1496h940v-1496zM287 1101l-75 -100l-74 100l74 100zM1507 -291h-82v26h25v152h-23v25h80v-25h-25v-152h25v-26zM1408 -265v-26h-80v26h22l62 71 l-64 81h-22v25h82v-25h-22l64 -81l-66 -71h24zM1114 1237q-7 -51 -7 -58.5t3.5 -39.5t3.5 -47q6 44 59 57v30q-63 30 -59 58zM1234 1228q0 5 -10 14l-3 -367q2 -7 7 -12zM1112 1056q-13 44 -13 95t13 131q-42 -68 -42 -129t42 -107v10zM1192 874v368q-8 -10 -8 -14l-3 -348 q4 -2 11 -6zM1047 1170l21 -143q0 -76 -42 -108l133 -37h15v256h-16q-40 -36 -40 -67q0 -3 4 -22.5t5 -25.5q-62 60 -62 145q0 34 19 77.5t45 57.5q-11 -34 -11 -47.5t17.5 -36t37.5 -23.5q0 30 3 37q15 28 33 28q2 0 29 -23v-377q2 0 36 -8v465h-169q-58 -96 -58 -148z M886 1292l12 3q4 0 4 -6q-3 -3 -11 -3q24 -17 43.5 -17t30.5 5q-2 5 -8 11q8 5 24 5q-12 0 18 -10q-2 -3 -8 -8q6 -5 6 -8q34 -6 47 -6t18 1l32 59h-424q4 -23 20 -23q-5 11 -3 16q-3 0 10 -6l8 8q2 -2 2 -10q9 2 10 0q-1 -6 -5 -7q27 -6 35.5 -6t27.5 5q-2 7 -6 11h14l5 5 h6q5 -3 15 -10q0 -3 -5 -8q23 -11 31 -11t17 1.5t12 1.5q-6 10 -3 15q9 2 25 1v-9zM724 1274l-19 10h-17q7 -10 17 -28l192 -28q20 -3 41 -5.5t52.5 -8.5t34.5 -5h13q4 12 14 36q-28 -5 -36 -5t-24 10.5t-18 10.5l-40 -11q-18 0 -24.5 3t-18.5 12t-15 9l-40 -11 q-13 0 -29 9.5t-19 9.5l-46 -8h-18zM870 944l30 11q6 0 4 -2q-9 -6 -26 -15q13 -7 22.5 -7t33.5 16l4 -4q-6 -5 -17 -13h2q73 0 73 81q0 32 -18 86q-1 7 3 9q1 -2 4 -7q25 -92 25 -104.5t-16.5 -39t-39.5 -34.5h14q13 -1 28 13q30 29 30 99q0 15 -1 32v2q14 -25 14 -52 q0 -55 -36 -88q59 20 59 94q0 -3 -29 135h-20v-22q3 -12 3 -38q-9 10 -13 36.5t-4 28.5h-29q17 -15 2 -36q-4 14 -10 41q-16 0 -28 3q1 -6 -7 -10q1 11 -10 13l-20 5v-30l36 -133q0 -23 -9 -38v40q-8 42 -18 66l-17 44q0 22 -4 53h-33v-42q0 7 27 -90q1 -3 1 -26 q0 -43 -27 -43q-17 0 -17 17q0 3 6 9q5 -16 16 -21q12 12 12 15q0 19 -16 19q-34 0 -34 -26q0 -47 50 -47zM1151 657q2 22 -8 36q-9 5 -19 15q-2 18 -10 50q-15 11 -35 36q0 15 -7 40q-12 8 -28 23q-12 18 -17 53l2 -53q19 -14 40 -48q1 -12 5 -34q32 -7 39 -71 q19 -12 38 -47zM681 916q-9 0 -29 -6l-14 2q23 -10 38 -10q48 0 92 63q2 -15 -23 -39.5t-37 -28.5t-25 -9q13 -7 32 -7t43 14q46 26 55 69q2 21 4.5 40t26 19t31.5 -13v8q-2 17 -21 72q-16 48 -16 83v11l-113 19q-8 0 -10 -3q-8 -28 -23 -76q-13 -22 -33 -61q10 -5 20 -9 q13 -7 13 -16t-1 -15q31 -10 31 -25q0 -6 -4 -9q-11 18 -16 18h-8l-12 -46q-10 -22 -36 -22q-8 0 -22 12v10q10 9 16.5 9t7.5 -1v-7l-13 3q-2 -12 -2 -15l17 -6q21 0 14 31q-20 14 -29 14q-26 0 -26 -26q0 -40 41 -40t81 42q1 -2 1 -4q0 -16 -51 -45zM741 883h12q68 5 90 55 l-22 22q-7 -27 -32 -52t-48 -25zM1250 657l-11 35q0 9 12.5 9t21.5 -10q0 17 -3 36q-24 -5 -36 -14q-126 -100 -174 -349q6 2 17.5 7t16.5 7q-2 0 -16 13q1 13 20 13t22 11l-29 30q4 4 3 11q28 4 42 9q-3 4 -16 13.5t-13 20.5t23 11l14 -3q5 0 11 6v9q-24 22 -24 29 q0 17 50 17v9l-21 21q11 17 16 17h34q-10 32 -10 35q0 12 10 12l31 -11q3 0 9 6zM954 692l7 -76q9 -154 87 -328q-1 14 -25 80q-1 8 -4 21q-57 146 -57 309q0 50 19 132q2 2 6 5l119 -233l4 11q-19 43 -59 127q-18 28 -35 57.5t-17 62.5t16 52q-12 1 -36.5 -63.5 t-24.5 -156.5zM1102 591l-115 230l-17 -94v-6q0 -25 6 -121q6 -111 59 -234q17 122 67 225zM572 897l44 17l-15 45q0 32 35 32t35 -26q0 -5 -1 -10q9 10 13 48q5 6 5 15t-7 17q-13 11 -33 31q13 17 19.5 28t22.5 57.5t16 53.5t-53 113h-292v-507q27 5 38 11v165q31 21 70 23 l62 -108q7 17 23 48q9 15 19 15t12 -1q-4 -23 -13 -67zM581 950v10h-5v-10h5zM741 664v-10h158v-197q0 -20 16 -145q4 -2 9 -6l-17 263q0 197 63 333h-10q-27 -57 -39.5 -117t-23.5 -121h-156zM568 952q-17 -12 -32 -58h-7l-58 107h-13l11 -8q-1 -1 -4 -8q1 -8 10.5 -41 t7.5 -47l-30 104h-10l-3 -12q6 0 8 -2q-3 -2 -4 -5q17 -77 17 -84.5t-6 -8.5l-18 105q-1 0 -18 -3q4 -4 10 -9q0 -107 -2 -108q-6 33 -11 114q-5 -1 -11 -2v-162q57 23 155 66q14 35 14 42t-3 12.5t-3 7.5zM1069 289q-12 -19 -12 -29t2 -19.5t2 -12.5q12 10 18 31.5t16 28.5 q19 -23 66 -118q3 2 7 3v12q-9 0 -11 2q2 1 7 3q-5 35 -20 88q3 3 4 2q20 -69 32 -105l6 9v24q-10 35 -14 80l23 -105q6 3 7 8q-6 -1 -8 1q3 1 7 5q-2 34 -5 102q1 3 5 4l2 -2q9 -70 9 -110q3 0 9 3q-2 3 -4 9q2 2 4 8l2 139zM854 589q-19 28 -44 57l-43 -59l46 -59z M732 519v171v6q0 44 -25 172v-22q1 9 4 -26q14 -174 14 -243q0 -145 -60 -302q26 46 41 111l29 127q149 0 153 6h-156zM1055 225v18h-4v-18h4zM1265 -151v522q-14 -6 -33 -11q-5 -109 -9 -170q-30 -20 -66 -23q-35 69 -62 110l-14 -35q-13 -25 -30 -25q-5 0 -7 2 q1 10 5 32.5t5 33.5q-25 -6 -44 -22q13 -15 13 -38q0 -39 -33 -39q-21 0 -30 20q-1 7 -4 19q-9 -8 -11 -31t-9 -28q10 -7 12.5 -18t4.5 -19q25 -17 25 -20t-19.5 -32t-21.5 -36q-3 -28 -20 -74l64 -118h284zM643 366q16 93 16 130q0 83 -38 230q-10 29 -27 85 q-39 -166 -53 -195t-14 -31v1q3 0 42 -74zM655 325q0 1 11 46.5t11 119.5t-5 103l-12 72q-13 59 -73 226h-10l60 -185q32 -115 32 -221t-22 -146l-123 233q-4 -1 -8 -4l124 -247q-7 -16 -31 -57h9q5 1 11 5q9 18 26 55zM886 298h-16q-10 1 -23 -3q-38 -13 -62 -53l26 -25 q5 23 31.5 50t43.5 31zM417 515l-32 8q0 -50 -13 -50q-5 0 -13 8q0 -5 -1.5 -18.5t-1.5 -17.5q137 76 193 294q6 24 17 74l-34 -11q13 -13 13 -17q0 -15 -13.5 -16.5t-25.5 -3.5q3 -6 14.5 -14t11.5 -19.5t-14.5 -14.5t-27.5 -5q26 -24 26 -35t-12 -11q-30 -2 -33 -8l15 -15 q9 -9 9 -18q0 -16 -16 -16l-28 3q-1 -4 -3 -7q16 -20 16 -29t-2 -11h-40l6 -43q-5 -7 -11 -7zM968 197l21 -9q29 0 29 37q0 31 -42.5 31t-77.5 -39v3q26 49 75 49q9 0 18 -1q-30 7 -43.5 7t-51.5 -19q-3 19 53 33q-12 4 -26 4q-73 0 -105 -69q-3 -20 -5 -40q-8 -32 -35 -32 q-17 0 -20 11v-6q0 -27 16 -75q15 -43 15 -74q0 -7 -1 -13l115 -21q17 0 21 51q0 8 2 20l44 67q-37 8 -33 39q-4 7 -17 12.5t-13 13t2 9.5q17 -16 15 -16h9q2 19 5 38t26 29q2 1 16 2.5t22 -10.5v-13q-10 -9 -15.5 -9t-8.5 5q5 1 13 6v12l-13 3q-7 0 -13 -6q3 -12 3 -30z M472 509q0 -9 15.5 -25.5t17.5 -22.5q0 -16 4 -39q14 -10 33 -31q1 -17 10 -45q11 -8 30 -26q9 -13 15 -48l4 20q-2 12 -7 32q-18 17 -40 47q0 12 -5 31q-8 5 -19 13q-18 19 -20 60q-7 4 -17 11q-12 11 -21 35v-12zM777 20l-34 128q0 51 31 51q17 0 17 -15q0 -7 -3 -9 q-1 5 -6 16h-20q-3 -8 -3 -18q12 -11 21 -11q29 0 29 32q0 36 -41 36l-43 -10q-2 0 -8 6q15 11 34 16l-22 4q-11 0 -32 -16q-7 14 -7 15t27 11h-35q-10 1 -31 -22t-21 -60t11.5 -69.5t11.5 -37.5t-2 -7q-32 53 -32 131q0 14 26 48q12 14 26 19q-32 -1 -51 -29.5t-19 -55.5 l11 -93v-2q-22 34 -22 89.5t36 88.5q-62 -26 -62 -91q0 -22 13 -73t14 -68q15 -3 25 -3v17l-3 20h7q5 -13 10 -39h23q0 17 2 20q3 0 5 -4q-1 -27 24 -27q8 0 12 3q0 12 2 15q7 -8 6 -18q13 0 28 -5v22q1 20 -11.5 50.5t-18.5 57.5t-6 20q0 10 8 44q2 2 6 2l4 -4 q-10 -21 -10 -36t14.5 -52t18.5 -52.5t4 -51.5q12 -3 36 0v17zM840 -94l47 10q12 0 29 -6q5 -5 16 -12l4 12q-5 8 -11 21l-318 51q-9 0 -14.5 -16t-7.5 -20q7 2 22.5 2t31 -9.5t13.5 -9.5l45 8q16 0 38.5 -9t16.5 -9l41 5q18 0 31 -9t16 -9zM957 -151v11q0 4 -9 15t-14 12 q2 -2 5 -8l-2 -1h-11q-3 -6 -9 -6q-3 2 -3 10l-11 -2q-6 0 -4.5 0t3.5 9q-2 9 -7 8h-42q7 -2 -1 -10l-6 3q8 0 -12 -10q-1 1 -5 9q-3 0 -8 3q1 13 -11 16t-25.5 3t-25.5 -4q12 -6 11 -9q-6 -2 -18 0q0 -10 -4 -11q-5 5 -5 13q-10 0 -14 -2v3q1 4 9 11q-3 2 -6 7q-47 2 -62 2 h-6q5 -11 6 -12t-16 2q-5 -11 -9 -11q-4 8 -2 13q-8 -1 -12 -5l-4 5q8 15 8 13q-3 1 -60 1l-29 -78h411zM508 120q0 16 -3 24t-1 10q65 -58 65 -142q0 -28 -1 -31q-26 -80 -65 -104l8 43q0 44 -60 61q0 -37 -2 -39q-5 -11 -34 -31l-31 31v377q-4 0 -26 5v-478h163 q1 2 31.5 72t29.5 100l-23 144q1 61 42 96l-147 40v-264q54 23 54 86zM445 300h-7l-6 -365q6 1 10 6zM512 -107q44 55 44 125t-39 113q18 -91 18 -115q0 -81 -23 -123zM394 313v-375q4 -3 11 -9v382zM522 -9l-4 95q-5 -10 -16 -29l-48 -37q0 -9 -4 -27q17 -9 37.5 -21.5 t27.5 -34.5q2 19 7 54zM945 1127q3 -14 15.5 -52.5t12.5 -72t-21 -55.5q13 25 13 47.5t-10 63.5l-18 73q3 -1 8 -4zM790 1151q-11 13 -35.5 17t-34.5 16q21 -4 62 -13q9 -6 8 -11v-9zM714 1158l23 3q4 0 24 -13.5t22 -16.5q-18 -4 -55 -14q-5 26 -14 41zM772 1031l-3 -11 h-27q-13 0 -41 20q11 -2 29 -7l30 -8q8 7 -1 15q13 0 13 -9zM697 1067l21 -13q6 0 11 11v-13q-9 -3 -10 -3t-42 18h20zM637 1155q-74 -96 -111 -160q-26 46 -117 157q64 64 117 153q34 -51 111 -150zM1032 515q-43 69 -43 71.5t49 75.5q32 -72 35 -72v1zM640 591l-46 -76 l-43 75l43 74q25 -32 46 -73zM1224 12q-64 -64 -117 -153q-34 51 -111 150q74 96 111 160q26 -46 117 -157zM860 214q-3 1 -3 6t12.5 17t17.5 14q-6 -9 -27 -37zM954 111l-37 9q-7 0 -12 -5q0 12 -2 13h15q2 0 36 -17zM859 148l3 9h35q10 0 33 -18q-21 7 -49 13h-12 q-2 -2 3 -13q-13 -1 -13 9zM887 60h19q2 -14 14 -38q-11 -2 -27 6t-23 7l29 -20q-18 6 -50 31q29 14 38 14zM695 37q-39 118 -39 128t11 29t19 23q0 -1 -14 -28q-1 -9 -5 -28l28 -99v-25zM772 1139l-28 15l-1 -3l28 -15zM767 1128q-6 5 -15 9q-1 -6 -3 -9h18zM746 1131v9 l-7 6q0 -9 -6 -21q9 2 13 6zM886 37q3 0 7 -3q0 12 8 20h-10q-1 -3 -5 -8v-9zM883 45q-1 7 -4 7q-5 -2 -12 -4q9 -4 13 -4q2 0 3 1z" />
+<glyph unicode="&#x1f0cf;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM394 1318q0 -43 -30.5 -73.5t-73.5 -30.5t-73.5 29.5t-30.5 72.5 t30.5 73.5t73.5 30.5t73.5 -29.5t30.5 -72.5zM1368 786l29 7q56 0 56 -56q0 -22 -17 -38.5t-39 -16.5q-56 0 -58 53q-114 50 -153 134q-17 36 -26 72t-16.5 36t-34 -19.5t-32.5 -27.5q18 -76 18 -120q0 -103 -65.5 -220t-65.5 -177t11 -75.5t64.5 -33.5t74.5 -35 q40 -31 40 -88q0 -30 -11 -48q26 -14 26 -39q0 -43 -43 -43q-36 0 -44 40q-34 -10 -58 -10q-53 0 -99.5 66.5t-73 66.5t-26.5 -17q0 -11 13.5 -40.5t13.5 -41.5q0 -47 -61 -74q-47 -21 -90 -21t-84 6q2 -37 -37 -37t-39 36q0 11 8 23q-55 43 -55 94q0 23 8 36q36 30 76 42.5 t40 25.5q0 22 -25 22l-61 -13q-41 0 -64 33q-6 -4 -15 -4q-40 0 -40 39t40 39q7 0 14 -3q28 40 81 40q22 0 67 -12t66.5 -12t20.5 10l-2 5q-32 4 -77 17q-49 40 -85 115.5t-36 138.5q0 17 8 45.5t8 38.5q0 70 -21 121q-87 48 -117 48q-16 0 -39 -40t-23 -50.5t9 -26t9 -29.5 t-16.5 -30t-35.5 -16q-50 0 -50 52q0 30 32 47q-4 19 -4 27q0 281 190 281q27 0 89 -20.5t90 -35.5q69 57 173 57q50 0 71 -10q9 2 50 31q64 45 179 45q209 0 217 -213q0 -42 9 -125q18 -72 38 -72zM1442 -152q0 -43 -30.5 -73.5t-73.5 -30.5t-73.5 29.5t-30.5 72.5 t30.5 73.5t73.5 30.5t73.5 -29.5t30.5 -72.5zM1440 737.5q0 42.5 -44 42.5t-44 -42.5t44 -42.5t44 42.5zM1254 1135q-43 48 -153 48t-218 -80v-5q0 -72 47 -140q146 89 192 89q71 0 98 -72l-1 -11l-23 40q-27 39 -72.5 39t-187.5 -91q62 -36 84 -36t66 39t54.5 39t13.5 -2 q13 -27 17 -43l7 -27q1 -3 16 -36q34 -78 148 -134l14 22q-26 22 -34 50t-14.5 133.5t-27.5 138.5q-3 4 -8 12t-18 27zM796 416l5 -46q0 -8 -5 -13h30q11 0 65 21.5t58 27.5q3 84 25 121q69 116 77 133q30 67 30 150q0 17 -16 111q-4 -2 -18.5 -11.5t-21.5 -9.5 q-113 12 -141 104q-9 31 -15 90q-33 20 -61 20t-35 -3q-61 -35 -94 -159q24 5 59 5q124 0 211 -57l12 -88q5 -39 5 -117t-10 -111q-23 -74 -104 -147q-3 -2 -56 -21zM372 1345h-63l-19 59l-19 -59h-64l51 -38l-20 -60l52 38l52 -38l-21 60zM589 848l90 -14q22 0 68.5 17.5 t75.5 17.5q57 0 128 -76q-4 33 -13 99q-80 52 -206.5 52t-186.5 -53l-27 -26l12 -46q16 29 59 29zM871 762q0 50 -58 50q-30 0 -60 -29q8 1 16 1q45 0 102 -24v2zM825 745q0 -18 -24 -18q-28 0 -28 34q0 9 4 15h-24v-10q0 -10 13.5 -26t24.5 -16h14q44 0 65 29q-17 6 -51 17 q6 -16 6 -25zM627 1060q-97 -70 -130 -181q18 23 45.5 71.5t84.5 109.5zM635 765q-8 -2 -16 1q7 -8 7 -27q4 4 9 26zM640 767q-3 32 -38.5 32t-51.5 -46q28 20 52 20t38 -6zM579 718q20 0 32 6q-16 -2 -24.5 8t-5.5 17.5t3 8.5q-17 -4 -36 -13q3 -27 31 -27zM951 710v29 q-63 -80 -151 -80q-37 0 -82.5 15t-57 15t-15.5 -1q0 -6 2 -13l5 -26q-21 14 -30 26q-30 -16 -52 -16q-42 0 -51 30q-4 -15 -4 -28q0 -87 55 -165l27 -39q7 -11 30 -35q11 -12 61 -12q2 0 26.5 4.5t51.5 7.5q55 5 106 57.5t65 100.5t14 130zM1156 94q0 30 -30 30t-30 -30 q0 -27 30 -27t30 27zM1421 -181l-51 38l20 60l-52 -38l-52 38l21 -60l-51 -38h63l19 -59l19 59h64zM323 773.5q0 36.5 -38 36.5t-38 -36.5t38 -36.5t38 36.5zM839 116l-27 79q0 34 37 34t83 -67.5t87 -67.5t80.5 28.5t39.5 63t-17 55.5q-26 33 -141 70q-32 35 -32 73v6 l-74 -30q-38 -15 -75 -15t-63 9.5t-28 12.5q1 1 1 0l-40 -5l-122 23q-57 0 -63 -38q11 -22 0 -41q0 -38 52 -38l55 13q39 0 39 -34q0 -20 -53 -41.5t-62 -31.5t-9 -38.5t23 -55.5t58 -28q50 -19 114 -19t100.5 28.5t36.5 54.5zM479 323q0 26 -25.5 26t-25.5 -26t25.5 -26 t25.5 26zM604 25q0 23 -24 23t-24 -23t24 -23t24 23zM567 892h12q-14 -13 -23 -14q6 14 11 14zM643 614l128 -17q30 0 72 10l5 6h16v-13q-11 -10 -35 -42q-75 -96 -153 -96q-57 0 -57 41q0 14 18 38q-41 42 -41 51q0 22 47 22zM553 641q-12 -6 -12 -23t9 -37 q-14 21 -14 36.5t17 23.5zM262 776l-3 11q5 10 16 14q0 -3 -6.5 -11.5t-6.5 -13.5zM753 583l-103 8q-8 0 -24 -7v-12q0 -26 47 -32q-10 -1 -19 -3q-17 -3 -17 -26v-2q13 -16 39 -16q82 0 164 103h-8q-30 -13 -79 -13z" />
+<glyph unicode="&#x1f0d0;" horiz-adv-x="1234" d="M1152 -267h-1070v1698h1070v-1698zM1078 -193v1550h-922v-1550h922zM1070 1070l-333 279h81l252 -211v-68zM1070 770l-690 579h81l609 -511v-68zM1070 470l-906 760v68l906 -760v-68zM1070 170l-906 760v68l906 -760v-68zM1070 -130l-906 760v68l906 -760v-68zM859 -185 h-81l-614 515v68zM501 -185h-81l-256 215v68z" />
+<glyph unicode="&#x1f0d1;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM321 1252h-79v25h24l-16 46h-74l-16 -46h24v-25h-79v25h25 l54 155h-24v23h106v-23h-24l54 -155h25v-25zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5q29 0 36 -29v18q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18q7 29 35 29zM956 581 q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 68 71 68q9 0 41 -16l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q32 16 41 16q71 0 71 -68z M253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39t38 -39q0 -7 -20 -37q20 10 23 10zM1523 -113h-25l-54 -155h24v-23h-106v23h24l-54 155 h-25v25h79v-25h-24l16 -46h74l16 46h-24v25h79v-25zM243 1347l-28 85h-4l-28 -85h60zM1445 -183h-60l28 -85h4z" />
+<glyph unicode="&#x1f0d2;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM956 1145q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31 q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q34 17 41 17q71 0 71 -69zM146 1252q0 20 10 45t44 50t40.5 34.5t6.5 19.5 q0 33 -33 33q-36 0 -36 -48v-8h-27v9q0 71 61 71q64 0 64 -55q0 -17 -9 -29t-48.5 -43t-42.5 -53h76l1 46h24l-1 -72h-130zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5 q29 0 36 -29v18q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18q7 29 35 29zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39t38 -39 q0 -7 -20 -37q20 10 23 10zM1482 -88q0 -20 -10 -45t-44 -50t-40.5 -34.5t-6.5 -19.5q0 -33 33 -33q36 0 36 48v8h27v-9q0 -71 -61 -71q-64 0 -64 55q0 17 9 29t48.5 43t42.5 53h-76l-1 -46h-24l1 72h130zM956 19q0 -69 -71 -69q-7 0 -41 17l24 -29q12 -15 12 -35 q0 -69 -66 -69t-66 69q0 20 12 35l24 29q-34 -17 -41 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q49 0 62 -52v31q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5z" />
+<glyph unicode="&#x1f0d3;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM956 1145q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31 q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q34 17 41 17q71 0 71 -69zM214 1272q39 0 39 37q0 36 -55 36h-5v25q51 0 51 32 t-30 32q-34 0 -35 -40h-28q0 34 17.5 49t42.5 15q61 0 61 -54q0 -33 -28 -46q38 -11 38 -44.5t-21 -49.5t-49 -16q-71 0 -71 72h28q1 -48 45 -48zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10 q-40 0 -40 38.5t40 38.5q29 0 36 -29v18q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18q7 29 35 29zM956 581q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5 q0 68 71 68q9 0 41 -16l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q32 16 41 16q71 0 71 -68zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10 q-21 32 -21 37q0 39 38 39t38 -39q0 -7 -20 -37q20 10 23 10zM1414 -108q-39 0 -39 -37q0 -36 55 -36h5v-25q-51 0 -51 -32t30 -32q34 0 35 40h28q0 -34 -17.5 -49t-42.5 -15q-61 0 -61 54q0 33 28 46q-38 11 -38 44.5t21 49.5t49 16q71 0 71 -72h-28q-1 48 -45 48zM956 19 q0 -69 -71 -69q-7 0 -41 17l24 -29q12 -15 12 -35q0 -69 -66 -69t-66 69q0 20 12 35l24 29q-34 -17 -41 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q49 0 62 -52v31q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5z" />
+<glyph unicode="&#x1f0d4;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1282 1145q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31 q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v31q-13 -52 -63 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q34 17 40 17q71 0 71 -69zM630 1145q0 -26 -22.5 -46.5t-48.5 -20.5 q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q6 0 40 -17l-23 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q34 17 41 17q71 0 71 -69zM282 1306h-33v-30h19v-24h-67v24h21 v30h-68l-13 23l85 127h23v-126h33v-24zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5q29 0 36 -29v18q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18q7 29 35 29zM253 1131 q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39t38 -39q0 -7 -20 -37q20 10 23 10zM1379 -292v126h-33v24h33v30h-19v24h67v-24h-21v-30h68l13 -23 l-85 -127h-23zM1282 19q0 -69 -71 -69q-6 0 -40 17q12 -14 23.5 -29t11.5 -35q0 -69 -66 -69t-66 69q0 20 12 35l24 29q-34 -17 -41 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q50 0 63 -52v31q0 67 -35 123q13 -5 43.5 -5t43.5 5q-35 -56 -35 -123v-31q13 52 62 52 q26 0 48.5 -20.5t22.5 -46.5zM630 19q0 -69 -71 -69q-7 0 -41 17l24 -29q12 -15 12 -35q0 -69 -66 -69t-66 69q0 20 11.5 35t23.5 29q-34 -17 -40 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q49 0 62 -52v31q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-31 q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM222 1330v80l-53 -80h53zM1406 -166v-80l53 80h-53z" />
+<glyph unicode="&#x1f0d5;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1282 1145q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31 q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v31q-13 -52 -63 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q34 17 40 17q71 0 71 -69zM630 1145q0 -26 -22.5 -46.5t-48.5 -20.5 q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q6 0 40 -17l-23 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q34 17 41 17q71 0 71 -69zM281 1316q0 -68 -70 -68q-64 0 -68 68 h26q5 -44 42 -44q41 0 41 43.5t-38 43.5q-25 0 -41 -24q-9 9 -20 14l7 106h109v-54h-25v27h-62l-5 -60q20 16 42 16q62 0 62 -68zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5 q29 0 36 -29v18q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18q7 29 35 29zM956 581q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 68 71 68q9 0 41 -16l-24 29 q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q32 16 41 16q71 0 71 -68zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39 t38 -39q0 -7 -20 -37q20 10 23 10zM1417 -108q-41 0 -41 -43.5t38 -43.5q25 0 41 24q9 -9 20 -14l-7 -106h-109v54h25v-27h62l5 60q-20 -16 -42 -16q-62 0 -62 68t70 68q64 0 68 -68h-26q-5 44 -42 44zM1282 19q0 -69 -71 -69q-6 0 -40 17q12 -14 23.5 -29t11.5 -35 q0 -69 -66 -69t-66 69q0 20 12 35l24 29q-34 -17 -41 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q50 0 63 -52v31q0 67 -35 123q13 -5 43.5 -5t43.5 5q-35 -56 -35 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM630 19q0 -69 -71 -69q-7 0 -41 17l24 -29 q12 -15 12 -35q0 -69 -66 -69t-66 69q0 20 11.5 35t23.5 29q-34 -17 -40 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q49 0 62 -52v31q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5z" />
+<glyph unicode="&#x1f0d6;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1282 1145q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31 q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v31q-13 -52 -63 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q34 17 40 17q71 0 71 -69zM1282 581q0 -26 -22.5 -46.5t-48.5 -20.5 q-49 0 -62 52v-31q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v31q-13 -52 -63 -52q-26 0 -48.5 20.5t-22.5 46.5q0 68 71 68q9 0 41 -16l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q32 16 40 16q71 0 71 -68zM630 1145q0 -26 -22.5 -46.5 t-48.5 -20.5q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q6 0 40 -17l-23 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q34 17 41 17q71 0 71 -69zM221 1381q56 0 56 -66.5 t-61 -66.5q-32 0 -51 26t-19 78q0 106 71 106q57 0 59 -63h-26q-5 39 -35 39q-41 0 -42 -76q21 23 48 23zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5q29 0 36 -29v18 q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18q7 29 35 29zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39t38 -39q0 -7 -20 -37 q20 10 23 10zM1482 -188q0 -106 -71 -106q-57 0 -59 63h26q5 -39 35 -39q41 0 42 76q-21 -23 -48 -23q-56 0 -56 66.5t61 66.5q32 0 51 -26t19 -78zM1282 19q0 -69 -71 -69q-6 0 -40 17q12 -14 23.5 -29t11.5 -35q0 -69 -66 -69t-66 69q0 20 12 35l24 29q-34 -17 -41 -17 q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q50 0 63 -52v31q0 67 -35 123q13 -5 43.5 -5t43.5 5q-35 -56 -35 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM630 581q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31 q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 68 71 68q8 0 40 -16l-23 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q32 16 41 16q71 0 71 -68zM630 19q0 -69 -71 -69q-7 0 -41 17l24 -29q12 -15 12 -35q0 -69 -66 -69t-66 69q0 20 11.5 35t23.5 29 q-34 -17 -40 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q49 0 62 -52v31q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM215 1272q37 0 37 41t-35 41q-22 0 -43 -26q7 -56 41 -56zM1413 -108q-37 0 -37 -41t35 -41 q22 0 43 26q-7 56 -41 56z" />
+<glyph unicode="&#x1f0d7;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1282 1145q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31 q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v31q-13 -52 -63 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q34 17 40 17q71 0 71 -69zM1282 581q0 -26 -22.5 -46.5t-48.5 -20.5 q-49 0 -62 52v-31q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v31q-13 -52 -63 -52q-26 0 -48.5 20.5t-22.5 46.5q0 68 71 68q9 0 41 -16l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q32 16 40 16q71 0 71 -68zM956 834q0 -26 -22.5 -46.5 t-48.5 -20.5q-49 0 -62 52v-30q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v30q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 15 -12 35q0 70 66 70t66 -70q0 -20 -12 -35l-24 -29q34 17 41 17q71 0 71 -69zM630 1145 q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q6 0 40 -17l-23 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q34 17 41 17q71 0 71 -69z M220 1276h23v-24h-80v24h28q5 85 52 152h-70v-27h-24v54h127v-22q-56 -67 -56 -157zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5q29 0 36 -29v18q0 40 -19 70q8 -3 24 -3t24 3 q-19 -30 -19 -70v-18q7 29 35 29zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39t38 -39q0 -7 -20 -37q20 10 23 10zM1479 -291h-127v22 q56 67 56 157h-23v24h80v-24h-28q-5 -85 -52 -152h70v27h24v-54zM1282 19q0 -69 -71 -69q-6 0 -40 17q12 -14 23.5 -29t11.5 -35q0 -69 -66 -69t-66 69q0 20 12 35l24 29q-34 -17 -41 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q50 0 63 -52v31q0 67 -35 123q13 -5 43.5 -5 t43.5 5q-35 -56 -35 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM630 581q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 68 71 68q8 0 40 -16l-23 29 q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q32 16 41 16q71 0 71 -68zM630 19q0 -69 -71 -69q-7 0 -41 17l24 -29q12 -15 12 -35q0 -69 -66 -69t-66 69q0 20 11.5 35t23.5 29q-34 -17 -40 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q49 0 62 -52v31 q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5z" />
+<glyph unicode="&#x1f0d8;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1282 1145q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31 q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v31q-13 -52 -63 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q34 17 40 17q71 0 71 -69zM1282 581q0 -26 -22.5 -46.5t-48.5 -20.5 q-49 0 -62 52v-31q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v31q-13 -52 -63 -52q-26 0 -48.5 20.5t-22.5 46.5q0 68 71 68q9 0 41 -16l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q32 16 40 16q71 0 71 -68zM956 834q0 -26 -22.5 -46.5 t-48.5 -20.5q-49 0 -62 52v-30q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v30q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 15 -12 35q0 70 66 70t66 -70q0 -20 -12 -35l-24 -29q34 17 41 17q71 0 71 -69zM630 1145 q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q6 0 40 -17l-23 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q34 17 41 17q71 0 71 -69z M282 1307q0 -59 -70.5 -59t-70.5 59q0 37 36 51q-29 17 -29 47q0 53 64 53t64 -53q0 -30 -29 -47q35 -14 35 -51zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5q29 0 36 -29v18 q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18q7 29 35 29zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39t38 -39q0 -7 -20 -37 q20 10 23 10zM1487 -143q0 -37 -36 -51q29 -17 29 -47q0 -53 -64 -53t-64 53q0 30 29 47q-35 14 -35 51q0 59 70.5 59t70.5 -59zM1282 19q0 -69 -71 -69q-6 0 -40 17q12 -14 23.5 -29t11.5 -35q0 -69 -66 -69t-66 69q0 20 12 35l24 29q-34 -17 -41 -17q-71 0 -71 69 q0 26 22.5 46.5t48.5 20.5q50 0 63 -52v31q0 67 -35 123q13 -5 43.5 -5t43.5 5q-35 -56 -35 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM956 344q0 -69 -71 -69q-7 0 -41 17l24 -29q12 -15 12 -35q0 -70 -66 -70t-66 70q0 20 12 35l24 29q-34 -17 -41 -17 q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q49 0 62 -52v30q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-30q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM630 581q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31 q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 68 71 68q8 0 40 -16l-23 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q32 16 41 16q71 0 71 -68zM630 19q0 -69 -71 -69q-7 0 -41 17l24 -29q12 -15 12 -35q0 -69 -66 -69t-66 69q0 20 11.5 35t23.5 29 q-34 -17 -40 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q49 0 62 -52v31q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM249 1402q0 32 -37.5 32t-37.5 -32t37.5 -32t37.5 32zM253 1308.5q0 36.5 -41.5 36.5t-41.5 -36.5 t41.5 -36.5t41.5 36.5zM1458 -144.5q0 36.5 -41.5 36.5t-41.5 -36.5t41.5 -36.5t41.5 36.5zM1454 -238q0 32 -37.5 32t-37.5 -32t37.5 -32t37.5 32z" />
+<glyph unicode="&#x1f0d9;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1282 1145q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31 q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v31q-13 -52 -63 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q34 17 40 17q71 0 71 -69zM1282 765q0 -26 -22.5 -47t-48.5 -21q-49 0 -62 52 v-30q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v30q-13 -52 -63 -52q-26 0 -48.5 21t-22.5 47q0 68 71 68q9 0 41 -16l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q32 16 40 16q71 0 71 -68zM630 1145q0 -26 -22.5 -46.5t-48.5 -20.5 q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q6 0 40 -17l-23 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q34 17 41 17q71 0 71 -69zM277 1354q0 -106 -71 -106 q-56 0 -58 63h25q5 -39 36 -39q40 0 41 76q-21 -23 -47 -23q-57 0 -57 66.5t61 66.5q32 0 51 -26t19 -78zM1282 399q0 -68 -71 -68q-8 0 -40 16l23 -29q12 -14 12 -34q0 -70 -66 -70t-66 70q0 20 12 34l24 29q-32 -16 -41 -16q-71 0 -71 68q0 26 22.5 47t48.5 21 q50 0 63 -52v30q0 67 -35 123q13 -5 43.5 -5t43.5 5q-35 -56 -35 -123v-30q13 52 62 52q26 0 48.5 -21t22.5 -47zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5q29 0 36 -29v18 q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18q7 29 35 29zM956 581q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 68 71 68q9 0 41 -16l-24 29q-12 14 -12 34 q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q32 16 41 16q71 0 71 -68zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39t38 -39 q0 -7 -20 -37q20 10 23 10zM630 765q0 -26 -22.5 -47t-48.5 -21q-49 0 -62 52v-30q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v30q-13 -52 -62 -52q-26 0 -48.5 21t-22.5 47q0 68 71 68q8 0 40 -16l-23 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29 q32 16 41 16q71 0 71 -68zM1425 -161q57 0 57 -66.5t-61 -66.5q-32 0 -51 26t-19 78q0 106 71 106q56 0 58 -63h-25q-5 39 -36 39q-40 0 -41 -76q21 23 47 23zM1282 19q0 -69 -71 -69q-6 0 -40 17q12 -14 23.5 -29t11.5 -35q0 -69 -66 -69t-66 69q0 20 12 35l24 29 q-34 -17 -41 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q50 0 63 -52v31q0 67 -35 123q13 -5 43.5 -5t43.5 5q-35 -56 -35 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM630 399q0 -68 -71 -68q-9 0 -41 16l24 -29q12 -14 12 -34q0 -70 -66 -70t-66 70q0 20 12 34 l23 29q-32 -16 -40 -16q-71 0 -71 68q0 26 22.5 47t48.5 21q49 0 62 -52v30q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-30q13 52 62 52q26 0 48.5 -21t22.5 -47zM630 19q0 -69 -71 -69q-7 0 -41 17l24 -29q12 -15 12 -35q0 -69 -66 -69t-66 69q0 20 11.5 35t23.5 29 q-34 -17 -40 -17q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q49 0 62 -52v31q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM209 1434q-37 0 -37 -41t34 -41q22 0 43 26q-6 56 -40 56zM1419 -270q37 0 37 41t-34 41 q-22 0 -43 -26q6 -56 40 -56z" />
+<glyph unicode="&#x1f0da;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM1282 1145q0 -26 -22.5 -46.5t-48.5 -20.5q-49 0 -62 52v-31 q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v31q-13 -52 -63 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q34 17 40 17q71 0 71 -69zM1282 765q0 -26 -22.5 -47t-48.5 -21q-49 0 -62 52 v-30q0 -67 35 -123q-13 5 -43.5 5t-43.5 -5q35 56 35 123v30q-13 -52 -63 -52q-26 0 -48.5 21t-22.5 47q0 68 71 68q9 0 41 -16l-24 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-23 -29q32 16 40 16q71 0 71 -68zM956 961q0 -26 -22.5 -46.5t-48.5 -20.5 q-49 0 -62 52v-30q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v30q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q7 0 41 -17l-24 29q-12 15 -12 35q0 69 66 69t66 -69q0 -20 -12 -35l-24 -29q34 17 41 17q71 0 71 -69zM630 1145q0 -26 -22.5 -46.5 t-48.5 -20.5q-49 0 -62 52v-31q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v31q-13 -52 -62 -52q-26 0 -48.5 20.5t-22.5 46.5q0 69 71 69q6 0 40 -17l-23 29q-12 14 -12 34q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q34 17 41 17q71 0 71 -69zM314 1353 q0 -105 -61.5 -105t-61.5 105t61.5 105t61.5 -105zM1282 399q0 -68 -71 -68q-8 0 -40 16l23 -29q12 -14 12 -34q0 -70 -66 -70t-66 70q0 20 12 34l24 29q-32 -16 -41 -16q-71 0 -71 68q0 26 22.5 47t48.5 21q50 0 63 -52v30q0 67 -35 123q13 -5 43.5 -5t43.5 5 q-35 -56 -35 -123v-30q13 52 62 52q26 0 48.5 -21t22.5 -47zM191 1252h-83v24h28v154h-28v25h56v-179h27v-24zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5q29 0 36 -29v18 q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18q7 29 35 29zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39t38 -39q0 -7 -20 -37 q20 10 23 10zM1520 -291h-56v179h-27v24h83v-24h-28v-154h28v-25zM630 765q0 -26 -22.5 -47t-48.5 -21q-49 0 -62 52v-30q0 -69 34 -123q-13 5 -43 5t-43 -5q34 54 34 123v30q-13 -52 -62 -52q-26 0 -48.5 21t-22.5 47q0 68 71 68q8 0 40 -16l-23 29q-12 14 -12 34 q0 70 66 70t66 -70q0 -20 -12 -34l-24 -29q32 16 41 16q71 0 71 -68zM1437 -189q0 -105 -61.5 -105t-61.5 105t61.5 105t61.5 -105zM1282 19q0 -69 -71 -69q-6 0 -40 17q12 -14 23.5 -29t11.5 -35q0 -69 -66 -69t-66 69q0 20 12 35l24 29q-34 -17 -41 -17q-71 0 -71 69 q0 26 22.5 46.5t48.5 20.5q50 0 63 -52v31q0 67 -35 123q13 -5 43.5 -5t43.5 5q-35 -56 -35 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM956 217q0 -69 -71 -69q-7 0 -41 17l24 -29q12 -15 12 -35q0 -69 -66 -69t-66 69q0 20 12 35l24 29q-34 -17 -41 -17 q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q49 0 62 -52v30q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-30q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM630 399q0 -68 -71 -68q-9 0 -41 16l24 -29q12 -14 12 -34q0 -70 -66 -70t-66 70q0 20 12 34l23 29q-32 -16 -40 -16 q-71 0 -71 68q0 26 22.5 47t48.5 21q49 0 62 -52v30q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-30q13 52 62 52q26 0 48.5 -21t22.5 -47zM630 19q0 -69 -71 -69q-7 0 -41 17l24 -29q12 -15 12 -35q0 -69 -66 -69t-66 69q0 20 11.5 35t23.5 29q-34 -17 -40 -17 q-71 0 -71 69q0 26 22.5 46.5t48.5 20.5q49 0 62 -52v31q0 69 -34 123q13 -5 43 -5t43 5q-34 -54 -34 -123v-31q13 52 62 52q26 0 48.5 -20.5t22.5 -46.5zM285 1353q0 81 -32.5 81t-32.5 -81t32.5 -81t32.5 81zM1408 -189q0 81 -32.5 81t-32.5 -81t32.5 -81t32.5 81z" />
+<glyph unicode="&#x1f0db;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM285 1429h-28v-110q0 -80 -71 -80q-46 0 -56 48l26 9 q10 -31 33 -31q37 0 37 53v111h-41v26h100v-26zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5q29 0 36 -29v18q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18q7 29 35 29z M1284 -166h-940v1496h940v-1496zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39t38 -39q0 -7 -20 -37q20 10 23 10zM1439 -101 q-37 0 -37 -53v-111h41v-26h-100v26h28v110q0 80 71 80q46 0 56 -48l-26 -9q-10 31 -33 31zM1044 1233l14 -34v-75q0 -2 1.5 -29.5t1.5 -40.5q23 5 23 -22q0 -41 -32 -44q89 -36 85.5 -36t21.5 8v261q-11 -1 -15 2q27 27 46 40q16 -12 48 -40q-3 -3 -15 -2v-295 q32 -5 49 -15v407h-180q-6 -9 -11 -25q34 -3 42 -33q3 -10 3 -49t-2 -47q-4 53 -4 72q0 20 -10 35q-12 16 -22.5 16t-14.5 -4q28 -14 33 -46l2 -52l-2 2q-14 89 -31 89q2 0 -10 -12q20 -10 29 -56.5t34 -66.5q0 19 -1 18q7 -11 10 -24h-10q-30 14 -40.5 63t-25.5 63 q-17 -24 -17 -28zM974 1175l21 2q15 0 36 -10l-3 12q-8 0 -10 2q2 1 13 -1v28q-6 -6 -32 -10.5t-25 -22.5zM1209 954v4h-10v-4h10zM1057 1023l6 8l-4 10q9 -4 9 -10q-6 -16 -18 -16q-19 0 -19 19q0 15 17 23v51q1 15 4 41t3 24t-9 51q-9 -9 -9 -15q1 -20 1 -39q0 -46 -8 -88 q-12 -59 -12 -46q0 -21 19 -28q6 0 13 -2q-4 -4 -8.5 -4t-27.5 23q-1 -3 -4 -6q9 -22 37.5 -22t28.5 32q0 20 -18 20q-11 0 -19 -12q3 -11 18 -14zM997 1151q-11 11 -11 20q-5 -1 -12 -3q2 -2 3 -9q7 -2 20 -8zM1217 931v18q-7 -11 -49 -17q44 0 49 -1zM1217 908v16 q-41 -1 -52 0v-13h10q0 5 2 7q2 -2 1 -10h39zM1209 951l-32 6q-20 0 -41 -8v-83l28 -2q-1 35 -1 53.5t1 19.5q17 1 45 14zM1179 867l27 -6h11v25q-10 -9 -31 0q13 3 31 -2v21h-52v-13q8 1 11 5l2 -9q-2 -2 -10 -2v-15l9 3q2 0 2 -7zM943 1086l-3 -11h11q12 0 41 11 q-24 94 -24 88q0 7 6 19t9 15q19 -2 48 9v15h-153q-28 -40 -35.5 -116t-15.5 -95q10 -4 54.5 -30t66.5 -26q68 0 83 183l-23 -2q-5 0 -29 7v-14q0 -3 9 -24t9 -24q0 7 -25 -34l-4 4q2 4 3 11l-32 -2q-5 17 -5 12q0 6 2 4h7zM1131 861v88q-16 5 -43 16v-125zM796 1070l10 -19 q0 -23 -17 -23t-17 16q0 4 1 5q8 -12 16 -16q5 3 12 8v18q-6 6 -17 6q-22 0 -22 -26.5t25.5 -26.5t32 23t13 90t28.5 107h-25q-18 -29 -24 -77t-11 -69t-5 -16zM704 1121l-17 4q-22 0 -22 -19q0 -4 9 -17q3 -1 6 -1q3 24 27 24q11 0 13 -1q-29 -2 -29 -24q0 -4 12 -14 q5 23 24 23q11 0 14 -1q-9 -2 -19 -4.5t-10 -11.5l6 -18q5 -3 9 -7q2 26 23 26q12 0 14 -3q-5 3 -17 -2t-12 -12t21 -30q-4 9 3.5 24t15.5 15t12 -2q10 22 15.5 75.5t21.5 86.5h-20q-16 -27 -23 -68.5t-13 -57.5q-3 3 -1 3q4 43 23 123h-28q-9 -18 -13.5 -52t-11.5 -47 q0 53 11 99h-20q-12 -13 -17.5 -50.5t-16.5 -53.5q5 -2 10 -7zM978 965l-34 -8q-29 0 -69 29t-51 29q4 0 -10 -4l124 -93l57 27q-3 3 -7 14q-3 6 -10 6zM777 944l-26 -2q-2 0 -16 31h-11q1 -3 -15 -3q2 20 -18 32v-31q160 -126 187 -231q10 34 116 79v39q-7 -4 -11.5 -19 t-15.5 -20q-8 6 -24 15q-2 -2 -11 -20q-6 -11 -12.5 -11t-8.5 2q-3 18 -17 42q-8 -4 -23 -10q-5 13 -16 38q-3 1 -8 1l-15 -2q-10 0 -12 14t-4 25l-23 -3q-12 0 -16 34zM1029 912l18 52q0 19 -28 30v-197q-1 -28 -1 -49q0 -32 2 -50q5 -31 3 -35l15 1q8 -4 2 -15h-12l-4 2 v-66v-13q0 -43 16 -121q30 -146 117 -236v15q-14 5 -16 22.5t-3 34.5q-15 6 -40 22q-11 13 -6 36t3.5 27.5t-29.5 26.5q3 43 3 62q0 9 -1 13q-2 9 -13 19t-11 14l14 41q0 7 -13.5 27.5t-13.5 33.5l19 54l-16 55l16 38l-21 57l18 50zM356 1318v-379q22 13 44 21q0 42 2 54 q64 19 65 19t-1 -2v-47l238 71q-45 44 -45 45q0 27 28 28q13 4 15 31t2.5 40.5t7.5 33.5l-51 85h-305zM1015 996h-12q-5 -8 -16 -22q16 -26 18 -52l3 -332q8 -170 84 -308q-92 125 -141 206l-92 165q-33 56 -104 152l-67 70q-75 66 -163 101l-17 7h-14q33 -16 76 -40 q170 -93 298 -316.5t164 -270.5l61 -80q26 -32 45 -49q-95 119 -118 326l-5 31v412zM861 598q0 19 -22 19q-9 0 -23 -15q0 22 -1 22q-4 12 -19 12q-21 0 -21 -21q0 -9 6 -18q7 -2 15 -9q-27 -8 -27 -16q0 -28 19.5 -28t21.5 17q1 6 4 17q8 -4 11 -29q13 7 15 6q-8 10 -21 29 q16 -9 24 -9q18 0 18 23zM490 941q112 -139 120 -359v-406q-7 0 12 -3l14 24q-19 60 -19 71v314q0 69 -27 167t-59 138q6 -1 15 -13q66 -82 152.5 -233.5t108.5 -187.5q121 -191 257 -242q26 -10 64 -22q-174 70 -281 221l-20 24q-56 88 -89 151q-120 231 -248 356zM594 264 l-18 -53q0 -24 28 -33l-2 399q-9 232 -133 380q-3 -14 -3 -15q9 0 12 -7q2 -23 9 -53q19 -9 43 -29q4 -7 -4 -49q14 -12 30 -31q-3 -24 -3 -68q1 -10 13 -20t12 -17t-8 -22.5t-8 -16t4 -14.5q25 -37 25 -49l-15 -51l13 -53l-16 -46l21 -55l-18 -50q0 -9 9 -24t9 -23z M851 223l21 5q9 0 19 -32q10 5 16.5 5t12 -15t14.5 -18v30q-173 143 -184 231q-22 -35 -108 -72q-14 -6 -14 -22.5t5 -23.5q2 2 8.5 21t13.5 19t18 -13h9q14 28 23 28t18 -41h13q4 -1 6 3t5 4h7q1 0 16 -39q16 5 24 5t12.5 -20t5.5 -22q11 6 21 6t13 -14t5 -25zM885 15 q-3 -63 -11 -80h20q15 16 17.5 43.5t5.5 39.5l2 -58q-3 -8 -7 -24l57 -90h303v378l-49 -15q0 -43 -1 -53l-58 -23q-6 0 -5 2v53l-240 -74l29 -20q15 -11 15 -22t-1 -12q-1 8 -16 21q-11 -23 -29 -23q-4 0 -4 3q21 0 21 23q0 8 -15 15q1 -26 -23 -26q-8 0 -9 1q24 7 24 20 q0 18 -15 22q5 -27 -23 -27q-8 0 -12 4q-2 -1 12 -1t14 19t-20 25q5 -39 -23 -39q-5 1 -8 2q-8 -59 -35 -164h17q13 18 21 66.5t20 69.5q-9 -91 -27 -136h29q5 14 22 94h2v-14zM650 204l34 8q17 0 23 -4l94 -54q1 0 8 7l-123 93q-19 -10 -55 -27q2 -9 8 -23h11zM827 98 l-10 26q0 17 19 17q15 0 15 -12q0 -6 -2 -3l-10 10h-9q-8 -9 -8 -12q0 -19 22 -19q17 0 17 26t-25 26q-35 0 -44 -103q-3 -33 -8.5 -60t-21.5 -59h28l18 40q5 78 12 99t7 24zM536 207v122q-17 -6 -47 -18v-88zM683 83l2 11h-16q-2 -4 -20 -3q2 2 2 6q-3 -4 -20 -11l26 -86 q-3 -11 -6 -24t-14 -15q-17 3 -45 -9v-17h151q28 40 36.5 114.5t16.5 98.5q-95 56 -116 56t-30 -6q-24 -16 -40.5 -76.5t-15.5 -89.5v-8q35 3 54 -8l-23 66q0 4 12.5 16t15.5 17q2 -3 2 -18l19 2q12 0 17 -9q-3 -3 -8 -7zM455 288v10l-6 -2q-4 0 -4 4t-1 5l-19 3h-19v-20h49 zM413 218l30 -6q16 0 43 11v83l-28 2q2 -36 2 -55t-2 -20q-17 1 -45 -15zM457 265v12q-4 0 -8 -5q-2 4 -5 9l-19 4h-19v-20h51zM457 246v14q-6 1 -51 0v-14h51zM406 240v-20q6 9 28 14t24 6h-52zM649 10q-10 5 -16 5q6 -12 6 -15q9 5 10 10zM611 148q-1 25 -32.5 25 t-31.5 -29q0 -24 17 -24l19 9q0 12 -6 17q2 0 -15 -5l-5 4q5 9 15 9q19 0 19 -18.5t-18 -20.5q6 -18 1.5 -58.5t-4.5 -51.5t12 -57q1 41 5 113q2 12 9.5 42.5t7.5 38.5t-11 16q-8 2 -23 5l22 2q17 -11 19 -17zM423 211v4h-12v-4h12zM602 16l-1 3l-7 -3v-4zM651 -6l-20 -2 q-4 0 -40 7q8 -3 24 -11q-15 -1 -23 4l2 -27q0 3 12.5 4.5t33.5 5.5q11 5 11 19zM520 -19q0 -65 25 -85h12q0 -7 3 9q-18 7 -30 59t-32 67q0 -10 -2 -13q-1 3 -5 5v14q2 1 4 1q19 0 40 -53q3 -22 10 -57q3 -13 17 -17q16 27 16 29l-12 41v25q0 42 -2 106q-9 4 -22 16 q-3 5 -3 16t11.5 25t19.5 12q-89 36 -84 36q-5 0 -23 -6l3 -262q3 -1 10 -5q-15 -14 -46 -38q-13 14 -46 40q3 3 16 2v295q-16 5 -44 16v-413h172q10 20 13 30q-44 11 -44 94q0 38 1 46q0 -10 4 -83q4 -51 40 -51q4 0 7 6q-29 18 -30 35q-4 45 -4 54t2 10q0 -2 3 -6z M928 1193h-48q3 7 35 10t40 5q-22 -15 -27 -15zM929 1179h-31v4h31v-4zM912 1151q-4 0 -16 18q-12 -5 -12 -13q-5 5 -12 6q23 15 40 15t36 -12q-14 -14 -36 -14zM898 1154l-1 -4l-9 3v4zM1039 967l-3 -12h-10q-1 12 1 15zM936 1033h59l-4 -6l-55 -3q-3 1 -10 -2q13 11 10 11 zM976 1009h-12v4h12v-4zM952 1009h-9v4h9v-4zM1039 865q0 -7 -3 -10h-9q-3 1 -3 7l3 6zM1042 763l-3 -12h-10q-1 12 0 15zM616 1181.5q18 -17.5 18 -35t-14.5 -38.5t-29.5 -21q-63 0 -73 59q-9 -7 -9 -29t16 -67h-47q16 61 16 66q0 18 -10 30l-15 -38q-8 -19 -43 -19 q-58 0 -58 55t56 55q26 0 42 -16l6 5v6q-26 18 -26 51q0 53 56 53q21 0 39.5 -18t18.5 -39.5t-35 -50.5l9 -7q12 16 38.5 16t44.5 -17.5zM1052 554l-3 -12h-12q-1 11 0 15zM1065 462l-3 -12h-12q-1 12 0 15zM1089 359h-13q-1 11 0 15h13v-15zM1118 275q-3 0 -3 6t3 9l13 -3 l-3 -12h-10zM507 894l-3 -12h-9q-1 6 -1 9.5t1 5.5zM537 798q-3 0 -3 6l3 7l12 -3q0 -7 -3 -10h-9zM560 706v13l15 -3q0 -7 -3 -10h-12zM576 615q-3 0 -3 6l3 7l12 -3q0 -7 -3 -10h-9zM1261 20q0 -55 -56 -55q-26 0 -42 16l-6 -5v-6q26 -18 26 -51q0 -53 -56 -53 q-21 0 -39.5 18t-18.5 39.5t35 50.5l-9 7q-12 -16 -38.5 -16t-44.5 17.5t-18 35t14.5 38.5t29.5 21q63 0 73 -59q9 7 9 29t-16 67h47q-16 -61 -16 -66q0 -18 10 -30l15 38q8 19 43 19q58 0 58 -55zM584 508v12l15 -3q-1 -7 -3 -9h-12zM596 406h-12q-2 11 0 15h12v-15z M924 50q12 -6 17.5 -6t18.5 13q-2 -11 -18.5 -15.5t-18.5 -17.5l6 13q5 9 -5 13zM599 313l-3 -12h-10q-1 12 1 15zM654 156h-7v4h7v-4zM701 151q-9 -18 -36 -18t-37 7q3 3 3 9q9 -5 35 -5t35 7zM587 202q-4 0 -4 6t4 9l12 -3l-3 -12h-9zM720 21q15 0 31 -12l-31 -16 q7 -4 13 0q-10 -5 -24 -5q4 -1 11 3q-1 0 -23 2q-4 4 -11 8l8 16zM568 133l-2 -3l-7 7l3 2zM714 -37l-17 3q-15 0 -29 -7q12 14 34.5 16t43.5 3q-20 -15 -32 -15zM740 13l-18 2q5 -5 6 -12q12 6 12 10z" />
+<glyph unicode="&#x1f0dc;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM283 1267q-43 -19 -72 -19q-102 0 -102 105t102 105q34 0 72 -18 v-36h-6q-32 26 -68 26q-67 0 -67 -77t68 -77q37 0 67 26h6v-35zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5q29 0 36 -29v18q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18 q7 29 35 29zM1284 -166h-940v1496h940v-1496zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39t38 -39q0 -7 -20 -37q20 10 23 10z M1345 -103q43 19 72 19q102 0 102 -105t-102 -105q-34 0 -72 18v36h6q32 -26 68 -26q67 0 67 77t-68 77q-37 0 -67 -26h-6v35zM1272 1318h-232l36 -17l3 -6l-43 -40q-25 -27 -25 -50q0 -51 39 -79q10 -2 29 -11q6 -14 25 -39l37 -26q5 -5 5 -49q0 -10 -12 -34q23 -32 68 -84 l-2 -15q7 5 20 18q16 27 52 76v356zM1079 1106q-3 8 -20 8t-25 1q0 27 -26 53q-3 17 -10 51v-27q0 -23 12 -36t13.5 -21.5t7.5 -32.5q2 0 7.5 0.5t8.5 0.5q-12 -6 -33 -6q3 -10 11 -10q14 6 27 6h1l-6 -9q10 4 32 12v10zM986 1192q0 -24 24 -63l-24 99v-36zM944 1223 q0 -22 17.5 -60t19.5 -57l2 6q-12 49 -39 143v-32zM966 1201q0 -15 29 -123q-4 43 -10 96t-19 66v-39zM1043 1072l24 6q22 0 18 -30q10 5 10 15q0 24 -22 24q-9 0 -35 -14q2 0 5 -1zM1115 977q25 0 25 29.5t-21 29.5h-13q25 -22 25 -33q0 -18 -22 -24q2 -1 6 -2zM1115 992 q6 0 13 3q-2 22 -18 29l11 -20q-1 0 -2 -4l-9 12l2 -20h3zM1241 817l-5 -35l2 -10q16 69 34 108v36h-6v6h6v31q-22 -26 -46 -87t-24 -84q28 -2 28 27q0 4 -7 11.5t-8 9.5q2 5 9 5q17 0 17 -18zM969 1117v16h-4v-16h4zM1098 1004q0 18 -22 29q13 -41 13 -30q0 -14 -19 -18 l10 -5q18 6 18 24zM1085 998v8h-5v-8h5zM1031 989l15 -3q21 0 21 25t-42 52v-18q0 -8 18 -27l6 6q7 -8 7 -18q-11 -12 -25 -17zM1020 1037v29h-4v-29h4zM1010 1039v27h-6v-27h6zM1244 712q0 -7 4 -11l24 59v100q-28 -72 -28 -148zM1019 1015q0 -8 13 -14q-1 10 -6 23 q-7 -1 -7 -9zM1203 826v9h-6v-9h6zM1013 1010v23q-16 -10 -23 -26q5 3 15 5l3 -2q-8 -9 -25 -9h-6q3 -6 19.5 -6t16.5 15zM1227 766v4h-13v-4h13zM761 1211q-2 8 -5 11l-3 -8zM995 982l-5 1l-3 -7l5 -2zM1193 788q0 8 -11 8q-4 -3 -10 -9v-20q4 -2 12 -9l6 3q0 9 -5 14 q8 16 8 13zM1268 707q-8 -4 -8 -10t3.5 -14t4.5 -12v36zM758 1204l-14 -5h11zM791 1192l-5 -66q0 -15 3 -30q33 0 39 -2q-12 -4 -24 -4q-28 0 -28 25q0 11 3.5 30.5t3.5 29.5l-15 -18q0 12 6 21.5t6 10.5l-4 7q-10 -24 -42 -28l-5 -8l-10 6v-39q0 -39 30.5 -96t66.5 -57 q54 0 102 42q-6 -18 -40.5 -31.5t-53 -13.5t-60.5 23v-27q0 -6 34 -30h-4q-13 0 -28.5 18t-22.5 19l-5 -10q13 -22 87 -59l-12 -3q-20 10 -76 42v-13q0 -56 73 -56q164 0 177 15q35 40 35 93l-61 -50q-38 -28 -71 -31q12 11 12 18t-15 14q27 11 73 46v24l3 -4l3 3l-4 4 l-2 -3v20q13 -9 18 -9q20 0 20 19t-21.5 51.5t-19.5 47.5q-10 -16 -10 -35t16.5 -35.5t16.5 -22t-6 -10.5q-3 3 -14 9v16q-22 24 -22 36l9 62q0 79 -25 108.5t-121 29.5q-21 0 -55.5 -9.5t-34.5 -25.5v-33l38 8q42 0 42 -39zM984 962v11h-6v-11h6zM1209 719q2 7 -9 33 l-4 -25l4 -8h9zM758 1180v4h-17v-4h17zM972 965h-4l-3 -10l4 -2zM735 1208l-3 14q-9 -3 -21 -24q0 -8 8 -14q6 8 16 24zM962 956h-5l-4 -15h6zM1233 623l14 -39l-1 -2h7q-11 38 -13 102.5t-5 67.5q-6 -2 -18 -4q6 -44 6 -57l-9 -42q0 -2 3 -9h10q-7 5 -12 12l5 6h9 q7 -4 9 -12q-5 -19 -5 -23zM1158 752q-18 0 -18 -21t18 -21q8 0 18 9v20q-13 13 -18 13zM950 950h-5l-3 -19h5zM695 1214l7 24v17q-12 -10 -13.5 -36t-4 -31.5t-13.5 -19.5t-11 -18.5t11 -4.5q18 13 20 32zM1197 697v-5q0 -30 3 -37l12 25q-15 5 -15 17zM690 1151 q16 11 16 26t-1 19q-3 -20 -15 -45zM936 941h-4l-3 -10l4 -2zM923 922v16h-6v-16h6zM702 1148l-1 5l-17 -14l3 -4zM1157 677v-10q5 -6 9 -6h3l7 7l-9 9h-10zM911 935h-5l-3 -22h5zM1128 704q-19 0 -19 -20t19 -20q8 0 20 12v16q-13 12 -20 12zM710 1139q-24 -8 -47 -28h12 q15 8 35 28zM1158 641q-8 0 -15 -16h17q6 0 13 16h-15zM1209 579l-3 13h-5l3 -13h5zM1251 549l-3 3l-14 -17l5 -3zM660 1081v-9q5 -3 16.5 -3t22.5 7l-13 -1h-8l38 21q-6 -1 -20.5 -4.5t-21.5 -3.5l33 30q-47 -20 -47 -37zM1230 577l-33 -6q-8 0 -14 6v-19q5 -6 11.5 -6 t41.5 9q-4 6 -6 16zM1272 519h-2v-39l2 1v38zM1146 616h-25q37 -11 69 -15q-29 15 -44 15zM1246 513v3q0 6 -9 6h-1v-2q-2 -3 -2 -6v-13q12 6 12 12zM720 1016q14 0 15 23q-8 -6 -36 -23h21zM1176 546v25h-6v-25h6zM843 853h53q68 0 78 9q0 7 7 15l-9 3q-27 -8 -225 -8 q32 -19 96 -19zM1246 498l-21 -6l-9 -14h38q4 5 7 11q-4 9 -15 9zM705 989q7 -6 16.5 -6t25.5 17q-17 -7 -42 -11zM675 1009l36 -8q16 0 30 17q-28 -9 -45.5 -9t-35.5 7q21 5 46 12t25 23q0 8 -11 9q-23 -8 -69 -26q8 0 12 -3q-9 -17 -28 -22l6 -14h10q20 14 24 14zM873 838 q44 0 99 10h-208q65 -10 109 -10zM1224 547q-11 0 -17.5 -12t-11.5 -13v21q-10 -12 -10 -30.5t7 -58.5q13 7 18 17q-9 4 -16 13q15 13 30 18v45zM1240 448h15l3 11l-33 4q-3 -3 -3 -12q5 -3 18 -3zM1159 540l-7 22q0 3 10 33q-50 15 -82 30v-28l3 7q2 -12 5 -37q0 11 4 16 l4 -4v-26q0 9 6 27q6 -45 6 -66q0 33 3 54h2q3 -15 3 -35q0 15 6 34q1 -18 6 -51q1 10 6 30q4 -19 4 -33l6 21q3 -10 3 -27q1 7 6 21l6 -15v27zM683 991v4h-11v-4h11zM1197 415l24 2h16l11 -2l-2 -6l2 -6q16 3 16 22.5t-19.5 19.5t-26.5 -18q-8 8 -14 11q4 5 9 18 q-8 -5 -16 -12v-29zM957 838l-30 -6h-171q1 -35 9 -89q3 12 29 47h94q41 0 60 -59q21 45 21 57v50h-12zM1258 391q-6 6 -14 6t-14 -13l6 -6h19zM626 1007q-7 8 -16.5 8t-16.5 -14q10 3 33 6zM704 976q-33 10 -61 10t-52 -39q54 33 74.5 33t38.5 -4zM659 974q-22 0 -38 -24 h21q18 0 38 17q-14 7 -21 7zM356 1318v-446q12 4 23.5 13t13.5 9t6 -1q-17 -9 -17 -19t6 -16q7 15 18 15t13.5 -29.5t15.5 -30.5q19 29 19 49.5t-13 33.5l3 1h1q17 -7 17 -21t-3.5 -28.5t-2.5 -22.5l40 35q10 4 27 16q22 27 41 61q0 7 -7 12q45 8 69 48h-20q-5 0 -11 -7 q-6 -8 -14 -5q0 20 32 34t38 42q2 7 2 48.5t8.5 56t13 26.5t5.5 60q-26 14 -74 46l26 20h-276zM1182 435q0 19 -9.5 25t-17.5 12q15 10 16 20h-18q-11 0 -34.5 -19.5t-23.5 -34t18.5 -55.5t33.5 -41q67 0 77 67h-9l-26 -27q-13 0 -21 2q5 3 5 12q5 4 9 9q-4 7 -30 24 q20 0 30 -5v11zM1222 297q11 10 11 23.5t-21 31.5q2 -19 10 -55zM626 800l2 14q0 15 -18 15t-18 -18q0 -12 8.5 -16.5t8.5 -6.5q-24 -6 -24 -14q0 -23 16 -23q12 0 16 10t7 19q7 -3 8 -24q4 1 13 4q-6 8 -17 25q14 -7 20 -7q17 0 17 17t-25 18q-5 -4 -14 -13zM867 770h-34 q-2 0 -35 -1q-19 -20 -43 -69q-1 -20 -5 -62q-6 -19 -12 -47t-18 -64q-26 -63 -22 -78q5 -55 65 -55h34q2 0 35 1q19 20 44 69q0 20 4.5 50.5t10.5 67.5q17 41 42 125v8q-6 55 -66 55zM1002 364l-2 -14q0 -15 18 -15t18 18q0 12 -8.5 16.5t-8.5 6.5q24 6 24 14q0 23 -16 23 q-12 0 -16 -10t-7 -19q-7 3 -8 24q-4 -1 -13 -4q6 -8 17 -25q-14 7 -20 7q-17 0 -17 -17t25 -18q5 4 14 13zM406 867q-10 -10 -10 -23.5t21 -31.5q-3 19 -11 55zM510 691.5q24 19.5 24 34t-19 55.5t-34 41q-67 0 -76 -67h9l25 27q13 0 21 -2q-5 -3 -4 -12q-6 -4 -9 -9 q3 -7 30 -24q-21 0 -30 5v-11q0 -19 9 -25l18 -12q-16 -10 -17 -20h18q11 0 35 19.5zM1272 -154v446q-12 -4 -23.5 -13t-13.5 -9t-5 1q16 9 16 19t-6 16q-7 -15 -16 -15q-13 0 -15.5 29.5t-14.5 30.5q-20 -29 -20 -49.5t14 -33.5l-3 -1h-2q-16 7 -16 21t3 28.5t3 22.5 l-41 -35q-10 -4 -27 -16q-22 -27 -41 -61q0 -7 8 -12q-46 -8 -69 -48h19q5 0 11 7t15 5q-1 -20 -33 -34t-38 -42q-1 -7 -1 -48.5t-9 -56t-13.5 -26.5t-4.5 -60q25 -14 73 -46l-26 -20h276zM988 214q-19 0 -38 -17q14 -7 21 -7q22 0 38 24h-21zM1039 217q-55 -33 -75 -33 t-38 4q33 -10 60.5 -10t52.5 39zM1004 157q7 -8 16.5 -8t16.5 14q-11 -3 -33 -6zM384 767q8 0 15 13l-6 6h-20l-3 -13q6 -6 14 -6zM673 326l30 6h171q-1 35 -9 89q-3 -12 -29 -47h-94q-41 0 -60 59q-21 -45 -21 -57v-50h12zM432 749l-24 -2h-17l-10 2l1 6l-1 6 q-17 -3 -17 -24q0 -18 19.5 -18t27.5 18q7 -8 13 -11q-4 -5 -9 -18q8 5 17 12v29zM958 169v4h-11v-4h11zM469 624l8 -22q0 -3 -11 -33q50 -15 83 -30v28l-3 -7q-3 12 -6 37q0 -11 -3 -16l-5 4v26q0 -9 -6 -27q-6 45 -6 66q0 -33 -3 -54h-1q-4 15 -4 35q0 -15 -5 -34 q-2 18 -6 51l-6 -30q-5 19 -5 33l-6 -21q-3 10 -3 27q-1 -7 -6 -21l-6 15v-27zM388 716h-15l-3 -11l33 -4q3 3 3 12q-5 3 -18 3zM433 621q11 12 11 30.5t-8 58.5q-13 -7 -18 -17q9 -4 17 -13q-16 -13 -30 -18v-45q10 0 16.5 12t11.5 13v-21zM757 326q-44 0 -99 -10h208 q-65 10 -109 10zM955 155l-36 8q-16 0 -30 -17q27 9 44.5 9t36.5 -7q-21 -5 -46 -12t-25 -23q0 -8 11 -9q23 8 69 26q-9 0 -12 3q8 17 28 22l-6 14h-10q-20 -14 -24 -14zM925 175q-7 6 -17 6t-25 -17q17 7 42 11zM382 666l21 6l9 14h-37q-5 -5 -8 -11q4 -9 15 -9zM787 311 h-53q-69 0 -78 -9q-1 -7 -7 -15l9 -3q27 8 225 8q-32 19 -96 19zM459 593v25h-6v-25h6zM910 148q-15 0 -15 -23q8 6 36 23h-21zM394 650v13q-12 -6 -12 -12v-3q0 -6 9 -6h2v2q1 3 1 6zM482 548h26q-38 11 -69 15q28 -15 43 -15zM358 645v39l-2 -1v-38h2zM399 587l33 6 q7 0 13 -6v19q-5 6 -11.5 6t-40.5 -9q3 -6 6 -16zM970 83v9q-6 3 -17 3t-22 -7q12 1 13 1h8l-38 -21q6 1 20 4.5t22 3.5q-12 -10 -33 -30q47 20 47 37zM394 629l-4 3l-12 -17l3 -3zM427 572l-3 13h-4l3 -13h4zM469 539q-7 0 -14 -16h15q8 0 15 16h-16zM967 53h-12 q-15 -8 -35 -28q24 8 47 28zM500 460q20 0 20 20t-20 20q-8 0 -19 -12v-16q12 -12 19 -12zM727 251h-5l-3 -22h5zM472 487v10q-6 6 -9 6h-3l-8 -7l9 -9h11zM946 25l-3 4l-15 -13l1 -5zM713 226v16h-6v-16h6zM701 233l-4 2l-3 -12h4zM940 13q-16 -11 -16 -26t1 -19 q2 20 15 45zM958.5 -4q11.5 14 11.5 18.5t-11 4.5q-18 -13 -20 -32l-4 -37q-1 -4 -4 -12t-3 -12v-17q11 10 13 36t4 31.5t13.5 19.5zM431 467v5q0 30 -3 37l-12 -25q15 -5 15 -17zM688 233h-5l-3 -19h5zM488 433q0 21 -18 21q-8 0 -18 -9v-20q13 -13 18 -13q18 0 18 21z M406 473l9 42q-1 2 -3 9h-11q7 -5 12 -12l-4 -6h-9q-8 4 -9 12q4 19 4 24.5t-7 18.5t-6 19v2h-7q11 -38 13 -102.5t6 -67.5q5 2 18 4q-6 44 -6 57zM677 223h-6l-3 -15h5zM919 -34q0 8 -8 14q-6 -8 -16 -24l3 -14q8 3 21 24zM665 209l-4 2l-3 -12h4zM889 -20v4h-17v-4h17z M419 445q-1 -3 -1 -5.5t10 -27.5l5 25l-5 8h-9zM652 191v11h-6v-11h6zM692 73l-9 -62q0 -79 24.5 -108.5t121.5 -29.5q21 0 55.5 9.5t34.5 25.5v33l-38 -8q-42 0 -42 39l5 66q0 15 -3 30q-33 0 -39 2q11 4 24 4q28 0 28 -25q0 -11 -3.5 -30.5t-3.5 -29.5q4 6 15 18 q0 -12 -6 -21.5t-6 -10.5l4 -7q9 24 42 28l5 8l10 -6v39q0 39 -31 96t-66 57q-55 0 -102 -42q5 18 39.5 31.5t53 13.5t61.5 -23v27q0 6 -34 30h4q12 0 28 -18t23 -19l5 10q-14 22 -87 59l12 3q20 -10 76 -42v13q0 56 -73 56q-165 0 -177 -15q-35 -40 -35 -93l61 50 q37 28 71 31q-12 -11 -12 -18t15 -14q-28 -11 -73 -46v-24l-3 4l-3 -3l4 -4l2 3v-20q-13 9 -18 9q-20 0 -20 -19t21.5 -51.5t19.5 -47.5q10 16 10 35t-16.5 35.5t-16.5 22t6 10.5q3 -3 14 -9v-16q22 -24 22 -36zM886 -35h-11l-3 -5zM361 457q7 4 7 10t-3.5 14t-3.5 12v-36z M436 376q0 -8 10 -8q4 3 11 9v20q-5 2 -12 9l-6 -3q0 -9 4 -14q-7 -16 -7 -13zM643 188l-5 2l-3 -8l5 -1zM877 -50l-8 3q2 -8 5 -11zM415 394v4h-14v-4h14zM653 163q-4 6 -20 6t-16 -15v-23q15 10 23 26q-5 -3 -15 -5l-3 2q7 9 25 9h6zM431 329v9h-6v-9h6zM611 149 q0 8 -13 14q1 -10 6 -23q7 1 7 9zM385 452q0 7 -5 11l-24 -59v-100q29 72 29 148zM626 98v27h-6v-27h6zM614 98v29h-4v-29h4zM599 175l-15 3q-21 0 -21 -25t42 -52v18q0 8 -18 27l-6 -6q-7 8 -7 18q11 12 25 17zM550 158v8h-5v-8h5zM532 160q0 -18 22 -29q-13 41 -13 30 q0 14 19 18l-10 5q-18 -6 -18 -24zM665 31v16h-4v-16h4zM388 347l4 35l-1 10q-17 -69 -35 -108v-36h6v-6h-6v-31q22 26 46 87t25 84q-29 2 -29 -27q0 -4 7 -11.5t8 -9.5q-2 -5 -9 -5q-16 0 -16 18zM515 172q-6 0 -13 -3q2 -22 18 -29l-11 20l2 4l9 -12l-2 20h-3zM499 161 q0 18 22 24q-2 1 -6 2q-25 0 -25 -29.5t21 -29.5h13q-25 22 -25 33zM587 92l-24 -6q-22 0 -18 30q-10 -5 -10 -15q0 -24 22 -24q9 0 35 14q-2 0 -5 1zM664 -37q0 15 -29 123q4 -43 9.5 -96t19.5 -66v39zM686 -59q0 22 -17.5 60t-19.5 57l-2 -6q12 -49 39 -143v32zM644 -28 q0 24 -24 63l24 -99v36zM632 -28q0 23 -12 36t-14 21.5t-7 32.5q-3 0 -8.5 -0.5t-7.5 -0.5q11 6 33 6q-4 10 -11 10q-14 -6 -27 -6h-1l6 9l-32 -12v-10q3 -8 36 -8l9 -1q0 -27 26 -53q3 -17 10 -51v27zM619 -41q0 51 -39 79q-11 2 -29 11q-7 14 -25 39l-37 26q-5 5 -5 49 q0 10 12 34q-24 32 -68 84l2 15q-8 -5 -20 -18q-17 -27 -52 -76v-356h231l-35 17l-3 6l45 43q23 24 23 47zM1248 865h-6v13h6v-13zM1244 853l-2 -6q-5 4 -12 13h11zM891 1231l-25 -9q-6 2 -5 6l-1 -2v-10q4 -4 10 -6q-13 -5 -33 -11q2 4 3 11l-3 9q-6 -3 -9 -17q-6 9 -6 14 q0 21 36 21h27q25 0 36 -17q-29 11 -30 11zM902 1174q-2 1 -4.5 1t-7.5 -3v12q-25 -12 -41 -13l-4 -11q-14 13 -14 20q0 19 33 19l25 -3q17 -3 23 2v-20l-10 -18v14zM992 1042h-5l-3 15h5zM987 1031l-7 -10l-3 3l6 10zM960 1024l-3 1l3 14v-15zM824 1058h-30q-6 0 -15 2 l-3 10q16 5 24 5h16q3 0 23 -3v-12q-10 -2 -15 -2zM812 1034l-17 3v6l17 -3v-6zM813 1024h-18v4h18v-4zM879 928h-9v6h9v-6zM851 925h-8v6h8v-6zM834 928h-16v6h16v-6zM616 1181.5q18 -17.5 18 -35t-14.5 -38.5t-29.5 -21q-63 0 -73 59q-9 -7 -9 -29t16 -67h-47q16 61 16 66 q0 18 -10 30l-15 -38q-8 -19 -43 -19q-58 0 -58 55t56 55q26 0 42 -16l6 5v6q-26 18 -26 51q0 53 56 53q21 0 39.5 -18t18.5 -39.5t-35 -50.5l9 -7q12 16 38.5 16t44.5 -17.5zM779 421q-16 0 -19 51q-11 -10 -24 -9q14 11 20 21q-32 10 -29 29.5t45 27.5q-3 10 -6 33 q8 -5 16 -14q0 3 2.5 14.5t5 20t2.5 12.5q-10 -10 -21 -11q4 11 24 27l-22 8q-11 4 -8 20t40 29q-4 10 -10 30q12 -7 19 -15q25 48 37 48q16 0 19 -51q11 10 24 9q-14 -11 -20 -21q33 -10 29 -30q-3 -19 -45 -27q3 -10 6 -33q-8 5 -15 14q-4 -7 -9 -22q-2 -23 -2 -25 q11 10 21 11q-4 -11 -24 -27l22 -8q11 -4 8 -20t-40 -29q4 -10 10 -30q-12 7 -19 15q-24 -48 -37 -48zM1261 20q0 -55 -56 -55q-26 0 -42 16l-6 -5v-6q26 -18 26 -51q0 -53 -56 -53q-21 0 -39.5 18t-18.5 39.5t35 50.5l-9 7q-12 -16 -38.5 -16t-44.5 17.5t-18 35t14.5 38.5 t29.5 21q63 0 73 -59q9 7 9 29t-16 67h47q-16 -61 -16 -66q0 -18 10 -30l15 38q8 19 43 19q58 0 58 -55zM812 230h-16v6h16v-6zM787 233h-8v6h8v-6zM760 230h-9v6h9v-6zM835 136h-18v4h18v-4zM835 121l-17 3v6l17 -3v-6zM830 89h-16q-4 0 -23 3v12q10 2 15 2h30q5 0 15 -2 l3 -10q-17 -5 -24 -5zM673 139l-3 -14v15zM653 140l-6 -10l-4 3l7 10zM646 107h-5l-3 15h5zM799 -16q0 -19 -33 -19l-25 3q-17 3 -23 -2v20l10 18v-14q2 -1 4.5 -1t7.5 3v-12q25 12 41 13l4 11q14 -13 14 -20zM739 -67l25 9q6 -2 5 -6l1 2v10q-4 4 -10 6q12 5 33 11 q-2 -4 -3 -11l3 -9q5 3 9 17q6 -9 6 -14q0 -21 -36 -21h-27q-26 0 -36 17q29 -11 30 -11zM398 304h-10l-3 7l1 6q5 -4 12 -13zM386 286h-6v13h6v-13zM852 1211l-3 14h-4l3 -14h4zM876 1186h-19l3 -8q9 1 16 8zM849 734q-18 0 -23 -31q0 -6 -1 -18l9 -5q4 1 20 14q3 40 -5 40 zM875 670q-16 0 -19 -16.5t13 -16.5q11 0 21 9l2 10q-11 14 -17 14zM831 634q26 21 1 37q-8 -7 -10 -19.5t9 -17.5zM794 634q13 0 16.5 18t-13 18t-20 -18t16.5 -18zM821 619q-15 0 -22 -37t9.5 -37t23.5 37t-11 37zM836 530q-13 0 -16.5 -18t13 -18t19.5 18q1 3 1 5 q0 13 -17 13zM798 493q10 9 10 23q0 10 -9 14q-26 -21 -1 -37zM761 527q-11 0 -21 -9l-2 -10q11 -14 17 -14q16 0 19 16.5t-13 16.5zM781 430q18 0 24 31q-1 6 0 18l-8 5q-5 -1 -21 -14q-3 -40 5 -40zM773 -22l-3 8q-10 -1 -16 -8h19zM785 -61l-3 14h-4l3 -14h4z" />
+<glyph unicode="&#x1f0dd;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM316 1353q0 -88 -82 -103q18 -11 26.5 -11t22.5 4l-13 -32 q-3 -1 -13 -1.5t-34 11t-36.5 11.5t-22.5 -9l-11 17q10 10 20 15q-66 25 -66 99q0 46 29 75t75 29t75.5 -29.5t29.5 -75.5zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5 q29 0 36 -29v18q0 40 -19 70q8 -3 24 -3t24 3q-19 -30 -19 -70v-18q7 29 35 29zM1284 -166h-940v1496h940v-1496zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10 q-21 32 -21 37q0 39 38 39t38 -39q0 -7 -20 -37q20 10 23 10zM1521 -190q0 -46 -29 -75t-75 -29t-75.5 29.5t-29.5 75.5q0 88 82 103q-18 11 -26.5 11t-22.5 -4l13 32q3 1 13 1.5t34 -11t36.5 -11.5t22.5 9l11 -17q-10 -10 -20 -15q66 -25 66 -99zM1272 1318h-96 q-22 -21 -22 -86t31 -99q3 -3 9 -14q-21 -1 -45.5 -2.5t-48.5 -24.5q30 -38 79 -76l93 -72v374zM1143 1249q0 34 24 69h-168q12 -26 53 -44q-2 21 2 32q4 -9 10 -32l29 24q16 13 24 10q1 -2 5 -6q-24 -23 -33.5 -26t-17.5 -11q14 -5 45 -19v-2q-14 2 -33 3h-15q8 -17 25 -48 q19 -17 53 -50l-5 -3q-24 8 -67 44q-9 13 -23 67q-55 13 -74 61h-34q57 -81 68 -94q45 -59 79 -82l25 -17h62q-34 43 -34 124zM1025 1070q-8 14 -22 44l-27 102q-30 98 -60 98l-13 -2q4 -1 11 -4q23 -28 51 -109t60 -129zM1099 971q-12 20 -41.5 45.5t-41 39.5t-25.5 53 l-54 144q-26 60 -51 60h-1h-14q16 -6 40 -25q12 -17 29 -68.5t44 -122.5q46 -107 115 -126zM845 1319h-14q5 -6 40.5 -22t41.5 -40q40 -151 69.5 -207t80.5 -99.5t89 -49.5q11 -3 35 -9q-36 34 -53 43q-22 8 -64 30q-69 55 -98 139l-56 162q-10 21 -22 28q-38 25 -49 25z M741 1314l-1 4l-12 -6l1 -4zM759 1316h-9q-8 1 -22 -24q12 5 31 24zM723 1313l-3 1l-4 -8h4zM797 1029l22 -4q5 0 51 12q73 46 73 62.5t-15.5 78t-17.5 73.5t-11 20q-23 9 -59.5 27t-52.5 18q5 0 -52 -26q2 -41 6.5 -108t55.5 -153zM955 1086l-69 -47q-33 -22 -64 -22 t-42 21q-13 -4 -29 -14q101 -14 115.5 -14t113.5 16zM875 1004l-128 10h-12q51 -20 132 -20q2 0 51.5 5t72.5 6q-2 4 -6 9q-3 1 -9 1l-26 -5q-29 -6 -75 -6zM982 957l-39 27q-6 0 -16 -18.5t-20.5 -18.5t-23 15.5t-20.5 15.5t-20.5 -15.5t-21 -15.5t-22 18.5t-22.5 18.5 t-22 -13.5t-19 -13.5q-12 0 -25 45h-10q-16 -16 -35 -30q6 -5 17 -11q73 -27 166 -27t190 22q-2 4 -28 30q-22 -29 -29 -29zM1097 610l-11 37q11 9 21 9t17.5 -10t15.5 -16h10q0 15 1 43q8 12 21 12t19 -13.5t10 -25.5h13q2 13 5 30t15 17q18 0 26 -50h15q-4 25 0 49 q-28 6 -53 6q-102 0 -184 -83q16 4 46 -19h13v14zM975 936h-26q-70 -61 -120 -179q63 111 146 179zM1147 546q-42 0 -42 -37q0 -23 12 -37q22 17 60 59q-9 15 -30 15zM771 783q-20 107 -71 165q-5 1 -15 4q54 -75 86 -169zM799 800q0 -9 3 -12q-2 -2 -13 -1q0 -10 4.5 -10 t10.5 5l7 -5h9q0 2 3 6q-3 3 -11 4q-1 4 -3 13h-10zM283 1353q0 77 -71.5 77t-71.5 -77t71.5 -77t71.5 77zM1156 335q1 3 18.5 11t27.5 8t24 -34v150l-105 -125l25 -51q0 6 3 8q5 -5 5 -8q0 7 2 41zM515 999l6 -10q2 3 10 3q15 0 15 -10.5t-11 -15.5q9 0 19 -5q-8 -3 -15 2 l1 -11q-11 -13 -13 -13t-22 13v3q-15 -14 -17 -21q7 3 27.5 -11.5t26 -14.5t13.5 8t18 4q-5 -31 -44 -31t-58 37q2 -33 39 -79q6 6 134 120q-7 23 -7 49q0 72 63 189q8 16 8 31.5t-3 78.5l3 3h-352v-599q25 19 30 95l-4 41q-1 26 6 35t42.5 26t35.5 25t-9 15q-10 4 -28.5 13 t-18.5 28t4 26q-1 -11 25 -25t30 -21t11 -35q5 5 23 17h-8l-8 18q0 11 12 11.5t16 -8.5q-5 9 0 19zM776 772v9h-5v-9h5zM1224 284q1 29 -17 46q-2 5 -5 5q7 -18 22 -51zM541 980q0 6 -4 9l-12 -3l3 -13h9q4 1 4 7zM1182 321q-2 4 -7 7q-2 -2 -4 -6q2 -2 11 -1zM1214 278 q0 -17 -14 39q-4 1 -10 5q4 4 8 4q-2 2 -3 7h-13q6 -21 19 -62q13 -2 13 7zM995 554l20 2q12 0 35 -8q7 7 7 12t-15.5 18.5t-12.5 27.5q-58 -59 -58 -157q0 -39 26 -108q-3 28 38 40v15l-34 -1q-22 -1 -22 20q0 17 22 21t24 12q-2 2 -26.5 9t-21.5 27q7 11 29 11t27 8 q-6 9 -23 17.5t-17 17.5zM512 973q0 -7 3 -10q6 0 9 3q-1 2 -3 7h-9zM535 951q0 6 -3 9l-13 -3l3 -12h10q3 0 3 6zM508 968q2 12 0 15h-15l3 -15h12zM1195 266q-4 18 -17 49l-4 -9q5 -12 11 -43q-4 0 10 3zM1176 255l-11 57q0 -52 -1 -57h12zM1159 269l-6 12l-4 -1l6 -12z M519 913l-14 9l-2 -4l15 -9zM523 900q-9 0 -39 26q8 -31 45 -31q4 0 17 6q2 -1 -23 -1zM460 974q-3 8 -20 15t-21 13q-1 -20 39 -39q-8 6 -27 19q12 0 29 -8zM861 572q0 8 -26 16l15 9q6 9 6 18q0 21 -21 21q-16 0 -20 -12v-22q-15 15 -23 15q-23 0 -23 -19q0 -23 19 -23 q7 0 24 9q-4 -6 -21 -29q2 1 14 -6q0 12 11 29q2 -3 4.5 -18.5t21.5 -15.5t19 28zM1205 174q-2 23 -37 36q17 -15 25 -17q1 -1 -2 -4q-10 5 -35 24q1 -16 25 -27zM1139 257q-23 21 -36 21t-33 -9q19 4 50 -17q-5 9 -26 21q2 3 6 3t36 -24q3 2 3 5zM458 918h-13q4 -16 12 -44 q0 39 1 44zM451 853q-4 20 -12 57q-4 -1 -10 -3q4 -19 16 -54h6zM1107 208v15l-15 -3l3 -12h12zM1131 182q1 11 0 15l-13 -3l3 -12h10zM1115 195v10h-10v-10h10zM436 848q-9 22 -13 54h-10q5 -29 13 -54h10zM1238 347l-6 -67q-2 -2 -15.5 -9.5t-36 -18t-22.5 -17.5 q0 -12 22 -23q34 -19 34 -42q0 -9 -6 -15q-14 21 -24 25q-6 0 -16 4q-14 11 -24 39l-26 -20q5 1 12 2q9 -10 9 -15q0 -14 -13 -14q-5 0 -10 5q2 -6 -2 -13q-1 4 -5 13q-8 -8 -12 -8q-10 0 -13 10q1 7 1 17q-2 0 -7 4q2 3 13 2q-14 23 11 23q7 0 11 -11q2 1 6 5q3 -2 3 -10 q6 6 15 17q-15 7 -28.5 20t-29.5 13l-27 -12h-3q18 33 42.5 33t38.5 -12l25 -22l-41 78l-131 -121l6 -45q0 -35 -7.5 -60t-42 -93t-34.5 -96.5t11 -66.5h356v708q-34 -54 -34 -90v-117zM1102 179q1 12 -1 15l-15 -3l3 -12h13zM394 884q0 5 19 -41h10q-5 17 -23 52zM465 857 q-26 -23 -40.5 -23t-20 11t-10.5 23l15 -144l92 118l-39 76q0 -13 9 -22q-2 -2 -7 1q0 -4 1 -18t0 -22zM1345 -189q0 -77 71.5 -77t71.5 77t-71.5 77t-71.5 -77zM832 402v12q-9 0 -11 -2q-5 5 -6.5 5t-13.5 -6q1 -7 8 -9t3 -13h10q1 14 10 13zM936 224q-60 88 -83 170 q9 -75 64 -162zM657 724q0 47 -28 113q-3 -28 -36 -45v-12q16 -2 31 -3q21 -4 21 -20q0 -4 -1 -8q-6 -4 -35 -13q-1 -1 -5 -8l24 -13q18 -9 18 -21t-42 -15q-5 -1 -8 -3q1 -7 17.5 -16.5t16.5 -20.5q0 -15 -58 -15v-12q21 -16 21 -36q0 -14 -15.5 -14t-35.5 15h-13 q4 -16 11 -48l-20 -9q-4 0 -15.5 11.5t-14.5 11.5h-14q-2 -5 -2 -26t-20 -21q-12 0 -19 16.5t-8 17.5h-15q0 -47 -18 -47q-14 0 -23 41q-1 3 -5 9q-7 0 -10 -4v-51q6 7 25 4l28 -4q102 0 175 73.5t73 172.5zM502 646l4 28q0 5 -7.5 16t-13 11t-54.5 -56q0 -8 11 -14.5 t25.5 -6.5t34.5 22zM789 420q-61 -121 -143 -175h31q87 91 112 175zM846 194l40 27q16 0 21 -16t10 -29q14 9 44 30q-66 36 -181.5 36t-189.5 -20q6 -11 27 -25q5 26 19 26t24 -13t20 -16q5 4 12 19t21 15t29 -14t22.5 -14t17 14t21 14t24.5 -17t19 -17zM633 155h22 q3 0 17 5q20 6 89.5 6t90 -6.5t38.5 -0.5q-86 17 -112 17l-145 -11v-10zM669 87q13 14 33 25l44 26q26 14 48 14h24q26 -18 30 -18q-12 0 25 12l-107 14q-56 0 -122 -14q8 -20 25 -59zM875 -50q-5 1 -13 2q5 -5 6 -12q3 1 7 10zM843 -48q-5 -1 -13 -2q2 -2 4 -5.5t3 -4.5 q2 8 6 12zM844 16l-14 -35v-24q24 3 53 0v23q1 26 -19.5 87.5t-42.5 77.5q-38 0 -58.5 -8t-53.5 -32.5t-33 -33.5q0 -2 12.5 -43t16 -65t27.5 -69l51 -18q6 -2 46 -28q14 17 45 33q12 6 12 12.5t-2 27t-2 31.5q0 -8 -6 -17l-30 -5q-5 0 -15 5v-10q5 -10 21 -12t26 -8 q-2 -2 -17 -2q-39 0 -39 48q0 25 16 67q-27 17 -20 24q12 -15 19 -16.5t7 -9.5zM904 -154v21l-12 -21h12zM899 -117l-4 8q-6 -8 -43 -35q-1 -4 -3 -10h17q4 7 18.5 20t14.5 17zM807 -154q-10 8 -44.5 20t-46.5 34q-17 57 -60 189q-4 6 -11 21q-16 44 -68 94t-97 65 q0 1 -45 9q18 -19 62 -41.5t51 -27.5q69 -45 99 -119l41 -133q7 -28 33 -74q9 -8 86 -37zM757 -154h20q-7 5 -20 12q-53 22 -73 77l-25 93q-49 141 -140 176q36 -29 95 -96q18 -30 35.5 -95.5t29.5 -89t40.5 -50.5t37.5 -27zM737 -154q-66 44 -90 138.5t-61 136.5 q28 -46 52.5 -136t64.5 -139h34zM483 50q-12 0 -34 -4q31 -43 31 -96.5t-24 -103.5h173q0 9 -21 28t-32 21q1 -24 -2 -39q-3 13 -12 39q-21 -18 -59 -44q-4 4 -4 6q0 8 20 23l35 27q-12 4 -47 20q5 5 20 0t18 -5h9v11q0 17 -69 87q2 1 10.5 1t33.5 -18.5t28 -25.5 q15 -34 17 -58q77 -37 75 -73h34q-4 20 -88.5 112t-111.5 92zM356 -154h74q13 16 29 43q6 22 6 49t-30 117l-31 67l56 7q34 5 53 27q-27 37 -157 135v-445zM897 1264h-4q-26 0 -67 13h9q29 -2 62 -13zM862 1251l30 -2l3 -27h-39q-16 0 -33 11q10 5 16 11.5t23 6.5zM741 1240 q4 11 19 11t32 -8l2 9q-1 15 -16 18l-30 7h28q10 0 18 -15t8 -17t-16 -82q16 -9 20 -25q-6 9 -17 15t-11 15l13 45q0 7 -2 9h-48v18zM823 1153q-7 -3 -29 11h12q11 -11 17 -11zM810 1107q-22 0 -32 -5q0 5 1 10q8 3 62 5v-18q-9 8 -31 8zM828 1083h-22q-7 0 -17 10 q12 0 38 3q1 0 1 -13zM823 1061l-23 -3v5l23 3v-5zM616 1181.5q18 -17.5 18 -35t-14.5 -38.5t-29.5 -21q-63 0 -73 59q-9 -7 -9 -29t16 -67h-47q16 61 16 66q0 18 -10 30l-15 -38q-8 -19 -43 -19q-58 0 -58 55t56 55q26 0 42 -16l6 5v6q-26 18 -26 51q0 53 56 53 q21 0 39.5 -18t18.5 -39.5t-35 -50.5l9 -7q12 16 38.5 16t44.5 -17.5zM1261 20q0 -55 -56 -55q-26 0 -42 16l-6 -5v-6q26 -18 26 -51q0 -53 -56 -53q-21 0 -39.5 18t-18.5 39.5t35 50.5l-9 7q-12 -16 -38.5 -16t-44.5 17.5t-18 35t14.5 38.5t29.5 21q63 0 73 -59q9 7 9 29 t-16 67h47q-16 -61 -16 -66q0 -18 10 -30l15 38q8 19 43 19q58 0 58 -55zM825 114h-14q-9 -1 -10 7q17 0 24 -7zM829 84q-10 6 -25 6t-11 -3v13h25q10 0 15 -9q-3 -3 -4 -7zM843 66l-60 -2q0 2 -1.5 10t-1.5 10q9 -10 32.5 -10t33.5 4q-3 -2 -3 -12zM818 17q-6 10 -12 10 t-8 -3q-1 8 5 8t27 -15h-12zM766 -73l-36 8v26q2 -7 18 -4l24 4q-11 0 29 -12q-34 -22 -35 -22zM887 1237h1q0 1 -14 3q0 -3 -1 -6t-1 -7q4 4 15 10zM849 1228q-3 5 -9 10q-1 -2 -5 -4q4 -1 14 -6zM791 1231l-7 7q0 -4 -6 -10q5 1 13 3zM759 1228q-4 4 -10 15q-1 -5 -3 -13 q5 -1 13 -2zM786 -51q-6 0 -14 4q2 -4 10 -10q1 6 4 6zM747 -50q-4 -2 -10 -6q2 -2 8 -4q0 6 2 10z" />
+<glyph unicode="&#x1f0de;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM302 1252h-82v25h22l-64 81l66 71h-24v26h80v-26h-22l-62 -71 l64 -81h22v-25zM203 1429h-25v-152h23v-25h-80v25h25v152h-25v26h82v-26zM1456 110q41 0 41 -38.5t-41 -38.5q-3 0 -23 10q21 -32 21 -37q0 -39 -38 -39t-38 39q0 7 20 37q-20 -10 -23 -10q-40 0 -40 38.5t40 38.5q29 0 36 -29v18q0 40 -19 70q8 -3 24 -3t24 3 q-19 -30 -19 -70v-18q7 29 35 29zM1284 -166h-940v1496h940v-1496zM253 1131q40 0 40 -38.5t-40 -38.5q-29 0 -36 29v-18q0 -40 19 -70q-8 3 -24 3t-24 -3q19 30 19 70v18q-7 -29 -35 -29q-41 0 -41 38.5t41 38.5q3 0 23 -10q-21 32 -21 37q0 39 38 39t38 -39q0 -7 -20 -37 q20 10 23 10zM1507 -291h-82v26h25v152h-23v25h80v-25h-25v-152h25v-26zM1408 -265v-26h-80v26h22l62 71l-64 81h-22v25h82v-25h-22l64 -81l-66 -71h24zM1136 934q13 264 16 264q3 14 19 18q8 -6 17 -17q3 -75 8.5 -192t5.5 -120l70 -39v470h-214q-1 -5 -21.5 -47t-20.5 -53 t5.5 -27.5t8 -40t13.5 -103.5q3 -4 13 -9q7 -5 7 -19.5t-21 -25.5zM1026 1273l-23 -2l-40 19q-2 0 -16.5 -9.5t-27.5 -9.5t-33 11l-20 10q-4 0 -17 -9t-28.5 -9t-29.5 9t-14.5 9t-13.5 -11.5t-26.5 -11.5t-27 10.5t-15.5 10.5t-10 -6l-8 -5l-14 2l8 -23h350q2 7 6 15z M1181 947l-11 123l3 45q3 46 2 62.5t-9 30.5q-7 -6 -11 -50l-16 -459h12l16 7q4 30 4 48q0 10 -1 17q-2 6 -2 16q0 23 6 67q7 66 7 93zM943 1200l9 -35q2 -43 7 -128q3 -6 8 -17q6 3 15 8q-9 60 -12 160q11 -30 17 -90.5t6 -61.5h12v35q-7 41 -7 90v13l21 -133q14 3 10 3v20 v8q0 41 -9 96q-2 10 -24 40q0 -18 -2 -21q-14 21 -20.5 21t-14.5 -7q-1 2 -4 7h-12v-8zM1052 1021q0 9 -8 17h-15q16 -16 9 -33q13 7 14 16zM945 1058v95q0 17 -16 55h-15q13 -45 13 -56v-73q0 -3 -1 -9q-3 -12 7 -55q6 4 20 3q-8 55 -8 40zM1017 991q14 15 14 22t-11 17 h-15q10 -8 10.5 -19t1.5 -20zM958 1001q-12 11 -17 11t-18 -13q-1 60 -16 190q-3 7 -10 19h-9l7 -46v-130q0 -11 12 -35t25.5 -24t25.5 11v17zM1005 1014l-6 6h-15q11 -8 12 -31q6 12 9 25zM969 981q13 11 13 18.5t-13 15.5v-34zM748 1148q-10 -5 -16.5 -5t-11.5 5 q11 -13 13 -13q9 0 15 13zM716 1135q-1 5 -2 13q-5 -2 -10 -6q1 -2 6 -3.5t6 -3.5zM1283 666q0 14 -12 16q-69 0 -89 16q-8 6 -11 6t-15 -7q-19 -12 -34 -12t-17 2q1 19 -19 19t-20 -17q0 -10 12 -15l22 -7l147 -2q-3 -7 2.5 -14.5t11.5 -7.5q22 0 22 23zM672 1000l3 14 q0 14 -18 14q-24 0 -24 -21q0 -29 32 -29q11 0 15.5 2.5t24.5 23.5q5 -21 -40 -38h19q8 -1 22 14.5t14 16.5q-2 -37 -28 -41q18 -3 47 33q-6 -12 -15 -34q11 2 21 14t15 15q3 -8 -1 -16q10 5 15 5t10 -5q-1 10 4 13q12 -15 15 -21q-1 19 0 21q14 -23 24 -29q-10 24 -13 35 l4 4l17 -27q13 -17 37 -13q-12 -1 -19 4q-23 15 -23 27.5t2 14.5q4 -9 12 -23q12 -14 24 -14t22 9t10 17q0 18 -20 18q-10 0 -16 -6v-11q8 0 21 -4q-6 -7 -12 -7q-17 0 -17 17q0 23 34 20v24l-5 26v100q0 -8 -22 45h-166v-60q5 7 15 14l-15 -21q20 18 31.5 18t38.5 -17 q-20 -12 -36 -12q7 0 -34 7l-3 -42q2 -13 2 -25q0 -28 -8 -50q-12 -31 -22.5 -31t-16.5 9l4 4q14 -2 19 -2zM1209 648l-47 -6l44 -4q3 3 3 10zM1209 618v9h-43l-3 -9h46zM684 1109v81q-7 -20 -14 -59l-2 -90q4 10 5 52.5t6 54.5q1 -13 5 -39zM1209 609h-46q5 -6 46 -7v7z M1160 624h-9q1 -3 5 -7q3 3 4 7zM1158 586q0 3 4.5 3t0.5 -6l47 4l-60 3l5 -7q3 0 3 3zM1200 572l-49 4q-12 16 -12 37.5t9.5 30t48.5 11.5q-20 4 -45.5 4t-33.5 -5l-60 -46q33 -5 47 -14.5t48 -54.5q21 14 47 33zM684 1026v28h-5v-28h5zM680 1219.5q0 4.5 -24 44.5t-37 54 h-263v-447l211 98l57 29q1 10 14 29q10 8 18 9q5 128 14.5 153.5t9.5 30zM1141 467q6 10 6 32t-15 42q-32 45 -81 45q-88 0 -88 -96q0 -31 27 -56.5t65.5 -25.5t75.5 53q3 4 10 6zM1089 400q-8 0 -21 -6q1 -2 4 -11q28 -17 32 -17h11q-7 34 -26 34zM463 914l43 -6 q64 -3 142 -73t114 -144q8 -16 27 -32q6 6 12 6v11q2 58 -90 247q-6 12 -14 16q96 -209 96 -265q0 -6 -4 -10l-19 31q-52 96 -128.5 161t-149.5 65q-9 0 -29 -7zM1052 348q7 0 21 23q-3 0 -19 14q-14 -14 -20 -17q7 -20 18 -20zM870 536q23 23 23 51.5t-23 50t-51.5 21.5 t-50.5 -22.5t-22 -49t23 -50.5t50.5 -24t50.5 23zM1039 397l-22 3q-19 0 -23 -33q50 14 45 30zM589 813q-1 0 -21 -19l22 -17q2 4 17 19q-17 17 -18 17zM852 507q3 0 -14 -3q14 -67 26 -101l29 -78q16 -36 51 -95q-24 53 -67 159q-1 6 -32 111q6 3 8 0q134 -252 298 -252 q11 0 23 7h-12q-94 0 -198 103q-11 10 -60 79.5t-52 69.5zM680 664q0 55 -63 95q9 -2 34 36h-12q-23 -11 -33 -19q-2 -6 -8 -15h-21q-3 21 -48 34q5 -12 16 -33q10 0 25 -2q-68 -26 -68 -85q0 -39 25.5 -65.5t67 -26.5t71.5 39q14 3 14 42zM958 -53.5q0 -6.5 24 -41.5 l40 -59h250l-1 444l-258 -121q7 -37 -31 -39q-6 -130 -15 -153.5t-9 -30zM483 592q17 -5 17 -32.5t-9.5 -36.5t-45.5 -9q17 -7 42 -7t35 8l59 46q-41 4 -59 27l-31 41q-1 1 -3 1q-18 -11 -50 -33q22 -2 45 -5zM487 558v9h-4v-9h4zM478 576v10h-49v-10h49zM478 558v11h-46 l-3 -11h49zM959 77l-2 -31q-2 -30 -1 -63q0 -4 5.5 8t7.5 21l1 114q-7 -39 -4 -62.5t-4 -37.5q-3 20 -3 51zM476 552h-44q-1 -2 0 -13h41zM479 530h-47l-3 -9q25 3 50 9zM966 170l-3 -14q0 -12 21 -12t21 22t-27 22t-39 -24q-3 -4 -7 0q16 40 44 39l-13 1q-14 0 -28 -12 q-5 -7 -17 -20q9 37 26 39q-12 0 -23 -11l-21 -22q-3 8 4.5 18t5.5 16q-8 -4 -18 -16.5t-15 -10.5v9l5 7q-17 -6 -23 -3q2 -5 -7 -12q-7 10 -16 27q6 -18 3 -27q-16 32 -35 38q21 -12 21 -40q0 -7 -3 -9q-19 42 -34 42q-5 0 -8 -1q29 0 29 -36q0 -9 -1 -10q-14 37 -40.5 37 t-26.5 -22.5t21 -22.5q7 0 12 6v15q-16 0 -20 2q9 9 14 9q17 0 17 -17q0 -23 -22 -23q-4 0 -8 1t-6 1q5 -15 5 -27v-75q0 -27 6 -50q8 -15 21 -43h163v60q-13 -13 -28.5 -13t-43.5 19q19 12 37 12t33 -7l3 84q3 62 31 62q10 0 14 -9q0 1 -24 1zM937 28l-10 2q1 -1 0 -9 q5 2 10 7zM573 481q0 7 -9 17h-172q9 25 -12.5 25t-21.5 -17.5t15.5 -19.5t36 -3t30.5 -3.5t17.5 -8t10.5 -5.5q-8 0 14.5 9t43.5 9q6 0 10 -12t20.5 -12t16.5 21zM943 24l-3 3l-13 -11l3 -4zM924 20q-11 14 -16.5 14t-17.5 -12q2 0 6.5 2t4 2t23.5 -6zM890 29l-1 3l-9 -3 v-4zM659 173q0 -10 12 -21q3 2 7 3q-9 17 -9 30q-10 -2 -10 -12zM657 150q-13 7 -11 28q-8 -6 -13 -17q3 -13 24 -11zM756 -39v9q-13 40 -13 78v103q0 9 -14 27t-31.5 18t-17.5 -17q0 -22 21 -22l15 13q1 -2 4 -5l4 -107q2 -62 17 -97h15zM625 175q-15 0 -15 -15 q0 -8 17 -24q2 2 6 4q-8 12 -8 35zM696 33q0 -37 16 -72h18q-16 56 -16 71v98l-5 21h-23q10 -51 10 -43v-75zM601 162h-12l-3 -13l8 -18h15q-8 17 -8 31zM701 -39v9q-12 34 -15.5 96t-8.5 80q-6 0 -17 -5l11 -159q-9 27 -13 76t-9 72h-10v-42q3 -32 3 -96l-20 136 q-5 -2 -12 -3l10 -87q4 -43 19 -77h10v21q7 -9 11 -21h15q0 4 4 8q4 -5 4 -8h18zM468 110l-2 -28v-73q0 11 8 -48l10 51l15 459h-11q-20 -7 -20 -44q0 -13 3 -31q2 -9 2 -23l-15 -159zM946 -120l23 10q7 0 10 -2q-3 7 -8 20h-352q-2 -4 -7 -12q31 0 37.5 -1.5t17 -8t13 -6.5 t12 7.5t28.5 7.5t34.5 -9t18.5 -9t17.5 9t25 9t33 -9t12.5 -9q2 0 14.5 10.5t29 10.5t33.5 -15q14 -3 8 -3zM578 -154l28 64q17 36 17 45.5t-6 33t-8 48t-11 77.5q-4 11 -13 17.5t-9 19.5t21 23l-88 56h-9q-4 -89 -14 -267q-16 -10 -17 -10q5 0 -13 10l-18 314q-13 9 -82 50 v-481h222zM806 1182l32 6q25 0 31 -20q-22 1 -63 6q-9 2 -18 16q15 -8 18 -8zM874 1136q-28 -11 -37.5 -11t-38.5 14q23 17 33 17t33 -6q-3 5 -34 11h27q9 1 17 -16v-9zM775 1139q0 -2 -24 -73q7 -3 21 -10v-10q-2 2 -29 20q29 64 29 74q0 34 -58 34q-10 0 -15 -5 q6 11 25.5 12t27.5 6h12q11 -66 11 -48zM805 1071q0 -9 -8 -17q-11 7 -25 12q15 0 27 -4q6 5 6 9zM802 1038l24 -10h20l2 11q-5 6 -10 4l12 3v-17q-11 -9 -39 -9q-4 -6 -3 -18q-3 10 -25.5 10t-29.5 -1l-9 -6q0 -5 2 17q15 -4 25 -5h33q-6 7 -16 21h14zM793 998h-36v5h36v-5 zM756 1041q-5 -21 -40 -21q-17 0 -17 16q0 -3 6 13l15 -7l-14 2l-2 -2v-7q5 -4 10.5 -4t41.5 10zM616 1181.5q18 -17.5 18 -35t-14.5 -38.5t-29.5 -21q-63 0 -73 59q-9 -7 -9 -29t16 -67h-47q16 61 16 66q0 18 -10 30l-15 -38q-7 -19 -43 -19q-58 0 -58 55t56 55 q26 0 42 -16l6 5v6q-26 18 -26 51q0 53 56 53q21 0 39.5 -18t18.5 -39.5t-35 -50.5l9 -7q12 16 38.5 16t44.5 -17.5zM1081 419q-20 -6 -27 -6t-16.5 1.5t-13.5 1.5l8 69q-1 1 -4 2l-59 -19q-3 6 -3 23t11 50l74 -23q72 24 72 26h-1q9 0 19 -43v-24l-6 -6q-20 5 -58 16h-7 q1 1 11 -59v-9zM824 651q6 -26 16 -26v-10q0 3 -3 -5h-13q-2 2 -2 -4t10 -20h12q2 4 2 18q3 1 7 1t10 -7.5t10.5 -7.5t7.5 1q1 -2 3 -4q-5 -10 -18 -12q-6 -4 -5 -12h-12q-1 0 -3 9t-11 9t-13 -9q6 -10 15 -10v-18q-12 -1 -11 -11.5t-5 -14.5q-8 0 -13 22q-4 2 -10 10 q1 3 16 14v15q-4 4 -14 4q-2 -6 -10 -21q-6 5 -17 13q-10 -1 -22 12q10 1 30 20h11l8 -19h7q2 1 7 5v15q-4 1 -13 5q0 4 -3 11q15 6 16 27h10zM667 628l-76 26q-14 0 -72 -26q-11 44 -11 30v34q6 6 8 6t55 -13q-4 24 -8 57v11q11 6 29.5 6t27.5 -6q-4 -22 -11 -66 q-1 -2 6.5 -2t50.5 19q12 -7 12 -41.5t-11 -34.5zM1261 20q0 -55 -56 -55q-26 0 -42 16l-6 -5v-6q26 -18 26 -51q0 -53 -56 -53q-21 0 -39.5 18t-18.5 39.5t35 50.5l-9 7q-12 -16 -38.5 -16t-44.5 17.5t-18 35t14.5 38.5t29.5 21q63 0 73 -59q9 7 9 29t-16 67h47 q-16 -61 -16 -66q0 -18 10 -30l15 38q8 19 43 19q58 0 58 -55zM940 132q0 -5 -6 -12l-13 4q9 -1 14 1l2 2v8q-3 4 -10 4t-14.5 -3.5t-30.5 -3.5q3 4 9 11q37 3 27 3q22 0 22 -14zM882 166h-36v5h36v-5zM830 167q13 -13 37 -13t26 11q0 -7 -1 -18q-38 5 -57 3q1 4 -5 17z M849 112q3 0 17 -10q-10 -3 -22 5h-7q1 -5 -4 -10q0 4 5 15h11zM881 -2l47 -6q3 0 11 8q0 -16 -21 -16l-18 3q-4 0 -20 -8q-16 39 -16 60l23 62q-8 5 -23 21l5 1q5 -6 26 -16l-26 -77q0 -17 12 -32zM837 131l-27 13q-15 0 -20 -14q9 -6 16 -2q-6 -7 -15 -7q-3 5 -3 17 q7 8 35 8t27 -15h-13zM916 4h-10v5h10v-5zM804 13q11 0 -32 9q4 -3 13 -11q-10 5 -20 16l6 -3q2 2 -4 9q18 9 36 9t40 -9q-19 -20 -39 -20zM808 4l-17 3v4l17 -2v-5zM794 -5l27 2q29 0 32 -16q-6 3 -25 3l-28 -2q-13 0 -30 20q22 -7 24 -7zM866 1139l-6 7q-5 -5 -12 -13 q-2 0 18 6zM851 1145l-19 -5q-3 0 -9 2.5t-9 2.5q8 -8 8 -12h26q0 9 3 12zM817 1136q-3 2 -4 7q-3 -1 -7 -4zM806 37q-4 0 -18 -15q30 9 19 9q6 0 14 -10q-1 16 -15 16zM784 24q1 5 1 8q0 2 -1 2l-1 -0.5t-3.5 -1.5t-6.5 -2q7 -2 11 -6z" />
+<glyph unicode="&#x1f0df;" horiz-adv-x="1628" d="M1578 -244q0 -148 -138 -148h-1252q-138 0 -138 148v1652q0 148 138 148h1252q138 0 138 -148v-1652zM1544 -244v1652q0 114 -104 114h-1252q-104 0 -104 -114v-1652q0 -114 104 -114h1252q104 0 104 114zM394 1318q0 -43 -30.5 -73.5t-73.5 -30.5t-73.5 29.5t-30.5 72.5 t30.5 73.5t73.5 30.5t73.5 -29.5t30.5 -72.5zM250 783l29 -7q20 0 38 72q4 20 9 125q8 213 217 213q115 0 179 -45q17 -14 50 -31q21 10 71 10q104 0 173 -57q28 15 90 35.5t89 20.5q190 0 190 -281q0 -8 -4 -27q32 -17 32 -47q0 -52 -51 -52q-20 0 -36 16t-16 30t9.5 29.5 t9.5 26t-23 50.5t-39 40q-30 0 -117 -48q-21 -51 -21 -121q0 -10 8 -38.5t8 -45.5q0 -63 -36 -138.5t-85 -115.5q-12 -9 -77 -17l-2 -5q-1 -10 20.5 -10t66.5 12t67 12q53 0 81 -40q7 3 14 3q39 0 39 -39t-39 -39q-9 0 -15 4q-23 -33 -64 -33l-61 13q-25 0 -25 -22 q0 -13 40 -25.5t76 -42.5q8 -13 8 -36q0 -51 -55 -94q8 -12 8 -23q0 -36 -39 -36t-37 37q-41 -6 -84 -6t-90 21q-61 27 -61 74q0 12 13.5 41.5t13.5 40.5q0 17 -26.5 17t-73 -66.5t-99.5 -66.5q-25 0 -59 10q-8 -40 -43 -40q-43 0 -43 43q0 26 25 39q-10 16 -10 48 q0 57 39 88q22 17 75 35t64.5 34.5t11.5 75.5t-65.5 176t-65.5 220q0 44 18 120q-6 8 -33 27.5t-34 19.5t-15 -33t-28 -75q-40 -85 -152 -134q-2 -53 -58 -53q-22 0 -39 16.5t-17 38.5q0 56 56 56zM1442 -152q0 -43 -30.5 -73.5t-73.5 -30.5t-73.5 29.5t-30.5 72.5 t30.5 73.5t73.5 30.5t73.5 -29.5t30.5 -72.5zM1400 763.5q0 36.5 -38.5 36.5t-38.5 -36.5t38.5 -36.5t38.5 36.5zM1150 869q-33 111 -130 181q54 -57 80.5 -104t49.5 -77zM1045 789q-35 0 -38 -32q14 6 37.5 6t50.5 -20q-15 46 -50 46zM1068 708q28 0 31 27q-19 9 -36 13v-4 q5 -12 -3.5 -22t-23.5 -8q12 -6 32 -6zM968 824l90 14q43 0 59 -29l12 46l-27 26q-60 53 -186.5 53t-206.5 -52q-5 -33 -14 -99q71 76 129 76q32 0 77.5 -17.5t66.5 -17.5zM1028 756q-8 -3 -16 -1q2 -11 9 -26q0 19 7 27zM834 802q-58 0 -58 -50v-2q57 24 102 24q8 0 16 -1 q-30 29 -60 29zM354.5 1253q26.5 27 26.5 64.5t-26.5 64t-64.5 26.5t-65 -27t-27 -64.5t27 -64t65 -26.5t64.5 27zM894 756v10h-24q4 -6 4 -15q0 -34 -28 -34q-24 0 -24 18q0 9 6 25q-17 -6 -51 -17q21 -29 65 -29h14q11 0 24.5 16t13.5 26zM1219 313q0 26 -25.5 26 t-25.5 -26t25.5 -26t25.5 26zM846 360l5 46q-24 7 -56 21q-81 73 -104 147q-12 37 -12 181l19 135q87 57 211 57q35 0 59 -5q-33 124 -94 159q-7 3 -35 3t-61 -20q-6 -59 -15 -90q-28 -92 -142 -104q-8 0 -21.5 9.5t-17.5 11.5q-16 -94 -16 -111q0 -83 30 -150 q8 -17 77 -133q22 -37 25 -121q4 -6 58 -27.5t65 -21.5h30q-5 5 -5 13zM764 1088v5q-108 80 -218.5 80t-153.5 -48q-10 -18 -28 -45t-21.5 -101t-14.5 -154q-11 -39 -37 -61l14 -22q114 56 148 134q6 12 11.5 27t10.5 33.5t18 45.5q3 2 13 2t54.5 -39t66.5 -39t84 36 q-142 91 -188 91t-73 -39l-22 -40l-1 11q27 72 96 72q48 0 194 -89q47 68 47 140zM1132 651q0 8 -5 28q-10 -30 -50 -30q-22 0 -52 16q-9 -12 -30 -26l5 26q2 7 2 13q-4 1 -15.5 1t-57 -15t-83.5 -15q-87 0 -150 80v-29q0 -83 13 -130.5t64.5 -100t106.5 -57.5 q29 -3 53 -7.5t50 -4.5t36.5 11t30.5 36l26 39q56 80 56 165zM1403 -217q27 27 27 64.5t-27 64t-65 26.5t-64.5 -27t-26.5 -64.5t26.5 -64t64.5 -26.5t65 27zM1091 15q0 23 -24 23t-24 -23t24 -23t24 23zM1162 337q-5 38 -63 38l-122 -23q-7 0 -20.5 2.5t-19.5 2.5q1 1 1 0 q-31 -22 -79.5 -22t-86.5 15l-74 30v-6q0 -38 -32 -73q-57 -18 -90.5 -32t-50.5 -36t-17 -57t39.5 -63.5t80.5 -28.5t87 67.5t83 67.5t37 -34l-27 -79q0 -26 36.5 -54.5t100.5 -28.5t114 19q35 1 58 28t23 55.5t-9 38.5t-62 31.5t-53 41.5q0 34 39 34l55 -13q52 0 52 38 q-11 19 0 41zM295 727.5q0 42.5 -44 42.5t-44 -42.5t44 -42.5t44 42.5zM551 84q0 30 -30 30t-30 -30q0 -27 30 -27t30 27zM1388 777l-4 -11q0 5 -6 13.5t-6 11.5q11 -4 16 -14zM1080 882q5 0 11 -14q-9 1 -23 14h12zM1094 631q16 -8 16 -23.5t-15 -36.5q11 23 11 38.5 t-12 21.5zM372 1345l-51 -38l21 -60l-52 38l-52 -38l20 60l-51 38h64l19 59l19 -59h63zM876 587l128 17q47 0 47 -22q0 -8 -43 -51q20 -26 20 -38q0 -41 -57 -41q-79 0 -154 96q-10 14 -35 42v13h17l4 -6q41 -10 73 -10zM1421 -181h-64l-19 -59l-19 59h-63l51 38l-21 60 l52 -38l52 38l-20 -60zM323 1329h-26l-7 22l-8 -22h-25l20 -15l-8 -23l21 14l20 -14l-8 23zM997 581l-103 -8q-49 0 -79 13h-8q82 -103 164 -103q25 0 37 16q5 0 -1 16q-3 8 -33 15q47 6 47 32v12q-16 7 -24 7zM1371 -165l-20 15l8 23l-21 -14l-20 14l8 -23l-21 -15h26 l7 -22l8 22h25z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.ttf b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.ttf
new file mode 100644
index 0000000..52337df
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.ttf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.woff b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.woff
new file mode 100644
index 0000000..b9bba23
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/Symbola.woff
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/STIXFontLicense2010.txt b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/STIXFontLicense2010.txt
new file mode 100644
index 0000000..e6d9705
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/STIXFontLicense2010.txt
@@ -0,0 +1,103 @@
+STIX Font License
+
+24 May 2010
+
+Copyright (c) 2001-2010 by the STI Pub Companies, consisting of the American 
+Institute of Physics, the American Chemical Society, the American Mathematical 
+Society, the American Physical Society, Elsevier, Inc., and The Institute of 
+Electrical and Electronic Engineers, Inc. (www.stixfonts.org), with Reserved 
+Font Name STIX Fonts, STIX Fonts (TM) is a  trademark of The Institute of 
+Electrical and Electronics Engineers, Inc.      
+
+Portions copyright (c) 1998-2003 by MicroPress, Inc. (www.micropress-inc.com), 
+with Reserved Font Name TM Math. To obtain additional mathematical fonts, please 
+contact MicroPress, Inc., 68-30 Harrow Street, Forest Hills, NY 11375, USA, 
+Phone: (718) 575-1816. 
+
+Portions copyright (c) 1990 by Elsevier, Inc. 
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1. 
+This license is copied below, and is also available with a FAQ at: 
+http://scripts.sil.org/OFL 
+
+--------------------------------------------------------------------------- 
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 
+--------------------------------------------------------------------------- 
+
+PREAMBLE 
+
+The goals of the Open Font License (OFL) are to stimulate worldwide development 
+of collaborative font projects, to support the font creation efforts of academic 
+and linguistic communities, and to provide a free and open framework in which 
+fonts may be shared and improved in partnership with others. 
+
+The OFL allows the licensed fonts to be used, studied, modified and redistributed 
+freely as long as they are not sold by themselves. The fonts, including any 
+derivative works, can be bundled, embedded, redistributed and/or sold with any 
+software provided that any reserved names are not used by derivative works. The 
+fonts and derivatives, however, cannot be released under any other type of license. 
+The requirement for fonts to remain under this license does not apply to any 
+document created using the fonts or their derivatives. 
+
+DEFINITIONS 
+
+"Font Software" refers to the set of files released by the Copyright Holder(s) under
+this license and clearly marked as such. This may include source files, build 
+scripts and documentation. 
+
+"Reserved Font Name" refers to any names specified as such after the copyright 
+statement(s). 
+
+"Original Version" refers to the collection of Font Software components as 
+distributed by the Copyright Holder(s). 
+
+"Modified Version" refers to any derivative made by adding to, deleting, or 
+substituting -- in part or in whole -- any of the components of the Original Version, 
+by changing formats or by porting the Font Software to a new environment. 
+
+"Author" refers to any designer, engineer, programmer, technical writer or other 
+person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS 
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of the 
+Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell 
+modified and unmodified copies of the Font Software, subject to the following 
+conditions: 
+
+1) Neither the Font Software nor any of its individual components, in Original or 
+Modified Versions, may be sold by itself. 
+
+2) Original or Modified Versions of the Font Software may be bundled, redistributed 
+and/or sold with any software, provided that each copy contains the above copyright 
+notice and this license. These can be included either as stand-alone text files, 
+human-readable headers or in the appropriate machine-readable metadata fields within 
+text or binary files as long as those fields can be easily viewed by the user. 
+
+3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless 
+explicit written permission is granted by the corresponding Copyright Holder. This 
+restriction only applies to the primary font name as presented to the users. 
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall 
+not be used to promote, endorse or advertise any Modified Version, except to 
+acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with 
+their explicit written permission. 
+
+5) The Font Software, modified or unmodified, in part or in whole, must be distributed 
+entirely under this license, and must not be distributed under any other license. The 
+requirement for fonts to remain under this license does not apply to any document 
+created using the Font Software. 
+
+TERMINATION 
+
+This license becomes null and void if any of the above conditions are not met. 
+
+DISCLAIMER 
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
+INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
+PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER 
+RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, 
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR 
+INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.eot b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.eot
new file mode 100644
index 0000000..7fb79c7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.eot
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.svg b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.svg
new file mode 100644
index 0000000..d5a38c9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.svg
@@ -0,0 +1,3318 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG webfont generated by Font Squirrel.
+Designer    : MicroPress Inc., with final additions and corrections provided by Coen Hoffman, Elsevier (retired)
+Foundry URL : http://www.stixfonts.org
+</metadata>
+<defs>
+<font id="webfontZXtFAA5Q" horiz-adv-x="685" >
+<font-face units-per-em="1000" ascent="750" descent="-250" />
+<missing-glyph horiz-adv-x="250" />
+<glyph unicode="IJ" horiz-adv-x="747" d="M728 662v-19q-61 -5 -76.5 -20.5t-15.5 -73.5v-364q0 -199 -167 -199q-46 0 -73.5 19t-27.5 53q0 20 14.5 36t34.5 16q33 0 49 -42q2 -5 5 -14l5 -12q1 -5 4 -9.5t7 -6.5t10 -2q22 0 29.5 15.5t7.5 54.5v456q0 59 -15 73.5t-78 19.5v19h287zM315 0h-297v19q63 2 80 18.5 t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="ij" horiz-adv-x="538" d="M453 457v-457q0 -107 -43.5 -162.5t-126.5 -55.5q-41 0 -67 15.5t-26 39.5q0 16 12 27.5t29 11.5q23 0 48 -32q23 -28 42 -28q23 0 34 18q14 25 14 121v379q0 60 -32 60q-24 0 -40 -3l-5 -1v16q80 25 156 54zM454 632q0 -22 -15 -36.5t-37 -14.5q-21 0 -35.5 14.5 t-14.5 36.5q0 21 15 36t36 15t36 -15t15 -36zM180 632q0 -22 -15 -36.5t-37 -14.5q-21 0 -35.5 14.5t-14.5 36.5q0 21 15 36t36 15q22 0 36.5 -15t14.5 -36zM253 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l155 55l4 -4v-351q0 -56 12.5 -71 t61.5 -19v-15z" />
+<glyph unicode="&#xfb00;" horiz-adv-x="605" d="M187 450h189q1 61 8 94.5t26 66.5q42 72 141 72q45 0 74.5 -17.5t29.5 -44.5q0 -17 -12 -29t-30 -12q-24 0 -45 36q-24 39 -53 39q-56 0 -56 -89v-116h115v-32h-115v-315q0 -56 15.5 -71t77.5 -17v-15h-245v15q43 3 55.5 19t12.5 70v314h-188v-314q0 -57 11 -71t57 -18 v-15h-235v15q54 3 68.5 18.5t14.5 70.5v314h-82v32h82q1 60 8 93.5t27 67.5q42 72 141 72q44 0 70.5 -17.5t26.5 -44.5q0 -17 -12 -29t-30 -12q-12 0 -18.5 6.5t-19.5 29.5q-24 39 -53 39q-56 0 -56 -89v-116z" />
+<glyph unicode="&#xfb01;" horiz-adv-x="558" d="M523 0h-220v15q46 4 57 18t11 66v261q0 38 -16.5 47.5t-86.5 9.5h-84v-327q0 -42 13.5 -57t54.5 -18v-15h-220v15q42 1 55 17t13 64v321h-67v33h68q9 80 21.5 116t50.5 70q55 47 147 47q59 0 92 -18t33 -50q0 -41 -35 -41q-14 0 -28 13t-25 29t-29 29t-39 13 q-45 0 -75 -32q-20 -20 -25 -47t-5 -84v-45h154q46 0 114 11l5 -4q-2 -53 -2 -99v-259q0 -47 14.5 -63.5t53.5 -20.5v-15z" />
+<glyph unicode="&#xfb02;" horiz-adv-x="556" d="M522 0h-215v15q39 4 52.5 17.5t13.5 53.5v332h-188v-337q0 -37 14 -49.5t56 -16.5v-15h-224v15q45 4 57.5 19.5t12.5 72.5v311h-70v32h72q0 78 12.5 118t52.5 76q44 39 100 39q21 0 58.5 -12.5t52.5 -12.5q5 0 33 12.5t40 12.5l5 -2v-598q0 -40 12.5 -52t52.5 -16v-15z M373 450v142q-7 -8 -18 -8q-18 0 -27.5 7.5t-22.5 29.5q-21 35 -53 35q-67 0 -67 -156v-50h188z" />
+<glyph unicode="&#xfb03;" horiz-adv-x="832" d="M797 0h-220v15q46 4 57 18t11 66v261q0 38 -16.5 48t-86.5 10h-84v-328q0 -42 13.5 -57t54.5 -18v-15h-220v15q46 4 57 18t11 63v322h-187v-315q0 -55 11.5 -69t56.5 -19v-15h-235v15q54 3 68.5 18t14.5 70v315h-82v32h82q1 60 8 93t27 67q42 72 141 72q44 0 71 -17.5 t27 -44.5q0 -17 -12 -29t-30 -12q-12 0 -19 7t-20 29q-15 23 -24 31.5t-25 8.5q-60 0 -60 -90v-115h188q9 80 21.5 116t50.5 70q55 47 147 47q59 0 92 -18t33 -50q0 -41 -35 -41q-17 0 -34.5 20t-39 40.5t-47.5 20.5q-47 0 -75 -29q-20 -20 -25 -47t-5 -84v-45h154 q46 0 114 11l5 -4q-2 -53 -2 -99v-259q0 -47 14.5 -63.5t53.5 -20.5v-15z" />
+<glyph unicode="&#xfb04;" horiz-adv-x="830" d="M796 0h-215v15q39 4 52.5 17.5t13.5 53.5v332h-188v-337q0 -37 14 -49.5t56 -16.5v-15h-224v15q45 4 57.5 19.5t12.5 72.5v311h-188v-314q0 -56 16 -71.5t77 -17.5v-15h-260v15q54 3 68.5 18.5t14.5 70.5v314h-82v32h82q1 60 8 93.5t27 67.5q42 72 141 72 q45 0 74.5 -17.5t29.5 -44.5q0 -17 -12 -29t-30 -12q-24 0 -45 36q-24 39 -53 39q-56 0 -56 -89v-116h190q0 78 12.5 118t52.5 76q44 39 100 39q21 0 58.5 -12.5t52.5 -12.5q5 0 33 12.5t40 12.5l5 -2v-598q0 -40 12.5 -52t52.5 -16v-15zM647 450v142q-7 -8 -18 -8 q-18 0 -27.5 7.5t-22.5 29.5q-21 34 -53 34q-67 0 -67 -155v-50h188z" />
+<glyph unicode="fj" horiz-adv-x="541" d="M452 461l5 -4q-2 -66 -2 -99v-358q0 -96 -39.5 -157t-130.5 -61q-33 0 -63 13t-30 42q0 17 12 28t29 11q21 0 46 -30t44 -30q21 0 34 18q14 21 14 121v405q0 28 -6 38q-13 19 -78 19h-19h-84v-327q0 -42 13.5 -57t54.5 -18v-15h-220v15q43 1 55.5 18t12.5 63v321h-67v33 h68q11 89 23 120q16 37 49 66q54 47 147 47q20 0 38.5 -2.5t39.5 -9t34 -21t13 -35.5q0 -41 -35 -41q-14 0 -28 13t-25 29t-29 29t-39 13q-45 0 -75 -32q-30 -31 -30 -105v-26v-45h154q44 0 114 11z" />
+<glyph unicode=" "  horiz-adv-x="250" />
+<glyph unicode="&#x09;" horiz-adv-x="250" />
+<glyph unicode="&#xa0;" horiz-adv-x="250" />
+<glyph unicode="!" horiz-adv-x="333" d="M175 176l-42 381q-3 30 -3 43q0 76 53 76q25 0 39 -22t14 -59q0 -16 -2 -38l-45 -381h-14zM236 42q0 -22 -15.5 -36.5t-38.5 -14.5q-22 0 -37 14.5t-15 37.5t15.5 38.5t37.5 15.5t37.5 -16t15.5 -39z" />
+<glyph unicode="&#x22;" horiz-adv-x="408" d="M299 431h-21q-32 174 -32 202q0 19 12 31t31 12q18 0 30 -12t12 -29q0 -13 -4.5 -41l-12.5 -77zM130 431h-21q-32 174 -32 202q0 19 12 31t31 12q18 0 30 -11.5t12 -29.5q0 -50 -32 -204z" />
+<glyph unicode="#" horiz-adv-x="500" d="M495 405h-104l-20 -134h99v-55h-108l-31 -216h-58l31 216h-134l-33 -216h-58l33 216h-106v55h115l21 134h-109v55h117l31 202h58l-31 -202h133l30 202h58l-30 -202h96v-55zM333 405h-133l-21 -134h134z" />
+<glyph unicode="$" horiz-adv-x="500" d="M264 637v-246q85 -46 118 -71.5t55 -59.5q21 -32 21 -90q0 -81 -49.5 -119t-144.5 -51v-87h-34v87q-64 0 -104 11.5t-82 39.5v130h15q16 -74 60 -113.5t111 -39.5v282q-105 59 -141.5 100t-36.5 103q0 70 51 108t127 43v63h34v-63q115 -7 161 -53v-111h-15 q-15 62 -50.5 96t-95.5 41zM230 407v230q-104 -21 -104 -105q0 -33 20.5 -57.5t83.5 -67.5zM264 293v-265q62 13 88 39.5t26 79.5q0 46 -23 76t-91 70z" />
+<glyph unicode="%" horiz-adv-x="747" d="M686 213q0 -91 -50 -161.5t-114 -70.5q-51 0 -86 40t-35 98q0 80 58.5 145.5t130.5 65.5q46 0 71 -30.5t25 -86.5zM663 215q0 39 -17.5 63t-45.5 24q-29 0 -49 -23q-33 -35 -55.5 -93.5t-22.5 -109.5q0 -29 16 -48.5t40 -19.5q52 0 93 63.5t41 143.5zM621 706l-430 -724 h-47l394 658q-28 -32 -54.5 -44.5t-66.5 -12.5q-35 0 -76 14q4 -23 4 -44q0 -52 -22 -104t-58 -86q-38 -37 -86 -37q-50 0 -84 39.5t-34 97.5q0 85 58 149t135 64q26 0 60 -28q47 -39 96 -39q46 0 72 15t95 82h44zM321 569q0 22 -4.5 30t-20.5 16q-23 11 -44 34 q-31 -15 -44 -26.5t-28 -36.5q-48 -76 -48 -163q0 -31 15.5 -50.5t41.5 -19.5q53 0 92.5 65t39.5 151z" />
+<glyph unicode="&#x26;" horiz-adv-x="778" d="M735 111l15 -11q-22 -54 -61 -83.5t-90 -29.5q-82 0 -170 91q-56 -49 -105.5 -70t-110.5 -21q-82 0 -126.5 38t-44.5 112q0 61 40.5 117.5t116.5 100.5l38 22q-35 85 -35 149q0 66 43.5 108t108.5 42q61 0 99 -33t38 -91q0 -55 -34.5 -93t-120.5 -75q56 -121 132 -206 q50 67 71 106.5t21 73.5q0 23 -14 33t-51 14v21h216v-21q-35 0 -54.5 -13t-39.5 -46l-39 -62l-43 -71q-19 -30 -44 -63q37 -47 72.5 -69.5t79.5 -22.5q29 0 48.5 11.5t43.5 41.5zM438 556q0 37 -22 62.5t-56 25.5q-35 0 -57 -23t-22 -60q0 -40 8 -70.5t32 -74.5q63 29 90 62 t27 78zM404 104q-86 101 -152 239q-65 -42 -91.5 -79.5t-26.5 -89.5q0 -62 34.5 -98t89.5 -36q64 0 146 64z" />
+<glyph unicode="'" horiz-adv-x="180" d="M101 431h-21q-32 174 -32 203q0 18 12.5 30t30.5 12q20 0 31 -11t11 -29q0 -45 -32 -205z" />
+<glyph unicode="(" horiz-adv-x="333" d="M304 -161l-12 -16q-116 66 -180 182t-64 247q0 277 247 424l9 -16q-102 -87 -136 -171.5t-34 -233.5q0 -148 35 -240t135 -176z" />
+<glyph unicode=")" horiz-adv-x="333" d="M29 660l12 16q114 -68 179 -184t65 -245q0 -273 -247 -424l-9 16q103 85 136.5 169.5t33.5 235.5q0 152 -33.5 243.5t-136.5 172.5z" />
+<glyph unicode="*" horiz-adv-x="500" d="M268 471l9 -6q37 -24 96 -34q34 -5 47 -14.5t13 -28.5q0 -17 -10 -28t-26 -11q-25 0 -60 44q-23 28 -69 58l-8 5v-9q0 -56 20 -110q9 -25 9 -33q0 -15 -12.5 -27t-27.5 -12q-14 0 -25 11t-11 25t12 47q16 43 16 99v9q-40 -25 -52 -36q-12 -12 -41 -45q-22 -25 -43 -25 q-17 0 -27 10t-10 26q0 19 14.5 29t48.5 16q35 7 53.5 14t49.5 26q-43 26 -97 37q-37 8 -52 18t-15 28q0 16 9 26.5t24 10.5q20 0 49 -32q42 -47 89 -73v13q0 41 -15 91q-11 33 -11 52q0 14 10.5 24t25.5 10t26 -10.5t11 -25.5q0 -16 -11 -47q-17 -45 -17 -83v-24 q34 20 58 42q5 5 18 20l22 22q8 8 18.5 15.5t18.5 7.5q17 0 27 -10.5t10 -27.5q0 -20 -11.5 -29.5t-40.5 -13.5q-56 -9 -112 -41z" />
+<glyph unicode="+" d="M636 220h-261v-261h-66v261h-261v66h261v261h66v-261h261v-66z" />
+<glyph unicode="," horiz-adv-x="250" d="M83 -141l-10 19q83 56 83 107q0 13 -14 13q-4 0 -13.5 -2t-15.5 -2q-58 0 -58 51q0 26 16.5 41.5t43.5 15.5q34 0 57 -24.5t23 -62.5q0 -46 -30.5 -89t-81.5 -67z" />
+<glyph unicode="-" horiz-adv-x="333" d="M285 194h-246v63h246v-63z" />
+<glyph unicode="." horiz-adv-x="250" d="M181 43q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40z" />
+<glyph unicode="/" horiz-adv-x="278" d="M287 676l-228 -690h-68l229 690h67z" />
+<glyph unicode="0" horiz-adv-x="500" d="M476 330q0 -67 -13 -126.5t-38.5 -109.5t-70.5 -79t-104 -29q-61 0 -107 31t-71 83t-36.5 111t-11.5 125q0 93 23 167.5t76.5 123.5t130.5 49q98 0 160 -96t62 -250zM380 325q0 158 -33.5 241.5t-98.5 83.5q-62 0 -95 -84t-33 -237q0 -154 33 -235.5t97 -81.5 q63 0 96.5 81.5t33.5 231.5z" />
+<glyph unicode="1" horiz-adv-x="500" d="M394 0h-276v15q55 3 75 20.5t20 59.5v449q0 49 -30 49q-14 0 -45 -12l-27 -10v14l179 91l9 -3v-597q0 -33 20 -47t75 -14v-15z" />
+<glyph unicode="2" horiz-adv-x="500" d="M474 137l-54 -137h-391v12l178 189q70 73 100 134t30 126q0 67 -37 104t-102 37q-54 0 -85.5 -28t-61.5 -102l-21 5q17 93 68.5 146t139.5 53q83 0 134 -50t51 -126q0 -113 -128 -248l-165 -176h234q33 0 52.5 13t43.5 54z" />
+<glyph unicode="3" horiz-adv-x="500" d="M61 510l-16 4q23 75 72 118.5t124 43.5q70 0 113 -38t43 -99q0 -82 -93 -138q55 -24 83 -53q44 -49 44 -129t-46 -140q-34 -46 -97.5 -69.5t-134.5 -23.5q-112 0 -112 57q0 16 12 26t29 10q25 0 61 -26q44 -31 86 -31q55 0 92.5 44.5t37.5 108.5q0 115 -104 145 q-31 10 -102 10v14q56 19 84 36q81 46 81 134q0 50 -28.5 76t-79.5 26q-90 0 -149 -106z" />
+<glyph unicode="4" horiz-adv-x="500" d="M473 167h-103v-167h-78v167h-280v64l314 445h44v-445h103v-64zM292 231v343l-240 -343h240z" />
+<glyph unicode="5" horiz-adv-x="500" d="M438 681l-36 -85q-6 -13 -27 -13h-194l-40 -85q110 -21 159 -45.5t91 -82.5q35 -48 35 -127q0 -72 -23.5 -121t-74.5 -87q-68 -49 -170 -49q-57 0 -92 17t-35 45q0 38 45 38q36 0 74 -31q39 -32 71 -32q52 0 93.5 52t41.5 117q0 96 -67 150q-87 70 -213 70q-12 0 -12 8 l1 5l109 237h207q17 0 26.5 5t21.5 21z" />
+<glyph unicode="6" horiz-adv-x="500" d="M446 684l2 -16q-118 -19 -197 -95.5t-99 -189.5q58 45 127 45q88 0 138.5 -56t50.5 -153q0 -98 -51 -160q-59 -73 -159 -73q-122 0 -177 101q-47 86 -47 192q0 164 109 276q62 64 127.5 90.5t175.5 38.5zM378 188q0 194 -135 194q-50 0 -83 -26.5t-33 -89.5 q0 -117 36.5 -184.5t105.5 -67.5q53 0 81 47.5t28 126.5z" />
+<glyph unicode="7" horiz-adv-x="500" d="M449 646l-212 -654h-65l198 596h-215q-43 0 -64 -15t-53 -67l-18 9l60 147h369v-16z" />
+<glyph unicode="8" horiz-adv-x="500" d="M445 155q0 -77 -53.5 -123t-143.5 -46q-84 0 -138 46t-54 117q0 53 26 90.5t104 92.5q-75 62 -99.5 100t-24.5 88q0 71 54.5 113.5t139.5 42.5q73 0 120.5 -41.5t47.5 -101.5q0 -55 -28.5 -88t-105.5 -74q90 -60 122.5 -107t32.5 -109zM355 533q0 52 -29 83.5t-80 31.5 t-80.5 -26.5t-29.5 -72.5t29.5 -83.5t95.5 -76.5q51 30 72.5 63.5t21.5 80.5zM271 272l-59 40q-44 -36 -62 -70.5t-18 -83.5q0 -68 34.5 -106t92.5 -38q49 0 79.5 30.5t30.5 79.5q0 45 -23 79t-75 69z" />
+<glyph unicode="9" horiz-adv-x="500" d="M59 -22l-3 20q115 20 194.5 97t109.5 199q-58 -57 -150 -57q-81 0 -130.5 56t-49.5 147q0 101 59.5 168.5t148.5 67.5q95 0 157 -76q64 -80 64 -206q0 -88 -30.5 -165.5t-89.5 -131.5q-62 -56 -121 -80.5t-159 -38.5zM362 355v39q0 254 -132 254q-47 0 -73 -34 q-15 -20 -25 -60t-10 -80q0 -89 33.5 -141.5t89.5 -52.5q40 0 78.5 19.5t38.5 55.5z" />
+<glyph unicode=":" horiz-adv-x="278" d="M192 403q0 -23 -16 -39t-39 -16t-39.5 16.5t-16.5 38.5q0 24 16 40t40 16q22 0 38.5 -16.5t16.5 -39.5zM192 44q0 -22 -16 -38.5t-39 -16.5t-39.5 16.5t-16.5 38.5q0 24 16 40t40 16q22 0 38.5 -16.5t16.5 -39.5z" />
+<glyph unicode=";" horiz-adv-x="278" d="M191 403q0 -23 -16.5 -39t-38.5 -16q-23 0 -39.5 16.5t-16.5 38.5q0 24 16 40t40 16q22 0 38.5 -16.5t16.5 -39.5zM107 -141l-10 19q83 54 83 106q0 5 -4 9.5t-10 4.5q-3 0 -13 -2t-15 -2q-58 0 -58 52q0 24 17 40t42 16q34 0 57 -24.5t23 -64.5q0 -47 -30 -88t-82 -66z " />
+<glyph unicode="&#x3c;" d="M621 -24l-565 273v10l565 275v-65l-432 -215l432 -215v-63z" />
+<glyph unicode="=" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66z" />
+<glyph unicode="&#x3e;" d="M621 249l-565 -273v63l432 215l-432 215v65l565 -275v-10z" />
+<glyph unicode="?" horiz-adv-x="444" d="M244 164h-17q2 72 44 177q51 126 51 187q0 51 -31.5 84.5t-77.5 33.5q-36 0 -65 -19t-29 -43q0 -19 19 -38.5t19 -35.5q0 -19 -11 -31t-30 -12q-21 0 -34.5 18t-13.5 48q0 62 46 102.5t118 40.5q75 0 128.5 -43.5t53.5 -114.5q0 -45 -20 -82.5t-85 -114.5 q-49 -59 -65 -157zM290 45q0 -22 -15 -37.5t-37 -15.5q-25 0 -39.5 15.5t-14.5 37.5q0 23 15.5 38t38.5 15q21 0 36.5 -16t15.5 -37z" />
+<glyph unicode="@" horiz-adv-x="921" d="M688 73l12 -30q-120 -57 -218 -57q-157 0 -261.5 97t-104.5 244q0 84 38 158t103 122q93 69 224 69q139 0 233.5 -84.5t94.5 -208.5q0 -97 -55 -168.5t-129 -71.5q-34 0 -59.5 20.5t-29.5 52.5h-2q-50 -72 -125 -72q-38 0 -63 30.5t-25 81.5q0 96 66 182q53 70 128 70 q54 0 73 -52h2l9 38h69l-65 -254q-2 -10 -2 -17q0 -47 42 -47q49 0 87.5 60.5t38.5 136.5q0 112 -84.5 192t-202.5 80q-140 0 -220 -115q-62 -89 -62 -208q0 -131 79.5 -214t207.5 -83q102 0 201 48zM572 404q0 60 -46 60q-51 0 -98 -70q-36 -54 -36 -120q0 -40 16 -63.5 t44 -23.5q44 0 76 58q44 83 44 159z" />
+<glyph unicode="A" horiz-adv-x="722" d="M707 0h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70t54.5 -22v-19zM447 257l-116 275l-115 -275h231z" />
+<glyph unicode="B" horiz-adv-x="667" d="M422 349v-1q75 -12 122 -55q49 -44 49 -115q0 -83 -65 -130.5t-174 -47.5h-337v19q59 2 77.5 19.5t18.5 74.5v437q0 58 -17 73.5t-79 19.5v19h280q129 0 195.5 -43.5t66.5 -123.5q0 -68 -41 -104q-29 -25 -96 -42zM215 366h92q150 0 150 124q0 64 -44.5 99.5t-132.5 35.5 h-41q-24 0 -24 -32v-227zM215 326v-244q0 -25 13.5 -35t48.5 -10q68 0 100 7.5t63 35.5q38 33 38 99q0 76 -47 107q-11 8 -22 13.5t-19.5 9t-22.5 6.5l-21 5q-8 1 -27 2l-28 2q-9 0 -35.5 1t-40.5 1z" />
+<glyph unicode="C" horiz-adv-x="667" d="M614 131l19 -18q-89 -127 -273 -127q-145 0 -236 89q-96 94 -96 250q0 146 90 247q94 104 243 104q64 0 119 -15q63 -18 69 -18q33 0 42 33h20l9 -227h-23q-16 72 -52 111q-71 76 -161 76q-111 0 -175.5 -81.5t-64.5 -213.5q0 -161 72 -239q67 -72 178 -72q66 0 114 23 t106 78z" />
+<glyph unicode="D" horiz-adv-x="722" d="M16 662h270q195 0 300 -91q99 -85 99 -237q0 -183 -136 -270q-99 -64 -252 -64h-281v19q58 4 73 20.5t15 75.5v435q0 58 -15 73.5t-73 19.5v19zM206 583v-499q0 -27 9.5 -37t38.5 -10q78 0 126 11t92 41q104 70 104 239q0 145 -95 228q-43 38 -94 53.5t-128 15.5 q-29 0 -41 -9t-12 -33z" />
+<glyph unicode="E" horiz-adv-x="611" d="M597 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-25q-11 67 -39 86t-115 19h-131q-22 0 -28.5 -6.5t-6.5 -29.5v-220h151q63 0 83.5 18t29.5 78h23v-234h-23q-9 63 -29 80t-84 17h-151v-243q0 -30 21 -38.5t80 -8.5h36 q107 0 152 26t79 106h28z" />
+<glyph unicode="F" horiz-adv-x="556" d="M546 519h-25q-11 68 -37.5 86.5t-116.5 18.5h-132q-21 0 -27.5 -7.5t-6.5 -31.5v-217h142q63 0 84.5 18t28.5 77h23v-233h-23q-6 61 -27 79t-86 18h-142v-215q0 -57 16.5 -73.5t74.5 -19.5v-19h-281v19q57 4 72.5 21.5t15.5 82.5v428q0 55 -15 71.5t-72 20.5v19h529z" />
+<glyph unicode="G" horiz-adv-x="722" d="M709 354v-18q-44 -4 -57 -18t-13 -62v-200q-86 -70 -254 -70q-78 0 -149.5 28t-120.5 79q-83 87 -83 234q0 166 107 263q94 86 239 86q64 0 133 -23q27 -10 44 -10q16 0 28 9.5t17 23.5h22l8 -211h-23q-32 78 -71 116q-58 55 -146 55q-100 0 -167 -69q-77 -77 -77 -243 q0 -138 72 -218t191 -80q57 0 95 18t38 43v157q0 58 -14.5 72.5t-74.5 19.5v18h256z" />
+<glyph unicode="H" horiz-adv-x="722" d="M703 0h-279v19q58 4 73 22.5t15 82.5v191h-303v-202q0 -55 16 -73t71 -21l1 -19h-279v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-189h303v189q0 58 -15.5 74t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5 v-437q0 -53 16.5 -70.5t72.5 -21.5v-19z" />
+<glyph unicode="I" horiz-adv-x="333" d="M315 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="J" horiz-adv-x="373" d="M354 662v-19q-61 -5 -76.5 -20.5t-15.5 -73.5v-364q0 -199 -167 -199q-46 0 -73.5 19t-27.5 53q0 20 14.5 36t34.5 16q33 0 49 -42q2 -5 5 -14l5 -12q1 -5 4 -9.5t7 -6.5t10 -2q22 0 29.5 15.5t7.5 54.5v456q0 59 -15 73.5t-78 19.5v19h287z" />
+<glyph unicode="K" horiz-adv-x="722" d="M723 0h-303v19l27 1q42 1 42 24q0 18 -32.5 56.5t-104.5 113.5l-100 103l-26 -21v-185q0 -56 16 -71.5t73 -20.5v-19h-282v19q59 3 75 22t16 84v424q0 56 -16 73t-74 21v19h282v-19q-61 -4 -75.5 -20t-14.5 -75v-200l178 164q43 40 60.5 61t17.5 38q0 16 -8.5 23t-32.5 8 l-25 1v19h259v-19q-51 -4 -77.5 -17.5t-78.5 -63.5l-186 -178l234 -256q62 -68 91.5 -88.5t64.5 -20.5v-19z" />
+<glyph unicode="L" horiz-adv-x="611" d="M598 174l-48 -174h-538v19q55 3 71 21t16 75v431q0 59 -14.5 76t-72.5 21v19h283v-19q-61 -4 -77.5 -20.5t-16.5 -74.5v-464q0 -28 17.5 -36.5t72.5 -8.5h70q121 0 169 61q20 27 42 74h26z" />
+<glyph unicode="M" horiz-adv-x="889" d="M864 0h-280v19q59 4 74.5 22.5t15.5 81.5v449l-255 -572h-14l-252 549v-398q0 -81 17 -105t76 -27v-19h-234v19q44 3 63 13t26.5 35.5t7.5 83.5v398q0 57 -17 73.5t-78 20.5v19h198l231 -502l221 502h199v-19q-54 -1 -70.5 -19t-16.5 -74v-438q0 -53 16.5 -71t71.5 -22 v-19z" />
+<glyph unicode="N" horiz-adv-x="722" d="M707 662v-19q-51 -5 -66 -18q-16 -14 -22.5 -38t-6.5 -80v-518h-18l-441 549v-388q0 -76 17 -99.5t76 -31.5v-19h-234v19q62 7 79.5 29.5t17.5 101.5v440q-26 32 -44 42.5t-53 10.5v19h170l386 -483v340q0 76 -19 98q-12 13 -26.5 17.5t-52.5 8.5v19h237z" />
+<glyph unicode="O" horiz-adv-x="722" d="M688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45 q78 0 129 48q83 80 83 267z" />
+<glyph unicode="P" horiz-adv-x="557" d="M16 662h259q142 0 217 -63q50 -42 50 -119q0 -80 -57 -131q-42 -38 -86 -49.5t-128 -11.5q-29 0 -69 3v-179q0 -57 16.5 -73.5t77.5 -19.5v-19h-280v19q58 4 71 21t13 82v429q0 56 -14.5 72t-69.5 20v19zM202 589v-258q34 -3 61 -3q81 0 125.5 39.5t44.5 107.5 q0 81 -46 115.5t-150 34.5q-21 0 -28 -7.5t-7 -28.5z" />
+<glyph unicode="Q" horiz-adv-x="722" d="M701 -177h-48q-249 0 -347 124l-41 52q-60 21 -93.5 42.5t-61.5 58.5q-76 101 -76 232q0 156 92 250t235 94q144 0 235.5 -94.5t91.5 -248.5q0 -88 -26 -152t-82 -117q-31 -31 -65.5 -46t-88.5 -25q53 -76 119.5 -111.5t155.5 -40.5v-18zM574 338q0 86 -24 153.5 t-67 103.5q-54 45 -125 45q-86 0 -144 -71q-30 -35 -48 -99t-18 -135q0 -154 58 -235q24 -35 67.5 -56.5t87.5 -21.5q87 0 149 72q30 34 47 101t17 143z" />
+<glyph unicode="R" horiz-adv-x="667" d="M660 0h-162l-238 308l-56 -2v-194q0 -57 15.5 -73t73.5 -20v-19h-276v19q57 5 71 22t14 83v427q0 56 -14 72t-71 20v19h272q137 0 209 -59q49 -40 49 -120q0 -136 -181 -164l200 -253q21 -26 40 -35t54 -12v-19zM204 583v-240q72 1 107 8t70 26q57 32 57 114 q0 134 -183 134q-27 0 -39 -8.5t-12 -33.5z" />
+<glyph unicode="S" horiz-adv-x="556" d="M469 463h-25q-17 62 -41 94q-61 78 -145 78q-46 0 -73.5 -26.5t-27.5 -68.5q0 -20 10 -39t21.5 -32.5t40.5 -33.5t47 -31l60 -35q81 -47 118 -93.5t37 -102.5q0 -83 -58 -135t-146 -52q-65 0 -118 23q-26 11 -47 11q-12 0 -20 -9t-8 -24h-22l-29 212h22q67 -177 206 -177 q53 0 86 31.5t33 80.5q0 47 -29 79q-48 52 -168 116q-122 65 -122 172q0 80 49 127.5t125 47.5q53 0 105 -22q27 -12 44 -12q26 0 32 34h21z" />
+<glyph unicode="T" horiz-adv-x="611" d="M593 492h-24q-16 82 -45 105t-109 23h-59v-509q0 -57 17 -73t79 -19v-19h-292v19q63 4 78.5 21t15.5 83v497h-60q-81 0 -109.5 -23.5t-43.5 -104.5h-24l7 170h562z" />
+<glyph unicode="U" horiz-adv-x="722" d="M705 662v-19q-61 -6 -77.5 -29.5t-16.5 -97.5v-255q0 -77 -11 -121t-43 -81q-64 -73 -202 -73q-109 0 -170 46q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19h283v-19q-60 -5 -75.5 -21.5t-15.5 -72.5v-312q0 -65 8 -100t36 -62q47 -45 128 -45q101 0 152 59 q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h232z" />
+<glyph unicode="V" horiz-adv-x="722" d="M697 662v-19q-31 -1 -51 -19.5t-41 -71.5l-222 -563h-15l-244 544q-32 71 -51 90t-57 20v19h265v-19l-28 -2q-45 -3 -45 -31q0 -20 39 -107l152 -342l147 369q19 48 19 72q0 7 -1.5 12.5t-3.5 9.5t-7.5 7t-8.5 4.5t-11 3t-11.5 2t-14 1.5t-14.5 1v19h204z" />
+<glyph unicode="W" horiz-adv-x="944" d="M932 662v-19q-40 -8 -54.5 -19.5t-28.5 -50.5q-114 -306 -204 -584h-15l-160 423l-154 -423h-15q-34 101 -101 285l-91 249q-25 72 -45.5 95.5t-58.5 24.5v19h244v-19q-37 -1 -50.5 -8t-13.5 -23q0 -17 11 -47l144 -376l104 283l-28 75q-24 65 -41 80t-61 16v19h265v-19 q-77 -2 -77 -35q0 -13 17 -58l143 -364l126 339q17 48 17 77q0 40 -70 41v19h197z" />
+<glyph unicode="X" horiz-adv-x="722" d="M704 0h-296v19l26 2q50 3 50 29q0 22 -51 98l-95 141l-119 -149q-53 -66 -53 -89q0 -15 16.5 -22t59.5 -10v-19h-232v19q39 4 63.5 23t81.5 91l156 195l-106 155q-70 102 -101 128.5t-82 31.5v19h301v-19l-29 -1q-23 -1 -34.5 -7t-11.5 -22q0 -6 1.5 -12.5t6.5 -15.5 l8 -17l12 -20l15 -22l19 -28l21 -30l44 -64l112 140q40 49 40 67q0 17 -14 24t-54 8v19h237v-19q-48 -3 -76 -21.5t-76 -77.5l-143 -177l192 -274q29 -42 50 -55.5t61 -18.5v-19z" />
+<glyph unicode="Y" horiz-adv-x="722" d="M703 662v-19q-44 -4 -69.5 -25t-68.5 -87l-148 -228v-192q0 -57 19 -73t84 -19v-19h-306v19q68 5 84.5 21.5t16.5 82.5v171l-131 192q-68 100 -97 127.5t-65 29.5v19h279v-19l-24 -1q-47 -1 -47 -26q0 -21 18 -47l146 -221l145 222q14 21 14 42q-1 17 -15.5 23.5 t-52.5 7.5v19h218z" />
+<glyph unicode="Z" horiz-adv-x="612" d="M598 176l-25 -176h-563v15l437 609h-214q-99 0 -134 -35q-18 -19 -25.5 -37.5t-15.5 -60.5h-26l21 171h525v-15l-432 -609h252q78 0 117 28q23 16 34 37.5t26 72.5h23z" />
+<glyph unicode="[" horiz-adv-x="333" d="M299 -156h-211v818h211v-25h-83q-26 0 -39 -11t-13 -37v-666q0 -54 52 -54h83v-25z" />
+<glyph unicode="\" horiz-adv-x="278" d="M287 -14h-68l-228 690h67z" />
+<glyph unicode="]" horiz-adv-x="333" d="M245 -156h-211v25h88q26 0 36.5 11t10.5 35v668q0 54 -51 54h-84v25h211v-818z" />
+<glyph unicode="^" horiz-adv-x="469" d="M446 297h-68l-143 289l-143 -289h-68l181 365h60z" />
+<glyph unicode="_" horiz-adv-x="500" d="M500 -125h-500v50h500v-50z" />
+<glyph unicode="`" horiz-adv-x="333" d="M242 507h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23z" />
+<glyph unicode="a" horiz-adv-x="444" d="M442 66v-28q-38 -48 -90 -48q-57 0 -64 73h-1q-64 -73 -145 -73q-47 0 -76 27.5t-29 76.5q0 70 70 117q48 32 180 81v54q0 45 -21.5 67.5t-56.5 22.5q-30 0 -50 -14.5t-20 -34.5q0 -9 3 -20t3 -22q0 -15 -13.5 -28t-32.5 -13q-17 0 -30 13t-13 33q0 48 51 80 q47 30 115 30q81 0 118 -45q18 -21 23 -42.5t5 -68.5v-191q0 -66 31 -66q20 0 43 19zM287 127v141q-92 -32 -128 -66q-34 -31 -34 -77q0 -38 19 -57.5t50 -19.5q33 0 58 16q21 15 28 28t7 35z" />
+<glyph unicode="b" horiz-adv-x="500" d="M153 681v-305q16 38 52.5 61t82.5 23q79 0 129.5 -63t50.5 -157q0 -110 -67 -180t-167 -70q-61 0 -113 20.5t-52 45.5v510q0 37 -9 47.5t-40 10.5q-7 0 -17 -2v17l30 9l115 35zM153 318v-244q0 -23 28.5 -37.5t68.5 -14.5q59 0 93 43q37 46 37 132q0 98 -39 153 q-33 47 -89 47q-40 0 -69.5 -23.5t-29.5 -55.5z" />
+<glyph unicode="c" horiz-adv-x="444" d="M398 156l14 -9q-43 -84 -82 -115q-51 -42 -115 -42q-83 0 -136.5 62.5t-53.5 159.5q0 127 84 197q62 51 135 51q63 0 108.5 -30.5t45.5 -72.5q0 -17 -14 -29.5t-33 -12.5q-35 0 -48 46l-6 22q-8 28 -20 38t-39 10q-61 0 -98.5 -48t-37.5 -126q0 -86 43 -140.5t112 -54.5 q43 0 74 21t67 73z" />
+<glyph unicode="d" horiz-adv-x="500" d="M491 42l-147 -52l-4 3v64q-48 -67 -128 -67q-83 0 -134 59.5t-51 155.5q0 106 61 180.5t147 74.5q54 0 105 -43v156q0 31 -9 41t-37 10q-14 0 -22 -1v16q91 24 147 44l5 -2v-567q0 -35 8.5 -46t35.5 -11q6 0 23 1v-16zM340 102v230q0 40 -30.5 70t-71.5 30q-57 0 -91 -51 t-34 -136q0 -92 37.5 -147.5t100.5 -55.5q47 0 74 32q15 17 15 28z" />
+<glyph unicode="e" horiz-adv-x="444" d="M408 164l16 -7q-60 -167 -209 -167q-88 0 -139 61.5t-51 165.5q0 107 57 175t150 68q90 0 139 -69q29 -40 34 -114h-308q4 -63 12.5 -96t33.5 -67q42 -55 111 -55q49 0 82.5 24t71.5 81zM99 309h204q-9 63 -29.5 89t-68.5 26q-42 0 -70 -29.5t-36 -85.5z" />
+<glyph unicode="f" horiz-adv-x="333" d="M21 450h82q1 60 8 93.5t27 67.5q42 72 141 72q45 0 74.5 -17.5t29.5 -44.5q0 -17 -12 -29t-30 -12q-24 0 -45 36q-24 39 -53 39q-56 0 -56 -89v-116h122v-32h-122v-314q0 -56 16 -71.5t77 -17.5v-15h-260v15q54 3 68.5 18.5t14.5 70.5v314h-82v32z" />
+<glyph unicode="g" horiz-adv-x="500" d="M470 388h-83q19 -43 19 -84q0 -77 -52 -116t-104 -39q-11 0 -38 3l-19 2q-20 -6 -40 -27t-20 -36q0 -23 78 -27l129 -6q55 -2 88 -31t33 -76q0 -58 -60 -105q-83 -64 -200 -64q-72 0 -122.5 28.5t-50.5 68.5q0 28 22 55.5t76 66.5q-32 15 -42.5 26t-10.5 27q0 29 46 69 q23 19 43 40q-50 25 -71.5 56t-21.5 78q0 68 48.5 115.5t118.5 47.5q40 0 80 -15l22 -8q29 -10 55 -10h77v-39zM152 338v-3q0 -72 28.5 -116.5t74.5 -44.5q34 0 54 24.5t20 65.5q0 66 -30 121q-25 47 -73 47q-35 0 -54.5 -25t-19.5 -69zM433 -64q0 28 -27.5 38.5t-96.5 10.5 q-99 0 -162 13q-30 -36 -39.5 -52.5t-9.5 -33.5q0 -33 39.5 -53t105.5 -20q85 0 137.5 26.5t52.5 70.5z" />
+<glyph unicode="h" horiz-adv-x="500" d="M487 0h-212v15q44 5 56 20t12 67v198q0 106 -74 106q-30 0 -55 -14t-57 -49v-241q0 -52 12 -67t56 -20v-15h-216v15q43 6 53.5 20t10.5 67v471q0 32 -9.5 41.5t-41.5 9.5q-9 0 -12 -1v16l27 8q77 23 115 36l5 -3v-304q35 45 69 64.5t78 19.5q123 0 123 -159v-199 q0 -52 9.5 -65.5t50.5 -21.5v-15z" />
+<glyph unicode="i" horiz-adv-x="278" d="M180 632q0 -22 -15 -36.5t-37 -14.5q-21 0 -35.5 14.5t-14.5 36.5q0 21 15 36t36 15q22 0 36.5 -15t14.5 -36zM253 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l155 55l4 -4v-351q0 -56 12.5 -71t61.5 -19v-15z" />
+<glyph unicode="j" horiz-adv-x="278" d="M193 457v-457q0 -107 -43.5 -162.5t-126.5 -55.5q-41 0 -67 15.5t-26 39.5q0 16 12 27.5t29 11.5q23 0 48 -32q23 -28 42 -28q23 0 34 18q14 25 14 121v379q0 60 -32 60q-24 0 -40 -3l-5 -1v16q80 25 156 54zM194 632q0 -22 -15 -36.5t-37 -14.5q-21 0 -35.5 14.5 t-14.5 36.5q0 21 15 36t36 15t36 -15t15 -36z" />
+<glyph unicode="k" horiz-adv-x="500" d="M505 0h-218v15h19q21 0 21 15q0 9 -11 23l-150 198v-184q0 -26 12.5 -38t42.5 -13l20 -1v-15h-234v15q54 9 64.5 18.5t10.5 48.5v482q0 36 -9 48.5t-34 12.5q-6 0 -32 -2v16l30 8q60 16 125 36l4 -2v-420l137 122q23 21 23 35q0 10 -10.5 13.5t-39.5 4.5v14h204v-15 q-50 0 -88.5 -21.5t-127.5 -104.5l-29 -27l153 -194q54 -69 117 -73v-15z" />
+<glyph unicode="l" horiz-adv-x="278" d="M257 0h-236v15q47 4 62 19.5t15 57.5v469q0 36 -9 50t-33 14q-21 0 -37 -2v16q95 23 158 44l5 -4v-592q0 -42 14 -55.5t61 -16.5v-15z" />
+<glyph unicode="m" horiz-adv-x="778" d="M775 0h-218v15q42 4 53.5 17.5t11.5 57.5v206q0 60 -17.5 86t-59.5 26q-35 0 -59.5 -14t-47.5 -47v-252q0 -48 14.5 -63.5t57.5 -16.5v-15h-224v15q44 3 56 14.5t12 56.5v211q0 111 -65 111q-28 0 -59.5 -12.5t-46.5 -30.5q-13 -15 -13 -17v-278q0 -32 14 -42.5t54 -12.5 v-15h-222v15q42 1 56 15.5t14 57.5v248q0 37 -8 51.5t-27 14.5q-15 0 -32 -4v17q68 19 139 45l8 -3v-74h2q45 47 79.5 62t73.5 15q79 0 106 -84q78 84 163 84q116 0 116 -180v-203q0 -33 10 -45.5t33 -14.5l26 -2v-15z" />
+<glyph unicode="n" horiz-adv-x="500" d="M485 0h-208l1 15q37 3 49.5 21.5t12.5 68.5v199q0 101 -73 101q-25 0 -47 -12t-56 -45v-276q0 -30 13.5 -42t51.5 -15v-15h-211v15q38 3 50 18.5t12 60.5v243q0 37 -7 51t-28 14q-20 0 -29 -4v17q70 20 137 45l8 -3v-78h1q71 81 144 81q57 0 87.5 -40t30.5 -114v-221 q0 -40 12 -53t49 -17v-15z" />
+<glyph unicode="o" horiz-adv-x="500" d="M470 231q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5t-62 170.5q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5zM380 204q0 114 -50 178q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="p" horiz-adv-x="500" d="M159 458v-77q63 79 144 79q73 0 120 -60t47 -153q0 -109 -60.5 -183t-149.5 -74q-31 0 -52.5 9t-48.5 34v-157q0 -47 16 -60.5t72 -14.5v-18h-242v17q44 4 57 17t13 52v468q0 35 -8 46t-33 11q-16 0 -25 -1v16q70 21 144 51zM159 334v-246q0 -22 34.5 -44t69.5 -22 q54 0 87.5 51t33.5 134q0 88 -33.5 140.5t-89.5 52.5q-35 0 -68.5 -22t-33.5 -44z" />
+<glyph unicode="q" horiz-adv-x="500" d="M488 -217h-236v17q53 4 71 19t18 57v188q-68 -74 -157 -74q-70 0 -115 60t-45 155q0 108 63.5 181.5t156.5 73.5q56 0 116 -35l54 32h11v-598q0 -32 12 -43.5t51 -15.5v-17zM341 127v206q0 98 -93 98q-64 0 -101 -51t-37 -139q0 -52 15.5 -96.5t40.5 -66.5q30 -27 75 -27 q53 0 88 32q12 11 12 44z" />
+<glyph unicode="r" horiz-adv-x="333" d="M160 458v-92q38 54 63.5 74t56.5 20q26 0 40.5 -14t14.5 -39q0 -21 -10.5 -33t-28.5 -12q-19 0 -40 20q-16 15 -26 15q-21 0 -45.5 -29t-24.5 -53v-225q0 -43 17 -58t68 -17v-15h-240v15q48 9 59.5 20t11.5 49v250q0 33 -7.5 46.5t-26.5 13.5q-16 0 -35 -4v16 q63 20 148 54z" />
+<glyph unicode="s" horiz-adv-x="389" d="M156 301l104 -63q50 -30 69 -56t19 -67q0 -50 -41.5 -87.5t-98.5 -37.5q-47 0 -73 9q-27 9 -46 9q-17 0 -24 -12h-13v157h16q16 -73 46 -107t81 -34q37 0 60 21t23 53q0 46 -53 75l-54 30q-120 67 -120 145q0 58 37.5 90.5t100.5 32.5q44 0 67 -11q18 -8 28 -8q7 0 16 10 h11l5 -136h-15q-17 68 -42.5 95.5t-70.5 27.5q-34 0 -54.5 -17t-20.5 -51q0 -17 11.5 -36.5t31.5 -31.5z" />
+<glyph unicode="t" horiz-adv-x="278" d="M266 77l13 -11q-48 -76 -121 -76q-88 0 -88 127v301h-53q-4 3 -4 7q0 8 17 19q38 22 97 107q2 3 9.5 12.5t10.5 15.5q7 0 7 -13v-116h101v-32h-101v-286q0 -48 12 -69t40 -21q30 0 60 35z" />
+<glyph unicode="u" horiz-adv-x="500" d="M480 50v-14q-78 -21 -137 -45l-5 3v82h-2q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251q0 37 -13 51t-49 16v14h146v-323q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5v231q0 39 -14 50.5t-60 14.5v17h158v-343q0 -35 11.5 -46t45.5 -11h6z" />
+<glyph unicode="v" horiz-adv-x="500" d="M477 450v-15q-23 -2 -34 -15t-31 -63l-128 -321q-20 -50 -28 -50t-18 26q-2 3 -4 10t-4 11l-120 287q-32 76 -47 94.5t-44 20.5v15h196v-15q-26 -2 -36 -8t-10 -19q0 -16 9 -38l102 -256l99 259q6 15 6 30q0 28 -47 32v15h139z" />
+<glyph unicode="w" horiz-adv-x="722" d="M694 450v-15q-15 -5 -22 -14.5t-19 -39.5l-138 -346q-20 -49 -28 -49q-5 0 -8.5 6.5t-15.5 36.5l-91 236l-112 -240q-18 -39 -25 -39q-9 0 -26 44l-135 342q-15 39 -25 50t-28 13v15h180v-15q-26 -3 -36 -10t-10 -23q0 -15 6 -30l99 -261l91 199l-20 56q-14 40 -27.5 53 t-41.5 16v15h203v-15q-35 -5 -46.5 -12t-11.5 -23t17 -60l84 -224l90 222q17 42 17 67q0 12 -9.5 18.5t-34.5 11.5v15h123z" />
+<glyph unicode="x" horiz-adv-x="500" d="M479 0h-201v15q25 2 32.5 6.5t7.5 17.5q0 9 -6 18l-91 140l-79 -123q-20 -31 -20 -41q0 -18 40 -18v-15h-145v15q25 2 38.5 11.5t34.5 39.5l114 165l-94 144q-23 35 -39 47.5t-38 12.5h-9v15h207v-15q-43 -1 -43 -22t46 -89q13 -18 14 -20q5 6 30 44q5 9 12 19t10.5 16 t7.5 12t5.5 10.5t1.5 7.5q0 19 -40 22v15h158v-15q-51 -2 -81 -44l-83 -120l128 -196q39 -60 82 -60v-15z" />
+<glyph unicode="y" horiz-adv-x="500" d="M475 450v-15q-18 -2 -29 -13t-21 -38l-150 -409q-39 -106 -78.5 -149.5t-96.5 -43.5q-32 0 -51 16.5t-19 41.5q0 19 12.5 32.5t30.5 13.5q29 0 52 -13q13 -7 26 -7q21 0 50 44q14 20 27 57t13 51q0 13 -42 101l-132 282q-13 29 -53 35v14h205v-15q-32 -1 -44.5 -7 t-12.5 -20q0 -11 13 -41l112 -250l97 276q4 9 4 18q0 24 -46 24v15h133z" />
+<glyph unicode="z" horiz-adv-x="444" d="M418 136l-15 -136h-376v15l266 405h-135q-47 0 -63.5 -16.5t-23.5 -71.5h-18l4 118h346v-15l-269 -405h133q84 0 106 27q14 17 27 83z" />
+<glyph unicode="{" horiz-adv-x="480" d="M350 -170v-11q-84 1 -121 25q-44 28 -44 115v177q0 52 -17.5 75t-67.5 39q50 15 67.5 38t17.5 75v178q0 87 44 114q38 24 121 25v-11q-52 -13 -71.5 -40t-19.5 -83v-168q0 -62 -19 -88t-75 -41q56 -14 75 -40t19 -88v-168q0 -56 19.5 -83t71.5 -40z" />
+<glyph unicode="|" horiz-adv-x="200" d="M133 -14h-66v690h66v-690z" />
+<glyph unicode="}" horiz-adv-x="480" d="M295 540v-177q0 -52 17.5 -75t67.5 -38q-50 -16 -67.5 -39t-17.5 -75v-178q0 -87 -44 -114q-38 -24 -121 -25v11q52 13 71.5 40t19.5 83v168q0 62 19 88t75 41q-56 14 -75 39.5t-19 88.5v168q0 56 -19.5 83t-71.5 40v11q84 -1 121 -25q44 -28 44 -115z" />
+<glyph unicode="~" horiz-adv-x="541" d="M466 325l36 -51q-32 -47 -61 -66.5t-64 -19.5q-10 0 -17.5 0.5t-16.5 3.5l-14 4q-5 1 -15 6l-16 7q-4 2 -19 10.5t-22 11.5q-50 25 -97 25q-26 0 -48.5 -19.5t-35.5 -53.5l-36 50q44 87 125 87q25 0 46 -6t71 -28l18 -8q15 -8 25.5 -12.5t26 -9t26.5 -4.5q31 0 49.5 18 t38.5 55z" />
+<glyph unicode="&#xa1;" horiz-adv-x="330" d="M202 417q0 -23 -15.5 -39t-38.5 -16q-22 0 -37 16t-15 39q0 22 15 36.5t38 14.5t38 -14.5t15 -36.5zM156 282l44 -381q2 -18 2 -39q0 -35 -14.5 -57.5t-38.5 -22.5q-53 0 -53 79q0 14 2 38l45 383h13z" />
+<glyph unicode="&#xa2;" horiz-adv-x="500" d="M435 164l13 -8q-25 -52 -43.5 -78t-44.5 -49q-44 -38 -102 -38q-26 0 -57 9l-49 -138h-34l51 150q-50 28 -74 64q-42 61 -42 143q0 101 63.5 171t156.5 70q21 0 51 -5l44 124h35l-47 -135q75 -30 75 -84q0 -20 -12 -32.5t-31 -12.5t-32 11.5t-26 40.5l-101 -291 q31 -12 59 -12q44 0 76 22t71 78zM198 98l115 323q-23 9 -47 9q-61 0 -98.5 -46.5t-37.5 -123.5q0 -54 15.5 -91t52.5 -71z" />
+<glyph unicode="&#xa3;" horiz-adv-x="500" d="M344 328h-121q1 -20 1 -61q0 -31 -25 -156q84 -35 149 -35q68 0 113 49q15 16 23 16q6 0 6 -5q0 -14 -14.5 -42.5t-30.5 -45.5q-52 -55 -122 -55q-33 0 -63.5 13t-81.5 48q-30 -36 -51 -49t-47 -13q-31 0 -49.5 16.5t-18.5 45.5q0 34 25 55t66 21q22 0 46 -5q3 12 3 21 q0 47 -16 149l-5 33h-108v45h107q-7 36 -7 69q0 107 53 170.5t142 63.5q56 0 93 -26.5t37 -66.5q0 -23 -14 -38t-36 -15t-30 13.5t-9 53.5q-1 52 -56 52q-45 0 -70 -36t-25 -101q0 -44 11 -139h125v-45zM142 76q0 7 -17.5 12.5t-36.5 5.5q-50 0 -50 -37q0 -17 11.5 -27 t30.5 -10q28 0 47 25q15 18 15 31z" />
+<glyph unicode="&#xa4;" horiz-adv-x="500" d="M522 40l-48 -50l-98 98q-59 -41 -125 -41q-68 0 -127 41l-96 -98l-50 50l98 96q-41 59 -41 126q0 69 41 126l-98 98l50 48l96 -96q61 39 127 39q69 0 125 -39l98 96l48 -48l-96 -98q39 -58 39 -125q0 -66 -39 -127zM397 264q0 62 -43 105.5t-105 43.5q-60 0 -103 -44 t-43 -106q0 -63 43.5 -107.5t104.5 -44.5q62 0 104 44.5t42 108.5z" />
+<glyph unicode="&#xa5;" horiz-adv-x="500" d="M512 662v-19q-39 -8 -65.5 -32t-52.5 -75l-92 -184h146v-40h-166l-7 -14v-76h173v-40h-173v-73q0 -53 16 -71t64 -19v-19h-244v19q50 2 64.5 20.5t14.5 80.5v62h-174v40h174v76l-7 14h-167v40h144l-95 173q-41 74 -62 95t-56 23v19h243v-19q-36 -1 -50.5 -7t-14.5 -21 q0 -20 13 -46l118 -221l112 220q14 26 14 45q0 13 -14.5 21.5t-36.5 8.5h-14v19h195z" />
+<glyph unicode="&#xa6;" horiz-adv-x="200" d="M133 400h-66v276h66v-276zM133 -14h-66v276h66v-276z" />
+<glyph unicode="&#xa7;" horiz-adv-x="500" d="M200 513l137 -113q89 -74 89 -155q0 -55 -33 -87.5t-89 -32.5h-12q56 -49 75 -78t19 -68q0 -57 -39.5 -92t-104.5 -35q-58 0 -98 29t-40 71q0 23 15.5 38.5t38.5 15.5q20 0 34 -12t14 -30q0 -22 -23 -41q-11 -9 -11 -15q0 -14 21.5 -24.5t49.5 -10.5q40 0 63.5 21 t23.5 56q0 29 -20.5 55.5t-68.5 59.5q-92 63 -131.5 114.5t-39.5 106.5q0 51 32.5 85t81.5 34q16 0 26 -1q-60 50 -80 80t-20 70q0 55 38.5 88.5t100.5 33.5q55 0 91.5 -28t36.5 -70q0 -25 -13.5 -39t-37.5 -14q-21 0 -34 12t-13 31q0 26 26 44q8 7 8 11q0 14 -18 23t-44 9 q-38 0 -61.5 -19.5t-23.5 -51.5q0 -42 34 -71zM374 211q0 41 -53 94q-80 78 -131 78q-29 0 -48 -19t-19 -47q0 -42 46 -88q84 -83 136 -83q27 0 48 20t21 45z" />
+<glyph unicode="&#xa8;" horiz-adv-x="333" d="M316 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM117 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#xa9;" horiz-adv-x="760" d="M547 248l-17 -76q-2 -10 -52.5 -20.5t-95.5 -10.5q-88 0 -140 51.5t-52 136.5q0 92 61 147.5t160 55.5q55 0 107 -22q13 -6 13 -17v-71h-17q-6 44 -34 67t-70 23q-66 0 -104.5 -48.5t-38.5 -126.5q0 -82 40.5 -129t107.5 -47q41 0 68.5 20.5t47.5 66.5h16zM722 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM667 334q0 124 -85.5 212t-204.5 88q-115 0 -199.5 -90.5t-84.5 -212.5q0 -124 85 -213.5t203 -89.5t202 90t84 216z" />
+<glyph unicode="&#xaa;" horiz-adv-x="276" d="M270 442v-18q-31 -30 -59 -30q-20 0 -30 10t-15 34q-47 -44 -91 -44q-31 0 -51 19t-20 49q0 32 22 51q20 17 41 27t90 36v30q0 42 -36 42q-17 0 -31 -7t-14 -16q0 -2 2 -14q1 -3 1 -8q0 -10 -9 -17.5t-22 -7.5q-14 0 -23 9t-9 22q0 29 30.5 48t77.5 19q105 0 105 -96 v-115q0 -21 2.5 -28t10.5 -7q15 0 28 12zM158 474v77q-53 -19 -72 -33t-19 -33q0 -18 11 -31t27 -13q19 0 42 11q11 10 11 22z" />
+<glyph unicode="&#xab;" horiz-adv-x="500" d="M42 227l81 73l48 44l56 53q22 19 26 19q11 0 11 -11q0 -6 -50 -72l-84 -106q23 -27 84 -107q50 -65 50 -76t-12 -11q-4 0 -27 21l-54 54l-48 46zM234 227l81 73l48 44l56 53q22 19 26 19q11 0 11 -11q0 -6 -50 -72l-84 -106q23 -27 84 -107q50 -65 50 -76t-12 -11 q-4 0 -27 21l-54 54l-48 46z" />
+<glyph unicode="&#xac;" horiz-adv-x="600" d="M552 115h-66v212h-438v66h504v-278z" />
+<glyph unicode="&#xad;" horiz-adv-x="333" d="M285 194h-246v63h246v-63z" />
+<glyph unicode="&#xae;" horiz-adv-x="760" d="M567 152h-64q-28 0 -71 79q-15 27 -52 83h-48v-92q0 -35 7 -44t40 -11v-15h-160l1 15q35 3 41.5 11t6.5 44v230q0 33 -7 41.5t-40 11.5v15h172q56 0 87 -26.5t31 -71.5q0 -32 -20 -59t-59 -39l57 -79q39 -53 78 -85v-8zM332 333h43q32 0 50.5 24t18.5 61q0 83 -74 83h-38 v-168zM722 329q0 -144 -99 -243.5t-242 -99.5q-145 0 -244 100t-99 246q0 145 100.5 244.5t246.5 99.5q140 0 238.5 -101.5t98.5 -245.5zM667 330q0 127 -84.5 215.5t-204.5 88.5q-115 0 -200 -90.5t-85 -212.5q0 -124 85 -213.5t203 -89.5q117 0 201.5 89.5t84.5 212.5z " />
+<glyph unicode="&#xaf;" horiz-adv-x="333" d="M322 547h-311v54h311v-54z" />
+<glyph unicode="&#xb0;" horiz-adv-x="400" d="M343 533q0 -60 -41.5 -101.5t-101.5 -41.5q-61 0 -102 41.5t-41 102.5q0 60 42 101t103 41q58 0 99.5 -42t41.5 -101zM304 534q0 44 -31.5 76t-74.5 32q-41 0 -71.5 -32.5t-30.5 -76.5q0 -45 30.5 -77t73.5 -32t73.5 32.5t30.5 77.5z" />
+<glyph unicode="&#xb1;" d="M637 242h-262v-209h-66v209h-261v66h261v194h66v-194h262v-66zM637 -87h-589v66h589v-66z" />
+<glyph unicode="&#xb2;" horiz-adv-x="300" d="M296 355l-39 -85h-251v24l101 108q78 84 78 138q0 32 -20.5 54t-50.5 22q-54 0 -88 -74l-25 15q22 64 55 91.5t95 27.5q58 0 92 -30.5t34 -78.5q0 -37 -19 -70.5t-67 -80.5l-84 -81h113q40 0 58 27z" />
+<glyph unicode="&#xb3;" horiz-adv-x="300" d="M204 511v-2q43 -11 65 -41.5t22 -68.5q0 -60 -52 -98.5t-135 -38.5q-40 0 -65.5 16t-25.5 40q0 31 37 31q15 0 41 -19q27 -20 51 -20q30 0 49 20t19 51q0 39 -23.5 60.5t-65.5 21.5q-4 0 -28 -3v29q52 18 73.5 37.5t21.5 46.5q0 47 -56 47q-27 0 -46.5 -13t-39.5 -45 l-25 19q27 51 58.5 73t76.5 22q46 0 77 -24t31 -59q0 -52 -60 -82z" />
+<glyph unicode="&#xb4;" horiz-adv-x="333" d="M93 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40z" />
+<glyph unicode="&#xb5;" horiz-adv-x="500" d="M430 450v-354q0 -69 31 -69q19 0 51 29v-9q-26 -33 -43.5 -45t-45.5 -12q-30 0 -52.5 24t-23.5 66h-2q-49 -90 -131 -90q-43 0 -71 17.5t-52 56.5q1 -24 19 -100.5t18 -104.5q0 -77 -48 -77q-21 0 -32.5 21.5t-11.5 55.5q0 29 12 107t12 88v396h88v-295q0 -51 22 -77 t62 -26q79 0 110 63v335h88z" />
+<glyph unicode="&#xb6;" horiz-adv-x="592" d="M532 -154h-154v794h-58v-794h-155v22q58 4 73.5 22t15.5 81v302q-99 8 -146.5 52.5t-47.5 145.5q0 98 50 144.5t159 46.5h263v-19q-56 -5 -72 -24.5t-16 -76.5v-583q0 -54 15.5 -70.5t72.5 -20.5v-22zM254 295v345q-69 -7 -93.5 -43.5t-24.5 -123.5t27 -129t91 -49z" />
+<glyph unicode="&#xb7;" horiz-adv-x="250" d="M181 253q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40z" />
+<glyph unicode="&#xb8;" horiz-adv-x="333" d="M174 0l-25 -65q15 3 26 3q41 0 63.5 -18t22.5 -51q0 -39 -33.5 -61.5t-91.5 -22.5q-45 0 -84 16l14 31q36 -12 65 -12q25 0 40 12t15 32q0 19 -12 27.5t-41 8.5q-17 0 -28 -4l-7 5l41 99h35z" />
+<glyph unicode="&#xb9;" horiz-adv-x="300" d="M248 270h-191v24q32 2 42.5 9t10.5 24v254q0 30 -9 30q-12 0 -42 -14v24l118 55l14 -4v-339q0 -20 13 -29.5t44 -9.5v-24z" />
+<glyph unicode="&#xba;" horiz-adv-x="310" d="M304 542q0 -63 -43.5 -105.5t-109.5 -42.5q-63 0 -104 39t-41 100q0 64 42 103.5t111 39.5q64 0 104.5 -37.5t40.5 -96.5zM231 516q0 56 -23 91.5t-60 35.5q-31 0 -50 -20.5t-19 -53.5q0 -63 25 -108q19 -34 56 -34q71 0 71 89z" />
+<glyph unicode="&#xbb;" horiz-adv-x="500" d="M265 222l-81 -73l-47 -45l-58 -52q-21 -19 -25 -19q-11 0 -11 11q0 6 50 72l84 106q-23 27 -84 107q-50 65 -50 76t12 11q4 0 26 -22l56 -53l47 -46zM458 222l-81 -73l-47 -45l-58 -52q-21 -19 -25 -19q-11 0 -11 11q0 6 50 72l84 106q-23 27 -84 107q-50 65 -50 76 t12 11q4 0 26 -22l56 -53l47 -46z" />
+<glyph unicode="&#xbc;" horiz-adv-x="750" d="M632 676l-450 -690h-49l453 690h46zM713 90h-55v-90h-70v90h-180v49l203 266h47v-258h55v-57zM588 147v179l-135 -179h135zM223 270h-181v24q32 2 42.5 9t10.5 24v254q0 30 -9 30q-12 0 -42 -14v24l108 55l14 -4v-339q0 -20 13 -29.5t44 -9.5v-24z" />
+<glyph unicode="&#xbd;" horiz-adv-x="750" d="M741 85l-39 -85h-251v24l101 108q78 84 78 138q0 32 -20.5 54t-50.5 22q-54 0 -88 -74l-25 15q22 64 55 91.5t95 27.5q58 0 92 -30.5t34 -78.5q0 -37 -19 -70.5t-67 -80.5l-84 -81h113q40 0 58 27zM595 676l-450 -690h-49l453 690h46zM217 270h-181v24q32 2 42.5 9 t10.5 24v254q0 30 -9 30q-12 0 -42 -14v24l108 55l14 -4v-339q0 -20 13 -29.5t44 -9.5v-24z" />
+<glyph unicode="&#xbe;" horiz-adv-x="750" d="M204 511v-2q43 -11 65 -41.5t22 -68.5q0 -60 -52 -98.5t-135 -38.5q-40 0 -65.5 16t-25.5 40q0 31 37 31q15 0 41 -19q27 -20 51 -20q30 0 49 20t19 51q0 39 -23.5 60.5t-65.5 21.5q-4 0 -28 -3v29q52 18 73.5 37.5t21.5 46.5q0 47 -56 47q-27 0 -46.5 -13t-39.5 -45 l-25 19q27 51 58.5 73t76.5 22q46 0 77 -24t31 -59q0 -52 -60 -82zM637 676l-450 -690h-49l453 690h46zM718 90h-55v-90h-70v90h-180v49l203 266h47v-258h55v-57zM593 147v179l-135 -179h135z" />
+<glyph unicode="&#xbf;" horiz-adv-x="444" d="M260 416q0 -23 -15.5 -39t-38.5 -16q-22 0 -37 16t-15 39q0 22 15 36.5t38 14.5t38 -14.5t15 -36.5zM200 294h17q-2 -84 -58 -206q-37 -80 -37 -157q0 -50 31.5 -84.5t77.5 -34.5q36 0 65 19t29 43q0 11 -17 31q-21 24 -21 43t11 30t30 11q48 0 48 -62t-46.5 -103.5 t-115.5 -41.5q-41 0 -81.5 16t-66.5 42q-36 36 -36 97q0 45 20.5 83.5t84.5 119.5q49 61 65 154z" />
+<glyph unicode="&#xc0;" horiz-adv-x="722" d="M451 757h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23zM707 0h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70t54.5 -22v-19z M447 257l-116 275l-115 -275h231z" />
+<glyph unicode="&#xc1;" horiz-adv-x="722" d="M276 757l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM707 0h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70 t54.5 -22v-19zM447 257l-116 275l-115 -275h231z" />
+<glyph unicode="&#xc2;" horiz-adv-x="722" d="M513 757h-34l-122 103l-121 -103h-34l124 167h62zM707 0h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70t54.5 -22v-19zM447 257 l-116 275l-115 -275h231z" />
+<glyph unicode="&#xc3;" horiz-adv-x="722" d="M707 0h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70t54.5 -22v-19zM447 257l-116 275l-115 -275h231zM495 888h29q-16 -57 -40 -81.5 t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37.5 75t63.5 26q34 0 70 -18l24 -12q29 -15 53 -15q17 0 28.5 11t24.5 39z" />
+<glyph unicode="&#xc4;" horiz-adv-x="722" d="M508 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM309 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM707 0h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94 h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70t54.5 -22v-19zM447 257l-116 275l-115 -275h231z" />
+<glyph unicode="&#xc5;" horiz-adv-x="722" d="M459 861q0 -41 -29.5 -70t-71.5 -29q-41 0 -69.5 29t-28.5 71q0 41 29.5 70t71.5 29q40 0 69 -29.5t29 -70.5zM425 862q0 27 -19.5 46t-47.5 19q-26 0 -45 -19.5t-19 -45.5q0 -28 19 -47t45 -19q28 0 47.5 19t19.5 47zM707 0h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70 l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70t54.5 -22v-19zM447 257l-116 275l-115 -275h231z" />
+<glyph unicode="&#xc6;" horiz-adv-x="889" d="M863 168l-44 -168h-509v19l17 2q45 5 58 22.5t13 68.5v148h-176q-92 -175 -92 -212q0 -23 67 -29h1v-19h-198v19q32 5 49 19.5t39 58.5l245 484q9 17 9 28q0 33 -90 33v20h564v-141h-23q-10 68 -42 86.5t-142 18.5h-84q-28 0 -28 -37v-223h104q77 0 107.5 19.5t31.5 78.5 h21v-235h-21q-7 59 -28.5 79.5t-73.5 20.5h-141v-235q0 -38 11 -47t59 -9h73q85 0 122.5 24t76.5 106h24zM398 299v319l-158 -319h158z" />
+<glyph unicode="&#xc7;" horiz-adv-x="667" d="M614 131l19 -18q-43 -61 -115 -94t-158 -33q-15 0 -24 1l-20 -52q15 3 26 3q41 0 63.5 -18t22.5 -51q0 -39 -33.5 -61.5t-91.5 -22.5q-45 0 -84 16l14 31q36 -12 65 -12q25 0 40 12t15 32q0 19 -12 27.5t-41 8.5q-17 0 -28 -4l-7 5l37 89q-113 15 -186 91q-88 93 -88 248 q0 188 139 287q85 60 195 60q78 0 147 -24q29 -9 40 -9q32 0 41 33h21l9 -226h-23q-11 78 -74 132t-141 54q-108 0 -173 -79.5t-65 -210.5q0 -159 67 -238q66 -78 181 -78q62 0 114 24t108 77z" />
+<glyph unicode="&#xc8;" horiz-adv-x="611" d="M402 757h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23zM597 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-25q-11 67 -39 86t-115 19h-131q-22 0 -28.5 -6.5t-6.5 -29.5v-220h151q63 0 83.5 18t29.5 78h23v-234h-23 q-9 63 -29 80t-84 17h-151v-243q0 -30 21 -38.5t80 -8.5h36q107 0 152 26t79 106h28z" />
+<glyph unicode="&#xc9;" horiz-adv-x="611" d="M245 757l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM597 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-25q-11 67 -39 86t-115 19h-131q-22 0 -28.5 -6.5t-6.5 -29.5v-220h151q63 0 83.5 18t29.5 78h23 v-234h-23q-9 63 -29 80t-84 17h-151v-243q0 -30 21 -38.5t80 -8.5h36q107 0 152 26t79 106h28z" />
+<glyph unicode="&#xca;" horiz-adv-x="611" d="M483 757h-34l-122 103l-121 -103h-34l124 167h62zM597 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-25q-11 67 -39 86t-115 19h-131q-22 0 -28.5 -6.5t-6.5 -29.5v-220h151q63 0 83.5 18t29.5 78h23v-234h-23q-9 63 -29 80 t-84 17h-151v-243q0 -30 21 -38.5t80 -8.5h36q107 0 152 26t79 106h28z" />
+<glyph unicode="&#xcb;" horiz-adv-x="611" d="M475 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM276 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM597 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436 q0 56 -15.5 73t-71.5 20v19h530l4 -143h-25q-11 67 -39 86t-115 19h-131q-22 0 -28.5 -6.5t-6.5 -29.5v-220h151q63 0 83.5 18t29.5 78h23v-234h-23q-9 63 -29 80t-84 17h-151v-243q0 -30 21 -38.5t80 -8.5h36q107 0 152 26t79 106h28z" />
+<glyph unicode="&#xcc;" horiz-adv-x="333" d="M269 757h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23zM315 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#xcd;" horiz-adv-x="333" d="M64 757l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM315 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#xce;" horiz-adv-x="333" d="M321 757h-34l-122 103l-121 -103h-34l124 167h62zM307 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#xcf;" horiz-adv-x="333" d="M315 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM116 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM314 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73 t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#xd0;" horiz-adv-x="722" d="M16 662h270q188 0 293.5 -86.5t105.5 -241.5q0 -76 -29 -142.5t-81 -109.5q-100 -82 -275 -82h-284v19q57 4 72.5 20t15.5 70v206h-83v44h83v194q0 55 -14.5 70t-73.5 20v19zM206 315v-237q0 -24 11 -32.5t40 -8.5q125 0 197 41q122 71 122 249q0 168 -122 250 q-70 48 -199 48q-29 0 -39 -8t-10 -31v-227h146v-44h-146z" />
+<glyph unicode="&#xd1;" horiz-adv-x="722" d="M707 662v-19q-51 -5 -66 -18q-16 -14 -22.5 -38t-6.5 -80v-518h-18l-441 549v-388q0 -76 17 -99.5t76 -31.5v-19h-234v19q62 7 79.5 29.5t17.5 101.5v440q-26 32 -44 42.5t-53 10.5v19h170l386 -483v340q0 76 -19 98q-12 13 -26.5 17.5t-52.5 8.5v19h237zM489 888h29 q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37.5 75t63.5 26q34 0 70 -18l24 -12q29 -15 53 -15q17 0 28.5 11t24.5 39z" />
+<glyph unicode="&#xd2;" horiz-adv-x="722" d="M450 757h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23zM688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67 q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#xd3;" horiz-adv-x="722" d="M259 757l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67 q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#xd4;" horiz-adv-x="722" d="M510 757h-34l-122 103l-121 -103h-34l124 167h62zM688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67q-32 -36 -50.5 -102.5 t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#xd5;" horiz-adv-x="722" d="M688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45 q78 0 129 48q83 80 83 267zM489 888h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37.5 75t63.5 26q34 0 70 -18l24 -12q29 -15 53 -15q17 0 28.5 11t24.5 39z" />
+<glyph unicode="&#xd6;" horiz-adv-x="722" d="M503 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM304 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96 t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#xd7;" horiz-adv-x="640" d="M597 22l-46 -47l-231 230l-231 -230l-46 46l230 231l-230 231l47 46l230 -230l231 230l46 -45l-230 -232z" />
+<glyph unicode="&#xd8;" horiz-adv-x="722" d="M658 734l-88 -130q57 -53 79 -99q39 -81 39 -173q0 -154 -91.5 -250t-237.5 -96q-91 0 -175 50l-79 -116h-49l95 139q-33 30 -49.5 50.5t-29.5 48.5q-38 78 -38 172q0 152 91.5 249t236.5 97q88 0 175 -49l72 107h49zM194 123l308 452q-62 65 -141 65q-98 0 -155.5 -83.5 t-57.5 -226.5q0 -120 46 -207zM527 540l-308 -452q60 -66 142 -66q99 0 156 82.5t57 225.5q0 120 -47 210z" />
+<glyph unicode="&#xd9;" horiz-adv-x="722" d="M453 757h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23zM705 662v-19q-61 -6 -77.5 -29.5t-16.5 -97.5v-255q0 -77 -11 -121t-43 -81q-64 -73 -202 -73q-109 0 -170 46q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19h283v-19q-60 -5 -75.5 -21.5t-15.5 -72.5v-312 q0 -65 8 -100t36 -62q47 -45 128 -45q101 0 152 59q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h232z" />
+<glyph unicode="&#xda;" horiz-adv-x="722" d="M264 757l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM705 662v-19q-61 -6 -77.5 -29.5t-16.5 -97.5v-255q0 -77 -11 -121t-43 -81q-64 -73 -202 -73q-109 0 -170 46q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19h283v-19q-60 -5 -75.5 -21.5 t-15.5 -72.5v-312q0 -65 8 -100t36 -62q47 -45 128 -45q101 0 152 59q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h232z" />
+<glyph unicode="&#xdb;" horiz-adv-x="722" d="M511 757h-34l-122 103l-121 -103h-34l124 167h62zM705 662v-19q-61 -6 -77.5 -29.5t-16.5 -97.5v-255q0 -77 -11 -121t-43 -81q-64 -73 -202 -73q-109 0 -170 46q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19h283v-19q-60 -5 -75.5 -21.5t-15.5 -72.5v-312 q0 -65 8 -100t36 -62q47 -45 128 -45q101 0 152 59q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h232z" />
+<glyph unicode="&#xdc;" horiz-adv-x="722" d="M503 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM304 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM705 662v-19q-61 -6 -77.5 -29.5t-16.5 -97.5v-255 q0 -77 -11 -121t-43 -81q-64 -73 -202 -73q-109 0 -170 46q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19h283v-19q-60 -5 -75.5 -21.5t-15.5 -72.5v-312q0 -65 8 -100t36 -62q47 -45 128 -45q101 0 152 59q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h232z" />
+<glyph unicode="&#xdd;" horiz-adv-x="722" d="M266 757l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM703 662v-19q-44 -4 -69.5 -25t-68.5 -87l-148 -228v-192q0 -57 19 -73t84 -19v-19h-306v19q68 5 84.5 21.5t16.5 82.5v171l-131 192q-68 100 -97 127.5t-65 29.5v19h279v-19l-24 -1 q-47 -1 -47 -26q0 -21 18 -47l146 -221l145 222q14 21 14 42q-1 17 -15.5 23.5t-52.5 7.5v19h218z" />
+<glyph unicode="&#xde;" horiz-adv-x="556" d="M202 532h80q120 0 190 -49t70 -132q0 -49 -26 -92t-70 -67q-61 -34 -175 -34q-29 0 -69 3v-52q0 -55 17.5 -71.5t76.5 -18.5v-19h-280v19q57 5 70.5 21.5t13.5 79.5v433q0 54 -14 69t-70 21v19h277v-19q-61 -5 -76.5 -24t-14.5 -87zM202 461v-260q33 -3 57 -3 q174 0 174 147q0 78 -47.5 113.5t-151.5 35.5q-19 0 -25.5 -6.5t-6.5 -26.5z" />
+<glyph unicode="&#xdf;" horiz-adv-x="500" d="M73 84v370q0 116 43.5 172.5t134.5 56.5q78 0 124 -41t46 -111q0 -54 -28.5 -85.5t-108.5 -68.5q82 -16 122 -51q62 -53 62 -140q0 -83 -51.5 -139t-127.5 -56q-43 0 -70 20.5t-27 52.5q0 20 13 34t32 14q17 0 29 -11.5t13 -28.5l2 -22q1 -16 8 -23t21 -7q28 0 40 18 q24 33 24 112q0 202 -132 207q-32 1 -32 17q0 12 29 15q95 10 95 127q0 66 -24 103t-67 37q-40 0 -63 -29t-23 -78v-549h-145v15q38 3 49.5 16t11.5 53z" />
+<glyph unicode="&#xe0;" horiz-adv-x="444" d="M442 66v-28q-38 -48 -90 -48q-57 0 -64 73h-1q-64 -73 -145 -73q-47 0 -76 27.5t-29 76.5q0 70 70 117q48 32 180 81v54q0 45 -21.5 67.5t-56.5 22.5q-30 0 -50 -14.5t-20 -34.5q0 -9 3 -20t3 -22q0 -15 -13.5 -28t-32.5 -13q-17 0 -30 13t-13 33q0 48 51 80 q47 30 115 30q81 0 118 -45q18 -21 23 -42.5t5 -68.5v-191q0 -66 31 -66q20 0 43 19zM287 127v141q-92 -32 -128 -66q-34 -31 -34 -77q0 -38 19 -57.5t50 -19.5q33 0 58 16q21 15 28 28t7 35zM317 507h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23z" />
+<glyph unicode="&#xe1;" horiz-adv-x="444" d="M119 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM442 66v-28q-38 -48 -90 -48q-57 0 -64 73h-1q-64 -73 -145 -73q-47 0 -76 27.5t-29 76.5q0 70 70 117q48 32 180 81v54q0 45 -21.5 67.5t-56.5 22.5q-30 0 -50 -14.5t-20 -34.5q0 -9 3 -20t3 -22 q0 -15 -13.5 -28t-32.5 -13q-17 0 -30 13t-13 33q0 48 51 80q47 30 115 30q81 0 118 -45q18 -21 23 -42.5t5 -68.5v-191q0 -66 31 -66q20 0 43 19zM287 127v141q-92 -32 -128 -66q-34 -31 -34 -77q0 -38 19 -57.5t50 -19.5q33 0 58 16q21 15 28 28t7 35z" />
+<glyph unicode="&#xe2;" horiz-adv-x="444" d="M381 507h-34l-122 103l-121 -103h-34l124 167h62zM442 66v-28q-38 -48 -90 -48q-57 0 -64 73h-1q-64 -73 -145 -73q-47 0 -76 27.5t-29 76.5q0 70 70 117q48 32 180 81v54q0 45 -21.5 67.5t-56.5 22.5q-30 0 -50 -14.5t-20 -34.5q0 -9 3 -20t3 -22q0 -15 -13.5 -28 t-32.5 -13q-17 0 -30 13t-13 33q0 48 51 80q47 30 115 30q81 0 118 -45q18 -21 23 -42.5t5 -68.5v-191q0 -66 31 -66q20 0 43 19zM287 127v141q-92 -32 -128 -66q-34 -31 -34 -77q0 -38 19 -57.5t50 -19.5q33 0 58 16q21 15 28 28t7 35z" />
+<glyph unicode="&#xe3;" horiz-adv-x="444" d="M360 638h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37 75t64 26q34 0 70 -18l24 -12q28 -15 53 -15q17 0 28.5 11t24.5 39zM442 66v-28q-38 -48 -90 -48q-57 0 -64 73h-1q-64 -73 -145 -73q-47 0 -76 27.5t-29 76.5 q0 70 70 117q48 32 180 81v54q0 45 -21.5 67.5t-56.5 22.5q-30 0 -50 -14.5t-20 -34.5q0 -9 3 -20t3 -22q0 -15 -13.5 -28t-32.5 -13q-17 0 -30 13t-13 33q0 48 51 80q47 30 115 30q81 0 118 -45q18 -21 23 -42.5t5 -68.5v-191q0 -66 31 -66q20 0 43 19zM287 127v141 q-92 -32 -128 -66q-34 -31 -34 -77q0 -38 19 -57.5t50 -19.5q33 0 58 16q21 15 28 28t7 35z" />
+<glyph unicode="&#xe4;" horiz-adv-x="444" d="M373 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM174 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM442 66v-28q-38 -48 -90 -48q-57 0 -64 73h-1 q-64 -73 -145 -73q-47 0 -76 27.5t-29 76.5q0 70 70 117q48 32 180 81v54q0 45 -21.5 67.5t-56.5 22.5q-30 0 -50 -14.5t-20 -34.5q0 -9 3 -20t3 -22q0 -15 -13.5 -28t-32.5 -13q-17 0 -30 13t-13 33q0 48 51 80q47 30 115 30q81 0 118 -45q18 -21 23 -42.5t5 -68.5v-191 q0 -66 31 -66q20 0 43 19zM287 127v141q-92 -32 -128 -66q-34 -31 -34 -77q0 -38 19 -57.5t50 -19.5q33 0 58 16q21 15 28 28t7 35z" />
+<glyph unicode="&#xe5;" horiz-adv-x="444" d="M324 613q0 -41 -29.5 -70t-71.5 -29q-41 0 -69.5 29t-28.5 71q0 41 29.5 70t71.5 29q40 0 69 -29.5t29 -70.5zM290 614q0 27 -19.5 46t-47.5 19q-26 0 -45 -19.5t-19 -45.5q0 -28 19 -47t45 -19q28 0 47.5 19t19.5 47zM442 66v-28q-38 -48 -90 -48q-57 0 -64 73h-1 q-64 -73 -145 -73q-47 0 -76 27.5t-29 76.5q0 70 70 117q48 32 180 81v54q0 45 -21.5 67.5t-56.5 22.5q-30 0 -50 -14.5t-20 -34.5q0 -9 3 -20t3 -22q0 -15 -13.5 -28t-32.5 -13q-17 0 -30 13t-13 33q0 48 51 80q47 30 115 30q81 0 118 -45q18 -21 23 -42.5t5 -68.5v-191 q0 -66 31 -66q20 0 43 19zM287 127v141q-92 -32 -128 -66q-34 -31 -34 -77q0 -38 19 -57.5t50 -19.5q33 0 58 16q21 15 28 28t7 35z" />
+<glyph unicode="&#xe6;" horiz-adv-x="667" d="M620 154l12 -5q-39 -84 -79 -116q-48 -40 -118 -40q-44 0 -74 16t-55 54q-50 -42 -81.5 -56t-70.5 -14q-51 0 -83.5 29.5t-32.5 77.5q0 21 1.5 35.5t7.5 33t17.5 31t31.5 25t49 20.5l129 36v63q0 49 -13.5 69.5t-47.5 20.5q-28 0 -48 -12.5t-20 -29.5q0 -7 1.5 -19.5 t1.5 -22.5q0 -21 -12 -33.5t-32 -12.5t-32 13t-12 35q0 46 46 77t113 31q37 0 63 -10.5t55 -36.5q34 27 59 37t60 10q76 0 114 -43t46 -140h-262q1 -75 6 -108t21 -62q13 -23 38.5 -36.5t56.5 -13.5q43 0 75.5 22t68.5 75zM355 307h166q-1 66 -19.5 94t-59.5 28 q-43 0 -63 -28t-24 -94zM274 201v52q-91 -33 -120 -58t-29 -70q0 -38 16.5 -62.5t49.5 -24.5q28 0 65 18t37 32l-1 1v2q-18 59 -18 110z" />
+<glyph unicode="&#xe7;" horiz-adv-x="444" d="M398 156l14 -9q-39 -79 -82 -115.5t-104 -41.5l-21 -55q15 3 26 3q41 0 63.5 -18t22.5 -51q0 -39 -33.5 -61.5t-91.5 -22.5q-45 0 -84 16l14 31q36 -12 65 -12q25 0 40 12t15 32q0 19 -12 27.5t-41 8.5q-17 0 -28 -4l-7 5l38 91q-76 10 -121.5 70.5t-45.5 149.5 q0 128 84 197q62 51 135 51q63 0 108.5 -30.5t45.5 -72.5q0 -17 -14 -29.5t-33 -12.5q-35 0 -48 46l-6 22q-8 28 -20 38t-39 10q-61 0 -98.5 -48t-37.5 -126q0 -86 43 -140.5t112 -54.5q43 0 74 21t67 73z" />
+<glyph unicode="&#xe8;" horiz-adv-x="444" d="M408 164l16 -7q-60 -167 -209 -167q-88 0 -139 61.5t-51 165.5q0 107 57 175t150 68q90 0 139 -69q29 -40 34 -114h-308q4 -63 12.5 -96t33.5 -67q42 -55 111 -55q49 0 82.5 24t71.5 81zM99 309h204q-9 63 -29.5 89t-68.5 26q-42 0 -70 -29.5t-36 -85.5zM310 507h-40 l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23z" />
+<glyph unicode="&#xe9;" horiz-adv-x="444" d="M116 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM408 164l16 -7q-60 -167 -209 -167q-88 0 -139 61.5t-51 165.5q0 107 57 175t150 68q90 0 139 -69q29 -40 34 -114h-308q4 -63 12.5 -96t33.5 -67q42 -55 111 -55q49 0 82.5 24t71.5 81zM99 309 h204q-9 63 -29.5 89t-68.5 26q-42 0 -70 -29.5t-36 -85.5z" />
+<glyph unicode="&#xea;" horiz-adv-x="444" d="M380 507h-34l-122 103l-121 -103h-34l124 167h62zM408 164l16 -7q-60 -167 -209 -167q-88 0 -139 61.5t-51 165.5q0 107 57 175t150 68q90 0 139 -69q29 -40 34 -114h-308q4 -63 12.5 -96t33.5 -67q42 -55 111 -55q49 0 82.5 24t71.5 81zM99 309h204q-9 63 -29.5 89 t-68.5 26q-42 0 -70 -29.5t-36 -85.5z" />
+<glyph unicode="&#xeb;" horiz-adv-x="444" d="M372 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM173 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM408 164l16 -7q-60 -167 -209 -167q-88 0 -139 61.5 t-51 165.5q0 107 57 175t150 68q90 0 139 -69q29 -40 34 -114h-308q4 -63 12.5 -96t33.5 -67q42 -55 111 -55q49 0 82.5 24t71.5 81zM99 309h204q-9 63 -29.5 89t-68.5 26q-42 0 -70 -29.5t-36 -85.5z" />
+<glyph unicode="&#xec;" horiz-adv-x="278" d="M243 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l154 55l5 -4v-351q0 -56 12.5 -71t61.5 -19v-15zM230 507h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23z" />
+<glyph unicode="&#xed;" horiz-adv-x="278" d="M253 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l154 55l5 -4v-351q0 -56 12.5 -71t61.5 -19v-15zM49 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40z" />
+<glyph unicode="&#xee;" horiz-adv-x="278" d="M294 507h-34l-122 103l-121 -103h-34l124 167h62zM220 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l154 55l5 -4v-351q0 -56 12.5 -71t61.5 -19v-15z" />
+<glyph unicode="&#xef;" horiz-adv-x="278" d="M227 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l154 55l5 -4v-351q0 -56 12.5 -71t61.5 -19v-15zM288 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM89 572q0 -20 -15 -34.5t-36 -14.5 q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#xf0;" horiz-adv-x="500" d="M424 656l-91 -48q138 -116 138 -323q0 -113 -53 -198q-62 -97 -173 -97q-95 0 -155.5 62t-60.5 165q0 105 63 174t154 69q36 0 60.5 -12t60.5 -48q-11 56 -32.5 95.5t-64.5 79.5l-123 -65l-33 30l121 64q-49 41 -134 55l42 24q97 -6 153 -47l95 50zM381 202 q0 103 -40.5 166.5t-105.5 63.5q-50 0 -83 -43.5t-33 -107.5q0 -41 8 -84t23.5 -84.5t45 -68t67.5 -26.5q53 0 85.5 49.5t32.5 134.5z" />
+<glyph unicode="&#xf1;" horiz-adv-x="500" d="M392 638h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37 75t64 26q34 0 70 -18l24 -12q28 -15 53 -15q17 0 28.5 11t24.5 39zM485 0h-208l1 15q37 3 49.5 21.5t12.5 68.5v199q0 101 -73 101q-25 0 -47 -12t-56 -45v-276 q0 -30 13.5 -42t51.5 -15v-15h-211v15q38 3 50 18.5t12 60.5v243q0 37 -7 51t-28 14q-20 0 -29 -4v17q70 20 137 45l8 -3v-78h1q71 81 144 81q57 0 87.5 -40t30.5 -114v-221q0 -40 12 -53t49 -17v-15z" />
+<glyph unicode="&#xf2;" horiz-adv-x="500" d="M470 231q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5t-62 170.5q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5zM380 204q0 114 -50 178q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5zM332 507h-40 l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23z" />
+<glyph unicode="&#xf3;" horiz-adv-x="500" d="M154 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM470 231q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5t-62 170.5q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5zM380 204q0 114 -50 178q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5 q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="&#xf4;" horiz-adv-x="500" d="M401 507h-34l-122 103l-121 -103h-34l124 167h62zM470 231q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5t-62 170.5q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5zM380 204q0 114 -50 178q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205 q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="&#xf5;" horiz-adv-x="500" d="M470 231q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5t-62 170.5q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5zM380 204q0 114 -50 178q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5zM381 638h29 q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37.5 75t63.5 26q34 0 70 -18l24 -12q29 -15 53 -15q17 0 28.5 11t24.5 39z" />
+<glyph unicode="&#xf6;" horiz-adv-x="500" d="M394 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM195 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM470 231q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5 t-62 170.5q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5zM380 204q0 114 -50 178q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="&#xf7;" horiz-adv-x="564" d="M338 459q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40zM338 44q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40zM534 220h-504v66h504v-66z" />
+<glyph unicode="&#xf8;" horiz-adv-x="500" d="M437 551l-65 -125q98 -67 98 -192q0 -104 -64 -174t-159 -70q-47 0 -93 21l-65 -123h-37l73 140q-45 36 -65 73q-31 57 -31 126q0 102 61.5 167.5t158.5 65.5q44 0 92 -18l57 109h39zM158 92l159 304q-37 36 -80 36q-53 0 -85.5 -42.5t-32.5 -112.5q0 -101 39 -185z M340 366l-161 -306q35 -42 82 -42q56 0 87.5 48.5t31.5 136.5q0 87 -40 163z" />
+<glyph unicode="&#xf9;" horiz-adv-x="500" d="M480 50v-14q-78 -21 -137 -45l-5 3v82h-2q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251q0 37 -13 51t-49 16v14h146v-323q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5v231q0 39 -14 50.5t-60 14.5v17h158v-343q0 -35 11.5 -46t45.5 -11h6zM339 507 h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23z" />
+<glyph unicode="&#xfa;" horiz-adv-x="500" d="M156 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM480 50v-14q-78 -21 -137 -45l-5 3v82h-2q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251q0 37 -13 51t-49 16v14h146v-323q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5v231 q0 39 -14 50.5t-60 14.5v17h158v-343q0 -35 11.5 -46t45.5 -11h6z" />
+<glyph unicode="&#xfb;" horiz-adv-x="500" d="M401 507h-34l-122 103l-121 -103h-34l124 167h62zM480 50v-14q-78 -21 -137 -45l-5 3v82h-2q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251q0 37 -13 51t-49 16v14h146v-323q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5v231q0 39 -14 50.5t-60 14.5 v17h158v-343q0 -35 11.5 -46t45.5 -11h6z" />
+<glyph unicode="&#xfc;" horiz-adv-x="500" d="M393 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM194 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM480 50v-14q-78 -21 -137 -45l-5 3v82h-2 q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251q0 37 -13 51t-49 16v14h146v-323q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5v231q0 39 -14 50.5t-60 14.5v17h158v-343q0 -35 11.5 -46t45.5 -11h6z" />
+<glyph unicode="&#xfd;" horiz-adv-x="500" d="M143 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM475 450v-15q-18 -2 -29 -13t-21 -38l-150 -409q-39 -106 -78.5 -149.5t-96.5 -43.5q-32 0 -51 16.5t-19 41.5q0 19 12.5 32.5t30.5 13.5q29 0 52 -13q13 -7 26 -7q21 0 50 44q14 20 27 57t13 51 q0 13 -42 101l-132 282q-13 29 -53 35v14h205v-15q-32 -1 -44.5 -7t-12.5 -20q0 -11 13 -41l112 -250l97 276q4 9 4 18q0 24 -46 24v15h133z" />
+<glyph unicode="&#xfe;" horiz-adv-x="500" d="M159 679v-299q59 80 144 80q78 0 122.5 -57t44.5 -156q0 -109 -60.5 -183t-149.5 -74q-31 0 -52.5 9t-48.5 34v-154q0 -48 15.5 -62.5t70.5 -15.5v-18h-240v18q44 4 57 17.5t13 53.5v696q0 33 -9.5 44.5t-39.5 11.5q-7 0 -17 -2v17q89 24 144 44zM159 332v-242 q0 -23 34 -45.5t69 -22.5q56 0 89 53.5t33 137.5q0 187 -123 187q-32 0 -67 -23t-35 -45z" />
+<glyph unicode="&#xff;" horiz-adv-x="500" d="M396 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM197 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM475 450v-15q-18 -2 -29 -13t-21 -38l-150 -409 q-39 -106 -78.5 -149.5t-96.5 -43.5q-32 0 -51 16.5t-19 41.5q0 19 12.5 32.5t30.5 13.5q29 0 52 -13q13 -7 26 -7q21 0 50 44q14 20 27 57t13 51q0 13 -42 101l-132 282q-13 29 -53 35v14h205v-15q-32 -1 -44.5 -7t-12.5 -20q0 -11 13 -41l112 -250l97 276q4 9 4 18 q0 24 -46 24v15h133z" />
+<glyph unicode="&#x100;" horiz-adv-x="722" d="M511 719h-311v54h311v-54zM707 0h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70t54.5 -22v-19zM447 257l-116 275l-115 -275h231z" />
+<glyph unicode="&#x101;" horiz-adv-x="444" d="M380 507h-311v54h311v-54zM442 66v-28q-38 -48 -90 -48q-57 0 -64 73h-1q-64 -73 -145 -73q-47 0 -76 27.5t-29 76.5q0 70 70 117q48 32 180 81v54q0 45 -21.5 67.5t-56.5 22.5q-30 0 -50 -14.5t-20 -34.5q0 -9 3 -20t3 -22q0 -15 -13.5 -28t-32.5 -13q-17 0 -30 13 t-13 33q0 48 51 80q47 30 115 30q81 0 118 -45q18 -21 23 -42.5t5 -68.5v-191q0 -66 31 -66q20 0 43 19zM287 127v141q-92 -32 -128 -66q-34 -31 -34 -77q0 -38 19 -57.5t50 -19.5q33 0 58 16q21 15 28 28t7 35z" />
+<glyph unicode="&#x102;" horiz-adv-x="722" d="M470 876h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM707 0h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20 l246 -563q22 -52 39.5 -70t54.5 -22v-19zM447 257l-116 275l-115 -275h231z" />
+<glyph unicode="&#x103;" horiz-adv-x="444" d="M343 664h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM442 66v-28q-38 -48 -90 -48q-57 0 -64 73h-1q-64 -73 -145 -73q-47 0 -76 27.5t-29 76.5q0 70 70 117q48 32 180 81v54q0 45 -21.5 67.5t-56.5 22.5 q-30 0 -50 -14.5t-20 -34.5q0 -9 3 -20t3 -22q0 -15 -13.5 -28t-32.5 -13q-17 0 -30 13t-13 33q0 48 51 80q47 30 115 30q81 0 118 -45q18 -21 23 -42.5t5 -68.5v-191q0 -66 31 -66q20 0 43 19zM287 127v141q-92 -32 -128 -66q-34 -31 -34 -77q0 -38 19 -57.5t50 -19.5 q33 0 58 16q21 15 28 28t7 35z" />
+<glyph unicode="&#x104;" horiz-adv-x="722" d="M561 0h-109v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70t54.5 -22v-19h-100q-44 -35 -44 -70q0 -39 38 -39q32 0 71 36l20 -16 q-28 -41 -52.5 -58.5t-58.5 -17.5q-33 0 -53.5 19.5t-20.5 54.5q0 53 54 91zM447 257l-116 275l-115 -275h231z" />
+<glyph unicode="&#x105;" horiz-adv-x="444" d="M452 -73l20 -16q-28 -41 -52.5 -58.5t-58.5 -17.5q-33 0 -53.5 19.5t-20.5 54.5q0 49 44 84q-37 11 -43 70h-1q-64 -73 -145 -73q-47 0 -76 27.5t-29 76.5q0 70 70 117q48 32 180 81v54q0 45 -21.5 67.5t-56.5 22.5q-30 0 -50 -14.5t-20 -34.5q0 -9 3 -20t3 -22 q0 -15 -13.5 -28t-32.5 -13q-17 0 -30 13t-13 33q0 48 51 80q47 30 115 30q81 0 118 -45q18 -21 23 -42.5t5 -68.5v-191q0 -66 31 -66q20 0 43 19v-28q-29 -37 -64 -45q-35 -32 -35 -63q0 -39 38 -39q32 0 71 36zM287 127v141q-92 -32 -128 -66q-34 -31 -34 -77 q0 -38 19 -57.5t50 -19.5q33 0 58 16q21 15 28 28t7 35z" />
+<glyph unicode="&#x106;" horiz-adv-x="667" d="M293 719l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM614 131l19 -18q-89 -127 -273 -127q-145 0 -236 89q-96 94 -96 250q0 146 90 247q94 104 243 104q64 0 119 -15q63 -18 69 -18q33 0 42 33h20l9 -227h-23q-16 72 -52 111q-71 76 -161 76 q-111 0 -175.5 -81.5t-64.5 -213.5q0 -161 72 -239q67 -72 178 -72q66 0 114 23t106 78z" />
+<glyph unicode="&#x107;" horiz-adv-x="444" d="M177 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM398 156l14 -9q-43 -84 -82 -115q-51 -42 -115 -42q-83 0 -136.5 62.5t-53.5 159.5q0 127 84 197q62 51 135 51q63 0 108.5 -30.5t45.5 -72.5q0 -17 -14 -29.5t-33 -12.5q-35 0 -48 46l-6 22 q-8 28 -20 38t-39 10q-61 0 -98.5 -48t-37.5 -126q0 -86 43 -140.5t112 -54.5q43 0 74 21t67 73z" />
+<glyph unicode="&#x108;" horiz-adv-x="667" d="M510 719h-34l-122 103l-121 -103h-34l124 167h62zM614 131l19 -18q-89 -127 -273 -127q-145 0 -236 89q-96 94 -96 250q0 146 90 247q94 104 243 104q64 0 119 -15q63 -18 69 -18q33 0 42 33h20l9 -227h-23q-16 72 -52 111q-71 76 -161 76q-111 0 -175.5 -81.5 t-64.5 -213.5q0 -161 72 -239q67 -72 178 -72q66 0 114 23t106 78z" />
+<glyph unicode="&#x109;" horiz-adv-x="444" d="M376 507h-34l-122 103l-121 -103h-34l124 167h62zM398 156l14 -9q-43 -84 -82 -115q-51 -42 -115 -42q-83 0 -136.5 62.5t-53.5 159.5q0 127 84 197q62 51 135 51q63 0 108.5 -30.5t45.5 -72.5q0 -17 -14 -29.5t-33 -12.5q-35 0 -48 46l-6 22q-8 28 -20 38t-39 10 q-61 0 -98.5 -48t-37.5 -126q0 -86 43 -140.5t112 -54.5q43 0 74 21t67 73z" />
+<glyph unicode="&#x10a;" horiz-adv-x="667" d="M450 784q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36zM614 131l19 -18q-89 -127 -273 -127q-145 0 -236 89q-96 94 -96 250q0 146 90 247q94 104 243 104q64 0 119 -15q63 -18 69 -18q33 0 42 33h20l9 -227 h-23q-16 72 -52 111q-71 76 -161 76q-111 0 -175.5 -81.5t-64.5 -213.5q0 -161 72 -239q67 -72 178 -72q66 0 114 23t106 78z" />
+<glyph unicode="&#x10b;" horiz-adv-x="444" d="M301 572q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36zM398 156l14 -9q-43 -84 -82 -115q-51 -42 -115 -42q-83 0 -136.5 62.5t-53.5 159.5q0 127 84 197q62 51 135 51q63 0 108.5 -30.5t45.5 -72.5 q0 -17 -14 -29.5t-33 -12.5q-35 0 -48 46l-6 22q-8 28 -20 38t-39 10q-61 0 -98.5 -48t-37.5 -126q0 -86 43 -140.5t112 -54.5q43 0 74 21t67 73z" />
+<glyph unicode="&#x10c;" horiz-adv-x="667" d="M543 886l-124 -167h-64l-123 167h35l120 -103l121 103h35zM614 131l19 -18q-89 -127 -273 -127q-145 0 -236 89q-96 94 -96 250q0 146 90 247q94 104 243 104q64 0 119 -15q63 -18 69 -18q33 0 42 33h20l9 -227h-23q-16 72 -52 111q-71 76 -161 76q-111 0 -175.5 -81.5 t-64.5 -213.5q0 -161 72 -239q67 -72 178 -72q66 0 114 23t106 78z" />
+<glyph unicode="&#x10d;" horiz-adv-x="444" d="M396 674l-124 -167h-64l-123 167h35l120 -103l121 103h35zM398 156l14 -9q-43 -84 -82 -115q-51 -42 -115 -42q-83 0 -136.5 62.5t-53.5 159.5q0 127 84 197q62 51 135 51q63 0 108.5 -30.5t45.5 -72.5q0 -17 -14 -29.5t-33 -12.5q-35 0 -48 46l-6 22q-8 28 -20 38 t-39 10q-61 0 -98.5 -48t-37.5 -126q0 -86 43 -140.5t112 -54.5q43 0 74 21t67 73z" />
+<glyph unicode="&#x10e;" horiz-adv-x="722" d="M496 886l-124 -167h-64l-123 167h35l120 -103l121 103h35zM16 662h270q195 0 300 -91q99 -85 99 -237q0 -183 -136 -270q-99 -64 -252 -64h-281v19q58 4 73 20.5t15 75.5v435q0 58 -15 73.5t-73 19.5v19zM206 583v-499q0 -27 9.5 -37t38.5 -10q78 0 126 11t92 41 q104 70 104 239q0 145 -95 228q-43 38 -94 53.5t-128 15.5q-29 0 -41 -9t-12 -33z" />
+<glyph unicode="&#x10f;" horiz-adv-x="586" d="M492 458l-9 19q82 56 82 107q0 13 -14 13q-2 0 -7 -2q-12 -2 -20 -2q-28 0 -43.5 13.5t-15.5 37.5q0 25 16.5 41t42.5 16q34 0 57 -25.5t23 -63.5q0 -45 -31 -87t-81 -67zM491 42l-147 -52l-4 3v64q-48 -67 -128 -67q-83 0 -134 59.5t-51 155.5q0 106 61 180.5t147 74.5 q54 0 105 -43v156q0 31 -9 41t-37 10q-14 0 -22 -1v16q91 24 147 44l5 -2v-567q0 -35 8.5 -46t35.5 -11q6 0 23 1v-16zM340 102v230q0 40 -30.5 70t-71.5 30q-57 0 -91 -51t-34 -136q0 -92 37.5 -147.5t100.5 -55.5q47 0 74 32q15 17 15 28z" />
+<glyph unicode="&#x110;" horiz-adv-x="722" d="M16 662h270q188 0 293.5 -86.5t105.5 -241.5q0 -76 -29 -142.5t-81 -109.5q-100 -82 -275 -82h-284v19q57 4 72.5 20t15.5 70v206h-83v44h83v194q0 55 -14.5 70t-73.5 20v19zM206 315v-237q0 -24 11 -32.5t40 -8.5q125 0 197 41q122 71 122 249q0 168 -122 250 q-70 48 -199 48q-29 0 -39 -8t-10 -31v-227h146v-44h-146z" />
+<glyph unicode="&#x111;" horiz-adv-x="500" d="M507 522h-83v-408q0 -35 8.5 -46t35.5 -11q6 0 23 1v-16l-147 -52l-4 3v64q-48 -67 -128 -67q-83 0 -134 59.5t-51 155.5q0 106 61 180.5t147 74.5q54 0 105 -43v105h-175v39h175v12q0 31 -9 41t-37 10q-14 0 -22 -1v16q91 24 147 44l5 -2v-120h83v-39zM340 102v230 q0 40 -30.5 70t-71.5 30q-57 0 -91 -51t-34 -136q0 -92 37.5 -147.5t100.5 -55.5q47 0 74 32q15 17 15 28z" />
+<glyph unicode="&#x112;" horiz-adv-x="611" d="M461 719h-311v54h311v-54zM597 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-25q-11 67 -39 86t-115 19h-131q-22 0 -28.5 -6.5t-6.5 -29.5v-220h151q63 0 83.5 18t29.5 78h23v-234h-23q-9 63 -29 80t-84 17h-151v-243 q0 -30 21 -38.5t80 -8.5h36q107 0 152 26t79 106h28z" />
+<glyph unicode="&#x113;" horiz-adv-x="444" d="M381 507h-311v54h311v-54zM408 164l16 -7q-60 -167 -209 -167q-88 0 -139 61.5t-51 165.5q0 107 57 175t150 68q90 0 139 -69q29 -40 34 -114h-308q4 -63 12.5 -96t33.5 -67q42 -55 111 -55q49 0 82.5 24t71.5 81zM99 309h204q-9 63 -29.5 89t-68.5 26q-42 0 -70 -29.5 t-36 -85.5z" />
+<glyph unicode="&#x114;" horiz-adv-x="611" d="M423 876h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM597 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-25q-11 67 -39 86t-115 19h-131q-22 0 -28.5 -6.5t-6.5 -29.5v-220 h151q63 0 83.5 18t29.5 78h23v-234h-23q-9 63 -29 80t-84 17h-151v-243q0 -30 21 -38.5t80 -8.5h36q107 0 152 26t79 106h28z" />
+<glyph unicode="&#x115;" horiz-adv-x="444" d="M333 664h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM408 164l16 -7q-60 -167 -209 -167q-88 0 -139 61.5t-51 165.5q0 107 57 175t150 68q90 0 139 -69q29 -40 34 -114h-308q4 -63 12.5 -96t33.5 -67q42 -55 111 -55 q49 0 82.5 24t71.5 81zM99 309h204q-9 63 -29.5 89t-68.5 26q-42 0 -70 -29.5t-36 -85.5z" />
+<glyph unicode="&#x116;" horiz-adv-x="611" d="M350 784q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36zM597 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-25q-11 67 -39 86t-115 19h-131q-22 0 -28.5 -6.5 t-6.5 -29.5v-220h151q63 0 83.5 18t29.5 78h23v-234h-23q-9 63 -29 80t-84 17h-151v-243q0 -30 21 -38.5t80 -8.5h36q107 0 152 26t79 106h28z" />
+<glyph unicode="&#x117;" horiz-adv-x="444" d="M290 572q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36zM408 164l16 -7q-60 -167 -209 -167q-88 0 -139 61.5t-51 165.5q0 107 57 175t150 68q90 0 139 -69q29 -40 34 -114h-308q4 -63 12.5 -96t33.5 -67 q42 -55 111 -55q49 0 82.5 24t71.5 81zM99 309h204q-9 63 -29.5 89t-68.5 26q-42 0 -70 -29.5t-36 -85.5z" />
+<glyph unicode="&#x118;" horiz-adv-x="611" d="M382 0h-370v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-25q-11 67 -39 86t-115 19h-131q-22 0 -28.5 -6.5t-6.5 -29.5v-220h151q63 0 83.5 18t29.5 78h23v-234h-23q-9 63 -29 80t-84 17h-151v-243q0 -30 21 -38.5t80 -8.5h36q107 0 152 26 t79 106h28l-46 -169h-123q-44 -35 -44 -70q0 -39 38 -39q32 0 71 36l20 -16q-28 -41 -52.5 -58.5t-58.5 -17.5q-33 0 -53.5 19.5t-20.5 54.5q0 53 54 91z" />
+<glyph unicode="&#x119;" horiz-adv-x="444" d="M346 -73l20 -16q-28 -41 -52.5 -58.5t-58.5 -17.5q-33 0 -53.5 19.5t-20.5 54.5q0 47 41 81h-7q-88 0 -139 61.5t-51 165.5q0 107 57 175t150 68q90 0 139 -69q29 -40 34 -114h-308q4 -63 12.5 -96t33.5 -67q42 -55 111 -55q49 0 82.5 24t71.5 81l16 -7 q-46 -127 -144 -157q-43 -36 -43 -70q0 -39 38 -39q32 0 71 36zM99 309h204q-9 63 -29.5 89t-68.5 26q-42 0 -70 -29.5t-36 -85.5z" />
+<glyph unicode="&#x11a;" horiz-adv-x="611" d="M469 886l-124 -167h-64l-123 167h35l120 -103l121 103h35zM597 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-25q-11 67 -39 86t-115 19h-131q-22 0 -28.5 -6.5t-6.5 -29.5v-220h151q63 0 83.5 18t29.5 78h23v-234h-23 q-9 63 -29 80t-84 17h-151v-243q0 -30 21 -38.5t80 -8.5h36q107 0 152 26t79 106h28z" />
+<glyph unicode="&#x11b;" horiz-adv-x="444" d="M396 674l-124 -167h-64l-123 167h35l120 -103l121 103h35zM408 164l16 -7q-60 -167 -209 -167q-88 0 -139 61.5t-51 165.5q0 107 57 175t150 68q90 0 139 -69q29 -40 34 -114h-308q4 -63 12.5 -96t33.5 -67q42 -55 111 -55q49 0 82.5 24t71.5 81zM99 309h204 q-9 63 -29.5 89t-68.5 26q-42 0 -70 -29.5t-36 -85.5z" />
+<glyph unicode="&#x11c;" horiz-adv-x="722" d="M509 719h-34l-122 103l-121 -103h-34l124 167h62zM709 354v-18q-44 -4 -57 -18t-13 -62v-200q-86 -70 -254 -70q-78 0 -149.5 28t-120.5 79q-83 87 -83 234q0 166 107 263q94 86 239 86q64 0 133 -23q27 -10 44 -10q16 0 28 9.5t17 23.5h22l8 -211h-23q-32 78 -71 116 q-58 55 -146 55q-100 0 -167 -69q-77 -77 -77 -243q0 -138 72 -218t191 -80q57 0 95 18t38 43v157q0 58 -14.5 72.5t-74.5 19.5v18h256z" />
+<glyph unicode="&#x11d;" horiz-adv-x="500" d="M405 507h-34l-122 103l-121 -103h-34l124 167h62zM470 388h-83q19 -43 19 -84q0 -77 -52 -116t-104 -39q-11 0 -38 3l-19 2q-20 -6 -40 -27t-20 -36q0 -23 78 -27l129 -6q55 -2 88 -31t33 -76q0 -58 -60 -105q-83 -64 -200 -64q-72 0 -122.5 28.5t-50.5 68.5 q0 28 22 55.5t76 66.5q-32 15 -42.5 26t-10.5 27q0 29 46 69q23 19 43 40q-50 25 -71.5 56t-21.5 78q0 68 48.5 115.5t118.5 47.5q40 0 80 -15l22 -8q29 -10 55 -10h77v-39zM152 338v-3q0 -72 28.5 -116.5t74.5 -44.5q34 0 54 24.5t20 65.5q0 66 -30 121q-25 47 -73 47 q-35 0 -54.5 -25t-19.5 -69zM433 -64q0 28 -27.5 38.5t-96.5 10.5q-99 0 -162 13q-30 -36 -39.5 -52.5t-9.5 -33.5q0 -33 39.5 -53t105.5 -20q85 0 137.5 26.5t52.5 70.5z" />
+<glyph unicode="&#x11e;" horiz-adv-x="722" d="M495 876h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM709 354v-18q-44 -4 -57 -18t-13 -62v-200q-86 -70 -254 -70q-78 0 -149.5 28t-120.5 79q-83 87 -83 234q0 166 107 263q94 86 239 86q64 0 133 -23 q27 -10 44 -10q16 0 28 9.5t17 23.5h22l8 -211h-23q-32 78 -71 116q-58 55 -146 55q-100 0 -167 -69q-77 -77 -77 -243q0 -138 72 -218t191 -80q57 0 95 18t38 43v157q0 58 -14.5 72.5t-74.5 19.5v18h256z" />
+<glyph unicode="&#x11f;" horiz-adv-x="500" d="M351 664h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM470 388h-83q19 -43 19 -84q0 -77 -52 -116t-104 -39q-11 0 -38 3l-19 2q-20 -6 -40 -27t-20 -36q0 -23 78 -27l129 -6q55 -2 88 -31t33 -76q0 -58 -60 -105 q-83 -64 -200 -64q-72 0 -122.5 28.5t-50.5 68.5q0 28 22 55.5t76 66.5q-32 15 -42.5 26t-10.5 27q0 29 46 69q23 19 43 40q-50 25 -71.5 56t-21.5 78q0 68 48.5 115.5t118.5 47.5q40 0 80 -15l22 -8q29 -10 55 -10h77v-39zM152 338v-3q0 -72 28.5 -116.5t74.5 -44.5 q34 0 54 24.5t20 65.5q0 66 -30 121q-25 47 -73 47q-35 0 -54.5 -25t-19.5 -69zM433 -64q0 28 -27.5 38.5t-96.5 10.5q-99 0 -162 13q-30 -36 -39.5 -52.5t-9.5 -33.5q0 -33 39.5 -53t105.5 -20q85 0 137.5 26.5t52.5 70.5z" />
+<glyph unicode="&#x120;" horiz-adv-x="722" d="M420 784q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36zM709 354v-18q-44 -4 -57 -18t-13 -62v-200q-86 -70 -254 -70q-78 0 -149.5 28t-120.5 79q-83 87 -83 234q0 166 107 263q94 86 239 86q64 0 133 -23 q27 -10 44 -10q16 0 28 9.5t17 23.5h22l8 -211h-23q-32 78 -71 116q-58 55 -146 55q-100 0 -167 -69q-77 -77 -77 -243q0 -138 72 -218t191 -80q57 0 95 18t38 43v157q0 58 -14.5 72.5t-74.5 19.5v18h256z" />
+<glyph unicode="&#x121;" horiz-adv-x="500" d="M300 572q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36zM470 388h-83q19 -43 19 -84q0 -77 -52 -116t-104 -39q-11 0 -38 3l-19 2q-20 -6 -40 -27t-20 -36q0 -23 78 -27l129 -6q55 -2 88 -31t33 -76 q0 -58 -60 -105q-83 -64 -200 -64q-72 0 -122.5 28.5t-50.5 68.5q0 28 22 55.5t76 66.5q-32 15 -42.5 26t-10.5 27q0 29 46 69q23 19 43 40q-50 25 -71.5 56t-21.5 78q0 68 48.5 115.5t118.5 47.5q40 0 80 -15l22 -8q29 -10 55 -10h77v-39zM152 338v-3q0 -72 28.5 -116.5 t74.5 -44.5q34 0 54 24.5t20 65.5q0 66 -30 121q-25 47 -73 47q-35 0 -54.5 -25t-19.5 -69zM433 -64q0 28 -27.5 38.5t-96.5 10.5q-99 0 -162 13q-30 -36 -39.5 -52.5t-9.5 -33.5q0 -33 39.5 -53t105.5 -20q85 0 137.5 26.5t52.5 70.5z" />
+<glyph unicode="&#x122;" horiz-adv-x="722" d="M709 354v-18q-44 -4 -57 -18t-13 -62v-200q-86 -70 -254 -70q-78 0 -149.5 28t-120.5 79q-83 87 -83 234q0 166 107 263q94 86 239 86q64 0 133 -23q27 -10 44 -10q16 0 28 9.5t17 23.5h22l8 -211h-23q-32 78 -71 116q-58 55 -146 55q-100 0 -167 -69q-77 -77 -77 -243 q0 -138 72 -218t191 -80q57 0 95 18t38 43v157q0 58 -14.5 72.5t-74.5 19.5v18h256zM358 -280l-10 19q83 56 83 107q0 13 -14 13q-4 0 -13.5 -2t-15.5 -2q-58 0 -58 51q0 26 16.5 41.5t43.5 15.5q34 0 57 -24.5t23 -62.5q0 -46 -30.5 -89t-81.5 -67z" />
+<glyph unicode="&#x123;" horiz-adv-x="500" d="M293 766l9 -19q-82 -57 -82 -106q0 -14 14 -14q2 0 7 2q12 2 20 2q28 0 43.5 -13.5t15.5 -37.5q0 -25 -16.5 -41t-42.5 -16q-34 0 -57 25.5t-23 63.5q0 45 31 87t81 67zM470 388h-83q19 -43 19 -84q0 -77 -52 -116t-104 -39q-11 0 -38 3l-19 2q-20 -6 -40 -27t-20 -36 q0 -23 78 -27l129 -6q55 -2 88 -31t33 -76q0 -58 -60 -105q-83 -64 -200 -64q-72 0 -122.5 28.5t-50.5 68.5q0 28 22 55.5t76 66.5q-32 15 -42.5 26t-10.5 27q0 29 46 69q23 19 43 40q-50 25 -71.5 56t-21.5 78q0 68 48.5 115.5t118.5 47.5q40 0 80 -15l22 -8q29 -10 55 -10 h77v-39zM152 338v-3q0 -72 28.5 -116.5t74.5 -44.5q34 0 54 24.5t20 65.5q0 66 -30 121q-25 47 -73 47q-35 0 -54.5 -25t-19.5 -69zM433 -64q0 28 -27.5 38.5t-96.5 10.5q-99 0 -162 13q-30 -36 -39.5 -52.5t-9.5 -33.5q0 -33 39.5 -53t105.5 -20q85 0 137.5 26.5t52.5 70.5 z" />
+<glyph unicode="&#x124;" horiz-adv-x="722" d="M518 719h-34l-122 103l-121 -103h-34l124 167h62zM703 0h-279v19q58 4 73 22.5t15 82.5v191h-303v-202q0 -55 16 -73t71 -21l1 -19h-279v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-189h303v189q0 58 -15.5 74 t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-437q0 -53 16.5 -70.5t72.5 -21.5v-19z" />
+<glyph unicode="&#x125;" horiz-adv-x="500" d="M376 719h-34l-122 103l-121 -103h-34l124 167h62zM487 0h-212v15q44 5 56 20t12 67v198q0 106 -74 106q-30 0 -55 -14t-57 -49v-241q0 -52 12 -67t56 -20v-15h-216v15q43 6 53.5 20t10.5 67v471q0 32 -9.5 41.5t-41.5 9.5q-9 0 -12 -1v16l27 8q77 23 115 36l5 -3v-304 q35 45 69 64.5t78 19.5q123 0 123 -159v-199q0 -52 9.5 -65.5t50.5 -21.5v-15z" />
+<glyph unicode="&#x126;" horiz-adv-x="723" d="M702 0h-279v19q58 4 73 22.5t15 82.5v191h-303v-202q0 -55 16.5 -73t71.5 -21v-19h-279v19q59 4 74 21.5t15 81.5v354h-89v44h89v28q0 58 -15.5 74t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-28h303v28q0 58 -15.5 74t-73.5 21v19h280v-19 q-56 -5 -72.5 -21.5t-16.5 -73.5v-28h88v-44h-88v-365q0 -53 16.5 -70.5t72.5 -21.5v-19zM511 359v117h-303v-117h303z" />
+<glyph unicode="&#x127;" horiz-adv-x="500" d="M487 0h-212v15q44 5 56 20t12 67v198q0 106 -74 106q-30 0 -55 -14t-57 -49v-241q0 -52 12 -67t56 -20v-15h-216v15q43 6 53.5 20t10.5 67v410h-65v54h65v7q0 32 -9.5 41.5t-41.5 9.5q-9 0 -12 -1v16l27 8q77 23 115 36l5 -3v-114h162v-54h-162v-136q35 45 69 64.5 t78 19.5q123 0 123 -159v-199q0 -52 9.5 -65.5t50.5 -21.5v-15z" />
+<glyph unicode="&#x128;" horiz-adv-x="333" d="M302 850h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37 75t64 26q34 0 70 -18l24 -12q28 -15 53 -15q17 0 28.5 11t24.5 39zM315 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19 t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#x129;" horiz-adv-x="278" d="M276 638h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37 75t64 26q34 0 70 -18l24 -12q28 -15 53 -15q17 0 28.5 11t24.5 39zM253 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l154 55l5 -4 v-351q0 -56 12.5 -71t61.5 -19v-15z" />
+<glyph unicode="&#x12a;" horiz-adv-x="333" d="M322 719h-311v54h311v-54zM315 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#x12b;" horiz-adv-x="278" d="M253 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l154 55l5 -4v-351q0 -56 12.5 -71t61.5 -19v-15zM290 507h-311v54h311v-54z" />
+<glyph unicode="&#x12c;" horiz-adv-x="333" d="M276 876h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM315 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#x12d;" horiz-adv-x="278" d="M251 664h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM253 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l154 55l5 -4v-351q0 -56 12.5 -71t61.5 -19v-15z" />
+<glyph unicode="&#x12e;" horiz-adv-x="333" d="M174 0h-156v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19h-95q-44 -35 -44 -70q0 -39 38 -39q32 0 71 36l20 -16q-28 -41 -52.5 -58.5t-58.5 -17.5q-33 0 -53.5 19.5t-20.5 54.5q0 53 54 91 z" />
+<glyph unicode="&#x12f;" horiz-adv-x="278" d="M146 0h-130v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l155 55l4 -4v-351q0 -56 12.5 -71t61.5 -19v-15h-61q-44 -35 -44 -70q0 -39 38 -39q32 0 71 36l20 -16q-28 -41 -52.5 -58.5t-58.5 -17.5q-33 0 -53.5 19.5t-20.5 54.5q0 53 54 91zM180 632 q0 -22 -15 -36.5t-37 -14.5q-21 0 -35.5 14.5t-14.5 36.5q0 21 15 36t36 15q22 0 36.5 -15t14.5 -36z" />
+<glyph unicode="&#x130;" horiz-adv-x="333" d="M215 784q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36zM315 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#x131;" horiz-adv-x="278" d="M253 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l154 55l5 -4v-351q0 -56 12.5 -71t61.5 -19v-15z" />
+<glyph unicode="&#x134;" horiz-adv-x="373" d="M367 719h-34l-122 103l-121 -103h-34l124 167h62zM354 662v-19q-61 -5 -76.5 -20.5t-15.5 -73.5v-364q0 -199 -167 -199q-46 0 -73.5 19t-27.5 53q0 20 14.5 36t34.5 16q33 0 49 -42q2 -5 5 -14l5 -12q1 -5 4 -9.5t7 -6.5t10 -2q22 0 29.5 15.5t7.5 54.5v456 q0 59 -15 73.5t-78 19.5v19h287z" />
+<glyph unicode="&#x135;" horiz-adv-x="278" d="M295 507h-34l-122 103l-121 -103h-34l124 167h62zM193 457v-457q0 -107 -43.5 -162.5t-126.5 -55.5q-41 0 -67 15.5t-26 39.5q0 16 12 27.5t29 11.5q23 0 48 -32q23 -28 42 -28q23 0 34 18q14 25 14 121v379q0 60 -32 60q-24 0 -40 -3l-5 -1v16q80 25 156 54z" />
+<glyph unicode="&#x136;" horiz-adv-x="722" d="M723 0h-303v19l27 1q42 1 42 24q0 18 -32.5 56.5t-104.5 113.5l-100 103l-26 -21v-185q0 -56 16 -71.5t73 -20.5v-19h-282v19q59 3 75 22t16 84v424q0 56 -16 73t-74 21v19h282v-19q-61 -4 -75.5 -20t-14.5 -75v-200l178 164q43 40 60.5 61t17.5 38q0 16 -8.5 23t-32.5 8 l-25 1v19h259v-19q-51 -4 -77.5 -17.5t-78.5 -63.5l-186 -178l234 -256q62 -68 91.5 -88.5t64.5 -20.5v-19zM328 -280l-10 19q83 56 83 107q0 13 -14 13q-4 0 -13.5 -2t-15.5 -2q-58 0 -58 51q0 26 16.5 41.5t43.5 15.5q34 0 57 -24.5t23 -62.5q0 -46 -30.5 -89t-81.5 -67z " />
+<glyph unicode="&#x137;" horiz-adv-x="500" d="M505 0h-218v15h19q21 0 21 15q0 9 -11 23l-150 198v-184q0 -26 12.5 -38t42.5 -13l20 -1v-15h-234v15q54 9 64.5 18.5t10.5 48.5v482q0 36 -9 48.5t-34 12.5q-6 0 -32 -2v16l30 8q60 16 125 36l4 -2v-420l137 122q23 21 23 35q0 10 -10.5 13.5t-39.5 4.5v14h204v-15 q-50 0 -88.5 -21.5t-127.5 -104.5l-29 -27l153 -194q54 -69 117 -73v-15zM188 -280l-10 19q83 56 83 107q0 13 -14 13q-4 0 -13.5 -2t-15.5 -2q-58 0 -58 51q0 26 16.5 41.5t43.5 15.5q34 0 57 -24.5t23 -62.5q0 -46 -30.5 -89t-81.5 -67z" />
+<glyph unicode="&#x138;" horiz-adv-x="542" d="M532 0h-130q-23 13 -40 28t-36 44q-14 22 -35 62t-29 54q-28 48 -38 54q-40 -2 -54 -2v-162q0 -37 17 -48q16 -14 59 -14v-16h-241v16q48 0 60 11q17 11 17 50v305q0 39 -16 50q-14 10 -61 11v16h241v-16q-46 -2 -59 -11q-17 -11 -17 -51v-105l45 4q30 3 57 28 q30 26 52 88q12 35 34 49t60 14q31 0 54 -14t23 -38q0 -18 -15 -29.5t-33 -11.5q-25 0 -41 19.5t-24 19.5q-12 0 -18 -7t-11 -23q-22 -73 -69 -109q16 -6 31 -22q14 -15 48.5 -76.5t39.5 -69.5q44 -63 129 -83v-15z" />
+<glyph unicode="&#x139;" horiz-adv-x="611" d="M131 719l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM598 174l-48 -174h-538v19q55 3 71 21t16 75v431q0 59 -14.5 76t-72.5 21v19h283v-19q-61 -4 -77.5 -20.5t-16.5 -74.5v-464q0 -28 17.5 -36.5t72.5 -8.5h70q121 0 169 61q20 27 42 74h26z" />
+<glyph unicode="&#x13a;" horiz-adv-x="278" d="M29 719l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM257 0h-236v15q47 4 62 19.5t15 57.5v469q0 36 -9 50t-33 14q-21 0 -37 -2v16q95 23 158 44l5 -4v-592q0 -42 14 -55.5t61 -16.5v-15z" />
+<glyph unicode="&#x13b;" horiz-adv-x="611" d="M598 174l-48 -174h-538v19q55 3 71 21t16 75v431q0 59 -14.5 76t-72.5 21v19h283v-19q-61 -4 -77.5 -20.5t-16.5 -74.5v-464q0 -28 17.5 -36.5t72.5 -8.5h70q121 0 169 61q20 27 42 74h26zM258 -280l-10 19q83 56 83 107q0 13 -14 13q-4 0 -13.5 -2t-15.5 -2 q-58 0 -58 51q0 26 16.5 41.5t43.5 15.5q34 0 57 -24.5t23 -62.5q0 -46 -30.5 -89t-81.5 -67z" />
+<glyph unicode="&#x13c;" horiz-adv-x="278" d="M257 0h-236v15q47 4 62 19.5t15 57.5v469q0 36 -9 50t-33 14q-21 0 -37 -2v16q95 23 158 44l5 -4v-592q0 -42 14 -55.5t61 -16.5v-15zM98 -280l-10 19q83 56 83 107q0 13 -14 13q-4 0 -13.5 -2t-15.5 -2q-58 0 -58 51q0 26 16.5 41.5t43.5 15.5q34 0 57 -24.5t23 -62.5 q0 -46 -30.5 -89t-81.5 -67z" />
+<glyph unicode="&#x13d;" horiz-adv-x="611" d="M378 440l-9 19q82 56 82 107q0 13 -14 13q-2 0 -7 -2q-12 -2 -20 -2q-28 0 -43.5 13.5t-15.5 37.5q0 25 16.5 41t42.5 16q34 0 57 -25.5t23 -63.5q0 -45 -31 -87t-81 -67zM598 174l-48 -174h-538v19q55 3 71 21t16 75v431q0 59 -14.5 76t-72.5 21v19h283v-19 q-61 -4 -77.5 -20.5t-16.5 -74.5v-464q0 -28 17.5 -36.5t72.5 -8.5h70q121 0 169 61q20 27 42 74h26z" />
+<glyph unicode="&#x13e;" horiz-adv-x="381" d="M250 459l-9 19q82 56 82 107q0 13 -14 13q-2 0 -7 -2q-12 -2 -20 -2q-28 0 -43.5 13.5t-15.5 37.5q0 25 16.5 41t42.5 16q34 0 57 -25.5t23 -63.5q0 -45 -31 -87t-81 -67zM257 0h-236v15q47 4 62 19.5t15 57.5v469q0 36 -9 50t-33 14q-21 0 -37 -2v16q95 23 158 44l5 -4 v-592q0 -42 14 -55.5t61 -16.5v-15z" />
+<glyph unicode="&#x13f;" horiz-adv-x="620" d="M615 174l-48 -174h-538v19q55 3 71 21t16 75v431q0 59 -14.5 76t-72.5 21v19h283v-19q-61 -4 -77.5 -20.5t-16.5 -74.5v-464q0 -28 17.5 -36.5t72.5 -8.5h70q121 0 169 61q20 27 42 74h26zM456 345q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5 q22 0 38.5 -17t16.5 -40z" />
+<glyph unicode="&#x140;" horiz-adv-x="370" d="M257 0h-236v15q47 4 62 19.5t15 57.5v469q0 36 -9 50t-33 14q-21 0 -37 -2v16q95 23 158 44l5 -4v-592q0 -42 14 -55.5t61 -16.5v-15zM354 342q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40z" />
+<glyph unicode="&#x141;" horiz-adv-x="611" d="M597 174l-49 -174h-538v19q54 2 71 21t17 71v169l-87 -53v49l87 54v221q0 55 -16 72t-71 20v19h282v-19q-57 -3 -75 -20t-18 -72v-172l155 95v-49l-155 -94v-249q0 -26 17 -34.5t71 -8.5h63q101 0 148 33q37 27 72 102h26z" />
+<glyph unicode="&#x142;" horiz-adv-x="278" d="M259 429l-77 -53v-290q0 -43 13 -54.5t63 -16.5v-15h-238v15q50 4 64 17t14 57v230l-78 -54v44l78 54v199q0 38 -8.5 50.5t-33.5 12.5q-12 0 -37 -5v19q95 23 158 44l5 -3v-260l77 53v-44z" />
+<glyph unicode="&#x143;" horiz-adv-x="722" d="M279 719l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM707 662v-19q-51 -5 -66 -18q-16 -14 -22.5 -38t-6.5 -80v-518h-18l-441 549v-388q0 -76 17 -99.5t76 -31.5v-19h-234v19q62 7 79.5 29.5t17.5 101.5v440q-26 32 -44 42.5t-53 10.5v19h170 l386 -483v340q0 76 -19 98q-12 13 -26.5 17.5t-52.5 8.5v19h237z" />
+<glyph unicode="&#x144;" horiz-adv-x="500" d="M191 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM485 0h-208l1 15q37 3 49.5 21.5t12.5 68.5v199q0 101 -73 101q-25 0 -47 -12t-56 -45v-276q0 -30 13.5 -42t51.5 -15v-15h-211v15q38 3 50 18.5t12 60.5v243q0 37 -7 51t-28 14q-20 0 -29 -4v17 q70 20 137 45l8 -3v-78h1q71 81 144 81q57 0 87.5 -40t30.5 -114v-221q0 -40 12 -53t49 -17v-15z" />
+<glyph unicode="&#x145;" horiz-adv-x="722" d="M707 662v-19q-51 -5 -66 -18q-16 -14 -22.5 -38t-6.5 -80v-518h-18l-441 549v-388q0 -76 17 -99.5t76 -31.5v-19h-234v19q62 7 79.5 29.5t17.5 101.5v440q-26 32 -44 42.5t-53 10.5v19h170l386 -483v340q0 76 -19 98q-12 13 -26.5 17.5t-52.5 8.5v19h237zM318 -280 l-10 19q83 56 83 107q0 13 -14 13q-4 0 -13.5 -2t-15.5 -2q-58 0 -58 51q0 26 16.5 41.5t43.5 15.5q34 0 57 -24.5t23 -62.5q0 -46 -30.5 -89t-81.5 -67z" />
+<glyph unicode="&#x146;" horiz-adv-x="500" d="M485 0h-208l1 15q37 3 49.5 21.5t12.5 68.5v199q0 101 -73 101q-25 0 -47 -12t-56 -45v-276q0 -30 13.5 -42t51.5 -15v-15h-211v15q38 3 50 18.5t12 60.5v243q0 37 -7 51t-28 14q-20 0 -29 -4v17q70 20 137 45l8 -3v-78h1q71 81 144 81q57 0 87.5 -40t30.5 -114v-221 q0 -40 12 -53t49 -17v-15zM213 -280l-10 19q83 56 83 107q0 13 -14 13q-4 0 -13.5 -2t-15.5 -2q-58 0 -58 51q0 26 16.5 41.5t43.5 15.5q34 0 57 -24.5t23 -62.5q0 -46 -30.5 -89t-81.5 -67z" />
+<glyph unicode="&#x147;" horiz-adv-x="722" d="M519 886l-124 -167h-64l-123 167h35l120 -103l121 103h35zM707 662v-19q-51 -5 -66 -18q-16 -14 -22.5 -38t-6.5 -80v-518h-18l-441 549v-388q0 -76 17 -99.5t76 -31.5v-19h-234v19q62 7 79.5 29.5t17.5 101.5v440q-26 32 -44 42.5t-53 10.5v19h170l386 -483v340 q0 76 -19 98q-12 13 -26.5 17.5t-52.5 8.5v19h237z" />
+<glyph unicode="&#x148;" horiz-adv-x="500" d="M406 674l-124 -167h-64l-123 167h35l120 -103l121 103h35zM485 0h-208l1 15q37 3 49.5 21.5t12.5 68.5v199q0 101 -73 101q-25 0 -47 -12t-56 -45v-276q0 -30 13.5 -42t51.5 -15v-15h-211v15q38 3 50 18.5t12 60.5v243q0 37 -7 51t-28 14q-20 0 -29 -4v17q70 20 137 45 l8 -3v-78h1q71 81 144 81q57 0 87.5 -40t30.5 -114v-221q0 -40 12 -53t49 -17v-15z" />
+<glyph unicode="&#x149;" horiz-adv-x="590" d="M47 459l-9 19q82 56 82 107q0 13 -14 13q-2 0 -7 -2q-12 -2 -20 -2q-28 0 -43.5 13.5t-15.5 37.5q0 25 16.5 41t42.5 16q34 0 57 -25.5t23 -63.5q0 -45 -31 -87t-81 -67zM566 0h-208l1 15q37 3 49.5 21.5t12.5 68.5v199q0 101 -73 101q-25 0 -47 -12t-56 -45v-276 q0 -30 13.5 -42t51.5 -15v-15h-211v15q38 3 50 18.5t12 60.5v243q0 37 -7 51t-28 14q-20 0 -29 -4v17q70 20 137 45l8 -3v-78h1q71 81 144 81q57 0 87.5 -40t30.5 -114v-221q0 -40 12 -53t49 -17v-15z" />
+<glyph unicode="&#x14a;" horiz-adv-x="710" d="M190 662v-120q65 136 194 136q94 0 161 -50t97.5 -125t30.5 -164q0 -60 -17 -121t-48.5 -114.5t-85 -87.5t-118.5 -34q-48 0 -78 25.5t-30 67.5q0 29 17 52.5t46 23.5q30 0 47 -19.5t17 -45.5q0 -6 -4 -22.5t-4 -20.5q0 -24 22 -24q56 0 91.5 80t35.5 212 q0 146 -52 233.5t-144 87.5q-59 0 -107 -49.5t-67 -140.5v-331q0 -38 12.5 -66.5t37.5 -28.5h14v-16h-223v16q36 0 46.5 19t10.5 57v455q0 49 -13.5 73.5t-48.5 24.5h-14v17h174z" />
+<glyph unicode="&#x14b;" horiz-adv-x="504" d="M424 306v-306q0 -107 -43.5 -162.5t-126.5 -55.5q-41 0 -67 15.5t-26 39.5q0 16 12 27.5t29 11.5q23 0 48 -32q23 -28 42 -28q23 0 34 18q14 25 14 121v349q0 101 -73 101q-25 0 -47 -12t-56 -45v-276q0 -30 13.5 -42t51.5 -15v-15h-211v15q38 3 50 18.5t12 60.5v243 q0 37 -7 51t-28 14q-20 0 -29 -4v17q70 20 137 45l8 -3v-78h1q71 81 144 81q57 0 87.5 -40t30.5 -114z" />
+<glyph unicode="&#x14c;" horiz-adv-x="722" d="M516 719h-311v54h311v-54zM688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265 q49 -45 124 -45q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#x14d;" horiz-adv-x="500" d="M404 507h-311v54h311v-54zM470 231q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5t-62 170.5q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5zM380 204q0 114 -50 178q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5 t31.5 136.5z" />
+<glyph unicode="&#x14e;" horiz-adv-x="722" d="M471 876h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM574 337q0 85 -24 152.5t-67 103.5 q-56 47 -123 47q-85 0 -143 -67q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#x14f;" horiz-adv-x="500" d="M362 664h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM470 231q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5t-62 170.5q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5zM380 204q0 114 -50 178q-40 50 -95 50 q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="&#x150;" horiz-adv-x="722" d="M327 719l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40zM171 719l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40zM688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5z M574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#x151;" horiz-adv-x="500" d="M230 507l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40zM74 507l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40zM470 231q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5t-62 170.5q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5z M380 204q0 114 -50 178q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="&#x152;" horiz-adv-x="889" d="M885 168l-44 -168h-343q-30 0 -95.5 -3t-88.5 -3q-59 0 -117 25.5t-93 68.5q-74 91 -74 241q0 192 129 285q75 54 183 54q17 0 65 -3q54 -3 113 -3h318v-141h-23q-9 66 -39 85.5t-122 19.5h-53q-41 0 -55.5 -8t-14.5 -27v-225h101q76 0 102.5 19t32.5 79h21v-234h-21 q-7 58 -28.5 78.5t-74.5 20.5h-133v-236q0 -30 12 -42.5t48 -12.5h113q49 0 86 30t71 100h24zM431 133v392q0 56 -21.5 81.5t-72.5 25.5q-92 0 -143.5 -79t-51.5 -224q0 -136 42 -211q49 -87 147 -87q53 0 76.5 24t23.5 78z" />
+<glyph unicode="&#x153;" horiz-adv-x="722" d="M679 145l11 -6q-39 -81 -80 -115t-99 -34q-46 0 -75.5 22t-52.5 73q-28 -52 -62 -73.5t-85 -21.5q-91 0 -148.5 64t-57.5 164q0 59 21.5 113t58.5 85q50 44 122 44q46 0 80 -17t72 -59q31 42 60 59t70 17q81 0 126 -62q30 -40 34 -121h-254q5 -113 36.5 -166.5 t92.5 -53.5q36 0 65.5 20t64.5 68zM579 307v27q0 42 -22.5 69.5t-56.5 27.5q-80 0 -81 -124h160zM343 195q0 236 -117 236q-43 0 -74 -36q-32 -37 -32 -140q0 -124 37 -188q30 -51 83 -51q50 0 76.5 46t26.5 133z" />
+<glyph unicode="&#x154;" horiz-adv-x="667" d="M215 719l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM660 0h-162l-238 308l-56 -2v-194q0 -57 15.5 -73t73.5 -20v-19h-276v19q57 5 71 22t14 83v427q0 56 -14 72t-71 20v19h272q137 0 209 -59q49 -40 49 -120q0 -136 -181 -164l200 -253 q21 -26 40 -35t54 -12v-19zM204 583v-240q72 1 107 8t70 26q57 32 57 114q0 134 -183 134q-27 0 -39 -8.5t-12 -33.5z" />
+<glyph unicode="&#x155;" horiz-adv-x="333" d="M66 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM160 458v-92q38 54 63.5 74t56.5 20q26 0 40.5 -14t14.5 -39q0 -21 -10.5 -33t-28.5 -12q-19 0 -40 20q-16 15 -26 15q-21 0 -45.5 -29t-24.5 -53v-225q0 -43 17 -58t68 -17v-15h-240v15 q48 9 59.5 20t11.5 49v250q0 33 -7.5 46.5t-26.5 13.5q-16 0 -35 -4v16q63 20 148 54z" />
+<glyph unicode="&#x156;" horiz-adv-x="667" d="M660 0h-162l-238 308l-56 -2v-194q0 -57 15.5 -73t73.5 -20v-19h-276v19q57 5 71 22t14 83v427q0 56 -14 72t-71 20v19h272q137 0 209 -59q49 -40 49 -120q0 -136 -181 -164l200 -253q21 -26 40 -35t54 -12v-19zM204 583v-240q72 1 107 8t70 26q57 32 57 114 q0 134 -183 134q-27 0 -39 -8.5t-12 -33.5zM308 -280l-10 19q83 56 83 107q0 13 -14 13q-4 0 -13.5 -2t-15.5 -2q-58 0 -58 51q0 26 16.5 41.5t43.5 15.5q34 0 57 -24.5t23 -62.5q0 -46 -30.5 -89t-81.5 -67z" />
+<glyph unicode="&#x157;" horiz-adv-x="333" d="M160 458v-92q38 54 63.5 74t56.5 20q26 0 40.5 -14t14.5 -39q0 -21 -10.5 -33t-28.5 -12q-19 0 -40 20q-16 15 -26 15q-21 0 -45.5 -29t-24.5 -53v-225q0 -43 17 -58t68 -17v-15h-240v15q48 9 59.5 20t11.5 49v250q0 33 -7.5 46.5t-26.5 13.5q-16 0 -35 -4v16 q63 20 148 54zM118 -280l-10 19q83 56 83 107q0 13 -14 13q-4 0 -13.5 -2t-15.5 -2q-58 0 -58 51q0 26 16.5 41.5t43.5 15.5q34 0 57 -24.5t23 -62.5q0 -46 -30.5 -89t-81.5 -67z" />
+<glyph unicode="&#x158;" horiz-adv-x="667" d="M446 886l-124 -167h-64l-123 167h35l120 -103l121 103h35zM660 0h-162l-238 308l-56 -2v-194q0 -57 15.5 -73t73.5 -20v-19h-276v19q57 5 71 22t14 83v427q0 56 -14 72t-71 20v19h272q137 0 209 -59q49 -40 49 -120q0 -136 -181 -164l200 -253q21 -26 40 -35t54 -12v-19z M204 583v-240q72 1 107 8t70 26q57 32 57 114q0 134 -183 134q-27 0 -39 -8.5t-12 -33.5z" />
+<glyph unicode="&#x159;" horiz-adv-x="333" d="M321 674l-124 -167h-64l-123 167h35l120 -103l121 103h35zM160 458v-92q38 54 63.5 74t56.5 20q26 0 40.5 -14t14.5 -39q0 -21 -10.5 -33t-28.5 -12q-19 0 -40 20q-16 15 -26 15q-21 0 -45.5 -29t-24.5 -53v-225q0 -43 17 -58t68 -17v-15h-240v15q48 9 59.5 20t11.5 49 v250q0 33 -7.5 46.5t-26.5 13.5q-16 0 -35 -4v16q63 20 148 54z" />
+<glyph unicode="&#x15a;" horiz-adv-x="556" d="M201 719l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM469 463h-25q-17 62 -41 94q-61 78 -145 78q-46 0 -73.5 -26.5t-27.5 -68.5q0 -20 10 -39t21.5 -32.5t40.5 -33.5t47 -31l60 -35q81 -47 118 -93.5t37 -102.5q0 -83 -58 -135t-146 -52 q-65 0 -118 23q-26 11 -47 11q-12 0 -20 -9t-8 -24h-22l-29 212h22q67 -177 206 -177q53 0 86 31.5t33 80.5q0 47 -29 79q-48 52 -168 116q-122 65 -122 172q0 80 49 127.5t125 47.5q53 0 105 -22q27 -12 44 -12q26 0 32 34h21z" />
+<glyph unicode="&#x15b;" horiz-adv-x="389" d="M117 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM156 301l104 -63q50 -30 69 -56t19 -67q0 -50 -41.5 -87.5t-98.5 -37.5q-47 0 -73 9q-27 9 -46 9q-17 0 -24 -12h-13v157h16q16 -73 46 -107t81 -34q37 0 60 21t23 53q0 46 -53 75l-54 30 q-120 67 -120 145q0 58 37.5 90.5t100.5 32.5q44 0 67 -11q18 -8 28 -8q7 0 16 10h11l5 -136h-15q-17 68 -42.5 95.5t-70.5 27.5q-34 0 -54.5 -17t-20.5 -51q0 -17 11.5 -36.5t31.5 -31.5z" />
+<glyph unicode="&#x15c;" horiz-adv-x="556" d="M426 719h-34l-122 103l-121 -103h-34l124 167h62zM469 463h-25q-17 62 -41 94q-61 78 -145 78q-46 0 -73.5 -26.5t-27.5 -68.5q0 -20 10 -39t21.5 -32.5t40.5 -33.5t47 -31l60 -35q81 -47 118 -93.5t37 -102.5q0 -83 -58 -135t-146 -52q-65 0 -118 23q-26 11 -47 11 q-12 0 -20 -9t-8 -24h-22l-29 212h22q67 -177 206 -177q53 0 86 31.5t33 80.5q0 47 -29 79q-48 52 -168 116q-122 65 -122 172q0 80 49 127.5t125 47.5q53 0 105 -22q27 -12 44 -12q26 0 32 34h21z" />
+<glyph unicode="&#x15d;" horiz-adv-x="389" d="M351 507h-34l-122 103l-121 -103h-34l124 167h62zM156 301l104 -63q50 -30 69 -56t19 -67q0 -50 -41.5 -87.5t-98.5 -37.5q-47 0 -73 9q-27 9 -46 9q-17 0 -24 -12h-13v157h16q16 -73 46 -107t81 -34q37 0 60 21t23 53q0 46 -53 75l-54 30q-120 67 -120 145 q0 58 37.5 90.5t100.5 32.5q44 0 67 -11q18 -8 28 -8q7 0 16 10h11l5 -136h-15q-17 68 -42.5 95.5t-70.5 27.5q-34 0 -54.5 -17t-20.5 -51q0 -17 11.5 -36.5t31.5 -31.5z" />
+<glyph unicode="&#x15e;" horiz-adv-x="556" d="M225 -99l36 86q-50 3 -92 22q-26 11 -47 11q-12 0 -20 -9t-8 -24h-22l-29 212h22q67 -177 206 -177q53 0 86 31.5t33 80.5q0 47 -29 79q-48 52 -168 116q-122 65 -122 172q0 80 49 127.5t125 47.5q53 0 105 -22q27 -12 44 -12q26 0 32 34h21l22 -213h-25q-17 62 -41 94 q-61 78 -145 78q-46 0 -73.5 -26.5t-27.5 -68.5q0 -20 10 -39t21.5 -32.5t40.5 -33.5t47 -31l60 -35q81 -47 118 -93.5t37 -102.5q0 -81 -55 -132.5t-140 -54.5l-20 -51q15 3 26 3q41 0 63.5 -18t22.5 -51q0 -39 -33.5 -61.5t-91.5 -22.5q-45 0 -84 16l14 31q36 -12 65 -12 q25 0 40 12t15 32q0 19 -12 27.5t-41 8.5q-17 0 -28 -4z" />
+<glyph unicode="&#x15f;" horiz-adv-x="389" d="M145 -99l37 90q-30 2 -47 8q-27 9 -46 9q-17 0 -24 -12h-13v157h16q16 -73 46 -107t81 -34q37 0 60 21t23 53q0 46 -53 75l-54 30q-120 67 -120 145q0 58 37.5 90.5t100.5 32.5q44 0 67 -11q18 -8 28 -8q7 0 16 10h11l5 -136h-15q-17 68 -42.5 95.5t-70.5 27.5 q-34 0 -54.5 -17t-20.5 -51q0 -17 11.5 -36.5t31.5 -31.5l104 -63q50 -30 69 -56t19 -67q0 -48 -38.5 -84.5t-92.5 -40.5l-21 -55q15 3 26 3q41 0 63.5 -18t22.5 -51q0 -39 -33.5 -61.5t-91.5 -22.5q-45 0 -84 16l14 31q36 -12 65 -12q25 0 40 12t15 32q0 19 -12 27.5 t-41 8.5q-17 0 -28 -4z" />
+<glyph unicode="&#x160;" horiz-adv-x="556" d="M429 924l-124 -167h-64l-123 167h35l120 -103l121 103h35zM469 463h-25q-17 62 -41 94q-61 78 -145 78q-46 0 -73.5 -26.5t-27.5 -68.5q0 -20 10 -39t21.5 -32.5t40.5 -33.5t47 -31l60 -35q81 -47 118 -93.5t37 -102.5q0 -83 -58 -135t-146 -52q-65 0 -118 23 q-26 11 -47 11q-12 0 -20 -9t-8 -24h-22l-29 212h22q67 -177 206 -177q53 0 86 31.5t33 80.5q0 47 -29 79q-48 52 -168 116q-122 65 -122 172q0 80 49 127.5t125 47.5q53 0 105 -22q27 -12 44 -12q26 0 32 34h21z" />
+<glyph unicode="&#x161;" horiz-adv-x="389" d="M349 674l-124 -167h-64l-123 167h35l120 -103l121 103h35zM143 301l104 -63q50 -30 69 -56t19 -67q0 -50 -41.5 -87.5t-98.5 -37.5q-47 0 -73 9q-27 9 -46 9q-17 0 -24 -12h-13v157h16q16 -73 46 -107t81 -34q37 0 60 21t23 53q0 46 -53 75l-54 30q-120 67 -120 145 q0 58 37.5 90.5t100.5 32.5q44 0 67 -11q18 -8 28 -8q7 0 16 10h11l5 -136h-15q-17 68 -42.5 95.5t-70.5 27.5q-34 0 -54.5 -17t-20.5 -51q0 -17 11.5 -36.5t31.5 -31.5z" />
+<glyph unicode="&#x162;" horiz-adv-x="611" d="M286 0h-126v19q63 4 78.5 21t15.5 83v497h-60q-81 0 -109.5 -23.5t-43.5 -104.5h-24l7 170h562l7 -170h-24q-16 82 -45 105t-109 23h-59v-509q0 -57 17 -73t79 -19v-19h-131l-25 -65q15 3 26 3q41 0 63.5 -18t22.5 -51q0 -39 -33.5 -61.5t-91.5 -22.5q-45 0 -84 16l14 31 q36 -12 65 -12q25 0 40 12t15 32q0 19 -12 27.5t-41 8.5q-17 0 -28 -4l-7 5z" />
+<glyph unicode="&#x163;" horiz-adv-x="278" d="M88 -99l39 94q-57 21 -57 122v301h-53q-4 3 -4 7q0 8 17 19q38 22 97 107q2 3 9.5 12.5t10.5 15.5q7 0 7 -13v-116h101v-32h-101v-286q0 -48 12 -69t40 -21q30 0 60 35l13 -11q-48 -75 -119 -76l-21 -55q15 3 26 3q41 0 63.5 -18t22.5 -51q0 -39 -33.5 -61.5t-91.5 -22.5 q-45 0 -84 16l14 31q36 -12 65 -12q25 0 40 12t15 32q0 19 -12 27.5t-41 8.5q-17 0 -28 -4z" />
+<glyph unicode="&#x164;" horiz-adv-x="611" d="M461 886l-124 -167h-64l-123 167h35l120 -103l121 103h35zM593 492h-24q-16 82 -45 105t-109 23h-59v-509q0 -57 17 -73t79 -19v-19h-292v19q63 4 78.5 21t15.5 83v497h-60q-81 0 -109.5 -23.5t-43.5 -104.5h-24l7 170h562z" />
+<glyph unicode="&#x165;" horiz-adv-x="315" d="M221 458l-9 19q82 56 82 107q0 13 -14 13q-2 0 -7 -2q-12 -2 -20 -2q-28 0 -43.5 13.5t-15.5 37.5q0 25 16.5 41t42.5 16q34 0 57 -25.5t23 -63.5q0 -45 -31 -87t-81 -67zM266 77l13 -11q-48 -76 -121 -76q-88 0 -88 127v301h-53q-4 3 -4 7q0 8 17 19q38 22 97 107 q2 3 9.5 12.5t10.5 15.5q7 0 7 -13v-116h51v-32h-51v-286q0 -48 12 -69t40 -21q30 0 60 35z" />
+<glyph unicode="&#x166;" horiz-adv-x="613" d="M593 492h-24q-16 82 -45 105t-109 23h-59v-264h126v-44h-126v-201q0 -57 17 -73t79 -19v-19h-292v19q63 4 78.5 21t15.5 83v189h-128v44h128v264h-60q-81 0 -109.5 -23.5t-43.5 -104.5h-24l7 170h562z" />
+<glyph unicode="&#x167;" horiz-adv-x="279" d="M267 82l13 -11q-47 -76 -119 -76q-90 0 -90 131v109h-60v44h60v144h-49q-8 0 -8 7q0 5 4.5 9.5t15 11.5t14.5 10q31 26 63 71l37 52q7 0 7 -12v-117h101v-32h-101v-144h97v-44h-97v-100q0 -49 13 -68.5t39 -19.5q29 0 60 35z" />
+<glyph unicode="&#x168;" horiz-adv-x="722" d="M705 662v-19q-61 -6 -77.5 -29.5t-16.5 -97.5v-255q0 -77 -11 -121t-43 -81q-64 -73 -202 -73q-109 0 -170 46q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19h283v-19q-60 -5 -75.5 -21.5t-15.5 -72.5v-312q0 -65 8 -100t36 -62q47 -45 128 -45q101 0 152 59 q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h232zM505 849h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37.5 75t63.5 26q34 0 70 -18l24 -12q29 -15 53 -15q17 0 28.5 11t24.5 39z" />
+<glyph unicode="&#x169;" horiz-adv-x="500" d="M376 638h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37 75t64 26q34 0 70 -18l24 -12q28 -15 53 -15q17 0 28.5 11t24.5 39zM480 50v-14q-78 -21 -137 -45l-5 3v82h-2q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251 q0 37 -13 51t-49 16v14h146v-323q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5v231q0 39 -14 50.5t-60 14.5v17h158v-343q0 -35 11.5 -46t45.5 -11h6z" />
+<glyph unicode="&#x16a;" horiz-adv-x="722" d="M510 719h-311v54h311v-54zM705 662v-19q-61 -6 -77.5 -29.5t-16.5 -97.5v-255q0 -77 -11 -121t-43 -81q-64 -73 -202 -73q-109 0 -170 46q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19h283v-19q-60 -5 -75.5 -21.5t-15.5 -72.5v-312q0 -65 8 -100t36 -62 q47 -45 128 -45q101 0 152 59q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h232z" />
+<glyph unicode="&#x16b;" horiz-adv-x="500" d="M405 507h-311v54h311v-54zM480 50v-14q-78 -21 -137 -45l-5 3v82h-2q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251q0 37 -13 51t-49 16v14h146v-323q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5v231q0 39 -14 50.5t-60 14.5v17h158v-343 q0 -35 11.5 -46t45.5 -11h6z" />
+<glyph unicode="&#x16c;" horiz-adv-x="722" d="M483 876h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM705 662v-19q-61 -6 -77.5 -29.5t-16.5 -97.5v-255q0 -77 -11 -121t-43 -81q-64 -73 -202 -73q-109 0 -170 46q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19 h283v-19q-60 -5 -75.5 -21.5t-15.5 -72.5v-312q0 -65 8 -100t36 -62q47 -45 128 -45q101 0 152 59q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h232z" />
+<glyph unicode="&#x16d;" horiz-adv-x="500" d="M352 664h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5zM480 50v-14q-78 -21 -137 -45l-5 3v82h-2q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251q0 37 -13 51t-49 16v14h146v-323q0 -34 20.5 -56.5t50.5 -22.5 q49 0 84 31q13 12 18 22.5t5 35.5v231q0 39 -14 50.5t-60 14.5v17h158v-343q0 -35 11.5 -46t45.5 -11h6z" />
+<glyph unicode="&#x16e;" horiz-adv-x="722" d="M465 798q0 -41 -29.5 -70t-71.5 -29q-41 0 -69.5 29t-28.5 71q0 41 29.5 70t71.5 29q40 0 69 -29.5t29 -70.5zM431 799q0 27 -19.5 46t-47.5 19q-26 0 -45 -19.5t-19 -45.5q0 -28 19 -47t45 -19q28 0 47.5 19t19.5 47zM705 662v-19q-61 -6 -77.5 -29.5t-16.5 -97.5v-255 q0 -77 -11 -121t-43 -81q-64 -73 -202 -73q-109 0 -170 46q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19h283v-19q-60 -5 -75.5 -21.5t-15.5 -72.5v-312q0 -65 8 -100t36 -62q47 -45 128 -45q101 0 152 59q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h232z" />
+<glyph unicode="&#x16f;" horiz-adv-x="500" d="M349 611q0 -41 -29.5 -70t-71.5 -29q-41 0 -69.5 29t-28.5 71q0 41 29.5 70t71.5 29q40 0 69 -29.5t29 -70.5zM315 612q0 27 -19.5 46t-47.5 19q-26 0 -45 -19.5t-19 -45.5q0 -28 19 -47t45 -19q28 0 47.5 19t19.5 47zM480 50v-14q-78 -21 -137 -45l-5 3v82h-2 q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251q0 37 -13 51t-49 16v14h146v-323q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5v231q0 39 -14 50.5t-60 14.5v17h158v-343q0 -35 11.5 -46t45.5 -11h6z" />
+<glyph unicode="&#x170;" horiz-adv-x="722" d="M338 719l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40zM182 719l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40zM705 662v-19q-61 -6 -77.5 -29.5t-16.5 -97.5v-255q0 -77 -11 -121t-43 -81q-64 -73 -202 -73q-109 0 -170 46 q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19h283v-19q-60 -5 -75.5 -21.5t-15.5 -72.5v-312q0 -65 8 -100t36 -62q47 -45 128 -45q101 0 152 59q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h232z" />
+<glyph unicode="&#x171;" horiz-adv-x="500" d="M211 507l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40zM55 507l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40zM480 50v-14q-78 -21 -137 -45l-5 3v82h-2q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251q0 37 -13 51t-49 16v14h146v-323 q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5v231q0 39 -14 50.5t-60 14.5v17h158v-343q0 -35 11.5 -46t45.5 -11h6z" />
+<glyph unicode="&#x172;" horiz-adv-x="722" d="M497 -73l20 -16q-28 -41 -52.5 -58.5t-58.5 -17.5q-33 0 -53.5 19.5t-20.5 54.5q0 44 37 77h-14q-109 0 -170 46q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19h283v-19q-60 -5 -75.5 -21.5t-15.5 -72.5v-312q0 -65 8 -100t36 -62q47 -45 128 -45q101 0 152 59 q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h232v-19q-61 -6 -77.5 -29.5t-16.5 -97.5v-255q0 -77 -11 -121t-43 -81q-47 -54 -136 -68q-33 -30 -33 -61q0 -39 38 -39q32 0 71 36z" />
+<glyph unicode="&#x173;" horiz-adv-x="500" d="M338 4v72h-2q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251q0 37 -13 51t-49 16v14h146v-323q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5v231q0 39 -14 50.5t-60 14.5v17h158v-343q0 -35 11.5 -46t45.5 -11h6v-14q-51 -14 -89 -27q-44 -35 -44 -70 q0 -39 38 -39q32 0 71 36l20 -16q-28 -41 -52.5 -58.5t-58.5 -17.5q-33 0 -53.5 19.5t-20.5 54.5q0 49 47 86z" />
+<glyph unicode="&#x174;" horiz-adv-x="944" d="M627 719h-34l-122 103l-121 -103h-34l124 167h62zM932 662v-19q-40 -8 -54.5 -19.5t-28.5 -50.5q-114 -306 -204 -584h-15l-160 423l-154 -423h-15q-34 101 -101 285l-91 249q-25 72 -45.5 95.5t-58.5 24.5v19h244v-19q-37 -1 -50.5 -8t-13.5 -23q0 -17 11 -47l144 -376 l104 283l-28 75q-24 65 -41 80t-61 16v19h265v-19q-77 -2 -77 -35q0 -13 17 -58l143 -364l126 339q17 48 17 77q0 40 -70 41v19h197z" />
+<glyph unicode="&#x175;" horiz-adv-x="722" d="M528 507h-34l-122 103l-121 -103h-34l124 167h62zM694 450v-15q-15 -5 -22 -14.5t-19 -39.5l-138 -346q-20 -49 -28 -49q-5 0 -8.5 6.5t-15.5 36.5l-91 236l-112 -240q-18 -39 -25 -39q-9 0 -26 44l-135 342q-15 39 -25 50t-28 13v15h180v-15q-26 -3 -36 -10t-10 -23 q0 -15 6 -30l99 -261l91 199l-20 56q-14 40 -27.5 53t-41.5 16v15h203v-15q-35 -5 -46.5 -12t-11.5 -23t17 -60l84 -224l90 222q17 42 17 67q0 12 -9.5 18.5t-34.5 11.5v15h123z" />
+<glyph unicode="&#x176;" horiz-adv-x="722" d="M517 719h-34l-122 103l-121 -103h-34l124 167h62zM703 662v-19q-44 -4 -69.5 -25t-68.5 -87l-148 -228v-192q0 -57 19 -73t84 -19v-19h-306v19q68 5 84.5 21.5t16.5 82.5v171l-131 192q-68 100 -97 127.5t-65 29.5v19h279v-19l-24 -1q-47 -1 -47 -26q0 -21 18 -47 l146 -221l145 222q14 21 14 42q-1 17 -15.5 23.5t-52.5 7.5v19h218z" />
+<glyph unicode="&#x177;" horiz-adv-x="500" d="M405 507h-34l-122 103l-121 -103h-34l124 167h62zM475 450v-15q-18 -2 -29 -13t-21 -38l-150 -409q-39 -106 -78.5 -149.5t-96.5 -43.5q-32 0 -51 16.5t-19 41.5q0 19 12.5 32.5t30.5 13.5q29 0 52 -13q13 -7 26 -7q21 0 50 44q14 20 27 57t13 51q0 13 -42 101l-132 282 q-13 29 -53 35v14h205v-15q-32 -1 -44.5 -7t-12.5 -20q0 -11 13 -41l112 -250l97 276q4 9 4 18q0 24 -46 24v15h133z" />
+<glyph unicode="&#x178;" horiz-adv-x="722" d="M518 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM319 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM703 662v-19q-44 -4 -69.5 -25t-68.5 -87l-148 -228v-192 q0 -57 19 -73t84 -19v-19h-306v19q68 5 84.5 21.5t16.5 82.5v171l-131 192q-68 100 -97 127.5t-65 29.5v19h279v-19l-24 -1q-47 -1 -47 -26q0 -21 18 -47l146 -221l145 222q14 21 14 42q-1 17 -15.5 23.5t-52.5 7.5v19h218z" />
+<glyph unicode="&#x179;" horiz-adv-x="612" d="M238 719l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM598 176l-25 -176h-563v15l437 609h-214q-99 0 -134 -35q-18 -19 -25.5 -37.5t-15.5 -60.5h-26l21 171h525v-15l-432 -609h252q78 0 117 28q23 16 34 37.5t26 72.5h23z" />
+<glyph unicode="&#x17a;" horiz-adv-x="444" d="M154 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM418 136l-15 -136h-376v15l266 405h-135q-47 0 -63.5 -16.5t-23.5 -71.5h-18l4 118h346v-15l-269 -405h133q84 0 106 27q14 17 27 83z" />
+<glyph unicode="&#x17b;" horiz-adv-x="612" d="M369 784q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36zM598 176l-25 -176h-563v15l437 609h-214q-99 0 -134 -35q-18 -19 -25.5 -37.5t-15.5 -60.5h-26l21 171h525v-15l-432 -609h252q78 0 117 28 q23 16 34 37.5t26 72.5h23z" />
+<glyph unicode="&#x17c;" horiz-adv-x="444" d="M287 572q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36zM418 136l-15 -136h-376v15l266 405h-135q-47 0 -63.5 -16.5t-23.5 -71.5h-18l4 118h346v-15l-269 -405h133q84 0 106 27q14 17 27 83z" />
+<glyph unicode="&#x17d;" horiz-adv-x="612" d="M464 924l-124 -167h-64l-123 167h35l120 -103l121 103h35zM598 176l-25 -176h-563v15l437 609h-214q-99 0 -134 -35q-18 -19 -25.5 -37.5t-15.5 -60.5h-26l21 171h525v-15l-432 -609h252q78 0 117 28q23 16 34 37.5t26 72.5h23z" />
+<glyph unicode="&#x17e;" horiz-adv-x="444" d="M384 674l-124 -167h-64l-123 167h35l120 -103l121 103h35zM418 136l-15 -136h-376v15l266 405h-135q-47 0 -63.5 -16.5t-23.5 -71.5h-18l4 118h346v-15l-269 -405h133q84 0 106 27q14 17 27 83z" />
+<glyph unicode="&#x17f;" horiz-adv-x="334" d="M76 450h27q0 61 8 94q32 139 168 139q38 0 64 -12q40 -18 40 -50q0 -17 -12.5 -29t-28.5 -12q-25 0 -45 34q-24 41 -53 41q-57 0 -57 -91v-476q0 -43 18 -58q17 -13 75 -15v-15h-260v15q51 3 65 16q18 13 18 59v328h-27v32z" />
+<glyph unicode="&#x180;" horiz-adv-x="500" d="M157 509v-133q16 38 52.5 61t82.5 23q79 0 129.5 -63t50.5 -157q0 -110 -67 -180t-167 -70q-61 0 -113 20.5t-52 45.5v453h-92v31h92v26q0 37 -9 47.5t-40 10.5q-7 0 -17 -2v17l30 9l115 35l5 -2v-141h187v-31h-187zM157 318v-244q0 -23 28.5 -37.5t68.5 -14.5 q53 0 91.5 40.5t38.5 137.5q0 27 -5.5 56.5t-18 63.5t-39.5 55.5t-65 21.5q-40 0 -69.5 -23.5t-29.5 -55.5z" />
+<glyph unicode="&#x188;" horiz-adv-x="500" d="M398 156l14 -9q-34 -73 -80.5 -115t-117.5 -42q-85 0 -137 64.5t-52 155.5q0 69 26.5 124.5t74.5 87.5q55 38 120 38q39 0 79 -16q3 51 34 83t82 32q27 0 48.5 -16t21.5 -42q0 -28 -25 -28q-14 0 -22 9.5t-11 21t-11.5 21t-22.5 9.5q-40 0 -40 -83q0 -10 0.5 -25.5 t0.5 -19.5q18 -23 18 -47q0 -19 -13.5 -31.5t-32.5 -12.5q-25 0 -37 18t-14.5 40t-16 40t-40.5 18q-68 0 -105 -48.5t-37 -129.5q0 -75 40.5 -133t112.5 -58q48 0 80 24t63 70z" />
+<glyph unicode="&#x190;" horiz-adv-x="580" d="M526 168l36 -9q-1 -58 -60 -107q-71 -58 -197 -58q-66 0 -124 15t-103 57t-45 106q0 65 37.5 117t99.5 63q-66 31 -96 60.5t-30 85.5q0 61 42.5 104.5t100.5 62t122 19.5q59 0 107 -14q40 -11 71.5 -41.5t31.5 -65.5q0 -23 -13 -41.5t-34 -18.5q-45 0 -64 81 q-6 24 -36.5 40t-58.5 16q-165 0 -165 -166q0 -97 134 -97q9 0 51.5 5.5t53.5 5.5q16 0 31 -7.5t15 -21.5q0 -18 -26.5 -30t-47.5 -12q-8 0 -41.5 2.5t-39.5 2.5q-68 0 -104.5 -37t-36.5 -104q0 -127 190 -127q88 0 130 21.5t69 92.5z" />
+<glyph unicode="&#x192;" horiz-adv-x="434" d="M62 437h114q13 137 51 203t108 66q36 0 63.5 -19.5t27.5 -48.5q0 -19 -12 -32t-30 -13q-16 0 -28.5 8.5t-12.5 24.5q0 13 4.5 23.5t4.5 15.5q0 12 -21 12q-27 0 -40 -18q-32 -44 -32 -222h119v-31h-120q-1 -117 -17.5 -271t-33.5 -197q-39 -97 -115 -97q-36 0 -61 19.5 t-25 49.5q0 21 11 33t31 12q17 0 28 -10t11 -26q0 -15 -6 -27q-5 -9 -5 -14q2 -13 21 -13q69 0 69 174q0 23 -1 80t-1 69q0 77 8 218h-110v31z" />
+<glyph unicode="&#x195;" horiz-adv-x="735" d="M427 287v-161q0 -36 26 -65.5t61 -29.5q71 0 118.5 64.5t47.5 137.5q0 42 -10.5 73t-25.5 47t-30 27.5t-25.5 22.5t-10.5 25t14 23t29 9q28 0 47 -23t27.5 -59.5t11.5 -65.5t3 -57q0 -70 -21 -128t-70.5 -97.5t-121.5 -39.5q-76 0 -115 32t-39 106v172q0 106 -76 106 q-55 0 -110 -63v-241q0 -49 12 -66t56 -21v-15h-216v15q44 5 54 20.5t10 65.5v477q0 30 -10.5 38t-37.5 8q-8 0 -15 -1v16q80 23 142 44l5 -3v-304q18 23 31 36.5t45.5 30.5t69.5 17q35 0 60 -13.5t37 -30.5t18.5 -44.5t7.5 -43.5t1 -41z" />
+<glyph unicode="&#x199;" horiz-adv-x="500" d="M505 0h-218v15h19q21 0 21 16q0 9 -21 36l-140 184v-184q0 -29 13.5 -39t41.5 -12l20 -1v-15h-234v15q52 9 63.5 18t11.5 47v385q0 89 64 153.5t159 64.5q38 0 65.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-42 30q-39 0 -71 -40t-32 -99v-249l137 122 q23 20 23 35q0 17 -50 17v15h204v-15q-45 0 -80 -18q-44 -23 -125 -98l-40 -37l155 -197q24 -30 47.5 -46t36.5 -19.5t31 -4.5v-15z" />
+<glyph unicode="&#x19a;" horiz-adv-x="278" d="M257 0h-236v15q47 4 62 19.5t15 57.5v255h-77v31h77v183q0 36 -9 50t-33 14q-21 0 -37 -2v16q95 23 158 44l5 -4v-301h75v-31h-75v-260q0 -42 14 -55.5t61 -16.5v-15z" />
+<glyph unicode="&#x19b;" horiz-adv-x="520" d="M516 0h-133v15q46 0 46 24q0 9 -4 18l-97 276l-112 -250q-13 -30 -13 -41q0 -14 12.5 -20t44.5 -7v-15h-205v15q40 5 53 34l132 282q42 91 42 101q0 14 -17 61l-194 -194v54l177 176q-4 8 -6 11q-29 44 -50 44q-13 0 -26 -7q-23 -13 -52 -13q-18 0 -30.5 13.5t-12.5 32.5 q0 25 19 41.5t51 16.5q45 0 77.5 -25.5t61.5 -82.5l106 108v-54l-88 -90l168 -458q10 -27 21 -38t29 -13v-15z" />
+<glyph unicode="&#x19e;" horiz-adv-x="500" d="M485 -233h-208l1 15q37 3 49.5 21.5t12.5 68.5v432q0 101 -73 101q-25 0 -47 -12t-56 -45v-276q0 -30 13.5 -42t51.5 -15v-15h-211v15q38 3 50 18.5t12 60.5v243q0 37 -7 51t-28 14q-20 0 -29 -4v17q70 20 137 45l8 -3v-78h1q71 81 144 81q57 0 87.5 -40t30.5 -114v-454 q0 -40 12 -53t49 -17v-15z" />
+<glyph unicode="&#x1a0;" horiz-adv-x="722" d="M552 627h-14q70 -45 110 -122.5t40 -173.5q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95q69 0 127 -23q30 -8 55 -8q31 0 43 4.5t12 18.5q-34 19 -34 46q0 15 13.5 27.5t32.5 12.5q21 0 35 -15t14 -41q0 -55 -66 -68q-19 -3 -41 -3 zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#x1a1;" horiz-adv-x="545" d="M471 382l-1 4q-34 25 -34 47q0 15 13.5 28t32.5 13t34 -15.5t15 -40.5q0 -56 -67 -69l-20 -4q26 -49 26 -114q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5t-62 170.5q0 104 62 168t163 64q57 0 103.5 -25t75.5 -70q12 1 25 6.5t13 10.5zM380 204q0 114 -50 178 q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="&#x1a5;" horiz-adv-x="500" d="M159 535v-154q63 79 144 79q73 0 120 -60t47 -153q0 -109 -60.5 -183t-149.5 -74q-31 0 -52.5 9t-48.5 34v-157q0 -47 16 -60.5t72 -14.5v-18h-242v17q44 4 57 17t13 52v582q0 98 40 158t130 60q38 0 65.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-42 30 q-50 0 -50 -100zM159 334v-246q0 -22 34.5 -44t69.5 -22q54 0 87.5 51t33.5 134q0 88 -33.5 140.5t-89.5 52.5q-35 0 -68.5 -22t-33.5 -44z" />
+<glyph unicode="&#x1aa;" horiz-adv-x="432" d="M412 -177q0 -29 -29.5 -42.5t-62.5 -13.5q-83 0 -128 52t-45 136q0 96 24.5 275.5t27.5 256.5q-30 -24 -69 -24q-45 0 -77.5 32.5t-32.5 77.5t32.5 78t77.5 33q72 0 113.5 -57.5t41.5 -132.5q0 -95 -27 -300.5t-27 -302.5q0 -90 51 -90q18 0 43 30t47 30q16 0 28 -11 t12 -27zM201 545q-2 105 -65 105q-36 0 -59 -20.5t-23 -56.5q0 -31 22 -53.5t54 -22.5q24 0 43.5 13.5t27.5 34.5z" />
+<glyph unicode="&#x1ab;" horiz-adv-x="290" d="M266 77l13 -11q-2 -29 -2 -89q0 -32 -0.5 -50t-3.5 -44.5t-9.5 -41.5t-17 -30t-28.5 -22t-42 -7q-38 0 -65.5 15t-27.5 41q0 16 12.5 27t27.5 11q22 0 47 -30t42 -30q38 0 38 155q0 17 -0.5 28.5t-1 17t-0.5 7.5q-2 -3 -12.5 -10.5t-31.5 -15.5t-42 -8q-92 0 -92 127v301 h-53q-4 2 -4 7q0 6 6 11l17 12q12 8 21 17q21 20 43 48.5t34.5 47t13.5 18.5q6 0 6 -13v-116h101v-32h-101v-286q0 -17 1 -28t5 -27.5t15.5 -25.5t29.5 -9q31 0 61 35z" />
+<glyph unicode="&#x1ad;" horiz-adv-x="310" d="M17 418l-3 7q0 3 12 14l26 23q15 13 18 17q0 91 41 147.5t129 56.5q34 0 63.5 -13.5t29.5 -42.5q0 -15 -12 -26.5t-27 -11.5q-22 0 -47 30t-43 30q-50 0 -50 -100v-99h101v-32h-101v-288q0 -24 2 -39.5t14 -32t35 -16.5q32 0 61 35l13 -11q-49 -76 -120 -76 q-89 0 -89 127v301h-53z" />
+<glyph unicode="&#x1af;" horiz-adv-x="766" d="M750 682l-1 4q-35 23 -35 46q0 15 13.5 28.5t33.5 13.5q19 0 34 -15t15 -41q0 -32 -22.5 -50t-57.5 -22l-34 -4q-55 -7 -70 -31t-15 -95v-255q0 -77 -11 -121t-43 -81q-64 -73 -202 -73q-109 0 -170 46q-81 60 -81 217v310q0 50 -15.5 65t-74.5 19v19h283v-19 q-60 -5 -75.5 -21.5t-15.5 -72.5v-312q0 -65 8 -100t36 -62q47 -45 128 -45q101 0 152 59q23 28 30 61.5t7 99.5v263q0 78 -17 102t-77 28v19h231q14 0 30 7t16 13z" />
+<glyph unicode="&#x1b0;" horiz-adv-x="500" d="M259 450h158q20 0 40.5 5.5t20.5 13.5q0 10 -17 22t-17 33q0 14 12.5 25.5t33.5 11.5q18 0 33.5 -15.5t15.5 -40.5q0 -33 -25.5 -52.5t-67.5 -19.5h-29v-326q0 -35 11.5 -46t45.5 -11h6v-14q-78 -21 -137 -45l-5 3v82h-2q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v251 q0 37 -13 51t-49 16v14h146v-323q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5v231q0 39 -14 50.5t-60 14.5v17z" />
+<glyph unicode="&#x1b5;" horiz-adv-x="612" d="M598 176l-25 -176h-563v15l216 302h-124v43h155l190 264h-214q-99 0 -134 -35q-18 -19 -25.5 -37.5t-15.5 -60.5h-26l21 171h525v-15l-204 -287h145v-43h-175l-198 -279h252q78 0 117 28q23 16 34 37.5t26 72.5h23z" />
+<glyph unicode="&#x1ba;" horiz-adv-x="381" d="M360 429l-191 -186q37 17 66 17q56 0 90 -34.5t34 -88.5q0 -58 -61 -106q-121 -67 -172 -101q-35 -23 -35 -67q0 -30 24 -50t63 -20q28 0 49.5 15t26.5 40q13 64 52 64q22 0 35 -13t13 -31q0 -16 -11 -36t-32 -34q-51 -32 -125 -32q-49 0 -91 29q-51 36 -51 98 q0 71 67 113q56 35 134 75q36 19 36 58q0 30 -23 47.5t-66 17.5q-38 0 -60.5 -10t-51.5 -38q-14 11 -20 18l211 212h-165q-25 0 -52.5 -24t-32.5 -61h-17l32 149h324v-21z" />
+<glyph unicode="&#x1bb;" horiz-adv-x="500" d="M482 360v-46q-45 -1 -135 -1q-11 -16 -52 -61l-165 -176h234q36 0 55.5 15.5t40.5 51.5l14 -6l-54 -137h-391v12l178 189q60 64 87 112l-272 1v46h296q19 51 19 101q0 66 -36.5 103.5t-102.5 37.5q-59 0 -89.5 -32t-57.5 -98l-21 5q17 92 68 145.5t140 53.5 q80 0 132.5 -48.5t52.5 -127.5q0 -69 -43 -140h102z" />
+<glyph unicode="&#x1be;" horiz-adv-x="500" d="M212 447l3 -62q7 1 23 1q82 0 135.5 -62t53.5 -145q0 -95 -52 -143t-149 -48q-50 0 -101.5 28.5t-51.5 74.5q0 19 13.5 31.5t32.5 12.5t30.5 -13t17.5 -32t13 -38t22 -32t38 -13q31 0 53 29.5t30 64t8 64.5q0 61 -44.5 97t-105.5 36h-20v149h-77v31h77v61h47l3 -61h78 v-31h-77z" />
+<glyph unicode="&#x1c0;" horiz-adv-x="160" d="M105 0h-51v736h51v-736z" />
+<glyph unicode="&#x1c1;" horiz-adv-x="280" d="M105 0h-51v736h51v-736zM225 0h-51v736h51v-736z" />
+<glyph unicode="&#x1c2;" horiz-adv-x="435" d="M400 272h-157v-272h-51v272h-158v51h158v90h-158v51h158v272h51v-272h157v-51h-157v-90h157v-51z" />
+<glyph unicode="&#x1c3;" horiz-adv-x="333" d="M177 176l-45 381q-2 22 -2 38q0 37 14 59t39 22q53 0 53 -76q0 -13 -3 -43l-42 -381h-14zM236 43q0 -23 -15 -37.5t-37 -14.5q-23 0 -38.5 14.5t-15.5 36.5q0 23 15.5 39t37.5 16t37.5 -15.5t15.5 -38.5z" />
+<glyph unicode="&#x1f0;" horiz-adv-x="278" d="M294 674l-124 -167h-64l-123 167h35l120 -103l121 103h35zM193 457v-457q0 -107 -43.5 -162.5t-126.5 -55.5q-41 0 -67 15.5t-26 39.5q0 16 12 27.5t29 11.5q23 0 48 -32q23 -28 42 -28q23 0 34 18q14 25 14 121v379q0 60 -32 60q-24 0 -40 -3l-5 -1v16q80 25 156 54z " />
+<glyph unicode="&#x1fa;" horiz-adv-x="722" d="M379 646l234 -535q22 -52 39.5 -70t54.5 -22v-19h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l194 460q-24 8 -40 29t-16 48q0 33 23.5 56t57.5 23q32 0 55 -23.5t23 -56.5 q0 -27 -16.5 -48t-42.5 -28zM447 257l-116 275l-115 -275h231zM405 724q0 19 -14 32t-34 13q-17 0 -31 -13.5t-14 -31.5q0 -20 13.5 -34t31.5 -14q21 0 34.5 14t13.5 34zM256 798l141 121q14 12 20.5 15.5t19.5 3.5q25 0 25 -26q0 -16 -32 -35l-141 -79h-33z" />
+<glyph unicode="&#x1fb;" horiz-adv-x="444" d="M330 611q0 -41 -29.5 -70t-71.5 -29q-41 0 -69.5 29t-28.5 71q0 41 29.5 70t71.5 29q40 0 69 -29.5t29 -70.5zM296 612q0 27 -19.5 46t-47.5 19q-26 0 -45 -19.5t-19 -45.5q0 -28 19 -47t45 -19q28 0 47.5 19t19.5 47zM118 719l147 148q23 23 42 23q35 0 35 -32 q0 -23 -30 -42l-154 -97h-40zM442 66v-28q-38 -48 -90 -48q-57 0 -64 73h-1q-64 -73 -145 -73q-47 0 -76 27.5t-29 76.5q0 70 70 117q48 32 180 81v54q0 45 -21.5 67.5t-56.5 22.5q-30 0 -50 -14.5t-20 -34.5q0 -9 3 -20t3 -22q0 -15 -13.5 -28t-32.5 -13q-17 0 -30 13 t-13 33q0 48 51 80q47 30 115 30q81 0 118 -45q18 -21 23 -42.5t5 -68.5v-191q0 -66 31 -66q20 0 43 19zM287 127v141q-92 -32 -128 -66q-34 -31 -34 -77q0 -38 19 -57.5t50 -19.5q33 0 58 16q21 15 28 28t7 35z" />
+<glyph unicode="&#x1fc;" horiz-adv-x="889" d="M863 168l-44 -168h-509v19l17 2q45 5 58 22.5t13 68.5v148h-176q-92 -175 -92 -212q0 -23 67 -29h1v-19h-198v19q32 5 49 19.5t39 58.5l245 484q9 17 9 28q0 33 -90 33v20h564v-141h-23q-10 68 -42 86.5t-142 18.5h-84q-28 0 -28 -37v-223h104q77 0 107.5 19.5t31.5 78.5 h21v-235h-21q-7 59 -28.5 79.5t-73.5 20.5h-141v-235q0 -38 11 -47t59 -9h73q85 0 122.5 24t76.5 106h24zM398 299v319l-158 -319h158zM433 719l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40z" />
+<glyph unicode="&#x1fd;" horiz-adv-x="667" d="M620 154l12 -5q-39 -84 -79 -116q-48 -40 -118 -40q-44 0 -74 16t-55 54q-50 -42 -81.5 -56t-70.5 -14q-51 0 -83.5 29.5t-32.5 77.5q0 21 1.5 35.5t7.5 33t17.5 31t31.5 25t49 20.5l129 36v63q0 49 -13.5 69.5t-47.5 20.5q-28 0 -48 -12.5t-20 -29.5q0 -7 1.5 -19.5 t1.5 -22.5q0 -21 -12 -33.5t-32 -12.5t-32 13t-12 35q0 46 46 77t113 31q37 0 63 -10.5t55 -36.5q34 27 59 37t60 10q76 0 114 -43t46 -140h-262q1 -75 6 -108t21 -62q13 -23 38.5 -36.5t56.5 -13.5q43 0 75.5 22t68.5 75zM355 307h166q-1 66 -19.5 94t-59.5 28 q-43 0 -63 -28t-24 -94zM274 201v52q-91 -33 -120 -58t-29 -70q0 -38 16.5 -62.5t49.5 -24.5q28 0 65 18t37 32l-1 1v2q-18 59 -18 110zM218 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40z" />
+<glyph unicode="&#x1fe;" horiz-adv-x="722" d="M658 734l-88 -130q57 -53 79 -99q39 -81 39 -173q0 -154 -91.5 -250t-237.5 -96q-91 0 -175 50l-79 -116h-49l95 139q-33 30 -49.5 50.5t-29.5 48.5q-38 78 -38 172q0 152 91.5 249t236.5 97q88 0 175 -49l72 107h49zM194 123l308 452q-62 65 -141 65q-98 0 -155.5 -83.5 t-57.5 -226.5q0 -120 46 -207zM527 540l-308 -452q60 -66 142 -66q99 0 156 82.5t57 225.5q0 120 -47 210zM245 719l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40z" />
+<glyph unicode="&#x1ff;" horiz-adv-x="500" d="M437 551l-65 -125q98 -67 98 -192q0 -104 -64 -174t-159 -70q-47 0 -93 21l-65 -123h-37l73 140q-45 36 -65 73q-31 57 -31 126q0 102 61.5 167.5t158.5 65.5q44 0 92 -18l57 109h39zM158 92l159 304q-37 36 -80 36q-53 0 -85.5 -42.5t-32.5 -112.5q0 -101 39 -185z M340 366l-161 -306q35 -42 82 -42q56 0 87.5 48.5t31.5 136.5q0 87 -40 163zM131 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40z" />
+<glyph unicode="&#x221;" horiz-adv-x="671" d="M424 681v-591q0 -25 22 -59l28 44q10 16 29.5 39t42 34t47.5 11t42 -21t17 -47q0 -37 -31 -65q-41 -36 -127 -36h-34q-39 -64 -77 -140h-36q33 68 77 144q-26 6 -48 23.5t-29 42.5q-53 -70 -135 -70q-88 0 -136.5 62.5t-48.5 152.5q0 97 57 176t151 79q54 0 105 -43v156 q0 30 -9.5 41t-32.5 11q-6 0 -26 -2v16q86 22 147 44zM480 20h26q43 0 79.5 16t36.5 53q0 15 -9 27.5t-24 12.5q-18 0 -35 -10.5t-32 -31t-22.5 -33t-19.5 -34.5zM340 102v230q0 40 -31 70t-71 30q-45 0 -74.5 -32t-40 -71.5t-10.5 -83.5q0 -48 11.5 -91.5t44.5 -77.5 t82 -34q46 0 74 32q15 18 15 28z" />
+<glyph unicode="&#x234;" horiz-adv-x="429" d="M182 679v-568q0 -55 22 -80l28 44q10 16 29.5 39t42 34t47.5 11t42 -21t17 -47q0 -37 -31 -65q-41 -36 -127 -36h-34q-39 -64 -77 -140h-36q33 68 77 144q-84 16 -84 123v444q0 33 -9 48.5t-39 15.5q-11 0 -31 -2v16q94 23 158 44zM238 20h26q43 0 79.5 16t36.5 53 q0 15 -9 27.5t-24 12.5q-18 0 -34 -9.5t-32.5 -32.5t-22 -31.5t-20.5 -35.5z" />
+<glyph unicode="&#x235;" horiz-adv-x="672" d="M424 306v-216q0 -33 24 -57q15 26 26.5 42.5t30.5 38.5t40.5 33.5t45.5 11.5q27 0 44.5 -21.5t17.5 -48.5q0 -89 -162 -89h-24q-48 -78 -83 -150h-36q39 76 81 150h-152v15q40 3 51.5 24t11.5 66v199q0 101 -73 101q-46 0 -103 -57v-276q0 -32 16 -43.5t49 -13.5v-15 h-211v15q39 2 50.5 19.5t11.5 59.5v251q0 17 -1.5 27t-9.5 20t-24 10q-17 0 -29 -4v17q71 20 137 45l8 -3v-78h1q71 81 144 81q62 0 90 -44t28 -110zM623 90q0 16 -11 28t-27 12q-41 0 -99 -100q4 0 11 -0.5t10 -0.5q18 0 35 2.5t37 8t32 18.5t12 32z" />
+<glyph unicode="&#x236;" horiz-adv-x="401" d="M154 418v-286q0 -76 22 -101l28 44q10 16 29.5 39t42 34t47.5 11t42 -21t17 -47q0 -37 -31 -65q-41 -36 -127 -36h-34q-42 -72 -77 -140h-36q30 64 76 144q-83 16 -83 123v301h-53q-4 3 -4 7q0 8 17 19q42 27 97 107q14 18 20 28q7 1 7 -13v-116h101v-32h-101zM210 20h26 q43 0 79.5 16t36.5 53q0 15 -9 27.5t-24 12.5q-18 0 -35 -10.5t-32 -31t-22.5 -33t-19.5 -34.5z" />
+<glyph unicode="&#x237;" horiz-adv-x="278" d="M193 457v-457q0 -107 -43.5 -162.5t-126.5 -55.5q-41 0 -67 15.5t-26 39.5q0 16 12 27.5t29 11.5q23 0 48 -32q23 -28 42 -28q23 0 34 18q14 25 14 121v379q0 60 -32 60q-24 0 -40 -3l-5 -1v16q80 25 156 54z" />
+<glyph unicode="&#x250;" horiz-adv-x="444" d="M162 387h1q64 73 145 73q47 0 76 -27.5t29 -76.5q0 -70 -70 -117q-48 -32 -180 -81v-54q0 -45 21.5 -67.5t56.5 -22.5q30 0 50 14.5t20 34.5q0 9 -3 20t-3 22q0 15 13.5 28t32.5 13q17 0 30 -13t13 -33q0 -48 -51 -80q-47 -30 -115 -30q-81 0 -118 45q-18 21 -23 42.5 t-5 68.5v191q0 66 -31 66q-20 0 -43 -19v28q38 48 90 48q57 0 64 -73zM163 323v-141q92 32 128 66q34 31 34 77q0 38 -19 57.5t-50 19.5q-33 0 -58 -16q-21 -15 -28 -28t-7 -35z" />
+<glyph unicode="&#x251;" horiz-adv-x="500" d="M491 58v-16l-147 -52l-4 3v61h-2q-43 -64 -129 -64q-16 0 -34.5 3.5t-46 17t-49 36t-37 66t-15.5 101.5q0 99 61.5 172.5t145.5 73.5q57 0 106 -43l63 43h21v-346q0 -17 1 -25t5 -17t14.5 -12t28.5 -3q11 0 18 1zM340 102v230q-5 48 -35 74t-68 26q-49 0 -86.5 -45.5 t-37.5 -139.5q0 -103 41 -154t97 -51q32 0 57.5 16.5t31.5 43.5z" />
+<glyph unicode="&#x252;" horiz-adv-x="500" d="M178 396h2q43 64 129 64q16 0 34.5 -3.5t46 -17t49 -36t37 -66t15.5 -101.5q0 -99 -61.5 -172.5t-145.5 -73.5q-57 0 -106 43l-63 -43h-21v346q0 17 -1 25t-5 17t-14.5 12t-28.5 3q-11 0 -18 -1v16l147 52l4 -3v-61zM178 348v-230q5 -48 35 -74t68 -26q49 0 86.5 45.5 t37.5 139.5q0 103 -41 154t-97 51q-32 0 -57.5 -16.5t-31.5 -43.5z" />
+<glyph unicode="&#x253;" horiz-adv-x="500" d="M153 510v-134q12 31 47.5 57.5t87.5 26.5q85 0 132.5 -66.5t47.5 -157.5q0 -29 -7 -60.5t-25 -65t-44 -60t-68 -43.5t-94 -17q-54 0 -107.5 20t-53.5 46v409q0 89 64 153.5t159 64.5q38 0 65.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-42 30 q-39 0 -71 -40t-32 -99zM153 316v-243q0 -24 30 -37.5t64 -13.5q41 0 69 17.5t41 47t18 56.5t5 56q0 80 -32.5 139t-97.5 59q-32 0 -64.5 -21.5t-32.5 -59.5z" />
+<glyph unicode="&#x254;" horiz-adv-x="444" d="M24 293l-14 9q43 84 82 115q51 42 115 42q83 0 136.5 -62.5t53.5 -159.5q0 -127 -84 -197q-62 -51 -135 -51q-63 0 -108.5 30.5t-45.5 72.5q0 17 14 29.5t33 12.5q35 0 48 -46l6 -22q8 -28 20 -38t39 -10q61 0 98.5 48t37.5 126q0 86 -43 140.5t-112 54.5 q-43 0 -74 -20.5t-67 -73.5z" />
+<glyph unicode="&#x255;" horiz-adv-x="444" d="M84 -160l79 158q-64 25 -101 80t-37 135q0 115 67.5 181t153.5 66q64 0 107 -31q45 -33 45 -70q0 -18 -12.5 -31t-34.5 -13q-18 0 -30.5 13t-17.5 33q-6 24 -9 33.5t-10.5 20t-19 13.5t-31.5 3q-18 0 -38 -7.5t-42 -25.5t-36.5 -55.5t-14.5 -89.5q0 -54 29 -105.5 t74 -87.5q43 54 65.5 71.5t61.5 17.5t62 -20t23 -54q0 -40 -31.5 -65.5t-90.5 -25.5h-22q-45 0 -73 6l-80 -150h-36zM384 76q0 47 -51 47q-23 0 -41 -11t-28.5 -24.5t-33.5 -46.5q37 -21 68 -21q51 0 68.5 15t17.5 41z" />
+<glyph unicode="&#x256;" horiz-adv-x="553" d="M424 681v-796q0 -84 46 -84q17 0 42 30t47 30q16 0 28 -11t12 -27q0 -29 -29.5 -42.5t-63.5 -13.5q-43 0 -74.5 14t-49 35t-27.5 54t-12.5 62.5t-2.5 69.5v55q-43 -67 -131 -67q-89 0 -135.5 65.5t-46.5 158.5q0 92 59 169t148 77q57 0 106 -43v156q0 30 -9 40.5 t-32 10.5q-17 0 -27 -1v16q86 22 147 44zM340 102v230q0 41 -31.5 70.5t-71.5 29.5q-64 0 -94 -57.5t-30 -127.5q0 -49 11.5 -92.5t44.5 -78t82 -34.5q27 0 58 17.5t31 42.5z" />
+<glyph unicode="&#x257;" horiz-adv-x="587" d="M340 417v48q0 98 39.5 158t129.5 60q38 0 65.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-42 30q-30 0 -39.5 -26.5t-9.5 -83.5v-425q0 -17 1 -25t5 -17t13.5 -12t25.5 -3q15 0 22 1v-16l-147 -52l-4 3v64q-48 -67 -127 -67q-61 0 -108 34q-78 57 -78 183 q0 105 61 179t146 74q57 0 106 -43zM340 102v225q0 48 -32 76.5t-71 28.5q-49 0 -86.5 -45.5t-37.5 -139.5q0 -104 41 -154.5t98 -50.5q32 0 57 16.5t31 43.5z" />
+<glyph unicode="&#x258;" horiz-adv-x="444" d="M350 277h-311q8 94 54.5 138.5t121.5 44.5q33 0 66.5 -13t65.5 -40t52 -77t20 -116q0 -105 -51 -164.5t-136 -59.5q-41 0 -76.5 14.5t-57.5 35t-40 46t-26 42t-12 29.5l16 7q12 -20 22 -33t29.5 -32.5t46 -29.5t57.5 -10q60 0 105.5 49t53.5 169zM141 309h206 q-11 63 -38.5 89t-71.5 26q-23 0 -40 -8t-26 -18t-16 -28.5t-9 -29.5t-5 -31z" />
+<glyph unicode="&#x259;" horiz-adv-x="444" d="M30 286l-16 7q4 13 12 29.5t26 42t40 46t57.5 35t76.5 14.5q85 0 136 -59.5t51 -164.5q0 -66 -20 -116t-52 -77t-65.5 -40t-66.5 -13q-75 0 -121.5 44.5t-54.5 138.5h311q-8 120 -53.5 169t-105.5 49q-31 0 -57.5 -10t-46 -29.5t-29.5 -32.5t-22 -33zM341 141h-206 q3 -20 5 -31t9 -29.5t16 -28.5t26 -18t40 -8q44 0 71.5 26t38.5 89z" />
+<glyph unicode="&#x25a;" horiz-adv-x="657" d="M621 293l30 -12q-9 -29 -31.5 -50t-51.5 -21q-50 0 -67 30.5t-17 83.5q0 12 0.5 34t0.5 27l-79 -47q31 -55 31 -113q0 -86 -65.5 -162t-150.5 -76q-76 0 -127.5 46t-57.5 122l289 167q-19 43 -55 71.5t-80 28.5q-69 0 -133 -51l-17 9q42 44 72 62t80 18q130 0 200 -99 l119 69l6 -4v-14q0 -1 -1 -54.5t-1 -64.5q0 -22 15.5 -37.5t37.5 -15.5q36 0 53 53zM335 296l-259 -152q0 -48 28.5 -82t76.5 -34q72 0 118 61.5t46 135.5q0 33 -10 71z" />
+<glyph unicode="&#x25b;" horiz-adv-x="438" d="M377 84l12 -12q-71 -86 -179 -86q-76 0 -131 34q-26 16 -42.5 44.5t-16.5 58.5q0 31 16.5 59t44.5 43q30 16 82 24v2q-116 24 -116 107q0 52 45 84.5t119 32.5q69 0 113 -30q21 -14 32 -34t11 -36q0 -18 -13 -31t-35 -13q-18 0 -30.5 15t-17.5 34q-11 37 -19.5 49.5 t-26.5 12.5q-39 0 -64.5 -26t-25.5 -64q0 -39 35 -68q23 -20 75 -21v-30h-11q-53 0 -86.5 -29t-33.5 -75q0 -47 30 -77t77 -30q79 0 156 62z" />
+<glyph unicode="&#x25c;" horiz-adv-x="438" d="M246 251v-2q52 -8 82 -24q28 -15 44.5 -43t16.5 -59q0 -30 -16.5 -58.5t-42.5 -44.5q-55 -34 -131 -34q-108 0 -179 86l12 12q78 -62 156 -62q47 0 77 30t30 77q0 46 -33.5 75t-86.5 29h-11v30q52 1 75 21q35 29 35 68q0 38 -25.5 64t-64.5 26q-18 0 -26.5 -12.5 t-19.5 -49.5q-5 -19 -17.5 -34t-30.5 -15q-22 0 -35 13t-13 31q0 16 11 36t32 34q44 30 113 30q74 0 119 -32.5t45 -84.5q0 -83 -116 -107z" />
+<glyph unicode="&#x25d;" horiz-adv-x="623" d="M573 293l30 -12q-8 -29 -31 -50t-52 -21q-27 0 -44.5 9.5t-25.5 28.5t-11 37t-3 44q0 17 0.5 33t0.5 23l-75 -43q-5 -38 -38.5 -60.5t-77.5 -30.5v-2q143 -22 143 -126q0 -67 -59 -102t-131 -35q-109 0 -179 86l12 12q78 -62 156 -62q46 0 76.5 30t30.5 77 q0 53 -37.5 78.5t-93.5 25.5v30q46 1 78 23.5t32 65.5q0 38 -26 64t-64 26q-19 0 -29.5 -17.5t-14.5 -38t-17 -38t-35 -17.5q-19 0 -32.5 12.5t-13.5 31.5q0 33 28 57t61.5 33.5t66.5 9.5q60 0 108.5 -25.5t54.5 -78.5l102 59l6 -4l-1 -30q-1 -16 -1 -103q0 -22 15.5 -37.5 t37.5 -15.5q20 0 34.5 16t18.5 37z" />
+<glyph unicode="&#x25e;" horiz-adv-x="479" d="M287 251v-2q143 -22 143 -126q0 -67 -59 -102t-131 -35q-110 0 -165 67t-55 181q0 106 58 173.5t161 67.5q64 0 114 -29t50 -88q0 -83 -116 -107zM205 233v30q46 1 78 23t32 66q0 38 -26 64t-64 26q-46 0 -79.5 -36.5t-47 -81.5t-13.5 -89q0 -42 13.5 -89t45.5 -85.5 t76 -38.5q47 0 81.5 30t34.5 77q0 53 -38 78.5t-93 25.5z" />
+<glyph unicode="&#x25f;" horiz-adv-x="315" d="M296 210h-82v-210q0 -107 -43.5 -162.5t-126.5 -55.5q-41 0 -67 15.5t-26 39.5q0 16 12 27.5t29 11.5q23 0 48 -32q23 -28 42 -28q23 0 34 18q14 25 14 121v255h-122v31h122v137q0 43 -20 55q-16 9 -55 12v15h236v-15q-44 -4 -58 -16q-19 -16 -19 -62v-126h82v-31z" />
+<glyph unicode="&#x260;" horiz-adv-x="594" d="M372 435v30q0 98 39.5 158t129.5 60q38 0 65.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-42 30q-18 0 -28.5 -8.5t-15 -31.5t-5.5 -41.5t-1 -57.5v-537q0 -83 -63.5 -134t-165.5 -51q-70 0 -120.5 23.5t-50.5 55.5q0 16 10.5 26.5t26.5 10.5q15 0 26.5 -9 t23.5 -25t18 -22q36 -32 84 -32q62 0 99 45q30 36 30 99v93q-65 -67 -142 -67q-80 0 -139.5 70t-59.5 165q0 103 69.5 178.5t163.5 75.5q56 0 107 -40zM373 88v225q0 52 -30 87q-38 43 -88 43q-56 0 -93.5 -54.5t-37.5 -135.5q0 -87 44.5 -148t108.5 -61q54 0 96 44z" />
+<glyph unicode="&#x261;" horiz-adv-x="537" d="M455 482v-509q0 -89 -68 -137t-161 -48q-51 0 -111 19.5t-60 59.5q0 16 10.5 26.5t26.5 10.5t31 -14t27 -30t37 -30t57 -14q61 0 95 41t34 103v93q-65 -67 -142 -67q-86 0 -142.5 73.5t-56.5 161.5q0 99 67.5 176.5t165.5 77.5q60 0 119 -51l9 8q4 3 7 8l6 6q2 3 5 8.5 t4.5 8t5 9.5t5.5 10h29zM373 88v225q0 51 -33.5 90.5t-84.5 39.5q-64 0 -97.5 -60.5t-33.5 -129.5q0 -47 16 -93.5t52 -81t85 -34.5q54 0 96 44z" />
+<glyph unicode="&#x262;" horiz-adv-x="570" d="M539 235v-12q-30 -2 -40 -12t-10 -42v-131q0 -15 -76.5 -32t-111.5 -17q-134 0 -207 70q-64 63 -64 168q0 99 83 165q74 58 177 58q21 0 97 -14q35 -7 40 -7q24 0 32 21h16l5 -142h-16q-24 51 -53 78q-42 36 -110 36q-78 0 -123 -42q-61 -58 -61 -169q0 -90 53 -142.5 t141 -52.5q36 0 69.5 10t33.5 29v105q0 40 -11.5 51t-54.5 12v12h191z" />
+<glyph unicode="&#x263;" horiz-adv-x="500" d="M480 450v-15q-9 -1 -16.5 -5t-12.5 -8t-9.5 -12t-5.5 -12l-6 -14q-4 -10 -4 -11l-110 -299l52 -108q26 -52 26 -99t-29.5 -74t-76.5 -27q-104 0 -104 86q0 43 19 81l45 92l-145 309l-31 67q-13 28 -53 34v15h205v-15q-57 -3 -57 -26q0 -12 9 -33l116 -259l93 264 q8 24 8 30q0 24 -46 24v15h133zM267 -13l-29 -68q-11 -27 -11 -56q0 -64 41 -64q24 0 39.5 16.5t15.5 40.5q0 17 -14 47z" />
+<glyph unicode="&#x264;" horiz-adv-x="500" d="M266 263l83 125q1 1 7 10l7 10q1 2 6.5 9.5t8 9.5t7.5 7t9 7t10 4.5t12 3.5t13 1q23 0 40 -17t17 -40q0 -24 -22 -64l-10 26q-4 10 -15 20.5t-25 10.5q-31 0 -63 -49l-65 -100q2 -4 14 -24l20 -32q7 -12 16.5 -30t14 -33t4.5 -26q0 -43 -32.5 -72.5t-76.5 -29.5 q-43 0 -69.5 22t-26.5 64q0 25 30 68l43 60l-90 137q-29 45 -59 45q-18 0 -29 -13t-16 -28t-7 -16q-9 25 -9 42q0 32 23.5 55.5t54.5 23.5q34 0 58.5 -21.5t48.5 -59.5zM284 85q0 9 -5.5 22.5t-10.5 22.5t-16 26t-12 19l-16 -21l-19 -27q-7 -10 -13.5 -26t-6.5 -28 q0 -21 15 -32.5t36 -11.5q23 0 35.5 16.5t12.5 39.5z" />
+<glyph unicode="&#x265;" horiz-adv-x="500" d="M491 450v-15q-43 -6 -53.5 -20t-10.5 -67v-471q0 -32 9.5 -41.5t41.5 -9.5q9 0 12 1v-16l-27 -8q-77 -23 -115 -36l-5 3v304q-35 -45 -69 -64.5t-78 -19.5q-123 0 -123 159v199q0 52 -9.5 65.5t-50.5 21.5v15h212v-15q-44 -5 -56 -20t-12 -67v-198q0 -106 74 -106 q30 0 55 14t57 49v241q0 52 -12 67t-56 20v15h216z" />
+<glyph unicode="&#x266;" horiz-adv-x="500" d="M487 0h-212v15q41 5 54.5 18.5t13.5 60.5v206q0 106 -77 106q-55 0 -109 -63v-246q0 -50 14 -64t54 -18v-15h-216v15q42 6 53 19.5t11 64.5v399q0 78 52 131.5t131 53.5q72 0 121.5 -20.5t49.5 -52.5q0 -16 -10.5 -26.5t-26.5 -10.5q-6 0 -12 1.5t-9.5 3.5t-8.5 8l-8 8 q-3 2 -10 11l-10 13q-32 40 -72 40q-41 0 -75 -42q-28 -33 -28 -80v-160q63 84 146 84q124 0 124 -159v-199q0 -53 10.5 -66.5t49.5 -20.5v-15z" />
+<glyph unicode="&#x267;" horiz-adv-x="481" d="M427 298v-313q0 -94 -48.5 -156t-140.5 -62q-38 0 -65.5 15t-27.5 41q0 16 12.5 27t27.5 11q22 0 47 -30t42 -30q69 0 69 139v360q0 106 -77 106q-55 0 -109 -63v-241q0 -54 13.5 -68.5t54.5 -18.5v-15h-216v15q42 5 53 19.5t11 67.5v396q0 78 52 131.5t131 53.5 q72 0 121.5 -20.5t49.5 -52.5q0 -16 -10.5 -26.5t-26.5 -10.5q-5 0 -9 1t-7 1.5t-7 3.5l-6 5q-2 1 -6.5 6t-6 7t-7.5 9.5t-8 10.5q-32 41 -72 41q-42 0 -76 -42q-28 -33 -28 -80v-160q62 84 146 84q124 0 124 -162z" />
+<glyph unicode="&#x268;" horiz-adv-x="278" d="M180 632q0 -22 -15 -36.5t-37 -14.5q-21 0 -35.5 14.5t-14.5 36.5q0 21 15 36t36 15q22 0 36.5 -15t14.5 -36zM253 0h-237v15q52 3 65.5 18t13.5 71v126h-79v31h79v70q0 35 -7 49t-26 14q-24 0 -42 -5v16l155 55l4 -4v-195h74v-31h-74v-125q0 -56 12.5 -71t61.5 -19v-15z " />
+<glyph unicode="&#x269;" horiz-adv-x="333" d="M295 80l16 -12q-23 -31 -56 -54.5t-67 -23.5q-54 0 -75 33t-21 102v210q0 33 -7.5 46t-25.5 13q-24 0 -42 -5v16q13 4 53 18l64 23q26 8 32 8q10 0 10 -20v-330q0 -32 15.5 -46t37.5 -14q31 0 66 36z" />
+<glyph unicode="&#x26a;" horiz-adv-x="258" d="M231 0h-210v18q45 1 55.5 15.5t10.5 56.5v274q0 41 -10 53.5t-56 14.5v18h210v-18q-45 -1 -54.5 -15t-9.5 -58v-264q0 -42 10.5 -59t53.5 -18v-18z" />
+<glyph unicode="&#x26b;" horiz-adv-x="350" d="M311 425h29q-16 -57 -40 -81.5t-65 -24.5q-13 0 -19 1v-233q0 -42 14 -55.5t61 -16.5v-15h-236v15q47 4 62 19.5t15 57.5v261l-1 1q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37.5 75t63.5 26q7 0 21 -2v143q0 36 -9 50t-33 14q-21 0 -37 -2v16q95 23 158 44l5 -4v-295 q25 -10 42 -10t28.5 11.5t24.5 39.5z" />
+<glyph unicode="&#x26c;" horiz-adv-x="375" d="M351 360l11 -13q-5 -7 -14.5 -17t-43 -34t-72.5 -38v-174q0 -40 15 -53.5t60 -15.5v-15h-236v15q45 4 61 19t16 56v149q-10 -2 -29 -2q-44 0 -75.5 31t-31.5 75t32 75.5t75 31.5q9 0 29 -5v119q0 34 -9.5 47.5t-33.5 13.5q-12 0 -36 -2v16q93 23 159 44l4 -2v-391 q75 26 119 70zM148 276v141q-10 4 -16 4q-23 0 -45.5 -22t-22.5 -46q0 -30 18.5 -51.5t47.5 -24.5q6 -1 18 -1z" />
+<glyph unicode="&#x26d;" horiz-adv-x="302" d="M173 681v-741q0 -39 1 -57.5t5.5 -41.5t15 -31.5t28.5 -8.5q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41t-65.5 -15q-90 0 -130 60t-40 158v579q0 34 -9.5 47.5t-34.5 13.5q-11 0 -35 -2v16q93 23 159 44z" />
+<glyph unicode="&#x26e;" horiz-adv-x="549" d="M506 400l-164 -204q16 3 32 3q67 0 115.5 -53t48.5 -145q0 -59 -20.5 -105.5t-54 -73.5t-71.5 -41t-76 -14q-60 0 -106 31q-21 14 -32 34t-11 36q0 18 13 31t36 13q16 0 29.5 -14.5t18.5 -37.5q10 -40 21 -52t49 -12q17 0 36.5 7.5t41.5 25.5t36.5 55.5t14.5 89.5 q0 82 -42 121.5t-110 39.5q-10 0 -52 -19l-14 11l214 259h-277v-302q0 -41 14.5 -53t60.5 -16v-15h-236v15q42 3 59.5 17.5t17.5 54.5v477q0 34 -9.5 47.5t-33.5 13.5t-36 -2v16q102 25 158 44l5 -2v-231h324v-50z" />
+<glyph unicode="&#x26f;" horiz-adv-x="778" d="M770 450v-15q-42 -1 -56 -15.5t-14 -57.5v-248q0 -37 8 -51.5t27 -14.5q15 0 32 4v-17q-68 -19 -139 -45l-8 3v74h-2q-45 -47 -79.5 -62t-73.5 -15q-79 0 -106 84q-78 -84 -163 -84q-116 0 -116 180v203q0 33 -10 45.5t-33 14.5l-26 2v15h218v-15q-42 -4 -53.5 -17.5 t-11.5 -57.5v-206q0 -60 17.5 -86t59.5 -26q35 0 59.5 14t47.5 47v252q0 48 -14.5 63.5t-57.5 16.5v15h224v-15q-44 -3 -56 -14.5t-12 -56.5v-211q0 -111 65 -111q28 0 59.5 12.5t46.5 30.5q13 15 13 17v278q0 32 -14 42.5t-54 12.5v15h222z" />
+<glyph unicode="&#x270;" horiz-adv-x="803" d="M785 -233h-240v15q45 8 58 19t13 50v216q-66 -77 -147 -77q-46 0 -70.5 20.5t-39.5 63.5q-81 -84 -162 -84q-117 0 -117 178v206q0 56 -41 59l-28 2v15h218v-15q-40 -5 -52.5 -17t-12.5 -55v-208q0 -34 3.5 -55t21.5 -39.5t52 -18.5q38 0 61.5 15.5t45.5 45.5v258 q0 26 -4.5 41.5t-16.5 22t-21 8t-30 2.5v15h224v-15q-43 -3 -55.5 -14.5t-12.5 -54.5v-214q0 -110 66 -110q31 0 60.5 14t43.5 27.5t14 17.5v282q0 18 -4.5 28.5t-16 15.5t-20 6t-27.5 2v15h222v-15q-19 0 -28.5 -2t-21 -8t-16 -21t-4.5 -39v-508q0 -25 5.5 -40.5 t18.5 -22.5t25.5 -9t35.5 -3v-15z" />
+<glyph unicode="&#x271;" horiz-adv-x="778" d="M706 282v-297q0 -94 -48.5 -156t-140.5 -62q-38 0 -65.5 15t-27.5 41q0 16 12.5 27t27.5 11q22 0 47 -30t42 -30q69 0 69 139v354q0 24 -2 40t-9 35t-23 29t-42 10q-39 0 -63.5 -16t-44.5 -45v-259q0 -25 5 -41t17.5 -22t21.5 -8t28 -2v-15h-224v15q4 1 16 2t14.5 1.5 t11 2.5t10.5 4.5t6.5 7.5t5.5 11l2 16q2 9 2 21v220q0 50 -17 78.5t-47 28.5q-32 0 -62 -14t-44 -27.5t-14 -18.5v-280q0 -18 4 -28.5t15.5 -15.5t20 -6.5t28.5 -2.5v-15h-222v15q39 1 54.5 13t15.5 56v254q0 41 -9.5 52.5t-25.5 11.5t-32 -4v17q69 19 140 45l7 -2v-76 q46 45 79 61.5t75 16.5q45 0 69.5 -22.5t37.5 -62.5q75 85 163 85q116 0 116 -178z" />
+<glyph unicode="&#x272;" horiz-adv-x="529" d="M514 0h-208v15q24 3 34.5 7.5t19.5 22.5t9 54v205q0 50 -16.5 75.5t-58.5 25.5q-25 0 -47.5 -13.5t-53.5 -43.5v-363q0 -98 -40 -158t-130 -60q-38 0 -65.5 15t-27.5 41q0 16 12.5 27t27.5 11q22 0 47 -30t42 -30q18 0 28.5 8.5t15 31.5t5.5 41.5t1 57.5v402q0 27 -6 41 t-12 16.5t-17 2.5q-21 0 -29 -4v17q70 20 137 45l8 -3v-79q73 82 144 82q51 0 85 -35t34 -119v-225q0 -36 12.5 -49.5t48.5 -16.5v-15z" />
+<glyph unicode="&#x273;" horiz-adv-x="533" d="M424 308v-368q0 -39 1 -57.5t5.5 -41.5t15 -31.5t28.5 -8.5q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41t-65.5 -15q-90 0 -130 60t-40 158v319q0 50 -16.5 75.5t-58.5 25.5t-101 -57v-277q0 -28 13.5 -41t51.5 -15v-15h-211v15q36 3 49 17.5t13 57.5v250 q0 28 -6 42.5t-12 17t-17 2.5q-21 0 -29 -4v17q70 20 137 45l8 -3v-79q75 82 144 82q49 0 84 -34t35 -118z" />
+<glyph unicode="&#x274;" horiz-adv-x="602" d="M561 450v-18q-38 -4 -52 -13q-21 -18 -21 -81v-346h-14l-333 368v-254q0 -52 12 -67.5t58 -20.5v-18h-182v18q51 5 64 19.5t13 68.5v289q-21 23 -35 30t-42 7v18h133l291 -324v220q0 54 -14 68q-8 14 -61 18v18h183z" />
+<glyph unicode="&#x275;" horiz-adv-x="500" d="M470 231q0 -103 -62 -172t-156 -69q-98 0 -160.5 68.5t-62.5 169.5q0 106 61.5 169t161.5 63q94 0 156 -63t62 -166zM119 247h261q0 87 -38.5 136t-89.5 49q-54 0 -93 -48.5t-40 -136.5zM380 214h-260q0 -85 40 -140.5t92 -55.5q50 0 89 55.5t39 140.5z" />
+<glyph unicode="&#x276;" horiz-adv-x="720" d="M697 110l-34 -112h-270q-25 0 -77 -2t-68 -2q-48 0 -94 17.5t-72 46.5q-59 65 -59 163q0 129 100 192q59 37 148 37q11 0 49 -2q42 -3 90 -3h251v-96h-19q-6 45 -29 57.5t-98 12.5h-42q-31 0 -42 -5t-11 -18v-150h77q63 0 84 12.5t25 53.5h18v-159h-18q-5 39 -22.5 53 t-61.5 14h-102v-159q0 -20 9.5 -28.5t36.5 -8.5h89q40 0 68.5 19.5t56.5 66.5h17zM339 88v265q0 37 -16.5 54t-55.5 17q-74 0 -115.5 -52.5t-41.5 -150.5q0 -92 34 -143q40 -58 118 -58q41 0 59 16t18 52z" />
+<glyph unicode="&#x277;" horiz-adv-x="667" d="M629 194q0 -82 -50.5 -140t-130.5 -58t-115 84q-35 -84 -115 -84t-130.5 58t-50.5 140q0 125 88 203t209 78q116 0 205.5 -78.5t89.5 -202.5zM533 210q0 121 -56 183t-143 62t-144 -62t-57 -183q0 -26 4 -52.5t13 -55t29 -46.5t47 -18q31 0 53.5 22t22.5 54 q0 22 -13 71.5t-13 79.5q0 61 57 61t57 -61q0 -30 -13 -79.5t-13 -71.5q0 -32 22.5 -54t53.5 -22q27 0 47 18t29 46.5t13 55t4 52.5z" />
+<glyph unicode="&#x278;" horiz-adv-x="667" d="M375 599v-164q105 -9 178 -63.5t73 -151.5q0 -94 -73.5 -155.5t-177.5 -67.5v-146q0 -42 15 -54.5t60 -14.5v-15h-236v15q45 3 61 17.5t16 54.5v143q-104 6 -177.5 67.5t-73.5 155.5q0 97 73 151.5t178 63.5v161q0 40 -16 54.5t-61 17.5v15h236v-15q-45 -2 -60 -14.5 t-15 -54.5zM375 407v-382q72 10 111.5 66.5t39.5 130.5q0 78 -39 129t-112 56zM291 25v382q-73 -5 -112 -56t-39 -129q0 -74 40 -130.5t111 -66.5z" />
+<glyph unicode="&#x279;" horiz-adv-x="370" d="M360 450v-15q-48 -9 -59.5 -20t-11.5 -49v-250q0 -33 7.5 -46.5t26.5 -13.5q16 0 35 4v-16q-63 -20 -148 -54l-5 2v92q-38 -54 -63.5 -74t-56.5 -20q-26 0 -40.5 14t-14.5 39q0 21 10.5 33t28.5 12q19 0 40 -20q17 -15 26 -15q21 0 45.5 29t24.5 53v225q0 43 -17 58 t-68 17v15h240z" />
+<glyph unicode="&#x27a;" horiz-adv-x="370" d="M364 0h-159v84q-37 -53 -63 -73.5t-57 -20.5q-26 0 -40.5 14.5t-14.5 39.5q0 19 10 31.5t28 12.5q19 0 38.5 -17.5t29.5 -17.5q20 0 44.5 29t24.5 53v424q0 36 -9 51t-33 15q-13 0 -37 -2v16q93 23 159 44l4 -2v-597q0 -42 14.5 -53.5t60.5 -15.5v-15z" />
+<glyph unicode="&#x27b;" horiz-adv-x="418" d="M289 366v-249q0 -316 50 -316q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41t-65.5 -15q-46 0 -80.5 32t-53 82t-27.5 101t-9 99q-60 -91 -121 -91q-25 0 -39.5 14.5t-14.5 39.5q0 19 10 31.5t28 12.5q19 0 38.5 -17.5t30.5 -17.5q18 0 43 29t25 53v225 q0 25 -5.5 40.5t-18.5 22.5t-25.5 9t-35.5 3v15h240v-15q-45 -8 -58 -19t-13 -50z" />
+<glyph unicode="&#x27c;" horiz-adv-x="333" d="M160 458v-92q37 53 62.5 73.5t57.5 20.5q27 0 41 -14.5t14 -39.5q0 -19 -10 -31.5t-28 -12.5q-19 0 -38.5 17.5t-30.5 17.5q-18 0 -43 -29t-25 -52v-459q0 -25 5.5 -40.5t18.5 -22.5t25.5 -9t35.5 -3v-15h-240v15q45 8 58 19t13 50v483q0 21 -3 34t-9 18t-10.5 6.5 t-12.5 1.5q-16 0 -34 -4v16q79 26 148 54z" />
+<glyph unicode="&#x27d;" horiz-adv-x="370" d="M160 315v-375q0 -39 1 -57.5t5.5 -41.5t15 -31.5t28.5 -8.5q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41t-65.5 -15q-90 0 -130 60t-40 158v349q0 21 -3 34t-9 18t-10.5 6.5t-12.5 1.5q-16 0 -34 -4v16q79 26 148 54l5 -2v-92q38 55 63 74.5t58 19.5 q25 0 39.5 -14.5t14.5 -39.5q0 -19 -10 -31.5t-28 -12.5q-19 0 -38.5 17.5t-30.5 17.5q-19 0 -43.5 -29t-24.5 -53z" />
+<glyph unicode="&#x27e;" horiz-adv-x="315" d="M74 76v176q0 98 40 158t130 60q38 0 65.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-42 30q-18 0 -28.5 -8.5t-15 -31.5t-5.5 -41.5t-1 -57.5v-221q0 -37 11.5 -48.5t52.5 -14.5v-13h-212v13q41 3 52.5 14t11.5 49z" />
+<glyph unicode="&#x27f;" horiz-adv-x="350" d="M332 0h-212v13q41 3 52.5 14.5t11.5 48.5v221q0 39 -1 57.5t-5.5 41.5t-15 31.5t-28.5 8.5q-17 0 -42 -30t-47 -30q-15 0 -27.5 11t-12.5 27q0 26 27.5 41t65.5 15q90 0 130 -60t40 -158v-176q0 -38 11.5 -49t52.5 -14v-13z" />
+<glyph unicode="&#x280;" horiz-adv-x="475" d="M470 0h-120l-144 209h-37v-106q0 -47 14.5 -65t53.5 -20v-18h-216v18q40 1 56 23q11 15 11 57v257q0 51 -14 67q-16 20 -53 24v18h222q76 0 123 -34t47 -88q0 -86 -121 -120l114 -170q24 -34 54 -34h10v-18zM169 242h17q50 0 79 16q55 28 55 84q0 41 -27.5 65.5 t-75.5 24.5q-20 0 -48 -7v-183z" />
+<glyph unicode="&#x281;" horiz-adv-x="475" d="M470 446h-10q-30 0 -54 -34l-114 -170q121 -34 121 -120q0 -54 -47 -88t-123 -34h-222v18q37 4 53 24q14 16 14 67v257q0 42 -11 57q-16 22 -56 23v18h216v-18q-39 -2 -53.5 -20t-14.5 -65v-106h37l144 209h120v-18zM169 222v-183q28 -7 48 -7q48 0 75.5 24.5t27.5 65.5 q0 56 -55 84q-29 16 -79 16h-17z" />
+<glyph unicode="&#x282;" horiz-adv-x="389" d="M156 300l104 -63q50 -30 69 -56t19 -67q0 -50 -41.5 -87.5t-98.5 -37.5q-47 0 -73 9q-27 9 -46 9h-6q-2 -64 -2 -96q0 -95 38 -95q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41t-65.5 -15q-64 0 -84.5 28t-20.5 88q0 14 1 46.5t1 51.5v156h16 q16 -73 46 -107t81 -34q37 0 60 21t23 53q0 46 -53 75l-54 30q-120 67 -120 145q0 58 37.5 90.5t100.5 32.5q44 0 67 -11q18 -8 28 -8q7 0 16 10h11l5 -136h-15q-17 68 -42.5 95.5t-70.5 27.5q-34 0 -54.5 -17t-20.5 -51q0 -17 11.5 -36.5t31.5 -31.5z" />
+<glyph unicode="&#x283;" horiz-adv-x="322" d="M111 -109v574q0 218 168 218q38 0 65.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-42 30t-27.5 -10.5t-14.5 -31t-5 -34.5t-1 -36v-582q0 -83 -43.5 -135.5t-128.5 -52.5q-38 0 -65.5 15t-27.5 41q0 16 12.5 27t27.5 11q22 0 47 -30t42 -30q52 0 52 90z" />
+<glyph unicode="&#x284;" horiz-adv-x="304" d="M109 31v400q0 41 3 73t13.5 67.5t28.5 58.5t49.5 38t75.5 15q34 0 63.5 -13.5t29.5 -42.5q0 -15 -12 -26.5t-27 -11.5q-22 0 -46.5 30t-43.5 30q-50 0 -50 -120v-498h77v-31h-77q0 -62 -14.5 -108.5t-54 -78t-101.5 -31.5q-38 0 -65.5 14.5t-27.5 40.5q0 15 11 27t29 12 q22 0 47 -30t42 -30q12 0 20.5 4t14 13.5t9 18.5t4.5 27.5t1.5 32.5t0.5 40v48h-77v31h77z" />
+<glyph unicode="&#x285;" horiz-adv-x="400" d="M278 252v-312q0 -39 1 -57.5t5.5 -41.5t15 -31.5t28.5 -8.5q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41t-65.5 -15q-90 0 -130 60t-40 158v312q0 39 -1 57.5t-5.5 41.5t-15 31.5t-28.5 8.5q-17 0 -42 -30t-47 -30q-15 0 -27.5 11t-12.5 27q0 26 27.5 41 t65.5 15q90 0 130 -60t40 -158z" />
+<glyph unicode="&#x286;" horiz-adv-x="437" d="M161 11v459q0 213 168 213q33 0 63 -13.5t30 -42.5q0 -15 -12 -26.5t-27 -11.5q-24 0 -48.5 30t-41.5 30q-48 0 -48 -105v-572q46 -34 70.5 -86.5t24.5 -110.5q0 -6 -2 -18h-26v14q0 106 -67 169q-15 -173 -143 -173q-51 0 -88 37.5t-37 88.5t37 88t89 37q37 0 58 -7z M161 -114v98q-24 9 -59 9q-40 0 -70 -29.5t-30 -70.5q0 -40 30 -70.5t70 -30.5q59 0 59 94z" />
+<glyph unicode="&#x287;" horiz-adv-x="278" d="M225 32h53q4 -3 4 -7q0 -8 -17 -19q-38 -22 -97 -107q-2 -3 -9.5 -12.5t-10.5 -15.5q-7 0 -7 13v116h-101v32h101v286q0 48 -12 69t-40 21q-30 0 -60 -35l-13 11q48 76 121 76q88 0 88 -127v-301z" />
+<glyph unicode="&#x288;" horiz-adv-x="270" d="M154 418v-560q0 -57 15 -57q13 0 21.5 9.5t13 21t14.5 21t24 9.5q16 0 28.5 -11t12.5 -28q0 -26 -28 -41t-66 -15t-62.5 10.5t-36.5 32.5t-16 46.5t-4 60.5v501h-53q-4 2 -4 7q0 6 6 11l17 12q12 8 21 17q40 41 90 114q7 0 7 -13v-116h101v-32h-101z" />
+<glyph unicode="&#x289;" horiz-adv-x="500" d="M480 49v-13q-78 -21 -137 -45l-5 3v82h-2q-63 -86 -143 -86q-57 0 -89.5 35t-32.5 93v112h-62v31h62v108q0 37 -13 51t-49 16v14h146v-189h178v107q0 39 -14 50.5t-60 14.5v17h158v-189h62v-31h-62v-123q0 -35 11.5 -46.5t45.5 -11.5h6zM333 137v93h-178v-103 q0 -34 20.5 -56.5t50.5 -22.5q49 0 84 31q13 12 18 22.5t5 35.5z" />
+<glyph unicode="&#x28a;" horiz-adv-x="537" d="M490 430h-38q-16 0 -28.5 -11.5t-12.5 -25.5q0 -20 10 -30q8 -7 21.5 -24.5t29.5 -54t16 -71.5q0 -93 -64 -158t-156 -65q-91 0 -155.5 65t-64.5 154q0 37 17 75.5t29 54t21 24.5q10 10 10 28q0 17 -12.5 28t-28.5 11h-38v20h140q-50 -141 -50 -246q0 -32 7 -75 q8 -51 42 -85t83 -34t83 34t42 85q7 43 7 76q0 106 -50 245h140v-20z" />
+<glyph unicode="&#x28b;" horiz-adv-x="500" d="M193 457v-331q0 -36 26 -65.5t61 -29.5q71 0 118.5 64.5t47.5 137.5q0 51 -16 86.5t-35 49t-35 28.5t-16 30q0 14 14.5 23.5t28.5 9.5q28 0 47 -23t27.5 -59.5t11.5 -65.5t3 -57q0 -69 -21 -127t-70.5 -98t-121.5 -40q-75 0 -114.5 32t-39.5 106v206q0 19 -1 29 t-9.5 20.5t-24.5 10.5q-14 0 -42 -4v16q80 24 156 54z" />
+<glyph unicode="&#x28c;" horiz-adv-x="500" d="M454 0h-196v15q26 2 36 8t10 19q0 16 -9 38l-102 256l-99 -259q-6 -15 -6 -30q0 -28 47 -32v-15h-139v15q23 2 34 15t31 63l128 321q20 50 28 50q7 0 18 -26l128 -308q32 -76 47 -94.5t44 -20.5v-15z" />
+<glyph unicode="&#x28d;" horiz-adv-x="722" d="M694 0h-180v15q26 3 36 10t10 23q0 15 -6 30l-99 261l-91 -199l20 -56q14 -40 27.5 -53t41.5 -16v-15h-203v15q35 5 46.5 12t11.5 23t-17 60l-84 224l-90 -222q-17 -42 -17 -67q0 -12 9.5 -18.5t34.5 -11.5v-15h-123v15q15 5 22 14.5t19 39.5l138 346q20 49 28 49 q5 0 8.5 -6.5t15.5 -36.5l91 -236l112 240q18 39 25 39q9 0 26 -44l135 -342q15 -39 25 -50t28 -13v-15z" />
+<glyph unicode="&#x28e;" horiz-adv-x="444" d="M459 0h-205v15q32 1 44.5 7t12.5 20q0 11 -13 41l-112 250l-97 -276q-4 -9 -4 -18q0 -24 46 -24v-15h-133v15q18 2 29 13t21 38l150 409q39 106 78.5 149.5t96.5 43.5q32 0 51 -16.5t19 -41.5q0 -19 -12.5 -32.5t-30.5 -13.5q-29 0 -52 13q-13 7 -26 7q-21 0 -50 -44 q-14 -20 -27 -57t-13 -51q0 -13 42 -101l132 -282q13 -29 53 -35v-14z" />
+<glyph unicode="&#x28f;" horiz-adv-x="587" d="M564 464v-18q-36 -3 -53 -16.5t-55 -62.5l-119 -155v-106q0 -21 1.5 -33t8 -26.5t21 -21.5t37.5 -7v-18h-216v18q23 0 38 6.5t20.5 20.5t7 24t1.5 27v110l-104 133q-54 69 -76.5 87t-52.5 20v18h210v-18l-21 -1q-19 -1 -23.5 -4.5t-4.5 -13.5q0 -9 19 -32l115 -151 l116 151q12 17 12 34q0 9 -6.5 12.5t-33.5 4.5v18h158z" />
+<glyph unicode="&#x290;" horiz-adv-x="528" d="M400 140l18 -4q-18 -220 -18 -250q0 -37 9 -53.5t31 -16.5q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41t-65.5 -15q-61 0 -82.5 35.5t-21.5 95.5q0 18 2 49.5t2 37.5h-349v15l266 405h-142q-20 0 -34 -5t-21.5 -10.5t-12.5 -19.5t-7 -23t-5 -30h-18l4 118 h346v-15l-269 -405h133q82 0 106 27q14 15 27 83z" />
+<glyph unicode="&#x291;" horiz-adv-x="507" d="M134 30h114q78 120 129 127q18 2 25 2q39 0 62 -20t23 -54q0 -39 -30 -62t-90 -23h-99q-43 -73 -78 -150h-36q32 74 76 150h-203v15l266 405h-141q-25 0 -40 -4.5t-23 -19.5t-10.5 -25.5t-7.5 -38.5h-18l4 118h346v-15zM286 30h82q86 0 86 56q0 47 -51 47q-13 0 -26 -3 q-33 -8 -91 -100z" />
+<glyph unicode="&#x292;" horiz-adv-x="413" d="M360 400l-164 -204q16 3 32 3q67 0 115.5 -53t48.5 -145q0 -112 -68 -173t-156 -61q-58 0 -104 31q-21 14 -32 34t-11 36q0 18 13 31t36 13q18 0 30.5 -15.5t16.5 -34.5q10 -42 22 -54t49 -12q17 0 36.5 7.5t41.5 25.5t36.5 55.5t14.5 89.5q0 82 -42 121.5t-110 39.5 q-10 0 -52 -19l-14 11l214 259h-199q-50 0 -64 -18.5t-20 -67.5h-18l24 150h324v-50z" />
+<glyph unicode="&#x293;" horiz-adv-x="431" d="M398 435l-178 -268q2 0 7 0.5t9 0.5q64 0 119 -46.5t55 -125.5q0 -84 -40 -138.5t-100 -75.5l46 -87h-37l-43 77q-21 -5 -77 -5q-147 0 -147 90q0 35 23 57t65 22t72.5 -27t79.5 -99q68 38 68 164q0 67 -43 114t-110 47q-14 0 -56 -19l-14 11l191 293h-138 q-50 0 -64 -19.5t-20 -68.5h-18l4 118h346v-15zM221 -202q-69 104 -104 104q-17 0 -26 -12.5t-9 -31.5q0 -32 29.5 -47t63.5 -15q39 0 46 2z" />
+<glyph unicode="&#x294;" horiz-adv-x="450" d="M160 102v254q57 0 101 46t44 106q0 57 -24 107.5t-68 50.5q-24 0 -42.5 -19.5t-23.5 -44.5q-13 -64 -52 -64q-22 0 -35 13t-13 31q0 16 11 36t32 34q46 31 113 31q56 0 97 -17t61.5 -45t29.5 -56t9 -58q0 -78 -46 -118.5t-110 -52.5v-234q0 -56 15 -70.5t64 -16.5v-15 h-237v15q50 3 62 19t12 68z" />
+<glyph unicode="&#x295;" horiz-adv-x="450" d="M204 102v234q-64 12 -110 52.5t-46 118.5q0 30 9 58t29.5 56t61.5 45t97 17q67 0 113 -31q21 -14 32 -34t11 -36q0 -18 -13 -31t-35 -13q-39 0 -52 64q-5 25 -23.5 44.5t-42.5 19.5q-44 0 -68 -50.5t-24 -107.5q0 -60 44 -106t101 -46v-254q0 -52 12 -68t62 -19v-15h-237 v15q49 2 64 16.5t15 70.5z" />
+<glyph unicode="&#x296;" horiz-adv-x="450" d="M244 560v-227q64 -12 110 -52.5t46 -118.5q0 -30 -9 -58t-29.5 -56t-61.5 -45t-97 -17q-67 0 -113 31q-21 14 -32 34t-11 36q0 18 13 31t35 13q39 0 52 -64q5 -25 23.5 -44.5t42.5 -19.5q44 0 68 50.5t24 107.5q0 60 -44 106t-101 46v247q0 52 -12 68t-62 19v15h237v-15 q-49 -2 -64 -16.5t-15 -70.5z" />
+<glyph unicode="&#x297;" horiz-adv-x="450" d="M410 -39v-38q0 -61 -51.5 -107t-113.5 -46q-63 0 -114 46t-51 108v378q0 70 55.5 114t127.5 44q53 0 90 -32.5t37 -84.5q0 -21 -10.5 -41t-29.5 -20q-11 0 -20 8.5t-9 19.5q0 10 7 25.5t7 24.5q0 27 -19 46t-46 19q-38 0 -72 -28.5t-34 -66.5v-398q0 -46 32.5 -81 t78.5 -35q53 0 82.5 34.5t29.5 86.5q0 8 -2 24h25z" />
+<glyph unicode="&#x298;" horiz-adv-x="723" d="M421 331q0 -26 -18 -44.5t-44 -18.5t-45 18.5t-19 44.5t18.5 44.5t45.5 18.5q26 0 44 -18.5t18 -44.5zM690 330q0 -148 -89.5 -247.5t-237.5 -99.5q-139 0 -234.5 96.5t-95.5 251.5t93 251.5t239 96.5t235.5 -99t89.5 -250zM597 333q0 137 -65 227.5t-173 90.5 q-101 0 -167 -85t-66 -233q0 -138 62 -227.5t174 -89.5q96 0 165.5 92.5t69.5 224.5z" />
+<glyph unicode="&#x299;" horiz-adv-x="460" d="M309 245v-1q135 -24 135 -119q0 -58 -51 -91.5t-138 -33.5h-240v18q44 0 60 16.5t16 54.5v281q0 36 -16 53.5t-60 22.5v18h203q198 0 198 -117q0 -47 -27 -69.5t-80 -32.5zM172 260h53q60 0 86 20t26 64q0 88 -131 88h-16q-18 0 -18 -22v-150zM172 226v-162 q0 -19 10.5 -25.5t38.5 -6.5q133 0 133 93q0 27 -9 46t-22.5 29.5t-36 16.5t-43 7.5t-50.5 1.5h-21z" />
+<glyph unicode="&#x29a;" horiz-adv-x="479" d="M163 249v2q-116 24 -116 107q0 59 50 88t114 29q103 0 161 -67.5t58 -173.5q0 -114 -55 -181t-165 -67q-72 0 -131 35t-59 102q0 104 143 126zM245 263v-30q-55 0 -93 -25.5t-38 -78.5q0 -47 34.5 -77t81.5 -30q44 0 76 38.5t45.5 85.5t13.5 89q0 44 -13.5 89t-47 81.5 t-79.5 36.5q-38 0 -64 -26t-26 -64q0 -44 32 -66t78 -23z" />
+<glyph unicode="&#x29b;" horiz-adv-x="600" d="M485 171v-133q0 -15 -77.5 -32t-105.5 -17q-122 0 -197.5 59.5t-75.5 176.5q0 100 78 162.5t180 62.5q22 0 43.5 -3t54.5 -10.5t43 -9.5q2 43 28 69.5t68 26.5q23 0 41 -13t18 -34q0 -23 -21 -23q-18 0 -28.5 24.5t-27.5 24.5q-33 0 -33 -68q0 -21 5 -126h-17 q-46 115 -165 115q-88 0 -135 -60t-47 -150t53 -143.5t143 -53.5q30 0 66 9t36 30v109q0 38 -12 46.5t-55 11.5v13h193v-13q-32 -2 -42.5 -11.5t-10.5 -39.5z" />
+<glyph unicode="&#x29c;" horiz-adv-x="572" d="M560 0h-216v18q45 2 56 16t11 60v126h-242v-126q0 -41 12.5 -57.5t54.5 -18.5v-18h-215v18q45 3 56 17t11 62v282q0 41 -11.5 52.5t-55.5 14.5v18h215v-18q-43 -3 -55 -14.5t-12 -52.5v-126h242v126q0 42 -11 52.5t-56 14.5v18h216v-18q-44 -3 -56 -15t-12 -52v-289 q0 -40 13.5 -55.5t54.5 -16.5v-18z" />
+<glyph unicode="&#x29d;" horiz-adv-x="387" d="M284 632q0 -22 -15 -36.5t-37 -14.5q-20 0 -35 15.5t-15 35.5t15 35.5t35 15.5q21 0 36.5 -15t15.5 -36zM412 -233h-40q-13 18 -29 36l-38 42l-31 34q-46 -112 -167 -112q-51 0 -90.5 33.5t-39.5 84.5q0 48 39 81.5t87 33.5q27 0 96 -20v359q0 55 -35 55q-14 0 -42 -4v16 q80 24 156 54l5 -3v-537q69 -66 129 -153zM199 -94v38q-42 21 -92 21q-36 0 -65.5 -20.5t-29.5 -54.5q0 -40 32 -64t74 -24q81 0 81 104z" />
+<glyph unicode="&#x29e;" horiz-adv-x="519" d="M499 -189l-30 -8q-60 -16 -125 -36l-4 2v420l-137 -122q-23 -21 -23 -35q0 -10 10.5 -13.5t39.5 -4.5v-14h-204v15q50 0 88.5 21.5t127.5 104.5l29 27l-153 194q-54 69 -117 73v15h218v-15h-19q-21 0 -21 -15q0 -9 11 -23l150 -198v184q0 26 -12.5 38t-42.5 13l-20 1v15 h234v-15q-54 -9 -64.5 -18.5t-10.5 -48.5v-482q0 -36 9 -48.5t34 -12.5q6 0 32 2v-16z" />
+<glyph unicode="&#x29f;" horiz-adv-x="470" d="M441 127l-35 -127h-385v18q38 1 49 14.5t11 50.5v294q0 41 -9.5 53.5t-50.5 15.5v18h193v-18q-41 -2 -50.5 -16.5t-9.5 -53.5v-312q0 -20 12.5 -26t52.5 -6h50q89 0 123 43q14 19 30 52h19z" />
+<glyph unicode="&#x2a0;" horiz-adv-x="600" d="M362 426l3 37q4 55 34 87t72 32q53 0 85 -18q34 -19 34 -53q0 -13 -8.5 -23t-25.5 -10q-30 0 -45 28q-17 33 -40 33q-46 0 -46 -87v-593q0 -32 12 -43.5t51 -15.5v-17h-236v17q53 4 71 19t18 57v188q-68 -74 -157 -74q-70 0 -115 60t-45 155q0 108 63.5 181.5t156.5 73.5 q55 0 118 -34zM341 127v206q0 98 -93 98q-64 0 -101 -51t-37 -139q0 -52 15.5 -96.5t40.5 -66.5q30 -27 75 -27q53 0 88 32q12 11 12 44z" />
+<glyph unicode="&#x2a1;" horiz-adv-x="450" d="M161 193v161q58 0 101.5 46.5t43.5 105.5q0 30 -8 64.5t-30 64t-53 29.5q-23 0 -38 -13t-22 -32t-13 -38t-17.5 -32t-30.5 -13t-32.5 12.5t-13.5 31.5q0 45 50 74t99 29q90 0 147 -44.5t57 -131.5q0 -72 -42 -116t-115 -57v-141h78v-31h-78v-69q0 -40 15 -58t65 -20v-15 h-237v15q50 3 62 19t12 68v60h-77v31h77z" />
+<glyph unicode="&#x2a2;" horiz-adv-x="450" d="M205 193v141q-73 13 -115 57t-42 116q0 87 57 131.5t147 44.5q49 0 99 -29t50 -74q0 -19 -13.5 -31.5t-32.5 -12.5t-30.5 13t-17.5 32t-13 38t-22 32t-38 13q-31 0 -53 -29.5t-30 -64t-8 -64.5q0 -59 43.5 -105.5t101.5 -46.5v-161h77v-31h-77v-60q0 -52 12 -68t62 -19 v-15h-237v15q50 2 65 20t15 58v69h-78v31h78z" />
+<glyph unicode="&#x2a3;" horiz-adv-x="802" d="M775 126l-15 -136h-416l-4 3v64q-48 -67 -128 -67q-83 0 -134 59.5t-51 155.5q0 106 61 180.5t147 74.5q54 0 105 -43v156q0 31 -9 41t-37 10q-14 0 -22 -1v16q91 24 147 44l5 -2v-241h336v-15l-269 -405h133q84 0 106 27q14 17 27 83zM650 410h-135q-47 0 -63.5 -16.5 t-23.5 -71.5h-4v-208q0 -30 5 -41zM340 102v230q0 40 -30.5 70t-71.5 30q-57 0 -91 -51t-34 -136q0 -92 37.5 -147.5t100.5 -55.5q47 0 74 32q15 17 15 28z" />
+<glyph unicode="&#x2a4;" horiz-adv-x="743" d="M690 400l-164 -204q16 3 32 3q68 0 116 -55t48 -148q0 -59 -21 -105t-55 -72t-71.5 -39t-76.5 -13q-58 0 -104 31q-21 14 -32 34t-11 36q0 18 12.5 31t33.5 13q41 0 55 -67q5 -26 17.5 -37.5t48.5 -11.5q17 0 36.5 7.5t41.5 25.5t36.5 55.5t14.5 89.5q0 82 -42 121.5 t-110 39.5q-16 0 -42 -23q-12 -11 -25 -26l-22 -26l-25 -33l-27 -35l-14 1v64q-14 -19 -25 -30.5t-40 -24t-66 -12.5q-26 0 -54 9.5t-58.5 31.5t-50 68t-19.5 109q0 104 61 178t146 74q57 0 106 -43v156q0 19 -1.5 27.5t-11.5 16t-31 7.5q-16 0 -24 -1v16q86 22 147 44l5 -2 v-231h266v-50zM643 386h-219v-261zM340 104v224q0 47 -32 75.5t-71 28.5q-49 0 -86.5 -45.5t-37.5 -139.5q0 -104 41 -154.5t101 -50.5q31 0 58 21t27 41z" />
+<glyph unicode="&#x2a5;" horiz-adv-x="864" d="M491 20h114q78 120 129 127q18 2 25 2q39 0 62 -20t23 -54q0 -39 -30 -62t-90 -23h-99q-43 -73 -78 -150h-36q32 74 76 150h-243l-4 3v64q-48 -67 -128 -67q-83 0 -134 59.5t-51 155.5q0 106 61 180.5t147 74.5q54 0 105 -43v156q0 31 -9 41t-37 10q-14 0 -22 -1v16 q91 24 147 44l5 -2v-241h336v-15zM643 20h82q86 0 86 56q0 47 -51 47q-12 0 -26 -3q-33 -8 -91 -100zM650 410h-141q-25 0 -40 -4.5t-23 -19.5t-10.5 -25.5t-7.5 -38.5h-4v-208q0 -30 5 -41zM340 102v230q0 40 -30.5 70t-71.5 30q-57 0 -91 -51t-34 -136q0 -92 37.5 -147.5 t100.5 -55.5q47 0 74 32q15 17 15 28z" />
+<glyph unicode="&#x2a6;" horiz-adv-x="536" d="M303 302l104 -63q50 -30 69 -56t19 -67q0 -50 -41.5 -88t-98.5 -38q-44 0 -73 10q-27 9 -46 9q-6 0 -9 1q-31 -20 -69 -20q-88 0 -88 127v301h-53q-4 3 -4 7q0 8 17 19q38 22 97 107q14 21 20 28q7 0 7 -13v-116h120q30 10 62 10q44 0 67 -11q18 -8 28 -8q7 0 16 10h11 l5 -136h-15q-17 68 -42.5 95.5t-70.5 27.5q-34 0 -54.5 -17t-20.5 -51q0 -17 11.5 -36.5t31.5 -31.5zM266 77l13 -11l-16 -23q32 -31 79 -31q37 0 60 21.5t23 53.5q0 46 -53 75l-54 30q-120 67 -120 145q0 50 28 81h-72v-286q0 -48 12 -69t40 -21q30 0 60 35z" />
+<glyph unicode="&#x2a7;" horiz-adv-x="483" d="M154 450h125q0 82 16 129q36 104 152 104q38 0 65.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-42 30q-48 0 -48 -102v-593q0 -82 -44 -134.5t-128 -52.5q-38 0 -65.5 15t-27.5 41q0 16 12.5 27t27.5 11q22 0 47 -30t42 -30q52 0 52 90v143 q-71 -44 -117 -44q-92 0 -92 126v302h-53q-4 2 -4 6q0 7 6 12t18 13t20 16q8 7 14.5 14l14.5 16l11 14l13 17l10 16l14 18l13 19q7 0 7 -13v-116zM279 63v355h-125v-287q0 -89 51 -89q39 0 74 21z" />
+<glyph unicode="&#x2a8;" horiz-adv-x="650" d="M154 418v-286q0 -48 12 -69t40 -21q41 0 93 24q-49 63 -49 153q0 115 67.5 181t153.5 66q64 0 107 -31q45 -33 45 -70q0 -18 -12.5 -31t-34.5 -13q-36 0 -48 46q-6 24 -9 33.5t-10.5 20t-19 13.5t-31.5 3q-18 0 -38 -7.5t-42 -25.5t-36.5 -55.5t-14.5 -89.5 q0 -76 56 -146q52 33 84 45t74 12q40 0 70 -24.5t30 -64.5q0 -42 -32 -66.5t-91 -24.5q-88 0 -130 15q-33 12 -68 39q-50 -30 -85.5 -42t-76.5 -12q-88 0 -88 127v301h-53q-4 3 -4 7q0 8 17 19q38 22 97 107q2 3 9.5 12.5t10.5 15.5q7 0 7 -13v-116h101v-32h-101zM609 82 q0 27 -21.5 44.5t-47.5 17.5q-34 0 -58 -10t-79 -44q64 -64 119 -64q51 0 69 15.5t18 40.5z" />
+<glyph unicode="&#x2ae;" horiz-adv-x="619" d="M612 450v-14q-43 -6 -53.5 -20t-10.5 -67v-471q0 -32 9.5 -41.5t41.5 -9.5q9 0 12 1v-16l-27 -8q-77 -23 -115 -36l-5 3v304q-34 -45 -68.5 -64.5t-78.5 -19.5q-123 0 -123 159v182q0 52 -10.5 78t-39.5 26q-17 0 -42 -30t-47 -30q-15 0 -27.5 11t-12.5 27 q0 26 27.5 40.5t65.5 14.5q90 0 130 -60t40 -157v-101q0 -106 74 -106q30 0 55 14t57 49v241q0 52 -12 67t-56 20v14h216z" />
+<glyph unicode="&#x2af;" horiz-adv-x="679" d="M548 349v-458q0 -90 52 -90q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41t-65.5 -15q-85 0 -128.5 52.5t-43.5 135.5v120q-34 -45 -68.5 -64.5t-78.5 -19.5q-123 0 -123 159v182q0 52 -10.5 78t-39.5 26q-17 0 -42 -30t-47 -30q-15 0 -27.5 11t-12.5 27 q0 26 27.5 40.5t65.5 14.5q90 0 130 -60t40 -157v-101q0 -106 74 -106q30 0 55 14t57 49v241q0 52 -12 67t-56 20v14h216v-14q-43 -6 -53.5 -20t-10.5 -67z" />
+<glyph unicode="&#x2b0;" horiz-adv-x="378" d="M365 336h-159v11q33 4 42.5 15t9.5 47v153q0 79 -57 79q-40 0 -83 -48v-181q0 -38 9.5 -50t41.5 -15v-11h-162v11q32 4 40 14.5t8 48.5v356q0 24 -6.5 31t-31.5 7q-6 0 -9 -1v12l106 33l4 -2v-228q47 62 108 62q95 0 95 -115v-149q0 -41 7 -52.5t37 -16.5v-11z" />
+<glyph unicode="&#x2b1;" horiz-adv-x="378" d="M365 336h-159v11q31 4 41.5 14t10.5 45v155q0 80 -58 80q-41 0 -82 -48v-185q0 -37 10 -47.5t41 -13.5v-11h-162v11q32 5 40 14.5t8 48.5v299q0 58 39.5 98.5t98.5 40.5q53 0 90.5 -15.5t37.5 -39.5q0 -11 -8 -19t-20 -8q-5 0 -9 1.5t-7 2.5t-7 5t-6 7l-7 8q-5 6 -8 9 q-24 30 -53 30q-31 0 -57 -32q-21 -24 -21 -59v-120q47 62 109 62q94 0 94 -119v-149q0 -39 7.5 -49.5t36.5 -15.5v-11z" />
+<glyph unicode="&#x2b2;" horiz-adv-x="300" d="M244 813q0 -16 -11 -27t-28 -11q-16 0 -27 11t-11 27t11 27.5t27 11.5q17 0 28 -11t11 -28zM243 681v-347q0 -80 -32.5 -122.5t-95.5 -42.5q-31 0 -51 11.5t-20 30.5q0 12 9 20.5t22 8.5q17 0 37 -24q16 -21 31 -21q19 0 26 13q11 21 11 92v288q0 45 -25 45q-6 0 -30 -2 l-4 -1v12q59 18 119 41z" />
+<glyph unicode="&#x2b3;" horiz-adv-x="252" d="M121 680v-69q28 40 47 55t43 15q19 0 30 -10.5t11 -29.5q0 -33 -29 -33q-15 0 -30 15q-14 11 -20 11q-16 0 -34 -22t-18 -40v-168q0 -32 12.5 -43.5t50.5 -13.5v-11h-179v11q36 7 44.5 15.5t8.5 36.5v188q0 25 -6 35t-20 10q-10 0 -26 -3v12q54 17 111 40z" />
+<glyph unicode="&#x2b4;" horiz-adv-x="277" d="M257 680v-11q-36 -7 -44.5 -15.5t-8.5 -36.5v-188q0 -25 6 -35t20 -10q10 0 26 3v-12q-54 -17 -111 -40l-4 1v69q-28 -40 -47 -55t-43 -15q-19 0 -30 10.5t-11 29.5q0 33 29 33q15 0 30 -15q14 -11 20 -11q16 0 34 22t18 40v168q0 32 -12.5 43.5t-50.5 13.5v11h179z" />
+<glyph unicode="&#x2b5;" horiz-adv-x="325" d="M204 620v-199q0 -227 37 -227q13 0 31.5 22.5t35.5 22.5q11 0 20.5 -8t9.5 -21q0 -19 -21 -30.5t-49 -11.5q-45 0 -75.5 42.5t-41 93t-10.5 101.5q-28 -40 -47 -55t-43 -15q-41 0 -41 40q0 33 29 33q14 0 28.5 -13t21.5 -13q16 0 34 22t18 40v174q0 29 -15 39.5t-48 11.5 v11h179v-11q-34 -6 -43.5 -14.5t-9.5 -34.5z" />
+<glyph unicode="&#x2b6;" horiz-adv-x="390" d="M379 667h-8q-27 0 -45 -25l-94 -130q100 -25 100 -88q0 -39 -39 -64t-102 -25h-185v13q32 3 44 18q12 12 12 49v193q0 30 -9 42q-13 16 -47 17v13h180v-13q-32 -2 -44.5 -15t-12.5 -47v-84h31l120 159h99v-13zM129 497v-134q28 -5 40 -5q40 0 63 18t23 48q0 40 -46 62 q-22 11 -65 11h-15z" />
+<glyph unicode="&#x2b7;" horiz-adv-x="520" d="M512 680v-11q-11 -4 -16.5 -11t-14.5 -29l-104 -261q-15 -37 -21 -37q-5 0 -18 33l-68 177l-85 -180q-13 -30 -18 -30q-7 0 -20 34l-101 257q-12 29 -19.5 37.5t-20.5 9.5v11h135v-11q-19 -2 -26.5 -7.5t-7.5 -17.5q0 -13 4 -22l74 -197l69 150l-15 42q-11 30 -21 40 t-31 12v11h153v-11q-27 -4 -35.5 -9t-8.5 -17t13 -45l63 -169l68 167q12 32 12 51q0 16 -33 22v11h93z" />
+<glyph unicode="&#x2b8;" horiz-adv-x="370" d="M361 680v-12q-14 -2 -22.5 -9.5t-15.5 -28.5l-113 -309q-29 -80 -59 -112.5t-73 -32.5q-24 0 -38 12t-14 31q0 14 9.5 24.5t22.5 10.5q23 0 39 -10q10 -5 20 -5q15 0 37 33q10 15 20 43.5t10 38.5t-31 76l-100 213q-10 22 -39 25v12h154v-12q-43 -1 -43 -20q0 -11 10 -31 l84 -189l73 209q3 7 3 13q0 18 -35 18v12h101z" />
+<glyph unicode="&#x2b9;" horiz-adv-x="208" d="M90 432l93 212q10 23 19.5 31.5t25.5 8.5q29 0 29 -32q0 -14 -19 -41l-131 -190z" />
+<glyph unicode="&#x2ba;" horiz-adv-x="305" d="M19 432l93 212q10 23 19.5 31.5t25.5 8.5q29 0 29 -32q0 -14 -19 -41l-131 -190zM157 432l93 212q10 23 19.5 31.5t25.5 8.5q29 0 29 -32q0 -14 -19 -41l-131 -190z" />
+<glyph unicode="&#x2bb;" horiz-adv-x="333" d="M191 686l9 -19q-44 -28 -63 -57.5t-19 -48.5q0 -14 14 -14q2 0 10 2t14 2q24 0 43 -11.5t19 -38.5q0 -29 -18 -43.5t-40 -14.5q-11 0 -23 3.5t-26 13t-23 30t-9 49.5q0 47 41 92t71 55z" />
+<glyph unicode="&#x2bc;" horiz-adv-x="333" d="M106 443l-9 19q44 28 63 57.5t19 48.5q0 14 -14 14q-2 0 -10 -2t-14 -2q-24 0 -43 11.5t-19 38.5q0 29 18 43.5t40 14.5q11 0 23 -3.5t26 -13t23 -30t9 -49.5q0 -47 -41 -92t-71 -55z" />
+<glyph unicode="&#x2bd;" horiz-adv-x="333" d="M200 462l-9 -19q-30 10 -71 55t-41 92q0 29 9 49.5t23 30t26 13t23 3.5q22 0 40 -14.5t18 -43.5q0 -27 -19 -38.5t-43 -11.5q-6 0 -14 2t-10 2q-14 0 -14 -14q0 -19 19 -48.5t63 -57.5z" />
+<glyph unicode="&#x2be;" horiz-adv-x="198" d="M35 680h30q41 0 69.5 -28.5t28.5 -68.5q0 -41 -28.5 -69.5t-69.5 -28.5h-30v37h30q25 0 43 18t18 43t-17.5 42.5t-43.5 17.5h-30v37z" />
+<glyph unicode="&#x2bf;" horiz-adv-x="198" d="M163 485h-30q-41 0 -69.5 28.5t-28.5 69.5q0 40 28.5 68.5t69.5 28.5h30v-37h-30q-26 0 -43.5 -17.5t-17.5 -42.5t18 -43t43 -18h30v-37z" />
+<glyph unicode="&#x2c0;" horiz-adv-x="326" d="M93 446h12q54 0 88.5 30t34.5 75q0 46 -19.5 86t-55.5 40q-17 0 -32 -16t-19 -34q-11 -52 -41 -52q-17 0 -27.5 10.5t-10.5 24.5q0 32 34 55q37 25 90 25q156 0 156 -151q0 -69 -44 -116t-105 -47q-13 0 -18 1l-6 -82h-37v151z" />
+<glyph unicode="&#x2c1;" horiz-adv-x="326" d="M196 295l-6 82q-5 -1 -18 -1q-61 0 -105 47t-44 116q0 151 156 151q53 0 90 -25q34 -23 34 -55q0 -14 -10.5 -24.5t-27.5 -10.5q-30 0 -41 52q-4 18 -19 34t-32 16q-36 0 -55.5 -40t-19.5 -86q0 -45 34.5 -75t88.5 -30h12v-151h-37z" />
+<glyph unicode="&#x2c2;" horiz-adv-x="317" d="M285 419l-252 153v30l252 153v-68l-163 -100l163 -100v-68z" />
+<glyph unicode="&#x2c3;" horiz-adv-x="317" d="M285 572l-252 -153v68l163 100l-163 100v68l252 -153v-30z" />
+<glyph unicode="&#x2c4;" horiz-adv-x="317" d="M327 461h-68l-100 163l-100 -163h-68l153 252h30z" />
+<glyph unicode="&#x2c5;" horiz-adv-x="317" d="M327 713l-153 -252h-30l-153 252h68l100 -163l100 163h68z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="333" d="M322 507h-34l-122 103l-121 -103h-34l124 167h62z" />
+<glyph unicode="&#x2c7;" horiz-adv-x="333" d="M322 674l-124 -167h-64l-123 167h35l120 -103l121 103h35z" />
+<glyph unicode="&#x2c8;" horiz-adv-x="278" d="M159 448h-40v265h40v-265z" />
+<glyph unicode="&#x2c9;" horiz-adv-x="334" d="M322 547h-311v54h311v-54z" />
+<glyph unicode="&#x2ca;" horiz-adv-x="333" d="M93 509l136 136q34 34 59 34q32 0 32 -36q0 -17 -35 -39l-152 -95h-40z" />
+<glyph unicode="&#x2cb;" horiz-adv-x="333" d="M249 509h-40l-152 95q-35 22 -35 39q0 36 32 36q25 0 59 -34z" />
+<glyph unicode="&#x2cc;" horiz-adv-x="278" d="M159 -195h-40v265h40v-265z" />
+<glyph unicode="&#x2cd;" horiz-adv-x="334" d="M323 -159h-312v55h312v-55z" />
+<glyph unicode="&#x2ce;" horiz-adv-x="333" d="M249 -192h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23z" />
+<glyph unicode="&#x2cf;" horiz-adv-x="333" d="M84 -192l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40z" />
+<glyph unicode="&#x2d0;" horiz-adv-x="333" d="M244 460l-55 -161h-45l-55 161h155zM244 19h-155l55 161h45z" />
+<glyph unicode="&#x2d1;" horiz-adv-x="333" d="M244 460l-55 -161h-45l-55 161h155z" />
+<glyph unicode="&#x2d2;" horiz-adv-x="333" d="M72 365h45q60 0 102.5 -42.5t42.5 -102.5t-42.5 -102.5t-102.5 -42.5h-45v55h45q37 0 63.5 26t26.5 64t-26.5 64t-63.5 26h-45v55z" />
+<glyph unicode="&#x2d3;" horiz-adv-x="333" d="M261 75h-45q-60 0 -102.5 42.5t-42.5 102.5t42.5 102.5t102.5 42.5h45v-55h-45q-38 0 -64 -26t-26 -64t26 -64t64 -26h45v-55z" />
+<glyph unicode="&#x2d4;" horiz-adv-x="333" d="M281 18h-230v40h95v147h40v-147h95v-40z" />
+<glyph unicode="&#x2d5;" horiz-adv-x="333" d="M281 165h-95v-147h-40v147h-95v40h230v-40z" />
+<glyph unicode="&#x2d6;" horiz-adv-x="333" d="M263 100h-77v-74h-38v74h-77v44h77v74h38v-74h77v-44z" />
+<glyph unicode="&#x2d7;" horiz-adv-x="333" d="M263 100h-192v44h192v-44z" />
+<glyph unicode="&#x2d8;" horiz-adv-x="335" d="M279 664h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5z" />
+<glyph unicode="&#x2d9;" horiz-adv-x="333" d="M217 572q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36z" />
+<glyph unicode="&#x2da;" horiz-adv-x="333" d="M266 611q0 -41 -29.5 -70t-71.5 -29q-41 0 -69.5 29t-28.5 71q0 41 29.5 70t71.5 29q40 0 69 -29.5t29 -70.5zM232 612q0 27 -19.5 46t-47.5 19q-26 0 -45 -19.5t-19 -45.5q0 -28 19 -47t45 -19q28 0 47.5 19t19.5 47z" />
+<glyph unicode="&#x2db;" horiz-adv-x="333" d="M229 -73l20 -16q-28 -41 -52.5 -58.5t-58.5 -17.5q-33 0 -53.5 19.5t-20.5 54.5q0 53 54 91h46q-44 -35 -44 -70q0 -39 38 -39q32 0 71 36z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="333" d="M302 638h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37 75t64 26q34 0 70 -18l24 -12q28 -15 53 -15q17 0 28.5 11t24.5 39z" />
+<glyph unicode="&#x2dd;" horiz-adv-x="333" d="M153 507l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40zM-3 507l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40z" />
+<glyph unicode="&#x2de;" horiz-adv-x="298" d="M243 322l20 -56q-10 -34 -24 -52q-22 -28 -60 -28q-27 0 -56 49q-28 48 -52 100q-4 -7 -10 -13.5t-12.5 -11t-14.5 -9l-13 -7.5l-11 -5q-6 -3 -7 -3l-3 48q2 1 9.5 6.5t13.5 9.5t14.5 12t16.5 18q17 22 27 63q1 -2 7.5 -22t12.5 -36t15.5 -39t20.5 -43.5t22 -35.5 q16 -21 30 -21q21 0 36 27q9 17 18 49z" />
+<glyph unicode="&#x2df;" horiz-adv-x="333" d="M284 628l-83 -85l81 -81l-34 -37l-83 83l-81 -83l-32 35l80 83l-84 85l36 34l81 -83l86 83z" />
+<glyph unicode="&#x2e0;" horiz-adv-x="378" d="M335 684v-10q-7 0 -13 -3.5t-9.5 -6t-7.5 -10.5l-5 -10q-2 -3 -5.5 -12.5t-3.5 -10.5l-76 -191q5 -11 17 -33t18.5 -36t12.5 -34.5t6 -38.5q0 -32 -19 -50.5t-51 -18.5q-71 0 -71 58q0 42 40 122l-65 157q-30 73 -42 93q-14 24 -37 25v10h133v-10q-31 0 -31 -21 q0 -10 14.5 -49t37 -93t23.5 -56q3 8 23 57.5t34 88t14 50.5q0 23 -31 23v10h94zM223 280q0 20 -42 93q-2 -6 -10.5 -26t-12.5 -34t-4 -28q0 -17 8 -30.5t24 -13.5t26.5 11t10.5 28z" />
+<glyph unicode="&#x2e1;" horiz-adv-x="215" d="M197 336h-176v11q35 3 46 15t11 43v352q0 27 -6.5 37.5t-24.5 10.5q-16 0 -28 -2v12q76 19 118 33l4 -3v-444q0 -31 10.5 -41.5t45.5 -12.5v-11z" />
+<glyph unicode="&#x2e2;" horiz-adv-x="291" d="M233 573h-11q-23 91 -80 91q-23 0 -39.5 -13t-16.5 -35q0 -32 45 -60q8 -5 39 -23t45 -29q46 -34 46 -74q0 -46 -34 -74q-29 -25 -80 -25q-23 0 -45 7q-20 7 -40 9q-12 -2 -15 -11h-11v115h12q18 -104 98 -104q26 0 43 15t17 40q0 24 -25 46q-16 12 -57 35t-60 41 q-28 28 -28 64q0 42 32 68q31 25 73 25q9 0 40 -9q27 -8 31 -8q9 0 12 11h9v-102z" />
+<glyph unicode="&#x2e3;" horiz-adv-x="380" d="M372 336h-160v12q19 1 25.5 4.5t6.5 14.5q0 6 -5 14l-72 98l-63 -84q-16 -26 -16 -33q0 -14 32 -14v-12h-115v12q19 1 28.5 8.5t28.5 31.5l91 118l-75 114q-19 29 -31 38.5t-30 9.5h-7v12h164v-12q-34 -1 -34 -17q0 -10 9 -24l39 -63l42 60q11 15 11 27q0 16 -32 17v12 h126v-12q-41 -2 -64 -35l-66 -95l101 -143q33 -47 66 -47v-12z" />
+<glyph unicode="&#x2e4;" horiz-adv-x="341" d="M166 415v166q-50 9 -85.5 40.5t-35.5 91.5q0 53 35 95t118 42q51 0 87 -24q34 -23 34 -54q0 -14 -10.5 -24.5t-27.5 -10.5q-30 0 -40 50q-4 19 -18.5 34.5t-32.5 15.5q-34 0 -53 -39.5t-19 -83.5q0 -46 34.5 -82t78.5 -36v-181q0 -40 9.5 -52.5t47.5 -14.5v-12h-184v12 q39 2 50.5 13t11.5 54z" />
+<glyph unicode="&#x2e5;" horiz-adv-x="413" d="M373 0h-50v612h-275v50h325v-662z" />
+<glyph unicode="&#x2e6;" horiz-adv-x="405" d="M365 0h-50v431h-275v50h275v181h50v-662z" />
+<glyph unicode="&#x2e7;" horiz-adv-x="405" d="M365 0h-50v306h-275v50h275v306h50v-662z" />
+<glyph unicode="&#x2e8;" horiz-adv-x="405" d="M365 0h-50v181h-275v50h275v431h50v-662z" />
+<glyph unicode="&#x2e9;" horiz-adv-x="405" d="M365 0h-325v50h275v612h50v-662z" />
+<glyph unicode="&#x2ec;" horiz-adv-x="333" d="M311 70l-132 -217h-26l-132 217h69l76 -120l76 120h69z" />
+<glyph unicode="&#x2ed;" horiz-adv-x="405" d="M395 611h-385v54h385v-54zM395 507h-385v54h385v-54z" />
+<glyph unicode="&#x300;" horiz-adv-x="0" d="M-147 507h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23z" />
+<glyph unicode="&#x301;" horiz-adv-x="0" d="M-371 507l145 148q22 23 43 23q36 0 36 -32q0 -24 -30 -43l-154 -96h-40z" />
+<glyph unicode="&#x302;" horiz-adv-x="0" d="M-75 507h-34l-122 103l-121 -103h-34l124 167h62z" />
+<glyph unicode="&#x303;" horiz-adv-x="0" d="M-94 638h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24q-46 22 -64 22q-35 0 -51 -46h-29q11 49 37 75t64 26q34 0 70 -18q55 -28 77 -28q17 0 28.5 11.5t24.5 39.5z" />
+<glyph unicode="&#x304;" horiz-adv-x="0" d="M-74 547h-311v54h311v-54z" />
+<glyph unicode="&#x305;" horiz-adv-x="0" d="M20 770h-500v50h500v-50z" />
+<glyph unicode="&#x306;" horiz-adv-x="0" d="M-121 664h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5z" />
+<glyph unicode="&#x307;" horiz-adv-x="0" d="M-181 572q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36z" />
+<glyph unicode="&#x308;" horiz-adv-x="0" d="M-81 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM-280 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#x309;" horiz-adv-x="0" d="M-261 581h12q33 0 54.5 20t21.5 50q0 31 -11.5 54t-33.5 23q-14 0 -22 -10t-10.5 -22t-9.5 -22t-19 -10t-20 8.5t-8 19.5q0 24 24 41q25 18 61 18q104 0 104 -108q0 -49 -29.5 -82.5t-70.5 -33.5h-8l-2 -35h-33v89z" />
+<glyph unicode="&#x30a;" horiz-adv-x="0" d="M-130 611q0 -41 -29.5 -70t-71.5 -29q-41 0 -69.5 29t-28.5 71q0 41 29.5 70t71.5 29q40 0 69 -29.5t29 -70.5zM-164 612q0 27 -19.5 46t-47.5 19q-26 0 -45 -19.5t-19 -45.5q0 -28 19 -47t45 -19q28 0 47.5 19t19.5 47z" />
+<glyph unicode="&#x30b;" horiz-adv-x="0" d="M-245 507l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40zM-401 507l146 148q23 23 43 23q34 0 34 -30q0 -27 -29 -45l-154 -96h-40z" />
+<glyph unicode="&#x30c;" horiz-adv-x="0" d="M-74 674l-124 -167h-64l-123 167h35l120 -103l121 103h35z" />
+<glyph unicode="&#x30d;" horiz-adv-x="0" d="M-195 500h-55v200h55v-200z" />
+<glyph unicode="&#x30e;" horiz-adv-x="0" d="M-133 500h-55v200h55v-200zM-272 500h-54v200h54v-200z" />
+<glyph unicode="&#x30f;" horiz-adv-x="0" d="M-22 507h-40l-154 96q-29 18 -29 45q0 30 34 30q20 0 43 -23zM-178 507h-40l-154 96q-29 18 -29 45q0 30 34 30q20 0 43 -23z" />
+<glyph unicode="&#x310;" horiz-adv-x="0" d="M-181 717q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36zM-121 664h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5z" />
+<glyph unicode="&#x311;" horiz-adv-x="0" d="M-92 507h-29q-22 54 -46.5 75.5t-64.5 21.5q-92 0 -112 -97h-29q0 74 35 115.5t104 41.5q124 0 142 -157z" />
+<glyph unicode="&#x312;" horiz-adv-x="0" d="M-187 745l9 -19q-44 -28 -63 -57.5t-19 -48.5q0 -14 14 -14q2 0 10 2t14 2q24 0 43 -11.5t19 -38.5q0 -29 -18 -43.5t-40 -14.5q-11 0 -23 3.5t-26 13t-23 30t-9 49.5q0 47 41 92t71 55z" />
+<glyph unicode="&#x313;" horiz-adv-x="0" d="M-272 502l-9 19q44 28 63 57.5t19 48.5q0 14 -14 14q-2 0 -10 -2t-14 -2q-24 0 -43 11.5t-19 38.5q0 29 18 43.5t40 14.5q11 0 23 -3.5t26 -13t23 -30t9 -49.5q0 -47 -41 -92t-71 -55z" />
+<glyph unicode="&#x314;" horiz-adv-x="0" d="M-178 521l-9 -19q-30 10 -71 55t-41 92q0 29 9 49.5t23 30t26 13t23 3.5q22 0 40 -14.5t18 -43.5q0 -27 -19 -38.5t-43 -11.5q-6 0 -14 2t-10 2q-14 0 -14 -14q0 -19 19 -48.5t63 -57.5z" />
+<glyph unicode="&#x315;" horiz-adv-x="0" d="M-58 502l-9 19q44 28 63 57.5t19 48.5q0 14 -14 14q-2 0 -10 -2t-14 -2q-24 0 -43 11.5t-19 38.5q0 29 18 43.5t40 14.5q11 0 23 -3.5t26 -13t23 -30t9 -49.5q0 -47 -41 -92t-71 -55z" />
+<glyph unicode="&#x316;" horiz-adv-x="0" d="M-127 -224h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23z" />
+<glyph unicode="&#x317;" horiz-adv-x="0" d="M-371 -224l145 148q22 23 43 23q36 0 36 -32q0 -24 -30 -43l-154 -96h-40z" />
+<glyph unicode="&#x318;" horiz-adv-x="0" d="M-210 -283h-40v95h-147v40h147v95h40v-230z" />
+<glyph unicode="&#x319;" horiz-adv-x="0" d="M-80 -188h-147v-95h-40v230h40v-95h147v-40z" />
+<glyph unicode="&#x31a;" horiz-adv-x="0" d="M-80 531h-55v149h-245v55h300v-204z" />
+<glyph unicode="&#x31b;" horiz-adv-x="0" d="M-36 345v22q27 6 27 15q0 2 -17.5 17t-17.5 34q0 15 13.5 28t32.5 13t34 -15.5t15 -40.5q0 -38 -33 -57q-19 -11 -54 -16z" />
+<glyph unicode="&#x31c;" horiz-adv-x="0" d="M-232 -266h-30q-40 0 -69 29t-29 69t28.5 68.5t69.5 28.5h30v-37h-30q-26 0 -43.5 -17.5t-17.5 -42.5q0 -26 17.5 -43.5t43.5 -17.5h30v-37z" />
+<glyph unicode="&#x31d;" horiz-adv-x="0" d="M-115 -240h-230v40h95v147h40v-147h95v-40z" />
+<glyph unicode="&#x31e;" horiz-adv-x="0" d="M-115 -93h-95v-147h-40v147h-95v40h230v-40z" />
+<glyph unicode="&#x31f;" horiz-adv-x="0" d="M-134 -168h-77v-82h-38v82h-77v44h77v71h38v-71h77v-44z" />
+<glyph unicode="&#x320;" horiz-adv-x="0" d="M-134 -168h-192v44h192v-44z" />
+<glyph unicode="&#x321;" horiz-adv-x="0" d="M1 75v-223q0 -58 -31 -98.5t-77 -40.5q-53 0 -90.5 15.5t-37.5 39.5q0 11 8 19t20 8q7 0 14 -3.5t9.5 -6t10 -11.5t9.5 -11q27 -31 54 -31q56 0 56 91v252h55z" />
+<glyph unicode="&#x322;" horiz-adv-x="0" d="M1 75v-252q0 -91 56 -91q27 0 54 31q3 3 8 9l7 9q3 3 7.5 7t9.5 5.5t11 1.5q12 0 20 -8t8 -19q0 -24 -37.5 -39.5t-90.5 -15.5q-46 0 -77 40.5t-31 98.5v223h55z" />
+<glyph unicode="&#x323;" horiz-adv-x="0" d="M-181 -168q0 -21 -14.5 -35t-35.5 -14q-20 0 -34.5 14.5t-14.5 34.5q0 21 13.5 35.5t35.5 14.5q23 0 36.5 -14t13.5 -36z" />
+<glyph unicode="&#x324;" horiz-adv-x="0" d="M-81 -168q0 -21 -15 -35.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -14.5t15 -34.5zM-280 -168q0 -21 -15 -35.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -14.5t15 -34.5z" />
+<glyph unicode="&#x325;" horiz-adv-x="0" d="M-130 -168q0 -41 -29.5 -70.5t-71.5 -29.5q-41 0 -69.5 29t-28.5 71q0 41 29.5 70t71.5 29q40 0 69 -29.5t29 -69.5zM-164 -168q0 27 -19.5 46t-47.5 19q-26 0 -45 -19.5t-19 -45.5q0 -28 19 -47t45 -19q28 0 47.5 19t19.5 47z" />
+<glyph unicode="&#x326;" horiz-adv-x="0" d="M-272 -353l-9 19q44 28 63 57.5t19 48.5q0 14 -14 14q-2 0 -10 -2t-14 -2q-24 0 -43 11.5t-19 38.5q0 29 18 43.5t40 14.5q11 0 23 -3.5t26 -13t23 -30t9 -49.5q0 -47 -41 -92t-71 -55z" />
+<glyph unicode="&#x327;" horiz-adv-x="0" d="M-212 0l-25 -65q15 3 26 3q41 0 63.5 -18t22.5 -51q0 -39 -33.5 -61.5t-91.5 -22.5q-45 0 -84 16l14 31q36 -12 65 -12q25 0 40 12t15 32q0 19 -12 27.5t-41 8.5q-17 0 -28 -4l-7 5l41 99h35z" />
+<glyph unicode="&#x328;" horiz-adv-x="0" d="M-157 -73l20 -16q-28 -41 -52.5 -58.5t-58.5 -17.5q-33 0 -53.5 19.5t-20.5 54.5q0 53 54 91h46q-44 -35 -44 -70q0 -39 38 -39q32 0 71 36z" />
+<glyph unicode="&#x329;" horiz-adv-x="0" d="M-210 -234h-40v132h40v-132z" />
+<glyph unicode="&#x32a;" horiz-adv-x="0" d="M-73 -235h-55v82h-202v-82h-55v137h312v-137z" />
+<glyph unicode="&#x32b;" horiz-adv-x="0" d="M-75 -110v-35q0 -38 -23.5 -60t-63.5 -22q-23 0 -43 10t-25 24q-15 -34 -61 -34q-41 0 -65 22.5t-24 59.5v35h40v-36q0 -41 47 -41q23 0 33 9.5t10 31.5v36h40v-35q0 -20 13 -31t33 -11q49 0 49 42v35h40z" />
+<glyph unicode="&#x32c;" horiz-adv-x="0" d="M-74 -73l-124 -167h-64l-123 167h35l120 -103l121 103h35z" />
+<glyph unicode="&#x32d;" horiz-adv-x="0" d="M-74 -240h-34l-122 103l-121 -103h-34l124 167h62z" />
+<glyph unicode="&#x32e;" horiz-adv-x="0" d="M-118 -68h29q-18 -157 -142 -157q-69 0 -104 41.5t-35 115.5h29q20 -97 112 -97q40 0 64.5 21.5t46.5 75.5z" />
+<glyph unicode="&#x32f;" horiz-adv-x="0" d="M-89 -216h-29q-22 54 -46.5 75.5t-64.5 21.5q-92 0 -112 -97h-29q0 74 35 115.5t104 41.5q124 0 142 -157z" />
+<glyph unicode="&#x330;" horiz-adv-x="0" d="M-94 -113h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24q-46 22 -64 22q-35 0 -51 -46h-29q11 49 37 75t64 26q34 0 70 -18q55 -28 77 -28q17 0 28.5 11.5t24.5 39.5z" />
+<glyph unicode="&#x331;" horiz-adv-x="0" d="M-74 -195h-311v54h311v-54z" />
+<glyph unicode="&#x332;" horiz-adv-x="0" d="M20 -191h-500v50h500v-50z" />
+<glyph unicode="&#x333;" horiz-adv-x="0" d="M20 -300h-500v50h500v-50zM20 -191h-500v50h500v-50z" />
+<glyph unicode="&#x334;" horiz-adv-x="0" d="M-100 320h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24q-46 22 -64 22q-35 0 -51 -46h-29q11 49 37 75t64 26q34 0 70 -18q55 -28 77 -28q17 0 28.5 11.5t24.5 39.5z" />
+<glyph unicode="&#x335;" horiz-adv-x="0" d="M-78 230h-306v44h306v-44z" />
+<glyph unicode="&#x336;" horiz-adv-x="0" d="M20 230h-500v44h500v-44z" />
+<glyph unicode="&#x337;" horiz-adv-x="0" d="M-41 580l-285 -654h-54l285 654h54z" />
+<glyph unicode="&#x338;" horiz-adv-x="0" d="M31 662l-357 -818h-54l357 818h54z" />
+<glyph unicode="&#x339;" horiz-adv-x="0" d="M-280 -71h30q41 0 69.5 -28.5t28.5 -68.5t-29 -69t-69 -29h-30v37h30q26 0 43.5 17.5t17.5 43.5q0 25 -17.5 42.5t-43.5 17.5h-30v37z" />
+<glyph unicode="&#x33a;" horiz-adv-x="0" d="M-73 -190h-312v137h55v-82h202v82h55v-137z" />
+<glyph unicode="&#x33b;" horiz-adv-x="0" d="M-147 -227h-166v174h166v-174zM-187 -187v94h-86v-94h86z" />
+<glyph unicode="&#x33c;" horiz-adv-x="0" d="M-79 -91v-51q-36 22 -69 22q-39 0 -71 -69h-20q-14 25 -21 36t-23 22t-38 11q-24 0 -59 -22v51q39 26 65 26q53 0 85 -53q37 53 86 53q27 0 65 -26z" />
+<glyph unicode="&#x33d;" horiz-adv-x="0" d="M-135 688l-67 -68l65 -65l-26 -30l-67 67l-66 -65l-26 28l64 65l-68 68l29 27l67 -67l68 67z" />
+<glyph unicode="&#x33e;" horiz-adv-x="0" d="M-177 829v-29q-46 -16 -46 -51q0 -18 22 -64q24 -49 24 -81q0 -41 -24.5 -65t-81.5 -40v29q28 13 39.5 24.5t11.5 28.5q0 22 -28 77q-18 36 -18 70q0 38 26 64t75 37z" />
+<glyph unicode="&#x33f;" horiz-adv-x="0" d="M20 770h-500v50h500v-50zM20 878h-500v50h500v-50z" />
+<glyph unicode="&#x346;" horiz-adv-x="0" d="M-68 538h-54v89h-173v-89h-55v143h282v-143z" />
+<glyph unicode="&#x34c;" horiz-adv-x="0" d="M-85 777h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11q-35 0 -51 -46h-29q11 49 37.5 75t63.5 26q34 0 70 -18l24 -12q29 -15 53 -15q17 0 28.5 11t24.5 39zM-85 638h29q-16 -57 -40 -81.5t-65 -24.5q-32 0 -81 24l-23 11q-24 11 -41 11 q-35 0 -51 -46h-29q11 49 37.5 75t63.5 26q34 0 70 -18l24 -12q29 -15 53 -15q17 0 28.5 11t24.5 39z" />
+<glyph unicode="&#x359;" horiz-adv-x="0" d="M-87 -157q0 -13 -17 -22q-5 -3 -41 -12.5t-65 -26.5q25 -14 62.5 -24t43.5 -14q15 -7 15 -23q0 -11 -7 -18.5t-20 -7.5q-14 0 -43 31.5t-56 46.5q0 -27 10.5 -66t10.5 -47q0 -9 -8.5 -18t-17.5 -9q-10 0 -18.5 9t-8.5 18q0 8 10 47t10 66q-21 -11 -50 -40t-34 -32 q-9 -6 -18 -6q-12 0 -19 6.5t-7 15.5q0 20 14 27q7 4 47 15t60 23q-20 12 -61 23.5t-49 16.5q-13 8 -13 21q0 11 7 20.5t18 9.5q5 0 15 -5q7 -4 37.5 -34t52.5 -42q0 28 -10 68t-10 48q0 10 8.5 18.5t18.5 8.5q9 0 17.5 -8.5t8.5 -18.5q0 -8 -10.5 -47.5t-10.5 -67.5 q30 16 56.5 44t31.5 31q10 5 15 5q11 0 18 -9.5t7 -20.5z" />
+<glyph unicode="&#x35c;" horiz-adv-x="0" d="M266 -76h29q0 -40 -25.5 -70t-62 -46t-86 -26t-86.5 -12.5t-74 -2.5t-74 2.5t-86.5 12.5t-86 26t-62 46t-25.5 70h29q6 -29 44 -50t91 -30.5t94.5 -13t75.5 -3.5t75.5 3.5t94.5 13t91 30.5t44 50z" />
+<glyph unicode="&#x360;" horiz-adv-x="0" d="M336 618h29q-18 -101 -172 -101q-107 0 -265 39q-92 22 -155 22h-8q-117 1 -131 -46h-29q18 101 172 101q69 0 158 -21q162 -40 262 -40h8q117 -1 131 46z" />
+<glyph unicode="&#x361;" horiz-adv-x="0" d="M295 507h-29q-6 29 -44 50t-91 30.5t-94.5 13t-75.5 3.5t-75.5 -3.5t-94.5 -13t-91 -30.5t-44 -50h-29q0 40 25.5 70t62 46t86 26t86.5 12.5t74 2.5t74 -2.5t86.5 -12.5t86 -26t62 -46t25.5 -70z" />
+<glyph unicode="&#x362;" horiz-adv-x="0" d="M355 -160v-15q-46 -19 -113 -95l-19 19l27 33q6 8 6 14q0 9 -12 9h-639v55h640q3 0 7.5 3.5t4.5 7.5q0 3 -7 12l-27 33l20 19q65 -75 112 -95z" />
+<glyph unicode="&#x37e;" horiz-adv-x="278" d="M191 403q0 -23 -16.5 -39t-38.5 -16q-23 0 -39.5 16.5t-16.5 38.5q0 24 16 40t40 16q22 0 38.5 -16.5t16.5 -39.5zM107 -141l-10 19q83 54 83 106q0 5 -4 9.5t-10 4.5q-3 0 -13 -2t-15 -2q-58 0 -58 52q0 24 17 40t42 16q34 0 57 -24.5t23 -64.5q0 -47 -30 -88t-82 -66z " />
+<glyph unicode="&#x384;" horiz-adv-x="277" d="M113 507l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34z" />
+<glyph unicode="&#x385;" horiz-adv-x="333" d="M113 507l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34zM316 557q0 -20 -15 -35t-35 -15t-34.5 15t-14.5 35q0 19 14.5 34t34.5 15t35 -14.5t15 -34.5zM117 557q0 -20 -15 -35t-35 -15t-34.5 15t-14.5 35q0 19 15 34t34 15q20 0 35 -14.5 t15 -34.5z" />
+<glyph unicode="&#x386;" horiz-adv-x="722" d="M707 0h-255v19l45 4q10 1 17 9.5t7 19.5q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70t54.5 -22v-19zM447 257l-116 275l-115 -275h231zM113 528l59 132q11 23 38 23 q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34z" />
+<glyph unicode="&#x387;" horiz-adv-x="278" d="M192 403q0 -23 -16 -39t-39 -16t-39.5 16.5t-16.5 38.5q0 24 16 40t40 16q22 0 38.5 -16.5t16.5 -39.5z" />
+<glyph unicode="&#x388;" horiz-adv-x="750" d="M8 528l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34zM737 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h529l5 -143h-25q-8 49 -28 68.5t-74.5 28t-182.5 8.5q-22 0 -28.5 -6.5t-6.5 -29.5v-220h151 q63 0 83.5 18t29.5 78h23v-234h-23q-9 63 -29 80t-84 17h-151v-243q0 -30 21 -38.5t80 -8.5q132 0 182.5 25.5t84.5 106.5h28z" />
+<glyph unicode="&#x389;" horiz-adv-x="850" d="M8 528l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34zM836 0h-279v19q58 4 73 22.5t15 82.5v191h-303v-202q0 -55 16 -73t71 -21l1 -19h-279v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5 v-189h303v189q0 58 -15.5 74t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-437q0 -53 16.5 -70.5t72.5 -21.5v-19z" />
+<glyph unicode="&#x38a;" horiz-adv-x="470" d="M8 528l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34zM449 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#x38c;" horiz-adv-x="722" d="M8 528l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34zM688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47 q-85 0 -143 -67q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#x38e;" horiz-adv-x="840" d="M818 658v-19q-17 5 -32 5q-103 0 -178.5 -102t-75.5 -238v-193q0 -57 19 -73t84 -19v-19h-306v19q68 5 84.5 21.5t16.5 82.5v172q-22 175 -73 251.5t-132 77.5q-24 0 -73 -18l-8 16q26 23 63 37.5t71 14.5q192 0 230 -239h2q21 104 92.5 170t151.5 66q39 0 64 -13zM8 528 l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34z" />
+<glyph unicode="&#x38f;" horiz-adv-x="744" d="M715 0h-286l7 161q62 15 101.5 85t39.5 153q0 109 -54.5 175t-150.5 66t-150.5 -72t-54.5 -169q0 -78 38.5 -149t101.5 -89l9 -161h-287v171h25q1 -45 14.5 -60.5t47.5 -15.5h151l-2 37q-106 30 -159 94t-53 171q0 109 87.5 194t231.5 85t231.5 -81.5t87.5 -197.5 q0 -204 -215 -265l-2 -37h154q59 0 62 74h25v-169zM8 528l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34z" />
+<glyph unicode="&#x390;" horiz-adv-x="340" d="M286 107l15 -8q-52 -109 -113 -109q-59 0 -59 88v266q0 49 -33 49q-23 0 -42 -4v18q63 19 155 53l4 -4v-377q0 -23 20 -23q16 0 25.5 9.5t27.5 41.5zM113 507l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34zM316 557q0 -20 -15 -35t-35 -15 t-34.5 15t-14.5 35q0 19 14.5 34t34.5 15t35 -14.5t15 -34.5zM117 557q0 -20 -15 -35t-35 -15t-34.5 15t-14.5 35q0 19 15 34t34 15q20 0 35 -14.5t15 -34.5z" />
+<glyph unicode="&#x391;" horiz-adv-x="722" d="M707 0h-255v19l45 4q10 1 17 9.5t7 19.5q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70t54.5 -22v-19zM447 257l-116 275l-115 -275h231z" />
+<glyph unicode="&#x392;" horiz-adv-x="667" d="M422 349v-1q80 -14 125.5 -56.5t45.5 -113.5q0 -83 -65 -130.5t-174 -47.5h-337v19q59 2 77.5 19.5t18.5 74.5v437q0 58 -17 73.5t-79 19.5v19h280q129 0 195.5 -43.5t66.5 -123.5q0 -65 -34.5 -98.5t-102.5 -47.5zM215 366h63q179 0 179 124q0 72 -49.5 103.5 t-168.5 31.5q-24 0 -24 -32v-227zM215 326v-244q0 -25 13.5 -35t48.5 -10q96 0 148.5 30t52.5 112q0 85 -52 116t-146 31h-65z" />
+<glyph unicode="&#x393;" horiz-adv-x="587" d="M577 494h-25q-8 75 -36.5 102.5t-103.5 27.5h-175q-21 0 -28.5 -8t-7.5 -32v-471q0 -58 16 -74.5t75 -19.5v-19h-281v19q57 4 72.5 22t15.5 83v427q0 55 -15 71.5t-72 20.5v19h560z" />
+<glyph unicode="&#x394;" horiz-adv-x="722" d="M675 0h-627l299 674h20zM524 92l-193 440l-195 -440h388z" />
+<glyph unicode="&#x395;" horiz-adv-x="611" d="M597 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-25q-8 49 -28 68.5t-74.5 28t-182.5 8.5q-22 0 -28.5 -6.5t-6.5 -29.5v-220h151q63 0 83.5 18t29.5 78h23v-234h-23q-9 63 -29 80t-84 17h-151v-243q0 -30 21 -38.5t80 -8.5 q132 0 182.5 25.5t84.5 106.5h28z" />
+<glyph unicode="&#x396;" horiz-adv-x="612" d="M598 176l-25 -176h-563v15l437 609h-214q-99 0 -134 -35q-18 -19 -25.5 -37.5t-15.5 -60.5h-26l21 171h525v-15l-432 -609h252q78 0 117 28q23 16 34 37.5t26 72.5h23z" />
+<glyph unicode="&#x397;" horiz-adv-x="722" d="M703 0h-279v19q58 4 73 22.5t15 82.5v191h-303v-202q0 -55 16 -73t71 -21l1 -19h-279v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-189h303v189q0 58 -15.5 74t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5 v-437q0 -53 16.5 -70.5t72.5 -21.5v-19z" />
+<glyph unicode="&#x398;" horiz-adv-x="722" d="M688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45 q78 0 129 48q83 80 83 267zM501 236h-25q-7 31 -20 46.5t-38 15.5h-105q-27 0 -39 -14t-24 -48h-25q10 37 10 87q0 68 -11 118h25q11 -33 23 -45.5t40 -12.5h106q46 0 58 58h25q-11 -44 -11 -80q0 -76 11 -125z" />
+<glyph unicode="&#x399;" horiz-adv-x="333" d="M315 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#x39a;" horiz-adv-x="731" d="M723 0h-303v19l27 1q42 1 42 24q0 18 -32.5 56.5t-104.5 113.5l-100 103l-26 -21v-185q0 -56 16 -71.5t73 -20.5v-19h-282v19q59 3 75 22t16 84v424q0 56 -16 73t-74 21v19h282v-19q-61 -4 -75.5 -20t-14.5 -75v-200l178 164q43 40 60.5 61t17.5 38q0 16 -8.5 23t-32.5 8 l-25 1v19h259v-19q-51 -4 -77.5 -17.5t-78.5 -63.5l-186 -178l234 -256q62 -68 91.5 -88.5t64.5 -20.5v-19z" />
+<glyph unicode="&#x39b;" horiz-adv-x="702" d="M687 0h-255v19q4 0 12 0.5t12 0.5t10.5 0.5t10 1.5t8 2.5t7 4t5 6t3.5 7.5t1 10q0 22 -19 70l-160 411h-2l-167 -431q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q43 4 63 31.5t63 135.5l196 488h20l236 -563q21 -51 38.5 -69.5t55.5 -22.5v-19z" />
+<glyph unicode="&#x39c;" horiz-adv-x="889" d="M864 0h-280v19q59 4 74.5 22.5t15.5 81.5v449l-255 -572h-14l-252 549v-398q0 -81 17 -105t76 -27v-19h-234v19q44 3 63 13t26.5 35.5t7.5 83.5v398q0 57 -17 73.5t-78 20.5v19h198l231 -502l221 502h199v-19q-54 -1 -70.5 -19t-16.5 -74v-438q0 -53 16.5 -71t71.5 -22 v-19z" />
+<glyph unicode="&#x39d;" horiz-adv-x="722" d="M707 662v-19q-51 -5 -66 -18q-16 -14 -22.5 -38t-6.5 -80v-518h-18l-441 549v-388q0 -76 17 -99.5t76 -31.5v-19h-234v19q62 7 79.5 29.5t17.5 101.5v440q-26 32 -44 42.5t-53 10.5v19h170l386 -483v340q0 76 -19 98q-12 13 -26.5 17.5t-52.5 8.5v19h237z" />
+<glyph unicode="&#x39e;" horiz-adv-x="643" d="M590 493h-25q-8 49 -25 68t-56 19h-325q-39 0 -56.5 -18.5t-24.5 -70.5h-25v171h537v-169zM503 218h-23q0 77 -69 77h-185q-32 0 -45 -19t-18 -58h-23v233h23q0 -41 16 -58.5t49 -17.5h186q35 0 50 17.5t16 58.5h23v-233zM614 0h-585v171h25q0 -43 23 -64.5t62 -21.5h358 q92 0 92 86h25v-171z" />
+<glyph unicode="&#x39f;" horiz-adv-x="722" d="M688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45 q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#x3a0;" horiz-adv-x="722" d="M703 0h-279v19q58 4 73 22.5t15 82.5v464q0 21 -7 28.5t-29 7.5h-231q-20 0 -28 -6.5t-8 -26.5v-478q0 -55 16 -73t71 -21l1 -19h-279v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h685v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-437q0 -53 16.5 -70.5t72.5 -21.5 v-19z" />
+<glyph unicode="&#x3a1;" horiz-adv-x="557" d="M16 662h259q142 0 217 -63q50 -42 50 -119q0 -80 -57 -131q-42 -38 -86 -49.5t-128 -11.5q-29 0 -69 3v-179q0 -57 16.5 -73.5t77.5 -19.5v-19h-280v19q58 4 71 21t13 82v429q0 56 -14.5 72t-69.5 20v19zM202 589v-258q34 -3 61 -3q81 0 125.5 39.5t44.5 107.5 q0 81 -46 115.5t-150 34.5q-21 0 -28 -7.5t-7 -28.5z" />
+<glyph unicode="&#x3a3;" horiz-adv-x="624" d="M600 204l-28 -204h-542v15l267 309l-267 323v15h526v-161h-25q-11 73 -45 98t-105 25h-208l212 -257l-237 -272h310q56 0 81.5 25t37.5 84h23z" />
+<glyph unicode="&#x3a4;" horiz-adv-x="611" d="M593 492h-25q-16 82 -44.5 105t-108.5 23h-59v-509q0 -57 17 -73t79 -19v-19h-292v19q63 4 78.5 21t15.5 83v497h-60q-81 0 -109 -23t-43 -105h-25l7 170h562z" />
+<glyph unicode="&#x3a5;" horiz-adv-x="722" d="M703 658v-19q-17 5 -32 5q-103 0 -178.5 -102t-75.5 -238v-193q0 -57 19 -73t84 -19v-19h-306v19q68 5 84.5 21.5t16.5 82.5v172q-22 175 -73 251.5t-132 77.5q-24 0 -73 -18l-8 16q26 23 63 37.5t71 14.5q192 0 230 -239h2q21 104 92.5 170t151.5 66q39 0 64 -13z" />
+<glyph unicode="&#x3a6;" horiz-adv-x="763" d="M432 580v-20q55 0 105.5 -13t94 -39.5t70 -72t26.5 -105.5q0 -56 -26.5 -101.5t-68 -72t-87.5 -40t-89 -13.5h-25v-17q0 -38 22.5 -51t80.5 -16v-19h-306v19q52 0 76.5 14.5t24.5 51.5v18h-17q-136 0 -207 62t-71 165q0 60 25.5 105.5t69 72t94 39.5t106.5 13v20 q0 36 -19.5 49.5t-81.5 13.5v19h306v-19q-62 0 -82.5 -15t-20.5 -48zM430 523v-383q75 0 132 48.5t57 129.5t-49.5 143t-139.5 62zM332 140v383q-80 0 -134 -63.5t-54 -141.5q0 -74 50.5 -126t137.5 -52z" />
+<glyph unicode="&#x3a7;" horiz-adv-x="722" d="M704 0h-296v19l26 2q50 3 50 29q0 22 -51 98l-95 141l-119 -149q-53 -66 -53 -89q0 -15 16.5 -22t59.5 -10v-19h-232v19q39 4 63.5 23t81.5 91l156 195l-106 155q-70 102 -101 128.5t-82 31.5v19h301v-19l-29 -1q-23 -1 -34.5 -7t-11.5 -22q0 -6 1.5 -12.5t6.5 -15.5 l8 -17l12 -20l15 -22l19 -28l21 -30l44 -64l112 140q40 49 40 67q0 17 -14 24t-54 8v19h237v-19q-48 -3 -76 -21.5t-76 -77.5l-143 -177l192 -274q29 -42 50 -55.5t61 -18.5v-19z" />
+<glyph unicode="&#x3a8;" horiz-adv-x="746" d="M724 690v-19q-26 -5 -36.5 -37.5t-10.5 -66.5q0 -15 2 -45t2 -45q0 -71 -37.5 -119t-93.5 -68t-126 -20v-159q0 -58 21.5 -74t81.5 -18v-19h-306v19q65 3 83 21.5t18 83.5v146q-70 0 -126 20t-93.5 68t-37.5 119q0 15 2 45t2 45q0 34 -10.5 66.5t-36.5 37.5v19 q155 0 155 -181q0 -33 2 -58t10.5 -53.5t22 -47t39 -31t60.5 -12.5h11v255q0 49 -24.5 65t-76.5 16v19h306v-19q-54 0 -78.5 -15t-24.5 -66v-255h11q35 0 60.5 12.5t39 31t22 47t10.5 53.5t2 58q0 181 155 181z" />
+<glyph unicode="&#x3a9;" horiz-adv-x="744" d="M715 0h-286l7 161q62 15 101.5 85t39.5 153q0 109 -54.5 175t-150.5 66t-150.5 -72t-54.5 -169q0 -78 38.5 -149t101.5 -89l9 -161h-287v171h25q1 -45 14.5 -60.5t47.5 -15.5h151l-2 37q-106 30 -159 94t-53 171q0 109 87.5 194t231.5 85t231.5 -81.5t87.5 -197.5 q0 -204 -215 -265l-2 -37h154q59 0 62 74h25v-169z" />
+<glyph unicode="&#x3aa;" horiz-adv-x="333" d="M316 823q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM117 823q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM315 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73 t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#x3ab;" horiz-adv-x="722" d="M703 658v-19q-17 5 -32 5q-103 0 -178.5 -102t-75.5 -238v-193q0 -57 19 -73t84 -19v-19h-306v19q68 5 84.5 21.5t16.5 82.5v172q-22 175 -73 251.5t-132 77.5q-24 0 -73 -18l-8 16q26 23 63 37.5t71 14.5q192 0 230 -239h2q21 104 92.5 170t151.5 66q39 0 64 -13z M515 823q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM316 823q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#x3ac;" horiz-adv-x="543" d="M514 129h15q0 -59 -21.5 -99t-57.5 -40q-56 0 -80 110q-30 -54 -65 -82t-89 -28q-81 0 -134 65.5t-53 167.5q0 99 53.5 168t142.5 69q60 0 99.5 -42.5t54.5 -103.5l45 136h97l-109 -263q10 -46 29.5 -90.5t39.5 -44.5q24 0 33 77zM331 208q-33 224 -111 224 q-42 0 -71.5 -39.5t-29.5 -119.5q0 -34 4.5 -72t15 -82t33 -72.5t53.5 -28.5q70 0 106 190zM217 507l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34z" />
+<glyph unicode="&#x3ad;" horiz-adv-x="439" d="M393 145l14 -9q-63 -146 -192 -146q-61 0 -102 14.5t-58.5 38t-23.5 42t-6 37.5q0 40 29.5 73t70.5 40q-36 10 -56.5 36t-20.5 58q0 54 52 92.5t142 38.5q61 0 108.5 -25t47.5 -78q0 -20 -14.5 -31t-32.5 -11t-31 12t-13 30q0 11 2 20.5t2 13.5q0 40 -87 40 q-42 0 -67.5 -28.5t-25.5 -68.5q0 -36 22 -60.5t62 -24.5q16 0 32.5 4.5t28.5 4.5q38 0 38 -21q0 -11 -12.5 -18.5t-35.5 -7.5q-8 0 -20.5 3t-23.5 3q-39 0 -73 -22.5t-34 -65.5q0 -41 31.5 -65t73.5 -24q53 0 94 26t79 79zM153 507l59 132q11 23 38 23q11 0 20.5 -7.5 t9.5 -21.5q0 -13 -27 -45l-66 -81h-34z" />
+<glyph unicode="&#x3ae;" horiz-adv-x="512" d="M452 -217h-85q-15 28 -15 86v439q0 97 -73 97q-46 0 -103 -57v-348h-84v313q0 75 -20 75q-25 0 -48 -49l-14 6q52 110 103 110q33 0 44 -15.5t16 -60.5h1q71 81 144 81q56 0 87 -39t31 -102v-451q0 -59 16 -85zM168 507l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5 q0 -13 -27 -45l-66 -81h-34z" />
+<glyph unicode="&#x3af;" horiz-adv-x="275" d="M252 107l15 -8q-52 -109 -113 -109q-59 0 -59 88v266q0 49 -33 49q-23 0 -42 -4v18q63 19 155 53l4 -4v-377q0 -23 20 -23q16 0 25.5 9.5t27.5 41.5zM80 507l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34z" />
+<glyph unicode="&#x3b0;" horiz-adv-x="524" d="M255 460h27q89 0 150.5 -61.5t61.5 -173.5q0 -98 -62 -166.5t-154 -68.5q-101 0 -140.5 56t-39.5 152v120q0 70 -20 70q-25 0 -48 -49l-14 6q52 110 103 110q63 0 63 -70v-211q0 -34 7.5 -66.5t32 -61t62.5 -28.5q61 0 90.5 54t29.5 137q0 107 -50 173q-42 54 -99 58v20z M201 507l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34zM404 557q0 -20 -15 -35t-35 -15t-34.5 15t-14.5 35q0 19 14.5 34t34.5 15t35 -14.5t15 -34.5zM205 557q0 -20 -15 -35t-35 -15t-34.5 15t-14.5 35q0 19 15 34t34 15q20 0 35 -14.5 t15 -34.5z" />
+<glyph unicode="&#x3b1;" horiz-adv-x="543" d="M514 129h15q0 -59 -21.5 -99t-57.5 -40q-56 0 -80 110q-30 -54 -65 -82t-89 -28q-81 0 -134 65.5t-53 167.5q0 99 53.5 168t142.5 69q60 0 99.5 -42.5t54.5 -103.5l45 136h97l-109 -263q10 -46 29.5 -90.5t39.5 -44.5q24 0 33 77zM331 208q-33 224 -111 224 q-42 0 -71.5 -39.5t-29.5 -119.5q0 -34 4.5 -72t15 -82t33 -72.5t53.5 -28.5q70 0 106 190z" />
+<glyph unicode="&#x3b2;" horiz-adv-x="496" d="M344 399l2 -1q56 -13 88 -61t32 -109q0 -94 -59 -166t-145 -72q-34 0 -57.5 8.5t-49.5 32.5v-167q0 -44 -16 -81h-84q16 34 16 81v509q0 310 196 310q62 0 111 -45t49 -110q0 -38 -15 -69q-22 -42 -68 -60zM155 485v-396q0 -23 32.5 -45t71.5 -22q55 0 88 51t33 129 q0 62 -15.5 105t-33.5 58.5t-35 15.5q-11 0 -23.5 -3.5t-22.5 -3.5q-17 0 -28 7t-11 18q0 22 42 22q4 0 24 -4t28 -4q20 0 30.5 24.5t10.5 55.5q0 29 -4.5 55t-14.5 51.5t-30 40.5t-48 15q-45 0 -69.5 -42t-24.5 -113v-15z" />
+<glyph unicode="&#x3b3;" horiz-adv-x="474" d="M444 450l-186 -450q14 -63 14 -118q0 -100 -61 -100q-24 0 -36.5 19t-12.5 49q0 41 18 98q1 5 33 88q-38 351 -130 351q-18 0 -35.5 -23t-22.5 -65h-15q0 66 22 112t65 46q33 0 57.5 -27.5t39 -76t22.5 -90.5t14.5 -97t9.5 -69l104 353h100z" />
+<glyph unicode="&#x3b4;" horiz-adv-x="500" d="M221 425v1q-68 28 -102.5 64t-34.5 88t51.5 78.5t112.5 26.5q59 0 114 -20t55 -55q0 -16 -8.5 -29.5t-26.5 -13.5q-21 0 -36 12t-24.5 26t-37.5 26t-72 12q-30 0 -60 -15.5t-30 -45.5q0 -26 32.5 -47.5t98 -50t100.5 -49.5q117 -72 117 -202q0 -105 -61 -173t-163 -68 q-95 0 -156 68t-61 158q0 78 51.5 137.5t140.5 71.5zM380 208q0 56 -35 117.5t-90 73.5q-64 0 -100 -47t-36 -111q0 -37 13.5 -85.5t38.5 -86.5q15 -23 40.5 -37t48.5 -14q57 0 88.5 50t31.5 140z" />
+<glyph unicode="&#x3b5;" horiz-adv-x="439" d="M393 145l14 -9q-63 -146 -192 -146q-61 0 -102 14.5t-58.5 38t-23.5 42t-6 37.5q0 40 29.5 73t70.5 40q-36 10 -56.5 36t-20.5 58q0 54 52 92.5t142 38.5q61 0 108.5 -25t47.5 -78q0 -20 -14.5 -31t-32.5 -11t-31 12t-13 30q0 11 2 20.5t2 13.5q0 40 -87 40 q-42 0 -67.5 -28.5t-25.5 -68.5q0 -36 22 -60.5t62 -24.5q16 0 32.5 4.5t28.5 4.5q38 0 38 -21q0 -11 -12.5 -18.5t-35.5 -7.5q-8 0 -20.5 3t-23.5 3q-39 0 -73 -22.5t-34 -65.5q0 -41 31.5 -65t73.5 -24q53 0 94 26t79 79z" />
+<glyph unicode="&#x3b6;" horiz-adv-x="441" d="M153 683l9 -15q-30 -14 -46 -34.5t-16 -37.5q0 -19 11 -30t22.5 -14t33.5 -6q22 37 68.5 73.5t82.5 36.5q39 0 39 -34t-52.5 -67.5t-115.5 -39.5q-42 -47 -74.5 -124t-32.5 -157q0 -154 124 -154q9 0 24.5 1t26.5 1q77 0 113.5 -34.5t36.5 -107.5q0 -64 -47 -111t-96 -47 q-31 0 -51.5 14.5t-20.5 41.5q0 18 11 29.5t31 11.5q10 0 28 -14.5t33 -14.5q32 0 56.5 23t24.5 58q0 32 -25 50t-65 18q-3 0 -41 -4.5t-55 -4.5q-155 0 -155 210q0 90 24.5 159t84.5 156l-1 3q-32 0 -60 20t-28 55q0 63 98 90z" />
+<glyph unicode="&#x3b7;" horiz-adv-x="512" d="M452 -217h-85q-15 28 -15 86v439q0 97 -73 97q-46 0 -103 -57v-348h-84v313q0 75 -20 75q-25 0 -48 -49l-14 6q52 110 103 110q33 0 44 -15.5t16 -60.5h1q71 81 144 81q56 0 87 -39t31 -102v-451q0 -59 16 -85z" />
+<glyph unicode="&#x3b8;" horiz-adv-x="496" d="M468 333q0 -153 -59.5 -248t-165.5 -95q-132 0 -186 138q-30 76 -30 212q0 153 59.5 248t165.5 95q63 0 102 -21.5t68 -70.5q46 -77 46 -258zM117 354h261q0 36 -2 65.5t-6.5 66.5t-14.5 65t-24.5 52.5t-38.5 38t-54 13.5q-121 0 -121 -270v-31zM378 316v6h-261 q1 -63 6.5 -109.5t19 -94.5t42.5 -74t71 -26q61 0 91.5 80t30.5 218z" />
+<glyph unicode="&#x3b9;" horiz-adv-x="275" d="M252 107l15 -8q-52 -109 -113 -109q-59 0 -59 88v266q0 49 -33 49q-23 0 -42 -4v18q63 19 155 53l4 -4v-377q0 -23 20 -23q16 0 25.5 9.5t27.5 41.5z" />
+<glyph unicode="&#x3ba;" horiz-adv-x="500" d="M503 0h-237v15h9q38 0 38 24q0 10 -16 29l-131 159v-227h-84v341q0 36 -9 48.5t-34 12.5q-6 0 -32 -2v16l30 8q60 16 125 36l4 -2v-200q60 67 106 110.5t76 62t47.5 24t35.5 5.5q28 0 43.5 -13.5t15.5 -34.5q0 -26 -15.5 -37.5t-34.5 -11.5q-12 0 -33 5.5t-31 5.5 q-35 0 -67.5 -20.5t-83.5 -74.5l173 -202q27 -32 49.5 -45t55.5 -17v-15z" />
+<glyph unicode="&#x3bb;" horiz-adv-x="497" d="M477 137h15q-1 -65 -23 -106.5t-61 -41.5q-52 0 -80 101l-72 265l-144 -355h-100l215 450l-13 45q-15 53 -38.5 85.5t-47.5 32.5q-23 0 -38.5 -16.5t-21.5 -60.5h-15q0 58 20 102.5t62 44.5q39 0 61 -35.5t45 -115.5l112 -390q24 -83 64 -83q17 0 36 19.5t24 58.5z" />
+<glyph unicode="&#x3bc;" horiz-adv-x="528" d="M501 106l15 -7q-53 -109 -110 -109q-61 0 -61 81h-2q-56 -81 -125 -81q-49 0 -63 28h-2v-149q0 -52 -16 -86h-82q16 37 16 85v582h84v-312q0 -41 26.5 -65.5t59.5 -24.5q47 0 81 31q14 12 18.5 22.5t4.5 34.5v314h84v-337q0 -57 20 -57q15 0 25.5 10t26.5 40z" />
+<glyph unicode="&#x3bd;" horiz-adv-x="455" d="M424 460h19q0 -143 -37 -228q-38 -87 -112 -155t-176 -91h-23v358q0 49 -33 49q-25 0 -42 -4v18q63 19 155 53l4 -4v-366h1q65 11 123.5 77.5t89.5 147.5t31 145z" />
+<glyph unicode="&#x3be;" horiz-adv-x="441" d="M177 683l8 -16q-59 -20 -59 -58q0 -43 39 -46q73 52 138 52q46 0 46 -33q0 -26 -43 -46t-94 -20q-34 0 -51.5 -19.5t-17.5 -46.5q0 -39 35 -63q56 47 128 47q29 0 46.5 -10.5t17.5 -29.5q0 -21 -21.5 -34t-44 -17t-43.5 -4q-39 0 -72 9q-50 -22 -79.5 -61t-29.5 -92 q0 -115 116 -115q10 0 33 1t28 1q150 0 150 -137q0 -68 -46.5 -115.5t-96.5 -47.5q-31 0 -51.5 14.5t-20.5 41.5q0 18 11 29.5t31 11.5q10 0 28 -14.5t33 -14.5q32 0 56.5 22.5t24.5 58.5q0 32 -25 50t-65 18q-4 0 -40 -4.5t-50 -4.5q-161 0 -161 173q0 61 30 115t80 90 q-42 28 -42 81q0 51 35 83q-24 3 -40.5 18.5t-16.5 43.5q0 63 96 89z" />
+<glyph unicode="&#x3bf;" horiz-adv-x="505" d="M473 228q0 -89 -66 -163.5t-155 -74.5q-90 0 -153.5 61.5t-63.5 150.5q0 101 62.5 179.5t161.5 78.5t156.5 -65.5t57.5 -166.5zM384 191q0 49 -13 100t-47.5 94t-84.5 43q-31 0 -54.5 -18.5t-36 -48t-18.5 -59.5t-6 -58q0 -46 14 -94.5t48.5 -88t82.5 -39.5 q37 0 64.5 29.5t39 66.5t11.5 73z" />
+<glyph unicode="&#x3c0;" horiz-adv-x="501" d="M467 137h15q0 -53 -31 -100t-81 -47q-41 0 -66.5 35.5t-25.5 86.5q0 94 16 254h-93q-1 -11 -1 -45t-1.5 -65t-4 -72t-9 -73.5t-16.5 -62t-26.5 -46t-38.5 -16.5q-33 0 -50 18t-17 46q0 16 23 23q20 6 31.5 15.5t26 37.5t24 87.5t13.5 152.5q-48 0 -77 -11t-53 -46h-16 q27 75 67.5 108t116.5 33h286v-84h-119q-10 -70 -10 -148q0 -71 6 -96q12 -49 49 -49q47 0 62 64z" />
+<glyph unicode="&#x3c1;" horiz-adv-x="496" d="M71 -132v284q0 308 188 308q88 0 147.5 -60.5t59.5 -152.5q0 -109 -58.5 -183t-147.5 -74q-33 0 -56 8t-49 32v-161q0 -54 -16 -86h-84q16 34 16 85zM155 273v-185q0 -22 34.5 -44t69.5 -22q54 0 87.5 53.5t33.5 136.5q0 102 -38 161t-95 59q-44 0 -68 -43t-24 -116z" />
+<glyph unicode="&#x3c2;" horiz-adv-x="441" d="M432 352q0 -19 -12 -34.5t-36 -15.5q-13 0 -27.5 11t-27 24t-37 24t-55.5 11q-60 0 -107.5 -41.5t-47.5 -119.5q0 -59 27.5 -92.5t96.5 -38.5h7q7 0 21 1t23 1q77 0 113.5 -34.5t36.5 -107.5q0 -64 -47 -111t-96 -47q-31 0 -51.5 14.5t-20.5 41.5q0 18 11 29.5t31 11.5 q10 0 28 -14.5t33 -14.5q32 0 56.5 23t24.5 58q0 32 -25 50t-65 18q-3 0 -41 -4.5t-55 -4.5q-72 0 -113.5 37t-41.5 139q0 120 79 207t169 87q72 0 110.5 -32.5t38.5 -75.5z" />
+<glyph unicode="&#x3c3;" horiz-adv-x="548" d="M518 366h-176q15 -22 39 -42.5t41.5 -33t31 -38.5t13.5 -64q0 -76 -67 -137t-161 -61q-85 0 -147.5 68t-62.5 157q0 115 60 175t150 60h279v-84zM377 171q0 61 -31 119t-73 76q-25 0 -49 -5.5t-49 -18.5t-40.5 -40.5t-15.5 -67.5q0 -85 44.5 -150.5t97.5 -65.5 q56 0 86 45.5t30 107.5z" />
+<glyph unicode="&#x3c4;" horiz-adv-x="477" d="M442 366h-170q-23 -124 -23 -184q0 -109 53 -109q25 0 43.5 18.5t25.5 51.5h15q0 -62 -30.5 -107.5t-78.5 -45.5q-56 0 -79.5 43.5t-23.5 108.5q0 90 40 224h-82q-40 0 -70 -24.5t-44 -65.5h-15q7 38 24.5 75.5t53.5 68t81 30.5h280v-84z" />
+<glyph unicode="&#x3c5;" horiz-adv-x="524" d="M255 460h27q89 0 150.5 -61.5t61.5 -173.5q0 -98 -62 -166.5t-154 -68.5q-101 0 -140.5 56t-39.5 152v120q0 70 -20 70q-25 0 -48 -49l-14 6q52 110 103 110q63 0 63 -70v-211q0 -34 7.5 -66.5t32 -61t62.5 -28.5q61 0 90.5 54t29.5 137q0 107 -50 173q-42 54 -99 58v20z " />
+<glyph unicode="&#x3c6;" horiz-adv-x="623" d="M269 18v135q0 60 2.5 99t14 87t33.5 76q35 45 95 45q70 0 124.5 -67.5t54.5 -170.5q0 -99 -62.5 -165.5t-177.5 -66.5v-207h-84v207l-24 1q-100 4 -158 71.5t-58 166.5q0 95 58 163t155 68q15 0 27 -3v-15q-71 -5 -110.5 -47.5t-39.5 -121.5q0 -132 53 -205 q36 -50 97 -50zM353 18h30q61 0 90.5 53t29.5 135q0 81 -28.5 153.5t-71.5 72.5q-12 0 -21 -6t-14.5 -20t-8.5 -26.5t-4 -37t-1.5 -39.5t-0.5 -45v-240z" />
+<glyph unicode="&#x3c7;" horiz-adv-x="500" d="M486 450l-210 -368l17 -80q18 -83 35.5 -117.5t46.5 -34.5q43 0 51 80h15q0 -30 -6 -61.5t-24 -60t-46 -28.5q-68 0 -93 151l-21 121l-142 -263h-98l210 367l-19 82q-35 152 -90 152q-13 0 -26 -19t-18 -58h-15q0 73 16.5 110t56.5 37q42 0 65 -61.5t55 -213.5l142 265 h98z" />
+<glyph unicode="&#x3c8;" horiz-adv-x="694" d="M684 457v-15q-85 -11 -85 -213q0 -239 -205 -239v-207h-84v207q-115 0 -160 57.5t-45 181.5q0 201 -85 212v15q28 4 52 4q45 0 74 -29.5t39 -69t10 -86.5q0 -257 115 -257v432h84v-432q115 0 115 253q0 35 5.5 65.5t18 60t38 46.5t61.5 17q38 0 52 -3z" />
+<glyph unicode="&#x3c9;" horiz-adv-x="625" d="M361 445v15q106 0 170 -62t64 -187q0 -109 -48 -165t-111 -56q-88 0 -124 96q-42 -96 -126 -96q-59 0 -109 56q-48 55 -48 163q0 125 65 188t169 63v-15q-64 0 -104 -60t-40 -167q0 -200 81 -200q66 0 85 128q-18 58 -18 105q0 98 45 98q19 0 32 -24t13 -72 q0 -44 -18 -107q6 -58 30 -93t52 -35q27 0 45 15.5t26 46t10.5 59t2.5 69.5q0 115 -37 176t-107 61z" />
+<glyph unicode="&#x3ca;" horiz-adv-x="340" d="M276 107l15 -8q-52 -109 -113 -109q-59 0 -59 88v266q0 49 -33 49q-23 0 -42 -4v18q63 19 155 53l4 -4v-377q0 -23 20 -23q16 0 25.5 9.5t27.5 41.5zM316 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM117 572 q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#x3cb;" horiz-adv-x="524" d="M255 460h27q89 0 150.5 -61.5t61.5 -173.5q0 -98 -62 -166.5t-154 -68.5q-101 0 -140.5 56t-39.5 152v120q0 70 -20 70q-25 0 -48 -49l-14 6q52 110 103 110q63 0 63 -70v-211q0 -34 7.5 -66.5t32 -61t62.5 -28.5q61 0 90.5 54t29.5 137q0 107 -50 173q-42 54 -99 58v20z M404 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM205 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#x3cc;" horiz-adv-x="505" d="M473 228q0 -89 -66 -163.5t-155 -74.5q-90 0 -153.5 61.5t-63.5 150.5q0 101 62.5 179.5t161.5 78.5t156.5 -65.5t57.5 -166.5zM384 191q0 49 -13 100t-47.5 94t-84.5 43q-31 0 -54.5 -18.5t-36 -48t-18.5 -59.5t-6 -58q0 -46 14 -94.5t48.5 -88t82.5 -39.5 q37 0 64.5 29.5t39 66.5t11.5 73zM191 507l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34z" />
+<glyph unicode="&#x3cd;" horiz-adv-x="524" d="M255 460h27q89 0 150.5 -61.5t61.5 -173.5q0 -98 -62 -166.5t-154 -68.5q-101 0 -140.5 56t-39.5 152v120q0 70 -20 70q-25 0 -48 -49l-14 6q52 110 103 110q63 0 63 -70v-211q0 -34 7.5 -66.5t32 -61t62.5 -28.5q61 0 90.5 54t29.5 137q0 107 -50 173q-42 54 -99 58v20z M192 507l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34z" />
+<glyph unicode="&#x3ce;" horiz-adv-x="625" d="M361 445v15q106 0 170 -62t64 -187q0 -109 -48 -165t-111 -56q-88 0 -124 96q-42 -96 -126 -96q-59 0 -109 56q-48 55 -48 163q0 125 65 188t169 63v-15q-64 0 -104 -60t-40 -167q0 -200 81 -200q66 0 85 128q-18 58 -18 105q0 98 45 98q19 0 32 -24t13 -72 q0 -44 -18 -107q6 -58 30 -93t52 -35q27 0 45 15.5t26 46t10.5 59t2.5 69.5q0 115 -37 176t-107 61zM247 507l59 132q11 23 38 23q11 0 20.5 -7.5t9.5 -21.5q0 -13 -27 -45l-66 -81h-34z" />
+<glyph unicode="&#x3d0;" horiz-adv-x="450" d="M411 611q0 -44 -32.5 -72.5t-72 -38t-82.5 -9.5q-33 0 -66 3q-82 -128 -85 -248q37 63 81 101t104 38q65 0 102.5 -58t37.5 -127q0 -81 -48.5 -145.5t-127.5 -64.5q-47 0 -82 25t-52.5 65.5t-25.5 82.5t-8 86q0 286 148 402q56 42 100 42q109 0 109 -82zM165 507h35 q48 0 87 19q24 11 55.5 51t31.5 63q0 13 -10.5 23.5t-24.5 10.5q-84 0 -174 -167zM357 272q0 31 -20 55t-50 24q-36 0 -77.5 -47t-68 -104t-26.5 -92q0 -34 17 -59.5t49 -25.5q37 0 80 47.5t69.5 106.5t26.5 95z" />
+<glyph unicode="&#x3d1;" horiz-adv-x="554" d="M544 290v-15q-34 -7 -84 -7q-1 -52 -10.5 -97.5t-30 -88t-59.5 -67.5t-93 -25q-99 0 -139.5 52t-40.5 144v22q0 55 -20 55q-13 0 -22.5 -11.5t-29.5 -50.5l-15 9q21 53 50 81.5t59 28.5q36 0 49 -20t13 -80v-51q0 -23 4.5 -46.5t15 -48.5t32 -40.5t50.5 -15.5 q99 0 99 213q0 30 -1 44q-118 20 -198.5 88t-80.5 165q0 78 45.5 116.5t103.5 38.5q60 0 97 -32t65 -89q54 -109 58 -263q20 -4 83 -9zM369 322l-7 77q-7 75 -20 126.5t-30.5 76.5t-34.5 34.5t-38 9.5q-29 0 -50 -23.5t-21 -63.5q0 -25 8 -52.5t27.5 -63t62.5 -68t103 -53.5 z" />
+<glyph unicode="&#x3d2;" horiz-adv-x="722" d="M395 416h3q7 44 22 86.5t39.5 83t62.5 65.5t84 25q36 0 64 -25.5t28 -60.5q0 -31 -16.5 -53.5t-46.5 -22.5q-24 0 -40.5 16t-16.5 40q0 17 10 31.5t19.5 23.5t9.5 12q0 13 -24 13q-47 0 -83.5 -46t-55.5 -114t-28 -129.5t-9 -109.5v-140q0 -57 19 -73t84 -19v-19h-306v19 q68 5 84.5 21.5t16.5 82.5v172q-22 175 -73 251.5t-132 77.5q-24 0 -73 -18l-8 16q26 23 63 37.5t71 14.5q192 0 232 -258z" />
+<glyph unicode="&#x3d5;" horiz-adv-x="623" d="M353 683v-223q70 0 108 -16q64 -26 98 -83.5t34 -129.5q0 -45 -13 -86t-39.5 -77t-75 -57t-112.5 -21v-207h-84v207h-24q-98 0 -157 71.5t-59 166.5q0 96 59 164t164 68h17v223h84zM352 18h31q60 0 90 52.5t30 133.5q0 95 -39.5 161.5t-111.5 66.5v-414zM270 18v414h-30 q-58 0 -89.5 -42t-31.5 -116q0 -130 54 -206q35 -50 97 -50z" />
+<glyph unicode="&#x3d6;" horiz-adv-x="762" d="M726 366h-86q46 -55 46 -162q0 -103 -47 -158.5t-117 -55.5q-38 0 -70.5 24t-48.5 72q-20 -50 -51.5 -73t-83.5 -23q-60 0 -104 56.5t-44 159.5q0 40 13 84.5t34 75.5h-44q-35 0 -57.5 -23.5t-44.5 -68.5h-15q9 64 48 120t100 56h572v-84zM558 366h-308q-40 -68 -40 -167 q0 -181 76 -181q70 0 90 129q-18 50 -18 84t11 60.5t35 26.5q22 0 33 -27.5t11 -60.5q0 -36 -18 -83q7 -59 31.5 -94t54.5 -35q80 0 80 188q0 42 -10.5 88.5t-27.5 71.5z" />
+<glyph unicode="&#x3d8;" horiz-adv-x="722" d="M310 -94v84q-125 17 -200.5 110t-75.5 234q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5q0 -140 -76 -232t-200 -109v-96q0 -57 17 -73t79 -19v-19h-292v19q63 4 78.5 21t15.5 83zM574 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67 q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#x3d9;" horiz-adv-x="500" d="M207 -217v211q-78 14 -128 78t-50 156q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5q0 -92 -48.5 -157t-130.5 -80v-211h-84zM380 204q0 114 -50 178q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="&#x3da;" horiz-adv-x="667" d="M228 -146l21 25q24 -25 63.5 -39t77.5 -14q67 0 106 28q47 35 47 96q0 84 -152 110q-30 5 -98 12q-46 4 -80 11t-71 23t-60.5 40.5t-38.5 65t-15 94.5q0 101 65.5 188.5t160 134.5t186.5 47q166 0 166 -85q0 -22 -14 -37.5t-44 -15.5q-20 0 -33.5 12.5t-20.5 27.5 t-30.5 27.5t-62.5 12.5q-118 0 -208.5 -77t-90.5 -186q0 -47 18.5 -79.5t47 -48.5t70.5 -26.5t81.5 -14t87.5 -12t82 -20.5q133 -46 133 -173q0 -92 -66 -145.5t-160 -53.5q-103 0 -168 72z" />
+<glyph unicode="&#x3db;" horiz-adv-x="461" d="M421 490h15q0 -118 -44.5 -171t-145.5 -62q-81 -8 -114 -25q-50 -26 -50 -82q0 -34 21 -59t56 -25q9 0 48 8t50 8q77 0 113.5 -34.5t36.5 -107.5q0 -64 -47 -111t-96 -47q-31 0 -51.5 14.5t-20.5 41.5q0 18 11 29.5t31 11.5q10 0 28 -14.5t33 -14.5q32 0 56.5 23t24.5 58 q0 32 -25 50t-65 18q-3 0 -41 -4.5t-55 -4.5q-69 0 -112 35t-43 111q0 149 201 209q154 47 185 145z" />
+<glyph unicode="&#x3dc;" horiz-adv-x="556" d="M546 519h-25q-11 68 -37.5 86.5t-116.5 18.5h-132q-21 0 -27.5 -7.5t-6.5 -31.5v-217h248v-41h-248v-215q0 -57 16.5 -73.5t74.5 -19.5v-19h-281v19q57 4 72.5 21.5t15.5 82.5v428q0 55 -15 71.5t-72 20.5v19h529z" />
+<glyph unicode="&#x3dd;" horiz-adv-x="470" d="M435 390h-275v-260h225v-40h-225v-280h-80v640h355v-60z" />
+<glyph unicode="&#x3de;" horiz-adv-x="703" d="M678 542l-221 -394q-5 -8 -12 -29t-7 -31q0 -49 38 -49q44 0 89 34l12 -15q-73 -72 -137 -72q-49 0 -74.5 26t-25.5 61q0 27 14.5 58t55.5 86l148 201l-532 -191l-13 13l222 395q5 8 12 29t7 31q0 49 -38 49q-44 0 -89 -34l-12 15q73 72 137 72q49 0 74.5 -26t25.5 -61 q0 -27 -14.5 -58t-55.5 -86l-149 -201l533 191z" />
+<glyph unicode="&#x3df;" horiz-adv-x="511" d="M455 373l-209 -373h-100l183 289h-265l209 373h100l-183 -289h265z" />
+<glyph unicode="&#x3e0;" horiz-adv-x="801" d="M40 508l-29 21q76 79 158.5 113t184.5 34q80 0 153.5 -32t132 -90t93 -148t34.5 -199q0 -101 -46.5 -195t-125.5 -156.5t-171 -73.5v35q98 23 169 126.5t71 216.5q0 136 -62 257q-56 -10 -97.5 -56t-62.5 -111t-30.5 -127.5t-9.5 -122.5h-102q0 60 17.5 130t50 138 t88.5 119.5t125 66.5q-47 73 -125 116.5t-159 43.5q-25 0 -46 -4v-289h-44v279q-95 -27 -167 -92z" />
+<glyph unicode="&#x3e1;" horiz-adv-x="528" d="M-6 543l12 30q137 -46 246 -128t157 -165q78 -135 78 -302q0 -95 -25 -194l-33 6q6 46 6 92q0 134 -62 271l-170 -98l-16 28l172 99q-8 17 -28 53q-10 17 -32 51l-172 -99l-16 28l169 97q-116 157 -286 231z" />
+<glyph unicode="&#x3f0;" horiz-adv-x="551" d="M515 450l-138 -168q-18 -47 -18 -112q0 -104 58 -104q7 0 18 11t30 11q16 0 27 -10.5t11 -25.5q0 -32 -21 -47t-54 -15q-50 0 -76.5 43.5t-26.5 97.5t16 110h-2l-194 -241h-103l140 170q18 43 18 127q0 38 -15 62.5t-43 24.5q-6 0 -18.5 -12t-32.5 -12q-14 0 -25 11 t-11 25q0 31 22 47.5t50 16.5q49 0 78 -39.5t29 -100.5q0 -41 -14 -111h2l190 241h103z" />
+<glyph unicode="&#x3f1;" horiz-adv-x="500" d="M426 -215h-16q-4 26 -32 38t-70 17.5t-87.5 15.5t-91 42.5t-72.5 86.5q-28 57 -28 193q0 37 6.5 73.5t23 75t42 67.5t66.5 47.5t92 18.5q97 0 154 -65.5t57 -174.5q0 -94 -58.5 -162t-150.5 -68q-128 0 -171 90l-2 -1q18 -61 61 -95.5t90 -45.5t92 -19.5t74 -29.5t29 -63 q0 -17 -8 -41zM380 217q0 85 -43.5 150t-96.5 65q-56 0 -88.5 -40t-32.5 -119q0 -63 14.5 -119t49 -96t83.5 -40q33 0 56.5 18.5t35.5 50t17 63.5t5 67z" />
+<glyph unicode="&#x3f4;" horiz-adv-x="722" d="M688 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM148 359h425q-6 163 -90 234q-56 47 -123 47q-85 0 -143 -67q-29 -33 -47 -90.5t-22 -123.5zM574 315h-426q3 -169 90 -248q49 -45 124 -45 q78 0 129 48q78 75 83 245z" />
+<glyph unicode="&#x3f5;" horiz-adv-x="439" d="M392 113l15 -8q-59 -115 -183 -115q-89 0 -144 68t-55 159q0 98 59 170.5t153 72.5q31 0 59 -10t39 -10q15 0 17 20h16l14 -135h-16q-10 25 -16 37.5t-20.5 32t-37 28t-53.5 8.5q-51 0 -87.5 -57t-36.5 -119h195v-32h-195q0 -79 35.5 -135.5t95.5 -56.5q85 0 146 82z" />
+<glyph unicode="&#x3f6;" horiz-adv-x="444" d="M47 337l-15 8q59 115 183 115q89 0 144 -68t55 -159q0 -98 -59 -170.5t-153 -72.5q-31 0 -59 10t-39 10q-15 0 -17 -20h-16l-14 135h16q10 -25 16 -37.5t20.5 -32t37 -28t53.5 -8.5q51 0 87.5 57t36.5 119h-195v32h195q0 79 -35.5 135.5t-95.5 56.5q-85 0 -146 -82z" />
+<glyph unicode="&#x401;" horiz-adv-x="629" d="M607 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-24q-11 67 -39.5 86t-115.5 19h-131q-22 0 -28.5 -6.5t-6.5 -29.5v-221h151q63 0 83.5 18t29.5 78h23v-233h-23q-9 63 -29 80t-84 17h-151v-242q0 -30 21 -38.5t80 -8.5h36 q107 0 152 25.5t79 105.5h28zM485 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM286 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#x402;" horiz-adv-x="756" d="M327 596v-263q38 49 89 77q47 26 116 26q49 0 83.5 -22.5t52 -61t25 -80t7.5 -90.5q0 -193 -58 -292q-46 -79 -127 -79q-42 0 -73 22t-31 59q0 25 15 45t43 20q21 0 36 -14t15 -36q0 -6 -2.5 -18.5t-2.5 -16.5q0 -24 18 -24q52 0 52 324q0 37 -0.5 55.5t-3 46.5t-9 42 t-17.5 29t-28.5 21t-42.5 6q-36 0 -78.5 -19.5t-78.5 -58.5v-175q0 -60 16 -78.5t69 -21.5v-19h-283v19q60 2 78 19t18 81v469q0 36 -34 36h-15q-69 0 -90.5 -16.5t-36.5 -78.5q-4 -15 -7 -35h-24l7 168h512l5 -168h-24q-1 9 -10 40q-16 55 -47 72.5t-90 17.5h-9 q-19 0 -27 -6t-8 -22z" />
+<glyph unicode="&#x403;" horiz-adv-x="571" d="M544 483h-24q-3 27 -10 50q-26 91 -126 91h-141q-22 0 -28.5 -6.5t-6.5 -29.5v-476q0 -56 16.5 -73t74.5 -20v-19h-280v19q56 4 71.5 20.5t15.5 74.5v436q0 56 -15.5 73t-71.5 20v19h520zM251 757l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40z" />
+<glyph unicode="&#x404;" horiz-adv-x="651" d="M602 129l19 -18q-85 -125 -251 -125q-70 0 -132 23t-104 66q-96 99 -96 244q0 144 86 249q89 108 233 108q62 0 114 -15q60 -18 69 -18q32 0 40 33h20l4 -228h-24q-16 81 -44 112q-68 76 -157 76q-98 0 -158 -74t-66 -195h291v-44h-292q0 -101 35 -168q30 -58 81 -91.5 t119 -33.5q62 0 109 22.5t104 76.5z" />
+<glyph unicode="&#x405;" horiz-adv-x="556" d="M488 463h-25q-17 62 -41 94q-65 83 -145 83q-45 0 -73 -29t-28 -71q0 -20 10 -39t21.5 -32.5t40.5 -33.5t47 -31l60 -35q81 -47 118 -93.5t37 -102.5q0 -83 -58 -135t-146 -52q-65 0 -118 23q-26 11 -47 11q-12 0 -20 -9t-8 -24h-22l-29 212h22q67 -177 206 -177 q52 0 85 31t33 81q0 47 -29 79q-49 53 -167 116q-122 65 -122 172q0 80 49 127.5t125 47.5q53 0 105 -22q27 -12 44 -12q26 0 32 34h21z" />
+<glyph unicode="&#x406;" horiz-adv-x="333" d="M315 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#x407;" horiz-adv-x="333" d="M323 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM124 822q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM322 0h-297v19q63 2 80 18.5t17 74.5v439q0 58 -16 73 t-81 19v19h297v-19q-63 -3 -80.5 -19t-17.5 -73v-439q0 -56 18 -73.5t80 -19.5v-19z" />
+<glyph unicode="&#x408;" horiz-adv-x="373" d="M354 662v-19q-61 -5 -76.5 -20.5t-15.5 -73.5v-364q0 -199 -167 -199q-46 0 -73.5 19t-27.5 53q0 20 14.5 36t34.5 16q33 0 49 -42q2 -5 5 -14l5 -12q1 -5 4 -9.5t7 -6.5t10 -2q22 0 29.5 15.5t7.5 54.5v456q0 59 -15 73.5t-78 19.5v19h287z" />
+<glyph unicode="&#x409;" horiz-adv-x="988" d="M576 366h109q124 0 196.5 -44t72.5 -140q0 -85 -64.5 -133.5t-174.5 -48.5h-337v19q59 2 77.5 19.5t18.5 74.5v472q0 21 -7.5 30t-27.5 9h-141q-21 0 -28 -9t-7 -30v-324q0 -29 -0.5 -47.5t-3.5 -50t-8.5 -53t-16.5 -47t-26.5 -41t-40 -26t-55.5 -10.5q-49 0 -75.5 16 t-26.5 57q0 27 18 41t38 14q19 0 31.5 -12.5t18 -27t13 -27t17.5 -12.5q16 0 28.5 11t20 32.5t12 44.5t7 55.5t3 56.5t0.5 55v260q0 55 -19.5 73.5t-66.5 19.5v19h534v-19q-57 -5 -73 -21.5t-16 -73.5v-182zM576 326v-243q0 -25 13.5 -35t48.5 -10q96 0 148.5 29.5 t52.5 111.5q0 147 -185 147h-78z" />
+<glyph unicode="&#x40a;" horiz-adv-x="1017" d="M605 366h109q124 0 196.5 -44t72.5 -140q0 -85 -64.5 -133.5t-174.5 -48.5h-337v19q59 2 77.5 19.5t18.5 74.5v213h-293v-213q0 -55 16.5 -73t71.5 -21v-19h-279v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h279v-19q-56 -5 -72 -21.5t-16 -73.5v-182h293 v182q0 59 -15 74.5t-73 20.5v19h279v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-182zM605 326v-243q0 -25 13.5 -35t48.5 -10q96 0 148.5 29.5t52.5 111.5q0 147 -185 147h-78z" />
+<glyph unicode="&#x40b;" horiz-adv-x="803" d="M786 0h-283v19q60 2 78 19t18 81v120q0 63 -30 98t-78 35q-92 0 -164 -78v-175q0 -59 17.5 -78t71.5 -22v-19h-287v19q60 2 78 19t18 81v469q0 36 -34 36h-15q-69 0 -90.5 -16.5t-36.5 -78.5q-4 -13 -7 -37h-24l7 170h510l5 -168h-24q-1 9 -10 40q-16 55 -46 72.5 t-89 17.5h-9q-19 0 -27 -6t-8 -22v-263q29 37 104 77q49 26 102 26q79 0 123.5 -49.5t44.5 -145.5v-122q0 -60 16 -78.5t69 -21.5v-19z" />
+<glyph unicode="&#x40c;" horiz-adv-x="690" d="M686 0h-191q-37 33 -118 171q-33 55 -63.5 91t-45.5 46q-20 13 -56 14v-211q0 -56 16 -71.5t73 -20.5v-19h-282v19q58 3 74.5 23.5t16.5 86.5v420q0 56 -16 73t-74 21v19h282v-19q-61 -4 -75.5 -20t-14.5 -75v-186q53 0 71 7q27 10 47 25.5t34.5 40.5t23 44t20.5 55 q24 70 58 106t96 36q36 0 55.5 -17.5t19.5 -45.5q0 -21 -12.5 -39.5t-36.5 -18.5q-19 0 -32 9t-17.5 19.5t-11 19.5t-14.5 9q-16 0 -31 -19.5t-22.5 -38t-19.5 -53.5q-43 -125 -112 -156v-2q42 -17 71.5 -42.5t61.5 -71.5l37 -55l34 -51q12 -17 26.5 -35t26.5 -28 q49 -40 101 -41v-19zM255 757l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40z" />
+<glyph unicode="&#x40e;" horiz-adv-x="711" d="M694 662v-18q-72 -9 -111 -100l-127 -300q-52 -120 -80 -165q-59 -94 -143 -94q-34 0 -57 14.5t-23 39.5q0 18 12.5 30t33.5 12q20 0 49 -17q17 -10 28 -10q39 0 87 80l-240 422q-25 44 -49 63t-59 25v18h268v-18q-71 -3 -71 -38q0 -24 53 -116l144 -254l106 254 q33 80 33 107q0 38 -62 47v18h208zM510 848q0 -42 -44 -66.5t-91 -24.5t-91 24.5t-44 66.5q0 31 19.5 49t42.5 18q24 0 24 -25q0 -18 -22 -24t-22 -17q0 -40 93 -40t93 40q0 11 -22 17t-22 24q0 25 27 25q24 0 41.5 -18t17.5 -49z" />
+<glyph unicode="&#x40f;" horiz-adv-x="715" d="M696 0h-189q-97 0 -126 -101q-7 -23 -10 -50v-2h-24v2q0 1 -4 21.5t-6 28.5q-29 101 -126 101h-192v19q56 5 72.5 21.5t16.5 73.5v437q0 53 -16.5 70.5t-72.5 21.5v19h279v-19q-58 -4 -73 -22.5t-15 -82.5v-470q0 -19 6.5 -24.5t28.5 -5.5h225q22 0 28.5 5.5t6.5 25.5 v480q0 55 -16 73t-71 21v19h278v-19q-59 -4 -74 -21.5t-15 -81.5v-426q0 -57 17 -73t72 -22v-19z" />
+<glyph unicode="&#x410;" horiz-adv-x="713" d="M701 0h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19h-199v19q42 4 61 30.5t65 136.5l206 488h20l246 -563q22 -52 39.5 -70t54.5 -22v-19zM441 256l-116 276l-115 -276h231z" />
+<glyph unicode="&#x411;" horiz-adv-x="611" d="M217 366h74q43 0 78 -3t76 -14.5t68 -30.5t45.5 -54t18.5 -82q0 -83 -65 -132.5t-174 -49.5h-319v19q59 2 77.5 19.5t18.5 74.5v437q0 58 -17 73.5t-79 19.5v19h512l5 -168h-24q-1 9 -10 40q-26 90 -126 90h-124q-21 0 -28 -7.5t-7 -28.5v-222zM217 326v-243 q0 -28 7 -36.5t37 -8.5q96 0 148.5 29.5t52.5 111.5q0 147 -185 147h-60z" />
+<glyph unicode="&#x412;" horiz-adv-x="651" d="M424 359v-1q75 -12 122 -55q49 -44 49 -115q0 -84 -65.5 -136t-173.5 -52h-337v19q59 2 77.5 19.5t18.5 74.5v437q0 58 -17 73.5t-79 19.5v19h280q262 0 262 -157q0 -68 -41 -104q-29 -25 -96 -42zM217 376h92q150 0 150 124t-177 124h-41q-24 0 -24 -32v-216zM217 336 v-253q0 -25 13.5 -35t48.5 -10q68 0 100 7.5t63 35.5q38 33 38 108q0 76 -47 107q-42 28 -80 34t-136 6z" />
+<glyph unicode="&#x413;" horiz-adv-x="571" d="M544 483h-24q-3 27 -10 50q-26 91 -126 91h-141q-22 0 -28.5 -6.5t-6.5 -29.5v-476q0 -56 16.5 -73t74.5 -20v-19h-280v19q56 4 71.5 20.5t15.5 74.5v436q0 56 -15.5 73t-71.5 20v19h520z" />
+<glyph unicode="&#x414;" horiz-adv-x="665" d="M646 -153h-24q-4 30 -10 52q-29 101 -126 101h-312q-97 0 -126 -101q-6 -22 -10 -52h-24v172h20q54 0 85.5 51.5t45.5 166t15 313.5q0 55 -19.5 73.5t-66.5 19.5v19h552v-19q-57 -5 -73 -21.5t-16 -73.5v-433q0 -52 17 -74t72 -22v-172zM455 82v506q0 21 -7.5 28.5 t-27.5 7.5h-159q-15 0 -21 -1.5t-10 -9t-4 -25.5q0 -239 -16 -364t-57 -186h265q21 0 29 10t8 34z" />
+<glyph unicode="&#x415;" horiz-adv-x="629" d="M607 169l-46 -169h-539v19q57 4 72 20.5t15 74.5v436q0 56 -15.5 73t-71.5 20v19h530l4 -143h-24q-11 67 -39.5 86t-115.5 19h-131q-22 0 -28.5 -6.5t-6.5 -29.5v-221h151q63 0 83.5 18t29.5 78h23v-233h-23q-9 63 -29 80t-84 17h-151v-242q0 -30 21 -38.5t80 -8.5h36 q107 0 152 25.5t79 105.5h28z" />
+<glyph unicode="&#x416;" horiz-adv-x="1021" d="M1013 0h-191q-36 33 -118 167q-15 24 -32 54l-24 43q-7 12 -17.5 27t-19.5 19.5t-21.5 8t-30.5 3.5v-211q0 -57 16 -72.5t71 -19.5v-19h-261v19q53 3 65 18.5t12 73.5v211q-22 0 -35 -3t-26.5 -17t-20.5 -25l-26 -47q-20 -36 -37 -63q-82 -134 -118 -167h-191v19 q30 5 53.5 15t38.5 19t34 31t28 36l34 48l37 57q35 51 62 77t66 42l2 2q-35 16 -58.5 52t-48.5 103q-13 35 -20.5 52.5t-22.5 36.5t-31 19q-8 0 -14.5 -9t-11.5 -19.5t-17.5 -19.5t-32.5 -9q-24 0 -36.5 18t-12.5 39q0 28 21.5 47.5t57.5 19.5q59 0 92 -36t59 -106 q17 -44 28.5 -68.5t31.5 -52t48 -39.5t67 -12v187q0 58 -15 74.5t-75 19.5v19h277v-19q-61 -4 -75.5 -20t-14.5 -75v-186q22 0 41 4t32 8.5t26 17.5l19 20q7 7 16.5 26t12.5 28l14 34l13 34q28 72 60 107t91 35q36 0 57.5 -19.5t21.5 -47.5q0 -21 -12.5 -39t-36.5 -18 q-20 0 -32.5 9t-17.5 19.5t-11.5 19.5t-14.5 9q-16 0 -31 -19t-22.5 -36.5t-20.5 -52.5q-25 -67 -48.5 -103t-58.5 -52l3 -2q39 -16 66 -42t62 -77l38 -57l32 -48q10 -14 29 -36t34 -31t38.5 -19t53.5 -15v-19z" />
+<glyph unicode="&#x417;" horiz-adv-x="576" d="M354 349v-1q74 -5 132.5 -48.5t58.5 -109.5q0 -107 -100 -164q-70 -40 -163 -40q-167 0 -254 128l18 17q57 -54 104.5 -77.5t105.5 -23.5q85 0 129.5 39t44.5 113q0 69 -62 110q-33 21 -62 27.5t-97 6.5v40q64 0 89 5t53 22q58 34 58 121q0 54 -40.5 89t-107.5 35 q-79 0 -129 -54t-62 -144h-24l4 236h20q8 -33 38 -33q11 0 71 18q55 15 105 15q117 0 172 -46t55 -123q0 -64 -46 -107.5t-111 -50.5z" />
+<glyph unicode="&#x418;" horiz-adv-x="723" d="M704 0h-279v19q58 4 73 22.5t15 82.5v379l-303 -407q0 -43 18 -59t69 -18l1 -19h-279v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-384l303 405q0 41 -18 55t-71 19v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5 v-437q0 -53 16.5 -70.5t72.5 -21.5v-19z" />
+<glyph unicode="&#x419;" horiz-adv-x="723" d="M496 848q0 -42 -44 -66.5t-91 -24.5t-91 24.5t-44 66.5q0 31 19.5 49t42.5 18q24 0 24 -25q0 -18 -22 -24t-22 -17q0 -40 93 -40t93 40q0 11 -22 17t-22 24q0 25 27 25q24 0 41.5 -18t17.5 -49zM704 0h-279v19q58 4 73 22.5t15 82.5v379l-303 -407q1 -44 18.5 -59.5 t68.5 -17.5l1 -19h-279v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-384l302 405q-2 44 -18.5 56.5t-69.5 17.5v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-437q0 -53 16.5 -70.5t72.5 -21.5v-19z" />
+<glyph unicode="&#x41a;" horiz-adv-x="690" d="M686 0h-191q-37 33 -118 171q-33 55 -63.5 91t-45.5 46q-20 13 -56 14v-211q0 -56 16 -71.5t73 -20.5v-19h-282v19q58 3 74.5 23.5t16.5 86.5v420q0 56 -16 73t-74 21v19h282v-19q-61 -4 -75.5 -20t-14.5 -75v-186q53 0 71 7q27 10 47 25.5t34.5 40.5t23 44t20.5 55 q24 70 58 106t96 36q36 0 55.5 -17.5t19.5 -45.5q0 -21 -12.5 -39.5t-36.5 -18.5q-19 0 -32 9t-17.5 19.5t-11 19.5t-14.5 9q-16 0 -31 -19.5t-22.5 -38t-19.5 -53.5q-43 -125 -112 -156v-2q42 -17 71.5 -42.5t61.5 -71.5l37 -55l34 -51q12 -17 26.5 -35t26.5 -28 q49 -40 101 -41v-19z" />
+<glyph unicode="&#x41b;" horiz-adv-x="683" d="M664 0h-279v19q58 4 73 22.5t15 83.5v460q0 21 -7.5 30t-27.5 9h-141q-21 0 -28 -9t-7 -30v-324q0 -29 -0.5 -47.5t-3.5 -50t-8.5 -53t-16.5 -47t-26.5 -41t-40 -26t-55.5 -10.5q-49 0 -75.5 16t-26.5 57q0 27 18 41t38 14q19 0 31.5 -12.5t18 -27t13 -27t17.5 -12.5 q16 0 28.5 11t20 32.5t12 44.5t7 55.5t3 56.5t0.5 55v260q0 55 -19.5 73.5t-66.5 19.5v19h534v-19q-57 -5 -73 -21.5t-16 -73.5v-437q0 -53 16.5 -70.5t72.5 -21.5v-19z" />
+<glyph unicode="&#x41c;" horiz-adv-x="893" d="M871 0h-280v19q59 4 74.5 22.5t15.5 81.5v449l-255 -572h-14l-252 549v-398q0 -81 17 -105t76 -27v-19h-234v19q44 3 63 13t26.5 35.5t7.5 83.5v398q0 57 -17 73.5t-78 20.5v19h198l231 -502l221 502h199v-19q-54 -1 -70.5 -19t-16.5 -74v-438q0 -53 16.5 -71t71.5 -22 v-19z" />
+<glyph unicode="&#x41d;" horiz-adv-x="726" d="M704 0h-279v19q58 4 73 22.5t15 82.5v191h-303v-202q0 -55 16.5 -73t71.5 -21v-19h-279v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h279v-19q-56 -5 -72 -21.5t-16 -73.5v-189h303v189q0 59 -15 74.5t-73 20.5v19h279v-19q-56 -5 -72.5 -21.5t-16.5 -73.5 v-437q0 -53 16.5 -70.5t72.5 -21.5v-19z" />
+<glyph unicode="&#x41e;" horiz-adv-x="729" d="M690 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM576 337q0 85 -24 152.5t-67 103.5q-56 47 -123 47q-85 0 -143 -67q-32 -36 -50.5 -102.5t-18.5 -138.5q0 -182 90 -265q49 -45 124 -45 q78 0 129 48q83 80 83 267z" />
+<glyph unicode="&#x41f;" horiz-adv-x="724" d="M705 0h-279v19q58 4 73 22.5t15 82.5v460q0 23 -8 31.5t-29 8.5h-229q-22 0 -30 -8.5t-8 -32.5v-470q0 -55 16.5 -73t71.5 -21v-19h-279v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h686v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-437q0 -53 16.5 -70.5 t72.5 -21.5v-19z" />
+<glyph unicode="&#x420;" horiz-adv-x="571" d="M19 662h249q142 0 217 -63q50 -42 50 -119q0 -80 -57 -131q-42 -38 -86 -49.5t-128 -11.5q-18 0 -59 3v-179q0 -57 16.5 -73.5t77.5 -19.5v-19h-280v19q58 4 71 21t13 82v429q0 56 -14.5 72t-69.5 20v19zM205 588v-257q35 -3 51 -3q81 0 125.5 39.5t44.5 107.5 q0 82 -42 115.5t-144 33.5q-21 0 -28 -7.5t-7 -28.5z" />
+<glyph unicode="&#x421;" horiz-adv-x="677" d="M622 131l19 -18q-89 -127 -273 -127q-145 0 -236 89q-96 94 -96 250q0 146 90 247q94 104 243 104q64 0 119 -15q63 -18 69 -18q33 0 42 33h20l9 -227h-23q-16 72 -52 111q-71 76 -161 76q-111 0 -175.5 -81.5t-64.5 -213.5q0 -161 72 -239q67 -72 178 -72q66 0 114 23 t106 78z" />
+<glyph unicode="&#x422;" horiz-adv-x="618" d="M592 492h-24q-17 83 -42.5 105.5t-104.5 22.5h-59v-509q0 -57 17 -73t79 -19v-19h-292v19q63 4 78.5 21t15.5 83v497h-60q-79 0 -105 -22.5t-41 -105.5h-24l7 170h548z" />
+<glyph unicode="&#x423;" horiz-adv-x="711" d="M694 662v-18q-72 -9 -111 -100l-127 -300q-52 -120 -80 -165q-59 -94 -143 -94q-34 0 -57 14.5t-23 39.5q0 18 12.5 30t33.5 12q20 0 49 -17q17 -10 28 -10q39 0 87 80l-240 422q-25 44 -49 63t-59 25v18h268v-18q-71 -3 -71 -38q0 -24 53 -116l144 -254l106 254 q33 80 33 107q0 38 -62 47v18h208z" />
+<glyph unicode="&#x424;" horiz-adv-x="769" d="M435 580v-20q55 0 105.5 -13t94 -39.5t70 -72t26.5 -105.5q0 -56 -26.5 -101.5t-68 -72t-87.5 -40t-89 -13.5h-25v-27q0 -32 20 -43t83 -14v-19h-306v19q101 0 101 56v28h-17q-136 0 -207 62t-71 165q0 60 25.5 105.5t69 72t94 39.5t106.5 13v20q0 36 -19.5 49.5 t-81.5 13.5v19h306v-19q-62 0 -82.5 -15t-20.5 -48zM433 523v-383q75 0 132 48.5t57 129.5t-49.5 143t-139.5 62zM335 140v383q-80 0 -134 -63.5t-54 -141.5q0 -74 50.5 -126t137.5 -52z" />
+<glyph unicode="&#x425;" horiz-adv-x="716" d="M703 0h-296v19l26 2q50 3 50 29q0 22 -51 98l-95 141l-119 -149q-53 -66 -53 -89q0 -15 16.5 -22t59.5 -10v-19h-232v19q39 4 63.5 23t81.5 91l156 195l-106 155q-70 102 -101 128.5t-82 31.5v19h301v-19l-29 -2q-24 -2 -35 -7t-11 -21q0 -6 1.5 -12.5t5.5 -15.5l9 -17 q4 -7 13 -20l14 -22l19 -28l21 -30l44 -64l112 140q40 49 40 67q0 17 -14 24t-54 8v19h237v-19q-48 -3 -76 -21.5t-76 -77.5l-143 -177l192 -274q29 -42 50 -55.5t61 -18.5v-19z" />
+<glyph unicode="&#x426;" horiz-adv-x="715" d="M696 -153h-24q-4 30 -10 52q-29 101 -126 101h-517v19q56 5 72.5 21.5t16.5 73.5v437q0 53 -16.5 70.5t-72.5 21.5v19h279v-19q-58 -4 -73 -22.5t-15 -82.5v-470q0 -19 6.5 -24.5t28.5 -5.5h225q22 0 28.5 5.5t6.5 25.5v480q0 55 -16 73t-71 21v19h278v-19 q-59 -4 -74 -21.5t-15 -81.5v-426q0 -58 15.5 -74t73.5 -21v-172z" />
+<glyph unicode="&#x427;" horiz-adv-x="657" d="M639 0h-279v19q56 5 72 21.5t16 73.5v201q-87 -46 -182 -46q-87 0 -130.5 30.5t-43.5 123.5v124q0 59 -15.5 75t-73.5 21v19h275v-19q-55 -5 -69.5 -21t-14.5 -75v-115q0 -66 25.5 -92.5t90.5 -26.5q18 0 35.5 2.5t35 7.5t27.5 9l24 9l16 6v220q0 46 -12 59t-63 17v19 h266v-19q-57 -5 -73 -22.5t-16 -82.5v-424q0 -57 16 -73.5t73 -21.5v-19z" />
+<glyph unicode="&#x428;" horiz-adv-x="994" d="M965 0h-936v19q56 5 72.5 21.5t16.5 73.5v437q0 53 -16.5 70.5t-72.5 21.5v19h266v-19q-48 0 -61.5 -20t-13.5 -85v-470q0 -19 6.5 -24.5t28.5 -5.5h151q22 0 28.5 5.5t6.5 25.5v482q0 54 -13 70t-62 22v19h265v-19q-58 -4 -73 -22.5t-15 -82.5v-471q0 -18 7 -23.5 t28 -5.5h163q20 0 26.5 5.5t6.5 25.5v480q0 55 -16 73t-71 21l-1 19h279v-19q-59 -4 -74 -21.5t-15 -81.5v-426q0 -58 15.5 -74t73.5 -21v-19z" />
+<glyph unicode="&#x429;" horiz-adv-x="994" d="M965 -153h-24q0 17 -10 52q-29 101 -126 101h-776v19q56 5 72.5 21.5t16.5 73.5v437q0 53 -16.5 70.5t-72.5 21.5v19h266v-19q-48 0 -61.5 -20t-13.5 -85v-470q0 -19 6.5 -24.5t28.5 -5.5h151q22 0 28.5 5.5t6.5 25.5v482q0 54 -13 70t-62 22v19h265v-19 q-58 -4 -73 -22.5t-15 -82.5v-471q0 -18 7 -23.5t28 -5.5h163q20 0 26.5 5.5t6.5 25.5v480q0 55 -16 73t-71 21l-1 19h279v-19q-59 -4 -74 -21.5t-15 -81.5v-426q0 -58 15.5 -74t73.5 -21v-172z" />
+<glyph unicode="&#x42a;" horiz-adv-x="737" d="M342 366h96q265 0 265 -184q0 -85 -65.5 -133.5t-175.5 -48.5h-318v19q59 2 77.5 19.5t18.5 74.5v507h-60q-79 0 -103.5 -22t-39.5 -106h-24l7 170h418v-19q-58 -5 -77 -22t-19 -73v-182zM342 326v-243q0 -26 10 -35.5t39 -9.5q45 0 77 5.5t61 20t44 43.5t15 72 q0 147 -181 147h-65z" />
+<glyph unicode="&#x42b;" horiz-adv-x="884" d="M865 0h-280v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h280v-19q-56 -5 -72.5 -21.5t-16.5 -73.5v-434q0 -55 17 -73.5t72 -21.5v-19zM217 366h99q263 0 263 -184q0 -85 -64.5 -133.5t-174.5 -48.5h-321v19q59 2 77.5 19.5t18.5 74.5v437q0 58 -17 73.5 t-79 19.5v19h294v-19q-58 -5 -77 -22t-19 -73v-182zM217 326v-243q0 -27 9.5 -36t42.5 -9q95 0 145 29t50 112q0 147 -179 147h-68z" />
+<glyph unicode="&#x42c;" horiz-adv-x="612" d="M217 366h99q262 0 262 -184q0 -85 -64.5 -133.5t-174.5 -48.5h-320v19q59 2 77.5 19.5t18.5 74.5v437q0 58 -17 73.5t-79 19.5v19h294v-19q-58 -5 -77 -22t-19 -73v-182zM217 326v-243q0 -27 9.5 -36t42.5 -9q95 0 144.5 29t49.5 112q0 147 -178 147h-68z" />
+<glyph unicode="&#x42d;" horiz-adv-x="651" d="M51 676h20q8 -33 40 -33q9 0 69 18q52 15 114 15q144 0 233 -108q86 -105 86 -249q0 -145 -96 -244q-42 -43 -104 -66t-132 -23q-166 0 -251 125l19 18q57 -54 104 -76.5t109 -22.5q68 0 119 33.5t81 91.5q35 67 35 168h-292v44h291q-6 121 -66 195t-158 74 q-89 0 -157 -76q-28 -31 -44 -112h-24z" />
+<glyph unicode="&#x42e;" horiz-adv-x="902" d="M210 359h88q7 142 84.5 229.5t198.5 87.5q125 0 203.5 -97.5t78.5 -247.5q0 -154 -79 -249.5t-203 -95.5q-122 0 -200 90.5t-83 238.5h-88v-202q0 -55 16.5 -73t71.5 -21v-19h-279v19q59 4 74 21.5t15 81.5v426q0 58 -15.5 74t-73.5 21v19h279v-19q-56 -5 -72 -21.5 t-16 -73.5v-189zM755 337q0 188 -69 256q-49 47 -106 47q-73 0 -124 -67q-50 -68 -50 -241q0 -192 68 -265q44 -45 108 -45q67 0 111 48q62 70 62 267z" />
+<glyph unicode="&#x42f;" horiz-adv-x="637" d="M618 0h-280v19q61 3 77.5 19.5t16.5 73.5v198h-37l-230 -310h-162v19q59 4 94 50l185 246q-92 11 -144.5 54.5t-52.5 121.5q0 52 20.5 87t60 52.5t85 24.5t108.5 7h259v-19q-55 -4 -69.5 -20t-14.5 -72v-429q0 -65 13 -82t71 -21v-19zM432 348v225q0 29 -11.5 40 t-40.5 11q-78 0 -113 -15q-73 -32 -73 -121q0 -67 48 -103.5t131 -36.5h59z" />
+<glyph unicode="&#x430;" horiz-adv-x="450" d="M446 66v-28q-38 -48 -90 -48q-57 0 -64 73h-1q-64 -73 -149 -73q-47 0 -76 27.5t-29 76.5q0 70 70 117q43 29 184 81v54q0 44 -23 65.5t-59 21.5q-30 0 -50 -13t-20 -33q0 -9 3 -20t3 -22q0 -15 -13.5 -28t-32.5 -13q-17 0 -30 13t-13 33q0 48 51 80q47 30 115 30 q81 0 118 -45q19 -23 25.5 -45t6.5 -66v-191q0 -66 31 -66q20 0 43 19zM291 130v134q-91 -32 -132 -70q-34 -31 -34 -69t19 -57.5t50 -19.5q37 0 62 16q21 14 28 28.5t7 37.5z" />
+<glyph unicode="&#x431;" horiz-adv-x="507" d="M84 347l2 -1q55 114 176 114q93 0 154.5 -63.5t61.5 -165.5q0 -105 -62.5 -173t-162.5 -68q-104 0 -159 77t-55 186q0 45 6 91.5t23.5 100t45 94.5t75.5 68t110 27h67q35 0 52 11t23 40h20q-7 -93 -73 -118q-22 -8 -71 -9t-59 -2q-74 -9 -121.5 -69.5t-52.5 -139.5z M388 204q0 114 -50 178q-40 50 -95 50q-52 0 -83 -42.5t-31 -116.5q0 -128 53 -205q34 -50 88 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="&#x432;" horiz-adv-x="474" d="M307 237v-1q57 -6 94 -33.5t37 -76.5q0 -31 -16 -59t-43 -44q-41 -23 -104 -23h-251v15q40 1 51 12t11 50v297q0 39 -10 48.5t-52 12.5v15h211q175 0 175 -114q0 -45 -30 -70t-73 -29zM170 391v-113q0 -20 9 -25.5t42 -5.5q49 0 78 22t29 64q0 45 -27 67t-96 22 q-18 0 -26.5 -6t-8.5 -25zM170 193v-125q0 -23 9 -31.5t33 -8.5q63 0 99 21t36 76q0 25 -8 43t-20 27.5t-30.5 15t-34 7t-36.5 1.5q-30 0 -39 -5.5t-9 -20.5z" />
+<glyph unicode="&#x433;" horiz-adv-x="394" d="M387 309h-17q-10 60 -47.5 85.5t-127.5 25.5q-19 0 -25.5 -7t-6.5 -25v-316q0 -31 12 -42.5t50 -14.5v-15h-208v15q41 3 51.5 12.5t10.5 51.5v309q0 31 -10.5 38t-51.5 9v15h365z" />
+<glyph unicode="&#x434;" horiz-adv-x="462" d="M439 450v-15q-40 -3 -51 -14.5t-11 -54.5v-284q0 -45 10 -54.5t51 -12.5v-152h-18q-24 86 -45 111.5t-53 25.5h-186q-31 0 -56 -26.5t-48 -110.5h-18v152q59 0 79 42.5t20 141.5v167q0 38 -15.5 51.5t-55.5 17.5v15h397zM293 81v298q0 28 -7 35.5t-33 7.5h-70 q-20 0 -28.5 -8.5t-8.5 -33.5v-201q0 -95 -30 -151h135q42 0 42 53z" />
+<glyph unicode="&#x435;" horiz-adv-x="466" d="M421 164l16 -7q-60 -167 -209 -167q-88 0 -139 61.5t-51 165.5q0 107 57 175t150 68q90 0 139 -69q28 -40 34 -116h-308q0 -89 37.5 -151t115.5 -62q50 0 85.5 23t72.5 79zM112 303h204q-9 65 -30 94.5t-68 29.5q-41 0 -69.5 -33.5t-36.5 -90.5z" />
+<glyph unicode="&#x436;" horiz-adv-x="721" d="M707 0h-132l-102 164q-25 40 -35.5 48.5t-36.5 12.5v-158q0 -27 9.5 -38.5t38.5 -12.5l20 -1v-15h-218v15l23 2q23 2 33 13.5t10 36.5v158q-22 -2 -33 -11t-36 -49l-102 -165h-132v15q34 3 53 19q35 32 58 81q29 61 53.5 87t62.5 38v2q-30 15 -49 40t-25.5 45.5t-15.5 36 t-22 15.5q-5 0 -24 -7.5t-32 -7.5q-20 0 -32.5 12t-12.5 32q0 22 17 35t42 13q33 0 53.5 -15.5t35.5 -47.5l14 -31q13 -26 19 -36.5t19 -28t26 -27.5q23 -17 63 -17v124q0 35 -11.5 45t-49.5 14v14h207v-14q-36 -4 -49 -16.5t-13 -40.5v-126q38 0 66 17q14 9 27.5 29.5 t31.5 56.5t24 46q30 54 83 54q28 0 44.5 -14t16.5 -34q0 -19 -13 -31.5t-33 -12.5q-12 0 -30 7.5t-24 7.5q-15 0 -26.5 -15t-19.5 -35t-26 -45.5t-42 -41.5v-2q38 -17 62.5 -42t53.5 -82q28 -54 58 -82q17 -16 53 -19v-15z" />
+<glyph unicode="&#x437;" horiz-adv-x="390" d="M228 242v-1q54 -5 91.5 -33.5t37.5 -78.5q0 -63 -62 -106q-49 -33 -125 -33q-55 0 -90 21.5t-66 65.5l14 14q39 -37 65.5 -51t64.5 -14q52 0 79.5 28.5t27.5 69.5q0 55 -36 78t-109 23v28q55 0 88 17q21 11 33 31.5t12 42.5q0 43 -22.5 65.5t-60.5 22.5q-53 0 -81 -34 t-40 -99h-17l7 161h13q5 -23 26 -23q6 0 18.5 5.5t17.5 6.5q39 11 58 11q69 0 106 -18q61 -30 61 -88q0 -42 -33.5 -73t-77.5 -39z" />
+<glyph unicode="&#x438;" horiz-adv-x="525" d="M502 450v-15q-40 -3 -51 -14.5t-11 -54.5v-287q0 -39 11 -49.5t50 -14.5v-15h-207v15q38 3 50 14.5t12 44.5v256l-187 -258q0 -31 12 -42.5t50 -14.5v-15h-208v15q41 3 51.5 12.5t10.5 51.5v287q0 40 -11.5 52.5t-49.5 16.5v15h207v-15q-40 -4 -51 -15t-11 -43v-256 l187 257q0 32 -12 43t-50 14v15h208z" />
+<glyph unicode="&#x439;" horiz-adv-x="525" d="M502 450v-15q-40 -3 -51 -14.5t-11 -54.5v-287q0 -39 11 -49.5t50 -14.5v-15h-207v15q38 3 50 14.5t12 44.5v256l-187 -258q0 -31 12 -42.5t50 -14.5v-15h-208v15q41 3 51.5 12.5t10.5 51.5v287q0 40 -11.5 52.5t-49.5 16.5v15h207v-15q-40 -4 -51 -15t-11 -43v-256 l187 257q0 32 -12 43t-50 14v15h208zM402 637q0 -42 -44 -66.5t-91 -24.5t-91 24.5t-44 66.5q0 31 19.5 49t42.5 18q24 0 24 -25q0 -18 -22 -24t-22 -17q0 -40 93 -40t93 40q0 11 -22 17t-22 24q0 25 27 25q24 0 41.5 -18t17.5 -49z" />
+<glyph unicode="&#x43a;" horiz-adv-x="503" d="M495 0h-132l-109 164q-26 39 -36.5 48t-35.5 13v-158q0 -27 11 -38.5t41 -12.5l23 -1v-15h-234v15l28 2q28 2 37.5 13t9.5 37v310q0 35 -11.5 45t-49.5 14v14h207v-14q-36 -4 -49 -16.5t-13 -40.5v-126q38 0 66 17q10 6 21 21.5t18 28.5l19 38l17 34q34 64 91 64 q28 0 44.5 -14t16.5 -34q0 -19 -13 -31.5t-33 -12.5q-12 0 -30 7.5t-24 7.5q-15 0 -26.5 -15t-19.5 -35t-26 -45.5t-42 -41.5v-2q40 -18 67.5 -43.5t55.5 -80.5q28 -54 58 -82q17 -16 53 -19v-15z" />
+<glyph unicode="&#x43b;" horiz-adv-x="499" d="M476 450v-15q-40 -3 -51 -14.5t-11 -54.5v-287q0 -39 11 -49.5t50 -14.5v-15h-207v15q38 3 50 14.5t12 44.5v305q0 28 -7 35.5t-33 7.5h-70q-20 0 -28.5 -10t-8.5 -35v-198q0 -23 -1 -38.5t-3.5 -40.5t-9.5 -42t-18 -34t-30 -25.5t-43 -8.5q-70 0 -70 50q0 18 12 28 t26 10q21 0 34 -27t21 -27q49 0 49 175v167q0 40 -11.5 52.5t-49.5 16.5v15h387z" />
+<glyph unicode="&#x43c;" horiz-adv-x="617" d="M594 450v-15q-40 -3 -51 -14.5t-11 -54.5v-287q0 -39 11 -49.5t50 -14.5v-15h-213v15q41 3 54.5 14.5t13.5 44.5v274h-1l-152 -348h-9l-167 344h-1v-272q0 -31 13.5 -43.5t52.5 -13.5v-15h-161v15q41 3 51.5 12.5t10.5 51.5v287q0 40 -11.5 52.5t-49.5 16.5v15h134 l157 -326l143 326h136z" />
+<glyph unicode="&#x43d;" horiz-adv-x="525" d="M502 450v-15q-40 -3 -51 -14.5t-11 -54.5v-287q0 -39 11 -49.5t50 -14.5v-15h-207v15q38 3 50 14.5t12 44.5v141h-187v-143q0 -31 12 -42.5t50 -14.5v-15h-208v15q41 3 51.5 12.5t10.5 51.5v287q0 40 -11.5 52.5t-49.5 16.5v15h207v-15q-40 -4 -51 -15t-11 -43v-129h187 v130q0 32 -12 43t-50 14v15h208z" />
+<glyph unicode="&#x43e;" horiz-adv-x="512" d="M476 231q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5t-62 170.5q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5zM386 204q0 114 -50 178q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="&#x43f;" horiz-adv-x="525" d="M502 450v-15q-39 -2 -50.5 -12.5t-11.5 -54.5v-293q0 -38 10.5 -47t50.5 -13v-15h-204v15q37 3 48 14.5t11 44.5v298q0 50 -45 50h-100q-42 0 -42 -50v-300q0 -30 12.5 -42t49.5 -15v-15h-208v15q40 3 51 13.5t11 49.5v292q0 44 -10.5 53.5t-50.5 11.5v15h478z" />
+<glyph unicode="&#x440;" horiz-adv-x="499" d="M152 458v-77q63 79 144 79q73 0 120 -60t47 -153q0 -110 -57.5 -183.5t-146.5 -73.5q-60 0 -107 43v-159q0 -47 16 -61t72 -15v-15h-242v15q44 4 57 17t13 52v470q0 35 -8 46t-33 11q-16 0 -25 -1v16q70 21 144 51zM152 334v-246q0 -23 34.5 -45.5t69.5 -22.5 q54 0 87.5 52t33.5 135q0 88 -33.5 140.5t-89.5 52.5q-35 0 -68.5 -22t-33.5 -44z" />
+<glyph unicode="&#x441;" horiz-adv-x="456" d="M414 156l14 -9q-43 -84 -82 -115q-51 -42 -115 -42q-83 0 -136.5 62.5t-53.5 159.5q0 127 84 197q62 51 135 51q63 0 108.5 -30.5t45.5 -72.5q0 -17 -14 -29.5t-33 -12.5q-35 0 -48 46l-6 22q-8 28 -20 38.5t-39 10.5q-61 0 -98.5 -48.5t-37.5 -126.5q0 -86 43 -140.5 t112 -54.5q43 0 74 21t67 73z" />
+<glyph unicode="&#x442;" horiz-adv-x="434" d="M426 309h-17q-10 60 -35.5 86.5t-82.5 26.5q-19 0 -25.5 -7t-6.5 -25v-318q0 -31 12 -42.5t50 -14.5v-15h-208v15q41 3 51.5 12.5t10.5 51.5v311q0 20 -7 26t-27 6q-56 0 -81 -26.5t-35 -86.5h-17l5 141h408z" />
+<glyph unicode="&#x443;" horiz-adv-x="491" d="M483 450v-15q-18 -2 -28.5 -12.5t-21.5 -38.5l-164 -409q-43 -107 -81 -150t-94 -43q-32 0 -51 16.5t-19 41.5q0 19 12.5 32.5t30.5 13.5q31 0 54 -13q13 -7 29 -7q28 0 60.5 60.5t32.5 85.5q0 9 -46 106l-136 283q-13 29 -53 35v14h205v-15q-32 -1 -44.5 -7t-12.5 -20 q0 -11 13 -41l120 -256l105 274q4 9 4 26q0 24 -48 24v15h133z" />
+<glyph unicode="&#x444;" horiz-adv-x="678" d="M379 660v-253q12 23 36 38t55 15q77 0 121 -63t44 -170q0 -134 -60 -197q-39 -40 -103 -40q-30 0 -55.5 15t-37.5 38v-169q0 -47 16 -61t72 -15v-15h-238v15q44 4 57 17t13 52v176q-12 -23 -37.5 -38t-55.5 -15q-64 0 -103 40q-60 63 -60 197q0 107 44 170t121 63 q31 0 55 -15t36 -38v132q0 35 -8 46t-33 11q-16 0 -25 -1v16q58 18 140 51zM379 357v-262q0 -24 26 -49.5t62 -25.5q35 0 59 56q23 55 23 157q0 80 -22 138.5t-60 58.5q-35 0 -61.5 -25t-26.5 -48zM299 95v260q0 24 -26.5 49.5t-61.5 25.5q-38 0 -60 -58.5t-22 -138.5 q0 -102 23 -157q24 -56 59 -56q36 0 62 25.5t26 49.5z" />
+<glyph unicode="&#x445;" horiz-adv-x="489" d="M476 0h-201v15q25 2 32.5 6.5t7.5 17.5q0 9 -6 18l-92 143l-79 -122q-19 -30 -19 -45q0 -18 40 -18v-15h-145v15q26 2 40.5 11t34.5 39l112 165l-94 145q-23 35 -39 47.5t-38 12.5h-9v15h207v-15q-43 -1 -43 -22q0 -22 46 -89l18 -26l28 39q35 49 35 76q0 19 -40 22v15 h158v-15q-51 -2 -81 -44l-83 -120l128 -196q39 -60 82 -60v-15z" />
+<glyph unicode="&#x446;" horiz-adv-x="525" d="M502 450v-15q-40 -3 -51 -13.5t-11 -49.5v-292q0 -44 10.5 -53.5t50.5 -11.5v-152h-15q-14 49 -27 78.5t-28.5 41.5t-26 14.5t-30.5 2.5h-351v15q39 2 50.5 12.5t11.5 54.5v293q0 38 -10.5 47t-50.5 13v15h208v-15q-38 -3 -50.5 -14.5t-12.5 -44.5v-298q0 -28 9.5 -39 t30.5 -11h105q42 0 42 50v300q0 30 -13.5 42t-51.5 15v15h211z" />
+<glyph unicode="&#x447;" horiz-adv-x="512" d="M489 450v-15q-40 -3 -51 -13.5t-11 -49.5v-295q0 -37 11 -47.5t50 -14.5v-15h-207v15q37 3 49.5 15t12.5 47v138q-2 -1 -14 -6l-18 -7q-6 -3 -19 -7t-23.5 -6t-25.5 -4t-30 -2q-67 0 -100.5 20.5t-33.5 84.5v84q0 40 -10.5 49.5t-50.5 13.5v15h208v-15q-39 -3 -51 -13.5 t-12 -49.5v-78q0 -46 17 -63.5t66 -17.5q17 0 34 3.5t25.5 6t22.5 8.5l15 6v142q0 29 -13.5 41t-51.5 15v15h211z" />
+<glyph unicode="&#x448;" horiz-adv-x="768" d="M745 450v-15q-40 -3 -51 -14.5t-11 -54.5v-287q0 -41 11 -51.5t50 -12.5v-15h-721v15q41 3 51.5 12.5t10.5 51.5v287q0 40 -11.5 52.5t-49.5 16.5v15h205v-15q-37 -4 -48.5 -15t-11.5 -43v-299q0 -28 11 -39t34 -11h86q24 0 33 10.5t9 38.5v300q0 30 -14.5 43t-45.5 15 v15h204v-15q-31 -2 -45.5 -15t-14.5 -43v-299q0 -28 11 -39t34 -11h86q24 0 33 10.5t9 39.5v300q0 32 -11.5 43t-48.5 14v15h206z" />
+<glyph unicode="&#x449;" horiz-adv-x="768" d="M745 450v-15q-40 -3 -51 -14.5t-11 -54.5v-287q0 -43 10.5 -52.5t50.5 -11.5v-152h-15q-23 85 -46 111t-54 26h-606v15q41 3 51.5 12.5t10.5 51.5v287q0 40 -11.5 52.5t-49.5 16.5v15h205v-15q-38 -4 -49 -15t-11 -43v-299q0 -28 11 -39t34 -11h86q24 0 33 10.5t9 38.5 v300q0 30 -14 42.5t-45 15.5h-1v15h204v-15q-32 -3 -46 -15.5t-14 -42.5v-299q0 -28 11 -39t34 -11h86q24 0 33 10.5t9 39.5v300q0 32 -11.5 43t-48.5 14v15h206z" />
+<glyph unicode="&#x44a;" horiz-adv-x="539" d="M251 252h66q85 0 137.5 -31.5t52.5 -96.5q0 -58 -47 -91t-123 -33h-232v15q41 3 51.5 12.5t10.5 51.5v312q0 31 -44 31q-43 0 -64 -21.5t-34 -79.5h-17l8 129h297v-15q-40 -4 -51 -15t-11 -43v-125zM251 224v-165q0 -19 6 -25t28 -6q64 0 97.5 21t33.5 78q0 56 -32 76.5 t-88 20.5h-45z" />
+<glyph unicode="&#x44b;" horiz-adv-x="670" d="M169 252h66q85 0 137.5 -31.5t52.5 -96.5q0 -58 -47 -91t-123 -33h-232v15q41 3 51.5 12.5t10.5 51.5v287q0 40 -11.5 52.5t-49.5 16.5v15h207v-15q-40 -4 -51 -15t-11 -43v-125zM169 224v-165q0 -19 6 -25t28 -6q64 0 97.5 21t33.5 78q0 56 -32 76.5t-88 20.5h-45z M646 0h-208v15q41 3 51.5 12.5t10.5 51.5v287q0 40 -11.5 52.5t-49.5 16.5v15h207v-15q-40 -4 -51 -15t-11 -43v-305q0 -30 12 -41.5t50 -14.5v-16z" />
+<glyph unicode="&#x44c;" horiz-adv-x="457" d="M169 252h66q85 0 137.5 -31.5t52.5 -96.5q0 -58 -47 -91t-123 -33h-232v15q41 3 51.5 12.5t10.5 51.5v287q0 40 -11.5 52.5t-49.5 16.5v15h207v-15q-40 -4 -51 -15t-11 -43v-125zM169 224v-165q0 -19 6 -25t28 -6q64 0 97.5 21t33.5 78q0 56 -32 76.5t-88 20.5h-45z" />
+<glyph unicode="&#x44d;" horiz-adv-x="444" d="M59 457h15q5 -23 22 -23q8 0 37 12q34 14 70 14q101 0 154 -69t53 -171q0 -101 -57 -165.5t-151 -64.5q-38 0 -69 14t-54.5 43t-35 47t-29.5 53l15 9q34 -53 67.5 -73.5t79.5 -20.5q68 0 108 46t45 116h-178v33h179q-1 79 -36 127t-97 48q-33 0 -57 -10t-38.5 -30 t-22 -36t-15.5 -42h-17z" />
+<glyph unicode="&#x44e;" horiz-adv-x="738" d="M169 248h93q6 96 67 154t158 58q93 0 154.5 -63.5t61.5 -165.5q0 -105 -62.5 -173t-162.5 -68q-89 0 -150.5 63.5t-65.5 161.5h-93v-143q0 -31 12 -42.5t50 -14.5v-15h-208v15q41 3 51.5 12.5t10.5 51.5v287q0 40 -11.5 52.5t-49.5 16.5v15h207v-15q-40 -4 -51 -15 t-11 -43v-129zM613 204q0 114 -50 178q-40 50 -95 50q-52 0 -84 -42.5t-32 -116.5q0 -128 53 -205q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="&#x44f;" horiz-adv-x="471" d="M448 450v-15q-39 -3 -50.5 -14.5t-11.5 -54.5v-287q0 -39 11 -48.5t50 -13.5v-17h-202v15q37 2 47 12.5t10 48.5v130h-19l-155 -206h-124v15q34 3 70 47l119 147q-62 8 -101.5 41t-39.5 85q0 36 14 60t42.5 35.5t59 15.5t74.5 4h206zM302 234v157q0 19 -6 25t-24 6 q-58 0 -93.5 -19.5t-35.5 -73.5q0 -46 31 -70.5t88 -24.5h40z" />
+<glyph unicode="&#x451;" horiz-adv-x="466" d="M421 164l16 -7q-60 -167 -209 -167q-88 0 -139 61.5t-51 165.5q0 107 57 175t150 68q90 0 139 -69q28 -40 34 -116h-308q0 -89 37.5 -151t115.5 -62q50 0 85.5 23t72.5 79zM112 303h204q-9 65 -30 94.5t-68 29.5q-41 0 -69.5 -33.5t-36.5 -90.5zM385 572q0 -20 -15 -34.5 t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM186 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#x452;" horiz-adv-x="512" d="M439 306v-306q0 -107 -43.5 -162.5t-126.5 -55.5q-41 0 -67 15.5t-26 39.5q0 16 12 27.5t29 11.5q23 0 48 -32q23 -29 42 -29q23 0 34 19q14 25 14 121v349q0 102 -74 102q-31 0 -56 -14t-56 -49v-241q0 -52 12 -67t56 -20v-15h-216v15q43 6 53.5 20t10.5 67v429h-79v33 h79v13q0 32 -9 39.5t-42 7.5q-9 0 -12 -1v16l27 8q77 23 115 36l5 -3v-116h213v-33h-213v-155q34 46 69 65t82 19q57 0 88 -40t31 -114z" />
+<glyph unicode="&#x453;" horiz-adv-x="394" d="M387 309h-17q-10 60 -47.5 85.5t-127.5 25.5q-19 0 -25.5 -7t-6.5 -25v-316q0 -31 12 -42.5t50 -14.5v-15h-208v15q41 3 51.5 12.5t10.5 51.5v309q0 31 -10.5 38t-51.5 9v15h365zM108 508l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40z" />
+<glyph unicode="&#x454;" horiz-adv-x="444" d="M415 156l15 -9q-18 -35 -29.5 -53t-35 -47t-54.5 -43t-69 -14q-94 0 -151 64.5t-57 165.5q0 102 53 171t154 69q36 0 70 -14q29 -12 37 -12q17 0 22 23h15l12 -143h-16q-8 25 -15.5 42t-22.5 36.5t-39 29.5t-57 10q-62 0 -97 -48t-36 -127h179v-33h-178q5 -70 45 -116 t108 -46q46 0 79.5 20.5t67.5 73.5z" />
+<glyph unicode="&#x455;" horiz-adv-x="389" d="M154 301l104 -63q50 -30 69 -56t19 -67q0 -50 -41.5 -87.5t-98.5 -37.5q-47 0 -73 9q-27 9 -46 9q-17 0 -24 -12h-13v157h16q16 -73 46 -107t81 -34q37 0 60 21t23 53q0 46 -53 75l-54 30q-120 67 -120 145q0 58 37.5 90.5t100.5 32.5q44 0 67 -11q18 -8 28 -8q7 0 16 10 h11l5 -136h-15q-17 68 -42.5 95.5t-70.5 27.5q-34 0 -54.5 -17t-20.5 -51q0 -17 11.5 -36.5t31.5 -31.5z" />
+<glyph unicode="&#x456;" horiz-adv-x="278" d="M193 632q0 -22 -15 -36.5t-37 -14.5q-21 0 -35.5 14.5t-14.5 36.5q0 21 15 36t36 15q22 0 36.5 -15t14.5 -36zM266 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l155 55l4 -4v-351q0 -56 12.5 -71t61.5 -19v-15z" />
+<glyph unicode="&#x457;" horiz-adv-x="278" d="M264 0h-237v15q52 3 65.5 18t13.5 71v227q0 35 -7 49t-26 14q-24 0 -42 -5v16l154 55l5 -4v-351q0 -56 12.5 -71t61.5 -19v-15zM299 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM100 572q0 -20 -15 -34.5t-36 -14.5 q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#x458;" horiz-adv-x="278" d="M186 457v-457q0 -107 -43.5 -162.5t-126.5 -55.5q-41 0 -67 15.5t-26 39.5q0 16 12 27.5t29 11.5q23 0 48 -32q23 -28 42 -28q23 0 34 18q14 25 14 121v379q0 60 -32 60q-24 0 -40 -3l-5 -1v16q80 25 156 54zM187 632q0 -22 -15 -36.5t-37 -14.5q-21 0 -35.5 14.5 t-14.5 36.5q0 21 15 36t36 15t36 -15t15 -36z" />
+<glyph unicode="&#x459;" horiz-adv-x="702" d="M414 252h66q85 0 137.5 -31.5t52.5 -96.5q0 -58 -47 -91t-123 -33h-232v15q41 3 51.5 12.5t10.5 51.5v300q0 28 -7 35.5t-33 7.5h-70q-20 0 -28.5 -10t-8.5 -35v-198q0 -23 -1 -38.5t-3.5 -40.5t-9.5 -42t-18 -34t-30 -25.5t-43 -8.5q-70 0 -70 50q0 18 12 28t26 10 q21 0 34 -27t21 -27q49 0 49 175v167q0 40 -11.5 52.5t-49.5 16.5v15h387v-15q-40 -3 -51 -14.5t-11 -54.5v-114zM414 224v-165q0 -19 6 -25t28 -6q64 0 97.5 21t33.5 78q0 56 -32 76.5t-88 20.5h-45z" />
+<glyph unicode="&#x45a;" horiz-adv-x="721" d="M433 245h66q190 0 190 -121q0 -58 -47 -91t-123 -33h-232v15q41 3 51.5 12.5t10.5 51.5v136h-180v-143q0 -31 12 -42.5t50 -14.5v-15h-208v15q41 3 51.5 12.5t10.5 51.5v287q0 40 -11.5 52.5t-49.5 16.5v15h207v-15q-40 -4 -51 -15t-11 -43v-132h180v133q0 32 -12 43 t-50 14v15h208v-15q-38 -3 -50 -13t-12 -45v-132zM433 215v-156q0 -19 6 -25t28 -6q65 0 98 20t33 77q0 55 -30.5 72.5t-89.5 17.5h-45z" />
+<glyph unicode="&#x45b;" horiz-adv-x="512" d="M499 0h-212v15q44 5 56 20t12 67v198q0 106 -74 106q-30 0 -55 -14t-57 -49v-241q0 -52 12 -67t56 -20v-15h-216v15q43 6 53.5 20t10.5 67v429h-79v33h79v8q0 32 -9.5 42t-41.5 10q-9 0 -12 -1v16l27 8q77 23 115 36l5 -3v-116h213v-33h-213v-155q35 45 69 64.5t78 19.5 q123 0 123 -159v-199q0 -52 9.5 -65.5t50.5 -21.5v-15z" />
+<glyph unicode="&#x45c;" horiz-adv-x="503" d="M495 0h-132l-109 164q-26 39 -36.5 48t-35.5 13v-158q0 -27 11 -38.5t41 -12.5l23 -1v-15h-234v15l28 2q28 2 37.5 13t9.5 37v310q0 35 -11.5 45t-49.5 14v14h207v-14q-36 -4 -49 -16.5t-13 -40.5v-126q38 0 66 17q10 6 21 21.5t18 28.5l19 38l17 34q34 64 91 64 q28 0 44.5 -14t16.5 -34q0 -19 -13 -31.5t-33 -12.5q-12 0 -30 7.5t-24 7.5q-15 0 -26.5 -15t-19.5 -35t-26 -45.5t-42 -41.5v-2q40 -18 67.5 -43.5t55.5 -80.5q28 -54 58 -82q17 -16 53 -19v-15zM165 508l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40z" />
+<glyph unicode="&#x45e;" horiz-adv-x="491" d="M393 637q0 -42 -44 -66.5t-91 -24.5t-91 24.5t-44 66.5q0 31 19.5 49t42.5 18q24 0 24 -25q0 -18 -22 -24t-22 -17q0 -40 93 -40t93 40q0 11 -22 17t-22 24q0 25 27 25q24 0 41.5 -18t17.5 -49zM483 450v-15q-18 -2 -28.5 -12.5t-21.5 -38.5l-164 -409q-43 -107 -81 -150 t-94 -43q-32 0 -51 16.5t-19 41.5q0 19 12.5 32.5t30.5 13.5q31 0 54 -13q13 -7 29 -7q28 0 59 60.5t31 85.5q0 11 -45 106l-134 283q-13 29 -53 35v14h205v-15q-32 -1 -44.5 -7t-12.5 -20q0 -11 13 -41l117 -256l108 274q4 9 4 26q0 24 -48 24v15h133z" />
+<glyph unicode="&#x45f;" horiz-adv-x="518" d="M495 450v-15q-40 -3 -51 -13.5t-11 -49.5v-292q0 -44 10.5 -53.5t50.5 -11.5v-15h-117q-21 0 -32 -2.5t-27.5 -14t-28.5 -41.5t-22 -79h-17q-10 49 -22 79t-28.5 41.5t-27.5 14t-32 2.5h-117v15q39 2 50.5 12.5t11.5 54.5v293q0 38 -10.5 47t-50.5 13v15h208v-15 q-38 -3 -50.5 -14.5t-12.5 -44.5v-298q0 -28 9.5 -39t30.5 -11h98q42 0 42 50v300q0 30 -13.5 42t-51.5 15v15h211z" />
+<glyph unicode="&#x462;" horiz-adv-x="746" d="M335 366h109q124 0 196.5 -44t72.5 -140q0 -85 -64.5 -133.5t-174.5 -48.5h-337v19q59 2 77.5 19.5t18.5 74.5v392q0 31 -34 31h-15q-67 0 -89 -12.5t-38 -52.5q-3 -8 -7 -37h-24l7 140h200q0 41 -19 53t-77 16v19h294v-19q-56 -5 -76 -16.5t-20 -52.5h200l5 -138h-24 q-3 25 -10 40q-17 36 -44.5 48t-82.5 12h-9q-35 0 -35 -30v-140zM335 326v-243q0 -25 13.5 -35t48.5 -10q96 0 148.5 29.5t52.5 111.5q0 147 -185 147h-78z" />
+<glyph unicode="&#x463;" horiz-adv-x="539" d="M251 252h66q85 0 137.5 -31.5t52.5 -96.5q0 -58 -47 -91t-123 -33h-232v15q40 3 51 13.5t11 50.5v317q-3 26 -34 26q-55 0 -76 -23t-32 -78h-17l8 129h151v114q0 35 -7.5 44t-33.5 9q-16 0 -25 -1v16q70 21 144 51l6 -2v-231h151l8 -129h-17q-11 55 -32.5 78t-77.5 23 q-19 0 -25.5 -7t-6.5 -25v-138zM251 224v-165q0 -19 6 -25t28 -6q64 0 97.5 21t33.5 78q0 56 -32 76.5t-88 20.5h-45z" />
+<glyph unicode="&#x46a;" horiz-adv-x="998" d="M992 0h-290v19q32 2 43 13.5t11 35.5q0 37 -32 89q-89 141 -174 147v-193q0 -57 17.5 -73t75.5 -19v-19h-286v19q60 5 75.5 21.5t15.5 82.5v181q-85 -6 -174 -147q-32 -52 -32 -89q0 -24 11 -35.5t43 -13.5v-19h-290v19q42 3 74 29t49.5 57.5t44 75t51.5 68.5 q73 75 186 99l-213 314h584l-203 -314q52 -2 104.5 -31.5t89.5 -67.5q25 -25 51.5 -68.5t44 -75t49.5 -57.5t74 -29v-19zM701 617h-353l179 -269z" />
+<glyph unicode="&#x46b;" horiz-adv-x="722" d="M708 0h-204v15q22 1 30 9t8 24q0 24 -23 59q-60 93 -116 102v-143q0 -33 10.5 -41t45.5 -10v-15h-196v15q35 2 45.5 10t10.5 41v143q-55 -9 -116 -102q-23 -35 -23 -59q0 -16 8 -24t30 -9v-15h-204v15q38 3 62.5 30t48 70.5t43.5 63.5q57 57 134 57v2l-159 212h412 l-137 -211v-3q77 0 136 -57q18 -17 36 -47l30 -54q13 -23 36 -42t52 -21v-15zM501 422h-233l123 -174z" />
+<glyph unicode="&#x472;" horiz-adv-x="729" d="M690 331q0 -154 -91 -249.5t-236 -95.5q-146 0 -236.5 96t-90.5 252q0 152 90.5 247t236.5 95t236.5 -97.5t90.5 -247.5zM575 358q-3 78 -26.5 139.5t-63.5 95.5q-56 47 -123 47q-85 0 -143 -67q-30 -34 -48.5 -96t-20.5 -123q77 69 145 69q22 0 49.5 -16.5t50 -36 t51.5 -36t53 -16.5q37 0 76 40zM576 317q-59 -68 -138 -68q-38 0 -108 52.5t-104 52.5q-36 0 -76 -41q5 -168 90 -246q49 -45 124 -45q78 0 129 48q39 38 61 104t22 143z" />
+<glyph unicode="&#x473;" horiz-adv-x="512" d="M476 231q0 -105 -62.5 -173t-162.5 -68q-92 0 -154 67.5t-62 170.5q0 104 62 168t163 64q93 0 154.5 -63.5t61.5 -165.5zM384 240q-8 86 -48 142q-43 50 -95 50t-84 -42.5t-32 -116.5q0 -20 1 -30q45 44 90 44q28 0 67 -32.5t61 -32.5q19 0 40 18zM386 204v10 q-42 -44 -92 -44q-30 0 -68 32.5t-58 32.5q-18 0 -40 -19q10 -89 50 -148q34 -50 90 -50q55 0 86.5 49.5t31.5 136.5z" />
+<glyph unicode="&#x474;" horiz-adv-x="766" d="M399 161l133 373q25 71 57.5 106.5t94.5 35.5q36 0 56 -18t20 -45q0 -22 -12 -40t-36 -18q-19 0 -32 9t-17.5 19.5t-11 19.5t-14.5 9q-28 0 -52 -67l-202 -556h-15l-244 544q-32 71 -51 90t-57 20v19h265v-19l-28 -2q-45 -3 -45 -31q0 -20 39 -107z" />
+<glyph unicode="&#x475;" horiz-adv-x="539" d="M280 114l79 219q44 123 116 123q28 0 42.5 -14t14.5 -34q0 -19 -13 -31.5t-33 -12.5q-12 0 -26.5 7.5t-20.5 7.5q-16 0 -26.5 -17t-23.5 -51l-105 -277q-18 -48 -28 -48q-8 0 -29 47l-117 287q-30 73 -46 93t-45 22v15h196v-15q-26 -2 -36 -8t-10 -19q0 -16 9 -38 l99 -256h3z" />
+<glyph unicode="&#x490;" horiz-adv-x="571" d="M544 803l-5 -179h-296q-22 0 -28.5 -6.5t-6.5 -29.5v-476q0 -56 16.5 -73t74.5 -20v-19h-280v19q56 4 71.5 20.5t15.5 74.5v436q0 56 -15.5 73t-71.5 20v19h365q100 0 126 91q7 23 10 50h24z" />
+<glyph unicode="&#x491;" horiz-adv-x="394" d="M387 558l-5 -138h-192q-16 0 -21.5 -7.5t-5.5 -24.5v-316q0 -31 12 -42.5t50 -14.5v-15h-208v15q41 3 51.5 12.5t10.5 51.5v309q0 31 -10.5 38t-51.5 9v15h196q47 0 76 6t45.5 21.5t23 32.5t12.5 48h17z" />
+<glyph unicode="&#x1d00;" horiz-adv-x="510" d="M495 0h-177v18q28 0 38 6q10 5 10 12q0 20 -13 49l-28 65h-175l-32 -80q-6 -14 -6 -29t7.5 -19t33.5 -4v-18h-138v18q30 3 43.5 20t44.5 91l142 339h15l171 -391q15 -34 26.5 -45t37.5 -14v-18zM312 184l-76 179l-73 -179h149z" />
+<glyph unicode="&#x1d07;" horiz-adv-x="504" d="M481 119l-36 -119h-424v18q45 3 56 14.5t11 52.5v296q0 40 -11.5 51.5t-55.5 13.5v18h419v-105h-19q-10 47 -31.5 59.5t-91.5 12.5h-101q-16 0 -21.5 -4.5t-5.5 -21.5v-145h116q51 0 66.5 11.5t22.5 53.5h20v-166h-20q-7 44 -22 56t-67 12h-116v-161q0 -22 10 -27.5 t53 -5.5h41q89 0 124 15.5t62 70.5h21z" />
+<glyph unicode="&#x1d1c;" horiz-adv-x="583" d="M560 464v-18q-47 -4 -57.5 -20t-10.5 -70v-176q0 -54 -8.5 -85t-34.5 -57q-50 -52 -161 -52q-79 0 -134 38q-66 44 -66 148v214q0 32 -12.5 45.5t-54.5 14.5v18h215v-18q-45 -4 -56 -16.5t-11 -50.5v-212q0 -46 6.5 -70t28.5 -44q37 -32 102 -32q83 0 122 42 q19 19 25 43.5t6 70.5v177q0 55 -12.5 71.5t-56.5 20.5v18h170z" />
+<glyph unicode="&#x1d81;" horiz-adv-x="528" d="M491 58v-206q0 -58 -31 -98.5t-77 -40.5q-53 0 -90.5 15.5t-37.5 39.5q0 11 8 19t20 8q7 0 14 -3.5t9.5 -6t10 -11.5t9.5 -11q27 -31 54 -31q56 0 56 91v199l-92 -32l-4 3v64q-48 -67 -128 -67q-83 0 -134 59.5t-51 155.5q0 106 61 180.5t147 74.5q54 0 105 -43v156 q0 31 -9 41t-37 10q-14 0 -22 -1v16q91 24 147 44l5 -2v-567q0 -35 8.5 -46t35.5 -11q6 0 23 1zM340 102v230q0 40 -30.5 70t-71.5 30q-57 0 -91 -51t-34 -136q0 -92 37.5 -147.5t100.5 -55.5q47 0 74 32q15 17 15 28z" />
+<glyph unicode="&#x1d84;" horiz-adv-x="542" d="M505 15v-163q0 -58 -31 -98.5t-77 -40.5q-53 0 -90.5 15.5t-37.5 39.5q0 11 8 19t20 8q7 0 14 -3.5t9.5 -6t10 -11.5t9.5 -11q27 -31 54 -31q56 0 56 91v177h-163v15h19q21 0 21 15q0 9 -11 23l-150 198v-184q0 -26 12.5 -38t42.5 -13l20 -1v-15h-234v15q54 9 64.5 18.5 t10.5 48.5v482q0 36 -9 48.5t-34 12.5q-6 0 -32 -2v16l30 8q60 16 125 36l4 -2v-420l137 122q23 21 23 35q0 10 -10.5 13.5t-39.5 4.5v14h204v-15q-50 0 -88.5 -21.5t-127.5 -104.5l-29 -27l153 -194q54 -69 117 -73z" />
+<glyph unicode="&#x1d85;" horiz-adv-x="294" d="M257 15v-163q0 -52 -29 -95.5t-79 -43.5q-39 0 -83.5 13t-44.5 42q0 12 8 19.5t20 7.5q15 0 28.5 -15.5t30.5 -31.5t38 -16q56 0 56 91v177h-181v15q45 3 61 18.5t16 58.5v469q0 21 -2 32.5t-11.5 21.5t-28.5 10q-25 0 -37 -2v16q94 23 158 44l5 -4v-592q0 -44 15 -57 t60 -15z" />
+<glyph unicode="&#x1d8a;" horiz-adv-x="389" d="M156 301l104 -63q50 -30 69 -56t19 -67q0 -31 -18 -60v-203q0 -58 -31 -98.5t-77 -40.5q-53 0 -90.5 15.5t-37.5 39.5q0 11 8 19t20 8q7 0 14 -3.5t9.5 -6t10 -11.5t9.5 -11q27 -31 54 -31q56 0 56 91v183q-32 -16 -67 -16q-47 0 -73 9q-27 9 -46 9q-17 0 -24 -12h-13 v157h16q16 -73 46 -107t81 -34q37 0 60 21t23 53q0 46 -53 75l-54 30q-120 67 -120 145q0 58 37.5 90.5t100.5 32.5q44 0 67 -11q18 -8 28 -8q7 0 16 10h11l5 -136h-15q-17 68 -42.5 95.5t-70.5 27.5q-34 0 -54.5 -17t-20.5 -51q0 -17 11.5 -36.5t31.5 -31.5z" />
+<glyph unicode="&#x1d8d;" horiz-adv-x="516" d="M479 15v-163q0 -58 -31 -98.5t-77 -40.5q-53 0 -90.5 15.5t-37.5 39.5q0 11 8 19t20 8q7 0 14 -3.5t9.5 -6t10 -11.5t9.5 -11q27 -31 54 -31q56 0 56 91v177h-146v15q25 2 32.5 6.5t7.5 17.5q0 9 -6 18l-91 140l-79 -123q-20 -31 -20 -41q0 -18 40 -18v-15h-145v15 q25 2 38.5 11.5t34.5 39.5l114 165l-94 144q-23 35 -39 47.5t-38 12.5h-9v15h207v-15q-43 -1 -43 -22t46 -89q13 -18 14 -20q20 25 30 44q37 55 37 65q0 19 -40 22v15h158v-15q-51 -2 -81 -44l-83 -120l128 -196q39 -60 82 -60z" />
+<glyph unicode="&#x1d8e;" horiz-adv-x="453" d="M416 136v-284q0 -58 -31 -98.5t-77 -40.5q-53 0 -90.5 15.5t-37.5 39.5q0 11 8 19t20 8q7 0 14 -3.5t9.5 -6t10 -11.5t9.5 -11q27 -31 54 -31q56 0 56 91v177h-334v15l266 405h-135q-47 0 -63.5 -16.5t-23.5 -71.5h-18l4 118h346v-15l-269 -405h133q84 0 106 27 q10 12 14.5 26t12.5 55z" />
+<glyph unicode="&#x1e80;" horiz-adv-x="944" d="M582 719h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23zM932 662v-19q-40 -8 -54.5 -19.5t-28.5 -50.5q-114 -306 -204 -584h-15l-160 423l-154 -423h-15q-34 101 -101 285l-91 249q-25 72 -45.5 95.5t-58.5 24.5v19h244v-19q-37 -1 -50.5 -8t-13.5 -23 q0 -17 11 -47l144 -376l104 283l-28 75q-24 65 -41 80t-61 16v19h265v-19q-77 -2 -77 -35q0 -13 17 -58l143 -364l126 339q17 48 17 77q0 40 -70 41v19h197z" />
+<glyph unicode="&#x1e81;" horiz-adv-x="722" d="M694 450v-15q-15 -5 -22 -14.5t-19 -39.5l-138 -346q-20 -49 -28 -49q-5 0 -8.5 6.5t-15.5 36.5l-91 236l-112 -240q-18 -39 -25 -39q-9 0 -26 44l-135 342q-15 39 -25 50t-28 13v15h180v-15q-26 -3 -36 -10t-10 -23q0 -15 6 -30l99 -261l91 199l-20 56q-14 40 -27.5 53 t-41.5 16v15h203v-15q-35 -5 -46.5 -12t-11.5 -23t17 -60l84 -224l90 222q17 42 17 67q0 12 -9.5 18.5t-34.5 11.5v15h123zM484 507h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23z" />
+<glyph unicode="&#x1e82;" horiz-adv-x="944" d="M359 719l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM932 662v-19q-40 -8 -54.5 -19.5t-28.5 -50.5q-114 -306 -204 -584h-15l-160 423l-154 -423h-15q-34 101 -101 285l-91 249q-25 72 -45.5 95.5t-58.5 24.5v19h244v-19q-37 -1 -50.5 -8t-13.5 -23 q0 -17 11 -47l144 -376l104 283l-28 75q-24 65 -41 80t-61 16v19h265v-19q-77 -2 -77 -35q0 -13 17 -58l143 -364l126 339q17 48 17 77q0 40 -70 41v19h197z" />
+<glyph unicode="&#x1e83;" horiz-adv-x="722" d="M260 507l147 148q23 23 42 23q35 0 35 -32q0 -23 -30 -42l-154 -97h-40zM694 450v-15q-15 -5 -22 -14.5t-19 -39.5l-138 -346q-20 -49 -28 -49q-5 0 -8.5 6.5t-15.5 36.5l-91 236l-112 -240q-18 -39 -25 -39q-9 0 -26 44l-135 342q-15 39 -25 50t-28 13v15h180v-15 q-26 -3 -36 -10t-10 -23q0 -15 6 -30l99 -261l91 199l-20 56q-14 40 -27.5 53t-41.5 16v15h203v-15q-35 -5 -46.5 -12t-11.5 -23t17 -60l84 -224l90 222q17 42 17 67q0 12 -9.5 18.5t-34.5 11.5v15h123z" />
+<glyph unicode="&#x1e84;" horiz-adv-x="944" d="M619 784q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM420 784q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM932 662v-19q-40 -8 -54.5 -19.5t-28.5 -50.5 q-114 -306 -204 -584h-15l-160 423l-154 -423h-15q-34 101 -101 285l-91 249q-25 72 -45.5 95.5t-58.5 24.5v19h244v-19q-37 -1 -50.5 -8t-13.5 -23q0 -17 11 -47l144 -376l104 283l-28 75q-24 65 -41 80t-61 16v19h265v-19q-77 -2 -77 -35q0 -13 17 -58l143 -364l126 339 q17 48 17 77q0 40 -70 41v19h197z" />
+<glyph unicode="&#x1e85;" horiz-adv-x="722" d="M521 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM322 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM694 450v-15q-15 -5 -22 -14.5t-19 -39.5l-138 -346 q-20 -49 -28 -49q-5 0 -8.5 6.5t-15.5 36.5l-91 236l-112 -240q-18 -39 -25 -39q-9 0 -26 44l-135 342q-15 39 -25 50t-28 13v15h180v-15q-26 -3 -36 -10t-10 -23q0 -15 6 -30l99 -261l91 199l-20 56q-14 40 -27.5 53t-41.5 16v15h203v-15q-35 -5 -46.5 -12t-11.5 -23 t17 -60l84 -224l90 222q17 42 17 67q0 12 -9.5 18.5t-34.5 11.5v15h123z" />
+<glyph unicode="&#x1ef2;" horiz-adv-x="722" d="M476 719h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23zM703 662v-19q-44 -4 -69.5 -25t-68.5 -87l-148 -228v-192q0 -57 19 -73t84 -19v-19h-306v19q68 5 84.5 21.5t16.5 82.5v171l-131 192q-68 100 -97 127.5t-65 29.5v19h279v-19l-24 -1q-47 -1 -47 -26 q0 -21 18 -47l146 -221l145 222q14 21 14 42q-1 17 -15.5 23.5t-52.5 7.5v19h218z" />
+<glyph unicode="&#x1ef3;" horiz-adv-x="500" d="M475 450v-15q-18 -2 -29 -13t-21 -38l-150 -409q-39 -106 -78.5 -149.5t-96.5 -43.5q-32 0 -51 16.5t-19 41.5q0 19 12.5 32.5t30.5 13.5q29 0 52 -13q13 -7 26 -7q21 0 50 44q14 20 27 57t13 51q0 13 -42 101l-132 282q-13 29 -53 35v14h205v-15q-32 -1 -44.5 -7 t-12.5 -20q0 -11 13 -41l112 -250l97 276q4 9 4 18q0 24 -46 24v15h133zM364 507h-40l-154 96q-30 19 -30 43q0 32 36 32q21 0 43 -23z" />
+<glyph unicode="&#x2000;" horiz-adv-x="511" />
+<glyph unicode="&#x2001;" horiz-adv-x="1023" />
+<glyph unicode="&#x2002;" horiz-adv-x="511" />
+<glyph unicode="&#x2003;" horiz-adv-x="1023" />
+<glyph unicode="&#x2004;" horiz-adv-x="341" />
+<glyph unicode="&#x2005;" horiz-adv-x="255" />
+<glyph unicode="&#x2006;" horiz-adv-x="170" />
+<glyph unicode="&#x2007;" horiz-adv-x="170" />
+<glyph unicode="&#x2008;" horiz-adv-x="127" />
+<glyph unicode="&#x2009;" horiz-adv-x="204" />
+<glyph unicode="&#x200a;" horiz-adv-x="56" />
+<glyph unicode="&#x2010;" horiz-adv-x="333" d="M285 193h-246v66h246v-66z" />
+<glyph unicode="&#x2011;" horiz-adv-x="333" d="M285 194h-246v63h246v-63z" />
+<glyph unicode="&#x2012;" horiz-adv-x="500" d="M500 193h-500v66h500v-66z" />
+<glyph unicode="&#x2013;" horiz-adv-x="500" d="M500 201h-500v49h500v-49z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1000" d="M1000 201h-1000v49h1000v-49z" />
+<glyph unicode="&#x2015;" horiz-adv-x="2000" d="M2000 201h-2000v49h2000v-49z" />
+<glyph unicode="&#x2016;" horiz-adv-x="523" d="M195 -189h-66v879h66v-879zM394 -189h-66v879h66v-879z" />
+<glyph unicode="&#x2017;" horiz-adv-x="500" d="M500 -300h-500v50h500v-50zM500 -191h-500v50h500v-50z" />
+<glyph unicode="&#x2018;" horiz-adv-x="333" d="M227 676l9 -19q-82 -57 -82 -106q0 -14 14 -14q2 0 7 2q12 2 20 2q28 0 43.5 -13.5t15.5 -37.5q0 -25 -16.5 -41t-42.5 -16q-34 0 -57 25.5t-23 63.5q0 45 31 87t81 67z" />
+<glyph unicode="&#x2019;" horiz-adv-x="333" d="M106 433l-9 19q82 56 82 107q0 13 -14 13q-2 0 -7 -2q-12 -2 -20 -2q-28 0 -43.5 13.5t-15.5 37.5q0 25 16.5 41t42.5 16q34 0 57 -25.5t23 -63.5q0 -45 -31 -87t-81 -67z" />
+<glyph unicode="&#x201a;" horiz-adv-x="333" d="M106 -141l-9 19q82 56 82 107q0 13 -14 13q-2 0 -7 -2q-12 -2 -20 -2q-28 0 -43.5 13.5t-15.5 37.5q0 25 16.5 41t42.5 16q34 0 57 -25.5t23 -63.5q0 -45 -31 -87t-81 -67z" />
+<glyph unicode="&#x201b;" horiz-adv-x="333" d="M200 452l-9 -19q-50 25 -81 67t-31 87q0 38 23 63.5t57 25.5q26 0 42.5 -16t16.5 -41q0 -24 -15.5 -37.5t-43.5 -13.5q-8 0 -20 2l-7 2q-14 0 -14 -13q0 -51 82 -107z" />
+<glyph unicode="&#x201c;" horiz-adv-x="444" d="M387 676l9 -19q-82 -57 -82 -106q0 -14 14 -14q2 0 7 2q12 2 19 2q28 0 44 -13.5t16 -37.5q0 -25 -16.5 -41t-42.5 -16q-34 0 -57 25.5t-23 63.5q0 45 30.5 87t81.5 67zM155 676l9 -19q-82 -57 -82 -106q0 -14 14 -14q2 0 7 2q12 2 19 2q28 0 44 -13.5t16 -37.5 q0 -25 -16.5 -41t-42.5 -16q-34 0 -57 25.5t-23 63.5q0 45 30.5 87t81.5 67z" />
+<glyph unicode="&#x201d;" horiz-adv-x="444" d="M289 433l-9 19q82 56 82 107q0 13 -14 13q-2 0 -7 -2q-12 -2 -19 -2q-28 0 -44 13.5t-16 37.5q0 25 16.5 41t42.5 16q34 0 57 -25.5t23 -63.5q0 -45 -31 -87t-81 -67zM57 433l-9 19q82 56 82 107q0 13 -14 13q-2 0 -7 -2q-12 -2 -19 -2q-28 0 -44 13.5t-16 37.5 q0 25 16.5 41t42.5 16q34 0 57 -25.5t23 -63.5q0 -45 -31 -87t-81 -67z" />
+<glyph unicode="&#x201e;" horiz-adv-x="444" d="M304 -141l-9 19q82 56 82 107q0 13 -14 13q-2 0 -7 -2q-12 -2 -19 -2q-28 0 -44 13.5t-16 37.5q0 25 16.5 41t42.5 16q34 0 57 -25.5t23 -63.5q0 -45 -30.5 -87t-81.5 -67zM72 -141l-9 19q82 58 82 107q0 13 -14 13q-2 0 -7 -2q-12 -2 -19 -2q-28 0 -44 13.5t-16 37.5 q0 25 16.5 41t42.5 16q34 0 57 -25.5t23 -63.5q0 -45 -30.5 -87t-81.5 -67z" />
+<glyph unicode="&#x201f;" horiz-adv-x="444" d="M383 452l-9 -19q-50 25 -81 67t-31 87q0 38 23 63.5t57 25.5q26 0 42.5 -16t16.5 -41q0 -24 -16 -37.5t-44 -13.5q-7 0 -19 2l-7 2q-14 0 -14 -13q0 -51 82 -107zM151 452l-9 -19q-50 25 -81 67t-31 87q0 38 23 63.5t57 25.5q26 0 42.5 -16t16.5 -41q0 -24 -16 -37.5 t-44 -13.5q-7 0 -19 2l-7 2q-14 0 -14 -13q0 -51 82 -107z" />
+<glyph unicode="&#x2020;" horiz-adv-x="500" d="M240 -149v123q0 70 -12 149.5t-30 129.5q42 43 42 185q-46 -4 -91 -22q-32 -12 -46 -12q-44 0 -44 43q0 19 11 31.5t28 12.5q16 0 49 -13q53 -21 93 -22q0 41 -4.5 65.5t-19.5 62.5q-12 30 -12 47t14.5 31t32.5 14t32.5 -14t14.5 -31q0 -15 -13 -47q-15 -37 -19 -61.5 t-4 -66.5q40 1 92 22q32 13 50 13q16 0 27 -12.5t11 -31.5t-10.5 -31t-26.5 -12q-21 0 -53 12q-47 18 -90 22q0 -141 41 -185q-41 -106 -41 -279v-123h-22z" />
+<glyph unicode="&#x2021;" horiz-adv-x="500" d="M442 446q0 -18 -10.5 -30t-26.5 -12q-21 0 -53 12q-48 18 -91 22q0 -73 8.5 -112t31.5 -66q-23 -26 -31.5 -63.5t-8.5 -111.5q42 4 90 22q30 12 52 12q17 0 27.5 -12.5t10.5 -31.5q0 -18 -11.5 -30.5t-27.5 -12.5t-49 13q-52 21 -92 22q0 -42 4 -66.5t19 -61.5 q12 -30 12 -47t-14.5 -31t-32.5 -14q-17 0 -31.5 14t-14.5 31t12 47q24 61 24 128q-41 -1 -93 -22q-32 -13 -49 -13t-28 12.5t-11 32.5q0 18 11 30t27 12q20 0 52 -12q48 -18 91 -22q0 138 -40 175q40 52 40 178q-42 -4 -90 -22q-29 -12 -46 -12q-44 0 -44 43q0 19 11 31.5 t28 12.5q16 0 49 -13q51 -21 92 -22q0 42 -4 66.5t-19 61.5q-12 30 -12 47t14.5 31t31.5 14q18 0 32.5 -14t14.5 -31t-12 -47q-24 -61 -24 -128q41 1 93 22q32 13 50 13q16 0 27 -13t11 -32z" />
+<glyph unicode="&#x2022;" horiz-adv-x="523" d="M455 252q0 -79 -57 -136t-136 -57q-80 0 -136 56.5t-56 136.5q0 78 56.5 135t135.5 57q84 0 138.5 -56t54.5 -136z" />
+<glyph unicode="&#x2025;" horiz-adv-x="667" d="M222 43q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40zM555 43q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1000" d="M222 43q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40zM555 43q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40zM888 43q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5 q22 0 38.5 -17t16.5 -40z" />
+<glyph unicode="&#x202f;" horiz-adv-x="204" />
+<glyph unicode="&#x2030;" horiz-adv-x="1109" d="M686 213q0 -91 -50 -161.5t-114 -70.5q-51 0 -86 40t-35 98q0 80 58.5 145.5t130.5 65.5q46 0 71 -30.5t25 -86.5zM663 215q0 39 -17.5 63t-45.5 24q-29 0 -49 -23q-33 -35 -55.5 -93.5t-22.5 -109.5q0 -29 16 -48.5t40 -19.5q52 0 93 63.5t41 143.5zM621 706l-430 -724 h-47l394 658q-28 -32 -54.5 -44.5t-66.5 -12.5q-35 0 -76 14q4 -23 4 -44q0 -52 -22 -104t-58 -86q-38 -37 -86 -37q-50 0 -84 39.5t-34 97.5q0 85 58 149t135 64q26 0 60 -28q47 -39 96 -39q46 0 72 15t95 82h44zM321 569q0 22 -4.5 30t-20.5 16q-23 11 -44 34 q-31 -15 -44 -26.5t-28 -36.5q-48 -76 -48 -163q0 -31 15.5 -50.5t41.5 -19.5q53 0 92.5 65t39.5 151zM1048 213q0 -91 -49.5 -161.5t-113.5 -70.5q-52 0 -87 40t-35 99q0 80 58.5 145t130.5 65q46 0 71 -30.5t25 -86.5zM1025 215q0 39 -17.5 63t-45.5 24q-35 0 -66 -43 q-24 -32 -42.5 -86.5t-18.5 -94.5q0 -31 15.5 -50.5t40.5 -19.5q52 0 93 63.5t41 143.5z" />
+<glyph unicode="&#x2031;" horiz-adv-x="1471" d="M1048 213q0 -91 -49.5 -161.5t-113.5 -70.5q-52 0 -87 40t-35 99q0 80 58.5 145t130.5 65q46 0 71 -30.5t25 -86.5zM1025 215q0 39 -17.5 63t-45.5 24q-35 0 -66 -43q-24 -32 -42.5 -86.5t-18.5 -94.5q0 -31 15.5 -50.5t40.5 -19.5q52 0 93 63.5t41 143.5zM686 213 q0 -91 -50 -161.5t-114 -70.5q-51 0 -86 40t-35 98q0 80 58.5 145.5t130.5 65.5q46 0 71 -30.5t25 -86.5zM663 215q0 39 -17.5 63t-45.5 24q-29 0 -49 -23q-33 -35 -55.5 -93.5t-22.5 -109.5q0 -29 16 -48.5t40 -19.5q52 0 93 63.5t41 143.5zM621 706l-430 -724h-47l394 658 q-28 -32 -54.5 -44.5t-66.5 -12.5q-35 0 -76 14q4 -23 4 -44q0 -52 -22 -104t-58 -86q-38 -37 -86 -37q-50 0 -84 39.5t-34 97.5q0 85 58 149t135 64q26 0 60 -28q47 -39 96 -39q46 0 72 15t95 82h44zM321 569q0 22 -4.5 30t-20.5 16q-23 11 -44 34q-31 -15 -44 -26.5 t-28 -36.5q-48 -76 -48 -163q0 -31 15.5 -50.5t41.5 -19.5q53 0 92.5 65t39.5 151zM1410 213q0 -91 -49.5 -161.5t-113.5 -70.5q-52 0 -87 40t-35 99q0 80 58.5 145t130.5 65q46 0 71 -30.5t25 -86.5zM1387 215q0 39 -17.5 63t-45.5 24q-35 0 -66 -43q-24 -32 -42.5 -86.5 t-18.5 -94.5q0 -31 15.5 -50.5t40.5 -19.5q52 0 93 63.5t41 143.5z" />
+<glyph unicode="&#x2032;" horiz-adv-x="289" d="M75 411l67 221q4 15 8 23.5t13 15.5t23 7q13 0 20.5 -9.5t7.5 -23.5q0 -11 -14 -39l-106 -204z" />
+<glyph unicode="&#x2033;" horiz-adv-x="426" d="M212 411l66 222q6 22 15.5 33.5t29.5 11.5q28 0 28 -32q0 -11 -14 -39l-107 -205zM75 410l66 222q13 46 45 46q13 0 20.5 -9.5t7.5 -23.5q0 -11 -14 -39l-107 -205z" />
+<glyph unicode="&#x2034;" horiz-adv-x="563" d="M212 411l66 222q6 22 15.5 33.5t29.5 11.5q28 0 28 -32q0 -11 -14 -39l-107 -205zM75 410l66 222q13 46 45 46q13 0 20.5 -9.5t7.5 -23.5q0 -11 -14 -39l-107 -205zM349 411l66 222q6 22 15.5 33.5t29.5 11.5q28 0 28 -32q0 -11 -14 -39l-107 -205z" />
+<glyph unicode="&#x2035;" horiz-adv-x="289" d="M214 411l-19 -9l-106 204q-14 28 -14 39q0 14 7.5 23.5t20.5 9.5q14 0 23 -7t13 -15.5t8 -23.5z" />
+<glyph unicode="&#x2036;" horiz-adv-x="426" d="M351 410l-18 -9l-107 205q-14 28 -14 39q0 14 7.5 23.5t20.5 9.5q32 0 45 -46zM214 411l-18 -9l-107 205q-14 28 -14 39q0 32 28 32q20 0 29.5 -11.5t15.5 -33.5z" />
+<glyph unicode="&#x2037;" horiz-adv-x="563" d="M488 410l-18 -9l-107 205q-14 28 -14 39q0 14 7.5 23.5t20.5 9.5q32 0 45 -46zM351 411l-18 -9l-107 205q-14 28 -14 39q0 32 28 32q20 0 29.5 -11.5t15.5 -33.5zM214 411l-18 -9l-107 205q-14 28 -14 39q0 32 28 32q20 0 29.5 -11.5t15.5 -33.5z" />
+<glyph unicode="&#x2038;" horiz-adv-x="511" d="M454 -138l-22 -18l-177 208l-176 -208l-20 18l191 240h10z" />
+<glyph unicode="&#x2039;" horiz-adv-x="333" d="M63 227l81 73l48 44l56 53q22 19 26 19q11 0 11 -11q0 -6 -50 -72l-84 -106q23 -27 84 -107q50 -65 50 -76t-12 -11q-4 0 -27 21l-54 54l-48 46z" />
+<glyph unicode="&#x203a;" horiz-adv-x="333" d="M270 222l-81 -73l-47 -45l-58 -52q-21 -19 -25 -19q-11 0 -11 11q0 6 50 72l84 106q-23 27 -84 107q-50 65 -50 76t12 11q4 0 26 -22l56 -53l47 -46z" />
+<glyph unicode="&#x203b;" d="M616 253q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM407 462q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM635 5l-46 -46l-247 247l-248 -247l-46 46l247 248l-247 248l46 46l248 -247l247 247l46 -46l-246 -248zM407 44 q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM197 253q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#x203c;" horiz-adv-x="549" d="M175 176l-42 381q-3 30 -3 43q0 76 53 76q25 0 39 -22t14 -59q0 -16 -2 -38l-45 -381h-14zM236 42q0 -22 -15.5 -36.5t-38.5 -14.5q-22 0 -37 14.5t-15 37.5t15.5 38.5t37.5 15.5t37.5 -16t15.5 -39zM391 176l-42 381q-3 30 -3 43q0 76 53 76q25 0 39 -22t14 -59 q0 -16 -2 -38l-45 -381h-14zM452 42q0 -22 -15.5 -36.5t-38.5 -14.5q-22 0 -37 14.5t-15 37.5t15.5 38.5t37.5 15.5t37.5 -16t15.5 -39z" />
+<glyph unicode="&#x203e;" horiz-adv-x="500" d="M500 770h-500v50h500v-50z" />
+<glyph unicode="&#x2040;" horiz-adv-x="798" d="M726 523l-14 -11q-118 131 -311 131q-199 0 -314 -131l-15 9q22 51 61.5 89t86 59t91 30.5t88.5 9.5q103 0 193 -44.5t134 -141.5z" />
+<glyph unicode="&#x2043;" horiz-adv-x="333" d="M285 172h-246v160h246v-160z" />
+<glyph unicode="&#x2044;" horiz-adv-x="167" d="M331 676l-450 -690h-49l453 690h46z" />
+<glyph unicode="&#x2047;" horiz-adv-x="839" d="M244 164h-17q2 72 44 177q51 126 51 187q0 51 -31.5 84.5t-77.5 33.5q-36 0 -65 -19t-29 -43q0 -19 19 -38.5t19 -35.5q0 -19 -11 -31t-30 -12q-21 0 -34.5 18t-13.5 48q0 62 46 102.5t118 40.5q75 0 128.5 -43.5t53.5 -114.5q0 -45 -20 -82.5t-85 -114.5 q-49 -59 -65 -157zM290 45q0 -22 -15 -37.5t-37 -15.5q-25 0 -39.5 15.5t-14.5 37.5q0 23 15.5 38t38.5 15q21 0 36.5 -16t15.5 -37zM639 164h-17q2 72 44 177q51 126 51 187q0 51 -31.5 84.5t-77.5 33.5q-36 0 -65 -19t-29 -43q0 -19 19 -38.5t19 -35.5q0 -19 -11 -31 t-30 -12q-21 0 -34.5 18t-13.5 48q0 62 46 102.5t118 40.5q75 0 128.5 -43.5t53.5 -114.5q0 -45 -20 -82.5t-85 -114.5q-49 -59 -65 -157zM685 45q0 -22 -15 -37.5t-37 -15.5q-25 0 -39.5 15.5t-14.5 37.5q0 23 15.5 38t38.5 15q21 0 36.5 -16t15.5 -37z" />
+<glyph unicode="&#x204e;" horiz-adv-x="500" d="M268 35l9 -6q37 -24 96 -34q34 -5 47 -14.5t13 -28.5q0 -17 -10 -28t-26 -11q-25 0 -60 44q-23 28 -69 58l-8 5v-9q0 -56 20 -110q9 -25 9 -33q0 -15 -12.5 -27t-27.5 -12q-14 0 -25 11t-11 25t12 47q16 43 16 99v9q-40 -25 -52 -36q-12 -12 -41 -45q-22 -25 -43 -25 q-17 0 -27 10t-10 26q0 19 14.5 29t48.5 16q35 7 53.5 14t49.5 26q-43 26 -97 37q-37 8 -52 18t-15 28q0 16 9 26.5t24 10.5q20 0 49 -32q42 -47 89 -73v13q0 41 -15 91q-11 33 -11 52q0 14 10.5 24t25.5 10t26 -10.5t11 -25.5q0 -16 -11 -47q-17 -45 -17 -83v-24 q34 20 58 42q5 5 18 20l22 22q8 8 18.5 15.5t18.5 7.5q17 0 27 -10.5t10 -27.5q0 -20 -11.5 -29.5t-40.5 -13.5q-56 -9 -112 -41z" />
+<glyph unicode="&#x204f;" horiz-adv-x="278" d="M199 403q0 -22 -16.5 -38.5t-39.5 -16.5t-39 16t-16 39t16.5 39.5t38.5 16.5q24 0 40 -16t16 -40zM182 -122l-10 -19q-52 25 -82 66t-30 88q0 40 23 64.5t57 24.5q25 0 42 -16t17 -40q0 -52 -58 -52q-5 0 -15 2t-13 2q-6 0 -10 -4.5t-4 -9.5q0 -52 83 -106z" />
+<glyph unicode="&#x2050;" horiz-adv-x="790" d="M735 461l-66 -17q-16 80 -93 130.5t-184 50.5t-182.5 -50t-88.5 -131l-66 17q25 109 121 169.5t218 60.5q79 0 149 -25.5t122.5 -78.5t69.5 -126zM667 208l66 -17q-25 -109 -121 -170t-219 -61q-122 0 -217.5 61t-120.5 170l67 17q15 -87 88 -135t182 -48t183.5 48 t91.5 135z" />
+<glyph unicode="&#x2051;" horiz-adv-x="501" d="M268 35l9 -6q37 -24 96 -34q34 -5 47 -14.5t13 -28.5q0 -17 -10 -28t-26 -11q-25 0 -60 44q-23 28 -69 58l-8 5v-9q0 -56 20 -110q9 -25 9 -33q0 -15 -12.5 -27t-27.5 -12q-14 0 -25 11t-11 25t12 47q16 43 16 99v9q-40 -25 -52 -36q-12 -12 -41 -45q-22 -25 -43 -25 q-17 0 -27 10t-10 26q0 19 14.5 29t48.5 16q35 7 53.5 14t49.5 26q-43 26 -97 37q-37 8 -52 18t-15 28q0 16 9 26.5t24 10.5q20 0 49 -32q42 -47 89 -73v13q0 41 -15 91q-11 33 -11 52q0 14 10.5 24t25.5 10t26 -10.5t11 -25.5q0 -16 -11 -47q-17 -45 -17 -83v-24 q34 20 58 42q5 5 18 20l22 22q8 8 18.5 15.5t18.5 7.5q17 0 27 -10.5t10 -27.5q0 -20 -11.5 -29.5t-40.5 -13.5q-56 -9 -112 -41zM268 471l9 -6q37 -24 96 -34q34 -5 47 -14.5t13 -28.5q0 -17 -10 -28t-26 -11q-25 0 -60 44q-23 28 -69 58l-8 5v-9q0 -56 20 -110 q9 -25 9 -33q0 -15 -12.5 -27t-27.5 -12q-14 0 -25 11t-11 25t12 47q16 43 16 99v9q-40 -25 -52 -36q-12 -12 -41 -45q-22 -25 -43 -25q-17 0 -27 10t-10 26q0 19 14.5 29t48.5 16q35 7 53.5 14t49.5 26q-43 26 -97 37q-37 8 -52 18t-15 28q0 16 9 26.5t24 10.5q20 0 49 -32 q42 -47 89 -73v13q0 41 -15 91q-11 33 -11 52q0 14 10.5 24t25.5 10t26 -10.5t11 -25.5q0 -16 -11 -47q-17 -45 -17 -83v-24q34 20 58 42q5 5 18 20l22 22q8 8 18.5 15.5t18.5 7.5q17 0 27 -10.5t10 -27.5q0 -20 -11.5 -29.5t-40.5 -13.5q-56 -9 -112 -41z" />
+<glyph unicode="&#x2052;" horiz-adv-x="471" d="M176 619q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40zM406 -116q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40zM417 706l-294 -906h-69l296 906h67z" />
+<glyph unicode="&#x2057;" horiz-adv-x="710" d="M349 411l66 222q6 22 15.5 33.5t29.5 11.5q28 0 28 -32q0 -11 -14 -39l-107 -205zM212 411l66 222q6 22 15.5 33.5t29.5 11.5q28 0 28 -32q0 -11 -14 -39l-107 -205zM75 410l66 222q13 46 45 46q13 0 20.5 -9.5t7.5 -23.5q0 -11 -14 -39l-107 -205zM496 411l66 222 q6 22 15.5 33.5t29.5 11.5q28 0 28 -32q0 -11 -14 -39l-107 -205z" />
+<glyph unicode="&#x205f;" horiz-adv-x="1000" />
+<glyph unicode="&#x207f;" horiz-adv-x="541" d="M484 270h-190l1 24q36 3 45 12t9 50v183q0 89 -64 89q-22 0 -41.5 -10.5t-49.5 -40.5v-250q0 -7 0.5 -12t3.5 -8.5t4.5 -5.5t7.5 -3l10 -2q4 0 14.5 -0.5t17.5 -1.5v-24h-193v24q36 2 45 9.5t9 43.5v213q0 33 -6 45t-24 12q-16 0 -26 -5v24q56 16 121 40l14 -4v-67h1 q61 71 126 71q51 0 81 -35.5t30 -100.5v-201q0 -12 1.5 -19.5t2.5 -12t7 -7t9.5 -3t15 -1.5t18.5 -2v-24z" />
+<glyph unicode="&#x20a3;" horiz-adv-x="556" d="M384 390v-30h-183v-90h183v-30h-183v-128q0 -57 16.5 -73.5t74.5 -19.5v-19h-281v19q57 4 72.5 21.5t15.5 82.5v117h-82v30h82v90h-82v30h82v161q0 55 -15 71.5t-72 20.5v19h529l5 -143h-25q-11 68 -37.5 86.5t-116.5 18.5h-132q-21 0 -27.5 -7.5t-6.5 -31.5v-195h183z " />
+<glyph unicode="&#x20a4;" horiz-adv-x="500" d="M25 277h113l-10 90h-104v30h101q-2 18 -2 45q0 107 53 170.5t142 63.5q56 0 93 -26.5t37 -66.5q0 -23 -14 -38t-36 -15q-37 0 -39 67q-1 52 -56 52q-45 0 -70 -36t-25 -101q0 -60 7 -115h138v-30h-134q5 -36 5 -90h131v-30h-133q-6 -57 -23 -136q84 -35 149 -35 q68 0 113 49q15 16 23 16q6 0 6 -5q0 -14 -14.5 -42.5t-30.5 -45.5q-52 -55 -122 -55q-33 0 -63.5 13t-81.5 48q-30 -36 -51 -49t-47 -13q-31 0 -49.5 16.5t-18.5 45.5q0 34 25 55t66 21q22 0 46 -5q3 12 3 21q0 24 -9 101h-118v30zM88 94q-50 0 -50 -37q0 -17 11.5 -27 t30.5 -10q28 0 47 25q15 18 15 31q0 7 -17.5 12.5t-36.5 5.5z" />
+<glyph unicode="&#x20a7;" horiz-adv-x="1182" d="M949 301l104 -63q50 -30 69 -56t19 -67q0 -50 -41.5 -87.5t-98.5 -37.5q-47 0 -73 9q-27 9 -46 9q-17 0 -24 -12h-13v157h16q16 -73 46 -107t81 -34q37 0 60 21t23 53q0 46 -53 75l-54 30q-120 67 -120 145q0 58 37.5 90.5t100.5 32.5q44 0 67 -11q18 -8 28 -8q7 0 16 10 h11l5 -136h-15q-17 68 -42.5 95.5t-70.5 27.5q-34 0 -54.5 -17t-20.5 -51q0 -17 11.5 -36.5t31.5 -31.5zM782 77l13 -11q-48 -76 -121 -76q-88 0 -88 127v301h-53q-4 3 -4 7q0 8 17 19q38 22 97 107q2 3 9.5 12.5t10.5 15.5q7 0 7 -13v-116h101v-32h-101v-286q0 -48 12 -69 t40 -21q30 0 60 35zM202 291v-179q0 -57 16.5 -73.5t77.5 -19.5v-19h-280v19q58 4 71 21t13 82v429q0 56 -14.5 72t-69.5 20v19h238q128 0 203 -63q50 -42 50 -119q0 -40 -14 -76t-38 -55q-47 -38 -89.5 -49.5t-116.5 -11.5q-7 0 -47 3zM202 589v-258q34 -3 39 -3 q76 0 116.5 44.5t40.5 102.5q0 80 -40 115t-121 35q-21 0 -28 -7.5t-7 -28.5z" />
+<glyph unicode="&#x20ac;" horiz-adv-x="500" d="M462 500h-15q-12 60 -51.5 98.5t-94.5 38.5t-93 -66t-49 -178h244l-8 -34h-238q-1 -13 -1 -49h227l-8 -34h-218q3 -107 39 -177.5t94 -70.5q48 0 77 20.5t71 85.5l13 -10q-44 -77 -82.5 -106.5t-94.5 -29.5q-84 0 -136 77.5t-60 210.5h-40l8 34h30q0 38 1 49h-39l8 34h34 q16 121 75 196t146 75q41 0 88 -13.5t73 -39.5v-111z" />
+<glyph unicode="&#x20d0;" horiz-adv-x="0" d="M-17 627h-436l132 133l18 -8q-36 -30 -36 -52q0 -19 41 -19h281v-54z" />
+<glyph unicode="&#x20d1;" horiz-adv-x="0" d="M-17 627h-436v54h281q41 0 41 19q0 22 -36 52l18 8z" />
+<glyph unicode="&#x20d2;" horiz-adv-x="0" d="M-192 -156h-50v818h50v-818z" />
+<glyph unicode="&#x20d6;" horiz-adv-x="0" d="M-17 627h-286q-49 0 -49 -15q0 -3 2 -6.5t7.5 -9t10 -10.5t14.5 -14l16 -16l-18 -8l-133 106l132 106l18 -8q-49 -41 -49 -56t49 -15h286v-54z" />
+<glyph unicode="&#x20d7;" horiz-adv-x="0" d="M-17 654l-132 -106l-18 8q49 41 49 56t-49 15h-286v54h286q49 0 49 15q0 3 -2 6.5t-7.5 9t-10 10.5t-14.5 14l-16 16l18 8z" />
+<glyph unicode="&#x20db;" horiz-adv-x="0" d="M35 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM-164 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM-363 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5 t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#x20dc;" horiz-adv-x="0" d="M-302 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM-501 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM96 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5 t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM-103 572q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#x20dd;" horiz-adv-x="0" d="M-723 252q0 128 63.5 237t172.5 172.5t237 63.5t237 -63.5t172.5 -172.5t63.5 -237t-63.5 -237t-172.5 -172.5t-237 -63.5t-237 63.5t-172.5 172.5t-63.5 237zM-657 252q0 -169 119 -288t288 -119t288 119t119 288t-119 288t-288 119t-288 -119t-119 -288z" />
+<glyph unicode="&#x20de;" horiz-adv-x="0" d="M230 -180h-960v960h960v-960zM164 -114v828h-828v-828h828z" />
+<glyph unicode="&#x20df;" horiz-adv-x="0" d="M344 251l-591 -592l-593 593l592 591zM252 251l-500 500l-500 -499l501 -501z" />
+<glyph unicode="&#x20e1;" horiz-adv-x="0" d="M25 654l-132 -106l-18 8q49 41 49 56t-49 15h-177q-50 0 -50 -15q0 -3 2 -6.5t7.5 -9t10 -10.5t14.5 -14l16 -16l-18 -8l-133 106l132 106l18 -8q-49 -41 -49 -56t49 -15h178q49 0 49 15q0 3 -2 6.5t-7.5 9t-10 10.5t-14.5 14l-16 16l18 8z" />
+<glyph unicode="&#x20e4;" horiz-adv-x="0" d="M490 -155h-1460l721 1178zM-839 -89h1198l-608 964z" />
+<glyph unicode="&#x20e5;" horiz-adv-x="0" d="M-40 -156h-55l-335 818h55z" />
+<glyph unicode="&#x20e6;" horiz-adv-x="0" d="M-285 -156h-50v818h50v-818zM-102 -156h-50v818h50v-818z" />
+<glyph unicode="&#x20e7;" horiz-adv-x="0" d="M166 -178h-66v837h-750v66h816v-903z" />
+<glyph unicode="&#x20e8;" horiz-adv-x="0" d="M35 -169q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM-164 -169q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35zM-363 -169q0 -20 -15 -34.5t-36 -14.5q-20 0 -34 14.5 t-14 35.5q0 20 14.5 34.5t34.5 14.5t35 -15t15 -35z" />
+<glyph unicode="&#x20e9;" horiz-adv-x="0" d="M53 538h-54v89h-425v-89h-54v143h533v-143z" />
+<glyph unicode="&#x20ea;" horiz-adv-x="0" d="M118 220h-588q-26 0 -26 -20q0 -14 14 -28q21 -22 52 -66l-20 -19q-54 63 -97.5 97.5t-110.5 63.5v10q67 28 110.5 63t97.5 98l20 -19q-3 -5 -9 -14l-8 -12q-2 -3 -6.5 -9t-8 -10t-8.5 -9l-13 -13q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h589v-66z" />
+<glyph unicode="&#x20eb;" horiz-adv-x="0" d="M193 756l-403 -973h-54l403 973h54zM9 756l-402 -973h-55l403 973h54z" />
+<glyph unicode="&#x20ec;" horiz-adv-x="0" d="M-17 -119l-132 -133l-18 8q36 30 36 52q0 19 -41 19h-281v54h436z" />
+<glyph unicode="&#x20ed;" horiz-adv-x="0" d="M-17 -173h-281q-41 0 -41 -19q0 -22 36 -52l-18 -8l-132 133h436v-54z" />
+<glyph unicode="&#x20ee;" horiz-adv-x="0" d="M-17 -173h-286q-49 0 -49 -15q0 -3 2 -6.5t7.5 -9t10 -10.5t14.5 -14l16 -16l-18 -8l-133 106l132 106l18 -8q-49 -41 -49 -56t49 -15h286v-54z" />
+<glyph unicode="&#x20ef;" horiz-adv-x="0" d="M-17 -146l-133 -106l-18 8l16 16q10 9 14.5 14t10 10.5t7.5 9t2 6.5q0 15 -49 15h-286v54h286q49 0 49 15t-49 56l18 8z" />
+<glyph unicode="&#x20f0;" horiz-adv-x="0" d="M-87 727q0 -13 -17 -22q-5 -3 -41 -12.5t-65 -26.5q25 -14 62.5 -24t43.5 -14q15 -7 15 -23q0 -11 -7 -18.5t-20 -7.5q-14 0 -43 31.5t-56 46.5q0 -27 10.5 -66t10.5 -47q0 -9 -8.5 -18t-17.5 -9q-10 0 -18.5 9t-8.5 18q0 8 10 47t10 66q-21 -11 -50 -40t-34 -32 q-9 -6 -18 -6q-12 0 -19 6.5t-7 15.5q0 20 14 27q7 4 47 15t60 23q-20 12 -61 23.5t-49 16.5q-13 8 -13 21q0 11 7 20.5t18 9.5q5 0 15 -5q7 -4 37.5 -34t52.5 -42q0 28 -10 68t-10 48q0 10 8.5 18.5t18.5 8.5q9 0 17.5 -8.5t8.5 -18.5q0 -8 -10.5 -47.5t-10.5 -67.5 q30 16 56.5 44t31.5 31q10 5 15 5q11 0 18 -9.5t7 -20.5z" />
+<glyph unicode="&#x2102;" horiz-adv-x="705" d="M632 159l31 -31q-118 -142 -289 -142q-146 0 -237.5 99.5t-91.5 246.5q0 150 90.5 247t239.5 97q89 0 158 -35t128 -107l-31 -31q-46 47 -75 71t-74 41t-102 17q-95 0 -166 -49v-503q26 -21 76.5 -35.5t88.5 -14.5q82 0 134.5 30t119.5 99zM169 118v440 q-80 -116 -80 -226q0 -98 59 -187q12 -20 21 -27z" />
+<glyph unicode="&#x2105;" horiz-adv-x="837" d="M646 676l-450 -690h-49l453 690h46zM795 170q0 -80 -48 -132t-125 -52q-70 0 -118 52t-48 131t48 128t125 49q72 0 119 -48.5t47 -127.5zM725 150q0 85 -37 136q-33 38 -74 38q-40 0 -64 -32t-24 -89q0 -97 40 -157q26 -38 69 -38t66.5 37.5t23.5 104.5zM334 443l10 -7 q-32 -65 -62 -88q-38 -32 -88 -32q-64 0 -105 48t-41 122q0 98 64 150q50 40 103 40q49 0 84 -23.5t35 -55.5q0 -13 -10.5 -22.5t-25.5 -9.5q-26 0 -36 35l-5 17q-6 21 -15.5 28.5t-29.5 7.5q-47 0 -76 -36.5t-29 -95.5q0 -67 33 -108.5t86 -41.5q33 0 56.5 15.5t51.5 56.5z " />
+<glyph unicode="&#x2107;" horiz-adv-x="598" d="M389 366v-40q-137 0 -191 -35q-55 -36 -55 -109t48.5 -112.5t135.5 -39.5q83 0 121 57l19 33q11 19 16.5 27t16 15t24.5 7q37 0 37 -40q0 -37 -38 -69.5t-91 -50.5q-68 -23 -131 -23q-103 0 -173 40q-100 57 -100 166q0 52 30 87.5t70.5 50.5t90.5 18v1q-69 8 -115 54 q-42 42 -42 98q0 77 61.5 126t180.5 49q50 0 105 -15q60 -18 71 -18q30 0 38 33h20l10 -227h-23q-11 88 -64 138.5t-134 50.5t-122 -41t-41 -107q0 -67 58 -98q47 -26 167 -26z" />
+<glyph unicode="&#x210a;" horiz-adv-x="738" d="M678 424l-269 -498q44 -23 91 -23q59 0 100 30l12 -26q-54 -34 -117 -34q-61 0 -102 22q-77 -114 -203 -114q-47 0 -72.5 21.5t-25.5 49.5q0 48 54 80q44 26 115 26q59 0 91 -13l87 156l-1 1q-54 -58 -102.5 -85.5t-104.5 -27.5q-38 0 -61 29t-23 76q0 48 23 99 q-30 -20 -70 -20q-39 0 -70 17l10 26q31 -13 57 -13q64 0 129 79q57 69 131.5 114t134.5 45q36 0 60 -16.5t28 -48.5h2l28 48h68zM550 364q0 42 -54 42q-95 0 -205 -159q-86 -125 -86 -187q0 -19 12 -30t29 -11q61 0 134.5 64.5t121.5 146t48 134.5zM337 -86l-1 1 q-29 13 -84 13q-57 0 -91.5 -20t-34.5 -52q0 -18 15.5 -29.5t40.5 -11.5q93 0 155 99z" />
+<glyph unicode="&#x210b;" horiz-adv-x="997" d="M714 664l-18 -14q-124 -96 -232 -310q22 9 62 21.5t53 17.5l33 43q100 125 187.5 195t134.5 70q57 0 57 -50q0 -39 -25.5 -76t-72 -68.5t-95 -56t-111.5 -49.5q-174 -251 -174 -334q0 -15 9.5 -25t24.5 -10q55 0 167 129l21 -13q-120 -146 -202 -146q-39 0 -63 24t-24 65 q0 101 104 262l-107 -41q-57 -111 -132 -193t-145 -109q-30 -11 -56 -11q-25 0 -41 16.5t-16 43.5q0 128 283 247q4 7 20 33l22 37l23 33.5t29 38.5l30 38q19 22 40.5 43t46.5 43q-7 -1 -20 -1q-44 0 -124 44q-63 34 -102 34q-47 0 -81.5 -30.5t-34.5 -70.5q0 -42 21.5 -68 t66.5 -26q38 0 66 21.5t55 64.5l18 -9q-54 -107 -141 -107q-59 0 -93 35t-34 91q0 59 50 105t125 46q29 0 58 -10.5t84 -38.5q60 -31 86 -31q41 0 80 19q14 7 43 28l32 24zM958 635q0 22 -24 22q-27 0 -85.5 -63t-128.5 -160q238 105 238 201zM307 241q-105 -48 -163 -96 t-58 -101q0 -25 24 -29q67 0 197 226z" />
+<glyph unicode="&#x210c;" horiz-adv-x="824" d="M626 695l19 -13q-96 -135 -219 -135q-72 0 -133 50q-41 -33 -41 -91q0 -77 57 -139q147 86 224 127q114 -26 177 -100.5t63 -178.5q0 -74 -22 -120t-67 -92q-37 -39 -126.5 -104t-117.5 -103h-13q-60 62 -132 62q-69 0 -114 -56l-20 9q60 136 185 136q70 0 129 -64 q51 32 88.5 71.5t56.5 78.5t27.5 73t8.5 66q0 90 -51.5 156t-133.5 66q-63 0 -143 -54l44 -56q35 -45 35 -82q0 -45 -37.5 -92.5t-139.5 -131.5q-18 14 -61 37.5t-56 27.5q-34 -33 -46 -53l-24 15l104 147l76 -45q56 -33 59 -33q11 10 16 16t9.5 18t4.5 28q0 22 -24.5 55.5 t-54 66t-54 82.5t-24.5 100q0 35 18.5 71.5t56.5 74t61 57t66 52.5q57 -53 131 -53q89 0 138 53z" />
+<glyph unicode="&#x210d;" horiz-adv-x="718" d="M648 0h-166v309h-246v-309h-166v662h166v-309h246v309h166v-662zM604 44v574h-78v-574h78zM192 44v574h-78v-574h78z" />
+<glyph unicode="&#x210e;" horiz-adv-x="577" d="M533 117l12 -11q-78 -116 -147 -116q-53 0 -53 56q0 24 24 110l40 144q9 34 9 62q0 44 -37 44q-24 0 -61 -35.5t-79 -97.5q-34 -50 -55.5 -104t-54.5 -169h-84l158 573q4 16 4 29q0 22 -57 22v15q91 18 156 44l8 -2l-120 -435h1q110 214 219 214q88 0 88 -88 q0 -34 -11 -71l-51 -179q-11 -37 -11 -55q0 -17 13 -17q32 0 89 67z" />
+<glyph unicode="&#x210f;" horiz-adv-x="579" d="M532 117l15 -10q-79 -117 -149 -117q-53 0 -53 56q0 21 24 110l40 144q9 34 9 62q0 44 -37 44q-24 0 -61 -35.5t-79 -97.5q-34 -50 -55.5 -104t-54.5 -169h-84l127 469l-94 -34l9 43l97 35l19 60q4 12 4 29q0 22 -57 22v15q83 17 157 44l8 -2q-11 -33 -26 -88l-13 -46 l144 53l-12 -44l-144 -52l-70 -258h1q110 214 219 214q88 0 88 -88q0 -34 -11 -71l-51 -179q-11 -37 -11 -55q0 -17 13 -17q31 0 88 67z" />
+<glyph unicode="&#x2110;" horiz-adv-x="897" d="M63 95h-2q0 -23 35.5 -51t84.5 -28q102 0 174 53.5t138 201.5q15 35 27 59q-56 12 -90 48t-34 93q0 91 86 145q65 40 183 40q51 0 118 -8q40 27 76 27q12 0 20.5 -5.5t8.5 -14.5q0 -52 -109 -52q-36 -26 -69 -83t-77 -152q74 20 125 99l16 -10q-51 -100 -157 -124 q-79 -170 -133 -227q-117 -121 -285 -121q-77 0 -125 35.5t-48 86.5q0 31 17 51.5t42 20.5q22 0 36.5 -13.5t14.5 -34.5q0 -20 -11.5 -34t-31.5 -14q-23 0 -30 12zM729 601v2q-15 1 -53 1q-100 0 -154 -24q-36 -16 -60.5 -47.5t-24.5 -70.5q0 -34 25 -64t74 -36 q45 87 89.5 143t103.5 96z" />
+<glyph unicode="&#x2111;" horiz-adv-x="762" d="M688 674l23 -7q-8 -28 -17.5 -50t-27.5 -47.5t-48.5 -39.5t-71.5 -14q-59 0 -136 39.5t-134 39.5q-44 0 -80.5 -29t-36.5 -85q0 -48 31 -74.5t71 -26.5q34 0 65 14l8 -22q-39 -20 -77 -20q-76 0 -121 40t-45 105q0 79 61.5 138.5t155.5 59.5q51 0 93.5 -12.5t67.5 -27 t61 -27t74 -12.5q23 0 42.5 12.5t28 23.5t13.5 22zM703 417l-18 -16q-34 30 -65 30q-22 0 -39.5 -15.5t-17.5 -42.5q0 -22 26.5 -58t53.5 -79t27 -84q0 -76 -71 -131t-168 -55q-114 0 -167 40q-45 33 -70 92q-22 50 -56 50q-21 0 -40 -14.5t-30 -36.5l-23 6q9 38 50 81.5 t93 43.5q28 0 50 -9.5t35 -20.5t25.5 -34.5t17.5 -36t14 -40.5q29 -83 109 -83q48 0 78 27.5t30 66.5q0 33 -14.5 66t-32 56t-32 57.5t-14.5 69.5q0 55 41.5 90.5t93.5 35.5q31 0 54 -9t33.5 -18.5t26.5 -28.5z" />
+<glyph unicode="&#x2112;" horiz-adv-x="946" d="M608 643l-12 -19q-55 33 -145 33q-86 0 -154 -42t-68 -115q0 -74 66.5 -116t175.5 -42q25 0 63 5l30 57l30 59q13 23 26 43q42 63 106.5 113t121.5 50q42 0 62.5 -22.5t20.5 -59.5q0 -68 -87 -143.5t-217 -110.5q-47 -102 -119 -185.5t-136 -108.5q69 -23 103 -23 q141 0 265 139l19 -14q-131 -156 -281 -156q-84 0 -164 30q-70 -24 -155 -24q-126 0 -126 61q0 23 29.5 40t78.5 17q21 0 46 -5.5t39 -10.5t46.5 -18t41.5 -16q42 27 99.5 98t104.5 158q-26 -3 -53 -3q-50 0 -96.5 10.5t-88 31.5t-67 60t-25.5 90q0 78 73.5 130.5 t181.5 52.5q99 0 165 -44zM890 588q0 44 -49 44q-55 0 -108.5 -80t-89.5 -183q45 12 104 45q62 34 102.5 80t40.5 94zM266 35v1q-74 43 -125 43q-67 0 -67 -25q0 -33 87 -33q66 0 105 14z" />
+<glyph unicode="&#x2113;" horiz-adv-x="579" d="M77 389l14 26q36 -25 94 -25q85 125 174.5 211t147.5 86q64 0 64 -67q0 -81 -96.5 -161t-225.5 -99q-143 -231 -143 -298q0 -43 36 -43q33 0 76.5 38t122.5 129l21 -17q-85 -99 -133.5 -139.5t-93.5 -40.5q-37 0 -62 22.5t-25 64.5q0 84 77 218q12 22 40 66q-49 2 -88 29 zM268 396l1 -1q117 26 194.5 91.5t77.5 137.5q0 31 -35 31q-37 0 -82 -47q-58 -59 -156 -212z" />
+<glyph unicode="&#x2115;" horiz-adv-x="698" d="M628 0h-134l-378 504h-2v-504h-22h-22v662h135l32 -45l346 -461h1v506h44v-662zM584 44v39l-402 535h-68v-40l401 -534h69z" />
+<glyph unicode="&#x2116;" horiz-adv-x="1012" d="M966 307q0 -68 -38 -114t-101 -46q-64 0 -101.5 46t-37.5 112q0 67 37.5 114t101.5 47q62 0 100.5 -47t38.5 -112zM888 304q0 140 -63 140q-59 0 -59 -139q0 -136 60 -136q62 0 62 135zM962 0h-270v87h270v-87zM556 213v188q0 30 0.5 47.5t3 50t8 53t16.5 47t26.5 41.5 t39.5 25.5t55 10.5q49 0 75.5 -16t26.5 -57q0 -27 -18 -41t-38 -14q-19 0 -31.5 12.5t-18 27t-13 27t-17.5 12.5q-16 0 -28.5 -11t-20 -32.5t-12 -44.5t-7 -55.5t-3 -56.5t-0.5 -55v-383h-18l-324 503v-231q0 -30 -0.5 -47.5t-3 -50t-8 -53t-16.5 -47t-26.5 -41.5 t-39.5 -25.5t-55 -10.5q-49 0 -75.5 16t-26.5 57q0 27 18 41t38 14q19 0 31.5 -12.5t18 -27t13 -27t17.5 -12.5q16 0 28.5 11t20 32.5t12 44.5t7 55.5t3 56.5t0.5 55v269q-40 63 -63 74q-18 8 -61 10v19h180z" />
+<glyph unicode="&#x2117;" horiz-adv-x="760" d="M246 520h143q78 0 119 -34q27 -23 27 -67t-31 -72q-22 -21 -47 -27.5t-70 -6.5q-1 0 -31 2v-97q0 -32 9 -41t42 -10v-15h-161v15q32 2 39 11t7 45v232q0 30 -8 39t-38 11v15zM356 479v-142l26 -2q86 0 86 82q0 46 -19 63.5t-74 17.5q-12 0 -15.5 -4t-3.5 -15zM722 329 q0 -144 -99 -243.5t-242 -99.5q-145 0 -244 100t-99 246q0 145 100.5 244.5t246.5 99.5q140 0 238.5 -101.5t98.5 -245.5zM667 330q0 127 -84.5 215.5t-204.5 88.5q-115 0 -200 -90.5t-85 -212.5q0 -124 85 -213.5t203 -89.5q117 0 201.5 89.5t84.5 212.5z" />
+<glyph unicode="&#x2118;" horiz-adv-x="826" d="M439 462h-15q-3 21 -25.5 32t-50.5 11q-75 0 -140.5 -67t-65.5 -178q0 -90 45 -114q47 72 113 138q69 70 146 115q87 51 205 51q68 0 108 -36t40 -106q0 -64 -33 -134.5t-85 -119.5q-69 -64 -151 -64q-56 0 -85.5 30.5t-29.5 69.5q0 28 16 49t42 21q18 0 31 -11.5 t13 -32.5q0 -19 -17 -36t-17 -25q0 -37 54 -37q46 0 87 53t62.5 123.5t21.5 131.5q0 39 -17.5 67.5t-59.5 28.5q-74 0 -180 -97.5t-182 -213.5q51 -17 79 -44t28 -80q0 -83 -55 -143.5t-131 -60.5q-99 0 -99 104q0 59 29 134q17 44 47 93q-115 48 -115 165q0 100 85 184 t202 84q42 0 71 -22.5t29 -62.5zM306 -11q0 26 -15.5 52t-41.5 35q-4 -4 -22.5 -39.5t-37 -87.5t-18.5 -85q0 -25 7 -37.5t28 -12.5q39 0 69.5 60.5t30.5 114.5z" />
+<glyph unicode="&#x2119;" horiz-adv-x="678" d="M70 662h320q104 0 171 -51t67 -152q0 -102 -66.5 -154t-170.5 -52h-155v-253h-166v662zM491 604v-294q42 14 67.5 57t25.5 90q0 50 -24 91t-69 56zM447 305v304q-18 9 -59 9h-152v-321h145q49 0 66 8zM192 44v574h-78v-574h78z" />
+<glyph unicode="&#x211a;" horiz-adv-x="765" d="M703 -12l6 -44q-63 -9 -83 -9q-44 0 -73.5 18t-58.5 51q-51 -18 -113 -18q-146 0 -241 100t-95 246q0 154 93 249t247 95q149 0 239.5 -97t90.5 -247q0 -102 -46 -183.5t-127 -124.5q45 -45 84 -45q21 0 77 9zM591 548v-429q80 80 80 213t-80 216zM547 79v505 q-59 48 -166 48q-40 0 -90.5 -13t-77.5 -35v-505q19 -13 44 -23q54 66 127 66q64 0 126 -64q20 8 37 21zM169 119v429q-80 -83 -80 -216q0 -128 80 -213zM460 41q-37 37 -79 37q-41 0 -76 -37q42 -11 76 -11q37 0 79 11z" />
+<glyph unicode="&#x211b;" horiz-adv-x="944" d="M852 669l7 -19q-34 -14 -66 -38q83 -53 83 -139q0 -64 -48.5 -111t-131.5 -50v-2q54 -40 54 -84q0 -37 -38 -97t-38 -77q0 -34 32 -34q52 0 145 101l17 -16q-101 -115 -176 -115q-37 0 -65 23.5t-28 58.5q0 33 21 63.5t42 58t21 53.5q0 48 -33 48q-30 0 -47 11 q-82 -169 -178.5 -244t-217.5 -75q-77 0 -125 36t-48 87q0 31 17 51t42 20q22 0 36.5 -13.5t14.5 -34.5q0 -20 -11.5 -34t-31.5 -14q-23 0 -30 12h-2q0 -28 35 -53.5t85 -25.5q93 0 152.5 52t144.5 203q78 139 131.5 214t120.5 124q-76 48 -192 48q-149 0 -250 -75 t-101 -174q0 -41 30 -68.5t73 -27.5q159 0 205 245h20q-7 -107 -68.5 -191t-158.5 -84q-63 0 -102.5 35.5t-39.5 94.5q0 107 111 191t282 84q125 0 221 -59q36 23 84 41zM814 486q0 64 -48 102q-11 -10 -21 -23l-18 -23q-8 -10 -19 -28l-16 -26l-16 -32l-16 -31l-17 -35 q-13 -27 -17 -36q34 0 60 -17q57 6 92.5 50t35.5 99z" />
+<glyph unicode="&#x211c;" horiz-adv-x="874" d="M813 114l16 -20q-24 -24 -70 -60t-80 -56h-14q-52 17 -75.5 78.5t-23.5 130.5q0 136 -52 153l-74 -18q-21 -91 -73 -182.5t-124 -161.5q-100 59 -118 62q-27 -23 -44 -49l-22 14l94 145q102 -61 120 -61t29.5 30.5t15.5 89t5 96.5t1 100q0 259 -108 259q-30 0 -48.5 -20 t-18.5 -47t12 -47t29 -33l33 -27q17 -13 29 -35.5t12 -53.5q0 -50 -49.5 -94t-116.5 -60l-9 22q27 9 51 30.5t24 50.5q0 24 -11.5 43.5t-28.5 34.5l-34 30q-17 15 -28.5 36t-11.5 46q0 72 53.5 113.5t131.5 41.5q107 0 177 -88l133 97q93 0 144.5 -43.5t51.5 -105.5 q0 -57 -31.5 -103t-92.5 -69v-2q34 -21 53 -61.5t24.5 -82t10 -80.5t17 -63.5t37.5 -24.5q12 0 54 45zM444 357l33 7q79 17 113 64t34 103q0 34 -24.5 65t-68.5 31q-29 0 -51 -12t-52 -42q20 -56 20 -108q0 -65 -4 -108z" />
+<glyph unicode="&#x211d;" horiz-adv-x="747" d="M712 0h-207l-195 271h-74v-271h-166v662h320q105 0 171.5 -47.5t66.5 -148.5q0 -67 -34 -114.5t-97 -66.5zM491 604v-283q43 18 68 57t25 86q0 98 -93 140zM447 320v290q-4 0 -22.5 4t-27.5 4h-161v-303h156q10 0 55 5zM626 44l-175 231q-23 -4 -88 -4l165 -227h98z M192 44v574h-78v-574h78z" />
+<glyph unicode="&#x211e;" horiz-adv-x="780" d="M763 0h-173l-26 33l-138 -134l-27 28l140 136l-195 242q-22 -2 -33 -2t-35 2v-133v-43q0 -65 25 -84t93 -21v-24h-325v24q68 2 93 21t25 84v54v355q0 65 -25 84t-93 21v24h286q46 0 91 -8.5t88 -27.5t69.5 -55.5t26.5 -86.5q0 -68 -54.5 -112t-128.5 -60q16 -19 69 -88.5 t85 -105.5l135 132l27 -28l-136 -132q36 -37 64.5 -54.5t71.5 -18.5v-22zM276 567v-232q34 -2 50 -2q46 0 78 5t62.5 19.5t46 45t15.5 77.5q0 86 -38.5 120.5t-125.5 34.5q-42 0 -65 -14t-23 -54z" />
+<glyph unicode="&#x2122;" horiz-adv-x="980" d="M957 662v-20q-32 -2 -44 -14t-12 -41v-254q0 -36 6.5 -43.5t43.5 -11.5v-20h-170v20q34 4 42 9q7 6 7 45v236l-154 -312h-11l-151 310v-223q0 -36 10.5 -48.5t42.5 -16.5v-20h-131v20q32 4 42 16.5t10 48.5v249q-21 48 -69 50v20h121l154 -309l160 309h103zM375 574h-20 q-11 37 -26 52.5t-41 15.5h-50v-308q0 -36 6.5 -44t43.5 -12v-20h-171v20q37 4 43.5 12t6.5 44v308h-49q-27 0 -42.5 -15.5t-25.5 -52.5h-20v88h345v-88z" />
+<glyph unicode="&#x2124;" horiz-adv-x="727" d="M677 618l-425 -574h416v-44h-618v44l419 574h-369v44h577v-44zM617 618h-94l-420 -574h97z" />
+<glyph unicode="&#x2125;" horiz-adv-x="424" d="M219 265v-2q87 -16 129.5 -67t42.5 -129q0 -124 -71.5 -204.5t-188.5 -80.5q-41 0 -68.5 15.5t-27.5 39.5q0 16 12 27.5t29 11.5q23 0 48 -32q21 -26 52 -26q44 0 83.5 67t39.5 160t-31.5 140.5t-108.5 47.5h-55v15l160 170v2h-197v15l199 195v2h-118q-47 0 -63.5 -16.5 t-23.5 -71.5h-19l4 118h331v-15l-195 -195v-2h195v-15z" />
+<glyph unicode="&#x2126;" horiz-adv-x="744" d="M715 0h-286l7 150q62 15 101.5 85.5t39.5 153.5q0 110 -54.5 180.5t-150.5 70.5q-65 0 -113 -38.5t-70 -94t-22 -118.5q0 -78 38.5 -149.5t101.5 -89.5l9 -150h-287v160h19q1 -44 17 -60t51 -16h149l-2 37q-106 30 -158 94.5t-52 171.5q0 114 87.5 201.5t231.5 87.5 q143 0 231 -86t88 -203q0 -206 -213 -266l-2 -37h171q28 0 37.5 17t11.5 57h19v-158z" />
+<glyph unicode="&#x2127;" horiz-adv-x="744" d="M715 504h-19q-2 40 -11.5 57t-37.5 17h-171l2 -37q213 -60 213 -266q0 -117 -88 -203t-231 -86q-144 0 -231.5 87.5t-87.5 201.5q0 107 52 171.5t158 94.5l2 37h-149q-35 0 -51 -16t-17 -60h-19v160h287l-9 -150q-63 -18 -101.5 -89.5t-38.5 -149.5q0 -63 22 -118.5 t70 -94t113 -38.5q96 0 150.5 70.5t54.5 180.5q0 83 -39.5 153.5t-101.5 85.5l-7 150h286v-158z" />
+<glyph unicode="&#x2128;" horiz-adv-x="726" d="M484 268v-2q88 -14 140 -72t52 -150q0 -103 -75.5 -175.5t-199.5 -72.5q-64 0 -109.5 15.5t-84.5 59.5q-13 15 -21 34.5t-10.5 32.5t-10.5 22.5t-22 9.5q-20 0 -40 -14.5t-30 -36.5l-23 7q10 40 44.5 81t87.5 41q30 0 51 -8.5t34.5 -27t20 -32t16.5 -39.5 q19 -54 44 -80.5t77 -26.5q38 0 64.5 16t39 45.5t17.5 61t5 72.5q0 95 -43.5 152.5t-113.5 57.5q-57 0 -89 -18.5t-68 -65.5l-24 14q18 28 32 44.5t41 33.5t61 24v2q-74 13 -115 89l27 18q50 -77 128 -77q61 0 104 48t43 125q0 89 -51.5 130t-124.5 41q-156 0 -220 -179 l-25 7q26 103 95.5 161.5t179.5 58.5t186.5 -57t76.5 -158q0 -73 -43.5 -130.5t-123.5 -81.5z" />
+<glyph unicode="&#x2129;" horiz-adv-x="360" d="M276 0h-124v343q0 73 -43 73q-16 0 -26.5 -13t-13.5 -24t-7 -31h-30q6 50 35.5 82.5t78.5 32.5q130 0 130 -122v-341z" />
+<glyph unicode="&#x212b;" horiz-adv-x="722" d="M141 186l205 487q-37 4 -61.5 32t-24.5 67q0 41 29.5 70t71.5 29q40 0 69 -29.5t29 -70.5q0 -39 -26 -67t-65 -32l245 -561q22 -52 39.5 -70t54.5 -22v-19h-255v19q40 0 55 9q14 7 14 24q0 26 -19 70l-41 94h-262l-46 -114q-9 -23 -9 -42q0 -23 16.5 -32t53.5 -9v-19 h-199v19q42 4 61 30.5t65 136.5zM425 772q0 27 -19.5 46t-47.5 19q-26 0 -45 -19.5t-19 -45.5q0 -28 19 -47t45 -19q28 0 47.5 19t19.5 47zM447 257l-116 275l-115 -275h231z" />
+<glyph unicode="&#x212c;" horiz-adv-x="950" d="M895 660l7 -19q-42 -19 -72 -40q72 -59 72 -138q0 -50 -44.5 -93.5t-108.5 -51.5v-2q45 -19 67.5 -55t22.5 -75q0 -44 -25.5 -89t-70.5 -75q-49 -33 -112 -33q-44 0 -69 24t-25 54q0 50 36 85.5t102 46.5l4 -23q-42 -5 -73.5 -33t-31.5 -61q0 -20 14.5 -34t35.5 -14 q36 0 61 15q36 21 57 63.5t21 90.5q0 69 -46 95q-24 -6 -49 -6q-38 0 -47 19q-157 -326 -414 -326q-77 0 -125 35.5t-48 86.5q0 31 17 51.5t42 20.5q22 0 36.5 -13.5t14.5 -34.5q0 -20 -11.5 -34t-31.5 -14q-23 0 -30 12h-2q0 -28 35 -53.5t85 -25.5q95 0 161.5 53.5 t150.5 201.5q71 125 134.5 203t140.5 127q-81 56 -210 56q-93 0 -177.5 -31.5t-139.5 -92.5t-55 -137q0 -47 30 -76.5t81 -29.5q84 0 144 75t65 196h20q0 -125 -64 -213t-170 -88q-63 0 -105 37t-42 106q0 66 40 122t102.5 90t132.5 53t136 19q144 0 244 -67q34 20 87 40z M841 485q0 53 -40 95q-45 -38 -81.5 -92.5t-80.5 -139.5q7 4 23 4q27 0 55 -14q60 5 92 49t32 98z" />
+<glyph unicode="&#x212d;" horiz-adv-x="717" d="M659 678l16 -16l-24 -33q-9 -12 -28.5 -33.5t-40.5 -32.5t-43 -11q-69 0 -108 46q-39 -39 -39 -73q0 -21 14.5 -45.5t35.5 -47.5l42 -49q21 -25 35.5 -55t14.5 -60q0 -53 -48.5 -94t-109.5 -41q-40 0 -67 15l11 22q22 -11 40 -11q28 0 46 15t18 44q0 35 -18 69t-40 57.5 t-40 58t-18 70.5q0 23 11.5 47.5t36 50.5t42.5 42.5t52 44.5l44 37q57 -54 92 -54t73 37zM624 173l20 -12q-41 -79 -111 -132t-163 -53q-63 0 -117 22.5t-91.5 60t-63.5 87t-38.5 103t-12.5 107.5q0 39 8.5 81.5t28 87t47.5 80t72 58t97 22.5q60 0 95 -37l-16 -19 q-25 16 -64 16q-48 0 -83.5 -39.5t-51.5 -94t-16 -112.5q0 -62 13.5 -118.5t41.5 -106.5t77 -79.5t114 -29.5q115 0 214 108z" />
+<glyph unicode="&#x212e;" horiz-adv-x="843" d="M808 330h-630v-176q0 -18 2 -24t14 -20q37 -44 97 -69.5t133 -25.5q154 0 247 113h71q-68 -76 -140.5 -110.5t-177.5 -34.5q-165 0 -277 100.5t-112 246.5q0 143 110.5 244.5t278.5 101.5q71 0 137.5 -22.5t120.5 -64.5t88 -109t38 -150zM666 387v121q0 12 -3 21t-5 11 l-12 16q-30 39 -93 63t-129 24q-65 0 -129 -27.5t-101 -67.5q-11 -11 -13.5 -18t-2.5 -28v-118q0 -12 4 -16t15 -4h446q13 0 18 4.5t5 18.5z" />
+<glyph unicode="&#x212f;" horiz-adv-x="627" d="M534 196l20 -20q-92 -93 -170 -140t-154 -47q-52 0 -79 29.5t-27 81.5q0 46 18 92q-34 4 -65 23.5t-47 48.5l23 17q29 -57 101 -62q44 91 132.5 156.5t176.5 65.5q32 0 51.5 -14t19.5 -41q0 -56 -85.5 -114.5t-224.5 -79.5q-42 -74 -42 -118q0 -26 15 -40.5t39 -14.5 q119 0 298 177zM245 227l1 -1q105 15 181.5 64.5t76.5 93.5q0 27 -36 27q-47 0 -106 -46.5t-117 -137.5z" />
+<glyph unicode="&#x2130;" horiz-adv-x="750" d="M421 658l-10 -18q-44 17 -110 17q-72 0 -116 -31t-44 -80q0 -53 55 -83.5t136 -30.5q6 65 56 118t116.5 80.5t129.5 27.5q100 0 100 -73q0 -62 -97.5 -118.5t-233.5 -66.5q1 -6 4 -12q75 -3 75 -31t-42 -28q-28 0 -53 14q-88 -23 -141.5 -83t-53.5 -126q0 -49 39 -84 t105 -35q94 0 149 60q35 38 35 85q0 34 -24 54t-63 20q-53 0 -99.5 -39.5t-64.5 -102.5l-21 6q20 82 74.5 130t127.5 48q66 0 100 -31.5t34 -83.5q0 -68 -78 -122t-180 -54q-91 0 -153.5 44.5t-62.5 124.5q0 79 63 140.5t174 84.5v2q-2 2 -4 7l-3 9q-2 4 -4 4 q-107 2 -171.5 41.5t-64.5 106.5q0 57 52.5 97.5t136.5 40.5q75 0 132 -29zM693 588q0 15 -15 24t-37 9q-72 0 -150 -62t-88 -129q118 7 204 57.5t86 100.5z" />
+<glyph unicode="&#x2131;" horiz-adv-x="919" d="M896 662l11 -15q-89 -73 -176 -73q-57 0 -181 30t-168 30q-93 0 -148 -39t-55 -104q0 -56 31.5 -84t75.5 -28q71 0 114.5 43.5t71.5 132.5l20 -1q-39 -205 -209 -205q-59 0 -102 37t-43 98q0 78 64 132q76 64 227 64q56 0 180.5 -28t173.5 -28q47 0 113 38zM657 568 l14 -14q-34 -33 -57 -83t-50 -134q69 14 121 15q18 27 40 42t38 15q23 0 23 -22q0 -15 -20.5 -37.5t-51.5 -37.5q-8 -22 -8 -60q0 -12 3 -26l-59 -20v18q0 33 11 70q-62 -3 -115 -12q-105 -282 -354 -282q-59 0 -104 28.5t-45 82.5q0 32 16.5 50.5t43.5 18.5q20 0 35 -14.5 t15 -34.5q0 -21 -12 -35.5t-32 -14.5q-21 0 -29 13h-2q4 -27 33.5 -45t72.5 -18q76 0 132.5 48t120.5 177q-97 -31 -177 -85l-13 15q58 70 216 124q3 6 8 17.5t6 13.5q30 69 72 120t108 107z" />
+<glyph unicode="&#x2132;" horiz-adv-x="535" d="M462 0h-440l-9 75h362v201h-296v75h296v311h87v-662z" />
+<glyph unicode="&#x2133;" horiz-adv-x="1072" d="M1048 672l8 -13q-142 -225 -230.5 -393t-88.5 -213q0 -35 33 -35q55 0 170 132l19 -16q-120 -146 -203 -146q-37 0 -61.5 22t-24.5 60q0 149 308 563l-1 2q-66 -25 -144.5 -120t-185.5 -284q-81 -143 -113 -181q-46 -54 -100 -54q-25 0 -40.5 19t-15.5 51q0 88 143 307 q126 196 192 270l-1 1q-53 -22 -118.5 -91t-120.5 -156l-51 -83l-48 -76l-40 -64q-24 -38 -39 -58.5t-35 -45.5t-35 -37.5t-33.5 -25t-36.5 -17.5t-37 -5q-34 0 -57 22.5t-23 55.5q0 28 17.5 46.5t41.5 18.5q22 0 37 -16t15 -36q0 -18 -12 -31t-31 -13q-8 0 -15 4h-3 q3 -21 31 -21q50 0 98 51t127 184q145 242 238.5 333t179.5 91q7 0 17 -2l15 -12q-100 -141 -191.5 -297t-130.5 -245q-17 -45 -17 -61q0 -18 13 -18q18 0 36.5 23t49.5 72l60 100l68 117q28 48 72.5 110.5t82.5 103t86.5 72t96.5 37.5q16 0 28 -2z" />
+<glyph unicode="&#x2134;" horiz-adv-x="697" d="M668 223l12 -25q-31 -21 -75 -21q-41 0 -69 18q-119 -206 -269 -206q-51 0 -80 29.5t-29 87.5q0 46 18 91q-29 -24 -82 -24q-33 0 -64 17l10 26q31 -13 57 -13q68 0 123 72t130.5 119t146.5 47q39 0 63 -24.5t24 -62.5q0 -62 -34 -130q25 -17 59 -17q36 0 59 16zM554 355 q-5 51 -55 51q-53 0 -122 -62.5t-115 -139.5t-46 -121q0 -27 14 -45.5t42 -18.5q56 0 118 46t116 146q-16 25 -16 59q0 29 19 55t45 30z" />
+<glyph unicode="&#x2135;" horiz-adv-x="682" d="M493 265l94 -94q47 -47 47 -92q0 -46 -19 -92h-25q0 13 -3 24q-3 9 -10.5 20.5t-14.5 20.5t-18.5 21l-17.5 18l-18 17l-12 11l-304 281q-30 -52 -30 -109q0 -58 50 -114q5 -6 16 -17l16 -18q6 -6 12.5 -16t9.5 -20t3 -21q0 -38 -35 -61.5t-98 -23.5h-76v24q33 1 66.5 13 t33.5 37q0 19 -15.5 36t-34.5 31t-34.5 45t-15.5 73q0 99 106 167l-83 81q-40 38 -40 89q0 45 32 81h24q-4 -8 -4 -17q0 -6 1.5 -11.5t6 -12.5t7.5 -11t11 -13l11 -11q3 -3 13.5 -12.5t13.5 -12.5l299 -283l51 202q-62 50 -62 116q0 35 22 66h24q-2 -6 -2 -10q0 -19 40 -57 l51 -48q52 -50 52 -107q0 -25 -19 -70h-25q0 21 -8 36q-5 9 -41 45z" />
+<glyph unicode="&#x2136;" horiz-adv-x="639" d="M554 120l18 -12q-2 -50 -33 -79t-80 -29h-286q-70 0 -96 -19l-20 13q50 108 161 108h233q22 70 22 188q0 125 -32 171.5t-94 46.5q-20 0 -65 -6.5t-73 -6.5q-67 0 -100 26.5t-33 64.5q0 61 38 91h24q-3 -11 -3 -20q0 -26 17.5 -43t44.5 -17q28 0 78 10t80 10 q95 0 140.5 -49t45.5 -157q0 -94 -55 -309q50 0 68 18z" />
+<glyph unicode="&#x2137;" horiz-adv-x="505" d="M167 677h24q-2 -12 -2 -18q0 -59 98 -59q92 0 92 -101q0 -32 -12.5 -101t-12.5 -105q0 -40 54.5 -109.5t54.5 -104.5q0 -55 -26 -92h-24q0 23 -12 43t-27.5 35t-32.5 46t-24 72h-2q-31 -107 -80 -156q-27 -27 -80 -27q-69 0 -95 -19l-20 13q48 103 129 106q41 1 77.5 42 t62.5 111q10 73 10 141q0 42 -15.5 71t-41.5 29q-65 0 -98.5 29t-33.5 66q0 34 9 52.5t28 35.5z" />
+<glyph unicode="&#x2138;" horiz-adv-x="599" d="M90 677h24q-3 -11 -3 -20q0 -26 17.5 -43t44.5 -17q28 0 98 10t100 10q64 0 94 -23t30 -58q0 -29 -23 -50q-16 -16 -28 -47.5t-12 -63.5q0 -61 16.5 -136t16.5 -119q0 -43 -28.5 -82t-73.5 -57l-22 11q18 48 18 92q-1 33 -8 106t-7 93q0 24 5 48t11 41t18.5 39.5t19 32.5 t21 30.5t16.5 23.5q-26 10 -72 10q-19 0 -80.5 -6.5t-90.5 -6.5q-65 0 -98 20q-42 25 -42 71q0 61 38 91z" />
+<glyph unicode="&#x213c;" horiz-adv-x="673" d="M645 92l-18 -30q-26 -44 -61 -59t-92 -15q-65 0 -101.5 40.5t-36.5 106.5v271h-70v-406h-148v406h-93v44h586v-44h-127v-292q0 -64 14 -82q22 0 39 7.5t23.5 13t22.5 27.5t20 28zM443 37l1 2q-4 25 -4 76v291h-60v-258q0 -96 63 -111zM222 44v362h-60v-362h60z" />
+<glyph unicode="&#x213d;" horiz-adv-x="540" d="M489 459l37 -25l-18 -25q-94 -128 -156 -240q70 -123 70 -232q0 -62 -32 -108.5t-91 -46.5q-46 0 -76 36.5t-30 83.5q0 76 52 167q-26 59 -66.5 113t-95.5 115t-83 99l136 64q2 -2 7 -8t8 -8q94 -97 174 -228q75 126 154 229q6 8 10 14zM342 -164l2 -1q34 39 34 102 q0 105 -75.5 233t-169.5 226q-8 8 -11 12l-52 -28q12 -16 19 -24l70 -84q25 -30 66 -87t63 -100.5t39.5 -99.5t17.5 -107q0 -21 -3 -42zM272 11h-1q-34 -50 -34 -103q0 -28 15.5 -54.5t41.5 -27.5q7 21 7 56q0 29 -8 69.5t-21 59.5z" />
+<glyph unicode="&#x213e;" horiz-adv-x="469" d="M567 618h-331v-618h-166v662h497v-44zM192 44v574h-78v-574h78z" />
+<glyph unicode="&#x213f;" horiz-adv-x="718" d="M648 0h-166v618h-246v-618h-166v662h578v-662zM604 44v574h-78v-574h78zM192 44v574h-78v-574h78z" />
+<glyph unicode="&#x2140;" horiz-adv-x="923" d="M882 -259h-821v58l284 453l-284 453v58h706v-58h-430l279 -453l-284 -453h550v-58zM550 252l-278 453h-141l278 -453l-280 -453h136z" />
+<glyph unicode="&#x2141;" horiz-adv-x="695" d="M68 305v298q30 20 44.5 28t46 21.5t70.5 18.5t91 5q157 0 252.5 -97t95.5 -250q0 -147 -98.5 -245t-247.5 -98q-165 0 -242 111v103h19q66 -138 223 -138q121 0 189 78t68 186q0 110 -70.5 192t-192.5 82q-83 0 -122 -18t-39 -43v-158h86l22 -76h-195z" />
+<glyph unicode="&#x2142;" horiz-adv-x="559" d="M485 0h-87v588h-385l18 74h454v-662z" />
+<glyph unicode="&#x2143;" horiz-adv-x="559" d="M485 0h-454l-18 74h385v588h87v-662z" />
+<glyph unicode="&#x2144;" horiz-adv-x="630" d="M609 0h-95l-199 300l-199 -300h-95l250 374v288h88v-288z" />
+<glyph unicode="&#x2145;" horiz-adv-x="722" d="M70 662h278q149 0 239 -90t90 -240q0 -147 -91 -239.5t-238 -92.5h-278v662zM553 541v-415q38 28 59 93.5t21 122.5q0 125 -80 199zM509 99v472q-31 20 -79.5 33.5t-86.5 13.5h-107v-574h106q41 0 92 15t75 40zM192 44v574h-78v-574h78z" />
+<glyph unicode="&#x2146;" horiz-adv-x="574" d="M519 0h-148v48h-2q-46 -58 -135 -58q-88 0 -138.5 73t-50.5 165q0 94 50.5 163t140.5 69q91 0 135 -59v282h148v-683zM475 44v595h-60v-595h60zM371 155v144q0 46 -38.5 81.5t-84.5 35.5q-38 0 -55 -17v-350q20 -15 60 -15q47 0 82.5 37t35.5 84zM149 70v313 q-60 -42 -60 -155q0 -110 60 -158z" />
+<glyph unicode="&#x2147;" horiz-adv-x="523" d="M478 199h-285v-148q30 -17 77 -17q57 0 93.5 18.5t67.5 65.5l36 -24q-58 -104 -193 -104q-105 0 -167 65.5t-62 171.5q0 104 62.5 168.5t166.5 64.5q81 0 142.5 -54t61.5 -133v-74zM434 243v33q0 32 -17 63t-43 46v-142h60zM330 243v154q-28 19 -59 19q-36 0 -78 -21 v-152h137zM149 71v309q-60 -52 -60 -153q0 -104 60 -156z" />
+<glyph unicode="&#x2148;" horiz-adv-x="258" d="M203 537h-148v146h148v-146zM159 581v58h-60v-58h60zM203 0h-148v450h148v-450zM159 44v362h-60v-362h60z" />
+<glyph unicode="&#x2149;" horiz-adv-x="305" d="M250 537h-143v146h143v-146zM206 581v58h-55v-58h55zM250 450v-491q0 -80 -50 -128t-131 -48q-45 0 -84 16l14 42q35 -13 59 -13q32 0 49 9v613h143zM206 -58v464h-55v-559q26 13 40.5 39t14.5 56z" />
+<glyph unicode="&#x214a;" horiz-adv-x="664" d="M291 552h101q96 0 153 -46t57 -131q0 -90 -55.5 -133.5t-152.5 -43.5h-103v-132h267v-66h-333v486h-114v-180h-66v246h180v140h66v-140zM291 264h100q145 0 145 111t-144 111h-101v-222z" />
+<glyph unicode="&#x214b;" horiz-adv-x="778" d="M43 552l-15 11q22 54 61 83.5t90 29.5q82 0 170 -91q56 49 105.5 70t110.5 21q82 0 126.5 -38t44.5 -112q0 -61 -40.5 -117.5t-116.5 -100.5l-38 -22q35 -85 35 -149q0 -66 -43.5 -108t-108.5 -42q-61 0 -99 33t-38 91q0 55 34.5 93t120.5 75q-56 121 -132 206 q-50 -67 -71 -106.5t-21 -73.5q0 -23 14 -33t51 -14v-21h-216v21q35 0 54.5 13t39.5 46l39 63l43 70q19 30 44 63q-37 47 -72.5 69.5t-79.5 22.5q-29 0 -48.5 -11.5t-43.5 -41.5zM644 489q0 62 -34.5 98t-89.5 36q-64 0 -146 -64q86 -101 152 -239q65 42 91.5 79.5 t26.5 89.5zM497 102q0 40 -8 70.5t-32 74.5q-63 -29 -90 -62t-27 -78q0 -37 22 -62.5t56 -25.5q35 0 57 23t22 60z" />
+<glyph unicode="&#x2153;" horiz-adv-x="750" d="M638 241v-2q43 -11 65 -41.5t22 -68.5q0 -60 -52 -98.5t-135 -38.5q-40 0 -65.5 16t-25.5 40q0 31 37 31q15 0 41 -19q27 -20 51 -20q30 0 49 20t19 51q0 39 -23.5 60.5t-65.5 21.5q-4 0 -28 -3v29q52 18 73.5 37.5t21.5 46.5q0 47 -56 47q-27 0 -46.5 -13t-39.5 -45 l-25 19q27 51 58.5 73t76.5 22q46 0 77 -24t31 -59q0 -52 -60 -82zM594 676l-450 -690h-49l453 690h46zM216 270h-180v24q32 2 42.5 9t10.5 24v254q0 30 -9 30q-12 0 -42 -14v24l107 55l14 -4v-339q0 -20 13 -29.5t44 -9.5v-24z" />
+<glyph unicode="&#x2154;" horiz-adv-x="750" d="M644 241v-2q43 -11 65 -41.5t22 -68.5q0 -60 -52 -98.5t-135 -38.5q-40 0 -65.5 16t-25.5 40q0 31 37 31q15 0 41 -19q27 -20 51 -20q30 0 49 20t19 51q0 39 -23.5 60.5t-65.5 21.5q-4 0 -28 -3v29q52 18 73.5 37.5t21.5 46.5q0 47 -56 47q-27 0 -46.5 -13t-39.5 -45 l-25 19q27 51 58.5 73t76.5 22q46 0 77 -24t31 -59q0 -52 -60 -82zM637 676l-450 -690h-49l453 690h46zM309 355l-39 -85h-251v24l101 108q44 48 66 80t22 59q0 75 -73 75q-28 0 -54 -19.5t-42 -54.5l-25 15q22 64 55 91.5t95 27.5q58 0 92 -30.5t34 -78.5q0 -37 -19 -70.5 t-67 -80.5l-84 -81h113q40 0 58 27z" />
+<glyph unicode="&#x2155;" horiz-adv-x="750" d="M595 676l-450 -690h-49l453 690h46zM715 404l-33 -64q-5 -12 -19 -12h-131l-15 -25q104 -16 138 -48q27 -24 38 -47t11 -63q0 -70 -48 -111.5t-133 -41.5q-44 0 -65 15.5t-21 37.5q0 32 32 32q22 0 50 -20q24 -17 44 -17q33 0 54.5 22t21.5 60q0 45 -46 76 q-43 28 -132 28q-10 0 -10 12q0 5 1 7l84 155h129q19 0 31 16zM217 270h-180v24q32 2 42.5 9t10.5 24v254q0 30 -9 30q-12 0 -42 -14v24l107 55l14 -4v-339q0 -20 13 -29.5t44 -9.5v-24z" />
+<glyph unicode="&#x2156;" horiz-adv-x="750" d="M309 355l-39 -85h-251v24l101 108q78 84 78 138q0 32 -20.5 54t-50.5 22q-54 0 -88 -74l-25 15q22 64 55 91.5t95 27.5q58 0 92 -30.5t34 -78.5q0 -37 -19 -70.5t-67 -80.5l-84 -81h113q40 0 58 27zM637 676l-450 -690h-49l453 690h46zM720 404l-33 -64q-5 -12 -19 -12 h-131l-15 -25q104 -16 138 -48q27 -24 38 -47t11 -63q0 -70 -48 -111.5t-133 -41.5q-44 0 -65 15.5t-21 37.5q0 32 32 32q22 0 50 -20q24 -17 44 -17q33 0 54.5 22t21.5 60q0 45 -46 76q-41 28 -132 28q-10 0 -10 12q0 5 1 7l84 155h129q19 0 31 16z" />
+<glyph unicode="&#x2157;" horiz-adv-x="750" d="M204 511v-2q43 -11 65 -41.5t22 -68.5q0 -60 -52 -98.5t-135 -38.5q-40 0 -65.5 16t-25.5 40q0 31 37 31q15 0 41 -19q27 -20 51 -20q30 0 49 20t19 51q0 39 -23.5 60.5t-65.5 21.5q-4 0 -28 -3v29q52 18 73.5 37.5t21.5 46.5q0 47 -56 47q-27 0 -46.5 -13t-39.5 -45 l-25 19q27 51 58.5 73t76.5 22q46 0 77 -24t31 -59q0 -52 -60 -82zM637 676l-450 -690h-49l453 690h46zM720 404l-33 -64q-5 -12 -19 -12h-131l-15 -25q104 -16 138 -48q27 -24 38 -47t11 -63q0 -70 -48 -111.5t-133 -41.5q-44 0 -65 15.5t-21 37.5q0 32 32 32q22 0 50 -20 q24 -17 44 -17q33 0 54.5 22t21.5 60q0 45 -46 76q-41 28 -132 28q-10 0 -10 12q0 5 1 7l84 155h129q19 0 31 16z" />
+<glyph unicode="&#x2158;" horiz-adv-x="750" d="M637 676l-450 -690h-49l453 690h46zM720 404l-33 -64q-5 -12 -19 -12h-131l-15 -25q104 -16 138 -48q27 -24 38 -47t11 -63q0 -70 -48 -111.5t-133 -41.5q-44 0 -65 15.5t-21 37.5q0 32 32 32q22 0 50 -20q24 -17 44 -17q33 0 54.5 22t21.5 60q0 45 -46 76 q-41 28 -132 28q-10 0 -10 12q0 5 1 7l84 155h129q19 0 31 16zM319 361h-55v-90h-70v90h-180v49l203 266h47v-258h55v-57zM194 418v179l-135 -179h135z" />
+<glyph unicode="&#x2159;" horiz-adv-x="750" d="M595 676l-450 -690h-49l453 690h46zM702 416l3 -24q-180 -27 -195 -145q44 21 75 21q62 0 97 -38t35 -101q0 -62 -42.5 -102.5t-104.5 -40.5q-71 0 -111 50.5t-40 124.5q0 114 83 184t200 71zM637 109q0 45 -20.5 83t-55.5 38q-24 0 -42 -19.5t-18 -47.5q0 -53 19 -92.5 t55 -39.5q28 0 45 22.5t17 55.5zM217 270h-180v24q32 2 42.5 9t10.5 24v254q0 30 -9 30q-12 0 -42 -14v24l107 55l14 -4v-339q0 -20 13 -29.5t44 -9.5v-24z" />
+<glyph unicode="&#x215a;" horiz-adv-x="750" d="M637 676l-450 -690h-49l453 690h46zM707 415l3 -24q-179 -27 -195 -147q40 23 75 23q62 0 97 -38t35 -101q0 -62 -42.5 -102.5t-104.5 -40.5q-71 0 -111 49.5t-40 123.5q0 114 83 185t200 72zM642 108q0 45 -20.5 83t-55.5 38q-24 0 -42 -22t-18 -50q0 -52 19 -89.5 t55 -37.5q28 0 45 22.5t17 55.5zM307 664l-33 -64q-5 -12 -19 -12h-131l-15 -25q104 -16 138 -48q27 -24 38 -47t11 -63q0 -70 -48 -111.5t-133 -41.5q-44 0 -65 15.5t-21 37.5q0 32 32 32q22 0 50 -20q24 -17 44 -17q33 0 54.5 22t21.5 60q0 45 -46 76q-41 28 -132 28 q-10 0 -10 12q0 5 1 7l84 155h129q19 0 31 16z" />
+<glyph unicode="&#x215b;" horiz-adv-x="750" d="M595 676l-450 -690h-49l453 690h46zM722 98q0 -49 -37.5 -77.5t-100.5 -28.5q-60 0 -96 23.5t-36 68.5q0 34 17 60.5t63 55.5q-46 34 -60.5 55t-14.5 52q0 45 37 72t96 27q51 0 83.5 -24.5t32.5 -60.5q0 -35 -18 -56.5t-63 -42.5q55 -33 76 -60.5t21 -63.5zM644 301 q0 23 -19.5 37.5t-45.5 14.5t-41.5 -11.5t-15.5 -32.5q0 -22 14 -36t53 -34q29 16 42 29t13 33zM598 162l-31 19q-45 -31 -45 -74q0 -30 19 -45.5t52 -15.5q27 0 44 12t17 33q0 37 -56 71zM217 270h-180v24q32 2 42.5 9t10.5 24v254q0 30 -9 30q-12 0 -42 -14v24l107 55 l14 -4v-339q0 -20 13 -29.5t44 -9.5v-24z" />
+<glyph unicode="&#x215c;" horiz-adv-x="750" d="M204 511v-2q43 -11 65 -41.5t22 -68.5q0 -60 -52 -98.5t-135 -38.5q-40 0 -65.5 16t-25.5 40q0 31 37 31q15 0 41 -19q27 -20 51 -20q30 0 49 20t19 51q0 39 -23.5 60.5t-65.5 21.5q-4 0 -28 -3v29q52 18 73.5 37.5t21.5 46.5q0 47 -56 47q-27 0 -46.5 -13t-39.5 -45 l-25 19q27 51 58.5 73t76.5 22q46 0 77 -24t31 -59q0 -52 -60 -82zM637 676l-450 -690h-49l453 690h46zM727 98q0 -49 -37.5 -77.5t-100.5 -28.5q-60 0 -96 23.5t-36 68.5q0 34 17 60.5t63 55.5q-46 34 -60.5 55t-14.5 52q0 45 37 72t96 27q51 0 83.5 -24.5t32.5 -60.5 q0 -35 -18 -56.5t-63 -42.5q55 -33 76 -60.5t21 -63.5zM649 301q0 23 -19.5 37.5t-45.5 14.5t-41.5 -11.5t-15.5 -32.5q0 -22 14 -36t53 -34q29 16 42 29t13 33zM603 162l-31 19q-45 -31 -45 -74q0 -30 19 -45.5t52 -15.5q27 0 44 12t17 33q0 37 -56 71z" />
+<glyph unicode="&#x215d;" horiz-adv-x="750" d="M637 676l-450 -690h-49l453 690h46zM727 98q0 -49 -37.5 -77.5t-100.5 -28.5q-60 0 -96 23.5t-36 68.5q0 34 17 60.5t63 55.5q-46 34 -60.5 55t-14.5 52q0 45 37 72t96 27q51 0 83.5 -24.5t32.5 -60.5q0 -35 -18 -56.5t-63 -42.5q55 -33 76 -60.5t21 -63.5zM649 301 q0 23 -19.5 37.5t-45.5 14.5t-41.5 -11.5t-15.5 -32.5q0 -22 14 -36t53 -34q29 16 42 29t13 33zM603 162l-31 19q-45 -31 -45 -74q0 -30 19 -45.5t52 -15.5q27 0 44 12t17 33q0 37 -56 71zM307 664l-33 -64q-5 -12 -19 -12h-131l-15 -25q104 -16 138 -48q27 -24 38 -47 t11 -63q0 -70 -48 -111.5t-133 -41.5q-44 0 -65 15.5t-21 37.5q0 32 32 32q22 0 50 -20q24 -17 44 -17q33 0 54.5 22t21.5 60q0 45 -46 76q-41 28 -132 28q-10 0 -10 12q0 5 1 7l84 155h129q19 0 31 16z" />
+<glyph unicode="&#x215e;" horiz-adv-x="750" d="M600 676l-450 -690h-49l453 690h46zM727 98q0 -49 -37.5 -77.5t-100.5 -28.5q-60 0 -96 23.5t-36 68.5q0 34 17 60.5t63 55.5q-46 34 -60.5 55t-14.5 52q0 45 37 72t96 27q51 0 83.5 -24.5t32.5 -60.5q0 -35 -18 -56.5t-63 -42.5q55 -33 76 -60.5t21 -63.5zM649 301 q0 23 -19.5 37.5t-45.5 14.5t-41.5 -11.5t-15.5 -32.5q0 -22 14 -36t53 -34q29 16 42 29t13 33zM603 162l-31 19q-45 -31 -45 -74q0 -30 19 -45.5t52 -15.5q27 0 44 12t17 33q0 37 -56 71zM321 642l-144 -387h-56l128 340h-126q-29 0 -40.5 -6t-30.5 -31l-24 10l45 92h248 v-18z" />
+<glyph unicode="&#x2190;" horiz-adv-x="926" d="M857 220h-599q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h598v-66z" />
+<glyph unicode="&#x2191;" horiz-adv-x="511" d="M451 424l-19 -20q-40 28 -96 82q-14 14 -28 14q-20 0 -20 -26v-630h-66v631q0 8 -7.5 17t-14.5 9q-11 0 -25 -14q-49 -51 -96 -82l-19 20q143 124 190 237h10q49 -115 191 -238z" />
+<glyph unicode="&#x2192;" horiz-adv-x="926" d="M856 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-598v66h599q8 0 17 7.5t9 14.5q0 11 -14 25q-51 49 -82 96l20 19q124 -143 237 -190z" />
+<glyph unicode="&#x2193;" horiz-adv-x="511" d="M432 101l19 -20q-143 -124 -190 -237h-10q-49 115 -191 238l19 20q40 -28 96 -82q14 -14 28 -14q20 0 20 26v630h66v-631q0 -8 7.5 -17t14.5 -9q11 0 25 14q49 51 96 82z" />
+<glyph unicode="&#x2194;" horiz-adv-x="926" d="M888 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-475q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h475q8 0 17 7.5t9 14.5 q0 11 -14 25q-51 49 -82 96l20 19q124 -143 237 -190z" />
+<glyph unicode="&#x2195;" horiz-adv-x="511" d="M451 492l-19 -20q-37 26 -95 82q-14 14 -28 14q-20 0 -20 -26v-578q0 -8 7.5 -17t14.5 -9q11 0 25 14q51 52 95 82l19 -20q-141 -122 -189 -238h-10q-50 116 -191 239l19 20q40 -28 96 -82q14 -14 28 -14q20 0 20 26v578q0 8 -7.5 17t-14.5 9q-11 0 -25 -14 q-49 -51 -96 -82l-19 20q143 124 190 237h10q50 -116 190 -238z" />
+<glyph unicode="&#x2196;" horiz-adv-x="926" d="M856 -109l-48 -47l-625 659q-7 7 -22 7q-8 0 -12 -4q-8 -8 -8 -28q0 -77 -10 -126l-28 1q4 54 4 84q0 130 -37 218l7 7q93 -37 218 -37q30 0 86 4v-28q-56 -10 -126 -10q-21 0 -29 -10q-6 -6 -6 -13q0 -10 16 -26z" />
+<glyph unicode="&#x2197;" horiz-adv-x="926" d="M849 662l7 -7q-37 -88 -37 -218q0 -30 4 -84l-28 -1q-10 49 -10 126q0 20 -8 28q-4 4 -12 4q-15 0 -22 -7l-625 -659l-48 47l620 651q16 16 16 26q0 7 -6 13q-8 10 -29 10q-70 0 -126 10v28q56 -4 86 -4q125 0 218 37z" />
+<glyph unicode="&#x2198;" horiz-adv-x="926" d="M856 -149l-7 -7q-93 37 -218 37q-30 0 -86 -4v28q56 10 126 10q21 0 29 10q6 6 6 13q0 10 -16 26l-620 651l48 47l625 -659q7 -7 22 -7q8 0 12 4q8 8 8 28q0 77 10 126l28 -1q-4 -54 -4 -84q0 -130 37 -218z" />
+<glyph unicode="&#x2199;" horiz-adv-x="926" d="M856 615l-620 -651q-16 -16 -16 -26q0 -7 6 -13q8 -10 29 -10q70 0 126 -10v-28q-56 4 -86 4q-125 0 -218 -37l-7 7q37 88 37 218q0 30 -4 84l28 1q10 -49 10 -126q0 -20 8 -28q4 -4 12 -4q15 0 22 7l625 659z" />
+<glyph unicode="&#x219a;" horiz-adv-x="926" d="M866 220h-304l-95 -162h-58l95 162h-257q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q113 48 238 192l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -20 26 -20h295l96 164h58l-96 -164h265v-66z" />
+<glyph unicode="&#x219b;" horiz-adv-x="926" d="M866 258v-10q-113 -47 -237 -190l-20 19q31 47 82 96q14 14 14 25q0 7 -9 14.5t-17 7.5h-304l-95 -162h-58l95 162h-257v66h296l96 164h58l-96 -164h264q26 0 26 20q0 14 -14 28q-51 53 -82 97l20 19q125 -144 238 -192z" />
+<glyph unicode="&#x219c;" horiz-adv-x="926" d="M856 238l-38 -51q-69 68 -160 68q-37 0 -116.5 -34t-147.5 -34q-38 0 -75.5 10t-59.5 22t-42.5 24.5t-23.5 13.5q-6 2 -9 2q-12 0 -12 -23q0 -21 4 -63t4 -67l-27 -4q-10 93 -27.5 162.5t-55.5 128.5l6 9q75 -16 114 -16q87 0 197 25l6 -27q-73 -23 -119 -30 q-47 -6 -47 -20q0 -26 51 -53.5t114 -27.5q53 0 131.5 34t125.5 34q61 0 108 -18.5t99 -64.5z" />
+<glyph unicode="&#x219d;" horiz-adv-x="926" d="M850 402l6 -9q-38 -59 -55.5 -128.5t-27.5 -162.5l-27 4q0 25 4 67t4 63q0 23 -12 23q-3 0 -9 -2q-3 -1 -23.5 -13.5t-42.5 -24.5t-59.5 -22t-75.5 -10q-68 0 -147.5 34t-116.5 34q-91 0 -160 -68l-38 51q52 46 99 64.5t108 18.5q47 0 125.5 -34t131.5 -34q63 0 114 27.5 t51 53.5q0 14 -47 20q-46 7 -119 30l6 27q110 -25 197 -25q39 0 114 16z" />
+<glyph unicode="&#x219e;" horiz-adv-x="926" d="M856 220h-392q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-96 111 -181 162h-76q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h74 q87 53 183 163l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h391v-66z" />
+<glyph unicode="&#x219f;" horiz-adv-x="511" d="M451 217l-19 -20q-40 28 -96 82q-14 14 -28 14q-20 0 -20 -26v-421h-66v422q0 8 -7.5 17t-14.5 9q-11 0 -25 -14q-49 -51 -96 -82l-19 20q111 96 162 181v76q0 8 -7.5 17t-14.5 9q-11 0 -25 -14q-49 -51 -96 -82l-19 20q143 124 190 237h10q49 -115 191 -238l-19 -20 q-40 28 -96 82q-14 14 -28 14q-20 0 -20 -26v-74q53 -87 163 -183z" />
+<glyph unicode="&#x21a0;" horiz-adv-x="926" d="M856 258v-10q-113 -47 -237 -190l-20 19q31 47 82 96q14 14 14 25q0 7 -9 14.5t-17 7.5h-76q-85 -51 -181 -162l-20 19q31 47 82 96q14 14 14 25q0 7 -9 14.5t-17 7.5h-392v66h391q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19q96 -110 183 -163h74q26 0 26 20 q0 14 -14 28q-54 56 -82 96l20 19q123 -142 238 -191z" />
+<glyph unicode="&#x21a1;" horiz-adv-x="511" d="M432 104l19 -20q-142 -123 -191 -238h-10q-47 113 -190 237l19 20q47 -31 96 -82q14 -14 25 -14q22 0 22 26v76q-51 85 -162 181l19 20q47 -31 96 -82q14 -14 25 -14q22 0 22 26v422h66v-421q0 -26 20 -26q14 0 28 14q56 54 96 82l19 -20q-110 -96 -163 -183v-74 q0 -26 20 -26q14 0 28 14q56 54 96 82z" />
+<glyph unicode="&#x21a2;" horiz-adv-x="926" d="M836 449l20 -19q-13 -18 -42 -50t-40 -46q-29 -38 -29 -81q0 -46 28 -80q69 -77 82 -96l-20 -19q-96 111 -181 162h-397q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28 q0 -20 26 -20h395q87 53 183 163z" />
+<glyph unicode="&#x21a3;" horiz-adv-x="926" d="M856 258v-10q-113 -47 -237 -190l-20 19q31 47 82 96q14 14 14 25q0 7 -9 14.5t-17 7.5h-397q-85 -51 -181 -162l-20 19q13 19 82 96q28 34 28 80q0 43 -29 81q-11 14 -40 46t-42 50l20 19q96 -110 183 -163h395q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19 q123 -142 238 -191z" />
+<glyph unicode="&#x21a4;" horiz-adv-x="926" d="M857 57h-50v163h-550q-13 0 -19.5 -7t-6.5 -15q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q113 48 238 192l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -20 26 -20h549v164h50v-393z" />
+<glyph unicode="&#x21a5;" horiz-adv-x="511" d="M451 -154h-391v50h162v579q0 8 -7.5 17t-14.5 9q-11 0 -25 -14q-49 -51 -96 -82l-19 20q143 124 190 237h10q49 -115 191 -238l-19 -20q-40 28 -96 82q-14 14 -28 14q-20 0 -20 -26v-578h163v-50z" />
+<glyph unicode="&#x21a6;" horiz-adv-x="926" d="M857 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-549v-163h-50v393h50v-164h550q12 0 19 7t7 15q0 11 -14 25q-47 45 -82 98l20 19q126 -146 237 -192z" />
+<glyph unicode="&#x21a7;" horiz-adv-x="511" d="M451 612h-163v-579q0 -8 7.5 -17t14.5 -9q11 0 25 14q49 51 96 82l19 -20q-143 -124 -190 -237h-10q-49 115 -191 238l19 20q40 -28 96 -82q14 -14 28 -14q20 0 20 26v578h-162v50h391v-50z" />
+<glyph unicode="&#x21a8;" horiz-adv-x="511" d="M451 -154h-391v50h190q-49 115 -191 238l19 20q40 -28 96 -82q14 -14 28 -14q20 0 20 26v391q0 26 -22 26q-11 0 -25 -14q-49 -51 -96 -82l-19 20q143 124 190 237h10q49 -115 191 -238l-19 -20q-40 28 -96 82q-14 14 -28 14q-20 0 -20 -26v-391q0 -10 7 -18t15 -8 q11 0 25 14q49 51 96 82l19 -20q-143 -124 -190 -237h191v-50z" />
+<glyph unicode="&#x21a9;" horiz-adv-x="926" d="M599 553h98q62 0 110.5 -46t48.5 -121q0 -78 -55 -122t-121 -44h-426q-22 0 -22 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q113 47 237 190l20 -19q-31 -47 -82 -96q-14 -14 -14 -25q0 -7 7 -14.5t17 -7.5h421q48 0 81 26t33 73q0 46 -26 74t-70 28 h-95v66z" />
+<glyph unicode="&#x21aa;" horiz-adv-x="926" d="M856 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 8 -6 14t-16 6h-426q-66 0 -121 44t-55 122q0 75 48.5 121t110.5 46h98v-66h-95q-44 0 -70 -28t-26 -74q0 -47 33 -73t81 -26h421q11 0 17.5 7t6.5 15q0 11 -14 25q-51 49 -82 96l20 19 q124 -143 237 -190z" />
+<glyph unicode="&#x21ab;" horiz-adv-x="926" d="M529 286v86q0 83 50 132t118 49q62 0 110.5 -46t48.5 -121q0 -78 -55 -122t-121 -44h-85v-220h-66v220h-275q-22 -3 -22 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q113 47 237 190l20 -19q-31 -47 -82 -96q-14 -14 -14 -25q0 -7 8 -14t16 -8h274z M595 286h81q48 0 81 26t33 73q0 46 -26 74t-70 28q-42 0 -70.5 -30t-28.5 -83v-88z" />
+<glyph unicode="&#x21ac;" horiz-adv-x="926" d="M856 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 17 -22 20h-275v-220h-66v220h-85q-66 0 -121 44t-55 122q0 75 48.5 121t110.5 46q68 0 118 -49t50 -132v-86h274q8 1 16 8t8 14q0 11 -14 25q-51 49 -82 96l20 19q124 -143 237 -190zM331 286v88 q0 53 -28.5 83t-70.5 30q-44 0 -70 -28t-26 -74q0 -47 33 -73t81 -26h81z" />
+<glyph unicode="&#x21ad;" horiz-adv-x="1200" d="M1151 258v-10q-113 -47 -237 -190l-20 19q31 47 82 96q14 14 14 25q0 6 -9 14t-15 8h-63q-23 0 -45 -26l-46 -54q-24 -26 -50 -26q-29 0 -54 33.5t-39 73.5t-32.5 73.5t-36.5 33.5t-36 -33.5t-32 -73.5t-39 -73.5t-54 -33.5q-20 0 -40 16.5t-33 36.5t-31.5 36.5 t-37.5 16.5h-63q-6 0 -15 -8t-9 -14q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h60q26 0 48.5 -16.5t35 -36.5t28 -36.5t30.5 -16.5q18 0 35 33.5t29.5 73.5t38 73.5t58.5 33.5 t58.5 -33.5t38.5 -73.5t30 -73.5t35 -33.5q15 0 30.5 16.5t28 36.5t34.5 36.5t48 16.5h60q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19q123 -142 238 -191z" />
+<glyph unicode="&#x21ae;" horiz-adv-x="926" d="M888 258v-10q-116 -50 -238 -190l-20 19q26 37 82 95q14 14 14 28q0 20 -26 20h-223l-69 -162h-54l69 162h-198q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q113 48 238 192l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -20 26 -20 h225l69 164h54l-69 -164h196q8 0 17 7.5t9 14.5q0 11 -14 25q-47 45 -82 98l20 19q126 -146 237 -192z" />
+<glyph unicode="&#x21af;" horiz-adv-x="511" d="M451 320l-234 -337q-4 -4 -4 -15q0 -23 25 -23q6 0 10 1q72 12 113 12h14l3 -26q-195 -22 -291 -86l-8 7q10 47 10 100q0 85 -29 203l28 6q15 -40 31 -123q6 -30 24 -30q11 0 21 14l157 231h-261l330 408l60 -39l-242 -303h243z" />
+<glyph unicode="&#x21b0;" horiz-adv-x="463" d="M424 -156h-66v598h-131q-13 0 -19.5 -7t-6.5 -15q0 -11 14 -25q39 -38 72 -87l-20 -19q-112 129 -237 181v10q127 54 238 182l20 -19q-19 -27 -72 -82q-14 -14 -14 -33q0 -20 26 -20h196v-664z" />
+<glyph unicode="&#x21b1;" horiz-adv-x="463" d="M433 480v-10q-125 -52 -237 -181l-20 19q33 49 72 87q14 14 14 25q0 8 -7 15t-19 7h-131v-598h-66v664h196q26 0 26 20q0 19 -14 33q-53 55 -72 82l20 19q111 -128 238 -182z" />
+<glyph unicode="&#x21b2;" horiz-adv-x="463" d="M419 0h-196q-26 0 -26 -20q0 -19 14 -33q53 -55 72 -82l-20 -19q-111 128 -238 182v10q125 52 237 181l20 -19q-33 -49 -72 -87q-14 -14 -14 -25q0 -8 7 -15t19 -7h131v596h66v-662z" />
+<glyph unicode="&#x21b3;" horiz-adv-x="463" d="M433 38v-10q-127 -54 -238 -182l-20 19q19 27 72 82q14 14 14 33q0 20 -26 20h-196v662h66v-596h131q12 0 19 7t7 15q0 11 -14 25q-39 38 -72 87l20 19q112 -129 237 -181z" />
+<glyph unicode="&#x21b4;" horiz-adv-x="926" d="M837 104l19 -20q-142 -123 -191 -238h-10q-47 113 -190 237l19 20q47 -31 96 -82q14 -14 25 -14q22 0 22 27v562h-557v66h623v-628q0 -26 20 -26q14 0 28 14q56 54 96 82z" />
+<glyph unicode="&#x21b5;" horiz-adv-x="926" d="M856 0h-598q-26 0 -26 -20q0 -14 14 -28q6 -7 27 -27t33 -33.5t22 -28.5l-20 -19q-114 131 -238 184v10q123 51 237 183l20 -19q-18 -28 -82 -89q-14 -14 -14 -25q0 -22 27 -22h532v596h66v-662z" />
+<glyph unicode="&#x21b6;" horiz-adv-x="926" d="M882 192h-66q0 115 -81 195.5t-196 80.5t-196 -80.5t-81 -194.5q0 -31 18 -31q6 0 20 14q50 50 96 82l19 -20q-126 -110 -181 -238h-10q-53 127 -180 237l19 20q47 -31 96 -82q14 -14 22 -14q15 0 15 31q0 141 101.5 241.5t244.5 100.5q140 0 240 -100.5t100 -241.5z" />
+<glyph unicode="&#x21b7;" horiz-adv-x="926" d="M863 257l19 -20q-127 -110 -180 -237h-10q-55 128 -181 238l19 20q46 -32 96 -82q14 -14 20 -14q18 0 18 31q0 114 -81 194.5t-196 80.5t-196 -80.5t-81 -195.5h-66q0 141 100 241.5t240 100.5q143 0 244.5 -100.5t101.5 -241.5q0 -31 15 -31q8 0 22 14q49 51 96 82z" />
+<glyph unicode="&#x21b8;" horiz-adv-x="926" d="M856 666h-794v66h794v-66zM872 -110l-47 -46l-658 658q-9 9 -18 9q-5 0 -15 -5q-7 -7 -7 -29q0 -67 -10 -126l-29 2q4 58 4 88q0 121 -37 214l7 7q91 -37 217 -37q48 0 87 4v-29q-34 -6 -126 -10q-22 0 -29 -10q-6 -4 -6 -13q0 -10 10 -20z" />
+<glyph unicode="&#x21b9;" horiz-adv-x="926" d="M866 380h-567q-26 0 -26 -20q0 -14 14 -28q34 -35 69 -85l-20 -19q-61 67 -111 109.5t-115 70.5v-180h-50v370h50v-180q66 27 117.5 70.5t108.5 109.5l20 -19q-32 -50 -69 -86q-14 -14 -14 -25t9 -16.5t18 -5.5h566v-66zM866 -92h-50v180q-66 -27 -117.5 -70.5 t-108.5 -109.5l-20 19q32 50 69 86q14 14 14 25t-9 16.5t-18 5.5h-566v66h567q26 0 26 20q0 14 -14 28q-34 35 -69 85l20 19q61 -67 111 -109.5t115 -70.5v180h50v-370z" />
+<glyph unicode="&#x21ba;" horiz-adv-x="974" d="M817 686l11 -25q-21 -12 -114 -56q-12 -5 -19 -11q-8 -8 -8 -16t8 -14q46 -34 74 -67q89 -106 89 -243q0 -154 -108.5 -262t-262.5 -108t-262.5 108t-108.5 262q0 120 71.5 218.5t185.5 135.5l22 -61q-93 -31 -153.5 -114t-60.5 -181q0 -125 90 -213t215 -88 q126 0 216 89t90 215q0 68 -32.5 136t-86.5 106q-5 3 -11 3q-9 0 -14.5 -6.5t-5.5 -15.5q0 -4 5 -19q26 -75 35 -121l-26 -9q-55 180 -139 271l4 9h12q117 0 284 77z" />
+<glyph unicode="&#x21bb;" horiz-adv-x="974" d="M579 547l22 61q114 -37 185.5 -135.5t71.5 -218.5q0 -154 -108.5 -262t-262.5 -108t-262.5 108t-108.5 262q0 137 89 243q28 33 74 67q8 6 8 14t-8 16q-7 6 -19 11q-93 44 -114 56l11 25q167 -77 284 -77h12l4 -9q-84 -91 -139 -271l-26 9q9 46 35 121q5 15 5 19 q0 9 -5.5 15.5t-14.5 6.5q-6 0 -11 -3q-54 -38 -86.5 -106t-32.5 -136q0 -126 90 -215t216 -89q125 0 215 88t90 213q0 98 -60.5 181t-153.5 114z" />
+<glyph unicode="&#x21bc;" horiz-adv-x="955" d="M901 220h-847v4l68 54q33 26 65 56l52 48l57 58l56 54l23 -22l-34 -38l-35 -38q-13 -14 -26.5 -30.5t-20 -28t-6.5 -19.5q0 -10 2.5 -16t12.5 -11t28 -5h605v-66z" />
+<glyph unicode="&#x21bd;" horiz-adv-x="955" d="M901 220h-605q-18 0 -28 -5t-12.5 -11t-2.5 -16q0 -8 6.5 -19.5t20 -28t26.5 -30.5l35 -38l34 -38l-23 -22l-56 54l-57 58l-52 48q-32 30 -65 56l-68 54v4h847v-66z" />
+<glyph unicode="&#x21be;" horiz-adv-x="511" d="M441 424l-19 -20l-24 16l-26 18l-21.5 16.5t-24.5 21.5q-14 14 -24 14q-14 0 -14 -26v-620h-66v818h5q52 -108 214 -238z" />
+<glyph unicode="&#x21bf;" horiz-adv-x="511" d="M288 -156h-66v620q0 26 -14 26q-10 0 -24 -14q-11 -11 -24.5 -21.5l-21.5 -16.5l-26 -18l-24 -16l-19 20q162 130 214 238h5v-818z" />
+<glyph unicode="&#x21c0;" horiz-adv-x="955" d="M901 220h-847v66h605q18 0 28 5t12.5 11t2.5 16q0 8 -6.5 19.5t-20 28t-27.5 30.5l-34 38l-34 38l23 22l55 -54l58 -58l52 -48q32 -30 64 -56l69 -54v-4z" />
+<glyph unicode="&#x21c1;" horiz-adv-x="955" d="M901 286v-4l-69 -54q-32 -26 -64 -56l-52 -48l-58 -58l-55 -54l-23 22l34 38l34 38q14 14 27.5 30.5t20 28t6.5 19.5q0 10 -2.5 16t-12.5 11t-28 5h-605v66h847z" />
+<glyph unicode="&#x21c2;" horiz-adv-x="511" d="M422 102l19 -20q-162 -130 -214 -238h-5v818h66v-620q0 -26 14 -26q10 0 24 14q11 11 24.5 21.5l21.5 16.5l26 18z" />
+<glyph unicode="&#x21c3;" horiz-adv-x="511" d="M288 -156h-5q-50 105 -214 236l19 20l24 -16l26 -18l21.5 -16.5t24.5 -21.5q14 -14 24 -14q14 0 14 26v622h66v-818z" />
+<glyph unicode="&#x21c4;" horiz-adv-x="926" d="M856 418v-10q-119 -51 -236 -180l-20 19q24 31 76 85q14 14 14 28q0 20 -26 20h-584v66h583q9 0 18 5.5t9 16.5t-14 25q-52 51 -76 86l20 19q111 -128 236 -180zM847 60h-583q-9 0 -18 -5.5t-9 -16.5t14 -25q52 -51 76 -86l-20 -19q-111 128 -236 180v10q119 51 236 180 l20 -19q-24 -31 -76 -85q-14 -14 -14 -28q0 -20 26 -20h584v-66z" />
+<glyph unicode="&#x21c5;" horiz-adv-x="773" d="M723 102l19 -20q-142 -123 -191 -238h-10q-47 113 -190 237l19 20q42 -28 96 -82q14 -14 25 -14q8 0 15 7t7 19v621h66v-620q0 -26 20 -26q14 0 28 14q56 54 96 82zM422 424l-19 -20q-40 28 -96 82q-14 14 -28 14q-20 0 -20 -26v-620h-66v621q0 26 -22 26q-11 0 -25 -14 q-49 -51 -96 -82l-19 20q143 124 190 237h10q49 -115 191 -238z" />
+<glyph unicode="&#x21c6;" horiz-adv-x="926" d="M847 380h-584q-26 0 -26 -20q0 -14 14 -28q52 -54 76 -85l-20 -19q-117 129 -236 180v10q125 52 236 180l20 -19q-24 -35 -76 -86q-14 -14 -14 -25t9 -16.5t18 -5.5h583v-66zM856 98v-10q-125 -52 -236 -180l-20 19q24 35 76 86q14 14 14 25t-9 16.5t-18 5.5h-583v66h584 q26 0 26 20q0 14 -14 28q-52 54 -76 85l20 19q117 -129 236 -180z" />
+<glyph unicode="&#x21c7;" horiz-adv-x="926" d="M856 60h-594q-12 0 -18.5 -6.5t-6.5 -15.5q0 -11 14 -25q52 -51 76 -86l-20 -19q-110 127 -237 180v10q115 49 214 155q-98 106 -214 155v10q128 55 238 181l20 -19q-16 -23 -77 -86q-14 -14 -14 -28q0 -20 26 -20h593v-66h-594q-8 0 -16.5 -7.5t-8.5 -14.5q0 -12 13 -25 q46 -44 75 -80q-13 -15 -74 -79q-14 -14 -14 -28q0 -20 26 -20h593v-66z" />
+<glyph unicode="&#x21c8;" horiz-adv-x="773" d="M732 424l-19 -20q-23 16 -86 77q-14 14 -28 14q-20 0 -20 -26v-625h-66v626q0 8 -7.5 16.5t-14.5 8.5q-12 0 -25 -13q-44 -46 -80 -75q-15 13 -79 74q-14 14 -28 14q-20 0 -20 -26v-625h-66v626q0 12 -6.5 18.5t-15.5 6.5q-11 0 -25 -14q-51 -52 -86 -76l-19 20 q127 110 180 237h10q49 -115 155 -214q106 98 155 214h10q55 -128 181 -238z" />
+<glyph unicode="&#x21c9;" horiz-adv-x="926" d="M856 98v-10q-127 -53 -237 -180l-20 19q24 35 76 86q14 14 14 25q0 9 -6.5 15.5t-18.5 6.5h-594v66h593q26 0 26 20q0 14 -14 28q-61 64 -74 79q29 36 75 80q13 13 13 25q0 7 -8.5 14.5t-16.5 7.5h-594v66h593q26 0 26 20q0 14 -14 28q-61 63 -77 86l20 19 q110 -126 238 -181v-10q-116 -49 -214 -155q99 -106 214 -155z" />
+<glyph unicode="&#x21ca;" horiz-adv-x="773" d="M713 102l19 -20q-126 -110 -181 -238h-10q-49 116 -155 214q-106 -99 -155 -214h-10q-53 127 -180 237l19 20q35 -24 86 -76q14 -14 25 -14q9 0 15.5 6.5t6.5 18.5v626h66v-625q0 -26 20 -26q14 0 28 14q64 61 79 74q36 -29 80 -75q13 -13 25 -13q7 0 14.5 8.5t7.5 16.5 v626h66v-625q0 -26 20 -26q14 0 28 14q63 61 86 77z" />
+<glyph unicode="&#x21cb;" horiz-adv-x="926" d="M856 320h-786v5q108 52 238 214l20 -19l-16 -24l-18 -26l-16.5 -21.5t-21.5 -24.5q-14 -14 -14 -24q0 -14 26 -14h588v-66zM856 186v-5q-108 -52 -238 -214l-20 19l16 24l18 26l16.5 21.5t21.5 24.5q14 14 14 24q0 14 -26 14h-588v66h786z" />
+<glyph unicode="&#x21cc;" horiz-adv-x="926" d="M856 320h-786v66h588q26 0 26 14q0 10 -14 24q-11 11 -21.5 24.5l-16.5 21.5l-18 26l-16 24l20 19q130 -162 238 -214v-5zM856 120h-588q-26 0 -26 -14q0 -10 14 -24q11 -11 21.5 -24.5l16.5 -21.5l18 -26l16 -24l-20 -19q-130 162 -238 214v5h786v-66z" />
+<glyph unicode="&#x21cd;" horiz-adv-x="926" d="M866 120h-241l-74 -164h-55l74 164h-194q-12 0 -19 -7.5t-7 -14.5q0 -19 23 -42q32 -32 74 -81l-21 -20q-41 41 -93 85t-83 68l-102 75l-88 65v10l90 67l96 73q37 27 88 69.5t92 83.5l21 -20q-32 -37 -75 -82q-1 -2 -4.5 -5.5t-5 -4.5t-4 -4t-3 -4.5t-2 -4.5t-2 -5.5 t-1 -5.5t-0.5 -7q0 -7 7 -14.5t19 -7.5h315l76 165h55l-76 -165h120v-66h-150l-61 -134h211v-66zM661 320h-429q-59 -34 -59 -67q0 -27 58 -67h369z" />
+<glyph unicode="&#x21ce;" horiz-adv-x="926" d="M906 258v-10q-51 -34 -144 -108t-170 -150l-28 21l19 19l24 26q9 10 17.5 24t8.5 24q0 6 -1.5 9t-8 5t-20.5 2h-136l-23 -130h-51l23 130h-90q-21 0 -28 -3.5t-7 -14.5t7.5 -21.5t29.5 -32.5t33 -35l-23 -23q-83 78 -180.5 155.5t-137.5 102.5v10q165 118 318 259l23 -23 q-7 -8 -28 -29t-32.5 -36t-11.5 -24q0 -19 34 -19h139l24 131h51l-24 -131h90q14 0 21 6.5t7 14.5q0 15 -10.5 29.5t-30.5 32t-26 24.5l28 24q84 -77 179 -154.5t135 -104.5zM478 186h256q59 34 59 67q0 27 -58 67h-233zM451 320h-260q-58 -33 -59 -67q0 -27 58 -67h237z " />
+<glyph unicode="&#x21cf;" horiz-adv-x="926" d="M866 258v-10l-88 -65l-102 -75q-31 -24 -83 -68t-93 -85l-21 20q42 49 74 81q23 23 23 42q0 7 -7 14.5t-19 7.5h-317l-74 -165h-55l74 165h-118v66h148l61 134h-209v66h239l76 165h55l-76 -165h196q12 0 19 7.5t7 14.5q0 9 -3.5 17t-5.5 10t-13 14q-43 45 -75 82l21 20 q41 -41 92 -83.5t88 -69.5l96 -73zM263 186h432q58 40 58 67q0 33 -59 67h-370z" />
+<glyph unicode="&#x21d0;" horiz-adv-x="926" d="M866 120h-490q-12 0 -19 -7.5t-7 -14.5q0 -19 23 -42q32 -32 74 -81l-21 -20q-41 41 -93 85t-83 68l-102 75l-88 65v10l90 67l96 73q37 27 88 69.5t92 83.5l21 -20q-32 -37 -75 -82q-1 -2 -4.5 -5.5t-5 -4.5t-4 -4t-3 -4.5t-2 -4.5t-2 -5.5t-1 -5.5t-0.5 -7q0 -7 7 -14.5 t19 -7.5h490v-66h-634q-59 -34 -59 -67q0 -27 58 -67h635v-66z" />
+<glyph unicode="&#x21d1;" d="M641 296l-20 -21q-49 42 -82 75q-14 14 -21 18t-20 4q-7 0 -14.5 -7t-7.5 -19v-502h-66v646q-34 59 -67 59q-27 0 -67 -58v-647h-66v502q0 12 -7.5 19t-14.5 7q-19 0 -42 -23q-32 -32 -81 -74l-20 21q41 41 85 93t68 83l75 102l65 88h10l67 -90l73 -96q27 -37 69.5 -88 t83.5 -92z" />
+<glyph unicode="&#x21d2;" horiz-adv-x="926" d="M866 258v-10l-88 -65l-102 -75q-31 -24 -83 -68t-93 -85l-21 20q42 49 74 81q23 23 23 42q0 7 -7 14.5t-19 7.5h-490v66h635q58 40 58 67q0 33 -59 67h-634v66h490q12 0 19 7.5t7 14.5q0 9 -3.5 17t-5.5 10t-13 14q-43 45 -75 82l21 20q41 -41 92 -83.5t88 -69.5l96 -73z " />
+<glyph unicode="&#x21d3;" d="M621 231l20 -21q-41 -41 -83.5 -92t-69.5 -88l-73 -96l-67 -90h-10l-65 88l-75 102q-24 31 -68 83t-85 93l20 21q49 -42 81 -74q23 -23 42 -23q7 0 14.5 7t7.5 19v502h66v-647q40 -58 67 -58q33 0 67 59v646h66v-502q0 -12 7.5 -19t14.5 -7q13 0 20 4t21 18q33 33 82 75z " />
+<glyph unicode="&#x21d4;" horiz-adv-x="926" d="M906 258v-10q-51 -34 -144 -108t-170 -150l-28 21l19 19l24 26q9 10 17.5 24t8.5 24q0 6 -1.5 9t-8 5t-20.5 2h-277q-21 0 -28 -3.5t-7 -14.5t7.5 -21.5t29.5 -32.5t33 -35l-23 -23q-83 78 -180.5 155.5t-137.5 102.5v10q165 118 318 259l23 -23q-7 -8 -28 -29t-32.5 -36 t-11.5 -24q0 -19 34 -19h280q14 0 21 6.5t7 14.5q0 15 -10.5 29.5t-30.5 32t-26 24.5l28 24q84 -77 179 -154.5t135 -104.5zM190 186h544q59 34 59 67q0 27 -58 67h-544q-58 -33 -59 -67q0 -27 58 -67z" />
+<glyph unicode="&#x21d5;" d="M621 163l20 -21q-41 -41 -83.5 -92t-69.5 -88l-73 -96l-67 -90h-10l-65 88l-75 102q-24 31 -68 83t-85 93l20 21q49 -42 81 -74q23 -23 42 -23q7 0 14.5 7t7.5 19v322q0 12 -7.5 19t-14.5 7q-19 0 -42 -23q-32 -32 -81 -74l-20 21q41 41 85 93t68 83l75 102l65 88h10 l67 -90l73 -96q27 -37 69.5 -88t83.5 -92l-20 -21q-49 42 -82 75q-14 14 -21 18t-20 4q-7 0 -14.5 -7t-7.5 -19v-322q0 -12 7.5 -19t14.5 -7q13 0 20 4t21 18q33 33 82 75zM410 -52v610q-34 59 -67 59q-27 0 -67 -58v-612q40 -58 67 -58q33 0 67 59z" />
+<glyph unicode="&#x21d6;" horiz-adv-x="926" d="M874 32l-46 -47l-600 599q-24 7 -48 7q-28 0 -41 -13q-13 -12 -13 -39q0 -17 6 -49l601 -600l-47 -46l-498 497q-8 8 -19 8q-28 0 -28 -51q0 -47 -5 -109h-29q0 58 -6 126t-11 106.5t-18.5 124.5t-16.5 109l7 7l110 -16q77 -12 121 -18t110.5 -12t124.5 -6v-29 q-62 -5 -110 -5q-21 0 -29 -2t-16 -11q-5 -5 -5 -15q0 -11 8 -19z" />
+<glyph unicode="&#x21d7;" horiz-adv-x="926" d="M867 662l7 -7q-3 -23 -16.5 -109t-18.5 -124.5t-11 -106.5t-6 -126h-29q-5 62 -5 109q0 51 -28 51q-11 0 -19 -8l-498 -497l-47 46l601 600q6 32 6 49q0 27 -13 39q-13 13 -41 13q-24 0 -48 -7l-600 -599l-46 47l498 497q8 8 8 19q0 10 -5 15q-8 9 -16 11t-29 2 q-48 0 -110 5v29q58 0 124.5 6t110.5 12t121 18z" />
+<glyph unicode="&#x21d8;" horiz-adv-x="926" d="M874 -149l-7 -7l-110 16q-77 12 -121 18t-110.5 12t-124.5 6v29q62 5 110 5q21 0 29 2t16 11q5 5 5 15q0 11 -8 19l-498 497l46 47l600 -599q24 -7 48 -7q28 0 41 13q13 12 13 39q0 17 -6 49l-601 600l47 46l498 -497q8 -8 19 -8q28 0 28 51q0 47 5 109h29q0 -58 6 -126 t11 -106.5t18.5 -124.5t16.5 -109z" />
+<glyph unicode="&#x21d9;" horiz-adv-x="926" d="M874 474l-498 -497q-8 -8 -8 -19q0 -10 5 -15q8 -9 16 -11t29 -2q48 0 110 -5v-29q-58 0 -124.5 -6t-110.5 -12t-121 -18l-110 -16l-7 7q3 23 16.5 109t18.5 124.5t11 106.5t6 126h29q5 -62 5 -109q0 -51 28 -51q11 0 19 8l498 497l47 -46l-601 -600q-6 -32 -6 -49 q0 -27 13 -39q13 -13 41 -13q24 0 48 7l600 599z" />
+<glyph unicode="&#x21da;" horiz-adv-x="926" d="M852 20h-519v-1q52 -64 99 -142l-23 -16q-159 240 -363 387v10q199 137 364 386l23 -15q-41 -67 -99 -140v-3h518v-66h-565q-30 -35 -81 -86q-14 -14 -14 -28q0 -20 26 -20h634v-66h-636q-25 -7 -25 -22q0 -12 14 -25q43 -37 81 -87h566v-66z" />
+<glyph unicode="&#x21db;" horiz-adv-x="926" d="M880 258v-10q-199 -137 -364 -386l-23 15q41 67 99 140v3h-518v66h565q30 35 81 86q14 14 14 28q0 20 -26 20h-634v66h636q25 7 25 22q0 12 -14 25q-43 37 -81 87h-566v66h519v1q-52 64 -99 142l23 16q159 -240 363 -387z" />
+<glyph unicode="&#x21dc;" horiz-adv-x="926" d="M866 220h-114l-89 -106l-119 172l-124 -172l-92 106h-83q-6 0 -15 -8t-9 -14q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h112l60 -66l124 174l119 -174l60 66h143v-66z" />
+<glyph unicode="&#x21dd;" horiz-adv-x="926" d="M866 258v-10q-113 -47 -237 -190l-20 19q31 47 82 96q14 14 14 25q0 6 -9 14t-15 8h-83l-92 -106l-124 172l-119 -172l-89 106h-114v66h143l60 -66l119 174l124 -174l60 66h112q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19q123 -142 238 -191z" />
+<glyph unicode="&#x21de;" horiz-adv-x="511" d="M451 76h-163v-232h-66v232h-162v50h162v79h-162v50h162v220q0 8 -7.5 17t-14.5 9q-11 0 -25 -14q-49 -51 -96 -82l-19 20q143 124 190 237h10q49 -115 191 -238l-19 -20q-40 28 -96 82q-14 14 -28 14q-20 0 -20 -26v-219h163v-50h-163v-79h163v-50z" />
+<glyph unicode="&#x21df;" horiz-adv-x="511" d="M432 102l19 -20q-142 -123 -191 -238h-10q-47 113 -190 237l19 20q47 -31 96 -82q14 -14 25 -14q7 0 14.5 9t7.5 17v220h-162v50h162v79h-162v50h162v232h66v-232h163v-50h-163v-79h163v-50h-163v-219q0 -26 20 -26q14 0 28 14q56 54 96 82z" />
+<glyph unicode="&#x21e0;" horiz-adv-x="926" d="M866 220h-107v66h107v-66zM698 220h-107v66h107v-66zM530 220h-107v66h107v-66zM362 220h-115q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h114v-66z" />
+<glyph unicode="&#x21e1;" horiz-adv-x="511" d="M451 424l-19 -20q-40 28 -96 82q-14 14 -28 14q-20 0 -20 -26v-111h-66v112q0 8 -7.5 17t-14.5 9q-11 0 -25 -14q-49 -51 -96 -82l-19 20q143 124 190 237h10q49 -115 191 -238zM288 190h-66v107h66v-107zM288 17h-66v107h66v-107zM288 -156h-66v107h66v-107z" />
+<glyph unicode="&#x21e2;" horiz-adv-x="926" d="M866 258v-10q-113 -47 -237 -190l-20 19q31 47 82 96q14 14 14 25q0 8 -6.5 15t-19.5 7h-115v66h114q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19q123 -142 238 -191zM503 220h-107v66h107v-66zM335 220h-107v66h107v-66zM167 220h-107v66h107v-66z" />
+<glyph unicode="&#x21e3;" horiz-adv-x="511" d="M288 555h-66v107h66v-107zM288 382h-66v107h66v-107zM288 209h-66v107h66v-107zM432 102l19 -20q-142 -123 -191 -238h-10q-47 113 -190 237l19 20q47 -31 96 -82q14 -14 25 -14q8 0 15 7t7 19v112h66v-111q0 -26 20 -26q14 0 28 14q56 54 96 82z" />
+<glyph unicode="&#x21e4;" horiz-adv-x="926" d="M866 220h-569q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v-190h-50v392h50v-192q113 48 238 192l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -20 26 -20h568v-66z" />
+<glyph unicode="&#x21e5;" horiz-adv-x="926" d="M866 58h-50v190q-113 -47 -237 -190l-20 19q31 47 82 96q14 14 14 25q0 7 -9 14.5t-17 7.5h-569v66h568q26 0 26 20q0 14 -14 28q-51 53 -82 97l20 19q125 -144 238 -192v192h50v-392z" />
+<glyph unicode="&#x21e6;" horiz-adv-x="926" d="M866 120h-420v-155l-20 -10q-41 41 -93 85t-83 68l-102 75l-88 65v10l90 67l96 73q37 27 88 69.5t92 83.5l20 -10v-155h420v-266zM816 170v166h-420v116l-165 -126q-58 -44 -58 -73q0 -18 14.5 -33.5t43.5 -38.5l165 -128v117h420z" />
+<glyph unicode="&#x21e7;" d="M641 296l-10 -20h-155v-432h-266v432h-155l-10 20q41 41 85 93t68 83l75 102l65 88h10l67 -90l73 -96q27 -37 69.5 -88t83.5 -92zM542 326l-126 165q-44 58 -73 58q-18 0 -33.5 -14.5t-38.5 -43.5l-128 -165h117v-432h166v432h116z" />
+<glyph unicode="&#x21e8;" horiz-adv-x="926" d="M866 258v-10l-88 -65l-102 -75q-31 -24 -83 -68t-93 -85l-20 10v155h-420v266h420v155l20 10q41 -41 92 -83.5t88 -69.5l96 -73zM530 53l165 128q19 15 29.5 24t19.5 22.5t9 25.5q0 29 -58 73l-165 126v-116h-420v-166h420v-117z" />
+<glyph unicode="&#x21e9;" d="M631 230l10 -20q-41 -41 -83.5 -92t-69.5 -88l-73 -96l-67 -90h-10l-65 88l-75 102q-24 31 -68 83t-85 93l10 20h155v432h266v-432h155zM542 180h-116v432h-166v-432h-117l128 -165q15 -19 24 -29.5t22.5 -19.5t25.5 -9q29 0 73 58z" />
+<glyph unicode="&#x21ea;" d="M641 324l-10 -20h-155v-262h-266v262h-155l-10 20q41 41 85 93t68 83l75 102l65 88h10l67 -90l73 -96q27 -37 69.5 -88t83.5 -92zM542 354l-126 165q-44 58 -73 58q-18 0 -33.5 -14.5t-38.5 -43.5l-128 -165h117v-262h166v262h116zM476 -184h-266v161h266v-161zM426 -134 v61h-166v-61h166z" />
+<glyph unicode="&#x21f4;" horiz-adv-x="926" d="M856 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-127q-11 -52 -53 -86t-97 -34t-97 34t-54 86h-170v66h170q11 53 53.5 87.5t97.5 34.5q56 0 98 -34.5t53 -87.5h127q8 0 17 7.5t9 14.5q0 11 -14 25q-51 49 -82 96l20 19q124 -143 237 -190z M292 286h198q-11 31 -38 51.5t-61 20.5t-61.5 -20.5t-37.5 -51.5zM489 220h-197q11 -31 38 -50.5t61 -19.5q33 0 60 19.5t38 50.5z" />
+<glyph unicode="&#x21f5;" horiz-adv-x="773" d="M742 424l-19 -20q-40 28 -96 82q-14 14 -28 14q-20 0 -20 -26v-620h-66v621q0 12 -7 19t-15 7q-11 0 -25 -14q-49 -51 -96 -82l-19 20q143 124 190 237h10q49 -115 191 -238zM403 102l19 -20q-142 -123 -191 -238h-10q-47 113 -190 237l19 20q42 -28 96 -82 q14 -14 25 -14q22 0 22 26v621h66v-620q0 -26 20 -26q14 0 28 14q56 54 96 82z" />
+<glyph unicode="&#x21f6;" horiz-adv-x="926" d="M866 -42v-10q-127 -53 -237 -180l-20 19q24 35 76 86q14 14 14 25q0 9 -6.5 15.5t-18.5 6.5h-614v66h613q26 0 26 20q0 10 -14 24q-1 1 -77 73l78 72q13 13 13 23q0 8 -8 15t-17 7h-614v66h613q11 0 18.5 6t7.5 14q0 10 -14 24q-1 1 -77 73l78 72q13 13 13 23 q0 7 -8.5 14.5t-16.5 7.5h-614v66h613q26 0 26 20q0 14 -14 28q-61 63 -77 86l20 19q110 -126 238 -181v-10q-109 -46 -213 -145q106 -99 213 -145v-10q-109 -46 -213 -145q106 -99 213 -145z" />
+<glyph unicode="&#x21f7;" horiz-adv-x="926" d="M866 220h-307v-162h-50v162h-262q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q113 48 238 192l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -20 26 -20h261v164h50v-164h307v-66z" />
+<glyph unicode="&#x21f8;" horiz-adv-x="926" d="M861 258v-10q-113 -47 -237 -190l-20 19q31 47 82 96q14 14 14 25q0 7 -9 14.5t-17 7.5h-257v-162h-50v162h-312v66h312v164h50v-164h256q26 0 26 20q0 14 -14 28q-51 53 -82 97l20 19q125 -144 238 -192z" />
+<glyph unicode="&#x21f9;" horiz-adv-x="926" d="M878 258v-10q-116 -50 -238 -190l-20 19q26 37 82 95q14 14 14 28q0 20 -26 20h-203v-162h-50v162h-202q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q113 48 238 192l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -20 26 -20h201v164 h50v-164h204q8 0 17 7.5t9 14.5q0 11 -14 25q-47 45 -82 98l20 19q126 -146 237 -192z" />
+<glyph unicode="&#x21fa;" horiz-adv-x="926" d="M866 220h-225v-162h-50v162h-79v-162h-50v162h-215q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q113 48 238 192l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -20 26 -20h214v164h50v-164h79v164h50v-164h225v-66z" />
+<glyph unicode="&#x21fb;" horiz-adv-x="926" d="M866 258v-10q-113 -47 -237 -190l-20 19q31 47 82 96q14 14 14 25q0 7 -9 14.5t-17 7.5h-215v-162h-50v162h-79v-162h-50v162h-225v66h225v164h50v-164h79v164h50v-164h214q26 0 26 20q0 14 -14 28q-51 53 -82 97l20 19q125 -144 238 -192z" />
+<glyph unicode="&#x21fc;" horiz-adv-x="926" d="M888 258v-10q-116 -50 -238 -190l-20 19q26 37 82 95q14 14 14 28q0 20 -26 20h-147v-162h-50v162h-79v-162h-50v162h-149q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q113 48 238 192l20 -19q-31 -44 -82 -97q-14 -14 -14 -28 q0 -20 26 -20h148v164h50v-164h79v164h50v-164h148q8 0 17 7.5t9 14.5q0 11 -14 25q-47 45 -82 98l20 19q126 -146 237 -192z" />
+<glyph unicode="&#x21fd;" horiz-adv-x="926" d="M866 220h-538v-158l-10 -5q-51 58 -119.5 110t-138.5 81v10q146 63 258 191l10 -5v-158h538v-66zM278 166v173q-30 -39 -121 -85q28 -14 67 -41t54 -47z" />
+<glyph unicode="&#x21fe;" horiz-adv-x="926" d="M866 258v-10q-146 -63 -258 -191l-10 5v158h-538v66h538v158l10 5q51 -58 119.5 -110t138.5 -81zM648 340v-173q30 39 121 85q-28 14 -67 41t-54 47z" />
+<glyph unicode="&#x21ff;" horiz-adv-x="926" d="M906 258v-10q-146 -63 -258 -191l-10 5v158h-350v-158l-10 -5q-51 58 -119.5 110t-138.5 81v10q146 63 258 191l10 -5v-158h350v158l10 5q51 -58 119.5 -110t138.5 -81zM688 340v-173q30 39 121 85q-28 14 -67 41t-54 47zM238 166v173q-30 -39 -121 -85q28 -14 67 -41 t54 -47z" />
+<glyph unicode="&#x2200;" horiz-adv-x="560" d="M558 662l-245 -662h-66l-245 662h71l74 -199h266l74 199h71zM391 403h-222l111 -300z" />
+<glyph unicode="&#x2201;" horiz-adv-x="463" d="M404 220v-98q0 -44 -18.5 -73.5t-49 -42t-55.5 -17t-52 -4.5t-52 5t-54 18.5t-46.5 44.5t-17.5 77v483q0 46 18.5 77.5t49 45.5t55.5 19t51 5q20 0 39 -2.5t44 -12t43.5 -24.5t31.5 -43.5t13 -66.5v-87h-66v91q0 26 -12.5 43.5t-32.5 24.5t-33.5 9t-28.5 2 q-13 0 -27.5 -2.5t-34 -9.5t-32 -24t-12.5 -42v-487q0 -24 13 -41t33 -24t35 -10t28 -3t28 3t33.5 10.5t30.5 24.5t12 41v90h66z" />
+<glyph unicode="&#x2202;" horiz-adv-x="471" d="M195 625l-10 20q38 23 98 23q188 0 188 -260q0 -49 -8 -101t-29 -110t-53 -103.5t-85 -75t-120 -29.5q-69 0 -102.5 46t-33.5 116q0 109 75.5 196.5t181.5 87.5q69 0 96 -48q7 39 7 70q0 77 -30.5 129t-100.5 52q-33 0 -74 -13zM367 319q0 44 -18.5 65t-42.5 21 q-73 0 -129 -90.5t-56 -197.5q0 -98 67 -98q54 0 97.5 59t66.5 143q15 55 15 98z" />
+<glyph unicode="&#x2203;" horiz-adv-x="560" d="M487 0h-414v66h348v232h-336v66h336v232h-348v66h414v-662z" />
+<glyph unicode="&#x2204;" horiz-adv-x="560" d="M487 0h-316l-42 -122h-58l42 122h-40v66h63l79 232h-130v66h153l80 232h-245v66h267l39 113h58l-39 -113h89v-662zM421 364v232h-45l-80 -232h125zM421 66v232h-148l-79 -232h227z" />
+<glyph unicode="&#x2205;" horiz-adv-x="762" d="M705 583l-88 -101q95 -98 95 -230q0 -136 -97.5 -233.5t-233.5 -97.5q-107 0 -197 66l-58 -66h-69l87 100q-94 96 -94 231q0 136 97.5 233.5t233.5 97.5q103 0 197 -66l58 66h69zM575 434l-348 -398q69 -49 154 -49q110 0 187.5 78t77.5 188q0 102 -71 181zM188 71 l346 395q-23 22 -67.5 36.5t-85.5 14.5q-110 0 -187.5 -77t-77.5 -187q0 -108 72 -182z" />
+<glyph unicode="&#x2206;" horiz-adv-x="731" d="M665 0h-602l287 674h20zM543 41l-208 494l-209 -494h417z" />
+<glyph unicode="&#x2207;" horiz-adv-x="731" d="M667 662l-288 -674h-20l-296 674h604zM604 621h-418l208 -494z" />
+<glyph unicode="&#x2208;" d="M625 -27h-291q-118 0 -196 82.5t-78 196.5t77 196.5t194 82.5h294v-66h-290q-75 0 -134 -53.5t-72 -126.5h496v-66h-497q13 -73 72 -126.5t134 -53.5h291v-66z" />
+<glyph unicode="&#x2209;" d="M625 -27h-291q-47 0 -92 16l-73 -146h-62l85 170q-61 37 -96.5 101t-35.5 138q0 114 77 196.5t194 82.5h119l65 131h62l-65 -131h113v-66h-146l-90 -180h236v-66h-268l-85 -170q33 -10 62 -10h291v-66zM417 465h-82q-75 0 -134 -53.5t-72 -126.5h198zM295 219h-167 q16 -91 95 -144z" />
+<glyph unicode="&#x220a;" horiz-adv-x="486" d="M422 45h-149q-92 0 -150.5 59.5t-58.5 147.5t59 147.5t152 59.5h147v-66h-147q-125 0 -144 -108h291v-66h-291q21 -108 145 -108h146v-66z" />
+<glyph unicode="&#x220b;" d="M60 531h294q117 0 194 -82.5t77 -196.5t-78 -196.5t-196 -82.5h-291v66h291q75 0 134 53.5t72 126.5h-497v66h496q-13 73 -72 126.5t-134 53.5h-290v66z" />
+<glyph unicode="&#x220c;" d="M577 662l-84 -169q61 -38 96.5 -102.5t35.5 -138.5q0 -114 -78 -196.5t-196 -82.5h-117l-65 -130h-62l65 130h-112v66h145l90 180h-235v66h267l85 170q-33 10 -62 10h-290v66h294q47 0 89 -15l72 146h62zM389 285h167q-16 91 -95 144zM557 219h-200l-90 -180h84 q75 0 134 53.5t72 126.5z" />
+<glyph unicode="&#x220d;" horiz-adv-x="486" d="M64 459h147q93 0 152 -59.5t59 -147.5t-58.5 -147.5t-150.5 -59.5h-149v66h146q124 0 145 108h-291v66h291q-19 108 -144 108h-147v66z" />
+<glyph unicode="&#x220e;" horiz-adv-x="545" d="M485 0h-425v640h425v-640z" />
+<glyph unicode="&#x220f;" horiz-adv-x="1000" d="M948 -259h-368v28h32q49 0 68.5 35t19.5 99v794h-399v-794q0 -71 19.5 -102.5t68.5 -31.5h31v-28h-368v28h19q99 0 99 109v733q0 70 -25.5 97t-75.5 27h-17v28h896v-28q-66 0 -91.5 -27.5t-25.5 -92.5v-719q0 -127 99 -127h18v-28z" />
+<glyph unicode="&#x2210;" horiz-adv-x="1000" d="M948 -259h-896v28h17q50 0 75.5 27t25.5 97v733q0 109 -99 109h-19v28h368v-28h-31q-49 0 -68.5 -31.5t-19.5 -102.5v-794h399v794q0 64 -19.5 99t-68.5 35h-32v28h368v-28h-18q-99 0 -99 -127v-719q0 -65 25.5 -92.5t91.5 -27.5v-28z" />
+<glyph unicode="&#x2211;" horiz-adv-x="914" d="M856 40l-53 -299h-745l392 510l-367 512h747v-251h-30q-16 105 -55.5 145t-136.5 40h-320l290 -391l-336 -434h414q78 0 115 42t55 126h30z" />
+<glyph unicode="&#x2212;" d="M621 220h-557v66h557v-66z" />
+<glyph unicode="&#x2213;" d="M637 436h-589v66h589v-66zM637 107h-262v-194h-66v194h-261v66h261v209h66v-209h262v-66z" />
+<glyph unicode="&#x2214;" d="M636 220h-261v-261h-66v261h-261v66h261v261h66v-261h261v-66zM405 678q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2215;" horiz-adv-x="523" d="M478 710l-360 -932h-72l360 932h72z" />
+<glyph unicode="&#x2216;" horiz-adv-x="428" d="M403 93h-62l-316 318h62z" />
+<glyph unicode="&#x2217;" horiz-adv-x="523" d="M457 337q0 -18 -22 -31q-7 -4 -60 -18t-95 -38q36 -21 90.5 -36t63.5 -20q21 -12 21 -32q0 -16 -10.5 -27.5t-28.5 -11.5q-17 0 -36 19l-47 48q-28 29 -60 47q0 -39 14.5 -95t14.5 -67q0 -16 -12 -29t-26 -13t-26 13t-12 29q0 11 14.5 67t14.5 95q-30 -17 -71.5 -59 t-49.5 -46q-14 -8 -27 -8q-17 0 -27 9.5t-10 22.5q0 26 21 39q10 5 67 21.5t86 33.5q-29 17 -87 33.5t-70 23.5q-20 12 -20 30q0 16 10.5 29t25.5 13q10 0 22 -6q10 -6 54 -48.5t76 -59.5q0 39 -14.5 97t-14.5 69q0 16 12 28t26 12t26 -12.5t12 -27.5q0 -11 -14.5 -68.5 t-14.5 -96.5q42 22 80.5 62.5t45.5 44.5q12 6 22 6q15 0 25.5 -13t10.5 -29z" />
+<glyph unicode="&#x2218;" horiz-adv-x="350" d="M310 252q0 -56 -39.5 -95.5t-95.5 -39.5q-57 0 -96 39.5t-39 97.5q0 56 39.5 94.5t97.5 38.5q55 0 94 -39.5t39 -95.5zM244 252q0 29 -20 49t-47 20q-31 0 -51 -19.5t-20 -47.5q0 -31 19.5 -51t49.5 -20q29 0 49 20t20 49z" />
+<glyph unicode="&#x2219;" horiz-adv-x="350" d="M310 252q0 -56 -39.5 -95.5t-95.5 -39.5q-57 0 -96 39.5t-39 97.5q0 56 39.5 94.5t97.5 38.5q55 0 94 -39.5t39 -95.5z" />
+<glyph unicode="&#x221a;" horiz-adv-x="928" d="M963 973l-478 -1232h-32l-202 530q-22 59 -62 59q-31 0 -65 -31l-12 20l156 124h19l204 -536h4l414 1066h54z" />
+<glyph unicode="&#x221b;" horiz-adv-x="928" d="M963 973l-478 -1232h-32l-202 530q-22 59 -62 59q-31 0 -65 -31l-12 20l156 124h19l204 -536h4l414 1066h54zM298 762l-12 2q25 82 100 82q36 0 58 -19t22 -50q0 -19 -12.5 -39.5t-32.5 -33.5q37 -14 54.5 -34t17.5 -56q0 -56 -45 -87.5t-107 -31.5q-26 0 -41.5 10.5 t-15.5 24.5q0 8 6 13.5t15 5.5q11 0 31 -14q22 -16 44 -16q29 0 47.5 20t18.5 52q0 57 -53 74q-14 5 -52 5v11q40 14 62.5 32t22.5 51q0 52 -55 52q-23 0 -39.5 -12.5t-33.5 -41.5z" />
+<glyph unicode="&#x221c;" horiz-adv-x="928" d="M963 973l-478 -1232h-32l-202 530q-22 59 -62 59q-31 0 -65 -31l-12 20l156 124h19l204 -536h4l414 1066h54zM503 583h-52v-84h-48v84h-142v41l160 219h30v-219h52v-41zM403 624v165l-120 -165h120z" />
+<glyph unicode="&#x221d;" d="M643 84v-84q-69 0 -118 35t-99 110q-72 -145 -209 -145q-71 0 -123.5 51.5t-52.5 148.5q0 52 14.5 94t36 66.5t48.5 41t49.5 22.5t42.5 6q60 0 105.5 -28.5t112.5 -118.5q41 74 82.5 110.5t110.5 36.5v-84q-61 0 -105 -29.5t-68 -71.5v-3q50 -83 89.5 -120.5t83.5 -37.5z M404 181v3q-57 94 -105.5 140.5t-97.5 46.5q-42 0 -71 -35.5t-29 -83.5q0 -68 38 -118t101 -50q31 0 58 9t48 26.5t32.5 30t25.5 31.5z" />
+<glyph unicode="&#x221e;" horiz-adv-x="926" d="M854 222q0 -81 -55 -151.5t-143 -70.5q-58 0 -104.5 35.5t-96.5 109.5q-72 -145 -209 -145q-71 0 -123.5 51.5t-52.5 148.5q0 52 14.5 94t36 66.5t48.5 41t49.5 22.5t42.5 6q60 0 105.5 -28.5t112.5 -118.5q41 74 82.5 110.5t110.5 36.5q73 0 127.5 -56.5t54.5 -151.5z M499 245v-3q58 -95 102 -139t93 -44q42 0 71 35.5t29 83.5q0 71 -37.5 119.5t-101.5 48.5q-31 0 -56.5 -8.5t-45.5 -27.5t-29 -30t-25 -35zM433 181v3q-57 94 -105.5 140.5t-97.5 46.5q-42 0 -71 -35.5t-29 -83.5q0 -68 38 -118t101 -50q31 0 58 9t48 26.5t32.5 30 t25.5 31.5z" />
+<glyph unicode="&#x221f;" d="M634 0h-584v584h66v-518h518v-66z" />
+<glyph unicode="&#x2220;" d="M643 0h-620l546 547l50 -42l-437 -439h461v-66z" />
+<glyph unicode="&#x2221;" d="M642 0h-97q0 -43 -5 -72l-65 10q4 27 4 62h-457l323 323q-23 23 -48 42l40 53q28 -21 55 -48l176 177l51 -42l-184 -185q88 -113 106 -254h101v-66zM181 66h293q-16 114 -86 207z" />
+<glyph unicode="&#x2222;" d="M653 80l-25 -62l-88 37q-11 -31 -32 -66l-57 34q13 21 28 57l-423 173l421 177q-11 26 -27 55l57 34q19 -34 31 -64l90 37l25 -60l-93 -40q19 -67 19 -139q0 -69 -18 -135zM228 253l270 -110q15 54 15 110q0 57 -15 114z" />
+<glyph unicode="&#x2223;" horiz-adv-x="266" d="M166 -189h-66v879h66v-879z" />
+<glyph unicode="&#x2224;" horiz-adv-x="404" d="M381 304l-146 -75v-418h-66v384l-122 -62l-24 53l146 74v430h66v-396l122 62z" />
+<glyph unicode="&#x2225;" horiz-adv-x="523" d="M195 -189h-66v879h66v-879zM394 -189h-66v879h66v-879z" />
+<glyph unicode="&#x2226;" horiz-adv-x="609" d="M586 362l-149 -76v-475h-66v441l-133 -67v-374h-66v340l-125 -64l-24 53l149 76v474h66v-440l133 67v373h66v-339l125 63z" />
+<glyph unicode="&#x2227;" horiz-adv-x="620" d="M589 -29h-65l-215 432l-215 -432h-63l273 565h10z" />
+<glyph unicode="&#x2228;" horiz-adv-x="620" d="M589 536l-273 -565h-10l-275 565h65l215 -432l215 432h63z" />
+<glyph unicode="&#x2229;" horiz-adv-x="620" d="M572 -31h-66v296q0 85 -58 145t-138 60q-82 0 -139 -60t-57 -146v-295h-66v299q0 118 74.5 193t187.5 75q112 0 187 -76t75 -195v-296z" />
+<glyph unicode="&#x222a;" horiz-adv-x="620" d="M572 536v-296q0 -119 -75 -195t-187 -76q-113 0 -187.5 75t-74.5 193v299h66v-295q0 -86 57 -146t139 -60q80 0 138 60t58 145v296h66z" />
+<glyph unicode="&#x222b;" horiz-adv-x="459" d="M204 -124l182 730q54 218 188 218q29 0 47 -13t18 -32q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-183 -734q-9 -35 -22 -66.5t-34 -64t-53.5 -52t-72.5 -19.5q-29 0 -47 13t-18 32q0 25 15.5 42t36.5 17 q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5z" />
+<glyph unicode="&#x222c;" horiz-adv-x="701" d="M446 -124l182 730q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-183 -734q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17 q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5zM204 -124l182 730q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-183 -734 q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5z" />
+<glyph unicode="&#x222d;" horiz-adv-x="943" d="M688 -124l182 730q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-183 -734q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17 q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5zM445 -124l182 730q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-183 -734 q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5zM204 -124l182 730q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17 q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-183 -734q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5z" />
+<glyph unicode="&#x222e;" horiz-adv-x="499" d="M353 476l33 130q54 218 188 218q29 0 47 -13t18 -32q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-39 -158q61 -26 98.5 -82t37.5 -125q0 -93 -66 -159t-159 -66q-13 0 -19 1l-36 -145q-9 -35 -22 -66.5t-34 -64 t-53.5 -52t-72.5 -19.5q-29 0 -47 13t-18 32q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l42 168q-62 27 -99.5 82.5t-37.5 124.5q0 93 66 159t159 66h19zM324 64h10q77 0 132 55t55 132q0 55 -29.5 101t-78.5 69 zM344 438h-10q-77 0 -132 -55t-55 -132q0 -55 29.5 -101t78.5 -69z" />
+<glyph unicode="&#x222f;" horiz-adv-x="741" d="M592 462l36 144q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-44 -177q70 -31 109 -80t39 -107q0 -78 -68 -137.5t-181 -78.5l-38 -154q-12 -47 -33.5 -89.5 t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l37 152q-7 -1 -23 -1q-76 0 -141 17l-40 -162q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17 q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l48 193q-67 31 -104.5 79t-37.5 104q0 76 65.5 135t175.5 80l35 139q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14 q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-35 -139h33q72 0 132 -15zM650 399l-80 -321q89 21 144.5 68.5t55.5 105.5q0 43 -32.5 81.5t-87.5 65.5zM493 67l89 356q-57 16 -126 16q-26 0 -39 -1l-88 -357q61 -16 127 -16q13 0 37 2zM261 107l80 319q-87 -20 -140 -67.5 t-53 -106.5q0 -43 30 -81t83 -64z" />
+<glyph unicode="&#x2230;" horiz-adv-x="982" d="M830 450l39 156q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-47 -188q150 -59 150 -176q0 -75 -63.5 -127t-181.5 -77l-41 -166q-12 -47 -33.5 -89.5t-64 -77.5 t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l39 160q-68 -9 -148 -9h-22l-36 -145q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19 q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l38 154q-95 6 -162 23l-42 -171q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l49 198 q-146 56 -146 178q0 70 63 122.5t178 79.5l38 152q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-37 -148q69 9 153 9h17l32 129q9 35 23.5 68.5t37.5 69.5t59 58t78 22 q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-34 0 -56 -43t-45 -134l-36 -142q91 -6 163 -24zM888 389l-75 -301q197 46 197 164q0 87 -122 137zM736 75l84 337q-71 18 -162 24l-93 -371h7q93 0 164 10zM585 439h-13q-82 0 -157 -11 l-84 -337q73 -19 162 -23zM263 114l74 298q-90 -25 -141 -66.5t-51 -93.5q0 -87 118 -138z" />
+<glyph unicode="&#x2231;" horiz-adv-x="499" d="M326 366l60 240q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-66 -267q76 -32 113 -107q4 -8 11 -8t14 13q14 37 30 61l12 -6q-42 -92 -42 -157l-5 -3 q-45 43 -145 76l3 12q27 -5 65 -19q6 -2 9 -2q14 0 14 12q0 3 -1 5l-5 10q-25 49 -83 76l-107 -430q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l113 453 h-9q-77 0 -132 -55t-55 -132h-38q0 93 66 159t159 66q12 0 18 -1z" />
+<glyph unicode="&#x2232;" horiz-adv-x="499" d="M353 476l33 130q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-39 -157q76 -33 113 -106q4 -9 12 -9q7 0 14 13q13 34 31 61l11 -6q-44 -84 -44 -160q0 -93 -66 -159 t-159 -66q-13 0 -20 1l-36 -146q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l42 169q-61 27 -98.5 83t-37.5 124q0 93 66 159t159 66q12 0 18 -1zM325 65 h10q77 0 132 55t55 132q0 10 -2 26q-40 28 -110 50l4 12q33 -6 65 -18q6 -2 9 -2q15 0 15 11q-1 1 -1 3.5t-1 3.5q-29 56 -88 84zM344 439h-9q-77 0 -132 -55t-55 -132q0 -55 29.5 -100.5t77.5 -68.5z" />
+<glyph unicode="&#x2233;" horiz-adv-x="499" d="M354 477l32 129q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-39 -157q41 -18 69 -46q45 -37 140 -63l-3 -13q-14 1 -42 8.5t-35 7.5q-11 0 -11 -8l1 -5 q18 -44 18 -88q0 -93 -66 -159t-159 -66q-13 0 -20 1l-36 -146q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l42 169q-61 27 -98.5 83t-37.5 124 q0 93 66 159t159 66h19zM325 65h10q77 0 132 55t55 132q0 37 -14 71q-2 5 -10 5q-10 0 -16 -14q-22 -46 -31 -62l-12 6q31 76 36 118q-27 30 -62 46zM344 439h-9q-77 0 -132 -55t-55 -132q0 -55 29.5 -100.5t77.5 -68.5z" />
+<glyph unicode="&#x2234;" horiz-adv-x="620" d="M374 458q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM582 48q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM165 48q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5 t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2235;" horiz-adv-x="620" d="M582 457q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5zM165 457q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5zM373 47q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45 q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5z" />
+<glyph unicode="&#x2236;" horiz-adv-x="511" d="M319 458q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM319 51q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5z" />
+<glyph unicode="&#x2237;" d="M209 458q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM209 51q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5zM602 458q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5 t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM602 51q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5z" />
+<glyph unicode="&#x2238;" d="M405 448q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM637 220h-589v66h589v-66z" />
+<glyph unicode="&#x2239;" d="M637 448q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM637 59q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5zM448 220h-400v66h400v-66z" />
+<glyph unicode="&#x223a;" d="M637 448q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM637 59q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM637 220h-589v66h589v-66zM175 448q0 -26 -17.5 -45 t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM175 59q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x223b;" d="M415 458q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM415 51q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5zM617 362h20q-5 -75 -48 -144.5t-110 -69.5 q-32 0 -74.5 23t-77 51t-72 51t-61.5 23q-48 0 -80 -43.5t-46 -104.5h-20q4 82 49 148t114 66q41 0 97 -37l108 -74q51 -37 81 -37q85 0 120 148z" />
+<glyph unicode="&#x223c;" d="M604 362h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138z" />
+<glyph unicode="&#x223d;" d="M637 148h-33q-29 138 -117 138q-30 0 -79 -32l-102 -64q-54 -32 -95 -32q-70 0 -114.5 61.5t-48.5 142.5h33q14 -60 44 -99t79 -39q29 0 78 32l102 64q54 32 95 32q67 0 110 -65t48 -139z" />
+<glyph unicode="&#x223e;" d="M502 347v66q20 0 40.5 -7t43 -23.5t37 -51t14.5 -83.5q0 -73 -40 -115.5t-92 -42.5q-43 0 -81 31q-29 24 -82 100t-73 94q-34 32 -81 32q-50 0 -80 -26.5t-30 -76.5q0 -44 31 -66t80 -22v-66q-66 0 -103.5 49.5t-37.5 110.5q0 72 42 117.5t95 45.5q56 0 98 -48 q15 -17 58.5 -80.5t69.5 -90.5q36 -38 86 -38t80 26.5t30 76.5q0 43 -28.5 65.5t-76.5 22.5z" />
+<glyph unicode="&#x223f;" d="M576 252h61q0 -85 -45.5 -149t-117.5 -64t-111 54.5t-55 159.5q-10 70 -31.5 109t-64.5 39q-48 0 -75 -42.5t-27 -106.5h-61q0 86 45.5 150.5t117.5 64.5q138 0 167 -214q20 -148 95 -148q47 0 74 42.5t28 104.5z" />
+<glyph unicode="&#x2240;" horiz-adv-x="286" d="M249 -9v-33q-74 5 -139 48t-65 110q0 41 32 94l64 103q32 49 32 78q0 49 -39 79t-99 44v33q81 -4 142.5 -48.5t61.5 -114.5q0 -41 -32 -94l-64 -103q-32 -49 -32 -79q0 -88 138 -117z" />
+<glyph unicode="&#x2241;" d="M604 362h33q-3 -45 -21 -90t-54.5 -79.5t-82.5 -34.5q-52 0 -132 54l-72 -124h-60l89 153q-69 45 -100 45q-50 0 -80 -40.5t-43 -97.5h-33q4 77 47.5 140.5t115.5 63.5q51 0 127 -52l72 124h60l-88 -152q71 -48 105 -48q88 0 117 138z" />
+<glyph unicode="&#x2242;" d="M604 269h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM637 379h-589v66h589v-66z" />
+<glyph unicode="&#x2243;" d="M604 445h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM637 55h-589v66h589v-66z" />
+<glyph unicode="&#x2244;" d="M637 55h-356l-39 -90h-54l39 90h-179v66h208l78 179l-26 18l-26 20l-24 15q-15 10 -24 14.5t-20 8t-20 3.5q-48 0 -80 -43.5t-46 -104.5h-20q4 82 49 148t114 66q51 0 153 -76l65 150h54l-78 -180q59 -42 92 -42q85 0 120 148h20q-5 -75 -48 -144.5t-110 -69.5 q-43 0 -104 40l-65 -150h327v-66z" />
+<glyph unicode="&#x2245;" d="M637 173h-589v66h589v-66zM637 -27h-589v66h589v-66zM617 532h20q-5 -75 -48 -144.5t-110 -69.5q-32 0 -74.5 23t-77 51t-72 51t-61.5 23q-48 0 -80 -43.5t-46 -104.5h-20q4 82 49 148t114 66q41 0 97 -37l108 -74q51 -37 81 -37q85 0 120 148z" />
+<glyph unicode="&#x2246;" d="M616 604h20q-5 -75 -48 -144.5t-110 -69.5q-32 0 -74.5 23t-77 51t-72 51t-61.5 23q-48 0 -80 -43.5t-46 -104.5h-20q4 82 49 148t114 66q41 0 97 -37l107 -74q52 -37 82 -37q85 0 120 148zM637 -21h-352l-53 -86h-60l53 86h-177v66h218l84 134h-302v66h343l54 86h60 l-54 -86h186v-66h-227l-84 -134h311v-66z" />
+<glyph unicode="&#x2247;" d="M637 -27h-362l-72 -175h-53l72 175h-174v66h201l55 134h-256v66h283l50 122q-20 12 -60.5 39.5t-67.5 41.5t-49 14q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q23 0 51 -11t47 -22t52.5 -34t45.5 -30l92 222h53l-101 -245q21 -8 36 -8q88 0 117 138h33 q-5 -74 -48 -139t-110 -65q-26 0 -54 11l-41 -100h253v-66h-280l-55 -134h335v-66z" />
+<glyph unicode="&#x2248;" d="M604 239h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM604 475h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32 q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138z" />
+<glyph unicode="&#x2249;" d="M617 239h20q-5 -75 -48 -144.5t-110 -69.5q-25 0 -58.5 15.5t-53.5 29.5l-59 43l-70 -162h-54l83 191q-47 31 -73 31q-48 0 -80 -43.5t-46 -104.5h-20q4 82 49 148t114 66q36 0 85 -29l49 112q-9 6 -33 24t-34.5 25t-28.5 18t-31 15.5t-24 4.5q-48 0 -80 -43.5 t-46 -104.5h-20q4 82 49 148t114 66q24 0 56 -14.5t51 -28.5l57 -41l70 158h54l-82 -188q49 -34 80 -34q85 0 120 148h20q-5 -75 -48 -144.5t-110 -69.5q-40 0 -92 32l-48 -111l35 -25l35 -25q12 -9 30 -20t32 -16t26 -5q85 0 120 148z" />
+<glyph unicode="&#x224a;" d="M604 316h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM604 552h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32 q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM637 -45h-589v66h589v-66z" />
+<glyph unicode="&#x224b;" d="M617 532h20q-5 -70 -47 -122t-111 -52q-41 0 -97 27l-108 54q-51 27 -80 27q-102 0 -126 -108h-20q4 77 47.5 125.5t115.5 48.5q51 0 151.5 -54t134.5 -54q50 0 78.5 26.5t41.5 81.5zM618 340h20q-5 -70 -47 -122t-111 -52q-41 0 -97 27l-107 54q-52 27 -81 27 q-102 0 -126 -108h-20q4 77 47.5 125.5t115.5 48.5q51 0 151.5 -54t134.5 -54q50 0 78.5 26.5t41.5 81.5zM617 148h20q-5 -70 -47 -122t-111 -52q-41 0 -97 27l-108 54q-51 27 -80 27q-102 0 -126 -108h-20q4 77 47.5 125.5t115.5 48.5q51 0 151.5 -54t134.5 -54 q50 0 78.5 26.5t41.5 81.5z" />
+<glyph unicode="&#x224c;" d="M637 173h-589v66h589v-66zM637 -27h-589v66h589v-66zM637 318h-20q-35 148 -120 148q-30 0 -81 -37l-108 -74q-56 -37 -97 -37q-69 0 -114 66t-49 148h20q14 -61 46 -104.5t80 -43.5q24 0 61.5 23t72 51t77 51t74.5 23q67 0 110 -69.5t48 -144.5z" />
+<glyph unicode="&#x224d;" d="M637 498v-35q-32 -72 -120 -114.5t-175 -42.5q-90 0 -175.5 42t-118.5 115v35q92 -126 294 -126q90 0 170 31t125 95zM637 43v-35q-92 126 -295 126q-90 0 -169.5 -31t-124.5 -95v35q32 72 119.5 114.5t174.5 42.5q90 0 176 -42t119 -115z" />
+<glyph unicode="&#x224e;" d="M637 320h-210q-1 33 -24.5 59t-58.5 26q-38 0 -62 -26t-24 -59h-210v66h156q17 35 53.5 60t84.5 25q49 0 87.5 -26t51.5 -59h156v-66zM637 120h-156q-17 -35 -53.5 -60t-84.5 -25q-49 0 -87.5 26t-51.5 59h-156v66h210q1 -32 26 -58.5t60 -26.5q37 0 60 26t23 59h210v-66 z" />
+<glyph unicode="&#x224f;" d="M637 320h-209q-1 33 -24.5 59t-58.5 26q-39 0 -63 -26t-24 -59h-210v66h156q17 34 54 59.5t85 25.5q49 0 87.5 -26t51.5 -59h155v-66zM637 120h-589v66h589v-66z" />
+<glyph unicode="&#x2250;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM405 548q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2251;" d="M405 548q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM405 -42q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5z " />
+<glyph unicode="&#x2252;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM175 548q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM637 -41q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2253;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM637 548q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM175 -42q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2254;" horiz-adv-x="824" d="M776 320h-509v66h509v-66zM776 120h-509v66h509v-66zM175 354q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM175 153q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5z " />
+<glyph unicode="&#x2255;" horiz-adv-x="824" d="M776 354q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM776 153q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5zM557 320h-509v66h509v-66zM557 120h-509v66h509v-66z " />
+<glyph unicode="&#x2256;" d="M637 90h-589v66h223q-48 35 -48 96q0 62 51 98h-226v66h589v-66h-227q51 -36 51 -98t-49 -96h225v-66zM411 251q0 29 -20 49.5t-48 20.5q-29 0 -49.5 -20t-20.5 -49q0 -28 20.5 -48.5t48.5 -20.5t48.5 20t20.5 48z" />
+<glyph unicode="&#x2257;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM461 633q0 -49 -34.5 -84t-84.5 -35t-84.5 35t-34.5 84t34.5 84t84.5 35t84.5 -35t34.5 -84zM411 632q0 29 -20 49.5t-48 20.5q-29 0 -49.5 -20t-20.5 -49t20.5 -49t48.5 -20t48.5 20t20.5 48z" />
+<glyph unicode="&#x2258;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM597 553l-17 -11q-48 60 -104.5 90.5t-133.5 30.5q-58 0 -103 -17t-70.5 -39.5t-63.5 -64.5l-17 11q95 176 255 176q87 0 147 -46.5t107 -129.5z" />
+<glyph unicode="&#x2259;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM562 484h-72l-150 249l-143 -249h-72l218 369z" />
+<glyph unicode="&#x225a;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM555 853l-218 -369l-219 369h72l150 -249l143 249h72z" />
+<glyph unicode="&#x225b;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM500 634l-69 -59q-13 -10 -13 -26q0 -4 2 -12q2 -4 2 -6l14 -75l-71 44q-14 7 -22 7q-13 0 -25 -7l-71 -42l21 68q0 2 1 5.5t1.5 6.5t0.5 6q0 16 -14 28l-73 62l82 6q31 3 42 31l33 85l35 -86q10 -27 39 -29z" />
+<glyph unicode="&#x225c;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM564 484h-438l219 369zM452 545l-110 188l-110 -188h220z" />
+<glyph unicode="&#x225d;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM485 697h45q0 45 18 78q27 48 75 48q23 0 39 -13t16 -28q0 -9 -6.5 -16t-15.5 -7q-12 0 -25 19q-13 21 -26 21q-30 0 -30 -48v-54h66v-23h-66v-156q0 -32 8 -40.5t42 -9.5v-13h-141v13q30 1 38 10t8 40v156h-45v23z M474 541l13 -2q-31 -90 -113 -90q-47 0 -74.5 33t-27.5 89q0 58 30.5 95t80.5 37q49 0 75 -38q15 -23 20 -68h-167q2 -50 25 -81q21 -30 59 -30q27 0 42.5 11.5t36.5 43.5zM312 620h110q-5 35 -16 48t-36 13q-51 0 -58 -61zM258 478l-78 -29l-3 1v34q-25 -35 -69 -35 q-46 0 -73.5 32t-27.5 84q0 57 33 97.5t79 40.5q37 0 58 -24v76q0 18 -4.5 23.5t-20.5 5.5q-7 0 -11 -1v14q44 12 77 26l4 -1v-307q0 -18 4.5 -23.5t19.5 -5.5h12v-8zM177 518v116q0 21 -16 34t-39 13q-31 0 -48.5 -24.5t-17.5 -69.5q0 -49 19.5 -75t53.5 -26q27 0 40 16 q8 10 8 16z" />
+<glyph unicode="&#x225e;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM550 455h-118v12q22 1 28 8.5t6 31.5v107q0 29 -7.5 45t-33.5 16q-29 0 -58 -39v-128q0 -24 7.5 -32t31.5 -9v-12h-122v12q24 2 30.5 8t6.5 30v109q0 61 -34 61q-18 0 -37.5 -11.5t-27.5 -26.5v-141q0 -17 8 -22.5 t27 -6.5v-12h-118v12q23 1 30.5 9t7.5 30v124q0 31 -11 35q-3 1 -7 1q-9 0 -18 -3v15q50 16 74 25l4 -3v-40h1q41 43 83 43q46 0 60 -46q41 46 86 46q62 0 62 -97v-108q0 -11 2 -17t9.5 -9t10.5 -3.5t17 -1.5v-12z" />
+<glyph unicode="&#x225f;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM353 567h-31q0 55 23 109q30 70 30 96q0 52 -47 52q-18 0 -32.5 -12t-14.5 -21q0 -5 9.5 -13.5t9.5 -20.5q0 -15 -9 -24t-25 -9q-18 0 -28.5 13t-10.5 33q0 39 31.5 66t77.5 27q49 0 84.5 -26t35.5 -70q0 -27 -13 -49 t-53 -64q-24 -26 -37 -87zM383 497q0 -18 -12 -30.5t-30 -12.5q-20 0 -31.5 12t-11.5 31q0 18 12.5 30t30.5 12q16 0 29 -12.5t13 -29.5z" />
+<glyph unicode="&#x2260;" d="M637 120h-326l-120 -276h-54l120 276h-209v66h238l59 134h-297v66h326l120 276h54l-121 -276h210v-66h-238l-59 -134h297v-66z" />
+<glyph unicode="&#x2261;" d="M637 412h-589v66h589v-66zM637 220h-589v66h589v-66zM637 28h-589v66h589v-66z" />
+<glyph unicode="&#x2262;" d="M637 28h-366l-80 -184h-54l80 184h-169v66h198l55 126h-253v66h282l55 126h-337v66h366l80 184h54l-81 -184h170v-66h-198l-55 -126h253v-66h-282l-55 -126h337v-66z" />
+<glyph unicode="&#x2263;" d="M637 478h-589v66h589v-66zM637 306h-589v66h589v-66zM637 134h-589v66h589v-66zM637 -38h-589v66h589v-66z" />
+<glyph unicode="&#x2264;" d="M629 51l-565 273v10l565 275v-65l-432 -215l432 -215v-63zM629 -103h-565v66h565v-66z" />
+<glyph unicode="&#x2265;" d="M629 324l-565 -273v63l432 215l-432 215v65l565 -275v-10zM629 -103h-565v66h565v-66z" />
+<glyph unicode="&#x2266;" d="M622 160l-565 273v10l565 275v-65l-432 -215l432 -215v-63zM622 -12h-565v66h565v-66zM622 -211h-565v66h565v-66z" />
+<glyph unicode="&#x2267;" d="M622 433l-565 -273v63l432 215l-432 215v65l565 -275v-10zM622 -12h-565v66h565v-66zM622 -211h-565v66h565v-66z" />
+<glyph unicode="&#x2268;" d="M621 188l-565 273v10l565 275v-65l-432 -215l432 -215v-63zM621 -184h-345l-47 -76h-60l47 76h-160v66h201l84 134h-285v66h326l48 76h60l-48 -76h179v-66h-220l-84 -134h304v-66z" />
+<glyph unicode="&#x2269;" d="M621 461l-565 -273v63l432 215l-432 215v65l565 -275v-10zM621 -184h-332l-47 -76h-60l47 76h-173v66h214l84 134h-298v66h339l48 76h60l-48 -76h166v-66h-207l-84 -134h291v-66z" />
+<glyph unicode="&#x226a;" horiz-adv-x="933" d="M908 -26l-565 274v10l565 274v-65l-432 -214l432 -216v-63zM590 -26l-565 274v10l565 274v-65l-432 -214l432 -216v-63z" />
+<glyph unicode="&#x226b;" horiz-adv-x="933" d="M908 249l-565 -275v63l432 216l-432 214v65l565 -273v-10zM590 249l-565 -275v63l432 216l-432 214v65l565 -273v-10z" />
+<glyph unicode="&#x226c;" horiz-adv-x="466" d="M381 -207v-17q-83 56 -148 137q-65 -81 -148 -137v19q81 95 120 154q-110 155 -110 304t110 304q-41 64 -120 156v17q83 -56 148 -137q65 81 148 137v-19q-79 -89 -121 -154q111 -158 111 -304q0 -150 -111 -304q38 -60 121 -156zM305 253q0 130 -72 259 q-72 -132 -72 -259q0 -129 71 -259q73 129 73 259z" />
+<glyph unicode="&#x226d;" d="M637 43v-35q-92 126 -295 126q-16 0 -24 -1l-87 -199h-54l84 193q-146 -24 -213 -119v35q28 61 96.5 101.5t146.5 51.5l48 110q-89 1 -173.5 42.5t-117.5 114.5v35q92 -126 294 -126q17 0 26 1l87 199h54l-84 -193q145 24 212 119v-35q-28 -61 -96 -101t-146 -52 l-48 -110q90 -2 173.5 -43.5t116.5 -113.5z" />
+<glyph unicode="&#x226e;" d="M621 -26l-304 146l-120 -276h-54l130 298l-217 105v10l339 165l105 240h54l-90 -207l157 77v-65l-194 -97l-85 -194l279 -139v-63zM357 336l-168 -84l108 -54z" />
+<glyph unicode="&#x226f;" d="M621 247l-337 -163l-105 -240h-54l90 207l-159 -77v63l196 98l84 193l-280 139v65l304 -148l122 278h54l-131 -300l216 -105v-10zM488 252l-108 54l-59 -137z" />
+<glyph unicode="&#x2270;" d="M621 -103h-386l-47 -126h-54l47 126h-125v66h149l90 243l-239 116v10l350 170l85 228h54l-73 -196l149 73v-65l-180 -90l-79 -212l259 -128v-63l-280 135l-82 -221h362v-66zM375 419l-186 -92l128 -64z" />
+<glyph unicode="&#x2271;" d="M622 -103h-401l-47 -126h-54l47 126h-111v66h135l68 184l-203 -98v63l234 116l62 167l-296 147v65l317 -154l104 277h54l-112 -300l202 -98v-10l-296 -143l-80 -216h377v-66zM488 327l-90 45l-42 -111z" />
+<glyph unicode="&#x2272;" d="M604 50h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM621 106l-565 273v10l565 275v-65l-432 -215l432 -215v-63z" />
+<glyph unicode="&#x2273;" d="M604 50h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM629 379l-565 -273v63l432 215l-432 215v65l565 -275v-10z" />
+<glyph unicode="&#x2274;" d="M604 50h33q-5 -74 -48 -139t-110 -65q-31 0 -64.5 15t-81.5 48t-60 40l-49 -177h-54l55 199q-11 3 -21 3q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q14 0 32 -5l62 223l-249 121v10l331 161l50 181h54l-42 -151l172 84v-65l-194 -97l-58 -208l252 -125v-63 l-268 129l-61 -219q25 -13 66.5 -41.5t73.5 -45.5t55 -17q88 0 117 138zM365 471l-176 -87l133 -67z" />
+<glyph unicode="&#x2275;" d="M604 50h33q-5 -74 -48 -139t-110 -65q-35 0 -76 21.5t-87 53t-69 42.5l-55 -192h-54l58 203q-45 -3 -73.5 -41.5t-41.5 -96.5h-33q4 81 48.5 142.5t114.5 61.5h4l47 162l-198 -96v63l220 110l53 184l-273 136v65l291 -142l60 208h54l-67 -231l227 -110v-10l-304 -147 l-59 -204q31 -13 109.5 -64.5t111.5 -51.5q88 0 117 138zM496 384l-111 55l-37 -129z" />
+<glyph unicode="&#x2276;" d="M621 208l-565 244v10l565 243v-65l-432 -183l432 -186v-63zM621 39l-565 -243v63l432 185l-432 184v65l565 -244v-10z" />
+<glyph unicode="&#x2277;" d="M621 452l-565 -244v63l432 186l-432 183v65l565 -243v-10zM621 -204l-565 243v10l565 244v-65l-432 -184l432 -185v-63z" />
+<glyph unicode="&#x2278;" d="M637 38l-339 -141l-29 -147h-51l25 124l-195 -81v67l208 85l37 181l-245 100v66l257 -107l29 149l-286 118v10l340 141l30 147h51l-25 -124l193 81v-67l-207 -84l-37 -183l244 -99v-66l-256 106l-29 -149l285 -117v-10zM375 534l-189 -77l160 -65zM496 43l-155 63 l-29 -139z" />
+<glyph unicode="&#x2279;" d="M637 -207l-331 138l-36 -181h-51l40 200l-211 88v10l252 104l34 175l-286 -119v66l299 121l23 114l-322 131v67l334 -139l37 182h51l-41 -202l208 -86v-10l-247 -102l-35 -176l282 118v-66l-296 -120l-23 -116l319 -130v-67zM499 457l-81 33l-14 -72zM286 83l-100 -40 l85 -35z" />
+<glyph unicode="&#x227a;" d="M621 51v-77q-84 112 -235 172.5t-322 73.5v66q171 13 322 73.5t235 172.5v-77q-35 -60 -133.5 -116.5t-200.5 -85.5q102 -29 200.5 -85.5t133.5 -116.5z" />
+<glyph unicode="&#x227b;" d="M621 286v-66q-171 -13 -322 -73.5t-235 -172.5v77q35 60 133.5 116.5t200.5 85.5q-102 29 -200.5 85.5t-133.5 116.5v77q84 -112 235 -172.5t322 -73.5z" />
+<glyph unicode="&#x227c;" d="M621 147v-77q-84 112 -235 172.5t-322 73.5v66q171 13 322 73.5t235 172.5v-77q-35 -60 -133.5 -116.5t-200.5 -85.5q102 -29 200.5 -85.5t133.5 -116.5zM621 -42v-78q-49 61 -122.5 108.5t-153 73.5t-148.5 40t-133 18v66q147 -6 304 -62.5t253 -165.5z" />
+<glyph unicode="&#x227d;" d="M621 383v-66q-171 -13 -322 -73.5t-235 -172.5v77q35 60 133.5 116.5t200.5 85.5q-102 29 -200.5 85.5t-133.5 116.5v77q84 -112 235 -172.5t322 -73.5zM621 187v-66q-64 -4 -133 -18t-148.5 -40t-153 -73.5t-122.5 -108.5v78q96 109 253 165.5t304 62.5z" />
+<glyph unicode="&#x227e;" d="M620 183v-77q-84 112 -235 172.5t-322 73.5v66q171 13 322 73.5t235 172.5v-77q-35 -60 -133.5 -116.5t-200.5 -85.5q102 -29 200.5 -85.5t133.5 -116.5zM604 50h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33 q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138z" />
+<glyph unicode="&#x227f;" d="M622 418v-66q-171 -13 -322 -73.5t-235 -172.5v77q35 60 133.5 116.5t200.5 85.5q-102 29 -200.5 85.5t-133.5 116.5v77q84 -112 235 -172.5t322 -73.5zM604 50h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33 q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138z" />
+<glyph unicode="&#x2280;" d="M621 51v-77q-83 111 -247 177l-124 -307h-54l131 324q-120 40 -263 52v66q197 16 345 84l119 292h54l-104 -256q90 54 143 126v-77q-44 -75 -181 -142l-41 -101q172 -76 222 -161zM353 231l21 52q-41 -16 -87 -30q15 -4 66 -22z" />
+<glyph unicode="&#x2281;" d="M621 286v-66q-194 -15 -344 -84l-119 -292h-54l104 256q-90 -54 -144 -126v77q43 74 182 142l40 100q-175 78 -222 162v77q83 -112 247 -178l125 308h54l-132 -325q128 -42 263 -51zM333 274l-21 -51q44 17 86 30q-34 10 -65 21z" />
+<glyph unicode="&#x2282;" d="M621 -25h-290q-116 0 -191.5 82.5t-75.5 196.5t76.5 195.5t193.5 81.5h287v-66h-287q-84 0 -144 -64.5t-60 -146.5t60.5 -147.5t144.5 -65.5h286v-66z" />
+<glyph unicode="&#x2283;" d="M64 531h287q117 0 193.5 -81.5t76.5 -195.5t-75.5 -196.5t-191.5 -82.5h-290v66h286q84 0 144.5 65.5t60.5 147.5t-60 146.5t-144 64.5h-287v66z" />
+<glyph unicode="&#x2284;" d="M623 -25h-291q-35 0 -73 10l-61 -141h-54l69 158q-68 34 -108 102.5t-40 149.5q0 114 76.5 195.5t193.5 81.5h109l57 131h54l-57 -131h125v-66h-154l-182 -417q21 -7 49 -7h287v-66zM415 465h-80q-84 0 -144 -64.5t-60 -146.5q0 -56 30 -107t80 -80z" />
+<glyph unicode="&#x2285;" d="M541 662l-69 -158q70 -34 110.5 -102t40.5 -148q0 -114 -75.5 -196.5t-191.5 -82.5h-115l-57 -131h-54l57 131h-122v66h151l182 418q-21 6 -45 6h-288v66h288q35 0 72 -10l62 141h54zM270 41h82q84 0 144.5 65.5t60.5 147.5q0 57 -31 108t-82 79z" />
+<glyph unicode="&#x2286;" d="M621 51h-290q-116 0 -191.5 82.5t-75.5 196.5t76.5 195.5t193.5 81.5h287v-66h-287q-84 0 -144 -64.5t-60 -146.5t60.5 -147.5t144.5 -65.5h286v-66zM621 -103h-548v66h548v-66z" />
+<glyph unicode="&#x2287;" d="M64 607h287q117 0 193.5 -81.5t76.5 -195.5t-75.5 -196.5t-191.5 -82.5h-290v66h286q84 0 144.5 65.5t60.5 147.5t-60 146.5t-144 64.5h-287v66zM612 -103h-548v66h548v-66z" />
+<glyph unicode="&#x2288;" d="M621 -103h-378l-47 -126h-54l47 126h-116v66h140l38 100q-85 26 -136 100t-51 167q0 114 76.5 195.5t193.5 81.5h119l46 123h54l-46 -123h114v-66h-138l-158 -424h296v-66h-290q-20 0 -30 1l-34 -89h354v-66zM429 541h-95q-84 0 -144 -64.5t-60 -146.5q0 -66 41 -123.5 t104 -79.5z" />
+<glyph unicode="&#x2289;" d="M547 730l-59 -160q62 -36 97.5 -100.5t35.5 -139.5q0 -114 -75.5 -196.5t-191.5 -82.5h-60l-33 -88h351v-66h-375l-47 -126h-54l47 126h-119v66h143l33 88h-176v66h201l153 411q-34 13 -67 13h-287v66h287q43 0 90 -15l52 138h54zM319 117h31q84 0 144.5 65.5t60.5 147.5 q0 50 -25 97t-67 77z" />
+<glyph unicode="&#x228a;" d="M621 71h-290q-116 0 -191.5 82.5t-75.5 196.5t76.5 195.5t193.5 81.5h287v-66h-287q-84 0 -144 -64.5t-60 -146.5t60.5 -147.5t144.5 -65.5h286v-66zM621 -120h-283l-60 -96h-59l60 96h-207v66h249l61 96h59l-61 -96h241v-66z" />
+<glyph unicode="&#x228b;" d="M64 627h287q117 0 193.5 -81.5t76.5 -195.5t-75.5 -196.5t-191.5 -82.5h-290v66h286q84 0 144.5 65.5t60.5 147.5t-60 146.5t-144 64.5h-287v66zM611 -120h-269l-60 -96h-59l60 96h-219v66h261l61 96h59l-61 -96h227v-66z" />
+<glyph unicode="&#x228c;" horiz-adv-x="620" d="M572 536v-296q0 -119 -75 -195t-187 -76q-113 0 -187.5 75t-74.5 193v299h66v-295q0 -86 57 -146t139 -60q80 0 138 60t58 145v296h66zM448 257h-104q-26 0 -26 -20q0 -14 14 -28q16 -17 49 -66l-20 -19q-10 11 -29 34l-28 33q-8 9 -25 26t-30 26t-33 20.5t-43 21.5v10 q28 12 48.5 23.5t41.5 30.5l29 27q9 8 34.5 39t33.5 40l20 -19q-34 -50 -49 -66q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h105v-66z" />
+<glyph unicode="&#x228d;" horiz-adv-x="620" d="M572 536v-296q0 -119 -75 -195t-187 -76q-113 0 -187.5 75t-74.5 193v299h66v-295q0 -86 57 -146t139 -60q80 0 138 60t58 145v296h66zM374 290q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x228e;" horiz-adv-x="620" d="M572 536v-296q0 -119 -75 -195t-187 -76q-113 0 -187.5 75t-74.5 193v299h66v-295q0 -86 57 -146t139 -60q80 0 138 60t58 145v296h66zM460 257h-117v-117h-66v117h-117v66h117v117h66v-117h117v-66z" />
+<glyph unicode="&#x228f;" d="M621 -25h-557v556h557v-66h-491v-424h491v-66z" />
+<glyph unicode="&#x2290;" d="M621 -25h-557v66h491v424h-491v66h557v-556z" />
+<glyph unicode="&#x2291;" d="M621 51h-557v556h557v-66h-491v-424h491v-66zM621 -103h-557v66h557v-66z" />
+<glyph unicode="&#x2292;" d="M621 51h-557v66h491v424h-491v66h557v-556zM621 -103h-557v66h557v-66z" />
+<glyph unicode="&#x2293;" horiz-adv-x="620" d="M572 -31h-66v501h-392v-501h-66v567h524v-567z" />
+<glyph unicode="&#x2294;" horiz-adv-x="620" d="M572 -31h-524v567h66v-501h392v501h66v-567z" />
+<glyph unicode="&#x2295;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM454 285h270q-11 107 -87.5 183t-182.5 87v-270zM388 285v270q-106 -11 -182.5 -87t-87.5 -183h270zM724 219h-270v-270q106 11 182.5 87 t87.5 183zM388 -51v270h-270q11 -107 87.5 -183t182.5 -87z" />
+<glyph unicode="&#x2296;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM118 285h606q-12 115 -99 193.5t-204 78.5t-204 -78.5t-99 -193.5zM724 219h-606q12 -115 99 -193.5t204 -78.5t204 78.5t99 193.5z" />
+<glyph unicode="&#x2297;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM421 299l191 191q-83 67 -191 67t-191 -67zM468 252l191 -191q67 83 67 191t-67 191zM374 252l-191 191q-67 -83 -67 -191t67 -191zM612 14 l-191 191l-191 -191q83 -67 191 -67t191 67z" />
+<glyph unicode="&#x2298;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM183 61l429 429q-83 67 -191 67q-126 0 -215.5 -89.5t-89.5 -215.5q0 -108 67 -191zM659 443l-429 -429q83 -67 191 -67q126 0 215.5 89.5 t89.5 215.5q0 108 -67 191z" />
+<glyph unicode="&#x2299;" horiz-adv-x="762" d="M712 252q0 -137 -97 -234t-234 -97t-234 97t-97 234t97 234t234 97t234 -97t97 -234zM646 252q0 110 -78 187.5t-187 77.5t-187 -77.5t-78 -187.5t78 -187.5t187 -77.5t187 77.5t78 187.5zM444 253q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45 t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x229a;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM554 252 q0 -56 -39.5 -95.5t-95.5 -39.5q-57 0 -96 39.5t-39 97.5q0 56 39.5 94.5t97.5 38.5q55 0 94 -39.5t39 -95.5zM488 252q0 29 -20 49t-47 20q-31 0 -51 -19.5t-20 -47.5q0 -31 19.5 -51t49.5 -20q29 0 49 20t20 49z" />
+<glyph unicode="&#x229b;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM612 165 q0 -43 -43 -43q-19 0 -35 18l-42 48q-26 30 -61 50q0 -43 16 -94.5t16 -63.5q0 -17 -13.5 -31t-28.5 -14q-16 0 -29 14t-13 31q0 12 16 63.5t16 94.5q-32 -19 -69.5 -60.5t-45.5 -46.5q-18 -9 -30 -9q-19 0 -30 10.5t-11 24.5q0 30 24 43q11 7 64.5 20.5t85.5 31.5 q-31 18 -85 30.5t-67 20.5q-22 13 -22 33q0 46 40 46q13 0 24 -7q12 -7 49.5 -47.5t72.5 -59.5q0 43 -16 96t-16 65q0 17 13 29t29 12t29 -12t13 -29q0 -12 -16 -64t-16 -95q34 18 56.5 40.5t36 40.5t24.5 24q11 7 24 7q40 0 40 -46q0 -21 -25 -35q-8 -4 -55 -13.5 t-93 -35.5q39 -23 89 -34.5t60 -17.5q24 -14 24 -35z" />
+<glyph unicode="&#x229c;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM634 297h-426v66h426 v-66zM634 143h-426v66h426v-66z" />
+<glyph unicode="&#x229d;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM634 219h-426v66h426 v-66z" />
+<glyph unicode="&#x229e;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM799 278v318h-318v-318h318zM429 278v318h-318v-318h318zM799 -92v318h-318v-318h318zM429 -92v318h-318v-318h318z" />
+<glyph unicode="&#x229f;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM799 278v318h-688v-318h688zM799 -92v318h-688v-318h688z" />
+<glyph unicode="&#x22a0;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM762 596h-614l307 -307zM799 -56v615l-307 -308zM761 -92l-306 306l-306 -306h612zM418 251l-307 308v-615z" />
+<glyph unicode="&#x22a1;" horiz-adv-x="910" d="M518 252q0 -27 -18 -45.5t-45 -18.5q-29 0 -46.5 18t-17.5 46q0 26 19 44.5t45 18.5t44.5 -18.5t18.5 -44.5zM865 -157h-820v819h820v-819zM799 -91v687h-688v-687h688z" />
+<glyph unicode="&#x22a2;" d="M621 298h-491v-298h-66v662h66v-298h491v-66z" />
+<glyph unicode="&#x22a3;" d="M621 0h-66v298h-491v66h491v298h66v-662z" />
+<glyph unicode="&#x22a4;" d="M637 596h-262v-596h-66v596h-261v66h589v-66z" />
+<glyph unicode="&#x22a5;" d="M637 0h-589v66h262v596h66v-596h261v-66z" />
+<glyph unicode="&#x22a6;" horiz-adv-x="497" d="M433 298h-303v-298h-66v662h66v-298h303v-66z" />
+<glyph unicode="&#x22a7;" horiz-adv-x="498" d="M434 198h-304v-198h-66v662h66v-198h304v-66h-304v-134h304v-66z" />
+<glyph unicode="&#x22a8;" d="M621 198h-491v-198h-66v662h66v-198h491v-66h-491v-134h491v-66z" />
+<glyph unicode="&#x22a9;" horiz-adv-x="860" d="M814 298h-491v-298h-66v662h66v-298h491v-66zM123 0h-66v662h66v-662z" />
+<glyph unicode="&#x22aa;" horiz-adv-x="860" d="M815 298h-303v-298h-66v662h66v-298h303v-66zM312 0h-66v662h66v-662zM111 0h-66v662h66v-662z" />
+<glyph unicode="&#x22ab;" horiz-adv-x="860" d="M814 198h-491v-198h-66v662h66v-198h491v-66h-491v-134h491v-66zM123 0h-66v662h66v-662z" />
+<glyph unicode="&#x22ac;" horiz-adv-x="786" d="M723 662l-291 -298h290v-66h-354l-137 -141v-157h-66v89l-87 -89h-69l156 160v502h66v-298h132l291 298h69zM299 298h-68v-70z" />
+<glyph unicode="&#x22ad;" horiz-adv-x="786" d="M723 662l-193 -198h192v-66h-256l-131 -134h387v-66h-451l-40 -41v-157h-66v89l-87 -89h-69l156 160v502h66v-198h230l193 198h69zM397 398h-166v-134h35z" />
+<glyph unicode="&#x22ae;" horiz-adv-x="968" d="M922 298h-460l-31 -25v-273h-66v220l-134 -106v-114h-66v62l-78 -62h-78l156 123v539h66v-486l134 106v380h66v-298h37l376 298h78l-376 -298h376v-66z" />
+<glyph unicode="&#x22af;" horiz-adv-x="968" d="M922 198h-491v-198h-66v219l-134 -106v-113h-66v60l-76 -60h-80l156 124v538h66v-486l134 106v380h66v-198h162l249 198h80l-250 -198h250v-66h-333l-158 -126v-8h491v-66zM510 398h-79v-63z" />
+<glyph unicode="&#x22b0;" d="M317 254v-2q304 -29 304 -189q0 -47 -28 -77.5t-73 -30.5q-40 0 -68.5 25t-29.5 62h48q11 -38 48 -38q20 0 33.5 13t13.5 40q0 24 -13 44t-38.5 34.5t-50 24.5t-60.5 18t-55.5 11.5t-48.5 7.5q-46 7 -235 23v66q189 16 235 23q29 4 48.5 7.5t55.5 11.5t60.5 18t50 24.5 t38.5 34.5t13 44q0 27 -13.5 40t-33.5 13q-37 0 -48 -38h-48q1 37 29.5 62t68.5 25q45 0 73 -30.5t28 -77.5q0 -160 -304 -189z" />
+<glyph unicode="&#x22b1;" d="M621 286v-66q-189 -16 -235 -23q-29 -4 -48.5 -7.5t-55.5 -11.5t-60.5 -18t-50 -24.5t-38.5 -34.5t-13 -44q0 -27 13.5 -40t33.5 -13q37 0 48 38h48q-1 -37 -29.5 -62t-68.5 -25q-45 0 -73 30.5t-28 77.5q0 160 304 189v2q-304 29 -304 189q0 47 28 77.5t73 30.5 q40 0 68.5 -25t29.5 -62h-48q-11 38 -48 38q-20 0 -33.5 -13t-13.5 -40q0 -24 13 -44t38.5 -34.5t50 -24.5t60.5 -18t55.5 -11.5t48.5 -7.5q46 -7 235 -23z" />
+<glyph unicode="&#x22b2;" d="M631 -25l-607 278l607 278v-556zM565 80v346l-384 -173z" />
+<glyph unicode="&#x22b3;" d="M661 253l-607 -278v556zM504 253l-384 173v-346z" />
+<glyph unicode="&#x22b4;" d="M631 51l-607 278l607 278v-556zM565 156v346l-384 -173zM631 -103h-597v66h597v-66z" />
+<glyph unicode="&#x22b5;" d="M661 329l-607 -278v556zM504 329l-384 173v-346zM651 -103h-597v66h597v-66z" />
+<glyph unicode="&#x22b6;" horiz-adv-x="1145" d="M346 286h453q11 51 52 84t94 33q62 0 106 -44t44 -106t-44 -106t-106 -44q-53 0 -94 33t-52 84h-453q-11 -51 -52 -84t-94 -33q-62 0 -106 44t-44 106t44 106t106 44q53 0 94 -33t52 -84zM300 253q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5t29.5 -70.5 t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x22b7;" horiz-adv-x="1145" d="M346 286h453q11 51 52 84t94 33q62 0 106 -44t44 -106t-44 -106t-106 -44q-53 0 -94 33t-52 84h-453q-11 -51 -52 -84t-94 -33q-62 0 -106 44t-44 106t44 106t106 44q53 0 94 -33t52 -84zM1045 253q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5t29.5 -70.5 t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x22b8;" horiz-adv-x="849" d="M50 286h453q11 51 52 84t94 33q62 0 106 -44t44 -106t-44 -106t-106 -44q-53 0 -94 33t-52 84h-453v66zM749 253q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5t29.5 -70.5t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x22b9;" d="M375 326h-66v221h66v-221zM636 220h-221v66h221v-66zM269 220h-221v66h221v-66zM375 -41h-66v221h66v-221z" />
+<glyph unicode="&#x22ba;" horiz-adv-x="480" d="M406 384h-123v-596h-86v596h-123v66h332v-66z" />
+<glyph unicode="&#x22bb;" horiz-adv-x="620" d="M590 536l-273 -565h-10l-275 565h65l215 -432l215 432h63zM572 -139h-524v66h524v-66z" />
+<glyph unicode="&#x22bc;" horiz-adv-x="620" d="M572 580h-524v66h524v-66zM590 -29h-63l-215 432l-215 -432h-65l275 565h10z" />
+<glyph unicode="&#x22bd;" horiz-adv-x="620" d="M590 536l-273 -565h-10l-275 565h65l215 -432l215 432h63zM572 580h-524v66h524v-66z" />
+<glyph unicode="&#x22be;" d="M634 0h-584v584h66v-173q133 -21 228.5 -116.5t116.5 -228.5h173v-66zM116 66h277q-20 105 -96.5 181.5t-180.5 96.5v-278z" />
+<glyph unicode="&#x22bf;" horiz-adv-x="911" d="M865 -158h-820l820 820v-820zM799 -92v595l-596 -595h596z" />
+<glyph unicode="&#x22c0;" horiz-adv-x="924" d="M870 -259h-76l-331 877h-2l-331 -877h-76l380 1022h56z" />
+<glyph unicode="&#x22c1;" horiz-adv-x="924" d="M870 763l-380 -1022h-56l-380 1022h76l331 -877h2l331 877h76z" />
+<glyph unicode="&#x22c2;" horiz-adv-x="924" d="M830 -254h-73v715q0 97 -87 170.5t-208 73.5t-208 -73.5t-87 -170.5v-715h-73v702q0 144 110.5 237t263.5 93q89 0 171 -40t136.5 -117.5t54.5 -172.5v-702z" />
+<glyph unicode="&#x22c3;" horiz-adv-x="924" d="M830 768v-702q0 -95 -54.5 -172.5t-136.5 -117.5t-171 -40q-153 0 -263.5 93t-110.5 237v702h73v-715q0 -97 87 -170.5t208 -73.5t208 73.5t87 170.5v715h73z" />
+<glyph unicode="&#x22c4;" horiz-adv-x="523" d="M497 252l-236 -236l-235 236l235 236zM404 252l-143 143l-142 -143l142 -143z" />
+<glyph unicode="&#x22c5;" horiz-adv-x="286" d="M203 253q0 -24 -17.5 -42t-41.5 -18t-42.5 18.5t-18.5 41.5t18.5 41.5t42.5 18.5t41.5 -18t17.5 -42z" />
+<glyph unicode="&#x22c6;" horiz-adv-x="700" d="M665 365l-226 -137l107 -241l-196 179l-196 -179l107 241l-226 137l262 -30l53 262l53 -262z" />
+<glyph unicode="&#x22c7;" d="M406 462q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM634 8l-46 -46l-245 244l-246 -244l-46 46l211 211h-211v66h213l-213 214l46 46l246 -245l245 245l46 -46l-212 -214h212v-66h-210zM406 45q0 -26 -19 -45t-45 -19 q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5z" />
+<glyph unicode="&#x22c8;" horiz-adv-x="810" d="M756 -80l-351 285l-351 -285v662l351 -285l351 285v-662zM690 58v386l-239 -193zM359 251l-239 193v-386z" />
+<glyph unicode="&#x22c9;" horiz-adv-x="810" d="M716 -80l-312 287l-311 -287v662l311 -286l312 286v-88l-263 -243l263 -244v-87zM356 251l-197 182v-363z" />
+<glyph unicode="&#x22ca;" horiz-adv-x="810" d="M716 -80l-311 287l-312 -287v87l263 244l-263 243v88l312 -286l311 286v-662zM650 70v363l-197 -182z" />
+<glyph unicode="&#x22cb;" horiz-adv-x="810" d="M736 -34l-46 -46l-285 285l-285 -285l-46 46l285 285l-285 285l46 46z" />
+<glyph unicode="&#x22cc;" horiz-adv-x="810" d="M736 -34l-46 -46l-285 285l-285 -285l-46 46l616 616l46 -46l-285 -285z" />
+<glyph unicode="&#x22cd;" d="M637 231h-33q-29 138 -117 138q-30 0 -79 -32l-102 -64q-54 -32 -95 -32q-70 0 -114.5 61.5t-48.5 142.5h33q14 -60 44 -99t79 -39q29 0 78 32l102 64q54 32 95 32q67 0 110 -65t48 -139zM637 55h-589v66h589v-66z" />
+<glyph unicode="&#x22ce;" horiz-adv-x="580" d="M472 532h77q-103 -102 -158 -247.5t-68 -309.5h-66q-13 164 -68 309.5t-158 247.5h77q130 -153 182 -334q52 181 182 334z" />
+<glyph unicode="&#x22cf;" horiz-adv-x="580" d="M549 -25h-77q-130 153 -182 334q-52 -181 -182 -334h-77q103 102 158 247.5t68 309.5h66q13 -164 68 -309.5t158 -247.5z" />
+<glyph unicode="&#x22d0;" d="M621 -25h-290q-116 0 -191.5 82.5t-75.5 196.5t76.5 195.5t193.5 81.5h287v-66h-287q-84 0 -144 -64.5t-60 -146.5t60.5 -147.5t144.5 -65.5h286v-66zM621 118h-285q-56 0 -93 40t-37 96t38 95t92 39h285v-66h-284q-26 0 -45.5 -21t-19.5 -47q0 -27 20 -48.5t46 -21.5 h283v-66z" />
+<glyph unicode="&#x22d1;" d="M64 531h287q117 0 193.5 -81.5t76.5 -195.5t-75.5 -196.5t-191.5 -82.5h-290v66h286q84 0 144.5 65.5t60.5 147.5t-60 146.5t-144 64.5h-287v66zM64 388h285q54 0 92 -39t38 -95t-37 -96t-93 -40h-285v66h283q27 0 46.5 21.5t19.5 48.5q0 26 -19.5 47t-45.5 21h-284v66z " />
+<glyph unicode="&#x22d2;" horiz-adv-x="620" d="M433 536v-299q0 -58 -34 -94t-89 -36q-54 0 -88.5 36.5t-34.5 93.5v299h66v-298q0 -28 15 -46.5t42 -18.5t42 18.5t15 47.5v297h66zM572 536v-299q0 -118 -74.5 -193t-187.5 -75q-112 0 -187 76t-75 195v296h66v-296q0 -85 58 -145t138 -60q82 0 139 60t57 146v295h66z " />
+<glyph unicode="&#x22d3;" horiz-adv-x="620" d="M572 -31h-66v295q0 86 -57 146t-139 60q-80 0 -138 -60t-58 -145v-296h-66v296q0 119 75 195t187 76q113 0 187.5 -75t74.5 -193v-299zM433 -31h-66v297q0 29 -15 47.5t-42 18.5t-42 -18.5t-15 -46.5v-298h-66v299q0 57 34.5 93.5t88.5 36.5q55 0 89 -36t34 -94v-299z " />
+<glyph unicode="&#x22d4;" horiz-adv-x="620" d="M572 -31h-66v296q0 76 -47 133t-116 70v-499h-66v499q-70 -12 -116.5 -70t-46.5 -134v-295h-66v299q0 109 64 182t165 84v97h66v-97q100 -12 164.5 -86t64.5 -183v-296z" />
+<glyph unicode="&#x22d5;" d="M637 120h-161v-309h-66v309h-134v-309h-66v309h-162v66h162v134h-162v66h162v304h66v-304h134v304h66v-304h161v-66h-161v-134h161v-66zM410 186v134h-134v-134h134z" />
+<glyph unicode="&#x22d6;" d="M621 -24l-565 273v10l565 275v-65l-432 -215l432 -215v-63zM539 253q0 -28 -18.5 -48t-48.5 -20t-49 18.5t-19 49.5q0 29 20.5 48t47.5 19t47 -19t20 -48z" />
+<glyph unicode="&#x22d7;" d="M621 249l-565 -273v63l432 215l-432 215v65l565 -275v-10zM273 253q0 -31 -19 -49.5t-49 -18.5t-48.5 20t-18.5 48q0 29 20 48t47 19t47.5 -19t20.5 -48z" />
+<glyph unicode="&#x22d8;" horiz-adv-x="1274" d="M610 -24l-565 273v10l565 275v-65l-432 -215l432 -215v-63zM920 -24l-565 273v10l565 275v-65l-432 -215l432 -215v-63zM1229 -24l-565 273v10l565 275v-65l-432 -215l432 -215v-63z" />
+<glyph unicode="&#x22d9;" horiz-adv-x="1274" d="M610 249l-565 -273v63l432 215l-432 215v65l565 -275v-10zM919 249l-565 -273v63l432 215l-432 215v65l565 -275v-10zM1229 249l-565 -273v63l432 215l-432 215v65l565 -275v-10z" />
+<glyph unicode="&#x22da;" d="M621 393l-565 214v10l565 213v-65l-406 -153l406 -156v-63zM621 220h-565v66h565v-66zM621 -111l-565 -213v63l406 155l-406 154v65l565 -214v-10z" />
+<glyph unicode="&#x22db;" d="M621 607l-565 -214v63l406 156l-406 153v65l565 -213v-10zM621 220h-565v66h565v-66zM621 -324l-565 213v10l565 214v-65l-406 -154l406 -155v-63z" />
+<glyph unicode="&#x22dc;" d="M621 541h-557v66h557v-66zM621 -103l-557 274v10l557 273v-67l-421 -211l421 -212v-67z" />
+<glyph unicode="&#x22dd;" d="M621 541h-557v66h557v-66zM621 170l-557 -273v67l421 211l-421 212v67l557 -274v-10z" />
+<glyph unicode="&#x22de;" d="M621 -44v-77q-84 112 -235 172.5t-322 73.5v66q171 13 322 73.5t235 172.5v-77q-35 -60 -133.5 -116.5t-200.5 -85.5q102 -29 200.5 -85.5t133.5 -116.5zM621 627v-78q-96 -109 -253 -165.5t-304 -62.5v66q64 4 133 18t148.5 40t153 73.5t122.5 108.5z" />
+<glyph unicode="&#x22df;" d="M621 191v-66q-171 -13 -322 -73.5t-235 -172.5v77q35 60 133.5 116.5t200.5 85.5q-102 29 -200.5 85.5t-133.5 116.5v77q84 -112 235 -172.5t322 -73.5zM621 387v-66q-147 6 -304 62.5t-253 165.5v78q49 -61 122.5 -108.5t153 -73.5t148.5 -40t133 -18z" />
+<glyph unicode="&#x22e0;" d="M621 -43v-77q-87 118 -271 183l-95 -292h-53l100 308q-112 31 -238 41v66q139 -10 258 -44l37 113q-132 50 -295 62v66q208 15 367 93l82 254h53l-71 -217q79 52 126 115v-67q-61 -78 -153 -132l-44 -136q119 -58 197 -155v-67q-76 102 -216 165l-35 -109 q168 -59 251 -170zM378 313l27 85q-73 -32 -158 -48q74 -15 131 -37z" />
+<glyph unicode="&#x22e1;" d="M621 186v-66q-228 -18 -383 -98l-73 -251h-53l62 214q-67 -46 -110 -105v77q50 68 137 119l42 142q-114 -59 -179 -147v67q80 101 201 157l29 97q-142 57 -230 169v67q83 -113 247 -177l82 279h53l-87 -297q122 -40 262 -50v-66q-175 -13 -317 -71l-41 -138 q142 62 358 78zM341 374l-16 -54q55 18 113 30q-50 9 -97 24z" />
+<glyph unicode="&#x22e2;" d="M622 -103h-382l-47 -126h-54l47 126h-121v66h145l33 88h-178v556h385l46 123h54l-46 -123h118v-66h-142l-158 -424h300v-66h-325l-33 -88h358v-66zM425 541h-294v-424h137z" />
+<glyph unicode="&#x22e3;" d="M622 -103h-375l-47 -126h-54l47 126h-128v66h152l33 88h-185v66h210l157 424h-367v66h392l46 123h54l-46 -123h111v-556h-318l-33 -88h351v-66zM556 117v424h-69l-158 -424h227z" />
+<glyph unicode="&#x22e4;" d="M621 71h-557v556h557v-66h-491v-424h491v-66zM621 -120h-282l-60 -96h-59l60 96h-216v66h258l61 96h59l-61 -96h240v-66z" />
+<glyph unicode="&#x22e5;" d="M621 71h-557v66h491v424h-491v66h557v-556zM621 -120h-279l-60 -96h-59l60 96h-219v66h261l61 96h59l-61 -96h237v-66z" />
+<glyph unicode="&#x22e6;" d="M621 111l-565 273v10l565 275v-65l-432 -215l432 -215v-63zM604 20h33q-5 -74 -48 -139t-110 -65q-50 0 -137 58l-72 -153h-55l85 181q-66 42 -96 42q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q48 0 118 -45l67 140h55l-80 -168q82 -55 116 -55 q88 0 117 138z" />
+<glyph unicode="&#x22e7;" d="M621 384l-565 -273v63l432 215l-432 215v65l565 -275v-10zM604 20h33q-5 -74 -48 -139t-110 -65q-51 0 -134 55l-70 -150h-55l84 179q-68 44 -100 44q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q48 0 122 -48l68 143h55l-81 -171q79 -52 112 -52 q88 0 117 138z" />
+<glyph unicode="&#x22e8;" d="M621 189v-77q-84 112 -235 172.5t-322 73.5v66q171 13 322 73.5t235 172.5v-77q-35 -60 -133.5 -116.5t-200.5 -85.5q102 -29 200.5 -85.5t133.5 -116.5zM604 20h33q-5 -74 -48 -139t-110 -65q-51 0 -138 58l-72 -153h-55l85 182q-62 41 -95 41q-49 0 -79 -39t-44 -99 h-33q4 81 48.5 142.5t114.5 61.5q48 0 118 -45l66 140h55l-79 -168q82 -55 116 -55q88 0 117 138z" />
+<glyph unicode="&#x22e9;" d="M621 424v-66q-171 -13 -322 -73.5t-235 -172.5v77q35 60 133.5 116.5t200.5 85.5q-102 29 -200.5 85.5t-133.5 116.5v77q84 -112 235 -172.5t322 -73.5zM604 20h33q-5 -74 -48 -139t-110 -65q-50 0 -135 56l-71 -151h-55l84 180q-64 43 -98 43q-49 0 -79 -39t-44 -99h-33 q4 81 48.5 142.5t114.5 61.5q49 0 121 -47l67 142h55l-80 -170q80 -53 113 -53q88 0 117 138z" />
+<glyph unicode="&#x22ea;" horiz-adv-x="635" d="M581 -25l-279 139l-111 -270h-54l120 292l-233 117l354 177l96 232h54l-82 -198l135 67v-556zM515 80v346l-106 -53l-82 -200zM341 339l-172 -85v-2l113 -56z" />
+<glyph unicode="&#x22eb;" horiz-adv-x="635" d="M611 253l-358 -179l-95 -230h-54l81 196l-131 -65v556l276 -138l111 269h54l-120 -291zM466 252v2l-116 57l-60 -147zM305 333l-185 93v-346l102 51z" />
+<glyph unicode="&#x22ec;" horiz-adv-x="635" d="M581 -103h-355l-43 -126h-53l43 126h-149v66h171l82 239l-253 127l358 179l76 222h53l-66 -191l136 68v-556l-259 129l-74 -217h333v-66zM515 156v346l-99 -50l-73 -211zM352 421l-183 -91v-2l129 -65z" />
+<glyph unicode="&#x22ed;" horiz-adv-x="635" d="M611 -103h-385l-36 -126h-53l36 126h-119v66h138l53 183l-191 -95v556l283 -142l77 265h53l-83 -288l227 -113l-304 -152l-62 -214h366v-66zM466 328v2l-100 50l-35 -119zM319 403l-199 99v-346l149 74z" />
+<glyph unicode="&#x22ee;" horiz-adv-x="511" d="M319 543q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM319 252q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM319 -40q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5 t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x22ef;" horiz-adv-x="926" d="M818 253q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM526 253q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM235 253q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5 t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x22f0;" horiz-adv-x="926" d="M732 457q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM528 252q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM321 46q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5 t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x22f1;" horiz-adv-x="926" d="M321 457q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM732 46q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM525 252q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5 t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x22f2;" horiz-adv-x="823" d="M763 -27h-291q-108 0 -184 71.5t-88 174.5h-145v66h145q12 103 86.5 174.5t182.5 71.5h294v-66h-290q-75 0 -134 -53.5t-72 -126.5h496v-66h-497q13 -73 72 -126.5t134 -53.5h291v-66z" />
+<glyph unicode="&#x22f3;" d="M625 -27h-291q-118 0 -196 82.5t-78 196.5t77 196.5t194 82.5h294v-66h-290q-75 0 -134 -53.5t-72 -126.5h430v113h66v-292h-66v113h-431q13 -73 72 -126.5t134 -53.5h291v-66z" />
+<glyph unicode="&#x22f4;" horiz-adv-x="486" d="M420 45h-149q-92 0 -150.5 59.5t-58.5 147.5t59 147.5t152 59.5h147v-66h-147q-125 0 -144 -108h225v72h66v-210h-66v72h-225q21 -108 145 -108h146v-66z" />
+<glyph unicode="&#x22f5;" d="M625 -27h-291q-118 0 -196 82.5t-78 196.5t77 196.5t194 82.5h294v-66h-290q-75 0 -134 -53.5t-72 -126.5h496v-66h-497q13 -73 72 -126.5t134 -53.5h291v-66zM426 653q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x22f6;" d="M625 -27h-291q-118 0 -196 82.5t-78 196.5t77 196.5t194 82.5h294v-66h-290q-75 0 -134 -53.5t-72 -126.5h496v-66h-497q13 -73 72 -126.5t134 -53.5h291v-66zM625 619h-555v66h555v-66z" />
+<glyph unicode="&#x22f7;" horiz-adv-x="486" d="M420 45h-149q-92 0 -150.5 59.5t-58.5 147.5t59 147.5t152 59.5h147v-66h-147q-125 0 -144 -108h291v-66h-291q21 -108 145 -108h146v-66zM420 547h-340v66h340v-66z" />
+<glyph unicode="&#x22f8;" d="M625 -26h-294q-117 0 -194 82.5t-77 196.5t78 196.5t196 82.5h291v-66h-291q-75 0 -134 -53.5t-72 -126.5h497v-66h-496q13 -73 72 -126.5t134 -53.5h290v-66zM625 -180h-555v66h555v-66z" />
+<glyph unicode="&#x22f9;" d="M625 -27h-297q-116 0 -191.5 83t-75.5 197t76.5 196t193.5 82h294v-66h-294q-57 0 -105.5 -33t-75.5 -84h475v-66h-496q-2 -10 -2 -29q0 -11 2 -31h496v-66h-474q27 -52 75.5 -84.5t105.5 -32.5h293v-66z" />
+<glyph unicode="&#x22fa;" horiz-adv-x="823" d="M763 219h-145q-12 -103 -88 -174.5t-184 -71.5h-291v66h291q75 0 134 53.5t72 126.5h-497v66h496q-13 73 -72 126.5t-134 53.5h-290v66h294q108 0 182.5 -71.5t86.5 -174.5h145v-66z" />
+<glyph unicode="&#x22fb;" d="M59 531h294q117 0 194 -82.5t77 -196.5t-78 -196.5t-196 -82.5h-291v66h291q75 0 134 53.5t72 126.5h-431v-113h-66v292h66v-113h430q-13 73 -72 126.5t-134 53.5h-290v66z" />
+<glyph unicode="&#x22fc;" horiz-adv-x="486" d="M62 459h147q93 0 152 -59.5t59 -147.5t-58.5 -147.5t-150.5 -59.5h-149v66h146q124 0 145 108h-225v-72h-66v210h66v-72h225q-19 108 -144 108h-147v66z" />
+<glyph unicode="&#x22fd;" d="M61 531h294q117 0 194 -82.5t77 -196.5t-78 -196.5t-196 -82.5h-291v66h291q75 0 134 53.5t72 126.5h-497v66h496q-13 73 -72 126.5t-134 53.5h-290v66zM616 619h-555v66h555v-66z" />
+<glyph unicode="&#x22fe;" horiz-adv-x="486" d="M407 547h-340v66h340v-66zM67 459h147q93 0 152 -59.5t59 -147.5t-58.5 -147.5t-150.5 -59.5h-149v66h146q124 0 145 108h-291v66h291q-20 108 -144 108h-147v66z" />
+<glyph unicode="&#x22ff;" horiz-adv-x="560" d="M487 0h-414v662h414v-50h-348v-256h336v-50h-336v-256h348v-50z" />
+<glyph unicode="&#x2300;" horiz-adv-x="606" d="M581 487l-91 -90q50 -64 50 -145q0 -98 -68.5 -168t-166.5 -70q-85 0 -149 52l-53 -52h-78l92 91q-50 66 -50 147q0 98 70 166.5t168 68.5q83 0 146 -51l52 51h78zM165 152l239 237q-44 32 -99 32q-71 0 -121.5 -49.5t-50.5 -119.5q0 -56 32 -100zM442 350l-239 -237 q47 -33 102 -33q70 0 119.5 50.5t49.5 121.5q0 54 -32 98z" />
+<glyph unicode="&#x2302;" horiz-adv-x="926" d="M871 0h-816v408l408 366l408 -366v-408zM805 66v316l-342 300l-342 -300v-316h684z" />
+<glyph unicode="&#x2305;" horiz-adv-x="620" d="M572 511h-524v66h524v-66zM572 0h-72l-189 374h-2l-189 -374h-72l230 457h65z" />
+<glyph unicode="&#x2306;" horiz-adv-x="620" d="M572 511h-524v66h524v-66zM572 0h-72l-189 374h-2l-189 -374h-72l230 457h65zM572 662h-524v66h524v-66z" />
+<glyph unicode="&#x2308;" horiz-adv-x="469" d="M447 680h-109q-47 0 -65.5 -22.5t-18.5 -72.5v-798h-66v926h259v-33z" />
+<glyph unicode="&#x2309;" horiz-adv-x="469" d="M286 -213h-66v798q0 50 -18.5 72.5t-65.5 22.5h-109v33h259v-926z" />
+<glyph unicode="&#x230a;" horiz-adv-x="469" d="M447 -213h-259v926h66v-798q0 -50 18.5 -72.5t65.5 -22.5h109v-33z" />
+<glyph unicode="&#x230b;" horiz-adv-x="469" d="M286 -213h-259v33h109q47 0 65.5 22.5t18.5 72.5v798h66v-926z" />
+<glyph unicode="&#x230c;" horiz-adv-x="463" d="M118 100v66h294v-66h-294v-315h-66v315h66z" />
+<glyph unicode="&#x230d;" horiz-adv-x="463" d="M346 100h66v-315h-66v315h-294v66h294v-66z" />
+<glyph unicode="&#x230e;" horiz-adv-x="463" d="M118 561h-66v315h66v-315zM412 495h-294v66h294v-66z" />
+<glyph unicode="&#x230f;" horiz-adv-x="463" d="M412 561h-66v315h66v-315zM346 495h-294v66h294v-66z" />
+<glyph unicode="&#x2310;" horiz-adv-x="600" d="M552 327h-438v-212h-66v278h504v-66z" />
+<glyph unicode="&#x2311;" horiz-adv-x="523" d="M449 65q-77 37 -187 37q-112 0 -187 -37q37 75 37 187q0 110 -37 187q78 -38 187 -38q108 0 187 38q-38 -79 -38 -187q0 -109 38 -187zM394 120q-23 44 -23 132t23 132q-44 -23 -132 -23t-132 23q22 -44 22 -132t-22 -132q44 22 132 22t132 -22z" />
+<glyph unicode="&#x2312;" horiz-adv-x="762" d="M712 0h-66q0 110 -78 187.5t-187 77.5t-187 -77.5t-78 -187.5h-66q0 137 97 234t234 97t234 -97t97 -234z" />
+<glyph unicode="&#x2313;" horiz-adv-x="762" d="M712 0h-662q0 137 97 234t234 97t234 -97t97 -234zM124 66h513q-22 86 -93.5 142.5t-162.5 56.5t-163 -56.5t-94 -142.5z" />
+<glyph unicode="&#x2315;" horiz-adv-x="847" d="M26 -142l183 183q-75 91 -75 210q0 137 97 234t234 97t234 -97t97 -234t-97 -234t-234 -97q-119 0 -211 76l2 -2l-183 -183zM731 252q0 110 -77.5 187.5t-187.5 77.5t-187.5 -77.5t-77.5 -187.5t77.5 -187.5t187.5 -77.5t187.5 77.5t77.5 187.5z" />
+<glyph unicode="&#x2316;" horiz-adv-x="1100" d="M1047 218h-168q-12 -116 -96 -200t-199 -96v-168h-66v168q-116 12 -200.5 96.5t-96.5 199.5h-168v66h167q12 116 97 200.5t201 95.5v168h66v-168q116 -11 200 -95.5t95 -200.5h168v-66zM584 284h229q-11 88 -76 153t-153 77v-230zM518 284v230q-89 -12 -154.5 -77 t-76.5 -153h231zM812 218h-228v-230q87 11 151.5 76.5t76.5 153.5zM518 -12v230h-231q12 -88 77.5 -153.5t153.5 -76.5z" />
+<glyph unicode="&#x2317;" horiz-adv-x="1100" d="M1047 7h-252v-252h-66v252h-358v-252h-66v252h-252v66h252v358h-252v66h252v252h66v-252h358v252h66v-252h252v-66h-252v-358h252v-66zM729 73v358h-358v-358h358z" />
+<glyph unicode="&#x2318;" horiz-adv-x="926" d="M597 184h108q71 0 118.5 -49t47.5 -121q0 -73 -48.5 -121.5t-121.5 -48.5q-72 0 -121 47.5t-49 118.5v108h-136v-108q0 -71 -49 -118.5t-121 -47.5q-73 0 -121.5 48.5t-48.5 121.5q0 72 47.5 121t118.5 49h108v138h-108q-71 0 -118.5 49t-47.5 121q0 73 48.5 121.5 t121.5 48.5t121.5 -48.5t48.5 -121.5v-104h136v109q0 71 49 118t121 47q73 0 121.5 -48.5t48.5 -121.5q0 -72 -47.5 -121t-118.5 -49h-108v-138zM597 388h108q43 0 71.5 30t28.5 74q0 45 -29.5 74.5t-74.5 29.5q-44 0 -74 -29t-30 -75v-104zM329 388v104q0 45 -29.5 74.5 t-74.5 29.5t-74.5 -29.5t-29.5 -74.5q0 -44 28.5 -74t71.5 -30h108zM531 184v138h-136v-138h136zM597 118v-108q0 -43 30 -71.5t74 -28.5q45 0 74.5 29.5t29.5 74.5q0 44 -28.5 74t-71.5 30h-108zM329 10v108h-108q-43 0 -71.5 -30t-28.5 -74q0 -45 29.5 -74.5t74.5 -29.5 q44 0 74 28.5t30 71.5z" />
+<glyph unicode="&#x2319;" horiz-adv-x="600" d="M552 115h-504v278h66v-212h438v-66z" />
+<glyph unicode="&#x231a;" d="M471 671v-122q68 -36 109.5 -102.5t41.5 -145.5q0 -80 -41.5 -146.5t-109.5 -101.5v-122h-256v122q-68 35 -109.5 101.5t-41.5 146.5t41 146t110 102v122h256zM421 569v52h-156v-52h156zM555 274h-50v50h50q-9 86 -77 141l-110 -191h-141v50h115l96 167q-31 16 -70 21 v-50h-50v50q-74 -8 -127 -61t-61 -127h50v-50h-50q9 -73 61.5 -125.5t126.5 -61.5v50h50v-50q73 9 125.5 61.5t61.5 125.5zM421 -19v52h-156v-52h156z" />
+<glyph unicode="&#x231c;" horiz-adv-x="463" d="M411 596h-294v-315h-66v381h360v-66z" />
+<glyph unicode="&#x231d;" horiz-adv-x="463" d="M411 281h-66v315h-294v66h360v-381z" />
+<glyph unicode="&#x231e;" horiz-adv-x="463" d="M411 -217h-360v381h66v-315h294v-66z" />
+<glyph unicode="&#x231f;" horiz-adv-x="463" d="M412 -217h-360v66h294v315h66v-381z" />
+<glyph unicode="&#x2322;" horiz-adv-x="1019" d="M965 162l-10 -15q-173 128 -445 128q-144 0 -250 -31t-195 -97l-11 16q203 197 456 197q98 0 222.5 -51.5t232.5 -146.5z" />
+<glyph unicode="&#x2323;" horiz-adv-x="1019" d="M955 360l10 -15q-108 -95 -232.5 -146.5t-222.5 -51.5q-253 0 -456 197l11 16q89 -66 195 -97t250 -31q272 0 445 128z" />
+<glyph unicode="&#x2329;" horiz-adv-x="400" d="M335 713l-192 -462l191 -464h-52l-205 454v20l206 452h52z" />
+<glyph unicode="&#x232a;" horiz-adv-x="400" d="M323 240l-206 -453h-52l192 463l-191 463h52l205 -453v-20z" />
+<glyph unicode="&#x232c;" horiz-adv-x="926" d="M744 376l-33 -57l-314 181l33 58zM744 132l-314 -182l-33 58l314 181zM284 72h-66v363h66v-363zM843 34l-380 -220l-380 220v438l380 220l380 -220v-438zM777 72v362l-314 182l-314 -182v-362l314 -182z" />
+<glyph unicode="&#x232d;" horiz-adv-x="986" d="M931 559l-374 -647l-57 33l51 89q-30 -8 -58 -8q-77 0 -138 48t-81 121l-162 -283l-57 33l374 647l57 -33l-53 -90q23 8 60 8q77 0 137 -47t80 -122l164 284zM653 253q0 64 -47.5 111t-112.5 47q-64 0 -111.5 -47t-47.5 -111q0 -65 47.5 -112.5t111.5 -47.5 q65 0 112.5 47.5t47.5 112.5z" />
+<glyph unicode="&#x232e;" horiz-adv-x="624" d="M87 10l81 80q-44 60 -44 135q0 93 66 159t159 66t159 -66.5t66 -160.5t-65 -158.5t-160 -64.5q-78 0 -138 47l-80 -81q-7 -7 -7 -18q0 -19 31 -19q41 0 106 -15l-1 -28q-60 5 -106 5q-96 0 -165 -31l-7 7q31 74 31 168q0 44 -5 104l28 1q15 -84 15 -104q0 -35 21 -35 q6 0 15 9zM337 259h167q-12 53 -56 89t-99 36q-65 0 -112 -47t-47 -112q0 -49 26 -87zM504 193h-147l-98 -98q42 -29 90 -29q56 0 100 36.5t55 90.5z" />
+<glyph unicode="&#x2332;" horiz-adv-x="889" d="M809 242l-729 -298v618l729 -298v-22zM562 286l-416 172v-172h416zM562 220h-416v-172z" />
+<glyph unicode="&#x2336;" horiz-adv-x="926" d="M841 -156h-756v50h344v807h-344v50h756l-1 -50h-345v-807h346v-50z" />
+<glyph unicode="&#x233d;" horiz-adv-x="910" d="M488 683v-61q142 -13 240 -119t98 -251t-98 -251t-240 -119v-61h-66v61q-142 13 -240 119t-98 251t98 251t240 119v61h66zM488 555v-606q115 12 193.5 99t78.5 204t-78.5 204t-193.5 99zM422 -51v606q-115 -12 -193.5 -99t-78.5 -204t78.5 -204t193.5 -99z" />
+<glyph unicode="&#x233f;" horiz-adv-x="683" d="M623 233h-263l-149 -409h-57l148 409h-242v66h266l147 404h59l-148 -404h239v-66z" />
+<glyph unicode="&#x2340;" horiz-adv-x="683" d="M623 233h-242l148 -409h-57l-149 409h-263v66h239l-148 404h59l147 -404h266v-66z" />
+<glyph unicode="&#x2353;" horiz-adv-x="794" d="M739 -176h-684v927h684v-927zM673 146v539h-552v-539l276 478zM673 -110v117l-276 478l-276 -478v-117h552z" />
+<glyph unicode="&#x2370;" horiz-adv-x="794" d="M400 117h-17q2 72 44 177q51 126 51 187q0 51 -31.5 84.5t-77.5 33.5q-36 0 -65 -19t-29 -43q0 -19 19 -38.5t19 -35.5q0 -19 -11 -31t-30 -12q-21 0 -34.5 18t-13.5 48q0 62 46 102.5t118 40.5q75 0 128.5 -43.5t53.5 -114.5q0 -45 -20 -82.5t-85 -114.5 q-49 -59 -65 -157zM446 -2q0 -22 -15 -37.5t-37 -15.5q-25 0 -39.5 15.5t-14.5 37.5q0 23 15.5 38t38.5 15q21 0 36.5 -16t15.5 -37zM739 -176h-684v927h684v-927zM673 -110v795h-552v-795h552z" />
+<glyph unicode="&#x237c;" horiz-adv-x="871" d="M820 0h-504l-113 -100q-8 -6 -8 -15q0 -11 6.5 -18t17.5 -7q22 0 46 0.5t36 0.5q18 0 41 -3l14 -2v-32q-74 0 -112 -1.5t-90.5 -11.5t-96.5 -31l-7 8q16 45 22 98q4 35 4 79q0 60 -8 126l28 2q10 -37 16 -125q2 -33 20 -33q11 0 23 11l81 71v163l-158 96l158 130v178h66 v-124l150 124l47 -46l-197 -161v-160l153 -94l-65 -57h430v-66zM236 257v66l-46 -37zM346 114l-44 26v-65z" />
+<glyph unicode="&#x2393;" horiz-adv-x="913" d="M841 120h-213v66h213v-66zM841 320h-756v66h756v-66zM569 120h-213v66h213v-66zM298 120h-213v66h213v-66z" />
+<glyph unicode="&#x2394;" horiz-adv-x="926" d="M902 253l-220 -380h-438l-220 380l220 380h438zM826 253l-182 314h-362l-182 -314l182 -314h362z" />
+<glyph unicode="&#x23af;" horiz-adv-x="315" d="M315 220h-315v66h315v-66z" />
+<glyph unicode="&#x23b4;" horiz-adv-x="926" d="M871 574h-66v126h-684v-126h-66v192h816v-192z" />
+<glyph unicode="&#x23b5;" horiz-adv-x="926" d="M871 -83h-816v192h66v-126h684v126h66v-192z" />
+<glyph unicode="&#x23b6;" horiz-adv-x="926" d="M871 303h-816v192h66v-126h684v126h66v-192zM871 11h-66v126h-684v-126h-66v192h816v-192z" />
+<glyph unicode="&#x23ce;" horiz-adv-x="926" d="M856 731v-486q0 -128 -87 -222t-232 -94h-101v-144l-20 -10q-52 52 -111 98t-139 102l-116 82v10q38 29 115.5 82.5t138 100.5t112.5 99l20 -10v-144h27q80 0 103.5 29.5t23.5 103.5v403h266zM806 265v416h-166v-348q0 -26 -0.5 -39.5t-4 -37t-10.5 -36.5t-20.5 -29.5 t-33 -25t-49.5 -14.5t-69 -6h-67v105l-165 -115q-58 -40 -58 -73q0 -18 14.5 -33.5t43.5 -38.5l165 -128v117h145q122 0 198.5 76.5t76.5 209.5z" />
+<glyph unicode="&#x23d0;" horiz-adv-x="511" d="M288 101h-66v304h66v-304z" />
+<glyph unicode="&#x23dc;" horiz-adv-x="556" d="M566 -152h-28q-53 73 -120.5 112.5t-139.5 39.5q-151 0 -260 -152h-28q42 101 122.5 154t165.5 53q71 0 155.5 -54t132.5 -153z" />
+<glyph unicode="&#x23dd;" horiz-adv-x="556" d="M538 771h28q-48 -99 -132.5 -153t-155.5 -54q-85 0 -165.5 53t-122.5 154h28q109 -152 260 -152q72 0 139.5 39.5t120.5 112.5z" />
+<glyph unicode="&#x23de;" horiz-adv-x="556" d="M566 -88h-25q-19 91 -77 91q-8 0 -27.5 -1.5t-29.5 -1.5h-36q-34 0 -56.5 15t-35.5 56h-2q-23 -71 -92 -71h-37q-9 0 -29.5 1.5t-27.5 1.5q-34 0 -50.5 -24t-25.5 -67h-25q22 143 142 143h69q61 0 67 62h19q7 -62 68 -62h69q119 0 142 -143z" />
+<glyph unicode="&#x23df;" horiz-adv-x="556" d="M541 769h25q-23 -143 -142 -143h-69q-61 0 -68 -62h-19q-6 62 -67 62h-69q-120 0 -142 143h25q9 -43 25.5 -67t50.5 -24q7 0 27.5 1.5t29.5 1.5h37q69 0 92 -71h2q13 41 35.5 56t56.5 15h36q10 0 29.5 -1.5t27.5 -1.5q58 0 77 91z" />
+<glyph unicode="&#x23e0;" horiz-adv-x="926" d="M929 -212l-240 212h-452l-240 -211v52l217 225h498l217 -226v-52z" />
+<glyph unicode="&#x23e1;" horiz-adv-x="926" d="M929 789l-217 -225h-498l-217 226v52l240 -212h452l240 211v-52z" />
+<glyph unicode="&#x23e2;" horiz-adv-x="1144" d="M1090 -53h-1036l70 611h652zM986 13l-246 479h-557l-56 -479h859z" />
+<glyph unicode="&#x23e3;" horiz-adv-x="910" d="M828 36l-373 -214l-373 214v430l373 214l373 -214v-430zM762 73v353l-307 178l-307 -178v-353l308 -175zM679 253q0 -92 -65.5 -157.5t-158.5 -65.5t-158.5 65.5t-65.5 157.5q0 93 65.5 160t158.5 67t158.5 -67t65.5 -160zM627 253q0 71 -52.5 123t-119.5 52 q-72 0 -122 -51.5t-50 -123.5t49.5 -121.5t122.5 -49.5q67 0 119.5 51t52.5 120z" />
+<glyph unicode="&#x23e4;" horiz-adv-x="1094" d="M1047 220h-1000v66h1000v-66z" />
+<glyph unicode="&#x23e5;" horiz-adv-x="1018" d="M995 527l-312 -547h-660l313 547h659zM883 461h-511l-235 -415h509z" />
+<glyph unicode="&#x23e6;" horiz-adv-x="926" d="M464 286h407q-5 -68 -72.5 -141t-137.5 -73q-28 0 -54 11t-54.5 37t-45.5 44t-49 56h-403q4 76 69 145t137 69q28 0 54 -11t54.5 -37t45.5 -44t49 -56zM815 220h-293q79 -82 150 -82q34 0 74 23.5t69 58.5zM109 286h291q-79 81 -149 82q-35 0 -74.5 -23.5t-67.5 -58.5z " />
+<glyph unicode="&#x23e7;" horiz-adv-x="798" d="M733 383l-243 -107q2 -12 2 -17q0 -31 -20 -54l141 -277l-40 -19l-136 271q-11 -5 -28 -5q-20 0 -35 7l-141 -279l-39 19l146 290q-14 20 -14 47q0 39 33 65l-56 274l42 8l54 -266h9q39 0 62 -26l247 108zM306 377l-27 -98l-71 81l30 1l-38 203l42 9l38 -203z" />
+<glyph unicode="&#x2423;" horiz-adv-x="500" d="M460 -120h-420v136h30v-76h360v76h30v-136z" />
+<glyph unicode="&#x2460;" horiz-adv-x="684" d="M435 141h-175v20q34 1 46.5 9.5t12.5 27.5v240q0 20 -16 20q-15 0 -29 -5l-18 -7v20l113 51l6 -2v-327q0 -15 12.5 -21t47.5 -6v-20zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5z M642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2461;" horiz-adv-x="684" d="M490 227l-41 -86h-247v19l112 95q83 71 83 138q0 33 -23.5 51.5t-63.5 18.5q-33 0 -51 -17t-39 -60l-19 7q28 124 135 124q53 0 85 -29.5t32 -73.5q0 -72 -80 -141l-92 -78h129q20 0 32.5 8t27.5 31zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244 q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2462;" horiz-adv-x="684" d="M240 411l-20 6q37 100 129 100q45 0 72 -22.5t27 -58.5q0 -44 -48 -74q70 -26 70 -96q0 -65 -53 -98.5t-124 -33.5q-72 0 -72 38q0 12 8 19.5t20 7.5t39 -16t53 -16q34 0 58 21.5t24 53.5q0 54 -65 68q-20 4 -66 4v21q36 10 55 18q49 24 49 69q0 49 -66 49 q-30 0 -50.5 -14.5t-39.5 -45.5zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2463;" horiz-adv-x="684" d="M464 228h-63v-87h-56v87h-178v45l201 244h33v-241h63v-48zM345 276v171l-142 -171h142zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89 t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2464;" horiz-adv-x="684" d="M464 522l-25 -50q-6 -12 -21 -12h-120l-20 -33q89 -16 132.5 -46t43.5 -100t-48 -108.5t-122 -38.5q-37 0 -59 10t-22 28q0 30 30 30q19 0 47 -18q23 -16 44 -16q33 0 58.5 26.5t25.5 59.5q0 56 -52 84.5t-123 28.5q-11 0 -11 10q0 3 3 9l70 131h122q17 0 29 15zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2465;" horiz-adv-x="684" d="M452 517v-25q-154 -24 -182 -132q38 23 77 23q56 0 87.5 -32t31.5 -88t-38 -92.5t-94 -36.5q-66 0 -107 42.5t-41 107.5q0 93 73 161q41 36 82.5 51t110.5 21zM406 245q0 101 -81 101q-74 0 -74 -59t23 -91.5t67 -32.5q65 0 65 82zM684 330q0 -145 -99 -244.5t-242 -99.5 q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2466;" horiz-adv-x="684" d="M472 500l-136 -366h-46l124 327h-129q-27 0 -40.5 -8.5t-33.5 -36.5l-18 9l44 92h235v-17zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89 t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2467;" horiz-adv-x="684" d="M474 232q0 -44 -37 -71t-95 -27q-56 0 -90.5 22.5t-34.5 62.5q0 60 77 107q-43 32 -56.5 51.5t-13.5 48.5q0 41 34.5 66t89.5 25q47 0 77 -23t30 -56q0 -32 -16.5 -51.5t-58.5 -39.5q53 -32 73.5 -57t20.5 -58zM409 432q0 26 -18 41t-49 15t-50 -12.5t-19 -34.5t18 -39 t60 -39q32 17 45 32t13 37zM357 288l-36 21q-50 -34 -50 -79q0 -67 79 -67q30 0 49 12.5t19 35.5q0 42 -61 77zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5 t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2468;" horiz-adv-x="684" d="M229 134v25q147 22 184 133q-35 -28 -90 -28q-52 0 -83 32.5t-31 85.5q0 58 37.5 96.5t94.5 38.5q66 0 103.5 -47t37.5 -114q0 -99 -77 -159q-38 -30 -75 -42.5t-101 -20.5zM417 333v34q0 65 -20 93t-61 28q-33 0 -50 -25t-17 -63q0 -46 20.5 -72.5t55.5 -26.5q26 0 49 8 t23 24zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24b6;" horiz-adv-x="684" d="M544 141h-147v23q38 2 38 14q0 16 -9 33l-23 45h-148l-26 -55q-5 -12 -5 -20q0 -17 38 -17v-23h-116v23q25 3 36 17t36 71l120 272h9l144 -313q12 -26 22 -35t31 -12v-23zM389 293l-60 137h-1l-59 -137h120zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100 t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24b7;" horiz-adv-x="684" d="M170 517h170q78 0 118.5 -25.5t40.5 -72.5q0 -62 -57 -80q82 -26 82 -94q0 -47 -41.5 -75.5t-107.5 -28.5h-205v23q35 1 43 9t8 37v239q0 29 -7.5 36t-43.5 9v23zM291 354h54q45 0 64.5 15t19.5 47q0 67 -100 67h-25q-13 0 -13 -10v-119zM291 317v-124q0 -18 37 -18 q56 0 86 14t30 57q0 25 -10.5 40t-32.5 21.5t-39.5 8t-48.5 1.5h-22zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215 q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24b8;" horiz-adv-x="684" d="M527 226l17 -14q-64 -78 -182 -78q-93 0 -154.5 51.5t-61.5 140.5t63.5 143.5t152.5 54.5q42 0 89 -11q22 -6 33 -6q22 0 28 17h14l5 -137h-22q-11 47 -46.5 74.5t-85.5 27.5q-71 0 -112.5 -42.5t-41.5 -111.5q0 -78 42 -121t119 -43q42 0 73.5 12.5t69.5 42.5zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24b9;" horiz-adv-x="684" d="M138 517h168q239 0 239 -184q0 -90 -61 -141t-171 -51h-175v23q34 2 42.5 8.5t8.5 34.5v246q0 27 -8 33t-43 8v23zM259 468v-275q0 -18 34 -18q82 0 127.5 35t46.5 120q0 84 -49 118.5t-137 34.5q-16 0 -19 -2.5t-3 -12.5zM684 330q0 -145 -99 -244.5t-242 -99.5 q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24ba;" horiz-adv-x="684" d="M520 247l-31 -106h-327v23q34 1 42.5 8t8.5 35v246q0 26 -8.5 32.5t-42.5 8.5v23h323l4 -94h-22q-7 37 -23 48.5t-66 11.5h-76q-9 0 -12 -0.5t-5 -3t-2 -8.5v-117h83q38 0 48.5 8.5t15.5 40.5h22v-135h-22q-4 33 -14.5 41t-49.5 8h-83v-124q0 -18 32 -18h51q62 0 88 14 t46 58h20zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24bb;" horiz-adv-x="684" d="M509 423h-22q-8 38 -23.5 49t-68.5 11h-91q-14 0 -17.5 -2t-3.5 -10v-117h93q40 0 50.5 8t15.5 41h22v-135h-22q-4 34 -14.5 41.5t-51.5 7.5h-93v-115q0 -23 12.5 -29.5t53.5 -8.5v-23h-187v23q36 1 43.5 8.5t7.5 39.5v237q0 28 -7.5 35.5t-43.5 9.5v23h343zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24bc;" horiz-adv-x="684" d="M563 347v-23q-26 -2 -33.5 -8t-7.5 -28v-114q-51 -40 -161 -40q-95 0 -155 52.5t-60 140.5q0 87 63.5 142t153.5 55q23 0 73 -12q18 -5 29 -5q19 0 26 17h18l5 -128h-22q-11 38 -41 65q-31 28 -77 28q-63 0 -107 -40t-44 -115q0 -78 42.5 -120.5t118.5 -42.5q32 0 51 8 t19 19v83q0 27 -8.5 34t-42.5 9v23h160zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214 z" />
+<glyph unicode="&#x24bd;" horiz-adv-x="684" d="M538 141h-162v23q30 2 38 11.5t8 39.5v102h-154v-107q0 -26 8.5 -35t36.5 -11v-23h-160v23q30 2 37.5 10.5t7.5 39.5v234q0 28 -7.5 35.5t-37.5 10.5v23h161v-23q-29 -3 -37.5 -11t-8.5 -35v-94h154v94q0 28 -8 35.5t-38 10.5v23h162v-23q-30 -3 -38 -11t-8 -35v-239 q0 -26 8.5 -34t37.5 -11v-23zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24be;" horiz-adv-x="684" d="M436 141h-181v23q36 1 45.5 9t9.5 36v240q0 28 -8.5 35.5t-46.5 9.5v23h181v-23q-37 -2 -46.5 -10t-9.5 -35v-240q0 -27 10 -35.5t46 -9.5v-23zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5 t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24bf;" horiz-adv-x="684" d="M446 517v-23q-39 -3 -47.5 -10.5t-8.5 -35.5v-198q0 -116 -112 -116q-30 0 -48 12t-18 35q0 16 9 25t24 9q27 0 33 -31q3 -16 16 -16q26 0 26 32v250q0 28 -9 35t-46 9v23h181zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246 t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c0;" horiz-adv-x="684" d="M557 141h-181v23q38 4 38 14q0 6 -29 35l-102 104l-14 -12v-96q0 -28 10.5 -36t45.5 -9v-23h-181v23q38 1 46.5 10t8.5 42v237q0 25 -9.5 32t-45.5 9v23h181v-23q-36 -2 -46 -9.5t-10 -34.5v-105l98 88q45 40 45 49q0 10 -22 11l-16 1v23h151v-23q-30 -2 -45.5 -9.5 t-44.5 -33.5l-105 -92l137 -138q37 -37 52.5 -47t37.5 -10v-23zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5 t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c1;" horiz-adv-x="684" d="M497 249l-26 -108h-292v23q34 1 44.5 8.5t10.5 34.5v251q0 23 -11.5 28.5t-43.5 7.5v23h181v-23q-24 -2 -33 -4t-16 -10t-7 -25v-253q0 -15 9 -20.5t34 -5.5h33q57 0 78 30q12 18 22 43h17zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244 q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c2;" horiz-adv-x="684" d="M569 141h-164v20v3q30 2 38.5 11.5t8.5 39.5v233h-2l-130 -307h-12l-108 283h-1v-193q0 -41 8.5 -53t38.5 -14v-23h-125v23q32 3 39 13.5t7 53.5v217q0 29 -7 36.5t-38 9.5v23h104l106 -277l116 277h120v-23q-28 -1 -37 -9.5t-9 -35.5v-240q0 -25 9.5 -34t37.5 -11v-23z M684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c3;" horiz-adv-x="684" d="M526 517v-23q-25 -3 -33 -9q-14 -12 -14 -59v-292h-15l-219 297v-206q0 -35 8 -46t37 -16v-23h-120v23q30 4 36.5 14.5t6.5 51.5v238q-2 3 -5 7t-4.5 5.5t-3.5 4.5t-4 4t-4.5 2.5t-5.5 2t-7 1t-9 0.5v23h85l192 -263v177q0 38 -9 50q-8 10 -39 13v23h127zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c4;" horiz-adv-x="684" d="M548 333q0 -86 -57 -139t-146 -53q-90 0 -146.5 53.5t-56.5 139.5q0 85 56.5 137.5t146.5 52.5q89 0 146 -54t57 -137zM471 336q0 70 -32.5 113t-94.5 43q-63 0 -94 -44.5t-31 -114.5q0 -71 31.5 -115.5t95.5 -44.5q65 0 95 44.5t30 118.5zM684 330q0 -145 -99 -244.5 t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c5;" horiz-adv-x="684" d="M172 517h165q150 0 150 -106q0 -61 -43 -87.5t-110 -26.5q-24 0 -37 2v-93q0 -26 11 -33.5t45 -8.5v-23h-181v23q19 1 27 2t16 5.5t10 13t2 23.5v248q0 13 -2.5 20.5t-11 11t-15.5 4.5t-26 2v23zM297 469v-133q11 -2 32 -2q82 0 82 74q0 42 -20.5 58.5t-75.5 16.5 q-18 0 -18 -14zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c6;" horiz-adv-x="684" d="M497 78h-29q-74 0 -115.5 16t-70.5 63q-62 15 -101 60.5t-39 114.5q0 89 57.5 140.5t144.5 51.5q88 0 146 -52.5t58 -139.5q0 -76 -46 -124t-119 -56q34 -47 114 -51v-23zM471 334q0 72 -32.5 115t-94.5 43t-93.5 -45t-31.5 -114q0 -70 31.5 -111t95.5 -41q125 0 125 153 zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c7;" horiz-adv-x="684" d="M549 141h-93l-126 166h-33v-98q0 -27 8.5 -35t40.5 -10v-23h-174v23q19 1 26 2t15.5 5t11 12.5t2.5 24.5v248q0 17 -7 25.5t-15.5 10t-32.5 2.5v23h165q150 0 150 -106q0 -79 -89 -96l99 -127q15 -20 52 -24v-23zM297 469v-124q8 -1 24 -1q47 0 68.5 13.5t21.5 52.5 q0 35 -17.5 54t-71.5 19q-15 0 -20 -2t-5 -12zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88 t86 214z" />
+<glyph unicode="&#x24c8;" horiz-adv-x="684" d="M475 395h-23q-8 35 -26 54q-37 39 -86 39q-57 0 -57 -45q0 -21 24.5 -39t81.5 -46q101 -50 101 -115q0 -49 -37.5 -79t-94.5 -30q-35 0 -70 14q-14 5 -29 5t-15 -19h-21l-21 130h23q21 -50 49.5 -73.5t73.5 -23.5q31 0 49.5 16t18.5 43q0 40 -117 96q-37 18 -58 45 t-21 55q0 47 31 74.5t80 27.5q29 0 60 -12q17 -6 29 -6q16 0 20 18h18zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215 q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c9;" horiz-adv-x="684" d="M520 411h-22q-9 45 -27 58.5t-66 13.5h-25v-274q0 -28 10.5 -36t45.5 -9v-23h-181v23q37 1 46 9.5t9 40.5v269h-29q-48 0 -65 -13.5t-25 -58.5h-21l4 106h341zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100 q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24ca;" horiz-adv-x="684" d="M526 517v-23q-31 -4 -39 -16t-8 -48v-138q0 -158 -136 -158q-67 0 -103 38.5t-36 112.5v166q0 25 -8 32.5t-38 10.5v23h162v-23q-30 -4 -38 -11.5t-8 -33.5v-171q0 -57 14 -82t67 -25q52 0 72 29.5t20 84.5v144q0 39 -8.5 51t-38.5 14v23h126zM684 330q0 -145 -99 -244.5 t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24cb;" horiz-adv-x="684" d="M544 517v-23q-19 -1 -31 -10t-23 -35l-130 -308h-8l-143 297q-18 36 -29 45.5t-34 10.5v23h156v-23l-18 -1q-25 -1 -25 -11t22 -54l90 -183l83 197q11 25 11 36q0 13 -41 16v23h120zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246 t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24cc;" horiz-adv-x="684" d="M569 517v-23q-21 -5 -28 -10.5t-13 -23.5l-100 -319h-6l-78 229h-1l-73 -229h-6l-94 292q-11 37 -20.5 48.5t-28.5 12.5v23h118v-23q-30 -1 -30 -11q0 -2 6 -22l66 -203l50 150l-13 38q-11 32 -19 39.5t-30 8.5v23h129v-23q-14 -1 -20.5 -1.5t-11 -4t-4.5 -9.5 q0 -5 7 -26l68 -196h1l57 182q9 27 9 36q0 18 -34 19v23h99zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5 t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24cd;" horiz-adv-x="684" d="M520 141h-150v23l14 1q24 2 24 10q0 10 -25 50l-48 75l-59 -80q-26 -36 -26 -44t38 -12v-23h-118v23q21 2 33 12t40 48l75 102l-51 81q-34 54 -49.5 68.5t-41.5 18.5v23h153v-23h-15q-23 0 -23 -11q0 -9 29 -54l35 -54l55 75q19 27 19 32q0 11 -33 12v23h120v-23 q-25 -2 -39.5 -12t-37.5 -41l-68 -92l93 -147q13 -20 24 -27.5t32 -10.5v-23zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215 q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24ce;" horiz-adv-x="684" d="M520 517v-23q-24 -2 -37 -13.5t-34 -45.5l-69 -115v-114q0 -27 11.5 -34t44.5 -8v-23h-181v23q36 2 45.5 9t9.5 38v107l-57 92q-33 53 -48 68t-35 16v23h145v-23l-13 -1q-24 -1 -24 -8q0 -6 9 -22l75 -119l72 120q7 11 7 19q-1 10 -33 11v23h112zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24cf;" horiz-adv-x="684" d="M520 251l-16 -110h-334v19l247 323h-111q-53 0 -72.5 -13t-30.5 -60h-20l14 107h311v-19l-247 -323h135q48 0 69 15t35 61h20zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330 q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d0;" horiz-adv-x="684" d="M479 234v-21q-25 -27 -60 -27q-37 0 -44 39q-44 -39 -94 -39q-31 0 -50 16t-19 45q0 43 45 69q26 15 117 43v24q0 42 -49 42q-19 0 -32 -5.5t-13 -13.5q0 -4 2.5 -11t2.5 -12q0 -12 -8.5 -20.5t-23.5 -8.5q-13 0 -21 8.5t-8 22.5q0 33 33.5 49.5t75.5 16.5q49 0 73 -20.5 t24 -69.5v-108q0 -29 20 -29q13 0 29 10zM374 265v69q-56 -16 -81 -33q-22 -15 -22 -37q0 -35 44 -35q21 0 40 10t19 26zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330 q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d1;" horiz-adv-x="684" d="M293 523v-170q26 45 86 45q53 0 85 -35.5t32 -90.5q0 -63 -43 -100.5t-109 -37.5q-31 0 -69 10t-38 32v280q0 16 -5.5 20t-25.5 4q-9 0 -12 -1v20q53 12 95 25zM293 315v-130q0 -10 17 -16.5t42 -6.5q37 0 61.5 25t24.5 61q0 44 -20.5 73.5t-61.5 29.5q-24 0 -43.5 -11 t-19.5 -25zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d2;" horiz-adv-x="684" d="M459 286l16 -8q-24 -46 -55.5 -69t-79.5 -23q-56 0 -91.5 35t-35.5 90q0 61 43.5 100.5t102.5 39.5q41 0 71 -18.5t30 -43.5q0 -12 -8.5 -20t-21.5 -8q-26 0 -39 40q-6 22 -36 22q-38 0 -60 -24t-22 -63q0 -44 25 -71.5t69 -27.5q28 0 48.5 11t43.5 38zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d3;" horiz-adv-x="684" d="M497 162l-96 -28l-4 3v33q-32 -36 -85 -36q-54 0 -86 33.5t-32 89.5q0 60 39 100.5t96 40.5q42 0 67 -24h1v84q0 13 -5.5 17.5t-22.5 4.5q-11 0 -17 -1v20q55 12 96 25l5 -2v-315q0 -15 5.5 -20.5t21.5 -5.5q8 0 17 1v-20zM397 205v117q0 19 -20 33.5t-46 14.5 q-36 0 -57.5 -26t-21.5 -69q0 -48 22 -74t63 -26q24 0 42 7.5t18 22.5zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215 q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d4;" horiz-adv-x="684" d="M465 286l16 -8q-24 -46 -55.5 -69t-79.5 -23q-59 0 -96 35t-37 93q0 59 40.5 98t103.5 39q52 0 82 -29.5t32 -82.5h-198q0 -45 27 -73.5t73 -28.5q51 0 92 49zM275 370h125q-7 48 -61 48q-52 0 -64 -48zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100 t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d5;" horiz-adv-x="684" d="M238 394h51q2 58 29.5 94t85.5 36q30 0 51 -11.5t21 -29.5q0 -30 -30 -30q-13 0 -32 23q-1 2 -4 5t-4.5 5t-4.5 4.5t-6 4t-6.5 2.5t-7.5 1q-36 0 -36 -44v-60h80v-31h-80v-159q0 -27 11 -34t50 -9v-20h-169v20q34 1 43 9t9 34v159h-51v31zM684 330q0 -145 -99 -244.5 t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d6;" horiz-adv-x="684" d="M493 473h-51q8 -19 8 -42q0 -42 -31.5 -68t-73.5 -26q-6 0 -20 1.5t-17 1.5q-13 0 -22 -7t-9 -15q0 -11 42 -13l85 -4q39 -1 61.5 -18.5t22.5 -46.5q0 -35 -32 -59.5t-69.5 -33.5t-73.5 -9q-117 0 -117 61q0 36 52 69q-22 10 -22 34q0 29 49 52q-51 21 -51 77 q0 41 32.5 69t79.5 28q37 0 67 -14q13 -6 38 -6h52v-31zM397 409q0 33 -17.5 59.5t-50.5 26.5q-22 0 -35.5 -12.5t-13.5 -34.5q0 -37 19.5 -60t49.5 -23q22 0 35 12t13 32zM462 227q0 12 -16.5 16.5t-60.5 4.5q-76 0 -108 8q-31 -24 -31 -42q0 -16 25.5 -25t69.5 -9 q56 0 88.5 12.5t32.5 34.5zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d7;" horiz-adv-x="684" d="M501 141h-140v20q29 3 37 10.5t8 31.5v104q0 50 -47 50q-39 0 -72 -32v-122q0 -25 7.5 -32t36.5 -10v-20h-142v20q29 4 35.5 10.5t6.5 31.5v256q0 13 -6 17.5t-24 4.5q-2 0 -6 -1t-5 -1v21q61 12 92 24l5 -3v-168q42 46 95 46q80 0 80 -91v-105q0 -24 6.5 -30.5 t32.5 -11.5v-20zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d8;" horiz-adv-x="684" d="M378 542q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5zM423 186h-156v20q34 2 42.5 8.5t8.5 34.5v124q0 16 -4.5 22t-15.5 6q-17 0 -29 -2v21l100 30l5 -3v-197q0 -27 8 -35t41 -9v-20zM684 330q0 -145 -99 -244.5 t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d9;" horiz-adv-x="684" d="M406 559q0 -15 -10.5 -25.5t-25.5 -10.5q-16 0 -26 10.5t-10 25.5q0 16 10.5 26t26.5 10q15 0 25 -10t10 -26zM402 464v-255q0 -130 -112 -130q-28 0 -45.5 10.5t-17.5 27.5q0 12 7.5 20t20.5 8q14 0 32 -17t28 -17q15 0 22 9.5t8 21.5t1 41v207q0 28 -21 28q-7 0 -30 -3 v22q30 7 103 31zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24da;" horiz-adv-x="684" d="M507 141h-142v20h13q10 0 10 5q0 2 -4 7l-96 104v-88q0 -16 9 -21.5t34 -6.5v-20h-148v20q32 1 40.5 8t8.5 25v261q0 16 -5.5 21t-21.5 5q-14 0 -22 -1v20q57 8 100 24l5 -3v-226l87 62q13 10 13 13q0 5 -30 5v20h134v-20q-33 0 -60.5 -11.5t-79.5 -52.5l-15 -12l95 -101 q33 -34 75 -37v-20zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24db;" horiz-adv-x="684" d="M422 141h-154v20q29 2 39.5 10t10.5 26v256q0 16 -5.5 22t-19.5 6q-13 0 -23 -1v20q49 9 99 24l5 -4v-326q0 -18 9 -25t39 -8v-20zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5z M642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24dc;" horiz-adv-x="684" d="M598 186h-144v20q27 3 34 9t7 25v113q0 29 -11.5 42t-37.5 13q-47 0 -72 -31v-134q0 -22 10 -29.5t39 -7.5v-20h-150v20q30 2 37.5 7t7.5 25v115q0 55 -43 55q-52 0 -79 -29v-149q0 -13 9 -18t35 -6v-20h-146v20q27 0 36.5 7t9.5 26v134q0 17 -4.5 23.5t-17.5 6.5t-22 -1 v20q57 14 91 29l7 -2v-41q50 43 102 43q50 0 71 -46q52 46 107 46q41 0 59 -26t18 -79v-112q0 -26 28 -27l19 -1v-20zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330 q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24dd;" horiz-adv-x="684" d="M501 186h-138v20q24 1 32.5 10.5t8.5 33.5v109q0 49 -47 49q-29 0 -68 -30v-147q0 -12 9 -18t35 -7v-20h-142v20q25 1 33.5 9t8.5 28v131q0 17 -4.5 23t-17.5 6q-6 0 -13 -0.5t-8 -0.5v20q45 11 91 29l7 -2v-42q47 44 94 44q78 0 78 -91v-122q0 -18 8 -24t33 -8v-20z M684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24de;" horiz-adv-x="684" d="M489 321q0 -60 -40 -97.5t-106 -37.5q-61 0 -102 37.5t-41 95.5q0 60 40.5 96t107.5 36q61 0 101 -36t40 -94zM429 307q0 48 -23 82t-70 34q-34 0 -55 -21t-21 -58q0 -51 24 -90.5t70 -39.5q35 0 55 24.5t20 68.5zM684 330q0 -145 -99 -244.5t-242 -99.5 q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24df;" horiz-adv-x="684" d="M294 523v-42q40 43 96 43q48 0 79 -34.5t31 -88.5q0 -63 -39.5 -104.5t-98.5 -41.5q-39 0 -68 23v-80q0 -23 11 -29.5t48 -7.5v-20h-162v20q30 2 38.5 8t8.5 24v258q0 16 -5 21t-21 5q-7 0 -17 -2v21q49 12 93 28zM294 447v-129q19 -32 69 -32q36 0 57.5 25t21.5 67 q0 46 -22 73t-58 27q-46 0 -68 -31zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z " />
+<glyph unicode="&#x24e0;" horiz-adv-x="684" d="M498 141h-156v20q36 1 47.5 8t11.5 27v99q-46 -41 -101 -41q-47 0 -78 34.5t-31 89.5q0 63 42 104.5t105 41.5q36 0 75 -20l37 19h7v-336q0 -14 7.5 -19t33.5 -7v-20zM401 342v105q0 48 -61 48q-42 0 -66.5 -25.5t-24.5 -71.5q0 -43 21.5 -70t64.5 -27q25 0 45.5 10 t20.5 31zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e1;" horiz-adv-x="684" d="M340 399h1q25 30 41 41t36 11q39 0 39 -36q0 -14 -8 -22.5t-21 -8.5q-11 0 -22.5 10.5t-20.5 10.5q-14 0 -29.5 -14t-15.5 -26v-125q0 -19 11.5 -26t44.5 -8v-20h-160v20q32 5 40 10t8 21v137q0 27 -21 27q-15 0 -25 -1v20q17 5 98 31l4 -2v-50zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e2;" horiz-adv-x="684" d="M422 360h-20q-4 35 -19.5 50.5t-44.5 15.5q-47 0 -47 -30q0 -17 27 -31l32 -15q23 -12 35 -19q33 -18 45 -32.5t12 -39.5q0 -29 -27 -51t-64 -22q-32 0 -47 4q-15 5 -30 5q-11 0 -15 -6h-9v96h20q6 -75 73 -75q23 0 37 9.5t14 23.5q0 11 -13.5 21.5t-53.5 29.5 q-80 39 -80 84q0 34 25 53.5t67 19.5q15 0 31.5 -5t23.5 -5t11 5h14zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215 q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e3;" horiz-adv-x="684" d="M427 201l14 -13q-43 -55 -91 -55q-65 0 -65 83v186h-34q-9 0 -9 12q0 10 13 18q32 20 66 72q11 20 22 20q6 0 6 -16l-8 -74h76v-32h-76v-171q0 -52 36 -52q27 0 50 22zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100 q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e4;" horiz-adv-x="684" d="M500 232v-19q-43 -9 -89 -27l-5 3v46q-46 -49 -95 -49q-38 0 -59 21t-21 56v138q0 16 -8.5 21.5t-32.5 7.5v20h97v-182q0 -16 13.5 -27.5t32.5 -11.5q24 0 47 12t23 32v129q0 16 -9.5 21t-39.5 7v20h105v-192q0 -14 5.5 -20t19.5 -6h16zM684 330q0 -145 -99 -244.5 t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e5;" horiz-adv-x="684" d="M496 450v-20q-17 -2 -24 -8t-19 -31l-83 -173q-15 -32 -19 -32q-3 0 -16 25l-81 161q-19 37 -29 46.5t-30 11.5v20h130v-20q-30 -3 -30 -9q0 -5 6 -17l64 -136h1l61 134q4 10 4 16q0 9 -30 12v20h95zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244 q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e6;" horiz-adv-x="684" d="M567 450v-20q-20 -2 -30 -24l-88 -188q-15 -32 -20 -32q-4 0 -17 27l-59 125l-72 -127q-14 -25 -19 -25q-4 0 -17 27l-88 188q-9 18 -15 23t-19 6v20h119v-20q-29 -3 -29 -11q0 -5 4 -13l63 -141l57 105l-12 27q-8 19 -17 25.5t-28 7.5v20h135v-20q-38 -3 -38 -12 q0 -5 4 -13l62 -137h2l57 127q1 3 2.5 6.5t2.5 5.5t1.5 4.5t0.5 4.5q0 13 -30 14v20h88zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89 t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e7;" horiz-adv-x="684" d="M502 186h-139v20q29 1 29 6q0 3 -4 8l-60 78l-55 -72q-8 -9 -8 -14t24 -6v-20h-100v20q20 2 28 6t21 20l72 91l-58 76q-23 31 -51 31h-8v20h142v-20q-28 -1 -28 -7q0 -4 17 -26l22 -29l18 23q6 8 13 16t9.5 11.5t2.5 5.5q0 5 -27 6v20h109v-20q-39 -2 -55 -22l-52 -65 l82 -106q23 -31 48 -31h8v-20zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e8;" horiz-adv-x="684" d="M500 524v-20q-24 -4 -33 -25l-101 -230q-28 -63 -55 -89t-64 -26q-23 0 -35.5 11t-12.5 29q0 13 10 22.5t23 9.5q12 0 25 -5.5t21 -5.5q14 0 36 24q9 11 17.5 29.5t8.5 24.5t-25 51l-91 164q-6 11 -36 16v20h140v-20q-38 -3 -38 -10q0 -6 8 -19l75 -138l60 143l6 16 q0 8 -30 8v20h91zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e9;" horiz-adv-x="684" d="M478 275l-13 -89h-253v18l173 216h-77q-31 0 -43 -9.5t-15 -39.5h-21l3 79h234v-19l-173 -215h74q57 0 70 13q11 11 20 46h21zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330 q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24ea;" horiz-adv-x="684" d="M489 321q0 -80 -36 -133.5t-108 -53.5q-75 0 -109.5 55t-34.5 136q0 82 37 137t109 55q63 0 102.5 -54.5t39.5 -141.5zM426 318q0 172 -83 172q-38 0 -58.5 -44.5t-20.5 -124.5q0 -160 81 -160t81 157zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100 t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2500;" horiz-adv-x="708" d="M719 267h-730v73h730v-73z" />
+<glyph unicode="&#x2502;" horiz-adv-x="708" d="M390 -303h-73v1213h73v-1213z" />
+<glyph unicode="&#x2506;" horiz-adv-x="708" d="M390 544h-73v366h73v-366zM390 121h-73v366h73v-366zM390 -303h-73v367h73v-367z" />
+<glyph unicode="&#x2508;" horiz-adv-x="708" d="M719 267h-145v73h145v-73zM524 267h-145v73h145v-73zM329 267h-145v73h145v-73zM134 267h-145v73h145v-73z" />
+<glyph unicode="&#x250a;" horiz-adv-x="708" d="M390 650h-73v260h73v-260zM390 333h-73v260h73v-260zM390 15h-73v260h73v-260zM390 -303h-73v260h73v-260z" />
+<glyph unicode="&#x250c;" horiz-adv-x="708" d="M720 267h-330v-570h-73v643h403v-73z" />
+<glyph unicode="&#x2510;" horiz-adv-x="708" d="M390 -303h-73v570h-328v73h401v-643z" />
+<glyph unicode="&#x2514;" horiz-adv-x="708" d="M720 267h-403v643h73v-570h330v-73z" />
+<glyph unicode="&#x2518;" horiz-adv-x="708" d="M390 267h-401v73h328v570h73v-643z" />
+<glyph unicode="&#x251c;" horiz-adv-x="708" d="M719 267h-329v-570h-73v1213h73v-570h329v-73z" />
+<glyph unicode="&#x2524;" horiz-adv-x="708" d="M390 -303h-73v570h-328v73h328v570h73v-1213z" />
+<glyph unicode="&#x252c;" horiz-adv-x="708" d="M719 267h-329v-570h-73v570h-328v73h730v-73z" />
+<glyph unicode="&#x2534;" horiz-adv-x="708" d="M719 267h-730v73h328v570h73v-570h329v-73z" />
+<glyph unicode="&#x253c;" horiz-adv-x="708" d="M719 267h-329v-570h-73v570h-328v73h328v570h73v-570h329v-73z" />
+<glyph unicode="&#x2550;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-730v73h730v-73z" />
+<glyph unicode="&#x2551;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM483 -303h-73v1213h73v-1213z" />
+<glyph unicode="&#x2552;" horiz-adv-x="708" d="M720 174h-330v-477h-73v736h403v-73h-330v-113h330v-73z" />
+<glyph unicode="&#x2553;" horiz-adv-x="708" d="M720 267h-237v-570h-73v562h-112v-562h-73v643h495v-73z" />
+<glyph unicode="&#x2554;" horiz-adv-x="708" d="M719 360h-421v-663h-73v736h494v-73zM719 174h-236v-477h-73v550h309v-73z" />
+<glyph unicode="&#x2555;" horiz-adv-x="708" d="M390 -303h-73v477h-328v73h328v113h-328v73h401v-736z" />
+<glyph unicode="&#x2556;" horiz-adv-x="708" d="M483 -303h-73v570h-112v-570h-73v570h-236v73h494v-643z" />
+<glyph unicode="&#x2557;" horiz-adv-x="708" d="M483 -303h-73v663h-421v73h494v-736zM298 -303h-73v477h-236v73h309v-550z" />
+<glyph unicode="&#x2558;" horiz-adv-x="708" d="M720 174h-403v736h73v-477h330v-73h-330v-113h330v-73z" />
+<glyph unicode="&#x2559;" horiz-adv-x="708" d="M720 267h-495v643h73v-570h112v570h73v-570h237v-73z" />
+<glyph unicode="&#x255a;" horiz-adv-x="708" d="M719 360h-309v550h73v-477h236v-73zM719 174h-494v736h73v-663h421v-73z" />
+<glyph unicode="&#x255b;" horiz-adv-x="708" d="M390 174h-401v73h328v113h-328v73h328v477h73v-736z" />
+<glyph unicode="&#x255c;" horiz-adv-x="708" d="M483 267h-494v73h236v570h73v-570h112v570h73v-643z" />
+<glyph unicode="&#x255d;" horiz-adv-x="708" d="M298 360h-309v73h236v477h73v-550zM483 174h-494v73h421v663h73v-736z" />
+<glyph unicode="&#x255e;" horiz-adv-x="708" d="M720 174h-330v-477h-73v1213h73v-477h330v-73h-330v-113h330v-73z" />
+<glyph unicode="&#x255f;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM720 267h-237v-570h-73v1213h73v-570h237v-73z" />
+<glyph unicode="&#x2560;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM720 360h-310v550h73v-477h237v-73zM720 174h-237v-477h-73v550h310v-73z" />
+<glyph unicode="&#x2561;" horiz-adv-x="708" d="M390 -303h-73v477h-328v73h328v113h-328v73h328v477h73v-1213z" />
+<glyph unicode="&#x2562;" horiz-adv-x="708" d="M483 -303h-73v1213h73v-1213zM298 -303h-73v570h-236v73h236v570h73v-1213z" />
+<glyph unicode="&#x2563;" horiz-adv-x="708" d="M483 -303h-73v1213h73v-1213zM298 360h-309v73h236v477h73v-550zM298 -303h-73v477h-236v73h309v-550z" />
+<glyph unicode="&#x2564;" horiz-adv-x="708" d="M719 360h-730v73h730v-73zM719 174h-329v-477h-73v477h-328v73h730v-73z" />
+<glyph unicode="&#x2565;" horiz-adv-x="708" d="M719 267h-236v-570h-73v570h-112v-570h-73v570h-236v73h730v-73z" />
+<glyph unicode="&#x2566;" horiz-adv-x="708" d="M719 360h-730v73h730v-73zM719 174h-236v-477h-73v550h309v-73zM298 -303h-73v477h-236v73h309v-550z" />
+<glyph unicode="&#x2567;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-730v73h328v477h73v-477h329v-73z" />
+<glyph unicode="&#x2568;" horiz-adv-x="708" d="M719 267h-730v73h236v570h73v-570h112v570h73v-570h236v-73z" />
+<glyph unicode="&#x2569;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-309v550h73v-477h236v-73zM298 360h-309v73h236v477h73v-550z" />
+<glyph unicode="&#x256a;" horiz-adv-x="708" d="M719 174h-329v-477h-73v477h-328v73h328v113h-328v73h328v477h73v-477h329v-73h-329v-113h329v-73z" />
+<glyph unicode="&#x256b;" horiz-adv-x="708" d="M719 267h-236v-570h-73v570h-112v-570h-73v570h-236v73h236v570h73v-570h112v570h73v-570h236v-73z" />
+<glyph unicode="&#x256c;" horiz-adv-x="708" d="M719 360h-309v550h73v-477h236v-73zM298 360h-309v73h236v477h73v-550zM719 174h-236v-477h-73v550h309v-73zM298 -303h-73v477h-236v73h309v-550z" />
+<glyph unicode="&#x2571;" horiz-adv-x="708" d="M723 878l-680 -1181l-58 32l680 1181z" />
+<glyph unicode="&#x2572;" horiz-adv-x="708" d="M723 -271l-58 -32l-680 1181l58 32z" />
+<glyph unicode="&#x2580;" horiz-adv-x="1213" d="M1213 304h-1213v606h1213v-606z" />
+<glyph unicode="&#x2584;" horiz-adv-x="1213" d="M1213 -303h-1213v606h1213v-606z" />
+<glyph unicode="&#x2588;" horiz-adv-x="1213" d="M1213 -303h-1213v1213h1213v-1213z" />
+<glyph unicode="&#x258c;" horiz-adv-x="1212" d="M606 -303h-606v1213h606v-1213z" />
+<glyph unicode="&#x2590;" horiz-adv-x="1212" d="M1212 -303h-606v1213h606v-1213z" />
+<glyph unicode="&#x2591;" horiz-adv-x="1200" d="M1160 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1200 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1080 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1120 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14 zM1160 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1000 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1200 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1040 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1080 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM920 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1120 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM960 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1160 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1000 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM840 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1200 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1040 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM880 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1080 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM920 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M760 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1120 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM960 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM800 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1160 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1000 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM840 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM680 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1200 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1040 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM880 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM720 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1080 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM920 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM760 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM600 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1120 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM960 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM800 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM640 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1160 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1000 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM840 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM680 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M520 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1200 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1040 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM880 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M720 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM560 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1080 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM920 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M760 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM600 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM440 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1120 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M960 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM800 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM640 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM480 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1160 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1000 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM840 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM680 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M520 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM360 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1200 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1040 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M880 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM720 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM560 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM400 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1080 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM920 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM760 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM600 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M440 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM280 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1120 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM960 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M800 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM640 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM480 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM320 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1160 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1000 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM840 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM680 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M520 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM360 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM200 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1200 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1040 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM880 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM720 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM560 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M400 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM240 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1080 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM920 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M760 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM600 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM440 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM280 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M120 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1120 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM960 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM800 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M640 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM480 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM320 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM160 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1160 -238q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1000 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM840 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM680 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M520 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM360 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM200 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM40 840q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1040 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM880 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM720 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM560 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M400 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM240 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM80 763q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM1080 -238q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M920 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM760 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM600 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM440 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M280 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM120 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM960 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM800 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M640 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM480 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM320 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM160 609q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M1000 -238q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM840 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM680 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM520 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M360 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM200 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM40 686q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM880 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z M720 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM560 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM400 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM240 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM80 609 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM920 -238q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM760 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM600 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM440 224 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM280 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM120 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM800 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM640 -7 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM480 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM320 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM160 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM840 -238 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM680 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM520 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM360 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM200 378 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM40 532q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM720 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM560 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM400 147 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM240 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM80 455q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM760 -238q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM600 -84 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM440 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM280 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM120 378q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM640 -161 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM480 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM320 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM160 301q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM680 -238 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM520 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM360 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM200 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM40 378 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM560 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM400 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM240 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM80 301 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM600 -238q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM440 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM280 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM120 224 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM480 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM320 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM160 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM520 -238 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM360 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM200 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM40 224q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM400 -161 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM240 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM80 147q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM440 -238q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM280 -84 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM120 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM320 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM160 -7q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM360 -238 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM200 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM40 70q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM240 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM80 -7 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM280 -238q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM120 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM160 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM200 -238 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM40 -84q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM80 -161q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM120 -238q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14zM40 -238 q0 -8 -6 -14t-14 -6t-14 6t-6 14t6 14t14 6t14 -6t6 -14z" />
+<glyph unicode="&#x2592;" horiz-adv-x="1200" d="M1200 -273h-1200v1147h1200v-1147zM1140 822q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1200 706q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1020 822q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1080 706q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1140 590q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM900 822q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1200 474q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM960 706q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1020 590q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM780 822q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1080 474q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM840 706q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1140 358q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM900 590q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM660 822q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1200 242q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM960 474q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM720 706q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1020 358q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM780 590q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM540 822q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM1080 242q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM840 474q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM600 706q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1140 126q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM900 358q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM660 590q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM420 822q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1200 10q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM960 242q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM720 474q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM480 706q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1020 126q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM780 358q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM540 590q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM300 822q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1080 10q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM840 242q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM600 474q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM360 706q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1140 -106q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM900 126q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM660 358q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM420 590q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM180 822q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM1200 -222q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM960 10q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM720 242q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM480 474q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM240 706q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1020 -106q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM780 126q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM540 358q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM300 590q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM60 822q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM1080 -222q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM840 10q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM600 242q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM360 474q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM120 706q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM900 -106q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM660 126q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM420 358q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM180 590q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM960 -222q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM720 10q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM480 242q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM240 474q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM780 -106q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM540 126q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM300 358q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM60 590q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM840 -222q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM600 10q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM360 242q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM120 474q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM660 -106q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM420 126q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM180 358q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM720 -222q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM480 10q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM240 242q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM540 -106q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM300 126q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM60 358q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM600 -222q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM360 10q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM120 242q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM420 -106q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM180 126q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM480 -222q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM240 10q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM300 -106q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5 t8.5 21.5zM60 126q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM360 -222q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM120 10q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5 t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM180 -106q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM240 -222q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM60 -106q0 13 -8.5 21.5 t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5zM120 -222q0 13 -8.5 21.5t-21.5 8.5t-21.5 -8.5t-8.5 -21.5t8.5 -21.5t21.5 -8.5t21.5 8.5t8.5 21.5z" />
+<glyph unicode="&#x2593;" horiz-adv-x="1200" d="M1200 -273h-1200v1147h1200v-1147zM1160 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1200 763q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1080 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1120 763q0 8 -6 14t-14 6t-14 -6 t-6 -14t6 -14t14 -6t14 6t6 14zM1160 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1000 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1200 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1040 763q0 8 -6 14t-14 6t-14 -6 t-6 -14t6 -14t14 -6t14 6t6 14zM1080 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM920 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1120 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM960 763q0 8 -6 14t-14 6t-14 -6t-6 -14 t6 -14t14 -6t14 6t6 14zM1160 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1000 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM840 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1200 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14 t14 -6t14 6t6 14zM1040 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM880 763q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1080 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM920 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6 t14 6t6 14zM760 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1120 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM960 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM800 763q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6 t6 14zM1160 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1000 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM840 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM680 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14z M1200 301q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1040 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM880 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM720 763q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14z M1080 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM920 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM760 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM600 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1120 301 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM960 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM800 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM640 763q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1160 224 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1000 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM840 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM680 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM520 840 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1200 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1040 301q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM880 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM720 609 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM560 763q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1080 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM920 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM760 532 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM600 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM440 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1120 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM960 301 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM800 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM640 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM480 763q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1160 70q0 8 -6 14 t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1000 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM840 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM680 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM520 686q0 8 -6 14t-14 6 t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM360 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1200 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1040 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM880 301q0 8 -6 14t-14 6t-14 -6 t-6 -14t6 -14t14 -6t14 6t6 14zM720 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM560 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM400 763q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1080 70q0 8 -6 14t-14 6t-14 -6t-6 -14 t6 -14t14 -6t14 6t6 14zM920 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM760 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM600 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM440 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14 t14 -6t14 6t6 14zM280 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1120 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM960 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM800 301q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6 t14 6t6 14zM640 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM480 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM320 763q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1160 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6 t6 14zM1000 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM840 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM680 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM520 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14z M360 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM200 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1200 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1040 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM880 147 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM720 301q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM560 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM400 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM240 763q0 8 -6 14 t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1080 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM920 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM760 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM600 378q0 8 -6 14t-14 6 t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM440 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM280 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM120 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1120 -161q0 8 -6 14t-14 6t-14 -6 t-6 -14t6 -14t14 -6t14 6t6 14zM960 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM800 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM640 301q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM480 455q0 8 -6 14t-14 6t-14 -6t-6 -14 t6 -14t14 -6t14 6t6 14zM320 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM160 763q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1160 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1000 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14 t14 -6t14 6t6 14zM840 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM680 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM520 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM360 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6 t6 14zM200 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM40 840q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1040 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM880 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14z M720 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM560 301q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM400 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM240 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM80 763 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1080 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM920 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM760 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM600 224 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM440 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM280 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM120 686q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM960 -161 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM800 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM640 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM480 301q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM320 455q0 8 -6 14 t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM160 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM1000 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM840 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM680 70q0 8 -6 14t-14 6 t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM520 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM360 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM200 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM40 686q0 8 -6 14t-14 6t-14 -6 t-6 -14t6 -14t14 -6t14 6t6 14zM880 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM720 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM560 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM400 301q0 8 -6 14t-14 6t-14 -6t-6 -14 t6 -14t14 -6t14 6t6 14zM240 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM80 609q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM920 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM760 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14 t14 -6t14 6t6 14zM600 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM440 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM280 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM120 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6 t6 14zM800 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM640 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM480 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM320 301q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14z M160 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM840 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM680 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM520 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM360 224 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM200 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM40 532q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM720 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM560 -7q0 8 -6 14 t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM400 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM240 301q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM80 455q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM760 -238q0 8 -6 14t-14 6 t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM600 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM440 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM280 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM120 378q0 8 -6 14t-14 6t-14 -6 t-6 -14t6 -14t14 -6t14 6t6 14zM640 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM480 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM320 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM160 301q0 8 -6 14t-14 6t-14 -6t-6 -14 t6 -14t14 -6t14 6t6 14zM680 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM520 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM360 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM200 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14 t14 -6t14 6t6 14zM40 378q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM560 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM400 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM240 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6 t6 14zM80 301q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM600 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM440 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM280 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14z M120 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM480 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM320 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM160 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM520 -238 q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM360 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM200 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM40 224q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM400 -161q0 8 -6 14 t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM240 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM80 147q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM440 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM280 -84q0 8 -6 14t-14 6 t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM120 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM320 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM160 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM360 -238q0 8 -6 14t-14 6t-14 -6 t-6 -14t6 -14t14 -6t14 6t6 14zM200 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM40 70q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM240 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM80 -7q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14 t14 -6t14 6t6 14zM280 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM120 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM160 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM200 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6 t14 6t6 14zM40 -84q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM80 -161q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM120 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14zM40 -238q0 8 -6 14t-14 6t-14 -6t-6 -14t6 -14t14 -6t14 6t6 14 z" />
+<glyph unicode="&#x25a0;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820z" />
+<glyph unicode="&#x25a1;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM799 -92v688h-688v-688h688z" />
+<glyph unicode="&#x25a2;" horiz-adv-x="910" d="M865 422v-340q0 -99 -70.5 -169.5t-169.5 -70.5h-340q-99 0 -169.5 70.5t-70.5 169.5v340q0 99 70.5 169.5t169.5 70.5h340q99 0 169.5 -70.5t70.5 -169.5zM799 82v340q0 74 -50.5 124t-123.5 50h-340q-73 0 -123.5 -50t-50.5 -124v-340q0 -74 50.5 -124t123.5 -50h340 q73 0 123.5 50t50.5 124z" />
+<glyph unicode="&#x25a3;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM664 40h-420v420h420v-420zM798 -92v688h-687v-688h687z" />
+<glyph unicode="&#x25a4;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM798 462v134h-687v-134h687zM798 277v133h-687v-133h687zM798 92v133h-687v-133h687zM798 -92v132h-687v-132h687z" />
+<glyph unicode="&#x25a5;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM799 -91v687h-134v-687h134zM613 -91v687h-133v-687h133zM428 -91v687h-133v-687h133zM243 -91v687h-132v-687h132z" />
+<glyph unicode="&#x25a6;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM798 462v134h-133v-134h133zM613 462v134h-133v-134h133zM798 277v133h-133v-133h133zM428 462v134h-133v-134h133zM613 277v133h-133v-133h133zM798 92v133h-133v-133h133zM243 462v134h-132v-134h132zM798 -91v131h-133v-131h133zM428 277 v133h-133v-133h133zM613 92v133h-133v-133h133zM613 -91v131h-133v-131h133zM243 277v133h-132v-133h132zM428 92v133h-133v-133h133zM428 -91v131h-133v-131h133zM243 92v133h-132v-133h132zM243 -91v131h-132v-131h132z" />
+<glyph unicode="&#x25a7;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM799 465v130h-130zM799 291v100l-204 204h-100zM799 117v100l-378 378h-100zM799 -56v99l-552 552h-100zM761 -92l-650 650v-100l549 -550h101zM587 -92l-476 476v-102l373 -374h103zM411 -92l-300 300v-102l198 -198h102zM235 -92l-124 125 v-125h124z" />
+<glyph unicode="&#x25a8;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM799 -92v125l-124 -125h124zM799 458v100l-650 -650h101zM799 282v102l-476 -476h103zM799 106v102l-300 -300h102zM763 595h-100l-552 -552v-99zM241 595h-130v-130zM415 595h-100l-204 -204v-100zM589 595h-100l-378 -378v-100z" />
+<glyph unicode="&#x25a9;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM763 595h-94l46 -47zM799 465v93l-47 -47zM678 511l-49 50l-50 -50l49 -50zM765 424l-50 50l-50 -50l51 -50zM589 595h-94l47 -47zM799 291v93l-47 -47zM505 511l-50 50l-50 -50l50 -50zM591 424l-49 50l-50 -50l49 -50zM679 337l-51 50 l-50 -50l51 -50zM766 249l-51 51l-50 -50l51 -51zM415 595h-94l47 -47zM799 117v91l-46 -46zM331 511l-50 50l-50 -50l50 -50zM418 424l-50 50l-50 -50l50 -50zM504 337l-49 50l-50 -50l49 -50zM592 250l-51 50l-50 -50l51 -50zM679 162l-51 51l-50 -50l51 -51zM767 74 l-51 51l-50 -50l51 -51zM241 595h-94l47 -47zM799 -56v89l-45 -45zM761 -92l-43 43l-43 -43h86zM157 511l-46 47v-93zM418 251l-50 49l-50 -50l50 -49zM505 163l-50 51l-50 -50l50 -51zM593 76l-51 51l-50 -50l51 -52zM681 -12l-51 51l-51 -50l51 -51zM244 424l-50 50 l-50 -50l50 -50zM331 337l-50 50l-50 -50l50 -50zM587 -92l-44 44l-44 -44h88zM157 337l-46 47v-93zM331 164l-50 49l-51 -51l50 -49zM418 76l-50 51l-51 -51l50 -51zM244 250l-50 50l-51 -51l50 -50zM506 -11l-51 51l-52 -51l52 -52zM411 -92l-44 44l-44 -44h88zM156 162 l-45 46v-91zM330 -11l-50 50l-51 -51l50 -50zM243 76l-50 49l-51 -51l50 -49zM235 -92l-43 44l-43 -44h86zM155 -11l-44 44v-89z" />
+<glyph unicode="&#x25aa;" horiz-adv-x="484" d="M452 40h-420v420h420v-420z" />
+<glyph unicode="&#x25ab;" horiz-adv-x="484" d="M452 40h-420v420h420v-420zM386 106v288h-288v-288h288z" />
+<glyph unicode="&#x25ac;" horiz-adv-x="1020" d="M982 -11h-944v480h944v-480z" />
+<glyph unicode="&#x25ad;" horiz-adv-x="1020" d="M982 -11h-944v480h944v-480zM916 55v348h-812v-348h812z" />
+<glyph unicode="&#x25ae;" horiz-adv-x="560" d="M520 -220h-480v944h480v-944z" />
+<glyph unicode="&#x25af;" horiz-adv-x="560" d="M520 -220h-480v944h480v-944zM454 -154v812h-348v-812h348z" />
+<glyph unicode="&#x25b0;" horiz-adv-x="1140" d="M1112 514l-140 -525h-944l140 525h944z" />
+<glyph unicode="&#x25b1;" horiz-adv-x="1140" d="M1111 514l-139 -525h-943l139 525h943zM1028 448h-813l-103 -393h812z" />
+<glyph unicode="&#x25b2;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938z" />
+<glyph unicode="&#x25b3;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM995 -61l-422 739l-424 -739h846z" />
+<glyph unicode="&#x25b4;" horiz-adv-x="660" d="M632 28h-605l303 525z" />
+<glyph unicode="&#x25b5;" horiz-adv-x="660" d="M632 28h-605l303 525zM522 94l-192 326l-191 -326h383z" />
+<glyph unicode="&#x25b6;" horiz-adv-x="1043" d="M1008 253l-938 -538v1075z" />
+<glyph unicode="&#x25b7;" horiz-adv-x="1043" d="M1008 253l-938 -537v1075zM875 253l-739 424v-846z" />
+<glyph unicode="&#x25b8;" horiz-adv-x="660" d="M605 253l-525 -302v605z" />
+<glyph unicode="&#x25b9;" horiz-adv-x="660" d="M605 253l-525 -303v605zM472 252l-326 191v-383z" />
+<glyph unicode="&#x25ba;" horiz-adv-x="930" d="M885 252l-820 -302v605z" />
+<glyph unicode="&#x25bb;" horiz-adv-x="930" d="M885 252l-820 -302v605zM697 252l-566 206v-412z" />
+<glyph unicode="&#x25bc;" horiz-adv-x="1145" d="M1110 811l-537 -938l-538 938h1075z" />
+<glyph unicode="&#x25bd;" horiz-adv-x="1145" d="M1110 811l-537 -938l-538 938h1075zM995 745h-846l424 -739z" />
+<glyph unicode="&#x25be;" horiz-adv-x="660" d="M632 477l-303 -525l-302 525h605z" />
+<glyph unicode="&#x25bf;" horiz-adv-x="660" d="M632 477l-303 -525l-302 525h605zM520 411h-383l192 -326z" />
+<glyph unicode="&#x25c0;" horiz-adv-x="1043" d="M973 -285l-938 538l938 537v-1075z" />
+<glyph unicode="&#x25c1;" horiz-adv-x="1043" d="M1008 -284l-938 537l938 538v-1075zM942 -169v846l-739 -424z" />
+<glyph unicode="&#x25c2;" horiz-adv-x="660" d="M580 -50l-525 303l525 302v-605z" />
+<glyph unicode="&#x25c3;" horiz-adv-x="660" d="M580 -51l-525 303l525 302v-605zM514 61v383l-326 -192z" />
+<glyph unicode="&#x25c4;" horiz-adv-x="930" d="M865 -50l-820 302l820 303v-605z" />
+<glyph unicode="&#x25c5;" horiz-adv-x="930" d="M865 -50l-820 302l820 303v-605zM799 47v412l-566 -206z" />
+<glyph unicode="&#x25c6;" horiz-adv-x="1064" d="M1025 251l-492 -493l-494 494l493 492z" />
+<glyph unicode="&#x25c7;" horiz-adv-x="1064" d="M1025 251l-492 -493l-494 494l493 492zM932 251l-400 400l-400 -400l400 -400z" />
+<glyph unicode="&#x25c8;" horiz-adv-x="1064" d="M1025 251l-492 -493l-494 494l493 492zM769 251l-237 -237l-237 237l237 237zM932 251l-400 400l-400 -400l400 -400z" />
+<glyph unicode="&#x25c9;" horiz-adv-x="842" d="M656 252q0 -99 -69 -168.5t-166 -69.5q-99 0 -168.5 69.5t-69.5 168.5q0 97 69.5 166t168.5 69q97 0 166 -69t69 -166zM792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252 q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5z" />
+<glyph unicode="&#x25ca;" horiz-adv-x="790" d="M745 253l-351 -542l-349 542l350 542zM667 253l-272 421l-271 -421l270 -421z" />
+<glyph unicode="&#x25cb;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5z" />
+<glyph unicode="&#x25cc;" horiz-adv-x="910" d="M757 554l-48 -48q-23 24 -47 41l38 55q27 -18 57 -48zM842 433l-60 -29q-13 27 -31 54l54 39q24 -35 37 -64zM629 624l-22 -45q-17 9 -58 22l17 64q13 -4 33.5 -20.5t29.5 -20.5zM881 290l-67 -6q-2 25 -11 61l65 18q10 -34 13 -73zM493 678l-6 -65q-11 1 -32 1 q-10 0 -32 -2l-6 66q13 2 38 2t38 -2zM814 220l67 -6q-3 -39 -13 -73l-65 18q8 35 11 61zM344 665l17 -64q-41 -13 -58 -22l-29 60q27 13 70 26zM782 101l61 -29q-12 -28 -38 -65l-54 40q17 25 31 54zM210 603l38 -55q-34 -26 -47 -41l-48 48q32 30 57 48zM709 -2l48 -48 q-32 -30 -57 -48l-38 55q31 23 47 41zM105 497l54 -38l-32 -55l-59 29q13 29 37 64zM607 -75l29 -60q-27 -13 -70 -26l-17 65q41 13 58 21zM42 363l64 -18q-10 -55 -11 -61l-66 6q3 39 13 73zM487 -108l6 -66q-24 -2 -38 -2t-38 2l6 65q11 -1 32 -1q10 0 32 2zM106 159 l-64 -18q-10 34 -13 73l66 6q1 -7 11 -61zM361 -96l-17 -65q-43 13 -70 26l29 60q17 -8 58 -21zM159 46l-54 -39q-24 35 -37 64l59 29q17 -32 32 -54zM248 -43l-38 -55q-30 21 -57 47l48 49q13 -15 47 -41z" />
+<glyph unicode="&#x25cd;" horiz-adv-x="910" d="M884 252q0 -177 -126 -302.5t-303 -125.5t-302.5 125.5t-125.5 302.5t125.5 302.5t302.5 125.5t303 -125.5t126 -302.5zM741 474v-444q77 98 77 222q0 123 -77 222zM689 -24v552q-37 31 -78 50v-652q41 19 78 50zM559 -94v692q-42 13 -78 16v-724q36 3 78 16zM429 -110 v724q-36 -3 -78 -16v-692q42 -13 78 -16zM299 -74v652q-40 -18 -78 -51v-550q38 -33 78 -51zM169 30v443q-76 -97 -76 -221t76 -222z" />
+<glyph unicode="&#x25ce;" horiz-adv-x="842" d="M656 252q0 -99 -69 -168.5t-166 -69.5q-99 0 -168.5 69.5t-69.5 168.5q0 97 69.5 166t168.5 69q97 0 166 -69t69 -166zM590 252q0 70 -49.5 119.5t-119.5 49.5q-72 0 -122 -50t-50 -119q0 -72 50 -122t122 -50q69 0 119 50t50 122zM792 252q0 -154 -108.5 -262.5 t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5z" />
+<glyph unicode="&#x25cf;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5z" />
+<glyph unicode="&#x25d0;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM421 557v-610q126 0 215.5 89.5t89.5 215.5t-89.5 215.5t-215.5 89.5z" />
+<glyph unicode="&#x25d1;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM421 -53v610q-126 0 -215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5z" />
+<glyph unicode="&#x25d2;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM116 252h610q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5z" />
+<glyph unicode="&#x25d3;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252h-610q0 -126 89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5z" />
+<glyph unicode="&#x25d4;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252h-305v305q-126 0 -215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5z" />
+<glyph unicode="&#x25d5;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM421 252v305q-126 0 -215.5 -89.5t-89.5 -215.5h305z" />
+<glyph unicode="&#x25d6;" horiz-adv-x="580" d="M494 680v-856q-177 0 -302.5 125.5t-125.5 302.5t125.5 302.5t302.5 125.5z" />
+<glyph unicode="&#x25d7;" horiz-adv-x="580" d="M86 -176v856q177 0 302.5 -125.5t125.5 -302.5t-125.5 -302.5t-302.5 -125.5z" />
+<glyph unicode="&#x25d8;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM650 253q0 80 -54.5 136t-138.5 56q-79 0 -135.5 -57t-56.5 -135q0 -80 56 -136.5t136 -56.5q79 0 136 57t57 136z" />
+<glyph unicode="&#x25d9;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM733 252q0 -116 -81.5 -197t-196.5 -81t-196.5 81t-81.5 197t81.5 197t196.5 81t196.5 -81t81.5 -197zM799 252q0 142 -101 243t-243 101t-243 -101t-101 -243t101 -243t243 -101t243 101t101 243z" />
+<glyph unicode="&#x25da;" horiz-adv-x="910" d="M865 252h-66q0 142 -101 243t-243 101t-243 -101t-101 -243h-66v410h820v-410zM733 252h-556q0 116 81.5 197t196.5 81t196.5 -81t81.5 -197z" />
+<glyph unicode="&#x25db;" horiz-adv-x="910" d="M177 252h556q0 -116 -81.5 -197t-196.5 -81t-196.5 81t-81.5 197zM865 -158h-820v410h66q0 -142 101 -243t243 -101t243 101t101 243h66v-410z" />
+<glyph unicode="&#x25dc;" horiz-adv-x="910" d="M455 680v-66q-149 0 -255.5 -106.5t-106.5 -255.5h-66q0 177 125.5 302.5t302.5 125.5z" />
+<glyph unicode="&#x25dd;" horiz-adv-x="910" d="M884 252h-66q0 149 -107 255.5t-256 106.5v66q177 0 303 -125.5t126 -302.5z" />
+<glyph unicode="&#x25de;" horiz-adv-x="910" d="M818 252h66q0 -177 -126 -302.5t-303 -125.5v66q149 0 256 106.5t107 255.5z" />
+<glyph unicode="&#x25df;" horiz-adv-x="910" d="M455 -110v-66q-177 0 -303 125.5t-126 302.5h66q0 -149 107 -255.5t256 -106.5z" />
+<glyph unicode="&#x25e0;" horiz-adv-x="910" d="M884 251h-66q0 149 -107 256t-256 107t-255.5 -107t-106.5 -256h-66q0 177 125.5 303t302.5 126t303 -126t126 -303z" />
+<glyph unicode="&#x25e1;" horiz-adv-x="910" d="M818 252h66q0 -177 -125.5 -302.5t-302.5 -125.5t-303 125.5t-126 302.5h66q0 -149 107 -255.5t256 -106.5t255.5 106.5t106.5 255.5z" />
+<glyph unicode="&#x25e2;" horiz-adv-x="911" d="M865 -158h-820l820 820v-820z" />
+<glyph unicode="&#x25e3;" horiz-adv-x="911" d="M865 -158h-820v820z" />
+<glyph unicode="&#x25e4;" horiz-adv-x="911" d="M865 662l-820 -820v820h820z" />
+<glyph unicode="&#x25e5;" horiz-adv-x="911" d="M865 -158l-820 820h820v-820z" />
+<glyph unicode="&#x25e6;" horiz-adv-x="523" d="M455 252q0 -79 -57 -136t-136 -57q-80 0 -136 56.5t-56 136.5q0 78 56.5 135t135.5 57q84 0 138.5 -56t54.5 -136zM389 251q0 54 -36.5 90.5t-90.5 36.5t-90 -36.5t-36 -90.5t36 -90t90 -36t90.5 36t36.5 90z" />
+<glyph unicode="&#x25e7;" horiz-adv-x="910" d="M865 -157h-820v819h820v-819zM799 -91v687h-345v-687h345z" />
+<glyph unicode="&#x25e8;" horiz-adv-x="910" d="M865 -157h-820v819h820v-819zM456 -91v687h-345v-687h345z" />
+<glyph unicode="&#x25e9;" horiz-adv-x="910" d="M865 -157h-820v819h820v-819zM799 -91v687l-688 -687h688z" />
+<glyph unicode="&#x25ea;" horiz-adv-x="910" d="M865 -157h-820v819h820v-819zM799 596h-688v-687z" />
+<glyph unicode="&#x25eb;" horiz-adv-x="910" d="M865 -157h-820v819h820v-819zM799 -91v687h-318v-687h318zM429 -91v687h-318v-687h318z" />
+<glyph unicode="&#x25ec;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM673 239q0 -41 -29.5 -70.5t-70.5 -29.5t-70.5 29.5t-29.5 70.5t29.5 70.5t70.5 29.5t70.5 -29.5t29.5 -70.5zM995 -61l-422 739l-424 -739h846z" />
+<glyph unicode="&#x25ed;" horiz-adv-x="1145" d="M1110 -127h-1075l537 938zM996 -61l-424 739v-739h424z" />
+<glyph unicode="&#x25ee;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM573 -61v739l-424 -739h424z" />
+<glyph unicode="&#x25ef;" horiz-adv-x="1207" d="M1137 252q0 -145 -71.5 -268t-194 -194.5t-267.5 -71.5q-220 0 -377 157t-157 377q0 145 71.5 267.5t194.5 194t268 71.5q220 0 376.5 -156.5t156.5 -376.5zM1071 252q0 126 -63 233.5t-170.5 170.5t-233.5 63t-234 -63t-171 -170.5t-63 -233.5q0 -94 37.5 -180.5 t100.5 -149.5t149.5 -100.5t180.5 -37.5q126 0 233.5 63t170.5 171t63 234z" />
+<glyph unicode="&#x25f0;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM799 -92v688h-318v-371h-370v-317h688zM429 277v319h-318v-319h318z" />
+<glyph unicode="&#x25f1;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM798 -92v688h-687v-318h370v-370h317zM429 -92v318h-318v-318h318z" />
+<glyph unicode="&#x25f2;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM799 278v318h-687v-688h317v370h370zM799 -92v318h-318v-318h318z" />
+<glyph unicode="&#x25f3;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM799 277v319h-318v-319h318zM799 -92v317h-370v371h-318v-688h688z" />
+<glyph unicode="&#x25f4;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM395 278v278q-111 -10 -189.5 -88.5t-88.5 -189.5h278zM447 226h-330q10 -118 97.5 -198.5t206.5 -80.5q126 0 215.5 89.5t89.5 215.5 q0 119 -80.5 206.5t-198.5 97.5v-330z" />
+<glyph unicode="&#x25f5;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM447 278v-330q118 10 198.5 97.5t80.5 206.5q0 126 -89.5 215.5t-215.5 89.5q-119 0 -206.5 -80.5t-97.5 -198.5h330zM395 -52v278h-278 q10 -111 88.5 -189.5t189.5 -88.5z" />
+<glyph unicode="&#x25f6;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM395 278h330q-10 118 -97.5 198.5t-206.5 80.5q-126 0 -215.5 -89.5t-89.5 -215.5q0 -119 80.5 -206.5t198.5 -97.5v330zM725 226h-278v-278 q111 10 189.5 88.5t88.5 189.5z" />
+<glyph unicode="&#x25f7;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM447 278h278q-10 111 -88.5 189.5t-189.5 88.5v-278zM725 226h-330v330q-118 -10 -198.5 -97.5t-80.5 -206.5q0 -126 89.5 -215.5 t215.5 -89.5q119 0 206.5 80.5t97.5 198.5z" />
+<glyph unicode="&#x25f8;" horiz-adv-x="911" d="M865 662l-820 -820v820h820zM707 596h-596v-595z" />
+<glyph unicode="&#x25f9;" horiz-adv-x="911" d="M865 -158l-820 820h820v-820zM799 0v596h-595z" />
+<glyph unicode="&#x25fa;" horiz-adv-x="911" d="M865 -158h-820v820zM706 -92l-595 596v-596h595z" />
+<glyph unicode="&#x25fb;" horiz-adv-x="746" d="M701 -76h-656v656h656v-656zM635 -10v524h-524v-524h524z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="746" d="M701 -76h-656v656h656v-656z" />
+<glyph unicode="&#x25fd;" horiz-adv-x="601" d="M563 -12h-525v525h525v-525zM497 54v393h-393v-393h393z" />
+<glyph unicode="&#x25fe;" horiz-adv-x="601" d="M563 -11h-525v525h525v-525z" />
+<glyph unicode="&#x25ff;" horiz-adv-x="911" d="M865 -158h-820l820 820v-820zM799 -92v595l-596 -595h596z" />
+<glyph unicode="&#x2605;" horiz-adv-x="870" d="M810 382l-228 -176l82 -272l-229 162l-229 -162l82 272l-228 176h282l93 273l93 -273h282z" />
+<glyph unicode="&#x2606;" horiz-adv-x="870" d="M810 382l-228 -176l82 -272l-229 162l-229 -162l82 272l-228 176h282l93 273l93 -273h282zM658 330h-167l-56 164l-56 -164h-167l136 -105l-49 -161l136 96l136 -96l-49 161z" />
+<glyph unicode="&#x2609;" horiz-adv-x="762" d="M712 252q0 -137 -97 -234t-234 -97t-234 97t-97 234t97 234t234 97t234 -97t97 -234zM646 252q0 110 -78 187.5t-187 77.5t-187 -77.5t-78 -187.5t78 -187.5t187 -77.5t187 77.5t78 187.5zM463 253q0 -34 -23 -58.5t-59 -24.5q-37 0 -60 22.5t-23 60.5q0 35 25 58.5 t58 23.5t57.5 -23.5t24.5 -58.5z" />
+<glyph unicode="&#x260c;" horiz-adv-x="581" d="M553 609l-131 -306q48 -33 76.5 -84.5t28.5 -111.5q0 -99 -69 -168.5t-166 -69.5q-99 0 -168.5 69.5t-69.5 168.5q0 97 69.5 166t168.5 69q42 0 75 -13l131 305zM461 107q0 70 -49.5 119.5t-119.5 49.5q-72 0 -122 -50t-50 -119q0 -72 50 -122t122 -50q69 0 119 50 t50 122z" />
+<glyph unicode="&#x260e;" horiz-adv-x="1000" d="M300 436l-208 -101q-1 1 -8 7l-10 8l-10 8q-7 6 -10 10l-8 9q-5 6 -7.5 11t-4.5 11t-2 11q0 44 15.5 86t46.5 66q65 51 187.5 82.5t218.5 31.5q99 0 227.5 -34.5t188.5 -89.5q51 -47 51 -157q0 -14 -59 -60l-208 101q0 5 0.5 17t0.5 19q0 81 -51 81h-300q-51 0 -51 -81 q0 -7 0.5 -19t0.5 -17zM650 362q0 -62 -44 -105t-106 -43q-61 0 -105 45t-44 107q0 59 44 103t103 44q62 0 107 -44t45 -107zM805 0h-610v216l75 122h36q10 -76 68.5 -122.5t136.5 -46.5q65 0 122.5 52t62.5 117h34l75 -122v-216z" />
+<glyph unicode="&#x2612;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM719 24l-36 -36l-228 227l-228 -227l-36 36l227 228l-227 228l36 36l228 -227l228 227l36 -36l-227 -228zM799 -92v688h-688v-688h688z" />
+<glyph unicode="&#x2621;" horiz-adv-x="619" d="M549 -35h-277q-69 0 -112 34t-43 99q0 77 71 137l225 188q35 29 35 77q0 37 -26.5 56t-68.5 19h-283v55h277q69 0 112 -34.5t43 -98.5q0 -70 -63 -124l-202 -173q-66 -58 -66 -104q0 -36 26.5 -56t68.5 -20h283v-55z" />
+<glyph unicode="&#x2639;" horiz-adv-x="1150" d="M755 443q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5t35.5 -14.5t14.5 -35.5zM495 443q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5t35.5 -14.5t14.5 -35.5zM804 152l-19 -13q-52 57 -98 77t-111 20 q-66 0 -111 -20t-97 -77l-19 13q40 72 92.5 111t134.5 39q83 0 135.5 -39t92.5 -111zM980 323q0 -168 -118.5 -286.5t-286.5 -118.5t-286.5 118.5t-118.5 286.5t118.5 286.5t286.5 118.5t286.5 -118.5t118.5 -286.5zM928 323q0 145 -104 249t-249 104t-249 -104t-104 -249 t104 -249t249 -104t249 104t104 249z" />
+<glyph unicode="&#x263a;" horiz-adv-x="1150" d="M755 443q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5t35.5 -14.5t14.5 -35.5zM495 443q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5t35.5 -14.5t14.5 -35.5zM784 249l19 -13q-40 -72 -92.5 -111t-135.5 -39 t-135 39t-92 111l19 13q52 -57 97 -77t111 -20q65 0 111 20t98 77zM980 323q0 -168 -118.5 -286.5t-286.5 -118.5t-286.5 118.5t-118.5 286.5t118.5 286.5t286.5 118.5t286.5 -118.5t118.5 -286.5zM928 323q0 145 -104 249t-249 104t-249 -104t-104 -249t104 -249t249 -104 t249 104t104 249z" />
+<glyph unicode="&#x263b;" horiz-adv-x="1150" d="M980 323q0 -168 -118.5 -286.5t-286.5 -118.5t-286.5 118.5t-118.5 286.5t118.5 286.5t286.5 118.5t286.5 -118.5t118.5 -286.5zM755 443q0 21 -14.5 35.5t-35.5 14.5t-35.5 -14.5t-14.5 -35.5t14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5zM495 443q0 21 -14.5 35.5 t-35.5 14.5t-35.5 -14.5t-14.5 -35.5t14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5zM803 236l-19 13q-52 -57 -98 -77t-111 -20q-66 0 -111 20t-97 77l-19 -13q40 -72 92 -111t135 -39t135.5 39t92.5 111z" />
+<glyph unicode="&#x263c;" horiz-adv-x="837" d="M791 218h-140q-9 -63 -45 -109l99 -99l-46 -46l-99 98q-48 -37 -108 -46v-138h-66v138q-61 9 -110 45l-98 -97l-46 46l97 98q-37 48 -46 109h-137v66h137q7 59 46 111l-97 97l46 46l98 -97q48 36 109 45v138h66v-138q61 -9 109 -46l99 98l46 -46l-98 -99q37 -49 44 -108 h140v-66zM587 252h1q0 70 -50 119.5t-119 49.5q-72 0 -122.5 -50t-50.5 -119q0 -72 50.5 -122t121.5 -50q70 0 119.5 50t49.5 122z" />
+<glyph unicode="&#x263d;" horiz-adv-x="641" d="M601 320q0 -167 -118.5 -284.5t-285.5 -117.5q-72 0 -157 37q154 1 260.5 106.5t106.5 258.5q0 154 -107 262.5t-260 108.5q74 37 157 37q167 0 285.5 -120t118.5 -288zM198 -43v-2q154 0 260 105.5t106 259.5q0 148 -102 255.5t-249 115.5v-3q104 -49 167.5 -148.5 t63.5 -219.5q0 -124 -66.5 -220t-179.5 -143z" />
+<glyph unicode="&#x263e;" horiz-adv-x="641" d="M601 -45q-74 -37 -157 -37q-167 0 -285.5 120t-118.5 288q0 167 118.5 284.5t285.5 117.5q72 0 157 -37q-154 -1 -260.5 -106.5t-106.5 -258.5q0 -154 107 -262.5t260 -108.5zM443 689v2q-154 0 -260 -105.5t-106 -259.5q0 -148 102 -255.5t249 -115.5v3 q-104 49 -167.5 148.5t-63.5 219.5q0 124 66.5 220t179.5 143z" />
+<glyph unicode="&#x263f;" horiz-adv-x="603" d="M466 702h68q-20 -105 -112 -160q53 -31 84.5 -85t31.5 -117q0 -90 -58 -157t-144 -79v-104h136v-66h-136v-132h-66v132h-139v66h139v104q-88 12 -146.5 79t-58.5 157q0 63 31.5 117t84.5 85q-92 55 -112 160h68q15 -56 61 -91.5t105 -35.5q57 0 102.5 35.5t60.5 91.5z M472 340q0 70 -49.5 119.5t-119.5 49.5q-72 0 -122 -50t-50 -119q0 -72 50 -122t122 -50q69 0 119 50t50 122z" />
+<glyph unicode="&#x2640;" horiz-adv-x="603" d="M270 63v104q-88 12 -146.5 79t-58.5 157q0 97 69.5 166t168.5 69q97 0 166 -69t69 -166q0 -90 -58 -156.5t-144 -79.5v-104h136v-66h-136v-132h-66v132h-139v66h139zM472 403q0 70 -49.5 119.5t-119.5 49.5q-72 0 -122 -50t-50 -119q0 -72 50 -122t122 -50q69 0 119 50 t50 122z" />
+<glyph unicode="&#x2641;" horiz-adv-x="603" d="M336 440v-104q86 -13 144 -79.5t58 -156.5q0 -97 -69 -166t-166 -69q-99 0 -168.5 69t-69.5 166q0 90 58.5 157t146.5 79v104h-139v66h139v132h66v-132h136v-66h-136zM472 100q0 72 -50 122t-119 50q-72 0 -122 -50t-50 -122q0 -69 50 -119t122 -50q70 0 119.5 49.5 t49.5 119.5z" />
+<glyph unicode="&#x2642;" horiz-adv-x="660" d="M620 399l-13 -32q-62 69 -99 137l-86 -201q48 -33 76.5 -84.5t28.5 -111.5q0 -99 -69 -168.5t-166 -69.5q-99 0 -168.5 69.5t-69.5 168.5q0 97 69.5 166t168.5 69q42 0 75 -13l86 200q-78 -23 -168 -26l13 33q165 45 219 98l22 -9q0 -96 81 -226zM461 107 q0 70 -49.5 119.5t-119.5 49.5q-72 0 -122 -50t-50 -119q0 -72 50 -122t122 -50q69 0 119 50t50 122z" />
+<glyph unicode="&#x2643;" horiz-adv-x="970" d="M904 0h-172v-176h-56v176h-601v51q6 1 18 1.5t16 0.5q86 6 156 55q89 62 149 163t60 204q0 85 -49.5 142t-133.5 57q-67 0 -118 -40.5t-51 -105.5q0 -66 73 -126q-11 -22 -27 -46q-102 60 -102 170q0 88 67 147t156 59q106 0 175 -71t69 -177q0 -123 -73.5 -239 t-186.5 -191h403v662h56v-662h172v-54z" />
+<glyph unicode="&#x2644;" horiz-adv-x="970" d="M809 -24h57q-9 -49 -51 -82.5t-92 -33.5q-67 0 -111 38.5t-44 104.5q0 51 41 175t41 162q0 57 -43.5 93.5t-101.5 36.5q-60 0 -128 -34.5t-103 -82.5v-353h-56v642h-155v55h155v96h56v-96h268v-55h-268v-211q121 94 229 94q82 0 141.5 -51.5t59.5 -132.5 q0 -26 -11.5 -72.5t-33 -116t-23.5 -77.5q-14 -51 -14 -69q0 -37 29 -64t66 -27q63 0 92 61z" />
+<glyph unicode="&#x2646;" horiz-adv-x="840" d="M780 644h-60v-170q0 -116 -78.5 -202t-193.5 -97v-119h108v-56h-108v-110h-56v110h-108v56h108v119q-115 11 -193.5 97t-78.5 202v170h-60l88 116l88 -116h-60v-170q0 -93 62 -162t154 -80v412h-60l88 116l88 -116h-60v-412q92 11 154 80t62 162v170h-60l88 116z" />
+<glyph unicode="&#x2647;" horiz-adv-x="632" d="M76 730h285q91 0 153 -57.5t62 -148.5t-62 -148t-153 -57h-229v-373h389v-56h-445v840zM132 375h232q63 0 109.5 42.5t46.5 106.5t-46.5 107t-109.5 43h-232v-299z" />
+<glyph unicode="&#x2648;" horiz-adv-x="964" d="M510 -110h-56q-1 41 -3.5 90.5t-10 132.5t-18.5 158t-32 157t-47 141t-65.5 97.5t-86.5 38.5q-41 0 -75.5 -32t-34.5 -97q0 -72 73 -126q-11 -22 -27 -46q-48 28 -75 74.5t-27 102.5q0 82 49.5 130.5t117.5 48.5q59 0 107 -36t78 -90t52.5 -129.5t34 -141t18.5 -137.5 q10 94 27 175t49 168.5t87 139t127 51.5q68 0 117.5 -48.5t49.5 -130.5q0 -56 -27 -102.5t-75 -74.5q-16 24 -27 46q73 54 73 126q0 65 -34.5 97t-75.5 32q-47 0 -86.5 -38.5t-65.5 -97.5t-47 -141t-32 -157t-18.5 -158t-10 -132.5t-3.5 -90.5z" />
+<glyph unicode="&#x2649;" horiz-adv-x="781" d="M738 643v-61q-13 0 -24 -8q-26 -18 -48 -59t-36.5 -80t-46.5 -78t-77 -55q54 -32 86 -86t32 -117q0 -98 -68.5 -168t-166.5 -70q-99 0 -168.5 69.5t-69.5 168.5q0 63 32 117.5t87 85.5q-44 16 -75 54t-45 76t-34.5 79.5t-45.5 60.5q-13 10 -27 10v61q49 0 80 -31.5 t49.5 -77t39.5 -90.5t65 -77t111 -32t111.5 32t66.5 77t41 90.5t50.5 77t80.5 31.5zM558 99q0 69 -50 119t-119 50q-70 0 -121 -49.5t-51 -119.5q0 -71 50.5 -121.5t121.5 -50.5q70 0 119.5 51t49.5 121z" />
+<glyph unicode="&#x2660;" d="M314 68h-12q-45 -64 -132 -64q-48 0 -92 49t-44 117q0 61 31 117.5t71 96.5l104 104q63 64 104 121q39 -58 100 -121l102 -104q42 -40 73.5 -96t31.5 -115q0 -82 -47.5 -125.5t-99.5 -43.5q-17 0 -29 1.5t-28 7.5t-31.5 19.5t-30.5 35.5h-10q0 -34 7 -65.5t25.5 -58 t46.5 -28.5v-15h-222v15q28 2 47.5 28t27 58t7.5 66z" />
+<glyph unicode="&#x2661;" d="M651 415q0 -50 -18 -101.5t-53 -105.5t-69 -98l-86 -108q-52 -64 -83 -107q-35 51 -100 133l-104 135q-39 52 -71.5 122t-32.5 129q0 86 47.5 137.5t109.5 51.5q45 0 86.5 -32t63.5 -111q30 81 68 112t86 31q70 0 113 -49.5t43 -138.5zM379 395h-73q-28 81 -53 111.5 t-70 30.5q-35 0 -59 -32.5t-24 -85.5q0 -71 55 -159t187 -257q128 141 185.5 239t57.5 177q0 56 -22.5 87t-61.5 31q-45 0 -70.5 -30.5t-51.5 -111.5z" />
+<glyph unicode="&#x2662;" d="M643 252q-163 -164 -300 -357q-121 158 -302 357q165 162 302 357q143 -191 300 -357zM533 251q0 25 -17 47q-41 37 -139 165q-15 20 -35 20q-18 0 -35 -22q-71 -94 -137 -165q-16 -16 -16 -44q0 -30 16 -46q69 -77 134 -164q15 -21 39 -21t39 21q66 87 135 160 q16 17 16 49z" />
+<glyph unicode="&#x2663;" d="M472 340l6 -6q10 6 24 6q62 0 105.5 -50.5t43.5 -116.5q0 -79 -43 -124t-102 -45q-39 0 -72.5 18.5t-47.5 45.5h-11q0 -34 7 -65.5t25.5 -58t46.5 -28.5v-15h-222v15q28 2 47.5 28.5t27 58.5t7.5 65h-11q-16 -28 -49 -46t-72 -18q-63 0 -105.5 46.5t-42.5 122.5 q0 75 43.5 121t108.5 46q4 0 12 -2t12 -2l6 7q-29 42 -29 99q0 63 48 112t112 49q63 0 108.5 -47.5t45.5 -110.5q0 -59 -29 -105z" />
+<glyph unicode="&#x2664;" d="M314 68h-10q-43 -63 -120 -63q-61 0 -105.5 45t-44.5 120q0 61 31 117.5t71 96.5l104 104q63 64 104 121q41 -56 104 -121l102 -104q40 -40 70.5 -97t30.5 -118q0 -77 -43.5 -121t-103.5 -44q-78 0 -119 64h-10q0 -34 7 -65.5t25.5 -58t46.5 -28.5v-15h-222v15 q28 2 47.5 28t27 58t7.5 66zM298 167h92q16 -46 47 -71.5t63 -25.5q36 0 60.5 28t24.5 80q0 65 -59.5 140.5t-181.5 185.5q-125 -112 -184.5 -185.5t-59.5 -140.5q0 -53 26 -80.5t63 -27.5q38 0 68.5 24.5t40.5 72.5z" />
+<glyph unicode="&#x2665;" d="M651 413q0 -61 -32 -132t-69 -119l-106 -136q-69 -86 -102 -131q-35 51 -100 133l-104 134q-39 52 -71.5 121.5t-32.5 128.5q0 86 47.5 138.5t109.5 52.5q45 0 86.5 -32t63.5 -111q30 81 68 112t86 31q69 0 112.5 -50.5t43.5 -139.5z" />
+<glyph unicode="&#x2666;" d="M643 252q-163 -164 -300 -357q-121 158 -302 357q165 162 302 357q143 -191 300 -357z" />
+<glyph unicode="&#x2667;" d="M472 340l6 -6q10 6 24 6q62 0 105.5 -50.5t43.5 -116.5q0 -79 -43 -124t-102 -45q-39 0 -72.5 18.5t-47.5 45.5h-11q0 -34 7 -65.5t25.5 -58t46.5 -28.5v-15h-222v15q28 2 47.5 28.5t27 58.5t7.5 65h-11q-16 -28 -49 -46t-72 -18q-63 0 -105.5 46.5t-42.5 122.5 q0 75 43.5 121t108.5 46q4 0 12 -2t12 -2l6 7q-29 42 -29 99q0 63 48 112t112 49q63 0 108.5 -47.5t45.5 -110.5q0 -59 -29 -105zM297 167h92q16 -47 43.5 -72t58.5 -25q39 0 66.5 25.5t27.5 73.5q0 45 -30.5 75t-77.5 30q-23 0 -58 -15l-35 74q24 23 37.5 50.5t13.5 47.5 q0 46 -23.5 76t-65.5 30q-43 0 -68 -31.5t-25 -74.5q0 -22 12.5 -49.5t37.5 -48.5l-35 -74q-36 15 -65 15q-48 0 -75.5 -29.5t-27.5 -75.5q0 -48 28 -73.5t67 -25.5q33 0 62.5 24.5t39.5 72.5z" />
+<glyph unicode="&#x2669;" horiz-adv-x="390" d="M345 714v-675q0 -64 -63.5 -114t-134.5 -50q-43 0 -72.5 24.5t-29.5 62.5q0 60 65.5 111.5t126.5 51.5q45 0 68 -8v597h40z" />
+<glyph unicode="&#x266a;" horiz-adv-x="560" d="M301 714h24q7 -39 38 -87.5t68 -96.5t48 -71q31 -49 31 -105q0 -35 -11 -80t-23 -64l-15 9q24 56 24 125q0 57 -43.5 108.5t-100.5 67.5v-473q0 -65 -52 -118.5t-139 -53.5q-43 0 -71.5 25t-28.5 58q0 64 65 115.5t135 51.5q31 0 51 -12v601z" />
+<glyph unicode="&#x266b;" horiz-adv-x="840" d="M721 842v-682q0 -71 -54.5 -125t-135.5 -54q-42 0 -71 25t-29 56q0 69 67.5 119t124.5 50q41 0 58 -14v531l-349 -105v-604q0 -61 -57.5 -112.5t-132.5 -51.5q-38 0 -70 22t-32 61q0 65 65 116t130 51q26 0 57 -10v599z" />
+<glyph unicode="&#x266d;" horiz-adv-x="426" d="M97 768v-318q24 31 56 44.5t57 13.5q63 0 99.5 -37t36.5 -104q0 -49 -9 -89t-35.5 -89.5t-83.5 -100t-143 -98.5h-18v755zM97 370v-307q61 41 101 98t54 106t14 96q0 43 -18 75.5t-54 32.5q-38 0 -67.5 -35t-29.5 -66z" />
+<glyph unicode="&#x266e;" horiz-adv-x="426" d="M350 -158l-40 -23v260l-235 -89v755l40 23v-260l235 89v-755zM310 164v332l-195 -74v-330z" />
+<glyph unicode="&#x266f;" horiz-adv-x="426" d="M386 95l-55 -17v-150l-40 -23v161l-155 -49v-175l-40 -23v186l-55 -17v85l55 17v335l-55 -17v85l55 17v149l40 23v-160l155 49v174l40 23v-185l55 17v-85l-55 -17v-335l55 17v-85zM291 151v335l-155 -49v-335z" />
+<glyph unicode="&#x267e;" horiz-adv-x="1186" d="M903 249q0 -73 -40 -128.5t-111 -55.5q-35 0 -65 18.5t-46.5 39t-39.5 56.5q-20 -30 -31 -45t-30.5 -34t-42.5 -27t-52 -8q-78 0 -119.5 55t-41.5 135q0 73 40 128.5t111 55.5q51 0 84 -29.5t67 -84.5q20 30 31 45t30.5 34t42.5 27t52 8q78 0 119.5 -55t41.5 -135z M870 260q0 49 -29.5 87t-76.5 38q-22 0 -42 -11t-33.5 -25t-27 -38.5t-19.5 -39.5l-17 -40q41 -88 129 -88q51 0 83.5 33t32.5 84zM562 278q-41 88 -129 88q-51 0 -83.5 -33t-32.5 -84q0 -49 29.5 -87t76.5 -38q22 0 42 11t33.5 25t27 38.5t20.5 39.5zM1116 252 q0 -106 -41.5 -203t-111.5 -167t-167 -111.5t-203 -41.5t-203 41.5t-167 111.5t-111.5 167t-41.5 203t41.5 203t111.5 167t167 111.5t203 41.5t203 -41.5t167 -111.5t111.5 -167t41.5 -203zM1050 252q0 188 -134.5 322.5t-322.5 134.5t-322.5 -134.5t-134.5 -322.5 t134.5 -322.5t322.5 -134.5t322.5 134.5t134.5 322.5z" />
+<glyph unicode="&#x2680;" horiz-adv-x="1032" d="M571 323q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM862 -23h-692v692h692v-692zM819 20v606h-606v-606h606z" />
+<glyph unicode="&#x2681;" horiz-adv-x="1032" d="M403 491q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM739 155q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM862 -23h-692v692h692v-692zM819 20v606h-606v-606h606z" />
+<glyph unicode="&#x2682;" horiz-adv-x="1032" d="M571 323q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM862 -23h-692v692h692v-692zM819 20v606h-606v-606h606zM403 491q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM739 155q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16 t39 -16t16 -39z" />
+<glyph unicode="&#x2683;" horiz-adv-x="1032" d="M403 491q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM739 155q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM862 -23h-692v692h692v-692zM819 20v606h-606v-606h606zM739 491q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16 t39 -16t16 -39zM403 155q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39z" />
+<glyph unicode="&#x2684;" horiz-adv-x="1032" d="M403 491q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM739 155q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM571 323q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM862 -23h-692v692h692v-692zM819 20v606 h-606v-606h606zM739 491q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM403 155q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39z" />
+<glyph unicode="&#x2685;" horiz-adv-x="1032" d="M739 491q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM403 155q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM403 491q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM739 155q0 -23 -16 -39t-39 -16t-39 16 t-16 39t16 39t39 16t39 -16t16 -39zM862 -23h-692v692h692v-692zM819 20v606h-606v-606h606zM739 323q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM403 323q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39z" />
+<glyph unicode="&#x2686;" horiz-adv-x="1032" d="M731 323q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM881 323q0 -152 -106.5 -258.5t-257.5 -106.5t-258 107t-107 258t106.5 257.5t258.5 106.5q151 0 257.5 -106.5t106.5 -257.5zM829 323q0 131 -90.5 221.5t-221.5 90.5t-222 -91t-91 -221 q0 -131 91 -222t222 -91q130 0 221 91t91 222z" />
+<glyph unicode="&#x2687;" horiz-adv-x="1032" d="M731 323q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39zM881 323q0 -152 -106.5 -258.5t-257.5 -106.5t-258 107t-107 258t106.5 257.5t258.5 106.5q151 0 257.5 -106.5t106.5 -257.5zM829 323q0 131 -90.5 221.5t-221.5 90.5t-222 -91t-91 -221 q0 -131 91 -222t222 -91q130 0 221 91t91 222zM412 323q0 -23 -16 -39t-39 -16t-39 16t-16 39t16 39t39 16t39 -16t16 -39z" />
+<glyph unicode="&#x2688;" horiz-adv-x="1032" d="M881 323q0 -152 -106.5 -258.5t-257.5 -106.5t-258 107t-107 258t106.5 257.5t258.5 106.5q151 0 257.5 -106.5t106.5 -257.5zM731 323q0 23 -16 39t-39 16t-39 -16t-16 -39t16 -39t39 -16t39 16t16 39z" />
+<glyph unicode="&#x2689;" horiz-adv-x="1032" d="M881 323q0 -152 -106.5 -258.5t-257.5 -106.5t-258 107t-107 258t106.5 257.5t258.5 106.5q151 0 257.5 -106.5t106.5 -257.5zM731 323q0 23 -16 39t-39 16t-39 -16t-16 -39t16 -39t39 -16t39 16t16 39zM412 323q0 23 -16 39t-39 16t-39 -16t-16 -39t16 -39t39 -16t39 16 t16 39z" />
+<glyph unicode="&#x26a0;" horiz-adv-x="1510" d="M1485 -155h-1460l721 1178zM156 -89h1198l-608 964zM738 176l-42 381q-3 30 -3 43q0 76 53 76q25 0 39 -22t14 -59q0 -16 -2 -38l-45 -381h-14zM799 42q0 -22 -15.5 -36.5t-38.5 -14.5t-37.5 14.5t-14.5 37.5t15.5 38.5t37.5 15.5t37.5 -16t15.5 -39z" />
+<glyph unicode="&#x26a5;" horiz-adv-x="660" d="M620 549l-13 -32q-62 69 -99 137l-86 -201q48 -33 76.5 -84.5t28.5 -111.5q0 -90 -58 -156.5t-144 -79.5v-104h136v-66h-136v-132h-66v132h-139v66h139v104q-88 12 -146.5 79t-58.5 157q0 97 69.5 166t168.5 69q42 0 75 -13l86 200q-78 -23 -168 -26l13 33q165 45 219 98 l22 -9q0 -96 81 -226zM461 257q0 70 -49.5 119.5t-119.5 49.5q-72 0 -122 -50t-50 -119q0 -72 50 -122t122 -50q69 0 119 50t50 122z" />
+<glyph unicode="&#x26aa;" horiz-adv-x="762" d="M712 252q0 -137 -97 -234t-234 -97t-234 97t-97 234t97 234t234 97t234 -97t97 -234zM646 252q0 110 -78 187.5t-187 77.5t-187 -77.5t-78 -187.5t78 -187.5t187 -77.5t187 77.5t78 187.5z" />
+<glyph unicode="&#x26ab;" horiz-adv-x="762" d="M712 252q0 -137 -97 -234t-234 -97t-234 97t-97 234t97 234t234 97t234 -97t97 -234z" />
+<glyph unicode="&#x26ac;" horiz-adv-x="565" d="M519 252q0 -99 -69 -168.5t-166 -69.5q-99 0 -168.5 69.5t-69.5 168.5q0 97 69.5 166t168.5 69q97 0 166 -69t69 -166zM453 252q0 70 -49.5 119.5t-119.5 49.5q-72 0 -122 -50t-50 -119q0 -72 50 -122t122 -50q69 0 119 50t50 122z" />
+<glyph unicode="&#x26b2;" horiz-adv-x="603" d="M270 -135v302q-88 12 -146.5 79.5t-58.5 156.5q0 98 70 166.5t168 68.5q97 0 166 -69t69 -166q0 -88 -57.5 -155.5t-144.5 -80.5v-302h-66zM472 403q0 69 -50 119t-119 50q-71 0 -121.5 -49.5t-50.5 -119.5q0 -71 50.5 -121.5t121.5 -50.5q70 0 119.5 50.5t49.5 121.5z " />
+<glyph unicode="&#x2702;" horiz-adv-x="961" d="M905 495l-365 -145l364 -142q-30 -41 -94 -41q-49 0 -132 33l-264 102l-50 -19q-40 -15 -65 -21q-17 -4 -42 -4q-15 0 -30 -16q0 -13 6 -31.5t6 -32.5q0 -46 -26 -71t-73 -25t-76 24t-29 68q0 52 33 80.5t86 28.5h97q35 0 61.5 19t33.5 53q-32 58 -98 58h-106 q-47 0 -77 27.5t-30 75.5q0 46 28 71t77 25q45 0 72 -25t27 -68q0 -15 -6 -37t-6 -27q3 -2 9 -7t10.5 -7.5t8.5 -2.5q30 0 44 -4q43 -11 115 -38l265 102q6 2 31 12t35 13.5t29.5 7.5t37.5 4q47 0 93 -40zM209 516q0 32 -20.5 49t-54.5 17q-33 0 -51 -18.5t-18 -50.5 q0 -30 22.5 -47.5t58.5 -17.5q63 0 63 68zM209 182q0 66 -63 66q-36 0 -58.5 -20.5t-22.5 -55.5q0 -29 21 -44.5t54 -15.5q69 0 69 70z" />
+<glyph unicode="&#x2709;" horiz-adv-x="690" d="M638 138h-604v417h604v-417zM620 178v336l-202 -153q2 -8 2 -12q0 -9 -1 -12zM614 537h-556l200 -159q23 52 79 52q54 0 77 -52zM614 156l-200 164q-21 -57 -77 -57q-27 0 -48.5 16.5t-31.5 40.5l-199 -164h556zM52 178l202 159q-1 5 -1 12t1 12l-202 153v-336z" />
+<glyph unicode="&#x2713;" horiz-adv-x="755" d="M704 690l-24 -27q-22 -25 -104 -132.5t-113 -153.5q-49 -71 -234 -366q-15 -23 -40 -23h-64q-18 0 -54.5 99t-36.5 138q0 17 15 26l60 33q12 6 25 6q11 0 22 -23.5t23 -54t23 -41.5l240 359q83 123 125 145q51 27 132 32z" />
+<glyph unicode="&#x2720;" horiz-adv-x="767" d="M714 430v-355q-144 154 -279 154h-28v-39q0 -78 36 -139.5t118 -137.5h-355q76 70 115 135.5t39 141.5v39h-29q-72 0 -128.5 -32t-149.5 -122v355q142 -154 278 -154h29v39q0 138 -154 277h355q-154 -142 -154 -275v-41h29q69 0 127 32t151 122z" />
+<glyph unicode="&#x272a;" horiz-adv-x="789" d="M733 252q0 -151 -98.5 -254.5t-249.5 -103.5q-146 0 -248 104.5t-102 253.5q0 150 102.5 255.5t249.5 105.5q149 0 247.5 -105t98.5 -256zM690 361h-232l-73 223l-74 -223h-237l189 -145l-79 -235l201 145l187 -142l-69 232z" />
+<glyph unicode="&#x2736;" horiz-adv-x="695" d="M447 252l195 -178q-43 8 -137.5 41.5t-107.5 37.5q-42 -206 -57 -261q-30 108 -57 261q-215 -75 -237 -78q-4 -1 -8 -1l194 178l-64 56l-76 70q-32 29 -57 57l247 -86q29 159 58 267q19 -76 57 -267l244 86q-8 -16 -33.5 -40.5t-79.5 -71.5z" />
+<glyph unicode="&#x273d;" horiz-adv-x="682" d="M341 295v-19q8 4 15.5 9.5t16 13t14 13t14.5 16.5t13 15.5t14 18t13 16.5q5 6 16.5 21t16.5 21t15.5 17t18 15t18.5 8t23 4q77 0 77 -68t-64 -86q-22 -6 -69.5 -14t-83 -17.5t-55.5 -26.5q21 -14 49.5 -22t70 -15t61.5 -12q45 -11 67.5 -31t22.5 -67q0 -67 -77 -67 q-21 0 -38 10t-25.5 20.5t-22.5 31.5t-21 29l-15 19q-10 14 -15 20l-15 16q-10 12 -17 18.5t-17.5 14.5t-20.5 14v-18q0 -47 32.5 -127t32.5 -102q0 -39 -22.5 -65.5t-53.5 -26.5t-52.5 25.5t-21.5 62.5q0 26 31.5 106.5t31.5 126.5v18q-40 -26 -92 -92q-8 -10 -22 -32 t-23.5 -34.5t-28 -23.5t-42.5 -11q-76 0 -76 68q0 49 26.5 69.5t72.5 27.5l24 4q18 3 25 4t22.5 4t24 5.5t21.5 6t21.5 7t18.5 8.5t18 10q-23 17 -57 27t-82.5 18.5t-69.5 13.5q-63 17 -63 85q0 69 77 69q20 0 37.5 -9.5t24.5 -17.5t22 -31.5t19 -28.5q57 -80 102 -102v19 q0 39 -31.5 117t-31.5 108q0 40 21.5 66t52.5 26t53.5 -26t22.5 -63q0 -32 -32.5 -110.5t-32.5 -117.5z" />
+<glyph unicode="&#x2772;" horiz-adv-x="488" d="M466 719l-212 -240v-452l211 -240h-52l-225 217v498l226 217h52z" />
+<glyph unicode="&#x2773;" horiz-adv-x="488" d="M300 4l-226 -217h-52l212 240v452l-211 240h52l225 -217v-498z" />
+<glyph unicode="&#x2780;" horiz-adv-x="788" d="M421 112h-60v359h-98v42h23q86 0 97 69h38v-470zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM698 350q0 131 -90.5 225.5t-218.5 94.5q-143 0 -231 -97.5t-88 -225.5q0 -136 93.5 -231 t223.5 -95q131 0 221 96.5t90 232.5z" />
+<glyph unicode="&#x2781;" horiz-adv-x="788" d="M294 422l-61 8q0 68 28 108q38 53 117 53q71 0 112.5 -39.5t41.5 -110.5q0 -37 -14 -69t-29 -48t-43 -41q-7 -6 -66 -47t-77 -74h223v-52h-281q-4 7 -4 19q0 21 6.5 40.5t13.5 32t24 28.5t25.5 22.5t31.5 21.5l29 20l36 26q11 9 28.5 27.5t25 40.5t7.5 49 q0 47 -22.5 74.5t-66.5 27.5q-85 0 -85 -117zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM698 350q0 131 -90.5 225.5t-218.5 94.5q-143 0 -231 -97.5t-88 -225.5q0 -136 93.5 -231t223.5 -95 q131 0 221 96.5t90 232.5z" />
+<glyph unicode="&#x2782;" horiz-adv-x="788" d="M302 455l-51 7q4 62 37 95.5t93 33.5q64 0 102 -34t38 -95q0 -77 -69 -104q83 -24 83 -117q0 -63 -40.5 -99t-107.5 -36q-142 0 -142 138l54 13q0 -50 20.5 -74.5t65.5 -24.5q41 0 63.5 23t22.5 66q0 88 -105 88q-19 0 -24 -1v44q5 -1 14 -1q105 0 105 84q0 78 -83 78 q-74 0 -76 -84zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM698 350q0 131 -90.5 225.5t-218.5 94.5q-143 0 -231 -97.5t-88 -225.5q0 -136 93.5 -231t223.5 -95q131 0 221 96.5t90 232.5z" />
+<glyph unicode="&#x2783;" horiz-adv-x="788" d="M523 229h-72v-117h-54v117h-201v61l202 294h53v-301h72v-54zM397 283v218l-148 -218h148zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM698 350q0 131 -90.5 225.5t-218.5 94.5 q-143 0 -231 -97.5t-88 -225.5q0 -136 93.5 -231t223.5 -95q131 0 221 96.5t90 232.5z" />
+<glyph unicode="&#x2784;" horiz-adv-x="788" d="M311 539v-135q25 41 95 41q66 0 101.5 -44t35.5 -115q0 -82 -39 -131t-116 -49q-60 0 -98.5 32.5t-38.5 87.5l53 12q0 -80 82 -80q97 0 97 133q0 50 -24.5 78t-63.5 28q-73 0 -89 -81h-43v275h239v-52h-191zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5 t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM698 350q0 131 -90.5 225.5t-218.5 94.5q-143 0 -231 -97.5t-88 -225.5q0 -136 93.5 -231t223.5 -95q131 0 221 96.5t90 232.5z" />
+<glyph unicode="&#x2785;" horiz-adv-x="788" d="M282 378v-28q12 30 41 48.5t68 18.5q63 0 95.5 -40.5t32.5 -108.5q0 -74 -35.5 -118t-104.5 -44q-85 0 -119 65t-34 176q0 243 164 243q100 0 117 -106l-51 -12q-7 35 -21 52.5t-48 17.5q-105 0 -105 -164zM465 259q0 110 -86 110q-44 0 -67.5 -28.5t-23.5 -75.5 q0 -51 24 -81t72 -30q81 0 81 105zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM698 350q0 131 -90.5 225.5t-218.5 94.5q-143 0 -231 -97.5t-88 -225.5q0 -136 93.5 -231t223.5 -95 q131 0 221 96.5t90 232.5z" />
+<glyph unicode="&#x2786;" horiz-adv-x="788" d="M534 582v-55q-150 -216 -185 -415h-65q26 132 70.5 223.5t125.5 192.5h-250v54h304zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM698 350q0 131 -90.5 225.5t-218.5 94.5q-143 0 -231 -97.5 t-88 -225.5q0 -136 93.5 -231t223.5 -95q131 0 221 96.5t90 232.5z" />
+<glyph unicode="&#x2787;" horiz-adv-x="788" d="M528 244q0 -66 -39.5 -102t-107.5 -36q-64 0 -102.5 38t-38.5 103q0 85 87 112q-69 33 -69 106q0 59 35.5 92t97.5 33q59 0 94 -33.5t35 -91.5q0 -80 -71 -105q79 -28 79 -116zM466 468q0 74 -77 74t-77 -77q0 -83 75 -83q79 0 79 86zM474 247q0 85 -93 85 q-42 0 -64.5 -24.5t-22.5 -66.5t24.5 -64.5t66.5 -22.5q40 0 64.5 25t24.5 68zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM698 350q0 131 -90.5 225.5t-218.5 94.5q-143 0 -231 -97.5 t-88 -225.5q0 -136 93.5 -231t223.5 -95q131 0 221 96.5t90 232.5z" />
+<glyph unicode="&#x2788;" horiz-adv-x="788" d="M477 320v25q-12 -30 -41 -48t-68 -18q-62 0 -95 41t-33 108q0 74 36 118t102 44q77 0 115 -55q40 -58 40 -184q0 -245 -163 -245q-97 0 -116 97l51 12q7 -30 21.5 -45.5t44.5 -15.5q106 0 106 166zM471 433q0 50 -24.5 79.5t-70.5 29.5q-82 0 -82 -107q0 -108 85 -108 q46 0 69 28.5t23 77.5zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM698 350q0 131 -90.5 225.5t-218.5 94.5q-143 0 -231 -97.5t-88 -225.5q0 -136 93.5 -231t223.5 -95q131 0 221 96.5 t90 232.5z" />
+<glyph unicode="&#x2789;" horiz-adv-x="788" d="M597 345q0 -242 -120 -242t-120 242q0 122 28.5 182.5t91.5 60.5q66 0 93 -59.5t27 -183.5zM537 345q0 108 -11 152.5t-49 44.5t-49 -44.5t-11 -152.5q0 -98 11 -147t49 -49t49 49t11 147zM290 112h-60v359h-82v42h7q85 0 97 69h38v-470zM733 345q0 -151 -98.5 -255 t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM698 350q0 131 -90.5 225.5t-218.5 94.5q-143 0 -231 -97.5t-88 -225.5q0 -136 93.5 -231t223.5 -95q131 0 221 96.5t90 232.5z" />
+<glyph unicode="&#x278a;" horiz-adv-x="788" d="M733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM433 112v482h-65q-4 -73 -87 -73h-30v-54h94v-355h88z" />
+<glyph unicode="&#x278b;" horiz-adv-x="788" d="M733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM535 174h-215q8 16 23.5 29.5t43 31t36.5 24.5q55 40 88 84t33 104q0 72 -45 112.5t-120 40.5q-76 0 -117 -43.5t-41 -130.5l85 -11q0 58 15 89.5 t57 31.5q74 0 74 -95q0 -70 -66 -118q-9 -6 -35 -25l-33 -24q-7 -5 -25.5 -20.5t-24.5 -22.5l-16 -21q-12 -14 -15 -25t-6.5 -26t-3.5 -32v-17h308v64z" />
+<glyph unicode="&#x278c;" horiz-adv-x="788" d="M733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM312 274l-79 -17q0 -155 152 -155q73 0 116 39.5t43 111.5q0 76 -71 113q59 30 59 102q0 65 -40 100.5t-107 35.5q-69 0 -108 -37t-39 -103 l80 -11q0 45 15 66t52 21q59 0 59 -73q0 -76 -77 -76q-27 0 -40 2v-62q30 2 45 2q84 0 84 -80q0 -81 -75 -81q-39 0 -54 25.5t-15 76.5z" />
+<glyph unicode="&#x278d;" horiz-adv-x="788" d="M385 295h-115l115 179v-179zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM538 231v64h-73v304h-74l-209 -303v-65h203v-119h80v119h73z" />
+<glyph unicode="&#x278e;" horiz-adv-x="788" d="M733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM319 254l-78 -19q0 -62 40 -97.5t106 -35.5q82 0 125.5 51t43.5 136q0 77 -40 121t-116 44q-38 0 -72 -18v94h186v64h-266v-280h71q16 76 74 76 q75 0 75 -98q0 -58 -17.5 -92t-66.5 -34q-65 0 -65 88z" />
+<glyph unicode="&#x278f;" horiz-adv-x="788" d="M452 264q0 -98 -67 -98q-42 0 -61.5 30t-19.5 77q0 42 19 68.5t58 26.5q71 0 71 -104zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM449 470l73 18q-21 117 -135 117q-63 0 -104.5 -39.5 t-57 -93.5t-15.5 -120q0 -250 171 -250q72 0 111.5 47.5t39.5 123.5q0 73 -36 116t-105 43q-51 0 -93 -38q0 147 92 147q21 0 33.5 -12t16.5 -23.5t9 -35.5z" />
+<glyph unicode="&#x2790;" horiz-adv-x="788" d="M733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM545 531v63h-327v-64h242q-154 -203 -190 -418h92q20 117 64 210.5t119 208.5z" />
+<glyph unicode="&#x2791;" horiz-adv-x="788" d="M455 473q0 -76 -68 -76q-32 0 -49 20t-17 54q0 74 70 74q31 0 47.5 -19t16.5 -53zM462 253q0 -87 -75 -87q-38 0 -59 22.5t-21 61.5t21 61t59 22q36 0 55.5 -21t19.5 -59zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105 q147 0 245.5 -104.5t98.5 -255.5zM542 250q0 44 -19.5 69.5t-54.5 46.5q63 29 63 105q0 62 -37.5 95.5t-102.5 33.5q-66 0 -106 -34t-40 -98q0 -68 63 -102q-81 -28 -81 -116q0 -71 43.5 -109.5t116.5 -38.5q65 0 105 37q50 48 50 111z" />
+<glyph unicode="&#x2792;" horiz-adv-x="788" d="M453 434q0 -42 -19 -68.5t-58 -26.5q-71 0 -71 104q0 98 67 98q42 0 61.5 -30t19.5 -77zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM308 237l-73 -18q21 -117 135 -117q63 0 104.5 39.5 t57 93.5t15.5 120q0 250 -171 250q-72 0 -111.5 -47.5t-39.5 -123.5q0 -73 36 -116t105 -43q51 0 93 38q0 -147 -92 -147q-21 0 -33.5 12t-16.5 23.5t-9 35.5z" />
+<glyph unicode="&#x2793;" horiz-adv-x="788" d="M538 350q0 -187 -58 -187q-20 0 -33.5 21.5t-19.5 55.5t-8 61.5t-2 55.5q0 25 2 52t8 60.5t18.5 54.5t31.5 21q61 0 61 -195zM733 345q0 -151 -98.5 -255t-246.5 -104q-149 0 -251 104.5t-102 254.5t103 255t251 105q147 0 245.5 -104.5t98.5 -255.5zM618 353 q0 44 -2 75.5t-10.5 66.5t-23 56t-40.5 35t-62 14q-38 0 -65 -14t-42 -35.5t-23.5 -57.5t-10.5 -68.5t-2 -80.5q0 -43 2.5 -75t11.5 -65t23.5 -53.5t40.5 -34t62 -13.5q45 0 74.5 19.5t43.5 57.5t18.5 77t4.5 96zM298 112v482h-63q-4 -73 -84 -73h-15v-54h76v-355h86z" />
+<glyph unicode="&#x279b;" horiz-adv-x="918" d="M288 433l213 -86q47 -19 96 -31.5t264 -63.5q-216 -51 -264.5 -64.5t-96.5 -32.5l-212 -85l100 171h-26q-12 0 -327 -12v45q312 -12 327 -12h27z" />
+<glyph unicode="&#x27c0;" d="M634 0h-584v584h66v-471l471 471l47 -47l-471 -471h471v-66z" />
+<glyph unicode="&#x27c1;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM843 28h-540l270 469zM729 94l-156 275l-154 -275h310zM995 -61l-422 739l-424 -739h846z" />
+<glyph unicode="&#x27c2;" horiz-adv-x="693" d="M641 0h-589v66h262v596h66v-596h261v-66z" />
+<glyph unicode="&#x27c3;" d="M625 251q0 -65 -44.5 -110t-109.5 -45t-110 45t-45 110t45 110t110 45q64 0 109 -45t45 -110zM570 251q0 41 -29.5 70.5t-69.5 29.5q-41 0 -70.5 -29.5t-29.5 -70.5t29.5 -70.5t70.5 -29.5q40 0 69.5 29.5t29.5 70.5zM625 -27h-298q-116 0 -191.5 82.5t-75.5 196.5 t76.5 195.5t193.5 81.5h295v-66h-295q-84 0 -144 -64.5t-60 -146.5t60.5 -147.5t144.5 -65.5h294v-66z" />
+<glyph unicode="&#x27c4;" d="M61 529h298q116 0 191.5 -82.5t75.5 -196.5t-76.5 -195.5t-193.5 -81.5h-295v66h295q84 0 144 64.5t60 146.5t-60.5 147.5t-144.5 65.5h-294v66zM370 251q0 -65 -45 -110t-110 -45q-64 0 -109 45t-45 110t44.5 110t109.5 45t110 -45t45 -110zM315 251q0 41 -29.5 70.5 t-70.5 29.5q-40 0 -69.5 -29.5t-29.5 -70.5t29.5 -70.5t69.5 -29.5q41 0 70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x27c5;" horiz-adv-x="455" d="M363 -98l37 -53q-41 -47 -105 -47q-70 0 -107 57t-37 134q0 64 17.5 139t38 134t38 135t17.5 141q0 46 -22 70t-51 24t-48.5 -19t-19.5 -47v-133h-66v135q0 56 40 93t96 37q58 0 97.5 -44.5t39.5 -114.5q0 -68 -17.5 -147t-38 -139t-38 -133t-17.5 -131q0 -56 20.5 -90.5 t57.5 -34.5q39 0 68 34z" />
+<glyph unicode="&#x27c6;" horiz-adv-x="455" d="M400 437h-66v133q0 28 -19 47t-49 19q-29 0 -51 -24t-22 -70q0 -65 17.5 -141t38 -135t38 -134t17.5 -139q0 -77 -37 -134t-107 -57q-64 0 -105 47l37 53q29 -34 68 -34q37 0 57.5 34.5t20.5 90.5q0 58 -17.5 131t-38 133t-38 139t-17.5 147q0 70 39.5 114.5t97.5 44.5 q56 0 96 -37t40 -93v-135z" />
+<glyph unicode="&#x27c7;" horiz-adv-x="620" d="M374 363q0 -29 -17.5 -46.5t-46.5 -17.5q-28 0 -45.5 19t-17.5 45q0 27 19 45t44 18t44.5 -18t19.5 -45zM589 536l-274 -565h-10l-274 565h65l214 -432l214 432h65z" />
+<glyph unicode="&#x27c8;" horiz-adv-x="966" d="M906 -25h-290q-116 0 -191.5 83t-75.5 197t76.5 196t193.5 82h287v-66h-287q-84 0 -144.5 -65t-60.5 -147t61 -148t145 -66h286v-66zM312 -25h-68l-184 558h67z" />
+<glyph unicode="&#x27c9;" horiz-adv-x="966" d="M906 533l-184 -558h-68l185 558h67zM60 533h287q117 0 193.5 -82t76.5 -196t-75.5 -197t-191.5 -83h-290v66h286q84 0 145 66t61 148t-60.5 147t-144.5 65h-287v66z" />
+<glyph unicode="&#x27cc;" horiz-adv-x="325" d="M325 752h-236q88 -111 118 -201t30 -237q0 -243 -77 -374q-27 -47 -116 -153l-24 20q59 76 88 151q45 119 45 348q0 160 -25.5 264.5t-107.5 216.5v19h305v-54z" />
+<glyph unicode="&#x27d0;" horiz-adv-x="1064" d="M1025 251l-492 -493l-494 494l493 492zM609 251q0 -30 -23.5 -52.5t-54.5 -22.5q-32 0 -54 22t-22 55q0 32 22.5 54.5t54.5 22.5q31 0 54 -23.5t23 -55.5zM932 251l-400 400l-400 -400l400 -400z" />
+<glyph unicode="&#x27d1;" horiz-adv-x="620" d="M589 -29h-65l-214 432l-214 -432h-65l274 565h10zM374 144q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5z" />
+<glyph unicode="&#x27d2;" horiz-adv-x="620" d="M572 536v-299q0 -118 -74.5 -193t-187.5 -75q-112 0 -187 76t-75 195v296h66v-296q0 -76 47 -133t116 -69v498h66v-499q70 13 116.5 70.5t46.5 133.5v295h66z" />
+<glyph unicode="&#x27d3;" d="M634 0h-584v66h518v518h66v-584zM406 292q0 -29 -17.5 -46.5t-46.5 -17.5q-28 0 -45.5 19t-17.5 45q0 27 19 45t44 18t44.5 -18t19.5 -45z" />
+<glyph unicode="&#x27d4;" d="M405 292q0 -27 -19 -45t-44 -18t-44.5 18t-19.5 45q0 29 17.5 46.5t46.5 17.5q28 0 45.5 -19t17.5 -45zM634 518h-518v-518h-66v584h584v-66z" />
+<glyph unicode="&#x27d5;" horiz-adv-x="1019" d="M965 -80l-351 285l-351 -285h-223v66h223v530h-223v66h223l351 -285l351 285v-662zM899 58v386l-239 -193zM568 251l-239 193v-386z" />
+<glyph unicode="&#x27d6;" horiz-adv-x="1019" d="M979 -80h-223l-351 285l-351 -285v662l351 -285l351 285h223v-66h-223v-530h223v-66zM690 58v386l-239 -193zM359 251l-239 193v-386z" />
+<glyph unicode="&#x27d7;" horiz-adv-x="1228" d="M1188 -80h-223l-351 285l-351 -285h-223v66h223v530h-223v66h223l351 -285l351 285h223v-66h-223v-530h223v-66zM899 58v386l-239 -193zM568 251l-239 193v-386z" />
+<glyph unicode="&#x27d8;" horiz-adv-x="866" d="M816 -213h-766v66h350v865h66v-865h350v-66z" />
+<glyph unicode="&#x27d9;" horiz-adv-x="866" d="M816 652h-350v-865h-66v865h-350v66h766v-66z" />
+<glyph unicode="&#x27da;" horiz-adv-x="1376" d="M1312 198h-491v-198h-66v662h66v-198h491v-66h-491v-134h491v-66zM621 0h-66v198h-491v66h491v134h-491v66h491v198h66v-662z" />
+<glyph unicode="&#x27db;" horiz-adv-x="1376" d="M621 0h-66v298h-491v66h491v298h66v-662zM1312 298h-491v-298h-66v662h66v-298h491v-66z" />
+<glyph unicode="&#x27dc;" horiz-adv-x="849" d="M799 220h-453q-11 -51 -52 -84t-94 -33q-62 0 -106 44t-44 106t44 106t106 44q53 0 94 -33t52 -84h453v-66zM300 253q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5t29.5 -70.5t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x27dd;" horiz-adv-x="1574" d="M1519 220h-1414v-163h-50v393h50v-164h1414v-66z" />
+<glyph unicode="&#x27de;" horiz-adv-x="1574" d="M1519 57h-50v163h-1414v66h1414v164h50v-393z" />
+<glyph unicode="&#x27df;" horiz-adv-x="502" d="M218 -121v518q-51 11 -84 52t-33 94q0 62 44 106t106 44t106 -44t44 -106q0 -53 -33 -94t-84 -52v-518h116v-66h-298v66h116zM351 543q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5t29.5 -70.5t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x27e0;" horiz-adv-x="790" d="M745 253l-351 -542l-349 542l350 542zM646 286l-251 388l-250 -388h501zM646 220h-501l249 -388z" />
+<glyph unicode="&#x27e1;" horiz-adv-x="764" d="M719 251q-102 -43 -198 -139.5t-139 -198.5q-43 102 -139 198.5t-198 139.5q102 43 198 139.5t139 198.5q43 -102 139 -198.5t198 -139.5zM589 251q-53 31 -114.5 93t-92.5 115q-31 -53 -92.5 -114.5t-114.5 -92.5q53 -32 114.5 -94t92.5 -115q31 53 92.5 115.5 t114.5 92.5z" />
+<glyph unicode="&#x27e2;" horiz-adv-x="803" d="M45 285h102q87 52 162.5 135.5t111.5 168.5q43 -102 139 -198.5t198 -139.5q-102 -43 -198 -139.5t-139 -198.5q-36 85 -111 169t-161 137h-104v66zM628 251q-53 31 -114.5 93t-92.5 115q-31 -53 -92.5 -114.5t-114.5 -92.5q53 -32 114.5 -94t92.5 -115q31 53 92.5 115.5 t114.5 92.5z" />
+<glyph unicode="&#x27e3;" horiz-adv-x="803" d="M758 219h-104q-86 -53 -161 -137t-111 -169q-43 102 -139 198.5t-198 139.5q102 43 198 139.5t139 198.5q36 -85 111.5 -168.5t162.5 -135.5h102v-66zM589 252q-53 31 -114.5 92.5t-92.5 114.5q-31 -53 -92.5 -115t-114.5 -93q53 -30 114.5 -92.5t92.5 -115.5 q31 53 92.5 115t114.5 94z" />
+<glyph unicode="&#x27e4;" horiz-adv-x="1182" d="M1137 -158h-820v378h-272v66h272v376h820v-820zM1071 -92v688h-688v-688h688z" />
+<glyph unicode="&#x27e5;" horiz-adv-x="1182" d="M1137 220h-272v-378h-820v820h820v-376h272v-66zM799 -92v688h-688v-688h688z" />
+<glyph unicode="&#x27e6;" horiz-adv-x="504" d="M482 -213h-294v930h294v-20h-67v-890h67v-20zM365 -193v890q-57 -2 -84 -22t-27 -75v-709q0 -45 28.5 -63t82.5 -21z" />
+<glyph unicode="&#x27e7;" horiz-adv-x="504" d="M316 -213h-294v20h67v890h-67v20h294v-930zM250 -96v709q0 45 -28.5 63t-82.5 21v-890q57 2 84 22t27 75z" />
+<glyph unicode="&#x27e8;" horiz-adv-x="400" d="M335 713l-192 -462l191 -464h-52l-205 454v20l206 452h52z" />
+<glyph unicode="&#x27e9;" horiz-adv-x="400" d="M323 240l-206 -453h-52l192 463l-191 463h52l205 -453v-20z" />
+<glyph unicode="&#x27ea;" horiz-adv-x="610" d="M545 719l-192 -466l191 -466h-52l-209 466l210 466h52zM335 719l-192 -466l191 -466h-52l-209 466l210 466h52z" />
+<glyph unicode="&#x27eb;" horiz-adv-x="610" d="M537 253l-210 -466h-52l192 466l-191 466h52zM327 253l-210 -466h-52l192 466l-191 466h52z" />
+<glyph unicode="&#x27ec;" horiz-adv-x="488" d="M466 719l-66 -71v-790l65 -71h-52l-235 217v498l236 217h52zM350 -88v682l-106 -115v-452z" />
+<glyph unicode="&#x27ed;" horiz-adv-x="488" d="M310 4l-236 -217h-52l66 71v790l-65 71h52l235 -217v-498zM244 27v452l-106 115v-682z" />
+<glyph unicode="&#x27ee;" horiz-adv-x="233" d="M211 -166l-16 -11q-40 31 -67 71.5t-41 76.5t-21.5 90.5t-8.5 89t-1 96.5q0 63 1 97.5t8 89.5t21 91.5t41.5 78t67.5 72.5l16 -11q-47 -60 -64 -119.5t-17 -142.5v-307q0 -83 17 -142.5t64 -119.5z" />
+<glyph unicode="&#x27ef;" horiz-adv-x="233" d="M22 665l16 11q40 -31 67.5 -72.5t41.5 -78t21 -91.5t8 -89.5t1 -97.5q0 -62 -1 -96.5t-8.5 -89t-21.5 -90.5t-41 -76.5t-67 -71.5l-16 11q47 60 64 119.5t17 142.5v307q0 83 -17 142.5t-64 119.5z" />
+<glyph unicode="&#x27f0;" horiz-adv-x="1033" d="M965 298l-13 -24q-55 20 -147 81v-511h-66v557q-22 16 -42 33l-37 33l-25 22v-645h-66v697q-34 23 -52 23q-22 0 -52 -23v-697h-66v642q-1 -1 -38.5 -33t-65.5 -52v-557h-66v512q-97 -63 -145 -81l-15 24q200 102 443 363h13q112 -125 217 -214.5t223 -149.5z" />
+<glyph unicode="&#x27f1;" horiz-adv-x="1033" d="M950 231l15 -24q-200 -102 -443 -363h-13q-112 125 -217 214.5t-223 149.5l13 24q55 -20 147 -81v511h66v-557q22 -16 42 -33l37 -33l25 -22v645h66v-697q34 -23 52 -23q22 0 52 23v697h66v-642q1 1 38.5 33t65.5 52v557h66v-512q97 63 145 81z" />
+<glyph unicode="&#x27f2;" horiz-adv-x="974" d="M54 546l24 13q19 -27 65 -108q13 -25 26 -25q11 0 17 9q47 88 137 139.5t189 51.5q153 0 261.5 -108.5t108.5 -263.5q0 -153 -108 -261.5t-263 -108.5q-112 0 -205 62t-136 165l59 26q36 -83 115 -135.5t168 -52.5q127 0 215.5 90t88.5 215q0 127 -89.5 216.5 t-215.5 89.5q-78 0 -147 -38t-110 -103q-2 -4 -2 -10q0 -8 6.5 -13.5t14.5 -5.5q7 0 21 6q53 27 118 46l12 -25q-178 -72 -258 -162l-10 4q-7 119 -102 287z" />
+<glyph unicode="&#x27f3;" horiz-adv-x="974" d="M896 559l24 -13q-95 -168 -102 -287l-10 -4q-80 90 -258 162l12 25q65 -19 118 -46q14 -6 21 -6q8 0 14.5 5.5t6.5 13.5q0 6 -2 10q-41 65 -110 103t-147 38q-126 0 -215.5 -89.5t-89.5 -216.5q0 -125 88.5 -215t215.5 -90q89 0 168 52.5t115 135.5l59 -26 q-43 -103 -136 -165t-205 -62q-155 0 -263 108.5t-108 261.5q0 155 108.5 263.5t261.5 108.5q99 0 189 -51.5t137 -139.5q6 -9 17 -9q13 0 26 25q46 81 65 108z" />
+<glyph unicode="&#x27f4;" horiz-adv-x="1200" d="M1147 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-119q-11 -120 -98 -200.5t-212 -80.5q-132 0 -219 76t-98 205h-161v66h161q12 119 100 201t217 82q124 0 211.5 -79.5t98.5 -203.5h120q8 0 17 7.5t9 14.5q0 11 -14 25q-49 47 -82 97 l20 19q125 -144 237 -191zM552 286h223q-11 87 -71.5 148.5t-151.5 68.5v-217zM502 286v217q-88 -9 -150 -69t-73 -148h223zM775 220h-223v-215q89 7 150.5 68t72.5 147zM502 5v215h-223q11 -87 72 -147t151 -68z" />
+<glyph unicode="&#x27f5;" horiz-adv-x="1574" d="M1519 220h-1277q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q113 48 237 191l20 -19q-29 -42 -81 -96q-14 -14 -14 -28q0 -20 26 -20h1276v-66z" />
+<glyph unicode="&#x27f6;" horiz-adv-x="1574" d="M1519 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-1276v66h1277q8 0 17 7.5t9 14.5q0 11 -14 25q-49 47 -82 97l20 19q125 -144 237 -191z" />
+<glyph unicode="&#x27f7;" horiz-adv-x="1574" d="M1519 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-1089q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q113 48 237 191l20 -19q-31 -44 -81 -96q-14 -14 -14 -28q0 -20 26 -20h1089q8 0 17 7.5t9 14.5 q0 11 -14 25q-48 46 -81 96l20 19q124 -143 236 -190z" />
+<glyph unicode="&#x27f8;" horiz-adv-x="1574" d="M1519 120h-1148q-12 0 -19 -7.5t-7 -14.5q0 -19 23 -42q32 -32 74 -81l-21 -20q-41 41 -93 85t-84 68l-100 75l-89 65v10l89 67l98 73q36 27 87 69.5t92 83.5l21 -20q-32 -37 -75 -82q-1 -2 -4.5 -5.5t-5 -4.5t-4 -4t-3 -4.5t-2 -4.5t-2 -5.5t-1 -5.5t-0.5 -7 q0 -7 7 -14.5t19 -7.5h1148v-66h-1292q-59 -34 -59 -67q0 -27 58 -67h1293v-66z" />
+<glyph unicode="&#x27f9;" horiz-adv-x="1574" d="M1519 258v-10l-89 -67l-98 -73q-36 -27 -87 -69.5t-92 -83.5l-21 20q32 37 75 82q1 2 4.5 5.5t5 4.5t4 4t3 4.5t2 4.5t2 5.5t1 5.5t0.5 7q0 7 -7 14.5t-19 7.5h-1148v66h1292q59 34 59 67q0 27 -58 67h-1293v66h1148q12 0 19 7.5t7 14.5q0 19 -23 42q-32 32 -74 81l21 20 q41 -41 93 -85t84 -68l100 -75z" />
+<glyph unicode="&#x27fa;" horiz-adv-x="1574" d="M1519 258v-10q-51 -34 -144 -108t-170 -150l-28 21l19 19l24 26q9 10 17.5 24t8.5 24q0 6 -1.5 9t-8 5t-20.5 2h-855q-21 0 -28 -3.5t-7 -14.5t7.5 -21.5t29.5 -32.5t33 -35l-23 -23q-83 78 -180.5 155.5t-137.5 102.5v10q165 118 318 259l23 -23q-7 -8 -28 -29 t-32.5 -36t-11.5 -24q0 -19 34 -19h858q14 0 21 6.5t7 14.5q0 15 -10.5 29.5t-30.5 32t-26 24.5l28 24q84 -77 179 -154.5t135 -104.5zM225 186h1122q59 34 59 67q0 27 -58 67h-1122q-58 -33 -59 -67q0 -27 58 -67z" />
+<glyph unicode="&#x27fb;" horiz-adv-x="1574" d="M1519 57h-50v163h-1226q-26 0 -26 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q111 46 237 192l20 -19q-35 -53 -82 -98q-14 -14 -14 -25q0 -8 7 -15t19 -7h1227v164h50v-393z" />
+<glyph unicode="&#x27fc;" horiz-adv-x="1574" d="M1519 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-1226v-163h-50v393h50v-164h1227q12 0 19 7t7 15q0 11 -14 25q-47 45 -82 98l20 19q126 -146 237 -192z" />
+<glyph unicode="&#x27fd;" horiz-adv-x="1574" d="M1519 -45h-50v165h-1098q-12 0 -19 -7.5t-7 -14.5q0 -19 23 -42q32 -32 74 -81l-21 -20q-41 41 -93 85t-84 68l-100 75l-89 65v10l89 67l98 73q36 27 87 69.5t92 83.5l21 -20q-32 -37 -75 -82q-1 -2 -4.5 -5.5t-5 -4.5t-4 -4t-3 -4.5t-2 -4.5t-2 -5.5t-1 -5.5t-0.5 -7 q0 -7 7 -14.5t19 -7.5h1098v165h50v-596zM1469 186v134h-1242q-59 -34 -59 -67q0 -27 58 -67h1243z" />
+<glyph unicode="&#x27fe;" horiz-adv-x="1574" d="M1519 258v-10l-89 -65l-100 -75q-32 -24 -84 -68t-93 -85l-21 20q42 49 74 81q23 23 23 42q0 7 -7 14.5t-19 7.5h-1098v-165h-50v596h50v-165h1098q12 0 19 7.5t7 14.5q0 9 -3.5 17t-5.5 10t-13 14q-43 45 -75 82l21 20q41 -41 92 -83.5t87 -69.5l98 -73zM105 186h1243 q58 40 58 67q0 33 -59 67h-1242v-134z" />
+<glyph unicode="&#x27ff;" horiz-adv-x="1574" d="M1519 258v-10q-113 -47 -237 -190l-20 19q31 47 82 96q14 14 14 25q0 6 -9 14t-15 8h-57l-92 -106l-124 172l-119 -172l-124 172l-119 -172l-124 172l-119 -172l-124 172l-119 -172l-89 106h-69v66h98l60 -66l119 174l124 -174l119 174l124 -174l119 174l124 -174 l119 174l124 -174l60 66h86q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19q123 -142 238 -191z" />
+<glyph unicode="&#x2900;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-15q-83 -50 -181 -163l-20 19q33 50 82 97q14 14 14 25q0 6 -8 13t-16 9h-168v-163h-50v163h-266v66h266v164h50v-164h169q10 0 16 6t6 14q0 14 -14 28q-51 53 -82 97l20 19 q100 -115 183 -164h13q26 0 26 20q0 14 -14 28q-51 53 -82 97l20 19q125 -144 238 -192z" />
+<glyph unicode="&#x2901;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-15q-83 -50 -181 -163l-20 19q33 50 82 97q14 14 14 25q0 6 -8 13t-16 9h-135v-163h-50v163h-79v-163h-50v163h-171v66h171v164h50v-164h79v164h50v-164h136q10 0 16 6t6 14 q0 14 -14 28q-51 53 -82 97l20 19q100 -115 183 -164h13q26 0 26 20q0 14 -14 28q-51 53 -82 97l20 19q125 -144 238 -192z" />
+<glyph unicode="&#x2902;" horiz-adv-x="926" d="M871 120h-257v-145h-50v145h-193q-12 0 -19 -7.5t-7 -14.5q0 -19 23 -42q32 -32 74 -81l-21 -20q-41 41 -93 85t-84 68l-100 75l-89 65v10l89 67l98 73q36 27 87 69.5t92 83.5l21 -20q-32 -37 -75 -82q-1 -2 -4.5 -5.5t-5 -4.5t-4 -4t-3 -4.5t-2 -4.5t-2 -5.5t-1 -5.5 t-0.5 -7q0 -7 7 -14.5t19 -7.5h193v144h50v-144h257v-66h-257v-134h257v-66zM564 186v134h-337q-59 -34 -59 -67q0 -27 58 -67h338z" />
+<glyph unicode="&#x2903;" horiz-adv-x="926" d="M871 258v-10l-89 -65l-100 -75q-32 -24 -84 -68t-93 -85l-21 20q42 49 74 81q23 23 23 42q0 7 -7 14.5t-19 7.5h-193v-145h-50v145h-257v66h257v134h-257v66h257v144h50v-144h193q12 0 19 7.5t7 14.5q0 9 -3.5 17t-5.5 10t-13 14q-43 45 -75 82l21 20q41 -41 92 -83.5 t87 -69.5l98 -73zM362 186h338q58 40 58 67q0 33 -59 67h-337v-134z" />
+<glyph unicode="&#x2904;" horiz-adv-x="926" d="M906 258v-10q-51 -34 -144 -108t-170 -150l-28 21l19 19l24 26q9 10 17.5 24t8.5 24q0 6 -1.5 9t-8 5t-20.5 2h-115v-165h-50v165h-112q-21 0 -28 -3.5t-7 -14.5t7.5 -21.5t29.5 -32.5t33 -35l-23 -23q-83 78 -180.5 155.5t-137.5 102.5v10q165 118 318 259l23 -23 q-7 -8 -28 -29t-32.5 -36t-11.5 -24q0 -19 34 -19h115v165h50v-165h115q14 0 21 6.5t7 14.5q0 15 -10.5 29.5t-30.5 32t-26 24.5l28 24q84 -77 179 -154.5t135 -104.5zM488 186h246q59 34 59 67q0 27 -58 67h-247v-134zM438 186v134h-247q-58 -33 -59 -67q0 -27 58 -67h248z " />
+<glyph unicode="&#x2905;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-15q-83 -50 -181 -163l-20 19q33 50 82 97q14 14 14 25q0 6 -8 13t-16 9h-435v-163h-50v393h50v-164h436q10 0 16 6t6 14q0 14 -14 28q-51 53 -82 97l20 19q100 -115 183 -164h13 q26 0 26 20q0 14 -14 28q-51 53 -82 97l20 19q125 -144 238 -192z" />
+<glyph unicode="&#x2906;" horiz-adv-x="926" d="M871 -25h-50v145h-450q-12 0 -19 -7.5t-7 -14.5q0 -19 23 -42q32 -32 74 -81l-21 -20q-41 41 -93 85t-84 68l-100 75l-89 65v10l89 67l98 73q36 27 87 69.5t92 83.5l21 -20q-32 -37 -75 -82q-1 -2 -4.5 -5.5t-5 -4.5t-4 -4t-3 -4.5t-2 -4.5t-2 -5.5t-1 -5.5t-0.5 -7 q0 -7 7 -14.5t19 -7.5h450v144h50v-555zM821 186v134h-594q-59 -34 -59 -67q0 -27 58 -67h595z" />
+<glyph unicode="&#x2907;" horiz-adv-x="926" d="M871 258v-10l-89 -65l-100 -75q-32 -24 -84 -68t-93 -85l-21 20q42 49 74 81q23 23 23 42q0 7 -7 14.5t-19 7.5h-450v-145h-50v555h50v-144h450q12 0 19 7.5t7 14.5q0 9 -3.5 17t-5.5 10t-13 14q-43 45 -75 82l21 20q41 -41 92 -83.5t87 -69.5l98 -73zM105 186h595 q58 40 58 67q0 33 -59 67h-594v-134z" />
+<glyph unicode="&#x2908;" horiz-adv-x="511" d="M452 320h-163v-289q0 -8 7.5 -17t14.5 -9q11 0 25 14q49 51 96 82l19 -20q-143 -124 -190 -237h-10q-48 113 -192 238l19 20q44 -31 97 -82q14 -14 28 -14q20 0 20 26v288h-163v50h163v292h66v-292h163v-50z" />
+<glyph unicode="&#x2909;" horiz-adv-x="511" d="M452 424l-19 -20q-44 31 -97 82q-14 14 -28 14q-20 0 -20 -26v-288h163v-50h-163v-292h-66v292h-163v50h163v289q0 8 -7.5 17t-14.5 9q-11 0 -25 -14q-49 -51 -96 -82l-19 20q143 124 190 237h10q48 -113 192 -238z" />
+<glyph unicode="&#x290a;" horiz-adv-x="926" d="M854 298l-15 -23q-67 41 -140 99h-3v-530h-66v577q-35 30 -86 81q-14 14 -28 14q-20 0 -20 -26v-646h-66v645q0 14 -6.5 21t-15.5 7q-12 0 -25 -14q-37 -43 -87 -81v-578h-66v531h-1q-64 -52 -142 -99l-16 23q240 159 387 363h10q137 -199 386 -364z" />
+<glyph unicode="&#x290b;" horiz-adv-x="926" d="M839 230l16 -23q-240 -159 -387 -363h-10q-137 199 -386 364l15 23q67 -41 140 -99h3v530h66v-577q35 -30 86 -81q14 -14 28 -14q20 0 20 26v646h66v-645q0 -14 6.5 -21t15.5 -7q12 0 25 14q37 43 87 81v578h66v-531h1q64 52 142 99z" />
+<glyph unicode="&#x290c;" horiz-adv-x="926" d="M871 220h-262v66h262v-66zM505 220h-263q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h262v-66z" />
+<glyph unicode="&#x290d;" horiz-adv-x="926" d="M871 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-262v66h263q8 0 17 7.5t9 14.5q0 11 -14 25q-49 47 -82 97l20 19q125 -144 237 -191zM317 220h-262v66h262v-66z" />
+<glyph unicode="&#x290e;" horiz-adv-x="926" d="M871 220h-154v66h154v-66zM633 220h-154v66h154v-66zM395 220h-153q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h152v-66z" />
+<glyph unicode="&#x290f;" horiz-adv-x="926" d="M871 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-152v66h153q8 0 17 7.5t9 14.5q0 11 -14 25q-49 47 -82 97l20 19q125 -144 237 -191zM447 220h-154v66h154v-66zM209 220h-154v66h154v-66z" />
+<glyph unicode="&#x2910;" horiz-adv-x="1412" d="M1357 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-15q-83 -50 -181 -163l-20 19q33 50 83 98q13 13 13 24q0 6 -8.5 14t-15.5 8v66q23 0 23 20q0 14 -14 28q-54 56 -82 96l20 19q98 -113 183 -163h14q25 0 25 20q0 14 -14 28 q-54 56 -82 96l20 19q123 -142 238 -191zM942 220h-144v66h144v-66zM714 220h-144v66h144v-66zM486 220h-144v66h144v-66zM258 286v-66q-85 -51 -182 -163l-20 19q15 23 82 97q28 34 28 80q0 43 -29 81q-11 14 -40 46t-42 50l20 19q96 -110 183 -163z" />
+<glyph unicode="&#x2911;" horiz-adv-x="926" d="M873 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 19 -15 19t-23 10t-8 26t8 26t23 10q14 0 14 17q0 14 -14 28q-50 52 -81 96l20 19q124 -143 237 -191zM616 254q0 -16 -10.5 -26.5t-25.5 -10.5t-26 10.5t-11 26.5q0 15 11 25.5t26 10.5t25.5 -10.5 t10.5 -25.5zM495 254q0 -16 -11 -26.5t-26 -10.5q-14 0 -25 10.5t-11 26.5q0 15 11 25.5t25 10.5q15 0 26 -10.5t11 -25.5zM372 253q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5zM250 254q0 -16 -11 -26.5t-25 -10.5 q-15 0 -26 10.5t-11 26.5q0 15 11 25.5t26 10.5q14 0 25 -10.5t11 -25.5zM128 254q0 -16 -11 -26.5t-26 -10.5t-25.5 10.5t-10.5 26.5q0 15 10.5 25.5t25.5 10.5t26 -10.5t11 -25.5z" />
+<glyph unicode="&#x2912;" horiz-adv-x="511" d="M452 424l-19 -20q-40 28 -96 82q-14 14 -28 14q-20 0 -20 -26v-630h-66v630q0 12 -6.5 19t-15.5 7q-11 0 -25 -14q-46 -48 -96 -81l-19 20q115 100 165 187h-167v50h391v-50h-164q52 -90 166 -188z" />
+<glyph unicode="&#x2913;" horiz-adv-x="511" d="M452 -156h-391v50h164q-52 90 -166 188l19 20q40 -28 96 -82q14 -14 28 -14q20 0 20 26v630h66v-630q0 -12 7 -19t15 -7q11 0 25 14q46 48 96 81l19 -20q-115 -100 -165 -187h167v-50z" />
+<glyph unicode="&#x2914;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-231v-163h-50v163h-146q-83 -50 -181 -163l-20 19q15 23 82 97q28 34 28 80q0 43 -29 81q-12 15 -41 47t-41 50l20 19q98 -112 183 -164h145v164h50v-164h230q26 0 26 20 q0 14 -14 28q-51 53 -82 97l20 19q125 -144 238 -192z" />
+<glyph unicode="&#x2915;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-153v-163h-50v163h-79v-163h-50v163h-95q-83 -50 -181 -163l-20 19q15 23 82 97q28 34 28 80q0 43 -29 81q-12 15 -41 47t-41 50l20 19q98 -112 183 -164h94v164h50v-164h79v164h50 v-164h152q26 0 26 20q0 14 -14 28q-51 53 -82 97l20 19q125 -144 238 -192z" />
+<glyph unicode="&#x2916;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-16q-83 -50 -181 -163l-20 19q33 50 82 97q14 14 14 25q0 7 -7 14.5t-17 7.5h-282q-83 -50 -181 -163l-20 19q15 23 82 97q28 34 28 80q0 43 -29 81q-11 14 -40 46t-42 50l20 19 q96 -110 183 -163h281q10 0 16.5 6.5t6.5 13.5q0 14 -14 28q-54 56 -82 96l20 19q98 -113 183 -163h14q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19q123 -142 238 -191z" />
+<glyph unicode="&#x2917;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-16q-83 -50 -181 -163l-20 19q33 50 82 97q14 14 14 25q0 7 -7 14.5t-17 7.5h-145v-163h-50v163h-87q-83 -50 -181 -163l-20 19q15 23 82 97q28 34 28 80q0 43 -29 81 q-12 15 -41 47t-41 50l20 19q98 -112 183 -164h86v164h50v-164h145q10 0 16.5 6.5t6.5 13.5q0 14 -14 28q-51 53 -82 97l20 19q100 -115 183 -164h14q26 0 26 20q0 14 -14 28q-51 53 -82 97l20 19q125 -144 238 -192z" />
+<glyph unicode="&#x2918;" horiz-adv-x="926" d="M876 258v-10q-45 -19 -89 -53.5t-69.5 -61t-68.5 -76.5l-20 19q37 55 80 97q14 14 14 25q0 7 -8.5 14.5t-16.5 7.5q-36 -20 -69.5 -49t-52.5 -51l-54 -63l-20 19q37 55 80 97q14 14 14 25q0 7 -7 14.5t-17 7.5h-121v-163h-50v163h-59v-163h-50v163h-51q-33 -20 -65.5 -49 t-51.5 -51l-53 -63l-20 19q31 45 75 94q29 35 29 83q0 42 -30 81l-25 32l-28 34q-12 16 -22 31l20 19l54 -64q19 -20 52 -50t66 -50h50v164h50v-164h59v164h50v-164h121q10 0 16.5 6.5t6.5 13.5q0 14 -14 28q-41 42 -79 97l20 19l54 -64q18 -20 52.5 -50t69.5 -50 q24 0 24 20q0 14 -14 28q-44 46 -80 97l20 19q43 -50 69 -77t70 -61.5t89 -53.5z" />
+<glyph unicode="&#x2919;" horiz-adv-x="926" d="M871 76l-20 -19q-96 110 -183 163h-613v66h614q83 50 181 163l20 -19q-15 -23 -82 -97q-28 -34 -28 -80q0 -43 29 -81q11 -14 40 -46t42 -50z" />
+<glyph unicode="&#x291a;" horiz-adv-x="926" d="M871 220h-614q-83 -50 -181 -163l-20 19q15 23 82 97q28 34 28 80q0 43 -29 81q-11 14 -40 46t-42 50l20 19q96 -110 183 -163h613v-66z" />
+<glyph unicode="&#x291b;" horiz-adv-x="926" d="M871 76l-20 -19q-96 110 -183 163h-19q-21 -3 -21 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-95 109 -184 163h-465v66h466q84 49 182 163l20 -19q-33 -50 -82 -97q-14 -14 -14 -25q0 -7 7.5 -14t15.5 -8h19q83 50 181 163l20 -19q-15 -23 -82 -97q-28 -34 -28 -80 q0 -43 29 -81q11 -14 40 -46t42 -50z" />
+<glyph unicode="&#x291c;" horiz-adv-x="926" d="M871 220h-466q-84 -49 -182 -163l-20 19q33 50 82 97q14 14 14 25q0 7 -7.5 14t-15.5 8h-19q-83 -50 -181 -163l-20 19q15 23 82 97q28 34 28 80q0 43 -29 81q-11 14 -40 46t-42 50l20 19q96 -110 183 -163h19q21 3 21 20q0 14 -14 28q-54 56 -82 96l20 19 q95 -109 184 -163h465v-66z" />
+<glyph unicode="&#x291d;" horiz-adv-x="926" d="M871 220h-418q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-126 146 -237 192v10q116 50 238 190l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h417v-66zM261 259v-10q-53 -39 -98 -98h-10q-47 59 -98 98v10q59 45 98 98h10q17 -23 46 -52 t52 -46z" />
+<glyph unicode="&#x291e;" horiz-adv-x="926" d="M871 259v-10q-59 -45 -98 -98h-10q-17 23 -46 52t-52 46v10q53 39 98 98h10q47 -59 98 -98zM660 259v-10q-113 -48 -238 -192l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-417v66h418q8 0 17 7.5t9 14.5q0 11 -14 25q-49 47 -82 97l20 19q124 -143 237 -190z" />
+<glyph unicode="&#x291f;" horiz-adv-x="926" d="M871 57h-50v163h-368q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-126 146 -237 192v10q115 49 238 191l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -20 26 -20h367v164h50v-393zM261 259v-10q-53 -39 -98 -98h-10q-47 59 -98 98v10q59 45 98 98h10 q17 -23 46 -52t52 -46z" />
+<glyph unicode="&#x2920;" horiz-adv-x="926" d="M871 259v-10q-59 -45 -98 -98h-10q-17 23 -46 52t-52 46v10q53 39 98 98h10q47 -59 98 -98zM660 259v-10q-113 -48 -238 -192l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-367v-163h-50v393h50v-164h368q8 0 17 7.5t9 14.5q0 11 -14 25q-47 45 -82 98l20 19 q125 -144 237 -191z" />
+<glyph unicode="&#x2921;" horiz-adv-x="926" d="M871 -149l-7 -7q-91 37 -216 37q-29 0 -87 -4l-1 28q47 8 126 10q35 0 35 23q0 9 -10 19l-544 546q-7 7 -21 7q-20 0 -20 -32q0 -77 -10 -126l-28 1q4 60 4 91q0 122 -37 211l7 7q91 -37 216 -37q29 0 87 4l1 -28q-47 -8 -126 -10q-35 0 -35 -23q0 -9 10 -19l544 -546 q7 -7 21 -7q20 0 20 32q0 77 10 126l28 -1q-4 -60 -4 -91q0 -122 37 -211z" />
+<glyph unicode="&#x2922;" horiz-adv-x="926" d="M866 660l7 -7q-37 -91 -37 -216q0 -29 4 -87l-28 -1q-8 47 -10 126q0 35 -23 35q-9 0 -19 -10l-546 -544q-7 -7 -7 -21q0 -20 32 -20q77 0 126 -10l-1 -28q-60 4 -91 4q-122 0 -211 -37l-7 7q37 91 37 216q0 29 -4 87l28 1q8 -47 10 -126q0 -35 23 -35q9 0 19 10l546 544 q7 7 7 21q0 20 -32 20q-77 0 -126 10l1 28q60 -4 91 -4q122 0 211 37z" />
+<glyph unicode="&#x2923;" horiz-adv-x="926" d="M231 555l572 -471q68 -56 68 -120q0 -54 -36.5 -87t-86.5 -33q-53 0 -84 31l-60 49l45 52l61 -51q15 -15 43 -15q20 0 36 14t16 40q0 18 -7.5 31t-29.5 32l-586 482q-6 5 -12 5q-23 0 -23 -47q0 -5 1 -23.5t1 -25.5q0 -38 -3 -60l-29 -2q-3 62 -6.5 103.5t-17.5 97.5 t-38 98l6 7q82 -21 144 -21q74 0 164 17l4 -29q-74 -19 -127 -27q-26 -3 -26 -25q0 -12 11 -22z" />
+<glyph unicode="&#x2924;" horiz-adv-x="926" d="M865 662l6 -7q-34 -61 -46 -132t-16 -167l-29 2q-3 22 -3 60q0 7 1 25.5t1 23.5q0 47 -23 47q-6 0 -12 -5l-586 -482q-22 -19 -29.5 -32t-7.5 -31q0 -26 16 -40t36 -14q28 0 43 15l61 51l45 -52l-60 -49q-31 -31 -84 -31q-50 0 -86.5 33t-36.5 87q0 64 68 120l572 471 q11 10 11 22q0 22 -26 25q-53 8 -127 27l4 29q90 -17 164 -17q62 0 144 21z" />
+<glyph unicode="&#x2925;" horiz-adv-x="926" d="M871 -149l-6 -7q-82 21 -144 21q-74 0 -164 -17l-4 29q74 19 127 27q26 3 26 25q0 12 -11 22l-572 471q-68 56 -68 120q0 54 36.5 87t86.5 33q53 0 84 -31l60 -49l-45 -52l-61 51q-15 15 -43 15q-20 0 -36 -14t-16 -40q0 -18 7.5 -31t29.5 -32l586 -482q6 -5 12 -5 q23 0 23 47q0 5 -1 23.5t-1 25.5q0 38 3 60l29 2q3 -62 6.5 -103.5t17.5 -97.5t38 -98z" />
+<glyph unicode="&#x2926;" horiz-adv-x="926" d="M604 582l60 49q31 31 84 31q50 0 86.5 -33t36.5 -87q0 -64 -68 -120l-572 -471q-11 -10 -11 -22q0 -22 26 -25q53 -8 127 -27l-4 -29q-90 17 -164 17q-62 0 -144 -21l-6 7q34 61 46 132t16 167l29 -2q3 -22 3 -60q0 -7 -1 -25.5t-1 -23.5q0 -47 23 -47q6 0 12 5l586 482 q22 19 29.5 32t7.5 31q0 26 -16 40t-36 14q-28 0 -43 -15l-61 -51z" />
+<glyph unicode="&#x2927;" horiz-adv-x="926" d="M866 662l7 -7q-37 -91 -37 -216q0 -29 4 -87l-28 -1q-10 57 -10 126q0 35 -23 35q-9 0 -19 -10l-250 -250l361 -361l-47 -47l-361 361l-361 -361l-47 47l361 361l-249 251q-7 7 -21 7q-20 0 -20 -32q0 -77 -10 -126l-28 1q4 60 4 91q0 122 -37 211l7 7q91 -37 216 -37 q29 0 87 4l1 -28q-47 -8 -126 -10q-35 0 -35 -23q0 -9 10 -19l248 -250l251 251q7 7 7 21q0 20 -32 20q-77 0 -126 10l1 28q60 -4 91 -4q122 0 211 37z" />
+<glyph unicode="&#x2928;" horiz-adv-x="926" d="M871 -149l-7 -7q-91 37 -216 37q-29 0 -87 -4l-1 28q57 10 126 10q35 0 35 23q0 9 -10 19l-250 250l-361 -361l-47 47l361 361l-361 361l47 47l361 -361l251 249q7 7 7 21q0 20 -32 20q-77 0 -126 10l1 28q60 -4 91 -4q122 0 211 37l7 -7q-37 -91 -37 -216q0 -29 4 -87 l-28 -1q-8 47 -10 126q0 35 -23 35q-9 0 -19 -10l-250 -248l251 -251q7 -7 21 -7q20 0 20 32q0 77 10 126l28 -1q-4 -60 -4 -91q0 -122 37 -211z" />
+<glyph unicode="&#x2929;" horiz-adv-x="926" d="M871 -149l-7 -7q-91 37 -216 37q-29 0 -87 -4l-1 28q47 8 126 10q35 0 35 23q0 9 -10 19l-248 250l-251 -251q-7 -7 -7 -21q0 -20 32 -20q77 0 126 -10l-1 -28q-60 4 -91 4q-122 0 -211 -37l-7 7q37 91 37 216q0 29 -4 87l28 1q10 -57 10 -126q0 -35 23 -35q9 0 19 10 l250 250l-361 361l47 47l361 -361l361 361l47 -47l-361 -361l249 -251q7 -7 21 -7q20 0 20 32q0 77 10 126l28 -1q-4 -60 -4 -91q0 -122 37 -211z" />
+<glyph unicode="&#x292a;" horiz-adv-x="926" d="M873 -109l-47 -47l-361 361l-251 -249q-7 -7 -7 -21q0 -20 32 -20q77 0 126 -10l-1 -28q-60 4 -91 4q-122 0 -211 -37l-7 7q37 91 37 216q0 29 -4 87l28 1q8 -47 10 -126q0 -35 23 -35q9 0 19 10l250 248l-251 251q-7 7 -21 7q-20 0 -20 -32q0 -77 -10 -126l-28 1 q4 60 4 91q0 122 -37 211l7 7q91 -37 216 -37q29 0 87 4l1 -28q-57 -10 -126 -10q-35 0 -35 -23q0 -9 10 -19l250 -250l361 361l47 -47l-361 -361z" />
+<glyph unicode="&#x292b;" horiz-adv-x="926" d="M402 361l-47 -47l-300 301l47 47zM871 615l-769 -771l-47 47l769 771zM871 -109l-47 -47l-300 301l47 47z" />
+<glyph unicode="&#x292c;" horiz-adv-x="926" d="M871 615l-300 -301l-47 47l300 301zM871 -109l-47 -47l-769 771l47 47zM402 145l-300 -301l-47 47l300 301z" />
+<glyph unicode="&#x292d;" horiz-adv-x="926" d="M864 662l7 -7q-37 -91 -37 -216q0 -29 4 -87l-28 -1q-8 47 -10 126q0 35 -23 35q-9 0 -19 -10l-187 -188l-47 47l188 189q7 7 7 21q0 20 -32 20q-77 0 -126 10l1 28q60 -4 91 -4q122 0 211 37zM871 -149l-7 -7q-91 37 -216 37q-29 0 -87 -4l-1 28q47 8 126 10q35 0 35 23 q0 9 -10 19l-656 658l47 47l657 -659q7 -7 21 -7q20 0 20 32q0 77 10 126l28 -1q-4 -60 -4 -91q0 -122 37 -211zM402 145l-300 -301l-47 47l300 301z" />
+<glyph unicode="&#x292e;" horiz-adv-x="926" d="M402 361l-47 -47l-300 301l47 47zM864 662l7 -7q-37 -89 -37 -211q0 -31 4 -91l-28 -1q-10 49 -10 126q0 32 -20 32q-14 0 -21 -7l-657 -659l-47 47l656 658q10 10 10 19q0 23 -35 23q-79 2 -126 10l1 28q58 -4 87 -4q125 0 216 37zM871 -149l-7 -7q-89 37 -211 37 q-31 0 -91 -4l-1 28q49 10 126 10q32 0 32 20q0 14 -7 21l-188 189l47 47l187 -188q10 -10 19 -10q23 0 23 35q2 79 10 126l28 -1q-4 -58 -4 -87q0 -125 37 -216z" />
+<glyph unicode="&#x292f;" horiz-adv-x="926" d="M864 662l7 -7q-37 -91 -37 -216q0 -29 4 -87l-28 -1q-8 47 -10 126q0 35 -23 35q-9 0 -19 -10l-187 -188l-47 47l188 189q7 7 7 21q0 20 -32 20q-77 0 -126 10l1 28q60 -4 91 -4q122 0 211 37zM871 -109l-47 -47l-769 771l47 47zM402 145l-300 -301l-47 47l300 301z" />
+<glyph unicode="&#x2930;" horiz-adv-x="926" d="M873 -147l-7 -7q-91 37 -216 37q-29 0 -87 -4l-1 28q47 8 126 10q35 0 35 23q0 9 -10 19l-188 187l47 47l189 -188q7 -7 21 -7q20 0 20 32q0 77 10 126l28 -1q-4 -60 -4 -91q0 -122 37 -211zM873 615l-771 -769l-47 47l771 769zM403 362l-47 -47l-301 300l47 47z" />
+<glyph unicode="&#x2931;" horiz-adv-x="926" d="M402 361l-47 -47l-187 188q-10 10 -19 10q-23 0 -23 -35q-2 -79 -10 -126l-28 1q4 58 4 87q0 125 -37 216l7 7q89 -37 211 -37q31 0 91 4l1 -28q-49 -10 -126 -10q-32 0 -32 -20q0 -14 7 -21zM863 662l7 -7q-37 -91 -37 -216q0 -29 4 -87l-28 -1q-10 57 -10 126 q0 35 -23 35q-9 0 -19 -10l-656 -658l-47 47l657 659q7 7 7 21q0 20 -32 20q-77 0 -126 10l1 28q60 -4 91 -4q122 0 211 37zM870 -109l-47 -47l-300 301l47 47z" />
+<glyph unicode="&#x2932;" horiz-adv-x="926" d="M863 662l7 -7q-37 -91 -37 -216q0 -29 4 -87l-28 -1q-8 47 -10 126q0 35 -23 35q-9 0 -19 -10l-187 -188l-47 47l188 189q7 7 7 21q0 20 -32 20q-77 0 -126 10l1 28q60 -4 91 -4q122 0 211 37zM871 -109l-47 -47l-656 658q-10 10 -19 10q-23 0 -23 -35q0 -69 -10 -126 l-28 1q4 58 4 87q0 125 -37 216l7 7q89 -37 211 -37q31 0 91 4l1 -28q-49 -10 -126 -10q-32 0 -32 -20q0 -14 7 -21zM402 145l-300 -301l-47 47l300 301z" />
+<glyph unicode="&#x2933;" horiz-adv-x="926" d="M871 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-107q-35 0 -66.5 16t-55.5 38l-48 46q-24 22 -52 38t-58 16q-103 0 -190 -152l-51 34q44 81 106 132.5t135 51.5q39 0 75.5 -16t62.5 -38l50 -46q24 -22 47.5 -38t44.5 -16h108q8 0 17 7.5 t9 14.5q0 11 -14 25q-49 47 -82 97l20 19q125 -144 237 -191z" />
+<glyph unicode="&#x2934;" horiz-adv-x="926" d="M797 324l-19 -20q-37 25 -96 83q-14 14 -28 14q-20 0 -20 -26v-52q0 -134 -90 -228.5t-222 -94.5h-181v66h181q105 0 175.5 74.5t70.5 182.5v52q0 8 -7.5 17t-14.5 9q-11 0 -25 -14q-47 -49 -97 -82l-19 20q144 125 191 237h10q49 -115 191 -238z" />
+<glyph unicode="&#x2935;" horiz-adv-x="926" d="M778 258l19 -20q-142 -123 -191 -238h-10q-47 112 -191 237l19 20q50 -33 97 -82q14 -14 25 -14q7 0 14.5 9t7.5 17v52q0 108 -70.5 182.5t-175.5 74.5h-181v66h181q132 0 222 -94.5t90 -228.5v-52q0 -26 20 -26q14 0 28 14q59 58 96 83z" />
+<glyph unicode="&#x2936;" horiz-adv-x="784" d="M649 493v-181q0 -132 -94.5 -222t-228.5 -90h-52q-26 0 -26 -20q0 -14 14 -28q58 -59 83 -96l-20 -19q-123 142 -238 191v10q112 47 237 191l20 -19q-33 -50 -82 -97q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h52q108 0 182.5 70.5t74.5 175.5v181h66z" />
+<glyph unicode="&#x2937;" horiz-adv-x="784" d="M697 38v-10q-115 -49 -238 -191l-20 19q25 37 83 96q14 14 14 28q0 20 -26 20h-52q-134 0 -228.5 90t-94.5 222v181h66v-181q0 -105 74.5 -175.5t182.5 -70.5h52q8 0 17 7.5t9 14.5q0 11 -14 25q-49 47 -82 97l20 19q125 -144 237 -191z" />
+<glyph unicode="&#x2938;" horiz-adv-x="511" d="M132 595l22 62q110 -34 185.5 -146t75.5 -234q0 -99 -43.5 -188.5t-123.5 -143.5q-10 -7 -10 -15q0 -13 20 -18q73 -17 120 -39l-7 -26q-108 35 -212 35q-41 0 -84 -6l-5 10q79 111 108 277l26 -5q-3 -63 -19 -125q-2 -14 -2 -16q0 -14 18 -14q35 0 92 76q26 35 41 91.5 t15 108.5q0 102 -63 195.5t-154 120.5z" />
+<glyph unicode="&#x2939;" horiz-adv-x="511" d="M441 -114l-5 -10q-44 6 -84 6q-104 0 -212 -35l-7 26q47 22 120 39q20 5 20 18q0 8 -10 15q-80 54 -123.5 143.5t-43.5 188.5q0 122 75.5 234t185.5 146l22 -62q-91 -27 -154 -120.5t-63 -195.5q0 -52 15 -108.5t41 -91.5q57 -76 92 -76q18 0 18 14q0 2 -2 16 q-16 62 -19 125l26 5q29 -166 108 -277z" />
+<glyph unicode="&#x293a;" horiz-adv-x="926" d="M866 162l-62 -22q-27 91 -117.5 154t-191.5 63q-51 0 -105 -14.5t-89 -41.5q-76 -57 -76 -92q0 -18 14 -18q2 0 16 2q62 16 125 19l5 -26q-166 -29 -277 -108l-10 5q6 43 6 84q0 104 -35 212l26 7q22 -47 39 -120q5 -20 18 -20q8 0 15 10q54 79 143.5 123t182.5 44 q121 0 230 -75t143 -186z" />
+<glyph unicode="&#x293b;" horiz-adv-x="926" d="M857 122l-26 -7q-22 47 -39 120q-5 20 -18 20q-8 0 -15 -10q-54 -79 -143.5 -123t-182.5 -44q-121 0 -230 75t-143 186l62 22q27 -91 117.5 -154t191.5 -63q51 0 105 14.5t89 41.5q76 57 76 92q0 18 -14 18q-2 0 -16 -2q-62 -16 -125 -19l-5 26q166 29 277 108l10 -5 q-6 -44 -6 -84q0 -104 35 -212z" />
+<glyph unicode="&#x293c;" horiz-adv-x="926" d="M830 386l26 -7q-35 -108 -35 -212q0 -41 6 -84l-10 -5q-111 79 -277 108l5 26q63 -3 125 -19q14 -2 16 -2q14 0 14 18q0 35 -76 92q-35 27 -89 41.5t-105 14.5q-101 0 -191.5 -63t-117.5 -154l-62 22q34 111 143 186t230 75q93 0 182.5 -44t143.5 -123q7 -10 15 -10 q13 0 18 20q17 73 39 120zM536 64h-256v50h256v-50z" />
+<glyph unicode="&#x293d;" horiz-adv-x="926" d="M866 162l-62 -22q-27 91 -117.5 154t-191.5 63q-51 0 -105 -14.5t-89 -41.5q-76 -57 -76 -92q0 -18 14 -18q2 0 16 2q62 16 125 19l5 -26q-166 -29 -277 -108l-10 5q6 43 6 84q0 104 -35 212l26 7q22 -47 39 -120q5 -20 18 -20q8 0 15 10q54 79 143.5 123t182.5 44 q121 0 230 -75t143 -186zM646 64h-104v-93h-50v93h-104v50h104v93h50v-93h104v-50z" />
+<glyph unicode="&#x293e;" horiz-adv-x="926" d="M652 508l36 55q77 -50 122.5 -132t45.5 -177q0 -153 -108.5 -261.5t-261.5 -108.5q-99 0 -183.5 49t-134.5 132q-10 12 -19 12q-12 0 -17 -25q-11 -61 -37 -121l-26 8q32 109 32 202q0 43 -8 94l7 5q118 -79 283 -102l-6 -28q-69 5 -126 18q-9 3 -15 3q-16 0 -16 -16 q0 -8 8 -22q40 -66 108.5 -104.5t149.5 -38.5q126 0 215 89t89 215q0 78 -37.5 145.5t-100.5 108.5z" />
+<glyph unicode="&#x293f;" horiz-adv-x="926" d="M856 -61l-26 -8q-26 60 -37 121q-5 25 -17 25q-9 0 -19 -12q-50 -83 -134.5 -132t-183.5 -49q-153 0 -261.5 108.5t-108.5 261.5q0 95 45.5 177t122.5 132l36 -55q-63 -41 -100.5 -108.5t-37.5 -145.5q0 -126 89 -215t215 -89q81 0 149.5 38.5t108.5 104.5q8 14 8 22 q0 16 -16 16q-6 0 -15 -3q-57 -13 -126 -18l-6 28q165 23 283 102l7 -5q-8 -51 -8 -94q0 -93 32 -202z" />
+<glyph unicode="&#x2940;" horiz-adv-x="926" d="M572 788l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -19 21 -23q136 -27 226.5 -128.5t90.5 -238.5q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5q0 127 76.5 226t196.5 132q46 23 86.5 55t63.5 56t57 64zM591 416l-20 -19q-93 106 -174 157 q-104 -23 -172 -106.5t-68 -192.5q0 -127 89.5 -216.5t216.5 -89.5t216.5 89.5t89.5 216.5q0 112 -71.5 196.5t-179.5 104.5h-2q-20 0 -20 -19q0 -11 14 -25q48 -46 81 -96z" />
+<glyph unicode="&#x2941;" horiz-adv-x="926" d="M334 769l20 19q34 -40 57 -64t63.5 -56t86.5 -55q120 -33 196.5 -132t76.5 -226q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5q0 137 90.5 238.5t226.5 128.5q21 4 21 23q0 14 -14 28q-54 56 -82 96zM410 556h-2q-108 -20 -179.5 -104.5t-71.5 -196.5 q0 -127 89.5 -216.5t216.5 -89.5t216.5 89.5t89.5 216.5q0 109 -68 192.5t-172 106.5q-81 -51 -174 -157l-20 19q33 50 81 96q14 14 14 25q0 19 -20 19z" />
+<glyph unicode="&#x2942;" horiz-adv-x="926" d="M871 418v-10q-119 -51 -236 -180l-20 19q24 31 76 85q14 14 14 28q0 20 -26 20h-614v66h613q9 0 18 5.5t9 16.5t-14 25q-52 51 -76 86l20 19q111 -128 236 -180zM448 60h-200q-9 0 -18 -5.5t-9 -16.5t14 -25q52 -51 76 -86l-20 -19q-111 128 -236 180v10q119 51 236 180 l20 -19q-24 -31 -76 -85q-14 -14 -14 -28q0 -20 26 -20h201v-66z" />
+<glyph unicode="&#x2943;" horiz-adv-x="926" d="M861 380h-614q-26 0 -26 -20q0 -14 14 -28q52 -54 76 -85l-20 -19q-117 129 -236 180v10q125 52 236 180l20 -19q-24 -35 -76 -86q-14 -14 -14 -25t9 -16.5t18 -5.5h613v-66zM871 98v-10q-125 -52 -236 -180l-20 19q24 35 76 86q14 14 14 25t-9 16.5t-18 5.5h-200v66h201 q26 0 26 20q0 14 -14 28q-52 54 -76 85l20 19q117 -129 236 -180z" />
+<glyph unicode="&#x2944;" horiz-adv-x="926" d="M871 418v-10q-125 -52 -236 -180l-20 19q24 35 76 86q14 14 14 25t-9 16.5t-18 5.5h-200v66h201q26 0 26 20q0 14 -14 28q-52 54 -76 85l20 19q117 -129 236 -180zM861 60h-614q-26 0 -26 -20q0 -14 14 -28q52 -54 76 -85l-20 -19q-117 129 -236 180v10q125 52 236 180 l20 -19q-24 -35 -76 -86q-14 -14 -14 -25t9 -16.5t18 -5.5h613v-66z" />
+<glyph unicode="&#x2945;" horiz-adv-x="926" d="M871 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-628v66h629q8 0 17 7.5t9 14.5q0 11 -14 25q-49 47 -82 97l20 19q125 -144 237 -191zM388 24h-104v-93h-50v93h-104v50h104v93h50v-93h104v-50z" />
+<glyph unicode="&#x2946;" horiz-adv-x="926" d="M871 220h-629q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h628v-66zM796 24h-104v-93h-50v93h-104v50h104v93h50v-93h104v-50z" />
+<glyph unicode="&#x2947;" horiz-adv-x="926" d="M871 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-265l108 -108l-35 -35l-142 142l-142 -142l-35 35l108 108h-225v66h227l-110 110l35 35l142 -142l142 142l35 -35l-110 -110h268q8 0 17 7.5t9 14.5q0 11 -14 25q-49 47 -82 97l20 19 q125 -144 237 -191z" />
+<glyph unicode="&#x2948;" horiz-adv-x="926" d="M888 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-87q-11 -52 -53 -86t-97 -34t-97 34t-54 86h-87q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q115 49 238 191l20 -19q-28 -40 -82 -96 q-14 -14 -14 -28q0 -20 26 -20h86q11 53 53.5 87.5t97.5 34.5q56 0 98 -34.5t53 -87.5h87q8 0 17 7.5t9 14.5q0 11 -14 25q-51 49 -82 96l20 19q124 -143 237 -190zM364 286h198q-11 31 -38 51.5t-61 20.5t-61.5 -20.5t-37.5 -51.5zM561 220h-197q11 -31 38 -50.5t61 -19.5 q33 0 60 19.5t38 50.5z" />
+<glyph unicode="&#x2949;" horiz-adv-x="511" d="M451 277l-19 -20q-17 12 -32 24.5l-35 30.5l-29 27q-16 14 -28 14q-9 0 -14.5 -6.5t-5.5 -15.5v-190q51 -13 82 -52.5t31 -92.5q0 -62 -44 -106t-106 -44t-106 44t-44 106q0 52 33 94t84 52h2l2 1v187q0 6 -8 15t-14 9q-11 0 -25 -14q-67 -63 -96 -82l-19 20 q112 97 162 181v16q0 8 -7.5 17t-14.5 9q-11 0 -25 -14q-67 -63 -96 -82l-19 20q141 121 190 237h10q50 -115 191 -238l-19 -20q-17 12 -32 24.5t-35 31.5l-29 26q-16 14 -28 14q-20 0 -20 -40q54 -88 163 -183zM351 -4q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5 t29.5 -70.5t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x294a;" horiz-adv-x="926" d="M888 286v-5q-108 -52 -238 -214l-20 19l16 24l18 26l16.5 21.5t21.5 24.5q14 14 14 24q0 14 -26 14h-652v5q108 52 238 214l20 -19l-16 -24l-18 -26l-16.5 -21.5t-21.5 -24.5q-14 -14 -14 -24q0 -14 26 -14h652z" />
+<glyph unicode="&#x294b;" horiz-adv-x="926" d="M888 220h-652q-26 0 -26 -14q0 -10 14 -24q11 -11 21.5 -24.5l16.5 -21.5l18 -26l16 -24l-20 -19q-130 162 -238 214v5h652q26 0 26 14q0 10 -14 24q-11 11 -21.5 24.5l-16.5 21.5l-18 26l-16 24l20 19q130 -162 238 -214v-5z" />
+<glyph unicode="&#x294c;" horiz-adv-x="511" d="M441 424l-19 -20l-24 16l-26 18l-21.5 16.5t-24.5 21.5q-14 14 -24 14q-14 0 -14 -26v-620h-5q-52 108 -214 238l19 20l24 -16l26 -18l21.5 -16.5t24.5 -21.5q14 -14 24 -14q14 0 14 26v620h5q52 -108 214 -238z" />
+<glyph unicode="&#x294d;" horiz-adv-x="511" d="M422 102l19 -20q-162 -130 -214 -238h-5v620q0 26 -14 26q-10 0 -24 -14q-11 -11 -24.5 -21.5l-21.5 -16.5l-26 -18l-24 -16l-19 20q162 130 214 238h5v-620q0 -26 14 -26q10 0 24 14q11 11 24.5 21.5l21.5 16.5l26 18z" />
+<glyph unicode="&#x294e;" horiz-adv-x="926" d="M888 220h-850v5q108 52 238 214l20 -19l-16 -24l-18 -26l-16.5 -21.5t-21.5 -24.5q-14 -14 -14 -24q0 -14 26 -14h454q26 0 26 14q0 10 -14 24q-11 11 -21.5 24.5l-16.5 21.5l-18 26l-16 24l20 19q130 -162 238 -214v-5z" />
+<glyph unicode="&#x294f;" horiz-adv-x="511" d="M422 102l19 -20q-162 -130 -214 -238h-5v818h5q52 -108 214 -238l-19 -20l-24 16l-26 18l-21.5 16.5t-24.5 21.5q-14 14 -24 14q-14 0 -14 -26v-422q0 -26 14 -26q10 0 24 14q11 11 24.5 21.5l21.5 16.5l26 18z" />
+<glyph unicode="&#x2950;" horiz-adv-x="926" d="M888 286v-5q-108 -52 -238 -214l-20 19l16 24l18 26l16.5 21.5t21.5 24.5q14 14 14 24q0 14 -26 14h-454q-26 0 -26 -14q0 -10 14 -24q11 -11 21.5 -24.5l16.5 -21.5l18 -26l16 -24l-20 -19q-130 162 -238 214v5h850z" />
+<glyph unicode="&#x2951;" horiz-adv-x="511" d="M288 -156h-5q-52 108 -214 238l19 20l24 -16l26 -18l21.5 -16.5t24.5 -21.5q14 -14 24 -14q14 0 14 26v428q0 20 -14 20q-10 0 -24 -14q-11 -11 -24.5 -21.5l-21.5 -16.5l-26 -18l-24 -16l-19 20q162 130 214 238h5v-818z" />
+<glyph unicode="&#x2952;" horiz-adv-x="926" d="M871 220h-766v-162h-50v390h50v-223q108 52 238 214l20 -19l-17 -24l-17 -26l-16.5 -21.5t-21.5 -24.5q-14 -14 -14 -24q0 -14 26 -14h568v-66z" />
+<glyph unicode="&#x2953;" horiz-adv-x="926" d="M871 58h-50v162h-766v66h568q26 0 26 14q0 10 -14 24q-11 11 -21.5 24.5l-16.5 21.5l-17 26l-17 24l20 19q130 -162 238 -214v223h50v-390z" />
+<glyph unicode="&#x2954;" horiz-adv-x="511" d="M451 612h-224q52 -108 214 -238l-19 -20l-24 16l-26 18l-21.5 16.5t-24.5 21.5q-14 14 -24 14q-14 0 -14 -26v-570h-66v768h-162v50h391v-50z" />
+<glyph unicode="&#x2955;" horiz-adv-x="511" d="M451 -156h-391v50h163v768h66v-570q0 -26 14 -26q10 0 24 14q11 11 24.5 21.5t22.5 16.5l25 18l24 16l19 -20q-162 -130 -214 -238h223v-50z" />
+<glyph unicode="&#x2956;" horiz-adv-x="926" d="M871 220h-568q-26 0 -26 -14q0 -10 14 -24q11 -11 21.5 -24.5l16.5 -21.5l17 -26l17 -24l-20 -19q-130 162 -238 214v-223h-50v390h50v-162h766v-66z" />
+<glyph unicode="&#x2957;" horiz-adv-x="926" d="M871 58h-50v223q-108 -52 -238 -214l-20 19l17 24l17 26l16.5 21.5t21.5 24.5q14 14 14 24q0 14 -26 14h-568v66h766v162h50v-390z" />
+<glyph unicode="&#x2958;" horiz-adv-x="511" d="M451 612h-163v-768h-66v570q0 26 -14 26q-10 0 -24 -14q-11 -11 -24.5 -21.5l-21.5 -16.5l-26 -18l-24 -16l-19 20q162 130 214 238h-223v50h391v-50z" />
+<glyph unicode="&#x2959;" horiz-adv-x="511" d="M451 -156h-391v50h223q-52 108 -214 238l19 20l24 -16l26 -18l21.5 -16.5t24.5 -21.5q14 -14 24 -14q14 0 14 26v570h66v-768h163v-50z" />
+<glyph unicode="&#x295a;" horiz-adv-x="926" d="M871 58h-50v162h-766v5q108 52 238 214l20 -19l-17 -24l-17 -26l-16.5 -21.5t-21.5 -24.5q-14 -14 -14 -24q0 -14 26 -14h568v162h50v-390z" />
+<glyph unicode="&#x295b;" horiz-adv-x="926" d="M871 220h-766v-162h-50v390h50v-162h568q26 0 26 14q0 10 -14 24q-11 11 -21.5 24.5l-16.5 21.5l-17 26l-17 24l20 19q130 -162 238 -214v-5z" />
+<glyph unicode="&#x295c;" horiz-adv-x="511" d="M451 -156h-391v50h162v768h5q52 -108 214 -238l-19 -20l-24 16l-26 18l-21.5 16.5t-24.5 21.5q-14 14 -24 14q-14 0 -14 -26v-570h163v-50z" />
+<glyph unicode="&#x295d;" horiz-adv-x="511" d="M451 612h-163v-570q0 -26 14 -26q10 0 24 14q11 11 24.5 21.5l21.5 16.5l26 18l24 16l19 -20q-162 -130 -214 -238h-5v768h-162v50h391v-50z" />
+<glyph unicode="&#x295e;" horiz-adv-x="926" d="M871 58h-50v162h-568q-26 0 -26 -14q0 -10 14 -24q11 -11 21.5 -24.5l16.5 -21.5l17 -26l17 -24l-20 -19q-130 162 -238 214v5h766v162h50v-390z" />
+<glyph unicode="&#x295f;" horiz-adv-x="926" d="M871 286v-5q-108 -52 -238 -214l-20 19l17 24l17 26l16.5 21.5t21.5 24.5q14 14 14 24q0 14 -26 14h-568v-162h-50v390h50v-162h766z" />
+<glyph unicode="&#x2960;" horiz-adv-x="511" d="M450 -156h-391v50h163v570q0 26 -14 26q-10 0 -24 -14q-11 -11 -24.5 -21.5l-21.5 -16.5l-26 -18l-24 -16l-19 20q162 130 214 238h5v-768h162v-50z" />
+<glyph unicode="&#x2961;" horiz-adv-x="511" d="M450 612h-162v-768h-5q-52 108 -214 238l19 20l24 -16l26 -18l21.5 -16.5t24.5 -21.5q14 -14 24 -14q14 0 14 26v570h-163v50h391v-50z" />
+<glyph unicode="&#x2962;" horiz-adv-x="926" d="M871 320h-816v5q108 52 238 214l20 -19l-17 -24l-17 -26l-16.5 -21.5t-21.5 -24.5q-14 -14 -14 -24q0 -14 26 -14h618v-66zM871 120h-618q-26 0 -26 -14q0 -10 14 -24q11 -11 21.5 -24.5l16.5 -21.5l17 -26l17 -24l-20 -19q-130 162 -238 214v5h816v-66z" />
+<glyph unicode="&#x2963;" d="M276 -156h-66v620q0 26 -14 26q-10 0 -24 -14q-11 -11 -24.5 -21.5l-21.5 -16.5l-26 -18l-24 -16l-19 20q162 130 214 238h5v-818zM629 424l-19 -20l-24 16l-26 18l-21.5 16.5t-24.5 21.5q-14 14 -24 14q-14 0 -14 -26v-620h-66v818h5q52 -108 214 -238z" />
+<glyph unicode="&#x2964;" horiz-adv-x="926" d="M871 320h-816v66h618q26 0 26 14q0 10 -14 24q-11 11 -21.5 24.5l-16.5 21.5l-17 26l-17 24l20 19q130 -162 238 -214v-5zM871 186v-5q-108 -52 -238 -214l-20 19l17 24l17 26l16.5 21.5t21.5 24.5q14 14 14 24q0 14 -26 14h-618v66h816z" />
+<glyph unicode="&#x2965;" d="M610 102l19 -20q-162 -130 -214 -238h-5v818h66v-620q0 -26 14 -26q10 0 24 14q11 11 24.5 21.5l21.5 16.5l26 18zM276 -156h-5q-52 108 -214 238l19 20l24 -16l26 -18l21.5 -16.5t24.5 -21.5q14 -14 24 -14q14 0 14 26v620h66v-818z" />
+<glyph unicode="&#x2966;" horiz-adv-x="926" d="M861 320h-806v5q108 52 238 214l20 -19l-17 -24l-17 -26l-16.5 -21.5t-21.5 -24.5q-14 -14 -14 -24q0 -14 26 -14h608v-66zM871 120h-806v66h608q26 0 26 14q0 8 -13 24q-19 22 -39 51l21 17q103 -115 203 -167v-5z" />
+<glyph unicode="&#x2967;" horiz-adv-x="926" d="M861 320h-608q-26 0 -26 -14q0 -8 13 -24q19 -22 39 -51l-21 -17q-103 115 -203 167v5h806v-66zM871 186v-5q-108 -52 -238 -214l-20 19l17 24l17 26l16.5 21.5t21.5 24.5q14 14 14 24q0 14 -26 14h-608v66h806z" />
+<glyph unicode="&#x2968;" horiz-adv-x="926" d="M871 320h-806v66h608q26 0 26 14q0 10 -14 24q-36 37 -77 96l20 19q127 -158 243 -214v-5zM861 120h-806v5q100 52 203 167l21 -17q-20 -29 -39 -51q-13 -16 -13 -24q0 -14 26 -14h608v-66z" />
+<glyph unicode="&#x2969;" horiz-adv-x="926" d="M871 386v-5q-100 -52 -203 -167l-21 17q20 29 39 51q13 16 13 24q0 14 -26 14h-608v66h806zM861 120h-608q-26 0 -26 -14q0 -10 14 -24q11 -11 21.5 -24.5l16.5 -21.5l17 -26l17 -24l-20 -19q-130 162 -238 214v5h806v-66z" />
+<glyph unicode="&#x296a;" horiz-adv-x="926" d="M871 320h-816v5q108 52 238 214l20 -19l-17 -24l-17 -26l-16.5 -21.5t-21.5 -24.5q-14 -14 -14 -24q0 -14 26 -14h618v-66zM871 120h-806v66h806v-66z" />
+<glyph unicode="&#x296b;" horiz-adv-x="926" d="M871 320h-806v66h806v-66zM871 120h-618q-26 0 -26 -14q0 -10 14 -24q11 -11 21.5 -24.5l16.5 -21.5l17 -26l17 -24l-20 -19q-130 162 -238 214v5h816v-66z" />
+<glyph unicode="&#x296c;" horiz-adv-x="926" d="M871 320h-816v66h618q26 0 26 14q0 10 -14 24q-11 11 -21.5 24.5l-16.5 21.5l-17 26l-17 24l20 19q130 -162 238 -214v-5zM861 120h-806v66h806v-66z" />
+<glyph unicode="&#x296d;" horiz-adv-x="926" d="M861 320h-806v66h806v-66zM871 186v-5q-108 -52 -238 -214l-20 19l17 24l17 26l16.5 21.5t21.5 24.5q14 14 14 24q0 14 -26 14h-618v66h816z" />
+<glyph unicode="&#x296e;" d="M610 102l19 -20q-162 -130 -214 -238h-5v808h66v-610q0 -26 14 -26q10 0 24 14q11 11 24.5 21.5l21.5 16.5l26 18zM276 -146h-66v610q0 26 -14 26q-10 0 -24 -14q-11 -11 -24.5 -21.5l-21.5 -16.5l-26 -18l-24 -16l-19 20q162 130 214 238h5v-808z" />
+<glyph unicode="&#x296f;" d="M629 424l-19 -20l-24 16l-26 18l-21.5 16.5t-24.5 21.5q-14 14 -24 14q-14 0 -14 -26v-610h-66v808h5q52 -108 214 -238zM276 -156h-5q-52 108 -214 238l19 20l24 -16l26 -18l21.5 -16.5t24.5 -21.5q14 -14 24 -14q14 0 14 26v610h66v-808z" />
+<glyph unicode="&#x2970;" horiz-adv-x="926" d="M55 386h684q55 0 93.5 -39t38.5 -94t-38.5 -94t-93.5 -39h-684v66h684q27 0 46.5 19.5t19.5 47.5q0 27 -19.5 47t-46.5 20h-684v66z" />
+<glyph unicode="&#x2971;" horiz-adv-x="926" d="M519 515h-369v50h369v-50zM519 370h-369v50h369v-50zM871 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-628v66h629q8 0 17 7.5t9 14.5q0 11 -14 25q-49 47 -82 97l20 19q125 -144 237 -191z" />
+<glyph unicode="&#x2972;" horiz-adv-x="926" d="M520 508h19q-3 -48 -36.5 -93t-77.5 -45q-32 0 -100 44t-89 44q-31 0 -54.5 -25t-31.5 -63h-20q2 53 37 95.5t80 42.5q33 0 101 -44t88 -44q32 0 54 24.5t30 63.5zM871 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-628v66h629q8 0 17 7.5 t9 14.5q0 11 -14 25q-49 47 -82 97l20 19q125 -144 237 -191z" />
+<glyph unicode="&#x2973;" horiz-adv-x="926" d="M871 220h-629q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h628v-66zM776 136h20q-2 -53 -37 -95.5t-80 -42.5q-33 0 -101 44t-88 44q-32 0 -54 -24.5 t-30 -63.5h-19q3 48 36.5 93t77.5 45q32 0 100 -44t89 -44q31 0 54.5 25t31.5 63z" />
+<glyph unicode="&#x2974;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-629v66h628q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19q123 -142 238 -191zM519 136h20q-2 -53 -37 -95.5t-80 -42.5q-32 0 -100 44t-89 44q-32 0 -54 -24.5t-30 -63.5h-19 q3 48 36.5 93t77.5 45q32 0 100 -44t89 -44q31 0 54.5 25t31.5 63z" />
+<glyph unicode="&#x2975;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-629v66h628q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19q123 -142 238 -191zM519 136h20q-2 -53 -37 -95.5t-80 -42.5q-32 0 -100 44t-89 44q-32 0 -54 -24.5t-30 -63.5h-19 q3 48 36.5 93t77.5 45q32 0 100 -44t89 -44q31 0 54.5 25t31.5 63zM519 -3h20q-2 -53 -37 -95.5t-80 -42.5q-32 0 -100 44t-89 44q-32 0 -54 -24.5t-30 -63.5h-19q3 48 36.5 93t77.5 45q32 0 100 -44t89 -44q31 0 54.5 25t31.5 63z" />
+<glyph unicode="&#x2976;" d="M621 50l-557 274v10l557 273v-67l-421 -211l421 -212v-67zM621 -120h-368q-26 0 -26 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q112 47 237 191l20 -19q-33 -50 -82 -97q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h369v-66z" />
+<glyph unicode="&#x2977;" horiz-adv-x="926" d="M871 -26l-500 246h-139q-26 0 -26 -22q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h138l500 246v-65l-355 -181h315v-66h-316l356 -181v-65z" />
+<glyph unicode="&#x2978;" d="M621 324l-557 -273v67l421 211l-421 212v67l557 -274v-10zM620 -81v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-368v66h369q8 0 17 7.5t9 14.5q0 11 -14 25q-49 47 -82 97l20 19q125 -144 237 -191z" />
+<glyph unicode="&#x2979;" d="M621 161h-290q-121 0 -194 62.5t-73 171.5t74 170.5t196 61.5h287v-66h-287q-89 0 -146.5 -44t-57.5 -122t58 -123t147 -45h286v-66zM620 -61v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-368v66h369q8 0 17 7.5t9 14.5q0 11 -14 25 q-49 47 -82 97l20 19q125 -144 237 -191z" />
+<glyph unicode="&#x297a;" horiz-adv-x="926" d="M871 -26h-290q-107 0 -180.5 71t-84.5 175h-84q-26 0 -26 -22q0 -11 14 -25q39 -38 72 -87l-20 -19q-57 66 -109 110t-118 71v10q113 48 228 181l20 -19q-29 -41 -72 -86q-14 -14 -14 -28q0 -20 26 -20h83q12 103 86 174.5t182 71.5h287v-66h-287q-75 0 -132.5 -53.5 t-69.5 -126.5h449v-66h-449q12 -73 70 -126.5t133 -53.5h286v-66z" />
+<glyph unicode="&#x297b;" d="M63 627h287q122 0 196 -61.5t74 -170.5t-73 -171.5t-194 -62.5h-290v66h286q89 0 147 45t58 123t-57.5 122t-146.5 44h-287v66zM620 -99h-368q-26 0 -26 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q112 47 237 191l20 -19q-33 -50 -82 -97 q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h369v-66z" />
+<glyph unicode="&#x297c;" horiz-adv-x="926" d="M791 220h-510q-33 0 -56.5 -19.5t-23.5 -58.5q0 -38 24 -59.5t56 -21.5v-66q-54 0 -100 39.5t-46 107.5q0 69 52 111q-52 42 -52 111q0 68 46 107.5t100 39.5v-66q-32 0 -56 -21.5t-24 -59.5t24.5 -58t55.5 -20h510v-66z" />
+<glyph unicode="&#x297d;" horiz-adv-x="926" d="M645 445v66q54 0 100 -39.5t46 -107.5q0 -69 -52 -111q52 -42 52 -111q0 -68 -46 -107.5t-100 -39.5v66q32 0 56 21.5t24 59.5t-24.5 58t-55.5 20h-510v66h510q33 0 56.5 19.5t23.5 58.5q0 38 -24 59.5t-56 21.5z" />
+<glyph unicode="&#x297e;" d="M600 435h-66q0 32 -21.5 56t-59.5 24t-58 -24.5t-20 -55.5v-510h-66v510q0 33 -19.5 56.5t-58.5 23.5q-38 0 -59.5 -24t-21.5 -56h-66q0 54 39.5 100t107.5 46q69 0 111 -52q42 52 111 52q68 0 107.5 -46t39.5 -100z" />
+<glyph unicode="&#x297f;" d="M534 71h66q0 -54 -39.5 -100t-107.5 -46q-69 0 -111 52q-42 -52 -111 -52q-68 0 -107.5 46t-39.5 100h66q0 -32 21.5 -56t59.5 -24t58 24.5t20 55.5v510h66v-510q0 -33 19.5 -56.5t58.5 -23.5q38 0 59.5 24t21.5 56z" />
+<glyph unicode="&#x2980;" horiz-adv-x="594" d="M509 -189h-66v884h66v-884zM330 -189h-66v884h66v-884zM151 -189h-66v884h66v-884z" />
+<glyph unicode="&#x2981;" horiz-adv-x="565" d="M519 252q0 -99 -69 -168.5t-166 -69.5q-99 0 -168.5 69.5t-69.5 168.5q0 97 69.5 166t168.5 69q97 0 166 -69t69 -166z" />
+<glyph unicode="&#x2982;" horiz-adv-x="503" d="M393 425q0 -59 -41.5 -100t-100.5 -41t-100 41t-41 100t41 100t100 41t100.5 -41t41.5 -100zM333 424q0 34 -24 57.5t-58 23.5t-57.5 -23.5t-23.5 -57.5t23.5 -57t57.5 -23t58 23t24 57zM393 82q0 -59 -41.5 -100t-100.5 -41t-100 41.5t-41 99.5q0 59 41 100.5t100 41.5 t100.5 -41.5t41.5 -100.5zM333 82q0 34 -24 58t-58 24q-33 0 -57 -24t-24 -58q0 -33 24 -57t57 -24q34 0 58 24t24 57z" />
+<glyph unicode="&#x2983;" horiz-adv-x="596" d="M477 -213h-133q-161 0 -161 173v162q0 106 -75 128v6q75 22 75 128v162q0 173 161 173h133v-20h-67v-892h67v-20zM360 -193v892h-16q-23 0 -40 -8t-27 -24.5t-16 -32t-8.5 -41t-3 -40.5t-0.5 -41v-91q0 -122 -95 -167v-2q95 -45 95 -167v-91q0 -25 0.5 -39.5t3 -40.5 t8.5 -41.5t16 -32.5t27 -25t40 -8h16z" />
+<glyph unicode="&#x2984;" horiz-adv-x="596" d="M488 256v-6q-75 -22 -75 -128v-162q0 -173 -161 -173h-133v20h67v892h-67v20h133q161 0 161 -173v-162q0 -106 75 -128zM442 252v2q-95 45 -95 167v91q0 25 -0.5 39.5t-3 40.5t-8.5 41.5t-16 32.5t-27 25t-40 8h-16v-892h16q23 0 40 8t27 24.5t16 32t8.5 41t3 40.5 t0.5 41v91q0 122 95 167z" />
+<glyph unicode="&#x2985;" horiz-adv-x="463" d="M393 -191v-22q-323 141 -323 466t323 466v-20q-4 -2 -52 -33q-94 -87 -94 -413q0 -329 93 -412q40 -26 53 -32zM283 -119q-86 111 -86 372q0 259 86 371q-163 -133 -163 -371q0 -241 163 -372z" />
+<glyph unicode="&#x2986;" horiz-adv-x="463" d="M70 697v22q323 -141 323 -466t-323 -466v20q4 2 52 33q94 87 94 413q0 329 -93 412q-40 26 -53 32zM343 253q0 241 -163 372q86 -111 86 -372q0 -259 -86 -371q163 133 163 371z" />
+<glyph unicode="&#x2987;" horiz-adv-x="511" d="M367 719v-933q-116 76 -184 199.5t-68 267.5t68 267t184 199zM317 -109v724q-72 -71 -112 -164.5t-40 -197.5q0 -213 152 -362z" />
+<glyph unicode="&#x2988;" horiz-adv-x="511" d="M144 -214v933q116 -76 184 -199.5t68 -267.5t-68 -267t-184 -199zM194 614v-724q72 71 112 164.5t40 197.5q0 213 -152 362z" />
+<glyph unicode="&#x2989;" horiz-adv-x="511" d="M352 -213l-252 466l252 466v-932zM302 -17v540l-145 -270z" />
+<glyph unicode="&#x298a;" horiz-adv-x="511" d="M411 253l-252 -466v932zM354 253l-145 270v-540z" />
+<glyph unicode="&#x298b;" horiz-adv-x="469" d="M447 -83h-259v802h259v-50h-193v-702h193v-50zM447 -213h-259v50h259v-50z" />
+<glyph unicode="&#x298c;" horiz-adv-x="469" d="M281 -83h-259v50h193v702h-193v50h259v-802zM281 -213h-259v50h259v-50z" />
+<glyph unicode="&#x298d;" horiz-adv-x="469" d="M447 -213h-259v932h259v-50h-158l134 -133l-36 -36l-133 133v-796h193v-50z" />
+<glyph unicode="&#x298e;" horiz-adv-x="469" d="M281 -213h-259v50h158l-134 133l36 36l133 -133v796h-193v50h259v-932z" />
+<glyph unicode="&#x298f;" horiz-adv-x="469" d="M447 -213h-259v932h259v-50h-193v-796l133 133l36 -36l-134 -133h158v-50z" />
+<glyph unicode="&#x2990;" horiz-adv-x="469" d="M281 -213h-259v50h193v796l-133 -133l-36 36l134 133h-158v50h259v-932z" />
+<glyph unicode="&#x2991;" horiz-adv-x="400" d="M357 253q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM335 719l-192 -466l191 -466h-52l-209 466l210 466h52z" />
+<glyph unicode="&#x2992;" horiz-adv-x="400" d="M357 253l-210 -466h-52l192 466l-191 466h52zM200 253q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5z" />
+<glyph unicode="&#x2993;" d="M591 -25l-197 97q55 -118 157 -173l-26 -42q-153 91 -204 250l-287 142v10l289 141q29 86 84.5 149t117.5 100l26 -45q-99 -52 -156 -168l196 96v-67l-227 -114q-14 -54 -14 -98q0 -47 13 -96l228 -115v-67zM305 321l-135 -67l134 -68q-4 42 -4 67q0 33 5 68z" />
+<glyph unicode="&#x2994;" d="M651 247l-289 -142q-29 -86 -84.5 -148.5t-117.5 -99.5l-26 45q98 53 155 168l-195 -96v67l227 114q14 54 14 98q0 47 -13 96l-228 115v67l197 -97q-55 118 -157 173l26 42q153 -92 203 -251l288 -141v-10zM515 252l-135 68q5 -35 5 -67t-5 -69z" />
+<glyph unicode="&#x2995;" d="M643 248l-253 -124q52 -157 178 -225l-26 -42q-149 90 -201 243l-92 -45q57 -106 149 -156l-26 -42q-113 66 -171 174l-115 -56v67l89 45q-28 73 -28 166q0 90 30 166l-91 46v67l116 -58q60 109 170 175l26 -45q-91 -49 -148 -153l92 -45q29 84 84 145t116 98l26 -45 q-125 -66 -178 -222l253 -124v-10zM507 253l-134 67q-6 -36 -6 -67q0 -33 6 -67zM326 344l-101 51q-28 -74 -28 -142q0 -71 27 -142l101 51q-8 45 -8 91q0 49 9 91z" />
+<glyph unicode="&#x2996;" d="M599 -25l-116 57q-60 -109 -170 -175l-26 45q93 50 148 153l-92 45q-29 -84 -84 -145t-116 -98l-26 45q126 68 178 222l-253 125v10l253 124q-55 157 -178 224l26 42q148 -88 200 -242l92 45q-56 105 -148 155l26 42q112 -67 170 -174l116 57v-67l-90 -45q29 -77 29 -167 t-30 -166l91 -45v-67zM359 163l101 -51q28 72 28 141q0 68 -28 142l-101 -50q9 -43 9 -92q0 -48 -9 -90zM178 254l133 -67q7 32 7 66t-7 68z" />
+<glyph unicode="&#x2997;" horiz-adv-x="488" d="M466 719l-124 -141v-651l123 -140h-27l-250 217v498l250 217h28z" />
+<glyph unicode="&#x2998;" horiz-adv-x="488" d="M300 4l-250 -217h-28l124 141v651l-123 140h28l249 -217v-498z" />
+<glyph unicode="&#x2999;" horiz-adv-x="211" d="M161 604q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40zM161 134q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5t39.5 16.5q22 0 38.5 -17t16.5 -40zM161 -101q0 -22 -16.5 -38t-39.5 -16t-39 16t-16 39t16.5 39.5 t39.5 16.5q22 0 38.5 -17t16.5 -40zM161 369q0 -23 -16 -38.5t-40 -15.5q-23 0 -39 16t-16 39t16.5 39.5t39.5 16.5q24 0 39.5 -16.5t15.5 -40.5z" />
+<glyph unicode="&#x299a;" horiz-adv-x="511" d="M334 543l-83 -83l82 -83l-83 -83l82 -83l-83 -83l82 -83l-83 -82l82 -84l-35 -35l-118 118l83 84l-82 82l83 84l-82 82l83 84l-82 82l83 84l-82 82l36 36z" />
+<glyph unicode="&#x299b;" d="M662 0h-457q0 -35 4 -62l-65 -10q-5 29 -5 72h-97v66h101q18 141 106 254l-181 182l48 45l176 -177q27 27 55 48l40 -53q-25 -19 -48 -42zM503 66l-207 207q-70 -93 -86 -207h293z" />
+<glyph unicode="&#x299c;" d="M634 0h-584v584h66v-279h239v-239h279v-66zM305 66v189h-189v-189h189z" />
+<glyph unicode="&#x299d;" d="M285 172q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM634 0h-584v584h66v-205q130 0 221.5 -91.5t91.5 -221.5h205v-66zM116 66h263q0 109 -77 186t-186 77v-263z" />
+<glyph unicode="&#x299e;" d="M562 283l48 -25q35 -18 50 -36.5t15 -45.5q0 -33 -25.5 -57.5t-63.5 -24.5q-29 0 -50.5 9t-24.5 9q-9 0 -17 -14h-17v94h19q12 -42 29 -59.5t51 -17.5q24 0 37.5 12.5t13.5 29.5q0 32 -34 51l-35 20q-40 23 -57 40.5t-17 40.5q0 35 26 58t65 23q19 0 37 -9.5t28 -9.5 q5 0 11 6h12v-89h-19q-4 42 -21 61.5t-49 19.5q-22 0 -35 -11.5t-13 -32.5q0 -23 36 -42zM631 0h-620l546 547l48 -45l-435 -436h461v-66z" />
+<glyph unicode="&#x299f;" d="M643 0h-619l529 396l38 -53l-368 -277h420v-66z" />
+<glyph unicode="&#x29a0;" d="M654 253l-421 -177q11 -26 27 -55l-57 -34q-19 34 -31 64l-90 -37l-25 60l93 40q-19 67 -19 139q0 69 18 135l-92 38l25 62l88 -37q11 31 32 66l57 -34q-13 -21 -28 -57zM482 253l-270 110q-15 -54 -15 -110q0 -57 15 -114z" />
+<glyph unicode="&#x29a1;" d="M607 464l-34 -57q-21 13 -57 28l-172 -423l-178 421q-26 -11 -55 -27l-34 57q34 19 64 31l-37 90l60 25l40 -93q67 19 139 19q69 0 135 -18l38 92l62 -25l-37 -88q31 -11 66 -32zM342 184l111 270q-54 15 -112 15q-55 0 -112 -15z" />
+<glyph unicode="&#x29a2;" d="M662 547l-546 -547l-48 45l435 436h-461v66h620z" />
+<glyph unicode="&#x29a3;" d="M662 0h-620v66h461l-435 436l48 45z" />
+<glyph unicode="&#x29a4;" d="M643 0h-620l546 547l48 -45l-435 -436h461v-66zM643 -200h-620v66h620v-66z" />
+<glyph unicode="&#x29a5;" d="M662 0h-620v66h461l-435 436l48 45zM662 -200h-620v66h620v-66z" />
+<glyph unicode="&#x29a6;" horiz-adv-x="900" d="M860 0h-588l-232 521l59 26l215 -481h546v-66z" />
+<glyph unicode="&#x29a7;" horiz-adv-x="900" d="M860 481h-546l-215 -481l-59 26l232 521h588v-66z" />
+<glyph unicode="&#x29a8;" d="M649 0h-97q0 -43 -5 -72l-65 10q4 27 4 62h-457l323 323q-22 23 -48 42l40 53q28 -21 55 -48l90 91q10 12 10 19q0 24 -36 24q-49 1 -98 10l1 27q44 -3 81 -3q106 0 195 36l7 -7q-37 -89 -37 -190q0 -22 4 -84l-28 -1q-10 42 -10 98q0 32 -21 32q-13 0 -22 -9l-93 -93 q88 -113 106 -254h101v-66zM188 66h293q-16 114 -86 207z" />
+<glyph unicode="&#x29a9;" d="M656 0h-457q0 -35 4 -62l-65 -10q-5 29 -5 72h-97v66h101q18 141 106 254l-93 93q-9 9 -22 9q-21 0 -21 -32q0 -56 -10 -98l-28 1q4 62 4 84q0 101 -37 190l7 7q89 -36 195 -36q38 0 81 3l1 -27q-49 -9 -98 -10q-36 0 -36 -24q0 -7 10 -19l90 -91q27 27 55 48l40 -53 q-25 -19 -48 -42zM497 66l-207 207q-70 -93 -86 -207h293z" />
+<glyph unicode="&#x29aa;" d="M649 -61l-7 -7q-89 36 -195 36q-37 0 -81 -3l-1 27q49 9 98 10q36 0 36 24q0 7 -10 19l-90 91q-27 -27 -55 -48l-40 53q26 19 48 42l-323 323h457q0 35 -4 62l65 10q5 -29 5 -72h97v-66h-101q-18 -141 -106 -254l93 -93q9 -9 22 -9q21 0 21 32q0 56 10 98l28 -1 q-4 -62 -4 -84q0 -101 37 -190zM481 440h-293l207 -207q70 93 86 207z" />
+<glyph unicode="&#x29ab;" d="M656 506l-323 -323q23 -23 48 -42l-40 -53q-28 21 -55 48l-90 -91q-10 -12 -10 -19q0 -24 36 -24q49 -1 98 -10l-1 -27q-43 3 -81 3q-106 0 -195 -36l-7 7q37 89 37 190q0 22 -4 84l28 1q10 -42 10 -98q0 -32 21 -32q13 0 22 9l93 93q-88 113 -106 254h-101v66h97 q0 43 5 72l65 -10q-4 -27 -4 -62h457zM497 440h-293q16 -114 86 -207z" />
+<glyph unicode="&#x29ac;" horiz-adv-x="706" d="M673 562l7 -7q-36 -89 -36 -195q0 -38 3 -81l-27 -1q-9 49 -10 98q0 36 -24 36q-7 0 -19 -10l-91 -90q27 -27 48 -55l-53 -40q-19 25 -42 48l-323 -323v457q-35 0 -62 -4l-10 65q29 5 72 5v97h66v-101q141 -18 254 -106l93 93q9 9 9 22q0 21 -32 21q-56 0 -98 10l1 28 q62 -4 84 -4q101 0 190 37zM172 101l207 207q-93 70 -207 86v-293z" />
+<glyph unicode="&#x29ad;" horiz-adv-x="706" d="M672 460l-10 -65q-27 4 -62 4v-457l-323 323q-23 -23 -42 -48l-53 40q21 28 48 55l-91 90q-12 10 -19 10q-24 0 -24 -36q-1 -49 -10 -98l-27 1q3 43 3 81q0 106 -36 195l7 7q89 -37 190 -37q22 0 84 4l1 -28q-42 -10 -98 -10q-32 0 -32 -21q0 -13 9 -22l93 -93 q113 88 254 106v101h66v-97q43 0 72 -5zM534 101v293q-114 -16 -207 -86z" />
+<glyph unicode="&#x29ae;" horiz-adv-x="706" d="M680 -51l-7 -7q-89 37 -190 37q-22 0 -84 -4l-1 28q42 10 98 10q32 0 32 21q0 13 -9 22l-93 93q-113 -88 -254 -106v-101h-66v97q-43 0 -72 5l10 65q27 -4 62 -4v457l323 -323q23 23 42 48l53 -40q-21 -28 -48 -55l91 -90q12 -10 19 -10q24 0 24 36q1 49 10 98l27 -1 q-3 -43 -3 -81q0 -106 36 -195zM379 196l-207 207v-293q114 16 207 86z" />
+<glyph unicode="&#x29af;" horiz-adv-x="708" d="M662 109l10 -65q-29 -5 -72 -5v-97h-66v101q-141 18 -254 106l-93 -93q-9 -9 -9 -22q0 -21 32 -21q56 0 98 -10l-1 -28q-62 4 -84 4q-101 0 -190 -37l-7 7q36 89 36 195q0 38 -3 81l27 1q9 -49 10 -98q0 -36 24 -36q7 0 19 10l91 90q-27 27 -48 55l53 40q19 -25 42 -48 l323 323v-457q35 0 62 4zM534 110v293l-207 -207q93 -70 207 -86z" />
+<glyph unicode="&#x29b0;" horiz-adv-x="762" d="M126 583l58 -66q94 66 197 66q136 0 233.5 -97.5t97.5 -233.5q0 -135 -94 -231l87 -100h-69l-58 66q-90 -66 -197 -66q-136 0 -233.5 97.5t-97.5 233.5q0 132 95 230l-88 101h69zM228 466l346 -395q72 74 72 182q0 110 -77.5 187t-187.5 77q-41 0 -85.5 -14.5 t-67.5 -36.5zM535 36l-348 398q-71 -79 -71 -181q0 -110 77.5 -188t187.5 -78q85 0 154 49z" />
+<glyph unicode="&#x29b1;" horiz-adv-x="762" d="M705 583l-88 -101q95 -98 95 -230q0 -136 -97.5 -233.5t-233.5 -97.5q-107 0 -197 66l-58 -66h-69l87 100q-94 96 -94 231q0 136 97.5 233.5t233.5 97.5q103 0 197 -66l58 66h69zM575 434l-348 -398q69 -49 154 -49q110 0 187.5 78t77.5 188q0 102 -71 181zM188 71 l346 395q-23 22 -67.5 36.5t-85.5 14.5q-110 0 -187.5 -77t-77.5 -187q0 -108 72 -182zM681 667h-600v50h600v-50z" />
+<glyph unicode="&#x29b2;" horiz-adv-x="762" d="M705 583l-88 -101q95 -98 95 -230q0 -136 -97.5 -233.5t-233.5 -97.5q-107 0 -197 66l-58 -66h-69l87 100q-94 96 -94 231q0 136 97.5 233.5t233.5 97.5q103 0 197 -66l58 66h69zM575 434l-348 -398q69 -49 154 -49q110 0 187.5 78t77.5 188q0 102 -71 181zM188 71 l346 395q-23 22 -67.5 36.5t-85.5 14.5q-110 0 -187.5 -77t-77.5 -187q0 -108 72 -182zM495 705q0 -48 -33 -81.5t-81 -33.5t-81.5 33.5t-33.5 81.5t33.5 81t81.5 33t81 -33t33 -81zM445 705q0 25 -19.5 44.5t-44.5 19.5t-45 -19.5t-20 -44.5t20 -45t45 -20t44.5 20t19.5 45 z" />
+<glyph unicode="&#x29b3;" horiz-adv-x="762" d="M705 583l-88 -101q95 -98 95 -230q0 -136 -97.5 -233.5t-233.5 -97.5q-107 0 -197 66l-58 -66h-69l87 100q-94 96 -94 231q0 136 97.5 233.5t233.5 97.5q103 0 197 -66l58 66h69zM575 434l-348 -398q69 -49 154 -49q110 0 187.5 78t77.5 188q0 102 -71 181zM188 71 l346 395q-23 22 -67.5 36.5t-85.5 14.5q-110 0 -187.5 -77t-77.5 -187q0 -108 72 -182zM635 716v-8q-52 -23 -81.5 -46t-70.5 -71l-16 14q19 32 33 45q12 10 12 22q0 5 -4.5 10t-12.5 5h-352v50h349q10 0 15 5.5t5 11.5t-11 19q-16 18 -33 45l15 14q42 -48 71 -71t81 -45z " />
+<glyph unicode="&#x29b4;" horiz-adv-x="762" d="M705 583l-88 -101q95 -98 95 -230q0 -136 -97.5 -233.5t-233.5 -97.5q-107 0 -197 66l-58 -66h-69l87 100q-94 96 -94 231q0 136 97.5 233.5t233.5 97.5q103 0 197 -66l58 66h69zM575 434l-348 -398q69 -49 154 -49q110 0 187.5 78t77.5 188q0 102 -71 181zM188 71 l346 395q-23 22 -67.5 36.5t-85.5 14.5q-110 0 -187.5 -77t-77.5 -187q0 -108 72 -182zM598 687h-349q-10 0 -15 -5.5t-5 -11.5t11 -19q16 -18 33 -45l-15 -14q-42 48 -71 71t-81 45v8q53 23 82 46t70 70l16 -14q-17 -29 -33 -44q-12 -10 -12 -22q0 -5 4.5 -10t12.5 -5h352 v-50z" />
+<glyph unicode="&#x29b5;" horiz-adv-x="910" d="M886 219h-61q-13 -142 -119 -240t-251 -98t-251 98t-119 240h-61v66h61q13 142 119 240t251 98t251 -98t119 -240h61v-66zM152 285h606q-12 115 -99 193.5t-204 78.5t-204 -78.5t-99 -193.5zM758 219h-606q12 -115 99 -193.5t204 -78.5t204 78.5t99 193.5z" />
+<glyph unicode="&#x29b6;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM454 555v-606q116 12 194 99t78 204t-78 204t-194 99zM388 -51v606q-116 -12 -194 -99t-78 -204t78 -204t194 -99z" />
+<glyph unicode="&#x29b7;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM560 39h-66v426h66 v-426zM346 39h-66v426h66v-426z" />
+<glyph unicode="&#x29b8;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM230 490l429 -429q67 83 67 191q0 126 -89.5 215.5t-215.5 89.5q-108 0 -191 -67zM612 14l-429 429q-67 -83 -67 -191q0 -126 89.5 -215.5 t215.5 -89.5q108 0 191 67z" />
+<glyph unicode="&#x29b9;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM630 77h-418v66h176 v367h66v-367h176v-66z" />
+<glyph unicode="&#x29ba;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM454 285h270q-11 107 -87.5 183t-182.5 87v-270zM388 285v270q-106 -11 -182.5 -87t-87.5 -183h270zM724 219h-606q13 -118 101 -195 t208 -77q113 0 199 79.5t98 192.5z" />
+<glyph unicode="&#x29bb;" horiz-adv-x="842" d="M781 564l-75 -75q86 -102 86 -237q0 -134 -86 -238l74 -74l-47 -47l-74 74q-104 -86 -238 -86q-135 0 -238 87l-75 -75l-47 47l75 75q-86 102 -86 237q0 134 86 238l-74 74l47 47l74 -74q104 86 238 86q135 0 238 -87l75 75zM421 299l191 191q-83 67 -191 67t-191 -67z M468 252l191 -191q67 83 67 191q0 106 -67 191zM374 252l-191 191q-67 -83 -67 -191q0 -106 67 -191zM612 14l-191 191l-191 -191q83 -67 191 -67t191 67z" />
+<glyph unicode="&#x29bc;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM631 141 q0 -24 -17 -41t-42 -17q-23 0 -40 17.5t-17 40.5t18 40.5t41 17.5q22 0 39.5 -17.5t17.5 -40.5zM624 408l-360 -360l-47 47l360 360zM327 364q0 -24 -17 -40.5t-41 -16.5q-23 0 -40.5 17t-17.5 40t17.5 41t40.5 18t40.5 -18t17.5 -41z" />
+<glyph unicode="&#x29bd;" horiz-adv-x="842" d="M454 694v-72q143 -13 240.5 -119.5t97.5 -250.5t-97.5 -250.5t-240.5 -119.5v-61h-66v61q-143 13 -240.5 119.5t-97.5 250.5t97.5 250.5t240.5 119.5v73q0 7 -7.5 16.5t-14.5 9.5q-11 0 -25 -14q-58 -56 -97 -82l-19 20q143 122 191 237h10q50 -115 191 -238l-19 -20 q-16 11 -31 24l-36 32l-29 26q-16 14 -28 14q-20 0 -20 -26zM454 555v-606q116 12 194 99t78 204t-78 204t-194 99zM388 -51v606q-116 -12 -194 -99t-78 -204t78 -204t194 -99z" />
+<glyph unicode="&#x29be;" horiz-adv-x="842" d="M614 252q0 -79 -57 -136t-136 -57q-80 0 -136 56.5t-56 136.5q0 78 56.5 135t135.5 57q84 0 138.5 -56t54.5 -136zM548 251q0 54 -36.5 90.5t-90.5 36.5t-90 -36.5t-36 -90.5t36 -90t90 -36t90.5 36t36.5 90zM792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5 t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5z" />
+<glyph unicode="&#x29bf;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM554 252 q0 -56 -39.5 -95.5t-95.5 -39.5q-57 0 -96 39.5t-39 97.5q0 56 39.5 94.5t97.5 38.5q55 0 94 -39.5t39 -95.5z" />
+<glyph unicode="&#x29c0;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM568 29l-392 212v21 l392 213v-77l-269 -146l269 -146v-77z" />
+<glyph unicode="&#x29c1;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM666 241l-392 -212 v77l269 146l-269 146v77l392 -213v-21z" />
+<glyph unicode="&#x29c2;" horiz-adv-x="1091" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM1056 252 q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1006 252q0 32 -23 55t-55 23t-55 -23t-23 -55t23 -55t55 -23t55 23t23 55z" />
+<glyph unicode="&#x29c3;" horiz-adv-x="1091" d="M1056 155h-277q-32 -120 -131.5 -197t-226.5 -77q-154 0 -262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5q127 0 226 -77t132 -196h277v-50h-267q3 -24 3 -48t-3 -47h267v-50zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5 t215.5 -89.5t215.5 89.5t89.5 215.5z" />
+<glyph unicode="&#x29c4;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM799 -92v651l-650 -651h650zM762 596h-651v-652z" />
+<glyph unicode="&#x29c5;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM799 -56v652h-651zM761 -92l-650 651v-651h650z" />
+<glyph unicode="&#x29c6;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM688 142q0 -21 -13 -35.5t-40 -14.5q-19 0 -36 15t-30.5 35.5t-41.5 48t-63 47.5q0 -57 22 -120t22 -76q0 -22 -16 -38.5t-37 -16.5q-22 0 -37.5 16t-15.5 39q0 13 22 76t22 120q-37 -25 -84 -76t-60 -58q-22 -12 -36 -12q-23 0 -37.5 13.5 t-14.5 29.5q0 15 8 31.5t23 22.5q4 2 74 18.5t116 43.5q-46 26 -114.5 41.5t-77.5 19.5q-29 14 -29 45q0 21 13.5 37t37.5 16q11 0 28 -9q15 -9 62.5 -59.5t90.5 -75.5q0 57 -22 122.5t-22 78.5q0 22 15.5 36t37.5 14t37.5 -14t15.5 -36q0 -13 -22 -78t-22 -122q45 23 73 51 t44 51.5t29 31.5q18 9 29 9q23 0 36 -14.5t13 -38.5q0 -33 -30 -46q-3 -2 -64.5 -14.5t-122.5 -45.5q55 -31 119 -45t69 -17q29 -14 29 -47zM799 -92v688h-688v-688h688z" />
+<glyph unicode="&#x29c7;" horiz-adv-x="910" d="M647 253q0 -79 -57 -136t-136 -57q-80 0 -136 56.5t-56 136.5q0 78 56.5 135t135.5 57q84 0 138.5 -56t54.5 -136zM595 252q0 58 -41.5 99.5t-99.5 41.5q-59 0 -99.5 -41t-40.5 -100t40.5 -99.5t99.5 -40.5t100 40.5t41 99.5zM865 -158h-820v820h820v-820zM799 -92v688 h-688v-688h688z" />
+<glyph unicode="&#x29c8;" horiz-adv-x="910" d="M865 -158h-820v820h820v-820zM640 66h-370v390h370v-390zM588 118v286h-266v-286h266zM799 -92v688h-688v-688h688z" />
+<glyph unicode="&#x29c9;" horiz-adv-x="1046" d="M982 -207h-612v308h-306v611h612v-308h306v-611zM610 404v242h-480v-479h240v237h240zM610 167v171h-174v-171h174zM916 -141v479h-240v-237h-240v-242h480z" />
+<glyph unicode="&#x29ca;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM636 940q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM995 -61l-422 739l-424 -739h846z" />
+<glyph unicode="&#x29cb;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM995 -61l-422 739l-424 -739h846zM1110 -259h-1075v66h1075v-66z" />
+<glyph unicode="&#x29cc;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM559 239l53 -27q39 -20 56.5 -40t17.5 -50q0 -37 -28.5 -63.5t-71.5 -26.5q-33 0 -57 10t-28 10q-3 0 -5 -1t-4 -2.5t-3 -2.5l-3 -5q-2 -3 -3 -4h-19v101h21q12 -46 31.5 -64.5t57.5 -18.5q27 0 43 14t16 33q0 36 -40 55l-43 20q-79 37 -79 91 q0 38 29 62.5t72 24.5q21 0 42 -10t31 -10q7 0 14 7h12v-98h-21q-4 47 -23.5 68t-55.5 21q-52 0 -52 -49q0 -25 40 -45zM995 -61l-422 739l-424 -739h846z" />
+<glyph unicode="&#x29cd;" horiz-adv-x="1165" d="M1150 -127h-1135v66h68l500 872l499 -872h68v-66zM1005 -61l-422 739l-424 -739h846z" />
+<glyph unicode="&#x29ce;" horiz-adv-x="780" d="M627 420l-557 -278v556zM482 419v2l-346 172v-346zM710 -193l-557 278l557 278v-556zM644 -88v346l-346 -172v-2z" />
+<glyph unicode="&#x29cf;" horiz-adv-x="857" d="M777 -25h-66v556h66v-556zM605 -25l-557 278l557 278v-556zM539 80v346l-346 -172v-2z" />
+<glyph unicode="&#x29d0;" horiz-adv-x="857" d="M809 253l-557 -278v556zM664 252v2l-346 172v-346zM146 -25h-66v556h66v-556z" />
+<glyph unicode="&#x29d1;" horiz-adv-x="810" d="M716 -80l-312 287l-311 -287v662l311 -286l312 286v-662zM650 70v363l-197 -182z" />
+<glyph unicode="&#x29d2;" horiz-adv-x="810" d="M716 -80l-312 287l-311 -287v662l311 -286l312 286v-662zM356 251l-197 182v-363z" />
+<glyph unicode="&#x29d3;" horiz-adv-x="810" d="M716 -80l-312 287l-311 -287v662l311 -286l312 286v-662z" />
+<glyph unicode="&#x29d4;" horiz-adv-x="810" d="M717 -80l-312 287l-311 -287v662l311 -286l312 286v-88l-263 -243l263 -244v-87z" />
+<glyph unicode="&#x29d5;" horiz-adv-x="810" d="M716 -80l-311 287l-312 -287v87l263 244l-263 243v88l312 -286l311 286v-662z" />
+<glyph unicode="&#x29d6;" horiz-adv-x="810" d="M736 -100h-662l285 351l-285 351h662l-285 -351zM598 536h-386l193 -239zM598 -34l-193 239l-193 -239h386z" />
+<glyph unicode="&#x29d7;" horiz-adv-x="810" d="M736 -100h-662l285 351l-285 351h662l-285 -351z" />
+<glyph unicode="&#x29d8;" horiz-adv-x="511" d="M334 501l-83 -83l82 -83l-83 -83l82 -83l-83 -83l82 -83l-117 -119l-37 36l83 84l-82 82l83 84l-82 82l83 84l-82 82l83 84l-82 82l36 36z" />
+<glyph unicode="&#x29d9;" horiz-adv-x="511" d="M333 -80l-37 -36l-117 119l82 83l-83 83l82 83l-83 83l82 83l-83 83l117 119l36 -36l-82 -82l83 -84l-82 -82l83 -84l-82 -82l83 -84l-82 -82z" />
+<glyph unicode="&#x29da;" horiz-adv-x="688" d="M334 501l-83 -83l82 -83l-83 -83l82 -83l-83 -83l82 -83l-117 -119l-37 36l83 84l-82 82l83 84l-82 82l83 84l-82 82l83 84l-82 82l36 36zM511 501l-83 -83l82 -83l-83 -83l82 -83l-83 -83l82 -83l-117 -119l-37 36l83 84l-82 82l83 84l-82 82l83 84l-82 82l83 84l-82 82 l36 36z" />
+<glyph unicode="&#x29db;" horiz-adv-x="688" d="M334 -80l-37 -36l-117 119l82 83l-83 83l82 83l-83 83l82 83l-83 83l117 119l36 -36l-82 -82l83 -84l-82 -82l83 -84l-82 -82l83 -84l-82 -82zM511 -80l-37 -36l-117 119l82 83l-83 83l82 83l-83 83l82 83l-83 83l117 119l36 -36l-82 -82l83 -84l-82 -82l83 -84l-82 -82 l83 -84l-82 -82z" />
+<glyph unicode="&#x29dc;" horiz-adv-x="926" d="M824 226h30q0 -108 -52.5 -167t-123.5 -59q-67 0 -113 41t-84 117q-55 -88 -105.5 -123t-117.5 -35q-88 0 -138 65.5t-50 146.5q0 96 55.5 157t126.5 61q66 0 110 -42.5t111 -156.5q85 -147 194 -147q68 0 112.5 37.5t44.5 103.5v1zM424 241q-2 2 -18 23t-26 30t-29 24 t-42.5 21.5t-51.5 6.5q-67 0 -112 -37.5t-45 -103.5q0 -54 33.5 -87.5t90.5 -33.5q62 0 99 28t101 129z" />
+<glyph unicode="&#x29dd;" horiz-adv-x="926" d="M854 210q0 -98 -53 -154t-123 -56q-67 0 -113 41t-84 117q-55 -88 -105.5 -123t-117.5 -35q-88 0 -138 65.5t-50 146.5q0 96 55.5 157t126.5 61q15 0 23 -1q1 114 54.5 169t132.5 55t132.5 -55t54.5 -169q8 1 24 1q26 0 53.5 -9t58 -31t50 -68.5t19.5 -111.5zM619 426v2 q0 66 -44.5 103.5t-112.5 37.5t-112.5 -37.5t-44.5 -103.5v-6q30 -10 56.5 -34.5t41.5 -48t38 -65.5q56 78 97 111t81 41zM501 192v-3q16 -21 26 -33t32 -32t49.5 -30t58.5 -10q68 0 112.5 37.5t44.5 103.5q0 53 -33.5 87t-90.5 34q-41 0 -69 -13.5t-54.5 -42.5t-75.5 -98z M424 241q-2 2 -18 23t-26 30t-29 24t-42.5 21.5t-51.5 6.5q-67 0 -112 -37.5t-45 -103.5q0 -54 33.5 -87.5t90.5 -33.5q62 0 99 28t101 129z" />
+<glyph unicode="&#x29de;" horiz-adv-x="926" d="M487 695v-353q49 56 90 72t96 16q26 0 53.5 -9t58 -31t50 -68.5t19.5 -111.5q0 -98 -53 -154t-123 -56q-120 0 -191 131v-320h-50v274q-73 -85 -179 -85q-88 0 -138 65.5t-50 146.5q0 96 55.5 157t126.5 61q63 0 105.5 -35.5t79.5 -99.5v400h50zM493 192v-3 q79 -105 174 -105q68 0 112.5 37.5t44.5 103.5q0 53 -33.5 87t-90.5 34q-60 0 -99 -29t-108 -125zM432 241q-1 1 -13 16l-17 21l-20 18q-13 13 -24 20l-28 14q-16 9 -34.5 12.5t-38.5 3.5q-67 0 -112 -37.5t-45 -103.5q0 -54 33.5 -87.5t90.5 -33.5q64 0 104.5 29t103.5 128 z" />
+<glyph unicode="&#x29df;" horiz-adv-x="1145" d="M346 286h453q11 51 52 84t94 33q62 0 106 -44t44 -106t-44 -106t-106 -44q-53 0 -94 33t-52 84h-453q-11 -51 -52 -84t-94 -33q-62 0 -106 44t-44 106t44 106t106 44q53 0 94 -33t52 -84zM1045 253q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5t29.5 -70.5 t70.5 -29.5t70.5 29.5t29.5 70.5zM300 253q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5t29.5 -70.5t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x29e0;" horiz-adv-x="910" d="M865 -157h-712l-108 64v755h712l108 -64v-755zM799 -91v623h-622v-623h622z" />
+<glyph unicode="&#x29e1;" horiz-adv-x="667" d="M613 192h-589l589 320v-320zM546 258v144l-265 -144h265zM613 -8h-589v66h589v-66z" />
+<glyph unicode="&#x29e2;" horiz-adv-x="790" d="M726 0h-662v414h50v-348h256v348h50v-348h256v348h50v-414z" />
+<glyph unicode="&#x29e3;" d="M637 120h-215l-109 -276h-55l109 276h-156l-109 -276h-55l109 276h-108v66h134l53 134h-187v66h213l110 276h55l-110 -276h156l110 276h55l-110 -276h110v-66h-136l-53 -134h189v-66zM446 320h-156l-53 -134h156z" />
+<glyph unicode="&#x29e4;" d="M637 120h-215l-109 -276h-55l109 276h-156l-109 -276h-55l109 276h-108v66h134l53 134h-187v66h213l110 276h55l-110 -276h156l110 276h55l-110 -276h110v-66h-136l-53 -134h189v-66zM446 320h-156l-53 -134h156zM618 842h19q-3 -48 -36.5 -93t-77.5 -45q-32 0 -100 44 t-89 44q-31 0 -54.5 -25t-31.5 -63h-20q2 53 37 95.5t80 42.5q33 0 101 -44t88 -44q32 0 54 24.5t30 63.5z" />
+<glyph unicode="&#x29e5;" d="M637 28h-251l-73 -184h-55l73 184h-155l-73 -184h-55l73 184h-73v66h99l50 126h-149v66h175l50 126h-225v66h251l73 184h55l-73 -184h155l73 184h55l-73 -184h73v-66h-99l-50 -126h149v-66h-175l-50 -126h225v-66zM483 412h-155l-50 -126h155zM407 220h-155l-50 -126h155 z" />
+<glyph unicode="&#x29e6;" horiz-adv-x="798" d="M738 -78h-66v198h-546v-198h-66v662h66v-199h546v199h66v-662zM672 186v133h-546v-133h546z" />
+<glyph unicode="&#x29e7;" horiz-adv-x="628" d="M580 62h-233v-251h-66v251h-233v66h233v250h-233v66h233v251h66v-251h233v-66h-233v-250h233v-66z" />
+<glyph unicode="&#x29e8;" horiz-adv-x="1145" d="M1110 811l-538 -938l-537 938h1075zM996 745h-424v-739z" />
+<glyph unicode="&#x29e9;" horiz-adv-x="1145" d="M1110 811l-537 -938l-538 938h1075zM573 745h-424l424 -739v739z" />
+<glyph unicode="&#x29ea;" horiz-adv-x="762" d="M730 394l-316 -316v-137q0 -8 7.5 -17t14.5 -9q11 0 25 14q29 29 86 67l19 -20l-74 -66q-24 -23 -55.5 -64.5t-50.5 -86.5h-10q-19 45 -50.5 86.5t-56.5 65.5t-74 66l19 20q60 -42 86 -67q14 -14 28 -14q20 0 20 26v136l-316 316l349 350z" />
+<glyph unicode="&#x29eb;" horiz-adv-x="790" d="M745 253l-351 -542l-349 542l350 542z" />
+<glyph unicode="&#x29ec;" horiz-adv-x="762" d="M348 -58v141q-126 12 -212 106t-86 223q0 137 97 234t234 97t234 -97t97 -234q0 -128 -86 -222.5t-212 -106.5v-142q0 -8 7.5 -17t14.5 -9q11 0 25 14q29 29 86 67l19 -20l-74 -66q-24 -23 -55.5 -64.5t-50.5 -86.5h-10q-19 45 -50.5 86.5t-56.5 65.5t-74 66l19 20 q60 -42 86 -67q14 -14 28 -14q20 0 20 26zM646 412q0 110 -78 187.5t-187 77.5t-187 -77.5t-78 -187.5t78 -187.5t187 -77.5t187 77.5t78 187.5z" />
+<glyph unicode="&#x29ed;" horiz-adv-x="762" d="M348 -58v141q-126 12 -212 106t-86 223q0 137 97 234t234 97t234 -97t97 -234q0 -128 -86 -222.5t-212 -106.5v-142q0 -8 7.5 -17t14.5 -9q11 0 25 14q29 29 86 67l19 -20l-74 -66q-24 -23 -55.5 -64.5t-50.5 -86.5h-10q-19 45 -50.5 86.5t-56.5 65.5t-74 66l19 20 q60 -42 86 -67q14 -14 28 -14q20 0 20 26z" />
+<glyph unicode="&#x29ee;" horiz-adv-x="762" d="M665 -32h-251v-145h174v-66h-398v66h158v145h-251v568h251v145h-158v66h398v-66h-174v-145h251v-568zM599 34v436h-436v-436h436z" />
+<glyph unicode="&#x29ef;" horiz-adv-x="762" d="M665 -32h-251v-145h174v-66h-398v66h158v145h-251v568h251v145h-158v66h398v-66h-174v-145h251v-568z" />
+<glyph unicode="&#x29f0;" horiz-adv-x="762" d="M730 252l-316 -316v-113h174v-66h-398v66h158v113l-316 316l316 316v113h-158v66h398v-66h-174v-113zM637 252l-256 256l-256 -256l256 -256z" />
+<glyph unicode="&#x29f1;" horiz-adv-x="762" d="M730 252l-316 -316v-113h174v-66h-398v66h158v113l-316 316l316 316v113h-158v66h398v-66h-174v-113z" />
+<glyph unicode="&#x29f2;" horiz-adv-x="762" d="M406 681v-114q122 -10 206.5 -101t84.5 -214t-84 -214t-207 -101v-114h174v-66h-398v66h158v116q-118 15 -196.5 104.5t-78.5 208.5q0 118 78.5 207.5t196.5 105.5v116h-158v66h398v-66h-174zM631 252q0 103 -73.5 176.5t-176.5 73.5t-176.5 -73.5t-73.5 -176.5 t73.5 -176.5t176.5 -73.5t176.5 73.5t73.5 176.5z" />
+<glyph unicode="&#x29f3;" horiz-adv-x="762" d="M406 681v-114q122 -10 206.5 -101t84.5 -214t-84 -214t-207 -101v-114h174v-66h-398v66h158v116q-118 15 -196.5 104.5t-78.5 208.5q0 118 78.5 207.5t196.5 105.5v116h-158v66h398v-66h-174z" />
+<glyph unicode="&#x29f4;" horiz-adv-x="926" d="M182 458q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM182 51q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5zM871 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96 q14 14 14 28q0 20 -26 20h-501v66h502q8 0 17 7.5t9 14.5q0 11 -14 25q-51 49 -82 96l20 19q124 -143 237 -190z" />
+<glyph unicode="&#x29f5;" horiz-adv-x="523" d="M478 -222h-72l-360 932h72z" />
+<glyph unicode="&#x29f6;" horiz-adv-x="520" d="M388 715h-256v50h256v-50zM426 662l-269 -742h-63l269 742h63z" />
+<glyph unicode="&#x29f7;" horiz-adv-x="520" d="M426 -80h-63l-126 346h-136v50h118l-125 346h63l125 -346h136v-50h-118z" />
+<glyph unicode="&#x29f8;" horiz-adv-x="602" d="M517 695l-370 -1020h-62l370 1020h62z" />
+<glyph unicode="&#x29f9;" horiz-adv-x="602" d="M517 -325h-62l-370 1020h62z" />
+<glyph unicode="&#x29fa;" d="M621 220h-180v-245h-66v245h-65v-245h-66v245h-180v66h180v246h66v-246h65v246h66v-246h180v-66z" />
+<glyph unicode="&#x29fb;" d="M621 220h-113v-245h-66v245h-66v-245h-66v245h-66v-245h-66v245h-114v66h114v246h66v-246h66v246h66v-246h66v246h66v-246h113v-66z" />
+<glyph unicode="&#x29fc;" horiz-adv-x="459" d="M394 -136v-77q-45 146 -128 262t-189 168v66q106 52 189 168t128 262v-77q-43 -253 -249 -384v-4q206 -131 249 -384z" />
+<glyph unicode="&#x29fd;" horiz-adv-x="459" d="M382 283v-66q-106 -52 -189 -168t-128 -262v77q43 253 249 384v4q-206 131 -249 384v77q45 -146 128 -262t189 -168z" />
+<glyph unicode="&#x29fe;" horiz-adv-x="762" d="M669 190l-258 32l33 -258h-126l32 258l-257 -32v126l257 -32l-32 256h126l-32 -256l257 32v-126z" />
+<glyph unicode="&#x29ff;" horiz-adv-x="762" d="M669 316v-126q-162 32 -288 32q-120 1 -288 -32v126q162 -32 288 -32t288 32z" />
+<glyph unicode="&#x2a00;" horiz-adv-x="1126" d="M646 250q0 -34 -24 -58.5t-59 -24.5t-59 24.5t-24 58.5t24 58.5t59 24.5t59 -24.5t24 -58.5zM1073 252q0 -212 -149 -361.5t-361 -149.5q-138 0 -255.5 68t-186 186t-68.5 257q0 212 149 361.5t361 149.5t361 -149.5t149 -361.5zM993 252q0 178 -126 304.5t-304 126.5 t-304 -126.5t-126 -304.5t126 -304.5t304 -126.5t304 126.5t126 304.5z" />
+<glyph unicode="&#x2a01;" horiz-adv-x="1126" d="M1073 252q0 -212 -149 -361.5t-361 -149.5q-138 0 -255.5 68t-186 186t-68.5 257q0 212 149 361.5t361 149.5t361 -149.5t149 -361.5zM596 285h395q-12 158 -124.5 271t-270.5 126v-397zM530 285v397q-158 -13 -271 -126t-125 -271h396zM991 219h-395v-396 q157 12 270 125t125 271zM530 -177v396h-396q12 -158 125 -271t271 -125z" />
+<glyph unicode="&#x2a02;" horiz-adv-x="1126" d="M1073 252q0 -212 -149 -361.5t-361 -149.5q-138 0 -255.5 68t-186 186t-68.5 257q0 212 149 361.5t361 149.5t361 -149.5t149 -361.5zM563 299l280 280q-122 104 -280 104q-160 0 -280 -104zM610 252l279 -279q104 120 104 279q0 158 -104 280zM516 252l-280 280 q-103 -122 -103 -280t103 -279zM843 -75l-280 280l-280 -280q120 -104 280 -104q158 0 280 104z" />
+<glyph unicode="&#x2a03;" horiz-adv-x="924" d="M545 267q0 -35 -24.5 -59t-58.5 -24t-58.5 24t-24.5 59t24.5 59t58.5 24t58.5 -24t24.5 -59zM830 768v-702q0 -144 -110.5 -237t-263.5 -93q-89 0 -171 40t-136.5 117.5t-54.5 172.5v702h80v-714q0 -95 82 -166.5t200 -71.5t206 72t88 166v714h80z" />
+<glyph unicode="&#x2a04;" horiz-adv-x="924" d="M830 768v-702q0 -144 -110.5 -237t-263.5 -93q-89 0 -171 40t-136.5 117.5t-54.5 172.5v702h80v-714q0 -95 82 -166.5t200 -71.5t206 72t88 166v714h80zM671 146h-175v-174h-66v174h-175v66h175v176h66v-176h175v-66z" />
+<glyph unicode="&#x2a05;" horiz-adv-x="924" d="M830 -259h-80v942h-576v-942h-80v1022h736v-1022z" />
+<glyph unicode="&#x2a06;" horiz-adv-x="924" d="M830 -259h-736v1022h80v-942h576v942h80v-1022z" />
+<glyph unicode="&#x2a07;" horiz-adv-x="1180" d="M1097 -259h-76l-331 877h-2l-58 -153l269 -724h-76l-233 618l-233 -618h-76l269 724l-58 153h-2l-331 -877h-76l380 1022h56l71 -191l71 191h56z" />
+<glyph unicode="&#x2a08;" horiz-adv-x="1180" d="M1097 763l-380 -1022h-56l-71 191l-71 -191h-56l-380 1022h76l331 -877h2l58 153l-269 724h76l233 -618l233 618h76l-269 -724l58 -153h2l331 877h76z" />
+<glyph unicode="&#x2a09;" horiz-adv-x="1021" d="M971 -205l-60 -54l-401 451l-400 -451l-60 54l406 457l-406 457l60 54l400 -450l401 450l60 -54l-407 -457z" />
+<glyph unicode="&#x2a0a;" horiz-adv-x="914" d="M856 40l-53 -299h-745l272 354q-46 35 -72 86.5t-26 109.5q0 99 68 169l-217 303h747v-251h-30q-17 107 -52 146t-130 39h-330l126 -169q32 8 63 8q101 0 173 -72t72 -173t-72 -173t-173 -72q-43 0 -89 16l-146 -190h414q78 0 115 42t55 126h30zM578 306l-157 -202 q29 -8 56 -8q81 0 138 57t57 138t-57 138t-138 57q-11 0 -31 -2zM450 251l-120 168q-48 -56 -48 -128q0 -97 78 -156z" />
+<glyph unicode="&#x2a0b;" horiz-adv-x="690" d="M395 563l11 43q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-13 -53h125v-163h-20q0 3 -6 30q-13 47 -41.5 63.5t-70.5 19.5l-51 -205l28 -30l-47 -47l-50 -200h157 q59 0 89 23t46 81h23l-41 -194h-297l-14 -59q-8 -33 -23 -66t-38 -65t-57 -51.5t-74 -19.5q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l16 65h-207l276 278l13 51l-270 293h343zM383 513h-172 l136 -144zM288 134l-103 -103h77z" />
+<glyph unicode="&#x2a0c;" horiz-adv-x="1184" d="M688 -124l182 730q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-183 -734q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17 q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5zM445 -124l182 730q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-183 -734 q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5zM204 -124l182 730q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17 q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-183 -734q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5zM929 -124l182 730 q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-183 -734q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19 q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5z" />
+<glyph unicode="&#x2a0d;" horiz-adv-x="499" d="M306 285l80 321q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-83 -331h182v-66h-198l-84 -337q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45 q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l85 343h-178v66h195z" />
+<glyph unicode="&#x2a0e;" horiz-adv-x="499" d="M331 385l55 221q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-58 -231h157v-66h-173l-34 -134h207v-66h-223l-59 -237q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35 q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l60 243h-153v66h170l33 134h-203v66h220z" />
+<glyph unicode="&#x2a0f;" horiz-adv-x="499" d="M302 271l84 335q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-74 -296l172 97l31 -59l-225 -127l-87 -349q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45 q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l76 307l-170 -97l-31 58z" />
+<glyph unicode="&#x2a10;" horiz-adv-x="499" d="M354 476l32 130q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-39 -157q73 -33 110 -105l-33 -19q-30 59 -87 86l-88 -356h8q39 0 74 15l17 -34q-44 -19 -91 -19 q-12 0 -18 1l-36 -146q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l42 169q-62 26 -100 82t-38 125q0 93 66 159t159 66q14 0 21 -1zM344 439h-11 q-77 0 -132 -55t-55 -132q0 -56 30 -102t79 -68z" />
+<glyph unicode="&#x2a11;" horiz-adv-x="499" d="M281 187l105 419q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-108 -433q48 6 84.5 32t53.5 59l5 10l1 5q0 12 -14 12q-3 0 -9 -2q-38 -14 -65 -19l-3 12 q100 33 145 76l5 -3q0 -65 42 -157l-12 -6q-16 24 -30 61q-7 13 -14 13t-11 -8q-23 -46 -72.5 -83t-115.5 -41l-65 -262q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8 q33 0 54 40.5t42 124.5l68 275q-73 19 -119.5 79.5t-46.5 137.5h38q0 -64 38.5 -114t98.5 -67z" />
+<glyph unicode="&#x2a12;" horiz-adv-x="519" d="M344 439l42 167q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-35 -139h132v-450h-245l-35 -145q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45 q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l46 189h271v374h-177zM412 253q0 -31 -22 -54.5t-56 -23.5q-35 0 -56.5 21t-21.5 57q0 34 24 56t54 22q31 0 54.5 -22.5t23.5 -55.5z" />
+<glyph unicode="&#x2a13;" horiz-adv-x="499" d="M344 439l42 167q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-34 0 -56 -43t-45 -134l-40 -157q61 -27 98.5 -82.5t37.5 -124.5q0 -93 -66 -159t-159 -66q-12 0 -18 1l-36 -146 q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l51 207q39 -18 79 -18q77 0 132 55t55 132q0 75 -51.5 129t-125.5 58zM412 253q0 -31 -22 -54.5t-56 -23.5 q-35 0 -56.5 21t-21.5 57q0 34 24 56t54 22q31 0 54.5 -22.5t23.5 -55.5z" />
+<glyph unicode="&#x2a14;" horiz-adv-x="628" d="M542 253q0 -31 -22 -54.5t-56 -23.5q-35 0 -56.5 21t-21.5 57q0 34 24 56t54 22q31 0 54.5 -22.5t23.5 -55.5zM462 616l-35 -142q17 3 36 3q93 0 159 -66t66 -159t-66 -159t-159 -66q-76 0 -136 46l-48 -191q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45 q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l81 324q17 -59 66.5 -97t112.5 -38q77 0 131.5 55t54.5 132t-54.5 132t-131.5 55q-79 0 -133 -56l55 223q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45 q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5z" />
+<glyph unicode="&#x2a15;" horiz-adv-x="499" d="M412 253q0 -31 -22 -54.5t-56 -23.5q-35 0 -56.5 21t-21.5 57q0 34 24 56t54 22q31 0 54.5 -22.5t23.5 -55.5zM353 477l33 129q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5 t-44 -133.5l-39 -157q60 -27 97.5 -83t37.5 -124q0 -93 -66 -159t-159 -66q-12 0 -18 1l-36 -146q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l41 169 q-61 26 -99 82t-38 125q0 93 66 159t159 66h20zM521 252q0 77 -55 132t-132 55t-132 -55t-55 -132t55 -132t132 -55t132 55t55 132z" />
+<glyph unicode="&#x2a16;" horiz-adv-x="529" d="M354 477l32 129q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-35 -139h132v-450h-244l-36 -145q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45 q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l37 151h-132v450h245zM521 65v374h-103l-94 -374h197zM344 439h-197v-374h104z" />
+<glyph unicode="&#x2a17;" horiz-adv-x="738" d="M491 304h197q49 0 89.5 -33t40.5 -91q0 -55 -36 -89.5t-81 -34.5h-73v66h70q21 0 37.5 15t16.5 45q0 56 -67 56h-211l-88 -356q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8 q33 0 54 40.5t42 124.5l90 362h-184q-10 0 -17 -7.5t-7 -14.5q0 -11 14 -25q51 -49 82 -96l-20 -19q-122 141 -237 189v10q113 48 238 192l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 22 -20h202l75 302q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45 q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5z" />
+<glyph unicode="&#x2a18;" horiz-adv-x="539" d="M314 319l72 287q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-64 -254l126 125l46 -46l-189 -189l189 -189l-46 -46l-169 169l-76 -304q-12 -47 -33.5 -89.5 t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l66 265l-124 -124l-46 46l189 189l-189 189l46 46z" />
+<glyph unicode="&#x2a19;" horiz-adv-x="559" d="M363 515l23 91q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-34 0 -56 -43t-45 -134l-30 -117q75 -28 119.5 -94.5t44.5 -156.5v-259h-66v255q0 62 -31.5 112.5t-82.5 75.5l-137 -550 q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l143 574h-13q-80 0 -138 -60t-58 -145v-256h-66v256q0 119 75 195t187 76q19 0 29 -1z" />
+<glyph unicode="&#x2a1a;" horiz-adv-x="559" d="M253 73l133 533q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-140 -561h12q80 0 138 60t58 145v256h66v-256q0 -119 -75 -195t-187 -76q-10 0 -28 2l-27 -109 q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5l32 130q-75 28 -119.5 94.5t-44.5 156.5v259h66v-255q0 -61 31.5 -112t83.5 -76z" />
+<glyph unicode="&#x2a1b;" horiz-adv-x="459" d="M639 881h-450v66h450v-66zM204 -124l182 730q9 35 23.5 68.5t37.5 69.5t59 58t78 22q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-31 0 -31 24q0 15 9 27t9 14q0 8 -11 8q-35 0 -57 -43.5t-44 -133.5l-183 -734q-12 -47 -33.5 -89.5t-64 -77.5t-94.5 -35q-55 0 -55 45 q0 25 15.5 42t36.5 17q12 0 21.5 -7t9.5 -19q0 -17 -9 -26.5t-9 -12.5q0 -8 11 -8q33 0 54 40.5t42 124.5z" />
+<glyph unicode="&#x2a1c;" horiz-adv-x="459" d="M209 -112l183 734q12 47 33.5 89.5t64 77.5t94.5 35q55 0 55 -45q0 -25 -15.5 -42t-36.5 -17q-12 0 -21.5 7t-9.5 19q0 17 9 26.5t9 12.5q0 8 -11 8q-33 0 -54 -40.5t-42 -124.5l-182 -730q-9 -35 -23.5 -68.5t-37.5 -69.5t-59 -58t-78 -22q-55 0 -55 45q0 25 15.5 42 t36.5 17q31 0 31 -24q0 -15 -9 -27t-9 -14q0 -8 11 -8q35 0 57 43.5t44 133.5zM482 -443h-450v66h450v-66z" />
+<glyph unicode="&#x2a1d;" horiz-adv-x="1270" d="M1177 -252l-541 460l-543 -460v1022l542 -459l542 459v-1022zM1097 -81v679l-407 -331zM577 253l-404 345v-679z" />
+<glyph unicode="&#x2a1e;" horiz-adv-x="1018" d="M924 -258l-879 511l879 511v-1022zM844 -119v744l-641 -372z" />
+<glyph unicode="&#x2a1f;" horiz-adv-x="503" d="M393 425q0 -58 -41.5 -99.5t-100.5 -41.5t-100 41t-41 100t41 100t100 41t100.5 -41t41.5 -100zM333 424q0 33 -24.5 57t-57.5 24t-57 -24t-24 -57t24 -56.5t57 -23.5t57.5 23.5t24.5 56.5zM178 -291l-33 53q55 27 112 74.5t57 87.5q0 23 -38 23q-4 0 -12 -3t-13 -3 q-59 0 -100 41.5t-41 99.5q0 59 41.5 100.5t99.5 41.5q76 0 117.5 -57t41.5 -136q0 -116 -58.5 -188.5t-173.5 -133.5zM333 82q0 33 -24.5 57.5t-57.5 24.5t-57 -24.5t-24 -57.5t24 -57t57 -24t57.5 24t24.5 57z" />
+<glyph unicode="&#x2a20;" horiz-adv-x="1177" d="M1079 253l-654 -380v76l525 304l-525 304v76zM752 253l-654 -380v76l525 304l-525 304v76z" />
+<glyph unicode="&#x2a21;" horiz-adv-x="547" d="M472 512l-57 -57l-120 143v-898h-80v1105z" />
+<glyph unicode="&#x2a22;" d="M636 220h-261v-261h-66v261h-261v66h261v261h66v-261h261v-66zM464 700q0 -50 -35 -84.5t-85 -34.5t-84.5 34.5t-34.5 84.5t34.5 84.5t84.5 34.5t85 -34.5t35 -84.5zM413 701q0 28 -20.5 48t-48.5 20t-48.5 -20.5t-20.5 -48.5q0 -29 20.5 -49t49.5 -20q28 0 48 20.5 t20 49.5z" />
+<glyph unicode="&#x2a23;" d="M498 540h-34l-122 103l-121 -103h-34l124 167h62zM636 220h-261v-261h-66v261h-261v66h261v261h66v-261h261v-66z" />
+<glyph unicode="&#x2a24;" d="M636 220h-261v-261h-66v261h-261v66h261v261h66v-261h261v-66zM528 704h19q-3 -48 -36.5 -93t-77.5 -45q-32 0 -100 44t-89 44q-31 0 -54.5 -25t-31.5 -63h-20q2 53 37 95.5t80 42.5q33 0 101 -44t88 -44q32 0 54 24.5t30 63.5z" />
+<glyph unicode="&#x2a25;" d="M636 220h-261v-261h-66v261h-261v66h261v261h66v-261h261v-66zM404 -172q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5z" />
+<glyph unicode="&#x2a26;" d="M636 220h-261v-261h-66v261h-261v66h261v261h66v-261h261v-66zM526 -60h20q-2 -53 -37 -95.5t-80 -42.5q-33 0 -101 44t-88 44q-32 0 -54 -24.5t-30 -63.5h-19q3 48 36.5 93t77.5 45q32 0 100 -44t89 -44q31 0 54.5 25t31.5 63z" />
+<glyph unicode="&#x2a27;" d="M629 220h-261v-261h-66v261h-261v66h261v261h66v-261h261v-66zM673 -128l-33 -82h-239v7l112 107q46 44 61 70t15 64q0 33 -20.5 54.5t-54.5 21.5q-32 0 -53.5 -18.5t-40.5 -61.5l-18 5q10 54 42.5 86.5t84.5 32.5q51 0 81.5 -29t30.5 -75q0 -65 -77 -131l-102 -89h133 q19 0 32.5 10.5t28.5 37.5z" />
+<glyph unicode="&#x2a28;" d="M636 220h-261v-1l126 -184h-126v-76h-66v76h-125l125 183v2h-261v66h261v261h66v-261h261v-66z" />
+<glyph unicode="&#x2a29;" d="M299 323l-10 19q44 29 63.5 51t19.5 46q0 13 -14 13q-4 0 -13.5 -2t-15.5 -2q-58 0 -58 51q0 26 16.5 41.5t43.5 15.5q34 0 57 -24.5t23 -62.5q0 -44 -30 -82.5t-82 -63.5zM637 220h-589v66h589v-66z" />
+<glyph unicode="&#x2a2a;" d="M637 220h-589v66h589v-66zM407 58q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5z" />
+<glyph unicode="&#x2a2b;" d="M607 59q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM637 220h-589v66h589v-66zM205 448q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2a2c;" d="M607 448q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM637 220h-589v66h589v-66zM205 59q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2a2d;" horiz-adv-x="724" d="M674 219h-220v-219h-66v219h-220v66h220v220h66v-220h220v-66zM421 -53v-66q-154 0 -262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5v-66q-126 0 -215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5z" />
+<glyph unicode="&#x2a2e;" horiz-adv-x="724" d="M303 557v66q154 0 262.5 -108.5t108.5 -262.5t-108.5 -262.5t-262.5 -108.5v66q126 0 215.5 89.5t89.5 215.5t-89.5 215.5t-215.5 89.5zM556 219h-220v-219h-66v219h-220v66h220v220h66v-220h220v-66z" />
+<glyph unicode="&#x2a2f;" horiz-adv-x="490" d="M439 120l-61 -61l-133 133l-134 -133l-61 61l134 133l-134 133l61 61l133 -133l134 133l61 -61l-134 -133z" />
+<glyph unicode="&#x2a30;" horiz-adv-x="640" d="M597 22l-46 -47l-231 230l-231 -230l-46 46l230 231l-230 231l47 46l230 -230l231 230l46 -45l-230 -232zM386 622q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5z" />
+<glyph unicode="&#x2a31;" horiz-adv-x="640" d="M597 22l-46 -47l-231 230l-231 -230l-46 46l230 231l-230 231l47 46l230 -230l231 230l46 -45l-230 -232zM551 -130h-462v66h462v-66z" />
+<glyph unicode="&#x2a32;" horiz-adv-x="640" d="M597 -45h-554v66l230 231l-230 231l47 46l230 -230l231 230l46 -45l-230 -232l230 -231v-66zM505 21l-185 184l-185 -184h370z" />
+<glyph unicode="&#x2a33;" d="M627 122l-47 -46l-131 130l-60 -60l130 -131l-46 -47l-131 131l-131 -131l-46 47l130 131l-60 60l-131 -130l-47 46l131 131l-131 131l47 46l131 -130l60 60l-130 131l46 47l131 -131l131 131l46 -47l-130 -131l60 -60l131 130l47 -46l-131 -131zM403 253l-61 61l-61 -61 l61 -61z" />
+<glyph unicode="&#x2a34;" horiz-adv-x="674" d="M624 96l-47 -47l-156 156l-156 -156l-47 47l156 156l-156 156l47 47l156 -156l156 156l47 -47l-156 -156zM421 -53v-66q-154 0 -262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5v-66q-126 0 -215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5z" />
+<glyph unicode="&#x2a35;" horiz-adv-x="674" d="M253 557v66q154 0 262.5 -108.5t108.5 -262.5t-108.5 -262.5t-262.5 -108.5v66q126 0 215.5 89.5t89.5 215.5t-89.5 215.5t-215.5 89.5zM456 96l-47 -47l-156 156l-156 -156l-47 47l156 156l-156 156l47 47l156 -156l156 156l47 -47l-156 -156z" />
+<glyph unicode="&#x2a36;" horiz-adv-x="842" d="M792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5t89.5 215.5zM592 643h-34 l-137 103l-136 -103h-34l139 167h62zM624 96l-47 -47l-156 156l-156 -156l-47 47l156 156l-156 156l47 47l156 -156l156 156l47 -47l-156 -156z" />
+<glyph unicode="&#x2a37;" horiz-adv-x="1100" d="M746 103l-47 -47l-149 149l-149 -149l-47 47l149 149l-149 149l47 47l149 -149l149 149l47 -47l-149 -149zM900 252q0 -146 -102 -248t-248 -102t-248 102t-102 248t102 248t248 102t248 -102t102 -248zM848 252q0 124 -87 211t-211 87t-211 -87t-87 -211t87 -211 t211 -87t211 87t87 211zM1050 252q0 -136 -67 -251t-182 -182t-251 -67t-251 67t-182 182t-67 251t67 251t182 182t251 67t251 -67t182 -182t67 -251zM984 252q0 180 -127 307t-307 127t-307 -127t-127 -307t127 -307t307 -127t307 127t127 307z" />
+<glyph unicode="&#x2a38;" horiz-adv-x="842" d="M634 219h-426v66h426v-66zM792 252q0 -154 -108.5 -262.5t-262.5 -108.5t-262.5 108.5t-108.5 262.5t108.5 262.5t262.5 108.5t262.5 -108.5t108.5 -262.5zM726 252q0 126 -89.5 215.5t-215.5 89.5t-215.5 -89.5t-89.5 -215.5t89.5 -215.5t215.5 -89.5t215.5 89.5 t89.5 215.5zM478 410q0 -25 -17 -41t-40 -16t-40 16t-17 41q0 24 15.5 40.5t41.5 16.5t41.5 -15.5t15.5 -41.5zM478 94q0 -25 -17 -41t-40 -16t-40 16t-17 41q0 24 15.5 40.5t41.5 16.5t41.5 -15.5t15.5 -41.5z" />
+<glyph unicode="&#x2a39;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM751 154h-145v-145h-66v145h-145v66h145v145h66v-145h145v-66zM995 -61l-422 739l-424 -739h846z" />
+<glyph unicode="&#x2a3a;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM751 154h-356v66h356v-66zM995 -61l-422 739l-424 -739h846z" />
+<glyph unicode="&#x2a3b;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM722 84l-46 -46l-103 102l-103 -102l-46 46l102 103l-102 103l46 46l103 -102l103 102l46 -46l-102 -103zM995 -61l-422 739l-424 -739h846z" />
+<glyph unicode="&#x2a3c;" horiz-adv-x="600" d="M552 115h-504v66h438v212h66v-278z" />
+<glyph unicode="&#x2a3d;" horiz-adv-x="600" d="M552 115h-504v278h66v-212h438v-66z" />
+<glyph unicode="&#x2a3e;" horiz-adv-x="300" d="M230 401q0 -36 -24 -59.5t-61 -23.5t-61 24t-24 59q0 37 24 62t61 25t61 -25t24 -62zM186 402q0 18 -12 29.5t-29 12.5q-17 -1 -29 -13t-12 -30q0 -17 12 -28t30 -11q16 0 28 12t12 28zM105 -170l-21 39q46 22 68 47.5t22 45.5q0 13 -11 13q-5 0 -11 -1.5t-14 -1.5 q-33 0 -55.5 24t-22.5 59q0 37 23 62t59 25q49 0 68.5 -32.5t19.5 -71.5q0 -76 -24.5 -122t-100.5 -86zM184 55q0 18 -11 30t-28 12t-29 -12t-12 -30q0 -17 11.5 -28t29.5 -11q17 0 28 10.5t11 28.5z" />
+<glyph unicode="&#x2a3f;" horiz-adv-x="694" d="M664 0h-633v19q53 3 65.5 22t12.5 79v433q0 54 -14.5 69.5t-64.5 20.5v19h245v-19q-50 -4 -63 -20t-13 -70v-503h297v503q0 55 -14 70t-64 20v19h246v-19q-50 -4 -64 -20.5t-14 -69.5v-444q0 -51 14 -68.5t64 -21.5v-19z" />
+<glyph unicode="&#x2a40;" horiz-adv-x="620" d="M572 -31h-66v295q0 86 -57 146t-139 60q-80 0 -138 -60t-58 -145v-296h-66v296q0 119 75 195t187 76q113 0 187.5 -75t74.5 -193v-299zM373 215q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5z" />
+<glyph unicode="&#x2a41;" horiz-adv-x="620" d="M572 536v-296q0 -119 -75 -195t-187 -76q-113 0 -187.5 75t-74.5 193v299h66v-295q0 -86 57 -146t139 -60q80 0 138 60t58 145v296h66zM460 257h-300v66h300v-66z" />
+<glyph unicode="&#x2a42;" horiz-adv-x="620" d="M572 536v-296q0 -119 -75 -195t-187 -76q-113 0 -187.5 75t-74.5 193v299h66v-295q0 -86 57 -146t139 -60q80 0 138 60t58 145v296h66zM520 602h-420v66h420v-66z" />
+<glyph unicode="&#x2a43;" horiz-adv-x="620" d="M520 602h-420v66h420v-66zM572 -31h-66v295q0 86 -57 146t-139 60q-80 0 -138 -60t-58 -145v-296h-66v296q0 119 75 195t187 76q113 0 187.5 -75t74.5 -193v-299z" />
+<glyph unicode="&#x2a44;" horiz-adv-x="620" d="M572 -31h-66v295q0 86 -57 146t-139 60q-80 0 -138 -60t-58 -145v-296h-66v296q0 119 75 195t187 76q113 0 187.5 -75t74.5 -193v-299zM459 -31h-68l-81 164l-81 -164h-68l144 297h10z" />
+<glyph unicode="&#x2a45;" horiz-adv-x="620" d="M572 536v-296q0 -119 -75 -195t-187 -76q-113 0 -187.5 75t-74.5 193v299h66v-295q0 -86 57 -146t139 -60q80 0 138 60t58 145v296h66zM459 536l-144 -297h-10l-144 297h68l81 -164l81 164h68z" />
+<glyph unicode="&#x2a46;" horiz-adv-x="620" d="M572 -406h-66v296q0 85 -58 145t-138 60q-82 0 -139 -60t-57 -146v-295h-66v299q0 118 74.5 193t187.5 75q112 0 187 -76t75 -195v-296zM572 914v-299q0 -118 -74.5 -193t-187.5 -75q-112 0 -187 76t-75 195v296h66v-296q0 -85 58 -145t138 -60q82 0 139 60t57 146v295 h66z" />
+<glyph unicode="&#x2a47;" horiz-adv-x="620" d="M572 161v-296q0 -119 -75 -195t-187 -76q-113 0 -187.5 75t-74.5 193v299h66v-295q0 -86 57 -146t139 -60q80 0 138 60t58 145v296h66zM572 347h-66v295q0 86 -57 146t-139 60q-80 0 -138 -60t-58 -145v-296h-66v296q0 119 75 195t187 76q113 0 187.5 -75t74.5 -193v-299 z" />
+<glyph unicode="&#x2a48;" horiz-adv-x="620" d="M572 914v-299q0 -118 -74.5 -193t-187.5 -75q-112 0 -187 76t-75 195v296h66v-296q0 -85 58 -145t138 -60q82 0 139 60t57 146v295h66zM572 -406h-66v296q0 85 -58 145t-138 60q-82 0 -139 -60t-57 -146v-295h-66v299q0 118 74.5 193t187.5 75q112 0 187 -76t75 -195 v-296zM520 221h-420v66h420v-66z" />
+<glyph unicode="&#x2a49;" horiz-adv-x="620" d="M572 347h-66v295q0 86 -57 146t-139 60q-80 0 -138 -60t-58 -145v-296h-66v296q0 119 75 195t187 76q113 0 187.5 -75t74.5 -193v-299zM572 161v-296q0 -119 -75 -195t-187 -76q-113 0 -187.5 75t-74.5 193v299h66v-295q0 -86 57 -146t139 -60q80 0 138 60t58 145v296h66 zM520 221h-420v66h420v-66z" />
+<glyph unicode="&#x2a4a;" horiz-adv-x="1078" d="M1030 528v-296q0 -119 -75 -195t-187 -76q-75 0 -136 35t-94 97q-33 -62 -93 -97t-135 -35q-113 0 -187.5 75t-74.5 193v299h66v-295q0 -86 57 -146t139 -60q80 0 138 58t58 144v299h66v-299q0 -87 57.5 -144.5t138.5 -57.5q80 0 138 60t58 145v296h66z" />
+<glyph unicode="&#x2a4b;" horiz-adv-x="1078" d="M1030 -40h-66v296q0 85 -58 145t-138 60q-81 0 -138.5 -57.5t-57.5 -144.5v-299h-66v299q0 86 -58 144t-138 58q-82 0 -139 -60t-57 -146v-295h-66v299q0 118 74.5 193t187.5 75q75 0 135 -35t93 -97q33 62 94 97t136 35q112 0 187 -76t75 -195v-296z" />
+<glyph unicode="&#x2a4c;" horiz-adv-x="620" d="M610 536h-38v-296q0 -119 -75 -195t-187 -76q-113 0 -187.5 75t-74.5 193v299h-38v66h600v-66zM506 240v296h-392v-295q0 -86 57 -146t139 -60q80 0 138 60t58 145z" />
+<glyph unicode="&#x2a4d;" horiz-adv-x="620" d="M610 -97h-600v66h38v296q0 119 75 195t187 76q113 0 187.5 -75t74.5 -193v-299h38v-66zM506 -31v295q0 86 -57 146t-139 60q-80 0 -138 -60t-58 -145v-296h392z" />
+<glyph unicode="&#x2a4e;" horiz-adv-x="620" d="M572 -31h-66v501h-392v-501h-66v567h524v-567zM433 -31h-66v363h-114v-363h-66v429h246v-429z" />
+<glyph unicode="&#x2a4f;" horiz-adv-x="620" d="M572 -31h-524v567h66v-501h392v501h66v-567zM433 107h-246v429h66v-363h114v363h66v-429z" />
+<glyph unicode="&#x2a50;" horiz-adv-x="620" d="M610 536h-38v-296q0 -119 -75 -195t-187 -76q-113 0 -187.5 75t-74.5 193v299h-38v66h600v-66zM506 240v296h-392v-295q0 -86 57 -146t139 -60q80 0 138 60t58 145zM468 211l-26 -25l-72 72l-34 -33l72 -73l-25 -26l-73 73l-73 -73l-25 26l72 73l-33 33l-73 -72l-26 25 l73 73l-73 73l26 25l73 -72l33 34l-72 72l25 26l73 -72l73 72l25 -26l-72 -72l34 -34l72 72l26 -25l-72 -73zM344 284l-34 34l-34 -34l34 -34z" />
+<glyph unicode="&#x2a51;" horiz-adv-x="620" d="M374 646q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5zM589 -29h-65l-214 432l-214 -432h-65l274 565h10z" />
+<glyph unicode="&#x2a52;" horiz-adv-x="620" d="M374 646q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5zM589 536l-274 -565h-10l-274 565h65l214 -432l214 432h65z" />
+<glyph unicode="&#x2a53;" horiz-adv-x="620" d="M589 -29h-65l-214 432l-214 -432h-65l274 565h10zM459 -29h-68l-81 164l-81 -164h-68l144 297h10z" />
+<glyph unicode="&#x2a54;" horiz-adv-x="620" d="M459 536l-144 -297h-10l-144 297h68l81 -164l81 164h68zM589 536l-274 -565h-10l-274 565h65l214 -432l214 432h65z" />
+<glyph unicode="&#x2a55;" horiz-adv-x="780" d="M748 -29h-65l-214 432l-45 -91l166 -341h-65l-135 272l-135 -272h-65l165 341l-44 91l-214 -432h-65l274 565h10l74 -153l74 153h10z" />
+<glyph unicode="&#x2a56;" horiz-adv-x="780" d="M748 536l-274 -565h-10l-74 152l-74 -152h-10l-274 565h65l214 -432l44 90l-165 342h65l135 -272l135 272h65l-166 -342l45 -90l214 432h65z" />
+<glyph unicode="&#x2a57;" horiz-adv-x="706" d="M683 536l-567 -565h-10v565h66v-419l421 419h90z" />
+<glyph unicode="&#x2a58;" horiz-adv-x="706" d="M600 -29h-66v419l-421 -419h-90l567 565h10v-565z" />
+<glyph unicode="&#x2a59;" horiz-adv-x="620" d="M589 -77h-65l-130 261l-79 -164h-10l-80 164l-129 -261h-65l160 331l-160 331h65l129 -261l80 164h10l79 -164l130 261h65l-161 -331zM360 254l-50 101l-50 -101l50 -101z" />
+<glyph unicode="&#x2a5a;" horiz-adv-x="620" d="M589 -29h-65l-181 365v-365h-66v365l-181 -365h-65l274 565h10z" />
+<glyph unicode="&#x2a5b;" horiz-adv-x="620" d="M589 536l-274 -565h-10l-274 565h65l181 -365v365h66v-365l181 365h65z" />
+<glyph unicode="&#x2a5c;" horiz-adv-x="620" d="M589 -29h-65l-101 204h-226l-101 -204h-65l99 204h-99v66h131l143 295h10l143 -295h131v-66h-99zM390 241l-80 162l-80 -162h160z" />
+<glyph unicode="&#x2a5d;" horiz-adv-x="620" d="M589 266h-131l-143 -295h-10l-143 295h-131v66h99l-99 204h65l101 -204h226l101 204h65l-99 -204h99v-66zM390 266h-160l80 -162z" />
+<glyph unicode="&#x2a5e;" horiz-adv-x="620" d="M571 580h-524v66h524v-66zM589 -29h-63l-215 432l-215 -432h-65l275 565h10zM571 730h-524v66h524v-66z" />
+<glyph unicode="&#x2a5f;" horiz-adv-x="620" d="M590 -29h-65l-215 432l-215 -432h-65l275 565h10zM573 -139h-526v66h526v-66z" />
+<glyph unicode="&#x2a60;" horiz-adv-x="620" d="M590 -29h-65l-215 432l-215 -432h-65l275 565h10zM575 -139h-530v66h530v-66zM575 -289h-530v66h530v-66z" />
+<glyph unicode="&#x2a61;" horiz-adv-x="620" d="M528 479l-218 -369l-219 369h72l150 -249l143 249h72zM575 0h-530v66h530v-66z" />
+<glyph unicode="&#x2a62;" horiz-adv-x="620" d="M575 740h-530v66h530v-66zM575 590h-530v66h530v-66zM590 536l-275 -565h-10l-275 565h65l215 -432l215 432h65z" />
+<glyph unicode="&#x2a63;" horiz-adv-x="620" d="M590 536l-275 -565h-10l-275 565h65l215 -432l215 432h65zM575 -139h-530v66h530v-66zM575 -289h-530v66h530v-66z" />
+<glyph unicode="&#x2a64;" horiz-adv-x="1043" d="M1008 -284l-938 537l938 538v-1075zM942 286v391l-681 -391h681zM942 -169v389h-681z" />
+<glyph unicode="&#x2a65;" horiz-adv-x="1043" d="M1008 253l-938 -537v1075zM817 286l-681 391v-391h681zM817 220h-681v-389z" />
+<glyph unicode="&#x2a66;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM406 -42q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5z" />
+<glyph unicode="&#x2a67;" d="M405 640q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM637 412h-589v66h589v-66zM637 220h-589v66h589v-66zM637 28h-589v66h589v-66z" />
+<glyph unicode="&#x2a68;" d="M637 28h-179v-217h-66v217h-99v-217h-66v217h-179v66h179v126h-179v66h179v126h-179v66h179v217h66v-217h99v217h66v-217h179v-66h-179v-126h179v-66h-179v-126h179v-66zM392 286v126h-99v-126h99zM392 94v126h-99v-126h99z" />
+<glyph unicode="&#x2a69;" d="M637 28h-100v-184h-66v184h-95v-184h-66v184h-96v-184h-66v184h-100v66h100v126h-100v66h100v126h-100v66h100v184h66v-184h96v184h66v-184h95v184h66v-184h100v-66h-100v-126h100v-66h-100v-126h100v-66zM471 286v126h-95v-126h95zM310 286v126h-96v-126h96zM471 94v126 h-95v-126h95zM310 94v126h-96v-126h96z" />
+<glyph unicode="&#x2a6a;" d="M604 362h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM415 458q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45 t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2a6b;" d="M604 362h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM555 458q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45 t44.5 18t44 -18t19 -45zM285 51q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5z" />
+<glyph unicode="&#x2a6c;" d="M604 543h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM604 176h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32 q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM637 220h-589v66h589v-66z" />
+<glyph unicode="&#x2a6d;" d="M617 532h20q-5 -75 -48 -144.5t-110 -69.5q-32 0 -74.5 23t-77 51t-72 51t-61.5 23q-48 0 -80 -43.5t-46 -104.5h-20q4 82 49 148t114 66q41 0 97 -37l108 -74q51 -37 81 -37q85 0 120 148zM637 173h-589v66h589v-66zM637 -27h-589v66h589v-66zM410 640q0 -26 -17.5 -45 t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2a6e;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM361 642l9 -6q37 -24 96 -34q34 -5 47 -14.5t13 -28.5q0 -17 -10 -28t-26 -11q-25 0 -60 44q-23 28 -69 58l-8 5v-9q0 -56 20 -110q9 -25 9 -33q0 -15 -12.5 -27t-27.5 -12q-14 0 -25 11t-11 25t12 47q16 43 16 99v9 q-40 -25 -52 -36q-12 -12 -41 -45q-22 -25 -43 -25q-17 0 -27 10t-10 26q0 19 14.5 29t48.5 16q35 7 53.5 14t49.5 26q-43 26 -97 37q-37 8 -52 18t-15 28q0 16 9 26.5t24 10.5q20 0 49 -32q42 -47 89 -73v13q0 42 -15 91q-11 33 -11 52q0 14 10.5 24t25.5 10t26 -10.5 t11 -25.5q0 -16 -11 -47q-17 -45 -17 -83v-24q34 20 58 42l19 19l21 23q8 8 18.5 15.5t18.5 7.5q17 0 27 -10.5t10 -27.5q0 -20 -11.5 -29.5t-40.5 -13.5q-56 -9 -112 -41z" />
+<glyph unicode="&#x2a6f;" d="M604 239h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM604 475h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32 q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM498 540h-34l-122 103l-121 -103h-34l124 167h62z" />
+<glyph unicode="&#x2a70;" d="M604 414h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM604 650h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32 q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM637 54h-589v66h589v-66zM637 -146h-589v66h589v-66z" />
+<glyph unicode="&#x2a71;" d="M637 582h-589v66h589v-66zM637 382h-589v66h589v-66zM637 53h-262v-194h-66v194h-261v66h261v209h66v-209h262v-66z" />
+<glyph unicode="&#x2a72;" d="M637 59h-589v66h589v-66zM637 -141h-589v66h589v-66zM637 388h-261v-209h-66v209h-262v66h262v194h66v-194h261v-66z" />
+<glyph unicode="&#x2a73;" d="M604 187h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM637 466h-589v66h589v-66zM637 266h-589v66h589v-66z" />
+<glyph unicode="&#x2a74;" horiz-adv-x="1015" d="M967 320h-509v66h509v-66zM967 120h-509v66h509v-66zM376 354q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM175 354q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z M376 153q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5zM175 153q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5z" />
+<glyph unicode="&#x2a75;" horiz-adv-x="997" d="M949 320h-400v66h400v-66zM949 120h-400v66h400v-66zM448 320h-400v66h400v-66zM448 120h-400v66h400v-66z" />
+<glyph unicode="&#x2a76;" horiz-adv-x="1436" d="M1388 320h-380v66h380v-66zM1388 120h-380v66h380v-66zM908 320h-380v66h380v-66zM908 120h-380v66h380v-66zM428 320h-380v66h380v-66zM428 120h-380v66h380v-66z" />
+<glyph unicode="&#x2a77;" d="M637 320h-589v66h589v-66zM637 120h-589v66h589v-66zM507 548q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5zM305 548q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5 t18.5 -46.5zM507 -42q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5zM305 -42q0 -26 -19 -45t-45 -19q-25 0 -44 19.5t-19 44.5q0 29 18.5 46t44.5 17q27 0 45.5 -16.5t18.5 -46.5z" />
+<glyph unicode="&#x2a78;" d="M637 412h-589v66h589v-66zM637 220h-589v66h589v-66zM637 28h-589v66h589v-66zM647 640q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM486 640q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45 t44.5 18t44 -18t19 -45zM326 640q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM165 640q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2a79;" d="M609 253q0 -39 -28 -67t-67 -28t-67 28t-28 67t28 67t67 28t67 -28t28 -67zM559 253q0 19 -13 32t-32 13t-32 -13t-13 -32t13 -32t32 -13t32 13t13 32zM609 -26l-565 274v10l565 274v-65l-432 -214l432 -214v-65z" />
+<glyph unicode="&#x2a7a;" d="M641 248l-565 -274v65l432 214l-432 214v65l565 -274v-10zM266 253q0 -39 -28 -67t-67 -28t-67 28t-28 67t28 67t67 28t67 -28t28 -67zM216 253q0 19 -13 32t-32 13t-32 -13t-13 -32t13 -32t32 -13t32 13t13 32z" />
+<glyph unicode="&#x2a7b;" d="M241 510h-31q0 55 23 109q30 70 30 96q0 52 -47 52q-18 0 -32.5 -12t-14.5 -21q0 -5 9.5 -13.5t9.5 -20.5q0 -14 -9 -23.5t-25 -9.5q-18 0 -28.5 13t-10.5 33q0 39 31.5 66t77.5 27q49 0 84.5 -26t35.5 -70q0 -27 -13 -49t-53 -64q-24 -26 -37 -87zM271 440 q0 -18 -12 -30.5t-30 -12.5q-20 0 -31.5 12t-11.5 31q0 18 12.5 30t30.5 12q16 0 29 -12.5t13 -29.5zM609 -26l-565 274v10l565 274v-65l-432 -214l432 -214v-65z" />
+<glyph unicode="&#x2a7c;" d="M460 510h-31q0 55 23 109q30 70 30 96q0 52 -47 52q-18 0 -32.5 -12t-14.5 -21q0 -5 9.5 -13.5t9.5 -20.5q0 -14 -9.5 -23.5t-24.5 -9.5q-18 0 -28.5 13t-10.5 33q0 39 31.5 66t77.5 27q49 0 84.5 -26t35.5 -70q0 -27 -13 -49t-53 -64q-24 -26 -37 -87zM490 440 q0 -18 -12 -30.5t-30 -12.5q-20 0 -31.5 12t-11.5 31q0 18 12.5 30t30.5 12q16 0 29 -12.5t13 -29.5zM641 248l-565 -274v65l432 214l-432 214v65l565 -274v-10z" />
+<glyph unicode="&#x2a7d;" d="M621 67l-565 275v10l565 273v-63l-432 -215l432 -215v-65zM621 -137l-565 275v66l565 -275v-66z" />
+<glyph unicode="&#x2a7e;" d="M621 342l-565 -275v65l432 215l-432 215v63l565 -273v-10zM621 138l-565 -275v66l565 275v-66z" />
+<glyph unicode="&#x2a7f;" d="M549 347q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM625 67l-565 275v10l565 273v-65l-432 -213l432 -215v-65zM625 -137l-565 275v66l565 -275v-66z" />
+<glyph unicode="&#x2a80;" d="M625 342l-565 -275v65l432 215l-432 213v65l565 -273v-10zM263 348q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM625 138l-565 -275v66l565 275v-66z" />
+<glyph unicode="&#x2a81;" d="M287 552q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM625 67l-565 275v10l565 273v-65l-432 -213l432 -215v-65zM625 -137l-565 275v66l565 -275v-66z" />
+<glyph unicode="&#x2a82;" d="M525 552q0 -29 -17.5 -46.5t-46.5 -17.5q-28 0 -45.5 19t-17.5 45q0 27 19 45t44 18t44.5 -18t19.5 -45zM625 342l-565 -275v65l432 215l-432 213v65l565 -273v-10zM625 138l-565 -275v66l565 275v-66z" />
+<glyph unicode="&#x2a83;" d="M623 714q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM625 67l-565 275v10l565 273v-65l-432 -213l432 -215v-65zM625 -137l-565 275v66l565 -275v-66z" />
+<glyph unicode="&#x2a84;" d="M189 714q0 -29 -17.5 -46.5t-46.5 -17.5q-28 0 -45.5 19t-17.5 45q0 27 19 45t44 18t44.5 -18t19.5 -45zM625 342l-565 -275v65l432 215l-432 213v65l565 -273v-10zM625 138l-565 -275v66l565 275v-66z" />
+<glyph unicode="&#x2a85;" d="M604 -61h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM604 175h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32 q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM622 249l-565 244v10l565 243v-65l-432 -183l432 -186v-63z" />
+<glyph unicode="&#x2a86;" d="M604 -61h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM604 175h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32 q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM629 493l-565 -244v63l432 186l-432 183v65l565 -243v-10z" />
+<glyph unicode="&#x2a87;" d="M625 70l-565 273v10l565 275v-65l-432 -215l432 -213v-65zM625 -120h-279l-60 -96h-59l60 96h-227v66h269l61 96h59l-61 -96h237v-66z" />
+<glyph unicode="&#x2a88;" horiz-adv-x="687" d="M621 343l-565 -273v63l432 215l-432 215v65l565 -275v-10zM621 -120h-279l-60 -96h-59l60 96h-227v66h269l61 96h59l-61 -96h237v-66z" />
+<glyph unicode="&#x2a89;" d="M621 249l-565 244v10l565 243v-65l-432 -183l432 -186v-63zM604 -61h33q-5 -74 -48 -139t-110 -65q-26 0 -58.5 13.5t-54 27t-57.5 39.5l-62 -124h-61l77 153q-33 19 -59 19q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q36 0 83 -25l59 116q-11 7 -32 22 l-33 22q-12 8 -28.5 17t-30 13.5t-25.5 4.5q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q12 0 24 -2.5t26 -8t24 -10t26.5 -14.5l24.5 -15l26 -17q18 -12 23 -16l64 127h61l-79 -155q34 -17 56 -17q88 0 117 138h33q-5 -74 -48 -139t-110 -65q-35 0 -79 23 l-59 -117l31 -21l32 -22l28.5 -16t29.5 -13t25 -4q88 0 117 138z" />
+<glyph unicode="&#x2a8a;" d="M621 492l-565 -243v65l432 183l-432 186v63l565 -244v-10zM604 -61h33q-5 -74 -48 -139t-110 -65q-26 0 -58.5 13.5t-54 27t-57.5 39.5l-62 -124h-61l77 153q-33 19 -59 19q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q36 0 83 -25l59 116q-11 7 -32 22 l-33 22q-12 8 -28.5 17t-30 13.5t-25.5 4.5q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q12 0 24 -2.5t26 -8t24 -10t26.5 -14.5l24.5 -15l26 -17q18 -12 23 -16l64 127h61l-79 -155q34 -17 56 -17q88 0 117 138h33q-5 -74 -48 -139t-110 -65q-35 0 -79 23 l-59 -117l31 -21l32 -22l28.5 -16t29.5 -13t25 -4q88 0 117 138z" />
+<glyph unicode="&#x2a8b;" d="M621 493l-565 213v10l565 214v-65l-407 -154l407 -155v-63zM621 320h-565v66h565v-66zM621 120h-565v66h565v-66zM621 -212l-565 -212v63l407 154l-407 155v65l565 -215v-10z" />
+<glyph unicode="&#x2a8c;" d="M621 706l-565 -213v63l407 155l-407 154v65l565 -214v-10zM621 320h-565v66h565v-66zM621 120h-565v66h565v-66zM621 -424l-565 212v10l565 215v-65l-407 -155l407 -154v-63z" />
+<glyph unicode="&#x2a8d;" d="M604 175h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM625 249l-565 244v10l565 243v-65l-432 -183l432 -184v-65zM625 -176h-565v66h565 v-66z" />
+<glyph unicode="&#x2a8e;" d="M604 175h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM625 492l-565 -243v65l423 183l-423 184v65l565 -244v-10zM625 -176h-565v66h565 v-66z" />
+<glyph unicode="&#x2a8f;" d="M616 360h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM625 404l-565 227v10l565 226v-65l-407 -166l407 -167v-65zM625 -133l-565 -228v65 l407 168l-407 165v65l565 -225v-10z" />
+<glyph unicode="&#x2a90;" d="M616 360h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM625 632l-565 -228v65l407 168l-407 165v65l565 -225v-10zM625 -361l-565 227v10 l565 226v-65l-407 -166l407 -167v-65z" />
+<glyph unicode="&#x2a91;" d="M620 381l-565 226v10l565 227v-65l-407 -167l407 -166v-65zM630 240l-565 -225v65l407 165l-407 168v65l565 -228v-10zM625 -138h-565v66h565v-66zM625 -338h-565v66h565v-66z" />
+<glyph unicode="&#x2a92;" d="M630 606l-565 -225v65l407 165l-407 168v65l565 -228v-10zM620 15l-565 226v10l565 227v-65l-407 -167l407 -166v-65zM625 -138h-565v66h565v-66zM625 -338h-565v66h565v-66z" />
+<glyph unicode="&#x2a93;" d="M625 403l-565 226v10l565 227v-65l-407 -167l407 -166v-65zM625 206l-565 225v65l565 -225v-65zM625 62l-565 -226v65l407 166l-407 167v65l565 -227v-10zM625 -136l-565 -225v65l565 225v-65z" />
+<glyph unicode="&#x2a94;" d="M625 629l-565 -226v65l407 166l-407 167v65l565 -227v-10zM625 431l-565 -225v65l565 225v-65zM625 -164l-565 226v10l565 227v-65l-407 -167l407 -166v-65zM625 -361l-565 225v65l565 -225v-65z" />
+<glyph unicode="&#x2a95;" d="M621 -122l-565 273v10l565 275v-65l-432 -215l432 -215v-63zM621 574l-565 -275v66l565 275v-66z" />
+<glyph unicode="&#x2a96;" d="M621 151l-565 -273v63l432 215l-432 215v65l565 -275v-10zM621 299l-565 275v66l565 -275v-66z" />
+<glyph unicode="&#x2a97;" d="M621 574l-565 -275v66l565 275v-66zM545 155q0 -27 -19.5 -45t-44.5 -18t-44 18t-19 45q0 26 17.5 45t45.5 19q29 0 46.5 -17.5t17.5 -46.5zM621 -122l-565 274v10l565 274v-65l-432 -214l432 -214v-65z" />
+<glyph unicode="&#x2a98;" d="M621 299l-565 275v66l565 -275v-66zM621 152l-565 -274v65l432 214l-432 214v65l565 -274v-10zM259 159q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2a99;" d="M625 652h-565v66h565v-66zM625 452h-565v66h565v-66zM625 -211l-565 273v10l565 275v-65l-432 -215l432 -213v-65z" />
+<glyph unicode="&#x2a9a;" d="M625 652h-565v66h565v-66zM625 452h-565v66h565v-66zM625 63l-565 -274v65l432 214l-432 214v65l565 -274v-10z" />
+<glyph unicode="&#x2a9b;" d="M625 660l-565 -275v66l565 275v-66zM625 466l-565 -275v66l565 275v-66zM625 -220l-565 274v10l565 274v-65l-432 -214l432 -214v-65z" />
+<glyph unicode="&#x2a9c;" d="M625 385l-565 275v66l565 -275v-66zM625 191l-565 275v66l565 -275v-66zM625 54l-565 -274v65l432 214l-432 214v65l565 -274v-10z" />
+<glyph unicode="&#x2a9d;" d="M609 664h33q-5 -74 -48 -139t-110 -65q-41 0 -94 32l-103 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 94 -32l103 -64q49 -32 79 -32q88 0 117 138zM620 -164l-565 274v10l565 274v-65l-432 -214l432 -214v-65z" />
+<glyph unicode="&#x2a9e;" d="M599 664h33q-5 -74 -48 -139t-110 -65q-41 0 -94 32l-103 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 94 -32l103 -64q49 -32 79 -32q88 0 117 138zM630 110l-565 -274v65l432 214l-432 214v65l565 -274v-10z" />
+<glyph unicode="&#x2a9f;" d="M604 774h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM625 66l-565 215v10l565 212v-65l-400 -152l400 -155v-65zM625 -66h-565v66h565v-66 zM625 -267h-565v66h565v-66z" />
+<glyph unicode="&#x2aa0;" d="M604 774h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM625 278l-565 -212v65l400 152l-400 155v65l565 -215v-10zM625 -66h-565v66h565v-66 zM625 -267h-565v66h565v-66z" />
+<glyph unicode="&#x2aa1;" d="M609 105l-297 143v10l297 145v-68l-164 -82l164 -80v-68zM609 -26l-565 274v10l565 274v-65l-432 -214l432 -214v-65z" />
+<glyph unicode="&#x2aa2;" d="M641 248l-565 -274v65l432 214l-432 214v65l565 -274v-10zM373 248l-297 -145v68l164 82l-164 80v68l297 -143v-10z" />
+<glyph unicode="&#x2aa3;" horiz-adv-x="933" d="M908 51l-565 273v10l565 275v-65l-432 -215l432 -215v-63zM590 51l-565 273v10l565 275v-65l-432 -215l432 -215v-63zM908 -103h-883v66h883v-66z" />
+<glyph unicode="&#x2aa4;" horiz-adv-x="782" d="M722 -26l-331 160l-331 -160v65l261 129l-164 80v10l164 79l-261 130v65l331 -161l331 161v-65l-261 -130l164 -79v-10l-164 -80l261 -129v-65zM492 253l-101 50l-101 -50l101 -50z" />
+<glyph unicode="&#x2aa5;" horiz-adv-x="855" d="M795 -26l-355 274v10l355 274v-70l-261 -209l261 -209v-70zM415 248l-355 -274v70l261 209l-261 209v70l355 -274v-10z" />
+<glyph unicode="&#x2aa6;" d="M35 258l521 274q69 -130 69 -279t-69 -279l-521 274v10zM161 253l362 -192q36 95 36 193q0 95 -36 193z" />
+<glyph unicode="&#x2aa7;" d="M650 248l-521 -274q-69 130 -69 279t69 279l521 -274v-10zM524 253l-362 192q-36 -95 -36 -193q0 -95 36 -193z" />
+<glyph unicode="&#x2aa8;" d="M50 351l521 274q69 -130 69 -279t-69 -279l-521 274v10zM176 346l362 -192q36 95 36 193q0 95 -36 193zM615 -137l-565 275v66l565 -275v-66z" />
+<glyph unicode="&#x2aa9;" d="M635 342l-521 -274q-69 130 -69 279t69 279l521 -274v-10zM509 347l-362 192q-36 -95 -36 -193q0 -95 36 -193zM635 138l-565 -275v66l565 275v-66z" />
+<glyph unicode="&#x2aaa;" d="M609 -31l-564 274v20l564 274v-65l-375 -186h375v-66h-375l375 -186v-65z" />
+<glyph unicode="&#x2aab;" d="M640 243l-564 -274v65l375 186h-375v66h375l-375 186v65l564 -274v-20z" />
+<glyph unicode="&#x2aac;" d="M624 45l-564 274v20l564 274v-65l-375 -186h375v-66h-375l375 -186v-65zM625 -103h-565v66h565v-66z" />
+<glyph unicode="&#x2aad;" d="M625 319l-564 -274v65l375 186h-375v66h375l-375 186v65l564 -274v-20zM625 -103h-565v66h565v-66z" />
+<glyph unicode="&#x2aae;" d="M637 412h-209q-1 33 -24.5 59t-58.5 26q-39 0 -63 -26t-24 -59h-210v66h156q17 34 54 59.5t85 25.5q49 0 87.5 -26t51.5 -59h155v-66zM637 220h-589v66h589v-66zM637 28h-589v66h589v-66z" />
+<glyph unicode="&#x2aaf;" d="M621 128v-77q-84 112 -235 172.5t-322 73.5v66q171 13 322 73.5t235 172.5v-77q-35 -60 -133.5 -116.5t-200.5 -85.5q102 -29 200.5 -85.5t133.5 -116.5zM621 -103h-557v66h557v-66z" />
+<glyph unicode="&#x2ab0;" d="M621 363v-66q-171 -13 -322 -73.5t-235 -172.5v77q35 60 133.5 116.5t200.5 85.5q-102 29 -200.5 85.5t-133.5 116.5v77q84 -112 235 -172.5t322 -73.5zM621 -103h-557v66h557v-66z" />
+<glyph unicode="&#x2ab1;" d="M625 147v-77q-57 76 -155.5 131t-199 80.5t-210.5 34.5v66q110 9 210.5 34.5t199 80.5t155.5 131v-77q-35 -60 -136.5 -116t-205.5 -86q104 -30 205.5 -86t136.5 -116zM625 -120h-283l-60 -96h-59l60 96h-223v66h265l61 96h59l-61 -96h241v-66z" />
+<glyph unicode="&#x2ab2;" d="M625 382v-66q-110 -9 -210.5 -34.5t-199 -80.5t-155.5 -131v77q35 60 136.5 116t205.5 86q-104 30 -205.5 86t-136.5 116v77q57 -76 155.5 -131t199 -80.5t210.5 -34.5zM625 -120h-281l-60 -96h-59l60 96h-225v66h267l61 96h59l-61 -96h239v-66z" />
+<glyph unicode="&#x2ab3;" d="M625 236v-77q-57 76 -155.5 131t-199 80.5t-210.5 34.5v66q110 9 210.5 34.5t199 80.5t155.5 131v-77q-35 -60 -136.5 -116t-205.5 -86q104 -30 205.5 -86t136.5 -116zM625 -12h-565v66h565v-66zM625 -211h-565v66h565v-66z" />
+<glyph unicode="&#x2ab4;" d="M625 471v-66q-110 -9 -210.5 -34.5t-199 -80.5t-155.5 -131v77q35 60 136.5 116t205.5 86q-104 30 -205.5 86t-136.5 116v77q57 -76 155.5 -131t199 -80.5t210.5 -34.5zM625 -12h-565v66h565v-66zM625 -211h-565v66h565v-66z" />
+<glyph unicode="&#x2ab5;" d="M622 266v-77q-84 112 -235 172.5t-322 73.5v66q171 13 322 73.5t235 172.5v-77q-35 -60 -133.5 -116.5t-200.5 -85.5q102 -29 200.5 -85.5t133.5 -116.5zM622 -184h-337l-47 -76h-60l47 76h-160v66h201l84 134h-285v66h326l48 76h60l-48 -76h171v-66h-212l-84 -134h296 v-66z" />
+<glyph unicode="&#x2ab6;" d="M622 501v-66q-171 -13 -322 -73.5t-235 -172.5v77q35 60 133.5 116.5t200.5 85.5q-102 29 -200.5 85.5t-133.5 116.5v77q84 -112 235 -172.5t322 -73.5zM622 -184h-332l-47 -76h-60l47 76h-165v66h206l84 134h-290v66h331l48 76h60l-48 -76h166v-66h-207l-84 -134h291 v-66z" />
+<glyph unicode="&#x2ab7;" d="M604 -61h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM604 175h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32 q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM621 326v-77q-43 58 -107 99t-143 64t-149 34.5t-158 18.5v66q88 7 158 18.5t149 34.5t143 64t107 99v-77q-36 -62 -136 -111t-198 -61q98 -12 198 -61t136 -111z " />
+<glyph unicode="&#x2ab8;" d="M604 -61h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM604 175h33q-5 -74 -48 -139t-110 -65q-41 0 -95 32l-102 64q-49 32 -78 32 q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q41 0 95 -32l102 -64q49 -32 79 -32q88 0 117 138zM621 531v-66q-88 -7 -158 -18.5t-149 -34.5t-143 -64t-107 -99v77q36 62 136 111t198 61q-98 12 -198 61t-136 111v77q43 -58 107 -99t143 -64t149 -34.5t158 -18.5 z" />
+<glyph unicode="&#x2ab9;" d="M622 326v-77q-43 58 -107 99t-143 64t-149 34.5t-158 18.5v66q88 7 158 18.5t149 34.5t143 64t107 99v-77q-36 -62 -136 -111t-198 -61q98 -12 198 -61t136 -111zM604 -61h33q-5 -74 -48 -139t-110 -65q-26 0 -58.5 13.5t-54 27t-57.5 39.5l-62 -124h-61l77 153 q-33 19 -59 19q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q36 0 83 -25l59 116q-11 7 -32 22l-33 22q-12 8 -28.5 17t-30 13.5t-25.5 4.5q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q12 0 24 -2.5t26 -8t24 -10t26.5 -14.5l24.5 -15l26 -17 q18 -12 23 -16l64 127h61l-79 -155q34 -17 56 -17q88 0 117 138h33q-5 -74 -48 -139t-110 -65q-35 0 -79 23l-59 -117l31 -21l32 -22l28.5 -16t29.5 -13t25 -4q88 0 117 138z" />
+<glyph unicode="&#x2aba;" d="M622 531v-66q-88 -7 -158 -18.5t-149 -34.5t-143 -64t-107 -99v77q36 62 136 111t198 61q-98 12 -198 61t-136 111v77q43 -58 107 -99t143 -64t149 -34.5t158 -18.5zM604 -61h33q-5 -74 -48 -139t-110 -65q-26 0 -58.5 13.5t-54 27t-57.5 39.5l-62 -124h-61l77 153 q-33 19 -59 19q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q36 0 83 -25l59 116q-11 7 -32 22l-33 22q-12 8 -28.5 17t-30 13.5t-25.5 4.5q-49 0 -79 -39t-44 -99h-33q4 81 48.5 142.5t114.5 61.5q12 0 24 -2.5t26 -8t24 -10t26.5 -14.5l24.5 -15l26 -17 q18 -12 23 -16l64 127h61l-79 -155q34 -17 56 -17q88 0 117 138h33q-5 -74 -48 -139t-110 -65q-35 0 -79 23l-59 -117l31 -21l32 -22l28.5 -16t29.5 -13t25 -4q88 0 117 138z" />
+<glyph unicode="&#x2abb;" horiz-adv-x="933" d="M908 51v-77q-57 76 -149 131t-184.5 80.5t-191.5 34.5v66q99 9 191.5 34.5t184.5 80.5t149 131v-77q-35 -60 -127 -116.5t-185 -85.5q93 -29 185 -85.5t127 -116.5zM550 51v-77q-57 76 -149 131t-184.5 80.5t-191.5 34.5v66q99 9 191.5 34.5t184.5 80.5t149 131v-77 q-35 -60 -127 -116.5t-185 -85.5q93 -29 185 -85.5t127 -116.5z" />
+<glyph unicode="&#x2abc;" horiz-adv-x="933" d="M908 286v-66q-99 -9 -191.5 -34.5t-184.5 -80.5t-149 -131v77q35 60 127 116.5t185 85.5q-93 29 -185 85.5t-127 116.5v77q57 -76 149 -131t184.5 -80.5t191.5 -34.5zM550 286v-66q-99 -9 -191.5 -34.5t-184.5 -80.5t-149 -131v77q35 60 127 116.5t185 85.5 q-93 29 -185 85.5t-127 116.5v77q57 -76 149 -131t184.5 -80.5t191.5 -34.5z" />
+<glyph unicode="&#x2abd;" d="M449 252q0 -25 -18 -44t-45 -19q-26 0 -45 17.5t-19 45.5q0 29 17.5 46.5t46.5 17.5q27 0 45 -19.5t18 -44.5zM625 -26h-294q-117 0 -194 82.5t-77 196.5t78 196.5t196 82.5h291v-66h-291q-84 0 -146 -65.5t-62 -147.5t62.5 -147.5t146.5 -65.5h290v-66z" />
+<glyph unicode="&#x2abe;" d="M60 532h294q117 0 194 -82.5t77 -196.5t-78 -196.5t-196 -82.5h-291v66h291q84 0 146 65.5t62 147.5t-62.5 147.5t-146.5 65.5h-290v66zM363 254q0 -29 -17.5 -46.5t-46.5 -17.5q-27 0 -45 19.5t-18 44.5t18 44t45 19q26 0 45 -17.5t19 -45.5z" />
+<glyph unicode="&#x2abf;" d="M625 207h-373q-84 0 -138 58.5t-54 141.5q0 82 55 141t141 59h369v-66h-372q-52 0 -89.5 -41t-37.5 -93q0 -51 37.5 -92.5t89.5 -41.5h372v-66zM495 7h-109v-110h-50v110h-109v50h109v110h50v-110h109v-50z" />
+<glyph unicode="&#x2ac0;" d="M60 607h373q84 0 138 -58.5t54 -141.5q0 -82 -55 -141t-141 -59h-369v66h372q52 0 89.5 41t37.5 93q0 51 -37.5 92.5t-89.5 41.5h-372v66zM458 7h-109v-110h-50v110h-109v50h109v110h50v-110h109v-50z" />
+<glyph unicode="&#x2ac1;" d="M625 207h-373q-84 0 -138 58.5t-54 141.5q0 82 55 141t141 59h369v-66h-372q-52 0 -89.5 -41t-37.5 -93q0 -51 37.5 -92.5t89.5 -41.5h372v-66zM495 -68l-35 -35l-99 99l-98 -99l-36 36l99 98l-99 99l35 35l99 -99l98 99l36 -36l-99 -98z" />
+<glyph unicode="&#x2ac2;" d="M60 607h369q86 0 141 -59t55 -141q0 -83 -54 -141.5t-138 -58.5h-373v66h372q52 0 89.5 41.5t37.5 92.5q0 52 -37.5 93t-89.5 41h-372v66zM458 -67l-36 -36l-98 99l-99 -99l-35 35l99 99l-99 98l36 36l98 -99l99 99l35 -35l-99 -99z" />
+<glyph unicode="&#x2ac3;" d="M406 646q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM625 96h-373q-84 0 -138 58.5t-54 141.5q0 82 55 141t141 59h369v-66h-372q-52 0 -89.5 -41t-37.5 -93q0 -51 37.5 -92.5t89.5 -41.5h372v-66zM625 -103h-555v66 h555v-66z" />
+<glyph unicode="&#x2ac4;" d="M406 646q0 -29 -17.5 -46.5t-46.5 -17.5q-28 0 -45.5 19t-17.5 45q0 27 19 45t44 18t44.5 -18t19.5 -45zM60 496h369q86 0 141 -59t55 -141q0 -83 -54 -141.5t-138 -58.5h-373v66h372q52 0 89.5 41.5t37.5 92.5q0 52 -37.5 93t-89.5 41h-372v66zM615 -103h-555v66h555 v-66z" />
+<glyph unicode="&#x2ac5;" d="M622 161h-291q-116 0 -191.5 82.5t-75.5 196.5t76.5 195.5t193.5 81.5h288v-66h-288q-84 0 -144 -64.5t-60 -146.5t60.5 -147.5t144.5 -65.5h287v-66zM622 -12h-548v66h548v-66zM622 -211h-548v66h548v-66z" />
+<glyph unicode="&#x2ac6;" d="M65 717h288q117 0 193.5 -81.5t76.5 -195.5t-75.5 -196.5t-191.5 -82.5h-291v66h287q84 0 144.5 65.5t60.5 147.5t-60 146.5t-144 64.5h-288v66zM623 -12h-558v66h558v-66zM623 -211h-558v66h558v-66z" />
+<glyph unicode="&#x2ac7;" d="M625 107h-294q-117 0 -194 82.5t-77 196.5t78 196.5t196 82.5h291v-66h-291q-84 0 -146 -65.5t-62 -147.5t62.5 -147.5t146.5 -65.5h290v-66zM593 50h32q-3 -46 -20.5 -91t-52.5 -79t-79 -34q-39 0 -90 32l-98 64q-47 32 -75 32q-47 0 -76 -39t-42 -99h-32 q4 81 46.5 142.5t109.5 61.5q39 0 90 -32l99 -64q47 -32 76 -32q85 0 112 138z" />
+<glyph unicode="&#x2ac8;" d="M60 665h294q117 0 194 -82.5t77 -196.5t-78 -196.5t-196 -82.5h-291v66h291q84 0 146 65.5t62 147.5t-62.5 147.5t-146.5 65.5h-290v66zM593 50h32q-3 -46 -20.5 -91t-52.5 -79t-79 -34q-39 0 -90 32l-98 64q-47 32 -75 32q-47 0 -76 -39t-42 -99h-32q4 81 46.5 142.5 t109.5 61.5q39 0 90 -32l99 -64q47 -32 76 -32q85 0 112 138z" />
+<glyph unicode="&#x2ac9;" d="M625 249h-326q-105 0 -171.5 72.5t-66.5 175.5t68.5 176t174.5 73h321v-66h-326q-71 0 -121.5 -56t-50.5 -126q0 -69 50.5 -126t121.5 -57h326v-66zM593 176h32q-3 -46 -20.5 -91t-52.5 -79t-79 -34q-39 0 -90 32l-98 64q-47 32 -75 32q-47 0 -76 -39t-42 -99h-32 q4 81 46.5 142.5t109.5 61.5q39 0 90 -32l99 -64q47 -32 76 -32q85 0 112 138zM593 -60h32q-3 -46 -20.5 -91t-52.5 -79t-79 -34q-39 0 -90 32l-98 64q-47 32 -75 32q-47 0 -76 -39t-42 -99h-32q4 81 46.5 142.5t109.5 61.5q39 0 90 -32l99 -64q47 -32 76 -32q85 0 112 138z " />
+<glyph unicode="&#x2aca;" d="M60 746h321q106 0 174.5 -73t68.5 -176t-66.5 -175.5t-171.5 -72.5h-326v66h326q71 0 121.5 57t50.5 126q0 70 -50.5 126t-121.5 56h-326v66zM593 176h32q-3 -46 -20.5 -91t-52.5 -79t-79 -34q-39 0 -90 32l-98 64q-47 32 -75 32q-47 0 -76 -39t-42 -99h-32 q4 81 46.5 142.5t109.5 61.5q39 0 90 -32l99 -64q47 -32 76 -32q85 0 112 138zM593 -60h32q-3 -46 -20.5 -91t-52.5 -79t-79 -34q-39 0 -90 32l-98 64q-47 32 -75 32q-47 0 -76 -39t-42 -99h-32q4 81 46.5 142.5t109.5 61.5q39 0 90 -32l99 -64q47 -32 76 -32q85 0 112 138z " />
+<glyph unicode="&#x2acb;" d="M619 161h-291q-116 0 -191.5 82.5t-75.5 196.5t76.5 195.5t193.5 81.5h288v-66h-288q-84 0 -144 -64.5t-60 -146.5t60.5 -147.5t144.5 -65.5h287v-66zM619 -211h-313l-60 -108h-62l60 108h-173v66h210l74 133h-284v66h320l48 85h62l-48 -85h166v-66h-202l-74 -133h276 v-66z" />
+<glyph unicode="&#x2acc;" d="M66 717h291q116 0 191.5 -82.5t75.5 -196.5t-76.5 -195.5t-193.5 -81.5h-288v66h288q84 0 144 64.5t60 146.5t-60.5 147.5t-144.5 65.5h-287v66zM614 -211h-312l-60 -108h-62l60 108h-174v66h211l74 133h-285v66h321l48 85h62l-48 -85h165v-66h-201l-74 -133h275v-66z " />
+<glyph unicode="&#x2acd;" horiz-adv-x="1352" d="M1288 492h-1158v-479h546v-66h-612v611h1224v-66z" />
+<glyph unicode="&#x2ace;" horiz-adv-x="1352" d="M1288 -53h-612v66h546v479h-1158v66h1224v-611z" />
+<glyph unicode="&#x2acf;" d="M615 -26h-294q-117 0 -194 82.5t-77 196.5t78 196.5t196 82.5h291v-558zM549 40v426h-225q-84 0 -146 -65.5t-62 -147.5t62.5 -147.5t146.5 -65.5h224z" />
+<glyph unicode="&#x2ad0;" d="M70 532h294q117 0 194 -82.5t77 -196.5t-78 -196.5t-196 -82.5h-291v558zM136 40h225q84 0 146 65.5t62 147.5t-62.5 147.5t-146.5 65.5h-224v-426z" />
+<glyph unicode="&#x2ad1;" d="M625 51h-294q-117 0 -194 82.5t-77 196.5t78 196.5t196 82.5h291v-558zM559 117v426h-225q-84 0 -146 -65.5t-62 -147.5t62.5 -147.5t146.5 -65.5h224zM626 -103h-556v66h556v-66z" />
+<glyph unicode="&#x2ad2;" d="M60 609h294q117 0 194 -82.5t77 -196.5t-78 -196.5t-196 -82.5h-291v558zM126 117h225q84 0 146 65.5t62 147.5t-62.5 147.5t-146.5 65.5h-224v-426zM615 -103h-555v66h555v-66z" />
+<glyph unicode="&#x2ad3;" d="M615 315h-363q-84 0 -138 58.5t-54 141.5q0 82 55 141t141 59h359v-66h-362q-52 0 -89.5 -41t-37.5 -93q0 -51 37.5 -92.5t89.5 -41.5h362v-66zM70 191h363q84 0 138 -58.5t54 -141.5q0 -82 -55 -141t-141 -59h-359v66h362q52 0 89.5 41t37.5 93q0 51 -37.5 92.5 t-89.5 41.5h-362v66z" />
+<glyph unicode="&#x2ad4;" d="M70 715h363q84 0 138 -58.5t54 -141.5q0 -82 -55 -141t-141 -59h-359v66h362q52 0 89.5 41t37.5 93q0 51 -37.5 92.5t-89.5 41.5h-362v66zM615 -209h-363q-84 0 -138 58.5t-54 141.5q0 82 55 141t141 59h359v-66h-362q-52 0 -89.5 -41t-37.5 -93q0 -51 37.5 -92.5 t89.5 -41.5h362v-66z" />
+<glyph unicode="&#x2ad5;" d="M625 315h-373q-84 0 -138 58.5t-54 141.5q0 82 55 141t141 59h369v-66h-372q-52 0 -89.5 -41t-37.5 -93q0 -51 37.5 -92.5t89.5 -41.5h372v-66zM625 -209h-373q-84 0 -138 58.5t-54 141.5q0 82 55 141t141 59h369v-66h-372q-52 0 -89.5 -41t-37.5 -93q0 -51 37.5 -92.5 t89.5 -41.5h372v-66z" />
+<glyph unicode="&#x2ad6;" d="M60 715h373q84 0 138 -58.5t54 -141.5q0 -82 -55 -141t-141 -59h-369v66h372q52 0 89.5 41t37.5 93q0 51 -37.5 92.5t-89.5 41.5h-372v66zM60 191h373q84 0 138 -58.5t54 -141.5q0 -82 -55 -141t-141 -59h-369v66h372q52 0 89.5 41t37.5 93q0 51 -37.5 92.5t-89.5 41.5 h-372v66z" />
+<glyph unicode="&#x2ad7;" horiz-adv-x="1250" d="M1190 -26h-274q-117 0 -194 82.5t-77 196.5t78 196.5t196 82.5h271v-66h-271q-84 0 -146 -65.5t-62 -147.5t62.5 -147.5t146.5 -65.5h270v-66zM60 532h271q118 0 196 -82.5t78 -196.5t-77 -196.5t-194 -82.5h-274v66h270q84 0 146.5 65.5t62.5 147.5t-62 147.5t-146 65.5 h-271v66z" />
+<glyph unicode="&#x2ad8;" horiz-adv-x="1250" d="M1190 -26h-274q-110 0 -185.5 74t-84.5 180h-43q-9 -106 -84 -180t-185 -74h-274v66h270q77 0 137 56.5t70 131.5h-169v50h169q-10 75 -69.5 131.5t-136.5 56.5h-271v66h271q110 0 186.5 -74t85.5 -180h43q9 106 85.5 180t187.5 74h271v-66h-271q-77 0 -137 -56.5 t-70 -131.5h170v-50h-170q10 -75 70.5 -131.5t137.5 -56.5h270v-66z" />
+<glyph unicode="&#x2ad9;" horiz-adv-x="620" d="M572 -31h-66v296q0 75 -47 132t-116 70v-498h-66v498q-70 -12 -116.5 -69.5t-46.5 -133.5v-295h-66v299q0 118 74.5 193t187.5 75q112 0 187 -76t75 -195v-296z" />
+<glyph unicode="&#x2ada;" horiz-adv-x="620" d="M572 -31h-66v296q0 76 -47 133t-116 70v-596h-66v596q-70 -12 -116.5 -70t-46.5 -134v-295h-66v299q0 109 64 182t165 84v97h-124v66h314v-66h-124v-97q100 -12 164.5 -86t64.5 -183v-296z" />
+<glyph unicode="&#x2adb;" horiz-adv-x="620" d="M572 0h-66v296q0 76 -47 133t-116 70v-596h-66v596q-70 -12 -116.5 -70t-46.5 -134v-295h-66v299q0 109 64 182t165 84v130h66v-130q100 -12 164.5 -86t64.5 -183v-296z" />
+<glyph unicode="&#x2adc;" horiz-adv-x="620" d="M572 327v-70q0 -114 -71.5 -190.5t-190.5 -76.5q-100 0 -168 57l-56 -57h-75l94 96q-57 72 -57 175v66h66v-66q0 -69 39 -126l124 127v295h66v-227l154 158h75l-229 -235v-196q70 12 116.5 69.5t46.5 134.5v66h66zM277 57v129l-87 -89q39 -32 87 -40z" />
+<glyph unicode="&#x2add;" horiz-adv-x="620" d="M572 327v-70q0 -114 -71.5 -190.5t-190.5 -76.5q-118 0 -190 78.5t-72 192.5v66h66v-66q0 -78 47 -135t116 -69v500h66v-500q70 12 116.5 69.5t46.5 134.5v66h66z" />
+<glyph unicode="&#x2ade;" horiz-adv-x="497" d="M433 0h-66v298h-303v66h303v298h66v-662z" />
+<glyph unicode="&#x2adf;" d="M637 305h-262v-305h-66v305h-261v66h589v-66z" />
+<glyph unicode="&#x2ae0;" d="M637 0h-589v66h262v305h66v-305h261v-66z" />
+<glyph unicode="&#x2ae1;" d="M637 0h-589v66h262v596h66v-596h261v-66zM513 309l50 -26q36 -18 52 -37t16 -47q0 -34 -26.5 -58.5t-66.5 -24.5q-30 0 -52 9.5t-26 9.5t-6.5 -1.5t-3.5 -3.5l-3 -4q-2 -3 -3 -5h-19v94h21q11 -43 28.5 -59.5t52.5 -16.5q26 0 40.5 12t14.5 30q0 32 -38 51l-39 19 q-73 35 -73 84q0 36 27 59t67 23q20 0 39 -9.5t28 -9.5q7 0 13 6h12v-90h-21q-4 43 -21.5 62.5t-50.5 19.5q-49 0 -49 -45q0 -23 37 -42z" />
+<glyph unicode="&#x2ae2;" d="M625 106h-499v-106h-66v662h66v-106h499v-66h-499v-126h499v-66h-499v-126h499v-66z" />
+<glyph unicode="&#x2ae3;" horiz-adv-x="860" d="M603 0h-66v298h-491v66h491v298h66v-662zM803 0h-66v662h66v-662z" />
+<glyph unicode="&#x2ae4;" d="M625 0h-66v198h-499v66h499v134h-499v66h499v198h66v-662z" />
+<glyph unicode="&#x2ae5;" horiz-adv-x="860" d="M803 0h-66v662h66v-662zM603 0h-66v198h-491v66h491v134h-491v66h491v198h66v-662z" />
+<glyph unicode="&#x2ae6;" d="M626 298h-303v-298h-66v298h-134v-298h-66v662h66v-298h134v298h66v-298h303v-66z" />
+<glyph unicode="&#x2ae7;" d="M637 305h-262v-305h-66v305h-261v66h589v-66zM637 505h-589v66h589v-66z" />
+<glyph unicode="&#x2ae8;" d="M637 200h-589v66h262v305h66v-305h261v-66zM637 0h-589v66h589v-66z" />
+<glyph unicode="&#x2ae9;" d="M637 120h-262v-305h-66v305h-261v66h589v-66zM637 320h-589v66h261v305h66v-305h262v-66z" />
+<glyph unicode="&#x2aea;" d="M637 596h-162v-596h-66v596h-134v-596h-66v596h-161v66h589v-66z" />
+<glyph unicode="&#x2aeb;" d="M637 0h-589v66h162v596h66v-596h134v596h66v-596h161v-66z" />
+<glyph unicode="&#x2aec;" horiz-adv-x="600" d="M552 18h-66v205h-438v66h438v134h-438v66h504v-471z" />
+<glyph unicode="&#x2aed;" horiz-adv-x="600" d="M552 223h-438v-205h-66v471h504v-66h-438v-134h438v-66z" />
+<glyph unicode="&#x2aee;" horiz-adv-x="404" d="M381 186l-24 -53l-122 62v-384h-66v418l-146 75l24 52l122 -62v396h66v-430z" />
+<glyph unicode="&#x2aef;" horiz-adv-x="502" d="M218 -154v518q-51 11 -84 52t-33 94q0 62 44 106t106 44t106 -44t44 -106q0 -53 -33 -94t-84 -52v-518h-66zM351 510q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5t29.5 -70.5t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x2af0;" horiz-adv-x="502" d="M284 660v-518q51 -11 84 -52t33 -94q0 -62 -44 -106t-106 -44t-106 44t-44 106q0 53 33 94t84 52v518h66zM351 -4q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5t29.5 -70.5t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x2af1;" horiz-adv-x="502" d="M284 627v-518q51 -11 84 -52t33 -94q0 -62 -44 -106t-106 -44t-106 44t-44 106q0 53 33 94t84 52v518h-116v66h298v-66h-116zM351 -37q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5t29.5 -70.5t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x2af2;" horiz-adv-x="523" d="M513 228h-119v-417h-66v417h-133v-417h-66v417h-119v50h119v417h66v-417h133v417h66v-417h119v-50z" />
+<glyph unicode="&#x2af3;" d="M604 360h33q-5 -74 -48 -139t-110 -65h-4v-345h-66v363q-27 13 -77 46l-56 37v-446h-66v473h-6q-49 0 -79 -39t-44 -99h-33q4 80 48 141.5t114 62.5v345h66v-361q20 -9 42 -23l50 -33l41 -26v443h66v-472q4 -1 12 -1q88 0 117 138z" />
+<glyph unicode="&#x2af4;" d="M555 -189h-66v884h66v-884zM376 -189h-66v884h66v-884zM197 -189h-66v884h66v-884z" />
+<glyph unicode="&#x2af5;" d="M674 228h-119v-417h-66v417h-113v-417h-66v417h-113v-417h-66v417h-119v50h119v417h66v-417h113v417h66v-417h113v417h66v-417h119v-50z" />
+<glyph unicode="&#x2af6;" d="M406 545q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM406 254q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45zM406 -38q0 -26 -17.5 -45t-45.5 -19q-29 0 -46.5 17.5 t-17.5 46.5q0 27 19.5 45t44.5 18t44 -18t19 -45z" />
+<glyph unicode="&#x2af7;" horiz-adv-x="1170" d="M1080 103l-367 145v10l367 145v-65l-208 -85l208 -85v-65zM1080 -26l-694 274v10l694 274v-65l-526 -214l526 -214v-65zM1080 -155l-1022 403v10l1022 403v-65l-843 -344l843 -342v-65z" />
+<glyph unicode="&#x2af8;" horiz-adv-x="1170" d="M1112 248l-1022 -403v65l843 344l-843 342v65l1022 -403v-10zM784 248l-694 -274v65l526 214l-526 214v65l694 -274v-10zM457 248l-367 -145v65l208 85l-208 85v65l367 -145v-10z" />
+<glyph unicode="&#x2af9;" d="M625 168l-565 274v10l565 274v-65l-432 -214l432 -214v-65zM625 -26l-565 275v66l565 -275v-66zM625 -220l-565 275v66l565 -275v-66z" />
+<glyph unicode="&#x2afa;" d="M625 442l-565 -274v65l432 214l-432 214v65l565 -274v-10zM625 249l-565 -275v66l565 275v-66zM625 55l-565 -275v66l565 275v-66z" />
+<glyph unicode="&#x2afb;" horiz-adv-x="894" d="M478 710l-360 -932h-72l360 932h72zM663 710l-360 -932h-72l360 932h72zM848 710l-360 -932h-72l360 932h72z" />
+<glyph unicode="&#x2afd;" horiz-adv-x="709" d="M478 710l-360 -932h-72l360 932h72zM663 710l-360 -932h-72l360 932h72z" />
+<glyph unicode="&#x2afe;" horiz-adv-x="410" d="M310 -189h-210v879h210v-879zM270 -149v799h-130v-799h130z" />
+<glyph unicode="&#x2b12;" horiz-adv-x="910" d="M865 -157h-820v819h820v-819zM799 -91v345h-688v-345h688z" />
+<glyph unicode="&#x2b13;" horiz-adv-x="910" d="M865 -157h-820v819h820v-819zM799 252v344h-688v-344h688z" />
+<glyph unicode="&#x2b14;" horiz-adv-x="910" d="M865 -157h-820v819h820v-819zM799 -91l-688 687v-687h688z" />
+<glyph unicode="&#x2b15;" horiz-adv-x="910" d="M865 -157h-820v819h820v-819zM799 -91v687h-688z" />
+<glyph unicode="&#x2b16;" horiz-adv-x="1064" d="M1025 251l-492 -493l-494 494l493 492zM932 251l-400 400v-800z" />
+<glyph unicode="&#x2b17;" horiz-adv-x="1064" d="M1025 251l-492 -493l-494 494l493 492zM532 -149v800l-400 -399z" />
+<glyph unicode="&#x2b18;" horiz-adv-x="1064" d="M1025 251l-492 -493l-494 494l493 492zM932 252h-800l401 -401z" />
+<glyph unicode="&#x2b19;" horiz-adv-x="1064" d="M1025 251l-492 -493l-494 494l493 492zM932 251l-400 400l-400 -399z" />
+<glyph unicode="&#x2b1a;" horiz-adv-x="910" d="M865 562h-49v51h-51v49h100v-100zM721 613h-100v49h100v-49zM865 418h-49v100h49v-100zM577 613h-100v49h100v-49zM865 274h-49v100h49v-100zM433 613h-100v49h100v-49zM865 130h-49v100h49v-100zM289 613h-100v49h100v-49zM865 -14h-49v100h49v-100zM865 -157h-100v49 h51v51h49v-100zM145 613h-51v-51h-49v100h100v-49zM721 -157h-100v49h100v-49zM94 418h-49v100h49v-100zM577 -157h-100v49h100v-49zM94 274h-49v100h49v-100zM433 -157h-100v49h100v-49zM94 130h-49v100h49v-100zM289 -157h-100v49h100v-49zM94 -14h-49v100h49v-100z M145 -157h-100v100h49v-51h51v-49z" />
+<glyph unicode="&#x2b1b;" horiz-adv-x="1040" d="M1000 -180h-960v960h960v-960z" />
+<glyph unicode="&#x2b1c;" horiz-adv-x="1040" d="M1000 -180h-960v960h960v-960zM934 -114v828h-828v-828h828z" />
+<glyph unicode="&#x2b1d;" horiz-adv-x="240" d="M190 172h-140v160h140v-160z" />
+<glyph unicode="&#x2b1e;" horiz-adv-x="240" d="M190 172h-140v160h140v-160zM160 202v100h-80v-100h80z" />
+<glyph unicode="&#x2b1f;" horiz-adv-x="910" d="M874 387l-160 -492h-518l-160 492l419 303z" />
+<glyph unicode="&#x2b20;" horiz-adv-x="910" d="M874 387l-160 -492h-518l-160 492l419 303zM794 363l-339 246l-339 -246l128 -402h422z" />
+<glyph unicode="&#x2b21;" horiz-adv-x="910" d="M828 36l-373 -214l-373 214v430l373 214l373 -214v-430zM762 73v353l-307 178l-307 -178v-353l308 -175z" />
+<glyph unicode="&#x2b22;" horiz-adv-x="910" d="M828 36l-373 -214l-373 214v430l373 214l373 -214v-430z" />
+<glyph unicode="&#x2b23;" horiz-adv-x="926" d="M902 253l-220 -380h-438l-220 380l220 380h438z" />
+<glyph unicode="&#x2b24;" horiz-adv-x="1207" d="M1137 252q0 -145 -71.5 -268t-194 -194.5t-267.5 -71.5q-220 0 -377 157t-157 377q0 145 71.5 267.5t194.5 194t268 71.5q220 0 376.5 -156.5t156.5 -376.5z" />
+<glyph unicode="&#x2b25;" horiz-adv-x="779" d="M734 251l-344 -347l-345 347l345 330z" />
+<glyph unicode="&#x2b26;" horiz-adv-x="779" d="M734 251l-344 -347l-345 347l345 330zM640 250l-250 240l-251 -240l251 -252z" />
+<glyph unicode="&#x2b27;" horiz-adv-x="544" d="M504 252l-231 -357l-233 357l232 357z" />
+<glyph unicode="&#x2b28;" horiz-adv-x="544" d="M504 252l-231 -357l-233 357l232 357zM425 252l-153 236l-153 -236l154 -236z" />
+<glyph unicode="&#x2b29;" horiz-adv-x="523" d="M497 252l-236 -236l-235 236l235 236z" />
+<glyph unicode="&#x2b2a;" horiz-adv-x="357" d="M331 252l-153 -236l-152 236l152 236z" />
+<glyph unicode="&#x2b2b;" horiz-adv-x="357" d="M331 252l-153 -236l-152 236l152 236zM258 252l-80 123l-79 -123l79 -123z" />
+<glyph unicode="&#x2b2c;" horiz-adv-x="842" d="M792 252q0 -66 -36 -116.5t-93.5 -78t-119 -40.5t-122.5 -13t-122.5 13t-119 40.5t-93.5 78t-36 116.5t36 116.5t93.5 78t119 40.5t122.5 13t122.5 -13t119 -40.5t93.5 -78t36 -116.5z" />
+<glyph unicode="&#x2b2d;" horiz-adv-x="842" d="M792 252q0 -66 -36 -116.5t-93.5 -78t-119 -40.5t-122.5 -13t-122.5 13t-119 40.5t-93.5 78t-36 116.5t36 116.5t93.5 78t119 40.5t122.5 13t122.5 -13t119 -40.5t93.5 -78t36 -116.5zM726 252q0 50 -31.5 88t-81 57t-98 28t-94.5 9t-94.5 -9t-98 -28t-81 -57t-31.5 -88 t31.5 -88t81 -57t98 -28t94.5 -9t94.5 9t98 28t81 57t31.5 88z" />
+<glyph unicode="&#x2b2e;" horiz-adv-x="596" d="M546 252q0 -61 -13 -122.5t-40.5 -119t-78 -93.5t-116.5 -36t-116.5 36t-78 93.5t-40.5 119t-13 122.5t13 122.5t40.5 119t78 93.5t116.5 36t116.5 -36t78 -93.5t40.5 -119t13 -122.5z" />
+<glyph unicode="&#x2b2f;" horiz-adv-x="596" d="M546 252q0 -61 -13 -122.5t-40.5 -119t-78 -93.5t-116.5 -36t-116.5 36t-78 93.5t-40.5 119t-13 122.5t13 122.5t40.5 119t78 93.5t116.5 36t116.5 -36t78 -93.5t40.5 -119t13 -122.5zM480 252q0 125 -49 215t-133 90q-85 0 -133.5 -89.5t-48.5 -215.5t48.5 -215.5 t133.5 -89.5q84 0 133 90t49 215z" />
+<glyph unicode="&#x2b30;" horiz-adv-x="926" d="M856 220h-170q-12 -52 -54 -86t-97 -34t-97 34t-53 86h-127q-26 0 -26 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q113 47 237 190l20 -19q-31 -47 -82 -96q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h127q11 53 53 87.5t98 34.5q55 0 97.5 -34.5 t53.5 -87.5h170v-66zM436 286h198q-10 31 -37.5 51.5t-61.5 20.5t-61 -20.5t-38 -51.5zM634 220h-197q11 -31 38 -50.5t60 -19.5q34 0 61 19.5t38 50.5z" />
+<glyph unicode="&#x2b31;" horiz-adv-x="926" d="M866 -80h-614q-12 0 -18.5 -6.5t-6.5 -15.5q0 -11 14 -25q52 -51 76 -86l-20 -19q-110 127 -237 180v10q107 46 213 145q-104 99 -213 145v10q107 46 213 145q-104 99 -213 145v10q128 55 238 181l20 -19q-16 -23 -77 -86q-14 -14 -14 -28q0 -20 26 -20h613v-66h-614 q-8 0 -16.5 -7.5t-8.5 -14.5q0 -10 13 -23l78 -72q-76 -72 -77 -73q-14 -14 -14 -24q0 -8 7.5 -14t18.5 -6h613v-66h-614q-9 0 -17 -7t-8 -15q0 -10 13 -23l78 -72q-76 -72 -77 -73q-14 -14 -14 -24q0 -20 26 -20h613v-66z" />
+<glyph unicode="&#x2b32;" horiz-adv-x="1200" d="M1147 220h-161q-11 -129 -98 -205t-219 -76q-125 0 -212 80.5t-98 200.5h-119q-26 0 -26 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q112 47 237 191l20 -19q-33 -50 -82 -97q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h120q11 124 98.5 203.5t211.5 79.5 q129 0 217 -82t100 -201h161v-66zM697 286h223q-11 88 -73 148t-150 69v-217zM647 286v217q-91 -7 -151.5 -68.5t-71.5 -148.5h223zM920 220h-223v-215q90 8 151 68t72 147zM647 5v215h-223q11 -86 72.5 -147t150.5 -68z" />
+<glyph unicode="&#x2b33;" horiz-adv-x="1574" d="M1519 220h-69l-89 -106l-119 172l-124 -172l-119 172l-124 -172l-119 172l-124 -172l-119 172l-124 -172l-92 106h-57q-6 0 -15 -8t-9 -14q0 -11 14 -25q51 -49 82 -96l-20 -19q-124 143 -237 190v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28 q0 -20 26 -20h86l60 -66l124 174l119 -174l124 174l119 -174l124 174l119 -174l124 174l119 -174l60 66h98v-66z" />
+<glyph unicode="&#x2b34;" horiz-adv-x="926" d="M871 220h-266v-163h-50v163h-168q-8 -2 -16 -9t-8 -13q0 -11 14 -25q49 -47 82 -97l-20 -19q-98 113 -181 163h-15q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q113 48 238 192l20 -19q-31 -44 -82 -97q-14 -14 -14 -28 q0 -20 26 -20h13q83 49 183 164l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -8 6 -14t16 -6h169v164h50v-164h266v-66z" />
+<glyph unicode="&#x2b35;" horiz-adv-x="926" d="M871 220h-171v-163h-50v163h-79v-163h-50v163h-135q-8 -2 -16 -9t-8 -13q0 -11 14 -25q49 -47 82 -97l-20 -19q-98 113 -181 163h-15q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q113 48 238 192l20 -19q-31 -44 -82 -97 q-14 -14 -14 -28q0 -20 26 -20h13q83 49 183 164l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -8 6 -14t16 -6h136v164h50v-164h79v164h50v-164h171v-66z" />
+<glyph unicode="&#x2b36;" horiz-adv-x="926" d="M871 57h-50v163h-435q-8 -2 -16 -9t-8 -13q0 -11 14 -25q49 -47 82 -97l-20 -19q-98 113 -181 163h-15q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q113 48 238 192l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -20 26 -20h13 q83 49 183 164l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -8 6 -14t16 -6h436v164h50v-393z" />
+<glyph unicode="&#x2b37;" horiz-adv-x="1412" d="M1337 449l20 -19q-13 -18 -42 -50t-40 -46q-29 -38 -29 -81q0 -46 28 -80q67 -74 82 -97l-20 -19q-97 112 -182 163v66q87 53 183 163zM1070 220h-144v66h144v-66zM842 220h-144v66h144v-66zM614 220h-144v66h144v-66zM439 449l20 -19q-28 -40 -82 -96q-14 -14 -14 -28 q0 -20 23 -20v-66q-7 0 -15.5 -8t-8.5 -14q0 -11 13 -24q50 -48 83 -98l-20 -19q-98 113 -181 163h-15q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 25 -20h14 q85 50 183 163z" />
+<glyph unicode="&#x2b38;" horiz-adv-x="926" d="M873 254q0 -16 -10.5 -26.5t-25.5 -10.5t-26 10.5t-11 26.5q0 15 11 25.5t26 10.5t25.5 -10.5t10.5 -25.5zM751 254q0 -16 -11 -26.5t-26 -10.5q-14 0 -25 10.5t-11 26.5q0 15 11 25.5t25 10.5q15 0 26 -10.5t11 -25.5zM628 253q0 -15 -10.5 -25.5t-25.5 -10.5 t-25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5zM506 254q0 -16 -11 -26.5t-25 -10.5q-15 0 -26 10.5t-11 26.5q0 15 11 25.5t26 10.5q14 0 25 -10.5t11 -25.5zM385 254q0 -16 -11 -26.5t-26 -10.5t-25.5 10.5t-10.5 26.5q0 15 10.5 25.5t25.5 10.5 t26 -10.5t11 -25.5zM312 76l-20 -19q-125 144 -237 191v10q113 48 237 191l20 -19q-31 -44 -81 -96q-14 -14 -14 -28q0 -17 14 -17q15 0 23 -10t8 -26t-8 -26t-23 -10t-15 -19q0 -11 14 -25q49 -47 82 -97z" />
+<glyph unicode="&#x2b39;" horiz-adv-x="926" d="M851 450l20 -19q-12 -18 -41 -50t-41 -47q-29 -38 -29 -81q0 -46 28 -80q67 -74 82 -97l-20 -19q-98 113 -181 163h-146v-163h-50v163h-231q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q113 48 238 192l20 -19q-31 -44 -82 -97 q-14 -14 -14 -28q0 -20 26 -20h230v164h50v-164h145q85 52 183 164z" />
+<glyph unicode="&#x2b3a;" horiz-adv-x="926" d="M851 450l20 -19q-12 -18 -41 -50t-41 -47q-29 -38 -29 -81q0 -46 28 -80q67 -74 82 -97l-20 -19q-98 113 -181 163h-95v-163h-50v163h-79v-163h-50v163h-153q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q113 48 238 192l20 -19 q-31 -44 -82 -97q-14 -14 -14 -28q0 -20 26 -20h152v164h50v-164h79v164h50v-164h94q85 52 183 164z" />
+<glyph unicode="&#x2b3b;" horiz-adv-x="926" d="M851 449l20 -19q-13 -18 -42 -50t-40 -46q-29 -38 -29 -81q0 -46 28 -80q67 -74 82 -97l-20 -19q-98 113 -181 163h-282q-10 0 -17 -7.5t-7 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-98 113 -181 163h-16q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19 q-125 144 -237 191v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h14q85 50 183 163l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -7 6.5 -13.5t16.5 -6.5h281q87 53 183 163z" />
+<glyph unicode="&#x2b3c;" horiz-adv-x="926" d="M851 450l20 -19q-12 -18 -41 -50t-41 -47q-29 -38 -29 -81q0 -46 28 -80q67 -74 82 -97l-20 -19q-98 113 -181 163h-87v-163h-50v163h-145q-10 0 -17 -7.5t-7 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-98 113 -181 163h-16q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25 q49 -47 82 -97l-20 -19q-125 144 -237 191v10q113 48 238 192l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -20 26 -20h14q83 49 183 164l20 -19q-31 -44 -82 -97q-14 -14 -14 -28q0 -7 6.5 -13.5t16.5 -6.5h145v164h50v-164h86q85 52 183 164z" />
+<glyph unicode="&#x2b3d;" horiz-adv-x="926" d="M856 450l20 -19q-10 -15 -22 -31l-28 -34l-25 -32q-30 -39 -30 -81q0 -48 29 -83q44 -49 75 -94l-20 -19l-53 63q-19 22 -51.5 51t-65.5 49h-51v-163h-50v163h-59v-163h-50v163h-121q-10 0 -17 -7.5t-7 -14.5q0 -11 14 -25q43 -42 80 -97l-20 -19l-54 63q-19 22 -52.5 51 t-69.5 49q-8 0 -16.5 -7.5t-8.5 -14.5q0 -11 14 -25q43 -42 80 -97l-20 -19q-43 50 -68.5 76.5t-69.5 61t-89 53.5v10q45 19 89 53.5t70 61.5t69 77l20 -19q-36 -51 -80 -97q-14 -14 -14 -28q0 -20 24 -20q35 20 69.5 50t52.5 50l54 64l20 -19q-38 -55 -79 -97 q-14 -14 -14 -28q0 -7 6.5 -13.5t16.5 -6.5h121v164h50v-164h59v164h50v-164h50q33 20 66 50t52 50z" />
+<glyph unicode="&#x2b3e;" horiz-adv-x="926" d="M871 220h-225l108 -108l-35 -35l-142 142l-142 -142l-35 35l108 108h-265q-26 0 -26 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q112 47 237 191l20 -19q-33 -50 -82 -97q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h268l-110 110l35 35l142 -142l142 142 l35 -35l-110 -110h227v-66z" />
+<glyph unicode="&#x2b3f;" horiz-adv-x="926" d="M871 256l-51 -34q-87 152 -190 152q-30 0 -58 -16t-52 -38l-48 -46q-24 -22 -55.5 -38t-66.5 -16h-107q-26 0 -26 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q112 47 237 191l20 -19q-33 -50 -82 -97q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h108 q21 0 44.5 16t47.5 38l50 46q26 22 62.5 38t75.5 16q73 0 135 -51.5t106 -132.5z" />
+<glyph unicode="&#x2b40;" horiz-adv-x="926" d="M776 515h-369v50h369v-50zM776 370h-369v50h369v-50zM871 220h-628q-26 0 -26 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q112 47 237 191l20 -19q-33 -50 -82 -97q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h629v-66z" />
+<glyph unicode="&#x2b41;" horiz-adv-x="926" d="M796 370h-20q-8 38 -31.5 63t-54.5 25q-21 0 -89 -44t-100 -44q-44 0 -77.5 45t-36.5 93h19q8 -39 30 -63.5t54 -24.5q20 0 88 44t101 44q45 0 80 -42.5t37 -95.5zM871 220h-628q-26 0 -26 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q112 47 237 191 l20 -19q-33 -50 -82 -97q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h629v-66z" />
+<glyph unicode="&#x2b42;" horiz-adv-x="926" d="M871 220h-629q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h628v-66zM796 -2h-19q-8 39 -30 63.5t-54 24.5q-21 0 -89 -44t-100 -44q-45 0 -80 42.5t-37 95.5 h20q8 -38 31.5 -63t54.5 -25q21 0 89 44t100 44q44 0 77.5 -45t36.5 -93zM796 -141h-19q-8 39 -30 63.5t-54 24.5q-21 0 -89 -44t-100 -44q-45 0 -80 42.5t-37 95.5h20q8 -38 31.5 -63t54.5 -25q21 0 89 44t100 44q44 0 77.5 -45t36.5 -93z" />
+<glyph unicode="&#x2b43;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 22 -26 22h-139l-500 -246v65l356 181h-316v66h315l-355 181v65l500 -246h138q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19q123 -142 238 -191z" />
+<glyph unicode="&#x2b44;" horiz-adv-x="926" d="M871 258v-10q-66 -27 -118 -71t-109 -110l-20 19q33 49 72 87q14 14 14 25q0 22 -26 22h-84q-11 -104 -84.5 -175t-180.5 -71h-290v66h286q75 0 133 53.5t70 126.5h-449v66h449q-12 73 -69.5 126.5t-132.5 53.5h-287v66h287q108 0 182 -71.5t86 -174.5h83q26 0 26 20 q0 14 -14 28q-43 45 -72 86l20 19q115 -133 228 -181z" />
+<glyph unicode="&#x2b45;" horiz-adv-x="928" d="M873 -35h-512q63 -97 81 -145l-24 -15q-102 200 -363 443v13q125 112 214.5 217t149.5 223l24 -13q-20 -55 -81 -147h511v-66h-557q-16 -22 -33 -42l-33 -37l-22 -25h645v-66h-697q-23 -34 -23 -52q0 -22 23 -52h697v-66h-642q1 -1 33 -38.5t52 -65.5h557v-66z" />
+<glyph unicode="&#x2b46;" horiz-adv-x="928" d="M873 261v-13q-261 -243 -363 -443l-24 15q18 48 81 145h-512v66h557q20 28 52 65.5t33 38.5h-642v66h697q23 30 23 52q0 18 -23 52h-697v66h645l-22 25l-33 37q-17 20 -33 42h-557v66h511q-61 92 -81 147l24 13q60 -118 149.5 -223t214.5 -217z" />
+<glyph unicode="&#x2b47;" horiz-adv-x="926" d="M539 370h-20q-8 38 -31.5 63t-54.5 25q-21 0 -89 -44t-100 -44q-44 0 -77.5 45t-36.5 93h19q8 -39 30 -63.5t54 -24.5q21 0 89 44t100 44q45 0 80 -42.5t37 -95.5zM871 258v-10q-115 -49 -238 -191l-20 19q28 40 82 96q14 14 14 28q0 20 -26 20h-628v66h629q8 0 17 7.5 t9 14.5q0 11 -14 25q-49 47 -82 97l20 19q125 -144 237 -191z" />
+<glyph unicode="&#x2b48;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-629v66h628q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19q123 -142 238 -191zM539 -2h-19q-8 39 -30 63.5t-54 24.5q-20 0 -88 -44t-101 -44q-45 0 -80 42.5t-37 95.5h20 q8 -38 31.5 -63t54.5 -25q21 0 89 44t100 44q44 0 77.5 -45t36.5 -93zM539 -141h-19q-8 39 -30 63.5t-54 24.5q-20 0 -88 -44t-101 -44q-45 0 -80 42.5t-37 95.5h20q8 -38 31.5 -63t54.5 -25q21 0 89 44t100 44q44 0 77.5 -45t36.5 -93z" />
+<glyph unicode="&#x2b49;" horiz-adv-x="926" d="M777 508h19q-3 -48 -36.5 -93t-77.5 -45q-32 0 -100 44t-89 44q-31 0 -54.5 -25t-31.5 -63h-20q2 53 37 95.5t80 42.5q32 0 100 -44t89 -44q32 0 54 24.5t30 63.5zM871 220h-628q-26 0 -26 -20q0 -14 14 -28q54 -56 82 -96l-20 -19q-123 142 -238 191v10q112 47 237 191 l20 -19q-33 -50 -82 -97q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5h629v-66z" />
+<glyph unicode="&#x2b4a;" horiz-adv-x="926" d="M871 220h-629q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h628v-66zM776 136h20q-2 -53 -37 -95.5t-80 -42.5q-33 0 -101 44t-88 44q-32 0 -54 -24.5 t-30 -63.5h-19q3 48 36.5 93t77.5 45q32 0 100 -44t89 -44q31 0 54.5 25t31.5 63zM776 -3h20q-2 -53 -37 -95.5t-80 -42.5q-33 0 -101 44t-88 44q-32 0 -54 -24.5t-30 -63.5h-19q3 48 36.5 93t77.5 45q32 0 100 -44t89 -44q31 0 54.5 25t31.5 63z" />
+<glyph unicode="&#x2b4b;" horiz-adv-x="926" d="M871 220h-629q-8 0 -17 -7.5t-9 -14.5q0 -11 14 -25q49 -47 82 -97l-20 -19q-125 144 -237 191v10q115 49 238 191l20 -19q-28 -40 -82 -96q-14 -14 -14 -28q0 -20 26 -20h628v-66zM796 -2h-19q-8 39 -30 63.5t-54 24.5q-21 0 -89 -44t-100 -44q-45 0 -80 42.5t-37 95.5 h20q8 -38 31.5 -63t54.5 -25q21 0 89 44t100 44q44 0 77.5 -45t36.5 -93z" />
+<glyph unicode="&#x2b4c;" horiz-adv-x="926" d="M871 258v-10q-112 -47 -237 -191l-20 19q33 50 82 97q14 14 14 25q0 7 -9 14.5t-17 7.5h-629v66h628q26 0 26 20q0 14 -14 28q-54 56 -82 96l20 19q123 -142 238 -191zM539 -2h-19q-8 39 -30 63.5t-54 24.5q-20 0 -88 -44t-101 -44q-45 0 -80 42.5t-37 95.5h20 q8 -38 31.5 -63t54.5 -25q21 0 89 44t100 44q44 0 77.5 -45t36.5 -93z" />
+<glyph unicode="&#x2b50;" horiz-adv-x="794" d="M734 373l-205 -158l74 -245l-206 146l-206 -146l74 245l-205 158h253l84 246l84 -246h253zM658 347h-196l-65 192l-65 -192h-196l159 -122l-57 -190l159 113l159 -113l-57 190z" />
+<glyph unicode="&#x2b51;" horiz-adv-x="794" d="M734 373l-205 -158l74 -245l-206 146l-206 -146l74 245l-205 158h253l84 246l84 -246h253z" />
+<glyph unicode="&#x2b52;" horiz-adv-x="700" d="M665 365l-226 -137l107 -241l-196 179l-196 -179l107 241l-226 137l262 -30l53 262l53 -262zM550 326l-168 -20l-32 160l-32 -160l-168 20l144 -88l-66 -148l122 111l122 -111l-66 148z" />
+<glyph unicode="&#x2b53;" horiz-adv-x="865" d="M840 293l-303 -419l-492 160v518l492 160z" />
+<glyph unicode="&#x2b54;" horiz-adv-x="865" d="M840 293l-303 -420l-492 160v518l492 161zM759 293l-246 339l-402 -128v-422l402 -129z" />
+<glyph unicode="&#x3012;" d="M672 596h-662v66h662v-66zM672 396h-298v-396h-66v396h-298v66h662v-66z" />
+<glyph unicode="&#x3030;" horiz-adv-x="1412" d="M1367 417v-65q-22 0 -39 -8t-30.5 -27t-21 -33t-20.5 -43q-14 -32 -20 -44.5t-21.5 -37.5t-29.5 -36t-37 -20.5t-50 -9.5q-33 0 -59 11.5t-45.5 37.5t-29.5 45t-26 55l-20 42q-6 14 -19 33t-28 26.5t-34 7.5t-33.5 -8t-27.5 -26.5t-20 -32.5t-20 -43q-11 -26 -16.5 -37 t-17.5 -32.5t-22.5 -32t-26 -23.5t-34.5 -18t-42 -5q-34 0 -60 11.5t-45 37t-29.5 45t-25.5 54.5q-12 28 -19.5 42t-20 33t-27.5 27t-34 8q-25 0 -45 -17.5t-30 -36t-26 -55.5q-12 -28 -19.5 -43.5t-23 -39t-31 -35.5t-40.5 -21.5t-55 -9.5l-1 66q42 0 65 27.5t47 82.5 q16 36 25.5 55t29 44.5t45 37t59.5 11.5t60 -11.5t45 -37t29 -44.5t26 -55q12 -28 19.5 -42t20 -33t27.5 -27t34 -8t34 8t27.5 26t20 33t19.5 42q12 28 19.5 44t22.5 39t29.5 35t37.5 21.5t50 9.5t50 -9.5t37.5 -21.5t29.5 -35t22.5 -39t19.5 -44q10 -24 15 -34t15.5 -28 t19 -26t22 -14.5t28.5 -6.5q24 0 44.5 17.5t31 37t26.5 55.5t26 55t30 44.5t48 37t65 11.5z" />
+<glyph unicode="&#x306e;" horiz-adv-x="901" d="M840 308q0 -61 -19.5 -121t-55.5 -112t-96.5 -84t-134.5 -32q-21 0 -31 1q121 22 186.5 109t65.5 199q0 88 -37.5 168.5t-109.5 133t-160 52.5q-135 0 -231 -93.5t-96 -207.5q0 -67 39.5 -123t120.5 -91q119 126 125 364q0 4 -10 9.5t-10 10.5q53 18 100 39q9 -4 9 -16 q0 -8 -7 -19q-23 -96 -35.5 -143.5t-36 -117t-54.5 -125t-74 -113.5q-13 -5 -22 -5q-42 0 -74 22l8 6l16 13q8 6 17 16t13 18q-3 -1 -12 -6l-16 -9q-7 -4 -10 -4q-20 9 -45.5 28t-55.5 49.5t-50 75t-20 93.5q0 86 40 158t104.5 116.5t141 69t152.5 24.5q174 0 267 -108 q98 -113 98 -245z" />
+<glyph unicode="&#xa727;" horiz-adv-x="481" d="M427 303v-318q0 -94 -48.5 -156t-140.5 -62q-34 0 -63.5 13.5t-29.5 42.5q0 16 12 27t28 11q22 0 47 -30t42 -30q69 0 69 139v360q0 106 -77 106q-54 0 -109 -63v-241q0 -49 11.5 -66t56.5 -21v-15h-216v15q44 6 54 21.5t10 65.5v471q0 32 -9.5 41.5t-41.5 9.5 q-8 0 -12 -1v16q89 26 142 44l5 -3v-304q60 84 146 84q124 0 124 -157z" />
+<glyph unicode="&#xfffd;" horiz-adv-x="872" d="M817 223l-383 -440l-379 438l384 441zM414 58h38q9 72 52 120q69 56 89.5 87t20.5 70q0 58 -56.5 100.5t-121.5 42.5q-76 0 -125 -45.5t-49 -102.5q0 -22 18 -36.5t37 -14.5t36 11.5t17 25.5q0 13 -16 25t-16 27q0 24 26 46.5t62 22.5q86 0 86 -95q0 -26 -8.5 -49 t-26.5 -53t-24 -43q-37 -80 -39 -139zM483 -49q0 24 -15.5 38.5t-36.5 14.5q-20 0 -35 -14.5t-15 -39.5q0 -17 15.5 -32.5t34.5 -15.5q20 0 36 16t16 33z" />
+<glyph unicode="&#x1d400;" horiz-adv-x="722" d="M689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#x1d401;" horiz-adv-x="667" d="M426 365v-1q85 -11 139 -58.5t54 -117.5q0 -83 -72 -135.5t-202 -52.5h-329v25q55 6 71.5 21t16.5 57v467q0 44 -18.5 60.5t-69.5 20.5v25h317q121 0 186.5 -41.5t65.5 -118.5q0 -59 -37 -96.5t-122 -54.5zM264 592v-219q91 0 123.5 30t32.5 106q0 137 -99 137 q-30 0 -43.5 -12.5t-13.5 -41.5zM264 343v-245q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 155 -157 155h-26z" />
+<glyph unicode="&#x1d402;" horiz-adv-x="722" d="M657 152l30 -25q-67 -83 -132.5 -114.5t-155.5 -31.5q-159 0 -254.5 96.5t-95.5 245.5q0 160 97.5 264t249.5 104q71 0 156 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25q-22 62 -67 115q-75 90 -167 90q-81 0 -132.5 -83.5t-51.5 -229.5q0 -155 54 -240 q22 -34 62.5 -55t84.5 -21q64 0 126 34q41 23 104 89z" />
+<glyph unicode="&#x1d403;" horiz-adv-x="722" d="M14 676h312q171 0 267.5 -88t96.5 -243q0 -77 -30.5 -147t-84.5 -117q-93 -81 -252 -81h-309v25q43 1 63 19t20 54v486q0 34 -17.5 48t-65.5 19v25zM259 598v-498q0 -35 12.5 -50t45.5 -15q98 0 149 72q23 33 36.5 94.5t13.5 128.5q0 139 -41 211q-58 101 -163 101 q-53 0 -53 -44z" />
+<glyph unicode="&#x1d404;" horiz-adv-x="667" d="M641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54 q25 20 42 46t40 77h28z" />
+<glyph unicode="&#x1d405;" horiz-adv-x="611" d="M583 474h-24q-10 57 -22 81.5t-38 47.5q-45 39 -163 39q-38 0 -54 -11.5t-16 -39.5v-228q75 0 109 32.5t44 116.5h25v-338h-25q-7 87 -41 120t-112 35v-228q0 -43 21 -58t89 -18v-25h-360v25q55 6 71.5 21t16.5 57v472q0 43 -18 58t-70 18v25h567v-202z" />
+<glyph unicode="&#x1d406;" horiz-adv-x="778" d="M755 287v-25q-53 -6 -69.5 -27.5t-16.5 -72.5v-118q-49 -29 -124 -46t-153 -17q-154 0 -254.5 96t-100.5 254q0 151 99.5 255.5t248.5 104.5q70 0 155 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25q-29 63 -47.5 92.5t-48.5 56.5q-63 56 -138 56q-88 0 -136 -83 t-48 -237q0 -157 48 -237q27 -45 63 -66t92 -21q96 0 96 85v89q0 40 -19.5 55t-82.5 19v25h344z" />
+<glyph unicode="&#x1d407;" horiz-adv-x="778" d="M759 0h-339v25q54 6 71.5 20.5t17.5 52.5v228h-241v-228q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-204h241v204q0 41 -18 55.5t-71 18.5v25h339v-25q-51 -4 -69.5 -19t-18.5 -55v-479 q0 -39 16.5 -52.5t71.5 -20.5v-25z" />
+<glyph unicode="&#x1d408;" horiz-adv-x="389" d="M370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x1d409;" horiz-adv-x="500" d="M478 676v-25q-55 -4 -71.5 -22t-16.5 -73v-430q0 -222 -212 -222q-74 0 -108 23q-29 20 -48 50t-19 60q0 28 21.5 51t49.5 23t50 -23t22 -53q0 -15 -13.5 -34t-13.5 -32q0 -32 45 -32q34 0 49 21.5t15 68.5v550q0 43 -20 57.5t-81 16.5v25h351z" />
+<glyph unicode="&#x1d40a;" horiz-adv-x="778" d="M769 0h-334v25q47 1 62 6t15 15q0 13 -25 45l-181 225l-27 -25v-196q0 -37 16.5 -50t70.5 -20v-25h-336v25q55 5 71 19t16 57v472q0 46 -17 60.5t-70 17.5v25h337v-25q-54 -4 -71 -20.5t-17 -63.5v-223l212 215q24 24 32 35t8 23q0 15 -10.5 22t-37.5 9l-35 3v25h289v-25 q-78 -9 -133 -46.5t-189 -180.5l305 -378q16 -20 49 -21v-25z" />
+<glyph unicode="&#x1d40b;" horiz-adv-x="667" d="M638 227l-42 -227h-577v25q55 7 70.5 20t15.5 53v478q0 42 -17.5 57t-68.5 18v25h348v-24q-65 -3 -82.5 -20t-17.5 -79v-464q0 -33 18.5 -45.5t66.5 -12.5q109 0 170 55q42 39 87 141h29z" />
+<glyph unicode="&#x1d40c;" horiz-adv-x="944" d="M921 0h-332v25q55 5 72 22t17 62v496l-252 -605h-27l-252 594v-465q0 -58 20 -79t81 -25v-25h-234v25q59 6 75 20.5t16 62.5v469q0 41 -17 55.5t-72 18.5v25h253l199 -472l201 472h252v-25q-55 -4 -71.5 -22.5t-16.5 -74.5v-428q0 -57 15 -76.5t73 -24.5v-25z" />
+<glyph unicode="&#x1d40d;" horiz-adv-x="722" d="M701 676v-25q-50 -8 -64 -22.5t-14 -60.5v-586h-28l-447 545v-396q0 -58 18 -78.5t76 -27.5v-25h-226v25q55 7 71.5 22.5t16.5 61.5v470q-52 72 -85 72v25h211l349 -430v299q0 60 -18 80.5t-74 25.5v25h214z" />
+<glyph unicode="&#x1d40e;" horiz-adv-x="778" d="M743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#x1d40f;" horiz-adv-x="611" d="M16 676h315q128 0 198.5 -45.5t70.5 -135.5q0 -60 -33.5 -104.5t-95.5 -67.5q-32 -12 -70.5 -15.5t-138.5 -4.5v-192q0 -51 14 -65t73 -21v-25h-333v25q33 3 45 9q23 9 31 30t8 62v427q0 58 -15.5 75.5t-68.5 22.5v25zM262 606v-268q94 1 130 32t36 114q0 84 -27 120.5 t-89 36.5q-50 0 -50 -35z" />
+<glyph unicode="&#x1d410;" horiz-adv-x="778" d="M730 -117l6 -24q-91 -35 -179 -35q-140 0 -228 88q-29 29 -56 86q-113 34 -175.5 123.5t-62.5 208.5q0 161 99.5 261t254.5 100q156 0 255 -100t99 -264q0 -126 -66 -211t-187 -122q23 -47 47 -71q52 -52 123 -52q30 0 70 12zM566 335q0 158 -46 240.5t-132 82.5 q-84 0 -130 -83.5t-46 -239.5t45 -238.5t132 -82.5q86 0 131.5 83t45.5 238z" />
+<glyph unicode="&#x1d411;" horiz-adv-x="722" d="M716 0h-205l-207 313h-28v-196q0 -54 14.5 -69t73.5 -23v-25h-338v25q59 7 73.5 22t14.5 73v431q0 59 -16.5 77.5t-71.5 22.5v25h308q296 0 296 -172q0 -76 -45 -118q-42 -38 -112 -57l199 -282q15 -22 44 -22v-25zM276 597v-252q103 1 143 31t40 118q0 79 -30 113.5 t-100 34.5q-29 0 -41 -10t-12 -35z" />
+<glyph unicode="&#x1d412;" horiz-adv-x="556" d="M484 474h-28q-26 85 -70 130q-54 56 -123 56q-51 0 -80.5 -27.5t-29.5 -71.5q0 -36 21 -59t82 -55q18 -10 68.5 -35.5t79.5 -41.5q49 -27 79 -73.5t30 -102.5q0 -95 -68.5 -154t-179.5 -59q-61 0 -130 24q-31 10 -41 10q-12 0 -19 -7.5t-11 -26.5h-29v248h29 q23 -96 60 -143q57 -72 144 -72q58 0 92 30.5t34 82.5q0 48 -57 88q-25 18 -122 65q-89 43 -130 90t-41 120q0 95 58.5 148t160.5 53q55 0 117 -23q27 -9 42 -9q14 0 20.5 6.5t11.5 26.5h30v-218z" />
+<glyph unicode="&#x1d413;" horiz-adv-x="667" d="M636 475h-29q-13 89 -56.5 127.5t-135.5 41.5v-527q0 -57 16.5 -72t81.5 -20v-25h-357v25q64 5 80.5 20.5t16.5 71.5v527q-93 -3 -136.5 -41.5t-56.5 -127.5h-29l3 201h600z" />
+<glyph unicode="&#x1d414;" horiz-adv-x="722" d="M701 676v-25q-48 -7 -63 -24t-15 -61v-314q0 -156 -76 -216q-68 -55 -184 -55t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25h219z" />
+<glyph unicode="&#x1d415;" horiz-adv-x="722" d="M701 676v-25q-39 -5 -55.5 -20t-34.5 -62l-228 -587h-27l-256 599q-18 42 -32 53.5t-52 16.5v25h336v-25l-33 -2q-53 -3 -53 -36q0 -17 23 -72l138 -334l127 329q20 52 20 71q0 24 -16 32t-70 12v25h213z" />
+<glyph unicode="&#x1d416;" horiz-adv-x="1000" d="M981 676v-25q-50 -5 -69 -64l-200 -602h-27l-171 477l-186 -477h-28l-212 602q-13 37 -25 48t-44 16v25h294v-25q-39 -3 -51.5 -11.5t-12.5 -30.5q0 -13 7 -33l120 -364l118 308l-35 96q-12 32 -72 35v25h312v-25l-13 -1q-33 -2 -46 -10t-13 -26q0 -13 14 -56l108 -336 l112 343q7 20 7 42q0 23 -14.5 32.5t-54.5 11.5v25h182z" />
+<glyph unicode="&#x1d417;" horiz-adv-x="722" d="M699 0h-340v25l28 2q52 3 52 28q0 21 -21 54l-101 162l-38 -51q-56 -76 -75 -106.5t-19 -46.5q0 -19 17.5 -28t63.5 -14v-25h-250v25q37 4 59 16t45 40l175 221l-198 291q-23 34 -38 45t-42 13v25h346v-25l-31 -2q-27 -1 -37.5 -8t-10.5 -23q0 -14 15 -37l97 -150l56 77 q36 49 47 69.5t11 36.5q0 18 -11 25t-40 10l-21 2v25h250v-25q-57 -5 -90.5 -30.5t-97.5 -115.5l-80 -111l182 -283q35 -54 53 -69.5t44 -16.5v-25z" />
+<glyph unicode="&#x1d418;" horiz-adv-x="722" d="M699 676v-25q-49 -7 -68 -39l-191 -311v-178q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136l-180 328q-31 56 -83 59v25h335v-25l-27 -2q-32 -2 -43 -7.5t-11 -21.5q0 -13 24 -59l120 -232l109 178q41 68 41 102q0 22 -16.5 30t-67.5 12v25h220z " />
+<glyph unicode="&#x1d419;" horiz-adv-x="667" d="M634 242l-27 -242h-579v16l382 623l-83 -1q-117 -2 -162 -32.5t-78 -136.5h-28l22 207h523v-16l-379 -625h83q145 0 202 40q27 19 45 45t26.5 47t26.5 75h26z" />
+<glyph unicode="&#x1d41a;" horiz-adv-x="500" d="M473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50 q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4zM293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="&#x1d41b;" horiz-adv-x="556" d="M211 676v-259q53 56 122 56q83 0 135.5 -65t52.5 -169q0 -113 -63 -183t-163 -70q-70 0 -132 57l-79 -56h-12v607q0 30 -10 40.5t-45 17.5v24h194zM211 360v-263q0 -36 19 -57.5t50 -21.5q94 0 94 203q0 198 -93 198q-25 0 -41 -13.5t-29 -45.5z" />
+<glyph unicode="&#x1d41c;" horiz-adv-x="444" d="M412 109l18 -18q-41 -56 -86 -80.5t-105 -24.5q-95 0 -154.5 65t-59.5 171q0 110 68 180.5t169 70.5q66 0 110 -31t44 -79q0 -29 -18.5 -46.5t-49.5 -17.5q-26 0 -41 19t-15 54q0 18 -0.5 26t-2.5 18.5t-6 15t-12.5 7.5t-20.5 3q-38 0 -61 -44.5t-23 -124.5 q0 -102 37 -161t102 -59q58 0 107 56z" />
+<glyph unicode="&#x1d41d;" horiz-adv-x="556" d="M534 20l-62 -8q-82 -11 -133 -25v65q-35 -37 -64 -51.5t-69 -14.5q-79 0 -130 66t-51 169q0 109 54.5 180.5t137.5 71.5q34 0 60.5 -13.5t58.5 -48.5v183q0 35 -13 44.5t-63 13.5v24h215v-575q0 -32 12.5 -44t46.5 -14v-23zM336 112v243q-11 29 -32 45.5t-46 16.5 q-85 0 -85 -188q0 -187 78 -187q36 0 66 37q19 25 19 33z" />
+<glyph unicode="&#x1d41e;" horiz-adv-x="444" d="M403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252q3 -42 8 -70.5t17 -57.5t35.5 -44t58.5 -15q32 0 58 15.5t57 52.5zM298 282v21q0 73 -9 92q-12 25 -23.5 36t-31.5 11 q-36 0 -53 -36.5t-17 -123.5h134z" />
+<glyph unicode="&#x1d41f;" horiz-adv-x="333" d="M14 461h57q0 131 40 179q42 51 135 51q64 0 103.5 -28t39.5 -72q0 -28 -17 -46t-45 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-27 0 -38.5 -17.5t-11.5 -61.5v-120h86v-44h-86v-310q0 -50 15 -66t67 -17v-24h-278v24q34 4 45.5 16.5t11.5 46.5v330 h-57v44z" />
+<glyph unicode="&#x1d420;" horiz-adv-x="500" d="M254 68h52q81 0 129 -32.5t48 -87.5q0 -71 -68.5 -112.5t-192.5 -41.5q-194 0 -194 92q0 61 96 75q-47 17 -64.5 35t-17.5 47q0 44 29 71.5t90 45.5q-55 16 -89.5 56t-34.5 95q0 73 56.5 117t146.5 44q52 0 112 -22h129v-53h-80q40 -36 40 -98q0 -93 -92 -131 q-24 -10 -41 -12t-86 -2q-30 0 -49.5 -13.5t-19.5 -35.5q0 -21 21 -29t80 -8zM306 312q0 70 -15.5 100t-51.5 30t-50.5 -29t-14.5 -102q0 -70 15 -99.5t51 -29.5t51 29.5t15 100.5zM315 -52h-164q-21 -17 -28 -28t-7 -27q0 -67 134 -67q72 0 113 18.5t41 47.5q0 56 -89 56z " />
+<glyph unicode="&#x1d421;" horiz-adv-x="556" d="M534 0h-234v24q25 3 35.5 16.5t10.5 44.5v224q0 54 -11 75.5t-40 21.5q-36 0 -70 -34q-17 -17 -17 -24v-263q0 -31 10 -44t38 -17v-24h-240v24q36 7 44.5 16t8.5 49v502q0 35 -9 44.5t-45 16.5v24h193v-280q65 77 147 77q60 0 95 -38t35 -98v-250q0 -34 11.5 -48.5 t37.5 -14.5v-24z" />
+<glyph unicode="&#x1d422;" horiz-adv-x="278" d="M215 613q0 -33 -22.5 -55t-55.5 -22t-55 22t-22 55t22.5 55.5t56.5 22.5q31 0 53.5 -23t22.5 -55zM256 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24z" />
+<glyph unicode="&#x1d423;" horiz-adv-x="333" d="M263 613q0 -33 -22.5 -55t-56.5 -22q-33 0 -54.5 22t-21.5 55t22.5 55.5t55.5 22.5q31 0 54 -23t23 -55zM260 461v-459q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17 q25 0 36.5 18t11.5 58v474q0 32 -12.5 44t-50.5 15v24h202z" />
+<glyph unicode="&#x1d424;" horiz-adv-x="556" d="M543 0h-234v24q42 2 42 19q0 12 -24 45l-95 134l-23 -24v-114q0 -35 8.5 -45t43.5 -15v-24h-239v24q48 4 48 60v510q0 54 -48 58v24h187v-431l128 128q21 21 21 38q0 18 -35 23l-24 4v23h214v-23q-47 -6 -80.5 -29t-108.5 -102l194 -268q11 -15 25 -15v-24z" />
+<glyph unicode="&#x1d425;" horiz-adv-x="278" d="M256 0h-240v24q51 4 51 63v500q0 61 -52 65v24h191v-589q0 -33 12 -47.5t38 -15.5v-24z" />
+<glyph unicode="&#x1d426;" horiz-adv-x="833" d="M814 0h-237v24q28 2 38 14.5t10 44.5v228q0 95 -53 95q-29 0 -58 -25q-9 -7 -18 -18t-9 -15v-265q0 -29 10 -42.5t36 -16.5v-24h-232v24q27 2 37 15t10 44v240q0 45 -12.5 64t-41.5 19q-19 0 -51.5 -22.5t-32.5 -39.5v-261q0 -29 9.5 -42t35.5 -17v-24h-239v24 q33 6 44 18.5t11 43.5v287q0 35 -11 47t-45 17v24h192v-75h3q29 46 62.5 66.5t81.5 20.5q47 0 76 -20t52 -67q39 48 71.5 67.5t75.5 19.5q62 0 98.5 -38t36.5 -104v-248q0 -32 10.5 -45t39.5 -14v-24z" />
+<glyph unicode="&#x1d427;" horiz-adv-x="556" d="M539 0h-234v24q25 3 35.5 16.5t10.5 43.5v237q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24v-264q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h191v-75h1q49 87 142 87q62 0 98.5 -38.5t36.5 -103.5v-247q0 -34 10 -46t39 -14 v-24z" />
+<glyph unicode="&#x1d428;" horiz-adv-x="500" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#x1d429;" horiz-adv-x="556" d="M212 461v-69q25 44 55.5 62.5t75.5 18.5q85 0 133 -57.5t48 -166.5q0 -118 -51.5 -190t-140.5 -72q-34 0 -58 12.5t-60 47.5v-126q0 -52 16.5 -76t60.5 -26v-24h-272v24q35 6 45.5 18.5t10.5 44.5v490q0 33 -11 46.5t-44 18.5v24h192zM214 346v-239q12 -29 32.5 -47 t44.5 -18q85 0 85 192q0 182 -76 182q-37 0 -68 -37q-18 -21 -18 -33z" />
+<glyph unicode="&#x1d42a;" horiz-adv-x="556" d="M536 -205h-267v24q48 7 60.5 23.5t12.5 67.5v132q-44 -56 -123 -56t-132 63.5t-53 169.5q0 108 61.5 181t160.5 73q38 0 66 -12t66 -44l77 55h16v-595q0 -30 10 -40.5t45 -17.5v-24zM342 98v256q0 41 -18.5 64t-48.5 23q-44 0 -69.5 -51t-25.5 -154q0 -98 25 -147t68 -49 q28 0 48.5 15.5t20.5 42.5z" />
+<glyph unicode="&#x1d42b;" horiz-adv-x="444" d="M218 461v-82q35 51 66 72.5t69 21.5q35 0 58 -22.5t23 -56.5q0 -30 -17.5 -49t-45.5 -19q-37 0 -60 38q-14 23 -28 23q-26 0 -43.5 -30t-17.5 -74v-177q0 -48 13.5 -63.5t58.5 -18.5v-24h-265v24q33 6 43.5 17.5t10.5 42.5v289q0 35 -11 47t-44 17v24h190z" />
+<glyph unicode="&#x1d42c;" horiz-adv-x="389" d="M340 326h-25q-19 56 -47 82q-34 32 -75 32q-28 0 -47 -16.5t-19 -41.5q0 -26 22.5 -46.5t73.5 -41.5q75 -31 106.5 -67t31.5 -89q0 -67 -43 -109.5t-111 -42.5q-52 0 -108 23q-15 6 -23 6q-11 0 -26 -28h-25v165h28q32 -132 137 -132q34 0 54.5 18t20.5 47q0 24 -22 44.5 t-74 42.5q-75 32 -108.5 68.5t-33.5 86.5q0 63 44.5 104.5t112.5 41.5q34 0 78 -15q22 -7 31 -7q17 0 25 20h22v-145z" />
+<glyph unicode="&#x1d42d;" horiz-adv-x="333" d="M307 112l25 -11q-31 -62 -64.5 -87.5t-83.5 -25.5q-52 0 -82 28.5t-30 78.5v322h-53v27q49 33 82 71.5t85 114.5h25v-169h95v-44h-95v-298q0 -60 39 -60q29 0 57 53z" />
+<glyph unicode="&#x1d42e;" horiz-adv-x="556" d="M538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z" />
+<glyph unicode="&#x1d42f;" horiz-adv-x="500" d="M485 461v-24q-24 -2 -34 -11.5t-24 -43.5l-160 -396h-26l-120 296q-47 116 -66 141q-8 10 -34 14v24h250v-24l-18 -2q-35 -4 -35 -24q0 -9 9 -31l79 -203l72 182q11 26 11 45q0 18 -11.5 24.5t-43.5 8.5v24h151z" />
+<glyph unicode="&#x1d430;" horiz-adv-x="722" d="M707 461v-24q-19 -4 -29.5 -14.5t-20.5 -35.5l-155 -401h-23l-102 310l-125 -310h-24l-148 374q-19 47 -28.5 60t-28.5 17v24h222v-24q-38 -5 -38 -28q0 -12 39 -115l45 -118l68 171q-4 12 -6 19q-14 49 -22 58.5t-37 12.5v24h234v-24q-28 -2 -38 -7t-10 -17 q0 -14 27 -106q23 -79 34 -127l35 94q44 118 44 128q0 17 -10 24.5t-38 10.5v24h135z" />
+<glyph unicode="&#x1d431;" horiz-adv-x="500" d="M484 0h-241v24q45 3 45 20q0 16 -33 64q-23 32 -42 63q-2 -3 -7.5 -9.5t-8.5 -10.5q-64 -77 -64 -103q0 -21 50 -24v-24h-169v24q28 2 49.5 19.5t63.5 73.5l43 56q5 6 7.5 9.5t3.5 4.5t3.5 4.5t7.5 9.5l-128 197q-15 23 -24 29.5t-28 9.5v24h250v-24q-47 -1 -47 -19 q0 -22 58 -98q10 -12 13 -17l36 46q38 49 38 64q0 11 -7 15.5t-24 6.5l-20 2v24h168v-24q-44 -7 -70 -39l-101 -126l148 -228q8 -13 30 -20v-24z" />
+<glyph unicode="&#x1d432;" horiz-adv-x="500" d="M482 461v-24q-24 -3 -36 -13.5t-24 -41.5l-148 -398q-45 -121 -77 -156q-31 -33 -84 -33q-43 0 -70 22t-27 57q0 29 17 48t45 19q25 0 42.5 -15t17.5 -37q0 -4 -2 -14l-1 -6q0 -7 5 -12t12 -5q38 0 66 82l18 53l-119 290q-49 121 -67 146q-8 10 -34 14v24h249v-24l-16 -1 q-36 -3 -36 -25q0 -7 20 -58l72 -186l68 188q11 32 11 49q0 18 -11 25t-43 8v24h152z" />
+<glyph unicode="&#x1d433;" horiz-adv-x="444" d="M420 160l-16 -160h-383v25l234 404q-106 0 -139 -19t-52 -91h-26l7 142h371v-26l-231 -403h29q61 0 91.5 12.5t55.5 46.5q20 30 31 69h28z" />
+<glyph unicode="&#x1d434;" horiz-adv-x="717" d="M685 0h-285v16h16q40 0 56 14.5t16 46.5q0 7 -2 21l-13 113h-198l-84 -140q-10 -11 -10 -26q2 -29 43 -29h29v-16h-218v16q67 8 108 74l356 577h18l78 -581q10 -70 74 -70h16v-16zM466 248l-25 227h-6l-139 -227h170z" />
+<glyph unicode="&#x1d435;" horiz-adv-x="696" d="M198 653h252q236 0 236 -145q0 -102 -91 -147q-28 -14 -74 -26l3 -4q52 -9 89.5 -44t37.5 -94q0 -82 -72 -137.5t-217 -55.5h-324l4 16h20q52 0 74 16.5t29 46.5l123 495q2 10 2 21q0 42 -78 42h-19zM406 611l-59 -252q30 -6 53 -6q82 0 125 44t43 119q0 52 -35 75 t-84 23q-23 0 -43 -3zM338 314l-68 -267q32 -9 71 -9q80 0 135 41t55 131q0 52 -40 80t-102 28q-36 0 -51 -4z" />
+<glyph unicode="&#x1d436;" horiz-adv-x="671" d="M711 659l-53 -223h-16q1 8 1 42q0 59 -35 101.5t-117 42.5q-72 0 -134 -34t-101.5 -88t-61.5 -119.5t-22 -130.5q0 -91 49.5 -152.5t145.5 -61.5q126 0 216 98q9 10 17 20l20 -13q-35 -53 -89 -92q-87 -61 -193 -61q-138 0 -213 80t-75 198q0 112 60 203t161.5 140.5 t221.5 49.5q27 0 79.5 -13.5t78.5 -13.5t42 27h18z" />
+<glyph unicode="&#x1d437;" horiz-adv-x="790" d="M194 653h282q140 0 214.5 -72.5t74.5 -202.5q0 -162 -115.5 -270t-305.5 -108h-306l4 16h18q90 0 105 62l122 497q4 16 4 24q0 37 -77 37h-25zM405 612l-122 -504q-5 -19 -5 -27q0 -43 95 -43q69 0 123 30.5t85 79.5t47 104t16 111q0 48 -8 89t-26.5 79.5t-56 61 t-89.5 22.5q-35 0 -59 -3z" />
+<glyph unicode="&#x1d438;" horiz-adv-x="714" d="M734 653l-42 -158h-16q2 26 2 35q-4 87 -109 87h-160l-60 -248h80q51 0 81 19t45 76h16l-58 -242h-17q0 2 3 26t3 34q0 51 -72 51h-90l-66 -258q-2 -8 -2 -10q0 -27 63 -27h67q115 0 169 36t88 124h16l-66 -198h-571l4 16h19q89 0 104 62l120 488q5 22 5 36q0 19 -16 27 t-59 8h-19l4 16h534z" />
+<glyph unicode="&#x1d439;" horiz-adv-x="618" d="M723 653l-40 -160h-16q1 8 1 36q-3 87 -110 87h-147l-62 -248h83q36 0 57.5 5.5t41.5 27t30 62.5h16l-60 -242h-16q5 23 5 61q0 50 -70 50h-97l-62 -254q0 -1 -2 -9t-2 -12q0 -41 79 -41h32l-4 -16h-342l4 16h18q52 0 75 16t31 46l124 497q4 16 4 24q0 39 -76 39h-19 l4 15h520z" />
+<glyph unicode="&#x1d43a;" horiz-adv-x="734" d="M734 329v-16q-59 0 -81.5 -15.5t-31.5 -46.5l-62 -216q-37 -22 -80 -33t-68.5 -12.5t-68.5 -1.5q-127 0 -209.5 63.5t-82.5 190.5q0 106 55 203t156.5 160t223.5 63q53 0 103 -16q6 -2 28 -11.5t35 -9.5q15 0 28 12t15 25h16l-45 -223h-16q2 20 2 32q0 62 -40.5 108 t-119.5 46q-66 0 -120.5 -27.5t-90.5 -71.5t-60.5 -100.5t-35.5 -114t-11 -113.5q0 -34 8 -63t27 -56.5t56.5 -43.5t89.5 -16q57 0 97 25l57 201q3 12 3 25q0 18 -16 27.5t-59 9.5h-19l4 16h313z" />
+<glyph unicode="&#x1d43b;" horiz-adv-x="873" d="M923 653l-4 -16h-18q-52 0 -75 -16.5t-31 -46.5l-123 -496q-4 -18 -4 -28q0 -34 78 -34h19l-4 -16h-329l4 16h18q51 0 74.5 16t30.5 46l61 242h-280l-61 -242q-4 -12 -4 -24q0 -38 77 -38h20l-4 -16h-330l4 16h18q91 0 106 62l123 496q4 12 4 24q0 39 -78 39h-20l4 16 h330l-4 -16h-18q-54 0 -76 -16t-29 -47l-52 -217h278l53 217q4 20 4 24q0 39 -76 39h-20l4 16h330z" />
+<glyph unicode="&#x1d43c;" horiz-adv-x="480" d="M530 653l-4 -16h-19q-53 0 -75.5 -16t-30.5 -46l-123 -497q-3 -12 -3 -29q0 -33 78 -33h17l-4 -16h-328l4 16h19q52 0 75 16.5t30 45.5l123 497q4 16 4 24q0 38 -77 38h-18l4 16h328z" />
+<glyph unicode="&#x1d43d;" horiz-adv-x="540" d="M620 653l-4 -16h-18q-92 0 -108 -63l-103 -413q-25 -100 -92 -145q-44 -28 -109 -28q-53 0 -89.5 26.5t-36.5 70.5q0 30 17.5 50.5t52.5 20.5q25 0 44.5 -14.5t19.5 -36.5q0 -17 -13.5 -31.5t-13.5 -27.5q0 -21 24 -21q49 0 74 96q117 455 117 477q0 39 -75 39h-20l4 16 h329z" />
+<glyph unicode="&#x1d43e;" horiz-adv-x="762" d="M802 653l-4 -16q-35 0 -59 -12t-61 -41l-271 -211l187 -278q26 -38 54.5 -58.5t72.5 -20.5l-4 -16h-287l4 16h11q24 0 35.5 6.5t11.5 26.5q0 6 -1.5 11t-3.5 7.5t-5 8.5l-6 8l-156 237h-4l-62 -243q-3 -12 -3 -22q0 -40 78 -40h17l-4 -16h-304l4 16h18q68 0 84 62 l117 472q10 39 10 49q0 38 -76 38h-18l4 16h312l-4 -16h-11q-51 0 -70 -15.5t-27 -46.5l-53 -209h5l282 221q18 14 18 29q-1 11 -11 16t-40 5l4 16h216z" />
+<glyph unicode="&#x1d43f;" horiz-adv-x="708" d="M668 190l-61 -190h-569l4 16h17q92 0 107 62l118 477q7 28 7 45q0 37 -76 37h-18l4 16h327l-4 -16h-18q-52 0 -74.5 -16t-30.5 -47l-122 -481q-5 -19 -5 -31q0 -24 40 -24h122q79 0 122.5 23.5t76.5 91.5q9 14 17 37h16z" />
+<glyph unicode="&#x1d440;" horiz-adv-x="1005" d="M1055 653l-4 -16h-17q-55 0 -76 -15t-29 -46l-127 -498q-2 -7 -2 -28q0 -34 77 -34h19l-4 -16h-330l4 16h17q54 0 76 16.5t29 45.5l112 439h-6l-345 -517h-25l-94 517h-3l-109 -428q-5 -22 -5 -40q0 -33 76 -33h20l-4 -16h-267l4 16h19q54 0 76.5 19t31.5 54l119 475 q5 21 5 38q0 35 -77 35h-19l4 16h213l89 -493h4l333 493h215z" />
+<glyph unicode="&#x1d441;" horiz-adv-x="851" d="M901 653l-4 -16h-18q-53 0 -76.5 -16t-30.5 -47l-144 -574h-24l-274 526h-6l-108 -448q-3 -12 -3 -27q0 -35 76 -35h19l-4 -16h-266l4 16h18q91 0 106 62l126 509q-22 50 -92 50h-19l4 16h200l236 -465h5l97 386q4 18 4 26q0 37 -76 37h-20l4 16h266z" />
+<glyph unicode="&#x1d442;" horiz-adv-x="732" d="M712 420q0 -75 -29 -151t-80 -138.5t-130 -102t-170 -39.5q-112 0 -182.5 65t-70.5 168q0 77 29.5 155.5t81 144t131 106.5t171.5 41q118 0 183.5 -73.5t65.5 -175.5zM596 443q0 86 -34.5 137.5t-106.5 51.5q-66 0 -118 -34t-82.5 -84.5t-50 -115.5t-26.5 -119t-7 -102 q0 -70 39.5 -110t100.5 -40t111 30t81.5 75.5t53 103t30.5 110t9 97.5z" />
+<glyph unicode="&#x1d443;" horiz-adv-x="594" d="M201 653h271q117 0 174.5 -48t57.5 -112q0 -82 -71.5 -140.5t-213.5 -58.5q-44 0 -74 5q-4 0 -12 2l-56 -223q-3 -12 -3 -23q0 -39 77 -39h32l-4 -16h-341l4 16h17q53 0 75.5 16t30.5 46l125 497q4 16 4 25q0 37 -78 37h-19zM411 613l-68 -274q32 -8 60 -8q78 0 130 48 t52 124q0 50 -29.5 81.5t-95.5 31.5q-24 0 -49 -3z" />
+<glyph unicode="&#x1d444;" horiz-adv-x="781" d="M83 -115l164 107q-88 13 -142.5 73.5t-54.5 156.5q0 76 34 155.5t91 143.5t141 105t176 41q110 0 174.5 -65.5t64.5 -181.5q0 -102 -56 -201t-157.5 -164t-219.5 -65l-64 -43l4 -5q21 4 43 4q30 0 114.5 -17t130.5 -17q74 0 136 66l13 -11q-48 -59 -105.5 -89t-141.5 -30 q-68 0 -142 16l-47 11q-34 8 -53.5 12t-33.5 4q-21 0 -58 -18zM612 467q0 163 -130 163q-63 0 -117 -34t-89 -86t-60 -115t-35.5 -119t-10.5 -100q0 -72 35 -110.5t96 -38.5q77 0 139.5 46t98 116t54.5 142.5t19 135.5z" />
+<glyph unicode="&#x1d445;" horiz-adv-x="740" d="M725 16l-2 -16h-169l-150 315q-20 -2 -29 -2q-10 0 -38 4l-62 -239q-3 -12 -3 -23q0 -39 76 -39h19l-4 -16h-325l4 16h16q52 0 74.5 16t30.5 46l124 497q5 20 5 25q0 37 -77 37h-20l4 16h271q113 0 164.5 -41t51.5 -110q0 -62 -48.5 -108.5t-129.5 -62.5l115 -229 q18 -37 41 -60t61 -26zM410 613l-64 -260q17 -4 32 -4q96 0 143.5 38t47.5 104q0 73 -34 99t-91 26q-18 0 -34 -3z" />
+<glyph unicode="&#x1d446;" horiz-adv-x="650" d="M680 668l-53 -221h-16q1 8 1 24q0 68 -40.5 114t-119.5 46q-41 0 -81 -24.5t-40 -72.5q0 -14 3 -27.5t11 -26.5l14 -22q6 -9 20 -22l21 -20q6 -6 24 -21l24 -20q55 -46 86.5 -90.5t31.5 -103.5q0 -79 -65.5 -135t-178.5 -56q-49 0 -107 19t-94 19q-32 0 -55 -38h-16 l60 236h16q0 -5 0.5 -15.5t0.5 -15.5q3 -70 42 -118.5t129 -48.5q156 0 156 136q0 50 -46 96q-16 16 -56.5 51t-57.5 51q-73 73 -73 131q0 69 56.5 122t166.5 53q46 0 106 -18.5t77 -18.5q14 0 24 12t13 25h16z" />
+<glyph unicode="&#x1d447;" horiz-adv-x="550" d="M670 653l-46 -179h-16q5 42 5 71q0 31 -17.5 47.5t-36 20t-45.5 3.5h-98l-133 -538q-5 -22 -5 -25q0 -37 76 -37h21l-4 -16h-329l4 16h18q54 0 76.5 16t29.5 46l133 538h-91q-62 0 -109.5 -40.5t-61.5 -101.5h-16l46 179h599z" />
+<glyph unicode="&#x1d448;" horiz-adv-x="705" d="M775 653l-4 -16h-16q-52 0 -75.5 -16.5t-31.5 -46.5l-87 -356q-9 -36 -20 -65t-32.5 -61.5t-49 -54t-71.5 -36t-99 -14.5q-111 0 -166.5 55t-55.5 132q0 6 6 46.5t8 48.5l76 330q1 2 1 7q0 31 -75 31h-18l4 16h328l-4 -16h-17q-54 0 -76 -16t-30 -47l-90 -360 q-7 -26 -7 -68q0 -45 38 -78.5t106 -33.5q149 0 195 189l86 351q4 14 4 26q-1 19 -17.5 28t-57.5 9h-19l4 16h263z" />
+<glyph unicode="&#x1d449;" horiz-adv-x="575" d="M760 653l-4 -16q-77 -5 -132 -77l-441 -576h-24v571q0 82 -99 82l4 16h294l-4 -16h-19q-44 0 -57 -19t-13 -51v-391l4 -1l280 366q38 48 38 74q0 22 -52 22h-20l4 16h241z" />
+<glyph unicode="&#x1d44a;" horiz-adv-x="916" d="M1101 653l-4 -16q-78 -4 -134 -77l-438 -576h-29v442h-11l-297 -442h-29v569q0 41 -23.5 62.5t-65.5 21.5h-10l4 16h288l-4 -16h-7q-19 0 -29 -1.5t-23 -7.5t-18.5 -21.5t-5.5 -40.5v-377h5l226 332v61q0 55 -82 55h-8l4 16h285l-4 -16h-18q-71 0 -71 -72v-395h6l278 370 q40 52 40 72q0 25 -54 25h-17l4 16h242z" />
+<glyph unicode="&#x1d44b;" horiz-adv-x="790" d="M810 653l-4 -16h-4q-33 0 -58.5 -11t-39.5 -23.5t-37 -39.5l-187 -213l96 -266q11 -32 28 -50t51 -18h14l-4 -16h-281l4 16h11q34 0 50.5 8t16.5 33q0 13 -4 26l-69 194l-181 -201q-12 -13 -12 -28q0 -32 56 -32h22l-4 -16h-249l4 16q78 10 140 77l208 230l-85 231 q-6 18 -10.5 27t-16 25t-30.5 23.5t-45 7.5h-9l4 16h283l-4 -16h-19q-26 0 -39 -7t-13 -28q0 -12 6 -28l60 -179l164 184q15 18 15 34q-2 24 -45 24h-9l4 16h222z" />
+<glyph unicode="&#x1d44c;" horiz-adv-x="535" d="M695 653l-4 -16q-72 -5 -124 -69l-209 -256l-59 -234q-3 -14 -3 -26q0 -36 76 -36h20l-4 -16h-328l4 16h17q53 0 75.5 16t29.5 46l61 246l-89 237q-14 37 -41.5 56.5t-81.5 19.5l4 16h299l-4 -16h-19q-35 0 -46.5 -9.5t-11.5 -30.5q0 -3 7 -27l75 -207h4l174 212 q16 20 16 34q0 28 -79 28l4 16h237z" />
+<glyph unicode="&#x1d44d;" horiz-adv-x="772" d="M802 653l-566 -615h218q42 0 70 4t59.5 17t53 43t34.5 76h16l-46 -178h-581l573 616h-202q-44 0 -71.5 -3t-60.5 -14t-55 -37t-36 -67h-17l48 158h563z" />
+<glyph unicode="&#x1d44e;" horiz-adv-x="502" d="M472 428l-91 -345q-1 -2 -1 -11q0 -17 14 -17q24 0 64 54l12 -12q-28 -42 -64 -74.5t-69 -32.5q-42 0 -42 55q0 15 11 50h-4q-82 -105 -173 -105q-45 0 -67 33.5t-22 85.5q0 67 38 144t104 132.5t134 55.5q30 0 47 -14t19 -32h1l9 33h80zM367 341q0 71 -50 71 q-47 0 -90 -50t-72 -121q-28 -70 -28 -124q0 -66 58 -66q49 0 97 57.5t70 132.5q15 49 15 100z" />
+<glyph unicode="&#x1d44f;" horiz-adv-x="470" d="M214 382l4 -4q65 63 121 63q51 0 81 -43.5t30 -107.5q0 -46 -20 -98t-53.5 -97.5t-85 -75.5t-107.5 -30q-67 0 -139 48l144 563q2 8 2 11q-1 9 -10 15t-19 6q-19 0 -30 -4l-3 16l158 24zM179 252l-55 -215q0 -5 19 -12t36 -7q57 0 102 49t65.5 110.5t20.5 116.5 q0 48 -21 70t-50 22q-47 0 -76 -42.5t-41 -91.5z" />
+<glyph unicode="&#x1d450;" horiz-adv-x="415" d="M363 111l12 -13q-93 -109 -198 -109q-68 0 -102.5 45.5t-34.5 109.5q0 108 79.5 202.5t183.5 94.5q40 0 68.5 -20.5t28.5 -55.5q0 -31 -13.5 -50.5t-40.5 -19.5q-18 0 -28 12t-10 26q0 12 14.5 29.5t14.5 28.5q0 21 -34 21q-55 0 -97.5 -49.5t-60.5 -107t-18 -102.5 q0 -60 27 -84.5t67 -24.5q73 0 142 67z" />
+<glyph unicode="&#x1d451;" horiz-adv-x="532" d="M527 668l-149 -598q-2 -6 -2 -12q0 -9 15 -9q25 0 62 56l11 -12q-28 -41 -63 -73t-67 -32q-40 0 -40 41q0 27 10 64h-5q-84 -105 -171 -105q-49 0 -68.5 38t-19.5 89q0 56 31 130t93 135t133 61q40 0 60 -15t21 -35h2l53 209q2 8 2 12q0 20 -33 20q-6 0 -27 -3l-4 15z M363 340q0 36 -13 53.5t-43 17.5q-46 0 -89.5 -54.5t-67 -123t-23.5 -118.5q0 -34 16 -50t40 -16q50 0 95.5 56t68.5 130q16 51 16 105z" />
+<glyph unicode="&#x1d452;" horiz-adv-x="445" d="M363 112l14 -13q-90 -110 -200 -110q-68 0 -102.5 47t-34.5 109q0 32 6 60q20 89 95.5 162.5t166.5 73.5q40 0 71 -17t31 -59q0 -45 -27.5 -80.5t-71.5 -56t-91.5 -32t-95.5 -13.5v-28q0 -47 33 -77t80 -30q76 0 126 64zM124 211h9q79 0 138.5 46t59.5 111q0 19 -12.5 31 t-31.5 12q-50 0 -93 -61t-70 -139z" />
+<glyph unicode="&#x1d453;" horiz-adv-x="555" d="M248 437h37q28 0 42.5 19.5t29 59.5t29.5 62q59 90 150 90q37 0 58 -16t21 -43q0 -20 -12 -30t-29 -10q-35 0 -35 25q0 8 4.5 21t4.5 16q0 8 -15 8q-36 0 -65 -35.5t-45 -96.5l-19 -70h80l-12 -38h-76l-79 -306q-20 -78 -30 -102q-71 -178 -175 -178q-35 0 -53.5 15 t-18.5 39q0 20 11.5 34.5t31.5 14.5q19 0 28 -10t9 -23q0 -10 -8 -18.5t-8 -13.5q0 -9 15 -9q13 0 25.5 8.5t22.5 25t18 32.5t15.5 41t11.5 40t9.5 38.5t7.5 29.5l87 342h-77z" />
+<glyph unicode="&#x1d454;" horiz-adv-x="492" d="M492 413l-13 -45h-81q17 -20 17 -50q0 -57 -38 -98.5t-103 -49.5q-42 -6 -65 -22t-23 -36t36.5 -32t80 -18.5t80 -31t36.5 -66.5q0 -60 -55.5 -105.5t-159.5 -45.5q-94 0 -139 33t-45 82q0 70 117 108q-24 16 -24 47q0 30 25.5 58.5t59.5 28.5v4q-47 11 -70.5 41 t-23.5 68q0 62 49 110t125 48q60 0 88 -28h126zM336 349q0 31 -11.5 46.5t-42.5 15.5q-39 0 -68.5 -43.5t-29.5 -95.5q0 -81 56 -81q33 0 56 29t31.5 63t8.5 66zM349 -69q0 27 -22.5 44.5t-50 24t-65.5 13.5t-54 13q-1 -1 -11 -6.5t-15 -9.5q-48 -35 -48 -72q0 -39 36 -68 t103 -29q63 0 95 26.5t32 63.5z" />
+<glyph unicode="&#x1d456;" horiz-adv-x="311" d="M257 566q0 -19 -14 -32.5t-34 -13.5q-21 0 -34.5 13t-13.5 33t13.5 35t34.5 15q19 0 33.5 -15.5t14.5 -34.5zM227 441l-92 -364q-1 -6 -1 -14q0 -10 13 -10q6 0 10.5 1.5t7.5 3t9 6.5t9 9t12.5 14t15.5 17l13 -10q-82 -105 -134 -105q-40 0 -40 46q0 31 79 338q2 4 2 12 q0 13 -7 17.5t-24 4.5q-14 0 -28 -4l-3 16z" />
+<glyph unicode="&#x1d457;" horiz-adv-x="389" d="M372 566q0 -19 -14 -32.5t-34 -13.5q-21 0 -34.5 13t-13.5 33t13.5 35t34.5 15q19 0 33.5 -15.5t14.5 -34.5zM351 441l-108 -425q-9 -36 -23.5 -69t-36.5 -64.5t-55 -50.5t-71 -19q-37 0 -55 18.5t-18 42.5q0 20 11.5 36t35.5 16q15 0 25 -10.5t10 -27.5q0 -7 -8 -16.5 t-8 -17.5q0 -3 3 -6.5t7 -3.5q60 0 103 172l92 363q0 22 -32 22q-15 0 -27 -5l-3 17z" />
+<glyph unicode="&#x1d458;" horiz-adv-x="542" d="M527 428l-4 -12q-47 -5 -74 -18t-59 -40l-106 -92l64 -152q13 -31 24 -45t29 -14q9 0 17 4.5t16 13t14 15.5l14 21l13 19l15 -11q0 -1 -8 -17l-16 -26q-6 -11 -18.5 -28.5t-24 -28.5t-28 -19.5t-32.5 -8.5t-29.5 7.5t-23.5 23t-14 24.5l-11 24l-63 147l-56 -49l-45 -166 h-76l148 589q3 9 3 20q0 22 -32 22q-19 0 -27 -2l-3 14l158 25l-113 -456l167 149q21 19 21 36q0 8 -8.5 13.5t-17.5 5.5h-12l4 12h194z" />
+<glyph unicode="&#x1d459;" horiz-adv-x="318" d="M278 668l-148 -591q-1 -4 -1 -11q0 -13 12 -13q15 0 33.5 19t28.5 36l16 -12q-3 -4 -20.5 -25.5t-26 -30.5t-24.5 -23.5t-31.5 -20.5t-32.5 -6q-39 0 -39 51q0 16 6 36l128 510q3 13 3 24q0 22 -31 22q-3 0 -27 -3l-3 15z" />
+<glyph unicode="&#x1d45a;" horiz-adv-x="710" d="M667 107l13 -11q-26 -44 -62 -74t-69 -30q-39 0 -39 49q0 13 6 37l56 221q6 21 6 40q0 38 -24 38q-37 0 -101.5 -94t-77.5 -148l-34 -135h-79l77 299q5 23 5 40q0 38 -23 38q-36 0 -100 -94t-78 -148l-35 -135h-78l95 374q0 31 -33 31q-11 0 -27 -2l-2 14l157 24 l-44 -169h6q111 169 192 169q27 0 41 -23t14 -58q0 -22 -9 -52l-10 -36h5q23 41 58.5 82t71.5 65q32 22 61 22q54 0 54 -71q0 -33 -7 -61l-61 -231q-2 -6 -2 -12q0 -12 15 -12q14 0 31.5 13.5t30.5 39.5z" />
+<glyph unicode="&#x1d45b;" horiz-adv-x="497" d="M467 96l-5 -6q-1 -1 -8.5 -10.5l-10.5 -13.5l-11 -12q-8 -9 -12 -14l-13 -12l-13.5 -11.5t-14 -10t-15 -8t-14.5 -4.5t-16 -2q-41 0 -41 46q0 14 7 40l57 221q7 28 7 42q0 38 -24 38q-44 0 -132 -133q-58 -87 -68 -122l-33 -124h-77l95 374q0 10 -1.5 16.5t-8.5 11 t-20 4.5q-7 0 -28 -3l-2 15l159 23l-51 -189h3q7 0 56 73q93 116 160 116q56 0 56 -62q0 -26 -11 -70l-59 -231q-1 -2 -1 -10q2 -14 15 -14q7 0 14 3.5t14 10.5l12 12q5 5 13 15t9 12z" />
+<glyph unicode="&#x1d45c;" horiz-adv-x="458" d="M438 287q0 -110 -76.5 -204t-186.5 -94q-69 0 -102 49t-33 114t31 131t90.5 112t129.5 46q64 0 105.5 -38.5t41.5 -115.5zM357 318q0 36 -15.5 64.5t-51.5 28.5q-61 0 -115 -91.5t-54 -193.5q0 -107 59 -107q49 0 92 60t64 128t21 111z" />
+<glyph unicode="&#x1d45d;" horiz-adv-x="489" d="M253 370l14 13q61 58 113 58q94 0 94 -155q0 -65 -32.5 -133.5t-92.5 -116.5t-129 -48q-37 0 -61 19l-24 -100q-5 -22 -5 -35q0 -43 61 -43h16l-3 -12h-234l3 12q22 1 36.5 6t23 18t12 22.5t9.5 32.5l117 464q0 12 -1.5 17.5t-8.5 10.5t-21 5q-12 0 -28 -4l-2 16l158 24 l-18 -69zM214 238l-46 -200q18 -21 46 -21q48 0 90 48.5t64 113.5t22 123q0 43 -15.5 63t-35.5 20q-40 0 -75 -41.5t-50 -105.5z" />
+<glyph unicode="&#x1d45e;" horiz-adv-x="458" d="M463 428l-131 -522q-3 -10 -3 -29q0 -22 13 -35t36 -13h14l-3 -12h-250l3 12h19q46 0 65 21t28 57l44 184h-6q-74 -103 -163 -103q-45 0 -67 33.5t-22 81.5q0 89 49.5 173.5t119.5 130.5q50 34 91 34q34 0 52 -15t20 -37h3l7 39h81zM358 338q0 74 -49 74q-27 0 -61 -27 q-48 -39 -85.5 -123t-37.5 -150q0 -63 52 -63q34 0 58 17q50 35 86.5 112.5t36.5 159.5z" />
+<glyph unicode="&#x1d45f;" horiz-adv-x="408" d="M175 267l5 -1q10 20 32 56q75 119 137 119q21 0 32.5 -13.5t11.5 -34.5q0 -31 -18 -56.5t-47 -25.5q-13 0 -21 6t-10.5 13t-6 13t-9.5 6q-27 0 -65.5 -69t-59.5 -124t-28 -80l-21 -76h-77l92 364q4 15 4 23q0 19 -33 19q-9 0 -27 -3l-2 15l157 23z" />
+<glyph unicode="&#x1d460;" horiz-adv-x="440" d="M390 441l-24 -146h-15q0 50 -25.5 85t-66.5 35q-21 0 -36 -14.5t-15 -43.5q0 -22 33.5 -63t67 -89.5t33.5 -89.5q0 -50 -36.5 -87.5t-98.5 -37.5q-20 0 -63.5 10t-46.5 10q-15 0 -30 -21h-17l25 156h16q0 -50 29.5 -90t74.5 -40q40 0 56.5 26.5t16.5 62.5 q0 27 -20.5 56.5t-44.5 52t-44.5 55.5t-20.5 66q0 55 33.5 81t80.5 26q23 0 51 -10t41 -10q14 0 30 20h16z" />
+<glyph unicode="&#x1d461;" horiz-adv-x="313" d="M283 438l-10 -38h-70l-78 -320q-2 -6 -2 -11q0 -12 16 -12q23 2 60 52l13 -11q-2 -2 -11.5 -15.5l-14.5 -20.5l-18 -19q-11 -13 -20 -20l-20 -15q-12 -9 -24.5 -13t-24.5 -4q-39 0 -39 52q0 19 5 37l81 320h-77l5 29q123 23 177 138h13l-31 -129h70z" />
+<glyph unicode="&#x1d462;" horiz-adv-x="474" d="M444 428l-89 -348q-1 -4 -1 -9q0 -14 14 -14q4 0 8.5 1.5t9.5 4.5l8 5q3 3 8 8.5t8 8.5l8 9q5 7 7 9l5 6l13 -11q-19 -27 -32.5 -44.5t-43.5 -40t-56 -22.5q-40 0 -40 52q0 21 4 37l26 95h-1q-2 -1 -28 -34l-58 -71q-33 -38 -51 -51q-38 -28 -72 -28q-61 0 -61 74 q0 29 8 59l59 231q6 23 6 25q0 23 -33 23q-16 0 -26 -3l-3 15l157 26l-84 -326q-3 -13 -3 -24q0 -34 26 -34q41 0 100 77q77 102 109 219l21 75h77z" />
+<glyph unicode="&#x1d463;" horiz-adv-x="506" d="M247 454l-89 -326q-4 -13 -4 -32q0 -30 15.5 -48t44.5 -18q73 0 127 60.5t83 142.5q15 45 15 74q0 25 -9.5 42t-21 24t-21 18t-9.5 25q0 42 54 42q47 0 47 -83q0 -146 -97 -280q-33 -46 -86 -75t-108 -29q-116 0 -116 93q0 32 9 62l58 210q5 20 5 25q0 20 -57 20v15 q14 4 48.5 11t60 14t47.5 17z" />
+<glyph unicode="&#x1d464;" horiz-adv-x="775" d="M531 450l-80 -289q-12 -46 -12 -70q0 -61 59 -61q123 0 195 203q15 45 15 74q0 25 -9.5 42t-20.5 24t-20.5 18t-10.5 25q-1 24 15 33t39 9q47 0 47 -83q0 -44 -12 -95.5t-36 -102.5t-56.5 -92.5t-77.5 -67.5t-94 -26q-111 0 -111 100q0 41 23 125q-17 -39 -38.5 -74 t-51 -71t-67 -58t-77.5 -22q-78 0 -78 87q0 21 19 95l47 177q5 15 5 29q0 22 -54 22v15q84 14 155 44l4 -3l-81 -307q-11 -48 -11 -73q0 -47 28 -47q56 1 153 151q37 56 60.5 116t49.5 153h84z" />
+<glyph unicode="&#x1d465;" horiz-adv-x="550" d="M305 288l45 69q55 84 111 84q49 0 49 -33q0 -16 -10.5 -29t-28.5 -13q-12 0 -24 4.5t-20 4.5q-14 0 -24.5 -5.5t-16 -12t-14.5 -20.5l-55 -85q9 -20 26.5 -75t34.5 -88.5t37 -33.5q33 0 61 57l14 -10q-2 -2 -15 -23t-25.5 -38.5t-33.5 -33.5t-41 -16q-45 0 -73 77 l-40 113l-63 -98q-20 -31 -32.5 -47t-35.5 -30.5t-49 -14.5q-25 0 -38.5 14t-13.5 33q0 14 10.5 25.5t27.5 11.5q13 0 24 -10t23 -10q31 0 70 59l65 101l-33 92q-32 89 -98 89q-23 0 -38 -6l-3 18l132 33q49 -27 75 -98z" />
+<glyph unicode="&#x1d466;" horiz-adv-x="496" d="M270 307l28 -235q71 97 118 184q28 52 28 75q0 8 -13 17.5t-26 22.5t-13 29q0 17 13 28.5t34 11.5q25 0 41 -16.5t16 -45.5q0 -51 -77 -179.5t-127 -191.5l-30 -39l-32 -40l-28 -34q-17 -21 -29.5 -32t-28 -23t-30 -17t-28.5 -5q-26 0 -41 17.5t-15 37.5t13.5 30.5 t26.5 10.5q25 0 38.5 -15.5t18.5 -15.5q12 0 45.5 35t54.5 67l-38 314q-3 30 -7.5 49t-20.5 37.5t-42 18.5l-36 -4l-2 16l150 25q17 -24 24.5 -50.5t14.5 -82.5z" />
+<glyph unicode="&#x1d467;" horiz-adv-x="499" d="M467 450v-16l-322 -360l3 -1q28 21 67 21q31 0 54 -13.5t33.5 -29.5t24 -29.5t28.5 -13.5q27 0 27 24q0 5 -6 15.5t-6 22.5q0 14 12 26t26 12q18 0 29 -12t11 -30q0 -37 -33.5 -58.5t-72.5 -21.5q-9 0 -68 14q-50 14 -99 14q-67 0 -122 -24l-11 10l328 370h-131 q-46 0 -67 -11t-37 -50l-18 4l36 137h314z" />
+<glyph unicode="&#x1d468;" horiz-adv-x="759" d="M724 23l-2 -23h-319l4 23h31q51 0 51 45q0 22 -2 34l-15 108h-159l-80 -139q-6 -12 -6 -22q0 -26 22 -26h56l-6 -23h-260l4 23q37 4 60.5 19t47.5 56l346 587h49l94 -624q6 -38 47 -38h37zM466 256l-23 178l-103 -178h126z" />
+<glyph unicode="&#x1d469;" horiz-adv-x="726" d="M197 669h265q41 0 74.5 -3t68 -13t57.5 -26t38 -44t15 -66q0 -100 -100 -147q-27 -13 -64 -24q49 -9 89.5 -45.5t40.5 -87.5q0 -99 -73.5 -156t-225.5 -57h-340l4 23h40q42 0 58.5 14.5t24.5 47.5l116 502q2 8 2 22q-2 20 -13 28.5t-43 8.5h-37zM440 624l-58 -251 q12 -2 32 -2q24 0 40 4q54 12 81.5 52t27.5 98q0 22 -4.5 42t-22.5 38.5t-47 18.5h-49zM373 324l-64 -274q24 -5 52 -5q68 0 116.5 49t48.5 127q0 103 -122 103h-31z" />
+<glyph unicode="&#x1d46a;" horiz-adv-x="701" d="M745 685l-54 -234h-23q2 20 2 30q0 66 -40 111.5t-121 45.5q-87 0 -156.5 -58t-104.5 -142.5t-35 -174.5q0 -93 43.5 -155.5t129.5 -62.5q168 0 245 114l22 -15q-31 -50 -93 -96q-82 -60 -202 -60q-150 0 -226.5 78t-76.5 210q0 79 33 156.5t95 135.5q125 117 311 117 q33 0 93 -14t79 -14q40 0 57 28h22z" />
+<glyph unicode="&#x1d46b;" horiz-adv-x="818" d="M197 669h289q151 0 227.5 -78.5t76.5 -196.5q0 -76 -29.5 -150t-86.5 -129q-117 -115 -309 -115h-323l4 23h37q42 0 60 14t25 46l116 504q3 12 3 23q0 36 -57 36h-37zM440 624l-117 -508q-7 -28 -7 -32q1 -17 14.5 -26.5t27.5 -11t36 -1.5q65 0 113.5 32.5t75 86 t39.5 111t13 117.5q0 38 -6 75t-20.5 74t-43.5 60t-70 23h-55z" />
+<glyph unicode="&#x1d46c;" horiz-adv-x="732" d="M754 669l-40 -168h-23q3 17 3 38q0 34 -22.5 54t-46.5 25.5t-52 5.5h-135l-55 -239h55q34 0 57 5t46.5 27.5t33.5 62.5h22l-54 -251h-23q6 24 6 65q0 46 -85 46h-69l-58 -258q-2 -12 -2 -17q0 -20 42 -20h65q111 0 171 36.5t91 124.5h22l-61 -206h-600l4 23h36 q42 0 60 14.5t25 46.5l115 504q2 12 2 16q0 42 -59 42h-37l4 23h562z" />
+<glyph unicode="&#x1d46d;" horiz-adv-x="635" d="M750 669l-42 -168h-23q3 17 3 41q0 82 -123 82h-124l-56 -248h59q25 0 43.5 3t39 12t34.5 29.5t21 51.5h24l-57 -253h-23q7 37 7 66q0 46 -84 46h-75l-58 -249q-4 -12 -4 -24q0 -35 60 -35h52l-3 -23h-377l4 23h36q43 0 60.5 14.5t24.5 46.5l116 504q3 12 3 23 q0 35 -60 35h-37l4 23h555z" />
+<glyph unicode="&#x1d46e;" horiz-adv-x="768" d="M768 342l-5 -23h-24q-43 0 -61.5 -14t-27.5 -47l-59 -218q-108 -52 -234 -52q-147 0 -224.5 83.5t-77.5 206.5q0 77 31 151.5t90 131.5q127 124 334 124q46 0 90.5 -16.5t71.5 -16.5q13 0 33 8.5t24 24.5h23l-53 -224h-23q6 21 6 40q0 58 -47 98.5t-119 40.5 q-90 0 -161 -61.5t-106.5 -151.5t-35.5 -185q0 -35 7 -68.5t23 -66.5t48.5 -53.5t77.5 -20.5q47 0 78 20l57 208q4 12 4 24q-1 18 -12 26t-43 8h-35l5 23h345z" />
+<glyph unicode="&#x1d46f;" horiz-adv-x="891" d="M946 669l-5 -23h-37q-43 0 -60 -14t-24 -47l-114 -503q-6 -21 -6 -22v-3q1 -19 12.5 -26.5t45.5 -7.5h41l-5 -23h-349l4 23h23q43 0 61.5 14.5t25.5 46.5l57 251h-242l-59 -253q0 -3 -2 -10.5t-2 -12.5q2 -21 14 -28.5t46 -7.5h25l-5 -23h-349l4 23h36q43 0 61 14.5 t25 46.5l115 503q3 12 3 21q0 38 -57 38h-40l6 23h348l-3 -23h-25q-44 0 -61 -14t-24 -46l-46 -203h242l47 204q3 12 3 23q0 36 -60 36h-37l3 23h364z" />
+<glyph unicode="&#x1d470;" horiz-adv-x="502" d="M557 669l-4 -23h-38q-43 0 -60.5 -14.5t-24.5 -46.5l-116 -503q-1 -5 -1 -25q1 -18 13 -26t45 -8h37l-4 -23h-362l4 23h38q43 0 59 14t24 47l115 502q3 12 3 21q0 39 -57 39h-37l4 23h362z" />
+<glyph unicode="&#x1d471;" horiz-adv-x="558" d="M646 669l-3 -23h-37q-42 0 -61 -14.5t-26 -46.5l-96 -420q-22 -101 -95 -148q-43 -29 -118 -29q-59 0 -101.5 30t-42.5 71q0 31 20.5 54.5t64.5 23.5q31 0 56 -17.5t25 -40.5q0 -17 -13.5 -31.5t-13.5 -27.5q0 -18 19 -18q22 0 43 93l105 463q3 12 3 22q0 36 -56 36h-38 l3 23h362z" />
+<glyph unicode="&#x1d472;" horiz-adv-x="795" d="M839 669l-4 -23q-38 0 -65.5 -14.5t-69.5 -48.5l-248 -201l191 -284q33 -49 60 -62t75 -13l-4 -23h-328l4 23h29q29 0 29 22q0 18 -16 40l-138 208l-48 -211q-1 -5 -1 -21q1 -21 13 -29.5t45 -8.5h38l-5 -23h-354l5 23h30q44 0 59 14t23 47l115 503q4 16 4 23 q0 36 -58 36h-37l4 23h347l-6 -23h-27q-40 0 -56.5 -15.5t-24.5 -48.5l-40 -178h2l243 198q15 13 15 23q0 9 -8.5 15t-22.5 6h-24l4 23h250z" />
+<glyph unicode="&#x1d473;" horiz-adv-x="744" d="M700 199l-59 -199h-599l4 23h35q45 0 62 14t25 47l116 496q2 10 2 15q0 21 -15 36t-45 15h-36l4 23h360l-4 -23h-37q-38 0 -55.5 -16.5t-26.5 -53.5l-115 -492q-3 -15 -3 -16q1 -14 6 -18.5t15 -4.5h120q45 0 77.5 5.5t63.5 21.5t51 47.5t31 80.5z" />
+<glyph unicode="&#x1d474;" horiz-adv-x="1016" d="M1071 669l-3 -23h-34q-46 0 -63.5 -15.5t-25.5 -49.5l-115 -499q-3 -10 -3 -20q0 -39 59 -39h39l-4 -23h-362l4 23h35q44 0 60.5 14.5t24.5 46.5l82 354h-1l-283 -438h-56l-90 441l-80 -348q-3 -15 -3 -40q2 -17 12.5 -23.5t42.5 -6.5h38l-3 -23h-300l4 23h36 q43 0 61.5 17.5t26.5 54.5l111 486q4 12 4 33q0 17 -13.5 24.5t-44.5 7.5h-39l4 23h246l91 -468l297 468h245z" />
+<glyph unicode="&#x1d475;" horiz-adv-x="869" d="M924 669l-3 -23h-38q-43 0 -61.5 -15t-25.5 -49l-131 -582h-57l-263 491l-92 -409q-2 -12 -2 -18v-8q1 -18 12.5 -25.5t44.5 -7.5h39l-4 -23h-301l4 23h36q43 0 60.5 14.5t24.5 46.5l117 510q-21 52 -71 52h-38l3 23h232l222 -435l80 350q2 7 2 20q0 42 -57 42h-37l4 23 h300z" />
+<glyph unicode="&#x1d476;" horiz-adv-x="777" d="M755 432q0 -117 -58 -220.5t-157.5 -165.5t-213.5 -62q-128 0 -199.5 75t-71.5 188q0 107 51 206t151.5 165.5t225.5 66.5q127 0 199.5 -74.5t72.5 -178.5zM601 467q0 73 -32 122t-97 49t-118 -46.5t-83 -116t-45.5 -140t-15.5 -128.5q0 -75 31.5 -125.5t94.5 -50.5 q60 0 112 45.5t84 114t50.5 142t18.5 134.5z" />
+<glyph unicode="&#x1d477;" horiz-adv-x="612" d="M198 669h284q128 0 189.5 -38t61.5 -125q0 -83 -74 -144.5t-223 -61.5q-46 0 -67 3l-51 -221q-4 -20 -4 -24q2 -21 13.5 -28t46.5 -7h52l-4 -23h-380l4 23h40q43 0 60.5 14.5t24.5 46.5l115 504q3 12 3 21q-1 19 -14 28t-46 9h-37zM441 623l-61 -273q22 -5 40 -5 q69 0 113 49t44 127q0 44 -26 73.5t-80 29.5q-21 0 -30 -1z" />
+<glyph unicode="&#x1d478;" horiz-adv-x="810" d="M97 -112l159 101q-88 14 -144.5 82t-56.5 160q0 82 30 163t84 146t136 105t178 40q119 0 195 -70.5t77 -183.5q2 -175 -117 -305t-303 -144l-52 -30q8 1 23 1q35 0 119.5 -17t126.5 -17q86 0 145 68l17 -13q-100 -128 -258 -128q-67 0 -146 17q-118 26 -129 26 q-28 0 -72 -21zM601 479q0 78 -41 118.5t-88 40.5q-53 0 -98 -31.5t-74.5 -81t-50.5 -110.5t-30 -119.5t-9 -109.5q0 -56 30.5 -106t84.5 -50q65 0 119.5 45.5t87.5 115t51 145.5t18 143z" />
+<glyph unicode="&#x1d479;" horiz-adv-x="801" d="M784 23l-4 -23h-223l-154 317q-2 0 -5 0.5t-11 1t-19 0.5l-55 -237q-2 -10 -2 -22q2 -21 12.5 -29t43.5 -8h39l-4 -23h-360l4 23h36q45 0 60.5 14t23.5 47l114 500q4 20 4 27q0 35 -59 35h-37l4 23h284q122 0 178.5 -43.5t56.5 -111.5q0 -61 -46 -108.5t-126 -67.5 l115 -231q20 -41 48.5 -62.5t81.5 -21.5zM379 364h40q72 0 105.5 39.5t33.5 102.5q0 97 -72 114q-21 4 -34 4h-16z" />
+<glyph unicode="&#x1d47a;" horiz-adv-x="671" d="M704 682l-50 -219h-23q0 33 -1 50q-2 51 -50.5 88t-118.5 37q-35 0 -67.5 -21t-32.5 -63q0 -35 18 -66.5t38 -49.5t57 -46q126 -96 126 -210q0 -74 -70.5 -133t-186.5 -59q-79 0 -157 32q-27 9 -41 9q-15 0 -35 -9.5t-33 -29.5h-22l59 245h24v-35q0 -68 48 -115.5 t132 -47.5q67 0 101 33.5t34 85.5q0 70 -43 113q-16 16 -56 48t-66 56t-49 62.5t-23 78.5q0 73 60 121t177 48q52 0 111 -20t68 -20q15 0 30.5 10.5t19.5 26.5h22z" />
+<glyph unicode="&#x1d47b;" horiz-adv-x="568" d="M700 669l-44 -187h-24q7 21 7 54q0 88 -111 88h-78l-123 -541q-4 -24 -4 -25q1 -19 12.5 -27t44.5 -8h42l-3 -23h-368l4 23h40q43 0 60.5 14.5t24.5 46.5l124 540h-75q-74 0 -119 -37.5t-60 -104.5h-22l43 187h629z" />
+<glyph unicode="&#x1d47c;" horiz-adv-x="733" d="M810 669l-4 -23h-38q-44 0 -61.5 -13.5t-24.5 -46.5l-80 -359q-12 -51 -31 -92q-67 -145 -249 -145q-119 0 -179.5 57.5t-60.5 136.5q0 28 15 95l70 307q2 8 2 15q0 45 -60 45h-37l4 23h363l-4 -23h-39q-45 0 -60 -13t-23 -47l-83 -363q-7 -30 -7 -67q0 -45 34 -77.5 t93 -32.5q128 0 170 187l79 355q2 5 2 24q-1 19 -13 26.5t-44 7.5h-37l4 23h299z" />
+<glyph unicode="&#x1d47d;" horiz-adv-x="593" d="M797 669l-4 -23q-46 0 -75.5 -21t-56.5 -57l-431 -583h-52l-20 573q0 14 -1 20q-2 33 -14.5 50.5t-51.5 17.5h-25l3 23h326l-4 -23h-36q-49 0 -49 -69v-8l8 -350l242 336q33 46 33 71q0 11 -7 15.5t-27 4.5h-37l3 23h276z" />
+<glyph unicode="&#x1d47e;" horiz-adv-x="925" d="M1129 669l-3 -23q-33 0 -62 -15.5t-42.5 -30.5t-32.5 -41l-425 -576h-53l-21 407l-260 -407h-53l-21 575q-2 51 -15 69.5t-55 18.5h-20l3 23h314l-4 -23h-22q-29 0 -42.5 -17t-12.5 -61l8 -331l182 278l-3 65q-4 66 -59 66h-24l4 23h318l-4 -23h-37q-52 0 -50 -78l5 -354 l242 331q34 47 34 79q0 13 -7 17.5t-28 4.5h-37l3 23h280z" />
+<glyph unicode="&#x1d47f;" horiz-adv-x="808" d="M830 669l-3 -23h-24q-15 0 -28.5 -3.5t-21.5 -6t-19.5 -13t-15 -14t-16.5 -19t-15 -18.5l-177 -212l98 -270q13 -35 26 -51t36 -16h36l-4 -23h-316l3 23h28q49 0 49 36q0 15 -5 27l-63 171l-154 -179q-8 -9 -8 -22q0 -14 10.5 -23.5t28.5 -9.5h42l-4 -23h-285l4 23 q84 10 142 77l198 229l-89 237q-29 80 -84 80h-27l4 23h318l-4 -23h-39q-34 0 -34 -27q0 -8 8 -32l53 -155l137 162q10 12 10 27q0 25 -28 25h-31l4 23h260z" />
+<glyph unicode="&#x1d480;" horiz-adv-x="549" d="M725 669l-3 -23q-40 0 -67.5 -19t-57.5 -57l-197 -252l-56 -236l-2 -10q-1 -10 -1 -17q0 -32 58 -32h39l-4 -23h-362l4 23h37q43 0 59.5 14.5t24.5 46.5l56 243l-92 238q-17 43 -41.5 62t-80.5 19l3 23h331l-4 -23h-35q-43 0 -43 -28q0 -15 15 -54l63 -172l150 191 q11 14 11 37q0 26 -51 26h-28l4 23h270z" />
+<glyph unicode="&#x1d481;" horiz-adv-x="797" d="M830 669l-548 -623h194q32 0 55.5 2t52 10.5t49 23t38.5 41t28 64.5h23l-44 -187h-612l555 624h-177q-42 0 -68 -3t-60.5 -13.5t-60.5 -36.5t-43 -68h-23l46 166h595z" />
+<glyph unicode="&#x1d482;" horiz-adv-x="581" d="M529 105l19 -12q-29 -51 -65 -77t-90 -26q-29 0 -48.5 17t-20.5 53h-6q-67 -70 -146 -70q-57 0 -92.5 30.5t-35.5 91.5q0 53 21 113.5t57 113.5t90 88t113 35q38 0 60 -19t24 -44h2l11 51h115l-74 -317q-6 -21 -6 -45q0 -31 16 -31q9 0 19 7.5t16.5 15t20.5 25.5z M382 325q0 98 -54 98q-35 0 -74.5 -44t-66.5 -114.5t-27 -139.5q0 -65 45 -65q53 0 115 91t62 174z" />
+<glyph unicode="&#x1d483;" horiz-adv-x="509" d="M263 429l7 -1q47 31 93 31q124 0 124 -163q0 -49 -19 -101.5t-52.5 -98t-86.5 -75t-115 -29.5q-88 0 -164 55l127 563q2 10 2 14q0 17 -14 17q-15 0 -43 -7l-4 23l198 28zM219 253l-47 -203q2 -11 14 -17t23 -6q46 0 85 47.5t58 109.5t19 115q0 49 -14.5 72.5t-34.5 23.5 q-21 0 -39 -15t-30.5 -39t-20.5 -45.5t-13 -42.5z" />
+<glyph unicode="&#x1d484;" horiz-adv-x="477" d="M412 114l18 -8q-92 -116 -224 -116q-86 0 -124 47.5t-38 114.5q0 50 20.5 104t57 100.5t93.5 76t123 29.5q53 0 87.5 -24t34.5 -58q0 -30 -20 -52t-58 -22q-29 0 -40.5 14t-11.5 29q0 20 11.5 32t11.5 21q0 20 -15 20q-49 0 -92 -49.5t-64.5 -110t-21.5 -107.5 q0 -64 28.5 -92t72.5 -28q78 0 151 79z" />
+<glyph unicode="&#x1d485;" horiz-adv-x="595" d="M589 685l-130 -565q-8 -35 -8 -41q0 -24 24 -24q18 0 53 47l19 -11q-16 -40 -59.5 -72.5t-99.5 -32.5q-30 0 -48 21.5t-18 47.5h-5q-67 -69 -141 -69q-65 0 -98.5 34t-33.5 92q0 56 18 115.5t51.5 112t88 86t120.5 33.5q53 0 85 -21l37 152q4 14 4 26q0 22 -17 22 q-12 0 -42 -7l-4 23zM385 346q0 34 -18 53.5t-42 19.5q-59 0 -112.5 -95t-53.5 -202q0 -34 14.5 -50.5t33.5 -16.5q40 0 88.5 56t68.5 127q21 69 21 108z" />
+<glyph unicode="&#x1d486;" horiz-adv-x="498" d="M412 114l19 -7q-46 -57 -97.5 -87t-131.5 -30q-84 0 -121 47.5t-37 110.5q0 34 6 59q30 122 113.5 188.5t172.5 66.5q123 0 123 -84q0 -56 -51.5 -101.5t-116.5 -68t-127 -27.5q-4 -10 -4 -23q0 -59 28.5 -91t73.5 -32q41 0 72.5 17t77.5 62zM358 386q0 20 -7.5 28 t-26.5 8q-48 0 -97 -69t-56 -132q63 9 125 61.5t62 103.5z" />
+<glyph unicode="&#x1d487;" horiz-adv-x="572" d="M249 450h52q17 0 26.5 13t22 48.5t21.5 54.5q23 49 65.5 84t101.5 35q46 0 70 -23t24 -54q0 -28 -15.5 -50t-44.5 -22q-57 0 -57 49q0 20 10 30.5t10 19.5q0 7 -10 7q-22 0 -40.5 -36t-29.5 -91l-13 -65h80l-12 -47h-79l-88 -387q-11 -50 -38 -104q-25 -48 -67 -83 t-100 -35q-46 0 -70 23t-24 54q0 29 15.5 51t44.5 22q30 0 43.5 -15.5t13.5 -37.5q0 -21 -10 -30t-10 -17q0 -7 10 -7q13 0 25 16t22 47t16 55t13.5 62t9.5 45l78 341h-79z" />
+<glyph unicode="&#x1d488;" horiz-adv-x="527" d="M527 435l-14 -60h-77q13 -19 13 -48q0 -60 -40.5 -108t-113.5 -56q-74 -7 -74 -49q0 -17 36 -30t79.5 -22t79.5 -35.5t36 -67.5q0 -60 -59 -111t-170 -51q-100 0 -150.5 35.5t-50.5 82.5q0 39 33 69t86 49q-22 18 -22 51q0 29 22.5 54.5t56.5 32.5q-47 15 -70 47.5 t-23 67.5q0 69 53.5 122.5t138.5 53.5q31 0 58.5 -10t39.5 -21zM334 361q0 61 -32 61q-30 0 -54.5 -46.5t-24.5 -100.5q0 -80 35 -80t55.5 55.5t20.5 110.5zM346 -81q0 34 -23 51.5t-67 26.5q-42 7 -77 17l-17 -13q-14 -11 -26 -33t-12 -43q0 -40 29.5 -66t87.5 -26 q52 0 78.5 24.5t26.5 61.5z" />
+<glyph unicode="&#x1d489;" horiz-adv-x="576" d="M523 105l20 -11q-61 -104 -153 -104q-23 0 -46 12.5t-23 33.5q0 15 7 46l54 223q3 15 3 42q0 37 -29 37q-40 0 -93 -92.5t-73 -182.5l-25 -109h-115l138 599q2 8 2 15q0 9 -2 12t-9 3t-44 -10l-5 28l188 38l-81 -354l2 -1q27 50 78.5 89.5t101.5 39.5q89 0 89 -83 q0 -28 -7 -56l-50 -213q-2 -8 -2 -21q0 -28 20 -28q18 0 54 47z" />
+<glyph unicode="&#x1d48a;" horiz-adv-x="357" d="M300 558q0 -24 -19 -43t-47 -19q-27 0 -46.5 19.5t-19.5 42.5q0 22 19.5 42t46.5 20q28 0 47 -19.5t19 -42.5zM255 104l19 -12q-57 -101 -152 -101q-67 0 -67 56q0 16 4 31l66 285q5 22 5 27q0 18 -20 18q-21 0 -37 -3l-4 23l197 34l-78 -331q-8 -30 -8 -48 q0 -10 6 -17.5t15 -7.5q5 0 10 2t8.5 4.5t9 8t8.5 9t9 11.5t9 11z" />
+<glyph unicode="&#x1d48b;" horiz-adv-x="431" d="M414 558q0 -24 -19 -43t-47 -19q-27 0 -46.5 19.5t-19.5 42.5q0 22 19.5 42t46.5 20q28 0 47 -19.5t19 -42.5zM384 462l-102 -447q-10 -43 -36 -96q-26 -50 -69 -88t-101 -38q-46 0 -70 23t-24 54q0 29 15.5 51t44.5 22q26 0 41.5 -16t15.5 -37q0 -20 -10.5 -30 t-10.5 -15q0 -9 10 -9q37 0 73 160l84 368q3 14 3 25q0 18 -20 18q-21 0 -37 -3l-4 23z" />
+<glyph unicode="&#x1d48c;" horiz-adv-x="580" d="M563 450l-6 -19q-34 -4 -58.5 -14t-38 -20t-35.5 -32l-95 -94l64 -150q25 -57 40 -57q32 0 51 67h25q0 -15 -11.5 -46t-41.5 -63.5t-67 -32.5q-18 0 -30.5 4t-23 15.5t-14.5 16.5t-13.5 24t-10.5 22l-64 124l-24 -22l-39 -173h-116l138 602q2 6 2 16q0 13 -11 13 q-4 0 -44 -9l-5 27l193 37l-97 -423l124 111q7 6 15.5 19.5t8.5 23.5q0 12 -17 12h-30l7 21h224z" />
+<glyph unicode="&#x1d48d;" horiz-adv-x="346" d="M310 685l-132 -574q-4 -15 -4 -31q2 -14 18 -14q24 0 52 37l19 -15q-22 -35 -64.5 -66t-88.5 -31q-25 0 -42.5 12t-17.5 34t6 47l118 515q2 12 2 16q0 15 -11 15q-10 0 -44 -10l-5 28z" />
+<glyph unicode="&#x1d48e;" horiz-adv-x="760" d="M708 106l19 -15q-58 -100 -157 -100q-22 0 -41 13t-20 35q0 17 11 66l46 202q9 42 9 60q0 22 -16 22q-25 0 -81 -98t-67 -151l-29 -140h-119l73 307q8 36 8 60q-2 21 -18 21q-25 0 -78 -96.5t-66 -151.5l-32 -140h-117l89 388q0 26 -12 26q-9 0 -45 -9l-5 28l197 34 l-27 -111h2q77 106 153 106q37 0 56.5 -26t20.5 -59q0 -9 -2 -19q28 33 45 50.5t48.5 35.5t62.5 18q37 0 56 -21.5t19 -55.5q0 -33 -8 -68l-41 -186q-8 -37 -8 -46q0 -24 23 -24q21 0 51 45z" />
+<glyph unicode="&#x1d48f;" horiz-adv-x="559" d="M506 105l20 -11q-61 -104 -153 -104q-68 0 -68 58q0 10 6 34l54 223q3 15 3 47q0 35 -29 35q-40 0 -93 -94t-73 -184l-25 -109h-115l88 384q2 8 2 15q0 9 -2 12t-9 3q-14 0 -47 -9l-5 28l195 34l-27 -111h4q25 47 71.5 76.5t98.5 29.5q89 0 89 -81q0 -33 -7 -61l-50 -213 q-3 -18 -3 -22q0 -27 21 -27q18 0 54 47z" />
+<glyph unicode="&#x1d490;" horiz-adv-x="561" d="M539 297q0 -136 -90.5 -221.5t-217.5 -85.5q-88 0 -137.5 48.5t-49.5 131.5q0 126 87.5 209t207.5 83q91 0 145.5 -43t54.5 -122zM423 300q0 64 -25 93t-64 29q-64 0 -119 -88t-55 -176q0 -71 21 -99.5t67 -28.5q68 0 121.5 86t53.5 184z" />
+<glyph unicode="&#x1d491;" horiz-adv-x="571" d="M294 429h5q36 33 91 33q68 0 116 -41t48 -130q0 -121 -85.5 -212t-187.5 -91q-59 0 -88 19l-25 -105q-4 -16 -4 -32q0 -54 41 -54h36l-7 -21h-267l7 21q38 5 52.5 26t24.5 63l103 440q5 25 5 39q0 32 -23 32q-10 0 -25 -4l-6 17l198 40zM244 241l-33 -154q1 -31 20 -45 t47 -14q55 0 108.5 85.5t53.5 175.5q0 67 -19.5 95t-57.5 28t-71 -50.5t-48 -120.5z" />
+<glyph unicode="&#x1d492;" horiz-adv-x="526" d="M532 450l-129 -562q-5 -18 -5 -27q1 -45 32 -45h34l-6 -21h-288l6 21h36q35 0 50.5 19t23.5 53l38 168h-1q-27 -37 -72 -51.5t-81 -14.5q-58 0 -92 40t-34 96q0 78 32.5 154t98 129t147.5 53q65 0 85 -50h4l10 38h111zM388 346q0 37 -18.5 57t-42.5 20q-66 0 -117.5 -97 t-51.5 -209q0 -70 53 -70q55 0 116 94.5t61 204.5z" />
+<glyph unicode="&#x1d493;" horiz-adv-x="441" d="M257 467l-20 -91q57 86 125 86q29 0 45.5 -16.5t16.5 -38.5q0 -31 -21 -58.5t-60 -27.5q-18 0 -26.5 9.5t-12.5 19t-10 9.5q-27 0 -70.5 -112.5t-56.5 -166.5l-20 -80h-114l88 380q0 2 1.5 10t1.5 11q0 15 -16 15q-11 0 -41 -11l-3 28z" />
+<glyph unicode="&#x1d494;" horiz-adv-x="474" d="M419 462l-22 -160h-22q-1 52 -29 87.5t-59 35.5q-46 0 -46 -55q0 -8 3 -17t11.5 -21t14.5 -18l20 -24l19 -22q4 -4 15 -17.5t14.5 -17.5t12.5 -15.5t11.5 -17.5t8.5 -17t7 -19l4 -20q2 -12 2 -25q0 -53 -42 -91t-113 -38q-34 0 -67.5 10.5t-42.5 10.5q-17 0 -39 -22h-25 l22 165h24q1 -51 35 -89.5t71 -38.5q32 0 47.5 23t15.5 57q0 11 -2.5 21t-9 20t-10.5 15.5t-13.5 16t-11.5 12.5q-3 4 -15 17.5t-16 19.5l-15 18l-15 20l-12 18q-7 12 -10 21t-5.5 19.5t-2.5 20.5q0 56 39.5 86.5t90.5 30.5q33 0 61 -11t32 -11q29 0 39 22h25z" />
+<glyph unicode="&#x1d495;" horiz-adv-x="351" d="M318 460l-12 -47h-67l-69 -302q-3 -15 -3 -19q0 -32 20 -32q23 0 54 44l20 -10q-24 -45 -64.5 -74.5t-86.5 -29.5q-66 0 -66 61q0 18 4 33l76 329h-74l8 47q43 0 70.5 7t45.5 27.5t26.5 38t24.5 59.5h54l-29 -132h68z" />
+<glyph unicode="&#x1d496;" horiz-adv-x="535" d="M482 104l20 -10q-59 -104 -155 -104q-23 0 -44.5 12.5t-22.5 34.5q0 38 17 82h-3q-80 -129 -182 -129q-79 0 -79 82q0 27 7 57l54 238q3 17 3 25q0 21 -13 21q-9 0 -44 -7l-3 24l194 33l-79 -344q-6 -18 -6 -32q0 -22 21 -22q36 0 104 104.5t86 190.5l19 90h113l-78 -338 q-2 -10 -2 -19q0 -35 19 -35q20 0 54 46z" />
+<glyph unicode="&#x1d497;" horiz-adv-x="554" d="M60 412v24q79 3 229 37q-7 -22 -18 -63.5t-16 -57.5q-1 -2 -21.5 -69t-30.5 -108t-10 -66q0 -42 50 -42q46 0 115 77.5t83 129.5q5 18 5 34q0 25 -23.5 50.5t-23.5 54.5q0 24 19.5 42t43.5 18q31 0 54 -23t23 -54q0 -38 -38 -109q-40 -75 -99 -145t-124 -113 q-64 -43 -130 -43q-41 0 -68.5 20t-27.5 59t9.5 83.5t30.5 115.5l25 82q7 30 7 39q0 27 -64 27z" />
+<glyph unicode="&#x1d498;" horiz-adv-x="814" d="M565 461l-76 -278q-20 -71 -20 -87q0 -29 34 -29q37 0 81.5 43t77.5 91q44 61 44 105q0 29 -23.5 53t-23.5 54q0 24 19.5 42t43.5 18q32 0 54.5 -22.5t22.5 -54.5q0 -40 -38 -109q-40 -74 -100.5 -145.5t-123.5 -113.5t-129 -42q-42 0 -58 20t-16 63q0 19 24 91 q-98 -174 -214 -174q-41 0 -66.5 20.5t-25.5 60.5q0 49 17 110l37 133q18 63 18 76q0 26 -49 26h-15v24q112 7 230 37l-91 -312q-14 -51 -14 -68q0 -29 24 -29q30 0 64 38t54.5 75t35.5 73q26 61 64 211h138z" />
+<glyph unicode="&#x1d499;" horiz-adv-x="587" d="M327 334l22 34q61 94 122 94q33 0 52.5 -15.5t19.5 -34.5q0 -66 -62 -66q-17 0 -26 17t-14 17q-10 0 -16.5 -7.5t-21.5 -32.5l-47 -79l49 -138q1 -4 4 -13t5 -14.5t5.5 -12.5t8 -10.5t10.5 -3.5q16 0 28.5 12.5t26.5 55.5h24q-38 -145 -119 -145q-21 0 -37 7t-26.5 20.5 t-16 24.5t-12.5 29l-29 75l-36 -62q-56 -94 -130 -94q-36 0 -57 17.5t-21 42.5t15.5 41.5t44.5 16.5q20 0 28.5 -11t11 -22.5t9.5 -11.5q8 0 17 11.5t32 47.5l61 97l-33 91q-17 47 -35 69t-45 22q-14 0 -52 -15l-8 24l153 50q65 -38 89 -109z" />
+<glyph unicode="&#x1d49a;" horiz-adv-x="519" d="M330 128h1q30 44 61 102q46 85 46 107q0 10 -7 15.5t-16 9t-16 15t-7 31.5q0 16 18.5 35t41.5 19q70 0 70 -75q0 -51 -72.5 -186t-123.5 -211l-52 -76q-16 -23 -46.5 -57.5t-57.5 -48t-57 -13.5q-38 0 -57 18t-20 40q-1 25 12 45.5t48 20.5q18 0 28.5 -12.5t15 -24.5 t10.5 -12q10 0 41 41.5t45 76.5l-53 317q-4 26 -6.5 37.5t-8.5 31.5t-14.5 28.5t-20.5 8.5q-8 0 -51 -8l-4 24l170 33q18 -15 34 -58.5t22 -83.5z" />
+<glyph unicode="&#x1d49b;" horiz-adv-x="531" d="M499 451l-318 -336l1 -1q17 4 39 4q33 0 62.5 -27t49.5 -53.5t32 -26.5q18 0 18 19q0 7 -10 22.5t-10 29.5q0 24 16.5 41.5t40.5 17.5q25 0 43 -18t18 -43q0 -52 -39 -75.5t-96 -23.5q-34 0 -100 12t-100 12q-46 0 -93 -19l-18 25l321 340h-165q-35 0 -49 -9.5t-25 -41.5 l-24 3l46 158h360v-10z" />
+<glyph unicode="&#x1d49c;" horiz-adv-x="855" d="M837 672l9 -14q-103 -202 -265 -589q60 12 103 34l9 -16q-42 -31 -124 -45l-17 -42h-97l18 39q-90 6 -162 40q-92 -94 -173 -94q-48 0 -77.5 26t-29.5 66q0 32 18 52t44 20q21 0 35.5 -14t14.5 -34q0 -18 -11.5 -33t-31.5 -15q-22 0 -29 12h-2q0 -17 18 -33.5t47 -16.5 q41 0 74 17.5t76 59.5q-122 69 -122 207q0 83 57 132t130 49q102 0 161 -82q43 62 75.5 104.5t73 85.5t79 64.5t75.5 21.5q16 0 24 -2zM772 638h-1q-56 -20 -112.5 -86t-132.5 -181q31 -61 33 -144q129 283 213 411zM536 199q0 84 -29 145q-112 -172 -172 -239 q67 -32 151 -38l49 109q1 8 1 23zM492 372q-50 75 -143 75q-57 0 -101.5 -42t-44.5 -104q0 -118 107 -182q63 69 182 253z" />
+<glyph unicode="&#x1d49e;" horiz-adv-x="797" d="M449 645l-12 -19q-55 31 -136 31q-53 0 -102.5 -16.5t-85 -53.5t-35.5 -86q0 -62 43 -97.5t108 -42.5q81 125 216.5 216.5t239.5 91.5q46 0 71 -19.5t25 -55.5q0 -60 -66.5 -123t-177 -105t-225.5 -42q-69 -100 -69 -199q0 -49 31 -79.5t86 -30.5q80 0 141 50t61 108 q0 37 -20.5 55.5t-50.5 18.5q-54 0 -102.5 -53t-55.5 -131l-22 2q0 91 58.5 158t138.5 67q55 0 86.5 -26.5t31.5 -76.5q0 -41 -27 -80t-69 -68q-78 -54 -174 -54q-85 0 -141 46.5t-56 126.5q0 81 48 171q-71 12 -120.5 55t-49.5 115q0 75 71.5 131.5t184.5 56.5 q91 0 156 -42zM331 355l1 -1q123 0 244 62q73 37 118.5 85t45.5 91q0 40 -50 40q-72 0 -173.5 -79t-185.5 -198z" />
+<glyph unicode="&#x1d49f;" horiz-adv-x="885" d="M810 587l8 -20q-27 -12 -37.5 -20t-33.5 -33q57 -89 57 -190q0 -140 -98.5 -239.5t-223.5 -99.5q-70 0 -156 33q-75 -27 -161 -27q-61 0 -95 17t-34 46q0 25 30 40t77 15q71 0 170 -52q82 50 203 246q83 135 179 216q-44 61 -121 98.5t-159 37.5q-144 0 -224.5 -64 t-80.5 -169q0 -60 46 -102.5t118 -42.5q96 0 155.5 64.5t60.5 196.5h19q2 -15 2 -43q0 -63 -23 -113t-59.5 -78t-76 -42.5t-76.5 -14.5q-89 0 -148 50.5t-59 132.5q0 110 97.5 183.5t241.5 73.5q96 0 179.5 -39t137.5 -105q39 28 85 44zM756 336q0 76 -37 144 q-41 -55 -103 -178q-75 -151 -196 -234q-33 -22 -53 -32q58 -20 111 -20q114 0 196 87.5t82 232.5zM276 39q-75 40 -132 40q-67 0 -67 -25q0 -33 87 -33q66 0 112 18z" />
+<glyph unicode="&#x1d4a2;" horiz-adv-x="773" d="M417 653l-9 -18q-49 22 -111 22q-76 0 -124.5 -34t-48.5 -82q0 -44 37 -74t102 -39q69 109 177 175t197 66q44 0 73.5 -20.5t29.5 -55.5q0 -50 -57.5 -97.5t-150 -76.5t-189.5 -29q-41 -60 -41 -128q0 -29 17 -48t49 -19q54 0 117.5 35.5t151.5 115.5l15 -16 q-34 -34 -66 -121q-82 -224 -330 -224q-72 0 -120.5 33.5t-48.5 76.5q0 30 16.5 49.5t42.5 19.5q20 0 35.5 -14t15.5 -33q0 -21 -12 -36t-32 -15q-21 0 -29 13h-2q5 -24 41.5 -43.5t82.5 -19.5q87 0 145.5 48t108.5 144l-1 1q-66 -44 -138 -44q-60 0 -98.5 34.5t-38.5 92.5 q0 55 26 106q-78 13 -122.5 49.5t-44.5 93.5q0 61 59 103.5t148 42.5q70 0 127 -34zM699 590q0 20 -16 31t-41 11q-65 0 -149 -63.5t-132 -148.5q83 0 162.5 26t127.5 65.5t48 78.5z" />
+<glyph unicode="&#x1d4a5;" horiz-adv-x="802" d="M552 193l15 -16q-71 -63 -151 -92q-53 -102 -145 -182t-184 -80q-36 0 -57 18t-21 47q0 75 125 134q35 16 190 64q20 39 53.5 125t49.5 120q-55 11 -88 44.5t-33 88.5q0 49 25.5 88.5t66.5 62t86.5 34t90.5 11.5t127 -6q36 20 66 20q9 0 16.5 -5.5t7.5 -14.5 q0 -48 -104 -48q-66 -47 -152 -240q77 18 131 101l16 -11q-53 -103 -162 -124l-87 -208q68 26 118 69zM639 605v1q-26 2 -43 2q-82 0 -130 -17q-49 -18 -84 -54t-35 -83q0 -38 28.5 -64t67.5 -27q81 159 196 242zM302 43q-17 -6 -55.5 -17.5t-63 -20t-44.5 -18.5 q-88 -43 -88 -97q0 -15 10 -26t26 -11q61 0 112.5 49t102.5 141z" />
+<glyph unicode="&#x1d4a6;" horiz-adv-x="1009" d="M771 669l13 -16q-26 -20 -49.5 -44t-40 -43.5t-37 -51t-30.5 -48.5l-31 -54l-29 -52q27 0 42 -14q32 7 60 33.5t72 91.5q76 111 125.5 163.5t86.5 52.5q22 0 36.5 -10.5t14.5 -30.5t-11 -32.5t-31 -12.5q-16 0 -30 11.5t-15 33.5h-1q-8 -7 -18.5 -26t-24.5 -49.5 t-24 -48.5q-49 -89 -97.5 -133.5t-113.5 -65.5v-2q48 -48 48 -89q0 -37 -38 -100t-38 -80q0 -34 32 -34q57 0 169 129l19 -15q-117 -144 -202 -144q-37 0 -65 23.5t-28 58.5q0 41 42.5 108t42.5 97q0 31 -40 31q-26 0 -34 15q-46 -101 -93 -169.5t-93 -103.5t-87.5 -49 t-89.5 -14q-63 0 -103 32t-40 74q0 30 17 52t46 22q20 0 33.5 -14t13.5 -36q0 -20 -12 -34.5t-32 -14.5q-21 0 -29 13h-2q3 -25 33 -44t73 -19q60 0 105 44t105 150l44 80q31 57 43.5 78t38.5 59t53 66t63 57l-1 3q-15 -5 -36 -5q-44 0 -124 44q-63 34 -102 34 q-48 0 -83 -30.5t-35 -70.5t27 -67t73 -27q77 0 131 86l18 -9q-54 -107 -151 -107q-60 0 -99.5 35.5t-39.5 90.5q0 59 51 105t126 46q29 0 58 -10.5t84 -38.5q60 -31 86 -31q34 0 76.5 19t78.5 52z" />
+<glyph unicode="&#x1d4a9;" horiz-adv-x="970" d="M569 131h1q35 54 122 263q82 196 138 256q34 37 74 37q23 0 37.5 -12.5t14.5 -33.5t-12.5 -33.5t-30.5 -12.5q-16 0 -31.5 11.5t-15.5 33.5h-3q-48 -25 -151 -277q-36 -89 -61.5 -145.5t-68.5 -125.5t-86 -105h-20q26 104 32 310q5 188 27 265l-1 1q-60 -81 -143 -248 q-91 -182 -150 -256t-123 -74q-34 0 -57 22.5t-23 54.5q0 29 17 47.5t42 18.5q22 0 37 -15.5t15 -35.5q0 -18 -11.5 -31.5t-30.5 -13.5q-9 0 -16 4h-3q1 -10 10.5 -16t20.5 -6q53 0 108.5 74t129.5 224q157 318 252 357l13 -11q-14 -48 -26 -267q-8 -165 -27 -260z" />
+<glyph unicode="&#x1d4aa;" horiz-adv-x="692" d="M663 549l-20 -2q-31 98 -126 98q-81 0 -170.5 -85.5t-147 -202.5t-57.5 -207q0 -58 29 -96.5t85 -38.5q113 0 213 103q42 44 79.5 118t37.5 160q0 52 -27.5 81t-64.5 29q-51 0 -89.5 -43t-38.5 -116q0 -53 27 -105l-22 -10q-35 57 -35 130q0 77 48.5 128.5t112.5 51.5 q55 0 97.5 -36.5t42.5 -109.5q0 -72 -30.5 -145.5t-80.5 -132.5t-121 -96t-147 -37q-83 0 -129.5 58.5t-46.5 144.5q0 126 59.5 240t161.5 183t218 69q64 0 103 -38t39 -93z" />
+<glyph unicode="&#x1d4ab;" horiz-adv-x="910" d="M856 669l7 -19q-34 -14 -66 -38q89 -67 89 -165q0 -68 -43.5 -121.5t-105.5 -53.5q-35 0 -53.5 19t-18.5 47q0 22 16 43.5t42 35.5l10 -18q-36 -21 -36 -54q0 -13 9 -21t25 -8q41 0 67.5 43t26.5 106q0 75 -55 123q-24 -23 -45.5 -57t-35.5 -62l-39 -81l-40 -86 q-84 -169 -181 -243t-218 -74q-77 0 -125 36t-48 87q0 31 17 51t42 20q22 0 36.5 -13.5t14.5 -34.5q0 -20 -11.5 -34t-31.5 -14q-23 0 -30 12h-2q0 -28 35 -53.5t85 -25.5q94 0 156 52.5t146 202.5l64 113q21 36 54 86t63.5 81.5t65.5 57.5q-76 48 -192 48q-149 0 -250 -75 t-101 -174q0 -41 30 -68.5t73 -27.5q158 0 205 249h20q-8 -113 -67 -196t-160 -83q-63 0 -102.5 35.5t-39.5 94.5q0 107 111 191t282 84q125 0 221 -59q36 23 84 41z" />
+<glyph unicode="&#x1d4ac;" horiz-adv-x="692" d="M663 549l-20 -2q-31 98 -126 98q-81 0 -170.5 -85.5t-147 -202.5t-57.5 -207q0 -58 29 -96.5t85 -38.5q71 0 134 38q-27 43 -60 43q-38 0 -76 -29l-13 17q62 58 108 58q53 0 86 -56q28 25 34 32q42 44 79.5 118t37.5 160q0 52 -27.5 81t-64.5 29q-51 0 -89.5 -43 t-38.5 -116q0 -53 27 -105l-22 -10q-35 57 -35 130q0 77 48.5 128.5t112.5 51.5q55 0 97.5 -36.5t42.5 -109.5q0 -95 -50.5 -190t-132.5 -154q26 -42 62 -42q53 0 102 48l15 -14q-68 -82 -133 -82q-33 0 -53 16t-39 45q-73 -38 -150 -38q-83 0 -129.5 58.5t-46.5 144.5 q0 126 59.5 240t161.5 183t218 69q63 0 102.5 -38t39.5 -93z" />
+<glyph unicode="&#x1d4ae;" horiz-adv-x="743" d="M397 143l-20 -4q-21 71 -54 94t-82 23q-40 0 -76 -33.5t-36 -85.5t41.5 -87t101.5 -35q76 0 134.5 47t58.5 129q0 29 -16 56.5t-39 50.5l-47 48q-23 24 -39 57t-16 69q0 67 42 116.5t97.5 70.5t113.5 21q56 0 98 -29t42 -87q0 -53 -44.5 -91t-97.5 -38v21q48 5 78.5 33 t30.5 74q0 42 -31.5 61.5t-76.5 19.5q-63 0 -119 -44.5t-56 -108.5q0 -30 16.5 -58.5t40.5 -52.5l48 -49q24 -25 40.5 -58t16.5 -69q0 -99 -82 -159t-201 -60q-81 0 -139 39t-58 118q0 71 50.5 114t116.5 43q61 0 107.5 -39.5t55.5 -116.5z" />
+<glyph unicode="&#x1d4af;" horiz-adv-x="912" d="M896 675l11 -18q-89 -73 -176 -73q-57 0 -181 28.5t-168 28.5q-92 0 -152.5 -47.5t-60.5 -113.5q0 -57 34 -89t83 -32q71 0 116.5 46.5t73.5 135.5h20q-20 -101 -76 -156.5t-141 -55.5q-64 0 -107.5 39.5t-43.5 104.5q0 96 87.5 155t223.5 59q56 0 175.5 -26.5 t168.5 -26.5q51 0 113 41zM658 553l13 -14q-38 -37 -63.5 -92t-50.5 -143q-23 -81 -69.5 -149.5t-109.5 -109.5q-90 -60 -187 -60q-61 0 -104.5 30.5t-43.5 75.5q0 35 17 54.5t44 19.5q20 0 34.5 -14.5t14.5 -34.5t-12.5 -34.5t-32.5 -14.5q-21 0 -28 12h-2q3 -27 31.5 -45 t74.5 -18q83 0 142.5 57t127.5 204q48 103 93 161.5t111 114.5z" />
+<glyph unicode="&#x1d4b0;" horiz-adv-x="842" d="M805 658l-296 -550q-17 -32 -17 -55q0 -35 33 -35q56 0 168 129l21 -13q-120 -146 -203 -146q-37 0 -61.5 21.5t-24.5 56.5q0 33 17 71l-3 1q-53 -72 -107.5 -112.5t-97.5 -40.5q-36 0 -58.5 24t-22.5 64q0 57 70 167l145 227q36 56 36 101q0 36 -38 60t-83 24 q-84 0 -145 -49.5t-61 -128.5q0 -37 19.5 -60.5t53.5 -23.5q98 0 139 119h20q-12 -56 -55 -102.5t-103 -46.5q-51 0 -83 31.5t-32 82.5q0 90 78.5 151.5t177.5 61.5q73 0 126 -38.5t53 -107.5q0 -66 -38 -124l-186 -287q-39 -61 -39 -87q0 -28 29 -28q39 0 93.5 47.5 t106 117.5t90 130t62.5 105l130 243h86z" />
+<glyph unicode="&#x1d4b1;" horiz-adv-x="932" d="M214 21l2 -2q54 11 102.5 41t98 83t91 109.5t99.5 144.5q52 80 82 122t66 86.5t63.5 63t53.5 18.5q21 0 35.5 -13t14.5 -34q0 -18 -12.5 -30.5t-30.5 -12.5q-20 0 -32 13t-12 36h-1q-52 -30 -200 -261q-146 -228 -249 -308q-117 -92 -204 -92q-14 0 -47 6q41 38 68.5 89 t78.5 182q35 88 79 152t114 131l-3 3q-15 -5 -36 -5q-52 0 -131 41.5t-110 41.5q-48 0 -83 -30.5t-35 -70.5t27.5 -67t72.5 -27q77 0 131 86l16 -9q-54 -107 -149 -107q-60 0 -99.5 35.5t-39.5 90.5q0 57 55.5 104t127.5 47q28 0 52.5 -9.5t83.5 -39.5q60 -31 86 -31 q65 0 124 49l27 22l15 -15q-72 -77 -108.5 -141.5t-76.5 -165.5q-88 -219 -207 -326z" />
+<glyph unicode="&#x1d4b2;" horiz-adv-x="1078" d="M455 24l2 -2q68 27 130 99.5t137 201.5q126 219 183.5 291.5t112.5 72.5q21 0 35.5 -12.5t14.5 -34.5q0 -18 -12.5 -30.5t-30.5 -12.5q-43 0 -43 50h-1q-27 -8 -80 -87.5t-166 -273.5q-175 -301 -319 -301q-33 0 -46 4q85 80 141 233q44 122 99.5 214t137.5 179l-1 1 q-97 -17 -262 -312q-177 -319 -326 -319q-19 0 -47 6q31 26 59 72t44.5 85t43.5 111q56 150 192 287l-2 2q-15 -5 -36 -5q-49 0 -125 41.5t-106 41.5q-47 0 -77.5 -30t-30.5 -71t24 -67.5t66 -26.5q38 0 66 21.5t55 64.5l16 -9q-54 -107 -139 -107q-56 0 -92.5 35.5 t-36.5 90.5q0 59 46.5 105t116.5 46q49 0 146 -49q7 -4 19 -10t17 -9t13 -6t14.5 -4.5t12.5 -1.5q65 0 124 49l27 22l15 -16q-117 -115 -196 -321q-79 -205 -196 -310l2 -3q50 18 104 74t88 108.5t75 125.5q183 324 309 324q18 0 51 -11q-21 -15 -39 -36t-38 -60l-30 -57 q-9 -19 -34.5 -78.5t-31.5 -74.5q-91 -206 -195 -310z" />
+<glyph unicode="&#x1d4b3;" horiz-adv-x="891" d="M571 489h2q112 198 226 198q33 0 53.5 -15.5t20.5 -47.5q0 -26 -16 -41t-38 -15q-21 0 -35.5 12t-14.5 34q0 23 17 40q-53 0 -119.5 -88.5t-134.5 -242.5q-67 -151 -67 -228q0 -65 50 -65q27 0 63 29t93 95l20 -15q-62 -80 -105.5 -116.5t-99.5 -36.5q-48 0 -74.5 25.5 t-26.5 74.5q0 32 9 55h-2q-54 -77 -111.5 -116.5t-130.5 -39.5q-53 0 -83.5 32.5t-30.5 73.5q0 30 16 51t42 21q20 0 35.5 -14t15.5 -33q0 -21 -13.5 -37t-33.5 -16q-15 0 -25 6q24 -54 94 -54q55 0 118 65.5t122 168.5q88 155 88 257q0 148 -124 148q-68 0 -114.5 -44 t-46.5 -113q0 -42 22.5 -68.5t64.5 -26.5q88 0 126 106l19 -5q-17 -61 -56.5 -96t-91.5 -35q-57 0 -91 34t-34 92q0 80 59.5 134.5t145.5 54.5q89 0 143 -56.5t54 -141.5z" />
+<glyph unicode="&#x1d4b4;" horiz-adv-x="926" d="M825 658h91q-242 -324 -370 -581q75 28 137 80l15 -15q-31 -28 -63 -49t-49.5 -30t-54.5 -25q-53 -102 -144 -183t-183 -81q-36 0 -58.5 18t-22.5 47t16.5 54.5t38.5 42t61 34t65 26.5l72 22l62 18q73 144 103 196l-3 4q-51 -71 -108 -112.5t-100 -41.5q-39 0 -62 24.5 t-23 68.5q0 36 23.5 79t83.5 121q71 91 92.5 129t21.5 65q0 33 -39.5 58t-86.5 25q-91 0 -149.5 -45t-58.5 -122q0 -32 22.5 -53.5t56.5 -21.5q103 0 149 125h20q-21 -78 -68.5 -116.5t-106.5 -38.5q-48 0 -81 30.5t-33 76.5q0 87 77.5 143.5t178.5 56.5q75 0 127 -41.5 t52 -104.5q0 -45 -29 -95.5t-111 -153.5q-86 -108 -86 -151q0 -12 7.5 -20.5t21.5 -8.5q51 0 126 71t187 224zM419 -2q-50 -16 -70 -23t-58 -21.5t-54 -24t-36.5 -24.5t-28 -30.5t-7.5 -33.5q0 -15 11.5 -26t27.5 -11q60 0 112 50t103 144z" />
+<glyph unicode="&#x1d4b5;" horiz-adv-x="932" d="M407 519l18 -8q-25 -48 -56.5 -73t-81.5 -25q-51 0 -89.5 32t-38.5 83q0 59 52 109t145 50q50 0 108.5 -13t93.5 -26t92 -36q72 46 150 46q57 0 84.5 -17t27.5 -43q0 -24 -33 -41t-83 -17q-55 0 -133 26q-56 -64 -116 -236q5 -1 11 -1q60 2 93 27l14 -17 q-55 -59 -118 -59q-14 0 -18 1q-54 -143 -158 -221q106 -36 157 -36q79 0 132 36.5t72 102.5l20 -1q-14 -85 -71.5 -131t-150.5 -46q-36 0 -75.5 10.5t-121.5 38.5q-75 -43 -162 -43q-112 0 -112 60q0 24 33 41t83 17q45 0 142 -31q59 56 120 215q-4 1 -12 1q-53 0 -95 -32 l-17 16q60 65 126 65q11 0 17 -1q68 165 157 241q-57 22 -87.5 32t-85.5 21.5t-105 11.5q-64 0 -99.5 -39.5t-35.5 -80.5q0 -40 25.5 -62.5t61.5 -22.5q42 0 68.5 17.5t51.5 58.5zM871 598q0 30 -71 30q-62 0 -106 -33q68 -25 112 -25q27 0 46 8.5t19 19.5zM283 51 q-76 28 -118 28q-27 0 -46 -8.5t-19 -19.5q0 -30 71 -30q65 0 112 30z" />
+<glyph unicode="&#x1d4b6;" horiz-adv-x="819" d="M737 194l21 -17q-141 -185 -247 -185q-37 0 -56.5 24t-19.5 61q0 19 4 32l-1 1q-110 -121 -197 -121q-44 0 -68 29.5t-24 79.5q0 45 22 95q-35 -20 -71 -20q-39 0 -70 17l10 26q31 -13 57 -13q62 0 129 79v-1q56 70 130.5 115t141.5 45q91 0 118 -71l-21 -10 q-28 51 -84 51q-73 0 -143 -70q-65 -66 -113 -150t-48 -127q0 -45 39 -45q49 0 98.5 40t104.5 105q9 52 38.5 102.5t71.5 50.5q27 0 27 -28q0 -44 -110 -146q-11 -39 -11 -63q0 -58 55 -58q31 0 87.5 40.5t129.5 131.5z" />
+<glyph unicode="&#x1d4b7;" horiz-adv-x="580" d="M127 493l20 22q32 -38 85 -47q66 92 136 155.5t130 63.5q29 0 45 -15.5t16 -39.5q0 -75 -77.5 -137.5t-190.5 -62.5q-63 -94 -124.5 -206t-61.5 -164q0 -44 36 -44q58 0 121.5 54.5t124.5 153.5q-10 29 -10 56q0 57 28 97t58 40q9 0 16.5 -8.5t7.5 -20.5q0 -67 -55 -158 q19 -32 63 -32q18 0 30 5l7 -26q-16 -9 -38 -9q-51 0 -84 32h-1q-66 -104 -136 -159t-133 -55q-41 0 -67 25.5t-26 67.5q0 64 49.5 168t116.5 192q-55 14 -86 52zM529 624q0 31 -35 31q-31 0 -73.5 -47t-109.5 -146q87 0 152.5 52.5t65.5 109.5z" />
+<glyph unicode="&#x1d4b8;" horiz-adv-x="662" d="M567 225l22 -17q-89 -110 -173.5 -164.5t-154.5 -54.5q-47 0 -75 31.5t-28 85.5q0 46 18 91q-30 -24 -76 -24q-39 0 -70 17l10 26q31 -13 57 -13q61 0 120 69q52 73 128 121t142 48q88 0 88 -79q0 -26 -18 -45.5t-43 -19.5q-40 0 -40 33q0 15 9.5 24t21.5 11.5t21.5 8.5 t9.5 16q0 21 -34 21q-55 0 -124.5 -65t-115.5 -145.5t-46 -126.5q0 -26 15 -40.5t39 -14.5q52 0 131.5 50.5t165.5 155.5z" />
+<glyph unicode="&#x1d4b9;" horiz-adv-x="845" d="M827 687l-321 -590q-14 -25 -14 -48q0 -27 28 -27q71 0 212 172l23 -17q-75 -95 -132.5 -140t-109.5 -45q-37 0 -55 20t-18 51q0 23 9 47h-2q-59 -61 -107.5 -91t-101.5 -30q-43 0 -67 28t-24 77q0 46 24 99q-31 -20 -71 -20q-39 0 -70 17l10 26q31 -13 57 -13 q62 0 129 79v-1q56 70 130 115t140 45q36 0 57 -19.5t21 -58.5h2l172 324h79zM544 365q0 41 -48 41q-41 0 -97.5 -42t-106.5 -115q-87 -125 -87 -189q0 -41 41 -41q64 -1 143 73q64 60 109.5 139t45.5 134z" />
+<glyph unicode="&#x1d4bb;" d="M27 -209l194 374q-13 25 -13 58q0 87 117 147l41 80l38 66q22 41 36.5 61t35.5 45t39 36.5t39.5 20t44.5 8.5q35 0 54.5 -21.5t19.5 -48.5q0 -145 -271 -252l-115 -221q33 -18 81 -18q69 0 129 54l17 -23q-73 -61 -153 -61q-51 0 -89 19l-166 -324h-79zM643 606 q0 49 -42 49q-18 0 -36.5 -12.5t-35 -36.5t-26 -40t-22.5 -41l-62 -120q87 33 155.5 87t68.5 114z" />
+<glyph unicode="&#x1d4bd;" horiz-adv-x="753" d="M669 195l21 -17q-160 -189 -264 -189q-32 0 -51 18.5t-19 53.5q0 60 46 128l106 157q17 26 17 39q0 26 -25 26q-68 0 -171.5 -101t-185.5 -257l-28 -53h-77l237 440q-80 14 -126 69l20 21q46 -54 122 -61q69 123 115.5 170.5t103.5 47.5q31 0 47 -20t16 -45 q0 -42 -26 -78.5t-63.5 -58.5t-75.5 -34.5t-66 -12.5l-78 -153l3 -2q134 158 237 158q33 0 53 -16.5t20 -45.5q0 -48 -42 -115l-103 -164q-24 -39 -24 -60t23 -21q88 0 238 176zM359 472l1 -2q54 0 118.5 44.5t64.5 105.5q0 15 -9.5 25t-26.5 10q-30 0 -63 -40t-85 -143z " />
+<glyph unicode="&#x1d4be;" horiz-adv-x="496" d="M484 608q0 -20 -15 -35t-36 -15q-19 0 -32.5 13t-13.5 30q0 20 16.5 36t38.5 16q15 0 28.5 -14t13.5 -31zM417 188l21 -17q-78 -95 -131.5 -138.5t-98.5 -43.5q-36 0 -58 21.5t-22 60.5q0 63 57 165l60 109q-37 -30 -89 -30q-42 0 -73 17l10 26q31 -13 60 -13 q69 0 136 79h73l-160 -295q-22 -40 -22 -78q0 -14 9 -23t24 -9q35 0 80 39t124 130z" />
+<glyph unicode="&#x1d4bf;" horiz-adv-x="730" d="M718 608q0 -20 -15 -35t-36 -15q-19 0 -32.5 13t-13.5 30q0 20 16.5 36t38.5 16q15 0 28.5 -14t13.5 -31zM596 424l-264 -499q42 -22 85 -22q59 0 100 30l12 -26q-54 -34 -117 -34q-52 0 -100 22q-43 -63 -92.5 -88.5t-112.5 -25.5q-47 0 -72.5 21.5t-25.5 49.5 q0 48 54 80q42 26 115 26q58 0 91 -13l209 394q-44 -43 -114 -43q-42 0 -68 16l10 26q26 -12 60 -12q44 0 81 27t76 71h73zM254 -86l-1 1q-29 13 -84 13q-57 0 -91.5 -20t-34.5 -52q0 -18 15.5 -29.5t40.5 -11.5q93 0 155 99z" />
+<glyph unicode="&#x1d4c0;" horiz-adv-x="726" d="M643 187l23 -17q-75 -93 -133 -137t-109 -44q-35 0 -59.5 16t-24.5 47t21.5 67t21.5 53q0 18 -15 32.5t-46 14.5l11 30q76 4 142.5 45t66.5 83q0 34 -33 34q-65 0 -176 -103t-189 -255l-27 -53h-77l237 440q-80 14 -126 69l20 21q46 -54 122 -61q69 123 115.5 170.5 t103.5 47.5q31 0 47 -20t16 -45q0 -43 -26 -79.5t-63.5 -58t-75.5 -34t-66 -12.5l-88 -168l2 -1q149 172 268 172q30 0 49 -18t19 -43q0 -48 -65 -92.5t-147 -54.5l-1 -3q54 -32 54 -82q0 -28 -16.5 -59t-16.5 -43q0 -27 31 -27q33 0 86.5 40.5t123.5 127.5zM361 472l1 -2 q54 0 118.5 44.5t64.5 105.5q0 15 -9.5 25t-26.5 10q-30 0 -63 -40t-85 -143z" />
+<glyph unicode="&#x1d4c1;" horiz-adv-x="579" d="M77 389l14 26q36 -25 94 -25q85 125 174.5 211t147.5 86q64 0 64 -67q0 -81 -96.5 -161t-225.5 -99q-143 -231 -143 -298q0 -43 36 -43q33 0 76.5 38t122.5 129l21 -17q-85 -99 -133.5 -139.5t-93.5 -40.5q-37 0 -62 22.5t-25 64.5q0 84 77 218q12 22 40 66q-49 2 -88 29 zM268 396l1 -1q117 26 194.5 91.5t77.5 137.5q0 31 -35 31q-37 0 -82 -47q-58 -59 -156 -212z" />
+<glyph unicode="&#x1d4c2;" horiz-adv-x="1038" d="M957 195l21 -16q-153 -190 -265 -190q-30 0 -49.5 19t-19.5 53q0 63 45 128l104 152q19 29 19 44q0 26 -27 26q-74 0 -185 -117t-199 -294h-75l190 337q20 36 20 47q0 27 -28 27q-74 0 -185.5 -118t-196.5 -293h-77l184 342q-52 -46 -125 -46q-32 0 -58 16l10 26 q26 -12 50 -12q80 0 167 98h68l-70 -139l3 -2q134 158 238 158q31 0 51.5 -16.5t20.5 -45.5q0 -35 -17 -74l2 -1q116 137 219 137q34 0 53 -16.5t19 -45.5q0 -49 -49 -127l-96 -152q-23 -38 -23 -59q0 -22 23 -22q87 0 238 176z" />
+<glyph unicode="&#x1d4c3;" horiz-adv-x="761" d="M680 195l21 -17q-155 -189 -264 -189q-31 0 -50.5 18.5t-19.5 53.5q0 60 46 128l106 157q17 26 17 39q0 10 -7.5 18t-20.5 8q-67 0 -169.5 -101t-184.5 -257l-28 -53h-77l183 342q-52 -46 -125 -46q-32 0 -58 16l10 26q25 -12 50 -12q80 0 167 98h72l-73 -139l3 -2 q134 158 237 158q33 0 53 -16.5t20 -45.5q0 -48 -42 -115l-103 -164q-24 -39 -24 -60t23 -21q88 0 238 176z" />
+<glyph unicode="&#x1d4c5;" horiz-adv-x="773" d="M362 285l3 -2q134 158 237 158q38 0 65 -24t27 -75q0 -71 -52 -160t-122 -136q70 -28 105 -75l-22 -20q-40 35 -64.5 49t-59.5 17q-49 -28 -93 -28q-36 0 -54 9t-18 23q0 18 25.5 33t64.5 15q36 0 57 -4q46 26 108 132.5t62 173.5q0 40 -36 40q-67 0 -168.5 -100.5 t-185.5 -257.5l-141 -262h-77l296 551q-45 -46 -125 -46q-32 0 -58 16l10 26q26 -12 50 -12q81 0 167 97l72 1z" />
+<glyph unicode="&#x1d4c6;" horiz-adv-x="780" d="M725 202l18 -18q-67 -70 -219 -209q-48 -43 -89.5 -87t-60.5 -66t-25 -31h-78l169 310l-2 1q-54 -58 -102.5 -85.5t-104.5 -27.5q-38 0 -61 29t-23 76q0 48 23 99q-30 -20 -70 -20q-39 0 -70 17l10 26q31 -13 57 -13q64 0 129 79q57 69 131.5 114t134.5 45q36 0 60 -16.5 t28 -48.5h2l28 48h68l-281 -525l3 -2q31 34 166 157.5t159 147.5zM550 364q0 42 -54 42q-95 0 -205 -159q-86 -125 -86 -187q0 -19 12 -30t29 -11q61 0 134.5 64.5t121.5 146t48 134.5z" />
+<glyph unicode="&#x1d4c7;" horiz-adv-x="580" d="M569 311l3 -27q-14 -7 -32 -7q-66 0 -87 48l-260 -192l-71 -133h-73l183 346q-53 -50 -126 -50q-32 0 -58 16l10 26q26 -12 50 -12q80 0 167 98h72l-120 -228l2 -1l214 160q0 41 21.5 65t55.5 24q19 0 30.5 -9t11.5 -18l-84 -74q16 -36 62 -36q13 0 29 4z" />
+<glyph unicode="&#x1d4c8;" horiz-adv-x="515" d="M129 243l-9 27q111 38 200 149q-5 15 -5 27q0 37 18.5 61t34.5 24q11 0 19.5 -8t8.5 -24q0 -48 -42 -90q58 -95 58 -181q0 -101 -77 -172q-70 -67 -173 -67q-41 0 -70.5 19.5t-29.5 55.5q0 31 18.5 53t41.5 22q18 0 30 -9.5t12 -27.5q0 -17 -9 -26t-20 -10.5t-20 -6 t-9 -13.5q0 -11 17 -19t37 -8q74 0 130 73t56 186q0 44 -16 106h-2q-48 -56 -92.5 -85.5t-106.5 -55.5z" />
+<glyph unicode="&#x1d4c9;" horiz-adv-x="551" d="M532 526l-13 -30h-146l-209 -387q-14 -27 -14 -58q0 -14 9 -23t24 -9q36 0 79.5 38.5t127.5 134.5l21 -17q-79 -98 -133 -142t-104 -44q-33 0 -54.5 21t-21.5 60q0 59 57 164l50 92q-55 -50 -117 -50q-32 0 -58 16l10 26q26 -12 58 -12q72 0 158 117l39 73h-102l13 30 h103l71 132h79l-72 -132h145z" />
+<glyph unicode="&#x1d4ca;" horiz-adv-x="753" d="M670 190l23 -17q-75 -93 -131.5 -137t-109.5 -44q-36 0 -53 19.5t-17 51.5q0 27 8 59l-3 1q-117 -134 -211 -134q-34 0 -55.5 22.5t-21.5 65.5q0 53 46 139l68 126q-57 -46 -125 -46q-32 0 -58 16l10 26q26 -12 50 -12q80 0 167 98h75l-159 -295q-22 -39 -22 -78 q0 -13 9 -22.5t24 -9.5q71 0 170.5 114t184.5 291h78l-160 -297q-23 -42 -23 -74q0 -31 29 -31q34 0 82.5 39.5t124.5 128.5z" />
+<glyph unicode="&#x1d4cb;" horiz-adv-x="618" d="M575 210l7 -27q-21 -9 -47 -9q-43 0 -75 29q-67 -108 -131 -161t-136 -53q-37 0 -64 25t-27 72q0 60 57 162l51 92q-53 -44 -122 -44q-32 0 -58 16l10 26q26 -12 50 -12q80 0 167 98h75l-158 -295q-20 -36 -20 -70q0 -17 13.5 -28.5t34.5 -11.5q51 0 115 52t119 157 q-16 36 -16 72q0 56 22.5 98.5t54.5 42.5q29 0 29 -50q0 -36 -14.5 -84t-32.5 -74q25 -29 62 -29q17 0 34 6z" />
+<glyph unicode="&#x1d4cc;" horiz-adv-x="888" d="M845 210l7 -27q-21 -9 -47 -9q-43 0 -75 29q-67 -108 -131 -161t-136 -53q-37 0 -64 25t-27 72q0 11 1 18h-2q-89 -115 -178 -115q-37 0 -64 25t-27 72q0 60 57 162l51 92q-55 -44 -122 -44q-32 0 -58 16l10 26q26 -12 50 -12q80 0 167 98h75l-158 -295q-20 -36 -20 -70 q0 -17 13.5 -28.5t34.5 -11.5q99 0 227 229l98 176h75l-158 -295q-20 -36 -20 -70q0 -17 13.5 -28.5t34.5 -11.5q51 0 115 52t119 157q-16 36 -16 72q0 56 22.5 98.5t54.5 42.5q29 0 29 -50q0 -36 -14.5 -84t-32.5 -74q25 -29 62 -29q16 0 34 6z" />
+<glyph unicode="&#x1d4cd;" horiz-adv-x="752" d="M653 203l22 -17q-152 -194 -272 -194q-38 0 -64 20.5t-26 64.5h-2q-87 -88 -160 -88q-39 0 -62.5 19.5t-23.5 55.5q0 28 18.5 50t41.5 22q42 0 42 -36q0 -16 -9 -25.5t-20 -12t-20 -8t-9 -14.5q0 -21 36 -21q43 0 89.5 44.5t80 103.5t55.5 114t22 79q0 48 -37 48 q-41 0 -102.5 -41t-139.5 -134l-22 17q157 188 271 188q39 0 63.5 -22.5t24.5 -61.5h2q68 87 136 87q82 0 82 -76q0 -26 -18.5 -47t-42.5 -21q-40 0 -40 33q0 16 9 25t19.5 11t19.5 7.5t9 15.5q0 22 -34 22q-37 0 -91 -68t-92 -150.5t-38 -126.5q0 -20 12 -32t30 -12 q89 0 240 181z" />
+<glyph unicode="&#x1d4ce;" horiz-adv-x="658" d="M617 424l-171 -328q-53 -103 -97 -170q44 -23 90 -23q59 0 100 30l12 -26q-54 -34 -117 -34q-54 0 -102 22q-77 -114 -203 -114q-47 0 -72.5 21.5t-25.5 49.5q0 48 54 80q42 26 115 26q58 0 91 -13l99 177l-3 1q-117 -134 -211 -134q-34 0 -55.5 22.5t-21.5 65.5 q0 53 46 139l68 126q-55 -46 -125 -46q-32 0 -58 16l10 26q26 -12 50 -12q80 0 167 98h75l-159 -295q-22 -39 -22 -78q0 -32 33 -32q71 0 170.5 114t184.5 291h78zM276 -86l-1 1q-29 13 -84 13q-57 0 -91.5 -20t-34.5 -52q0 -18 15.5 -29.5t40.5 -11.5q93 0 155 99z" />
+<glyph unicode="&#x1d4cf;" horiz-adv-x="691" d="M594 178l23 -16q-73 -102 -132 -137.5t-118 -35.5q-60 0 -60 46q0 16 10 35.5t10 30.5t-9 19t-20 8q-65 0 -127 -71q-55 -63 -97 -63q-22 0 -22 20q0 49 127 108l231 188l-1 2q-18 -7 -43 -7q-55 0 -99 34q-24 -25 -58 -40t-65 -15q-35 0 -61 16l12 26q25 -12 48 -12 q58 0 102 44q-26 31 -26 63q0 23 13.5 40t33.5 17q19 0 29.5 -14.5t10.5 -35.5q0 -23 -18 -61q25 -32 77 -32q42 0 76 17q34 46 66.5 67.5t54.5 21.5q31 0 31 -23q0 -50 -120 -89l-223 -186l1 -1q31 16 72 16q36 0 55 -16.5t19 -39.5q0 -15 -8.5 -32.5t-8.5 -27.5 q0 -6 5.5 -10t11.5 -4q89 0 197 150z" />
+<glyph unicode="&#x1d4d0;" horiz-adv-x="984" d="M945 691l10 -17q-92 -178 -259 -569q41 12 80 33l21 -43q-41 -32 -127 -50l-18 -45h-147l18 41q-66 0 -135 29q-88 -91 -187 -91q-68 0 -109.5 37t-41.5 94q0 38 24.5 64.5t59.5 26.5q31 0 50.5 -21.5t19.5 -48.5q0 -23 -17 -41.5t-46 -23.5v-1q15 -31 61 -31 q62 0 131 64q-59 37 -95 90t-36 118q0 87 68.5 144.5t152.5 57.5q91 0 161 -68q74 113 131 165q103 94 183 94q18 0 47 -8zM809 610l-2 2q-48 -31 -88 -78t-100 -139q23 -40 30 -79h2q78 165 158 294zM596 222q0 58 -18 107q-6 -9 -22 -37l-26 -41l-25 -37q-16 -24 -34 -47 l-39 -48q57 -23 117 -23q24 48 45 97q2 9 2 29zM547 384q-51 64 -126 64q-50 0 -89 -38t-39 -97q0 -105 88 -166q68 78 166 237z" />
+<glyph unicode="&#x1d4d1;" horiz-adv-x="1060" d="M966 690l17 -45q-37 -15 -74 -39q76 -60 76 -131q0 -50 -36.5 -92t-102.5 -56v-2q46 -22 70 -58t24 -73q0 -45 -26.5 -92t-76.5 -80q-51 -35 -129 -35q-56 0 -83 30t-27 65q0 44 37.5 85t118.5 51l8 -50q-43 -4 -70 -27.5t-27 -56.5q0 -21 13 -31.5t32 -10.5 q44 0 72.5 48.5t28.5 107.5q0 72 -39 102q-22 -6 -54 -6q-5 0 -35 6q-168 -321 -443 -321q-86 0 -135.5 36t-49.5 93q0 38 23 65.5t58 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q25 -31 77 -31q83 0 150.5 52t150.5 196q74 130 129 199.5t136 120.5 q-69 42 -177 42q-92 0 -171.5 -25.5t-133.5 -81t-54 -130.5q0 -43 29 -70.5t71 -27.5q63 0 115.5 56.5t56.5 162.5h50q0 -107 -62.5 -190.5t-165.5 -83.5q-87 0 -133 42q-52 47 -52 118q0 74 49.5 134.5t128.5 98.5q108 52 263 52q154 0 252 -58q45 27 111 49zM871 480 q0 48 -26 77q-59 -58 -130 -189q49 -3 71 -14q38 7 61.5 44t23.5 82z" />
+<glyph unicode="&#x1d4d2;" horiz-adv-x="912" d="M487 668l-22 -45q-35 21 -111 21q-79 0 -141 -35t-62 -105q0 -53 35.5 -84.5t80.5 -35.5q82 120 225.5 211.5t255.5 91.5q129 0 129 -79q0 -61 -69 -128t-185.5 -113.5t-237.5 -47.5q-60 -91 -60 -179q0 -46 30.5 -76t76.5 -30q73 0 123 42t50 98q0 34 -18.5 52t-39.5 18 q-49 0 -81 -34.5t-44 -101.5l-50 8q10 83 64.5 133t137.5 50q67 0 106 -28.5t39 -81.5q0 -42 -28.5 -84.5t-74.5 -74.5q-74 -51 -198 -51q-98 0 -162.5 48.5t-64.5 132.5q0 86 44 167q-75 17 -125 61.5t-50 113.5q0 79 79.5 138t207.5 59q83 0 140 -31zM414 375l1 -1 q64 1 150 31.5t153.5 83.5t67.5 106q0 37 -46 37q-66 0 -162.5 -75t-163.5 -182z" />
+<glyph unicode="&#x1d4d3;" horiz-adv-x="991" d="M889 613l17 -47q-36 -15 -69 -48q61 -96 61 -194q0 -144 -108 -244.5t-247 -100.5q-89 0 -169 28q-74 -24 -158 -24q-72 0 -107 15q-49 20 -49 63q0 42 51 65q36 16 91 16q36 0 73 -10t56 -19l57 -28q32 24 69.5 73t99.5 148l53 82q20 28 54 66t75 71q-44 58 -115.5 88.5 t-150.5 30.5q-125 0 -204 -60q-85 -65 -85 -160q0 -60 35.5 -98t98.5 -38q78 0 133 58.5t56 187.5h50q1 -20 1 -36q0 -66 -23.5 -119t-60 -84.5t-77 -48t-78.5 -16.5q-105 0 -165.5 52.5t-60.5 149.5q0 123 122 201q104 66 252 66q101 0 187 -35.5t143 -97.5q48 32 92 47z M461 49v-2q37 -13 78 -13q109 0 185 79.5t76 222.5q0 54 -18 108h-1q-22 -33 -79 -144q-90 -176 -241 -251zM310 51v1q-53 35 -115 35q-14 0 -29 -5.5t-15 -16.5q0 -27 64 -27q52 0 95 13z" />
+<glyph unicode="&#x1d4d4;" horiz-adv-x="826" d="M414 683l-14 -48q-30 9 -77 9q-62 0 -99.5 -26t-37.5 -69q0 -85 148 -96q15 93 119 163.5t208 70.5q130 0 130 -80q0 -64 -99 -129t-241 -80v-3q80 -10 80 -37q0 -18 -18.5 -29.5t-53.5 -11.5t-63 14q-72 -25 -114.5 -78.5t-42.5 -117.5q0 -45 31 -73t83 -28 q69 0 118.5 37.5t49.5 98.5q0 30 -18.5 47t-40.5 17q-94 0 -129 -128l-49 10q36 173 206 173q145 0 145 -116q0 -60 -53 -111q-42 -40 -106.5 -61.5t-127.5 -21.5q-103 0 -173 46.5t-70 130.5q0 77 62.5 136.5t176.5 87.5v2q-6 10 -7 16q-111 6 -176.5 47t-65.5 107 q0 61 60 104t156 43q65 0 103 -16zM456 455l2 -2q101 14 171.5 58t70.5 90q0 31 -45 31q-56 0 -118 -55.5t-81 -121.5z" />
+<glyph unicode="&#x1d4d5;" horiz-adv-x="1042" d="M999 699l26 -42q-44 -38 -102.5 -62.5t-115.5 -24.5q-82 0 -196.5 37t-160.5 37q-86 0 -141.5 -43.5t-55.5 -108.5q0 -51 28.5 -76t63.5 -25q43 0 80.5 34t55.5 110l45 -9q-7 -85 -62 -137.5t-130 -52.5q-46 0 -89 22q-37 20 -60 56t-23 81q0 101 118 163q77 41 229 41 q56 0 175 -19t171 -19q29 0 71 10.5t73 27.5zM718 558l35 -36q-5 -5 -9 -10.5t-8 -13.5l-8 -12q-3 -5 -7 -14l-7 -16l-7 -18t-7.5 -19l-9.5 -23l-9 -26q68 13 134 13q40 56 79 56q22 0 35 -13t13 -31q0 -31 -26.5 -53t-73.5 -28q0 -49 8 -73l-70 -26q-4 15 -4 34q0 20 6 50 q-68 0 -133 -14q-42 -105 -110.5 -176t-142 -100.5t-153.5 -29.5q-85 0 -131.5 35.5t-46.5 93.5q0 38 24.5 65.5t59.5 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q23 -31 80 -31q73 0 128 48.5t102 137.5l4 8q-91 -43 -140 -85l-35 36q92 87 227 144 q58 102 100 150.5t93 84.5z" />
+<glyph unicode="&#x1d4d6;" horiz-adv-x="834" d="M422 682l-14 -48q-35 10 -84 10q-70 0 -110.5 -25.5t-40.5 -70.5q0 -67 111 -91q71 104 178.5 167t202.5 63q134 0 134 -85q0 -42 -40.5 -82.5t-109.5 -71.5q-120 -54 -259 -57q-30 -54 -30 -112q0 -62 46 -62q65 0 111 28t151 123l39 -32q-14 -13 -26 -34t-19 -38 t-21 -55q-41 -114 -135 -172t-234 -58q-86 0 -137 36t-51 93q0 38 24 65.5t59 27.5q31 0 50 -20t19 -47q0 -24 -15 -43.5t-43 -24.5v-1q23 -31 86 -31q145 0 229 145l-2 2q-44 -19 -102 -19q-71 0 -117 36t-46 98q0 54 27 105q-80 18 -125.5 55t-45.5 92q0 65 67 108t168 43 q59 0 105 -17zM424 447v-1q116 7 200 49.5t84 97.5q0 39 -43 39q-55 0 -123 -53.5t-118 -131.5z" />
+<glyph unicode="&#x1d4d7;" horiz-adv-x="1171" d="M816 658l-24 -19q-67 -53 -119.5 -115.5t-101.5 -158.5q62 15 89 27q110 145 223 226t194 81q77 0 77 -63q0 -78 -95.5 -141.5t-247.5 -106.5q-74 -104 -120.5 -191.5t-46.5 -127.5q0 -28 29 -28q46 0 146 124l42 -26q-52 -80 -111 -121q-53 -36 -104 -36 q-63 0 -92.5 31.5t-29.5 82.5q0 96 83 222q-13 -5 -41 -13.5t-32 -9.5q-68 -125 -167.5 -220.5t-197.5 -95.5q-104 0 -104 77q0 61 61 119q42 40 100 67t160 63q4 7 20 33t22 35l22 32q15 23 27 37l31 36q19 22 41 43.5t49 45.5v2q-39 0 -71.5 11.5t-51 26t-43 26 t-48.5 11.5q-39 0 -66.5 -30.5t-27.5 -68.5q0 -36 17.5 -54t42.5 -18q33 0 57 23l29 -35q-40 -43 -106 -43q-61 0 -96 36.5t-35 90.5q0 60 50 107t139 47q56 0 134 -25t116 -25q44 0 79 13q30 11 69 37zM875 473v-2q63 16 126.5 61t63.5 95q0 17 -18 17q-27 0 -78 -49 t-94 -122zM344 225l-1 2q-75 -24 -131 -75t-56 -98q0 -20 20 -20q29 0 78.5 58t89.5 133z" />
+<glyph unicode="&#x1d4d8;" horiz-adv-x="997" d="M141 66v-1q10 -13 38 -22t49 -9q94 0 164.5 48.5t131.5 182.5q2 5 8 18t10 20q-49 17 -79 56q-37 45 -37 108q0 79 60 137q87 83 237 83q63 0 121 -9q45 21 81 21q23 0 37.5 -10t14.5 -25q0 -31 -25 -47t-68 -16q-16 0 -32 3q-17 -12 -32 -30t-29.5 -46t-24 -48 t-26.5 -60l-24 -57l1 -2q69 33 120 115l43 -26q-67 -128 -195 -154q-64 -134 -122 -187q-142 -130 -328 -130q-86 0 -137 36t-51 93q0 38 24.5 65.5t59.5 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5zM769 604v3q-130 0 -191 -47t-61 -119q0 -57 54 -83 q29 57 51.5 94t62 81t84.5 71z" />
+<glyph unicode="&#x1d4d9;" horiz-adv-x="906" d="M625 228l35 -36q-58 -64 -171 -104q-61 -128 -161 -220t-204 -92q-49 0 -77 24t-28 67q0 88 105 160t240 100q31 86 82 193q-53 13 -83 52q-30 38 -30 93q0 119 124 183q77 39 175 39q29 0 50 -1.5t41.5 -4t30.5 -3.5q31 21 78 21q25 0 39.5 -10t14.5 -25q0 -31 -25 -47 t-67 -16q-16 0 -33 3q-58 -45 -141 -222l2 -1q62 27 117 113l43 -25q-29 -58 -84 -104.5t-112 -51.5q-9 -20 -26.5 -64t-31.5 -73l3 -1q56 22 94 53zM678 605v2q-116 0 -168 -24q-38 -17 -62 -50t-24 -74q0 -70 50 -85q71 131 204 231zM333 50l-1 1q-74 -21 -148 -79.5 t-74 -111.5q0 -13 8 -21t21 -8q47 0 101 66t93 153z" />
+<glyph unicode="&#x1d4da;" horiz-adv-x="1154" d="M842 699l30 -41q-43 -30 -76.5 -62.5t-62 -74t-42.5 -65.5l-41 -76q21 0 40 -12q46 21 115 118q149 213 250 213q36 0 55.5 -20.5t19.5 -47.5q0 -28 -19 -47.5t-47 -19.5q-27 0 -44 14.5t-21 38.5h-2q-33 -103 -100.5 -179.5t-155.5 -100.5v-3q49 -28 49 -84 q0 -32 -18 -66q-9 -17 -27 -43.5t-28 -44t-10 -28.5q0 -27 26 -27q48 0 155 134l39 -33q-113 -160 -222 -160q-56 0 -87.5 26.5t-31.5 67.5q0 44 49 118q37 55 37 90q0 8 -7.5 17.5t-19.5 9.5h-21q-72 -177 -177 -254.5t-224 -77.5q-83 0 -130.5 36t-47.5 93q0 38 24.5 65.5 t59.5 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q23 -31 70 -31q62 0 119 52t99 134q35 70 51.5 100.5t47 78.5t65 84t80.5 73h-9q-51 0 -98.5 22t-84 44t-60.5 22q-44 0 -77 -28t-33 -80q0 -40 21.5 -69.5t57.5 -29.5q26 0 41.5 9t39.5 39l38 -30 q-53 -73 -134 -73q-72 0 -113.5 42t-41.5 110q0 63 58.5 114t146.5 51q119 0 180 -36q47 -27 79 -27q90 0 160 63z" />
+<glyph unicode="&#x1d4db;" horiz-adv-x="1036" d="M678 648l-22 -44q-72 40 -166 40q-80 0 -140.5 -37.5t-60.5 -103.5t64.5 -103.5t166.5 -37.5q25 0 44 2q45 91 83 148q45 65 117.5 116t140.5 51q56 0 83 -23.5t27 -63.5q0 -70 -94.5 -151.5t-225.5 -117.5q-95 -192 -254 -272v-2q44 -13 78 -13q151 0 278 141l36 -35 q-139 -163 -311 -163q-85 0 -168 29q-82 -25 -162 -25q-75 0 -108 17q-44 22 -44 61q0 38 44 62q39 21 100 21q35 0 71 -9.5t56 -18.5l57 -29q71 47 168 220h-28q-56 0 -108 10.5t-99 33t-75 63t-28 93.5q0 81 83 136.5t204 55.5q112 0 193 -51zM722 389l2 -1 q78 27 139 81.5t61 120.5q0 16 -10 25t-23 9q-43 0 -88 -69.5t-81 -165.5zM290 53v1q-53 35 -115 35q-14 0 -29 -5.5t-15 -16.5q0 -29 64 -29q45 0 95 15z" />
+<glyph unicode="&#x1d4dc;" horiz-adv-x="1300" d="M1234 691l11 -17q-142 -219 -228.5 -388t-86.5 -218q0 -27 26 -27q47 0 167 133l37 -34q-66 -79 -120 -118.5t-112 -39.5q-119 0 -119 95q0 161 284 539l-2 1q-68 -47 -133.5 -132.5t-155.5 -246.5l-46 -81q-14 -24 -36.5 -56t-41.5 -51q-56 -54 -124 -54q-33 0 -57 21.5 t-24 54.5q0 51 35 121q88 178 259 414l-1 1q-70 -49 -125.5 -118t-127.5 -188q-7 -11 -25 -42l-24 -40l-22 -36l-23 -36q-7 -11 -20 -29.5l-21 -29.5l-20 -24q-10 -13 -20 -23q-61 -63 -137 -63q-63 0 -102 31.5t-39 86.5q0 38 24.5 64.5t59.5 26.5q31 0 50.5 -21.5 t19.5 -48.5q0 -25 -16 -44.5t-47 -19.5v-1q14 -19 61 -19t86 45t124 184q136 224 231 317q119 119 235 119q20 0 37 -8l10 -17q-99 -137 -191.5 -294t-130.5 -243q-19 -42 -19 -60q0 -14 11 -14q42 0 145 194q116 217 231 334q106 108 201 108q38 0 52 -8z" />
+<glyph unicode="&#x1d4dd;" horiz-adv-x="1095" d="M695 175h4q48 63 85 165q9 25 26 80l30 92q12 36 33 78t44 66q40 43 89 43q34 0 53 -20.5t19 -47.5q0 -28 -19.5 -47.5t-46.5 -19.5q-43 0 -64 39h-4q-19 -16 -36.5 -64.5t-42.5 -128.5t-48 -135q-37 -85 -92.5 -163t-116.5 -125h-51q4 23 7 47.5t4 57.5l3 57q1 23 2 72 t2 76q4 119 28 215h-2q-45 -71 -100 -183q-108 -219 -171 -284q-63 -66 -138 -66q-57 0 -94.5 32.5t-37.5 86.5q0 34 25 62t61 28q33 0 52 -21t19 -50q0 -21 -18 -41.5t-48 -20.5v-1q10 -20 48 -20q55 0 109.5 72.5t136.5 235.5q57 115 95.5 179t77.5 105q34 36 101 68 l25 -22q-7 -19 -12 -55t-7 -65l-6 -89q-4 -61 -6 -88q-11 -156 -18 -200z" />
+<glyph unicode="&#x1d4de;" horiz-adv-x="809" d="M749 562l-38 -9q-13 40 -56 65.5t-89 25.5q-88 0 -173.5 -69.5t-139.5 -182t-54 -229.5q0 -53 28 -91t78 -38q54 0 106 25q82 40 134.5 127.5t52.5 185.5q0 52 -23.5 89.5t-52.5 37.5q-43 0 -71.5 -41.5t-28.5 -97.5q0 -52 26 -95l-44 -22q-37 60 -37 126q0 83 51.5 139 t130.5 56q62 0 105.5 -44.5t43.5 -127.5q0 -68 -32 -141t-86 -133.5t-133 -99.5t-164 -39q-98 0 -154.5 60t-56.5 151q0 101 39.5 195t105 162.5t156 110t187.5 41.5q79 0 131.5 -40t57.5 -97z" />
+<glyph unicode="&#x1d4df;" horiz-adv-x="1025" d="M914 698l19 -47q-27 -12 -55 -29q116 -76 116 -183q0 -71 -46 -118t-124 -47q-36 0 -65 22.5t-29 58.5q0 42 29 71l41 -28q-15 -18 -15 -37q0 -15 10.5 -23.5t22.5 -8.5q27 0 44.5 28t17.5 72q0 83 -67 140q-33 -35 -57.5 -79t-50 -104.5t-41.5 -90.5q-90 -170 -193 -243 t-231 -73q-85 0 -135 36.5t-50 93.5q0 38 23 65t58 27q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q25 -31 84 -31q85 0 141 50t138 198q68 124 122 200t119 128q-72 34 -151 34q-147 0 -246.5 -65t-99.5 -160q0 -43 27 -70.5t65 -27.5q61 0 102 50.5t47 157.5h50 q0 -66 -19 -123t-68.5 -98.5t-122.5 -41.5q-74 0 -123 41.5t-49 115.5q0 65 46.5 126t128.5 100q105 50 255 50q122 0 224 -45q49 28 98 44z" />
+<glyph unicode="&#x1d4e0;" horiz-adv-x="809" d="M749 562l-38 -9q-13 40 -56 65.5t-89 25.5q-88 0 -173.5 -69.5t-139.5 -182t-54 -229.5q0 -53 28 -91t78 -38q54 0 115 29q-16 29 -39 29q-14 0 -25 -5t-35 -24l-30 40q71 73 121 73q56 0 93 -45q93 104 93 241q0 56 -22.5 91.5t-63.5 35.5q-43 0 -66.5 -38t-23.5 -91 q0 -55 27 -95l-44 -22q-38 58 -38 124q0 77 50.5 132t131.5 55q62 0 105.5 -44.5t43.5 -127.5q0 -80 -43 -165t-115 -148q34 -48 51 -48q16 0 32 9t50 41l33 -34q-39 -51 -71.5 -75t-70.5 -24q-41 0 -67 15t-50 54q-83 -38 -164 -38q-98 0 -154.5 60t-56.5 151 q0 101 39.5 195t105 162.5t156 110t187.5 41.5q79 0 131.5 -40t57.5 -97z" />
+<glyph unicode="&#x1d4e1;" horiz-adv-x="1048" d="M934 175l39 -33q-58 -81 -110.5 -120.5t-113.5 -39.5q-57 0 -90 27t-33 67q0 37 42.5 101t42.5 90q0 24 -14 27q-22 0 -30 5q-87 -169 -192.5 -244.5t-234.5 -75.5q-85 0 -135 36.5t-50 93.5q0 38 23 65t58 27q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1 q25 -31 87 -31q85 0 139 49.5t137 198.5q70 128 122.5 202t118.5 126q-72 34 -151 34q-147 0 -246.5 -65t-99.5 -160q0 -43 27.5 -70.5t64.5 -27.5q75 0 113 66q31 52 35 133h50q0 -104 -52 -179t-159 -75q-71 0 -120.5 42.5t-49.5 114.5q0 65 46.5 125.5t128.5 99.5 q107 51 255 51q122 0 224 -45q44 25 98 44l19 -47q-30 -13 -55 -29q93 -61 93 -146q0 -67 -52 -111t-126 -50v-2q34 -34 34 -86q0 -27 -39 -83.5t-39 -75.5q0 -27 26 -27q52 0 159 134zM857 481q0 53 -43 88q-21 -21 -40 -50t-27 -44.5t-27 -58.5l-22 -49q33 0 62 -18 q38 7 67.5 47.5t29.5 84.5z" />
+<glyph unicode="&#x1d4e2;" horiz-adv-x="816" d="M437 136l-49 -10q-12 73 -40 99t-67 26t-62.5 -31t-23.5 -71q0 -41 36 -78t90 -37q68 0 115.5 41t47.5 122q0 31 -16.5 59.5t-39.5 51.5l-47 48q-23 25 -39.5 57.5t-16.5 68.5q0 70 46.5 121t108.5 73.5t126 22.5q68 0 121.5 -30.5t53.5 -91.5q0 -62 -64 -106.5 t-137 -44.5v50q49 4 79.5 27.5t30.5 67.5q0 35 -25.5 54t-59.5 19q-55 0 -103.5 -39.5t-48.5 -102.5q0 -34 17 -64.5t41 -54.5l49 -48q24 -24 41 -56t17 -69q0 -103 -87 -167t-216 -64q-99 0 -166.5 42.5t-67.5 125.5q0 74 58 116.5t136 42.5q144 0 162 -170z" />
+<glyph unicode="&#x1d4e3;" horiz-adv-x="1030" d="M999 699l26 -42q-44 -38 -102.5 -62.5t-115.5 -24.5q-82 0 -196.5 37t-160.5 37q-85 0 -141 -46t-56 -111q0 -53 29 -80t72 -27q58 0 95 40t65 129l48 -12q-19 -99 -77 -155.5t-133 -56.5q-67 0 -108 22q-82 44 -82 133q0 54 32 101.5t86 76.5q77 41 229 41q56 0 175 -19 t171 -19q29 0 71 10.5t73 27.5zM718 558l35 -36q-28 -29 -46.5 -70.5t-36 -101t-28.5 -85.5q-38 -98 -108 -168q-60 -60 -136.5 -89t-153.5 -29q-85 0 -132 35.5t-47 93.5q0 38 24.5 65.5t59.5 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q23 -31 80 -31 q72 0 130 50t121 176q47 94 82 146.5t61 78t85 73.5z" />
+<glyph unicode="&#x1d4e4;" horiz-adv-x="964" d="M904 669l-304 -563q-9 -18 -9 -36q0 -29 23 -29q46 0 149 130l41 -33q-53 -78 -112 -120q-50 -36 -104 -36q-100 0 -118 86h-1q-40 -50 -82.5 -69.5t-97.5 -19.5q-49 0 -81 26t-32 70q0 49 79 171l149 230q30 45 30 89q0 36 -24 57.5t-73 21.5q-74 0 -130 -47.5 t-56 -116.5q0 -31 16 -50.5t40 -19.5q41 0 66 25.5t45 78.5l48 -15q-18 -59 -59.5 -101.5t-106.5 -42.5q-50 0 -84 21q-56 35 -56 104q0 94 87 156.5t199 62.5q85 0 147 -40t62 -112q0 -40 -54 -128l-180 -291q-24 -36 -24 -67q0 -27 27 -27q40 0 98 66q77 87 200 307 l147 262h135z" />
+<glyph unicode="&#x1d4e5;" horiz-adv-x="1040" d="M332 62l3 -4q62 38 111 78t91.5 91.5t65 83t64.5 96.5l68 103q22 33 56 78t55.5 63.5t49 33t54.5 14.5q39 0 56.5 -21t17.5 -47q0 -28 -18.5 -47.5t-45.5 -19.5q-25 0 -43 14.5t-23 38.5h-2q-62 -53 -168 -224q-136 -220 -262 -314q-131 -100 -228 -100q-15 0 -66 9 q41 39 70.5 93t50.5 109.5t46 114t71 124.5t111 123v4q-76 0 -119 17q-29 11 -69.5 41t-68.5 30q-44 0 -76.5 -28.5t-32.5 -80.5q0 -38 21 -62.5t51 -24.5q27 0 47 10.5t43 39.5l38 -32q-32 -36 -61.5 -54.5t-72.5 -18.5q-65 0 -111 39.5t-46 108.5q0 73 62 115.5t142 42.5 q31 0 51 -1.5t50 -10t59 -24.5q47 -27 79 -27q92 0 160 63l36 -35q-74 -78 -113.5 -144t-79.5 -165q-75 -184 -174 -293z" />
+<glyph unicode="&#x1d4e6;" horiz-adv-x="1320" d="M634 62l3 -4q46 25 89.5 63.5t86.5 93t69 91.5l67 101l68 103q22 33 56 78t55.5 63.5t49 33t54.5 14.5q39 0 56.5 -21t17.5 -47q0 -28 -18 -47.5t-45 -19.5q-26 0 -44 14.5t-23 38.5h-2q-62 -53 -168 -224q-42 -68 -80.5 -123t-87 -111t-95 -94t-100.5 -62t-107 -24 q-28 0 -58 9q43 38 76 96.5t84 188.5q11 29 44 103h-2l-42 -66l-48 -71q-36 -52 -59 -78.5t-63 -67t-73 -61t-76 -37t-85 -16.5q-27 0 -60 9q36 29 61.5 78t46 106.5t45.5 119t73.5 132t116.5 130.5v2q-76 0 -119 17q-29 11 -69.5 41t-68.5 30q-44 0 -76.5 -28.5 t-32.5 -80.5q0 -38 21 -62.5t51 -24.5q27 0 47 10.5t43 39.5l38 -32q-32 -36 -61.5 -54.5t-72.5 -18.5q-71 0 -114 40.5t-43 107.5q0 62 58.5 110t145.5 48q31 0 51 -1.5t50 -10t59 -24.5q47 -27 79 -27q92 0 160 63l36 -35q-59 -57 -100.5 -119.5t-66.5 -119.5l-50 -114 q-24 -57 -63.5 -123t-93.5 -126l2 -4q43 18 87.5 59t84.5 93t81 111l82 117q42 58 84 108t90.5 88t97.5 53q25 0 49 -8q-47 -50 -83.5 -116t-61.5 -130l-51 -128q-26 -64 -64.5 -128.5t-88.5 -114.5z" />
+<glyph unicode="&#x1d4e7;" horiz-adv-x="1033" d="M664 567h2q40 58 88 95t115 37q56 0 98.5 -32.5t42.5 -86.5q0 -34 -24 -61t-60 -27q-34 0 -53.5 20t-19.5 49q0 21 18 41.5t48 20.5v1q-10 20 -48 20q-60 0 -103 -46t-84 -147t-70.5 -197.5t-29.5 -141.5q0 -34 14.5 -52.5t35.5 -18.5q30 0 69.5 29t100.5 99l38 -30 q-134 -157 -239 -157q-63 0 -97.5 25.5t-60.5 79.5h-2q-82 -108 -228 -108q-57 0 -104 32.5t-47 86.5q0 34 25 62t61 28q33 0 52 -21t19 -50q0 -21 -18 -41.5t-48 -20.5v-1q4 -8 21.5 -14t36.5 -6q79 0 133.5 47t105.5 147q42 82 67 159.5t25 115.5q0 71 -22.5 106t-76.5 35 q-73 0 -132 -57t-59 -126q0 -37 19 -60t52 -23q35 0 55.5 18.5t42.5 60.5l44 -18q-30 -58 -64.5 -87t-92.5 -29q-64 0 -105.5 37.5t-41.5 106.5q0 50 34.5 98t83.5 82q76 52 169 52q82 0 137.5 -35t76.5 -97z" />
+<glyph unicode="&#x1d4e8;" horiz-adv-x="989" d="M825 669h138q-131 -175 -212.5 -297.5t-147.5 -250.5l2 -1q50 24 100 64l35 -36q-64 -66 -178 -116q-52 -106 -147 -181t-206 -75q-44 0 -75 21.5t-31 61.5q0 85 105 137q22 11 52.5 20.5t52 14.5t63.5 14l61 13q11 24 56 101l-3 1q-71 -62 -145 -62q-53 0 -83 25t-30 71 q0 34 22 70t92 126q68 87 83 115.5t15 59.5q0 35 -28.5 57t-78.5 22q-74 0 -130 -47.5t-56 -116.5q0 -31 16 -50.5t40 -19.5q78 0 116 102l43 -12q-16 -59 -57 -102t-106 -43q-53 0 -84 19q-59 35 -59 106q0 94 87 156.5t199 62.5q87 0 153 -40t66 -112q0 -10 -1 -19t-5 -20 t-7.5 -19t-12.5 -22l-15 -23q-6 -10 -19.5 -29.5l-22.5 -32.5l-30 -38l-32 -44q-42 -57 -54.5 -80.5t-12.5 -41.5q0 -21 23 -21q66 0 265 266zM396 -23l-1 1q-29 -6 -58.5 -14.5t-64 -23.5t-56.5 -36.5t-22 -46.5q0 -10 7 -18t22 -8q37 0 83.5 35t89.5 111z" />
+<glyph unicode="&#x1d4e9;" horiz-adv-x="996" d="M440 531l45 -22q-58 -117 -177 -117q-68 0 -111.5 36t-43.5 97q0 66 65.5 120t174.5 54q168 0 278 -72q85 61 164 61q70 0 105.5 -23.5t35.5 -53.5q0 -34 -32.5 -60.5t-110.5 -26.5q-39 0 -131 28q-53 -68 -106 -216q48 2 92 43l32 -33q-73 -90 -157 -90q-5 -11 -15 -31 q-50 -92 -127 -154q64 -24 126 -24q64 0 127.5 31t89.5 101h50q-43 -200 -264 -200q-100 0 -157 18q-31 11 -52 22q-80 -37 -160 -37q-71 0 -101 23t-30 56q0 39 42 62q38 21 100 21q50 0 147 -40q20 26 32 47q14 26 56 128h-2q-48 0 -103 -44l-30 40q74 84 171 84 q67 145 151 217q-115 55 -225 55q-62 0 -103.5 -29.5t-41.5 -78.5q0 -37 21.5 -56.5t55.5 -19.5q70 0 119 84zM742 600v-2q57 -19 90 -19q53 0 53 29q0 25 -49 25q-57 0 -94 -33zM278 56q-57 33 -97 33t-40 -28q0 -24 57 -24q42 0 80 19z" />
+<glyph unicode="&#x1d4ea;" horiz-adv-x="942" d="M830 210l35 -29q-148 -192 -274 -192q-65 0 -87 56q-47 -35 -82 -47t-81 -12q-61 0 -101.5 30t-40.5 94q0 55 24 111q-46 -18 -92 -18q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81v-1q58 59 133.5 94t147.5 35q112 0 142 -75l-41 -19q-19 27 -37.5 35.5t-50.5 8.5 q-66 0 -133.5 -59t-107.5 -134.5t-40 -131.5q0 -25 12.5 -38t32.5 -13q31 0 69.5 19.5t63.5 52.5q-1 9 -1 29q0 69 40 129.5t98 60.5q50 0 50 -49q0 -45 -35 -100t-86 -91q6 -27 15.5 -37.5t33.5 -10.5q81 0 223 171z" />
+<glyph unicode="&#x1d4eb;" horiz-adv-x="646" d="M92 541l31 36q31 -26 71.5 -48t65.5 -23q31 39 65 74q116 119 198 119q43 0 72 -20t29 -51q0 -44 -33 -85.5t-88 -68.5q-73 -35 -156 -35q-58 -79 -119 -196.5t-61 -173.5q0 -14 10 -23.5t23 -9.5q60 0 117 51t95 119q-17 30 -17 81q0 61 32.5 104t70.5 43q45 0 45 -49 q0 -33 -16.5 -79t-33.5 -75q19 -14 48 -14q18 0 39 7l11 -44q-30 -13 -66 -13q-37 0 -60 13q-67 -98 -135 -146t-152 -48q-53 0 -85.5 31t-32.5 89q0 59 46 157t117 195q-65 19 -131 83zM378 503l1 -2q62 1 108.5 40t46.5 87q0 21 -18 21q-23 0 -53 -30t-85 -116z" />
+<glyph unicode="&#x1d4ec;" horiz-adv-x="764" d="M35 225l12 43q36 -15 82 -15q100 0 161 68q59 64 129.5 102.5t138.5 38.5q53 0 89 -21.5t36 -61.5q0 -35 -20 -61t-53 -26q-28 0 -42.5 14t-14.5 36t19.5 37t19.5 22q0 11 -17 11q-60 0 -122.5 -57.5t-100.5 -132t-38 -130.5q0 -28 12 -42t30 -14q118 0 275 192l34 -30 q-87 -112 -162 -162t-156 -50q-67 0 -107.5 33t-40.5 90q0 55 25 113q-44 -19 -93 -19q-53 0 -96 22z" />
+<glyph unicode="&#x1d4ed;" horiz-adv-x="949" d="M912 699l-323 -598q-11 -19 -11 -39q0 -9 5 -16t11 -7q71 0 211 170l35 -29q-71 -97 -133.5 -144t-139.5 -47q-91 0 -93 75h-2q-73 -78 -179 -78q-56 0 -90.5 30.5t-34.5 81.5t35 118q-41 -13 -79 -13q-53 0 -96 22l12 43q36 -15 82 -15q86 0 154 63q93 91 181 127 q48 19 103 19q60 0 81 -39h2l145 276h124zM588 376q0 36 -30 36q-36 0 -86 -37t-101 -109q-88 -125 -88 -193q0 -16 8.5 -26.5t21.5 -10.5q55 0 123 63q61 58 106.5 139t45.5 138z" />
+<glyph unicode="&#x1d4ee;" horiz-adv-x="726" d="M35 284l29 35q47 -55 133 -69q52 89 145.5 150.5t182.5 61.5q54 0 88.5 -23t34.5 -61q0 -42 -35 -78q-44 -47 -129.5 -75.5t-178.5 -30.5q-12 -11 -22 -41.5t-10 -58.5t14.5 -43t39.5 -15q52 0 131.5 54t135.5 122l32 -32q-88 -109 -189 -160q-68 -34 -135 -34 q-68 0 -106 33.5t-38 90.5q0 50 17 94q-91 20 -140 80zM330 244l1 -1q101 11 160 54.5t59 92.5q0 13 -8.5 20t-17.5 7q-81 0 -194 -173z" />
+<glyph unicode="&#x1d4ef;" horiz-adv-x="768" d="M25 -205l192 367q-16 27 -16 59q0 43 35.5 84t95.5 68q90 176 157 251t153 75q51 0 79 -20t28 -53q0 -46 -31 -90t-80.5 -78t-95.5 -57.5t-93 -41.5l-117 -210q25 -12 61 -12q76 0 137 54l27 -36q-81 -68 -177 -68q-44 0 -75 9l-156 -301h-124zM483 432l2 -2 q70 34 122 85t52 104q0 17 -6 23.5t-20 6.5q-47 0 -150 -217z" />
+<glyph unicode="&#x1d4f0;" horiz-adv-x="819" d="M771 450l-278 -519q25 -12 73 -12q56 0 110 35l20 -41q-60 -44 -141 -44q-49 0 -89 14q-90 -107 -238 -107q-60 0 -94 23t-34 54q0 32 29.5 58t70.5 42q39 15 121 15q25 0 75 -8l40 72h-3q-63 -43 -143 -43q-50 0 -83.5 30.5t-33.5 79.5q0 55 32 117q-42 -14 -82 -14 q-52 0 -96 24l12 43q38 -17 82 -17q81 0 150 58q60 65 142.5 108.5t143.5 43.5q59 0 88 -30h2l10 18h114zM591 376q0 37 -33 37q-75 0 -187 -162q-83 -120 -83 -177q0 -16 9.5 -25.5t20.5 -9.5q43 0 93.5 41.5t89 97t64.5 112t26 86.5zM369 -91q-30 9 -63 9q-43 -1 -74 -16 t-32 -46q0 -30 40 -30q74 0 129 83z" />
+<glyph unicode="&#x1d4f1;" horiz-adv-x="838" d="M722 214l36 -28q-144 -200 -283 -200q-41 0 -65.5 25.5t-24.5 57.5q0 64 46 129l108 151q17 24 17 43q0 16 -20 16q-60 0 -150.5 -96t-176.5 -255l-31 -57h-123l249 458q-94 19 -143 80l31 33q28 -26 69 -43t70 -21q58 108 106.5 150t117.5 42q50 0 76.5 -22.5 t26.5 -54.5q0 -41 -24.5 -74.5t-63.5 -53.5t-78.5 -31t-77.5 -14l-43 -79l3 -1q42 43 91 66t90 23q45 0 73 -18.5t28 -52.5q0 -39 -49 -117l-105 -171q-17 -25 -17 -43q0 -20 17 -20q67 0 220 178zM442 509l1 -1q125 31 125 117q0 12 -6 18t-12 6q-22 0 -41.5 -24 t-66.5 -116z" />
+<glyph unicode="&#x1d4f2;" horiz-adv-x="558" d="M534 633q0 -26 -18.5 -44t-45.5 -18t-45 19t-18 47q0 24 19 42.5t43 18.5q27 0 46 -19t19 -46zM450 205l36 -28q-80 -106 -132 -148.5t-117 -42.5q-47 0 -75 24.5t-28 67.5q0 8 1 17t2 16t4 17t5 16t7 17l7 17q3 5 10 18l10 19q2 5 10.5 20.5t11.5 21.5l49 91 q-53 -29 -115 -29q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h118l-164 -316q-19 -36 -19 -69q0 -12 6 -20.5t15 -8.5q48 0 188 169z" />
+<glyph unicode="&#x1d4f3;" horiz-adv-x="840" d="M823 633q0 -26 -18.5 -44t-45.5 -18t-45 19t-18 47q0 24 19 42.5t43 18.5q27 0 46 -19t19 -46zM710 450l-276 -518q25 -12 73 -12q56 0 110 35l20 -41q-60 -44 -141 -44q-49 0 -89 14q-90 -107 -238 -107q-60 0 -94 22.5t-34 54.5t29.5 58t70.5 42q39 15 121 15 q25 0 75 -8l207 387q-53 -29 -126 -29q-53 0 -96 22l12 43q36 -15 82 -15q64 0 111 26t71 55h112zM310 -90q-30 9 -63 9q-43 -1 -74 -16t-32 -46q0 -30 40 -30q74 0 129 83z" />
+<glyph unicode="&#x1d4f4;" horiz-adv-x="810" d="M694 209l36 -28q-82 -105 -139 -150t-122 -45q-44 0 -72.5 19t-28.5 53q0 28 18.5 62.5t18.5 58.5q0 36 -47 39l18 45q80 8 132 46t52 79q0 20 -23 20q-59 0 -150.5 -96t-177.5 -255l-31 -57h-123l249 458q-82 17 -133 80l31 33q56 -52 129 -64q58 108 106.5 150 t117.5 42q46 0 74.5 -20.5t28.5 -51.5q0 -53 -43 -94.5t-96 -60.5t-105 -23l-43 -79l3 -1q89 89 191 89q41 0 68 -20t27 -47q0 -48 -62.5 -94t-147.5 -60v-3q55 -37 55 -81q0 -21 -16.5 -49.5t-16.5 -45.5q0 -7 5.5 -14.5t13.5 -7.5q65 0 203 173zM442 509l1 -1 q125 31 125 117q0 12 -6 18t-12 6q-22 0 -41.5 -24t-66.5 -116z" />
+<glyph unicode="&#x1d4f5;" horiz-adv-x="650" d="M43 429l26 38q28 -19 69 -35t59 -18q195 285 325 285q47 0 78.5 -21.5t31.5 -63.5q0 -56 -34.5 -107t-93.5 -87q-90 -56 -208 -65l-58 -100q-21 -36 -46 -94.5t-25 -91.5t25 -33q29 0 79.5 38t114.5 124l36 -27q-70 -99 -128.5 -142t-121.5 -43q-52 0 -82 31t-30 90 q0 97 103 255q-26 6 -64 27.5t-56 39.5zM333 421l1 -1q83 19 145.5 72t62.5 129q0 28 -25 28q-62 0 -184 -228z" />
+<glyph unicode="&#x1d4f6;" horiz-adv-x="1137" d="M1021 214l36 -28q-73 -101 -140 -150.5t-143 -49.5q-41 0 -65.5 25.5t-24.5 57.5q0 64 46 129l108 152q17 23 17 43t-23 20q-59 0 -148 -97.5t-176 -258.5l-31 -57h-123l203 357q12 21 12 37q0 19 -20 19q-60 0 -150.5 -98t-176.5 -258l-31 -57h-123l187 348 q-52 -29 -114 -29q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h114l-41 -79l3 -1q43 43 92 67.5t89 24.5q45 0 73 -19.5t28 -54.5q0 -8 -3 -18h3q43 43 92.5 67.5t89.5 24.5q46 0 75 -19.5t29 -54.5q0 -39 -49 -117l-105 -172q-17 -25 -17 -43q0 -20 16 -20 q68 0 221 178z" />
+<glyph unicode="&#x1d4f7;" horiz-adv-x="851" d="M735 214l36 -28q-73 -101 -140 -150.5t-143 -49.5q-41 0 -65.5 25.5t-24.5 57.5q0 64 46 129l108 156q17 24 17 43q0 16 -20 16q-60 0 -150.5 -98t-176.5 -258l-31 -57h-123l187 348q-52 -29 -114 -29q-53 0 -96 22l12 43q36 -15 81 -15q105 0 173 81h114l-41 -79l3 -1 q43 43 92 67.5t89 24.5q45 0 73 -19.5t28 -54.5q0 -38 -49 -117l-105 -172q-17 -25 -17 -43q0 -20 18 -20q66 0 219 178z" />
+<glyph unicode="&#x1d4f8;" horiz-adv-x="848" d="M757 232l23 -39q-46 -31 -99 -31q-36 0 -63 9q-62 -99 -143 -148q-61 -37 -131 -37q-65 0 -104 31.5t-39 92.5q0 54 24 113q-43 -20 -96 -20q-51 0 -94 22l12 43q36 -15 80 -15q97 0 163 71q64 69 137 104q71 34 148 34q51 0 79 -28.5t28 -79.5q0 -67 -35 -131 q12 -11 38 -11q17 0 25 0.5t20.5 5t26.5 14.5zM626 371q0 41 -47 41q-53 0 -116.5 -59.5t-105 -136t-41.5 -127.5q0 -53 46 -53q58 0 113 48t96 114q-30 27 -30 75q0 37 25 64.5t60 33.5z" />
+<glyph unicode="&#x1d4f9;" horiz-adv-x="885" d="M453 371l3 -1q43 43 92 67.5t89 24.5q133 0 133 -123q0 -70 -47 -150.5t-97 -116.5q67 -42 111 -110l-37 -27q-61 69 -123 101q-76 -50 -147 -50q-44 0 -65.5 14t-21.5 36q0 31 36.5 59.5t87.5 29.5q37 0 65 -9q45 32 79 92q44 79 44 151q0 54 -47 54q-58 0 -143 -96 t-174 -260l-143 -262h-123l299 552q-53 -28 -114 -28q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h114z" />
+<glyph unicode="&#x1d4fa;" horiz-adv-x="913" d="M802 224l31 -31q-55 -59 -220 -213q-64 -60 -116 -115t-63 -70h-123l127 237h-2q-67 -46 -143 -46q-50 0 -83.5 30.5t-33.5 79.5q0 58 32 120q-39 -13 -77 -13q-54 0 -96 23l12 43q35 -16 82 -16q80 0 148 57q61 65 141.5 108.5t141.5 43.5q60 0 88 -30h2l10 18h121 l-251 -468l1 -1zM594 377q0 36 -30 36q-36 0 -86 -37t-101 -109q-86 -124 -86 -194q0 -16 8 -26.5t21 -10.5q29 0 56 13.5t66 49.5q61 57 106.5 139t45.5 139z" />
+<glyph unicode="&#x1d4fb;" horiz-adv-x="677" d="M636 333l12 -43q-27 -14 -67 -14q-63 0 -88 28l-248 -193l-59 -111h-123l187 348q-52 -29 -114 -29q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h120l-113 -211l1 -1l150 112q-2 14 -2 19q0 42 31.5 67.5t72.5 25.5q50 0 73 -27l-101 -90q17 -19 58 -19q26 0 40 7z " />
+<glyph unicode="&#x1d4fc;" horiz-adv-x="562" d="M139 240l-19 41q38 15 59.5 25.5t57.5 37.5t67 64q-4 5 -8.5 25t-4.5 27q0 52 28.5 74.5t56.5 22.5q24 0 37 -15.5t13 -36.5q0 -25 -12.5 -56t-36.5 -52l19 -25q14 -19 20.5 -30t15.5 -29.5t13 -40t4 -46.5q0 -59 -35.5 -115t-89.5 -90q-57 -35 -140 -35 q-52 0 -92.5 24.5t-40.5 72.5q0 35 20.5 59t46.5 24q21 0 40 -11.5t19 -34.5q0 -19 -8.5 -27.5t-17.5 -14t-9 -16.5q0 -26 35 -26q63 0 110 66t47 176q0 19 -9 71q-71 -71 -186 -109z" />
+<glyph unicode="&#x1d4fd;" horiz-adv-x="618" d="M612 538l-22 -50h-145l-185 -354q-20 -40 -20 -69t21 -29q26 0 70 41t124 137l36 -28q-86 -112 -137.5 -156t-116.5 -44q-47 0 -72 24.5t-25 67.5q0 39 14 75.5t48 101.5l32 61h-2q-59 -55 -181 -66l-4 46q78 6 148.5 50.5t109.5 102.5l21 39h-101l22 50h102l70 131h120 l-69 -131h142z" />
+<glyph unicode="&#x1d4fe;" horiz-adv-x="842" d="M726 208l36 -28l-56 -71q-15 -19 -44 -50t-47.5 -41.5t-46.5 -19.5t-61 -9q-41 0 -66.5 24.5t-25.5 60.5v8h-1q-43 -47 -83 -71.5t-101 -24.5q-44 0 -72 25.5t-28 70.5q0 59 46 144l66 122q-53 -29 -115 -29q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h120 l-163 -309q-24 -45 -24 -78q0 -27 23 -27q66 0 151.5 111.5t174.5 302.5h120l-166 -319q-18 -34 -18 -62q0 -30 23 -30q48 0 188 169z" />
+<glyph unicode="&#x1d4ff;" horiz-adv-x="732" d="M659 224l11 -44q-27 -13 -60 -13q-45 0 -70 13q-67 -98 -135 -146t-150 -48q-52 0 -82.5 27t-30.5 78q0 57 59 166l49 90q-53 -28 -114 -28q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h118l-161 -308q-21 -38 -21 -73q0 -13 10 -23t23 -10q60 0 117 51t95 119 q-23 42 -23 92q0 69 31.5 114.5t75.5 45.5q47 0 47 -72q0 -35 -15 -80t-35 -74q19 -15 52 -15q18 0 39 7z" />
+<glyph unicode="&#x1d500;" horiz-adv-x="1012" d="M939 224l11 -44q-27 -13 -60 -13q-45 0 -70 13q-67 -98 -135 -146t-150 -48q-47 0 -77.5 24t-35.5 68h-1q-50 -49 -87.5 -70.5t-95.5 -21.5q-44 0 -71.5 25.5t-27.5 70.5q0 59 46 144l66 122q-53 -29 -115 -29q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h120 l-164 -309q-23 -43 -23 -75q0 -12 6.5 -21t15.5 -9q66 0 149.5 111t173.5 303h120l-162 -308q-20 -37 -20 -73q0 -13 10 -23t23 -10q60 0 117 51t95 119q-23 42 -23 92q0 68 31.5 114t75.5 46q47 0 47 -72q0 -35 -15 -80t-35 -74q19 -15 52 -15q18 0 39 7z" />
+<glyph unicode="&#x1d501;" horiz-adv-x="820" d="M140 234l-38 29q88 110 153.5 153t134.5 43q63 0 99 -55q58 58 139 58q51 0 81.5 -23t30.5 -65q0 -36 -21 -60.5t-55 -24.5q-21 0 -36 12t-15 36q0 15 5.5 24t12.5 12.5t12.5 9t5.5 12.5q0 17 -24 17q-40 0 -79.5 -44.5t-65 -104t-41.5 -113.5t-16 -78q0 -33 30 -33 q41 0 103 42.5t136 134.5l35 -30q-103 -131 -196 -175q-48 -22 -99 -22q-85 0 -109 55q-73 -58 -146 -58q-54 0 -84 27.5t-30 69.5q0 33 20.5 57t53.5 24q21 0 37 -12t16 -36q0 -19 -9 -28.5t-18 -15.5t-9 -17q0 -8 8 -13.5t17 -5.5q51 0 104 70.5t83 147t30 111.5 q0 44 -31 44q-41 0 -90 -35.5t-135 -139.5z" />
+<glyph unicode="&#x1d502;" horiz-adv-x="784" d="M711 450l-272 -519q25 -12 73 -12q58 0 110 34l20 -40q-60 -44 -141 -44q-49 0 -89 14q-90 -107 -238 -107q-60 0 -94 23t-34 54q0 32 29.5 58t70.5 42q39 15 121 15q25 0 75 -8l45 85h-2q-34 -30 -66.5 -44.5t-80.5 -14.5q-44 0 -72 25.5t-28 70.5q0 57 47 144l66 122 q-53 -29 -115 -29q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h120l-164 -309q-24 -45 -24 -75q0 -12 7 -21t16 -9q66 0 154 112.5t176 301.5h120zM315 -91q-30 9 -63 9q-43 -1 -74 -16t-32 -46q0 -30 40 -30q74 0 129 83z" />
+<glyph unicode="&#x1d503;" horiz-adv-x="782" d="M665 224l37 -26q-58 -82 -93 -118q-47 -49 -91.5 -70t-98.5 -21q-76 0 -76 55q0 17 12.5 36.5t12.5 31.5q0 13 -20 13q-22 0 -45.5 -14t-71.5 -52q-57 -73 -127 -73q-22 0 -32.5 10.5t-10.5 25.5q0 35 41.5 67t108.5 44l230 189v1q-27 -7 -57 -7q-55 0 -89 16 q-76 -91 -200 -108l-12 39q35 8 54.5 14.5t50.5 24.5t53 45q-45 29 -45 72q0 33 20.5 53.5t53.5 20.5q30 0 47.5 -18t17.5 -42q0 -29 -10 -52q30 -15 76 -15q55 0 95 20q50 77 118 77q20 0 33.5 -9.5t13.5 -26.5q0 -24 -23 -45q-33 -30 -105 -47l-196 -162l1 -1q21 3 38 3 q47 0 75 -18t28 -43q0 -15 -10.5 -34.5t-10.5 -26.5q0 -12 13 -12q30 0 85.5 50t108.5 133z" />
+<glyph unicode="&#x1d504;" horiz-adv-x="785" d="M742 65l-148 -87h-14q-31 18 -48 54t-20 71l-235 -125q-30 37 -86.5 74.5t-99.5 51.5v14q245 95 245 328q0 118 -30 174q-24 44 -83 44q-32 0 -54.5 -17.5t-22.5 -50.5q0 -25 18 -51.5t39.5 -45.5t39.5 -48.5t18 -61.5q0 -52 -52.5 -95.5t-113.5 -57.5l-9 22 q26 8 50.5 32.5t24.5 53.5q0 27 -18 51.5t-39 41t-39 44t-18 58.5q0 72 53.5 114t131.5 42q106 0 167.5 -64.5t61.5 -147.5q0 -77 -28.5 -135.5t-72.5 -97t-125 -90.5v-1q19 -9 39 -22.5t29.5 -21t32.5 -27.5t27 -23l149 71v293q0 129 -8 180l227 84l7 -28q-31 -9 -52 -22.5 t-32.5 -27.5t-17 -38t-6.5 -43.5t-1 -54.5v-355q0 -30 12 -45.5t30 -15.5q15 0 31 9l27 14z" />
+<glyph unicode="&#x1d505;" horiz-adv-x="822" d="M644 408v-2q62 -25 96 -77t34 -112q0 -101 -95 -171t-227 -70q-63 0 -102.5 11t-74.5 38l-25 20q-15 13 -22.5 18.5t-21 10.5t-28.5 5q-81 0 -110 -49l-20 14q32 51 78.5 90.5t100.5 39.5h10q103 55 103 257q0 107 -32 170t-82 63q-30 0 -48 -19.5t-18 -47.5 q0 -26 12 -44.5t28 -30.5l34 -26q17 -14 29 -38t12 -57q0 -50 -49.5 -94t-116.5 -60l-9 22q27 9 51 30.5t24 50.5q0 30 -11.5 47t-35.5 36q-23 19 -34.5 30.5t-22 32t-10.5 44.5q0 72 53.5 113.5t131.5 41.5q57 0 103.5 -25.5t74.5 -65.5h2l127 100q93 0 144.5 -43.5 t51.5 -105.5q0 -108 -105 -147zM632 531q0 34 -24.5 65t-68.5 31q-27 0 -43.5 -10.5t-49.5 -43.5q19 -54 19 -108q0 -43 -10 -86q51 2 87.5 16t55 37t26.5 47t8 52zM282 163v-3q21 -6 41 -16.5t31.5 -19t29.5 -23.5l25 -21q72 -55 115 -55q64 0 97 48.5t33 125.5 q0 64 -50.5 106.5t-117.5 42.5q-20 0 -40 -6q-22 -61 -57 -97.5t-107 -81.5z" />
+<glyph unicode="&#x1d507;" horiz-adv-x="868" d="M227 361v-24q-26 -4 -35 -4q-64 0 -103 37.5t-39 98.5q0 98 88.5 162t217.5 64q116 0 221 -51.5t172.5 -148t67.5 -214.5q0 -129 -87 -213q-95 -92 -264 -92q-59 0 -107.5 25t-88.5 50t-78 25q-64 0 -109 -46l-18 13q83 133 181 133q36 0 71 -14t63 -34l56 -40 q27 -20 58.5 -34t62.5 -14q97 0 156.5 62.5t59.5 162.5q0 109 -102.5 198.5t-234.5 108.5q-35 -35 -35 -60q0 -21 18.5 -43t41 -39t41 -45t18.5 -60q0 -52 -47 -93t-108 -41q-37 0 -68 16l10 21q20 -10 41 -10q28 0 46 17t18 45t-35 63l-11 11l-12 12q-4 3 -11 11t-10.5 15 t-7.5 16.5t-6 21t-2 25.5q0 24 24.5 61.5t55.5 61.5v2q-32 7 -78 7q-79 0 -142.5 -40t-63.5 -112q0 -33 22 -54.5t63 -21.5q20 0 29 2z" />
+<glyph unicode="&#x1d508;" horiz-adv-x="729" d="M662 678l16 -16q-2 -3 -18 -24t-25 -31t-25.5 -25.5t-33 -22.5t-34.5 -7q-69 0 -108 46q-39 -37 -39 -71q0 -55 77 -128q62 87 121 87q35 0 68 -24v-123h-22q-33 72 -80 72q-32 0 -65 -34v-2q43 -47 43 -107q0 -52 -49 -93.5t-109 -41.5q-40 0 -67 15l11 22 q19 -11 40 -11q28 0 46 14.5t18 44.5q0 33 -18 69t-40 61.5t-40 59.5t-18 65q0 41 39.5 87.5t146.5 134.5q57 -54 92 -54t73 37zM627 173l20 -12q-41 -79 -111 -132t-163 -53q-63 0 -117 22.5t-91.5 60t-63.5 87t-38.5 103t-12.5 107.5q0 60 14 116t42.5 105t79.5 78.5 t117 29.5q60 0 95 -37l-16 -19q-27 17 -64 17q-48 0 -83.5 -40t-51.5 -94.5t-16 -112.5q0 -62 13.5 -118.5t41.5 -106.5t77 -79.5t114 -29.5q115 0 214 108z" />
+<glyph unicode="&#x1d509;" horiz-adv-x="767" d="M695 675l21 -6q-52 -195 -172 -195q-12 0 -26 3q-55 -59 -55 -135q0 -7 2.5 -14.5t4.5 -12t8 -11.5l8 -10q2 -3 9.5 -11t8.5 -9q62 87 121 87q38 0 68 -25v-122h-22q-33 72 -80 72q-23 0 -65 -40q29 -28 42.5 -42.5t34.5 -43.5t30.5 -61.5t9.5 -71.5q0 -94 -84 -162.5 t-194 -68.5t-188 50.5t-78 139.5q0 47 38 105t38 88q0 16 -10.5 25.5t-27.5 9.5q-18 0 -36.5 -16.5t-27.5 -42.5l-23 6q12 43 41.5 75.5t83.5 32.5q51 0 80 -30t29 -69q0 -37 -34.5 -97t-34.5 -103q0 -60 45 -98t103 -38q70 0 116.5 40t46.5 114q0 43 -16.5 80.5t-39.5 63.5 l-46 50q-23 24 -39.5 51t-16.5 56q0 92 116 198v3q-45 18 -82 41q-33 21 -52 31.5t-51.5 21.5t-62.5 11q-41 0 -75.5 -31.5t-34.5 -82.5q0 -59 35.5 -86.5t85.5 -27.5q15 0 45 4v-24q-28 -6 -58 -6q-77 0 -126.5 45t-49.5 111q0 79 62 138.5t158 59.5q43 0 85.5 -13.5 t67 -27.5t60.5 -38q62 -42 110 -42q20 0 47.5 26.5t46.5 74.5z" />
+<glyph unicode="&#x1d50a;" horiz-adv-x="806" d="M613 428v-3q62 -12 102 -53.5t40 -99.5q0 -115 -97 -205q-99 -91 -259 -91q-156 0 -252.5 107t-96.5 260q0 95 25 169.5t85 123.5t149 49q49 0 81 -30l-14 -22q-19 15 -60 15q-141 0 -141 -296q0 -65 13 -122t40.5 -107t78 -79.5t118.5 -29.5q103 0 158 65t55 172 q0 140 -80 140q-31 0 -73 -27v-2q62 -65 62 -124q0 -53 -47 -93.5t-108 -40.5q-40 0 -69 15l11 22q22 -11 40 -11q28 0 45.5 17t17.5 46q0 46 -60 120q-38 46 -54.5 80t-16.5 73q0 34 17.5 68t49 64.5t57.5 51.5t62 45l15 -18l-19 -19l-22 -20l-18.5 -21t-18.5 -24l-14 -23 q-8 -13 -11 -25.5t-3 -24.5q0 -29 18.5 -68.5t40.5 -61.5q40 15 78.5 44.5t38.5 58.5q0 7 -16.5 33.5t-16.5 50.5q0 55 115 118l13 -17q-31 -24 -31 -60q0 -18 27 -46.5t27 -50.5q0 -54 -82 -93z" />
+<glyph unicode="&#x1d50d;" horiz-adv-x="772" d="M688 660l23 -7q-41 -153 -174 -153q-39 0 -75 15t-59.5 32.5t-58.5 32.5t-73 15q-44 0 -80.5 -28.5t-36.5 -84.5q0 -45 31 -71t75 -26q30 0 61 14l8 -23q-37 -19 -77 -19q-72 0 -119 40.5t-47 110.5q0 84 60 135.5t157 51.5q51 0 93 -15t66 -32.5t59.5 -32.5t73.5 -15 q63 0 93 60zM721 362l-23 -10q-30 59 -98 59q-22 0 -43 -18.5t-21 -48.5q0 -35 31 -89t62.5 -115t31.5 -112q0 -94 -84 -163t-194 -69q-129 0 -196 53q-53 41 -53 119q0 12 8.5 45t8.5 47q0 29 -27 29q-30 0 -51 -44l-23 6q14 47 48.5 80t78.5 33q53 0 75 -26t22 -65 q0 -21 -10 -58t-10 -55q0 -50 32 -88t107 -38q65 0 105.5 43.5t40.5 109.5q0 36 -17.5 77.5t-38.5 73t-38.5 76t-17.5 87.5q0 63 48 109.5t102 46.5q105 0 144 -95z" />
+<glyph unicode="&#x1d50e;" horiz-adv-x="846" d="M785 113l16 -20q-25 -24 -78.5 -61.5t-87.5 -53.5h-14q-61 37 -89 108q-7 20 -16 62t-16 71t-26.5 53t-48.5 24q-13 0 -45 -13v-1q34 -39 34 -80q0 -45 -37.5 -92.5t-139.5 -131.5q-18 14 -62.5 38t-57.5 28q-34 -33 -46 -53l-21 14l104 147l76 -45q56 -33 59 -33 q11 10 16 16t9.5 18t4.5 28q0 21 -24.5 54.5t-54 65t-54 81.5t-24.5 102q0 121 90 188.5t216 67.5q103 0 181 -57.5t99 -140.5l-22 -7q-34 78 -104 119.5t-152 41.5q-79 0 -141 -40t-63 -119q0 -46 22 -77h2q4 66 50.5 116t112.5 50q81 0 131 -47q15 -14 32.5 -49t36 -61 t42.5 -30v-14l-167 -49v-3q76 -43 109 -152q14 -45 37 -76t40 -31q8 0 34 16t37 28zM604 382v2q-64 18 -97 82q-36 71 -79 71q-49 0 -80.5 -48t-31.5 -105q0 -27 13 -40l30 -36z" />
+<glyph unicode="&#x1d50f;" horiz-adv-x="669" d="M605 141l21 -8q-19 -63 -59 -110t-101 -47q-48 0 -100 24l-100 50q-47 24 -84 24q-86 0 -112 -78l-23 7q12 60 58.5 114.5t114.5 56.5q29 31 29 71q0 25 -14.5 49t-35.5 45t-41.5 44t-35 54.5t-14.5 67.5q0 81 79.5 135.5t173.5 54.5q89 0 167 -47t78 -123 q0 -44 -19.5 -81t-39 -66t-19.5 -55q0 -69 86 -95l-9 -22q-63 5 -119.5 43t-56.5 86q0 59 35 115.5t35 105.5q0 52 -37.5 76.5t-90.5 24.5q-63 0 -109 -26t-46 -85q0 -32 20 -65.5t44 -57t44 -53.5t20 -57t-16.5 -56.5t-31 -45t-37.5 -37.5q57 -9 136 -53.5t113 -44.5 q65 0 97 65z" />
+<glyph unicode="&#x1d510;" horiz-adv-x="1083" d="M1012 105l19 -16q-20 -27 -59.5 -61.5t-71.5 -49.5h-14q-98 34 -98 202q0 94 50 183.5t118 130.5v2q-41 7 -64 25t-29 39t-10.5 41t-18 33.5t-41.5 13.5q-32 0 -57.5 -29.5t-25.5 -69.5q9 -48 9 -116q0 -76 -10 -130t-45 -120q-58 -107 -147 -205q-7 4 -43 29t-53 33 q-22 -18 -45 -49l-22 14l94 145q6 -4 28.5 -20.5t41.5 -29t24 -12.5q52 0 52 323q0 161 -14 198q-14 39 -61 39q-31 0 -55 -28t-24 -58v-123q0 -78 -9.5 -132t-45.5 -122q-59 -112 -147 -207q-8 4 -36 21t-49 28.5t-27 12.5q-18 -9 -44 -49l-22 14l94 145q103 -62 110 -62 q18 0 29.5 30.5t15.5 89.5t5 97t1 100v39q0 15 -2 45t-5.5 50.5t-11 46t-17.5 41t-26.5 26.5t-36.5 11q-30 0 -48.5 -20t-18.5 -47t12 -47t29 -33l33 -27q17 -13 29 -35.5t12 -53.5q0 -50 -49.5 -94t-116.5 -60l-9 22q27 9 51 30.5t24 50.5q0 30 -18 55t-39 39.5t-39 39.5 t-18 56q0 72 53.5 113.5t131.5 41.5q55 0 104 -24.5t76 -66.5h2q17 36 54 61.5t78 25.5q98 0 142 -87h2q20 38 54.5 62.5t75.5 24.5q95 0 127 -67q6 -13 13.5 -36.5t12.5 -37t18 -25.5t33 -14v-14q-75 -34 -98.5 -105.5t-23.5 -183.5q0 -153 36 -153q26 1 71 50z" />
+<glyph unicode="&#x1d511;" horiz-adv-x="827" d="M775 511v-14q-75 -34 -99.5 -106t-24.5 -183q0 -153 31 -153q25 0 71 50l19 -16q-20 -27 -59.5 -61.5t-71.5 -49.5h-14q-52 18 -72.5 69.5t-20.5 132.5q0 93 49.5 183t113.5 131v2q-69 11 -90 58q-5 11 -10 32.5t-9 33t-19.5 21t-41.5 9.5q-32 0 -60 -30t-28 -71 q10 -88 10 -149q0 -109 -55 -215q-59 -112 -147 -207q-99 59 -121 62q-27 -23 -44 -49l-22 14l94 145q103 -62 119 -62q18 0 29.5 30.5t15.5 89.5t5 97t1 100q0 259 -108 259q-30 0 -48.5 -20t-18.5 -47t12 -47t29 -33l33 -27q17 -13 29 -35.5t12 -53.5q0 -50 -49.5 -94 t-116.5 -60l-9 22q27 9 51 30.5t24 50.5q0 24 -11.5 43.5t-28.5 34.5l-34 30q-17 15 -28.5 36t-11.5 46q0 72 53.5 113.5t131.5 41.5q56 0 108 -24.5t78 -66.5h2q20 44 60 66.5t87 22.5q33 0 68 -14q27 -11 41.5 -31.5t19.5 -42t10.5 -42t21 -35t44.5 -17.5z" />
+<glyph unicode="&#x1d512;" horiz-adv-x="837" d="M55 14l-18 13q18 44 54.5 84t78.5 56q27 41 27 85q0 29 -18.5 58t-40 50t-40 55t-18.5 72q0 58 39 114t93 94q24 -25 74 -25q26 0 65 10.5t62 10.5q136 0 235 -84q65 -55 101.5 -135.5t36.5 -177.5q0 -61 -22.5 -122.5t-64.5 -101.5q-97 -94 -264 -94q-46 0 -87.5 15.5 t-66.5 34.5t-57 34.5t-63 15.5q-58 0 -106 -62zM742 277q0 135 -86 224.5t-216 89.5q-17 0 -62 -7t-60 -7q-79 0 -108 70q-41 -26 -41 -108q0 -29 12.5 -54.5t30.5 -44.5l36 -40q19 -20 31.5 -46t12.5 -55q0 -58 -76 -123q44 0 87.5 -21t74 -47t71 -47t77.5 -21q96 0 156 68 t60 169z" />
+<glyph unicode="&#x1d513;" horiz-adv-x="823" d="M769 521v-16q-67 -12 -67 -95q0 -33 18 -71.5t35.5 -82t17.5 -91.5q0 -69 -75 -129t-148 -60q-64 0 -114 22v-202h-117v235q-24 21 -56 21q-72 0 -114 -75l-20 9q8 30 20 56.5t32 53.5t50 42.5t67 15.5q14 0 21 -1v250q0 138 -30 197q-33 64 -83 64q-30 -1 -48.5 -20.5 t-18.5 -45.5q0 -27 12 -47.5t29 -34.5l33 -27q17 -14 29 -36.5t12 -53.5q0 -51 -50 -99t-116 -64l-9 22q25 8 50 34.5t25 55.5t-18 53.5t-39 40.5t-39 42t-18 57q0 71 53.5 112.5t132.5 41.5q63 0 112 -24.5t74 -65.5h2q21 46 55 67t88 21q46 0 75 -16t42 -39.5t22.5 -47.5 t27 -44t45.5 -25zM695 503v2q-42 4 -67.5 20t-35.5 36.5t-17 41t-20 34t-37 13.5q-32 0 -51.5 -23.5t-25 -51t-5.5 -61.5v-379q19 -14 43 -44.5t45.5 -48.5t49.5 -18q34 0 63.5 23t29.5 73q0 34 -41 114t-41 130q0 40 28.5 78t81.5 61z" />
+<glyph unicode="&#x1d514;" horiz-adv-x="865" d="M798 36l16 -13q-46 -87 -122 -87q-33 0 -57 19.5t-36 49.5q-74 -29 -164 -29q-46 0 -87.5 15.5t-66.5 34.5t-57 34.5t-63 15.5q-58 0 -106 -62l-18 13q18 44 54.5 84t78.5 56q27 41 27 85q0 29 -18.5 58t-40 50t-40 55t-18.5 72q0 58 39 114t93 94q24 -25 74 -25 q26 0 65 10.5t62 10.5q136 0 235 -84q65 -55 101.5 -135.5t36.5 -177.5q0 -61 -23 -122.5t-65 -103.5q16 -66 41 -66q35 0 59 34zM491 124l-16 16q34 63 101 63q40 0 68.5 -26.5t33.5 -72.5q64 67 64 173q0 135 -86 224.5t-216 89.5q-17 0 -62 -7t-60 -7q-79 0 -108 70 q-41 -26 -41 -108q0 -29 12.5 -54.5t30.5 -44.5l36 -40q19 -20 31.5 -46t12.5 -55q0 -58 -76 -123q44 0 87.5 -21t74 -47t71 -47t77.5 -21q30 0 59 8v1l-7 27q-6 19 -9.5 27t-9.5 19.5t-14 16t-19 4.5q-16 0 -35 -19z" />
+<glyph unicode="&#x1d516;" horiz-adv-x="856" d="M440 459l-11 -17q-33 14 -61 14q-41 0 -64 -29t-23 -70q0 -31 22 -54t54 -23q14 0 24.5 2.5t21.5 10.5t16.5 12.5t18.5 17.5l18 18q86 83 171 83q70 0 122 -47t52 -131q0 -115 -101 -192.5t-238 -77.5q-182 0 -294.5 112.5t-112.5 278.5q0 79 42 154t119.5 124.5 t167.5 49.5q60 0 106.5 -17t84.5 -34t76 -17q49 0 110 58l18 -13q-29 -55 -73.5 -98.5t-100.5 -43.5q-61 0 -144 32.5t-126 32.5q-107 0 -174.5 -62.5t-67.5 -163.5q0 -140 98.5 -204t267.5 -64q34 0 54.5 0.5t56.5 3.5t59 8t51 16t44 26t27.5 39t11.5 54q0 48 -32 79 t-81 31q-27 0 -52.5 -18.5t-47.5 -44.5t-47 -52t-62.5 -44.5t-83.5 -18.5q-61 0 -103.5 50t-42.5 108q0 60 43.5 104t100.5 44t85 -27z" />
+<glyph unicode="&#x1d517;" horiz-adv-x="766" d="M684 667l21 -6q-8 -29 -18.5 -54t-30.5 -56t-51.5 -49t-71.5 -18q-36 0 -92 29q-22 -17 -22 -56q0 -16 16.5 -34.5t35.5 -33t35.5 -36.5t16.5 -44q0 -56 -40.5 -86.5t-104.5 -30.5q-37 0 -68 16l10 21q17 -10 36 -10q24 0 40.5 17.5t16.5 44.5q0 22 -31 69t-31 77 q0 39 60 100l-1 3q-32 22 -50 32.5t-51.5 21.5t-67.5 11q-45 0 -83.5 -33.5t-38.5 -85.5q0 -57 32.5 -90t79.5 -35v-24q-77 0 -130.5 47.5t-53.5 112.5q0 85 62 146.5t158 61.5q107 0 216 -73q56 -38 107 -38q23 0 49 18t45 65zM705 126l17 -16q-28 -43 -54 -69.5 t-69.5 -45.5t-99.5 -19q-59 0 -110 21t-94 42t-80 21q-28 0 -62.5 -15.5t-56.5 -52.5l-18 13q26 70 74 112.5t107 42.5q55 0 111 -24l110 -48q53 -24 100 -24q42 0 69.5 14t55.5 48z" />
+<glyph unicode="&#x1d518;" horiz-adv-x="787" d="M744 65l-148 -87h-14q-32 19 -48.5 55t-19.5 72l-262 -127q-32 36 -94 75t-108 51v14q29 13 47.5 24.5t41.5 35t35 61t12 88.5v224q0 29 -11.5 44.5t-29.5 15.5q-30 0 -73 -30l-14 25l164 90h15q36 -17 55 -62t19 -79v-147q0 -77 -28 -124t-107 -112q27 -10 79 -47.5 t83 -64.5l176 80v290q0 129 -8 180l227 86l7 -28q-31 -9 -52 -22.5t-32.5 -28t-17 -39t-6.5 -44t-1 -54.5v-356q0 -30 12 -45.5t30 -15.5q15 0 31 9l27 14z" />
+<glyph unicode="&#x1d519;" horiz-adv-x="831" d="M777 521v-16q-67 -12 -67 -94q0 -40 35.5 -113t35.5 -133q0 -38 -32.5 -80.5t-79.5 -71.5q-59 -37 -172 -37t-186 55q-62 46 -95 46q-37 0 -71.5 -20t-56.5 -61l-18 7q18 72 70 123t108 53q79 45 79 252q0 107 -32 170t-81 63q-31 0 -49 -19.5t-18 -48.5q0 -33 18 -56.5 t39.5 -36t39.5 -39t18 -63.5q0 -51 -50 -99t-116 -64l-9 22q27 9 51 30t24 51q0 25 -11.5 46t-28.5 36l-34 31q-17 15 -28.5 37t-11.5 49q0 72 53.5 113.5t131.5 41.5q114 0 178 -91h2q21 39 58 64t86 25q48 0 78 -15.5t44 -38.5t24.5 -47t28 -44.5t45.5 -26.5zM703 503v2 q-42 4 -68 20t-36.5 36.5t-18 41t-21 34t-38.5 13.5q-29 0 -53 -23.5t-37 -63.5q21 -52 21 -98q0 -38 -5 -69t-20 -70t-47.5 -77t-81.5 -74v-2q30 -2 60 -18.5t54 -38.5l49 -42q24 -21 52.5 -35.5t56.5 -14.5q44 0 74.5 22.5t30.5 73.5q0 32 -41 113t-41 132q0 39 28.5 76.5 t81.5 61.5z" />
+<glyph unicode="&#x1d51a;" horiz-adv-x="1075" d="M1024 521v-17q-36 -4 -53 -30t-17 -63q0 -36 18 -74t35.5 -80.5t17.5 -91.5q0 -32 -26.5 -73.5t-68.5 -71.5q-62 -44 -133 -44q-111 0 -174 54q-61 -54 -161 -54q-41 0 -78.5 15.5t-60.5 34.5t-51.5 34.5t-54.5 15.5q-43 0 -81 -27t-48 -58l-21 6q19 76 68 128.5 t107 53.5q16 9 27.5 20.5t26 37t22.5 72.5t8 113q0 40 -5.5 79t-17.5 77.5t-35 62t-54 23.5q-29 0 -48 -20t-19 -48q0 -25 11.5 -45.5t28.5 -35.5l33 -30q17 -15 28.5 -36.5t11.5 -48.5q0 -54 -50.5 -96.5t-112.5 -56.5l-10 22q26 7 50.5 29.5t24.5 51.5q0 28 -18 52t-39 39 t-39 42t-18 61q0 70 54.5 110.5t136.5 40.5q107 0 171 -89h2q61 87 153 87q60 0 110 -36q70 36 118 36q56 0 89.5 -15.5t46.5 -39t21.5 -47.5t25.5 -44t48 -26zM947 502v2q-40 5 -65 22t-36 37.5t-20 40.5t-24 33t-41 13q-53 0 -92 -50.5t-39 -100.5q0 -39 27 -77l55 -80 q27 -42 27 -89q0 -31 -12 -71t-30 -68q19 -44 58.5 -66.5t78.5 -22.5t62 26t23 54q0 42 -41 127t-41 135q0 38 31 76t79 59zM291 175l1 -1q31 -6 60.5 -23.5t51.5 -38.5l40 -41q20 -20 40 -33t39 -13q53 0 82.5 48.5t29.5 112.5q0 51 -37 100q-57 74 -57 148q0 81 75 168 q-16 26 -32.5 37t-44.5 11q-34 0 -65.5 -26.5t-43.5 -57.5q21 -52 21 -101q0 -88 -32 -155t-128 -135z" />
+<glyph unicode="&#x1d51b;" horiz-adv-x="763" d="M735 668l-94 -146q-18 12 -70 41.5t-55 29.5q-20 -1 -43.5 -61t-23.5 -113v-41q108 0 153 55l17 -9q-26 -68 -60.5 -95.5t-109.5 -27.5v-71q0 -48 39 -98t85 -50q21 0 57 18.5t54 36.5l20 -26l-173 -133h-14q-59 23 -97 53t-68 85q-43 -67 -126 -147q-92 55 -114 58 q-28 -19 -44 -45l-22 14l94 146q18 -11 70.5 -41t55.5 -30q21 0 43.5 61.5t22.5 138.5v30h-46q-63 0 -106 -71l-20 5q18 73 58 108t114 35v41q0 56 -30 111.5t-74 55.5q-27 0 -65 -22t-61 -45l-22 24l86 69l102 83h14q48 -14 87.5 -57.5t59.5 -89.5q62 91 126 147 q100 -57 114 -62q29 24 44 49z" />
+<glyph unicode="&#x1d51c;" horiz-adv-x="766" d="M426 604h2q14 36 45 62.5t71 26.5q47 0 81.5 -25.5t53 -70t27 -97.5t8.5 -116q0 -130 -35.5 -236.5t-93 -184.5t-151.5 -167h-13q-31 33 -58.5 47.5t-66.5 14.5q-77 0 -121 -57l-20 10q60 136 192 136q33 0 67.5 -18.5t58.5 -46.5q116 130 116 493q0 45 -0.5 70.5t-2 63 t-5.5 58.5t-10 42.5t-16.5 31t-24.5 9.5q-34 0 -59.5 -33t-25.5 -67q8 -64 8 -87q0 -58 -12.5 -102t-42 -81t-64 -65t-93.5 -66v-2q85 -36 118 -67l88 35l12 -23l-185 -104q-29 33 -83 59t-105 38v14q58 25 98 50.5t75 62.5t52 88.5t17 119.5q0 127 -30 179q-37 65 -86 65 q-30 0 -48 -20t-18 -48q0 -25 17.5 -52.5t38.5 -48t38.5 -52.5t17.5 -65q0 -52 -53 -98t-114 -59l-8 22q24 8 49.5 35.5t25.5 55.5q0 27 -17.5 53t-38 44.5t-38 47.5t-17.5 60q0 73 54 114.5t136 41.5q52 0 107.5 -23.5t81.5 -67.5z" />
+<glyph unicode="&#x1d51e;" horiz-adv-x="530" d="M479 59l-99 -77h-14q-40 21 -58 78q-73 -45 -152 -78h-14q-47 39 -69 88t-22 121q0 49 18 93t51 71q23 19 77 55t77 58h14q1 -1 25.5 -17t33.5 -20.5t30 -16.5t39.5 -19t38.5 -13v-14q-20 -2 -33 -15.5t-13 -34.5v-220q0 -40 22 -40q14 0 36 19zM307 97v239l-87 53 q-41 -37 -54 -82t-13 -108q0 -57 19.5 -100t51.5 -43q14 0 43.5 14.5t39.5 26.5z" />
+<glyph unicode="&#x1d51f;" horiz-adv-x="513" d="M462 352v-170q0 -28 -25 -59t-52.5 -51.5t-70.5 -49.5t-57 -40h-14q-11 4 -55 23t-74.5 30t-61.5 18v15q4 2 14 5.5t12 4.5t8 4.5t7 6.5t3.5 9t3 13.5t0.5 18.5v388q0 90 -54 151l14 13q51 -36 87 -92q58 105 167 105q17 0 39 -3v-17q-74 0 -112.5 -57.5t-38.5 -130.5 v-86l143 67h14q47 -19 75 -50t28 -66zM360 159v131q0 57 -36 95q-21 21 -31 21q-12 0 -91 -38v-254l113 -53q29 22 37 40.5t8 57.5z" />
+<glyph unicode="&#x1d520;" horiz-adv-x="385" d="M344 384l-84 -56l-61 76q-14 -8 -20 -16q-20 -26 -20 -116v-60q0 -108 26 -142q18 -25 54 -25q42 0 90 26l9 -23l-171 -66h-14q-96 62 -96 214q0 95 24 142t110 100q32 21 74 30h14z" />
+<glyph unicode="&#x1d521;" horiz-adv-x="506" d="M455 346v-155q0 -15 -3 -28t-11 -27l-13 -22q-5 -8 -20 -21.5t-19.5 -18t-23 -20t-21.5 -17.5q-21 -17 -60 -55h-15q-23 13 -74 31.5t-79 18.5h-71v14q20 2 33.5 15.5t13.5 33.5v286q64 18 131 58v3q-29 14 -43.5 22t-41 24.5t-40.5 30.5t-25.5 34t-11.5 41q0 54 51 77.5 t126 23.5v-17q-30 -4 -55 -17.5t-25 -37.5q0 -19 13 -33.5t29 -22.5t49.5 -23.5t55.5 -27.5q79 -44 114.5 -81t35.5 -89zM353 158v155q0 33 -12 55t-24.5 31.5t-42.5 26.5q-23 -8 -58 -28q-14 -8 -18 -16t-4 -34v-226l130 -55q18 18 23.5 38t5.5 53z" />
+<glyph unicode="&#x1d522;" horiz-adv-x="420" d="M379 255l-230 -86q0 -48 37 -86t75 -38q7 0 44.5 14t53.5 22l10 -21l-167 -78h-14q-19 0 -42.5 15.5t-35.5 30.5q-63 73 -63 191q0 88 41.5 141.5t122.5 86.5q28 11 76 21h14zM149 201l112 43q17 7 17 32q0 12 -22.5 67t-34.5 75q-17 -3 -30 -14q-42 -28 -42 -141v-62z " />
+<glyph unicode="&#x1d523;" horiz-adv-x="327" d="M316 389h-113l-29 -598h-59l-29 598h-59v14q12 4 18 7t16.5 10t15.5 19.5t5 29.5q0 14 -3.5 47.5t-3.5 51.5q0 44 21 85t67 41q12 0 35.5 -18t43.5 -18q35 0 55 26l14 -8q-2 -5 -8.5 -23t-12.5 -30t-15 -26.5t-22.5 -22t-29.5 -7.5q-18 0 -44.5 10.5t-36.5 10.5 q-33 0 -33 -39q0 -105 164 -105h43v-55z" />
+<glyph unicode="&#x1d524;" horiz-adv-x="499" d="M414 318v-206q0 -50 23 -94q24 -44 24 -72q0 -72 -61.5 -113.5t-136.5 -41.5q-43 0 -72 9.5t-37.5 17.5t-21.5 25q-9 13 -16 19t-22 11.5t-37 5.5v20q62 25 104 25q52 0 72 -62q5 -17 16.5 -29.5t21.5 -12.5q44 0 67.5 18.5t23.5 68.5q0 28 -22.5 70t-26.5 84h-1 q-71 -44 -157 -79h-14q-90 75 -90 209q0 49 18 93t51 71q23 19 79.5 55.5t79.5 57.5h14l33 -22q26 -17 39.5 -25t39 -20t50.5 -19v-14q-19 -1 -30 -15t-11 -35zM312 97v239l-92 53q-67 -68 -67 -190q0 -58 18.5 -100.5t49.5 -42.5q15 0 48.5 14.5t42.5 26.5z" />
+<glyph unicode="&#x1d525;" horiz-adv-x="528" d="M476 355v-272q0 -77 -49 -157t-124 -135l-14 15q44 51 64.5 96t20.5 124v258q0 68 -36 101q-23 21 -32 21q-11 0 -90 -38v-252l57 -30q3 0 21 21.5t26 33.5l20 -16l-102 -143h-14q-84 57 -176 71v15q36 5 51 16.5t15 43.5v390q0 91 -54 151l14 13q51 -36 87 -92 q60 105 167 105q26 0 39 -3v-17q-73 0 -112 -57.5t-39 -130.5v-86l143 67h14q45 -15 74 -48t29 -65z" />
+<glyph unicode="&#x1d526;" horiz-adv-x="384" d="M230 651q0 -15 -19.5 -50.5t-34.5 -35.5q-17 0 -36 35t-19 51q0 18 15.5 30.5t39.5 12.5t39 -13t15 -30zM338 104l-108 -122h-14q-90 44 -90 142v223q0 32 -18 32q-14 0 -51 -30l-15 22l129 97h14q51 -44 108 -67v-14q-65 -7 -65 -45v-172q0 -50 10 -67t32 -17 q18 0 32 18l16 17z" />
+<glyph unicode="&#x1d527;" horiz-adv-x="345" d="M248 652q0 -15 -19.5 -50.5t-34.5 -35.5q-17 0 -36 35t-19 51q0 18 15.5 30.5t39.5 12.5t39 -13t15 -30zM311 401v-14q-65 -7 -65 -45v-383q0 -78 42 -142l-15 -14q-50 46 -67 75q-18 -32 -55.5 -59.5t-77.5 -27.5q-19 0 -29 3v17q41 0 70.5 40t29.5 116v378q0 32 -18 32 q-11 0 -51 -33l-15 22l129 102h14q51 -44 108 -67z" />
+<glyph unicode="&#x1d528;" horiz-adv-x="420" d="M368 390h-147v-267l67 -30q3 0 23 26.5t28 39.5l20 -17l-106 -160h-14q-94 64 -186 78v15q36 5 51 16.5t15 43.5v255h-71v14q71 13 71 62v52q0 91 -54 151l14 13q51 -36 87 -92q60 105 163 105q26 0 39 -3v-17q-73 0 -110 -57t-37 -131v-42h37v62q0 54 33 80.5t77 26.5 v-109h-14q-7 27 -28 27q-16 0 -27.5 -18.5t-11.5 -48.5v-20h81v-55z" />
+<glyph unicode="&#x1d529;" horiz-adv-x="398" d="M350 124l-114 -142h-14q-84 57 -176 71v15q36 5 51 16.5t15 43.5v390q0 91 -54 151l14 13q51 -36 87 -92q60 105 171 105v-20q-116 -39 -116 -188v-371l62 -32q4 0 25.5 22.5t28.5 33.5z" />
+<glyph unicode="&#x1d52a;" horiz-adv-x="910" d="M856 84l-101 -102h-16q-70 34 -70 142v229l-62 47l-97 -45v-216q0 -57 46 -57v-14q-36 0 -63 -28.5t-27 -64.5h-14q0 36 -27.5 64.5t-62.5 28.5v14q23 0 34.5 16t11.5 41v157q0 60 -25 85q-19 17 -34 17q-18 0 -100 -43v-216q0 -57 46 -57v-14q-36 0 -63 -28.5t-27 -64.5 h-14q0 36 -27 64.5t-63 28.5v14q23 0 34.5 16t11.5 41v205q0 30 -24 30q-17 0 -49 -30l-15 21l110 103h15q53 -22 62 -79l158 79h14q65 -22 84 -81l171 81h14q72 -57 128 -62v-15q-44 -7 -44 -34v-197q0 -51 4.5 -67.5t17.5 -16.5q19 0 32 13l12 13z" />
+<glyph unicode="&#x1d52b;" horiz-adv-x="636" d="M582 85l-101 -103h-16q-70 34 -70 142v231l-50 44l-95 -42v-218q0 -57 46 -57v-14q-36 0 -63 -28.5t-27 -64.5h-14q0 35 -28 64t-62 29v14q23 0 34.5 16t11.5 41v205q0 30 -24 30q-9 0 -17 -4.5t-32 -25.5l-15 21l110 103h15q52 -21 62 -78l166 78h14q25 -22 57.5 -41 t56.5 -21v-15q-44 -8 -44 -42v-189q0 -52 4.5 -68t17.5 -16q19 0 32 13l12 13z" />
+<glyph unicode="&#x1d52c;" horiz-adv-x="503" d="M452 310v-121q0 -69 -114 -153q-26 -19 -61 -54h-14q-34 24 -94 42t-119 18v14q48 17 48 64v255q123 35 204 93h14q24 -10 52.5 -26.5t37.5 -24.5q19 -21 32.5 -52.5t13.5 -54.5zM200 117l118 -51q15 13 22.5 33t8.5 37.5t1 56.5q0 45 -1.5 71t-12.5 59t-31 52 q-22 19 -53 19q-23 0 -52 -29v-248z" />
+<glyph unicode="&#x1d52d;" horiz-adv-x="555" d="M504 350v-171q0 -25 -24 -56t-48 -50.5t-68 -50.5l-55 -40h-15q-17 13 -49 21v-212h-102v232q-18 0 -28.5 -1.5t-28 -11t-31.5 -27.5l-17 11q39 102 105 119v240q0 29 -31.5 69t-31.5 68q0 52 58 96l17 -15q-15 -19 -15 -43q0 -16 14.5 -29t33 -22t36 -28.5t21.5 -47.5 l146 67h14q44 -19 71.5 -50.5t27.5 -67.5zM402 159v131q0 57 -36 95q-22 22 -29 22q-11 0 -92 -39v-256q64 -15 113 -51q28 22 36 40.5t8 57.5z" />
+<glyph unicode="&#x1d52e;" horiz-adv-x="507" d="M459 395h-17q-33 0 -33 -44v-560h-102v266q-97 -55 -150 -75h-15q-47 39 -69 89.5t-22 126.5q0 44 19 88t50 69q25 20 78 56t76 57h14q37 -21 55 -30t49 -18t67 -10v-15zM307 97v245l-87 47q-30 -27 -48.5 -81t-18.5 -103q0 -61 19 -105t52 -44q13 0 45 16t38 25z" />
+<glyph unicode="&#x1d52f;" horiz-adv-x="463" d="M426 387l-73 -74l-66 68l-45 -44v-185q0 -34 10 -41t34.5 -17t30.5 -10q4 0 79 59l15 -17l-142 -144h-14q-76 52 -167 52v14q20 4 36 19t16 33v230q0 22 -11 41.5t-26 19.5q-21 0 -50 -25l-15 21l109 81h14q56 -24 77 -94l95 94h14z" />
+<glyph unicode="&#x1d530;" horiz-adv-x="518" d="M170 519l-19 11q19 45 56 69t79 24q56 0 97.5 -37t41.5 -97q0 -53 -42.5 -97.5t-107.5 -44.5q-57 0 -108 45q-25 -25 -25 -64q0 -35 20.5 -65t49.5 -30q12 0 22.5 4t19.5 13l13 16q5 6 13.5 21t11.5 19q17 27 48 27q37 0 69.5 -26t44.5 -51q15 -28 15 -61 q0 -83 -163 -217h-15q-64 46 -121 46q-58 0 -104 -48l-17 12q66 122 166 122q71 0 129 -52q32 33 32 109q0 37 -19.5 58.5t-48.5 21.5q-14 0 -37 -22.5t-40 -48.5q-19 -29 -51 -29q-51 0 -86.5 37.5t-35.5 93.5q0 80 62 122q24 17 56.5 37.5t45.5 30.5h14q18 -35 57 -35 q27 0 47 22.5t20 55.5q0 38 -25.5 58.5t-60.5 20.5q-66 0 -104 -71z" />
+<glyph unicode="&#x1d531;" horiz-adv-x="374" d="M337 89l-117 -107h-14q-111 58 -161 58v14q36 4 52 19t16 52v275h-75v15q118 39 118 241h59v-200h92v-56h-92v-294l60 -33l44 35z" />
+<glyph unicode="&#x1d532;" horiz-adv-x="647" d="M593 79l-119 -97h-15q-51 20 -62 81l-169 -81h-16q-17 20 -50.5 40t-58.5 22v14q44 8 44 42v245q0 31 -25 31q-9 0 -48 -31l-14 20l109 103h15q34 -14 49.5 -38.5t15.5 -83.5v-252l51 -49l94 44v225q0 58 -46 58v14q36 0 63 28.5t27 63.5h14q0 -35 27.5 -63.5t62.5 -28.5 v-14q-23 0 -34.5 -16t-11.5 -42v-200q0 -41 30 -41q16 0 32 12l20 14z" />
+<glyph unicode="&#x1d533;" horiz-adv-x="515" d="M464 310v-121q0 -69 -114 -153q-8 -6 -28 -24l-33 -30h-14q-34 24 -94 42t-119 18v14q48 17 48 64v233q0 30 -31.5 69.5t-31.5 67.5q0 52 58 96l17 -15q-15 -19 -15 -43q0 -16 13.5 -28.5t30.5 -20.5t34.5 -25.5t23.5 -40.5q64 24 105 55h14q24 -10 52.5 -26.5 t37.5 -24.5q19 -21 32.5 -52.5t13.5 -54.5zM212 117l118 -51q22 18 27 44t5 83q0 45 -1.5 71t-12.5 59t-31 52q-22 19 -53 19q-23 0 -52 -29v-248z" />
+<glyph unicode="&#x1d534;" horiz-adv-x="759" d="M708 310v-121q0 -69 -114 -153q-31 -22 -61 -54h-14q-34 24 -93.5 42t-118.5 18v14q48 17 48 64v176q0 60 -25 85q-19 17 -34 17q-8 0 -90 -43v-216q0 -57 46 -57v-14q-36 0 -63 -28.5t-27 -64.5h-14q0 36 -27 64.5t-63 28.5v14q23 0 34.5 16t11.5 41v214 q0 30 -31.5 69.5t-31.5 67.5q0 52 58 96l17 -15q-15 -19 -15 -43q0 -16 14 -29.5t32 -23.5t35 -32t22 -53h2l145 78h14q55 -19 79 -61q91 40 124 61h14q42 -17 80 -51q19 -21 32.5 -52.5t13.5 -54.5zM457 116l117 -50q15 13 22.5 33t8.5 37.5t1 56.5q0 46 -1.5 71t-12 58.5 t-30.5 52.5q-22 19 -48 19q-28 0 -57 -29v-249z" />
+<glyph unicode="&#x1d535;" horiz-adv-x="456" d="M406 401l-71 -60l-43 52l-41 -35v-100h70v-55h-70v-92q56 -45 69 -45q15 0 34 19l16 16l19 -18l-112 -101h-15l-113 77q-39 -42 -39 -78q0 -61 78 -88l-30 -82h-14q-18 9 -30.5 17.5t-29 23.5t-25 37t-8.5 49q0 42 20.5 76t77.5 79v110h-70v55h70v41q0 92 -42 92 q-16 0 -47 -20l-15 21l111 76h14q50 -23 72 -82l88 82h14z" />
+<glyph unicode="&#x1d536;" horiz-adv-x="516" d="M464 355v-272q0 -77 -49 -157t-124 -135l-14 15q44 51 64.5 96t20.5 124v258q0 26 -8 57t-24 45q-24 22 -29 22q-15 0 -88 -40v-252l55 -33q8 8 40 58l20 -16l-91 -143h-16q-86 58 -170 71v15q60 2 60 60v221q0 31 -31.5 72t-31.5 69q0 52 58 96l17 -15q-15 -19 -15 -43 q0 -17 14.5 -30t33 -21.5t36 -28t21.5 -47.5l134 67h23q39 -16 66.5 -49t27.5 -64z" />
+<glyph unicode="&#x1d537;" horiz-adv-x="457" d="M198 209l198 -110q11 -33 11 -68q0 -143 -220 -240h-21q-99 48 -123 160v18q136 98 196 178l-95 53v15q48 17 76.5 47.5t28.5 67.5q0 22 -14 37.5t-43 15.5q-7 0 -38 -14t-48 -24l-10 23q86 35 156 100h14q41 -12 61.5 -38t20.5 -59q0 -38 -34 -74t-116 -88zM294 106 l-29 26q-68 -98 -122 -145q8 -44 35 -82t58 -45q24 10 47.5 53t23.5 121q0 31 -13 72z" />
+<glyph unicode="&#x1d538;" horiz-adv-x="741" d="M691 0h-173l-77 209h-268l-78 -209h-45l241 662h168zM630 44l-202 574h-83l202 -574h83zM425 253l-115 332h-2l-119 -332h236z" />
+<glyph unicode="&#x1d539;" horiz-adv-x="676" d="M70 662h282q48 0 90 -8t81 -27t62 -55.5t23 -87.5q0 -45 -20 -81.5t-58 -55.5q46 -19 71 -61.5t25 -94.5q0 -191 -238 -191h-318v662zM491 597v-227q39 17 56 43t17 69q0 78 -73 115zM447 369v237q-31 12 -59 12h-152v-252h145q33 0 66 3zM491 318v-266q91 33 91 137 q0 46 -24 82.5t-67 46.5zM447 52v267q-33 3 -66 3h-145v-278h153q28 0 58 8zM192 44v574h-78v-574h78z" />
+<glyph unicode="&#x1d53b;" horiz-adv-x="722" d="M70 662h278q149 0 239 -90t90 -240q0 -147 -91 -239.5t-238 -92.5h-278v662zM553 541v-415q38 28 59 93.5t21 122.5q0 125 -80 199zM509 99v472q-31 20 -79.5 33.5t-86.5 13.5h-107v-574h106q41 0 92 15t75 40zM192 44v574h-78v-574h78z" />
+<glyph unicode="&#x1d53c;" horiz-adv-x="622" d="M567 0h-497v662h497v-44h-331v-255h299v-44h-299v-275h331v-44zM192 44v574h-78v-574h78z" />
+<glyph unicode="&#x1d53d;" horiz-adv-x="469" d="M567 618h-331v-270h265v-44h-265v-304h-166v662h497v-44zM192 44v574h-78v-574h78z" />
+<glyph unicode="&#x1d53e;" horiz-adv-x="706" d="M664 534l-32 -32q-54 65 -114 97.5t-139 32.5q-43 0 -91 -14t-75 -39v-488q56 -60 167 -60q75 0 109 25v229h-131v44h297v-239q-141 -103 -281 -103q-146 0 -237.5 99.5t-91.5 246.5q0 150 90.5 246.5t239.5 96.5q157 0 259 -108zM611 118v167h-78v-219q16 7 42.5 26.5 t35.5 25.5zM169 119v432q-38 -43 -59 -101.5t-21 -116.5q0 -116 80 -214z" />
+<glyph unicode="&#x1d540;" horiz-adv-x="322" d="M244 0h-166v662h166v-662zM200 44v574h-78v-574h78z" />
+<glyph unicode="&#x1d541;" horiz-adv-x="560" d="M495 662v-502q0 -50 -20.5 -85.5t-56.5 -54t-76 -26.5t-87 -8q-200 0 -215 178h44q13 -77 57.5 -105.5t126.5 -28.5q41 0 61 4v628h166zM451 151v467h-78v-582q78 33 78 115z" />
+<glyph unicode="&#x1d542;" horiz-adv-x="735" d="M729 0h-204l-230 331l-59 -51v-280h-166v662h166v-325l392 337l25 -36l-235 -201zM645 44l-259 363l-57 -49l220 -314h96zM192 44v574h-78v-574h78z" />
+<glyph unicode="&#x1d543;" horiz-adv-x="591" d="M571 0h-501v662h166v-618h335v-44zM192 44v574h-78v-574h78z" />
+<glyph unicode="&#x1d544;" horiz-adv-x="855" d="M785 0h-166v472h-2l-168 -472h-170l-163 469h-2v-469h-22h-22v662h155l202 -585h3l209 585h146v-662zM741 44v574h-78v-574h78zM393 44l-201 574h-80l19 -61l179 -513h83z" />
+<glyph unicode="&#x1d546;" horiz-adv-x="760" d="M715 332q0 -148 -93.5 -247t-240.5 -99q-146 0 -241 100t-95 246q0 154 93 249t247 95q149 0 239.5 -97t90.5 -247zM591 548v-429q80 80 80 213t-80 216zM547 79v505q-59 48 -166 48q-40 0 -90.5 -13t-77.5 -35v-505q30 -21 79.5 -35t88.5 -14q40 0 88 13.5t78 35.5z M169 119v429q-80 -83 -80 -216q0 -128 80 -213z" />
+<glyph unicode="&#x1d54a;" horiz-adv-x="636" d="M597 536l-30 -35q-56 67 -112 99t-136 32q-37 0 -71.5 -24t-34.5 -60t28 -65t70 -47.5t91 -42.5t91 -48t70 -65.5t28 -93.5q0 -66 -43 -113.5t-102 -67t-123 -19.5q-92 0 -158.5 35t-129.5 109l35 28q59 -67 113.5 -97.5t135.5 -30.5q47 0 85.5 27t38.5 72q0 36 -38 64.5 t-92.5 51.5t-109.5 50t-93 73t-38 107q0 100 69.5 150.5t173.5 50.5q90 0 153 -33.5t129 -106.5zM464 63l2 -1q36 20 58.5 52.5t22.5 71.5q0 49 -39 87t-94 63l-112 51q-55 25 -94 62t-39 85q0 36 20 74l-1 2q-32 -16 -52 -51t-20 -72q0 -49 27.5 -86.5t68.5 -59t90 -43.5 l89 -42q41 -18 68.5 -48t27.5 -69q0 -48 -23 -76z" />
+<glyph unicode="&#x1d54b;" horiz-adv-x="527" d="M622 618h-218v-618h-166v618h-218v44h602v-44zM360 44v574h-78v-574h78z" />
+<glyph unicode="&#x1d54c;" horiz-adv-x="698" d="M633 662v-461q0 -56 -25 -99t-67 -67.5t-91 -36.5t-102 -12q-70 0 -131.5 20t-106.5 69.5t-45 120.5v466h166v-612q43 -20 116 -20q42 0 82 8.5t77.5 27t60 52.5t22.5 79v465h44zM187 67v551h-78v-422q0 -31 11 -55t24 -37t43 -37z" />
+<glyph unicode="&#x1d54d;" horiz-adv-x="568" d="M653 662l-236 -662h-169l-236 662h173l211 -584h2l209 584h46zM361 44l-205 574h-83l206 -574h82z" />
+<glyph unicode="&#x1d54e;" horiz-adv-x="920" d="M949 662l-178 -662h-142l-147 528h-2l-142 -528h-144l-182 662h170l146 -523h2l141 523h144l145 -523h3l140 523h46zM741 44l-158 574h-81l159 -574h80zM310 44l-161 574h-80l159 -574h82z" />
+<glyph unicode="&#x1d54f;" horiz-adv-x="768" d="M733 0h-203l-194 260l-243 -260h-58l275 294l-275 368h203l185 -247l231 247h58l-263 -282zM649 44l-430 574h-97l430 -574h97z" />
+<glyph unicode="&#x1d550;" horiz-adv-x="563" d="M685 662l-245 -422v-240h-166v243l-262 419h193l222 -352h2l206 352h50zM396 44v234l-214 340h-91l227 -362v-212h78z" />
+<glyph unicode="&#x1d552;" horiz-adv-x="561" d="M506 0h-148v50q-54 -60 -147 -60q-65 0 -115.5 33t-50.5 94q0 47 23 77.5t58 42.5t75.5 20t75.5 12t58 16.5t23 34.5q0 30 -27 63t-56 33q-110 0 -166 -123l-42 11q35 85 91.5 120.5t150.5 35.5q197 0 197 -163v-297zM462 44v239q0 63 -24.5 97.5t-84.5 34.5v-2 q22 -14 33.5 -39.5t13.5 -45t2 -53.5v-231h60zM358 153v98q-21 -14 -48 -20.5t-60.5 -10.5t-51.5 -8v-178q4 0 10.5 -0.5t9.5 -0.5q54 0 97 34t43 86zM154 42v157q-30 -4 -47.5 -27t-17.5 -54q0 -27 19 -48.5t46 -27.5z" />
+<glyph unicode="&#x1d553;" horiz-adv-x="565" d="M198 401h2q46 59 133 59q90 0 140.5 -69t50.5 -163q0 -92 -50.5 -165t-138.5 -73q-92 0 -134 53h-3v-43h-148v683h148v-282zM420 383v-313q60 48 60 158q0 113 -60 155zM376 49v350q-17 17 -55 17q-46 0 -84.5 -35.5t-38.5 -81.5v-144q0 -47 35.5 -84t82.5 -37 q40 0 60 15zM154 44v595h-60v-595h60z" />
+<glyph unicode="&#x1d554;" horiz-adv-x="520" d="M435 158l40 -16q-58 -152 -201 -152q-105 0 -167 65.5t-62 171.5q0 104 62.5 168.5t166.5 64.5q57 0 108 -26.5t73 -75.5q6 -14 16 -44l-38 -18q-36 68 -66.5 94t-96.5 26q-42 0 -77 -22v-338q29 -22 68 -22q68 0 106.5 29t67.5 95zM149 75v300q-60 -45 -60 -148 q0 -106 60 -152z" />
+<glyph unicode="&#x1d555;" horiz-adv-x="574" d="M519 0h-148v48h-2q-46 -58 -135 -58q-88 0 -138.5 73t-50.5 165q0 94 50.5 163t140.5 69q91 0 135 -59v282h148v-683zM475 44v595h-60v-595h60zM371 155v144q0 46 -38.5 81.5t-84.5 35.5q-38 0 -55 -17v-350q20 -15 60 -15q47 0 82.5 37t35.5 84zM149 70v313 q-60 -42 -60 -155q0 -110 60 -158z" />
+<glyph unicode="&#x1d556;" horiz-adv-x="523" d="M478 199h-285v-148q30 -17 77 -17q57 0 93.5 18.5t67.5 65.5l36 -24q-58 -104 -193 -104q-105 0 -167 65.5t-62 171.5q0 104 62.5 168.5t166.5 64.5q81 0 142.5 -54t61.5 -133v-74zM434 243v33q0 32 -17 63t-43 46v-142h60zM330 243v154q-28 19 -59 19q-36 0 -78 -21 v-152h137zM149 71v309q-60 -52 -60 -153q0 -104 60 -156z" />
+<glyph unicode="&#x1d557;" horiz-adv-x="368" d="M431 636l-31 -31q-37 34 -100 34q-21 0 -44 -5v-184h85v-44h-85v-406h-148v406h-83v44h83v42q0 93 46.5 142t139.5 49q83 0 137 -47zM212 44v580q-60 -19 -60 -103v-477h60z" />
+<glyph unicode="&#x1d558;" horiz-adv-x="574" d="M519 450v-492q0 -51 -22.5 -87.5t-61 -54.5t-80 -26t-90.5 -8q-65 0 -125 24t-83 75l43 21q18 -39 74 -58t109 -19q38 0 88 12v211q-42 -58 -135 -58q-90 0 -140.5 69t-50.5 163q0 92 55 165t144 73q76 0 127 -55v45h148zM475 -43v449h-60v-556q36 26 48 45t12 62z M371 147v152q0 45 -36.5 81t-81.5 36q-41 0 -60 -9v-359q8 -14 62 -14q45 0 80.5 34t35.5 79zM149 66v313q-60 -48 -60 -157q0 -110 60 -156z" />
+<glyph unicode="&#x1d559;" horiz-adv-x="544" d="M489 0h-148v416q-4 1 -11 1q-59 0 -93 -52t-34 -114v-251h-148v683h148v-292h2q43 69 129 69q72 0 113.5 -44t41.5 -117v-299zM445 44v249q0 90 -60 116v-365h60zM159 44v595h-60v-595h60z" />
+<glyph unicode="&#x1d55a;" horiz-adv-x="258" d="M203 537h-148v146h148v-146zM159 581v58h-60v-58h60zM203 0h-148v450h148v-450zM159 44v362h-60v-362h60z" />
+<glyph unicode="&#x1d55b;" horiz-adv-x="305" d="M250 537h-143v146h143v-146zM206 581v58h-55v-58h55zM250 450v-491q0 -80 -50 -128t-131 -48q-45 0 -84 16l14 42q35 -13 59 -13q32 0 49 9v613h143zM206 -58v464h-55v-559q26 13 40.5 39t14.5 56z" />
+<glyph unicode="&#x1d55c;" horiz-adv-x="551" d="M539 0h-174l-134 213l-33 -26v-187h-148v683h148v-442l277 218l26 -35l-156 -122zM459 44l-148 231l-45 -35l124 -196h69zM154 44v595h-60v-595h60z" />
+<glyph unicode="&#x1d55d;" horiz-adv-x="258" d="M203 0h-148v629l104 54h44v-683zM159 44v591l-60 -31v-560h60z" />
+<glyph unicode="&#x1d55e;" horiz-adv-x="830" d="M775 0h-148v416q-4 1 -11 1q-59 0 -93 -52t-34 -114v-251h-148v416q-4 1 -11 1q-59 0 -93 -52t-34 -114v-251h-148v450h148v-59h2q43 69 129 69q50 0 88 -23.5t55 -68.5q30 48 61 70t82 22q73 0 114 -44t41 -117v-299zM731 44v249q0 92 -60 116v-365h60zM445 44v249 q0 92 -60 116v-365h60zM159 44v362h-60v-362h60z" />
+<glyph unicode="&#x1d55f;" horiz-adv-x="544" d="M489 0h-148v416q-4 1 -11 1q-59 0 -93 -52t-34 -114v-251h-148v450h148v-59h2q43 69 129 69q72 0 113.5 -44t41.5 -117v-299zM445 44v249q0 90 -60 116v-365h60zM159 44v362h-60v-362h60z" />
+<glyph unicode="&#x1d560;" horiz-adv-x="553" d="M508 221q0 -106 -63 -169.5t-169 -63.5q-107 0 -169 64.5t-62 172.5q0 106 62.5 169.5t168.5 63.5q107 0 169.5 -64.5t62.5 -172.5zM404 370v-294q60 50 60 145q0 97 -60 149zM360 49v348q-27 17 -84 17q-56 0 -83 -17v-348q27 -17 83 -17q57 0 84 17zM149 76v294 q-60 -49 -60 -145q0 -97 60 -149z" />
+<glyph unicode="&#x1d561;" horiz-adv-x="574" d="M203 400h3q47 60 134 60q88 0 138.5 -73t50.5 -165q0 -94 -50.5 -163t-140.5 -69q-87 0 -130 55h-5v-263h-148v668h148v-50zM425 380v-313q60 42 60 155q0 110 -60 158zM381 52v349q-20 15 -60 15q-47 0 -82.5 -37t-35.5 -84v-144q0 -46 38.5 -81.5t84.5 -35.5 q40 0 55 18zM159 -174v580h-60v-580h60z" />
+<glyph unicode="&#x1d562;" horiz-adv-x="574" d="M519 -218h-148v263h-5q-43 -55 -130 -55q-90 0 -140.5 69t-50.5 163q0 92 50.5 165t138.5 73q87 0 134 -60h3v50h148v-668zM475 -174v580h-60v-580h60zM371 151v144q0 47 -35.5 84t-82.5 37q-40 0 -60 -15v-349q15 -18 55 -18q46 0 84.5 35.5t38.5 81.5zM149 67v313 q-60 -48 -60 -158q0 -113 60 -155z" />
+<glyph unicode="&#x1d563;" horiz-adv-x="301" d="M407 462v-44q-67 -2 -100 -23q-45 -28 -74.5 -86t-29.5 -113v-196h-148v450h148v-100h2q62 114 202 112zM159 44v362h-60v-362h60z" />
+<glyph unicode="&#x1d564;" horiz-adv-x="519" d="M483 365l-29 -37q-54 49 -90.5 68.5t-96.5 19.5q-26 0 -43 -12.5t-17 -37.5q0 -24 27.5 -42t66.5 -32.5t78 -32.5t66.5 -49.5t27.5 -74.5q0 -49 -36.5 -83.5t-83 -48t-93.5 -13.5q-73 0 -119.5 20.5t-104.5 74.5l26 38q56 -48 96.5 -68.5t101.5 -20.5q30 0 55 14t25 42 q0 19 -27.5 35t-66 30.5t-77.5 33.5t-66.5 52.5t-27.5 78.5q0 72 56 106t133 34q70 0 116.5 -21.5t102.5 -73.5zM372 53l1 -1q26 11 41 35t15 53q0 17 -11 33t-24 26t-36 22t-34 17l-33 12q-4 1 -19 7l-21 8l-19 8q-14 6 -19 9l-15 11q-11 7 -16 14l-10 16q-5 9 -7 19.5 t-2 22.5t17 43l-1 1q-26 -9 -43 -33t-17 -52q0 -38 27.5 -65t66.5 -42l77 -29q39 -15 66.5 -38.5t27.5 -56.5q0 -21 -12 -40z" />
+<glyph unicode="&#x1d565;" horiz-adv-x="329" d="M297 406h-69v-367l65 25v-40q-59 -34 -114 -34q-34 0 -66.5 23t-32.5 55v338h-60v44h60v127l104 56h44v-183h69v-44zM184 34v550l-60 -31v-466q0 -20 12.5 -36.5t31.5 -16.5h16z" />
+<glyph unicode="&#x1d566;" horiz-adv-x="544" d="M489 0h-148v59h-2q-43 -69 -129 -69q-72 0 -113.5 44t-41.5 117v299h148v-416q4 -1 11 -1q59 0 93 52t34 114v251h148v-450zM445 44v362h-60v-362h60zM159 41v365h-60v-249q0 -90 60 -116z" />
+<glyph unicode="&#x1d567;" horiz-adv-x="443" d="M479 450l-161 -450h-135l-163 450h158l125 -354h3l126 354h47zM277 44l-130 362h-64l130 -362h64z" />
+<glyph unicode="&#x1d568;" horiz-adv-x="676" d="M695 450l-128 -450h-141l-73 306h-3l-81 -306h-143l-106 450h154l76 -339h3l91 339h129l76 -340h4l98 340h44zM521 44l-84 362h-61l84 -362h61zM222 44l-84 362h-62l85 -362h61z" />
+<glyph unicode="&#x1d569;" horiz-adv-x="560" d="M530 0h-182l-111 157l-147 -157h-60l181 194l-181 256h182l103 -146l136 146h59l-170 -182zM445 44l-254 362h-75l254 -362h75z" />
+<glyph unicode="&#x1d56a;" horiz-adv-x="468" d="M510 450l-198 -543q-47 -125 -136 -125q-18 0 -31.5 1.5t-28 6.5t-21 8t-25 13t-26.5 14l23 37l23 -12q13 -8 19.5 -11t17 -6.5t22 -5t27.5 -1.5q18 0 34 8.5t26 18.5t20 30.5t14.5 32t12.5 36.5l10 30l-273 468h169l168 -291l105 291h48zM338 106l-174 300h-68l216 -371 z" />
+<glyph unicode="&#x1d56b;" horiz-adv-x="519" d="M476 0h-433v44l251 362h-212v44h394v-44l-252 -362h252v-44zM420 406h-73l-247 -362h70z" />
+<glyph unicode="&#x1d56c;" horiz-adv-x="856" d="M805 80l-156 -94h-27q-62 37 -78 115l-262 -126q-35 46 -94 86.5t-99 46.5v25q51 21 89.5 46t72.5 62.5t52 90t18 117.5q0 125 -25 178q-19 39 -53 39q-51 0 -51 -51q0 -41 37 -101t37 -109q0 -63 -51.5 -108.5t-138.5 -58.5l-8 24q22 8 39 29.5t17 51.5q0 52 -37 106.5 t-37 99.5q0 67 57.5 108.5t142.5 41.5q55 0 109 -18.5t89 -57.5q45 -51 45 -133q0 -39 -15.5 -76t-35 -63t-55 -55.5t-58.5 -45.5t-61 -40q34 -18 77 -57t66 -69l129 61v266q0 166 -7 196l264 94l8 -25q-36 -11 -58 -27t-31.5 -43t-11.5 -50t-2 -67v-367q0 -43 23 -43 q27 0 67 24z" />
+<glyph unicode="&#x1d56d;" horiz-adv-x="849" d="M664 411v-2q62 -29 96 -79.5t34 -106.5q0 -108 -97.5 -175t-236.5 -67q-49 0 -86.5 9.5t-59.5 22.5t-41 26.5t-42.5 23t-52.5 9.5q-77 0 -107 -42l-21 14q27 69 77.5 116t116.5 47q12 7 18.5 11.5t20 22t21.5 40.5t14.5 65.5t6.5 97.5q0 78 -18 150t-58 72 q-20 0 -34 -15.5t-14 -44.5q0 -43 37 -100.5t37 -99.5q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q56 25 56 93q0 34 -11.5 60t-25.5 40.5t-25.5 38.5t-11.5 55q0 71 56.5 110t143.5 39q118 0 182 -73l100 75q109 0 168.5 -44.5t59.5 -111.5q0 -94 -105 -134zM604 533 q0 41 -22.5 69.5t-53.5 28.5q-29 0 -63 -36q9 -25 17 -66t8 -61q0 -37 -8 -87q61 10 91.5 55t30.5 97zM298 196v-1q40 -14 75.5 -44.5t55.5 -58.5t44 -50t46 -22q37 0 59 21q44 41 44 128q0 70 -34.5 122.5t-99.5 52.5q-6 0 -18 -2q-24 -48 -62 -79t-110 -67z" />
+<glyph unicode="&#x1d56e;" horiz-adv-x="773" d="M710 701l21 -14q-68 -139 -155 -139q-33 0 -66.5 9.5t-51.5 23.5q-12 -20 -12 -52q0 -26 16 -47t38 -36l44 -30q23 -16 39 -38t16 -50q0 -55 -51 -96.5t-118 -41.5q-40 0 -77 22l12 23q14 -10 33 -10q23 0 34.5 17.5t11.5 40.5t-9.5 40.5t-23.5 30.5l-28 26 q-14 13 -23.5 35.5t-9.5 53.5q0 44 55.5 109.5t121.5 120.5q46 -37 83 -37q61 0 100 39zM678 222l22 -12q-16 -43 -40 -81.5t-58.5 -73t-82 -54.5t-102.5 -20q-165 0 -264 109t-99 275q0 68 34 146t94 127q28 23 69.5 38.5t82.5 15.5q53 0 83 -22l-12 -23q-22 8 -38 8 q-43 0 -75 -41t-46.5 -96.5t-14.5 -113.5q0 -120 58 -199t166 -79q139 0 223 96z" />
+<glyph unicode="&#x1d56f;" horiz-adv-x="891" d="M251 318v-26q-33 -10 -61 -10q-59 0 -97.5 42.5t-38.5 104.5q0 106 90.5 189t232.5 83q81 0 162.5 -30t147.5 -82.5t107.5 -131t41.5 -166.5q0 -132 -83 -214q-98 -96 -271 -96q-49 0 -86 9.5t-59 22.5t-41 26.5t-42.5 23t-52.5 9.5q-76 0 -108 -45l-22 13 q28 72 79.5 119.5t120.5 47.5q19 0 38 -4.5t31.5 -9.5t30.5 -16.5t26 -17.5l27 -21l23 -19q98 -77 160 -77q57 0 95.5 45.5t38.5 127.5q0 109 -90 203t-209 109q-18 -15 -18 -31q0 -20 20.5 -38.5t45 -32.5t45 -38t20.5 -54q0 -46 -45.5 -77.5t-114.5 -31.5q-47 0 -87 22 l12 23q15 -10 34 -10q21 0 33.5 13.5t12.5 32.5q0 18 -28.5 59t-28.5 71q0 51 56 101q-105 0 -157 -30q-70 -41 -70 -112q0 -25 17.5 -51t49.5 -26q8 0 12 1z" />
+<glyph unicode="&#x1d570;" horiz-adv-x="788" d="M710 701l21 -14q-68 -139 -155 -139q-78 0 -118 31q-12 -20 -12 -50q0 -24 16 -46.5t30.5 -34t42.5 -29.5q37 49 59 68.5t50 19.5q46 0 71 -43v-122h-26q-14 34 -35.5 52t-42.5 18q-28 0 -50 -14q38 -33 38 -70q0 -55 -51 -96.5t-118 -41.5q-40 0 -77 22l12 23 q19 -10 33 -10q21 0 33.5 18t12.5 40q0 23 -9.5 40.5t-23.5 30.5l-28 26q-14 13 -23.5 35.5t-9.5 53.5q0 44 55 109t122 120q45 -36 83 -36q61 0 100 39zM678 222l22 -12q-16 -43 -40 -81.5t-58.5 -73t-82 -54.5t-102.5 -20q-165 0 -264 109t-99 275q0 68 34 146t94 127 q28 23 69.5 38.5t82.5 15.5q53 0 83 -22l-12 -23q-22 8 -38 8q-43 0 -75 -41t-46.5 -96.5t-14.5 -113.5q0 -120 58 -199t166 -79q139 0 223 96z" />
+<glyph unicode="&#x1d571;" horiz-adv-x="803" d="M723 676l25 -7q-49 -196 -189 -196h-10q-39 -48 -39 -121q0 -15 6.5 -35t16.5 -28q23 44 56 76t60 32q17 0 29 -5.5t18.5 -12t16.5 -19.5v-128h-26q-27 69 -74 69q-26 0 -55 -41q120 -78 120 -201q0 -103 -80.5 -183.5t-208.5 -80.5q-115 0 -192 50.5t-77 141.5 q0 35 23.5 91t23.5 69q0 38 -39 38q-30 0 -51 -21l-23 11q20 42 61.5 76t93.5 34q61 0 91.5 -30.5t30.5 -72.5q0 -32 -28.5 -90.5t-28.5 -107.5q0 -66 37 -111t81 -45q54 0 88 44.5t34 129.5q0 42 -14 78.5t-26.5 53.5t-38.5 46q-60 66 -60 120q0 20 6 39t24 41l27 32 q8 10 38 37.5t35 32.5q-35 12 -74.5 34.5t-72.5 36t-74 13.5q-31 0 -63 -26t-32 -65q0 -66 76 -85l-5 -26q-7 -1 -22 -1q-76 0 -121.5 39.5t-45.5 102.5q0 86 65 141t171 55q56 0 112 -23.5t102.5 -46.5t80.5 -23q82 0 121 68z" />
+<glyph unicode="&#x1d572;" horiz-adv-x="833" d="M635 443l1 -2q67 -7 106 -51t39 -108q0 -108 -102 -206q-98 -95 -272 -95q-161 0 -257 100t-96 252q0 71 16 133.5t48 114t86 81.5t124 30q29 0 63 -12l-6 -26q-18 2 -22 2q-44 0 -75 -46.5t-44 -114t-13 -147.5q0 -334 189 -334q85 0 139.5 72.5t54.5 174.5 q0 63 -16.5 106t-47.5 43q-26 0 -48 -24q27 -31 44 -69.5t17 -67.5q0 -57 -41.5 -97.5t-114.5 -40.5q-41 0 -80 22l12 23q20 -10 34 -10q35 0 35 58q0 37 -24 79t-47.5 88t-23.5 92q0 113 195 237l17 -19q-43 -45 -62 -79t-19 -75q0 -66 34 -110q88 45 88 83q0 14 -6 39.5 t-6 41.5q0 34 33 63t110 57l17 -19q-22 -22 -22 -54q0 -22 12.5 -50.5t12.5 -43.5q0 -56 -82 -91z" />
+<glyph unicode="&#x1d573;" horiz-adv-x="843" d="M619 701l21 -15q-15 -70 -79 -124.5t-135 -54.5q-79 0 -129 71q-19 -23 -19 -56q0 -52 72 -144q86 51 173 118q128 -30 200 -100t72 -170q0 -33 -10 -67t-23 -61t-40 -60t-46 -53.5t-56 -52.5l-56 -48l-60.5 -46.5t-54.5 -42.5h-26q-55 46 -97 46q-79 0 -129 -46l-21 17 q92 160 202 160q44 0 78 -24.5t44 -54.5q123 91 123 291q0 87 -39.5 149t-105.5 62q-35 0 -104 -48q46 -40 60.5 -65.5t14.5 -51.5q0 -16 -11 -34.5t-24 -33t-48 -50.5l-127 -137q-87 52 -125 70q-36 -35 -50 -53l-22 14l124 196q2 -2 18 -12l32 -22l35 -24 q18 -12 31.5 -19.5t17.5 -7.5q12 0 12 45q0 25 -29 58.5t-63.5 63.5t-63 71.5t-28.5 79.5q0 27 17 56t50 59.5t61 52.5l70 53l58 43q37 -36 59 -48.5t46 -12.5q71 0 130 63z" />
+<glyph unicode="&#x1d574;" horiz-adv-x="790" d="M710 694l25 -8l-11 -44q-5 -16 -19.5 -45.5t-31.5 -47t-47 -31.5t-68 -14q-62 0 -129 31t-117 31q-48 0 -78.5 -25.5t-30.5 -67.5q0 -35 24 -59t61 -24q27 0 50 10l12 -22q-34 -27 -91 -27q-69 0 -121.5 43t-52.5 110q0 81 61 139t161 58q54 0 97 -11t66 -24t55.5 -24 t66.5 -11q38 0 71 15t47 48zM721 388l-23 -12q-19 35 -51 35q-22 0 -36 -14t-14 -41q0 -32 23 -63l46 -65q23 -34 23 -74q0 -82 -70 -130.5t-176 -48.5q-59 0 -101.5 14t-65 33.5t-39 39t-35.5 33.5t-43 14q-37 0 -85 -42l-20 14q8 24 20 47.5t32 52t50.5 46t65.5 17.5 q31 0 55 -9.5t38 -20.5t27 -34.5t18 -36.5l13 -41q30 -94 78 -94q33 0 53.5 27.5t20.5 64.5q0 53 -43.5 119.5t-43.5 115.5q0 58 49.5 94t111.5 36q43 0 76.5 -20t45.5 -57z" />
+<glyph unicode="&#x1d575;" horiz-adv-x="803" d="M725 680l23 -12l-14 -34q-5 -11 -18 -34.5t-26.5 -36.5t-33.5 -28.5t-46.5 -22.5t-58.5 -7q-63 0 -130 30.5t-110 30.5q-42 0 -73.5 -24.5t-31.5 -64.5q0 -36 23 -60.5t64 -24.5q22 0 41 8l12 -23q-29 -24 -87 -24q-72 0 -121.5 42.5t-49.5 110.5q0 81 61 138t161 57 q81 0 172.5 -30.5t125.5 -30.5q75 0 117 40zM715 391l-23 -12q-21 37 -55 37q-22 0 -40 -19.5t-18 -50.5q0 -34 17 -67.5t37 -59.5t37 -73t17 -104q0 -98 -84.5 -172.5t-199.5 -74.5q-113 0 -172 31q-88 45 -88 136q0 13 7.5 43t7.5 42q0 10 -9 20.5t-23 10.5q-28 0 -47 -31 l-25 8q15 50 57 88t96 38q55 0 85 -32.5t30 -72.5q0 -20 -10.5 -59t-10.5 -53q0 -58 23.5 -97t80.5 -39q50 0 84 48t34 115q0 45 -16 88t-35 72.5t-35 72.5t-16 87q0 66 51 112.5t118 46.5q100 0 125 -79z" />
+<glyph unicode="&#x1d576;" horiz-adv-x="864" d="M794 121l20 -20q-20 -28 -66.5 -64.5t-91.5 -50.5h-24q-54 28 -77 71.5t-30 122.5q-5 58 -19.5 90t-33.5 34l-44 -14q21 -30 21 -60q0 -16 -11 -34.5t-24 -33t-48 -50.5l-127 -137q-87 52 -125 70q-22 -19 -50 -53l-22 14l124 196q2 -2 18 -12l32 -22l35 -24 q18 -12 31.5 -19.5t17.5 -7.5q12 0 12 45q0 22 -19 45.5t-46 47.5t-54 51.5t-46 66.5t-19 83q0 63 51.5 121t127.5 91t151 33q221 0 313 -155l-21 -14q-62 73 -123 95t-145 22q-81 0 -142.5 -48t-61.5 -125q23 57 75 85.5t107 28.5q98 0 143 -39q19 -16 34 -42.5t22.5 -46.5 t24.5 -36t43 -18l3 -20l-134 -46q38 -26 58.5 -56.5t26.5 -80.5q15 -131 44 -131q27 0 69 47zM615 389v2q-39 2 -65 13.5t-37 28t-19.5 35t-13.5 34t-18.5 26t-34.5 10.5q-41 0 -79.5 -33t-38.5 -80q18 -26 53 -63t40 -43z" />
+<glyph unicode="&#x1d577;" horiz-adv-x="699" d="M621 171l24 -8q-15 -75 -59.5 -131.5t-117.5 -56.5q-86 0 -160 48q-30 19 -68.5 34.5t-59.5 15.5q-80 0 -104 -77l-25 6q5 28 15 55t28 59t50.5 56.5t74.5 35.5q19 23 19 67q0 29 -14.5 53.5t-35.5 43.5l-42 40q-21 20 -35.5 49.5t-14.5 65.5q0 52 43.5 93t105.5 61 t125 20q60 0 116 -14.5t98.5 -51t42.5 -88.5q0 -45 -27.5 -96.5t-27.5 -91.5q0 -41 20.5 -68t49.5 -37l-4 -25q-88 0 -148 43t-60 97q0 51 27.5 106.5t27.5 95.5q0 44 -31.5 70.5t-74.5 26.5q-45 0 -81.5 -28t-36.5 -78q0 -9 3 -19t6 -17t12 -18l12 -16q4 -5 16 -19t15 -17 q55 -65 55 -113q0 -34 -33.5 -72.5t-75.5 -67.5q50 -4 95 -29l84 -49q37 -23 71 -23q67 0 100 69z" />
+<glyph unicode="&#x1d578;" horiz-adv-x="1133" d="M1061 120l20 -17q-20 -29 -60.5 -65.5t-76.5 -51.5h-24q-55 20 -84 72t-29 125q0 83 41 149.5t124 146.5v2q-43 0 -71 17.5t-41 42.5t-23 50t-24.5 42.5t-37.5 17.5q-36 0 -64 -38q24 -48 33 -90.5t9 -108.5q0 -84 -74 -218q-69 -125 -151 -221l-56 33q-36 22 -51 30 q-29 -29 -51 -55l-22 14l113 198q8 -5 33 -23l46 -33q21 -14 27 -14q15 0 22.5 97t7.5 217q0 72 -26 142t-67 70q-35 0 -64 -40q24 -48 33 -90.5t9 -108.5q0 -24 -5.5 -48.5t-17.5 -51.5l-19 -43q-7 -15 -23.5 -43.5t-18.5 -31.5q-66 -120 -151 -219q-25 14 -68 36l-49 25 q-33 -33 -50 -53l-22 14l112 196q118 -72 126 -72q21 0 21 316q0 82 -18.5 155.5t-58.5 73.5q-48 0 -48 -54q0 -44 37 -102.5t37 -97.5q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q21 8 38.5 31.5t17.5 53.5q0 35 -18 64l-38 58q-18 31 -18 70q0 85 89 130q47 23 111 23 q104 0 159 -57q78 59 138 59q54 0 86 -12.5t53 -42.5q63 55 148 55q50 0 90 -23q26 -15 41 -43t20.5 -51.5t24 -42t52.5 -19.5v-20q-55 -29 -76.5 -92.5t-21.5 -183.5q0 -151 28 -151q14 0 29 9t20.5 14.5t19.5 21.5z" />
+<glyph unicode="&#x1d579;" horiz-adv-x="862" d="M790 118l20 -17q-20 -28 -60.5 -64t-76.5 -51h-24q-52 13 -82.5 67.5t-30.5 127.5q0 83 41 149.5t124 146.5v2q-43 0 -71 17.5t-41 42.5t-23 50t-24.5 42.5t-37.5 17.5q-34 0 -64 -41q24 -48 33 -89.5t9 -106.5q0 -24 -5.5 -48.5t-17.5 -51.5l-19 -43q-7 -15 -23.5 -43.5 t-18.5 -31.5q-66 -120 -151 -219q-25 14 -68 36l-49 25q-33 -33 -50 -53l-22 14l112 196q118 -72 126 -72q21 0 21 316q0 36 -3.5 72t-11 73t-23 60.5t-36.5 23.5q-20 0 -35.5 -14.5t-15.5 -39.5q0 -44 37 -102.5t37 -97.5q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24 q22 8 39 29.5t17 51.5q0 36 -18 66l-38 60q-18 30 -18 70q0 56 42 98q55 55 158 55q104 0 159 -57q68 59 154 59q50 0 90 -23q26 -15 41 -43t20.5 -52.5t24 -43t52.5 -19.5v-20q-55 -29 -76.5 -92.5t-21.5 -183.5q0 -151 28 -151q14 0 29 9t20.5 14.5t19.5 21.5z" />
+<glyph unicode="&#x1d57a;" horiz-adv-x="909" d="M54 274l18 19q25 -26 53 -26q21 0 35 15.5t14 42.5q0 15 -7 28.5t-13 20.5t-20 20q-17 15 -26.5 26.5t-18.5 33.5t-9 49q0 29 22 63t60.5 64.5t100.5 50.5t132 20q81 0 162.5 -30t147.5 -82.5t107.5 -131t41.5 -166.5q0 -132 -83 -214q-98 -96 -271 -96q-59 0 -103 13 t-64 29t-49.5 29t-64.5 13q-65 0 -105 -56l-22 14q30 75 79.5 126t117.5 51q37 0 71.5 -13.5t53.5 -27t51 -40.5q92 -77 160 -77q57 0 95.5 45.5t38.5 127.5q0 50 -19 110t-51.5 114.5t-83.5 90.5t-108 36q-15 0 -50 -10t-57 -10q-60 0 -93 16.5t-67 60.5q-18 0 -36.5 -18.5 t-18.5 -45.5q0 -26 24.5 -49t53.5 -39t53.5 -45.5t24.5 -65.5q0 -57 -52 -93t-119 -36q-63 0 -106 43z" />
+<glyph unicode="&#x1d57b;" horiz-adv-x="850" d="M791 519v-20q-67 -35 -67 -79q0 -25 35.5 -88t35.5 -108q0 -116 -83 -179.5t-221 -63.5h-13v-186h-162v234q-4 2 -13 8l-13 9q-4 2 -13 6l-14 8q-5 2 -13.5 5t-15.5 4.5t-16 2.5t-19 1q-77 0 -107 -42l-21 14q27 69 77.5 116t116.5 47q27 0 51 -6v235q0 45 -5.5 92.5 t-23.5 92t-46 44.5q-49 0 -49 -54q0 -43 37 -101t37 -99q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q22 8 39 29.5t17 51.5q0 47 -37 98.5t-37 97.5q0 73 56.5 113t143.5 40q105 0 159 -55q69 57 143 57q50 0 83 -13.5t46 -33.5t23.5 -43.5t16.5 -43.5t23.5 -34t46.5 -14z M701 484v2q-42 0 -70.5 17t-41.5 41t-23 48.5t-24.5 41.5t-37.5 17q-36 0 -64 -38q38 -66 38 -161v-370q36 -62 82 -62q41 0 60 32.5t19 78.5q0 33 -30 103t-30 107q0 98 122 143z" />
+<glyph unicode="&#x1d57c;" horiz-adv-x="930" d="M882 45l20 -16q-45 -88 -131 -88q-40 0 -63.5 17t-43.5 51q-74 -28 -164 -28q-59 0 -103 13t-64 29t-49.5 29t-64.5 13q-65 0 -105 -56l-22 13q30 75 79.5 126.5t117.5 51.5q16 0 30.5 -2t29 -7.5t23 -9t23.5 -14.5t19.5 -14t21 -17.5t19.5 -16.5q92 -77 160 -77 q15 0 32 3q-6 14 -13 35l-13 36q-5 13 -12 26.5t-15 20t-18 6.5q-20 0 -37 -23l-20 16q53 81 114 81q51 0 78 -30.5t47 -83.5q21 39 21 86q0 50 -22 110.5t-58.5 114t-90.5 90t-111 36.5q-15 0 -50 -10t-57 -10q-60 0 -93 16.5t-67 60.5q-18 0 -36.5 -18.5t-18.5 -45.5 q0 -26 24.5 -49t53.5 -39t53.5 -45.5t24.5 -65.5q0 -63 -50.5 -96t-120.5 -33q-63 0 -106 43l18 19q25 -26 53 -26q23 0 36 15.5t13 41.5q0 15 -7 29t-13 21t-20 20q-17 15 -26.5 26.5t-18.5 33.5t-9 49q0 29 22 63t60.5 64.5t100.5 50.5t132 20q81 0 162.5 -30t147.5 -82.5 t107.5 -131t41.5 -166.5q0 -128 -80 -211q12 -33 24.5 -49t32.5 -16q25 0 51 30z" />
+<glyph unicode="&#x1d57d;" horiz-adv-x="884" d="M821 117l20 -17q-20 -29 -65.5 -64.5t-90.5 -49.5h-24q-60 27 -79 66t-26 123q-13 153 -44 153l-52 -13q-50 -113 -88 -172.5t-125 -167.5q-25 14 -68 36l-49 25q-1 -1 -9 -8l-19 -18q-11 -10 -23 -25l-21 12l112 196q118 -72 126 -72q21 0 21 316q0 82 -18.5 155.5 t-58.5 73.5q-20 0 -34 -13.5t-14 -40.5q0 -42 37 -99t37 -101q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q22 8 39 29.5t17 51.5q0 34 -11.5 60.5t-25.5 41t-25.5 39t-11.5 55.5q0 61 51 107q52 46 149 46q118 0 181 -73l102 75q110 0 172.5 -44.5t62.5 -111.5 q0 -52 -31.5 -104t-101.5 -77v-2q64 -42 77 -162q15 -126 42 -126q29 0 67 43zM596 510q0 51 -20 86t-56 35q-30 0 -67 -39q29 -60 29 -136q0 -71 -8 -100q59 8 90.5 51.5t31.5 102.5z" />
+<glyph unicode="&#x1d57e;" horiz-adv-x="852" d="M458 482l-14 -22q-26 17 -54 17q-33 0 -56 -15.5t-23 -51.5q0 -29 17.5 -48.5t51.5 -19.5q25 0 53 19t51 41.5t64.5 41.5t89.5 19q70 0 117 -43t47 -128q0 -121 -101.5 -216t-250.5 -95q-192 0 -294 110t-102 281q0 79 41 153.5t119 124t172 49.5q64 0 139 -22t102 -22 q80 0 118 46l22 -14q-23 -77 -62.5 -122t-107.5 -45q-57 0 -145 33t-133 33q-99 0 -165.5 -58t-66.5 -154q0 -58 22.5 -100.5t56 -66.5t84 -38t96.5 -18.5t102 -4.5q45 0 92.5 7t100 24t85.5 52.5t33 84.5q0 39 -18.5 56.5t-61.5 17.5q-27 0 -51.5 -19t-47 -46.5t-48.5 -55 t-66.5 -46.5t-89.5 -19q-86 0 -135.5 48.5t-49.5 117.5q0 61 47.5 108.5t119.5 47.5q57 0 100 -42z" />
+<glyph unicode="&#x1d57f;" horiz-adv-x="793" d="M707 680l26 -7q-50 -202 -190 -202q-20 0 -50.5 9.5t-49.5 20.5q-10 -16 -10 -31q0 -20 18 -36t39.5 -25t39.5 -29t18 -47q0 -52 -40 -78.5t-112 -26.5q-44 0 -84 22l12 23q15 -10 34 -10q20 0 29.5 12.5t9.5 28.5q0 18 -22 56t-22 61q0 39 53 98q-68 46 -132 46 q-32 0 -64 -27.5t-32 -74.5t26.5 -75.5t69.5 -30.5l-3 -26q-97 0 -157 45t-60 118q0 89 66 148t171 59q57 0 112 -22.5t100.5 -45t79.5 -22.5q19 0 30 1.5t30 7t35 21t29 39.5zM715 171l25 -8q-14 -78 -64.5 -133t-132.5 -55q-65 0 -159.5 45.5t-148.5 45.5q-87 0 -130 -70 l-23 13q15 83 75 137.5t137 54.5q54 0 103 -15.5t78 -34t61.5 -34t59.5 -15.5q10 0 23.5 2.5t32 9t36 21.5t27.5 36z" />
+<glyph unicode="&#x1d580;" horiz-adv-x="860" d="M809 80l-156 -94h-27q-62 37 -78 115l-282 -126q-34 40 -102 84.5t-110 58.5v15l36 17q11 6 34 23.5t33.5 36t20 51.5t9.5 75v216q0 55 -35 55q-27 0 -78 -29l-13 22l167 101h25q96 -33 96 -145v-125q0 -70 -31 -116.5t-107 -103.5q94 -29 185 -131l148 65v266 q0 166 -7 196l264 94l8 -25q-36 -12 -58 -28t-31.5 -42.5t-11.5 -49.5t-2 -67v-367q0 -43 23 -43q27 0 67 24z" />
+<glyph unicode="&#x1d581;" horiz-adv-x="855" d="M800 524v-20q-37 -20 -52 -38.5t-15 -41.5q0 -24 30.5 -87t30.5 -113q0 -114 -96 -178.5t-238 -64.5q-60 0 -104 14.5t-64 31.5t-49.5 31.5t-64.5 14.5q-24 0 -38 -1.5t-35 -11.5t-34 -29l-21 14q27 69 77.5 116t116.5 47q12 7 18.5 11.5t20 22t21.5 40.5t14.5 65.5 t6.5 97.5q0 33 -3.5 68t-11.5 71t-23.5 59t-37.5 23q-20 0 -34 -15t-14 -44q0 -41 37 -98t37 -102q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q21 8 38.5 30.5t17.5 52.5q0 32 -11.5 58t-25.5 40.5t-25.5 39.5t-11.5 56q0 73 57 115.5t143 42.5q105 0 159 -55q69 57 143 57 q50 0 83 -12.5t46 -31t23 -41t16 -42t24 -34t47 -16.5zM711 484v2q-42 0 -70 17t-41.5 41t-23.5 48.5t-25 41.5t-38 17q-36 0 -64 -38q41 -69 41 -144q0 -166 -192 -271v-2q40 -14 75 -44.5t55 -59t44 -50.5t46 -22q50 0 85 33t35 78q0 46 -25 108.5t-25 104.5q0 94 123 140 z" />
+<glyph unicode="&#x1d582;" horiz-adv-x="1121" d="M1065 524l1 -20q-67 -36 -67 -80q0 -24 30.5 -87.5t30.5 -113.5q0 -66 -28.5 -111.5t-82.5 -83.5q-64 -47 -145 -47q-113 0 -168 34q-51 -34 -175 -34q-60 0 -104 14.5t-64.5 31.5t-50 31.5t-64.5 14.5q-65 0 -107 -42l-21 14q27 69 77.5 116t116.5 47q12 7 18.5 11.5 t20 22t21.5 40.5t14.5 65.5t6.5 97.5q0 33 -3.5 68t-11.5 71t-23.5 59t-37.5 23q-18 0 -33 -14.5t-15 -39.5q0 -43 37 -99t37 -101q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q22 8 39 29.5t17 51.5q0 34 -11.5 60.5t-25.5 41t-25.5 39t-11.5 55.5q0 71 57 112t143 41 q105 0 159 -55q67 57 151 57q38 0 80 -13t62 -29q49 42 115 42q51 0 84.5 -12.5t46.5 -31t23 -41t15.5 -42t23 -33.5t46.5 -17zM977 484v2q-42 0 -70.5 17t-41.5 41t-23 48.5t-25 41.5t-38 17q-42 0 -70.5 -50t-28.5 -100q0 -23 7 -44t15 -33l21 -31q25 -33 43.5 -76.5 t18.5 -80.5q0 -43 -11 -69t-36 -57q19 -43 47.5 -66.5t54.5 -23.5q27 0 45.5 29t18.5 75q0 41 -25 102t-25 116q0 95 123 142zM298 198v-2q40 -14 78.5 -44t62.5 -57.5t51 -49t49 -21.5q38 0 64 54t26 114q0 57 -30 96q-50 66 -50 131q0 74 87 180q-14 25 -42.5 38.5 t-59.5 13.5q-55 0 -85 -38q41 -69 41 -144q0 -166 -192 -271z" />
+<glyph unicode="&#x1d583;" horiz-adv-x="819" d="M775 680l-121 -198q-20 16 -71 48.5t-61 32.5q-6 0 -11.5 -17t-9.5 -53t-4 -81q74 0 101.5 4t46.5 24l23 -13q-24 -64 -62.5 -99t-108.5 -39v-43q0 -64 37.5 -104.5t84.5 -40.5q59 0 106 40l16 -21l-187 -134h-25q-101 37 -159 121q-34 -43 -123 -132l-63 35 q-47 27 -62 34q-2 -2 -9 -8.5t-17 -17.5l-24 -27l-22 14l124 196l41 -27l62 -41q27 -17 32 -17q11 0 18.5 49t7.5 122h-19q-39 0 -57 -1t-39 -9t-31 -24l-23 13q27 68 64 103t105 41v27q0 50 -22.5 94.5t-54.5 44.5q-27 0 -63 -13t-63 -35l-16 20l180 144h25 q75 -23 141 -121q31 48 124 130q105 -56 117 -60q13 10 50 53z" />
+<glyph unicode="&#x1d584;" horiz-adv-x="837" d="M434 641h2q21 23 57.5 41.5t79.5 18.5q53 0 94 -25.5t65.5 -69.5t37 -98t12.5 -116q0 -94 -23.5 -177.5t-72 -158.5t-97 -131t-123.5 -130h-25q-39 27 -57.5 36.5t-39.5 9.5q-80 0 -130 -46l-21 14q76 163 203 163q39 0 67.5 -24t38.5 -55q36 54 69.5 191t33.5 328 q0 106 -18.5 171.5t-56.5 65.5q-45 0 -70 -44q26 -66 26 -138q0 -25 -2.5 -46t-9.5 -40l-14 -33q-5 -13 -20 -29l-24 -25q-8 -9 -30 -26l-34 -24l-40 -26l-43 -28v-1q29 -7 70.5 -32t63.5 -46l83 35l12 -23l-209 -137q-36 42 -94.5 73t-105.5 36v25q113 51 172.5 125 t59.5 204q0 124 -25 178q-19 39 -54 39q-21 0 -35.5 -13t-14.5 -42q0 -44 37 -103.5t37 -95.5q0 -63 -51.5 -108.5t-138.5 -58.5l-8 24q22 8 39 29.5t17 51.5q0 34 -11.5 60t-25.5 40.5t-25.5 39t-11.5 55.5q0 73 57 113.5t143 40.5q118 0 184 -58z" />
+<glyph unicode="&#x1d585;" horiz-adv-x="755" d="M516 280v-2q89 -19 138 -77t49 -146q0 -104 -79 -177t-208 -73q-54 0 -93.5 14t-59.5 33.5t-36 39t-34.5 33.5t-43.5 14q-36 0 -84 -42l-21 14q4 17 17 41.5t34 53.5t54.5 48.5t70.5 19.5q109 0 130 -119q8 -49 31 -83t58 -34q92 0 92 203q0 88 -42.5 144t-98.5 56 q-50 0 -83 -14t-70 -60l-21 14q23 37 48 60.5t66 37.5v2q-67 26 -97 87l22 15q51 -65 138 -65q52 0 86.5 42.5t34.5 119.5t-36 119t-96 42q-125 0 -212 -139l-24 10q31 80 102.5 134.5t179.5 54.5q118 0 186 -60q65 -59 65 -157q0 -67 -42.5 -121.5t-120.5 -82.5z" />
+<glyph unicode="&#x1d586;" horiz-adv-x="600" d="M545 71l-126 -91h-24q-45 24 -64 61l-140 -65h-24q-50 30 -81 83t-31 111q0 53 22.5 100.5t65.5 77.5l81 55q55 36 104 72h24q45 -39 77.5 -60t77.5 -35v-25q-18 0 -30.5 -13t-12.5 -32v-188q0 -45 30 -45q15 0 37 16zM325 79v236l-75 60q-56 -62 -56 -175 q0 -50 25.5 -97.5t51.5 -47.5q7 0 14.5 2.5t12 5t14.5 8.5t13 8z" />
+<glyph unicode="&#x1d587;" horiz-adv-x="559" d="M504 335v-116q0 -25 -8 -46t-27.5 -39.5t-32.5 -28t-41 -28.5q-82 -55 -120 -101h-24q-103 59 -206 76v25q34 4 42.5 15t8.5 56v366q0 51 -12.5 95.5t-31.5 67.5l20 18q50 -40 79 -74q24 32 67 52.5t97 20.5q22 0 62 -6v-25q-71 0 -106.5 -34.5t-35.5 -97.5v-113l147 57 h24q98 -17 98 -140zM365 170v134q0 40 -12 60.5t-41 39.5l-77 -26v-235l106 -54q14 15 19 31t5 50z" />
+<glyph unicode="&#x1d588;" horiz-adv-x="464" d="M412 47l-196 -71h-24q-62 34 -99.5 95.5t-37.5 125.5q0 92 37 143t133 97l80 38h24l77 -90l-104 -86l-82 90q-11 -8 -15 -20q-11 -28 -11 -122q0 -76 37.5 -135t100.5 -59q24 0 72 19z" />
+<glyph unicode="&#x1d589;" horiz-adv-x="557" d="M502 336v-149q0 -25 -25.5 -49.5t-71 -55t-65.5 -48.5q-40 -37 -59 -59h-24q-98 60 -157 60h-52v24q46 0 46 51v270v-4q63 17 126 58v2l-42 16q-13 5 -38.5 18.5t-38.5 25.5t-23.5 31.5t-10.5 42.5q0 61 62.5 92.5t148.5 31.5v-25q-72 -11 -72 -51q0 -24 23.5 -41 t65.5 -33.5t56 -25.5q80 -48 115.5 -87t35.5 -95zM363 159v155q0 19 -5 34t-16 26t-19.5 17.5t-23 15t-18.5 11.5l-16 -8q-16 -8 -25 -14q-7 -2 -7 -45v-203l113 -53q17 27 17 64z" />
+<glyph unicode="&#x1d58a;" horiz-adv-x="476" d="M427 62l-190 -86h-23q-43 9 -75.5 34.5t-49.5 58t-25.5 64.5t-8.5 60q0 185 161 250q57 22 116 32h24l70 -215l-232 -90q0 -42 39 -77t73 -35q65 0 109 28zM194 201l57 23q31 16 31 36q0 9 -22 74.5t-28 77.5q-17 -9 -26 -39.5t-10.5 -56.5t-1.5 -69v-46z" />
+<glyph unicode="&#x1d58b;" horiz-adv-x="370" d="M327 700l25 -9q-2 -25 -12.5 -55.5t-35.5 -58.5t-58 -28q-23 0 -43 10.5t-35 10.5q-13 0 -24 -10.5t-11 -32.5q0 -79 136 -79h61v-65h-96l-25 -597h-101l-24 597h-51v25q50 0 50 57q0 15 -4.5 49.5t-4.5 51.5q0 45 24 87t77 42q23 0 54.5 -16t45.5 -16q32 0 52 37z" />
+<glyph unicode="&#x1d58c;" horiz-adv-x="566" d="M506 380v-25q-18 0 -30.5 -13t-12.5 -33v-184q0 -45 20 -98t20 -85q1 -74 -62 -117.5t-140 -43.5q-48 0 -76.5 7.5t-40 18.5t-19.5 23t-26 23t-50 15v24q56 30 110 30q32 0 52.5 -16t26.5 -35.5t13 -35.5t17 -16q27 0 41.5 17.5t14.5 63.5q0 38 -18 80.5t-22 57.5 l-134 -62h-25q-49 30 -79.5 83.5t-30.5 110.5q0 53 22.5 101t64.5 77q24 17 58 39l61 41l66 47h24q84 -73 155 -95zM324 79v236l-75 60q-55 -61 -55 -175q0 -50 25 -97.5t51 -47.5q9 0 17 3t20.5 11t16.5 10z" />
+<glyph unicode="&#x1d58d;" horiz-adv-x="576" d="M516 335v-284q0 -79 -63 -155.5t-125 -114.5l-18 19q29 36 48 87t19 90v327q0 40 -12 60.5t-41 39.5l-77 -26v-242l53 -30l34 37l22 -14q-72 -103 -95 -153h-24q-83 58 -192 76v25q37 4 50 16t13 55v366q0 51 -12.5 95.5t-31.5 67.5l20 18q50 -40 79 -74q24 32 67 52.5 t97 20.5q22 0 62 -6v-25q-71 0 -106.5 -34.5t-35.5 -97.5v-113l147 57h24q98 -17 98 -140z" />
+<glyph unicode="&#x1d58e;" horiz-adv-x="429" d="M269 649q0 -16 -25 -54.5t-45 -38.5q-21 0 -46 38t-25 55q0 20 20 34t51 14t50.5 -14t19.5 -34zM379 101l-141 -125h-24q-49 25 -66 55t-17 91v191q0 55 -33 55q-15 0 -48 -22l-15 22l147 107h24q91 -58 120 -61v-25q-56 -7 -56 -43v-178q0 -85 24 -85q16 0 66 40z" />
+<glyph unicode="&#x1d58f;" horiz-adv-x="389" d="M280 649q0 -16 -25 -54.5t-45 -38.5q-21 0 -46 38t-25 55q0 20 20 34t51 14t50.5 -14t19.5 -34zM337 414v-25q-56 -7 -56 -43v-394q0 -44 12.5 -87t31.5 -67l-20 -17q-46 31 -79 74q-22 -27 -58.5 -50.5t-68.5 -23.5q-31 0 -59 6v27q39 0 70.5 35t31.5 113v351 q0 49 -28 49q-18 0 -57 -26l-15 21l151 118h24q91 -58 120 -61z" />
+<glyph unicode="&#x1d590;" horiz-adv-x="456" d="M402 688v-25q-72 0 -112 -35t-40 -97v-89h33v62q0 56 30.5 81.5t79.5 25.5v-109h-26q-3 27 -20 27q-27 0 -27 -67v-20h73v-65h-143v-240l72 -36l49 56l22 -15q-106 -140 -119 -166h-24q-80 56 -202 76v25q37 4 50 16t13 55v229h-63v25q63 0 63 50v62q0 51 -12.5 95.5 t-31.5 67.5l20 18q50 -40 79 -74q24 32 67 52.5t97 20.5q32 0 72 -6z" />
+<glyph unicode="&#x1d591;" horiz-adv-x="433" d="M357 158l22 -15q-78 -101 -108 -167h-24q-80 56 -202 76v25q37 4 50 16t13 55v366q0 51 -12.5 95.5t-31.5 67.5l20 18q50 -40 79 -74q24 32 67 52.5t97 20.5q22 0 46 -6v-25q-57 0 -91.5 -35.5t-34.5 -96.5v-394l62 -31z" />
+<glyph unicode="&#x1d592;" horiz-adv-x="984" d="M932 90l-128 -114h-24q-49 24 -66 53.5t-17 88.5v215l-56 53l-84 -43v-184q0 -42 8 -55.5t39 -16.5v-25q-92 -8 -104 -86h-24q-11 77 -111 86v25q30 3 41.5 16t11.5 44v176q0 42 -53 65l-87 -44v-185q0 -42 8 -55.5t39 -16.5v-25q-92 -8 -104 -86h-24q-11 77 -111 86v25 q32 4 42.5 18.5t10.5 53.5v154q0 33 -11.5 51t-30.5 18q-24 0 -45 -15l-12 21l127 87h24q33 -16 56 -41t25 -52l173 93h24q33 -16 56.5 -41t25.5 -52l183 93h24q22 -26 52.5 -46.5t59.5 -21.5v-25q-34 -5 -34 -57v-174q0 -68 28 -68q10 0 18.5 5t30.5 24z" />
+<glyph unicode="&#x1d593;" horiz-adv-x="696" d="M644 90l-129 -114h-24q-49 24 -66 53.5t-17 88.5v215l-54 52l-76 -41v-185q0 -42 8 -55.5t39 -16.5v-25q-92 -8 -104 -86h-24q-11 77 -111 86v25q32 4 42.5 18.5t10.5 53.5v154q0 33 -11.5 51t-30.5 18q-24 0 -45 -15l-12 21l127 87h24q33 -16 56 -41t25 -52l173 93h24 q22 -26 52.5 -46.5t59.5 -21.5v-25q-34 -5 -34 -57v-174q0 -68 27 -68q10 0 18.5 5t32.5 24z" />
+<glyph unicode="&#x1d594;" horiz-adv-x="554" d="M499 295v-101q0 -26 -24.5 -51t-71 -58t-64.5 -50q-34 -32 -58 -59h-24q-110 64 -162 64h-50v25q46 0 46 50v254q19 5 46 17l86 39l112 50h24q77 -46 108.5 -84.5t31.5 -95.5zM360 150v134q0 12 -5 24t-13.5 22.5t-17.5 20t-20.5 18t-19.5 13.5l-16 10q-8 6 -9 6l-22 -10 q-7 -2 -7 -51v-186l111 -65q19 32 19 64z" />
+<glyph unicode="&#x1d595;" horiz-adv-x="640" d="M585 335v-120q0 -50 -23.5 -83.5t-68.5 -62.5q-5 -3 -23 -15l-24 -16l-21 -15q-14 -10 -21 -16t-16 -14.5t-16 -16.5h-24q-13 15 -32 19v-214h-139v246q-66 -2 -118 -51l-23 13q53 120 141 162v205q0 24 -15.5 42t-31.5 40t-16 55q0 26 22 54t52 46l21 -15 q-15 -24 -15 -35q0 -18 19 -31t41.5 -20.5t42 -26t19.5 -47.5l137 57h24q53 -19 80.5 -60t27.5 -80zM446 157v137q0 63 -74 104l-56 -21v-220q63 -20 116 -81q10 11 12 26t2 55z" />
+<glyph unicode="&#x1d596;" horiz-adv-x="574" d="M522 366h-20q-38 0 -38 -45v-540h-139v258l-134 -63h-24q-50 30 -81 83t-31 111q0 53 22.5 100.5t65.5 77.5l81 55q55 36 104 72h24q91 -78 170 -85v-24zM325 79v246l-75 50q-56 -62 -56 -175q0 -50 25.5 -97.5t51.5 -47.5q8 0 54 24z" />
+<glyph unicode="&#x1d597;" horiz-adv-x="525" d="M493 370l-110 -84l-85 106l-25 -13v-242l71 -36l70 70l19 -18q-42 -44 -84.5 -98t-55.5 -79h-24q-79 56 -173 56h-25v24q35 3 49 14.5t14 48.5v194q0 69 -43 69q-15 0 -39 -15l-12 21l122 87h24q41 -19 68 -63l134 63h24z" />
+<glyph unicode="&#x1d598;" horiz-adv-x="557" d="M180 536l-24 11q21 47 63 71.5t90 24.5q65 0 112.5 -40.5t47.5 -106.5q0 -57 -43.5 -99.5t-108.5 -42.5q-70 0 -110 63q-15 -30 -15 -79q0 -36 19 -58t46 -22q17 0 29 3.5t16 7.5l18 15q51 51 81 51q39 0 68 -31q36 -36 36 -107q0 -32 -31 -71t-90 -90.5t-66 -59.5h-25 q-42 39 -111 39q-54 0 -110 -46l-20 16q83 133 182 133q71 0 116 -61q16 42 16 81q0 84 -42 84q-4 0 -8.5 -1t-8.5 -2.5t-9 -4.5l-9 -6q-3 -2 -9 -7.5t-9 -7.5t-10 -8.5t-9 -8.5q-35 -31 -73 -31q-56 0 -91 38t-35 96q0 34 24 64.5t71 71.5l84 75h25q13 -23 47 -23 q16 0 32.5 16.5t16.5 44.5q0 36 -19.5 55t-52.5 19q-27 0 -56 -18t-45 -48z" />
+<glyph unicode="&#x1d599;" horiz-adv-x="438" d="M356 167l22 -14q-54 -72 -107 -176h-24q-80 56 -202 76v25q37 4 50 16t13 55v247h-63v25q101 9 101 235h101v-195h113v-65h-113v-258l61 -31z" />
+<glyph unicode="&#x1d59a;" horiz-adv-x="681" d="M629 90l-129 -114h-24q-39 19 -57 40.5t-23 56.5l-170 -97h-24q-22 27 -58.5 52.5t-65.5 26.5v25q26 4 36 15t10 42v172q0 42 -9 57.5t-28 15.5t-40 -15l-12 21l117 87h24q87 -42 87 -136v-219l51 -50l79 43v185q0 40 -7.5 51t-39.5 15v25q92 8 104 86h24q11 -77 111 -86 v-25q-33 -5 -43 -16.5t-10 -49.5v-155q0 -60 27 -60q10 0 18.5 5t32.5 24z" />
+<glyph unicode="&#x1d59b;" horiz-adv-x="573" d="M526 295v-101q0 -26 -24.5 -51t-71 -58t-64.5 -50q-34 -32 -58 -59h-24q-110 64 -162 64h-50v25q46 0 46 52v243q0 18 -10 33t-21.5 25t-21.5 29.5t-10 45.5t22 54t52 46l21 -15q-15 -24 -15 -35q0 -18 17.5 -30.5t38.5 -19.5t41 -23.5t24 -40.5q24 11 106 46h24 q77 -46 108.5 -84.5t31.5 -95.5zM387 150v134q0 12 -5 24t-13.5 22.5t-17.5 20t-20.5 18l-18.5 13.5l-16 10q-9 6 -10 6l-22 -10q-7 -2 -7 -51v-186l111 -65q19 27 19 64z" />
+<glyph unicode="&#x1d59c;" horiz-adv-x="850" d="M795 295v-107q0 -25 -23 -49t-67 -55.5t-63 -48.5q-34 -32 -58 -59h-24l-28 16l-29 16l-25 14q-17 8 -28 11.5t-24.5 6.5t-26.5 3h-48v25q20 0 28 11t8 39v220l-56 51l-74 -28v-218q0 -31 9 -42.5t38 -13.5v-25q-92 -8 -104 -86h-24q-11 77 -111 86v25q30 3 41.5 16 t11.5 44v209q0 19 -10 35t-21.5 26t-21.5 30t-10 46t22 54t52 46l21 -15q-15 -24 -15 -35q0 -18 19 -30t42 -19.5t42 -30.5t19 -61l157 73h24q63 -25 89 -72l149 72h24q52 -39 73.5 -79.5t21.5 -100.5zM656 160v124q0 68 -61 105l-62 -24q-7 -3 -7 -52v-162l113 -64 q17 29 17 73z" />
+<glyph unicode="&#x1d59d;" horiz-adv-x="521" d="M489 385l-114 -77l-67 84l-25 -13v-114h74v-65h-74v-64l70 -41l43 44l18 -18l-117 -145h-25l-128 78q-17 -32 -17 -48q0 -37 20.5 -52.5t78.5 -34.5l-36 -128h-25q-99 43 -99 157q0 83 78 152v100h-70v65h70v48q0 69 -43 69q-15 0 -39 -15l-12 21l122 87h24 q41 -19 68 -63l133 63h24z" />
+<glyph unicode="&#x1d59e;" horiz-adv-x="596" d="M536 283v-147q0 -72 -20.5 -135t-53.5 -106.5t-61 -70t-56 -43.5l-18 19q70 88 70 255v196q0 74 -14.5 104.5t-46.5 52.5l-79 -31v-240l54 -31l38 48l22 -15q-53 -67 -100 -163h-24q-83 58 -192 76v25q37 4 50 16t13 55v208q0 19 -10 35t-21.5 26t-21.5 30t-10 46t22 54 t52 46l21 -15q-15 -24 -15 -35q0 -18 17.5 -29.5t39 -18.5t41 -26.5t23.5 -50.5l135 57h24q121 -45 121 -192z" />
+<glyph unicode="&#x1d59f;" horiz-adv-x="484" d="M205 221l211 -119q21 -30 21 -91q0 -60 -60 -109q-56 -44 -207 -121h-24q-38 23 -68 69.5t-42 86.5v25q143 88 210 191l-95 54v21q94 49 94 114q0 50 -38 50q-53 0 -94 -27l-11 26l66 33q63 31 94 51h25q97 -16 97 -102q0 -21 -12.5 -41.5t-29.5 -35t-44.5 -30 t-46.5 -24.5t-46 -20v-1zM277 132h-3q-38 -73 -109 -144q14 -52 31.5 -84t48.5 -48q26 24 39.5 58.5t13.5 107.5q0 16 -7 57t-14 53z" />
+<glyph unicode="&#x1d5a0;" horiz-adv-x="666" d="M635 0h-96l-82 200h-249l-81 -200h-96l289 674h26zM427 274l-94 229l-94 -229h188z" />
+<glyph unicode="&#x1d5a1;" horiz-adv-x="604" d="M74 662h205q232 0 232 -163q0 -91 -92 -133q128 -41 128 -173q0 -52 -29 -97t-77 -70q-52 -26 -127 -26h-240v662zM161 394h90q88 0 129.5 25.5t41.5 79.5q0 46 -31.5 67.5t-99.5 21.5h-130v-194zM161 74h126q87 0 129 35.5t42 92.5q0 36 -19.5 63.5t-53.5 38.5 q-41 13 -145 13h-79v-243z" />
+<glyph unicode="&#x1d5a2;" horiz-adv-x="671" d="M586 170l51 -51q-103 -133 -273 -133q-157 0 -247 96.5t-90 250.5q0 148 93.5 245.5t242.5 97.5q75 0 144 -29.5t110 -92.5v-101h-19q-33 80 -96.5 113.5t-137.5 33.5q-111 0 -179.5 -75.5t-68.5 -189.5q0 -124 67 -198.5t184 -74.5q123 0 219 108z" />
+<glyph unicode="&#x1d5a3;" horiz-adv-x="692" d="M74 662h166q416 0 416 -335q0 -65 -23 -123t-67.5 -104t-115.5 -73t-161 -27h-215v662zM161 74h49q94 0 145 7.5t99 32.5q113 59 113 214q0 71 -22.5 120t-73.5 84q-47 32 -104 44t-146 12h-60v-514z" />
+<glyph unicode="&#x1d5a4;" horiz-adv-x="583" d="M540 74l-17 -74h-449v662h439v-74h-352v-202h305v-75h-305v-237h379z" />
+<glyph unicode="&#x1d5a5;" horiz-adv-x="535" d="M523 588h-362v-202h296v-75h-296v-311h-87v662h440z" />
+<glyph unicode="&#x1d5a6;" horiz-adv-x="695" d="M627 357v-298q-30 -20 -44.5 -28t-46 -21.5t-70.5 -18.5t-91 -5q-157 0 -252.5 97t-95.5 250q0 147 98.5 245t247.5 98q165 0 242 -111v-103h-19q-66 138 -223 138q-121 0 -189 -78t-68 -186q0 -110 70.5 -192t192.5 -82q83 0 122 18t39 43v158h-86l-22 76h195z" />
+<glyph unicode="&#x1d5a7;" horiz-adv-x="658" d="M584 0h-87v301h-336v-301h-87v662h87v-287h336v287h87v-662z" />
+<glyph unicode="&#x1d5a8;" horiz-adv-x="401" d="M356 74l-9 -74h-288l-14 74h111v514h-111l14 74h288l9 -74h-111v-514h111z" />
+<glyph unicode="&#x1d5a9;" horiz-adv-x="398" d="M305 662v-450q0 -106 -35.5 -166t-126.5 -60q-76 0 -131 56l19 76h17q20 -23 47 -39.5t51 -16.5q25 0 41 12.5t22 37.5t7.5 44t1.5 50v456h87z" />
+<glyph unicode="&#x1d5aa;" horiz-adv-x="634" d="M630 0h-119l-316 302l-34 -33v-269h-87v662h87v-287l308 287h95v-17l-307 -288z" />
+<glyph unicode="&#x1d5ab;" horiz-adv-x="559" d="M546 74l-18 -74h-454v662h87v-588h385z" />
+<glyph unicode="&#x1d5ac;" horiz-adv-x="843" d="M768 0h-85v543l-251 -543h-21l-251 541v-541h-85v662h123l225 -482l222 482h123v-662z" />
+<glyph unicode="&#x1d5ad;" horiz-adv-x="675" d="M601 -14l-69 14l-371 564v-564h-87v662h121l319 -484v484h87v-676z" />
+<glyph unicode="&#x1d5ae;" horiz-adv-x="714" d="M684 331q0 -152 -92.5 -248.5t-234.5 -96.5t-234.5 96.5t-92.5 248.5q0 153 92.5 249t234.5 96t234.5 -96t92.5 -249zM595 331q0 124 -64 196.5t-174 72.5t-174 -72.5t-64 -196.5t64 -196.5t174 -72.5t174 72.5t64 196.5z" />
+<glyph unicode="&#x1d5af;" horiz-adv-x="525" d="M74 662h184q254 0 254 -184q0 -87 -61.5 -140t-169.5 -53h-120v-285h-87v662zM161 359h88q93 0 134 30t41 90q0 55 -42.5 82t-137.5 27h-83v-229z" />
+<glyph unicode="&#x1d5b0;" horiz-adv-x="716" d="M691 -157v-18q-45 0 -67.5 0.5t-62 3.5t-63 9t-56 18t-55.5 29.5t-48 44.5t-45 62q-117 21 -190.5 113t-73.5 226q0 153 92.5 249t234.5 96t234.5 -96t92.5 -249q0 -137 -78.5 -230t-201.5 -111q19 -31 43 -50t54 -27.5t52.5 -11t58.5 -2.5zM595 331q0 124 -64 196.5 t-174 72.5t-174 -72.5t-64 -196.5t64 -196.5t174 -72.5t174 72.5t64 196.5z" />
+<glyph unicode="&#x1d5b1;" horiz-adv-x="589" d="M581 0h-103l-247 299h-70v-299h-87v662h185q125 0 189.5 -45.5t64.5 -131.5q0 -71 -48 -120.5t-130 -61.5zM161 373h89q93 0 133.5 27t40.5 86q0 54 -41.5 78t-138.5 24h-83v-215z" />
+<glyph unicode="&#x1d5b2;" horiz-adv-x="541" d="M449 477h-19q-24 60 -72 91.5t-106 31.5q-46 0 -76 -28t-30 -67q0 -70 141 -127q107 -42 150.5 -89.5t43.5 -120.5q0 -74 -57 -127q-61 -55 -166 -55q-146 0 -213 84l-13 135h18q33 -73 90 -108t114 -35q63 0 100.5 26.5t37.5 69.5q0 45 -30 75t-98 58q-109 44 -156 91.5 t-47 118.5q0 79 55 127t141 48q124 0 192 -80v-119z" />
+<glyph unicode="&#x1d5b3;" horiz-adv-x="608" d="M593 588h-245v-588h-88v588h-245l10 74h558z" />
+<glyph unicode="&#x1d5b4;" horiz-adv-x="661" d="M592 662v-419q0 -126 -66.5 -191.5t-195.5 -65.5q-261 0 -261 257v419h87v-406q0 -78 19 -115q41 -79 155 -79q55 0 96.5 21t61.5 58q17 31 17 128v393h87z" />
+<glyph unicode="&#x1d5b5;" horiz-adv-x="654" d="M623 662l-283 -673h-26l-283 673h96l201 -498l199 498h96z" />
+<glyph unicode="&#x1d5b6;" horiz-adv-x="921" d="M892 662l-228 -673h-28l-178 446l-173 -446h-28l-228 673h95l153 -476v2l182 474l184 -476v2l154 474h95z" />
+<glyph unicode="&#x1d5b7;" horiz-adv-x="700" d="M669 0h-105l-215 283l-213 -283h-105l265 349l-240 313h106l187 -248l185 248h107l-239 -313z" />
+<glyph unicode="&#x1d5b8;" horiz-adv-x="630" d="M609 662l-250 -374v-288h-88v288l-250 374h95l199 -300l199 300h95z" />
+<glyph unicode="&#x1d5b9;" horiz-adv-x="637" d="M603 74l-8 -74h-567v25l426 563h-392l8 74h528v-21l-428 -567h433z" />
+<glyph unicode="&#x1d5ba;" horiz-adv-x="448" d="M391 0h-85l-5 44q-60 -54 -149 -54q-54 0 -85.5 28t-31.5 83q0 72 63.5 119t203.5 74v33q0 29 -23.5 47t-61.5 18q-76 0 -108 -90h-15l-49 31q13 68 61 99t113 31q74 0 118 -36.5t44 -100.5v-250q0 -29 10 -76zM302 132v90q-86 -14 -138 -43q-50 -26 -50 -67 q0 -51 58 -51q67 0 130 71z" />
+<glyph unicode="&#x1d5bb;" horiz-adv-x="496" d="M142 679v-265q55 49 128 49q87 0 141.5 -61t54.5 -158q0 -110 -67 -182t-171 -72t-165 57v613l70 24zM142 302v-208q39 -33 91 -33q61 0 107.5 46t46.5 123q0 73 -35 117.5t-97 44.5q-36 0 -67 -23.5t-46 -66.5z" />
+<glyph unicode="&#x1d5bc;" horiz-adv-x="456" d="M367 166l65 -34q-32 -73 -85 -108q-49 -34 -115 -34q-74 0 -125 40q-84 65 -84 186q0 109 62.5 178t156.5 69q55 0 100 -23t69 -69l-44 -54h-16q-32 75 -113 75q-57 0 -96.5 -45t-39.5 -125q0 -74 39 -117.5t97 -43.5q81 0 129 105z" />
+<glyph unicode="&#x1d5bd;" horiz-adv-x="494" d="M437 13l-72 -24l-9 5l-2 50q-56 -54 -137 -54q-52 0 -91 23q-43 26 -70.5 79t-27.5 117q0 106 63.5 180t153.5 74q56 0 107 -37v234l70 24l9 -5v-551q0 -66 6 -115zM352 158v171q-43 63 -103 63q-55 0 -98.5 -48t-43.5 -122q0 -43 15 -80.5t41 -56.5q32 -24 74 -24 q35 0 67 26.5t48 70.5z" />
+<glyph unicode="&#x1d5be;" horiz-adv-x="444" d="M362 167l66 -35q-38 -76 -82 -109t-116 -33q-91 0 -149 62.5t-58 173.5q0 116 72 183q57 54 143 54q79 0 126 -51.5t47 -134.5v-55h-309q0 -76 39 -118.5t97 -42.5q79 0 124 106zM115 293h215q-3 99 -100 99q-40 0 -73 -25t-42 -74z" />
+<glyph unicode="&#x1d5bf;" horiz-adv-x="336" d="M369 633l-24 -59l-16 -1q-21 15 -31 21.5t-23 12t-26 5.5q-31 0 -50 -25t-19 -78v-56h114v-71h-114v-382h-79v382h-81v71h81v41q0 99 47 149q40 40 94 40q68 0 127 -50z" />
+<glyph unicode="&#x1d5c0;" horiz-adv-x="496" d="M467 369h-78q16 -31 16 -70q0 -71 -47.5 -116t-119.5 -45q-30 0 -61 8q-41 -24 -41 -44q0 -36 48 -38q17 0 52.5 -2t52.5 -2q169 -7 169 -119q0 -80 -78 -118.5t-187 -38.5q-77 0 -124.5 29t-47.5 84q0 74 70 113q-37 25 -37 63q0 46 44 86q5 5 17 19q-52 47 -52 118 q0 69 51 118t128 49q37 0 75 -14q36 -13 82 -13h68v-67zM326 297q0 46 -23.5 70.5t-66.5 24.5q-40 0 -67 -27t-27 -63q0 -42 26 -67t71 -25q39 0 63 25t24 62zM201 -15h-20q-81 -24 -81 -71q0 -58 101 -58q84 0 123 15q24 10 39 26.5t15 35.5q0 32 -33 40q-45 12 -144 12z " />
+<glyph unicode="&#x1d5c1;" horiz-adv-x="487" d="M424 0h-79v304q0 88 -82 88q-29 0 -68 -25t-53 -65v-302h-79v660l70 24l9 -5v-274q35 35 68.5 46.5t79.5 11.5q60 0 97 -37.5t37 -104.5v-321z" />
+<glyph unicode="&#x1d5c2;" horiz-adv-x="220" d="M156 586h-92v93h92v-93zM152 0h-83v440l74 24l9 -5v-459z" />
+<glyph unicode="&#x1d5c3;" horiz-adv-x="254" d="M185 586h-93v93h93v-93zM180 459v-485q0 -106 -47 -153q-37 -37 -98 -37q-51 0 -109 36l27 64h16q44 -28 65 -28q64 0 64 102v481l73 25z" />
+<glyph unicode="&#x1d5c4;" horiz-adv-x="453" d="M452 0h-103l-207 207v-207h-79v660l70 24l9 -5v-376l198 150h104v-14l-246 -184z" />
+<glyph unicode="&#x1d5c5;" horiz-adv-x="205" d="M144 0h-83v660l74 24l9 -5v-679z" />
+<glyph unicode="&#x1d5c6;" horiz-adv-x="756" d="M691 0h-77v293q0 99 -79 99q-27 0 -65.5 -25.5t-52.5 -64.5v-302h-78v290q0 102 -77 102q-27 0 -67 -25t-53 -65v-302h-77v440l65 24l9 -5v-57q49 61 139 61q89 0 131 -65q59 65 142 65q59 0 99.5 -38.5t40.5 -109.5v-315z" />
+<glyph unicode="&#x1d5c7;" horiz-adv-x="487" d="M424 0h-79v304q0 88 -82 88q-29 0 -68 -25t-53 -65v-302h-79v440l65 24l9 -5l2 -57q37 36 71.5 48.5t79.5 12.5q29 0 59 -13.5t48 -31.5q27 -36 27 -97v-321z" />
+<glyph unicode="&#x1d5c8;" horiz-adv-x="499" d="M471 229q0 -39 -14 -79.5t-40 -77t-70 -59.5t-99 -23q-97 0 -158.5 68.5t-61.5 170.5q0 97 60 165.5t157 68.5q101 0 163.5 -63t62.5 -171zM392 228q0 76 -40.5 120t-105.5 44q-63 0 -101 -48t-38 -116q0 -72 40 -119.5t102 -47.5q67 0 105 53.5t38 113.5z" />
+<glyph unicode="&#x1d5c9;" horiz-adv-x="498" d="M142 459l2 -50q56 54 137 54q54 0 91 -23q43 -27 70.5 -79.5t27.5 -116.5q0 -106 -63.5 -180t-153.5 -74q-57 0 -107 36v-218l-70 -24l-9 5v651l67 24zM146 295v-172q39 -62 103 -62q65 0 103.5 48t38.5 121q0 69 -35 115.5t-95 46.5q-35 0 -67 -26.5t-48 -70.5z" />
+<glyph unicode="&#x1d5ca;" horiz-adv-x="498" d="M435 -211l-9 -5l-70 24v234q-53 -52 -135 -52q-52 0 -91 23q-44 27 -73 79.5t-29 116.5q0 106 63.5 180t153.5 74q66 0 114 -35l65 36l11 -6v-669zM356 158v171q-20 30 -49 46.5t-58 16.5q-55 0 -98.5 -48t-43.5 -122q0 -69 35 -115t95 -46q35 0 69 27t50 70z" />
+<glyph unicode="&#x1d5cb;" horiz-adv-x="336" d="M328 377h-20q-10 15 -39 15q-43 0 -76.5 -42t-50.5 -116v-234h-79v440l70 24l9 -5l2 -64q48 68 127 68q37 0 57 -16v-70z" />
+<glyph unicode="&#x1d5cc;" horiz-adv-x="389" d="M330 321h-15q-28 44 -56 58t-67 14q-32 0 -48 -16t-16 -35q0 -25 21 -42.5t63 -34.5q83 -35 110.5 -64t27.5 -83q0 -66 -61 -104q-38 -24 -100 -24q-45 0 -75.5 13t-63.5 42v103h15q39 -87 130 -87q32 0 54 14.5t22 42.5q0 20 -18.5 34.5t-67.5 36.5q-76 34 -106 67 t-30 82q0 52 40 88.5t105 36.5q86 0 136 -53v-89z" />
+<glyph unicode="&#x1d5cd;" horiz-adv-x="291" d="M287 87l-11 -75q-29 -22 -88 -22q-51 0 -79 30.5t-28 83.5v278h-80v17l45 54h35v64l61 63h18v-127h104v-71h-104v-245q0 -44 13 -60t38 -16q37 0 64 26h12z" />
+<glyph unicode="&#x1d5ce;" horiz-adv-x="491" d="M430 13l-71 -24l-9 5l-2 65q-29 -32 -70.5 -50.5t-80.5 -18.5q-60 0 -107 45q-27 35 -27 96v322h79v-304q0 -88 82 -88q28 0 67 29.5t54 70.5v292h79v-325q0 -66 6 -115z" />
+<glyph unicode="&#x1d5cf;" horiz-adv-x="474" d="M443 453l-195 -467h-22l-195 467h85l122 -299l120 299h85z" />
+<glyph unicode="&#x1d5d0;" horiz-adv-x="702" d="M675 453l-196 -467h-22l-98 244l-122 -244h-21l-188 467h84l122 -304l85 176l-15 41l-20 47l-15 40h84l121 -294l116 294h85z" />
+<glyph unicode="&#x1d5d1;" horiz-adv-x="482" d="M452 0h-94l-122 175l-112 -175h-94l161 239l-149 214h94l105 -151l97 151h94l-146 -217z" />
+<glyph unicode="&#x1d5d2;" horiz-adv-x="484" d="M453 453l-178 -497q-31 -89 -69.5 -130.5t-102.5 -41.5q-48 0 -75 24v72h17q32 -24 60 -24q61 0 106 138q1 5 5 16.5t6 16.5l-188 426h86l139 -323l109 323h85z" />
+<glyph unicode="&#x1d5d3;" horiz-adv-x="447" d="M417 71l-10 -71h-382v20l251 362h-227l12 71h344v-20l-252 -362h264z" />
+<glyph unicode="&#x1d5d4;" horiz-adv-x="690" d="M665 0h-130l-66 162h-248l-66 -162h-130l306 690h28zM428 264l-83 204l-83 -204h166z" />
+<glyph unicode="&#x1d5d5;" horiz-adv-x="636" d="M463 373l1 -4q75 -36 102.5 -79.5t27.5 -101.5q0 -81 -73 -134.5t-181 -53.5h-260v676h237q118 0 180 -43t62 -125q0 -41 -25 -77.5t-71 -57.5zM208 413h72q141 0 141 89q0 37 -23 54.5t-77 17.5h-113v-161zM208 102h103q80 0 110.5 29t30.5 80q0 52 -49.5 76t-119.5 24 h-75v-209z" />
+<glyph unicode="&#x1d5d6;" horiz-adv-x="723" d="M619 193l69 -68q-115 -144 -285 -144q-164 0 -259 100.5t-95 258.5q0 152 97.5 251.5t255.5 99.5q80 0 140.5 -20t106.5 -74v-149h-11q-72 141 -218 141q-101 0 -167 -66.5t-66 -180.5q0 -105 56.5 -182t161.5 -77q63 0 111.5 25.5t102.5 84.5z" />
+<glyph unicode="&#x1d5d7;" horiz-adv-x="709" d="M80 676h179q221 0 318 -89t97 -252q0 -48 -12 -94t-40 -90t-69 -77.5t-104 -53.5t-140 -20h-229v676zM210 102h67q259 0 259 234q0 122 -66 180t-182 58h-78v-472z" />
+<glyph unicode="&#x1d5d8;" horiz-adv-x="635" d="M597 102l-27 -102h-490v676h480v-102h-350v-167h241v-103h-241v-202h387z" />
+<glyph unicode="&#x1d5d9;" horiz-adv-x="582" d="M570 574h-360v-169h213v-102h-213v-303h-130v676h477z" />
+<glyph unicode="&#x1d5da;" horiz-adv-x="746" d="M671 357v-279q-32 -24 -48.5 -35t-52 -29t-78.5 -25.5t-98 -7.5q-168 0 -262.5 100t-94.5 259q0 151 98 251t256 100q79 0 138.5 -20.5t107.5 -73.5v-149h-11q-73 141 -223 141q-97 0 -162.5 -66.5t-65.5 -180.5q0 -66 22.5 -123t75 -96.5t125.5 -39.5q76 0 155 43v129 h-107l-31 102h256z" />
+<glyph unicode="&#x1d5db;" horiz-adv-x="715" d="M635 0h-130v297h-295v-297h-130v676h130v-277h295v277h130v-676z" />
+<glyph unicode="&#x1d5dc;" horiz-adv-x="440" d="M375 102l-9 -102h-287l-14 102h90v472h-90l14 102h287l9 -102h-90v-472h90z" />
+<glyph unicode="&#x1d5dd;" horiz-adv-x="481" d="M406 676v-545q0 -150 -102 -203q-45 -24 -110 -24q-95 0 -179 98l49 98h18q33 -49 59 -71.5t63 -22.5q44 0 58 30.5t14 81.5v558h130z" />
+<glyph unicode="&#x1d5de;" horiz-adv-x="712" d="M707 0h-170l-296 306l-33 -29v-277h-128v676h128v-263l295 263h145v-14l-318 -278z" />
+<glyph unicode="&#x1d5df;" horiz-adv-x="603" d="M587 102l-19 -102h-488v676h130v-574h377z" />
+<glyph unicode="&#x1d5e0;" horiz-adv-x="913" d="M833 0h-128v467l-235 -467h-27l-235 467v-467h-128v676h161l214 -440h3l214 440h161v-676z" />
+<glyph unicode="&#x1d5e1;" horiz-adv-x="724" d="M644 -18l-105 20l-331 500v-502h-128v676h157l279 -424v424h128v-694z" />
+<glyph unicode="&#x1d5e2;" horiz-adv-x="778" d="M743 337q0 -157 -99 -256t-254 -99q-154 0 -254.5 99t-100.5 256t100 256t254 99t254 -99t100 -256zM605 337q0 115 -57 184t-159 69t-159 -69t-57 -184q0 -116 57 -184.5t160 -68.5q102 0 158.5 68.5t56.5 184.5z" />
+<glyph unicode="&#x1d5e3;" horiz-adv-x="581" d="M80 676h209q139 0 209.5 -50.5t70.5 -144.5q0 -91 -69.5 -147t-186.5 -56h-103v-278h-130v676zM210 380h71q83 0 119.5 25t36.5 77q0 92 -162 92h-65v-194z" />
+<glyph unicode="&#x1d5e4;" horiz-adv-x="779" d="M754 -160v-16q-50 0 -75.5 0.5t-70 3.5t-70.5 9t-63 17.5t-62 28.5t-52.5 43.5t-49.5 60.5q-125 27 -200.5 119t-75.5 228q0 158 100 257.5t254 99.5q155 0 254.5 -99t99.5 -258q0 -135 -75 -226.5t-199 -119.5q24 -27 59.5 -41.5t62 -17t70.5 -3.5zM605 336 q0 115 -57 184t-159 69t-159 -69t-57 -184q0 -116 57 -184.5t160 -68.5q102 0 158.5 68.5t56.5 184.5z" />
+<glyph unicode="&#x1d5e5;" horiz-adv-x="670" d="M657 0h-159l-247 291h-41v-291h-130v676h216q136 0 205 -48.5t69 -139.5q0 -69 -44.5 -119t-122.5 -69zM210 393h71q85 0 121 23t36 73q0 45 -37.5 65t-125.5 20h-65v-181z" />
+<glyph unicode="&#x1d5e6;" horiz-adv-x="554" d="M483 466h-14q-23 57 -77 90t-109 33q-43 0 -74 -20.5t-31 -61.5q0 -38 33 -62t91 -46q120 -46 164.5 -92t44.5 -124q0 -39 -19.5 -82t-47.5 -68q-59 -52 -178 -52q-132 0 -215 81l-16 162h14q33 -69 98.5 -105t120.5 -36q63 0 89.5 28t26.5 63q0 39 -24.5 59.5 t-94.5 47.5q-117 45 -164.5 95.5t-47.5 127.5q0 83 63 135t157 52q69 0 125.5 -20t84.5 -51v-154z" />
+<glyph unicode="&#x1d5e7;" horiz-adv-x="641" d="M627 574h-240v-574h-130v574h-243l14 102h589z" />
+<glyph unicode="&#x1d5e8;" horiz-adv-x="699" d="M624 676v-430q0 -265 -274 -265q-275 0 -275 265v430h128v-419q0 -79 14 -104q37 -70 133 -70q91 0 132 70q14 23 14 116v407h128z" />
+<glyph unicode="&#x1d5e9;" horiz-adv-x="690" d="M665 676l-306 -694h-28l-306 694h130l190 -465l190 465h130z" />
+<glyph unicode="&#x1d5ea;" horiz-adv-x="997" d="M967 676l-255 -691l-28 1l-184 408h-3l-184 -409h-28l-255 691h131l146 -439l195 439l188 -439l146 439h131z" />
+<glyph unicode="&#x1d5eb;" horiz-adv-x="740" d="M700 0h-154l-179 239l-173 -239h-154l249 343l-248 333h154l170 -228l166 228h154l-242 -333z" />
+<glyph unicode="&#x1d5ec;" horiz-adv-x="694" d="M674 676l-262 -394v-282h-130v282l-262 394h145l182 -283l182 283h145z" />
+<glyph unicode="&#x1d5ed;" horiz-adv-x="653" d="M623 102l-15 -102h-583v16l372 558h-334l13 102h525v-16l-374 -558h396z" />
+<glyph unicode="&#x1d5ee;" horiz-adv-x="489" d="M428 0h-125l-6 44q-32 -33 -66.5 -45.5t-84.5 -12.5t-86.5 36t-36.5 100q0 45 13.5 71.5t40.5 50.5q63 55 222 64v16q0 54 -74 54q-44 0 -69.5 -16t-38.5 -54h-12l-76 44q21 61 76 91t132 30q78 0 130 -35.5t52 -98.5v-263q0 -29 9 -76zM299 152v61q-151 0 -151 -82 q0 -27 17.5 -38.5t39.5 -11.5q29 0 54 19.5t40 51.5z" />
+<glyph unicode="&#x1d5ef;" horiz-adv-x="512" d="M177 426v-1q49 48 125 48q49 0 88 -23q46 -27 71.5 -81t25.5 -124q0 -140 -74 -211q-50 -47 -140 -47q-30 0 -62 12.5t-48 30.5h-3l-92 -43h-13v689h120v-250h2zM175 301v-158q41 -61 94 -61q44 0 68.5 41.5t24.5 107.5t-26.5 106.5t-64.5 40.5q-65 0 -96 -77z" />
+<glyph unicode="&#x1d5f0;" horiz-adv-x="462" d="M373 145l69 -67q-46 -55 -86 -73.5t-111 -18.5q-95 0 -157.5 66.5t-62.5 168.5q0 111 67 181.5t164 70.5q64 0 114 -27.5t63 -77.5l-77 -57h-17q-18 67 -85 67q-43 0 -73.5 -41t-30.5 -111q0 -57 31.5 -97.5t83.5 -40.5q70 0 108 57z" />
+<glyph unicode="&#x1d5f1;" horiz-adv-x="518" d="M463 8l-115 -22l-7 3v45h-2q-46 -48 -122 -48q-89 0 -140.5 65t-51.5 176t56.5 178.5t150.5 67.5q55 0 105 -39v242h120v-550q0 -64 6 -118zM337 169v140q-22 38 -41.5 53.5t-50.5 15.5q-45 0 -70 -43.5t-25 -104.5q0 -62 25.5 -105.5t68.5 -43.5q35 0 55.5 22t37.5 66z " />
+<glyph unicode="&#x1d5f2;" horiz-adv-x="452" d="M363 143l70 -66q-47 -54 -84.5 -72t-102.5 -18q-99 0 -160 64t-61 171q0 123 68 194q54 57 147 57q86 0 134 -66.5t48 -173.5v-28h-272q0 -59 31.5 -88t78.5 -29q67 0 103 55zM159 300h143q0 78 -69 78q-26 0 -49.5 -22.5t-24.5 -55.5z" />
+<glyph unicode="&#x1d5f3;" horiz-adv-x="340" d="M374 638l-22 -90l-17 -1q-29 49 -84 49q-59 0 -59 -84v-51h90v-95h-90v-366h-120v366h-58v95h58v42q0 91 48 139.5t121 48.5q49 0 75.5 -11t57.5 -42z" />
+<glyph unicode="&#x1d5f4;" horiz-adv-x="504" d="M219 76h84q187 0 187 -128q0 -45 -28.5 -78t-75.5 -51q-64 -25 -184 -25q-77 0 -125.5 29.5t-48.5 85.5q0 25 16 47.5t45 37.5q-42 19 -42 67q0 29 16.5 52.5t61.5 51.5v2q-42 27 -61.5 57t-19.5 76q0 74 59 123t150 49q42 0 80 -14q22 -8 82 -8h72v-95h-56 q16 -10 16 -56q0 -76 -60.5 -117.5t-141.5 -41.5h-25q-48 -5 -48 -33q0 -31 47 -31zM332 303q0 33 -21.5 53.5t-65.5 20.5q-41 0 -64 -21.5t-23 -50.5q0 -35 24 -53t63 -18q41 0 64 19t23 50zM314 -19h-105q-30 -3 -43 -16t-13 -28q0 -48 89 -48q59 0 88 12q35 13 35 46 q0 14 -12.5 24t-38.5 10z" />
+<glyph unicode="&#x1d5f5;" horiz-adv-x="510" d="M455 0h-120v309q0 69 -66 69q-23 0 -50.5 -21t-43.5 -64v-293h-120v676h120v-261h2q58 58 129 58q149 0 149 -151v-322z" />
+<glyph unicode="&#x1d5f6;" horiz-adv-x="245" d="M195 543h-145v145h145v-145zM184 0h-125v461h125v-461z" />
+<glyph unicode="&#x1d5f7;" horiz-adv-x="324" d="M269 543h-145v145h145v-145zM258 461v-478q0 -113 -81 -162q-41 -24 -98 -24q-76 0 -136 67l43 85h18q30 -50 60 -50q69 0 69 95v467h125z" />
+<glyph unicode="&#x1d5f8;" horiz-adv-x="519" d="M506 0h-142l-169 205l-20 -16v-189h-120v676h120v-365l176 150h134v-18l-209 -171z" />
+<glyph unicode="&#x1d5f9;" horiz-adv-x="235" d="M180 0h-125v625l108 51h17v-676z" />
+<glyph unicode="&#x1d5fa;" horiz-adv-x="776" d="M721 0h-118v309q0 69 -66 69q-25 0 -49.5 -20.5t-40.5 -64.5v-293h-118v309q0 69 -66 69q-22 0 -48 -21t-42 -64v-293h-118v461h114v-50h2q62 62 129 62q94 0 128 -62h1q62 62 145 62q147 0 147 -151v-322z" />
+<glyph unicode="&#x1d5fb;" horiz-adv-x="510" d="M455 0h-120v309q0 69 -66 69q-23 0 -50.5 -21t-43.5 -64v-293h-120v461h116v-50h2q62 62 133 62q149 0 149 -151v-322z" />
+<glyph unicode="&#x1d5fc;" horiz-adv-x="501" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM351 232q0 69 -26.5 107.5t-77.5 38.5q-48 0 -72.5 -41.5t-24.5 -104.5q0 -66 26 -108.5t74 -42.5q28 0 48.5 14.5t31.5 38t16 48.5t5 50z" />
+<glyph unicode="&#x1d5fd;" horiz-adv-x="512" d="M171 415h2q52 58 133 58q48 0 88 -24q93 -55 93 -201q0 -139 -74 -210q-55 -52 -140 -52q-52 0 -98 41v-195l-103 -37h-17v666h116v-46zM175 290v-140q22 -38 41.5 -53.5t50.5 -15.5q45 0 70 44t25 105q0 148 -89 148q-36 0 -58.5 -23t-39.5 -65z" />
+<glyph unicode="&#x1d5fe;" horiz-adv-x="512" d="M457 -168l-103 -37h-17v231h-2v1q-42 -41 -117 -41q-87 0 -140 65.5t-53 162.5q0 126 75 199q62 60 144 60q64 0 105 -39h3l88 39h17v-641zM337 158v158q-43 62 -92 62q-41 0 -68 -40t-27 -110q0 -69 24.5 -108t68.5 -39q61 0 94 77z" />
+<glyph unicode="&#x1d5ff;" horiz-adv-x="411" d="M406 356h-16q-22 22 -59 22q-48 0 -93.5 -54t-62.5 -135v-189h-120v461h120v-88h2q32 52 73.5 76t79.5 24q49 0 76 -19v-98z" />
+<glyph unicode="&#x1d600;" horiz-adv-x="385" d="M340 306h-15q-44 72 -125 72q-22 0 -35.5 -12t-13.5 -24q0 -21 17.5 -35t52.5 -29q86 -36 111 -65t25 -88q0 -34 -18.5 -64.5t-50.5 -48.5q-44 -25 -110 -25q-50 0 -81.5 14t-71.5 49v120h15q19 -43 60.5 -65.5t80.5 -22.5q22 0 39 12.5t17 31.5q0 16 -13 28t-53 29 q-83 36 -109 68t-26 89t43.5 95t116.5 38q49 0 81.5 -15t62.5 -46v-106z" />
+<glyph unicode="&#x1d601;" horiz-adv-x="386" d="M371 115l-11 -94q-37 -33 -116 -33q-57 0 -97.5 35.5t-40.5 102.5v240h-99v17l63 78h36v61l100 108h20v-169h107v-95h-107v-217q0 -36 17 -51t41 -15q41 0 69 32h18z" />
+<glyph unicode="&#x1d602;" horiz-adv-x="518" d="M463 10l-124 -25v70h-2q-62 -69 -143 -69q-139 0 -139 152v323h120v-310q0 -70 66 -70q22 0 50 24.5t44 67.5v288h120v-351q0 -64 8 -100z" />
+<glyph unicode="&#x1d603;" horiz-adv-x="462" d="M447 461l-203 -475h-26l-203 475h131l84 -252h2l84 252h131z" />
+<glyph unicode="&#x1d604;" horiz-adv-x="701" d="M684 461l-195 -475h-26l-109 252l-116 -252h-26l-195 475h131l81 -256h2l62 173l-35 83h131l86 -244h2l76 244h131z" />
+<glyph unicode="&#x1d605;" horiz-adv-x="506" d="M486 0h-138l-100 143l-90 -143h-138l159 243l-148 218h137l83 -121l79 121h138l-147 -223z" />
+<glyph unicode="&#x1d606;" horiz-adv-x="472" d="M455 461l-180 -496q-33 -91 -74.5 -130.5t-109.5 -39.5q-45 0 -73 22v98h16q27 -25 59 -25q33 0 55.5 24t38.5 79l-169 468h131l93 -275h2l80 275h131z" />
+<glyph unicode="&#x1d607;" horiz-adv-x="441" d="M417 95l-9 -95h-387v25l233 341h-207l8 95h361v-26l-233 -340h234z" />
+<glyph unicode="&#x1d608;" horiz-adv-x="666" d="M635 0h-96l-33 200h-249l-130 -200h-96l457 674h26zM495 274l-37 229l-151 -229h188z" />
+<glyph unicode="&#x1d609;" horiz-adv-x="604" d="M239 662h205q197 0 197 -117q0 -57 -33.5 -104.5t-97.5 -74.5q91 -33 91 -122q0 -102 -84 -173t-203 -71h-240zM259 394h90q200 0 200 131q0 63 -112 63h-130zM179 74h126q96 0 151.5 45t55.5 111q0 52 -42.5 69.5t-150.5 17.5h-79z" />
+<glyph unicode="&#x1d60a;" horiz-adv-x="671" d="M755 554l-26 -101h-19q-8 55 -41 89.5t-71.5 46t-84.5 11.5q-133 0 -229.5 -106t-96.5 -247q0 -87 50.5 -136t144.5 -49q123 0 246 108l38 -51q-136 -133 -306 -133q-128 0 -196 65.5t-68 176.5q0 119 59.5 222.5t160 164.5t215.5 61q75 0 136.5 -29.5t87.5 -92.5z" />
+<glyph unicode="&#x1d60b;" horiz-adv-x="692" d="M239 662h166q346 0 346 -233q0 -77 -31 -152.5t-87.5 -137.5t-146 -100.5t-197.5 -38.5h-215zM179 74h49q94 0 147 7.5t107 32.5q80 37 128.5 117.5t48.5 177.5q0 179 -292 179h-60z" />
+<glyph unicode="&#x1d60c;" horiz-adv-x="583" d="M678 662l-19 -74h-352l-50 -202h305l-19 -75h-305l-59 -237h379l-35 -74h-449l165 662h439z" />
+<glyph unicode="&#x1d60d;" horiz-adv-x="535" d="M679 662l-10 -74h-362l-50 -202h296l-19 -75h-296l-77 -311h-87l165 662h440z" />
+<glyph unicode="&#x1d60e;" horiz-adv-x="695" d="M755 565l-25 -103h-19q-32 138 -189 138q-94 0 -171.5 -50.5t-119 -127.5t-41.5 -160q0 -87 52 -143.5t152 -56.5q83 0 126.5 18t49.5 43l40 158h-89v76h195l-75 -298q-45 -26 -69 -37t-78.5 -23.5t-122.5 -12.5q-129 0 -201.5 67.5t-72.5 180.5q0 87 36.5 168.5 t97 141.5t142.5 96t168 36q165 0 214 -111z" />
+<glyph unicode="&#x1d60f;" horiz-adv-x="658" d="M749 662l-165 -662h-87l75 301h-336l-75 -301h-87l165 662h87l-72 -287h336l72 287h87z" />
+<glyph unicode="&#x1d610;" horiz-adv-x="401" d="M512 662l-10 -74h-111l-128 -514h111l-27 -74h-288l4 74h111l128 514h-111l33 74h288z" />
+<glyph unicode="&#x1d611;" horiz-adv-x="398" d="M470 662l-113 -450q-27 -107 -77 -166.5t-141 -59.5q-76 0 -117 56l38 76h17q14 -23 37.5 -39.5t46.5 -16.5q25 0 44 12.5t31.5 38t18.5 43.5t14 50l114 456h87z" />
+<glyph unicode="&#x1d612;" horiz-adv-x="634" d="M729 662l-5 -17l-378 -288l284 -357h-119l-241 302l-42 -33l-67 -269h-87l165 662h87l-72 -287l380 287h95z" />
+<glyph unicode="&#x1d613;" horiz-adv-x="559" d="M564 74l-36 -74h-454l165 662h87l-147 -588h385z" />
+<glyph unicode="&#x1d614;" horiz-adv-x="843" d="M933 662l-165 -662h-85l135 543l-386 -543h-21l-117 541l-134 -541h-85l165 662h123l104 -482l343 482h123z" />
+<glyph unicode="&#x1d615;" horiz-adv-x="675" d="M766 662l-169 -676l-65 14l-231 564l-140 -564h-87l165 662h121l198 -484l121 484h87z" />
+<glyph unicode="&#x1d616;" horiz-adv-x="714" d="M779 430q0 -123 -63.5 -227t-161 -160.5t-201.5 -56.5q-116 0 -185 66.5t-69 179.5q0 124 63.5 228t160.5 160t202 56q116 0 185 -66.5t69 -179.5zM689 421q0 85 -47.5 132t-135.5 47q-110 0 -192 -72.5t-113 -196.5q-12 -49 -12 -90q0 -85 47.5 -132t135.5 -47 q110 0 192 72.5t113 196.5q12 49 12 90z" />
+<glyph unicode="&#x1d617;" horiz-adv-x="525" d="M239 662h184q215 0 215 -133q0 -102 -81 -173t-205 -71h-120l-71 -285h-87zM250 359h88q105 0 157 40.5t52 108.5q0 80 -157 80h-83z" />
+<glyph unicode="&#x1d618;" horiz-adv-x="716" d="M651 -157l-4 -18q-39 0 -59 0.5t-54.5 2t-54 6t-47.5 12t-45.5 20t-37 30t-33.5 41.5t-24 55q-90 17 -141.5 81t-51.5 160q0 124 63.5 227.5t160.5 159.5t202 56q116 0 185 -66.5t69 -179.5q0 -85 -32.5 -163.5t-85.5 -135t-121 -94t-139 -47.5q11 -31 30.5 -50 t47.5 -27.5t50 -11t57 -2.5zM689 421q0 85 -47.5 132t-135.5 47q-110 0 -192 -72.5t-113 -196.5q-12 -49 -12 -90q0 -85 47.5 -132t135.5 -47q110 0 192 72.5t113 196.5q12 49 12 90z" />
+<glyph unicode="&#x1d619;" horiz-adv-x="589" d="M239 662h185q215 0 215 -130q0 -88 -65 -151t-164 -78l171 -303h-103l-173 299h-70l-74 -299h-87zM253 373h89q207 0 207 141q0 39 -38 56.5t-121 17.5h-83z" />
+<glyph unicode="&#x1d61a;" horiz-adv-x="541" d="M597 596l-30 -119h-19q-9 60 -49 91.5t-98 31.5q-51 0 -91.5 -35t-40.5 -77q0 -59 112 -110q79 -35 113.5 -72t34.5 -87q0 -104 -82.5 -168.5t-192.5 -64.5q-145 0 -192 84l21 135h18q14 -73 62.5 -108t105.5 -35q74 0 120 35.5t46 88.5q0 33 -23.5 57.5t-75.5 47.5 q-82 37 -119.5 75.5t-37.5 89.5q0 94 74.5 157t171.5 63q124 0 172 -80z" />
+<glyph unicode="&#x1d61b;" horiz-adv-x="608" d="M748 662l-9 -74h-245l-147 -588h-87l146 588h-245l29 74h558z" />
+<glyph unicode="&#x1d61c;" horiz-adv-x="661" d="M757 662l-105 -419q-32 -126 -114.5 -191.5t-211.5 -65.5q-209 0 -209 168q0 40 12 89l105 419h87l-102 -406q-14 -55 -14 -83q0 -52 37 -81.5t103 -29.5q55 0 102 21.5t76 57.5q25 31 49 128l98 393h87z" />
+<glyph unicode="&#x1d61d;" horiz-adv-x="654" d="M788 662l-451 -673h-26l-115 673h95l77 -498l324 498h96z" />
+<glyph unicode="&#x1d61e;" horiz-adv-x="921" d="M1057 662l-396 -673h-28l-67 446l-284 -446h-28l-60 673h95l34 -476v2l301 474l65 -476v2l273 474h95z" />
+<glyph unicode="&#x1d61f;" horiz-adv-x="700" d="M806 662l-317 -313l180 -349h-105l-145 283l-283 -283h-105l352 349l-162 313h106l125 -248l247 248h107z" />
+<glyph unicode="&#x1d620;" horiz-adv-x="630" d="M774 662l-344 -374l-72 -288h-87l71 288l-156 374h95l124 -300l274 300h95z" />
+<glyph unicode="&#x1d621;" horiz-adv-x="637" d="M763 662l-6 -21l-569 -567h433l-26 -74h-567l6 25l566 563h-392l27 74h528z" />
+<glyph unicode="&#x1d622;" horiz-adv-x="448" d="M169 302l-41 31q30 68 85.5 99t120.5 31q63 0 98 -26.5t35 -74.5q0 -14 -5 -36l-63 -250q-8 -29 -8 -76h-85l5 44q-72 -54 -162 -54q-44 0 -69 19.5t-25 56.5q0 168 320 228l8 33q2 10 2 15q0 23 -19.5 36.5t-51.5 13.5q-76 0 -130 -90h-15zM334 132l23 90 q-218 -35 -218 -126q0 -35 48 -35q68 0 147 71z" />
+<glyph unicode="&#x1d623;" horiz-adv-x="496" d="M311 679l-66 -265q67 49 140 49q70 0 110 -40.5t40 -109.5q0 -131 -95 -227t-215 -96q-103 0 -151 57l153 613l76 24zM217 302l-52 -208q31 -33 83 -33q72 0 138 63t66 164q0 48 -25.5 76t-74.5 28q-36 0 -72.5 -23.5t-62.5 -66.5z" />
+<glyph unicode="&#x1d624;" horiz-adv-x="456" d="M503 371l-57 -54h-16q-14 75 -95 75q-64 0 -124.5 -61t-60.5 -162q0 -51 28.5 -79.5t74.5 -28.5q81 0 155 105l56 -34q-96 -142 -235 -142q-74 0 -118 42t-44 118q0 130 92 221.5t198 91.5q55 0 94.5 -23t51.5 -69z" />
+<glyph unicode="&#x1d625;" horiz-adv-x="494" d="M600 679l-138 -551q-16 -66 -22 -115l-78 -24l-8 5l10 50q-69 -54 -150 -54q-65 0 -103.5 40.5t-38.5 113.5q0 125 92 222t196 97q55 0 98 -37l58 234l76 24zM391 158l43 171q-27 63 -88 63q-65 0 -128 -65.5t-63 -158.5q0 -53 26.5 -80t70.5 -27q35 0 73 26.5t66 70.5z " />
+<glyph unicode="&#x1d626;" horiz-adv-x="444" d="M403 167l57 -35q-56 -76 -108.5 -109t-124.5 -33q-73 0 -115.5 41.5t-42.5 116.5q0 96 45.5 170t109.5 109.5t129 35.5q64 0 99 -34.5t35 -94.5q0 -29 -7 -57l-14 -55h-309q-7 -28 -7 -54q0 -51 28.5 -79t74.5 -28q79 0 150 106zM188 293h215q4 16 4 33q0 66 -80 66 q-40 0 -79 -25t-60 -74z" />
+<glyph unicode="&#x1d627;" horiz-adv-x="336" d="M526 633l-38 -59l-17 -1q-24 22 -37.5 30.5t-32.5 8.5q-31 0 -56.5 -25t-38.5 -78l-14 -56h114l-17 -71h-114l-95 -382h-79l95 382h-81l17 71h81l11 41q28 101 84 149q50 40 104 40q68 0 114 -50z" />
+<glyph unicode="&#x1d628;" horiz-adv-x="496" d="M575 436l-16 -67h-78q4 -20 4 -30q0 -83 -66 -142t-147 -59q-31 0 -59 8q-54 -28 -54 -55q0 -26 40 -27q144 -5 187 -19q61 -20 61 -76q0 -49 -29.5 -86.5t-76.5 -58t-98.5 -30.5t-103.5 -10q-67 0 -106.5 22t-39.5 66q0 41 27 78.5t73 59.5q-23 18 -23 45q0 28 19.5 54 t69.5 69q-28 33 -28 78q0 80 68.5 143.5t157.5 63.5q29 0 74 -13.5t76 -13.5h68zM404 329q0 63 -71 63q-49 0 -85 -36.5t-36 -80.5q0 -30 21 -48t58 -18q49 0 81 36.5t32 83.5zM197 -15h-20q-46 -13 -73.5 -35t-27.5 -48q0 -47 89 -47q81 0 139.5 22.5t58.5 70.5 q0 37 -166 37z" />
+<glyph unicode="&#x1d629;" horiz-adv-x="487" d="M311 679l-69 -274q44 35 80.5 46.5t82.5 11.5q49 0 77 -25t28 -72q0 -21 -6 -45l-80 -321h-79l75 304q5 22 5 34q0 54 -65 54q-29 0 -73.5 -25t-69.5 -65l-75 -302h-79l164 660l76 24z" />
+<glyph unicode="&#x1d62a;" horiz-adv-x="220" d="M325 679l-23 -93h-92l23 93h92zM266 459l-114 -459h-83l109 440l80 24z" />
+<glyph unicode="&#x1d62b;" horiz-adv-x="254" d="M354 679l-23 -93h-93l23 93h93zM294 459l-121 -485q-24 -93 -74 -141.5t-117 -48.5q-50 0 -100 36l43 64h16q36 -28 58 -28q63 0 88 102l120 481l79 25z" />
+<glyph unicode="&#x1d62c;" horiz-adv-x="453" d="M556 453l-3 -14l-292 -184l191 -255h-103l-156 207l-51 -207h-79l164 660l76 24l8 -5l-94 -376l235 150h104z" />
+<glyph unicode="&#x1d62d;" horiz-adv-x="205" d="M313 679l-169 -679h-83l164 660l80 24z" />
+<glyph unicode="&#x1d62e;" horiz-adv-x="756" d="M253 459l-14 -57q64 61 154 61q88 0 115 -65q74 65 158 65q49 0 79 -26t30 -76q0 -21 -6 -46l-78 -315h-77l73 293q6 24 6 42q0 57 -61 57q-27 0 -72 -25.5t-68 -64.5l-75 -302h-77l71 290q7 32 7 45q0 57 -59 57q-27 0 -72.5 -25t-69.5 -65l-75 -302h-77l109 440l71 24z " />
+<glyph unicode="&#x1d62f;" horiz-adv-x="487" d="M251 459l-12 -57q45 36 83 48.5t83 12.5q47 0 76 -25.5t29 -65.5q0 -24 -6 -51l-80 -321h-79l75 304q5 22 5 35q0 53 -65 53q-29 0 -73.5 -25t-69.5 -65l-75 -302h-79l109 440l71 24z" />
+<glyph unicode="&#x1d630;" horiz-adv-x="499" d="M536 300q0 -49 -20.5 -103t-56.5 -100.5t-92.5 -76.5t-121.5 -30q-79 0 -124 47t-45 123q0 115 84.5 209t199.5 94q82 0 129 -43t47 -120zM455 282q0 52 -29.5 81t-82.5 29q-75 0 -130.5 -67t-55.5 -148q0 -53 28.5 -84.5t78.5 -31.5q48 0 87 26t60.5 63t32.5 72t11 60z " />
+<glyph unicode="&#x1d631;" horiz-adv-x="498" d="M256 459l-11 -50q69 54 151 54q65 0 103.5 -41.5t38.5 -114.5q0 -123 -92.5 -220t-195.5 -97q-56 0 -98 36l-54 -218l-76 -24l-8 5l162 651l73 24zM219 295l-43 -172q23 -62 88 -62q76 0 133.5 67.5t57.5 155.5q0 48 -25 78t-72 30q-35 0 -73 -26.5t-66 -70.5z" />
+<glyph unicode="&#x1d632;" horiz-adv-x="498" d="M549 458l-167 -669l-10 -5l-64 24l58 234q-67 -52 -148 -52q-66 0 -106 41.5t-40 115.5q0 123 92.5 219.5t195.5 96.5q66 0 105 -35l74 36zM395 158l43 171q-12 30 -37.5 46.5t-54.5 16.5q-65 0 -128 -65.5t-63 -158.5q0 -48 25 -77.5t72 -29.5q35 0 75.5 27t67.5 70z " />
+<glyph unicode="&#x1d633;" horiz-adv-x="336" d="M439 447l-18 -70h-20q-3 7 -15 11t-20 4q-43 0 -87 -42t-79 -116l-58 -234h-79l109 440l76 24l8 -5l-14 -64q64 68 144 68q37 0 53 -16z" />
+<glyph unicode="&#x1d634;" horiz-adv-x="389" d="M432 410l-22 -89h-15q-17 44 -42 58t-64 14t-58.5 -21.5t-19.5 -41.5t17 -34.5t50 -30.5q60 -29 83.5 -51.5t23.5 -55.5q0 -68 -56 -118t-143 -50q-45 0 -72 13t-53 42l25 103h15q18 -87 109 -87q34 0 63 17.5t29 49.5q0 15 -16 28.5t-54 32.5q-55 27 -79.5 53.5 t-24.5 60.5q0 62 52 111t129 49q87 0 123 -53z" />
+<glyph unicode="&#x1d635;" horiz-adv-x="291" d="M376 453l-17 -71h-104l-61 -245q-6 -24 -6 -39q0 -37 38 -37q36 0 70 26h12l-30 -75q-34 -22 -93 -22q-41 0 -62.5 20.5t-21.5 56.5q0 15 5 37l70 278h-80l4 17l58 54h35l16 64l77 63h18l-32 -127h104z" />
+<glyph unicode="&#x1d636;" horiz-adv-x="491" d="M536 453l-81 -325q-16 -66 -22 -115l-77 -24l-8 5l14 65q-37 -32 -83 -50.5t-85 -18.5q-47 0 -76 25.5t-29 65.5q0 25 6 50l80 322h79l-75 -304q-5 -19 -5 -35q0 -53 65 -53q28 0 74.5 29.5t71.5 70.5l72 292h79z" />
+<glyph unicode="&#x1d637;" horiz-adv-x="474" d="M555 453l-311 -467h-22l-79 467h85l48 -299l194 299h85z" />
+<glyph unicode="&#x1d638;" horiz-adv-x="702" d="M787 453l-312 -467h-22l-37 244l-183 -244h-21l-72 467h84l47 -304l129 176q-3 25 -10.5 73.5t-8.5 54.5h84l48 -294l189 294h85z" />
+<glyph unicode="&#x1d639;" horiz-adv-x="482" d="M544 453l-200 -217l108 -236h-94l-79 175l-155 -175h-94l220 239l-96 214h94l68 -151l134 151h94z" />
+<glyph unicode="&#x1d63a;" horiz-adv-x="484" d="M565 453l-301 -497q-54 -89 -102.5 -130.5t-112.5 -41.5q-48 0 -68 24l18 72h16q26 -24 54 -24q32 0 69 38.5t71 99.5q2 4 9 15.5t10 17.5q-14 81 -45 237t-37 189h86l59 -323l189 323h85z" />
+<glyph unicode="&#x1d63b;" horiz-adv-x="447" d="M517 453l-5 -20l-342 -362h264l-27 -71h-382l4 20l342 362h-227l29 71h344z" />
+<glyph unicode="&#x1d63c;" horiz-adv-x="690" d="M665 0h-130l-26 162h-248l-106 -162h-130l478 690h28zM493 264l-32 204l-134 -204h166z" />
+<glyph unicode="&#x1d63d;" horiz-adv-x="636" d="M248 676h237q206 0 206 -125q0 -53 -35 -102t-101 -76l1 -4q92 -49 92 -128q0 -100 -90 -170.5t-218 -70.5h-260zM310 413h72q88 0 128 32.5t40 79.5q0 49 -86 49h-113zM233 102h103q86 0 128.5 37t42.5 93q0 41 -42 60t-105 19h-75z" />
+<glyph unicode="&#x1d63e;" horiz-adv-x="723" d="M797 597l-37 -149h-11q-36 141 -183 141q-117 0 -211 -91.5t-94 -238.5q0 -78 41 -127t123 -49q63 0 118 25.5t124 84.5l52 -68q-152 -144 -321 -144q-135 0 -207 69t-72 185q0 121 62 226.5t167 167.5t226 62q80 0 135.5 -20t87.5 -74z" />
+<glyph unicode="&#x1d63f;" horiz-adv-x="709" d="M248 676h179q345 0 345 -232q0 -51 -15 -108t-50.5 -117.5t-86.5 -108.5t-132 -79t-179 -31h-229zM235 102h67q258 0 317 234q11 47 11 81q0 157 -199 157h-78z" />
+<glyph unicode="&#x1d640;" horiz-adv-x="635" d="M728 676l-25 -102h-350l-42 -167h241l-26 -103h-241l-50 -202h387l-52 -102h-490l168 676h480z" />
+<glyph unicode="&#x1d641;" horiz-adv-x="582" d="M725 676l-12 -102h-360l-43 -169h213l-25 -102h-213l-75 -303h-130l168 676h477z" />
+<glyph unicode="&#x1d642;" horiz-adv-x="746" d="M785 597l-37 -149h-11q-37 141 -188 141q-72 0 -139 -38t-113.5 -115t-46.5 -175q0 -78 41 -128t127 -50q77 0 166 43l32 129h-112v102h256l-70 -279q-46 -31 -75.5 -47t-92 -33t-133.5 -17q-137 0 -209.5 68t-72.5 184q0 120 61 225.5t166.5 169t228.5 63.5 q79 0 133.5 -20.5t88.5 -73.5z" />
+<glyph unicode="&#x1d643;" horiz-adv-x="715" d="M803 676l-168 -676h-130l74 297h-295l-74 -297h-130l168 676h130l-69 -277h295l69 277h130z" />
+<glyph unicode="&#x1d644;" horiz-adv-x="440" d="M534 676l-16 -102h-90l-118 -472h90l-34 -102h-287l11 102h90l118 472h-90l39 102h287z" />
+<glyph unicode="&#x1d645;" horiz-adv-x="481" d="M574 676l-136 -545q-26 -104 -96.5 -165.5t-171.5 -61.5q-96 0 -155 98l73 98h18q21 -49 41.5 -71.5t57.5 -22.5q44 0 65.5 30.5t34.5 81.5l139 558h130z" />
+<glyph unicode="&#x1d646;" horiz-adv-x="712" d="M816 676l-3 -14l-388 -278l282 -384h-170l-220 306l-40 -29l-69 -277h-128l168 676h128l-66 -263l361 263h145z" />
+<glyph unicode="&#x1d647;" horiz-adv-x="603" d="M612 102l-44 -102h-488l168 676h130l-143 -574h377z" />
+<glyph unicode="&#x1d648;" horiz-adv-x="913" d="M1001 676l-168 -676h-128l116 467l-351 -467h-27l-119 467l-116 -467h-128l168 676h161l104 -440h3l324 440h161z" />
+<glyph unicode="&#x1d649;" horiz-adv-x="724" d="M812 676l-173 -694l-100 20l-206 500l-125 -502h-128l168 676h157l173 -424l106 424h128z" />
+<glyph unicode="&#x1d64a;" horiz-adv-x="778" d="M840 434q0 -42 -13 -97q-40 -157 -163.5 -256t-278.5 -99q-128 0 -203.5 70t-75.5 187q0 126 66.5 231.5t170.5 163.5t218 58q128 0 203.5 -70.5t75.5 -187.5zM701 425q0 77 -42 121t-123 44q-120 0 -205.5 -98.5t-85.5 -244.5q0 -77 42 -120t123 -43q103 0 176.5 68.5 t102.5 184.5q12 48 12 88z" />
+<glyph unicode="&#x1d64b;" horiz-adv-x="581" d="M248 676h209q238 0 238 -144q0 -110 -90.5 -182t-222.5 -72h-103l-69 -278h-130zM304 380h71q89 0 137 32t48 92q0 70 -142 70h-65z" />
+<glyph unicode="&#x1d64c;" horiz-adv-x="779" d="M714 -160l-4 -16q-50 0 -75.5 0.5t-69.5 3.5t-68.5 9t-58 17.5t-54.5 28.5t-42 43.5t-35 60.5q-95 21 -148.5 86.5t-53.5 162.5q0 127 67 233.5t171.5 164t217.5 57.5q128 0 203 -69.5t75 -187.5q0 -167 -110 -290.5t-263 -155.5q17 -27 48.5 -41.5t57.5 -17t70 -3.5z M700 425q0 77 -42 120.5t-123 43.5q-119 0 -205 -98.5t-86 -243.5q0 -77 42.5 -120.5t123.5 -43.5q102 0 175.5 68.5t102.5 184.5q12 48 12 89z" />
+<glyph unicode="&#x1d64d;" horiz-adv-x="670" d="M248 676h216q116 0 175 -36t59 -104q0 -84 -62.5 -149.5t-158.5 -86.5l180 -300h-159l-175 291h-41l-72 -291h-130zM307 393h71q184 0 184 119q0 32 -34 47t-110 15h-65z" />
+<glyph unicode="&#x1d64e;" horiz-adv-x="554" d="M637 620l-38 -154h-14q-9 57 -55 90t-101 33q-47 0 -87 -25.5t-40 -73.5q0 -30 26 -50.5t73 -40.5q89 -38 126 -74t37 -87q0 -50 -31.5 -109.5t-80.5 -95.5q-72 -52 -191 -52q-133 0 -195 81l24 162h14q16 -69 72.5 -105t111.5 -36q42 0 72.5 13.5t44.5 34t19.5 37 t5.5 30.5q0 27 -21 44t-74 39q-87 37 -125.5 76.5t-38.5 93.5q0 102 82 171t192 69q69 0 120 -20t72 -51z" />
+<glyph unicode="&#x1d64f;" horiz-adv-x="641" d="M785 676l-15 -102h-240l-143 -574h-130l143 574h-243l39 102h589z" />
+<glyph unicode="&#x1d650;" horiz-adv-x="699" d="M792 676l-107 -430q-65 -265 -340 -265q-222 0 -222 171q0 43 13 94l107 430h128l-104 -419q-15 -60 -15 -82q0 -44 31 -68t87 -24q91 0 150 70q20 24 43 116l101 407h128z" />
+<glyph unicode="&#x1d651;" horiz-adv-x="690" d="M833 676l-479 -694h-28l-133 694h130l74 -465l306 465h130z" />
+<glyph unicode="&#x1d652;" horiz-adv-x="997" d="M1135 676l-427 -691l-28 1l-82 408h-3l-286 -409h-28l-83 691h130l38 -439l304 439l79 -439l255 439h131z" />
+<glyph unicode="&#x1d653;" horiz-adv-x="740" d="M853 676l-325 -333l172 -343h-154l-120 239l-232 -239h-154l334 343l-165 333h154l113 -228l223 228h154z" />
+<glyph unicode="&#x1d654;" horiz-adv-x="694" d="M842 676l-360 -394l-70 -282h-130l70 282l-164 394h145l111 -283l253 283h145z" />
+<glyph unicode="&#x1d655;" horiz-adv-x="653" d="M769 676l-4 -16l-513 -558h396l-40 -102h-583l3 16l512 558h-334l38 102h525z" />
+<glyph unicode="&#x1d656;" horiz-adv-x="489" d="M181 308l-65 44q36 61 98.5 91t139.5 30q67 0 110 -27.5t43 -76.5q0 -15 -4 -30l-66 -263q-7 -29 -9 -76h-125l4 44q-40 -33 -77.5 -45.5t-87.5 -12.5q-41 0 -67.5 25t-26.5 70q0 41 18.5 81.5t47.5 66.5q74 68 261 79l4 16q2 10 2 15q0 39 -62 39q-85 0 -126 -70h-12z M336 152l16 61q-28 0 -54.5 -4t-55.5 -13t-46.5 -29.5t-17.5 -49.5q0 -36 47 -36q60 0 111 71z" />
+<glyph unicode="&#x1d657;" horiz-adv-x="512" d="M283 426l-1 -1q62 48 137 48q65 0 102 -40t37 -111q0 -77 -39.5 -160t-97.5 -128q-61 -47 -152 -47q-30 0 -59 12.5t-40 30.5h-3l-103 -43h-13l172 689h120l-62 -250h2zM250 301l-40 -158q25 -61 79 -61q52 0 95 63.5t43 144.5q0 41 -17 64.5t-45 23.5q-65 0 -115 -77z " />
+<glyph unicode="&#x1d658;" horiz-adv-x="462" d="M524 368l-91 -57h-17q-1 67 -68 67q-47 0 -97 -54.5t-50 -139.5q0 -42 22 -69t63 -27q71 0 123 57l52 -67q-59 -55 -104 -73.5t-116 -18.5q-78 0 -124 46t-46 122q0 90 47.5 165t116 114.5t138.5 39.5q64 0 107.5 -27.5t43.5 -77.5z" />
+<glyph unicode="&#x1d659;" horiz-adv-x="518" d="M625 676l-137 -550q-17 -68 -24 -118l-120 -22l-6 3l11 45h-2q-58 -48 -134 -48q-69 0 -106.5 40t-37.5 113q0 142 84.5 238t195.5 96q56 0 96 -39l60 242h120zM379 169l35 140q-14 38 -29 53.5t-46 15.5q-56 0 -98 -67t-42 -140q0 -41 16.5 -65.5t48.5 -24.5 q35 0 60.5 22t54.5 66z" />
+<glyph unicode="&#x1d65a;" horiz-adv-x="452" d="M398 143l54 -66q-61 -54 -103.5 -72t-106.5 -18q-81 0 -126 44t-45 120q0 51 20.5 109.5t49.5 98.5q82 114 216 114q67 0 101 -40.5t34 -110.5q0 -41 -12 -89l-7 -28h-272q-5 -15 -5 -39q-1 -39 23 -58.5t62 -19.5q67 0 117 55zM233 300h143q4 16 4 30q0 48 -53 48 q-26 0 -55 -22.5t-39 -55.5z" />
+<glyph unicode="&#x1d65b;" horiz-adv-x="340" d="M533 639l-45 -90l-17 -1q-17 49 -72 49q-59 0 -80 -84l-13 -51h90l-23 -95h-90l-91 -367h-120l91 367h-58l23 95h58l11 42q24 92 83.5 140t132.5 48q49 0 73 -11t47 -42z" />
+<glyph unicode="&#x1d65c;" horiz-adv-x="504" d="M599 450l-24 -95h-56q7 -4 7 -23q0 -62 -42 -107.5t-96.5 -65t-108.5 -19.5h-25q-57 -6 -57 -41q0 -23 40 -23h84q160 0 160 -94q0 -52 -27.5 -89.5t-76 -58.5t-105 -30.5t-122.5 -9.5q-68 0 -108 23t-40 67q0 32 21.5 61.5t63.5 48.5q-28 15 -28 46q0 35 23.5 63.5 t83.5 61.5v2q-53 41 -53 92q0 87 77 150t180 63q42 0 77 -14q15 -6 25 -7t55 -1h72zM410 325q0 52 -71 52q-50 0 -79 -29.5t-29 -62.5q0 -51 72 -51q48 0 77.5 25.5t29.5 65.5zM309 -19h-105q-38 -4 -53 -21t-15 -33q0 -38 78 -38q138 0 138 66q0 26 -43 26z" />
+<glyph unicode="&#x1d65d;" horiz-adv-x="510" d="M278 415h2q73 58 143 58q119 0 119 -98q0 -25 -7 -53l-80 -322h-120l77 309q3 13 3 25q0 44 -52 44q-23 0 -56 -21t-59 -64l-73 -293h-120l168 676h120z" />
+<glyph unicode="&#x1d65e;" horiz-adv-x="245" d="M366 688l-36 -145h-145l36 145h145zM298 462l-114 -462h-125l114 462h125z" />
+<glyph unicode="&#x1d65f;" horiz-adv-x="324" d="M440 688l-36 -145h-145l36 145h145zM372 462l-119 -478q-22 -90 -84.5 -138t-140.5 -48q-75 0 -118 67l64 85h18q16 -50 46 -50q70 0 93 95l116 467h125z" />
+<glyph unicode="&#x1d660;" horiz-adv-x="519" d="M599 462l-4 -18l-252 -171l163 -273h-142l-118 205l-24 -16l-47 -189h-120l168 676h120l-91 -364l213 150h134z" />
+<glyph unicode="&#x1d661;" horiz-adv-x="235" d="M348 676l-168 -676h-125l155 625l121 51h17z" />
+<glyph unicode="&#x1d662;" horiz-adv-x="776" d="M530 412h1q78 61 160 61q118 0 118 -95q0 -23 -8 -55l-80 -323h-118l77 310q3 14 3 25q0 44 -52 44q-25 0 -55 -20.5t-56 -64.5l-73 -294h-118l77 310q3 14 3 25q0 44 -52 44q-23 0 -54 -21t-57 -64l-73 -294h-118l114 462h114l-12 -50h2q78 61 144 61q94 0 113 -61z" />
+<glyph unicode="&#x1d663;" horiz-adv-x="510" d="M273 412h2q78 61 148 61q119 0 119 -97q0 -25 -7 -53l-80 -323h-120l77 310q3 14 3 25q0 44 -52 44q-23 0 -56 -21t-59 -64l-73 -294h-120l114 462h116z" />
+<glyph unicode="&#x1d664;" horiz-adv-x="501" d="M542 298q0 -127 -92 -219.5t-204 -92.5q-78 0 -126 48t-48 127q0 131 93 221.5t206 90.5q78 0 124.5 -48t46.5 -127zM417 295q0 83 -76 83q-59 0 -100.5 -65.5t-41.5 -142.5q0 -89 71 -89q40 0 71 27t46 65.5t22.5 70t7.5 51.5z" />
+<glyph unicode="&#x1d665;" horiz-adv-x="512" d="M274 416h2q68 57 147 57q63 0 99.5 -39t36.5 -105q0 -140 -88 -241.5t-202 -101.5q-52 0 -88 41l-48 -195l-113 -37h-17l166 667h116zM247 291l-35 -141q13 -38 28.5 -53.5t46.5 -15.5q60 0 101.5 74.5t41.5 149.5q0 74 -63 74t-120 -88z" />
+<glyph unicode="&#x1d666;" horiz-adv-x="512" d="M574 473l-159 -641l-113 -37h-17l58 231l-2 1q-52 -41 -127 -41q-69 0 -107 43t-38 113q0 130 89.5 230.5t202.5 100.5q64 0 96 -39l100 39h17zM376 158l39 158q-27 62 -76 62q-48 0 -95 -61t-47 -153q0 -39 17 -61t49 -22q61 0 113 77z" />
+<glyph unicode="&#x1d667;" horiz-adv-x="411" d="M519 455l-25 -98h-16q-15 22 -53 22q-48 0 -107 -54t-96 -136l-47 -189h-120l114 462h120l-22 -88h2q45 52 92.5 75.5t85.5 23.5q49 0 72 -18z" />
+<glyph unicode="&#x1d668;" horiz-adv-x="385" d="M442 412l-26 -106h-15q-26 72 -107 72q-29 0 -44 -16t-15 -30q0 -17 14 -29t41 -25q60 -28 82.5 -50.5t22.5 -54.5q0 -77 -62 -131.5t-159 -54.5q-50 0 -78 14t-59 49l30 120h15q8 -43 44 -65.5t75 -22.5q25 0 46.5 15.5t21.5 38.5q0 12 -11 22t-42 25q-57 28 -80 53 t-23 58q0 72 55.5 125.5t144.5 53.5q49 0 78 -15t51 -46z" />
+<glyph unicode="&#x1d669;" horiz-adv-x="386" d="M447 462l-23 -95h-107l-54 -218q-4 -13 -4 -25q0 -41 45 -41q40 0 77 32h18l-34 -94q-45 -33 -124 -33q-47 0 -78 24.5t-31 72.5q0 22 5 41l60 241h-99l4 17l82 78h36l16 61l127 108h20l-43 -169h107z" />
+<glyph unicode="&#x1d66a;" horiz-adv-x="518" d="M569 462l-87 -352q-16 -67 -17 -100l-130 -25l17 70h-2q-79 -69 -160 -69q-109 0 -109 94q0 24 8 58l80 324h120l-77 -311q-3 -13 -3 -25q0 -45 52 -45q22 0 56 24.5t61 67.5l71 289h120z" />
+<glyph unicode="&#x1d66b;" horiz-adv-x="462" d="M561 462l-321 -476h-26l-85 476h130l23 -253h2l146 253h131z" />
+<glyph unicode="&#x1d66c;" horiz-adv-x="701" d="M798 462l-313 -476h-26l-46 253l-179 -253h-26l-77 476h130l19 -257h2l105 174l-15 83h131l26 -245h2l136 245h131z" />
+<glyph unicode="&#x1d66d;" horiz-adv-x="506" d="M582 462l-202 -223l106 -239h-138l-65 143l-125 -143h-138l219 244l-94 218h137l53 -121l109 121h138z" />
+<glyph unicode="&#x1d66e;" horiz-adv-x="472" d="M569 462l-303 -496q-55 -90 -107 -130t-120 -40q-44 0 -66 22l24 98h15q21 -25 53 -25q63 0 120 103l-53 468h131l25 -275h2l148 275h131z" />
+<glyph unicode="&#x1d66f;" horiz-adv-x="441" d="M530 462l-6 -26l-318 -341h234l-32 -95h-387l6 25l318 342h-207l31 95h361z" />
+<glyph unicode="&#x1d670;" horiz-adv-x="525" d="M496 40v-16q0 -10 -7 -17t-17 -7h-127q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h31l-26 117h-178l-26 -117h32q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-128q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h36l130 585q2 10 10.5 17t19.5 7h30q11 0 19.5 -7t10.5 -17l130 -585h36 q10 0 17 -7t7 -17zM186 245h150q-74 336 -74 344h-1q0 -3 -75 -344z" />
+<glyph unicode="&#x1d671;" horiz-adv-x="525" d="M53 662h240q69 0 118 -49t49 -119q0 -50 -30 -90.5t-79 -57.5q56 -13 92.5 -59t36.5 -105q0 -76 -48.5 -129t-117.5 -53h-261q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h43v534h-43q-10 0 -17 7t-7 17v16q0 10 7 17t17 7zM155 376h117q54 0 92 34.5t38 83.5q0 43 -32 73.5 t-77 30.5h-138v-222zM155 64h138q53 0 91 34.5t38 83.5q0 53 -35 91.5t-84 38.5h-148v-248z" />
+<glyph unicode="&#x1d672;" horiz-adv-x="525" d="M448 232h10q10 0 17 -7t7 -17q0 -89 -58 -154t-144 -65q-103 0 -171.5 101.5t-68.5 239.5t68.5 240t171.5 102q80 0 137 -65l15 48q5 17 23 17h3q10 0 17 -7t7 -17v-206q0 -10 -7 -17t-17 -7h-10q-10 0 -16.5 6.5t-7.5 15.5q-6 72 -42.5 120t-88.5 48q-78 0 -136.5 -80 t-58.5 -198q0 -117 59 -197t137 -80q55 0 92.5 45t37.5 110q0 10 7 17t17 7z" />
+<glyph unicode="&#x1d673;" horiz-adv-x="525" d="M49 662h222q88 0 150 -99t62 -238q0 -135 -62 -230t-150 -95h-222q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h38v534h-38q-10 0 -17 7t-7 17v16q0 10 7 17t17 7zM146 64h110q70 0 119.5 76.5t49.5 184.5q0 113 -49.5 193t-119.5 80h-110v-534z" />
+<glyph unicode="&#x1d674;" horiz-adv-x="525" d="M500 150v-126q0 -10 -7 -17t-17 -7h-421q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h46v534h-46q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h400q10 0 17 -7t7 -17v-111q0 -10 -7 -17t-17 -7h-10q-10 0 -17 7t-7 17v71h-261v-223h141v32q0 10 7 17t17 7h10q10 0 17.5 -7t7.5 -17 v-129q0 -10 -7.5 -17t-17.5 -7h-10q-10 0 -17 7t-7 17v32h-141v-246h282v86q0 10 7 17t17 7h10q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d675;" horiz-adv-x="525" d="M488 638v-111q0 -10 -7 -17t-17 -7h-10q-10 0 -17 7t-7 17v71h-264v-235h145v32q0 10 7 17t17 7h11q10 0 17 -7t7 -17v-129q0 -10 -7 -17t-17 -7h-11q-10 0 -17 7t-7 17v32h-145v-234h68q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-176q-10 0 -17 7t-7 17v16q0 10 7 17 t17 7h49v534h-49q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h406q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d676;" horiz-adv-x="525" d="M495 282v-16q0 -10 -7 -17t-17 -7h-23v-218q0 -10 -7 -17t-17 -7h-10q-10 0 -17 7t-7 17v34q-50 -69 -130 -69q-96 0 -159.5 102t-63.5 239q0 138 63.5 240t159.5 102q74 0 124 -60l14 43q5 17 23 17h3q10 0 17 -7t7 -17v-206q0 -10 -7 -17t-17 -7h-10q-10 0 -16.5 6.5 t-7.5 15.5q-6 73 -38 120.5t-80 47.5q-69 0 -123 -80t-54 -198t53 -197.5t121 -79.5q53 0 83 52t36 137h-58q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h141q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d677;" horiz-adv-x="525" d="M496 40v-16q0 -10 -7 -17t-17 -7h-140q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h41v248h-223v-248h41q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-141q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h41v534h-41q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h141q10 0 17 -7t7 -17v-16 q0 -10 -7 -17t-17 -7h-41v-222h223v222h-41q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h140q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-41v-534h41q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d678;" horiz-adv-x="525" d="M438 40v-16q0 -10 -7 -17t-17 -7h-306q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h123l1 534h-124q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h306q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-123l-1 -534h124q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d679;" horiz-adv-x="525" d="M476 638v-16q0 -10 -7 -17t-17 -7h-46v-459q0 -63 -47.5 -106.5t-112.5 -43.5q-62 0 -111.5 31.5t-49.5 89.5q0 18 11.5 27.5t26.5 9.5q14 0 25.5 -10t11.5 -27q0 -13 -8 -23q24 -34 94 -34q43 0 72.5 26t29.5 60v459h-99q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h203 q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d67a;" horiz-adv-x="525" d="M494 40v-16q0 -10 -7 -17t-17 -7h-101q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h15l-145 283l-98 -135v-148h38q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-125q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h38v534h-38q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h125q10 0 17 -7t7 -17 v-16q0 -10 -7 -17t-17 -7h-38v-304l222 304h-16q-11 0 -17.5 7t-6.5 17v16q0 10 7 17t17 7h112q10 0 17.5 -7t7.5 -17v-16q0 -10 -7 -17t-18 -7h-37l-151 -207l167 -327h32q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d67b;" horiz-adv-x="525" d="M487 150v-126q0 -10 -7 -17t-17 -7h-402q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h53v534h-53q-11 0 -17.5 7t-6.5 17v16q0 10 7 17t17 7h183q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-72v-534h257v86q0 10 7 17t17 7h10q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d67c;" horiz-adv-x="525" d="M501 40v-16q0 -10 -7 -17t-17 -7h-106q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h29v526h-1q0 -14 -106 -346q-7 -24 -32 -24t-32 24q-105 329 -105 346h-1v-526h28q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-105q-10 0 -17.5 7t-7.5 17v16q0 10 7.5 17t17.5 7h28v534h-28 q-11 0 -18 7t-7 17v16q0 10 7.5 17t17.5 7h75q26 0 33 -24q107 -335 107 -346h1q0 14 106 346q7 24 33 24h76q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-29v-534h29q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d67d;" horiz-adv-x="525" d="M491 638v-16q0 -10 -7 -17t-17 -7h-41v-574q0 -10 -7 -17t-17 -7h-23q-25 0 -34 24l-200 570v-530h41q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-131q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h41v534h-41q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h88q25 0 34 -24l201 -570 v530h-41q-11 0 -17.5 7t-6.5 17v16q0 10 7 17t17 7h130q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d67e;" horiz-adv-x="525" d="M466 330q0 -84 -2 -133.5t-10.5 -92t-20 -62t-37 -33.5t-55 -17t-80.5 -3t-80.5 3t-55 17t-37 33.5t-20 62t-10.5 92t-2 133.5q0 85 2 134t10.5 92t20 62.5t37 33.5t55 17t80.5 3t80.5 -3t55 -17t37 -33.5t20 -62.5t10.5 -92t2 -134zM408 344q0 56 -1.5 90.5t-4 66.5 t-10 48.5t-17 30t-27 18.5t-37 7.5t-50.5 2.5t-50 -2.5t-36.5 -7.5t-27 -18.5t-17 -30t-10 -48.5t-4 -66.5t-1.5 -90.5q0 -62 1.5 -100t4 -73t10 -53t17 -33t27 -21t36.5 -8.5t50 -2.5q36 0 57.5 2.5t40 15t26.5 28.5t14 52.5t7.5 78.5t1.5 114z" />
+<glyph unicode="&#x1d67f;" horiz-adv-x="525" d="M55 662h239q77 0 131 -57.5t54 -139.5t-54 -140.5t-131 -58.5h-134v-202h46q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-151q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h46v534h-46q-10 0 -17 7t-7 17v16q0 10 7 17t17 7zM160 330h119q59 0 100.5 39.5t41.5 95.5q0 55 -42 94 t-100 39h-119v-268z" />
+<glyph unicode="&#x1d680;" horiz-adv-x="525" d="M390 -127l-63 118q-38 -2 -66 -2q-51 0 -80.5 3t-55 17t-37 33.5t-20 62t-10.5 92t-2 133.5q0 85 2 134t10.5 92t20 62.5t37 33.5t55 17t80.5 3t80.5 -3t55 -17t37 -33.5t20 -62.5t10.5 -92t2 -134q0 -169 -14 -235.5t-61 -88.5l63 -121l1 -7q0 -7 -4.5 -12t-11.5 -5h-29 q-13 0 -20 12zM301 179l57 -110q31 19 40.5 73t9.5 188q0 69 -1.5 109t-7.5 74.5t-14 50.5t-26.5 27.5t-40 14t-57.5 2.5t-57 -2.5t-39.5 -14t-26.5 -27.5t-14 -50.5t-7.5 -74.5t-1.5 -109q0 -59 1.5 -95t4 -69.5t10 -51t17 -31.5t27 -19.5t36.5 -8t50 -2.5l33 1l-57 107 l-2 7q0 7 5 12t12 5h39q6 0 10 -6z" />
+<glyph unicode="&#x1d681;" horiz-adv-x="525" d="M486 125h10q10 0 17 -7t7 -17q0 -112 -82 -112q-30 0 -49.5 11t-28 33t-11 42.5t-2.5 50.5v82q0 37 -31 63.5t-75 26.5h-91v-234h41q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-141q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h41v534h-41q-10 0 -17 7t-7 17v16q0 10 7 17 t17 7h191q79 0 135 -53t56 -128q0 -48 -23.5 -88t-63.5 -65q60 -47 60 -120v-82q0 -34 4.5 -50.5t10 -19.5t18.5 -3q24 0 24 48q0 10 7 17t17 7zM150 363h84q58 0 99 34.5t41 83.5q0 48 -41 82.5t-99 34.5h-84v-235z" />
+<glyph unicode="&#x1d682;" horiz-adv-x="525" d="M203 389l128 -33q62 -16 100.5 -66.5t38.5 -114.5q0 -77 -53.5 -131.5t-129.5 -54.5q-110 0 -175 59l-9 -40q-5 -19 -24 -19h-3q-10 0 -17 7t-7 17v182q0 10 7 17t17 7h10q10 0 17 -7t7 -17q0 -68 47 -105t130 -37q50 0 86 36.5t36 88.5q0 44 -26 78t-67 44l-128 32 q-59 14 -97.5 60.5t-38.5 106.5q0 72 54 122.5t129 50.5q93 0 149 -59l9 40q5 19 24 19h3q10 0 17 -7t7 -17v-182q0 -10 -7 -17t-17 -7h-10q-22 0 -24 22q-8 69 -46.5 106.5t-104.5 37.5q-51 0 -86 -33t-35 -79q0 -37 25 -67t64 -40z" />
+<glyph unicode="&#x1d683;" horiz-adv-x="525" d="M496 638v-111q0 -10 -7 -17t-17 -7h-10q-10 0 -17 7t-7 17v71h-148v-534h68q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-194q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h68v534h-148v-71q0 -10 -7 -17t-17 -7h-10q-10 0 -17 7t-7 17v111q0 10 7 17t17 7h422q10 0 17 -7t7 -17 z" />
+<glyph unicode="&#x1d684;" horiz-adv-x="525" d="M514 638v-16q0 -10 -7 -17t-17 -7h-47v-378q0 -93 -52 -162t-130 -69t-130 69t-52 162v378h-46q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h151q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-46v-378q0 -71 37 -119t86 -48t86.5 48t37.5 119v378h-47q-10 0 -17 7t-7 17v16 q0 10 7 17t17 7h152q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d685;" horiz-adv-x="525" d="M506 638v-16q0 -10 -7 -17t-17 -7h-34l-141 -582q-2 -10 -11 -17t-20 -7h-30q-11 0 -19.5 7t-10.5 17l-141 582h-34q-11 0 -17.5 7t-6.5 17v16q0 10 7 17t17 7h124q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-31q127 -521 127 -526h1q0 9 126 526h-31q-10 0 -17 7t-7 17 v16q0 10 7 17t17 7h125q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d686;" horiz-adv-x="525" d="M512 638v-16q0 -10 -7 -17t-17 -7h-14l-76 -582q-1 -10 -9 -17t-19 -7h-13q-11 0 -19.5 7t-10.5 17q-65 304 -65 310h-1q0 -14 -66 -310q-5 -24 -30 -24h-13q-11 0 -19 7t-9 17l-75 582h-14q-11 0 -17.5 7t-6.5 17v16q0 10 7 17t17 7h103q10 0 17 -7t7 -17v-16 q0 -10 -7 -17t-17 -7h-41q66 -495 66 -526h1q0 24 60 302q5 24 30 24h15q11 0 19.5 -7t10.5 -17q60 -291 60 -302h1q0 19 65 526h-41q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h104q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d687;" horiz-adv-x="525" d="M497 40v-16q0 -10 -7 -17t-17 -7h-125q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h19l-111 226l-103 -226h20q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-125q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h42l137 288l-125 246h-43q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h125 q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-18l90 -177l83 177h-20q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h125q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-41l-118 -246l146 -288h42q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d688;" horiz-adv-x="525" d="M507 638v-16q0 -10 -7 -17t-17 -7h-41l-152 -334v-200h41q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-140q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h41v200l-152 334h-40q-11 0 -18 7t-7 17v16q0 10 7.5 17t17.5 7h124q10 0 17.5 -7t7.5 -17v-16q0 -10 -7 -17t-18 -7h-20 q117 -258 117 -260h1q0 4 116 260h-20q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h125q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d689;" horiz-adv-x="525" d="M479 153v-129q0 -10 -7 -17t-17 -7h-384q-10 0 -17 7t-7 17v19q0 8 4 12l345 543h-278v-71q0 -10 -7.5 -17t-17.5 -7h-10q-10 0 -17 7t-7 17v111q0 10 7 17t17 7h368q10 0 17 -7t7 -17v-19q0 -7 -3 -12l-345 -543h294v89q0 10 7 17t17 7h10q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d68a;" horiz-adv-x="525" d="M516 127v-34q0 -40 -28.5 -68t-68.5 -28q-46 0 -63 49q-61 -52 -162 -52q-58 0 -97 43.5t-39 102.5q0 77 79 117.5t212 44.5v15q0 29 -33 53.5t-84 24.5q-52 0 -72 -3h-1q-1 -17 -12.5 -26.5t-24.5 -9.5q-15 0 -26.5 9.5t-11.5 27.5q0 66 126 66h22q70 0 122.5 -40.5 t52.5 -101.5v-233q0 -10 7 -17t18 -7q10 0 18 9t8 24v34q0 10 7 17t17 7h10q10 0 17 -7t7 -17zM349 138v110q-117 -4 -174.5 -33.5t-57.5 -74.5q0 -34 29 -58t72 -24q57 0 94 22.5t37 57.5z" />
+<glyph unicode="&#x1d68b;" horiz-adv-x="525" d="M160 585v-183q59 54 146 54q75 0 125 -69t50 -162t-55 -162t-135 -69q-79 0 -131 62v-32q0 -10 -7 -17t-17 -7h-10q-10 0 -17.5 7t-7.5 17v520h-60q-10 0 -17 7.5t-7 17.5v16q0 10 7 17t17 7h95q10 0 17 -7t7 -17zM160 310v-141q9 -48 42 -79.5t75 -31.5q59 0 102.5 48.5 t43.5 118.5q0 71 -40.5 119t-95.5 48q-47 0 -82 -23t-45 -59z" />
+<glyph unicode="&#x1d68c;" horiz-adv-x="525" d="M464 131l-1 -7q-16 -59 -62 -94.5t-111 -35.5q-89 0 -150.5 68t-61.5 163q0 96 61.5 165t150.5 69h26q137 0 137 -65q0 -17 -11.5 -27t-25.5 -10t-25 9t-12 25l-7 1q-23 3 -82 3q-63 0 -108.5 -49.5t-45.5 -120.5q0 -69 51 -118t123 -49q73 0 97 79q4 18 23 18h10 q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d68d;" horiz-adv-x="525" d="M505 40v-16q0 -10 -7 -17t-17 -7h-94q-10 0 -17 7t-7 17v36q-58 -66 -143 -66q-77 0 -128 69t-51 162q0 94 54 162.5t133 68.5q80 0 135 -52v140h-61q-10 0 -17 7.5t-7 17.5v16q0 10 7 17t17 7h95q10 0 17 -7t7 -17v-521h60q10 0 17 -7t7 -17zM363 170v141 q-10 35 -42.5 58t-75.5 23q-59 0 -102.5 -48.5t-43.5 -118.5q0 -71 40.5 -119t95.5 -48q46 0 81.5 31.5t46.5 80.5z" />
+<glyph unicode="&#x1d68e;" horiz-adv-x="525" d="M462 131l-1 -7q-17 -59 -67 -94.5t-111 -35.5q-93 0 -158 68.5t-65 164.5q0 95 60.5 163.5t147.5 68.5q91 0 142.5 -52.5t51.5 -144.5q0 -10 -7 -17t-17 -7h-319l-1 -11q0 -69 54.5 -119t132.5 -50q34 0 61.5 22t38.5 57q5 18 23 18h10q10 0 17 -7t7 -17zM132 296h269 q-17 99 -133 99q-44 0 -81 -27t-55 -72z" />
+<glyph unicode="&#x1d68f;" horiz-adv-x="525" d="M189 450v47q0 53 51.5 85.5t117.5 32.5q79 0 79 -52q0 -17 -11 -26.5t-25 -9.5q-25 0 -33 23h-33q-40 0 -64 -17t-24 -36v-47h144q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-144v-322h117q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-292q-10 0 -17 7t-7 17v16 q0 10 7 17t17 7h117v322h-123q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h123z" />
+<glyph unicode="&#x1d690;" horiz-adv-x="525" d="M196 65h65q232 0 232 -145q0 -66 -70 -107t-162 -41t-162 41t-70 107q0 41 21 75.5t56 54.5q-23 31 -23 70q0 38 22 72q-33 42 -33 99q0 68 47 116.5t113 48.5q54 0 96 -33q49 38 113 38q67 0 67 -47q0 -15 -10.5 -24.5t-22.5 -9.5q-18 0 -29 17h-5q-40 0 -76 -15 q27 -41 27 -91q0 -68 -46.5 -116t-113.5 -48q-51 0 -91 29q-8 -15 -8 -34q0 -39 31 -53l18 1q7 0 14 -5zM333 291q0 45 -29.5 76.5t-71.5 31.5t-71.5 -31.5t-29.5 -76.5t29.5 -76t71.5 -31t71.5 31t29.5 76zM261 13h-79q-42 0 -70.5 -27.5t-28.5 -65.5q0 -33 49.5 -62 t128.5 -29t128.5 29t49.5 62q0 46 -39.5 69.5t-138.5 23.5z" />
+<glyph unicode="&#x1d691;" horiz-adv-x="525" d="M505 40v-16q0 -10 -7 -17t-17 -7h-179q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h61v261q0 35 -20 51t-70 16q-47 0 -80 -31t-33 -75v-222h60q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-179q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h60v480h-60q-10 0 -17 7.5t-7 17.5v16 q0 10 7 17t17 7h95q10 0 17 -7t7 -17v-182q53 53 130 53q131 0 131 -131v-261h60q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d692;" horiz-adv-x="525" d="M304 569q0 -17 -12 -29.5t-29 -12.5q-18 0 -30 12.5t-12 29.5t12 29t30 12q17 0 29 -12t12 -29zM448 40v-16q0 -10 -7 -17t-17 -7h-316q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h137v322h-129q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h163q10 0 17 -7t7 -17v-362h121 q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d693;" horiz-adv-x="525" d="M362 569q0 -17 -12 -29.5t-29 -12.5q-18 0 -30 12.5t-12 29.5t12 29t30 12q17 0 29 -12t12 -29zM361 426v-476q0 -72 -51 -124.5t-123 -52.5h-19q-121 0 -121 70q0 17 11.5 27t25.5 10t25.5 -10t11.5 -27v-2h4q21 -4 77 -4q41 0 71 33t30 80v436h-145q-10 0 -17 7t-7 17 v16q0 10 7 17t17 7h179q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d694;" horiz-adv-x="525" d="M505 40v-16q0 -10 -7 -17t-17 -7h-142q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h30l-129 179l-78 -70v-109h65q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-178q-10 0 -17.5 7t-7.5 17v16q0 10 7.5 17t17.5 7h65v480h-65q-11 0 -18 7t-7 18v16q0 10 7.5 17t17.5 7h89 q10 0 17 -7t7 -17v-347l164 148h-44q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h178q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-62l-122 -110l153 -212h52q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d695;" horiz-adv-x="525" d="M459 40v-16q0 -10 -7 -17t-17 -7h-348q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h145v480h-145q-10 0 -17 7.5t-7 17.5v16q0 10 7 17t17 7h179q10 0 17 -7t7 -17v-521h145q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d696;" horiz-adv-x="525" d="M520 40v-16q0 -10 -7 -17t-17 -7h-112q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h32v261q0 38 -12.5 52.5t-41.5 14.5q-32 0 -54.5 -30.5t-22.5 -75.5v-222h33q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-113q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h32v261q0 38 -12.5 52.5 t-41.5 14.5q-32 0 -54.5 -30.5t-22.5 -75.5v-222h33q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-113q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h32v322h-32q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h56q10 0 17 -7t7 -17v-9q37 39 90 39q58 0 77 -53q41 53 102 53q89 0 89 -131 v-261h32q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d697;" horiz-adv-x="525" d="M505 40v-16q0 -10 -7 -17t-17 -7h-179q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h61v261q0 35 -20 51t-70 16q-47 0 -80 -31t-33 -75v-222h60q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-179q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h60v322h-60q-10 0 -17 7t-7 17v16 q0 10 7 17t17 7h95q10 0 17 -7t7 -17v-23q53 53 130 53q131 0 131 -131v-261h60q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d698;" horiz-adv-x="525" d="M460 225q0 -96 -58 -163.5t-141 -67.5t-141 67.5t-58 163.5q0 97 58.5 165.5t140.5 68.5t140.5 -68.5t58.5 -165.5zM402 234q0 67 -41.5 114t-99.5 47t-99.5 -47t-41.5 -114q0 -73 41.5 -124.5t99.5 -51.5t99.5 51.5t41.5 124.5z" />
+<glyph unicode="&#x1d699;" horiz-adv-x="525" d="M160 426v-24q59 54 146 54q75 0 125 -69t50 -162t-55 -162t-135 -69q-79 0 -131 62v-213h60q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-179q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h60v543h-60q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h95q10 0 17 -7t7 -17zM160 310v-141 q9 -48 42 -79.5t75 -31.5q59 0 102.5 48.5t43.5 118.5q0 71 -40.5 119t-95.5 48q-47 0 -82 -23t-45 -59z" />
+<glyph unicode="&#x1d69a;" horiz-adv-x="525" d="M530 -181v-16q0 -10 -7 -17t-17 -7h-188q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h65v226q-60 -75 -149 -75q-80 0 -134.5 69t-54.5 162q0 94 57.5 162.5t140.5 68.5t140 -62v38q0 10 7 17t17 7h10q10 0 17 -7t7 -17v-589h65q10 0 17 -7t7 -17zM383 189v95q-8 46 -43 77 t-82 31q-64 0 -109.5 -48.5t-45.5 -118.5t43 -118.5t101 -48.5q50 0 87.5 37t48.5 94z" />
+<glyph unicode="&#x1d69b;" horiz-adv-x="525" d="M392 456h8q85 0 85 -54q0 -16 -11 -25.5t-24 -9.5q-26 0 -34 24l-24 1q-73 0 -124.5 -45t-51.5 -109v-174h127q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-282q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h97v322h-97q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h131q10 0 17 -7 t7 -17v-52q68 82 176 82z" />
+<glyph unicode="&#x1d69c;" horiz-adv-x="525" d="M220 274l92 -16q58 -10 101.5 -42.5t43.5 -87.5q0 -66 -53 -100t-139 -34q-81 0 -133 50l-10 -33q-3 -17 -23 -17h-3q-10 0 -17 7t-7 17v144q0 10 7 17t17 7h10q19 0 24 -19q26 -109 135 -109q69 0 101.5 21t32.5 55q0 27 -26 46t-71 27l-90 16q-34 6 -62.5 17t-53 37 t-24.5 62q0 60 53.5 90t139.5 30q64 0 108 -29l5 13q5 16 23 16h3q10 0 17 -7t7 -17v-115q0 -10 -7 -17t-17 -7h-10q-10 0 -17.5 7t-7.5 17q0 75 -107 75q-69 0 -100.5 -18t-31.5 -44q0 -43 90 -59z" />
+<glyph unicode="&#x1d69d;" horiz-adv-x="525" d="M448 173v-42q0 -61 -50 -99t-114 -38q-59 0 -92.5 37t-33.5 100v255h-109q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h109v105q0 11 7 18t17 7h10q10 0 17 -7.5t7 -17.5v-105h185q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-185v-255q0 -73 87 -73q36 0 61.5 21.5t25.5 51.5 v42q0 10 7 17t17 7h10q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d69e;" horiz-adv-x="525" d="M505 40v-16q0 -10 -7 -17t-17 -7h-94q-10 0 -17 7t-7 17v26q-54 -56 -131 -56q-131 0 -131 137v255h-60q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h95q10 0 17 -7t7 -17v-295q0 -39 19.5 -56t68.5 -17q47 0 81 34t34 83v211h-61q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h95 q10 0 17 -7t7 -17v-362h60q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d69f;" horiz-adv-x="525" d="M500 426v-16q0 -10 -7 -17t-17 -7h-48l-122 -366q-9 -24 -33 -24h-24q-24 0 -33 24l-122 366h-48q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h141q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-42l116 -349l116 349h-41q-10 0 -17.5 7t-7.5 17v16q0 10 7.5 17t17.5 7h140 q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d6a0;" horiz-adv-x="525" d="M508 426v-16q0 -10 -7 -17t-17 -7h-28l-64 -366q-1 -10 -9.5 -17t-19.5 -7h-19q-25 0 -32 24q-43 149 -43 178h-1q0 -29 -43 -178q-7 -24 -32 -24h-34q-11 0 -19 7t-9 17l-64 366h-28q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h143q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7 h-66l57 -326l53 186q7 24 32 24h21q25 0 32 -24q44 -150 44 -174h1q0 20 51 314h-67q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h144q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d6a1;" horiz-adv-x="525" d="M498 40v-16q0 -10 -7 -17t-17 -7h-141q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h22l-97 135l-93 -135h23q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-141q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h62l126 168l-120 154h-62q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h141 q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-20l84 -113l83 113h-22q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h141q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-62l-116 -154l130 -168h62q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d6a2;" horiz-adv-x="525" d="M501 426v-16q0 -10 -7 -17t-17 -7h-48l-156 -464q-21 -65 -58 -107t-90 -42q-34 0 -58 21.5t-24 53.5q0 17 10.5 26.5t25.5 9.5t25.5 -9.5t10.5 -26.5l-1 -10l11 -1q34 0 59.5 24t37.5 61l26 78l-149 386h-50q-10 0 -17.5 7t-7.5 17v16q0 10 7.5 17t17.5 7h140 q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-39l122 -315l106 315h-42q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h141q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d6a3;" horiz-adv-x="525" d="M473 119v-95q0 -10 -7 -17t-17 -7h-393q-10 0 -17 7t-7 17v19q0 11 8 17l332 326h-265v-43q0 -11 -7 -18t-17 -7h-10q-10 0 -17 7.5t-7 17.5v83q0 10 7 17t17 7h373q10 0 17 -7t7 -17v-19q0 -10 -7 -17l-333 -326h285v55q0 10 7 17t17 7h10q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d6a4;" horiz-adv-x="278" d="M221 115l14 -12q-41 -63 -71 -88.5t-67 -25.5q-50 0 -50 57q0 20 24 110l48 175q9 34 9 45q0 15 -11 19t-52 5v16q44 3 159 25l5 -3l-96 -342q-9 -34 -9 -45q0 -15 16 -15q12 0 30 17.5t51 61.5z" />
+<glyph unicode="&#x1d6a5;" horiz-adv-x="278" d="M246 438l-104 -410q-31 -121 -76.5 -178t-110.5 -57q-35 0 -57 17t-22 44q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -12 18 -12q30 0 50.5 39t46.5 143l72 292q16 65 16 80q0 17 -10.5 24t-37.5 7h-26v16q45 3 169 25z" />
+<glyph unicode="&#x1d6a8;" horiz-adv-x="735" d="M689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#x1d6a9;" horiz-adv-x="667" d="M426 365v-1q85 -11 139 -58.5t54 -117.5q0 -83 -72 -135.5t-202 -52.5h-329v25q55 6 71.5 21t16.5 57v467q0 44 -18.5 60.5t-69.5 20.5v25h317q121 0 186.5 -41.5t65.5 -118.5q0 -59 -37 -96.5t-122 -54.5zM264 592v-219q91 0 123.5 30t32.5 106q0 137 -99 137 q-30 0 -43.5 -12.5t-13.5 -41.5zM264 343v-245q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 155 -157 155h-26z" />
+<glyph unicode="&#x1d6aa;" horiz-adv-x="620" d="M593 474h-24q-9 54 -24 85q-10 21 -36 44q-45 39 -173 39q-40 0 -56 -14q-14 -12 -14 -37v-490q0 -47 24 -60q22 -13 86 -16v-25h-360v25q57 6 74 23q14 16 14 55v472q0 45 -21 60q-20 13 -67 16v25h577v-202z" />
+<glyph unicode="&#x1d6ab;" horiz-adv-x="691" d="M656 0h-640l296 690h28zM431 120l-165 359l-155 -359h320z" />
+<glyph unicode="&#x1d6ac;" horiz-adv-x="679" d="M641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54 q25 20 42 46t40 77h28z" />
+<glyph unicode="&#x1d6ad;" horiz-adv-x="693" d="M634 242l-27 -242h-579v16l382 625l-83 -3q-62 -2 -96.5 -8.5t-63.5 -25t-46 -49.5t-34 -86h-28l22 207h523v-16l-379 -625h83q145 0 202 40q27 19 45 45t26.5 47t26.5 75h26z" />
+<glyph unicode="&#x1d6ae;" horiz-adv-x="810" d="M759 0h-339v25q54 6 71.5 20.5t17.5 52.5v228h-241v-228q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-204h241v204q0 41 -18 55.5t-71 18.5v25h339v-25q-51 -4 -69.5 -19t-18.5 -55v-479 q0 -39 16.5 -52.5t71.5 -20.5v-25z" />
+<glyph unicode="&#x1d6af;" horiz-adv-x="778" d="M515 223h-26q-9 56 -43 56h-109q-23 0 -32 -10q-8 -9 -19 -46h-26q15 51 15 118q0 53 -15 115h26q12 -36 23 -47q10 -10 29 -10h109q18 0 27 14q7 11 13 43h26q-12 -54 -12 -110t14 -123zM743 336q0 -166 -113 -267q-98 -87 -242 -87q-165 0 -266 112q-87 98 -87 241 q0 169 115 270q99 87 244 87q162 0 262 -113q87 -99 87 -243zM566 329q0 169 -53 255q-47 75 -128 75q-89 0 -134 -97q-39 -84 -39 -231q0 -316 178 -316q176 0 176 314z" />
+<glyph unicode="&#x1d6b0;" horiz-adv-x="421" d="M370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x1d6b1;" horiz-adv-x="820" d="M769 0h-334v25q47 1 62 6t15 15q0 13 -25 45l-181 225l-27 -25v-196q0 -37 16.5 -50t70.5 -20v-25h-336v25q55 5 71 19t16 57v472q0 46 -17 60.5t-70 17.5v25h337v-25q-54 -4 -71 -20.5t-17 -63.5v-223l212 215q24 24 32 35t8 23q0 15 -10.5 22t-37.5 9l-35 3v25h289v-25 q-78 -9 -133 -46.5t-189 -180.5l305 -378q16 -20 49 -21v-25z" />
+<glyph unicode="&#x1d6b2;" horiz-adv-x="707" d="M674 0h-322v25l32 3q44 5 44 33q0 22 -44 136l-108 280h-2l-114 -314q-28 -78 -28 -97q0 -21 20 -30q20 -8 59 -11v-25h-202v25q36 6 56 32q17 23 43 88l213 545h28l215 -522q40 -97 61 -121q19 -22 49 -22v-25z" />
+<glyph unicode="&#x1d6b3;" horiz-adv-x="972" d="M921 0h-332v25q55 5 72 22t17 62v496l-252 -605h-27l-252 594v-465q0 -58 20 -79t81 -25v-25h-234v25q59 6 75 20.5t16 62.5v469q0 41 -17 55.5t-72 18.5v25h253l199 -472l201 472h252v-25q-55 -4 -71.5 -22.5t-16.5 -74.5v-428q0 -57 15 -76.5t73 -24.5v-25z" />
+<glyph unicode="&#x1d6b4;" horiz-adv-x="722" d="M701 676v-25q-50 -8 -64 -22.5t-14 -60.5v-586h-28l-447 545v-396q0 -58 18 -78.5t76 -27.5v-25h-226v25q55 7 71.5 22.5t16.5 61.5v470q-52 72 -85 72v25h211l349 -430v299q0 60 -18 80.5t-74 25.5v25h214z" />
+<glyph unicode="&#x1d6b5;" horiz-adv-x="623" d="M568 481h-25q-9 46 -25 61q-16 14 -49 14h-307q-67 0 -82 -75h-25v195h513v-195zM494 240h-25q-7 37 -24 49q-13 8 -40 8h-182q-37 0 -50 -12q-11 -10 -19 -45h-25v223h25q7 -40 24 -49q12 -7 46 -7h181q35 0 45 10q11 10 19 46h25v-223zM595 0h-567v232h25q9 -53 24 -68 q17 -17 58 -17h349q51 0 67 23q12 17 19 62h25v-232z" />
+<glyph unicode="&#x1d6b6;" horiz-adv-x="778" d="M743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#x1d6b7;" horiz-adv-x="780" d="M759 0h-339v25q57 6 74 23q15 15 15 50v531h-241v-531q0 -42 20 -56q15 -11 69 -17v-25h-336v25q57 8 71 22t14 51v479q0 43 -20 57q-17 13 -65 17v25h738v-25q-54 -5 -72 -21q-16 -15 -16 -53v-479q0 -42 19 -55q16 -12 69 -18v-25z" />
+<glyph unicode="&#x1d6b8;" horiz-adv-x="611" d="M16 676h315q128 0 198.5 -45.5t70.5 -135.5q0 -60 -33.5 -104.5t-95.5 -67.5q-32 -12 -70.5 -15.5t-138.5 -4.5v-192q0 -51 14 -65t73 -21v-25h-333v25q33 3 45 9q23 9 31 30t8 62v427q0 58 -15.5 75.5t-68.5 22.5v25zM262 606v-268q94 1 130 32t36 114q0 84 -27 120.5 t-89 36.5q-50 0 -50 -35z" />
+<glyph unicode="&#x1d6b9;" horiz-adv-x="778" d="M743 336q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM214 394h349q-9 129 -54.5 197t-123.5 68q-74 0 -118.5 -68.5t-52.5 -196.5zM565 304h-353q4 -144 50 -216.5t128 -72.5q167 0 175 289z" />
+<glyph unicode="&#x1d6ba;" horiz-adv-x="665" d="M627 261l-32 -261h-581v16l278 301l-278 343v16h580v-197h-26q-22 99 -67 130q-30 21 -91 21h-182l187 -240l-225 -243h256q65 0 96 20q40 26 59 94h26z" />
+<glyph unicode="&#x1d6bb;" horiz-adv-x="667" d="M636 475h-29q-13 89 -56.5 127.5t-135.5 41.5v-527q0 -57 16.5 -72t81.5 -20v-25h-357v25q64 5 80.5 20.5t16.5 71.5v527q-93 -3 -136.5 -41.5t-56.5 -127.5h-29l3 201h600z" />
+<glyph unicode="&#x1d6bc;" horiz-adv-x="722" d="M699 670v-25q-18 5 -31 5q-30 0 -56 -8.5t-53.5 -32t-49 -61.5t-40 -101t-29.5 -146v-178q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136q0 164 -55 263t-147 99q-29 0 -59 -10l-14 24q22 20 57.5 36t66.5 16q59 0 103.5 -13.5t81.5 -46t59 -92 t29 -146.5h5q10 52 29 103q34 95 89 140t122 45q35 0 54 -12z" />
+<glyph unicode="&#x1d6bd;" horiz-adv-x="836" d="M498 586v-22q136 -5 225 -62q95 -61 95 -164q0 -121 -131 -187q-90 -45 -189 -45v-15q0 -31 23 -46q21 -14 72 -20v-25h-353v25q62 5 81 22q15 13 15 44v15q-138 0 -227 60q-91 61 -91 172q0 118 120 179q82 42 198 47v24q0 36 -14 48q-18 15 -71 15v25h332v-25 q-57 0 -75 -23q-10 -13 -10 -42zM496 530v-390q63 0 105 47q45 49 45 138q0 112 -49 164q-38 41 -101 41zM338 140v390q-68 0 -108 -53t-40 -152q0 -105 50 -151q37 -34 98 -34z" />
+<glyph unicode="&#x1d6be;" horiz-adv-x="747" d="M699 0h-340v25l28 2q52 3 52 28q0 21 -21 54l-101 162l-38 -51q-56 -76 -75 -106.5t-19 -46.5q0 -19 17.5 -28t63.5 -14v-25h-250v25q37 4 59 16t45 40l175 221l-198 291q-23 34 -38 45t-42 13v25h346v-25l-31 -2q-27 -1 -37.5 -8t-10.5 -23q0 -14 15 -37l97 -150l56 77 q36 49 47 69.5t11 36.5q0 18 -11 25t-40 10l-21 2v25h250v-25q-57 -5 -90.5 -30.5t-97.5 -115.5l-80 -111l182 -283q35 -54 53 -69.5t44 -16.5v-25z" />
+<glyph unicode="&#x1d6bf;" horiz-adv-x="800" d="M785 692v-25q-25 0 -41 -37q-12 -27 -12 -48v-5l4 -90v-13q0 -111 -91 -168q-66 -42 -169 -42v-141q0 -61 20 -78q19 -16 72 -20v-25h-347v25q63 3 81 31q12 20 12 72v136q-122 0 -190 56q-70 57 -70 156v11l4 90v6q0 31 -14 56q-15 28 -41 28v25h33q87 0 142 -91 q36 -59 36 -142q0 -70 29 -117q26 -44 71 -44v290q0 36 -13 48q-18 15 -72 15v25h332v-25q-56 0 -74 -23q-11 -14 -11 -42v-288q50 0 78 56q22 44 22 105q0 84 35 142q55 91 141 91h33z" />
+<glyph unicode="&#x1d6c0;" horiz-adv-x="778" d="M262 94l-2 29q-97 17 -161 91t-64 172q0 124 99 215t245 91q145 0 244.5 -91.5t99.5 -217.5q0 -94 -65 -164.5t-160 -95.5l-2 -29h138q33 0 44.5 17t11.5 60h25v-171h-302l7 155q64 15 100 81t36 153q0 66 -19 126t-60.5 102t-97.5 42q-55 0 -96.5 -42t-61 -101.5 t-19.5 -124.5q0 -88 36 -154.5t100 -81.5l7 -155h-302v171h25q0 -44 10 -60.5t41 -16.5h143z" />
+<glyph unicode="&#x1d6c1;" horiz-adv-x="691" d="M656 676l-296 -690h-28l-316 690h640zM561 556h-320l165 -359z" />
+<glyph unicode="&#x1d6c2;" horiz-adv-x="644" d="M618 461l-129 -270q0 -8 9 -35q18 -55 32 -70q7 -8 20 -8q38 0 42 76h25q0 -70 -28 -118q-29 -48 -77 -48q-69 0 -105 77q-61 -79 -166 -79q-100 0 -162 76q-54 66 -54 164q0 117 73 187q63 60 157 60q127 0 179 -121h1l29 109h154zM361 198q-3 76 -31 157q-30 87 -72 87 q-53 0 -71 -55q-15 -45 -15 -154q0 -127 21 -175q18 -41 59 -41q40 0 74 70q26 53 35 111z" />
+<glyph unicode="&#x1d6c3;" horiz-adv-x="556" d="M396 411l-1 -2q129 -39 129 -183q0 -110 -73 -180q-63 -60 -153 -60q-51 0 -93 26v-66q0 -100 -20 -151h-140q21 43 21 151v386q0 114 21 185q20 66 69 118q54 57 151 57q76 0 126 -44q48 -42 48 -110q0 -84 -85 -127zM205 495v-423q27 -55 85 -55q53 0 71 51 q15 44 15 149q0 84 -30 138q-20 37 -37 37l-43 -9q-40 0 -40 26q0 27 48 27l45 -9q10 0 18 32q5 20 5 50q0 62 -14 101q-18 51 -51 51q-44 0 -59 -44q-13 -35 -13 -122z" />
+<glyph unicode="&#x1d6c4;" horiz-adv-x="518" d="M501 461l-202 -400q1 -5 3.5 -19t3.5 -24q10 -64 10 -102q0 -52 -23 -87q-23 -34 -61 -34q-46 0 -61 34q-10 21 -10 73q0 75 61 216q-11 110 -34 169q-39 96 -92 96q-48 0 -59 -75h-25q0 68 24 115q26 50 74 50q73 0 114 -152l29 -111l79 251h169z" />
+<glyph unicode="&#x1d6c5;" horiz-adv-x="502" d="M395 567l-146 81q-32 0 -55 -10q-31 -13 -31 -39q0 -32 50 -62q15 -9 62 -34q109 -57 156 -116q46 -60 46 -172q0 -94 -68 -164q-64 -65 -156 -65q-109 0 -176 82q-51 63 -51 139q0 93 60 154q56 58 136 58v2q-82 34 -115 78q-22 31 -22 61q0 63 79 103q57 29 115 29 q69 0 114 -18q50 -20 50 -57q0 -17 -13 -33q-13 -17 -35 -17zM329 215q0 172 -77 172q-46 0 -65 -51q-14 -42 -14 -132q0 -105 19 -147q19 -40 61 -40q52 0 67 61q9 38 9 137z" />
+<glyph unicode="&#x1d6c6;" horiz-adv-x="444" d="M412 109l17 -18q-69 -105 -203 -105q-198 0 -198 132q0 77 88 123v1q-35 13 -54 41q-16 23 -16 47q0 62 57 103q55 40 146 40q71 0 117 -28q47 -29 47 -78q0 -25 -17 -42q-16 -16 -44 -16q-57 0 -57 54l8 42q0 37 -65 37q-38 0 -60 -33q-19 -28 -19 -67t23 -64 q20 -21 51 -21l54 11q39 0 39 -25q0 -30 -44 -30q-14 0 -44 9q-35 0 -61 -26q-25 -25 -25 -61q0 -95 109 -95q49 0 93 21q40 19 58 48z" />
+<glyph unicode="&#x1d6c7;" horiz-adv-x="459" d="M243 692l9 -24q-63 -27 -63 -68q0 -40 32 -51q88 85 144 85q57 0 57 -43q0 -42 -68 -69q-54 -22 -124 -22q-55 -45 -97 -122q-42 -78 -42 -148q0 -69 57 -96q39 -19 124 -19q165 0 165 -138q0 -92 -62 -143q-48 -39 -113 -39q-44 0 -71 21q-21 16 -21 40q0 28 19 46 q18 16 42 16l107 -46q23 0 41 22q17 20 17 46q0 53 -54 53h-8l-117 -9q-109 1 -154 51q-40 46 -40 140q0 104 64 213q45 77 99 124q-36 4 -56 28q-18 21 -18 50q0 74 131 102z" />
+<glyph unicode="&#x1d6c8;" horiz-adv-x="580" d="M545 -205h-138q-14 29 -19 67q-3 24 -3 85v372q0 87 -50 87q-37 0 -71 -34q-17 -17 -17 -24v-348h-139v346q0 56 -24 56t-49 -48l-23 11q18 47 56 78q38 30 80 30q98 0 98 -87h1q51 87 143 87q67 0 103 -44q31 -38 31 -101v-380q0 -106 21 -153z" />
+<glyph unicode="&#x1d6c9;" horiz-adv-x="501" d="M476 340q0 -148 -64 -254q-61 -100 -154 -100q-120 0 -184 127q-49 97 -49 228q0 151 64 252q63 99 161 99q112 0 176 -126q50 -96 50 -226zM172 364h157q0 135 -19 212q-21 85 -60 85q-78 0 -78 -297zM329 320h-157q0 -303 78 -303q79 0 79 303z" />
+<glyph unicode="&#x1d6ca;" horiz-adv-x="326" d="M281 101l23 -12q-18 -45 -58 -75q-38 -28 -85 -28q-49 0 -73 32q-19 25 -19 59v299q0 33 -14 47q-11 11 -40 14v24h193v-349q0 -56 24 -56t49 45z" />
+<glyph unicode="&#x1d6cb;" horiz-adv-x="581" d="M214 461v-201q123 143 196 189q39 24 78 24q33 0 52 -22q19 -20 19 -55q0 -25 -19 -45q-20 -21 -47 -21l-83 42q-43 0 -103 -70l179 -232q24 -32 36 -39t26 -7v-24h-248v24q34 1 34 23q0 10 -21 37l-98 129h-1v-213h-139v379q0 33 -14 44q-11 9 -40 14v24h193z" />
+<glyph unicode="&#x1d6cc;" horiz-adv-x="546" d="M502 147h25q0 -75 -25 -119q-25 -46 -75 -46q-62 0 -92 128l-46 198l-101 -308h-169l226 454l-12 38q-22 68 -48 93q-19 17 -46 17q-47 0 -59 -75h-25q0 73 24 116q25 49 76 49q62 0 104 -146l107 -374q28 -100 77 -100q47 0 59 75z" />
+<glyph unicode="&#x1d6cd;" horiz-adv-x="610" d="M567 88l21 -12q-43 -107 -144 -107q-81 0 -90 86h-1q-45 -69 -100 -69q-39 0 -53 23h-1v-77q0 -86 -20 -137h-134q21 43 21 138v528h139v-318q0 -46 25 -72q20 -20 44 -20q38 0 79 51v359h139v-350q0 -43 5 -58q5 -14 18 -14q22 0 52 49z" />
+<glyph unicode="&#x1d6ce;" horiz-adv-x="518" d="M465 473h30q0 -238 -148 -370q-102 -91 -252 -117h-26v386q0 36 -12 48q-11 11 -42 17v24h193v-323h5q225 40 252 335z" />
+<glyph unicode="&#x1d6cf;" horiz-adv-x="465" d="M240 692l10 -24q-28 -12 -46 -31t-18 -37q0 -26 21 -36q74 71 140 71q63 0 63 -40q0 -39 -61 -61q-48 -18 -109 -18q-26 0 -42 -22q-11 -17 -11 -40q0 -38 35 -53q91 41 133 41q43 0 60 -7q24 -9 24 -36q0 -33 -55 -49q-38 -11 -70 -11q-39 0 -89 11q-61 -20 -90 -58 q-24 -32 -24 -67q0 -58 52 -87q40 -23 106 -23q165 0 165 -138q0 -92 -62 -143q-48 -39 -113 -39q-44 0 -71 21q-21 16 -21 40q0 28 20 46q18 16 41 16l107 -46q23 0 41 22q17 20 17 46q0 53 -54 53h-8l-117 -9q-6 -1 -17 -1q-83 0 -134 61q-40 46 -40 117q0 69 54 134 q45 54 108 83q-22 11 -36 29q-16 20 -16 45q0 45 38 77v2q-30 5 -48 24q-15 17 -15 35q0 36 36 63q34 27 96 39z" />
+<glyph unicode="&#x1d6d0;" horiz-adv-x="500" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#x1d6d1;" horiz-adv-x="631" d="M584 127h25q0 -59 -42 -101q-39 -40 -100 -40q-74 0 -106 53q-22 35 -22 92q0 47 21 127q3 12 18 62q2 7 5.5 21.5t5.5 19.5h-134l2 -99v-27q0 -125 -32 -189t-91 -64q-79 0 -79 66q0 21 12 39q12 17 31 20q38 8 71 118q24 83 24 136q-120 0 -148 -52h-25q29 87 69 118 q43 34 122 34h385v-100h-117q-11 -46 -11 -142q0 -163 56 -163q45 0 60 71z" />
+<glyph unicode="&#x1d6d2;" horiz-adv-x="547" d="M66 -55v168q0 115 21 185q20 67 69 119q25 26 69 43q36 13 73 13q105 0 162 -67q55 -64 55 -178q0 -112 -74 -183q-60 -59 -146 -59h1q-49 0 -91 26v-66q0 -100 -20 -151h-140q21 43 21 150zM205 271v-199q27 -55 81 -55q49 0 67 52q15 45 15 151q0 129 -28 181 q-23 41 -65 41t-57 -45q-13 -38 -13 -126z" />
+<glyph unicode="&#x1d6d3;" horiz-adv-x="464" d="M334 -5l-117 -9q-7 -1 -21 -1q-85 0 -130 47q-43 43 -43 140q0 60 37 128q38 72 102 120q71 53 151 53q56 0 95 -28q36 -27 36 -70q0 -32 -22 -53q-18 -18 -43 -18l-136 68q-75 0 -115 -40q-37 -37 -37 -104q0 -76 67 -98q39 -13 114 -13q165 0 165 -138q0 -92 -62 -143 q-48 -39 -113 -39q-44 0 -71 21q-21 16 -21 40q0 28 19 46q18 16 42 16l107 -46q23 0 41 22q17 20 17 46q0 53 -54 53h-8z" />
+<glyph unicode="&#x1d6d4;" horiz-adv-x="568" d="M529 361h-200q12 -23 38.5 -43.5t49.5 -33.5t40.5 -38.5t17.5 -60.5q0 -85 -69 -142t-156 -57q-102 0 -163.5 71.5t-61.5 174.5q0 107 78 168t187 61h239v-100zM329 169q0 59 -14.5 103t-49.5 89q-33 0 -55.5 -24.5t-30 -54.5t-7.5 -63q0 -120 21 -163q19 -39 59 -39 q77 0 77 152z" />
+<glyph unicode="&#x1d6d5;" horiz-adv-x="492" d="M457 361h-139q-4 -10 -10 -65q-6 -52 -6 -99q0 -141 51 -141q45 0 60 71h25q0 -59 -42 -101q-39 -40 -100 -40q-73 0 -106 53q-22 35 -22 92q0 47 21 127q3 12 18 62q9 34 11 41h-58q-38 0 -73 -27q-34 -26 -44 -65h-25q10 71 56 129q50 63 116 63h267v-100z" />
+<glyph unicode="&#x1d6d6;" horiz-adv-x="576" d="M281 449v24q135 0 206 -71q64 -64 64 -173q0 -114 -71 -183q-62 -60 -155 -60q-217 0 -217 187v182q0 47 -24 47t-49 -48l-23 11q18 47 56 78q38 30 80 30t69 -21q30 -24 30 -71v-156q0 -113 15 -157q17 -51 63 -51q53 0 69 69q10 41 10 140q0 94 -32 156q-33 63 -91 67z " />
+<glyph unicode="&#x1d6d7;" horiz-adv-x="653" d="M257 17v135q0 48 9 99t28.5 103t58 85.5t90.5 33.5q78 0 134 -72q52 -67 52 -171q0 -106 -64 -175t-169 -69v-191h-139v191q-106 0 -169.5 69t-63.5 175q0 113 63.5 178t175.5 65h45v-25q-137 0 -137 -205q0 -136 20 -183q11 -25 25.5 -34t40.5 -9zM396 17h8q45 0 64 54 q14 43 14 172q0 199 -53 199q-33 0 -33 -168v-257z" />
+<glyph unicode="&#x1d6d8;" horiz-adv-x="612" d="M586 461l-251 -397l18 -64q33 -115 86 -115q55 0 67 76h25q0 -81 -27 -125q-25 -41 -71 -41q-43 0 -74 70q-11 25 -34 106l-15 53l-134 -213h-155l237 375l-22 85q-18 70 -43 95q-17 17 -45 17q-52 0 -67 -75h-25q0 71 24 116q26 49 76 49q42 0 69 -48q19 -33 35 -97 l25 -97l146 230h155z" />
+<glyph unicode="&#x1d6d9;" horiz-adv-x="763" d="M751 473v-25q-37 -5 -58 -30.5t-21 -68.5q0 -11 1 -16l11 -126q1 -6 1 -17q0 -87 -72 -151q-59 -53 -140 -53h-22v-191h-139v191h-22q-94 0 -156 69q-55 61 -55 152l12 126q0 98 -79 115v25h49q101 0 139 -72q26 -49 26 -150q0 -139 19 -190q17 -44 50 -44h17v444h139 v-444h17q40 0 55 59q14 56 14 175q0 118 33 166q38 56 132 56h49z" />
+<glyph unicode="&#x1d6da;" horiz-adv-x="734" d="M419 473h29q142 0 209 -82q51 -63 51 -164q0 -120 -78 -189q-58 -52 -133 -52q-90 0 -132 60q-51 -60 -130 -60q-87 0 -148 69q-61 68 -61 175t68 175t183 68h34v-25q-94 0 -123 -77q-15 -40 -15 -147q0 -96 11 -137q18 -70 64 -70q27 0 51 28q23 28 26 67 q-32 73 -32 132q0 53 20 84q19 30 55 30q39 0 57 -43q12 -29 12 -68q0 -63 -32 -136q4 -46 31 -73q21 -21 46 -21q79 0 79 207q0 117 -25 164q-32 60 -117 60v25z" />
+<glyph unicode="&#x1d6db;" horiz-adv-x="515" d="M88 606l-19 20q58 81 175 81q114 0 179 -100q68 -104 68 -301q0 -141 -58 -224q-67 -96 -178 -96q-103 0 -166.5 70t-63.5 171q0 100 56 166q69 80 174 80q56 0 95 -22l3 3q-8 90 -48.5 137.5t-101.5 47.5q-77 0 -115 -33zM340 218q0 124 -21 174t-67 50t-62.5 -47.5 t-16.5 -176.5q0 -109 18 -155t61 -46q45 0 66.5 46t21.5 155z" />
+<glyph unicode="&#x1d6dc;" horiz-adv-x="444" d="M412 109l18 -18q-78 -105 -191 -105q-102 0 -162 73q-52 64 -52 163q0 118 72 190q61 61 151 61l99 -20q20 0 22 20h23l17 -147h-23q-33 117 -115 117q-54 0 -83 -62q-21 -47 -21 -111h157v-44h-157q0 -82 49 -132q39 -41 89 -41q57 0 107 56z" />
+<glyph unicode="&#x1d6dd;" horiz-adv-x="647" d="M620 295l-1 -27q-11 0 -69 2q-5 -77 -13 -110q-43 -174 -212 -174q-217 0 -217 186v28q0 48 -24 48q-21 0 -49 -49l-23 12q16 44 53 75q38 32 83 32q43 0 70 -26q29 -26 29 -75v-27q0 -105 15 -138q16 -35 63 -35q53 0 68 72q11 55 11 191v5q-287 50 -287 247 q0 92 72 133q48 27 114 27q113 0 183 -99q65 -92 65 -238v-56q37 -4 69 -4zM403 338q-4 193 -37 271q-18 41 -51 41q-65 0 -65 -96q0 -69 40 -125q40 -57 113 -91z" />
+<glyph unicode="&#x1d6de;" horiz-adv-x="563" d="M546 461l-168 -211q-10 -49 -10 -100q0 -66 51 -66l58 23q20 0 35 -15q16 -15 16 -39q0 -38 -28 -57q-22 -15 -57 -15q-55 0 -87 41q-30 38 -30 99q0 29 7 72l-153 -193h-168l169 214q9 52 9 90q0 66 -50 66l-58 -23q-21 0 -36 15q-16 15 -16 39q0 37 29 57q23 15 56 15 q56 0 88 -41q29 -36 29 -99q0 -18 -6 -63l151 191h169z" />
+<glyph unicode="&#x1d6df;" horiz-adv-x="653" d="M396 473h11q101 0 166 -78q56 -68 56 -166q0 -112 -73 -183q-63 -60 -154 -60h-6v-191h-139v191h-8q-102 0 -168 77q-57 67 -57 165q0 117 74 186q64 59 155 59h4v203h139v-203zM396 17h8q48 0 64 50q14 45 14 150q0 132 -19 183q-17 42 -57 42h-10v-425zM257 17v425h-7 q-49 0 -65 -55q-14 -45 -14 -169q0 -118 20 -161q18 -40 59 -40h7z" />
+<glyph unicode="&#x1d6e0;" horiz-adv-x="511" d="M379 -177l-43 1q-86 1 -166 50q-145 87 -145 323q0 137 79 213q64 63 160 63q102 0 166 -77q56 -68 56 -167q0 -113 -73 -183q-63 -60 -153 -60q-96 0 -152 60l-2 -1q23 -54 78 -84q48 -26 101 -25l80 3h6q87 0 87 -79q0 -29 -24 -65h-25q0 28 -30 28zM339 218 q0 135 -20 183q-16 41 -58 41q-49 0 -65 -55q-14 -45 -14 -169q0 -116 21 -161q18 -40 58 -40q47 0 63 51q15 45 15 150z" />
+<glyph unicode="&#x1d6e1;" horiz-adv-x="864" d="M851 361h-79q42 -55 42 -136q0 -121 -73 -187q-56 -52 -138 -52q-89 0 -131 60q-51 -60 -131 -60q-93 0 -152 67q-56 65 -56 172q0 77 49 136h-24q-88 0 -124 -62h-25q55 162 216 162h626v-100zM642 361h-337q-25 -41 -25 -147q0 -197 74 -197q30 0 53 29q21 26 25 65 q-31 76 -31 113q0 40 20 65q19 24 56 24q36 0 54 -30q14 -23 14 -57t-33 -115q4 -45 30 -72q21 -22 46 -22q79 0 79 198q0 106 -25 146z" />
+<glyph unicode="&#x1d6e2;" horiz-adv-x="717" d="M685 0h-285v16h16q40 0 56 14.5t16 46.5q0 7 -2 21l-13 113h-198l-84 -140q-10 -11 -10 -26q2 -29 43 -29h29v-16h-218v16q67 8 108 74l356 577h18l78 -581q10 -70 74 -70h16v-16zM466 248l-25 227h-6l-139 -227h170z" />
+<glyph unicode="&#x1d6e3;" horiz-adv-x="696" d="M198 653h252q236 0 236 -145q0 -102 -91 -147q-28 -14 -74 -26l3 -4q52 -9 89.5 -44t37.5 -94q0 -82 -72 -137.5t-217 -55.5h-324l4 16h20q52 0 74 16.5t29 46.5l123 495q2 10 2 21q0 42 -78 42h-19zM406 611l-59 -252q30 -6 53 -6q82 0 125 44t43 119q0 52 -35 75 t-84 23q-23 0 -43 -3zM338 314l-68 -267q32 -9 71 -9q80 0 135 41t55 131q0 52 -40 80t-102 28q-36 0 -51 -4z" />
+<glyph unicode="&#x1d6e4;" horiz-adv-x="616" d="M721 653l-39 -175h-17q5 45 5 50q-1 88 -114 88h-146l-133 -538q-4 -18 -4 -24q0 -38 79 -38h32l-4 -16h-342l4 16h18q53 0 75.5 16t29.5 46l123 497q4 16 4 24q0 39 -76 39h-19l4 15h520z" />
+<glyph unicode="&#x1d6e5;" horiz-adv-x="596" d="M556 0h-526l412 667h19zM429 82l-45 393h-6l-241 -393h292z" />
+<glyph unicode="&#x1d6e6;" horiz-adv-x="714" d="M734 653l-42 -158h-16q2 26 2 35q-4 87 -109 87h-160l-60 -248h80q51 0 81 19t45 76h16l-58 -242h-17q0 2 3 26t3 34q0 51 -72 51h-90l-66 -258q-2 -8 -2 -10q0 -27 63 -27h67q115 0 169 36t88 124h16l-66 -198h-571l4 16h19q89 0 104 62l120 488q5 22 5 36q0 19 -16 27 t-59 8h-19l4 16h534z" />
+<glyph unicode="&#x1d6e7;" horiz-adv-x="772" d="M802 653l-566 -615h218q42 0 70 4t59.5 17t53 43t34.5 76h16l-46 -178h-581l573 616h-202q-44 0 -71.5 -3t-60.5 -14t-55 -37t-36 -67h-17l48 158h563z" />
+<glyph unicode="&#x1d6e8;" horiz-adv-x="873" d="M923 653l-4 -16h-18q-52 0 -75 -16.5t-31 -46.5l-123 -496q-4 -18 -4 -28q0 -34 78 -34h19l-4 -16h-329l4 16h18q51 0 74.5 16t30.5 46l61 242h-280l-61 -242q-4 -12 -4 -24q0 -38 77 -38h20l-4 -16h-330l4 16h18q91 0 106 62l123 496q4 12 4 24q0 39 -78 39h-20l4 16 h330l-4 -16h-18q-54 0 -76 -16t-29 -47l-52 -217h278l53 217q4 20 4 24q0 39 -76 39h-20l4 16h330z" />
+<glyph unicode="&#x1d6e9;" horiz-adv-x="737" d="M520 425h16q-30 -77 -30 -163v-27h-16q-1 31 -13 44t-38 13h-117q-28 0 -43 -12t-31 -45h-16q30 75 30 176v14h16q6 -34 17 -45.5t39 -11.5h118q48 0 68 57zM712 395q0 -96 -50.5 -188.5t-147 -155t-212.5 -62.5q-112 0 -182 65t-70 168q0 61 18 124t54 121t84.5 103 t115 72t140.5 27q66 0 115.5 -23t78 -62.5t42.5 -87t14 -101.5zM596 444q0 85 -34.5 136.5t-107.5 51.5q-66 0 -118.5 -34.5t-82.5 -85t-49.5 -115.5t-26 -119t-6.5 -102q0 -72 39 -110.5t100 -38.5q75 0 133 43t89.5 109.5t47.5 134.5t16 130z" />
+<glyph unicode="&#x1d6ea;" horiz-adv-x="480" d="M530 653l-4 -16h-19q-53 0 -75.5 -16t-30.5 -46l-123 -497q-3 -12 -3 -29q0 -33 78 -33h17l-4 -16h-328l4 16h19q52 0 75 16.5t30 45.5l123 497q4 16 4 24q0 38 -77 38h-18l4 16h328z" />
+<glyph unicode="&#x1d6eb;" horiz-adv-x="762" d="M802 653l-4 -16q-35 0 -59 -12t-61 -41l-271 -211l187 -278q26 -38 54.5 -58.5t72.5 -20.5l-4 -16h-287l4 16h11q24 0 35.5 6.5t11.5 26.5q0 6 -1.5 11t-3.5 7.5t-5 8.5l-6 8l-156 237h-4l-62 -243q-3 -12 -3 -22q0 -40 78 -40h17l-4 -16h-304l4 16h18q68 0 84 62 l117 472q10 39 10 49q0 38 -76 38h-18l4 16h312l-4 -16h-11q-51 0 -70 -15.5t-27 -46.5l-53 -209h5l282 221q18 14 18 29q-1 11 -11 16t-40 5l4 16h216z" />
+<glyph unicode="&#x1d6ec;" horiz-adv-x="718" d="M686 0h-287l2 16h15q70 0 70 61q0 14 -1 21l-44 378h-5l-245 -405q-10 -15 -10 -26q0 -29 43 -29h29v-16h-218v16q67 8 108 74l357 577h17l78 -569q6 -46 24 -64t50 -18h17v-16z" />
+<glyph unicode="&#x1d6ed;" horiz-adv-x="1005" d="M1055 653l-4 -16h-17q-55 0 -76 -15t-29 -46l-127 -498q-2 -7 -2 -28q0 -34 77 -34h19l-4 -16h-330l4 16h17q54 0 76 16.5t29 45.5l112 439h-6l-345 -517h-25l-94 517h-3l-109 -428q-5 -22 -5 -40q0 -33 76 -33h20l-4 -16h-267l4 16h19q54 0 76.5 19t31.5 54l119 475 q5 21 5 38q0 35 -77 35h-19l4 16h213l89 -493h4l333 493h215z" />
+<glyph unicode="&#x1d6ee;" horiz-adv-x="851" d="M901 653l-4 -16h-18q-53 0 -76.5 -16t-30.5 -47l-144 -574h-24l-274 526h-6l-108 -448q-3 -12 -3 -27q0 -35 76 -35h19l-4 -16h-266l4 16h18q91 0 106 62l126 509q-22 50 -92 50h-19l4 16h200l236 -465h5l97 386q4 18 4 26q0 37 -76 37h-20l4 16h266z" />
+<glyph unicode="&#x1d6ef;" horiz-adv-x="706" d="M741 653l-35 -152h-16q3 13 3 33q0 16 -4.5 25t-16 12.5t-20.5 4.5t-29 1h-299q-40 0 -62.5 -17.5t-33.5 -58.5h-16l37 152h492zM609 450l-52 -209h-15l2 26q0 18 -11 29.5t-28 11.5h-185q-27 0 -48.5 -20t-30.5 -47h-16l52 209h16q-3 -15 -3 -25q0 -24 16 -32.5t47 -8.5 h145q50 0 67 14t28 52h16zM629 158l-40 -158h-537l40 158h13v-14v-21q0 -24 16.5 -32.5t48.5 -8.5h339q34 0 48.5 3t29 19.5t26.5 53.5h16z" />
+<glyph unicode="&#x1d6f0;" horiz-adv-x="732" d="M712 420q0 -75 -29 -151t-80 -138.5t-130 -102t-170 -39.5q-112 0 -182.5 65t-70.5 168q0 77 29.5 155.5t81 144t131 106.5t171.5 41q118 0 183.5 -73.5t65.5 -175.5zM596 443q0 86 -34.5 137.5t-106.5 51.5q-66 0 -118 -34t-82.5 -84.5t-50 -115.5t-26.5 -119t-7 -102 q0 -70 39.5 -110t100.5 -40t111 30t81.5 75.5t53 103t30.5 110t9 97.5z" />
+<glyph unicode="&#x1d6f1;" horiz-adv-x="873" d="M923 653l-4 -16h-19q-53 0 -75 -15.5t-30 -45.5l-123 -498q-3 -10 -3 -27q0 -18 16.5 -26.5t60.5 -8.5h20l-4 -16h-331l4 16h18q54 0 75.5 13.5t30.5 48.5l132 538h-278l-133 -538q-3 -15 -3 -26q0 -22 17.5 -29t57.5 -7h19l-4 -16h-329l4 16h18q91 0 106 62l122 498 q3 12 3 24q0 19 -17 28t-59 9h-20l4 16h724z" />
+<glyph unicode="&#x1d6f2;" horiz-adv-x="594" d="M201 653h271q117 0 174.5 -48t57.5 -112q0 -82 -71.5 -140.5t-213.5 -58.5q-44 0 -74 5q-4 0 -12 2l-56 -223q-3 -12 -3 -23q0 -39 77 -39h32l-4 -16h-341l4 16h17q53 0 75.5 16t30.5 46l125 497q4 16 4 25q0 37 -78 37h-19zM411 613l-68 -274q32 -8 60 -8q78 0 130 48 t52 124q0 50 -29.5 81.5t-95.5 31.5q-24 0 -49 -3z" />
+<glyph unicode="&#x1d6f3;" horiz-adv-x="737" d="M712 395q0 -96 -50.5 -188.5t-147 -155t-212.5 -62.5q-112 0 -182 65t-70 168q0 61 18 124t54 121t84.5 103t115 72t140.5 27q66 0 115.5 -23t78 -62.5t42.5 -87t14 -101.5zM195 368h395q6 40 6 76q0 85 -34.5 136.5t-107.5 51.5q-54 0 -98.5 -22t-75 -61.5t-51 -83.5 t-34.5 -97zM575 292h-395q-9 -57 -9 -116q0 -72 39 -110.5t100 -38.5q103 0 169.5 76t95.5 189z" />
+<glyph unicode="&#x1d6f4;" horiz-adv-x="735" d="M760 653l-40 -159h-16q3 7 3 29q0 26 -8 44.5t-18.5 27.5t-30 14t-34 6t-38.5 1h-205l161 -255l-317 -279h315q57 0 94.5 26t64.5 83h16l-83 -191h-566l378 327l-210 326h534z" />
+<glyph unicode="&#x1d6f5;" horiz-adv-x="550" d="M670 653l-46 -179h-16q5 42 5 71q0 31 -17.5 47.5t-36 20t-45.5 3.5h-98l-133 -538q-5 -22 -5 -25q0 -37 76 -37h21l-4 -16h-329l4 16h18q54 0 76.5 16t29.5 46l133 538h-91q-62 0 -109.5 -40.5t-61.5 -101.5h-16l46 179h599z" />
+<glyph unicode="&#x1d6f6;" horiz-adv-x="567" d="M687 661v-16q-58 0 -126 -81l-212 -251l-57 -235q-4 -14 -4 -26q0 -36 77 -36h21l-4 -16h-328l4 16h17q53 0 75 16t29 46l61 247l-78 208q-23 61 -51 87.5t-83 26.5l4 16q53 5 85 5q31 0 55 -7.5t37.5 -16t25.5 -28t16.5 -31t13.5 -36.5l64 -185h5l176 207q27 33 42 48 t41 29.5t54 14.5q26 0 40 -2z" />
+<glyph unicode="&#x1d6f7;" horiz-adv-x="772" d="M508 578l-9 -31q102 0 175 -44t73 -132q0 -56 -24 -103t-61 -78t-83.5 -53t-91 -32t-83.5 -10h-19l-7 -31q-2 -10 -2 -15q0 -33 73 -33h26l-4 -16h-330l3 16q66 0 91 15t38 64h-13q-113 0 -174 46.5t-61 111.5q0 76 33 134.5t87 92t115.5 50.5t125.5 17q10 29 10 51 q0 39 -75 39h-19l4 16h321l-4 -16h-16q-82 0 -99 -59zM490 510l-95 -377q92 0 162.5 64t70.5 177q0 58 -34.5 97t-103.5 39zM283 133l93 377q-63 0 -118 -41t-84.5 -100t-29.5 -115q0 -52 35 -86.5t104 -34.5z" />
+<glyph unicode="&#x1d6f8;" horiz-adv-x="790" d="M810 653l-4 -16h-4q-33 0 -58.5 -11t-39.5 -23.5t-37 -39.5l-187 -213l96 -266q11 -32 28 -50t51 -18h14l-4 -16h-281l4 16h11q34 0 50.5 8t16.5 33q0 13 -4 26l-69 194l-181 -201q-12 -13 -12 -28q0 -32 56 -32h22l-4 -16h-249l4 16q78 10 140 77l208 230l-85 231 q-6 18 -10.5 27t-16 25t-30.5 23.5t-45 7.5h-9l4 16h283l-4 -16h-19q-26 0 -39 -7t-13 -28q0 -12 6 -28l60 -179l164 184q15 18 15 34q-2 24 -45 24h-9l4 16h222z" />
+<glyph unicode="&#x1d6f9;" horiz-adv-x="670" d="M743 667l-4 -16q-38 -8 -55 -51q-5 -13 -11 -41q-18 -86 -37 -124q-43 -89 -113 -127t-175 -38l-43 -181q-8 -37 -8 -43q0 -31 77 -31q16 0 21 1l-4 -16h-328l4 16q66 0 84 8q30 14 42 65l42 181q-50 0 -93.5 12t-76.5 46t-33 85q0 31 17 92t17 92q0 50 -38 54l4 16h18 q49 0 80.5 -33t31.5 -82q0 -31 -20.5 -88t-20.5 -88q0 -69 124 -69l54 218q17 71 17 77q0 8 -3.5 14t-11 9.5t-14.5 6t-18 3.5t-17.5 1.5t-16.5 0.5h-13l4 16h321l-4 -16q-29 0 -48.5 -2.5t-40.5 -15.5t-27 -38l-68 -274q78 0 116.5 37.5t64.5 118.5q3 10 9.5 34t12 41.5 t13.5 32.5q47 96 150 96h18z" />
+<glyph unicode="&#x1d6fa;" horiz-adv-x="800" d="M280 94l5 37q-147 48 -147 203q0 69 41 139q36 59 91 104q107 89 273 89q126 0 186 -73q48 -59 48 -157q0 -115 -84 -202q-76 -79 -198 -103l-7 -37h128q56 6 79 19q31 19 49 66l18 -5l-56 -174h-280l40 166q94 21 155 115q51 79 51 171q0 181 -140 181q-108 0 -192 -87 q-97 -101 -97 -216q0 -65 23 -109q23 -43 61 -55l-24 -166h-271l42 179l17 -5q-4 -17 -4 -36q0 -44 62 -44h131z" />
+<glyph unicode="&#x1d6fb;" horiz-adv-x="627" d="M600 653l-400 -668h-26l-132 668h558zM499 559h-342l87 -432z" />
+<glyph unicode="&#x1d6fc;" horiz-adv-x="524" d="M529 428l-139 -241v-37q0 -40 8.5 -69.5t25.5 -29.5q20 0 46 74l15 -7q-14 -58 -38.5 -93t-56.5 -35q-26 0 -45 26t-21 61h-2q-59 -87 -153 -87q-61 0 -95 47t-34 114q0 37 7 66q22 92 84.5 158t140.5 66q55 0 84.5 -39.5t29.5 -96.5l64 123h79zM322 273q0 31 -1.5 51 t-7.5 42.5t-19 33.5t-34 11q-46 0 -91 -86.5t-45 -199.5q0 -52 10 -78.5t44 -26.5q29 0 60 36t49 73t30 73q5 25 5 71z" />
+<glyph unicode="&#x1d6fd;" horiz-adv-x="493" d="M47 -105l116 479q25 103 49 145t84 94q64 55 123 55q42 0 70.5 -32t28.5 -82q0 -57 -27.5 -108t-72.5 -71v-1q56 -15 56 -102q0 -48 -18.5 -101.5t-44.5 -86.5q-75 -96 -192 -96q-38 0 -64 21l-28 -122q-8 -37 -23 -70h-79q8 17 22 78zM266 459l-102 -419q22 -23 49 -23 q54 0 96.5 50.5t61 112.5t18.5 115q0 63 -21 63q-10 0 -21.5 -4t-20.5 -4q-13 0 -22.5 6.5t-9.5 15.5q0 10 11.5 18.5t35.5 8.5q3 0 19.5 -2.5t24.5 -2.5q29 0 44.5 46t15.5 78q0 40 -15.5 70t-45.5 30q-22 0 -39.5 -9t-28.5 -22t-21 -36t-15.5 -42t-13.5 -50z" />
+<glyph unicode="&#x1d6fe;" horiz-adv-x="428" d="M458 428l-266 -371q-8 -87 -16 -128q-24 -116 -83 -116q-17 0 -26.5 12.5t-9.5 31.5q0 36 14.5 67.5t41.5 70t39 62.5q13 92 13 182q0 138 -58 138q-29 0 -56 -74h-16q39 138 102 138q66 0 66 -128q0 -37 -6.5 -104t-7.5 -75l179 294h90z" />
+<glyph unicode="&#x1d6ff;" horiz-adv-x="463" d="M451 608q0 -18 -12 -32t-34 -14t-32 10t-11 22.5t-15.5 22.5t-45.5 10t-60.5 -20t-29.5 -47q0 -26 23 -53t56 -51l66 -52q33 -26 56 -62t23 -75q0 -66 -18 -112q-29 -70 -89.5 -118t-141.5 -48q-70 0 -108 41t-38 104q0 93 69 174t170 91q-12 12 -35 31.5t-35.5 31.5 t-23 30.5t-10.5 37.5q0 45 29 78t65.5 46.5t72.5 13.5q43 0 76 -15t33 -45zM351 269q0 39 -13.5 69.5t-40.5 30.5q-61 0 -120 -88.5t-59 -160.5q0 -43 19.5 -72.5t50.5 -29.5q63 0 113 86t50 165z" />
+<glyph unicode="&#x1d700;" horiz-adv-x="484" d="M444 372l-14 -8q-18 26 -46 36.5t-74 10.5q-51 0 -95 -32t-44 -81q0 -24 22 -37.5t56 -13.5q10 0 29.5 4.5t32.5 4.5q38 0 38 -20q0 -31 -43 -31q-3 0 -26 3t-35 3q-45 0 -89 -27.5t-44 -75.5q0 -42 36 -60t89 -18q42 0 84.5 19.5t66.5 53.5l13 -10q-35 -50 -84 -77 t-126 -27q-86 0 -126 29t-40 73q0 53 32 88.5t84 48.5q-58 20 -58 66q0 63 61 105t164 42q46 0 86 -21t50 -48z" />
+<glyph unicode="&#x1d701;" horiz-adv-x="435" d="M290 668l4 -16q-36 -13 -55 -33.5t-19 -40.5q0 -35 49 -45q31 36 87 71t92 35q32 0 32 -24q0 -34 -63.5 -70.5t-132.5 -42.5q-72 -50 -129 -143.5t-57 -185.5q0 -91 92 -91h6q6 0 17.5 0.5t23.5 0.5q63 0 93.5 -23t30.5 -76q0 -62 -59 -114.5t-122 -52.5q-24 0 -38.5 17 t-14.5 37q0 18 12.5 30t35.5 12q11 0 27.5 -15t25.5 -15q36 0 66.5 19.5t30.5 48.5q0 49 -82 49q-5 0 -36 -4.5t-40 -4.5q-55 0 -91 39t-36 103q0 110 54.5 200t145.5 171v1q-27 0 -50 16t-23 43q0 32 32 61t91 43z" />
+<glyph unicode="&#x1d702;" horiz-adv-x="460" d="M173 251h2l57 73q45 58 83.5 87.5t79.5 29.5q60 0 60 -54q0 -13 -15 -78l-75 -313q-23 -97 -23 -144q0 -25 5 -35h-76q-11 13 -11 46q0 30 16.5 101t82.5 335q8 27 8 48q0 13 -7.5 21t-20.5 8q-31 0 -104.5 -98t-95.5 -173l-31 -105h-78l77 304q13 54 13 59q0 13 -13 13 q-22 0 -60 -50l-13 10q30 42 46 58q19 19 43.5 33t40.5 14q41 0 41 -41q0 -19 -5.5 -45.5t-15 -61t-11.5 -42.5z" />
+<glyph unicode="&#x1d703;" horiz-adv-x="484" d="M474 472q0 -98 -41 -210.5t-112 -192.5t-144 -80q-71 0 -104 44t-33 135q0 68 21.5 152t59.5 162.5t98 132t127 53.5q57 0 92.5 -50t35.5 -146zM159 344h206q25 117 25 166q0 129 -51 129q-50 0 -104 -97t-76 -198zM356 308h-207q-25 -78 -25 -165q0 -125 58 -125 q45 0 87.5 69.5t70.5 160.5l10 34z" />
+<glyph unicode="&#x1d704;" horiz-adv-x="267" d="M227 441l-92 -364q-1 -6 -1 -14q0 -11 13 -11q6 0 10.5 1.5t8 3t8.5 7t9 9.5t12.5 14t15.5 17l13 -10q-82 -105 -134 -105q-40 0 -40 46q0 27 79 334q2 4 2 12q0 13 -7 17.5t-24 4.5q-14 0 -28 -4l-3 16z" />
+<glyph unicode="&#x1d705;" horiz-adv-x="534" d="M193 251l183 136q44 33 70 43.5t56 10.5q47 0 47 -41q0 -16 -10.5 -27t-31.5 -11q-15 0 -29 13.5t-31 13.5q-26 0 -52 -21l-143 -113l112 -187q17 -29 35 -38t66 -14l-1 -16h-235l1 16q58 0 58 17q0 16 -13 33l-90 153l-57 -219h-78l94 371v9q0 20 -32 20q-12 0 -28 -3 l-2 15l161 27z" />
+<glyph unicode="&#x1d706;" horiz-adv-x="541" d="M495 124h16q-38 -140 -104 -140q-22 0 -38 27t-16 68q0 27 3 57l6 76q4 46 7 85l-218 -297h-101l319 431q2 16 2 31q0 35 -1 46q-7 96 -56 96q-25 0 -53 -74h-16q37 138 104 138q55 0 55 -136v-383q0 -101 38 -101q25 0 53 76z" />
+<glyph unicode="&#x1d707;" horiz-adv-x="579" d="M549 428l-86 -338q-8 -32 -8 -39q0 -14 17 -14q30 0 57 48l15 -6q-12 -34 -54.5 -70t-76.5 -36q-41 0 -41 41q0 37 33 171q-71 -107 -114.5 -149t-79.5 -42q-13 0 -25 7.5t-16 17.5q-39 -155 -51 -179q-6 -13 -15 -23h-74q26 37 45 114l125 497h79l-71 -298 q-4 -18 -4 -27q0 -45 54 -45q37 0 109 115t88 184l16 71h78z" />
+<glyph unicode="&#x1d708;" horiz-adv-x="452" d="M444 446l18 -5q-14 -134 -83.5 -252.5t-185.5 -197.5h-21l-62 369q-7 42 -44 42h-16v16q57 2 128 23l60 -350q136 103 206 355z" />
+<glyph unicode="&#x1d709;" horiz-adv-x="433" d="M293 668l4 -16q-32 -9 -50.5 -25.5t-22 -26.5t-3.5 -18q0 -12 8 -21.5t24 -9.5q88 67 144 67q46 0 46 -34q0 -31 -49.5 -51t-106.5 -20q-37 0 -61.5 -25t-24.5 -53t31 -52q70 46 140 46q24 0 39.5 -8t15.5 -21q0 -24 -25 -39t-50 -19t-48 -4q-37 0 -68 9 q-66 -25 -110 -75.5t-44 -110.5q0 -44 24 -61t85 -17q12 0 28 0.5t21 0.5q63 0 93.5 -23.5t30.5 -76.5q0 -62 -59.5 -114.5t-121.5 -52.5q-24 0 -38.5 17t-14.5 37q0 18 12.5 30t35.5 12q11 0 27.5 -15t25.5 -15q36 0 66.5 19.5t30.5 48.5q0 49 -82 49q-10 0 -37.5 -4.5 t-36.5 -4.5q-147 2 -147 118q0 82 47 148t123 108q-30 26 -29 69q3 51 57 89q-21 5 -35.5 20t-14.5 31q0 34 30 59t90 35z" />
+<glyph unicode="&#x1d70a;" horiz-adv-x="458" d="M438 287q0 -110 -76.5 -204t-186.5 -94q-69 0 -102 49t-33 114t31 131t90.5 112t129.5 46q64 0 105.5 -38.5t41.5 -115.5zM357 318q0 36 -15.5 64.5t-51.5 28.5q-61 0 -115 -91.5t-54 -193.5q0 -107 59 -107q49 0 92 60t64 128t21 111z" />
+<glyph unicode="&#x1d70b;" horiz-adv-x="558" d="M568 428l-23 -73h-112q-3 -8 -16 -45l-23 -66q-10 -29 -19 -66.5t-9 -60.5q0 -18 11 -33t27 -15q44 0 73 66h16q-17 -59 -56 -100.5t-88 -41.5q-28 0 -42.5 21.5t-14.5 53.5q0 34 9 62q9 27 36.5 102.5t41.5 122.5h-94q-12 -32 -33 -97l-34 -106q-14 -41 -39.5 -86.5 t-54.5 -67.5q-13 -11 -38 -11q-20 0 -35.5 13t-15.5 31q0 40 31 48q49 14 74 70l89 206q-36 0 -53.5 -2t-41 -14t-44.5 -37h-16q69 126 212 126h282z" />
+<glyph unicode="&#x1d70c;" horiz-adv-x="502" d="M30 -183l84 336q50 202 166 259q58 29 98 29q94 0 94 -155q0 -65 -32.5 -133.5t-92.5 -116.5t-129 -48q-37 0 -61 18l-44 -189h-83zM212 238l-46 -200q18 -21 46 -21q48 0 90 48.5t64 113.5t22 123q0 43 -15.5 63t-35.5 20q-41 0 -75 -39t-50 -108z" />
+<glyph unicode="&#x1d70d;" horiz-adv-x="439" d="M464 438q0 -43 -48 -43q-20 0 -32 18.5t-31 18.5q-55 0 -114.5 -31t-102.5 -89t-43 -125q0 -50 17.5 -76.5t73.5 -26.5q13 0 28 0.5t18 0.5q126 0 126 -92q0 -74 -55.5 -125t-125.5 -51q-24 0 -38.5 18t-14.5 38q0 18 12.5 30t35.5 12q11 0 27.5 -16t25.5 -16q35 0 66 21 t31 50q0 49 -82 48q-10 0 -39 -4.5t-47 -4.5q-47 0 -82 40t-35 109q0 80 52.5 162t132.5 134t156 52q32 0 60 -13t28 -39z" />
+<glyph unicode="&#x1d70e;" horiz-adv-x="537" d="M547 428l-20 -73h-173q9 -25 30.5 -46t37.5 -43t16 -54q0 -86 -75 -154.5t-181 -68.5q-71 0 -106.5 48.5t-35.5 111.5q0 122 78.5 200.5t181.5 78.5h247zM286 355h-2q-57 -5 -110 -70.5t-53 -163.5q0 -20 4.5 -41t20 -41t40.5 -20q69 0 120.5 70t51.5 137 q0 44 -21.5 77.5t-50.5 51.5z" />
+<glyph unicode="&#x1d70f;" horiz-adv-x="442" d="M472 428l-22 -73h-155q-27 -66 -60 -189q-7 -25 -7 -46q0 -26 8 -37.5t28 -11.5q19 0 41.5 20t35.5 47h16q-18 -60 -59.5 -101.5t-89.5 -41.5q-64 0 -64 67q0 12 2.5 26t5.5 23l8 25q6 15 7 19l66 200h-51q-39 0 -75 -24.5t-61 -63.5h-16q25 58 83 109.5t124 51.5h235z " />
+<glyph unicode="&#x1d710;" horiz-adv-x="460" d="M293 425l2 14q150 -24 150 -168q0 -101 -73.5 -191.5t-176.5 -90.5q-62 0 -100 29t-38 75q0 27 19 94l41 141q9 29 9 39q0 14 -15 14q-13 0 -25.5 -9.5t-42.5 -46.5l-13 9q35 51 72 78t68 27q24 0 35 -7.5t11 -28.5q0 -19 -68 -240q-13 -41 -13 -74q0 -71 63 -71 q55 0 100 48.5t66 109t21 113.5q0 120 -92 136z" />
+<glyph unicode="&#x1d711;" horiz-adv-x="666" d="M247 19l34 130q75 289 245 289q47 0 76 -38.5t29 -116.5q0 -72 -36.5 -138.5t-109.5 -111t-165 -44.5l-40 -172h-83l43 172q-83 0 -136.5 44.5t-53.5 121.5q0 112 81 199t198 87h25l-5 -16q-86 -9 -150.5 -88.5t-64.5 -177.5q0 -59 33 -99.5t80 -40.5zM380 238l-53 -219 q73 0 146.5 87t73.5 183q0 55 -12 74t-32 19q-36 0 -72 -41.5t-51 -102.5z" />
+<glyph unicode="&#x1d712;" horiz-adv-x="595" d="M645 428l-290 -343q0 -131 9 -177t32 -46q29 0 54 67h16q-34 -131 -102 -131q-55 0 -55 112q0 34 7 125l-185 -218h-101l296 349v78q0 70 -12 101.5t-40 31.5q-33 0 -57 -66h-16q16 59 39 94.5t63 35.5q56 0 56 -138q0 -21 -1 -31l-4 -72l191 228h100z" />
+<glyph unicode="&#x1d713;" horiz-adv-x="661" d="M711 439v-16q-23 -3 -42 -13t-33 -29t-23.5 -35.5t-18.5 -44.5t-13 -45l-11 -46q-22 -96 -98.5 -158.5t-169.5 -62.5l-42 -172h-81l43 172h-10q-66 0 -109.5 39.5t-43.5 125.5q0 27 16 87.5t16 95.5q0 80 -61 86l5 16q19 2 55 2q41 0 64.5 -32.5t23.5 -78.5 q0 -28 -15.5 -92t-15.5 -93q0 -55 22 -88t61 -38l100 409h81l-100 -409q58 11 105 60t65 127l11 46l11 40q8 30 15 42l18 32q12 22 25 31.5t31 21t41.5 16t51.5 4.5h26z" />
+<glyph unicode="&#x1d714;" horiz-adv-x="681" d="M465 425l6 16q190 0 190 -161q0 -120 -80 -205.5t-165 -85.5q-44 0 -72.5 25t-31.5 64q-73 -89 -154 -89q-48 0 -80.5 27t-45 61.5t-12.5 72.5q0 123 83.5 207t214.5 84h16l3 -16q-93 0 -164 -93.5t-71 -219.5q0 -37 18 -65t50 -28q41 0 78.5 34t48.5 71q-3 22 -3 51 q0 41 8.5 81t32 72.5t56.5 32.5q14 0 23.5 -14t9.5 -33q0 -82 -78 -195q0 -43 16.5 -71.5t53.5 -28.5q41 0 81 51t62 114t22 108q0 69 -27.5 97.5t-88.5 35.5z" />
+<glyph unicode="&#x1d715;" horiz-adv-x="471" d="M195 625l-10 20q38 23 98 23q188 0 188 -260q0 -49 -8 -101t-29 -110t-53 -103.5t-85 -75t-120 -29.5q-69 0 -102.5 46t-33.5 116q0 109 75.5 196.5t181.5 87.5q69 0 96 -48q7 39 7 70q0 77 -30.5 129t-100.5 52q-33 0 -74 -13zM367 319q0 44 -18.5 65t-42.5 21 q-73 0 -129 -90.5t-56 -197.5q0 -98 67 -98q54 0 97.5 59t66.5 143q15 55 15 98z" />
+<glyph unicode="&#x1d716;" horiz-adv-x="430" d="M430 441l-19 -132h-15q-16 105 -93 105q-56 0 -98.5 -51.5t-62.5 -115.5h181l-5 -36h-185q-7 -20 -7 -66q0 -47 25 -74t67 -27q74 0 144 68l12 -14q-46 -52 -91.5 -80.5t-102.5 -28.5q-67 0 -103.5 43t-36.5 109q0 72 34 140.5t97.5 114t137.5 45.5q27 0 49.5 -10 t33.5 -10q14 0 23 20h15z" />
+<glyph unicode="&#x1d717;" horiz-adv-x="554" d="M33 205l-13 9q72 106 131 106q44 0 44 -45q0 -30 -18.5 -89.5t-18.5 -96.5q0 -78 57 -78q107 0 168 212q-88 38 -148 109.5t-60 159.5q0 81 48.5 133.5t128.5 52.5q78 0 116.5 -57.5t38.5 -139.5q0 -129 -47 -257q40 -13 45 -14l-5 -19q-20 1 -49 8q-87 -209 -239 -209 q-134 0 -134 104q0 12 1.5 23.5t5 25.5t5.5 21l8 25l8 23q8 24 8 39q0 14 -12 14q-21 0 -69 -60zM423 484q0 161 -79 161q-31 0 -51.5 -27t-27 -58t-6.5 -62q0 -75 35.5 -139.5t98.5 -102.5q30 123 30 228z" />
+<glyph unicode="&#x1d718;" horiz-adv-x="561" d="M587 428l-156 -145q-22 -36 -42 -86q-21 -54 -21 -84q0 -41 49 -41q51 0 51 -38q0 -20 -17 -34q-16 -13 -42 -13q-37 0 -61 26q-22 23 -22 61q0 60 48 154l-1 1l-252 -229h-109l148 136q16 26 35 90q20 66 20 100q0 28 -26 28q-27 0 -38 6q-17 11 -17 36q0 22 21 35 q14 10 32 10q68 0 68 -77q0 -72 -45 -181l1 -1l268 246h108z" />
+<glyph unicode="&#x1d719;" horiz-adv-x="645" d="M480 668l-55 -228q86 0 140.5 -36.5t54.5 -118.5q0 -118 -80 -204q-85 -92 -226 -92l-48 -172h-81l46 172q-85 0 -138 44t-53 127q0 110 84 196q83 84 205 84h16q32 127 53 228h82zM418 411l-97 -392q86 0 150 86t64 175q0 63 -28 97.5t-89 33.5zM240 19l99 392 q-93 0 -154 -79t-61 -174q0 -51 33 -95t83 -44z" />
+<glyph unicode="&#x1d71a;" horiz-adv-x="509" d="M221 -187l-14 7q4 7 4 16q0 13 -15 24.5t-34.5 20t-44.5 24t-40 32.5q-37 43 -37 122q0 108 82 233q41 62 99.5 105.5t126.5 43.5t104.5 -42t36.5 -112q0 -115 -73.5 -206t-194.5 -91q-53 0 -86 30.5t-33 75.5h-2q-6 -22 -6 -44q0 -34 14.5 -57.5t35 -36.5t41 -24t35 -28 t14.5 -41q0 -23 -13 -52zM409 324q0 34 -15.5 61t-48.5 27q-64 0 -126.5 -91.5t-62.5 -193.5q0 -39 17.5 -73.5t52.5 -34.5q44 0 81 36t58 87t32.5 100t11.5 82z" />
+<glyph unicode="&#x1d71b;" horiz-adv-x="856" d="M866 428l-22 -73h-80q18 -35 18 -83q0 -61 -23.5 -115.5t-60 -90t-79.5 -56.5t-82 -21q-44 0 -72.5 24t-31.5 62q-71 -86 -154 -86q-70 0 -104 48.5t-34 109.5q0 123 90 208h-50q-76 0 -135 -87h-16q22 63 80 111.5t127 48.5h629zM690 355h-371q-96 -93 -96 -246 q0 -37 18 -63.5t50 -26.5q41 0 79 32.5t48 69.5q-4 30 -4 51q0 149 69 149q18 0 29 -14.5t11 -41.5q0 -68 -56 -149q0 -97 70 -97q41 0 81 49t62 110t22 106q0 42 -12 71z" />
+<glyph unicode="&#x1d71c;" horiz-adv-x="759" d="M724 23l-2 -23h-319l4 23h31q51 0 51 45q0 22 -2 34l-15 108h-159l-80 -139q-6 -12 -6 -22q0 -26 22 -26h56l-6 -23h-260l4 23q37 4 60.5 19t47.5 56l346 587h49l94 -624q6 -38 47 -38h37zM466 256l-23 178l-103 -178h126z" />
+<glyph unicode="&#x1d71d;" horiz-adv-x="726" d="M197 669h265q41 0 74.5 -3t68 -13t57.5 -26t38 -44t15 -66q0 -100 -100 -147q-27 -13 -64 -24q49 -9 89.5 -45.5t40.5 -87.5q0 -99 -73.5 -156t-225.5 -57h-340l4 23h40q42 0 58.5 14.5t24.5 47.5l116 502q2 8 2 22q-2 20 -13 28.5t-43 8.5h-37zM440 624l-58 -251 q12 -2 32 -2q24 0 40 4q54 12 81.5 52t27.5 98q0 22 -4.5 42t-22.5 38.5t-47 18.5h-49zM373 324l-64 -274q24 -5 52 -5q68 0 116.5 49t48.5 127q0 103 -122 103h-31z" />
+<glyph unicode="&#x1d71e;" horiz-adv-x="634" d="M749 669l-43 -184h-23q5 24 5 50q0 46 -27.5 67.5t-66.5 21.5h-155l-125 -542q-3 -15 -3 -25q0 -19 13.5 -26.5t45.5 -7.5h52l-5 -23h-375l4 23h36q43 0 60.5 14.5t24.5 46.5l115 503q3 15 3 37q-1 14 -12.5 18t-43.5 4h-38l3 23h555z" />
+<glyph unicode="&#x1d71f;" horiz-adv-x="632" d="M589 0h-557l405 685h48zM427 102l-44 332l-192 -332h236z" />
+<glyph unicode="&#x1d720;" horiz-adv-x="732" d="M754 669l-40 -168h-23q3 17 3 38q0 34 -22.5 54t-46.5 25.5t-52 5.5h-135l-55 -239h55q34 0 57 5t46.5 27.5t33.5 62.5h22l-54 -251h-23q6 24 6 65q0 46 -85 46h-69l-58 -258q-2 -12 -2 -17q0 -20 42 -20h65q111 0 171 36.5t91 124.5h22l-61 -206h-600l4 23h36 q42 0 60 14.5t25 46.5l115 504q2 12 2 16q0 42 -59 42h-37l4 23h562z" />
+<glyph unicode="&#x1d721;" horiz-adv-x="797" d="M830 669l-548 -623h194q32 0 55.5 2t52 10.5t49 23t38.5 41t28 64.5h23l-44 -187h-612l555 624h-177q-42 0 -68 -3t-60.5 -13.5t-60.5 -36.5t-43 -68h-23l46 166h595z" />
+<glyph unicode="&#x1d722;" horiz-adv-x="891" d="M946 669l-5 -23h-37q-43 0 -60 -14t-24 -47l-114 -503q-6 -21 -6 -22v-3q1 -19 12.5 -26.5t45.5 -7.5h41l-5 -23h-349l4 23h23q43 0 61.5 14.5t25.5 46.5l57 251h-242l-59 -253q0 -3 -2 -10.5t-2 -12.5q2 -21 14 -28.5t46 -7.5h25l-5 -23h-349l4 23h36q43 0 61 14.5 t25 46.5l115 503q3 12 3 21q0 38 -57 38h-40l6 23h348l-3 -23h-25q-44 0 -61 -14t-24 -46l-46 -203h242l47 204q3 12 3 23q0 36 -60 36h-37l3 23h364z" />
+<glyph unicode="&#x1d723;" horiz-adv-x="783" d="M533 440h23q-43 -93 -43 -199h-23v15q0 41 -30 41h-115q-23 0 -34 -9.5t-30 -46.5h-23q45 87 45 199h22q0 -33 9 -45t30 -12h116q17 0 28 11.5t25 45.5zM755 430q0 -84 -34.5 -165.5t-92 -143t-137 -99.5t-165.5 -38q-128 0 -199.5 74.5t-71.5 186.5q0 74 30.5 151.5 t84.5 142t136.5 105.5t176.5 41q127 0 199.5 -75.5t72.5 -179.5zM601 465q0 73 -32 123t-97 50q-53 0 -98 -31.5t-74 -79.5t-50 -107.5t-30.5 -114t-9.5 -100.5q0 -75 31.5 -124.5t94.5 -49.5q60 0 112 45.5t84 113t50.5 141t18.5 134.5z" />
+<glyph unicode="&#x1d724;" horiz-adv-x="502" d="M557 669l-4 -23h-38q-43 0 -60.5 -14.5t-24.5 -46.5l-116 -503q-1 -5 -1 -25q1 -18 13 -26t45 -8h37l-4 -23h-362l4 23h38q43 0 59 14t24 47l115 502q3 12 3 21q0 39 -57 39h-37l4 23h362z" />
+<glyph unicode="&#x1d725;" horiz-adv-x="795" d="M839 669l-4 -23q-38 0 -65.5 -14.5t-69.5 -48.5l-248 -201l191 -284q33 -49 60 -62t75 -13l-4 -23h-328l4 23h29q29 0 29 22q0 18 -16 40l-138 208l-48 -211q-1 -5 -1 -21q1 -21 13 -29.5t45 -8.5h38l-5 -23h-354l5 23h30q44 0 59 14t23 47l115 503q4 16 4 23 q0 36 -58 36h-37l4 23h347l-6 -23h-27q-40 0 -56.5 -15.5t-24.5 -48.5l-40 -178h2l243 198q15 13 15 23q0 9 -8.5 15t-22.5 6h-24l4 23h250z" />
+<glyph unicode="&#x1d726;" horiz-adv-x="759" d="M724 23l-2 -23h-319l4 23h31q51 0 51 45q0 22 -2 34l-44 332l-210 -363q-6 -12 -6 -22q0 -26 22 -26h56l-6 -23h-260l4 23q37 4 60.5 19t47.5 56l346 587h49l94 -624q6 -38 47 -38h37z" />
+<glyph unicode="&#x1d727;" horiz-adv-x="1016" d="M1071 669l-3 -23h-34q-46 0 -63.5 -15.5t-25.5 -49.5l-115 -499q-3 -10 -3 -20q0 -39 59 -39h39l-4 -23h-362l4 23h35q44 0 60.5 14.5t24.5 46.5l82 354h-1l-283 -438h-56l-90 441l-80 -348q-3 -15 -3 -40q2 -17 12.5 -23.5t42.5 -6.5h38l-3 -23h-300l4 23h36 q43 0 61.5 17.5t26.5 54.5l111 486q4 12 4 33q0 17 -13.5 24.5t-44.5 7.5h-39l4 23h246l91 -468l297 468h245z" />
+<glyph unicode="&#x1d728;" horiz-adv-x="869" d="M924 669l-3 -23h-38q-43 0 -61.5 -15t-25.5 -49l-131 -582h-57l-263 491l-92 -409q-2 -12 -2 -18v-8q1 -18 12.5 -25.5t44.5 -7.5h39l-4 -23h-301l4 23h36q43 0 60.5 14.5t24.5 46.5l117 510q-21 52 -71 52h-38l3 23h232l222 -435l80 350q2 7 2 20q0 42 -57 42h-37l4 23 h300z" />
+<glyph unicode="&#x1d729;" horiz-adv-x="718" d="M757 669l-38 -182h-23q4 15 4 30q0 46 -53 46h-337q-33 0 -59 -20t-34 -56h-23l38 182h525zM635 459l-51 -239h-23q4 16 4 31q-1 36 -45 36h-204q-40 0 -52.5 -13.5t-21.5 -53.5h-23l51 239h23q-5 -22 -5 -32q0 -20 11 -27t38 -7h203q31 0 47 14t25 52h23zM663 187 l-39 -187h-567l39 187h23q-4 -16 -4 -25q0 -50 71 -50h349q52 0 73.5 15.5t31.5 59.5h23z" />
+<glyph unicode="&#x1d72a;" horiz-adv-x="777" d="M755 432q0 -117 -58 -220.5t-157.5 -165.5t-213.5 -62q-128 0 -199.5 75t-71.5 188q0 107 51 206t151.5 165.5t225.5 66.5q127 0 199.5 -74.5t72.5 -178.5zM601 467q0 73 -32 122t-97 49t-118 -46.5t-83 -116t-45.5 -140t-15.5 -128.5q0 -75 31.5 -125.5t94.5 -50.5 q60 0 112 45.5t84 114t50.5 142t18.5 134.5z" />
+<glyph unicode="&#x1d72b;" horiz-adv-x="887" d="M942 669l-5 -23h-37q-43 0 -60 -13.5t-24 -46.5l-115 -504q-4 -20 -4 -26q0 -18 12.5 -25.5t45.5 -7.5h40l-5 -23h-349l5 23h22q45 0 61.5 11.5t24.5 49.5l123 540h-242l-124 -542q-3 -15 -3 -26q0 -15 8 -22.5t19 -9t32 -1.5h25l-5 -23h-348l5 23h35q42 0 59.5 14 t25.5 47l115 504q1 6 2 20t1 16q0 8 -15 15t-42 7h-40l5 23h752z" />
+<glyph unicode="&#x1d72c;" horiz-adv-x="612" d="M198 669h284q128 0 189.5 -38t61.5 -125q0 -83 -74 -144.5t-223 -61.5q-46 0 -67 3l-51 -221q-4 -20 -4 -24q2 -21 13.5 -28t46.5 -7h52l-4 -23h-380l4 23h40q43 0 60.5 14.5t24.5 46.5l115 504q3 12 3 21q-1 19 -14 28t-46 9h-37zM441 623l-61 -273q22 -5 40 -5 q69 0 113 49t44 127q0 44 -26 73.5t-80 29.5q-21 0 -30 -1z" />
+<glyph unicode="&#x1d72d;" horiz-adv-x="783" d="M755 430q0 -84 -34.5 -165.5t-92 -143t-137 -99.5t-165.5 -38q-128 0 -199.5 74.5t-71.5 186.5q0 74 30.5 151.5t84.5 142t136.5 105.5t176.5 41q127 0 199.5 -75.5t72.5 -179.5zM237 383h356q8 46 8 82q0 73 -32 123t-97 50q-58 0 -106.5 -38.5t-78.5 -93t-50 -123.5z M574 297h-356q-8 -45 -8 -92q0 -75 31.5 -124.5t94.5 -49.5q81 0 142.5 77t95.5 189z" />
+<glyph unicode="&#x1d72e;" horiz-adv-x="759" d="M787 669l-39 -168h-23q3 17 3 50q0 24 -9 39.5t-26 22t-33.5 9t-39.5 2.5h-212l159 -250l-286 -266h270q63 0 97.5 19t63.5 73h25l-76 -200h-597l372 338l-217 331h568z" />
+<glyph unicode="&#x1d72f;" horiz-adv-x="568" d="M700 669l-44 -187h-24q7 21 7 54q0 88 -111 88h-78l-123 -541q-4 -24 -4 -25q1 -19 12.5 -27t44.5 -8h42l-3 -23h-368l4 23h40q43 0 60.5 14.5t24.5 46.5l124 540h-75q-74 0 -119 -37.5t-60 -104.5h-22l43 187h629z" />
+<glyph unicode="&#x1d730;" horiz-adv-x="589" d="M721 681l-9 -23q-20 0 -42 -15t-36.5 -31t-40.5 -48l-200 -245l-54 -233q-4 -18 -4 -29q0 -19 12 -26.5t45 -7.5h40l-6 -23h-361l8 23h34q42 0 58 14t24 47l57 244l-80 205q-13 34 -22.5 52.5t-25 37.5t-36.5 27t-51 8l6 23q49 4 103 4q35 0 62 -9.5t42 -20.5t30 -36 t20 -38l17 -45l51 -141l151 181q47 57 88 81t120 24z" />
+<glyph unicode="&#x1d731;" horiz-adv-x="827" d="M546 587l-5 -24q49 0 93 -10t82 -29.5t60.5 -54t22.5 -79.5q0 -58 -26.5 -107t-67 -81t-90.5 -55t-96 -33t-84 -10h-1l-7 -32q-1 -6 -1 -19q0 -30 52 -30h47l-5 -23h-365l6 23q61 0 85.5 8.5t30.5 35.5l8 37q-109 0 -183 48.5t-74 140.5q0 67 35 121t90 85.5t116.5 47.5 t121.5 16l10 44q1 2 1 7q0 14 -16 23t-42 9h-41l5 23h364l-5 -23h-41q-39 0 -56 -14.5t-24 -44.5zM529 517l-85 -366q63 0 127.5 71.5t64.5 157.5q0 56 -29.5 96.5t-77.5 40.5zM298 151l85 366q-66 0 -131.5 -78t-65.5 -154q0 -59 31 -96.5t81 -37.5z" />
+<glyph unicode="&#x1d732;" horiz-adv-x="808" d="M830 669l-3 -23h-24q-15 0 -28.5 -3.5t-21.5 -6t-19.5 -13t-15 -14t-16.5 -19t-15 -18.5l-177 -212l98 -270q13 -35 26 -51t36 -16h36l-4 -23h-316l3 23h28q49 0 49 36q0 15 -5 27l-63 171l-154 -179q-8 -9 -8 -22q0 -14 10.5 -23.5t28.5 -9.5h42l-4 -23h-285l4 23 q84 10 142 77l198 229l-89 237q-29 80 -84 80h-27l4 23h318l-4 -23h-39q-34 0 -34 -27q0 -8 8 -32l53 -155l137 162q10 12 10 27q0 25 -28 25h-31l4 23h260z" />
+<glyph unicode="&#x1d733;" horiz-adv-x="694" d="M781 684l-5 -23q-9 0 -16.5 -2.5t-13.5 -9t-11 -12.5t-10 -16.5t-7.5 -17t-6 -19.5t-5 -18t-4.5 -18t-3 -14q-27 -118 -55 -158q-77 -112 -255 -112l-39 -171q-6 -24 -6 -36q0 -34 80 -34h17l-5 -23h-362l5 23h23q48 0 69.5 14t31.5 58l39 169q-48 0 -94 14t-81 49 t-35 84q0 33 18.5 94t18.5 94q0 21 -10 41.5t-29 21.5l5 23h33q62 0 94 -39t32 -102q0 -46 -17 -102q-13 -43 -13 -63q0 -64 89 -68l62 271q3 10 3 21q0 44 -72 44q-18 0 -25 -1l6 23h362l-6 -23h-29q-5 0 -23 -1.5t-24 -5.5t-17.5 -10.5t-17 -18.5t-9.5 -28l-63 -271 q87 0 124 85q12 26 23 77.5t18 71.5q25 69 68.5 104t114.5 35h33z" />
+<glyph unicode="&#x1d734;" horiz-adv-x="826" d="M300 92l6 31q-74 13 -116 62.5t-42 122.5q0 61 27 126t76 121.5t127.5 93t170.5 36.5q130 0 198 -69t68 -178q0 -115 -79 -201t-196 -114l-9 -31h153q42 0 63 75h23l-38 -167h-305l42 153q79 17 134 113t55 197q0 70 -30.5 122t-89.5 52q-62 0 -116.5 -55t-84.5 -134.5 t-30 -155.5q0 -118 83 -139l-28 -153h-305l38 167h23q-5 -25 -5 -38q0 -20 9 -28.5t32 -8.5h146z" />
+<glyph unicode="&#x1d735;" horiz-adv-x="632" d="M600 669l-405 -685h-48l-104 685h557zM441 567h-236l44 -332z" />
+<glyph unicode="&#x1d736;" horiz-adv-x="624" d="M630 450l-163 -259q-1 -6 -1 -12q0 -17 1 -23q9 -98 41 -98q35 0 58 76l24 -7q-34 -139 -121 -139q-33 0 -58 24.5t-31 54.5q-72 -77 -181 -77q-72 0 -113.5 43.5t-41.5 124.5q0 117 79.5 210t196.5 93q54 0 88 -28.5t48 -69.5l49 87h125zM369 281q0 60 -14.5 100.5 t-47.5 40.5q-43 0 -95 -83.5t-52 -195.5q0 -48 14.5 -82t42.5 -34q36 0 79 57.5t67 120.5q6 35 6 76z" />
+<glyph unicode="&#x1d737;" horiz-adv-x="555" d="M54 -114l114 487q24 104 63 166.5t102 107.5q53 38 129 38q51 0 86 -33.5t35 -84.5q0 -57 -31.5 -105t-81.5 -68v-2q38 -6 63 -36.5t25 -89.5q0 -65 -28.5 -127t-90 -106.5t-143.5 -44.5q-67 0 -97 18l-28 -124q-12 -54 -26 -87h-117q10 24 26 91zM304 480l-87 -393 q0 -30 19.5 -44.5t47.5 -14.5q64 0 110 74.5t46 152.5q0 117 -52 117q-9 0 -23.5 -3t-21.5 -3q-33 0 -33 25q0 14 14 25t42 11q7 0 30.5 -5.5t27.5 -5.5q26 0 41 43.5t15 88.5q0 40 -18 62.5t-44 22.5q-47 0 -72 -37t-42 -116z" />
+<glyph unicode="&#x1d738;" horiz-adv-x="490" d="M503 450l-264 -401q0 -35 -5 -73t-16 -80.5t-35 -70t-57 -27.5q-29 0 -43 19.5t-14 41.5q0 20 10 45.5t20.5 43.5t31.5 50t29 46q13 95 13 208q0 47 -10.5 94t-34.5 47q-38 0 -61 -81h-23q40 150 121 150q49 0 66.5 -36.5t17.5 -97.5q0 -48 -7 -125l135 247h126z" />
+<glyph unicode="&#x1d739;" horiz-adv-x="538" d="M44 169v1q0 89 67 166.5t170 94.5q-45 23 -74.5 55.5t-29.5 68.5q0 64 57 97t135 33q48 0 95 -17t47 -46q0 -62 -59 -62q-23 0 -40.5 12.5t-26.5 28t-25.5 28t-39.5 12.5q-68 0 -68 -56q0 -24 29.5 -46.5t71.5 -43.5t84 -46t71.5 -66t29.5 -93q0 -125 -91.5 -211.5 t-216.5 -86.5q-87 0 -136.5 47t-49.5 130zM422 259q0 55 -39 94.5t-68 39.5q-69 -17 -112 -84t-43 -154q0 -69 20.5 -96t67.5 -27q67 0 120.5 77.5t53.5 149.5z" />
+<glyph unicode="&#x1d73a;" horiz-adv-x="495" d="M451 389l-18 -7q-11 13 -19 20t-30 13.5t-54 6.5q-52 0 -89.5 -31.5t-37.5 -76.5q0 -24 16.5 -37.5t43.5 -13.5q5 0 31 4.5t43 4.5q47 0 47 -22q0 -37 -65 -37q-5 0 -27.5 3t-31.5 3q-38 0 -77 -30.5t-39 -78.5q0 -37 28.5 -56t72.5 -19q43 0 76.5 17.5t74.5 61.5l18 -8 q-92 -116 -224 -116q-72 0 -117 31.5t-45 76.5q0 48 29.5 86.5t78.5 55.5v3q-22 7 -35.5 27t-13.5 40q0 62 61 107t166 45q48 0 87.5 -22t49.5 -51z" />
+<glyph unicode="&#x1d73b;" horiz-adv-x="472" d="M330 685l7 -21q-39 -15 -59.5 -36.5t-20.5 -39.5q0 -33 31 -41q118 104 186 104q48 0 48 -30q0 -39 -65.5 -84t-133.5 -45q-73 -49 -123 -133t-50 -180q0 -42 26.5 -64t73.5 -22q73 0 114.5 -23.5t41.5 -69.5q0 -72 -74 -138q-74 -65 -121 -65q-37 0 -57 18.5t-20 44.5 q0 54 61 54q25 0 36.5 -21t25.5 -21q30 0 51.5 22t21.5 58q0 25 -14.5 35.5t-47.5 10.5q-5 0 -34 -3.5t-39 -3.5q-64 0 -107.5 41.5t-43.5 105.5q0 97 50.5 186.5t155.5 185.5q-29 4 -51.5 20t-22.5 39q0 39 38 70.5t116 45.5z" />
+<glyph unicode="&#x1d73c;" horiz-adv-x="517" d="M248 356l6 1q25 47 70.5 76t97.5 29q49 0 69 -19.5t20 -55.5q0 -26 -8 -64l-76 -325q-8 -35 -15 -94.5t-7 -87.5q0 -7 6 -21h-113q-13 25 -13 52q0 51 100 467q3 15 3 38q0 35 -29 35q-40 0 -92 -93.5t-74 -183.5l-26 -110h-115l74 318q6 26 6 52q0 22 -18 22 q-24 0 -61 -45l-20 12q28 43 71.5 73t89.5 30q60 0 60 -47q0 -19 -6 -59z" />
+<glyph unicode="&#x1d73d;" horiz-adv-x="566" d="M555 476q0 -127 -50.5 -241t-129.5 -180t-163 -66q-80 0 -124 61t-44 165q0 116 47 225.5t124 177t159 67.5q83 0 132 -54.5t49 -154.5zM184 359h243q13 67 13 128q0 87 -14.5 122.5t-51.5 35.5q-57 0 -110 -84.5t-80 -201.5zM417 315h-245q-15 -71 -15 -132 q0 -154 70 -154q57 0 107 83t83 203z" />
+<glyph unicode="&#x1d73e;" horiz-adv-x="318" d="M255 104l19 -12q-57 -101 -152 -101q-67 0 -67 56q0 16 4 31l64 276q6 26 6 36q0 18 -20 18q-21 0 -37 -3l-4 23l197 34l-77 -331q-8 -40 -8 -48q0 -10 6 -17.5t15 -7.5q5 0 10 2t8.5 4.5t9 8t8.5 9t9 11.5t9 11z" />
+<glyph unicode="&#x1d73f;" horiz-adv-x="560" d="M240 294l129 101q84 67 140 67q68 0 68 -50q0 -62 -59 -62q-18 0 -28.5 7t-13.5 16t-10.5 16t-19.5 7q-14 0 -49 -29l-114 -93l112 -199q18 -32 40 -42t63 -10l-5 -23h-269l5 23h29q28 0 28 15q0 14 -13 36l-60 107l-42 -181h-116l82 363q4 16 4 28q0 17 -26 17 q-15 0 -32 -3l-3 23l196 34z" />
+<glyph unicode="&#x1d740;" horiz-adv-x="570" d="M514 130h23q-13 -62 -45 -104t-83 -42q-69 0 -69 117q0 22 2.5 46t8 64t8.5 64l-192 -275h-112l302 435v50q0 130 -55 130q-37 0 -60 -77h-23q40 147 125 147q19 0 30.5 -11t16.5 -34.5t6.5 -45t1.5 -55.5v-387q0 -53 16.5 -75.5t38.5 -22.5q16 0 32.5 20t27.5 56z" />
+<glyph unicode="&#x1d741;" horiz-adv-x="636" d="M583 83l20 -12q-58 -103 -161 -103q-29 0 -43 18t-14 43q0 28 16 78l-3 1q-23 -44 -62 -77t-73 -33q-38 0 -55 27h-2l-15 -59l-13 -52q-4 -16 -10.5 -38.5t-10.5 -34.5t-9.5 -24.5t-11.5 -21.5h-103q24 40 48 138l122 517h113l-74 -317q-3 -12 -3 -23q1 -21 9.5 -29 t30.5 -8q49 0 103.5 91.5t82.5 203.5l21 82h111l-79 -339q-7 -28 -7 -44q0 -31 19 -31q22 0 53 47z" />
+<glyph unicode="&#x1d742;" horiz-adv-x="523" d="M510 455l24 -7q-30 -122 -102.5 -228t-188.5 -230h-52l-58 378q-5 34 -76 34l-2 23q99 4 182 34l45 -315h1q67 65 117.5 130.5t69.5 100.5t40 80z" />
+<glyph unicode="&#x1d743;" horiz-adv-x="476" d="M332 685l6 -23q-79 -32 -79 -73q0 -7 2.5 -13.5t5 -9.5t5.5 -5.5t3 -3.5q31 29 78 51.5t80 22.5q54 0 54 -29q0 -41 -53.5 -66t-121.5 -25q-32 0 -49 -23t-17 -55q0 -21 14 -43q68 39 134 39q74 0 74 -31q0 -22 -15.5 -37t-41 -21t-45 -8.5t-38.5 -2.5q-32 0 -64 8 q-56 -24 -95 -68.5t-39 -103.5q0 -39 23 -55t77 -16q97 0 142 -21.5t45 -72.5q0 -70 -67 -134q-73 -69 -128 -69q-37 0 -57 19t-20 46q0 23 15 37.5t44 14.5q20 0 30 -11t16.5 -21.5t18.5 -10.5q31 0 51.5 24.5t20.5 57.5q0 45 -61 45q-10 0 -34.5 -3.5t-35.5 -3.5 q-84 0 -133 29.5t-49 91.5q0 138 174 249q-28 27 -28 75q0 22 18 48t41 37v3q-23 3 -38 18.5t-15 37.5q0 75 152 105z" />
+<glyph unicode="&#x1d744;" horiz-adv-x="561" d="M539 297q0 -136 -90.5 -221.5t-217.5 -85.5q-88 0 -137.5 48.5t-49.5 131.5q0 126 87.5 209t207.5 83q91 0 145.5 -43t54.5 -122zM423 300q0 64 -25 93t-64 29q-64 0 -119 -88t-55 -176q0 -71 21 -99.5t67 -28.5q68 0 121.5 86t53.5 184z" />
+<glyph unicode="&#x1d745;" horiz-adv-x="579" d="M590 450l-21 -91h-113q-17 -46 -35 -119.5t-18 -115.5q0 -22 9 -41.5t25 -19.5q37 0 65 71l24 -6q-12 -53 -55.5 -94t-101.5 -41q-73 0 -73 83q0 24 7 61q9 44 33 123l29 99h-61q-10 -28 -24 -83.5t-26.5 -100t-31 -90.5t-47 -72t-65.5 -26q-71 0 -71 51q0 36 42 51 q39 14 58 68l71 202q-76 0 -118 -54h-23q43 76 92.5 110.5t130.5 34.5h298z" />
+<glyph unicode="&#x1d746;" horiz-adv-x="595" d="M58 -110l62 267q24 101 67.5 169t94.5 101q53 35 115 35q67 0 116 -45t49 -135q0 -119 -85.5 -206.5t-188.5 -87.5q-54 0 -87 19l-25 -110q-15 -69 -28 -102h-115q8 20 25 95zM252 240l-33 -152q1 -30 20.5 -45t47.5 -15q55 0 108 82t53 171q0 131 -76 131q-39 0 -72 -50 t-48 -122z" />
+<glyph unicode="&#x1d747;" horiz-adv-x="480" d="M508 388q0 -19 -16 -36t-40 -17q-29 0 -51.5 23.5t-45.5 23.5q-79 0 -146.5 -65t-67.5 -152q0 -39 23 -55t77 -16q97 0 142 -21.5t45 -72.5q0 -35 -19 -75t-48 -68q-64 -60 -128 -60q-37 0 -57 19t-20 46q0 23 15 37.5t44 14.5q20 0 30 -11t16.5 -21.5t18.5 -10.5 q31 0 51.5 24.5t20.5 57.5q0 45 -61 45q-10 0 -34.5 -3.5t-35.5 -3.5q-84 0 -133 29.5t-49 91.5q0 75 49 151.5t125 127.5q107 71 192 71q46 0 74.5 -19.5t28.5 -54.5z" />
+<glyph unicode="&#x1d748;" horiz-adv-x="592" d="M603 450l-21 -91h-176q8 -17 26 -32t34 -25.5t28.5 -33.5t12.5 -56q0 -91 -81.5 -156.5t-193.5 -65.5q-89 0 -138.5 47.5t-49.5 129.5q0 53 21 103.5t59.5 90.5t98.5 64.5t132 24.5h248zM391 208v1q0 56 -15 89.5t-44 60.5q-67 0 -119.5 -55t-52.5 -149q0 -70 21 -97.5 t67 -27.5q59 0 101 56t42 122z" />
+<glyph unicode="&#x1d749;" horiz-adv-x="469" d="M502 450l-21 -91h-149l-53 -189q-8 -29 -8 -56q0 -51 32 -51q37 0 67 71l22 -6q-11 -51 -55 -93t-94 -42q-38 0 -63.5 17t-25.5 53q0 52 15 100l59 196h-32q-36 0 -77 -23.5t-63 -65.5h-23q23 63 82.5 121.5t131.5 58.5h255z" />
+<glyph unicode="&#x1d74a;" horiz-adv-x="552" d="M303 423l5 39q102 0 164.5 -43t62.5 -131q0 -124 -90.5 -211t-200.5 -87q-74 0 -121 27.5t-47 81.5q0 20 12 71l29 125q12 53 12 66q0 27 -17 27q-24 0 -59 -45l-20 12q27 43 69 73t91 30q29 0 44 -13.5t15 -34.5q0 -23 -10 -67l-40 -172q-9 -40 -9 -64q0 -77 67 -77 q68 0 122 82t54 178q0 133 -133 133z" />
+<glyph unicode="&#x1d74b;" horiz-adv-x="706" d="M259 30l27 122q22 101 52 155t92 105q15 13 47 27.5t52 14.5q58 0 98 -44.5t40 -118.5q0 -115 -82 -204t-220 -97l-44 -195h-117l45 195q-92 7 -143 58.5t-51 129.5q0 120 88 202t209 82h41l-10 -39q-82 0 -147 -80.5t-65 -172.5q0 -54 24 -93.5t64 -46.5zM424 241 l-49 -211q63 6 119.5 85t56.5 182q0 62 -10 84.5t-29 22.5q-50 0 -88 -163z" />
+<glyph unicode="&#x1d74c;" horiz-adv-x="621" d="M676 450l-293 -361l13 -121q11 -102 44 -102q47 0 67 79h23q-17 -75 -44 -112t-73 -37q-23 0 -38 12.5t-22 38.5t-10 49.5t-4 60.5l-3 89l-182 -230h-121l302 364l-6 83q-5 72 -19.5 101t-40.5 29q-18 0 -38 -20.5t-29 -55.5h-23q8 59 36 102t85 43q39 0 56.5 -38 t20.5 -118l3 -86l177 230h119z" />
+<glyph unicode="&#x1d74d;" horiz-adv-x="701" d="M756 462l-5 -38q-53 -5 -80.5 -42t-42.5 -100q-12 -49 -23.5 -85t-33.5 -77.5t-50 -68t-72.5 -44t-99.5 -17.5l-44 -195h-116l44 195q-79 6 -123.5 49t-44.5 121q0 29 20.5 93t19.5 100q-2 61 -72 71l7 38h49q64 0 94 -32t30 -82q0 -34 -16 -99.5t-16 -98.5 q0 -50 16.5 -82.5t44.5 -37.5l98 420h116l-98 -420q28 0 53.5 24.5t45 65t33.5 81t24 83.5q10 40 21 67.5t32.5 55t56.5 41.5t83 14h49z" />
+<glyph unicode="&#x1d74e;" horiz-adv-x="687" d="M441 462h39q85 0 135 -49.5t50 -127.5q0 -115 -76 -205t-168 -90q-74 0 -104 65q-55 -65 -144 -65q-75 0 -113 50.5t-38 125.5q0 68 36 135.5t94 107.5q76 53 173 53h32l-10 -39q-56 0 -112 -47q-46 -39 -71.5 -107t-25.5 -142q0 -38 17 -67.5t43 -29.5q25 0 50.5 24 t38.5 66q-10 47 -10 84q0 62 27.5 115t79.5 53t52 -71q0 -68 -74 -179q-2 -10 -2 -18q0 -35 20 -54.5t46 -19.5q33 0 62.5 44.5t45 101t15.5 101.5q0 146 -116 146z" />
+<glyph unicode="&#x1d74f;" horiz-adv-x="559" d="M234 627l2 23q43 36 119 36q204 0 204 -256q0 -53 -12 -111.5t-39 -117.5t-64 -105.5t-92.5 -76t-120.5 -29.5q-89 0 -138 46.5t-49 129.5q0 119 89 206t209 87q41 0 80.5 -19t52.5 -51h4v8q2 18 2 27q0 48 -5.5 83.5t-21 69t-47.5 51t-80 17.5q-30 0 -93 -18zM423 293 q0 64 -25.5 95t-63.5 31q-64 0 -119 -88.5t-55 -176.5q0 -70 20.5 -97t67.5 -27q68 0 121.5 82.5t53.5 180.5z" />
+<glyph unicode="&#x1d750;" horiz-adv-x="481" d="M481 461l-26 -140h-23q0 24 -2.5 39.5t-10.5 31.5t-27 24t-49 8q-51 0 -98 -50.5t-65 -110.5h188l-10 -44h-188q-10 -30 -10 -66q0 -58 27 -88t74 -30q80 0 152 79l18 -6q-17 -22 -30.5 -36.5t-41 -36.5t-66 -33.5t-85.5 -11.5q-82 0 -123 45.5t-41 112.5q0 116 85 214.5 t198 98.5q41 0 67 -9.5t31 -9.5q26 0 33 19h23z" />
+<glyph unicode="&#x1d751;" horiz-adv-x="607" d="M584 241l-5 -31q-45 2 -67 6q-18 -47 -36.5 -81.5t-46.5 -71t-66.5 -56.5t-84.5 -20q-160 0 -160 128q0 21 8 62t8 45v4q0 23 -17 23q-24 0 -64 -49l-20 18q26 39 68.5 69t83.5 30q33 0 49.5 -24t16.5 -58q0 -11 -4 -31q-19 -84 -19 -120q0 -68 50 -68q68 0 128 228 q-204 98 -204 252q0 88 53.5 145t140.5 57q48 0 94 -26q80 -47 80 -190q0 -100 -44 -228q33 -11 58 -13zM454 541q0 119 -60 119q-42 0 -61 -48t-19 -98q0 -117 105 -215q35 146 35 242z" />
+<glyph unicode="&#x1d752;" horiz-adv-x="607" d="M630 450l-154 -146q-18 -36 -33 -93q-13 -48 -13 -78q0 -36 36 -36q31 0 46 -18q11 -12 11 -33q0 -26 -17 -43q-18 -18 -52 -18q-44 0 -65 36q-16 26 -16 69q0 80 39 154l-260 -244h-164l157 147q18 35 33 92q13 48 13 76q0 36 -36 36q-30 0 -45 18q-12 13 -12 33 q0 25 17 42q20 18 52 18q44 0 65 -35q16 -26 16 -69q0 -77 -38 -151l256 243h164z" />
+<glyph unicode="&#x1d753;" horiz-adv-x="683" d="M512 685l-51 -223q84 0 139 -43.5t55 -125.5q0 -66 -29 -127q-37 -80 -109.5 -125.5t-163.5 -50.5l-44 -195h-117l45 195q-86 6 -139.5 55.5t-53.5 132.5q0 64 32 126q40 76 111 117t158 41l50 223h117zM453 423l-90 -393q59 12 108 74.5t63 127.5q5 21 5 53 q0 48 -21.5 89.5t-64.5 48.5zM247 30l90 393q-73 -11 -125 -90.5t-52 -157.5q0 -52 21 -93.5t66 -51.5z" />
+<glyph unicode="&#x1d754;" horiz-adv-x="585" d="M252 -205h-19q3 7 3 15q0 19 -30 39.5t-66 38.5t-66 55.5t-30 86.5q0 100 38.5 198t115 166t172.5 68q89 0 141 -43t52 -125q0 -121 -87.5 -212.5t-209.5 -91.5q-88 0 -131 61l-5 -1q0 -37 23.5 -64.5t51.5 -41.5t51.5 -34t23.5 -44q0 -45 -28 -71zM448 297 q0 64 -25.5 94.5t-63.5 30.5q-42 0 -83.5 -44t-66 -107t-24.5 -119q0 -70 20.5 -96t67.5 -26q68 0 121.5 84.5t53.5 182.5z" />
+<glyph unicode="&#x1d755;" horiz-adv-x="868" d="M879 450l-21 -91h-73q15 -33 15 -75q0 -115 -76 -204.5t-168 -89.5q-74 0 -104 65q-55 -65 -144 -65q-75 0 -113 50.5t-38 125.5q0 107 78 193h-36q-92 0 -143 -91h-23q52 182 248 182h598zM668 359h-312q-40 -41 -61.5 -103t-21.5 -129q0 -38 17 -67.5t43 -29.5 q25 0 49.5 22.5t37.5 64.5q-6 34 -6 58q0 17 4 40.5t13.5 52t29.5 48t48 19.5q44 0 44 -68q0 -40 -13.5 -70.5t-42.5 -74.5q-2 -10 -2 -18q0 -35 20 -54.5t46 -19.5q33 0 62.5 44t45 100.5t15.5 101.5q0 51 -16 83z" />
+<glyph unicode="&#x1d756;" horiz-adv-x="690" d="M665 0h-130l-66 162h-248l-66 -162h-130l306 690h28zM428 264l-83 204l-83 -204h166z" />
+<glyph unicode="&#x1d757;" horiz-adv-x="636" d="M463 373l1 -4q75 -36 102.5 -79.5t27.5 -101.5q0 -81 -73 -134.5t-181 -53.5h-260v676h237q118 0 180 -43t62 -125q0 -41 -25 -77.5t-71 -57.5zM208 413h72q141 0 141 89q0 37 -23 54.5t-77 17.5h-113v-161zM208 102h103q80 0 110.5 29t30.5 80q0 52 -49.5 76t-119.5 24 h-75v-209z" />
+<glyph unicode="&#x1d758;" horiz-adv-x="591" d="M569 574h-359v-574h-130v676h477z" />
+<glyph unicode="&#x1d759;" horiz-adv-x="720" d="M680 0h-640l306 690h28zM508 102l-148 366l-148 -366h296z" />
+<glyph unicode="&#x1d75a;" horiz-adv-x="635" d="M597 102l-27 -102h-490v676h480v-102h-350v-167h241v-103h-241v-202h387z" />
+<glyph unicode="&#x1d75b;" horiz-adv-x="653" d="M623 102l-15 -102h-583v16l372 558h-334l13 102h525v-16l-374 -558h396z" />
+<glyph unicode="&#x1d75c;" horiz-adv-x="715" d="M635 0h-130v297h-295v-297h-130v676h130v-277h295v277h130v-676z" />
+<glyph unicode="&#x1d75d;" horiz-adv-x="778" d="M743 336q0 -157 -99 -256t-254 -99q-154 0 -254.5 99t-100.5 256t100 256t254 99t254 -99t100 -256zM605 336q0 115 -57 184t-159 69t-159 -69t-57 -184q0 -116 57 -184.5t160 -68.5q102 0 158.5 68.5t56.5 184.5zM531 296h-282l12 102h256z" />
+<glyph unicode="&#x1d75e;" horiz-adv-x="440" d="M375 102l-9 -102h-287l-14 102h90v472h-90l14 102h287l9 -102h-90v-472h90z" />
+<glyph unicode="&#x1d75f;" horiz-adv-x="712" d="M707 0h-170l-296 306l-33 -29v-277h-128v676h128v-263l295 263h145v-14l-318 -278z" />
+<glyph unicode="&#x1d760;" horiz-adv-x="706" d="M666 0h-130l-183 468l-183 -468h-130l299 690h28z" />
+<glyph unicode="&#x1d761;" horiz-adv-x="913" d="M833 0h-128v467l-235 -467h-27l-235 467v-467h-128v676h161l214 -440h3l214 440h161v-676z" />
+<glyph unicode="&#x1d762;" horiz-adv-x="724" d="M644 -18l-105 20l-331 500v-502h-128v676h157l279 -424v424h128v-694z" />
+<glyph unicode="&#x1d763;" horiz-adv-x="640" d="M582 584h-524l13 92h498zM503 299h-366v102h366v-102zM605 102l-12 -102h-546l-12 102h570z" />
+<glyph unicode="&#x1d764;" horiz-adv-x="778" d="M743 337q0 -157 -99 -256t-254 -99q-154 0 -254.5 99t-100.5 256t100 256t254 99t254 -99t100 -256zM605 337q0 115 -57 184t-159 69t-159 -69t-57 -184q0 -116 57 -184.5t160 -68.5q102 0 158.5 68.5t56.5 184.5z" />
+<glyph unicode="&#x1d765;" horiz-adv-x="715" d="M635 0h-130v574h-295v-574h-130v676h555v-676z" />
+<glyph unicode="&#x1d766;" horiz-adv-x="581" d="M80 676h209q139 0 209.5 -50.5t70.5 -144.5q0 -91 -69.5 -147t-186.5 -56h-103v-278h-130v676zM210 380h71q83 0 119.5 25t36.5 77q0 92 -162 92h-65v-194z" />
+<glyph unicode="&#x1d767;" horiz-adv-x="778" d="M743 336q0 -157 -99 -256t-254 -99q-154 0 -254.5 99t-100.5 256t100 256t254 99t254 -99t100 -256zM177 398h423q-14 89 -68.5 140t-142.5 51t-142.5 -51t-69.5 -140zM603 296h-428q9 -99 65 -156t150 -57q93 0 148 57t65 156z" />
+<glyph unicode="&#x1d768;" horiz-adv-x="674" d="M632 102l-15 -102h-586v16l281 330l-284 314v16h562v-102h-330l205 -226l-210 -246h377z" />
+<glyph unicode="&#x1d769;" horiz-adv-x="641" d="M627 574h-240v-574h-130v574h-243l14 102h589z" />
+<glyph unicode="&#x1d76a;" horiz-adv-x="748" d="M728 675l-33 -98q-36 12 -52 12q-17 0 -31.5 -3.5t-38.5 -20.5t-44.5 -47.5t-45 -91t-44.5 -144.5v-282h-130v282q-20 84 -44.5 144.5t-45 91t-44.5 47.5t-38.5 20.5t-31.5 3.5q-12 0 -53 -11l-32 97q49 16 88 16q20 0 44 -5t58.5 -22.5t64 -44t57 -75t41.5 -111.5 q19 76 56 131t78.5 80.5t74 36t58.5 10.5q39 0 88 -16z" />
+<glyph unicode="&#x1d76b;" horiz-adv-x="800" d="M465 676v-102q80 -3 148.5 -28.5t115 -79.5t46.5 -127t-46.5 -128.5t-115 -82t-148.5 -29.5v-99h-130v99q-126 4 -218 67.5t-92 172.5q0 73 46 127t114.5 79.5t149.5 28.5v102h130zM464 472v-271q90 6 131.5 45t41.5 93q0 53 -41.5 90.5t-131.5 42.5zM336 201v271 q-90 -5 -131.5 -42.5t-41.5 -90.5q0 -54 41.5 -93t131.5 -45z" />
+<glyph unicode="&#x1d76c;" horiz-adv-x="740" d="M700 0h-154l-179 239l-173 -239h-154l249 343l-248 333h154l170 -228l166 228h154l-242 -333z" />
+<glyph unicode="&#x1d76d;" horiz-adv-x="806" d="M791 691l-31 -102q-18 -3 -29 -15.5t-15 -34t-5 -35t-1 -36.5q0 -93 -72.5 -148t-169.5 -61v-259h-130v259q-97 6 -169.5 62.5t-72.5 150.5q0 22 -1 35.5t-5 34t-15 32.5t-29 15l-31 102h39q77 0 124.5 -49.5t47.5 -162.5q0 -48 30 -79.5t82 -37.5v314h130v-314 q52 6 82 37.5t30 79.5q0 112 48 162t124 50h39z" />
+<glyph unicode="&#x1d76e;" horiz-adv-x="752" d="M720 102l-15 -102h-295l11 207q70 17 116.5 64t46.5 126q0 87 -58.5 139.5t-149.5 52.5q-90 0 -149 -58t-59 -134q0 -148 163 -191l11 -206h-295l-15 102h202l-4 29q-72 19 -131 87.5t-59 166.5q0 76 36.5 144.5t115 115t184.5 46.5q153 0 244.5 -91.5t91.5 -214.5 q0 -98 -59 -166.5t-131 -87.5l-4 -29h202z" />
+<glyph unicode="&#x1d76f;" horiz-adv-x="735" d="M685 664l-306 -694h-28l-306 694h640zM512 560h-294l147 -361z" />
+<glyph unicode="&#x1d770;" horiz-adv-x="662" d="M629 461l-116 -245q11 -35 20 -55q33 -80 92 -80v-16l-35 -79q-59 0 -87 13q-43 20 -65 78h-2q-30 -43 -64 -64q-43 -27 -115 -27q-94 0 -155.5 69t-61.5 172q0 95 64.5 170.5t170.5 75.5q116 0 181 -98l44 86h129zM383 209q-8 78 -39.5 123.5t-74.5 45.5 q-48 0 -76 -42.5t-28 -103.5q0 -65 28 -108t77 -43q42 0 70 38t43 90z" />
+<glyph unicode="&#x1d771;" horiz-adv-x="512" d="M372 416l2 -1q50 -12 81.5 -61t31.5 -106q0 -62 -19.5 -118t-55.5 -92q-53 -52 -140 -52q-55 0 -97 38v-135q0 -61 -17 -94h-119q16 37 16 88v527q0 57 10 103.5t33 88.5t67.5 66t107.5 24q67 0 118 -42.5t51 -111.5q0 -85 -70 -122zM175 442v-292q22 -38 41.5 -53.5 t50.5 -15.5q34 0 64.5 42t30.5 108q0 44 -9.5 71t-32 39t-44.5 15t-62 3v16l42 79q71 0 71 76q0 27 -14.5 47t-46.5 20q-91 0 -91 -155z" />
+<glyph unicode="&#x1d772;" horiz-adv-x="502" d="M477 461l-174 -411v-245l-13 -10l-107 24q8 124 8 227q0 104 -33 198q-17 49 -56 91.5t-92 42.5v16l50 79q75 0 135.5 -87.5t66.5 -177.5h2l83 253h130z" />
+<glyph unicode="&#x1d773;" horiz-adv-x="502" d="M380 539h-17q-60 58 -107 58q-21 0 -38 -12t-17 -34q0 -35 91 -80q90 -43 137.5 -102t47.5 -156q0 -87 -59 -157t-167 -70t-167 69.5t-59 157.5q0 75 35 131t102 84q-81 45 -81 123q0 69 51.5 105t127.5 36q57 0 99.5 -15.5t74.5 -58.5zM352 208q0 58 -20 92.5t-64 53.5 q-55 -3 -86.5 -43t-31.5 -103q0 -51 28.5 -89t71.5 -38q49 0 75.5 37.5t26.5 89.5z" />
+<glyph unicode="&#x1d774;" horiz-adv-x="451" d="M389 140l45 -61q-42 -60 -89 -76.5t-123 -16.5q-109 0 -162 53q-35 36 -35 91q0 34 19.5 64.5t60.5 44.5v3q-60 33 -60 90q0 66 58 103.5t139 37.5q69 0 112 -19.5t66 -70.5l-53 -61h-16q-22 34 -42.5 45t-60.5 11q-37 0 -60 -11.5t-23 -32.5q0 -41 72 -41h57l40 -82 l-11 -13h-96q-37 0 -57 -16.5t-20 -38.5q0 -25 24.5 -43.5t64.5 -18.5q98 0 134 59h16z" />
+<glyph unicode="&#x1d775;" horiz-adv-x="500" d="M281 81h56q58 0 104.5 -31t46.5 -96q0 -72 -46 -115.5t-122 -43.5q-53 0 -76 21v98h16q26 -24 61 -24q72 0 72 50q0 46 -79 46h-90q-81 0 -126 38q-70 61 -70 190q0 81 32 156t91 131v3q-64 41 -64 107q0 50 24 81h16l76 -17q-14 -30 -14 -54q0 -38 33 -53q53 31 82 43 t80 23h17l17 -95q-101 -11 -182 -92q-37 -37 -60 -95t-23 -124q0 -57 24 -96q33 -51 104 -51z" />
+<glyph unicode="&#x1d776;" horiz-adv-x="510" d="M474 -205h-127q-12 24 -12 95v419q0 69 -65 69q-24 0 -51.5 -21t-43.5 -64v-293h-120v349q0 51 -20 89l101 35h9q18 -20 26 -62h2q60 62 133 62q74 0 111.5 -39t37.5 -113v-437q0 -54 19 -89z" />
+<glyph unicode="&#x1d777;" horiz-adv-x="500" d="M477 341q0 -88 -25.5 -167t-78.5 -133.5t-123 -54.5t-123 54.5t-78.5 133.5t-25.5 167q0 87 25.5 165.5t78.5 132t123 53.5t123 -53.5t78.5 -132t25.5 -165.5zM148 388h204q0 82 -29 144.5t-73 62.5q-48 0 -75 -61t-27 -146zM352 293h-204q0 -89 29 -150.5t73 -61.5 q45 0 73.5 62t28.5 150z" />
+<glyph unicode="&#x1d778;" horiz-adv-x="319" d="M296 108l-14 -100q-39 -22 -90 -22q-68 0 -101 32q-38 36 -38 98v345h120v-298q0 -82 53 -82q28 0 54 27h16z" />
+<glyph unicode="&#x1d779;" horiz-adv-x="527" d="M512 0h-155l-163 187l-19 -20v-167h-120v461h120v-163h2q140 160 286 175l38 -79v-16q-55 -5 -97.5 -22.5t-64 -34.5t-62.5 -55z" />
+<glyph unicode="&#x1d77a;" horiz-adv-x="554" d="M520 65l-46 -79q-59 0 -101.5 36t-69.5 139l-36 137l-118 -298h-131l206 459q-21 83 -59.5 110.5t-97.5 27.5v16l50 79q68 0 118.5 -48t85.5 -166l76 -256q23 -79 49 -110t74 -31v-16z" />
+<glyph unicode="&#x1d77b;" horiz-adv-x="550" d="M517 65l-35 -79q-113 0 -136 70h-2q-16 -34 -43.5 -52t-56.5 -18q-49 0 -71 24h-2v-121q0 -61 -17 -94h-115q16 41 16 88v578h120v-312q0 -68 66 -68q29 0 54.5 21t39.5 62v297h120v-306q0 -36 12 -55t50 -19v-16z" />
+<glyph unicode="&#x1d77c;" horiz-adv-x="492" d="M339 453l116 20q17 -31 17 -109q0 -87 -54 -175t-146 -145.5t-191 -57.5h-26v475h120v-331h2q74 24 122 91t48 146q0 48 -13 76z" />
+<glyph unicode="&#x1d77d;" horiz-adv-x="501" d="M277 81h61q58 0 104.5 -31t46.5 -96q0 -72 -46 -115.5t-122 -43.5q-53 0 -76 21v98h16q26 -24 61 -24q72 0 72 50q0 46 -79 46h-89q-83 0 -140.5 50.5t-57.5 131.5q0 63 35 117t102 89v3q-59 27 -59 88q0 51 44 89q-25 17 -35.5 32.5t-10.5 43.5q0 32 23 62h16l77 -17 q-14 -18 -14 -35q0 -23 28 -38q84 32 143 32l11 -3l8 -92q-71 0 -120.5 -21.5t-49.5 -58.5q0 -30 36 -41q61 21 158 21l8 -5l-8 -90q-109 0 -188 -45.5t-79 -117.5q0 -100 124 -100z" />
+<glyph unicode="&#x1d77e;" horiz-adv-x="501" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM351 232q0 69 -26.5 107.5t-77.5 38.5q-48 0 -72.5 -41.5t-24.5 -104.5q0 -66 26 -108.5t74 -42.5q28 0 48.5 14.5t31.5 38t16 48.5t5 50z" />
+<glyph unicode="&#x1d77f;" horiz-adv-x="594" d="M572 366h-99q-12 -90 -12 -175q0 -55 19 -78.5t77 -31.5v-17l-40 -78q-28 0 -49 3t-47.5 12.5t-43.5 26.5t-29 48t-12 74q0 76 17 216h-76q0 -47 -0.5 -75t-2.5 -65.5t-6 -60t-11 -50.5t-17 -44t-25 -33.5t-34 -27t-44.5 -16t-57.5 -8.5l-13 95q26 7 36.5 10.5t24 15.5 t17 25t8 46t5 70.5t0.5 105.5q-15 0 -33.5 -19t-28.5 -55l-85 38q46 143 189 143h373v-95z" />
+<glyph unicode="&#x1d780;" horiz-adv-x="511" d="M54 -117v242q0 95 8.5 147.5t37.5 104.5q55 96 182 96q90 0 147 -63t57 -163q0 -138 -75 -210q-52 -51 -139 -51q-52 0 -98 41v-138q0 -61 -17 -94h-119q16 37 16 88zM361 230q0 148 -89 148q-69 0 -90 -92q-8 -33 -8 -136q22 -38 41.5 -53.5t50.5 -15.5q45 0 70 44 t25 105z" />
+<glyph unicode="&#x1d781;" horiz-adv-x="498" d="M279 81h56q58 0 104.5 -31t46.5 -96q0 -72 -46 -115.5t-122 -43.5q-53 0 -76 21v98h16q26 -24 61 -24q72 0 72 50q0 46 -79 46h-80q-87 0 -146.5 60t-59.5 152q0 119 76.5 197t194.5 78q62 0 115 -26.5t67 -78.5l-72 -57h-17q-18 67 -95 67q-67 0 -105.5 -45t-38.5 -107 q0 -60 21 -94q33 -51 107 -51z" />
+<glyph unicode="&#x1d782;" horiz-adv-x="520" d="M552 366h-165v-2q42 -33 65 -77t23 -88q0 -31 -14 -66.5t-40 -69t-70.5 -55.5t-98.5 -22q-96 0 -161.5 67.5t-65.5 171.5q0 62 22.5 110t58 74t72.5 39t73 13h301v-95zM350 210q0 102 -103 156q-45 0 -71 -38t-26 -99q0 -65 26.5 -106.5t75.5 -41.5q48 0 73 41t25 88z " />
+<glyph unicode="&#x1d783;" horiz-adv-x="479" d="M472 366h-153q-12 -90 -12 -175q0 -52 23.5 -77t83.5 -33v-17l-40 -78q-28 0 -50 3t-50 12.5t-46.5 26.5t-32 48t-13.5 74q0 76 21 216q-49 0 -74.5 -27.5t-37.5 -73.5l-85 38q26 81 64 119.5t105 38.5h297v-95z" />
+<glyph unicode="&#x1d784;" horiz-adv-x="514" d="M247 378v95q105 0 173.5 -61.5t68.5 -182.5q0 -105 -65 -174t-161 -69q-101 0 -154.5 50.5t-53.5 140.5v147q0 91 -20 113l102 36h16q22 -41 22 -73v-193q0 -52 21.5 -89t68.5 -37q48 0 73.5 46t25.5 96q0 155 -117 155z" />
+<glyph unicode="&#x1d785;" horiz-adv-x="634" d="M258 81v102q0 39 0.5 61.5t4 57.5t9.5 55.5t18 45.5t29.5 38t44.5 22.5t61 9.5q68 0 126 -67.5t58 -181.5q0 -99 -57.5 -168.5t-174.5 -69.5v-191h-120v191q-117 0 -174.5 69t-57.5 169q0 74 36 145t94 92l69 -58v-12q-74 -39 -74 -158q0 -152 108 -152zM376 212v-131 q108 0 108 150q0 80 -12 113.5t-47 33.5q-32 0 -40.5 -40.5t-8.5 -125.5z" />
+<glyph unicode="&#x1d786;" horiz-adv-x="573" d="M553 461l-215 -340q5 -89 44 -156t117 -75v-16l-48 -79q-39 0 -73 19.5t-57 52.5t-38.5 67t-24.5 70l-1 4l-110 -203h-138l210 333q-2 44 -11.5 82t-28 74.5t-53 58.5t-80.5 25v16l50 79q78 0 129 -60t75 -156l1 -4l114 208h138z" />
+<glyph unicode="&#x1d787;" horiz-adv-x="680" d="M699 473l-22 -95q-49 -17 -49 -152q0 -104 -48 -165t-158 -75v-191h-120v191q-206 24 -206 240q0 135 -49 152l-22 95q89 0 142.5 -55.5t53.5 -142.5q0 -109 14.5 -145.5t66.5 -48.5v380h120v-380q50 13 65.5 50t15.5 144q0 86 53.5 142t142.5 56z" />
+<glyph unicode="&#x1d788;" horiz-adv-x="740" d="M455 410l81 51q69 -19 111 -89.5t42 -151.5q0 -131 -70 -193q-47 -41 -117 -41q-44 0 -81 22t-55 61h-2q-16 -39 -53.5 -61t-81.5 -22q-76 0 -120 43q-67 62 -67 191q0 80 41.5 151t109.5 90l83 -51v-16q-56 -22 -82.5 -71.5t-26.5 -108.5q0 -133 62 -133q75 0 75 145v92 l107 29l13 -10v-111q0 -75 22 -110t56 -35q62 0 62 133q0 60 -26 109t-83 71v16z" />
+<glyph unicode="&#x1d789;" horiz-adv-x="501" d="M103 608l30 83q77 -4 136.5 -28.5t98 -62.5t63.5 -90.5t35 -109.5t10 -123q0 -154 -72 -227q-64 -64 -154 -64q-96 0 -160.5 68.5t-64.5 173.5q0 106 63 175.5t160 69.5q49 0 90 -33l3 2q-55 152 -222 154zM351 232q0 69 -26.5 107.5t-77.5 38.5q-48 0 -72.5 -41.5 t-24.5 -104.5q0 -66 26 -108.5t74 -42.5q28 0 48.5 14.5t31.5 38t16 48.5t5 50z" />
+<glyph unicode="&#x1d78a;" horiz-adv-x="462" d="M373 145l67 -65q-46 -56 -85.5 -75t-109.5 -19q-95 0 -157.5 66.5t-62.5 168.5q0 111 67 181.5t164 70.5q88 0 130 -30v-124h-16q-16 27 -38.5 41t-37.5 16t-37 2q-35 0 -66 -22.5t-39 -65.5h149v-95h-150q5 -48 36.5 -77.5t77.5 -29.5q70 0 108 57z" />
+<glyph unicode="&#x1d78b;" horiz-adv-x="536" d="M522 380v-95q-18 0 -43 5v-31q0 -130 -60 -201.5t-158 -71.5q-100 0 -153 50.5t-53 140.5v65q0 81 -20 103l102 36h16q22 -41 22 -73v-101q0 -53 20.5 -89.5t67.5 -36.5q91 0 91 172q0 44 -1 68q-222 72 -222 237q0 67 40 100.5t93 33.5q82 0 137.5 -76t70.5 -227 q24 -6 50 -9zM351 431q-3 78 -27 121.5t-61 43.5t-37 -48q0 -30 35.5 -67t89.5 -50z" />
+<glyph unicode="&#x1d78c;" horiz-adv-x="570" d="M554 85v-88q-39 -11 -71 -11q-61 0 -100.5 50t-46.5 152l-225 -202l-97 91l121 108v12q0 101 -19 141q-20 39 -68 39q-9 0 -21 -3v88q39 11 61 11q121 0 127 -215l240 215l97 -91l-136 -122q0 -78 29 -128t88 -50q9 0 21 3z" />
+<glyph unicode="&#x1d78d;" horiz-adv-x="634" d="M377 692v-219q51 0 91 -13t66 -35.5t43 -54.5t24.5 -66.5t7.5 -74.5q0 -106 -57 -174.5t-175 -68.5v-191h-120v191q-118 0 -175 68.5t-57 174.5q0 108 55 176t177 68v219h120zM376 378v-297q108 0 108 150q0 75 -30 111t-78 36zM258 81v297q-48 0 -78 -36t-30 -111 q0 -150 108 -150z" />
+<glyph unicode="&#x1d78e;" horiz-adv-x="494" d="M299 -205h-17q-5 14 -26.5 24t-60 30.5t-73.5 53.5q-97 93 -97 279q0 154 72 227q64 64 155 64q95 0 156 -69t61 -175t-62 -174.5t-159 -68.5q-49 0 -90 33l-3 -2q11 -29 38 -48.5t57.5 -30.5t59.5 -23t48 -36t19 -60zM344 232q0 146 -99 146q-47 0 -71 -46t-24 -110 q0 -65 24.5 -103t73.5 -38q52 0 74 46t22 105z" />
+<glyph unicode="&#x1d78f;" horiz-adv-x="848" d="M839 366h-92q39 -69 39 -146q0 -136 -70 -193q-50 -41 -117 -41q-95 0 -136 83h-2q-39 -83 -135 -83q-76 0 -120 43q-67 62 -67 184q0 86 45 152q-41 -4 -61 -30t-32 -70l-85 38q26 81 64 119.5t105 38.5h664v-95zM521 307v-81q0 -75 22 -110t56 -35q62 0 62 133 q0 98 -62 152h-273q-62 -54 -62 -152q0 -57 16 -95t46 -38q75 0 75 145v62l107 29z" />
+<glyph unicode="&#x1d790;" horiz-adv-x="690" d="M665 0h-130l-26 162h-248l-106 -162h-130l478 690h28zM493 264l-32 204l-134 -204h166z" />
+<glyph unicode="&#x1d791;" horiz-adv-x="706" d="M228 676h237q206 0 206 -125q0 -53 -35 -102t-101 -76l1 -4q92 -49 92 -128q0 -100 -90 -170.5t-218 -70.5h-260zM290 413h72q88 0 128 32.5t40 79.5q0 49 -86 49h-113zM213 102h103q86 0 128.5 37t42.5 93q0 41 -42 60t-105 19h-75z" />
+<glyph unicode="&#x1d792;" horiz-adv-x="602" d="M705 676l-13 -102h-359l-143 -574h-130l168 676h477z" />
+<glyph unicode="&#x1d793;" horiz-adv-x="720" d="M680 0h-640l478 690h28zM533 102l-57 366l-239 -366h296z" />
+<glyph unicode="&#x1d794;" horiz-adv-x="683" d="M708 676l-25 -102h-350l-42 -167h241l-26 -103h-241l-50 -202h387l-52 -102h-490l168 676h480z" />
+<glyph unicode="&#x1d795;" horiz-adv-x="707" d="M769 676l-4 -16l-513 -558h396l-40 -102h-583l3 16l512 558h-334l38 102h525z" />
+<glyph unicode="&#x1d796;" horiz-adv-x="748" d="M783 676l-168 -676h-130l74 297h-295l-74 -297h-130l168 676h130l-69 -277h295l69 277h130z" />
+<glyph unicode="&#x1d797;" horiz-adv-x="847" d="M600 398l-12 -102h-282l38 102h256zM822 434q0 -95 -38.5 -180.5t-102 -144.5t-145.5 -93.5t-167 -34.5q-128 0 -203.5 70t-75.5 188q0 95 39.5 180t103 144t145.5 93.5t167 34.5q127 0 202 -70t75 -187zM684 425q0 77 -42 120.5t-123 43.5q-119 0 -205 -98.5t-86 -243.5 q0 -77 42.5 -120.5t123.5 -43.5q122 0 206 102t84 240z" />
+<glyph unicode="&#x1d798;" horiz-adv-x="435" d="M505 676l-16 -102h-90l-118 -472h90l-34 -102h-287l11 102h90l118 472h-90l39 102h287z" />
+<glyph unicode="&#x1d799;" horiz-adv-x="712" d="M796 676l-3 -14l-388 -278l282 -384h-170l-220 306l-40 -29l-69 -277h-128l168 676h128l-66 -263l361 263h145z" />
+<glyph unicode="&#x1d79a;" horiz-adv-x="686" d="M646 0h-130l-67 468l-299 -468h-130l471 690h28z" />
+<glyph unicode="&#x1d79b;" horiz-adv-x="933" d="M981 676l-168 -676h-128l116 467l-351 -467h-27l-119 467l-116 -467h-128l168 676h161l104 -440h3l324 440h161z" />
+<glyph unicode="&#x1d79c;" horiz-adv-x="744" d="M792 676l-173 -694l-100 20l-206 500l-125 -502h-128l168 676h157l173 -424l106 424h128z" />
+<glyph unicode="&#x1d79d;" horiz-adv-x="690" d="M737 676l-10 -112h-524l36 112h498zM602 411l-25 -122h-366l25 122h366zM630 122l-37 -122h-546l13 122h570z" />
+<glyph unicode="&#x1d79e;" horiz-adv-x="849" d="M824 434q0 -42 -13 -97q-40 -157 -163.5 -256t-278.5 -99q-128 0 -203.5 70t-75.5 187q0 126 66.5 231.5t170.5 163.5t218 58q128 0 203.5 -70.5t75.5 -187.5zM685 425q0 77 -42 121t-123 44q-120 0 -205.5 -98.5t-85.5 -244.5q0 -77 42 -120t123 -43q103 0 176.5 68.5 t102.5 184.5q12 48 12 88z" />
+<glyph unicode="&#x1d79f;" horiz-adv-x="745" d="M783 676l-168 -676h-130l143 574h-295l-143 -574h-130l168 676h555z" />
+<glyph unicode="&#x1d7a0;" horiz-adv-x="581" d="M228 676h209q238 0 238 -144q0 -110 -90.5 -182t-222.5 -72h-103l-69 -278h-130zM284 380h71q89 0 137 32t48 92q0 70 -142 70h-65z" />
+<glyph unicode="&#x1d7a1;" horiz-adv-x="847" d="M822 434q0 -95 -38.5 -180.5t-102 -144.5t-145.5 -93.5t-167 -34.5q-128 0 -203.5 70t-75.5 188q0 95 39.5 180t103 144t145.5 93.5t167 34.5q127 0 202 -70t75 -187zM257 398h426q1 10 1 27q0 77 -42 120.5t-123 43.5q-84 0 -155 -52t-107 -139zM662 296h-431 q-3 -24 -3 -49q0 -77 42.5 -120.5t123.5 -43.5q91 0 163 59.5t105 153.5z" />
+<glyph unicode="&#x1d7a2;" horiz-adv-x="696" d="M748 676l-25 -102h-330l148 -226l-271 -246h377l-40 -102h-586l3 16l364 330l-206 314l4 16h562z" />
+<glyph unicode="&#x1d7a3;" horiz-adv-x="641" d="M715 676l-15 -102h-240l-143 -574h-130l143 574h-243l39 102h589z" />
+<glyph unicode="&#x1d7a4;" horiz-adv-x="671" d="M799 675l-58 -98q-33 12 -49 12q-17 0 -32 -3.5t-43.5 -20.5t-56.5 -47.5t-67.5 -91t-80.5 -144.5l-70 -282h-130l70 282q0 157 -28 227q-31 80 -100 80q-13 0 -55 -11l-8 97q54 16 92 16q18 0 40 -4.5t50.5 -20t51.5 -39t40 -66t19 -96.5q0 -20 -1 -32q39 76 89.5 131 t98 80.5t83 36t61.5 10.5q39 0 84 -16z" />
+<glyph unicode="&#x1d7a5;" horiz-adv-x="835" d="M603 676l-25 -102q108 -3 182.5 -52t74.5 -134q0 -66 -35.5 -122t-91.5 -90.5t-120.5 -54.5t-128.5 -22l-24 -99h-130l24 99q-109 3 -183 52.5t-74 136.5q0 67 35 122t90.5 89.5t120.5 53.5t130 21l25 102h130zM551 472l-67 -271q103 6 157 57t54 110q0 42 -34.5 71 t-109.5 33zM356 201l67 271q-107 -6 -158.5 -55t-51.5 -110q0 -43 34 -72t109 -34z" />
+<glyph unicode="&#x1d7a6;" horiz-adv-x="740" d="M833 676l-325 -333l172 -343h-154l-120 239l-232 -239h-154l334 343l-165 333h154l113 -228l223 228h154z" />
+<glyph unicode="&#x1d7a7;" horiz-adv-x="791" d="M901 691l-57 -102q-53 -9 -80 -121q-23 -93 -109 -148t-185 -61l-64 -259h-130l64 259q-81 5 -138 49t-57 117q0 16 9 55t9 60q0 42 -33 49l-5 102h39q131 0 131 -127q0 -14 -8 -54t-8 -62q0 -36 22.5 -58.5t64.5 -27.5l78 314h130l-78 -314q53 6 91 37.5t50 79.5 q28 112 88.5 162t136.5 50h39z" />
+<glyph unicode="&#x1d7a8;" horiz-adv-x="816" d="M259 102l3 29q-54 15 -94.5 65.5t-40.5 124.5q0 61 30.5 125.5t84 119.5t134.5 90t172 35q129 0 198.5 -67t69.5 -167q0 -65 -26.5 -124t-67 -99t-84.5 -66.5t-84 -36.5l-11 -29h202l-40 -102h-295l62 207q85 20 151 81.5t66 160.5q0 65 -45.5 102.5t-121.5 37.5 q-107 0 -185 -77.5t-78 -165.5q0 -105 123 -140l-40 -206h-295l10 102h202z" />
+<glyph unicode="&#x1d7a9;" horiz-adv-x="780" d="M760 664l-453 -694h-28l-159 694h640zM565 560h-294l70 -361z" />
+<glyph unicode="&#x1d7aa;" horiz-adv-x="678" d="M703 462l-177 -246q0 -2 1.5 -19.5t3 -25t4.5 -24.5t8.5 -26t13.5 -19.5t20 -15.5t28 -5l-4 -16l-55 -79q-22 0 -33.5 0.5t-31 5.5t-30.5 14t-21 27t-13 44h-2q-27 -27 -47.5 -43.5t-62 -32t-92.5 -15.5q-77 0 -121.5 47t-44.5 124q0 50 22.5 105t60.5 102t97 78t125 31 q117 0 157 -97l65 86h129zM399 261q0 56 -20.5 87t-55.5 31q-59 0 -104 -64.5t-45 -139.5q0 -43 19.5 -68.5t56.5 -25.5q75 0 145 128q4 25 4 52z" />
+<glyph unicode="&#x1d7ab;" horiz-adv-x="552" d="M25 -117l132 527q71 282 288 282q57 0 96.5 -32t39.5 -86q0 -53 -30.5 -95t-75.5 -63l2 -1q37 -9 57 -42t20 -77q0 -24 -6 -48q-29 -113 -105.5 -187.5t-174.5 -74.5q-54 0 -88 38l-33 -135q-15 -61 -41 -94h-118q24 37 37 88zM307 375l62 79q41 0 66.5 26.5t25.5 70.5 q0 46 -47 46q-91 0 -129 -155l-73 -292q13 -38 28.5 -53.5t46.5 -15.5q40 0 90.5 60.5t50.5 146.5q0 46 -30 58.5t-95 12.5z" />
+<glyph unicode="&#x1d7ac;" horiz-adv-x="525" d="M571 462l-276 -411l-61 -245l-16 -10l-101 24q38 119 65 227q19 78 19 145q0 15 -0.5 29.5t-7 46t-17.5 53.5t-35 40t-57 18l4 16l69 78q64 0 102.5 -65t38.5 -147q0 -24 -5 -52h2l146 253h130z" />
+<glyph unicode="&#x1d7ad;" horiz-adv-x="507" d="M547 618l-74 -79h-17q-14 18 -23.5 27.5t-29 20t-40.5 10.5q-22 0 -44.5 -14t-22.5 -39q0 -33 72 -73q64 -35 97.5 -78t33.5 -107q0 -33 -10.5 -72t-34.5 -79.5t-57 -73.5t-83 -54t-108 -21q-89 0 -132.5 48.5t-43.5 119.5q0 91 54.5 166t142.5 108q-54 36 -54 90 q0 57 35 98t83 58.5t100 17.5q57 0 96 -15.5t60 -58.5zM371 266q0 61 -56 88q-62 -3 -111 -56.5t-49 -126.5q0 -39 19.5 -64.5t54.5 -25.5q64 0 103 60t39 125z" />
+<glyph unicode="&#x1d7ae;" horiz-adv-x="504" d="M508 383l-69 -61h-16q-14 35 -32 45.5t-57 10.5q-35 0 -65 -12.5t-30 -42.5t63 -30h68l-24 -95h-78q-43 0 -68 -21q-24 -19 -24 -46q0 -26 23.5 -38t51.5 -12q111 0 159 73l36 -75q-53 -55 -103.5 -74t-131.5 -19q-30 0 -56.5 5t-52.5 16t-41.5 33.5t-15.5 54.5 q0 50 31.5 89.5t80.5 54.5v3q-40 25 -40 69q0 57 57 104q70 58 178 58q64 0 104.5 -18t51.5 -72z" />
+<glyph unicode="&#x1d7af;" horiz-adv-x="480" d="M539 634l-7 -95q-103 -11 -205 -92q-56 -45 -100.5 -122t-44.5 -150q0 -94 99 -94h56q49 0 86 -23t37 -71q0 -82 -65 -137t-147 -55q-53 0 -70 21l24 98h16q21 -24 55 -24q86 0 86 60q0 36 -69 36h-90q-151 0 -151 144q0 95 57 198t149 173l1 3q-41 32 -41 77 q0 22 12 54.5t36 56.5h16l72 -17q-30 -41 -30 -70q0 -26 22 -37q61 31 93 43t86 23h17z" />
+<glyph unicode="&#x1d7b0;" horiz-adv-x="532" d="M255 411h3q76 62 148 62q119 0 119 -99q0 -26 -7 -53l-109 -437q-8 -32 -8 -56q0 -20 4 -33h-127q-2 6 -2 19q0 20 14 76l105 419q3 13 3 25q0 44 -51 44q-24 0 -57 -21t-59 -64l-73 -293h-120l87 349q6 23 6 52q0 21 -4 37l109 35h9q11 -18 11 -51q0 -5 -1 -11z" />
+<glyph unicode="&#x1d7b1;" horiz-adv-x="560" d="M553 471q0 -71 -25.5 -155t-68.5 -158t-107 -123t-132 -49q-77 0 -116 62.5t-39 159.5q0 99 41.5 209.5t120.5 192.5t169 82q78 0 117.5 -62t39.5 -159zM218 388h204q12 48 12 93q0 51 -16 83.5t-46 32.5q-48 0 -90.5 -62t-63.5 -147zM399 293h-204q-14 -58 -14 -101 q0 -51 16.5 -81t46.5 -30q45 0 89 62t66 150z" />
+<glyph unicode="&#x1d7b2;" horiz-adv-x="325" d="M302 108l-39 -100q-44 -22 -95 -22q-112 0 -112 93q0 15 5 37l86 346h120l-74 -299q-6 -25 -6 -41q0 -41 39 -41q29 0 60 27h16z" />
+<glyph unicode="&#x1d7b3;" horiz-adv-x="537" d="M582 395l-4 -16q-56 -5 -103.5 -22.5t-72.5 -34.5t-76 -55l169 -267h-155l-117 187l-24 -20l-41 -167h-120l114 462h120l-40 -163h2q182 159 329 174z" />
+<glyph unicode="&#x1d7b4;" horiz-adv-x="574" d="M540 81l-4 -16l-66 -79q-59 0 -94 36t-35 139v137l-192 -298h-131l320 459q0 83 -32 110.5t-91 27.5l4 16l70 79q68 0 106.5 -48t44.5 -166l12 -256q4 -79 22 -110t66 -31z" />
+<glyph unicode="&#x1d7b5;" horiz-adv-x="594" d="M569 462l-76 -307q-5 -22 -5 -35q0 -39 49 -39l-4 -16l-55 -79q-112 0 -119 70h-2q-24 -34 -56 -52t-61 -18q-26 0 -40.5 4.5t-24.5 19.5h-2l-30 -121q-15 -61 -41 -94h-114q25 42 37 88l144 579h120l-77 -313q-3 -13 -3 -24q0 -44 52 -44q29 0 59.5 21t54.5 62l74 298 h120z" />
+<glyph unicode="&#x1d7b6;" horiz-adv-x="525" d="M441 454l121 19q3 -11 3 -24q0 -73 -42.5 -155t-109.5 -150t-160 -113t-186 -45h-26l118 476h120l-82 -332h2q94 28 165.5 113.5t71.5 179.5q0 7 -2 21z" />
+<glyph unicode="&#x1d7b7;" horiz-adv-x="481" d="M525 631l-15 -92q-75 0 -133 -24.5t-58 -65.5q0 -22 27 -31q65 21 163 21l7 -5l-31 -90q-78 0 -148.5 -23.5t-116.5 -68.5t-46 -101q0 -70 103 -70h61q49 0 86 -23t37 -71q0 -82 -65 -137t-147 -55q-53 0 -70 21l24 98h16q21 -24 55 -24q86 0 86 60q0 36 -69 36h-89 q-71 0 -115 37t-44 100q0 73 53.5 142t141.5 109v3q-41 22 -41 61q0 30 19 61.5t52 54.5q-30 25 -30 52q0 45 41 86h16l73 -17q-24 -24 -24 -42t20 -31q91 32 151 32z" />
+<glyph unicode="&#x1d7b8;" horiz-adv-x="543" d="M515 298q0 -127 -92 -219.5t-204 -92.5q-78 0 -126 48t-48 127q0 131 93 221.5t206 90.5q78 0 124.5 -48t46.5 -127zM390 295q0 83 -76 83q-59 0 -100.5 -65.5t-41.5 -142.5q0 -89 71 -89q40 0 71 27t46 65.5t22.5 70t7.5 51.5z" />
+<glyph unicode="&#x1d7b9;" horiz-adv-x="632" d="M656 462l-23 -95h-99q-64 -164 -64 -225q0 -27 17.5 -41t59.5 -20l-5 -17l-59 -78q-30 0 -52 3.5t-46 14t-37 33t-13 56.5q0 30 27.5 120t51.5 154h-76l-22 -85q-8 -30 -21.5 -72t-24.5 -65t-28 -52t-35 -44.5t-42.5 -31t-54 -22.5t-65.5 -9l11 95q28 7 39 10.5 t27.5 15.5t23.5 25.5t19.5 46t22.5 70.5l27 106q-15 0 -39 -19.5t-42 -54.5l-75 38q81 143 224 143h373z" />
+<glyph unicode="&#x1d7ba;" horiz-adv-x="560" d="M4 -117l61 242q24 96 45 148.5t63 103.5q78 96 206 96q73 0 115 -43t42 -115q0 -32 -9 -68q-29 -118 -105 -189.5t-174 -71.5q-52 0 -88 41l-34 -138q-15 -61 -41 -94h-118q24 37 37 88zM409 304q0 74 -63 74q-69 0 -113 -92q-16 -32 -42 -136q13 -38 28.5 -53.5 t46.5 -15.5q60 0 101.5 74t41.5 149z" />
+<glyph unicode="&#x1d7bb;" horiz-adv-x="517" d="M554 368l-86 -57h-17q-1 67 -78 67q-85 0 -137.5 -66t-52.5 -145q0 -45 28.5 -65.5t71.5 -20.5h56q49 0 86 -23t37 -71q0 -82 -65 -137t-147 -55q-53 0 -70 21l24 98h16q21 -24 55 -24q86 0 86 60q0 36 -69 36h-80q-72 0 -116 42.5t-44 112.5q0 89 52 167t131.5 121.5 t162.5 43.5q62 0 108.5 -26.5t47.5 -78.5z" />
+<glyph unicode="&#x1d7bc;" horiz-adv-x="614" d="M639 462l-23 -95h-165l-1 -2q52 -52 52 -123q0 -24 -5 -42q-12 -44 -46 -91t-96.5 -85t-133.5 -38q-79 0 -127.5 47.5t-48.5 125.5q0 73 31 133.5t78 96t95.5 54.5t88.5 19h301zM380 251q0 75 -69 116q-55 0 -97 -58.5t-42 -139.5q0 -41 18.5 -64.5t54.5 -23.5 q33 0 60.5 20t43 48.5t23.5 55.5t8 46z" />
+<glyph unicode="&#x1d7bd;" horiz-adv-x="523" d="M547 462l-23 -95h-153q-36 -96 -56 -175q-6 -24 -6 -42q0 -31 20 -46.5t66 -22.5l-5 -17l-59 -78q-31 0 -54 4t-49 14.5t-40.5 34t-14.5 58.5q0 25 7 53q17 73 75 217q-85 0 -137 -101l-76 38q46 81 93.5 119.5t114.5 38.5h297z" />
+<glyph unicode="&#x1d7be;" horiz-adv-x="550" d="M311 378l23 95q86 0 139 -42t53 -125q0 -131 -91.5 -225.5t-205.5 -94.5q-83 0 -125.5 34.5t-42.5 97.5q0 25 8 59l36 147q14 58 14 84q0 20 -6 29l111 36h16q8 -20 8 -45q0 -15 -4 -28l-48 -193q-7 -30 -7 -51q0 -75 66 -75q62 0 103 70.5t41 140.5q0 86 -88 86z" />
+<glyph unicode="&#x1d7bf;" horiz-adv-x="683" d="M262 81l25 102q11 45 19 72t22 66t30.5 62t40 46t55.5 33.5t72 10.5q53 0 93 -44.5t40 -122.5q0 -53 -18.5 -107.5t-54 -103t-95.5 -79t-134 -30.5l-48 -191h-120l48 191q-94 0 -138 45.5t-44 119.5q0 83 57 182t141 128l55 -58l-3 -12q-49 -23 -76 -69t-37 -89 q-10 -39 -10 -69q0 -83 80 -83zM412 212l-32 -131q108 0 145 150q17 66 17 100q0 47 -39 47q-22 0 -40 -25t-28 -56t-23 -85z" />
+<glyph unicode="&#x1d7c0;" horiz-adv-x="575" d="M626 462l-299 -341q-8 -40 -8 -76q0 -144 111 -155l-4 -16l-68 -79q-52 0 -85.5 35.5t-44.5 79.5t-11 94v4l-160 -203h-137l292 334q9 42 9 86q0 146 -122 154l4 16l69 78q78 0 114.5 -60t36.5 -155v-4l165 208h138z" />
+<glyph unicode="&#x1d7c1;" horiz-adv-x="703" d="M751 473l-45 -94q-54 -17 -87 -152q-26 -105 -89 -166t-177 -75l-48 -191h-120l48 191q-158 20 -158 155q0 31 13.5 99t13.5 83q0 46 -25 56v94q73 0 113.5 -38.5t40.5 -102.5q0 -30 -15 -100.5t-15 -83.5q0 -30 13 -45t43 -22l94 381h120l-94 -381q53 13 78 50.5 t51 144.5q21 86 89 141.5t156 55.5z" />
+<glyph unicode="&#x1d7c2;" horiz-adv-x="756" d="M537 410l93 51q50 -15 76 -61.5t26 -107.5q0 -36 -9 -72q-29 -115 -96.5 -174.5t-148.5 -59.5q-44 0 -76 22t-39 61h-2q-26 -39 -69 -61t-87 -22q-66 0 -103.5 37t-37.5 108q0 61 26.5 129.5t79 125.5t117.5 75l71 -51l-4 -16q-57 -20 -96 -67.5t-54 -95t-15 -92.5 q0 -58 40 -58q74 0 111 145l23 92l114 29l11 -10l-28 -111q-11 -46 -11 -73q0 -72 53 -72q39 0 71 61.5t32 131.5q0 90 -72 120z" />
+<glyph unicode="&#x1d7c3;" horiz-adv-x="548" d="M227 608l51 83q261 -15 261 -260q0 -74 -20.5 -150t-58 -143t-101 -109.5t-140.5 -42.5q-79 0 -126.5 47.5t-47.5 126.5q0 126 91 219.5t202 93.5q49 0 82 -33l4 2q-17 152 -184 154zM390 295q0 83 -76 83q-59 0 -100.5 -65.5t-41.5 -142.5q0 -89 71 -89q40 0 71 27 t46 65.5t22.5 70t7.5 51.5z" />
+<glyph unicode="&#x1d7c4;" horiz-adv-x="468" d="M470 443l-31 -124h-16q-9 27 -28.5 41t-33.5 16t-36 2q-35 0 -71.5 -22.5t-55.5 -65.5h149l-24 -95h-150q-2 -14 -2 -19q0 -40 24 -64t65 -24q71 0 123 57l50 -65q-60 -56 -104 -75t-114 -19q-78 0 -124 46t-46 122q0 90 47.5 165t116 114.5t138.5 39.5q88 0 123 -30z " />
+<glyph unicode="&#x1d7c5;" horiz-adv-x="579" d="M579 380l-23 -95q-19 0 -42 5l-8 -31q-34 -130 -111 -201.5t-175 -71.5q-82 0 -124 34t-42 97q0 25 8 60q28 117 28 139q0 18 -6 29l110 36h16q8 -18 8 -45q0 -14 -29 -129q-7 -31 -7 -53q0 -73 64 -73q90 0 134 172q11 44 16 68q-170 60 -170 185q0 87 53 136.5 t120 49.5t103.5 -50t36.5 -150q0 -52 -8 -103q21 -6 48 -9zM430 507q0 90 -56 90q-18 0 -34.5 -17.5t-16.5 -44.5q0 -31 26 -62t72 -42q9 43 9 76z" />
+<glyph unicode="&#x1d7c6;" horiz-adv-x="646" d="M665 462l-184 -166q2 -112 18 -150t76 -61l-4 -16l-56 -79q-38 4 -64 26t-38 58t-17 66.5t-7 71.5l-234 -212h-165l182 166q-2 113 -17.5 151t-75.5 62l4 16l56 78q38 -5 63.5 -27t38 -59t17 -67.5t6.5 -71.5l235 214h166z" />
+<glyph unicode="&#x1d7c7;" horiz-adv-x="678" d="M526 692l-55 -219q96 0 139.5 -43.5t43.5 -117.5q0 -81 -34 -154t-105 -122.5t-165 -49.5l-48 -191h-120l48 191q-93 0 -137.5 44.5t-44.5 118.5q0 60 19.5 116.5t55.5 103.5t95.5 75.5t132.5 28.5l55 219h120zM447 378l-74 -297q108 0 145 150q8 31 8 61q0 86 -79 86z M255 81l74 297q-48 0 -87.5 -36t-57.5 -111q-10 -39 -10 -69q0 -81 81 -81z" />
+<glyph unicode="&#x1d7c8;" horiz-adv-x="544" d="M232 -205h-17q-1 12 -13.5 21t-30 16t-43 25.5t-46.5 45.5q-44 57 -44 152q0 99 36 193t110.5 159.5t169.5 65.5q77 0 121.5 -47t44.5 -125q0 -129 -89.5 -222t-201.5 -93q-49 0 -82 33l-3 -2q3 -27 22.5 -46t44.5 -29l50 -22q25 -10 42 -28t17 -45q0 -15 -4 -28z M396 299q0 79 -72 79q-59 0 -100.5 -72t-41.5 -145q0 -80 71 -80q40 0 70.5 28t45 68t21 71.5t6.5 50.5z" />
+<glyph unicode="&#x1d7c9;" horiz-adv-x="889" d="M912 462l-23 -95h-92q11 -36 11 -75q0 -58 -25 -122t-59 -103q-71 -81 -170 -81q-94 0 -115 83h-2q-59 -83 -156 -83q-66 0 -103.5 37t-37.5 108q0 56 23.5 121t70.5 114q-42 -4 -68.5 -30t-49.5 -70l-76 38q46 81 93.5 119.5t114.5 38.5h664zM556 308l-20 -81 q-11 -47 -11 -74q0 -72 53 -72q39 0 71.5 61.5t32.5 131.5q0 57 -33 93h-273q-55 -39 -82.5 -102t-27.5 -121q0 -63 39 -63q34 0 63.5 35t47.5 111l15 62l115 29z" />
+<glyph unicode="&#x1d7ce;" horiz-adv-x="500" d="M476 337q0 -157 -63 -253.5t-162 -96.5t-163 96t-64 251q0 51 7 99.5t24.5 95.5t43 81.5t65.5 56t89 21.5q75 0 127.5 -54.5t74 -131t21.5 -165.5zM318 224v225q0 111 -16 161t-53 50t-52 -48.5t-15 -162.5v-225q0 -112 16 -160.5t53 -48.5t52 48t15 161z" />
+<glyph unicode="&#x1d7cf;" horiz-adv-x="500" d="M441 0h-373v24q74 1 96 20.5t22 84.5v378q0 70 -36 70q-24 0 -65 -16l-20 -8v26l251 109h18v-570q0 -57 19.5 -75t87.5 -19v-24z" />
+<glyph unicode="&#x1d7d0;" horiz-adv-x="500" d="M478 211l-46 -211h-415v23q109 116 151.5 166.5t80.5 109.5q51 78 51 148q0 54 -31 90.5t-88 36.5q-77 0 -122 -90h-28q68 204 223 204q82 0 132 -49.5t50 -133.5q0 -110 -114 -218l-162 -154h140q81 0 107.5 13t45.5 65h25z" />
+<glyph unicode="&#x1d7d1;" horiz-adv-x="500" d="M58 524l-21 12q79 152 229 152q74 0 119 -40.5t45 -96.5q0 -38 -20.5 -73t-63.5 -54q57 -20 89.5 -68.5t32.5 -109.5q0 -110 -85.5 -185t-214.5 -75q-69 0 -110.5 24.5t-41.5 65.5q0 26 18.5 43t46.5 17q45 0 96 -57q39 -43 79 -43q45 0 71.5 34t26.5 88q0 75 -49 121 q-26 24 -56 39t-97 38v17q70 22 100.5 54t30.5 77q0 103 -99 103q-40 0 -69 -18.5t-57 -64.5z" />
+<glyph unicode="&#x1d7d2;" horiz-adv-x="500" d="M476 144h-64v-144h-145v144h-248v113l313 431h80v-433h64v-111zM268 255v294l-208 -294h208z" />
+<glyph unicode="&#x1d7d3;" horiz-adv-x="500" d="M470 676l-45 -127h-276l-22 -81q104 -6 151 -20q82 -23 127.5 -79.5t45.5 -134.5q0 -109 -78.5 -175.5t-203.5 -66.5q-65 0 -106 26t-41 62q0 26 17.5 43.5t43.5 17.5q46 0 100 -46q49 -42 90 -42q42 0 71 29.5t29 74.5q0 51 -36.5 90.5t-105.5 61.5q-49 15 -180 22 l97 345h322z" />
+<glyph unicode="&#x1d7d4;" horiz-adv-x="500" d="M470 688v-26q-109 -22 -173 -85t-93 -173q39 17 84 17q85 0 136 -54t51 -145q0 -105 -59 -170t-156 -65q-106 0 -169 77.5t-63 209.5q0 175 139 297q61 53 118.5 73.5t184.5 43.5zM323 165q0 117 -20 164t-69 47q-25 0 -37 -10q-13 -11 -13 -121q0 -150 27 -202 q15 -29 51 -29q35 0 48 31t13 120z" />
+<glyph unicode="&#x1d7d5;" horiz-adv-x="500" d="M477 676l-235 -676h-95l200 539h-199q-47 0 -68.5 -18t-36.5 -67h-26l45 222h415z" />
+<glyph unicode="&#x1d7d6;" horiz-adv-x="500" d="M472 187q0 -91 -62 -145.5t-170 -54.5q-96 0 -154 45.5t-58 124.5q0 132 149 168q-74 44 -106 87.5t-32 100.5q0 80 60.5 127.5t163.5 47.5q91 0 143 -41.5t52 -103.5q0 -98 -136 -140q84 -57 117 -105t33 -111zM339 537q0 53 -23.5 87.5t-64.5 34.5q-35 0 -59 -24 t-24 -59q0 -87 130 -154q25 33 33 56t8 59zM333 127q0 55 -25.5 89.5t-107.5 89.5q-51 -75 -51 -145q0 -68 24 -105t69 -37q42 0 66.5 28t24.5 80z" />
+<glyph unicode="&#x1d7d7;" horiz-adv-x="500" d="M31 -13v26q107 22 171.5 85t96.5 175q-37 -19 -88 -19q-83 0 -134 55.5t-51 149.5q0 97 61 163t154 66q105 0 168.5 -80t63.5 -214q0 -183 -145 -297q-67 -53 -126.5 -75t-170.5 -35zM317 461q0 117 -25 167q-17 33 -54 33q-34 0 -47 -30.5t-13 -117.5q0 -116 19.5 -165 t65.5 -49q28 0 41 9q4 2 5 20q8 31 8 86v47z" />
+<glyph unicode="&#x1d7d8;" horiz-adv-x="540" d="M512 331q0 -50 -7 -96t-24.5 -92.5t-44 -80.5t-69.5 -55t-97 -21t-97 21t-69.5 55t-44 80.5t-24.5 92.5t-7 96t7 96t24.5 92.5t44 80.5t69.5 55t97 21t97 -21t69.5 -55t44 -80.5t24.5 -92.5t7 -96zM408 561v-460q30 26 45 99t15 131q0 59 -14.5 131.5t-45.5 98.5zM364 67 v528q-31 37 -94 37q-25 0 -52.5 -10t-41.5 -27v-528q39 -37 94 -37t94 37zM132 101v460q-30 -26 -45 -99t-15 -131t15 -131t45 -99z" />
+<glyph unicode="&#x1d7d9;" horiz-adv-x="540" d="M355 0h-148v573l-103 -46l-13 42l264 124v-693zM311 44v584l-60 -29v-555h60z" />
+<glyph unicode="&#x1d7da;" horiz-adv-x="547" d="M514 148l-51 -148h-415v29v21l271 262v307q-14 13 -60 13q-144 0 -166 -154h-42q0 87 59.5 142.5t147.5 55.5q85 0 147 -51.5t62 -135.5q0 -61 -26 -104t-81 -95l-150 -142h304zM363 602v-243q60 51 60 131q0 70 -60 112zM452 104h-288l-65 -60h329z" />
+<glyph unicode="&#x1d7db;" horiz-adv-x="540" d="M356 353v-2q57 -22 89.5 -66t32.5 -104q0 -96 -62 -145.5t-161 -49.5q-170 0 -206 139l43 10q10 -29 25 -49q41 -56 136 -56q45 0 77 18v283h-107v44h97v244q-18 13 -50 13q-129 0 -155 -124h-43q7 77 63 122.5t134 45.5t134 -42t56 -117q0 -104 -103 -164zM364 608v-197 q51 37 51 100q0 62 -51 97zM374 295v-236q60 38 60 120q0 85 -60 116z" />
+<glyph unicode="&#x1d7dc;" horiz-adv-x="540" d="M524 160h-87v-160h-148v160h-269v41l362 475h55v-472h87v-22v-22zM393 44v576l-60 -82v-494h60zM289 204v278l-216 -278h216z" />
+<glyph unicode="&#x1d7dd;" horiz-adv-x="540" d="M489 662l-47 -148h-268l-29 -72q63 0 115.5 -10.5t99.5 -35.5t74 -72t27 -113q0 -101 -61 -163t-162 -62q-74 0 -130 31t-73 97l40 18q39 -102 164 -102q45 0 74 19v316q-66 32 -190 32h-43l109 265h300zM427 618h-210l-25 -60h215zM357 339v-272q29 20 44.5 60.5 t15.5 81.5q0 100 -60 130z" />
+<glyph unicode="&#x1d7de;" horiz-adv-x="540" d="M176 392h2q44 44 123 44q95 0 153 -62t58 -157q0 -103 -68 -167t-172 -64q-54 0 -103 26q-73 39 -107 119t-34 173q0 149 101 255q69 72 146 94.5t195 22.5v-45q-59 0 -95 -2.5t-84.5 -18t-83.5 -44.5q-31 -27 -31 -37v-137zM408 354v-277q60 47 60 142q0 90 -60 135z M364 68v301q-27 23 -74 23q-31 0 -62.5 -14.5t-51.5 -38.5v-271q14 -18 41 -28t53 -10q66 0 94 38zM132 103v393q-30 -32 -45 -88t-15 -110q0 -126 60 -195z" />
+<glyph unicode="&#x1d7df;" horiz-adv-x="540" d="M511 662l-27 -70l-257 -592h-18h-30l222 514h-319h-58l55 148h39h393zM447 618h-338l-20 -60h333z" />
+<glyph unicode="&#x1d7e0;" horiz-adv-x="540" d="M390 353v-2q57 -23 89.5 -66.5t32.5 -103.5q0 -69 -35.5 -114.5t-88 -63t-120.5 -17.5q-105 0 -172.5 47t-67.5 148q0 60 32.5 103.5t89.5 66.5v2q-103 60 -103 164q0 44 20 76t53.5 49.5t71 25.5t78.5 8t78.5 -8t71 -25.5t53.5 -49.5t20 -76q0 -104 -103 -164zM398 608 v-197q51 39 51 100q0 63 -51 97zM354 398v218q-29 16 -84 16q-49 0 -84 -16v-218q22 -23 82 -23q76 0 86 23zM142 411v197q-51 -34 -51 -97q0 -61 51 -100zM408 295v-236q60 38 60 120q0 85 -60 116zM364 50v254q-26 27 -96 27q-61 0 -92 -27v-254q29 -20 92 -20q65 0 96 20 zM132 59v236q-60 -31 -60 -116q0 -82 60 -120z" />
+<glyph unicode="&#x1d7e1;" horiz-adv-x="540" d="M364 270h-2q-44 -44 -123 -44q-95 0 -153 62t-58 157q0 103 68 167t172 64q61 0 113 -32q68 -41 99.5 -118.5t31.5 -167.5q0 -76 -29 -146.5t-83 -119.5q-55 -51 -144.5 -77.5t-175.5 -26.5v41q139 0 213 41q25 13 71 49v151zM408 559v-393q30 32 45 88t15 110 q0 126 -60 195zM364 321v275q-29 36 -94 36q-66 0 -94 -33v-304q18 -25 74 -25q47 0 114 51zM132 308v277q-60 -46 -60 -142q0 -90 60 -135z" />
+<glyph unicode="&#x1d7e2;" horiz-adv-x="500" d="M477 330q0 -92 -21.5 -166.5t-74.5 -126t-131 -51.5q-62 0 -107.5 31t-70.5 83.5t-37 111t-12 124.5q0 93 23 167.5t77 123.5t131 49q98 0 160.5 -96.5t62.5 -249.5zM398 330q0 122 -40.5 198.5t-105.5 76.5q-74 0 -112 -77.5t-38 -193.5q0 -52 7.5 -98.5t24 -88 t46.5 -66t70 -24.5q51 0 85.5 41t48.5 100.5t14 131.5z" />
+<glyph unicode="&#x1d7e3;" horiz-adv-x="500" d="M302 0h-79v570q-22 -10 -65 -32l-50 -26v73l180 92l14 -5v-672z" />
+<glyph unicode="&#x1d7e4;" horiz-adv-x="500" d="M469 71l-29 -71h-405v21l175 214v-1l56 68l55 68q16 20 31 49.5t15 55.5q0 62 -33.5 96t-91.5 34q-46 0 -84.5 -38t-48.5 -108l-72 17q16 89 75 144.5t137 55.5q87 0 142 -54t55 -131q0 -56 -21 -96.5t-88 -124.5l-160 -199h292z" />
+<glyph unicode="&#x1d7e5;" horiz-adv-x="500" d="M113 492l-71 17q22 78 73 122.5t128 44.5q71 0 119 -45t48 -112q0 -89 -86 -149q56 -20 86.5 -66.5t30.5 -93.5q0 -97 -63 -160q-64 -64 -173 -64q-110 0 -174 70l47 56q51 -55 122 -55q74 0 116 36q46 39 46 98q0 52 -37.5 87t-102.5 44h-64v21l48 51q45 0 85 34.5 t40 83.5q0 42 -26.5 67.5t-64.5 25.5q-40 0 -74.5 -28.5t-52.5 -84.5z" />
+<glyph unicode="&#x1d7e6;" horiz-adv-x="500" d="M489 236l-33 -71h-83v-165h-79v165h-283v68l312 443h50v-440h116zM294 236v274l-194 -274h194z" />
+<glyph unicode="&#x1d7e7;" horiz-adv-x="500" d="M458 676l-32 -71h-177l-64 -127q114 -16 187.5 -80.5t73.5 -171.5q0 -99 -67.5 -169.5t-168.5 -70.5q-110 0 -174 70l47 56q51 -55 122 -55q74 0 118 50.5t44 118.5q0 74 -66 126q-67 55 -207 55l-14 17l116 252h262z" />
+<glyph unicode="&#x1d7e8;" horiz-adv-x="500" d="M448 668l-18 -53q-114 -8 -193.5 -65.5t-114.5 -161.5q59 43 137 43q86 0 148.5 -58t62.5 -153q0 -97 -60.5 -165.5t-152.5 -68.5q-77 0 -129.5 40.5t-74 101t-21.5 136.5q0 85 30 166.5t81 131.5q67 66 128 88.5t176 33.5zM390 207q0 72 -41 112.5t-98 40.5 q-52 0 -91 -30.5t-48 -89.5q0 -81 40 -132t108 -51q55 0 92.5 42.5t37.5 107.5z" />
+<glyph unicode="&#x1d7e9;" horiz-adv-x="500" d="M451 642l-221 -650h-82l206 599h-316l31 71h382v-20z" />
+<glyph unicode="&#x1d7ea;" horiz-adv-x="500" d="M447 161q0 -73 -53 -124t-146 -51q-85 0 -142 48.5t-57 119.5q0 54 28.5 98.5t99.5 92.5q-117 69 -117 169q0 72 55.5 117t140.5 45q73 0 122 -47.5t49 -108.5q0 -56 -26 -93t-90 -74q136 -83 136 -192zM355 515q0 40 -31 65t-80 25q-46 0 -75.5 -26.5t-29.5 -60.5 q0 -43 24.5 -69.5t85.5 -54.5q106 58 106 121zM276 286l-35 19q-52 -18 -82.5 -58.5t-30.5 -83.5q0 -45 32 -75.5t92 -30.5q46 0 81 27.5t35 73.5q0 42 -21 71.5t-71 56.5z" />
+<glyph unicode="&#x1d7eb;" horiz-adv-x="500" d="M55 -2l13 49q114 8 193.5 65.5t114.5 162.5q-58 -44 -137 -44q-86 0 -148.5 58t-62.5 153q0 97 60.5 165.5t153.5 68.5q59 0 103 -22.5t70 -62.5t38.5 -88.5t12.5 -104.5q0 -84 -30.5 -166t-80.5 -131q-67 -65 -126.5 -88t-171.5 -34zM386 422q-1 81 -40.5 132t-106.5 51 q-55 0 -93 -42t-38 -107q0 -72 41 -112.5t98 -40.5q52 0 91 30.5t48 88.5z" />
+<glyph unicode="&#x1d7ec;" horiz-adv-x="500" d="M476 337q0 -155 -64 -252.5t-162 -97.5t-162 97.5t-64 252.5t64 253t162 98t162 -98t64 -253zM351 341q0 252 -101 252t-101 -252q0 -259 101 -259t101 259z" />
+<glyph unicode="&#x1d7ed;" horiz-adv-x="500" d="M334 0h-120v542l-132 -50v90l233 106h19v-688z" />
+<glyph unicode="&#x1d7ee;" horiz-adv-x="500" d="M474 95l-33 -95h-421v23l242 300q69 85 69 167q0 41 -25.5 72t-68.5 31q-37 0 -67 -27t-43 -84h-95q18 95 76 150.5t147 55.5q90 0 143 -55t53 -135q0 -61 -21.5 -106.5t-82.5 -118.5l-147 -178h274z" />
+<glyph unicode="&#x1d7ef;" horiz-adv-x="500" d="M380 375v-2q42 -20 70.5 -61.5t28.5 -92.5q0 -76 -39.5 -130.5t-105.5 -81.5q-51 -20 -126 -20q-121 0 -190 73l58 77q49 -55 139 -55q74 0 110 32q34 31 34 84q0 51 -48 84q-49 33 -146 33v16l59 79q47 0 80 29t33 66q0 43 -25.5 65.5t-67.5 22.5q-35 0 -64 -22.5 t-42 -71.5l-90 31q27 73 82 115.5t132 42.5q79 0 134.5 -47t55.5 -122q0 -40 -19 -81t-53 -63z" />
+<glyph unicode="&#x1d7f0;" horiz-adv-x="500" d="M484 240l-22 -95h-50v-145h-120v145h-273v112l313 431h80v-448h72zM292 240v234l-170 -234h170z" />
+<glyph unicode="&#x1d7f1;" horiz-adv-x="500" d="M483 676l-38 -105h-225l-36 -116q108 -6 169 -40q108 -61 108 -183q0 -73 -36 -131t-95 -88q-52 -26 -126 -26q-122 0 -191 73l58 77q56 -55 136 -55q56 0 92.5 35t36.5 86q0 39 -15.5 63t-53.5 43q-50 26 -191 26l-15 11l93 330h329z" />
+<glyph unicode="&#x1d7f2;" horiz-adv-x="500" d="M159 389l2 -1q47 36 118 36q78 0 137 -55t59 -157q0 -100 -64 -164q-61 -61 -154 -61q-110 0 -170.5 82t-60.5 199q0 169 116 282q69 66 137.5 93.5t182.5 44.5l7 -9l-44 -86q-80 -6 -162.5 -64.5t-103.5 -139.5zM355 201q0 57 -23.5 92.5t-70.5 35.5q-34 0 -65 -21.5 t-50 -64.5q0 -70 29.5 -115.5t83.5 -45.5q49 0 72.5 35t23.5 84z" />
+<glyph unicode="&#x1d7f3;" horiz-adv-x="500" d="M471 676l-235 -676h-116l210 561h-295l23 115h413z" />
+<glyph unicode="&#x1d7f4;" horiz-adv-x="500" d="M472 166q0 -76 -58.5 -127.5t-162.5 -51.5q-94 0 -147 34q-76 47 -76 144q0 118 122 185q-107 65 -107 160q0 77 60.5 127.5t153.5 50.5q85 0 143.5 -46.5t58.5 -117.5q0 -55 -27 -92t-90 -68q74 -50 102 -94.5t28 -103.5zM344 522q0 32 -27 51.5t-70 19.5t-66 -20 t-23 -50q0 -55 99 -99q87 39 87 98zM352 168q0 36 -25.5 63t-89.5 64q-89 -49 -89 -122q0 -31 26 -61t76 -30q41 0 71.5 24.5t30.5 61.5z" />
+<glyph unicode="&#x1d7f5;" horiz-adv-x="500" d="M342 286l-2 1q-47 -36 -118 -36q-78 0 -137 55t-59 157q0 100 64 164q61 61 154 61q110 0 170.5 -82t60.5 -199q0 -169 -116 -282q-70 -67 -140.5 -96t-182.5 -42l-7 9l44 86q81 7 164.5 65t104.5 139zM355 432q0 70 -29.5 115.5t-83.5 45.5q-49 0 -72.5 -35t-23.5 -84 q0 -57 23.5 -92.5t70.5 -35.5q34 0 65 21.5t50 64.5z" />
+<glyph unicode="&#x1d7f6;" horiz-adv-x="525" d="M467 335q0 -143 -60.5 -244.5t-145.5 -101.5t-145.5 101.5t-60.5 244.5t60.5 244.5t145.5 101.5t145.5 -101.5t60.5 -244.5zM409 348q0 112 -43.5 190.5t-104.5 78.5t-104 -78.5t-43 -190.5q0 -122 43 -208.5t104 -86.5t104.5 86.5t43.5 208.5z" />
+<glyph unicode="&#x1d7f7;" horiz-adv-x="525" d="M435 40v-16q0 -10 -7 -17t-17 -7h-271q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h106v473q-47 -54 -112 -54q-10 0 -17 7t-7 17v16q0 10 7 17t17 7q39 0 70.5 32.5t50.5 85.5q5 16 23 16h2q10 0 17 -7t7 -17v-593h107q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d7f8;" horiz-adv-x="525" d="M470 87v-63q0 -10 -7 -17t-17 -7h-370q-10 0 -17 7t-7 17v16q0 12 8 18l190 171q44 39 63.5 58.5t47.5 53t39.5 64.5t11.5 65q0 64 -49.5 105.5t-130.5 41.5q-43 0 -76.5 -29.5t-42.5 -74.5q14 -12 14 -29t-12 -27t-26 -10t-25.5 10t-11.5 27q0 81 57 139t138 58 q98 0 160.5 -60t62.5 -151q0 -35 -11.5 -69t-26 -59t-42 -56t-44.5 -48l-50 -45l-143 -129h259v23q0 10 7 17t17 7h10q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d7f9;" horiz-adv-x="525" d="M196 394l73 5q52 4 87.5 41.5t35.5 89.5q0 33 -35 60t-88 27q-104 0 -132 -52q10 -10 10 -25q0 -18 -11.5 -28t-26.5 -10q-14 0 -25.5 10t-11.5 28q0 69 60.5 105t136.5 36q73 0 127 -43t54 -108q0 -53 -26 -98t-69 -71q56 -22 90 -67.5t34 -102.5q0 -84 -62 -143 t-148 -59q-89 0 -157.5 47t-68.5 128q0 17 11.5 27t25.5 10t26 -10t12 -27t-12 -27q13 -38 57.5 -61t105.5 -23q64 0 108 41t44 97q0 57 -44 97.5t-108 40.5h-71q-10 0 -17 7.5t-7 17.5v16q0 9 6.5 16t15.5 8z" />
+<glyph unicode="&#x1d7fa;" horiz-adv-x="525" d="M493 228v-16q0 -10 -7 -17t-17 -7h-96v-124h77q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-203q-10 0 -17 7t-7 17v16q0 10 7 17t17 7h77v124h-271q-10 0 -17 7t-7 17v34q0 7 4 12l238 412q7 12 21 12h57q10 0 17 -7t7 -17v-406h96q10 0 17 -7t7 -17zM324 252v394 l-228 -394h228z" />
+<glyph unicode="&#x1d7fb;" horiz-adv-x="525" d="M151 606v-219q55 38 130 38q80 0 134.5 -64.5t54.5 -153.5q0 -91 -64.5 -154.5t-156.5 -63.5q-78 0 -137.5 47t-59.5 122q0 17 11.5 27t25.5 10t26 -10t12 -27q0 -16 -12 -28q12 -34 49 -55.5t85 -21.5q68 0 115.5 45.5t47.5 108.5q0 65 -39 109.5t-92 44.5 q-91 0 -131 -59q-8 -11 -20 -11h-16q-10 0 -17 7t-7 17q0 7 3 12v319q0 10 7 17t17 7h294q10 0 17 -7t7 -17v-16q0 -10 -7 -17t-17 -7h-260z" />
+<glyph unicode="&#x1d7fc;" horiz-adv-x="525" d="M464 213q0 -92 -59 -158t-144 -66q-100 0 -151.5 94t-51.5 252q0 141 75 243.5t186 102.5q56 0 95 -25.5t39 -78.5q0 -18 -11.5 -28t-25.5 -10t-25.5 10t-11.5 28q0 13 7 22q-16 18 -67 18q-76 0 -135.5 -73t-66.5 -183q62 77 164 77q78 0 130.5 -67t52.5 -158zM124 240 l2 -24q15 -82 50.5 -122.5t84.5 -40.5q59 0 102 46.5t43 113.5q0 68 -41.5 114.5t-97.5 46.5q-59 0 -101 -39.5t-42 -94.5z" />
+<glyph unicode="&#x1d7fd;" horiz-adv-x="525" d="M479 646v-16q0 -11 -7 -17q-116 -120 -178 -274.5t-62 -320.5q0 -13 -9 -21t-20 -8t-20 8t-9 21q0 163 57 314.5t164 273.5h-294v-23q0 -11 -7 -18t-17 -7h-10q-10 0 -17 7.5t-7 17.5v79q0 10 7 17t17 7h10q18 0 23 -16h355q10 0 17 -7t7 -17z" />
+<glyph unicode="&#x1d7fe;" horiz-adv-x="525" d="M479 191q0 -83 -63.5 -142.5t-154.5 -59.5q-90 0 -154 59.5t-64 142.5q0 58 40 104.5t103 66.5q-57 18 -92.5 56.5t-35.5 86.5q0 73 59.5 124.5t143.5 51.5t143.5 -51.5t59.5 -124.5q0 -48 -35.5 -86.5t-92.5 -56.5q64 -20 103.5 -66.5t39.5 -104.5zM406 505 q0 46 -42.5 79t-102.5 33t-102 -32.5t-42 -79.5q0 -46 42 -78.5t102 -32.5t102.5 32.5t42.5 78.5zM421 191q0 58 -47 98.5t-113 40.5t-113 -40.5t-47 -98.5q0 -57 47 -97.5t113 -40.5t113 40.5t47 97.5z" />
+<glyph unicode="&#x1d7ff;" horiz-adv-x="525" d="M464 335q0 -140 -70.5 -243t-175.5 -103q-62 0 -105.5 23.5t-43.5 80.5q0 18 11.5 28t25.5 10q15 0 26.5 -10t11.5 -28q0 -12 -8 -22q18 -18 82 -18q70 0 125 72.5t62 183.5q-62 -77 -164 -77q-78 0 -130.5 67t-52.5 158q0 92 61 158t148 66q97 0 147 -94t50 -252z M399 430l-2 24q-15 81 -49 122t-81 41q-62 0 -106 -47t-44 -113q0 -68 41 -114.5t97 -46.5q60 0 102 39.5t42 94.5z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.ttf b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.ttf
new file mode 100644
index 0000000..1559670
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.ttf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.woff b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.woff
new file mode 100644
index 0000000..c18a5b1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.woff
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.eot b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.eot
new file mode 100644
index 0000000..c2523d8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.eot
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.svg b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.svg
new file mode 100644
index 0000000..c724882
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.svg
@@ -0,0 +1,1738 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG webfont generated by Font Squirrel.
+Designer    : MicroPress Inc., with final additions and corrections provided by Coen Hoffman, Elsevier (retired)
+Foundry URL : http://www.stixfonts.org
+</metadata>
+<defs>
+<font id="webfontwFpnxWyx" horiz-adv-x="750" >
+<font-face units-per-em="1000" ascent="750" descent="-250" />
+<missing-glyph horiz-adv-x="250" />
+<glyph unicode="IJ" horiz-adv-x="838" d="M370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25zM917 676v-25q-55 -4 -71.5 -22t-16.5 -73v-430q0 -222 -212 -222q-74 0 -108 23q-29 20 -48 50t-19 60q0 28 22 51t49 23 q28 0 50 -23t22 -53q0 -15 -13.5 -34t-13.5 -32q0 -32 45 -32q34 0 49 21.5t15 68.5v550q0 43 -20 57.5t-81 16.5v25h351z" />
+<glyph unicode="ij" horiz-adv-x="552" d="M528 461v-459q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q25 0 36.5 18t11.5 58v474q0 32 -12.5 44t-50.5 15v24h202zM531 613q0 -33 -22.5 -55t-56.5 -22 q-33 0 -54.5 22t-21.5 55t22.5 55.5t55.5 22.5q31 0 54 -23t23 -55zM256 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24zM215 613q0 -33 -22.5 -55t-55.5 -22t-55 22t-22 55t22.5 55.5t56.5 22.5q31 0 53.5 -23 t22.5 -55z" />
+<glyph unicode="&#xfb00;" horiz-adv-x="610" d="M15 461h56q0 77 15 118.5t55 73.5q47 38 130 38q71 0 142 -28q40 28 110 28q64 0 103.5 -28t39.5 -72q0 -28 -17 -46t-45 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-27 0 -38.5 -17.5t-11.5 -61.5v-120h86v-44h-86v-328q0 -34 11 -46t48 -19v-24 h-244v24q32 4 39 15t7 48v330h-138v-333q0 -30 9.5 -43t36.5 -17v-24h-241v24q34 4 45 18t11 48v327h-56v44zM348 461v98q-9 3 -16.5 14t-7.5 23q0 14 8 23.5t8 18.5t-11.5 15.5t-29.5 6.5q-89 0 -89 -143v-56h138z" />
+<glyph unicode="&#xfb01;" horiz-adv-x="556" d="M536 0h-234v24q27 3 36.5 15.5t9.5 44.5v297q0 20 -8 28t-29 8h-101v-333q0 -31 9.5 -43.5t36.5 -16.5v-24h-242v24q35 4 46 17.5t11 47.5v328h-56v44h56q5 79 20 120t57 72q51 38 146 38q83 0 130.5 -24.5t47.5 -67.5q0 -27 -18.5 -44.5t-46.5 -17.5t-46 15.5t-18 39.5 q0 16 7 35l2 7q0 11 -16 19t-38 8q-46 0 -67 -33.5t-21 -126.5v-40h104q96 0 173 13v-388q0 -33 11 -46.5t38 -15.5v-24z" />
+<glyph unicode="&#xfb02;" horiz-adv-x="556" d="M535 0h-233v24l8 1q38 4 38 58v334h-138v-333q0 -30 9.5 -43t36.5 -17v-24h-241v24q34 4 45 18t11 48v327h-56v44h56q0 77 15 118.5t55 73.5q47 38 130 38q73 0 151 -31l46 30h19v-607q0 -55 36 -58l12 -1v-24zM348 461v98q-9 3 -16.5 14t-7.5 23q0 14 8 23.5t8 18.5 q0 20 -41 20q-89 0 -89 -141v-56h138z" />
+<glyph unicode="&#xfb03;" horiz-adv-x="833" d="M813 0h-234v24q27 3 36.5 15.5t9.5 44.5v297q0 20 -8 28t-29 8h-101v-333q0 -31 9.5 -43.5t36.5 -16.5v-24h-231v24q30 4 38 16.5t8 48.5v328h-138v-333q0 -30 9.5 -43t36.5 -17v-24h-241v24q34 4 45 18t11 48v327h-56v44h56q0 77 15 118.5t55 73.5q47 38 130 38 q101 0 161 -33q50 33 139 33q83 0 130.5 -24.5t47.5 -67.5q0 -27 -18.5 -44.5t-46.5 -17.5t-46 15.5t-18 39.5q0 16 7 35l2 7q0 11 -15.5 19t-38.5 8q-46 0 -67 -33.5t-21 -126.5v-40h104q96 0 173 13v-388q0 -33 11 -46.5t38 -15.5v-24zM348 461v98q-9 3 -16.5 14t-7.5 23 q0 14 8 23.5t8 18.5t-11.5 16t-29.5 7q-89 0 -89 -144v-56h138z" />
+<glyph unicode="&#xfb04;" horiz-adv-x="833" d="M812 0h-233v24l8 1q38 4 38 58v334h-138v-333q0 -30 9.5 -43t36.5 -17v-24h-231v24q28 6 37 19.5t9 46.5v327h-138v-333q0 -30 9.5 -43t36.5 -17v-24h-241v24q34 4 45 18t11 48v327h-56v44h56q0 77 15 118.5t55 73.5q47 38 130 38q89 0 147 -36q50 36 130 36 q74 0 151 -31l46 30h19v-607q0 -55 36 -58l12 -1v-24zM625 461v98q-9 3 -16.5 14t-7.5 23q0 14 8 23.5t8 18.5t-11.5 15.5t-29.5 6.5q-89 0 -89 -143v-56h138zM348 461v98q-9 3 -16.5 14t-7.5 23q0 14 8 23.5t8 18.5t-11.5 15.5t-29.5 6.5q-89 0 -89 -143v-56h138z" />
+<glyph unicode="fj" horiz-adv-x="556" d="M487 474v-472q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q25 0 36.5 18t11.5 58v477q0 20 -8 28t-29 8h-101v-333q0 -31 9.5 -43.5t36.5 -16.5v-24h-242v24q35 4 46 17.5 t11 47.5v328h-56v44h56q5 79 20 120t57 72q51 38 146 38q83 0 130.5 -24.5t47.5 -67.5q0 -27 -18.5 -44.5t-46.5 -17.5t-46 15.5t-18 39.5q0 16 7 35l2 7q0 11 -16 19t-38 8q-46 0 -67 -33.5t-21 -126.5v-40h104q96 0 173 13z" />
+<glyph unicode=" "  horiz-adv-x="250" />
+<glyph unicode="&#x09;" horiz-adv-x="250" />
+<glyph unicode="&#xa0;" horiz-adv-x="250" />
+<glyph unicode="!" horiz-adv-x="333" d="M181 234h-31q-10 93 -19.5 144t-31.5 122q-18 58 -18 91q0 47 22 73.5t62 26.5q38 0 61.5 -27t23.5 -75q0 -32 -18 -89q-22 -72 -31.5 -123t-19.5 -143zM251 71q0 -35 -25 -59.5t-60 -24.5q-36 0 -60 23.5t-24 59.5q0 37 24.5 61.5t60.5 24.5q37 0 60.5 -24t23.5 -61z " />
+<glyph unicode="&#x22;" horiz-adv-x="555" d="M429 404h-43q-43 178 -43 214q0 73 64 73q31 0 48 -19.5t17 -49.5q0 -31 -43 -218zM169 404h-43q-43 171 -43 214q0 33 16 53t48 20t48.5 -19t16.5 -50q0 -32 -43 -218z" />
+<glyph unicode="#" horiz-adv-x="500" d="M495 417h-97l-18 -134h86v-73h-97l-29 -210h-78l29 210h-113l-29 -210h-78l29 210h-95v73h106l18 134h-95v73h105l30 210h77l-29 -210h113l30 210h77l-29 -210h87v-73zM320 417h-113l-18 -134h113z" />
+<glyph unicode="$" horiz-adv-x="500" d="M269 641v-214q11 -7 40 -24l39 -23q11 -6 33.5 -21.5t31.5 -24.5l23 -26q15 -17 20.5 -32.5t10.5 -36t5 -43.5q0 -87 -51 -135q-45 -41 -152 -61v-99h-56v99q-46 2 -75.5 9.5t-91.5 33.5v158l21 -2q21 -81 55.5 -119.5t90.5 -49.5v250q-100 52 -142 101t-42 115 q0 103 88 151q33 18 96 25v78h56v-76q94 -13 159 -52v-141h-21q-19 77 -51.5 114t-86.5 46zM213 454v190q-89 -23 -89 -93q0 -39 20.5 -59.5t68.5 -37.5zM269 249v-219q46 9 69.5 38t23.5 66q0 40 -16.5 60.5t-76.5 54.5z" />
+<glyph unicode="%" horiz-adv-x="749" d="M688 214q0 -53 -19.5 -104t-53.5 -86q-39 -42 -99 -42q-57 0 -92.5 38.5t-35.5 99.5q0 85 58.5 149t136.5 64q49 0 77 -31.5t28 -87.5zM663 220q0 35 -17 57.5t-42 22.5q-31 0 -62 -46q-24 -36 -40 -87t-16 -91q0 -66 50 -66q44 0 79 51q48 74 48 159zM626 706l-438 -735 h-48l388 655q-56 -42 -113 -42q-27 0 -60 13q3 -29 3 -42q0 -53 -19.5 -105.5t-50.5 -83.5q-44 -44 -101 -44q-56 0 -91 39t-35 100q0 85 59 149t138 64q35 0 71 -29q38 -30 83 -30q49 0 88.5 21.5t77.5 69.5h48zM332 560q0 25 -6 35.5t-26 18.5q-11 5 -21 11q-14 9 -20 9 q-32 0 -67 -74.5t-35 -141.5q0 -66 50 -66q48 0 86.5 64t38.5 144z" />
+<glyph unicode="&#x26;" horiz-adv-x="833" d="M789 113l-15 -25q-33 -55 -57 -73q-41 -31 -93 -31q-40 0 -72.5 19t-76.5 69q-115 -87 -222 -87q-86 0 -138.5 48t-52.5 134q0 69 45.5 123t150.5 98q-32 50 -42 79.5t-10 64.5q0 76 53 117.5t149 41.5q72 0 116 -33.5t44 -87.5q0 -48 -36 -83t-116 -64l151 -214 q45 54 60.5 84t15.5 61q0 22 -10.5 29t-53.5 12v24h204v-24q-33 -3 -47 -10.5t-26 -29.5q-34 -62 -55 -93t-65 -86q42 -54 66 -72.5t53 -18.5q35 0 60 40zM467 533q0 50 -27.5 87.5t-64.5 37.5q-24 0 -38 -15t-14 -41q0 -64 74 -150q38 13 54 31.5t16 49.5zM452 100 q-5 8 -30 42l-44 60l-48 71q-30 44 -55 85q-41 -24 -57.5 -45t-16.5 -49q0 -87 72 -161q39 -42 89 -42q36 0 90 39z" />
+<glyph unicode="'" horiz-adv-x="278" d="M161 404h-43q-43 205 -43 213q0 34 16.5 54t47.5 20t48 -18.5t17 -51.5q0 -30 -43 -217z" />
+<glyph unicode="(" horiz-adv-x="333" d="M306 -140v-28q-74 44 -113 79.5t-78 91.5q-69 99 -69 256q0 198 131 340q29 31 56 50.5t73 44.5v-27q-97 -80 -122 -156.5t-25 -252.5q0 -162 28 -241t119 -157z" />
+<glyph unicode=")" horiz-adv-x="333" d="M27 666v28q75 -45 115.5 -83t75.5 -95q69 -115 69 -249q0 -198 -131 -340q-29 -31 -56 -50.5t-73 -44.5v27q35 27 59 50.5t41 52.5t26 54t14 67.5t6 80.5t1 104q0 173 -25.5 247t-121.5 151z" />
+<glyph unicode="*" horiz-adv-x="500" d="M260 497l7 -3q30 24 42 35.5t30 38.5q14 22 26.5 30t29.5 8q21 0 37 -14.5t16 -33.5q0 -23 -25.5 -38t-56.5 -15q-33 0 -48.5 -4.5t-40.5 -21.5v-8q51 -24 97 -28q40 -3 56.5 -14.5t16.5 -36.5q0 -22 -13 -36t-36 -14q-19 0 -32.5 11.5t-42.5 50.5q-15 21 -25.5 30 t-31.5 20l-6 -4q1 -32 6 -49t21 -49q15 -29 15 -45q0 -22 -14.5 -37t-36.5 -15q-21 0 -35 14.5t-14 37.5q0 17 16 46q14 24 18 42t5 55l-6 4q-29 -22 -41.5 -34.5t-32.5 -40.5q-15 -22 -26.5 -29.5t-28.5 -7.5q-21 0 -35.5 13.5t-14.5 34.5q0 47 84 53q32 2 47 7.5t39 21.5 v7q-47 21 -102 26q-68 5 -68 53q0 22 13 35t34 13t34 -9t28 -34q17 -29 29.5 -41t41.5 -28l5 3q-1 33 -4.5 48t-18.5 43q-18 32 -18 53q0 22 14.5 36t37.5 14q21 0 34.5 -15t13.5 -40q0 -15 -18 -47q-22 -37 -22 -77v-15z" />
+<glyph unicode="+" d="M685 209h-266v-266h-88v266h-266v88h266v266h88v-266h266v-88z" />
+<glyph unicode="," horiz-adv-x="250" d="M57 -180l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="-" horiz-adv-x="333" d="M287 171h-243v116h243v-116z" />
+<glyph unicode="." horiz-adv-x="250" d="M210 71q0 -35 -25 -59.5t-60 -24.5q-36 0 -60 24t-24 60q0 35 25 60t60 25q34 0 59 -25t25 -60z" />
+<glyph unicode="/" horiz-adv-x="278" d="M302 691l-236 -710h-90l236 710h90z" />
+<glyph unicode="0" horiz-adv-x="500" d="M476 337q0 -157 -63 -253.5t-162 -96.5t-163 96t-64 251q0 51 7 99.5t24.5 95.5t43 81.5t65.5 56t89 21.5q75 0 127.5 -54.5t74 -131t21.5 -165.5zM318 224v225q0 111 -16 161t-53 50t-52 -48.5t-15 -162.5v-225q0 -112 16 -160.5t53 -48.5t52 48t15 161z" />
+<glyph unicode="1" horiz-adv-x="500" d="M441 0h-373v24q74 1 96 20.5t22 84.5v378q0 70 -36 70q-24 0 -65 -16l-20 -8v26l251 109h18v-570q0 -57 19.5 -75t87.5 -19v-24z" />
+<glyph unicode="2" horiz-adv-x="500" d="M478 211l-46 -211h-415v23q109 116 151.5 166.5t80.5 109.5q51 78 51 148q0 54 -31 90.5t-88 36.5q-77 0 -122 -90h-28q68 204 223 204q82 0 132 -49.5t50 -133.5q0 -110 -114 -218l-162 -154h140q81 0 107.5 13t45.5 65h25z" />
+<glyph unicode="3" horiz-adv-x="500" d="M58 524l-21 12q79 152 229 152q74 0 119 -40.5t45 -96.5q0 -38 -20.5 -73t-63.5 -54q57 -20 89.5 -68.5t32.5 -109.5q0 -110 -85.5 -185t-214.5 -75q-69 0 -110.5 24.5t-41.5 65.5q0 26 18.5 43t46.5 17q45 0 96 -57q39 -43 79 -43q45 0 71.5 34t26.5 88q0 75 -49 121 q-26 24 -56 39t-97 38v17q70 22 100.5 54t30.5 77q0 103 -99 103q-40 0 -69 -18.5t-57 -64.5z" />
+<glyph unicode="4" horiz-adv-x="500" d="M476 144h-64v-144h-145v144h-248v113l313 431h80v-433h64v-111zM268 255v294l-208 -294h208z" />
+<glyph unicode="5" horiz-adv-x="500" d="M470 676l-45 -127h-276l-22 -81q104 -6 151 -20q82 -23 127.5 -79.5t45.5 -134.5q0 -109 -78.5 -175.5t-203.5 -66.5q-65 0 -106 26t-41 62q0 26 17.5 43.5t43.5 17.5q46 0 100 -46q49 -42 90 -42q42 0 71 29.5t29 74.5q0 51 -36.5 90.5t-105.5 61.5q-49 15 -180 22 l97 345h322z" />
+<glyph unicode="6" horiz-adv-x="500" d="M470 688v-26q-109 -22 -173 -85t-93 -173q39 17 84 17q85 0 136 -54t51 -145q0 -105 -59 -170t-156 -65q-106 0 -169 77.5t-63 209.5q0 175 139 297q61 53 118.5 73.5t184.5 43.5zM323 165q0 117 -20 164t-69 47q-25 0 -37 -10q-13 -11 -13 -121q0 -150 27 -202 q15 -29 51 -29q35 0 48 31t13 120z" />
+<glyph unicode="7" horiz-adv-x="500" d="M477 676l-235 -676h-95l200 539h-199q-47 0 -68.5 -18t-36.5 -67h-26l45 222h415z" />
+<glyph unicode="8" horiz-adv-x="500" d="M472 187q0 -91 -62 -145.5t-170 -54.5q-96 0 -154 45.5t-58 124.5q0 132 149 168q-74 44 -106 87.5t-32 100.5q0 80 60.5 127.5t163.5 47.5q91 0 143 -41.5t52 -103.5q0 -98 -136 -140q84 -57 117 -105t33 -111zM339 537q0 53 -23.5 87.5t-64.5 34.5q-35 0 -59 -24 t-24 -59q0 -87 130 -154q25 33 33 56t8 59zM333 127q0 55 -25.5 89.5t-107.5 89.5q-51 -75 -51 -145q0 -68 24 -105t69 -37q42 0 66.5 28t24.5 80z" />
+<glyph unicode="9" horiz-adv-x="500" d="M31 -13v26q107 22 171.5 85t96.5 175q-37 -19 -88 -19q-83 0 -134 55.5t-51 149.5q0 97 61 163t154 66q105 0 168.5 -80t63.5 -214q0 -183 -145 -297q-67 -53 -126.5 -75t-170.5 -35zM317 461q0 117 -25 167q-17 33 -54 33q-34 0 -47 -30.5t-13 -117.5q0 -116 19.5 -165 t65.5 -49q28 0 41 9q4 2 5 20q8 31 8 86v47z" />
+<glyph unicode=":" horiz-adv-x="333" d="M251 387q0 -35 -25 -59.5t-60 -24.5t-59.5 24.5t-24.5 60.5q0 35 24.5 59.5t60.5 24.5q35 0 59.5 -25t24.5 -60zM251 71q0 -35 -25 -59.5t-60 -24.5q-36 0 -60 24t-24 60q0 35 25 60t60 25q34 0 59 -25t25 -60z" />
+<glyph unicode=";" horiz-adv-x="333" d="M251 387q0 -35 -25 -59.5t-60 -24.5t-59.5 24.5t-24.5 60.5q0 35 24.5 59.5t60.5 24.5q35 0 59.5 -25t24.5 -60zM100 -180l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z " />
+<glyph unicode="&#x3c;" d="M670 -24l-590 258v40l590 260v-88l-436 -192l436 -190v-88z" />
+<glyph unicode="=" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88z" />
+<glyph unicode="&#x3e;" d="M670 234l-590 -258v88l436 190l-436 192v88l590 -260v-40z" />
+<glyph unicode="?" horiz-adv-x="500" d="M253 232h-30q-3 25 -3 45q1 46 38.5 123.5t37.5 122.5q0 62 -22 96t-62 34q-28 0 -44.5 -11t-16.5 -29q0 -13 15 -29q22 -25 22 -51q0 -28 -20.5 -47.5t-44.5 -19.5q-29 0 -47.5 22.5t-18.5 55.5q0 63 51 104t133 41q93 0 148.5 -46.5t55.5 -119.5q0 -52 -26 -87.5 t-95 -78.5q-47 -29 -59 -49.5t-12 -75.5zM323 71q0 -35 -24.5 -59.5t-59.5 -24.5q-36 0 -60.5 24.5t-24.5 59.5t25 60t61 25q34 0 58.5 -25t24.5 -60z" />
+<glyph unicode="@" horiz-adv-x="930" d="M698 76l13 -35q-73 -35 -120.5 -47.5t-103.5 -12.5q-160 0 -269.5 100t-109.5 249q0 150 111.5 255.5t269.5 105.5q144 0 238.5 -86.5t94.5 -214.5q0 -104 -58 -175t-136 -71q-37 0 -60.5 20t-28.5 54q-56 -74 -126 -74q-43 0 -68.5 32.5t-25.5 81.5q0 98 55 179.5 t148 81.5q27 0 42 -10.5t31 -42.5l11 40h71l-66 -260q-2 -10 -2 -18q0 -48 35 -48q50 0 90.5 63t40.5 142q0 109 -85.5 188t-202.5 79q-125 0 -206 -92.5t-81 -234.5q0 -131 82 -214.5t213 -83.5q96 0 203 49zM577 411q0 60 -45 60q-56 0 -96 -63.5t-40 -129.5 q0 -40 16 -63.5t43 -23.5q48 0 83 68q39 78 39 152z" />
+<glyph unicode="A" horiz-adv-x="722" d="M689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="B" horiz-adv-x="667" d="M426 365v-1q85 -11 139 -58.5t54 -117.5q0 -83 -72 -135.5t-202 -52.5h-329v25q55 6 71.5 21t16.5 57v467q0 44 -18.5 60.5t-69.5 20.5v25h317q121 0 186.5 -41.5t65.5 -118.5q0 -59 -37 -96.5t-122 -54.5zM264 592v-219q91 0 123.5 30t32.5 106q0 137 -99 137 q-30 0 -43.5 -12.5t-13.5 -41.5zM264 343v-245q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 155 -157 155h-26z" />
+<glyph unicode="C" horiz-adv-x="722" d="M657 152l30 -25q-67 -83 -132.5 -114.5t-155.5 -31.5q-159 0 -254.5 96.5t-95.5 245.5q0 160 97.5 264t249.5 104q71 0 156 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25q-22 62 -67 115q-75 90 -167 90q-81 0 -132.5 -83.5t-51.5 -229.5q0 -155 54 -240 q22 -34 62.5 -55t84.5 -21q64 0 126 34q41 23 104 89z" />
+<glyph unicode="D" horiz-adv-x="722" d="M14 676h312q171 0 267.5 -88t96.5 -243q0 -77 -30.5 -147t-84.5 -117q-93 -81 -252 -81h-309v25q43 1 63 19t20 54v486q0 34 -17.5 48t-65.5 19v25zM259 598v-498q0 -35 12.5 -50t45.5 -15q98 0 149 72q23 33 36.5 94.5t13.5 128.5q0 139 -41 211q-58 101 -163 101 q-53 0 -53 -44z" />
+<glyph unicode="E" horiz-adv-x="667" d="M641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54 q25 20 42 46t40 77h28z" />
+<glyph unicode="F" horiz-adv-x="611" d="M583 474h-24q-10 57 -22 81.5t-38 47.5q-45 39 -163 39q-38 0 -54 -11.5t-16 -39.5v-228q75 0 109 32.5t44 116.5h25v-338h-25q-7 87 -41 120t-112 35v-228q0 -43 21 -58t89 -18v-25h-360v25q55 6 71.5 21t16.5 57v472q0 43 -18 58t-70 18v25h567v-202z" />
+<glyph unicode="G" horiz-adv-x="778" d="M755 287v-25q-53 -6 -69.5 -27.5t-16.5 -72.5v-118q-49 -29 -124 -46t-153 -17q-154 0 -254.5 96t-100.5 254q0 151 99.5 255.5t248.5 104.5q70 0 155 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25q-29 63 -47.5 92.5t-48.5 56.5q-63 56 -138 56q-88 0 -136 -83 t-48 -237q0 -157 48 -237q27 -45 63 -66t92 -21q96 0 96 85v89q0 40 -19.5 55t-82.5 19v25h344z" />
+<glyph unicode="H" horiz-adv-x="778" d="M759 0h-339v25q54 6 71.5 20.5t17.5 52.5v228h-241v-228q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-204h241v204q0 41 -18 55.5t-71 18.5v25h339v-25q-51 -4 -69.5 -19t-18.5 -55v-479 q0 -39 16.5 -52.5t71.5 -20.5v-25z" />
+<glyph unicode="I" horiz-adv-x="389" d="M370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="J" horiz-adv-x="500" d="M478 676v-25q-55 -4 -71.5 -22t-16.5 -73v-430q0 -222 -212 -222q-74 0 -108 23q-29 20 -48 50t-19 60q0 28 21.5 51t49.5 23t50 -23t22 -53q0 -15 -13.5 -34t-13.5 -32q0 -32 45 -32q34 0 49 21.5t15 68.5v550q0 43 -20 57.5t-81 16.5v25h351z" />
+<glyph unicode="K" horiz-adv-x="778" d="M769 0h-334v25q47 1 62 6t15 15q0 13 -25 45l-181 225l-27 -25v-196q0 -37 16.5 -50t70.5 -20v-25h-336v25q55 5 71 19t16 57v472q0 46 -17 60.5t-70 17.5v25h337v-25q-54 -4 -71 -20.5t-17 -63.5v-223l212 215q24 24 32 35t8 23q0 15 -10.5 22t-37.5 9l-35 3v25h289v-25 q-78 -9 -133 -46.5t-189 -180.5l305 -378q16 -20 49 -21v-25z" />
+<glyph unicode="L" horiz-adv-x="667" d="M638 227l-42 -227h-577v25q55 7 70.5 20t15.5 53v478q0 42 -17.5 57t-68.5 18v25l348 1v-25q-65 -3 -82.5 -20t-17.5 -79v-464q0 -33 18.5 -45.5t66.5 -12.5q109 0 170 55q42 39 87 141h29z" />
+<glyph unicode="M" horiz-adv-x="944" d="M921 0h-332v25q55 5 72 22t17 62v496l-252 -605h-27l-252 594v-465q0 -58 20 -79t81 -25v-25h-234v25q59 6 75 20.5t16 62.5v469q0 41 -17 55.5t-72 18.5v25h253l199 -472l201 472h252v-25q-55 -4 -71.5 -22.5t-16.5 -74.5v-428q0 -57 15 -76.5t73 -24.5v-25z" />
+<glyph unicode="N" horiz-adv-x="722" d="M701 676v-25q-50 -8 -64 -22.5t-14 -60.5v-586h-28l-447 545v-396q0 -58 18 -78.5t76 -27.5v-25h-226v25q55 7 71.5 22.5t16.5 61.5v470q-52 72 -85 72v25h211l349 -430v299q0 60 -18 80.5t-74 25.5v25h214z" />
+<glyph unicode="O" horiz-adv-x="778" d="M743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="P" horiz-adv-x="611" d="M16 676h315q128 0 198.5 -45.5t70.5 -135.5q0 -60 -33.5 -104.5t-95.5 -67.5q-32 -12 -70.5 -15.5t-138.5 -4.5v-192q0 -51 14 -65t73 -21v-25h-333v25q33 3 45 9q23 9 31 30t8 62v427q0 58 -15.5 75.5t-68.5 22.5v25zM262 606v-268q94 1 130 32t36 114q0 84 -27 120.5 t-89 36.5q-50 0 -50 -35z" />
+<glyph unicode="Q" horiz-adv-x="778" d="M730 -117l6 -24q-91 -35 -179 -35q-140 0 -228 88q-29 29 -56 86q-113 34 -175.5 123.5t-62.5 208.5q0 161 99.5 261t254.5 100q156 0 255 -100t99 -264q0 -126 -66 -211t-187 -122q23 -47 47 -71q52 -52 123 -52q30 0 70 12zM566 335q0 158 -46 240.5t-132 82.5 q-84 0 -130 -83.5t-46 -239.5t45 -238.5t132 -82.5q86 0 131.5 83t45.5 238z" />
+<glyph unicode="R" horiz-adv-x="722" d="M716 0h-205l-207 313h-28v-196q0 -54 14.5 -69t73.5 -23v-25h-338v25q59 7 73.5 22t14.5 73v431q0 59 -16.5 77.5t-71.5 22.5v25h308q296 0 296 -172q0 -76 -45 -118q-42 -38 -112 -57l199 -282q15 -22 44 -22v-25zM276 597v-252q103 1 143 31t40 118q0 79 -30 113.5 t-100 34.5q-29 0 -41 -10t-12 -35z" />
+<glyph unicode="S" horiz-adv-x="556" d="M484 474h-28q-26 85 -70 130q-54 56 -123 56q-51 0 -80.5 -27.5t-29.5 -71.5q0 -36 21 -59t82 -55q18 -10 68.5 -35.5t79.5 -41.5q49 -27 79 -73.5t30 -102.5q0 -95 -68.5 -154t-179.5 -59q-61 0 -130 24q-31 10 -41 10q-12 0 -19 -7.5t-11 -26.5h-29v248h29 q23 -96 60 -143q57 -72 144 -72q58 0 92 30.5t34 82.5q0 48 -57 88q-25 18 -122 65q-89 43 -130 90t-41 120q0 95 58.5 148t160.5 53q55 0 117 -23q30 -10 42 -10q14 0 20.5 7t11.5 27h30v-218z" />
+<glyph unicode="T" horiz-adv-x="667" d="M636 475h-29q-13 89 -56.5 127.5t-135.5 41.5v-527q0 -57 16.5 -72t81.5 -20v-25h-357v25q64 5 80.5 20.5t16.5 71.5v527q-93 -3 -136.5 -41.5t-56.5 -127.5h-29l3 201h600z" />
+<glyph unicode="U" horiz-adv-x="722" d="M701 676v-25q-48 -7 -63 -24t-15 -61v-314q0 -156 -76 -216q-68 -55 -184 -55t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25h219z" />
+<glyph unicode="V" horiz-adv-x="722" d="M701 676v-25q-39 -5 -55.5 -20t-34.5 -62l-228 -587h-27l-256 599q-18 42 -32 53.5t-52 16.5v25h336v-25l-33 -2q-53 -3 -53 -36q0 -17 23 -72l138 -334l127 329q20 52 20 71q0 24 -16 32t-70 12v25h213z" />
+<glyph unicode="W" horiz-adv-x="1000" d="M981 676v-25q-50 -5 -69 -64l-200 -602h-27l-171 477l-186 -477h-28l-212 602q-13 37 -25 48t-44 16v25h294v-25q-39 -3 -51.5 -11.5t-12.5 -30.5q0 -13 7 -33l120 -364l118 308l-35 96q-12 32 -72 35v25h312v-25l-13 -1q-33 -2 -46 -10t-13 -26q0 -13 14 -56l108 -336 l112 343q7 20 7 42q0 23 -14.5 32.5t-54.5 11.5v25h182z" />
+<glyph unicode="X" horiz-adv-x="722" d="M699 0h-340v25l28 2q52 3 52 28q0 21 -21 54l-101 162l-38 -51q-56 -76 -75 -106.5t-19 -46.5q0 -19 17.5 -28t63.5 -14v-25h-250v25q37 4 59 16t45 40l175 221l-198 291q-23 34 -38 45t-42 13v25h346v-25l-31 -2q-27 -1 -37.5 -8t-10.5 -23q0 -14 15 -37l97 -150l56 77 q36 49 47 69.5t11 36.5q0 18 -11 25t-40 10l-21 2v25h250v-25q-57 -5 -90.5 -30.5t-97.5 -115.5l-80 -111l182 -283q35 -54 53 -69.5t44 -16.5v-25z" />
+<glyph unicode="Y" horiz-adv-x="722" d="M699 676v-25q-49 -7 -68 -39l-191 -311v-178q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136l-180 328q-31 56 -83 59v25h335v-25l-27 -2q-32 -2 -43 -7.5t-11 -21.5q0 -13 24 -59l120 -232l109 178q41 68 41 102q0 22 -16.5 30t-67.5 12v25h220z " />
+<glyph unicode="Z" horiz-adv-x="667" d="M634 242l-27 -242h-579v16l382 625l-83 -3q-62 -2 -96.5 -8.5t-63.5 -25t-46 -49.5t-34 -86h-28l22 207h523v-16l-379 -625h83q145 0 202 40q27 19 45 45t26.5 47t26.5 75h26z" />
+<glyph unicode="[" horiz-adv-x="333" d="M301 -149h-234v827h234v-33h-63q-42 0 -54.5 -13t-12.5 -57v-638q0 -32 9.5 -42.5t40.5 -10.5h80v-33z" />
+<glyph unicode="\" horiz-adv-x="278" d="M303 -19h-92l-236 710h93z" />
+<glyph unicode="]" horiz-adv-x="333" d="M266 -149h-234v33h80q31 0 40.5 10t9.5 43v638q0 44 -12.5 57t-54.5 13h-63v33h234v-827z" />
+<glyph unicode="^" horiz-adv-x="581" d="M509 311h-89l-129 272l-129 -272h-89l178 365h80z" />
+<glyph unicode="_" horiz-adv-x="500" d="M500 -125h-500v50h500v-50z" />
+<glyph unicode="`" horiz-adv-x="333" d="M246 528h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28z" />
+<glyph unicode="a" horiz-adv-x="500" d="M473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50 q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4zM293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="b" horiz-adv-x="556" d="M211 676v-259q53 56 122 56q83 0 135.5 -65t52.5 -169q0 -113 -63 -183t-163 -70q-70 0 -132 57l-79 -56h-12v607q0 30 -10 40.5t-45 17.5v24h194zM211 360v-263q0 -36 19 -57.5t50 -21.5q94 0 94 203q0 198 -93 198q-25 0 -41 -13.5t-29 -45.5z" />
+<glyph unicode="c" horiz-adv-x="444" d="M412 109l18 -18q-41 -56 -86 -80.5t-105 -24.5q-95 0 -154.5 65t-59.5 171q0 110 68 180.5t169 70.5q66 0 110 -31t44 -79q0 -29 -18.5 -46.5t-49.5 -17.5q-26 0 -41 19t-15 54q0 18 -0.5 26t-2.5 18.5t-6 15t-12.5 7.5t-20.5 3q-38 0 -61 -44.5t-23 -124.5 q0 -102 37 -161t102 -59q58 0 107 56z" />
+<glyph unicode="d" horiz-adv-x="556" d="M534 20l-62 -8q-82 -11 -133 -25v65q-35 -37 -64 -51.5t-69 -14.5q-79 0 -130 66t-51 169q0 109 54.5 180.5t137.5 71.5q34 0 60.5 -13.5t58.5 -48.5v183q0 35 -13 44.5t-63 13.5v24h215v-575q0 -32 12.5 -44t46.5 -14v-23zM336 112v243q-11 29 -32 45.5t-46 16.5 q-85 0 -85 -188q0 -187 78 -187q36 0 66 37q19 25 19 33z" />
+<glyph unicode="e" horiz-adv-x="444" d="M403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252q3 -42 8 -70.5t17 -57.5t35.5 -44t58.5 -15q32 0 58 15.5t57 52.5zM298 282v21q0 73 -9 92q-12 25 -23.5 36t-31.5 11 q-36 0 -53 -36.5t-17 -123.5h134z" />
+<glyph unicode="f" horiz-adv-x="333" d="M14 461h57q0 131 40 179q42 51 135 51q64 0 103.5 -28t39.5 -72q0 -28 -17 -46t-45 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-27 0 -38.5 -17.5t-11.5 -61.5v-120h86v-44h-86v-310q0 -50 15 -66t67 -17v-24h-278v24q34 4 45.5 16.5t11.5 46.5v330 h-57v44z" />
+<glyph unicode="g" horiz-adv-x="500" d="M254 68h52q81 0 129 -32.5t48 -87.5q0 -71 -68.5 -112.5t-192.5 -41.5q-194 0 -194 92q0 61 96 75q-47 17 -64.5 35t-17.5 47q0 44 29 71.5t90 45.5q-55 15 -89.5 56t-34.5 96q0 73 56.5 117t146.5 44q52 0 112 -22h129v-53h-80q40 -36 40 -98q0 -94 -92 -132 q-24 -10 -41 -12t-86 -2q-30 0 -49.5 -13.5t-19.5 -35.5q0 -21 21 -29t80 -8zM306 312q0 70 -15.5 100t-51.5 30t-50.5 -29t-14.5 -102q0 -70 15 -99.5t51 -29.5t51 29.5t15 100.5zM315 -52h-164q-21 -17 -28 -28t-7 -27q0 -67 134 -67q72 0 113 18.5t41 47.5q0 56 -89 56z " />
+<glyph unicode="h" horiz-adv-x="556" d="M534 0h-234v24q25 3 35.5 16.5t10.5 44.5v224q0 54 -11 75.5t-40 21.5q-36 0 -70 -34q-17 -17 -17 -24v-263q0 -31 10 -44t38 -17v-24h-240v24q36 7 44.5 16t8.5 49v502q0 35 -9 44.5t-45 16.5v24h193v-280q65 77 147 77q60 0 95 -38t35 -98v-250q0 -34 11.5 -48.5 t37.5 -14.5v-24z" />
+<glyph unicode="i" horiz-adv-x="278" d="M256 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24zM215 613q0 -33 -22.5 -55t-55.5 -22t-55 22t-22 55t22.5 55.5t56.5 22.5q31 0 53.5 -23t22.5 -55z" />
+<glyph unicode="j" horiz-adv-x="333" d="M260 461v-459q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q25 0 36.5 18t11.5 58v474q0 32 -12.5 44t-50.5 15v24h202zM263 613q0 -33 -22.5 -55t-56.5 -22 q-33 0 -54.5 22t-21.5 55t22.5 55.5t55.5 22.5q31 0 54 -23t23 -55z" />
+<glyph unicode="k" horiz-adv-x="556" d="M543 0h-234v24q42 2 42 19q0 12 -24 45l-95 134l-23 -24v-114q0 -35 8.5 -45t43.5 -15v-24h-239v24q48 4 48 60v510q0 54 -48 58v24h187v-431l128 128q21 21 21 38q0 18 -35 23l-24 4v23h214v-23q-47 -6 -80.5 -29t-108.5 -102l194 -268q11 -15 25 -15v-24z" />
+<glyph unicode="l" horiz-adv-x="278" d="M256 0h-240v24q51 4 51 63v500q0 61 -52 65v24h191v-589q0 -33 12 -47.5t38 -15.5v-24z" />
+<glyph unicode="m" horiz-adv-x="833" d="M814 0h-237v24q28 2 38 14.5t10 44.5v228q0 95 -53 95q-29 0 -58 -25q-9 -7 -18 -18t-9 -15v-265q0 -29 10 -42.5t36 -16.5v-24h-232v24q27 2 37 15t10 44v240q0 45 -12.5 64t-41.5 19q-19 0 -51.5 -22.5t-32.5 -39.5v-261q0 -29 9.5 -42t35.5 -17v-24h-239v24 q33 6 44 18.5t11 43.5v287q0 35 -11 47t-45 17v24h192v-75h3q29 46 62.5 66.5t81.5 20.5q47 0 76 -20t52 -67q39 48 71.5 67.5t75.5 19.5q62 0 98.5 -38t36.5 -104v-248q0 -32 10.5 -45t39.5 -14v-24z" />
+<glyph unicode="n" horiz-adv-x="556" d="M539 0h-234v24q25 3 35.5 16.5t10.5 43.5v237q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24v-264q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h191v-75h1q49 87 142 87q62 0 98.5 -38.5t36.5 -103.5v-247q0 -34 10 -46t39 -14 v-24z" />
+<glyph unicode="o" horiz-adv-x="500" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="p" horiz-adv-x="556" d="M212 461v-69q25 44 55.5 62.5t75.5 18.5q85 0 133 -57.5t48 -166.5q0 -118 -51.5 -190t-140.5 -72q-34 0 -58 12.5t-60 47.5v-126q0 -52 16.5 -76t60.5 -26v-24h-272v24q35 6 45.5 18.5t10.5 44.5v490q0 33 -11 46.5t-44 18.5v24h192zM214 346v-239q12 -29 32.5 -47 t44.5 -18q85 0 85 192q0 182 -76 182q-37 0 -68 -37q-18 -21 -18 -33z" />
+<glyph unicode="q" horiz-adv-x="556" d="M536 -205h-267v24q48 7 60.5 23.5t12.5 67.5v132q-44 -56 -123 -56t-132 63.5t-53 169.5q0 108 61.5 181t160.5 73q38 0 66 -12t66 -44l77 55h16v-595q0 -30 10 -40.5t45 -17.5v-24zM342 98v256q0 41 -18.5 64t-48.5 23q-44 0 -69.5 -51t-25.5 -154q0 -98 25 -147t68 -49 q28 0 48.5 15.5t20.5 42.5z" />
+<glyph unicode="r" horiz-adv-x="444" d="M218 461v-82q35 51 66 72.5t69 21.5q35 0 58 -22.5t23 -56.5q0 -30 -17.5 -49t-45.5 -19q-37 0 -60 38q-14 23 -28 23q-26 0 -43.5 -30t-17.5 -74v-177q0 -48 13.5 -63.5t58.5 -18.5v-24h-265v24q33 6 43.5 17.5t10.5 42.5v289q0 35 -11 47t-44 17v24h190z" />
+<glyph unicode="s" horiz-adv-x="389" d="M340 326h-25q-19 56 -47 82q-34 32 -75 32q-28 0 -47 -16.5t-19 -41.5q0 -26 22.5 -46.5t73.5 -41.5q75 -31 106.5 -67t31.5 -89q0 -67 -43 -109.5t-111 -42.5q-52 0 -108 23q-15 6 -23 6q-11 0 -26 -28h-25v165h28q32 -132 137 -132q34 0 54.5 18t20.5 47q0 24 -22 44.5 t-74 42.5q-75 32 -108.5 68.5t-33.5 86.5q0 63 44.5 104.5t112.5 41.5q34 0 78 -15q22 -7 31 -7q17 0 25 20h22v-145z" />
+<glyph unicode="t" horiz-adv-x="333" d="M307 112l25 -11q-31 -62 -64.5 -87.5t-83.5 -25.5q-52 0 -82 28.5t-30 78.5v322h-53v27q49 33 82 71.5t85 114.5h25v-169h95v-44h-95v-298q0 -60 39 -60q29 0 57 53z" />
+<glyph unicode="u" horiz-adv-x="556" d="M538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z" />
+<glyph unicode="v" horiz-adv-x="500" d="M485 461v-24q-24 -2 -34 -11.5t-24 -43.5l-160 -396h-26l-120 296q-47 116 -66 141q-8 10 -34 14v24h250v-24l-18 -2q-35 -4 -35 -24q0 -9 9 -31l79 -203l72 182q11 26 11 45q0 18 -11.5 24.5t-43.5 8.5v24h151z" />
+<glyph unicode="w" horiz-adv-x="722" d="M707 461v-24q-19 -4 -29.5 -14.5t-20.5 -35.5l-155 -401h-23l-102 310l-125 -310h-24l-148 374q-19 47 -28.5 60t-28.5 17v24h222v-24q-38 -5 -38 -28q0 -12 39 -115l45 -118l68 171q-4 12 -6 19q-14 49 -22 58.5t-37 12.5v24h234v-24q-28 -2 -38 -7t-10 -17 q0 -14 27 -106q23 -79 34 -127l35 94q44 118 44 128q0 17 -10 24.5t-38 10.5v24h135z" />
+<glyph unicode="x" horiz-adv-x="500" d="M484 0h-241v24q45 3 45 20q0 16 -33 64q-23 32 -42 63q-2 -3 -7.5 -9.5t-8.5 -10.5q-64 -77 -64 -103q0 -21 50 -24v-24h-169v24q28 2 49.5 19.5t63.5 73.5l43 56q5 6 7.5 9.5t3.5 4.5t3.5 4.5t7.5 9.5l-128 197q-15 23 -24 29.5t-28 9.5v24h250v-24q-47 -1 -47 -19 q0 -22 58 -98q10 -12 13 -17l36 46q38 49 38 64q0 11 -7 15.5t-24 6.5l-20 2v24h168v-24q-44 -7 -70 -39l-101 -126l148 -228q8 -13 30 -20v-24z" />
+<glyph unicode="y" horiz-adv-x="500" d="M482 461v-24q-24 -3 -36 -13.5t-24 -41.5l-148 -398q-45 -121 -77 -156q-31 -33 -84 -33q-43 0 -70 22t-27 57q0 29 17 48t45 19q25 0 42.5 -15t17.5 -37q0 -4 -2 -14l-1 -6q0 -7 5 -12t12 -5q38 0 66 82l18 53l-119 290q-49 121 -67 146q-8 10 -34 14v24h249v-24l-16 -1 q-36 -3 -36 -25q0 -7 20 -58l72 -186l68 188q11 32 11 49q0 18 -11 25t-43 8v24h152z" />
+<glyph unicode="z" horiz-adv-x="444" d="M420 160l-16 -160h-383v25l234 404q-106 0 -139 -19t-52 -91h-26l7 142h371v-26l-231 -403h29q61 0 91.5 12.5t55.5 46.5q20 30 31 69h28z" />
+<glyph unicode="{" horiz-adv-x="394" d="M340 -163v-12q-74 1 -112 9.5t-61 28.5q-38 32 -38 103v179q0 53 -21.5 76.5t-85.5 39.5q64 16 85.5 39.5t21.5 76.5v179q0 82 50 113q42 28 161 29v-12q-60 -13 -83 -40t-23 -84v-171q0 -63 -23.5 -89t-94.5 -41q71 -15 94.5 -41t23.5 -89v-171q0 -57 23.5 -84t82.5 -39 z" />
+<glyph unicode="|" horiz-adv-x="220" d="M154 -19h-88v710h88v-710z" />
+<glyph unicode="}" horiz-adv-x="394" d="M265 557v-179q0 -53 21.5 -76.5t85.5 -39.5q-64 -16 -85.5 -39.5t-21.5 -76.5v-179q0 -82 -50 -113q-42 -28 -161 -29v12q60 13 83 40t23 84v171q0 62 24 88.5t94 41.5q-71 15 -94.5 41t-23.5 89v171q0 57 -23.5 84t-82.5 39v12q119 -1 161 -29q50 -31 50 -112z" />
+<glyph unicode="~" horiz-adv-x="520" d="M455 333l36 -70q-34 -47 -62 -66.5t-63 -19.5q-41 0 -103 33q-63 35 -113 35q-52 0 -85 -72l-36 70q26 45 54.5 65.5t68.5 20.5q41 0 134 -42q60 -26 81 -26q45 0 88 72z" />
+<glyph unicode="&#xa1;" horiz-adv-x="333" d="M251 417q0 -35 -24.5 -60t-59.5 -25t-60 25t-25 61q0 35 25 59t61 24q35 0 59 -24.5t24 -59.5zM153 254h29q10 -91 20 -143t32 -125q18 -58 18 -89q0 -47 -22.5 -73.5t-62.5 -26.5t-62 26.5t-22 74.5q0 30 18 88q37 121 52 268z" />
+<glyph unicode="&#xa2;" horiz-adv-x="500" d="M440 109l18 -18q-46 -58 -89 -81.5t-102 -23.5q-23 0 -50 7l-47 -133h-40l51 145q-39 19 -64 44q-64 66 -64 174q0 107 66 178.5t166 71.5q28 0 60 -8l44 123h40l-48 -136q63 -36 63 -88q0 -29 -18 -46.5t-48 -17.5q-25 0 -44 20l-82 -230q37 -37 83 -37q59 0 105 56z M321 397v3q0 18 -12 30t-31 12q-39 0 -61.5 -45.5t-22.5 -122.5q0 -80 31 -146z" />
+<glyph unicode="&#xa3;" horiz-adv-x="500" d="M454 183h23q-9 -107 -38 -149q-34 -50 -93 -50q-31 0 -57 13.5t-68 51.5q-48 -62 -112 -62q-42 0 -65 22t-23 63q0 92 106 92q23 0 51 -7q-2 43 -41 151h-98v65h80q-14 79 -14 118q0 47 21.5 90t57.5 69q49 34 124 34q70 0 110.5 -30.5t40.5 -82.5q0 -34 -18 -53t-50 -19 q-28 0 -45 18t-17 47q0 8 1 22.5t1 24.5q1 21 -11 32t-33 11q-25 0 -40.5 -17t-15.5 -45q0 -47 39 -219h114v-65h-109q2 -38 2 -54q0 -61 -20 -120q61 -22 96 -22q47 0 68.5 15t32.5 56zM181 86q-36 32 -72 32q-26 0 -41 -14t-15 -38q0 -22 15 -35.5t41 -13.5q28 0 45 16 t27 53z" />
+<glyph unicode="&#xa4;" horiz-adv-x="500" d="M526 48l-58 -58l-96 98q-60 -37 -122 -37t-122 37l-96 -98l-58 58l98 98q-37 56 -37 120q0 65 37 122l-98 98l58 56l96 -96q56 35 122 35t122 -35l96 96l58 -56l-98 -98q37 -59 37 -122q0 -69 -37 -120zM377 267q0 55 -37.5 93.5t-91.5 38.5q-52 0 -88.5 -39t-36.5 -93 q0 -56 36.5 -95t89.5 -39q54 0 91 39t37 95z" />
+<glyph unicode="&#xa5;" horiz-adv-x="500" d="M547 676v-26q-46 -4 -64 -37l-144 -271h111v-50h-131l-4 -11v-67h135v-50h-135v-49q0 -51 18.5 -68t80.5 -22v-25h-331v25q64 5 83 22t19 68v49h-135v50h135v57l-11 21h-124v50h99l-130 255q-24 49 -83 53v26h301v-26q-45 -2 -61 -7.5t-16 -21.5q0 -18 76 -167l57 -112 l119 230q8 15 8 35q0 24 -15 32.5t-63 10.5v26h205z" />
+<glyph unicode="&#xa6;" horiz-adv-x="220" d="M154 414h-88v277h88v-277zM154 -19h-88v277h88v-277z" />
+<glyph unicode="&#xa7;" horiz-adv-x="500" d="M186 415h13q-62 54 -81 82t-19 64q0 57 42 93.5t107 36.5q59 0 102 -30t43 -70q0 -25 -19.5 -44t-45.5 -19q-22 0 -41 18.5t-19 38.5q0 22 27 43q15 12 15 19q0 8 -16.5 14.5t-37.5 6.5q-37 0 -60 -19t-23 -50q0 -51 104 -119q100 -65 146 -143q20 -34 20 -82 q0 -56 -39 -86q-31 -24 -102 -25q55 -39 78.5 -72.5t23.5 -74.5q0 -56 -46 -92.5t-118 -36.5q-62 0 -106 29.5t-44 70.5q0 28 18 46.5t45 18.5q26 0 45.5 -16.5t19.5 -39.5t-31 -42q-15 -10 -15 -15q0 -11 20.5 -20t47.5 -9q79 0 79 71q0 23 -8 38t-29 32l-57 46 q-107 86 -137.5 125.5t-30.5 89.5q0 122 129 122zM367 225q0 37 -43 77q-96 90 -139 90q-23 0 -38 -15.5t-15 -40.5q0 -28 13 -46.5t60 -59.5q43 -38 64.5 -50.5t44.5 -12.5t38 16.5t15 41.5z" />
+<glyph unicode="&#xa8;" horiz-adv-x="333" d="M337 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM127 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#xa9;" horiz-adv-x="747" d="M544 256l-16 -74q-2 -15 -31 -23l-12 -3q-58 -14 -95 -14q-98 0 -156 53t-58 144q0 94 61.5 149.5t164.5 55.5q50 0 103 -19q22 -8 22 -21v-72h-19q-24 89 -107 89q-59 0 -91 -46t-32 -131q0 -86 32 -132.5t91 -46.5q42 0 71 21t53 70h19zM721 335q0 -150 -100 -252 t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251.5t252.5 101.5q143 0 242 -103.5t99 -252.5zM650 338q0 126 -81.5 213.5t-198.5 87.5q-112 0 -192.5 -89.5t-80.5 -214.5q0 -126 80.5 -214t196.5 -88q115 0 195.5 88.5t80.5 216.5z" />
+<glyph unicode="&#xaa;" horiz-adv-x="300" d="M291 443l10 -12q-33 -34 -73 -34q-24 0 -36 9t-17 32q-49 -41 -102 -41q-33 0 -53.5 18.5t-20.5 47.5q0 38 36.5 61t137.5 49v40q0 28 -11.5 40t-38.5 12q-17 0 -29 -6.5t-12 -15.5q0 -5 9 -14q11 -11 11 -21q0 -16 -13.5 -25.5t-34.5 -9.5q-42 0 -42 40q0 34 35 54.5 t94 20.5t93 -22t34 -60v-156q0 -15 11 -15l6 2zM172 465v87q-75 -22 -75 -73q0 -17 9 -28.5t23 -11.5q23 0 43 26z" />
+<glyph unicode="&#xab;" horiz-adv-x="500" d="M422 393l6 5q21 17 31 17q12 0 12 -11q0 -34 -93 -147q-16 -20 -23 -30q12 -18 40 -54q78 -101 78 -122q0 -15 -11 -15q-4 0 -29 16l-214 173v4zM226 393l6 5q21 17 31 17q12 0 12 -11q0 -33 -92 -147l-24 -30l40 -54q78 -92 78 -122q0 -15 -11 -15q-4 0 -29 16l-214 173 v4z" />
+<glyph unicode="&#xac;" d="M685 108h-88v203h-532v88h620v-291z" />
+<glyph unicode="&#xad;" horiz-adv-x="333" d="M287 171h-243v116h243v-116z" />
+<glyph unicode="&#xae;" horiz-adv-x="747" d="M563 153h-81q-12 0 -26 18t-37 63q-20 40 -49 86h-37v-105q0 -30 6 -36t40 -8v-18h-172v18q34 2 40 8t6 36v255q0 31 -6 37t-40 7v18h193q53 0 84 -26t31 -70q0 -73 -80 -105l58 -82q40 -56 70 -85v-11zM333 342h35q62 0 62 89q0 79 -61 79h-36v-168zM721 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251.5t252.5 101.5q143 0 242 -103.5t99 -252.5zM650 338q0 126 -81.5 213.5t-198.5 87.5q-112 0 -192.5 -89.5t-80.5 -214.5q0 -126 80.5 -214t196.5 -88q115 0 195.5 88.5t80.5 216.5z" />
+<glyph unicode="&#xaf;" horiz-adv-x="333" d="M331 565h-330v72h330v-72z" />
+<glyph unicode="&#xb0;" horiz-adv-x="400" d="M343 545q0 -59 -42 -101t-101 -42t-101 42t-42 101t42 101t101 42t101 -42t42 -101zM288 545q0 37 -25.5 62.5t-62.5 25.5t-62.5 -25.5t-25.5 -62.5t25.5 -62.5t62.5 -25.5t62.5 25.5t25.5 62.5z" />
+<glyph unicode="&#xb1;" horiz-adv-x="770" d="M685 209h-266v-221h-88v221h-266v88h266v221h88v-221h266v-88zM685 -151h-620v88h620v-88z" />
+<glyph unicode="&#xb2;" horiz-adv-x="300" d="M300 402l-30 -127h-270v14q112 111 148 161t36 94q0 32 -22 54t-53 22q-47 0 -76 -54h-24q49 122 144 122q52 0 85.5 -31t33.5 -80q0 -33 -17 -63t-57 -67l-99 -92h92q50 0 64.5 7.5t28.5 39.5h16z" />
+<glyph unicode="&#xb3;" horiz-adv-x="300" d="M36 590l-20 7q52 91 149 91q50 0 78 -21.5t28 -59.5q0 -27 -11.5 -43t-42.5 -33q80 -33 80 -107q0 -65 -56 -110.5t-138 -45.5q-46 0 -73 14.5t-27 39.5q0 28 40 41q23 -2 35 -8t32 -25q27 -26 49 -26q28 0 45.5 18t17.5 47q0 44 -29 71t-101 50v10q46 14 65 31.5 t19 47.5q0 28 -17.5 44.5t-47.5 16.5q-23 0 -39.5 -11t-35.5 -39z" />
+<glyph unicode="&#xb4;" horiz-adv-x="333" d="M86 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#xb5;" horiz-adv-x="556" d="M536 60v-24q-33 -30 -53.5 -39.5t-52.5 -9.5q-69 0 -101 52q-24 -29 -46 -40.5t-53 -11.5q-56 0 -102 35q4 -30 19 -81q14 -43 14 -70q0 -77 -63 -77q-31 0 -48 20t-17 57q0 16 10 57q23 95 23 160v373h139v-312q0 -33 16 -53.5t41 -20.5q32 0 74 27v359h139v-360 q0 -20 11.5 -33.5t28.5 -13.5q10 0 21 6z" />
+<glyph unicode="&#xb6;" horiz-adv-x="639" d="M579 651l-26 -2q-37 -3 -46.5 -10.5t-9.5 -39.5v-704q0 -31 9 -41t45 -13l23 -2v-25h-171v837h-50v-837h-175v25q56 5 68.5 13t12.5 39v374q-69 3 -110 28q-89 55 -89 188q0 101 53 148t166 47h300v-25zM259 290v361q-36 -9 -54.5 -21t-31.5 -35q-23 -38 -23 -112 q0 -154 109 -193z" />
+<glyph unicode="&#xb7;" horiz-adv-x="250" d="M210 332q0 -35 -24.5 -59.5t-60.5 -24.5t-60 24t-24 60q0 35 25 60t60 25q34 0 59 -25t25 -60z" />
+<glyph unicode="&#xb8;" horiz-adv-x="333" d="M201 0l-28 -64q15 5 32 5q42 0 65.5 -18.5t23.5 -51.5q0 -41 -35 -65t-94 -24q-46 0 -97 18l16 37l6 -2q36 -12 53 -12q58 0 58 41q0 36 -46 36q-13 0 -28 -4l-11 8l43 96h42z" />
+<glyph unicode="&#xb9;" horiz-adv-x="300" d="M273 275h-243v20q48 0 62.5 11.5t14.5 48.5v221q0 41 -23 41q-17 0 -43 -10l-13 -5v21l164 65h11v-337q0 -35 13 -45t57 -11v-20z" />
+<glyph unicode="&#xba;" horiz-adv-x="330" d="M312 542q0 -63 -41.5 -104t-104.5 -41q-65 0 -106.5 41t-41.5 105q0 63 42 104t107 41q62 0 103.5 -42t41.5 -104zM214 534q0 77 -10.5 105t-39.5 28q-28 0 -38.5 -28t-10.5 -102q0 -67 11 -93.5t39 -26.5q27 0 38 26.5t11 90.5z" />
+<glyph unicode="&#xbb;" horiz-adv-x="500" d="M477 222l-203 -164q-4 -4 -7 -5q-18 -17 -30 -17t-12 11q0 34 92 147l24 30q-22 32 -40 53q-78 93 -78 123q0 15 11 15q10 0 29 -16l214 -173v-4zM281 222l-203 -164l-6 -5q-19 -17 -31 -17t-12 11q0 34 93 147q16 20 23 30q-22 32 -40 53q-78 93 -78 123q0 15 11 15 q10 0 29 -16l214 -173v-4z" />
+<glyph unicode="&#xbc;" d="M273 275h-243v20q48 0 62.5 11.5t14.5 48.5v221q0 41 -23 41q-17 0 -43 -10l-13 -5v21l164 65h11v-337q0 -35 13 -45t57 -11v-20zM743 87h-41v-87h-94v87h-161v67q66 97 164 213l39 46h52v-260h41v-66zM609 153v175l-137 -175h137zM671 688l-439 -700h-58l441 700h56z " />
+<glyph unicode="&#xbd;" d="M775 127l-30 -127h-270v14l45 46q29 28 45 45.5t38.5 46.5t33 58t10.5 59q0 31 -17 54t-47 23q-46 0 -75 -55h-24q48 122 144 122q51 0 90 -30.5t39 -80.5q0 -12 -3 -24t-10 -24l-14 -20q-5 -9 -17.5 -22.5t-17.5 -18.5t-20 -19t-17 -16l-78 -73v-5h103q33 0 48 8.5 t28 38.5h16zM629 688l-439 -700h-58l441 700h56zM238 275h-243v20q31 0 44.5 2.5t23 16t9.5 41.5v221q0 41 -23 41q-20 0 -56 -15v21l164 65h11v-337q0 -37 14.5 -46t55.5 -10v-20z" />
+<glyph unicode="&#xbe;" d="M733 87h-41v-87h-94v87h-161v67q66 97 164 213l39 46h52v-260h41v-66zM599 153v175l-137 -175h137zM669 688l-439 -700h-58l441 700h56zM241 533v-4q76 -30 76 -105q0 -65 -56.5 -110.5t-137.5 -45.5q-46 0 -73 14.5t-27 39.5q0 28 40 41q21 -2 32.5 -8t34.5 -25 q30 -26 49 -26q28 0 45.5 18t17.5 47q0 44 -29 71t-101 50v10q46 14 65 31.5t19 47.5q0 28 -17.5 44.5t-47.5 16.5q-23 0 -39.5 -11t-35.5 -39l-20 7q52 91 149 91q50 0 78 -21.5t28 -59.5q0 -26 -11 -42.5t-39 -31.5z" />
+<glyph unicode="&#xbf;" horiz-adv-x="500" d="M346 417q0 -35 -25 -60t-61 -25q-34 0 -58.5 25t-24.5 60t24.5 59.5t59.5 24.5q36 0 60.5 -24.5t24.5 -59.5zM247 256h30q3 -25 3 -45q-1 -46 -38.5 -123.5t-37.5 -122.5q0 -58 22.5 -94t61.5 -36q28 0 44.5 11t16.5 29q0 13 -15 29q-22 25 -22 51q0 28 20.5 47.5 t44.5 19.5q29 0 47.5 -22.5t18.5 -55.5q0 -63 -51 -104t-133 -41q-93 0 -148.5 46.5t-55.5 119.5q0 52 26 87.5t95 78.5q47 29 59 49.5t12 75.5z" />
+<glyph unicode="&#xc0;" horiz-adv-x="722" d="M457 778h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28zM689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5 t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#xc1;" horiz-adv-x="722" d="M229 778l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522 q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#xc2;" horiz-adv-x="722" d="M511 778h-57l-112 98l-112 -98h-56l122 176h92zM689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236 l-101 243l-94 -243h195z" />
+<glyph unicode="&#xc3;" horiz-adv-x="722" d="M481 924h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38zM689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97 q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#xc4;" horiz-adv-x="722" d="M511 850q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM301 850q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5 q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#xc5;" horiz-adv-x="722" d="M448 895q0 -44 -31 -76t-75 -32q-45 0 -76 30.5t-31 75.5q0 44 32 75.5t76 31.5q43 0 74 -31t31 -74zM400 892q0 25 -18 42.5t-43 17.5q-22 0 -39 -17.5t-17 -40.5q0 -24 17 -41.5t40 -17.5q25 0 42.5 16.5t17.5 40.5zM689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5 q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#xc6;" horiz-adv-x="1000" d="M951 211l-41 -211h-566v25q55 3 71.5 20.5t16.5 73.5v184h-190l-100 -188q-15 -29 -15 -45q0 -21 13.5 -29.5t52.5 -13.5l17 -2v-25h-206v25q30 5 46 23t64 105l220 402q28 50 28 62q0 18 -19 26t-68 11v22h634v-201h-25q-16 80 -44 114q-42 52 -181 52q-40 0 -53.5 -6 t-13.5 -24v-248q88 7 111 29.5t44 119.5h23v-338h-23q-14 93 -42.5 122.5t-112.5 34.5v-243q0 -32 15.5 -43t58.5 -11q126 0 186 61q26 27 48 60.5t28 55.5h23zM432 343v290h-7l-161 -290h168z" />
+<glyph unicode="&#xc7;" horiz-adv-x="722" d="M657 152l30 -25q-70 -80 -134 -112.5t-152 -33.5l-20 -45q15 5 32 5q42 0 65.5 -18.5t23.5 -51.5q0 -41 -35 -65t-94 -24q-46 0 -97 18l16 37l6 -2q35 -12 53 -12q58 0 58 41q0 36 -46 36q-13 0 -28 -4l-11 8l35 79l-3 1q-136 13 -221.5 110t-85.5 238q0 154 99.5 256.5 t248.5 102.5q70 0 155 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-234h-25q-26 57 -47.5 88.5t-53.5 59.5q-63 56 -133 56q-91 0 -137.5 -80.5t-46.5 -236.5q0 -146 43 -225q22 -39 65.5 -63t92.5 -24q47 0 90 18q37 14 66.5 36.5t73.5 68.5z" />
+<glyph unicode="&#xc8;" horiz-adv-x="667" d="M452 778h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28zM641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26 q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54q25 20 42 46t40 77h28z" />
+<glyph unicode="&#xc9;" horiz-adv-x="667" d="M231 778l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5 t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54q25 20 42 46t40 77h28z" />
+<glyph unicode="&#xca;" horiz-adv-x="667" d="M511 778h-57l-112 98l-112 -98h-56l122 176h92zM641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5 v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54q25 20 42 46t40 77h28z" />
+<glyph unicode="&#xcb;" horiz-adv-x="667" d="M511 850q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM301 850q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM641 208l-40 -208h-585v25q54 6 71 21t17 55v479 q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54q25 20 42 46t40 77h28z" />
+<glyph unicode="&#xcc;" horiz-adv-x="389" d="M317 778h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28zM370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#xcd;" horiz-adv-x="389" d="M73 778l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#xce;" horiz-adv-x="389" d="M363 778h-57l-112 98l-112 -98h-56l122 176h92zM370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#xcf;" horiz-adv-x="389" d="M363 850q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM153 850q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19 v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#xd0;" horiz-adv-x="722" d="M14 676h305q174 0 272.5 -88t98.5 -243q0 -149 -90 -241q-47 -49 -118.5 -76.5t-151.5 -27.5h-316v25q43 1 63 17t20 49v235h-91v47h91v211q0 34 -17.5 48t-65.5 19v25zM259 326v-233q0 -34 12 -46t46 -12q98 0 149 72q50 73 50 223q0 132 -42 212q-54 100 -155 100 q-36 0 -48 -9.5t-12 -37.5v-222h114v-47h-114z" />
+<glyph unicode="&#xd1;" horiz-adv-x="722" d="M498 924h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38zM701 676v-25q-50 -8 -64 -22.5t-14 -60.5v-586h-28l-447 545v-396q0 -58 18 -78.5t76 -27.5 v-25h-226v25q55 7 71.5 22.5t16.5 61.5v470q-52 72 -85 72v25h211l349 -430v299q0 60 -18 80.5t-74 25.5v25h214z" />
+<glyph unicode="&#xd2;" horiz-adv-x="778" d="M503 778h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28zM743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5 t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#xd3;" horiz-adv-x="778" d="M267 778l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5 t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#xd4;" horiz-adv-x="778" d="M552 778h-57l-112 98l-112 -98h-56l122 176h92zM743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z " />
+<glyph unicode="&#xd5;" horiz-adv-x="778" d="M527 924h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38zM743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99 q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#xd6;" horiz-adv-x="778" d="M554 850q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM344 850q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99 t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#xd7;" horiz-adv-x="702" d="M636 29l-62 -62l-223 224l-223 -224l-62 62l223 224l-222 223l62 62l222 -223l223 223l62 -62l-223 -223z" />
+<glyph unicode="&#xd8;" horiz-adv-x="778" d="M685 737l-78 -115q65 -53 93 -106q43 -80 43 -180q0 -156 -99.5 -255.5t-254.5 -99.5q-99 0 -187 49l-71 -104h-50l86 126q-44 38 -66.5 68t-40.5 75q-25 65 -25 140q0 155 100 255.5t255 100.5q94 0 182 -47l63 93h50zM234 151l286 418q-26 48 -56.5 68.5t-74.5 20.5 q-85 0 -131 -85.5t-46 -244.5q0 -99 22 -177zM540 524l-287 -420q26 -48 57.5 -69t78.5 -21q87 0 132 80.5t45 236.5q0 109 -26 193z" />
+<glyph unicode="&#xd9;" horiz-adv-x="722" d="M479 778h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28zM701 676v-25q-48 -7 -63 -24t-15 -61v-314q0 -156 -76 -216q-68 -55 -184 -55t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23t-17.5 -78v-318 q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25h219z" />
+<glyph unicode="&#xda;" horiz-adv-x="722" d="M242 778l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM701 676v-25q-48 -7 -63 -24t-15 -61v-314q0 -156 -76 -216q-68 -55 -184 -55t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23 t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25h219z" />
+<glyph unicode="&#xdb;" horiz-adv-x="722" d="M530 778h-57l-112 98l-112 -98h-56l122 176h92zM701 676v-25q-48 -7 -63 -24t-15 -61v-314q0 -156 -76 -216q-68 -55 -184 -55t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222 v300q0 54 -20.5 74t-76.5 25v25h219z" />
+<glyph unicode="&#xdc;" horiz-adv-x="722" d="M533 850q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM323 850q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM701 676v-25q-48 -7 -63 -24t-15 -61v-314 q0 -156 -76 -216q-68 -55 -184 -55t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25h219z" />
+<glyph unicode="&#xdd;" horiz-adv-x="722" d="M249 778l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM699 676v-25q-49 -7 -68 -39l-191 -311v-178q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136l-180 328q-31 56 -83 59v25h335v-25l-27 -2q-32 -2 -43 -7.5 t-11 -21.5q0 -13 24 -59l120 -232l109 178q41 68 41 102q0 22 -16.5 30t-67.5 12v25h220z" />
+<glyph unicode="&#xde;" horiz-adv-x="611" d="M262 546h66q150 0 216 -55q56 -48 56 -128q0 -98 -88 -150q-41 -25 -86 -32t-164 -8v-56q0 -55 14.5 -69.5t73.5 -22.5v-25h-334v25l24 4q36 6 48 23.5t12 64.5v442q0 53 -16 70.5t-68 21.5v25h334v-25q-60 -8 -74 -23t-14 -70v-12zM262 476v-268q98 0 132 31t34 120 q0 82 -27 117t-89 35q-50 0 -50 -35z" />
+<glyph unicode="&#xdf;" horiz-adv-x="556" d="M70 87v420q0 81 58 132.5t149 51.5q86 0 142.5 -43.5t56.5 -110.5q0 -66 -61 -107q-34 -23 -95 -37q106 -31 147 -71q50 -47 50 -128q0 -86 -55 -146t-134 -60q-23 0 -64 15l14 34l10 -7q10 -7 21 -7q36 0 49 36.5t13 137.5q0 125 -39 157q-19 16 -63 19v34q43 1 56.5 25 t13.5 98q0 70 -16.5 101.5t-53.5 31.5q-60 0 -60 -77v-586h-190v24q32 5 41.5 16.5t9.5 46.5z" />
+<glyph unicode="&#xe0;" horiz-adv-x="500" d="M473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50 q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4zM293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40zM365 528h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28z" />
+<glyph unicode="&#xe1;" horiz-adv-x="500" d="M145 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22 q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4zM293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="&#xe2;" horiz-adv-x="500" d="M424 528h-57l-112 98l-112 -98h-56l122 176h92zM473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42 q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4zM293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="&#xe3;" horiz-adv-x="500" d="M394 674h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38zM473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69 q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4zM293 97 v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="&#xe4;" horiz-adv-x="500" d="M425 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM215 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5 t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261 q0 -28 21 -28q7 0 11 4zM293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="&#xe5;" horiz-adv-x="500" d="M362 647q0 -44 -31 -76t-75 -32q-45 0 -76 30.5t-31 75.5q0 44 32 75.5t76 31.5q43 0 74 -31t31 -74zM314 644q0 25 -18 42.5t-43 17.5q-22 0 -39 -17.5t-17 -40.5q0 -24 17 -41.5t40 -17.5q25 0 42.5 16.5t17.5 40.5zM473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5 t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261 q0 -28 21 -28q7 0 11 4zM293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="&#xe6;" horiz-adv-x="722" d="M673 129l21 -15q-44 -68 -91.5 -95.5t-118.5 -27.5q-101 0 -147 84h-6q-72 -89 -180 -89q-118 0 -118 108q0 55 59 105q50 42 204 86v75q0 44 -18 62.5t-60 18.5q-28 0 -46.5 -10t-18.5 -25q0 -9 12 -22q17 -20 17 -43q0 -28 -18.5 -45t-48.5 -17q-31 0 -48 19.5 t-17 49.5q0 54 52 89.5t132 35.5q95 0 140 -51q46 51 127 51q56 0 100 -26.5t66 -74.5q21 -45 21 -124h-254v-23q0 -85 26.5 -124.5t88.5 -39.5q69 0 124 68zM567 285v33q0 70 -14 97.5t-49 27.5q-38 0 -54 -37t-16 -121h133zM296 81v167q-66 -24 -92.5 -52.5t-26.5 -75.5 q0 -71 57 -71q31 0 62 32z" />
+<glyph unicode="&#xe7;" horiz-adv-x="444" d="M412 109l18 -18q-70 -95 -165 -104l-23 -51q15 5 32 5q42 0 65.5 -18.5t23.5 -51.5q0 -41 -35 -65t-94 -24q-46 0 -97 18l16 37l6 -2q35 -12 53 -12q58 0 58 41q0 36 -46 36q-13 0 -28 -4l-11 8l36 83q-87 6 -141.5 70t-54.5 165q0 110 68 180.5t169 70.5q66 0 110 -31 t44 -79q0 -29 -18.5 -46.5t-49.5 -17.5q-26 0 -41 19t-15 54q0 18 -0.5 26t-2.5 18.5t-6 15t-12.5 7.5t-20.5 3q-38 0 -61 -44.5t-23 -124.5q0 -102 37 -161t102 -59q58 0 107 56z" />
+<glyph unicode="&#xe8;" horiz-adv-x="444" d="M403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252q3 -42 8 -70.5t17 -57.5t35.5 -44t58.5 -15q32 0 58 15.5t57 52.5zM298 282v21q0 73 -9 92q-12 25 -23.5 36t-31.5 11 q-36 0 -53 -36.5t-17 -123.5h134zM360 528h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28z" />
+<glyph unicode="&#xe9;" horiz-adv-x="444" d="M124 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252q3 -42 8 -70.5t17 -57.5t35.5 -44 t58.5 -15q32 0 58 15.5t57 52.5zM298 282v21q0 73 -9 92q-12 25 -23.5 36t-31.5 11q-36 0 -53 -36.5t-17 -123.5h134z" />
+<glyph unicode="&#xea;" horiz-adv-x="444" d="M409 528h-57l-112 98l-112 -98h-56l122 176h92zM403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252q3 -42 8 -70.5t17 -57.5t35.5 -44t58.5 -15q32 0 58 15.5t57 52.5zM298 282v21 q0 73 -9 92q-12 25 -23.5 36t-31.5 11q-36 0 -53 -36.5t-17 -123.5h134z" />
+<glyph unicode="&#xeb;" horiz-adv-x="444" d="M411 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM201 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28 q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252q3 -42 8 -70.5t17 -57.5t35.5 -44t58.5 -15q32 0 58 15.5t57 52.5zM298 282v21q0 73 -9 92q-12 25 -23.5 36t-31.5 11q-36 0 -53 -36.5t-17 -123.5h134z" />
+<glyph unicode="&#xec;" horiz-adv-x="278" d="M257 528h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28zM256 0h-240v24q34 7 43.5 19t9.5 45v286q0 33 -10.5 44.5t-44.5 18.5v24h194v-376q0 -30 10.5 -43.5t37.5 -17.5v-24z" />
+<glyph unicode="&#xed;" horiz-adv-x="278" d="M256 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24zM20 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#xee;" horiz-adv-x="278" d="M308 528h-57l-112 98l-112 -98h-56l122 176h92zM212 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24z" />
+<glyph unicode="&#xef;" horiz-adv-x="278" d="M212 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24zM310 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM100 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19 t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#xf0;" horiz-adv-x="500" d="M427 661l-92 -47q46 -38 69 -67.5t41 -75.5q31 -77 31 -173q0 -148 -57.5 -230t-167.5 -82q-99 0 -162.5 66.5t-63.5 176.5q0 108 63.5 176t160.5 68q31 0 51 -9t40 -32l2 3q-26 79 -86 139l-110 -56l-48 31l117 59q-63 45 -133 58l46 25q88 -9 160 -46l90 46zM329 230 q0 119 -17.5 165.5t-61.5 46.5q-34 0 -53 -34q-25 -43 -25 -187q0 -44 2.5 -75.5t10 -63.5t24.5 -48.5t43 -16.5q44 0 60.5 46t16.5 167z" />
+<glyph unicode="&#xf1;" horiz-adv-x="556" d="M421 674h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38zM539 0h-234v24q25 3 35.5 16.5t10.5 43.5v237q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24 v-264q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h191v-75h1q49 87 142 87q62 0 98.5 -38.5t36.5 -103.5v-247q0 -34 10 -46t39 -14v-24z" />
+<glyph unicode="&#xf2;" horiz-adv-x="500" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5zM370 528h-56l-142 88q-40 25 -40 52 q0 19 13.5 32t33.5 13q29 0 54 -28z" />
+<glyph unicode="&#xf3;" horiz-adv-x="500" d="M132 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5 t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#xf4;" horiz-adv-x="500" d="M421 528h-57l-112 98l-112 -98h-56l122 176h92zM476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5 t17.5 156.5z" />
+<glyph unicode="&#xf5;" horiz-adv-x="500" d="M391 674h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38zM476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68 q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#xf6;" horiz-adv-x="500" d="M421 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM211 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5 t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#xf7;" horiz-adv-x="570" d="M362 461q0 -31 -23 -54t-53 -23q-31 0 -54 22.5t-23 53.5q0 32 22.5 54.5t54.5 22.5q30 0 53 -23t23 -53zM537 209h-504v88h504v-88zM362 47q0 -31 -23.5 -54.5t-53.5 -23.5t-53 23t-23 54t22.5 53.5t54.5 22.5q30 0 53 -23t23 -52z" />
+<glyph unicode="&#xf8;" horiz-adv-x="500" d="M461 549l-73 -123q88 -79 88 -197q0 -105 -64 -174t-161 -69q-56 0 -107 27l-63 -105h-47l76 128q-85 79 -85 193q0 105 64.5 174.5t162.5 69.5q53 0 103 -25l60 101h46zM173 140l143 242q-10 33 -24.5 46.5t-39.5 13.5q-47 0 -63.5 -48.5t-16.5 -184.5q0 -49 1 -69z M327 324l-144 -244q18 -63 68 -63q43 0 60.5 44.5t17.5 155.5q0 60 -2 107z" />
+<glyph unicode="&#xf9;" horiz-adv-x="556" d="M538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23zM393 528h-56l-142 88q-40 25 -40 52q0 19 13.5 32 t33.5 13q29 0 54 -28z" />
+<glyph unicode="&#xfa;" horiz-adv-x="556" d="M156 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47 t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z" />
+<glyph unicode="&#xfb;" horiz-adv-x="556" d="M443 528h-57l-112 98l-112 -98h-56l122 176h92zM538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z " />
+<glyph unicode="&#xfc;" horiz-adv-x="556" d="M443 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM233 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5 t-73.5 -14.5q-63 0 -98 38t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z" />
+<glyph unicode="&#xfd;" horiz-adv-x="500" d="M129 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM482 461v-24q-24 -3 -36 -13.5t-24 -41.5l-148 -398q-45 -121 -77 -156q-31 -33 -84 -33q-43 0 -70 22t-27 57q0 29 17 48t45 19q25 0 42.5 -15t17.5 -37q0 -4 -2 -14l-1 -6 q0 -7 5 -12t12 -5q38 0 66 82l18 53l-119 290q-49 121 -67 146q-8 10 -34 14v24h249v-24l-16 -1q-36 -3 -36 -25q0 -7 20 -58l72 -186l68 188q11 32 11 49q0 18 -11 25t-43 8v24h152z" />
+<glyph unicode="&#xfe;" horiz-adv-x="556" d="M214 676v-285q22 44 50.5 63t73.5 19q83 0 134.5 -64.5t51.5 -169.5q0 -111 -53.5 -181.5t-138.5 -70.5q-34 0 -58 12.5t-60 47.5v-141q0 -50 16 -69t62 -21v-21h-273v24q36 6 46 16.5t10 41.5v717q0 30 -10 40.5t-45 17.5v24h194zM214 346v-243q28 -61 79 -61 q83 0 83 187t-76 187q-37 0 -68 -37q-18 -21 -18 -33z" />
+<glyph unicode="&#xff;" horiz-adv-x="500" d="M416 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM206 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM482 461v-24q-24 -3 -36 -13.5t-24 -41.5l-148 -398 q-45 -121 -77 -156q-31 -33 -84 -33q-43 0 -70 22t-27 57q0 29 17 48t45 19q25 0 42.5 -15t17.5 -37q0 -4 -2 -14l-1 -6q0 -7 5 -12t12 -5q38 0 66 82l18 53l-119 290q-49 121 -67 146q-8 10 -34 14v24h249v-24l-16 -1q-36 -3 -36 -25q0 -7 20 -58l72 -186l68 188 q11 32 11 49q0 18 -11 25t-43 8v24h152z" />
+<glyph unicode="&#x100;" horiz-adv-x="722" d="M515 738h-330v72h330v-72zM689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243 h195z" />
+<glyph unicode="&#x101;" horiz-adv-x="500" d="M415 528h-330v72h330v-72zM473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17 q-31 0 -48 18t-17 50q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4zM293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="&#x102;" horiz-adv-x="722" d="M455 901h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28 t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#x103;" horiz-adv-x="500" d="M351 691h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68 q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4zM293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5 q42 0 70 40z" />
+<glyph unicode="&#x104;" horiz-adv-x="722" d="M560 0h-193v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25h-99q-1 -2 -3 -8q-11 -39 -11 -64q0 -35 14 -49.5 t47 -14.5q22 0 48 13q4 2 13 8l23 -16q-18 -34 -54 -54t-72 -20q-47 0 -75 21.5t-28 56.5q0 28 11.5 51.5t42.5 59.5q4 6 8 10zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#x105;" horiz-adv-x="500" d="M546 -115l23 -16q-18 -34 -54 -54t-72 -20q-47 0 -75 21.5t-28 56.5q0 28 11.5 51.5t42.5 59.5l3 3q-7 -1 -21 -1q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10 t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4l10 10l15 -21q-24 -27 -50 -42q-2 -3 -3 -9q-11 -39 -11 -64q0 -35 14 -49.5t47 -14.5q22 0 48 13q4 2 13 8z M293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="&#x106;" horiz-adv-x="722" d="M316 738l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM657 152l30 -25q-67 -83 -132.5 -114.5t-155.5 -31.5q-159 0 -254.5 96.5t-95.5 245.5q0 160 97.5 264t249.5 104q71 0 156 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25 q-22 62 -67 115q-75 90 -167 90q-81 0 -132.5 -83.5t-51.5 -229.5q0 -155 54 -240q22 -34 62.5 -55t84.5 -21q64 0 126 34q41 23 104 89z" />
+<glyph unicode="&#x107;" horiz-adv-x="444" d="M162 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM412 109l18 -18q-41 -56 -86 -80.5t-105 -24.5q-95 0 -154.5 65t-59.5 171q0 110 68 180.5t169 70.5q66 0 110 -31t44 -79q0 -29 -18.5 -46.5t-49.5 -17.5q-26 0 -41 19t-15 54 q0 18 -0.5 26t-2.5 18.5t-6 15t-12.5 7.5t-20.5 3q-38 0 -61 -44.5t-23 -124.5q0 -102 37 -161t102 -59q58 0 107 56z" />
+<glyph unicode="&#x108;" horiz-adv-x="722" d="M539 738h-57l-112 98l-112 -98h-56l122 176h92zM657 152l30 -25q-67 -83 -132.5 -114.5t-155.5 -31.5q-159 0 -254.5 96.5t-95.5 245.5q0 160 97.5 264t249.5 104q71 0 156 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25q-22 62 -67 115q-75 90 -167 90 q-81 0 -132.5 -83.5t-51.5 -229.5q0 -155 54 -240q22 -34 62.5 -55t84.5 -21q64 0 126 34q41 23 104 89z" />
+<glyph unicode="&#x109;" horiz-adv-x="444" d="M399 528h-57l-112 98l-112 -98h-56l122 176h92zM412 109l18 -18q-41 -56 -86 -80.5t-105 -24.5q-95 0 -154.5 65t-59.5 171q0 110 68 180.5t169 70.5q66 0 110 -31t44 -79q0 -29 -18.5 -46.5t-49.5 -17.5q-26 0 -41 19t-15 54q0 18 -0.5 26t-2.5 18.5t-6 15t-12.5 7.5 t-20.5 3q-38 0 -61 -44.5t-23 -124.5q0 -102 37 -161t102 -59q58 0 107 56z" />
+<glyph unicode="&#x10a;" horiz-adv-x="722" d="M435 810q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM657 152l30 -25q-67 -83 -132.5 -114.5t-155.5 -31.5q-159 0 -254.5 96.5t-95.5 245.5q0 160 97.5 264t249.5 104q71 0 156 -35q32 -14 46 -14t23.5 9.5t20.5 36.5 h27v-235h-25q-22 62 -67 115q-75 90 -167 90q-81 0 -132.5 -83.5t-51.5 -229.5q0 -155 54 -240q22 -34 62.5 -55t84.5 -21q64 0 126 34q41 23 104 89z" />
+<glyph unicode="&#x10b;" horiz-adv-x="444" d="M305 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM412 109l18 -18q-41 -56 -86 -80.5t-105 -24.5q-95 0 -154.5 65t-59.5 171q0 110 68 180.5t169 70.5q66 0 110 -31t44 -79q0 -29 -18.5 -46.5t-49.5 -17.5 q-26 0 -41 19t-15 54q0 18 -0.5 26t-2.5 18.5t-6 15t-12.5 7.5t-20.5 3q-38 0 -61 -44.5t-23 -124.5q0 -102 37 -161t102 -59q58 0 107 56z" />
+<glyph unicode="&#x10c;" horiz-adv-x="722" d="M564 914l-123 -176h-92l-122 176h57l111 -99l111 99h58zM657 152l30 -25q-67 -83 -132.5 -114.5t-155.5 -31.5q-159 0 -254.5 96.5t-95.5 245.5q0 160 97.5 264t249.5 104q71 0 156 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25q-22 62 -67 115q-75 90 -167 90 q-81 0 -132.5 -83.5t-51.5 -229.5q0 -155 54 -240q22 -34 62.5 -55t84.5 -21q64 0 126 34q41 23 104 89z" />
+<glyph unicode="&#x10d;" horiz-adv-x="444" d="M416 704l-123 -176h-92l-122 176h57l111 -99l111 99h58zM412 109l18 -18q-41 -56 -86 -80.5t-105 -24.5q-95 0 -154.5 65t-59.5 171q0 110 68 180.5t169 70.5q66 0 110 -31t44 -79q0 -29 -18.5 -46.5t-49.5 -17.5q-26 0 -41 19t-15 54q0 18 -0.5 26t-2.5 18.5t-6 15 t-12.5 7.5t-20.5 3q-38 0 -61 -44.5t-23 -124.5q0 -102 37 -161t102 -59q58 0 107 56z" />
+<glyph unicode="&#x10e;" horiz-adv-x="722" d="M484 914l-123 -176h-92l-122 176h57l111 -99l111 99h58zM14 676h312q171 0 267.5 -88t96.5 -243q0 -77 -30.5 -147t-84.5 -117q-93 -81 -252 -81h-309v25q43 1 63 19t20 54v486q0 34 -17.5 48t-65.5 19v25zM259 598v-498q0 -35 12.5 -50t45.5 -15q98 0 149 72 q23 33 36.5 94.5t13.5 128.5q0 139 -41 211q-58 101 -163 101q-53 0 -53 -44z" />
+<glyph unicode="&#x10f;" horiz-adv-x="680" d="M534 20l-62 -8q-82 -11 -133 -25v65q-35 -37 -64 -51.5t-69 -14.5q-79 0 -130 66t-51 169q0 109 54.5 180.5t137.5 71.5q34 0 60.5 -13.5t58.5 -48.5v183q0 35 -13 44.5t-63 13.5v24h215v-575q0 -32 12.5 -44t46.5 -14v-23zM336 112v243q-11 29 -32 45.5t-46 16.5 q-85 0 -85 -188q0 -187 78 -187q36 0 66 37q19 25 19 33zM544 374l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x110;" horiz-adv-x="722" d="M14 676h305q174 0 272.5 -88t98.5 -243q0 -149 -90 -241q-47 -49 -118.5 -76.5t-151.5 -27.5h-316v25q43 1 63 17t20 49v235h-91v47h91v211q0 34 -17.5 48t-65.5 19v25zM259 326v-233q0 -34 12 -46t46 -12q98 0 149 72q50 73 50 223q0 132 -42 212q-54 100 -155 100 q-36 0 -48 -9.5t-12 -37.5v-222h114v-47h-114z" />
+<glyph unicode="&#x111;" horiz-adv-x="556" d="M534 20l-62 -8q-82 -11 -133 -25v65q-35 -37 -64 -51.5t-69 -14.5q-79 0 -130 66t-51 169q0 109 54.5 180.5t137.5 71.5q34 0 60.5 -13.5t58.5 -48.5v106h-178v50h178v27q0 35 -13 44.5t-63 13.5v24h215v-109h53v-50h-53v-416q0 -32 12.5 -44t46.5 -14v-23zM336 112v243 q-11 29 -32 45.5t-46 16.5q-85 0 -85 -188q0 -186 78 -186q37 0 66 36q19 25 19 33z" />
+<glyph unicode="&#x112;" horiz-adv-x="667" d="M490 738h-330v72h330v-72zM641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44 t65.5 -12q117 0 182 54q25 20 42 46t40 77h28z" />
+<glyph unicode="&#x113;" horiz-adv-x="444" d="M395 528h-330v72h330v-72zM403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252q3 -42 8 -70.5t17 -57.5t35.5 -44t58.5 -15q32 0 58 15.5t57 52.5zM298 282v21q0 73 -9 92 q-12 25 -23.5 36t-31.5 11q-36 0 -53 -36.5t-17 -123.5h134z" />
+<glyph unicode="&#x114;" horiz-adv-x="667" d="M433 901h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42 v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54q25 20 42 46t40 77h28z" />
+<glyph unicode="&#x115;" horiz-adv-x="444" d="M338 691h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252 q3 -42 8 -70.5t17 -57.5t35.5 -44t58.5 -15q32 0 58 15.5t57 52.5zM298 282v21q0 73 -9 92q-12 25 -23.5 36t-31.5 11q-36 0 -53 -36.5t-17 -123.5h134z" />
+<glyph unicode="&#x116;" horiz-adv-x="667" d="M395 810q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225 q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54q25 20 42 46t40 77h28z" />
+<glyph unicode="&#x117;" horiz-adv-x="444" d="M295 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252q3 -42 8 -70.5 t17 -57.5t35.5 -44t58.5 -15q32 0 58 15.5t57 52.5zM298 282v21q0 73 -9 92q-12 25 -23.5 36t-31.5 11q-36 0 -53 -36.5t-17 -123.5h134z" />
+<glyph unicode="&#x118;" horiz-adv-x="667" d="M407 0h-391v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54q25 20 42 46 t40 77h28l-40 -208h-164q-1 -2 -3 -8q-11 -39 -11 -64q0 -35 14 -49.5t47 -14.5q22 0 48 13q4 2 13 8l23 -16q-18 -34 -54 -54t-72 -20q-47 0 -75 21.5t-28 56.5q0 28 11.5 51.5t42.5 59.5q5 6 9 10t5 6z" />
+<glyph unicode="&#x119;" horiz-adv-x="444" d="M412 -115l23 -16q-18 -34 -54 -54t-72 -20q-47 0 -75 21.5t-28 56.5q0 28 11.5 51.5t42.5 59.5l1 2q1 2 2 2q-22 -2 -34 -2q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252q3 -42 8 -70.5t17 -57.5t35.5 -44t58.5 -15 q32 0 58 15.5t57 52.5l24 -14q-59 -92 -124 -115q-1 -1 -1 -2.5t-1 -2.5q-11 -39 -11 -64q0 -35 14 -49.5t47 -14.5q22 0 48 13q4 2 13 8zM298 282v21q0 73 -9 92q-12 25 -23.5 36t-31.5 11q-36 0 -53 -36.5t-17 -123.5h134z" />
+<glyph unicode="&#x11a;" horiz-adv-x="667" d="M509 914l-123 -176h-92l-122 176h57l111 -99l111 99h58zM641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5 t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54q25 20 42 46t40 77h28z" />
+<glyph unicode="&#x11b;" horiz-adv-x="444" d="M402 704l-123 -176h-92l-122 176h57l111 -99l111 99h58zM403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252q3 -42 8 -70.5t17 -57.5t35.5 -44t58.5 -15q32 0 58 15.5t57 52.5z M298 282v21q0 73 -9 92q-12 25 -23.5 36t-31.5 11q-36 0 -53 -36.5t-17 -123.5h134z" />
+<glyph unicode="&#x11c;" horiz-adv-x="778" d="M569 738h-57l-112 98l-112 -98h-56l122 176h92zM755 287v-25q-53 -6 -69.5 -27.5t-16.5 -72.5v-118q-49 -29 -124 -46t-153 -17q-154 0 -254.5 96t-100.5 254q0 151 99.5 255.5t248.5 104.5q70 0 155 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25 q-29 63 -47.5 92.5t-48.5 56.5q-63 56 -138 56q-88 0 -136 -83t-48 -237q0 -157 48 -237q27 -45 63 -66t92 -21q96 0 96 85v89q0 40 -19.5 55t-82.5 19v25h344z" />
+<glyph unicode="&#x11d;" horiz-adv-x="500" d="M419 528h-57l-112 98l-112 -98h-56l122 176h92zM254 68h52q81 0 129 -32.5t48 -87.5q0 -71 -68.5 -112.5t-192.5 -41.5q-194 0 -194 92q0 61 96 75q-47 17 -64.5 35t-17.5 47q0 44 29 71.5t90 45.5q-55 15 -89.5 56t-34.5 96q0 73 56.5 117t146.5 44q52 0 112 -22h129 v-53h-80q40 -36 40 -98q0 -94 -92 -132q-24 -10 -41 -12t-86 -2q-30 0 -49.5 -13.5t-19.5 -35.5q0 -21 21 -29t80 -8zM306 312q0 70 -15.5 100t-51.5 30t-50.5 -29t-14.5 -102q0 -70 15 -99.5t51 -29.5t51 29.5t15 100.5zM315 -52h-164q-21 -17 -28 -28t-7 -27 q0 -67 134 -67q72 0 113 18.5t41 47.5q0 56 -89 56z" />
+<glyph unicode="&#x11e;" horiz-adv-x="778" d="M501 901h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM755 287v-25q-53 -6 -69.5 -27.5t-16.5 -72.5v-118q-49 -29 -124 -46t-153 -17q-154 0 -254.5 96t-100.5 254q0 151 99.5 255.5t248.5 104.5 q70 0 155 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25q-29 63 -47.5 92.5t-48.5 56.5q-63 56 -138 56q-88 0 -136 -83t-48 -237q0 -157 48 -237q27 -45 63 -66t92 -21q96 0 96 85v89q0 40 -19.5 55t-82.5 19v25h344z" />
+<glyph unicode="&#x11f;" horiz-adv-x="500" d="M354 691h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM254 68h52q81 0 129 -32.5t48 -87.5q0 -71 -68.5 -112.5t-192.5 -41.5q-194 0 -194 92q0 61 96 75q-47 17 -64.5 35t-17.5 47q0 44 29 71.5t90 45.5 q-55 15 -89.5 56t-34.5 96q0 73 56.5 117t146.5 44q52 0 112 -22h129v-53h-80q40 -36 40 -98q0 -94 -92 -132q-24 -10 -41 -12t-86 -2q-30 0 -49.5 -13.5t-19.5 -35.5q0 -21 21 -29t80 -8zM306 312q0 70 -15.5 100t-51.5 30t-50.5 -29t-14.5 -102q0 -70 15 -99.5t51 -29.5 t51 29.5t15 100.5zM315 -52h-164q-21 -17 -28 -28t-7 -27q0 -67 134 -67q72 0 113 18.5t41 47.5q0 56 -89 56z" />
+<glyph unicode="&#x120;" horiz-adv-x="778" d="M465 810q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM755 287v-25q-53 -6 -69.5 -27.5t-16.5 -72.5v-118q-49 -29 -124 -46t-153 -17q-154 0 -254.5 96t-100.5 254q0 151 99.5 255.5t248.5 104.5q70 0 155 -35 q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25q-29 63 -47.5 92.5t-48.5 56.5q-63 56 -138 56q-88 0 -136 -83t-48 -237q0 -157 48 -237q27 -45 63 -66t92 -21q96 0 96 85v89q0 40 -19.5 55t-82.5 19v25h344z" />
+<glyph unicode="&#x121;" horiz-adv-x="500" d="M315 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM254 68h52q81 0 129 -32.5t48 -87.5q0 -71 -68.5 -112.5t-192.5 -41.5q-194 0 -194 92q0 61 96 75q-47 17 -64.5 35t-17.5 47q0 44 29 71.5t90 45.5 q-55 15 -89.5 56t-34.5 96q0 73 56.5 117t146.5 44q52 0 112 -22h129v-53h-80q40 -36 40 -98q0 -94 -92 -132q-24 -10 -41 -12t-86 -2q-30 0 -49.5 -13.5t-19.5 -35.5q0 -21 21 -29t80 -8zM306 312q0 70 -15.5 100t-51.5 30t-50.5 -29t-14.5 -102q0 -70 15 -99.5t51 -29.5 t51 29.5t15 100.5zM315 -52h-164q-21 -17 -28 -28t-7 -27q0 -67 134 -67q72 0 113 18.5t41 47.5q0 56 -89 56z" />
+<glyph unicode="&#x122;" horiz-adv-x="778" d="M755 287v-25q-53 -6 -69.5 -27.5t-16.5 -72.5v-118q-49 -29 -124 -46t-153 -17q-154 0 -254.5 96t-100.5 254q0 151 99.5 255.5t248.5 104.5q70 0 155 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25q-29 63 -47.5 92.5t-48.5 56.5q-63 56 -138 56q-88 0 -136 -83 t-48 -237q0 -157 48 -237q27 -45 63 -66t92 -21q96 0 96 85v89q0 40 -19.5 55t-82.5 19v25h344zM317 -378l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x123;" horiz-adv-x="500" d="M312 863l11 -22q-109 -76 -109 -133q0 -21 19 -21q3 0 11 1t13 1q32 0 52.5 -21t20.5 -55q0 -39 -23 -62t-61 -23q-47 0 -73.5 31t-26.5 85q0 132 166 219zM254 68h52q81 0 129 -32.5t48 -87.5q0 -71 -68.5 -112.5t-192.5 -41.5q-194 0 -194 92q0 61 96 75 q-47 17 -64.5 35t-17.5 47q0 44 29 71.5t90 45.5q-55 15 -89.5 56t-34.5 96q0 73 56.5 117t146.5 44q52 0 112 -22h129v-53h-80q40 -36 40 -98q0 -94 -92 -132q-24 -10 -41 -12t-86 -2q-30 0 -49.5 -13.5t-19.5 -35.5q0 -21 21 -29t80 -8zM306 312q0 70 -15.5 100t-51.5 30 t-50.5 -29t-14.5 -102q0 -70 15 -99.5t51 -29.5t51 29.5t15 100.5zM315 -52h-164q-21 -17 -28 -28t-7 -27q0 -67 134 -67q72 0 113 18.5t41 47.5q0 56 -89 56z" />
+<glyph unicode="&#x124;" horiz-adv-x="778" d="M557 738h-57l-112 98l-112 -98h-56l122 176h92zM759 0h-339v25q54 6 71.5 20.5t17.5 52.5v228h-241v-228q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-204h241v204q0 41 -18 55.5 t-71 18.5v25h339v-25q-51 -4 -69.5 -19t-18.5 -55v-479q0 -39 16.5 -52.5t71.5 -20.5v-25z" />
+<glyph unicode="&#x125;" horiz-adv-x="556" d="M419 738h-57l-112 98l-112 -98h-56l122 176h92zM534 0h-234v24q25 3 35.5 16.5t10.5 44.5v224q0 54 -11 75.5t-40 21.5q-36 0 -70 -34q-17 -17 -17 -24v-263q0 -31 10 -44t38 -17v-24h-240v24q36 7 44.5 16t8.5 49v502q0 35 -9 44.5t-45 16.5v24h193v-280q65 77 147 77 q60 0 95 -38t35 -98v-250q0 -34 11.5 -48.5t37.5 -14.5v-24z" />
+<glyph unicode="&#x126;" horiz-adv-x="778" d="M759 0h-339v25q54 6 71.5 20.5t17.5 52.5v228h-241v-228q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v395h-85v47h85v37q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-37h241v37q0 41 -18 55.5t-71 18.5v25h339v-25q-51 -4 -69.5 -19 t-18.5 -55v-37h88v-47h-88v-395q0 -39 16.5 -52.5t71.5 -20.5v-25zM509 373v120h-241v-120h241z" />
+<glyph unicode="&#x127;" horiz-adv-x="556" d="M534 0h-234v24q25 3 35.5 16.5t10.5 44.5v224q0 54 -11 75.5t-40 21.5q-36 0 -70 -34q-17 -17 -17 -24v-263q0 -31 10 -44t38 -17v-24h-240v24q36 7 44.5 16t8.5 49v425h-54v44h54v33q0 35 -9 44.5t-45 16.5v24h193v-118h158v-44h-158v-118q65 77 147 77q60 0 95 -38 t35 -98v-250q0 -34 11.5 -48.5t37.5 -14.5v-24z" />
+<glyph unicode="&#x128;" horiz-adv-x="389" d="M336 884h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38zM370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5 t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x129;" horiz-adv-x="278" d="M275 674h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38zM256 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5 t37.5 -16.5v-24z" />
+<glyph unicode="&#x12a;" horiz-adv-x="389" d="M359 738h-330v72h330v-72zM370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x12b;" horiz-adv-x="278" d="M256 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24zM305 528h-330v72h330v-72z" />
+<glyph unicode="&#x12c;" horiz-adv-x="389" d="M298 900h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x12d;" horiz-adv-x="278" d="M248 691h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM256 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24z" />
+<glyph unicode="&#x12e;" horiz-adv-x="389" d="M228 0h-208v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25h-112q-1 -2 -3 -8q-11 -39 -11 -64q0 -35 14 -49.5t47 -14.5q22 0 48 13q4 2 13 8l23 -16q-18 -34 -54 -54t-72 -20 q-47 0 -75 21.5t-28 56.5q0 28 11.5 51.5t42.5 59.5q4 6 8 10z" />
+<glyph unicode="&#x12f;" horiz-adv-x="278" d="M160 0h-144v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24h-66q-1 -2 -3 -8q-11 -39 -11 -64q0 -35 14 -49.5t47 -14.5q22 0 48 13q4 2 13 8l23 -16q-18 -34 -54 -54t-72 -20q-47 0 -75 21.5t-28 56.5q0 28 11.5 51.5 t42.5 59.5q4 6 8 10zM215 613q0 -33 -22.5 -55t-55.5 -22t-55 22t-22 55t22.5 55.5t56.5 22.5q31 0 53.5 -23t22.5 -55z" />
+<glyph unicode="&#x130;" horiz-adv-x="389" d="M259 810q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x131;" horiz-adv-x="278" d="M256 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24z" />
+<glyph unicode="&#x134;" horiz-adv-x="500" d="M479 738h-57l-112 98l-112 -98h-56l122 176h92zM478 676v-25q-55 -4 -71.5 -22t-16.5 -73v-430q0 -222 -212 -222q-74 0 -108 23q-29 20 -48 50t-19 60q0 28 21.5 51t49.5 23t50 -23t22 -53q0 -15 -13.5 -34t-13.5 -32q0 -32 45 -32q34 0 49 21.5t15 68.5v550 q0 43 -20 57.5t-81 16.5v25h351z" />
+<glyph unicode="&#x135;" horiz-adv-x="333" d="M335 528h-57l-112 98l-112 -98h-56l122 176h92zM260 461v-459q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q25 0 36.5 18t11.5 58v474q0 32 -12.5 44t-50.5 15v24h202z " />
+<glyph unicode="&#x136;" horiz-adv-x="778" d="M769 0h-334v25q47 1 62 6t15 15q0 13 -25 45l-181 225l-27 -25v-196q0 -37 16.5 -50t70.5 -20v-25h-336v25q55 5 71 19t16 57v472q0 46 -17 60.5t-70 17.5v25h337v-25q-54 -4 -71 -20.5t-17 -63.5v-223l212 215q24 24 32 35t8 23q0 15 -10.5 22t-37.5 9l-35 3v25h289v-25 q-78 -9 -133 -46.5t-189 -180.5l305 -378q16 -20 49 -21v-25zM291 -378l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x137;" horiz-adv-x="556" d="M543 0h-234v24q42 2 42 19q0 12 -24 45l-95 134l-23 -24v-114q0 -35 8.5 -45t43.5 -15v-24h-239v24q48 4 48 60v510q0 54 -48 58v24h187v-431l128 128q21 21 21 38q0 18 -35 23l-24 4v23h214v-23q-47 -6 -80.5 -29t-108.5 -102l194 -268q11 -15 25 -15v-24zM202 -378 l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x138;" horiz-adv-x="600" d="M627 0h-168q-41 5 -89 76q-11 17 -26 46.5t-33 56.5q-25 39 -71 54q-5 -1 -27 -1v-145q0 -20 1 -28t5.5 -17.5t15 -13t29.5 -4.5v-24h-245v24q27 7 39 19t12 43v305q0 31 -12 42t-39 13v24h245v-24q-31 -5 -41 -14.5t-10 -41.5v-108q19 0 41 4q78 22 92 31q40 29 64 88 q15 37 36.5 51t62.5 14q32 0 56 -16t24 -40q0 -19 -14 -30.5t-35 -11.5q-19 0 -31 10t-19 20t-16 10q-12 0 -18 -6t-12 -22q-25 -73 -77 -112q22 -8 42 -34q12 -15 45.5 -70.5t41.5 -67.5q25 -37 52.5 -54t78.5 -22v-24z" />
+<glyph unicode="&#x139;" horiz-adv-x="667" d="M638 227l-42 -227h-577v25q55 7 70.5 20t15.5 53v478q0 42 -17.5 57t-68.5 18v25h348v-24q-65 -3 -82.5 -20t-17.5 -79v-464q0 -33 18.5 -45.5t66.5 -12.5q109 0 170 55q42 39 87 141h29zM158 738l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5 l-142 -88h-56z" />
+<glyph unicode="&#x13a;" horiz-adv-x="278" d="M22 738l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM256 0h-240v24q51 4 51 63v500q0 61 -52 65v24h191v-589q0 -33 12 -47.5t38 -15.5v-24z" />
+<glyph unicode="&#x13b;" horiz-adv-x="667" d="M638 227l-42 -227h-577v25q55 7 70.5 20t15.5 53v478q0 42 -17.5 57t-68.5 18v25h348v-24q-65 -3 -82.5 -20t-17.5 -79v-464q0 -33 18.5 -45.5t66.5 -12.5q109 0 170 55q42 39 87 141h29zM256 -378l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21 t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x13c;" horiz-adv-x="278" d="M256 0h-240v24q51 4 51 63v500q0 61 -52 65v24h191v-589q0 -33 12 -47.5t38 -15.5v-24zM66 -378l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x13d;" horiz-adv-x="667" d="M638 227l-42 -227h-577v25q55 7 70.5 20t15.5 53v478q0 42 -17.5 57t-68.5 18v25h348v-24q-65 -3 -82.5 -20t-17.5 -79v-464q0 -33 18.5 -45.5t66.5 -12.5q109 0 170 55q42 39 87 141h29zM447 356l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21 t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x13e;" horiz-adv-x="457" d="M256 0h-240v24q51 4 51 63v500q0 61 -52 65v24h191v-589q0 -33 12 -47.5t38 -15.5v-24zM276 374l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x13f;" horiz-adv-x="667" d="M638 227l-42 -227h-577v25q55 7 70.5 20t15.5 53v478q0 42 -17.5 57t-68.5 18v25h348v-24q-65 -3 -82.5 -20t-17.5 -79v-464q0 -33 18.5 -45.5t66.5 -12.5q109 0 170 55q42 39 87 141h29zM535 323q0 -35 -24.5 -59.5t-60.5 -24.5t-60 24t-24 60q0 35 25 60t60 25 q34 0 59 -25t25 -60z" />
+<glyph unicode="&#x140;" horiz-adv-x="414" d="M441 340q0 -35 -24.5 -59.5t-60.5 -24.5t-60 24t-24 60q0 35 25 60t60 25q34 0 59 -25t25 -60zM256 0h-240v24q51 4 51 63v500q0 61 -52 65v24h191v-589q0 -33 12 -47.5t38 -15.5v-24z" />
+<glyph unicode="&#x141;" horiz-adv-x="667" d="M638 228l-42 -228h-577v25q55 4 70.5 18.5t15.5 56.5v187l-81 -49v61l81 49v225q0 45 -17.5 60t-69.5 18v25h349v-25q-61 -3 -80.5 -22t-19.5 -77v-109l123 76v-61l-123 -76v-292q0 -33 16 -46t63 -13q122 0 177 52q34 32 86 145h29z" />
+<glyph unicode="&#x142;" horiz-adv-x="278" d="M303 481l-97 -80v-312q0 -63 50 -65v-24h-240v24q51 4 51 65v223l-89 -72v50l89 72v229q0 57 -52 61v24h191v-225l97 80v-50z" />
+<glyph unicode="&#x143;" horiz-adv-x="722" d="M294 738l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM701 676v-25q-50 -8 -64 -22.5t-14 -60.5v-586h-28l-447 545v-396q0 -58 18 -78.5t76 -27.5v-25h-226v25q55 7 71.5 22.5t16.5 61.5v470q-52 72 -85 72v25h211l349 -430v299 q0 60 -18 80.5t-74 25.5v25h214z" />
+<glyph unicode="&#x144;" horiz-adv-x="556" d="M212 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM539 0h-234v24q25 3 35.5 16.5t10.5 43.5v237q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24v-264q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44 t-43 17v24h191v-75h1q49 87 142 87q62 0 98.5 -38.5t36.5 -103.5v-247q0 -34 10 -46t39 -14v-24z" />
+<glyph unicode="&#x145;" horiz-adv-x="722" d="M701 676v-25q-50 -8 -64 -22.5t-14 -60.5v-586h-28l-447 545v-396q0 -58 18 -78.5t76 -27.5v-25h-226v25q55 7 71.5 22.5t16.5 61.5v470q-52 72 -85 72v25h211l349 -430v299q0 60 -18 80.5t-74 25.5v25h214zM286 -378l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1 t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x146;" horiz-adv-x="556" d="M539 0h-234v24q25 3 35.5 16.5t10.5 43.5v237q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24v-264q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h191v-75h1q49 87 142 87q62 0 98.5 -38.5t36.5 -103.5v-247q0 -34 10 -46t39 -14 v-24zM206 -378l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x147;" horiz-adv-x="722" d="M535 914l-123 -176h-92l-122 176h57l111 -99l111 99h58zM701 676v-25q-50 -8 -64 -22.5t-14 -60.5v-586h-28l-447 545v-396q0 -58 18 -78.5t76 -27.5v-25h-226v25q55 7 71.5 22.5t16.5 61.5v470q-52 72 -85 72v25h211l349 -430v299q0 60 -18 80.5t-74 25.5v25h214z" />
+<glyph unicode="&#x148;" horiz-adv-x="556" d="M450 704l-123 -176h-92l-122 176h57l111 -99l111 99h58zM539 0h-234v24q25 3 35.5 16.5t10.5 43.5v237q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24v-264q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h191v-75h1q49 87 142 87 q62 0 98.5 -38.5t36.5 -103.5v-247q0 -34 10 -46t39 -14v-24z" />
+<glyph unicode="&#x149;" horiz-adv-x="705" d="M693 0h-234v24q25 3 35.5 16.5t10.5 43.5v237q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24v-264q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h191v-75h1q49 87 142 87q62 0 98.5 -38.5t36.5 -103.5v-247q0 -34 10 -46t39 -14 v-24zM31 374l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x14a;" horiz-adv-x="732" d="M14 676h322q179 0 277.5 -96.5t98.5 -260.5q0 -107 -33.5 -201t-98 -154t-145.5 -60q-52 0 -93 37t-41 84q0 31 21.5 61.5t53.5 30.5q28 0 48 -22.5t20 -52.5q0 -23 -13.5 -39t-13.5 -27q0 -16 11 -27.5t31 -11.5q41 0 61.5 95t20.5 223q0 85 -16.5 165.5t-39.5 120.5 q-58 101 -163 101q-63 0 -63 -44v-598h-245v25q43 1 63 19t20 54v486q0 34 -17.5 48t-65.5 19v25z" />
+<glyph unicode="&#x14b;" horiz-adv-x="556" d="M490 331v-331q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q25 0 36.5 18t11.5 58v419q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24v-264q0 -29 10.5 -42.5t37.5 -17.5v-24 h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h191v-75h1q49 87 142 87q62 0 98.5 -38.5t36.5 -103.5z" />
+<glyph unicode="&#x14c;" horiz-adv-x="778" d="M550 738h-330v72h330v-72zM743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#x14d;" horiz-adv-x="500" d="M415 528h-330v72h330v-72zM476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#x14e;" horiz-adv-x="778" d="M498 901h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245 t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#x14f;" horiz-adv-x="500" d="M358 691h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176 t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#x150;" horiz-adv-x="778" d="M370 738l136 157q25 28 54 28q22 0 35 -12t13 -32q0 -17 -8 -28.5t-32 -26.5l-141 -86h-57zM170 738l136 157q25 28 54 28q22 0 35 -12t13 -32q0 -17 -8 -28.5t-32 -26.5l-141 -86h-57zM743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258 t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#x151;" horiz-adv-x="500" d="M238 528l136 157q25 28 54 28q22 0 35 -12t13 -32q0 -17 -8 -28.5t-32 -26.5l-141 -86h-57zM38 528l136 157q25 28 54 28q22 0 35 -12t13 -32q0 -17 -8 -28.5t-32 -26.5l-141 -86h-57zM476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177 t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#x152;" horiz-adv-x="1000" d="M981 211l-42 -211h-430q-71 0 -107 -3q-28 -2 -43 -2q-140 0 -226 72q-53 45 -82 114.5t-29 152.5q0 92 36 167.5t101 121.5q87 61 202 61q4 0 25.5 -2t58.5 -4t78 -2h417v-201h-26q-11 60 -26.5 89.5t-46.5 48.5q-47 28 -161 28q-30 0 -41.5 -5.5t-11.5 -20.5v-249 q80 2 105.5 27.5t45.5 120.5h23v-338h-23q-11 89 -41.5 121t-109.5 36v-250q0 -29 14.5 -38.5t57.5 -9.5q107 0 168 50q26 22 44.5 48.5t42.5 77.5h27zM472 212v291q0 92 -18 119q-21 30 -77 30q-185 0 -185 -332q0 -154 40 -224q39 -69 134 -69q63 0 86 32q12 16 16 47 t4 106z" />
+<glyph unicode="&#x153;" horiz-adv-x="722" d="M676 125l20 -16q-49 -70 -92 -96.5t-106 -26.5q-73 0 -115 48q-56 -48 -138 -48q-99 0 -161 67.5t-62 175.5q0 107 63.5 175.5t162.5 68.5q76 0 125 -49q36 28 63.5 38.5t65.5 10.5q114 0 162 -92q24 -45 29 -136h-249v-20q0 -167 113 -167q35 0 59.5 14t59.5 53z M571 282l-2 56q-2 56 -16 81t-44 25q-65 0 -65 -108v-54h127zM308 149v162q0 72 -16 102.5t-53 30.5q-41 0 -56.5 -41.5t-15.5 -153.5q0 -132 16 -182.5t59 -50.5q34 0 50 32t16 101z" />
+<glyph unicode="&#x154;" horiz-adv-x="722" d="M251 738l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM716 0h-205l-207 313h-28v-196q0 -54 14.5 -69t73.5 -23v-25h-338v25q59 7 73.5 22t14.5 73v431q0 59 -16.5 77.5t-71.5 22.5v25h308q296 0 296 -172q0 -76 -45 -118 q-42 -38 -112 -57l199 -282q15 -22 44 -22v-25zM276 597v-252q103 1 143 31t40 118q0 79 -30 113.5t-100 34.5q-29 0 -41 -10t-12 -35z" />
+<glyph unicode="&#x155;" horiz-adv-x="444" d="M83 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM218 461v-82q35 51 66 72.5t69 21.5q35 0 58 -22.5t23 -56.5q0 -30 -17.5 -49t-45.5 -19q-37 0 -60 38q-14 23 -28 23q-26 0 -43.5 -30t-17.5 -74v-177q0 -48 13.5 -63.5 t58.5 -18.5v-24h-265v24q33 6 43.5 17.5t10.5 42.5v289q0 35 -11 47t-44 17v24h190z" />
+<glyph unicode="&#x156;" horiz-adv-x="722" d="M716 0h-205l-207 313h-28v-196q0 -54 14.5 -69t73.5 -23v-25h-338v25q59 7 73.5 22t14.5 73v431q0 59 -16.5 77.5t-71.5 22.5v25h308q296 0 296 -172q0 -76 -45 -118q-42 -38 -112 -57l199 -282q15 -22 44 -22v-25zM276 597v-252q103 1 143 31t40 118q0 79 -30 113.5 t-100 34.5q-29 0 -41 -10t-12 -35zM306 -378l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x157;" horiz-adv-x="444" d="M218 461v-82q35 51 66 72.5t69 21.5q35 0 58 -22.5t23 -56.5q0 -30 -17.5 -49t-45.5 -19q-37 0 -60 38q-14 23 -28 23q-26 0 -43.5 -30t-17.5 -74v-177q0 -48 13.5 -63.5t58.5 -18.5v-24h-265v24q33 6 43.5 17.5t10.5 42.5v289q0 35 -11 47t-44 17v24h190zM128 -378 l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x158;" horiz-adv-x="722" d="M493 914l-123 -176h-92l-122 176h57l111 -99l111 99h58zM716 0h-205l-207 313h-28v-196q0 -54 14.5 -69t73.5 -23v-25h-338v25q59 7 73.5 22t14.5 73v431q0 59 -16.5 77.5t-71.5 22.5v25h308q296 0 296 -172q0 -76 -45 -118q-42 -38 -112 -57l199 -282q15 -22 44 -22v-25 zM276 597v-252q103 1 143 31t40 118q0 79 -30 113.5t-100 34.5q-29 0 -41 -10t-12 -35z" />
+<glyph unicode="&#x159;" horiz-adv-x="444" d="M388 704l-123 -176h-92l-122 176h57l111 -99l111 99h58zM218 461v-82q35 51 66 72.5t69 21.5q35 0 58 -22.5t23 -56.5q0 -30 -17.5 -49t-45.5 -19q-37 0 -60 38q-14 23 -28 23q-26 0 -43.5 -30t-17.5 -74v-177q0 -48 13.5 -63.5t58.5 -18.5v-24h-265v24q33 6 43.5 17.5 t10.5 42.5v289q0 35 -11 47t-44 17v24h190z" />
+<glyph unicode="&#x15a;" horiz-adv-x="556" d="M484 474h-28q-26 85 -70 130q-54 56 -123 56q-51 0 -80.5 -27.5t-29.5 -71.5q0 -36 21 -59t82 -55q18 -10 68.5 -35.5t79.5 -41.5q49 -27 79 -73.5t30 -102.5q0 -95 -68.5 -154t-179.5 -59q-61 0 -130 24q-31 10 -41 10q-12 0 -19 -7.5t-11 -26.5h-29v248h29 q23 -96 60 -143q57 -72 144 -72q58 0 92 30.5t34 82.5q0 48 -57 88q-25 18 -122 65q-89 43 -130 90t-41 120q0 95 58.5 148t160.5 53q55 0 117 -23q27 -9 42 -9q14 0 20.5 6.5t11.5 26.5h30v-218zM191 738l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5 l-142 -88h-56z" />
+<glyph unicode="&#x15b;" horiz-adv-x="389" d="M126 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM340 326h-25q-19 56 -47 82q-34 32 -75 32q-28 0 -47 -16.5t-19 -41.5q0 -26 22.5 -46.5t73.5 -41.5q75 -31 106.5 -67t31.5 -89q0 -67 -43 -109.5t-111 -42.5q-52 0 -108 23 q-15 6 -23 6q-11 0 -26 -28h-25v165h28q32 -132 137 -132q34 0 54.5 18t20.5 47q0 24 -22 44.5t-74 42.5q-75 32 -108.5 68.5t-33.5 86.5q0 63 44.5 104.5t112.5 41.5q34 0 78 -15q22 -7 31 -7q17 0 25 20h22v-145z" />
+<glyph unicode="&#x15c;" horiz-adv-x="556" d="M484 474h-28q-26 85 -70 130q-54 56 -123 56q-51 0 -80.5 -27.5t-29.5 -71.5q0 -36 21 -59t82 -55q18 -10 68.5 -35.5t79.5 -41.5q49 -27 79 -73.5t30 -102.5q0 -95 -68.5 -154t-179.5 -59q-61 0 -130 24q-31 10 -41 10q-12 0 -19 -7.5t-11 -26.5h-29v248h29 q23 -96 60 -143q57 -72 144 -72q58 0 92 30.5t34 82.5q0 48 -57 88q-25 18 -122 65q-89 43 -130 90t-41 120q0 95 58.5 148t160.5 53q55 0 117 -23q27 -9 42 -9q14 0 20.5 6.5t11.5 26.5h30v-218zM449 738h-57l-112 98l-112 -98h-56l122 176h92z" />
+<glyph unicode="&#x15d;" horiz-adv-x="389" d="M359 528h-57l-112 98l-112 -98h-56l122 176h92zM340 326h-25q-19 56 -47 82q-34 32 -75 32q-28 0 -47 -16.5t-19 -41.5q0 -26 22.5 -46.5t73.5 -41.5q75 -31 106.5 -67t31.5 -89q0 -67 -43 -109.5t-111 -42.5q-52 0 -108 23q-15 6 -23 6q-11 0 -26 -28h-25v165h28 q32 -132 137 -132q34 0 54.5 18t20.5 47q0 24 -22 44.5t-74 42.5q-75 32 -108.5 68.5t-33.5 86.5q0 63 44.5 104.5t112.5 41.5q34 0 78 -15q22 -7 31 -7q17 0 25 20h22v-145z" />
+<glyph unicode="&#x15e;" horiz-adv-x="556" d="M204 -96l35 78q-48 3 -104 23q-31 10 -41 10q-12 0 -19 -7.5t-11 -26.5h-29v248h29q23 -96 60 -143q57 -72 144 -72q58 0 92 30.5t34 82.5q0 48 -57 88q-25 18 -122 65q-89 43 -130 90t-41 120q0 95 58.5 148t160.5 53q55 0 117 -23q27 -9 42 -9q14 0 20.5 6.5t11.5 26.5 h30v-218h-28q-26 85 -70 130q-54 56 -123 56q-51 0 -80.5 -27.5t-29.5 -71.5q0 -36 21 -59t82 -55q18 -10 68.5 -35.5t79.5 -41.5q49 -27 79 -73.5t30 -102.5q0 -91 -64 -149.5t-168 -62.5l-20 -46q15 5 32 5q42 0 65.5 -18.5t23.5 -51.5q0 -41 -35 -65t-94 -24 q-46 0 -97 18l16 37l6 -2q36 -12 53 -12q58 0 58 41q0 36 -46 36q-13 0 -28 -4z" />
+<glyph unicode="&#x15f;" horiz-adv-x="389" d="M234 0l-28 -64q15 5 32 5q42 0 65.5 -18.5t23.5 -51.5q0 -41 -35 -65t-94 -24q-46 0 -97 18l16 37l6 -2q36 -12 53 -12q58 0 58 41q0 36 -46 36q-13 0 -28 -4l-11 8l43 96h42zM340 326h-25q-19 56 -47 82q-34 32 -75 32q-28 0 -47 -16.5t-19 -41.5q0 -26 22.5 -46.5 t73.5 -41.5q75 -31 106.5 -67t31.5 -89q0 -67 -43 -109.5t-111 -42.5q-52 0 -108 23q-15 6 -23 6q-11 0 -26 -28h-25v165h28q32 -132 137 -132q34 0 54.5 18t20.5 47q0 24 -22 44.5t-74 42.5q-75 32 -108.5 68.5t-33.5 86.5q0 63 44.5 104.5t112.5 41.5q34 0 78 -15 q22 -7 31 -7q17 0 25 20h22v-145z" />
+<glyph unicode="&#x160;" horiz-adv-x="556" d="M484 474h-28q-26 85 -70 130q-54 56 -123 56q-51 0 -80.5 -27.5t-29.5 -71.5q0 -36 21 -59t82 -55q18 -10 68.5 -35.5t79.5 -41.5q49 -27 79 -73.5t30 -102.5q0 -95 -68.5 -154t-179.5 -59q-61 0 -130 24q-31 10 -41 10q-12 0 -19 -7.5t-11 -26.5h-29v248h29 q23 -96 60 -143q57 -72 144 -72q58 0 92 30.5t34 82.5q0 48 -57 88q-25 18 -122 65q-89 43 -130 90t-41 120q0 95 58.5 148t160.5 53q55 0 117 -23q27 -9 42 -9q14 0 20.5 6.5t11.5 26.5h30v-218zM449 914l-123 -176h-92l-122 176h57l111 -99l111 99h58z" />
+<glyph unicode="&#x161;" horiz-adv-x="389" d="M359 704l-123 -176h-92l-122 176h57l111 -99l111 99h58zM340 326h-25q-19 56 -47 82q-34 32 -75 32q-28 0 -47 -16.5t-19 -41.5q0 -26 22.5 -46.5t73.5 -41.5q75 -31 106.5 -67t31.5 -89q0 -67 -43 -109.5t-111 -42.5q-52 0 -108 23q-15 6 -23 6q-11 0 -26 -28h-25v165 h28q32 -132 137 -132q34 0 54.5 18t20.5 47q0 24 -22 44.5t-74 42.5q-75 32 -108.5 68.5t-33.5 86.5q0 63 44.5 104.5t112.5 41.5q34 0 78 -15q22 -7 31 -7q17 0 25 20h22v-145z" />
+<glyph unicode="&#x162;" horiz-adv-x="667" d="M317 0h-161v25q64 5 80.5 20.5t16.5 71.5v527q-93 -3 -136.5 -41.5t-56.5 -127.5h-29l3 201h600l2 -201h-29q-13 89 -56.5 127.5t-135.5 41.5v-527q0 -57 16.5 -72t81.5 -20v-25h-154l-28 -64q15 5 32 5q42 0 65.5 -18.5t23.5 -51.5q0 -41 -35 -65t-94 -24q-46 0 -97 18 l16 37l6 -2q36 -12 53 -12q58 0 58 41q0 36 -46 36q-13 0 -28 -4l-11 8z" />
+<glyph unicode="&#x163;" horiz-adv-x="333" d="M112 -96l39 87q-37 8 -58 35t-21 69v322h-53v27q49 33 82 71.5t85 114.5h25v-169h95v-44h-95v-298q0 -60 39 -60q29 0 57 53l25 -11q-29 -59 -61 -85t-79 -28l-23 -52q15 5 32 5q42 0 65.5 -18.5t23.5 -51.5q0 -41 -35 -65t-94 -24q-46 0 -97 18l16 37l6 -2 q36 -12 53 -12q58 0 58 41q0 36 -46 36q-13 0 -28 -4z" />
+<glyph unicode="&#x164;" horiz-adv-x="667" d="M502 914l-123 -176h-92l-122 176h57l111 -99l111 99h58zM636 475h-29q-13 89 -56.5 127.5t-135.5 41.5v-527q0 -57 16.5 -72t81.5 -20v-25h-357v25q64 5 80.5 20.5t16.5 71.5v527q-93 -3 -136.5 -41.5t-56.5 -127.5h-29l3 201h600z" />
+<glyph unicode="&#x165;" horiz-adv-x="415" d="M279 374l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219zM307 112l25 -11q-31 -62 -64.5 -87.5t-83.5 -25.5q-52 0 -82 28.5t-30 78.5v322h-53v27q49 33 82 71.5t85 114.5h25 v-169h60v-44h-60v-298q0 -60 39 -60q29 0 57 53z" />
+<glyph unicode="&#x166;" horiz-adv-x="667" d="M636 475h-29q-13 89 -56.5 127.5t-135.5 41.5v-288h110v-34h-110v-205q0 -57 16.5 -72t81.5 -20v-25h-357v25q64 5 80.5 20.5t16.5 71.5v205h-114v34h114v288q-93 -3 -136.5 -41.5t-56.5 -127.5h-29l3 201h600z" />
+<glyph unicode="&#x167;" horiz-adv-x="333" d="M307 112l25 -11q-31 -62 -64.5 -87.5t-83.5 -25.5q-52 0 -82 28.5t-30 78.5v134h-55v56h55v132h-53v27q49 33 82 71.5t85 114.5h25v-169h95v-44h-95v-132h92v-56h-92v-110q0 -60 39 -60q29 0 57 53z" />
+<glyph unicode="&#x168;" horiz-adv-x="722" d="M530 886h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38zM701 676v-25q-48 -7 -63 -24t-15 -61v-314q0 -156 -76 -216q-68 -55 -184 -55t-185 54 q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25h219z" />
+<glyph unicode="&#x169;" horiz-adv-x="556" d="M405 674h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38zM538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38t-35 107 v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z" />
+<glyph unicode="&#x16a;" horiz-adv-x="722" d="M515 738h-330v72h330v-72zM701 676v-25q-48 -7 -63 -24t-15 -61v-314q0 -156 -76 -216q-68 -55 -184 -55t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74 t-76.5 25v25h219z" />
+<glyph unicode="&#x16b;" horiz-adv-x="556" d="M425 528h-330v72h330v-72zM538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z" />
+<glyph unicode="&#x16c;" horiz-adv-x="722" d="M478 901h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM701 676v-25q-48 -7 -63 -24t-15 -61v-314q0 -156 -76 -216q-68 -55 -184 -55t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25 q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25h219z" />
+<glyph unicode="&#x16d;" horiz-adv-x="556" d="M358 691h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67zM538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76 q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z" />
+<glyph unicode="&#x16e;" horiz-adv-x="722" d="M473 830q0 -44 -31 -76t-75 -32q-45 0 -76 30.5t-31 75.5q0 44 32 75.5t76 31.5q43 0 74 -31t31 -74zM425 827q0 25 -18 42.5t-43 17.5q-22 0 -39 -17.5t-17 -40.5q0 -24 17 -41.5t40 -17.5q25 0 42.5 16.5t17.5 40.5zM701 676v-25q-48 -7 -63 -24t-15 -61v-314 q0 -156 -76 -216q-68 -55 -184 -55t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25h219z" />
+<glyph unicode="&#x16f;" horiz-adv-x="556" d="M377 635q0 -44 -31 -76t-75 -32q-45 0 -76 30.5t-31 75.5q0 44 32 75.5t76 31.5q43 0 74 -31t31 -74zM329 632q0 25 -18 42.5t-43 17.5q-22 0 -39 -17.5t-17 -40.5q0 -24 17 -41.5t40 -17.5q25 0 42.5 16.5t17.5 40.5zM538 20l-63 -7q-83 -9 -132 -26v65 q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z" />
+<glyph unicode="&#x170;" horiz-adv-x="722" d="M354 738l136 157q25 28 54 28q22 0 35 -12t13 -32q0 -17 -8 -28.5t-32 -26.5l-141 -86h-57zM154 738l136 157q25 28 54 28q22 0 35 -12t13 -32q0 -17 -8 -28.5t-32 -26.5l-141 -86h-57zM701 676v-25q-48 -7 -63 -24t-15 -61v-314q0 -156 -76 -216q-68 -55 -184 -55 t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25h219z" />
+<glyph unicode="&#x171;" horiz-adv-x="556" d="M252 528l136 157q25 28 54 28q22 0 35 -12t13 -32q0 -17 -8 -28.5t-32 -26.5l-141 -86h-57zM52 528l136 157q25 28 54 28q22 0 35 -12t13 -32q0 -17 -8 -28.5t-32 -26.5l-141 -86h-57zM538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38 t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z" />
+<glyph unicode="&#x172;" horiz-adv-x="722" d="M423 -16l2 2q-33 -5 -62 -5q-116 0 -185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25h219v-25q-48 -7 -63 -24t-15 -61v-314q0 -156 -76 -216 q-30 -25 -82 -41q0 -1 -1 -3q-11 -39 -11 -64q0 -35 14 -49.5t47 -14.5q22 0 48 13q4 2 13 8l23 -16q-18 -34 -54 -54t-72 -20q-47 0 -75 21.5t-28 56.5q0 28 11.5 51.5t42.5 59.5z" />
+<glyph unicode="&#x173;" horiz-adv-x="556" d="M524 -115l23 -16q-18 -34 -54 -54t-72 -20q-47 0 -75 21.5t-28 56.5q0 28 11.5 51.5t42.5 59.5q4 6 8 10l6 6l33 12l-6 -20q-11 -39 -11 -64q0 -35 14 -49.5t47 -14.5q22 0 48 13q4 2 13 8zM538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5 q-63 0 -98 38t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z" />
+<glyph unicode="&#x174;" horiz-adv-x="1000" d="M683 738h-57l-112 98l-112 -98h-56l122 176h92zM981 676v-25q-50 -5 -69 -64l-200 -602h-27l-171 477l-186 -477h-28l-212 602q-13 37 -25 48t-44 16v25h294v-25q-39 -3 -51.5 -11.5t-12.5 -30.5q0 -13 7 -33l120 -364l118 308l-35 96q-12 32 -72 35v25h312v-25l-13 -1 q-33 -2 -46 -10t-13 -26q0 -13 14 -56l108 -336l112 343q7 20 7 42q0 23 -14.5 32.5t-54.5 11.5v25h182z" />
+<glyph unicode="&#x175;" horiz-adv-x="722" d="M546 528h-57l-112 98l-112 -98h-56l122 176h92zM707 461v-24q-19 -4 -29.5 -14.5t-20.5 -35.5l-155 -401h-23l-102 310l-125 -310h-24l-148 374q-19 47 -28.5 60t-28.5 17v24h222v-24q-38 -5 -38 -28q0 -12 39 -115l45 -118l68 171q-4 12 -6 19q-14 49 -22 58.5t-37 12.5 v24h234v-24q-28 -2 -38 -7t-10 -17q0 -14 27 -106q23 -79 34 -127l35 94q44 118 44 128q0 17 -10 24.5t-38 10.5v24h135z" />
+<glyph unicode="&#x176;" horiz-adv-x="722" d="M543 738h-57l-112 98l-112 -98h-56l122 176h92zM699 676v-25q-49 -7 -68 -39l-191 -311v-178q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136l-180 328q-31 56 -83 59v25h335v-25l-27 -2q-32 -2 -43 -7.5t-11 -21.5q0 -13 24 -59l120 -232l109 178 q41 68 41 102q0 22 -16.5 30t-67.5 12v25h220z" />
+<glyph unicode="&#x177;" horiz-adv-x="500" d="M419 528h-57l-112 98l-112 -98h-56l122 176h92zM482 461v-24q-24 -3 -36 -13.5t-24 -41.5l-148 -398q-45 -121 -77 -156q-31 -33 -84 -33q-43 0 -70 22t-27 57q0 29 17 48t45 19q25 0 42.5 -15t17.5 -37q0 -4 -2 -14l-1 -6q0 -7 5 -12t12 -5q38 0 66 82l18 53l-119 290 q-49 121 -67 146q-8 10 -34 14v24h249v-24l-16 -1q-36 -3 -36 -25q0 -7 20 -58l72 -186l68 188q11 32 11 49q0 18 -11 25t-43 8v24h152z" />
+<glyph unicode="&#x178;" horiz-adv-x="722" d="M529 810q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM319 810q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM699 676v-25q-49 -7 -68 -39l-191 -311v-178 q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136l-180 328q-31 56 -83 59v25h335v-25l-27 -2q-32 -2 -43 -7.5t-11 -21.5q0 -13 24 -59l120 -232l109 178q41 68 41 102q0 22 -16.5 30t-67.5 12v25h220z" />
+<glyph unicode="&#x179;" horiz-adv-x="667" d="M634 242l-27 -242h-579v16l382 623l-83 -1q-117 -2 -162 -32.5t-78 -136.5h-28l22 207h523v-16l-379 -625h83q145 0 202 40q27 19 45 45t26.5 47t26.5 75h26zM250 738l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#x17a;" horiz-adv-x="444" d="M152 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM420 160l-16 -160h-383v25l234 404q-106 0 -139 -19t-52 -91h-26l7 142h371v-26l-231 -403h29q61 0 91.5 12.5t55.5 46.5q20 30 31 69h28z" />
+<glyph unicode="&#x17b;" horiz-adv-x="667" d="M634 242l-27 -242h-579v16l382 623l-83 -1q-117 -2 -162 -32.5t-78 -136.5h-28l22 207h523v-16l-379 -625h83q145 0 202 40q27 19 45 45t26.5 47t26.5 75h26zM411 810q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x17c;" horiz-adv-x="444" d="M303 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM420 160l-16 -160h-383v25l234 404q-106 0 -139 -19t-52 -91h-26l7 142h371v-26l-231 -403h29q61 0 91.5 12.5t55.5 46.5q20 30 31 69h28z" />
+<glyph unicode="&#x17d;" horiz-adv-x="667" d="M634 242l-27 -242h-579v16l382 623l-83 -1q-117 -2 -162 -32.5t-78 -136.5h-28l22 207h523v-16l-379 -625h83q145 0 202 40q27 19 45 45t26.5 47t26.5 75h26zM519 914l-123 -176h-92l-122 176h57l111 -99l111 99h58z" />
+<glyph unicode="&#x17e;" horiz-adv-x="444" d="M401 704l-123 -176h-92l-122 176h57l111 -99l111 99h58zM420 160l-16 -160h-383v25l234 404q-106 0 -139 -19t-52 -91h-26l7 142h371v-26l-231 -403h29q61 0 91.5 12.5t55.5 46.5q20 30 31 69h28z" />
+<glyph unicode="&#x17f;" horiz-adv-x="333" d="M30 461h41q0 131 40 179q42 51 135 51q64 0 103.5 -28t39.5 -72q0 -28 -17 -46t-45 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-27 0 -38.5 -17.5t-11.5 -61.5v-474q0 -50 15 -66t67 -17v-24h-278v24q34 4 45.5 16.5t11.5 46.5v330h-41v44z" />
+<glyph unicode="&#x180;" horiz-adv-x="553" d="M206 515v-98q53 56 122 56q83 0 135.5 -65t52.5 -169q0 -113 -63 -183t-163 -70q-70 0 -132 57l-79 -56h-12v528h-95v46h95v39q0 29 -9.5 37t-45.5 15v24h194v-115h129v-46h-129zM206 360v-263q0 -36 19 -57.5t50 -21.5q94 0 94 203q0 198 -93 198q-25 0 -41 -13.5 t-29 -45.5z" />
+<glyph unicode="&#x188;" horiz-adv-x="568" d="M417 109l18 -18q-41 -56 -86 -80.5t-105 -24.5q-95 0 -154.5 65t-59.5 171q0 110 68 180.5t169 70.5q39 0 69 -11q0 18 5 38q7 30 36.5 53t64.5 23q54 0 93 -27t39 -74q0 -27 -17 -45t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -25 19q-64 0 -64 -55 v-55q35 -31 35 -72q0 -29 -18.5 -46.5t-49.5 -17.5q-26 0 -41 19t-15 54q0 18 -0.5 26t-2.5 18.5t-6 15t-12.5 7.5t-20.5 3q-38 0 -61 -44.5t-23 -124.5q0 -102 37 -161t102 -59q58 0 107 56z" />
+<glyph unicode="&#x190;" horiz-adv-x="610" d="M544 174l43 -12q-16 -50 -44 -84t-66 -51t-77.5 -24t-89.5 -7q-48 0 -92.5 9t-86.5 28.5t-67.5 56t-25.5 85.5q0 63 34 112t95 67q-62 33 -90 62.5t-28 82.5q0 47 24 84t63.5 58.5t85 33t92.5 11.5q65 0 110 -15q43 -14 74.5 -43t31.5 -62q0 -29 -14 -48.5t-43 -19.5 q-30 0 -45.5 18t-25.5 62q-12 55 -85 55q-114 0 -114 -159q0 -91 87 -91q25 0 61 5.5t49 5.5q22 0 38 -8t16 -25q0 -20 -26 -33.5t-51 -13.5q-6 0 -44.5 2.5t-46.5 2.5q-45 0 -69 -35t-24 -99q0 -120 137 -120q35 0 55 1t48.5 7t46.5 17t36 32t28 52z" />
+<glyph unicode="&#x192;" horiz-adv-x="500" d="M74 440h120q24 140 71 201q50 65 131 65q46 0 74 -21.5t28 -56.5q0 -26 -15.5 -43.5t-38.5 -17.5q-22 0 -37.5 13.5t-15.5 32.5q0 17 13 37q5 8 5 12q0 5 -7 9.5t-16 4.5q-64 0 -64 -146v-90h122v-46h-122q-15 -247 -22 -290q-20 -126 -73.5 -192.5t-133.5 -66.5 q-43 0 -68 21t-25 57q0 26 15 41.5t40 15.5q23 0 38 -13.5t15 -35.5q0 -14 -11 -28q-7 -8 -7 -12q0 -7 6.5 -11.5t15.5 -4.5q28 0 46 31t19 82l13 406h-116v46z" />
+<glyph unicode="&#x195;" horiz-adv-x="797" d="M484 337v-211q0 -33 22 -59.5t53 -26.5q67 0 110 61.5t43 131.5q0 46 -14 79.5t-27 45t-33 23.5q-21 13 -30 23t-9 25q0 17 14 26.5t35 9.5q33 0 58 -24.5t37.5 -60.5t18 -68t5.5 -57q0 -106 -61.5 -185.5t-169.5 -79.5q-83 0 -137 36t-54 110v188q0 44 -12 63t-39 19 q-36 0 -70 -34q-17 -17 -17 -24v-263q0 -31 10 -44t38 -17v-24h-240v24q36 7 44.5 16t8.5 49v502q0 35 -9 44.5t-45 16.5v24h193v-280q65 77 147 77q60 0 95 -38t35 -98z" />
+<glyph unicode="&#x199;" horiz-adv-x="533" d="M533 0h-234v24q42 2 42 19q0 12 -24 45l-95 134l-23 -24v-114q0 -35 8.5 -45t43.5 -15v-24h-239v24q48 4 48 60v402q0 105 41 154q42 51 135 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-26 0 -38.5 -16 t-12.5 -55v-344l128 128q21 21 21 38q0 19 -35 23l-24 3v24h214v-24q-48 -6 -81.5 -29t-107.5 -101l194 -268q11 -15 25 -15v-24z" />
+<glyph unicode="&#x19a;" horiz-adv-x="291" d="M265 0h-240v24q51 4 51 63v253h-49v46h49v201q0 61 -52 65v24h191v-290h48v-46h-48v-253q0 -33 12 -47.5t38 -15.5v-24z" />
+<glyph unicode="&#x19b;" horiz-adv-x="536" d="M526 0h-152v24q32 1 43 8t11 25q0 17 -11 49l-68 188l-72 -186q-20 -51 -20 -58q0 -22 36 -25l16 -1v-24h-249v24q26 4 34 14q18 25 67 146l119 290l-9 24l-192 -157v67l174 140q-26 61 -57 61q-7 0 -12 -5t-5 -12q0 -2 1.5 -9.5t1.5 -10.5q0 -22 -17.5 -37t-42.5 -15 q-28 0 -45 19t-17 48q0 35 27 57t70 22q46 0 74 -24t49 -72l114 96v-68l-93 -76l165 -443q12 -31 24 -41.5t36 -13.5v-24z" />
+<glyph unicode="&#x19e;" horiz-adv-x="559" d="M539 -205h-234v24q25 3 35.5 16.5t10.5 43.5v442q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24v-264q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h191v-75h1q49 87 142 87q62 0 98.5 -38.5t36.5 -103.5v-452q0 -34 10 -46 t39 -14v-24z" />
+<glyph unicode="&#x1a0;" horiz-adv-x="778" d="M659 579h-5q89 -99 89 -244q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q139 0 234 -86q20 -4 30 -4q30 0 43 5t13 21q-41 25 -41 56q0 17 15 33t38 16q26 0 44 -18t18 -49q0 -32 -20 -53t-52 -28q-22 -5 -57 -5zM566 328 q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#x1a1;" horiz-adv-x="554" d="M576 438q0 -32 -20 -53t-52 -28q-22 -5 -56 -5q28 -56 28 -123q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q55 0 102.5 -25.5t75.5 -69.5q16 -4 20 -4q50 0 50 26q-41 25 -41 56q0 17 15 33t38 16q26 0 44 -18t18 -49zM329 218 q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#x1a5;" horiz-adv-x="550" d="M205 568v-173q24 43 54.5 60.5t74.5 17.5q85 0 133 -57.5t48 -166.5q0 -118 -51.5 -190t-140.5 -72q-34 0 -58 12.5t-60 47.5v-126q0 -52 16.5 -76t60.5 -26v-24h-272v24q35 6 45.5 18.5t10.5 44.5v597q0 94 40 143q42 51 135 51q64 0 103 -28t39 -72q0 -28 -17 -46 t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-27 0 -38.5 -17.5t-11.5 -56.5zM205 346v-239q12 -29 32.5 -47t44.5 -18q85 0 85 192q0 182 -76 182q-37 0 -68 -37q-18 -21 -18 -33z" />
+<glyph unicode="&#x1aa;" horiz-adv-x="446" d="M307 424l-40 -429q-3 -34 -3 -96q0 -97 45 -97q9 0 16 4.5t7 9.5q0 3 -9 18.5t-9 29.5q0 19 15 33t38 14q24 0 39 -17.5t15 -43.5q0 -36 -29.5 -57t-81.5 -21q-84 0 -130.5 52.5t-46.5 137.5q0 37 2 59l36 364q2 15 4.5 46t2.5 35q-16 -6 -44 -6q-45 0 -77 33.5t-32 80.5 q0 46 36.5 80.5t86.5 34.5q75 0 118 -58.5t43 -134.5q0 -48 -2 -72zM190 573q0 25 -18 42.5t-42 17.5t-40.5 -17.5t-16.5 -41.5q0 -23 17 -40.5t41 -17.5q25 0 42 17t17 40z" />
+<glyph unicode="&#x1ab;" horiz-adv-x="347" d="M331 101v-186q0 -54 -28.5 -93.5t-87.5 -39.5q-62 0 -92.5 27t-30.5 73q0 28 17 46t44 18q25 0 42.5 -17t17.5 -40q0 -20 -11 -36.5t-11 -20.5q0 -19 29 -19q24 0 45.5 19.5t21.5 59.5v141q-38 -45 -104 -45q-52 0 -82 28.5t-30 78.5v322h-53v27q49 33 82 71.5t85 114.5 h25v-169h95v-44h-95v-298q0 -60 39 -60q29 0 57 53z" />
+<glyph unicode="&#x1ad;" horiz-adv-x="371" d="M19 417v27q27 17 53 42q2 106 40 154q42 51 135 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-27 0 -38.5 -17.5t-11.5 -61.5v-120h95v-44h-95v-298q0 -60 39 -60q29 0 57 53l25 -11q-31 -62 -64.5 -87.5 t-83.5 -25.5q-52 0 -82 28.5t-30 78.5v322h-53z" />
+<glyph unicode="&#x1af;" horiz-adv-x="796" d="M482 676h222q57 0 58 29q-41 25 -41 56q0 20 15.5 34.5t39.5 14.5t42 -16.5t18 -48.5q0 -63 -80 -83q-2 0 -68 -13q-40 -7 -52.5 -24t-12.5 -59v-314q0 -156 -76 -216q-68 -55 -184 -55t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25 q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25z" />
+<glyph unicode="&#x1b0;" horiz-adv-x="600" d="M551 485l-1 8l-8 5q-5 4 -7.5 5.5t-6.5 5t-6 5.5t-5 6t-4 8.5t-2 10t-1 11.5q0 16 15.5 31t38.5 15q26 0 44 -16.5t18 -47.5q0 -68 -72 -87q-27 -8 -62 -8h-11v-332q0 -33 12 -47t45 -15v-23l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38 t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h205q24 0 44 6t21 18z" />
+<glyph unicode="&#x1ba;" horiz-adv-x="441" d="M415 423l-192 -167q15 4 44 4q67 0 107.5 -35t40.5 -90q0 -31 -20.5 -62.5t-50.5 -48.5l-157 -90q-49 -28 -49 -75q0 -25 23.5 -42t50.5 -17q25 0 45 14t24 36q12 67 67 67q30 0 44.5 -15t14.5 -35q0 -43 -47 -71q-56 -33 -141 -33q-67 0 -113 29q-55 36 -55 100 q0 42 19.5 69.5t58.5 51.5q29 18 126 70q33 19 33 58q0 26 -24.5 40.5t-60.5 14.5q-62 0 -109 -47l-27 24l230 204h-189q-20 0 -44 -23.5t-29 -59.5h-26l34 156h372v-27z" />
+<glyph unicode="&#x1bb;" horiz-adv-x="515" d="M492 314h-135q-20 -23 -25 -27l-162 -154h167q56 0 82 14t44 64h25l-46 -211h-415v23l49 53q41 42 57 60l45 52q30 35 51 65t38 61h-235v62h265q13 36 13 71q0 55 -32 91t-87 36q-78 0 -122 -90h-28q67 204 223 204q83 0 132.5 -50t49.5 -133q0 -70 -39 -129h85v-62z" />
+<glyph unicode="&#x1be;" horiz-adv-x="527" d="M225 438l2 -47q14 2 31 2q87 0 139 -64.5t52 -145.5q0 -88 -60 -140.5t-154 -52.5q-53 0 -102 27q-55 31 -55 79q0 17 14 32.5t39 15.5q55 0 71 -60l8 -25q2 -8 8 -19.5t15.5 -16t22.5 -4.5q19 0 32.5 16t19.5 41t9 48t3 45q0 57 -36.5 91.5t-83.5 34.5h-32v143h-64v46 h64v57h52l3 -57h111v-46h-109z" />
+<glyph unicode="&#x1c0;" horiz-adv-x="186" d="M126 0h-66v740h66v-740z" />
+<glyph unicode="&#x1c1;" horiz-adv-x="313" d="M126 0h-66v740h66v-740zM253 0h-66v740h66v-740z" />
+<glyph unicode="&#x1c2;" horiz-adv-x="445" d="M405 260h-148v-260h-66v260h-152v66h152v84h-152v66h152v264h66v-264h148v-66h-148v-84h148v-66z" />
+<glyph unicode="&#x1c3;" horiz-adv-x="333" d="M182 234h-31q-10 92 -19.5 143t-31.5 123q-18 57 -18 89q0 48 23.5 75t61.5 27q40 0 62 -26.5t22 -73.5q0 -33 -18 -91q-22 -71 -31.5 -122t-19.5 -144zM250 70q0 -36 -24 -59.5t-60 -23.5q-35 0 -60 24.5t-25 59.5q0 37 23.5 61t60.5 24q36 0 60.5 -24.5t24.5 -61.5z " />
+<glyph unicode="&#x1f0;" horiz-adv-x="333" d="M335 704l-123 -176h-92l-122 176h57l111 -99l111 99h58zM260 461v-459q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q25 0 36.5 18t11.5 58v474q0 32 -12.5 44t-50.5 15v24 h202z" />
+<glyph unicode="&#x1fa;" horiz-adv-x="722" d="M374 651l205 -483q38 -90 58.5 -116.5t51.5 -26.5v-25h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l205 506q-27 9 -43.5 32.5t-16.5 53.5q0 36 27 63t65 27 q35 0 62 -26.5t27 -62.5q0 -29 -17 -53t-43 -34zM384 236l-101 243l-94 -243h195zM386 736q0 18 -11.5 30.5t-32.5 12.5q-18 0 -29.5 -12.5t-11.5 -29.5t12.5 -30t28.5 -13q18 0 31 12.5t13 29.5zM228 825l146 125q25 22 44 22q32 0 32 -33q0 -7 -2 -12t-9.5 -10.5t-13 -9 t-20.5 -11.5l-132 -71h-45z" />
+<glyph unicode="&#x1fb;" horiz-adv-x="500" d="M357 635q0 -44 -31 -76t-75 -32q-45 0 -76 30.5t-31 75.5q0 44 32 75.5t76 31.5q43 0 74 -31t31 -74zM309 632q0 25 -18 42.5t-43 17.5q-22 0 -39 -17.5t-17 -40.5q0 -24 17 -41.5t40 -17.5q25 0 42.5 16.5t17.5 40.5zM122 738l137 157q25 28 53 28q22 0 35 -12t13 -32 q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42 q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4zM293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="&#x1fc;" horiz-adv-x="1000" d="M951 211l-41 -211h-566v25q55 3 71.5 20.5t16.5 73.5v184h-190l-100 -188q-15 -29 -15 -45q0 -21 13.5 -29.5t52.5 -13.5l17 -2v-25h-206v25q30 5 46 23t64 105l220 402q28 50 28 62q0 18 -19 26t-68 11v22h634v-201h-25q-16 80 -44 114q-42 52 -181 52q-40 0 -53.5 -6 t-13.5 -24v-248q88 7 111 29.5t44 119.5h23v-338h-23q-14 93 -42.5 122.5t-112.5 34.5v-243q0 -32 15.5 -43t58.5 -11q126 0 186 61q26 27 48 60.5t28 55.5h23zM432 343v290h-7l-161 -290h168zM476 738l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5 l-142 -88h-56z" />
+<glyph unicode="&#x1fd;" horiz-adv-x="722" d="M673 129l21 -15q-44 -68 -91.5 -95.5t-118.5 -27.5q-101 0 -147 84h-6q-72 -89 -180 -89q-118 0 -118 108q0 55 59 105q50 42 204 86v75q0 44 -18 62.5t-60 18.5q-28 0 -46.5 -10t-18.5 -25q0 -9 12 -22q17 -20 17 -43q0 -28 -18.5 -45t-48.5 -17q-31 0 -48 19.5 t-17 49.5q0 54 52 89.5t132 35.5q95 0 140 -51q46 51 127 51q56 0 100 -26.5t66 -74.5q21 -45 21 -124h-254v-23q0 -85 26.5 -124.5t88.5 -39.5q69 0 124 68zM567 285v33q0 70 -14 97.5t-49 27.5q-38 0 -54 -37t-16 -121h133zM296 81v167q-66 -24 -92.5 -52.5t-26.5 -75.5 q0 -71 57 -71q31 0 62 32zM255 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#x1fe;" horiz-adv-x="778" d="M685 737l-78 -115q65 -53 93 -106q43 -80 43 -180q0 -156 -99.5 -255.5t-254.5 -99.5q-99 0 -187 49l-71 -104h-50l86 126q-44 38 -66.5 68t-40.5 75q-25 65 -25 140q0 155 100 255.5t255 100.5q94 0 182 -47l63 93h50zM234 151l286 418q-26 48 -56.5 68.5t-74.5 20.5 q-85 0 -131 -85.5t-46 -244.5q0 -99 22 -177zM540 524l-287 -420q26 -48 57.5 -69t78.5 -21q87 0 132 80.5t45 236.5q0 109 -26 193zM270 738l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#x1ff;" horiz-adv-x="500" d="M461 549l-73 -123q88 -79 88 -197q0 -105 -64 -174t-161 -69q-56 0 -107 27l-63 -105h-47l76 128q-85 79 -85 193q0 105 64.5 174.5t162.5 69.5q53 0 103 -25l60 101h46zM173 140l143 242q-10 33 -24.5 46.5t-39.5 13.5q-47 0 -63.5 -48.5t-16.5 -184.5q0 -49 1 -69z M327 324l-144 -244q18 -63 68 -63q43 0 60.5 44.5t17.5 155.5q0 60 -2 107zM131 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#x237;" horiz-adv-x="333" d="M260 461v-459q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q25 0 36.5 18t11.5 58v474q0 32 -12.5 44t-50.5 15v24h202z" />
+<glyph unicode="&#x250;" horiz-adv-x="512" d="M28 395l-15 21q53 57 112 57q37 0 55.5 -15.5t26.5 -53.5q76 69 159 69q50 0 80 -26.5t30 -79.5q0 -67 -67 -112q-50 -33 -201 -76v-68q0 -49 18.5 -71t62.5 -22q28 0 46.5 10t18.5 27q0 11 -11 23q-19 23 -19 42q0 26 19 43t49 17q31 0 48 -18t17 -50q0 -59 -52.5 -92.5 t-138.5 -33.5q-92 0 -144 35t-52 99v261q0 28 -21 28q-7 0 -11 -4zM208 362v-148q122 34 122 121q0 32 -14.5 49.5t-37.5 17.5q-42 0 -70 -40z" />
+<glyph unicode="&#x251;" horiz-adv-x="608" d="M594 50l-194 -58v53q-1 -1 -10 -9t-15 -12.5t-20 -12.5t-27 -13t-32.5 -8.5t-40.5 -3.5t-44 3.5t-56.5 17.5t-59.5 37.5t-44.5 68.5t-18.5 104q0 105 69.5 180.5t176.5 75.5q67 0 122 -46l106 46h14v-388q0 -25 15 -25q6 0 59 7v-17zM400 109v231q0 47 -32.5 74t-68.5 27 q-49 0 -86.5 -47t-37.5 -141q0 -105 42.5 -157t103.5 -52q25 0 52 19.5t27 45.5z" />
+<glyph unicode="&#x252;" horiz-adv-x="608" d="M226 467v-53q1 1 10 9t15 12.5t20 12.5t27 13t32.5 8.5t40.5 3.5t44 -3.5t56.5 -17.5t59.5 -37.5t44.5 -68.5t18.5 -104q0 -105 -69.5 -180.5t-176.5 -75.5q-67 0 -122 46l-106 -46h-14v388q0 25 -15 25q-6 0 -59 -7v17zM226 350v-231q0 -47 32.5 -74t68.5 -27 q49 0 86.5 47t37.5 141q0 105 -42.5 157t-103.5 52q-25 0 -52 -19.5t-27 -45.5z" />
+<glyph unicode="&#x253;" horiz-adv-x="560" d="M213 586v-169q53 56 122 56q83 0 135.5 -65t52.5 -169q0 -113 -63 -183t-163 -70q-70 0 -132 57l-79 -56h-12v479q0 126 40 174q42 51 135 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-26 0 -38 -17 t-12 -57zM213 360v-263q0 -36 19 -57.5t50 -21.5q94 0 94 203q0 198 -93 198q-25 0 -41 -13.5t-29 -45.5z" />
+<glyph unicode="&#x254;" horiz-adv-x="472" d="M33 350l-18 18q41 56 86 80.5t105 24.5q95 0 154.5 -65t59.5 -171q0 -110 -68 -180.5t-169 -70.5q-66 0 -110 31t-44 79q0 29 18.5 46.5t49.5 17.5q26 0 41 -19t15 -54q0 -18 0.5 -26t2.5 -18.5t6 -15t12.5 -7.5t20.5 -3q38 0 61 44.5t23 124.5q0 102 -37 161t-102 59 q-58 0 -107 -56z" />
+<glyph unicode="&#x255;" horiz-adv-x="477" d="M107 -161l77 156q-52 14 -91 53q-63 63 -63 174q0 110 68 180.5t169 70.5q66 0 110 -31t44 -79q0 -29 -18.5 -46.5t-49.5 -17.5q-26 0 -41 19t-15 54q0 18 -0.5 26t-2.5 18.5t-6 15t-12.5 7.5t-20.5 3q-38 0 -61 -44.5t-23 -124.5q0 -128 56 -195q25 37 36.5 51t33.5 26 t51 12q44 0 70.5 -23t26.5 -60q0 -44 -34 -74.5t-97 -30.5q-67 0 -86 4l-73 -144h-48zM401 84q0 21 -16 32t-37 11q-24 0 -43 -17t-45 -59q13 -11 36.5 -19.5t36.5 -8.5q68 0 68 61z" />
+<glyph unicode="&#x256;" horiz-adv-x="602" d="M482 676v-799q0 -44 11.5 -61.5t38.5 -17.5q29 0 29 19q0 4 -11 20.5t-11 36.5q0 23 17.5 40t42.5 17q27 0 44 -18t17 -46q0 -44 -39 -72t-103 -28q-93 0 -135 51q-40 48 -40 175v59q-36 -38 -63.5 -52t-66.5 -14q-79 0 -130 66t-51 169q0 109 54.5 180.5t137.5 71.5 q34 0 60.5 -13.5t58.5 -48.5v183q0 35 -13 44.5t-63 13.5v24h215zM343 112v243q-11 29 -32 45.5t-46 16.5q-85 0 -85 -188q0 -187 78 -187q36 0 66 37q19 25 19 33z" />
+<glyph unicode="&#x257;" horiz-adv-x="650" d="M343 411v64q0 109 40 157q42 51 135 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-26 0 -38 -15t-12 -52v-484q0 -32 12.5 -44t46.5 -14v-23l-62 -8q-82 -11 -133 -25v65q-35 -37 -64 -51.5t-69 -14.5 q-79 0 -130 66t-51 169q0 109 54.5 180.5t137.5 71.5q34 0 60.5 -13.5t58.5 -48.5zM343 112v243q-11 29 -32 45.5t-46 16.5q-85 0 -85 -188q0 -187 78 -187q36 0 66 37q19 25 19 33z" />
+<glyph unicode="&#x258;" horiz-adv-x="457" d="M283 245h-252q6 120 59 178q45 50 128 50q94 0 151.5 -68.5t57.5 -180.5q0 -103 -57 -170.5t-147 -67.5q-65 0 -109.5 28t-88.5 98l24 14q31 -37 57 -52.5t58 -15.5q35 0 58.5 15t35.5 44t17 57.5t8 70.5zM154 282h134q0 87 -17 123.5t-53 36.5q-20 0 -31.5 -11 t-23.5 -36q-9 -19 -9 -92v-21z" />
+<glyph unicode="&#x259;" horiz-adv-x="457" d="M43 333l-24 14q44 70 88.5 98t109.5 28q90 0 147 -67.5t57 -170.5q0 -112 -57.5 -180.5t-151.5 -68.5q-83 0 -128 50q-53 58 -59 178h252q-3 42 -8 70.5t-17 57.5t-35.5 44t-58.5 15q-32 0 -58 -15.5t-57 -52.5zM282 177h-134v-21q0 -73 9 -92q12 -25 23.5 -36t31.5 -11 q36 0 53 36.5t17 123.5z" />
+<glyph unicode="&#x25a;" horiz-adv-x="688" d="M677 289l-11 -27q-10 -25 -32.5 -41t-50.5 -16q-40 0 -61.5 21.5t-21.5 61.5q0 86 1 93l-72 -43q14 -45 14 -103q0 -112 -57.5 -180.5t-151.5 -68.5q-83 0 -128 50q-25 28 -39 64t-15 62l252 146q-11 42 -45 67.5t-79 25.5q-32 0 -58 -15.5t-57 -52.5l-24 14 q46 74 91 100t107 26q112 0 172 -103l118 71l13 -12q-5 -85 -5 -140q0 -20 13 -33.5t32 -13.5q22 0 36 12t19 23l10 25zM304 178v88l-129 -75v-53q0 -121 61 -121q68 0 68 161z" />
+<glyph unicode="&#x25b;" horiz-adv-x="493" d="M416 102l23 -18q-44 -61 -94 -79.5t-119 -18.5q-81 0 -141 34.5t-60 102.5q0 44 33 78.5t85 48.5q-47 21 -69 45t-22 63q0 115 189 117q45 0 80 -10t64.5 -35t29.5 -49q0 -51 -50 -51q-28 0 -41.5 14.5t-29.5 55.5q-15 38 -56 38q-36 0 -51 -20.5t-15 -67.5 q0 -29 22 -50.5t48 -29.5q16 -5 52 -6v-37h-53q-36 0 -56.5 -26.5t-20.5 -71.5q0 -42 25.5 -68t65.5 -26q52 0 89 13.5t72 53.5z" />
+<glyph unicode="&#x25c;" horiz-adv-x="493" d="M170 227v37q36 1 52 6q26 8 48 29.5t22 50.5q0 47 -15 67.5t-51 20.5q-41 0 -56 -38q-16 -41 -29.5 -55.5t-41.5 -14.5q-50 0 -50 51q0 24 29.5 49t64.5 35t80 10q189 -2 189 -117q0 -39 -22 -63t-69 -45q52 -14 85 -48.5t33 -78.5q0 -68 -60 -102.5t-141 -34.5 q-69 0 -119 18.5t-94 79.5l23 18q35 -40 72 -53.5t89 -13.5q40 0 65.5 26t25.5 68q0 45 -20.5 71.5t-56.5 26.5h-53z" />
+<glyph unicode="&#x25d;" horiz-adv-x="683" d="M658 289l-11 -27q-10 -25 -32.5 -41t-50.5 -16q-40 0 -61.5 21.5t-21.5 61.5q0 86 1 93l-72 -44q-6 -30 -27.5 -49.5t-61.5 -37.5q52 -14 85.5 -49t33.5 -78q0 -68 -60.5 -102.5t-141.5 -34.5q-68 0 -119 19t-94 79l23 18q35 -40 72 -53.5t89 -13.5q40 0 65.5 26t25.5 68 q0 45 -20.5 71.5t-56.5 26.5h-53v37q36 1 52 6q26 8 48 29.5t22 50.5q0 48 -15 68t-53 20q-39 0 -54 -38q-16 -41 -29.5 -55.5t-41.5 -14.5q-50 0 -50 51q0 24 29.5 49t64.5 35t80 10q169 -2 187 -94l100 60l13 -12q-5 -85 -5 -140q0 -20 13 -33.5t32 -13.5q22 0 36 12 t19 23l10 25z" />
+<glyph unicode="&#x25e;" horiz-adv-x="523" d="M469 123q0 -69 -60.5 -103t-152.5 -34q-33 0 -68 10t-74 34.5t-64 77t-25 125.5q0 108 65 175t155 67q197 0 197 -117q0 -39 -22 -63t-69 -45q52 -14 85 -48.5t33 -78.5zM200 227v37q36 1 52 6q26 8 48 29.5t22 50.5q0 48 -15 68t-53 20q-64 0 -111.5 -56.5t-47.5 -139.5 q0 -91 42.5 -149t101.5 -58q40 0 65 26t25 68q0 45 -20 71.5t-56 26.5h-53z" />
+<glyph unicode="&#x25f;" horiz-adv-x="338" d="M314 461v-24q-51 0 -51 -60v-123h48v-46h-48v-206q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q25 0 36.5 18t11.5 58v304h-101v46h101v123q0 32 -12.5 45.5t-50.5 14.5 v24h253z" />
+<glyph unicode="&#x260;" horiz-adv-x="627" d="M345 -68v110q-44 -56 -123 -56t-132 63.5t-53 169.5q0 108 61.5 181t160.5 73q47 0 86 -22q0 132 40 181q42 51 135 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-27 0 -38.5 -17.5t-11.5 -61.5v-591 q0 -26 -7.5 -62t-19.5 -56q-62 -109 -206 -109q-88 0 -141 28q-55 29 -55 82q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -14 22.5 -20.5t44.5 -6.5q53 0 89 50t36 96zM345 98v256q0 41 -18.5 64t-48.5 23q-44 0 -69.5 -51t-25.5 -154 q0 -98 25 -147t68 -49q28 0 48.5 15.5t20.5 42.5z" />
+<glyph unicode="&#x261;" horiz-adv-x="571" d="M484 472v-490q0 -26 -7.5 -62t-19.5 -56q-62 -109 -206 -109q-88 0 -141 28q-55 29 -55 82q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -14 22.5 -20.5t44.5 -6.5q53 0 89 50t36 96v110q-44 -56 -123 -56t-132 63.5t-53 169.5 q0 108 61.5 181t160.5 73q38 0 66 -12t66 -44l77 55h16zM345 98v256q0 41 -18.5 64t-48.5 23q-44 0 -69.5 -51t-25.5 -154q0 -98 25 -147t68 -49q28 0 48.5 15.5t20.5 42.5z" />
+<glyph unicode="&#x262;" horiz-adv-x="590" d="M555 192v-16q-38 -4 -50 -18.5t-12 -48.5v-78q-76 -42 -200 -42q-112 0 -185 63.5t-73 168.5q0 100 72.5 170t179.5 70q47 0 114 -24q18 -9 31 -9q11 0 18 6t16 25h19v-156h-18q-21 40 -34.5 59.5t-35.5 39.5q-43 37 -100 37q-64 0 -99.5 -55t-35.5 -157t37 -159t112 -57 q68 0 68 56v59q0 27 -13.5 37.5t-59.5 12.5v16h249z" />
+<glyph unicode="&#x263;" horiz-adv-x="532" d="M507 437h-13q-21 0 -42 -58l-107 -291l43 -106q32 -78 32 -109q0 -47 -35 -76.5t-86 -29.5q-115 0 -115 91q0 22 21 70l33 73l-128 312q-20 48 -49 106q-7 15 -37 18v24h249v-24q-52 0 -52 -24q0 -11 31 -88l61 -158l66 183q13 35 13 55q0 9 -2.5 15t-9 9.5t-9.5 4.5 t-12.5 2.5t-10.5 1.5v23h159v-24zM270 -67l-19 -47q-8 -20 -8 -36q0 -44 31 -44q26 0 26 34q0 22 -7 39z" />
+<glyph unicode="&#x264;" horiz-adv-x="514" d="M275 263l95 142q29 45 62 45t49 -23.5t16 -57.5q0 -29 -13 -68h-10q-17 53 -47 53q-31 0 -50 -30l-70 -108l43 -72q27 -44 27 -75q0 -38 -40.5 -58.5t-82.5 -20.5q-40 0 -67.5 21.5t-27.5 60.5q0 29 24 63l37 52l-60 93q-2 4 -10 16l-14 21q-5 8 -13.5 17.5t-17.5 14.5 t-18 5q-29 0 -48 -53h-10q-12 31 -12 56q0 37 24 64.5t60 27.5q54 0 104 -78zM290 57q0 16 -38 78q-2 -2 -6.5 -8.5t-5.5 -8.5l-6 -8q-4 -5 -5.5 -8t-4 -8.5t-3 -9.5t-1.5 -9.5t-1 -11.5q0 -17 10 -28.5t27 -11.5q14 0 24 10.5t10 23.5z" />
+<glyph unicode="&#x265;" horiz-adv-x="550" d="M536 -226h-193v280q-65 -77 -147 -77q-60 0 -95 38t-35 98v250q0 34 -11.5 48.5t-37.5 14.5v24h234v-24q-25 -3 -35.5 -16.5t-10.5 -44.5v-224q0 -54 11 -75.5t40 -21.5q36 0 70 34q17 17 17 24v263q0 31 -10 44t-38 17v24h240v-24q-36 -7 -44.5 -16t-8.5 -49v-502 q0 -35 9 -44.5t45 -16.5v-24z" />
+<glyph unicode="&#x266;" horiz-adv-x="550" d="M532 0h-234v24q25 3 35.5 16.5t10.5 44.5v224q0 54 -11 75.5t-40 21.5q-36 0 -70 -34q-17 -17 -17 -24v-263q0 -31 10 -44t38 -17v-24h-240v24q36 7 44.5 16t8.5 49v393q0 102 40 150q42 51 135 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40 q0 20 11 36.5t11 20.5q0 19 -29 19q-26 0 -38 -15t-12 -52v-189q65 77 147 77q60 0 95 -38t35 -98v-250q0 -34 11.5 -48.5t37.5 -14.5v-24z" />
+<glyph unicode="&#x267;" horiz-adv-x="556" d="M485 337v-337q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q48 0 48 65v418q0 54 -11 75.5t-40 21.5q-36 0 -70 -34q-17 -17 -17 -24v-263q0 -31 10 -44t38 -17v-24h-240 v24q36 7 44.5 16t8.5 49v393q0 102 40 150q42 51 135 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-26 0 -38 -15t-12 -52v-189q65 77 147 77q60 0 95 -38t35 -98z" />
+<glyph unicode="&#x268;" horiz-adv-x="292" d="M221 613q0 -33 -22.5 -55t-55.5 -22t-55 22t-22 55t22.5 55.5t56.5 22.5q31 0 53.5 -23t22.5 -55zM262 0h-240v24q35 8 44 19t9 45v135h-53v46h53v104q0 33 -10.5 45t-43.5 19v24h193v-192h45v-46h-45v-138q0 -32 10.5 -44.5t37.5 -16.5v-24z" />
+<glyph unicode="&#x269;" horiz-adv-x="366" d="M323 95l16 -17q-52 -86 -143 -86q-117 0 -117 136v212q0 48 -12 48q-16 0 -45 -10v27q135 51 177 51q19 0 19 -28v-321q0 -30 11 -43.5t23 -13.5q36 0 71 45z" />
+<glyph unicode="&#x26a;" horiz-adv-x="297" d="M264 0h-238v17q39 4 51.5 14t12.5 42v319q0 29 -13.5 39.5t-50.5 12.5v17h238v-17q-37 -2 -50 -12.5t-13 -39.5v-319q0 -33 12 -43.5t51 -12.5v-17z" />
+<glyph unicode="&#x26b;" horiz-adv-x="395" d="M337 433h43q-34 -127 -115 -127v-219q0 -33 12 -47.5t38 -15.5v-24h-240v24q51 4 51 63v264q-12 4 -20 4q-19 0 -32.5 -13t-16.5 -34h-42q25 122 111 125v154q0 61 -52 65v24h191v-289q7 -3 18 -3q20 0 32 11t22 38z" />
+<glyph unicode="&#x26c;" horiz-adv-x="446" d="M417 384l11 -21q-5 -8 -14.5 -21t-43 -44t-71.5 -50v-161q0 -33 12 -47.5t38 -15.5v-24h-240v24q51 4 51 63v143q-10 -1 -27 -1q-49 0 -82.5 30t-33.5 84q0 57 34 86t82 29q7 0 27 -5v134q0 61 -52 65v24h191v-376q52 18 118 84zM160 276v141q-10 4 -23 4 q-22 0 -41 -21.5t-19 -46.5q0 -65 54 -76q5 -1 29 -1z" />
+<glyph unicode="&#x26d;" horiz-adv-x="326" d="M206 676v-786q0 -37 12.5 -64.5t35.5 -27.5q32 0 32 17q0 7 -9 22q-14 21 -14 37q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -39 -72t-101 -28q-104 0 -150 76q-27 45 -27 99v645q0 61 -52 65v24h191z" />
+<glyph unicode="&#x26e;" horiz-adv-x="619" d="M587 423l-194 -197q22 6 53 6q59 0 108 -57.5t49 -148.5q0 -87 -34.5 -147t-73.5 -86q-46 -29 -113 -29q-38 0 -78.5 9t-62.5 24q-47 32 -47 71q0 20 14.5 35t44.5 15q57 0 67 -67q4 -22 24 -36t45 -14q87 0 87 207q0 66 -19.5 113t-64.5 47q-62 0 -109 -47l-27 24 l228 232h-204q-16 0 -35 -14.5t-30 -39.5v-236q0 -33 12 -47.5t38 -15.5v-24h-240v24q51 4 51 63v500q0 61 -52 65v24h191v-226h372v-27z" />
+<glyph unicode="&#x26f;" horiz-adv-x="828" d="M815 12h-192v75h-3q-29 -46 -62.5 -66.5t-81.5 -20.5q-47 0 -76 20t-52 67q-39 -48 -71.5 -67.5t-75.5 -19.5q-62 0 -98.5 38t-36.5 104v248q0 32 -10.5 45t-39.5 14v24h237v-24q-28 -2 -38 -14.5t-10 -44.5v-228q0 -95 53 -95q29 0 58 25q9 7 18 18t9 15v265 q0 29 -10 42.5t-36 16.5v24h232v-24q-27 -2 -37 -15t-10 -44v-240q0 -45 12.5 -64t41.5 -19q19 0 51.5 22.5t32.5 39.5v261q0 29 -9.5 42t-35.5 17v24h239v-24q-33 -6 -44 -18.5t-11 -43.5v-287q0 -35 11 -47t45 -17v-24z" />
+<glyph unicode="&#x270;" horiz-adv-x="859" d="M836 -233h-272v24q33 6 44.5 17t11.5 37v242q-29 -46 -62.5 -66.5t-81.5 -20.5q-47 0 -76 20t-52 67q-39 -48 -71.5 -67.5t-75.5 -19.5q-62 0 -98.5 38t-36.5 104v248q0 32 -10.5 45t-39.5 14v24h237v-24q-28 -2 -38 -14.5t-10 -44.5v-228q0 -95 53 -95q29 0 58 25 q9 7 18 18t9 15v265q0 29 -10 42.5t-36 16.5v24h232v-24q-27 -2 -37 -15t-10 -44v-240q0 -45 12.5 -64t41.5 -19q19 0 51.5 22.5t32.5 39.5v261q0 29 -9.5 42t-35.5 17v24h239v-24q-33 -6 -44 -18.5t-11 -43.5v-494q0 -52 16.5 -76t60.5 -26v-24z" />
+<glyph unicode="&#x271;" horiz-adv-x="847" d="M770 331v-359q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q48 0 48 65v448q0 95 -53 95q-29 0 -58 -25q-9 -7 -18 -18t-9 -15v-265q0 -29 10 -42.5t36 -16.5v-24h-232v24 q27 2 37 15t10 44v240q0 45 -12.5 64t-41.5 19q-19 0 -51.5 -22.5t-32.5 -39.5v-261q0 -29 9.5 -42t35.5 -17v-24h-239v24q33 6 44 18.5t11 43.5v287q0 35 -11 47t-45 17v24h192v-75h3q29 46 62.5 66.5t81.5 20.5q47 0 76 -20t52 -67q39 48 71.5 67.5t75.5 19.5 q62 0 98.5 -38t36.5 -104z" />
+<glyph unicode="&#x272;" horiz-adv-x="625" d="M586 0h-234v24q25 3 35.5 16.5t10.5 43.5v237q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24v-392q0 -67 -27 -113q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q48 0 48 65v513q0 32 -10 44 t-43 17v24h191v-75q51 87 143 87q62 0 98.5 -38.5t36.5 -103.5v-247q0 -34 10 -46t39 -14v-24z" />
+<glyph unicode="&#x273;" horiz-adv-x="610" d="M490 331v-448q0 -34 13 -59.5t35 -25.5q32 0 32 17q0 7 -9 22q-14 21 -14 37q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -39 -72t-101 -28q-104 0 -150 76q-27 44 -27 90v388q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24v-264q0 -29 10.5 -42.5t37.5 -17.5v-24 h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h191v-75h1q49 87 142 87q62 0 98.5 -38.5t36.5 -103.5z" />
+<glyph unicode="&#x274;" horiz-adv-x="604" d="M558 461v-17q-38 -5 -48.5 -14.5t-10.5 -41.5v-400h-23l-342 371v-271q0 -39 14.5 -52.5t58.5 -18.5v-17h-173v17q41 5 53.5 15t12.5 41v323q-38 48 -64 48v17h161l268 -294v205q0 40 -14 54.5t-56 17.5v17h163z" />
+<glyph unicode="&#x275;" horiz-adv-x="520" d="M485 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM181 253h156q-2 104 -19.5 146.5t-57.5 42.5q-42 0 -59.5 -42t-19.5 -147zM338 207h-157q0 -106 17.5 -148t61.5 -42q43 0 60 40.5t18 149.5z" />
+<glyph unicode="&#x276;" horiz-adv-x="741" d="M713 141l-30 -143h-306q-60 0 -78 -1q-20 -2 -29 -2q-105 0 -163 48q-79 64 -79 182q0 128 97 195q59 41 145 41q3 0 18.5 -1.5t42 -2.5t55.5 -1h298v-136h-18q-8 40 -19.5 60.5t-34.5 33.5q-30 18 -115 18q-21 0 -28.5 -4t-7.5 -14v-166q58 2 75.5 18t30.5 80h18v-229 h-18q-8 61 -29 82.5t-77 24.5v-170q0 -20 10 -26t41 -6q79 0 120 34q35 28 61 85h20zM349 142v197q0 64 -12 80q-12 18 -56 18q-131 0 -131 -223q0 -108 28 -150q30 -45 96 -45q46 0 62 19q13 15 13 104z" />
+<glyph unicode="&#x277;" horiz-adv-x="696" d="M653 196q0 -81 -53.5 -139.5t-138.5 -58.5q-34 0 -64.5 13.5t-48.5 34.5q-43 -48 -115 -48q-84 0 -137.5 58.5t-53.5 139.5q0 124 92.5 202.5t214.5 78.5q117 0 210.5 -79t93.5 -202zM512 212q0 118 -47.5 179.5t-115.5 61.5q-69 0 -117.5 -61.5t-48.5 -179.5 q0 -61 14.5 -114.5t49.5 -53.5q20 0 40.5 21.5t20.5 51.5q0 27 -11.5 68.5t-11.5 66.5q0 35 12.5 55t50.5 20q37 0 50 -20t13 -55q0 -25 -12 -66.5t-12 -68.5q0 -30 19.5 -51.5t40.5 -21.5q65 0 65 168z" />
+<glyph unicode="&#x278;" horiz-adv-x="713" d="M426 591v-156q41 -4 81.5 -19t77 -40t59.5 -65.5t23 -89.5q0 -90 -76 -153t-165 -69v-138q0 -41 13.5 -53.5t54.5 -14.5v-24h-277v24q41 3 55.5 17t14.5 54v135q-90 6 -166 69t-76 153q0 64 40 113t93 72.5t109 28.5v153q0 41 -14.5 55.5t-55.5 17.5v24h277v-24 q-41 -2 -54.5 -15t-13.5 -55zM426 398v-360q42 21 71 73.5t29 111.5q0 62 -28.5 110.5t-71.5 64.5zM287 39v359q-43 -17 -72 -65t-29 -110q0 -58 29.5 -110.5t71.5 -73.5z" />
+<glyph unicode="&#x279;" horiz-adv-x="456" d="M441 2h-190v82q-35 -51 -66 -72.5t-69 -21.5q-35 0 -58 22.5t-23 56.5q0 30 17.5 49t45.5 19q37 0 60 -38q14 -23 28 -23q26 0 43.5 30t17.5 74v177q0 48 -13.5 63.5t-58.5 18.5v24h265v-24q-33 -6 -43.5 -17.5t-10.5 -42.5v-289q0 -35 11 -47t44 -17v-24z" />
+<glyph unicode="&#x27a;" horiz-adv-x="456" d="M441 2h-190v82q-35 -51 -66 -72.5t-69 -21.5q-35 0 -58 22.5t-23 56.5q0 30 17.5 49t45.5 19q37 0 60 -38q14 -23 28 -23q26 0 43.5 30t17.5 74v407q0 61 -52 65v24h191v-586q0 -35 11 -47t44 -17v-24z" />
+<glyph unicode="&#x27b;" horiz-adv-x="506" d="M386 379v-496q0 -34 13 -59.5t35 -25.5q32 0 32 17q0 7 -9 22q-14 21 -14 37q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -39 -72t-101 -28q-104 0 -150 76q-27 46 -27 83v152q-35 -50 -65 -69t-66 -19q-35 0 -58 22.5t-23 56.5q0 30 17.5 49t45.5 19q37 0 60 -38 q14 -23 28 -23q26 0 43.5 30t17.5 74v177q0 48 -13.5 63.5t-58.5 18.5v24h265v-24q-33 -6 -43.5 -17.5t-10.5 -42.5z" />
+<glyph unicode="&#x27c;" horiz-adv-x="426" d="M200 461v-82q35 51 66 72.5t69 21.5q35 0 58 -22.5t23 -56.5q0 -30 -17.5 -49t-45.5 -19q-37 0 -60 38q-14 23 -28 23q-26 0 -43.5 -30t-17.5 -74v-410q0 -48 13.5 -63.5t58.5 -18.5v-24h-265v24q33 6 43.5 17.5t10.5 42.5v522q0 35 -11 47t-44 17v24h190z" />
+<glyph unicode="&#x27d;" horiz-adv-x="454" d="M202 461v-82q35 51 66 72.5t69 21.5q35 0 58 -22.5t23 -56.5q0 -30 -17.5 -49t-45.5 -19q-37 0 -60 38q-14 23 -28 23q-26 0 -43.5 -30t-17.5 -74v-406q0 -32 13 -55.5t35 -23.5q32 0 32 17q0 7 -9 22q-14 21 -14 37q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44 q0 -44 -39 -72t-101 -28q-104 0 -150 76q-27 46 -27 83v447q0 35 -11 47t-44 17v24h190z" />
+<glyph unicode="&#x27e;" horiz-adv-x="359" d="M69 84v178q0 122 40 171q42 51 135 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-50 0 -50 -73v-274q0 -48 13.5 -63.5t58.5 -18.5v-24h-265v24q33 6 43.5 17.5t10.5 42.5z" />
+<glyph unicode="&#x27f;" horiz-adv-x="404" d="M381 0h-265v24q45 3 58.5 18.5t13.5 63.5v274q0 73 -50 73q-29 0 -29 -19q0 -4 11 -20.5t11 -36.5q0 -23 -17.5 -40t-42.5 -17q-27 0 -44 18t-17 46q0 44 39 72t103 28q93 0 135 -51q40 -49 40 -171v-178q0 -31 10.5 -42.5t43.5 -17.5v-24z" />
+<glyph unicode="&#x280;" horiz-adv-x="516" d="M495 0h-141l-142 215h-19v-134q0 -38 9.5 -48.5t50.5 -15.5v-17h-232v17q40 5 50 15t10 51v295q0 41 -11.5 54t-48.5 15v17h211q204 0 204 -118q0 -52 -32 -81q-31 -28 -76 -39l137 -194q10 -15 30 -15v-17zM193 410v-172q71 1 98 21t27 80q0 55 -20.5 78.5t-68.5 23.5 q-20 0 -28 -7t-8 -24z" />
+<glyph unicode="&#x281;" horiz-adv-x="516" d="M495 464v-17q-20 0 -30 -15l-137 -194q45 -11 76 -39q32 -29 32 -81q0 -118 -204 -118h-211v17q37 2 48.5 15t11.5 54v295q0 41 -10 51t-50 15v17h232v-17q-41 -5 -50.5 -15.5t-9.5 -48.5v-134h19l142 215h141zM193 226v-172q0 -17 8 -24t28 -7q48 0 68.5 23.5t20.5 78.5 q0 60 -27 80t-98 21z" />
+<glyph unicode="&#x282;" horiz-adv-x="389" d="M340 326h-25q-19 56 -47 82q-34 32 -75 32q-28 0 -47 -16.5t-19 -41.5q0 -26 22.5 -46.5t73.5 -41.5q75 -31 106.5 -67t31.5 -89q0 -67 -43 -109.5t-111 -42.5q-52 0 -108 23q-15 6 -23 6q-20 0 -20 -27v-73q0 -102 101 -102q37 0 37 17q0 7 -9 22q-14 21 -14 37 q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -39 -72t-101 -28q-58 0 -92.5 29.5t-34.5 90.5v250h28q32 -132 137 -132q34 0 54.5 18t20.5 47q0 24 -22 44.5t-74 42.5q-75 32 -108.5 68.5t-33.5 86.5q0 63 44.5 104.5t112.5 41.5q34 0 78 -15q22 -7 31 -7q17 0 25 20h22 v-145z" />
+<glyph unicode="&#x283;" horiz-adv-x="458" d="M121 -106v599q0 85 45 137.5t129 52.5q52 0 81.5 -21t29.5 -57q0 -26 -15 -43.5t-39 -17.5q-23 0 -38 14t-15 33q0 14 9 29.5t9 18.5q0 5 -7 9.5t-16 4.5q-42 0 -42 -137v-559q0 -85 -46.5 -137.5t-130.5 -52.5q-52 0 -81.5 21t-29.5 57q0 26 15 43.5t39 17.5 q23 0 38 -14t15 -33q0 -14 -9 -29.5t-9 -18.5q0 -5 7 -9.5t16 -4.5q45 0 45 97z" />
+<glyph unicode="&#x284;" horiz-adv-x="373" d="M121 46v436q0 107 36 150q42 51 131 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-50 0 -50 -58v-548h62v-46h-62v-28q0 -84 -27 -129q-43 -76 -142 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17 q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q25 0 36.5 18t11.5 58v126h-64v46h64z" />
+<glyph unicode="&#x285;" horiz-adv-x="396" d="M295 280v-386q0 -97 45 -97q9 0 16 4.5t7 9.5q0 3 -9 18.5t-9 29.5q0 19 15 33t38 14q24 0 39 -17.5t15 -43.5q0 -36 -29.5 -57t-81.5 -21q-84 0 -130.5 52.5t-46.5 137.5v397q0 86 -44 86q-9 0 -16 -4.5t-7 -9.5q0 -3 9 -18.5t9 -29.5q0 -19 -15 -33t-38 -14 q-24 0 -39 17.5t-15 43.5q0 36 29.5 57t81.5 21q84 0 130 -52.5t46 -137.5z" />
+<glyph unicode="&#x286;" horiz-adv-x="399" d="M164 21v472q0 85 45 137.5t129 52.5q52 0 81.5 -21t29.5 -57q0 -26 -15 -43.5t-39 -17.5q-23 0 -38 14t-15 33q0 14 9 29.5t9 18.5q0 5 -7 9.5t-16 4.5q-42 0 -42 -130v-562q38 -43 54 -104q9 -35 9 -100h-34q0 76 -36 139q-15 -58 -58 -93.5t-110 -35.5q-64 0 -100 38 t-36 87q0 59 42.5 96t97.5 37q14 0 40 -4zM164 -106v86q-20 5 -43 5q-45 0 -71 -28t-26 -67q0 -25 21.5 -54t68.5 -29q50 0 50 87z" />
+<glyph unicode="&#x287;" horiz-adv-x="333" d="M332 84v-27q-49 -33 -82 -71.5t-85 -114.5h-25v169h-95v44h95v298q0 60 -39 60q-29 0 -57 -53l-25 11q31 62 64.5 87.5t83.5 25.5q52 0 82 -28.5t30 -78.5v-322h53z" />
+<glyph unicode="&#x288;" horiz-adv-x="339" d="M211 417v-540q0 -32 13 -55.5t35 -23.5q32 0 32 17q0 7 -9 22q-14 21 -14 37q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -39 -72t-101 -28q-104 0 -150 76q-27 46 -27 83v491h-53v27q49 33 82 71.5t85 114.5h25v-169h95v-44h-95z" />
+<glyph unicode="&#x289;" horiz-adv-x="556" d="M538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38t-35 107v92h-56v46h56v103q0 35 -9 47t-40 18v24h188v-192h138v105q0 34 -12 47t-49 16v24h200v-192h57v-46h-57v-118q0 -33 12 -47t45 -15v-23zM342 98v125h-138v-96q0 -76 56 -76 q39 0 82 47z" />
+<glyph unicode="&#x28a;" horiz-adv-x="500" d="M487 428h-75q-8 0 -14.5 -10.5t-6.5 -22.5q0 -18 11 -29q12 -12 28.5 -31.5t35.5 -55t19 -64.5q0 -96 -70 -159.5t-165 -63.5q-94 0 -164.5 63.5t-70.5 155.5q0 74 80 154q16 16 16 31q0 12 -8.5 22t-16.5 10h-73v24h186q-43 -140 -43 -246q0 -26 3.5 -54t12.5 -61 t29.5 -54t48.5 -21q30 0 51 21t29 55.5t11 60.5t3 54q0 106 -43 245h186v-24z" />
+<glyph unicode="&#x28b;" horiz-adv-x="534" d="M228 460v-334q0 -33 22 -59.5t53 -26.5q67 0 110 61.5t43 131.5q0 46 -14 79.5t-27 45t-33 23.5q-21 13 -30 23t-9 25q0 17 14 26.5t35 9.5q33 0 58 -24.5t37.5 -60.5t18 -68t5.5 -57q0 -106 -61.5 -185.5t-169.5 -79.5q-83 0 -137 36t-54 110v235q0 13 -21 13 q-16 0 -45 -9v23q94 28 197 67z" />
+<glyph unicode="&#x28c;" horiz-adv-x="500" d="M485 0h-250v24l18 2q35 4 35 24q0 8 -9 31l-79 203l-72 -182q-11 -26 -11 -45q0 -18 11.5 -24.5t43.5 -8.5v-24h-151v24q24 2 34 11.5t24 43.5l160 396h26l120 -296q47 -116 66 -141q8 -10 34 -14v-24z" />
+<glyph unicode="&#x28d;" horiz-adv-x="722" d="M707 0h-222v24q38 5 38 28q0 12 -39 115l-45 118l-68 -171l20 -62q6 -17 14 -21t31 -7v-24h-234v24q28 2 38 7t10 17q0 4 -27 106l-34 127l-70 -188q-9 -25 -9 -34q0 -17 10 -24.5t38 -10.5v-24h-135v24q19 4 29.5 14t20.5 36l155 401h23l102 -310l125 310h24l148 -374 q19 -47 28.5 -60t28.5 -17v-24z" />
+<glyph unicode="&#x28e;" horiz-adv-x="500" d="M482 0h-249v24l16 1q36 3 36 25q0 7 -20 58l-72 186l-68 -188q-11 -32 -11 -49q0 -18 11 -25t43 -8v-24h-152v24q24 3 36 13.5t24 41.5l148 398q45 121 77 156q31 33 84 33q43 0 70 -22t27 -57q0 -29 -17 -48t-45 -19q-25 0 -42.5 15t-17.5 37q0 4 2 14l1 6q0 7 -5 12 t-12 5q-38 0 -66 -82l-18 -53l119 -290q49 -121 67 -146q8 -10 34 -14v-24z" />
+<glyph unicode="&#x28f;" horiz-adv-x="633" d="M587 464v-17q-37 -6 -53 -27l-151 -214v-122q0 -40 12.5 -51.5t59.5 -15.5v-17h-274v17q48 4 60.5 17t12.5 54v93l-142 225q-25 38 -66 41v17h265v-17l-22 -2q-19 -2 -25.5 -3t-11.5 -5t-5 -12q0 -10 19 -40l95 -159l86 122q33 46 33 70q0 15 -13 20.5t-54 8.5v17h174z " />
+<glyph unicode="&#x290;" horiz-adv-x="531" d="M420 160l-20 -188q-7 -56 -7 -91q0 -28 15 -48t35 -20q36 0 36 17q0 7 -9 22q-14 21 -14 37q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -38 -72t-99 -28q-35 0 -59 23.5t-24 64.5q0 57 10 130h-346v25l234 404q-106 0 -139 -19t-52 -91h-26l7 142h371v-26 l-231 -403h29q61 0 91.5 12.5t55.5 46.5q20 30 31 69h28z" />
+<glyph unicode="&#x291;" horiz-adv-x="538" d="M185 32h93q42 79 77.5 113.5t76.5 34.5q85 0 85 -75q0 -47 -37.5 -76t-103.5 -29h-73q-61 -107 -82 -150h-43q46 88 84 150h-241v25l234 404q-106 0 -139 -19t-52 -91h-26l7 142h371v-26zM320 32h51q36 0 54 6q37 13 48.5 29.5t11.5 38.5q0 21 -16 31.5t-37 10.5 q-27 0 -58.5 -35.5t-53.5 -80.5z" />
+<glyph unicode="&#x292;" horiz-adv-x="440" d="M414 423l-194 -197q22 6 53 6q59 0 108 -57.5t49 -148.5q0 -87 -34.5 -147t-73.5 -86q-46 -29 -113 -29q-91 0 -141 33q-47 32 -47 71q0 20 14.5 35t44.5 15q57 0 67 -67q4 -22 24 -36t45 -14q87 0 87 207q0 66 -19.5 113t-64.5 47q-62 0 -109 -47l-27 24l228 232h-204 q-20 0 -44 -23.5t-29 -59.5h-26l34 156h372v-27z" />
+<glyph unicode="&#x293;" horiz-adv-x="440" d="M414 423l-194 -197q22 6 53 6q55 0 106 -54.5t51 -163.5q0 -27 -9 -60.5t-26 -68.5t-47.5 -64.5t-68.5 -42.5l43 -85h-49l-38 75q-35 -4 -74 -4q-74 0 -108.5 34.5t-34.5 70.5t26 59.5t73 23.5q40 0 70.5 -24.5t70.5 -107.5q45 40 45 186q0 38 -5.5 71t-25.5 62t-53 29 q-62 0 -109 -47l-27 24l228 232h-204q-20 0 -44 -23.5t-29 -59.5h-26l34 156h372v-27zM219 -196q-55 111 -87 111q-27 0 -27 -41q0 -34 27 -53.5t67 -19.5q8 0 20 3z" />
+<glyph unicode="&#x294;" horiz-adv-x="417" d="M145 378h32q47 0 83.5 34.5t36.5 91.5q0 22 -3 45t-9 48t-19.5 41t-32.5 16q-13 0 -22.5 -4.5t-15.5 -16t-9 -19.5l-7 -25q-16 -60 -71 -60q-25 0 -39 15.5t-14 32.5q0 48 55 79q49 27 102 27q94 0 154 -52.5t60 -140.5q0 -76 -47 -138.5t-127 -70.5v-197q0 -54 70 -60 v-24h-240v24q63 2 63 63v291z" />
+<glyph unicode="&#x295;" horiz-adv-x="417" d="M229 84v197q-80 8 -127 70.5t-47 138.5q0 88 60 140.5t154 52.5q53 0 102 -27q55 -31 55 -79q0 -17 -14 -32.5t-39 -15.5q-55 0 -71 60l-8 25q-2 8 -8 19.5t-15.5 16t-22.5 4.5q-19 0 -32.5 -16t-19.5 -41t-9 -48t-3 -45q0 -57 36.5 -91.5t83.5 -34.5h32v-291 q0 -61 63 -63v-24h-240v24q70 6 70 60z" />
+<glyph unicode="&#x296;" horiz-adv-x="417" d="M252 585v-197q80 -8 127 -70.5t47 -138.5q0 -88 -60 -140.5t-154 -52.5q-53 0 -102 27q-55 31 -55 79q0 17 14 32.5t39 15.5q55 0 71 -60l7 -25q3 -8 9 -19.5t15.5 -16t22.5 -4.5q19 0 32.5 16t19.5 41t9 48t3 45q0 57 -36.5 91.5t-83.5 34.5h-32v291q0 61 -63 63v24h240 v-24q-70 -6 -70 -60z" />
+<glyph unicode="&#x297;" horiz-adv-x="479" d="M447 -38v-40q0 -64 -51 -109t-132 -45q-74 0 -133 45t-59 110v391q0 72 67 115.5t143 43.5q59 0 111.5 -33.5t53.5 -84.5q0 -22 -16 -42.5t-48 -20.5q-22 0 -39 11.5t-17 29.5q0 16 6 30t6 26q0 25 -12.5 35.5t-38.5 10.5q-38 0 -61 -27t-23 -66v-411q0 -46 25 -79.5 t63 -33.5q46 0 79 35t33 83v26h43z" />
+<glyph unicode="&#x298;" horiz-adv-x="723" d="M438 328q0 -33 -22 -55.5t-55 -22.5q-34 0 -57.5 22.5t-23.5 55.5q0 34 23 57t57 23q32 0 55 -23t23 -57zM708 330q0 -146 -97.5 -246.5t-247.5 -100.5q-141 0 -245.5 97.5t-104.5 250.5t102 251t250 98t245.5 -100.5t97.5 -249.5zM580 333q0 138 -57 223t-164 85 q-100 0 -159 -79.5t-59 -228.5q0 -140 55 -223.5t166 -83.5q95 0 156.5 86.5t61.5 220.5z" />
+<glyph unicode="&#x299;" horiz-adv-x="456" d="M15 464h225q85 0 130.5 -28.5t45.5 -81.5q0 -41 -26 -66.5t-86 -37.5q60 -8 98.5 -40.5t38.5 -80.5q0 -57 -50.5 -93t-142.5 -36h-233v17q39 4 50.5 14.5t11.5 39.5v320q0 31 -12.5 42t-49.5 14v17zM190 406v-149q65 0 87.5 20t22.5 72q0 92 -70 92q-21 0 -30.5 -7.5 t-9.5 -27.5zM190 234v-167q0 -24 10.5 -34t34.5 -10q84 0 84 106q0 105 -110 105h-19z" />
+<glyph unicode="&#x29a;" horiz-adv-x="465" d="M455 233q0 -73 -25 -125.5t-64 -77t-74 -34.5t-68 -10q-92 0 -152.5 34t-60.5 103q0 44 33 78.5t85 48.5q-47 21 -69 45t-22 63q0 117 197 117q90 0 155 -67t65 -175zM280 227h-53q-36 0 -56 -26.5t-20 -71.5q0 -42 25 -68t65 -26q59 0 101.5 58t42.5 149 q0 83 -47.5 139.5t-111.5 56.5q-38 0 -53 -20t-15 -68q0 -29 22 -50.5t48 -29.5q16 -5 52 -6v-37z" />
+<glyph unicode="&#x29b;" horiz-adv-x="600" d="M487 110v-79q-79 -42 -199 -42q-113 0 -186 63.5t-73 168.5q0 101 72.5 170.5t179.5 69.5q64 0 125 -30q5 49 26 73q27 33 69 33t68 -18t26 -47q0 -18 -11.5 -29.5t-29.5 -11.5q-16 0 -27 10.5t-11 25.5q0 13 6.5 24t6.5 13q0 13 -19 13q-32 0 -32 -40v-174h-18 q-19 40 -32 59.5t-36 39.5q-42 36 -101 36q-64 0 -99 -54.5t-35 -157.5q0 -102 36 -157q38 -59 112 -59q69 0 69 57v58q0 27 -14.5 37.5t-60.5 13.5v16h251v-16q-39 -5 -51 -19.5t-12 -46.5z" />
+<glyph unicode="&#x29c;" horiz-adv-x="582" d="M561 0h-248v17q40 5 52.5 14.5t12.5 35.5v157h-177v-157q0 -27 13 -36t53 -14v-17h-246v17q39 5 50.5 14t11.5 36v329q0 28 -12.5 38t-49.5 13v17h246v-17q-39 -3 -52.5 -13t-13.5 -38v-140h177v140q0 28 -13 38t-52 13v17h248v-17q-38 -3 -51.5 -13.5t-13.5 -37.5v-329 q0 -27 12.5 -36t52.5 -14v-17z" />
+<glyph unicode="&#x29d;" horiz-adv-x="394" d="M282 613q0 -33 -22.5 -55t-56.5 -22q-33 0 -54.5 22t-21.5 55t22.5 55.5t55.5 22.5q31 0 54 -23t23 -55zM414 -233h-48q-35 44 -103 112q-49 -112 -182 -112q-62 0 -101.5 32t-39.5 86t39.5 86.5t89.5 32.5q33 0 71 -9v383q0 32 -12.5 44t-50.5 15v24h202v-447 q0 -57 -5 -83q13 -11 27.5 -25t24 -24t24.5 -30l20 -26q6 -7 24 -31zM140 -95v40q-33 19 -77 19q-30 0 -54.5 -20.5t-24.5 -54.5q0 -42 26 -62t63 -20q67 0 67 98z" />
+<glyph unicode="&#x29e;" horiz-adv-x="556" d="M543 -215h-187v431l-128 -128q-21 -21 -21 -38q0 -19 35 -23l24 -3v-24h-214v24q48 6 81.5 29t107.5 101l-194 268q-11 15 -25 15v24h234v-24q-42 -1 -42 -19q0 -12 24 -45l95 -134l23 24v114q0 35 -8.5 45t-43.5 15v24h239v-24q-48 -4 -48 -60v-510q0 -54 48 -58v-24z " />
+<glyph unicode="&#x29f;" horiz-adv-x="470" d="M440 156l-27 -156h-396v17q35 4 45 13.5t10 36.5v328q0 29 -11 39.5t-44 12.5v17h238v-17q-42 -1 -53.5 -13.5t-11.5 -53.5v-313q0 -21 21 -32.5t55 -11.5q37 0 56.5 8t39.5 28q29 29 56 97h22z" />
+<glyph unicode="&#x2a0;" horiz-adv-x="636" d="M342 -90v132q-44 -56 -123 -56t-132 63.5t-53 169.5q0 108 61.5 181t160.5 73q50 0 91 -26q9 53 35 84q42 51 135 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-26 0 -38 -13.5t-12 -46.5v-614 q0 -30 10 -40.5t45 -17.5v-24h-267v24q48 7 60.5 23.5t12.5 67.5zM342 98v256q0 41 -18.5 64t-48.5 23q-44 0 -69.5 -51t-25.5 -154q0 -98 25 -147t68 -49q28 0 48.5 15.5t20.5 42.5z" />
+<glyph unicode="&#x2a1;" horiz-adv-x="500" d="M145 378h32q47 0 83.5 34.5t36.5 91.5q0 22 -3 45t-9 48t-19.5 41t-32.5 16q-13 0 -22.5 -4.5t-15.5 -16t-9 -19.5l-7 -25q-16 -60 -71 -60q-25 0 -39 15.5t-14 32.5q0 48 55 79q49 27 102 27q94 0 154 -52.5t60 -140.5q0 -76 -47 -138.5t-127 -70.5v-73h65v-46h-65v-78 q0 -54 70 -60v-24h-240v24q63 2 63 63v75h-66v46h66v170z" />
+<glyph unicode="&#x2a2;" horiz-adv-x="500" d="M229 208v73q-80 8 -127 70.5t-47 138.5q0 88 60 140.5t154 52.5q53 0 102 -27q55 -31 55 -79q0 -17 -14 -32.5t-39 -15.5q-55 0 -71 60l-8 25q-2 8 -8 19.5t-15.5 16t-22.5 4.5q-19 0 -32.5 -16t-19.5 -41t-9 -48t-3 -45q0 -57 36.5 -91.5t83.5 -34.5h32v-170h66v-46h-66 v-75q0 -61 63 -63v-24h-240v24q70 6 70 60v78h-65v46h65z" />
+<glyph unicode="&#x2a3;" horiz-adv-x="868" d="M843 146l-16 -160h-488v66q-35 -37 -64 -51.5t-69 -14.5q-79 0 -130 66t-51 169q0 109 54.5 180.5t137.5 71.5q34 0 60.5 -13.5t58.5 -48.5v183q0 35 -13 44.5t-63 13.5v24h215v-229h364v-26l-231 -403h29q61 0 91.5 12.5t55.5 46.5q20 30 31 69h28zM479 71l199 344 q-106 0 -139 -19t-52 -91h-12v-204q0 -19 4 -30zM336 112v243q-11 29 -32 45.5t-46 16.5q-85 0 -85 -188q0 -187 78 -187q36 0 66 37q19 25 19 33z" />
+<glyph unicode="&#x2a4;" horiz-adv-x="810" d="M778 423l-194 -197q22 6 53 6q59 0 108 -57.5t49 -148.5q0 -87 -34.5 -147t-73.5 -86q-46 -29 -113 -29q-91 0 -141 33q-47 32 -47 71q0 20 14.5 35t44.5 15q57 0 67 -67q4 -22 24 -36t45 -14q87 0 87 207q0 66 -19.5 113t-64.5 47q-62 0 -108 -46q-62 -61 -121 -130 l-15 1v59q-35 -37 -64 -51.5t-69 -14.5q-79 0 -130 66t-51 169q0 109 54.5 180.5t137.5 71.5q34 0 60.5 -13.5t58.5 -48.5v183q0 35 -13 44.5t-63 13.5v24h215v-226h303v-27zM675 377h-200v-204zM336 112v243q-11 29 -32 45.5t-46 16.5q-85 0 -85 -188q0 -187 78 -187 q36 0 66 37q19 25 19 33z" />
+<glyph unicode="&#x2a5;" horiz-adv-x="960" d="M601 18h93q42 79 77.5 113.5t76.5 34.5q85 0 85 -75q0 -47 -37.5 -76t-103.5 -29h-73q-61 -107 -82 -150h-43q46 88 84 150h-339v66q-35 -37 -64 -51.5t-69 -14.5q-79 0 -130 66t-51 169q0 109 54.5 180.5t137.5 71.5q34 0 60.5 -13.5t58.5 -48.5v183q0 35 -13 44.5 t-63 13.5v24h215v-229h357v-26zM736 18h51q36 0 54 6q37 13 48.5 29.5t11.5 38.5q0 21 -16 31.5t-37 10.5q-27 0 -58.5 -35.5t-53.5 -80.5zM476 79l195 336q-106 0 -139 -19t-52 -91h-5v-204q0 -16 1 -22zM336 112v243q-11 29 -32 45.5t-46 16.5q-85 0 -85 -188 q0 -187 78 -187q36 0 66 37q19 25 19 33z" />
+<glyph unicode="&#x2a6;" horiz-adv-x="626" d="M577 326h-25q-19 56 -47 82q-34 32 -75 32q-28 0 -47 -16.5t-19 -41.5q0 -26 22.5 -46.5t73.5 -41.5q75 -31 106.5 -67t31.5 -89q0 -67 -43 -108.5t-111 -41.5q-109 0 -155 46q-40 -46 -105 -46q-52 0 -82 28.5t-30 78.5v322h-53v27q49 33 82 71.5t85 114.5h25v-169h144 q30 12 66 12q34 0 78 -15q22 -7 31 -7q17 0 25 20h22v-145zM307 112l25 -11q-8 -16 -12 -23q36 -56 107 -56q34 0 54.5 17t20.5 46q0 24 -22 44.5t-74 42.5q-75 32 -108.5 68.5t-33.5 86.5q0 51 31 90h-84v-298q0 -60 39 -60q29 0 57 53z" />
+<glyph unicode="&#x2a7;" horiz-adv-x="540" d="M341 461v32q0 85 45 137.5t129 52.5q52 0 81.5 -21t29.5 -57q0 -26 -15 -43.5t-39 -17.5q-23 0 -38 14t-15 33q0 14 9 29.5t9 18.5q0 5 -7 9.5t-16 4.5q-42 0 -42 -137v-559q0 -85 -46.5 -137.5t-130.5 -52.5q-52 0 -81.5 21t-29.5 57q0 26 15 43.5t39 17.5q23 0 38 -14 t15 -33q0 -14 -9 -29.5t-9 -18.5q0 -5 7 -9.5t16 -4.5q45 0 45 97v162q-57 -38 -89 -53t-68 -15q-52 0 -82 28.5t-30 78.5v322h-53v27q49 33 82 71.5t85 114.5h25v-169h130zM341 110v307h-130v-298q0 -60 39 -60q22 0 91 51z" />
+<glyph unicode="&#x2a8;" horiz-adv-x="700" d="M211 417v-292q0 -34 8 -50t33 -16q38 0 74 12q-51 58 -51 160q0 110 68 180.5t169 70.5q66 0 110 -31t44 -79q0 -29 -18.5 -46.5t-49.5 -17.5q-26 0 -41 19t-15 54q0 18 -0.5 26t-2.5 18.5t-6 15t-12.5 7.5t-20.5 3q-38 0 -61 -44.5t-23 -124.5q0 -98 33 -159 q92 53 144 53q44 0 70.5 -23t26.5 -60q0 -42 -32.5 -73.5t-98.5 -31.5q-85 0 -127 14q-45 16 -75 35q-95 -49 -173 -49q-52 0 -82 28.5t-30 78.5v322h-53v27q49 33 82 71.5t85 114.5h25v-169h95v-44h-95zM646 93q0 21 -16 32t-37 11q-46 0 -120 -49q12 -16 45.5 -35.5 t59.5 -19.5q68 0 68 61z" />
+<glyph unicode="&#x2b0;" horiz-adv-x="378" d="M365 335h-162v18q18 3 25 12.5t7 32.5v169q0 40 -7.5 56.5t-27.5 16.5q-33 0 -60 -42v-199q0 -23 7 -32.5t26 -13.5v-18h-166v18q25 5 31 12t6 37v376q0 26 -6.5 33.5t-31.5 12.5v18h134v-210q46 58 101 58q42 0 66 -28t24 -74v-188q0 -47 34 -47v-18z" />
+<glyph unicode="&#x2b1;" horiz-adv-x="378" d="M365 336h-162v18q18 2 25 12.5t7 33.5v168q0 40 -7.5 56.5t-27.5 16.5q-25 0 -48 -26q-12 -12 -12 -18v-197q0 -23 7 -33t26 -13v-18h-166v18q25 5 31 12t6 37v295q0 76 27 112q30 38 93 38q44 0 71.5 -21t27.5 -54q0 -21 -12 -34.5t-31 -13.5q-17 0 -29 12.5t-12 30.5 q0 15 8 27t8 15q0 15 -21 15q-34 0 -34 -51v-141q45 58 101 58q42 0 66 -28.5t24 -73.5v-187q0 -26 8 -37t26 -11v-18z" />
+<glyph unicode="&#x2b2;" horiz-adv-x="300" d="M273 807q0 -25 -18 -42t-44 -17q-25 0 -41.5 17t-16.5 42q0 26 17.5 43.5t42.5 17.5q24 0 42 -18t18 -43zM270 690v-353q0 -63 -21 -100q-34 -58 -115 -58q-48 0 -78.5 21.5t-30.5 55.5q0 20 13.5 33.5t34.5 13.5q19 0 32.5 -12.5t13.5 -29.5q0 -13 -11 -29 q-7 -10 -7 -16q0 -14 25 -14q37 0 37 59v365q0 25 -9.5 34.5t-39.5 11.5v18h156z" />
+<glyph unicode="&#x2b3;" horiz-adv-x="270" d="M131 690v-60q41 69 84 69q22 0 36.5 -16.5t14.5 -41.5q0 -22 -11 -35.5t-28 -13.5q-23 0 -39 27q-7 17 -16 17q-17 0 -27.5 -21.5t-10.5 -54.5v-148q0 -35 8 -46.5t36 -12.5v-18h-165v18q20 4 26.5 12t6.5 31v230q0 25 -6.5 33.5t-27.5 12.5v18h119z" />
+<glyph unicode="&#x2b4;" horiz-adv-x="292" d="M264 335h-119v60q-41 -69 -84 -69q-22 0 -36.5 16.5t-14.5 41.5q0 22 11 35.5t28 13.5q23 0 39 -27q7 -17 16 -17q17 0 27.5 21.5t10.5 54.5v148q0 35 -8 46.5t-36 12.5v18h165v-18q-20 -4 -26.5 -12t-6.5 -31v-230q0 -25 6.5 -33.5t27.5 -12.5v-18z" />
+<glyph unicode="&#x2b5;" horiz-adv-x="319" d="M230 628v-380q0 -25 8 -43.5t22 -18.5q20 0 20 12q0 6 -6 16q-8 15 -8 27q0 17 10.5 28t26.5 11q17 0 28 -12.5t11 -31.5q0 -32 -25 -52.5t-63 -20.5q-66 0 -94 55q-18 32 -18 61v112q-40 -65 -81 -65q-22 0 -36.5 16t-14.5 41q0 23 11 36.5t29 13.5q24 0 39 -29 q8 -15 15 -15q16 0 27 21t11 52v148q0 37 -8 49t-36 13v18h165v-18q-21 -4 -27 -12.5t-6 -31.5z" />
+<glyph unicode="&#x2b6;" horiz-adv-x="404" d="M397 684v-12q-15 0 -24 -11l-109 -142q35 -8 60 -29q26 -20 26 -59q0 -86 -162 -86h-168v12q29 2 38 11.5t9 39.5v215q0 30 -7.5 37.5t-39.5 11.5v12h184v-12q-32 -4 -39.5 -11.5t-7.5 -35.5v-98h15l113 157h112zM157 510v-126q0 -22 28 -22q38 0 54.5 17t16.5 57 q0 44 -21.5 58.5t-77.5 15.5z" />
+<glyph unicode="&#x2b7;" horiz-adv-x="550" d="M528 681v-18q-14 -3 -22 -10.5t-15 -26.5l-114 -295h-17l-76 228l-92 -228h-18l-109 275q-14 35 -21 44.5t-21 12.5v18h164v-18q-28 -4 -28 -21q0 -7 29 -84l33 -87l50 126l-15 48q-5 11 -11 13.5t-22 4.5v18h173v-18q-21 -1 -28.5 -5t-7.5 -13q0 -5 20 -78 q23 -82 25 -93l26 69q33 87 33 94q0 13 -7.5 18.5t-28.5 7.5v18h100z" />
+<glyph unicode="&#x2b8;" horiz-adv-x="380" d="M374 690v-18q-19 -2 -28 -10.5t-18 -32.5l-114 -305q-33 -91 -59 -120q-24 -25 -64 -25q-33 0 -54 16.5t-21 43.5q0 22 13.5 37t34.5 15q19 0 32.5 -11.5t13.5 -28.5q0 -2 -1 -7.5t-1 -8.5q0 -5 4 -9t9 -4q28 0 50 63l14 41l-91 223q-35 89 -52 113q-5 8 -26 10v18h192 v-18h-13q-27 -3 -27 -20q0 -6 15 -45l55 -143l53 144q8 23 8 38q0 14 -8.5 19.5t-32.5 6.5v18h116z" />
+<glyph unicode="&#x2b9;" horiz-adv-x="208" d="M30 432l93 212q17 40 52 40q14 0 27.5 -13t13.5 -28t-19 -42l-135 -180z" />
+<glyph unicode="&#x2ba;" horiz-adv-x="356" d="M19 432l93 212q17 40 52 40q14 0 27.5 -13t13.5 -28t-19 -42l-135 -180zM178 432l93 212q17 40 52 40q14 0 27.5 -13t13.5 -28t-19 -42l-135 -180z" />
+<glyph unicode="&#x2bb;" horiz-adv-x="333" d="M205 685l11 -22q-109 -76 -109 -133q0 -21 19 -21q3 0 11 1t13 1q32 0 52.5 -21t20.5 -55q0 -39 -23 -62t-61 -23q-47 0 -73.5 31t-26.5 85q0 132 166 219z" />
+<glyph unicode="&#x2bc;" horiz-adv-x="333" d="M57 351l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x2bd;" horiz-adv-x="250" d="M216 373l-11 -22q-166 87 -166 219q0 54 26.5 85t73.5 31q38 0 61 -23t23 -62q0 -34 -20.5 -55t-52.5 -21q-5 0 -13 1t-11 1q-19 0 -19 -21q0 -57 109 -133z" />
+<glyph unicode="&#x2be;" horiz-adv-x="334" d="M65 662h45q61 0 100.5 -33t39.5 -107t-39.5 -107t-100.5 -33h-45v50h45q90 0 90 90q0 38 -20.5 64t-69.5 26h-45v50z" />
+<glyph unicode="&#x2bf;" horiz-adv-x="334" d="M250 382h-45q-61 0 -100.5 33t-39.5 107t39.5 107t100.5 33h45v-50h-45q-49 0 -69.5 -26t-20.5 -64q0 -90 90 -90h45v-50z" />
+<glyph unicode="&#x2c0;" horiz-adv-x="353" d="M103 441h27q38 0 68 27.5t30 74.5q0 43 -12 83t-41 40q-14 0 -23.5 -8.5t-12.5 -17.5t-8 -27q-12 -49 -58 -49q-20 0 -31.5 12.5t-11.5 26.5q0 41 45 65q39 22 83 22q77 0 126 -43t49 -115q0 -66 -42.5 -118.5t-113.5 -52.5q-14 0 -25 1l-6 -122h-43v201z" />
+<glyph unicode="&#x2c1;" horiz-adv-x="353" d="M217 240l-6 122q-11 -1 -25 -1q-71 0 -113.5 52.5t-42.5 118.5q0 72 49 115t126 43q44 0 83 -22q45 -24 45 -65q0 -14 -11.5 -26.5t-31.5 -12.5q-46 0 -58 49q-5 18 -8 27t-12.5 17.5t-23.5 8.5q-29 0 -41 -40t-12 -83q0 -47 30 -74.5t68 -27.5h27v-201h-43z" />
+<glyph unicode="&#x2c2;" horiz-adv-x="317" d="M297 414l-267 148v50l267 148v-76l-179 -97l179 -97v-76z" />
+<glyph unicode="&#x2c3;" horiz-adv-x="317" d="M297 562l-267 -148v76l179 97l-179 97v76l267 -148v-50z" />
+<glyph unicode="&#x2c4;" horiz-adv-x="317" d="M332 453h-76l-97 179l-97 -179h-76l148 267h50z" />
+<glyph unicode="&#x2c5;" horiz-adv-x="317" d="M332 720l-148 -267h-50l-148 267h76l97 -179l97 179h76z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="333" d="M335 528h-57l-112 98l-112 -98h-56l122 176h92z" />
+<glyph unicode="&#x2c7;" horiz-adv-x="333" d="M335 704l-123 -176h-92l-122 176h57l111 -99l111 99h58z" />
+<glyph unicode="&#x2c8;" horiz-adv-x="279" d="M167 455h-55v265h55v-265z" />
+<glyph unicode="&#x2c9;" horiz-adv-x="370" d="M350 565h-330v72h330v-72z" />
+<glyph unicode="&#x2ca;" horiz-adv-x="266" d="M20 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#x2cb;" horiz-adv-x="266" d="M258 528h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28z" />
+<glyph unicode="&#x2cc;" horiz-adv-x="278" d="M167 -195h-55v265h55v-265z" />
+<glyph unicode="&#x2cd;" horiz-adv-x="370" d="M350 -160h-330v72h330v-72z" />
+<glyph unicode="&#x2ce;" horiz-adv-x="333" d="M253 -192h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28z" />
+<glyph unicode="&#x2cf;" horiz-adv-x="333" d="M80 -192l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#x2d0;" horiz-adv-x="333" d="M254 474l-55 -180h-65l-55 180h175zM254 4h-175l55 180h65z" />
+<glyph unicode="&#x2d1;" horiz-adv-x="333" d="M254 474l-55 -180h-65l-55 180h175z" />
+<glyph unicode="&#x2d2;" horiz-adv-x="333" d="M65 378h45q64 0 111 -42t47 -116t-47 -116t-111 -42h-45v68h45q38 0 64 26t26 64t-26 64t-64 26h-45v68z" />
+<glyph unicode="&#x2d3;" horiz-adv-x="333" d="M268 62h-45q-64 0 -111 42t-47 116t47 116t111 42h45v-68h-45q-37 0 -63.5 -26t-26.5 -64t26.5 -64t63.5 -26h45v-68z" />
+<glyph unicode="&#x2d4;" horiz-adv-x="333" d="M281 4h-230v55h87v147h55v-147h88v-55z" />
+<glyph unicode="&#x2d5;" horiz-adv-x="333" d="M281 151h-88v-147h-55v147h-87v55h230v-55z" />
+<glyph unicode="&#x2d6;" horiz-adv-x="334" d="M273 85h-76v-76h-60v76h-76v66h76v76h60v-76h76v-66z" />
+<glyph unicode="&#x2d7;" horiz-adv-x="334" d="M273 84h-212v66h212v-66z" />
+<glyph unicode="&#x2d8;" horiz-adv-x="333" d="M274 691h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67z" />
+<glyph unicode="&#x2d9;" horiz-adv-x="333" d="M231 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x2da;" horiz-adv-x="333" d="M273 645q0 -44 -31 -76t-75 -32q-45 0 -76 30.5t-31 75.5q0 44 32 75.5t76 31.5q43 0 74 -31t31 -74zM225 642q0 25 -18 42.5t-43 17.5q-22 0 -39 -17.5t-17 -40.5q0 -24 17 -41.5t40 -17.5q25 0 42.5 16.5t17.5 40.5z" />
+<glyph unicode="&#x2db;" horiz-adv-x="333" d="M296 -83l23 -16q-18 -34 -54 -54t-72 -20q-47 0 -75 21.5t-28 56.5q0 28 11.5 51.5t42.5 59.5q4 6 8 10l6 6l33 12l-6 -20q-11 -39 -11 -64q0 -35 14 -49.5t47 -14.5q22 0 48 13q4 2 13 8z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="333" d="M306 674h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38z" />
+<glyph unicode="&#x2dd;" horiz-adv-x="333" d="M187 528l136 157q25 28 54 28q22 0 35 -12t13 -32q0 -17 -8 -28.5t-32 -26.5l-141 -86h-57zM-13 528l136 157q25 28 54 28q22 0 35 -12t13 -32q0 -17 -8 -28.5t-32 -26.5l-141 -86h-57z" />
+<glyph unicode="&#x2de;" horiz-adv-x="292" d="M279 342l23 -64q-16 -44 -28 -60q-25 -32 -63 -32q-40 0 -75 56q-13 23 -56 115q-12 -21 -37.5 -37t-39.5 -20l-3 55q42 28 62 53q22 28 31 73q52 -151 90 -202q19 -25 34 -25q24 0 41 32q8 14 21 56z" />
+<glyph unicode="&#x2df;" horiz-adv-x="260" d="M250 550l-45 -44l-74 74l-76 -74l-45 44l75 76l-74 73l45 45l75 -73l73 73l46 -45l-74 -73z" />
+<glyph unicode="&#x2e0;" horiz-adv-x="420" d="M410 667h-8q-13 0 -38 -42l-111 -189l70 -118q17 -30 17 -55q0 -34 -36 -53.5t-77 -19.5q-114 0 -114 62q0 26 22 64l50 86l-92 159q-40 71 -45 78q-17 27 -38 28v17h152v-17q-29 0 -29 -22q0 -3 15 -29l81 -139l67 113q27 46 27 53q0 24 -32 24v17h119v-17zM209 361 l-25 -44q-25 -42 -25 -62q0 -22 19 -31.5t38 -9.5q18 0 35.5 8.5t17.5 27.5q0 10 -40 77z" />
+<glyph unicode="&#x2e1;" horiz-adv-x="190" d="M186 335h-180v18q20 2 29 12.5t9 34.5v375q0 46 -39 49v18h144v-442q0 -46 37 -47v-18z" />
+<glyph unicode="&#x2e2;" horiz-adv-x="300" d="M262 582h-19q-16 45 -37 63q-27 25 -57 25q-22 0 -36.5 -12.5t-14.5 -32.5q0 -38 74 -68q57 -23 81.5 -51t24.5 -69q0 -52 -33 -84.5t-86 -32.5q-37 0 -83 18q-12 5 -17 5q-9 0 -21 -22h-19v127h22q24 -102 105 -102q26 0 42 13.5t16 36.5q0 19 -17 34.5t-57 32.5 q-58 25 -83.5 53.5t-25.5 66.5q0 48 34.5 80t86.5 32q26 0 60 -11q18 -6 24 -6q12 0 19 16h17v-112z" />
+<glyph unicode="&#x2e3;" horiz-adv-x="380" d="M376 335h-186v18q35 3 35 16q0 11 -25 49l-33 49l-47 -63q-14 -19 -14 -32q0 -16 38 -19v-18h-130v18q21 1 37.5 15t49.5 57l50 65l-99 151q-12 18 -18.5 23t-21.5 8v18h193v-18q-36 -1 -36 -15q0 -12 15 -33l40 -56l27 36q30 39 30 49q0 14 -24 17l-16 2v18h130v-18 q-33 -5 -54 -31l-78 -97l108 -168q15 -23 29 -23v-18z" />
+<glyph unicode="&#x2e4;" horiz-adv-x="328" d="M170 419v108q-7 -1 -16 -1q-59 0 -96.5 53t-37.5 118q0 72 49 115t126 43q44 0 83 -22q45 -24 45 -65q0 -14 -11.5 -26.5t-31.5 -12.5q-46 0 -58 49q-5 18 -8 27t-12.5 17.5t-23.5 8.5q-29 0 -41 -40t-12 -83q0 -47 30 -74.5t68 -27.5h27v-198q0 -31 13.5 -42t55.5 -14 v-17h-224v17q47 3 61 13t14 54z" />
+<glyph unicode="&#x2e5;" horiz-adv-x="405" d="M368 0h-66v610h-262v66h328v-676z" />
+<glyph unicode="&#x2e6;" horiz-adv-x="405" d="M368 0h-66v428h-262v66h262v182h66v-676z" />
+<glyph unicode="&#x2e7;" horiz-adv-x="405" d="M368 0h-66v305h-262v66h262v305h66v-676z" />
+<glyph unicode="&#x2e8;" horiz-adv-x="405" d="M368 0h-66v182h-262v66h262v428h66v-676z" />
+<glyph unicode="&#x2e9;" horiz-adv-x="405" d="M368 0h-328v66h262v610h66v-676z" />
+<glyph unicode="&#x2ec;" horiz-adv-x="314" d="M309 70l-131 -237h-43l-130 237h78l74 -136l74 136h78z" />
+<glyph unicode="&#x2ed;" horiz-adv-x="395" d="M390 648h-385v72h385v-72zM390 528h-385v72h385v-72z" />
+<glyph unicode="&#x300;" horiz-adv-x="0" d="M-131 528h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28z" />
+<glyph unicode="&#x301;" horiz-adv-x="0" d="M-369 528l137 157q25 28 54 28q20 0 33.5 -13t13.5 -32q0 -27 -40 -52l-142 -88h-56z" />
+<glyph unicode="&#x302;" horiz-adv-x="0" d="M-81 528h-57l-112 98l-112 -98h-56l122 176h92z" />
+<glyph unicode="&#x303;" horiz-adv-x="0" d="M-110 674h43q-34 -127 -116 -127q-36 0 -83 22q-5 2 -20.5 9.5t-21.5 10t-15.5 5t-17.5 2.5q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q32 0 88 -26q52 -23 62 -23q22 0 34 11t22 38z" />
+<glyph unicode="&#x304;" horiz-adv-x="0" d="M-85 565h-330v72h330v-72z" />
+<glyph unicode="&#x305;" horiz-adv-x="0" d="M0 788h-500v50h500v-50z" />
+<glyph unicode="&#x306;" horiz-adv-x="0" d="M-142 691h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67z" />
+<glyph unicode="&#x307;" horiz-adv-x="0" d="M-185 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x308;" horiz-adv-x="0" d="M-80 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM-290 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#x309;" horiz-adv-x="0" d="M-292 589h18q26 0 46 19t20 45q0 72 -28 72q-11 0 -17 -10t-8 -22t-12.5 -22t-29.5 -10q-13 0 -23 8.5t-10 21.5q0 28 25.5 44t55.5 16q53 0 88.5 -26.5t35.5 -78.5q0 -50 -34.5 -81.5t-85.5 -31.5l-2 -42h-39v98z" />
+<glyph unicode="&#x30a;" horiz-adv-x="0" d="M-143 645q0 -44 -31 -76t-75 -32q-45 0 -76 30.5t-31 75.5q0 44 32 75.5t76 31.5q43 0 74 -31t31 -74zM-191 642q0 25 -18 42.5t-43 17.5q-22 0 -39 -17.5t-17 -40.5q0 -24 17 -41.5t40 -17.5q25 0 42.5 16.5t17.5 40.5z" />
+<glyph unicode="&#x30b;" horiz-adv-x="0" d="M-469 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM-269 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#x30c;" horiz-adv-x="0" d="M-81 704l-123 -176h-92l-122 176h57l111 -99l111 99h58z" />
+<glyph unicode="&#x30d;" horiz-adv-x="0" d="M-211 530h-66v200h66v-200z" />
+<glyph unicode="&#x30e;" horiz-adv-x="0" d="M-292 530h-66v200h66v-200zM-142 530h-66v200h66v-200z" />
+<glyph unicode="&#x30f;" horiz-adv-x="0" d="M-31 528h-56l-142 88q-24 15 -32 25.5t-8 27.5q0 20 13 32t35 12q28 0 53 -28zM-231 528h-56l-142 88q-24 15 -32 25.5t-8 27.5q0 20 13 32t35 12q28 0 53 -28z" />
+<glyph unicode="&#x310;" horiz-adv-x="0" d="M-185 762q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM-142 691h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67z" />
+<glyph unicode="&#x311;" horiz-adv-x="0" d="M-98 528h-44q-13 47 -39.5 67t-73.5 20q-85 0 -102 -87h-44q1 74 39.5 118.5t111.5 44.5q71 0 108.5 -44t43.5 -119z" />
+<glyph unicode="&#x312;" horiz-adv-x="0" d="M-176 867l11 -22q-109 -76 -109 -133q0 -21 19 -21q3 0 11 1t13 1q32 0 52.5 -21t20.5 -55q0 -39 -23 -62t-61 -23q-47 0 -73.5 31t-26.5 85q0 132 166 219z" />
+<glyph unicode="&#x313;" horiz-adv-x="0" d="M-324 532l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x314;" horiz-adv-x="0" d="M-165 554l-11 -22q-166 87 -166 219q0 54 26.5 85t73.5 31q38 0 61 -23t23 -62q0 -34 -20.5 -55t-52.5 -21q-5 0 -13 1t-11 1q-19 0 -19 -21q0 -57 109 -133z" />
+<glyph unicode="&#x315;" horiz-adv-x="0" d="M-98 532l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x316;" horiz-adv-x="0" d="M-131 -255h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28z" />
+<glyph unicode="&#x317;" horiz-adv-x="0" d="M-369 -255l137 157q25 28 54 28q20 0 33.5 -13t13.5 -32q0 -27 -40 -52l-142 -88h-56z" />
+<glyph unicode="&#x318;" horiz-adv-x="0" d="M-223 -288h-55v88h-147v55h147v87h55v-230z" />
+<glyph unicode="&#x319;" horiz-adv-x="0" d="M-86 -200h-147v-88h-55v230h55v-87h147v-55z" />
+<glyph unicode="&#x31a;" horiz-adv-x="0" d="M-93 531h-72v149h-245v72h317v-221z" />
+<glyph unicode="&#x31b;" horiz-adv-x="0" d="M-62 374h8q46 0 46 25q0 1 -10.5 7.5t-20.5 19.5t-10 30t15 33t38 16q26 0 44 -18t18 -49q0 -32 -20 -53t-52 -28q-22 -5 -56 -5v22z" />
+<glyph unicode="&#x31c;" horiz-adv-x="0" d="M-190 -313h-45q-61 0 -100.5 33t-39.5 107t39.5 107t100.5 33h45v-50h-45q-49 0 -69.5 -26t-20.5 -64q0 -90 90 -90h45v-50z" />
+<glyph unicode="&#x31d;" horiz-adv-x="0" d="M-135 -272h-230v55h87v147h55v-147h88v-55z" />
+<glyph unicode="&#x31e;" horiz-adv-x="0" d="M-135 -125h-88v-147h-55v147h-87v55h230v-55z" />
+<glyph unicode="&#x31f;" horiz-adv-x="0" d="M-144 -206h-76v-81h-60v81h-76v66h76v70h60v-70h76v-66z" />
+<glyph unicode="&#x320;" horiz-adv-x="0" d="M-144 -206h-212v66h212v-66z" />
+<glyph unicode="&#x321;" horiz-adv-x="0" d="M-22 75v-212q0 -76 -27 -112q-30 -38 -93 -38q-44 0 -71.5 21t-27.5 54q0 21 12 34.5t31 13.5q17 0 29 -12.5t12 -30.5q0 -15 -8 -27t-8 -15q0 -15 23 -15q21 0 38.5 13t17.5 38v288h72z" />
+<glyph unicode="&#x322;" horiz-adv-x="0" d="M-22 75v-288q0 -25 17.5 -38t38.5 -13q23 0 23 15q0 3 -8 15t-8 27q0 18 12 30.5t29 12.5q19 0 31 -13.5t12 -34.5q0 -33 -27.5 -54t-71.5 -21q-63 0 -93 38q-27 36 -27 112v212h72z" />
+<glyph unicode="&#x323;" horiz-adv-x="0" d="M-185 -173q0 -27 -19 -46t-47 -19q-26 0 -44.5 19t-18.5 46q0 26 18.5 45t44.5 19q27 0 46.5 -18.5t19.5 -45.5z" />
+<glyph unicode="&#x324;" horiz-adv-x="0" d="M-80 -173q0 -27 -19 -46t-47 -19q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19t19.5 -45zM-290 -173q0 -27 -18.5 -46t-46.5 -19q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -44.5z" />
+<glyph unicode="&#x325;" horiz-adv-x="0" d="M-143 -173q0 -44 -31 -75t-75 -31q-45 0 -76 31t-31 75t32 75.5t76 31.5q43 0 74 -31.5t31 -75.5zM-191 -173q0 23 -18 41t-43 18q-22 0 -39 -18t-17 -41q0 -24 17 -41t40 -17q24 0 42 17t18 41z" />
+<glyph unicode="&#x326;" horiz-adv-x="0" d="M-324 -423l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x327;" horiz-adv-x="0" d="M-230 0l-28 -64q15 5 32 5q42 0 65.5 -18.5t23.5 -51.5q0 -41 -35 -65t-94 -24q-46 0 -97 18l16 37l6 -2q36 -12 53 -12q58 0 58 41q0 36 -46 36q-13 0 -28 -4l-11 8l43 96h42z" />
+<glyph unicode="&#x328;" horiz-adv-x="0" d="M-158 -83l23 -16q-18 -34 -54 -54t-72 -20q-47 0 -75 21.5t-28 56.5q0 28 11.5 51.5t42.5 59.5q4 6 8 10l6 6l33 12l-6 -20q-11 -39 -11 -64q0 -35 14 -49.5t47 -14.5q22 0 48 13q4 2 13 8z" />
+<glyph unicode="&#x329;" horiz-adv-x="0" d="M-222 -239h-55v132h55v-132z" />
+<glyph unicode="&#x32a;" horiz-adv-x="0" d="M-93 -260h-72v102h-188v-102h-72v174h332v-174z" />
+<glyph unicode="&#x32b;" horiz-adv-x="0" d="M-95 -104v-44q0 -47 -27 -70.5t-70 -23.5q-47 0 -68 34q-21 -34 -61 -34q-99 0 -99 94v44h55v-45q0 -38 39 -38t39 38v45h55v-44q0 -39 41 -39t41 39v44h55z" />
+<glyph unicode="&#x32c;" horiz-adv-x="0" d="M-81 -83l-123 -176h-92l-122 176h57l111 -99l111 99h58z" />
+<glyph unicode="&#x32d;" horiz-adv-x="0" d="M-81 -261h-57l-112 98l-112 -98h-56l122 176h92z" />
+<glyph unicode="&#x32e;" horiz-adv-x="0" d="M-142 -78h44q-6 -75 -43.5 -119t-108.5 -44q-73 0 -111.5 44.5t-39.5 118.5h44q17 -87 102 -87q47 0 73.5 20t39.5 67z" />
+<glyph unicode="&#x32f;" horiz-adv-x="0" d="M-98 -241h-44q-13 47 -39.5 67t-73.5 20q-85 0 -102 -87h-44q1 74 39.5 118.5t111.5 44.5q71 0 108.5 -44t43.5 -119z" />
+<glyph unicode="&#x330;" horiz-adv-x="0" d="M-110 -108h43q-34 -127 -116 -127q-36 0 -83 22q-5 2 -20.5 9.5t-21.5 10t-15.5 5t-17.5 2.5q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q32 0 88 -26q52 -23 62 -23q22 0 34 11t22 38z" />
+<glyph unicode="&#x331;" horiz-adv-x="0" d="M-85 -209h-330v72h330v-72z" />
+<glyph unicode="&#x332;" horiz-adv-x="0" d="M0 -187h-500v50h500v-50z" />
+<glyph unicode="&#x333;" horiz-adv-x="0" d="M0 -287h-500v50h500v-50zM0 -187h-500v50h500v-50z" />
+<glyph unicode="&#x334;" horiz-adv-x="0" d="M-110 316h43q-34 -127 -116 -127q-36 0 -83 22q-5 2 -20.5 9.5t-21.5 10t-15.5 5t-17.5 2.5q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q32 0 88 -26q52 -23 62 -23q22 0 34 11t22 38z" />
+<glyph unicode="&#x335;" horiz-adv-x="0" d="M-108 224h-306v58h306v-58z" />
+<glyph unicode="&#x336;" horiz-adv-x="0" d="M-10 224h-500v58h500v-58z" />
+<glyph unicode="&#x337;" horiz-adv-x="0" d="M-43 580l-285 -654h-82l285 654h82z" />
+<glyph unicode="&#x338;" horiz-adv-x="0" d="M31 662l-357 -818h-84l357 818h84z" />
+<glyph unicode="&#x339;" horiz-adv-x="0" d="M-375 -33h45q61 0 100.5 -33t39.5 -107t-39.5 -107t-100.5 -33h-45v50h45q90 0 90 90q0 38 -20.5 64t-69.5 26h-45v50z" />
+<glyph unicode="&#x33a;" horiz-adv-x="0" d="M-93 -245h-332v174h72v-102h188v102h72v-174z" />
+<glyph unicode="&#x33b;" horiz-adv-x="0" d="M-167 -264h-186v194h186v-194zM-222 -209v84h-76v-84h76z" />
+<glyph unicode="&#x33c;" horiz-adv-x="0" d="M-109 -115v-68q-36 22 -69 22q-7 0 -12.5 -2t-11 -7t-9 -8.5t-8.5 -13t-7 -13t-7.5 -15.5t-6.5 -14h-38q-2 3 -7 15t-7 16t-7 13t-9 12l-12 9q-6 5 -13.5 6.5t-17.5 1.5q-24 0 -59 -22v68q39 26 65 26q53 0 85 -53q37 53 86 53q27 0 65 -26z" />
+<glyph unicode="&#x33d;" horiz-adv-x="0" d="M-150 558l-38 -38l-62 62l-62 -62l-38 38l62 62l-61 62l38 37l61 -61l61 61l39 -37l-62 -62z" />
+<glyph unicode="&#x33e;" horiz-adv-x="0" d="M-189 881v-42q-21 -3 -34 -16.5t-13 -32.5q0 -8 2.5 -17.5t5 -15.5t10 -21.5t9.5 -20.5q22 -47 22 -83q0 -82 -127 -116v42q27 10 38 22.5t11 34.5q0 10 -23 62q-26 56 -26 88q0 46 30 74t95 42z" />
+<glyph unicode="&#x33f;" horiz-adv-x="0" d="M0 788h-500v50h500v-50zM0 888h-500v50h500v-50z" />
+<glyph unicode="&#x346;" horiz-adv-x="0" d="M-107 544h-78v95h-147v-95h-78v173h303v-173z" />
+<glyph unicode="&#x34c;" horiz-adv-x="0" d="M-124 674h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38zM-124 837h43q-34 -127 -116 -127q-32 0 -65 14l-29 13q-48 22 -64 22q-19 0 -32.5 -13 t-16.5 -34h-42q14 65 42 95t74 30q31 0 73 -19l40 -18q27 -12 39 -12q20 0 32 11t22 38z" />
+<glyph unicode="&#x359;" horiz-adv-x="0" d="M-89 -157q0 -25 -44 -35q-46 -11 -71 -27q31 -17 67 -26q36 -10 44 -22q3 -6 3 -14q0 -28 -27 -28q-17 0 -47 32q-28 30 -48 43q0 -20 9.5 -51t9.5 -48q0 -12 -7.5 -23.5t-21.5 -11.5t-21.5 11.5t-7.5 23.5q0 17 9 47t9 51q-24 -17 -44 -39q-32 -34 -54 -34q-27 0 -27 27 q0 12 9 20t18 11t26 7q26 6 60 24q-21 13 -59 23q-4 1 -14.5 4t-15.5 5t-12 6t-10 10.5t-3 15.5q0 12 7.5 20t17.5 8q25 0 52 -33q17 -22 49 -41q0 21 -9 53.5t-9 49.5q0 11 7 21.5t22 10.5q29 0 29 -32q0 -17 -9.5 -49.5t-9.5 -53.5q32 18 55 47q20 27 43 27 q10 0 17.5 -8.5t7.5 -21.5z" />
+<glyph unicode="&#x35c;" horiz-adv-x="0" d="M256 -79h44q0 -40 -27 -71t-66 -48t-90.5 -27.5t-91 -13.5t-76.5 -3t-76 3t-90.5 13.5t-90.5 27.5t-66 48t-27 71h44q22 -87 306 -87q285 0 307 87z" />
+<glyph unicode="&#x360;" horiz-adv-x="0" d="M355 656h43q-37 -127 -193 -127q-27 0 -107.5 12t-121.5 21q-156 34 -215 34q-67 0 -104 -8.5t-47 -38.5h-42q11 53 62 89t135 36q72 0 219 -33q153 -34 257 -34q37 0 54.5 2t34 13t25.5 34z" />
+<glyph unicode="&#x361;" horiz-adv-x="0" d="M265 534h-29q-6 29 -44 50t-91 30.5t-94.5 13t-75.5 3.5t-75.5 -3.5t-94.5 -13t-91 -30.5t-44 -50h-29q0 40 25.5 70t62 46t86 26t86.5 12.5t74 2.5t74 -2.5t86.5 -12.5t86 -26t62 -46t25.5 -70z" />
+<glyph unicode="&#x362;" horiz-adv-x="0" d="M377 -161v-24q-31 -13 -70.5 -45t-66.5 -63l-33 32q11 14 21 25l13 13q3 3 3 5q0 9 -12 9h-664v72h665q3 0 7.5 3.5t4.5 7.5q0 1 -3.5 4t-13 12.5t-21.5 24.5l34 31q26 -30 65 -62t71 -45z" />
+<glyph unicode="&#x37e;" horiz-adv-x="333" d="M251 387q0 -35 -25 -59.5t-60 -24.5t-59.5 24.5t-24.5 60.5q0 35 24.5 59.5t60.5 24.5q35 0 59.5 -25t24.5 -60zM100 -180l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z " />
+<glyph unicode="&#x384;" horiz-adv-x="300" d="M118 528l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48z" />
+<glyph unicode="&#x385;" horiz-adv-x="390" d="M392 591q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM118 528l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48zM127 591q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19 t45 -19.5t19 -46.5z" />
+<glyph unicode="&#x386;" horiz-adv-x="722" d="M118 536l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48zM689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5 t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#x387;" horiz-adv-x="333" d="M251 387q0 -35 -25 -59.5t-60 -24.5t-59.5 24.5t-24.5 60.5q0 35 24.5 59.5t60.5 24.5q35 0 59.5 -25t24.5 -60z" />
+<glyph unicode="&#x388;" horiz-adv-x="800" d="M10 536l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48zM791 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26 q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54q25 20 42 46t40 77h28z" />
+<glyph unicode="&#x389;" horiz-adv-x="920" d="M10 536l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48zM904 0h-339v25q54 6 71.5 20.5t17.5 52.5v228h-241v-228q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-204h241v204 q0 41 -18 55.5t-71 18.5v25h339v-25q-51 -4 -69.5 -19t-18.5 -55v-479q0 -39 16.5 -52.5t71.5 -20.5v-25z" />
+<glyph unicode="&#x38a;" horiz-adv-x="530" d="M10 536l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48zM516 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x38c;" horiz-adv-x="778" d="M10 536l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48zM743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5 t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#x38e;" horiz-adv-x="860" d="M10 536l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48zM846 670v-25q-18 5 -31 5q-30 0 -56 -8.5t-53.5 -32t-49 -61.5t-40 -101t-29.5 -146v-178q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136q0 166 -50.5 264t-141.5 98 q-29 0 -59 -10l-14 24q22 20 57.5 36t66.5 16q59 0 102 -13.5t78 -46.5t55.5 -92t27.5 -146h5q11 58 28 103q34 95 89.5 140t122.5 45q34 0 54 -12z" />
+<glyph unicode="&#x38f;" horiz-adv-x="780" d="M351 0h-302v197h25q7 -48 22 -62.5t49 -14.5h153l-2 29q-98 15 -166.5 88.5t-68.5 172.5q0 121 100 201.5t249 80.5q148 0 243.5 -80.5t95.5 -204.5q0 -95 -69 -165t-166 -93l-2 -29h148q36 0 52.5 15t23.5 62h25v-197h-302l7 181q116 28 116 232q0 101 -48.5 173.5 t-132.5 72.5q-82 0 -127.5 -72t-45.5 -172q0 -206 116 -234zM10 536l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48z" />
+<glyph unicode="&#x390;" horiz-adv-x="390" d="M245 461v-349q0 -56 24 -56t49 45l23 -12q-17 -43 -55.5 -73t-87.5 -30q-46 0 -69 26.5t-23 64.5v299q0 33 -11.5 45t-42.5 16v24h193zM392 591q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM118 528l61 136q12 28 47 28 q37 0 37 -44q0 -15 -34 -53l-63 -67h-48zM127 591q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#x391;" horiz-adv-x="722" d="M689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#x392;" horiz-adv-x="667" d="M426 365v-1q85 -11 139 -58.5t54 -117.5q0 -83 -72 -135.5t-202 -52.5h-329v25q55 6 71.5 21t16.5 57v467q0 44 -18.5 60.5t-69.5 20.5v25h317q121 0 186.5 -41.5t65.5 -118.5q0 -59 -37 -96.5t-122 -54.5zM264 592v-219q91 0 123.5 30t32.5 106q0 137 -99 137 q-30 0 -43.5 -12.5t-13.5 -41.5zM264 343v-245q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 155 -157 155h-26z" />
+<glyph unicode="&#x393;" horiz-adv-x="620" d="M593 676v-202h-24q-10 57 -22 81.5t-38 47.5q-45 39 -173 39q-38 0 -54 -11.5t-16 -39.5v-490q0 -43 21 -58t89 -18v-25h-360v25q55 6 71.5 21t16.5 57v472q0 43 -18 58t-70 18v25h577z" />
+<glyph unicode="&#x394;" horiz-adv-x="722" d="M357 690l316 -690h-640l296 690h28zM128 120h320l-165 359z" />
+<glyph unicode="&#x395;" horiz-adv-x="667" d="M641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54 q25 20 42 46t40 77h28z" />
+<glyph unicode="&#x396;" horiz-adv-x="667" d="M634 242l-27 -242h-579v16l382 625l-83 -3q-62 -2 -96.5 -8.5t-63.5 -25t-46 -49.5t-34 -86h-28l22 207h523v-16l-379 -625h83q145 0 202 40q27 19 45 45t26.5 47t26.5 75h26z" />
+<glyph unicode="&#x397;" horiz-adv-x="778" d="M759 0h-339v25q54 6 71.5 20.5t17.5 52.5v228h-241v-228q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-204h241v204q0 41 -18 55.5t-71 18.5v25h339v-25q-51 -4 -69.5 -19t-18.5 -55v-479 q0 -39 16.5 -52.5t71.5 -20.5v-25z" />
+<glyph unicode="&#x398;" horiz-adv-x="778" d="M743 336q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 329q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234zM260 456h26q11 -35 21.5 -46t30.5 -11h109 q17 0 25 11.5t15 45.5h26q-12 -55 -12 -110q0 -58 14 -123h-26q-9 56 -43 56h-109q-23 0 -32 -9.5t-19 -46.5h-26q15 51 15 118q0 53 -15 115z" />
+<glyph unicode="&#x399;" horiz-adv-x="389" d="M370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x39a;" horiz-adv-x="778" d="M769 0h-334v25q47 1 62 6t15 15q0 13 -25 45l-181 225l-27 -25v-196q0 -37 16.5 -50t70.5 -20v-25h-336v25q55 5 71 19t16 57v472q0 46 -17 60.5t-70 17.5v25h337v-25q-54 -4 -71 -20.5t-17 -63.5v-223l212 215q24 24 32 35t8 23q0 15 -10.5 22t-37.5 9l-35 3v25h289v-25 q-78 -9 -133 -46.5t-189 -180.5l305 -378q16 -20 49 -21v-25z" />
+<glyph unicode="&#x39b;" horiz-adv-x="707" d="M674 25v-25h-322v25l32 3q25 2 34.5 9.5t9.5 23.5q0 23 -44 136l-108 280h-2l-114 -314q-28 -79 -28 -97q0 -20 17.5 -29t61.5 -12v-25h-202v25q35 6 53.5 28.5t45.5 91.5l213 545h28l215 -522q37 -90 58 -116.5t52 -26.5z" />
+<glyph unicode="&#x39c;" horiz-adv-x="944" d="M921 0h-332v25q55 5 72 22t17 62v496l-252 -605h-27l-252 594v-465q0 -58 20 -79t81 -25v-25h-234v25q59 6 75 20.5t16 62.5v469q0 41 -17 55.5t-72 18.5v25h253l199 -472l201 472h252v-25q-55 -4 -71.5 -22.5t-16.5 -74.5v-428q0 -57 15 -76.5t73 -24.5v-25z" />
+<glyph unicode="&#x39d;" horiz-adv-x="722" d="M701 676v-25q-50 -8 -64 -22.5t-14 -60.5v-586h-28l-447 545v-396q0 -58 18 -78.5t76 -27.5v-25h-226v25q55 7 71.5 22.5t16.5 61.5v470q-52 72 -85 72v25h211l349 -430v299q0 60 -18 80.5t-74 25.5v25h214z" />
+<glyph unicode="&#x39e;" horiz-adv-x="647" d="M67 481v195h513v-195h-25q-8 43 -23 59t-51 16h-307q-67 0 -82 -75h-25zM141 463h25q7 -38 20 -47t50 -9h181q32 0 44.5 9.5t19.5 46.5h25v-223h-25q-7 35 -21 46t-43 11h-182q-35 0 -48.5 -10.5t-20.5 -46.5h-25v223zM40 232h25q8 -49 23.5 -67t58.5 -18h349 q48 0 63 17.5t23 67.5h25v-232h-567v232z" />
+<glyph unicode="&#x39f;" horiz-adv-x="778" d="M743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#x3a0;" horiz-adv-x="778" d="M509 629h-241v-531q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h738v-25q-51 -4 -69.5 -19t-18.5 -55v-479q0 -39 16.5 -52.5t71.5 -20.5v-25h-339v25q54 6 71.5 20.5t17.5 52.5v531z" />
+<glyph unicode="&#x3a1;" horiz-adv-x="611" d="M16 676h315q128 0 198.5 -45.5t70.5 -135.5q0 -60 -33.5 -104.5t-95.5 -67.5q-32 -12 -70.5 -15.5t-138.5 -4.5v-192q0 -51 14 -65t73 -21v-25h-333v25q33 3 45 9q23 9 31 30t8 62v427q0 58 -15.5 75.5t-68.5 22.5v25zM262 606v-268q94 1 130 32t36 114q0 84 -27 120.5 t-89 36.5q-50 0 -50 -35z" />
+<glyph unicode="&#x3a3;" horiz-adv-x="671" d="M306 317l-278 343v16h580v-197h-26q-22 94 -57.5 122.5t-100.5 28.5h-182l187 -240l-225 -243h256q30 0 49 3t41.5 13.5t38 34.5t26.5 63h26l-32 -261h-581v16z" />
+<glyph unicode="&#x3a4;" horiz-adv-x="667" d="M636 475h-29q-13 89 -56.5 127.5t-135.5 41.5v-527q0 -57 16.5 -72t81.5 -20v-25h-357v25q64 5 80.5 20.5t16.5 71.5v527q-93 -3 -136.5 -41.5t-56.5 -127.5h-29l3 201h600z" />
+<glyph unicode="&#x3a5;" horiz-adv-x="703" d="M693 670v-25q-18 5 -31 5q-30 0 -56 -8.5t-53.5 -32t-49 -61.5t-40 -101t-29.5 -146v-178q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136q0 166 -50.5 264t-141.5 98q-29 0 -59 -10l-14 24q22 20 57.5 36t66.5 16q121 0 185.5 -65t77.5 -233h5 q11 58 28 103q34 95 89.5 140t122.5 45q35 0 54 -12z" />
+<glyph unicode="&#x3a6;" horiz-adv-x="836" d="M498 586v-22q56 -2 109.5 -15t102.5 -38.5t78.5 -70t29.5 -102.5q0 -60 -33.5 -107.5t-85 -73t-103.5 -38.5t-98 -13v-15q0 -29 21 -44.5t74 -21.5v-25h-353v25q58 4 77 19t19 47v15q-59 0 -113 12.5t-101 38.5t-75.5 73t-28.5 108q0 58 29.5 102.5t78 70t101.5 38.5 t109 15v24q0 18 -2 27t-9.5 18.5t-25.5 13.5t-48 4v25h332v-25q-29 0 -47 -5t-25.5 -15.5t-10 -20t-2.5 -24.5zM496 530v-390q58 0 104 45.5t46 139.5q0 106 -41 155.5t-109 49.5zM338 140v390q-63 0 -105.5 -50.5t-42.5 -154.5q0 -98 41.5 -141.5t106.5 -43.5z" />
+<glyph unicode="&#x3a7;" horiz-adv-x="722" d="M699 0h-340v25l28 2q52 3 52 28q0 21 -21 54l-101 162l-38 -51q-56 -76 -75 -106.5t-19 -46.5q0 -19 17.5 -28t63.5 -14v-25h-250v25q37 4 59 16t45 40l175 221l-198 291q-23 34 -38 45t-42 13v25h346v-25l-31 -2q-27 -1 -37.5 -8t-10.5 -23q0 -14 15 -37l97 -150l56 77 q36 49 47 69.5t11 36.5q0 18 -11 25t-40 10l-21 2v25h250v-25q-57 -5 -90.5 -30.5t-97.5 -115.5l-80 -111l182 -283q35 -54 53 -69.5t44 -16.5v-25z" />
+<glyph unicode="&#x3a8;" horiz-adv-x="808" d="M326 298v290q0 18 -2 27t-9.5 18.5t-25.5 13.5t-48 4v25h332v-25q-29 0 -47 -5t-25.5 -15.5t-10 -20t-2.5 -24.5v-288q46 0 73 48t27 113q0 84 35 142q55 91 141 91h33v-25q-24 0 -38.5 -30.5t-14.5 -59.5q0 -4 2 -38.5t2 -51.5q0 -60 -22 -105t-59.5 -69.5t-82 -36.5 t-96.5 -12v-141q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 3 76.5 25t16.5 78v136q-53 0 -98 11.5t-82.5 37t-58.5 70t-21 104.5q0 8 2 43.5t2 46.5q0 32 -14 61t-41 29v25h33q86 0 142 -91q36 -59 36 -142q0 -65 27 -113t73 -48z" />
+<glyph unicode="&#x3a9;" horiz-adv-x="768" d="M330 0h-302v197h25q7 -48 22 -62.5t49 -14.5h153l-2 29q-98 15 -166.5 88.5t-68.5 172.5q0 121 100 201.5t249 80.5q148 0 243.5 -80.5t95.5 -204.5q0 -95 -69 -165t-166 -93l-2 -29h148q36 0 52.5 15t23.5 62h25v-197h-302l7 181q116 28 116 232q0 101 -48.5 173.5 t-132.5 72.5q-82 0 -127.5 -72t-45.5 -172q0 -206 116 -234z" />
+<glyph unicode="&#x3aa;" horiz-adv-x="389" d="M365 849q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM155 849q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19 v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x3ab;" horiz-adv-x="703" d="M693 670v-25q-18 5 -31 5q-30 0 -56 -8.5t-53.5 -32t-49 -61.5t-40 -101t-29.5 -146v-178q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136q0 166 -50.5 264t-141.5 98q-29 0 -59 -10l-14 24q22 20 57.5 36t66.5 16q121 0 185.5 -65t77.5 -233h5 q11 58 28 103q34 95 89.5 140t122.5 45q35 0 54 -12zM520 849q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM310 849q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#x3ac;" horiz-adv-x="644" d="M592 154h25q-1 -66 -27 -116t-78 -50q-69 0 -105 77q-34 -44 -73 -61.5t-93 -17.5q-94 0 -155 67t-61 173q0 110 64 178.5t166 68.5q127 0 179 -121h1l29 109h154l-129 -270q0 -8 9 -35q12 -36 22 -54t15.5 -21t14.5 -3q16 0 28 20t14 56zM361 198q-1 28 -8 66t-19 79.5 t-32 70t-44 28.5q-50 0 -68 -46.5t-18 -162.5q0 -119 18 -167.5t62 -48.5q37 0 68 59t41 122zM249 528l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48z" />
+<glyph unicode="&#x3ad;" horiz-adv-x="444" d="M412 109l17 -18q-69 -105 -203 -105q-198 0 -198 132q0 77 88 123v1q-32 12 -51 37.5t-19 50.5q0 58 53 100.5t150 42.5q66 0 115 -26.5t49 -79.5q0 -24 -16 -41t-45 -17q-24 0 -40.5 13.5t-16.5 40.5q0 8 4 22.5t4 19.5q0 37 -65 37q-34 0 -56.5 -29.5t-22.5 -70.5 q0 -38 20.5 -61.5t53.5 -23.5q3 0 20 5.5t34 5.5q19 0 29 -7.5t10 -17.5q0 -12 -11 -21t-33 -9q-13 0 -44 9q-32 0 -59 -24t-27 -63q0 -48 30 -71.5t79 -23.5q45 0 88 19t63 50zM155 528l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48z" />
+<glyph unicode="&#x3ae;" horiz-adv-x="585" d="M247 0h-139v346q0 56 -24 56q-23 0 -49 -48l-23 11q17 45 53.5 76.5t82.5 31.5q40 0 69 -20t29 -67h1q51 87 143 87q62 0 98 -39t36 -106v-380q0 -106 21 -153h-138q-15 28 -18.5 58t-3.5 94v372q0 87 -50 87q-37 0 -71 -34q-17 -17 -17 -24v-348zM205 528l61 136 q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48z" />
+<glyph unicode="&#x3af;" horiz-adv-x="326" d="M208 461v-349q0 -56 24 -56t49 45l23 -12q-17 -43 -55.5 -73t-87.5 -30q-46 0 -69 26.5t-23 64.5v299q0 33 -11.5 45t-42.5 16v24h193zM87 528l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48z" />
+<glyph unicode="&#x3b0;" horiz-adv-x="576" d="M247 381v-156q0 -52 2.5 -84.5t10 -63.5t23.5 -45.5t42 -14.5t42.5 15.5t24 47t10 64t2.5 82.5q0 88 -30.5 153t-92.5 70v24q126 0 198 -63.5t72 -180.5q0 -107 -63 -175t-163 -68q-105 0 -161 44t-56 143v182q0 47 -24 47q-23 0 -49 -48l-23 11q17 45 53.5 76.5 t82.5 31.5q40 0 69.5 -21.5t29.5 -70.5zM479 591q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM205 528l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48zM214 591q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19 t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#x3b1;" horiz-adv-x="644" d="M592 154h25q-1 -66 -27 -116t-78 -50q-69 0 -105 77q-34 -44 -73 -61.5t-93 -17.5q-94 0 -155 67t-61 173q0 110 64 178.5t166 68.5q127 0 179 -121h1l29 109h154l-129 -270q0 -8 9 -35q12 -36 22 -54t15.5 -21t14.5 -3q16 0 28 20t14 56zM361 198q-1 28 -8 66t-19 79.5 t-32 70t-44 28.5q-50 0 -68 -46.5t-18 -162.5q0 -119 18 -167.5t62 -48.5q37 0 68 59t41 122z" />
+<glyph unicode="&#x3b2;" horiz-adv-x="556" d="M66 -54v386q0 107 20 179t70 124q54 57 151 57q71 0 122.5 -40.5t51.5 -113.5q0 -84 -85 -127l-1 -2q129 -39 129 -183q0 -102 -65 -171t-161 -69q-50 0 -93 26v-66q0 -102 -20 -151h-140q13 28 17 58.5t4 92.5zM205 495v-423q27 -55 85 -55q50 0 68 43.5t18 156.5 q0 56 -13.5 98.5t-28.5 59.5t-25 17q-9 0 -22.5 -4.5t-20.5 -4.5q-19 0 -29.5 8t-10.5 18q0 27 48 27q7 0 24 -4.5t21 -4.5q10 0 16.5 27t6.5 55q0 32 -4.5 63t-20 60t-40.5 29q-41 0 -56.5 -37.5t-15.5 -128.5z" />
+<glyph unicode="&#x3b3;" horiz-adv-x="518" d="M332 461h169l-202 -400q0 -4 8.5 -58.5t8.5 -86.5q0 -50 -21.5 -85.5t-62.5 -35.5q-43 0 -57 27t-14 80q0 73 61 216q-10 110 -34 169q-38 96 -92 96q-48 0 -59 -75h-25q0 28 5 55.5t15.5 53t30.5 41t47 15.5q42 0 68.5 -40t45.5 -112l29 -111z" />
+<glyph unicode="&#x3b4;" horiz-adv-x="502" d="M222 419v2q-84 35 -115 78q-22 29 -22 61q0 40 35 71.5t78 46t81 14.5q39 0 73.5 -6t62.5 -23.5t28 -45.5q0 -15 -12.5 -32.5t-35.5 -17.5q-34 0 -76.5 40.5t-69.5 40.5q-15 0 -32 -3t-35.5 -15t-18.5 -31q0 -25 30 -48.5t70 -41t89.5 -50.5t78.5 -72q46 -59 46 -172 q0 -87 -62.5 -158t-161.5 -71q-103 0 -165 69.5t-62 151.5q0 93 60 154q55 58 136 58zM252 387q-45 0 -62 -42t-17 -141q0 -97 18 -142t62 -45q26 0 42 13t23 43t9 59.5t2 82.5q0 172 -77 172z" />
+<glyph unicode="&#x3b5;" horiz-adv-x="444" d="M412 109l17 -18q-69 -105 -203 -105q-198 0 -198 132q0 77 88 123v1q-32 12 -51 37.5t-19 50.5q0 58 53 100.5t150 42.5q66 0 115 -26.5t49 -79.5q0 -24 -16 -41t-45 -17q-24 0 -40.5 13.5t-16.5 40.5q0 8 4 22.5t4 19.5q0 37 -65 37q-34 0 -56.5 -29.5t-22.5 -70.5 q0 -38 20.5 -61.5t53.5 -23.5q3 0 20 5.5t34 5.5q19 0 29 -7.5t10 -17.5q0 -12 -11 -21t-33 -9q-13 0 -44 9q-32 0 -59 -24t-27 -63q0 -48 30 -71.5t79 -23.5q45 0 88 19t63 50z" />
+<glyph unicode="&#x3b6;" horiz-adv-x="459" d="M243 692l9 -24q-63 -27 -63 -68q0 -20 9.5 -33.5t22.5 -17.5q89 85 144 85q57 0 57 -43q0 -39 -58.5 -65t-133.5 -26q-50 -40 -94.5 -118t-44.5 -152q0 -66 46 -90.5t135 -24.5q165 0 165 -138q0 -87 -52 -134.5t-123 -47.5q-42 0 -67 18t-25 43q0 26 17.5 44t43.5 18 q35 0 63.5 -23t43.5 -23q21 0 39.5 20t18.5 48q0 25 -16.5 39t-45.5 14q-17 0 -61.5 -4.5t-55.5 -4.5q-103 1 -148.5 45t-45.5 146q0 98 51.5 191t111.5 146q-33 5 -53.5 25.5t-20.5 52.5q0 74 131 102z" />
+<glyph unicode="&#x3b7;" horiz-adv-x="585" d="M247 0h-139v346q0 56 -24 56q-23 0 -49 -48l-23 11q17 45 53.5 76.5t82.5 31.5q40 0 69 -20t29 -67h1q51 87 143 87q62 0 98 -39t36 -106v-380q0 -106 21 -153h-138q-15 28 -18.5 58t-3.5 94v372q0 87 -50 87q-37 0 -71 -34q-17 -17 -17 -24v-348z" />
+<glyph unicode="&#x3b8;" horiz-adv-x="501" d="M250 692q70 0 123 -53t78 -132t25 -167q0 -87 -24.5 -166.5t-76 -133.5t-117.5 -54q-76 0 -130.5 54.5t-78.5 132.5t-24 168q0 88 24 166t77 131.5t124 53.5zM172 364h157q0 122 -19 209.5t-60 87.5q-78 0 -78 -297zM329 320h-157q0 -130 18 -216.5t60 -86.5t60.5 86.5 t18.5 216.5z" />
+<glyph unicode="&#x3b9;" horiz-adv-x="326" d="M208 461v-349q0 -56 24 -56t49 45l23 -12q-17 -43 -55.5 -73t-87.5 -30q-46 0 -69 26.5t-23 64.5v299q0 33 -11.5 45t-42.5 16v24h193z" />
+<glyph unicode="&#x3ba;" horiz-adv-x="581" d="M214 461v-201q63 73 110.5 119t78.5 65t48 24t37 5q30 0 50.5 -20.5t20.5 -56.5q0 -23 -18 -44.5t-48 -21.5q-26 0 -49.5 21t-33.5 21q-43 0 -103 -70l179 -232q23 -30 34 -38t28 -8v-24h-248v24q34 1 34 23q0 10 -21 37l-98 129h-1v-213h-139v379q0 31 -12 42.5 t-42 15.5v24h193z" />
+<glyph unicode="&#x3bb;" horiz-adv-x="547" d="M80 527h-25q0 41 8 76t31.5 62t60.5 27q62 0 104 -146l107 -374q29 -100 77 -100q47 0 59 75h25q0 -69 -24 -117t-76 -48q-36 0 -57 34t-35 94l-46 198l-101 -308h-169l226 454l-12 38q-21 66 -42.5 88t-51.5 22q-47 0 -59 -75z" />
+<glyph unicode="&#x3bc;" horiz-adv-x="610" d="M199 9v-77q0 -88 -20 -137h-134q21 43 21 138v528h139v-318q0 -43 21 -67.5t48 -24.5q38 0 79 51v359h139v-350q0 -41 4.5 -56.5t18.5 -15.5q22 0 52 49l21 -12q-43 -107 -144 -107q-82 0 -90 86h-1q-20 -30 -46.5 -49.5t-53.5 -19.5q-39 0 -53 23h-1z" />
+<glyph unicode="&#x3bd;" horiz-adv-x="518" d="M465 473h30q0 -95 -24.5 -173.5t-64 -131t-93.5 -92t-107 -60t-111 -30.5h-26v386q0 35 -10 46.5t-44 18.5v24h193v-323h5q33 6 62.5 18t62.5 37t58 60.5t44 92t25 127.5z" />
+<glyph unicode="&#x3be;" horiz-adv-x="468" d="M240 692l10 -24q-33 -14 -48.5 -33.5t-15.5 -34.5q0 -6 1 -10.5t2 -8t2.5 -6t3.5 -4.5t4 -3l3 -2l3 -1l2 -1q73 71 140 71q63 0 63 -40q0 -36 -52 -57.5t-118 -21.5q-26 0 -39.5 -18t-13.5 -44q0 -19 10.5 -33t24.5 -20q90 41 133 41q19 0 30 -1t25.5 -4.5t21.5 -13 t7 -24.5q0 -30 -43 -45t-82 -15q-41 0 -89 11q-56 -18 -85 -52.5t-29 -72.5q0 -54 44 -82t114 -28q165 0 165 -138q0 -87 -52 -134.5t-123 -47.5q-42 0 -67 18t-25 43q0 26 17.5 44t43.5 18q35 0 63.5 -23t43.5 -23q21 0 39.5 20t18.5 48q0 25 -16.5 39t-45.5 14 q-17 0 -61.5 -4.5t-55.5 -4.5q-94 0 -142.5 51t-48.5 126q0 65 46.5 125t115.5 92q-19 9 -35.5 29t-16.5 45q0 45 38 77v2q-28 4 -45.5 21t-17.5 38q0 33 33 60.5t99 41.5z" />
+<glyph unicode="&#x3bf;" horiz-adv-x="500" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#x3c0;" horiz-adv-x="631" d="M596 361h-117q-11 -44 -11 -142q0 -163 56 -163q45 0 60 71h25q0 -55 -38.5 -98t-103.5 -43q-69 0 -98.5 42.5t-29.5 102.5q0 33 7.5 71t24 95.5t18.5 63.5h-134q0 -8 1 -41t1 -58q0 -55 -4 -97t-16 -87.5t-38 -70.5t-65 -25q-79 0 -79 66q0 20 11.5 37.5t31.5 21.5 q36 7 65.5 100.5t29.5 153.5q-120 0 -148 -52h-25q27 80 67 116t124 36h385v-100z" />
+<glyph unicode="&#x3c1;" horiz-adv-x="547" d="M295 -14h1q-48 0 -91 26v-66q0 -102 -20 -151h-140q13 28 17 58t4 92v168q0 107 20 179.5t70 124.5q24 25 63.5 40.5t78.5 15.5q98 0 157.5 -61.5t59.5 -183.5q0 -105 -64.5 -173.5t-155.5 -68.5zM205 271v-199q27 -55 81 -55q47 0 64.5 45t17.5 158q0 122 -23 172 t-70 50q-39 0 -54.5 -39t-15.5 -132z" />
+<glyph unicode="&#x3c2;" horiz-adv-x="464" d="M396 -58q0 25 -16.5 39t-45.5 14q-17 0 -61.5 -4.5t-55.5 -4.5q-100 0 -147 41.5t-47 144.5q0 59 35.5 127.5t105 121t149.5 52.5q54 0 92.5 -25.5t38.5 -72.5q0 -30 -19 -50.5t-46 -20.5q-38 0 -72 34t-64 34q-69 0 -110.5 -36.5t-41.5 -107.5q0 -31 12 -52.5t28 -33 t43 -17.5t47 -7t51 -1q165 0 165 -138q0 -87 -52 -134.5t-123 -47.5q-42 0 -67 18t-25 43q0 26 17.5 44t43.5 18q35 0 63.5 -23t43.5 -23q21 0 39.5 20t18.5 48z" />
+<glyph unicode="&#x3c3;" horiz-adv-x="568" d="M529 461v-100h-200q12 -22 38 -42t49 -33t41 -39.5t18 -61.5q0 -76 -64.5 -137.5t-160.5 -61.5t-160.5 69t-64.5 177q0 93 70 161t195 68h239zM329 169q0 61 -13 102.5t-51 89.5q-40 0 -66.5 -36.5t-26.5 -105.5q0 -110 18.5 -156t61.5 -46q77 0 77 152z" />
+<glyph unicode="&#x3c4;" horiz-adv-x="492" d="M218 361h-58q-36 0 -71 -25t-46 -67h-25q3 22 11 46t23 50.5t34 47.5t46 34.5t58 13.5h267v-100h-139q-5 -11 -10.5 -62.5t-5.5 -101.5q0 -141 51 -141q45 0 60 71h25q0 -55 -38.5 -98t-103.5 -43q-69 0 -98.5 42.5t-29.5 102.5q0 33 7.5 71t24 95.5t18.5 63.5z" />
+<glyph unicode="&#x3c5;" horiz-adv-x="576" d="M247 381v-156q0 -52 2.5 -84.5t10 -63.5t23.5 -45.5t42 -14.5t42.5 15.5t24 47t10 64t2.5 82.5q0 88 -30.5 153t-92.5 70v24q126 0 198 -63.5t72 -180.5q0 -107 -63 -175t-163 -68q-105 0 -161 44t-56 143v182q0 47 -24 47q-23 0 -49 -48l-23 11q17 45 53.5 76.5 t82.5 31.5q40 0 69.5 -21.5t29.5 -70.5z" />
+<glyph unicode="&#x3c6;" horiz-adv-x="653" d="M396 -205h-139v191q-100 0 -166.5 65.5t-66.5 178.5q0 112 64 177.5t175 65.5h45v-25q-54 0 -86 -30.5t-41.5 -72.5t-9.5 -102q0 -125 17.5 -175.5t59.5 -50.5h9v135q0 69 20 149.5t65 127.5q42 44 101 44q73 0 129.5 -67t56.5 -176q0 -111 -67 -177.5t-166 -66.5v-191z M396 274v-257h8q46 0 62 47t16 179q0 197 -53 199q-33 -2 -33 -168z" />
+<glyph unicode="&#x3c7;" horiz-adv-x="612" d="M431 461h155l-251 -397l18 -64q15 -55 38.5 -85t47.5 -30q55 0 67 76h25q0 -75 -25 -120.5t-73 -45.5q-21 0 -38 15t-29 41.5t-20.5 50.5t-16.5 54q-3 10 -4 15l-15 53l-134 -213h-155l237 375l-22 85q-18 67 -38 89.5t-50 22.5q-19 0 -38.5 -16.5t-28.5 -58.5h-25 q0 66 23.5 115.5t76.5 49.5q40 0 62.5 -37t41.5 -108l25 -97z" />
+<glyph unicode="&#x3c8;" horiz-adv-x="763" d="M312 461h139v-444h17q37 0 53 52t16 182q0 53 5.5 88.5t22 68.5t50.5 49t87 16h49v-25q-78 -13 -78 -115q0 -7 5.5 -59t5.5 -67q0 -97 -61.5 -159t-149.5 -62h-22v-191h-139v191h-22q-88 0 -149.5 62t-61.5 159q0 16 6 65.5t6 60.5q0 98 -79 115v25h49q50 0 83.5 -16.5 t51 -48t24 -68.5t6.5 -89q0 -130 16 -182t53 -52h17v444z" />
+<glyph unicode="&#x3c9;" horiz-adv-x="733" d="M419 448v25h29q134 0 197 -68.5t63 -177.5q0 -113 -65.5 -177t-145.5 -64q-90 0 -132 60q-50 -60 -130 -60t-144.5 65t-64.5 179q0 99 64 171t187 72h34v-25q-39 0 -65.5 -13t-40.5 -31.5t-21.5 -51.5t-9 -59t-1.5 -69q0 -24 0.5 -39t2.5 -43.5t6.5 -46.5t12.5 -38 t21.5 -30t31.5 -10q26 0 49.5 26.5t27.5 68.5q-32 72 -32 132q0 50 18.5 82t56.5 32q37 0 53 -34t16 -77q0 -64 -32 -136q4 -44 26.5 -69t50.5 -25q24 0 41 20.5t24.5 54.5t10.5 65.5t3 66.5q0 41 -2 68.5t-10 59.5t-22.5 51t-41.5 32t-66 13z" />
+<glyph unicode="&#x3ca;" horiz-adv-x="335" d="M236 461v-349q0 -56 24 -56t49 45l23 -12q-17 -43 -55.5 -73t-87.5 -30q-46 0 -69 26.5t-23 64.5v299q0 33 -11.5 45t-42.5 16v24h193zM337 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM127 600q0 -26 -18.5 -44.5 t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#x3cb;" horiz-adv-x="576" d="M247 381v-156q0 -52 2.5 -84.5t10 -63.5t23.5 -45.5t42 -14.5t42.5 15.5t24 47t10 64t2.5 82.5q0 88 -30.5 153t-92.5 70v24q126 0 198 -63.5t72 -180.5q0 -107 -63 -175t-163 -68q-105 0 -161 44t-56 143v182q0 47 -24 47q-23 0 -49 -48l-23 11q17 45 53.5 76.5 t82.5 31.5q40 0 69.5 -21.5t29.5 -70.5zM452 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM242 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#x3cc;" horiz-adv-x="500" d="M179 528l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48zM476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5 q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#x3cd;" horiz-adv-x="576" d="M247 381v-156q0 -52 2.5 -84.5t10 -63.5t23.5 -45.5t42 -14.5t42.5 15.5t24 47t10 64t2.5 82.5q0 88 -30.5 153t-92.5 70v24q126 0 198 -63.5t72 -180.5q0 -107 -63 -175t-163 -68q-105 0 -161 44t-56 143v182q0 47 -24 47q-23 0 -49 -48l-23 11q17 45 53.5 76.5 t82.5 31.5q40 0 69.5 -21.5t29.5 -70.5zM209 528l61 136q12 28 47 28q37 0 37 -44q0 -15 -34 -53l-63 -67h-48z" />
+<glyph unicode="&#x3ce;" horiz-adv-x="733" d="M419 448v25h29q134 0 197 -68.5t63 -177.5q0 -113 -65.5 -177t-145.5 -64q-90 0 -132 60q-50 -60 -130 -60t-144.5 65t-64.5 179q0 99 64 171t187 72h34v-25q-39 0 -65.5 -13t-40.5 -31.5t-21.5 -51.5t-9 -59t-1.5 -69q0 -24 0.5 -39t2.5 -43.5t6.5 -46.5t12.5 -38 t21.5 -30t31.5 -10q26 0 49.5 26.5t27.5 68.5q-32 72 -32 132q0 50 18.5 82t56.5 32q37 0 53 -34t16 -77q0 -64 -32 -136q4 -44 26.5 -69t50.5 -25q24 0 41 20.5t24.5 54.5t10.5 65.5t3 66.5q0 41 -2 68.5t-10 59.5t-22.5 51t-41.5 32t-66 13zM296 528l61 136q12 28 47 28 q37 0 37 -44q0 -15 -34 -53l-63 -67h-48z" />
+<glyph unicode="&#x3d0;" horiz-adv-x="500" d="M462 202q0 -91 -58.5 -151.5t-149.5 -60.5q-70 0 -117 40t-65 96t-18 125q0 123 37 232.5t121 169.5q23 17 59.5 30.5t62.5 13.5q38 0 61 -4t42.5 -23.5t19.5 -56.5q0 -122 -210 -122q-27 0 -38 1q-72 -114 -97 -204q45 49 85.5 75t92.5 26q77 0 124.5 -54.5t47.5 -132.5 zM220 511h12q42 0 76 17q24 12 55.5 51t31.5 63q0 32 -23 32q-61 0 -152 -163zM377 294q0 25 -16 41t-42 16q-43 0 -96.5 -100.5t-53.5 -150.5q0 -15 1 -25.5t5 -22.5t13.5 -18.5t24.5 -6.5q33 0 73 54t65.5 117.5t25.5 95.5z" />
+<glyph unicode="&#x3d1;" horiz-adv-x="647" d="M620 295l-1 -27q-25 0 -69 2q-4 -74 -13 -110q-43 -174 -212 -174q-217 0 -217 186v28q0 48 -24 48q-20 0 -49 -49l-23 12q16 42 52 74.5t84 32.5q38 0 68.5 -25.5t30.5 -75.5v-27q0 -99 14 -136t64 -37q26 0 42 14.5t24 50.5t10.5 79.5t2.5 118.5v5q-287 50 -287 247 q0 46 17.5 79t47 49.5t59.5 24t62 7.5q105 0 176.5 -90t71.5 -247v-56q42 -4 69 -4zM249 554q0 -63 37.5 -121t116.5 -95q-4 197 -37 271q-17 41 -51 41t-50 -27.5t-16 -68.5z" />
+<glyph unicode="&#x3d2;" horiz-adv-x="743" d="M394 394h5q12 74 30 120q67 178 195 178q53 0 81 -31t28 -72q0 -37 -21.5 -60.5t-59.5 -23.5q-31 0 -52 19t-21 49q0 35 23 60q0 8 -11 8q-27 0 -54.5 -31t-46.5 -74q-42 -93 -56 -232v-181q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136 q0 166 -50.5 264t-141.5 98q-29 0 -59 -10l-14 24q22 20 57.5 36t66.5 16q121 0 185.5 -65t77.5 -233z" />
+<glyph unicode="&#x3d5;" horiz-adv-x="653" d="M396 676v-203h11q96 0 159 -69t63 -175q0 -105 -64.5 -174t-162.5 -69h-6v-191h-139v191h-8q-96 0 -160.5 68.5t-64.5 173.5q0 110 64.5 177.5t164.5 67.5h4v203h139zM257 17v425h-7q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46h7zM396 442v-425h8 q45 0 61.5 43.5t16.5 156.5q0 128 -16.5 176.5t-59.5 48.5h-10z" />
+<glyph unicode="&#x3d6;" horiz-adv-x="864" d="M851 361h-78q42 -55 42 -136q0 -114 -62.5 -176.5t-149.5 -62.5q-89 0 -131 60q-50 -60 -131 -60q-87 0 -147.5 62t-60.5 177q0 76 49 136h-24q-87 0 -124 -62h-25q56 162 216 162h626v-100zM642 361h-337q-25 -42 -25 -147q0 -197 75 -197q27 0 50 26.5t27 67.5 q-30 73 -30 113q0 37 18.5 63t56.5 26q34 0 51.5 -25.5t17.5 -61.5q0 -10 -1.5 -20.5t-3 -17.5t-5.5 -19l-7 -17q-2 -6 -8.5 -21t-8.5 -20q4 -41 27 -67.5t50 -26.5q79 0 79 198q0 105 -26 146z" />
+<glyph unicode="&#x3d8;" horiz-adv-x="778" d="M308 -88v77q-124 24 -198.5 117.5t-74.5 227.5q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5q0 -134 -75 -227.5t-198 -118.5v-77q0 -57 16.5 -72t81.5 -20v-25h-357v25q64 5 80.5 20.5t16.5 71.5zM385 658q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80 t45 234q0 160 -46.5 245t-134.5 85z" />
+<glyph unicode="&#x3d9;" horiz-adv-x="500" d="M181 -205v202q-70 22 -113 84t-43 147q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175q0 -84 -43 -147t-113 -85v-202h-139zM251 442q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5q0 128 -17 176t-61 48z" />
+<glyph unicode="&#x3da;" horiz-adv-x="680" d="M222 -127l26 28q66 -64 140 -64q53 0 80.5 32t27.5 74q0 47 -46 75t-140 42q-46 7 -79.5 15.5t-71 26.5t-60.5 43.5t-38.5 67.5t-15.5 98q0 77 37.5 149t95.5 121.5t128.5 79.5t136.5 30q184 0 184 -95q0 -31 -19.5 -49.5t-51.5 -18.5q-17 0 -32.5 11.5t-29 27.5 t-28.5 32t-38.5 27.5t-51.5 11.5q-89 0 -157.5 -79t-68.5 -181q0 -40 23 -73q32 -44 111.5 -69t165 -43.5t118.5 -42.5q77 -57 77 -154q0 -95 -71.5 -151t-169.5 -56q-113 0 -182 84z" />
+<glyph unicode="&#x3db;" horiz-adv-x="504" d="M460 503h23q-4 -35 -8 -59t-16.5 -60t-29.5 -58t-49 -38.5t-74 -16.5q-12 0 -43 2.5t-47 2.5q-56 0 -100.5 -27t-44.5 -71q0 -32 23 -49.5t59 -17.5q23 0 63.5 3t55.5 3q85 0 125 -42.5t40 -115.5q0 -68 -54 -115t-121 -47q-42 0 -67 18t-25 43q0 26 17.5 44t43.5 18 q35 0 63.5 -23t43.5 -23q20 0 39 15t19 42q0 26 -17 45t-45 19q-17 0 -61.5 -4.5t-55.5 -4.5q-102 0 -148 43t-46 122q0 95 61 159q75 76 237 88q106 7 139 105z" />
+<glyph unicode="&#x3dc;" horiz-adv-x="620" d="M593 676v-202h-24q-10 57 -22 81.5t-38 47.5q-45 39 -173 39q-38 0 -54 -11.5t-16 -39.5v-218h228v-47h-228v-225q0 -43 21 -58t89 -18v-25h-360v25q55 6 71.5 21t16.5 57v472q0 43 -18 58t-70 18v25h577z" />
+<glyph unicode="&#x3dd;" horiz-adv-x="491" d="M458 361h-253v-220h203v-44h-203v-151q0 -102 -20 -151h-140q13 28 17 58.5t4 92.5v515h392v-100z" />
+<glyph unicode="&#x3de;" horiz-adv-x="757" d="M701 604l14 -17l-214 -438q-13 -28 -13 -50q0 -42 39 -42t72 31l16 -20q-81 -82 -154 -82q-58 0 -88.5 30t-30.5 69q0 49 68 127l144 165l-1 1l-504 -199l-14 17l214 438q13 28 13 50q0 42 -39 42t-72 -31l-16 20q81 82 154 82q58 0 88.5 -29.5t30.5 -68.5 q0 -50 -68 -128l-144 -165l1 -1z" />
+<glyph unicode="&#x3df;" horiz-adv-x="485" d="M258 0h-140l169 296h-258l195 396h140l-169 -296h258z" />
+<glyph unicode="&#x3e0;" horiz-adv-x="839" d="M66 509l-33 25q73 87 150.5 122.5t192.5 35.5q197 0 311 -116t114 -298q0 -116 -46 -222t-136.5 -179t-205.5 -82v33q70 23 122 85.5t77 141.5t25 163q0 116 -48 202q-70 -30 -103 -143t-33 -232v-45h-162q0 148 76 282.5t202 178.5q-41 71 -112.5 117.5t-148.5 46.5 q-20 0 -29 -2v-276h-47v264q-93 -15 -166 -102z" />
+<glyph unicode="&#x3e1;" horiz-adv-x="611" d="M182 238l-22 38l156 90q-124 176 -287 239l15 34q144 -15 267 -94t194 -202q78 -135 78 -297q0 -130 -53 -251l-37 4q7 41 7 86q0 134 -69 284l-157 -91l-22 38l160 92q-39 71 -70 122z" />
+<glyph unicode="&#x3f0;" horiz-adv-x="563" d="M377 461h169l-168 -211q-10 -50 -10 -100q0 -66 51 -66q6 0 22 11.5t36 11.5q18 0 34.5 -14t16.5 -40q0 -35 -24.5 -53.5t-60.5 -18.5q-51 0 -84 37.5t-33 102.5q0 27 7 72l-153 -193h-168l169 214q9 52 9 90q0 66 -51 66q-6 0 -22 -11.5t-36 -11.5q-18 0 -34.5 14 t-16.5 40q0 35 24.5 53.5t60.5 18.5q51 0 84 -37.5t33 -102.5q0 -17 -6 -63z" />
+<glyph unicode="&#x3f1;" horiz-adv-x="511" d="M434 -205h-25q0 17 -10 22.5t-32 6t-49 1.5t-67.5 13t-80.5 36q-84 50 -114.5 133.5t-30.5 189.5q0 127 68 201.5t171 74.5q95 0 158.5 -69t63.5 -175q0 -105 -64.5 -174t-161.5 -69t-152 60l-2 -1q21 -50 71 -79.5t108 -29.5q14 0 41.5 1.5t38.5 1.5q93 0 93 -79 q0 -30 -24 -65zM261 442q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5q0 128 -17 176t-61 48z" />
+<glyph unicode="&#x3f4;" horiz-adv-x="778" d="M394 691q151 0 250 -100.5t99 -255.5q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99zM566 317h-354q1 -150 47 -226.5t131 -76.5t130 77t46 226zM212 364h353q-5 143 -51.5 218.5t-128.5 75.5q-78 0 -123 -76.5t-50 -217.5z" />
+<glyph unicode="&#x3f5;" horiz-adv-x="444" d="M412 109l18 -18q-41 -55 -86.5 -80t-104.5 -25q-95 0 -154.5 64.5t-59.5 171.5q0 110 64 180.5t159 70.5q31 0 54 -5t33.5 -10t11.5 -5q21 0 22 20h23l17 -147h-23q-33 117 -115 117q-51 0 -77.5 -51.5t-26.5 -121.5h157v-44h-157q0 -76 42.5 -124.5t95.5 -48.5 q58 0 107 56z" />
+<glyph unicode="&#x3f6;" horiz-adv-x="444" d="M32 350l-18 18q41 55 86.5 80t104.5 25q95 0 154.5 -64.5t59.5 -171.5q0 -110 -64 -180.5t-159 -70.5q-31 0 -54 5t-33.5 10t-11.5 5q-21 0 -22 -20h-23l-17 147h23q33 -117 115 -117q51 0 77.5 51.5t26.5 121.5h-157v44h157q0 76 -42.5 124.5t-95.5 48.5q-58 0 -107 -56 z" />
+<glyph unicode="&#x401;" horiz-adv-x="667" d="M511 850q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM301 850q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM591 676l2 -191h-29q-17 98 -62.5 127.5t-170.5 29.5 q-38 0 -51.5 -12t-13.5 -42v-225q82 1 118 32.5t45 116.5h25v-338h-25q-7 88 -43.5 121.5t-119.5 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54q25 20 41.5 46t39.5 77h29l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h575z" />
+<glyph unicode="&#x402;" horiz-adv-x="856" d="M401 340v-340h-259v25q64 5 80.5 20.5t16.5 71.5v527q-92 -3 -124.5 -32t-45.5 -117h-29l2 181h566l2 -181h-29q-13 86 -50 116t-130 33v-269q54 45 156 45q114 0 183 -67.5t69 -185.5q0 -101 -63.5 -182.5t-163.5 -81.5q-71 0 -111 32.5t-40 82.5q0 30 21.5 56.5 t54.5 26.5q29 0 47.5 -16.5t18.5 -45.5q0 -23 -13 -38t-13 -26q0 -16 8.5 -27.5t24.5 -11.5q20 0 32.5 18t17.5 54.5t6 62t1 70.5q0 40 -6 76t-20 70.5t-41 55t-65 20.5q-74 0 -104 -23z" />
+<glyph unicode="&#x403;" horiz-adv-x="632" d="M598 676l2 -192h-29q-3 88 -47 122.5t-146 34.5h-109v-543q0 -35 20 -52t69 -21v-25h-338v25q53 4 70 21.5t17 50.5v481q0 40 -17.5 55t-68.5 18v25h577zM212 778l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#x404;" horiz-adv-x="685" d="M215 376h289v-50h-290q1 -75 12 -124t40 -96q21 -35 56.5 -56t76.5 -21q61 0 121 34q39 24 99 89l19 -25q-65 -84 -123 -115t-142 -31q-145 0 -240.5 97.5t-95.5 244.5q0 158 95.5 263t237.5 105q67 0 149 -35q33 -14 44 -14q13 0 20 9t18 37h26l4 -235h-29 q-28 82 -57 116q-76 89 -163 89q-68 0 -117.5 -74.5t-49.5 -207.5z" />
+<glyph unicode="&#x405;" horiz-adv-x="556" d="M484 474h-29q-13 48 -28 75.5t-41 54.5q-54 56 -123 56q-51 0 -80.5 -27.5t-29.5 -71.5q0 -36 21 -59t82 -55q18 -10 68.5 -35.5t79.5 -41.5q49 -27 79 -73.5t30 -102.5q0 -95 -68.5 -154t-179.5 -59q-61 0 -130 24q-31 10 -41 10q-12 0 -19 -7.5t-11 -26.5h-29v248h29 q23 -96 60 -143q57 -72 144 -72q58 0 92 30.5t34 82.5q0 48 -57 88q-25 18 -122 65q-89 43 -130 90t-41 120q0 95 58.5 148t160.5 53q55 0 117 -23q30 -10 42 -10q14 0 20.5 7t11.5 27h30v-218z" />
+<glyph unicode="&#x406;" horiz-adv-x="389" d="M370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x407;" horiz-adv-x="389" d="M363 850q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM153 850q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19 v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x408;" horiz-adv-x="500" d="M478 676v-25q-55 -4 -71.5 -22t-16.5 -73v-430q0 -222 -212 -222q-74 0 -108 23q-29 20 -48 50t-19 60q0 28 21.5 51t49.5 23t50 -23t22 -53q0 -15 -13.5 -34t-13.5 -32q0 -32 45 -32q34 0 49 21.5t15 68.5v550q0 43 -20 57.5t-81 16.5v25h351z" />
+<glyph unicode="&#x409;" horiz-adv-x="1005" d="M137 676h549v-25q-52 -2 -67.5 -21t-15.5 -55v-200h73q130 0 206 -45.5t76 -141.5q0 -83 -72 -135.5t-202 -52.5h-329v25q54 6 70 20t16 55v472q0 32 -9.5 43t-40.5 11h-78q-26 0 -34.5 -11t-8.5 -43v-303q0 -287 -150 -287q-110 0 -110 93q0 35 24 53.5t52 18.5 q16 0 28.5 -4.5t21 -15t12.5 -17.5t10 -21l9 -18q53 0 53 226v298q0 27 -16.5 39.5t-66.5 16.5v25zM603 343v-245q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 155 -157 155h-26z" />
+<glyph unicode="&#x40a;" horiz-adv-x="1054" d="M490 103v223h-222v-228q0 -39 15.5 -53t63.5 -20v-25h-326v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h326v-25q-46 -4 -62.5 -18.5t-16.5 -55.5v-204h222v204q0 41 -16.5 55.5t-62.5 18.5v25h329v-25q-51 -4 -69.5 -19t-18.5 -55v-204h73q130 0 206 -44.5 t76 -140.5q0 -83 -72 -135.5t-202 -52.5h-322v25q48 6 63.5 21t15.5 57zM652 341v-243q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 153 -157 153h-26z" />
+<glyph unicode="&#x40b;" horiz-adv-x="883" d="M557 0v25q46 6 59.5 20t13.5 53v43q0 40 -5.5 75.5t-19 70.5t-40 55.5t-64.5 20.5q-70 0 -100 -23v-242q0 -40 13.5 -53.5t60.5 -19.5v-25h-333v25q64 5 80.5 20.5t16.5 71.5v527q-92 -3 -124.5 -32t-45.5 -117h-29l3 181h564l3 -181h-29q-13 86 -50 116t-130 33v-269 q54 45 159 45q112 0 171 -61.5t59 -181.5v-79q0 -39 15 -53t63 -20v-25h-311z" />
+<glyph unicode="&#x40c;" horiz-adv-x="759" d="M358 676v-25q-54 -4 -71 -20.5t-17 -63.5v-198q43 0 82 21q29 15 52 45t34 54t29 69q24 63 58.5 94.5t97.5 31.5q44 0 70.5 -22.5t26.5 -57.5q0 -31 -19 -52t-49 -21q-23 0 -38 11t-21 23.5t-13 23.5t-15 11q-23 0 -35 -19.5t-34 -78.5q-31 -87 -91 -132v-2 q62 -9 108 -46.5t85 -118.5q5 -11 20 -48.5t29.5 -62.5t36.5 -46q20 -20 57 -21v-25h-243l-90 204q-29 65 -58 93t-80 28v-230q0 -37 16.5 -50t70.5 -20v-25h-336v25q55 5 71 19t16 57v472q0 46 -17 60.5t-70 17.5v25h337zM283 738l137 157q25 28 53 28q22 0 35 -12t13 -32 q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#x40e;" horiz-adv-x="722" d="M631 612l-239 -481q-43 -88 -81 -122q-36 -31 -88 -31q-51 0 -82 23.5t-31 68.5q0 32 22 51.5t46 19.5q18 0 31 -5t22 -16.5t13 -18.5t11 -23q3 -7 11 -14t15 -7q22 0 81 120l-264 415q-35 56 -83 59v25h335v-25l-27 -2q-32 -2 -43 -7.5t-11 -21.5q0 -19 24 -59l140 -229 h6l86 174q38 78 38 103q0 22 -16.5 30t-67.5 12v25h220v-25q-52 -8 -68 -39zM199 869q0 30 18 43.5t39 13.5q17 0 30.5 -11.5t13.5 -29.5q0 -19 -9.5 -30t-9.5 -17q0 -18 23.5 -32.5t66.5 -14.5t66 14t23 33q0 6 -9.5 17.5t-9.5 30.5q0 18 14.5 29t32.5 11q21 0 37.5 -13.5 t16.5 -43.5q0 -43 -29.5 -73.5t-66.5 -42.5t-75 -12q-61 0 -116.5 33t-55.5 95z" />
+<glyph unicode="&#x40f;" horiz-adv-x="770" d="M181 0h-160v25q52 2 67.5 21t15.5 55v475q0 37 -16 56t-67 19v25h312v-25q-38 0 -52.5 -18.5t-14.5 -58.5v-534h242v533q0 39 -15 58.5t-53 19.5v25h313v-25q-83 0 -83 -74v-478q0 -18 2 -28t10 -21t25.5 -17t45.5 -8v-25h-169q-85 0 -128 -43t-55 -133h-28 q-13 91 -57.5 133.5t-134.5 42.5z" />
+<glyph unicode="&#x410;" horiz-adv-x="722" d="M689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#x411;" horiz-adv-x="667" d="M554 676l2 -172h-29q-2 82 -45.5 111t-147.5 29h-25q-25 -2 -35 -12.5t-10 -36.5v-220h73q130 0 206 -45.5t76 -141.5q0 -83 -72 -135.5t-202 -52.5h-329v25q55 6 71.5 21t16.5 57v467q0 44 -18.5 60.5t-69.5 20.5v25h538zM264 343v-245q0 -36 15 -51t48 -15q58 0 89 40 t31 116q0 155 -157 155h-26z" />
+<glyph unicode="&#x412;" horiz-adv-x="667" d="M16 676h317q252 0 252 -151q0 -59 -37 -96t-122 -54v-1q83 -11 138 -63t55 -123q0 -83 -72 -135.5t-202 -52.5h-329v25q55 6 71.5 21t16.5 57v467q0 44 -18.5 60.5t-69.5 20.5v25zM264 352v-254q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 78 -39.5 121t-117.5 43h-26z M264 590v-206q92 0 124 29.5t32 104.5q0 66 -24 96t-75 30q-30 0 -43.5 -12.5t-13.5 -41.5z" />
+<glyph unicode="&#x413;" horiz-adv-x="632" d="M598 676l2 -192h-29q-3 88 -47 122.5t-146 34.5h-109v-543q0 -35 20 -52t69 -21v-25h-338v25q53 4 70 21.5t17 50.5v481q0 40 -17.5 55t-68.5 18v25h577z" />
+<glyph unicode="&#x414;" horiz-adv-x="715" d="M471 0h-244q-80 0 -121.5 -45t-53.5 -131h-28v202h20q79 0 111 133t32 415q0 36 -13.5 54.5t-61.5 22.5v25h579v-25q-52 -2 -67.5 -21t-15.5 -55v-479q0 -34 15.5 -50.5t67.5 -20.5v-201h-28q-13 91 -57.5 133.5t-134.5 42.5zM160 40h232q29 0 41.5 11.5t12.5 47.5v465 q0 33 -10 47.5t-40 14.5h-116q-25 0 -34 -14.5t-9 -47.5q0 -209 -19 -329.5t-58 -194.5z" />
+<glyph unicode="&#x415;" horiz-adv-x="667" d="M591 676l2 -191h-29q-17 98 -62.5 127.5t-170.5 29.5q-38 0 -51.5 -12t-13.5 -42v-225q82 1 118 32.5t45 116.5h25v-338h-25q-7 88 -43.5 121.5t-119.5 33.5v-241q0 -32 17.5 -44t65.5 -12q118 0 182 53q25 20 41.5 46t39.5 77h29l-40 -208h-585v25q54 6 71 21t17 55v479 q0 38 -18 53t-70 18v25h575z" />
+<glyph unicode="&#x416;" horiz-adv-x="1130" d="M484 369v204q0 46 -17 60.5t-70 17.5v25h330v-25q-54 -4 -71 -20.5t-17 -63.5v-198h22q22 0 40.5 7t33.5 24t25 30.5t21 41.5t15 42l15 44q40 126 146 126q44 0 71.5 -22t27.5 -56q0 -31 -18 -53t-48 -22q-34 0 -48.5 17.5t-19.5 34.5t-14 17q-24 0 -43.5 -51t-45 -112 t-61.5 -77v-2q65 -10 110.5 -43t83.5 -112q7 -14 19.5 -49t27 -61t35.5 -47q20 -20 57 -21v-25h-239l-90 204q-26 60 -47.5 90.5t-48.5 30.5h-27v-230q0 -37 16.5 -50t70.5 -20v-25h-329v25q55 5 71 19t16 57v224h-27q-27 0 -48.5 -30.5t-47.5 -90.5l-90 -204h-239v25 q38 1 57 21q21 21 35.5 47t27 61t19.5 49q38 79 83.5 112t110.5 43v2q-36 16 -61.5 77t-45 112t-43.5 51q-8 0 -13 -11t-8.5 -23.5t-19 -23.5t-41.5 -11q-30 0 -48 22t-18 53q0 34 27.5 56t71.5 22q106 0 146 -126l14 -44q5 -14 16 -42t21 -41.5t25 -30.5t33.5 -24t40.5 -7 h22z" />
+<glyph unicode="&#x417;" horiz-adv-x="570" d="M41 469l4 222h20q8 -34 39 -34q9 0 65 16q62 18 106 18q119 0 178 -46q56 -45 56 -125q0 -81 -74 -128q-47 -30 -112 -36v-2q81 -4 144.5 -47t63.5 -121q0 -104 -76 -154.5t-193 -50.5q-85 0 -139.5 31.5t-100.5 98.5l22 21q63 -59 99 -79.5t89 -20.5q59 0 93.5 41.5 t34.5 111.5q0 83 -38.5 115t-131.5 32v40q48 0 67 6t40 23q47 38 47 107q0 60 -26.5 101t-82.5 41q-81 0 -118.5 -43.5t-46.5 -137.5h-29z" />
+<glyph unicode="&#x418;" horiz-adv-x="778" d="M509 488l-241 -390q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-389l241 389q0 42 -17.5 56t-71.5 18v25h339v-25q-51 -4 -69.5 -19t-18.5 -55v-479q0 -39 16.5 -52.5t71.5 -20.5v-25 h-339v25q54 6 71.5 20.5t17.5 52.5v390z" />
+<glyph unicode="&#x419;" horiz-adv-x="778" d="M509 488l-241 -390q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-389l241 389q0 42 -17.5 56t-71.5 18v25h339v-25q-51 -4 -69.5 -19t-18.5 -55v-479q0 -39 16.5 -52.5t71.5 -20.5v-25 h-339v25q54 6 71.5 20.5t17.5 52.5v390zM217 869q0 30 18 43.5t39 13.5q17 0 30.5 -11.5t13.5 -29.5q0 -19 -9.5 -30t-9.5 -17q0 -18 23.5 -32.5t66.5 -14.5t66 14t23 33q0 6 -9.5 17.5t-9.5 30.5q0 18 14.5 29t32.5 11q21 0 37.5 -13.5t16.5 -43.5q0 -43 -29.5 -73.5 t-66.5 -42.5t-75 -12q-61 0 -116.5 33t-55.5 95z" />
+<glyph unicode="&#x41a;" horiz-adv-x="759" d="M358 676v-25q-54 -4 -71 -20.5t-17 -63.5v-198q43 0 82 21q29 15 52 45t34 54t29 69q24 63 58.5 94.5t97.5 31.5q44 0 70.5 -22.5t26.5 -57.5q0 -31 -19 -52t-49 -21q-23 0 -38 11t-21 23.5t-13 23.5t-15 11q-23 0 -35 -19.5t-34 -78.5q-31 -87 -91 -132v-2 q62 -9 108 -46.5t85 -118.5q5 -11 20 -48.5t29.5 -62.5t36.5 -46q20 -20 57 -21v-25h-243l-90 204q-29 65 -58 93t-80 28v-230q0 -37 16.5 -50t70.5 -20v-25h-336v25q55 5 71 19t16 57v472q0 46 -17 60.5t-70 17.5v25h337z" />
+<glyph unicode="&#x41b;" horiz-adv-x="738" d="M137 676h577v-25q-52 -2 -67.5 -21t-15.5 -55v-475q0 -40 17 -54t71 -21v-25h-339v25q55 6 72 20.5t17 53.5v473q0 32 -9.5 43t-40.5 11h-106q-26 0 -34.5 -11t-8.5 -43v-303q0 -287 -150 -287q-110 0 -110 93q0 35 24 53.5t52 18.5q16 0 28.5 -4.5t21 -15t12.5 -17.5 t10 -21l9 -18q53 0 53 226v298q0 27 -16.5 39.5t-66.5 16.5v25z" />
+<glyph unicode="&#x41c;" horiz-adv-x="944" d="M678 595l-252 -595h-27l-247 586v-457q0 -58 20 -79t81 -25v-25h-239v25q59 6 75 20.5t16 62.5v469q0 41 -17 55.5t-72 18.5v25h253l199 -472l201 472h252v-25q-55 -4 -71.5 -22.5t-16.5 -74.5v-428q0 -57 15 -76.5t73 -24.5v-25h-332v25q55 5 72 22t17 62v486z" />
+<glyph unicode="&#x41d;" horiz-adv-x="778" d="M759 0h-339v25q54 6 71.5 20.5t17.5 52.5v228h-241v-228q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-204h241v204q0 41 -18 55.5t-71 18.5v25h339v-25q-51 -4 -69.5 -19t-18.5 -55v-479 q0 -39 16.5 -52.5t71.5 -20.5v-25z" />
+<glyph unicode="&#x41e;" horiz-adv-x="778" d="M743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#x41f;" horiz-adv-x="762" d="M412 0v25q54 6 71.5 20.5t17.5 52.5v476q0 33 -10 47.5t-39 14.5h-149q-25 0 -34 -14.5t-9 -47.5v-476q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h738v-25q-51 -4 -69.5 -19t-18.5 -55v-479q0 -39 16.5 -52.5t71.5 -20.5v-25 h-339z" />
+<glyph unicode="&#x420;" horiz-adv-x="611" d="M262 303v-192q0 -51 14 -65t73 -21v-25h-333v25q33 3 45 9q23 9 31 30t8 62v427q0 58 -15.5 75.5t-68.5 22.5v25h315q128 0 198.5 -45.5t70.5 -135.5q0 -60 -33.5 -104.5t-95.5 -67.5q-32 -12 -70.5 -15.5t-138.5 -4.5zM262 609v-274q94 1 130 33.5t36 115.5 q0 84 -27 122t-89 38q-50 0 -50 -35z" />
+<glyph unicode="&#x421;" horiz-adv-x="709" d="M644 152l30 -25q-67 -83 -132.5 -114.5t-155.5 -31.5q-159 0 -254.5 96.5t-95.5 245.5q0 160 97.5 264t249.5 104q71 0 156 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-225h-29q-8 26 -19 46.5t-19 30.5t-25 29q-79 89 -167 89q-81 0 -132.5 -83.5t-51.5 -229.5 q0 -155 54 -240q22 -34 62.5 -55t84.5 -21q64 0 126 34q41 23 104 89z" />
+<glyph unicode="&#x422;" horiz-adv-x="667" d="M253 117v527q-95 -3 -137.5 -37t-55.5 -122h-29l2 191h601l2 -191h-29q-13 88 -55.5 122t-136.5 37v-527q0 -57 16.5 -72t81.5 -20v-25h-357v25q64 5 80.5 20.5t16.5 71.5z" />
+<glyph unicode="&#x423;" horiz-adv-x="722" d="M631 612l-239 -481q-43 -88 -81 -122q-36 -31 -88 -31q-51 0 -82 23.5t-31 68.5q0 32 22 51.5t46 19.5q18 0 31 -5t22 -16.5t13 -18.5t11 -23q3 -7 11 -14t15 -7q22 0 81 120l-264 415q-35 56 -83 59v25h335v-25l-27 -2q-32 -2 -43 -7.5t-11 -21.5q0 -19 24 -59l140 -229 h6l86 174q38 78 38 103q0 22 -16.5 30t-67.5 12v25h220v-25q-52 -8 -68 -39z" />
+<glyph unicode="&#x424;" horiz-adv-x="850" d="M505 596v-32q56 -2 109.5 -15t102.5 -38.5t78.5 -70t29.5 -102.5q0 -60 -33.5 -107.5t-85 -73.5t-103.5 -39t-98 -13v-24q0 -27 19.5 -38.5t75.5 -17.5v-25h-353v25q61 4 78.5 15t17.5 41v24q-80 0 -149 21.5t-119 76t-50 135.5q0 58 29.5 102.5t78 70t101.5 38.5t109 15 v34q0 31 -17.5 42t-77.5 11v25h352v-25q-56 0 -75.5 -13.5t-19.5 -41.5zM503 530v-390q58 0 104.5 45.5t46.5 139.5q0 106 -41.5 155.5t-109.5 49.5zM345 140v390q-63 0 -106 -50.5t-43 -154.5q0 -98 42 -141.5t107 -43.5z" />
+<glyph unicode="&#x425;" horiz-adv-x="722" d="M688 676v-25q-55 -5 -85.5 -30t-96.5 -115l-84 -115l180 -280q35 -54 53 -69.5t44 -16.5v-25h-340v25l28 2q52 3 52 28q0 21 -21 54l-99 159l-38 -51q-56 -75 -74 -104.5t-18 -45.5q0 -20 16 -29t61 -13v-25h-250v25q38 5 60.5 16.5t43.5 39.5l173 227l-196 285 q-23 34 -38 45t-42 13v25h346v-25l-31 -2q-27 -1 -37.5 -8t-10.5 -23q0 -14 15 -37l95 -147l56 76q37 50 48.5 69t11.5 35q0 18 -11 25t-40 10l-21 2v25h250z" />
+<glyph unicode="&#x426;" horiz-adv-x="770" d="M533 0h-512v25q52 2 67.5 21t15.5 55v475q0 37 -16 56t-67 19v25h312v-25q-38 0 -52.5 -18.5t-14.5 -58.5v-534h242v533q0 39 -15 58.5t-53 19.5v25h313v-25q-83 0 -83 -74v-478q0 -18 2 -28t10 -21t25.5 -17t45.5 -8v-201h-29q-13 92 -57 134t-134 42z" />
+<glyph unicode="&#x427;" horiz-adv-x="732" d="M460 98v197q-81 -37 -162 -37q-39 0 -66.5 3t-56 14t-45.5 30.5t-27.5 53t-10.5 81.5v137q0 38 -18 54t-67 20v25h314v-25q-46 -5 -56.5 -17.5t-10.5 -56.5v-174q0 -54 20.5 -76t74.5 -22q55 0 111 28v244q0 43 -11.5 56.5t-55.5 17.5v25h317v-25q-51 -4 -69.5 -19 t-18.5 -55v-479q0 -39 16.5 -52.5t71.5 -20.5v-25h-339v25q54 6 71.5 20.5t17.5 52.5z" />
+<glyph unicode="&#x428;" horiz-adv-x="1020" d="M756 72v501q0 39 -15 58.5t-53 19.5v25h313v-25q-83 0 -83 -74v-478q0 -18 2 -28t10 -21t25.5 -17t45.5 -8v-25h-980v25q55 5 69 19.5t14 61.5v470q0 43 -15 57t-68 18v25h310v-25q-46 -6 -55.5 -18t-9.5 -57v-503q0 -20 7 -26.5t28 -6.5h99q17 0 23.5 7t6.5 25v500 q0 41 -10.5 59.5t-42.5 19.5v25h262v-25q-47 -3 -47 -77v-501q0 -20 7 -26.5t28 -6.5h99q17 0 23.5 7t6.5 25z" />
+<glyph unicode="&#x429;" horiz-adv-x="1020" d="M756 72v501q0 39 -15 58.5t-53 19.5v25h313v-25q-83 0 -83 -74v-478q0 -18 2 -28t10 -21t25.5 -17t45.5 -8v-201h-29q-13 92 -57 134t-134 42h-760v25q55 5 69 19.5t14 61.5v470q0 43 -15 57t-68 18v25h310v-25q-46 -6 -55.5 -18t-9.5 -57v-503q0 -20 7 -26.5t28 -6.5h99 q17 0 23.5 7t6.5 25v502q0 41 -10 58t-43 19v25h262v-25q-47 -5 -47 -77v-501q0 -20 7 -26.5t28 -6.5h99q17 0 23.5 7t6.5 25z" />
+<glyph unicode="&#x42a;" horiz-adv-x="805" d="M490 676v-25q-55 -2 -71.5 -19t-16.5 -62v-195h73q130 0 206 -45.5t76 -141.5q0 -83 -72 -135.5t-202 -52.5h-331v25q55 6 71.5 21t16.5 57v541q-90 0 -124 -38.5t-46 -120.5h-29l2 191h447zM402 343v-245q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 155 -157 155h-26z " />
+<glyph unicode="&#x42b;" horiz-adv-x="1004" d="M354 676v-25q-55 -2 -71.5 -18t-16.5 -63v-195h73q130 0 206 -45.5t76 -141.5q0 -83 -72 -135.5t-202 -52.5h-331v25q55 6 71.5 21t16.5 57v467q0 44 -18.5 60.5t-69.5 20.5v25h338zM266 343v-245q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 155 -157 155h-26zM985 0h-350 v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x42c;" horiz-adv-x="672" d="M357 676v-25q-55 -2 -71.5 -18t-16.5 -63v-195h73q130 0 206 -45.5t76 -141.5q0 -83 -72 -135.5t-202 -52.5h-331v25q55 6 71.5 21t16.5 57v467q0 44 -18.5 60.5t-69.5 20.5v25h338zM269 343v-245q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 155 -157 155h-26z" />
+<glyph unicode="&#x42d;" horiz-adv-x="685" d="M181 376h289q0 133 -49.5 207.5t-117.5 74.5q-79 0 -140 -59q-53 -51 -80 -136h-29v225h26q10 -27 19 -36.5t23 -9.5q10 0 45 15q79 34 148 34q142 0 237.5 -105t95.5 -263q0 -147 -95.5 -244.5t-240.5 -97.5q-86 0 -148.5 31.5t-126.5 114.5l30 25q61 -67 98 -89 q60 -34 121 -34q41 0 76.5 21t56.5 56q29 47 40 96t12 124h-290v50z" />
+<glyph unicode="&#x42e;" horiz-adv-x="955" d="M268 373h80q10 142 90.5 230t199.5 88q122 0 202 -101t80 -255q0 -156 -80.5 -255t-206.5 -99q-124 0 -204 96.5t-82 248.5h-79v-228q0 -43 10 -55t59 -18v-25h-316v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h316v-25q-47 -5 -58 -17.5t-11 -56.5v-204z M630 658q-65 0 -93 -82.5t-28 -245.5t29 -239.5t97 -76.5q67 0 95 76.5t28 237.5q0 166 -29.5 248t-98.5 82z" />
+<glyph unicode="&#x42f;" horiz-adv-x="736" d="M114 111l150 207q-182 27 -182 170q0 83 72 135.5t202 52.5h331v-25q-55 -6 -71.5 -21t-16.5 -57v-467q0 -44 18.5 -60.5t69.5 -20.5v-25h-338v25q55 2 71.5 18t16.5 63v205h-12l-231 -311h-182v32q16 4 29 10t21 10.5t17 14t12.5 13.5t12 16t10.5 15zM437 343v235 q0 36 -15 51t-48 15q-58 0 -89 -40t-31 -116t38.5 -110.5t118.5 -34.5h26z" />
+<glyph unicode="&#x430;" horiz-adv-x="517" d="M490 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50 q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4zM310 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="&#x431;" horiz-adv-x="500" d="M441 691h25q-9 -111 -85 -141q-29 -11 -96 -14.5t-93 -12.5q-95 -35 -121 -157h1q68 107 182 107q95 0 158.5 -69t63.5 -175q0 -105 -64.5 -174t-161.5 -69q-101 0 -163 76.5t-62 194.5q0 50 5.5 97t22.5 101.5t44.5 94t76.5 66t114 26.5h98q25 0 37 10.5t18 38.5z M251 442q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5q0 128 -17 176t-61 48z" />
+<glyph unicode="&#x432;" horiz-adv-x="492" d="M21 461h240q91 0 139.5 -28t48.5 -81q0 -88 -114 -103v-2q63 -7 101.5 -39.5t38.5 -79.5q0 -57 -53.5 -92.5t-151.5 -35.5h-249v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24zM209 231v-156q0 -25 11 -35t37 -10q95 0 95 98q0 103 -123 103h-20zM209 395v-135 q71 0 96 17.5t25 67.5q0 87 -77 87q-44 0 -44 -37z" />
+<glyph unicode="&#x433;" horiz-adv-x="451" d="M213 402v-317q0 -31 12.5 -44t40.5 -17v-24h-245v24q35 8 44 19t9 45v288q0 32 -10.5 44.5t-42.5 16.5v24h410l3 -173h-24q-6 28 -9 39.5t-11.5 32.5t-19 30t-28.5 20t-44 15t-61 4q-24 0 -24 -27z" />
+<glyph unicode="&#x434;" horiz-adv-x="541" d="M19 24h26q22 0 38 12t26.5 37.5t17 54.5t10 72.5t4.5 82t1 92.5q0 35 -7 46t-38 16v24h427v-24q-32 -5 -42.5 -18.5t-10.5 -46.5v-285q0 -32 10.5 -44t42.5 -19v-167h-25q-21 92 -39 117.5t-58 25.5h-251q-43 0 -65.5 -27.5t-42.5 -115.5h-24v167zM182 393v-35 q0 -249 -48 -324v-2h163q35 0 35 38v317q0 22 -6.5 28t-27.5 6h-81q-26 0 -30.5 -4t-4.5 -24z" />
+<glyph unicode="&#x435;" horiz-adv-x="444" d="M403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-255q3 -41 8.5 -70t18 -58t36.5 -44t59 -15q32 0 58 15.5t57 52.5zM164 277h134v26q0 73 -9 92q-12 25 -23.5 36t-31.5 11 q-35 0 -52.5 -38.5t-17.5 -126.5z" />
+<glyph unicode="&#x436;" horiz-adv-x="762" d="M318 262v117q0 54 -48 58v24h222v-23q-31 -4 -39.5 -16t-8.5 -46v-114q31 0 48.5 21t31.5 65.5t23 60.5q16 29 37 43.5t61 14.5q38 0 62 -24t24 -58q0 -26 -13.5 -42.5t-40.5 -16.5q-20 0 -31.5 11.5t-15 25.5t-10.5 25.5t-19 11.5q-19 0 -32.5 -32.5t-27 -70 t-32.5 -45.5v-2q84 -8 122 -67l92 -144q9 -15 25 -15v-24h-162l-121 214q-7 13 -21 13v-143q0 -35 8.5 -45t43.5 -15v-24h-226v24q48 4 48 60v143q-14 0 -21 -13l-121 -214h-162v24q16 0 25 15l92 144q38 59 122 67v2q-19 8 -32.5 45.5t-27 70t-32.5 32.5q-12 0 -19 -11.5 t-10.5 -25.5t-15 -25.5t-31.5 -11.5q-27 0 -40.5 16.5t-13.5 42.5q0 35 24 58.5t62 23.5q40 0 61 -14.5t37 -43.5q9 -16 23 -60.5t31.5 -65.5t48.5 -21z" />
+<glyph unicode="&#x437;" horiz-adv-x="446" d="M46 311l4 160h18q7 -18 13.5 -24.5t16.5 -6.5q12 0 28 9q45 24 100 24q80 0 126.5 -35t46.5 -91q0 -36 -27 -65.5t-68 -40.5v-3q26 -3 49 -11t45 -33t22 -64q0 -68 -65.5 -107.5t-154.5 -39.5q-125 0 -175 78l21 21q36 -30 61 -39t62 -9q51 0 77 26.5t26 64.5 q0 40 -27.5 67.5t-77.5 27.5h-44v32q71 0 106 26q32 24 32 74q0 85 -80 85q-42 0 -70.5 -34t-40.5 -92h-24z" />
+<glyph unicode="&#x438;" horiz-adv-x="556" d="M355 84v225l-146 -225q0 -30 10.5 -43t37.5 -17v-24h-236v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h236v-24q-32 -5 -40 -16t-8 -45v-225l146 225q0 34 -8 45t-40 16v24h236v-24q-33 -5 -43 -17t-10 -44v-289q0 -32 10 -44t43 -19v-24h-236v24q27 4 37.5 17.5 t10.5 42.5z" />
+<glyph unicode="&#x439;" horiz-adv-x="556" d="M355 84v225l-146 -225q0 -30 10.5 -43t37.5 -17v-24h-236v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h236v-24q-32 -5 -40 -16t-8 -45v-225l146 225q0 34 -8 45t-40 16v24h236v-24q-33 -5 -43 -17t-10 -44v-289q0 -32 10 -44t43 -19v-24h-236v24q27 4 37.5 17.5 t10.5 42.5zM111 634q0 30 18 43.5t39 13.5q17 0 30.5 -11.5t13.5 -29.5q0 -19 -9.5 -30t-9.5 -17q0 -18 23.5 -32.5t66.5 -14.5t66 14t23 33q0 6 -9.5 17.5t-9.5 30.5q0 18 14.5 29t32.5 11q21 0 37.5 -13.5t16.5 -43.5q0 -43 -29.5 -73.5t-66.5 -42.5t-75 -12 q-61 0 -116.5 33t-55.5 95z" />
+<glyph unicode="&#x43a;" horiz-adv-x="556" d="M257 461v-23q-31 -4 -39.5 -16t-8.5 -46v-117q32 0 55 16.5t33 34.5t24 52t21 47q32 58 104 58q40 0 65 -22t25 -60q0 -25 -14.5 -43t-41.5 -18q-24 0 -37.5 12t-17 26t-10.5 26t-19 12q-10 0 -19 -9.5t-13.5 -19t-11.5 -27t-9 -21.5q-21 -50 -49 -71v-2q80 -8 122 -67 l102 -144q11 -15 25 -15v-24h-162l-127 197q-11 18 -20 24t-25 6v-143q0 -35 8.5 -45t43.5 -15v-24h-239v24q48 4 48 60v295q0 54 -48 58v24h235z" />
+<glyph unicode="&#x43b;" horiz-adv-x="546" d="M104 461h425v-24q-32 -5 -42.5 -18.5t-10.5 -46.5v-285q0 -31 11 -43.5t42 -19.5v-24h-240v24q27 4 37.5 17.5t10.5 42.5v303q0 22 -5.5 28t-26.5 6h-79q-18 0 -23.5 -6.5t-5.5 -27.5v-203q0 -29 -1 -48t-7 -50t-16.5 -49.5t-32.5 -33t-53 -14.5q-38 0 -56 15 q-20 17 -20 40q0 28 15 43t39 15q18 0 28.5 -14t15.5 -28.5t11 -14.5q37 0 37 159v168q0 34 -10.5 47t-42.5 18v24z" />
+<glyph unicode="&#x43c;" horiz-adv-x="657" d="M400 0v24q28 4 38 17.5t10 45.5v270l-129 -357h-42l-166 366v-282q0 -52 57 -60v-24h-148v24q34 4 45.5 17.5t11.5 45.5v289q0 32 -10 43.5t-43 17.5v24h191l129 -288h1l104 288h191v-24q-33 -5 -43 -17t-10 -44v-289q0 -32 10 -44t43 -19v-24h-240z" />
+<glyph unicode="&#x43d;" horiz-adv-x="560" d="M351 84v141h-138v-141q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h240v-24q-32 -5 -40 -16t-8 -45v-119h138v119q0 34 -8 45t-40 16v24h240v-24q-33 -5 -43 -17t-10 -44v-289q0 -32 10 -44t43 -19v-24h-240v24q27 4 37.5 17.5 t10.5 42.5z" />
+<glyph unicode="&#x43e;" horiz-adv-x="500" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#x43f;" horiz-adv-x="556" d="M351 84v296q0 49 -43 49h-53q-24 0 -33 -11.5t-9 -37.5v-296q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h522v-24q-33 -5 -43 -17t-10 -44v-289q0 -32 10 -44t43 -19v-24h-240v24q27 4 37.5 17.5t10.5 42.5z" />
+<glyph unicode="&#x440;" horiz-adv-x="556" d="M212 461v-69q25 44 55.5 62.5t75.5 18.5q85 0 133 -57.5t48 -166.5q0 -118 -51.5 -190t-140.5 -72q-34 0 -58 12.5t-60 47.5v-126q0 -52 16.5 -76t60.5 -26v-24h-272v24q35 6 45.5 18.5t10.5 44.5v490q0 33 -11 46.5t-44 18.5v24h192zM214 346v-239q12 -29 32.5 -47 t44.5 -18q85 0 85 192q0 182 -76 182q-37 0 -68 -37q-18 -21 -18 -33z" />
+<glyph unicode="&#x441;" horiz-adv-x="444" d="M412 109l18 -18q-41 -56 -86 -80.5t-105 -24.5q-95 0 -154.5 65t-59.5 171q0 110 68 180.5t169 70.5q66 0 110 -31t44 -79q0 -29 -17.5 -46.5t-47.5 -17.5q-26 0 -42.5 19t-16.5 54q0 18 -0.5 26t-2.5 18.5t-6 15t-12.5 7.5t-20.5 3q-38 0 -61 -44.5t-23 -124.5 q0 -102 37 -161t102 -59q58 0 107 56z" />
+<glyph unicode="&#x442;" horiz-adv-x="509" d="M325 402v-317q0 -31 12.5 -44t40.5 -17v-24h-245v24q35 8 44 19t9 45v314q0 27 -28 27q-53 0 -77.5 -35t-38.5 -106h-24l4 173h469l2 -173h-24q-7 31 -11 47t-13.5 37.5t-20.5 31.5t-30 17.5t-45 7.5q-24 0 -24 -27z" />
+<glyph unicode="&#x443;" horiz-adv-x="520" d="M502 461v-24q-24 -3 -36 -13.5t-24 -41.5l-148 -398q-45 -121 -77 -156q-31 -33 -84 -33q-43 0 -70 22t-27 57q0 29 17 48t45 19q25 0 42.5 -15t17.5 -37q0 -4 -2 -14l-1 -6q0 -7 5 -12t12 -5q38 0 66 82l18 53l-139 290q-9 18 -25 55l-27 61q-11 25 -15 30q-8 10 -34 14 v24h249v-24l-16 -1q-36 -3 -36 -25q0 -16 20 -58l92 -186l68 188q11 32 11 49q0 18 -11 25t-43 8v24h152z" />
+<glyph unicode="&#x444;" horiz-adv-x="726" d="M298 424v153q0 36 -13.5 54t-52.5 21v24h194v-252q35 49 109 49q78 0 118 -68.5t40 -165.5q0 -252 -169 -252q-63 0 -98 50v-116q0 -55 12 -77.5t55 -24.5v-24h-262v24q41 6 54 27.5t13 75.5v115q-35 -50 -98 -50q-169 0 -169 252q0 97 40 165.5t118 68.5q74 0 109 -49z M298 111v238q0 28 -17.5 47t-38.5 19q-76 0 -76 -181q0 -103 17.5 -147.5t56.5 -44.5q25 0 41.5 19.5t16.5 49.5zM426 350v-239q0 -29 18.5 -49t43.5 -20q39 0 54.5 44t15.5 148q0 182 -76 182q-21 0 -38.5 -19t-17.5 -47z" />
+<glyph unicode="&#x445;" horiz-adv-x="500" d="M484 24v-24h-241v24q45 3 45 20q0 15 -33 64l-42 63l-16 -20q-64 -81 -64 -103q0 -21 50 -24v-24h-169v24q27 1 48 18.5t65 74.5l65 84l-128 197q-15 23 -24 29.5t-28 9.5v24h250v-24q-47 -3 -47 -23q0 -18 34 -62l37 -49l36 46q38 49 38 64q0 11 -7 15.5t-24 6.5l-20 2 v24h168v-24q-44 -7 -70 -39l-101 -126l148 -228q8 -13 30 -20z" />
+<glyph unicode="&#x446;" horiz-adv-x="556" d="M213 377v-296q0 -49 43 -49h53q24 0 33 11.5t9 37.5v296q0 29 -10.5 42.5t-37.5 17.5v24h240v-24q-33 -7 -43 -19t-10 -44v-289q0 -32 10 -44t43 -17v-167h-24q-20 88 -42.5 115.5t-65.5 27.5h-390v24q33 5 43 17t10 44v289q0 32 -10 44t-43 19v24h240v-24 q-27 -4 -37.5 -17.5t-10.5 -42.5z" />
+<glyph unicode="&#x447;" horiz-adv-x="559" d="M350 85v110q-56 -25 -111 -25q-35 0 -60.5 4t-51.5 16t-40 38.5t-14 66.5v82q0 32 -10 43.5t-43 16.5v24h240v-24q-32 -5 -40 -16t-8 -45v-102q0 -38 13 -53.5t49 -15.5q35 0 76 19v152q0 34 -8 45t-40 16v24h240v-24q-33 -5 -43 -17t-10 -44v-288q0 -33 10 -45t43 -19 v-24h-248v24q32 0 44 15t12 46z" />
+<glyph unicode="&#x448;" horiz-adv-x="841" d="M530 32h60q24 0 33 11.5t9 37.5v296q0 29 -9 42.5t-36 17.5v24h237v-24q-33 -7 -43 -19t-10 -44v-289q0 -32 10 -44t43 -17v-24h-803v24q33 5 43 17t10 44v289q0 32 -10 44t-43 19v24h237v-24q-27 -4 -36 -17.5t-9 -42.5v-296q0 -49 43 -49h60q21 0 29 11.5t8 37.5v296 q0 29 -9 42.5t-36 17.5v24h234v-24q-33 -7 -41.5 -18.5t-8.5 -44.5v-289q0 -31 8 -42t30 -11z" />
+<glyph unicode="&#x449;" horiz-adv-x="841" d="M530 32h60q24 0 33 11.5t9 37.5v296q0 29 -9 42.5t-36 17.5v24h237v-24q-33 -7 -43 -19t-10 -44v-289q0 -32 10 -44t43 -17v-167h-24q-20 87 -42 115t-62 28h-675v24q33 5 43 17t10 44v289q0 32 -10 44t-43 19v24h237v-24q-27 -4 -36 -17.5t-9 -42.5v-296q0 -49 43 -49 h60q21 0 29 11.5t8 37.5v296q0 29 -9 42.5t-36 17.5v24h234v-24q-33 -7 -41.5 -18.5t-8.5 -44.5v-289q0 -31 8 -42t30 -11z" />
+<glyph unicode="&#x44a;" horiz-adv-x="607" d="M322 376v-115h78q60 0 100.5 -11.5t59 -32t25.5 -41.5t7 -48q0 -57 -51 -92.5t-148 -35.5h-263v24q33 7 43 19t10 44v315q0 27 -28 27q-56 0 -80 -35t-36 -106h-24l4 173h356v-24q-33 -6 -43 -17.5t-10 -43.5zM322 231v-156q0 -45 53 -45q94 0 94 98q0 103 -117 103h-30z " />
+<glyph unicode="&#x44b;" horiz-adv-x="759" d="M211 376v-115h78q60 0 100.5 -11.5t59 -32t25.5 -41.5t7 -48q0 -57 -51 -92.5t-148 -35.5h-260v24q33 7 41.5 18.5t8.5 44.5v289q0 33 -9 44.5t-41 16.5v24h239v-24q-30 -5 -40 -17t-10 -44zM211 231v-156q0 -45 53 -45q94 0 94 98q0 103 -117 103h-30zM691 373v-288 q0 -31 11.5 -44t38.5 -17v-24h-239v24q34 8 42 18.5t8 45.5v285q0 34 -9 45.5t-42 18.5v24h240v-24q-30 -7 -40 -19t-10 -45z" />
+<glyph unicode="&#x44c;" horiz-adv-x="498" d="M213 376v-115h78q60 0 100.5 -11.5t59 -32t25.5 -41.5t7 -48q0 -57 -51 -92.5t-148 -35.5h-263v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h245v-24q-31 -5 -42 -17.5t-11 -43.5zM213 231v-156q0 -45 53 -45q94 0 94 98q0 103 -117 103h-30z" />
+<glyph unicode="&#x44d;" horiz-adv-x="453" d="M141 255h147q0 92 -29 139.5t-77 47.5q-49 0 -83 -35.5t-45 -96.5h-24l3 161h18q7 -18 13.5 -24.5t16.5 -6.5q2 0 32 13q46 20 85 20q105 0 168 -67t63 -186q0 -101 -58.5 -167.5t-150.5 -66.5q-63 0 -108.5 24t-87.5 81l18 18q49 -56 108 -56q34 0 62 18.5t43 46 t22.5 53t7.5 44.5h-144v40z" />
+<glyph unicode="&#x44e;" horiz-adv-x="785" d="M213 257h98q10 98 73 157t155 59q95 0 158.5 -69t63.5 -175q0 -105 -64.5 -174t-161.5 -69q-96 0 -160.5 64t-64.5 175h-97v-141q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h240v-24q-32 -5 -40 -16t-8 -45v-119zM536 442 q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5q0 128 -17 176t-61 48z" />
+<glyph unicode="&#x44f;" horiz-adv-x="526" d="M317 85v115h-17l-126 -200h-163v24q35 0 73 61l74 119v2q-111 21 -111 127q0 57 51 92.5t148 35.5h263v-24q-33 -7 -43 -19t-10 -44v-289q0 -32 10 -44t43 -17v-24h-245v24q31 5 42 17.5t11 43.5zM317 230v156q0 45 -53 45q-94 0 -94 -98q0 -103 117 -103h30z" />
+<glyph unicode="&#x451;" horiz-adv-x="444" d="M403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-255q3 -41 8.5 -70t18 -58t36.5 -44t59 -15q32 0 58 15.5t57 52.5zM164 277h134v26q0 73 -9 92q-12 25 -23.5 36t-31.5 11 q-35 0 -52.5 -38.5t-17.5 -126.5zM411 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM201 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#x452;" horiz-adv-x="556" d="M387 562v-40h-179v-136h1q49 87 141 87q62 0 98.5 -38.5t36.5 -103.5v-331q0 -85 -26 -129q-43 -76 -150 -76q-62 0 -96 23.5t-34 67.5q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -19 -11.5 -32t-11.5 -14q0 -21 22 -21q25 0 36 18t11 58v419q0 85 -50 85 q-36 0 -70 -34q-18 -18 -18 -24v-263q0 -31 10 -44t38 -17v-24h-240v24q36 7 44.5 16t8.5 49v433h-49v40h49v17q0 37 -10 51.5t-44 21.5v24h193v-114h179z" />
+<glyph unicode="&#x453;" horiz-adv-x="451" d="M213 402v-317q0 -31 12.5 -44t40.5 -17v-24h-245v24q35 8 44 19t9 45v288q0 32 -10.5 44.5t-42.5 16.5v24h410l3 -173h-24q-6 28 -9 39.5t-11.5 32.5t-19 30t-28.5 20t-44 15t-61 4q-24 0 -24 -27zM142 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5 t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#x454;" horiz-adv-x="453" d="M165 255h147v-40h-144q0 -19 7.5 -44.5t22.5 -53t43 -46t62 -18.5q59 0 108 56l18 -18q-42 -57 -87.5 -81t-108.5 -24q-92 0 -150.5 66.5t-58.5 167.5q0 119 63 186t168 67q39 0 85 -20q30 -13 32 -13q10 0 16.5 6.5t13.5 24.5h18l3 -161h-24q-11 61 -45 96.5t-83 35.5 q-48 0 -77 -47.5t-29 -139.5z" />
+<glyph unicode="&#x455;" horiz-adv-x="389" d="M340 326h-25q-19 56 -47 82q-35 33 -75 33q-28 0 -47 -16.5t-19 -41.5q0 -26 22.5 -47t73.5 -42q75 -31 106.5 -67t31.5 -89q0 -67 -43 -109.5t-111 -42.5q-52 0 -108 23q-15 6 -23 6q-11 0 -26 -28h-25v165h28q32 -134 137 -134q34 0 54.5 18t20.5 47q0 47 -96 89 q-75 32 -108.5 68.5t-33.5 86.5q0 63 44.5 104.5t112.5 41.5q34 0 78 -15q22 -7 31 -7q17 0 25 20h22v-145z" />
+<glyph unicode="&#x456;" horiz-adv-x="278" d="M256 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24zM215 613q0 -33 -22.5 -55t-55.5 -22t-55 22t-22 55t22.5 55.5t56.5 22.5q31 0 53.5 -23t22.5 -55z" />
+<glyph unicode="&#x457;" horiz-adv-x="278" d="M309 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM99 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM208 461v-376q0 -30 10.5 -43.5t37.5 -17.5v-24h-240v24 q34 7 43.5 19t9.5 45v286q0 33 -10.5 44.5t-44.5 18.5v24h194z" />
+<glyph unicode="&#x458;" horiz-adv-x="333" d="M260 461v-459q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q25 0 36.5 18t11.5 58v474q0 32 -12.5 44t-50.5 15v24h202zM263 613q0 -33 -22.5 -55t-56.5 -22 q-33 0 -54.5 22t-21.5 55t22.5 55.5t55.5 22.5q31 0 54 -23t23 -55z" />
+<glyph unicode="&#x459;" horiz-adv-x="760" d="M288 0v24q27 4 37.5 17.5t10.5 42.5v295q0 23 -7 32.5t-27 9.5h-76q-17 0 -23 -9.5t-6 -32.5v-195q0 -36 -3 -62.5t-12.5 -60.5t-33.5 -53t-61 -19q-38 0 -56 15q-20 17 -20 40q0 28 15 43t39 15q18 0 28.5 -14t15.5 -28.5t11 -14.5q37 0 37 159v168q0 34 -10.5 47 t-42.5 18v24h414v-24q-30 -5 -36.5 -17t-6.5 -48v-117h78q60 0 100.5 -10.5t59 -30t25.5 -39.5t7 -47q0 -57 -51 -92.5t-149 -35.5h-257zM475 225v-155q0 -40 53 -40q94 0 94 98q0 52 -28 74.5t-89 22.5h-30z" />
+<glyph unicode="&#x45a;" horiz-adv-x="775" d="M351 225h-138v-141q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h240v-24q-32 -5 -40 -16t-8 -45v-119h138v119q0 34 -8 45t-40 16v24h240v-24q-33 -5 -43 -17t-10 -44v-119h78q60 0 100.5 -10.5t59 -30.5t25.5 -40.5t7 -47.5 q0 -57 -51 -92.5t-149 -35.5h-257v24q27 4 37.5 17t10.5 41v143zM490 225v-155q0 -40 53 -40q94 0 94 98q0 52 -28 74.5t-89 22.5h-30z" />
+<glyph unicode="&#x45b;" horiz-adv-x="556" d="M387 562v-40h-179v-126q65 77 147 77q60 0 95 -38t35 -98v-250q0 -34 11.5 -48.5t37.5 -14.5v-24h-234v24q25 3 35.5 16.5t10.5 44.5v224q0 54 -11 75.5t-40 21.5q-36 0 -70 -34q-17 -17 -17 -24v-263q0 -31 10 -44t38 -17v-24h-240v24q36 7 44.5 16t8.5 49v433h-49v40 h49v29q0 35 -9 44.5t-45 16.5v24h193v-114h179z" />
+<glyph unicode="&#x45c;" horiz-adv-x="556" d="M257 461v-23q-31 -4 -39.5 -16t-8.5 -46v-117q32 0 55 16.5t33 34.5t24 52t21 47q32 58 104 58q40 0 65 -22t25 -60q0 -25 -14.5 -43t-41.5 -18q-24 0 -37.5 12t-17 26t-10.5 26t-19 12q-10 0 -19 -9.5t-13.5 -19t-11.5 -27t-9 -21.5q-21 -50 -49 -71v-2q80 -8 122 -67 l102 -144q11 -15 25 -15v-24h-162l-127 197q-11 18 -20 24t-25 6v-143q0 -35 8.5 -45t43.5 -15v-24h-239v24q48 4 48 60v295q0 54 -48 58v24h235zM169 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56z" />
+<glyph unicode="&#x45e;" horiz-adv-x="500" d="M502 461v-24q-24 -3 -36 -13.5t-24 -41.5l-148 -398q-45 -121 -77 -156q-31 -33 -84 -33q-43 0 -70 22t-27 57q0 29 17 48t45 19q25 0 42.5 -15t17.5 -37q0 -4 -2 -14l-1 -6q0 -7 5 -12t12 -5q38 0 66 82l18 53l-139 290q-9 18 -25 55l-27 61q-11 25 -15 30q-8 10 -34 14 v24h249v-24l-16 -1q-36 -3 -36 -25q0 -16 20 -58l92 -186l68 188q11 32 11 49q0 18 -11 25t-43 8v24h152zM84 634q0 30 18 43.5t39 13.5q17 0 30.5 -11.5t13.5 -29.5q0 -19 -9.5 -30t-9.5 -17q0 -18 23.5 -32.5t66.5 -14.5t66 14t23 33q0 6 -9.5 17.5t-9.5 30.5 q0 18 14.5 29t32.5 11q21 0 37.5 -13.5t16.5 -43.5q0 -43 -29.5 -73.5t-66.5 -42.5t-75 -12q-61 0 -116.5 33t-55.5 95z" />
+<glyph unicode="&#x45f;" horiz-adv-x="556" d="M213 377v-296q0 -49 43 -49h53q24 0 33 11.5t9 37.5v296q0 29 -10.5 42.5t-37.5 17.5v24h240v-24q-33 -7 -43 -19t-10 -44v-289q0 -32 10 -44t43 -17v-24h-141q-43 0 -65.5 -27.5t-42.5 -115.5h-24q-20 85 -41 114t-59 29h-149v24q33 5 43 17t10 44v289q0 32 -10 44 t-43 19v24h240v-24q-27 -4 -37.5 -17.5t-10.5 -42.5z" />
+<glyph unicode="&#x462;" horiz-adv-x="793" d="M478 676v-25q-55 -2 -71.5 -18t-16.5 -63v-13h197l2 -147h-29q-12 68 -43 82.5t-127 14.5v-132h73q130 0 206 -45.5t76 -141.5q0 -83 -72 -135.5t-202 -52.5h-329v25q55 6 71.5 21t16.5 57v404q-96 0 -127 -14.5t-43 -82.5h-29l2 147h197v13q0 44 -18.5 60.5t-69.5 20.5 v25h336zM390 343v-245q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 155 -157 155h-26z" />
+<glyph unicode="&#x463;" horiz-adv-x="602" d="M317 676v-207h160l3 -181h-24q-5 36 -11 57.5t-18 43t-33 31t-53 9.5q-24 0 -24 -23v-145h78q60 0 100.5 -11.5t59 -32t25.5 -41.5t7 -48q0 -57 -51 -92.5t-148 -35.5h-263v24q33 7 43 19t10 44v319q-3 23 -28 23q-54 0 -78 -35.5t-33 -105.5h-24l3 181h160v122 q0 35 -9 44.5t-45 16.5v24h193zM317 231v-156q0 -45 53 -45q94 0 94 98q0 103 -117 103h-30z" />
+<glyph unicode="&#x46a;" horiz-adv-x="1123" d="M636 301v-172q0 -62 11.5 -80.5t60.5 -23.5v-25h-300v25q51 5 62 23t11 80v173q-67 0 -131.5 -61.5t-64.5 -152.5q0 -41 23 -53q17 -9 23 -9v-25h-301v25q38 1 57 21q36 35 68.5 112t64.5 109q78 78 231 78l-199 331h619l-204 -331q152 0 230 -78q32 -32 65 -109t69 -112 q19 -20 57 -21v-25h-301v25q6 0 23 9q23 12 23 53q0 91 -65 152.5t-132 61.5zM461 626l156 -271l165 271h-321z" />
+<glyph unicode="&#x46b;" horiz-adv-x="762" d="M280 0v24q27 3 32.5 12.5t5.5 47.5v117q-42 -12 -76 -52t-34 -83q0 -42 26 -42v-24h-220v24q40 5 53 38q16 39 29.5 63t39.5 52t66.5 42t95.5 14v2l-155 226h473l-152 -226v-2q55 0 95.5 -14t66.5 -42t39.5 -52t29.5 -63q13 -33 53 -38v-24h-220v24q26 0 26 42 q0 43 -34 82.5t-76 52.5v-117q0 -35 7 -45t35 -15v-24h-206zM307 421l116 -177l118 177h-234z" />
+<glyph unicode="&#x472;" horiz-adv-x="778" d="M394 691q151 0 250 -100.5t99 -255.5q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99zM212 361h1q36 36 59 49t55 13q22 0 50 -21l59 -42q30 -21 58 -21q41 0 72 27q-14 292 -181 292q-79 0 -125 -78t-48 -219zM565 315h-2q-34 -34 -57 -46 t-55 -12q-26 0 -84.5 42t-92.5 42q-31 0 -62 -27q3 -149 49 -224.5t129 -75.5q169 0 175 301z" />
+<glyph unicode="&#x473;" horiz-adv-x="500" d="M254 473q95 0 158.5 -69t63.5 -175q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68zM329 230h-1q-7 -22 -22 -32.5t-28 -10.5q-22 0 -46.5 17.5t-34.5 17.5q-12 0 -25 -14q1 -104 18.5 -147.5t60.5 -43.5t60.5 44.5t17.5 156.5v12z M172 243h2q28 34 53 34q18 0 38.5 -15.5t30.5 -15.5q18 0 32 21q-2 98 -19.5 136.5t-57.5 38.5q-44 0 -61 -43t-18 -156z" />
+<glyph unicode="&#x474;" horiz-adv-x="793" d="M289 541l133 -321h2l120 338q23 67 53 100t85 33q43 0 69.5 -26t26.5 -61q0 -31 -16.5 -50t-46.5 -19q-27 0 -41.5 16.5t-21 33.5t-15.5 17q-22 0 -33.5 -18t-30.5 -70l-190 -532h-27l-256 599q-18 42 -32 53.5t-52 16.5v25h336v-25l-33 -2q-53 -3 -53 -36q0 -17 23 -72z " />
+<glyph unicode="&#x475;" horiz-adv-x="559" d="M271 461v-24l-18 -2q-35 -4 -35 -24q0 -9 9 -31l73 -189h2l51 148q24 69 48 100t68 31q37 0 59 -21t22 -51q0 -25 -14 -42t-40 -17q-31 0 -44 31q-2 5 -5 15.5t-6.5 14t-10.5 3.5q-16 0 -23 -21l-140 -396h-26l-120 296q-47 116 -66 141q-8 10 -34 14v24h250z" />
+<glyph unicode="&#x490;" horiz-adv-x="626" d="M594 641h-331v-543q0 -35 20 -52t69 -21v-25h-338v25q53 4 70 21.5t17 50.5v481q0 40 -17.5 55t-68.5 18v25h357q102 0 146 34.5t47 122.5h29v-192z" />
+<glyph unicode="&#x491;" horiz-adv-x="451" d="M431 429h-194q-24 0 -24 -27v-317q0 -31 12.5 -44t40.5 -17v-24h-245v24q35 8 44 19t9 45v288q0 32 -10.5 44.5t-42.5 16.5v24h221q29 0 52.5 4t39 9t28 17.5t19 20t13 27.5t8.5 29t8 34h24z" />
+<glyph unicode="&#x1d00;" horiz-adv-x="515" d="M9 0v24q23 2 33 11.5t25 43.5l175 396h26l135 -296q59 -132 66 -141q8 -10 34 -14v-24h-250v24l18 2q35 4 35 24q0 11 -9 31l-21 46h-148l-12 -26q-11 -23 -11 -44q0 -18 11.5 -24.5t43.5 -8.5v-24h-151zM202 292l-57 -128h114z" />
+<glyph unicode="&#x1d07;" horiz-adv-x="531" d="M472 461v-136h-24q-13 66 -47 82.5t-139 16.5q-29 0 -41 -7.5t-12 -24.5v-137q67 0 92 18.5t32 76.5h24v-231h-24q-7 60 -31.5 79.5t-92.5 19.5v-120q0 -32 11 -46.5t37 -14.5h68q62 0 93 21q20 14 33.5 31.5t33.5 52.5h26l-33 -142h-456v24q29 6 38.5 18.5t9.5 45.5v286 q0 34 -8.5 45t-41.5 18v24h452z" />
+<glyph unicode="&#x1d1c;" horiz-adv-x="600" d="M584 461v-24q-31 -7 -41 -16.5t-10 -34.5v-218q0 -107 -67 -149q-60 -38 -163 -38q-102 0 -164 37q-38 23 -54 54t-16 82v223q0 29 -13 42.5t-40 17.5v24h239v-24q-33 -7 -40 -18t-7 -45v-210q0 -140 130 -140q154 0 154 153v207q0 29 -11 39t-39 14v24h142z" />
+<glyph unicode="&#x1e80;" horiz-adv-x="1000" d="M633 738h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28zM981 676v-25q-50 -5 -69 -64l-200 -602h-27l-171 477l-186 -477h-28l-212 602q-13 37 -25 48t-44 16v25h294v-25q-39 -3 -51.5 -11.5t-12.5 -30.5q0 -13 7 -33l120 -364l118 308l-35 96 q-12 32 -72 35v25h312v-25l-13 -1q-33 -2 -46 -10t-13 -26q0 -13 14 -56l108 -336l112 343q7 20 7 42q0 23 -14.5 32.5t-54.5 11.5v25h182z" />
+<glyph unicode="&#x1e81;" horiz-adv-x="722" d="M707 461v-24q-19 -4 -29.5 -14.5t-20.5 -35.5l-155 -401h-23l-102 310l-125 -310h-24l-148 374q-19 47 -28.5 60t-28.5 17v24h222v-24q-38 -5 -38 -28q0 -12 39 -115l45 -118l68 171q-4 12 -6 19q-14 49 -22 58.5t-37 12.5v24h234v-24q-28 -2 -38 -7t-10 -17 q0 -14 27 -106q23 -79 34 -127l35 94q44 118 44 128q0 17 -10 24.5t-38 10.5v24h135zM496 528h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28z" />
+<glyph unicode="&#x1e82;" horiz-adv-x="1000" d="M395 738l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM981 676v-25q-50 -5 -69 -64l-200 -602h-27l-171 477l-186 -477h-28l-212 602q-13 37 -25 48t-44 16v25h294v-25q-39 -3 -51.5 -11.5t-12.5 -30.5q0 -13 7 -33l120 -364l118 308 l-35 96q-12 32 -72 35v25h312v-25l-13 -1q-33 -2 -46 -10t-13 -26q0 -13 14 -56l108 -336l112 343q7 20 7 42q0 23 -14.5 32.5t-54.5 11.5v25h182z" />
+<glyph unicode="&#x1e83;" horiz-adv-x="722" d="M258 528l137 157q25 28 53 28q22 0 35 -12t13 -32q0 -17 -8 -27.5t-32 -25.5l-142 -88h-56zM707 461v-24q-19 -4 -29.5 -14.5t-20.5 -35.5l-155 -401h-23l-102 310l-125 -310h-24l-148 374q-19 47 -28.5 60t-28.5 17v24h222v-24q-38 -5 -38 -28q0 -12 39 -115l45 -118 l68 171q-4 12 -6 19q-14 49 -22 58.5t-37 12.5v24h234v-24q-28 -2 -38 -7t-10 -17q0 -14 27 -106q23 -79 34 -127l35 94q44 118 44 128q0 17 -10 24.5t-38 10.5v24h135z" />
+<glyph unicode="&#x1e84;" horiz-adv-x="1000" d="M684 810q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM474 810q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM981 676v-25q-50 -5 -69 -64l-200 -602h-27l-171 477 l-186 -477h-28l-212 602q-13 37 -25 48t-44 16v25h294v-25q-39 -3 -51.5 -11.5t-12.5 -30.5q0 -13 7 -33l120 -364l118 308l-35 96q-12 32 -72 35v25h312v-25l-13 -1q-33 -2 -46 -10t-13 -26q0 -13 14 -56l108 -336l112 343q7 20 7 42q0 23 -14.5 32.5t-54.5 11.5v25h182z " />
+<glyph unicode="&#x1e85;" horiz-adv-x="722" d="M547 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM337 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM707 461v-24q-19 -4 -29.5 -14.5t-20.5 -35.5l-155 -401 h-23l-102 310l-125 -310h-24l-148 374q-19 47 -28.5 60t-28.5 17v24h222v-24q-38 -5 -38 -28q0 -12 39 -115l45 -118l68 171q-4 12 -6 19q-14 49 -22 58.5t-37 12.5v24h234v-24q-28 -2 -38 -7t-10 -17q0 -14 27 -106q23 -79 34 -127l35 94q44 118 44 128q0 17 -10 24.5 t-38 10.5v24h135z" />
+<glyph unicode="&#x1ef2;" horiz-adv-x="722" d="M469 738h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28zM699 676v-25q-49 -7 -68 -39l-191 -311v-178q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136l-180 328q-31 56 -83 59v25h335v-25l-27 -2q-32 -2 -43 -7.5t-11 -21.5 q0 -13 24 -59l120 -232l109 178q41 68 41 102q0 22 -16.5 30t-67.5 12v25h220z" />
+<glyph unicode="&#x1ef3;" horiz-adv-x="500" d="M482 461v-24q-24 -3 -36 -13.5t-24 -41.5l-148 -398q-45 -121 -77 -156q-31 -33 -84 -33q-43 0 -70 22t-27 57q0 29 17 48t45 19q25 0 42.5 -15t17.5 -37q0 -4 -2 -14l-1 -6q0 -7 5 -12t12 -5q38 0 66 82l18 53l-119 290q-49 121 -67 146q-8 10 -34 14v24h249v-24l-16 -1 q-36 -3 -36 -25q0 -7 20 -58l72 -186l68 188q11 32 11 49q0 18 -11 25t-43 8v24h152zM369 528h-56l-142 88q-40 25 -40 52q0 19 13.5 32t33.5 13q29 0 54 -28z" />
+<glyph unicode="&#x2000;" horiz-adv-x="527" />
+<glyph unicode="&#x2001;" horiz-adv-x="1055" />
+<glyph unicode="&#x2002;" horiz-adv-x="527" />
+<glyph unicode="&#x2003;" horiz-adv-x="1055" />
+<glyph unicode="&#x2004;" horiz-adv-x="351" />
+<glyph unicode="&#x2005;" horiz-adv-x="263" />
+<glyph unicode="&#x2006;" horiz-adv-x="175" />
+<glyph unicode="&#x2007;" horiz-adv-x="175" />
+<glyph unicode="&#x2008;" horiz-adv-x="131" />
+<glyph unicode="&#x2009;" horiz-adv-x="211" />
+<glyph unicode="&#x200a;" horiz-adv-x="58" />
+<glyph unicode="&#x2010;" horiz-adv-x="333" d="M287 171h-243v116h243v-116z" />
+<glyph unicode="&#x2011;" horiz-adv-x="333" d="M287 171h-243v116h243v-116z" />
+<glyph unicode="&#x2012;" horiz-adv-x="500" d="M500 171h-500v116h500v-116z" />
+<glyph unicode="&#x2013;" horiz-adv-x="500" d="M500 181h-500v90h500v-90z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1000" d="M1000 181h-1000v90h1000v-90z" />
+<glyph unicode="&#x2015;" horiz-adv-x="2000" d="M2000 181h-2000v90h2000v-90z" />
+<glyph unicode="&#x2017;" horiz-adv-x="520" d="M510 -287h-500v50h500v-50zM510 -187h-500v50h500v-50z" />
+<glyph unicode="&#x2018;" horiz-adv-x="333" d="M236 691l11 -22q-109 -76 -109 -133q0 -21 19 -21q3 0 11 1t13 1q32 0 52.5 -21t20.5 -55q0 -39 -23 -62t-61 -23q-47 0 -73.5 31t-26.5 85q0 132 166 219z" />
+<glyph unicode="&#x2019;" horiz-adv-x="333" d="M97 356l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x201a;" horiz-adv-x="333" d="M97 -180l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x201b;" horiz-adv-x="333" d="M256 378l-11 -22q-166 87 -166 219q0 54 26.5 85t73.5 31q38 0 61 -23t23 -62q0 -34 -20.5 -55t-52.5 -21q-5 0 -13 1t-11 1q-19 0 -19 -21q0 -57 109 -133z" />
+<glyph unicode="&#x201c;" horiz-adv-x="500" d="M198 691l11 -22q-109 -76 -109 -133q0 -21 19 -21q3 0 11 1t13 1q32 0 52.5 -21t20.5 -55q0 -39 -23 -62t-61 -23q-47 0 -73.5 31t-26.5 85q0 132 166 219zM468 691l11 -22q-109 -76 -109 -133q0 -21 19 -21q3 0 11 1t13 1q32 0 52.5 -21t20.5 -55q0 -39 -23 -62t-61 -23 q-47 0 -73.5 31t-26.5 85q0 132 166 219z" />
+<glyph unicode="&#x201d;" horiz-adv-x="500" d="M32 356l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219zM302 356l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23 q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x201e;" horiz-adv-x="500" d="M32 -180l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23q47 0 73.5 -31t26.5 -85q0 -132 -166 -219zM302 -180l-11 22q109 76 109 133q0 21 -19 21q-3 0 -11 -1t-13 -1q-32 0 -52.5 21t-20.5 55q0 39 23 62t61 23 q47 0 73.5 -31t26.5 -85q0 -132 -166 -219z" />
+<glyph unicode="&#x201f;" horiz-adv-x="500" d="M191 378l-11 -22q-166 87 -166 219q0 54 26.5 85t73.5 31q38 0 61 -23t23 -62q0 -34 -20.5 -55t-52.5 -21q-5 0 -13 1t-11 1q-19 0 -19 -21q0 -57 109 -133zM461 378l-11 -22q-166 87 -166 219q0 54 26.5 85t73.5 31q38 0 61 -23t23 -62q0 -34 -20.5 -55t-52.5 -21 q-5 0 -13 1t-11 1q-19 0 -19 -21q0 -57 109 -133z" />
+<glyph unicode="&#x2020;" horiz-adv-x="500" d="M240 -134l-5 144q-5 137 -46 243q-5 12 -5 17q0 6 13 24q24 33 32 62t9 90q-33 -4 -47.5 -8.5t-41.5 -18.5q-30 -16 -52 -16q-23 0 -36.5 14.5t-13.5 39.5q0 53 52 53q20 0 53 -17q42 -22 86 -27q-1 48 -6.5 69t-22.5 52q-15 26 -15 44q0 28 15.5 44t41.5 16q56 0 56 -55 q0 -20 -18 -56t-23 -55.5t-5 -58.5q43 6 89 28q35 16 52 16q24 0 37.5 -14.5t13.5 -39.5q0 -24 -13.5 -38.5t-36.5 -14.5q-24 0 -56 19q-29 17 -43 20.5t-43 3.5q0 -103 52 -169q5 -7 5 -10q0 -2 -1 -4q-20 -45 -34.5 -117t-16.5 -136l-5 -144h-21z" />
+<glyph unicode="&#x2021;" horiz-adv-x="500" d="M221 464h18q-1 40 -6 62t-21 59q-15 33 -15 52q0 24 14.5 39t38.5 15t40 -16t16 -39q0 -18 -16 -55q-17 -39 -22 -60t-6 -57q44 5 92 26q34 15 52 15q23 0 36.5 -13.5t13.5 -35.5q0 -23 -13.5 -36t-36.5 -13q-24 0 -51 16q-19 11 -35 16t-26 6t-32 1q0 -94 47 -155 q7 -9 7 -12t-7 -12q-46 -67 -47 -156q41 0 88 22q39 18 58 18q22 0 35 -13.5t13 -36.5q0 -22 -14 -34t-37 -12q-15 0 -51 14q-5 2 -16 6t-14.5 5.5t-11.5 4t-12 3.5t-10 2l-14 2q-6 1 -14 1q1 -36 6 -56.5t22 -58.5q16 -37 16 -55q0 -24 -16 -39.5t-40 -15.5t-38.5 14.5 t-14.5 39.5q0 19 15 53q17 37 21.5 57.5t5.5 60.5h-18q-23 0 -65 -21q-35 -17 -61 -17q-23 0 -36.5 13t-13.5 35q0 21 14 35t35 14q19 0 57 -17q47 -22 88 -24q-2 47 -13 82t-42 86q31 51 42 84.5t13 82.5q-30 -2 -45 -5.5t-46 -18.5q-32 -15 -53 -15q-22 0 -36 13t-14 35 t13.5 36t35.5 14q23 0 62 -19q41 -20 65 -22z" />
+<glyph unicode="&#x2022;" horiz-adv-x="560" d="M490 253q0 -87 -62 -149t-149 -62t-148 61.5t-61 149.5q0 85 61.5 147t147.5 62q92 0 151.5 -60.5t59.5 -148.5z" />
+<glyph unicode="&#x2025;" horiz-adv-x="666" d="M251 71q0 -35 -25 -59.5t-60 -24.5q-36 0 -60 24t-24 60q0 35 25 60t60 25q34 0 59 -25t25 -60zM584 71q0 -35 -25 -59.5t-60 -24.5q-36 0 -60 24t-24 60q0 35 25 60t60 25q34 0 59 -25t25 -60z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1000" d="M251 71q0 -35 -25 -59.5t-60 -24.5q-36 0 -60 24t-24 60q0 35 25 60t60 25q34 0 59 -25t25 -60zM584 71q0 -35 -25 -59.5t-60 -24.5q-36 0 -60 24t-24 60q0 35 25 60t60 25q34 0 59 -25t25 -60zM917 71q0 -35 -25 -59.5t-60 -24.5q-36 0 -60 24t-24 60q0 35 25 60t60 25 q34 0 59 -25t25 -60z" />
+<glyph unicode="&#x202f;" horiz-adv-x="211" />
+<glyph unicode="&#x2030;" horiz-adv-x="1110" d="M688 214q0 -53 -19.5 -104t-53.5 -86q-39 -42 -99 -42q-57 0 -92.5 38.5t-35.5 99.5q0 85 58.5 149t136.5 64q49 0 77 -31.5t28 -87.5zM663 220q0 35 -17 57.5t-42 22.5q-31 0 -62 -46q-24 -36 -40 -87t-16 -91q0 -66 50 -66q44 0 79 51q48 74 48 159zM626 706l-438 -735 h-48l388 655q-56 -42 -113 -42q-27 0 -60 13q3 -29 3 -42q0 -53 -19.5 -105.5t-50.5 -83.5q-44 -44 -101 -44q-56 0 -91 39t-35 100q0 85 59 149t138 64q35 0 71 -29q38 -30 83 -30q49 0 88.5 21.5t77.5 69.5h48zM332 560q0 25 -6 35.5t-26 18.5q-11 5 -21 11q-14 9 -20 9 q-32 0 -67 -74.5t-35 -141.5q0 -66 50 -66q48 0 86.5 64t38.5 144zM1049 213q0 -52 -19.5 -103t-52.5 -86q-40 -42 -100 -42q-57 0 -92 37.5t-35 98.5q0 88 57.5 151.5t137.5 63.5q49 0 76.5 -32t27.5 -88zM1024 220q0 35 -17 57.5t-43 22.5q-30 0 -60 -45 q-23 -35 -39.5 -87.5t-16.5 -92.5q0 -65 49 -65q44 0 79 51q48 74 48 159z" />
+<glyph unicode="&#x2031;" horiz-adv-x="1472" d="M688 214q0 -53 -19.5 -104t-53.5 -86q-39 -42 -99 -42q-57 0 -92.5 38.5t-35.5 99.5q0 85 58.5 149t136.5 64q49 0 77 -31.5t28 -87.5zM663 220q0 35 -17 57.5t-42 22.5q-31 0 -62 -46q-24 -36 -40 -87t-16 -91q0 -66 50 -66q44 0 79 51q48 74 48 159zM626 706l-438 -735 h-48l388 655q-56 -42 -113 -42q-27 0 -60 13q3 -29 3 -42q0 -53 -19.5 -105.5t-50.5 -83.5q-44 -44 -101 -44q-56 0 -91 39t-35 100q0 85 59 149t138 64q35 0 71 -29q38 -30 83 -30q49 0 88.5 21.5t77.5 69.5h48zM332 560q0 25 -6 35.5t-26 18.5q-11 5 -21 11q-14 9 -20 9 q-32 0 -67 -74.5t-35 -141.5q0 -66 50 -66q48 0 86.5 64t38.5 144zM1411 213q0 -52 -19.5 -103t-52.5 -86q-40 -42 -100 -42q-57 0 -92 37.5t-35 98.5q0 88 57.5 151.5t137.5 63.5q49 0 76.5 -32t27.5 -88zM1386 220q0 35 -17 57.5t-43 22.5q-30 0 -60 -45 q-23 -35 -39.5 -87.5t-16.5 -92.5q0 -65 49 -65q44 0 79 51q48 74 48 159zM1049 213q0 -52 -19.5 -103t-52.5 -86q-40 -42 -100 -42q-57 0 -92 37.5t-35 98.5q0 88 57.5 151.5t137.5 63.5q49 0 76.5 -32t27.5 -88zM1025 220q0 35 -17 57.5t-42 22.5q-31 0 -62 -46 q-24 -36 -40 -87t-16 -91q0 -66 50 -66q44 0 79 51q48 74 48 159z" />
+<glyph unicode="&#x2032;" horiz-adv-x="310" d="M75 445l67 221q14 47 50 47q16 0 29.5 -12.5t13.5 -28.5q0 -15 -14 -39l-113 -195z" />
+<glyph unicode="&#x2033;" horiz-adv-x="467" d="M233 445l66 222q13 46 50 46q16 0 29.5 -12.5t13.5 -28.5q0 -15 -14 -39l-112 -195zM75 445l66 222q13 46 50 46q16 0 29.5 -12.5t13.5 -28.5q0 -15 -14 -39l-112 -195z" />
+<glyph unicode="&#x2034;" horiz-adv-x="625" d="M391 445l66 222q13 46 50 46q16 0 29.5 -12.5t13.5 -28.5q0 -15 -14 -39l-112 -195zM233 445l66 222q13 46 50 46q16 0 29.5 -12.5t13.5 -28.5q0 -15 -14 -39l-112 -195zM75 445l66 222q13 46 50 46q16 0 29.5 -12.5t13.5 -28.5q0 -15 -14 -39l-112 -195z" />
+<glyph unicode="&#x2035;" horiz-adv-x="310" d="M235 445l-33 -7l-113 195q-14 24 -14 39q0 16 13.5 28.5t29.5 12.5q36 0 50 -47z" />
+<glyph unicode="&#x2036;" horiz-adv-x="467" d="M392 445l-33 -7l-112 195q-14 24 -14 39q0 16 13.5 28.5t29.5 12.5q37 0 50 -46zM234 445l-33 -7l-112 195q-14 24 -14 39q0 16 13.5 28.5t29.5 12.5q37 0 50 -46z" />
+<glyph unicode="&#x2037;" horiz-adv-x="625" d="M550 445l-33 -7l-112 195q-14 24 -14 39q0 16 13.5 28.5t29.5 12.5q37 0 50 -46zM392 445l-33 -7l-112 195q-14 24 -14 39q0 16 13.5 28.5t29.5 12.5q37 0 50 -46zM234 445l-33 -7l-112 195q-14 24 -14 39q0 16 13.5 28.5t29.5 12.5q37 0 50 -46z" />
+<glyph unicode="&#x2038;" horiz-adv-x="584" d="M497 -150l-27 -20l-178 216l-176 -216l-25 20l195 267h11z" />
+<glyph unicode="&#x2039;" horiz-adv-x="333" d="M254 393l6 5q21 17 31 17q12 0 12 -11q0 -34 -93 -147q-16 -20 -23 -30q12 -18 40 -54q78 -101 78 -122q0 -15 -11 -15q-12 0 -29 16q-5 5 -8 7l-206 166v4z" />
+<glyph unicode="&#x203a;" horiz-adv-x="333" d="M282 222l-203 -164l-6 -5q-19 -17 -31 -17t-12 11q0 34 93 147q16 20 23 30q-22 32 -40 53q-78 93 -78 123q0 15 11 15q10 0 29 -16q5 -5 8 -7l206 -166v-4z" />
+<glyph unicode="&#x203c;" horiz-adv-x="625" d="M181 234h-31q-10 93 -19.5 144t-31.5 122q-18 58 -18 91q0 47 22 73.5t62 26.5q38 0 61.5 -27t23.5 -75q0 -32 -18 -89q-22 -72 -31.5 -123t-19.5 -143zM251 71q0 -35 -25 -59.5t-60 -24.5q-36 0 -60 23.5t-24 59.5q0 37 24.5 61.5t60.5 24.5q37 0 60.5 -24t23.5 -61z M474 234h-31q-10 93 -19.5 144t-31.5 122q-18 58 -18 91q0 47 22 73.5t62 26.5q38 0 61.5 -27t23.5 -75q0 -32 -18 -89q-22 -72 -31.5 -123t-19.5 -143zM544 71q0 -35 -25 -59.5t-60 -24.5q-36 0 -60 23.5t-24 59.5q0 37 24.5 61.5t60.5 24.5q37 0 60.5 -24t23.5 -61z" />
+<glyph unicode="&#x203e;" horiz-adv-x="500" d="M500 766h-500v72h500v-72z" />
+<glyph unicode="&#x2040;" horiz-adv-x="798" d="M733 523l-19 -15q-60 67 -132 93t-174 26q-105 0 -175.5 -25t-132.5 -94l-21 13q40 92 132.5 148t194.5 56q105 0 195 -54t132 -148z" />
+<glyph unicode="&#x2044;" horiz-adv-x="183" d="M345 688l-439 -700h-74l441 700h72z" />
+<glyph unicode="&#x2047;" horiz-adv-x="947" d="M253 232h-30q-3 25 -3 45q1 46 38.5 123.5t37.5 122.5q0 62 -22 96t-62 34q-28 0 -44.5 -11t-16.5 -29q0 -13 15 -29q22 -25 22 -51q0 -28 -20.5 -47.5t-44.5 -19.5q-29 0 -47.5 22.5t-18.5 55.5q0 63 51 104t133 41q93 0 148.5 -46.5t55.5 -119.5q0 -52 -26 -87.5 t-95 -78.5q-47 -29 -59 -49.5t-12 -75.5zM323 71q0 -35 -24.5 -59.5t-59.5 -24.5q-36 0 -60.5 24.5t-24.5 59.5t25 60t61 25q34 0 58.5 -25t24.5 -60zM700 232h-30q-3 25 -3 45q1 46 38.5 123.5t37.5 122.5q0 62 -22 96t-62 34q-28 0 -44.5 -11t-16.5 -29q0 -13 15 -29 q22 -25 22 -51q0 -28 -20.5 -47.5t-44.5 -19.5q-29 0 -47.5 22.5t-18.5 55.5q0 63 51 104t133 41q93 0 148.5 -46.5t55.5 -119.5q0 -52 -26 -87.5t-95 -78.5q-47 -29 -59 -49.5t-12 -75.5zM770 71q0 -35 -24.5 -59.5t-59.5 -24.5q-36 0 -60.5 24.5t-24.5 59.5t25 60t61 25 q34 0 58.5 -25t24.5 -60z" />
+<glyph unicode="&#x204e;" horiz-adv-x="500" d="M260 42l7 -3q30 24 42 35.5t30 38.5q14 22 26.5 30t29.5 8q21 0 37 -14.5t16 -33.5q0 -23 -25.5 -38t-56.5 -15q-33 0 -48.5 -4.5t-40.5 -21.5v-8q51 -24 97 -28q40 -3 56.5 -14.5t16.5 -36.5q0 -22 -13 -36t-36 -14q-19 0 -32.5 11.5t-42.5 50.5q-15 21 -25.5 30 t-31.5 20l-6 -4q1 -32 6 -49t21 -49q15 -29 15 -45q0 -22 -14.5 -37t-36.5 -15q-21 0 -35 14.5t-14 37.5q0 17 16 46q14 24 18 42t5 55l-6 4q-29 -22 -41.5 -34.5t-32.5 -40.5q-15 -22 -26.5 -29.5t-28.5 -7.5q-21 0 -35.5 13.5t-14.5 34.5q0 47 84 53q32 2 47 7.5t39 21.5 v7q-47 21 -102 26q-68 5 -68 53q0 22 13 35t34 13t34 -9t28 -34q17 -29 29.5 -41t41.5 -28l5 3q-1 33 -4.5 48t-18.5 43q-18 32 -18 53q0 22 14.5 36t37.5 14q21 0 34.5 -15t13.5 -40q0 -15 -18 -47q-22 -37 -22 -77v-15z" />
+<glyph unicode="&#x204f;" horiz-adv-x="333" d="M244 -158l-11 -22q-166 87 -166 219q0 54 26.5 85t73.5 31q38 0 61 -23t23 -62q0 -34 -20.5 -55t-52.5 -21q-5 0 -13 1t-11 1q-19 0 -19 -21q0 -57 109 -133zM249 388q0 -36 -24.5 -60.5t-59.5 -24.5t-60 24.5t-25 59.5t24.5 60t59.5 25q36 0 60.5 -24.5t24.5 -59.5z" />
+<glyph unicode="&#x2051;" horiz-adv-x="500" d="M260 42l7 -3q30 24 42 35.5t30 38.5q14 22 26.5 30t29.5 8q21 0 37 -14.5t16 -33.5q0 -23 -25.5 -38t-56.5 -15q-33 0 -48.5 -4.5t-40.5 -21.5v-8q51 -24 97 -28q40 -3 56.5 -14.5t16.5 -36.5q0 -22 -13 -36t-36 -14q-19 0 -32.5 11.5t-42.5 50.5q-15 21 -25.5 30 t-31.5 20l-6 -4q1 -32 6 -49t21 -49q15 -29 15 -45q0 -22 -14.5 -37t-36.5 -15q-21 0 -35 14.5t-14 37.5q0 17 16 46q14 24 18 42t5 55l-6 4q-29 -22 -41.5 -34.5t-32.5 -40.5q-15 -22 -26.5 -29.5t-28.5 -7.5q-21 0 -35.5 13.5t-14.5 34.5q0 47 84 53q32 2 47 7.5t39 21.5 v7q-47 21 -102 26q-68 5 -68 53q0 22 13 35t34 13t34 -9t28 -34q17 -29 29.5 -41t41.5 -28l5 3q-1 33 -4.5 48t-18.5 43q-18 32 -18 53q0 22 14.5 36t37.5 14q21 0 34.5 -15t13.5 -40q0 -15 -18 -47q-22 -37 -22 -77v-15zM260 512l7 -3q30 24 42 35.5t30 38.5q14 22 26.5 30 t29.5 8q21 0 37 -14.5t16 -33.5q0 -23 -25.5 -38t-56.5 -15q-33 0 -48.5 -4.5t-40.5 -21.5v-8q51 -24 97 -28q40 -3 56.5 -14.5t16.5 -36.5q0 -22 -13 -36t-36 -14q-19 0 -32.5 11.5t-42.5 50.5q-15 21 -25.5 30t-31.5 20l-6 -4q1 -32 6 -49t21 -49q15 -29 15 -45 q0 -22 -14.5 -37t-36.5 -15q-21 0 -35 14.5t-14 37.5q0 17 16 46q14 24 18 42t5 55l-6 4q-29 -22 -41.5 -34.5t-32.5 -40.5q-15 -22 -26.5 -29.5t-28.5 -7.5q-21 0 -35.5 13.5t-14.5 34.5q0 47 84 53q32 2 47 7.5t39 21.5v7q-47 21 -102 26q-68 5 -68 53q0 22 13 35t34 13 t34 -9t28 -34q17 -29 29.5 -41t41.5 -28l5 3q-1 33 -4.5 48t-18.5 43q-18 32 -18 53q0 22 14.5 36t37.5 14q21 0 34.5 -15t13.5 -40q0 -15 -18 -47q-22 -37 -22 -77v-15z" />
+<glyph unicode="&#x2057;" horiz-adv-x="783" d="M233 445l66 222q13 46 50 46q16 0 29.5 -12.5t13.5 -28.5q0 -15 -14 -39l-112 -195zM75 445l66 222q13 46 50 46q16 0 29.5 -12.5t13.5 -28.5q0 -15 -14 -39l-112 -195zM549 445l66 222q13 46 50 46q16 0 29.5 -12.5t13.5 -28.5q0 -15 -14 -39l-112 -195zM391 445l66 222 q13 46 50 46q16 0 29.5 -12.5t13.5 -28.5q0 -15 -14 -39l-112 -195z" />
+<glyph unicode="&#x205f;" horiz-adv-x="263" />
+<glyph unicode="&#x207f;" horiz-adv-x="491" d="M478 275h-206v20q34 6 34 49v216q0 41 -9 57.5t-30 16.5q-24 0 -48 -21q-27 -23 -27 -48v-221q0 -22 7 -34t29 -15v-20h-213v20q31 7 40.5 17.5t9.5 33.5v273q0 24 -10 34t-40 15v20h176v-64h1q16 36 48.5 56t69.5 20q57 0 90 -36.5t33 -93.5v-226q0 -26 9.5 -36.5 t35.5 -12.5v-20z" />
+<glyph unicode="&#x20a3;" horiz-adv-x="611" d="M443 352h-177v-78h177v-40h-177v-133q0 -43 21 -58t89 -18v-25h-360v25q55 6 71.5 21t16.5 57v131h-93v40h93v78h-93v40h93v183q0 43 -18 58t-70 18v25h567v-202h-24q-10 57 -22 81.5t-38 47.5q-45 39 -163 39q-38 0 -54 -11.5t-16 -39.5v-199h177v-40z" />
+<glyph unicode="&#x20a4;" horiz-adv-x="500" d="M406 373h-136q6 -54 6 -78h130v-40h-129q-2 -67 -20 -121q61 -22 96 -22q47 0 68.5 15t32.5 56h23q-9 -107 -38 -149q-34 -50 -93 -50q-31 0 -57 13.5t-68 51.5q-48 -62 -112 -62q-42 0 -65 22t-23 63q0 92 106 92q23 0 51 -7q-4 53 -19 98h-123v40h106q-6 13 -23 78h-83 v40h74q-5 35 -5 78q0 47 21.5 90t57.5 69q49 34 124 34q70 0 110.5 -30.5t40.5 -82.5q0 -34 -18 -53t-50 -19q-28 0 -45 18t-17 47q0 8 1 22.5t1 24.5q1 21 -11 32t-33 11q-25 0 -40.5 -17t-15.5 -45q0 -48 28 -179h147v-40zM181 86q-36 32 -72 32q-26 0 -41 -14t-15 -38 q0 -22 15 -35.5t41 -13.5q28 0 45 16t27 53z" />
+<glyph unicode="&#x20a7;" horiz-adv-x="1369" d="M927 112l25 -11q-31 -62 -64.5 -87.5t-83.5 -25.5q-52 0 -82 28.5t-30 78.5v322h-53v27q49 33 82 71.5t85 114.5h25v-169h95v-44h-95v-298q0 -60 39 -60q29 0 57 53zM1320 326h-25q-19 56 -47 82q-34 32 -75 32q-28 0 -47 -16.5t-19 -41.5q0 -26 22.5 -46.5t73.5 -41.5 q75 -31 106.5 -67t31.5 -89q0 -67 -43 -109.5t-111 -42.5q-52 0 -108 23q-15 6 -23 6q-11 0 -26 -28h-25v165h28q32 -132 137 -132q34 0 54.5 18t20.5 47q0 24 -22 44.5t-74 42.5q-75 32 -108.5 68.5t-33.5 86.5q0 63 44.5 104.5t112.5 41.5q34 0 78 -15q22 -7 31 -7 q17 0 25 20h22v-145zM16 676h315q128 0 198.5 -45.5t70.5 -135.5q0 -60 -33.5 -104.5t-95.5 -67.5q-32 -12 -70.5 -15.5t-138.5 -4.5v-192q0 -51 14 -65t73 -21v-25h-333v25q33 3 45 9q23 9 31 30t8 62v427q0 58 -15.5 75.5t-68.5 22.5v25zM262 606v-268q94 1 130 32t36 114 q0 84 -27 120.5t-89 36.5q-50 0 -50 -35z" />
+<glyph unicode="&#x20ac;" horiz-adv-x="500" d="M424 369h-245q-1 -13 -1 -78h237l-9 -40h-225q0 -35 6 -71t19 -71.5t37.5 -58t56.5 -22.5q54 0 90 28t68 80l20 -10q-36 -68 -81.5 -103t-113.5 -35q-50 0 -90 23t-64 61.5t-38 83.5t-18 95h-44l9 40h30q0 67 1 78h-40l10 40h37q14 107 76.5 185t159.5 78q76 0 149 -50 v-141h-21q-17 69 -50.5 115t-71.5 46q-42 0 -74 -43t-45.5 -93t-16.5 -97h251z" />
+<glyph unicode="&#x20d0;" horiz-adv-x="0" d="M14 637h-484l169 209l19 -16q-50 -71 -50 -88q0 -27 39 -27h307v-78z" />
+<glyph unicode="&#x20d1;" horiz-adv-x="0" d="M14 637h-484v78h307q39 0 39 27q0 17 -50 88l19 16z" />
+<glyph unicode="&#x20d2;" horiz-adv-x="0" d="M-223 -156h-75v818h75v-818z" />
+<glyph unicode="&#x20d6;" horiz-adv-x="0" d="M-16 637h-310q-22 0 -30 -3.5t-8 -15.5q0 -20 51 -93l-18 -17l-169 169l169 169l19 -16q-53 -75 -53 -88q0 -27 39 -27h310v-78z" />
+<glyph unicode="&#x20d7;" horiz-adv-x="0" d="M14 677l-169 -169l-18 17q51 73 51 93q0 12 -8 15.5t-30 3.5h-310v78h310q39 0 39 27q0 13 -53 88l19 16z" />
+<glyph unicode="&#x20db;" horiz-adv-x="0" d="M37 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM-173 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM-383 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19 t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#x20dc;" horiz-adv-x="0" d="M-288 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM132 600q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM-78 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19 t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM-498 600q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#x20dd;" horiz-adv-x="0" d="M-249 760q138 0 254 -68t183.5 -184.5t67.5 -254.5t-67.5 -254.5t-183.5 -184.5t-254 -68t-254 68t-183 184.5t-67 254.5t67 254.5t183 184.5t254 68zM-249 672q-171 0 -293.5 -123.5t-122.5 -295.5q0 -171 122.5 -295t293.5 -124q83 0 160 33.5t133.5 90t90 134 t33.5 161.5q0 171 -123.5 295t-293.5 124z" />
+<glyph unicode="&#x20e1;" horiz-adv-x="0" d="M79 677l-169 -169l-18 17q51 73 51 93q0 12 -8 15.5t-30 3.5h-246q-22 0 -30 -3.5t-8 -15.5q0 -20 51 -93l-18 -17l-169 169l169 169l19 -16q-53 -75 -53 -88q0 -27 31 -27h254q39 0 39 27q0 13 -53 88l19 16z" />
+<glyph unicode="&#x20e4;" horiz-adv-x="0" d="M519 -169h-1517l750 1224zM-838 -81h1198l-608 964z" />
+<glyph unicode="&#x20e5;" horiz-adv-x="0" d="M12 -155h-84l-398 817h84z" />
+<glyph unicode="&#x20e6;" horiz-adv-x="0" d="M-315 -156h-75v818h75v-818zM-111 -156h-75v818h75v-818z" />
+<glyph unicode="&#x20e7;" horiz-adv-x="0" d="M200 -172h-88v844h-755v88h843v-932z" />
+<glyph unicode="&#x20e8;" horiz-adv-x="0" d="M37 -175q0 -26 -19 -44.5t-47 -18.5q-26 0 -44.5 19t-18.5 46q0 26 19 45t45 19t45.5 -19.5t19.5 -46.5zM-173 -175q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5zM-383 -175q0 -26 -18.5 -44.5t-46.5 -18.5q-26 0 -45 19 t-19 46q0 26 19.5 45t45.5 19t45 -19.5t19 -46.5z" />
+<glyph unicode="&#x20e9;" horiz-adv-x="0" d="M54 544h-78v95h-408v-95h-78v173h564v-173z" />
+<glyph unicode="&#x20ea;" horiz-adv-x="0" d="M148 209h-593q-48 0 -48 -12q0 -4 4.5 -12t8.5 -13l11 -13l6 -7q25 -29 52 -67l-25 -20q-57 65 -114 106t-138 77v11q150 63 252 182l24 -22q-29 -42 -51 -68l-7 -7l-10 -12q-5 -5 -9 -11.5t-4 -10.5q0 -13 48 -13h593v-88z" />
+<glyph unicode="&#x20eb;" horiz-adv-x="0" d="M208 775l-418 -1010h-79l418 1010h79zM-8 775l-418 -1010h-79l418 1010h79z" />
+<glyph unicode="&#x20ec;" horiz-adv-x="0" d="M14 -166l-169 -209l-19 16q50 71 50 88q0 27 -39 27h-307v78h484z" />
+<glyph unicode="&#x20ed;" horiz-adv-x="0" d="M14 -244h-307q-39 0 -39 -27q0 -17 50 -88l-19 -16l-169 209h484v-78z" />
+<glyph unicode="&#x20ee;" horiz-adv-x="0" d="M-6 -244h-310q-22 0 -30 -3.5t-8 -15.5q0 -20 51 -93l-18 -17l-169 169l169 169l19 -16q-53 -75 -53 -88q0 -27 39 -27h310v-78z" />
+<glyph unicode="&#x20ef;" horiz-adv-x="0" d="M14 -204l-169 -169l-18 17q51 73 51 93q0 12 -8 15.5t-30 3.5h-310v78h310q39 0 39 27q0 13 -53 88l19 16z" />
+<glyph unicode="&#x20f0;" horiz-adv-x="0" d="M-115 754q0 -25 -44 -35q-46 -11 -71 -27q31 -17 67 -26q36 -10 44 -22q3 -6 3 -14q0 -28 -27 -28q-17 0 -47 32q-28 30 -48 43q0 -21 9.5 -51t9.5 -48q0 -12 -7.5 -23.5t-21.5 -11.5t-21.5 11.5t-7.5 23.5q0 18 9 48t9 50q-24 -17 -44 -39q-32 -34 -54 -34q-27 0 -27 27 q0 12 9 20t18 11t26 7q26 6 60 24q-21 13 -59 23q-4 1 -14.5 4t-15.5 5t-12 6t-10 10.5t-3 15.5q0 12 7.5 20t17.5 8q25 0 52 -33q17 -22 49 -41q0 21 -9 53.5t-9 49.5q0 11 7 21.5t22 10.5q29 0 29 -32q0 -17 -9.5 -49.5t-9.5 -53.5q32 18 55 47q20 27 43 27 q10 0 17.5 -8.5t7.5 -21.5z" />
+<glyph unicode="&#x2102;" horiz-adv-x="727" d="M626 171l46 -48q-68 -75 -132 -108.5t-157 -33.5q-145 0 -241.5 103.5t-96.5 249.5q0 150 95 253.5t244 103.5q89 0 167.5 -37.5t115.5 -109.5l-46 -47q-46 47 -70 68t-67 38.5t-96 17.5q-82 0 -123 -36v-500q40 -34 122 -34q34 0 60.5 5.5t51 19t39 24t43.5 35t45 36.5z M195 128v414q-80 -79 -80 -208q0 -125 80 -206z" />
+<glyph unicode="&#x2105;" horiz-adv-x="873" d="M835 175q0 -81 -49.5 -134t-124.5 -53q-74 0 -123.5 52.5t-49.5 134.5q0 83 49.5 135.5t126.5 52.5q73 0 122 -53.5t49 -134.5zM722 166q0 99 -13 136t-47 37q-36 0 -48.5 -36.5t-12.5 -136.5q0 -84 13.5 -119t47.5 -35q33 0 46.5 34.5t13.5 119.5zM687 688l-439 -700 h-58l441 700h56zM336 402l14 -14q-59 -80 -147 -80q-73 0 -119 49.5t-46 131.5q0 85 52 139t130 54q51 0 85 -24t34 -60q0 -23 -14 -36t-38 -13q-44 0 -44 56q0 21 -1 30t-8.5 16t-22.5 7q-29 0 -47 -34t-18 -95q0 -79 29 -124.5t79 -45.5q46 0 82 43z" />
+<glyph unicode="&#x2107;" horiz-adv-x="699" d="M470 372v-35q-80 0 -108.5 -5t-63.5 -26q-61 -38 -61 -122q0 -74 37 -114.5t127 -40.5q88 0 133 60q9 13 21.5 33.5t18.5 28.5t17.5 15t27.5 7q20 0 31.5 -12t11.5 -33q0 -37 -41.5 -68.5t-103.5 -54.5q-65 -24 -146 -24q-118 0 -194 41q-112 58 -112 171 q0 78 60.5 121.5t139.5 47.5v1q-76 8 -119 48q-47 44 -47 100q0 78 72 129t206 51q46 0 101 -15q6 -2 48 -18t53 -16q15 0 24 10t20 36h27v-235h-25q-11 32 -31.5 65.5t-49.5 66t-69.5 53t-83.5 20.5q-127 0 -127 -155q0 -85 50 -111q30 -14 53.5 -17t102.5 -3z" />
+<glyph unicode="&#x210c;" horiz-adv-x="843" d="M619 701l21 -15q-15 -70 -79 -124.5t-135 -54.5q-79 0 -129 71q-19 -23 -19 -56q0 -52 72 -144q86 51 173 118q128 -30 200 -100t72 -170q0 -33 -10 -67t-23 -61t-40 -60t-46 -53.5t-56 -52.5l-56 -48l-60.5 -46.5t-54.5 -42.5h-26q-55 46 -97 46q-79 0 -129 -46l-21 17 q92 160 202 160q44 0 78 -24.5t44 -54.5q123 91 123 291q0 87 -39.5 149t-105.5 62q-35 0 -104 -48q46 -40 60.5 -65.5t14.5 -51.5q0 -16 -11 -34.5t-24 -33t-48 -50.5l-127 -137q-87 52 -125 70q-36 -35 -50 -53l-22 14l124 196q2 -2 18 -12l32 -22l35 -24 q18 -12 31.5 -19.5t17.5 -7.5q12 0 12 45q0 25 -29 58.5t-63.5 63.5t-63 71.5t-28.5 79.5q0 27 17 56t50 59.5t61 52.5l70 53l58 43q37 -36 59 -48.5t46 -12.5q71 0 130 63z" />
+<glyph unicode="&#x210d;" horiz-adv-x="768" d="M693 0h-220v304h-178v-304h-220v676h220v-302h178v302h220v-676zM623 70v536h-80v-536h80zM225 70v536h-80v-536h80z" />
+<glyph unicode="&#x210e;" horiz-adv-x="576" d="M523 105l20 -11q-61 -104 -153 -104q-23 0 -46 12.5t-23 33.5q0 15 7 46l54 223q3 15 3 42q0 37 -29 37q-40 0 -93 -92.5t-73 -182.5l-25 -109h-115l138 599q2 8 2 15q0 9 -2 12t-9 3t-44 -10l-5 28l188 38l-81 -354l2 -1q27 50 78.5 89.5t101.5 39.5q89 0 89 -83 q0 -28 -7 -56l-50 -213q-2 -8 -2 -21q0 -28 20 -28q18 0 54 47z" />
+<glyph unicode="&#x210f;" horiz-adv-x="576" d="M523 105l20 -11q-61 -104 -153 -104q-23 0 -46 12.5t-23 33.5q0 15 7 46l54 223q3 15 3 42q0 37 -29 37q-40 0 -93 -92.5t-73 -182.5l-25 -109h-115l108 471l-77 -15l12 49l77 15l18 79q2 8 2 15q0 9 -2 12t-9 3t-44 -10l-5 28l188 38l-33 -143l196 39l-12 -49l-195 -39 l-37 -162l2 -1q27 50 78.5 89.5t101.5 39.5q89 0 89 -83q0 -28 -7 -56l-50 -213q-2 -8 -2 -21q0 -28 20 -28q18 0 54 47z" />
+<glyph unicode="&#x2111;" horiz-adv-x="790" d="M710 694l25 -8l-11 -44q-5 -16 -19.5 -45.5t-31.5 -47t-47 -31.5t-68 -14q-62 0 -129 31t-117 31q-48 0 -78.5 -25.5t-30.5 -67.5q0 -35 24 -59t61 -24q27 0 50 10l12 -22q-34 -27 -91 -27q-69 0 -121.5 43t-52.5 110q0 81 61 139t161 58q54 0 97 -11t66 -24t55.5 -24 t66.5 -11q38 0 71 15t47 48zM721 388l-23 -12q-19 35 -51 35q-22 0 -36 -14t-14 -41q0 -32 23 -63l46 -65q23 -34 23 -74q0 -82 -70 -130.5t-176 -48.5q-59 0 -101.5 14t-65 33.5t-39 39t-35.5 33.5t-43 14q-37 0 -85 -42l-20 14q8 24 20 47.5t32 52t50.5 46t65.5 17.5 q31 0 55 -9.5t38 -20.5t27 -34.5t18 -36.5l13 -41q30 -94 78 -94q33 0 53.5 27.5t20.5 64.5q0 53 -43.5 119.5t-43.5 115.5q0 58 49.5 94t111.5 36q43 0 76.5 -20t45.5 -57z" />
+<glyph unicode="&#x2113;" horiz-adv-x="500" d="M43 429l26 38q28 -19 69 -35t59 -18q195 285 325 285q47 0 78.5 -21.5t31.5 -63.5q0 -56 -34.5 -107t-93.5 -87q-90 -56 -208 -65l-58 -100q-21 -36 -46 -94.5t-25 -91.5t25 -33q29 0 79.5 38t114.5 124l36 -27q-70 -99 -128.5 -142t-121.5 -43q-52 0 -82 31t-30 90 q0 97 103 255q-26 6 -64 27.5t-56 39.5zM333 421l1 -1q83 19 145.5 72t62.5 129q0 28 -25 28q-62 0 -184 -228z" />
+<glyph unicode="&#x2115;" horiz-adv-x="738" d="M663 0h-181l-335 452h-2v-452h-70v676h178l338 -459h2v459h70v-676zM593 70v30l-374 506h-74v-35l371 -501h77z" />
+<glyph unicode="&#x2116;" horiz-adv-x="1093" d="M1042 309q0 -69 -46 -116.5t-114 -47.5q-66 0 -111 47t-45 115q0 69 42.5 117.5t113.5 48.5t115.5 -44.5t44.5 -119.5zM919 295q0 100 -8 123q-9 26 -28 26q-22 0 -28 -26.5t-6 -109.5q0 -96 7 -114q8 -20 26 -20q21 0 29 25t8 96zM1033 -6h-295v90h295v-90zM585 302v111 q0 45 2.5 79.5t11 74t23.5 65t42.5 42.5t64.5 17q110 0 110 -87q0 -35 -23.5 -56.5t-52.5 -21.5q-55 0 -72 58q-5 18 -10 18q-18 0 -29 -14t-16 -43.5t-6 -54t-1 -64.5v-444h-28l-337 545v-257q0 -47 -2 -81.5t-10.5 -76t-23 -68t-42.5 -44.5t-66 -18q-110 0 -110 89 q0 35 23.5 55.5t52.5 20.5q55 0 72 -58q5 -18 10 -18q18 0 29.5 19.5t16 60.5t5.5 69t1 78v280q-33 46 -51 57t-55 16v25h243z" />
+<glyph unicode="&#x2117;" horiz-adv-x="747" d="M231 521h166q146 0 146 -101q0 -71 -68 -97q-32 -12 -117 -13v-102q0 -28 8 -36t41 -12v-18h-176v18q18 2 25 5q22 8 22 52v235q0 33 -8.5 43t-38.5 12v14zM358 479v-147q54 0 77 18t23 64q0 45 -18 65t-54 20q-28 0 -28 -20zM721 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251.5t252.5 101.5q143 0 242 -103.5t99 -252.5zM650 338q0 126 -81.5 213.5t-198.5 87.5q-112 0 -192.5 -89.5t-80.5 -214.5q0 -126 80.5 -214t196.5 -88q115 0 195.5 88.5t80.5 216.5z" />
+<glyph unicode="&#x2118;" horiz-adv-x="850" d="M475 448h-24q-3 24 -30.5 34.5t-53.5 10.5q-32 0 -66 -14t-66.5 -41.5t-53.5 -75.5t-21 -108q0 -86 42 -109q209 276 449 276q81 0 126 -32.5t45 -114.5q0 -109 -75 -196.5t-186 -87.5q-75 0 -110 33.5t-35 87.5q0 30 23 55t57 25q32 0 49.5 -18t17.5 -39 q0 -19 -10 -31.5t-20 -20.5t-10 -17q0 -35 43 -35q47 0 91 88t44 179q0 35 -14 59.5t-43 24.5q-88 0 -177 -81.5t-169 -201.5q40 -18 77 -56t37 -75q0 -81 -55.5 -133.5t-138.5 -52.5q-52 0 -83.5 30t-31.5 73q0 99 68 212q-65 29 -90.5 69t-25.5 95q0 102 88.5 191.5 t212.5 89.5q48 0 83.5 -24.5t35.5 -68.5zM302 -34q0 19 -11.5 43t-24.5 37q-58 -113 -58 -177q0 -48 16 -48q29 0 53.5 47t24.5 98z" />
+<glyph unicode="&#x2119;" horiz-adv-x="700" d="M75 676h349q109 0 177.5 -53t68.5 -159q0 -107 -67.5 -158.5t-178.5 -51.5h-129v-254h-220v676zM520 594v-259q42 18 61 47.5t19 76.5q0 101 -80 135zM450 328v273q-17 5 -56 5h-99v-282h85q13 0 38 2t32 2zM225 70v536h-80v-536h80z" />
+<glyph unicode="&#x211a;" horiz-adv-x="797" d="M727 27l20 -62q-50 -25 -76 -28q-9 -1 -20 -1q-67 0 -135 66q-58 -21 -123 -21q-146 0 -247 104t-101 250q0 150 99.5 253t249.5 103q146 0 247 -105.5t101 -251.5q0 -90 -40.5 -169t-114.5 -128q33 -31 63 -31q12 0 24.5 3t29.5 9.5t23 8.5zM592 538v-403q80 76 80 199 q0 118 -80 204zM522 105v485q-64 31 -132 31q-65 0 -125 -31v-485q61 63 129 63q40 0 68 -15.5t60 -47.5zM195 135v403q-80 -80 -80 -203q0 -115 80 -200zM463 60q-25 38 -69 38q-43 0 -73 -37q36 -10 76 -10q28 0 66 9z" />
+<glyph unicode="&#x211c;" horiz-adv-x="884" d="M821 117l20 -17q-20 -29 -65.5 -64.5t-90.5 -49.5h-24q-60 27 -79 66t-26 123q-13 153 -44 153l-52 -13q-50 -113 -88 -172.5t-125 -167.5q-25 14 -68 36l-49 25q-1 -1 -9 -8l-19 -18q-11 -10 -23 -25l-21 12l112 196q118 -72 126 -72q21 0 21 316q0 82 -18.5 155.5 t-58.5 73.5q-20 0 -34 -13.5t-14 -40.5q0 -42 37 -99t37 -101q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q22 8 39 29.5t17 51.5q0 34 -11.5 60.5t-25.5 41t-25.5 39t-11.5 55.5q0 61 51 107q52 46 149 46q118 0 181 -73l102 75q110 0 172.5 -44.5t62.5 -111.5 q0 -52 -31.5 -104t-101.5 -77v-2q64 -42 77 -162q15 -126 42 -126q29 0 67 43zM596 510q0 51 -20 86t-56 35q-30 0 -67 -39q29 -60 29 -136q0 -71 -8 -100q59 8 90.5 51.5t31.5 102.5z" />
+<glyph unicode="&#x211d;" horiz-adv-x="783" d="M758 0h-254l-166 271h-43v-271h-220v676h356q109 0 177.5 -48.5t68.5 -152.5q0 -125 -103 -176zM527 594v-242q80 31 80 121q0 43 -20.5 77t-59.5 44zM457 347v253q-19 6 -56 6h-106v-265h107q39 0 55 6zM634 70l-128 207l-88 -6l123 -201h93zM225 70v536h-80v-536h80z " />
+<glyph unicode="&#x211e;" horiz-adv-x="722" d="M726 0h-195l-27 37l-142 -138l-34 31l148 146l-172 237h-28v-196q0 -53 12.5 -69t55.5 -23v-25h-318v25q59 7 73.5 22t14.5 73v431q0 59 -16.5 77.5t-71.5 22.5v25h308q296 0 296 -172q0 -76 -45 -118q-42 -38 -112 -57l113 -146l95 94l33 -34l-99 -97l77 -99 q18 -22 34 -22v-25zM276 597v-252q103 1 143 31t40 118q0 79 -30 113.5t-100 34.5q-29 0 -41 -10t-12 -35z" />
+<glyph unicode="&#x2122;" horiz-adv-x="1000" d="M977 676v-23q-33 -2 -43.5 -11.5t-10.5 -36.5v-262q0 -32 7 -38.5t44 -9.5v-23h-194v23q37 3 43.5 9t6.5 39v226l-149 -298h-13l-142 296v-203q0 -41 9 -53.5t43 -15.5v-23h-133v23q33 3 42.5 15.5t9.5 53.5v237q-23 50 -70 52v23h139l142 -289l151 289h118zM386 588h-23 q-9 34 -24.5 49t-41.5 15h-46v-309q0 -32 7 -38.5t44 -9.5v-23h-194v23q37 3 43.5 9.5t6.5 38.5v309h-46q-26 0 -41 -14.5t-24 -49.5h-23v88h362v-88z" />
+<glyph unicode="&#x2124;" horiz-adv-x="777" d="M727 0h-675v70l407 551h-359v70h627v-70l-405 -551h405v-70zM642 621h-96l-408 -551h96z" />
+<glyph unicode="&#x2125;" horiz-adv-x="448" d="M255 254v-2q169 -40 169 -209q0 -118 -89 -191q-71 -57 -174 -57q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -37.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q50 0 87.5 62t37.5 139q0 27 -0.5 41t-2.5 38.5t-6 38.5t-12.5 31.5t-20 26.5t-30 15.5 t-42.5 6.5h-75v25l142 178h-163v25l163 190q-54 0 -77.5 -1.5t-42.5 -13.5t-25 -28.5t-17 -56.5h-25l7 132h364v-26l-164 -189h165v-26z" />
+<glyph unicode="&#x2126;" horiz-adv-x="758" d="M262 94l-2 29q-97 17 -161 91t-64 172q0 124 99 215t245 91q145 0 244.5 -91.5t99.5 -217.5q0 -94 -65 -164.5t-160 -95.5l-2 -29h138q33 0 44.5 17t11.5 60h25v-171h-302l7 155q64 15 100 81t36 153q0 66 -19 126t-60.5 102t-97.5 42q-55 0 -96.5 -42t-61 -101.5 t-19.5 -124.5q0 -88 36 -154.5t100 -81.5l7 -155h-302v171h25q0 -44 10 -60.5t41 -16.5h143z" />
+<glyph unicode="&#x2127;" horiz-adv-x="758" d="M496 580l2 -29q95 -25 160 -95.5t65 -164.5q0 -126 -99.5 -217.5t-244.5 -91.5q-146 0 -245 91t-99 215q0 98 64 172t161 91l2 29h-143q-31 0 -41 -16.5t-10 -60.5h-25v171h302l-7 -155q-64 -15 -100 -81.5t-36 -154.5q0 -65 19.5 -124.5t61 -101.5t96.5 -42 q56 0 97.5 42t60.5 102t19 126q0 87 -36 153t-100 81l-7 155h302v-171h-25q0 43 -11.5 60t-44.5 17h-138z" />
+<glyph unicode="&#x2128;" horiz-adv-x="755" d="M516 280v-2q89 -19 138 -77t49 -146q0 -104 -79 -177t-208 -73q-54 0 -93.5 14t-59.5 33.5t-36 39t-34.5 33.5t-43.5 14q-36 0 -84 -42l-21 14q4 17 17 41.5t34 53.5t54.5 48.5t70.5 19.5q109 0 130 -119q8 -49 31 -83t58 -34q92 0 92 203q0 88 -42.5 144t-98.5 56 q-50 0 -83 -14t-70 -60l-21 14q23 37 48 60.5t66 37.5v2q-67 26 -97 87l22 15q51 -65 138 -65q52 0 86.5 42.5t34.5 119.5t-36 119t-96 42q-125 0 -212 -139l-24 10q31 80 102.5 134.5t179.5 54.5q118 0 186 -60q65 -59 65 -157q0 -67 -42.5 -121.5t-120.5 -82.5z" />
+<glyph unicode="&#x2129;" horiz-adv-x="312" d="M244 0h-139v349q0 56 -24 56q-23 0 -49 -45l-23 12q19 45 57.5 74t85.5 29q42 0 67 -24.5t25 -66.5v-384z" />
+<glyph unicode="&#x212b;" horiz-adv-x="722" d="M448 815q0 -44 -31 -76t-75 -32q-45 0 -76 30.5t-31 75.5q0 44 32 75.5t76 31.5q43 0 74 -31t31 -74zM400 812q0 25 -18 42.5t-43 17.5q-22 0 -39 -17.5t-17 -40.5q0 -24 17 -41.5t40 -17.5q25 0 42.5 16.5t17.5 40.5zM689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5 q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#x212d;" horiz-adv-x="773" d="M710 701l21 -14q-68 -139 -155 -139q-33 0 -66.5 9.5t-51.5 23.5q-12 -20 -12 -52q0 -26 16 -47t38 -36l44 -30q23 -16 39 -38t16 -50q0 -55 -51 -96.5t-118 -41.5q-40 0 -77 22l12 23q14 -10 33 -10q23 0 34.5 17.5t11.5 40.5t-9.5 40.5t-23.5 30.5l-28 26 q-14 13 -23.5 35.5t-9.5 53.5q0 44 55.5 109.5t121.5 120.5q46 -37 83 -37q61 0 100 39zM678 222l22 -12q-16 -43 -40 -81.5t-58.5 -73t-82 -54.5t-102.5 -20q-165 0 -264 109t-99 275q0 68 34 146t94 127q28 23 69.5 38.5t82.5 15.5q53 0 83 -22l-12 -23q-22 8 -38 8 q-43 0 -75 -41t-46.5 -96.5t-14.5 -113.5q0 -120 58 -199t166 -79q139 0 223 96z" />
+<glyph unicode="&#x2132;" horiz-adv-x="616" d="M546 0h-489l-9 85h368v186h-302v85h302v320h130v-676z" />
+<glyph unicode="&#x2135;" horiz-adv-x="766" d="M524 317l117 -125q26 -28 37.5 -49t11.5 -52q0 -68 -67 -125h-25q3 8 3 26q0 25 -92 117l-305 287q-18 -29 -18 -52q0 -24 16.5 -47.5t39.5 -44.5l47 -42q23 -22 39.5 -49.5t16.5 -57.5q0 -41 -34 -72t-96 -31h-137v25q92 4 92 46q0 15 -9.5 29.5t-23.5 29t-28 31 t-23.5 42t-9.5 56.5q0 92 101 160l-63 68q-32 35 -32 82q0 74 64 125h25q-4 -7 -4 -23q0 -25 90 -109l232 -220l34 114q-90 54 -90 124q0 61 63 114h25q-3 -15 -3 -31q0 -32 27 -54l43 -32q28 -20 41 -30.5t28.5 -26t22 -30.5t6.5 -33q0 -21 -11 -51.5t-32 -54.5h-25 q3 9 3 25q0 23 -65 63z" />
+<glyph unicode="&#x2136;" horiz-adv-x="703" d="M637 196l22 -15q-38 -97 -82 -139t-109 -42h-278q-74 0 -109 -34l-21 15q38 97 81.5 139t109.5 42h213q16 78 16 131q0 107 -24.5 143.5t-74.5 36.5q-27 0 -83.5 -12t-87.5 -12q-60 0 -91.5 35.5t-31.5 89.5q0 33 15.5 67t40.5 53h25q-1 -5 -1 -18q0 -25 12.5 -45 t36.5 -20q26 0 83 11t90 11q98 0 145 -58.5t47 -151.5q0 -66 -22 -136.5t-60 -124.5q56 0 86 6t52 28z" />
+<glyph unicode="&#x2137;" horiz-adv-x="562" d="M169 694h26q-3 -15 -3 -22q0 -30 23.5 -40.5t69.5 -10.5q106 0 106 -108q0 -23 -18.5 -79t-18.5 -112q0 -32 40 -74q4 -5 25 -26t29 -30.5t21 -28.5t18.5 -37t5.5 -37q0 -66 -67 -123h-25q3 9 3 18q0 21 -20 44l-43 54q-24 31 -32 68h-2q-63 -150 -151 -150h-85 q0 52 37.5 107t90.5 55q60 0 102 118q10 49 10 124q0 32 -19.5 55t-49.5 23q-55 0 -89 20q-46 26 -46 78q0 62 62 114z" />
+<glyph unicode="&#x2138;" horiz-adv-x="599" d="M95 694h26q-1 -6 -1 -18q0 -24 17 -44.5t43 -20.5t87.5 11t94.5 11q92 0 144.5 -46t52.5 -121q0 -45 -11 -74h-25q-30 64 -118 77q-23 -28 -23 -80q0 -33 30.5 -85.5t32.5 -57.5q29 -70 29 -116q0 -51 -36 -98.5t-102 -65.5l-21 15q26 37 26 81q0 43 -26 119.5t-26 106.5 q0 57 18.5 97t55.5 87v1q-27 0 -89 -12t-101 -12q-61 0 -97 36t-36 90q0 31 15.5 65.5t39.5 53.5z" />
+<glyph unicode="&#x213c;" horiz-adv-x="804" d="M714 135l45 -47q-67 -71 -89 -82q-32 -17 -97 -17q-71 0 -121.5 41t-50.5 111v250h-58v-391h-200v391h-88v70h667v-70h-121v-271q0 -45 7 -61q19 3 32 9.5t18 11.5l22 23q22 22 34 32zM471 391v-238q0 -33 16 -58.5t47 -30.5q-3 54 -3 55v272h-60zM273 70v321h-60v-321 h60z" />
+<glyph unicode="&#x213d;" horiz-adv-x="646" d="M572 479l52 -43q-89 -75 -212 -205q77 -129 77 -240q0 -76 -43 -135t-116 -59q-67 0 -103.5 40.5t-36.5 107.5q0 79 56 175q-27 40 -64 78t-85.5 81.5t-73.5 69.5l161 137l22 -20q19 -19 23 -22.5t21 -19.5t22.5 -22t20 -20.5t21.5 -23.5l20 -21q11 -13 20 -25l18 -23 q76 82 200 190zM179 392l-53 -47l11 -11q7 -6 32 -30l35 -34l30 -30q19 -19 33 -36t27 -35q85 -122 85 -296q40 40 40 129q0 54 -19 107t-55.5 102.5t-69 85t-79.5 79.5zM309 -94q0 76 -23 136q-26 -54 -26 -102q0 -25 12 -47t35 -26q2 13 2 39z" />
+<glyph unicode="&#x213e;" horiz-adv-x="497" d="M643 606h-348v-606h-220v676h568v-70zM225 70v536h-80v-536h80z" />
+<glyph unicode="&#x213f;" horiz-adv-x="768" d="M693 0h-220v606h-178v-606h-220v676h618v-676zM623 70v536h-80v-536h80zM225 70v536h-80v-536h80z" />
+<glyph unicode="&#x2140;" horiz-adv-x="976" d="M952 -269h-902v95l290 445l-304 406v96h800v-95h-414l307 -404l-301 -448h524v-95zM615 270l-313 408h-154l306 -409l-297 -443h161z" />
+<glyph unicode="&#x2145;" horiz-adv-x="748" d="M75 676h289q150 0 244.5 -93.5t94.5 -243.5q0 -146 -96 -242.5t-242 -96.5h-290v676zM553 543v-409q80 71 80 205q0 139 -80 204zM483 97v480q-33 29 -111 29h-77v-536h79q74 0 109 27zM225 70v536h-80v-536h80z" />
+<glyph unicode="&#x2146;" horiz-adv-x="643" d="M583 0h-198v36q-48 -50 -125 -50q-99 0 -154.5 71.5t-55.5 173.5q0 99 58.5 170.5t155.5 71.5q76 0 119 -42v245h200v-676zM513 70v536h-60v-536h60zM383 180v116q0 41 -31 74t-72 33q-29 0 -29 -5v-335q19 -7 35 -7q41 0 69 41t28 83zM181 76v297q-30 -19 -45.5 -60 t-15.5 -82q0 -46 14.5 -90t46.5 -65z" />
+<glyph unicode="&#x2147;" horiz-adv-x="573" d="M523 193h-272v-126q18 -11 48 -11q28 0 47.5 2.5t38.5 13t27 16t31.5 26.5t33.5 29l42 -52q-88 -105 -216 -105q-111 0 -182 66.5t-71 176.5t71.5 177t182.5 67q88 0 153.5 -55t65.5 -142v-83zM453 263v23q0 29 -17 56.5t-43 40.5v-120h60zM323 263v135q-6 5 -35 5 t-37 -7v-133h72zM181 86v289q-61 -39 -61 -145q0 -105 61 -144z" />
+<glyph unicode="&#x2148;" horiz-adv-x="330" d="M265 507h-200v184h200v-184zM195 577v44h-60v-44h60zM265 0h-200v461h200v-461zM195 70v321h-60v-321h60z" />
+<glyph unicode="&#x2149;" horiz-adv-x="371" d="M311 507h-200v184h200v-184zM241 577v44h-60v-44h60zM311 461v-467q0 -95 -66.5 -147t-164.5 -52q-48 0 -100 18l21 69q33 -17 73 -17q28 0 37 4v592h200zM241 -5v396h-60v-510q60 21 60 114z" />
+<glyph unicode="&#x214b;" horiz-adv-x="833" d="M61 561l15 25q31 52 57 73q39 31 93 31q40 0 72.5 -19t76.5 -69q115 87 222 87q86 0 138.5 -48t52.5 -134q0 -69 -45.5 -123t-150.5 -98q32 -50 42 -79.5t10 -64.5q0 -76 -53 -117.5t-149 -41.5q-72 0 -116 33.5t-44 87.5q0 48 36 83t116 64l-151 214q-45 -54 -60.5 -84 t-15.5 -61q0 -22 10.5 -29t53.5 -12v-24h-204v24q33 3 47 10.5t26 29.5q34 62 55 93t65 86q-42 54 -66 72.5t-53 18.5q-35 0 -60 -40zM649 410q0 87 -72 161q-39 42 -89 42q-36 0 -90 -39q5 -8 30 -42l44 -60l48 -71q30 -44 55 -85q41 24 57.5 45t16.5 49zM527 72 q0 64 -74 150q-38 -13 -54 -31.5t-16 -49.5q0 -50 27.5 -87.5t64.5 -37.5q24 0 38 15t14 41z" />
+<glyph unicode="&#x2153;" d="M238 275h-243v20q48 0 62.5 11.5t14.5 48.5v221q0 41 -23 41q-17 0 -43 -10l-13 -5v21l164 65h11v-337q0 -35 13 -45t57 -11v-20zM573 688h56l-439 -700h-58zM502 315l-20 7q52 91 149 91q50 0 78 -21.5t28 -59.5q0 -26 -11 -42.5t-39 -31.5v-4q76 -30 76 -105 q0 -65 -56.5 -110.5t-137.5 -45.5q-46 0 -73 14.5t-27 39.5q0 16 10.5 28.5t29.5 12.5q20 0 31 -6t36 -27q30 -26 49 -26q28 0 45.5 18t17.5 47q0 44 -29 71t-101 50v10q46 14 65 31.5t19 47.5q0 28 -17.5 44.5t-47.5 16.5q-23 0 -39.5 -11t-35.5 -39z" />
+<glyph unicode="&#x2154;" d="M613 688h56l-439 -700h-58zM502 315l-20 7q52 91 149 91q50 0 78 -21.5t28 -59.5q0 -26 -11 -42.5t-39 -31.5v-4q76 -30 76 -105q0 -65 -56.5 -110.5t-137.5 -45.5q-46 0 -73 14.5t-27 39.5q0 16 10.5 28.5t29.5 12.5q20 0 31 -6t36 -27q30 -26 49 -26q28 0 45.5 18 t17.5 47q0 44 -29 71t-101 50v10q46 14 65 31.5t19 47.5q0 28 -17.5 44.5t-47.5 16.5q-23 0 -39.5 -11t-35.5 -39zM328 402l-30 -127h-270v14q112 111 148 161t36 94q0 32 -22 54t-53 22q-47 0 -76 -54h-24q49 122 144 122q52 0 85.5 -31t33.5 -80q0 -33 -16.5 -62.5 t-57.5 -67.5l-93 -87v-5h86q50 0 64.5 7.5t28.5 39.5h16z" />
+<glyph unicode="&#x2155;" d="M238 275h-243v20q48 0 62.5 11.5t14.5 48.5v221q0 41 -23 41q-17 0 -43 -10l-13 -5v21l164 65h11v-337q0 -35 13 -45t57 -11v-20zM573 688h56l-439 -700h-58zM548 320l-12 -35q69 -4 101 -12q57 -14 89.5 -48.5t32.5 -82.5q0 -67 -55.5 -108t-143.5 -41q-46 0 -75 17 t-29 42q0 18 12 30.5t31 12.5q30 0 71 -29q33 -23 63 -23t50.5 15t20.5 39q0 26 -26.5 48t-73.5 34q-32 8 -130 12l72 215h229l-34 -86h-193z" />
+<glyph unicode="&#x2156;" d="M613 688h56l-439 -700h-58zM328 402l-30 -127h-270v14q112 111 148 161t36 94q0 32 -22 54t-53 22q-47 0 -76 -54h-24q49 122 144 122q52 0 85.5 -31t33.5 -80q0 -33 -16.5 -62.5t-57.5 -67.5l-93 -87v-5h86q50 0 64.5 7.5t28.5 39.5h16zM548 320l-12 -35q69 -4 101 -12 q57 -14 89.5 -48.5t32.5 -82.5q0 -67 -55.5 -108t-143.5 -41q-46 0 -75 17t-29 42q0 18 12 30.5t31 12.5q30 0 71 -29q33 -23 63 -23t50.5 15t20.5 39q0 26 -26.5 48t-73.5 34q-32 8 -130 12l72 215h229l-34 -86h-193z" />
+<glyph unicode="&#x2157;" d="M613 688h56l-439 -700h-58zM548 320l-12 -35q69 -4 101 -12q57 -14 89.5 -48.5t32.5 -82.5q0 -67 -55.5 -108t-143.5 -41q-46 0 -75 17t-29 42q0 18 12 30.5t31 12.5q30 0 71 -29q33 -23 63 -23t50.5 15t20.5 39q0 26 -26.5 48t-73.5 34q-32 8 -130 12l72 215h229 l-34 -86h-193zM56 590l-20 7q52 91 149 91q50 0 78 -21.5t28 -59.5q0 -26 -11 -42.5t-39 -31.5v-4q76 -30 76 -105q0 -65 -56.5 -110.5t-137.5 -45.5q-46 0 -73 14.5t-27 39.5q0 16 10.5 28.5t29.5 12.5q20 0 31 -6t36 -27q30 -26 49 -26q28 0 45.5 18t17.5 47q0 44 -29 71 t-101 50v10q46 14 65 31.5t19 47.5q0 28 -17.5 44.5t-47.5 16.5q-23 0 -39.5 -11t-35.5 -39z" />
+<glyph unicode="&#x2158;" d="M613 688h56l-439 -700h-58zM548 320l-12 -35q69 -4 101 -12q57 -14 89.5 -48.5t32.5 -82.5q0 -67 -55.5 -108t-143.5 -41q-46 0 -75 17t-29 42q0 18 12 30.5t31 12.5q30 0 71 -29q33 -23 63 -23t50.5 15t20.5 39q0 26 -26.5 48t-73.5 34q-32 8 -130 12l72 215h229 l-34 -86h-193zM277 428h41v-66h-41v-87h-93v87h-162v67q66 97 164 213l39 46h52v-260zM184 428v175l-137 -175h137z" />
+<glyph unicode="&#x2159;" d="M238 275h-243v20q48 0 62.5 11.5t14.5 48.5v221q0 41 -23 41q-17 0 -43 -10l-13 -5v21l164 65h11v-337q0 -35 13 -45t57 -11v-20zM573 688h56l-439 -700h-58zM754 416v-28q-144 -26 -184 -137q24 9 56 9q61 0 96.5 -33t35.5 -89q0 -65 -42 -105t-109 -40q-74 0 -119 47.5 t-45 127.5q0 108 98 179q45 32 86.5 44.5t126.5 24.5zM588 221q-16 0 -26 -5q-9 -7 -9 -65q0 -82 20 -114q8 -14 35 -14q25 0 34 16.5t9 65.5q0 64 -14 90t-49 26z" />
+<glyph unicode="&#x215a;" d="M613 688h56l-439 -700h-58zM754 416v-28q-144 -26 -184 -137q24 9 56 9q61 0 96.5 -33t35.5 -89q0 -65 -42 -105t-109 -40q-74 0 -119 47.5t-45 127.5q0 108 98 179q45 32 86.5 44.5t126.5 24.5zM588 221q-16 0 -26 -5q-9 -7 -9 -65q0 -82 20 -114q8 -14 35 -14 q25 0 34 16.5t9 65.5q0 64 -14 90t-49 26zM141 602l-12 -35q69 -4 101 -12q57 -14 89.5 -48.5t32.5 -82.5q0 -67 -55.5 -108t-143.5 -41q-46 0 -75 17t-29 42q0 18 12 30.5t31 12.5q30 0 71 -29q33 -23 63 -23t50.5 15t20.5 39q0 26 -26.5 48t-73.5 34q-32 8 -130 12l72 215 h229l-34 -86h-193z" />
+<glyph unicode="&#x215b;" d="M238 275h-243v20q48 0 62.5 11.5t14.5 48.5v221q0 41 -23 41q-17 0 -43 -10l-13 -5v21l164 65h11v-337q0 -35 13 -45t57 -11v-20zM573 688h56l-439 -700h-58zM465 99q0 75 87 100q-43 23 -61.5 48t-18.5 58q0 50 42 79t114 29q64 0 100.5 -25.5t36.5 -65.5q0 -59 -81 -84 q50 -30 70.5 -57.5t20.5 -64.5q0 -55 -44 -89t-118 -34q-67 0 -107.5 28.5t-40.5 77.5zM614 26q29 0 46.5 14.5t17.5 40.5q0 29 -18.5 48t-75.5 51q-35 -41 -35 -78q0 -36 17 -56t48 -20zM621 383q-25 0 -42 -12t-17 -29q0 -44 92 -84q17 19 22.5 31t5.5 30q0 27 -16.5 45.5 t-44.5 18.5z" />
+<glyph unicode="&#x215c;" d="M573 688h56l-439 -700h-58zM465 99q0 75 87 100q-43 23 -61.5 48t-18.5 58q0 50 42 79t114 29q64 0 100.5 -25.5t36.5 -65.5q0 -59 -81 -84q50 -30 70.5 -57.5t20.5 -64.5q0 -55 -44 -89t-118 -34q-67 0 -107.5 28.5t-40.5 77.5zM614 26q29 0 46.5 14.5t17.5 40.5 q0 29 -18.5 48t-75.5 51q-35 -41 -35 -78q0 -36 17 -56t48 -20zM621 383q-25 0 -42 -12t-17 -29q0 -44 92 -84q17 19 22.5 31t5.5 30q0 27 -16.5 45.5t-44.5 18.5zM56 590l-20 7q52 91 149 91q50 0 78 -21.5t28 -59.5q0 -26 -11 -42.5t-39 -31.5v-4q76 -30 76 -105 q0 -65 -56.5 -110.5t-137.5 -45.5q-46 0 -73 14.5t-27 39.5q0 16 10.5 28.5t29.5 12.5q20 0 31 -6t36 -27q30 -26 49 -26q28 0 45.5 18t17.5 47q0 44 -29 71t-101 50v10q46 14 65 31.5t19 47.5q0 28 -17.5 44.5t-47.5 16.5q-23 0 -39.5 -11t-35.5 -39z" />
+<glyph unicode="&#x215d;" d="M591 688h56l-439 -700h-58zM465 99q0 75 87 100q-43 23 -61.5 48t-18.5 58q0 50 42 79t114 29q64 0 100.5 -25.5t36.5 -65.5q0 -59 -81 -84q50 -30 70.5 -57.5t20.5 -64.5q0 -55 -44 -89t-118 -34q-67 0 -107.5 28.5t-40.5 77.5zM614 26q29 0 46.5 14.5t17.5 40.5 q0 29 -18.5 48t-75.5 51q-35 -41 -35 -78q0 -36 17 -56t48 -20zM621 383q-25 0 -42 -12t-17 -29q0 -44 92 -84q17 19 22.5 31t5.5 30q0 27 -16.5 45.5t-44.5 18.5zM141 602l-12 -35q69 -4 101 -12q57 -14 89.5 -48.5t32.5 -82.5q0 -67 -55.5 -108t-143.5 -41q-46 0 -75 17 t-29 42q0 18 12 30.5t31 12.5q30 0 71 -29q33 -23 63 -23t50.5 15t20.5 39q0 26 -26.5 48t-73.5 34q-32 8 -130 12l72 215h229l-34 -86h-193z" />
+<glyph unicode="&#x215e;" d="M573 688h56l-439 -700h-58zM465 99q0 75 87 100q-43 23 -61.5 48t-18.5 58q0 50 42 79t114 29q64 0 100.5 -25.5t36.5 -65.5q0 -59 -81 -84q50 -30 70.5 -57.5t20.5 -64.5q0 -55 -44 -89t-118 -34q-67 0 -107.5 28.5t-40.5 77.5zM614 26q29 0 46.5 14.5t17.5 40.5 q0 29 -18.5 48t-75.5 51q-35 -41 -35 -78q0 -36 17 -56t48 -20zM621 383q-25 0 -42 -12t-17 -29q0 -44 92 -84q17 19 22.5 31t5.5 30q0 27 -16.5 45.5t-44.5 18.5zM362 688l-172 -412h-70l142 319h-129q-35 0 -50.5 -11t-26.5 -40h-26l36 144h296z" />
+<glyph unicode="&#x2190;" horiz-adv-x="977" d="M909 209h-598q-48 0 -48 -13q0 -4 4 -10.5t9 -11.5l10 -12l7 -7q32 -35 61 -78l-24 -22q-110 129 -262 192v11q153 68 262 193l25 -20q-21 -31 -62 -77l-6 -7l-11 -13q-4 -5 -8.5 -13t-4.5 -12q0 -12 48 -12h598v-88z" />
+<glyph unicode="&#x2191;" horiz-adv-x="584" d="M490 414l-20 -25q-31 21 -77 62q-37 30 -45 30q-12 0 -12 -48v-603h-88v603q0 48 -13 48q-4 0 -10.5 -4t-12.5 -9l-11 -10l-7 -7q-35 -32 -78 -61l-22 24q129 110 192 262h11q68 -153 193 -262z" />
+<glyph unicode="&#x2192;" horiz-adv-x="977" d="M909 259v-11q-153 -68 -262 -193l-25 20q22 31 62 77l6 7l10 13q5 5 9.5 13t4.5 12q0 12 -48 12h-598v88h598q48 0 48 13q0 4 -4 10.5t-9 11.5l-11 12q-5 6 -6 7q-32 35 -61 78l24 22q110 -129 262 -192z" />
+<glyph unicode="&#x2193;" horiz-adv-x="584" d="M468 116l22 -24q-129 -110 -192 -262h-11q-68 153 -193 262l20 25q31 -21 77 -62q37 -30 45 -30q12 0 12 48v603h88v-603q0 -48 13 -48q4 0 10.5 4t12.5 9l11 10l7 7q35 32 78 61z" />
+<glyph unicode="&#x2194;" horiz-adv-x="977" d="M948 259v-11q-153 -68 -262 -193l-25 20q21 31 62 77l6 7l11 13q4 5 8.5 13t4.5 12q0 12 -35 12h-458q-35 0 -35 -13q0 -4 4 -10.5t9 -11.5l10 -12l7 -7q32 -35 61 -78l-24 -22q-110 129 -262 192v11q153 68 262 193l25 -20q-21 -31 -62 -77l-6 -7l-11 -13 q-4 -5 -8.5 -13t-4.5 -12q0 -12 48 -12h432q48 0 48 13q0 4 -4 10.5t-9 11.5l-10 12l-7 7q-32 35 -61 78l24 22q110 -129 262 -192z" />
+<glyph unicode="&#x2195;" horiz-adv-x="584" d="M468 56l22 -24q-129 -110 -192 -262h-11q-68 153 -193 262l20 25q31 -21 77 -62q37 -30 45 -30q12 0 12 48v480q0 48 -13 48q-4 0 -10.5 -4t-12.5 -9l-11 -10l-7 -7q-35 -32 -78 -61l-22 24q129 110 192 262h11q68 -153 193 -262l-20 -25q-31 21 -77 62q-37 30 -45 30 q-12 0 -12 -35v-506q0 -35 13 -35q4 0 10.5 4t12.5 9l11 10l7 7q35 32 78 61z" />
+<glyph unicode="&#x2196;" horiz-adv-x="977" d="M911 -108l-62 -62l-637 638q-28 28 -37 28q-4 0 -7.5 -8t-5 -17.5t-2.5 -19.5l-1 -10q-4 -61 -10 -98h-32q0 196 -49 325l8 8q120 -50 322 -50v-32q-46 -10 -98 -12q-1 0 -8.5 -0.5t-13.5 -1.5t-13.5 -2.5t-12 -4t-4.5 -5.5q0 -8 27 -37z" />
+<glyph unicode="&#x2197;" horiz-adv-x="977" d="M903 676l8 -8q-49 -129 -49 -325h-32q-6 37 -10 98l-1 10q-1 10 -2.5 19.5t-5 17.5t-7.5 8q-9 0 -37 -28l-637 -638l-62 62l636 639q27 29 27 37q0 3 -4.5 5.5t-12 4t-13.5 2.5t-13.5 1.5t-8.5 0.5q-52 2 -98 12v32q202 0 322 50z" />
+<glyph unicode="&#x2198;" horiz-adv-x="977" d="M911 -162l-8 -8q-120 50 -322 50v32q46 10 98 12q1 0 8 0.5t13.5 1.5t14 2.5t12 4t4.5 5.5q0 8 -27 37l-636 639l62 62l637 -638q28 -28 37 -28q4 0 7.5 8t5 17.5t2.5 19.5l1 10q4 61 10 98h32q0 -196 49 -325z" />
+<glyph unicode="&#x2199;" horiz-adv-x="977" d="M911 614l-636 -639q-27 -29 -27 -37q0 -3 4.5 -5.5t12 -4t13.5 -2.5t13.5 -1.5t8.5 -0.5q52 -2 98 -12v-32q-202 0 -322 -50l-8 8q49 129 49 325h32q6 -37 10 -98l1 -10q1 -10 2.5 -19.5t5 -17.5t7.5 -8q9 0 37 28l637 638z" />
+<glyph unicode="&#x219a;" horiz-adv-x="977" d="M909 209h-306l-97 -148h-83l97 148h-209q-48 0 -48 -13q0 -4 4 -10.5t9 -11.5l10 -12l7 -7q32 -35 61 -78l-24 -22q-110 129 -262 192v11q153 68 262 193l25 -20q-21 -31 -62 -77l-6 -7l-11 -13q-4 -5 -8.5 -13t-4.5 -12q0 -12 48 -12h266l97 148h83l-97 -148h249v-88z " />
+<glyph unicode="&#x219b;" horiz-adv-x="977" d="M909 259v-11q-153 -68 -262 -193l-25 20q22 31 62 77l6 7l10 13q5 5 9.5 13t4.5 12q0 12 -48 12h-321l-97 -148h-83l97 148h-194v88h251l97 148h83l-97 -148h264q48 0 48 13q0 4 -4 10.5t-9 11.5l-11 12q-5 6 -6 7q-32 35 -61 78l24 22q110 -129 262 -192z" />
+<glyph unicode="&#x219c;" horiz-adv-x="956" d="M890 267l-44 -71q-71 55 -160 55q-42 0 -123 -29q-85 -29 -151 -29q-40 0 -89 15l-31 10q-15 5 -26 5q-17 0 -26.5 -8.5t-9.5 -22.5t5 -29q7 -20 24 -79l-33 -12q-34 97 -60 149q-42 84 -100 135l1 11q129 6 301 95l16 -27q-27 -20 -75 -48q-33 -18 -33 -38 q0 -27 46.5 -47.5t82.5 -20.5q45 0 136 29t128 29q74 0 121 -15t100 -57z" />
+<glyph unicode="&#x219d;" horiz-adv-x="956" d="M889 367l1 -11q-58 -51 -100 -135q-26 -52 -60 -149l-33 12q17 59 24 79q5 15 5 29t-9.5 22.5t-26.5 8.5q-11 0 -26 -5l-31 -10q-49 -15 -89 -15q-66 0 -151 29q-81 29 -123 29q-89 0 -160 -55l-44 71q53 42 100 57t121 15q37 0 128 -29t136 -29q36 0 82.5 20.5 t46.5 47.5q0 20 -33 38q-48 28 -75 48l16 27q172 -89 301 -95z" />
+<glyph unicode="&#x219e;" horiz-adv-x="977" d="M909 209h-364q-48 0 -48 -13q0 -11 30 -41q26 -29 61 -78l-24 -22q-80 94 -185 154h-68q-48 0 -48 -13q0 -11 30 -41q26 -29 61 -78l-24 -22q-110 129 -262 192v11q150 67 262 193l25 -20q-23 -33 -62 -77q-1 -1 -7 -9l-11 -13q-4 -5 -8 -12t-4 -11q0 -12 48 -12h68 q101 57 185 154l25 -20q-23 -33 -62 -77q-1 -1 -7 -9l-11 -13q-4 -5 -8 -12t-4 -11q0 -12 48 -12h364v-88z" />
+<glyph unicode="&#x219f;" horiz-adv-x="568" d="M482 180l-22 -24q-49 35 -78 61q-30 30 -41 30q-13 0 -13 -48v-364h-88v364q0 48 -12 48q-5 0 -11.5 -4t-11.5 -8l-13 -11q-7 -6 -9 -7q-44 -39 -77 -62l-20 25q96 85 154 185v68q0 48 -12 48q-5 0 -11.5 -4t-11.5 -8l-13 -11q-7 -6 -9 -7q-44 -39 -77 -62l-20 25 q124 109 193 262h11q63 -152 192 -262l-22 -24q-49 35 -78 61q-30 30 -41 30q-13 0 -13 -48v-69q59 -103 154 -184z" />
+<glyph unicode="&#x21a0;" horiz-adv-x="977" d="M909 258v-11q-152 -63 -262 -192l-24 22q35 49 61 78q30 30 30 41q0 13 -48 13h-68q-105 -60 -185 -154l-24 22q35 49 61 78q30 30 30 41q0 13 -48 13h-364v88h364q48 0 48 12q0 4 -4 11t-8 12l-10 13q-7 8 -8 9q-39 44 -62 77l25 20q84 -97 185 -154h68q48 0 48 12 q0 4 -4 11t-8 12l-10 13q-7 8 -8 9q-39 44 -62 77l25 20q112 -126 262 -193z" />
+<glyph unicode="&#x21a1;" horiz-adv-x="568" d="M460 121l22 -24q-129 -110 -192 -262h-11q-69 153 -193 262l20 25q33 -23 77 -62q2 -1 9 -8l13 -10q5 -4 11.5 -8t11.5 -4q12 0 12 48v68q-58 100 -154 185l20 25q33 -23 77 -62q2 -1 9 -8l13 -10q5 -4 11.5 -8t11.5 -4q12 0 12 48v364h88v-364q0 -48 13 -48q11 0 41 30 q29 26 78 61l22 -24q-95 -81 -154 -184v-69q0 -48 13 -48q11 0 41 30q29 26 78 61z" />
+<glyph unicode="&#x21a2;" horiz-adv-x="977" d="M884 451l25 -20q-9 -13 -40.5 -50t-45 -64.5t-13.5 -62.5q0 -56 37 -99q35 -40 61 -78l-24 -22q-80 94 -185 154h-388q-48 0 -48 -13q0 -11 30 -41q33 -36 61 -78l-24 -22q-110 129 -262 192v11q150 67 262 193l25 -20q-23 -33 -62 -77q-1 -1 -7 -9l-11 -13q-4 -5 -8 -12 t-4 -11q0 -12 48 -12h388q101 57 185 154z" />
+<glyph unicode="&#x21a3;" horiz-adv-x="977" d="M909 258v-11q-152 -63 -262 -192l-24 22q28 42 61 78q30 30 30 41q0 13 -48 13h-388q-105 -60 -185 -154l-24 22q26 38 61 78q37 43 37 99q0 35 -13.5 62.5t-45 64.5t-40.5 50l25 20q84 -97 185 -154h388q48 0 48 12q0 4 -4 11t-8 12l-10 13q-7 8 -8 9q-39 44 -62 77 l25 20q112 -126 262 -193z" />
+<glyph unicode="&#x21a4;" horiz-adv-x="977" d="M909 55h-70v154h-528q-48 0 -48 -13q0 -11 30 -41q26 -29 61 -78l-24 -22q-110 129 -262 192v11q150 67 262 193l25 -20q-23 -33 -62 -77q-1 -1 -7 -9l-11 -13q-4 -5 -8 -12t-4 -11q0 -12 48 -12h528v154h70v-396z" />
+<glyph unicode="&#x21a5;" horiz-adv-x="584" d="M490 -165h-396v70h154v528q0 48 -12 48q-8 0 -45 -30q-44 -39 -77 -62l-20 25q126 112 193 262h11q63 -152 192 -262l-22 -24q-49 35 -78 61q-30 30 -41 30q-13 0 -13 -48v-528h154v-70z" />
+<glyph unicode="&#x21a6;" horiz-adv-x="977" d="M909 258v-11q-152 -63 -262 -192l-24 22q35 49 61 78q30 30 30 41q0 13 -48 13h-528v-154h-70v396h70v-154h528q48 0 48 12q0 4 -4 11t-8 12l-10 13q-7 8 -8 9q-39 44 -62 77l25 20q112 -126 262 -193z" />
+<glyph unicode="&#x21a7;" horiz-adv-x="584" d="M468 121l22 -24q-129 -110 -192 -262h-11q-67 150 -193 262l20 25q33 -23 77 -62q37 -30 45 -30q12 0 12 48v528h-154v70h396v-70h-154v-528q0 -48 13 -48q11 0 41 30q29 26 78 61z" />
+<glyph unicode="&#x21a8;" horiz-adv-x="584" d="M490 -196h-396v66h193q-68 153 -193 262l20 25q31 -21 77 -62q37 -30 45 -30q12 0 12 48v376q0 48 -13 48q-4 0 -10.5 -4t-12.5 -9l-11 -10l-7 -7q-35 -32 -78 -61l-22 24q129 110 192 262h11q68 -153 193 -262l-20 -25q-31 21 -77 62q-37 30 -45 30q-12 0 -12 -35v-402 q0 -35 13 -35q4 0 10.5 4t12.5 9l11 10l7 7q35 32 78 61l22 -24q-129 -110 -192 -262h192v-66z" />
+<glyph unicode="&#x21a9;" horiz-adv-x="966" d="M666 539h67q72 0 119.5 -45t47.5 -123q0 -65 -49.5 -113.5t-117.5 -48.5h-424q-48 0 -48 -13q0 -4 4 -10.5t9 -11.5l10 -12l7 -7q32 -35 61 -78l-24 -22q-110 129 -262 192v11q153 68 262 193l25 -20q-21 -31 -62 -77l-6 -7l-11 -13q-4 -5 -8.5 -13t-4.5 -12 q0 -12 48 -12h422q36 0 58.5 26t22.5 57q0 32 -22 58.5t-59 26.5h-65v74z" />
+<glyph unicode="&#x21aa;" horiz-adv-x="966" d="M900 258v-11q-152 -63 -262 -192l-24 22q29 43 61 78l7 7l10 12q5 5 9 11.5t4 10.5q0 13 -48 13h-424q-68 0 -117.5 48.5t-49.5 113.5q0 78 47.5 123t119.5 45h67v-74h-65q-37 0 -59 -26.5t-22 -58.5q0 -31 22.5 -57t58.5 -26h422q48 0 48 12q0 4 -4.5 12t-8.5 13l-11 13 l-6 7q-41 46 -62 77l25 20q109 -125 262 -193z" />
+<glyph unicode="&#x21ab;" horiz-adv-x="966" d="M569 297v67q0 84 46.5 130t115.5 46q72 0 120.5 -46t48.5 -123q0 -69 -53.5 -115.5t-125.5 -46.5h-78v-215h-74v215h-260q-48 0 -48 -13q0 -4 4 -10.5t9 -11.5l10 -12l7 -7q32 -35 61 -78l-24 -22q-110 129 -262 192v11q153 68 262 193l25 -20q-21 -31 -62 -77l-6 -7 l-11 -13q-4 -5 -8.5 -13t-4.5 -12q0 -12 48 -12h260zM643 297h74q39 0 67 22t28 62q0 43 -22.5 64t-61.5 21t-62 -28t-23 -72v-69z" />
+<glyph unicode="&#x21ac;" horiz-adv-x="966" d="M900 258v-11q-152 -63 -262 -192l-24 22q29 43 61 78l7 7l10 12q5 5 9 11.5t4 10.5q0 13 -48 13h-260v-215h-74v215h-78q-72 0 -125.5 46.5t-53.5 115.5q0 77 48.5 123t120.5 46q69 0 115.5 -46t46.5 -130v-67h260q48 0 48 12q0 4 -4.5 12t-8.5 13l-11 13l-6 7 q-41 46 -62 77l25 20q109 -125 262 -193zM323 297v69q0 44 -23 72t-62 28t-61.5 -21t-22.5 -64q0 -40 28 -62t67 -22h74z" />
+<glyph unicode="&#x21ad;" horiz-adv-x="1297" d="M1242 258v-11q-152 -63 -262 -192l-24 22q29 43 61 78l7 7l10 12q5 5 9 11.5t4 10.5q0 13 -45 13h-53q-27 0 -54 -37l-8 -12l-9 -12q-2 -4 -8 -11.5t-10 -10.5l-10 -10q-6 -5 -12 -7t-14 -4t-16 -2q-29 0 -49 26.5t-41 75.5q-26 65 -31 74q-20 38 -41 38t-41 -38l-9 -21 q-5 -12 -11 -28t-10 -25q-19 -48 -40 -75t-50 -27q-45 0 -77 49l-26 38q-17 19 -39 19h-53q-40 0 -40 -13q0 -4 4 -10.5t9 -11.5l11 -12q5 -6 6 -7q32 -35 61 -78l-24 -22q-110 129 -262 192v11q153 68 262 193l25 -20q-22 -31 -62 -77l-6 -7l-10 -13q-5 -5 -9.5 -13 t-4.5 -12q0 -12 40 -12h63q9 0 17 -1.5t15.5 -7t12 -8.5t11.5 -12.5t9 -12t9.5 -14.5t8.5 -13q24 -37 47 -37q22 0 37 39q5 12 13.5 39.5t10.5 33.5q34 102 102 102q39 0 62.5 -27t40.5 -75q2 -6 10.5 -33.5t13.5 -39.5q15 -39 37 -39q23 0 47 37q1 1 8.5 13t9.5 14.5t9 12 t12 12.5l11 8q7 5 15 7t17 2h60q48 0 48 12q0 4 -4.5 12t-8.5 13l-11 13l-6 7q-41 46 -62 77l25 20q109 -125 262 -193z" />
+<glyph unicode="&#x21ae;" horiz-adv-x="977" d="M948 259v-11q-153 -68 -262 -193l-25 20q21 31 62 77l6 7l11 13q4 5 8.5 13t4.5 12q0 12 -35 12h-209l-43 -148h-66l43 148h-183q-35 0 -35 -13q0 -4 4 -10.5t9 -11.5l10 -12l7 -7q32 -35 61 -78l-24 -22q-110 129 -262 192v11q153 68 262 193l25 -20q-21 -31 -62 -77 l-6 -7l-11 -13q-4 -5 -8.5 -13t-4.5 -12q0 -12 48 -12h195l42 146h66l-42 -146h171q48 0 48 13q0 4 -4 10.5t-9 11.5l-10 12l-7 7q-32 35 -61 78l24 22q110 -129 262 -192z" />
+<glyph unicode="&#x21af;" horiz-adv-x="562" d="M494 347l-234 -323q-23 -32 -23 -46q0 -17 31 -17q16 0 47 2.5t46 2.5q3 0 8.5 -0.5t8.5 -0.5l3 -32q-168 -12 -307 -87l-6 5q20 80 20 148q0 81 -19 170l31 6q15 -47 23 -89q1 -4 2.5 -11.5t2.5 -11.5q8 -21 19 -21q17 0 41 35l127 182h-239l320 424l73 -49l-211 -287 h236z" />
+<glyph unicode="&#x21b0;" horiz-adv-x="584" d="M503 -170h-88v614h-127q-48 0 -48 -13q0 -11 30 -41q26 -29 61 -78l-24 -22q-110 129 -262 192v11q150 67 262 193l25 -20q-23 -33 -62 -77q-30 -37 -30 -45q0 -12 48 -12h215v-702z" />
+<glyph unicode="&#x21b1;" horiz-adv-x="584" d="M539 493v-11q-152 -63 -262 -192l-24 22q35 49 61 78q30 30 30 41q0 13 -48 13h-127v-614h-88v702h215q48 0 48 12q0 8 -30 45q-39 44 -62 77l25 20q112 -126 262 -193z" />
+<glyph unicode="&#x21b2;" horiz-adv-x="584" d="M503 -16h-215q-48 0 -48 -12q0 -8 30 -45q39 -44 62 -77l-25 -20q-112 126 -262 193v11q152 63 262 192l24 -22q-35 -49 -61 -78q-30 -30 -30 -41q0 -13 48 -13h127v614h88v-702z" />
+<glyph unicode="&#x21b3;" horiz-adv-x="584" d="M539 34v-11q-150 -67 -262 -193l-25 20q23 33 62 77q30 37 30 45q0 12 -48 12h-215v702h88v-614h127q48 0 48 13q0 11 -30 41q-26 29 -61 78l24 22q110 -129 262 -192z" />
+<glyph unicode="&#x21b4;" horiz-adv-x="960" d="M874 125l20 -25q-125 -109 -193 -262h-11q-63 152 -192 262l22 24q43 -29 78 -61l7 -7l11 -10q6 -5 12.5 -9t10.5 -4q13 0 13 48v517h-586v88h673l1 -605q0 -48 12 -48q8 0 45 30q46 41 77 62z" />
+<glyph unicode="&#x21b5;" horiz-adv-x="960" d="M904 -16l-605 -1q-48 0 -48 -12q0 -4 4.5 -12t8.5 -13l11 -13l6 -7q41 -46 62 -77l-25 -20q-109 125 -262 193v11q152 63 262 192l24 -22q-29 -43 -61 -78l-7 -7l-10 -12q-5 -5 -9 -11.5t-4 -10.5q0 -13 48 -13h517v615h88v-702z" />
+<glyph unicode="&#x21b6;" horiz-adv-x="971" d="M905 185h-88q-3 105 -78 178t-180 73q-83 0 -150 -45t-94 -122q-7 -25 -7 -47q0 -27 13 -27q7 0 41 30q36 33 78 61l22 -24q-129 -110 -192 -262h-11q-67 150 -193 262l20 25q33 -23 77 -62q34 -30 45 -30q4 0 6.5 4t3.5 11t1.5 13t0.5 13v7q4 40 27 87q42 89 128 141.5 t186 52.5q138 0 239.5 -100.5t104.5 -238.5z" />
+<glyph unicode="&#x21b7;" horiz-adv-x="971" d="M885 287l20 -25q-126 -112 -193 -262h-11q-63 152 -192 262l22 24q42 -28 78 -61q34 -30 41 -30q13 0 13 27q0 22 -7 47q-27 77 -94 122t-150 45q-105 0 -180 -73t-78 -178h-88q3 138 104.5 238.5t239.5 100.5q100 0 186 -52.5t128 -141.5q23 -47 27 -87v-7q0 -7 0.5 -13 t1.5 -13t3.5 -11t6.5 -4q11 0 45 30q44 39 77 62z" />
+<glyph unicode="&#x21b8;" horiz-adv-x="977" d="M911 -108l-62 -62l-637 638q-28 28 -37 28q-4 0 -7.5 -8t-5 -17.5t-2.5 -19.5l-1 -10q-4 -61 -10 -98h-32q0 196 -49 325l8 8q120 -50 322 -50v-32q-46 -10 -98 -12q-1 0 -8.5 -0.5t-13.5 -1.5t-13.5 -2.5t-12 -4t-4.5 -5.5q0 -8 27 -37zM911 680h-835v88h835v-88z" />
+<glyph unicode="&#x21b9;" horiz-adv-x="977" d="M909 -96h-70v396h70v-396zM909 376h-523q-48 0 -48 -13q0 -4 4 -10.5t9 -12.5l11 -11q5 -6 6 -7q32 -35 61 -78l-24 -22q-110 129 -262 192v11q153 68 262 193l25 -20q-22 -31 -62 -77q-30 -37 -30 -45q0 -12 48 -12h523v-88zM834 89v-11q-152 -63 -262 -192l-24 22 q29 43 61 78l7 7l10 11q5 6 9 12.5t4 10.5q0 13 -48 13h-523v88h523q48 0 48 12q0 8 -30 45q-41 46 -62 77l25 20q109 -125 262 -193zM138 222h-70v396h70v-396z" />
+<glyph unicode="&#x21ba;" horiz-adv-x="974" d="M826 693l13 -29q-72 -42 -120 -66q-21 -10 -21 -20q0 -2 3 -5q168 -128 168 -319q0 -158 -112 -269.5t-270 -111.5t-270 111.5t-112 269.5q0 127 76.5 228t198.5 140l29 -82q-95 -31 -156 -110.5t-61 -177.5q0 -120 86.5 -205t207.5 -85t208 86t87 207q0 67 -30.5 131 t-83.5 102q-1 0 -2.5 0.5t-2.5 0.5q-9 0 -9 -16q0 -7 1 -10q15 -45 33 -135l-30 -10q-56 181 -151 284l5 11h14q124 0 301 80z" />
+<glyph unicode="&#x21bb;" horiz-adv-x="974" d="M565 540l29 82q122 -39 198.5 -140t76.5 -228q0 -158 -112 -269.5t-270 -111.5t-270 111.5t-112 269.5q0 191 168 319q3 3 3 5q0 10 -21 20q-48 24 -120 66l13 29q177 -80 301 -80h14l5 -11q-95 -103 -151 -284l-30 10q18 90 33 135q1 3 1 10q0 16 -9 16q-1 0 -2.5 -0.5 t-2.5 -0.5q-53 -38 -83.5 -102t-30.5 -131q0 -121 87 -207t208 -86t207.5 85t86.5 205q0 98 -61 177.5t-156 110.5z" />
+<glyph unicode="&#x21bc;" horiz-adv-x="977" d="M910 209h-844v4q163 130 308 288l34 -29l-46 -54q-36 -42 -54 -66.5t-18 -33.5q0 -21 25 -21h595v-88z" />
+<glyph unicode="&#x21bd;" horiz-adv-x="977" d="M909 209h-595q-25 0 -25 -21q0 -9 18 -33.5t54 -66.5l46 -54l-34 -29q-145 158 -308 288v4h844v-88z" />
+<glyph unicode="&#x21be;" horiz-adv-x="552" d="M481 418l-22 -24q-43 29 -78 61l-7 7l-12 10q-5 5 -11.5 9t-10.5 4q-13 0 -13 -48v-599h-88v856z" />
+<glyph unicode="&#x21bf;" horiz-adv-x="352" d="M313 -162h-88v599q0 48 -13 48q-4 0 -10.5 -4t-11.5 -9l-12 -10l-7 -7q-35 -32 -78 -61l-22 24l242 276v-856z" />
+<glyph unicode="&#x21c0;" horiz-adv-x="977" d="M910 209h-844v88h595q25 0 25 21q0 9 -18 33.5t-54 66.5l-46 54l34 29q145 -158 308 -288v-4z" />
+<glyph unicode="&#x21c1;" horiz-adv-x="977" d="M910 297v-4q-163 -130 -308 -288l-34 29l46 54q36 42 54 66.5t18 33.5q0 21 -25 21h-595v88h844z" />
+<glyph unicode="&#x21c2;" horiz-adv-x="552" d="M481 114l-242 -276v856h88v-599q0 -48 13 -48q4 0 10.5 4t11.5 9l12 10l7 7q35 32 78 61z" />
+<glyph unicode="&#x21c3;" horiz-adv-x="552" d="M313 -162l-242 276l22 24q43 -29 78 -61l7 -7l12 -10q5 -5 11.5 -9t10.5 -4q13 0 13 48v599h88v-856z" />
+<glyph unicode="&#x21c4;" horiz-adv-x="977" d="M909 425v-11q-152 -63 -262 -192l-24 22q29 43 61 78q1 1 6 7l11 11q5 6 9 12.5t4 10.5q0 13 -48 13h-598v88h598q48 0 48 12q0 8 -30 45q-40 46 -62 77l25 20q109 -125 262 -193zM909 40h-598q-48 0 -48 -13q0 -4 4 -10.5t9 -12.5l10 -11l7 -7q32 -35 61 -78l-24 -22 q-110 129 -262 192v11q153 68 262 193l25 -20q-21 -31 -62 -77q-30 -37 -30 -45q0 -12 48 -12h598v-88z" />
+<glyph unicode="&#x21c5;" horiz-adv-x="864" d="M776 121l22 -24q-129 -110 -192 -262h-11q-68 153 -193 262l20 25q31 -22 77 -62q37 -30 45 -30q12 0 12 48v598h88v-598q0 -48 13 -48q4 0 10.5 4t12.5 9l11 11q6 5 7 6q35 32 78 61zM462 414l-22 -24q-43 29 -78 61l-7 7l-11 10q-6 5 -12.5 9t-10.5 4q-13 0 -13 -48 v-598h-88v598q0 48 -12 48q-8 0 -45 -30q-46 -41 -77 -62l-20 25q125 109 193 262h11q63 -152 192 -262z" />
+<glyph unicode="&#x21c6;" horiz-adv-x="977" d="M909 376h-598q-48 0 -48 -13q0 -4 4 -10.5t9 -12.5l10 -11l7 -7q32 -35 61 -78l-24 -22q-110 129 -262 192v11q153 68 262 193l25 -20q-21 -31 -62 -77q-30 -37 -30 -45q0 -12 48 -12h598v-88zM909 89v-11q-152 -63 -262 -192l-24 22q29 43 61 78q1 1 6 7l11 11 q5 6 9 12.5t4 10.5q0 13 -48 13h-598v88h598q48 0 48 12q0 8 -30 45q-40 46 -62 77l25 20q109 -125 262 -193z" />
+<glyph unicode="&#x21c7;" horiz-adv-x="977" d="M909 40h-598q-48 0 -48 -13q0 -11 30 -41q26 -29 61 -78l-24 -22q-110 129 -262 192v11q139 62 235 163q-101 106 -235 162v11q153 69 262 193l25 -20q-23 -33 -62 -77q-1 -2 -7 -9l-11 -13q-4 -5 -8 -11.5t-4 -11.5q0 -12 48 -12h598v-88h-598q-48 0 -48 -13 q0 -11 30 -41q11 -12 29 -36l27 -33q-26 -34 -56 -68q-1 -2 -7 -9l-11 -13q-4 -5 -8 -11.5t-4 -11.5q0 -12 48 -12h598v-88z" />
+<glyph unicode="&#x21c8;" horiz-adv-x="864" d="M798 414l-22 -24q-49 35 -78 61q-30 30 -41 30q-13 0 -13 -48v-598h-88v598q0 48 -12 48q-5 0 -11.5 -4t-11.5 -8l-13 -11q-7 -6 -9 -7l-68 -56l-33 27q-24 18 -36 29q-30 30 -41 30q-13 0 -13 -48v-598h-88v598q0 48 -12 48q-5 0 -11.5 -4t-11.5 -8l-13 -11q-7 -6 -9 -7 q-44 -39 -77 -62l-20 25q124 109 193 262h11q56 -134 162 -235q101 96 163 235h11q63 -152 192 -262z" />
+<glyph unicode="&#x21c9;" horiz-adv-x="977" d="M909 89v-11q-152 -63 -262 -192l-24 22q35 49 61 78q30 30 30 41q0 13 -48 13h-598v88h598q48 0 48 12q0 5 -4 11.5t-8 11.5t-10.5 12.5t-7.5 9.5q-30 34 -56 68l26 33q19 24 30 36q30 30 30 41q0 13 -48 13h-598v88h598q48 0 48 12q0 5 -4 11.5t-8 11.5t-10.5 12.5 t-7.5 9.5q-39 44 -62 77l25 20q109 -124 262 -193v-11q-134 -56 -235 -162q96 -101 235 -163z" />
+<glyph unicode="&#x21ca;" horiz-adv-x="864" d="M776 121l22 -24q-129 -110 -192 -262h-11q-62 139 -163 235q-106 -101 -162 -235h-11q-69 153 -193 262l20 25q33 -23 77 -62q2 -1 9 -8l13 -10q5 -4 11.5 -8t11.5 -4q12 0 12 48v598h88v-598q0 -48 13 -48q11 0 41 30q12 11 36 30l33 26l68 -56q2 -1 9 -8l13 -10 q5 -4 11.5 -8t11.5 -4q12 0 12 48v598h88v-598q0 -48 13 -48q11 0 41 30q29 26 78 61z" />
+<glyph unicode="&#x21cb;" horiz-adv-x="977" d="M910 329h-844l276 242l24 -22q-29 -43 -61 -78l-7 -7l-10 -12q-5 -5 -9 -11.5t-4 -10.5q0 -13 48 -13h587v-88zM910 221l-276 -242l-24 22q29 43 61 78l7 7l10 12q5 5 9 11.5t4 10.5q0 13 -48 13h-587v88h844z" />
+<glyph unicode="&#x21cc;" horiz-adv-x="977" d="M910 329h-844v88h587q48 0 48 13q0 11 -30 41q-31 35 -61 78l24 22zM910 133h-587q-48 0 -48 -13q0 -11 30 -41q31 -35 61 -78l-24 -22l-276 242h844v-88z" />
+<glyph unicode="&#x21cd;" horiz-adv-x="977" d="M909 107h-226l-52 -171h-73l52 171h-184q-48 0 -48 -21q0 -14 16 -33q43 -48 78 -97l-25 -20q-147 157 -379 312v10q192 123 379 312l24 -22l-28 -38l-31 -40q-16 -18 -18 -21q-16 -19 -16 -29q0 -21 46 -21h273l52 171h73l-52 -171h139v-88h-165l-35 -116h200v-88z M671 311h-420q-19 -5 -31 -22t-12 -36t12 -36.5t31 -21.5h385z" />
+<glyph unicode="&#x21ce;" horiz-adv-x="1240" d="M1190 258v-10q-232 -155 -379 -312l-25 20q35 49 78 97q16 19 16 33q0 21 -48 21h-217l-52 -171h-73l52 171h-134q-48 0 -48 -21q0 -14 16 -33q43 -48 78 -97l-25 -20q-147 157 -379 312v10q192 123 379 312l24 -22l-28 -38l-31 -40q-16 -18 -18 -21q-16 -19 -16 -29 q0 -21 46 -21h223l52 171h73l-52 -171h132q46 0 46 21q0 10 -16 29q-2 3 -18 21l-31 40l-28 38l24 22q187 -189 379 -312zM641 195h366q19 4 31 21.5t12 36.5t-12 36t-31 22h-331zM603 311h-370q-19 -5 -31 -22t-12 -36t12 -36.5t31 -21.5h335z" />
+<glyph unicode="&#x21cf;" horiz-adv-x="977" d="M909 258v-10q-234 -156 -379 -312l-25 20q14 20 42.5 54t35.5 43q16 20 16 33q0 21 -48 21h-270l-52 -171h-73l52 171h-140v88h166l35 116h-201v88h227l52 171h73l-52 -171h185q46 0 46 21q0 8 -16 29l-77 99l24 22q186 -187 379 -312zM307 195h419q3 0 11 4q32 17 32 54 q0 35 -32 54q-8 4 -11 4h-384z" />
+<glyph unicode="&#x21d0;" horiz-adv-x="977" d="M909 107h-485q-46 0 -46 -21q0 -10 16 -29q2 -3 18 -21l31 -40l28 -38l-24 -22q-187 189 -379 312v10q232 155 379 312l25 -20q-35 -49 -78 -97q-16 -19 -16 -33q0 -21 48 -21h483v-88h-658q-19 -4 -31 -21.5t-12 -36.5t12 -36t31 -22h658v-88z" />
+<glyph unicode="&#x21d1;" horiz-adv-x="714" d="M674 297l-20 -25q-49 35 -97 78q-19 16 -33 16q-21 0 -21 -48v-488h-88v663q-4 19 -21.5 31t-36.5 12t-36 -12t-22 -31v-663h-88v490q0 46 -21 46q-10 0 -29 -16q-3 -2 -21.5 -17.5t-39.5 -31.5l-38 -28l-22 24q189 187 312 379h10q155 -232 312 -379z" />
+<glyph unicode="&#x21d2;" horiz-adv-x="977" d="M909 258v-10q-232 -155 -379 -312l-25 20q35 49 78 97q16 19 16 33q0 21 -48 21h-483v88h658q19 4 31 21.5t12 36.5t-12 36t-31 22h-658v88h485q46 0 46 21q0 10 -16 29q-2 3 -17 21l-32 40l-28 38l24 22q187 -189 379 -312z" />
+<glyph unicode="&#x21d3;" horiz-adv-x="714" d="M652 233l22 -24q-189 -187 -312 -379h-10q-155 232 -312 379l20 25q49 -35 97 -78q19 -16 33 -16q21 0 21 48v488h88v-663q4 -19 21.5 -31t36.5 -12t36 12t22 31v663h88v-490q0 -46 21 -46q10 0 29 16q3 2 21.5 17.5t39.5 31.5z" />
+<glyph unicode="&#x21d4;" horiz-adv-x="1240" d="M1190 258v-10q-232 -155 -379 -312l-25 20q35 49 78 97q16 19 16 33q0 21 -48 21h-426q-46 0 -46 -21q0 -10 16 -29q2 -3 18 -21l31 -40l28 -38l-24 -22q-187 189 -379 312v10q232 155 379 312l25 -20q-35 -49 -78 -97q-16 -19 -16 -33q0 -21 48 -21h426q46 0 46 21 q0 10 -16 29q-2 3 -18 21l-31 40l-28 38l24 22q187 -189 379 -312zM233 195h774q19 4 31 21.5t12 36.5t-12 36t-31 22h-774q-19 -4 -31 -21.5t-12 -36.5t12 -36t31 -22z" />
+<glyph unicode="&#x21d5;" horiz-adv-x="714" d="M652 173l22 -24q-189 -187 -312 -379h-10q-155 232 -312 379l20 25q49 -35 97 -78q19 -16 33 -16q21 0 21 48v252q0 46 -21 46q-10 0 -29 -16q-3 -2 -21.5 -17.5t-39.5 -31.5l-38 -28l-22 24q189 187 312 379h10q155 -232 312 -379l-20 -25q-49 35 -97 78q-19 16 -33 16 q-21 0 -21 -48v-252q0 -46 21 -46q10 0 29 16q3 2 21.5 17.5t39.5 31.5zM415 -47v600q-4 19 -21.5 31t-36.5 12t-36 -12t-22 -31v-600q4 -19 21.5 -31t36.5 -12t36 12t22 31z" />
+<glyph unicode="&#x21d6;" horiz-adv-x="926" d="M872 50l-62 -62l-582 582q-7 7 -26 7q-26 0 -44.5 -18t-18.5 -44q0 -20 7 -27l582 -582l-62 -62l-460 459q-23 23 -36 23q-6 0 -11 -5q-7 -7 -9 -32q-8 -84 -16 -124l-32 1q2 264 -48 489l7 7q245 -49 440 -49q33 0 49 1l4 -32q-42 -7 -124 -13q-25 -2 -35 -12 q-5 -5 -5 -11q0 -14 24 -38z" />
+<glyph unicode="&#x21d7;" horiz-adv-x="926" d="M865 662l7 -7q-50 -225 -48 -489l-32 -1q-8 40 -16 124q-2 25 -9 32q-5 5 -11 5q-13 0 -36 -23l-460 -459l-62 62l582 582q7 7 7 27q0 26 -18.5 44t-44.5 18q-19 0 -26 -7l-582 -582l-62 62l458 458q24 24 24 38q0 6 -5 11q-10 10 -35 12q-82 6 -124 13l4 32q16 -1 49 -1 q195 0 440 49z" />
+<glyph unicode="&#x21d8;" horiz-adv-x="926" d="M872 -149l-7 -7q-245 49 -440 49q-33 0 -49 -1l-4 32q42 7 124 13q25 2 35 12q5 5 5 11q0 14 -24 38l-458 458l62 62l582 -582q7 -7 26 -7q26 0 44.5 18t18.5 44q0 20 -7 27l-582 582l62 62l460 -459q23 -23 36 -23q6 0 11 5q7 7 9 32q8 84 16 124l32 -1q-2 -264 48 -489 z" />
+<glyph unicode="&#x21d9;" horiz-adv-x="926" d="M872 456l-458 -458q-24 -24 -24 -38q0 -6 5 -11q10 -10 35 -12q82 -6 124 -13l-4 -32q-16 1 -49 1q-195 0 -440 -49l-7 7q50 225 48 489l32 1q8 -40 16 -124q2 -25 9 -32q5 -5 11 -5q13 0 36 23l460 459l62 -62l-582 -582q-7 -7 -7 -27q0 -26 18.5 -44t44.5 -18 q19 0 26 7l582 582z" />
+<glyph unicode="&#x21dc;" horiz-adv-x="977" d="M914 209h-120l-95 -113l-118 171l-123 -171l-98 113h-55q-48 0 -48 -13q0 -4 4 -10.5t9 -11.5l10 -12l7 -7q32 -35 61 -78l-24 -22q-110 129 -262 192v11q153 68 262 193l27 -20q-13 -19 -64 -77l-6 -7l-11 -13q-4 -5 -8.5 -13t-4.5 -12q0 -12 48 -12h97l54 -60l125 176 l120 -175l54 59h159v-88z" />
+<glyph unicode="&#x21dd;" horiz-adv-x="977" d="M914 258v-11q-152 -63 -262 -192l-24 22q29 43 61 78l7 7l10 12q5 5 9 11.5t4 10.5q0 13 -48 13h-55l-98 -113l-123 171l-118 -171l-95 113h-120v88h159l54 -59l120 175l125 -176l54 60h97q48 0 48 12q0 4 -4.5 12t-8.5 13l-11 13l-6 7q-51 58 -64 77l27 20 q109 -125 262 -193z" />
+<glyph unicode="&#x21e6;" horiz-adv-x="926" d="M866 120h-420v-155l-20 -10q-41 41 -93 85t-83 68l-102 75l-88 65v10l90 67l96 73q37 27 88 69.5t92 83.5l20 -10v-155h420v-266zM805 181v144h-420v105l-147 -113q-54 -42 -54 -64q0 -13 12.5 -26.5t41.5 -36.5l147 -115v106h420z" />
+<glyph unicode="&#x21e7;" horiz-adv-x="685" d="M641 296l-10 -20h-155v-432h-266v432h-155l-10 20q41 41 85 93t68 83l75 102l65 88h10l67 -90l73 -96q27 -37 69.5 -88t83.5 -92zM520 337l-113 147q-42 54 -64 54q-13 0 -26.5 -12.5t-36.5 -41.5l-115 -147h106v-432h144v432h105z" />
+<glyph unicode="&#x21e8;" horiz-adv-x="926" d="M866 258v-10l-88 -65l-102 -75q-31 -24 -83 -68t-93 -85l-20 10v155h-420v266h420v155l20 10q41 -41 92 -83.5t88 -69.5l96 -73zM541 75l147 115q29 23 41.5 36.5t12.5 26.5q0 22 -54 64l-147 113v-105h-420v-144h420v-106z" />
+<glyph unicode="&#x21e9;" horiz-adv-x="685" d="M631 230l10 -20q-41 -41 -83.5 -92t-69.5 -88l-73 -96l-67 -90h-10l-65 88l-75 102q-24 31 -68 83t-85 93l10 20h155v432h266v-432h155zM520 169h-105v432h-144v-432h-106l115 -147q23 -29 36.5 -41.5t26.5 -12.5q22 0 64 54z" />
+<glyph unicode="&#x21ea;" horiz-adv-x="685" d="M641 339l-10 -20h-155v-262h-266v262h-155l-10 20q41 41 85 93t68 84l75 100l65 89h10l67 -89l73 -98q27 -36 69.5 -87t83.5 -92zM520 380l-113 147l-21 27q-7 8 -19.5 17.5t-23.5 9.5q-4 0 -7.5 -1t-7.5 -3t-6.5 -3.5t-7.5 -5.5l-6 -7q-2 -2 -7 -8t-7 -8l-6 -9 q-6 -7 -8 -9l-115 -147h106v-262h144v262h105zM476 -201h-266v193h266v-193zM415 -140v71h-144v-71h144z" />
+<glyph unicode="&#x21f5;" horiz-adv-x="864" d="M798 414l-22 -24q-43 29 -78 61l-7 7l-11 10q-6 5 -12.5 9t-10.5 4q-13 0 -13 -48v-598h-88v598q0 48 -12 48q-8 0 -45 -30q-46 -41 -77 -62l-20 25q125 109 193 262h11q63 -152 192 -262zM440 121l22 -24q-129 -110 -192 -262h-11q-68 153 -193 262l20 25q31 -22 77 -62 q37 -30 45 -30q12 0 12 48v598h88v-598q0 -48 13 -48q4 0 10.5 4t12.5 9l11 11q6 5 7 6q35 32 78 61z" />
+<glyph unicode="&#x2200;" horiz-adv-x="599" d="M594 676l-246 -676h-99l-244 676h105l70 -193h239l70 193h105zM387 395h-176l88 -242z" />
+<glyph unicode="&#x2201;" horiz-adv-x="539" d="M476 244v-139q0 -43 -24 -72.5t-63 -41.5t-68 -16t-58 -4q-200 0 -200 137v520q0 46 23.5 79.5t59 49t65.5 22t56 6.5q27 0 56.5 -5.5t67 -20t61.5 -47.5t24 -79v-122h-104v91q0 26 -12.5 43.5t-32.5 24.5t-33.5 9t-28.5 2q-13 0 -26.5 -2.5t-31.5 -9.5t-29 -24t-11 -42 v-460q0 -68 101 -68q104 0 104 69v100h104z" />
+<glyph unicode="&#x2202;" horiz-adv-x="559" d="M234 627l2 23q43 36 119 36q204 0 204 -256q0 -53 -12 -111.5t-39 -117.5t-64 -105.5t-92.5 -76t-120.5 -29.5q-89 0 -138 46.5t-49 129.5q0 119 89 206t209 87q41 0 80.5 -19t52.5 -51h4v8q2 18 2 27q0 48 -5.5 83.5t-21 69t-47.5 51t-80 17.5q-30 0 -93 -18zM423 293 q0 64 -25.5 95t-63.5 31q-64 0 -119 -88.5t-55 -176.5q0 -70 20.5 -97t67.5 -27q68 0 121.5 82.5t53.5 180.5z" />
+<glyph unicode="&#x2203;" horiz-adv-x="599" d="M523 0h-447v100h348v187h-336v100h336v189h-348v100h447v-676z" />
+<glyph unicode="&#x2204;" horiz-adv-x="599" d="M523 0h-337l-37 -127h-73l37 127h-37v100h67l55 187h-110v100h139l56 189h-207v100h237l37 127h73l-37 -127h137v-676zM424 387v189h-68l-56 -189h124zM424 100v187h-153l-55 -187h208z" />
+<glyph unicode="&#x2205;" horiz-adv-x="787" d="M737 594l-94 -108q93 -98 93 -234q0 -142 -100 -242t-242 -100q-109 0 -199 64l-56 -64h-89l95 108q-93 98 -93 234q0 142 100 242t242 100q109 0 199 -63l55 63h89zM585 420l-332 -379q64 -43 141 -43q105 0 179.5 74.5t74.5 179.5q0 95 -63 168zM203 85l331 379 q-65 42 -140 42q-105 0 -179.5 -74.5t-74.5 -179.5q0 -96 63 -167z" />
+<glyph unicode="&#x2206;" horiz-adv-x="681" d="M658 0h-635l284 676h54zM511 49l-212 480h-1l-202 -480h415z" />
+<glyph unicode="&#x2207;" horiz-adv-x="681" d="M658 676l-284 -676h-54l-297 676h635zM585 626h-415l212 -479h1z" />
+<glyph unicode="&#x2208;" d="M668 -13h-298q-128 0 -208 81t-80 199q0 119 80.5 199.5t210.5 80.5h295v-88h-311q-64 0 -115.5 -42t-66.5 -106h493v-88h-493q15 -64 66.5 -106t116.5 -42h310v-88z" />
+<glyph unicode="&#x2209;" d="M668 -13h-298q-36 0 -73 8l-58 -141h-69l66 162q-72 34 -113 101t-41 150q0 119 80.5 199.5t210.5 80.5h82l55 133h69l-55 -133h144v-88h-180l-61 -148h241v-88h-277l-60 -146q18 -2 27 -2h310v-88zM419 459h-62q-64 0 -115.5 -42t-66.5 -106h183zM322 223h-147 q20 -84 95 -125z" />
+<glyph unicode="&#x220a;" horiz-adv-x="500" d="M440 35h-148q-96 0 -164 68t-68 164t68 164t164 68h148v-88h-148q-48 0 -85.5 -28t-51.5 -72h285v-88h-285q14 -44 51.5 -72t85.5 -28h148v-88z" />
+<glyph unicode="&#x220b;" d="M82 547h295q130 0 210.5 -80.5t80.5 -199.5q0 -118 -80 -199t-208 -81h-298v88h310q65 0 116.5 42t66.5 106h-493v88h493q-15 64 -66.5 106t-115.5 42h-311v88z" />
+<glyph unicode="&#x220c;" d="M579 680l-67 -162q73 -34 114.5 -101t41.5 -150q0 -118 -80 -199t-208 -81h-86l-55 -133h-69l55 133h-143v88h179l61 148h-240v88h276l60 146q-16 2 -25 2h-311v88h295q38 0 75 -8l58 141h69zM427 311h148q-20 86 -96 126zM575 223h-184l-61 -148h62q65 0 116.5 42 t66.5 106z" />
+<glyph unicode="&#x220d;" horiz-adv-x="500" d="M60 499h148q96 0 164 -68t68 -164t-68 -164t-164 -68h-148v88h148q48 0 85.5 28t51.5 72h-285v88h285q-14 44 -51.5 72t-85.5 28h-148v88z" />
+<glyph unicode="&#x220f;" horiz-adv-x="1000" d="M963 -259h-404v38h51q37 0 52 29t15 99v784h-355v-784q0 -128 67 -128h52v-38h-404v38h37q40 0 59 28.5t19 92.5v711q0 67 -23 90.5t-92 23.5v38h926v-38h-36q-43 0 -61.5 -23t-18.5 -94v-725q0 -55 19 -79.5t59 -24.5h38v-38z" />
+<glyph unicode="&#x2210;" horiz-adv-x="982" d="M954 -259h-926v37h38q43 0 60.5 23.5t17.5 94.5v701q0 73 -18.5 101t-59.5 28h-38v37h400v-37h-37q-41 0 -59 -28t-18 -100v-785h355v785q0 72 -18.5 100t-59.5 28h-37v37h400v-37h-37q-40 0 -59 -30.5t-19 -98.5v-701q0 -71 18 -94.5t60 -23.5h37v-37z" />
+<glyph unicode="&#x2211;" horiz-adv-x="914" d="M873 47l-55 -306h-778l401 505l-376 517h736v-258h-38q-4 53 -18.5 89.5t-31.5 55.5t-47 28.5t-50.5 11t-58.5 1.5h-244l274 -382l-321 -398h397q37 0 59.5 4t45.5 17t38 41t25 74h42z" />
+<glyph unicode="&#x2212;" d="M685 209h-619v88h619v-88z" />
+<glyph unicode="&#x2213;" horiz-adv-x="770" d="M685 569h-620v88h620v-88zM685 209h-266v-221h-88v221h-266v88h266v221h88v-221h266v-88z" />
+<glyph unicode="&#x2214;" d="M685 209h-266v-266h-88v266h-266v88h266v266h88v-266h266v-88zM457 711q0 -34 -24 -58t-58 -24t-58 24t-24 58t24 58t58 24t58 -24t24 -58z" />
+<glyph unicode="&#x2215;" horiz-adv-x="584" d="M506 732l-332 -925h-96l332 925h96z" />
+<glyph unicode="&#x2216;" horiz-adv-x="452" d="M427 93h-86l-316 318h86z" />
+<glyph unicode="&#x2217;" horiz-adv-x="585" d="M301 294l7 -3q45 35 60 53q8 10 18 26q16 24 29 32.5t31 8.5q22 0 39.5 -15.5t17.5 -36.5q0 -25 -27.5 -41t-60.5 -16q-35 0 -52.5 -5t-43.5 -23v-8l35 -16q10 -4 27.5 -8t41.5 -6q43 -4 61 -16.5t18 -38.5q0 -24 -14 -39t-39 -15q-21 0 -34.5 12.5t-45.5 54.5 q-17 23 -28 32.5t-34 21.5l-6 -5q1 -34 6.5 -53t22.5 -52q16 -31 16 -48q0 -24 -16 -40t-39 -16q-22 0 -37 16t-15 40q0 19 17 49q15 27 19.5 46.5t5.5 57.5l-7 5q-31 -23 -44 -36.5t-35 -44.5q-17 -24 -29 -32t-30 -8q-23 0 -38.5 15t-15.5 37q0 28 22.5 41t67.5 16 q34 2 50.5 7.5t41.5 23.5v7q-33 15 -53 20t-56 8q-73 7 -73 57q0 23 14 37.5t36 14.5q23 0 37.5 -9.5t29.5 -36.5q18 -31 31 -43.5t45 -30.5l6 3q-1 35 -4.5 51t-20.5 46q-19 34 -19 57t15.5 38.5t39.5 15.5q23 0 37.5 -16.5t14.5 -42.5q0 -17 -19 -50q-24 -40 -24 -83v-16z " />
+<glyph unicode="&#x2218;" horiz-adv-x="394" d="M354 252q0 -65 -46 -111t-111 -46q-66 0 -111.5 46t-45.5 113q0 66 46 110.5t113 44.5q64 0 109.5 -46t45.5 -111zM266 252q0 29 -20 49t-47 20q-31 0 -51 -19.5t-20 -47.5q0 -31 19.5 -51t49.5 -20q29 0 49 20t20 49z" />
+<glyph unicode="&#x2219;" horiz-adv-x="584" d="M499 266q0 -86 -60.5 -146.5t-146.5 -60.5t-146.5 60.5t-60.5 146.5t60.5 146.5t146.5 60.5t146.5 -60.5t60.5 -146.5z" />
+<glyph unicode="&#x221a;" horiz-adv-x="965" d="M1016 946l-481 -1205h-65l-203 504q-13 32 -22.5 44.5t-22.5 12.5q-24 0 -69 -43l-23 35l165 127h45l188 -476h1l400 1001h87z" />
+<glyph unicode="&#x221d;" horiz-adv-x="772" d="M692 0h-5q-70 0 -117 34.5t-94 101.5q-75 -136 -210 -136q-86 0 -136 61t-50 149q0 162 121 220q42 20 80 20q71 0 117 -34t100 -105q39 68 82 103.5t112 35.5v-104q-61 0 -93.5 -20t-68.5 -73q19 -31 31 -49t36.5 -51t48.5 -51t46 -20v-82zM442 193q-106 178 -192 178 q-40 0 -65 -34t-25 -75q0 -62 34.5 -110t94.5 -48q86 0 153 89z" />
+<glyph unicode="&#x221e;" horiz-adv-x="964" d="M884 232q0 -90 -60 -161t-148 -71q-63 0 -109.5 36t-90.5 100q-74 -136 -210 -136q-86 0 -136 61t-50 149q0 162 121 220q40 20 80 20q71 0 117 -34t100 -105q39 68 82 103.5t112 35.5q86 0 139 -65t53 -153zM804 188q0 64 -34 111t-95 47q-50 0 -81.5 -22.5t-63.5 -70.5 q18 -30 26 -42t30.5 -43t39 -46t41 -29t47.5 -14q40 0 65 34t25 75zM442 193q-20 33 -35.5 55t-42.5 55t-56.5 50.5t-57.5 17.5q-40 0 -65 -34t-25 -75q0 -62 34.5 -110t94.5 -48q86 0 153 89z" />
+<glyph unicode="&#x221f;" horiz-adv-x="685" d="M634 0h-584v584h88v-496h496v-88z" />
+<glyph unicode="&#x2220;" horiz-adv-x="792" d="M708 0h-658l568 569l64 -61l-420 -420h446v-88z" />
+<glyph unicode="&#x2221;" horiz-adv-x="792" d="M708 0h-98q0 -37 -6 -74l-87 14q5 31 5 60h-472l334 334q-13 13 -48 40l53 70q42 -32 57 -47l172 172l64 -61l-178 -178q82 -108 101 -242h103v-88zM262 88h254q-16 94 -75 179z" />
+<glyph unicode="&#x2222;" horiz-adv-x="695" d="M667 86l-33 -82l-88 36q-12 -28 -34 -66l-76 45q13 20 28 55l-437 179l435 183q-11 23 -27 53l76 45q26 -48 33 -65l90 37l33 -80l-94 -40q17 -62 17 -133q0 -68 -16 -129zM257 253l234 -95q11 43 11 95q0 49 -12 99z" />
+<glyph unicode="&#x2223;" horiz-adv-x="288" d="M188 -189h-88v879h88v-879z" />
+<glyph unicode="&#x2224;" horiz-adv-x="411" d="M388 302l-138 -71v-420h-88v375l-108 -55l-31 69l139 71v419h88v-374l107 54z" />
+<glyph unicode="&#x2225;" horiz-adv-x="487" d="M188 -189h-88v879h88v-879zM387 -189h-88v879h88v-879z" />
+<glyph unicode="&#x2226;" horiz-adv-x="617" d="M594 354l-142 -72v-471h-88v426l-111 -57v-369h-88v324l-110 -56l-32 69l142 72v470h88v-425l111 56v369h88v-324l110 56z" />
+<glyph unicode="&#x2227;" horiz-adv-x="640" d="M588 -28h-94l-174 413l-174 -413h-94l234 564h68z" />
+<glyph unicode="&#x2228;" horiz-adv-x="640" d="M588 536l-234 -564h-68l-234 564h94l174 -413l174 413h94z" />
+<glyph unicode="&#x2229;" horiz-adv-x="650" d="M584 -33h-88v315q0 70 -50 120.5t-121 50.5t-121 -50.5t-50 -120.5v-315h-88v315q0 107 76 183t183 76t183 -76t76 -183v-315z" />
+<glyph unicode="&#x222a;" horiz-adv-x="650" d="M496 541h88v-315q0 -107 -76 -183t-183 -76t-183 76t-76 183v315h88v-315q0 -70 50 -120.5t121 -50.5t121 50.5t50 120.5v315z" />
+<glyph unicode="&#x222b;" horiz-adv-x="553" d="M234 -108l178 711q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-44 0 -87 -169l-178 -711q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24 q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170z" />
+<glyph unicode="&#x222c;" horiz-adv-x="863" d="M544 -108l178 711q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169l-178 -711q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24 q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170zM234 -108l178 711q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169l-178 -711 q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170z" />
+<glyph unicode="&#x222d;" horiz-adv-x="1174" d="M855 -108l178 711q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-45 0 -87 -169l-178 -711q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24 q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170zM544 -108l178 711q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169l-177 -711 q-22 -91 -86 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170zM234 -108l178 711q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13 t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-45 0 -87 -169l-178 -711q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170z" />
+<glyph unicode="&#x222e;" horiz-adv-x="591" d="M381 490l29 113q23 88 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-44 0 -87 -169l-38 -150q57 -31 91 -86.5t34 -121.5q0 -97 -69 -166t-166 -69h-1l-29 -118q-23 -92 -85 -156 q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34.5t-13.5 -21.5q0 -11 17 -11q44 0 87 170l39 155q-57 30 -91 85.5t-34 122.5q0 97 69 166t166 69zM478 410l-85 -337q72 5 121.5 57.5t49.5 124.5q0 48 -23.5 89 t-62.5 66zM284 100l84 338q-72 -5 -121 -58t-49 -125q0 -48 23 -89.5t63 -65.5z" />
+<glyph unicode="&#x222f;" horiz-adv-x="903" d="M689 469l33 134q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-45 0 -87 -169l-43 -172q143 -56 143 -185q0 -78 -58.5 -134t-183.5 -78l-36 -142q-23 -92 -85 -156q-64 -66 -147 -66 q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170l35 141q-13 -1 -41 -1q-77 0 -150 10l-35 -140q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13 t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170l45 179q-144 56 -144 185q0 79 58.5 135t184.5 77l34 135q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-45 0 -87 -169 l-33 -134q13 1 40 1q82 0 151 -11zM752 256l-40 -156q92 19 134.5 60t42.5 96q0 90 -104 134zM635 256l41 163q-60 9 -138 9q-37 0 -54 -1l-83 -334q59 -9 137 -9q37 0 54 1zM325 256l39 157q-177 -39 -177 -157q0 -90 104 -134z" />
+<glyph unicode="&#x2230;" horiz-adv-x="1214" d="M997 457l36 146q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-45 0 -87 -169l-46 -185q145 -55 145 -172q0 -150 -238 -198l-39 -156q-23 -92 -85 -156q-64 -66 -147 -66 q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170l37 148q-91 -8 -196 -8l-32 -130q-22 -91 -86 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33 q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170l36 142q-104 6 -189 20l-38 -152q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170l48 191 q-147 54 -147 173q0 149 240 199l37 148q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-45 0 -87 -169l-35 -141q90 8 195 8l31 123q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54 q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169l-34 -135q110 -6 190 -21zM1063 256l-36 -143q172 41 172 143q0 81 -105 123zM905 93l79 315q-77 14 -190 18l-85 -342q97 0 196 9zM593 86l85 342q-95 0 -196 -9l-79 -315 q79 -14 190 -18zM325 256l36 144q-174 -41 -174 -144q0 -81 107 -124z" />
+<glyph unicode="&#x2231;" horiz-adv-x="593" d="M353 366l59 237q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169l-67 -267q36 -16 66 -46q15 -15 37 -53q7 -14 14 -14q11 0 38 49l24 -12q-43 -68 -59 -125l-5 -2 q-56 34 -131 45l9 30q35 -11 59 -11q9 0 9 7q0 5 -4 11q-28 45 -70 68l-98 -391q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q44 0 87 170l106 421q-62 -11 -103 -58 t-41 -112h-52q0 90 60.5 154t148.5 69z" />
+<glyph unicode="&#x2232;" horiz-adv-x="593" d="M383 490l29 113q21 85 86 153t146 68q39 0 64 -19t25 -56q0 -33 -22.5 -56t-55.5 -23q-19 0 -33 13.5t-14 32.5q0 16 13.5 33t13.5 22q0 11 -17 11q-46 0 -87 -169l-38 -150q60 -32 102 -106q7 -11 11 -11q8 0 20.5 17.5t18.5 31.5l24 -12q-48 -80 -51 -130 q-5 -99 -71 -166t-165 -67l-29 -118q-21 -89 -84 -155.5t-148 -66.5q-38 0 -63.5 19.5t-25.5 56.5q0 33 22.5 56t55.5 23q19 0 33 -13.5t14 -32.5q0 -17 -13.5 -34t-13.5 -22q0 -11 17 -11q46 0 87 170l39 155q-58 31 -91.5 87t-33.5 121q0 97 69 166t166 69zM480 410 l-85 -337q73 4 123 58.5t48 128.5q-30 24 -92 41l9 28q32 -10 52 -10q16 0 16 9q-23 51 -71 82zM286 100l84 338q-72 -5 -121 -58t-49 -125q0 -47 23 -88.5t63 -66.5z" />
+<glyph unicode="&#x2233;" horiz-adv-x="593" d="M383 490l29 113q21 85 86 153t146 68q38 0 63.5 -19t25.5 -56q0 -33 -22.5 -56t-55.5 -23q-19 0 -33 13.5t-14 32.5q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169l-38 -150q47 -26 81 -72q39 -16 106 -31l-10 -28q-34 12 -51 12q-12 0 -12 -11q0 -10 5.5 -34 t5.5 -38q0 -100 -68 -170.5t-168 -70.5l-29 -118q-21 -89 -84 -155.5t-148 -66.5q-38 0 -63.5 19.5t-25.5 56.5q0 33 22.5 56t55.5 23q19 0 33 -13.5t14 -32.5q0 -17 -13.5 -34.5t-13.5 -21.5q0 -11 17 -11q46 0 87 170l39 155q-58 31 -91.5 87t-33.5 121q0 97 69 166 t166 69zM480 410l-85 -337q73 4 122 57.5t49 126.5q0 58 -16 58q-14 0 -44 -59l-25 14q33 47 47 97q-23 28 -48 43zM286 100l84 338q-72 -5 -121 -58t-49 -125q0 -47 23 -88.5t63 -66.5z" />
+<glyph unicode="&#x2234;" d="M460 488q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM685 46q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM240 46q0 -36 -25.5 -61.5t-61.5 -25.5 t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5z" />
+<glyph unicode="&#x2235;" d="M685 488q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM240 488q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM460 46q0 -36 -25.5 -61.5t-61.5 -25.5 t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5z" />
+<glyph unicode="&#x2236;" horiz-adv-x="554" d="M364 488q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM364 46q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5z" />
+<glyph unicode="&#x2237;" d="M242 488q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM242 46q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM683 488q0 -36 -25.5 -61.5t-61.5 -25.5 t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM683 46q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5z" />
+<glyph unicode="&#x2238;" d="M685 209h-619v88h619v-88zM456 461q0 -34 -24 -58t-58 -24t-58 24t-24 58t24 58t58 24t58 -24t24 -58z" />
+<glyph unicode="&#x2239;" d="M686 461q0 -34 -24 -58t-58 -24t-58 24t-24 58t24 58t58 24t58 -24t24 -58zM686 45q0 -34 -24 -58t-58 -24t-58 24t-24 58t24 58t58 24t58 -24t24 -58zM475 209h-409v88h409v-88z" />
+<glyph unicode="&#x223a;" d="M685 488q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM685 46q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM240 488q0 -36 -25.5 -61.5t-61.5 -25.5 t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM240 46q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM685 215h-619v104h619v-104z" />
+<glyph unicode="&#x223b;" d="M457 481q0 -34 -24.5 -58.5t-59.5 -24.5t-59 24t-24 59t24.5 59.5t58.5 24.5q35 0 59.5 -24.5t24.5 -59.5zM628 374h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59 t71 -29.5q80 0 114 136zM457 24q0 -34 -24.5 -58.5t-59.5 -24.5t-59 24.5t-24 58.5q0 35 24.5 59.5t58.5 24.5q35 0 59.5 -25t24.5 -59z" />
+<glyph unicode="&#x223c;" d="M628 374h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136z" />
+<glyph unicode="&#x223d;" d="M682 132h-54q-34 136 -114 136q-28 0 -74.5 -29.5t-100.5 -59t-98 -29.5q-75 0 -121.5 68.5t-52.5 155.5h54q34 -136 114 -136q26 0 71 29.5t98.5 59t98.5 29.5q77 0 125.5 -65t53.5 -159z" />
+<glyph unicode="&#x223e;" d="M532 326v93q24 0 48.5 -8t48.5 -25t39 -51t15 -79q0 -74 -44 -122.5t-103 -48.5q-93 0 -155 104q-81 137 -167 137q-44 0 -69 -20t-25 -57q0 -35 28.5 -53t75.5 -18v-93q-74 0 -115 52t-41 113q0 71 46 120t106 49q95 0 163 -109q50 -80 82.5 -106t77.5 -26q40 0 64 19.5 t24 54.5q0 74 -99 74z" />
+<glyph unicode="&#x223f;" d="M594 279l90 -10q0 -82 -46 -142t-123 -60q-160 0 -191 204q-9 59 -30.5 84t-60.5 25q-36 0 -56.5 -32t-20.5 -76l-90 10q0 82 45.5 142t121.5 60q89 0 135.5 -58t57.5 -146q7 -58 29 -83.5t61 -25.5q37 0 57.5 32t20.5 76z" />
+<glyph unicode="&#x2240;" horiz-adv-x="348" d="M295 14v-54q-96 5 -169 54t-73 125q0 45 34.5 102t69 105t34.5 72q0 38 -35.5 61.5t-102.5 40.5v55q56 -4 109 -23.5t93 -59.5t40 -91q0 -45 -34.5 -101.5t-69 -105t-34.5 -71.5q0 -75 138 -109z" />
+<glyph unicode="&#x2241;" d="M628 374h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-54 0 -129 46l-77 -134h-76l98 169q-58 37 -89 37q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q54 0 125 -44l76 132h76l-97 -167q60 -39 88 -39q80 0 114 136z" />
+<glyph unicode="&#x2242;" d="M682 375h-614v88h614v-88zM629 287h54q-3 -55 -22 -104t-60 -84.5t-97 -35.5q-41 0 -95 29.5t-101 59t-72 29.5q-81 0 -114 -136h-54q3 52 22 101t59 86t93 37q43 0 96.5 -29.5t101.5 -59t75 -29.5q81 0 114 136z" />
+<glyph unicode="&#x2243;" d="M629 463h54q-3 -52 -22 -101t-59 -86t-93 -37q-43 0 -96.5 29.5t-101.5 59t-75 29.5q-81 0 -114 -136h-54q3 55 22 104t60 84.5t97 35.5q41 0 95 -29.5t101 -59t72 -29.5q81 0 114 136zM682 45h-614v88h614v-88z" />
+<glyph unicode="&#x2244;" d="M683 36h-364l-40 -90h-72l40 90h-178v88h216l72 166l-20 13l-27 17q-9 6 -24 14t-27.5 12t-22.5 4q-81 0 -114 -136h-54q3 52 22 101t59 86t93 37q58 0 153 -61l67 153h72l-82 -186q42 -24 63 -24q81 0 114 136h54q-3 -55 -22 -104t-60 -84.5t-97 -35.5q-39 0 -89 26 l-58 -134h326v-88z" />
+<glyph unicode="&#x2245;" d="M629 568h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM682 144h-614v88h614v-88zM682 -60h-614v88h614v-88z" />
+<glyph unicode="&#x2246;" d="M629 568h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM682 -60h-391l-46 -90h-80l46 90h-143v88h188l58 116h-246v88h290l39 79h80l-39 -79 h244v-88h-289l-58 -116h347v-88z" />
+<glyph unicode="&#x2247;" d="M629 568h54q-3 -52 -22 -101t-59 -86t-93 -37q-25 0 -55 10l-61 -122h289v-88h-334l-58 -116h392v-88h-437l-46 -92h-79l46 92h-98v88h143l58 116h-201v88h245l77 152q-7 4 -33 21l-43 27q-17 11 -40 20.5t-38 9.5q-81 0 -114 -136h-54q3 55 22 104t60 84.5t97 35.5 q14 0 27.5 -2t29.5 -8.5t26 -10t28.5 -15t24 -14.5t26.5 -17t23 -15l87 174h80l-104 -207q11 -3 20 -3q81 0 114 136z" />
+<glyph unicode="&#x2248;" d="M629 268h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM629 508h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5 q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136z" />
+<glyph unicode="&#x2249;" d="M629 268h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-27 0 -59 12t-52 23.5t-54 33.5l-71 -161h-72l86 195q-30 15 -51 15q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q36 0 77 -18l46 104l-28 18q-23 15 -31.5 20t-25 13.5t-27.5 11.5t-22 3q-80 0 -114 -136h-54 q5 94 53.5 159t125.5 65q26 0 57.5 -11.5t50.5 -22.5l53 -32l70 159h72l-85 -195q29 -16 50 -16q80 0 114 136h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-38 0 -81 20l-46 -104q10 -6 36 -23t38 -24t29.5 -14t29.5 -7q80 0 114 136z" />
+<glyph unicode="&#x224a;" d="M629 328h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM629 568h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5 q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM682 -75h-614v88h614v-88z" />
+<glyph unicode="&#x224b;" d="M629 133h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM629 373h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5 q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM629 613h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5 q80 0 114 136z" />
+<glyph unicode="&#x224c;" d="M683 326h-54q-34 136 -114 136q-28 0 -74.5 -29.5t-100.5 -59t-98 -29.5q-75 0 -121.5 68.5t-52.5 155.5h54q34 -136 114 -136q26 0 71 29.5t98.5 59t98.5 29.5q77 0 125.5 -65t53.5 -159zM682 144h-614v88h614v-88zM682 -60h-614v88h614v-88z" />
+<glyph unicode="&#x224d;" d="M683 517v-54q-35 -70 -118.5 -114t-188.5 -44q-107 0 -188.5 43.5t-119.5 114.5v55q64 -59 147 -92t161 -33q161 0 307 124zM683 42v-55q-137 128 -307 128q-85 0 -167 -31t-141 -97v55q39 72 120.5 118.5t187.5 46.5q104 0 187.5 -47t119.5 -118z" />
+<glyph unicode="&#x224e;" d="M683 311h-223q-4 37 -25.5 61t-57.5 24t-59 -24t-27 -61h-223v88h169q39 85 138 85q45 0 85.5 -22.5t53.5 -62.5h169v-88zM683 107h-169q-13 -40 -53.5 -62.5t-85.5 -22.5q-99 0 -138 85h-169v88h223q4 -37 27 -61t59 -24t57.5 24t25.5 61h223v-88z" />
+<glyph unicode="&#x224f;" d="M683 311h-223q-4 37 -25.5 61t-57.5 24t-59 -24t-27 -61h-223v88h169q39 85 138 85q45 0 85.5 -22.5t53.5 -62.5h169v-88zM683 107h-615v88h615v-88z" />
+<glyph unicode="&#x2250;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM458 583q0 -35 -24 -59t-59 -24t-59.5 24.5t-24.5 58.5q0 35 24.5 59.5t59.5 24.5q34 0 58.5 -24.5t24.5 -59.5z" />
+<glyph unicode="&#x2251;" d="M458 583q0 -35 -24 -59t-59 -24t-59.5 24.5t-24.5 58.5q0 35 24.5 59.5t59.5 24.5q34 0 58.5 -24.5t24.5 -59.5zM682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM458 -77q0 -35 -24.5 -59.5t-58.5 -24.5q-35 0 -59.5 24.5t-24.5 59.5q0 34 24.5 58.5t59.5 24.5 t59 -24t24 -59z" />
+<glyph unicode="&#x2252;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM235 583q0 -35 -24.5 -59t-58.5 -24q-35 0 -59.5 24.5t-24.5 58.5q0 35 25 59.5t59 24.5t58.5 -24.5t24.5 -59.5zM682 -77q0 -35 -24.5 -59.5t-58.5 -24.5q-35 0 -59.5 24.5t-24.5 59.5q0 34 24.5 58.5t59.5 24.5 t59 -24t24 -59z" />
+<glyph unicode="&#x2253;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM682 583q0 -34 -24.5 -58.5t-59.5 -24.5q-34 0 -58.5 24t-24.5 59t24.5 59.5t58.5 24.5t59 -24.5t25 -59.5zM235 -77q0 -35 -24.5 -59.5t-59.5 -24.5q-34 0 -58.5 24.5t-24.5 59.5t24 59t59 24t59.5 -24.5t24.5 -58.5 z" />
+<glyph unicode="&#x2254;" horiz-adv-x="932" d="M864 311h-569v88h569v-88zM864 107h-569v88h569v-88zM235 399q0 -34 -24.5 -58.5t-59.5 -24.5t-59 24t-24 59t24.5 59.5t58.5 24.5q35 0 59.5 -24.5t24.5 -59.5zM235 133q0 -34 -24.5 -58.5t-59.5 -24.5t-59 24t-24 59t24.5 59.5t58.5 24.5q35 0 59.5 -24.5t24.5 -59.5z " />
+<glyph unicode="&#x2255;" horiz-adv-x="932" d="M864 399q0 -35 -24 -59t-59 -24t-59.5 24.5t-24.5 58.5q0 35 24.5 59.5t59.5 24.5q34 0 58.5 -24.5t24.5 -59.5zM864 133q0 -35 -24 -59t-59 -24t-59.5 24.5t-24.5 58.5q0 35 24.5 59.5t59.5 24.5q34 0 58.5 -24.5t24.5 -59.5zM637 311h-569v88h569v-88zM637 107h-569v88 h569v-88z" />
+<glyph unicode="&#x2256;" d="M682 63h-614v88h212q-55 45 -55 116t55 116h-212v88h614v-88h-212q55 -45 55 -116t-55 -116h212v-88zM459 267q0 35 -24.5 59.5t-59.5 24.5t-59.5 -24.5t-24.5 -59.5t24.5 -59.5t59.5 -24.5t59.5 24.5t24.5 59.5z" />
+<glyph unicode="&#x2257;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM525 659q0 -62 -44 -106t-106 -44t-106 44t-44 106t44 106t106 44t106 -44t44 -106zM459 659q0 35 -24.5 59.5t-59.5 24.5t-59.5 -24.5t-24.5 -59.5t24.5 -59.5t59.5 -24.5t59.5 24.5t24.5 59.5z" />
+<glyph unicode="&#x2258;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM619 558l-29 -15q-59 70 -108 100t-105 30q-66 0 -115.5 -30.5t-100.5 -99.5l-31 13q36 96 100.5 150.5t144.5 54.5q88 0 150.5 -53t93.5 -150z" />
+<glyph unicode="&#x2259;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM594 467h-77l-142 242l-143 -242h-76l219 369z" />
+<glyph unicode="&#x225a;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM594 836l-219 -369l-219 369h76l143 -242l142 242h77z" />
+<glyph unicode="&#x225b;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM571 690l-96 -82q-8 -6 -8 -15q0 -2 2 -7.5t2 -7.5l20 -109l-99 62q-10 5 -15 5q-9 0 -17 -5l-104 -62l31 105q0 1 1.5 6.5t1.5 7.5q0 10 -9 17l-100 85l118 9q21 1 29 21l47 121l49 -121q5 -11 9.5 -15t16.5 -5z" />
+<glyph unicode="&#x225c;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM594 475h-438l219 369zM479 541l-104 176l-104 -176h208z" />
+<glyph unicode="&#x225d;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM539 718h30q0 69 20 94q21 26 71 26q33 0 54 -14.5t21 -37.5q0 -14 -9 -23.5t-24 -9.5q-13 0 -22 8.5t-9 20.5q0 11 5.5 19.5t5.5 10.5q0 10 -15 10q-14 0 -20 -9t-6 -32v-63h45v-23h-45v-161q0 -26 8 -34t35 -9v-13 h-145v13q18 2 24 8.5t6 24.5v171h-30v23zM515 542l12 -7q-23 -37 -46 -51.5t-57 -14.5q-47 0 -77 34.5t-30 88.5q0 58 30.5 94t79.5 36q43 0 66 -26q28 -29 31 -93h-132q3 -45 15.5 -70.5t47.5 -25.5q29 0 60 35zM460 623v11q0 38 -5 48q-11 24 -28 24q-37 0 -37 -83h70z M321 487l-33 -4q-34 -4 -69 -13v33q-33 -34 -69 -34q-41 0 -68 34t-27 88q0 56 28.5 93.5t71.5 37.5q33 0 62 -32v95q0 19 -6.5 24t-32.5 7v12h112v-299q0 -17 6.5 -23t24.5 -7v-12zM217 535v126q-11 32 -40 32q-45 0 -45 -98q0 -97 41 -97q19 0 34 20q10 10 10 17z" />
+<glyph unicode="&#x225e;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM579 478h-119v12q14 1 19.5 7.5t5.5 22.5v119q0 48 -27 48q-15 0 -29.5 -12.5t-14.5 -23.5v-131q0 -16 4.5 -22.5t18.5 -7.5v-12h-117v12q14 1 19.5 7.5t5.5 22.5v125q0 42 -30 42q-14 0 -28 -13t-14 -23v-131 q0 -15 5 -21.5t18 -8.5v-12h-120v12q16 2 22 9t6 23v149q0 17 -5.5 23t-22.5 8v13h95v-38h2q27 44 73 44q45 0 66 -44q37 44 75 44q32 0 49.5 -19t17.5 -53v-129q0 -17 5 -23t20 -7v-12z" />
+<glyph unicode="&#x225f;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM374 593v19q0 30 28.5 75.5t28.5 74.5q0 40 -15 62t-43 22q-19 0 -31 -7t-12 -18q0 -8 11 -20q16 -16 16 -33t-14.5 -30t-31.5 -13q-21 0 -33.5 14.5t-12.5 36.5q0 41 36.5 72.5t92.5 31.5q65 0 103 -30.5t38 -77.5 q0 -35 -18.5 -60.5t-65.5 -51.5q-48 -27 -48 -67h-29zM447 508q0 -25 -17 -42.5t-42 -17.5q-26 0 -43 17.5t-17 42.5t17.5 42t42.5 17q24 0 41.5 -17.5t17.5 -41.5z" />
+<glyph unicode="&#x2260;" d="M682 107h-336l-115 -263h-69l115 263h-209v88h247l51 116h-298v88h336l115 263h69l-115 -263h209v-88h-247l-51 -116h298v-88z" />
+<glyph unicode="&#x2261;" d="M682 419h-614v88h614v-88zM682 223h-614v88h614v-88zM682 27h-614v88h614v-88z" />
+<glyph unicode="&#x2262;" d="M682 27h-371l-80 -183h-69l80 183h-174v88h212l47 108h-259v88h298l47 108h-345v88h383l79 181h69l-79 -181h162v-88h-200l-47 -108h247v-88h-286l-47 -108h333v-88z" />
+<glyph unicode="&#x2263;" d="M682 504h-614v88h614v-88zM682 317h-614v88h614v-88zM682 130h-614v88h614v-88zM682 -57h-614v88h614v-88z" />
+<glyph unicode="&#x2264;" d="M670 68l-590 258v40l590 261v-89l-436 -192l436 -190v-88zM670 -120l-590 -1v88h590v-87z" />
+<glyph unicode="&#x2265;" d="M670 327l-590 -258v88l436 190l-436 192v88l590 -260v-40zM670 -120h-590v88h590v-88z" />
+<glyph unicode="&#x2266;" d="M670 171l-590 258v40l590 260v-88l-436 -192l436 -190v-88zM670 -18h-590v88h590v-88zM670 -222h-590v88h590v-88z" />
+<glyph unicode="&#x2267;" d="M670 -18h-590v88h590v-88zM670 429l-590 -258v88l436 190l-436 192v88l590 -260v-40zM670 -222h-590v88h590v-88z" />
+<glyph unicode="&#x2268;" d="M670 171l-590 258v40l590 260v-88l-436 -192l436 -190v-88zM670 -222h-334l-39 -72h-77l39 72h-179v88h226l62 116h-288v88h335l38 72h77l-38 -72h178v-88h-225l-62 -116h287v-88z" />
+<glyph unicode="&#x2269;" d="M670 429l-590 -258v88l436 190l-436 192v88l590 -260v-40zM670 -222h-334l-39 -72h-77l39 72h-179v88h226l62 116h-288v88h335l38 72h77l-38 -72h178v-88h-225l-62 -116h287v-88z" />
+<glyph unicode="&#x226a;" horiz-adv-x="1000" d="M628 -24l-590 258v40l590 260v-88l-436 -192l436 -190v-88zM961 -24l-590 258v40l590 260v-88l-436 -192l436 -190v-88z" />
+<glyph unicode="&#x226b;" horiz-adv-x="1000" d="M628 234l-590 -258v88l436 190l-436 192v88l590 -260v-40zM961 234l-590 -258v88l436 190l-436 192v88l590 -260v-40z" />
+<glyph unicode="&#x226c;" horiz-adv-x="417" d="M306 732v-27q-40 -33 -70 -71q135 -146 135 -362q0 -218 -136 -365q27 -36 71 -72v-28q-55 32 -98 72q-44 -41 -97 -72v27q45 37 70 72q-135 144 -135 361q0 218 136 366q-31 39 -71 71v28q54 -30 98 -71q46 41 97 71zM258 273q0 119 -9.5 191t-40.5 128 q-31 -56 -40 -128.5t-9 -197.5q0 -123 9 -193t40 -126q31 57 40.5 129.5t9.5 196.5z" />
+<glyph unicode="&#x226d;" d="M683 42v-55q-137 128 -307 128q-20 0 -31 -1l-101 -201h-79l94 187q-118 -31 -191 -113v55q32 60 95.5 103.5t146.5 56.5l52 103q-102 3 -180 46.5t-114 111.5v55q64 -59 147 -92t161 -33q21 0 31 1l99 197h80l-90 -179q100 31 187 105v-54q-29 -58 -92.5 -99t-146.5 -54 l-52 -103q99 -4 178 -50.5t113 -114.5z" />
+<glyph unicode="&#x226e;" d="M670 -24l-303 133l-67 -224h-73l76 252l-223 97v40l305 134l65 217h73l-54 -180l201 89v-88l-231 -101l-48 -159l279 -122v-88zM354 307l-120 -53l92 -40z" />
+<glyph unicode="&#x226f;" d="M670 234l-305 -133l-65 -216h-73l54 179l-201 -88v88l231 101l48 159l-279 122v88l302 -133l68 224h73l-76 -253l223 -98v-40zM516 254l-92 41l-29 -94z" />
+<glyph unicode="&#x2270;" d="M670 -120h-357l-35 -115h-73l35 115h-160v88h186l74 245l-260 114v40l353 156l59 194h73l-47 -157l152 67v-88l-183 -81l-59 -196l242 -105v-88l-265 116l-66 -217h331v-88zM403 421l-169 -74l129 -56z" />
+<glyph unicode="&#x2271;" d="M670 -120h-357l-35 -115h-73l35 115h-160v88h186l64 210l-250 -109v88l280 122l36 121l-316 139v88l340 -150l72 240h73l-81 -268l186 -82v-40l-256 -112l-75 -247h331v-88zM516 347l-55 24l-17 -55z" />
+<glyph unicode="&#x2272;" d="M667 132l-590 260v40l590 258v-88l-436 -190l436 -192v-88zM628 60h54q-5 -94 -53.5 -159t-125.5 -65q-45 0 -98.5 29.5t-98.5 59t-71 29.5q-80 0 -114 -136h-54q6 87 52.5 155.5t121.5 68.5q44 0 98 -29.5t100.5 -59t74.5 -29.5q80 0 114 136z" />
+<glyph unicode="&#x2273;" d="M667 392l-590 -260v88l436 192l-436 190v88l590 -258v-40zM628 60h54q-5 -94 -53.5 -159t-125.5 -65q-45 0 -98.5 29.5t-98.5 59t-71 29.5q-80 0 -114 -136h-54q6 87 52.5 155.5t121.5 68.5q44 0 98 -29.5t100.5 -59t74.5 -29.5q80 0 114 136z" />
+<glyph unicode="&#x2274;" d="M628 60h54q-5 -94 -53.5 -159t-125.5 -65q-20 0 -39.5 4.5t-42.5 16.5l-36 19q-13 7 -40 24l-33 22l-61 -204h-73l71 234q-10 2 -14 2q-80 0 -114 -136h-54q6 87 52.5 155.5t121.5 68.5q18 0 33 -4l71 236l-268 118v40l364 159l57 189h73l-46 -152l142 62v-88l-172 -75 l-62 -204l234 -103v-88l-257 113l-70 -232q23 -12 61 -37t65 -38.5t48 -13.5q80 0 114 136zM411 490l-180 -78l138 -61z" />
+<glyph unicode="&#x2275;" d="M628 60h54q-5 -94 -53.5 -159t-125.5 -65q-20 0 -39.5 4.5t-42.5 16.5l-36 19q-13 7 -40 24l-33 22l-61 -204h-73l71 234q-10 2 -14 2q-80 0 -114 -136h-54q6 87 52.5 155.5t121.5 68.5q18 0 33 -4l63 209l-260 -115v88l291 128l34 112l-325 142v88l348 -152l73 242h73 l-81 -270l177 -78v-40l-246 -108l-81 -271q23 -12 61 -37t65 -38.5t48 -13.5q80 0 114 136zM513 412l-47 20l-14 -47z" />
+<glyph unicode="&#x2276;" d="M670 32l-590 -258v88l436 190l-436 192v88l590 -260v-40zM670 176l-590 258v40l590 260v-88l-436 -192l436 -190v-88z" />
+<glyph unicode="&#x2277;" d="M670 434l-590 -258v88l436 190l-436 192v88l590 -260v-40zM670 -226l-590 258v40l590 260v-88l-436 -192l436 -190v-88z" />
+<glyph unicode="&#x2278;" d="M670 32l-363 -159l-57 -189h-73l46 152l-143 -62v88l173 76l61 203l-234 103v88l258 -114l27 91l-285 125v40l386 170l54 180h73l-43 -143l120 53v-88l-150 -66l-67 -221l217 -95v-88l-240 105l-28 -91l268 -118v-40zM435 543l-201 -89l154 -67zM516 52l-137 60l-42 -138 z" />
+<glyph unicode="&#x2279;" d="M670 -226l-347 152l-73 -242h-73l81 270l-178 78v40l246 109l36 118l-282 -123v88l312 136l29 96l-341 150v88l365 -161l75 251h73l-84 -279l161 -71v-40l-224 -98l-35 -118l259 114v-88l-290 -128l-34 -113l324 -141v-88zM516 454l-30 13l-10 -30zM296 79l-62 -27 l47 -21z" />
+<glyph unicode="&#x227a;" d="M670 98v-121q-94 98 -227 154.5t-279 70.5l-84 8v88l84 8q146 14 279 70.5t227 154.5v-121q-107 -98 -299 -156q192 -58 299 -156z" />
+<glyph unicode="&#x227b;" d="M670 210l-84 -8q-146 -14 -279 -70.5t-227 -154.5v121q107 98 299 156q-192 58 -299 156v121q94 -98 227 -154.5t279 -70.5l84 -8v-88z" />
+<glyph unicode="&#x227c;" d="M670 212v-121q-94 98 -227 154.5t-279 70.5l-84 8v88l84 8q146 14 279 70.5t227 154.5v-121q-107 -98 -299 -156q192 -58 299 -156zM670 -17v-121q-95 98 -227.5 154.5t-278.5 70.5l-84 8v88q188 -8 325 -55q171 -59 265 -145z" />
+<glyph unicode="&#x227d;" d="M670 324l-84 -8q-146 -14 -279 -70.5t-227 -154.5v121q107 98 299 156q-192 58 -299 156v121q94 -98 227 -154.5t279 -70.5l84 -8v-88zM670 95l-84 -8q-146 -14 -278.5 -70.5t-227.5 -154.5v121q94 86 265 145q137 47 325 55v-88z" />
+<glyph unicode="&#x227e;" d="M670 243v-121q-94 98 -227 154.5t-279 70.5l-84 8v88l84 8q146 14 279 70.5t227 154.5v-121q-107 -98 -299 -156q192 -58 299 -156zM628 73h54q-5 -94 -53.5 -159t-125.5 -65q-45 0 -98.5 29.5t-98.5 59t-71 29.5q-80 0 -114 -136h-54q6 87 52.5 155.5t121.5 68.5 q44 0 98 -29.5t100.5 -59t74.5 -29.5q80 0 114 136z" />
+<glyph unicode="&#x227f;" d="M670 355l-84 -8q-146 -14 -279 -70.5t-227 -154.5v121q107 98 299 156q-192 58 -299 156v121q94 -98 227 -154.5t279 -70.5l84 -8v-88zM628 73h54q-5 -94 -53.5 -159t-125.5 -65q-45 0 -98.5 29.5t-98.5 59t-71 29.5q-80 0 -114 -136h-54q6 87 52.5 155.5t121.5 68.5 q44 0 98 -29.5t100.5 -59t74.5 -29.5q80 0 114 136z" />
+<glyph unicode="&#x2280;" d="M670 98v-121q-111 115 -279 175l-81 -267h-73l87 288q-82 22 -160 29l-84 8v88l84 8q109 11 214 45l82 274h73l-72 -241q125 60 209 147v-121q-85 -78 -243 -137l-10 -34q162 -58 253 -141z" />
+<glyph unicode="&#x2281;" d="M670 210l-84 -8q-96 -9 -192 -38l-84 -279h-73l75 249q-138 -59 -232 -157v121q95 86 265 145l6 20q-176 60 -271 147v121q117 -121 297 -181l83 275h73l-89 -295q70 -16 142 -24l84 -8v-88z" />
+<glyph unicode="&#x2282;" d="M668 -13h-298q-128 0 -208 81t-80 199q0 119 80.5 199.5t210.5 80.5h295v-88h-311q-76 0 -131.5 -56t-55.5 -136t56 -136t132 -56h310v-88z" />
+<glyph unicode="&#x2283;" d="M82 547h295q130 0 210.5 -80.5t80.5 -199.5q0 -118 -80 -199t-208 -81h-298v88h310q76 0 132 56t56 136t-55.5 136t-131.5 56h-311v88z" />
+<glyph unicode="&#x2284;" d="M668 -13h-298q-36 0 -73 8l-58 -141h-69l66 162q-72 34 -113 101t-41 150q0 119 80.5 199.5t210.5 80.5h82l55 133h69l-55 -133h144v-88h-180l-157 -382q18 -2 27 -2h310v-88zM419 459h-62q-76 0 -131.5 -56t-55.5 -136q0 -54 27.5 -99t72.5 -70z" />
+<glyph unicode="&#x2285;" d="M579 680l-67 -162q73 -34 114.5 -101t41.5 -150q0 -118 -80 -199t-208 -81h-86l-55 -133h-69l55 133h-143v88h179l157 382q-16 2 -25 2h-311v88h295q38 0 75 -8l58 141h69zM330 75h62q76 0 132 56t56 136q0 54 -28 99.5t-73 70.5z" />
+<glyph unicode="&#x2286;" d="M668 87h-298q-128 0 -208 81t-80 199q0 119 80.5 199.5t210.5 80.5h295v-88h-311q-76 0 -131.5 -56t-55.5 -136t56 -136t132 -56h310v-88zM668 -101h-586v88h586v-88z" />
+<glyph unicode="&#x2287;" d="M82 647h295q130 0 210.5 -80.5t80.5 -199.5q0 -118 -80 -199t-208 -81h-298v88h310q76 0 132 56t56 136t-55.5 136t-131.5 56h-311v88zM668 -101h-586v88h586v-88z" />
+<glyph unicode="&#x2288;" d="M668 -101h-413l-41 -100h-69l41 100h-104v88h141l47 115q-87 28 -137.5 100.5t-50.5 164.5q0 119 80.5 199.5t210.5 80.5h122l41 100h69l-41 -100h104v-88h-141l-158 -384h299v-88h-298q-14 0 -36 2l-42 -102h376v-88zM458 559h-101q-76 0 -131.5 -56t-55.5 -136 q0 -65 38 -115.5t96 -68.5z" />
+<glyph unicode="&#x2289;" d="M668 -101h-413l-41 -100h-69l41 100h-104v88h141l41 100h-182v88h218l154 373q-30 11 -61 11h-311v88h295q61 0 110 -18l49 118h69l-60 -146q58 -37 90.5 -99t32.5 -135q0 -118 -80 -199t-208 -81h-47l-41 -100h376v-88zM369 175h23q76 0 132 56t56 136q0 91 -70 149z " />
+<glyph unicode="&#x228a;" d="M668 174h-298q-128 0 -208 81t-80 199q0 119 80.5 199.5t210.5 80.5h295v-88h-311q-76 0 -131.5 -56t-55.5 -136t56 -136t132 -56h310v-88zM668 -94h-270l-65 -106h-78l65 106h-228v88h281l64 105h78l-64 -105h217v-88z" />
+<glyph unicode="&#x228b;" d="M82 734h295q130 0 210.5 -80.5t80.5 -199.5q0 -118 -80 -199t-208 -81h-298v88h310q76 0 132 56t56 136t-55.5 136t-131.5 56h-311v88zM658 -94h-270l-65 -106h-78l65 106h-228v88h281l64 105h78l-64 -105h217v-88z" />
+<glyph unicode="&#x228c;" horiz-adv-x="650" d="M496 541h88v-315q0 -107 -76 -183t-183 -76t-183 76t-76 183v315h88v-315q0 -70 50 -120.5t121 -50.5t121 50.5t50 120.5v315zM462 270h-80q-33 0 -33 -13q0 -10 19 -33q24 -30 43 -66l-36 -26q-36 49 -54 70.5t-53 49.5t-81 47v12q35 14 61 30.5t49.5 41t36.5 40.5 l40 54l37 -26q-26 -44 -44 -66q-18 -23 -18 -32q0 -13 32 -13h81v-70z" />
+<glyph unicode="&#x228d;" horiz-adv-x="650" d="M496 541h88v-315q0 -107 -76 -183t-183 -76t-183 76t-76 183v315h88v-315q0 -70 50 -120.5t121 -50.5t121 50.5t50 120.5v315zM394 306q0 -28 -20.5 -48.5t-48.5 -20.5q-29 0 -49 20.5t-20 48.5t20 48.5t49 20.5q28 0 48.5 -20.5t20.5 -48.5z" />
+<glyph unicode="&#x228e;" horiz-adv-x="650" d="M496 541h88v-315q0 -107 -76 -183t-183 -76t-183 76t-76 183v315h88v-315q0 -70 50 -120.5t121 -50.5t121 50.5t50 120.5v315zM446 275h-91v-91h-60v91h-91v60h91v91h60v-91h91v-60z" />
+<glyph unicode="&#x228f;" d="M663 -27h-576v559h576v-88h-488v-383h488v-88z" />
+<glyph unicode="&#x2290;" d="M663 -27h-576v88h488v383h-488v88h576v-559z" />
+<glyph unicode="&#x2291;" d="M663 85h-576v559h576v-88h-488v-383h488v-88zM663 -93h-576v88h576v-88z" />
+<glyph unicode="&#x2292;" d="M663 85h-576v88h488v383h-488v88h576v-559zM663 -93h-576v88h576v-88z" />
+<glyph unicode="&#x2293;" horiz-adv-x="650" d="M584 -33h-88v486h-342v-486h-88v574h518v-574z" />
+<glyph unicode="&#x2294;" horiz-adv-x="650" d="M584 -33h-518v574h88v-486h342v486h88v-574z" />
+<glyph unicode="&#x2295;" horiz-adv-x="864" d="M814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM476 296h247q-14 95 -83 164t-164 83v-247zM723 208h-247v-247q95 14 164 83t83 164zM388 296v247q-95 -14 -164 -83t-83 -164h247zM388 -39v247h-247q14 -95 83 -164t164 -83 z" />
+<glyph unicode="&#x2296;" horiz-adv-x="864" d="M814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM141 296h582q-16 107 -98.5 178.5t-192.5 71.5t-192.5 -71.5t-98.5 -178.5zM723 208h-582q16 -107 98.5 -178.5t192.5 -71.5t192.5 71.5t98.5 178.5z" />
+<glyph unicode="&#x2297;" horiz-adv-x="864" d="M814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM432 314l174 175q-77 57 -174 57t-174 -57zM494 252l175 -174q57 77 57 174t-57 174zM370 252l-175 174q-57 -77 -57 -174t57 -174zM606 15l-174 175l-174 -175 q77 -57 174 -57t174 57z" />
+<glyph unicode="&#x2298;" horiz-adv-x="864" d="M814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM195 78l411 411q-76 57 -174 57q-122 0 -208 -86t-86 -208q0 -98 57 -174zM669 426l-411 -411q76 -57 174 -57q122 0 208 86t86 208q0 98 -57 174z" />
+<glyph unicode="&#x2299;" horiz-adv-x="784" d="M466 253q0 -30 -20.5 -52.5t-53.5 -22.5t-54 20.5t-21 54.5q0 32 23 53t52 21q30 0 52 -21t22 -53zM734 252q0 -142 -100 -242t-242 -100t-242 100t-100 242t100 242t242 100t242 -100t100 -242zM646 252q0 105 -74.5 179.5t-179.5 74.5t-179.5 -74.5t-74.5 -179.5 t74.5 -179.5t179.5 -74.5t179.5 74.5t74.5 179.5z" />
+<glyph unicode="&#x229a;" horiz-adv-x="842" d="M576 252q0 -65 -46 -111t-111 -46q-66 0 -111.5 46t-45.5 113q0 66 46 110.5t113 44.5q64 0 109.5 -46t45.5 -111zM488 252q0 29 -20 49t-47 20q-31 0 -51 -19.5t-20 -47.5q0 -31 19.5 -51t49.5 -20q29 0 49 20t20 49zM803 252q0 -158 -112 -270t-270 -112t-270 112 t-112 270t112 270t270 112t270 -112t112 -270zM715 252q0 122 -86.5 208t-207.5 86t-207.5 -86t-86.5 -208t86.5 -208t207.5 -86t207.5 86t86.5 208z" />
+<glyph unicode="&#x229b;" horiz-adv-x="864" d="M634 165q0 -24 -13 -39t-41 -15q-9 0 -17.5 3.5t-12.5 5.5t-13 12l-10 10q-1 1 -10 13q-33 42 -63 62q2 -30 26 -105q5 -18 5 -32q0 -21 -16.5 -38.5t-36.5 -17.5t-36.5 17.5t-16.5 38.5q0 10 17 67q11 38 15 70q-13 -10 -25.5 -22t-28 -29.5t-22.5 -24.5 q-28 -30 -58 -30q-23 0 -37.5 13.5t-14.5 32.5q0 14 5 25t10 17.5t18.5 12.5t19 7.5t23.5 6t21 5.5q42 10 64 21q-20 9 -58.5 18.5t-43.5 10.5q-59 16 -59 55q0 24 12.5 40.5t38.5 16.5q10 0 19.5 -3.5t19 -11l15.5 -12.5l15 -16q10 -11 13 -15q31 -33 53 -47q-1 18 -4.5 34 t-12 43.5t-9.5 31.5q-6 22 -6 32q0 22 16.5 37t36.5 15t36.5 -15t16.5 -37q0 -14 -16 -67q-12 -37 -15 -73q11 7 19.5 13.5t16.5 15.5l13 12q4 4 14 16l14 18q22 29 52 29q25 0 38 -15.5t13 -41.5q0 -21 -17 -35t-40 -19q-72 -14 -104 -30q22 -11 103 -31q58 -15 58 -56z M814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM726 252q0 122 -86 208t-208 86t-208 -86t-86 -208t86 -208t208 -86t208 86t86 208z" />
+<glyph unicode="&#x229c;" horiz-adv-x="864" d="M646 290h-428v88h428v-88zM646 128h-428v88h428v-88zM814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM726 252q0 122 -86 208t-208 86t-208 -86t-86 -208t86 -208t208 -86t208 86t86 208z" />
+<glyph unicode="&#x229d;" horiz-adv-x="864" d="M656 208h-448v88h448v-88zM814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM726 252q0 122 -86 208t-208 86t-208 -86t-86 -208t86 -208t208 -86t208 86t86 208z" />
+<glyph unicode="&#x229e;" horiz-adv-x="910" d="M865 -158h-820v819h820v-819zM777 286v287h-287v-287h287zM777 -70v286h-287v-286h287zM420 286v287h-287v-287h287zM420 -70v286h-287v-286h287z" />
+<glyph unicode="&#x229f;" horiz-adv-x="910" d="M865 -158h-820v819h820v-819zM777 286v287h-644v-287h644zM777 -70v286h-644v-286h644z" />
+<glyph unicode="&#x22a0;" horiz-adv-x="910" d="M865 -158h-820v819h820v-819zM730 573h-546l273 -273zM777 -20v540l-270 -270zM727 -70l-270 270l-270 -270h540zM407 250l-274 274v-548z" />
+<glyph unicode="&#x22a1;" horiz-adv-x="910" d="M540 251q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60zM865 -158h-820v819h820v-819zM777 -70v286v357h-644v-357v-286h644z" />
+<glyph unicode="&#x22a2;" d="M659 286h-464v-286h-104v676h104v-286h464v-104z" />
+<glyph unicode="&#x22a3;" d="M659 0h-104v286h-464v104h464v286h104v-676z" />
+<glyph unicode="&#x22a4;" d="M659 572h-232v-572h-104v572h-232v104h568v-104z" />
+<glyph unicode="&#x22a5;" d="M659 0h-568v104h232v572h104v-572h232v-104z" />
+<glyph unicode="&#x22a6;" horiz-adv-x="555" d="M464 286h-269v-286h-104v676h104v-286h269v-104z" />
+<glyph unicode="&#x22a7;" horiz-adv-x="555" d="M464 188h-269v-188h-104v676h104v-188h269v-104h-269v-92h269v-104z" />
+<glyph unicode="&#x22a8;" d="M659 188h-464v-188h-104v676h104v-188h464v-104h-464v-92h464v-104z" />
+<glyph unicode="&#x22a9;" horiz-adv-x="972" d="M882 286h-491v-286h-104v676h104v-286h491v-104zM195 0h-104v676h104v-676z" />
+<glyph unicode="&#x22aa;" horiz-adv-x="944" d="M856 286h-269v-286h-104v676h104v-286h269v-104zM391 0h-104v676h104v-676zM195 0h-104v676h104v-676z" />
+<glyph unicode="&#x22ab;" horiz-adv-x="944" d="M856 188h-464v-188h-104v676h104v-188h464v-104h-464v-92h464v-104zM195 0h-104v676h104v-676z" />
+<glyph unicode="&#x22ac;" horiz-adv-x="913" d="M822 286h-405l-59 -57v-229h-104v129l-134 -129h-99l233 224v452h104v-286h68l297 286h99l-297 -286h297v-104z" />
+<glyph unicode="&#x22ad;" horiz-adv-x="912" d="M822 676l-195 -188h194v-104h-302l-96 -92h398v-104h-464v-188h-104v128l-133 -128h-99l232 223v453h104v-188h171l195 188h99zM420 384h-63v-61z" />
+<glyph unicode="&#x22ae;" horiz-adv-x="1096" d="M1024 676l-375 -286h357v-104h-491v-286h-104v209l-92 -70v-139h-104v59l-78 -59h-116l194 148v528h104v-449l92 70v379h104v-286h18l375 286h116z" />
+<glyph unicode="&#x22af;" horiz-adv-x="1104" d="M1016 676l-246 -188h245v-104h-381l-83 -64v-28h464v-104h-464v-188h-104v240l-92 -70v-170h-104v90l-118 -90h-112l230 176v500h104v-421l92 70v351h104v-188h108l245 188h112z" />
+<glyph unicode="&#x22b0;" d="M473 440h-52q3 45 37.5 74t81.5 29q48 0 80 -32t32 -80q0 -67 -54 -110.5t-133 -57.5q-7 -2 -60 -9q8 -2 22 -4.5t24 -4.5t12 -2q79 -13 134 -57t55 -112q0 -48 -32 -80t-80 -32q-47 0 -81.5 29t-37.5 74h52q4 -16 17.5 -25.5t29.5 -9.5q18 0 31 12t13 30q0 27 -26 49.5 t-67 36t-76.5 21.5t-69.5 12q-134 17 -227 18v87q126 2 227 18q98 16 144 32q95 34 95 87q0 18 -13 30t-31 12q-16 0 -29.5 -9.5t-17.5 -25.5z" />
+<glyph unicode="&#x22b1;" d="M652 296v-87q-93 -1 -227 -18q-34 -4 -69.5 -12t-76.5 -21.5t-67 -36t-26 -49.5q0 -18 13 -30t31 -12q16 0 29.5 9.5t17.5 25.5h52q-3 -45 -37.5 -74t-81.5 -29q-48 0 -80 32t-32 80q0 68 55 112t134 57q2 0 12 2t24 4.5t22 4.5q-53 7 -60 9q-79 14 -133 57.5t-54 110.5 q0 48 32 80t80 32q47 0 81.5 -29t37.5 -74h-52q-4 16 -17.5 25.5t-29.5 9.5q-18 0 -31 -12t-13 -30q0 -53 95 -87q46 -16 144 -32q101 -16 227 -18z" />
+<glyph unicode="&#x22b2;" d="M669 -24l-588 278l588 280v-558zM581 115v280l-295 -141z" />
+<glyph unicode="&#x22b3;" d="M669 254l-588 -278v558zM464 254l-295 141v-280z" />
+<glyph unicode="&#x22b4;" d="M669 63l-588 278l588 280v-558zM581 202v280l-295 -141zM669 -113h-588v88h588v-88z" />
+<glyph unicode="&#x22b5;" d="M669 341l-588 -278v558zM464 341l-295 141v-280zM669 -113h-588v88h588v-88z" />
+<glyph unicode="&#x22b6;" horiz-adv-x="1216" d="M382 319h452q17 52 61.5 84.5t100.5 32.5q70 0 120 -50t50 -120t-50 -120t-120 -50q-56 0 -101 33.5t-61 85.5h-452q-16 -52 -61 -85.5t-101 -33.5q-70 0 -120 50t-50 120t50 120t120 50q56 0 100.5 -32.5t61.5 -84.5zM320 266q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5 t-29.5 -70.5t29.5 -70.5t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x22b7;" horiz-adv-x="1216" d="M382 319h452q17 52 61.5 84.5t100.5 32.5q70 0 120 -50t50 -120t-50 -120t-120 -50q-56 0 -101 33.5t-61 85.5h-452q-16 -52 -61 -85.5t-101 -33.5q-70 0 -120 50t-50 120t50 120t120 50q56 0 100.5 -32.5t61.5 -84.5zM1096 266q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5 t-29.5 -70.5t29.5 -70.5t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x22b8;" horiz-adv-x="884" d="M50 319h452q17 51 61.5 84t100.5 33q70 0 120 -50t50 -120t-50 -120t-120 -50q-56 0 -100.5 33.5t-61.5 85.5h-452v104zM764 266q0 41 -29.5 70.5t-70.5 29.5t-70.5 -29.5t-29.5 -70.5t29.5 -70.5t70.5 -29.5t70.5 29.5t29.5 70.5z" />
+<glyph unicode="&#x22b9;" d="M419 347h-88v216h88v-216zM685 209h-216v88h216v-88zM281 297v-88h-216v88h216zM419 -57h-88v216h88v-216z" />
+<glyph unicode="&#x22ba;" horiz-adv-x="498" d="M424 391h-123v-607h-104v607h-123v70h350v-70z" />
+<glyph unicode="&#x22bb;" horiz-adv-x="640" d="M588 536l-234 -564h-68l-234 564h94l174 -413l174 413h94zM573 -189h-506v88h506v-88z" />
+<glyph unicode="&#x22bc;" horiz-adv-x="640" d="M588 -28h-94l-174 413l-174 -413h-94l234 564h68zM573 609h-507v88h507v-88z" />
+<glyph unicode="&#x22bd;" horiz-adv-x="640" d="M588 536l-234 -564h-68l-234 564h94l174 -413l174 413h94zM573 609h-506v88h506v-88z" />
+<glyph unicode="&#x22be;" d="M690 0h-630v630h104v-181q133 -21 228.5 -116.5t116.5 -228.5h181v-104zM164 104h277q-20 105 -96.5 181.5t-180.5 96.5v-278z" />
+<glyph unicode="&#x22bf;" horiz-adv-x="910" d="M865 -158h-820l820 820v-820zM777 -70v520l-521 -520h521z" />
+<glyph unicode="&#x22c4;" horiz-adv-x="584" d="M541 266l-249 -249l-249 249l249 249zM311 159l88 88q9 9 9 20q0 7 -9 18l-88 88q-9 9 -20 9q-7 0 -18 -9l-88 -88q-9 -9 -9 -20q0 -7 9 -18l88 -88q11 -9 20 -9q7 0 18 9z" />
+<glyph unicode="&#x22c7;" d="M461 508q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5zM685 29l-74 -74l-236 236l-235 -235l-74 74l185 185h-185v104h181l-181 181l74 74l235 -235l236 236l74 -74l-182 -182h182v-104h-186zM461 24 q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5t25.5 61.5t61.5 25.5t61.5 -25.5t25.5 -61.5z" />
+<glyph unicode="&#x22c8;" horiz-adv-x="870" d="M803 -72l-368 264l-368 -264v676l368 -264l368 264v-676zM699 126v280l-190 -140zM361 266l-190 140v-280z" />
+<glyph unicode="&#x22c9;" horiz-adv-x="870" d="M817 52l-57 -80l-320 232l-383 -276v676l383 -277l320 227l57 -80l-292 -208zM355 266l-194 140v-280z" />
+<glyph unicode="&#x22ca;" horiz-adv-x="870" d="M813 -72l-383 276l-320 -232l-57 80l292 214l-292 208l57 80l320 -227l383 277v-676zM709 126v280l-194 -140z" />
+<glyph unicode="&#x22cb;" horiz-adv-x="870" d="M773 2l-74 -74l-264 264l-264 -264l-74 74l264 264l-264 264l74 74z" />
+<glyph unicode="&#x22cc;" horiz-adv-x="870" d="M773 2l-74 -74l-264 264l-264 -264l-74 74l602 602l74 -74l-264 -264z" />
+<glyph unicode="&#x22cd;" d="M683 221h-54q-33 136 -114 136q-27 0 -75 -29.5t-101.5 -59t-96.5 -29.5q-53 0 -93 37t-59 86t-22 101h54q33 -136 114 -136q25 0 72 29.5t101 59t95 29.5q56 0 97 -35.5t60 -84.5t22 -104zM682 45h-614v88h614v-88z" />
+<glyph unicode="&#x22ce;" horiz-adv-x="640" d="M480 536h119q-116 -114 -169 -250t-65 -314h-88q-14 183 -66 318t-170 246h119q135 -138 159 -303h4q13 84 50 149.5t107 153.5z" />
+<glyph unicode="&#x22cf;" horiz-adv-x="640" d="M599 -28h-119q-70 88 -107 153.5t-50 149.5h-4q-24 -165 -159 -303h-119q118 111 170 246t66 318h88q12 -178 65 -314t169 -250z" />
+<glyph unicode="&#x22d0;" d="M687 92h-280q-72 0 -123.5 51.5t-51.5 123.5t51.5 123t123.5 51h280v-88h-281q-36 0 -61 -25.5t-25 -61.5t25 -61t61 -25h281v-88zM687 -67h-290q-138 0 -236 98t-98 236t98 235.5t236 97.5h290v-88h-291q-102 0 -173.5 -72t-71.5 -174t71.5 -173.5t173.5 -71.5h291v-88z " />
+<glyph unicode="&#x22d1;" d="M63 600h290q138 0 236 -97.5t98 -235.5t-98 -236t-236 -98h-290v88h291q101 0 173 71.5t72 173.5t-71.5 174t-173.5 72h-291v88zM63 441h280q72 0 123.5 -51t51.5 -123t-51.5 -123.5t-123.5 -51.5h-280v88h281q36 0 61 25t25 61t-25 61.5t-61 25.5h-281v88z" />
+<glyph unicode="&#x22d2;" d="M685 -33h-88v264q0 92 -65 157t-157 65t-157 -65t-65 -157v-264h-88v264q0 128 91 219t219 91t219 -91t91 -219v-264zM526 -33h-88v254q0 26 -18.5 44.5t-44.5 18.5t-44.5 -18.5t-18.5 -44.5v-254h-88v255q0 63 44 106.5t107 43.5t107 -43.5t44 -106.5v-255z" />
+<glyph unicode="&#x22d3;" d="M526 541v-255q0 -63 -44 -106.5t-107 -43.5t-107 43.5t-44 106.5v255h88v-254q0 -26 18.5 -44.5t44.5 -18.5t44.5 18.5t18.5 44.5v254h88zM685 541v-264q0 -128 -91 -219t-219 -91t-219 91t-91 219v264h88v-264q0 -92 65 -157t157 -65t157 65t65 157v264h88z" />
+<glyph unicode="&#x22d4;" horiz-adv-x="650" d="M584 -33h-88v315q0 59 -36 105t-91 60v-480h-88v480q-55 -14 -91 -60t-36 -105v-315h-88v315q0 95 61.5 167t153.5 88v106h88v-106q92 -16 153.5 -88t61.5 -167v-315z" />
+<glyph unicode="&#x22d5;" horiz-adv-x="685" d="M637 106h-151v-295h-88v295h-111v-295h-88v295h-151v88h151v112h-151v88h151v296h88v-296h111v296h88v-296h151v-88h-151v-112h151v-88zM398 194v112h-111v-112h111z" />
+<glyph unicode="&#x22d6;" d="M670 -24l-590 258v40l590 260v-88l-436 -192l436 -190v-88zM625 254q0 -31 -22 -53.5t-53 -22.5q-32 0 -54.5 22.5t-22.5 53.5t22.5 53.5t54.5 22.5q31 0 53 -22.5t22 -53.5z" />
+<glyph unicode="&#x22d7;" d="M670 234l-590 -258v88l436 190l-436 192v88l590 -260v-40zM277 254q0 -31 -22.5 -53.5t-54.5 -22.5q-31 0 -53 22.5t-22 53.5t22 53.5t53 22.5q32 0 54.5 -22.5t22.5 -53.5z" />
+<glyph unicode="&#x22d8;" horiz-adv-x="1336" d="M630 -24l-590 258v40l590 260v-88l-436 -192l436 -190v-88zM963 -24l-590 258v40l590 260v-88l-436 -192l436 -190v-88zM1296 -24l-590 258v40l590 260v-88l-436 -192l436 -190v-88z" />
+<glyph unicode="&#x22d9;" horiz-adv-x="1336" d="M630 234l-590 -258v88l436 190l-436 192v88l590 -260v-40zM963 234l-590 -258v88l436 190l-436 192v88l590 -260v-40zM1296 234l-590 -258v88l436 190l-436 192v88l590 -260v-40z" />
+<glyph unicode="&#x22da;" d="M670 358l-590 258v40l590 260v-88l-436 -192l436 -190v-88zM670 -150l-590 -258v88l436 190l-436 192v88l590 -260v-40zM670 210h-590v88h590v-88z" />
+<glyph unicode="&#x22db;" d="M670 -408l-590 258v40l590 260v-88l-436 -192l436 -190v-88zM670 616l-590 -258v88l436 190l-436 192v88l590 -260v-40zM670 210h-590v88h590v-88z" />
+<glyph unicode="&#x22dc;" d="M670 539h-590v88h590v-88zM670 -120l-590 260v40l590 258v-88l-436 -190l436 -192v-88z" />
+<glyph unicode="&#x22dd;" d="M670 539h-590v88h590v-88zM670 140l-590 -260v88l436 192l-436 190v88l590 -258v-40z" />
+<glyph unicode="&#x22de;" d="M670 -17v-121q-94 98 -227 154.5t-279 70.5l-84 8v88l84 8q146 14 279 70.5t227 154.5v-121q-107 -98 -299 -156q192 -58 299 -156zM670 645v-121q-94 -86 -265 -145q-137 -47 -325 -55v88l84 8q146 14 278.5 70.5t227.5 154.5z" />
+<glyph unicode="&#x22df;" d="M670 95l-84 -8q-146 -14 -279 -70.5t-227 -154.5v121q107 98 299 156q-192 58 -299 156v121q94 -98 227 -154.5t279 -70.5l84 -8v-88zM670 412v-88q-188 8 -325 55q-171 59 -265 145v121q95 -98 227.5 -154.5t278.5 -70.5z" />
+<glyph unicode="&#x22e0;" d="M670 -17v-121q-129 132 -324 190l-76 -251h-73l81 268q-57 12 -114 18l-84 8v88q123 -5 224 -27l38 126q-83 24 -178 34l-84 8v88l84 8q127 13 236 53l79 262h73l-68 -225q112 57 186 135v-121q-79 -72 -221 -129l-14 -49q149 -55 235 -134v-121q-106 109 -262 168 l-36 -120l17 -5q11 -4 16 -6q171 -59 265 -145z" />
+<glyph unicode="&#x22e1;" d="M670 95l-84 -8q-129 -12 -247 -57l-69 -229h-73l57 190q-99 -53 -174 -129v121q79 72 209 124l46 150q-154 -61 -255 -166v121q105 96 287 152l2 7q-189 60 -289 153v121q122 -127 315 -187l84 277h73l-89 -295q55 -13 123 -20l84 -8v-88l-84 -8q-84 -7 -170 -32 l-45 -147q127 38 299 46v-88z" />
+<glyph unicode="&#x22e2;" d="M663 -93h-390l-55 -148h-71l55 148h-115v88h148l34 90h-182v559h390l55 148h71l-55 -148h115v-88h-148l-143 -383h291v-88h-323l-34 -90h357v-88zM444 556h-269v-383h126z" />
+<glyph unicode="&#x22e3;" d="M663 -93h-390l-55 -148h-71l55 148h-115v88h148l34 90h-182v88h214l143 383h-357v88h390l55 148h71l-55 -148h115v-559h-323l-34 -90h357v-88zM575 173v383h-60l-143 -383h203z" />
+<glyph unicode="&#x22e6;" d="M667 132l-590 260v40l590 258v-88l-436 -190l436 -192v-88zM628 60h54q-5 -94 -53.5 -159t-125.5 -65q-51 0 -122 42l-39 -78h-77l58 115q-61 39 -88 39q-80 0 -114 -136h-54q6 87 52.5 155.5t121.5 68.5q52 0 125 -44l40 80h77l-59 -116q60 -38 90 -38q80 0 114 136z " />
+<glyph unicode="&#x22e7;" d="M667 392l-590 -260v88l436 192l-436 190v88l590 -258v-40zM628 60h54q-5 -94 -53.5 -159t-125.5 -65q-51 0 -122 42l-39 -78h-77l58 115q-61 39 -88 39q-80 0 -114 -136h-54q6 87 52.5 155.5t121.5 68.5q52 0 125 -44l40 80h77l-59 -116q60 -38 90 -38q80 0 114 136z" />
+<glyph unicode="&#x22e8;" d="M670 243v-121q-94 98 -227 154.5t-279 70.5l-84 8v88l84 8q146 14 279 70.5t227 154.5v-121q-107 -98 -299 -156q192 -58 299 -156zM628 73h54q-5 -94 -53.5 -159t-125.5 -65q-51 0 -122 42l-39 -78h-77l58 115q-61 39 -88 39q-80 0 -114 -136h-54q6 87 52.5 155.5 t121.5 68.5q52 0 125 -44l40 80h77l-59 -116q60 -38 90 -38q80 0 114 136z" />
+<glyph unicode="&#x22e9;" d="M670 355l-84 -8q-146 -14 -279 -70.5t-227 -154.5v121q107 98 299 156q-192 58 -299 156v121q94 -98 227 -154.5t279 -70.5l84 -8v-88zM628 73h54q-5 -94 -53.5 -159t-125.5 -65q-51 0 -122 42l-39 -78h-77l58 115q-61 39 -88 39q-80 0 -114 -136h-54q6 87 52.5 155.5 t121.5 68.5q52 0 125 -44l40 80h77l-59 -116q60 -38 90 -38q80 0 114 136z" />
+<glyph unicode="&#x22ea;" d="M669 -24l-299 141l-70 -232h-73l79 263l-225 106l300 143l69 228h73l-56 -187l202 96v-558zM581 115v280l-149 -71l-36 -122zM347 283l-61 -29l46 -22z" />
+<glyph unicode="&#x22eb;" d="M669 254l-301 -142l-68 -227h-73l56 187l-202 -96v558l299 -142l70 233h73l-79 -264zM464 254l-46 22l-16 -51zM354 307l-185 88v-280l148 70z" />
+<glyph unicode="&#x22ec;" d="M669 -113h-364l-35 -115h-73l35 115h-151v88h177l75 247l-252 119l336 160l63 210h73l-51 -170l167 80v-558l-272 129l-66 -217h338v-88zM581 202v280l-113 -54l-46 -151zM382 387l-96 -46l72 -34z" />
+<glyph unicode="&#x22ed;" d="M669 -113h-364l-35 -115h-73l35 115h-151v88h177l61 200l-238 -112v558l325 -155l74 245h73l-83 -275l199 -95l-265 -125l-73 -241h338v-88zM464 341l-20 9l-6 -21zM381 381l-212 101v-280l184 87z" />
+<glyph unicode="&#x22ee;" horiz-adv-x="584" d="M375 593q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60zM375 252q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60zM375 -89q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60z" />
+<glyph unicode="&#x22ef;" horiz-adv-x="977" d="M914 266q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60zM573 266q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60zM232 266q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60z" />
+<glyph unicode="&#x22f0;" horiz-adv-x="977" d="M815 494q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60zM573 252q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60zM332 10q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60z" />
+<glyph unicode="&#x22f1;" horiz-adv-x="977" d="M332 494q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60zM573 252q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60zM815 10q0 -35 -25 -60t-60 -25t-60 25t-25 60t25 60t60 25t60 -25t25 -60z" />
+<glyph unicode="&#x22f6;" d="M668 -13h-298q-128 0 -208 81t-80 199q0 119 80.5 199.5t210.5 80.5h295v-88h-311q-64 0 -115.5 -42t-66.5 -106h493v-88h-493q15 -64 66.5 -106t116.5 -42h310v-88zM668 647h-576v88h576v-88z" />
+<glyph unicode="&#x22fd;" d="M82 547h295q130 0 210.5 -80.5t80.5 -199.5q0 -118 -80 -199t-208 -81h-298v88h310q65 0 116.5 42t66.5 106h-493v88h493q-15 64 -66.5 106t-115.5 42h-311v88zM658 647h-576v88h576v-88z" />
+<glyph unicode="&#x2302;" horiz-adv-x="926" d="M871 0h-816v408l408 366l408 -366v-408zM783 88v284l-320 289l-320 -289v-284h640z" />
+<glyph unicode="&#x2308;" horiz-adv-x="469" d="M459 676h-131q-40 0 -50 -13.5t-10 -68.5v-787h-104v924h295v-55z" />
+<glyph unicode="&#x2309;" horiz-adv-x="469" d="M305 -193h-104v787q0 55 -10 68.5t-51 13.5h-130v55h295v-924z" />
+<glyph unicode="&#x230a;" horiz-adv-x="469" d="M459 -193h-295v925h104v-788q0 -55 10 -68.5t51 -13.5h130v-55z" />
+<glyph unicode="&#x230b;" horiz-adv-x="469" d="M305 -193h-295v55h131q40 0 50 13.5t10 68.5v788h104v-925z" />
+<glyph unicode="&#x2310;" d="M685 311h-532v-203h-88v291h620v-88z" />
+<glyph unicode="&#x2319;" d="M685 108h-620v291h88v-203h532v-88z" />
+<glyph unicode="&#x2322;" horiz-adv-x="1026" d="M990 159l-22 -30q-186 135 -451 135q-146 0 -251 -30t-206 -105l-23 31q100 102 226 160t258 58q121 0 234 -55.5t235 -163.5z" />
+<glyph unicode="&#x2323;" horiz-adv-x="1026" d="M967 378l23 -31q-100 -102 -226 -160t-258 -58q-121 0 -234 55.5t-235 163.5l22 30q186 -135 451 -135q146 0 251 30t206 105z" />
+<glyph unicode="&#x2329;" horiz-adv-x="445" d="M399 -193h-100l-230 455v15l226 455h100l-230 -462z" />
+<glyph unicode="&#x232a;" horiz-adv-x="445" d="M376 262l-230 -455h-100l234 463l-230 462h100l226 -455v-15z" />
+<glyph unicode="&#x2336;" horiz-adv-x="926" d="M841 -156h-756v66h333v775h-333v66h756l-1 -66h-334v-775h335v-66z" />
+<glyph unicode="&#x233d;" horiz-adv-x="924" d="M506 694v-62q143 -17 240.5 -125.5t97.5 -254.5t-97.5 -254.5t-240.5 -125.5v-62h-88v62q-143 17 -240.5 125.5t-97.5 254.5t97.5 254.5t240.5 125.5v62h88zM506 543v-582q107 16 178.5 98.5t71.5 192.5t-71.5 192.5t-178.5 98.5zM418 -39v582q-107 -16 -178.5 -98.5 t-71.5 -192.5t71.5 -192.5t178.5 -98.5z" />
+<glyph unicode="&#x233f;" horiz-adv-x="728" d="M673 222h-274l-149 -422h-96l150 422h-249v88h280l151 422h96l-151 -422h242v-88z" />
+<glyph unicode="&#x23af;" horiz-adv-x="315" d="M315 209h-315v88h315v-88z" />
+<glyph unicode="&#x2423;" horiz-adv-x="500" d="M460 -120h-420v151h42v-76h336v76h42v-151z" />
+<glyph unicode="&#x2460;" horiz-adv-x="695" d="M469 141h-241v26q48 1 62 10t14 40v203q0 31 -23 31q-18 0 -56 -13v27l165 59h10v-312q0 -27 12.5 -35.5t56.5 -9.5v-26zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338 q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2461;" horiz-adv-x="695" d="M496 265l-33 -125h-263v23q108 95 147 146q32 42 32 74q0 26 -19.5 43.5t-55.5 17.5q-53 0 -75 -48h-24q48 121 146 121q52 0 84 -28t32 -75q0 -65 -73 -121l-90 -70h70q50 0 70.5 7.5t27.5 34.5h24zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5 q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2462;" horiz-adv-x="695" d="M235 416l-20 12q55 89 149 89q46 0 75 -23t29 -55q0 -43 -38 -66q62 -29 62 -95q0 -61 -54.5 -102.5t-136.5 -41.5q-43 0 -69.5 15t-26.5 39q0 17 11.5 28t29.5 11q28 0 61 -32q23 -21 51 -21t45 16t17 42q0 36 -31 59q-22 17 -97 39v22q80 20 80 62q0 48 -60 48 q-25 0 -41.5 -10.5t-35.5 -35.5zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5 t85 216.5z" />
+<glyph unicode="&#x2463;" horiz-adv-x="695" d="M483 217h-40v-76h-96v76h-158v68l202 232h52v-231h40v-69zM347 286v141l-120 -141h120zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5 q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2464;" horiz-adv-x="695" d="M496 516l-31 -80h-179l-11 -33q68 -4 94 -10q53 -13 82.5 -45t29.5 -77q0 -62 -51 -99.5t-133 -37.5q-43 0 -69.5 15.5t-26.5 38.5q0 17 11.5 28t28.5 11q30 0 66 -26q29 -21 58 -21q28 0 47 14t19 36q0 23 -25 44.5t-68 30.5q-31 7 -120 11l67 200h211zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2465;" horiz-adv-x="695" d="M486 517v-26q-130 -23 -166 -123q25 8 50 8q55 0 87.5 -30t32.5 -81q0 -59 -38 -95t-99 -36q-68 0 -108.5 43t-40.5 115q0 100 86 160t196 65zM393 235q0 59 -12.5 82t-43.5 23q-19 0 -26 -14t-7 -50q0 -28 1 -43.5t5.5 -34.5t15 -27.5t28.5 -8.5q20 0 29.5 15.5 t9.5 57.5zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2466;" horiz-adv-x="695" d="M502 517l-161 -383h-65l132 296h-120q-32 0 -46.5 -10t-24.5 -37h-24l33 134h276zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89 t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2467;" horiz-adv-x="695" d="M496 241q0 -50 -42 -78.5t-112 -28.5q-61 0 -98 26t-37 71q0 68 80 90q-39 22 -56 44.5t-17 53.5q0 44 38.5 71t104.5 27q57 0 90.5 -23.5t33.5 -59.5q0 -54 -74 -77q89 -53 89 -116zM405 431q0 25 -15 41.5t-41 16.5q-23 0 -38 -10.5t-15 -26.5q0 -40 84 -77 q25 29 25 56zM400 214q0 26 -16.5 44t-67.5 46q-33 -40 -33 -71q0 -33 16 -52t44 -19q26 0 41.5 13.5t15.5 38.5zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5 t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2468;" horiz-adv-x="695" d="M208 134v26q127 22 167 124q-21 -9 -52 -9q-53 0 -85.5 31t-32.5 84q0 54 38.5 90.5t98.5 36.5q67 0 108 -44t41 -118q0 -67 -43.5 -118t-106 -75.5t-133.5 -27.5zM391 386q0 33 -2.5 52t-14 35t-34.5 16q-22 1 -30 -13.5t-8 -56.5q0 -58 12 -83t42 -25q12 0 20 6.5 t11 20t3.5 23t0.5 25.5zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z " />
+<glyph unicode="&#x24b6;" horiz-adv-x="695" d="M548 141h-190v26q45 4 45 13q0 16 -25 67h-131l-10 -23q-12 -27 -12 -41q0 -13 45 -16v-26h-124v26q23 4 35 15t27 46l129 296h13l131 -284q22 -48 33 -60.5t34 -12.5v-26zM364 279l-52 117h-1l-51 -117h104zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5 t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24b7;" horiz-adv-x="695" d="M169 517h189q71 0 109.5 -24t38.5 -69q0 -60 -66 -81q39 -10 62.5 -35t23.5 -60q0 -47 -42.5 -77t-119.5 -30h-195v26q32 4 42 10.5t10 25.5v251q0 19 -11 27t-41 10v26zM317 462v-107q54 0 73 14.5t19 51.5q0 64 -59 64q-33 0 -33 -23zM317 323v-121q0 -29 37 -29 q70 0 70 75t-92 75h-15zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z " />
+<glyph unicode="&#x24b8;" horiz-adv-x="695" d="M524 236l24 -17q-46 -48 -87.5 -66.5t-97.5 -18.5q-98 0 -155 52.5t-57 135.5q0 88 58.5 145t152.5 57q38 0 94 -19q18 -7 27 -7q18 0 29 24h19v-137h-22q-16 46 -53 76.5t-86 30.5q-50 0 -82 -42t-32 -116q0 -162 125 -162q43 0 72.5 14.5t70.5 49.5zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24b9;" horiz-adv-x="695" d="M146 517h186q102 0 159 -49t57 -135q0 -90 -62 -141t-156 -51h-184v26q50 1 50 33v261q0 15 -10.5 21.5t-39.5 8.5v26zM292 468v-267q0 -15 7.5 -21.5t27.5 -6.5q66 0 91 39t27 113q2 160 -121 160q-32 0 -32 -17zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5 t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24ba;" horiz-adv-x="695" d="M527 265l-26 -124h-336v26q30 4 40 10.5t10 23.5v257q0 17 -10.5 24t-39.5 8v26h333v-121h-21q-4 53 -31 71t-98 18q-22 0 -29.5 -5t-7.5 -17v-114q48 0 68 17t24 63h21v-194h-21q-4 47 -24 64.5t-68 17.5v-120q0 -14 9.5 -18.5t37.5 -4.5q71 0 100 23q22 17 49 69h20z M695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24bb;" horiz-adv-x="695" d="M527 395h-21q-7 30 -15 43.5t-26 26.5q-25 19 -94 19q-44 0 -44 -21v-115q48 0 69.5 17.5t28.5 62.5h21v-194h-21q-5 46 -27.5 64t-70.5 18v-115q0 -19 13.5 -26t56.5 -8v-26h-221v26q34 4 44.5 10.5t10.5 25.5v253q0 19 -11.5 25.5t-43.5 8.5v26h351v-121zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24bc;" horiz-adv-x="695" d="M548 310v-27q-30 -3 -39 -13t-9 -33v-69q-60 -34 -154 -34q-91 0 -148 52.5t-57 139.5q0 83 58.5 141t141.5 58q37 0 85 -19q17 -7 24 -7q16 0 26 24h17v-138h-19q-34 108 -125 108q-46 0 -74.5 -42.5t-28.5 -120.5q0 -165 114 -165q53 0 53 43v42q0 18 -11 25t-46 8v27 h192zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24bd;" horiz-adv-x="695" d="M544 141h-181v26q27 4 35 10t8 23v116h-117v-116q0 -17 8 -23t35 -10v-26h-180v26q26 4 33.5 10t7.5 23v257q0 18 -8.5 25t-32.5 9v26h180v-26q-26 -2 -34.5 -8.5t-8.5 -25.5v-103h117v103q0 19 -8.5 25.5t-34.5 8.5v26h181v-26q-25 -2 -33.5 -9t-8.5 -25v-257 q0 -17 8 -23t34 -10v-26zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z " />
+<glyph unicode="&#x24be;" horiz-adv-x="695" d="M442 141h-190v26q28 3 37 10t9 27v253q0 18 -9.5 25t-36.5 9v26h190v-26q-28 -1 -38 -8.5t-10 -25.5v-253q0 -21 9.5 -28t38.5 -9v-26zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338 q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24bf;" horiz-adv-x="695" d="M482 517v-26q-27 -2 -35.5 -10t-8.5 -31v-204q0 -55 -33 -83.5t-88 -28.5q-95 0 -95 72q0 17 12.5 29t27.5 12t27 -10t12 -28q0 -11 -6 -19.5t-6 -11.5q0 -14 21 -14q32 0 32 38v259q0 17 -10 22.5t-40 7.5v26h190zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c0;" horiz-adv-x="695" d="M557 141h-181v26q38 1 38 5q0 7 -10 20l-99 123l-14 -14v-103q0 -15 9 -21t38 -10v-26h-190v26q30 3 38.5 9.5t8.5 25.5v253q0 21 -9.5 27.5t-37.5 8.5v26h190v-26q-29 -2 -38 -10t-9 -29v-112l115 115q21 21 21 26t-26 8l-19 2v26h158v-26q-45 -6 -74 -24t-98 -90 l163 -200q5 -9 26 -10v-26zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5 z" />
+<glyph unicode="&#x24c1;" horiz-adv-x="695" d="M527 278l-25 -137h-309v26q28 4 36 10t8 23v257q0 19 -9 26t-35 8v26h192v-26q-34 -2 -43 -10t-9 -37v-247q0 -14 9.5 -19t34.5 -5q51 0 84 31q28 25 47 74h19zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101 q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c2;" horiz-adv-x="695" d="M566 141h-181v26q27 3 35 10.5t8 28.5v254l-114 -319h-9l-102 323v-247q0 -27 9.5 -37.5t38.5 -12.5v-26h-121v26q28 4 35.5 10.5t7.5 28.5v251q0 18 -8 25t-34 9v26h129l75 -255h1l89 255h141v-26q-26 -2 -34 -11t-8 -35v-230q0 -27 7.5 -36t34.5 -12v-26zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c3;" horiz-adv-x="695" d="M533 516v-26q-26 -4 -33 -10.5t-7 -26.5v-319h-23l-233 293v-207q0 -26 9.5 -36t38.5 -14v-26h-122v26q28 4 36 11t8 27v249q-17 33 -43 33v26h114l185 -231v155q0 28 -9 37.5t-38 12.5v26h117zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5 q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c4;" horiz-adv-x="695" d="M552 328q0 -85 -58.5 -139.5t-147.5 -54.5q-88 0 -146 54.5t-58 138.5q0 87 59.5 142t148.5 55q86 0 144 -55.5t58 -140.5zM447 325q0 81 -26.5 124t-75.5 43q-47 0 -72.5 -43t-25.5 -124q0 -159 100 -159t100 159zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c5;" horiz-adv-x="695" d="M179 517h178q68 0 108.5 -27t40.5 -78q0 -110 -155 -110q-11 0 -31 2v-97q0 -23 8 -30t38 -10v-26h-187v26q25 2 35 12.5t10 35.5v230q0 27 -8.5 35.5t-36.5 10.5v26zM320 473v-137q49 0 69.5 17.5t20.5 53.5q0 41 -15 59.5t-48 18.5q-27 0 -27 -12zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c6;" horiz-adv-x="695" d="M485 111l6 -26q-53 -20 -91 -20q-31 0 -64.5 18.5t-53.5 59.5q-65 18 -102.5 66.5t-37.5 114.5q0 90 58 145t147 55t147 -55.5t58 -146.5q0 -71 -38 -117.5t-106 -63.5q14 -35 47 -35q12 0 30 5zM447 327q0 165 -101 165q-48 0 -73.5 -42t-25.5 -123q0 -160 100 -160 t100 160zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c7;" horiz-adv-x="695" d="M535 141h-104l-117 169h-15v-100q0 -25 7.5 -31.5t37.5 -11.5v-26h-187v26q31 4 38.5 11t7.5 34v232q0 27 -8.5 36t-37.5 11v26h172q77 0 119 -25t42 -73q0 -75 -75 -101l98 -141q5 -10 22 -10v-26zM299 467v-126q52 1 73.5 17t21.5 55q0 72 -68 72q-27 0 -27 -18z M695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c8;" horiz-adv-x="695" d="M478 395h-21q-5 43 -38.5 69.5t-78.5 26.5q-29 0 -47 -14.5t-18 -34.5q0 -9 6 -17t18.5 -15t22 -11.5t28 -12t24.5 -10.5q26 -11 43.5 -21t37.5 -25.5t30.5 -36.5t10.5 -47q0 -51 -43 -81.5t-111 -30.5q-31 0 -64.5 9t-38.5 9q-15 0 -20 -18h-19v144h21q12 -113 122 -113 q34 0 55 14.5t21 38.5q0 7 -3.5 13.5t-11.5 13t-14.5 11t-19.5 10.5l-19 10q-6 3 -21.5 9.5t-17.5 7.5q-55 24 -81 49.5t-26 66.5q0 53 37 83t98 30q29 0 60.5 -8.5t37.5 -8.5q15 0 21 17h19v-127zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5 q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c9;" horiz-adv-x="695" d="M527 396h-21q-8 49 -31.5 69t-77.5 21v-276q0 -26 9.5 -33.5t47.5 -9.5v-26h-210v26q38 3 47.5 10.5t9.5 32.5v276q-55 -1 -78.5 -21t-31.5 -69h-21l4 121h349zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101 q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24ca;" horiz-adv-x="695" d="M533 517v-26q-25 -4 -32.5 -11t-7.5 -27v-165q0 -73 -38 -110t-107 -37q-68 0 -109 34t-41 100v172q0 27 -7.5 34.5t-35.5 9.5v26h188v-26q-31 -2 -40 -10t-9 -36v-166q0 -100 75 -100q94 0 94 110v157q0 24 -10.5 33.5t-39.5 11.5v26h120zM695 335q0 -150 -100 -252 t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24cb;" horiz-adv-x="695" d="M548 517v-26q-24 -3 -33 -9.5t-19 -29.5l-138 -311h-12l-151 317q-9 19 -17.5 24.5t-31.5 8.5v26h195v-26l-19 -1q-31 -1 -31 -13q0 -8 13 -35l80 -171h2l74 168q12 26 12 35q0 8 -8.5 11.5t-39.5 5.5v26h124zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5 t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24cc;" horiz-adv-x="695" d="M566 517v-26q-24 -3 -33 -31l-93 -319h-10l-77 255l-86 -255h-10l-97 321q-5 16 -10 21.5t-20 7.5v26h132v-26q-29 -2 -29 -16q0 -1 4 -21l52 -177l53 155l-14 44q-4 13 -33 15v26h141v-26q-33 -3 -33 -13l7 -28l48 -170l51 174q0 2 1.5 8t1.5 8q0 17 -29 21v26h83z M695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24cd;" horiz-adv-x="695" d="M527 141h-178v26q42 3 42 12q0 6 -11 23l-53 87l-20 -26q-49 -63 -49 -80q0 -12 42 -16v-26h-130v26q20 2 30.5 8t21.5 20l90 117l-100 150q-11 17 -18.5 22.5t-23.5 6.5v26h181v-26q-41 -2 -41 -12q0 -3 8 -16l48 -79l34 43q28 39 28 49q0 7 -7 10t-30 5v26h130v-26 q-30 -3 -45.5 -14.5t-49.5 -57.5l-44 -59l94 -149q18 -29 27 -36t24 -8v-26zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214 q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24ce;" horiz-adv-x="695" d="M533 517v-26q-29 0 -40 -18l-98 -167v-93q0 -27 8 -35t39 -11v-26h-191v26q31 3 39.5 12.5t8.5 36.5v70l-93 175q-15 28 -43 30v26h173v-26l-14 -1q-28 -1 -28 -10q0 -6 13 -28l70 -119h4l53 90q20 34 20 52q0 8 -6.5 11t-31.5 5v26h117zM695 335q0 -150 -100 -252 t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24cf;" horiz-adv-x="695" d="M527 284l-18 -143h-340v19l219 325h-39q-72 0 -97 -17t-44 -76h-22l16 125h306v-19l-216 -325h42q83 0 113 20q24 16 34.5 33.5t24.5 57.5h21zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252z M643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d0;" horiz-adv-x="695" d="M480 240l10 -18q-41 -37 -78 -37q-21 0 -28 8t-14 32q-54 -40 -101 -40q-67 0 -67 64q0 44 42 66q42 24 125 42v30q0 24 -12 35t-40 11q-39 0 -39 -15q0 -1 10 -12t10 -23q0 -17 -10 -28t-29 -11q-20 0 -31.5 11.5t-11.5 31.5q0 35 30 54.5t85 19.5q118 0 118 -78v-142 q0 -8 11 -8q13 0 20 7zM369 256v70q-79 -18 -79 -60q0 -29 34 -29q29 0 45 19zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89 t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d1;" horiz-adv-x="695" d="M305 517v-140q31 33 74 33q54 0 83.5 -36.5t29.5 -97.5q0 -65 -36.5 -104t-101.5 -39q-37 0 -80 33l-36 -33h-13v333q0 12 -6.5 16.5t-29.5 9.5v25h116zM305 339v-139q0 -37 41 -37q35 0 46.5 23.5t11.5 79.5q0 54 -11 78t-41 24q-23 0 -47 -29zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d2;" horiz-adv-x="695" d="M461 263l19 -15q-31 -34 -60.5 -48.5t-67.5 -14.5q-61 0 -94.5 36t-33.5 98q0 64 39 103t104 39q40 0 70 -18.5t30 -46.5q0 -42 -41 -42q-36 0 -36 47q0 18 -5.5 25t-25.5 7q-25 0 -40 -23t-15 -63q0 -53 24.5 -83t67.5 -30q35 0 65 29zM695 335q0 -150 -100 -252 t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d3;" horiz-adv-x="695" d="M503 178v-26q-69 -7 -117 -18v37q-41 -38 -87 -38q-51 0 -80.5 37t-29.5 97q0 64 32 103.5t85 39.5q40 0 78 -35v92q0 14 -8 18.5t-41 6.5v25h129v-314q0 -14 8 -19t31 -6zM384 209v127q-13 30 -51 30q-56 0 -56 -95q0 -93 51 -93q37 0 56 31zM695 335q0 -150 -100 -252 t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d4;" horiz-adv-x="695" d="M457 275l20 -13q-33 -45 -61 -61t-69 -16q-58 0 -90.5 37.5t-32.5 97.5q0 65 33 103t93 38q116 0 119 -135h-162q2 -20 5.5 -33.5t11.5 -27.5t23 -21t38 -7q34 0 72 38zM304 358h88q-1 20 -2 29.5t-5 22.5t-12.5 18t-22.5 5q-45 0 -46 -75zM695 335q0 -150 -100 -252 t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d5;" horiz-adv-x="695" d="M232 402h37q0 62 25 92t84 30q41 0 64.5 -16.5t23.5 -43.5q0 -41 -35 -41q-17 0 -27.5 10.5t-10.5 26.5q0 11 7 19.5t7 10.5q0 6 -20 6q-38 0 -38 -37v-57h56v-37h-56v-159q0 -23 10 -30.5t44 -8.5v-26h-171v26q22 1 29.5 7t7.5 20v171h-37v37zM695 335q0 -150 -100 -252 t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d6;" horiz-adv-x="695" d="M346 300h35q53 0 82 -19.5t29 -53.5q0 -43 -43 -68t-124 -25q-124 0 -124 57q0 34 40 45q-31 15 -31 44q0 46 58 65q-61 25 -61 82q0 44 35 70t94 26q29 0 68 -12h87v-43h-42q15 -18 15 -47q0 -51 -36.5 -68.5t-102.5 -17.5q-43 0 -43 -21q0 -8 12.5 -11t51.5 -3z M381 428q0 35 -10.5 50.5t-34.5 15.5q-23 0 -32 -15t-9 -52q0 -35 9 -49t32 -14q24 0 34.5 14t10.5 50zM387 220h-100q-15 0 -21 -8t-6 -16q0 -33 83 -33q47 0 71.5 9.5t24.5 22.5q0 25 -52 25zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5 q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d7;" horiz-adv-x="695" d="M507 141h-142v26q30 3 30 27v120q0 25 -7.5 35.5t-26.5 10.5q-35 0 -57 -27v-139q0 -13 7 -19t25 -8v-26h-147v26q24 3 29.5 7.5t5.5 21.5v268q0 15 -6 19t-29 8v26h115v-151q45 44 96 44q75 0 75 -81v-134q0 -28 32 -28v-26zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d8;" horiz-adv-x="695" d="M398 509q0 -21 -13.5 -34.5t-35.5 -13.5t-35 13.5t-13 34.5q0 22 13 35.5t36 13.5q21 0 34.5 -13.5t13.5 -35.5zM423 155h-149v26q24 5 30 10t6 20v164q0 14 -7 20t-30 10v26h117v-222q0 -14 7.5 -20t25.5 -8v-26zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5 t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d9;" horiz-adv-x="695" d="M438 539q0 -21 -13.5 -34.5t-34.5 -13.5q-22 0 -35.5 13.5t-13.5 34.5t13.5 35t34.5 14t35 -14.5t14 -34.5zM429 461v-259q0 -122 -107 -122q-41 0 -67 17.5t-26 45.5q0 18 11.5 30t29.5 12q17 0 28.5 -10.5t11.5 -25.5q0 -9 -4 -16t-8 -10.5t-4 -4.5q0 -8 22 -8 q33 0 33 37v262q0 13 -9 18.5t-35 7.5v26h124zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88 q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24da;" horiz-adv-x="695" d="M513 141h-148v26q27 0 27 4q0 2 -15 20l-63 73l-15 -13v-58q0 -15 5.5 -19t28.5 -7v-26h-146v26q32 1 32 26v272q0 25 -32 26v26h112v-231l78 63q20 17 20 21t-12 5q-14 0 -27 2v26h136v-26q-32 -4 -53.5 -16t-67.5 -52l123 -136q6 -6 17 -6v-26zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24db;" horiz-adv-x="695" d="M421 141h-146v26q33 2 33 28v267q0 27 -34 29v26h114v-322q0 -28 33 -28v-26zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89 t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24dc;" horiz-adv-x="695" d="M578 185h-136v26q15 1 21 6.5t6 18.5v129q0 46 -31 46q-28 0 -49 -28v-147q0 -12 5.5 -18t20.5 -7v-26h-133v26q15 1 21 6.5t6 18.5v135q0 40 -31 40q-27 0 -49 -30v-145q0 -12 5.5 -18t19.5 -7v-26h-137v26q19 3 25.5 8.5t6.5 18.5v161q0 15 -6 20.5t-26 8.5v26h109v-41 h4q32 48 81 48q50 0 75 -51h1q25 29 43 40t41 11q36 0 57 -23t21 -63v-139q0 -14 6 -19t23 -6v-26zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5 q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24dd;" horiz-adv-x="695" d="M497 185h-134v26q26 3 26 26v133q0 41 -29 41q-23 0 -51 -28v-146q0 -13 6 -19t22 -7v-26h-139v26q20 4 25.5 9t5.5 18v163q0 14 -6 19t-25 8v26h110v-43h1q30 50 81 50q36 0 57.5 -23t21.5 -63v-138q0 -14 6 -19.5t22 -6.5v-26zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24de;" horiz-adv-x="695" d="M492 322q0 -59 -41 -98t-105 -39q-62 0 -103 38.5t-41 98.5q0 63 41 101t106 38q62 0 102.5 -39t40.5 -100zM404 317q0 64 -13.5 90t-43.5 26q-31 0 -44 -25.5t-13 -90.5q0 -104 57 -104q29 0 43 24t14 80zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5 t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24df;" horiz-adv-x="695" d="M308 516v-40q32 47 78 47q47 0 80 -33t33 -96q0 -68 -33 -108t-92 -40q-30 0 -64 30v-59q0 -25 11 -37t39 -13v-26h-167v26q23 4 30 9.5t7 18.5v267q0 14 -7 19.5t-29 8.5v26h114zM310 431v-105q0 -15 15 -26t30 -11q29 0 42.5 22.5t13.5 74.5q0 93 -50 93 q-18 0 -34.5 -14t-16.5 -34zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5 t85 216.5z" />
+<glyph unicode="&#x24e0;" horiz-adv-x="695" d="M501 141h-164v26q31 4 39.5 12.5t8.5 32.5v68q-31 -34 -71 -34q-52 0 -85.5 35.5t-33.5 96.5q0 63 36.5 104.5t101.5 41.5q45 0 77 -32l46 32h9v-331q0 -12 7 -17t29 -9v-26zM385 314v139q0 19 -12.5 31t-29.5 12q-60 0 -60 -108q0 -99 61 -99q17 0 29 6.5t12 18.5z M695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e1;" horiz-adv-x="695" d="M334 454v-47q42 54 88 54q24 0 39.5 -14t15.5 -36q0 -20 -12 -30.5t-31 -10.5q-10 0 -14.5 1t-11 5t-15.5 14q-10 10 -14 10q-18 0 -30 -14.5t-12 -36.5v-99q0 -23 9 -30.5t40 -8.5v-26h-166v26q22 3 29.5 8t7.5 18v162q0 15 -7.5 20.5t-29.5 8.5v26h114zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e2;" horiz-adv-x="695" d="M445 370h-22q-5 30 -25 46q-24 17 -50 17q-18 0 -30.5 -8t-12.5 -19q0 -21 63 -42q49 -16 70 -37t21 -53q0 -39 -28 -64t-74 -25q-22 0 -51 8t-31 8q-13 0 -20 -16h-19v103h22q16 -75 88 -75q22 0 36 9.5t14 22.5q0 20 -64 42q-50 17 -72 38t-22 51q0 37 29.5 61t74.5 24 q16 0 39 -5.5t27 -5.5q13 0 18 11h19v-91zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88 q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e3;" horiz-adv-x="695" d="M430 217l23 -12q-25 -42 -45 -56.5t-53 -14.5q-71 0 -71 68v177h-37v28q15 8 26.5 16.5t23.5 21.5t17 19t20 26l18 27h12v-99h66v-39h-66v-163q0 -28 27 -28q21 0 39 29zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101 q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e4;" horiz-adv-x="695" d="M502 204l-118 -18v37q-30 -23 -46.5 -30.5t-42.5 -7.5q-81 0 -81 87v134q0 15 -6 20t-26 9v26h112v-191q0 -20 7.5 -28t26.5 -8q27 0 55 25v148q0 15 -8 20.5t-33 7.5v26h121v-203q0 -15 8.5 -21t30.5 -7v-26zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5 t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e5;" horiz-adv-x="695" d="M502 461v-26q-17 -1 -23.5 -5t-14.5 -21l-109 -224h-14l-88 188q-30 62 -60 62v26h166v-26q-32 0 -32 -10q0 -7 9 -25l47 -97l48 99q7 16 7 22q0 11 -36 11v26h100zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101 q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e6;" horiz-adv-x="695" d="M578 461v-26q-15 -2 -22 -7t-13 -18l-106 -225h-11l-71 176h-1l-86 -176h-12l-100 208q-12 24 -19 32t-21 10v26h150v-26q-25 -3 -25 -8q0 -6 8 -24l48 -103h1l43 92l-11 26q-7 16 -31 17v26h158v-26q-33 -3 -33 -10q0 -5 8 -29l33 -94h1l35 77q18 41 18 43q0 9 -33 13 v26h92zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e7;" horiz-adv-x="695" d="M511 186h-168v26q31 1 31 7q0 5 -24 33l-28 34l-39 -43q-16 -19 -16 -24q0 -6 34 -7v-26h-117v26q21 1 36.5 11t42.5 40l41 45l-83 104q-16 19 -38 23v26h174v-26q-33 -1 -33 -5t12 -18l37 -42l44 42q8 8 8 16q0 3 -36 7v26h117v-26q-34 -5 -52 -24l-64 -65l94 -119 q11 -14 27 -15v-26zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e8;" horiz-adv-x="695" d="M504 517v-26q-17 -2 -25.5 -8t-15.5 -20l-97 -220q-15 -35 -22.5 -49t-20.5 -31.5t-28.5 -23.5t-37.5 -6q-29 0 -47 14t-18 37q0 20 11 32t30 12q17 0 28.5 -9.5t11.5 -23.5q0 -2 -1 -5t-1 -4q0 -7 12 -7q18 0 27 12.5t28 55.5l-79 160q-2 5 -8 17l-9 18q-2 5 -7.5 15 t-9.5 14.5t-9.5 10t-11.5 7.5t-12 2v26h167v-26q-35 -2 -35 -9q0 -2 2.5 -8t6.5 -13.5t5 -9.5l48 -100l45 103q7 18 7 25q0 11 -36 12v26h102zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252z M643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e9;" horiz-adv-x="695" d="M487 291l-13 -105h-265v25l156 219q-66 0 -89 -12t-31 -51h-24l5 94h258v-26l-155 -218h14q43 0 62 6.5t34 24.5q13 14 24 43h24zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338 q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24ea;" horiz-adv-x="695" d="M496 325q0 -85 -42.5 -138t-105.5 -53q-64 0 -106.5 52.5t-42.5 136.5q0 78 37.5 136t112.5 58q71 0 109 -58t38 -134zM391 263v124q0 55 -10.5 79.5t-34.5 24.5q-23 0 -32.5 -23.5t-9.5 -80.5v-124q0 -56 10 -79.5t34 -23.5t33.5 23.5t9.5 79.5zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2500;" horiz-adv-x="708" d="M719 267h-730v73h730v-73z" />
+<glyph unicode="&#x2502;" horiz-adv-x="696" d="M385 -303h-73v1213h73v-1213z" />
+<glyph unicode="&#x250c;" horiz-adv-x="708" d="M720 267h-329v-570h-73v643h402v-73z" />
+<glyph unicode="&#x2510;" horiz-adv-x="708" d="M390 -303h-73v570h-328v73h401v-643z" />
+<glyph unicode="&#x2514;" horiz-adv-x="708" d="M720 267h-402v643h73v-570h329v-73z" />
+<glyph unicode="&#x2518;" horiz-adv-x="708" d="M390 267h-401v73h328v570l73 -1v-642z" />
+<glyph unicode="&#x251c;" horiz-adv-x="708" d="M720 267h-329v-570h-73v1213h73v-570h329v-73z" />
+<glyph unicode="&#x2524;" horiz-adv-x="708" d="M390 -303h-73v570h-328v73h328v570h73v-1213z" />
+<glyph unicode="&#x252c;" horiz-adv-x="708" d="M719 267h-329v-570h-73v570h-328v73h730v-73z" />
+<glyph unicode="&#x2534;" horiz-adv-x="708" d="M719 267h-730v73h328v570h73v-570h329v-73z" />
+<glyph unicode="&#x253c;" horiz-adv-x="708" d="M719 267h-329v-570h-73v570h-328v73h328v570h73v-570h329v-73z" />
+<glyph unicode="&#x2550;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-730v73h730v-73z" />
+<glyph unicode="&#x2551;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM484 -303h-74v1213h74v-1213z" />
+<glyph unicode="&#x2552;" horiz-adv-x="708" d="M720 174h-329v-477h-73v736h402v-73h-329v-113h329v-73z" />
+<glyph unicode="&#x2553;" horiz-adv-x="708" d="M720 267h-236v-570h-74v562h-112v-562h-73v643h495v-73z" />
+<glyph unicode="&#x2554;" horiz-adv-x="708" d="M719 360h-421v-663h-73v736h494v-73zM719 174h-235v-477h-74v550h309v-73z" />
+<glyph unicode="&#x2555;" horiz-adv-x="708" d="M390 -303h-73v477h-328v73h328v113h-328v73h401v-736z" />
+<glyph unicode="&#x2556;" horiz-adv-x="708" d="M483 -303h-73v570h-112v-570h-74v570h-235v73h494v-643z" />
+<glyph unicode="&#x2557;" horiz-adv-x="708" d="M483 -303h-73v663h-421v73h494v-736zM298 -303h-74v477h-235v73h309v-550z" />
+<glyph unicode="&#x2558;" horiz-adv-x="708" d="M720 174h-402v736h73v-477h329v-73h-329v-113h329v-73z" />
+<glyph unicode="&#x2559;" horiz-adv-x="708" d="M720 267h-495v643h73v-570h112v570h74v-570h236v-73z" />
+<glyph unicode="&#x255a;" horiz-adv-x="708" d="M719 360h-309v550h74v-477h235v-73zM719 174h-494v736h73v-663h421v-73z" />
+<glyph unicode="&#x255b;" horiz-adv-x="708" d="M390 174h-401v73h328v113h-328v73h328v477h73v-736z" />
+<glyph unicode="&#x255c;" horiz-adv-x="708" d="M483 267h-494v73h235v570h74v-570h112v570h73v-643z" />
+<glyph unicode="&#x255d;" horiz-adv-x="708" d="M298 360h-309v73h235v477h74v-550zM483 174h-494v73h421v663h73v-736z" />
+<glyph unicode="&#x255e;" horiz-adv-x="708" d="M720 174h-329v-477h-73v1213h73v-477h329v-73h-329v-113h329v-73z" />
+<glyph unicode="&#x255f;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM720 267h-236v-570h-74v1213h74v-570h236v-73z" />
+<glyph unicode="&#x2560;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM720 360h-310v550h74v-477h236v-73zM720 174h-236v-477h-74v550h310v-73z" />
+<glyph unicode="&#x2561;" horiz-adv-x="708" d="M390 -303h-73v477h-328v73h328v113h-328v73h328v477h73v-1213z" />
+<glyph unicode="&#x2562;" horiz-adv-x="708" d="M483 -303h-73v1213h73v-1213zM298 -303h-74v570h-235v73h235v570h74v-1213z" />
+<glyph unicode="&#x2563;" horiz-adv-x="708" d="M483 -303h-73v1213h73v-1213zM298 360h-309v73h235v477h74v-550zM298 -303h-74v477h-235v73h309v-550z" />
+<glyph unicode="&#x2564;" horiz-adv-x="708" d="M719 360h-730v73h730v-73zM719 174h-329v-477h-73v477h-328v73h730v-73z" />
+<glyph unicode="&#x2565;" horiz-adv-x="708" d="M719 267h-236v-570h-73v562h-112v-562h-74v570h-235v73h730v-73z" />
+<glyph unicode="&#x2566;" horiz-adv-x="708" d="M719 360h-730v73h730v-73zM719 174h-236v-477h-73v550h309v-73zM298 -303h-74v477h-235v73h309v-550z" />
+<glyph unicode="&#x2567;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-730v73h328v477h73v-477h329v-73z" />
+<glyph unicode="&#x2568;" horiz-adv-x="708" d="M719 267h-730v73h235v570h74v-570h112v570h73v-570h236v-73z" />
+<glyph unicode="&#x2569;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-309v550h73v-477h236v-73zM298 360h-309v73h235v477h74v-550z" />
+<glyph unicode="&#x256a;" horiz-adv-x="708" d="M719 174h-329v-477h-73v477h-328v73h328v113h-328v73h328v477h73v-477h329v-73h-329v-113h329v-73z" />
+<glyph unicode="&#x256b;" horiz-adv-x="708" d="M719 267h-236v-570h-73v570h-112v-570h-74v570h-235v73h235v570h74v-570h112v570h73v-570h236v-73z" />
+<glyph unicode="&#x256c;" horiz-adv-x="708" d="M719 360h-309v550h74v-477h235v-73zM298 360h-309v73h235v477h74v-550zM719 174h-235v-477h-74v550h309v-73zM298 -303h-74v477h-235v73h309v-550z" />
+<glyph unicode="&#x25b3;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM958 -39l-385 673l-386 -673h771z" />
+<glyph unicode="&#x25b7;" horiz-adv-x="1043" d="M1008 253l-938 -537v1075zM831 253l-673 386v-772z" />
+<glyph unicode="&#x25bd;" horiz-adv-x="1145" d="M1110 811l-537 -938l-538 938h1075zM958 723h-771l386 -673z" />
+<glyph unicode="&#x25c1;" horiz-adv-x="1043" d="M973 -284l-938 537l938 538v-1075zM885 -133v772l-673 -386z" />
+<glyph unicode="&#x25ca;" horiz-adv-x="790" d="M745 253l-351 -542l-349 542l350 542zM641 253l-246 380l-245 -380l244 -380z" />
+<glyph unicode="&#x25ec;" horiz-adv-x="1145" d="M1110 -127h-1075l538 938zM958 -39l-385 673l-386 -673h771zM688 239q0 -47 -34 -81t-81 -34t-81 34t-34 81t34 81t81 34t81 -34t34 -81z" />
+<glyph unicode="&#x266d;" horiz-adv-x="437" d="M146 740v-283q38 29 83 29q72 0 116 -36t44 -107q0 -169 -303 -348v745h60zM146 362v-271q123 105 123 253q0 95 -55 95q-27 0 -47.5 -24.5t-20.5 -52.5z" />
+<glyph unicode="&#x266e;" horiz-adv-x="490" d="M393 -176l-60 -34v282l-236 -96v808l60 34v-282l236 96v-808zM333 194v293l-176 -73v-293z" />
+<glyph unicode="&#x266f;" horiz-adv-x="490" d="M438 97l-60 -19v-192l-60 -24v198l-146 -47v-199l-60 -24v205l-60 -19v117l60 19v304l-60 -19v117l60 19v178l60 24v-183l146 45v197l60 24v-202l60 19v-117l-60 -19v-304l60 19v-117zM318 177v303l-146 -45v-305z" />
+<glyph unicode="&#x27c8;" horiz-adv-x="1025" d="M943 -13h-288q-128 0 -208 81t-80 199q0 119 80.5 199.5t210.5 80.5h285v-88h-301q-76 0 -131.5 -56t-55.5 -136t56 -136t132 -56h300v-88zM330 -13h-84l-184 558h83z" />
+<glyph unicode="&#x27c9;" horiz-adv-x="1025" d="M943 545l-184 -558h-84l185 558h83zM62 547h285q130 0 210.5 -80.5t80.5 -199.5q0 -118 -80 -199t-208 -81h-288v88h300q76 0 132 56t56 136t-55.5 136t-131.5 56h-301v88z" />
+<glyph unicode="&#x27e8;" horiz-adv-x="445" d="M399 -193h-100l-230 455v15l226 455h100l-230 -462z" />
+<glyph unicode="&#x27e9;" horiz-adv-x="445" d="M376 262l-230 -455h-100l234 463l-230 462h100l226 -455v-15z" />
+<glyph unicode="&#x2980;" horiz-adv-x="675" d="M570 -200h-88v905h88v-905zM382 -200h-88v905h88v-905zM193 -200h-88v905h88v-905z" />
+<glyph unicode="&#x29b6;" horiz-adv-x="864" d="M814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM476 543v-582q107 16 178.5 99t71.5 192t-71.5 192t-178.5 99zM388 -39v582q-107 -16 -178.5 -99t-71.5 -192t71.5 -192t178.5 -99z" />
+<glyph unicode="&#x29b7;" horiz-adv-x="864" d="M582 39h-88v426h88v-426zM368 39h-88v426h88v-426zM814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM726 252q0 122 -86 208t-208 86t-208 -86t-86 -208t86 -208t208 -86t208 86t86 208z" />
+<glyph unicode="&#x29b8;" horiz-adv-x="864" d="M814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM258 489l411 -411q57 76 57 174q0 122 -86 208t-208 86q-98 0 -174 -57zM606 15l-411 411q-57 -76 -57 -174q0 -122 86 -208t208 -86q98 0 174 57z" />
+<glyph unicode="&#x29c0;" horiz-adv-x="864" d="M579 35l-391 197v39l391 198v-101l-232 -115l232 -115v-103zM814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM726 252q0 122 -86 208t-208 86t-208 -86t-86 -208t86 -208t208 -86t208 86t86 208z" />
+<glyph unicode="&#x29c1;" horiz-adv-x="864" d="M676 232l-391 -197v103l232 115l-232 115v101l391 -198v-39zM814 252q0 -158 -112 -270t-270 -112t-270 112t-112 270t112 270t270 112t270 -112t112 -270zM726 252q0 122 -86 208t-208 86t-208 -86t-86 -208t86 -208t208 -86t208 86t86 208z" />
+<glyph unicode="&#x29c4;" horiz-adv-x="910" d="M865 -158h-820v819h820v-819zM777 -70v590l-590 -590h590zM730 573h-597v-597z" />
+<glyph unicode="&#x29c5;" horiz-adv-x="910" d="M865 -158h-820v819h820v-819zM777 -20v593h-593zM727 -70l-594 594v-594h594z" />
+<glyph unicode="&#x29c6;" horiz-adv-x="910" d="M663 338q0 -29 -31 -47q-15 -9 -63.5 -18t-73.5 -20q22 -9 72.5 -19.5t63.5 -18.5q30 -18 30 -48q0 -22 -16 -40t-41 -18q-19 0 -39.5 18t-47 50t-42.5 47q3 -23 20 -75.5t17 -66.5q0 -24 -15 -42.5t-42 -18.5t-42 18.5t-15 42.5q0 14 17 66.5t20 75.5q-18 -16 -53 -57 t-44 -46q-20 -11 -37 -11q-24 0 -39.5 15.5t-15.5 35.5q0 37 30 55q12 7 66 18.5t73 18.5q-18 7 -74 19t-69 20q-29 18 -29 46q0 22 16 41.5t39 19.5q14 0 31 -9q13 -7 50.5 -47t55.5 -55q-3 24 -20 76t-17 66q0 25 14 42t43 17q26 0 41.5 -17.5t15.5 -41.5 q0 -14 -16.5 -65.5t-20.5 -76.5q23 18 56.5 57t45.5 45q17 9 31 9q23 0 39 -19.5t16 -41.5zM865 -158h-820v819h820v-819zM777 -70v643h-644v-643h644z" />
+<glyph unicode="&#x29c7;" horiz-adv-x="910" d="M662 253q0 -85 -61 -146t-146 -61t-146 61t-61 146t61 146t146 61t146 -61t61 -146zM592 253q0 62 -37.5 99.5t-99.5 37.5t-99.5 -37.5t-37.5 -99.5t37.5 -99.5t99.5 -37.5t99.5 37.5t37.5 99.5zM865 -158h-820v819h820v-819zM777 -70v643h-644v-643h644z" />
+<glyph unicode="&#x2a0c;" horiz-adv-x="1484" d="M855 -108l178 711q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-45 0 -87 -169l-178 -711q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24 q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170zM544 -108l178 711q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169l-177 -711 q-22 -91 -86 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170zM234 -108l178 711q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13 t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-45 0 -87 -169l-178 -711q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170zM1165 -108l178 711q21 85 90 156 q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-45 0 -87 -169l-178 -711q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34 t-13.5 -21q0 -12 17 -12q45 0 87 170z" />
+<glyph unicode="&#x2a0d;" horiz-adv-x="593" d="M334 292l78 311q21 85 90 156q63 65 142 65q39 0 64 -19t25 -56q0 -33 -22.5 -56t-55.5 -23q-19 0 -33 13.5t-14 32.5q0 16 13.5 33t13.5 22q0 11 -17 11q-46 0 -87 -169l-80 -321h180v-80h-200l-78 -310q-22 -89 -84.5 -155.5t-147.5 -66.5q-38 0 -63.5 19.5t-25.5 56.5 q0 33 22.5 56t55.5 23q19 0 33 -13.5t14 -32.5q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q46 0 87 170l80 320h-177v80h197z" />
+<glyph unicode="&#x2a0e;" horiz-adv-x="593" d="M360 394l52 209q21 85 86 153t146 68q39 0 64 -19t25 -56q0 -33 -22.5 -56t-55.5 -23q-19 0 -33 13.5t-14 32.5q0 16 13.5 33t13.5 22q0 11 -17 11q-46 0 -87 -169l-55 -219h155v-80h-175l-31 -125h206v-80h-226l-52 -207q-22 -89 -84.5 -155.5t-147.5 -66.5 q-38 0 -63.5 19.5t-25.5 56.5q0 33 22.5 56t55.5 23q19 0 33 -13.5t14 -32.5q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q46 0 87 170l54 217h-151v80h171l32 125h-203v80h223z" />
+<glyph unicode="&#x2a0f;" horiz-adv-x="593" d="M325 254l87 349q21 85 90 156q63 65 142 65q39 0 64 -19t25 -56q0 -33 -22.5 -56t-55.5 -23q-19 0 -33 13.5t-14 32.5q0 16 13.5 33t13.5 22q0 11 -17 11q-46 0 -87 -169l-71 -285l172 95l38 -72l-237 -130l-80 -319q-22 -89 -84.5 -155.5t-147.5 -66.5q-38 0 -63.5 19.5 t-25.5 56.5q0 33 22.5 56t55.5 23q19 0 33 -13.5t14 -32.5q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q46 0 87 170l64 254l-165 -90l-38 71z" />
+<glyph unicode="&#x2a10;" horiz-adv-x="593" d="M383 490l29 113q23 88 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-44 0 -87 -169l-38 -150q71 -39 105 -113l-46 -24q-23 53 -72 84l-85 -338q40 3 75 22l24 -46q-51 -28 -111 -28h-1 l-29 -118q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34.5t-13.5 -21.5q0 -11 17 -11q45 0 87 170l39 155q-57 30 -91 85.5t-34 122.5q0 97 69 166t166 69zM369 437v1q-71 -5 -120 -58t-49 -125 q0 -48 23 -89.5t63 -65.5z" />
+<glyph unicode="&#x2a11;" horiz-adv-x="593" d="M363 407l49 196q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169l-53 -214l-51 -200q86 13 129 87q4 6 4 11q0 7 -9 7q-17 0 -59 -11l-9 30q75 10 131 45l5 -2 q16 -60 59 -125l-24 -12q-22 49 -38 49q-4 0 -14 -14q-22 -38 -37 -53q-61 -63 -151 -68l-61 -241q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170l69 275 q-56 28 -90 82t-34 119h52q0 -45 23 -86t62 -64z" />
+<glyph unicode="&#x2a12;" horiz-adv-x="613" d="M473 253q0 -37 -26.5 -63.5t-63.5 -26.5q-41 0 -65.5 24.5t-24.5 65.5q0 37 26.5 63.5t63.5 26.5t63.5 -26.5t26.5 -63.5zM369 435l43 168q23 88 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21 q0 11 -17 11q-44 0 -87 -169l-32 -126h1h139v-470h-254h-3l-29 -115q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170l44 177h309v366h-99h-119z" />
+<glyph unicode="&#x2a13;" horiz-adv-x="593" d="M473 253q0 -36 -25.5 -63t-64.5 -27q-40 0 -65 24.5t-25 65.5q0 39 27.5 64.5t62.5 25.5q36 0 63 -25.5t27 -64.5zM370 438l42 165q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11 q-44 0 -87 -169l-38 -150q57 -31 91 -86.5t34 -121.5q0 -97 -69 -166t-166 -69h-1l-29 -118q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34.5t-13.5 -21.5q0 -11 17 -11q45 0 87 170l52 208 q44 -28 97 -28q76 0 129.5 53.5t53.5 129.5t-53.5 129.5t-129.5 53.5h-13z" />
+<glyph unicode="&#x2a14;" horiz-adv-x="675" d="M590 253q0 -36 -25.5 -63t-64.5 -27q-40 0 -65 24.5t-25 65.5q0 39 27.5 64.5t62.5 25.5q36 0 63 -25.5t27 -64.5zM531 613l-31 -123q98 0 166.5 -69t68.5 -166t-68.5 -166t-166.5 -69q-60 0 -111 28l-36 -146q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5 t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170l84 340q9 -68 61 -114t121 -46q76 0 129.5 53.5t53.5 129.5t-53.5 129.5t-129.5 53.5q-91 0 -148 -75l60 240q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54 q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169z" />
+<glyph unicode="&#x2a15;" horiz-adv-x="593" d="M473 253q0 -37 -26.5 -63.5t-63.5 -26.5q-41 0 -65.5 24.5t-24.5 65.5q0 37 26.5 63.5t63.5 26.5t63.5 -26.5t26.5 -63.5zM383 490l29 113q22 86 86.5 153.5t145.5 67.5q39 0 64 -19t25 -56q0 -33 -22.5 -56t-55.5 -23q-19 0 -33 13.5t-14 32.5q0 17 13.5 34t13.5 21 q0 11 -17 11q-46 0 -87 -169l-38 -150q58 -31 91.5 -87t33.5 -121q0 -97 -69 -166t-167 -69l-29 -118q-22 -89 -84.5 -155.5t-147.5 -66.5q-38 0 -63.5 19.5t-25.5 56.5q0 33 22.5 56t55.5 23q19 0 33 -13.5t14 -32.5q0 -17 -13.5 -34t-13.5 -22q0 -11 17 -11q46 0 87 170 l39 155q-58 31 -91.5 87t-33.5 121q0 97 69 166t166 69zM566 255q0 76 -53.5 129.5t-129.5 53.5t-129.5 -53.5t-53.5 -129.5t53.5 -129.5t129.5 -53.5t129.5 53.5t53.5 129.5z" />
+<glyph unicode="&#x2a16;" horiz-adv-x="623" d="M383 487l29 116q21 85 86 153t146 68q39 0 64 -19t25 -56q0 -33 -22.5 -56t-55.5 -23q-19 0 -33 13.5t-14 32.5q0 16 13.5 33t13.5 22q0 11 -17 11q-46 0 -87 -169l-32 -126h140v-470h-257l-29 -115q-22 -89 -84.5 -155.5t-147.5 -66.5q-38 0 -63.5 19.5t-25.5 56.5 q0 33 22.5 56t55.5 23q19 0 33 -13.5t14 -32.5q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q46 0 87 170l31 125h-139v470h257zM587 69v366h-101l-91 -366h192zM370 435h-192v-366h100z" />
+<glyph unicode="&#x2a17;" horiz-adv-x="791" d="M537 312h197q57 0 97 -40.5t40 -97.5q0 -50 -37 -92.5t-87 -42.5h-81v81h78q19 0 31 16t15 36v2q0 24 -17.5 40.5t-41.5 16.5h-214l-82 -329q-22 -89 -84.5 -155.5t-147.5 -66.5q-38 0 -63.5 19.5t-25.5 56.5q0 33 22.5 56t55.5 23q19 0 33 -13.5t14 -32.5 q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q46 0 87 170l84 339h-185q-6 0 -11.5 -4.5t-5.5 -10.5t12 -20q56 -58 86 -102l-23 -23q-123 142 -241 192v14q116 50 244 196l21 -24q-29 -40 -58 -72l-28 -30q-12 -14 -12 -23q0 -12 15 -12h207l73 291q21 85 90 156q63 65 142 65 q39 0 64 -19t25 -56q0 -33 -22.5 -56t-55.5 -23q-19 0 -33 13.5t-14 32.5q0 16 13.5 33t13.5 22q0 11 -17 11q-46 0 -87 -169z" />
+<glyph unicode="&#x2a18;" horiz-adv-x="633" d="M347 344l65 259q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-44 0 -87 -169l-55 -219l118 107l60 -60l-209 -190l199 -188l-60 -60l-166 157l-65 -258q-23 -92 -85 -156 q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170l54 216l-116 -105l-60 60l208 189l-199 189l60 60z" />
+<glyph unicode="&#x2a19;" horiz-adv-x="653" d="M390 514l22 89q21 85 86 153t146 68q39 0 64 -19t25 -56q0 -33 -22.5 -56t-55.5 -23q-19 0 -33 13.5t-14 32.5q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169l-32 -126q78 -36 124.5 -108t46.5 -158v-232h-80v232q0 58 -29.5 108t-80.5 78l-127 -505 q-22 -89 -84.5 -155.5t-147.5 -66.5q-38 0 -63.5 19.5t-25.5 56.5q0 33 22.5 56t55.5 23q19 0 33 -13.5t14 -32.5q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q46 0 87 170l136 542q-87 -2 -147 -64.5t-60 -148.5v-232h-80v232q0 123 86 208t208 85h13z" />
+<glyph unicode="&#x2a1a;" horiz-adv-x="653" d="M284 94l128 509q21 85 90 156q63 65 142 65q39 0 64 -19t25 -56q0 -33 -22.5 -56t-55.5 -23q-19 0 -33 13.5t-14 32.5q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169l-136 -544q85 5 144 66.5t59 146.5v232h80v-232q0 -122 -86.5 -207.5t-207.5 -85.5h-9l-22 -87 q-22 -89 -84.5 -155.5t-147.5 -66.5q-38 0 -63.5 19.5t-25.5 56.5q0 33 22.5 56t55.5 23q19 0 33 -13.5t14 -32.5q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q46 0 87 170l31 122q-79 35 -126.5 108t-47.5 160v232h80v-232q0 -59 30.5 -110t82.5 -78z" />
+<glyph unicode="&#x2a1b;" horiz-adv-x="557" d="M737 879h-506v80h506v-80zM234 -108l178 711q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-46 0 -87 -169l-178 -711q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5 q0 31 21 55t57 24q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170z" />
+<glyph unicode="&#x2a1c;" horiz-adv-x="557" d="M238 -108l178 711q21 85 90 156q63 65 142 65q43 0 66 -21t23 -54q0 -31 -21 -55t-57 -24q-18 0 -32.5 13t-14.5 33q0 17 13.5 34t13.5 21q0 11 -17 11q-45 0 -87 -169l-178 -711q-23 -92 -85 -156q-64 -66 -147 -66q-43 0 -66 21.5t-23 54.5q0 31 21 55t57 24 q18 0 32.5 -13t14.5 -33q0 -17 -13.5 -34t-13.5 -21q0 -12 17 -12q45 0 87 170zM538 -455h-506v80h506v-80z" />
+<glyph unicode="&#x2a22;" d="M685 209h-266v-266h-88v266h-266v88h266v266h88v-266h266v-88zM519 750q0 -60 -42 -102t-103 -42q-60 0 -102 42t-42 102t42 102t102 42q61 0 103 -42t42 -102zM449 751q0 34 -20.5 53.5t-54.5 19.5t-54 -20t-20 -54q0 -35 20 -54.5t55 -19.5q34 0 54 20t20 55z" />
+<glyph unicode="&#x2a23;" d="M546 560h-57l-112 98l-112 -98h-56l122 176h92zM685 209h-266v-266h-88v266h-266v88h266v266h88v-266h266v-88z" />
+<glyph unicode="&#x2a24;" d="M685 209h-266v-266h-88v266h-266v88h266v266h88v-266h266v-88zM553 746h39q-4 -60 -40 -111.5t-87 -51.5q-36 0 -104 44t-85 44q-26 0 -48.5 -23.5t-30.5 -64.5h-40q3 66 40.5 114.5t89.5 48.5q36 0 104 -44t85 -44q27 0 47.5 23t29.5 65z" />
+<glyph unicode="&#x2a25;" d="M685 209h-266v-266h-88v266h-266v88h266v266h88v-266h266v-88zM457 -205q0 -34 -24 -58t-58 -24t-58 24t-24 58t24 58t58 24t58 -24t24 -58z" />
+<glyph unicode="&#x2a26;" d="M685 209h-266v-266h-88v266h-266v88h266v266h88v-266h266v-88zM552 -77h40q-3 -66 -40.5 -114.5t-89.5 -48.5q-36 0 -104 44t-85 44q-27 0 -47.5 -23t-29.5 -65h-39q4 60 40 111.5t87 51.5q36 0 104 -44t85 -44q26 0 48.5 23.5t30.5 64.5z" />
+<glyph unicode="&#x2a27;" horiz-adv-x="780" d="M685 209h-266v-266h-88v266h-266v88h266v266h88v-266h266v-88zM778 -120l-30 -127h-270v14q112 111 148 161t36 94q0 32 -22 54t-53 22q-47 0 -76 -54h-24q49 122 144 122q52 0 85.5 -31t33.5 -80q0 -33 -16.5 -62.5t-57.5 -67.5l-93 -87v-5h86q50 0 64.5 7.5t28.5 39.5 h16z" />
+<glyph unicode="&#x2a2a;" d="M685 209h-619v88h619v-88zM456 45q0 -34 -24 -58t-58 -24t-58 24t-24 58t24 58t58 24t58 -24t24 -58z" />
+<glyph unicode="&#x2a2b;" d="M685 209h-619v88h619v-88zM685 461q0 -34 -24 -58t-58 -24t-58 24t-24 58t24 58t58 24t58 -24t24 -58zM685 45q0 -34 -24 -58t-58 -24t-58 24t-24 58t24 58t58 24t58 -24t24 -58zM230 461q0 -34 -24 -58t-58 -24t-58 24t-24 58t24 58t58 24t58 -24t24 -58zM230 45 q0 -34 -24 -58t-58 -24t-58 24t-24 58t24 58t58 24t58 -24t24 -58z" />
+<glyph unicode="&#x2a30;" horiz-adv-x="702" d="M636 29l-62 -62l-223 224l-223 -224l-62 62l223 224l-222 223l62 62l222 -223l223 223l62 -62l-223 -223zM433 661q0 -34 -24.5 -58.5t-59.5 -24.5t-59 24t-24 59t24.5 59.5t58.5 24.5q35 0 59.5 -24.5t24.5 -59.5z" />
+<glyph unicode="&#x2a31;" horiz-adv-x="702" d="M636 29l-62 -62l-223 224l-223 -224l-62 62l223 224l-222 223l62 62l222 -223l223 223l62 -62l-223 -223zM574 -191h-446v88h446v-88z" />
+<glyph unicode="&#x2a32;" horiz-adv-x="702" d="M636 -59h-570v88l223 224l-222 223l62 62l222 -223l223 223l62 -62l-223 -223l223 -224v-88zM512 29l-161 162l-161 -162h322z" />
+<glyph unicode="&#x2a3f;" horiz-adv-x="734" d="M707 0h-679v24q53 3 65 21t12 78v439q0 57 -12 71.5t-66 18.5v24h282v-24q-51 -4 -63 -19.5t-12 -70.5v-512h266v512q0 57 -12 71.5t-65 18.5v24h284v-24q-52 -4 -65 -19.5t-13 -70.5v-450q0 -52 13.5 -68.5t64.5 -19.5v-24z" />
+<glyph unicode="&#x2a5e;" horiz-adv-x="640" d="M588 -28h-94l-174 413l-174 -413h-94l234 564h68zM573 799h-506v88h506v-88zM573 609h-506v88h506v-88z" />
+<glyph unicode="&#x2a63;" horiz-adv-x="640" d="M573 -189h-506v88h506v-88zM588 536l-234 -564h-68l-234 564h94l174 -413l174 413h94zM573 -379h-506v88h506v-88z" />
+<glyph unicode="&#x2a66;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM458 -77q0 -35 -24.5 -59.5t-58.5 -24.5q-35 0 -59.5 24.5t-24.5 59.5q0 34 24.5 58.5t59.5 24.5t59 -24t24 -59z" />
+<glyph unicode="&#x2a67;" d="M682 419h-614v88h614v-88zM682 223h-614v88h614v-88zM682 27h-614v88h614v-88zM458 691q0 -35 -24 -59t-59 -24t-59.5 24.5t-24.5 58.5q0 35 24.5 59.5t59.5 24.5q34 0 58.5 -24.5t24.5 -59.5z" />
+<glyph unicode="&#x2a6a;" d="M628 374h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM457 481q0 -34 -24.5 -58.5t-59.5 -24.5t-59 24t-24 59t24.5 59.5t58.5 24.5 q35 0 59.5 -24.5t24.5 -59.5z" />
+<glyph unicode="&#x2a6d;" d="M629 568h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM682 144h-614v88h614v-88zM682 -60h-614v88h614v-88zM458 675q0 -34 -24.5 -58.5 t-59.5 -24.5q-34 0 -58.5 24t-24.5 59t24.5 59.5t58.5 24.5t59 -24.5t25 -59.5z" />
+<glyph unicode="&#x2a6e;" d="M682 311h-614v88h614v-88zM682 107h-614v88h614v-88zM386 690l7 -3q30 24 42 35.5t30 38.5q14 22 26.5 30t29.5 8q21 0 37 -14.5t16 -33.5q0 -23 -25.5 -38t-56.5 -15q-33 0 -48.5 -4.5t-40.5 -21.5v-8q51 -24 97 -28q40 -3 56.5 -14.5t16.5 -36.5q0 -22 -13 -36t-36 -14 q-19 0 -32.5 11.5t-42.5 50.5q-15 21 -25.5 30t-31.5 20l-6 -4q1 -32 6 -49t21 -49q15 -29 15 -45q0 -22 -14.5 -37t-36.5 -15q-21 0 -35 14.5t-14 37.5q0 17 16 46q14 24 18 42t5 55l-6 4q-29 -22 -41.5 -34.5t-32.5 -40.5q-15 -22 -26.5 -29.5t-28.5 -7.5 q-21 0 -35.5 13.5t-14.5 34.5q0 47 84 53q32 2 47 7.5t39 21.5v7q-47 21 -102 26q-68 5 -68 53q0 22 13 35t34 13t34 -9t28 -34q17 -29 29.5 -41t41.5 -28l5 3q-1 33 -4.5 48t-18.5 43q-18 32 -18 53q0 22 14.5 36t37.5 14q21 0 34.5 -15t13.5 -40q0 -15 -18 -47 q-22 -37 -22 -77v-15z" />
+<glyph unicode="&#x2a6f;" d="M629 268h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM629 508h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5 q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM546 576h-57l-112 98l-112 -98h-56l122 176h92z" />
+<glyph unicode="&#x2a70;" d="M629 440h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM629 680h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5 q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM681 28h-590v88h590v-88zM681 -176h-590v88h590v-88z" />
+<glyph unicode="&#x2a71;" d="M685 577h-619v88h619v-88zM685 373h-619v88h619v-88zM685 47h-266v-206h-88v206h-266v88h266v215h88v-215h266v-88z" />
+<glyph unicode="&#x2a72;" d="M684 45h-619v88h619v-88zM684 -159h-619v88h619v-88zM685 371h-266v-215h-88v215h-266v88h266v206h88v-206h266v-88z" />
+<glyph unicode="&#x2a73;" d="M682 480h-614v88h614v-88zM682 276h-614v88h614v-88zM628 182h54q-5 -94 -53.5 -159t-125.5 -65q-45 0 -98.5 29.5t-98.5 59t-71 29.5q-80 0 -114 -136h-54q6 87 52.5 155.5t121.5 68.5q44 0 98 -29.5t100.5 -59t74.5 -29.5q80 0 114 136z" />
+<glyph unicode="&#x2a7d;" d="M670 90l-590 260v40l590 258v-88l-436 -190l436 -192v-88zM670 -140l-590 260v88l590 -260v-88z" />
+<glyph unicode="&#x2a7e;" d="M670 350l-590 -260v88l436 192l-436 190v88l590 -258v-40zM670 120l-590 -260v88l590 260v-88z" />
+<glyph unicode="&#x2a87;" d="M670 88l-590 258v40l590 260v-88l-436 -192l436 -190v-88zM670 -101h-288l-60 -112h-77l60 112h-225v88h272l60 113h77l-60 -113h241v-88z" />
+<glyph unicode="&#x2a88;" d="M670 346l-590 -258v88l436 190l-436 192v88l590 -260v-40zM670 -101h-288l-60 -112h-77l60 112h-225v88h272l60 113h77l-60 -113h241v-88z" />
+<glyph unicode="&#x2a89;" d="M670 234l-590 259v40l590 259v-88l-436 -191l436 -191v-88zM628 -45h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-29 0 -64 13.5t-56 26t-58 37.5l-57 -113h-77l74 146q-21 8 -35 8q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q30 0 66 -13l52 102l-24 15l-24 15q-7 5 -21 13 t-22 11t-18.5 6t-19.5 3q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q27 0 58 -11.5t51 -23t52 -32.5l52 103h77l-71 -139q30 -15 49 -15q80 0 114 136h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-38 0 -84 22l-51 -101q14 -8 39 -24.5t39 -25t32 -16t31 -7.5q80 0 114 136z " />
+<glyph unicode="&#x2a8a;" d="M670 493l-590 -259v88l436 191l-436 191v88l590 -259v-40zM628 -45h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-29 0 -64 13.5t-56 26t-58 37.5l-57 -113h-77l74 146q-21 8 -35 8q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q30 0 66 -13l52 102l-24 15l-24 15q-7 5 -21 13 t-22 11t-18.5 6t-19.5 3q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q27 0 58 -11.5t51 -23t52 -32.5l52 103h77l-71 -139q30 -15 49 -15q80 0 114 136h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-38 0 -84 22l-51 -101q14 -8 39 -24.5t39 -25t32 -16t31 -7.5q80 0 114 136z " />
+<glyph unicode="&#x2a95;" d="M670 -140l-590 258v40l590 260v-88l-436 -192l436 -190v-88zM670 560l-590 -260v88l590 260v-88z" />
+<glyph unicode="&#x2a96;" d="M670 118l-590 -258v88l436 190l-436 192v88l590 -260v-40zM670 300l-590 260v88l590 -260v-88z" />
+<glyph unicode="&#x2a9d;" d="M628 689h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM672 -183l-590 258v40l590 260v-88l-436 -192l436 -190v-88z" />
+<glyph unicode="&#x2a9e;" d="M628 689h54q-6 -87 -52.5 -155.5t-121.5 -68.5q-44 0 -98 29.5t-100.5 59t-74.5 29.5q-80 0 -114 -136h-54q5 94 53.5 159t125.5 65q45 0 98.5 -29.5t98.5 -59t71 -29.5q80 0 114 136zM672 75l-590 -258v88l436 190l-436 192v88l590 -260v-40z" />
+<glyph unicode="&#x2aaf;" d="M670 186v-121q-94 98 -227 154.5t-279 70.5l-84 8v88l84 8q146 14 279 70.5t227 154.5v-121q-107 -98 -299 -156q192 -58 299 -156zM670 -111h-590v88h590v-88z" />
+<glyph unicode="&#x2ab0;" d="M670 298l-84 -8q-146 -14 -279 -70.5t-227 -154.5v121q107 98 299 156q-192 58 -299 156v121q94 -98 227 -154.5t279 -70.5l84 -8v-88zM670 -111h-590v88h590v-88z" />
+<glyph unicode="&#x2abd;" d="M668 -13h-298q-128 0 -208 81t-80 199q0 119 80.5 199.5t210.5 80.5h295v-88h-311q-76 0 -131.5 -56t-55.5 -136t56 -136t132 -56h310v-88zM499 267q0 -29 -20.5 -49t-48.5 -20t-48.5 20t-20.5 49t20.5 49t48.5 20t48.5 -20t20.5 -49z" />
+<glyph unicode="&#x2abe;" d="M82 547h295q130 0 210.5 -80.5t80.5 -199.5q0 -118 -80 -199t-208 -81h-298v88h310q76 0 132 56t56 136t-55.5 136t-131.5 56h-311v88zM389 267q0 -29 -20.5 -49t-48.5 -20t-48.5 20t-20.5 49t20.5 49t48.5 20t48.5 -20t20.5 -49z" />
+<glyph unicode="&#x2ac5;" d="M670 170h-298q-128 0 -208 81t-80 199q0 119 80.5 199.5t210.5 80.5h295v-88h-311q-76 0 -131.5 -56t-55.5 -136t56 -136t132 -56h310v-88zM670 -18h-590v88h590v-88zM670 -222h-590v88h590v-88z" />
+<glyph unicode="&#x2ac6;" d="M80 730h295q130 0 210.5 -80.5t80.5 -199.5q0 -118 -80 -199t-208 -81h-298v88h310q76 0 132 56t56 136t-55.5 136t-131.5 56h-311v88zM670 -18h-590v88h590v-88zM670 -222h-590v88h590v-88z" />
+<glyph unicode="&#x1d400;" horiz-adv-x="722" d="M689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#x1d401;" horiz-adv-x="667" d="M426 365v-1q85 -11 139 -58.5t54 -117.5q0 -83 -72 -135.5t-202 -52.5h-329v25q55 6 71.5 21t16.5 57v467q0 44 -18.5 60.5t-69.5 20.5v25h317q121 0 186.5 -41.5t65.5 -118.5q0 -59 -37 -96.5t-122 -54.5zM264 592v-219q91 0 123.5 30t32.5 106q0 137 -99 137 q-30 0 -43.5 -12.5t-13.5 -41.5zM264 343v-245q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 155 -157 155h-26z" />
+<glyph unicode="&#x1d402;" horiz-adv-x="722" d="M657 152l30 -25q-67 -83 -132.5 -114.5t-155.5 -31.5q-159 0 -254.5 96.5t-95.5 245.5q0 160 97.5 264t249.5 104q71 0 156 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25q-22 62 -67 115q-75 90 -167 90q-81 0 -132.5 -83.5t-51.5 -229.5q0 -155 54 -240 q22 -34 62.5 -55t84.5 -21q64 0 126 34q41 23 104 89z" />
+<glyph unicode="&#x1d403;" horiz-adv-x="722" d="M14 676h312q171 0 267.5 -88t96.5 -243q0 -77 -30.5 -147t-84.5 -117q-93 -81 -252 -81h-309v25q43 1 63 19t20 54v486q0 34 -17.5 48t-65.5 19v25zM259 598v-498q0 -35 12.5 -50t45.5 -15q98 0 149 72q23 33 36.5 94.5t13.5 128.5q0 139 -41 211q-58 101 -163 101 q-53 0 -53 -44z" />
+<glyph unicode="&#x1d404;" horiz-adv-x="667" d="M641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54 q25 20 42 46t40 77h28z" />
+<glyph unicode="&#x1d405;" horiz-adv-x="611" d="M583 474h-24q-10 57 -22 81.5t-38 47.5q-45 39 -163 39q-38 0 -54 -11.5t-16 -39.5v-228q75 0 109 32.5t44 116.5h25v-338h-25q-7 87 -41 120t-112 35v-228q0 -43 21 -58t89 -18v-25h-360v25q55 6 71.5 21t16.5 57v472q0 43 -18 58t-70 18v25h567v-202z" />
+<glyph unicode="&#x1d406;" horiz-adv-x="778" d="M755 287v-25q-53 -6 -69.5 -27.5t-16.5 -72.5v-118q-49 -29 -124 -46t-153 -17q-154 0 -254.5 96t-100.5 254q0 151 99.5 255.5t248.5 104.5q70 0 155 -35q32 -14 46 -14t23.5 9.5t20.5 36.5h27v-235h-25q-29 63 -47.5 92.5t-48.5 56.5q-63 56 -138 56q-88 0 -136 -83 t-48 -237q0 -157 48 -237q27 -45 63 -66t92 -21q96 0 96 85v89q0 40 -19.5 55t-82.5 19v25h344z" />
+<glyph unicode="&#x1d407;" horiz-adv-x="778" d="M759 0h-339v25q54 6 71.5 20.5t17.5 52.5v228h-241v-228q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-204h241v204q0 41 -18 55.5t-71 18.5v25h339v-25q-51 -4 -69.5 -19t-18.5 -55v-479 q0 -39 16.5 -52.5t71.5 -20.5v-25z" />
+<glyph unicode="&#x1d408;" horiz-adv-x="389" d="M370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x1d409;" horiz-adv-x="500" d="M478 676v-25q-55 -4 -71.5 -22t-16.5 -73v-430q0 -222 -212 -222q-74 0 -108 23q-29 20 -48 50t-19 60q0 28 21.5 51t49.5 23t50 -23t22 -53q0 -15 -13.5 -34t-13.5 -32q0 -32 45 -32q34 0 49 21.5t15 68.5v550q0 43 -20 57.5t-81 16.5v25h351z" />
+<glyph unicode="&#x1d40a;" horiz-adv-x="778" d="M769 0h-334v25q47 1 62 6t15 15q0 13 -25 45l-181 225l-27 -25v-196q0 -37 16.5 -50t70.5 -20v-25h-336v25q55 5 71 19t16 57v472q0 46 -17 60.5t-70 17.5v25h337v-25q-54 -4 -71 -20.5t-17 -63.5v-223l212 215q24 24 32 35t8 23q0 15 -10.5 22t-37.5 9l-35 3v25h289v-25 q-78 -9 -133 -46.5t-189 -180.5l305 -378q16 -20 49 -21v-25z" />
+<glyph unicode="&#x1d40b;" horiz-adv-x="667" d="M638 227l-42 -227h-577v25q55 7 70.5 20t15.5 53v478q0 42 -17.5 57t-68.5 18v25h348v-24q-65 -3 -82.5 -20t-17.5 -79v-464q0 -33 18.5 -45.5t66.5 -12.5q109 0 170 55q42 39 87 141h29z" />
+<glyph unicode="&#x1d40c;" horiz-adv-x="944" d="M921 0h-332v25q55 5 72 22t17 62v496l-252 -605h-27l-252 594v-465q0 -58 20 -79t81 -25v-25h-234v25q59 6 75 20.5t16 62.5v469q0 41 -17 55.5t-72 18.5v25h253l199 -472l201 472h252v-25q-55 -4 -71.5 -22.5t-16.5 -74.5v-428q0 -57 15 -76.5t73 -24.5v-25z" />
+<glyph unicode="&#x1d40d;" horiz-adv-x="722" d="M701 676v-25q-50 -8 -64 -22.5t-14 -60.5v-586h-28l-447 545v-396q0 -58 18 -78.5t76 -27.5v-25h-226v25q55 7 71.5 22.5t16.5 61.5v470q-52 72 -85 72v25h211l349 -430v299q0 60 -18 80.5t-74 25.5v25h214z" />
+<glyph unicode="&#x1d40e;" horiz-adv-x="778" d="M743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#x1d40f;" horiz-adv-x="611" d="M16 676h315q128 0 198.5 -45.5t70.5 -135.5q0 -60 -33.5 -104.5t-95.5 -67.5q-32 -12 -70.5 -15.5t-138.5 -4.5v-192q0 -51 14 -65t73 -21v-25h-333v25q33 3 45 9q23 9 31 30t8 62v427q0 58 -15.5 75.5t-68.5 22.5v25zM262 606v-268q94 1 130 32t36 114q0 84 -27 120.5 t-89 36.5q-50 0 -50 -35z" />
+<glyph unicode="&#x1d410;" horiz-adv-x="778" d="M730 -117l6 -24q-91 -35 -179 -35q-140 0 -228 88q-29 29 -56 86q-113 34 -175.5 123.5t-62.5 208.5q0 161 99.5 261t254.5 100q156 0 255 -100t99 -264q0 -126 -66 -211t-187 -122q23 -47 47 -71q52 -52 123 -52q30 0 70 12zM566 335q0 158 -46 240.5t-132 82.5 q-84 0 -130 -83.5t-46 -239.5t45 -238.5t132 -82.5q86 0 131.5 83t45.5 238z" />
+<glyph unicode="&#x1d411;" horiz-adv-x="722" d="M716 0h-205l-207 313h-28v-196q0 -54 14.5 -69t73.5 -23v-25h-338v25q59 7 73.5 22t14.5 73v431q0 59 -16.5 77.5t-71.5 22.5v25h308q296 0 296 -172q0 -76 -45 -118q-42 -38 -112 -57l199 -282q15 -22 44 -22v-25zM276 597v-252q103 1 143 31t40 118q0 79 -30 113.5 t-100 34.5q-29 0 -41 -10t-12 -35z" />
+<glyph unicode="&#x1d412;" horiz-adv-x="556" d="M484 474h-28q-26 85 -70 130q-54 56 -123 56q-51 0 -80.5 -27.5t-29.5 -71.5q0 -36 21 -59t82 -55q18 -10 68.5 -35.5t79.5 -41.5q49 -27 79 -73.5t30 -102.5q0 -95 -68.5 -154t-179.5 -59q-61 0 -130 24q-31 10 -41 10q-12 0 -19 -7.5t-11 -26.5h-29v248h29 q23 -96 60 -143q57 -72 144 -72q58 0 92 30.5t34 82.5q0 48 -57 88q-25 18 -122 65q-89 43 -130 90t-41 120q0 95 58.5 148t160.5 53q55 0 117 -23q27 -9 42 -9q14 0 20.5 6.5t11.5 26.5h30v-218z" />
+<glyph unicode="&#x1d413;" horiz-adv-x="667" d="M636 475h-29q-13 89 -56.5 127.5t-135.5 41.5v-527q0 -57 16.5 -72t81.5 -20v-25h-357v25q64 5 80.5 20.5t16.5 71.5v527q-93 -3 -136.5 -41.5t-56.5 -127.5h-29l3 201h600z" />
+<glyph unicode="&#x1d414;" horiz-adv-x="722" d="M701 676v-25q-48 -7 -63 -24t-15 -61v-314q0 -156 -76 -216q-68 -55 -184 -55t-185 54q-43 34 -61.5 79t-18.5 117v324q0 59 -14 75t-68 21v25h336v-25q-60 -5 -77.5 -23t-17.5 -78v-318q0 -202 146 -202q176 0 176 222v300q0 54 -20.5 74t-76.5 25v25h219z" />
+<glyph unicode="&#x1d415;" horiz-adv-x="722" d="M701 676v-25q-39 -5 -55.5 -20t-34.5 -62l-228 -587h-27l-256 599q-18 42 -32 53.5t-52 16.5v25h336v-25l-33 -2q-53 -3 -53 -36q0 -17 23 -72l138 -334l127 329q20 52 20 71q0 24 -16 32t-70 12v25h213z" />
+<glyph unicode="&#x1d416;" horiz-adv-x="1000" d="M981 676v-25q-50 -5 -69 -64l-200 -602h-27l-171 477l-186 -477h-28l-212 602q-13 37 -25 48t-44 16v25h294v-25q-39 -3 -51.5 -11.5t-12.5 -30.5q0 -13 7 -33l120 -364l118 308l-35 96q-12 32 -72 35v25h312v-25l-13 -1q-33 -2 -46 -10t-13 -26q0 -13 14 -56l108 -336 l112 343q7 20 7 42q0 23 -14.5 32.5t-54.5 11.5v25h182z" />
+<glyph unicode="&#x1d417;" horiz-adv-x="722" d="M699 0h-340v25l28 2q52 3 52 28q0 21 -21 54l-101 162l-38 -51q-56 -76 -75 -106.5t-19 -46.5q0 -19 17.5 -28t63.5 -14v-25h-250v25q37 4 59 16t45 40l175 221l-198 291q-23 34 -38 45t-42 13v25h346v-25l-31 -2q-27 -1 -37.5 -8t-10.5 -23q0 -14 15 -37l97 -150l56 77 q36 49 47 69.5t11 36.5q0 18 -11 25t-40 10l-21 2v25h250v-25q-57 -5 -90.5 -30.5t-97.5 -115.5l-80 -111l182 -283q35 -54 53 -69.5t44 -16.5v-25z" />
+<glyph unicode="&#x1d418;" horiz-adv-x="722" d="M699 676v-25q-49 -7 -68 -39l-191 -311v-178q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136l-180 328q-31 56 -83 59v25h335v-25l-27 -2q-32 -2 -43 -7.5t-11 -21.5q0 -13 24 -59l120 -232l109 178q41 68 41 102q0 22 -16.5 30t-67.5 12v25h220z " />
+<glyph unicode="&#x1d419;" horiz-adv-x="667" d="M634 242l-27 -242h-579v16l382 623l-83 -1q-117 -2 -162 -32.5t-78 -136.5h-28l22 207h523v-16l-379 -625h83q145 0 202 40q27 19 45 45t26.5 47t26.5 75h26z" />
+<glyph unicode="&#x1d41a;" horiz-adv-x="500" d="M473 64l15 -21q-53 -57 -112 -57q-37 0 -55.5 15.5t-26.5 53.5q-76 -69 -159 -69q-50 0 -80 26.5t-30 79.5q0 67 67 112q50 33 201 76v68q0 49 -18.5 71t-62.5 22q-28 0 -46.5 -10t-18.5 -27q0 -11 11 -23q19 -23 19 -42q0 -26 -19 -43t-49 -17q-31 0 -48 18t-17 50 q0 59 52.5 92.5t138.5 33.5q92 0 144 -35t52 -99v-261q0 -28 21 -28q7 0 11 4zM293 97v148q-122 -34 -122 -121q0 -32 14.5 -49.5t37.5 -17.5q42 0 70 40z" />
+<glyph unicode="&#x1d41b;" horiz-adv-x="556" d="M211 676v-259q53 56 122 56q83 0 135.5 -65t52.5 -169q0 -113 -63 -183t-163 -70q-70 0 -132 57l-79 -56h-12v607q0 30 -10 40.5t-45 17.5v24h194zM211 360v-263q0 -36 19 -57.5t50 -21.5q94 0 94 203q0 198 -93 198q-25 0 -41 -13.5t-29 -45.5z" />
+<glyph unicode="&#x1d41c;" horiz-adv-x="444" d="M412 109l18 -18q-41 -56 -86 -80.5t-105 -24.5q-95 0 -154.5 65t-59.5 171q0 110 68 180.5t169 70.5q66 0 110 -31t44 -79q0 -29 -18.5 -46.5t-49.5 -17.5q-26 0 -41 19t-15 54q0 18 -0.5 26t-2.5 18.5t-6 15t-12.5 7.5t-20.5 3q-38 0 -61 -44.5t-23 -124.5 q0 -102 37 -161t102 -59q58 0 107 56z" />
+<glyph unicode="&#x1d41d;" horiz-adv-x="556" d="M534 20l-62 -8q-82 -11 -133 -25v65q-35 -37 -64 -51.5t-69 -14.5q-79 0 -130 66t-51 169q0 109 54.5 180.5t137.5 71.5q34 0 60.5 -13.5t58.5 -48.5v183q0 35 -13 44.5t-63 13.5v24h215v-575q0 -32 12.5 -44t46.5 -14v-23zM336 112v243q-11 29 -32 45.5t-46 16.5 q-85 0 -85 -188q0 -187 78 -187q36 0 66 37q19 25 19 33z" />
+<glyph unicode="&#x1d41e;" horiz-adv-x="444" d="M403 126l24 -14q-44 -70 -88.5 -98t-109.5 -28q-90 0 -147 67.5t-57 170.5q0 112 57.5 180.5t151.5 68.5q83 0 128 -50q53 -58 59 -178h-252q3 -42 8 -70.5t17 -57.5t35.5 -44t58.5 -15q32 0 58 15.5t57 52.5zM298 282v21q0 73 -9 92q-12 25 -23.5 36t-31.5 11 q-36 0 -53 -36.5t-17 -123.5h134z" />
+<glyph unicode="&#x1d41f;" horiz-adv-x="333" d="M14 461h57q0 131 40 179q42 51 135 51q64 0 103.5 -28t39.5 -72q0 -28 -17 -46t-45 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-27 0 -38.5 -17.5t-11.5 -61.5v-120h86v-44h-86v-310q0 -50 15 -66t67 -17v-24h-278v24q34 4 45.5 16.5t11.5 46.5v330 h-57v44z" />
+<glyph unicode="&#x1d420;" horiz-adv-x="500" d="M254 68h52q81 0 129 -32.5t48 -87.5q0 -71 -68.5 -112.5t-192.5 -41.5q-194 0 -194 92q0 61 96 75q-47 17 -64.5 35t-17.5 47q0 44 29 71.5t90 45.5q-55 15 -89.5 56t-34.5 96q0 73 56.5 117t146.5 44q52 0 112 -22h129v-53h-80q40 -36 40 -98q0 -94 -92 -132 q-24 -10 -41 -12t-86 -2q-30 0 -49.5 -13.5t-19.5 -35.5q0 -21 21 -29t80 -8zM306 312q0 70 -15.5 100t-51.5 30t-50.5 -29t-14.5 -102q0 -70 15 -99.5t51 -29.5t51 29.5t15 100.5zM315 -52h-164q-21 -17 -28 -28t-7 -27q0 -67 134 -67q72 0 113 18.5t41 47.5q0 56 -89 56z " />
+<glyph unicode="&#x1d421;" horiz-adv-x="556" d="M534 0h-234v24q25 3 35.5 16.5t10.5 44.5v224q0 54 -11 75.5t-40 21.5q-36 0 -70 -34q-17 -17 -17 -24v-263q0 -31 10 -44t38 -17v-24h-240v24q36 7 44.5 16t8.5 49v502q0 35 -9 44.5t-45 16.5v24h193v-280q65 77 147 77q60 0 95 -38t35 -98v-250q0 -34 11.5 -48.5 t37.5 -14.5v-24z" />
+<glyph unicode="&#x1d422;" horiz-adv-x="278" d="M256 0h-240v24q35 8 44 19t9 45v285q0 33 -10.5 45t-43.5 19v24h193v-376q0 -32 10.5 -44.5t37.5 -16.5v-24zM215 613q0 -33 -22.5 -55t-55.5 -22t-55 22t-22 55t22.5 55.5t56.5 22.5q31 0 53.5 -23t22.5 -55z" />
+<glyph unicode="&#x1d423;" horiz-adv-x="333" d="M260 461v-459q0 -84 -27 -129q-43 -76 -150 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -16 -14 -37q-9 -15 -9 -22q0 -17 32 -17q25 0 36.5 18t11.5 58v474q0 32 -12.5 44t-50.5 15v24h202zM263 613q0 -33 -22.5 -55t-56.5 -22 q-33 0 -54.5 22t-21.5 55t22.5 55.5t55.5 22.5q31 0 54 -23t23 -55z" />
+<glyph unicode="&#x1d424;" horiz-adv-x="556" d="M543 0h-234v24q42 2 42 19q0 12 -24 45l-95 134l-23 -24v-114q0 -35 8.5 -45t43.5 -15v-24h-239v24q48 4 48 60v510q0 54 -48 58v24h187v-431l128 128q21 21 21 38q0 18 -35 23l-24 4v23h214v-23q-47 -6 -80.5 -29t-108.5 -102l194 -268q11 -15 25 -15v-24z" />
+<glyph unicode="&#x1d425;" horiz-adv-x="278" d="M256 0h-240v24q51 4 51 63v500q0 61 -52 65v24h191v-589q0 -33 12 -47.5t38 -15.5v-24z" />
+<glyph unicode="&#x1d426;" horiz-adv-x="833" d="M814 0h-237v24q28 2 38 14.5t10 44.5v228q0 95 -53 95q-29 0 -58 -25q-9 -7 -18 -18t-9 -15v-265q0 -29 10 -42.5t36 -16.5v-24h-232v24q27 2 37 15t10 44v240q0 45 -12.5 64t-41.5 19q-19 0 -51.5 -22.5t-32.5 -39.5v-261q0 -29 9.5 -42t35.5 -17v-24h-239v24 q33 6 44 18.5t11 43.5v287q0 35 -11 47t-45 17v24h192v-75h3q29 46 62.5 66.5t81.5 20.5q47 0 76 -20t52 -67q39 48 71.5 67.5t75.5 19.5q62 0 98.5 -38t36.5 -104v-248q0 -32 10.5 -45t39.5 -14v-24z" />
+<glyph unicode="&#x1d427;" horiz-adv-x="556" d="M539 0h-234v24q25 3 35.5 16.5t10.5 43.5v237q0 85 -51 85q-36 0 -70 -34q-17 -17 -17 -24v-264q0 -29 10.5 -42.5t37.5 -17.5v-24h-240v24q33 7 43 19t10 44v289q0 32 -10 44t-43 17v24h191v-75h1q49 87 142 87q62 0 98.5 -38.5t36.5 -103.5v-247q0 -34 10 -46t39 -14 v-24z" />
+<glyph unicode="&#x1d428;" horiz-adv-x="500" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#x1d429;" horiz-adv-x="556" d="M212 461v-69q25 44 55.5 62.5t75.5 18.5q85 0 133 -57.5t48 -166.5q0 -118 -51.5 -190t-140.5 -72q-34 0 -58 12.5t-60 47.5v-126q0 -52 16.5 -76t60.5 -26v-24h-272v24q35 6 45.5 18.5t10.5 44.5v490q0 33 -11 46.5t-44 18.5v24h192zM214 346v-239q12 -29 32.5 -47 t44.5 -18q85 0 85 192q0 182 -76 182q-37 0 -68 -37q-18 -21 -18 -33z" />
+<glyph unicode="&#x1d42a;" horiz-adv-x="556" d="M536 -205h-267v24q48 7 60.5 23.5t12.5 67.5v132q-44 -56 -123 -56t-132 63.5t-53 169.5q0 108 61.5 181t160.5 73q38 0 66 -12t66 -44l77 55h16v-595q0 -30 10 -40.5t45 -17.5v-24zM342 98v256q0 41 -18.5 64t-48.5 23q-44 0 -69.5 -51t-25.5 -154q0 -98 25 -147t68 -49 q28 0 48.5 15.5t20.5 42.5z" />
+<glyph unicode="&#x1d42b;" horiz-adv-x="444" d="M218 461v-82q35 51 66 72.5t69 21.5q35 0 58 -22.5t23 -56.5q0 -30 -17.5 -49t-45.5 -19q-37 0 -60 38q-14 23 -28 23q-26 0 -43.5 -30t-17.5 -74v-177q0 -48 13.5 -63.5t58.5 -18.5v-24h-265v24q33 6 43.5 17.5t10.5 42.5v289q0 35 -11 47t-44 17v24h190z" />
+<glyph unicode="&#x1d42c;" horiz-adv-x="389" d="M340 326h-25q-19 56 -47 82q-34 32 -75 32q-28 0 -47 -16.5t-19 -41.5q0 -26 22.5 -46.5t73.5 -41.5q75 -31 106.5 -67t31.5 -89q0 -67 -43 -109.5t-111 -42.5q-52 0 -108 23q-15 6 -23 6q-11 0 -26 -28h-25v165h28q32 -132 137 -132q34 0 54.5 18t20.5 47q0 24 -22 44.5 t-74 42.5q-75 32 -108.5 68.5t-33.5 86.5q0 63 44.5 104.5t112.5 41.5q34 0 78 -15q22 -7 31 -7q17 0 25 20h22v-145z" />
+<glyph unicode="&#x1d42d;" horiz-adv-x="333" d="M307 112l25 -11q-31 -62 -64.5 -87.5t-83.5 -25.5q-52 0 -82 28.5t-30 78.5v322h-53v27q49 33 82 71.5t85 114.5h25v-169h95v-44h-95v-298q0 -60 39 -60q29 0 57 53z" />
+<glyph unicode="&#x1d42e;" horiz-adv-x="556" d="M538 20l-63 -7q-83 -9 -132 -26v65q-39 -37 -71.5 -51.5t-73.5 -14.5q-63 0 -98 38t-35 107v241q0 35 -9 47t-40 18v24h188v-334q0 -76 56 -76q39 0 82 47v276q0 34 -12 47t-49 16v24h200v-356q0 -33 12 -47t45 -15v-23z" />
+<glyph unicode="&#x1d42f;" horiz-adv-x="500" d="M485 461v-24q-24 -2 -34 -11.5t-24 -43.5l-160 -396h-26l-120 296q-47 116 -66 141q-8 10 -34 14v24h250v-24l-18 -2q-35 -4 -35 -24q0 -9 9 -31l79 -203l72 182q11 26 11 45q0 18 -11.5 24.5t-43.5 8.5v24h151z" />
+<glyph unicode="&#x1d430;" horiz-adv-x="722" d="M707 461v-24q-19 -4 -29.5 -14.5t-20.5 -35.5l-155 -401h-23l-102 310l-125 -310h-24l-148 374q-19 47 -28.5 60t-28.5 17v24h222v-24q-38 -5 -38 -28q0 -12 39 -115l45 -118l68 171q-4 12 -6 19q-14 49 -22 58.5t-37 12.5v24h234v-24q-28 -2 -38 -7t-10 -17 q0 -14 27 -106q23 -79 34 -127l35 94q44 118 44 128q0 17 -10 24.5t-38 10.5v24h135z" />
+<glyph unicode="&#x1d431;" horiz-adv-x="500" d="M484 0h-241v24q45 3 45 20q0 16 -33 64q-23 32 -42 63q-2 -3 -7.5 -9.5t-8.5 -10.5q-64 -77 -64 -103q0 -21 50 -24v-24h-169v24q28 2 49.5 19.5t63.5 73.5l43 56q5 6 7.5 9.5t3.5 4.5t3.5 4.5t7.5 9.5l-128 197q-15 23 -24 29.5t-28 9.5v24h250v-24q-47 -1 -47 -19 q0 -22 58 -98q10 -12 13 -17l36 46q38 49 38 64q0 11 -7 15.5t-24 6.5l-20 2v24h168v-24q-44 -7 -70 -39l-101 -126l148 -228q8 -13 30 -20v-24z" />
+<glyph unicode="&#x1d432;" horiz-adv-x="500" d="M482 461v-24q-24 -3 -36 -13.5t-24 -41.5l-148 -398q-45 -121 -77 -156q-31 -33 -84 -33q-43 0 -70 22t-27 57q0 29 17 48t45 19q25 0 42.5 -15t17.5 -37q0 -4 -2 -14l-1 -6q0 -7 5 -12t12 -5q38 0 66 82l18 53l-119 290q-49 121 -67 146q-8 10 -34 14v24h249v-24l-16 -1 q-36 -3 -36 -25q0 -7 20 -58l72 -186l68 188q11 32 11 49q0 18 -11 25t-43 8v24h152z" />
+<glyph unicode="&#x1d433;" horiz-adv-x="444" d="M420 160l-16 -160h-383v25l234 404q-106 0 -139 -19t-52 -91h-26l7 142h371v-26l-231 -403h29q61 0 91.5 12.5t55.5 46.5q20 30 31 69h28z" />
+<glyph unicode="&#x1d56c;" horiz-adv-x="856" d="M805 80l-156 -94h-27q-62 37 -78 115l-262 -126q-35 46 -94 86.5t-99 46.5v25q51 21 89.5 46t72.5 62.5t52 90t18 117.5q0 125 -25 178q-19 39 -53 39q-51 0 -51 -51q0 -41 37 -101t37 -109q0 -63 -51.5 -108.5t-138.5 -58.5l-8 24q22 8 39 29.5t17 51.5q0 52 -37 106.5 t-37 99.5q0 67 57.5 108.5t142.5 41.5q55 0 109 -18.5t89 -57.5q45 -51 45 -133q0 -39 -15.5 -76t-35 -63t-55 -55.5t-58.5 -45.5t-61 -40q34 -18 77 -57t66 -69l129 61v266q0 166 -7 196l264 94l8 -25q-36 -11 -58 -27t-31.5 -43t-11.5 -50t-2 -67v-367q0 -43 23 -43 q27 0 67 24z" />
+<glyph unicode="&#x1d56d;" horiz-adv-x="849" d="M664 411v-2q62 -29 96 -79.5t34 -106.5q0 -108 -97.5 -175t-236.5 -67q-49 0 -86.5 9.5t-59.5 22.5t-41 26.5t-42.5 23t-52.5 9.5q-77 0 -107 -42l-21 14q27 69 77.5 116t116.5 47q12 7 18.5 11.5t20 22t21.5 40.5t14.5 65.5t6.5 97.5q0 78 -18 150t-58 72 q-20 0 -34 -15.5t-14 -44.5q0 -43 37 -100.5t37 -99.5q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q56 25 56 93q0 34 -11.5 60t-25.5 40.5t-25.5 38.5t-11.5 55q0 71 56.5 110t143.5 39q118 0 182 -73l100 75q109 0 168.5 -44.5t59.5 -111.5q0 -94 -105 -134zM604 533 q0 41 -22.5 69.5t-53.5 28.5q-29 0 -63 -36q9 -25 17 -66t8 -61q0 -37 -8 -87q61 10 91.5 55t30.5 97zM298 196v-1q40 -14 75.5 -44.5t55.5 -58.5t44 -50t46 -22q37 0 59 21q44 41 44 128q0 70 -34.5 122.5t-99.5 52.5q-6 0 -18 -2q-24 -48 -62 -79t-110 -67z" />
+<glyph unicode="&#x1d56e;" horiz-adv-x="773" d="M710 701l21 -14q-68 -139 -155 -139q-33 0 -66.5 9.5t-51.5 23.5q-12 -20 -12 -52q0 -26 16 -47t38 -36l44 -30q23 -16 39 -38t16 -50q0 -55 -51 -96.5t-118 -41.5q-40 0 -77 22l12 23q14 -10 33 -10q23 0 34.5 17.5t11.5 40.5t-9.5 40.5t-23.5 30.5l-28 26 q-14 13 -23.5 35.5t-9.5 53.5q0 44 55.5 109.5t121.5 120.5q46 -37 83 -37q61 0 100 39zM678 222l22 -12q-16 -43 -40 -81.5t-58.5 -73t-82 -54.5t-102.5 -20q-165 0 -264 109t-99 275q0 68 34 146t94 127q28 23 69.5 38.5t82.5 15.5q53 0 83 -22l-12 -23q-22 8 -38 8 q-43 0 -75 -41t-46.5 -96.5t-14.5 -113.5q0 -120 58 -199t166 -79q139 0 223 96z" />
+<glyph unicode="&#x1d56f;" horiz-adv-x="891" d="M251 318v-26q-33 -10 -61 -10q-59 0 -97.5 42.5t-38.5 104.5q0 106 90.5 189t232.5 83q81 0 162.5 -30t147.5 -82.5t107.5 -131t41.5 -166.5q0 -132 -83 -214q-98 -96 -271 -96q-49 0 -86 9.5t-59 22.5t-41 26.5t-42.5 23t-52.5 9.5q-76 0 -108 -45l-22 13 q28 72 79.5 119.5t120.5 47.5q19 0 38 -4.5t31.5 -9.5t30.5 -16.5t26 -17.5l27 -21l23 -19q98 -77 160 -77q57 0 95.5 45.5t38.5 127.5q0 109 -90 203t-209 109q-18 -15 -18 -31q0 -20 20.5 -38.5t45 -32.5t45 -38t20.5 -54q0 -46 -45.5 -77.5t-114.5 -31.5q-47 0 -87 22 l12 23q15 -10 34 -10q21 0 33.5 13.5t12.5 32.5q0 18 -28.5 59t-28.5 71q0 51 56 101q-105 0 -157 -30q-70 -41 -70 -112q0 -25 17.5 -51t49.5 -26q8 0 12 1z" />
+<glyph unicode="&#x1d570;" horiz-adv-x="788" d="M710 701l21 -14q-68 -139 -155 -139q-78 0 -118 31q-12 -20 -12 -50q0 -24 16 -46.5t30.5 -34t42.5 -29.5q37 49 59 68.5t50 19.5q46 0 71 -43v-122h-26q-14 34 -35.5 52t-42.5 18q-28 0 -50 -14q38 -33 38 -70q0 -55 -51 -96.5t-118 -41.5q-40 0 -77 22l12 23 q19 -10 33 -10q21 0 33.5 18t12.5 40q0 23 -9.5 40.5t-23.5 30.5l-28 26q-14 13 -23.5 35.5t-9.5 53.5q0 44 55 109t122 120q45 -36 83 -36q61 0 100 39zM678 222l22 -12q-16 -43 -40 -81.5t-58.5 -73t-82 -54.5t-102.5 -20q-165 0 -264 109t-99 275q0 68 34 146t94 127 q28 23 69.5 38.5t82.5 15.5q53 0 83 -22l-12 -23q-22 8 -38 8q-43 0 -75 -41t-46.5 -96.5t-14.5 -113.5q0 -120 58 -199t166 -79q139 0 223 96z" />
+<glyph unicode="&#x1d571;" horiz-adv-x="803" d="M723 676l25 -7q-49 -196 -189 -196h-10q-39 -48 -39 -121q0 -15 6.5 -35t16.5 -28q23 44 56 76t60 32q17 0 29 -5.5t18.5 -12t16.5 -19.5v-128h-26q-27 69 -74 69q-26 0 -55 -41q120 -78 120 -201q0 -103 -80.5 -183.5t-208.5 -80.5q-115 0 -192 50.5t-77 141.5 q0 35 23.5 91t23.5 69q0 38 -39 38q-30 0 -51 -21l-23 11q20 42 61.5 76t93.5 34q61 0 91.5 -30.5t30.5 -72.5q0 -32 -28.5 -90.5t-28.5 -107.5q0 -66 37 -111t81 -45q54 0 88 44.5t34 129.5q0 42 -14 78.5t-26.5 53.5t-38.5 46q-60 66 -60 120q0 20 6 39t24 41l27 32 q8 10 38 37.5t35 32.5q-35 12 -74.5 34.5t-72.5 36t-74 13.5q-31 0 -63 -26t-32 -65q0 -66 76 -85l-5 -26q-7 -1 -22 -1q-76 0 -121.5 39.5t-45.5 102.5q0 86 65 141t171 55q56 0 112 -23.5t102.5 -46.5t80.5 -23q82 0 121 68z" />
+<glyph unicode="&#x1d572;" horiz-adv-x="833" d="M635 443l1 -2q67 -7 106 -51t39 -108q0 -108 -102 -206q-98 -95 -272 -95q-161 0 -257 100t-96 252q0 71 16 133.5t48 114t86 81.5t124 30q29 0 63 -12l-6 -26q-18 2 -22 2q-44 0 -75 -46.5t-44 -114t-13 -147.5q0 -334 189 -334q85 0 139.5 72.5t54.5 174.5 q0 63 -16.5 106t-47.5 43q-26 0 -48 -24q27 -31 44 -69.5t17 -67.5q0 -57 -41.5 -97.5t-114.5 -40.5q-41 0 -80 22l12 23q20 -10 34 -10q35 0 35 58q0 37 -24 79t-47.5 88t-23.5 92q0 113 195 237l17 -19q-43 -45 -62 -79t-19 -75q0 -66 34 -110q88 45 88 83q0 14 -6 39.5 t-6 41.5q0 34 33 63t110 57l17 -19q-22 -22 -22 -54q0 -22 12.5 -50.5t12.5 -43.5q0 -56 -82 -91z" />
+<glyph unicode="&#x1d573;" horiz-adv-x="843" d="M619 701l21 -15q-15 -70 -79 -124.5t-135 -54.5q-79 0 -129 71q-19 -23 -19 -56q0 -52 72 -144q86 51 173 118q128 -30 200 -100t72 -170q0 -33 -10 -67t-23 -61t-40 -60t-46 -53.5t-56 -52.5l-56 -48l-60.5 -46.5t-54.5 -42.5h-26q-55 46 -97 46q-79 0 -129 -46l-21 17 q92 160 202 160q44 0 78 -24.5t44 -54.5q123 91 123 291q0 87 -39.5 149t-105.5 62q-35 0 -104 -48q46 -40 60.5 -65.5t14.5 -51.5q0 -16 -11 -34.5t-24 -33t-48 -50.5l-127 -137q-87 52 -125 70q-36 -35 -50 -53l-22 14l124 196q2 -2 18 -12l32 -22l35 -24 q18 -12 31.5 -19.5t17.5 -7.5q12 0 12 45q0 25 -29 58.5t-63.5 63.5t-63 71.5t-28.5 79.5q0 27 17 56t50 59.5t61 52.5l70 53l58 43q37 -36 59 -48.5t46 -12.5q71 0 130 63z" />
+<glyph unicode="&#x1d574;" horiz-adv-x="790" d="M710 694l25 -8l-11 -44q-5 -16 -19.5 -45.5t-31.5 -47t-47 -31.5t-68 -14q-62 0 -129 31t-117 31q-48 0 -78.5 -25.5t-30.5 -67.5q0 -35 24 -59t61 -24q27 0 50 10l12 -22q-34 -27 -91 -27q-69 0 -121.5 43t-52.5 110q0 81 61 139t161 58q54 0 97 -11t66 -24t55.5 -24 t66.5 -11q38 0 71 15t47 48zM721 388l-23 -12q-19 35 -51 35q-22 0 -36 -14t-14 -41q0 -32 23 -63l46 -65q23 -34 23 -74q0 -82 -70 -130.5t-176 -48.5q-59 0 -101.5 14t-65 33.5t-39 39t-35.5 33.5t-43 14q-37 0 -85 -42l-20 14q8 24 20 47.5t32 52t50.5 46t65.5 17.5 q31 0 55 -9.5t38 -20.5t27 -34.5t18 -36.5l13 -41q30 -94 78 -94q33 0 53.5 27.5t20.5 64.5q0 53 -43.5 119.5t-43.5 115.5q0 58 49.5 94t111.5 36q43 0 76.5 -20t45.5 -57z" />
+<glyph unicode="&#x1d575;" horiz-adv-x="803" d="M725 680l23 -12l-14 -34q-5 -11 -18 -34.5t-26.5 -36.5t-33.5 -28.5t-46.5 -22.5t-58.5 -7q-63 0 -130 30.5t-110 30.5q-42 0 -73.5 -24.5t-31.5 -64.5q0 -36 23 -60.5t64 -24.5q22 0 41 8l12 -23q-29 -24 -87 -24q-72 0 -121.5 42.5t-49.5 110.5q0 81 61 138t161 57 q81 0 172.5 -30.5t125.5 -30.5q75 0 117 40zM715 391l-23 -12q-21 37 -55 37q-22 0 -40 -19.5t-18 -50.5q0 -34 17 -67.5t37 -59.5t37 -73t17 -104q0 -98 -84.5 -172.5t-199.5 -74.5q-113 0 -172 31q-88 45 -88 136q0 13 7.5 43t7.5 42q0 10 -9 20.5t-23 10.5q-28 0 -47 -31 l-25 8q15 50 57 88t96 38q55 0 85 -32.5t30 -72.5q0 -20 -10.5 -59t-10.5 -53q0 -58 23.5 -97t80.5 -39q50 0 84 48t34 115q0 45 -16 88t-35 72.5t-35 72.5t-16 87q0 66 51 112.5t118 46.5q100 0 125 -79z" />
+<glyph unicode="&#x1d576;" horiz-adv-x="864" d="M794 121l20 -20q-20 -28 -66.5 -64.5t-91.5 -50.5h-24q-54 28 -77 71.5t-30 122.5q-5 58 -19.5 90t-33.5 34l-44 -14q21 -30 21 -60q0 -16 -11 -34.5t-24 -33t-48 -50.5l-127 -137q-87 52 -125 70q-22 -19 -50 -53l-22 14l124 196q2 -2 18 -12l32 -22l35 -24 q18 -12 31.5 -19.5t17.5 -7.5q12 0 12 45q0 22 -19 45.5t-46 47.5t-54 51.5t-46 66.5t-19 83q0 63 51.5 121t127.5 91t151 33q221 0 313 -155l-21 -14q-62 73 -123 95t-145 22q-81 0 -142.5 -48t-61.5 -125q23 57 75 85.5t107 28.5q98 0 143 -39q19 -16 34 -42.5t22.5 -46.5 t24.5 -36t43 -18l3 -20l-134 -46q38 -26 58.5 -56.5t26.5 -80.5q15 -131 44 -131q27 0 69 47zM615 389v2q-39 2 -65 13.5t-37 28t-19.5 35t-13.5 34t-18.5 26t-34.5 10.5q-41 0 -79.5 -33t-38.5 -80q18 -26 53 -63t40 -43z" />
+<glyph unicode="&#x1d577;" horiz-adv-x="699" d="M621 171l24 -8q-15 -75 -59.5 -131.5t-117.5 -56.5q-86 0 -160 48q-30 19 -68.5 34.5t-59.5 15.5q-80 0 -104 -77l-25 6q5 28 15 55t28 59t50.5 56.5t74.5 35.5q19 23 19 67q0 29 -14.5 53.5t-35.5 43.5l-42 40q-21 20 -35.5 49.5t-14.5 65.5q0 52 43.5 93t105.5 61 t125 20q60 0 116 -14.5t98.5 -51t42.5 -88.5q0 -45 -27.5 -96.5t-27.5 -91.5q0 -41 20.5 -68t49.5 -37l-4 -25q-88 0 -148 43t-60 97q0 51 27.5 106.5t27.5 95.5q0 44 -31.5 70.5t-74.5 26.5q-45 0 -81.5 -28t-36.5 -78q0 -9 3 -19t6 -17t12 -18l12 -16q4 -5 16 -19t15 -17 q55 -65 55 -113q0 -34 -33.5 -72.5t-75.5 -67.5q50 -4 95 -29l84 -49q37 -23 71 -23q67 0 100 69z" />
+<glyph unicode="&#x1d578;" horiz-adv-x="1133" d="M1061 120l20 -17q-20 -29 -60.5 -65.5t-76.5 -51.5h-24q-55 20 -84 72t-29 125q0 83 41 149.5t124 146.5v2q-43 0 -71 17.5t-41 42.5t-23 50t-24.5 42.5t-37.5 17.5q-36 0 -64 -38q24 -48 33 -90.5t9 -108.5q0 -84 -74 -218q-69 -125 -151 -221l-56 33q-36 22 -51 30 q-29 -29 -51 -55l-22 14l113 198q8 -5 33 -23l46 -33q21 -14 27 -14q15 0 22.5 97t7.5 217q0 72 -26 142t-67 70q-35 0 -64 -40q24 -48 33 -90.5t9 -108.5q0 -24 -5.5 -48.5t-17.5 -51.5l-19 -43q-7 -15 -23.5 -43.5t-18.5 -31.5q-66 -120 -151 -219q-25 14 -68 36l-49 25 q-33 -33 -50 -53l-22 14l112 196q118 -72 126 -72q21 0 21 316q0 82 -18.5 155.5t-58.5 73.5q-48 0 -48 -54q0 -44 37 -102.5t37 -97.5q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q21 8 38.5 31.5t17.5 53.5q0 35 -18 64l-38 58q-18 31 -18 70q0 85 89 130q47 23 111 23 q104 0 159 -57q78 59 138 59q54 0 86 -12.5t53 -42.5q63 55 148 55q50 0 90 -23q26 -15 41 -43t20.5 -51.5t24 -42t52.5 -19.5v-20q-55 -29 -76.5 -92.5t-21.5 -183.5q0 -151 28 -151q14 0 29 9t20.5 14.5t19.5 21.5z" />
+<glyph unicode="&#x1d579;" horiz-adv-x="862" d="M790 118l20 -17q-20 -28 -60.5 -64t-76.5 -51h-24q-52 13 -82.5 67.5t-30.5 127.5q0 83 41 149.5t124 146.5v2q-43 0 -71 17.5t-41 42.5t-23 50t-24.5 42.5t-37.5 17.5q-34 0 -64 -41q24 -48 33 -89.5t9 -106.5q0 -24 -5.5 -48.5t-17.5 -51.5l-19 -43q-7 -15 -23.5 -43.5 t-18.5 -31.5q-66 -120 -151 -219q-25 14 -68 36l-49 25q-33 -33 -50 -53l-22 14l112 196q118 -72 126 -72q21 0 21 316q0 36 -3.5 72t-11 73t-23 60.5t-36.5 23.5q-20 0 -35.5 -14.5t-15.5 -39.5q0 -44 37 -102.5t37 -97.5q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24 q22 8 39 29.5t17 51.5q0 36 -18 66l-38 60q-18 30 -18 70q0 56 42 98q55 55 158 55q104 0 159 -57q68 59 154 59q50 0 90 -23q26 -15 41 -43t20.5 -52.5t24 -43t52.5 -19.5v-20q-55 -29 -76.5 -92.5t-21.5 -183.5q0 -151 28 -151q14 0 29 9t20.5 14.5t19.5 21.5z" />
+<glyph unicode="&#x1d57a;" horiz-adv-x="909" d="M54 274l18 19q25 -26 53 -26q21 0 35 15.5t14 42.5q0 15 -7 28.5t-13 20.5t-20 20q-17 15 -26.5 26.5t-18.5 33.5t-9 49q0 29 22 63t60.5 64.5t100.5 50.5t132 20q81 0 162.5 -30t147.5 -82.5t107.5 -131t41.5 -166.5q0 -132 -83 -214q-98 -96 -271 -96q-59 0 -103 13 t-64 29t-49.5 29t-64.5 13q-65 0 -105 -56l-22 14q30 75 79.5 126t117.5 51q37 0 71.5 -13.5t53.5 -27t51 -40.5q92 -77 160 -77q57 0 95.5 45.5t38.5 127.5q0 50 -19 110t-51.5 114.5t-83.5 90.5t-108 36q-15 0 -50 -10t-57 -10q-60 0 -93 16.5t-67 60.5q-18 0 -36.5 -18.5 t-18.5 -45.5q0 -26 24.5 -49t53.5 -39t53.5 -45.5t24.5 -65.5q0 -57 -52 -93t-119 -36q-63 0 -106 43z" />
+<glyph unicode="&#x1d57b;" horiz-adv-x="850" d="M791 519v-20q-67 -35 -67 -79q0 -25 35.5 -88t35.5 -108q0 -116 -83 -179.5t-221 -63.5h-13v-186h-162v234q-4 2 -13 8l-13 9q-4 2 -13 6l-14 8q-5 2 -13.5 5t-15.5 4.5t-16 2.5t-19 1q-77 0 -107 -42l-21 14q27 69 77.5 116t116.5 47q27 0 51 -6v235q0 45 -5.5 92.5 t-23.5 92t-46 44.5q-49 0 -49 -54q0 -43 37 -101t37 -99q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q22 8 39 29.5t17 51.5q0 47 -37 98.5t-37 97.5q0 73 56.5 113t143.5 40q105 0 159 -55q69 57 143 57q50 0 83 -13.5t46 -33.5t23.5 -43.5t16.5 -43.5t23.5 -34t46.5 -14z M701 484v2q-42 0 -70.5 17t-41.5 41t-23 48.5t-24.5 41.5t-37.5 17q-36 0 -64 -38q38 -66 38 -161v-370q36 -62 82 -62q41 0 60 32.5t19 78.5q0 33 -30 103t-30 107q0 98 122 143z" />
+<glyph unicode="&#x1d57c;" horiz-adv-x="930" d="M882 45l20 -16q-45 -88 -131 -88q-40 0 -63.5 17t-43.5 51q-74 -28 -164 -28q-59 0 -103 13t-64 29t-49.5 29t-64.5 13q-65 0 -105 -56l-22 13q30 75 79.5 126.5t117.5 51.5q16 0 30.5 -2t29 -7.5t23 -9t23.5 -14.5t19.5 -14t21 -17.5t19.5 -16.5q92 -77 160 -77 q15 0 32 3q-6 14 -13 35l-13 36q-5 13 -12 26.5t-15 20t-18 6.5q-20 0 -37 -23l-20 16q53 81 114 81q51 0 78 -30.5t47 -83.5q21 39 21 86q0 50 -22 110.5t-58.5 114t-90.5 90t-111 36.5q-15 0 -50 -10t-57 -10q-60 0 -93 16.5t-67 60.5q-18 0 -36.5 -18.5t-18.5 -45.5 q0 -26 24.5 -49t53.5 -39t53.5 -45.5t24.5 -65.5q0 -63 -50.5 -96t-120.5 -33q-63 0 -106 43l18 19q25 -26 53 -26q23 0 36 15.5t13 41.5q0 15 -7 29t-13 21t-20 20q-17 15 -26.5 26.5t-18.5 33.5t-9 49q0 29 22 63t60.5 64.5t100.5 50.5t132 20q81 0 162.5 -30t147.5 -82.5 t107.5 -131t41.5 -166.5q0 -128 -80 -211q12 -33 24.5 -49t32.5 -16q25 0 51 30z" />
+<glyph unicode="&#x1d57d;" horiz-adv-x="884" d="M821 117l20 -17q-20 -29 -65.5 -64.5t-90.5 -49.5h-24q-60 27 -79 66t-26 123q-13 153 -44 153l-52 -13q-50 -113 -88 -172.5t-125 -167.5q-25 14 -68 36l-49 25q-1 -1 -9 -8l-19 -18q-11 -10 -23 -25l-21 12l112 196q118 -72 126 -72q21 0 21 316q0 82 -18.5 155.5 t-58.5 73.5q-20 0 -34 -13.5t-14 -40.5q0 -42 37 -99t37 -101q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q22 8 39 29.5t17 51.5q0 34 -11.5 60.5t-25.5 41t-25.5 39t-11.5 55.5q0 61 51 107q52 46 149 46q118 0 181 -73l102 75q110 0 172.5 -44.5t62.5 -111.5 q0 -52 -31.5 -104t-101.5 -77v-2q64 -42 77 -162q15 -126 42 -126q29 0 67 43zM596 510q0 51 -20 86t-56 35q-30 0 -67 -39q29 -60 29 -136q0 -71 -8 -100q59 8 90.5 51.5t31.5 102.5z" />
+<glyph unicode="&#x1d57e;" horiz-adv-x="852" d="M458 482l-14 -22q-26 17 -54 17q-33 0 -56 -15.5t-23 -51.5q0 -29 17.5 -48.5t51.5 -19.5q25 0 53 19t51 41.5t64.5 41.5t89.5 19q70 0 117 -43t47 -128q0 -121 -101.5 -216t-250.5 -95q-192 0 -294 110t-102 281q0 79 41 153.5t119 124t172 49.5q64 0 139 -22t102 -22 q80 0 118 46l22 -14q-23 -77 -62.5 -122t-107.5 -45q-57 0 -145 33t-133 33q-99 0 -165.5 -58t-66.5 -154q0 -58 22.5 -100.5t56 -66.5t84 -38t96.5 -18.5t102 -4.5q45 0 92.5 7t100 24t85.5 52.5t33 84.5q0 39 -18.5 56.5t-61.5 17.5q-27 0 -51.5 -19t-47 -46.5t-48.5 -55 t-66.5 -46.5t-89.5 -19q-86 0 -135.5 48.5t-49.5 117.5q0 61 47.5 108.5t119.5 47.5q57 0 100 -42z" />
+<glyph unicode="&#x1d57f;" horiz-adv-x="793" d="M707 680l26 -7q-50 -202 -190 -202q-20 0 -50.5 9.5t-49.5 20.5q-10 -16 -10 -31q0 -20 18 -36t39.5 -25t39.5 -29t18 -47q0 -52 -40 -78.5t-112 -26.5q-44 0 -84 22l12 23q15 -10 34 -10q20 0 29.5 12.5t9.5 28.5q0 18 -22 56t-22 61q0 39 53 98q-68 46 -132 46 q-32 0 -64 -27.5t-32 -74.5t26.5 -75.5t69.5 -30.5l-3 -26q-97 0 -157 45t-60 118q0 89 66 148t171 59q57 0 112 -22.5t100.5 -45t79.5 -22.5q19 0 30 1.5t30 7t35 21t29 39.5zM715 171l25 -8q-14 -78 -64.5 -133t-132.5 -55q-65 0 -159.5 45.5t-148.5 45.5q-87 0 -130 -70 l-23 13q15 83 75 137.5t137 54.5q54 0 103 -15.5t78 -34t61.5 -34t59.5 -15.5q10 0 23.5 2.5t32 9t36 21.5t27.5 36z" />
+<glyph unicode="&#x1d580;" horiz-adv-x="860" d="M809 80l-156 -94h-27q-62 37 -78 115l-282 -126q-34 40 -102 84.5t-110 58.5v15l36 17q11 6 34 23.5t33.5 36t20 51.5t9.5 75v216q0 55 -35 55q-27 0 -78 -29l-13 22l167 101h25q96 -33 96 -145v-125q0 -70 -31 -116.5t-107 -103.5q94 -29 185 -131l148 65v266 q0 166 -7 196l264 94l8 -25q-36 -12 -58 -28t-31.5 -42.5t-11.5 -49.5t-2 -67v-367q0 -43 23 -43q27 0 67 24z" />
+<glyph unicode="&#x1d581;" horiz-adv-x="855" d="M800 524v-20q-37 -20 -52 -38.5t-15 -41.5q0 -24 30.5 -87t30.5 -113q0 -114 -96 -178.5t-238 -64.5q-60 0 -104 14.5t-64 31.5t-49.5 31.5t-64.5 14.5q-24 0 -38 -1.5t-35 -11.5t-34 -29l-21 14q27 69 77.5 116t116.5 47q12 7 18.5 11.5t20 22t21.5 40.5t14.5 65.5 t6.5 97.5q0 33 -3.5 68t-11.5 71t-23.5 59t-37.5 23q-20 0 -34 -15t-14 -44q0 -41 37 -98t37 -102q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q21 8 38.5 30.5t17.5 52.5q0 32 -11.5 58t-25.5 40.5t-25.5 39.5t-11.5 56q0 73 57 115.5t143 42.5q105 0 159 -55q69 57 143 57 q50 0 83 -12.5t46 -31t23 -41t16 -42t24 -34t47 -16.5zM711 484v2q-42 0 -70 17t-41.5 41t-23.5 48.5t-25 41.5t-38 17q-36 0 -64 -38q41 -69 41 -144q0 -166 -192 -271v-2q40 -14 75 -44.5t55 -59t44 -50.5t46 -22q50 0 85 33t35 78q0 46 -25 108.5t-25 104.5q0 94 123 140 z" />
+<glyph unicode="&#x1d582;" horiz-adv-x="1121" d="M1065 524l1 -20q-67 -36 -67 -80q0 -24 30.5 -87.5t30.5 -113.5q0 -66 -28.5 -111.5t-82.5 -83.5q-64 -47 -145 -47q-113 0 -168 34q-51 -34 -175 -34q-60 0 -104 14.5t-64.5 31.5t-50 31.5t-64.5 14.5q-65 0 -107 -42l-21 14q27 69 77.5 116t116.5 47q12 7 18.5 11.5 t20 22t21.5 40.5t14.5 65.5t6.5 97.5q0 33 -3.5 68t-11.5 71t-23.5 59t-37.5 23q-18 0 -33 -14.5t-15 -39.5q0 -43 37 -99t37 -101q0 -65 -47.5 -108.5t-142.5 -58.5l-8 24q22 8 39 29.5t17 51.5q0 34 -11.5 60.5t-25.5 41t-25.5 39t-11.5 55.5q0 71 57 112t143 41 q105 0 159 -55q67 57 151 57q38 0 80 -13t62 -29q49 42 115 42q51 0 84.5 -12.5t46.5 -31t23 -41t15.5 -42t23 -33.5t46.5 -17zM977 484v2q-42 0 -70.5 17t-41.5 41t-23 48.5t-25 41.5t-38 17q-42 0 -70.5 -50t-28.5 -100q0 -23 7 -44t15 -33l21 -31q25 -33 43.5 -76.5 t18.5 -80.5q0 -43 -11 -69t-36 -57q19 -43 47.5 -66.5t54.5 -23.5q27 0 45.5 29t18.5 75q0 41 -25 102t-25 116q0 95 123 142zM298 198v-2q40 -14 78.5 -44t62.5 -57.5t51 -49t49 -21.5q38 0 64 54t26 114q0 57 -30 96q-50 66 -50 131q0 74 87 180q-14 25 -42.5 38.5 t-59.5 13.5q-55 0 -85 -38q41 -69 41 -144q0 -166 -192 -271z" />
+<glyph unicode="&#x1d583;" horiz-adv-x="819" d="M775 680l-121 -198q-20 16 -71 48.5t-61 32.5q-6 0 -11.5 -17t-9.5 -53t-4 -81q74 0 101.5 4t46.5 24l23 -13q-24 -64 -62.5 -99t-108.5 -39v-43q0 -64 37.5 -104.5t84.5 -40.5q59 0 106 40l16 -21l-187 -134h-25q-101 37 -159 121q-34 -43 -123 -132l-63 35 q-47 27 -62 34q-2 -2 -9 -8.5t-17 -17.5l-24 -27l-22 14l124 196l41 -27l62 -41q27 -17 32 -17q11 0 18.5 49t7.5 122h-19q-39 0 -57 -1t-39 -9t-31 -24l-23 13q27 68 64 103t105 41v27q0 50 -22.5 94.5t-54.5 44.5q-27 0 -63 -13t-63 -35l-16 20l180 144h25 q75 -23 141 -121q31 48 124 130q105 -56 117 -60q13 10 50 53z" />
+<glyph unicode="&#x1d584;" horiz-adv-x="837" d="M434 641h2q21 23 57.5 41.5t79.5 18.5q53 0 94 -25.5t65.5 -69.5t37 -98t12.5 -116q0 -94 -23.5 -177.5t-72 -158.5t-97 -131t-123.5 -130h-25q-39 27 -57.5 36.5t-39.5 9.5q-80 0 -130 -46l-21 14q76 163 203 163q39 0 67.5 -24t38.5 -55q36 54 69.5 191t33.5 328 q0 106 -18.5 171.5t-56.5 65.5q-45 0 -70 -44q26 -66 26 -138q0 -25 -2.5 -46t-9.5 -40l-14 -33q-5 -13 -20 -29l-24 -25q-8 -9 -30 -26l-34 -24l-40 -26l-43 -28v-1q29 -7 70.5 -32t63.5 -46l83 35l12 -23l-209 -137q-36 42 -94.5 73t-105.5 36v25q113 51 172.5 125 t59.5 204q0 124 -25 178q-19 39 -54 39q-21 0 -35.5 -13t-14.5 -42q0 -44 37 -103.5t37 -95.5q0 -63 -51.5 -108.5t-138.5 -58.5l-8 24q22 8 39 29.5t17 51.5q0 34 -11.5 60t-25.5 40.5t-25.5 39t-11.5 55.5q0 73 57 113.5t143 40.5q118 0 184 -58z" />
+<glyph unicode="&#x1d585;" horiz-adv-x="755" d="M516 280v-2q89 -19 138 -77t49 -146q0 -104 -79 -177t-208 -73q-54 0 -93.5 14t-59.5 33.5t-36 39t-34.5 33.5t-43.5 14q-36 0 -84 -42l-21 14q4 17 17 41.5t34 53.5t54.5 48.5t70.5 19.5q109 0 130 -119q8 -49 31 -83t58 -34q92 0 92 203q0 88 -42.5 144t-98.5 56 q-50 0 -83 -14t-70 -60l-21 14q23 37 48 60.5t66 37.5v2q-67 26 -97 87l22 15q51 -65 138 -65q52 0 86.5 42.5t34.5 119.5t-36 119t-96 42q-125 0 -212 -139l-24 10q31 80 102.5 134.5t179.5 54.5q118 0 186 -60q65 -59 65 -157q0 -67 -42.5 -121.5t-120.5 -82.5z" />
+<glyph unicode="&#x1d586;" horiz-adv-x="600" d="M545 71l-126 -91h-24q-45 24 -64 61l-140 -65h-24q-50 30 -81 83t-31 111q0 53 22.5 100.5t65.5 77.5l81 55q55 36 104 72h24q45 -39 77.5 -60t77.5 -35v-25q-18 0 -30.5 -13t-12.5 -32v-188q0 -45 30 -45q15 0 37 16zM325 79v236l-75 60q-56 -62 -56 -175 q0 -50 25.5 -97.5t51.5 -47.5q7 0 14.5 2.5t12 5t14.5 8.5t13 8z" />
+<glyph unicode="&#x1d587;" horiz-adv-x="559" d="M504 335v-116q0 -25 -8 -46t-27.5 -39.5t-32.5 -28t-41 -28.5q-82 -55 -120 -101h-24q-103 59 -206 76v25q34 4 42.5 15t8.5 56v366q0 51 -12.5 95.5t-31.5 67.5l20 18q50 -40 79 -74q24 32 67 52.5t97 20.5q22 0 62 -6v-25q-71 0 -106.5 -34.5t-35.5 -97.5v-113l147 57 h24q98 -17 98 -140zM365 170v134q0 40 -12 60.5t-41 39.5l-77 -26v-235l106 -54q14 15 19 31t5 50z" />
+<glyph unicode="&#x1d588;" horiz-adv-x="464" d="M412 47l-196 -71h-24q-62 34 -99.5 95.5t-37.5 125.5q0 92 37 143t133 97l80 38h24l77 -90l-104 -86l-82 90q-11 -8 -15 -20q-11 -28 -11 -122q0 -76 37.5 -135t100.5 -59q24 0 72 19z" />
+<glyph unicode="&#x1d589;" horiz-adv-x="557" d="M502 336v-149q0 -25 -25.5 -49.5t-71 -55t-65.5 -48.5q-40 -37 -59 -59h-24q-98 60 -157 60h-52v24q46 0 46 51v270v-4q63 17 126 58v2l-42 16q-13 5 -38.5 18.5t-38.5 25.5t-23.5 31.5t-10.5 42.5q0 61 62.5 92.5t148.5 31.5v-25q-72 -11 -72 -51q0 -24 23.5 -41 t65.5 -33.5t56 -25.5q80 -48 115.5 -87t35.5 -95zM363 159v155q0 19 -5 34t-16 26t-19.5 17.5t-23 15t-18.5 11.5l-16 -8q-16 -8 -25 -14q-7 -2 -7 -45v-203l113 -53q17 27 17 64z" />
+<glyph unicode="&#x1d58a;" horiz-adv-x="476" d="M427 62l-190 -86h-23q-43 9 -75.5 34.5t-49.5 58t-25.5 64.5t-8.5 60q0 185 161 250q57 22 116 32h24l70 -215l-232 -90q0 -42 39 -77t73 -35q65 0 109 28zM194 201l57 23q31 16 31 36q0 9 -22 74.5t-28 77.5q-17 -9 -26 -39.5t-10.5 -56.5t-1.5 -69v-46z" />
+<glyph unicode="&#x1d58b;" horiz-adv-x="370" d="M327 700l25 -9q-2 -25 -12.5 -55.5t-35.5 -58.5t-58 -28q-23 0 -43 10.5t-35 10.5q-13 0 -24 -10.5t-11 -32.5q0 -79 136 -79h61v-65h-96l-25 -597h-101l-24 597h-51v25q50 0 50 57q0 15 -4.5 49.5t-4.5 51.5q0 45 24 87t77 42q23 0 54.5 -16t45.5 -16q32 0 52 37z" />
+<glyph unicode="&#x1d58c;" horiz-adv-x="566" d="M506 380v-25q-18 0 -30.5 -13t-12.5 -33v-184q0 -45 20 -98t20 -85q1 -74 -62 -117.5t-140 -43.5q-48 0 -76.5 7.5t-40 18.5t-19.5 23t-26 23t-50 15v24q56 30 110 30q32 0 52.5 -16t26.5 -35.5t13 -35.5t17 -16q27 0 41.5 17.5t14.5 63.5q0 38 -18 80.5t-22 57.5 l-134 -62h-25q-49 30 -79.5 83.5t-30.5 110.5q0 53 22.5 101t64.5 77q24 17 58 39l61 41l66 47h24q84 -73 155 -95zM324 79v236l-75 60q-55 -61 -55 -175q0 -50 25 -97.5t51 -47.5q9 0 17 3t20.5 11t16.5 10z" />
+<glyph unicode="&#x1d58d;" horiz-adv-x="576" d="M516 335v-284q0 -79 -63 -155.5t-125 -114.5l-18 19q29 36 48 87t19 90v327q0 40 -12 60.5t-41 39.5l-77 -26v-242l53 -30l34 37l22 -14q-72 -103 -95 -153h-24q-83 58 -192 76v25q37 4 50 16t13 55v366q0 51 -12.5 95.5t-31.5 67.5l20 18q50 -40 79 -74q24 32 67 52.5 t97 20.5q22 0 62 -6v-25q-71 0 -106.5 -34.5t-35.5 -97.5v-113l147 57h24q98 -17 98 -140z" />
+<glyph unicode="&#x1d58e;" horiz-adv-x="429" d="M269 649q0 -16 -25 -54.5t-45 -38.5q-21 0 -46 38t-25 55q0 20 20 34t51 14t50.5 -14t19.5 -34zM379 101l-141 -125h-24q-49 25 -66 55t-17 91v191q0 55 -33 55q-15 0 -48 -22l-15 22l147 107h24q91 -58 120 -61v-25q-56 -7 -56 -43v-178q0 -85 24 -85q16 0 66 40z" />
+<glyph unicode="&#x1d58f;" horiz-adv-x="389" d="M280 649q0 -16 -25 -54.5t-45 -38.5q-21 0 -46 38t-25 55q0 20 20 34t51 14t50.5 -14t19.5 -34zM337 414v-25q-56 -7 -56 -43v-394q0 -44 12.5 -87t31.5 -67l-20 -17q-46 31 -79 74q-22 -27 -58.5 -50.5t-68.5 -23.5q-31 0 -59 6v27q39 0 70.5 35t31.5 113v351 q0 49 -28 49q-18 0 -57 -26l-15 21l151 118h24q91 -58 120 -61z" />
+<glyph unicode="&#x1d590;" horiz-adv-x="456" d="M402 688v-25q-72 0 -112 -35t-40 -97v-89h33v62q0 56 30.5 81.5t79.5 25.5v-109h-26q-3 27 -20 27q-27 0 -27 -67v-20h73v-65h-143v-240l72 -36l49 56l22 -15q-106 -140 -119 -166h-24q-80 56 -202 76v25q37 4 50 16t13 55v229h-63v25q63 0 63 50v62q0 51 -12.5 95.5 t-31.5 67.5l20 18q50 -40 79 -74q24 32 67 52.5t97 20.5q32 0 72 -6z" />
+<glyph unicode="&#x1d591;" horiz-adv-x="433" d="M357 158l22 -15q-78 -101 -108 -167h-24q-80 56 -202 76v25q37 4 50 16t13 55v366q0 51 -12.5 95.5t-31.5 67.5l20 18q50 -40 79 -74q24 32 67 52.5t97 20.5q22 0 46 -6v-25q-57 0 -91.5 -35.5t-34.5 -96.5v-394l62 -31z" />
+<glyph unicode="&#x1d592;" horiz-adv-x="984" d="M932 90l-128 -114h-24q-49 24 -66 53.5t-17 88.5v215l-56 53l-84 -43v-184q0 -42 8 -55.5t39 -16.5v-25q-92 -8 -104 -86h-24q-11 77 -111 86v25q30 3 41.5 16t11.5 44v176q0 42 -53 65l-87 -44v-185q0 -42 8 -55.5t39 -16.5v-25q-92 -8 -104 -86h-24q-11 77 -111 86v25 q32 4 42.5 18.5t10.5 53.5v154q0 33 -11.5 51t-30.5 18q-24 0 -45 -15l-12 21l127 87h24q33 -16 56 -41t25 -52l173 93h24q33 -16 56.5 -41t25.5 -52l183 93h24q22 -26 52.5 -46.5t59.5 -21.5v-25q-34 -5 -34 -57v-174q0 -68 28 -68q10 0 18.5 5t30.5 24z" />
+<glyph unicode="&#x1d593;" horiz-adv-x="696" d="M644 90l-129 -114h-24q-49 24 -66 53.5t-17 88.5v215l-54 52l-76 -41v-185q0 -42 8 -55.5t39 -16.5v-25q-92 -8 -104 -86h-24q-11 77 -111 86v25q32 4 42.5 18.5t10.5 53.5v154q0 33 -11.5 51t-30.5 18q-24 0 -45 -15l-12 21l127 87h24q33 -16 56 -41t25 -52l173 93h24 q22 -26 52.5 -46.5t59.5 -21.5v-25q-34 -5 -34 -57v-174q0 -68 27 -68q10 0 18.5 5t32.5 24z" />
+<glyph unicode="&#x1d594;" horiz-adv-x="554" d="M499 295v-101q0 -26 -24.5 -51t-71 -58t-64.5 -50q-34 -32 -58 -59h-24q-110 64 -162 64h-50v25q46 0 46 50v254q19 5 46 17l86 39l112 50h24q77 -46 108.5 -84.5t31.5 -95.5zM360 150v134q0 12 -5 24t-13.5 22.5t-17.5 20t-20.5 18t-19.5 13.5l-16 10q-8 6 -9 6l-22 -10 q-7 -2 -7 -51v-186l111 -65q19 32 19 64z" />
+<glyph unicode="&#x1d595;" horiz-adv-x="640" d="M585 335v-120q0 -50 -23.5 -83.5t-68.5 -62.5q-5 -3 -23 -15l-24 -16l-21 -15q-14 -10 -21 -16t-16 -14.5t-16 -16.5h-24q-13 15 -32 19v-214h-139v246q-66 -2 -118 -51l-23 13q53 120 141 162v205q0 24 -15.5 42t-31.5 40t-16 55q0 26 22 54t52 46l21 -15 q-15 -24 -15 -35q0 -18 19 -31t41.5 -20.5t42 -26t19.5 -47.5l137 57h24q53 -19 80.5 -60t27.5 -80zM446 157v137q0 63 -74 104l-56 -21v-220q63 -20 116 -81q10 11 12 26t2 55z" />
+<glyph unicode="&#x1d596;" horiz-adv-x="574" d="M522 366h-20q-38 0 -38 -45v-540h-139v258l-134 -63h-24q-50 30 -81 83t-31 111q0 53 22.5 100.5t65.5 77.5l81 55q55 36 104 72h24q91 -78 170 -85v-24zM325 79v246l-75 50q-56 -62 -56 -175q0 -50 25.5 -97.5t51.5 -47.5q8 0 54 24z" />
+<glyph unicode="&#x1d597;" horiz-adv-x="525" d="M493 370l-110 -84l-85 106l-25 -13v-242l71 -36l70 70l19 -18q-42 -44 -84.5 -98t-55.5 -79h-24q-79 56 -173 56h-25v24q35 3 49 14.5t14 48.5v194q0 69 -43 69q-15 0 -39 -15l-12 21l122 87h24q41 -19 68 -63l134 63h24z" />
+<glyph unicode="&#x1d598;" horiz-adv-x="557" d="M180 536l-24 11q21 47 63 71.5t90 24.5q65 0 112.5 -40.5t47.5 -106.5q0 -57 -43.5 -99.5t-108.5 -42.5q-70 0 -110 63q-15 -30 -15 -79q0 -36 19 -58t46 -22q17 0 29 3.5t16 7.5l18 15q51 51 81 51q39 0 68 -31q36 -36 36 -107q0 -32 -31 -71t-90 -90.5t-66 -59.5h-25 q-42 39 -111 39q-54 0 -110 -46l-20 16q83 133 182 133q71 0 116 -61q16 42 16 81q0 84 -42 84q-4 0 -8.5 -1t-8.5 -2.5t-9 -4.5l-9 -6q-3 -2 -9 -7.5t-9 -7.5t-10 -8.5t-9 -8.5q-35 -31 -73 -31q-56 0 -91 38t-35 96q0 34 24 64.5t71 71.5l84 75h25q13 -23 47 -23 q16 0 32.5 16.5t16.5 44.5q0 36 -19.5 55t-52.5 19q-27 0 -56 -18t-45 -48z" />
+<glyph unicode="&#x1d599;" horiz-adv-x="438" d="M356 167l22 -14q-54 -72 -107 -176h-24q-80 56 -202 76v25q37 4 50 16t13 55v247h-63v25q101 9 101 235h101v-195h113v-65h-113v-258l61 -31z" />
+<glyph unicode="&#x1d59a;" horiz-adv-x="681" d="M629 90l-129 -114h-24q-39 19 -57 40.5t-23 56.5l-170 -97h-24q-22 27 -58.5 52.5t-65.5 26.5v25q26 4 36 15t10 42v172q0 42 -9 57.5t-28 15.5t-40 -15l-12 21l117 87h24q87 -42 87 -136v-219l51 -50l79 43v185q0 40 -7.5 51t-39.5 15v25q92 8 104 86h24q11 -77 111 -86 v-25q-33 -5 -43 -16.5t-10 -49.5v-155q0 -60 27 -60q10 0 18.5 5t32.5 24z" />
+<glyph unicode="&#x1d59b;" horiz-adv-x="573" d="M526 295v-101q0 -26 -24.5 -51t-71 -58t-64.5 -50q-34 -32 -58 -59h-24q-110 64 -162 64h-50v25q46 0 46 52v243q0 18 -10 33t-21.5 25t-21.5 29.5t-10 45.5t22 54t52 46l21 -15q-15 -24 -15 -35q0 -18 17.5 -30.5t38.5 -19.5t41 -23.5t24 -40.5q24 11 106 46h24 q77 -46 108.5 -84.5t31.5 -95.5zM387 150v134q0 12 -5 24t-13.5 22.5t-17.5 20t-20.5 18l-18.5 13.5l-16 10q-9 6 -10 6l-22 -10q-7 -2 -7 -51v-186l111 -65q19 27 19 64z" />
+<glyph unicode="&#x1d59c;" horiz-adv-x="850" d="M795 295v-107q0 -25 -23 -49t-67 -55.5t-63 -48.5q-34 -32 -58 -59h-24l-28 16l-29 16l-25 14q-17 8 -28 11.5t-24.5 6.5t-26.5 3h-48v25q20 0 28 11t8 39v220l-56 51l-74 -28v-218q0 -31 9 -42.5t38 -13.5v-25q-92 -8 -104 -86h-24q-11 77 -111 86v25q30 3 41.5 16 t11.5 44v209q0 19 -10 35t-21.5 26t-21.5 30t-10 46t22 54t52 46l21 -15q-15 -24 -15 -35q0 -18 19 -30t42 -19.5t42 -30.5t19 -61l157 73h24q63 -25 89 -72l149 72h24q52 -39 73.5 -79.5t21.5 -100.5zM656 160v124q0 68 -61 105l-62 -24q-7 -3 -7 -52v-162l113 -64 q17 29 17 73z" />
+<glyph unicode="&#x1d59d;" horiz-adv-x="521" d="M489 385l-114 -77l-67 84l-25 -13v-114h74v-65h-74v-64l70 -41l43 44l18 -18l-117 -145h-25l-128 78q-17 -32 -17 -48q0 -37 20.5 -52.5t78.5 -34.5l-36 -128h-25q-99 43 -99 157q0 83 78 152v100h-70v65h70v48q0 69 -43 69q-15 0 -39 -15l-12 21l122 87h24 q41 -19 68 -63l133 63h24z" />
+<glyph unicode="&#x1d59e;" horiz-adv-x="596" d="M536 283v-147q0 -72 -20.5 -135t-53.5 -106.5t-61 -70t-56 -43.5l-18 19q70 88 70 255v196q0 74 -14.5 104.5t-46.5 52.5l-79 -31v-240l54 -31l38 48l22 -15q-53 -67 -100 -163h-24q-83 58 -192 76v25q37 4 50 16t13 55v208q0 19 -10 35t-21.5 26t-21.5 30t-10 46t22 54 t52 46l21 -15q-15 -24 -15 -35q0 -18 17.5 -29.5t39 -18.5t41 -26.5t23.5 -50.5l135 57h24q121 -45 121 -192z" />
+<glyph unicode="&#x1d59f;" horiz-adv-x="484" d="M205 221l211 -119q21 -30 21 -91q0 -60 -60 -109q-56 -44 -207 -121h-24q-38 23 -68 69.5t-42 86.5v25q143 88 210 191l-95 54v21q94 49 94 114q0 50 -38 50q-53 0 -94 -27l-11 26l66 33q63 31 94 51h25q97 -16 97 -102q0 -21 -12.5 -41.5t-29.5 -35t-44.5 -30 t-46.5 -24.5t-46 -20v-1zM277 132h-3q-38 -73 -109 -144q14 -52 31.5 -84t48.5 -48q26 24 39.5 58.5t13.5 107.5q0 16 -7 57t-14 53z" />
+<glyph unicode="&#x1d5d4;" horiz-adv-x="690" d="M665 0h-130l-66 162h-248l-66 -162h-130l306 690h28zM428 264l-83 204l-83 -204h166z" />
+<glyph unicode="&#x1d5d5;" horiz-adv-x="636" d="M463 373l1 -4q75 -36 102.5 -79.5t27.5 -101.5q0 -81 -73 -134.5t-181 -53.5h-260v676h237q118 0 180 -43t62 -125q0 -41 -25 -77.5t-71 -57.5zM208 413h72q141 0 141 89q0 37 -23 54.5t-77 17.5h-113v-161zM208 102h103q80 0 110.5 29t30.5 80q0 52 -49.5 76t-119.5 24 h-75v-209z" />
+<glyph unicode="&#x1d5d6;" horiz-adv-x="723" d="M619 193l69 -68q-115 -144 -285 -144q-164 0 -259 100.5t-95 258.5q0 152 97.5 251.5t255.5 99.5q80 0 140.5 -20t106.5 -74v-149h-11q-72 141 -218 141q-101 0 -167 -66.5t-66 -180.5q0 -105 56.5 -182t161.5 -77q63 0 111.5 25.5t102.5 84.5z" />
+<glyph unicode="&#x1d5d7;" horiz-adv-x="709" d="M80 676h179q221 0 318 -89t97 -252q0 -48 -12 -94t-40 -90t-69 -77.5t-104 -53.5t-140 -20h-229v676zM210 102h67q259 0 259 234q0 122 -66 180t-182 58h-78v-472z" />
+<glyph unicode="&#x1d5d8;" horiz-adv-x="635" d="M597 102l-27 -102h-490v676h480v-102h-350v-167h241v-103h-241v-202h387z" />
+<glyph unicode="&#x1d5d9;" horiz-adv-x="582" d="M570 574h-360v-169h213v-102h-213v-303h-130v676h477z" />
+<glyph unicode="&#x1d5da;" horiz-adv-x="746" d="M671 357v-279q-32 -24 -48.5 -35t-52 -29t-78.5 -25.5t-98 -7.5q-168 0 -262.5 100t-94.5 259q0 151 98 251t256 100q79 0 138.5 -20.5t107.5 -73.5v-149h-11q-73 141 -223 141q-97 0 -162.5 -66.5t-65.5 -180.5q0 -66 22.5 -123t75 -96.5t125.5 -39.5q76 0 155 43v129 h-107l-31 102h256z" />
+<glyph unicode="&#x1d5db;" horiz-adv-x="715" d="M635 0h-130v297h-295v-297h-130v676h130v-277h295v277h130v-676z" />
+<glyph unicode="&#x1d5dc;" horiz-adv-x="440" d="M375 102l-9 -102h-287l-14 102h90v472h-90l14 102h287l9 -102h-90v-472h90z" />
+<glyph unicode="&#x1d5dd;" horiz-adv-x="481" d="M406 676v-545q0 -150 -102 -203q-45 -24 -110 -24q-95 0 -179 98l49 98h18q33 -49 59 -71.5t63 -22.5q44 0 58 30.5t14 81.5v558h130z" />
+<glyph unicode="&#x1d5de;" horiz-adv-x="712" d="M707 0h-170l-296 306l-33 -29v-277h-128v676h128v-263l295 263h145v-14l-318 -278z" />
+<glyph unicode="&#x1d5df;" horiz-adv-x="603" d="M587 102l-19 -102h-488v676h130v-574h377z" />
+<glyph unicode="&#x1d5e0;" horiz-adv-x="913" d="M833 0h-128v467l-235 -467h-27l-235 467v-467h-128v676h161l214 -440h3l214 440h161v-676z" />
+<glyph unicode="&#x1d5e1;" horiz-adv-x="724" d="M644 -18l-105 20l-331 500v-502h-128v676h157l279 -424v424h128v-694z" />
+<glyph unicode="&#x1d5e2;" horiz-adv-x="778" d="M743 337q0 -157 -99 -256t-254 -99q-154 0 -254.5 99t-100.5 256t100 256t254 99t254 -99t100 -256zM605 337q0 115 -57 184t-159 69t-159 -69t-57 -184q0 -116 57 -184.5t160 -68.5q102 0 158.5 68.5t56.5 184.5z" />
+<glyph unicode="&#x1d5e3;" horiz-adv-x="581" d="M80 676h209q139 0 209.5 -50.5t70.5 -144.5q0 -91 -69.5 -147t-186.5 -56h-103v-278h-130v676zM210 380h71q83 0 119.5 25t36.5 77q0 92 -162 92h-65v-194z" />
+<glyph unicode="&#x1d5e4;" horiz-adv-x="779" d="M754 -160v-16q-50 0 -75.5 0.5t-70 3.5t-70.5 9t-63 17.5t-62 28.5t-52.5 43.5t-49.5 60.5q-125 27 -200.5 119t-75.5 228q0 158 100 257.5t254 99.5q155 0 254.5 -99t99.5 -258q0 -135 -75 -226.5t-199 -119.5q24 -27 59.5 -41.5t62 -17t70.5 -3.5zM605 336 q0 115 -57 184t-159 69t-159 -69t-57 -184q0 -116 57 -184.5t160 -68.5q102 0 158.5 68.5t56.5 184.5z" />
+<glyph unicode="&#x1d5e5;" horiz-adv-x="670" d="M657 0h-159l-247 291h-41v-291h-130v676h216q136 0 205 -48.5t69 -139.5q0 -69 -44.5 -119t-122.5 -69zM210 393h71q85 0 121 23t36 73q0 45 -37.5 65t-125.5 20h-65v-181z" />
+<glyph unicode="&#x1d5e6;" horiz-adv-x="554" d="M483 466h-14q-23 57 -77 90t-109 33q-43 0 -74 -20.5t-31 -61.5q0 -38 33 -62t91 -46q120 -46 164.5 -92t44.5 -124q0 -39 -19.5 -82t-47.5 -68q-59 -52 -178 -52q-132 0 -215 81l-16 162h14q33 -69 98.5 -105t120.5 -36q63 0 89.5 28t26.5 63q0 39 -24.5 59.5 t-94.5 47.5q-117 45 -164.5 95.5t-47.5 127.5q0 83 63 135t157 52q69 0 125.5 -20t84.5 -51v-154z" />
+<glyph unicode="&#x1d5e7;" horiz-adv-x="641" d="M627 574h-240v-574h-130v574h-243l14 102h589z" />
+<glyph unicode="&#x1d5e8;" horiz-adv-x="699" d="M624 676v-430q0 -265 -274 -265q-275 0 -275 265v430h128v-419q0 -79 14 -104q37 -70 133 -70q91 0 132 70q14 23 14 116v407h128z" />
+<glyph unicode="&#x1d5e9;" horiz-adv-x="690" d="M665 676l-306 -694h-28l-306 694h130l190 -465l190 465h130z" />
+<glyph unicode="&#x1d5ea;" horiz-adv-x="997" d="M967 676l-255 -691l-28 1l-184 408h-3l-184 -409h-28l-255 691h131l146 -439l195 439l188 -439l146 439h131z" />
+<glyph unicode="&#x1d5eb;" horiz-adv-x="740" d="M700 0h-154l-179 239l-173 -239h-154l249 343l-248 333h154l170 -228l166 228h154l-242 -333z" />
+<glyph unicode="&#x1d5ec;" horiz-adv-x="694" d="M674 676l-262 -394v-282h-130v282l-262 394h145l182 -283l182 283h145z" />
+<glyph unicode="&#x1d5ed;" horiz-adv-x="653" d="M623 102l-15 -102h-583v16l372 558h-334l13 102h525v-16l-374 -558h396z" />
+<glyph unicode="&#x1d5ee;" horiz-adv-x="489" d="M428 0h-125l-6 44q-32 -33 -66.5 -45.5t-84.5 -12.5t-86.5 36t-36.5 100q0 45 13.5 71.5t40.5 50.5q63 55 222 64v16q0 54 -74 54q-44 0 -69.5 -16t-38.5 -54h-12l-76 44q21 61 76 91t132 30q78 0 130 -35.5t52 -98.5v-263q0 -29 9 -76zM299 152v61q-151 0 -151 -82 q0 -27 17.5 -38.5t39.5 -11.5q29 0 54 19.5t40 51.5z" />
+<glyph unicode="&#x1d5ef;" horiz-adv-x="512" d="M177 426v-1q49 48 125 48q49 0 88 -23q46 -27 71.5 -81t25.5 -124q0 -140 -74 -211q-50 -47 -140 -47q-30 0 -62 12.5t-48 30.5h-3l-92 -43h-13v689h120v-250h2zM175 301v-158q41 -61 94 -61q44 0 68.5 41.5t24.5 107.5t-26.5 106.5t-64.5 40.5q-65 0 -96 -77z" />
+<glyph unicode="&#x1d5f0;" horiz-adv-x="462" d="M373 145l69 -67q-46 -55 -86 -73.5t-111 -18.5q-95 0 -157.5 66.5t-62.5 168.5q0 111 67 181.5t164 70.5q64 0 114 -27.5t63 -77.5l-77 -57h-17q-18 67 -85 67q-43 0 -73.5 -41t-30.5 -111q0 -57 31.5 -97.5t83.5 -40.5q70 0 108 57z" />
+<glyph unicode="&#x1d5f1;" horiz-adv-x="518" d="M463 8l-115 -22l-7 3v45h-2q-46 -48 -122 -48q-89 0 -140.5 65t-51.5 176t56.5 178.5t150.5 67.5q55 0 105 -39v242h120v-550q0 -64 6 -118zM337 169v140q-22 38 -41.5 53.5t-50.5 15.5q-45 0 -70 -43.5t-25 -104.5q0 -62 25.5 -105.5t68.5 -43.5q35 0 55.5 22t37.5 66z " />
+<glyph unicode="&#x1d5f2;" horiz-adv-x="452" d="M363 143l70 -66q-47 -54 -84.5 -72t-102.5 -18q-99 0 -160 64t-61 171q0 123 68 194q54 57 147 57q86 0 134 -66.5t48 -173.5v-28h-272q0 -59 31.5 -88t78.5 -29q67 0 103 55zM159 300h143q0 78 -69 78q-26 0 -49.5 -22.5t-24.5 -55.5z" />
+<glyph unicode="&#x1d5f3;" horiz-adv-x="340" d="M374 638l-22 -90l-17 -1q-29 49 -84 49q-59 0 -59 -84v-51h90v-95h-90v-366h-120v366h-58v95h58v42q0 91 48 139.5t121 48.5q49 0 75.5 -11t57.5 -42z" />
+<glyph unicode="&#x1d5f4;" horiz-adv-x="504" d="M219 76h84q187 0 187 -128q0 -45 -28.5 -78t-75.5 -51q-64 -25 -184 -25q-77 0 -125.5 29.5t-48.5 85.5q0 25 16 47.5t45 37.5q-42 19 -42 67q0 29 16.5 52.5t61.5 51.5v2q-42 27 -61.5 57.5t-19.5 76.5q0 74 59 123t150 49q42 0 80 -14q22 -8 82 -8h72v-95h-56 q16 -10 16 -56q0 -77 -60.5 -118.5t-141.5 -41.5h-25q-48 -5 -48 -33q0 -31 47 -31zM332 304q0 33 -21.5 53.5t-65.5 20.5q-41 0 -64 -21.5t-23 -50.5q0 -35 24 -53t63 -18q41 0 64 19t23 50zM314 -19h-105q-30 -3 -43 -16t-13 -28q0 -48 89 -48q59 0 88 12q35 13 35 46 q0 14 -12.5 24t-38.5 10z" />
+<glyph unicode="&#x1d5f5;" horiz-adv-x="510" d="M455 0h-120v309q0 69 -66 69q-23 0 -50.5 -21t-43.5 -64v-293h-120v676h120v-261h2q58 58 129 58q149 0 149 -151v-322z" />
+<glyph unicode="&#x1d5f6;" horiz-adv-x="245" d="M195 543h-145v145h145v-145zM184 0h-125v461h125v-461z" />
+<glyph unicode="&#x1d5f7;" horiz-adv-x="324" d="M269 543h-145v145h145v-145zM258 461v-478q0 -113 -81 -162q-41 -24 -98 -24q-76 0 -136 67l43 85h18q30 -50 60 -50q69 0 69 95v467h125z" />
+<glyph unicode="&#x1d5f8;" horiz-adv-x="519" d="M506 0h-142l-169 205l-20 -16v-189h-120v676h120v-365l176 150h134v-18l-209 -171z" />
+<glyph unicode="&#x1d5f9;" horiz-adv-x="235" d="M180 0h-125v625l108 51h17v-676z" />
+<glyph unicode="&#x1d5fa;" horiz-adv-x="776" d="M721 0h-118v309q0 69 -66 69q-25 0 -49.5 -20.5t-40.5 -64.5v-293h-118v309q0 69 -66 69q-22 0 -48 -21t-42 -64v-293h-118v461h114v-50h2q62 62 129 62q94 0 128 -62h1q62 62 145 62q147 0 147 -151v-322z" />
+<glyph unicode="&#x1d5fb;" horiz-adv-x="510" d="M455 0h-120v309q0 69 -66 69q-23 0 -50.5 -21t-43.5 -64v-293h-120v461h116v-50h2q62 62 133 62q149 0 149 -151v-322z" />
+<glyph unicode="&#x1d5fc;" horiz-adv-x="501" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM351 232q0 69 -26.5 107.5t-77.5 38.5q-48 0 -72.5 -41.5t-24.5 -104.5q0 -66 26 -108.5t74 -42.5q28 0 48.5 14.5t31.5 38t16 48.5t5 50z" />
+<glyph unicode="&#x1d5fd;" horiz-adv-x="512" d="M171 415h2q52 58 133 58q48 0 88 -24q93 -55 93 -201q0 -139 -74 -210q-55 -52 -140 -52q-52 0 -98 41v-195l-103 -37h-17v666h116v-46zM175 290v-140q22 -38 41.5 -53.5t50.5 -15.5q45 0 70 44t25 105q0 148 -89 148q-36 0 -58.5 -23t-39.5 -65z" />
+<glyph unicode="&#x1d5fe;" horiz-adv-x="512" d="M457 -168l-103 -37h-17v231h-2v1q-42 -41 -117 -41q-87 0 -140 65.5t-53 162.5q0 126 75 199q62 60 144 60q64 0 105 -39h3l88 39h17v-641zM337 158v158q-43 62 -92 62q-41 0 -68 -40t-27 -110q0 -69 24.5 -108t68.5 -39q61 0 94 77z" />
+<glyph unicode="&#x1d5ff;" horiz-adv-x="411" d="M406 356h-16q-22 22 -59 22q-48 0 -93.5 -54t-62.5 -135v-189h-120v461h120v-88h2q32 52 73.5 76t79.5 24q49 0 76 -19v-98z" />
+<glyph unicode="&#x1d600;" horiz-adv-x="385" d="M340 306h-15q-44 72 -125 72q-22 0 -35.5 -12t-13.5 -24q0 -21 17.5 -35t52.5 -29q86 -36 111 -65t25 -88q0 -34 -18.5 -64.5t-50.5 -48.5q-44 -25 -110 -25q-50 0 -81.5 14t-71.5 49v120h15q19 -43 60.5 -65.5t80.5 -22.5q22 0 39 12.5t17 31.5q0 16 -13 28t-53 29 q-83 36 -109 68t-26 89t43.5 95t116.5 38q49 0 81.5 -15t62.5 -46v-106z" />
+<glyph unicode="&#x1d601;" horiz-adv-x="386" d="M371 115l-11 -94q-37 -33 -116 -33q-57 0 -97.5 35.5t-40.5 102.5v240h-99v17l63 78h36v61l100 108h20v-169h107v-95h-107v-217q0 -36 17 -51t41 -15q41 0 69 32h18z" />
+<glyph unicode="&#x1d602;" horiz-adv-x="518" d="M463 10l-124 -25v70h-2q-62 -69 -143 -69q-139 0 -139 152v323h120v-310q0 -70 66 -70q22 0 50 24.5t44 67.5v288h120v-351q0 -64 8 -100z" />
+<glyph unicode="&#x1d603;" horiz-adv-x="462" d="M447 461l-203 -475h-26l-203 475h131l84 -252h2l84 252h131z" />
+<glyph unicode="&#x1d604;" horiz-adv-x="701" d="M684 461l-195 -475h-26l-109 252l-116 -252h-26l-195 475h131l81 -256h2l62 173l-35 83h131l86 -244h2l76 244h131z" />
+<glyph unicode="&#x1d605;" horiz-adv-x="506" d="M486 0h-138l-100 143l-90 -143h-138l159 243l-148 218h137l83 -121l79 121h138l-147 -223z" />
+<glyph unicode="&#x1d606;" horiz-adv-x="472" d="M455 461l-180 -496q-33 -91 -74.5 -130.5t-109.5 -39.5q-45 0 -73 22v98h16q27 -25 59 -25q33 0 55.5 24t38.5 79l-169 468h131l93 -275h2l80 275h131z" />
+<glyph unicode="&#x1d607;" horiz-adv-x="441" d="M417 95l-9 -95h-387v25l233 341h-207l8 95h361v-26l-233 -340h234z" />
+<glyph unicode="&#x1d6a8;" horiz-adv-x="735" d="M689 0h-322v25l32 3q25 2 35.5 9.5t10.5 23.5q0 29 -46 136h-225l-13 -34q-31 -80 -31 -97q0 -19 18.5 -28.5t62.5 -12.5v-25h-202v25q35 6 53 28t46 92l221 545h28l222 -522q38 -90 58.5 -116.5t51.5 -26.5v-25zM384 236l-101 243l-94 -243h195z" />
+<glyph unicode="&#x1d6a9;" horiz-adv-x="667" d="M426 365v-1q85 -11 139 -58.5t54 -117.5q0 -83 -72 -135.5t-202 -52.5h-329v25q55 6 71.5 21t16.5 57v467q0 44 -18.5 60.5t-69.5 20.5v25h317q121 0 186.5 -41.5t65.5 -118.5q0 -59 -37 -96.5t-122 -54.5zM264 592v-219q91 0 123.5 30t32.5 106q0 137 -99 137 q-30 0 -43.5 -12.5t-13.5 -41.5zM264 343v-245q0 -36 15 -51t48 -15q58 0 89 40t31 116q0 155 -157 155h-26z" />
+<glyph unicode="&#x1d6aa;" horiz-adv-x="620" d="M593 474h-24q-9 54 -24 85q-10 21 -36 44q-45 39 -173 39q-40 0 -56 -14q-14 -12 -14 -37v-490q0 -47 24 -60q22 -13 86 -16v-25h-360v25q57 6 74 23q14 16 14 55v472q0 45 -21 60q-20 13 -67 16v25h577v-202z" />
+<glyph unicode="&#x1d6ab;" horiz-adv-x="691" d="M340 690l316 -690h-640l296 690h28zM111 120h320l-165 359z" />
+<glyph unicode="&#x1d6ac;" horiz-adv-x="679" d="M641 208l-40 -208h-585v25q54 6 71 21t17 55v479q0 38 -18 53t-70 18v25h577v-201h-25q-17 100 -65.5 133.5t-171.5 33.5q-38 0 -51.5 -12t-13.5 -42v-225q81 1 117 32.5t45 116.5h26v-338h-26q-7 88 -43 121.5t-119 33.5v-242q0 -32 17.5 -44t65.5 -12q117 0 182 54 q25 20 42 46t40 77h28z" />
+<glyph unicode="&#x1d6ad;" horiz-adv-x="693" d="M634 242l-27 -242h-579v16l382 625l-83 -3q-62 -2 -96.5 -8.5t-63.5 -25t-46 -49.5t-34 -86h-28l22 207h523v-16l-379 -625h83q145 0 202 40q27 19 45 45t26.5 47t26.5 75h26z" />
+<glyph unicode="&#x1d6ae;" horiz-adv-x="810" d="M759 0h-339v25q54 6 71.5 20.5t17.5 52.5v228h-241v-228q0 -40 17 -53.5t72 -19.5v-25h-336v25q53 7 69 20.5t16 52.5v479q0 41 -17 55t-68 19v25h336v-25q-53 -4 -71 -18.5t-18 -55.5v-204h241v204q0 41 -18 55.5t-71 18.5v25h339v-25q-51 -4 -69.5 -19t-18.5 -55v-479 q0 -39 16.5 -52.5t71.5 -20.5v-25z" />
+<glyph unicode="&#x1d6af;" horiz-adv-x="778" d="M515 223h-26q-9 56 -43 56h-109q-23 0 -32 -10q-8 -9 -19 -46h-26q15 51 15 118q0 53 -15 115h26q12 -36 23 -47q10 -10 29 -10h109q18 0 27 14q7 11 13 43h26q-12 -54 -12 -110t14 -123zM743 336q0 -166 -113 -267q-98 -87 -242 -87q-165 0 -266 112q-87 98 -87 241 q0 169 115 270q99 87 244 87q162 0 262 -113q87 -99 87 -243zM566 329q0 169 -53 255q-47 75 -128 75q-89 0 -134 -97q-39 -84 -39 -231q0 -316 178 -316q176 0 176 314z" />
+<glyph unicode="&#x1d6b0;" horiz-adv-x="421" d="M370 0h-350v25q57 5 75 20t18 61v470q0 41 -19 56t-74 19v25h350v-25q-56 -2 -75.5 -17.5t-19.5 -57.5v-470q0 -48 18.5 -62.5t76.5 -18.5v-25z" />
+<glyph unicode="&#x1d6b1;" horiz-adv-x="820" d="M769 0h-334v25q47 1 62 6t15 15q0 13 -25 45l-181 225l-27 -25v-196q0 -37 16.5 -50t70.5 -20v-25h-336v25q55 5 71 19t16 57v472q0 46 -17 60.5t-70 17.5v25h337v-25q-54 -4 -71 -20.5t-17 -63.5v-223l212 215q24 24 32 35t8 23q0 15 -10.5 22t-37.5 9l-35 3v25h289v-25 q-78 -9 -133 -46.5t-189 -180.5l305 -378q16 -20 49 -21v-25z" />
+<glyph unicode="&#x1d6b2;" horiz-adv-x="707" d="M674 0h-322v25l32 3q44 5 44 33q0 22 -44 136l-108 280h-2l-114 -314q-28 -78 -28 -97q0 -21 20 -30q20 -8 59 -11v-25h-202v25q36 6 56 32q17 23 43 88l213 545h28l215 -522q40 -97 61 -121q19 -22 49 -22v-25z" />
+<glyph unicode="&#x1d6b3;" horiz-adv-x="972" d="M921 0h-332v25q55 5 72 22t17 62v496l-252 -605h-27l-252 594v-465q0 -58 20 -79t81 -25v-25h-234v25q59 6 75 20.5t16 62.5v469q0 41 -17 55.5t-72 18.5v25h253l199 -472l201 472h252v-25q-55 -4 -71.5 -22.5t-16.5 -74.5v-428q0 -57 15 -76.5t73 -24.5v-25z" />
+<glyph unicode="&#x1d6b4;" horiz-adv-x="722" d="M701 676v-25q-50 -8 -64 -22.5t-14 -60.5v-586h-28l-447 545v-396q0 -58 18 -78.5t76 -27.5v-25h-226v25q55 7 71.5 22.5t16.5 61.5v470q-52 72 -85 72v25h211l349 -430v299q0 60 -18 80.5t-74 25.5v25h214z" />
+<glyph unicode="&#x1d6b5;" horiz-adv-x="623" d="M568 481h-25q-9 46 -25 61q-16 14 -49 14h-307q-67 0 -82 -75h-25v195h513v-195zM494 240h-25q-7 37 -24 49q-13 8 -40 8h-182q-37 0 -50 -12q-11 -10 -19 -45h-25v223h25q7 -40 24 -49q12 -7 46 -7h181q35 0 45 10q11 10 19 46h25v-223zM595 0h-567v232h25q9 -53 24 -68 q17 -17 58 -17h349q51 0 67 23q12 17 19 62h25v-232z" />
+<glyph unicode="&#x1d6b6;" horiz-adv-x="778" d="M743 335q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM566 328q0 160 -46.5 245t-134.5 85q-83 0 -128 -85.5t-45 -242.5t46 -236.5t132 -79.5t131 80t45 234z" />
+<glyph unicode="&#x1d6b7;" horiz-adv-x="780" d="M759 0h-339v25q57 6 74 23q15 15 15 50v531h-241v-531q0 -42 20 -56q15 -11 69 -17v-25h-336v25q57 8 71 22t14 51v479q0 43 -20 57q-17 13 -65 17v25h738v-25q-54 -5 -72 -21q-16 -15 -16 -53v-479q0 -42 19 -55q16 -12 69 -18v-25z" />
+<glyph unicode="&#x1d6b8;" horiz-adv-x="611" d="M16 676h315q128 0 198.5 -45.5t70.5 -135.5q0 -60 -33.5 -104.5t-95.5 -67.5q-32 -12 -70.5 -15.5t-138.5 -4.5v-192q0 -51 14 -65t73 -21v-25h-333v25q33 3 45 9q23 9 31 30t8 62v427q0 58 -15.5 75.5t-68.5 22.5v25zM262 606v-268q94 1 130 32t36 114q0 84 -27 120.5 t-89 36.5q-50 0 -50 -35z" />
+<glyph unicode="&#x1d6b9;" horiz-adv-x="778" d="M743 336q0 -156 -99.5 -255t-255.5 -99q-155 0 -254 99t-99 254q0 159 101 258t258 99q151 0 250 -100.5t99 -255.5zM214 394h349q-9 129 -54.5 197t-123.5 68q-74 0 -118.5 -68.5t-52.5 -196.5zM565 304h-353q4 -144 50 -216.5t128 -72.5q167 0 175 289z" />
+<glyph unicode="&#x1d6ba;" horiz-adv-x="665" d="M627 261l-32 -261h-581v16l278 301l-278 343v16h580v-197h-26q-22 99 -67 130q-30 21 -91 21h-182l187 -240l-225 -243h256q65 0 96 20q40 26 59 94h26z" />
+<glyph unicode="&#x1d6bb;" horiz-adv-x="667" d="M636 475h-29q-13 89 -56.5 127.5t-135.5 41.5v-527q0 -57 16.5 -72t81.5 -20v-25h-357v25q64 5 80.5 20.5t16.5 71.5v527q-93 -3 -136.5 -41.5t-56.5 -127.5h-29l3 201h600z" />
+<glyph unicode="&#x1d6bc;" horiz-adv-x="722" d="M699 670v-25q-18 5 -31 5q-30 0 -56 -8.5t-53.5 -32t-49 -61.5t-40 -101t-29.5 -146v-178q0 -58 16.5 -75.5t75.5 -22.5v-25h-347v25q60 5 76.5 25t16.5 78v136q0 164 -55 263t-147 99q-29 0 -59 -10l-14 24q22 20 57.5 36t66.5 16q59 0 103.5 -13.5t81.5 -46t59 -92 t29 -146.5h5q10 52 29 103q34 95 89 140t122 45q35 0 54 -12z" />
+<glyph unicode="&#x1d6bd;" horiz-adv-x="836" d="M498 586v-22q136 -5 225 -62q95 -61 95 -164q0 -121 -131 -187q-90 -45 -189 -45v-15q0 -31 23 -46q21 -14 72 -20v-25h-353v25q62 5 81 22q15 13 15 44v15q-138 0 -227 60q-91 61 -91 172q0 118 120 179q82 42 198 47v24q0 36 -14 48q-18 15 -71 15v25h332v-25 q-57 0 -75 -23q-10 -13 -10 -42zM496 530v-390q63 0 105 47q45 49 45 138q0 112 -49 164q-38 41 -101 41zM338 140v390q-68 0 -108 -53t-40 -152q0 -105 50 -151q37 -34 98 -34z" />
+<glyph unicode="&#x1d6be;" horiz-adv-x="747" d="M699 0h-340v25l28 2q52 3 52 28q0 21 -21 54l-101 162l-38 -51q-56 -76 -75 -106.5t-19 -46.5q0 -19 17.5 -28t63.5 -14v-25h-250v25q37 4 59 16t45 40l175 221l-198 291q-23 34 -38 45t-42 13v25h346v-25l-31 -2q-27 -1 -37.5 -8t-10.5 -23q0 -14 15 -37l97 -150l56 77 q36 49 47 69.5t11 36.5q0 18 -11 25t-40 10l-21 2v25h250v-25q-57 -5 -90.5 -30.5t-97.5 -115.5l-80 -111l182 -283q35 -54 53 -69.5t44 -16.5v-25z" />
+<glyph unicode="&#x1d6bf;" horiz-adv-x="800" d="M785 692v-25q-25 0 -41 -37q-12 -27 -12 -48v-5l4 -90v-13q0 -111 -91 -168q-66 -42 -169 -42v-141q0 -61 20 -78q19 -16 72 -20v-25h-347v25q63 3 81 31q12 20 12 72v136q-122 0 -190 56q-70 57 -70 156v11l4 90v6q0 31 -14 56q-15 28 -41 28v25h33q87 0 142 -91 q36 -59 36 -142q0 -70 29 -117q26 -44 71 -44v290q0 36 -13 48q-18 15 -72 15v25h332v-25q-56 0 -74 -23q-11 -14 -11 -42v-288q50 0 78 56q22 44 22 105q0 84 35 142q55 91 141 91h33z" />
+<glyph unicode="&#x1d6c0;" horiz-adv-x="778" d="M262 94l-2 29q-97 17 -161 91t-64 172q0 124 99 215t245 91q145 0 244.5 -91.5t99.5 -217.5q0 -94 -65 -164.5t-160 -95.5l-2 -29h138q33 0 44.5 17t11.5 60h25v-171h-302l7 155q64 15 100 81t36 153q0 66 -19 126t-60.5 102t-97.5 42q-55 0 -96.5 -42t-61 -101.5 t-19.5 -124.5q0 -88 36 -154.5t100 -81.5l7 -155h-302v171h25q0 -44 10 -60.5t41 -16.5h143z" />
+<glyph unicode="&#x1d6c1;" horiz-adv-x="691" d="M656 676l-296 -690h-28l-316 690h640zM561 556h-320l165 -359z" />
+<glyph unicode="&#x1d6c2;" horiz-adv-x="644" d="M618 461l-129 -270q0 -8 9 -35q18 -55 32 -70q7 -8 20 -8q38 0 42 76h25q0 -70 -28 -118q-29 -48 -77 -48q-69 0 -105 77q-61 -79 -166 -79q-100 0 -162 76q-54 66 -54 164q0 117 73 187q63 60 157 60q127 0 179 -121h1l29 109h154zM361 198q-3 76 -31 157q-30 87 -72 87 q-53 0 -71 -55q-15 -45 -15 -154q0 -127 21 -175q18 -41 59 -41q40 0 74 70q26 53 35 111z" />
+<glyph unicode="&#x1d6c3;" horiz-adv-x="556" d="M396 411l-1 -2q129 -39 129 -183q0 -110 -73 -180q-63 -60 -153 -60q-51 0 -93 26v-66q0 -100 -20 -151h-140q21 43 21 151v386q0 114 21 185q20 66 69 118q54 57 151 57q76 0 126 -44q48 -42 48 -110q0 -84 -85 -127zM205 495v-423q27 -55 85 -55q53 0 71 51 q15 44 15 149q0 84 -30 138q-20 37 -37 37l-43 -9q-40 0 -40 26q0 27 48 27l45 -9q10 0 18 32q5 20 5 50q0 62 -14 101q-18 51 -51 51q-44 0 -59 -44q-13 -35 -13 -122z" />
+<glyph unicode="&#x1d6c4;" horiz-adv-x="518" d="M501 461l-202 -400q1 -5 3.5 -19t3.5 -24q10 -64 10 -102q0 -52 -23 -87q-23 -34 -61 -34q-46 0 -61 34q-10 21 -10 73q0 75 61 216q-11 110 -34 169q-39 96 -92 96q-48 0 -59 -75h-25q0 68 24 115q26 50 74 50q73 0 114 -152l29 -111l79 251h169z" />
+<glyph unicode="&#x1d6c5;" horiz-adv-x="502" d="M395 567l-146 81q-32 0 -55 -10q-31 -13 -31 -39q0 -32 50 -62q15 -9 62 -34q109 -57 156 -116q46 -60 46 -172q0 -94 -68 -164q-64 -65 -156 -65q-109 0 -176 82q-51 63 -51 139q0 93 60 154q56 58 136 58v2q-82 34 -115 78q-22 31 -22 61q0 63 79 103q57 29 115 29 q69 0 114 -18q50 -20 50 -57q0 -17 -13 -33q-13 -17 -35 -17zM329 215q0 172 -77 172q-46 0 -65 -51q-14 -42 -14 -132q0 -105 19 -147q19 -40 61 -40q52 0 67 61q9 38 9 137z" />
+<glyph unicode="&#x1d6c6;" horiz-adv-x="444" d="M412 109l17 -18q-69 -105 -203 -105q-198 0 -198 132q0 77 88 123v1q-35 13 -54 41q-16 23 -16 47q0 62 57 103q55 40 146 40q71 0 117 -28q47 -29 47 -78q0 -25 -17 -42q-16 -16 -44 -16q-57 0 -57 54l8 42q0 37 -65 37q-38 0 -60 -33q-19 -28 -19 -67t23 -64 q20 -21 51 -21l54 11q39 0 39 -25q0 -30 -44 -30q-14 0 -44 9q-35 0 -61 -26q-25 -25 -25 -61q0 -95 109 -95q49 0 93 21q40 19 58 48z" />
+<glyph unicode="&#x1d6c7;" horiz-adv-x="459" d="M243 692l9 -24q-63 -27 -63 -68q0 -40 32 -51q88 85 144 85q57 0 57 -43q0 -42 -68 -69q-54 -22 -124 -22q-55 -45 -97 -122q-42 -78 -42 -148q0 -69 57 -96q39 -19 124 -19q165 0 165 -138q0 -92 -62 -143q-48 -39 -113 -39q-44 0 -71 21q-21 16 -21 40q0 28 19 46 q18 16 42 16l107 -46q23 0 41 22q17 20 17 46q0 53 -54 53h-8l-117 -9q-109 1 -154 51q-40 46 -40 140q0 104 64 213q45 77 99 124q-36 4 -56 28q-18 21 -18 50q0 74 131 102z" />
+<glyph unicode="&#x1d6c8;" horiz-adv-x="580" d="M545 -205h-138q-14 29 -19 67q-3 24 -3 85v372q0 87 -50 87q-37 0 -71 -34q-17 -17 -17 -24v-348h-139v346q0 56 -24 56t-49 -48l-23 11q18 47 56 78q38 30 80 30q98 0 98 -87h1q51 87 143 87q67 0 103 -44q31 -38 31 -101v-380q0 -106 21 -153z" />
+<glyph unicode="&#x1d6c9;" horiz-adv-x="501" d="M476 340q0 -148 -64 -254q-61 -100 -154 -100q-120 0 -184 127q-49 97 -49 228q0 151 64 252q63 99 161 99q112 0 176 -126q50 -96 50 -226zM172 364h157q0 135 -19 212q-21 85 -60 85q-78 0 -78 -297zM329 320h-157q0 -303 78 -303q79 0 79 303z" />
+<glyph unicode="&#x1d6ca;" horiz-adv-x="326" d="M281 101l23 -12q-18 -45 -58 -75q-38 -28 -85 -28q-49 0 -73 32q-19 25 -19 59v299q0 33 -14 47q-11 11 -40 14v24h193v-349q0 -56 24 -56t49 45z" />
+<glyph unicode="&#x1d6cb;" horiz-adv-x="581" d="M214 461v-201q123 143 196 189q39 24 78 24q33 0 52 -22q19 -20 19 -55q0 -25 -19 -45q-20 -21 -47 -21l-83 42q-43 0 -103 -70l179 -232q24 -32 36 -39t26 -7v-24h-248v24q34 1 34 23q0 10 -21 37l-98 129h-1v-213h-139v379q0 33 -14 44q-11 9 -40 14v24h193z" />
+<glyph unicode="&#x1d6cc;" horiz-adv-x="546" d="M502 147h25q0 -75 -25 -119q-25 -46 -75 -46q-62 0 -92 128l-46 198l-101 -308h-169l226 454l-12 38q-22 68 -48 93q-19 17 -46 17q-47 0 -59 -75h-25q0 73 24 116q25 49 76 49q62 0 104 -146l107 -374q28 -100 77 -100q47 0 59 75z" />
+<glyph unicode="&#x1d6cd;" horiz-adv-x="610" d="M567 88l21 -12q-43 -107 -144 -107q-81 0 -90 86h-1q-45 -69 -100 -69q-39 0 -53 23h-1v-77q0 -86 -20 -137h-134q21 43 21 138v528h139v-318q0 -46 25 -72q20 -20 44 -20q38 0 79 51v359h139v-350q0 -43 5 -58q5 -14 18 -14q22 0 52 49z" />
+<glyph unicode="&#x1d6ce;" horiz-adv-x="518" d="M465 473h30q0 -238 -148 -370q-102 -91 -252 -117h-26v386q0 36 -12 48q-11 11 -42 17v24h193v-323h5q225 40 252 335z" />
+<glyph unicode="&#x1d6cf;" horiz-adv-x="465" d="M240 692l10 -24q-28 -12 -46 -31t-18 -37q0 -26 21 -36q74 71 140 71q63 0 63 -40q0 -39 -61 -61q-48 -18 -109 -18q-26 0 -42 -22q-11 -17 -11 -40q0 -38 35 -53q91 41 133 41q43 0 60 -7q24 -9 24 -36q0 -33 -55 -49q-38 -11 -70 -11q-39 0 -89 11q-61 -20 -90 -58 q-24 -32 -24 -67q0 -58 52 -87q40 -23 106 -23q165 0 165 -138q0 -92 -62 -143q-48 -39 -113 -39q-44 0 -71 21q-21 16 -21 40q0 28 20 46q18 16 41 16l107 -46q23 0 41 22q17 20 17 46q0 53 -54 53h-8l-117 -9q-6 -1 -17 -1q-83 0 -134 61q-40 46 -40 117q0 69 54 134 q45 54 108 83q-22 11 -36 29q-16 20 -16 45q0 45 38 77v2q-30 5 -48 24q-15 17 -15 35q0 36 36 63q34 27 96 39z" />
+<glyph unicode="&#x1d6d0;" horiz-adv-x="500" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM329 218q0 128 -17 176t-61 48q-46 0 -62.5 -47.5t-16.5 -176.5q0 -109 18 -155t61 -46t60.5 44.5t17.5 156.5z" />
+<glyph unicode="&#x1d6d1;" horiz-adv-x="631" d="M584 127h25q0 -59 -42 -101q-39 -40 -100 -40q-74 0 -106 53q-22 35 -22 92q0 47 21 127q3 12 18 62q2 7 5.5 21.5t5.5 19.5h-134l2 -99v-27q0 -125 -32 -189t-91 -64q-79 0 -79 66q0 21 12 39q12 17 31 20q38 8 71 118q24 83 24 136q-120 0 -148 -52h-25q29 87 69 118 q43 34 122 34h385v-100h-117q-11 -46 -11 -142q0 -163 56 -163q45 0 60 71z" />
+<glyph unicode="&#x1d6d2;" horiz-adv-x="547" d="M66 -55v168q0 115 21 185q20 67 69 119q25 26 69 43q36 13 73 13q105 0 162 -67q55 -64 55 -178q0 -112 -74 -183q-60 -59 -146 -59h1q-49 0 -91 26v-66q0 -100 -20 -151h-140q21 43 21 150zM205 271v-199q27 -55 81 -55q49 0 67 52q15 45 15 151q0 129 -28 181 q-23 41 -65 41t-57 -45q-13 -38 -13 -126z" />
+<glyph unicode="&#x1d6d3;" horiz-adv-x="464" d="M334 -5l-117 -9q-7 -1 -21 -1q-85 0 -130 47q-43 43 -43 140q0 60 37 128q38 72 102 120q71 53 151 53q56 0 95 -28q36 -27 36 -70q0 -32 -22 -53q-18 -18 -43 -18l-136 68q-75 0 -115 -40q-37 -37 -37 -104q0 -76 67 -98q39 -13 114 -13q165 0 165 -138q0 -92 -62 -143 q-48 -39 -113 -39q-44 0 -71 21q-21 16 -21 40q0 28 19 46q18 16 42 16l107 -46q23 0 41 22q17 20 17 46q0 53 -54 53h-8z" />
+<glyph unicode="&#x1d6d4;" horiz-adv-x="568" d="M529 361h-200q12 -23 38.5 -43.5t49.5 -33.5t40.5 -38.5t17.5 -60.5q0 -85 -69 -142t-156 -57q-102 0 -163.5 71.5t-61.5 174.5q0 107 78 168t187 61h239v-100zM329 169q0 59 -14.5 103t-49.5 89q-33 0 -55.5 -24.5t-30 -54.5t-7.5 -63q0 -120 21 -163q19 -39 59 -39 q77 0 77 152z" />
+<glyph unicode="&#x1d6d5;" horiz-adv-x="492" d="M457 361h-139q-4 -10 -10 -65q-6 -52 -6 -99q0 -141 51 -141q45 0 60 71h25q0 -59 -42 -101q-39 -40 -100 -40q-73 0 -106 53q-22 35 -22 92q0 47 21 127q3 12 18 62q9 34 11 41h-58q-38 0 -73 -27q-34 -26 -44 -65h-25q10 71 56 129q50 63 116 63h267v-100z" />
+<glyph unicode="&#x1d6d6;" horiz-adv-x="576" d="M281 449v24q135 0 206 -71q64 -64 64 -173q0 -114 -71 -183q-62 -60 -155 -60q-217 0 -217 187v182q0 47 -24 47t-49 -48l-23 11q18 47 56 78q38 30 80 30t69 -21q30 -24 30 -71v-156q0 -113 15 -157q17 -51 63 -51q53 0 69 69q10 41 10 140q0 94 -32 156q-33 63 -91 67z " />
+<glyph unicode="&#x1d6d7;" horiz-adv-x="653" d="M257 17v135q0 48 9 99t28.5 103t58 85.5t90.5 33.5q78 0 134 -72q52 -67 52 -171q0 -106 -64 -175t-169 -69v-191h-139v191q-106 0 -169.5 69t-63.5 175q0 113 63.5 178t175.5 65h45v-25q-137 0 -137 -205q0 -136 20 -183q11 -25 25.5 -34t40.5 -9zM396 17h8q45 0 64 54 q14 43 14 172q0 199 -53 199q-33 0 -33 -168v-257z" />
+<glyph unicode="&#x1d6d8;" horiz-adv-x="612" d="M586 461l-251 -397l18 -64q33 -115 86 -115q55 0 67 76h25q0 -81 -27 -125q-25 -41 -71 -41q-43 0 -74 70q-11 25 -34 106l-15 53l-134 -213h-155l237 375l-22 85q-18 70 -43 95q-17 17 -45 17q-52 0 -67 -75h-25q0 71 24 116q26 49 76 49q42 0 69 -48q19 -33 35 -97 l25 -97l146 230h155z" />
+<glyph unicode="&#x1d6d9;" horiz-adv-x="763" d="M751 473v-25q-37 -5 -58 -30.5t-21 -68.5q0 -11 1 -16l11 -126q1 -6 1 -17q0 -87 -72 -151q-59 -53 -140 -53h-22v-191h-139v191h-22q-94 0 -156 69q-55 61 -55 152l12 126q0 98 -79 115v25h49q101 0 139 -72q26 -49 26 -150q0 -139 19 -190q17 -44 50 -44h17v444h139 v-444h17q40 0 55 59q14 56 14 175q0 118 33 166q38 56 132 56h49z" />
+<glyph unicode="&#x1d6da;" horiz-adv-x="734" d="M419 473h29q142 0 209 -82q51 -63 51 -164q0 -120 -78 -189q-58 -52 -133 -52q-90 0 -132 60q-51 -60 -130 -60q-87 0 -148 69q-61 68 -61 175t68 175t183 68h34v-25q-94 0 -123 -77q-15 -40 -15 -147q0 -96 11 -137q18 -70 64 -70q27 0 51 28q23 28 26 67 q-32 73 -32 132q0 53 20 84q19 30 55 30q39 0 57 -43q12 -29 12 -68q0 -63 -32 -136q4 -46 31 -73q21 -21 46 -21q79 0 79 207q0 117 -25 164q-32 60 -117 60v25z" />
+<glyph unicode="&#x1d6db;" horiz-adv-x="515" d="M88 606l-19 20q58 81 175 81q114 0 179 -100q68 -104 68 -301q0 -141 -58 -224q-67 -96 -178 -96q-103 0 -166.5 70t-63.5 171q0 100 56 166q69 80 174 80q56 0 95 -22l3 3q-8 90 -48.5 137.5t-101.5 47.5q-77 0 -115 -33zM340 218q0 124 -21 174t-67 50t-62.5 -47.5 t-16.5 -176.5q0 -109 18 -155t61 -46q45 0 66.5 46t21.5 155z" />
+<glyph unicode="&#x1d6dc;" horiz-adv-x="444" d="M412 109l18 -18q-78 -105 -191 -105q-102 0 -162 73q-52 64 -52 163q0 118 72 190q61 61 151 61l99 -20q20 0 22 20h23l17 -147h-23q-33 117 -115 117q-54 0 -83 -62q-21 -47 -21 -111h157v-44h-157q0 -82 49 -132q39 -41 89 -41q57 0 107 56z" />
+<glyph unicode="&#x1d6dd;" horiz-adv-x="647" d="M620 295l-1 -27q-11 0 -69 2q-5 -77 -13 -110q-43 -174 -212 -174q-217 0 -217 186v28q0 48 -24 48q-21 0 -49 -49l-23 12q16 44 53 75q38 32 83 32q43 0 70 -26q29 -26 29 -75v-27q0 -105 15 -138q16 -35 63 -35q53 0 68 72q11 55 11 191v5q-287 50 -287 247 q0 92 72 133q48 27 114 27q113 0 183 -99q65 -92 65 -238v-56q37 -4 69 -4zM403 338q-4 193 -37 271q-18 41 -51 41q-65 0 -65 -96q0 -69 40 -125q40 -57 113 -91z" />
+<glyph unicode="&#x1d6de;" horiz-adv-x="563" d="M546 461l-168 -211q-10 -49 -10 -100q0 -66 51 -66l58 23q20 0 35 -15q16 -15 16 -39q0 -38 -28 -57q-22 -15 -57 -15q-55 0 -87 41q-30 38 -30 99q0 29 7 72l-153 -193h-168l169 214q9 52 9 90q0 66 -50 66l-58 -23q-21 0 -36 15q-16 15 -16 39q0 37 29 57q23 15 56 15 q56 0 88 -41q29 -36 29 -99q0 -18 -6 -63l151 191h169z" />
+<glyph unicode="&#x1d6df;" horiz-adv-x="653" d="M396 473h11q101 0 166 -78q56 -68 56 -166q0 -112 -73 -183q-63 -60 -154 -60h-6v-191h-139v191h-8q-102 0 -168 77q-57 67 -57 165q0 117 74 186q64 59 155 59h4v203h139v-203zM396 17h8q48 0 64 50q14 45 14 150q0 132 -19 183q-17 42 -57 42h-10v-425zM257 17v425h-7 q-49 0 -65 -55q-14 -45 -14 -169q0 -118 20 -161q18 -40 59 -40h7z" />
+<glyph unicode="&#x1d6e0;" horiz-adv-x="511" d="M379 -177l-43 1q-86 1 -166 50q-145 87 -145 323q0 137 79 213q64 63 160 63q102 0 166 -77q56 -68 56 -167q0 -113 -73 -183q-63 -60 -153 -60q-96 0 -152 60l-2 -1q23 -54 78 -84q48 -26 101 -25l80 3h6q87 0 87 -79q0 -29 -24 -65h-25q0 28 -30 28zM339 218 q0 135 -20 183q-16 41 -58 41q-49 0 -65 -55q-14 -45 -14 -169q0 -116 21 -161q18 -40 58 -40q47 0 63 51q15 45 15 150z" />
+<glyph unicode="&#x1d6e1;" horiz-adv-x="864" d="M851 361h-79q42 -55 42 -136q0 -121 -73 -187q-56 -52 -138 -52q-89 0 -131 60q-51 -60 -131 -60q-93 0 -152 67q-56 65 -56 172q0 77 49 136h-24q-88 0 -124 -62h-25q55 162 216 162h626v-100zM642 361h-337q-25 -41 -25 -147q0 -197 74 -197q30 0 53 29q21 26 25 65 q-31 76 -31 113q0 40 20 65q19 24 56 24q36 0 54 -30q14 -23 14 -57t-33 -115q4 -45 30 -72q21 -22 46 -22q79 0 79 198q0 106 -25 146z" />
+<glyph unicode="&#x1d756;" horiz-adv-x="690" d="M665 0h-130l-66 162h-248l-66 -162h-130l306 690h28zM428 264l-83 204l-83 -204h166z" />
+<glyph unicode="&#x1d757;" horiz-adv-x="636" d="M463 373l1 -4q75 -36 102.5 -79.5t27.5 -101.5q0 -81 -73 -134.5t-181 -53.5h-260v676h237q118 0 180 -43t62 -125q0 -41 -25 -77.5t-71 -57.5zM208 413h72q141 0 141 89q0 37 -23 54.5t-77 17.5h-113v-161zM208 102h103q80 0 110.5 29t30.5 80q0 52 -49.5 76t-119.5 24 h-75v-209z" />
+<glyph unicode="&#x1d758;" horiz-adv-x="591" d="M569 574h-359v-574h-130v676h477z" />
+<glyph unicode="&#x1d759;" horiz-adv-x="720" d="M680 0h-640l306 690h28zM508 102l-148 366l-148 -366h296z" />
+<glyph unicode="&#x1d75a;" horiz-adv-x="635" d="M597 102l-27 -102h-490v676h480v-102h-350v-167h241v-103h-241v-202h387z" />
+<glyph unicode="&#x1d75b;" horiz-adv-x="653" d="M623 102l-15 -102h-583v16l372 558h-334l13 102h525v-16l-374 -558h396z" />
+<glyph unicode="&#x1d75c;" horiz-adv-x="715" d="M635 0h-130v297h-295v-297h-130v676h130v-277h295v277h130v-676z" />
+<glyph unicode="&#x1d75d;" horiz-adv-x="778" d="M743 336q0 -157 -99 -256t-254 -99q-154 0 -254.5 99t-100.5 256t100 256t254 99t254 -99t100 -256zM605 336q0 115 -57 184t-159 69t-159 -69t-57 -184q0 -116 57 -184.5t160 -68.5q102 0 158.5 68.5t56.5 184.5zM531 296h-282l12 102h256z" />
+<glyph unicode="&#x1d75e;" horiz-adv-x="440" d="M375 102l-9 -102h-287l-14 102h90v472h-90l14 102h287l9 -102h-90v-472h90z" />
+<glyph unicode="&#x1d75f;" horiz-adv-x="712" d="M707 0h-170l-296 306l-33 -29v-277h-128v676h128v-263l295 263h145v-14l-318 -278z" />
+<glyph unicode="&#x1d760;" horiz-adv-x="706" d="M666 0h-130l-183 468l-183 -468h-130l299 690h28z" />
+<glyph unicode="&#x1d761;" horiz-adv-x="913" d="M833 0h-128v467l-235 -467h-27l-235 467v-467h-128v676h161l214 -440h3l214 440h161v-676z" />
+<glyph unicode="&#x1d762;" horiz-adv-x="724" d="M644 -18l-105 20l-331 500v-502h-128v676h157l279 -424v424h128v-694z" />
+<glyph unicode="&#x1d763;" horiz-adv-x="640" d="M582 584h-524l13 92h498zM503 299h-366v102h366v-102zM605 102l-12 -102h-546l-12 102h570z" />
+<glyph unicode="&#x1d764;" horiz-adv-x="778" d="M743 337q0 -157 -99 -256t-254 -99q-154 0 -254.5 99t-100.5 256t100 256t254 99t254 -99t100 -256zM605 337q0 115 -57 184t-159 69t-159 -69t-57 -184q0 -116 57 -184.5t160 -68.5q102 0 158.5 68.5t56.5 184.5z" />
+<glyph unicode="&#x1d765;" horiz-adv-x="715" d="M635 0h-130v574h-295v-574h-130v676h555v-676z" />
+<glyph unicode="&#x1d766;" horiz-adv-x="581" d="M80 676h209q139 0 209.5 -50.5t70.5 -144.5q0 -91 -69.5 -147t-186.5 -56h-103v-278h-130v676zM210 380h71q83 0 119.5 25t36.5 77q0 92 -162 92h-65v-194z" />
+<glyph unicode="&#x1d767;" horiz-adv-x="778" d="M743 336q0 -157 -99 -256t-254 -99q-154 0 -254.5 99t-100.5 256t100 256t254 99t254 -99t100 -256zM177 398h423q-14 89 -68.5 140t-142.5 51t-142.5 -51t-69.5 -140zM603 296h-428q9 -99 65 -156t150 -57q93 0 148 57t65 156z" />
+<glyph unicode="&#x1d768;" horiz-adv-x="674" d="M632 102l-15 -102h-586v16l281 330l-284 314v16h562v-102h-330l205 -226l-210 -246h377z" />
+<glyph unicode="&#x1d769;" horiz-adv-x="641" d="M627 574h-240v-574h-130v574h-243l14 102h589z" />
+<glyph unicode="&#x1d76a;" horiz-adv-x="748" d="M728 675l-33 -98q-36 12 -52 12q-17 0 -31.5 -3.5t-38.5 -20.5t-44.5 -47.5t-45 -91t-44.5 -144.5v-282h-130v282q-20 84 -44.5 144.5t-45 91t-44.5 47.5t-38.5 20.5t-31.5 3.5q-12 0 -53 -11l-32 97q49 16 88 16q20 0 44 -5t58.5 -22.5t64 -44t57 -75t41.5 -111.5 q19 76 56 131t78.5 80.5t74 36t58.5 10.5q39 0 88 -16z" />
+<glyph unicode="&#x1d76b;" horiz-adv-x="800" d="M465 676v-102q80 -3 148.5 -28.5t115 -79.5t46.5 -127t-46.5 -128.5t-115 -82t-148.5 -29.5v-99h-130v99q-126 4 -218 67.5t-92 172.5q0 73 46 127t114.5 79.5t149.5 28.5v102h130zM464 472v-271q90 6 131.5 45t41.5 93q0 53 -41.5 90.5t-131.5 42.5zM336 201v271 q-90 -5 -131.5 -42.5t-41.5 -90.5q0 -54 41.5 -93t131.5 -45z" />
+<glyph unicode="&#x1d76c;" horiz-adv-x="740" d="M700 0h-154l-179 239l-173 -239h-154l249 343l-248 333h154l170 -228l166 228h154l-242 -333z" />
+<glyph unicode="&#x1d76d;" horiz-adv-x="806" d="M791 691l-31 -102q-18 -3 -29 -15.5t-15 -34t-5 -35t-1 -36.5q0 -93 -72.5 -148t-169.5 -61v-259h-130v259q-97 6 -169.5 62.5t-72.5 150.5q0 22 -1 35.5t-5 34t-15 32.5t-29 15l-31 102h39q77 0 124.5 -49.5t47.5 -162.5q0 -48 30 -79.5t82 -37.5v314h130v-314 q52 6 82 37.5t30 79.5q0 112 48 162t124 50h39z" />
+<glyph unicode="&#x1d76e;" horiz-adv-x="752" d="M720 102l-15 -102h-295l11 207q70 17 116.5 64t46.5 126q0 87 -58.5 139.5t-149.5 52.5q-90 0 -149 -58t-59 -134q0 -148 163 -191l11 -206h-295l-15 102h202l-4 29q-72 19 -131 87.5t-59 166.5q0 76 36.5 144.5t115 115t184.5 46.5q153 0 244.5 -91.5t91.5 -214.5 q0 -98 -59 -166.5t-131 -87.5l-4 -29h202z" />
+<glyph unicode="&#x1d76f;" horiz-adv-x="735" d="M685 664l-306 -694h-28l-306 694h640zM512 560h-294l147 -361z" />
+<glyph unicode="&#x1d770;" horiz-adv-x="662" d="M629 461l-116 -245q11 -35 20 -55q33 -80 92 -80v-16l-35 -79q-59 0 -87 13q-43 20 -65 78h-2q-30 -43 -64 -64q-43 -27 -115 -27q-94 0 -155.5 69t-61.5 172q0 95 64.5 170.5t170.5 75.5q116 0 181 -98l44 86h129zM383 209q-8 78 -39.5 123.5t-74.5 45.5 q-48 0 -76 -42.5t-28 -103.5q0 -65 28 -108t77 -43q42 0 70 38t43 90z" />
+<glyph unicode="&#x1d771;" horiz-adv-x="512" d="M372 416l2 -1q50 -12 81.5 -61t31.5 -106q0 -62 -19.5 -118t-55.5 -92q-53 -52 -140 -52q-55 0 -97 38v-135q0 -61 -17 -94h-119q16 37 16 88v527q0 57 10 103.5t33 88.5t67.5 66t107.5 24q67 0 118 -42.5t51 -111.5q0 -85 -70 -122zM175 442v-292q22 -38 41.5 -53.5 t50.5 -15.5q34 0 64.5 42t30.5 108q0 44 -9.5 71t-32 39t-44.5 15t-62 3v16l42 79q71 0 71 76q0 27 -14.5 47t-46.5 20q-91 0 -91 -155z" />
+<glyph unicode="&#x1d772;" horiz-adv-x="502" d="M477 461l-174 -411v-245l-13 -10l-107 24q8 124 8 227q0 104 -33 198q-17 49 -56 91.5t-92 42.5v16l50 79q75 0 135.5 -87.5t66.5 -177.5h2l83 253h130z" />
+<glyph unicode="&#x1d773;" horiz-adv-x="502" d="M380 539h-17q-60 58 -107 58q-21 0 -38 -12t-17 -34q0 -35 91 -80q90 -43 137.5 -102t47.5 -156q0 -87 -59 -157t-167 -70t-167 69.5t-59 157.5q0 75 35 131t102 84q-81 45 -81 123q0 69 51.5 105t127.5 36q57 0 99.5 -15.5t74.5 -58.5zM352 208q0 58 -20 92.5t-64 53.5 q-55 -3 -86.5 -43t-31.5 -103q0 -51 28.5 -89t71.5 -38q49 0 75.5 37.5t26.5 89.5z" />
+<glyph unicode="&#x1d774;" horiz-adv-x="451" d="M389 140l45 -61q-42 -60 -89 -76.5t-123 -16.5q-109 0 -162 53q-35 36 -35 91q0 34 19.5 64.5t60.5 44.5v3q-60 33 -60 90q0 66 58 103.5t139 37.5q69 0 112 -19.5t66 -70.5l-53 -61h-16q-22 34 -42.5 45t-60.5 11q-37 0 -60 -11.5t-23 -32.5q0 -41 72 -41h57l40 -82 l-11 -13h-96q-37 0 -57 -16.5t-20 -38.5q0 -25 24.5 -43.5t64.5 -18.5q98 0 134 59h16z" />
+<glyph unicode="&#x1d775;" horiz-adv-x="500" d="M281 81h56q58 0 104.5 -31t46.5 -96q0 -72 -46 -115.5t-122 -43.5q-53 0 -76 21v98h16q26 -24 61 -24q72 0 72 50q0 46 -79 46h-90q-81 0 -126 38q-70 61 -70 190q0 81 32 156t91 131v3q-64 41 -64 107q0 50 24 81h16l76 -17q-14 -30 -14 -54q0 -38 33 -53q53 31 82 43 t80 23h17l17 -95q-101 -11 -182 -92q-37 -37 -60 -95t-23 -124q0 -57 24 -96q33 -51 104 -51z" />
+<glyph unicode="&#x1d776;" horiz-adv-x="510" d="M474 -205h-127q-12 24 -12 95v419q0 69 -65 69q-24 0 -51.5 -21t-43.5 -64v-293h-120v349q0 51 -20 89l101 35h9q18 -20 26 -62h2q60 62 133 62q74 0 111.5 -39t37.5 -113v-437q0 -54 19 -89z" />
+<glyph unicode="&#x1d777;" horiz-adv-x="500" d="M477 341q0 -88 -25.5 -167t-78.5 -133.5t-123 -54.5t-123 54.5t-78.5 133.5t-25.5 167q0 87 25.5 165.5t78.5 132t123 53.5t123 -53.5t78.5 -132t25.5 -165.5zM148 388h204q0 82 -29 144.5t-73 62.5q-48 0 -75 -61t-27 -146zM352 293h-204q0 -89 29 -150.5t73 -61.5 q45 0 73.5 62t28.5 150z" />
+<glyph unicode="&#x1d778;" horiz-adv-x="319" d="M296 108l-14 -100q-39 -22 -90 -22q-68 0 -101 32q-38 36 -38 98v345h120v-298q0 -82 53 -82q28 0 54 27h16z" />
+<glyph unicode="&#x1d779;" horiz-adv-x="527" d="M512 0h-155l-163 187l-19 -20v-167h-120v461h120v-163h2q140 160 286 175l38 -79v-16q-55 -5 -97.5 -22.5t-64 -34.5t-62.5 -55z" />
+<glyph unicode="&#x1d77a;" horiz-adv-x="554" d="M520 65l-46 -79q-59 0 -101.5 36t-69.5 139l-36 137l-118 -298h-131l206 459q-21 83 -59.5 110.5t-97.5 27.5v16l50 79q68 0 118.5 -48t85.5 -166l76 -256q23 -79 49 -110t74 -31v-16z" />
+<glyph unicode="&#x1d77b;" horiz-adv-x="550" d="M517 65l-35 -79q-113 0 -136 70h-2q-16 -34 -43.5 -52t-56.5 -18q-49 0 -71 24h-2v-121q0 -61 -17 -94h-115q16 41 16 88v578h120v-312q0 -68 66 -68q29 0 54.5 21t39.5 62v297h120v-306q0 -36 12 -55t50 -19v-16z" />
+<glyph unicode="&#x1d77c;" horiz-adv-x="492" d="M339 453l116 20q17 -31 17 -109q0 -87 -54 -175t-146 -145.5t-191 -57.5h-26v475h120v-331h2q74 24 122 91t48 146q0 48 -13 76z" />
+<glyph unicode="&#x1d77d;" horiz-adv-x="501" d="M277 81h61q58 0 104.5 -31t46.5 -96q0 -72 -46 -115.5t-122 -43.5q-53 0 -76 21v98h16q26 -24 61 -24q72 0 72 50q0 46 -79 46h-89q-83 0 -140.5 50.5t-57.5 131.5q0 63 35 117t102 89v3q-59 27 -59 88q0 51 44 89q-25 17 -35.5 32.5t-10.5 43.5q0 32 23 62h16l77 -17 q-14 -18 -14 -35q0 -23 28 -38q84 32 143 32l11 -3l8 -92q-71 0 -120.5 -21.5t-49.5 -58.5q0 -30 36 -41q61 21 158 21l8 -5l-8 -90q-109 0 -188 -45.5t-79 -117.5q0 -100 124 -100z" />
+<glyph unicode="&#x1d77e;" horiz-adv-x="501" d="M476 229q0 -105 -64.5 -174t-161.5 -69q-95 0 -160 68.5t-65 173.5q0 109 64.5 177t164.5 68q95 0 158.5 -69t63.5 -175zM351 232q0 69 -26.5 107.5t-77.5 38.5q-48 0 -72.5 -41.5t-24.5 -104.5q0 -66 26 -108.5t74 -42.5q28 0 48.5 14.5t31.5 38t16 48.5t5 50z" />
+<glyph unicode="&#x1d77f;" horiz-adv-x="594" d="M572 366h-99q-12 -90 -12 -175q0 -55 19 -78.5t77 -31.5v-17l-40 -78q-28 0 -49 3t-47.5 12.5t-43.5 26.5t-29 48t-12 74q0 76 17 216h-76q0 -47 -0.5 -75t-2.5 -65.5t-6 -60t-11 -50.5t-17 -44t-25 -33.5t-34 -27t-44.5 -16t-57.5 -8.5l-13 95q26 7 36.5 10.5t24 15.5 t17 25t8 46t5 70.5t0.5 105.5q-15 0 -33.5 -19t-28.5 -55l-85 38q46 143 189 143h373v-95z" />
+<glyph unicode="&#x1d780;" horiz-adv-x="511" d="M54 -117v242q0 95 8.5 147.5t37.5 104.5q55 96 182 96q90 0 147 -63t57 -163q0 -138 -75 -210q-52 -51 -139 -51q-52 0 -98 41v-138q0 -61 -17 -94h-119q16 37 16 88zM361 230q0 148 -89 148q-69 0 -90 -92q-8 -33 -8 -136q22 -38 41.5 -53.5t50.5 -15.5q45 0 70 44 t25 105z" />
+<glyph unicode="&#x1d781;" horiz-adv-x="498" d="M279 81h56q58 0 104.5 -31t46.5 -96q0 -72 -46 -115.5t-122 -43.5q-53 0 -76 21v98h16q26 -24 61 -24q72 0 72 50q0 46 -79 46h-80q-87 0 -146.5 60t-59.5 152q0 119 76.5 197t194.5 78q62 0 115 -26.5t67 -78.5l-72 -57h-17q-18 67 -95 67q-67 0 -105.5 -45t-38.5 -107 q0 -60 21 -94q33 -51 107 -51z" />
+<glyph unicode="&#x1d782;" horiz-adv-x="520" d="M552 366h-165v-2q42 -33 65 -77t23 -88q0 -31 -14 -66.5t-40 -69t-70.5 -55.5t-98.5 -22q-96 0 -161.5 67.5t-65.5 171.5q0 62 22.5 110t58 74t72.5 39t73 13h301v-95zM350 210q0 102 -103 156q-45 0 -71 -38t-26 -99q0 -65 26.5 -106.5t75.5 -41.5q48 0 73 41t25 88z " />
+<glyph unicode="&#x1d783;" horiz-adv-x="479" d="M472 366h-153q-12 -90 -12 -175q0 -52 23.5 -77t83.5 -33v-17l-40 -78q-28 0 -50 3t-50 12.5t-46.5 26.5t-32 48t-13.5 74q0 76 21 216q-49 0 -74.5 -27.5t-37.5 -73.5l-85 38q26 81 64 119.5t105 38.5h297v-95z" />
+<glyph unicode="&#x1d784;" horiz-adv-x="514" d="M247 378v95q105 0 173.5 -61.5t68.5 -182.5q0 -105 -65 -174t-161 -69q-101 0 -154.5 50.5t-53.5 140.5v147q0 91 -20 113l102 36h16q22 -41 22 -73v-193q0 -52 21.5 -89t68.5 -37q48 0 73.5 46t25.5 96q0 155 -117 155z" />
+<glyph unicode="&#x1d785;" horiz-adv-x="634" d="M258 81v102q0 39 0.5 61.5t4 57.5t9.5 55.5t18 45.5t29.5 38t44.5 22.5t61 9.5q68 0 126 -67.5t58 -181.5q0 -99 -57.5 -168.5t-174.5 -69.5v-191h-120v191q-117 0 -174.5 69t-57.5 169q0 74 36 145t94 92l69 -58v-12q-74 -39 -74 -158q0 -152 108 -152zM376 212v-131 q108 0 108 150q0 80 -12 113.5t-47 33.5q-32 0 -40.5 -40.5t-8.5 -125.5z" />
+<glyph unicode="&#x1d786;" horiz-adv-x="573" d="M553 461l-215 -340q5 -89 44 -156t117 -75v-16l-48 -79q-39 0 -73 19.5t-57 52.5t-38.5 67t-24.5 70l-1 4l-110 -203h-138l210 333q-2 44 -11.5 82t-28 74.5t-53 58.5t-80.5 25v16l50 79q78 0 129 -60t75 -156l1 -4l114 208h138z" />
+<glyph unicode="&#x1d787;" horiz-adv-x="680" d="M699 473l-22 -95q-49 -17 -49 -152q0 -104 -48 -165t-158 -75v-191h-120v191q-206 24 -206 240q0 135 -49 152l-22 95q89 0 142.5 -55.5t53.5 -142.5q0 -109 14.5 -145.5t66.5 -48.5v380h120v-380q50 13 65.5 50t15.5 144q0 86 53.5 142t142.5 56z" />
+<glyph unicode="&#x1d788;" horiz-adv-x="740" d="M455 410l81 51q69 -19 111 -89.5t42 -151.5q0 -131 -70 -193q-47 -41 -117 -41q-44 0 -81 22t-55 61h-2q-16 -39 -53.5 -61t-81.5 -22q-76 0 -120 43q-67 62 -67 191q0 80 41.5 151t109.5 90l83 -51v-16q-56 -22 -82.5 -71.5t-26.5 -108.5q0 -133 62 -133q75 0 75 145v92 l107 29l13 -10v-111q0 -75 22 -110t56 -35q62 0 62 133q0 60 -26 109t-83 71v16z" />
+<glyph unicode="&#x1d789;" horiz-adv-x="501" d="M103 608l30 83q77 -4 136.5 -28.5t98 -62.5t63.5 -90.5t35 -109.5t10 -123q0 -154 -72 -227q-64 -64 -154 -64q-96 0 -160.5 68.5t-64.5 173.5q0 106 63 175.5t160 69.5q49 0 90 -33l3 2q-55 152 -222 154zM351 232q0 69 -26.5 107.5t-77.5 38.5q-48 0 -72.5 -41.5 t-24.5 -104.5q0 -66 26 -108.5t74 -42.5q28 0 48.5 14.5t31.5 38t16 48.5t5 50z" />
+<glyph unicode="&#x1d78a;" horiz-adv-x="462" d="M373 145l67 -65q-46 -56 -85.5 -75t-109.5 -19q-95 0 -157.5 66.5t-62.5 168.5q0 111 67 181.5t164 70.5q88 0 130 -30v-124h-16q-16 27 -38.5 41t-37.5 16t-37 2q-35 0 -66 -22.5t-39 -65.5h149v-95h-150q5 -48 36.5 -77.5t77.5 -29.5q70 0 108 57z" />
+<glyph unicode="&#x1d78b;" horiz-adv-x="536" d="M522 380v-95q-18 0 -43 5v-31q0 -130 -60 -201.5t-158 -71.5q-100 0 -153 50.5t-53 140.5v65q0 81 -20 103l102 36h16q22 -41 22 -73v-101q0 -53 20.5 -89.5t67.5 -36.5q91 0 91 172q0 44 -1 68q-222 72 -222 237q0 67 40 100.5t93 33.5q82 0 137.5 -76t70.5 -227 q24 -6 50 -9zM351 431q-3 78 -27 121.5t-61 43.5t-37 -48q0 -30 35.5 -67t89.5 -50z" />
+<glyph unicode="&#x1d78c;" horiz-adv-x="570" d="M554 85v-88q-39 -11 -71 -11q-61 0 -100.5 50t-46.5 152l-225 -202l-97 91l121 108v12q0 101 -19 141q-20 39 -68 39q-9 0 -21 -3v88q39 11 61 11q121 0 127 -215l240 215l97 -91l-136 -122q0 -78 29 -128t88 -50q9 0 21 3z" />
+<glyph unicode="&#x1d78d;" horiz-adv-x="634" d="M377 692v-219q51 0 91 -13t66 -35.5t43 -54.5t24.5 -66.5t7.5 -74.5q0 -106 -57 -174.5t-175 -68.5v-191h-120v191q-118 0 -175 68.5t-57 174.5q0 108 55 176t177 68v219h120zM376 378v-297q108 0 108 150q0 75 -30 111t-78 36zM258 81v297q-48 0 -78 -36t-30 -111 q0 -150 108 -150z" />
+<glyph unicode="&#x1d78e;" horiz-adv-x="494" d="M299 -205h-17q-5 14 -26.5 24t-60 30.5t-73.5 53.5q-97 93 -97 279q0 154 72 227q64 64 155 64q95 0 156 -69t61 -175t-62 -174.5t-159 -68.5q-49 0 -90 33l-3 -2q11 -29 38 -48.5t57.5 -30.5t59.5 -23t48 -36t19 -60zM344 232q0 146 -99 146q-47 0 -71 -46t-24 -110 q0 -65 24.5 -103t73.5 -38q52 0 74 46t22 105z" />
+<glyph unicode="&#x1d78f;" horiz-adv-x="848" d="M839 366h-92q39 -69 39 -146q0 -136 -70 -193q-50 -41 -117 -41q-95 0 -136 83h-2q-39 -83 -135 -83q-76 0 -120 43q-67 62 -67 184q0 86 45 152q-41 -4 -61 -30t-32 -70l-85 38q26 81 64 119.5t105 38.5h664v-95zM521 307v-81q0 -75 22 -110t56 -35q62 0 62 133 q0 98 -62 152h-273q-62 -54 -62 -152q0 -57 16 -95t46 -38q75 0 75 145v62l107 29z" />
+<glyph unicode="&#x1d7ce;" horiz-adv-x="500" d="M476 337q0 -157 -63 -253.5t-162 -96.5t-163 96t-64 251q0 51 7 99.5t24.5 95.5t43 81.5t65.5 56t89 21.5q75 0 127.5 -54.5t74 -131t21.5 -165.5zM318 224v225q0 111 -16 161t-53 50t-52 -48.5t-15 -162.5v-225q0 -112 16 -160.5t53 -48.5t52 48t15 161z" />
+<glyph unicode="&#x1d7cf;" horiz-adv-x="500" d="M441 0h-373v24q74 1 96 20.5t22 84.5v378q0 70 -36 70q-24 0 -65 -16l-20 -8v26l251 109h18v-570q0 -57 19.5 -75t87.5 -19v-24z" />
+<glyph unicode="&#x1d7d0;" horiz-adv-x="500" d="M478 211l-46 -211h-415v23q109 116 151.5 166.5t80.5 109.5q51 78 51 148q0 54 -31 90.5t-88 36.5q-77 0 -122 -90h-28q68 204 223 204q82 0 132 -49.5t50 -133.5q0 -110 -114 -218l-162 -154h140q81 0 107.5 13t45.5 65h25z" />
+<glyph unicode="&#x1d7d1;" horiz-adv-x="500" d="M58 524l-21 12q79 152 229 152q74 0 119 -40.5t45 -96.5q0 -38 -20.5 -73t-63.5 -54q57 -20 89.5 -68.5t32.5 -109.5q0 -110 -85.5 -185t-214.5 -75q-69 0 -110.5 24.5t-41.5 65.5q0 26 18.5 43t46.5 17q45 0 96 -57q39 -43 79 -43q45 0 71.5 34t26.5 88q0 75 -49 121 q-26 24 -56 39t-97 38v17q70 22 100.5 54t30.5 77q0 103 -99 103q-40 0 -69 -18.5t-57 -64.5z" />
+<glyph unicode="&#x1d7d2;" horiz-adv-x="500" d="M476 144h-64v-144h-145v144h-248v113l313 431h80v-433h64v-111zM268 255v294l-208 -294h208z" />
+<glyph unicode="&#x1d7d3;" horiz-adv-x="500" d="M470 676l-45 -127h-276l-22 -81q104 -6 151 -20q82 -23 127.5 -79.5t45.5 -134.5q0 -109 -78.5 -175.5t-203.5 -66.5q-65 0 -106 26t-41 62q0 26 17.5 43.5t43.5 17.5q46 0 100 -46q49 -42 90 -42q42 0 71 29.5t29 74.5q0 51 -36.5 90.5t-105.5 61.5q-49 15 -180 22 l97 345h322z" />
+<glyph unicode="&#x1d7d4;" horiz-adv-x="500" d="M470 688v-26q-109 -22 -173 -85t-93 -173q39 17 84 17q85 0 136 -54t51 -145q0 -105 -59 -170t-156 -65q-106 0 -169 77.5t-63 209.5q0 175 139 297q61 53 118.5 73.5t184.5 43.5zM323 165q0 117 -20 164t-69 47q-25 0 -37 -10q-13 -11 -13 -121q0 -150 27 -202 q15 -29 51 -29q35 0 48 31t13 120z" />
+<glyph unicode="&#x1d7d5;" horiz-adv-x="500" d="M477 676l-235 -676h-95l200 539h-199q-47 0 -68.5 -18t-36.5 -67h-26l45 222h415z" />
+<glyph unicode="&#x1d7d6;" horiz-adv-x="500" d="M472 187q0 -91 -62 -145.5t-170 -54.5q-96 0 -154 45.5t-58 124.5q0 132 149 168q-74 44 -106 87.5t-32 100.5q0 80 60.5 127.5t163.5 47.5q91 0 143 -41.5t52 -103.5q0 -98 -136 -140q84 -57 117 -105t33 -111zM339 537q0 53 -23.5 87.5t-64.5 34.5q-35 0 -59 -24 t-24 -59q0 -87 130 -154q25 33 33 56t8 59zM333 127q0 55 -25.5 89.5t-107.5 89.5q-51 -75 -51 -145q0 -68 24 -105t69 -37q42 0 66.5 28t24.5 80z" />
+<glyph unicode="&#x1d7d7;" horiz-adv-x="500" d="M31 -13v26q107 22 171.5 85t96.5 175q-37 -19 -88 -19q-83 0 -134 55.5t-51 149.5q0 97 61 163t154 66q105 0 168.5 -80t63.5 -214q0 -183 -145 -297q-67 -53 -126.5 -75t-170.5 -35zM317 461q0 117 -25 167q-17 33 -54 33q-34 0 -47 -30.5t-13 -117.5q0 -116 19.5 -165 t65.5 -49q28 0 41 9q4 2 5 20q8 31 8 86v47z" />
+<glyph unicode="&#x1d7ec;" horiz-adv-x="500" d="M476 337q0 -155 -64 -252.5t-162 -97.5t-162 97.5t-64 252.5t64 253t162 98t162 -98t64 -253zM351 341q0 252 -101 252t-101 -252q0 -259 101 -259t101 259z" />
+<glyph unicode="&#x1d7ed;" horiz-adv-x="500" d="M334 0h-120v542l-132 -50v90l233 106h19v-688z" />
+<glyph unicode="&#x1d7ee;" horiz-adv-x="500" d="M474 95l-33 -95h-421v23l242 300q69 85 69 167q0 41 -25.5 72t-68.5 31q-37 0 -67 -27t-43 -84h-95q18 95 76 150.5t147 55.5q90 0 143 -55t53 -135q0 -61 -21.5 -106.5t-82.5 -118.5l-147 -178h274z" />
+<glyph unicode="&#x1d7ef;" horiz-adv-x="500" d="M380 375v-2q42 -20 70.5 -61.5t28.5 -92.5q0 -76 -39.5 -130.5t-105.5 -81.5q-51 -20 -126 -20q-121 0 -190 73l58 77q49 -55 139 -55q74 0 110 32q34 31 34 84q0 51 -48 84q-49 33 -146 33v16l59 79q47 0 80 29t33 66q0 43 -25.5 65.5t-67.5 22.5q-35 0 -64 -22.5 t-42 -71.5l-90 31q27 73 82 115.5t132 42.5q79 0 134.5 -47t55.5 -122q0 -40 -19 -81t-53 -63z" />
+<glyph unicode="&#x1d7f0;" horiz-adv-x="500" d="M484 240l-22 -95h-50v-145h-120v145h-273v112l313 431h80v-448h72zM292 240v234l-170 -234h170z" />
+<glyph unicode="&#x1d7f1;" horiz-adv-x="500" d="M483 676l-38 -105h-225l-36 -116q108 -6 169 -40q108 -61 108 -183q0 -73 -36 -131t-95 -88q-52 -26 -126 -26q-122 0 -191 73l58 77q56 -55 136 -55q56 0 92.5 35t36.5 86q0 39 -15.5 63t-53.5 43q-50 26 -191 26l-15 11l93 330h329z" />
+<glyph unicode="&#x1d7f2;" horiz-adv-x="500" d="M159 389l2 -1q47 36 118 36q78 0 137 -55t59 -157q0 -100 -64 -164q-61 -61 -154 -61q-110 0 -170.5 82t-60.5 199q0 169 116 282q69 66 137.5 93.5t182.5 44.5l7 -9l-44 -86q-80 -6 -162.5 -64.5t-103.5 -139.5zM355 201q0 57 -23.5 92.5t-70.5 35.5q-34 0 -65 -21.5 t-50 -64.5q0 -70 29.5 -115.5t83.5 -45.5q49 0 72.5 35t23.5 84z" />
+<glyph unicode="&#x1d7f3;" horiz-adv-x="500" d="M471 676l-235 -676h-116l210 561h-295l23 115h413z" />
+<glyph unicode="&#x1d7f4;" horiz-adv-x="500" d="M472 166q0 -76 -58.5 -127.5t-162.5 -51.5q-94 0 -147 34q-76 47 -76 144q0 118 122 185q-107 65 -107 160q0 77 60.5 127.5t153.5 50.5q85 0 143.5 -46.5t58.5 -117.5q0 -55 -27 -92t-90 -68q74 -50 102 -94.5t28 -103.5zM344 522q0 32 -27 51.5t-70 19.5t-66 -20 t-23 -50q0 -55 99 -99q87 39 87 98zM352 168q0 36 -25.5 63t-89.5 64q-89 -49 -89 -122q0 -31 26 -61t76 -30q41 0 71.5 24.5t30.5 61.5z" />
+<glyph unicode="&#x1d7f5;" horiz-adv-x="500" d="M342 286l-2 1q-47 -36 -118 -36q-78 0 -137 55t-59 157q0 100 64 164q61 61 154 61q110 0 170.5 -82t60.5 -199q0 -169 -116 -282q-70 -67 -140.5 -96t-182.5 -42l-7 9l44 86q81 7 164.5 65t104.5 139zM355 432q0 70 -29.5 115.5t-83.5 45.5q-49 0 -72.5 -35t-23.5 -84 q0 -57 23.5 -92.5t70.5 -35.5q34 0 65 21.5t50 64.5z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.ttf b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.ttf
new file mode 100644
index 0000000..837445a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.ttf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.woff b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.woff
new file mode 100644
index 0000000..a7b6468
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.woff
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.eot b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.eot
new file mode 100644
index 0000000..96db677
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.eot
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.svg b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.svg
new file mode 100644
index 0000000..5175320
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.svg
@@ -0,0 +1,1137 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG webfont generated by Font Squirrel.
+Designer    : MicroPress Inc., with final additions and corrections provided by Coen Hoffman, Elsevier (retired)
+Foundry URL : http://www.stixfonts.org
+</metadata>
+<defs>
+<font id="webfontSsfHxKRo" horiz-adv-x="500" >
+<font-face units-per-em="1000" ascent="750" descent="-250" />
+<missing-glyph horiz-adv-x="250" />
+<glyph unicode="IJ" horiz-adv-x="823" d="M913 669v-25q-40 -5 -55.5 -19t-29.5 -66l-122 -457q-26 -99 -82 -150t-133 -51q-67 0 -107.5 26.5t-40.5 74.5q0 30 18.5 51t45.5 21t45 -18t18 -47q0 -17 -11.5 -32t-11.5 -22q0 -18 27 -18t43.5 32t44.5 138l114 432q13 51 13 64q0 29 -41 36l-33 5v25h298zM406 669 v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z" />
+<glyph unicode="ij" horiz-adv-x="552" d="M504 462l-116 -444q-31 -119 -81 -172t-126 -53q-47 0 -76 22t-29 55q0 22 14.5 37.5t34.5 15.5q22 0 35.5 -13.5t13.5 -35.5q0 -11 -7.5 -20t-7.5 -15q0 -15 24 -15q21 0 38 31t36 105l89 350q12 45 12 67q0 30 -41 30h-22v27q136 12 209 28zM544 617q0 -28 -20 -47.5 t-49 -19.5q-28 0 -47 20t-19 49q0 26 20 46t46 20q28 0 48.5 -20t20.5 -48zM216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61zM262 616 q0 -28 -19.5 -47t-48.5 -19q-28 0 -47 20t-19 49q0 25 20 45t45 20q28 0 48.5 -20t20.5 -48z" />
+<glyph unicode="&#xfb00;" horiz-adv-x="613" d="M236 449h165q35 125 79 181q55 68 147 68q45 0 72 -21.5t27 -58.5q0 -24 -14 -39t-37 -15q-21 0 -35 14.5t-14 35.5q0 13 8 24.5t8 17.5q0 13 -18 13q-26 0 -50 -40.5t-42 -113.5l-16 -66h135l-9 -42h-133q-63 -298 -95 -394q-42 -126 -90 -172q-47 -46 -114 -46 q-43 0 -71 22t-28 57q0 23 15 39t36 16q20 0 35 -14t15 -35q0 -14 -8 -25t-8 -17q0 -12 18 -12q30 0 48.5 39t41.5 150q11 54 88 392h-163q-63 -298 -95 -394q-42 -126 -90 -172q-47 -46 -114 -46q-43 0 -71 22t-28 57q0 23 15 39t36 16q20 0 35 -14t15 -35q0 -14 -8 -25 t-8 -17q0 -12 18 -12q30 0 48.5 39t41.5 150q11 54 88 392h-74l9 42h74q35 125 79 181q55 68 147 68q45 0 70.5 -20.5t25.5 -57.5q0 -24 -14 -39t-37 -15q-21 0 -33.5 13.5t-12.5 34.5q0 13 8 24.5t8 17.5q0 13 -18 13q-26 0 -50 -40.5t-42 -113.5z" />
+<glyph unicode="&#xfb01;" horiz-adv-x="556" d="M492 140l22 -13q-50 -78 -86 -107t-81 -29q-34 0 -52.5 17.5t-18.5 48.5q0 28 15 84l70 266h-150l-94 -385q-10 -39 -32 -85t-45 -75q-53 -67 -131 -67q-42 0 -69.5 22t-27.5 56q0 24 13.5 39.5t35.5 15.5t36.5 -14t14.5 -36q0 -13 -9.5 -23.5t-9.5 -15.5q0 -10 17 -10 q33 0 51 35t42 142l89 401h-75l10 42h76q32 96 51 132.5t60 69.5q64 52 151 52q65 0 103.5 -26t38.5 -69q0 -26 -16 -42t-41 -16t-41.5 16.5t-16.5 39.5q0 16 11 30t11 20q0 17 -26 17q-59 0 -90 -37q-24 -29 -39.5 -66t-37.5 -121h117q6 0 22 1t54 4t80 5l-75 -280 q-20 -77 -20 -102q0 -6 5 -11t10 -5q23 0 78 79z" />
+<glyph unicode="&#xfb02;" horiz-adv-x="556" d="M553 701l-151 -602q-4 -15 -4 -20q0 -7 5 -12t12 -5q26 0 76 75l20 -11q-51 -79 -85 -107t-78 -28q-32 0 -52 16t-20 42q0 15 5 37l79 321h-147l-76 -314q-35 -144 -92.5 -221t-133.5 -77q-44 0 -70.5 23t-26.5 58q0 25 13.5 39.5t38.5 14.5q21 0 34 -13t13 -34 q0 -13 -8 -23t-8 -17q0 -13 22 -13q26 0 42.5 35.5t43.5 153.5l89 388h-73l10 42h73q28 90 48 131t58 74q58 50 143 50q50 0 101 -15zM372 449l30 119q-21 15 -21 39q0 12 10.5 27t10.5 22t-11 13t-25 6q-48 0 -89 -62q-26 -39 -56 -164h151z" />
+<glyph unicode="&#xfb03;" horiz-adv-x="856" d="M792 140l22 -13q-50 -78 -86 -107t-81 -29q-34 0 -52.5 17.5t-18.5 48.5q0 28 15 84l70 266h-150l-94 -385q-10 -39 -32 -85t-45 -75q-53 -67 -131 -67q-42 0 -69.5 22t-27.5 56q0 24 13.5 39.5t35.5 15.5t36.5 -14t14.5 -36q0 -13 -9.5 -23.5t-9.5 -15.5q0 -13 17 -13 q32 0 50.5 36t42.5 144l89 401h-163q-63 -298 -95 -394q-42 -126 -90 -172q-47 -46 -114 -46q-43 0 -71 22t-28 57q0 23 15 39t36 16q20 0 35 -14t15 -35q0 -14 -8 -25t-8 -17q0 -12 18 -12q30 0 48.5 39t41.5 150q11 54 88 392h-74l9 42h74q35 125 79 181q55 68 147 68 q45 0 71 -20.5t26 -57.5q0 -24 -14 -39t-37 -15q-21 0 -34 13.5t-13 34.5q0 13 8 24.5t8 17.5q0 13 -18 13q-26 0 -50 -40.5t-42 -113.5l-16 -66h167q32 96 51 132.5t60 69.5q64 52 151 52q65 0 103.5 -26t38.5 -69q0 -26 -16 -42t-41 -16t-41.5 16.5t-16.5 39.5q0 16 11 30 t11 20q0 17 -26 17q-59 0 -90 -37q-24 -29 -39.5 -66t-37.5 -121h117q6 0 22 1t54 4t80 5l-75 -280q-20 -77 -20 -102q0 -6 5 -11t10 -5q23 0 78 79z" />
+<glyph unicode="&#xfb04;" horiz-adv-x="854" d="M851 701l-151 -602q-4 -15 -4 -20q0 -7 5 -12t12 -5q26 0 76 75l20 -11q-51 -79 -85 -107t-78 -28q-32 0 -52 16t-20 42q0 15 5 37l79 321h-147l-76 -314q-35 -144 -92.5 -221t-133.5 -77q-44 0 -70.5 23t-26.5 58q0 25 13.5 39.5t38.5 14.5q21 0 34 -13t13 -34 q0 -13 -8 -23t-8 -17q0 -13 22 -13q26 0 42.5 35.5t43.5 153.5l89 388h-163q-63 -298 -95 -394q-42 -126 -90 -172q-47 -46 -114 -46q-43 0 -71 22t-28 57q0 23 15 39t36 16q20 0 35 -14t15 -35q0 -14 -8 -25t-8 -17q0 -12 18 -12q30 0 48.5 39t41.5 150q11 54 88 392h-74 l9 42h74q35 125 79 181q55 68 147 68q45 0 71 -21t26 -58q0 -24 -14 -39t-37 -15q-21 0 -34 14t-13 35q0 13 8 24.5t8 17.5q0 13 -18 13q-26 0 -50 -40.5t-42 -113.5l-16 -66h166q28 90 48 131t58 74q58 50 143 50q50 0 101 -15zM670 449l30 119q-21 15 -21 39q0 12 10.5 27 t10.5 22t-11 13t-25 6q-48 0 -89 -62q-26 -39 -56 -164h151z" />
+<glyph unicode="fj" horiz-adv-x="556" d="M27 449h76q32 96 51 132.5t60 69.5q64 52 151 52q66 0 109 -26.5t43 -68.5q0 -26 -16 -42t-41 -16t-41.5 16.5t-16.5 39.5q0 16 6 30t6 20q0 17 -26 17q-59 0 -90 -37q-24 -29 -39.5 -66t-37.5 -121h117q62 0 178 13l-116 -444q-31 -118 -81 -170.5t-126 -52.5 q-47 0 -76 22t-29 55q0 22 14.5 37.5t34.5 15.5q22 0 36.5 -13.5t14.5 -35.5q0 -11 -8.5 -20t-8.5 -15q0 -15 24 -15q21 0 38.5 30t35.5 104l89 350q12 45 12 67q0 30 -35 30h-124l-94 -385q-10 -39 -32 -85t-45 -75q-53 -67 -131 -67q-42 0 -69.5 22t-27.5 56 q0 24 13.5 39.5t35.5 15.5t36.5 -14t14.5 -36q0 -13 -9.5 -23.5t-9.5 -15.5q0 -10 17 -10q33 0 51 35t42 142l89 401h-75z" />
+<glyph unicode=" "  horiz-adv-x="250" />
+<glyph unicode="&#x09;" horiz-adv-x="250" />
+<glyph unicode="&#xa0;" horiz-adv-x="250" />
+<glyph unicode="!" horiz-adv-x="389" d="M196 204l-29 9q44 233 52 353q1 26 4.5 44.5t12 36.5t24 27.5t38.5 9.5q72 0 72 -73q0 -29 -30 -89q-91 -180 -144 -318zM213 58q0 -30 -21.5 -50.5t-52.5 -20.5t-51.5 20t-20.5 51q0 32 21 53.5t52 21.5q29 0 51 -22.5t22 -52.5z" />
+<glyph unicode="&#x22;" horiz-adv-x="555" d="M396 398l15 214q2 29 26.5 51t53.5 22q19 0 32 -14.5t13 -34.5q0 -16 -13 -47l-85 -191h-42zM136 398l15 214q2 29 26.5 51t53.5 22q19 0 32 -14.5t13 -34.5q0 -18 -13 -47l-85 -191h-42z" />
+<glyph unicode="#" d="M532 490l-20 -73h-96l-54 -134h86l-20 -73h-96l-85 -210h-78l85 210h-113l-85 -210h-78l85 210h-95l20 73h105l54 134h-95l20 73h104l87 210h77l-86 -210h113l87 210h77l-86 -210h87zM338 417h-113l-54 -134h113z" />
+<glyph unicode="$" d="M497 598l-42 -134l-21 5q1 11 1 31q0 53 -18.5 81.5t-65.5 43.5l-59 -215q83 -72 111.5 -115t28.5 -97q0 -89 -67.5 -143.5t-186.5 -54.5l-28 -100h-52l29 107q-49 12 -80 28.5t-67 51.5l42 141l22 -6q2 -82 20 -117.5t73 -62.5l74 261q-78 60 -105 99t-27 91 q0 81 55 129t141 48q16 0 38 -2l18 65h50l-20 -72q74 -13 136 -63zM248 436l55 199q-5 2 -15 2q-50 0 -80 -26t-30 -69q0 -30 15 -53t55 -53zM253 274l-67 -242q61 0 99 32.5t38 96.5q0 37 -14.5 61t-55.5 52z" />
+<glyph unicode="%" horiz-adv-x="757" d="M707 214q0 -53 -19.5 -104t-53.5 -86q-39 -42 -99 -42q-57 0 -92.5 38.5t-35.5 99.5q0 85 58.5 149t136.5 64q49 0 77 -31.5t28 -87.5zM682 220q0 35 -17 57.5t-42 22.5q-31 0 -62 -46q-24 -36 -40 -87t-16 -91q0 -66 50 -66q44 0 79 51q48 74 48 159zM645 706l-438 -735 h-48l388 655q-56 -42 -113 -42q-28 0 -60 13q3 -29 3 -42q0 -53 -19.5 -105.5t-50.5 -83.5q-44 -44 -101 -44q-56 0 -91 39t-35 100q0 85 59 149t138 64q35 0 71 -29q38 -30 83 -30q49 0 88.5 21.5t77.5 69.5h48zM351 560q0 25 -6 35.5t-26 18.5q-11 5 -21 11q-14 9 -20 9 q-32 0 -67 -74.5t-35 -141.5q0 -66 50 -66q48 0 86.5 64t38.5 144z" />
+<glyph unicode="&#x26;" horiz-adv-x="849" d="M745 101l26 -21q-46 -56 -82.5 -77t-85.5 -21q-80 0 -142 62q-83 -63 -198 -63q-87 0 -137 42t-50 119q0 190 240 242q-11 56 -11 92q0 94 52.5 150t136.5 56q62 0 98 -31.5t36 -82.5q0 -54 -44.5 -95.5t-137.5 -76.5q15 -112 86 -227q74 88 74 129q0 17 -12 25t-44 13 v25h212v-25q-38 -3 -62 -25t-105 -129l-38 -49q52 -72 110 -72q38 0 78 40zM548 582q0 32 -13.5 49.5t-38.5 17.5q-33 0 -51.5 -30.5t-18.5 -82.5q0 -34 11 -102q62 33 86.5 67t24.5 81zM433 80q-44 62 -67.5 120.5t-41.5 142.5q-63 -31 -89 -65.5t-26 -87.5q0 -60 35.5 -99 t89.5 -39q53 0 99 28z" />
+<glyph unicode="'" horiz-adv-x="278" d="M128 398l16 215q2 34 25 53t54 19q19 0 32 -14.5t13 -34.5q0 -14 -15 -48l-83 -190h-42z" />
+<glyph unicode="(" horiz-adv-x="333" d="M326 685l18 -20q-62 -57 -95 -99t-60 -101q-67 -147 -67 -346q0 -90 15 -150.5t56 -132.5l-23 -15q-77 106 -109.5 191.5t-32.5 194.5q0 182 117 321q54 63 181 157z" />
+<glyph unicode=")" horiz-adv-x="333" d="M105 670l23 15q74 -101 102 -172q41 -103 41 -214q0 -137 -68 -251q-70 -117 -230 -227l-17 20q68 61 99.5 105t61.5 117q60 146 60 331q0 84 -16.5 146t-55.5 130z" />
+<glyph unicode="*" d="M312 468l11 -6q27 -15 41.5 -19t46.5 -4q33 0 57 -12t24 -39q0 -22 -16 -38t-36 -16q-19 0 -31.5 10t-28.5 37q-18 29 -29.5 41.5t-35.5 25.5l-11 6v-12q0 -42 26 -87q17 -29 17 -52t-14 -37t-37 -14t-36.5 14t-13.5 38q0 22 17 51q26 45 26 87v12l-11 -6 q-24 -13 -35.5 -25.5t-29.5 -41.5q-16 -27 -28.5 -37t-31.5 -10q-20 0 -36 16t-16 38q0 27 24 39t57 12q32 0 46.5 4t41.5 19l11 6l-11 6q-26 14 -41 18t-47 5q-33 0 -57 12.5t-24 39.5q0 21 15 37.5t34 16.5q33 0 63 -47q19 -29 31 -42.5t34 -25.5l11 -6v12q0 44 -26 88 q-17 29 -17 51q0 24 13.5 38t36.5 14t37 -14t14 -38q0 -22 -17 -51q-26 -44 -26 -88v-12l11 6q22 12 34 25.5t31 42.5q30 47 63 47q19 0 34 -16.5t15 -37.5q0 -27 -24 -39.5t-57 -12.5q-32 -1 -47 -5t-41 -18z" />
+<glyph unicode="+" horiz-adv-x="570" d="M537 209h-208v-209h-88v209h-208v88h208v209h88v-209h208v-88z" />
+<glyph unicode="," horiz-adv-x="250" d="M-47 -182l-13 25q118 63 118 116q0 21 -30 37q-40 22 -40 65q0 35 20.5 54t52.5 19q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="-" horiz-adv-x="333" d="M271 282l-23 -116h-246l24 116h245z" />
+<glyph unicode="." horiz-adv-x="250" d="M139 61q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 52q0 32 21.5 53.5t53.5 21.5q30 0 51.5 -21.5t21.5 -52.5z" />
+<glyph unicode="/" horiz-adv-x="278" d="M342 685l-319 -703h-87l319 703h87z" />
+<glyph unicode="0" d="M477 442q0 -113 -47.5 -225t-118.5 -176q-61 -55 -134 -55q-77 0 -118.5 59t-41.5 161q0 112 42 220.5t110 186.5q61 70 158 70q71 0 110.5 -65t39.5 -176zM374 582q0 34 -13 53t-36 19q-21 0 -38 -19.5t-38 -63.5q-44 -97 -86.5 -262t-42.5 -228q0 -30 13.5 -48 t36.5 -18q31 0 55.5 33t50.5 111q98 300 98 423z" />
+<glyph unicode="1" d="M419 683l-154 -560q-14 -52 -14 -63q0 -21 20.5 -28t78.5 -9v-23h-345v23q58 3 83 19.5t38 62.5l124 445q6 27 6 30q0 33 -48 33q-30 0 -62 -5l2 23q121 16 271 52z" />
+<glyph unicode="2" d="M86 507l-22 12q31 76 87.5 120t130.5 44q76 0 120 -47.5t44 -120.5q0 -59 -34.5 -116t-109.5 -121l-196 -167h138q65 0 95.5 15.5t55.5 64.5h24l-80 -191h-366v24l89 92q145 151 197.5 224t52.5 136q0 117 -92 117q-76 0 -134 -86z" />
+<glyph unicode="3" d="M117 537l-21 13q82 133 207 133q61 0 104 -39t43 -97q0 -104 -119 -149v-2q43 -32 60 -64.5t17 -81.5q0 -108 -83.5 -185.5t-206.5 -77.5q-61 0 -96.5 21.5t-35.5 58.5q0 26 16 42t43 16q22 0 37.5 -14t30 -38t22.5 -32q14 -14 40 -14q45 0 77.5 49.5t32.5 112.5 q0 71 -36 112q-23 26 -49.5 34.5t-72.5 11.5l4 22q190 40 190 153q0 90 -87 90q-35 0 -60.5 -16t-56.5 -59z" />
+<glyph unicode="4" d="M503 683l-119 -435h70l-27 -98h-69l-42 -150h-128l41 150h-244l28 105l427 428h63zM335 528l-282 -280h203z" />
+<glyph unicode="5" d="M486 669l-36 -109h-253l-34 -77q82 -15 111 -26t65 -41q73 -62 73 -165q0 -108 -82 -186t-204 -78q-63 0 -100 21.5t-37 57.5q0 26 16.5 42t42.5 16q44 0 71 -54q21 -43 59 -43q48 0 88.5 49.5t40.5 112.5q0 49 -26.5 90t-74.5 65q-47 24 -133 28l131 297h282z" />
+<glyph unicode="6" d="M503 679l6 -24q-178 -62 -278 -246q30 13 62 13q71 0 110.5 -44t39.5 -127q0 -116 -71 -191t-175 -75q-83 0 -128.5 54t-45.5 150q0 103 46 196.5t130 163.5q67 56 129.5 82t174.5 48zM319 315q0 35 -15.5 51t-52.5 16q-22 0 -32.5 -8t-22.5 -36q-27 -63 -44 -131 t-17 -112q0 -78 55 -78q36 0 61 39q27 43 47.5 123.5t20.5 135.5z" />
+<glyph unicode="7" d="M525 669l-381 -669h-92l332 556h-127q-84 0 -114.5 -14t-58.5 -63h-26l87 190h380z" />
+<glyph unicode="8" d="M183 341v4q-42 44 -58 77.5t-16 76.5q0 83 55 133.5t136 50.5q79 0 130 -44q46 -41 46 -99q0 -54 -33 -92.5t-110 -67.5v-4q49 -55 67.5 -95t18.5 -88q0 -94 -64.5 -150t-163.5 -56q-86 0 -137 45.5t-51 120.5q0 64 44 109t136 79zM383 544q0 47 -22 76.5t-55 29.5 q-39 0 -62.5 -26.5t-23.5 -71.5q0 -40 19.5 -74t70.5 -75q43 45 58 74t15 67zM306 140q0 43 -18 79.5t-79 101.5q-58 -37 -83.5 -78t-25.5 -102q0 -57 26 -90.5t70 -33.5q47 0 78.5 35.5t31.5 87.5z" />
+<glyph unicode="9" d="M-6 -10l-6 25q184 56 277 244q-32 -14 -61 -14q-68 0 -109.5 46t-41.5 121q0 114 71.5 192.5t174.5 78.5q74 0 118 -44q58 -60 58 -163q0 -109 -57 -212t-155 -172q-58 -41 -114.5 -62.5t-154.5 -39.5zM363 582q0 69 -49 69q-48 0 -79 -63q-23 -47 -40.5 -117.5 t-17.5 -118.5q0 -64 66 -64q32 0 44.5 14.5t32.5 74.5q43 128 43 205z" />
+<glyph unicode=":" horiz-adv-x="333" d="M171 61q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52zM264 385q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52z" />
+<glyph unicode=";" horiz-adv-x="333" d="M264 385q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52zM-12 -183l-13 25q118 63 118 116q0 21 -30 37q-41 23 -41 65q0 35 21 54t53 19q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x3c;" horiz-adv-x="570" d="M539 -12l-508 223v84l508 223v-96l-385 -169l385 -169v-96z" />
+<glyph unicode="=" horiz-adv-x="570" d="M537 107h-504v88h504v-88zM537 311h-504v88h504v-88z" />
+<glyph unicode="&#x3e;" horiz-adv-x="570" d="M539 211l-508 -223v96l385 169l-385 169v96l508 -223v-84z" />
+<glyph unicode="?" d="M227 61q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52zM196 208l-29 8q7 100 112 209q64 67 64 149q0 37 -18.5 58t-50.5 21q-24 0 -43 -11.5t-19 -26.5q0 -11 14.5 -28t14.5 -39q0 -25 -18 -43.5t-43 -18.5 q-26 0 -43.5 21.5t-17.5 50.5q0 51 52.5 88.5t128.5 37.5q74 0 122 -38.5t48 -105.5q0 -98 -126 -171q-72 -42 -98.5 -72.5t-49.5 -88.5z" />
+<glyph unicode="@" horiz-adv-x="939" d="M703 77l13 -35q-116 -60 -231 -60q-156 0 -261.5 102t-105.5 241q0 154 108 257t265 103q144 0 239 -82t95 -216q0 -103 -50.5 -173.5t-136.5 -71.5q-37 0 -64 22t-29 53q-56 -74 -122 -74q-43 0 -69.5 31.5t-26.5 82.5q0 96 56.5 177t144.5 81q27 0 41 -10t31 -42l11 38 h71l-61 -243q-6 -30 -6 -34q0 -21 11 -32.5t30 -11.5q37 0 67 38.5t43 84.5t13 83q0 109 -84.5 184.5t-202.5 75.5q-124 0 -203.5 -91.5t-79.5 -235.5q0 -125 80 -208t207 -83q125 0 207 49zM583 402q0 64 -42 65q-59 1 -98.5 -62t-39.5 -130q0 -39 16 -62t43 -23 q47 0 82 68q39 76 39 144z" />
+<glyph unicode="A" horiz-adv-x="667" d="M593 0h-303v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5t61 -19.5v-25zM346 248l-37 243l-148 -243h185z" />
+<glyph unicode="B" horiz-adv-x="667" d="M118 669h265q241 0 241 -146q0 -39 -13.5 -67t-44 -47t-57 -29.5t-74.5 -24.5v-1q72 -20 104.5 -55.5t32.5 -92.5q0 -99 -78 -152.5t-217 -53.5h-302v25q36 5 54 22t30 61l119 438q11 39 11 57t-10.5 27.5t-23.5 11.5t-37 2v25zM334 577l-57 -209q5 0 21.5 1.5t21.5 1.5 t18.5 1.5t19 2.5t16 3.5t16.5 5.5l13 6q8 3 14.5 7.5t12.5 10.5q47 44 47 128q0 101 -87 101q-25 0 -35 -10t-21 -50zM269 338l-64 -236q-7 -27 -7 -37q0 -33 57 -33q73 0 121 59q43 52 43 138q0 58 -35 85q-28 21 -115 24z" />
+<glyph unicode="C" horiz-adv-x="667" d="M677 685l-51 -235l-32 6q3 20 3 36q0 72 -34.5 115t-96.5 43q-80 0 -145 -73q-61 -69 -98 -165t-37 -203q0 -81 42 -127.5t113 -46.5q61 0 105 28t99 91l31 -22q-42 -58 -78 -85q-86 -65 -199 -65q-122 0 -194.5 69t-72.5 183q0 109 42.5 202t116.5 156q111 93 249 93 q64 0 131 -21q24 -8 38 -8q20 0 38 29h30z" />
+<glyph unicode="D" horiz-adv-x="722" d="M94 669h290q141 0 221 -70.5t80 -193.5q0 -82 -31.5 -159t-87.5 -129q-127 -117 -324 -117h-288v25q37 5 53.5 21.5t29.5 62.5l115 422q15 53 15 71t-8.5 26t-30.5 11l-34 5v25zM318 600l-126 -465q-15 -53 -15 -67q0 -34 58 -34q130 0 210 105q93 121 93 318 q0 181 -165 181q-25 0 -37 -8.5t-18 -29.5z" />
+<glyph unicode="E" horiz-adv-x="667" d="M653 669l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5t-114 19.5l-63 -234q-8 -32 -8 -38q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5 l-60 -194h-553v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="F" horiz-adv-x="667" d="M660 669l-43 -190l-27 5q0 75 -20 100q-24 30 -59 41.5t-98 11.5q-30 0 -42.5 -9.5t-20.5 -38.5l-61 -219q99 1 133 19t65 88l28 -4l-74 -274l-28 5q4 25 4 44q0 51 -28.5 70t-108.5 20l-55 -206q-15 -56 -15 -63q0 -23 14.5 -32t56.5 -12v-25h-294v25q41 4 55.5 19.5 t26.5 59.5l121 442q10 38 10 61q0 28 -42 33l-31 4v25h533z" />
+<glyph unicode="G" horiz-adv-x="722" d="M705 330v-26q-38 -3 -52 -19t-30 -77l-44 -167l-28 -13q-42 -20 -108.5 -33t-125.5 -13q-133 0 -214.5 74t-81.5 200q0 96 43.5 185t119.5 152q112 92 264 92q64 0 124 -21q24 -9 36 -9q27 0 42 30h31l-51 -221l-29 4q-3 82 -24 119q-36 62 -115 62q-96 0 -173 -98 q-51 -67 -81.5 -155.5t-30.5 -179.5q0 -97 42 -146.5t122 -49.5q73 0 94 30l31 104q27 92 27 114q0 16 -12 24q-14 7 -63 12v26h287z" />
+<glyph unicode="H" horiz-adv-x="778" d="M799 669v-25q-36 0 -53.5 -16.5t-28.5 -57.5l-111 -408q-22 -84 -22 -96q0 -22 16 -30.5t57 -10.5v-25h-316v25q51 3 70 17.5t32 61.5l62 225h-239l-54 -197q-12 -43 -12 -67q0 -34 71 -40v-25h-295v25q39 5 54 18.5t27 55.5l121 447q11 38 11 58q0 17 -9.5 25t-32.5 11 l-31 4v25h316v-25q-49 -2 -69 -17t-33 -63l-52 -191h239l47 173q10 38 10 61q0 15 -9 22.5t-32 10.5l-31 4v25h297z" />
+<glyph unicode="I" horiz-adv-x="389" d="M406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z" />
+<glyph unicode="J" d="M524 669v-25q-40 -5 -55.5 -19t-29.5 -66l-122 -457q-26 -99 -82 -150t-133 -51q-67 0 -107.5 26.5t-40.5 74.5q0 30 18.5 51t45.5 21t45 -18t18 -47q0 -17 -11.5 -32t-11.5 -22q0 -18 27 -18t43.5 32t44.5 138l114 432q13 51 13 64q0 29 -41 36l-33 5v25h298z" />
+<glyph unicode="K" horiz-adv-x="667" d="M702 669v-25q-33 -5 -47.5 -12t-46.5 -36l-216 -199l157 -333q9 -19 22 -27.5t41 -11.5v-25h-280l1 25l26 4q21 3 29.5 8t8.5 15q0 16 -15 49l-111 236l-67 -249q-2 -10 -2 -17q0 -25 13 -34t52 -12v-25h-288v25q36 4 52.5 17t26.5 51l123 453q11 38 11 58q0 17 -9 25 t-32 11l-33 4v25h311v-25q-45 -4 -64.5 -18.5t-29.5 -53.5l-62 -227l197 175q77 68 77 97q0 22 -35 25l-21 2v25h211z" />
+<glyph unicode="L" horiz-adv-x="611" d="M590 195l-60 -195h-552v25q40 5 55 20.5t27 57.5l121 443q11 42 11 61q0 15 -9 22t-32 10q-20 4 -34 5v25h318v-25q-50 -3 -69.5 -16.5t-29.5 -53.5l-129 -473q-6 -24 -6 -39q0 -30 72 -30q104 0 178 45q38 23 61.5 48.5t53.5 74.5z" />
+<glyph unicode="M" horiz-adv-x="889" d="M917 669v-25q-39 -5 -55 -20t-29 -61l-119 -438q-10 -34 -10 -57q0 -25 14 -34t57 -9v-25h-311v25q50 3 69.5 18.5t31.5 60.5l123 457l-375 -573h-28l-67 559l-101 -369q-20 -71 -20 -92q0 -33 15.5 -44.5t64.5 -16.5v-25h-206v25q40 9 58 36.5t45 120.5l107 369 q11 41 11 58q0 22 -12 28.5t-59 6.5v25h219l54 -480l311 480h212z" />
+<glyph unicode="N" horiz-adv-x="722" d="M748 669v-25q-42 -8 -58.5 -32.5t-43.5 -120.5l-143 -506h-28l-257 547l-99 -354q-19 -66 -19 -94q0 -29 17.5 -42t61.5 -17v-25h-206v25q42 8 56 30t45 125l120 407q-15 34 -28.5 43.5t-53.5 13.5v25h193l216 -467l81 289q19 71 19 94q0 59 -81 59v25h208z" />
+<glyph unicode="O" horiz-adv-x="722" d="M691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92 t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="P" horiz-adv-x="611" d="M112 669h282q219 0 219 -155q0 -80 -59 -131q-75 -66 -214 -66q-37 0 -81 5l-54 -199q-11 -37 -11 -58q0 -20 15 -29t57 -11v-25h-294v25q40 6 55.5 20.5t28.5 61.5l117 426q13 46 13 74q0 15 -9 22.5t-32 10.5l-33 4v25zM330 584l-61 -229q17 -3 42 -3q46 0 74.5 14.5 t48.5 47.5q33 52 33 136q0 40 -22.5 63.5t-61.5 23.5q-26 0 -35 -9.5t-18 -43.5z" />
+<glyph unicode="Q" horiz-adv-x="722" d="M203 -17l2 4l-16 6q-162 58 -162 218q0 110 49.5 211.5t130.5 169.5q112 93 242 93q105 0 173.5 -66t68.5 -167q0 -94 -40.5 -187t-114.5 -164q-67 -65 -124 -89.5t-160 -28.5l-44 -47v-3q101 -5 186 -35q46 -16 85 -16q46 0 79 16.5t76 61.5l21 -19 q-58 -84 -116.5 -116.5t-142.5 -32.5q-55 0 -136 26q-68 21 -104 21q-43 0 -114 -28l-14 24zM547 532q0 53 -28 86t-73 33q-91 0 -162 -119q-45 -76 -79 -195t-34 -201q0 -55 27.5 -87t74.5 -32q94 0 169 137q43 80 74 189.5t31 188.5z" />
+<glyph unicode="R" horiz-adv-x="667" d="M110 669h286q227 0 227 -143q0 -92 -96 -151q-31 -19 -96 -32l85 -254q12 -36 28.5 -48t58.5 -16v-25h-202l-107 331h-30l-52 -182q-18 -62 -18 -82q0 -22 14 -30.5t58 -11.5v-25h-294v25q36 4 53 21.5t29 62.5l120 437q10 38 10 61q0 16 -9 24t-33 10l-32 3v25zM330 583 l-57 -220q91 1 127 25q33 20 52.5 62t19.5 92q0 46 -21 70.5t-61 24.5q-25 0 -38 -10.5t-22 -43.5z" />
+<glyph unicode="S" horiz-adv-x="556" d="M526 681l-40 -202l-27 4q-9 76 -22 101q-33 66 -116 66q-41 0 -69.5 -29t-28.5 -76q0 -41 22.5 -66.5t84.5 -70.5q80 -58 109 -104t29 -113q0 -63 -29 -110.5t-81 -73.5q-52 -25 -120 -25q-53 0 -122 24q-32 11 -46 11t-21.5 -6.5t-16.5 -28.5h-30l36 225l29 -2 q7 -54 16 -84t32 -55q44 -50 106 -50q56 0 89 34q37 37 37 92q0 43 -25.5 75.5t-89.5 78.5q-66 47 -98 92.5t-32 105.5q0 84 58.5 137.5t145.5 53.5q50 0 91.5 -15t54.5 -15q31 0 44 26h30z" />
+<glyph unicode="T" horiz-adv-x="611" d="M650 669l-36 -192l-27 2q0 85 -31.5 120t-106.5 35l-135 -489q-17 -58 -17 -74q0 -46 83 -46v-25h-331v25h15q72 0 91 72l148 537q-79 -2 -130 -34t-88 -109l-25 7l39 171h551z" />
+<glyph unicode="U" horiz-adv-x="722" d="M744 669v-25q-32 -6 -44.5 -14t-25.5 -36.5t-32 -96.5l-65 -234q-25 -89 -52.5 -145t-68.5 -89q-59 -47 -166 -47q-101 0 -162 42.5t-61 120.5q0 47 37 189l51 193q15 55 15 78q0 17 -9 25.5t-32 10.5l-32 3v25h311v-25q-46 -2 -64 -16.5t-30 -59.5l-81 -294 q-28 -101 -28 -135q0 -101 122 -101q78 0 123 47q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25h207z" />
+<glyph unicode="V" horiz-adv-x="667" d="M715 669v-25q-39 -8 -62 -44l-390 -618h-32l-76 513q-8 56 -13.5 81.5t-15.5 43t-22.5 21t-37.5 3.5v25h296v-25q-51 -4 -63 -11.5t-12 -33.5q0 -11 2 -23l50 -394l187 297q63 101 63 129q0 31 -41 34l-24 2v25h191z" />
+<glyph unicode="W" horiz-adv-x="889" d="M940 669v-24q-32 -5 -48 -19t-40 -63l-282 -581h-29l-59 489l-233 -489h-29l-78 572q-8 54 -19.5 68.5t-58.5 22.5v24h278v-25q-35 -4 -48 -15t-13 -35q0 -14 1 -19l40 -349l149 314q0 60 -12.5 79.5t-57.5 25.5v24h267v-25q-39 -4 -50.5 -14.5t-11.5 -39.5q0 -5 7 -73 l33 -291l155 327q15 33 15 46q0 27 -10.5 34.5t-52.5 10.5v25h187z" />
+<glyph unicode="X" horiz-adv-x="667" d="M694 669v-25q-28 -4 -47.5 -16t-51.5 -45l-199 -205l75 -237q21 -66 41.5 -88t73.5 -28v-25h-307v25q42 4 54.5 11t12.5 27q0 30 -37 141l-20 60l-130 -144q-32 -35 -32 -55q0 -34 63 -40v-25h-214v25q10 2 17.5 4t16.5 8l17 11q7 4 19 16l22 20l26 27l30 33l38 42l45 49 l68 74l-83 269q-12 40 -29 50.5t-64 15.5v25h305v-25l-29 -3q-25 -2 -35 -9t-10 -24q0 -21 35 -132l17 -55l94 99q70 74 70 98q0 21 -33 24l-21 2v25h202z" />
+<glyph unicode="Y" horiz-adv-x="611" d="M659 669v-25q-27 -4 -46.5 -20t-45.5 -52l-189 -264l-52 -191q-10 -40 -10 -51q0 -22 17 -31.5t62 -9.5v-25h-323v25q52 5 72 18.5t32 59.5l57 208l-87 270q-12 35 -23.5 45t-51.5 18v25h285v-25q-42 -2 -55.5 -9.5t-13.5 -29.5q0 -19 29 -110l46 -143l128 183 q28 40 28 67q0 23 -13 32t-53 10v25h207z" />
+<glyph unicode="Z" horiz-adv-x="611" d="M589 640l-434 -605h75q70 0 115.5 11t83.5 39q49 37 97 114l27 -5l-60 -194h-505v29l434 605h-83q-79 0 -133.5 -32t-113.5 -115l-28 4l58 178h467v-29z" />
+<glyph unicode="[" horiz-adv-x="333" d="M362 674l-7 -35h-69q-27 0 -34.5 -10t-18.5 -56l-155 -667q-1 -3 -1 -9q0 -21 34 -21h78l-7 -35h-219l199 833h200z" />
+<glyph unicode="\" horiz-adv-x="278" d="M279 -18h-84l-196 703h85z" />
+<glyph unicode="]" horiz-adv-x="333" d="M343 674l-200 -831h-199l7 35h68q26 0 33 9t18 54l157 667l1 10q0 21 -34 21h-78l7 35h220z" />
+<glyph unicode="^" horiz-adv-x="570" d="M503 304h-89l-129 272l-129 -272h-89l178 365h80z" />
+<glyph unicode="_" d="M500 -125h-500v50h500v-50z" />
+<glyph unicode="`" horiz-adv-x="333" d="M297 516h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33z" />
+<glyph unicode="a" d="M435 127l21 -15q-78 -126 -156 -126q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17t24.5 -55h1l17 59l111 7l-75 -251q-30 -99 -30 -133q0 -15 12 -15t27 14.5t46 55.5zM303 373 q0 20 -10.5 33.5t-26.5 13.5q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57q45 0 86 75q29 52 50.5 123.5t21.5 116.5z" />
+<glyph unicode="b" d="M284 699l-91 -326q65 89 144 89q47 0 77 -37.5t30 -93.5q0 -135 -97 -239.5t-223 -104.5q-53 0 -95.5 17.5t-42.5 43.5q0 9 20 81l94 327q39 136 39 156q0 30 -46 30h-19v27q123 14 210 30zM319 325q0 69 -41 69q-52 0 -92 -84q-24 -52 -62 -182q-15 -51 -15 -81 q0 -12 8.5 -19.5t22.5 -7.5q55 0 108 78q30 43 50.5 112t20.5 115z" />
+<glyph unicode="c" horiz-adv-x="444" d="M318 142l28 -18l-38 -50q-13 -17 -34.5 -37.5t-42.5 -31.5q-35 -18 -83 -18q-70 0 -111.5 39.5t-41.5 111.5q0 134 105 239q83 85 180 85q46 0 79 -25.5t33 -64.5q0 -32 -17 -51.5t-45 -19.5q-25 0 -41.5 15t-16.5 38q0 16 10.5 32t10.5 26q0 7 -7.5 12t-16.5 5 q-26 0 -47.5 -22.5t-45.5 -65.5q-53 -98 -53 -201q0 -43 19.5 -66t53.5 -23q32 0 59 20t63 71z" />
+<glyph unicode="d" d="M517 699l-117 -421q-51 -184 -51 -203q0 -5 3.5 -10t7.5 -5q24 0 68 71l22 -16q-79 -126 -150 -126q-28 0 -44 16t-16 45q0 20 11 68q-72 -131 -166 -131q-48 0 -77 32.5t-29 92.5q0 72 37 150t94 132q70 68 138 68q46 0 75 -33l18 64q29 102 29 122q0 28 -41 28h-21v27 q129 10 209 29zM308 371q0 21 -10.5 35t-26.5 14q-57 1 -114 -112q-24 -48 -39 -100.5t-15 -85.5q0 -27 11.5 -45t29.5 -18q45 0 86 74q27 48 52.5 126.5t25.5 111.5z" />
+<glyph unicode="e" horiz-adv-x="444" d="M317 143l29 -17q-78 -139 -195 -139q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122q-32 -27 -73.5 -42.5t-114.5 -28.5q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20t60.5 72zM306 390q0 39 -31 39q-71 0 -127 -215 q68 15 113 64.5t45 111.5z" />
+<glyph unicode="f" horiz-adv-x="333" d="M47 449h74q35 125 79 181q55 68 147 68q45 0 72 -21.5t27 -58.5q0 -24 -14 -39t-37 -15q-21 0 -35 14.5t-14 35.5q0 13 8 24.5t8 17.5q0 13 -18 13q-26 0 -50 -40.5t-42 -113.5l-16 -66h91l-9 -42h-89q-63 -298 -95 -394q-42 -126 -90 -172q-47 -46 -114 -46 q-43 0 -71 22t-28 57q0 23 15 39t36 16q20 0 35 -14t15 -35q0 -14 -8 -25t-8 -17q0 -12 18 -12q30 0 48.5 39t41.5 150q11 54 88 392h-74z" />
+<glyph unicode="g" d="M477 373h-66q6 -12 6 -42q0 -81 -71 -132q-64 -46 -145 -46q-27 0 -51 8q-10 0 -19 -10t-9 -26q0 -12 15 -23.5t39 -17.5l50 -12q81 -19 115 -47.5t34 -75.5q0 -63 -64.5 -107.5t-172.5 -44.5q-89 0 -139.5 25.5t-50.5 75.5q0 59 40 83t93 26q-62 21 -62 66q0 30 21 53 t75 44q-80 34 -80 110q0 78 62.5 130t155.5 52q75 0 114 -33h110v-56zM300 372q0 59 -45 59q-30 0 -57 -32q-23 -29 -35 -73t-12 -83q0 -59 42 -59q47 0 78 69q29 63 29 119zM266 -100q0 37 -42 58q-17 8 -58.5 21.5t-50.5 14.5q-7 -1 -24.5 -11t-26.5 -19q-29 -28 -29 -55 q0 -35 31.5 -56.5t81.5 -21.5q52 0 85 20.5t33 48.5z" />
+<glyph unicode="h" horiz-adv-x="556" d="M476 142l22 -15q-50 -77 -85.5 -106.5t-81.5 -29.5q-30 0 -48 17t-18 47t11 70t50 155l20 59q7 21 7 30q0 21 -20 21q-42 0 -106 -94q-36 -53 -58 -108t-61 -188h-121l152 562q10 37 10 47q0 33 -42 33h-22v27q99 9 209 30l-108 -416q74 105 118 142t95 37q37 0 56.5 -20 t19.5 -55q0 -28 -29 -118l-59 -182q-3 -8 -3 -12q0 -5 5.5 -10.5t11.5 -5.5q17 0 75 83z" />
+<glyph unicode="i" horiz-adv-x="278" d="M216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61zM262 616q0 -28 -19.5 -47t-48.5 -19q-28 0 -47 20t-19 49q0 25 20 45t45 20q28 0 48.5 -20 t20.5 -48z" />
+<glyph unicode="j" horiz-adv-x="278" d="M239 462l-116 -444q-31 -119 -81 -172t-126 -53q-47 0 -76 22t-29 55q0 22 14.5 37.5t34.5 15.5q22 0 35.5 -13.5t13.5 -35.5q0 -11 -7.5 -20t-7.5 -15q0 -15 24 -15q21 0 38 31t36 105l89 350q12 45 12 67q0 30 -41 30h-22v27q136 12 209 28zM279 617q0 -28 -20 -47.5 t-49 -19.5q-28 0 -47 20t-19 49q0 26 20 46t46 20q28 0 48.5 -20t20.5 -48z" />
+<glyph unicode="k" d="M483 449v-25q-37 -5 -61.5 -18.5t-73.5 -57.5l-64 -58q19 -95 33 -145.5t24 -66t22 -15.5q28 0 64 64l22 -11q-32 -68 -65 -96t-73 -28q-47 0 -72.5 46.5t-50.5 176.5l-39 -27l-50 -188h-122l157 566q7 24 7 42q0 20 -7 27t-23 7h-34v27q96 5 209 30l-124 -461 q95 75 130 109.5t35 53.5q0 12 -10.5 16.5t-39.5 6.5v25h206z" />
+<glyph unicode="l" horiz-adv-x="278" d="M290 699l-145 -523q-22 -79 -22 -100q0 -15 15 -15q25 0 79 80l22 -14q-52 -80 -87 -108t-82 -28q-30 0 -49 18t-19 45q0 34 34 155l74 259q34 118 34 145q0 30 -42 30q-11 0 -22 -1v27q98 9 210 30z" />
+<glyph unicode="m" horiz-adv-x="778" d="M701 135l22 -13q-38 -71 -75.5 -101t-85.5 -30q-67 0 -67 66q0 43 37 151l44 130q7 23 7 30q0 8 -7 14.5t-16 6.5q-47 0 -112 -116q-27 -48 -42.5 -89t-58.5 -184h-120l65 207q45 143 45 160q0 22 -18 22q-25 0 -65 -47q-43 -51 -75 -126t-72 -216h-121l66 232 q36 125 36 150t-38 25h-18v27q130 10 200 27l-63 -199h1q70 108 104 142q58 58 114 58q32 0 49.5 -18t17.5 -49q0 -37 -26 -105q61 99 102.5 135.5t95.5 36.5q35 0 56 -20t21 -51q0 -43 -23 -109l-45 -128q-21 -60 -21 -77q0 -18 16 -18q22 0 58 58q6 11 12 18z" />
+<glyph unicode="n" horiz-adv-x="556" d="M472 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-68 0 -68 60q0 47 26 125l55 165q7 23 7 28q0 21 -25 21q-13 0 -33 -16.5t-36 -37.5q-47 -62 -79 -135t-66 -201h-121l57 204q45 164 45 179q0 14 -11.5 18.5t-43.5 5.5v27q90 3 199 27l-62 -198h1q51 75 73 103.5 t49 54.5q43 41 100 41q73 0 73 -77q0 -34 -28 -116l-35 -104q-24 -71 -24 -89q0 -17 14 -17q13 0 27 15t44 61z" />
+<glyph unicode="o" d="M280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5 t25 157.5z" />
+<glyph unicode="p" d="M177 347h1q41 64 77.5 89.5t80.5 25.5q53 0 81.5 -32.5t28.5 -88.5q0 -138 -85 -246t-192 -108q-38 0 -68 22l-12 -41q-24 -83 -24 -114q0 -18 13.5 -24.5t51.5 -7.5v-27h-250v27q36 0 50 15t28 71l96 380q22 88 22 94q0 14 -10 18.5t-44 6.5v27q51 6 192 28zM321 336 q0 55 -39 55q-40 0 -87 -71q-13 -19 -20 -37t-24 -76q-38 -128 -38 -149q0 -15 11.5 -25.5t27.5 -10.5q30 0 62 30q46 45 76.5 137t30.5 147z" />
+<glyph unicode="q" d="M471 449l-129 -461q-36 -131 -36 -138q0 -28 49 -28h17v-27h-268v27q45 0 62 13t30 56l61 207q-60 -111 -154 -111q-49 0 -75.5 34t-26.5 96q0 84 54 178q44 77 102.5 122t115.5 45q40 0 57 -22q10 -13 17 -50l15 59h109zM325 371q0 48 -35 48q-27 0 -58 -35.5t-53 -79.5 q-53 -109 -53 -188q0 -57 39 -57q45 0 88 74q27 47 49.5 121t22.5 117z" />
+<glyph unicode="r" horiz-adv-x="389" d="M160 253h1q60 121 95.5 165t75.5 44q26 0 41.5 -18t15.5 -48q0 -31 -16.5 -52t-41.5 -21q-22 0 -37.5 19t-23.5 19q-23 0 -65 -76q-36 -65 -74 -186l-31 -99h-121q102 345 102 382q0 14 -11.5 19.5t-44.5 5.5v27q131 11 200 28z" />
+<glyph unicode="s" horiz-adv-x="389" d="M333 461l-23 -154l-27 2q-12 63 -33 91.5t-55 28.5q-24 0 -38.5 -14.5t-14.5 -38.5q0 -33 57 -99q80 -93 80 -162q0 -56 -43 -92t-105 -36q-35 0 -64 12q-21 8 -30 8q-20 0 -29 -20h-27l22 166l27 -3q17 -133 93 -133q29 0 44.5 14.5t15.5 39.5q0 41 -56 104 q-50 56 -65 87.5t-15 73.5q0 59 36.5 92.5t97.5 33.5q33 0 58 -12q21 -10 37 -10q11 0 16 4t12 17h29z" />
+<glyph unicode="t" horiz-adv-x="278" d="M281 407h-83l-34 -119q-53 -185 -53 -209q0 -18 16 -18q25 0 76 80l23 -15q-49 -76 -86.5 -105.5t-83.5 -29.5q-67 0 -67 65q0 28 25 115l67 236h-52v35q62 21 103 55t81 97h35l-39 -145h72v-42z" />
+<glyph unicode="u" horiz-adv-x="556" d="M471 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206 h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="v" horiz-adv-x="444" d="M15 408v27q101 14 156 27q31 -99 31 -334q74 84 100 123.5t26 65.5q0 13 -20 36q-25 28 -25 53q0 23 17 39.5t40 16.5q27 0 44 -20t17 -47q0 -67 -60 -154q-41 -60 -88 -111.5t-142 -142.5h-26q5 91 5 177q0 175 -25 225q-10 19 -50 19z" />
+<glyph unicode="w" horiz-adv-x="667" d="M387 462l31 -333q120 140 120 187q0 15 -20 38q-22 25 -22 48q0 29 16.5 44.5t40.5 15.5q25 0 43 -18.5t18 -43.5q0 -131 -272 -413h-27l-23 285q-85 -158 -114 -201l-56 -84h-27v46q0 4 0.5 24.5t0.5 37.5q0 94 -11.5 191.5t-26.5 110.5q-11 10 -43 10v27q110 18 156 28 q33 -123 33 -274l156 274h27z" />
+<glyph unicode="x" d="M41 438l165 24q29 -43 47 -138q57 83 89.5 110.5t68.5 27.5q23 0 40.5 -18.5t17.5 -42.5q0 -22 -16.5 -37.5t-39.5 -15.5q-12 0 -29 10t-28 10q-17 0 -42.5 -26t-49.5 -68l32 -157q6 -29 14.5 -41t22.5 -12q13 0 25.5 10.5t41.5 48.5l21 -14q-46 -66 -80.5 -94t-70.5 -28 q-37 0 -58.5 34.5t-38.5 120.5l-24 -39q-44 -72 -69 -94t-62 -22q-28 0 -45.5 16.5t-17.5 42.5q0 24 15.5 40.5t38.5 16.5q16 0 34.5 -11t27.5 -11q14 0 22.5 7.5t24.5 32.5l44 71l-29 152q-7 37 -20 53t-37 16q-16 0 -35 -2v27z" />
+<glyph unicode="y" horiz-adv-x="444" d="M239 110h2q52 99 69.5 141t17.5 66q0 13 -25 34q-31 25 -31 54q0 21 16 39t42 18q25 0 43.5 -19t18.5 -45q0 -76 -75.5 -227t-173.5 -270q-41 -50 -87.5 -78t-87.5 -28q-26 0 -44 17.5t-18 42.5q0 22 15.5 39t34.5 17q25 0 51 -18t43 -18q13 0 32 15t35 37q25 35 25 71 q0 50 -50 288q-21 94 -40 113q-8 8 -14.5 10t-25.5 2v27q86 8 150 24q43 -111 66 -274z" />
+<glyph unicode="z" horiz-adv-x="389" d="M368 439l-281 -335q52 -23 86 -69q6 -8 19 -32.5t24.5 -38t24.5 -13.5q10 0 16 5t6 12q0 6 -10 18t-10 27q0 21 15 37t35 16q21 0 37 -16t16 -37q0 -45 -31 -68t-79 -23q-59 0 -129 50q-46 33 -74 33q-13 0 -32 -14q-12 -10 -19 -14l-25 22l292 354h-136 q-29 0 -45.5 -13.5t-27.5 -47.5l-27 3l44 154h311v-10z" />
+<glyph unicode="{" horiz-adv-x="348" d="M436 686l-3 -12q-61 -11 -92 -39t-46 -85l-45 -171q-16 -63 -47 -89.5t-105 -40.5q57 -15 75 -30t18 -46q0 -38 -29 -130q-30 -99 -30 -140q0 -34 18.5 -52t62.5 -26l-3 -12q-104 2 -143 21.5t-39 69.5q0 56 35 159q26 80 26 116q0 26 -19.5 42t-65.5 28q68 14 96 37.5 t42 78.5l46 179q21 81 74.5 111.5t173.5 30.5z" />
+<glyph unicode="|" horiz-adv-x="220" d="M154 -18h-88v703h88v-703z" />
+<glyph unicode="}" horiz-adv-x="348" d="M94 674l3 12q70 -1 104.5 -8t53.5 -24q24 -21 24 -56q0 -57 -35 -162q-26 -80 -26 -116q0 -26 19.5 -42t65.5 -28q-67 -15 -95.5 -38.5t-42.5 -77.5l-46 -179q-21 -82 -74 -112t-174 -30l3 12q61 11 92 39t46 85l45 171q16 63 47 89.5t105 40.5q-57 15 -75 30t-18 46 q0 38 28 130q31 107 31 141q0 33 -19 51t-62 26z" />
+<glyph unicode="~" horiz-adv-x="570" d="M461 308l55 -48q-34 -48 -61 -66.5t-62 -18.5q-48 0 -105 33q-62 35 -112 35q-22 0 -36.5 -9t-32.5 -33l-53 46q48 84 121 84q27 0 53 -8t83 -33q60 -27 82 -27q33 0 68 45z" />
+<glyph unicode="&#xa1;" horiz-adv-x="389" d="M320 423q0 -32 -21 -53.5t-52 -21.5q-29 0 -51 22.5t-22 52.5t21.5 50.5t52.5 20.5t51.5 -20t20.5 -51zM193 275l29 -8q-45 -230 -53 -354q-2 -51 -12 -72q-22 -46 -69 -46q-31 0 -50 20t-19 54q0 19 5.5 35t25.5 53q78 149 143 318z" />
+<glyph unicode="&#xa2;" d="M431 576l-45 -127q53 -29 53 -79q0 -29 -18.5 -48.5t-46.5 -19.5q-21 0 -35 11l-92 -261q59 3 118 89l27 -18q-47 -68 -82 -95.5t-85 -37.5l-47 -133h-34l46 130q-71 5 -109.5 44.5t-38.5 106.5q0 121 89.5 222.5t195.5 101.5q10 0 28 -3l41 117h35zM339 413v2 q-2 14 -22 14q-45 0 -86 -73q-27 -48 -44.5 -107t-17.5 -102q0 -64 45 -90z" />
+<glyph unicode="&#xa3;" d="M45 370h105q19 93 40 144.5t58 92.5q65 76 153 76q47 0 78 -26t31 -65q0 -29 -17.5 -48.5t-43.5 -19.5q-23 0 -38 14.5t-15 36.5q0 10 4 34q3 11 3 19q0 9 -7 15t-17 6q-45 0 -60 -77l-39 -202h114l-10 -60h-115q-24 -107 -64 -169l-11 -17q82 -32 125 -32q36 0 54.5 13 t35.5 50h25q-15 -75 -45 -114q-42 -53 -106 -53q-58 0 -127 61q-38 -60 -98 -60q-40 0 -65 24t-25 62q0 39 26.5 63t69.5 24q28 0 61 -14q4 36 19 162h-109zM113 90q-33 30 -64 30q-23 0 -37 -13.5t-14 -36.5t15.5 -37t40.5 -14q43 0 59 71z" />
+<glyph unicode="&#xa4;" d="M526 48l-58 -58l-96 98q-60 -37 -122 -37t-122 37l-96 -98l-58 58l98 98q-37 56 -37 120q0 65 37 122l-98 98l58 56l96 -96q56 35 122 35t122 -35l96 96l58 -56l-98 -98q37 -59 37 -122q0 -69 -37 -120zM377 264q0 57 -37 96t-90 39t-90 -38.5t-37 -94.5t37 -94.5 t90 -38.5q52 0 89.5 39t37.5 92z" />
+<glyph unicode="&#xa5;" d="M628 669v-25q-29 -6 -49 -20.5t-44 -48.5l-166 -233h135l-13 -50h-150l-21 -78h152l-14 -50h-152l-3 -11q-16 -59 -16 -85q0 -25 15.5 -33t65.5 -10v-25h-322v25q57 4 77 17t32 55l19 67h-141l14 50h141l22 78h-142l14 50h125l-79 239q-12 38 -25.5 48t-56.5 15v25h280 v-25q-43 -2 -59 -8.5t-16 -23.5q0 -14 6 -32l80 -236l135 194q26 37 26 60q0 26 -14 35t-56 11v25h200z" />
+<glyph unicode="&#xa6;" horiz-adv-x="220" d="M154 426h-88v259h88v-259zM154 -18h-88v259h88v-259z" />
+<glyph unicode="&#xa7;" d="M221 419l2 3q-55 61 -55 129q0 59 43 96.5t112 37.5q59 0 97.5 -27.5t38.5 -70.5q0 -26 -16.5 -44t-41.5 -18q-23 0 -39 16.5t-16 38.5q0 17 9 27t18 15.5t9 12.5q0 11 -18 19.5t-41 8.5q-38 0 -61.5 -20.5t-23.5 -52.5q0 -41 69 -122l69 -81q59 -68 59 -144 q0 -58 -33 -90t-84 -32q-14 0 -30 4l-2 -4q59 -74 59 -130t-47.5 -95t-116.5 -39q-61 0 -103 30.5t-42 74.5q0 26 16.5 43.5t41.5 17.5t40.5 -14.5t15.5 -36.5q0 -16 -17.5 -33t-17.5 -30q0 -11 20.5 -20t46.5 -9q38 0 62 21t24 55q0 24 -14.5 47t-69.5 90l-66 80 q-50 61 -50 126q0 61 29 93.5t75 32.5q23 0 49 -6zM364 206q0 50 -62.5 122t-106.5 72q-24 0 -40 -16.5t-16 -41.5q0 -36 29 -76q42 -59 79 -91q31 -27 58 -27q24 0 41.5 17.5t17.5 40.5z" />
+<glyph unicode="&#xa8;" horiz-adv-x="333" d="M185 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM397 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#xa9;" horiz-adv-x="747" d="M544 250l-17 -72q-2 -11 -12 -14q-5 -3 -52 -15q-31 -9 -66 -9q-101 0 -159 52t-58 143q0 92 61.5 147.5t163.5 55.5q50 0 100 -18q22 -9 22 -21v-71h-17q-19 90 -110 90q-64 0 -99.5 -46t-35.5 -130q0 -86 36 -132.5t102 -46.5q43 0 72 20.5t51 66.5h18zM718 334 q0 -150 -100 -251t-249 -101q-140 0 -239.5 102.5t-99.5 247.5q0 148 100 250.5t244 102.5t244 -102t100 -249zM657 334q0 125 -83.5 215t-199.5 90t-199.5 -90t-83.5 -216q0 -124 83 -214.5t196 -90.5q120 0 203.5 89t83.5 217z" />
+<glyph unicode="&#xaa;" horiz-adv-x="266" d="M330 680l-46 -140q-22 -66 -22 -89q0 -9 5 -9q11 0 41 36l5 6l13 -9q-54 -76 -97 -76q-18 0 -31 11.5t-13 26.5q0 14 11 51q-28 -49 -52.5 -68.5t-57.5 -19.5q-31 0 -50.5 21t-19.5 55q0 72 59 140.5t121 68.5q37 0 47 -45l11 36zM218 630q0 12 -5.5 20t-14.5 8 q-26 1 -65 -67.5t-39 -117.5q0 -11 7 -19.5t17 -8.5q31 0 64 62q14 28 25 65t11 58z" />
+<glyph unicode="&#xab;" d="M197 226l170 124q30 21 47 37q28 28 41 28q5 0 9 -3.5t4 -8.5q0 -30 -101 -134q-6 -6 -20 -22t-25 -27l40 -83q33 -69 33 -90q0 -15 -15 -15q-6 0 -15 10q-30 34 -168 175v9zM12 226l170 124q30 21 47 37q28 28 41 28q5 0 9 -3.5t4 -8.5q0 -30 -101 -134q-32 -34 -45 -49 l40 -83q33 -69 33 -90q0 -15 -15 -15q-6 0 -15 10q-30 34 -168 175v9z" />
+<glyph unicode="&#xac;" horiz-adv-x="606" d="M555 108h-88v203h-416v88h504v-291z" />
+<glyph unicode="&#xad;" horiz-adv-x="333" d="M271 282l-23 -116h-246l24 116h245z" />
+<glyph unicode="&#xae;" horiz-adv-x="747" d="M562 151h-70q-14 0 -28.5 17.5t-39.5 63.5q-23 41 -52 85h-44v-101q0 -32 6 -38.5t42 -10.5v-16h-166v16q35 4 41 10.5t6 38.5v247q0 32 -6 38t-41 10v16h183q54 0 85.5 -25.5t31.5 -69.5q0 -74 -81 -104l59 -82q42 -60 74 -84v-11zM328 337h41q68 0 68 91q0 78 -69 78 h-40v-169zM718 334q0 -150 -100 -251t-249 -101q-140 0 -239.5 102.5t-99.5 247.5q0 148 100 250.5t244 102.5t244 -102t100 -249zM657 334q0 125 -83.5 215t-199.5 90t-199.5 -90t-83.5 -216q0 -124 83 -214.5t196 -90.5q120 0 203.5 89t83.5 217z" />
+<glyph unicode="&#xaf;" horiz-adv-x="333" d="M393 623l-16 -70h-326l17 70h325z" />
+<glyph unicode="&#xb0;" horiz-adv-x="400" d="M369 545q0 -59 -42 -101t-101 -42t-101 42t-42 101t42 101t101 42t101 -42t42 -101zM314 545q0 37 -25.5 62.5t-62.5 25.5t-62.5 -25.5t-25.5 -62.5t25.5 -62.5t62.5 -25.5t62.5 25.5t25.5 62.5z" />
+<glyph unicode="&#xb1;" horiz-adv-x="570" d="M537 0h-504v88h504v-88zM537 271h-208v-143h-88v143h-208v88h208v209h88v-209h208v-88z" />
+<glyph unicode="&#xb2;" horiz-adv-x="300" d="M79 574l-18 11q53 98 144 98q46 0 77 -28.5t31 -70.5q0 -36 -21 -67.5t-71 -72.5l-125 -101h89q37 0 54 8.5t36 36.5h16l-51 -114h-238v16q119 113 148 145q70 77 70 121q0 31 -15.5 48.5t-43.5 17.5q-39 0 -82 -48z" />
+<glyph unicode="&#xb3;" horiz-adv-x="300" d="M103 590l-14 13q57 80 133 80q42 0 70.5 -23.5t28.5 -57.5q0 -28 -14.5 -45t-57.5 -42l-7 -4q29 -20 40.5 -39.5t11.5 -48.5q0 -65 -56 -111.5t-135 -46.5q-86 0 -86 50q0 18 10.5 29.5t26.5 11.5q24 0 43 -28q16 -21 22 -25.5t20 -4.5q30 0 50.5 26.5t20.5 65.5 q0 87 -100 91l2 14q121 22 121 85q0 24 -15 38t-40 14q-38 0 -75 -42z" />
+<glyph unicode="&#xb4;" horiz-adv-x="333" d="M139 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49z" />
+<glyph unicode="&#xb5;" horiz-adv-x="576" d="M516 449l-104 -336q-5 -17 -5 -27q0 -14 12 -14q22 0 63 62l22 -16q-54 -77 -88.5 -104t-77.5 -27q-28 0 -45.5 17.5t-17.5 45.5q0 22 11 68q-40 -67 -68.5 -92.5t-63.5 -25.5q-46 0 -62 24q-23 -71 -23 -133q0 -47 -21 -72.5t-58 -25.5q-50 0 -50 66q0 27 29.5 96 t44.5 119l111 375h135l-93 -312q-7 -25 -7 -42q0 -25 19 -25q32 0 79 66.5t72 148.5l51 164h135z" />
+<glyph unicode="&#xb6;" horiz-adv-x="617" d="M679 669l-6 -25q-58 0 -72.5 -11t-28.5 -65l-166 -636q-11 -47 -11 -60q0 -34 45 -38l23 -2l-7 -25h-171l217 837h-55l-217 -837h-170l7 25q64 5 78 18q9 9 28 82l85 326q-69 0 -107 33t-38 100q0 57 22 117t54 95q61 66 195 66h295zM264 283l94 361q-49 -12 -74 -29.5 t-47 -55.5q-45 -77 -45 -165q0 -40 19 -70t53 -41z" />
+<glyph unicode="&#xb7;" horiz-adv-x="250" d="M199 331q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52z" />
+<glyph unicode="&#xb8;" horiz-adv-x="333" d="M85 5l-45 -67q15 3 26 3q39 0 64.5 -20.5t25.5 -51.5q0 -37 -35.5 -62t-88.5 -25q-51 0 -112 25l22 33q38 -17 67 -17q26 0 41 11t15 30q0 36 -47 36q-14 0 -30 -4l-13 12l66 97h44z" />
+<glyph unicode="&#xb9;" horiz-adv-x="300" d="M301 683l-100 -330q-6 -18 -6 -34t11 -21t48 -5v-19h-224v19q42 0 58.5 15t29.5 65q2 8 13 41l26 81l25 83q10 34 9 35q-5 21 -26 21q-4 0 -32 -2l-11 -1l2 21q103 16 177 31z" />
+<glyph unicode="&#xba;" horiz-adv-x="300" d="M347 587q0 -74 -57.5 -130.5t-127.5 -56.5q-46 0 -76 25t-30 64q0 75 57.5 135.5t129.5 60.5q47 0 75.5 -27.5t28.5 -70.5zM266 627q0 38 -25 38q-31 1 -60 -48q-17 -30 -30.5 -79.5t-13.5 -82.5q0 -35 28 -35q35 0 65 65q36 78 36 142z" />
+<glyph unicode="&#xbb;" d="M283 221l-170 -124q-31 -23 -47 -38q-28 -27 -41 -27t-13 12q0 30 101 134l45 49l-40 83q-33 67 -33 90q0 15 15 15q6 0 15 -10q47 -53 168 -175v-9zM468 221l-170 -124q-31 -23 -47 -38q-29 -27 -41 -27q-13 0 -13 12q0 30 101 134l45 49l-40 83q-33 67 -33 90 q0 15 15 15q6 0 15 -10q47 -53 168 -175v-9z" />
+<glyph unicode="&#xbc;" horiz-adv-x="750" d="M721 410l-78 -261h45l-17 -61h-44l-28 -88h-86l27 88h-159l16 67l278 255h46zM609 319l-184 -170h132zM629 683l-435 -697h-58l435 697h58zM278 683l-100 -330q-6 -18 -6 -34t11 -21t48 -5v-19h-224v19q42 0 58 15t30 65q2 8 13 41q60 184 60 199q0 8 -8 14.5t-18 6.5 q-4 0 -32 -2l-11 -1l2 21q103 16 177 31z" />
+<glyph unicode="&#xbd;" horiz-adv-x="750" d="M489 300l-18 11q53 98 144 98q46 0 77 -28.5t31 -70.5q0 -36 -21 -67.5t-71 -72.5l-125 -101h89q37 0 54 8.5t36 36.5h16l-51 -114h-238v16q119 113 148 145q70 77 70 121q0 31 -15.5 48.5t-43.5 17.5q-39 0 -82 -48zM614 683l-435 -697h-58l435 697h58zM262 683 l-100 -330q-6 -18 -6 -34t11 -21t48 -5v-19h-224v19q42 0 58 15t30 65q2 8 13 41q60 184 60 199q0 8 -8 14.5t-18 6.5q-4 0 -32 -2l-11 -1l2 21q103 16 177 31z" />
+<glyph unicode="&#xbe;" horiz-adv-x="750" d="M726 410l-78 -261h45l-17 -61h-44l-28 -88h-86l27 88h-159l16 67l278 255h46zM614 319l-184 -170h132zM634 683l-435 -697h-58l435 697h58zM93 590l-14 13q57 80 133 80q42 0 70.5 -23.5t28.5 -57.5q0 -28 -14.5 -45t-57.5 -42l-7 -4q29 -20 40.5 -39.5t11.5 -48.5 q0 -65 -56 -111.5t-135 -46.5q-86 0 -86 50q0 18 10.5 29.5t26.5 11.5q24 0 43 -28q16 -21 22 -25.5t20 -4.5q30 0 50.5 26.5t20.5 64.5q0 88 -100 92l2 14q121 22 121 85q0 24 -15 38t-40 14q-38 0 -75 -42z" />
+<glyph unicode="&#xbf;" d="M421 418q0 -32 -21.5 -53t-53.5 -21q-30 0 -51.5 22t-21.5 52q0 31 21.5 52.5t53.5 21.5q31 0 52 -21t21 -53zM262 105l-41 -51q-64 -78 -64 -148q0 -37 18.5 -58.5t50.5 -21.5q24 0 43 12t19 26q0 8 -11 22q-18 24 -18 45q0 25 17.5 42.5t43.5 17.5t43.5 -19.5 t17.5 -47.5q0 -56 -49.5 -92.5t-125.5 -36.5q-79 0 -127.5 39.5t-48.5 104.5q0 47 29.5 87.5t96.5 83.5l66 43q29 19 45 42.5t37 75.5l29 -7q-7 -78 -71 -159z" />
+<glyph unicode="&#xc0;" horiz-adv-x="667" d="M516 766h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33zM593 0h-303v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5t61 -19.5v-25zM346 248 l-37 243l-148 -243h185z" />
+<glyph unicode="&#xc1;" horiz-adv-x="667" d="M326 766l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM593 0h-303v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5t61 -19.5 v-25zM346 248l-37 243l-148 -243h185z" />
+<glyph unicode="&#xc2;" horiz-adv-x="667" d="M587 766h-51l-88 95l-131 -95h-57l160 174h81zM593 0h-303v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5t61 -19.5v-25zM346 248l-37 243l-148 -243h185z" />
+<glyph unicode="&#xc3;" horiz-adv-x="667" d="M571 905h41q-16 -63 -44 -91t-73 -28q-25 0 -57 13l-59 23q-21 8 -38 8q-31 0 -48 -43h-40q10 54 41.5 86t74.5 32q38 0 97 -26q39 -16 54 -16q17 0 28.5 9t22.5 33zM593 0h-303v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195 l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5t61 -19.5v-25zM346 248l-37 243l-148 -243h185z" />
+<glyph unicode="&#xc4;" horiz-adv-x="667" d="M387 839q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM599 839q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM593 0h-303v25q77 6 77 49 q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5t61 -19.5v-25zM346 248l-37 243l-148 -243h185z" />
+<glyph unicode="&#xc5;" horiz-adv-x="667" d="M546 898q0 -44 -31.5 -75.5t-75.5 -31.5q-48 0 -77 30t-29 78q0 44 31.5 74.5t75.5 30.5q47 0 76.5 -30.5t29.5 -75.5zM498 896q0 25 -17.5 42.5t-42.5 17.5q-23 0 -40 -17.5t-17 -41.5t17 -41t40 -17q25 0 42.5 17t17.5 40zM593 0h-303v25q77 6 77 49q0 3 -2 15l-12 119 h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5t61 -19.5v-25zM346 248l-37 243l-148 -243h185z" />
+<glyph unicode="&#xc6;" horiz-adv-x="944" d="M918 669l-45 -190l-24 5l-2 40q-6 113 -162 113q-32 0 -43 -6t-16 -26l-65 -235h19q76 0 110.5 20.5t64.5 85.5l26 -4l-73 -273l-25 5q3 24 3 46q0 50 -24 66.5t-109 21.5l-63 -241q-5 -20 -5 -28q0 -37 68 -37q59 0 97.5 10.5t72.5 36.5q36 27 101 120l26 -3l-59 -196 h-527v25q38 6 53 22.5t28 58.5l43 149h-192l-114 -157q-15 -20 -15 -39q0 -16 14 -23.5t50 -10.5v-25h-195v25q19 2 30 9q9 3 59 68l364 472q20 27 20 44q0 14 -15.5 19.5t-64.5 8.5v23h589zM490 627h-12l-253 -333h173z" />
+<glyph unicode="&#xc7;" horiz-adv-x="667" d="M677 685l-51 -234l-32 6q3 19 3 35q0 73 -35 115.5t-96 42.5q-93 0 -168 -100q-51 -66 -81.5 -156.5t-30.5 -184.5q0 -81 41.5 -127.5t108.5 -46.5q48 0 90 18q30 13 52.5 33t66.5 68l31 -22q-42 -58 -78 -85q-86 -65 -194 -65q-42 0 -64 4l-33 -48q15 3 26 3 q39 0 64.5 -20.5t25.5 -51.5q0 -37 -35.5 -62t-88.5 -25q-52 0 -112 25l22 33q37 -17 67 -17q26 0 41 11t15 30q0 36 -47 36q-14 0 -30 -4l-13 12l59 88q-81 27 -125 91t-44 154q0 93 35 177.5t96 146.5q118 120 277 120q64 0 131 -21q24 -8 38 -8q20 0 38 29h30z" />
+<glyph unicode="&#xc8;" horiz-adv-x="667" d="M531 766h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33zM653 669l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5t-114 19.5 l-63 -234q-8 -32 -8 -38q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5l-60 -194h-553v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="&#xc9;" horiz-adv-x="667" d="M306 766l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM653 669l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5 t-114 19.5l-63 -234q-8 -32 -8 -38q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5l-60 -194h-553v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="&#xca;" horiz-adv-x="667" d="M586 766h-51l-88 95l-131 -95h-57l160 174h81zM653 669l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5t-114 19.5l-63 -234q-8 -32 -8 -38 q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5l-60 -194h-553v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="&#xcb;" horiz-adv-x="667" d="M389 839q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM601 839q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM653 669l-43 -190l-27 5 q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5t-114 19.5l-63 -234q-8 -32 -8 -38q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5l-60 -194h-553v25q39 6 54 20.5 t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="&#xcc;" horiz-adv-x="389" d="M404 766h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33zM406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z" />
+<glyph unicode="&#xcd;" horiz-adv-x="389" d="M200 766l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z " />
+<glyph unicode="&#xce;" horiz-adv-x="389" d="M469 766h-51l-88 95l-131 -95h-57l160 174h81zM406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z" />
+<glyph unicode="&#xcf;" horiz-adv-x="389" d="M406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298zM480 839q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5 q27 0 46.5 -19.5t19.5 -46.5zM268 839q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#xd0;" horiz-adv-x="722" d="M109 669h290q142 0 221.5 -72.5t79.5 -200.5q0 -171 -126.5 -283.5t-318.5 -112.5h-286v25q36 5 53 19.5t27 52.5l63 232h-102l12 44h102l46 170q12 44 12 59q0 17 -10 25t-32 12l-31 5v25zM260 329l-56 -207q-12 -46 -12 -54q0 -34 54 -34q142 0 223 118q39 58 61.5 140 t22.5 165q0 181 -165 181q-46 0 -55 -38l-61 -227h122l-12 -44h-122z" />
+<glyph unicode="&#xd1;" horiz-adv-x="722" d="M619 905h41q-16 -63 -44 -91t-73 -28q-25 0 -57 13l-59 23q-21 8 -38 8q-31 0 -48 -43h-40q10 54 41.5 86t74.5 32q38 0 97 -26q39 -16 54 -16q17 0 28.5 9t22.5 33zM748 669v-25q-42 -8 -58.5 -32.5t-43.5 -120.5l-143 -506h-28l-257 547l-99 -354q-19 -66 -19 -94 q0 -29 17.5 -42t61.5 -17v-25h-206v25q42 8 56 30t45 125l120 407q-15 34 -28.5 43.5t-53.5 13.5v25h193l216 -467l81 289q19 71 19 94q0 59 -81 59v25h208z" />
+<glyph unicode="&#xd2;" horiz-adv-x="722" d="M580 766h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33zM691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528q0 60 -27 91.5 t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#xd3;" horiz-adv-x="722" d="M355 766l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528 q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#xd4;" horiz-adv-x="722" d="M638 766h-51l-88 95l-131 -95h-57l160 174h81zM691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528q0 60 -27 91.5t-74 31.5q-91 0 -162 -120 q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#xd5;" horiz-adv-x="722" d="M620 905h41q-16 -63 -44 -91t-73 -28q-25 0 -57 13l-59 23q-21 8 -38 8q-31 0 -48 -43h-40q10 54 41.5 86t74.5 32q38 0 97 -26q39 -16 54 -16q17 0 28.5 9t22.5 33zM691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5 q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#xd6;" horiz-adv-x="722" d="M439 839q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM651 839q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM691 444q0 -95 -49.5 -194.5 t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86 q49 72 83 191t34 207z" />
+<glyph unicode="&#xd7;" horiz-adv-x="570" d="M522 78l-62 -62l-175 176l-175 -176l-62 62l175 175l-175 175l62 62l175 -176l175 176l62 -62l-176 -175z" />
+<glyph unicode="&#xd8;" horiz-adv-x="722" d="M633 764l-63 -108q55 -26 88 -82t33 -121q0 -111 -48.5 -207.5t-134.5 -168.5q-114 -95 -240 -95q-45 0 -85 13l-70 -120h-48l79 136q-117 63 -117 201q0 122 58.5 231.5t156.5 175.5t207 66q40 0 82 -13l53 92h49zM182 77l324 553q-27 21 -63 21q-92 0 -165 -130 q-43 -77 -75 -190t-32 -190q0 -33 11 -64zM533 593l-325 -555q28 -22 67 -22q46 0 91.5 38t74.5 97q41 85 73.5 194.5t32.5 181.5q0 30 -14 66z" />
+<glyph unicode="&#xd9;" horiz-adv-x="722" d="M578 766h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33zM744 669v-25q-32 -6 -44.5 -14t-25.5 -36.5t-32 -96.5l-65 -234q-25 -89 -52.5 -145t-68.5 -89q-59 -47 -166 -47q-101 0 -162 42.5t-61 120.5q0 47 37 189l51 193q15 55 15 78q0 17 -9 25.5 t-32 10.5l-32 3v25h311v-25q-46 -2 -64 -16.5t-30 -59.5l-81 -294q-28 -101 -28 -135q0 -101 122 -101q78 0 123 47q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25h207z" />
+<glyph unicode="&#xda;" horiz-adv-x="722" d="M354 766l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM744 669v-25q-32 -6 -44.5 -14t-25.5 -36.5t-32 -96.5l-65 -234q-25 -89 -52.5 -145t-68.5 -89q-59 -47 -166 -47q-101 0 -162 42.5t-61 120.5q0 47 37 189l51 193q15 55 15 78 q0 17 -9 25.5t-32 10.5l-32 3v25h311v-25q-46 -2 -64 -16.5t-30 -59.5l-81 -294q-28 -101 -28 -135q0 -101 122 -101q78 0 123 47q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25h207z" />
+<glyph unicode="&#xdb;" horiz-adv-x="722" d="M637 766h-51l-88 95l-131 -95h-57l160 174h81zM744 669v-25q-32 -6 -44.5 -14t-25.5 -36.5t-32 -96.5l-65 -234q-25 -89 -52.5 -145t-68.5 -89q-59 -47 -166 -47q-101 0 -162 42.5t-61 120.5q0 47 37 189l51 193q15 55 15 78q0 17 -9 25.5t-32 10.5l-32 3v25h311v-25 q-46 -2 -64 -16.5t-30 -59.5l-81 -294q-28 -101 -28 -135q0 -101 122 -101q78 0 123 47q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25h207z" />
+<glyph unicode="&#xdc;" horiz-adv-x="722" d="M744 669v-25q-32 -6 -44.5 -14t-25.5 -36.5t-32 -96.5l-65 -234q-25 -89 -52.5 -145t-68.5 -89q-59 -47 -166 -47q-101 0 -162 42.5t-61 120.5q0 47 37 189l51 193q15 55 15 78q0 17 -9 25.5t-32 10.5l-32 3v25h311v-25q-46 -2 -64 -16.5t-30 -59.5l-81 -294 q-28 -101 -28 -135q0 -101 122 -101q78 0 123 47q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25h207zM648 839q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM436 839q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5 t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#xdd;" horiz-adv-x="611" d="M357 766l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM659 669v-25q-27 -4 -46.5 -20t-45.5 -52l-189 -264l-52 -191q-10 -40 -10 -51q0 -22 17 -31.5t62 -9.5v-25h-323v25q52 5 72 18.5t32 59.5l57 208l-87 270q-12 35 -23.5 45 t-51.5 18v25h285v-25q-42 -2 -55.5 -9.5t-13.5 -29.5q0 -19 29 -110l46 -143l128 183q28 40 28 67q0 23 -13 32t-53 10v25h207z" />
+<glyph unicode="&#xde;" horiz-adv-x="611" d="M312 534h44q217 0 217 -148q0 -90 -64 -143q-75 -61 -209 -61q-37 0 -81 5l-16 -61q-8 -31 -8 -62q0 -20 14.5 -28.5t56.5 -10.5v-25h-293v25q38 6 54 22t27 55l120 436q12 46 12 69q0 15 -10 22.5t-33 10.5l-31 4v25h295l-1 -25q-40 -6 -53 -17.5t-28 -54.5zM292 451 l-63 -232q34 -2 42 -2q82 0 117 52q17 26 28 67t11 75q0 43 -22 67t-62 24q-25 0 -34 -10.5t-17 -40.5z" />
+<glyph unicode="&#xdf;" d="M-16 -20l92 423q66 302 251 302q64 0 105 -34.5t41 -91.5q0 -45 -16 -76t-53 -59q-9 -7 -22.5 -13.5t-21.5 -9.5t-34 -11l-35 -11v-1q68 -11 106 -46.5t38 -96.5q0 -102 -73 -190q-60 -72 -149 -72q-39 0 -71 22l20 35l4 -5q14 -18 45 -18q33 0 61 60q18 39 30.5 103 t12.5 114q0 47 -24 65q-14 10 -52 15l7 37h17q19 0 38.5 13.5t31.5 39.5q29 63 29 140q0 61 -46 61q-34 0 -58 -39t-44 -127l-89 -398q-38 -169 -92.5 -240t-135.5 -71q-45 0 -71 21t-26 56q0 24 14.5 40t37.5 16q22 0 34.5 -12.5t12.5 -33.5q0 -14 -8.5 -24t-8.5 -17 q0 -15 16 -15q35 0 49 34q20 39 37 115z" />
+<glyph unicode="&#xe0;" d="M435 127l21 -15q-78 -126 -156 -126q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17t24.5 -55h1l17 59l111 7l-75 -251q-30 -99 -30 -133q0 -15 12 -15t27 14.5t46 55.5zM303 373 q0 20 -10.5 33.5t-26.5 13.5q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57q45 0 86 75q29 52 50.5 123.5t21.5 116.5zM416 516h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33z" />
+<glyph unicode="&#xe1;" d="M192 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM435 127l21 -15q-78 -126 -156 -126q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17 t24.5 -55h1l17 59l111 7l-75 -251q-30 -99 -30 -133q0 -15 12 -15t27 14.5t46 55.5zM303 373q0 20 -10.5 33.5t-26.5 13.5q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57q45 0 86 75q29 52 50.5 123.5t21.5 116.5z" />
+<glyph unicode="&#xe2;" d="M475 516h-51l-88 95l-131 -95h-57l160 174h81zM435 127l21 -15q-78 -126 -156 -126q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17t24.5 -55h1l17 59l111 7l-75 -251 q-30 -99 -30 -133q0 -15 12 -15t27 14.5t46 55.5zM303 373q0 20 -10.5 33.5t-26.5 13.5q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57q45 0 86 75q29 52 50.5 123.5t21.5 116.5z" />
+<glyph unicode="&#xe3;" d="M456 655h41q-16 -63 -44 -91t-73 -28q-25 0 -57 13l-59 23q-21 8 -38 8q-31 0 -48 -43h-40q10 54 41.5 86t74.5 32q38 0 97 -26q39 -16 54 -16q17 0 28.5 9t22.5 33zM435 127l21 -15q-78 -126 -156 -126q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5 t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17t24.5 -55h1l17 59l111 7l-75 -251q-30 -99 -30 -133q0 -15 12 -15t27 14.5t46 55.5zM303 373q0 20 -10.5 33.5t-26.5 13.5q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57 q45 0 86 75q29 52 50.5 123.5t21.5 116.5z" />
+<glyph unicode="&#xe4;" d="M273 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM485 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM435 127l21 -15 q-78 -126 -156 -126q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17t24.5 -55h1l17 59l111 7l-75 -251q-30 -99 -30 -133q0 -15 12 -15t27 14.5t46 55.5zM303 373q0 20 -10.5 33.5 t-26.5 13.5q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57q45 0 86 75q29 52 50.5 123.5t21.5 116.5z" />
+<glyph unicode="&#xe5;" d="M426 650q0 -44 -31.5 -75.5t-75.5 -31.5q-48 0 -77 30t-29 78q0 44 31.5 74.5t75.5 30.5q47 0 76.5 -30.5t29.5 -75.5zM378 648q0 25 -17.5 42.5t-42.5 17.5q-23 0 -40 -17.5t-17 -41.5t17 -41t40 -17q25 0 42.5 17t17.5 40zM435 127l21 -15q-78 -126 -156 -126 q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17t24.5 -55h1l17 59l111 7l-75 -251q-30 -99 -30 -133q0 -15 12 -15t27 14.5t46 55.5zM303 373q0 20 -10.5 33.5t-26.5 13.5 q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57q45 0 86 75q29 52 50.5 123.5t21.5 116.5z" />
+<glyph unicode="&#xe6;" horiz-adv-x="722" d="M473 459l-20 -65q28 36 55.5 50.5t64.5 14.5q47 0 73.5 -23t26.5 -64q0 -64 -61.5 -116t-168.5 -69l-37 -6q-5 -25 -5 -46q0 -40 17.5 -62.5t48.5 -22.5q72 0 124 90l28 -17q-66 -136 -194 -136t-143 131q-42 -70 -82.5 -100t-90.5 -30q-52 0 -83 30t-31 88 q0 66 29.5 135t77.5 124q84 97 168 97q33 0 51 -14.5t31 -51.5l18 58zM418 231l-5 -17q65 8 117.5 60.5t52.5 113.5q0 41 -35 41q-72 0 -130 -198zM333 363q0 25 -13.5 40.5t-34.5 15.5q-43 0 -83 -58t-60.5 -125.5t-20.5 -111.5q0 -66 48 -66q47 0 93 79q30 50 50.5 117 t20.5 109z" />
+<glyph unicode="&#xe7;" horiz-adv-x="444" d="M31 -92l60 88q-96 29 -96 142q0 63 27.5 125t73.5 110q39 41 88.5 65t94.5 24q47 0 80 -25.5t33 -65.5q0 -31 -17 -50.5t-45 -19.5q-25 0 -41.5 15t-16.5 38q0 13 10.5 30t10.5 28q0 17 -22 17q-53 0 -96 -87q-24 -48 -38 -108t-14 -94q0 -40 20 -64.5t53 -24.5 q32 0 59 20t63 70l28 -18q-57 -87 -103 -113q-40 -23 -95 -23q-11 0 -18 1l-34 -50q15 3 26 3q39 0 64.5 -20.5t25.5 -51.5q0 -37 -35.5 -62t-88.5 -25q-51 0 -112 25l22 33q37 -17 67 -17q26 0 41 11t15 30q0 36 -47 36q-14 0 -30 -4z" />
+<glyph unicode="&#xe8;" horiz-adv-x="444" d="M317 143l29 -17q-78 -139 -195 -139q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122q-32 -27 -73.5 -42.5t-114.5 -28.5q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20t60.5 72zM306 390q0 39 -31 39q-71 0 -127 -215 q68 15 113 64.5t45 111.5zM388 516h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33z" />
+<glyph unicode="&#xe9;" horiz-adv-x="444" d="M179 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM317 143l29 -17q-78 -139 -195 -139q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122q-32 -27 -73.5 -42.5t-114.5 -28.5 q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20t60.5 72zM306 390q0 39 -31 39q-71 0 -127 -215q68 15 113 64.5t45 111.5z" />
+<glyph unicode="&#xea;" horiz-adv-x="444" d="M462 516h-51l-88 95l-131 -95h-57l160 174h81zM317 143l29 -17q-78 -139 -195 -139q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122q-32 -27 -73.5 -42.5t-114.5 -28.5q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20 t60.5 72zM306 390q0 39 -31 39q-71 0 -127 -215q68 15 113 64.5t45 111.5z" />
+<glyph unicode="&#xeb;" horiz-adv-x="444" d="M317 143l29 -17q-78 -139 -195 -139q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122q-32 -27 -73.5 -42.5t-114.5 -28.5q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20t60.5 72zM306 390q0 39 -31 39q-71 0 -127 -215 q68 15 113 64.5t45 111.5zM470 589q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM258 589q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#xec;" horiz-adv-x="278" d="M216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61zM294 516h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33z" />
+<glyph unicode="&#xed;" horiz-adv-x="278" d="M216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61zM70 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49z" />
+<glyph unicode="&#xee;" horiz-adv-x="278" d="M353 516h-51l-88 95l-131 -95h-57l160 174h81zM216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61z" />
+<glyph unicode="&#xef;" horiz-adv-x="278" d="M216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61zM362 589q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5 q27 0 46.5 -19.5t19.5 -46.5zM150 589q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#xf0;" d="M454 664l-107 -56q51 -56 72.5 -108t21.5 -120q0 -160 -81.5 -276.5t-204.5 -116.5q-70 0 -114 41.5t-44 105.5q0 130 85 229t190 99q47 0 71 -42l2 4q-6 78 -62 150l-119 -62l-33 31l122 64q-57 55 -117 65l45 27q71 -10 132 -60l107 57zM322 375q0 27 -12.5 42.5 t-33.5 15.5q-41 0 -79.5 -65t-59.5 -145t-21 -137q0 -70 49 -70q60 0 109 129q20 55 34 121t14 109z" />
+<glyph unicode="&#xf1;" horiz-adv-x="556" d="M466 655h41q-16 -63 -44 -91t-73 -28q-25 0 -57 13l-59 23q-21 8 -38 8q-31 0 -48 -43h-40q10 54 41.5 86t74.5 32q38 0 97 -26q39 -16 54 -16q17 0 28.5 9t22.5 33zM472 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-68 0 -68 60q0 47 26 125l55 165q7 23 7 28 q0 21 -25 21q-13 0 -33 -16.5t-36 -37.5q-47 -62 -79 -135t-66 -201h-121l57 204q45 164 45 179q0 14 -11.5 18.5t-43.5 5.5v27q90 3 199 27l-62 -198h1q51 75 73 103.5t49 54.5q43 41 100 41q73 0 73 -77q0 -34 -28 -116l-35 -104q-24 -71 -24 -89q0 -17 14 -17q13 0 27 15 t44 61z" />
+<glyph unicode="&#xf2;" d="M280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5 t25 157.5zM405 516h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33z" />
+<glyph unicode="&#xf3;" d="M179 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5 t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#xf4;" d="M462 516h-51l-88 95l-131 -95h-57l160 174h81zM280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5 t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#xf5;" d="M444 655h41q-16 -63 -44 -91t-73 -28q-25 0 -57 13l-59 23q-21 8 -38 8q-31 0 -48 -43h-40q10 54 41.5 86t74.5 32q38 0 97 -26q39 -16 54 -16q17 0 28.5 9t22.5 33zM280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5 t-45.5 109.5q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#xf6;" d="M280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5 t25 157.5zM470 589q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM258 589q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#xf7;" horiz-adv-x="570" d="M537 209h-504v88h504v-88zM359 45q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52zM359 461q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52z" />
+<glyph unicode="&#xf8;" d="M424 560l-65 -116q82 -40 82 -133q0 -127 -86.5 -225.5t-197.5 -98.5q-24 0 -51 8l-64 -114h-40l72 126q-77 44 -77 127q0 128 88.5 228t200.5 100q20 0 42 -6l59 104h37zM116 78l191 341q-14 14 -32 14q-48 0 -86 -68q-27 -49 -50 -136.5t-23 -142.5v-8zM321 377 l-193 -343q14 -18 37 -18q57 0 101 109q22 52 39 127t17 120q0 3 -1 5z" />
+<glyph unicode="&#xf9;" horiz-adv-x="556" d="M471 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206 h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74zM422 516h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33z" />
+<glyph unicode="&#xfa;" horiz-adv-x="556" d="M196 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM471 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27 q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#xfb;" horiz-adv-x="556" d="M481 516h-51l-88 95l-131 -95h-57l160 174h81zM471 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72 q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#xfc;" horiz-adv-x="556" d="M277 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM489 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM471 133l22 -13 q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206h118l-78 -266 q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#xfd;" horiz-adv-x="444" d="M161 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM239 110h2q52 99 69.5 141t17.5 66q0 13 -25 34q-31 25 -31 54q0 21 16 39t42 18q25 0 43.5 -19t18.5 -45q0 -76 -75.5 -227t-173.5 -270q-41 -50 -87.5 -78t-87.5 -28 q-26 0 -44 17.5t-18 42.5q0 22 15.5 39t34.5 17q25 0 51 -18t43 -18q13 0 32 15t35 37q25 35 25 71q0 50 -50 288q-21 94 -40 113q-8 8 -14.5 10t-25.5 2v27q86 8 150 24q43 -111 66 -274z" />
+<glyph unicode="&#xfe;" d="M185 359l3 -3q38 57 73 81.5t78 24.5q49 0 78 -33t29 -88q0 -85 -40.5 -167.5t-105.5 -134.5t-131 -52q-25 0 -68 22q-10 -38 -11 -41q-26 -96 -26 -114t13.5 -24.5t51.5 -7.5v-27h-249v27q35 0 50 17t28 68l162 630q17 64 17 75q0 30 -45 30h-18v27q117 13 206 30z M321 334q0 57 -39 57q-20 0 -43.5 -17t-41.5 -46q-18 -27 -46 -121q-38 -128 -38 -149q0 -15 11.5 -25.5t27.5 -10.5q50 0 97 82q29 53 50.5 118t21.5 112z" />
+<glyph unicode="&#xff;" horiz-adv-x="444" d="M239 110h2q52 99 69.5 141t17.5 66q0 13 -25 34q-31 25 -31 54q0 21 16 39t42 18q25 0 43.5 -19t18.5 -45q0 -76 -75.5 -227t-173.5 -270q-41 -50 -87.5 -78t-87.5 -28q-26 0 -44 17.5t-18 42.5q0 22 15.5 39t34.5 17q25 0 51 -18t43 -18q13 0 32 15t35 37q25 35 25 71 q0 50 -50 288q-21 94 -40 113q-8 8 -14.5 10t-25.5 2v27q86 8 150 24q43 -111 66 -274zM460 589q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM248 589q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5 q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x100;" horiz-adv-x="667" d="M571 793l-16 -70h-326l17 70h325zM593 0h-303v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5t61 -19.5v-25zM346 248l-37 243l-148 -243h185z" />
+<glyph unicode="&#x101;" d="M486 586l-16 -70h-326l17 70h325zM435 127l21 -15q-78 -126 -156 -126q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17t24.5 -55h1l17 59l111 7l-75 -251q-30 -99 -30 -133 q0 -15 12 -15t27 14.5t46 55.5zM303 373q0 20 -10.5 33.5t-26.5 13.5q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57q45 0 86 75q29 52 50.5 123.5t21.5 116.5z" />
+<glyph unicode="&#x102;" horiz-adv-x="667" d="M519 885h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM593 0h-303v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5 t61 -19.5v-25zM346 248l-37 243l-148 -243h185z" />
+<glyph unicode="&#x103;" d="M444 678h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM435 127l21 -15q-78 -126 -156 -126q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17 t24.5 -55h1l17 59l111 7l-75 -251q-30 -99 -30 -133q0 -15 12 -15t27 14.5t46 55.5zM303 373q0 20 -10.5 33.5t-26.5 13.5q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57q45 0 86 75q29 52 50.5 123.5t21.5 116.5z" />
+<glyph unicode="&#x104;" horiz-adv-x="667" d="M453 0h-163v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5t61 -19.5v-25h-92q-6 -28 -6 -42q0 -62 61 -62q22 0 48 13l14 7l22 -14q-19 -35 -53 -55t-73 -20 q-47 0 -75 21t-28 60t42 92zM161 248h185l-37 243z" />
+<glyph unicode="&#x105;" d="M485 -84l22 -14q-19 -35 -53 -55t-73 -20q-47 0 -75 21t-28 60q0 34 32 79q-4 -1 -10 -1q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17t24.5 -55h1l17 59l111 7l-75 -251 q-30 -99 -30 -133q0 -15 12 -15t27 14.5t46 55.5l21 -15q-43 -71 -85 -100q-9 -39 -9 -54q0 -62 61 -62q22 0 48 13zM266 420q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57q45 0 86 75q29 52 50.5 123.5t21.5 116.5q0 20 -10.5 33.5t-26.5 13.5z" />
+<glyph unicode="&#x106;" horiz-adv-x="667" d="M360 723l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM677 685l-51 -235l-32 6q3 20 3 36q0 72 -34.5 115t-96.5 43q-80 0 -145 -73q-61 -69 -98 -165t-37 -203q0 -81 42 -127.5t113 -46.5q61 0 105 28t99 91l31 -22q-42 -58 -78 -85 q-86 -65 -199 -65q-122 0 -194.5 69t-72.5 183q0 109 42.5 202t116.5 156q111 93 249 93q64 0 131 -21q24 -8 38 -8q20 0 38 29h30z" />
+<glyph unicode="&#x107;" horiz-adv-x="444" d="M139 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM318 142l28 -18l-38 -50q-13 -17 -34.5 -37.5t-42.5 -31.5q-35 -18 -83 -18q-70 0 -111.5 39.5t-41.5 111.5q0 134 105 239q83 85 180 85q46 0 79 -25.5t33 -64.5 q0 -32 -17 -51.5t-45 -19.5q-25 0 -41.5 15t-16.5 38q0 16 10.5 32t10.5 26q0 7 -7.5 12t-16.5 5q-26 0 -47.5 -22.5t-45.5 -65.5q-53 -98 -53 -201q0 -43 19.5 -66t53.5 -23q32 0 59 20t63 71z" />
+<glyph unicode="&#x108;" horiz-adv-x="667" d="M624 723h-51l-88 95l-131 -95h-57l160 174h81zM677 685l-51 -235l-32 6q3 20 3 36q0 72 -34.5 115t-96.5 43q-80 0 -145 -73q-61 -69 -98 -165t-37 -203q0 -81 42 -127.5t113 -46.5q61 0 105 28t99 91l31 -22q-42 -58 -78 -85q-86 -65 -199 -65q-122 0 -194.5 69 t-72.5 183q0 109 42.5 202t116.5 156q111 93 249 93q64 0 131 -21q24 -8 38 -8q20 0 38 29h30z" />
+<glyph unicode="&#x109;" horiz-adv-x="444" d="M415 516h-51l-88 95l-131 -95h-57l160 174h81zM318 142l28 -18l-38 -50q-13 -17 -34.5 -37.5t-42.5 -31.5q-35 -18 -83 -18q-70 0 -111.5 39.5t-41.5 111.5q0 134 105 239q83 85 180 85q46 0 79 -25.5t33 -64.5q0 -32 -17 -51.5t-45 -19.5q-25 0 -41.5 15t-16.5 38 q0 16 10.5 32t10.5 26q0 7 -7.5 12t-16.5 5q-26 0 -47.5 -22.5t-45.5 -65.5q-53 -98 -53 -201q0 -43 19.5 -66t53.5 -23q32 0 59 20t63 71z" />
+<glyph unicode="&#x10a;" horiz-adv-x="667" d="M677 685l-51 -235l-32 6q3 20 3 36q0 72 -34.5 115t-96.5 43q-80 0 -145 -73q-61 -69 -98 -165t-37 -203q0 -81 42 -127.5t113 -46.5q61 0 105 28t99 91l31 -22q-42 -58 -78 -85q-86 -65 -199 -65q-122 0 -194.5 69t-72.5 183q0 109 42.5 202t116.5 156q111 93 249 93 q64 0 131 -21q24 -8 38 -8q20 0 38 29h30zM449 862q27 0 46.5 -19.5t19.5 -46.5q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45q0 27 19 46.5t45 19.5z" />
+<glyph unicode="&#x10b;" horiz-adv-x="444" d="M345 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM318 142l28 -18l-38 -50q-13 -17 -34.5 -37.5t-42.5 -31.5q-35 -18 -83 -18q-70 0 -111.5 39.5t-41.5 111.5q0 134 105 239q83 85 180 85 q46 0 79 -25.5t33 -64.5q0 -32 -17 -51.5t-45 -19.5q-25 0 -41.5 15t-16.5 38q0 16 10.5 32t10.5 26q0 7 -7.5 12t-16.5 5q-26 0 -47.5 -22.5t-45.5 -65.5q-53 -98 -53 -201q0 -43 19.5 -66t53.5 -23q32 0 59 20t63 71z" />
+<glyph unicode="&#x10c;" horiz-adv-x="667" d="M616 897l-162 -174h-82l-88 174h51l90 -97l134 97h57zM677 685l-51 -235l-32 6q3 20 3 36q0 72 -34.5 115t-96.5 43q-80 0 -145 -73q-61 -69 -98 -165t-37 -203q0 -81 42 -127.5t113 -46.5q61 0 105 28t99 91l31 -22q-42 -58 -78 -85q-86 -65 -199 -65q-122 0 -194.5 69 t-72.5 183q0 109 42.5 202t116.5 156q111 93 249 93q64 0 131 -21q24 -8 38 -8q20 0 38 29h30z" />
+<glyph unicode="&#x10d;" horiz-adv-x="444" d="M437 690l-162 -174h-82l-88 174h51l90 -97l134 97h57zM318 142l28 -18l-38 -50q-13 -17 -34.5 -37.5t-42.5 -31.5q-35 -18 -83 -18q-70 0 -111.5 39.5t-41.5 111.5q0 134 105 239q83 85 180 85q46 0 79 -25.5t33 -64.5q0 -32 -17 -51.5t-45 -19.5q-25 0 -41.5 15 t-16.5 38q0 16 10.5 32t10.5 26q0 7 -7.5 12t-16.5 5q-26 0 -47.5 -22.5t-45.5 -65.5q-53 -98 -53 -201q0 -43 19.5 -66t53.5 -23q32 0 59 20t63 71z" />
+<glyph unicode="&#x10e;" horiz-adv-x="722" d="M586 897l-162 -174h-82l-88 174h51l90 -97l134 97h57zM94 669h290q141 0 221 -70.5t80 -193.5q0 -82 -31.5 -159t-87.5 -129q-127 -117 -324 -117h-288v25q37 5 53.5 21.5t29.5 62.5l115 422q15 53 15 71t-8.5 26t-30.5 11l-34 5v25zM318 600l-126 -465q-15 -53 -15 -67 q0 -34 58 -34q130 0 210 105q93 121 93 318q0 181 -165 181q-25 0 -37 -8.5t-18 -29.5z" />
+<glyph unicode="&#x10f;" horiz-adv-x="658" d="M517 699l-117 -421q-51 -184 -51 -203q0 -5 3.5 -10t7.5 -5q24 0 68 71l22 -16q-79 -126 -150 -126q-28 0 -44 16t-16 45q0 20 11 68q-72 -131 -166 -131q-48 0 -77 32.5t-29 92.5q0 72 37 150t94 132q70 68 138 68q46 0 75 -33l18 64q29 102 29 122q0 28 -41 28h-21v27 q129 10 209 29zM308 371q0 21 -10.5 35t-26.5 14q-57 1 -114 -112q-24 -48 -39 -100.5t-15 -85.5q0 -27 11.5 -45t29.5 -18q45 0 86 74q27 48 52.5 126.5t25.5 111.5zM535 394l-13 25q118 63 118 116q0 21 -30 37q-40 22 -40 65q0 35 20.5 54t52.5 19q39 0 61 -26t22 -68 q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x110;" horiz-adv-x="722" d="M109 669h290q142 0 221.5 -72.5t79.5 -200.5q0 -171 -126.5 -283.5t-318.5 -112.5h-286v25q36 5 53 19.5t27 52.5l63 232h-102l12 44h102l46 170q12 44 12 59q0 17 -10 25t-32 12l-31 5v25zM260 329l-56 -207q-12 -46 -12 -54q0 -34 54 -34q142 0 223 118q39 58 61.5 140 t22.5 165q0 181 -165 181q-46 0 -55 -38l-61 -227h122l-12 -44h-122z" />
+<glyph unicode="&#x111;" d="M180 568h181q9 37 9 47q0 28 -41 28h-21v27q129 10 209 29l-37 -131h61l-14 -50h-61l-66 -240q-51 -184 -51 -203q0 -5 3.5 -10t7.5 -5q24 0 68 71l22 -16q-79 -126 -150 -126q-28 0 -44 16t-16 45q0 20 11 68q-72 -131 -166 -131q-48 0 -77 32.5t-29 92.5q0 72 37 150 t94 132q70 68 138 68q46 0 75 -33l25 89h-182zM271 420q-57 1 -114 -112q-24 -48 -39 -100.5t-15 -85.5q0 -27 11.5 -45t29.5 -18q45 0 86 74q27 48 52.5 126.5t25.5 111.5q0 21 -10.5 35t-26.5 14z" />
+<glyph unicode="&#x112;" horiz-adv-x="667" d="M601 793l-16 -70h-326l17 70h325zM653 669l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5t-114 19.5l-63 -234q-8 -32 -8 -38q0 -34 61 -34 q131 0 214 61q28 20 47 42t44 64l25 -5l-60 -194h-553v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="&#x113;" horiz-adv-x="444" d="M431 586l-16 -70h-326l17 70h325zM317 143l29 -17q-78 -139 -195 -139q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122q-32 -27 -73.5 -42.5t-114.5 -28.5q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20t60.5 72zM306 390 q0 39 -31 39q-71 0 -127 -215q68 15 113 64.5t45 111.5z" />
+<glyph unicode="&#x114;" horiz-adv-x="667" d="M569 885h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM653 669l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5 t-114 19.5l-63 -234q-8 -32 -8 -38q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5l-60 -194h-553v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="&#x115;" horiz-adv-x="444" d="M439 678h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM317 143l29 -17q-78 -139 -195 -139q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122q-32 -27 -73.5 -42.5t-114.5 -28.5 q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20t60.5 72zM306 390q0 39 -31 39q-71 0 -127 -215q68 15 113 64.5t45 111.5z" />
+<glyph unicode="&#x116;" horiz-adv-x="667" d="M653 669l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5t-114 19.5l-63 -234q-8 -32 -8 -38q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5 l-60 -194h-553v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541zM429 862q27 0 46.5 -19.5t19.5 -46.5q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45q0 27 19 46.5t45 19.5z" />
+<glyph unicode="&#x117;" horiz-adv-x="444" d="M355 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM317 143l29 -17q-78 -139 -195 -139q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122 q-32 -27 -73.5 -42.5t-114.5 -28.5q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20t60.5 72zM306 390q0 39 -31 39q-71 0 -127 -215q68 15 113 64.5t45 111.5z" />
+<glyph unicode="&#x118;" horiz-adv-x="667" d="M311 0h-338v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5 t-114 19.5l-63 -234q-8 -32 -8 -38q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5l-60 -194h-172q-8 -38 -8 -51q0 -62 61 -62q22 0 48 13l14 7l22 -14q-19 -35 -53 -55t-73 -20q-47 0 -75 21t-28 60q0 24 10.5 45t38.5 56z" />
+<glyph unicode="&#x119;" horiz-adv-x="444" d="M153 -13h-2q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122q-32 -27 -73.5 -42.5t-114.5 -28.5q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20t60.5 72l29 -17q-60 -108 -141 -132q-7 -28 -7 -45q0 -62 61 -62q22 0 48 13 l14 7l22 -14q-19 -35 -53 -55t-73 -20q-47 0 -75 21t-28 60q0 38 39 88zM148 214q68 15 113 64.5t45 111.5q0 39 -31 39q-71 0 -127 -215z" />
+<glyph unicode="&#x11a;" horiz-adv-x="667" d="M616 897l-162 -174h-82l-88 174h51l90 -97l134 97h57zM653 669l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5t-114 19.5l-63 -234q-8 -32 -8 -38 q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5l-60 -194h-553v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="&#x11b;" horiz-adv-x="444" d="M486 690l-162 -174h-82l-88 174h51l90 -97l134 97h57zM317 143l29 -17q-78 -139 -195 -139q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122q-32 -27 -73.5 -42.5t-114.5 -28.5q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20 t60.5 72zM306 390q0 39 -31 39q-71 0 -127 -215q68 15 113 64.5t45 111.5z" />
+<glyph unicode="&#x11c;" horiz-adv-x="722" d="M614 723h-51l-88 95l-131 -95h-57l160 174h81zM705 330v-26q-38 -3 -52 -19t-30 -77l-44 -167l-28 -13q-42 -20 -108.5 -33t-125.5 -13q-133 0 -214.5 74t-81.5 200q0 96 43.5 185t119.5 152q112 92 264 92q64 0 124 -21q24 -9 36 -9q27 0 42 30h31l-51 -221l-29 4 q-3 82 -24 119q-36 62 -115 62q-96 0 -173 -98q-51 -67 -81.5 -155.5t-30.5 -179.5q0 -97 42 -146.5t122 -49.5q73 0 94 30l31 104q27 92 27 114q0 16 -12 24q-14 7 -63 12v26h287z" />
+<glyph unicode="&#x11d;" d="M454 516h-51l-88 95l-131 -95h-57l160 174h81zM477 373h-66q6 -12 6 -42q0 -81 -71 -132q-64 -46 -145 -46q-27 0 -51 8q-10 0 -19 -10t-9 -26q0 -12 15 -23.5t39 -17.5l50 -12q81 -19 115 -47.5t34 -75.5q0 -63 -64.5 -107.5t-172.5 -44.5q-89 0 -139.5 25.5t-50.5 75.5 q0 59 40 83t93 26q-62 21 -62 66q0 30 21 53t75 44q-80 34 -80 110q0 78 62.5 130t155.5 52q75 0 114 -33h110v-56zM300 372q0 59 -45 59q-30 0 -57 -32q-23 -29 -35 -73t-12 -83q0 -59 42 -59q47 0 78 69q29 63 29 119zM266 -100q0 37 -42 58q-17 8 -58.5 21.5t-50.5 14.5 q-7 -1 -24.5 -11t-26.5 -19q-29 -28 -29 -55q0 -35 31.5 -56.5t81.5 -21.5q52 0 85 20.5t33 48.5z" />
+<glyph unicode="&#x11e;" horiz-adv-x="722" d="M579 885h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM705 330v-26q-38 -3 -52 -19t-30 -77l-44 -167l-28 -13q-42 -20 -108.5 -33t-125.5 -13q-133 0 -214.5 74t-81.5 200q0 96 43.5 185t119.5 152q112 92 264 92q64 0 124 -21 q24 -9 36 -9q27 0 42 30h31l-51 -221l-29 4q-3 82 -24 119q-36 62 -115 62q-96 0 -173 -98q-51 -67 -81.5 -155.5t-30.5 -179.5q0 -97 42 -146.5t122 -49.5q73 0 94 30l31 104q27 92 27 114q0 16 -12 24q-14 7 -63 12v26h287z" />
+<glyph unicode="&#x11f;" d="M429 678h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM477 373h-66q6 -12 6 -42q0 -81 -71 -132q-64 -46 -145 -46q-27 0 -51 8q-10 0 -19 -10t-9 -26q0 -12 15 -23.5t39 -17.5l50 -12q81 -19 115 -47.5t34 -75.5 q0 -63 -64.5 -107.5t-172.5 -44.5q-89 0 -139.5 25.5t-50.5 75.5q0 59 40 83t93 26q-62 21 -62 66q0 30 21 53t75 44q-80 34 -80 110q0 78 62.5 130t155.5 52q75 0 114 -33h110v-56zM300 372q0 59 -45 59q-30 0 -57 -32q-23 -29 -35 -73t-12 -83q0 -59 42 -59q47 0 78 69 q29 63 29 119zM266 -100q0 37 -42 58q-17 8 -58.5 21.5t-50.5 14.5q-7 -1 -24.5 -11t-26.5 -19q-29 -28 -29 -55q0 -35 31.5 -56.5t81.5 -21.5q52 0 85 20.5t33 48.5z" />
+<glyph unicode="&#x120;" horiz-adv-x="722" d="M705 330v-26q-38 -3 -52 -19t-30 -77l-44 -167l-28 -13q-42 -20 -108.5 -33t-125.5 -13q-133 0 -214.5 74t-81.5 200q0 96 43.5 185t119.5 152q112 92 264 92q64 0 124 -21q24 -9 36 -9q27 0 42 30h31l-51 -221l-29 4q-3 82 -24 119q-36 62 -115 62q-96 0 -173 -98 q-51 -67 -81.5 -155.5t-30.5 -179.5q0 -97 42 -146.5t122 -49.5q73 0 94 30l31 104q27 92 27 114q0 16 -12 24q-14 7 -63 12v26h287zM459 862q27 0 46.5 -19.5t19.5 -46.5q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45q0 27 19 46.5t45 19.5z" />
+<glyph unicode="&#x121;" d="M345 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM477 373h-66q6 -12 6 -42q0 -81 -71 -132q-64 -46 -145 -46q-27 0 -51 8q-10 0 -19 -10t-9 -26q0 -12 15 -23.5t39 -17.5l50 -12q81 -19 115 -47.5 t34 -75.5q0 -63 -64.5 -107.5t-172.5 -44.5q-89 0 -139.5 25.5t-50.5 75.5q0 59 40 83t93 26q-62 21 -62 66q0 30 21 53t75 44q-80 34 -80 110q0 78 62.5 130t155.5 52q75 0 114 -33h110v-56zM300 372q0 59 -45 59q-30 0 -57 -32q-23 -29 -35 -73t-12 -83q0 -59 42 -59 q47 0 78 69q29 63 29 119zM266 -100q0 37 -42 58q-17 8 -58.5 21.5t-50.5 14.5q-7 -1 -24.5 -11t-26.5 -19q-29 -28 -29 -55q0 -35 31.5 -56.5t81.5 -21.5q52 0 85 20.5t33 48.5z" />
+<glyph unicode="&#x122;" horiz-adv-x="722" d="M705 330v-26q-38 -3 -52 -19t-30 -77l-44 -167l-28 -13q-42 -20 -108.5 -33t-125.5 -13q-133 0 -214.5 74t-81.5 200q0 96 43.5 185t119.5 152q112 92 264 92q64 0 124 -21q24 -9 36 -9q27 0 42 30h31l-51 -221l-29 4q-3 82 -24 119q-36 62 -115 62q-96 0 -173 -98 q-51 -67 -81.5 -155.5t-30.5 -179.5q0 -97 42 -146.5t122 -49.5q73 0 94 30l31 104q27 92 27 114q0 16 -12 24q-14 7 -63 12v26h287zM171 -359l-13 25q118 63 118 116q0 21 -30 37q-40 23 -40 65q0 32 21 52.5t52 20.5q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x123;" d="M477 373h-66q6 -12 6 -42q0 -81 -71 -132q-64 -46 -145 -46q-27 0 -51 8q-10 0 -19 -10t-9 -26q0 -12 15 -23.5t39 -17.5l50 -12q81 -19 115 -47.5t34 -75.5q0 -63 -64.5 -107.5t-172.5 -44.5q-89 0 -139.5 25.5t-50.5 75.5q0 59 40 83t93 26q-62 21 -62 66q0 30 21 53 t75 44q-80 34 -80 110q0 78 62.5 130t155.5 52q75 0 114 -33h110v-56zM300 372q0 59 -45 59q-30 0 -57 -32q-23 -29 -35 -73t-12 -83q0 -59 42 -59q47 0 78 69q29 63 29 119zM266 -100q0 37 -42 58q-17 8 -58.5 21.5t-50.5 14.5q-7 -1 -24.5 -11t-26.5 -19q-29 -28 -29 -55 q0 -35 31.5 -56.5t81.5 -21.5q52 0 85 20.5t33 48.5zM370 832l13 -25q-118 -63 -118 -116q0 -21 30 -37q40 -22 40 -65q0 -35 -20.5 -54t-52.5 -19q-39 0 -61 26t-22 68q0 67 51 125.5t140 96.5z" />
+<glyph unicode="&#x124;" horiz-adv-x="778" d="M634 723h-51l-88 95l-131 -95h-57l160 174h81zM799 669v-25q-36 0 -53.5 -16.5t-28.5 -57.5l-111 -408q-22 -84 -22 -96q0 -22 16 -30.5t57 -10.5v-25h-316v25q51 3 70 17.5t32 61.5l62 225h-239l-54 -197q-12 -43 -12 -67q0 -34 71 -40v-25h-295v25q39 5 54 18.5 t27 55.5l121 447q11 38 11 58q0 17 -9.5 25t-32.5 11l-31 4v25h316v-25q-49 -2 -69 -17t-33 -63l-52 -191h239l47 173q10 38 10 61q0 15 -9 22.5t-32 10.5l-31 4v25h297z" />
+<glyph unicode="&#x125;" horiz-adv-x="556" d="M494 723h-51l-88 95l-131 -95h-57l160 174h81zM476 142l22 -15q-50 -77 -85.5 -106.5t-81.5 -29.5q-30 0 -48 17t-18 47t11 70t50 155l20 59q7 21 7 30q0 21 -20 21q-42 0 -106 -94q-36 -53 -58 -108t-61 -188h-121l152 562q10 37 10 47q0 33 -42 33h-22v27q99 9 209 30 l-108 -416q74 105 118 142t95 37q37 0 56.5 -20t19.5 -55q0 -28 -29 -118l-59 -182q-3 -8 -3 -12q0 -5 5.5 -10.5t11.5 -5.5q17 0 75 83z" />
+<glyph unicode="&#x126;" horiz-adv-x="778" d="M62 496v44h114q13 44 13 64q0 17 -9.5 25t-32.5 11l-31 4v25h316v-25q-49 -2 -68.5 -17t-33.5 -63l-7 -24h239q12 43 12 67q0 15 -9 22.5t-32 10.5l-31 4v25h297v-25q-36 0 -53.5 -16.5t-28.5 -57.5l-8 -30h91v-44h-103l-91 -334q-22 -84 -22 -96q0 -22 16 -30.5 t57 -10.5v-25h-316v25q51 3 70 17.5t32 61.5l62 225h-239l-54 -197q-12 -43 -12 -67q0 -34 71 -40v-25h-295v25q39 5 54 18.5t27 55.5l107 397h-102zM278 373h239l33 123h-239z" />
+<glyph unicode="&#x127;" horiz-adv-x="556" d="M65 514l12 44h61q11 39 11 51q0 33 -42 33h-22v27q99 9 209 30l-37 -141h159l-12 -44h-158l-60 -231q74 105 118 142t95 37q37 0 56.5 -20t19.5 -55q0 -28 -29 -118l-59 -182q-3 -8 -3 -12q0 -5 5.5 -10.5t11.5 -5.5q17 0 75 83l22 -15q-50 -77 -85.5 -106.5t-81.5 -29.5 q-30 0 -48 17t-18 47t11 70t50 155l20 59q7 21 7 30q0 21 -20 21q-42 0 -106 -94q-36 -53 -58 -108t-61 -188h-121l139 514h-61z" />
+<glyph unicode="&#x128;" horiz-adv-x="389" d="M429 862h41q-16 -63 -44 -91t-73 -28q-25 0 -57 13l-59 23q-21 8 -38 8q-31 0 -48 -43h-40q10 54 41.5 86t74.5 32q38 0 97 -26q39 -16 54 -16q17 0 28.5 9t22.5 33zM406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25 h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z" />
+<glyph unicode="&#x129;" horiz-adv-x="278" d="M309 655h41q-16 -63 -44 -91t-73 -28q-25 0 -57 13l-59 23q-21 8 -38 8q-31 0 -48 -43h-40q10 54 41.5 86t74.5 32q38 0 97 -26q39 -16 54 -16q17 0 28.5 9t22.5 33zM216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14 v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61z" />
+<glyph unicode="&#x12a;" horiz-adv-x="389" d="M451 793l-16 -70h-326l17 70h325zM406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z" />
+<glyph unicode="&#x12b;" horiz-adv-x="278" d="M216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61zM331 586l-16 -70h-326l17 70h325z" />
+<glyph unicode="&#x12c;" horiz-adv-x="389" d="M419 885h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z " />
+<glyph unicode="&#x12d;" horiz-adv-x="278" d="M289 678h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61z " />
+<glyph unicode="&#x12e;" horiz-adv-x="389" d="M90 0h-122v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-126q-6 -28 -6 -42q0 -62 61 -62q22 0 48 13l14 7l22 -14q-19 -35 -53 -55t-73 -20 q-47 0 -75 21t-28 60t42 92z" />
+<glyph unicode="&#x12f;" horiz-adv-x="278" d="M222 -84l22 -14q-19 -35 -53 -55t-73 -20q-47 0 -75 21t-28 60q0 37 36 85q-49 8 -49 61q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61l14 20l22 -14q-40 -64 -70.5 -94.5t-63.5 -38.5q-5 -27 -5 -37 q0 -62 61 -62q22 0 48 13zM193 684q28 0 48.5 -20t20.5 -48t-19.5 -47t-48.5 -19q-28 0 -47 20t-19 49q0 25 20 45t45 20z" />
+<glyph unicode="&#x130;" horiz-adv-x="389" d="M406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298zM279 862q27 0 46.5 -19.5t19.5 -46.5q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45 q0 27 19 46.5t45 19.5z" />
+<glyph unicode="&#x131;" horiz-adv-x="278" d="M216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61z" />
+<glyph unicode="&#x134;" d="M554 723h-51l-88 95l-131 -95h-57l160 174h81zM524 669v-25q-40 -5 -55.5 -19t-29.5 -66l-122 -457q-26 -99 -82 -150t-133 -51q-67 0 -107.5 26.5t-40.5 74.5q0 30 18.5 51t45.5 21t45 -18t18 -47q0 -17 -11.5 -32t-11.5 -22q0 -18 27 -18t43.5 32t44.5 138l114 432 q13 51 13 64q0 29 -41 36l-33 5v25h298z" />
+<glyph unicode="&#x135;" horiz-adv-x="278" d="M314 516h-51l-88 95l-131 -95h-57l160 174h81zM202 322l-79 -304q-31 -119 -81 -172t-126 -53q-47 0 -76 22t-29 55q0 22 14.5 37.5t34.5 15.5q22 0 35.5 -13.5t13.5 -35.5q0 -11 -7.5 -20t-7.5 -15q0 -15 24 -15q21 0 38 31t36 105l89 350q12 45 12 67q0 30 -41 30h-22 v27q136 12 209 28z" />
+<glyph unicode="&#x136;" horiz-adv-x="667" d="M702 669v-25q-33 -5 -47.5 -12t-46.5 -36l-216 -199l157 -333q9 -19 22 -27.5t41 -11.5v-25h-280l1 25l26 4q21 3 29.5 8t8.5 15q0 16 -15 49l-111 236l-67 -249q-2 -10 -2 -17q0 -25 13 -34t52 -12v-25h-288v25q36 4 52.5 17t26.5 51l123 453q11 38 11 58q0 17 -9 25 t-32 11l-33 4v25h311v-25q-45 -4 -64.5 -18.5t-29.5 -53.5l-62 -227l197 175q77 68 77 97q0 22 -35 25l-21 2v25h211zM161 -359l-13 25q118 63 118 116q0 21 -30 37q-40 23 -40 65q0 32 21 52.5t52 20.5q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x137;" d="M483 449v-25q-37 -5 -61.5 -18.5t-73.5 -57.5l-64 -58q19 -95 33 -145.5t24 -66t22 -15.5q28 0 64 64l22 -11q-32 -68 -65 -96t-73 -28q-47 0 -72.5 46.5t-50.5 176.5l-39 -27l-50 -188h-122l157 566q7 24 7 42q0 20 -7 27t-23 7h-34v27q96 5 209 30l-124 -461 q95 75 130 109.5t35 53.5q0 12 -10.5 16.5t-39.5 6.5v25h206zM51 -359l-13 25q118 63 118 116q0 21 -30 37q-40 23 -40 65q0 32 21 52.5t52 20.5q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x138;" horiz-adv-x="600" d="M614 0h-168q-40 5 -69 76q-7 17 -13.5 47t-17.5 56q-15 39 -56 54q-5 -1 -27 -1l-40 -145q-7 -26 -7 -37q0 -25 42 -26l-7 -24h-245l7 24q29 7 44 19t23 43l84 305q4 12 4 24q0 28 -41 31l7 24h245l-7 -24q-33 -5 -45 -14.5t-21 -41.5l-29 -108q23 0 39 3q76 16 102 32 q51 31 90 88q29 42 46.5 53.5t63.5 11.5q28 0 49.5 -17t21.5 -39q0 -20 -14 -31t-36 -11q-19 0 -30.5 10t-18.5 20t-16 10q-21 0 -38 -28q-46 -74 -108 -112q21 -8 33 -34q6 -14 24.5 -69t24.5 -69q14 -37 37.5 -54t73.5 -22z" />
+<glyph unicode="&#x139;" horiz-adv-x="611" d="M262 723l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM590 195l-60 -195h-552v25q40 5 55 20.5t27 57.5l121 443q11 42 11 61q0 15 -9 22t-32 10q-20 4 -34 5v25h318v-25q-50 -3 -69.5 -16.5t-29.5 -53.5l-129 -473q-6 -24 -6 -39 q0 -30 72 -30q104 0 178 45q38 23 61.5 48.5t53.5 74.5z" />
+<glyph unicode="&#x13a;" horiz-adv-x="278" d="M104 723l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM290 699l-145 -523q-22 -79 -22 -100q0 -15 15 -15q25 0 79 80l22 -14q-52 -80 -87 -108t-82 -28q-30 0 -49 18t-19 45q0 34 34 155l74 259q34 118 34 145q0 30 -42 30 q-11 0 -22 -1v27q98 9 210 30z" />
+<glyph unicode="&#x13b;" horiz-adv-x="611" d="M590 195l-60 -195h-552v25q40 5 55 20.5t27 57.5l121 443q11 42 11 61q0 15 -9 22t-32 10q-20 4 -34 5v25h318v-25q-50 -3 -69.5 -16.5t-29.5 -53.5l-129 -473q-6 -24 -6 -39q0 -30 72 -30q104 0 178 45q38 23 61.5 48.5t53.5 74.5zM141 -359l-13 25q118 63 118 116 q0 21 -30 37q-40 23 -40 65q0 32 21 52.5t52 20.5q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x13c;" horiz-adv-x="278" d="M290 699l-145 -523q-22 -79 -22 -100q0 -15 15 -15q25 0 79 80l22 -14q-52 -80 -87 -108t-82 -28q-30 0 -49 18t-19 45q0 34 34 155l74 259q34 118 34 145q0 30 -42 30q-11 0 -22 -1v27q98 9 210 30zM-49 -359l-13 25q118 63 118 116q0 21 -30 37q-40 23 -40 65 q0 32 21 52.5t52 20.5q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x13d;" horiz-adv-x="611" d="M476 369l-13 25q118 63 118 116q0 21 -30 37q-40 23 -40 65q0 35 20.5 54t52.5 19q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5zM590 195l-60 -195h-552v25q40 5 55 20.5t27 57.5l121 443q11 42 11 61q0 15 -9 22t-32 10q-20 4 -34 5v25h318v-25q-50 -3 -69.5 -16.5 t-29.5 -53.5l-129 -473q-6 -24 -6 -39q0 -30 72 -30q104 0 178 45q38 23 61.5 48.5t53.5 74.5z" />
+<glyph unicode="&#x13e;" horiz-adv-x="451" d="M290 699l-145 -523q-22 -79 -22 -100q0 -15 15 -15q25 0 79 80l22 -14q-52 -80 -87 -108t-82 -28q-30 0 -49 18t-19 45q0 34 34 155l74 259q34 118 34 145q0 30 -42 30q-11 0 -22 -1v27q98 9 210 30zM308 394l-13 25q118 63 118 116q0 21 -30 37q-40 22 -40 65 q0 35 20.5 54t52.5 19q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x13f;" horiz-adv-x="611" d="M488 335q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52zM590 195l-60 -195h-552v25q40 5 55 20.5t27 57.5l121 443q11 42 11 61q0 15 -9 22t-32 10q-20 4 -34 5v25h318v-25q-50 -3 -69.5 -16.5t-29.5 -53.5l-129 -473 q-6 -24 -6 -39q0 -30 72 -30q104 0 178 45q38 23 61.5 48.5t53.5 74.5z" />
+<glyph unicode="&#x140;" horiz-adv-x="375" d="M382 328q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52zM290 699l-145 -523q-22 -79 -22 -100q0 -15 15 -15q25 0 79 80l22 -14q-52 -80 -87 -108t-82 -28q-30 0 -49 18t-19 45q0 34 34 155l74 259q34 118 34 145 q0 30 -42 30q-11 0 -22 -1v27q98 9 210 30z" />
+<glyph unicode="&#x141;" horiz-adv-x="611" d="M590 194l-60 -194h-552v25q38 5 53.5 19t26.5 53l50 182l-104 -56l22 70l100 53l55 200q10 38 10 61q0 15 -8.5 21.5t-32.5 10.5l-32 5v25h317v-25q-50 -3 -69.5 -17t-31.5 -58l-44 -158l150 81l-21 -70l-148 -83l-66 -245q-5 -18 -5 -30q0 -32 69 -32q115 0 181 44 q38 25 61 50t55 73z" />
+<glyph unicode="&#x142;" horiz-adv-x="278" d="M216 141l22 -14q-50 -78 -84.5 -107t-82.5 -29q-69 0 -69 62q0 44 62 257l-77 -43l19 70l78 43q60 216 60 235q0 28 -42 28q-12 0 -22 -1v27q98 9 210 30l-75 -271l86 47l-19 -68l-86 -47l-51 -184q-22 -82 -22 -100q0 -6 5 -10.5t11 -4.5q13 0 29.5 17.5t47.5 62.5z" />
+<glyph unicode="&#x143;" horiz-adv-x="722" d="M350 723l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM748 669v-25q-42 -8 -58.5 -32.5t-43.5 -120.5l-143 -506h-28l-257 547l-99 -354q-19 -66 -19 -94q0 -29 17.5 -42t61.5 -17v-25h-206v25q42 8 56 30t45 125l120 407 q-15 34 -28.5 43.5t-53.5 13.5v25h193l216 -467l81 289q19 71 19 94q0 59 -81 59v25h208z" />
+<glyph unicode="&#x144;" horiz-adv-x="556" d="M161 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM472 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-68 0 -68 60q0 47 26 125l55 165q7 23 7 28q0 21 -25 21q-13 0 -33 -16.5t-36 -37.5q-47 -62 -79 -135t-66 -201h-121 l57 204q45 164 45 179q0 14 -11.5 18.5t-43.5 5.5v27q90 3 199 27l-62 -198h1q51 75 73 103.5t49 54.5q43 41 100 41q73 0 73 -77q0 -34 -28 -116l-35 -104q-24 -71 -24 -89q0 -17 14 -17q13 0 27 15t44 61z" />
+<glyph unicode="&#x145;" horiz-adv-x="722" d="M748 669v-25q-42 -8 -58.5 -32.5t-43.5 -120.5l-143 -506h-28l-257 547l-99 -354q-19 -66 -19 -94q0 -29 17.5 -42t61.5 -17v-25h-206v25q42 8 56 30t45 125l120 407q-15 34 -28.5 43.5t-53.5 13.5v25h193l216 -467l81 289q19 71 19 94q0 59 -81 59v25h208zM141 -359 l-13 25q118 63 118 116q0 21 -30 37q-40 23 -40 65q0 32 21 52.5t52 20.5q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x146;" horiz-adv-x="556" d="M472 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-68 0 -68 60q0 47 26 125l55 165q7 23 7 28q0 21 -25 21q-13 0 -33 -16.5t-36 -37.5q-47 -62 -79 -135t-66 -201h-121l57 204q45 164 45 179q0 14 -11.5 18.5t-43.5 5.5v27q90 3 199 27l-62 -198h1q51 75 73 103.5 t49 54.5q43 41 100 41q73 0 73 -77q0 -34 -28 -116l-35 -104q-24 -71 -24 -89q0 -17 14 -17q13 0 27 15t44 61zM81 -359l-13 25q118 63 118 116q0 21 -30 37q-40 23 -40 65q0 32 21 52.5t52 20.5q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x147;" horiz-adv-x="722" d="M636 897l-162 -174h-82l-88 174h51l90 -97l134 97h57zM748 669v-25q-42 -8 -58.5 -32.5t-43.5 -120.5l-143 -506h-28l-257 547l-99 -354q-19 -66 -19 -94q0 -29 17.5 -42t61.5 -17v-25h-206v25q42 8 56 30t45 125l120 407q-15 34 -28.5 43.5t-53.5 13.5v25h193l216 -467 l81 289q19 71 19 94q0 59 -81 59v25h208z" />
+<glyph unicode="&#x148;" horiz-adv-x="556" d="M506 690l-162 -174h-82l-88 174h51l90 -97l134 97h57zM472 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-68 0 -68 60q0 47 26 125l55 165q7 23 7 28q0 21 -25 21q-13 0 -33 -16.5t-36 -37.5q-47 -62 -79 -135t-66 -201h-121l57 204q45 164 45 179q0 14 -11.5 18.5 t-43.5 5.5v27q90 3 199 27l-62 -198h1q51 75 73 103.5t49 54.5q43 41 100 41q73 0 73 -77q0 -34 -28 -116l-35 -104q-24 -71 -24 -89q0 -17 14 -17q13 0 27 15t44 61z" />
+<glyph unicode="&#x149;" horiz-adv-x="700" d="M635 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-68 0 -68 60q0 47 26 125l55 165q7 23 7 28q0 21 -25 21q-13 0 -33 -16.5t-36 -37.5q-47 -62 -79 -135t-66 -201h-121l57 204q45 164 45 179q0 14 -11.5 18.5t-43.5 5.5v27q90 3 199 27l-62 -198h1q51 75 73 103.5 t49 54.5q43 41 100 41q73 0 73 -77q0 -34 -28 -116l-35 -104q-24 -71 -24 -89q0 -17 14 -17q13 0 27 15t44 61zM55 394l-13 25q118 63 118 116q0 21 -30 37q-40 22 -40 65q0 35 20.5 54t52.5 19q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x14a;" horiz-adv-x="722" d="M94 669h290q141 0 221 -70.5t80 -193.5q0 -81 -30.5 -184.5t-81 -198.5t-128.5 -160t-162 -65q-67 0 -107.5 26.5t-40.5 74.5q0 30 18.5 51t45.5 21t45 -18t18 -47q0 -17 -11.5 -32t-11.5 -22q0 -18 27 -18q46 0 110.5 98t113 248t48.5 278q0 181 -165 181 q-25 0 -37 -8.5t-18 -29.5l-168 -600h-196v25q37 5 53.5 21.5t29.5 62.5l115 422q15 53 15 71t-8.5 26t-30.5 11l-34 5v25z" />
+<glyph unicode="&#x14b;" horiz-adv-x="543" d="M249 -38l95 354q10 35 10 53q0 21 -25 21q-13 0 -33 -16.5t-36 -37.5q-47 -62 -79 -135t-66 -201h-121l57 204q45 164 45 179q0 14 -11.5 19t-43.5 5v27q94 3 199 27l-62 -198h1q51 75 73 103.5t49 54.5q43 41 100 41q73 0 73 -77q0 -24 -88 -361q-31 -119 -82 -175 t-127 -56q-47 0 -76 22t-29 55q0 22 14.5 37.5t34.5 15.5q22 0 35.5 -13.5t13.5 -35.5q0 -11 -7.5 -20t-7.5 -15q0 -15 24 -15q20 0 34.5 29.5t35.5 108.5z" />
+<glyph unicode="&#x14c;" horiz-adv-x="722" d="M651 793l-16 -70h-326l17 70h325zM691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528q0 60 -27 91.5t-74 31.5q-91 0 -162 -120 q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#x14d;" d="M461 586l-16 -70h-326l17 70h325zM280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5 q0 -64 49 -64q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#x14e;" horiz-adv-x="722" d="M629 885h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528 q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#x14f;" d="M449 678h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5 t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#x150;" horiz-adv-x="722" d="M460 723l122 133q43 48 70 48q20 0 34 -14t14 -33q0 -27 -39 -49l-151 -85h-50zM271 723l122 133q43 48 70 48q20 0 34 -13t14 -32q0 -29 -39 -51l-149 -85h-52zM691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5 t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#x151;" d="M279 516l122 133q43 48 70 48q20 0 34 -14t14 -33q0 -27 -39 -49l-151 -85h-50zM90 516l122 133q43 48 70 48q20 0 34 -13t14 -32q0 -29 -39 -51l-149 -85h-52zM280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5 q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#x152;" horiz-adv-x="944" d="M946 669l-46 -191l-25 6q2 28 2 37q0 59 -40 87q-41 29 -125 29q-26 0 -35.5 -8t-17.5 -39l-61 -220h25q67 0 103.5 23t60.5 80l27 -3l-72 -272l-27 5l1 19q0 7 1.5 21.5t1.5 19.5q0 31 -21 48q-11 10 -31.5 14.5t-77.5 10.5l-64 -245q-4 -18 -4 -25q0 -34 73 -34 q88 0 146.5 38t110.5 129l27 -5l-60 -194h-324q-34 0 -102 -4t-98 -4h-18q-120 0 -184 57q-69 61 -69 175q0 108 55 212.5t146 170.5q53 38 107 54t133 16q26 0 56 -3q70 -5 91 -5h335zM392 123l108 391q12 46 12 69q0 62 -73 62q-90 0 -161 -106q-46 -68 -80 -181.5 t-34 -199.5q0 -60 33 -96.5t88 -36.5q43 0 67.5 22.5t39.5 75.5z" />
+<glyph unicode="&#x153;" horiz-adv-x="722" d="M591 139l28 -15q-31 -64 -72 -97q-52 -40 -116 -40q-63 0 -117 57q-63 -57 -148 -57q-71 0 -115.5 43.5t-44.5 113.5q0 61 29 127t75 112q80 79 190 79q40 0 66 -14t50 -48q44 35 75.5 48.5t70.5 13.5q52 0 82 -24.5t30 -65.5q0 -71 -87 -127q-36 -23 -68 -35t-105 -26 q-8 -39 -8 -56q0 -78 67 -78q35 0 59.5 18.5t58.5 70.5zM421 218q59 17 90.5 38.5t52.5 58.5q22 41 22 77q0 40 -37 40q-22 0 -36 -16q-26 -30 -43.5 -65.5t-48.5 -132.5zM282 433q-48 0 -86 -74q-27 -51 -49.5 -130.5t-22.5 -131.5q0 -81 53 -81q52 0 97 97q22 48 42.5 128 t20.5 118q0 74 -55 74z" />
+<glyph unicode="&#x154;" horiz-adv-x="667" d="M280 723l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM110 669h286q227 0 227 -143q0 -92 -96 -151q-31 -19 -96 -32l85 -254q12 -36 28.5 -48t58.5 -16v-25h-202l-107 331h-30l-52 -182q-18 -62 -18 -82q0 -22 14 -30.5t58 -11.5 v-25h-294v25q36 4 53 21.5t29 62.5l120 437q10 38 10 61q0 16 -9 24t-33 10l-32 3v25zM330 583l-57 -220q91 1 127 25q33 20 52.5 62t19.5 92q0 46 -21 70.5t-61 24.5q-25 0 -38 -10.5t-22 -43.5z" />
+<glyph unicode="&#x155;" horiz-adv-x="389" d="M139 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM160 253h1q60 121 95.5 165t75.5 44q26 0 41.5 -18t15.5 -48q0 -31 -16.5 -52t-41.5 -21q-22 0 -37.5 19t-23.5 19q-23 0 -65 -76q-36 -65 -74 -186l-31 -99h-121 q102 345 102 382q0 14 -11.5 19.5t-44.5 5.5v27q131 11 200 28z" />
+<glyph unicode="&#x156;" horiz-adv-x="667" d="M110 669h286q227 0 227 -143q0 -92 -96 -151q-31 -19 -96 -32l85 -254q12 -36 28.5 -48t58.5 -16v-25h-202l-107 331h-30l-52 -182q-18 -62 -18 -82q0 -22 14 -30.5t58 -11.5v-25h-294v25q36 4 53 21.5t29 62.5l120 437q10 38 10 61q0 16 -9 24t-33 10l-32 3v25zM330 583 l-57 -220q91 1 127 25q33 20 52.5 62t19.5 92q0 46 -21 70.5t-61 24.5q-25 0 -38 -10.5t-22 -43.5zM140 -359l-13 25q118 63 118 116q0 21 -30 37q-40 23 -40 65q0 32 21 52.5t52 20.5q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x157;" horiz-adv-x="389" d="M160 253h1q60 121 95.5 165t75.5 44q26 0 41.5 -18t15.5 -48q0 -31 -16.5 -52t-41.5 -21q-22 0 -37.5 19t-23.5 19q-23 0 -65 -76q-36 -65 -74 -186l-31 -99h-121q102 345 102 382q0 14 -11.5 19.5t-44.5 5.5v27q131 11 200 28zM-89 -359l-13 25q118 63 118 116 q0 21 -30 37q-40 23 -40 65q0 32 21 52.5t52 20.5q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x158;" horiz-adv-x="667" d="M566 897l-162 -174h-82l-88 174h51l90 -97l134 97h57zM110 669h286q227 0 227 -143q0 -92 -96 -151q-31 -19 -96 -32l85 -254q12 -36 28.5 -48t58.5 -16v-25h-202l-107 331h-30l-52 -182q-18 -62 -18 -82q0 -22 14 -30.5t58 -11.5v-25h-294v25q36 4 53 21.5t29 62.5 l120 437q10 38 10 61q0 16 -9 24t-33 10l-32 3v25zM330 583l-57 -220q91 1 127 25q33 20 52.5 62t19.5 92q0 46 -21 70.5t-61 24.5q-25 0 -38 -10.5t-22 -43.5z" />
+<glyph unicode="&#x159;" horiz-adv-x="389" d="M411 690l-162 -174h-82l-88 174h51l90 -97l134 97h57zM160 253h1q60 121 95.5 165t75.5 44q26 0 41.5 -18t15.5 -48q0 -31 -16.5 -52t-41.5 -21q-22 0 -37.5 19t-23.5 19q-23 0 -65 -76q-36 -65 -74 -186l-31 -99h-121q102 345 102 382q0 14 -11.5 19.5t-44.5 5.5v27 q131 11 200 28z" />
+<glyph unicode="&#x15a;" horiz-adv-x="556" d="M200 723l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM526 681l-40 -202l-27 4q-9 76 -22 101q-33 66 -116 66q-41 0 -69.5 -29t-28.5 -76q0 -41 22.5 -66.5t84.5 -70.5q80 -58 109 -104t29 -113q0 -63 -29 -110.5t-81 -73.5 q-52 -25 -120 -25q-53 0 -122 24q-32 11 -46 11t-21.5 -6.5t-16.5 -28.5h-30l36 225l29 -2q7 -54 16 -84t32 -55q44 -50 106 -50q56 0 89 34q37 37 37 92q0 43 -25.5 75.5t-89.5 78.5q-66 47 -98 92.5t-32 105.5q0 84 58.5 137.5t145.5 53.5q50 0 91.5 -15t54.5 -15 q31 0 44 26h30z" />
+<glyph unicode="&#x15b;" horiz-adv-x="389" d="M139 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM333 461l-23 -154l-27 2q-12 63 -33 91.5t-55 28.5q-24 0 -38.5 -14.5t-14.5 -38.5q0 -33 57 -99q80 -93 80 -162q0 -56 -43 -92t-105 -36q-35 0 -64 12q-21 8 -30 8 q-20 0 -29 -20h-27l22 166l27 -3q17 -133 93 -133q29 0 44.5 14.5t15.5 39.5q0 41 -56 104q-50 56 -65 87.5t-15 73.5q0 59 36.5 92.5t97.5 33.5q33 0 58 -12q21 -10 37 -10q11 0 16 4t12 17h29z" />
+<glyph unicode="&#x15c;" horiz-adv-x="556" d="M484 723h-51l-88 95l-131 -95h-57l160 174h81zM526 681l-40 -202l-27 4q-9 76 -22 101q-33 66 -116 66q-41 0 -69.5 -29t-28.5 -76q0 -41 22.5 -66.5t84.5 -70.5q80 -58 109 -104t29 -113q0 -63 -29 -110.5t-81 -73.5q-52 -25 -120 -25q-53 0 -122 24q-32 11 -46 11 t-21.5 -6.5t-16.5 -28.5h-30l36 225l29 -2q7 -54 16 -84t32 -55q44 -50 106 -50q56 0 89 34q37 37 37 92q0 43 -25.5 75.5t-89.5 78.5q-66 47 -98 92.5t-32 105.5q0 84 58.5 137.5t145.5 53.5q50 0 91.5 -15t54.5 -15q31 0 44 26h30z" />
+<glyph unicode="&#x15d;" horiz-adv-x="389" d="M367 516h-51l-88 95l-131 -95h-57l160 174h81zM333 461l-23 -154l-27 2q-12 63 -33 91.5t-55 28.5q-24 0 -38.5 -14.5t-14.5 -38.5q0 -33 57 -99q80 -93 80 -162q0 -56 -43 -92t-105 -36q-35 0 -64 12q-21 8 -30 8q-20 0 -29 -20h-27l22 166l27 -3q17 -133 93 -133 q29 0 44.5 14.5t15.5 39.5q0 41 -56 104q-50 56 -65 87.5t-15 73.5q0 59 36.5 92.5t97.5 33.5q33 0 58 -12q21 -10 37 -10q11 0 16 4t12 17h29z" />
+<glyph unicode="&#x15e;" horiz-adv-x="556" d="M172 -92l51 74q-46 3 -107 24q-32 11 -46 11t-21.5 -6.5t-16.5 -28.5h-30l36 225l29 -2q7 -54 16 -84t32 -55q44 -50 106 -50q56 0 89 34q37 37 37 92q0 43 -25.5 75.5t-89.5 78.5q-66 47 -98 92.5t-32 105.5q0 84 58.5 137.5t145.5 53.5q50 0 91.5 -15t54.5 -15 q31 0 44 26h30l-40 -202l-27 4q-9 76 -22 101q-33 66 -116 66q-41 0 -69.5 -29t-28.5 -76q0 -41 22.5 -66.5t84.5 -70.5q80 -58 109 -104t29 -113q0 -63 -29 -110.5t-81 -73.5q-39 -20 -91 -24l-30 -45q15 3 26 3q39 0 64.5 -20.5t25.5 -51.5q0 -37 -35.5 -62t-88.5 -25 q-51 0 -112 25l22 33q38 -17 67 -17q26 0 41 11t15 30q0 36 -47 36q-14 0 -30 -4z" />
+<glyph unicode="&#x15f;" horiz-adv-x="389" d="M65 -92l54 79q-25 1 -52 12q-21 8 -30 8q-20 0 -29 -20h-27l22 166l27 -3q17 -133 93 -133q29 0 44.5 14.5t15.5 39.5q0 41 -56 104q-50 56 -65 87.5t-15 73.5q0 59 36.5 92.5t97.5 33.5q33 0 58 -12q21 -10 37 -10q11 0 16 4t12 17h29l-23 -154l-27 2q-12 63 -33 91.5 t-55 28.5q-24 0 -38.5 -14.5t-14.5 -38.5q0 -33 57 -99q80 -93 80 -162q0 -47 -32 -81t-82 -44l-35 -52q15 3 26 3q39 0 64.5 -20.5t25.5 -51.5q0 -37 -35.5 -62t-88.5 -25q-51 0 -112 25l22 33q38 -17 67 -17q26 0 41 11t15 30q0 36 -47 36q-14 0 -30 -4z" />
+<glyph unicode="&#x160;" horiz-adv-x="556" d="M516 897l-162 -174h-82l-88 174h51l90 -97l134 97h57zM526 681l-40 -202l-27 4q-9 76 -22 101q-33 66 -116 66q-41 0 -69.5 -29t-28.5 -76q0 -41 22.5 -66.5t84.5 -70.5q80 -58 109 -104t29 -113q0 -63 -29 -110.5t-81 -73.5q-52 -25 -120 -25q-53 0 -122 24 q-32 11 -46 11t-21.5 -6.5t-16.5 -28.5h-30l36 225l29 -2q7 -54 16 -84t32 -55q44 -50 106 -50q56 0 89 34q37 37 37 92q0 43 -25.5 75.5t-89.5 78.5q-66 47 -98 92.5t-32 105.5q0 84 58.5 137.5t145.5 53.5q50 0 91.5 -15t54.5 -15q31 0 44 26h30z" />
+<glyph unicode="&#x161;" horiz-adv-x="389" d="M411 690l-162 -174h-82l-88 174h51l90 -97l134 97h57zM333 461l-23 -154l-27 2q-12 63 -33 91.5t-55 28.5q-24 0 -38.5 -14.5t-14.5 -38.5q0 -33 57 -99q80 -93 80 -162q0 -56 -43 -92t-105 -36q-35 0 -64 12q-21 8 -30 8q-20 0 -29 -20h-27l22 166l27 -3 q17 -133 93 -133q29 0 44.5 14.5t15.5 39.5q0 41 -56 104q-50 56 -65 87.5t-15 73.5q0 59 36.5 92.5t97.5 33.5q33 0 58 -12q21 -10 37 -10q11 0 16 4t12 17h29z" />
+<glyph unicode="&#x162;" horiz-adv-x="611" d="M190 0h-141v25h15q72 0 91 72l148 537q-79 -2 -130 -34t-88 -109l-25 7l39 171h551l-36 -192l-27 2q0 85 -31.5 120t-106.5 35l-135 -489q-17 -58 -17 -74q0 -46 83 -46v-25h-146l-42 -62q15 3 26 3q39 0 64.5 -20.5t25.5 -51.5q0 -37 -35.5 -62t-88.5 -25q-51 0 -112 25 l22 33q38 -17 67 -17q26 0 41 11t15 30q0 36 -47 36q-14 0 -30 -4l-13 12z" />
+<glyph unicode="&#x163;" horiz-adv-x="278" d="M-20 -92l59 86q-42 11 -42 62q0 28 25 115l67 236h-52v35q62 21 103 55t81 97h35l-39 -145h72v-42h-83l-34 -119q-53 -185 -53 -209q0 -18 16 -18q25 0 76 80l23 -15q-45 -69 -79.5 -99t-73.5 -35l-36 -54q15 3 26 3q39 0 64.5 -20.5t25.5 -51.5q0 -37 -35.5 -62 t-88.5 -25q-51 0 -112 25l22 33q38 -17 67 -17q26 0 41 11t15 30q0 36 -47 36q-14 0 -30 -4z" />
+<glyph unicode="&#x164;" horiz-adv-x="611" d="M596 897l-162 -174h-82l-88 174h51l90 -97l134 97h57zM650 669l-36 -192l-27 2q0 85 -31.5 120t-106.5 35l-135 -489q-17 -58 -17 -74q0 -46 83 -46v-25h-331v25h15q72 0 91 72l148 537q-79 -2 -130 -34t-88 -109l-25 7l39 171h551z" />
+<glyph unicode="&#x165;" horiz-adv-x="411" d="M308 394l-13 25q118 63 118 116q0 21 -30 37q-40 22 -40 65q0 35 20.5 54t52.5 19q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5zM266 407h-68l-34 -119q-53 -183 -53 -209q0 -18 16 -18q27 0 76 80l23 -15q-25 -40 -44 -64.5t-53.5 -47.5t-72.5 -23q-67 0 -67 65 q0 31 25 115l67 236h-52v35q64 22 105 56.5t79 95.5h35l-39 -145h57v-42z" />
+<glyph unicode="&#x166;" horiz-adv-x="611" d="M100 322l9 34h117l77 278q-79 -2 -130 -34t-88 -109l-25 7l39 171h551l-36 -192l-27 2q0 85 -31.5 120t-106.5 35l-77 -278h114l-9 -34h-114l-49 -177q-17 -58 -17 -74q0 -46 83 -46v-25h-331v25h15q72 0 91 72l62 225h-117z" />
+<glyph unicode="&#x167;" horiz-adv-x="278" d="M-30 232l16 56h61l34 119h-52v35q62 21 103 55t81 97h35l-39 -145h72v-42h-83l-34 -119h92l-16 -56h-92q-37 -133 -37 -153q0 -18 16 -18q25 0 76 80l23 -15q-49 -76 -86.5 -105.5t-83.5 -29.5q-67 0 -67 65q0 28 25 115l17 61h-61z" />
+<glyph unicode="&#x168;" horiz-adv-x="722" d="M599 841h41q-16 -63 -44 -91t-73 -28q-25 0 -57 13l-59 23q-21 8 -38 8q-31 0 -48 -43h-40q10 54 41.5 86t74.5 32q38 0 97 -26q39 -16 54 -16q17 0 28.5 9t22.5 33zM744 669v-25q-32 -6 -44.5 -14t-25.5 -36.5t-32 -96.5l-65 -234q-25 -89 -52.5 -145t-68.5 -89 q-59 -47 -166 -47q-101 0 -162 42.5t-61 120.5q0 47 37 189l51 193q15 55 15 78q0 17 -9 25.5t-32 10.5l-32 3v25h311v-25q-46 -2 -64 -16.5t-30 -59.5l-81 -294q-28 -101 -28 -135q0 -101 122 -101q78 0 123 47q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25h207z" />
+<glyph unicode="&#x169;" horiz-adv-x="556" d="M449 655h41q-16 -63 -44 -91t-73 -28q-25 0 -57 13l-59 23q-21 8 -38 8q-31 0 -48 -43h-40q10 54 41.5 86t74.5 32q38 0 97 -26q39 -16 54 -16q17 0 28.5 9t22.5 33zM471 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5 t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#x16a;" horiz-adv-x="722" d="M641 793l-16 -70h-326l17 70h325zM744 669v-25q-32 -6 -44.5 -14t-25.5 -36.5t-32 -96.5l-65 -234q-25 -89 -52.5 -145t-68.5 -89q-59 -47 -166 -47q-101 0 -162 42.5t-61 120.5q0 47 37 189l51 193q15 55 15 78q0 17 -9 25.5t-32 10.5l-32 3v25h311v-25 q-46 -2 -64 -16.5t-30 -59.5l-81 -294q-28 -101 -28 -135q0 -101 122 -101q78 0 123 47q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25h207z" />
+<glyph unicode="&#x16b;" horiz-adv-x="556" d="M481 586l-16 -70h-326l17 70h325zM471 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25 q28 0 70 55q47 61 75.5 125t66.5 206h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#x16c;" horiz-adv-x="722" d="M589 885h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM744 669v-25q-32 -6 -44.5 -14t-25.5 -36.5t-32 -96.5l-65 -234q-25 -89 -52.5 -145t-68.5 -89q-59 -47 -166 -47q-101 0 -162 42.5t-61 120.5q0 47 37 189l51 193q15 55 15 78 q0 17 -9 25.5t-32 10.5l-32 3v25h311v-25q-46 -2 -64 -16.5t-30 -59.5l-81 -294q-28 -101 -28 -135q0 -101 122 -101q78 0 123 47q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25h207z" />
+<glyph unicode="&#x16d;" horiz-adv-x="556" d="M439 678h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5zM471 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28 v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#x16e;" horiz-adv-x="722" d="M567 815q0 -44 -31.5 -75.5t-75.5 -31.5q-48 0 -77 30t-29 78q0 44 31.5 74.5t75.5 30.5q47 0 76.5 -30.5t29.5 -75.5zM519 813q0 25 -17.5 42.5t-42.5 17.5q-23 0 -40 -17.5t-17 -41.5t17 -41t40 -17q25 0 42.5 17t17.5 40zM744 669v-25q-32 -6 -44.5 -14t-25.5 -36.5 t-32 -96.5l-65 -234q-25 -89 -52.5 -145t-68.5 -89q-59 -47 -166 -47q-101 0 -162 42.5t-61 120.5q0 47 37 189l51 193q15 55 15 78q0 17 -9 25.5t-32 10.5l-32 3v25h311v-25q-46 -2 -64 -16.5t-30 -59.5l-81 -294q-28 -101 -28 -135q0 -101 122 -101q78 0 123 47 q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25h207z" />
+<glyph unicode="&#x16f;" horiz-adv-x="556" d="M417 623q0 -44 -31.5 -75.5t-75.5 -31.5q-48 0 -77 30t-29 78q0 44 31.5 74.5t75.5 30.5q47 0 76.5 -30.5t29.5 -75.5zM369 621q0 25 -17.5 42.5t-42.5 17.5q-23 0 -40 -17.5t-17 -41.5t17 -41t40 -17q25 0 42.5 17t17.5 40zM471 133l22 -13q-39 -67 -76.5 -98t-82.5 -31 q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21 q24 0 72 74z" />
+<glyph unicode="&#x170;" horiz-adv-x="722" d="M438 708l122 133q43 48 70 48q20 0 34 -14t14 -33q0 -27 -39 -49l-151 -85h-50zM249 708l122 133q43 48 70 48q20 0 34 -13t14 -32q0 -29 -39 -51l-149 -85h-52zM744 669v-25q-32 -6 -44.5 -14t-25.5 -36.5t-32 -96.5l-65 -234q-25 -89 -52.5 -145t-68.5 -89 q-59 -47 -166 -47q-101 0 -162 42.5t-61 120.5q0 47 37 189l51 193q15 55 15 78q0 17 -9 25.5t-32 10.5l-32 3v25h311v-25q-46 -2 -64 -16.5t-30 -59.5l-81 -294q-28 -101 -28 -135q0 -101 122 -101q78 0 123 47q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25h207z" />
+<glyph unicode="&#x171;" horiz-adv-x="556" d="M287 516l122 133q43 48 70 48q20 0 34 -14t14 -33q0 -27 -39 -49l-151 -85h-50zM98 516l122 133q43 48 70 48q20 0 34 -13t14 -32q0 -29 -39 -51l-149 -85h-52zM471 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5 t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#x172;" horiz-adv-x="722" d="M496 -84l22 -14q-19 -35 -53 -55t-73 -20q-47 0 -75 21t-28 60q0 35 29 75q-9 -1 -28 -1q-101 0 -162 42.5t-61 120.5q0 47 37 189l51 193q15 55 15 78q0 17 -9 25.5t-32 10.5l-32 3v25h311v-25q-46 -2 -64 -16.5t-30 -59.5l-81 -294q-28 -101 -28 -135q0 -101 122 -101 q78 0 123 47q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25h207v-25q-32 -6 -44.5 -14t-25.5 -36.5t-32 -96.5l-65 -234q-25 -89 -52.5 -145t-68.5 -89q-36 -28 -79 -37q-4 -20 -4 -34q0 -62 61 -62q22 0 48 13z" />
+<glyph unicode="&#x173;" horiz-adv-x="556" d="M337 -9h-3q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206h118l-78 -266q-25 -88 -25 -103 q0 -21 14 -21q24 0 72 74l22 -13q-52 -87 -99 -113q-8 -37 -8 -49q0 -62 61 -62q22 0 48 13l14 7l22 -14q-19 -35 -53 -55t-73 -20q-47 0 -75 21t-28 60q0 37 35 83z" />
+<glyph unicode="&#x174;" horiz-adv-x="889" d="M704 723h-51l-88 95l-131 -95h-57l160 174h81zM940 669v-24q-32 -5 -48 -19t-40 -63l-282 -581h-29l-59 489l-233 -489h-29l-78 572q-8 54 -19.5 68.5t-58.5 22.5v24h278v-25q-35 -4 -48 -15t-13 -35q0 -14 1 -19l40 -349l149 314q0 60 -12.5 79.5t-57.5 25.5v24h267v-25 q-39 -4 -50.5 -14.5t-11.5 -39.5q0 -5 7 -73l33 -291l155 327q15 33 15 46q0 27 -10.5 34.5t-52.5 10.5v25h187z" />
+<glyph unicode="&#x175;" horiz-adv-x="667" d="M534 516h-51l-88 95l-131 -95h-57l160 174h81zM387 462l31 -333q120 140 120 187q0 15 -20 38q-22 25 -22 48q0 29 16.5 44.5t40.5 15.5q25 0 43 -18.5t18 -43.5q0 -131 -272 -413h-27l-23 285q-85 -158 -114 -201l-56 -84h-27v46q0 4 0.5 24.5t0.5 37.5 q0 94 -11.5 191.5t-26.5 110.5q-11 10 -43 10v27q110 18 156 28q33 -123 33 -274l156 274h27z" />
+<glyph unicode="&#x176;" horiz-adv-x="611" d="M564 723h-51l-88 95l-131 -95h-57l160 174h81zM659 669v-25q-27 -4 -46.5 -20t-45.5 -52l-189 -264l-52 -191q-10 -40 -10 -51q0 -22 17 -31.5t62 -9.5v-25h-323v25q52 5 72 18.5t32 59.5l57 208l-87 270q-12 35 -23.5 45t-51.5 18v25h285v-25q-42 -2 -55.5 -9.5 t-13.5 -29.5q0 -19 29 -110l46 -143l128 183q28 40 28 67q0 23 -13 32t-53 10v25h207z" />
+<glyph unicode="&#x177;" horiz-adv-x="444" d="M393 516h-51l-88 95l-131 -95h-57l160 174h81zM239 110h2q52 99 69.5 141t17.5 66q0 13 -25 34q-31 25 -31 54q0 21 16 39t42 18q25 0 43.5 -19t18.5 -45q0 -76 -75.5 -227t-173.5 -270q-41 -50 -87.5 -78t-87.5 -28q-26 0 -44 17.5t-18 42.5q0 22 15.5 39t34.5 17 q25 0 51 -18t43 -18q13 0 32 15t35 37q25 35 25 71q0 50 -50 288q-21 94 -40 113q-8 8 -14.5 10t-25.5 2v27q86 8 150 24q43 -111 66 -274z" />
+<glyph unicode="&#x178;" horiz-adv-x="611" d="M659 669v-25q-27 -4 -46.5 -20t-45.5 -52l-189 -264l-52 -191q-10 -40 -10 -51q0 -22 17 -31.5t62 -9.5v-25h-323v25q52 5 72 18.5t32 59.5l57 208l-87 270q-12 35 -23.5 45t-51.5 18v25h285v-25q-42 -2 -55.5 -9.5t-13.5 -29.5q0 -19 29 -110l46 -143l128 183 q28 40 28 67q0 23 -13 32t-53 10v25h207zM293 862q27 0 46.5 -19.5t19.5 -46.5q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45q0 27 19 46.5t45 19.5zM505 862q27 0 46.5 -19.5t19.5 -46.5q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45q0 27 19 46.5t45 19.5z " />
+<glyph unicode="&#x179;" horiz-adv-x="611" d="M270 723l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM589 640l-434 -605h75q70 0 115.5 11t83.5 39q49 37 97 114l27 -5l-60 -194h-505v29l434 605h-83q-79 0 -133.5 -32t-113.5 -115l-28 4l58 178h467v-29z" />
+<glyph unicode="&#x17a;" horiz-adv-x="389" d="M139 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM368 439l-281 -335q52 -23 86 -69q6 -8 19 -32.5t24.5 -38t24.5 -13.5q10 0 16 5t6 12q0 6 -10 18t-10 27q0 21 15 37t35 16q21 0 37 -16t16 -37q0 -45 -31 -68t-79 -23 q-59 0 -129 50q-46 33 -74 33q-13 0 -32 -14q-12 -10 -19 -14l-25 22l292 354h-136q-29 0 -45.5 -13.5t-27.5 -47.5l-27 3l44 154h311v-10z" />
+<glyph unicode="&#x17b;" horiz-adv-x="611" d="M589 640l-434 -605h75q70 0 115.5 11t83.5 39q49 37 97 114l27 -5l-60 -194h-505v29l434 605h-83q-79 0 -133.5 -32t-113.5 -115l-28 4l58 178h467v-29zM369 862q27 0 46.5 -19.5t19.5 -46.5q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45q0 27 19 46.5t45 19.5z " />
+<glyph unicode="&#x17c;" horiz-adv-x="389" d="M293 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM368 439l-281 -335q52 -23 86 -69q6 -8 19 -32.5t24.5 -38t24.5 -13.5q10 0 16 5t6 12q0 6 -10 18t-10 27q0 21 15 37t35 16q21 0 37 -16t16 -37 q0 -45 -31 -68t-79 -23q-59 0 -129 50q-46 33 -74 33q-13 0 -32 -14q-12 -10 -19 -14l-25 22l292 354h-136q-29 0 -45.5 -13.5t-27.5 -47.5l-27 3l44 154h311v-10z" />
+<glyph unicode="&#x17d;" horiz-adv-x="611" d="M556 897l-162 -174h-82l-88 174h51l90 -97l134 97h57zM589 640l-434 -605h75q70 0 115.5 11t83.5 39q49 37 97 114l27 -5l-60 -194h-505v29l434 605h-83q-79 0 -133.5 -32t-113.5 -115l-28 4l58 178h467v-29z" />
+<glyph unicode="&#x17e;" horiz-adv-x="389" d="M411 690l-162 -174h-82l-88 174h51l90 -97l134 97h57zM368 439l-281 -335q52 -23 86 -69q6 -8 19 -32.5t24.5 -38t24.5 -13.5q10 0 16 5t6 12q0 6 -10 18t-10 27q0 21 15 37t35 16q21 0 37 -16t16 -37q0 -45 -31 -68t-79 -23q-59 0 -129 50q-46 33 -74 33q-13 0 -32 -14 q-12 -10 -19 -14l-25 22l292 354h-136q-29 0 -45.5 -13.5t-27.5 -47.5l-27 3l44 154h311v-10z" />
+<glyph unicode="&#x17f;" horiz-adv-x="333" d="M165 418h-41l10 44h41q30 130 80 178q28 27 59.5 39t83.5 12q60 0 99 -28.5t39 -70.5q0 -28 -17.5 -46t-45.5 -18q-25 0 -42 17t-17 38t11 37.5t11 21.5q0 18 -27 18t-42.5 -17.5t-25.5 -61.5l-107 -474q-6 -25 -6 -41q0 -23 15.5 -32t54.5 -10l-6 -24h-278l6 24 q35 4 49 16.5t22 46.5z" />
+<glyph unicode="&#x180;" d="M232 515l-39 -142q65 89 144 89q47 0 77 -37.5t30 -93.5q0 -135 -97 -239.5t-223 -104.5q-53 0 -95.5 17.5t-42.5 43.5q0 9 20 81l110 386h-115l14 46h114q10 39 10 51q0 30 -46 30h-19v27q123 14 210 30l-39 -138h118l-13 -46h-118zM319 325q0 69 -41 69q-52 0 -92 -84 q-24 -52 -62 -182q-15 -51 -15 -81q0 -12 8.5 -19.5t22.5 -7.5q55 0 108 78q30 43 50.5 112t20.5 115z" />
+<glyph unicode="&#x188;" horiz-adv-x="560" d="M361 435l17 63q10 35 39.5 56.5t77.5 21.5q54 0 93 -27t39 -74q0 -27 -17 -45t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -25 19q-65 0 -79 -57l-34 -136q-12 -51 -60 -51q-25 0 -41.5 15t-16.5 38q0 16 10.5 32t10.5 26q0 7 -7.5 12t-16.5 5 q-26 0 -47.5 -22.5t-45.5 -65.5q-53 -98 -53 -201q0 -43 19.5 -66t53.5 -23q32 0 59 20t63 71l28 -18l-38 -50q-13 -17 -34.5 -37.5t-42.5 -31.5q-35 -18 -83 -18q-70 0 -111.5 39.5t-41.5 111.5q0 134 105 239q83 85 180 85q48 0 81 -27z" />
+<glyph unicode="&#x190;" horiz-adv-x="512" d="M566 174l39 -12q-56 -95 -135.5 -130.5t-185.5 -35.5q-42 0 -80.5 7t-73 22t-55.5 42.5t-21 65.5q0 73 54 136t129 85q-36 11 -61 43.5t-25 70.5q0 55 30.5 99t78 68.5t99.5 37.5t102 13q75 0 119 -18q39 -16 67.5 -43t28.5 -59q0 -29 -14 -48.5t-43 -19.5 q-30 0 -46.5 19t-24.5 60q-5 25 -26.5 40.5t-58.5 15.5q-60 0 -108.5 -54t-48.5 -137q0 -12 3.5 -24t16 -23.5t33.5 -11.5q17 0 50 5.5t48 5.5q22 0 38.5 -8t16.5 -25q0 -20 -26 -33.5t-51 -13.5q-6 0 -43.5 2.5t-45.5 2.5q-51 0 -94 -53.5t-43 -122.5q0 -78 113 -78 q44 0 69.5 2.5t60.5 12t63 33t51 61.5z" />
+<glyph unicode="&#x192;" d="M86 440h107q28 126 89.5 196.5t144.5 70.5q47 0 78.5 -25t31.5 -62q0 -28 -16.5 -44.5t-43.5 -16.5q-24 0 -38.5 13.5t-14.5 36.5q0 21 20 40q9 9 9 13q0 15 -25 15q-32 0 -54 -37q-22 -39 -49 -200h118l-9 -44h-116l-27 -154q-35 -202 -101 -300t-167 -98 q-49 0 -79.5 24t-30.5 63q0 26 16 43t41 17q22 0 37.5 -14.5t15.5 -35.5q0 -17 -18 -38q-10 -10 -10 -17q0 -13 25 -13q24 0 38 15q34 34 55 144l70 364h-105z" />
+<glyph unicode="&#x195;" horiz-adv-x="735" d="M467 338l-80 -251q-7 -19 -7 -28q0 -19 34 -19q83 0 148.5 84.5t65.5 165.5q0 20 -5.5 31t-18.5 22t-18 17q-19 23 -19 48q0 20 16.5 37t40.5 17q68 0 68 -112q0 -85 -38 -166.5t-112.5 -137.5t-165.5 -56q-55 0 -83.5 13.5t-28.5 51.5q0 23 9 52l76 232q6 18 6 30 q0 21 -20 21q-44 0 -108 -94q-36 -53 -58 -108t-61 -188h-121l152 562q10 37 10 47q0 33 -42 33h-22v27q99 9 209 30l-108 -416q74 105 118 142t95 37q37 0 56.5 -20t19.5 -55q0 -23 -8 -49z" />
+<glyph unicode="&#x199;" d="M483 449v-25q-37 -5 -61.5 -18.5t-73.5 -57.5l-64 -58q19 -95 33 -145.5t24 -66t22 -15.5q28 0 64 64l22 -11q-32 -68 -65 -96t-73 -28q-47 0 -72.5 46.5t-50.5 176.5l-39 -27l-50 -188h-122l135 486q25 88 74.5 146.5t124.5 58.5q64 0 103 -28t39 -72q0 -28 -17 -46 t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-50 0 -67 -65l-96 -357q95 75 130 109.5t35 53.5q0 12 -10.5 16.5t-39.5 6.5v25h206z" />
+<glyph unicode="&#x19a;" horiz-adv-x="278" d="M290 699l-87 -313h51l-13 -46h-51l-45 -164q-22 -79 -22 -100q0 -15 15 -15q25 0 79 80l22 -14q-52 -80 -87 -108t-82 -28q-30 0 -49 18t-19 45q0 34 34 155l37 131h-55l12 46h56l24 82q34 118 34 145q0 30 -42 30q-11 0 -22 -1v27q98 9 210 30z" />
+<glyph unicode="&#x19b;" horiz-adv-x="480" d="M452 568l-79 -56l53 -512h-40l-27 294l-193 -294h-150l322 474l-1 15l-184 -134v67l176 124q-3 25 -14.5 44t-23.5 19q-18 0 -18 -18q0 -2 1.5 -8t1.5 -10q0 -23 -17.5 -38t-42.5 -15q-28 0 -45 19t-17 48q0 35 27 57t70 22q85 0 110 -97l91 67v-68z" />
+<glyph unicode="&#x19e;" horiz-adv-x="536" d="M178 263h1q51 75 73 103.5t49 54.5q43 41 100 41q73 0 73 -77q0 -34 -28 -116l-161 -474h-118l179 546q7 23 7 28q0 21 -24 21q-13 0 -33 -16.5t-36 -37.5q-47 -62 -79 -135t-66 -201h-121l57 204q45 164 45 179q0 14 -11.5 18.5t-43.5 5.5v27q90 3 199 27z" />
+<glyph unicode="&#x1a0;" horiz-adv-x="722" d="M806 649q0 -32 -20 -53.5t-51 -27.5q-16 -4 -73 -4q29 -55 29 -120q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q118 0 187 -82q30 -18 52 -18q43 0 44 26q-41 25 -41 56q0 17 15 33t38 16 q26 0 44 -18t18 -49zM547 528q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#x1a1;" horiz-adv-x="537" d="M307 462h4q87 0 130 -59q1 -1 10 -9.5t16.5 -13t15.5 -4.5q21 0 29 6.5t9 20.5q-42 26 -42 57q0 17 16 32t39 15q25 0 43 -17.5t18 -46.5q0 -33 -20 -55.5t-51 -28.5q-13 -4 -62 -4q6 -21 6 -44q0 -69 -29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5 t-45.5 109.5q0 73 27 139t73 111q79 77 183 77zM349 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#x1a5;" horiz-adv-x="520" d="M197 347h1q41 64 77.5 89.5t80.5 25.5q53 0 81.5 -32.5t28.5 -88.5q0 -138 -85 -246t-192 -108q-38 0 -68 22l-12 -41q-24 -83 -24 -114q0 -18 13.5 -24.5t51.5 -7.5v-27h-250v27q36 0 50 15t28 71l138 545q56 220 195 220q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18 q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -28 19q-27 0 -43 -17.5t-27 -56.5zM341 336q0 55 -39 55q-40 0 -87 -71q-13 -19 -20 -37t-24 -76q-38 -128 -38 -149q0 -15 11.5 -25.5t27.5 -10.5q30 0 62 30q46 45 76.5 137t30.5 147z" />
+<glyph unicode="&#x1aa;" horiz-adv-x="400" d="M233 455h-18q-36 0 -70 31t-34 83q0 47 37 81t87 34q60 0 102.5 -42.5t42.5 -89.5q0 -56 -27 -133l-155 -429q-10 -28 -24.5 -81.5t-14.5 -72.5q0 -13 0.5 -19.5t6 -13t15.5 -6.5q9 0 16 4.5t7 9.5q0 3 -9 18t-9 30q0 19 15 33t38 14q24 0 39 -17.5t15 -43.5 q0 -35 -29 -56.5t-80 -21.5q-68 0 -103 33t-35 92q0 48 27 124zM276 569q0 24 -18 41.5t-41 17.5q-26 0 -42 -18t-16 -42q0 -23 18 -40t39 -17q25 0 42.5 16.5t17.5 41.5z" />
+<glyph unicode="&#x1ab;" horiz-adv-x="286" d="M289 407h-83l-34 -119q-53 -185 -53 -209q0 -18 16 -18q25 0 76 80l23 -15l-54 -197q-8 -28 -12.5 -42.5t-14 -38t-19.5 -35.5t-26 -21.5t-35 -9.5q-60 0 -91 27t-31 73q0 28 17 46t45 18q25 0 42 -17t17 -40q0 -20 -11 -36.5t-11 -20.5q0 -7 6.5 -13t18.5 -6q18 0 31 20 t28 74l38 136q-49 -52 -108 -52q-67 0 -67 65q0 28 25 115l67 236h-52v35q62 21 103 55t81 97h35l-39 -145h72v-42z" />
+<glyph unicode="&#x1ad;" horiz-adv-x="360" d="M37 407v35q42 15 70 32q33 118 84 166q26 23 59 37t57 14q64 0 103.5 -28t39.5 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -28 19q-26 0 -42 -15t-25 -51l-39 -145h72v-42h-83l-34 -119q-53 -185 -53 -209q0 -18 16 -18q25 0 76 80 l23 -15q-49 -76 -86.5 -105.5t-83.5 -29.5q-67 0 -67 65q0 28 25 115l67 236h-52z" />
+<glyph unicode="&#x1af;" horiz-adv-x="775" d="M537 669h227q55 0 55 29q-15 9 -21 13.5t-13.5 17.5t-7.5 30q0 14 15.5 29t38.5 15q26 0 44 -16.5t18 -47.5q0 -34 -22 -55t-54 -28q-5 -1 -41.5 -7t-50.5 -9q-30 -8 -44.5 -32t-38.5 -111l-65 -234q-25 -89 -52.5 -145t-68.5 -89q-59 -47 -166 -47q-101 0 -162 42.5 t-61 120.5q0 47 37 189l51 193q15 55 15 78q0 17 -9 25.5t-32 10.5l-32 3v25h311v-25q-46 -2 -64 -16.5t-30 -59.5l-81 -294q-28 -101 -28 -135q0 -101 122 -101q78 0 123 47q49 51 90 197l57 209q19 70 19 96q0 57 -79 57v25z" />
+<glyph unicode="&#x1b0;" horiz-adv-x="556" d="M370 449h118q28 0 56 3q37 5 38 27q-42 12 -42 55q0 18 15.5 33.5t39.5 15.5q25 0 43 -17t18 -47q0 -33 -21.5 -58.5t-51.5 -31.5q-30 -7 -102 -7l-71 -239q-25 -82 -25 -103t14 -21q24 0 72 74l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1 q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206z" />
+<glyph unicode="&#x1ba;" horiz-adv-x="496" d="M458 423l-236 -167q15 4 45 4q56 0 87.5 -25t31.5 -67t-30.5 -82t-75.5 -62l-181 -90q-29 -14 -49.5 -37.5t-20.5 -48.5q0 -22 13.5 -35t35.5 -13q24 0 44.5 13.5t25.5 39.5q11 64 66 64q30 0 44.5 -15t14.5 -35q0 -51 -65 -80q-54 -24 -121 -24q-68 0 -107 29 q-32 26 -32 69q0 91 114 152q34 18 145 70q50 25 50 69q0 21 -20 32.5t-51 11.5q-62 0 -122 -47l-21 24l285 204h-189q-20 0 -50.5 -23.5t-44.5 -59.5h-26l76 156h364v-27z" />
+<glyph unicode="&#x1bb;" d="M469 376l-16 -62h-111l-40 -36l-196 -167h138q63 0 94 14.5t57 65.5h24l-80 -191h-366v24l89 92q136 140 177 198h-233l15 62h262q29 53 29 100q0 117 -92 117q-76 0 -134 -86l-22 12q30 74 86 119t132 45q74 0 119 -46.5t45 -121.5q0 -71 -50 -139h73z" />
+<glyph unicode="&#x1be;" d="M304 438l-10 -47q14 2 31 2q70 0 104 -42.5t34 -107.5q0 -110 -78.5 -181.5t-190.5 -71.5q-50 0 -100 26q-57 30 -57 80q0 17 14 32.5t39 15.5q54 0 71 -61q6 -21 10.5 -32t15.5 -21.5t28 -10.5q42 0 80.5 70t38.5 117q0 41 -27.5 65t-65.5 24h-32l38 143h-64l13 46h64 l15 57h52l-12 -57h111l-13 -46h-109z" />
+<glyph unicode="&#x1c0;" horiz-adv-x="208" d="M278 740l-198 -740h-66l198 740h66z" />
+<glyph unicode="&#x1c1;" horiz-adv-x="345" d="M278 740l-198 -740h-66l198 740h66zM415 740l-198 -740h-66l198 740h66z" />
+<glyph unicode="&#x1c2;" horiz-adv-x="368" d="M438 476l-18 -66h-148l-23 -84h148l-17 -66h-148l-70 -260h-66l70 260h-152l17 66h152l23 84h-152l18 66h152l70 264h66l-70 -264h148z" />
+<glyph unicode="&#x1c3;" horiz-adv-x="300" d="M168 203l-31 9q47 233 55 354q4 55 21.5 86.5t64.5 31.5q77 0 77 -73q0 -20 -6 -36t-26 -53q-97 -178 -155 -319zM214 70q0 -36 -24 -59.5t-60 -23.5q-35 0 -60 24.5t-25 59.5q0 37 23.5 61t60.5 24q36 0 60.5 -24.5t24.5 -61.5z" />
+<glyph unicode="&#x1f0;" horiz-adv-x="350" d="M474 690l-162 -174h-82l-88 174h51l90 -97l134 97h57zM324 462l-37 -140l-79 -304q-31 -119 -81 -172t-126 -53q-47 0 -76 22t-29 55q0 22 14.5 37.5t34.5 15.5q22 0 35.5 -13.5t13.5 -35.5q0 -11 -7.5 -20t-7.5 -15q0 -15 24 -15q21 0 38 31t36 105l89 350q12 45 12 67 q0 30 -41 30h-22v27q136 12 209 28z" />
+<glyph unicode="&#x1fa;" horiz-adv-x="667" d="M419 646l88 -523q11 -62 25 -78.5t61 -19.5v-25h-303v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l355 558q-44 24 -44 78q0 36 27 63t65 27q35 0 62 -26.5t27 -62.5q0 -38 -26.5 -65t-63.5 -27h-1 zM346 248l-37 243l-148 -243h185zM462 736q0 18 -11.5 30.5t-32.5 12.5q-18 0 -29.5 -12.5t-11.5 -29.5t12.5 -30t28.5 -13q18 0 31 12.5t13 29.5zM304 825l146 125q25 22 44 22q32 0 32 -33q0 -7 -2 -12t-9.5 -10.5t-13 -9t-20.5 -11.5l-132 -71h-45z" />
+<glyph unicode="&#x1fb;" d="M387 623q0 -44 -31.5 -75.5t-75.5 -31.5q-48 0 -77 30t-29 78q0 44 31.5 74.5t75.5 30.5q47 0 76.5 -30.5t29.5 -75.5zM339 621q0 25 -17.5 42.5t-42.5 17.5q-23 0 -40 -17.5t-17 -41.5t17 -41t40 -17q25 0 42.5 17t17.5 40zM160 728l122 131q47 50 70 50q20 0 34 -14 t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM435 127l21 -15q-78 -126 -156 -126q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17t24.5 -55h1l17 59l111 7l-75 -251 q-30 -99 -30 -133q0 -15 12 -15t27 14.5t46 55.5zM303 373q0 20 -10.5 33.5t-26.5 13.5q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57q45 0 86 75q29 52 50.5 123.5t21.5 116.5z" />
+<glyph unicode="&#x1fc;" horiz-adv-x="944" d="M918 669l-45 -190l-24 5l-2 40q-6 113 -162 113q-32 0 -43 -6t-16 -26l-65 -235h19q76 0 110.5 20.5t64.5 85.5l26 -4l-73 -273l-25 5q3 24 3 46q0 50 -24 66.5t-109 21.5l-63 -241q-5 -20 -5 -28q0 -37 68 -37q59 0 97.5 10.5t72.5 36.5q36 27 101 120l26 -3l-59 -196 h-527v25q38 6 53 22.5t28 58.5l43 149h-192l-114 -157q-15 -20 -15 -39q0 -16 14 -23.5t50 -10.5v-25h-195v25q19 2 30 9q9 3 59 68l364 472q20 27 20 44q0 14 -15.5 19.5t-64.5 8.5v23h589zM490 627h-12l-253 -333h173zM520 723l122 131q47 50 70 50q20 0 34 -14t14 -33 q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49z" />
+<glyph unicode="&#x1fd;" horiz-adv-x="722" d="M473 459l-20 -65q28 36 55.5 50.5t64.5 14.5q47 0 73.5 -23t26.5 -64q0 -64 -61.5 -116t-168.5 -69l-37 -6q-5 -25 -5 -46q0 -40 17.5 -62.5t48.5 -22.5q72 0 124 90l28 -17q-66 -136 -194 -136t-143 131q-42 -70 -82.5 -100t-90.5 -30q-52 0 -83 30t-31 88 q0 66 29.5 135t77.5 124q84 97 168 97q33 0 51 -14.5t31 -51.5l18 58zM418 231l-5 -17q65 8 117.5 60.5t52.5 113.5q0 41 -35 41q-72 0 -130 -198zM333 363q0 25 -13.5 40.5t-34.5 15.5q-43 0 -83 -58t-60.5 -125.5t-20.5 -111.5q0 -66 48 -66q47 0 93 79q30 50 50.5 117 t20.5 109zM300 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49z" />
+<glyph unicode="&#x1fe;" horiz-adv-x="722" d="M633 764l-63 -108q55 -26 88 -82t33 -121q0 -111 -48.5 -207.5t-134.5 -168.5q-114 -95 -240 -95q-45 0 -85 13l-70 -120h-48l79 136q-117 63 -117 201q0 122 58.5 231.5t156.5 175.5t207 66q40 0 82 -13l53 92h49zM182 77l324 553q-27 21 -63 21q-92 0 -165 -130 q-43 -77 -75 -190t-32 -190q0 -33 11 -64zM533 593l-325 -555q28 -22 67 -22q46 0 91.5 38t74.5 97q41 85 73.5 194.5t32.5 181.5q0 30 -14 66zM290 723l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49z" />
+<glyph unicode="&#x1ff;" d="M424 560l-65 -116q82 -40 82 -133q0 -127 -86.5 -225.5t-197.5 -98.5q-24 0 -51 8l-64 -114h-40l72 126q-77 44 -77 127q0 128 88.5 228t200.5 100q20 0 42 -6l59 104h37zM116 78l191 341q-14 14 -32 14q-48 0 -86 -68q-27 -49 -50 -136.5t-23 -142.5v-8zM321 377 l-193 -343q14 -18 37 -18q57 0 101 109q22 52 39 127t17 120q0 3 -1 5zM139 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49z" />
+<glyph unicode="&#x237;" horiz-adv-x="278" d="M239 462l-116 -444q-31 -119 -81 -172t-126 -53q-47 0 -76 22t-29 55q0 22 14.5 37.5t34.5 15.5q22 0 35.5 -13.5t13.5 -35.5q0 -11 -7.5 -20t-7.5 -15q0 -15 24 -15q21 0 38 31t36 105l89 350q12 45 12 67q0 30 -41 30h-22v27q136 12 209 28z" />
+<glyph unicode="&#x250;" horiz-adv-x="512" d="M50 395l-10 21q68 57 128 57q36 0 49.5 -15t13.5 -54q95 69 178 69t83 -69q0 -93 -99 -149q-58 -33 -221 -76l-18 -68q-7 -30 -7 -43q0 -50 63 -50q32 0 59 9t27 26q0 11 -15 30t-15 35q0 28 19 45t50 17q30 0 47 -18.5t17 -52.5q0 -58 -65 -90.5t-156 -32.5 q-79 0 -122 26t-43 74q0 14 5 34l70 261q2 10 2 13q0 15 -15 15q-8 0 -25 -14zM221 362l-40 -148q159 45 159 148q0 40 -38 40q-42 0 -81 -40z" />
+<glyph unicode="&#x251;" horiz-adv-x="612" d="M592 473l-104 -388q-2 -12 -2 -14q0 -11 10 -11q16 0 61 7v-19l-214 -56l14 53q-1 -1 -10 -7l-15 -11q-6 -4 -18 -10.5t-23.5 -11.5t-26.5 -9.5t-32.5 -7t-35.5 -2.5q-23 0 -47 5t-54.5 19.5t-50 47.5t-19.5 81q0 127 98.5 230.5t226.5 103.5q67 0 109 -46l119 46h14z M374 109l62 231q4 13 4 27q0 35 -24 54.5t-54 19.5q-64 0 -129 -87t-65 -190q0 -60 32 -90t78 -30q25 0 57 19.5t39 45.5z" />
+<glyph unicode="&#x252;" horiz-adv-x="612" d="M274 467l-14 -53q1 1 10 8l15 10q6 4 18 10.5t23.5 11.5t26.5 9.5t32.5 7t35.5 2.5q23 0 47 -5t54.5 -19.5t50 -47.5t19.5 -81q0 -128 -98.5 -231t-226.5 -103q-67 0 -109 46l-119 -46h-14l104 388q2 12 2 14q0 11 -10 11q-8 0 -61 -7v18zM243 350l-62 -231 q-4 -13 -4 -27q0 -35 24 -54.5t54 -19.5q64 0 129 87t65 190q0 60 -32 90t-78 30q-25 0 -57 -19.5t-39 -45.5z" />
+<glyph unicode="&#x253;" d="M6 129l103 358q35 120 78.5 162t119.5 42q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -28 19q-26 0 -42.5 -17.5t-27.5 -58.5l-59 -211q65 89 144 89q47 0 77 -37.5t30 -93.5q0 -135 -97 -239.5t-223 -104.5 q-53 0 -95.5 17.5t-42.5 43.5q0 9 20 81zM319 325q0 69 -41 69q-52 0 -92 -84q-24 -52 -62 -182q-15 -51 -15 -81q0 -12 8.5 -19.5t22.5 -7.5q55 0 108 78q30 43 50.5 112t20.5 115z" />
+<glyph unicode="&#x254;" horiz-adv-x="444" d="M69 307l-28 18l38 51q13 16 34.5 36.5t42.5 31.5q34 18 83 18q70 0 111.5 -39.5t41.5 -111.5q0 -134 -105 -239q-83 -85 -180 -85q-46 0 -79 25.5t-33 64.5q0 32 17 51.5t45 19.5q25 0 41.5 -15t16.5 -38q0 -16 -10.5 -32t-10.5 -26q0 -7 7.5 -12t16.5 -5q26 0 47.5 22.5 t45.5 65.5q53 98 53 201q0 43 -19.5 66t-53.5 23q-32 0 -59 -20t-63 -71z" />
+<glyph unicode="&#x255;" horiz-adv-x="444" d="M-1 -157l112 147q-116 23 -116 148q0 134 105 239q83 85 180 85q46 0 79 -25.5t33 -64.5q0 -32 -17 -51.5t-45 -19.5q-25 0 -41.5 15t-16.5 38q0 16 10.5 32t10.5 26q0 7 -7.5 12t-16.5 5q-26 0 -47.5 -22.5t-45.5 -65.5q-53 -98 -53 -201q0 -61 38 -81q91 115 167 115 q36 0 57 -21t21 -50q0 -51 -46.5 -86t-116.5 -35h-25q-45 0 -63 3l-108 -142h-48zM361 99q0 30 -44 30q-45 0 -120 -86q31 -16 77 -16q41 0 64 22t23 50z" />
+<glyph unicode="&#x256;" d="M517 699l-199 -725q-32 -110 -32 -120q0 -29 18 -42.5t44 -13.5q28 0 28 19q0 4 -11 20.5t-11 36.5q0 23 17.5 40t42.5 17q27 0 44 -18t17 -46q0 -45 -39.5 -72.5t-103.5 -27.5q-69 0 -102 26.5t-33 83.5q0 43 20 116l34 125q-72 -131 -166 -131q-48 0 -77 32.5t-29 92.5 q0 72 37 150t94 132q70 68 138 68q46 0 75 -33l18 64q29 102 29 122q0 28 -41 28h-21v27q129 10 209 29zM308 371q0 21 -10.5 35t-26.5 14q-57 1 -114 -112q-24 -48 -39 -100.5t-15 -85.5q0 -28 11.5 -46t29.5 -18q45 0 86 75q27 48 52.5 126.5t25.5 111.5z" />
+<glyph unicode="&#x257;" horiz-adv-x="570" d="M323 429l18 64q11 37 18 58.5t21.5 50t30.5 43.5t41.5 26.5t58.5 11.5q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -28 19q-6 0 -10.5 -1.5t-11 -11.5t-12.5 -30l-129 -471q-14 -53 -14 -63q0 -5 3.5 -10t7.5 -5 q24 0 68 71l22 -16q-79 -126 -150 -126q-28 0 -44 16t-16 45q0 20 11 68q-72 -131 -166 -131q-48 0 -77 32.5t-29 92.5q0 72 37 150t94 132q70 68 138 68q46 0 75 -33zM308 371q0 21 -10.5 35t-26.5 14q-57 1 -114 -112q-24 -48 -39 -100.5t-15 -85.5q0 -28 11.5 -46 t29.5 -18q45 0 86 75q27 48 52.5 126.5t25.5 111.5z" />
+<glyph unicode="&#x258;" horiz-adv-x="444" d="M5 126l37 17q7 -48 34.5 -70t64.5 -22q40 0 78 39.5t50 91.5q-88 21 -128.5 50.5t-40.5 85.5q0 60 51 102t116 42q72 0 113 -48t41 -124q0 -114 -81 -208.5t-185 -94.5q-63 0 -106 34.5t-44 104.5zM306 365q0 64 -39 64q-32 0 -53.5 -41t-21.5 -74q0 -37 23 -63t63 -37 q28 94 28 151z" />
+<glyph unicode="&#x259;" horiz-adv-x="444" d="M86 306l-29 17q78 139 195 139q67 0 106.5 -37.5t39.5 -109.5q0 -124 -89.5 -226t-198.5 -102q-48 0 -76.5 24t-28.5 63q0 63 69 122q32 27 73.5 42.5t114.5 28.5q6 30 6 49q0 82 -64 82q-32 0 -57.5 -20t-60.5 -72zM255 235q-68 -15 -113 -64.5t-45 -111.5q0 -39 31 -39 q71 0 127 215z" />
+<glyph unicode="&#x25a;" horiz-adv-x="626" d="M626 279l-18 -27q-16 -25 -43 -41t-55 -16q-65 0 -65 54q0 16 4 29l26 93l-78 -40q1 -5 1 -16q0 -124 -89.5 -226t-198.5 -102q-48 0 -76.5 24t-28.5 63q0 96 107 149l156 80v16q0 79 -64 79q-32 0 -57.5 -20t-60.5 -72l-29 17q78 139 195 139q114 0 140 -96l127 65 l10 -12l-45 -142q-2 -10 -2 -22q0 -23 37 -23q39 0 64 35l17 25zM261 262l-89 -46q-41 -21 -58 -67.5t-17 -89.5q0 -39 31 -39q40 0 75 68t58 174z" />
+<glyph unicode="&#x25b;" horiz-adv-x="444" d="M394 102l19 -18q-61 -61 -116 -79.5t-124 -18.5q-70 0 -119 26.5t-49 79.5q0 55 45.5 98t110.5 60q-66 34 -66 80q0 53 35.5 87t82 46t103.5 12q40 0 75 -11q37 -12 64 -36t27 -48q0 -50 -49 -50q-28 0 -42 14.5t-30 55.5q-15 38 -55 38q-37 0 -64 -28.5t-27 -76.5 q0 -28 24.5 -48.5t49.5 -20.5h17v-37h-53q-41 0 -74.5 -39t-33.5 -89q0 -30 19 -47t51 -17q52 0 92.5 13.5t86.5 53.5z" />
+<glyph unicode="&#x25c;" horiz-adv-x="480" d="M198 264h24q49 0 88 38t39 89q0 47 -53 47q-38 0 -51 -33q-17 -44 -30.5 -59.5t-42.5 -15.5q-50 0 -50 51q0 24 29.5 49t67.5 36q33 9 78 9q72 0 122 -21t50 -69q0 -49 -32 -79.5t-92 -55.5q40 -11 64 -38t24 -62q0 -41 -23.5 -74t-61 -52t-78 -28.5t-79.5 -9.5 q-33 0 -55.5 3t-49 12t-47 30t-34.5 53l27 18q25 -40 58 -53.5t85 -13.5q50 0 86.5 39.5t36.5 92.5q0 28 -15 44t-42 16h-43v37z" />
+<glyph unicode="&#x25d;" horiz-adv-x="689" d="M689 289l-18 -27q-16 -25 -43 -41t-55 -16q-65 0 -65 54q0 16 4 29l26 93l-78 -40q-20 -52 -115 -91q40 -11 64 -38t24 -62q0 -41 -23.5 -74t-61 -52t-78 -28.5t-79.5 -9.5q-33 0 -55.5 3t-49 12t-47 30t-34.5 53l27 18q25 -40 58 -53.5t85 -13.5q50 0 86.5 39.5 t36.5 92.5q0 28 -15 44t-42 16h-43v37h24q49 0 88 38t39 89q0 47 -53 47q-38 0 -51 -33q-17 -44 -30.5 -59.5t-42.5 -15.5q-50 0 -50 51q0 24 29.5 49t67.5 36q33 9 78 9q172 0 172 -92l113 58l10 -12l-45 -142q-2 -10 -2 -22q0 -23 37 -23q40 0 64 35l17 25z" />
+<glyph unicode="&#x25e;" horiz-adv-x="486" d="M475 385q0 -48 -32 -79.5t-92 -55.5q40 -11 64 -38t24 -62q0 -52 -38 -90.5t-92.5 -56t-114.5 -17.5q-28 0 -56.5 7t-59.5 23t-51 50t-20 82q0 130 91.5 228.5t202.5 98.5q77 0 125.5 -21.5t48.5 -68.5zM204 264h24q49 0 88 38t39 89q0 47 -52 47q-83 0 -152.5 -86.5 t-69.5 -187.5q0 -59 27.5 -94t71.5 -35q50 0 87 39t37 94q0 28 -15 43.5t-42 15.5h-43v37z" />
+<glyph unicode="&#x25f;" horiz-adv-x="367" d="M364 462v-24q-46 -1 -60 -62l-30 -122h51l-13 -46h-50l-49 -187q-30 -114 -78.5 -171t-129.5 -57q-47 0 -76 22t-29 55q0 22 14.5 37.5t34.5 15.5q22 0 35.5 -13.5t13.5 -35.5q0 -11 -7.5 -20t-7.5 -15q0 -15 24 -15q21 0 38 31t36 105l63 248h-109l13 46h108l31 124 q4 13 4 27q0 33 -44 33v24h217z" />
+<glyph unicode="&#x260;" horiz-adv-x="720" d="M258 -68l43 154q-68 -99 -155 -99q-42 0 -72 29.5t-30 105.5q0 68 39 147.5t103 136t128 56.5q52 0 76 -33q51 161 97 203q56 51 123 51q63 0 102 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-28 0 -45.5 -17.5 t-29.5 -62.5l-164 -588q-63 -229 -265 -229q-69 0 -121 31q-50 30 -50 80q0 26 17 43t45 17q25 0 42 -15.5t17 -38.5q0 -15 -11.5 -33.5t-11.5 -25.5q0 -27 41 -27q56 0 105.5 44t65.5 102zM368 369q0 50 -35 50q-34 0 -73.5 -54t-65 -124t-25.5 -120q0 -22 4 -35.5t12 -19 t13.5 -6.5t16.5 -1q18 0 42.5 23t45.5 64q24 48 44.5 116t20.5 107z" />
+<glyph unicode="&#x261;" horiz-adv-x="549" d="M520 472l-136 -488q-65 -229 -265 -229q-69 0 -121 31q-50 30 -50 80q0 26 17 43t45 17q25 0 42 -15.5t17 -38.5q0 -15 -11.5 -33.5t-11.5 -25.5q0 -27 41 -27q56 0 105.5 44t65.5 102l43 154q-68 -99 -155 -99q-42 0 -72 29.5t-30 105.5q0 68 39 147.5t103 136t128 56.5 q30 0 52 -9.5t47 -35.5l91 55h16zM368 369q0 50 -35 50q-34 0 -73.5 -54t-65 -124t-25.5 -120q0 -22 4 -35.5t12 -19t13.5 -6.5t16.5 -1q18 0 42.5 23t45.5 64q24 48 44.5 116t20.5 107z" />
+<glyph unicode="&#x262;" horiz-adv-x="561" d="M544 460l-42 -157h-18q-10 40 -17.5 60t-24.5 40q-33 37 -90 37q-80 0 -141.5 -99t-61.5 -214q0 -56 22.5 -86t79.5 -30q68 0 83 56l16 59q3 12 3 21q0 14 -13.5 21t-49.5 9v16h250v-16q-40 -4 -55 -18.5t-25 -49.5l-22 -78q-87 -42 -211 -42q-95 0 -150.5 45t-55.5 124 q0 120 100.5 212t225.5 92q49 0 107 -24q17 -9 30 -9q19 0 41 31h19z" />
+<glyph unicode="&#x263;" horiz-adv-x="444" d="M236 188l11 -81q89 166 89 210q0 13 -25 34q-31 25 -31 54q0 21 16 39t42 18q25 0 43.5 -19t18.5 -45q0 -53 -40.5 -149t-103.5 -200l17 -122q4 -24 4 -68q0 -43 -38.5 -68t-92.5 -25q-73 0 -73 67q0 33 31 78l50 72q-9 87 -54 303q-21 94 -40 113q-8 8 -14.5 10t-25.5 2 v27q86 8 150 24q45 -116 66 -274zM162 -69l-30 -47q-19 -29 -19 -55q0 -30 26 -30q32 0 32 49q0 19 -3 37z" />
+<glyph unicode="&#x264;" horiz-adv-x="493" d="M240 263l102 116q63 71 90 71q25 0 40.5 -18.5t15.5 -43.5q0 -32 -16 -73h-10q-11 42 -46 42q-32 0 -72 -47l-83 -94l11 -28l14 -36q4 -12 8.5 -31t4.5 -32q0 -48 -46.5 -73.5t-99.5 -25.5q-33 0 -54.5 15.5t-21.5 46.5q0 38 41 83l49 52l-48 117l-11 24q-4 9 -14.5 19 t-23.5 10q-15 0 -26 -12.5t-15 -29.5h-10q-9 22 -9 37q0 39 31 68.5t70 29.5q52 0 82 -73zM208 65q0 20 -21 70l-10 -10l-11 -11q-2 -2 -9 -10t-8.5 -12t-5.5 -11.5t-5 -14.5t-1 -15q0 -28 28 -28q17 0 30 13t13 29z" />
+<glyph unicode="&#x265;" horiz-adv-x="556" d="M498 450l-152 -562q-10 -37 -10 -47q0 -33 42 -33h22v-27q-99 -9 -209 -30l108 416q-74 -105 -118 -142t-95 -37q-36 0 -56 20t-20 55q0 24 7 46l81 254q3 8 3 12q0 16 -17 16t-75 -83l-22 15q50 77 85.5 106.5t81.5 29.5q30 0 48.5 -17t18.5 -47q0 -23 -10 -55l-75 -229 q-6 -18 -6 -30q0 -21 20 -21q44 0 108 94q36 53 58 108t61 188h121z" />
+<glyph unicode="&#x266;" horiz-adv-x="556" d="M476 142l22 -15q-50 -77 -85.5 -106.5t-81.5 -29.5q-30 0 -48.5 17t-18.5 47q0 25 7 46l78 238q6 18 6 30q0 21 -20 21q-44 0 -108 -94q-36 -53 -58 -108t-61 -188h-121l150 555q35 128 182 128q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40 q0 20 11 36.5t11 20.5q0 19 -29 19q-51 0 -69 -69l-78 -300q74 105 118 142t95 37q37 0 56.5 -20t19.5 -55q0 -21 -7 -46l-81 -254q-3 -8 -3 -12q0 -16 17 -16t75 83z" />
+<glyph unicode="&#x267;" horiz-adv-x="533" d="M264 583l-78 -300q74 105 118 142t95 37q37 0 56.5 -20t19.5 -55q0 -21 -8 -49l-108 -338q-31 -95 -61 -129q-33 -39 -67.5 -57.5t-84.5 -18.5q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5q0 -15 -11.5 -33t-11.5 -26q0 -17 34 -17q44 0 65 65 l146 448q6 18 6 30q0 21 -20 21q-44 0 -108 -94q-36 -53 -58 -108t-61 -188h-121l150 555q35 128 182 128q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-51 0 -69 -69z" />
+<glyph unicode="&#x268;" horiz-adv-x="278" d="M262 616q0 -28 -19.5 -47t-48.5 -19q-28 0 -47 20t-19 49q0 25 20 45t45 20q28 0 48.5 -20t20.5 -48zM216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l25 93h-52l13 46h51l18 64q8 27 8 45q0 29 -46 29h-14v27q118 9 203 28l-53 -193h57l-13 -46h-56 l-26 -95q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61z" />
+<glyph unicode="&#x269;" horiz-adv-x="253" d="M225 95l12 -17l-15 -17q-14 -17 -18 -21t-19 -17t-25.5 -17t-28 -9t-36.5 -5q-93 0 -93 79q0 14 12 59l56 207q7 28 7 40q0 11 -6 11q-16 0 -47 -10l8 27q13 5 40 14l41 14l34 11q19 6 31.5 9t19.5 3q15 0 15 -14q0 -6 -2 -14l-82 -300q-9 -33 -9 -48q0 -30 22 -30 q37 0 83 45z" />
+<glyph unicode="&#x26a;" horiz-adv-x="304" d="M321 462v-17q-38 -2 -54.5 -12.5t-23.5 -39.5l-86 -320q-5 -18 -5 -27q0 -16 12 -21.5t43 -7.5v-17h-239v17q40 4 55.5 14.5t23.5 41.5l85 320q3 12 3 21q0 16 -12 22.5t-40 8.5v17h238z" />
+<glyph unicode="&#x26b;" horiz-adv-x="320" d="M327 447h41q-16 -63 -44 -91t-73 -28q-18 0 -26 2l-43 -154q-22 -79 -22 -100q0 -15 15 -15q25 0 79 80l22 -14q-52 -80 -87 -108t-82 -28q-30 0 -49 18t-19 45q0 34 34 155l45 159q-7 2 -21 2q-17 0 -28 -9t-20 -32h-40q10 54 40 86t73 32q7 0 19 -2l34 129q6 24 6 39 q0 30 -42 30q-11 0 -22 -1v27q98 9 210 30l-80 -288q18 -6 29 -6q17 0 28.5 9t22.5 33z" />
+<glyph unicode="&#x26c;" horiz-adv-x="445" d="M412 384l5 -21q-7 -8 -20 -21t-54.5 -44t-84.5 -50l-20 -72q-22 -79 -22 -100q0 -15 15 -15q25 0 79 80l22 -14q-52 -80 -87 -108t-82 -28q-30 0 -49 18t-19 45q0 34 34 155l6 21q-11 -1 -28 -1q-40 0 -65 20.5t-25 58.5q0 66 48.5 108t103.5 42q15 0 30 -5l29 105 q9 36 9 55q0 30 -42 30q-11 0 -22 -1v27q98 9 210 30l-111 -399q59 20 140 84zM148 276l40 141q-10 4 -25 4q-31 0 -58.5 -32t-27.5 -65q0 -38 41 -47q5 -1 30 -1z" />
+<glyph unicode="&#x26d;" horiz-adv-x="291" d="M290 699l-224 -809q-5 -18 -5 -33q0 -25 10.5 -42t28.5 -17q32 0 32 17q0 7 -11.5 26t-11.5 33q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -39 -72t-101 -28q-67 0 -102 33t-35 91q0 26 7 51l150 526q34 118 34 145q0 30 -42 30q-11 0 -22 -1v27q98 9 210 30z" />
+<glyph unicode="&#x26e;" horiz-adv-x="623" d="M585 423l-209 -191h17q46 0 79 -37t33 -100q0 -140 -97 -235.5t-204 -95.5q-41 0 -82 10.5t-61 24.5q-44 31 -44 69q0 20 14.5 35t44.5 15q57 0 67 -67q4 -22 24.5 -36t44.5 -14q43 0 83 54.5t61.5 121.5t21.5 116q0 75 -56 75q-19 0 -43 -23l-102 -98q-58 -56 -107 -56 q-32 0 -50 18.5t-18 43.5q0 37 24 120l105 370q13 45 13 70q0 30 -40 30q-16 0 -24 -1v27q108 11 210 30l-69 -249h364v-27zM476 377h-211q-17 0 -46.5 -21t-37.5 -50l-48 -174q-10 -34 -10 -47q0 -19 11 -19q4 0 14.5 8.5t27.5 25.5l17 16z" />
+<glyph unicode="&#x26f;" horiz-adv-x="778" d="M723 453l-66 -232q-36 -125 -36 -150t38 -25h18v-27q-130 -10 -200 -27l63 199h-1q-70 -108 -104 -142q-58 -58 -114 -58q-31 0 -49 17.5t-18 49.5q0 37 26 105q-61 -99 -102.5 -135.5t-95.5 -36.5q-35 0 -56 20t-21 51q0 35 9 61l72 214q8 25 8 39q0 18 -16 18 q-22 0 -58 -58q-6 -10 -12 -18l-22 13q38 71 75.5 101t85.5 30q68 0 68 -66q0 -26 -11 -62l-72 -219q-6 -19 -6 -30q0 -8 6.5 -14.5t15.5 -6.5q48 0 113 116q27 48 42.5 89t58.5 184h120l-65 -207q-42 -134 -42 -160q0 -22 17 -22q23 0 63 47q43 51 75 126t72 216h121z" />
+<glyph unicode="&#x270;" horiz-adv-x="778" d="M723 453l-195 -686h-123l135 424h-1q-68 -105 -100 -138q-60 -62 -118 -62q-31 0 -49 17.5t-18 49.5q0 37 26 105q-61 -99 -102.5 -135.5t-95.5 -36.5q-35 0 -56 20t-21 51q0 35 9 61l72 214q8 25 8 39q0 18 -16 18q-22 0 -58 -58q-6 -10 -12 -18l-22 13q38 71 75.5 101 t85.5 30q68 0 68 -66q0 -26 -11 -62l-72 -219q-6 -19 -6 -30q0 -8 6.5 -14.5t15.5 -6.5q48 0 113 116q27 48 42.5 89t58.5 184h120l-65 -207q-42 -134 -42 -160q0 -22 17 -22q23 0 63 47q43 51 75 126t72 216h121z" />
+<glyph unicode="&#x271;" horiz-adv-x="759" d="M169 262h1q70 108 104 142q58 58 114 58q32 0 49.5 -18t17.5 -49q0 -37 -26 -105q61 99 102.5 135.5t95.5 36.5q35 0 56 -20t21 -51q0 -35 -9 -62l-140 -422q-16 -45 -32 -64q-61 -76 -164 -76q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -16t17 -39 q0 -13 -11.5 -32t-11.5 -27q0 -16 34 -16q49 0 70 65l156 475q6 20 6 30q0 8 -6.5 14.5t-15.5 6.5q-48 0 -113 -116q-27 -48 -42.5 -89t-58.5 -184h-120l65 207q42 134 42 160q0 22 -17 22q-23 0 -63 -47q-43 -51 -75 -126t-72 -216h-121l66 232q36 125 36 150t-38 25h-18 v27q130 10 200 27z" />
+<glyph unicode="&#x272;" horiz-adv-x="694" d="M610 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-68 0 -68 60q0 47 26 125l55 165q6 20 6 28q0 21 -24 21q-13 0 -33 -16.5t-36 -37.5q-79 -103 -125 -264l-46 -161q-21 -76 -66 -110t-130 -34q-62 0 -101 28t-39 72q0 27 17 44t45 17q25 0 42 -15.5t17 -38.5 q0 -14 -11.5 -33t-11.5 -26q0 -17 32 -17q25 0 44.5 16.5t28.5 48.5l95 341q45 164 45 179q0 14 -11.5 18.5t-43.5 5.5v27q90 3 199 27l-62 -198h1q51 75 73 103.5t49 54.5q43 41 100 41q73 0 73 -77q0 -34 -28 -116l-35 -104q-24 -71 -24 -89q0 -17 14 -17q13 0 27 15 t44 61z" />
+<glyph unicode="&#x273;" horiz-adv-x="505" d="M446 269l-127 -379q-7 -21 -7 -46q0 -19 14 -32.5t30 -13.5q32 0 32 17q0 6 -11.5 25.5t-11.5 33.5q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -39 -72t-101 -28q-67 0 -103 34t-36 93q0 25 15 70l124 377q7 23 7 28q0 21 -24 21q-13 0 -33 -16.5t-36 -37.5 q-47 -62 -79 -135t-66 -201h-121l57 204q45 164 45 179q0 14 -11.5 18.5t-43.5 5.5v27q90 3 199 27l-62 -198h1q51 75 73 103.5t49 54.5q43 41 100 41q73 0 73 -77q0 -34 -28 -116z" />
+<glyph unicode="&#x274;" horiz-adv-x="588" d="M614 462v-17q-40 -5 -53.5 -15t-21.5 -41l-107 -401h-23l-244 372l-73 -271q-6 -21 -6 -34q0 -19 13.5 -27t47.5 -11v-17h-174v17q43 5 58.5 15.5t23.5 41.5l86 323q-27 48 -52 48v17h167l190 -294l55 205q6 21 6 35q0 19 -13 27t-44 10v17h164z" />
+<glyph unicode="&#x275;" d="M441 311q0 -69 -29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77q75 0 118 -41t43 -110zM143 253h164q15 66 15 119q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-44 -48 -72 -149zM295 207h-165q-14 -68 -14 -127 q0 -64 49 -64q41 0 71 49q34 54 59 142z" />
+<glyph unicode="&#x276;" horiz-adv-x="749" d="M751 457l-36 -137h-18q1 9 1 25q0 49 -29 70q-25 18 -111 18q-36 0 -41 -18l-45 -167q59 3 81 19t52 80h18l-62 -229h-17q3 22 3 41q0 35 -18 49t-63 16l-46 -170q-3 -8 -3 -14q0 -10 10 -14t36 -4q82 0 129 34q46 35 85 86h20l-69 -144h-307q-60 0 -78 -1q-20 -2 -30 -2 q-190 0 -190 160q0 80 44 152.5t115 113.5q73 41 156 41q3 0 18 -1t41.5 -2.5t55.5 -1.5h298zM332 142l53 197q12 43 12 63q0 10 -3 18q-7 18 -50 18q-54 0 -103.5 -51.5t-78 -129.5t-28.5 -155q0 -43 20.5 -63t68.5 -20q46 0 68 19q17 16 41 104z" />
+<glyph unicode="&#x277;" horiz-adv-x="685" d="M626 265q0 -102 -76 -184.5t-180 -82.5q-58 0 -94 48q-53 -48 -134 -48q-68 0 -106.5 39.5t-38.5 101.5q0 58 25 111.5t65.5 94t91.5 71t105 46t103 15.5q99 0 169 -58t70 -154zM489 314q0 69 -29.5 104t-79.5 35q-56 0 -113 -47.5t-95 -129t-38 -169.5q0 -27 11 -45 t31 -18q26 0 55 17.5t29 55.5q0 36 -2.5 75.5t-2.5 49.5q0 31 22 58t61 27q53 0 53 -66q0 -28 -30 -78.5t-30 -85.5q0 -24 10.5 -38.5t27.5 -14.5q30 0 54.5 32.5t38 79.5t20.5 89t7 69z" />
+<glyph unicode="&#x278;" horiz-adv-x="691" d="M483 591l-41 -156q75 -8 132.5 -50.5t57.5 -114.5t-51.5 -135t-121.5 -97.5t-134 -38.5l-37 -138q-6 -23 -6 -36q0 -18 12.5 -24t43.5 -8v-24h-277v24q42 3 60 17t29 54l36 135q-75 5 -132 53.5t-57 121.5q0 57 31 106.5t78.5 81.5t99 51t97.5 22l41 153q5 18 5 34 q0 20 -12.5 28.5t-43.5 10.5v24h277v-24q-42 -2 -59 -15t-28 -55zM432 398l-97 -360q61 27 109 100t48 145q0 89 -60 115zM196 39l97 359q-57 -18 -106.5 -89t-49.5 -143q0 -43 16 -77t43 -50z" />
+<glyph unicode="&#x279;" horiz-adv-x="427" d="M289 462h121q-102 -345 -102 -382q0 -14 11.5 -19.5t44.5 -5.5v-27q-131 -11 -200 -28l65 209h-1q-60 -121 -95.5 -165t-75.5 -44q-26 0 -41.5 18t-15.5 48q0 31 16.5 52t41.5 21q22 0 37.5 -19t23.5 -19q23 0 65 76q36 65 74 186z" />
+<glyph unicode="&#x27a;" horiz-adv-x="493" d="M476 699l-139 -489q-44 -156 -44 -158q0 -25 71 -25v-27h-200l65 209h-1q-60 -121 -95.5 -165t-75.5 -44q-26 0 -41.5 18t-15.5 48q0 31 16.5 52t41.5 21q22 0 37.5 -19t23.5 -19q23 0 65 76q44 79 74 186l56 196q10 33 10 54q0 30 -36 30q-11 0 -22 -1v28q109 10 210 29 z" />
+<glyph unicode="&#x27b;" horiz-adv-x="436" d="M409 462l-162 -569q-4 -12 -4 -28q0 -28 12.5 -47.5t30.5 -19.5q33 0 33 16q0 8 -11.5 26.5t-11.5 33.5q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -39 -72t-101 -28q-68 0 -104 34.5t-36 94.5q0 15 5 33l87 280h-1q-60 -121 -95.5 -165t-75.5 -44q-26 0 -41.5 18 t-15.5 48q0 31 16.5 52t41.5 21q22 0 37.5 -19t23.5 -19q23 0 65 76q36 65 74 186l31 99h120z" />
+<glyph unicode="&#x27c;" horiz-adv-x="389" d="M160 253h1q60 121 95.5 165t75.5 44q26 0 41.5 -18t15.5 -48q0 -31 -16.5 -52t-41.5 -21q-22 0 -37.5 19t-23.5 19q-23 0 -65 -76q-36 -65 -74 -186l-103 -332h-115l134 468q34 117 34 147q0 14 -11.5 19.5t-44.5 5.5v27q131 11 200 28z" />
+<glyph unicode="&#x27d;" horiz-adv-x="389" d="M160 253h1q60 121 95.5 165t75.5 44q26 0 41.5 -18t15.5 -48q0 -31 -16.5 -52t-41.5 -21q-22 0 -37.5 19t-23.5 19q-22 0 -65 -76q-15 -27 -23 -44.5t-26.5 -70.5t-51.5 -156q-45 -141 -45 -155q0 -25 12.5 -43t30.5 -18q32 0 32 17q0 6 -11.5 25.5t-11.5 33.5 q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -39 -72t-101 -28q-67 0 -103 33.5t-36 92.5q0 13 5 33l91 316q32 110 32 140q0 14 -11.5 19.5t-44.5 5.5v27q131 11 200 28z" />
+<glyph unicode="&#x27e;" horiz-adv-x="360" d="M-21 0l76 267q19 66 35.5 102.5t45.5 63.5q56 51 139 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-48 0 -72 -75l-118 -378h-120z" />
+<glyph unicode="&#x27f;" horiz-adv-x="338" d="M63 0l110 380q5 16 5 33q0 40 -40 40q-29 0 -29 -19q0 -4 11 -20.5t11 -36.5q0 -23 -17.5 -40t-42.5 -17q-27 0 -44 18t-17 46q0 44 39 72t103 28q102 0 130 -51q10 -19 10 -44q0 -46 -26 -127l-82 -262h-121z" />
+<glyph unicode="&#x280;" horiz-adv-x="498" d="M123 464h215q91 0 134 -21.5t43 -73.5q0 -56 -41 -92.5t-103 -50.5l85 -194q7 -15 26 -15v-17h-146l-84 215h-19l-36 -134q-7 -24 -7 -36q0 -14 10.5 -19t39.5 -9v-17h-232v17q41 5 53.5 15t23.5 51l79 295q7 24 7 38q0 16 -11 22.5t-37 8.5v17zM239 238h21 q66 0 101.5 39.5t35.5 108.5q0 29 -16 42t-52 13q-20 0 -29.5 -7t-14.5 -24z" />
+<glyph unicode="&#x281;" horiz-adv-x="498" d="M597 464v-17q-21 0 -34 -15l-189 -194q84 -23 84 -88q0 -75 -66 -112.5t-178 -37.5h-206v17q38 2 53 15.5t25 53.5l79 295q7 24 7 38t-10.5 19.5t-38.5 8.5v17h232v-17q-42 -5 -54 -15.5t-23 -48.5l-36 -134h19l199 215h137zM236 226l-47 -172q-2 -10 -2 -13 q0 -18 30 -18q55 0 89 40.5t34 105.5q0 32 -24 44t-80 13z" />
+<glyph unicode="&#x282;" horiz-adv-x="389" d="M333 461l-23 -154l-27 2q-12 63 -33 91.5t-55 28.5q-24 0 -38.5 -14.5t-14.5 -38.5q0 -33 57 -99q80 -93 80 -162q0 -56 -43 -92t-105 -36q-35 0 -64 12q-21 8 -31 8q-12 0 -20 -8t-9 -17l-9 -84q-1 -6 -1 -16q0 -69 73 -69q39 0 39 17q0 7 -11.5 25.5t-11.5 33.5 q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -39.5 -72t-101.5 -28q-98 0 -98 91q0 18 2 30l33 250l27 -3q17 -133 93 -133q29 0 44.5 14.5t15.5 39.5q0 41 -56 104q-50 56 -65 87.5t-15 73.5q0 59 36.5 92.5t97.5 33.5q33 0 58 -12q21 -10 37 -10q11 0 16 4t12 17h29z " />
+<glyph unicode="&#x283;" horiz-adv-x="424" d="M106 -53l116 466q14 56 32 99t47 84.5t73 64t100 22.5q52 0 81 -21t29 -57q0 -26 -15 -43.5t-39 -17.5q-23 0 -38 14t-15 33q0 14 9 29.5t9 18.5q0 5 -6.5 9.5t-16.5 4.5q-19 0 -34.5 -13.5t-27 -42.5t-16.5 -45t-14 -50l-114 -454q-15 -60 -33 -104.5t-47.5 -87.5 t-75 -66t-104.5 -23q-50 0 -80 21t-30 57q0 26 15 43.5t39 17.5q23 0 38 -14t15 -33q0 -14 -9 -29.5t-9 -18.5q0 -14 26 -14q21 0 36.5 12t27 39.5t17 44.5t14.5 54z" />
+<glyph unicode="&#x284;" horiz-adv-x="394" d="M113 46l110 437q26 103 76 149q56 51 135 51q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-60 0 -76 -60l-143 -546h68l-12 -46h-68q-31 -109 -80 -158t-122 -49q-47 0 -76 22t-29 55q0 22 14.5 37.5 t34.5 15.5q22 0 35.5 -13.5t13.5 -35.5q0 -11 -7.5 -20t-7.5 -15q0 -15 24 -15q21 0 38 31t36 105l10 40h-62l12 46h62z" />
+<glyph unicode="&#x285;" horiz-adv-x="415" d="M324 280l-103 -386q-11 -44 -11 -59q0 -14 1 -20t6 -12t16 -6q9 0 15.5 4.5t6.5 9.5q0 3 -9 18.5t-9 29.5q0 19 15 33t38 14q24 0 39 -17.5t15 -43.5q0 -36 -29.5 -57t-81.5 -21q-67 0 -101.5 34t-34.5 92q0 29 9 64l107 397q8 30 8 50q0 36 -29 36q-10 0 -17 -4.5 t-7 -9.5q0 -3 9 -18.5t9 -29.5q0 -19 -15 -33t-38 -14q-24 0 -39 17.5t-15 43.5q0 36 29.5 57t81.5 21q67 0 105 -34t38 -91q0 -31 -9 -65z" />
+<glyph unicode="&#x286;" horiz-adv-x="521" d="M181 21l97 388q14 56 32 100t47 86t73 65t101 23q51 0 80.5 -21t29.5 -57q0 -26 -15.5 -43.5t-38.5 -17.5t-38 13.5t-15 33.5q0 14 9 29.5t9 18.5q0 5 -6.5 9.5t-15.5 4.5q-20 0 -35.5 -13.5t-27 -40.5t-16.5 -44.5t-13 -48.5l-108 -430q-21 -84 -34 -115q18 -36 18 -105 q0 -50 -17 -99h-42q19 51 19 82q0 12 -7 54q-71 -126 -211 -126q-48 0 -72 26.5t-24 64.5q0 76 53 121.5t136 45.5q8 0 32 -4zM171 -19q-15 4 -39 4q-56 0 -94 -35.5t-38 -83.5q0 -24 15 -41.5t50 -17.5q30 0 51 24.5t31 56.5q6 19 24 93z" />
+<glyph unicode="&#x287;" horiz-adv-x="310" d="M85 363l-23 15q49 76 86.5 105.5t83.5 29.5q67 0 67 -65q0 -28 -25 -115l-67 -236h52v-35q-62 -21 -103 -55t-81 -97h-35l39 145h-72v42h83l34 119q53 185 53 209q0 18 -16 18q-25 0 -76 -80z" />
+<glyph unicode="&#x288;" horiz-adv-x="311" d="M281 407h-83l-146 -512q-3 -11 -3 -28q0 -29 11 -49t29 -20q33 0 33 17q0 6 -11.5 25.5t-11.5 33.5q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -39 -72t-101 -28q-68 0 -104 32.5t-36 91.5q0 20 4 35l137 481h-52v35q62 21 103 55t81 97h35l-39 -145h72v-42z" />
+<glyph unicode="&#x289;" horiz-adv-x="556" d="M514 269l-13 -46h-80l-11 -40q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l13 47h-66l15 46h65l10 35q17 62 17 75q0 24 -58 28v27 q87 2 210 28l-60 -193h131q23 58 56 180h118l-53 -180h79zM294 223h-125l-19 -63q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q41 53 66 105z" />
+<glyph unicode="&#x28a;" d="M552 428h-75q-15 0 -23.5 -13.5t-8.5 -31.5q0 -10 26 -54.5t26 -85.5q0 -69 -46 -128t-114.5 -91t-138.5 -32q-85 0 -134 46t-49 120q0 107 128 207q25 20 25 38q0 25 -17 25h-73v24h192l-47 -93q-31 -60 -42.5 -86.5t-23 -73t-11.5 -95.5q0 -88 58 -88q93 0 145 191 q24 86 24 192q0 34 -1 53h180v-24z" />
+<glyph unicode="&#x28b;" horiz-adv-x="534" d="M243 462l-101 -328q-4 -13 -4 -32q0 -27 23.5 -44.5t53.5 -17.5q81 0 147 83.5t66 166.5q0 20 -5.5 31t-18.5 22t-18 17q-19 23 -19 48q0 20 16.5 37t40.5 17q68 0 68 -112q0 -85 -38.5 -166.5t-112.5 -137.5t-163 -56q-160 0 -160 104q0 12 10 50l57 199q6 30 6 33 q0 20 -20 25q-18 5 -38 6v27q73 0 210 28z" />
+<glyph unicode="&#x28c;" horiz-adv-x="444" d="M401 41v-27q-101 -14 -156 -27q-31 99 -31 334q-74 -84 -100 -123.5t-26 -65.5q0 -13 20 -36q25 -28 25 -53q0 -23 -17 -39.5t-40 -16.5q-27 0 -44 20t-17 47q0 67 60 154q41 60 88 111.5t142 142.5h26q-5 -91 -5 -177q0 -175 25 -225q10 -19 50 -19z" />
+<glyph unicode="&#x28d;" horiz-adv-x="667" d="M614 42v-27q-110 -18 -156 -28q-33 123 -33 274l-156 -274h-27l-31 333q-120 -140 -120 -187q0 -15 20 -38q22 -25 22 -48q0 -29 -16.5 -44.5t-40.5 -15.5q-25 0 -43 18.5t-18 43.5q0 131 272 413h27l23 -285q85 157 114 201l56 84h27v-46q0 -4 -0.5 -24.5t-0.5 -37.5 q0 -94 11.5 -191.5t26.5 -110.5q11 -10 43 -10z" />
+<glyph unicode="&#x28e;" horiz-adv-x="444" d="M169 352h-2q-52 -99 -69.5 -141t-17.5 -66q0 -13 25 -34q31 -25 31 -54q0 -21 -16 -39t-42 -18q-25 0 -43.5 19t-18.5 45q0 76 75.5 227t173.5 270q41 50 87.5 78t87.5 28q26 0 44 -17.5t18 -42.5q0 -22 -15.5 -39t-34.5 -17q-25 0 -51 18t-43 18q-13 0 -32 -15t-35 -37 q-25 -35 -25 -71q0 -50 50 -288q21 -94 40 -113q8 -8 14.5 -10t25.5 -2v-27q-86 -8 -150 -24q-43 111 -66 274z" />
+<glyph unicode="&#x28f;" horiz-adv-x="633" d="M606 464v-17q-38 -5 -60 -27l-209 -214l-32 -122q-7 -26 -7 -35q0 -17 13 -23t48 -9v-17h-274v17q49 4 65.5 17.5t26.5 53.5l24 93l-81 225q-13 38 -55 41v17h265v-17l-23 -2q-20 -2 -27.5 -3t-14 -6t-6.5 -15q0 -7 9 -36l53 -159l118 122q53 57 53 78q0 10 -12.5 14.5 t-47.5 6.5v17h174z" />
+<glyph unicode="&#x290;" horiz-adv-x="440" d="M343 156l-97 -275q-7 -21 -7 -34q0 -34 31 -34q37 0 37 17q0 6 -11.5 25.5t-11.5 33.5q0 23 17 38.5t42 15.5q28 0 45 -17t17 -44q0 -44 -37.5 -72t-98.5 -28q-28 0 -48 16t-20 43q0 22 10 50l40 109h-275v22l273 331h-136q-29 0 -45.5 -13.5t-27.5 -47.5l-27 3l44 154 h311v-10l-287 -343h174q29 0 60 60h28z" />
+<glyph unicode="&#x291;" horiz-adv-x="411" d="M80 96h95q54 84 114 84q87 0 87 -75q0 -46 -37 -75.5t-106 -29.5h-71l-55 -97h-42l55 97h-144v22l273 331h-136q-29 0 -45.5 -13.5t-27.5 -47.5l-27 3l44 154h311v-10zM219 96h57q57 0 57 25q0 12 -12.5 19t-26.5 7q-37 0 -75 -51z" />
+<glyph unicode="&#x292;" horiz-adv-x="499" d="M558 423l-246 -197q22 6 54 6q46 0 79 -37t33 -100q0 -140 -97 -235.5t-204 -95.5q-41 0 -82 10.5t-61 24.5q-44 31 -44 69q0 20 14.5 35t44.5 15q57 0 67 -67q4 -22 24.5 -36t44.5 -14q43 0 83 54.5t61.5 121.5t21.5 116q0 75 -56 75q-62 0 -122 -47l-20 24l290 232 h-204q-20 0 -50.5 -23.5t-44.5 -59.5h-26l76 156h364v-27z" />
+<glyph unicode="&#x293;" horiz-adv-x="499" d="M528 423l-246 -197q24 6 52 6q45 0 79.5 -35t34.5 -107q0 -93 -56.5 -181t-162.5 -130l22 -86h-48l-18 75q-20 -4 -53 -4q-142 0 -142 94q0 43 34 68.5t88 25.5q38 0 62.5 -25t40.5 -97q40 32 73 118t33 137q0 83 -56 83q-61 0 -122 -47l-20 24l290 232h-204 q-20 0 -50.5 -23.5t-44.5 -59.5h-26l76 156h364v-27zM177 -195q-27 110 -59 110q-19 0 -30 -14t-11 -36q0 -28 23 -46t56 -18q13 0 21 4z" />
+<glyph unicode="&#x294;" horiz-adv-x="530" d="M193 380h31q72 0 119.5 65t47.5 149q0 62 -35 62q-25 0 -45 -19t-26 -43q-16 -63 -72 -63q-25 0 -39 15.5t-14 32.5q0 47 55 79q47 27 123 27q79 0 130.5 -40.5t51.5 -105.5q0 -104 -70 -180.5t-178 -76.5l-44 -161q-12 -42 -12 -55q0 -41 49 -42v-24h-240v24q38 3 61 22 q13 10 18.5 19.5t12.5 36.5z" />
+<glyph unicode="&#x295;" horiz-adv-x="530" d="M152 84l54 198q-61 6 -94 49t-33 102q0 106 82 179t192 73q60 0 106 -30q50 -31 50 -76q0 -17 -14 -32.5t-39 -15.5q-55 0 -71 60l-7 25q-3 8 -9 19.5t-15.5 16t-22.5 4.5q-41 0 -82 -70t-41 -116q0 -41 30 -65.5t70 -24.5h32l-81 -293q-3 -12 -3 -21q0 -40 49 -42v-24 h-240v24q72 6 87 60z" />
+<glyph unicode="&#x296;" horiz-adv-x="487" d="M453 669v-24q-72 -6 -86 -60l-52 -196q63 -7 100 -50.5t37 -101.5q0 -108 -80 -179.5t-189 -71.5q-62 0 -110 23.5t-48 63.5q0 29 15 48t47 19q31 0 43 -17t18 -48q5 -25 21 -42.5t41 -17.5q44 0 78.5 60.5t34.5 126.5q0 40 -35 64.5t-75 24.5h-32l78 291q3 12 3 21 q0 40 -49 42v24h240z" />
+<glyph unicode="&#x297;" horiz-adv-x="479" d="M24 -82l104 385q13 49 57.5 86.5t95.5 55t98 17.5q60 0 112.5 -34.5t52.5 -84.5q0 -21 -16 -41.5t-47 -20.5q-23 0 -40 11.5t-17 29.5q0 16 6 30t6 26q0 25 -12.5 35.5t-38.5 10.5q-39 0 -73 -27t-45 -66l-109 -405q-6 -20 -6 -38q0 -33 17 -54t47 -21q46 0 88.5 35 t55.5 83l7 26h43l-11 -40q-18 -64 -80.5 -109t-143.5 -45q-64 0 -109.5 34.5t-45.5 88.5q0 17 4 32z" />
+<glyph unicode="&#x298;" horiz-adv-x="723" d="M438 328q0 -33 -22 -55.5t-55 -22.5q-34 0 -57.5 22.5t-23.5 55.5q0 34 23 57t57 23q32 0 55 -23t23 -57zM734 429q0 -115 -64 -218.5t-169 -165.5t-219 -62q-117 0 -193 68.5t-76 183.5q0 89 40.5 172.5t105 142.5t147.5 94.5t165 35.5q121 0 192 -69.5t71 -181.5z M606 464q0 177 -151 177q-81 0 -154 -63.5t-116.5 -166t-43.5 -213.5q0 -172 152 -172q81 0 154.5 67t116 168.5t42.5 202.5z" />
+<glyph unicode="&#x299;" horiz-adv-x="493" d="M105 464h229q152 0 152 -83q0 -52 -36 -83.5t-109 -47.5q50 -7 80.5 -32t30.5 -62q0 -69 -63.5 -112.5t-170.5 -43.5h-228v17q40 5 54.5 15t21.5 39l86 320q4 13 4 25q0 15 -11.5 22t-39.5 9v17zM229 257h14q65 0 96 36t31 98q0 50 -52 50q-40 0 -49 -35zM223 234 l-45 -167q-3 -13 -3 -19q0 -25 36 -25q48 0 83.5 43t35.5 102q0 66 -88 66h-19z" />
+<glyph unicode="&#x29a;" horiz-adv-x="465" d="M504 307q0 -61 -20.5 -114.5t-53 -90t-73 -63.5t-81 -40t-76.5 -13q-82 0 -133 25.5t-51 80.5t45.5 98t110.5 60q-66 34 -66 80q0 75 64.5 110t157.5 35q76 0 126 -45t50 -123zM317 227h-53q-42 0 -75 -39t-33 -90q0 -29 19 -46t51 -17q69 0 138.5 84t69.5 184 q0 60 -32 97.5t-83 37.5q-39 0 -66 -28.5t-27 -76.5q0 -29 24.5 -49t48.5 -20h18v-37z" />
+<glyph unicode="&#x29b;" horiz-adv-x="580" d="M467 109l-21 -79q-84 -41 -211 -41q-95 0 -150.5 45.5t-55.5 125.5q0 119 100.5 210.5t225.5 91.5q56 0 118 -28q14 41 44 73q40 31 81 31t66.5 -17.5t25.5 -47.5q0 -18 -11.5 -29.5t-29.5 -11.5q-16 0 -27.5 10.5t-11.5 25.5q0 13 7.5 25t7.5 14q0 11 -19 11 q-36 0 -48 -41l-48 -172h-18q-9 40 -17 59t-25 39q-32 37 -91 37q-79 0 -141 -99.5t-62 -214.5q0 -56 23 -86t81 -30q67 0 83 57l12 43q6 24 6 35q0 17 -13 23.5t-50 8.5v16h251v-16q-41 -4 -57 -19t-25 -49z" />
+<glyph unicode="&#x29c;" horiz-adv-x="582" d="M676 464v-17q-39 -3 -55.5 -13.5t-23.5 -37.5l-88 -329q-3 -12 -3 -20q0 -14 12 -20t43 -10v-17h-248v17q41 5 56 14.5t22 35.5l42 157h-177l-42 -157q-3 -12 -3 -20q0 -14 12 -20t44 -10v-17h-246v17q39 5 53.5 14t21.5 36l88 329q4 18 4 22q0 15 -11.5 21t-40.5 8v17 h246v-17q-40 -3 -56.5 -13t-23.5 -38l-37 -140h177l37 140q3 12 3 21q0 15 -12 21.5t-42 8.5v17h248z" />
+<glyph unicode="&#x29d;" horiz-adv-x="475" d="M463 617q0 -28 -20 -47.5t-49 -19.5q-28 0 -47 20t-19 49q0 26 20 46t46 20q28 0 48.5 -20t20.5 -48zM423 462l-116 -444q-13 -51 -29 -87q17 -15 32 -38t22.5 -36.5t23.5 -48.5l18 -41h-48q-34 87 -70 120q-41 -65 -85.5 -92.5t-106.5 -27.5q-51 0 -82.5 28t-31.5 70 q0 63 52.5 101t112.5 38q44 0 69 -13l81 319q12 45 12 67q0 30 -41 30h-22v27q136 12 209 28zM163 -87l10 35q-27 16 -75 16q-38 0 -73 -28t-35 -70q0 -29 23 -44t53 -15q39 0 61 28t36 78z" />
+<glyph unicode="&#x29e;" d="M528 449l-157 -566q-7 -24 -7 -42q0 -20 7 -27t23 -7h34v-27q-96 -5 -209 -30l124 461q-95 -75 -130 -109.5t-35 -53.5q0 -12 10.5 -16.5t39.5 -6.5v-25h-206v25q37 5 61.5 18.5t73.5 57.5l64 58q-19 95 -33 145.5t-24 66t-22 15.5q-28 0 -64 -64l-22 11q32 68 65 96 t73 28q47 0 72.5 -46.5t50.5 -176.5l39 27l50 188h122z" />
+<glyph unicode="&#x29f;" horiz-adv-x="485" d="M468 156l-66 -156h-392v17q34 4 48.5 16t19.5 34l81 328q4 20 4 24q0 15 -10.5 20.5t-35.5 7.5v17h238v-17q-43 -1 -56.5 -13t-24.5 -54l-76 -303q-4 -14 -4 -23q0 -31 60 -31q67 0 112 36q36 29 80 97h22z" />
+<glyph unicode="&#x2a0;" horiz-adv-x="488" d="M347 390l24 93q26 99 161 99q64 0 103 -28t39 -72q0 -28 -17 -46t-44 -18q-25 0 -42.5 17t-17.5 40q0 20 11 36.5t11 20.5q0 19 -29 19q-25 0 -39.5 -14.5t-24.5 -48.5l-140 -500q-36 -131 -36 -138q0 -28 49 -28h17v-27h-268v27q45 0 62 13t30 56l61 207 q-60 -111 -154 -111q-49 0 -75.5 34t-26.5 96q0 84 54 178q44 77 102.5 122t115.5 45q40 0 57 -22q10 -13 17 -50zM325 371q0 48 -35 48q-27 0 -58 -35.5t-53 -79.5q-53 -109 -53 -188q0 -57 39 -57q45 0 88 74q27 47 49.5 121t22.5 117z" />
+<glyph unicode="&#x2a1;" horiz-adv-x="530" d="M193 380h31q72 0 119.5 65t47.5 149q0 62 -35 62q-25 0 -45 -19t-26 -43q-16 -63 -72 -63q-25 0 -39 15.5t-14 32.5q0 47 55 79q47 27 123 27q79 0 130.5 -40.5t51.5 -105.5q0 -104 -70 -180.5t-178 -76.5l-21 -74h66l-12 -46h-66l-11 -41q-12 -45 -12 -55q0 -41 49 -42 v-24h-240v24q38 3 61 22q13 10 18.5 19.5t12.5 36.5l16 60h-66l12 46h66z" />
+<glyph unicode="&#x2a2;" horiz-adv-x="530" d="M184 208l21 74q-62 6 -95 49t-33 102q0 107 82.5 179.5t191.5 72.5q55 0 101 -27q55 -32 55 -79q0 -17 -14 -32.5t-39 -15.5q-54 0 -71 60q-9 34 -19.5 49.5t-34.5 15.5q-41 0 -82 -70t-41 -116q0 -41 30 -65.5t70 -24.5h32l-47 -172h66l-12 -46h-66l-21 -75 q-3 -12 -3 -21q0 -40 50 -42v-24h-240v24q71 6 86 60l21 78h-65l12 46h65z" />
+<glyph unicode="&#x2a3;" horiz-adv-x="750" d="M735 439l-288 -343h175q29 0 60 60h28l-55 -156h-297q-51 -11 -58 -11q-28 0 -44 16t-16 45q0 20 11 68q-72 -131 -166 -131q-48 0 -77 32.5t-29 92.5q0 72 37 150t94 132q70 68 138 68q46 0 75 -33l18 64q29 102 29 122q0 28 -41 28h-21v27q129 10 209 29l-69 -250h287 v-10zM616 353h-136q-29 0 -45.5 -13.5t-27.5 -47.5h-2l-42 -154q-14 -53 -14 -63q0 -5 3.5 -10t7.5 -5q14 0 35 25zM308 371q0 21 -10.5 35t-26.5 14q-57 1 -114 -112q-24 -48 -39 -100.5t-15 -85.5q0 -28 11.5 -46t29.5 -18q45 0 86 75q27 48 52.5 126.5t25.5 111.5z" />
+<glyph unicode="&#x2a4;" horiz-adv-x="820" d="M813 423l-209 -191h17q46 0 79 -37t33 -100q0 -140 -97 -235.5t-204 -95.5q-41 0 -82 10.5t-61 24.5q-44 31 -44 69q0 20 14.5 35t44.5 15q57 0 67 -67q4 -22 24.5 -36t44.5 -14q43 0 83 54.5t61.5 121.5t21.5 116q0 75 -56 75q-19 0 -43 -23l-102 -98q-61 -58 -105 -58 q-28 0 -44 16t-16 45q0 20 11 68q-72 -131 -166 -131q-48 0 -77 32.5t-29 92.5q0 72 37 150t94 132q70 68 138 68q46 0 75 -33l18 64q29 102 29 122q0 28 -41 28h-21v27q129 10 209 29l-68 -249h364v-27zM704 377h-211q-17 0 -46.5 -21t-37.5 -50l-50 -183q-8 -29 -8 -38 q0 -19 11 -19q4 0 14.5 8.5t27.5 25.5l17 16zM308 371q0 21 -10.5 35t-26.5 14q-57 1 -114 -112q-24 -48 -39 -100.5t-15 -85.5q0 -28 11.5 -46t29.5 -18q45 0 86 75q27 48 52.5 126.5t25.5 111.5z" />
+<glyph unicode="&#x2a5;" horiz-adv-x="817" d="M448 96h94q54 84 114 84q87 0 87 -75q0 -46 -37 -75.5t-106 -29.5h-71l-55 -97h-42l55 97h-124q-44 -11 -63 -11q-28 0 -44 16t-16 45q0 20 11 68q-72 -131 -166 -131q-48 0 -77 32.5t-29 92.5q0 72 37 150t94 132q70 68 138 68q46 0 75 -33l18 64q29 102 29 122 q0 28 -41 28h-21v27q129 10 209 29l-69 -250h287v-10zM586 96h57q57 0 57 25q0 12 -12.5 19t-26.5 7q-37 0 -75 -51zM616 353h-136q-29 0 -45.5 -13.5t-27.5 -47.5h-2l-42 -154q-14 -53 -14 -63q0 -5 3.5 -10t7.5 -5q14 0 39 30zM308 371q0 21 -10.5 35t-26.5 14 q-57 1 -114 -112q-24 -48 -39 -100.5t-15 -85.5q0 -28 11.5 -46t29.5 -18q45 0 86 75q27 48 52.5 126.5t25.5 111.5z" />
+<glyph unicode="&#x2a6;" horiz-adv-x="560" d="M524 461l-23 -154l-27 2q-12 63 -33 91.5t-55 28.5q-24 0 -38.5 -14.5t-14.5 -38.5q0 -33 57 -99q80 -93 80 -162q0 -56 -43 -92t-105 -36q-35 0 -64 12q-16 6 -37.5 23.5t-35.5 35.5q-56 -67 -121 -67q-67 0 -67 65q0 28 25 115l67 236h-52v35q62 21 103 55t81 97h35 l-39 -145h88q31 13 67 13q32 0 58 -12q21 -10 37 -10q11 0 16 4t12 17h29zM211 141l23 -15q-3 -5 -7 -11q22 -98 87 -98q29 0 44.5 14.5t15.5 39.5q0 41 -56 104q-50 56 -65 87.5t-15 73.5t18 71h-50l-34 -119q-53 -185 -53 -209q0 -18 16 -18q25 0 76 80z" />
+<glyph unicode="&#x2a7;" horiz-adv-x="453" d="M190 449h128q68 234 242 234q52 0 81 -21t29 -57q0 -26 -15 -43.5t-39 -17.5q-23 0 -38 14t-15 33q0 14 9 29.5t9 18.5q0 5 -6.5 9.5t-16.5 4.5q-19 0 -34.5 -13.5t-27 -42.5t-16.5 -45t-14 -50l-114 -454q-15 -60 -33 -104.5t-47.5 -87.5t-75 -66t-104.5 -23 q-50 0 -80 21t-30 57q0 26 15 43.5t39 17.5q23 0 38 -14t15 -33q0 -14 -9 -29.5t-9 -18.5q0 -14 26 -14q21 0 36.5 12t27 39.5t17 44.5t14.5 54l41 166q-43 -42 -64.5 -61t-60 -40t-71.5 -21q-67 0 -67 65q0 28 25 115l67 236h-52v35q62 21 103 55t81 97h35zM306 407h-127 l-34 -119q-53 -185 -53 -209q0 -18 16 -18t57 34.5t86 93.5z" />
+<glyph unicode="&#x2a8;" horiz-adv-x="600" d="M335 144v-19q128 49 205 49q36 0 57 -21t21 -50q0 -67 -70 -100q-44 -21 -115 -21q-42 0 -70 2.5t-67 17.5t-64 43q-36 -18 -88 -36t-80 -18q-67 0 -67 65q0 28 25 115l67 236h-52v35q62 21 103 55t81 97h35l-39 -145h72v-42h-83l-34 -119q-53 -185 -53 -209 q0 -18 16 -18q21 0 81 18q-9 25 -9 59q0 134 105 239q83 85 180 85q46 0 79 -25.5t33 -64.5q0 -32 -17 -51.5t-45 -19.5q-25 0 -41.5 15t-16.5 38q0 16 10.5 32t10.5 26q0 7 -7.5 12t-16.5 5q-26 0 -47.5 -22.5t-45.5 -65.5q-53 -99 -53 -197zM573 99q0 30 -47 30 q-69 0 -179 -43q14 -29 54 -44t85 -15q41 0 64 22t23 50z" />
+<glyph unicode="&#x2b0;" horiz-adv-x="380" d="M349 440l16 -11q-35 -57 -60 -79t-57 -22q-21 0 -34 13t-13 35q0 19 4 31l56 179q4 15 4 22q0 16 -14 16q-31 0 -76 -70q-26 -40 -41.5 -81t-41.5 -138h-85l106 414q7 26 7 37q0 24 -29 24h-15v20q68 6 146 22l-76 -308q52 79 83 106t67 27q25 0 39 -15t14 -41 q0 -16 -6 -36l-56 -185q-2 -6 -2 -9q0 -12 12 -12t52 61z" />
+<glyph unicode="&#x2b1;" horiz-adv-x="380" d="M349 441l16 -11q-35 -57 -60 -79t-57 -22q-21 0 -34 13t-13 35q0 16 5 34l55 176q4 15 4 22q0 16 -14 16q-31 0 -76 -70q-25 -40 -41 -81t-42 -138h-85l105 411q24 94 127 94q45 0 72.5 -20.5t27.5 -53.5q0 -21 -12 -34t-31 -13q-18 0 -30 12.5t-12 29.5q0 15 8 27t8 15 q0 14 -21 14q-36 0 -48 -51l-55 -222q52 79 83 106t67 27q25 0 39 -15t14 -41q0 -16 -5 -34l-57 -187q-2 -6 -2 -10q0 -11 12 -11t52 61z" />
+<glyph unicode="&#x2b2;" horiz-adv-x="350" d="M384 965q0 -22 -15.5 -37t-37.5 -15q-21 0 -36 15.5t-15 37.5q0 20 15.5 35.5t35.5 15.5q22 0 37.5 -15.5t15.5 -36.5zM353 845l-89 -341q-24 -91 -62 -132t-97 -41q-36 0 -58.5 16.5t-22.5 42.5q0 17 11 29t27 12q17 0 27 -10.5t10 -27.5q0 -9 -5.5 -15.5t-5.5 -11.5 q0 -11 18 -11q17 0 29.5 23t27.5 81l69 269q9 34 9 52q0 23 -32 23h-16v21q101 8 160 21z" />
+<glyph unicode="&#x2b3;" horiz-adv-x="389" d="M181 533h1q53 91 84.5 124t66.5 33q23 0 37 -13.5t14 -35.5q0 -24 -14.5 -39.5t-37.5 -15.5q-19 0 -33 14t-21 14q-20 0 -57 -57q-34 -52 -66 -139l-27 -74h-107q90 257 90 286q0 11 -10.5 15t-39.5 4v20q118 9 178 21z" />
+<glyph unicode="&#x2b4;" horiz-adv-x="389" d="M258 690h107q-90 -257 -90 -286q0 -11 10.5 -15t39.5 -4v-20q-118 -9 -178 -21l58 157h-1q-53 -91 -84.5 -124t-66.5 -33q-23 0 -37 13.5t-14 35.5q0 24 14.5 39.5t37.5 15.5q19 0 33 -14t21 -14q20 0 57 57q34 52 66 139z" />
+<glyph unicode="&#x2b5;" horiz-adv-x="389" d="M364 690l-143 -425q-4 -8 -4 -21q0 -21 11 -35.5t27 -14.5q30 0 30 9q0 6 -10.5 17t-10.5 27q0 20 15 32t37 12q24 0 39.5 -15t15.5 -36q0 -32 -34 -50.5t-90 -18.5q-60 0 -91.5 26t-31.5 70q0 14 4 25l77 209h-1q-53 -90 -84.5 -123t-66.5 -33q-23 0 -37 13.5t-14 35.5 q0 24 14.5 39.5t37.5 15.5q19 0 33 -14.5t21 -14.5q19 0 57 57q34 52 66 139l27 74h106z" />
+<glyph unicode="&#x2b6;" horiz-adv-x="390" d="M466 684v-12q-14 0 -27 -11l-147 -142q69 -16 69 -65q0 -55 -51.5 -82t-140.5 -27h-164v12q46 0 60 51l58 215q5 20 5 28q0 11 -8 15t-31 6v12h184v-12q-34 -4 -43 -11.5t-17 -35.5l-26 -98h15l155 157h109zM183 510l-34 -126q-1 -3 -1 -9q0 -13 23 -13q44 0 70 28t26 76 q0 42 -84 44z" />
+<glyph unicode="&#x2b7;" horiz-adv-x="450" d="M296 690l23 -252q91 106 91 142q0 10 -15 29q-17 18 -17 36q0 21 12.5 33t30.5 12q19 0 32.5 -14t13.5 -33q0 -98 -205 -312h-20l-18 216q-54 -103 -86 -152l-42 -64h-20v82q0 71 -8.5 144.5t-19.5 83.5q-10 8 -33 8v20q91 15 118 21q25 -96 25 -207q40 74 118 207h20z " />
+<glyph unicode="&#x2b8;" horiz-adv-x="350" d="M268 419h2q67 128 67 159q0 10 -19 26q-24 20 -24 42q0 16 12 30t32 14q19 0 33.5 -14.5t14.5 -34.5q0 -58 -58.5 -174.5t-133.5 -208.5q-66 -82 -135 -82q-20 0 -34 13.5t-14 32.5q0 17 12 30t27 13q19 0 39.5 -13.5t32.5 -13.5q24 0 52 40q19 26 19 54q0 41 -38 222 q-16 72 -31 87q-10 10 -31 10v21q63 5 116 18q34 -88 51 -211z" />
+<glyph unicode="&#x2bb;" horiz-adv-x="333" d="M319 685l13 -25q-118 -63 -118 -116q0 -21 30 -37q40 -23 40 -65q0 -35 -20.5 -54t-52.5 -19q-39 0 -61 26t-22 68q0 67 51 125.5t140 96.5z" />
+<glyph unicode="&#x2c0;" horiz-adv-x="343" d="M52 441h26q60 0 99.5 53t39.5 121q0 51 -28 51q-13 0 -22.5 -8.5t-13 -18t-7.5 -24.5q-13 -51 -60 -51q-21 0 -32.5 12.5t-11.5 26.5q0 39 46 65q40 22 86 22q65 0 107 -33.5t42 -86.5q0 -77 -67 -143t-152 -66q-14 0 -25 1l-39 -122h-43z" />
+<glyph unicode="&#x2c1;" horiz-adv-x="326" d="M135 240l27 122q-11 -1 -25 -1q-57 0 -87 35t-30 87q0 89 63 148t152 59q49 0 87 -24q42 -26 42 -63q0 -14 -11.5 -26.5t-31.5 -12.5q-44 0 -57 46q-5 19 -8 28t-12.5 18.5t-23.5 9.5q-33 0 -63.5 -57t-30.5 -95q0 -34 23.5 -53.5t55.5 -19.5h27l-54 -201h-43z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="333" d="M367 516h-51l-88 95l-131 -95h-57l160 174h81z" />
+<glyph unicode="&#x2c7;" horiz-adv-x="333" d="M411 690l-162 -174h-82l-88 174h51l90 -97l134 97h57z" />
+<glyph unicode="&#x2d8;" horiz-adv-x="333" d="M348 678h39q-33 -162 -178 -162q-138 0 -138 149v13h43q8 -90 99 -90q50 0 81 20.5t54 69.5z" />
+<glyph unicode="&#x2d9;" horiz-adv-x="333" d="M293 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x2da;" horiz-adv-x="333" d="M340 648q0 -44 -31.5 -75.5t-75.5 -31.5q-48 0 -77 30t-29 78q0 44 31.5 74.5t75.5 30.5q47 0 76.5 -30.5t29.5 -75.5zM292 646q0 25 -17.5 42.5t-42.5 17.5q-23 0 -40 -17.5t-17 -41.5t17 -41t40 -17q25 0 42.5 17t17.5 40z" />
+<glyph unicode="&#x2db;" horiz-adv-x="333" d="M167 -84l22 -14q-19 -35 -53 -55t-73 -20q-47 0 -75 21t-28 60q0 25 11.5 47t42.5 60l14 17l33 12l-5 -20q-12 -50 -12 -66q0 -62 61 -62q22 0 48 13z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="333" d="M366 655h41q-16 -63 -44 -91t-73 -28q-25 0 -57 13l-59 23q-21 8 -38 8q-31 0 -48 -43h-40q10 54 41.5 86t74.5 32q38 0 97 -26q39 -16 54 -16q17 0 28.5 9t22.5 33z" />
+<glyph unicode="&#x2dd;" horiz-adv-x="333" d="M258 516l122 133q43 48 70 48q20 0 34 -14t14 -33q0 -27 -39 -49l-151 -85h-50zM69 516l122 133q43 48 70 48q20 0 34 -13t14 -32q0 -29 -39 -51l-149 -85h-52z" />
+<glyph unicode="&#x2e0;" horiz-adv-x="379" d="M423 667h-8q-14 0 -50 -42l-161 -189l38 -117q5 -17 5 -34q0 -44 -42.5 -69.5t-92.5 -25.5q-98 0 -98 47q0 33 40 78l73 87l-50 159q-21 69 -24 78q-5 15 -11 21t-19 7v17h152v-17q-35 0 -35 -25q0 -3 7 -26l44 -139l97 113q42 49 42 59q0 18 -26 18v17h119v-17zM140 361 l-37 -44q-43 -52 -43 -71q0 -17 15.5 -24.5t31.5 -7.5q18 0 41 10.5t23 30.5q0 16 -20 72z" />
+<glyph unicode="&#x2e1;" horiz-adv-x="222" d="M217 857l-108 -390q-16 -58 -16 -74q0 -12 11 -12q18 0 59 60l16 -10q-39 -60 -64.5 -81t-61.5 -21q-22 0 -36.5 13.5t-14.5 33.5q0 24 26 116l55 193q25 90 25 108q0 23 -31 23q-8 0 -16 -1v20q74 7 156 22z" />
+<glyph unicode="&#x2e2;" horiz-adv-x="280" d="M274 689l-18 -116l-20 2q-17 90 -67 90q-18 0 -29 -11t-11 -29q0 -25 43 -75q61 -70 61 -122q0 -42 -32.5 -69.5t-79.5 -27.5q-27 0 -48 9q-15 6 -23 6q-15 0 -22 -15h-20l16 126l21 -3q12 -98 70 -98q45 0 45 39q0 30 -42 78q-37 42 -48.5 66t-11.5 56q0 45 27.5 70 t73.5 25q25 0 44 -9q14 -7 28 -7q12 0 21 15h22z" />
+<glyph unicode="&#x2e3;" horiz-adv-x="389" d="M68 672l123 18q22 -33 35 -103q42 62 66.5 82.5t51.5 20.5q17 0 30 -13.5t13 -31.5q0 -16 -12 -28t-29 -12q-9 0 -22 7.5t-21 7.5q-13 0 -32 -19.5t-37 -50.5l24 -118q8 -39 28 -39q10 0 19 8t31 36l16 -11q-35 -49 -60.5 -70t-52.5 -21q-28 0 -44 25.5t-29 90.5l-18 -29 q-33 -54 -51.5 -70.5t-46.5 -16.5q-21 0 -34 12t-13 32q0 18 12 30.5t29 12.5q12 0 25.5 -8t20.5 -8q10 0 16.5 5.5t18.5 23.5l33 53l-22 114q-5 28 -14.5 40t-27.5 12q-12 0 -26 -2v20z" />
+<glyph unicode="&#x2e4;" horiz-adv-x="328" d="M102 413l28 107q-54 2 -82 36.5t-28 85.5q0 89 63 148t152 59q49 0 87 -24q42 -26 42 -63q0 -14 -11.5 -26.5t-31.5 -12.5q-44 0 -57 46q-5 19 -8 28t-12.5 18.5t-23.5 9.5q-33 0 -63.5 -57t-30.5 -95q0 -34 23.5 -53.5t55.5 -19.5h27l-53 -198q-4 -18 -4 -24 q0 -16 13 -23t45 -9v-17h-224v17q48 3 64.5 13t28.5 54z" />
+<glyph unicode="&#x2ec;" horiz-adv-x="314" d="M309 70l-131 -237h-43l-130 237h78l74 -136l74 136h78z" />
+<glyph unicode="&#x2ed;" horiz-adv-x="395" d="M390 648h-385v72h385v-72zM390 528h-385v72h385v-72z" />
+<glyph unicode="&#x384;" horiz-adv-x="300" d="M140 516l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48z" />
+<glyph unicode="&#x385;" horiz-adv-x="380" d="M140 516l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48zM440 580q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19t-19 45q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM157 580q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45 q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x386;" horiz-adv-x="667" d="M123 529l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48zM593 0h-303v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5 t61 -19.5v-25zM346 248l-37 243l-148 -243h185z" />
+<glyph unicode="&#x387;" horiz-adv-x="333" d="M264 385q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52z" />
+<glyph unicode="&#x388;" horiz-adv-x="700" d="M10 529l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48zM748 669l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5 t-114 19.5l-63 -234q-8 -32 -8 -38q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5l-60 -194h-553v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="&#x389;" horiz-adv-x="850" d="M9 529l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48zM889 669v-25q-36 0 -53.5 -16.5t-28.5 -57.5l-111 -408q-22 -84 -22 -96q0 -22 16 -30.5t57 -10.5v-25h-316v25q51 3 70 17.5t32 61.5l62 225h-239l-54 -197q-12 -43 -12 -67 q0 -34 71 -40v-25h-295v25q39 5 54 18.5t27 55.5l121 447q11 38 11 58q0 17 -9.5 25t-32.5 11l-31 4v25h316v-25q-49 -2 -69 -17t-33 -63l-52 -191h239l47 173q10 38 10 61q0 15 -9 22.5t-32 10.5l-31 4v25h297z" />
+<glyph unicode="&#x38a;" horiz-adv-x="450" d="M9 529l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48zM503 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z " />
+<glyph unicode="&#x38c;" horiz-adv-x="722" d="M11 529l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48zM691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528 q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#x38e;" horiz-adv-x="700" d="M855 628l-17 -19q-31 26 -75 26q-62 0 -119 -79q-62 -87 -106 -248l-53 -192q-10 -34 -10 -49q0 -24 16.5 -33t62.5 -9v-25h-323v25q51 5 71.5 19t32.5 59l56 209q0 40 -5 84.5t-17 97.5t-39 87.5t-65 34.5q-30 0 -68 -29l-18 18q52 80 150 80q52 0 89.5 -24t57.5 -65 t29 -86.5t9 -98.5h4q36 109 102 187.5t141 78.5q63 0 94 -49zM8 529l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48z" />
+<glyph unicode="&#x38f;" horiz-adv-x="808" d="M279 124v32q-84 34 -117 85t-33 126q0 72 46.5 145t127.5 119q95 54 231 54q118 0 179 -57t61 -159q0 -112 -74.5 -197t-207.5 -118l-9 -30h111q52 0 75.5 13.5t52.5 61.5l25 -6l-64 -193h-295l60 192q80 17 131 103t51 186q0 170 -107 170q-62 0 -120.5 -46.5 t-94 -119.5t-35.5 -147q0 -56 14 -89t53 -57l-29 -192h-286l41 199l25 6q0 -44 22.5 -62.5t66.5 -18.5h99zM26 529l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48z" />
+<glyph unicode="&#x390;" horiz-adv-x="278" d="M250 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61zM119 516l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48z M419 580q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM136 580q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19t-19 45q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x391;" horiz-adv-x="667" d="M593 0h-303v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5t61 -19.5v-25zM346 248l-37 243l-148 -243h185z" />
+<glyph unicode="&#x392;" horiz-adv-x="667" d="M118 669h265q241 0 241 -146q0 -39 -13.5 -67t-44 -47t-57 -29.5t-74.5 -24.5v-1q72 -20 104.5 -55.5t32.5 -92.5q0 -99 -78 -152.5t-217 -53.5h-302v25q36 5 54 22t30 61l119 438q11 39 11 57t-10.5 27.5t-23.5 11.5t-37 2v25zM334 577l-57 -209q5 0 21.5 1.5t21.5 1.5 t18.5 1.5t19 2.5t16 3.5t16.5 5.5l13 6q8 3 14.5 7.5t12.5 10.5q47 44 47 128q0 101 -87 101q-25 0 -35 -10t-21 -50zM269 338l-64 -236q-7 -27 -7 -37q0 -33 57 -33q73 0 121 59q43 52 43 138q0 58 -35 85q-28 21 -115 24z" />
+<glyph unicode="&#x393;" horiz-adv-x="585" d="M670 669l-43 -190l-27 5q0 75 -20 100q-42 53 -167 53q-31 0 -43 -9.5t-20 -38.5l-125 -457q-15 -56 -15 -63q0 -23 14.5 -32t56.5 -12v-25h-294v25q41 4 55.5 19.5t26.5 59.5l121 442q10 38 10 61q0 28 -42 33l-31 4v25h543z" />
+<glyph unicode="&#x394;" horiz-adv-x="667" d="M549 0h-614l453 683h25zM384 124l-75 367l-240 -367h315z" />
+<glyph unicode="&#x395;" horiz-adv-x="667" d="M653 669l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5t-114 19.5l-63 -234q-8 -32 -8 -38q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5 l-60 -194h-553v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="&#x396;" horiz-adv-x="611" d="M589 640l-434 -605h75q70 0 115.5 11t83.5 39q49 37 97 114l27 -5l-60 -194h-505v29l434 605h-83q-79 0 -133.5 -32t-113.5 -115l-28 4l58 178h467v-29z" />
+<glyph unicode="&#x397;" horiz-adv-x="778" d="M799 669v-25q-36 0 -53.5 -16.5t-28.5 -57.5l-111 -408q-22 -84 -22 -96q0 -22 16 -30.5t57 -10.5v-25h-316v25q51 3 70 17.5t32 61.5l62 225h-239l-54 -197q-12 -43 -12 -67q0 -34 71 -40v-25h-295v25q39 5 54 18.5t27 55.5l121 447q11 38 11 58q0 17 -9.5 25t-32.5 11 l-31 4v25h316v-25q-49 -2 -69 -17t-33 -63l-52 -191h239l47 173q10 38 10 61q0 15 -9 22.5t-32 10.5l-31 4v25h297z" />
+<glyph unicode="&#x398;" horiz-adv-x="718" d="M466 457l28 -4q-41 -88 -59 -254l-27 3q0 39 -7 52t-35 13h-41q-34 0 -49 -12.5t-37 -52.5l-26 10q47 96 56 241l29 4q1 -43 10.5 -56.5t46.5 -13.5h34q30 0 43.5 13t33.5 57zM691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5 q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528q0 60 -27 91.5t-74 31.5q-52 0 -89.5 -20.5t-72.5 -79.5q-45 -76 -79 -197.5t-34 -210.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#x399;" horiz-adv-x="389" d="M406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z" />
+<glyph unicode="&#x39a;" horiz-adv-x="667" d="M702 669v-25q-33 -5 -47.5 -12t-46.5 -36l-216 -199l157 -333q9 -19 22 -27.5t41 -11.5v-25h-280l1 25l26 4q21 3 29.5 8t8.5 15q0 16 -15 49l-111 236l-67 -249q-2 -10 -2 -17q0 -25 13 -34t52 -12v-25h-288v25q36 4 52.5 17t26.5 51l123 453q11 38 11 58q0 17 -9 25 t-32 11l-33 4v25h311v-25q-45 -4 -64.5 -18.5t-29.5 -53.5l-62 -227l197 175q77 68 77 97q0 22 -35 25l-21 2v25h211z" />
+<glyph unicode="&#x39b;" horiz-adv-x="655" d="M581 0h-303v25q77 6 77 49q0 3 -2 15l-50 399h-2l-220 -376q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l364 582h25l88 -560q10 -62 24.5 -78.5t61.5 -19.5v-25z" />
+<glyph unicode="&#x39c;" horiz-adv-x="889" d="M917 669v-25q-39 -5 -55 -20t-29 -61l-119 -438q-10 -34 -10 -57q0 -25 14 -34t57 -9v-25h-311v25q50 3 69.5 18.5t31.5 60.5l123 457l-375 -573h-28l-67 559l-101 -369q-20 -71 -20 -92q0 -33 15.5 -44.5t64.5 -16.5v-25h-206v25q40 9 58 36.5t45 120.5l107 369 q11 41 11 58q0 22 -12 28.5t-59 6.5v25h219l54 -480l311 480h212z" />
+<glyph unicode="&#x39d;" horiz-adv-x="722" d="M748 669v-25q-42 -8 -58.5 -32.5t-43.5 -120.5l-143 -506h-28l-257 547l-99 -354q-19 -66 -19 -94q0 -29 17.5 -42t61.5 -17v-25h-206v25q42 8 56 30t45 125l120 407q-15 34 -28.5 43.5t-53.5 13.5v25h193l216 -467l81 289q19 71 19 94q0 59 -81 59v25h208z" />
+<glyph unicode="&#x39e;" horiz-adv-x="746" d="M740 669l-28 -183l-25 5q0 38 -18 48t-74 10h-301q-33 0 -50.5 -11t-45.5 -52l-26 7l58 176h510zM618 462l-64 -231l-25 3q0 33 -12 46t-45 13h-161q-41 0 -56.5 -12t-31.5 -50l-25 3l64 236l25 -2q0 -34 10 -47.5t46 -13.5h159q35 0 56 11t35 50zM653 199l-64 -199h-564 l41 205l25 6q0 -44 22.5 -62.5t66.5 -18.5h320q52 0 75.5 13.5t52.5 61.5z" />
+<glyph unicode="&#x39f;" horiz-adv-x="722" d="M691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM547 528q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92 t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#x3a0;" horiz-adv-x="778" d="M799 669v-25q-36 0 -53.5 -16.5t-28.5 -57.5l-111 -408q-22 -84 -22 -96q0 -22 16 -30.5t57 -10.5v-25h-316v25q51 3 70 17.5t32 61.5l144 525h-239l-136 -497q-12 -43 -12 -67q0 -34 71 -40v-25h-295v25q39 5 54 18.5t27 55.5l121 447q11 38 11 58q0 17 -9.5 25 t-32.5 11l-31 4v25h683z" />
+<glyph unicode="&#x3a1;" horiz-adv-x="611" d="M112 669h282q219 0 219 -155q0 -80 -59 -131q-75 -66 -214 -66q-37 0 -81 5l-54 -199q-11 -37 -11 -58q0 -20 15 -29t57 -11v-25h-294v25q40 6 55.5 20.5t28.5 61.5l117 426q13 46 13 74q0 15 -9 22.5t-32 10.5l-33 4v25zM330 584l-61 -229q17 -3 42 -3q46 0 74.5 14.5 t48.5 47.5q33 52 33 136q0 40 -22.5 63.5t-61.5 23.5q-26 0 -35 -9.5t-18 -43.5z" />
+<glyph unicode="&#x3a3;" horiz-adv-x="633" d="M619 669l-37 -181l-25 4q0 71 -30.5 106.5t-96.5 35.5h-152l146 -262l-260 -238h225q62 0 88.5 15t55.5 64l26 -5l-61 -208h-509v28l313 287l-186 325v29h503z" />
+<glyph unicode="&#x3a4;" horiz-adv-x="611" d="M650 669l-36 -192l-27 2q0 85 -31.5 120t-106.5 35l-135 -489q-17 -58 -17 -74q0 -46 83 -46v-25h-331v25h15q72 0 91 72l148 537q-79 -2 -130 -34t-88 -109l-25 7l39 171h551z" />
+<glyph unicode="&#x3a5;" horiz-adv-x="611" d="M697 628l-17 -19q-31 26 -75 26q-62 0 -119 -79q-62 -87 -106 -248l-53 -192q-10 -34 -10 -49q0 -24 16.5 -33t62.5 -9v-25h-323v25q51 5 71.5 19t32.5 59l56 209q0 40 -5 84.5t-17 97.5t-39 87.5t-65 34.5q-30 0 -68 -29l-18 18q52 80 150 80q52 0 89.5 -24t57.5 -65 t29 -86.5t9 -98.5h4q36 109 102 187.5t141 78.5q63 0 94 -49z" />
+<glyph unicode="&#x3a6;" horiz-adv-x="771" d="M538 581l-4 -18q101 -1 165 -44t64 -132q0 -72 -38 -131t-95 -92.5t-115 -51t-107 -17.5q-4 -16 -4 -29q0 -22 17 -31.5t62 -9.5v-25h-311v25q48 4 61.5 15t25.5 55h-8q-103 0 -164 51t-61 143q0 85 56 149.5t133.5 94.5t157.5 30h15q7 33 7 44q0 28 -45 33l-35 4v25h311 v-25q-74 0 -88 -63zM521 529l-108 -400q83 0 144.5 80.5t61.5 178.5q0 52 -24.5 90t-73.5 51zM272 129l109 400q-86 0 -148.5 -85.5t-62.5 -188.5q0 -126 102 -126z" />
+<glyph unicode="&#x3a7;" horiz-adv-x="667" d="M694 669v-25q-28 -4 -47.5 -16t-51.5 -45l-199 -205l75 -237q21 -66 41.5 -88t73.5 -28v-25h-307v25q42 4 54.5 11t12.5 27q0 30 -37 141l-20 60l-130 -144q-32 -35 -32 -55q0 -34 63 -40v-25h-214v25q10 2 17.5 4t16.5 8l17 11q7 4 19 16l22 20l26 27l30 33l38 42l45 49 l68 74l-83 269q-12 40 -29 50.5t-64 15.5v25h305v-25l-29 -3q-25 -2 -35 -9t-10 -24q0 -21 35 -132l17 -55l94 99q70 74 70 98q0 21 -33 24l-21 2v25h202z" />
+<glyph unicode="&#x3a8;" horiz-adv-x="661" d="M780 685v-25q-20 0 -35 -9t-23.5 -20t-15 -31t-8.5 -32t-5 -33q-9 -63 -43 -109.5t-82 -70.5t-95 -35t-93 -11l-52 -192q-10 -40 -10 -51q0 -22 17 -31.5t62 -9.5v-25h-323v25q49 5 70.5 19t33.5 59l56 206q-212 0 -212 157q0 31 14.5 78.5t14.5 77.5q0 37 -34 38v25h36 q59 0 93 -34.5t34 -93.5q0 -17 -7 -55.5t-7 -54.5q0 -46 19.5 -75t57.5 -29l53 193q14 51 14 71q0 28 -42 33l-34 4v25h305v-25q-67 0 -81 -54l-68 -247q48 0 87.5 42t54.5 104q25 109 80 152.5t135 43.5h33z" />
+<glyph unicode="&#x3a9;" horiz-adv-x="808" d="M279 124v32q-84 34 -117 85t-33 126q0 72 46.5 145t127.5 119q95 54 231 54q118 0 179 -57t61 -159q0 -112 -74.5 -197t-207.5 -118l-9 -30h111q52 0 75.5 13.5t52.5 61.5l25 -6l-64 -193h-295l60 192q80 17 131 103t51 186q0 170 -107 170q-62 0 -120.5 -46.5 t-94 -119.5t-35.5 -147q0 -56 14 -89t53 -57l-29 -192h-286l41 199l25 6q0 -44 22.5 -62.5t66.5 -18.5h99z" />
+<glyph unicode="&#x3aa;" horiz-adv-x="389" d="M406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298zM486 839q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5 q27 0 46.5 -19.5t19.5 -46.5zM274 839q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x3ab;" horiz-adv-x="611" d="M697 628l-17 -19q-31 26 -75 26q-62 0 -119 -79q-62 -87 -106 -248l-53 -192q-10 -34 -10 -49q0 -24 16.5 -33t62.5 -9v-25h-323v25q51 5 71.5 19t32.5 59l56 209q0 40 -5 84.5t-17 97.5t-39 87.5t-65 34.5q-30 0 -68 -29l-18 18q52 80 150 80q52 0 89.5 -24t57.5 -65 t29 -86.5t9 -98.5h4q36 109 102 187.5t141 78.5q63 0 94 -49zM592 839q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM380 839q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5 q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x3ac;" horiz-adv-x="576" d="M574 449l-158 -255q0 -56 10.5 -95.5t27.5 -39.5q35 0 58 77l24 -7q-10 -56 -42.5 -98t-78.5 -42q-39 0 -62.5 23.5t-29.5 55.5q-41 -45 -78.5 -63t-89.5 -18q-60 0 -100 25q-58 37 -58 133q0 79 34 151.5t98 119t142 46.5q54 0 88 -26t47 -68l44 81h124zM312 285 q0 67 -10 107.5t-41 40.5q-20 0 -45 -29.5t-47 -75.5t-37.5 -111t-15.5 -129q0 -36 13 -53.5t32 -17.5q41 0 91.5 68t51.5 124q8 44 8 76zM251 516l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48z" />
+<glyph unicode="&#x3ad;" horiz-adv-x="454" d="M83 234v1q-44 25 -44 71q0 63 76 109.5t175 46.5q47 0 82.5 -25t35.5 -65q0 -30 -17.5 -50.5t-44.5 -20.5q-25 0 -41.5 15t-16.5 38q0 15 10.5 31.5t10.5 26.5q0 7 -10 12t-20 5q-35 0 -69.5 -36.5t-34.5 -83.5q0 -52 43 -52q4 0 18.5 4.5t29.5 4.5q35 0 35 -23 q0 -34 -53 -34q-4 0 -14.5 3t-18.5 3q-40 0 -66 -29.5t-26 -65.5q0 -29 19 -49t54 -20q84 0 143 83l28 -18q-88 -129 -207 -129q-86 0 -125.5 34.5t-39.5 85.5q0 88 88 127zM201 516l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48z" />
+<glyph unicode="&#x3ae;" horiz-adv-x="488" d="M178 263h1q51 75 73 103.5t49 54.5q43 41 100 41q73 0 73 -77q0 -24 -26 -121l-68 -258q-30 -115 -30 -173q0 -26 5 -38h-112q-13 21 -13 50q0 57 108 448q11 42 11 76q0 21 -20 21q-13 0 -33 -16.5t-36 -37.5q-47 -62 -79 -135t-66 -201h-121l87 309q12 46 12 55 q0 21 -17 21q-20 0 -63 -49l-20 18q68 101 167 101q58 0 58 -47q0 -26 -18 -78zM216 516l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48z" />
+<glyph unicode="&#x3af;" horiz-adv-x="278" d="M107 516l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48zM216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61z " />
+<glyph unicode="&#x3b0;" horiz-adv-x="536" d="M300 435v27q53 0 88 -13q89 -33 89 -138q0 -128 -83 -226t-192 -98q-160 0 -160 128q0 34 13 86l24 91q14 52 15 66q0 27 -17 27q-24 0 -64 -49l-20 18q28 42 73 71.5t95 29.5q57 0 57 -48q0 -23 -12 -67l-38 -144q-16 -62 -16 -111q0 -35 14.5 -52t37.5 -17 q34 0 64.5 43t49 102.5t29.5 117t11 93.5q0 39 -14 51t-44 12zM200 516l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48zM500 580q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19t-19 45q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z M217 580q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x3b1;" horiz-adv-x="576" d="M574 449l-158 -255q0 -56 10.5 -95.5t27.5 -39.5q35 0 58 77l24 -7q-10 -56 -42.5 -98t-78.5 -42q-39 0 -62.5 23.5t-29.5 55.5q-41 -45 -78.5 -63t-89.5 -18q-60 0 -100 25q-58 37 -58 133q0 79 34 151.5t98 119t142 46.5q54 0 88 -26t47 -68l44 81h124zM312 285 q0 67 -10 107.5t-41 40.5q-20 0 -45 -29.5t-47 -75.5t-37.5 -111t-15.5 -129q0 -36 13 -53.5t32 -17.5q41 0 91.5 68t51.5 124q8 44 8 76z" />
+<glyph unicode="&#x3b2;" d="M-50 -122l135 505q13 47 37.5 99t60 102t84 82t98.5 32q49 0 82 -24.5t33 -79.5q0 -56 -34 -110t-81 -74v-2q29 -6 56.5 -38t27.5 -84q0 -67 -31.5 -134.5t-96 -116t-146.5 -48.5q-42 0 -75 22l-36 -138q-14 -55 -25 -76h-118q16 29 29 83zM216 454l-101 -388 q0 -44 40 -44q47 0 87.5 52.5t61 120t20.5 123.5q0 69 -32 69q-9 0 -16 -3t-12 -3q-27 0 -27 21q0 13 11 22t27 9q6 0 19 -2t20 -2q29 0 45.5 62t16.5 113q0 65 -31 65q-34 0 -71 -66t-58 -149z" />
+<glyph unicode="&#x3b3;" horiz-adv-x="438" d="M461 449l-263 -411q0 -35 -4.5 -71.5t-15.5 -77.5t-35 -67t-57 -26q-29 0 -40.5 20t-11.5 43q0 17 6.5 37t20 45t25.5 45l34 52l32 50q12 88 12 141q0 58 -16 97t-50 39q-51 0 -68 -68h-27q13 69 47 117t78 48q25 0 41.5 -10.5t24 -31.5t10 -41.5t2.5 -51.5 q0 -80 -5 -135l136 257h124z" />
+<glyph unicode="&#x3b4;" horiz-adv-x="496" d="M236 429v2q-53 24 -79.5 50t-26.5 71q0 62 65 104t127 42q48 0 91 -19t43 -60q0 -21 -10 -32.5t-38 -11.5q-21 0 -34.5 12.5t-19.5 27t-20 27t-37 12.5q-72 0 -72 -60q0 -33 24.5 -59t74.5 -55q117 -67 117 -167q0 -53 -20.5 -114t-58.5 -110q-80 -102 -201 -102 q-79 0 -121.5 43t-42.5 106q0 92 31 143q77 126 208 150zM322 342q0 59 -52 59q-65 -7 -109.5 -96.5t-44.5 -182.5q0 -54 10 -80t37 -26q53 0 102 106q20 44 38.5 111.5t18.5 108.5z" />
+<glyph unicode="&#x3b5;" horiz-adv-x="454" d="M83 234v1q-44 25 -44 71q0 63 76 109.5t175 46.5q47 0 82.5 -25t35.5 -65q0 -30 -17.5 -50.5t-44.5 -20.5q-25 0 -41.5 15t-16.5 38q0 15 10.5 31.5t10.5 26.5q0 7 -10 12t-20 5q-35 0 -69.5 -36.5t-34.5 -83.5q0 -52 43 -52q4 0 18.5 4.5t29.5 4.5q35 0 35 -23 q0 -34 -53 -34q-4 0 -14.5 3t-18.5 3q-40 0 -66 -29.5t-26 -65.5q0 -29 19 -49t54 -20q84 0 143 83l28 -18q-88 -129 -207 -129q-86 0 -125.5 34.5t-39.5 85.5q0 88 88 127z" />
+<glyph unicode="&#x3b6;" horiz-adv-x="415" d="M283 698l6 -26q-41 -13 -61 -39t-20 -47q0 -39 39 -49l27 18l30 19q7 5 25 15t28.5 14t25 7.5t27.5 3.5q27 0 45 -13t18 -36q0 -93 -201 -93q-168 -118 -168 -293q0 -86 106 -86q147 0 147 -109q0 -61 -65 -125t-131 -64q-38 0 -57 17t-19 42q0 20 13 37t43 17 q25 0 40 -26.5t29 -26.5q29 0 51 30t22 66q0 26 -11 36.5t-42 10.5q-11 0 -45 -5.5t-50 -5.5q-65 0 -102.5 42.5t-37.5 108.5q1 95 48.5 175t153.5 177q-87 15 -87 87q0 47 48 82t125 39z" />
+<glyph unicode="&#x3b7;" horiz-adv-x="488" d="M178 263h1q51 75 73 103.5t49 54.5q43 41 100 41q73 0 73 -77q0 -24 -26 -121l-68 -258q-30 -115 -30 -173q0 -26 5 -38h-112q-13 21 -13 50q0 57 108 448q11 42 11 76q0 21 -20 21q-13 0 -33 -16.5t-36 -37.5q-47 -62 -79 -135t-66 -201h-121l87 309q12 46 12 55 q0 21 -17 21q-20 0 -63 -49l-20 18q68 101 167 101q58 0 58 -47q0 -26 -18 -78z" />
+<glyph unicode="&#x3b8;" horiz-adv-x="501" d="M488 508q0 -234 -146 -417q-81 -104 -191 -104q-71 0 -112.5 50t-41.5 153q0 110 41.5 216t99.5 179q91 113 202 113q72 0 110 -50.5t38 -139.5zM158 368h178q33 122 33 222q0 79 -36 79q-29 0 -71 -59q-56 -78 -104 -242zM325 326h-179q-30 -117 -30 -221 q0 -40 10.5 -64.5t29.5 -24.5q38 0 83 86q45 89 86 224z" />
+<glyph unicode="&#x3b9;" horiz-adv-x="278" d="M216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61z" />
+<glyph unicode="&#x3ba;" d="M163 244h1q103 127 161.5 172.5t107.5 45.5q36 0 53.5 -21.5t17.5 -50.5q0 -24 -15 -43t-44 -19q-23 0 -37.5 12t-23.5 23.5t-18 11.5q-36 0 -126 -102l118 -196q19 -31 35 -40.5t59 -9.5v-27q-39 -12 -95 -12q-22 0 -41 6t-30.5 11.5t-24.5 20t-17 20t-14 22.5l-11 18 l-68 111l-52 -197h-122l92 334q9 34 9 44q0 29 -46 29h-14v27q119 9 204 28z" />
+<glyph unicode="&#x3bb;" horiz-adv-x="484" d="M432 150h27q-6 -86 -34 -127t-88 -41q-69 0 -69 120q0 113 12 188l-190 -290h-124l314 444l-4 51q-8 105 -65 105q-16 0 -34 -16.5t-28 -51.5h-27q9 41 16.5 64.5t20 50t31.5 39t44 12.5q29 0 47 -23t24.5 -55t8.5 -80l17 -363q3 -59 13.5 -78t30.5 -19q8 0 14 1.5 t16 7.5t17 21.5t10 39.5z" />
+<glyph unicode="&#x3bc;" horiz-adv-x="523" d="M460 133l23 -13q-38 -68 -74.5 -100.5t-80.5 -32.5q-70 0 -70 64q0 24 12 80h-1q-28 -50 -49 -79t-42.5 -42.5t-38 -16.5t-47.5 -3l-33 -122q-6 -22 -24 -73h-117q13 25 27 75l155 579h121l-77 -289q-10 -40 -10 -60q0 -16 7.5 -26.5t19.5 -10.5q27 0 62.5 49t68.5 119 l58 218h119l-71 -266q-22 -84 -22 -103q0 -23 15 -23q23 0 69 76z" />
+<glyph unicode="&#x3bd;" horiz-adv-x="469" d="M414 462l27 -5q-12 -83 -45 -155t-77 -123t-99 -91.5t-108.5 -64t-107.5 -36.5h-27l93 346q8 28 8 44q0 30 -60 30v27q83 2 203 28l-92 -340h2q99 20 174.5 105t108.5 235z" />
+<glyph unicode="&#x3be;" horiz-adv-x="415" d="M275 698l5 -27q-83 -30 -83 -76q0 -22 15 -32q33 26 75 44t75 18q64 0 64 -36q0 -42 -49 -68.5t-128 -26.5q-28 0 -46 -20t-18 -45q0 -26 20 -42q63 36 141 36q30 0 46.5 -12t16.5 -30q0 -36 -39 -57.5t-99 -21.5q-36 0 -72 6q-95 -39 -95 -129q0 -86 106 -86 q147 0 147 -109q0 -61 -65 -125t-131 -64q-38 0 -57 17t-19 42q0 20 13 37t43 17q25 0 40 -26.5t29 -26.5q29 0 51 30t22 66q0 26 -11 36.5t-42 10.5q-11 0 -45 -5.5t-50 -5.5q-66 0 -103 38t-37 103q0 134 132 216v2q-15 8 -27.5 28t-12.5 40q0 56 55 93v2q-16 4 -30.5 21 t-14.5 43q0 52 49 83.5t129 41.5z" />
+<glyph unicode="&#x3bf;" d="M280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5 t25 157.5z" />
+<glyph unicode="&#x3c0;" horiz-adv-x="558" d="M570 449l-21 -100h-108q-53 -147 -53 -227q0 -22 9 -41.5t25 -19.5q37 0 65 71l23 -12q-43 -129 -157 -129q-40 0 -64.5 25t-24.5 58q0 74 89 275h-89q-15 -62 -46 -149t-64 -145q-40 -70 -99 -70q-61 0 -61 51q0 41 42 56q41 14 68 62q62 108 86 195h-35 q-27 0 -57.5 -16t-46.5 -39h-27q45 79 94.5 117t128.5 38h323z" />
+<glyph unicode="&#x3c1;" horiz-adv-x="495" d="M-52 -122l74 279q38 144 129 234q73 71 159 71q137 0 137 -125q0 -69 -33.5 -149t-82.5 -128q-75 -73 -158 -73q-46 0 -75 22l-34 -138q-12 -46 -27 -76h-118q14 25 29 83zM151 219l-37 -153q0 -44 39 -44q47 0 95 76q33 52 53.5 123.5t20.5 129.5q0 82 -37 82 q-34 0 -68 -52q-41 -62 -66 -162z" />
+<glyph unicode="&#x3c2;" horiz-adv-x="415" d="M447 393q0 -30 -19 -49.5t-50 -19.5q-34 0 -69 24.5t-59 24.5q-75 0 -110.5 -49.5t-35.5 -134.5q0 -96 106 -96q147 0 147 -109q0 -61 -65 -125t-131 -64q-38 0 -57 17t-19 42q0 20 13 37t43 17q25 0 40 -26.5t29 -26.5q29 0 51 30t22 66q0 26 -11 36.5t-42 10.5 q-11 0 -45 -5.5t-50 -5.5q-65 0 -102.5 42.5t-37.5 108.5q0 114 92 208q53 54 123.5 85t133.5 31q44 0 73.5 -18t29.5 -51z" />
+<glyph unicode="&#x3c3;" horiz-adv-x="499" d="M536 449l-21 -100h-187q9 -22 29.5 -39t38 -27t31.5 -30.5t14 -49.5q0 -89 -83.5 -152.5t-196.5 -63.5q-76 0 -120 39.5t-44 108.5q0 72 37.5 143t113 121t169.5 50h219zM322 222q0 46 -13.5 80t-32.5 47q-61 0 -110.5 -84t-49.5 -184q0 -65 49 -65q59 0 108 63t49 143z " />
+<glyph unicode="&#x3c4;" horiz-adv-x="415" d="M455 449l-23 -100h-126q-23 -59 -38 -114t-19.5 -81.5t-4.5 -39.5q0 -53 32 -53q36 0 67 73l24 -11q-13 -53 -56.5 -92.5t-94.5 -39.5q-48 0 -72 24.5t-24 63.5q0 37 16 89t75 181h-46q-36 0 -75.5 -23t-58.5 -65h-27q9 32 25.5 61.5t44.5 60t75 48.5t106 18h200z" />
+<glyph unicode="&#x3c5;" horiz-adv-x="536" d="M300 435v27q53 0 88 -13q89 -33 89 -138q0 -128 -83 -226t-192 -98q-160 0 -160 128q0 34 13 86l24 91q14 52 15 66q0 27 -17 27q-24 0 -64 -49l-20 18q28 42 73 71.5t95 29.5q57 0 57 -48q0 -23 -12 -67l-38 -144q-16 -62 -16 -111q0 -35 14.5 -52t37.5 -17 q34 0 64.5 43t49 102.5t29.5 117t11 93.5q0 39 -14 51t-44 12z" />
+<glyph unicode="&#x3c6;" horiz-adv-x="678" d="M195 16l37 139q38 145 117 226q67 69 139 69q60 0 95.5 -33.5t35.5 -105.5q0 -69 -29.5 -139t-83.5 -120q-69 -65 -205 -65l-51 -192h-114l51 192q-92 0 -141 37t-49 111q0 59 19 115.5t55 104.5t96.5 77.5t135.5 29.5h40v-27q-55 0 -95 -16t-71 -66q-61 -98 -61 -231 q0 -106 79 -106zM369 253l-60 -237q23 0 53.5 13t48.5 34q89 106 89 255q0 103 -32 103q-55 0 -99 -168z" />
+<glyph unicode="&#x3c7;" horiz-adv-x="404" d="M515 449l-300 -372l10 -88q6 -50 20.5 -73t31.5 -23q51 0 64 70h27q-6 -82 -36.5 -125t-80.5 -43q-67 0 -73 162l-3 90l-187 -236h-124l307 373l-6 78q-5 60 -20 81t-42 21q-19 0 -37 -16.5t-24 -51.5h-27q4 28 11 53t20 52.5t36 44t53 16.5q38 0 52.5 -36t19.5 -121 l5 -85l179 229h124z" />
+<glyph unicode="&#x3c8;" horiz-adv-x="652" d="M715 462v-27q-48 -4 -80.5 -48.5t-49.5 -106.5q-13 -47 -27.5 -85t-39 -78.5t-54.5 -67.5t-74.5 -44.5t-97.5 -17.5l-51 -192h-114l51 192q-73 0 -117 40t-44 107q0 50 21 120.5t21 96.5q0 74 -64 84v27h57q70 0 95 -31t25 -85q0 -29 -18 -130t-18 -135q0 -65 51 -65 l116 433h114l-116 -433q39 0 67 38q25 35 47 93.5t38.5 109.5t41 99.5t68.5 77t107 28.5h45z" />
+<glyph unicode="&#x3c9;" horiz-adv-x="735" d="M473 435v27q145 0 186 -81q17 -32 17 -72q0 -95 -60 -190t-152 -123q-28 -9 -62 -9q-90 0 -112 62q-22 -30 -60 -46t-81 -16q-52 0 -86 20q-66 37 -66 120q0 160 103 260q80 75 220 75v-27q-71 0 -101 -34q-48 -52 -75.5 -140t-27.5 -178q0 -29 11.5 -48t35.5 -19 q35 0 62.5 30t45.5 79q0 5 -0.5 21.5t-0.5 27.5q0 43 11.5 87t37 77t57.5 33q18 0 27.5 -18t9.5 -47q0 -27 -10 -65q-12 -42 -54 -115q-3 -20 -3 -38q0 -72 53 -72q37 0 69 42.5t50 101.5t28.5 111t10.5 79q0 32 -8 52q-13 33 -76 33z" />
+<glyph unicode="&#x3ca;" horiz-adv-x="278" d="M216 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61zM139 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5 q27 0 46.5 -19.5t19.5 -46.5zM351 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x3cb;" horiz-adv-x="536" d="M300 435v27q53 0 88 -13q89 -33 89 -138q0 -128 -83 -226t-192 -98q-160 0 -160 128q0 34 13 86l24 91q14 52 15 66q0 27 -17 27q-24 0 -64 -49l-20 18q28 42 73 71.5t95 29.5q57 0 57 -48q0 -23 -12 -67l-38 -144q-16 -62 -16 -111q0 -35 14.5 -52t37.5 -17 q34 0 64.5 43t49 102.5t29.5 117t11 93.5q0 39 -14 51t-44 12zM255 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM467 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5 q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x3cc;" d="M223 516l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48zM280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5 t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#x3cd;" horiz-adv-x="536" d="M300 435v27q53 0 88 -13q89 -33 89 -138q0 -128 -83 -226t-192 -98q-160 0 -160 128q0 34 13 86l24 91q14 52 15 66q0 27 -17 27q-24 0 -64 -49l-20 18q28 42 73 71.5t95 29.5q57 0 57 -48q0 -23 -12 -67l-38 -144q-16 -62 -16 -111q0 -35 14.5 -52t37.5 -17 q34 0 64.5 43t49 102.5t29.5 117t11 93.5q0 39 -14 51t-44 12zM216 516l98 136q20 28 54 28q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48z" />
+<glyph unicode="&#x3ce;" horiz-adv-x="735" d="M473 435v27q145 0 186 -81q17 -32 17 -72q0 -95 -60 -190t-152 -123q-28 -9 -62 -9q-90 0 -112 62q-22 -30 -60 -46t-81 -16q-52 0 -86 20q-66 37 -66 120q0 160 103 260q80 75 220 75v-27q-71 0 -101 -34q-48 -52 -75.5 -140t-27.5 -178q0 -29 11.5 -48t35.5 -19 q35 0 62.5 30t45.5 79q0 5 -0.5 21.5t-0.5 27.5q0 43 11.5 87t37 77t57.5 33q18 0 27.5 -18t9.5 -47q0 -27 -10 -65q-12 -42 -54 -115q-3 -20 -3 -38q0 -72 53 -72q37 0 69 42.5t50 101.5t28.5 111t10.5 79q0 32 -8 52q-13 33 -76 33zM344 516l98 136q20 28 54 28 q10 0 18.5 -8.5t8.5 -20.5q0 -19 -10 -31t-40 -37l-81 -67h-48z" />
+<glyph unicode="&#x3d0;" d="M479 617q0 -35 -22.5 -60.5t-53 -38.5t-74 -20.5t-74.5 -9t-64 -1.5q-48 -70 -87 -186q45 43 85.5 65t91.5 22q68 0 109.5 -55t41.5 -125q0 -90 -66 -155t-156 -65q-47 0 -81 21.5t-52.5 58.5t-26.5 76.5t-8 83.5q0 111 47.5 238.5t127.5 183.5q24 17 65 31.5t69 14.5 q128 0 128 -79zM413 640q0 32 -19 32q-47 0 -99 -50.5t-85 -104.5q111 2 164 51q39 37 39 72zM363 268q0 28 -16.5 50.5t-44.5 22.5q-45 0 -113.5 -92.5t-68.5 -139.5q0 -29 15.5 -53t42.5 -24t72.5 47t79 104t33.5 85z" />
+<glyph unicode="&#x3d1;" horiz-adv-x="582" d="M589 235l-5 -31q-43 2 -97 12q-20 -51 -40 -88t-48 -71t-64.5 -52t-81.5 -18q-160 0 -160 128q0 21 8 57t8 50q0 27 -17 27q-24 0 -64 -49l-20 18q28 43 72.5 72t93.5 29q59 0 59 -48q0 -27 -11 -67q-19 -73 -19 -119q0 -35 14 -52t36 -17q67 0 128 228 q-105 38 -154.5 104.5t-49.5 147.5q0 96 58 149t136 53q32 0 49.5 -5.5t44.5 -20.5q80 -45 80 -190q0 -100 -44 -228q57 -16 88 -19zM429 541q0 119 -60 119q-36 0 -58 -42t-22 -107q0 -145 105 -212q35 148 35 242z" />
+<glyph unicode="&#x3d2;" horiz-adv-x="611" d="M356 411h4q90 272 237 272q51 0 75 -27t24 -66q0 -29 -19 -51t-48 -22q-32 0 -49 16t-17 39q0 32 24 54q0 9 -15 9q-27 0 -55 -26.5t-52 -66.5q-42 -73 -86 -235l-52 -191q-10 -34 -10 -49q0 -24 16.5 -33t62.5 -9v-25h-323v25q51 5 71.5 19t32.5 59l56 209q0 40 -5 84.5 t-17 97.5t-39 87.5t-65 34.5q-30 0 -68 -29l-18 18q52 80 150 80q52 0 89.5 -24t57.5 -65t29 -86.5t9 -98.5z" />
+<glyph unicode="&#x3d5;" horiz-adv-x="678" d="M494 699l-65 -237q94 0 142 -36t48 -115q0 -68 -32 -139.5t-85 -119.5q-71 -65 -200 -65l-51 -192h-115l51 192q-91 0 -140.5 37t-49.5 111q0 58 19.5 114.5t56.5 104.5t100 78t141 30l62 237h118zM421 433l-113 -417q24 0 53 13t46 34q93 110 93 275q0 95 -79 95z M195 16l112 417q-43 0 -71 -17t-57 -63q-63 -99 -63 -230q0 -107 79 -107z" />
+<glyph unicode="&#x3d6;" horiz-adv-x="828" d="M844 449l-21 -100h-60q7 -21 7 -58q0 -112 -80.5 -208t-189.5 -96q-77 0 -105 62q-56 -62 -132 -62q-59 0 -90 18q-62 37 -62 130q0 59 23 121t52 92h-22q-99 0 -139 -81h-27q52 182 248 182h598zM651 349h-364q-24 -47 -40.5 -116.5t-16.5 -128.5q0 -39 12 -63.5 t31 -24.5q31 0 58 29.5t44 76.5q-3 15 -3 36q0 58 22 101t70 43q21 0 33 -14.5t12 -35.5q0 -52 -57 -138q-2 -20 -2 -26q0 -72 53 -72q32 0 61.5 43t47.5 101t28.5 110.5t10.5 78.5z" />
+<glyph unicode="&#x3d8;" horiz-adv-x="722" d="M166 -93l23 84q-76 18 -119 77.5t-43 152.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5q0 -95 -49.5 -194.5t-130.5 -171.5q-79 -70 -176 -89l-10 -37q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64zM547 528 q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#x3d9;" d="M280 462h4q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-56 -56 -124 -69l-54 -198h-115l56 201q-48 13 -75 48.5t-27 90.5q0 73 27 139t73 111q79 77 183 77zM322 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64 q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#x3da;" horiz-adv-x="669" d="M98 -120l26 24q39 -63 114 -63q58 0 104.5 38t46.5 93q0 70 -157 94q-200 31 -200 189q0 123 67.5 223t175 153.5t229.5 53.5q67 0 114 -22t47 -64q0 -36 -17.5 -55.5t-46.5 -19.5q-25 0 -41.5 11t-27 26t-22.5 30.5t-33.5 26.5t-53.5 11q-57 0 -119.5 -39t-107 -106 t-44.5 -138q0 -52 25 -85.5t66.5 -50t85 -27t90.5 -26t74 -37.5q45 -38 45 -98q0 -46 -24.5 -91t-62.5 -73q-85 -63 -198 -63q-108 0 -155 85z" />
+<glyph unicode="&#x3db;" horiz-adv-x="475" d="M486 492h23q-16 -127 -78.5 -178t-168.5 -55q-14 -1 -46 -1t-48.5 -1t-37.5 -6.5t-35 -16.5q-38 -29 -38 -69q0 -35 18.5 -56t51.5 -21q13 0 55 9t59 9q54 0 85 -35t31 -87q0 -61 -65 -125t-131 -64q-38 0 -57 17t-19 42q0 20 13 37t43 17q25 0 40 -26.5t29 -26.5 q29 0 51 30t22 66q0 26 -11 36.5t-42 10.5q-11 0 -45 -5.5t-50 -5.5q-67 0 -103.5 33.5t-36.5 97.5q0 99 88.5 170.5t199.5 82.5q100 10 142 39.5t61 81.5z" />
+<glyph unicode="&#x3dc;" horiz-adv-x="667" d="M670 669l-43 -190l-27 5q0 75 -20 100q-42 53 -167 53q-31 0 -43 -9.5t-20 -38.5l-60 -219h220l-13 -44h-219l-53 -194q-15 -56 -15 -63q0 -23 14.5 -32t56.5 -12v-25h-294v25q41 4 55.5 19.5t26.5 59.5l121 442q10 38 10 61q0 28 -42 33l-31 4v25h543z" />
+<glyph unicode="&#x3dd;" horiz-adv-x="525" d="M507 450l-20 -84h-203l-53 -231h153l-12 -50h-153l-63 -275h-124l148 640h327z" />
+<glyph unicode="&#x3de;" horiz-adv-x="757" d="M758 570l-322 -425q-28 -38 -28 -62q0 -14 9.5 -21.5t23.5 -7.5q37 0 77 30l10 -20q-102 -82 -176 -82q-49 0 -72 21.5t-23 53.5q0 36 23 67t82 84l178 160v6l-538 -184l-9 15l321 425q28 37 28 64q0 29 -31 29q-36 0 -79 -32l-10 20q102 82 176 82q49 0 72.5 -21 t23.5 -53q0 -33 -21.5 -64t-84.5 -88l-178 -159v-6l538 184z" />
+<glyph unicode="&#x3df;" horiz-adv-x="485" d="M466 399l-301 -399h-140l279 299h-288l301 399h140l-289 -299h298z" />
+<glyph unicode="&#x3e0;" horiz-adv-x="734" d="M52 503l-25 28q94 85 180 119.5t201 34.5q153 0 227.5 -89t74.5 -228q0 -136 -67.5 -263.5t-184 -212t-251.5 -97.5v40q142 39 246.5 187.5t104.5 311.5q0 42 -11 81q-82 -32 -149 -156.5t-87 -258.5h-161q23 142 135 276.5t253 179.5q-22 70 -80.5 116.5t-134.5 46.5 q-20 0 -29 -2l-64 -274h-46l60 262q-97 -15 -192 -102z" />
+<glyph unicode="&#x3e1;" horiz-adv-x="530" d="M47 605l24 34q116 -11 208.5 -79.5t140 -164.5t47.5 -197q0 -241 -136 -403l-36 4q19 43 30 86q20 76 20 153q0 63 -13 131l-181 -91l-12 38l185 92q-19 66 -38 122l-184 -92l-12 38l180 90q-77 176 -223 239z" />
+<glyph unicode="&#x3f0;" horiz-adv-x="569" d="M592 449l-154 -146q-16 -34 -31 -87t-15 -83q0 -36 36 -36q28 0 42.5 -15t14.5 -36q0 -23 -16.5 -42t-52.5 -19q-41 0 -61 30t-20 75q0 35 11.5 79t27.5 74l-260 -243h-164l157 147q17 34 31.5 86t14.5 81q0 36 -36 36q-28 0 -42.5 15t-14.5 36q0 23 16.5 42t52.5 19 q41 0 61 -30t20 -75q0 -78 -38 -150l256 242h164z" />
+<glyph unicode="&#x3f1;" horiz-adv-x="517" d="M303 -206h-25q2 8 2 10q0 17 -25 17t-78 8.5t-102 43.5q-87 63 -87 192q0 87 37.5 178t88.5 142q79 77 184 77q73 0 116.5 -41t43.5 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-95 0 -127 90h-2q0 -78 36 -114.5t97 -36.5q14 0 42 1.5t39 1.5q77 0 77 -54 q0 -26 -7 -40t-30 -41zM339 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#x3f4;" horiz-adv-x="722" d="M691 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM209 359h314q24 98 24 169q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-45 -75 -75 -172zM511 315h-315 q-25 -94 -25 -172q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q46 67 81 185z" />
+<glyph unicode="&#x3f5;" horiz-adv-x="466" d="M429 462l-26 -152h-27q0 24 -2.5 40.5t-9.5 35.5t-24.5 29t-43.5 10q-51 0 -93 -52.5t-59 -115.5h177l-10 -42h-177q-9 -27 -9 -66q0 -98 73 -98q74 0 133 83l29 -18q-92 -129 -199 -129q-85 0 -124.5 42.5t-39.5 114.5q0 116 86.5 215t196.5 103q28 1 46.5 -7t29 -16 t17.5 -8t18 10t15 21h23z" />
+<glyph unicode="&#x3f6;" horiz-adv-x="486" d="M93 313l-29 18q92 129 199 129q85 0 124.5 -42.5t39.5 -114.5q0 -116 -86.5 -215t-196.5 -103q-28 -1 -46.5 7t-29 16t-17.5 8t-18 -10t-15 -21h-23l26 152h27q0 -24 2.5 -40.5t9.5 -35.5t24.5 -29t43.5 -10q51 0 93 52.5t59 115.5h-177l10 42h177q9 27 9 66q0 98 -73 98 q-74 0 -133 -83z" />
+<glyph unicode="&#x401;" horiz-adv-x="667" d="M381 839q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM593 839q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM645 669l-43 -190l-27 5 q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5t-114 19.5l-63 -234q-8 -32 -8 -38q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5l-60 -194h-553v25q39 6 54 20.5 t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="&#x402;" horiz-adv-x="789" d="M418 405h1q67 44 143 44q92 0 133.5 -52t41.5 -140q0 -96 -43 -203.5t-115 -183t-146 -75.5q-66 0 -102 24.5t-36 68.5q0 32 20 54t47 22t45 -18t18 -47q0 -17 -11.5 -32t-11.5 -22q0 -15 27 -15q60 0 107.5 143t47.5 328q0 54 -21.5 77.5t-65.5 23.5q-38 0 -89 -32 l-61 -227q-13 -46 -13 -70q0 -23 15 -35.5t54 -12.5v-25h-323v25h15q72 0 91 72l148 537q-82 -2 -130.5 -28.5t-84.5 -102.5l-25 7l36 159h551l-31 -166l-27 2q0 81 -31 105t-112 24z" />
+<glyph unicode="&#x403;" horiz-adv-x="604" d="M658 669l-46 -203l-27 3q0 165 -131 165h-112l-145 -532q-6 -20 -6 -41q1 -35 73 -35v-26h-296v26q40 4 55 19t27 58l121 443q11 37 11 61q0 15 -8.5 21.5t-32.5 10.5l-34 5v25h551zM342 766l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87 h-49z" />
+<glyph unicode="&#x404;" horiz-adv-x="657" d="M689 685l-51 -235l-32 6q3 20 3 36q0 72 -34.5 115t-96.5 43q-80 0 -145 -73q-78 -88 -112 -201h263l-12 -50h-263q-11 -63 -11 -117q0 -83 43 -137.5t112 -54.5q44 0 74 20t30 50q0 5 -2.5 18.5t-2.5 19.5q0 40 27.5 63.5t61.5 23.5q23 0 39.5 -16.5t16.5 -39.5 q0 -40 -47 -89q-80 -85 -239 -85q-122 0 -194.5 69t-72.5 183q0 109 42.5 202t116.5 156q111 93 249 93q64 0 131 -21q24 -8 38 -8q20 0 38 29h30z" />
+<glyph unicode="&#x405;" horiz-adv-x="556" d="M502 681l-40 -202l-27 4q-9 76 -22 101q-33 66 -116 66q-41 0 -69.5 -29t-28.5 -76q0 -41 22.5 -66.5t84.5 -70.5q80 -58 109 -104t29 -113q0 -63 -29 -110.5t-81 -73.5q-52 -25 -120 -25q-53 0 -122 24q-32 11 -46 11t-21.5 -6.5t-16.5 -28.5h-30l36 225l29 -2 q7 -54 16 -84t32 -55q44 -50 106 -50q56 0 89 34q37 37 37 92q0 43 -25.5 75.5t-89.5 78.5q-66 47 -98 92.5t-32 105.5q0 84 58.5 137.5t145.5 53.5q50 0 91.5 -15t54.5 -15q31 0 44 26h30z" />
+<glyph unicode="&#x406;" horiz-adv-x="389" d="M406 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z" />
+<glyph unicode="&#x407;" horiz-adv-x="389" d="M265 839q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM477 839q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM403 669v-25q-38 -4 -55 -19 t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z" />
+<glyph unicode="&#x408;" d="M562 669v-25q-40 -5 -55.5 -19t-29.5 -66l-122 -457q-26 -99 -82 -150t-133 -51q-67 0 -107.5 26.5t-40.5 74.5q0 30 18.5 51t45.5 21t45 -18t18 -47q0 -17 -11.5 -32t-11.5 -22q0 -18 27 -18t43.5 32t44.5 138l114 432q13 51 13 64q0 29 -41 36l-33 5v25h298z" />
+<glyph unicode="&#x409;" horiz-adv-x="954" d="M601 370h81q214 0 214 -164q0 -99 -78 -152.5t-217 -53.5h-302v25q36 5 54 22t30 61l115 428q9 34 10 58q0 25 -39 25h-85q-24 0 -36.5 -14t-21.5 -47l-79 -292q-10 -36 -16.5 -57.5t-21 -60.5t-30.5 -63.5t-38 -50.5t-51.5 -39t-64.5 -13q-39 0 -61.5 21.5t-22.5 53.5 q0 44 23.5 64t54.5 20q21 0 33.5 -11t15.5 -24.5t9 -24.5t16 -11q51 0 110 224l79 295q3 11 3 19q0 16 -13.5 24.5t-49.5 11.5v25h515v-25q-36 0 -53.5 -16.5t-28.5 -57.5zM593 338l-64 -236q-7 -27 -7 -37q0 -33 57 -33q77 0 120.5 58t43.5 139q0 65 -36.5 87t-113.5 22z " />
+<glyph unicode="&#x40a;" horiz-adv-x="982" d="M629 373h81q214 0 214 -167q0 -99 -78 -152.5t-217 -53.5h-305v25q41 1 57.5 18.5t29.5 64.5l60 221h-213l-54 -197q-12 -43 -12 -67q0 -34 66 -40v-25h-290v25q39 5 54 18.5t27 55.5l121 447q11 38 11 58q0 17 -9.5 25t-32.5 11l-31 4v25h306v-25q-47 -1 -62.5 -15.5 t-29.5 -64.5l-52 -191h213l47 173q11 39 11 57q0 27 -13.5 34t-47.5 7v25h295v-25q-46 0 -61.5 -12.5t-27.5 -54.5zM621 340l-64 -238q-7 -27 -7 -37q0 -33 57 -33q77 0 120.5 58t43.5 139q0 65 -37 88t-113 23z" />
+<glyph unicode="&#x40b;" horiz-adv-x="830" d="M757 0h-311v26q49 3 69 18.5t32 60.5l28 107q23 88 23 118q0 37 -20 54.5t-81 17.5q-47 0 -98 -32l-61 -225q-17 -58 -17 -80q0 -8 1.5 -13t7.5 -11.5t20 -10.5t37 -5v-25h-316v25h15q72 0 91 72l148 537q-82 -2 -130.5 -28.5t-84.5 -102.5l-25 7l36 159h571l-31 -166 l-27 2q0 79 -39 104t-124 25l-63 -228q65 43 153 43q76 0 126.5 -30t50.5 -89q0 -43 -24 -134l-26 -98q-5 -18 -5 -30q0 -22 17 -31.5t57 -11.5v-25z" />
+<glyph unicode="&#x40c;" horiz-adv-x="678" d="M321 572l-55 -202q52 0 97 26q53 30 101 131l28 55q9 17 29 44.5t43.5 39.5t52.5 12q31 0 55.5 -19.5t24.5 -47.5q0 -12 -3 -25.5t-18.5 -29.5t-41.5 -16q-17 0 -30.5 12t-22 24.5t-13.5 12.5q-22 0 -40.5 -26t-32 -61t-45.5 -78t-76 -69q44 -37 69 -98l76 -188 q8 -21 25 -30.5t60 -13.5v-25h-202l-105 278q-10 27 -17.5 36.5t-25.5 11.5l-64 -238q-2 -10 -2 -17q0 -25 13 -34t52 -12v-25h-288v25q36 4 52.5 17t26.5 51l123 453q11 38 11 58q0 17 -9 25t-32 11l-33 4v25h311v-25q-45 -4 -64.5 -18.5t-29.5 -53.5zM350 766l122 131 q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49z" />
+<glyph unicode="&#x40e;" horiz-adv-x="666" d="M608 894q0 -43 -29.5 -73.5t-66.5 -42.5t-75 -12q-61 0 -116.5 33t-55.5 95q0 30 18 43.5t39 13.5q17 0 30.5 -11.5t13.5 -29.5q0 -19 -9.5 -30t-9.5 -17q0 -18 23.5 -32.5t66.5 -14.5t66 14t23 33q0 6 -9.5 17.5t-9.5 30.5q0 18 14.5 29t32.5 11q21 0 37.5 -13.5 t16.5 -43.5zM712 669v-25q-50 -7 -69 -39l-275 -471q-47 -79 -86.5 -115.5t-92.5 -36.5q-36 0 -63 20.5t-27 51.5q0 48 26 68t55 20q21 0 34 -13t16.5 -28.5t10.5 -28.5t17 -13q22 0 96 128l-155 394q-14 36 -25.5 45.5t-49.5 17.5v25h285v-25q-40 -4 -54.5 -11t-14.5 -28 q0 -39 29 -110l69 -165h2l108 199q18 32 18 65q0 45 -61 50v25h207z" />
+<glyph unicode="&#x40f;" horiz-adv-x="778" d="M791 669v-25q-39 -5 -54 -18t-29 -64l-117 -429q-14 -51 -14 -71q0 -28 42 -33l32 -4l-7 -25h-152q-96 0 -149.5 -46.5t-79.5 -137.5h-28q5 25 5 51q0 133 -134 133h-139v25q38 4 55 19t29 61l112 412q17 62 17 87q0 21 -14.5 29.5t-56.5 10.5v25h296v-25q-39 -5 -54 -18 t-29 -64l-143 -522h241l129 477q17 62 17 87q0 21 -14.5 29.5t-56.5 10.5v25h296z" />
+<glyph unicode="&#x410;" horiz-adv-x="667" d="M604 0h-303v25q77 6 77 49q0 3 -2 15l-12 119h-215l-57 -96q-17 -28 -17 -50q0 -37 64 -37v-25h-195l-1 25q26 3 43 19.5t43 56.5l370 582h25l94 -560q11 -62 25 -78.5t61 -19.5v-25zM357 248l-37 243l-148 -243h185z" />
+<glyph unicode="&#x411;" horiz-adv-x="635" d="M629 669l-46 -193l-27 3q0 88 -28.5 121.5t-119.5 33.5q-32 0 -44.5 -10.5t-22.5 -46.5l-57 -209h76q219 0 219 -162q0 -103 -89 -161q-70 -45 -206 -45h-302v25q36 5 54 22t30 61l119 438q11 39 11 57t-10.5 27.5t-23.5 11.5t-37 2v25h504zM276 338l-64 -236 q-7 -27 -7 -37q0 -33 57 -33q77 0 120.5 58t43.5 139q0 65 -35 86t-115 23z" />
+<glyph unicode="&#x412;" horiz-adv-x="654" d="M118 669h265q241 0 241 -146q0 -75 -50.5 -113.5t-138.5 -54.5v-1q59 -12 98 -49.5t39 -98.5q0 -100 -82 -157q-69 -49 -213 -49h-302v25q36 5 54 22t30 61l119 438q11 39 11 57t-10.5 27.5t-23.5 11.5t-37 2v25zM334 577l-57 -209q5 0 21.5 1.5t21.5 1.5t18.5 1.5 t19 2.5t16 3.5t16.5 5.5l13 6q8 3 14.5 7.5t12.5 10.5q47 44 47 128q0 101 -87 101q-25 0 -35 -10t-21 -50zM269 338l-64 -236q-7 -27 -7 -37q0 -33 57 -33q73 0 121 59q43 52 43 138q0 58 -35 85q-28 21 -115 24z" />
+<glyph unicode="&#x413;" horiz-adv-x="604" d="M658 669l-46 -203l-27 3q0 165 -131 165h-112l-145 -532q-6 -20 -6 -41q1 -35 73 -35v-26h-296v26q40 4 55 19t27 58l121 443q11 37 11 61q0 15 -8.5 21.5t-32.5 10.5l-34 5v25h551z" />
+<glyph unicode="&#x414;" horiz-adv-x="696" d="M718 669v-25q-28 0 -45.5 -11.5t-23.5 -24.5t-13 -38l-123 -454q-10 -37 -10 -52q0 -19 15.5 -27.5t57.5 -11.5l-57 -209l-29 4q4 24 4 47q0 65 -31 99t-101 34h-236q-139 0 -214 -182l-27 -2l57 209h20q73 0 138.5 132t140.5 411q6 20 6 35q0 18 -11 28.5t-41 12.5l6 25 h517zM362 104l118 427q10 33 10 57q0 31 -39 31h-103q-23 0 -36 -16t-22 -50q-112 -422 -212 -518h211q54 0 73 69z" />
+<glyph unicode="&#x415;" horiz-adv-x="667" d="M645 669l-43 -190l-27 5q-3 60 -9.5 82t-35.5 41q-47 30 -137 30q-32 0 -45 -9t-22 -42l-59 -216q99 0 134.5 18.5t70.5 88.5l28 -4l-74 -274l-28 4q4 25 4 44q0 52 -30 71.5t-114 19.5l-63 -234q-8 -32 -8 -38q0 -34 61 -34q131 0 214 61q28 20 47 42t44 64l25 -5 l-60 -194h-553v25q39 6 54 20.5t28 59.5l119 432q12 44 12 70q0 15 -9 22.5t-32 10.5l-33 4v25h541z" />
+<glyph unicode="&#x416;" horiz-adv-x="927" d="M613 564l-53 -194q51 0 96 26q28 16 49 52t35 73.5t31 74t46.5 59.5t72.5 23q31 0 55 -19.5t24 -47.5q0 -13 -3 -26t-18 -29t-41 -16q-17 0 -30.5 12t-22 24.5t-13.5 12.5q-22 0 -37 -26.5t-25 -61.5t-39 -78.5t-73 -69.5q48 -37 66 -94l59 -190q7 -21 24.5 -30.5 t60.5 -13.5v-25h-200l-88 277q-14 45 -41 49l-47 -174q-17 -62 -17 -87q0 -21 13 -29.5t48 -10.5v-25h-291v25q42 5 61 19t32 63l59 219q-41 -5 -69 -43l-206 -283h-194v25q26 3 45 12.5t26.5 18t20.5 27.5l124 171q39 54 76.5 75.5t89.5 28.5v3q-45 41 -45 110q0 14 1 40 t1 35q0 43 -24 43q-7 0 -12.5 -7.5t-10 -17t-16 -17t-28.5 -7.5q-24 0 -37.5 14t-16.5 26.5t-3 24.5q0 31 27.5 52t58.5 21q46 0 76.5 -33t30.5 -77q0 -12 -1 -31.5t-1 -27.5q0 -68 20.5 -103t78.5 -36l46 166q14 51 14 71q0 28 -42 33l-32 4v25h293v-25q-38 -4 -55 -19 t-29 -61z" />
+<glyph unicode="&#x417;" horiz-adv-x="561" d="M154 686h30q1 -13 11 -22.5t22 -9.5q7 0 10 1.5t8 4.5t14 6q58 19 110 19q94 0 142 -44t48 -108q0 -66 -52 -117.5t-134 -55.5v-2q56 -13 95 -52.5t39 -98.5q0 -57 -33.5 -104t-84.5 -76q-49 -28 -95.5 -36.5t-112.5 -8.5q-75 0 -128 36t-53 107q0 37 24 60t50 23 q28 0 46.5 -16.5t18.5 -45.5q0 -24 -16 -44t-16 -32q0 -19 23 -31t63 -12q70 0 115.5 52.5t45.5 148.5q0 110 -134 110l12 38q86 0 133 41t47 120q0 53 -28 79t-66 26q-126 0 -170 -146h-27z" />
+<glyph unicode="&#x418;" horiz-adv-x="768" d="M790 669v-25q-36 0 -53.5 -16.5t-28.5 -57.5l-111 -408q-22 -84 -22 -96q0 -22 16 -30.5t57 -10.5v-25h-316v25q51 3 70 17.5t32 61.5l98 357l-329 -329q-12 -48 -12 -67q0 -34 71 -40v-25h-295v25q39 5 54 18.5t27 55.5l121 447q11 38 11 58q0 17 -9.5 25t-32.5 11 l-31 4v25h316v-25q-49 -2 -69 -17t-33 -63l-95 -348l329 330q10 47 10 61q0 15 -9 22.5t-32 10.5l-31 4v25h297z" />
+<glyph unicode="&#x419;" horiz-adv-x="768" d="M790 669v-25q-36 0 -53.5 -16.5t-28.5 -57.5l-111 -408q-22 -84 -22 -96q0 -22 16 -30.5t57 -10.5v-25h-316v25q51 3 70 17.5t32 61.5l98 357l-329 -329q-12 -48 -12 -67q0 -34 71 -40v-25h-295v25q39 5 54 18.5t27 55.5l121 447q11 38 11 58q0 17 -9.5 25t-32.5 11 l-31 4v25h316v-25q-49 -2 -69 -17t-33 -63l-95 -348l329 330q10 47 10 61q0 15 -9 22.5t-32 10.5l-31 4v25h297zM651 891q0 -63 -49.5 -94t-111.5 -31q-37 0 -72 11.5t-62.5 41t-27.5 72.5q0 30 18 43.5t39 13.5q17 0 30.5 -11.5t13.5 -29.5q0 -19 -9.5 -30t-9.5 -17 q0 -44 80 -44q79 0 79 44q0 6 -9.5 17.5t-9.5 30.5q0 18 14.5 29t32.5 11q21 0 37.5 -13.5t16.5 -43.5z" />
+<glyph unicode="&#x41a;" horiz-adv-x="678" d="M321 572l-55 -202q52 0 97 26q53 30 101 131l28 55q9 17 29 44.5t43.5 39.5t52.5 12q31 0 55.5 -19.5t24.5 -47.5q0 -12 -3 -25.5t-18.5 -29.5t-41.5 -16q-17 0 -30.5 12t-22 24.5t-13.5 12.5q-22 0 -40.5 -26t-32 -61t-45.5 -78t-76 -69q44 -37 69 -98l76 -188 q8 -21 25 -30.5t60 -13.5v-25h-202l-105 278q-10 27 -17.5 36.5t-25.5 11.5l-64 -238q-2 -10 -2 -17q0 -25 13 -34t52 -12v-25h-288v25q36 4 52.5 17t26.5 51l123 453q11 38 11 58q0 17 -9 25t-32 11l-33 4v25h311v-25q-45 -4 -64.5 -18.5t-29.5 -53.5z" />
+<glyph unicode="&#x41b;" horiz-adv-x="742" d="M764 669v-25q-36 0 -53.5 -16.5t-28.5 -57.5l-111 -408q-22 -84 -22 -96q0 -22 16 -30.5t57 -10.5v-25h-316v25q51 3 70 17.5t32 61.5l119 432q9 34 10 58q0 25 -39 25h-114q-24 0 -36.5 -14t-21.5 -47l-78 -292q-11 -40 -21 -70t-29.5 -73.5t-42 -71.5t-56.5 -48.5 t-74 -20.5q-39 0 -61.5 21.5t-22.5 53.5q0 44 23.5 64t54.5 20q21 0 33.5 -11t15.5 -24.5t9 -24.5t16 -11q51 0 110 224l79 295q3 11 3 19q0 16 -13.5 24.5t-49.5 11.5v25h542z" />
+<glyph unicode="&#x41c;" horiz-adv-x="890" d="M912 669v-25q-39 -5 -55 -20t-29 -61l-119 -438q-10 -34 -10 -57q0 -25 14 -34t57 -9v-25h-311v25q50 3 69.5 18.5t31.5 60.5l123 457l-375 -573h-28l-67 559l-101 -369q-20 -71 -20 -92q0 -33 15.5 -44.5t64.5 -16.5v-25h-206v25q40 9 58 36.5t45 120.5l107 369 q11 41 11 58q0 22 -12.5 28.5t-58.5 6.5v25h219l54 -480l311 480h212z" />
+<glyph unicode="&#x41d;" horiz-adv-x="769" d="M791 669v-25q-36 0 -53.5 -16.5t-28.5 -57.5l-111 -408q-22 -84 -22 -96q0 -22 16 -30.5t57 -10.5v-25h-316v25q51 3 70 17.5t32 61.5l62 225h-239l-54 -197q-12 -43 -12 -67q0 -34 71 -40v-25h-295v25q39 5 54 18.5t27 55.5l121 447q11 38 11 58q0 17 -9.5 25t-32.5 11 l-31 4v25h316v-25q-49 -2 -69 -17t-33 -63l-52 -191h239l47 173q10 38 10 61q0 15 -9 22.5t-32 10.5l-31 4v25h297z" />
+<glyph unicode="&#x41e;" horiz-adv-x="722" d="M717 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM573 528q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-46 -78 -79.5 -189.5t-33.5 -198.5q0 -57 27.5 -92 t74.5 -35q46 0 82 28t75 86q49 72 83 191t34 207z" />
+<glyph unicode="&#x41f;" horiz-adv-x="767" d="M789 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l143 522h-240l-130 -477q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33 l-32 4v25h684z" />
+<glyph unicode="&#x420;" horiz-adv-x="590" d="M110 669h282q219 0 219 -155q0 -80 -59 -131q-75 -66 -214 -66q-37 0 -81 5l-54 -199q-11 -37 -11 -58q0 -20 15 -29t57 -11v-25h-294v25q40 6 55.5 20.5t28.5 61.5l117 426q13 46 13 74q0 15 -9 22.5t-32 10.5l-33 4v25zM328 584l-61 -229q17 -3 42 -3q46 0 74.5 14.5 t48.5 47.5q33 52 33 136q0 40 -22.5 63.5t-61.5 23.5q-26 0 -35 -9.5t-18 -43.5z" />
+<glyph unicode="&#x421;" horiz-adv-x="667" d="M710 685l-51 -235l-32 6q3 20 3 36q0 72 -34.5 115t-96.5 43q-80 0 -145 -73q-61 -69 -98 -165t-37 -203q0 -81 42 -127.5t113 -46.5q61 0 105 28t99 91l31 -22q-42 -58 -78 -85q-86 -65 -199 -65q-122 0 -194.5 69t-72.5 183q0 109 42.5 202t116.5 156q111 93 249 93 q63 0 131 -21q24 -8 38 -8q20 0 38 29h30z" />
+<glyph unicode="&#x422;" horiz-adv-x="611" d="M681 669l-36 -192l-27 2q0 86 -28 120.5t-110 34.5l-135 -489q-17 -58 -17 -74q0 -46 83 -46v-25h-331v25h15q72 0 91 72l148 537q-76 -1 -129.5 -39t-91.5 -118l-25 7l42 185h551z" />
+<glyph unicode="&#x423;" horiz-adv-x="666" d="M712 669v-25q-50 -7 -69 -39l-275 -471q-47 -79 -86.5 -115.5t-92.5 -36.5q-36 0 -63 19.5t-27 50.5q0 48 27.5 69t56.5 21q21 0 33.5 -13t15.5 -28.5t9.5 -28.5t16.5 -13q22 0 96 128l-155 394q-14 36 -25.5 45.5t-49.5 17.5v25h285v-25q-40 -4 -54.5 -11t-14.5 -28 q0 -15 29 -110l69 -165h2l108 199q18 32 18 65q0 45 -61 50v25h207z" />
+<glyph unicode="&#x424;" horiz-adv-x="833" d="M588 581l-4 -18q102 -1 167 -44t65 -132q0 -72 -38 -131t-95.5 -92.5t-116 -51t-107.5 -17.5q-4 -16 -4 -29q0 -22 17 -31.5t62 -9.5v-25h-323v25q52 5 72.5 17t31.5 53h-8q-104 0 -169.5 51.5t-65.5 142.5q0 84 58.5 149t138.5 95t160 30h15q7 33 7 44q0 28 -45 33 l-32 4v25h318v-25q-48 0 -72 -12t-32 -51zM577 529l-108 -400q70 0 136.5 73t66.5 169q0 64 -24 111t-71 47zM328 129l109 400q-75 0 -148 -81.5t-73 -171.5q0 -60 31.5 -103.5t80.5 -43.5z" />
+<glyph unicode="&#x425;" horiz-adv-x="607" d="M657 669v-25q-28 -4 -47.5 -16t-51.5 -45l-199 -205l75 -237q21 -66 41.5 -88t73.5 -28v-25h-307v25q42 4 54.5 11t12.5 27q0 30 -37 141l-20 60l-130 -144q-32 -35 -32 -55q0 -34 63 -40v-25h-214v25q10 2 17.5 4t16.5 8l17 11q7 4 19 16l22 20l26 27l30 33l38 42l45 49 l68 74l-83 269q-12 40 -29 50.5t-64 15.5v25h305v-25l-29 -3q-25 -2 -35 -9t-10 -24q0 -21 35 -132l17 -55l94 99q70 74 70 98q0 21 -33 24l-21 2v25h202z" />
+<glyph unicode="&#x426;" horiz-adv-x="770" d="M792 669v-25q-39 -5 -54 -18t-29 -64l-117 -429q-14 -51 -14 -71q0 -28 42 -33l32 -4l-56 -209l-30 4q4 24 4 47q0 133 -132 133h-470v25q38 4 55 19t29 61l112 412q17 62 17 87q0 21 -14.5 29.5t-56.5 10.5v25h296v-25q-39 -5 -54 -18t-29 -64l-142 -522h239l130 477 q17 62 17 87q0 21 -14.5 29.5t-56.5 10.5v25h296z" />
+<glyph unicode="&#x427;" horiz-adv-x="758" d="M780 669v-25q-36 0 -53.5 -16.5t-28.5 -57.5l-111 -408q-22 -84 -22 -96q0 -22 16 -30.5t57 -10.5v-25h-316v25q51 3 70 17.5t32 61.5l52 188q-86 -37 -175 -37q-77 0 -118.5 20.5t-41.5 81.5q0 33 12 79l35 135q5 18 5 33q0 17 -9.5 25t-32.5 11l-31 4v25h306v-25 q-44 -2 -61.5 -17t-30.5 -63l-46 -165q-8 -29 -8 -47q0 -50 81 -50q25 0 65.5 10t59.5 17l59 217q10 38 10 61q0 15 -8.5 21.5t-32.5 11.5l-21 4v25h287z" />
+<glyph unicode="&#x428;" horiz-adv-x="960" d="M982 669v-25q-39 -5 -54 -18t-29 -64l-117 -429q-12 -43 -12 -69q0 -21 14.5 -29t56.5 -10v-25h-874v25q38 4 55 19t29 61l112 412q17 62 17 87q0 21 -14.5 29.5t-56.5 10.5v25h266v-25q-27 -7 -39.5 -23t-23.5 -59l-132 -486q-4 -16 -4 -20q0 -16 29 -16h85 q20 0 29.5 6.5t14.5 25.5l126 456q17 63 17 75q0 20 -8 29t-37 12v25h236v-25q-28 -5 -40.5 -25t-22.5 -57l-132 -485q-4 -14 -4 -21q0 -16 20 -16h100q19 0 27 6t13 25l121 446q18 70 18 84q0 36 -42 43v25h256z" />
+<glyph unicode="&#x429;" horiz-adv-x="960" d="M982 669v-25q-39 -5 -54 -18t-29 -64l-117 -429q-14 -51 -14 -71q0 -28 42 -33l32 -4l-57 -209l-30 4q4 24 4 47q0 133 -131 133h-661v25q38 4 55 19t29 61l112 412q17 62 17 87q0 21 -14.5 29.5t-56.5 10.5v25h266v-25q-27 -7 -39.5 -23t-23.5 -59l-132 -486 q-4 -16 -4 -20q0 -16 29 -16h85q20 0 29.5 6.5t14.5 25.5l126 456q17 63 17 75q0 20 -8 29t-37 12v25h236v-25q-28 -5 -40.5 -25t-22.5 -57l-132 -485q-4 -14 -4 -21q0 -16 20 -16h100q19 0 27 6t13 25l121 446q18 70 18 84q0 36 -42 43v25h256z" />
+<glyph unicode="&#x42a;" horiz-adv-x="780" d="M427 370h81q214 0 214 -164q0 -99 -78 -152.5t-217 -53.5h-302v25q36 5 54 22t30 61l119 438q11 39 11 57q0 31 -33 31q-45 0 -91 -35t-81 -108l-27 7l39 171h427v-25q-46 0 -61.5 -12.5t-27.5 -54.5zM419 338l-64 -236q-7 -27 -7 -37q0 -33 57 -33q77 0 120.5 58 t43.5 139q0 65 -36.5 87t-113.5 22z" />
+<glyph unicode="&#x42b;" horiz-adv-x="985" d="M283 370h81q214 0 214 -164q0 -99 -78 -152.5t-217 -53.5h-302v25q36 5 54 22t30 61l119 438q11 39 11 57t-10.5 27.5t-23.5 11.5t-37 2v25h305v-25q-46 0 -61.5 -12.5t-27.5 -54.5zM275 338l-64 -236q-7 -27 -7 -37q0 -33 57 -33q77 0 120.5 58t43.5 139q0 65 -36.5 87 t-113.5 22zM1007 669v-25q-38 -4 -55 -19t-29 -61l-112 -412q-17 -62 -17 -87q0 -21 14.5 -29.5t56.5 -10.5v-25h-296v25q39 5 54 18t29 64l117 429q14 51 14 71q0 28 -42 33l-32 4v25h298z" />
+<glyph unicode="&#x42c;" horiz-adv-x="636" d="M283 370h81q214 0 214 -164q0 -99 -78 -152.5t-217 -53.5h-302v25q36 5 54 22t30 61l119 438q11 39 11 57t-10.5 27.5t-23.5 11.5t-37 2v25h305v-25q-46 0 -61.5 -12.5t-27.5 -54.5zM275 338l-64 -236q-7 -27 -7 -37q0 -33 57 -33q77 0 120.5 58t43.5 139q0 65 -36.5 87 t-113.5 22z" />
+<glyph unicode="&#x42d;" horiz-adv-x="671" d="M157 685h30q1 -13 11 -22t22 -9q23 0 56 12q54 19 125 19q105 0 176 -63t71 -184q0 -124 -57.5 -228.5t-158 -166t-219.5 -61.5q-90 0 -149.5 34t-59.5 110q0 37 24 60t50 23q28 0 46.5 -16.5t18.5 -45.5q0 -23 -16 -44t-16 -32q0 -54 89 -54q90 0 162.5 86t109.5 220 h-255l11 50h254q12 57 12 117q0 72 -36 116t-82 44q-75 0 -141 -49t-102 -154h-32z" />
+<glyph unicode="&#x42e;" horiz-adv-x="905" d="M264 373h70q48 130 144 220q100 92 201 92q86 0 139 -66t53 -175q0 -92 -47 -192t-119 -174q-96 -96 -212 -96q-89 0 -138 62t-49 177q0 52 14 108h-68l-54 -197q-12 -43 -12 -67q0 -34 71 -40v-25h-295v25q39 5 54 18.5t27 55.5l121 447q11 38 11 58q0 17 -9.5 25 t-32.5 11l-31 4v25h316v-25q-49 -2 -69 -17t-33 -63zM754 528q0 123 -79 123q-76 0 -140 -120q-45 -82 -78.5 -193t-33.5 -195q0 -58 20.5 -92.5t59.5 -34.5q38 0 69.5 28t66.5 86q46 74 80.5 194t34.5 204z" />
+<glyph unicode="&#x42f;" horiz-adv-x="710" d="M732 669v-25q-38 -3 -54.5 -18.5t-29.5 -61.5l-124 -459q-5 -17 -5 -35q0 -22 17 -32t54 -13v-25h-301v25q47 1 61 17.5t27 64.5l61 220q-23 -5 -38 -5l-274 -322h-190l-1 25q35 6 49.5 14.5t34.5 31.5l219 256q-105 38 -105 136q1 98 76 152t217 54h306zM447 364l57 208 q5 20 5 32q0 34 -46 34q-81 0 -129.5 -58.5t-48.5 -139.5q0 -83 100 -83q31 0 62 7z" />
+<glyph unicode="&#x430;" horiz-adv-x="527" d="M476 127l21 -15q-78 -126 -156 -126q-29 0 -46 16.5t-17 47.5q0 21 14 69q-42 -71 -80 -101.5t-84 -30.5q-49 0 -78.5 35t-29.5 92q0 117 87 231q89 117 186 117q32 0 49.5 -17t24.5 -55h1l17 59l111 7l-75 -251q-30 -99 -30 -133q0 -15 12 -15t27 14.5t46 55.5zM344 373 q0 20 -10.5 33.5t-26.5 13.5q-52 0 -108 -115q-25 -51 -40.5 -105.5t-15.5 -84.5q0 -57 43 -57q45 0 86 75q29 52 50.5 123.5t21.5 116.5z" />
+<glyph unicode="&#x431;" horiz-adv-x="499" d="M544 685h26q-37 -111 -116 -140q-30 -11 -94 -13.5t-92 -12.5q-85 -29 -153 -162l3 -1q40 48 91.5 77t104.5 29q73 0 115 -41t42 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -116 45t-43 129q0 116 59 242q48 103 123.5 168.5t175.5 65.5h92q24 0 37.5 10 t24.5 38zM352 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#x432;" horiz-adv-x="482" d="M324 256v-2q112 -11 112 -90q0 -71 -79.5 -124t-172.5 -53q-89 0 -124 36t-35 111q0 133 83 230.5t217 97.5q60 0 96.5 -23t36.5 -63q0 -43 -32 -75.5t-102 -44.5zM364 383q0 24 -14.5 35t-33.5 11q-62 0 -95.5 -52t-48.5 -145q192 34 192 151zM317 165q0 25 -16 38 t-42 13q-38 0 -95 -25q-13 -49 -13 -91q0 -37 11.5 -60.5t34.5 -23.5q40 0 68.5 27.5t40 59.5t11.5 62z" />
+<glyph unicode="&#x433;" horiz-adv-x="368" d="M77 342l-19 20q79 99 188 99q57 0 91 -21.5t34 -63.5q0 -80 -86 -121l-38 -17l-43 -21q-14 -7 -33.5 -20t-31.5 -26q-28 -31 -28 -74q0 -51 51 -51q66 0 126 72l19 -19q-48 -60 -95 -86.5t-103 -26.5q-117 0 -117 93q0 18 7.5 35t15.5 28t27 24.5t28.5 19t34 18.5 t29.5 16q57 31 87.5 60t30.5 70q0 51 -57 51q-34 0 -61 -14t-57 -45z" />
+<glyph unicode="&#x434;" horiz-adv-x="496" d="M166 672l20 23q81 -12 144.5 -56.5t98.5 -106.5q37 -67 37 -152q0 -160 -81.5 -276.5t-204.5 -116.5q-67 0 -112.5 40t-45.5 107q0 130 85 229t190 99q47 0 71 -42l2 4q-10 101 -74.5 168t-129.5 80zM347 375q0 27 -12.5 42.5t-33.5 15.5q-41 0 -79.5 -65t-59.5 -145 t-21 -137q0 -70 49 -70q60 0 109 129q20 55 34 121t14 109z" />
+<glyph unicode="&#x435;" horiz-adv-x="431" d="M334 143l29 -17q-78 -139 -195 -139q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122q-32 -27 -73.5 -42.5t-114.5 -28.5q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20t60.5 72zM323 390q0 39 -31 39q-71 0 -127 -215 q68 15 113 64.5t45 111.5z" />
+<glyph unicode="&#x436;" horiz-adv-x="898" d="M506 249h74q20 68 70 130q67 83 144 83q39 0 67.5 -25t28.5 -67q0 -31 -17 -50.5t-41 -19.5q-21 0 -35 15t-14 38q0 16 9 32t9 26q0 7 -6.5 12.5t-14.5 5.5q-39 0 -69.5 -104t-30.5 -172q0 -34 2 -53t11 -34t27 -15q27 0 49 20t53 71l26 -18q-55 -92 -99 -119 q-29 -18 -69 -18q-57 0 -87.5 39t-30.5 112q0 27 10 77h-75l-59 -215h-112l59 215h-75q-20 -78 -75 -145q-69 -83 -144 -83q-40 0 -67.5 24t-27.5 68q0 31 17 50.5t41 19.5q21 0 35 -15t14 -38q0 -16 -9 -32t-9 -26q0 -7 6.5 -12.5t14.5 -5.5q39 0 69.5 104t30.5 172 q0 34 -2 53t-11 34t-27 15q-27 0 -49 -20t-53 -71l-26 18q55 92 99 119q29 18 69 18q57 0 87.5 -39t30.5 -112q0 -24 -8 -62h79l54 200h111z" />
+<glyph unicode="&#x437;" horiz-adv-x="400" d="M101 462h23q1 -3 1.5 -7t1 -6.5t1.5 -5t1.5 -4t2 -3t3 -2t3.5 -0.5q6 0 36 14t59 14q60 0 95 -20q50 -29 50 -85q0 -92 -106 -125v-2q41 -5 64.5 -29.5t23.5 -54.5q0 -76 -73 -119q-67 -40 -166 -40q-53 0 -92.5 22t-39.5 70q0 27 17 47.5t46 20.5q21 0 37.5 -13 t16.5 -39q0 -15 -10.5 -27.5t-10.5 -24.5q0 -10 12.5 -16.5t29.5 -6.5q57 0 82.5 38t25.5 88q0 32 -12 50.5t-47 18.5h-49l10 34h54q40 0 63.5 31t23.5 70q0 75 -67 75q-44 0 -75 -33.5t-49 -81.5h-27z" />
+<glyph unicode="&#x438;" horiz-adv-x="542" d="M490 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -75q0 -22 24 -22q28 0 70 55q47 61 75.5 125t66.5 206 h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#x439;" horiz-adv-x="542" d="M490 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -75q0 -22 24 -22q28 0 70 55q47 61 75.5 125t66.5 206 h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74zM490 697h24q-6 -44 -25 -84t-61 -70.5t-99 -30.5q-55 0 -98.5 33.5t-43.5 91.5q0 30 18 45t39 15q17 0 30.5 -11t13.5 -28t-9.5 -29t-9.5 -21q0 -18 23 -32t49 -14q111 0 149 135z" />
+<glyph unicode="&#x43a;" horiz-adv-x="522" d="M258 461l-58 -209q34 6 62 29.5t48 52.5l39 56q20 29 48 48t63 19q36 0 51.5 -20t15.5 -46q0 -32 -16 -49t-43 -17q-18 0 -31 12t-22 24t-17 12q-16 0 -31 -21l-37 -50q-23 -30 -52 -47v-3q30 -17 50.5 -50.5t27.5 -63.5t17.5 -52.5t24.5 -22.5q28 0 64 64l22 -11 q-32 -68 -65 -96t-73 -28q-48 0 -72.5 29.5t-37.5 81.5q-28 108 -45 115l-58 -218h-121l90 328q11 42 11 50q0 25 -58 29v27q106 5 203 27z" />
+<glyph unicode="&#x43b;" horiz-adv-x="507" d="M455 135l22 -13q-40 -71 -79.5 -101t-85.5 -30q-34 0 -53.5 15t-19.5 45q0 47 26 125l50 152q6 20 6 36q0 26 -32 26q-24 0 -51 -24q-30 -26 -54.5 -97t-44.5 -143t-36 -93q-33 -44 -81 -44q-31 0 -50.5 16t-19.5 48q0 25 15 42t40 17q17 0 27 -10t16.5 -20t15.5 -10 q12 0 24 31t23.5 77.5t14.5 53.5q47 136 97 179q57 49 136 49q39 0 61 -20.5t22 -56.5q0 -27 -28 -116l-32 -104q-24 -81 -24 -89q0 -17 19 -17q14 0 31 16t45 60z" />
+<glyph unicode="&#x43c;" horiz-adv-x="667" d="M615 135l22 -13q-40 -71 -79.5 -101t-85.5 -30q-68 0 -68 59q0 41 29 131l40 125h-1l-207 -306h-26q-4 54 -19.5 163.5t-17.5 167.5h-1q-45 -196 -85.5 -269t-93.5 -73q-31 0 -50.5 16t-19.5 48q0 25 15 42t40 17q17 0 27 -10t16.5 -20t15.5 -10q20 0 44.5 66t54.5 184 l32 127h105q10 -155 33 -289q28 38 57 82l69 108l64 99h101l-82 -287q-24 -82 -24 -86q0 -17 19 -17q14 0 31 16t45 60z" />
+<glyph unicode="&#x43d;" horiz-adv-x="543" d="M491 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-68 0 -68 60q0 20 27 126l10 38h-128l-60 -215h-121l57 204q45 164 45 179q0 14 -11.5 18.5t-43.5 5.5v27q92 3 205 28l-60 -213h128l55 200h117l-76 -266q-23 -80 -23 -107q0 -17 14 -17q13 0 27 15t44 61z" />
+<glyph unicode="&#x43e;" d="M468 311q0 -69 -29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77q75 0 118 -41t43 -110zM349 372q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49 q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#x43f;" horiz-adv-x="543" d="M491 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-66 0 -66 60q0 53 24 125l55 165q8 27 8 28q0 21 -26 21q-13 0 -33 -16.5t-36 -37.5q-47 -62 -79 -135t-66 -201h-121l57 204q45 164 45 179q0 14 -11.5 18.5t-43.5 5.5v27q85 3 199 28l-62 -199h1q43 69 66.5 98 t55.5 60q43 41 100 41q73 0 73 -77q0 -34 -28 -116l-35 -104q-24 -71 -24 -89q0 -17 14 -17q13 0 27 15t44 61z" />
+<glyph unicode="&#x440;" horiz-adv-x="497" d="M201 347h1q41 64 77.5 89.5t80.5 25.5q53 0 81.5 -32.5t28.5 -88.5q0 -138 -85 -246t-192 -108q-38 0 -68 22l-12 -41q-24 -83 -24 -114q0 -18 13.5 -24.5t51.5 -7.5v-27h-250v27q36 0 50 15t28 71l96 380q22 88 22 94q0 14 -10 18.5t-44 6.5v27q51 6 192 28zM345 336 q0 55 -39 55q-40 0 -87 -71q-13 -19 -20 -37t-24 -76q-38 -128 -38 -149q0 -15 11.5 -25.5t27.5 -10.5q30 0 62 30q46 45 76.5 137t30.5 147z" />
+<glyph unicode="&#x441;" horiz-adv-x="435" d="M349 142l28 -18l-38 -50q-13 -17 -34.5 -37.5t-42.5 -31.5q-34 -18 -83 -18q-70 0 -111.5 39.5t-41.5 111.5q0 129 105 239q80 85 180 85q46 0 79 -25.5t33 -64.5q0 -32 -17 -51.5t-45 -19.5q-26 0 -42 14.5t-16 36.5q0 16 10.5 33t10.5 27q0 7 -7.5 12t-16.5 5 q-52 0 -92 -77q-25 -48 -39.5 -110.5t-14.5 -101.5q0 -43 19.5 -66t53.5 -23q32 0 59 20t63 71z" />
+<glyph unicode="&#x442;" horiz-adv-x="777" d="M725 135l22 -13q-38 -71 -75.5 -101t-85.5 -30q-66 0 -66 66q0 46 36 151l44 130q7 23 7 30q0 8 -7 14.5t-16 6.5q-47 0 -112 -116q-27 -48 -42.5 -89t-58.5 -184h-120l65 207q45 143 45 160q0 22 -18 22q-25 0 -65 -47q-43 -51 -75 -126t-72 -216h-121l66 232 q36 125 36 150t-38 25h-18v27q130 10 200 27l-63 -199h1q53 91 104 142q58 58 114 58q32 0 50 -18t18 -49q0 -35 -27 -105q55 98 99 135t99 37q35 0 55 -19.5t20 -51.5q0 -49 -21 -109l-45 -128q-21 -60 -21 -77q0 -18 16 -18q22 0 58 58q6 11 12 18z" />
+<glyph unicode="&#x443;" horiz-adv-x="447" d="M241 99h2q56 75 85.5 133.5t29.5 84.5q0 13 -25 34q-31 25 -31 54q0 21 17 39t43 18q28 0 44 -18.5t16 -45.5q0 -71 -86 -218.5t-193 -278.5q-63 -78 -126 -98q-26 -8 -49 -8q-26 0 -44 18t-18 44q0 22 15 38t35 16q25 0 51 -18t43 -18q13 0 32 15t35 37q25 35 25 71 q0 50 -50 288q-20 88 -40 109q-8 8 -14.5 10t-25.5 2v27q69 6 150 28q23 -59 64 -282z" />
+<glyph unicode="&#x444;" horiz-adv-x="750" d="M465 347l3 4q60 111 154 111q95 0 95 -118q0 -47 -15 -102.5t-36 -91.5q-44 -77 -100.5 -120t-113.5 -43q-40 0 -57 22q-10 11 -14 33l-43 -157q-6 -21 -6 -35q0 -27 66 -28v-27h-263v27q46 0 61.5 14t25.5 49l61 221l-6 -8q-60 -111 -154 -111q-95 0 -95 130 q0 87 52 178q45 78 101 122.5t112 44.5q40 0 57 -22q10 -12 15 -38l45 164q7 24 7 42q0 20 -7 27t-23 7h-34v27q96 5 209 30zM428 211l-19 -67q-9 -31 -9 -66q0 -48 35 -48q27 0 58 35.5t53 79.5q53 109 53 188q0 57 -39 57q-45 0 -88 -74q-29 -51 -44 -105zM345 371 q0 48 -35 48q-27 0 -58 -35.5t-53 -79.5q-53 -109 -53 -188q0 -57 39 -57q45 0 88 74q27 47 49.5 121t22.5 117z" />
+<glyph unicode="&#x445;" horiz-adv-x="456" d="M272 335l9 -30q75 99 106.5 128t65.5 29q24 0 41 -16t17 -40q0 -22 -17 -40t-39 -18q-12 0 -29 10t-28 10q-16 0 -40.5 -26t-63.5 -80l43 -147q9 -30 18.5 -40.5t24.5 -10.5q13 0 25.5 10.5t41.5 48.5l21 -14q-46 -66 -80.5 -94t-70.5 -28q-37 0 -60.5 34.5t-50.5 125.5 l-37 -47q-55 -69 -81.5 -91t-62.5 -22q-29 0 -46 16t-17 42q0 24 15.5 41t38.5 17q16 0 34.5 -11t27.5 -11q31 0 60 37l55 72l-42 139q-23 80 -68 80q-16 0 -35 -2v27l165 28q1 -1 9 -12.5t9.5 -14.5t8.5 -15t10 -22l10 -26q6 -17 12 -37z" />
+<glyph unicode="&#x446;" horiz-adv-x="542" d="M490 133l22 -13q-28 -47 -49 -70q-18 -29 -18 -53q0 -11 3.5 -30t3.5 -32q0 -37 -20.5 -58.5t-99.5 -55.5l-9 24q23 10 33.5 31t10.5 41q0 1 -1 15.5t-1 17.5q0 22 17 45l-1 1q-15 -5 -28 -5q-68 0 -68 60q0 31 26 110h-1q-70 -103 -109.5 -136.5t-88.5 -33.5 q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q28 0 70 55q47 61 75.5 125t66.5 206h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#x447;" horiz-adv-x="531" d="M479 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-68 0 -68 60q0 21 25 113l6 22q-92 -38 -129 -38q-61 0 -82 23.5t-21 68.5q0 14 9 48q22 82 22 95q0 14 -11.5 18.5t-43.5 5.5v27q92 3 205 28l-57 -198q-7 -28 -7 -33q0 -36 41 -36q28 0 81 21l67 233h117l-78 -266 q-23 -81 -23 -107q0 -17 14 -17q13 0 27 15t44 61z" />
+<glyph unicode="&#x448;" horiz-adv-x="800" d="M748 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-69 -102 -110.5 -136t-91.5 -34q-75 0 -75 60q0 37 26 110h-1q-69 -102 -110.5 -136t-91.5 -34q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302 q-16 -51 -16 -72q0 -25 24 -25q32 0 74 55q45 58 71 121t66 210h118l-85 -290l-1 -1q-15 -50 -15 -70q0 -25 24 -25q32 0 74 55q45 58 71 121t66 210h118l-73 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#x449;" horiz-adv-x="800" d="M748 133l22 -13q-28 -47 -49 -70q-18 -29 -18 -53q0 -11 3.5 -30t3.5 -32q0 -37 -20.5 -58.5t-99.5 -55.5l-9 24q44 19 44 71q0 3 -1 18t-1 16q0 22 17 45l-1 1q-15 -5 -28 -5q-68 0 -68 60q0 31 26 110h-1q-69 -102 -110.5 -136t-91.5 -34q-75 0 -75 60q0 31 26 110h-1 q-69 -102 -110.5 -136t-91.5 -34q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -72q0 -25 24 -25q32 0 74 55q45 58 71 121t66 210h118l-85 -290l-1 -1q-15 -50 -15 -70q0 -25 24 -25q32 0 74 55q45 58 71 121t66 210h118 l-73 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#x44a;" horiz-adv-x="594" d="M300 245h1q58 53 139 53q55 0 85.5 -27.5t30.5 -76.5q0 -84 -77.5 -145.5t-186.5 -61.5q-36 0 -67 9.5t-55 36.5t-24 69q0 75 29.5 135.5t104.5 135.5l-2 2q-29 -10 -75 -10q-23 0 -53 10.5t-35 10.5q-34 0 -62 -54l-24 12q47 118 129 118q30 0 63.5 -14.5t65.5 -14.5 q56 0 85 29l21 -17q-67 -92 -93 -200zM437 202q0 51 -55 51q-37 0 -67 -37t-43 -79.5t-13 -74.5q0 -26 12 -36t34 -10q46 0 89 67t43 119z" />
+<glyph unicode="&#x44b;" horiz-adv-x="754" d="M197 245h1q58 53 139 53q55 0 85.5 -27.5t30.5 -76.5q0 -84 -77.5 -145.5t-186.5 -61.5q-37 0 -67 8t-54.5 33.5t-24.5 67.5q0 26 15 80l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28zM334 202q0 51 -55 51q-37 0 -67 -37t-43 -79.5t-13 -74.5q0 -26 12 -36t34 -10 q46 0 89 67t43 119zM702 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-68 0 -68 60q0 25 13 74l92 324h117l-78 -266q-23 -81 -23 -107q0 -17 14 -17q13 0 27 15t44 61z" />
+<glyph unicode="&#x44c;" horiz-adv-x="491" d="M197 245h1q58 53 139 53q55 0 85.5 -27.5t30.5 -76.5q0 -84 -77.5 -145.5t-186.5 -61.5q-37 0 -67 8t-54.5 33.5t-24.5 67.5q0 26 15 80l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28zM334 202q0 51 -55 51q-37 0 -67 -37t-43 -79.5t-13 -74.5q0 -26 12 -36t34 -10 q46 0 89 67t43 119z" />
+<glyph unicode="&#x44d;" horiz-adv-x="444" d="M108 462h23q1 -3 1.5 -7t1 -6.5t1.5 -5t1.5 -4t2 -3t3 -2t3.5 -0.5q6 0 38 14t61 14q76 0 118.5 -37t42.5 -114q0 -134 -105 -239q-83 -85 -198 -85q-48 0 -81 24t-33 66q0 31 19 50.5t47 19.5q25 0 39.5 -14.5t14.5 -37.5q0 -16 -10.5 -30t-10.5 -24q0 -7 9 -12t19 -5 q61 0 107 84q25 48 39 104h-148l11 40h145q8 34 8 69q0 45 -13 74.5t-42 29.5q-44 0 -77 -34t-51 -81h-27z" />
+<glyph unicode="&#x44e;" horiz-adv-x="740" d="M203 249h81q25 80 82 136q79 77 183 77q75 0 118 -41t43 -110t-29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 40 8 80h-81l-59 -215h-122l57 204q45 164 45 179q0 14 -11.5 18.5t-43.5 5.5v27q92 3 205 28zM591 372q0 28 -12.5 44.5 t-34.5 16.5q-32 0 -60 -31q-43 -48 -71 -144.5t-28 -177.5q0 -64 49 -64q41 0 71 49q36 59 61 149.5t25 157.5z" />
+<glyph unicode="&#x44f;" horiz-adv-x="538" d="M486 135l22 -13q-41 -72 -77.5 -101.5t-82.5 -29.5q-68 0 -68 60q0 28 27 126l4 14h-23q-27 0 -42 -21t-38 -84q-20 -53 -49.5 -75t-76.5 -22q-39 0 -59.5 25.5t-20.5 62.5q0 35 15 65h26q-5 -27 -5 -40q0 -34 25 -34q26 0 44 54q19 56 65 73v2q-42 9 -62 33t-20 53 q0 73 59 119.5t168 46.5h185l-78 -266q-23 -81 -23 -107q0 -17 14 -17q13 0 27 15t44 61zM319 221l44 154q3 9 3 17q0 28 -41 28q-48 0 -83 -34.5t-36 -99.5q0 -65 85 -65h28z" />
+<glyph unicode="&#x451;" horiz-adv-x="434" d="M275 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM487 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM334 143l29 -17 q-78 -139 -195 -139q-67 0 -106.5 37.5t-39.5 109.5q0 124 89.5 226t198.5 102q48 0 76.5 -24t28.5 -63q0 -63 -69 -122q-32 -27 -73.5 -42.5t-114.5 -28.5q-6 -30 -6 -49q0 -82 64 -82q32 0 57.5 20t60.5 72zM323 390q0 39 -31 39q-71 0 -127 -215q68 15 113 64.5t45 111.5 z" />
+<glyph unicode="&#x452;" horiz-adv-x="523" d="M205 275h1q46 73 63.5 97t43.5 49q43 41 102 41q75 0 75 -77q0 -28 -19 -97l-60 -222q-35 -129 -94 -200t-134 -71q-46 0 -70.5 21.5t-24.5 55.5q0 22 14.5 37.5t34.5 15.5q22 0 35.5 -13.5t13.5 -35.5q0 -11 -7.5 -20t-7.5 -15q0 -15 24 -15q27 0 47 49t56 187l65 250 q8 28 8 57q0 21 -28 21q-13 0 -33 -16.5t-36 -37.5q-43 -56 -73.5 -126t-70.5 -210h-118l138 510h-79l12 40h78l3 12q10 37 10 47q0 33 -42 33h-22v27q95 8 207 30l-39 -149h159l-12 -40h-157z" />
+<glyph unicode="&#x453;" horiz-adv-x="368" d="M77 342l-19 20q79 99 188 99q57 0 91 -21.5t34 -63.5q0 -80 -86 -121l-38 -17l-43 -21q-14 -7 -33.5 -20t-31.5 -26q-28 -31 -28 -74q0 -51 51 -51q66 0 126 72l19 -19q-48 -60 -95 -86.5t-103 -26.5q-117 0 -117 93q0 18 7.5 35t15.5 28t27 24.5t28.5 19t34 18.5 t29.5 16q57 31 87.5 60t30.5 70q0 51 -57 51q-34 0 -61 -14t-57 -45zM216 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49z" />
+<glyph unicode="&#x454;" horiz-adv-x="415" d="M450 462l-42 -152h-27q0 25 -2 41.5t-8 36.5t-21.5 30.5t-39.5 10.5q-44 0 -85 -55.5t-58 -121.5h148l-9 -40h-147q-9 -32 -9 -75q0 -55 21.5 -84t56.5 -29q55 0 55 51q0 7 -2.5 16t-2.5 17q0 23 17 38.5t45 15.5q20 0 34.5 -14.5t14.5 -35.5q0 -36 -26.5 -65.5 t-63.5 -43.5q-44 -16 -109 -16q-86 0 -127 41t-41 111q0 116 89 219.5t194 103.5q28 0 46 -8t28 -15.5t17 -7.5q20 0 31 31h23z" />
+<glyph unicode="&#x455;" horiz-adv-x="389" d="M352 461l-23 -154l-27 2q-12 63 -33 91.5t-55 28.5q-24 0 -38.5 -14.5t-14.5 -38.5q0 -33 57 -99q80 -93 80 -162q0 -56 -43 -92t-105 -36q-35 0 -64 12q-21 8 -30 8q-20 0 -29 -20h-27l22 166l27 -3q17 -133 93 -133q29 0 44.5 14.5t15.5 39.5q0 41 -56 104 q-50 56 -65 87.5t-15 73.5q0 59 36.5 92.5t97.5 33.5q32 0 58 -12q21 -10 37 -10q11 0 16 4t12 17h29z" />
+<glyph unicode="&#x456;" horiz-adv-x="278" d="M234 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61zM280 616q0 -28 -19.5 -47t-48.5 -19q-28 0 -47 20t-19 49q0 25 20 45t45 20q28 0 48.5 -20 t20.5 -48z" />
+<glyph unicode="&#x457;" horiz-adv-x="278" d="M236 142l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l55 203q8 32 8 45q0 29 -46 29h-14v27q118 9 203 28l-91 -334q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61zM382 589q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5 q27 0 46.5 -19.5t19.5 -46.5zM170 589q0 -26 -19.5 -45t-46.5 -19q-26 0 -45 19.5t-19 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x458;" horiz-adv-x="278" d="M267 462l-116 -444q-31 -119 -81 -172t-126 -53q-47 0 -76 22t-29 55q0 22 14.5 37.5t34.5 15.5q22 0 35.5 -13.5t13.5 -35.5q0 -11 -7.5 -20t-7.5 -15q0 -15 24 -15q21 0 38 31t36 105l89 350q12 45 12 67q0 30 -41 30h-22v27q136 12 209 28zM307 617q0 -28 -20 -47.5 t-49 -19.5q-28 0 -47 20t-19 49q0 26 20 46t46 20q28 0 48.5 -20t20.5 -48z" />
+<glyph unicode="&#x459;" horiz-adv-x="694" d="M409 246h1q58 53 129 53q55 0 86 -26.5t31 -75.5q0 -85 -73.5 -147.5t-181.5 -62.5q-59 0 -102 26t-43 86q0 15 2 28.5t16 60.5l41 140q6 20 6 36q0 26 -32 26q-25 0 -52 -24q-30 -26 -54.5 -97t-44 -143t-35.5 -93q-32 -44 -81 -44q-31 0 -50.5 16t-19.5 48q0 25 15 42 t40 17q17 0 27 -10t16.5 -20t15.5 -10q12 0 24 30t24 79l14 53q41 131 97 179q57 49 136 49q39 0 61 -20.5t22 -56.5q0 -46 -35 -139zM536 203q0 51 -55 51q-28 0 -51 -21.5t-35.5 -53.5t-19 -62.5t-6.5 -53.5q0 -47 46 -47t83.5 67t37.5 120z" />
+<glyph unicode="&#x45a;" horiz-adv-x="733" d="M449 245h1q58 53 129 53q55 0 85.5 -27.5t30.5 -76.5q0 -85 -73 -146t-181 -61q-37 0 -67 8t-54.5 33.5t-24.5 67.5q0 21 16 80l11 39h-128l-58 -215h-124l57 204q44 160 44 179q0 14 -11.5 18.5t-43.5 5.5v27q92 3 205 28l-60 -213h128l16 55q17 62 17 75t-8.5 19.5 t-36.5 8.5v27q72 1 197 28zM576 202q0 51 -55 51q-28 0 -51.5 -21.5t-36 -53.5t-19 -62.5t-6.5 -53.5q0 -26 12 -36t34 -10q46 0 84 66.5t38 119.5z" />
+<glyph unicode="&#x45b;" horiz-adv-x="556" d="M493 142l22 -15q-50 -77 -85.5 -106.5t-81.5 -29.5q-30 0 -47.5 17t-17.5 47q0 26 6.5 50.5t41.5 132.5l32 98q7 21 7 33q0 21 -24 21q-38 0 -99 -99q-36 -59 -58.5 -113t-58.5 -178h-118l138 510h-79l12 40h78l3 12q10 37 10 47q0 33 -42 33h-22v27q93 8 206 30 l-39 -149h159l-12 -40h-157l-62 -235q71 108 114 147.5t93 39.5q37 0 57 -20t20 -55q0 -34 -27 -118l-57 -178q-3 -8 -3 -16q0 -16 16 -16q17 0 75 83z" />
+<glyph unicode="&#x45c;" horiz-adv-x="522" d="M258 461l-58 -209q34 6 62 29.5t48 52.5l39 56q20 29 48 48t63 19q36 0 51.5 -20t15.5 -46q0 -32 -16 -49t-43 -17q-18 0 -31 12t-22 24t-17 12q-16 0 -31 -21l-37 -50q-23 -30 -52 -47v-3q30 -17 50.5 -50.5t27.5 -63.5t17.5 -52.5t24.5 -22.5q28 0 64 64l22 -11 q-32 -68 -65 -96t-73 -28q-48 0 -72.5 29.5t-37.5 81.5q-28 108 -45 115l-58 -218h-121l90 328q11 42 11 50q0 25 -58 29v27q106 5 203 27zM193 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49z" />
+<glyph unicode="&#x45e;" horiz-adv-x="447" d="M241 99h2q56 75 85.5 133.5t29.5 84.5q0 13 -25 34q-31 25 -31 54q0 21 17 39t43 18q28 0 44 -18.5t16 -45.5q0 -71 -86 -218.5t-193 -278.5q-63 -78 -126 -98q-26 -8 -49 -8q-26 0 -44 18t-18 44q0 22 15 38t35 16q25 0 51 -18t43 -18q13 0 32 15t35 37q25 35 25 71 q0 50 -50 288q-20 88 -40 109q-8 8 -14.5 10t-25.5 2v27q69 6 150 28q23 -59 64 -282zM412 697h24q-6 -44 -25 -84t-61 -70.5t-99 -30.5q-55 0 -98.5 33.5t-43.5 91.5q0 30 18 45t39 15q17 0 30.5 -11t13.5 -28t-9.5 -29t-9.5 -21q0 -18 23 -32t49 -14q111 0 149 135z" />
+<glyph unicode="&#x45f;" horiz-adv-x="538" d="M486 133l22 -13q-39 -67 -76.5 -98t-82.5 -31q-68 0 -68 60q0 31 26 110h-1q-57 -83 -87 -115q-19 -32 -19 -49q0 -15 3.5 -36.5t3.5 -32.5q0 -19 -5 -32.5t-17 -23t-24 -15.5l-35 -17q-22 -10 -39 -19l-9 24q23 10 33.5 31t10.5 41q0 1 -1 15.5t-1 17.5q0 21 16 43v2 q-16 -4 -28 -4q-78 0 -78 79q0 27 22 106l37 128q17 62 17 75q0 24 -58 28v27q87 2 210 28l-93 -302q-16 -51 -16 -75q0 -22 24 -22q28 0 70 55q47 61 75.5 125t66.5 206h118l-78 -266q-25 -88 -25 -103q0 -21 14 -21q24 0 72 74z" />
+<glyph unicode="&#x462;" horiz-adv-x="761" d="M412 370h81q214 0 214 -164q0 -99 -78 -152.5t-217 -53.5h-302v25q36 5 54 22t30 61l109 400h-10q-85 0 -127.5 -21t-78.5 -95l-25 7l36 159h218q8 32 8 45q0 18 -10.5 27.5t-23.5 11.5t-37 2v25h305v-25q-46 0 -61.5 -12.5t-27.5 -54.5l-5 -19h185l-31 -166l-27 2 q0 28 -3 47.5t-12.5 32t-18 19.5t-28.5 10t-34.5 4t-44.5 1zM404 338l-64 -236q-7 -27 -7 -37q0 -33 57 -33q77 0 120.5 58t43.5 139q0 65 -36.5 87t-113.5 22z" />
+<glyph unicode="&#x463;" horiz-adv-x="569" d="M275 245h1q58 53 139 53q55 0 85.5 -27.5t30.5 -76.5q0 -84 -77.5 -145.5t-186.5 -61.5q-37 0 -67 8t-54.5 33.5t-24.5 67.5q0 24 15 80l53 202q3 10 3 17q0 22 -21 22q-56 0 -76.5 -15t-50.5 -72h-24l36 127h154l22 84q9 33 9 66q0 17 -12 26t-42 10v27q81 2 210 29 l-65 -242h155l-35 -127h-24q0 51 -16.5 69t-66.5 18q-26 0 -31 -22zM412 202q0 51 -55 51q-37 0 -67 -37t-43 -79.5t-13 -74.5q0 -26 12 -36t34 -10q46 0 89 67t43 119z" />
+<glyph unicode="&#x46a;" horiz-adv-x="978" d="M918 0h-278v25q4 0 26 9q25 12 37 53q7 27 7 54q0 73 -36 120t-88 47l-49 -179q-13 -47 -13 -65q0 -19 14.5 -27.5t47.5 -11.5v-25h-291v25q28 3 43 7.5t25.5 20t15 28t13.5 47.5l49 180h-1q-64 0 -137 -64.5t-98 -156.5q-4 -11 -4 -26q0 -19 13 -27t20 -9v-25h-256v25 q28 7 49 25t31.5 36t28 52t28.5 53q97 161 311 161l-101 317h520l-228 -317h1q134 0 191 -78q20 -27 22 -69.5t4.5 -86t24.5 -72.5q14 -19 58 -21v-25zM747 619h-260l79 -254z" />
+<glyph unicode="&#x46b;" horiz-adv-x="844" d="M799 142l26 -18q-55 -92 -99 -119q-28 -18 -69 -18q-59 0 -93.5 36.5t-34.5 107.5q0 50 -49 65l-53 -196h-113l54 198q-17 -2 -30.5 -9t-25 -21.5t-16.5 -23t-16.5 -30.5t-13.5 -27q-28 -53 -77 -80q-35 -20 -93 -20q-42 0 -71 25t-29 67q0 31 17 50.5t41 19.5 q22 0 35.5 -13.5t13.5 -37.5q0 -16 -9 -33t-9 -27q0 -18 17 -18q20 0 26 25q35 127 124 165q41 18 96 19l-87 220h449l-197 -220q48 -3 82 -23q32 -18 42 -43t14 -66q4 -46 46 -46q27 0 49 20t53 71zM621 409h-219l69 -169z" />
+<glyph unicode="&#x472;" horiz-adv-x="722" d="M717 444q0 -95 -49.5 -194.5t-130.5 -171.5q-108 -96 -248 -96q-108 0 -172 62.5t-64 176.5q0 101 51 202.5t135 169.5q114 92 236 92q104 0 173 -66.5t69 -174.5zM573 528q0 60 -27 91.5t-74 31.5q-91 0 -162 -120q-42 -71 -73 -168q47 37 71 49.5t55 12.5 q18 0 31.5 -12.5t21.5 -28t24 -28t38 -12.5q40 0 72 21q23 97 23 163zM537 317q-44 -35 -68.5 -46.5t-55.5 -11.5q-18 0 -33.5 12.5t-25 28t-27 28t-39.5 12.5q-31 0 -65 -24q-26 -99 -26 -173q0 -57 27.5 -92t74.5 -35q46 0 82 28t75 86q49 74 81 187z" />
+<glyph unicode="&#x473;" d="M468 311q0 -69 -29 -135.5t-76 -113.5q-75 -75 -175 -75q-73 0 -118.5 38.5t-45.5 109.5q0 73 27 139t73 111q79 77 183 77q75 0 118 -41t43 -110zM166 240h2q37 34 62 34q18 0 38.5 -15.5t30.5 -15.5q16 0 36 20q14 61 14 109q0 28 -12.5 44.5t-34.5 16.5q-32 0 -60 -31 q-46 -51 -76 -162zM327 227h-2q-13 -21 -30.5 -32t-29.5 -11q-22 0 -45.5 17.5t-33.5 17.5q-12 0 -28 -13q-15 -68 -15 -126q0 -64 49 -64q41 0 71 49q39 64 64 162z" />
+<glyph unicode="&#x474;" horiz-adv-x="667" d="M339 200l186 343l22 41q7 12 23 34t28 32.5t31 19t40 8.5q38 0 59.5 -21t21.5 -53q0 -26 -16 -45t-46 -19q-20 0 -32 12t-19.5 24.5t-16.5 12.5q-28 0 -51 -43l-306 -564h-32l-76 513q-8 56 -13.5 81.5t-15.5 43t-22.5 21t-37.5 3.5v25h296v-25q-51 -4 -63 -11.5 t-12 -33.5q0 -11 2 -23l48 -376h2z" />
+<glyph unicode="&#x475;" horiz-adv-x="487" d="M237 174h2q41 98 86 164q80 119 150 119q24 0 41.5 -16.5t17.5 -41.5q0 -24 -17 -41t-41 -17q-12 0 -35 8t-29 8q-28 0 -64 -49q-80 -109 -164 -321h-26q-21 258 -93 401q-10 19 -50 19v27q83 11 152 28q59 -133 70 -288z" />
+<glyph unicode="&#x490;" horiz-adv-x="539" d="M641 834l-56 -200h-243l-145 -532q-6 -20 -6 -41q1 -35 73 -35v-26h-296v26q40 4 55 19t27 58l121 443q11 37 11 61q0 15 -8.5 21.5t-32.5 10.5l-34 5v25h300q91 0 129 33t77 132h28z" />
+<glyph unicode="&#x491;" horiz-adv-x="360" d="M457 590l-50 -175h-144q-23 0 -30 -25l-72 -262q-9 -31 -9 -51q0 -16 15 -16q21 0 64 61l14 20l22 -14q-48 -79 -85 -108t-83 -29q-68 0 -68 63q0 22 15 76l60 218q8 27 8 45q0 29 -46 29h-14v27h213q71 0 105 31.5t61 109.5h24z" />
+<glyph unicode="&#x1e80;" horiz-adv-x="889" d="M626 723h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33zM940 669v-24q-32 -5 -48 -19t-40 -63l-282 -581h-29l-59 489l-233 -489h-29l-78 572q-8 54 -19.5 68.5t-58.5 22.5v24h278v-25q-35 -4 -48 -15t-13 -35q0 -14 1 -19l40 -349l149 314 q0 60 -12.5 79.5t-57.5 25.5v24h267v-25q-39 -4 -50.5 -14.5t-11.5 -39.5q0 -5 7 -73l33 -291l155 327q15 33 15 46q0 27 -10.5 34.5t-52.5 10.5v25h187z" />
+<glyph unicode="&#x1e81;" horiz-adv-x="667" d="M387 462l31 -333q120 140 120 187q0 15 -20 38q-22 25 -22 48q0 29 16.5 44.5t40.5 15.5q25 0 43 -18.5t18 -43.5q0 -131 -272 -413h-27l-23 285q-85 -158 -114 -201l-56 -84h-27v46q0 4 0.5 24.5t0.5 37.5q0 94 -11.5 191.5t-26.5 110.5q-11 10 -43 10v27q110 18 156 28 q33 -123 33 -274l156 274h27zM476 516h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33z" />
+<glyph unicode="&#x1e82;" horiz-adv-x="889" d="M440 723l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM940 669v-24q-32 -5 -48 -19t-40 -63l-282 -581h-29l-59 489l-233 -489h-29l-78 572q-8 54 -19.5 68.5t-58.5 22.5v24h278v-25q-35 -4 -48 -15t-13 -35q0 -14 1 -19l40 -349 l149 314q0 60 -12.5 79.5t-57.5 25.5v24h267v-25q-39 -4 -50.5 -14.5t-11.5 -39.5q0 -5 7 -73l33 -291l155 327q15 33 15 46q0 27 -10.5 34.5t-52.5 10.5v25h187z" />
+<glyph unicode="&#x1e83;" horiz-adv-x="667" d="M250 516l122 131q47 50 70 50q20 0 34 -14t14 -33q0 -14 -8.5 -24t-30.5 -23l-152 -87h-49zM387 462l31 -333q120 140 120 187q0 15 -20 38q-22 25 -22 48q0 29 16.5 44.5t40.5 15.5q25 0 43 -18.5t18 -43.5q0 -131 -272 -413h-27l-23 285q-85 -158 -114 -201l-56 -84 h-27v46q0 4 0.5 24.5t0.5 37.5q0 94 -11.5 191.5t-26.5 110.5q-11 10 -43 10v27q110 18 156 28q33 -123 33 -274l156 274h27z" />
+<glyph unicode="&#x1e84;" horiz-adv-x="889" d="M940 669v-24q-32 -5 -48 -19t-40 -63l-282 -581h-29l-59 489l-233 -489h-29l-78 572q-8 54 -19.5 68.5t-58.5 22.5v24h278v-25q-35 -4 -48 -15t-13 -35q0 -14 1 -19l40 -349l149 314q0 60 -12.5 79.5t-57.5 25.5v24h267v-25q-39 -4 -50.5 -14.5t-11.5 -39.5q0 -5 7 -73 l33 -291l155 327q15 33 15 46q0 27 -10.5 34.5t-52.5 10.5v25h187zM701 796q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM489 796q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19t-19.5 45q0 27 19 46.5t45 19.5 q27 0 46.5 -19.5t19.5 -46.5z" />
+<glyph unicode="&#x1e85;" horiz-adv-x="667" d="M329 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM541 589q0 -26 -19.5 -45t-46.5 -19q-25 0 -44.5 19.5t-19.5 44.5q0 27 19 46.5t45 19.5q27 0 46.5 -19.5t19.5 -46.5zM387 462l31 -333 q120 140 120 187q0 15 -20 38q-22 25 -22 48q0 29 16.5 44.5t40.5 15.5q25 0 43 -18.5t18 -43.5q0 -131 -272 -413h-27l-23 285q-85 -158 -114 -201l-56 -84h-27v46q0 4 0.5 24.5t0.5 37.5q0 94 -11.5 191.5t-26.5 110.5q-11 10 -43 10v27q110 18 156 28q33 -123 33 -274 l156 274h27z" />
+<glyph unicode="&#x1ef2;" horiz-adv-x="611" d="M496 723h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33zM659 669v-25q-27 -4 -46.5 -20t-45.5 -52l-189 -264l-52 -191q-10 -40 -10 -51q0 -22 17 -31.5t62 -9.5v-25h-323v25q52 5 72 18.5t32 59.5l57 208l-87 270q-12 35 -23.5 45t-51.5 18v25h285 v-25q-42 -2 -55.5 -9.5t-13.5 -29.5q0 -19 29 -110l46 -143l128 183q28 40 28 67q0 23 -13 32t-53 10v25h207z" />
+<glyph unicode="&#x1ef3;" horiz-adv-x="444" d="M239 110h2q52 99 69.5 141t17.5 66q0 13 -25 34q-31 25 -31 54q0 21 16 39t42 18q25 0 43.5 -19t18.5 -45q0 -76 -75.5 -227t-173.5 -270q-41 -50 -87.5 -78t-87.5 -28q-26 0 -44 17.5t-18 42.5q0 22 15.5 39t34.5 17q25 0 51 -18t43 -18q13 0 32 15t35 37q25 35 25 71 q0 50 -50 288q-21 94 -40 113q-8 8 -14.5 10t-25.5 2v27q86 8 150 24q43 -111 66 -274zM297 516h-46l-132 88q-34 23 -34 48q0 18 13.5 31.5t31.5 13.5q31 0 56 -33z" />
+<glyph unicode="&#x2000;" horiz-adv-x="508" />
+<glyph unicode="&#x2001;" horiz-adv-x="1017" />
+<glyph unicode="&#x2002;" horiz-adv-x="508" />
+<glyph unicode="&#x2003;" horiz-adv-x="1017" />
+<glyph unicode="&#x2004;" horiz-adv-x="339" />
+<glyph unicode="&#x2005;" horiz-adv-x="254" />
+<glyph unicode="&#x2006;" horiz-adv-x="169" />
+<glyph unicode="&#x2007;" horiz-adv-x="169" />
+<glyph unicode="&#x2008;" horiz-adv-x="127" />
+<glyph unicode="&#x2009;" horiz-adv-x="203" />
+<glyph unicode="&#x200a;" horiz-adv-x="56" />
+<glyph unicode="&#x2010;" horiz-adv-x="333" d="M273 282l-30 -116h-247l34 116h243z" />
+<glyph unicode="&#x2011;" horiz-adv-x="333" d="M273 282l-30 -116h-247l34 116h243z" />
+<glyph unicode="&#x2012;" d="M477 282l-17 -116h-500l17 116h500z" />
+<glyph unicode="&#x2013;" d="M477 269l-17 -91h-500l17 91h500z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1000" d="M977 269l-17 -91h-1000l17 91h1000z" />
+<glyph unicode="&#x2018;" horiz-adv-x="333" d="M319 685l13 -25q-118 -63 -118 -116q0 -21 30 -37q40 -23 40 -65q0 -35 -20.5 -54t-52.5 -19q-39 0 -61 26t-22 68q0 67 51 125.5t140 96.5z" />
+<glyph unicode="&#x2019;" horiz-adv-x="333" d="M111 369l-13 25q118 63 118 116q0 21 -30 37q-40 23 -40 65q0 35 20.5 54t52.5 19q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x201a;" horiz-adv-x="333" d="M8 -182l-13 25q118 63 118 116q0 21 -30 37q-40 22 -40 65q0 32 21 52.5t52 20.5q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z" />
+<glyph unicode="&#x201b;" horiz-adv-x="333" d="M265 397l-18 -28q-119 67 -119 163q0 64 27 108.5t78 44.5q32 0 50.5 -19.5t18.5 -54.5q0 -59 -64 -70q-55 -10 -55 -42q0 -24 18 -45.5t64 -56.5z" />
+<glyph unicode="&#x201c;" d="M244 685l13 -25q-118 -63 -118 -116q0 -21 30 -37q40 -23 40 -65q0 -35 -20.5 -54t-52.5 -19q-39 0 -61 26t-22 68q0 67 51 125.5t140 96.5zM500 685l13 -25q-118 -63 -118 -116q0 -21 30 -37q40 -23 40 -65q0 -35 -20.5 -54t-52.5 -19q-39 0 -61 26t-22 68 q0 67 51 125.5t140 96.5z" />
+<glyph unicode="&#x201d;" d="M66 369l-13 25q118 63 118 116q0 21 -30 37q-40 23 -40 65q0 35 20.5 54t52.5 19q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5zM322 369l-13 25q118 63 118 116q0 21 -30 37q-40 23 -40 65q0 35 20.5 54t52.5 19q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5z " />
+<glyph unicode="&#x201e;" d="M-44 -182l-13 25q118 63 118 116q0 21 -30 37q-40 22 -40 65q0 35 20.5 54t52.5 19q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5zM212 -182l-13 25q118 63 118 116q0 21 -30 37q-40 22 -40 65q0 35 20.5 54t52.5 19q39 0 61 -26t22 -68q0 -67 -51 -125.5t-140 -96.5 z" />
+<glyph unicode="&#x201f;" d="M476 397l-18 -28q-119 67 -119 163q0 64 27 108.5t78 44.5q32 0 50.5 -19.5t18.5 -54.5q0 -59 -64 -70q-55 -10 -55 -42q0 -24 18 -45.5t64 -56.5zM229 397l-18 -28q-119 67 -119 163q0 64 27 108.5t78 44.5q32 0 50.5 -19.5t18.5 -54.5q0 -59 -64 -70q-55 -10 -55 -42 q0 -24 18 -45.5t64 -56.5z" />
+<glyph unicode="&#x2020;" d="M352 560l-15 -19q-18 -23 -29 -74q38 1 82 23q33 16 50 16q25 0 39.5 -14t14.5 -38q0 -23 -16 -37.5t-42 -14.5q-16 0 -46 17q-41 24 -76 24h-11q-6 -35 -6 -56q0 -52 26 -118q-59 -74 -109 -281q-13 -55 -35 -133h-23l28 173q13 80 13 172q0 37 -6 78q33 29 56.5 74 t30.5 91q-27 -1 -38 -4t-37 -16q-35 -19 -61 -19q-23 0 -37 14t-14 37t14 37t38 14q21 0 56 -17q46 -22 83 -22q9 31 9 54q0 15 -9 45q-10 37 -10 58q0 29 15 45t41 16q24 0 40 -15.5t16 -38.5q0 -31 -32 -71z" />
+<glyph unicode="&#x2021;" d="M268 471h13q6 25 6 55q0 25 -8 58q-6 25 -6 42q0 59 54 59q23 0 38.5 -14.5t15.5 -36.5q0 -23 -28 -62q-22 -31 -30.5 -48t-19.5 -54q47 5 93 23q33 13 47 13q21 0 35.5 -13.5t14.5 -33.5q0 -22 -15.5 -37t-37.5 -15q-18 0 -51 16q-48 22 -89 25q-7 -27 -7 -68t4.5 -61 t19.5 -46q-37 -34 -55 -69t-36 -107q40 0 88 24q31 15 42 15h5q52 -2 52 -49q0 -22 -14.5 -35.5t-38.5 -13.5q-14 0 -49 16q-43 21 -77 21h-12q-6 -24 -6 -55q0 -28 8 -58q6 -21 6 -42q0 -59 -54 -59q-23 0 -38.5 14.5t-15.5 36.5q0 23 28 62q22 32 30.5 49t19.5 53 q-53 -5 -93 -23q-30 -13 -47 -13q-21 0 -35.5 13.5t-14.5 33.5q0 22 15 37t37 15q16 0 52 -16q45 -22 89 -25q7 28 7 70q0 39 -4.5 59t-19.5 46q37 34 55 69t36 107q-43 -1 -88 -24q-31 -15 -42 -15h-5q-52 2 -52 49q0 22 14.5 35.5t37.5 13.5q15 0 50 -16q43 -21 76 -21z " />
+<glyph unicode="&#x2022;" horiz-adv-x="560" d="M490 253q0 -87 -62 -149t-149 -62t-148 61.5t-61 149.5q0 85 61.5 147t147.5 62q92 0 151.5 -60.5t59.5 -148.5z" />
+<glyph unicode="&#x2026;" horiz-adv-x="1000" d="M188 61q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52zM520 61q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52zM852 61q0 -31 -21.5 -52.5t-53.5 -21.5q-31 0 -52 21t-21 53 t21.5 53t53.5 21q30 0 51.5 -22t21.5 -52z" />
+<glyph unicode="&#x202f;" horiz-adv-x="203" />
+<glyph unicode="&#x2030;" horiz-adv-x="1118" d="M707 214q0 -53 -19.5 -104t-53.5 -86q-39 -42 -99 -42q-57 0 -92.5 38.5t-35.5 99.5q0 85 58.5 149t136.5 64q49 0 77 -31.5t28 -87.5zM682 220q0 35 -17 57.5t-42 22.5q-31 0 -62 -46q-24 -36 -40 -87t-16 -91q0 -66 50 -66q44 0 79 51q48 74 48 159zM645 706l-438 -735 h-48l388 655q-56 -42 -113 -42q-28 0 -60 13q3 -29 3 -42q0 -53 -19.5 -105.5t-50.5 -83.5q-44 -44 -101 -44q-56 0 -91 39t-35 100q0 85 59 149t138 64q35 0 71 -29q38 -30 83 -30q49 0 88.5 21.5t77.5 69.5h48zM351 560q0 25 -6 35.5t-26 18.5q-11 5 -21 11q-14 9 -20 9 q-32 0 -67 -74.5t-35 -141.5q0 -66 50 -66q48 0 86.5 64t38.5 144zM1068 213q0 -52 -19.5 -103t-52.5 -86q-40 -42 -100 -42q-57 0 -92 37.5t-35 98.5q0 88 57.5 151.5t137.5 63.5q49 0 76.5 -32t27.5 -88zM1043 220q0 35 -17 57.5t-43 22.5q-30 0 -60 -45 q-23 -35 -39.5 -87.5t-16.5 -92.5q0 -65 49 -65q44 0 79 51q48 74 48 159z" />
+<glyph unicode="&#x2031;" horiz-adv-x="1480" d="M707 214q0 -53 -19.5 -104t-53.5 -86q-39 -42 -99 -42q-57 0 -92.5 38.5t-35.5 99.5q0 85 58.5 149t136.5 64q49 0 77 -31.5t28 -87.5zM682 220q0 35 -17 57.5t-42 22.5q-31 0 -62 -46q-24 -36 -40 -87t-16 -91q0 -66 50 -66q44 0 79 51q48 74 48 159zM645 706l-438 -735 h-48l388 655q-56 -42 -113 -42q-28 0 -60 13q3 -29 3 -42q0 -53 -19.5 -105.5t-50.5 -83.5q-44 -44 -101 -44q-56 0 -91 39t-35 100q0 85 59 149t138 64q35 0 71 -29q38 -30 83 -30q49 0 88.5 21.5t77.5 69.5h48zM351 560q0 25 -6 35.5t-26 18.5q-11 5 -21 11q-14 9 -20 9 q-32 0 -67 -74.5t-35 -141.5q0 -66 50 -66q48 0 86.5 64t38.5 144zM1430 213q0 -52 -19.5 -103t-52.5 -86q-40 -42 -100 -42q-57 0 -92 37.5t-35 98.5q0 88 57.5 151.5t137.5 63.5q49 0 76.5 -32t27.5 -88zM1405 220q0 35 -17 57.5t-43 22.5q-30 0 -60 -45 q-23 -35 -39.5 -87.5t-16.5 -92.5q0 -65 49 -65q44 0 79 51q48 74 48 159zM1068 213q0 -52 -19.5 -103t-52.5 -86q-40 -42 -100 -42q-57 0 -92 37.5t-35 98.5q0 88 57.5 151.5t137.5 63.5q49 0 76.5 -32t27.5 -88zM1044 220q0 35 -17 57.5t-42 22.5q-31 0 -62 -46 q-24 -36 -40 -87t-16 -91q0 -66 50 -66q44 0 79 51q48 74 48 159z" />
+<glyph unicode="&#x2039;" horiz-adv-x="333" d="M32 226l170 124q30 21 47 37q28 28 41 28q5 0 9 -3.5t4 -8.5q0 -30 -101 -134l-20 -23l-25 -26l40 -83q33 -69 33 -90q0 -15 -15 -15q-6 0 -15 10q-30 34 -168 175v9z" />
+<glyph unicode="&#x203a;" horiz-adv-x="333" d="M281 221l-170 -124q-31 -23 -47 -38q-28 -27 -41 -27t-13 12q0 30 101 134l45 49l-40 83q-33 67 -33 90q0 15 15 15q6 0 15 -10q47 -53 168 -175v-9z" />
+<glyph unicode="&#x203e;" d="M500 565h-500v72h500v-72z" />
+<glyph unicode="&#x2044;" horiz-adv-x="183" d="M345 688l-439 -700h-74l441 700h72z" />
+<glyph unicode="&#x205f;" horiz-adv-x="254" />
+<glyph unicode="&#x20a3;" horiz-adv-x="668" d="M661 669l-45 -190l-26 5q0 70 -21 101q-36 52 -150 52q-37 0 -49 -10t-21 -43l-54 -192h177l-12 -40h-175l-22 -78h177l-11 -40h-176l-37 -132q-6 -24 -6 -33q0 -23 15 -32.5t56 -11.5v-25h-294v25q39 1 55.5 20t28.5 65l34 124h-91l11 40h91l20 78h-93l12 40h93l48 178 q5 22 5 33q0 22 -16.5 30.5t-57.5 10.5v25h534z" />
+<glyph unicode="&#x20a4;" d="M45 400h105q23 89 41 126.5t57 80.5q65 76 153 76q47 0 78 -26t31 -65q0 -29 -17.5 -48.5t-43.5 -19.5q-23 0 -38 14.5t-15 36.5q0 10 4 34q3 11 3 19q0 9 -7 15t-17 6q-42 0 -60 -77l-39 -172h114l-10 -40h-115l-20 -88h134l-10 -40h-135q-18 -69 -33 -91l-11 -17 q82 -32 125 -32q36 0 54.5 13t35.5 50h25q-15 -75 -45 -114q-42 -53 -106 -53q-58 0 -127 61q-38 -60 -98 -60q-40 0 -65 24t-25 62q0 39 26.5 63t69.5 24q28 0 61 -14q3 32 7 84h-108l10 40h101q3 39 9 88h-109zM113 90q-33 30 -64 30q-23 0 -37 -13.5t-14 -36.5t15.5 -37 t40.5 -14q43 0 59 71z" />
+<glyph unicode="&#x20a7;" horiz-adv-x="1229" d="M1173 461l-23 -154l-27 2q-12 63 -33 91.5t-55 28.5q-24 0 -38.5 -14.5t-14.5 -38.5q0 -33 57 -99q80 -93 80 -162q0 -56 -43 -92t-105 -36q-35 0 -64 12q-21 8 -30 8q-20 0 -29 -20h-27l22 166l27 -3q17 -133 93 -133q29 0 44.5 14.5t15.5 39.5q0 41 -56 104 q-50 56 -65 87.5t-15 73.5q0 59 36.5 92.5t97.5 33.5q33 0 58 -12q21 -10 37 -10q11 0 16 4t12 17h29zM863 407h-83l-34 -119q-53 -185 -53 -209q0 -18 16 -18q25 0 76 80l23 -15q-49 -76 -86.5 -105.5t-83.5 -29.5q-67 0 -67 65q0 28 25 115l67 236h-52v35q62 21 103 55 t81 97h35l-39 -145h72v-42zM112 669h262q216 0 216 -155q0 -80 -59 -131q-75 -66 -201 -66q-27 0 -71 5l-54 -199q-11 -37 -11 -58q0 -20 15 -29t57 -11v-25h-294v25q40 6 55.5 20.5t28.5 61.5l117 426q13 46 13 74q0 15 -9 22.5t-32 10.5l-33 4v25zM330 584l-61 -229 q17 -3 32 -3q44 0 66 13.5t44 48.5q33 52 33 136q0 40 -21 63.5t-60 23.5q-6 0 -10 -1t-6.5 -2.5t-4.5 -6.5l-4 -9q-1 -4 -3.5 -15t-4.5 -19z" />
+<glyph unicode="&#x20ac;" horiz-adv-x="562" d="M546 630l-23 -149l-34 4q-11 166 -86 166q-43 0 -84 -43.5t-63.5 -94t-34.5 -97.5h251l-12 -40h-245q-12 -31 -17 -88h235l-12 -40h-230q-8 -34 -8 -75q0 -62 21.5 -105.5t68.5 -43.5q54 0 96.5 28.5t85.5 80.5l19 -10q-50 -69 -103 -104.5t-122 -35.5q-91 0 -136.5 65.5 t-45.5 158.5q0 15 2 41h-35l10 40h30q10 62 18 88h-41l13 40h37q34 108 116.5 186.5t183.5 78.5q81 0 145 -51z" />
+<glyph unicode="&#x20dd;" horiz-adv-x="0" d="M-249 760q138 0 254 -68t183.5 -184.5t67.5 -254.5t-67.5 -254.5t-183.5 -184.5t-254 -68t-254 68t-183 184.5t-67 254.5t67 254.5t183 184.5t254 68zM-249 672q-171 0 -293.5 -123.5t-122.5 -295.5q0 -171 122.5 -295t293.5 -124q83 0 160 33.5t133.5 90t90 134 t33.5 161.5q0 171 -123.5 295t-293.5 124z" />
+<glyph unicode="&#x2102;" horiz-adv-x="713" d="M704 545l-41 -45q-81 122 -210 122q-97 0 -134 -38l-137 -502q39 -33 134 -33q35 0 64.5 5.5t60 22t45.5 25.5t53 38l50 37l36 -44q-142 -147 -332 -147q-115 0 -186.5 69.5t-71.5 184.5q0 117 54.5 219t152.5 164t216 62q91 0 141.5 -30t104.5 -110zM128 116l118 438 q-68 -56 -108 -134t-40 -163q0 -72 30 -141z" />
+<glyph unicode="&#x2105;" horiz-adv-x="847" d="M795 232q0 -106 -79 -189q-56 -56 -134 -56q-56 0 -90.5 29t-34.5 83q0 113 77 190q58 58 140 58q55 0 88 -31.5t33 -83.5zM703 267q0 21 -9 33.5t-25 12.5q-23 0 -46 -24q-34 -38 -53.5 -99t-19.5 -120q0 -49 37 -49q34 0 55 37q61 106 61 209zM636 683l-435 -697h-58 l435 697h58zM295 444l23 -17q-31 -61 -87 -91q-24 -12 -63 -12q-53 0 -84.5 30t-31.5 84q0 100 79 182q63 63 138 63q35 0 60 -19t25 -48q0 -25 -15 -42.5t-37 -17.5q-17 0 -29.5 10t-12.5 27q0 12 8 23.5t8 19.5q0 13 -18 13q-40 0 -70 -56q-38 -71 -38 -146q0 -67 54 -67 q26 0 46 13.5t45 50.5z" />
+<glyph unicode="&#x210a;" horiz-adv-x="819" d="M771 449l-278 -518q25 -12 73 -12q56 0 110 35l20 -41q-60 -44 -141 -44q-49 0 -89 14q-90 -107 -238 -107q-60 0 -94 23t-34 54q0 32 29.5 58t70.5 42q39 15 121 15q25 0 75 -8l40 72h-3q-63 -43 -143 -43q-50 0 -83.5 30.5t-33.5 79.5q0 55 32 117q-42 -14 -82 -14 q-51 0 -96 23l12 43q38 -16 82 -16q81 0 150 58q60 65 142.5 108.5t143.5 43.5q60 0 88 -31h2l10 18h114zM591 375q0 37 -33 37q-75 0 -187 -162q-83 -119 -83 -176q0 -16 9.5 -25.5t20.5 -9.5q56 0 123 68t108.5 147t41.5 121zM369 -91q-30 9 -63 9q-43 -1 -74 -16t-32 -46 q0 -30 40 -30q74 0 129 83z" />
+<glyph unicode="&#x210b;" horiz-adv-x="1171" d="M816 658l-24 -19q-67 -53 -119.5 -115.5t-101.5 -158.5q62 15 89 27q110 145 223 226t194 81q77 0 77 -63q0 -78 -95.5 -141.5t-247.5 -106.5q-74 -104 -120.5 -191.5t-46.5 -127.5q0 -28 29 -28q46 0 146 124l42 -26q-52 -80 -111 -121q-53 -36 -104 -36 q-63 0 -92.5 31.5t-29.5 82.5q0 96 83 222q-13 -5 -41 -13.5t-32 -9.5q-68 -125 -167.5 -220.5t-197.5 -95.5q-104 0 -104 77q0 61 61 119q42 40 100 67t160 63q4 7 20 33t22 35l22 32q15 23 27 37l31 36q19 22 41 43.5t49 45.5v2q-39 0 -71.5 11.5t-51 26t-43 26 t-48.5 11.5q-39 0 -66.5 -30.5t-27.5 -68.5q0 -36 17.5 -54t42.5 -18q33 0 57 23l29 -35q-40 -43 -106 -43q-61 0 -96 36.5t-35 90.5q0 60 50 107t139 47q56 0 134 -25t116 -25q44 0 79 13q30 11 69 37zM875 473v-2q63 16 126.5 61t63.5 95q0 17 -18 17q-27 0 -78 -49 t-94 -122zM344 225l-1 2q-75 -24 -131 -75t-56 -98q0 -20 20 -20q29 0 78.5 58t89.5 133z" />
+<glyph unicode="&#x210d;" horiz-adv-x="773" d="M808 669l-180 -669h-209l81 300h-189l-81 -300h-209l180 669h209l-80 -299h189l80 299h209zM725 606h-77l-146 -543h77zM327 606h-77l-146 -543h77z" />
+<glyph unicode="&#x2110;" horiz-adv-x="997" d="M141 66v-1q10 -13 38 -22t49 -9q94 0 164.5 48.5t131.5 182.5q2 5 8 18t10 20q-49 17 -79 56q-37 45 -37 108q0 79 60 137q87 83 237 83q63 0 121 -9q45 21 81 21q23 0 37.5 -10t14.5 -25q0 -31 -25 -47t-68 -16q-16 0 -32 3q-17 -12 -32 -30t-29.5 -46t-24 -48 t-26.5 -60l-24 -57l1 -2q69 33 120 115l43 -26q-67 -128 -195 -154q-64 -134 -122 -187q-142 -130 -328 -130q-86 0 -137 36t-51 93q0 38 24.5 65.5t59.5 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5zM769 604v3q-130 0 -191 -47t-61 -119q0 -57 54 -83 q29 57 51.5 94t62 81t84.5 71z" />
+<glyph unicode="&#x2112;" horiz-adv-x="1036" d="M678 648l-22 -44q-72 40 -166 40q-80 0 -140.5 -37.5t-60.5 -103.5t64.5 -103.5t166.5 -37.5q25 0 44 2q45 91 83 148q45 65 117.5 116t140.5 51q56 0 83 -23.5t27 -63.5q0 -70 -94.5 -151.5t-225.5 -117.5q-95 -192 -254 -272v-2q44 -13 78 -13q151 0 278 141l36 -35 q-139 -163 -311 -163q-85 0 -168 29q-82 -25 -162 -25q-75 0 -108 17q-44 22 -44 61q0 38 44 62q39 21 100 21q35 0 71 -9.5t56 -18.5l57 -29q71 47 168 220h-28q-56 0 -108 10.5t-99 33t-75 63t-28 93.5q0 81 83 136.5t204 55.5q112 0 193 -51zM722 389l2 -1 q78 27 139 81.5t61 120.5q0 16 -10 25t-23 9q-43 0 -88 -69.5t-81 -165.5zM290 53v1q-53 35 -115 35q-14 0 -29 -5.5t-15 -16.5q0 -29 64 -29q45 0 95 15z" />
+<glyph unicode="&#x2113;" d="M43 429l26 38q28 -19 69 -35t59 -18q195 285 325 285q47 0 78.5 -21.5t31.5 -63.5q0 -56 -34.5 -107t-93.5 -87q-90 -56 -208 -65l-58 -100q-21 -36 -46 -94.5t-25 -91.5t25 -33q29 0 79.5 38t114.5 124l36 -27q-70 -99 -128.5 -142t-121.5 -43q-52 0 -82 31t-30 90 q0 97 103 255q-26 6 -64 27.5t-56 39.5zM333 421l1 -1q83 19 145.5 72t62.5 129q0 28 -25 28q-62 0 -184 -228z" />
+<glyph unicode="&#x2115;" horiz-adv-x="760" d="M783 669l-178 -669h-157l-225 485h-2l-129 -485h-65l178 669h155l227 -485h2l129 485h65zM562 86l-240 520h-70l-5 -21l241 -522h69z" />
+<glyph unicode="&#x2116;" horiz-adv-x="1055" d="M1031 374q0 -89 -60.5 -162.5t-147.5 -73.5q-52 0 -80.5 31.5t-28.5 84.5q0 66 49 138q64 91 159 91q50 0 79.5 -29.5t29.5 -79.5zM944 427q0 14 -8.5 22.5t-21.5 8.5q-24 0 -42 -29q-20 -33 -44 -113t-24 -117q0 -35 28 -35q8 0 16 3.5t14.5 10.5t12 14t11.5 19l9 20 q4 8 8 22t6 20t6 19t4 15q25 89 25 120zM961 76l-24 -82h-295l24 82h295zM552 288h2l73 251q40 136 132 136q34 0 58.5 -21.5t24.5 -55.5q0 -27 -18 -45.5t-45 -18.5q-18 0 -31.5 9.5t-19.5 21.5t-13.5 21.5t-13.5 9.5q-7 0 -13 -5.5t-11 -16t-8 -19t-6 -21t-4 -14.5 l-157 -535h-17l-21 87l-42 169l-48 191q-18 76 -17 76h-2l-110 -375q-19 -66 -49.5 -107t-86.5 -41q-34 0 -59.5 21t-25.5 54q0 27 18.5 45t45.5 18q18 0 31.5 -10t19.5 -21.5t13 -21.5t13 -10q21 0 47 92l127 427q-6 17 -9 24.5t-12 18t-24 14.5t-39 4l9 29h196z" />
+<glyph unicode="&#x2119;" horiz-adv-x="497" d="M198 669h329q84 0 136 -38t52 -119q0 -124 -77 -193t-202 -69h-142l-67 -250h-209zM652 501q0 29 -11.5 56.5t-35.5 34.5l-3 -12q-5 -20 -69 -257q52 6 85.5 64t33.5 114zM466 319l76 282q-17 5 -56 5h-96l-79 -293h99q29 0 56 6zM324 606h-77l-146 -543h77z" />
+<glyph unicode="&#x211a;" horiz-adv-x="754" d="M639 11l27 -47q-42 -38 -104 -38q-71 0 -124 81q-66 -21 -135 -21q-121 0 -194.5 67t-73.5 187q0 117 54.5 219t152.5 164t216 62q125 0 200.5 -65.5t75.5 -188.5q0 -125 -61 -232t-169 -164q30 -46 67 -46q28 0 68 22zM637 537l-112 -417q70 45 108 125.5t38 168.5 q0 72 -34 123zM455 104l130 483q-55 35 -132 35q-81 0 -128 -23l-135 -506q42 39 74 55.5t80 16.5q63 0 111 -61zM134 132l113 424q-70 -47 -109.5 -129t-39.5 -170q0 -71 36 -125zM402 59q-33 43 -74 43q-49 0 -89 -43q42 -10 77 -10q39 0 86 10z" />
+<glyph unicode="&#x211b;" horiz-adv-x="1048" d="M934 175l39 -33q-58 -81 -110.5 -120.5t-113.5 -39.5q-57 0 -90 27t-33 67q0 37 42.5 101t42.5 90q0 24 -14 27q-22 0 -30 5q-87 -169 -192.5 -244.5t-234.5 -75.5q-85 0 -135 36.5t-50 93.5q0 38 23 65t58 27q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1 q25 -31 87 -31q85 0 139 49.5t137 198.5q70 128 122.5 202t118.5 126q-72 34 -151 34q-147 0 -246.5 -65t-99.5 -160q0 -43 27.5 -70.5t64.5 -27.5q75 0 113 66q31 52 35 133h50q0 -104 -52 -179t-159 -75q-71 0 -120.5 42.5t-49.5 114.5q0 65 46.5 125.5t128.5 99.5 q107 51 255 51q122 0 224 -45q44 25 98 44l19 -47q-30 -13 -55 -29q93 -61 93 -146q0 -67 -52 -111t-126 -50v-2q34 -34 34 -86q0 -27 -39 -83.5t-39 -75.5q0 -27 26 -27q52 0 159 134zM857 481q0 53 -43 88q-21 -21 -40 -50t-27 -44.5t-27 -58.5l-22 -49q33 0 62 -18 q38 7 67.5 47.5t29.5 84.5z" />
+<glyph unicode="&#x211d;" horiz-adv-x="727" d="M198 669h332q84 0 136 -38t52 -119q0 -83 -38.5 -146t-112.5 -93l96 -273h-212q-2 4 -19 49l-72 201h-66l-67 -250h-209zM607 593l-73 -271q57 12 89 64.5t32 114.5q0 66 -48 92zM469 319l75 282q-45 5 -55 5h-99l-79 -293h102q39 0 56 6zM574 63l-67 192q-26 -5 -80 -5 l68 -187h79zM324 606h-77l-146 -543h77z" />
+<glyph unicode="&#x2122;" horiz-adv-x="1000" d="M977 676v-23q-33 -2 -43.5 -11.5t-10.5 -36.5v-262q0 -32 7 -38.5t44 -9.5v-23h-194v23q37 3 43.5 9t6.5 39v226l-149 -298h-13l-142 296v-203q0 -41 9 -53.5t43 -15.5v-23h-133v23q33 3 42.5 15.5t9.5 53.5v237q-23 50 -70 52v23h139l142 -289l151 289h118zM386 588h-23 q-9 34 -24.5 49t-41.5 15h-46v-309q0 -32 7 -38.5t44 -9.5v-23h-194v23q37 3 43.5 9.5t6.5 38.5v309h-46q-26 0 -41 -14.5t-24 -49.5h-23v88h362v-88z" />
+<glyph unicode="&#x2124;" horiz-adv-x="807" d="M837 606l-528 -541v-2h394l-16 -63h-664v63l531 541v2h-346l16 63h613v-63zM753 606h-107l-538 -543h108z" />
+<glyph unicode="&#x212c;" horiz-adv-x="1060" d="M966 690l17 -45q-37 -15 -74 -39q76 -60 76 -131q0 -50 -36.5 -92t-102.5 -56v-2q46 -22 70 -58t24 -73q0 -45 -26.5 -92t-76.5 -80q-51 -35 -129 -35q-56 0 -83 30t-27 65q0 44 37.5 85t118.5 51l8 -50q-43 -4 -70 -27.5t-27 -56.5q0 -21 13 -31.5t32 -10.5 q44 0 72.5 48.5t28.5 107.5q0 72 -39 102q-22 -6 -54 -6q-5 0 -35 6q-168 -321 -443 -321q-86 0 -135.5 36t-49.5 93q0 38 23 65.5t58 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q25 -31 77 -31q83 0 150.5 52t150.5 196q74 130 129 199.5t136 120.5 q-69 42 -177 42q-92 0 -171.5 -25.5t-133.5 -81t-54 -130.5q0 -43 29 -70.5t71 -27.5q63 0 115.5 56.5t56.5 162.5h50q0 -107 -62.5 -190.5t-165.5 -83.5q-87 0 -133 42q-52 47 -52 118q0 74 49.5 134.5t128.5 98.5q108 52 263 52q154 0 252 -58q45 27 111 49zM871 480 q0 48 -26 77q-59 -58 -130 -189q49 -3 71 -14q38 7 61.5 44t23.5 82z" />
+<glyph unicode="&#x212f;" horiz-adv-x="726" d="M35 284l29 35q47 -55 133 -69q52 89 145.5 150.5t182.5 61.5q54 0 88.5 -23t34.5 -61q0 -42 -35 -78q-44 -47 -129.5 -75.5t-178.5 -30.5q-12 -11 -22 -41.5t-10 -58.5t14.5 -43t39.5 -15q52 0 131.5 54t135.5 122l32 -32q-88 -109 -189 -160q-68 -34 -135 -34 q-68 0 -106 33.5t-38 90.5q0 50 17 94q-91 20 -140 80zM330 244l1 -1q101 11 160 54.5t59 92.5q0 13 -8.5 20t-17.5 7q-81 0 -194 -173z" />
+<glyph unicode="&#x2130;" horiz-adv-x="826" d="M414 683l-14 -48q-30 9 -77 9q-62 0 -99.5 -26t-37.5 -69q0 -85 148 -96q15 93 119 163.5t208 70.5q130 0 130 -80q0 -64 -99 -129t-241 -80v-3q80 -10 80 -37q0 -18 -18.5 -29.5t-53.5 -11.5t-63 14q-72 -25 -114.5 -78.5t-42.5 -117.5q0 -45 31 -73t83 -28 q69 0 118.5 37.5t49.5 98.5q0 30 -18.5 47t-40.5 17q-94 0 -129 -128l-49 10q36 173 206 173q145 0 145 -116q0 -60 -53 -111q-42 -40 -106.5 -61.5t-127.5 -21.5q-103 0 -173 46.5t-70 130.5q0 77 62.5 136.5t176.5 87.5v2q-6 10 -7 16q-111 6 -176.5 47t-65.5 107 q0 61 60 104t156 43q65 0 103 -16zM456 455l2 -2q101 14 171.5 58t70.5 90q0 31 -45 31q-56 0 -118 -55.5t-81 -121.5z" />
+<glyph unicode="&#x2131;" horiz-adv-x="1042" d="M999 699l26 -42q-44 -38 -102.5 -62.5t-115.5 -24.5q-82 0 -196.5 37t-160.5 37q-86 0 -141.5 -43.5t-55.5 -108.5q0 -51 28.5 -76t63.5 -25q43 0 80.5 34t55.5 110l45 -9q-7 -85 -62 -137.5t-130 -52.5q-46 0 -89 22q-37 20 -60 56t-23 81q0 101 118 163q77 41 229 41 q56 0 175 -19t171 -19q29 0 71 10.5t73 27.5zM718 558l35 -36q-5 -5 -9 -10.5t-8 -13.5l-8 -12q-3 -5 -7 -14l-7 -16l-7 -18t-7.5 -19l-9.5 -23l-9 -26q68 13 134 13q40 56 79 56q22 0 35 -13t13 -31q0 -31 -26.5 -53t-73.5 -28q0 -49 8 -73l-70 -26q-4 15 -4 34q0 20 6 50 q-68 0 -133 -14q-42 -105 -110.5 -176t-142 -100.5t-153.5 -29.5q-85 0 -131.5 35.5t-46.5 93.5q0 38 24.5 65.5t59.5 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q23 -31 80 -31q73 0 128 48.5t102 137.5l4 8q-91 -43 -140 -85l-35 36q92 87 227 144 q58 102 100 150.5t93 84.5z" />
+<glyph unicode="&#x2133;" horiz-adv-x="1300" d="M1234 691l11 -17q-142 -219 -228.5 -388t-86.5 -218q0 -27 26 -27q47 0 167 133l37 -34q-66 -79 -120 -118.5t-112 -39.5q-119 0 -119 95q0 161 284 539l-2 1q-68 -47 -133.5 -132.5t-155.5 -246.5l-46 -81q-14 -24 -36.5 -56t-41.5 -51q-56 -54 -124 -54q-33 0 -57 21.5 t-24 54.5q0 51 35 121q88 178 259 414l-1 1q-70 -49 -125.5 -118t-127.5 -188q-7 -11 -25 -42l-24 -40l-22 -36l-23 -36q-7 -11 -20 -29.5l-21 -29.5l-20 -24q-10 -13 -20 -23q-61 -63 -137 -63q-63 0 -102 31.5t-39 86.5q0 38 24.5 64.5t59.5 26.5q31 0 50.5 -21.5 t19.5 -48.5q0 -25 -16 -44.5t-47 -19.5v-1q14 -19 61 -19t86 45t124 184q136 224 231 317q119 119 235 119q20 0 37 -8l10 -17q-99 -137 -191.5 -294t-130.5 -243q-19 -42 -19 -60q0 -14 11 -14q42 0 145 194q116 217 231 334q106 108 201 108q38 0 52 -8z" />
+<glyph unicode="&#x2134;" horiz-adv-x="848" d="M757 232l23 -39q-46 -31 -99 -31q-36 0 -63 9q-62 -99 -143 -148q-61 -37 -131 -37q-65 0 -104 31.5t-39 92.5q0 54 24 113q-43 -20 -96 -20q-51 0 -94 22l12 43q36 -15 80 -15q97 0 163 71q64 69 137 104q71 34 148 34q51 0 79 -28.5t28 -79.5q0 -67 -35 -131 q12 -11 38 -11q17 0 25 0.5t20.5 5t26.5 14.5zM626 371q0 41 -47 41q-53 0 -116.5 -59.5t-105 -136t-41.5 -127.5q0 -53 46 -53q58 0 113 48t96 114q-30 27 -30 75q0 37 25 64.5t60 33.5z" />
+<glyph unicode="&#x213c;" horiz-adv-x="730" d="M715 386h-117l-67 -256q-11 -42 -11 -58q0 -13 6 -21q21 5 36 18q4 3 34 31q28 26 41 37l41 -45q-82 -78 -108 -90q-33 -15 -105 -15q-55 0 -91.5 30t-36.5 84q0 14 6 40l65 245h-77q-83 -315 -103 -386h-190l31 122l38 142l33 122h-108v63h683v-63zM535 386h-63 l-62 -234q-10 -35 -10 -46q0 -26 16.5 -41t43.5 -15l2 1q-5 13 -5 24q0 19 7 44zM267 386h-64l-85 -323h63z" />
+<glyph unicode="&#x213f;" horiz-adv-x="796" d="M821 669l-179 -669h-210l166 606h-188l-167 -606h-208l180 669h606zM739 606h-78l-147 -543h80zM341 606h-78l-147 -543h80z" />
+<glyph unicode="&#x2145;" horiz-adv-x="748" d="M198 669h289q111 0 178.5 -69t67.5 -180q0 -172 -114.5 -296t-284.5 -124h-316zM635 534l-111 -412q68 53 107 129t39 161q0 66 -35 122zM451 90l130 488q-46 28 -130 28h-15h-46l-146 -543h43h16q95 0 148 27zM324 606h-77l-146 -543h77z" />
+<glyph unicode="&#x2146;" horiz-adv-x="633" d="M698 699l-186 -699h-193l9 32h-1q-44 -45 -127 -45q-68 0 -111.5 46t-43.5 114q0 127 70 221t193 94q73 0 123 -42h1l75 279h191zM618 636h-64l-154 -573h64zM289 393l-91 -340q15 -3 30 -3q55 0 91.5 42.5t51.5 101.5q27 98 27 130q0 33 -18.5 54t-50.5 21q-28 0 -40 -6 zM138 70l83 309q-51 -28 -82 -90.5t-31 -123.5q0 -33 5.5 -51t24.5 -44z" />
+<glyph unicode="&#x2147;" horiz-adv-x="575" d="M451 131l36 -38q-67 -106 -239 -106q-88 0 -145.5 48t-57.5 135q0 128 88 210t217 82q74 0 132 -42t58 -113q0 -30 -25 -114h-281l-35 -133q17 -10 56 -10q16 0 29.5 1t24 1t21.5 3.5t17.5 4.5t17 7t14.5 7.5t16 11t15.5 12t19.5 16.5zM406 256h60q11 31 11 52 q0 38 -40 64zM342 256l36 135q-15 8 -37 8q-43 0 -55 -14l-35 -129h91zM218 372q-48 -31 -79 -88t-31 -114q0 -48 31 -93z" />
+<glyph unicode="&#x2148;" horiz-adv-x="379" d="M413 669l-49 -180h-193l50 180h192zM332 606h-64l-16 -54h64zM354 449l-121 -449h-193l122 449h192zM273 386h-64l-88 -323h64z" />
+<glyph unicode="&#x2149;" horiz-adv-x="421" d="M455 669l-49 -180h-193l50 180h192zM374 606h-64l-16 -54h64zM398 449l-123 -458q-25 -92 -103.5 -144t-177.5 -52q-42 0 -87 18l32 57q23 -12 74 -12q24 0 35 4l157 587h193zM318 386h-67l-138 -514q77 37 99 118z" />
+<glyph unicode="&#x2202;" horiz-adv-x="559" d="M234 627l2 23q43 36 119 36q204 0 204 -256q0 -53 -12 -111.5t-39 -117.5t-64 -105.5t-92.5 -76t-120.5 -29.5q-89 0 -138 46.5t-49 129.5q0 119 89 206t209 87q41 0 80.5 -19t52.5 -51h4v8q2 18 2 27q0 48 -5.5 83.5t-21 69t-47.5 51t-80 17.5q-30 0 -93 -18zM423 293 q0 64 -25.5 95t-63.5 31q-64 0 -119 -88.5t-55 -176.5q0 -70 20.5 -97t67.5 -27q68 0 121.5 82.5t53.5 180.5z" />
+<glyph unicode="&#x2212;" horiz-adv-x="606" d="M555 209h-504v88h504v-88z" />
+<glyph unicode="&#x2423;" d="M460 -120h-420v151h42v-76h336v76h42v-151z" />
+<glyph unicode="&#x2460;" horiz-adv-x="695" d="M455 517l-88 -307q-6 -24 -6 -29q0 -13 63 -14v-26h-221v26q38 2 53 9.5t21 28.5l68 231q4 12 4 19q0 11 -30 11q-16 0 -40 -3v25q98 12 176 29zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252z M643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2461;" horiz-adv-x="695" d="M248 411l-18 10q45 96 139 96q49 0 79 -28t30 -69q0 -66 -87 -130l-105 -77h71q42 0 61 8.5t33 34.5h21l-51 -115h-234v23l54 50q88 82 119 118t31 66q0 58 -59 58q-49 0 -84 -45zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251 t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2462;" horiz-adv-x="695" d="M266 427l-20 10q55 80 133 80q40 0 69 -23.5t29 -56.5q0 -57 -61 -81q41 -28 41 -80q0 -59 -50.5 -100.5t-128.5 -41.5q-39 0 -63.5 14t-24.5 36q0 16 10 26t28 10q22 0 45 -31q17 -21 40 -21q27 0 46 23.5t19 54.5q0 35 -25 57q-24 20 -81 22v25q121 22 121 73 q0 44 -55 44q-40 0 -72 -40zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5 t85 216.5z" />
+<glyph unicode="&#x2463;" horiz-adv-x="695" d="M476 517l-66 -232h45l-19 -65h-44l-22 -80h-86l21 80h-154l20 68l261 229h44zM363 417l-153 -132h114zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5 q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2464;" horiz-adv-x="695" d="M489 517l-27 -72h-163l-14 -30q76 -12 111 -37q52 -37 52 -98q0 -62 -52 -104t-130 -42q-41 0 -66.5 14t-25.5 36q0 17 11 27t28 10q27 0 49 -32q13 -20 38 -20q30 0 54 23.5t24 53.5q0 52 -69 82q-27 12 -91 15l83 174h188zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2465;" horiz-adv-x="695" d="M483 517l8 -25q-109 -32 -165 -116q13 4 29 4q46 0 73.5 -26t27.5 -76q0 -64 -43.5 -104t-108.5 -40q-55 0 -85.5 32t-30.5 86q0 119 103 194q44 31 82.5 45t109.5 26zM372 311q0 19 -9.5 27t-32.5 8q-15 0 -21.5 -4t-11.5 -16q-33 -75 -33 -126q0 -36 34 -36q25 0 37 18 q16 22 26.5 61t10.5 68zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z " />
+<glyph unicode="&#x2466;" horiz-adv-x="695" d="M522 517l-244 -383h-69l204 307h-74q-56 0 -75.5 -7.5t-37.5 -35.5h-23l59 119h260zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89 t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2467;" horiz-adv-x="695" d="M480 433q0 -32 -18.5 -52t-62.5 -36q52 -48 52 -97q0 -54 -39.5 -84.5t-102.5 -30.5q-55 0 -89.5 27t-34.5 69q0 37 24.5 61t77.5 42q-43 39 -43 82q0 47 34 75t85 28q45 0 81 -22t36 -62zM417 434q0 24 -14.5 38t-35.5 14q-23 0 -37 -11.5t-14 -31.5q0 -37 59 -76 q42 38 42 67zM377 218q0 23 -12 41.5t-53 52.5q-33 -20 -47.5 -39.5t-14.5 -47.5q0 -29 17 -45t45 -16t46.5 15t18.5 39zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5 t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2468;" horiz-adv-x="695" d="M193 134l-8 25q111 30 164 115q-15 -3 -29 -3q-43 0 -72 27.5t-29 71.5q0 65 43.5 106t109.5 41q52 0 84.5 -32.5t32.5 -86.5q0 -64 -33 -118t-92 -90q-62 -38 -171 -56zM413 449q0 38 -31 38q-27 0 -46.5 -29.5t-26 -61.5t-6.5 -58q0 -33 42 -33q20 0 27 7.5t18 37.5 q23 65 23 99zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24b6;" horiz-adv-x="695" d="M548 141h-186v26q45 4 45 17q0 10 -2 16l-9 54h-127l-30 -50q-10 -15 -10 -23q0 -14 40 -14v-26h-122v26q17 2 27.5 10.5t23.5 28.5l210 318h16l69 -309q6 -29 15.5 -37.5t39.5 -10.5v-26zM389 288l-25 118l-74 -118h99zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24b7;" horiz-adv-x="695" d="M238 517h150q139 0 139 -88q0 -40 -20.5 -59t-62.5 -31q60 -23 60 -81t-42.5 -87.5t-119.5 -29.5h-172v26q21 3 31 11.5t15 29.5l58 238q5 22 5 28q0 17 -41 17v26zM336 356h9q47 0 71.5 17.5t25.5 60.5q1 53 -50 53q-14 0 -21 -5t-11 -23zM330 322l-29 -117 q-4 -20 -4 -22q0 -12 32 -12q41 0 63 27.5t22 70.5q0 34 -19 43t-65 10zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214 q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24b8;" horiz-adv-x="695" d="M548 524l-30 -139h-24q2 15 2 29q0 36 -22.5 57t-61.5 21q-72 0 -119 -69.5t-47 -148.5q0 -49 27.5 -73.5t73.5 -24.5q39 0 66 14.5t60 48.5l26 -16q-63 -89 -178 -89q-78 0 -124 39.5t-46 105.5q0 109 69 177t174 68q46 0 84 -11q18 -4 23 -4q13 0 24 15h23zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24b9;" horiz-adv-x="695" d="M211 517h163q80 0 127 -41t47 -112q0 -104 -67 -163.5t-173 -59.5h-162v26q21 3 30.5 11.5t14.5 29.5l56 229q6 25 6 37q0 16 -42 17v26zM340 471l-61 -252q-7 -26 -7 -35q0 -13 32 -13q79 0 119 63.5t40 151.5q0 101 -95 101q-24 0 -28 -16zM695 335q0 -150 -100 -252 t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24ba;" horiz-adv-x="695" d="M527 516l-23 -116h-16q-2 25 -3.5 34.5t-6.5 20t-15 16.5q-25 15 -73 15q-17 0 -24 -4.5t-10 -18.5l-25 -107q53 0 70 8.5t35 44.5h17l-37 -157h-18q2 12 2 24q0 28 -16 37t-62 9l-27 -120q-4 -12 -4 -18q0 -13 32 -13q69 0 113 32q29 23 47 55h18l-32 -117h-299v26 q22 4 30 11t13 28l55 234q5 22 5 36t-41 14v26h295zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88 q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24bb;" horiz-adv-x="695" d="M527 516l-22 -113h-17q-2 43 -13 56q-24 27 -84 27q-16 0 -22.5 -4.5t-9.5 -17.5l-27 -108q54 1 70.5 9t31.5 44h19l-37 -157h-18q2 12 2 25q0 27 -15.5 35.5t-60.5 9.5l-24 -105q-7 -30 -7 -32q0 -15 40 -18v-26h-163v26q23 3 31 10.5t13 27.5l56 240q5 20 5 31 q0 12 -41 14v26h293zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24bc;" horiz-adv-x="695" d="M548 334v-26q-23 -2 -31 -10.5t-15 -36.5l-23 -95l-15 -6q-65 -26 -138 -26q-79 0 -129.5 42.5t-50.5 113.5q0 101 71 167.5t171 66.5q35 0 74 -11q15 -5 20 -5q16 0 25 16h21l-28 -129h-19q-1 48 -20 72.5t-64 24.5q-70 0 -113 -69.5t-43 -145.5q0 -110 99 -110 q48 0 53 15l26 92q3 12 3 17q0 11 -45 17v26h171zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88 q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24bd;" horiz-adv-x="695" d="M564 516v-26q-16 0 -23.5 -8.5t-12.5 -28.5l-52 -217q-11 -44 -11 -52q0 -14 40 -17v-26h-163v26q23 3 31 10.5t14 32.5l27 112h-128l-23 -96q-9 -36 -9 -43q0 -15 40 -16v-26h-163v26q15 3 21 5t13 10t10 23l56 240q5 22 5 29q0 8 -7.5 11t-33.5 5v26h166v-26 q-23 -1 -31.5 -8.5t-12.5 -30.5l-24 -95h128l21 89q5 23 5 31q0 10 -41 14v26h158zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89 t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24be;" horiz-adv-x="695" d="M460 516v-26q-23 -1 -31 -8t-13 -30l-54 -226q-9 -38 -9 -42q0 -16 40 -17v-26h-163v26q26 3 33 13t14 39l52 220q6 24 6 36q0 8 -8 10t-33 5v26h166zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103 t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24bf;" horiz-adv-x="695" d="M491 516v-26q-23 -2 -30.5 -7.5t-12.5 -28.5l-52 -218q-24 -102 -119 -102q-39 0 -63.5 15t-24.5 41q0 17 10.5 28t25.5 11q17 0 28.5 -10.5t11.5 -27.5q0 -14 -12 -26q4 -2 13 -2q16 0 26 17t21 61l45 189q8 32 8 41q0 10 -6 13t-35 6v26h166zM695 335q0 -150 -100 -252 t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c0;" horiz-adv-x="695" d="M548 516v-26q-22 -3 -30 -6.5t-23 -17.5l-116 -105l93 -176q7 -14 38 -18v-26h-162v26q35 3 35 9q0 5 -9 23l-67 122l-26 -108q-1 -5 -2.5 -11.5t-2.5 -10t-1 -6.5q0 -16 40 -18v-26h-163v26q35 5 42 32l58 243q5 23 5 32q0 8 -7.5 11t-33.5 5v26h166v-26q-24 -1 -31 -8 t-12 -27l-27 -111l103 90q42 37 42 48q0 7 -33 8v26h124zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214 t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c1;" horiz-adv-x="695" d="M503 259l-27 -118h-287v26q17 1 27 9t12.5 15t6.5 24l55 233q4 16 4 28q0 4 -3.5 6.5t-9 4t-10.5 2t-11 1t-7 0.5v26h166v-26q-22 0 -30 -7.5t-12 -21.5l-58 -243q-8 -30 -8 -35q0 -12 45 -12q48 0 82 24q18 12 28.5 25t22.5 39h14zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c2;" horiz-adv-x="695" d="M578 516v-26q-23 0 -30.5 -7.5t-13.5 -30.5l-51 -215q-12 -46 -12 -50q0 -17 40 -20v-26h-163v26q23 2 31.5 12.5t14.5 34.5l52 220l-155 -299h-9l-31 299l-49 -191q-7 -28 -7 -45q0 -16 7.5 -22t30.5 -9v-26h-102v26q19 8 25.5 21t19.5 61l52 199q5 22 5 28 q0 9 -4.5 11.5t-26.5 2.5v26h92l26 -258l138 258h120zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214 t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c3;" horiz-adv-x="695" d="M532 517v-26q-22 -5 -31 -18.5t-18 -60.5l-57 -278h-18l-130 295l-40 -186q-7 -37 -7 -47q0 -14 8.5 -20t29.5 -8v-26h-104v26q20 4 26.5 15.5t18.5 64.5l48 215q-13 28 -34 28v26h92l109 -252l33 151q7 35 7 47q0 28 -39 28v26h106zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c4;" horiz-adv-x="695" d="M550 386q0 -97 -77.5 -174.5t-177.5 -77.5q-68 0 -110 37.5t-42 101.5q0 96 77 173.5t173 77.5q66 0 111.5 -38.5t45.5 -99.5zM455 429q0 64 -62 64q-48 0 -85 -47.5t-53.5 -104.5t-16.5 -105q0 -34 17 -52.5t46 -18.5q49 0 86 50t52.5 108.5t15.5 105.5zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c5;" horiz-adv-x="695" d="M238 516h160q129 0 129 -92q0 -58 -43.5 -84.5t-109.5 -26.5q-27 0 -47 2l-24 -102q-6 -24 -6 -28q0 -15 40 -18v-26h-163v26q23 4 31.5 11.5t13.5 31.5l53 226q7 28 7 39q0 12 -41 15v26zM361 457l-26 -111q9 -1 22 -1q82 0 84 98q0 43 -49 43q-14 0 -20.5 -6.5 t-10.5 -22.5zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c6;" horiz-adv-x="695" d="M150 133l95 77q-46 10 -76 44.5t-30 82.5q0 102 72 180t170 78q63 0 108 -38.5t45 -98.5q0 -95 -73.5 -174t-169.5 -79h-10l-14 -14q51 -4 99 -19q25 -8 49 -8q27 0 45.5 8.5t42.5 32.5l17 -15q-35 -49 -68.5 -68.5t-81.5 -19.5q-34 0 -81 14q-37 11 -59 11 q-28 0 -64 -15zM439 502q0 28 -16.5 45t-42.5 17q-36 0 -65.5 -29.5t-46 -72.5t-25.5 -86t-9 -76q0 -31 16 -47.5t43 -16.5q37 0 66.5 30t46 74.5t25 87t8.5 74.5zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101 q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c7;" horiz-adv-x="695" d="M528 141h-113l-68 179h-19l-21 -91l-10 -45q0 -14 40 -17v-26h-163v26q22 3 31 11.5t15 34.5l54 231q5 22 5 29q0 9 -7 12t-34 5v26h160q129 0 129 -95q0 -76 -98 -94l49 -129q7 -17 16 -23t34 -8v-26zM336 350h12q93 0 93 88q0 48 -47 48q-26 0 -32 -25zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c8;" horiz-adv-x="695" d="M490 524l-22 -121h-15q-5 42 -15 58q-18 31 -65 31q-22 0 -34.5 -12.5t-12.5 -34.5q0 -21 12.5 -35t44.5 -35q50 -34 71.5 -61t21.5 -66q0 -53 -42 -83.5t-95 -30.5q-36 0 -75 13q-16 6 -26 6q-13 0 -21 -19h-20l18 133h17q5 -45 31 -73t66 -28q27 0 44 14.5t17 43.5 q0 22 -15 38.5t-52 41.5q-79 51 -79 112q0 49 35 78.5t84 29.5q34 0 60 -10q16 -6 23 -6q15 0 24 16h20zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5 q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24c9;" horiz-adv-x="695" d="M527 516l-19 -109h-20q-1 45 -19 61t-62 16l-58 -242q-13 -54 -13 -58q0 -17 51 -17v-26h-183v26q44 0 52 35l67 282q-45 -1 -70 -18t-46 -59h-17l22 109h315zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101 q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24ca;" horiz-adv-x="695" d="M547 516v-26q-24 -5 -32 -15t-19 -58l-31 -126q-21 -84 -52.5 -120.5t-103.5 -36.5q-55 0 -91.5 25.5t-36.5 72.5q0 20 6 45l35 145q10 40 10 52q0 8 -7.5 11t-33.5 5v26h166v-26q-16 0 -25 -5t-12 -11t-6 -18l-40 -163q-12 -46 -12 -66q0 -50 66 -50q28 0 47 9.5t31 31 t17.5 38t13.5 48.5l27 113q8 37 8 49q-2 24 -44 24v26h119zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214 t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24cb;" horiz-adv-x="695" d="M527 517v-26q-23 -4 -33 -20l-203 -330h-17l-52 277q-10 50 -18 61.5t-34 11.5v26h164v-26q-26 -2 -33 -4t-7 -9q0 -3 0.5 -10t0.5 -8l35 -200l93 154q32 52 32 64q0 11 -36 13v26h108zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5 q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24cc;" horiz-adv-x="695" d="M566 517v-26q-18 -3 -25.5 -9.5t-16.5 -28.5l-132 -312h-14l-38 258l-107 -258h-14l-49 308q-4 24 -10 30.5t-30 11.5v26h140v-26q-29 -4 -29 -17q0 -7 3 -28l23 -163l66 162q-1 26 -8 34.5t-29 11.5v26h135v-26q-18 -1 -24 -5t-6 -13q0 -7 5 -42l21 -148l68 168 q7 16 7 23q0 10 -5.5 12.5t-26.5 4.5v26h96zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88 q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24cd;" horiz-adv-x="695" d="M527 516v-26q-15 -2 -25 -8.5t-25 -23.5l-95 -110l41 -122q11 -33 22 -44t39 -15v-26h-160v26q34 4 34 14q0 17 -22 75l-11 28l-61 -77q-15 -19 -15 -24q0 -12 33 -16v-26h-112v26q19 4 33.5 18t52.5 60l59 71l-45 142q-6 18 -15 23.5t-34 8.5v26h159v-26l-16 -2 q-22 -3 -22 -11q0 -7 4 -19l25 -77l45 53q34 40 34 47q0 5 -29 9v26h106zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214 q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24ce;" horiz-adv-x="695" d="M527 517v-26q-18 -2 -29 -10.5t-25 -26.5l-107 -143l-28 -103q-5 -17 -5 -24q0 -17 49 -17v-26h-197v26q31 3 43 10t17 28l28 110l-57 146q-11 30 -46 30v26h175v-26q-14 -1 -20.5 -1.5t-12 -2t-7 -3.5t-1.5 -6q0 -14 19 -60l30 -74l71 98q16 23 16 32t-8.5 12t-32.5 5 v26h128zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24cf;" horiz-adv-x="695" d="M527 490l-244 -317h36q79 0 119 26q35 21 58 60h22l-37 -118h-312v26l244 317h-40q-50 0 -82.5 -16.5t-66.5 -60.5h-21l36 109h288v-26zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338 q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d0;" horiz-adv-x="695" d="M485 290l22 -12q-59 -80 -109 -80q-41 0 -41 45q0 8 1 14q-45 -59 -98 -59q-33 0 -51.5 22t-18.5 58q0 66 54 125t117 59q38 0 50 -36h2l11 31l73 3l-49 -142q-16 -44 -16 -56q0 -8 6 -8q15 0 47 36zM395 405q0 17 -24 17q-38 0 -69.5 -55.5t-31.5 -90.5q0 -21 28 -21 q38 0 67.5 56.5t29.5 93.5zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5 z" />
+<glyph unicode="&#x24d1;" horiz-adv-x="695" d="M386 524l-52 -169q38 43 86 43q30 0 50 -22t20 -55q0 -75 -60.5 -131t-138.5 -56q-32 0 -57.5 11t-26.5 28q0 3 12 44l55 174q21 69 21 80t-28 11h-13v26q72 6 132 16zM410 318q0 32 -26 32q-36 0 -57 -41q-19 -38 -37 -96q-8 -24 -8 -41q0 -9 19 -9q45 0 77 54.5 t32 100.5zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d2;" horiz-adv-x="695" d="M433 291l20 -12q-43 -48 -66.5 -64.5t-64.5 -16.5q-46 0 -73.5 23.5t-27.5 65.5q0 68 55.5 121.5t123.5 53.5q29 0 50 -15.5t21 -39.5q0 -19 -11 -31t-29 -12q-16 0 -25.5 10t-9.5 25q0 14 13 30q-1 3 -16 3q-36 0 -64 -52t-28 -90q0 -46 51 -46q42 0 81 47zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d3;" horiz-adv-x="695" d="M519 524l-88 -294l-11 -42l6 -3q17 0 42 36l19 -10q-54 -77 -98 -77q-18 0 -30.5 11t-13.5 29q0 14 4 27q-45 -67 -100 -67q-31 0 -50.5 19t-19.5 55q0 63 52 126.5t114 63.5q27 0 48 -18l21 67q6 18 6 25q0 10 -26 10h-15v26q83 5 140 16zM384 344q0 19 -24 19 q-39 0 -70 -54.5t-31 -94.5q0 -13 7.5 -21t18.5 -8q30 0 53 36q16 25 31 65.5t15 57.5zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89 t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d4;" horiz-adv-x="695" d="M431 297l22 -13q-57 -86 -134 -86q-44 0 -68 22.5t-24 65.5q0 70 53 123t125 53q32 0 52 -16t20 -40q0 -28 -14.5 -47.5t-43.5 -31t-51 -17t-58 -11.5q-3 -5 -3 -16q0 -32 44 -32q42 0 80 46zM412 412q0 14 -19 14q-45 0 -75 -91q42 10 68 30.5t26 46.5zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d5;" horiz-adv-x="695" d="M291 435h44q18 60 47 92.5t84 32.5q28 0 46.5 -13t18.5 -34q0 -13 -9.5 -23t-23.5 -10q-13 0 -22.5 9.5t-9.5 22.5q0 12 8 20q-5 2 -9 2q-31 0 -51 -69l-9 -30h55l-8 -33h-52q-37 -158 -50 -194q-40 -113 -119 -113q-26 0 -45.5 13.5t-19.5 34.5q0 14 10.5 22.5t23.5 8.5 q12 0 21.5 -9t9.5 -22q0 -15 -9 -20q5 -1 10 -1q18 0 28 19t23 73l45 188h-44zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89 t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d6;" horiz-adv-x="695" d="M523 460h-43q3 -12 3 -19q0 -50 -45 -78t-99 -28q-6 0 -18.5 2t-16.5 2q-18 0 -18 -13q0 -10 37 -17q77 -14 107 -34.5t30 -50.5q0 -39 -43 -64.5t-116 -25.5q-130 0 -130 65q0 52 62 64q-17 12 -17 36q0 18 10.5 30t37.5 23q-41 20 -41 62q0 48 41.5 79t104.5 31 q44 0 77 -20h77v-44zM402 466q0 26 -31 26q-33 0 -50 -32t-17 -65q0 -29 29 -29q30 0 49.5 33.5t19.5 66.5zM386 199q0 13 -20 22.5t-50 16t-33 7.5q-13 -1 -33 -15.5t-20 -25.5q0 -16 22 -27t55 -11q35 0 57 10t22 23zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d7;" horiz-adv-x="695" d="M492 226l18 -11q-34 -47 -56.5 -64t-49.5 -17q-19 0 -31.5 11.5t-12.5 30.5t7 39l37 103q7 20 7 25q0 4 -12 4q-23 0 -60 -48q-23 -30 -37 -60t-37 -100h-79l90 302q7 26 7 29q0 11 -27 11h-15v27q64 4 133 16l-63 -220q45 56 70 74.5t56 18.5q49 0 49 -46q0 -16 -6 -34 l-35 -98q-10 -25 -10 -28q0 -7 9 -7q15 0 48 42zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88 q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d8;" horiz-adv-x="695" d="M427 474q0 -17 -12 -29.5t-29 -12.5q-18 0 -31 13t-13 30q0 18 11.5 30t30.5 12q18 0 30.5 -12.5t12.5 -30.5zM405 226l18 -10q-33 -47 -57 -64.5t-53 -17.5q-41 0 -42 40q0 14 9 42l32 109q4 13 4 24q0 8 -29 8h-10v27q84 6 130 15l-56 -186q-5 -15 -5 -21q0 -7 9 -7 q13 0 39 29zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24d9;" horiz-adv-x="695" d="M483 520q0 -17 -12 -29.5t-28 -12.5q-18 0 -31.5 13t-13.5 30t12.5 29.5t29.5 12.5q18 0 30.5 -13t12.5 -30zM464 450l-67 -236q-18 -63 -47 -91t-75 -28q-29 0 -49 12t-20 32q0 35 32 35q13 0 23 -9t10 -22q0 -10 -8 -18q7 -2 13 -2q25 0 43 65l49 178q6 20 6 32 q0 11 -24 11h-15v26q86 7 129 15zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5 t85 216.5z" />
+<glyph unicode="&#x24da;" horiz-adv-x="695" d="M507 390v-27q-24 -2 -39.5 -9t-45.5 -30l-38 -29q18 -68 29 -89.5t23 -21.5q18 0 40 34l18 -8q-41 -76 -90 -76q-29 0 -46.5 25t-35.5 94l-20 -12l-30 -103h-80l92 309q3 9 3 17v4q0 12 -18 12h-23v27q67 3 134 17l-72 -245q100 67 100 79q0 4 -33 5v27h132zM695 335 q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24db;" horiz-adv-x="695" d="M434 524l-86 -287q-1 -5 -5 -16t-6.5 -19t-2.5 -11q0 -7 10 -7q19 0 50 41l18 -10q-36 -48 -57.5 -64.5t-50.5 -16.5q-19 0 -32 11.5t-13 28.5q0 16 20 84l43 138q20 63 20 75q0 11 -28 11q-8 0 -14 -1v28q60 4 134 15zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24dc;" horiz-adv-x="695" d="M588 287l19 -9q-49 -80 -107 -80q-19 0 -30.5 11t-11.5 32t8 42l34 91q7 19 7 32q0 5 -14 5q-30 0 -71 -59q-17 -26 -27 -49t-36 -100h-80l51 142q18 51 18 60q0 6 -11 6q-17 0 -41 -24q-28 -28 -47.5 -67.5t-44.5 -116.5h-77l42 132q21 64 21 78q0 8 -24 8h-13v27 q83 5 130 14l-37 -102q40 53 60 69q38 33 74 33q43 0 43 -42q0 -15 -8 -41q25 38 56.5 60.5t63.5 22.5q23 0 35 -12t12 -31q0 -27 -13 -61l-25 -69q-11 -33 -11 -37q0 -5 11 -5q13 0 44 40zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5 q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24dd;" horiz-adv-x="695" d="M493 287l20 -9q-53 -80 -107 -80q-43 0 -43 40q0 19 6 37l37 101q9 24 9 28q0 7 -19 7q-17 0 -43 -26q-54 -59 -90 -182h-77l55 180q8 29 8 31q0 6 -37 7v27q60 2 129 14l-37 -103q51 62 73 80q28 23 65 23q48 0 48 -47q0 -16 -7 -36l-30 -83q-15 -41 -15 -46q0 -3 9 -3 q17 0 46 40zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24de;" horiz-adv-x="695" d="M490 375q0 -71 -53 -124t-124 -53q-48 0 -79 23t-31 64q0 76 53 126.5t126 50.5q50 0 79 -23.5t29 -63.5zM410 405q0 29 -30 29q-45 0 -71 -60.5t-26 -114.5q0 -33 32 -33q31 0 54 36.5t32 76t9 66.5zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5 q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24df;" horiz-adv-x="695" d="M380 524l-22 -59q46 59 98 59q36 0 56 -20.5t20 -57.5q0 -81 -55 -139.5t-125 -58.5q-24 0 -44 13l-19 -63q-2 -8 -2 -17q0 -7 8.5 -9t35.5 -3v-28h-167v28q24 0 32.5 7.5t16.5 36.5l59 210q13 42 13 51q0 6 -37 7v28q3 0 47 5zM447 446q0 25 -25 25q-54 0 -84 -97 q-22 -69 -22 -80q0 -5 7.5 -9.5t17.5 -4.5q32 0 58 34.5t37 71.5t11 60zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214 q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e0;" horiz-adv-x="695" d="M502 517l-81 -264q-21 -71 -21 -74q0 -10 44 -10v-28h-179v28q31 0 42 6.5t18 27.5l31 99q-35 -54 -93 -54q-34 0 -53 21.5t-19 58.5q0 67 58 131.5t118 64.5q27 0 37 -12q9 -10 14 -31l10 36h74zM403 466q0 21 -23 21q-41 0 -72.5 -59t-31.5 -99q0 -28 26 -28 q41 0 71 60.5t30 104.5zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z " />
+<glyph unicode="&#x24e1;" horiz-adv-x="695" d="M379 462l-33 -92q33 52 54.5 71.5t45.5 19.5q20 0 33 -13t13 -34q0 -19 -12 -32.5t-29 -13.5t-29.5 10t-15.5 10q-18 0 -44 -39q-18 -29 -43 -92l-23 -59h-84l62 185q5 14 5 26q0 9 -16 9h-24v28q70 3 140 16zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5 t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e2;" horiz-adv-x="695" d="M467 462l-15 -98h-18q-18 61 -64 61q-35 0 -35 -14q0 -13 41 -49q6 -6 22 -19.5t20 -18.5l12 -14q8 -9 10.5 -17.5t2.5 -19.5q0 -35 -31.5 -55t-75.5 -20q-29 0 -50 6q-15 5 -21 5q-15 0 -20 -11h-20l14 104h19q6 -33 26 -50t47 -17q37 0 37 18q0 13 -41 48 q-40 33 -52 48.5t-12 39.5q0 35 27.5 54t69.5 19q20 0 39 -6q12 -4 27 -4q12 0 19 10h22zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89 t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e3;" horiz-adv-x="695" d="M448 388h-67l-34 -117q-15 -53 -15 -69q0 -13 8 -13q21 0 57 47l21 -13q-45 -61 -61.5 -75t-48.5 -14q-51 0 -51 54q0 12 17 71l37 129h-31v41q45 12 71 32.5t58 62.5h12l-27 -92h54v-44zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5 q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e4;" horiz-adv-x="695" d="M481 291l25 -12q-59 -81 -114 -81q-42 0 -42 44q0 18 5 35q-42 -49 -62.5 -64t-48.5 -15q-56 0 -56 52q0 25 7 44l29 85q8 24 8 31q0 6 -40 7v28q35 1 142 17l-61 -169q-10 -26 -10 -32q0 -7 14 -7q21 0 45 26q31 32 49 65.5t41 109.5h79l-53 -149q-13 -39 -13 -44 q0 -8 10 -8q16 0 46 37zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z " />
+<glyph unicode="&#x24e5;" horiz-adv-x="695" d="M424 379l-14 14q-16 16 -16 33q0 16 10 26t25 10q19 0 32 -12.5t13 -29.5q0 -35 -37 -84q-25 -33 -54 -59.5t-94 -78.5h-16q4 38 4 57q0 135 -23 159q-4 7 -32 7v27q61 6 98 14q23 -57 27 -177q45 44 61 63.5t16 30.5zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e6;" horiz-adv-x="695" d="M391 462l26 -177q73 73 73 93q0 4 -13 16q-15 14 -15 31q0 18 11 27.5t27 9.5q17 0 29.5 -11t12.5 -28q0 -72 -173 -225h-17l-19 152l-25 -39q-39 -60 -44 -66l-37 -47h-20q2 20 2 55q0 49 -9 103.5t-20 61.5q-4 3 -27 3v27q34 4 99 14q23 -67 27 -146l97 146h15z M695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e7;" horiz-adv-x="695" d="M235 450l104 12q19 -22 34 -77q36 47 56.5 62t43.5 15q15 0 27 -11.5t12 -27.5q0 -14 -11 -23.5t-26 -9.5q-5 0 -16 5t-20 5q-24 0 -56 -47l22 -79q6 -22 24 -22q10 0 18 5.5t24 23.5l19 -9q-59 -74 -101 -74q-24 0 -38 18.5t-27 66.5l-19 -29q-22 -34 -38.5 -45 t-39.5 -11q-19 0 -30 10.5t-11 27.5q0 15 9.5 26t24.5 11q10 0 21 -6.5t19 -6.5q16 0 30 20l25 36l-20 76q-8 31 -36 31q-11 0 -24 -1v28zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338 q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e8;" horiz-adv-x="695" d="M400 363l8 -41q54 89 54 112q0 4 -20 16q-17 12 -17 36q0 14 10.5 26t28.5 12q17 0 29 -13t12 -30q0 -48 -47.5 -133.5t-110.5 -151.5q-58 -63 -118 -63q-18 0 -30.5 12t-12.5 29q0 15 10 27t25 12q20 0 36 -13q11 -9 26 -9q22 0 43 26q18 21 18 36q0 23 -38 163 q-14 50 -29 61q-7 5 -29 5v27q50 3 101 15q34 -70 51 -161zM695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214 t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24e9;" horiz-adv-x="695" d="M488 446l-179 -182q34 -17 52 -37q4 -4 12 -17.5t16 -22t19 -8.5q13 0 15 5q-15 10 -15 27q0 14 11.5 24t26.5 10q14 0 25 -10.5t11 -26.5q0 -29 -21 -43t-55 -14q-35 0 -89 30q-31 17 -51 17q-16 0 -33 -15l-25 17l188 194h-81q-38 0 -50 -33h-20l31 101h212v-16z M695 335q0 -150 -100 -252t-246 -102q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x24ea;" horiz-adv-x="695" d="M497 384q0 -92 -53.5 -171t-133.5 -79q-51 0 -81 36t-30 95q0 60 22 118.5t67.5 99.5t102.5 41q47 0 76.5 -38.5t29.5 -101.5zM423 459q0 37 -33 37t-62 -71.5t-42 -139t-13 -89.5q0 -16 9 -25t23 -9q32 0 60.5 62t43 130t14.5 105zM695 335q0 -150 -100 -252t-246 -102 q-149 0 -249 102.5t-100 254.5q0 150 101.5 251t252.5 101q143 0 242 -103t99 -252zM643 338q0 127 -85.5 213.5t-213.5 86.5q-121 0 -206.5 -89t-85.5 -214q0 -126 86 -214t210 -88q125 0 210 88.5t85 216.5z" />
+<glyph unicode="&#x2500;" horiz-adv-x="708" d="M719 267h-730v73h730v-73z" />
+<glyph unicode="&#x2502;" horiz-adv-x="696" d="M385 -303h-73v1213h73v-1213z" />
+<glyph unicode="&#x250c;" horiz-adv-x="708" d="M720 267h-329v-570h-73v643h402v-73z" />
+<glyph unicode="&#x2510;" horiz-adv-x="708" d="M390 -303h-73v570h-328v73h401v-643z" />
+<glyph unicode="&#x2514;" horiz-adv-x="708" d="M720 267h-402v643h73v-570h329v-73z" />
+<glyph unicode="&#x2518;" horiz-adv-x="708" d="M390 267h-401v73h328v570l73 -1v-642z" />
+<glyph unicode="&#x251c;" horiz-adv-x="708" d="M720 267h-329v-570h-73v1213h73v-570h329v-73z" />
+<glyph unicode="&#x2524;" horiz-adv-x="708" d="M390 -303h-73v570h-328v73h328v570h73v-1213z" />
+<glyph unicode="&#x252c;" horiz-adv-x="708" d="M719 267h-329v-570h-73v570h-328v73h730v-73z" />
+<glyph unicode="&#x2534;" horiz-adv-x="708" d="M719 267h-730v73h328v570h73v-570h329v-73z" />
+<glyph unicode="&#x253c;" horiz-adv-x="708" d="M719 267h-329v-570h-73v570h-328v73h328v570h73v-570h329v-73z" />
+<glyph unicode="&#x2550;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-730v73h730v-73z" />
+<glyph unicode="&#x2551;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM484 -303h-74v1213h74v-1213z" />
+<glyph unicode="&#x2552;" horiz-adv-x="708" d="M720 174h-329v-477h-73v736h402v-73h-329v-113h329v-73z" />
+<glyph unicode="&#x2553;" horiz-adv-x="708" d="M720 267h-236v-570h-74v562h-112v-562h-73v643h495v-73z" />
+<glyph unicode="&#x2554;" horiz-adv-x="708" d="M719 360h-421v-663h-73v736h494v-73zM719 174h-235v-477h-74v550h309v-73z" />
+<glyph unicode="&#x2555;" horiz-adv-x="708" d="M390 -303h-73v477h-328v73h328v113h-328v73h401v-736z" />
+<glyph unicode="&#x2556;" horiz-adv-x="708" d="M483 -303h-73v570h-112v-570h-74v570h-235v73h494v-643z" />
+<glyph unicode="&#x2557;" horiz-adv-x="708" d="M483 -303h-73v663h-421v73h494v-736zM298 -303h-74v477h-235v73h309v-550z" />
+<glyph unicode="&#x2558;" horiz-adv-x="708" d="M720 174h-402v736h73v-477h329v-73h-329v-113h329v-73z" />
+<glyph unicode="&#x2559;" horiz-adv-x="708" d="M720 267h-495v643h73v-570h112v570h74v-570h236v-73z" />
+<glyph unicode="&#x255a;" horiz-adv-x="708" d="M719 360h-309v550h74v-477h235v-73zM719 174h-494v736h73v-663h421v-73z" />
+<glyph unicode="&#x255b;" horiz-adv-x="708" d="M390 174h-401v73h328v113h-328v73h328v477h73v-736z" />
+<glyph unicode="&#x255c;" horiz-adv-x="708" d="M483 267h-494v73h235v570h74v-570h112v570h73v-643z" />
+<glyph unicode="&#x255d;" horiz-adv-x="708" d="M298 360h-309v73h235v477h74v-550zM483 174h-494v73h421v663h73v-736z" />
+<glyph unicode="&#x255e;" horiz-adv-x="708" d="M720 174h-329v-477h-73v1213h73v-477h329v-73h-329v-113h329v-73z" />
+<glyph unicode="&#x255f;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM720 267h-236v-570h-74v1213h74v-570h236v-73z" />
+<glyph unicode="&#x2560;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM720 360h-310v550h74v-477h236v-73zM720 174h-236v-477h-74v550h310v-73z" />
+<glyph unicode="&#x2561;" horiz-adv-x="708" d="M390 -303h-73v477h-328v73h328v113h-328v73h328v477h73v-1213z" />
+<glyph unicode="&#x2562;" horiz-adv-x="708" d="M483 -303h-73v1213h73v-1213zM298 -303h-74v570h-235v73h235v570h74v-1213z" />
+<glyph unicode="&#x2563;" horiz-adv-x="708" d="M483 -303h-73v1213h73v-1213zM298 360h-309v73h235v477h74v-550zM298 -303h-74v477h-235v73h309v-550z" />
+<glyph unicode="&#x2564;" horiz-adv-x="708" d="M719 360h-730v73h730v-73zM719 174h-329v-477h-73v477h-328v73h730v-73z" />
+<glyph unicode="&#x2565;" horiz-adv-x="708" d="M719 267h-236v-570h-73v562h-112v-562h-74v570h-235v73h730v-73z" />
+<glyph unicode="&#x2566;" horiz-adv-x="708" d="M719 360h-730v73h730v-73zM719 174h-236v-477h-73v550h309v-73zM298 -303h-74v477h-235v73h309v-550z" />
+<glyph unicode="&#x2567;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-730v73h328v477h73v-477h329v-73z" />
+<glyph unicode="&#x2568;" horiz-adv-x="708" d="M719 267h-730v73h235v570h74v-570h112v570h73v-570h236v-73z" />
+<glyph unicode="&#x2569;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-309v550h73v-477h236v-73zM298 360h-309v73h235v477h74v-550z" />
+<glyph unicode="&#x256a;" horiz-adv-x="708" d="M719 174h-329v-477h-73v477h-328v73h328v113h-328v73h328v477h73v-477h329v-73h-329v-113h329v-73z" />
+<glyph unicode="&#x256b;" horiz-adv-x="708" d="M719 267h-236v-570h-73v570h-112v-570h-74v570h-235v73h235v570h74v-570h112v570h73v-570h236v-73z" />
+<glyph unicode="&#x256c;" horiz-adv-x="708" d="M719 360h-309v550h74v-477h235v-73zM298 360h-309v73h235v477h74v-550zM719 174h-235v-477h-74v550h309v-73zM298 -303h-74v477h-235v73h309v-550z" />
+<glyph unicode="&#x1d468;" horiz-adv-x="759" d="M724 23l-2 -23h-319l4 23h31q51 0 51 45q0 22 -2 34l-15 108h-159l-80 -139q-6 -12 -6 -22q0 -26 22 -26h56l-6 -23h-260l4 23q37 4 60.5 19t47.5 56l346 587h49l94 -624q6 -38 47 -38h37zM466 256l-23 178l-103 -178h126z" />
+<glyph unicode="&#x1d469;" horiz-adv-x="726" d="M197 669h265q41 0 74.5 -3t68 -13t57.5 -26t38 -44t15 -66q0 -100 -100 -147q-27 -13 -64 -24q49 -9 89.5 -45.5t40.5 -87.5q0 -99 -73.5 -156t-225.5 -57h-340l4 23h40q42 0 58.5 14.5t24.5 47.5l116 502q2 8 2 22q-2 20 -13 28.5t-43 8.5h-37zM440 624l-58 -251 q12 -2 32 -2q24 0 40 4q54 12 81.5 52t27.5 98q0 22 -4.5 42t-22.5 38.5t-47 18.5h-49zM373 324l-64 -274q24 -5 52 -5q68 0 116.5 49t48.5 127q0 103 -122 103h-31z" />
+<glyph unicode="&#x1d46a;" horiz-adv-x="701" d="M745 685l-54 -234h-23q2 20 2 30q0 66 -40 111.5t-121 45.5q-87 0 -156.5 -58t-104.5 -142.5t-35 -174.5q0 -93 43.5 -155.5t129.5 -62.5q168 0 245 114l22 -15q-31 -50 -93 -96q-82 -60 -202 -60q-150 0 -226.5 78t-76.5 210q0 79 33 156.5t95 135.5q125 117 311 117 q33 0 93 -14t79 -14q40 0 57 28h22z" />
+<glyph unicode="&#x1d46b;" horiz-adv-x="818" d="M197 669h289q151 0 227.5 -78.5t76.5 -196.5q0 -76 -29.5 -150t-86.5 -129q-117 -115 -309 -115h-323l4 23h37q42 0 60 14t25 46l116 504q3 12 3 23q0 36 -57 36h-37zM440 624l-117 -508q-7 -28 -7 -32q1 -17 14.5 -26.5t27.5 -11t36 -1.5q65 0 113.5 32.5t75 86 t39.5 111t13 117.5q0 38 -6 75t-20.5 74t-43.5 60t-70 23h-55z" />
+<glyph unicode="&#x1d46c;" horiz-adv-x="732" d="M754 669l-40 -168h-23q3 17 3 38q0 34 -22.5 54t-46.5 25.5t-52 5.5h-135l-55 -239h55q34 0 57 5t46.5 27.5t33.5 62.5h22l-54 -251h-23q6 24 6 65q0 46 -85 46h-69l-58 -258q-2 -12 -2 -17q0 -20 42 -20h65q111 0 171 36.5t91 124.5h22l-61 -206h-600l4 23h36 q42 0 60 14.5t25 46.5l115 504q2 12 2 16q0 42 -59 42h-37l4 23h562z" />
+<glyph unicode="&#x1d46d;" horiz-adv-x="635" d="M750 669l-42 -168h-23q3 17 3 41q0 82 -123 82h-124l-56 -248h59q25 0 43.5 3t39 12t34.5 29.5t21 51.5h24l-57 -253h-23q7 37 7 66q0 46 -84 46h-75l-58 -249q-4 -12 -4 -24q0 -35 60 -35h52l-3 -23h-377l4 23h36q43 0 60.5 14.5t24.5 46.5l116 504q3 12 3 23 q0 35 -60 35h-37l4 23h555z" />
+<glyph unicode="&#x1d46e;" horiz-adv-x="768" d="M768 342l-5 -23h-24q-43 0 -61.5 -14t-27.5 -47l-59 -218q-108 -52 -234 -52q-147 0 -224.5 83.5t-77.5 206.5q0 77 31 151.5t90 131.5q127 124 334 124q46 0 90.5 -16.5t71.5 -16.5q13 0 33 8.5t24 24.5h23l-53 -224h-23q6 21 6 40q0 58 -47 98.5t-119 40.5 q-90 0 -161 -61.5t-106.5 -151.5t-35.5 -185q0 -35 7 -68.5t23 -66.5t48.5 -53.5t77.5 -20.5q47 0 78 20l57 208q4 12 4 24q-1 18 -12 26t-43 8h-35l5 23h345z" />
+<glyph unicode="&#x1d46f;" horiz-adv-x="891" d="M946 669l-5 -23h-37q-43 0 -60 -14t-24 -47l-114 -503q-6 -21 -6 -22v-3q1 -19 12.5 -26.5t45.5 -7.5h41l-5 -23h-349l4 23h23q43 0 61.5 14.5t25.5 46.5l57 251h-242l-59 -253q0 -3 -2 -10.5t-2 -12.5q2 -21 14 -28.5t46 -7.5h25l-5 -23h-349l4 23h36q43 0 61 14.5 t25 46.5l115 503q3 12 3 21q0 38 -57 38h-40l6 23h348l-3 -23h-25q-44 0 -61 -14t-24 -46l-46 -203h242l47 204q3 12 3 23q0 36 -60 36h-37l3 23h364z" />
+<glyph unicode="&#x1d470;" horiz-adv-x="502" d="M557 669l-4 -23h-38q-43 0 -60.5 -14.5t-24.5 -46.5l-116 -503q-1 -5 -1 -25q1 -18 13 -26t45 -8h37l-4 -23h-362l4 23h38q43 0 59 14t24 47l115 502q3 12 3 21q0 39 -57 39h-37l4 23h362z" />
+<glyph unicode="&#x1d471;" horiz-adv-x="558" d="M646 669l-3 -23h-37q-42 0 -61 -14.5t-26 -46.5l-96 -420q-22 -101 -95 -148q-43 -29 -118 -29q-59 0 -101.5 30t-42.5 71q0 31 20.5 54.5t64.5 23.5q31 0 56 -17.5t25 -40.5q0 -17 -13.5 -31.5t-13.5 -27.5q0 -18 19 -18q22 0 43 93l105 463q3 12 3 22q0 36 -56 36h-38 l3 23h362z" />
+<glyph unicode="&#x1d472;" horiz-adv-x="795" d="M839 669l-4 -23q-38 0 -65.5 -14.5t-69.5 -48.5l-248 -201l191 -284q33 -49 60 -62t75 -13l-4 -23h-328l4 23h29q29 0 29 22q0 18 -16 40l-138 208l-48 -211q-1 -5 -1 -21q1 -21 13 -29.5t45 -8.5h38l-5 -23h-354l5 23h30q44 0 59 14t23 47l115 503q4 16 4 23 q0 36 -58 36h-37l4 23h347l-6 -23h-27q-40 0 -56.5 -15.5t-24.5 -48.5l-40 -178h2l243 198q15 13 15 23q0 9 -8.5 15t-22.5 6h-24l4 23h250z" />
+<glyph unicode="&#x1d473;" horiz-adv-x="744" d="M700 199l-59 -199h-599l4 23h35q45 0 62 14t25 47l116 496q2 10 2 15q0 21 -15 36t-45 15h-36l4 23h360l-4 -23h-37q-38 0 -55.5 -16.5t-26.5 -53.5l-115 -492q-3 -15 -3 -16q1 -14 6 -18.5t15 -4.5h120q45 0 77.5 5.5t63.5 21.5t51 47.5t31 80.5z" />
+<glyph unicode="&#x1d474;" horiz-adv-x="1016" d="M1071 669l-3 -23h-34q-46 0 -63.5 -15.5t-25.5 -49.5l-115 -499q-3 -10 -3 -20q0 -39 59 -39h39l-4 -23h-362l4 23h35q44 0 60.5 14.5t24.5 46.5l82 354h-1l-283 -438h-56l-90 441l-80 -348q-3 -15 -3 -40q2 -17 12.5 -23.5t42.5 -6.5h38l-3 -23h-300l4 23h36 q43 0 61.5 17.5t26.5 54.5l111 486q4 12 4 33q0 17 -13.5 24.5t-44.5 7.5h-39l4 23h246l91 -468l297 468h245z" />
+<glyph unicode="&#x1d475;" horiz-adv-x="869" d="M924 669l-3 -23h-38q-43 0 -61.5 -15t-25.5 -49l-131 -582h-57l-263 491l-92 -409q-2 -12 -2 -18v-8q1 -18 12.5 -25.5t44.5 -7.5h39l-4 -23h-301l4 23h36q43 0 60.5 14.5t24.5 46.5l117 510q-21 52 -71 52h-38l3 23h232l222 -435l80 350q2 7 2 20q0 42 -57 42h-37l4 23 h300z" />
+<glyph unicode="&#x1d476;" horiz-adv-x="777" d="M755 432q0 -117 -58 -220.5t-157.5 -165.5t-213.5 -62q-128 0 -199.5 75t-71.5 188q0 107 51 206t151.5 165.5t225.5 66.5q127 0 199.5 -74.5t72.5 -178.5zM601 467q0 73 -32 122t-97 49t-118 -46.5t-83 -116t-45.5 -140t-15.5 -128.5q0 -75 31.5 -125.5t94.5 -50.5 q60 0 112 45.5t84 114t50.5 142t18.5 134.5z" />
+<glyph unicode="&#x1d477;" horiz-adv-x="612" d="M198 669h284q128 0 189.5 -38t61.5 -125q0 -83 -74 -144.5t-223 -61.5q-46 0 -67 3l-51 -221q-4 -20 -4 -24q2 -21 13.5 -28t46.5 -7h52l-4 -23h-380l4 23h40q43 0 60.5 14.5t24.5 46.5l115 504q3 12 3 21q-1 19 -14 28t-46 9h-37zM441 623l-61 -273q22 -5 40 -5 q69 0 113 49t44 127q0 44 -26 73.5t-80 29.5q-21 0 -30 -1z" />
+<glyph unicode="&#x1d478;" horiz-adv-x="810" d="M97 -112l159 101q-88 14 -144.5 82t-56.5 160q0 82 30 163t84 146t136 105t178 40q119 0 195 -70.5t77 -183.5q2 -175 -117 -305t-303 -144l-52 -30q8 1 23 1q35 0 119.5 -17t126.5 -17q86 0 145 68l17 -13q-100 -128 -258 -128q-67 0 -146 17q-118 26 -129 26 q-28 0 -72 -21zM601 479q0 78 -41 118.5t-88 40.5q-53 0 -98 -31.5t-74.5 -81t-50.5 -110.5t-30 -119.5t-9 -109.5q0 -56 30.5 -106t84.5 -50q65 0 119.5 45.5t87.5 115t51 145.5t18 143z" />
+<glyph unicode="&#x1d479;" horiz-adv-x="801" d="M784 23l-4 -23h-223l-154 317q-2 0 -5 0.5t-11 1t-19 0.5l-55 -237q-2 -10 -2 -22q2 -21 12.5 -29t43.5 -8h39l-4 -23h-360l4 23h36q45 0 60.5 14t23.5 47l114 500q4 20 4 27q0 35 -59 35h-37l4 23h284q122 0 178.5 -43.5t56.5 -111.5q0 -61 -46 -108.5t-126 -67.5 l115 -231q20 -41 48.5 -62.5t81.5 -21.5zM379 364h40q72 0 105.5 39.5t33.5 102.5q0 97 -72 114q-21 4 -34 4h-16z" />
+<glyph unicode="&#x1d47a;" horiz-adv-x="671" d="M704 682l-50 -219h-23q0 33 -1 50q-2 51 -50.5 88t-118.5 37q-35 0 -67.5 -21t-32.5 -63q0 -35 18 -66.5t38 -49.5t57 -46q126 -96 126 -210q0 -74 -70.5 -133t-186.5 -59q-79 0 -157 32q-27 9 -41 9q-15 0 -35 -9.5t-33 -29.5h-22l59 245h24v-35q0 -68 48 -115.5 t132 -47.5q67 0 101 33.5t34 85.5q0 70 -43 113q-16 16 -56 48t-66 56t-49 62.5t-23 78.5q0 73 60 121t177 48q52 0 111 -20t68 -20q15 0 30.5 10.5t19.5 26.5h22z" />
+<glyph unicode="&#x1d47b;" horiz-adv-x="568" d="M700 669l-44 -187h-24q7 21 7 54q0 88 -111 88h-78l-123 -541q-4 -24 -4 -25q1 -19 12.5 -27t44.5 -8h42l-3 -23h-368l4 23h40q43 0 60.5 14.5t24.5 46.5l124 540h-75q-74 0 -119 -37.5t-60 -104.5h-22l43 187h629z" />
+<glyph unicode="&#x1d47c;" horiz-adv-x="733" d="M810 669l-4 -23h-38q-44 0 -61.5 -13.5t-24.5 -46.5l-80 -359q-12 -51 -31 -92q-67 -145 -249 -145q-119 0 -179.5 57.5t-60.5 136.5q0 28 15 95l70 307q2 8 2 15q0 45 -60 45h-37l4 23h363l-4 -23h-39q-45 0 -60 -13t-23 -47l-83 -363q-7 -30 -7 -67q0 -45 34 -77.5 t93 -32.5q128 0 170 187l79 355q2 5 2 24q-1 19 -13 26.5t-44 7.5h-37l4 23h299z" />
+<glyph unicode="&#x1d47d;" horiz-adv-x="593" d="M797 669l-4 -23q-46 0 -75.5 -21t-56.5 -57l-431 -583h-52l-20 573q0 14 -1 20q-2 33 -14.5 50.5t-51.5 17.5h-25l3 23h326l-4 -23h-36q-49 0 -49 -69v-8l8 -350l242 336q33 46 33 71q0 11 -7 15.5t-27 4.5h-37l3 23h276z" />
+<glyph unicode="&#x1d47e;" horiz-adv-x="925" d="M1129 669l-3 -23q-33 0 -62 -15.5t-42.5 -30.5t-32.5 -41l-425 -576h-53l-21 407l-260 -407h-53l-21 575q-2 51 -15 69.5t-55 18.5h-20l3 23h314l-4 -23h-22q-29 0 -42.5 -17t-12.5 -61l8 -331l182 278l-3 65q-4 66 -59 66h-24l4 23h318l-4 -23h-37q-52 0 -50 -78l5 -354 l242 331q34 47 34 79q0 13 -7 17.5t-28 4.5h-37l3 23h280z" />
+<glyph unicode="&#x1d47f;" horiz-adv-x="808" d="M830 669l-3 -23h-24q-15 0 -28.5 -3.5t-21.5 -6t-19.5 -13t-15 -14t-16.5 -19t-15 -18.5l-177 -212l98 -270q13 -35 26 -51t36 -16h36l-4 -23h-316l3 23h28q49 0 49 36q0 15 -5 27l-63 171l-154 -179q-8 -9 -8 -22q0 -14 10.5 -23.5t28.5 -9.5h42l-4 -23h-285l4 23 q84 10 142 77l198 229l-89 237q-29 80 -84 80h-27l4 23h318l-4 -23h-39q-34 0 -34 -27q0 -8 8 -32l53 -155l137 162q10 12 10 27q0 25 -28 25h-31l4 23h260z" />
+<glyph unicode="&#x1d480;" horiz-adv-x="549" d="M725 669l-3 -23q-40 0 -67.5 -19t-57.5 -57l-197 -252l-56 -236l-2 -10q-1 -10 -1 -17q0 -32 58 -32h39l-4 -23h-362l4 23h37q43 0 59.5 14.5t24.5 46.5l56 243l-92 238q-17 43 -41.5 62t-80.5 19l3 23h331l-4 -23h-35q-43 0 -43 -28q0 -15 15 -54l63 -172l150 191 q11 14 11 37q0 26 -51 26h-28l4 23h270z" />
+<glyph unicode="&#x1d481;" horiz-adv-x="797" d="M830 669l-548 -623h194q32 0 55.5 2t52 10.5t49 23t38.5 41t28 64.5h23l-44 -187h-612l555 624h-177q-42 0 -68 -3t-60.5 -13.5t-60.5 -36.5t-43 -68h-23l46 166h595z" />
+<glyph unicode="&#x1d482;" horiz-adv-x="581" d="M529 105l19 -12q-29 -51 -65 -77t-90 -26q-29 0 -48.5 17t-20.5 53h-6q-67 -70 -146 -70q-57 0 -92.5 30.5t-35.5 91.5q0 53 21 113.5t57 113.5t90 88t113 35q38 0 60 -19.5t24 -44.5h2l11 51h115l-74 -316q-6 -21 -6 -45q0 -31 16 -31q9 0 19 7.5t16.5 15t20.5 25.5z M382 324q0 98 -54 98q-35 0 -74.5 -44t-66.5 -114.5t-27 -138.5q0 -65 45 -65q53 0 115 91t62 173z" />
+<glyph unicode="&#x1d483;" horiz-adv-x="509" d="M263 429l7 -1q47 31 93 31q124 0 124 -163q0 -49 -19 -101.5t-52.5 -98t-86.5 -75t-115 -29.5q-88 0 -164 55l127 563q2 10 2 14q0 17 -14 17q-15 0 -43 -7l-4 23l198 28zM219 253l-47 -203q2 -11 14 -17t23 -6q46 0 85 47.5t58 109.5t19 115q0 49 -14.5 72.5t-34.5 23.5 q-21 0 -39 -15t-30.5 -39t-20.5 -45.5t-13 -42.5z" />
+<glyph unicode="&#x1d484;" horiz-adv-x="477" d="M412 114l18 -8q-92 -116 -224 -116q-86 0 -124 47.5t-38 114.5q0 50 20.5 104t57 100.5t93.5 76t123 29.5q53 0 87.5 -24t34.5 -58q0 -30 -20 -52t-58 -22q-29 0 -40.5 14t-11.5 29q0 20 11.5 32t11.5 21q0 20 -15 20q-49 0 -92 -49.5t-64.5 -110t-21.5 -107.5 q0 -64 28.5 -92t72.5 -28q78 0 151 79z" />
+<glyph unicode="&#x1d485;" horiz-adv-x="595" d="M589 685l-130 -565q-8 -35 -8 -41q0 -24 24 -24q18 0 53 47l19 -11q-16 -40 -59.5 -72.5t-99.5 -32.5q-30 0 -48 21.5t-18 47.5h-5q-67 -69 -141 -69q-65 0 -98.5 34t-33.5 92q0 56 18 115.5t51.5 112t88 86t120.5 33.5q53 0 85 -21l37 152q4 14 4 26q0 22 -17 22 q-12 0 -42 -7l-4 23zM385 346q0 34 -18 53.5t-42 19.5q-59 0 -112.5 -95t-53.5 -202q0 -34 14.5 -50.5t33.5 -16.5q40 0 88.5 56t68.5 127q21 69 21 108z" />
+<glyph unicode="&#x1d486;" horiz-adv-x="498" d="M412 114l19 -7q-46 -57 -97.5 -87t-131.5 -30q-84 0 -121 47.5t-37 110.5q0 34 6 59q30 122 113.5 188.5t172.5 66.5q123 0 123 -84q0 -56 -51.5 -101.5t-116.5 -68t-127 -27.5q-4 -10 -4 -23q0 -59 28.5 -91t73.5 -32q41 0 72.5 17t77.5 62zM358 386q0 20 -7.5 28 t-26.5 8q-48 0 -97 -69t-56 -132q63 9 125 61.5t62 103.5z" />
+<glyph unicode="&#x1d487;" horiz-adv-x="572" d="M249 449h52q17 0 26.5 13t22 49t21.5 55q23 49 65.5 84t101.5 35q46 0 70 -23t24 -54q0 -29 -15.5 -51t-44.5 -22q-57 0 -57 49q0 20 10 31t10 20q0 7 -10 7q-22 0 -40.5 -36t-29.5 -92l-13 -65h80l-12 -47h-79l-88 -387q-11 -50 -38 -104q-25 -48 -67 -83t-100 -35 q-46 0 -70 23t-24 54q0 29 15.5 51t44.5 22q30 0 43.5 -15.5t13.5 -37.5q0 -20 -10 -29t-10 -18q0 -7 10 -7q13 0 25 16t22 47t16 55t13.5 62t9.5 45l78 341h-79z" />
+<glyph unicode="&#x1d488;" horiz-adv-x="527" d="M527 435l-14 -60h-77q13 -19 13 -48q0 -60 -40.5 -108t-113.5 -56q-74 -7 -74 -49q0 -17 36 -30t79.5 -22t79.5 -35.5t36 -67.5q0 -60 -59 -111t-170 -51q-100 0 -150.5 35.5t-50.5 82.5q0 39 33 69t86 49q-22 18 -22 51q0 29 22.5 54.5t56.5 32.5q-47 15 -70 47.5 t-23 67.5q0 69 53.5 122.5t138.5 53.5q31 0 58.5 -10t39.5 -21zM334 361q0 61 -32 61q-30 0 -54.5 -46.5t-24.5 -100.5q0 -80 35 -80t55.5 55.5t20.5 110.5zM346 -81q0 34 -23 51.5t-67 26.5q-42 7 -77 17l-17 -13q-14 -11 -26 -33t-12 -43q0 -40 29.5 -66t87.5 -26 q52 0 78.5 24.5t26.5 61.5z" />
+<glyph unicode="&#x1d489;" horiz-adv-x="576" d="M523 105l20 -11q-61 -104 -153 -104q-23 0 -46 12.5t-23 33.5q0 15 7 46l54 223q3 15 3 42q0 37 -29 37q-40 0 -93 -92.5t-73 -182.5l-25 -109h-115l138 599q2 8 2 15q0 9 -2 12t-9 3t-44 -10l-5 28l188 38l-81 -354l2 -1q27 50 78.5 89.5t101.5 39.5q89 0 89 -83 q0 -28 -7 -56l-50 -213q-2 -8 -2 -21q0 -28 20 -28q18 0 54 47z" />
+<glyph unicode="&#x1d48a;" horiz-adv-x="357" d="M300 558q0 -24 -19 -43t-47 -19q-27 0 -46.5 19.5t-19.5 42.5q0 22 19.5 42t46.5 20q28 0 47 -19.5t19 -42.5zM255 104l19 -12q-57 -101 -152 -101q-67 0 -67 56q0 16 4 31l66 285q5 22 5 27q0 18 -20 18q-21 0 -37 -3l-4 23l197 34l-78 -331q-8 -30 -8 -48 q0 -10 6 -17.5t15 -7.5q5 0 10 2t8.5 4.5t9 8t8.5 9t9 11.5t9 11z" />
+<glyph unicode="&#x1d48b;" horiz-adv-x="431" d="M414 558q0 -24 -19 -43t-47 -19q-27 0 -46.5 19.5t-19.5 42.5q0 22 19.5 42t46.5 20q28 0 47 -19.5t19 -42.5zM384 462l-102 -447q-10 -43 -36 -96q-26 -50 -69 -88t-101 -38q-46 0 -70 23t-24 54q0 29 15.5 51t44.5 22q26 0 41.5 -16t15.5 -37q0 -20 -10.5 -30 t-10.5 -15q0 -9 10 -9q37 0 73 160l84 368q3 14 3 25q0 18 -20 18q-21 0 -37 -3l-4 23z" />
+<glyph unicode="&#x1d48c;" horiz-adv-x="580" d="M563 449l-6 -19q-34 -4 -58.5 -14t-38 -20t-35.5 -32l-95 -94l64 -149q25 -57 40 -57q32 0 51 67h25q0 -15 -11.5 -46t-41.5 -63.5t-67 -32.5q-18 0 -30.5 4t-23 15.5t-14.5 16.5t-13.5 24t-10.5 22l-64 124l-24 -22l-39 -173h-116l138 601q2 6 2 16q0 13 -11 13 q-4 0 -44 -9l-5 27l193 37l-97 -423l124 111q7 6 15.5 19.5t8.5 23.5q0 12 -17 12h-30l7 21h224z" />
+<glyph unicode="&#x1d48d;" horiz-adv-x="346" d="M310 685l-132 -574q-4 -15 -4 -31q2 -14 18 -14q24 0 52 37l19 -15q-22 -35 -64.5 -66t-88.5 -31q-25 0 -42.5 12t-17.5 34t6 47l118 515q2 12 2 16q0 15 -11 15q-10 0 -44 -10l-5 28z" />
+<glyph unicode="&#x1d48e;" horiz-adv-x="760" d="M708 106l19 -15q-58 -100 -157 -100q-22 0 -41 13t-20 35q0 17 11 66l46 202q9 42 9 60q0 22 -16 22q-25 0 -81 -98t-67 -151l-29 -140h-119l73 307q8 36 8 60q-2 21 -18 21q-25 0 -78 -96.5t-66 -151.5l-32 -140h-117l89 388q0 26 -12 26q-9 0 -45 -9l-5 28l197 34 l-27 -111h2q77 106 153 106q37 0 56.5 -26t20.5 -59q0 -9 -2 -19q28 33 45 50.5t48.5 35.5t62.5 18q37 0 56 -21.5t19 -55.5q0 -33 -8 -68l-41 -186q-8 -37 -8 -46q0 -24 23 -24q21 0 51 45z" />
+<glyph unicode="&#x1d48f;" horiz-adv-x="559" d="M506 105l20 -11q-61 -104 -153 -104q-68 0 -68 58q0 10 6 34l54 223q3 15 3 47q0 35 -29 35q-40 0 -93 -94t-73 -184l-25 -109h-115l88 384q2 8 2 15q0 9 -2 12t-9 3q-14 0 -47 -9l-5 28l195 34l-27 -111h4q25 47 71.5 76.5t98.5 29.5q89 0 89 -81q0 -33 -7 -61l-50 -213 q-3 -18 -3 -22q0 -27 21 -27q18 0 54 47z" />
+<glyph unicode="&#x1d490;" horiz-adv-x="561" d="M539 297q0 -136 -90.5 -221.5t-217.5 -85.5q-88 0 -137.5 48.5t-49.5 131.5q0 126 87.5 209t207.5 83q91 0 145.5 -43t54.5 -122zM423 300q0 64 -25 93t-64 29q-64 0 -119 -88t-55 -176q0 -71 21 -99.5t67 -28.5q68 0 121.5 86t53.5 184z" />
+<glyph unicode="&#x1d491;" horiz-adv-x="571" d="M294 429h5q36 33 91 33q68 0 116 -41t48 -130q0 -121 -85.5 -212t-187.5 -91q-59 0 -88 19l-25 -105q-4 -16 -4 -32q0 -54 41 -54h36l-7 -21h-267l7 21q38 5 52.5 26t24.5 63l103 440q5 25 5 39q0 32 -23 32q-10 0 -25 -4l-6 17l198 40zM244 241l-33 -154q1 -31 20 -45 t47 -14q55 0 108.5 85.5t53.5 175.5q0 67 -19.5 95t-57.5 28t-71 -50.5t-48 -120.5z" />
+<glyph unicode="&#x1d492;" horiz-adv-x="526" d="M532 449l-129 -561q-5 -18 -5 -27q1 -45 32 -45h34l-6 -21h-288l6 21h36q35 0 50.5 19t23.5 53l38 168h-1q-27 -37 -72 -51.5t-81 -14.5q-58 0 -92 40t-34 96q0 78 32.5 154t98 129t147.5 53q65 0 85 -51h4l10 38h111zM388 345q0 37 -18.5 57t-42.5 20 q-66 0 -117.5 -96.5t-51.5 -208.5q0 -70 53 -70q55 0 116 94.5t61 203.5z" />
+<glyph unicode="&#x1d493;" horiz-adv-x="441" d="M257 467l-20 -91q57 86 125 86q29 0 45.5 -16.5t16.5 -38.5q0 -31 -21 -58.5t-60 -27.5q-18 0 -26.5 9.5t-12.5 19t-10 9.5q-27 0 -70.5 -112.5t-56.5 -166.5l-20 -80h-114l88 380q0 2 1.5 10t1.5 11q0 15 -16 15q-11 0 -41 -11l-3 28z" />
+<glyph unicode="&#x1d494;" horiz-adv-x="474" d="M419 462l-22 -160h-22q-1 52 -29 87.5t-59 35.5q-46 0 -46 -55q0 -8 3 -17t11.5 -21t14.5 -18l20 -24l19 -22q4 -4 15 -17.5t14.5 -17.5t12.5 -15.5t11.5 -17.5t8.5 -17t7 -19l4 -20q2 -12 2 -25q0 -53 -42 -91t-113 -38q-34 0 -67.5 10.5t-42.5 10.5q-17 0 -39 -22h-25 l22 165h24q1 -51 35 -89.5t71 -38.5q32 0 47.5 23t15.5 57q0 11 -2.5 21t-9 20t-10.5 15.5t-13.5 16t-11.5 12.5q-3 4 -15 17.5t-16 19.5l-15 18l-15 20l-12 18q-7 12 -10 21t-5.5 19.5t-2.5 20.5q0 56 39.5 86.5t90.5 30.5q33 0 61 -11t32 -11q29 0 39 22h25z" />
+<glyph unicode="&#x1d495;" horiz-adv-x="351" d="M318 460l-12 -47h-67l-69 -302q-3 -15 -3 -19q0 -32 20 -32q23 0 54 44l20 -10q-24 -45 -64.5 -74.5t-86.5 -29.5q-66 0 -66 61q0 18 4 33l76 329h-74l8 47q43 0 70.5 7t45.5 27.5t26.5 38t24.5 59.5h54l-29 -132h68z" />
+<glyph unicode="&#x1d496;" horiz-adv-x="535" d="M482 104l20 -10q-59 -104 -155 -104q-23 0 -44.5 12.5t-22.5 34.5q0 38 17 82h-3q-80 -129 -182 -129q-79 0 -79 82q0 27 7 57l54 237q3 16 3 25q0 21 -13 21q-9 0 -44 -7l-3 24l194 34l-79 -344q-6 -18 -6 -32q0 -22 21 -22q36 0 104 104.5t86 189.5l19 90h113l-78 -337 q-2 -10 -2 -19q0 -35 19 -35q20 0 54 46z" />
+<glyph unicode="&#x1d497;" horiz-adv-x="554" d="M60 412v24q79 3 229 37q-7 -22 -18 -63.5t-16 -57.5q-1 -2 -21.5 -69t-30.5 -108t-10 -66q0 -42 50 -42q46 0 115 77.5t83 129.5q5 18 5 34q0 25 -23.5 50.5t-23.5 54.5q0 24 19.5 42t43.5 18q31 0 54 -23t23 -54q0 -38 -38 -109q-40 -75 -99 -145t-124 -113 q-64 -43 -130 -43q-41 0 -68.5 20t-27.5 59t9.5 83.5t30.5 115.5l25 82q7 30 7 39q0 27 -64 27z" />
+<glyph unicode="&#x1d498;" horiz-adv-x="814" d="M565 462l-76 -279q-20 -71 -20 -87q0 -29 34 -29q37 0 81.5 43t77.5 91q44 61 44 106q0 29 -23.5 53t-23.5 54q0 24 19.5 41.5t43.5 17.5q31 0 54 -22.5t23 -53.5q0 -40 -38 -109q-40 -75 -100.5 -146.5t-123.5 -113.5t-129 -42q-42 0 -58 20t-16 63q0 19 24 91 q-98 -174 -214 -174q-41 0 -66.5 20.5t-25.5 60.5q0 49 17 110l37 134q18 63 18 76q0 26 -49 26h-15v24q118 8 230 36l-91 -312q-14 -51 -14 -68q0 -29 24 -29q30 0 64 38t54.5 75t35.5 73q26 61 64 212h138z" />
+<glyph unicode="&#x1d499;" horiz-adv-x="587" d="M327 334l22 34q61 94 122 94q33 0 52.5 -15.5t19.5 -34.5q0 -66 -62 -66q-17 0 -26 17t-14 17q-10 0 -16.5 -7.5t-21.5 -32.5l-47 -79l49 -138q1 -4 4 -13t5 -14.5t5.5 -12.5t8 -10.5t10.5 -3.5q16 0 28.5 12.5t26.5 55.5h24q-38 -145 -119 -145q-21 0 -37 7t-26.5 20.5 t-16 24.5t-12.5 29l-29 75l-36 -62q-56 -94 -130 -94q-36 0 -57 17.5t-21 42.5t15.5 41.5t44.5 16.5q20 0 28.5 -11t11 -22.5t9.5 -11.5q8 0 17 11.5t32 47.5l61 97l-33 91q-17 47 -35 69t-45 22q-14 0 -52 -15l-8 24l153 50q65 -38 89 -109z" />
+<glyph unicode="&#x1d49a;" horiz-adv-x="519" d="M330 128h1q30 44 61 102q46 85 46 107q0 10 -7 15.5t-16 9t-16 15t-7 31.5q0 16 18.5 35t41.5 19q70 0 70 -75q0 -51 -72.5 -186t-123.5 -211l-52 -76q-16 -23 -46.5 -57.5t-57.5 -48t-57 -13.5q-38 0 -57 18t-20 40q-1 25 12 45.5t48 20.5q18 0 28.5 -12.5t15 -24.5 t10.5 -12q10 0 41 41.5t45 76.5l-53 317q-4 26 -6.5 37.5t-8.5 31.5t-14.5 28.5t-20.5 8.5q-8 0 -51 -8l-4 24l170 33q18 -15 34 -58.5t22 -83.5z" />
+<glyph unicode="&#x1d49b;" horiz-adv-x="531" d="M499 452l-318 -337l1 -1q17 4 39 4q33 0 62.5 -27t49.5 -53.5t32 -26.5q18 0 18 19q0 7 -10 22.5t-10 29.5q0 24 16.5 41.5t40.5 17.5q25 0 43 -18t18 -43q0 -52 -39 -75.5t-96 -23.5q-34 0 -100 12t-100 12q-46 0 -93 -19l-18 25l321 340h-165q-35 0 -49 -9.5t-25 -41.5 l-24 3l46 159h360v-10z" />
+<glyph unicode="&#x1d4d0;" horiz-adv-x="984" d="M945 691l10 -17q-92 -178 -259 -569q41 12 80 33l21 -43q-41 -32 -127 -50l-18 -45h-147l18 41q-66 0 -135 29q-88 -91 -187 -91q-68 0 -109.5 37t-41.5 94q0 38 24.5 64.5t59.5 26.5q31 0 50.5 -21.5t19.5 -48.5q0 -23 -17 -41.5t-46 -23.5v-1q15 -31 61 -31 q62 0 131 64q-59 37 -95 90t-36 118q0 87 68.5 144.5t152.5 57.5q91 0 161 -68q74 113 131 165q103 94 183 94q18 0 47 -8zM809 610l-2 2q-48 -31 -88 -78t-100 -139q23 -40 30 -79h2q78 165 158 294zM596 222q0 58 -18 107q-6 -9 -22 -37l-26 -41l-25 -37q-16 -24 -34 -47 l-39 -48q57 -23 117 -23q24 48 45 97q2 9 2 29zM547 384q-51 64 -126 64q-50 0 -89 -38t-39 -97q0 -105 88 -166q68 78 166 237z" />
+<glyph unicode="&#x1d4d1;" horiz-adv-x="1060" d="M966 690l17 -45q-37 -15 -74 -39q76 -60 76 -131q0 -50 -36.5 -92t-102.5 -56v-2q46 -22 70 -58t24 -73q0 -45 -26.5 -92t-76.5 -80q-51 -35 -129 -35q-56 0 -83 30t-27 65q0 44 37.5 85t118.5 51l8 -50q-43 -4 -70 -27.5t-27 -56.5q0 -21 13 -31.5t32 -10.5 q44 0 72.5 48.5t28.5 107.5q0 72 -39 102q-22 -6 -54 -6q-5 0 -35 6q-168 -321 -443 -321q-86 0 -135.5 36t-49.5 93q0 38 23 65.5t58 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q25 -31 77 -31q83 0 150.5 52t150.5 196q74 130 129 199.5t136 120.5 q-69 42 -177 42q-92 0 -171.5 -25.5t-133.5 -81t-54 -130.5q0 -43 29 -70.5t71 -27.5q63 0 115.5 56.5t56.5 162.5h50q0 -107 -62.5 -190.5t-165.5 -83.5q-87 0 -133 42q-52 47 -52 118q0 74 49.5 134.5t128.5 98.5q108 52 263 52q154 0 252 -58q45 27 111 49zM871 480 q0 48 -26 77q-59 -58 -130 -189q49 -3 71 -14q38 7 61.5 44t23.5 82z" />
+<glyph unicode="&#x1d4d2;" horiz-adv-x="912" d="M487 668l-22 -45q-35 21 -111 21q-79 0 -141 -35t-62 -105q0 -53 35.5 -84.5t80.5 -35.5q82 120 225.5 211.5t255.5 91.5q129 0 129 -79q0 -61 -69 -128t-185.5 -113.5t-237.5 -47.5q-60 -91 -60 -179q0 -46 30.5 -76t76.5 -30q73 0 123 42t50 98q0 34 -18.5 52t-39.5 18 q-49 0 -81 -34.5t-44 -101.5l-50 8q10 83 64.5 133t137.5 50q67 0 106 -28.5t39 -81.5q0 -42 -28.5 -84.5t-74.5 -74.5q-74 -51 -198 -51q-98 0 -162.5 48.5t-64.5 132.5q0 86 44 167q-75 17 -125 61.5t-50 113.5q0 79 79.5 138t207.5 59q83 0 140 -31zM414 375l1 -1 q64 1 150 31.5t153.5 83.5t67.5 106q0 37 -46 37q-66 0 -162.5 -75t-163.5 -182z" />
+<glyph unicode="&#x1d4d3;" horiz-adv-x="991" d="M889 613l17 -47q-36 -15 -69 -48q61 -96 61 -194q0 -144 -108 -244.5t-247 -100.5q-89 0 -169 28q-74 -24 -158 -24q-72 0 -107 15q-49 20 -49 63q0 42 51 65q36 16 91 16q36 0 73 -10t56 -19l57 -28q32 24 69.5 73t99.5 148l53 82q20 28 54 66t75 71q-44 58 -115.5 88.5 t-150.5 30.5q-125 0 -204 -60q-85 -65 -85 -160q0 -60 35.5 -98t98.5 -38q78 0 133 58.5t56 187.5h50q1 -20 1 -36q0 -66 -23.5 -119t-60 -84.5t-77 -48t-78.5 -16.5q-105 0 -165.5 52.5t-60.5 149.5q0 123 122 201q104 66 252 66q101 0 187 -35.5t143 -97.5q48 32 92 47z M461 49v-2q37 -13 78 -13q109 0 185 79.5t76 222.5q0 54 -18 108h-1q-22 -33 -79 -144q-90 -176 -241 -251zM310 51v1q-53 35 -115 35q-14 0 -29 -5.5t-15 -16.5q0 -27 64 -27q52 0 95 13z" />
+<glyph unicode="&#x1d4d4;" horiz-adv-x="826" d="M414 683l-14 -48q-30 9 -77 9q-62 0 -99.5 -26t-37.5 -69q0 -85 148 -96q15 93 119 163.5t208 70.5q130 0 130 -80q0 -64 -99 -129t-241 -80v-3q80 -10 80 -37q0 -18 -18.5 -29.5t-53.5 -11.5t-63 14q-72 -25 -114.5 -78.5t-42.5 -117.5q0 -45 31 -73t83 -28 q69 0 118.5 37.5t49.5 98.5q0 30 -18.5 47t-40.5 17q-94 0 -129 -128l-49 10q36 173 206 173q145 0 145 -116q0 -60 -53 -111q-42 -40 -106.5 -61.5t-127.5 -21.5q-103 0 -173 46.5t-70 130.5q0 77 62.5 136.5t176.5 87.5v2q-6 10 -7 16q-111 6 -176.5 47t-65.5 107 q0 61 60 104t156 43q65 0 103 -16zM456 455l2 -2q101 14 171.5 58t70.5 90q0 31 -45 31q-56 0 -118 -55.5t-81 -121.5z" />
+<glyph unicode="&#x1d4d5;" horiz-adv-x="1042" d="M999 699l26 -42q-44 -38 -102.5 -62.5t-115.5 -24.5q-82 0 -196.5 37t-160.5 37q-86 0 -141.5 -43.5t-55.5 -108.5q0 -51 28.5 -76t63.5 -25q43 0 80.5 34t55.5 110l45 -9q-7 -85 -62 -137.5t-130 -52.5q-46 0 -89 22q-37 20 -60 56t-23 81q0 101 118 163q77 41 229 41 q56 0 175 -19t171 -19q29 0 71 10.5t73 27.5zM718 558l35 -36q-5 -5 -9 -10.5t-8 -13.5l-8 -12q-3 -5 -7 -14l-7 -16l-7 -18t-7.5 -19l-9.5 -23l-9 -26q68 13 134 13q40 56 79 56q22 0 35 -13t13 -31q0 -31 -26.5 -53t-73.5 -28q0 -49 8 -73l-70 -26q-4 15 -4 34q0 20 6 50 q-68 0 -133 -14q-42 -105 -110.5 -176t-142 -100.5t-153.5 -29.5q-85 0 -131.5 35.5t-46.5 93.5q0 38 24.5 65.5t59.5 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q23 -31 80 -31q73 0 128 48.5t102 137.5l4 8q-91 -43 -140 -85l-35 36q92 87 227 144 q58 102 100 150.5t93 84.5z" />
+<glyph unicode="&#x1d4d6;" horiz-adv-x="834" d="M422 682l-14 -48q-35 10 -84 10q-70 0 -110.5 -25.5t-40.5 -70.5q0 -67 111 -91q71 104 178.5 167t202.5 63q134 0 134 -85q0 -42 -40.5 -82.5t-109.5 -71.5q-120 -54 -259 -57q-30 -54 -30 -112q0 -62 46 -62q65 0 111 28t151 123l39 -32q-14 -13 -26 -34t-19 -38 t-21 -55q-41 -114 -135 -172t-234 -58q-86 0 -137 36t-51 93q0 38 24 65.5t59 27.5q31 0 50 -20t19 -47q0 -24 -15 -43.5t-43 -24.5v-1q23 -31 86 -31q145 0 229 145l-2 2q-44 -19 -102 -19q-71 0 -117 36t-46 98q0 54 27 105q-80 18 -125.5 55t-45.5 92q0 65 67 108t168 43 q59 0 105 -17zM424 447v-1q116 7 200 49.5t84 97.5q0 39 -43 39q-55 0 -123 -53.5t-118 -131.5z" />
+<glyph unicode="&#x1d4d7;" horiz-adv-x="1171" d="M816 658l-24 -19q-67 -53 -119.5 -115.5t-101.5 -158.5q62 15 89 27q110 145 223 226t194 81q77 0 77 -63q0 -78 -95.5 -141.5t-247.5 -106.5q-74 -104 -120.5 -191.5t-46.5 -127.5q0 -28 29 -28q46 0 146 124l42 -26q-52 -80 -111 -121q-53 -36 -104 -36 q-63 0 -92.5 31.5t-29.5 82.5q0 96 83 222q-13 -5 -41 -13.5t-32 -9.5q-68 -125 -167.5 -220.5t-197.5 -95.5q-104 0 -104 77q0 61 61 119q42 40 100 67t160 63q4 7 20 33t22 35l22 32q15 23 27 37l31 36q19 22 41 43.5t49 45.5v2q-39 0 -71.5 11.5t-51 26t-43 26 t-48.5 11.5q-39 0 -66.5 -30.5t-27.5 -68.5q0 -36 17.5 -54t42.5 -18q33 0 57 23l29 -35q-40 -43 -106 -43q-61 0 -96 36.5t-35 90.5q0 60 50 107t139 47q56 0 134 -25t116 -25q44 0 79 13q30 11 69 37zM875 473v-2q63 16 126.5 61t63.5 95q0 17 -18 17q-27 0 -78 -49 t-94 -122zM344 225l-1 2q-75 -24 -131 -75t-56 -98q0 -20 20 -20q29 0 78.5 58t89.5 133z" />
+<glyph unicode="&#x1d4d8;" horiz-adv-x="997" d="M141 66v-1q10 -13 38 -22t49 -9q94 0 164.5 48.5t131.5 182.5q2 5 8 18t10 20q-49 17 -79 56q-37 45 -37 108q0 79 60 137q87 83 237 83q63 0 121 -9q45 21 81 21q23 0 37.5 -10t14.5 -25q0 -31 -25 -47t-68 -16q-16 0 -32 3q-17 -12 -32 -30t-29.5 -46t-24 -48 t-26.5 -60l-24 -57l1 -2q69 33 120 115l43 -26q-67 -128 -195 -154q-64 -134 -122 -187q-142 -130 -328 -130q-86 0 -137 36t-51 93q0 38 24.5 65.5t59.5 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5zM769 604v3q-130 0 -191 -47t-61 -119q0 -57 54 -83 q29 57 51.5 94t62 81t84.5 71z" />
+<glyph unicode="&#x1d4d9;" horiz-adv-x="906" d="M625 228l35 -36q-58 -64 -171 -104q-61 -128 -161 -220t-204 -92q-49 0 -77 24t-28 67q0 88 105 160t240 100q31 86 82 193q-53 13 -83 52q-30 38 -30 93q0 119 124 183q77 39 175 39q29 0 50 -1.5t41.5 -4t30.5 -3.5q31 21 78 21q25 0 39.5 -10t14.5 -25q0 -31 -25 -47 t-67 -16q-16 0 -33 3q-58 -45 -141 -222l2 -1q62 27 117 113l43 -25q-29 -58 -84 -104.5t-112 -51.5q-9 -20 -26.5 -64t-31.5 -73l3 -1q56 22 94 53zM678 605v2q-116 0 -168 -24q-38 -17 -62 -50t-24 -74q0 -70 50 -85q71 131 204 231zM333 50l-1 1q-74 -21 -148 -79.5 t-74 -111.5q0 -13 8 -21t21 -8q47 0 101 66t93 153z" />
+<glyph unicode="&#x1d4da;" horiz-adv-x="1154" d="M842 699l30 -41q-43 -30 -76.5 -62.5t-62 -74t-42.5 -65.5l-41 -76q21 0 40 -12q46 21 115 118q149 213 250 213q36 0 55.5 -20.5t19.5 -47.5q0 -28 -19 -47.5t-47 -19.5q-27 0 -44 14.5t-21 38.5h-2q-33 -103 -100.5 -179.5t-155.5 -100.5v-3q49 -28 49 -84 q0 -32 -18 -66q-9 -17 -27 -43.5t-28 -44t-10 -28.5q0 -27 26 -27q48 0 155 134l39 -33q-113 -160 -222 -160q-56 0 -87.5 26.5t-31.5 67.5q0 44 49 118q37 55 37 90q0 8 -7.5 17.5t-19.5 9.5h-21q-72 -177 -177 -254.5t-224 -77.5q-83 0 -130.5 36t-47.5 93q0 38 24.5 65.5 t59.5 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q23 -31 70 -31q62 0 119 52t99 134q35 70 51.5 100.5t47 78.5t65 84t80.5 73h-9q-51 0 -98.5 22t-84 44t-60.5 22q-44 0 -77 -28t-33 -80q0 -40 21.5 -69.5t57.5 -29.5q26 0 41.5 9t39.5 39l38 -30 q-53 -73 -134 -73q-72 0 -113.5 42t-41.5 110q0 63 58.5 114t146.5 51q119 0 180 -36q47 -27 79 -27q90 0 160 63z" />
+<glyph unicode="&#x1d4db;" horiz-adv-x="1036" d="M678 648l-22 -44q-72 40 -166 40q-80 0 -140.5 -37.5t-60.5 -103.5t64.5 -103.5t166.5 -37.5q25 0 44 2q45 91 83 148q45 65 117.5 116t140.5 51q56 0 83 -23.5t27 -63.5q0 -70 -94.5 -151.5t-225.5 -117.5q-95 -192 -254 -272v-2q44 -13 78 -13q151 0 278 141l36 -35 q-139 -163 -311 -163q-85 0 -168 29q-82 -25 -162 -25q-75 0 -108 17q-44 22 -44 61q0 38 44 62q39 21 100 21q35 0 71 -9.5t56 -18.5l57 -29q71 47 168 220h-28q-56 0 -108 10.5t-99 33t-75 63t-28 93.5q0 81 83 136.5t204 55.5q112 0 193 -51zM722 389l2 -1 q78 27 139 81.5t61 120.5q0 16 -10 25t-23 9q-43 0 -88 -69.5t-81 -165.5zM290 53v1q-53 35 -115 35q-14 0 -29 -5.5t-15 -16.5q0 -29 64 -29q45 0 95 15z" />
+<glyph unicode="&#x1d4dc;" horiz-adv-x="1300" d="M1234 691l11 -17q-142 -219 -228.5 -388t-86.5 -218q0 -27 26 -27q47 0 167 133l37 -34q-66 -79 -120 -118.5t-112 -39.5q-119 0 -119 95q0 161 284 539l-2 1q-68 -47 -133.5 -132.5t-155.5 -246.5l-46 -81q-14 -24 -36.5 -56t-41.5 -51q-56 -54 -124 -54q-33 0 -57 21.5 t-24 54.5q0 51 35 121q88 178 259 414l-1 1q-70 -49 -125.5 -118t-127.5 -188q-7 -11 -25 -42l-24 -40l-22 -36l-23 -36q-7 -11 -20 -29.5l-21 -29.5l-20 -24q-10 -13 -20 -23q-61 -63 -137 -63q-63 0 -102 31.5t-39 86.5q0 38 24.5 64.5t59.5 26.5q31 0 50.5 -21.5 t19.5 -48.5q0 -25 -16 -44.5t-47 -19.5v-1q14 -19 61 -19t86 45t124 184q136 224 231 317q119 119 235 119q20 0 37 -8l10 -17q-99 -137 -191.5 -294t-130.5 -243q-19 -42 -19 -60q0 -14 11 -14q42 0 145 194q116 217 231 334q106 108 201 108q38 0 52 -8z" />
+<glyph unicode="&#x1d4dd;" horiz-adv-x="1095" d="M695 175h4q48 63 85 165q9 25 26 80l30 92q12 36 33 78t44 66q40 43 89 43q34 0 53 -20.5t19 -47.5q0 -28 -19.5 -47.5t-46.5 -19.5q-43 0 -64 39h-4q-19 -16 -36.5 -64.5t-42.5 -128.5t-48 -135q-37 -85 -92.5 -163t-116.5 -125h-51q4 23 7 47.5t4 57.5l3 57q1 23 2 72 t2 76q4 119 28 215h-2q-45 -71 -100 -183q-108 -219 -171 -284q-63 -66 -138 -66q-57 0 -94.5 32.5t-37.5 86.5q0 34 25 62t61 28q33 0 52 -21t19 -50q0 -21 -18 -41.5t-48 -20.5v-1q10 -20 48 -20q55 0 109.5 72.5t136.5 235.5q57 115 95.5 179t77.5 105q34 36 101 68 l25 -22q-7 -19 -12 -55t-7 -65l-6 -89q-4 -61 -6 -88q-11 -156 -18 -200z" />
+<glyph unicode="&#x1d4de;" horiz-adv-x="809" d="M749 562l-38 -9q-13 40 -56 65.5t-89 25.5q-88 0 -173.5 -69.5t-139.5 -182t-54 -229.5q0 -53 28 -91t78 -38q54 0 106 25q82 40 134.5 127.5t52.5 185.5q0 52 -23.5 89.5t-52.5 37.5q-43 0 -71.5 -41.5t-28.5 -97.5q0 -52 26 -95l-44 -22q-37 60 -37 126q0 83 51.5 139 t130.5 56q62 0 105.5 -44.5t43.5 -127.5q0 -68 -32 -141t-86 -133.5t-133 -99.5t-164 -39q-98 0 -154.5 60t-56.5 151q0 101 39.5 195t105 162.5t156 110t187.5 41.5q79 0 131.5 -40t57.5 -97z" />
+<glyph unicode="&#x1d4df;" horiz-adv-x="1025" d="M914 698l19 -47q-27 -12 -55 -29q116 -76 116 -183q0 -71 -46 -118t-124 -47q-36 0 -65 22.5t-29 58.5q0 42 29 71l41 -28q-15 -18 -15 -37q0 -15 10.5 -23.5t22.5 -8.5q27 0 44.5 28t17.5 72q0 83 -67 140q-33 -35 -57.5 -79t-50 -104.5t-41.5 -90.5q-90 -170 -193 -243 t-231 -73q-85 0 -135 36.5t-50 93.5q0 38 23 65t58 27q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q25 -31 84 -31q85 0 141 50t138 198q68 124 122 200t119 128q-72 34 -151 34q-147 0 -246.5 -65t-99.5 -160q0 -43 27 -70.5t65 -27.5q61 0 102 50.5t47 157.5h50 q0 -66 -19 -123t-68.5 -98.5t-122.5 -41.5q-74 0 -123 41.5t-49 115.5q0 65 46.5 126t128.5 100q105 50 255 50q122 0 224 -45q49 28 98 44z" />
+<glyph unicode="&#x1d4e0;" horiz-adv-x="809" d="M749 562l-38 -9q-13 40 -56 65.5t-89 25.5q-88 0 -173.5 -69.5t-139.5 -182t-54 -229.5q0 -53 28 -91t78 -38q54 0 115 29q-16 29 -39 29q-14 0 -25 -5t-35 -24l-30 40q71 73 121 73q56 0 93 -45q93 104 93 241q0 56 -22.5 91.5t-63.5 35.5q-43 0 -66.5 -38t-23.5 -91 q0 -55 27 -95l-44 -22q-38 58 -38 124q0 77 50.5 132t131.5 55q62 0 105.5 -44.5t43.5 -127.5q0 -80 -43 -165t-115 -148q34 -48 51 -48q16 0 32 9t50 41l33 -34q-39 -51 -71.5 -75t-70.5 -24q-41 0 -67 15t-50 54q-83 -38 -164 -38q-98 0 -154.5 60t-56.5 151 q0 101 39.5 195t105 162.5t156 110t187.5 41.5q79 0 131.5 -40t57.5 -97z" />
+<glyph unicode="&#x1d4e1;" horiz-adv-x="1048" d="M934 175l39 -33q-58 -81 -110.5 -120.5t-113.5 -39.5q-57 0 -90 27t-33 67q0 37 42.5 101t42.5 90q0 24 -14 27q-22 0 -30 5q-87 -169 -192.5 -244.5t-234.5 -75.5q-85 0 -135 36.5t-50 93.5q0 38 23 65t58 27q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1 q25 -31 87 -31q85 0 139 49.5t137 198.5q70 128 122.5 202t118.5 126q-72 34 -151 34q-147 0 -246.5 -65t-99.5 -160q0 -43 27.5 -70.5t64.5 -27.5q75 0 113 66q31 52 35 133h50q0 -104 -52 -179t-159 -75q-71 0 -120.5 42.5t-49.5 114.5q0 65 46.5 125.5t128.5 99.5 q107 51 255 51q122 0 224 -45q44 25 98 44l19 -47q-30 -13 -55 -29q93 -61 93 -146q0 -67 -52 -111t-126 -50v-2q34 -34 34 -86q0 -27 -39 -83.5t-39 -75.5q0 -27 26 -27q52 0 159 134zM857 481q0 53 -43 88q-21 -21 -40 -50t-27 -44.5t-27 -58.5l-22 -49q33 0 62 -18 q38 7 67.5 47.5t29.5 84.5z" />
+<glyph unicode="&#x1d4e2;" horiz-adv-x="816" d="M437 136l-49 -10q-12 73 -40 99t-67 26t-62.5 -31t-23.5 -71q0 -41 36 -78t90 -37q68 0 115.5 41t47.5 122q0 31 -16.5 59.5t-39.5 51.5l-47 48q-23 25 -39.5 57.5t-16.5 68.5q0 70 46.5 121t108.5 73.5t126 22.5q68 0 121.5 -30.5t53.5 -91.5q0 -62 -64 -106.5 t-137 -44.5v50q49 4 79.5 27.5t30.5 67.5q0 35 -25.5 54t-59.5 19q-55 0 -103.5 -39.5t-48.5 -102.5q0 -34 17 -64.5t41 -54.5l49 -48q24 -24 41 -56t17 -69q0 -103 -87 -167t-216 -64q-99 0 -166.5 42.5t-67.5 125.5q0 74 58 116.5t136 42.5q144 0 162 -170z" />
+<glyph unicode="&#x1d4e3;" horiz-adv-x="1030" d="M999 699l26 -42q-44 -38 -102.5 -62.5t-115.5 -24.5q-82 0 -196.5 37t-160.5 37q-85 0 -141 -46t-56 -111q0 -53 29 -80t72 -27q58 0 95 40t65 129l48 -12q-19 -99 -77 -155.5t-133 -56.5q-67 0 -108 22q-82 44 -82 133q0 54 32 101.5t86 76.5q77 41 229 41q56 0 175 -19 t171 -19q29 0 71 10.5t73 27.5zM718 558l35 -36q-28 -29 -46.5 -70.5t-36 -101t-28.5 -85.5q-38 -98 -108 -168q-60 -60 -136.5 -89t-153.5 -29q-85 0 -132 35.5t-47 93.5q0 38 24.5 65.5t59.5 27.5q31 0 49.5 -20t18.5 -47q0 -24 -15 -43.5t-43 -24.5v-1q23 -31 80 -31 q72 0 130 50t121 176q47 94 82 146.5t61 78t85 73.5z" />
+<glyph unicode="&#x1d4e4;" horiz-adv-x="964" d="M904 669l-304 -563q-9 -18 -9 -36q0 -29 23 -29q46 0 149 130l41 -33q-53 -78 -112 -120q-50 -36 -104 -36q-100 0 -118 86h-1q-40 -50 -82.5 -69.5t-97.5 -19.5q-49 0 -81 26t-32 70q0 49 79 171l149 230q30 45 30 89q0 36 -24 57.5t-73 21.5q-74 0 -130 -47.5 t-56 -116.5q0 -31 16 -50.5t40 -19.5q41 0 66 25.5t45 78.5l48 -15q-18 -59 -59.5 -101.5t-106.5 -42.5q-50 0 -84 21q-56 35 -56 104q0 94 87 156.5t199 62.5q85 0 147 -40t62 -112q0 -40 -54 -128l-180 -291q-24 -36 -24 -67q0 -27 27 -27q40 0 98 66q77 87 200 307 l147 262h135z" />
+<glyph unicode="&#x1d4e5;" horiz-adv-x="1040" d="M332 62l3 -4q62 38 111 78t91.5 91.5t65 83t64.5 96.5l68 103q22 33 56 78t55.5 63.5t49 33t54.5 14.5q39 0 56.5 -21t17.5 -47q0 -28 -18.5 -47.5t-45.5 -19.5q-25 0 -43 14.5t-23 38.5h-2q-62 -53 -168 -224q-136 -220 -262 -314q-131 -100 -228 -100q-15 0 -66 9 q41 39 70.5 93t50.5 109.5t46 114t71 124.5t111 123v4q-76 0 -119 17q-29 11 -69.5 41t-68.5 30q-44 0 -76.5 -28.5t-32.5 -80.5q0 -38 21 -62.5t51 -24.5q27 0 47 10.5t43 39.5l38 -32q-32 -36 -61.5 -54.5t-72.5 -18.5q-65 0 -111 39.5t-46 108.5q0 73 62 115.5t142 42.5 q31 0 51 -1.5t50 -10t59 -24.5q47 -27 79 -27q92 0 160 63l36 -35q-74 -78 -113.5 -144t-79.5 -165q-75 -184 -174 -293z" />
+<glyph unicode="&#x1d4e6;" horiz-adv-x="1320" d="M634 62l3 -4q46 25 89.5 63.5t86.5 93t69 91.5l67 101l68 103q22 33 56 78t55.5 63.5t49 33t54.5 14.5q39 0 56.5 -21t17.5 -47q0 -28 -18 -47.5t-45 -19.5q-26 0 -44 14.5t-23 38.5h-2q-62 -53 -168 -224q-42 -68 -80.5 -123t-87 -111t-95 -94t-100.5 -62t-107 -24 q-28 0 -58 9q43 38 76 96.5t84 188.5q11 29 44 103h-2l-42 -66l-48 -71q-36 -52 -59 -78.5t-63 -67t-73 -61t-76 -37t-85 -16.5q-27 0 -60 9q36 29 61.5 78t46 106.5t45.5 119t73.5 132t116.5 130.5v2q-76 0 -119 17q-29 11 -69.5 41t-68.5 30q-44 0 -76.5 -28.5 t-32.5 -80.5q0 -38 21 -62.5t51 -24.5q27 0 47 10.5t43 39.5l38 -32q-32 -36 -61.5 -54.5t-72.5 -18.5q-71 0 -114 40.5t-43 107.5q0 62 58.5 110t145.5 48q31 0 51 -1.5t50 -10t59 -24.5q47 -27 79 -27q92 0 160 63l36 -35q-59 -57 -100.5 -119.5t-66.5 -119.5l-50 -114 q-24 -57 -63.5 -123t-93.5 -126l2 -4q43 18 87.5 59t84.5 93t81 111l82 117q42 58 84 108t90.5 88t97.5 53q25 0 49 -8q-47 -50 -83.5 -116t-61.5 -130l-51 -128q-26 -64 -64.5 -128.5t-88.5 -114.5z" />
+<glyph unicode="&#x1d4e7;" horiz-adv-x="1033" d="M664 567h2q40 58 88 95t115 37q56 0 98.5 -32.5t42.5 -86.5q0 -34 -24 -61t-60 -27q-34 0 -53.5 20t-19.5 49q0 21 18 41.5t48 20.5v1q-10 20 -48 20q-60 0 -103 -46t-84 -147t-70.5 -197.5t-29.5 -141.5q0 -34 14.5 -52.5t35.5 -18.5q30 0 69.5 29t100.5 99l38 -30 q-134 -157 -239 -157q-63 0 -97.5 25.5t-60.5 79.5h-2q-82 -108 -228 -108q-57 0 -104 32.5t-47 86.5q0 34 25 62t61 28q33 0 52 -21t19 -50q0 -21 -18 -41.5t-48 -20.5v-1q4 -8 21.5 -14t36.5 -6q79 0 133.5 47t105.5 147q42 82 67 159.5t25 115.5q0 71 -22.5 106t-76.5 35 q-73 0 -132 -57t-59 -126q0 -37 19 -60t52 -23q35 0 55.5 18.5t42.5 60.5l44 -18q-30 -58 -64.5 -87t-92.5 -29q-64 0 -105.5 37.5t-41.5 106.5q0 50 34.5 98t83.5 82q76 52 169 52q82 0 137.5 -35t76.5 -97z" />
+<glyph unicode="&#x1d4e8;" horiz-adv-x="989" d="M825 669h138q-131 -175 -212.5 -297.5t-147.5 -250.5l2 -1q50 24 100 64l35 -36q-64 -66 -178 -116q-52 -106 -147 -181t-206 -75q-44 0 -75 21.5t-31 61.5q0 85 105 137q22 11 52.5 20.5t52 14.5t63.5 14l61 13q11 24 56 101l-3 1q-71 -62 -145 -62q-53 0 -83 25t-30 71 q0 34 22 70t92 126q68 87 83 115.5t15 59.5q0 35 -28.5 57t-78.5 22q-74 0 -130 -47.5t-56 -116.5q0 -31 16 -50.5t40 -19.5q78 0 116 102l43 -12q-16 -59 -57 -102t-106 -43q-53 0 -84 19q-59 35 -59 106q0 94 87 156.5t199 62.5q87 0 153 -40t66 -112q0 -10 -1 -19t-5 -20 t-7.5 -19t-12.5 -22l-15 -23q-6 -10 -19.5 -29.5l-22.5 -32.5l-30 -38l-32 -44q-42 -57 -54.5 -80.5t-12.5 -41.5q0 -21 23 -21q66 0 265 266zM396 -23l-1 1q-29 -6 -58.5 -14.5t-64 -23.5t-56.5 -36.5t-22 -46.5q0 -10 7 -18t22 -8q37 0 83.5 35t89.5 111z" />
+<glyph unicode="&#x1d4e9;" horiz-adv-x="996" d="M440 531l45 -22q-58 -117 -177 -117q-68 0 -111.5 36t-43.5 97q0 66 65.5 120t174.5 54q168 0 278 -72q85 61 164 61q70 0 105.5 -23.5t35.5 -53.5q0 -34 -32.5 -60.5t-110.5 -26.5q-39 0 -131 28q-53 -68 -106 -216q48 2 92 43l32 -33q-73 -90 -157 -90q-5 -11 -15 -31 q-50 -92 -127 -154q64 -24 126 -24q64 0 127.5 31t89.5 101h50q-43 -200 -264 -200q-100 0 -157 18q-31 11 -52 22q-80 -37 -160 -37q-71 0 -101 23t-30 56q0 39 42 62q38 21 100 21q50 0 147 -40q20 26 32 47q14 26 56 128h-2q-48 0 -103 -44l-30 40q74 84 171 84 q67 145 151 217q-115 55 -225 55q-62 0 -103.5 -29.5t-41.5 -78.5q0 -37 21.5 -56.5t55.5 -19.5q70 0 119 84zM742 600v-2q57 -19 90 -19q53 0 53 29q0 25 -49 25q-57 0 -94 -33zM278 56q-57 33 -97 33t-40 -28q0 -24 57 -24q42 0 80 19z" />
+<glyph unicode="&#x1d4ea;" horiz-adv-x="942" d="M830 210l35 -29q-148 -192 -274 -192q-65 0 -87 56q-47 -35 -82 -47t-81 -12q-61 0 -101.5 30t-40.5 94q0 55 24 111q-46 -18 -92 -18q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81v-1q58 59 133.5 94t147.5 35q112 0 142 -75l-41 -19q-19 27 -37.5 35.5t-50.5 8.5 q-66 0 -133.5 -59t-107.5 -134.5t-40 -131.5q0 -25 12.5 -38t32.5 -13q31 0 69.5 19.5t63.5 52.5q-1 9 -1 29q0 69 40 129.5t98 60.5q50 0 50 -49q0 -45 -35 -100t-86 -91q6 -27 15.5 -37.5t33.5 -10.5q81 0 223 171z" />
+<glyph unicode="&#x1d4eb;" horiz-adv-x="646" d="M92 541l31 36q31 -26 71.5 -48t65.5 -23q31 39 65 74q116 119 198 119q43 0 72 -20t29 -51q0 -44 -33 -85.5t-88 -68.5q-73 -35 -156 -35q-58 -79 -119 -196.5t-61 -173.5q0 -14 10 -23.5t23 -9.5q60 0 117 51t95 119q-17 30 -17 81q0 61 32.5 104t70.5 43q45 0 45 -49 q0 -33 -16.5 -79t-33.5 -75q19 -14 48 -14q18 0 39 7l11 -44q-30 -13 -66 -13q-37 0 -60 13q-67 -98 -135 -146t-152 -48q-53 0 -85.5 31t-32.5 89q0 59 46 157t117 195q-65 19 -131 83zM378 503l1 -2q62 1 108.5 40t46.5 87q0 21 -18 21q-23 0 -53 -30t-85 -116z" />
+<glyph unicode="&#x1d4ec;" horiz-adv-x="764" d="M35 225l12 43q36 -15 82 -15q100 0 161 68q59 64 129.5 102.5t138.5 38.5q53 0 89 -21.5t36 -61.5q0 -35 -20 -61t-53 -26q-28 0 -42.5 14t-14.5 36t19.5 37t19.5 22q0 11 -17 11q-60 0 -122.5 -57.5t-100.5 -132t-38 -130.5q0 -28 12 -42t30 -14q118 0 275 192l34 -30 q-87 -112 -162 -162t-156 -50q-67 0 -107.5 33t-40.5 90q0 55 25 113q-44 -19 -93 -19q-53 0 -96 22z" />
+<glyph unicode="&#x1d4ed;" horiz-adv-x="949" d="M912 699l-323 -598q-11 -19 -11 -39q0 -9 5 -16t11 -7q71 0 211 170l35 -29q-71 -97 -133.5 -144t-139.5 -47q-91 0 -93 75h-2q-73 -78 -179 -78q-56 0 -90.5 30.5t-34.5 81.5t35 118q-41 -13 -79 -13q-53 0 -96 22l12 43q36 -15 82 -15q86 0 154 63q93 91 181 127 q48 19 103 19q60 0 81 -39h2l145 276h124zM588 376q0 36 -30 36q-36 0 -86 -37t-101 -109q-88 -125 -88 -193q0 -16 8.5 -26.5t21.5 -10.5q55 0 123 63q61 58 106.5 139t45.5 138z" />
+<glyph unicode="&#x1d4ee;" horiz-adv-x="726" d="M35 284l29 35q47 -55 133 -69q52 89 145.5 150.5t182.5 61.5q54 0 88.5 -23t34.5 -61q0 -42 -35 -78q-44 -47 -129.5 -75.5t-178.5 -30.5q-12 -11 -22 -41.5t-10 -58.5t14.5 -43t39.5 -15q52 0 131.5 54t135.5 122l32 -32q-88 -109 -189 -160q-68 -34 -135 -34 q-68 0 -106 33.5t-38 90.5q0 50 17 94q-91 20 -140 80zM330 244l1 -1q101 11 160 54.5t59 92.5q0 13 -8.5 20t-17.5 7q-81 0 -194 -173z" />
+<glyph unicode="&#x1d4ef;" horiz-adv-x="768" d="M25 -205l192 367q-16 27 -16 59q0 43 35.5 84t95.5 68q90 176 157 251t153 75q51 0 79 -20t28 -53q0 -46 -31 -90t-80.5 -78t-95.5 -57.5t-93 -41.5l-117 -210q25 -12 61 -12q76 0 137 54l27 -36q-81 -68 -177 -68q-44 0 -75 9l-156 -301h-124zM483 432l2 -2 q70 34 122 85t52 104q0 17 -6 23.5t-20 6.5q-47 0 -150 -217z" />
+<glyph unicode="&#x1d4f0;" horiz-adv-x="819" d="M771 449l-278 -518q25 -12 73 -12q56 0 110 35l20 -41q-60 -44 -141 -44q-49 0 -89 14q-90 -107 -238 -107q-60 0 -94 23t-34 54q0 32 29.5 58t70.5 42q39 15 121 15q25 0 75 -8l40 72h-3q-63 -43 -143 -43q-50 0 -83.5 30.5t-33.5 79.5q0 55 32 117q-42 -14 -82 -14 q-51 0 -96 23l12 43q38 -16 82 -16q81 0 150 58q60 65 142.5 108.5t143.5 43.5q60 0 88 -31h2l10 18h114zM591 375q0 37 -33 37q-75 0 -187 -162q-83 -119 -83 -176q0 -16 9.5 -25.5t20.5 -9.5q56 0 123 68t108.5 147t41.5 121zM369 -91q-30 9 -63 9q-43 -1 -74 -16t-32 -46 q0 -30 40 -30q74 0 129 83z" />
+<glyph unicode="&#x1d4f1;" horiz-adv-x="838" d="M722 214l36 -28q-144 -200 -283 -200q-41 0 -65.5 25.5t-24.5 57.5q0 64 46 129l108 151q17 24 17 43q0 16 -20 16q-60 0 -150.5 -96t-176.5 -255l-31 -57h-123l249 458q-94 19 -143 80l31 33q28 -26 69 -43t70 -21q58 108 106.5 150t117.5 42q50 0 76.5 -22.5 t26.5 -54.5q0 -41 -24.5 -74.5t-63.5 -53.5t-78.5 -31t-77.5 -14l-43 -79l3 -1q42 43 91 66t90 23q45 0 73 -18.5t28 -52.5q0 -39 -49 -117l-105 -171q-17 -25 -17 -43q0 -20 17 -20q67 0 220 178zM442 509l1 -1q125 31 125 117q0 12 -6 18t-12 6q-22 0 -41.5 -24 t-66.5 -116z" />
+<glyph unicode="&#x1d4f2;" horiz-adv-x="558" d="M534 633q0 -26 -18.5 -44t-45.5 -18t-45 19t-18 47q0 24 19 42.5t43 18.5q27 0 46 -19t19 -46zM450 205l36 -28q-80 -106 -132 -148.5t-117 -42.5q-47 0 -75 24.5t-28 67.5q0 36 14 70.5t45 91.5q6 11 9 16l49 91q-53 -29 -115 -29q-53 0 -96 22l12 43q36 -15 82 -15 q104 0 172 81h118l-164 -315q-19 -36 -19 -69q0 -12 6 -20.5t15 -8.5q48 0 188 169z" />
+<glyph unicode="&#x1d4f3;" horiz-adv-x="840" d="M823 633q0 -26 -18.5 -44t-45.5 -18t-45 19t-18 47q0 24 19 42.5t43 18.5q27 0 46 -19t19 -46zM710 449l-276 -518q25 -12 73 -12q56 0 110 35l20 -41q-60 -44 -141 -44q-49 0 -89 14q-90 -107 -238 -107q-60 0 -94 22.5t-34 54.5t29.5 58t70.5 42q39 15 121 15 q25 0 75 -8l207 387q-53 -29 -126 -29q-53 0 -96 22l12 43q36 -15 82 -15q64 0 111 26t71 55h112zM310 -91q-30 9 -63 9q-43 -1 -74 -16t-32 -46q0 -30 40 -30q74 0 129 83z" />
+<glyph unicode="&#x1d4f4;" horiz-adv-x="810" d="M694 209l36 -28q-82 -105 -139 -150t-122 -45q-44 0 -72.5 19t-28.5 53q0 28 18.5 62.5t18.5 58.5q0 36 -47 39l18 45q80 8 132 46t52 79q0 20 -23 20q-59 0 -150.5 -96t-177.5 -255l-31 -57h-123l249 458q-82 17 -133 80l31 33q56 -52 129 -64q58 108 106.5 150 t117.5 42q46 0 74.5 -20.5t28.5 -51.5q0 -53 -43 -94.5t-96 -60.5t-105 -23l-43 -79l3 -1q89 89 191 89q41 0 68 -20t27 -47q0 -48 -62.5 -94t-147.5 -60v-3q55 -37 55 -81q0 -21 -16.5 -49.5t-16.5 -45.5q0 -7 5.5 -14.5t13.5 -7.5q65 0 203 173zM442 509l1 -1 q125 31 125 117q0 12 -6 18t-12 6q-22 0 -41.5 -24t-66.5 -116z" />
+<glyph unicode="&#x1d4f5;" horiz-adv-x="650" d="M43 429l26 38q28 -19 69 -35t59 -18q195 285 325 285q47 0 78.5 -21.5t31.5 -63.5q0 -56 -34.5 -107t-93.5 -87q-90 -56 -208 -65l-58 -100q-21 -36 -46 -94.5t-25 -91.5t25 -33q29 0 79.5 38t114.5 124l36 -27q-70 -99 -128.5 -142t-121.5 -43q-52 0 -82 31t-30 90 q0 97 103 255q-26 6 -64 27.5t-56 39.5zM333 421l1 -1q83 19 145.5 72t62.5 129q0 28 -25 28q-62 0 -184 -228z" />
+<glyph unicode="&#x1d4f6;" horiz-adv-x="1137" d="M1021 214l36 -28q-73 -101 -140 -150.5t-143 -49.5q-41 0 -65.5 25.5t-24.5 57.5q0 64 46 129l108 151q17 23 17 43t-23 20q-59 0 -148 -97.5t-176 -257.5l-31 -57h-123l203 356q12 21 12 37q0 19 -20 19q-60 0 -150.5 -97.5t-176.5 -257.5l-31 -57h-123l187 347 q-52 -29 -114 -29q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h114l-41 -79l3 -1q43 44 92 68.5t89 24.5q46 0 73.5 -19.5t27.5 -55.5q0 -7 -3 -18h3q43 44 92.5 68.5t89.5 24.5q46 0 75 -19.5t29 -55.5q0 -39 -49 -117l-105 -171q-17 -25 -17 -43q0 -20 16 -20 q68 0 221 178z" />
+<glyph unicode="&#x1d4f7;" horiz-adv-x="851" d="M735 214l36 -28q-73 -101 -140 -150.5t-143 -49.5q-41 0 -65.5 25.5t-24.5 57.5q0 64 46 129l108 155q17 24 17 43q0 16 -20 16q-60 0 -150.5 -97.5t-176.5 -257.5l-31 -57h-123l187 347q-52 -29 -114 -29q-53 0 -96 22l12 43q36 -15 81 -15q105 0 173 81h114l-41 -79 l3 -1q43 44 92 68.5t89 24.5q46 0 73.5 -19.5t27.5 -55.5q0 -38 -49 -117l-105 -171q-17 -25 -17 -43q0 -20 18 -20q66 0 219 178z" />
+<glyph unicode="&#x1d4f8;" horiz-adv-x="848" d="M757 232l23 -39q-46 -31 -99 -31q-36 0 -63 9q-62 -99 -143 -148q-61 -37 -131 -37q-65 0 -104 31.5t-39 92.5q0 54 24 113q-43 -20 -96 -20q-51 0 -94 22l12 43q36 -15 80 -15q97 0 163 71q64 69 137 104q71 34 148 34q51 0 79 -28.5t28 -79.5q0 -67 -35 -131 q12 -11 38 -11q17 0 25 0.5t20.5 5t26.5 14.5zM626 371q0 41 -47 41q-53 0 -116.5 -59.5t-105 -136t-41.5 -127.5q0 -53 46 -53q58 0 113 48t96 114q-30 27 -30 75q0 37 25 64.5t60 33.5z" />
+<glyph unicode="&#x1d4f9;" horiz-adv-x="885" d="M453 370l3 -1q43 44 92 68.5t89 24.5q133 0 133 -124q0 -70 -46.5 -150t-97.5 -116q67 -42 111 -110l-37 -27q-61 69 -123 101q-76 -50 -147 -50q-44 0 -65.5 14t-21.5 36q0 31 36.5 59.5t87.5 29.5q37 0 65 -9q45 32 79 92q44 77 44 150q0 54 -47 54q-58 0 -143 -96 t-174 -259l-143 -262h-123l299 551q-53 -28 -114 -28q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h114z" />
+<glyph unicode="&#x1d4fa;" horiz-adv-x="913" d="M802 224l31 -31q-55 -59 -220 -213q-64 -60 -116 -115t-63 -70h-123l127 237h-2q-67 -46 -143 -46q-50 0 -83.5 30.5t-33.5 79.5q0 58 32 120q-39 -13 -77 -13q-53 0 -96 22l12 43q36 -15 82 -15q80 0 148 57q61 65 141.5 108.5t141.5 43.5q60 0 88 -31h2l10 18h121 l-251 -467l1 -1zM594 376q0 36 -30 36q-36 0 -86 -37t-101 -109q-86 -122 -86 -193q0 -16 8 -26.5t21 -10.5q29 0 56 13.5t66 49.5q61 58 106.5 139t45.5 138z" />
+<glyph unicode="&#x1d4fb;" horiz-adv-x="677" d="M636 332l12 -43q-27 -14 -67 -14q-63 0 -88 28l-248 -192l-59 -111h-123l187 347q-52 -29 -114 -29q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h120l-113 -211l1 -1l150 112q-2 14 -2 19q0 42 31.5 68t72.5 26q50 0 73 -28l-101 -90q17 -19 58 -19q26 0 40 7z" />
+<glyph unicode="&#x1d4fc;" horiz-adv-x="562" d="M139 240l-19 41q38 15 59.5 25.5t57.5 37.5t67 64q-4 5 -8.5 25t-4.5 27q0 52 28.5 74.5t56.5 22.5q24 0 37 -15.5t13 -36.5q0 -25 -12.5 -56t-36.5 -52l19 -25q14 -19 20.5 -30t15.5 -29.5t13 -40t4 -46.5q0 -59 -35.5 -115t-89.5 -90q-57 -35 -140 -35 q-52 0 -92.5 24.5t-40.5 72.5q0 35 20.5 59t46.5 24q21 0 40 -11.5t19 -34.5q0 -19 -8.5 -27.5t-17.5 -14t-9 -16.5q0 -26 35 -26q63 0 110 66t47 176q0 19 -9 71q-71 -71 -186 -109z" />
+<glyph unicode="&#x1d4fd;" horiz-adv-x="618" d="M612 538l-22 -50h-145l-185 -354q-20 -40 -20 -69t21 -29q26 0 70 41t124 137l36 -28q-86 -112 -137.5 -156t-116.5 -44q-47 0 -72 24.5t-25 67.5q0 39 14 75.5t48 101.5l32 61h-2q-59 -55 -181 -66l-4 46q78 6 148.5 50.5t109.5 102.5l21 39h-101l22 50h102l70 131h120 l-69 -131h142z" />
+<glyph unicode="&#x1d4fe;" horiz-adv-x="842" d="M726 208l36 -28l-56 -71q-15 -19 -44 -50t-47.5 -41.5t-46.5 -19.5t-61 -9q-41 0 -66.5 24.5t-25.5 60.5v8h-1q-43 -47 -83 -71.5t-101 -24.5q-44 0 -72 25.5t-28 70.5q0 60 46 143l66 122q-53 -29 -115 -29q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h120 l-163 -308q-24 -45 -24 -78q0 -27 23 -27q66 0 151.5 111.5t174.5 301.5h120l-166 -318q-18 -34 -18 -62q0 -30 23 -30q48 0 188 169z" />
+<glyph unicode="&#x1d4ff;" horiz-adv-x="732" d="M659 224l11 -44q-27 -13 -60 -13q-45 0 -70 13q-67 -98 -135 -146t-150 -48q-52 0 -82.5 27t-30.5 78q0 58 59 165l49 90q-53 -28 -114 -28q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h118l-161 -307q-21 -38 -21 -73q0 -13 10 -23t23 -10q60 0 117 51t95 119 q-23 41 -23 91q0 69 31.5 115t75.5 46q26 0 36.5 -18.5t10.5 -54.5q0 -35 -15 -80t-35 -74q19 -14 52 -14q18 0 39 7z" />
+<glyph unicode="&#x1d500;" horiz-adv-x="1012" d="M939 224l11 -44q-27 -13 -60 -13q-45 0 -70 13q-67 -98 -135 -146t-150 -48q-47 0 -77.5 24t-35.5 68h-1q-50 -49 -87.5 -70.5t-95.5 -21.5q-44 0 -71.5 25.5t-27.5 70.5q0 60 46 143l66 122q-53 -29 -115 -29q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h120 l-164 -308q-23 -43 -23 -75q0 -12 6.5 -21t15.5 -9q66 0 149.5 111t173.5 302h120l-162 -307q-20 -37 -20 -73q0 -13 10 -23t23 -10q60 0 117 51t95 119q-23 41 -23 91q0 68 31.5 114.5t75.5 46.5q26 0 36.5 -18.5t10.5 -54.5q0 -35 -15 -80t-35 -74q19 -14 52 -14 q18 0 39 7z" />
+<glyph unicode="&#x1d501;" horiz-adv-x="820" d="M140 234l-38 29q88 110 153.5 153t134.5 43q63 0 99 -55q58 58 139 58q51 0 81.5 -23t30.5 -65q0 -36 -21 -60.5t-55 -24.5q-21 0 -36 12t-15 36q0 15 5.5 24t12.5 12.5t12.5 9t5.5 12.5q0 17 -24 17q-40 0 -79.5 -44.5t-65 -104t-41.5 -113.5t-16 -78q0 -33 30 -33 q41 0 103 42.5t136 134.5l35 -30q-103 -131 -196 -175q-48 -22 -99 -22q-85 0 -109 55q-73 -58 -146 -58q-54 0 -84 27.5t-30 69.5q0 33 20.5 57t53.5 24q21 0 37 -12t16 -36q0 -19 -9 -28.5t-18 -15.5t-9 -17q0 -8 8 -13.5t17 -5.5q51 0 104 70.5t83 147t30 111.5 q0 44 -31 44q-41 0 -90 -35.5t-135 -139.5z" />
+<glyph unicode="&#x1d502;" horiz-adv-x="784" d="M711 449l-272 -518q25 -12 73 -12q58 0 110 34l20 -40q-60 -44 -141 -44q-49 0 -89 14q-90 -107 -238 -107q-60 0 -94 23t-34 54q0 32 29.5 58t70.5 42q39 15 121 15q25 0 75 -8l45 85h-2q-34 -30 -66.5 -44.5t-80.5 -14.5q-44 0 -72 25.5t-28 70.5q0 58 47 143l66 122 q-53 -29 -115 -29q-53 0 -96 22l12 43q36 -15 82 -15q104 0 172 81h120l-164 -308q-24 -45 -24 -75q0 -12 7 -21t16 -9q66 0 154 112.5t176 300.5h120zM315 -91q-30 9 -63 9q-43 -1 -74 -16t-32 -46q0 -30 40 -30q74 0 129 83z" />
+<glyph unicode="&#x1d503;" horiz-adv-x="782" d="M665 224l37 -26q-58 -82 -93 -118q-47 -49 -91.5 -70t-98.5 -21q-76 0 -76 55q0 17 12.5 36.5t12.5 31.5q0 13 -20 13q-22 0 -45.5 -14t-71.5 -52q-57 -73 -127 -73q-22 0 -32.5 10.5t-10.5 25.5q0 35 41.5 67t108.5 44l230 189v1q-27 -7 -57 -7q-55 0 -89 16 q-76 -91 -200 -108l-12 39q35 8 54.5 14.5t50.5 24.5t53 45q-45 29 -45 72q0 33 20.5 53.5t53.5 20.5q30 0 47.5 -18t17.5 -42q0 -29 -10 -52q30 -15 76 -15q55 0 95 20q50 77 118 77q20 0 33.5 -9.5t13.5 -26.5q0 -24 -23 -45q-33 -30 -105 -47l-196 -162l1 -1q21 3 38 3 q47 0 75 -18t28 -43q0 -15 -10.5 -34.5t-10.5 -26.5q0 -12 13 -12q30 0 85.5 50t108.5 133z" />
+<glyph unicode="&#x1d63c;" horiz-adv-x="690" d="M665 0h-130l-26 162h-248l-106 -162h-130l478 690h28zM493 264l-32 204l-134 -204h166z" />
+<glyph unicode="&#x1d63d;" horiz-adv-x="636" d="M248 676h237q206 0 206 -125q0 -53 -35 -102t-101 -76l1 -4q92 -49 92 -128q0 -100 -90 -170.5t-218 -70.5h-260zM310 413h72q88 0 128 32.5t40 79.5q0 49 -86 49h-113zM233 102h103q86 0 128.5 37t42.5 93q0 41 -42 60t-105 19h-75z" />
+<glyph unicode="&#x1d63e;" horiz-adv-x="723" d="M797 597l-37 -149h-11q-36 141 -183 141q-117 0 -211 -91.5t-94 -238.5q0 -78 41 -127t123 -49q63 0 118 25.5t124 84.5l52 -68q-152 -144 -321 -144q-135 0 -207 69t-72 185q0 121 62 226.5t167 167.5t226 62q80 0 135.5 -20t87.5 -74z" />
+<glyph unicode="&#x1d63f;" horiz-adv-x="709" d="M248 676h179q345 0 345 -232q0 -51 -15 -108t-50.5 -117.5t-86.5 -108.5t-132 -79t-179 -31h-229zM235 102h67q258 0 317 234q11 47 11 81q0 157 -199 157h-78z" />
+<glyph unicode="&#x1d640;" horiz-adv-x="635" d="M728 676l-25 -102h-350l-42 -167h241l-26 -103h-241l-50 -202h387l-52 -102h-490l168 676h480z" />
+<glyph unicode="&#x1d641;" horiz-adv-x="582" d="M725 676l-12 -102h-360l-43 -169h213l-25 -102h-213l-75 -303h-130l168 676h477z" />
+<glyph unicode="&#x1d642;" horiz-adv-x="746" d="M785 597l-37 -149h-11q-37 141 -188 141q-72 0 -139 -38t-113.5 -115t-46.5 -175q0 -78 41 -128t127 -50q77 0 166 43l32 129h-112v102h256l-70 -279q-46 -31 -75.5 -47t-92 -33t-133.5 -17q-137 0 -209.5 68t-72.5 184q0 120 61 225.5t166.5 169t228.5 63.5 q79 0 133.5 -20.5t88.5 -73.5z" />
+<glyph unicode="&#x1d643;" horiz-adv-x="715" d="M803 676l-168 -676h-130l74 297h-295l-74 -297h-130l168 676h130l-69 -277h295l69 277h130z" />
+<glyph unicode="&#x1d644;" horiz-adv-x="440" d="M534 676l-16 -102h-90l-118 -472h90l-34 -102h-287l11 102h90l118 472h-90l39 102h287z" />
+<glyph unicode="&#x1d645;" horiz-adv-x="481" d="M574 676l-136 -545q-26 -104 -96.5 -165.5t-171.5 -61.5q-96 0 -155 98l73 98h18q21 -49 41.5 -71.5t57.5 -22.5q44 0 65.5 30.5t34.5 81.5l139 558h130z" />
+<glyph unicode="&#x1d646;" horiz-adv-x="712" d="M816 676l-3 -14l-388 -278l282 -384h-170l-220 306l-40 -29l-69 -277h-128l168 676h128l-66 -263l361 263h145z" />
+<glyph unicode="&#x1d647;" horiz-adv-x="603" d="M612 102l-44 -102h-488l168 676h130l-143 -574h377z" />
+<glyph unicode="&#x1d648;" horiz-adv-x="913" d="M1001 676l-168 -676h-128l116 467l-351 -467h-27l-119 467l-116 -467h-128l168 676h161l104 -440h3l324 440h161z" />
+<glyph unicode="&#x1d649;" horiz-adv-x="724" d="M812 676l-173 -694l-100 20l-206 500l-125 -502h-128l168 676h157l173 -424l106 424h128z" />
+<glyph unicode="&#x1d64a;" horiz-adv-x="778" d="M840 434q0 -42 -13 -97q-40 -157 -163.5 -256t-278.5 -99q-128 0 -203.5 70t-75.5 187q0 126 66.5 231.5t170.5 163.5t218 58q128 0 203.5 -70.5t75.5 -187.5zM701 425q0 77 -42 121t-123 44q-120 0 -205.5 -98.5t-85.5 -244.5q0 -77 42 -120t123 -43q103 0 176.5 68.5 t102.5 184.5q12 48 12 88z" />
+<glyph unicode="&#x1d64b;" horiz-adv-x="581" d="M248 676h209q238 0 238 -144q0 -110 -90.5 -182t-222.5 -72h-103l-69 -278h-130zM304 380h71q89 0 137 32t48 92q0 70 -142 70h-65z" />
+<glyph unicode="&#x1d64c;" horiz-adv-x="779" d="M714 -160l-4 -16q-50 0 -75.5 0.5t-69.5 3.5t-68.5 9t-58 17.5t-54.5 28.5t-42 43.5t-35 60.5q-95 21 -148.5 86.5t-53.5 162.5q0 127 67 233.5t171.5 164t217.5 57.5q128 0 203 -69.5t75 -187.5q0 -167 -110 -290.5t-263 -155.5q17 -27 48.5 -41.5t57.5 -17t70 -3.5z M700 425q0 77 -42 120.5t-123 43.5q-119 0 -205 -98.5t-86 -243.5q0 -77 42.5 -120.5t123.5 -43.5q102 0 175.5 68.5t102.5 184.5q12 48 12 89z" />
+<glyph unicode="&#x1d64d;" horiz-adv-x="670" d="M248 676h216q116 0 175 -36t59 -104q0 -84 -62.5 -149.5t-158.5 -86.5l180 -300h-159l-175 291h-41l-72 -291h-130zM307 393h71q184 0 184 119q0 32 -34 47t-110 15h-65z" />
+<glyph unicode="&#x1d64e;" horiz-adv-x="554" d="M637 620l-38 -154h-14q-9 57 -55 90t-101 33q-47 0 -87 -25.5t-40 -73.5q0 -30 26 -50.5t73 -40.5q89 -38 126 -74t37 -87q0 -50 -31.5 -109.5t-80.5 -95.5q-72 -52 -191 -52q-133 0 -195 81l24 162h14q16 -69 72.5 -105t111.5 -36q42 0 72.5 13.5t44.5 34t19.5 37 t5.5 30.5q0 27 -21 44t-74 39q-87 37 -125.5 76.5t-38.5 93.5q0 102 82 171t192 69q69 0 120 -20t72 -51z" />
+<glyph unicode="&#x1d64f;" horiz-adv-x="641" d="M785 676l-15 -102h-240l-143 -574h-130l143 574h-243l39 102h589z" />
+<glyph unicode="&#x1d650;" horiz-adv-x="699" d="M792 676l-107 -430q-65 -265 -340 -265q-222 0 -222 171q0 43 13 94l107 430h128l-104 -419q-15 -60 -15 -82q0 -44 31 -68t87 -24q91 0 150 70q20 24 43 116l101 407h128z" />
+<glyph unicode="&#x1d651;" horiz-adv-x="690" d="M833 676l-479 -694h-28l-133 694h130l74 -465l306 465h130z" />
+<glyph unicode="&#x1d652;" horiz-adv-x="997" d="M1135 676l-427 -691l-28 1l-82 408h-3l-286 -409h-28l-83 691h130l38 -439l304 439l79 -439l255 439h131z" />
+<glyph unicode="&#x1d653;" horiz-adv-x="740" d="M853 676l-325 -333l172 -343h-154l-120 239l-232 -239h-154l334 343l-165 333h154l113 -228l223 228h154z" />
+<glyph unicode="&#x1d654;" horiz-adv-x="694" d="M842 676l-360 -394l-70 -282h-130l70 282l-164 394h145l111 -283l253 283h145z" />
+<glyph unicode="&#x1d655;" horiz-adv-x="653" d="M769 676l-4 -16l-513 -558h396l-40 -102h-583l3 16l512 558h-334l38 102h525z" />
+<glyph unicode="&#x1d656;" horiz-adv-x="489" d="M181 308l-65 44q36 61 98.5 91t139.5 30q67 0 110 -27.5t43 -76.5q0 -15 -4 -30l-66 -263q-7 -29 -9 -76h-125l4 44q-40 -33 -77.5 -45.5t-87.5 -12.5q-41 0 -67.5 25t-26.5 70q0 41 18.5 81.5t47.5 66.5q74 68 261 79l4 16q2 10 2 15q0 39 -62 39q-85 0 -126 -70h-12z M336 152l16 61q-28 0 -54.5 -4t-55.5 -13t-46.5 -29.5t-17.5 -49.5q0 -36 47 -36q60 0 111 71z" />
+<glyph unicode="&#x1d657;" horiz-adv-x="512" d="M283 426l-1 -1q62 48 137 48q65 0 102 -40t37 -111q0 -77 -39.5 -160t-97.5 -128q-61 -47 -152 -47q-30 0 -59 12.5t-40 30.5h-3l-103 -43h-13l172 689h120l-62 -250h2zM250 301l-40 -158q25 -61 79 -61q52 0 95 63.5t43 144.5q0 41 -17 64.5t-45 23.5q-65 0 -115 -77z " />
+<glyph unicode="&#x1d658;" horiz-adv-x="462" d="M524 368l-91 -57h-17q-1 67 -68 67q-47 0 -97 -54.5t-50 -139.5q0 -42 22 -69t63 -27q71 0 123 57l52 -67q-59 -55 -104 -73.5t-116 -18.5q-78 0 -124 46t-46 122q0 90 47.5 165t116 114.5t138.5 39.5q64 0 107.5 -27.5t43.5 -77.5z" />
+<glyph unicode="&#x1d659;" horiz-adv-x="518" d="M625 676l-137 -550q-17 -68 -24 -118l-120 -22l-6 3l11 45h-2q-58 -48 -134 -48q-69 0 -106.5 40t-37.5 113q0 142 84.5 238t195.5 96q56 0 96 -39l60 242h120zM379 169l35 140q-14 38 -29 53.5t-46 15.5q-56 0 -98 -67t-42 -140q0 -41 16.5 -65.5t48.5 -24.5 q35 0 60.5 22t54.5 66z" />
+<glyph unicode="&#x1d65a;" horiz-adv-x="452" d="M398 143l54 -66q-61 -54 -103.5 -72t-106.5 -18q-81 0 -126 44t-45 120q0 51 20.5 109.5t49.5 98.5q82 114 216 114q67 0 101 -40.5t34 -110.5q0 -41 -12 -89l-7 -28h-272q-5 -15 -5 -39q-1 -39 23 -58.5t62 -19.5q67 0 117 55zM233 300h143q4 16 4 30q0 48 -53 48 q-26 0 -55 -22.5t-39 -55.5z" />
+<glyph unicode="&#x1d65b;" horiz-adv-x="340" d="M533 639l-45 -90l-17 -1q-17 49 -72 49q-59 0 -80 -84l-13 -51h90l-23 -95h-90l-91 -367h-120l91 367h-58l23 95h58l11 42q24 92 83.5 140t132.5 48q49 0 73 -11t47 -42z" />
+<glyph unicode="&#x1d65c;" horiz-adv-x="504" d="M599 451l-24 -95h-56q7 -4 7 -23q0 -62 -42 -108t-96.5 -65.5t-108.5 -19.5h-25q-57 -6 -57 -41q0 -23 40 -23h84q160 0 160 -94q0 -52 -27.5 -89.5t-76 -58.5t-105 -30.5t-122.5 -9.5q-68 0 -108 23t-40 67q0 32 21.5 61.5t63.5 48.5q-28 15 -28 46q0 35 23.5 63.5 t83.5 61.5v2q-53 41 -53 93q0 87 77 150t180 63q42 0 77 -14q15 -6 25 -7t55 -1h72zM410 326q0 52 -71 52q-50 0 -79 -29.5t-29 -62.5q0 -51 72 -51q48 0 77.5 25.5t29.5 65.5zM309 -19h-105q-38 -4 -53 -21t-15 -33q0 -38 78 -38q138 0 138 66q0 26 -43 26z" />
+<glyph unicode="&#x1d65d;" horiz-adv-x="510" d="M278 415h2q73 58 143 58q119 0 119 -98q0 -25 -7 -53l-80 -322h-120l77 309q3 13 3 25q0 44 -52 44q-23 0 -56 -21t-59 -64l-73 -293h-120l168 676h120z" />
+<glyph unicode="&#x1d65e;" horiz-adv-x="245" d="M366 688l-36 -145h-145l36 145h145zM298 462l-114 -462h-125l114 462h125z" />
+<glyph unicode="&#x1d65f;" horiz-adv-x="324" d="M440 688l-36 -145h-145l36 145h145zM372 462l-119 -478q-22 -90 -84.5 -138t-140.5 -48q-75 0 -118 67l64 85h18q16 -50 46 -50q70 0 93 95l116 467h125z" />
+<glyph unicode="&#x1d660;" horiz-adv-x="519" d="M599 462l-4 -18l-252 -171l163 -273h-142l-118 205l-24 -16l-47 -189h-120l168 676h120l-91 -364l213 150h134z" />
+<glyph unicode="&#x1d661;" horiz-adv-x="235" d="M348 676l-168 -676h-125l155 625l121 51h17z" />
+<glyph unicode="&#x1d662;" horiz-adv-x="776" d="M530 412h1q78 61 160 61q118 0 118 -95q0 -23 -8 -55l-80 -323h-118l77 310q3 14 3 25q0 44 -52 44q-25 0 -55 -20.5t-56 -64.5l-73 -294h-118l77 310q3 14 3 25q0 44 -52 44q-23 0 -54 -21t-57 -64l-73 -294h-118l114 462h114l-12 -50h2q78 61 144 61q94 0 113 -61z" />
+<glyph unicode="&#x1d663;" horiz-adv-x="510" d="M273 412h2q78 61 148 61q119 0 119 -97q0 -25 -7 -53l-80 -323h-120l77 310q3 14 3 25q0 44 -52 44q-23 0 -56 -21t-59 -64l-73 -294h-120l114 462h116z" />
+<glyph unicode="&#x1d664;" horiz-adv-x="501" d="M542 298q0 -127 -92 -219.5t-204 -92.5q-78 0 -126 48t-48 127q0 131 93 221.5t206 90.5q78 0 124.5 -48t46.5 -127zM417 295q0 83 -76 83q-59 0 -100.5 -65.5t-41.5 -142.5q0 -89 71 -89q40 0 71 27t46 65.5t22.5 70t7.5 51.5z" />
+<glyph unicode="&#x1d665;" horiz-adv-x="512" d="M274 416h2q68 57 147 57q63 0 99.5 -39t36.5 -105q0 -140 -88 -241.5t-202 -101.5q-52 0 -88 41l-48 -195l-113 -37h-17l166 667h116zM247 291l-35 -141q13 -38 28.5 -53.5t46.5 -15.5q60 0 101.5 74.5t41.5 149.5q0 74 -63 74t-120 -88z" />
+<glyph unicode="&#x1d666;" horiz-adv-x="512" d="M574 473l-159 -641l-113 -37h-17l58 231l-2 1q-52 -41 -127 -41q-69 0 -107 43t-38 113q0 130 89.5 230.5t202.5 100.5q64 0 96 -39l100 39h17zM376 158l39 158q-27 62 -76 62q-48 0 -95 -61t-47 -153q0 -39 17 -61t49 -22q61 0 113 77z" />
+<glyph unicode="&#x1d667;" horiz-adv-x="411" d="M519 455l-25 -98h-16q-15 22 -53 22q-48 0 -107 -54t-96 -136l-47 -189h-120l114 462h120l-22 -88h2q45 52 92.5 75.5t85.5 23.5q49 0 72 -18z" />
+<glyph unicode="&#x1d668;" horiz-adv-x="385" d="M442 412l-26 -106h-15q-26 72 -107 72q-29 0 -44 -16t-15 -30q0 -17 14 -29t41 -25q60 -28 82.5 -50.5t22.5 -54.5q0 -77 -62 -131.5t-159 -54.5q-50 0 -78 14t-59 49l30 120h15q8 -43 44 -65.5t75 -22.5q25 0 46.5 15.5t21.5 38.5q0 12 -11 22t-42 25q-57 28 -80 53 t-23 58q0 72 55.5 125.5t144.5 53.5q49 0 78 -15t51 -46z" />
+<glyph unicode="&#x1d669;" horiz-adv-x="386" d="M447 462l-23 -95h-107l-54 -218q-4 -13 -4 -25q0 -41 45 -41q40 0 77 32h18l-34 -94q-45 -33 -124 -33q-47 0 -78 24.5t-31 72.5q0 22 5 41l60 241h-99l4 17l82 78h36l16 61l127 108h20l-43 -169h107z" />
+<glyph unicode="&#x1d66a;" horiz-adv-x="518" d="M569 462l-87 -352q-16 -67 -17 -100l-130 -25l17 70h-2q-79 -69 -160 -69q-109 0 -109 94q0 24 8 58l80 324h120l-77 -311q-3 -13 -3 -25q0 -45 52 -45q22 0 56 24.5t61 67.5l71 289h120z" />
+<glyph unicode="&#x1d66b;" horiz-adv-x="462" d="M561 462l-321 -476h-26l-85 476h130l23 -253h2l146 253h131z" />
+<glyph unicode="&#x1d66c;" horiz-adv-x="701" d="M798 462l-313 -476h-26l-46 253l-179 -253h-26l-77 476h130l19 -257h2l105 174l-15 83h131l26 -245h2l136 245h131z" />
+<glyph unicode="&#x1d66d;" horiz-adv-x="506" d="M582 462l-202 -223l106 -239h-138l-65 143l-125 -143h-138l219 244l-94 218h137l53 -121l109 121h138z" />
+<glyph unicode="&#x1d66e;" horiz-adv-x="472" d="M569 462l-303 -496q-55 -90 -107 -130t-120 -40q-44 0 -66 22l24 98h15q21 -25 53 -25q63 0 120 103l-53 468h131l25 -275h2l148 275h131z" />
+<glyph unicode="&#x1d66f;" horiz-adv-x="441" d="M530 462l-6 -26l-318 -341h234l-32 -95h-387l6 25l318 342h-207l31 95h361z" />
+<glyph unicode="&#x1d71c;" horiz-adv-x="759" d="M724 23l-2 -23h-319l4 23h31q51 0 51 45q0 22 -2 34l-15 108h-159l-80 -139q-6 -12 -6 -22q0 -26 22 -26h56l-6 -23h-260l4 23q37 4 60.5 19t47.5 56l346 587h49l94 -624q6 -38 47 -38h37zM466 256l-23 178l-103 -178h126z" />
+<glyph unicode="&#x1d71d;" horiz-adv-x="726" d="M197 669h265q41 0 74.5 -3t68 -13t57.5 -26t38 -44t15 -66q0 -100 -100 -147q-27 -13 -64 -24q49 -9 89.5 -45.5t40.5 -87.5q0 -99 -73.5 -156t-225.5 -57h-340l4 23h40q42 0 58.5 14.5t24.5 47.5l116 502q2 8 2 22q-2 20 -13 28.5t-43 8.5h-37zM440 624l-58 -251 q12 -2 32 -2q24 0 40 4q54 12 81.5 52t27.5 98q0 22 -4.5 42t-22.5 38.5t-47 18.5h-49zM373 324l-64 -274q24 -5 52 -5q68 0 116.5 49t48.5 127q0 103 -122 103h-31z" />
+<glyph unicode="&#x1d71e;" horiz-adv-x="634" d="M749 669l-43 -184h-23q5 24 5 50q0 46 -27.5 67.5t-66.5 21.5h-155l-125 -542q-3 -15 -3 -25q0 -19 13.5 -26.5t45.5 -7.5h52l-5 -23h-375l4 23h36q43 0 60.5 14.5t24.5 46.5l115 503q3 15 3 37q-1 14 -12.5 18t-43.5 4h-38l3 23h555z" />
+<glyph unicode="&#x1d71f;" horiz-adv-x="632" d="M589 0h-557l405 685h48zM427 102l-44 332l-192 -332h236z" />
+<glyph unicode="&#x1d720;" horiz-adv-x="732" d="M754 669l-40 -168h-23q3 17 3 38q0 34 -22.5 54t-46.5 25.5t-52 5.5h-135l-55 -239h55q34 0 57 5t46.5 27.5t33.5 62.5h22l-54 -251h-23q6 24 6 65q0 46 -85 46h-69l-58 -258q-2 -12 -2 -17q0 -20 42 -20h65q111 0 171 36.5t91 124.5h22l-61 -206h-600l4 23h36 q42 0 60 14.5t25 46.5l115 504q2 12 2 16q0 42 -59 42h-37l4 23h562z" />
+<glyph unicode="&#x1d721;" horiz-adv-x="797" d="M830 669l-548 -623h194q32 0 55.5 2t52 10.5t49 23t38.5 41t28 64.5h23l-44 -187h-612l555 624h-177q-42 0 -68 -3t-60.5 -13.5t-60.5 -36.5t-43 -68h-23l46 166h595z" />
+<glyph unicode="&#x1d722;" horiz-adv-x="891" d="M946 669l-5 -23h-37q-43 0 -60 -14t-24 -47l-114 -503q-6 -21 -6 -22v-3q1 -19 12.5 -26.5t45.5 -7.5h41l-5 -23h-349l4 23h23q43 0 61.5 14.5t25.5 46.5l57 251h-242l-59 -253q0 -3 -2 -10.5t-2 -12.5q2 -21 14 -28.5t46 -7.5h25l-5 -23h-349l4 23h36q43 0 61 14.5 t25 46.5l115 503q3 12 3 21q0 38 -57 38h-40l6 23h348l-3 -23h-25q-44 0 -61 -14t-24 -46l-46 -203h242l47 204q3 12 3 23q0 36 -60 36h-37l3 23h364z" />
+<glyph unicode="&#x1d723;" horiz-adv-x="783" d="M533 440h23q-43 -93 -43 -199h-23v15q0 41 -30 41h-115q-23 0 -34 -9.5t-30 -46.5h-23q45 87 45 199h22q0 -33 9 -45t30 -12h116q17 0 28 11.5t25 45.5zM755 430q0 -84 -34.5 -165.5t-92 -143t-137 -99.5t-165.5 -38q-128 0 -199.5 74.5t-71.5 186.5q0 74 30.5 151.5 t84.5 142t136.5 105.5t176.5 41q127 0 199.5 -75.5t72.5 -179.5zM601 465q0 73 -32 123t-97 50q-53 0 -98 -31.5t-74 -79.5t-50 -107.5t-30.5 -114t-9.5 -100.5q0 -75 31.5 -124.5t94.5 -49.5q60 0 112 45.5t84 113t50.5 141t18.5 134.5z" />
+<glyph unicode="&#x1d724;" horiz-adv-x="502" d="M557 669l-4 -23h-38q-43 0 -60.5 -14.5t-24.5 -46.5l-116 -503q-1 -5 -1 -25q1 -18 13 -26t45 -8h37l-4 -23h-362l4 23h38q43 0 59 14t24 47l115 502q3 12 3 21q0 39 -57 39h-37l4 23h362z" />
+<glyph unicode="&#x1d725;" horiz-adv-x="795" d="M839 669l-4 -23q-38 0 -65.5 -14.5t-69.5 -48.5l-248 -201l191 -284q33 -49 60 -62t75 -13l-4 -23h-328l4 23h29q29 0 29 22q0 18 -16 40l-138 208l-48 -211q-1 -5 -1 -21q1 -21 13 -29.5t45 -8.5h38l-5 -23h-354l5 23h30q44 0 59 14t23 47l115 503q4 16 4 23 q0 36 -58 36h-37l4 23h347l-6 -23h-27q-40 0 -56.5 -15.5t-24.5 -48.5l-40 -178h2l243 198q15 13 15 23q0 9 -8.5 15t-22.5 6h-24l4 23h250z" />
+<glyph unicode="&#x1d726;" horiz-adv-x="759" d="M724 23l-2 -23h-319l4 23h31q51 0 51 45q0 22 -2 34l-44 332l-210 -363q-6 -12 -6 -22q0 -26 22 -26h56l-6 -23h-260l4 23q37 4 60.5 19t47.5 56l346 587h49l94 -624q6 -38 47 -38h37z" />
+<glyph unicode="&#x1d727;" horiz-adv-x="1016" d="M1071 669l-3 -23h-34q-46 0 -63.5 -15.5t-25.5 -49.5l-115 -499q-3 -10 -3 -20q0 -39 59 -39h39l-4 -23h-362l4 23h35q44 0 60.5 14.5t24.5 46.5l82 354h-1l-283 -438h-56l-90 441l-80 -348q-3 -15 -3 -40q2 -17 12.5 -23.5t42.5 -6.5h38l-3 -23h-300l4 23h36 q43 0 61.5 17.5t26.5 54.5l111 486q4 12 4 33q0 17 -13.5 24.5t-44.5 7.5h-39l4 23h246l91 -468l297 468h245z" />
+<glyph unicode="&#x1d728;" horiz-adv-x="869" d="M924 669l-3 -23h-38q-43 0 -61.5 -15t-25.5 -49l-131 -582h-57l-263 491l-92 -409q-2 -12 -2 -18v-8q1 -18 12.5 -25.5t44.5 -7.5h39l-4 -23h-301l4 23h36q43 0 60.5 14.5t24.5 46.5l117 510q-21 52 -71 52h-38l3 23h232l222 -435l80 350q2 7 2 20q0 42 -57 42h-37l4 23 h300z" />
+<glyph unicode="&#x1d729;" horiz-adv-x="718" d="M757 669l-38 -182h-23q4 15 4 30q0 46 -53 46h-337q-33 0 -59 -20t-34 -56h-23l38 182h525zM635 459l-51 -239h-23q4 16 4 31q-1 36 -45 36h-204q-40 0 -52.5 -13.5t-21.5 -53.5h-23l51 239h23q-5 -22 -5 -32q0 -20 11 -27t38 -7h203q31 0 47 14t25 52h23zM663 187 l-39 -187h-567l39 187h23q-4 -16 -4 -25q0 -50 71 -50h349q52 0 73.5 15.5t31.5 59.5h23z" />
+<glyph unicode="&#x1d72a;" horiz-adv-x="777" d="M755 432q0 -117 -58 -220.5t-157.5 -165.5t-213.5 -62q-128 0 -199.5 75t-71.5 188q0 107 51 206t151.5 165.5t225.5 66.5q127 0 199.5 -74.5t72.5 -178.5zM601 467q0 73 -32 122t-97 49t-118 -46.5t-83 -116t-45.5 -140t-15.5 -128.5q0 -75 31.5 -125.5t94.5 -50.5 q60 0 112 45.5t84 114t50.5 142t18.5 134.5z" />
+<glyph unicode="&#x1d72b;" horiz-adv-x="887" d="M942 669l-5 -23h-37q-43 0 -60 -13.5t-24 -46.5l-115 -504q-4 -20 -4 -26q0 -18 12.5 -25.5t45.5 -7.5h40l-5 -23h-349l5 23h22q45 0 61.5 11.5t24.5 49.5l123 540h-242l-124 -542q-3 -15 -3 -26q0 -15 8 -22.5t19 -9t32 -1.5h25l-5 -23h-348l5 23h35q42 0 59.5 14 t25.5 47l115 504q1 6 2 20t1 16q0 8 -15 15t-42 7h-40l5 23h752z" />
+<glyph unicode="&#x1d72c;" horiz-adv-x="612" d="M198 669h284q128 0 189.5 -38t61.5 -125q0 -83 -74 -144.5t-223 -61.5q-46 0 -67 3l-51 -221q-4 -20 -4 -24q2 -21 13.5 -28t46.5 -7h52l-4 -23h-380l4 23h40q43 0 60.5 14.5t24.5 46.5l115 504q3 12 3 21q-1 19 -14 28t-46 9h-37zM441 623l-61 -273q22 -5 40 -5 q69 0 113 49t44 127q0 44 -26 73.5t-80 29.5q-21 0 -30 -1z" />
+<glyph unicode="&#x1d72d;" horiz-adv-x="783" d="M755 430q0 -84 -34.5 -165.5t-92 -143t-137 -99.5t-165.5 -38q-128 0 -199.5 74.5t-71.5 186.5q0 74 30.5 151.5t84.5 142t136.5 105.5t176.5 41q127 0 199.5 -75.5t72.5 -179.5zM237 383h356q8 46 8 82q0 73 -32 123t-97 50q-58 0 -106.5 -38.5t-78.5 -93t-50 -123.5z M574 297h-356q-8 -45 -8 -92q0 -75 31.5 -124.5t94.5 -49.5q81 0 142.5 77t95.5 189z" />
+<glyph unicode="&#x1d72e;" horiz-adv-x="759" d="M787 669l-39 -168h-23q3 17 3 50q0 24 -9 39.5t-26 22t-33.5 9t-39.5 2.5h-212l159 -250l-286 -266h270q63 0 97.5 19t63.5 73h25l-76 -200h-597l372 338l-217 331h568z" />
+<glyph unicode="&#x1d72f;" horiz-adv-x="568" d="M700 669l-44 -187h-24q7 21 7 54q0 88 -111 88h-78l-123 -541q-4 -24 -4 -25q1 -19 12.5 -27t44.5 -8h42l-3 -23h-368l4 23h40q43 0 60.5 14.5t24.5 46.5l124 540h-75q-74 0 -119 -37.5t-60 -104.5h-22l43 187h629z" />
+<glyph unicode="&#x1d730;" horiz-adv-x="589" d="M721 681l-9 -23q-20 0 -42 -15t-36.5 -31t-40.5 -48l-200 -245l-54 -233q-4 -18 -4 -29q0 -19 12 -26.5t45 -7.5h40l-6 -23h-361l8 23h34q42 0 58 14t24 47l57 244l-80 205q-13 34 -22.5 52.5t-25 37.5t-36.5 27t-51 8l6 23q49 4 103 4q35 0 62 -9.5t42 -20.5t30 -36 t20 -38l17 -45l51 -141l151 181q47 57 88 81t120 24z" />
+<glyph unicode="&#x1d731;" horiz-adv-x="827" d="M546 587l-5 -24q49 0 93 -10t82 -29.5t60.5 -54t22.5 -79.5q0 -58 -26.5 -107t-67 -81t-90.5 -55t-96 -33t-84 -10h-1l-7 -32q-1 -6 -1 -19q0 -30 52 -30h47l-5 -23h-365l6 23q61 0 85.5 8.5t30.5 35.5l8 37q-109 0 -183 48.5t-74 140.5q0 67 35 121t90 85.5t116.5 47.5 t121.5 16l10 44q1 2 1 7q0 14 -16 23t-42 9h-41l5 23h364l-5 -23h-41q-39 0 -56 -14.5t-24 -44.5zM529 517l-85 -366q63 0 127.5 71.5t64.5 157.5q0 56 -29.5 96.5t-77.5 40.5zM298 151l85 366q-66 0 -131.5 -78t-65.5 -154q0 -59 31 -96.5t81 -37.5z" />
+<glyph unicode="&#x1d732;" horiz-adv-x="808" d="M830 669l-3 -23h-24q-15 0 -28.5 -3.5t-21.5 -6t-19.5 -13t-15 -14t-16.5 -19t-15 -18.5l-177 -212l98 -270q13 -35 26 -51t36 -16h36l-4 -23h-316l3 23h28q49 0 49 36q0 15 -5 27l-63 171l-154 -179q-8 -9 -8 -22q0 -14 10.5 -23.5t28.5 -9.5h42l-4 -23h-285l4 23 q84 10 142 77l198 229l-89 237q-29 80 -84 80h-27l4 23h318l-4 -23h-39q-34 0 -34 -27q0 -8 8 -32l53 -155l137 162q10 12 10 27q0 25 -28 25h-31l4 23h260z" />
+<glyph unicode="&#x1d733;" horiz-adv-x="694" d="M781 684l-5 -23q-9 0 -16.5 -2.5t-13.5 -9t-11 -12.5t-10 -16.5t-7.5 -17t-6 -19.5t-5 -18t-4.5 -18t-3 -14q-27 -118 -55 -158q-77 -112 -255 -112l-39 -171q-6 -24 -6 -36q0 -34 80 -34h17l-5 -23h-362l5 23h23q48 0 69.5 14t31.5 58l39 169q-48 0 -94 14t-81 49 t-35 84q0 33 18.5 94t18.5 94q0 21 -10 41.5t-29 21.5l5 23h33q62 0 94 -39t32 -102q0 -46 -17 -102q-13 -43 -13 -63q0 -64 89 -68l62 271q3 10 3 21q0 44 -72 44q-18 0 -25 -1l6 23h362l-6 -23h-29q-5 0 -23 -1.5t-24 -5.5t-17.5 -10.5t-17 -18.5t-9.5 -28l-63 -271 q87 0 124 85q12 26 23 77.5t18 71.5q25 69 68.5 104t114.5 35h33z" />
+<glyph unicode="&#x1d734;" horiz-adv-x="826" d="M300 92l6 31q-74 13 -116 62.5t-42 122.5q0 61 27 126t76 121.5t127.5 93t170.5 36.5q130 0 198 -69t68 -178q0 -115 -79 -201t-196 -114l-9 -31h153q42 0 63 75h23l-38 -167h-305l42 153q79 17 134 113t55 197q0 70 -30.5 122t-89.5 52q-62 0 -116.5 -55t-84.5 -134.5 t-30 -155.5q0 -118 83 -139l-28 -153h-305l38 167h23q-5 -25 -5 -38q0 -20 9 -28.5t32 -8.5h146z" />
+<glyph unicode="&#x1d735;" horiz-adv-x="632" d="M600 669l-405 -685h-48l-104 685h557zM441 567h-236l44 -332z" />
+<glyph unicode="&#x1d736;" horiz-adv-x="624" d="M630 449l-163 -258q-1 -6 -1 -12q0 -17 1 -23q9 -98 41 -98q35 0 58 76l24 -7q-34 -139 -121 -139q-33 0 -58 24.5t-31 54.5q-72 -77 -181 -77q-72 0 -113.5 43.5t-41.5 124.5q0 117 79.5 210t196.5 93q54 0 88.5 -28.5t47.5 -70.5l49 87h125zM369 280q0 60 -14.5 100.5 t-47.5 40.5q-43 0 -95 -83.5t-52 -194.5q0 -48 14.5 -82t42.5 -34q36 0 79 57.5t67 120.5q6 33 6 75z" />
+<glyph unicode="&#x1d737;" horiz-adv-x="555" d="M54 -114l114 487q24 104 63 166.5t102 107.5q53 38 129 38q51 0 86 -33.5t35 -84.5q0 -57 -31.5 -105t-81.5 -68v-2q38 -6 63 -36.5t25 -89.5q0 -65 -28.5 -127t-90 -106.5t-143.5 -44.5q-67 0 -97 18l-28 -124q-12 -54 -26 -87h-117q10 24 26 91zM304 480l-87 -393 q0 -30 19.5 -44.5t47.5 -14.5q64 0 110 74.5t46 152.5q0 117 -52 117q-9 0 -23.5 -3t-21.5 -3q-33 0 -33 25q0 14 14 25t42 11q7 0 30.5 -5.5t27.5 -5.5q26 0 41 43.5t15 88.5q0 40 -18 62.5t-44 22.5q-47 0 -72 -37t-42 -116z" />
+<glyph unicode="&#x1d738;" horiz-adv-x="490" d="M503 449l-264 -401q0 -35 -5 -73t-16 -80.5t-35 -70t-57 -27.5q-29 0 -43 19.5t-14 41.5q0 20 10 45.5t20.5 43.5t31.5 50t29 46q13 95 13 208q0 47 -10.5 94t-34.5 47q-38 0 -61 -81h-23q41 151 121 151q49 0 66.5 -36.5t17.5 -98.5q0 -48 -7 -125l135 247h126z" />
+<glyph unicode="&#x1d739;" horiz-adv-x="538" d="M44 169v1q0 89 67 166.5t170 94.5q-45 23 -74.5 55.5t-29.5 68.5q0 64 57 97t135 33q48 0 95 -17t47 -46q0 -62 -59 -62q-23 0 -40.5 12.5t-26.5 28t-25.5 28t-39.5 12.5q-68 0 -68 -56q0 -24 29.5 -46.5t71.5 -43.5t84 -46t71.5 -66t29.5 -93q0 -125 -91.5 -211.5 t-216.5 -86.5q-87 0 -136.5 47t-49.5 130zM422 259q0 55 -39 94.5t-68 39.5q-69 -17 -112 -84t-43 -154q0 -69 20.5 -96t67.5 -27q67 0 120.5 77.5t53.5 149.5z" />
+<glyph unicode="&#x1d73a;" horiz-adv-x="495" d="M451 389l-18 -7q-11 13 -19 20t-30 13.5t-54 6.5q-52 0 -89.5 -31.5t-37.5 -76.5q0 -24 16.5 -37.5t43.5 -13.5q5 0 31 4.5t43 4.5q47 0 47 -22q0 -37 -65 -37q-5 0 -27.5 3t-31.5 3q-38 0 -77 -30.5t-39 -78.5q0 -37 28.5 -56t72.5 -19q43 0 76.5 17.5t74.5 61.5l18 -8 q-92 -116 -224 -116q-72 0 -117 31.5t-45 76.5q0 48 29.5 86.5t78.5 55.5v3q-22 7 -35.5 27t-13.5 40q0 62 61 107t166 45q48 0 87.5 -22t49.5 -51z" />
+<glyph unicode="&#x1d73b;" horiz-adv-x="472" d="M330 685l7 -21q-39 -15 -59.5 -36.5t-20.5 -39.5q0 -33 31 -41q118 104 186 104q48 0 48 -30q0 -39 -65.5 -84t-133.5 -45q-73 -49 -123 -133t-50 -180q0 -42 26.5 -64t73.5 -22q73 0 114.5 -23.5t41.5 -69.5q0 -72 -74 -138q-74 -65 -121 -65q-37 0 -57 18.5t-20 44.5 q0 54 61 54q25 0 36.5 -21t25.5 -21q30 0 51.5 22t21.5 58q0 25 -14.5 35.5t-47.5 10.5q-5 0 -34 -3.5t-39 -3.5q-64 0 -107.5 41.5t-43.5 105.5q0 97 50.5 186.5t155.5 185.5q-29 4 -51.5 20t-22.5 39q0 39 38 70.5t116 45.5z" />
+<glyph unicode="&#x1d73c;" horiz-adv-x="517" d="M248 356l6 1q25 47 70.5 76t97.5 29q49 0 69 -19.5t20 -55.5q0 -26 -8 -64l-76 -325q-8 -35 -15 -94.5t-7 -87.5q0 -7 6 -21h-113q-13 25 -13 52q0 51 100 467q3 15 3 38q0 35 -29 35q-40 0 -92 -93.5t-74 -183.5l-26 -110h-115l74 318q6 26 6 52q0 22 -18 22 q-24 0 -61 -45l-20 12q28 43 71.5 73t89.5 30q60 0 60 -47q0 -19 -6 -59z" />
+<glyph unicode="&#x1d73d;" horiz-adv-x="566" d="M555 476q0 -127 -50.5 -241t-129.5 -180t-163 -66q-80 0 -124 61t-44 165q0 116 47 225.5t124 177t159 67.5q83 0 132 -54.5t49 -154.5zM184 359h243q13 67 13 128q0 87 -14.5 122.5t-51.5 35.5q-57 0 -110 -84.5t-80 -201.5zM417 315h-245q-15 -71 -15 -132 q0 -154 70 -154q57 0 107 83t83 203z" />
+<glyph unicode="&#x1d73e;" horiz-adv-x="318" d="M255 104l19 -12q-57 -101 -152 -101q-67 0 -67 56q0 16 4 31l64 276q6 26 6 36q0 18 -20 18q-21 0 -37 -3l-4 23l197 34l-77 -331q-8 -40 -8 -48q0 -10 6 -17.5t15 -7.5q5 0 10 2t8.5 4.5t9 8t8.5 9t9 11.5t9 11z" />
+<glyph unicode="&#x1d73f;" horiz-adv-x="560" d="M240 294l129 101q84 67 140 67q68 0 68 -50q0 -62 -59 -62q-18 0 -28.5 7t-13.5 16t-10.5 16t-19.5 7q-14 0 -49 -29l-114 -93l112 -199q18 -32 40 -42t63 -10l-5 -23h-269l5 23h29q28 0 28 15q0 14 -13 36l-60 107l-42 -181h-116l82 363q4 16 4 28q0 17 -26 17 q-15 0 -32 -3l-3 23l196 34z" />
+<glyph unicode="&#x1d740;" horiz-adv-x="570" d="M514 130h23q-13 -62 -45 -104t-83 -42q-69 0 -69 117q0 22 2.5 46t8 64t8.5 64l-192 -275h-112l302 435v50q0 130 -55 130q-37 0 -60 -77h-23q40 147 125 147q19 0 30.5 -11t16.5 -34.5t6.5 -45t1.5 -55.5v-387q0 -53 16.5 -75.5t38.5 -22.5q16 0 32.5 20t27.5 56z" />
+<glyph unicode="&#x1d741;" horiz-adv-x="636" d="M583 83l20 -12q-58 -103 -161 -103q-29 0 -43 18t-14 43q0 28 16 78l-3 1q-23 -44 -62 -77t-73 -33q-38 0 -55 27h-2l-15 -59l-13 -52q-4 -16 -10.5 -38.5t-10.5 -34.5t-9.5 -24.5t-11.5 -21.5h-103q24 40 48 138l122 516h113l-74 -316q-3 -12 -3 -23q1 -21 9.5 -29 t30.5 -8q49 0 103.5 91.5t82.5 202.5l21 82h111l-79 -338q-7 -28 -7 -44q0 -31 19 -31q22 0 53 47z" />
+<glyph unicode="&#x1d742;" horiz-adv-x="523" d="M510 455l24 -7q-30 -122 -102.5 -228t-188.5 -230h-52l-58 378q-5 34 -76 34l-2 23q99 4 182 34l45 -315h1q67 65 117.5 130.5t69.5 100.5t40 80z" />
+<glyph unicode="&#x1d743;" horiz-adv-x="476" d="M332 685l6 -23q-79 -32 -79 -73q0 -7 2.5 -13.5t5 -9.5t5.5 -5.5t3 -3.5q31 29 78 51.5t80 22.5q54 0 54 -29q0 -41 -53.5 -66t-121.5 -25q-32 0 -49 -23t-17 -55q0 -21 14 -43q68 39 134 39q74 0 74 -31q0 -22 -15.5 -37t-41 -21t-45 -8.5t-38.5 -2.5q-32 0 -64 8 q-56 -24 -95 -68.5t-39 -103.5q0 -39 23 -55t77 -16q97 0 142 -21.5t45 -72.5q0 -70 -67 -134q-73 -69 -128 -69q-37 0 -57 19t-20 46q0 23 15 37.5t44 14.5q20 0 30 -11t16.5 -21.5t18.5 -10.5q31 0 51.5 24.5t20.5 57.5q0 45 -61 45q-10 0 -34.5 -3.5t-35.5 -3.5 q-84 0 -133 29.5t-49 91.5q0 138 174 249q-28 27 -28 75q0 22 18 48t41 37v3q-23 3 -38 18.5t-15 37.5q0 75 152 105z" />
+<glyph unicode="&#x1d744;" horiz-adv-x="561" d="M539 297q0 -136 -90.5 -221.5t-217.5 -85.5q-88 0 -137.5 48.5t-49.5 131.5q0 126 87.5 209t207.5 83q91 0 145.5 -43t54.5 -122zM423 300q0 64 -25 93t-64 29q-64 0 -119 -88t-55 -176q0 -71 21 -99.5t67 -28.5q68 0 121.5 86t53.5 184z" />
+<glyph unicode="&#x1d745;" horiz-adv-x="579" d="M590 449l-21 -91h-113q-17 -47 -35 -119.5t-18 -114.5q0 -22 9 -41.5t25 -19.5q37 0 65 71l24 -6q-12 -53 -55.5 -94t-101.5 -41q-73 0 -73 83q0 24 7 61q9 44 32.5 121.5t29.5 99.5h-61q-10 -28 -24 -83l-26 -100q-13 -45 -31.5 -90.5t-47 -71.5t-65.5 -26q-71 0 -71 51 q0 36 42 51q39 14 58 68l71 201q-76 0 -118 -54h-23q43 76 92.5 110.5t130.5 34.5h298z" />
+<glyph unicode="&#x1d746;" horiz-adv-x="595" d="M58 -110l62 267q24 101 67.5 169t94.5 101q53 35 115 35q67 0 116 -45t49 -135q0 -119 -85.5 -206.5t-188.5 -87.5q-54 0 -87 19l-25 -110q-15 -69 -28 -102h-115q8 20 25 95zM252 240l-33 -152q1 -30 20.5 -45t47.5 -15q55 0 108 82t53 171q0 131 -76 131q-39 0 -72 -50 t-48 -122z" />
+<glyph unicode="&#x1d747;" horiz-adv-x="480" d="M508 388q0 -19 -16 -36t-40 -17q-29 0 -51.5 23.5t-45.5 23.5q-79 0 -146.5 -65t-67.5 -152q0 -39 23 -55t77 -16q97 0 142 -21.5t45 -72.5q0 -35 -19 -75t-48 -68q-64 -60 -128 -60q-37 0 -57 19t-20 46q0 23 15 37.5t44 14.5q20 0 30 -11t16.5 -21.5t18.5 -10.5 q31 0 51.5 24.5t20.5 57.5q0 45 -61 45q-10 0 -34.5 -3.5t-35.5 -3.5q-84 0 -133 29.5t-49 91.5q0 75 49 151.5t125 127.5q107 71 192 71q46 0 74.5 -19.5t28.5 -54.5z" />
+<glyph unicode="&#x1d748;" horiz-adv-x="592" d="M603 449l-21 -91h-176q8 -17 26 -32t34 -25.5t28.5 -33.5t12.5 -56q0 -90 -81.5 -155.5t-193.5 -65.5q-89 0 -138.5 47.5t-49.5 129.5q0 112 84.5 197t226.5 85h248zM391 207v1q0 56 -15 89.5t-44 60.5q-67 0 -119.5 -54.5t-52.5 -148.5q0 -70 21 -97.5t67 -27.5 q58 0 100.5 56t42.5 121z" />
+<glyph unicode="&#x1d749;" horiz-adv-x="469" d="M502 449l-21 -91h-149l-53 -188q-8 -29 -8 -56q0 -51 32 -51q37 0 67 71l22 -6q-11 -51 -55 -93t-94 -42q-38 0 -63.5 17t-25.5 53q0 52 15 100l59 195h-32q-36 0 -77 -23.5t-63 -65.5h-23q23 63 82.5 121.5t131.5 58.5h255z" />
+<glyph unicode="&#x1d74a;" horiz-adv-x="552" d="M303 423l5 39q102 0 164.5 -43t62.5 -131q0 -124 -90.5 -211t-200.5 -87q-74 0 -121 27.5t-47 81.5q0 20 12 71l29 125q12 53 12 66q0 27 -17 27q-24 0 -59 -45l-20 12q27 43 69 73t91 30q29 0 44 -13.5t15 -34.5q0 -23 -10 -67l-40 -172q-9 -40 -9 -64q0 -77 67 -77 q68 0 122 82t54 178q0 133 -133 133z" />
+<glyph unicode="&#x1d74b;" horiz-adv-x="706" d="M259 30l27 122q22 101 52 155t92 105q15 13 47 27.5t52 14.5q58 0 98 -44.5t40 -118.5q0 -115 -82 -204t-220 -97l-44 -195h-117l45 195q-92 7 -143 58.5t-51 129.5q0 120 88 202t209 82h41l-10 -39q-82 0 -147 -80.5t-65 -172.5q0 -54 24 -93.5t64 -46.5zM424 241 l-49 -211q63 6 119.5 85t56.5 182q0 62 -10 84.5t-29 22.5q-50 0 -88 -163z" />
+<glyph unicode="&#x1d74c;" horiz-adv-x="621" d="M676 449l-293 -360l13 -121q11 -102 44 -102q47 0 67 79h23q-17 -75 -44 -112t-73 -37q-23 0 -38 12.5t-22 38.5t-10 49.5t-4 60.5l-3 89l-182 -230h-121l302 363l-6 83q-5 72 -19.5 101t-40.5 29q-18 0 -38 -20.5t-29 -55.5h-23q8 59 36 102.5t85 43.5q39 0 56.5 -38 t20.5 -119l3 -86l177 230h119z" />
+<glyph unicode="&#x1d74d;" horiz-adv-x="701" d="M756 462l-5 -39q-53 -5 -80.5 -42t-42.5 -100q-12 -49 -23.5 -85t-33.5 -77.5t-50 -67.5t-72.5 -43.5t-99.5 -17.5l-44 -195h-116l44 195q-79 6 -123.5 48.5t-44.5 120.5q0 29 20.5 93t19.5 100q-2 61 -72 71l7 39h49q65 0 94.5 -32t29.5 -83q0 -34 -16 -99.5t-16 -98.5 q0 -49 16.5 -81.5t44.5 -37.5l98 419h116l-98 -419q36 0 69.5 44t53 96.5t33.5 112.5q10 40 21.5 67.5t32.5 55.5t56 42t83 14h49z" />
+<glyph unicode="&#x1d74e;" horiz-adv-x="687" d="M441 462h39q85 0 135 -49.5t50 -127.5q0 -115 -76 -205t-168 -90q-74 0 -104 65q-55 -65 -144 -65q-75 0 -113 50.5t-38 125.5q0 68 36 135.5t94 107.5q76 53 173 53h32l-10 -39q-56 0 -112 -47q-46 -39 -71.5 -107t-25.5 -142q0 -38 17 -67.5t43 -29.5q25 0 50.5 24 t38.5 66q-10 47 -10 84q0 62 27.5 115t79.5 53t52 -71q0 -68 -74 -179q-2 -10 -2 -18q0 -35 20 -54.5t46 -19.5q33 0 62.5 44.5t45 101t15.5 101.5q0 146 -116 146z" />
+<glyph unicode="&#x1d74f;" horiz-adv-x="559" d="M234 627l2 23q43 36 119 36q204 0 204 -256q0 -53 -12 -111.5t-39 -117.5t-64 -105.5t-92.5 -76t-120.5 -29.5q-89 0 -138 46.5t-49 129.5q0 119 89 206t209 87q41 0 80.5 -19t52.5 -51h4v8q2 18 2 27q0 48 -5.5 83.5t-21 69t-47.5 51t-80 17.5q-30 0 -93 -18zM423 293 q0 64 -25.5 95t-63.5 31q-64 0 -119 -88.5t-55 -176.5q0 -70 20.5 -97t67.5 -27q68 0 121.5 82.5t53.5 180.5z" />
+<glyph unicode="&#x1d750;" horiz-adv-x="481" d="M481 461l-26 -140h-23q0 24 -2.5 39.5t-10.5 31.5t-27 24t-49 8q-51 0 -98 -50.5t-65 -110.5h188l-10 -44h-188q-10 -30 -10 -66q0 -58 27 -88t74 -30q80 0 152 79l18 -6q-17 -22 -30.5 -36.5t-41 -36.5t-66 -33.5t-85.5 -11.5q-82 0 -123 45.5t-41 112.5q0 116 85 214.5 t198 98.5q41 0 67 -9.5t31 -9.5q26 0 33 19h23z" />
+<glyph unicode="&#x1d751;" horiz-adv-x="607" d="M584 241l-5 -31q-45 2 -67 6q-18 -47 -36.5 -81.5t-46.5 -71t-66.5 -56.5t-84.5 -20q-160 0 -160 128q0 21 8 62t8 45v4q0 23 -17 23q-24 0 -64 -49l-20 18q26 39 68.5 69t83.5 30q33 0 49.5 -24t16.5 -58q0 -11 -4 -31q-19 -84 -19 -120q0 -68 50 -68q68 0 128 228 q-204 98 -204 252q0 88 53.5 145t140.5 57q48 0 94 -26q80 -47 80 -190q0 -100 -44 -228q33 -11 58 -13zM454 541q0 119 -60 119q-42 0 -61 -48t-19 -98q0 -117 105 -215q35 146 35 242z" />
+<glyph unicode="&#x1d752;" horiz-adv-x="607" d="M630 449l-154 -146q-18 -35 -33 -92q-13 -48 -13 -78q0 -36 36 -36q31 0 46 -18q11 -12 11 -33q0 -26 -17 -43q-18 -18 -52 -18q-44 0 -65 36q-16 26 -16 69q0 81 39 153l-260 -243h-164l157 147q17 35 33 91q13 48 13 76q0 36 -36 36q-30 0 -45 18q-12 14 -12 33 q0 25 17 42q19 19 52 19q44 0 65 -36q16 -26 16 -69q0 -77 -38 -150l256 242h164z" />
+<glyph unicode="&#x1d753;" horiz-adv-x="683" d="M512 685l-51 -223q84 0 139 -43.5t55 -125.5q0 -66 -29 -127q-37 -80 -109.5 -125.5t-163.5 -50.5l-44 -195h-117l45 195q-86 6 -139.5 55.5t-53.5 132.5q0 64 32 126q40 76 111 117t158 41l50 223h117zM453 423l-90 -393q59 12 108 74.5t63 127.5q5 21 5 53 q0 48 -21.5 89.5t-64.5 48.5zM247 30l90 393q-73 -11 -125 -90.5t-52 -157.5q0 -52 21 -93.5t66 -51.5z" />
+<glyph unicode="&#x1d754;" horiz-adv-x="585" d="M252 -205h-19q3 7 3 15q0 19 -30 39.5t-66 38.5t-66 55.5t-30 86.5q0 100 38.5 198t115 166t172.5 68q89 0 141 -43t52 -125q0 -121 -87.5 -212.5t-209.5 -91.5q-88 0 -131 61l-5 -1q0 -37 23.5 -64.5t51.5 -41.5t51.5 -34t23.5 -44q0 -45 -28 -71zM448 297 q0 64 -25.5 94.5t-63.5 30.5q-42 0 -83.5 -44t-66 -107t-24.5 -119q0 -70 20.5 -96t67.5 -26q68 0 121.5 84.5t53.5 182.5z" />
+<glyph unicode="&#x1d755;" horiz-adv-x="868" d="M879 449l-21 -91h-73q15 -33 15 -75q0 -115 -76 -204t-168 -89q-74 0 -104 65q-55 -65 -144 -65q-75 0 -113 50.5t-38 125.5q0 106 78 192h-36q-92 0 -143 -91h-23q52 182 248 182h598zM668 358h-312q-40 -41 -61.5 -103t-21.5 -128q0 -38 17 -67.5t43 -29.5 q25 0 49.5 22.5t37.5 64.5q-6 34 -6 57q0 17 4 40.5t13.5 52t29.5 48t48 19.5q44 0 44 -68q0 -28 -8.5 -54t-18 -43t-29.5 -47q-2 -10 -2 -18q0 -35 20 -54.5t46 -19.5q33 0 62.5 44t45 100t15.5 101q0 51 -16 83z" />
+<glyph unicode="&#x1d790;" horiz-adv-x="690" d="M665 0h-130l-26 162h-248l-106 -162h-130l478 690h28zM493 264l-32 204l-134 -204h166z" />
+<glyph unicode="&#x1d791;" horiz-adv-x="706" d="M228 676h237q206 0 206 -125q0 -53 -35 -102t-101 -76l1 -4q92 -49 92 -128q0 -100 -90 -170.5t-218 -70.5h-260zM290 413h72q88 0 128 32.5t40 79.5q0 49 -86 49h-113zM213 102h103q86 0 128.5 37t42.5 93q0 41 -42 60t-105 19h-75z" />
+<glyph unicode="&#x1d792;" horiz-adv-x="602" d="M705 676l-13 -102h-359l-143 -574h-130l168 676h477z" />
+<glyph unicode="&#x1d793;" horiz-adv-x="720" d="M680 0h-640l478 690h28zM533 102l-57 366l-239 -366h296z" />
+<glyph unicode="&#x1d794;" horiz-adv-x="683" d="M708 676l-25 -102h-350l-42 -167h241l-26 -103h-241l-50 -202h387l-52 -102h-490l168 676h480z" />
+<glyph unicode="&#x1d795;" horiz-adv-x="707" d="M769 676l-4 -16l-513 -558h396l-40 -102h-583l3 16l512 558h-334l38 102h525z" />
+<glyph unicode="&#x1d796;" horiz-adv-x="748" d="M783 676l-168 -676h-130l74 297h-295l-74 -297h-130l168 676h130l-69 -277h295l69 277h130z" />
+<glyph unicode="&#x1d797;" horiz-adv-x="847" d="M600 398l-12 -102h-282l38 102h256zM822 434q0 -95 -38.5 -180.5t-102 -144.5t-145.5 -93.5t-167 -34.5q-128 0 -203.5 70t-75.5 188q0 95 39.5 180t103 144t145.5 93.5t167 34.5q127 0 202 -70t75 -187zM684 425q0 77 -42 120.5t-123 43.5q-119 0 -205 -98.5t-86 -243.5 q0 -77 42.5 -120.5t123.5 -43.5q122 0 206 102t84 240z" />
+<glyph unicode="&#x1d798;" horiz-adv-x="435" d="M505 676l-16 -102h-90l-118 -472h90l-34 -102h-287l11 102h90l118 472h-90l39 102h287z" />
+<glyph unicode="&#x1d799;" horiz-adv-x="712" d="M796 676l-3 -14l-388 -278l282 -384h-170l-220 306l-40 -29l-69 -277h-128l168 676h128l-66 -263l361 263h145z" />
+<glyph unicode="&#x1d79a;" horiz-adv-x="686" d="M646 0h-130l-67 468l-299 -468h-130l471 690h28z" />
+<glyph unicode="&#x1d79b;" horiz-adv-x="933" d="M981 676l-168 -676h-128l116 467l-351 -467h-27l-119 467l-116 -467h-128l168 676h161l104 -440h3l324 440h161z" />
+<glyph unicode="&#x1d79c;" horiz-adv-x="744" d="M792 676l-173 -694l-100 20l-206 500l-125 -502h-128l168 676h157l173 -424l106 424h128z" />
+<glyph unicode="&#x1d79d;" horiz-adv-x="690" d="M737 676l-10 -112h-524l36 112h498zM602 411l-25 -122h-366l25 122h366zM630 122l-37 -122h-546l13 122h570z" />
+<glyph unicode="&#x1d79e;" horiz-adv-x="849" d="M824 434q0 -42 -13 -97q-40 -157 -163.5 -256t-278.5 -99q-128 0 -203.5 70t-75.5 187q0 126 66.5 231.5t170.5 163.5t218 58q128 0 203.5 -70.5t75.5 -187.5zM685 425q0 77 -42 121t-123 44q-120 0 -205.5 -98.5t-85.5 -244.5q0 -77 42 -120t123 -43q103 0 176.5 68.5 t102.5 184.5q12 48 12 88z" />
+<glyph unicode="&#x1d79f;" horiz-adv-x="745" d="M783 676l-168 -676h-130l143 574h-295l-143 -574h-130l168 676h555z" />
+<glyph unicode="&#x1d7a0;" horiz-adv-x="581" d="M228 676h209q238 0 238 -144q0 -110 -90.5 -182t-222.5 -72h-103l-69 -278h-130zM284 380h71q89 0 137 32t48 92q0 70 -142 70h-65z" />
+<glyph unicode="&#x1d7a1;" horiz-adv-x="847" d="M822 434q0 -95 -38.5 -180.5t-102 -144.5t-145.5 -93.5t-167 -34.5q-128 0 -203.5 70t-75.5 188q0 95 39.5 180t103 144t145.5 93.5t167 34.5q127 0 202 -70t75 -187zM257 398h426q1 10 1 27q0 77 -42 120.5t-123 43.5q-84 0 -155 -52t-107 -139zM662 296h-431 q-3 -24 -3 -49q0 -77 42.5 -120.5t123.5 -43.5q91 0 163 59.5t105 153.5z" />
+<glyph unicode="&#x1d7a2;" horiz-adv-x="696" d="M748 676l-25 -102h-330l148 -226l-271 -246h377l-40 -102h-586l3 16l364 330l-206 314l4 16h562z" />
+<glyph unicode="&#x1d7a3;" horiz-adv-x="641" d="M715 676l-15 -102h-240l-143 -574h-130l143 574h-243l39 102h589z" />
+<glyph unicode="&#x1d7a4;" horiz-adv-x="671" d="M799 675l-58 -98q-33 12 -49 12q-17 0 -32 -3.5t-43.5 -20.5t-56.5 -47.5t-67.5 -91t-80.5 -144.5l-70 -282h-130l70 282q0 157 -28 227q-31 80 -100 80q-13 0 -55 -11l-8 97q54 16 92 16q18 0 40 -4.5t50.5 -20t51.5 -39t40 -66t19 -96.5q0 -20 -1 -32q39 76 89.5 131 t98 80.5t83 36t61.5 10.5q39 0 84 -16z" />
+<glyph unicode="&#x1d7a5;" horiz-adv-x="835" d="M603 676l-25 -102q108 -3 182.5 -52t74.5 -134q0 -66 -35.5 -122t-91.5 -90.5t-120.5 -54.5t-128.5 -22l-24 -99h-130l24 99q-109 3 -183 52.5t-74 136.5q0 67 35 122t90.5 89.5t120.5 53.5t130 21l25 102h130zM551 472l-67 -271q103 6 157 57t54 110q0 42 -34.5 71 t-109.5 33zM356 201l67 271q-107 -6 -158.5 -55t-51.5 -110q0 -43 34 -72t109 -34z" />
+<glyph unicode="&#x1d7a6;" horiz-adv-x="740" d="M833 676l-325 -333l172 -343h-154l-120 239l-232 -239h-154l334 343l-165 333h154l113 -228l223 228h154z" />
+<glyph unicode="&#x1d7a7;" horiz-adv-x="791" d="M901 691l-57 -102q-53 -9 -80 -121q-23 -93 -109 -148t-185 -61l-64 -259h-130l64 259q-81 5 -138 49t-57 117q0 16 9 55t9 60q0 42 -33 49l-5 102h39q131 0 131 -127q0 -14 -8 -54t-8 -62q0 -36 22.5 -58.5t64.5 -27.5l78 314h130l-78 -314q53 6 91 37.5t50 79.5 q28 112 88.5 162t136.5 50h39z" />
+<glyph unicode="&#x1d7a8;" horiz-adv-x="816" d="M259 102l3 29q-54 15 -94.5 65.5t-40.5 124.5q0 61 30.5 125.5t84 119.5t134.5 90t172 35q129 0 198.5 -67t69.5 -167q0 -65 -26.5 -124t-67 -99t-84.5 -66.5t-84 -36.5l-11 -29h202l-40 -102h-295l62 207q85 20 151 81.5t66 160.5q0 65 -45.5 102.5t-121.5 37.5 q-107 0 -185 -77.5t-78 -165.5q0 -105 123 -140l-40 -206h-295l10 102h202z" />
+<glyph unicode="&#x1d7a9;" horiz-adv-x="780" d="M760 664l-453 -694h-28l-159 694h640zM565 560h-294l70 -361z" />
+<glyph unicode="&#x1d7aa;" horiz-adv-x="678" d="M703 462l-177 -246q0 -2 1.5 -19.5t3 -25t4.5 -24.5t8.5 -26t13.5 -19.5t20 -15.5t28 -5l-4 -16l-55 -79q-22 0 -33.5 0.5t-31 5.5t-30.5 14t-21 27t-13 44h-2q-27 -27 -47.5 -43.5t-62 -32t-92.5 -15.5q-77 0 -121.5 47t-44.5 124q0 50 22.5 105t60.5 102t97 78t125 31 q117 0 157 -97l65 86h129zM399 261q0 56 -20.5 87t-55.5 31q-59 0 -104 -64.5t-45 -139.5q0 -43 19.5 -68.5t56.5 -25.5q75 0 145 128q4 25 4 52z" />
+<glyph unicode="&#x1d7ab;" horiz-adv-x="552" d="M25 -117l132 527q71 282 288 282q57 0 96.5 -32t39.5 -86q0 -53 -30.5 -95t-75.5 -63l2 -1q37 -9 57 -42t20 -77q0 -24 -6 -48q-29 -113 -105.5 -187.5t-174.5 -74.5q-54 0 -88 38l-33 -135q-15 -61 -41 -94h-118q24 37 37 88zM307 375l62 79q41 0 66.5 26.5t25.5 70.5 q0 46 -47 46q-91 0 -129 -155l-73 -292q13 -38 28.5 -53.5t46.5 -15.5q40 0 90.5 60.5t50.5 146.5q0 46 -30 58.5t-95 12.5z" />
+<glyph unicode="&#x1d7ac;" horiz-adv-x="525" d="M571 462l-276 -411l-61 -245l-16 -10l-101 24q38 119 65 227q19 78 19 145q0 15 -0.5 29.5t-7 46t-17.5 53.5t-35 40t-57 18l4 16l69 78q64 0 102.5 -65t38.5 -147q0 -24 -5 -52h2l146 253h130z" />
+<glyph unicode="&#x1d7ad;" horiz-adv-x="507" d="M547 618l-74 -79h-17q-14 18 -23.5 27.5t-29 20t-40.5 10.5q-22 0 -44.5 -14t-22.5 -39q0 -33 72 -73q64 -35 97.5 -78t33.5 -107q0 -33 -10.5 -72t-34.5 -79.5t-57 -73.5t-83 -54t-108 -21q-89 0 -132.5 48.5t-43.5 119.5q0 91 54.5 166t142.5 108q-54 36 -54 90 q0 57 35 98t83 58.5t100 17.5q57 0 96 -15.5t60 -58.5zM371 266q0 61 -56 88q-62 -3 -111 -56.5t-49 -126.5q0 -39 19.5 -64.5t54.5 -25.5q64 0 103 60t39 125z" />
+<glyph unicode="&#x1d7ae;" horiz-adv-x="504" d="M508 383l-69 -61h-16q-14 35 -32 45.5t-57 10.5q-35 0 -65 -12.5t-30 -42.5t63 -30h68l-24 -95h-78q-43 0 -68 -21q-24 -19 -24 -46q0 -26 23.5 -38t51.5 -12q111 0 159 73l36 -75q-53 -55 -103.5 -74t-131.5 -19q-30 0 -56.5 5t-52.5 16t-41.5 33.5t-15.5 54.5 q0 50 31.5 89.5t80.5 54.5v3q-40 25 -40 69q0 57 57 104q70 58 178 58q64 0 104.5 -18t51.5 -72z" />
+<glyph unicode="&#x1d7af;" horiz-adv-x="480" d="M539 634l-7 -95q-103 -11 -205 -92q-56 -45 -100.5 -122t-44.5 -150q0 -94 99 -94h56q49 0 86 -23t37 -71q0 -82 -65 -137t-147 -55q-53 0 -70 21l24 98h16q21 -24 55 -24q86 0 86 60q0 36 -69 36h-90q-151 0 -151 144q0 95 57 198t149 173l1 3q-41 32 -41 77 q0 22 12 54.5t36 56.5h16l72 -17q-30 -41 -30 -70q0 -26 22 -37q61 31 93 43t86 23h17z" />
+<glyph unicode="&#x1d7b0;" horiz-adv-x="532" d="M255 411h3q76 62 148 62q119 0 119 -99q0 -26 -7 -53l-109 -437q-8 -32 -8 -56q0 -20 4 -33h-127q-2 6 -2 19q0 20 14 76l105 419q3 13 3 25q0 44 -51 44q-24 0 -57 -21t-59 -64l-73 -293h-120l87 349q6 23 6 52q0 21 -4 37l109 35h9q11 -18 11 -51q0 -5 -1 -11z" />
+<glyph unicode="&#x1d7b1;" horiz-adv-x="560" d="M553 471q0 -71 -25.5 -155t-68.5 -158t-107 -123t-132 -49q-77 0 -116 62.5t-39 159.5q0 99 41.5 209.5t120.5 192.5t169 82q78 0 117.5 -62t39.5 -159zM218 388h204q12 48 12 93q0 51 -16 83.5t-46 32.5q-48 0 -90.5 -62t-63.5 -147zM399 293h-204q-14 -58 -14 -101 q0 -51 16.5 -81t46.5 -30q45 0 89 62t66 150z" />
+<glyph unicode="&#x1d7b2;" horiz-adv-x="325" d="M302 108l-39 -100q-44 -22 -95 -22q-112 0 -112 93q0 15 5 37l86 346h120l-74 -299q-6 -25 -6 -41q0 -41 39 -41q29 0 60 27h16z" />
+<glyph unicode="&#x1d7b3;" horiz-adv-x="537" d="M582 395l-4 -16q-56 -5 -103.5 -22.5t-72.5 -34.5t-76 -55l169 -267h-155l-117 187l-24 -20l-41 -167h-120l114 462h120l-40 -163h2q182 159 329 174z" />
+<glyph unicode="&#x1d7b4;" horiz-adv-x="574" d="M540 81l-4 -16l-66 -79q-59 0 -94 36t-35 139v137l-192 -298h-131l320 459q0 83 -32 110.5t-91 27.5l4 16l70 79q68 0 106.5 -48t44.5 -166l12 -256q4 -79 22 -110t66 -31z" />
+<glyph unicode="&#x1d7b5;" horiz-adv-x="594" d="M569 462l-76 -307q-5 -22 -5 -35q0 -39 49 -39l-4 -16l-55 -79q-112 0 -119 70h-2q-24 -34 -56 -52t-61 -18q-26 0 -40.5 4.5t-24.5 19.5h-2l-30 -121q-15 -61 -41 -94h-114q25 42 37 88l144 579h120l-77 -313q-3 -13 -3 -24q0 -44 52 -44q29 0 59.5 21t54.5 62l74 298 h120z" />
+<glyph unicode="&#x1d7b6;" horiz-adv-x="525" d="M441 454l121 19q3 -11 3 -24q0 -73 -42.5 -155t-109.5 -150t-160 -113t-186 -45h-26l118 476h120l-82 -332h2q94 28 165.5 113.5t71.5 179.5q0 7 -2 21z" />
+<glyph unicode="&#x1d7b7;" horiz-adv-x="481" d="M525 631l-15 -92q-75 0 -133 -24.5t-58 -65.5q0 -22 27 -31q65 21 163 21l7 -5l-31 -90q-78 0 -148.5 -23.5t-116.5 -68.5t-46 -101q0 -70 103 -70h61q49 0 86 -23t37 -71q0 -82 -65 -137t-147 -55q-53 0 -70 21l24 98h16q21 -24 55 -24q86 0 86 60q0 36 -69 36h-89 q-71 0 -115 37t-44 100q0 73 53.5 142t141.5 109v3q-41 22 -41 61q0 30 19 61.5t52 54.5q-30 25 -30 52q0 45 41 86h16l73 -17q-24 -24 -24 -42t20 -31q91 32 151 32z" />
+<glyph unicode="&#x1d7b8;" horiz-adv-x="543" d="M515 298q0 -127 -92 -219.5t-204 -92.5q-78 0 -126 48t-48 127q0 131 93 221.5t206 90.5q78 0 124.5 -48t46.5 -127zM390 295q0 83 -76 83q-59 0 -100.5 -65.5t-41.5 -142.5q0 -89 71 -89q40 0 71 27t46 65.5t22.5 70t7.5 51.5z" />
+<glyph unicode="&#x1d7b9;" horiz-adv-x="632" d="M656 462l-23 -95h-99q-64 -164 -64 -225q0 -27 17.5 -41t59.5 -20l-5 -17l-59 -78q-30 0 -52 3.5t-46 14t-37 33t-13 56.5q0 30 27.5 120t51.5 154h-76l-22 -85q-8 -30 -21.5 -72t-24.5 -65t-28 -52t-35 -44.5t-42.5 -31t-54 -22.5t-65.5 -9l11 95q28 7 39 10.5 t27.5 15.5t23.5 25.5t19.5 46t22.5 70.5l27 106q-15 0 -39 -19.5t-42 -54.5l-75 38q81 143 224 143h373z" />
+<glyph unicode="&#x1d7ba;" horiz-adv-x="560" d="M4 -117l61 242q24 96 45 148.5t63 103.5q78 96 206 96q73 0 115 -43t42 -115q0 -32 -9 -68q-29 -118 -105 -189.5t-174 -71.5q-52 0 -88 41l-34 -138q-15 -61 -41 -94h-118q24 37 37 88zM409 304q0 74 -63 74q-69 0 -113 -92q-16 -32 -42 -136q13 -38 28.5 -53.5 t46.5 -15.5q60 0 101.5 74t41.5 149z" />
+<glyph unicode="&#x1d7bb;" horiz-adv-x="517" d="M554 368l-86 -57h-17q-1 67 -78 67q-85 0 -137.5 -66t-52.5 -145q0 -45 28.5 -65.5t71.5 -20.5h56q49 0 86 -23t37 -71q0 -82 -65 -137t-147 -55q-53 0 -70 21l24 98h16q21 -24 55 -24q86 0 86 60q0 36 -69 36h-80q-72 0 -116 42.5t-44 112.5q0 89 52 167t131.5 121.5 t162.5 43.5q62 0 108.5 -26.5t47.5 -78.5z" />
+<glyph unicode="&#x1d7bc;" horiz-adv-x="614" d="M639 462l-23 -95h-165l-1 -2q52 -52 52 -123q0 -24 -5 -42q-12 -44 -46 -91t-96.5 -85t-133.5 -38q-79 0 -127.5 47.5t-48.5 125.5q0 73 31 133.5t78 96t95.5 54.5t88.5 19h301zM380 251q0 75 -69 116q-55 0 -97 -58.5t-42 -139.5q0 -41 18.5 -64.5t54.5 -23.5 q33 0 60.5 20t43 48.5t23.5 55.5t8 46z" />
+<glyph unicode="&#x1d7bd;" horiz-adv-x="523" d="M547 462l-23 -95h-153q-36 -96 -56 -175q-6 -24 -6 -42q0 -31 20 -46.5t66 -22.5l-5 -17l-59 -78q-31 0 -54 4t-49 14.5t-40.5 34t-14.5 58.5q0 25 7 53q17 73 75 217q-85 0 -137 -101l-76 38q46 81 93.5 119.5t114.5 38.5h297z" />
+<glyph unicode="&#x1d7be;" horiz-adv-x="550" d="M311 378l23 95q86 0 139 -42t53 -125q0 -131 -91.5 -225.5t-205.5 -94.5q-83 0 -125.5 34.5t-42.5 97.5q0 25 8 59l36 147q14 58 14 84q0 20 -6 29l111 36h16q8 -20 8 -45q0 -15 -4 -28l-48 -193q-7 -30 -7 -51q0 -75 66 -75q62 0 103 70.5t41 140.5q0 86 -88 86z" />
+<glyph unicode="&#x1d7bf;" horiz-adv-x="683" d="M262 81l25 102q11 45 19 72t22 66t30.5 62t40 46t55.5 33.5t72 10.5q53 0 93 -44.5t40 -122.5q0 -53 -18.5 -107.5t-54 -103t-95.5 -79t-134 -30.5l-48 -191h-120l48 191q-94 0 -138 45.5t-44 119.5q0 83 57 182t141 128l55 -58l-3 -12q-49 -23 -76 -69t-37 -89 q-10 -39 -10 -69q0 -83 80 -83zM412 212l-32 -131q108 0 145 150q17 66 17 100q0 47 -39 47q-22 0 -40 -25t-28 -56t-23 -85z" />
+<glyph unicode="&#x1d7c0;" horiz-adv-x="575" d="M626 462l-299 -341q-8 -40 -8 -76q0 -144 111 -155l-4 -16l-68 -79q-52 0 -85.5 35.5t-44.5 79.5t-11 94v4l-160 -203h-137l292 334q9 42 9 86q0 146 -122 154l4 16l69 78q78 0 114.5 -60t36.5 -155v-4l165 208h138z" />
+<glyph unicode="&#x1d7c1;" horiz-adv-x="703" d="M751 473l-45 -94q-54 -17 -87 -152q-26 -105 -89 -166t-177 -75l-48 -191h-120l48 191q-158 20 -158 155q0 31 13.5 99t13.5 83q0 46 -25 56v94q73 0 113.5 -38.5t40.5 -102.5q0 -30 -15 -100.5t-15 -83.5q0 -30 13 -45t43 -22l94 381h120l-94 -381q53 13 78 50.5 t51 144.5q21 86 89 141.5t156 55.5z" />
+<glyph unicode="&#x1d7c2;" horiz-adv-x="756" d="M537 410l93 51q50 -15 76 -61.5t26 -107.5q0 -36 -9 -72q-29 -115 -96.5 -174.5t-148.5 -59.5q-44 0 -76 22t-39 61h-2q-26 -39 -69 -61t-87 -22q-66 0 -103.5 37t-37.5 108q0 61 26.5 129.5t79 125.5t117.5 75l71 -51l-4 -16q-57 -20 -96 -67.5t-54 -95t-15 -92.5 q0 -58 40 -58q74 0 111 145l23 92l114 29l11 -10l-28 -111q-11 -46 -11 -73q0 -72 53 -72q39 0 71 61.5t32 131.5q0 90 -72 120z" />
+<glyph unicode="&#x1d7c3;" horiz-adv-x="548" d="M227 608l51 83q261 -15 261 -260q0 -74 -20.5 -150t-58 -143t-101 -109.5t-140.5 -42.5q-79 0 -126.5 47.5t-47.5 126.5q0 126 91 219.5t202 93.5q49 0 82 -33l4 2q-17 152 -184 154zM390 295q0 83 -76 83q-59 0 -100.5 -65.5t-41.5 -142.5q0 -89 71 -89q40 0 71 27 t46 65.5t22.5 70t7.5 51.5z" />
+<glyph unicode="&#x1d7c4;" horiz-adv-x="468" d="M470 443l-31 -124h-16q-9 27 -28.5 41t-33.5 16t-36 2q-35 0 -71.5 -22.5t-55.5 -65.5h149l-24 -95h-150q-2 -14 -2 -19q0 -40 24 -64t65 -24q71 0 123 57l50 -65q-60 -56 -104 -75t-114 -19q-78 0 -124 46t-46 122q0 90 47.5 165t116 114.5t138.5 39.5q88 0 123 -30z " />
+<glyph unicode="&#x1d7c5;" horiz-adv-x="579" d="M579 380l-23 -95q-19 0 -42 5l-8 -31q-34 -130 -111 -201.5t-175 -71.5q-82 0 -124 34t-42 97q0 25 8 60q28 117 28 139q0 18 -6 29l110 36h16q8 -18 8 -45q0 -14 -29 -129q-7 -31 -7 -53q0 -73 64 -73q90 0 134 172q11 44 16 68q-170 60 -170 185q0 87 53 136.5 t120 49.5t103.5 -50t36.5 -150q0 -52 -8 -103q21 -6 48 -9zM430 507q0 90 -56 90q-18 0 -34.5 -17.5t-16.5 -44.5q0 -31 26 -62t72 -42q9 43 9 76z" />
+<glyph unicode="&#x1d7c6;" horiz-adv-x="646" d="M665 462l-184 -166q2 -112 18 -150t76 -61l-4 -16l-56 -79q-38 4 -64 26t-38 58t-17 66.5t-7 71.5l-234 -212h-165l182 166q-2 113 -17.5 151t-75.5 62l4 16l56 78q38 -5 63.5 -27t38 -59t17 -67.5t6.5 -71.5l235 214h166z" />
+<glyph unicode="&#x1d7c7;" horiz-adv-x="678" d="M526 692l-55 -219q96 0 139.5 -43.5t43.5 -117.5q0 -81 -34 -154t-105 -122.5t-165 -49.5l-48 -191h-120l48 191q-93 0 -137.5 44.5t-44.5 118.5q0 60 19.5 116.5t55.5 103.5t95.5 75.5t132.5 28.5l55 219h120zM447 378l-74 -297q108 0 145 150q8 31 8 61q0 86 -79 86z M255 81l74 297q-48 0 -87.5 -36t-57.5 -111q-10 -39 -10 -69q0 -81 81 -81z" />
+<glyph unicode="&#x1d7c8;" horiz-adv-x="544" d="M232 -205h-17q-1 12 -13.5 21t-30 16t-43 25.5t-46.5 45.5q-44 57 -44 152q0 99 36 193t110.5 159.5t169.5 65.5q77 0 121.5 -47t44.5 -125q0 -129 -89.5 -222t-201.5 -93q-49 0 -82 33l-3 -2q3 -27 22.5 -46t44.5 -29l50 -22q25 -10 42 -28t17 -45q0 -15 -4 -28z M396 299q0 79 -72 79q-59 0 -100.5 -72t-41.5 -145q0 -80 71 -80q40 0 70.5 28t45 68t21 71.5t6.5 50.5z" />
+<glyph unicode="&#x1d7c9;" horiz-adv-x="889" d="M912 462l-23 -95h-92q11 -36 11 -75q0 -58 -25 -122t-59 -103q-71 -81 -170 -81q-94 0 -115 83h-2q-59 -83 -156 -83q-66 0 -103.5 37t-37.5 108q0 56 23.5 121t70.5 114q-42 -4 -68.5 -30t-49.5 -70l-76 38q46 81 93.5 119.5t114.5 38.5h664zM556 308l-20 -81 q-11 -47 -11 -74q0 -72 53 -72q39 0 71.5 61.5t32.5 131.5q0 57 -33 93h-273q-55 -39 -82.5 -102t-27.5 -121q0 -63 39 -63q34 0 63.5 35t47.5 111l15 62l115 29z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.ttf b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.ttf
new file mode 100644
index 0000000..6b8c251
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.ttf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.woff b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.woff
new file mode 100644
index 0000000..63a6f8e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.woff
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.eot b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.eot
new file mode 100644
index 0000000..3573ca1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.eot
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.svg b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.svg
new file mode 100644
index 0000000..295068d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.svg
@@ -0,0 +1,1089 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG webfont generated by Font Squirrel.
+Designer    : MicroPress Inc., with final additions and corrections provided by Coen Hoffman, Elsevier (retired)
+Foundry URL : http://www.stixfonts.org
+</metadata>
+<defs>
+<font id="webfont2oJeLJIt" horiz-adv-x="500" >
+<font-face units-per-em="1000" ascent="750" descent="-250" />
+<missing-glyph horiz-adv-x="250" />
+<glyph unicode="IJ" horiz-adv-x="750" d="M783 653v-16q-43 -6 -56 -17.5t-26 -56.5l-103 -367q-29 -104 -71 -159t-124 -55q-53 0 -85 24t-32 64q0 24 12.5 40t32.5 16t35.5 -13.5t15.5 -32.5q0 -6 -1.5 -14.5t-1.5 -12.5q0 -39 35 -39t53 64l127 454q12 44 12 64t-15 28.5t-62 12.5v16h254zM384 653v-16 q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="ij" d="M467 438l-104 -410q-31 -121 -76.5 -178t-110.5 -57q-35 0 -57 17t-22 44q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -12 18 -12q30 0 50.5 39t46.5 143l72 292q16 65 16 80q0 17 -10.5 24t-37.5 7h-26v16q45 3 169 25zM500 598q0 -20 -15 -35t-35 -15 q-23 0 -38.5 14.5t-15.5 37.5q0 22 16 37t37 15q20 0 35.5 -16.5t15.5 -37.5zM222 114l13 -11q-42 -65 -71 -89.5t-66 -24.5q-49 0 -49 55q0 29 22 111l48 177q9 32 9 44q0 15 -11.5 19t-52.5 5v16q46 4 160 25l4 -3l-94 -343q-10 -34 -10 -44q0 -15 14 -15q25 0 84 78z M264 599q0 -21 -14.5 -36t-34.5 -15q-22 0 -35 14.5t-13 38.5q0 23 13.5 38t33.5 15t35 -16.5t15 -38.5z" />
+<glyph unicode="&#xfb00;" horiz-adv-x="527" d="M211 428h172q39 126 72 173q54 77 131 77q37 0 62 -17.5t25 -44.5q0 -17 -12.5 -30t-29.5 -13q-14 0 -25.5 11t-11.5 28q0 10 5 19t5 12q0 13 -22 13q-42 0 -71 -54.5t-51 -173.5h107l-6 -32h-108l-72 -320q-64 -283 -200 -283q-34 0 -56.5 17.5t-22.5 43.5q0 17 11 29.5 t27 12.5q17 0 27.5 -10.5t10.5 -26.5q0 -7 -4.5 -15.5t-4.5 -13.5q0 -16 20 -16q63 0 97 162l88 420h-170l-72 -320q-64 -283 -200 -283q-34 0 -56.5 17.5t-22.5 43.5q0 17 11 29.5t27 12.5q17 0 27.5 -10.5t10.5 -26.5q0 -7 -4.5 -15.5t-4.5 -13.5q0 -16 20 -16 q62 0 97 162l88 420h-91l7 32h93q39 126 72 173q54 77 132 77q37 0 61.5 -17.5t24.5 -44.5q0 -17 -12.5 -30t-29.5 -13q-14 0 -25.5 11t-11.5 28q0 10 5 19t5 12q0 13 -22 13q-42 0 -71 -54.5t-51 -173.5z" />
+<glyph unicode="&#xfb01;" d="M51 428h88q27 92 46 129t59 73q56 51 134 51q45 0 74 -19.5t29 -48.5q0 -19 -12 -32t-30 -13q-19 0 -30 12t-11 31q0 14 9 23q4 5 4 9q0 16 -34 16q-54 0 -86 -42q-25 -32 -39 -67.5t-36 -121.5h150q40 0 81 6q4 0 8 0.5t6 1t4 0.5l5 -3v-3q0 -7 -5 -25l-1 -4 q-2 -10 -8 -29.5t-7 -23.5q-1 -5 -7 -26q-72 -263 -72 -275q0 -10 11 -10q21 0 77 70l16 -9q-43 -58 -73 -82t-60 -24q-46 0 -46 50q0 29 74 296q12 42 12 48q0 10 -16 10h-155l-72 -318q-43 -187 -117 -252q-39 -33 -84 -33q-34 0 -56 16.5t-22 43.5q0 18 11 31t26 13 q16 0 27.5 -12t11.5 -28q0 -7 -5 -16q-4 -7 -4 -11q0 -13 20 -13q37 0 61 47q28 52 58 224q45 253 67 308h-88z" />
+<glyph unicode="&#xfb02;" d="M46 428h92q21 64 31 90t28.5 55.5t47.5 54.5q64 54 138 54q32 0 61 -7q28 -4 31 -4q4 0 28 8q6 3 10 3q5 0 5 -9t-21 -88q-30 -115 -78.5 -320.5t-48.5 -217.5q0 -11 11 -11q18 0 78 69l16 -9q-45 -61 -73 -83t-59 -22q-22 0 -35 13.5t-13 36.5t47 217l33 138h-166 l-69 -310q-65 -290 -205 -290q-34 0 -55 17.5t-21 44.5q0 17 10.5 29.5t25.5 12.5q16 0 28 -12t12 -27q0 -8 -5 -17q-4 -7 -4 -10q0 -13 20 -13q29 0 47 24q13 17 18 31q22 58 91 388l28 132h-90zM383 428l37 148q0 5 -5 15q-5 12 -5 17q0 10 8 21q4 5 4 9q0 9 -13 15.5 t-30 6.5q-55 0 -93 -51t-64 -157l-6 -24h167z" />
+<glyph unicode="&#xfb03;" horiz-adv-x="744" d="M211 428h172q27 92 46 129t59 73q56 51 134 51q45 0 74 -19.5t29 -48.5q0 -19 -12 -32t-30 -13q-19 0 -30 12t-11 31q0 14 9 23q4 5 4 9q0 13 -34 13q-29 0 -48.5 -7.5t-37.5 -31.5q-25 -32 -39 -67.5t-36 -121.5h150q40 0 81 6q4 0 8 0.5t6 1t4 0.5l5 -3v-3q0 -7 -5 -25 l-1 -4q-2 -10 -8 -29.5t-7 -23.5q-1 -5 -7 -26q-72 -263 -72 -275q0 -10 11 -10q21 0 77 70l16 -9q-43 -58 -73 -82t-60 -24q-46 0 -46 50q0 29 74 296q12 42 12 48q0 10 -16 10h-155l-72 -318q-43 -187 -117 -252q-39 -33 -84 -33q-34 0 -56 16.5t-22 43.5q0 18 11 31 t26 13q16 0 27.5 -12t11.5 -28q0 -7 -5 -16q-4 -7 -4 -11q0 -13 20 -13q37 0 61 47q28 52 58 224q49 276 66 308h-171l-72 -320q-64 -283 -200 -283q-34 0 -56.5 17.5t-22.5 43.5q0 17 11 29.5t27 12.5q17 0 27.5 -10.5t10.5 -26.5q0 -7 -4.5 -15.5t-4.5 -13.5q0 -16 20 -16 q62 0 97 162l88 420h-91l7 32h93q39 126 72 173q54 77 132 77q37 0 61.5 -17.5t24.5 -44.5q0 -17 -12.5 -30t-29.5 -13q-14 0 -25.5 11t-11.5 28q0 10 5 19t5 12q0 13 -22 13q-42 0 -71 -54.5t-51 -173.5z" />
+<glyph unicode="&#xfb04;" horiz-adv-x="745" d="M211 428h172q21 64 31 90t28.5 55.5t47.5 54.5q64 54 138 54q32 0 61 -7q28 -4 31 -4q4 0 28 8q6 3 10 3q5 0 5 -9t-21 -88q-30 -115 -78.5 -320.5t-48.5 -217.5q0 -11 11 -11q18 0 78 69l16 -9q-45 -61 -73 -83t-59 -22q-22 0 -35 13.5t-13 36.5t47 217l33 138h-166 l-69 -310q-32 -144 -84.5 -218.5t-120.5 -74.5q-34 0 -55 18.5t-21 46.5q0 17 10.5 29.5t25.5 12.5q16 0 28 -12t12 -27q0 -8 -5 -17q-4 -7 -4 -10q0 -20 20 -20q23 0 47 31q13 17 18 31q22 58 91 388l28 132h-171l-72 -320q-64 -283 -200 -283q-34 0 -56.5 17.5t-22.5 43.5 q0 17 11 29.5t27 12.5q17 0 27.5 -10.5t10.5 -26.5q0 -7 -4.5 -15.5t-4.5 -13.5q0 -16 20 -16q62 0 97 162l88 420h-91l7 32h93q39 126 72 173q54 77 132 77q37 0 61.5 -17.5t24.5 -44.5q0 -17 -12.5 -30t-29.5 -13q-14 0 -25.5 11t-11.5 28q0 10 5 19t5 12q0 13 -22 13 q-42 0 -71 -54.5t-51 -173.5zM628 428l37 148q0 5 -5 15q-5 12 -5 17q0 10 8 21q4 5 4 9q0 9 -13 15.5t-30 6.5q-55 0 -93 -51q-37 -51 -64 -157l-6 -24h167z" />
+<glyph unicode="fj" d="M51 428h88q27 92 46 129t59 73q56 51 134 51q55 0 85 -28q17 -4 29 -19.5t12 -34.5q0 -21 -14.5 -36t-34.5 -15q-40 0 -50 37q-7 10 -7 26q0 14 9 23q4 5 4 9q0 16 -34 16q-54 0 -86 -42q-25 -32 -39 -67.5t-36 -121.5h150q40 0 81 6q4 0 8 0.5t6 1t4 0.5l5 -3v-3 q0 -7 -5 -25l-1 -4q-2 -10 -8 -29.5t-7 -23.5q-1 -5 -7 -26l-36 -138l-26 -111q-10 -41 -10 -45q-31 -121 -76.5 -178t-110.5 -57q-35 0 -57 17t-22 44q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -12 18 -12q30 0 50.5 39t46.5 143l83 341q11 46 11 48 q0 10 -16 10h-155l-72 -318q-43 -187 -117 -252q-39 -33 -84 -33q-34 0 -56 16.5t-22 43.5q0 18 11 31t26 13q16 0 27.5 -12t11.5 -28q0 -7 -5 -16q-4 -7 -4 -11q0 -13 20 -13q37 0 61 47q28 52 58 224q45 253 67 308h-88z" />
+<glyph unicode=" "  horiz-adv-x="250" />
+<glyph unicode="&#x09;" horiz-adv-x="250" />
+<glyph unicode="&#xa0;" horiz-adv-x="250" />
+<glyph unicode="!" horiz-adv-x="333" d="M137 177l-17 5q49 227 71 369q10 64 25.5 90t43.5 26q44 0 44 -51q0 -40 -39 -123q-56 -120 -128 -316zM145 41q0 -21 -16.5 -36.5t-39.5 -15.5q-22 0 -36 15.5t-14 38.5q0 21 16.5 36.5t37.5 15.5q23 0 37.5 -16t14.5 -38z" />
+<glyph unicode="&#x22;" horiz-adv-x="420" d="M346 421h-23q13 158 22 203q4 20 19.5 31t34.5 11q13 0 23 -8t10 -20q0 -30 -86 -217zM167 421h-23q13 158 22 203q4 20 19.5 31t35.5 11q13 0 22.5 -8t9.5 -20q0 -32 -86 -217z" />
+<glyph unicode="#" horiz-adv-x="501" d="M540 464l-11 -54h-104l-54 -143h94l-11 -54h-104l-79 -213h-62l80 213h-130l-79 -213h-62l80 213h-96l11 54h106l54 143h-97l11 54h106l80 212h61l-80 -212h130l80 212h61l-80 -212h95zM364 410h-130l-54 -143h130z" />
+<glyph unicode="$" d="M497 611l-28 -114l-15 2q-2 57 -20.5 87t-64.5 47l-56 -237q88 -65 115 -104t27 -102q0 -92 -67 -143q-40 -30 -72.5 -38.5t-100.5 -8.5l-21 -89h-35l22 91q-95 18 -149 66l26 123l16 3q4 -76 29 -109.5t86 -52.5l69 297q-76 49 -105.5 86.5t-29.5 92.5q0 61 42 106 q30 32 65 43t93 11h18l17 63h34l-16 -68q72 -17 121 -52zM336 641h-16q-53 0 -86 -32.5t-33 -76.5q0 -35 17.5 -61t62.5 -53zM289 306l-68 -281q159 13 159 144q0 42 -15.5 65t-69.5 67z" />
+<glyph unicode="%" horiz-adv-x="755" d="M705 213q0 -91 -50 -161.5t-114 -70.5q-51 0 -86 40t-35 98q0 80 58.5 145.5t130.5 65.5q46 0 71 -30.5t25 -86.5zM682 215q0 39 -17.5 63t-45.5 24q-29 0 -49 -23q-33 -35 -55.5 -93.5t-22.5 -109.5q0 -29 16 -48.5t40 -19.5q52 0 93 63.5t41 143.5zM640 706l-430 -724 h-47l394 658q-28 -32 -54.5 -44.5t-66.5 -12.5q-35 0 -76 14q4 -23 4 -44q0 -52 -22 -104t-58 -86q-38 -37 -86 -37q-50 0 -84 39.5t-34 97.5q0 85 58 149t135 64q26 0 60 -28q47 -39 96 -39q46 0 72 15t95 82h44zM340 569q0 22 -4.5 30t-20.5 16q-23 11 -44 34 q-31 -15 -44 -26.5t-28 -36.5q-48 -76 -48 -163q0 -31 15.5 -50.5t41.5 -19.5q53 0 92.5 65t39.5 151z" />
+<glyph unicode="&#x26;" horiz-adv-x="778" d="M712 63l11 -11q-42 -70 -132 -70q-74 0 -134 79q-57 -45 -102.5 -62t-96.5 -17q-84 0 -133 40.5t-49 112.5q0 90 75 151q37 30 180 92q-7 42 -7 94q0 88 43 141t116 53q45 0 74 -27t29 -67q0 -55 -56 -103q-34 -30 -116 -72q27 -142 87 -237q46 52 62.5 82t16.5 57 q0 17 -10.5 23.5t-40.5 8.5v19h188v-17q-37 -4 -54.5 -18.5t-56.5 -71.5q-20 -30 -86 -118q30 -50 58.5 -72t63.5 -22q37 0 70 32zM517 572q0 62 -39 62q-32 0 -52.5 -33t-20.5 -97q0 -38 5 -76q61 38 84 71t23 73zM436 93q-49 62 -103 252q-74 -29 -118.5 -78.5 t-44.5 -106.5q0 -56 34.5 -91t93.5 -35q61 0 138 59z" />
+<glyph unicode="'" horiz-adv-x="214" d="M155 421h-23q13 168 23 206q9 39 51 39q16 0 25.5 -9t9.5 -22q0 -29 -86 -214z" />
+<glyph unicode="(" horiz-adv-x="333" d="M302 669l13 -15q-107 -101 -155.5 -251t-48.5 -318q0 -73 10 -128.5t38 -131.5l-18 -6q-99 159 -99 361q0 169 74 290q27 44 67 85.5t119 113.5z" />
+<glyph unicode=")" horiz-adv-x="333" d="M171 664l19 5q35 -63 51 -102.5t29 -94.5q19 -89 19 -168q0 -148 -78 -282q-52 -89 -182 -202l-13 15q62 65 95.5 123t59.5 139q49 152 49 305q0 145 -49 262z" />
+<glyph unicode="*" d="M328 459l37 -19q32 -16 63 -20q64 -9 64 -44q0 -37 -38 -37q-20 0 -46 32q-8 10 -14 16.5t-14 13.5l-11 9q-3 3 -16 12l-16 11l-18 13q1 -64 20 -117q8 -24 8 -34q0 -40 -37 -40t-37 38q0 11 10 41q18 50 18 112q-3 -2 -16 -10q-25 -15 -38 -26.5t-33 -36.5 q-27 -33 -51 -33q-15 0 -25 8.5t-10 23.5q0 38 62 48q35 6 53 13t51 27l-12 7q-45 26 -93 32q-61 7 -61 44q0 16 9.5 27.5t23.5 11.5q22 0 49 -31q42 -47 91 -76q0 48 -18 107q-8 27 -8 42q0 42 35 42q17 0 26.5 -11.5t9.5 -29.5q0 -10 -11 -48q-16 -51 -16 -104 q33 22 46 33.5t54 54.5q19 21 38 21q17 0 26 -11t9 -28q0 -36 -57 -43q-34 -4 -53.5 -12t-53.5 -29z" />
+<glyph unicode="+" horiz-adv-x="675" d="M590 220h-219v-220h-66v220h-219v66h219v220h66v-220h219v-66z" />
+<glyph unicode="," horiz-adv-x="250" d="M5 -129l-10 18q76 49 76 90q0 14 -20 29q-25 19 -25 49q0 18 14.5 31t36.5 13q26 0 42 -21.5t16 -52.5q0 -88 -130 -156z" />
+<glyph unicode="-" horiz-adv-x="333" d="M282 255l-13 -63h-220l14 63h219z" />
+<glyph unicode="." horiz-adv-x="250" d="M138 43q0 -22 -17 -38t-41 -16q-21 0 -37 16t-16 38q0 24 16 40.5t39 16.5t39.5 -17t16.5 -40z" />
+<glyph unicode="/" horiz-adv-x="278" d="M386 666l-378 -684h-73l378 684h73z" />
+<glyph unicode="0" d="M497 425q0 -110 -52 -222t-129 -167q-61 -43 -126 -43q-76 0 -117 59t-41 164q0 115 43.5 222t114.5 172.5t148 65.5t118 -65t41 -186zM418 518q0 130 -84 130q-67 0 -120 -95q-39 -71 -71 -194t-32 -203q0 -63 22 -99t59 -36q73 0 129 100q43 76 70 187.5t27 209.5z" />
+<glyph unicode="1" d="M401 676h3q5 0 5 -7q0 -8 -6 -29l-143 -519q-18 -64 -18 -74q0 -32 66 -32h21v-15h-279v15q59 4 81.5 15t30.5 40l136 488q8 30 8 36q0 31 -35 31h-3q-21 0 -59 -2v15l23 5q48 10 91.5 18t77.5 15z" />
+<glyph unicode="2" d="M101 507l-21 7q34 83 82 120q55 42 128 42q71 0 116.5 -48.5t45.5 -120.5q0 -50 -29.5 -96t-119.5 -138l-188 -192v-5h181q43 0 64 13.5t39 51.5l17 -7l-50 -134h-354v17l210 224q98 104 135 187q9 20 9 54q0 54 -31 87.5t-88 33.5q-96 0 -146 -96z" />
+<glyph unicode="3" d="M178 567l-16 5q48 104 171 104q58 0 95 -34t37 -88q0 -55 -34.5 -89t-120.5 -64v-3q50 -19 72.5 -53.5t22.5 -90.5q0 -117 -93 -199q-71 -62 -185 -62q-53 0 -82 16t-29 41q0 19 12 31t31 12q30 0 64 -30q36 -32 71 -32q52 0 93 46q38 45 38 126q0 79 -42.5 118.5 t-117.5 39.5h-24v16q119 21 175 60q62 43 62 106q0 41 -24 66t-64 25q-61 0 -112 -67z" />
+<glyph unicode="4" d="M479 676l-121 -435h96l-14 -63h-101l-46 -178h-79l49 178h-262l20 67l417 431h41zM373 563h-4l-304 -318v-4h212z" />
+<glyph unicode="5" d="M491 666l-23 -71h-230l-39 -88q220 -42 220 -223q0 -123 -87 -207t-211 -84q-47 0 -76.5 14t-29.5 43q0 17 11.5 29.5t28.5 12.5q22 0 56 -28q15 -13 22.5 -17.5t17.5 -8t24 -3.5q68 0 121.5 64t53.5 147q0 82 -53 125q-55 45 -166 61v16l104 218h256z" />
+<glyph unicode="6" d="M521 686v-16q-90 -12 -180 -79.5t-142 -162.5l4 -2q34 21 92 21q70 0 118.5 -50t48.5 -126q0 -114 -74.5 -196t-179.5 -82q-88 0 -133 57t-45 158t48.5 196.5t135.5 163.5q70 55 135 80t172 38zM373 289q0 54 -32.5 88t-84.5 34q-62 0 -98 -56q-23 -35 -37.5 -92.5 t-14.5 -112.5q0 -60 27.5 -95.5t70.5 -35.5q64 0 111 69q26 39 42 95t16 106z" />
+<glyph unicode="7" d="M537 656l-388 -664h-70l367 598l-2 3h-215q-48 0 -75 -14.5t-64 -58.5l-15 10l82 136h373z" />
+<glyph unicode="8" d="M225 360v1q-50 56 -68.5 89.5t-18.5 73.5q0 71 50 111.5t132 40.5q80 0 126.5 -37.5t46.5 -98.5q0 -59 -37 -95t-127 -63v-1q65 -60 90 -103t25 -97q0 -83 -60.5 -135.5t-154.5 -52.5q-84 0 -141.5 42t-57.5 126q0 69 51.5 120.5t143.5 78.5zM425 530q0 54 -29.5 88.5 t-77.5 34.5t-75 -29.5t-27 -78.5q0 -33 19 -63t76 -83q64 30 89 59.5t25 71.5zM369 155q0 43 -19.5 73t-102.5 116q-68 -26 -108.5 -78t-40.5 -117q0 -59 42.5 -96.5t96.5 -37.5q57 0 94.5 43t37.5 97z" />
+<glyph unicode="9" d="M352 272l-4 2q-72 -45 -129 -45q-66 0 -108 50t-42 129q0 59 25 115.5t68 95.5q63 57 149 57t133.5 -58.5t47.5 -159.5q0 -104 -50 -199.5t-142 -166.5q-60 -46 -118.5 -69t-158.5 -40v19q59 13 102 35t99 68q46 38 80.5 84.5t47.5 82.5zM417 518q0 62 -26 97t-73 35 q-62 0 -108 -61q-53 -70 -53 -175q0 -67 26 -103t74 -36q67 0 108 46q21 22 36.5 81.5t15.5 115.5z" />
+<glyph unicode=":" horiz-adv-x="333" d="M261 384q0 -23 -16.5 -38.5t-40.5 -15.5q-22 0 -38 16t-16 38q0 24 16 40.5t39 16.5t39.5 -16.5t16.5 -40.5zM161 43q0 -23 -16.5 -38.5t-40.5 -15.5q-22 0 -38 16t-16 38q0 23 16.5 40t39.5 17q22 0 38.5 -17t16.5 -40z" />
+<glyph unicode=";" horiz-adv-x="333" d="M261 384q0 -23 -16.5 -38.5t-40.5 -15.5q-22 0 -38 16t-16 38q0 24 16 40.5t39 16.5t39.5 -16.5t16.5 -40.5zM36 -129l-10 18q76 49 76 90q0 14 -20 29q-25 19 -25 49q0 18 14.5 31t36.5 13q26 0 42 -21.5t16 -52.5q0 -88 -130 -156z" />
+<glyph unicode="&#x3c;" horiz-adv-x="675" d="M592 -10l-508 230v66l508 230v-72l-420 -191l420 -191v-72z" />
+<glyph unicode="=" horiz-adv-x="675" d="M590 120h-504v66h504v-66zM590 320h-504v66h504v-66z" />
+<glyph unicode="&#x3e;" horiz-adv-x="675" d="M592 220l-508 -230v72l420 191l-420 191v72l508 -230v-66z" />
+<glyph unicode="?" d="M216 174l-18 3q14 79 33.5 117.5t82.5 101.5q84 84 84 164q0 35 -21.5 58.5t-58.5 23.5q-33 0 -51.5 -12.5t-18.5 -35.5q0 -10 8 -27q6 -13 6 -25q0 -13 -12.5 -24.5t-29.5 -11.5q-36 0 -36 49q0 48 38 78.5t97 30.5q153 0 153 -124q0 -49 -24 -85.5t-107 -98.5 q-55 -41 -81 -75.5t-37 -78.5zM237 38q0 -21 -16 -35.5t-37 -14.5q-23 0 -37.5 14t-14.5 36q0 24 15 39.5t37 15.5t37.5 -16.5t15.5 -38.5z" />
+<glyph unicode="@" horiz-adv-x="920" d="M686 68l12 -29q-122 -57 -224 -57q-150 0 -253 97.5t-103 239.5q0 145 105.5 246t257.5 101q145 0 235 -87t90 -206q0 -96 -55 -165.5t-129 -69.5q-73 0 -89 72q-52 -71 -121 -71q-38 0 -64.5 29.5t-26.5 75.5q0 54 23.5 112.5t70.5 101.5t104 43q50 0 68 -52l10 37h69 l-61 -236q-7 -27 -7 -39q0 -40 40 -40q47 0 87.5 61t40.5 140q0 107 -85 185t-202 78q-123 0 -200.5 -88t-77.5 -229q0 -131 78.5 -214t206.5 -83q97 0 200 47zM570 394q0 62 -40 62q-20 0 -46 -15t-45 -40q-47 -62 -47 -136q0 -39 15.5 -61.5t43.5 -22.5q43 0 81 68t38 145 z" />
+<glyph unicode="A" horiz-adv-x="611" d="M564 0h-245v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16zM369 262l-45 263l-149 -263h194z" />
+<glyph unicode="B" horiz-adv-x="611" d="M130 653h250q208 0 208 -150q0 -70 -64 -113q-34 -23 -111 -39v-1q126 -38 126 -150q0 -98 -74.5 -149t-200.5 -51h-272v16q41 6 55.5 20t27.5 60l121 436q11 39 11 64q0 22 -15 29.5t-62 11.5v16zM248 363h38q98 0 149.5 39t51.5 113q0 56 -28 82t-89 26 q-23 0 -31.5 -1.5t-15.5 -9t-12 -25.5zM238 331l-32 -119q-35 -133 -35 -140q0 -42 67 -42q88 0 140.5 44t52.5 126q0 45 -19 77t-48 42q-34 12 -126 12z" />
+<glyph unicode="C" horiz-adv-x="667" d="M689 664l-37 -200l-18 3q-18 163 -149 163q-109 0 -199 -97q-53 -56 -80.5 -136t-27.5 -165q0 -205 175 -205q62 0 113.5 26t115.5 93l18 -15q-67 -79 -131.5 -114t-141.5 -35q-117 0 -189 69.5t-72 191.5q0 103 51 196.5t136 153.5q102 73 219 73q69 0 117 -17 q20 -7 41 -7q27 0 38 22h21z" />
+<glyph unicode="D" horiz-adv-x="722" d="M131 653h277q134 0 213 -70t79 -199q0 -177 -160 -301q-106 -83 -291 -83h-257v16q43 8 56.5 20t25.5 56l122 445q11 39 11 59q0 21 -16 30.5t-60 10.5v16zM310 584l-118 -422q-22 -80 -22 -95q0 -37 68 -37q148 0 241 90q52 50 81 129.5t29 158.5q0 121 -78 180 q-47 35 -131 35q-32 0 -47.5 -7.5t-22.5 -31.5z" />
+<glyph unicode="E" horiz-adv-x="611" d="M634 653l-31 -154l-22 2q3 25 3 46q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 24 -7 31q-16 15 -78 15h-78l-32 -112q-36 -127 -36 -146q0 -34 79 -34q129 0 203 39q38 20 94 98l16 -8l-62 -162 h-507v16q43 8 56 19.5t25 54.5l123 442q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497z" />
+<glyph unicode="F" horiz-adv-x="611" d="M645 653l-32 -154l-21 2q3 22 3 33q0 39 -14 55.5t-54 23.5t-131 7q-35 0 -49 -6.5t-19 -25.5l-64 -227q49 1 71.5 1t48.5 4.5t34.5 8t22.5 17t20 25t19 38.5l18 -5l-76 -235l-17 5q8 41 8 61q0 28 -17.5 36t-57.5 8q-28 0 -83 3l-59 -213q-14 -50 -14 -60q0 -18 17 -27 t60 -12v-16h-251v16q41 3 56 19t27 59l123 442q10 36 10 61q0 21 -13.5 28.5t-62.5 11.5v16h497z" />
+<glyph unicode="G" horiz-adv-x="722" d="M722 319v-16q-49 -3 -67.5 -16.5t-29.5 -55.5l-49 -187q-111 -62 -237 -62q-137 0 -213 76q-35 35 -54.5 88t-19.5 105q0 103 50 194t133 149q104 72 220 72q72 0 134 -24q26 -10 44 -10q36 0 60 34l15 -5l-49 -197l-18 3q-3 64 -37 106q-48 59 -141 59q-117 0 -195 -99 q-50 -63 -78 -143t-28 -162q0 -99 53 -154t149 -55q71 0 105 34q9 9 16 26.5t23 74.5q26 87 26 113q0 29 -47 33l-32 3v16h267z" />
+<glyph unicode="H" horiz-adv-x="722" d="M769 653v-16q-44 -8 -58 -20t-26 -54l-132 -481q-3 -12 -3 -24q0 -21 15 -29t64 -13v-16h-274v16q51 4 71.5 21t30.5 56l64 233h-285l-66 -244q-3 -10 -3 -22q0 -22 12.5 -30t57.5 -14v-16h-245v16q41 4 56.5 20t29.5 66l118 430q12 46 12 64q0 21 -14.5 28.5t-62.5 12.5 v16h271v-16q-45 -3 -67.5 -19t-32.5 -52l-54 -198h285l46 164q14 52 14 63q0 19 -16 29t-56 13v16h248z" />
+<glyph unicode="I" horiz-adv-x="333" d="M384 653v-16q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="J" horiz-adv-x="444" d="M491 653v-16q-43 -6 -56 -17.5t-26 -56.5l-103 -367q-29 -104 -71 -159t-124 -55q-53 0 -85 24t-32 64q0 24 12.5 40t32.5 16t35.5 -13.5t15.5 -32.5q0 -6 -1.5 -14.5t-1.5 -12.5q0 -39 35 -39t53 64l127 454q12 44 12 64t-15 28.5t-62 12.5v16h254z" />
+<glyph unicode="K" horiz-adv-x="667" d="M722 653v-16q-28 0 -77 -37l-298 -225l168 -293q23 -40 40 -50.5t64 -15.5v-16h-275v16l29 3q46 4 46 32q0 6 -1.5 13t-6.5 16l-8 16l-11 19q-8 14 -10 18l-123 215l-65 -237q-11 -39 -11 -51q0 -23 14.5 -31.5t56.5 -12.5v-16h-247v16q43 5 56 17t25 54l124 445 q14 50 14 62q0 21 -17 31t-62 12v16h270v-16q-42 -3 -65 -18.5t-34 -55.5l-53 -194l153 109q143 101 143 137q0 15 -36 19l-24 3v16h221z" />
+<glyph unicode="L" horiz-adv-x="556" d="M559 180l-58 -180h-509v16q42 4 55 17t27 61l122 438q11 37 11 62q0 22 -15.5 31t-61.5 12v16h273v-16q-46 -3 -67.5 -19t-33.5 -58l-120 -429q-10 -38 -10 -54q0 -23 22 -32t83 -9q77 0 110.5 7t69.5 31q41 27 82 112z" />
+<glyph unicode="M" horiz-adv-x="833" d="M872 653v-16q-41 -7 -55.5 -20.5t-25.5 -53.5l-123 -443q-14 -50 -14 -62q0 -20 18 -30.5t63 -11.5l-1 -16h-271v16q49 5 69 22t33 64l126 459l-376 -561h-17l-62 546l-118 -428q-9 -32 -9 -54q0 -43 70 -48v-16h-197v16q40 5 58.5 28.5t41.5 105.5l114 401q12 41 12 52 q0 30 -74 34v16h181l56 -492l335 492h166z" />
+<glyph unicode="N" horiz-adv-x="667" d="M727 653v-16q-27 -6 -37.5 -9.5t-23 -21t-18.5 -38.5l-23 -76l-146 -507h-18l-230 550l-114 -422q-9 -31 -9 -54q0 -21 15.5 -30.5t54.5 -12.5v-16h-198v16q43 6 61 31.5t45 120.5l117 415q-23 54 -86 54v16h160l207 -499l106 388q8 28 8 44q0 27 -13.5 37t-55.5 14v16 h198z" />
+<glyph unicode="O" horiz-adv-x="722" d="M699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5 t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="P" horiz-adv-x="611" d="M146 653h241q218 0 218 -148q0 -40 -18.5 -78.5t-49.5 -64.5q-69 -57 -205 -57q-55 0 -90 8l-53 -193q-14 -54 -14 -63q0 -18 15 -27.5t54 -13.5v-16h-244v16q43 6 56.5 19.5t27.5 62.5l116 414q17 61 17 83q0 20 -14 28.5t-57 13.5v16zM320 592l-69 -245q29 -5 52 -5 q87 0 128 24q71 40 71 134q0 123 -130 123q-44 0 -52 -31z" />
+<glyph unicode="Q" horiz-adv-x="722" d="M69 -169l-10 16q58 41 83.5 61t93.5 80q-85 17 -130.5 78.5t-45.5 158.5q0 93 46 185t127 162q111 94 241 94q101 0 163 -67t62 -170q0 -117 -71 -229.5t-185 -172.5q-68 -37 -164 -43l-54 -57h25q35 0 123 -20q86 -21 111 -21q54 0 90 16.5t78 60.5l16 -11 q-24 -34 -52 -59q-83 -75 -191 -75q-66 0 -148 26q-55 18 -93 18q-59 0 -115 -31zM594 480q0 71 -34.5 112t-94.5 41q-110 0 -194 -125q-45 -67 -75.5 -159.5t-30.5 -165.5q0 -75 34 -120.5t90 -45.5q114 0 198 124q46 70 76.5 166t30.5 173z" />
+<glyph unicode="R" horiz-adv-x="611" d="M132 653h252q97 0 150.5 -38t53.5 -103q0 -78 -66 -128q-39 -30 -131 -51l89 -235q17 -46 35.5 -64t51.5 -18v-16h-147l-123 324l-66 5l-55 -203q-13 -46 -13 -63q0 -23 13 -33t54 -14v-16h-243v16q40 5 56.5 22t28.5 63l119 431q12 46 12 63q0 18 -14 28q-12 8 -57 14 v16zM306 593l-63 -227q31 -5 51 -5q89 0 139 40t50 110q0 52 -31 82t-89 30q-49 0 -57 -30z" />
+<glyph unicode="S" d="M508 667l-40 -200l-18 3q0 83 -25 123t-94 40q-52 0 -82 -26.5t-30 -73.5q0 -38 16 -63.5t83 -92.5q67 -68 90 -109t23 -91q0 -85 -57.5 -140t-144.5 -55q-38 0 -104 23q-32 12 -47 12q-33 0 -43 -32h-18l34 224l20 -2q-2 -9 -2 -23q0 -73 40.5 -120t103.5 -47 q58 0 94.5 35.5t36.5 92.5q0 33 -13 59.5t-47 63.5l-39 42q-3 3 -17 18.5t-22 23.5q-45 48 -60 78.5t-15 71.5q0 76 51.5 120t126.5 44q52 0 85 -14q29 -11 46 -11t26 5t19 21h23z" />
+<glyph unicode="T" horiz-adv-x="556" d="M633 653l-44 -164l-17 2q3 25 3 46q0 81 -101 81h-58l-137 -490q-14 -49 -14 -66q0 -23 11 -31.5t42 -11.5l35 -3v-16h-288v16q52 5 74 20t33 55l143 527q-119 0 -160.5 -21.5t-77.5 -102.5l-18 4l42 155h532z" />
+<glyph unicode="U" horiz-adv-x="722" d="M765 653v-16q-21 -5 -31.5 -9.5t-20.5 -11t-17.5 -24.5t-14.5 -39t-20 -65l-83 -285q-34 -116 -97 -169q-60 -52 -158 -52t-159.5 46t-61.5 118q0 55 44 216l52 189q9 32 9 45q0 20 -17.5 30t-62.5 11v16h272v-16q-51 -5 -70.5 -22t-33.5 -69l-63 -226q-40 -141 -40 -179 q0 -53 39.5 -85.5t98.5 -32.5q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32t-55 14v16h198z" />
+<glyph unicode="V" horiz-adv-x="611" d="M688 653v-16q-32 -1 -56 -40l-373 -615h-19l-82 503q-17 105 -28.5 126t-53.5 26v16h240v-16q-47 -5 -61.5 -15t-14.5 -36q0 -10 1 -15l65 -443l210 360q49 84 49 115q0 27 -62 34v16h185z" />
+<glyph unicode="W" horiz-adv-x="833" d="M906 653v-16q-29 -9 -42.5 -22t-34.5 -53l-301 -580h-20l-50 453h-5l-222 -453h-19l-61 514q-8 70 -13 92.5t-16 33.5q-10 10 -51 15v16h235v-16q-41 -4 -56.5 -14t-15.5 -37q0 -13 1 -20l44 -404l172 348l-8 65q-4 38 -17.5 49t-57.5 13v16h236v-16q-39 -4 -53.5 -14 t-14.5 -34q0 -3 1 -8.5t1 -6.5l40 -412l188 365q23 44 23 68q0 41 -67 42v16h184z" />
+<glyph unicode="X" horiz-adv-x="611" d="M655 653v-16q-33 -11 -60.5 -31.5t-64.5 -63.5l-169 -194l101 -255q18 -45 36 -58t69 -19v-16h-271v16q43 1 60 9.5t17 27.5q0 16 -14 51l-67 165l-151 -172q-23 -26 -23 -48q0 -33 66 -33v-16h-213v16q40 7 76 40.5t144 159.5l83 97l-103 255q-15 37 -33.5 51t-61.5 18 v16h263v-16q-41 -5 -56 -13.5t-15 -27.5q0 -17 16 -56l59 -147l145 167q21 24 21 43q0 31 -61 34v16h207z" />
+<glyph unicode="Y" horiz-adv-x="556" d="M633 653v-16q-21 -7 -32 -17.5t-38 -43.5l-219 -270l-36 -123q-30 -103 -30 -127q0 -19 11.5 -27t41.5 -10l36 -3v-16h-289v16q51 3 72.5 18.5t34.5 62.5l59 205l-76 267q-11 40 -23.5 51t-53.5 17v16h239v-16q-44 -4 -58 -11.5t-14 -24.5t36 -144l31 -110l39 46 q149 176 149 213q0 24 -40 28l-29 3v16h189z" />
+<glyph unicode="Z" horiz-adv-x="556" d="M606 639l-483 -603h161q71 0 108.5 6t64.5 26q41 30 77 104l19 -3l-54 -169h-505v14l479 603h-171q-102 0 -142 -27q-22 -15 -32.5 -30.5t-33.5 -58.5l-19 5l45 147h486v-14z" />
+<glyph unicode="[" horiz-adv-x="389" d="M391 663l-7 -27h-62q-21 0 -31.5 -9t-15.5 -29l-158 -667q-6 -24 -6 -29q0 -28 49 -28h56l-7 -27h-188l197 816h173z" />
+<glyph unicode="\" horiz-adv-x="278" d="M319 -18h-71l-289 684h72z" />
+<glyph unicode="]" horiz-adv-x="389" d="M382 663l-197 -816h-173l7 27h62q22 0 32 9t15 32l160 670q4 16 4 25q0 26 -49 26h-57l7 27h189z" />
+<glyph unicode="^" horiz-adv-x="422" d="M422 301h-68l-143 289h-1l-142 -289h-68l181 365h60z" />
+<glyph unicode="_" d="M500 -125h-500v50h500v-50z" />
+<glyph unicode="`" horiz-adv-x="333" d="M311 492h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23z" />
+<glyph unicode="a" horiz-adv-x="501" d="M463 111l13 -11q-56 -68 -82.5 -89t-56.5 -21q-40 0 -40 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5q-44 0 -72 30.5t-28 85.5q0 76 43.5 155t110.5 130t132 51q67 0 80 -58l11 48l3 3l61 7l7 -3q-1 -4 -6 -21q-89 -324 -89 -363q0 -13 14 -13q15 0 52 41zM365 361 q0 26 -15 42t-41 16q-68 0 -131 -92q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225z" />
+<glyph unicode="b" d="M163 290h1q50 83 94.5 117t98.5 34q52 0 84 -32t32 -88q0 -77 -47 -155t-122.5 -127.5t-150.5 -49.5q-46 0 -88 16t-42 37v6l142 523q9 36 9 47q0 16 -9.5 19.5t-54.5 5.5v17q75 9 153 23l5 -5l-21 -82zM388 306q0 86 -70 86q-69 0 -137 -115q-32 -54 -52 -119.5 t-20 -111.5q0 -34 46 -34q66 0 123 59q46 48 78 114.5t32 120.5z" />
+<glyph unicode="c" horiz-adv-x="444" d="M350 107l16 -10q-46 -58 -89.5 -83t-99.5 -25q-71 0 -109 39t-38 115q0 67 34 129.5t89 107.5q77 61 167 61q46 0 75.5 -23t29.5 -58q0 -20 -14 -34t-34 -14t-29.5 11.5t-9.5 28.5q0 9 7.5 23.5t7.5 24.5q0 20 -37 20q-63 0 -109 -48q-91 -96 -91 -233q0 -54 23 -84 t66 -30q39 0 71 19t74 63z" />
+<glyph unicode="d" d="M521 683l6 -6l-39 -152l-60 -219q-65 -239 -65 -246q0 -20 18 -20q13 0 27.5 12.5t54.5 58.5l12 -10q-77 -114 -147 -114q-19 0 -30 12t-11 33q0 30 13 89q-43 -73 -84.5 -102.5t-93.5 -29.5q-50 0 -78.5 30.5t-28.5 86.5q0 119 96.5 227t195.5 108q31 0 45.5 -14 t19.5 -44h1l45 163q14 49 14 71q0 16 -11 20t-53 6v17q77 7 153 23zM356 361q0 26 -14.5 41.5t-32.5 15.5q-47 0 -91 -46q-50 -53 -83 -126.5t-33 -135.5q0 -34 15.5 -53.5t42.5 -19.5q45 0 91 49t75.5 125t29.5 150z" />
+<glyph unicode="e" horiz-adv-x="444" d="M358 109l12 -12q-88 -108 -204 -108q-61 0 -98 37.5t-37 99.5q0 117 93.5 216t205.5 99q39 0 60.5 -18t21.5 -50q0 -66 -76.5 -118t-207.5 -69q-10 -20 -10 -61t25.5 -66t67.5 -25q33 0 63 15.5t84 59.5zM152 252l-17 -44q112 27 161 74q50 48 50 97q0 39 -35 39 q-42 0 -87.5 -48.5t-71.5 -117.5z" />
+<glyph unicode="f" horiz-adv-x="278" d="M41 428h93q39 126 72 173q54 77 132 77q37 0 61.5 -17.5t24.5 -44.5q0 -17 -12.5 -30t-29.5 -13q-14 0 -25.5 11t-11.5 28q0 10 5 19t5 12q0 13 -22 13q-42 0 -71 -54.5t-51 -173.5h107l-6 -32h-108l-72 -320q-64 -283 -200 -283q-34 0 -56.5 17.5t-22.5 43.5 q0 17 11 29.5t27 12.5q17 0 27.5 -10.5t10.5 -26.5q0 -7 -4.5 -15.5t-4.5 -13.5q0 -16 20 -16q62 0 97 162l88 420h-91z" />
+<glyph unicode="g" d="M471 366h-49q9 -18 9 -51q0 -63 -57.5 -113.5t-127.5 -50.5q-18 0 -31 3q-3 1 -7 1q-13 0 -24.5 -13t-11.5 -28q0 -24 71 -42q142 -34 142 -127q0 -67 -56 -109t-154 -42q-78 0 -122.5 27.5t-44.5 80.5q0 39 22.5 66.5t94.5 70.5q-27 17 -27 39q0 48 77 84 q-79 28 -79 108q0 74 61 122.5t140 48.5q58 0 98 -28q11 -8 16 -8h60v-39zM352 348q0 39 -13.5 55t-42.5 16q-48 0 -85 -50t-37 -122q0 -35 16 -55t44 -20q50 0 85 59q33 56 33 117zM325 -90q0 35 -31.5 58.5t-111.5 48.5q-24 7 -34 11q-7 0 -30.5 -19t-34.5 -33 q-20 -25 -20 -58q0 -102 127 -102q59 0 97 27.5t38 66.5z" />
+<glyph unicode="h" d="M465 118l13 -13q-46 -65 -77 -89.5t-69 -24.5q-20 0 -32 11.5t-12 30.5q0 17 20 92l55 207q7 28 7 33q0 25 -28 25q-27 0 -69.5 -40t-82.5 -100q-31 -48 -49 -93.5t-47 -156.5h-75l146 554q13 50 13 62t-13 18.5t-28 6.5h-27v15q76 9 157 27l7 -6l-121 -447 q130 211 230 211q33 0 49 -18.5t16 -48.5q0 -43 -48 -193q-33 -101 -33 -125q0 -18 16 -18q12 0 26.5 14.5t55.5 65.5z" />
+<glyph unicode="i" horiz-adv-x="278" d="M222 114l13 -11q-42 -65 -71 -89.5t-66 -24.5q-49 0 -49 55q0 29 22 111l48 177q9 32 9 44q0 15 -11.5 19t-52.5 5v16q46 4 160 25l4 -3l-94 -343q-10 -34 -10 -44q0 -15 14 -15q25 0 84 78zM264 599q0 -21 -14.5 -36t-34.5 -15q-22 0 -35 14.5t-13 38.5q0 23 13.5 38 t33.5 15t35 -16.5t15 -38.5z" />
+<glyph unicode="j" horiz-adv-x="278" d="M246 438l-104 -410q-31 -121 -76.5 -178t-110.5 -57q-35 0 -57 17t-22 44q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -12 18 -12q30 0 50.5 39t46.5 143l72 292q16 65 16 80q0 17 -10.5 24t-37.5 7h-26v16q45 3 169 25zM279 598q0 -20 -15 -35t-35 -15 q-23 0 -38.5 14.5t-15.5 37.5q0 22 16 37t37 15q20 0 35.5 -16.5t15.5 -37.5z" />
+<glyph unicode="k" horiz-adv-x="444" d="M461 428v-16q-36 -2 -76 -29.5t-149 -124.5l37 -88q55 -129 81 -129q21 0 45 42q5 8 15 26l15 -11q-35 -63 -58 -86t-53 -23q-22 0 -39.5 17.5t-41.5 64.5q-30 58 -60 141l-40 -32l-48 -180h-75l141 528q14 50 18 88q-3 24 -51 24h-18v16q75 9 157 27l6 -6l-120 -456 l43 33q143 110 143 140q0 18 -37 18h-14v16h179z" />
+<glyph unicode="l" horiz-adv-x="278" d="M279 678l-153 -585q-8 -29 -8 -43q0 -18 17 -18q27 0 67 57l25 35l14 -10q-45 -71 -77.5 -98t-73.5 -27q-49 0 -49 56q0 17 4 30l137 524q3 10 3 19q0 22 -49 22h-18v16q70 8 155 27z" />
+<glyph unicode="m" horiz-adv-x="722" d="M704 105l-5 -7q-77 -107 -144 -107q-40 0 -40 46q0 15 13 66l58 227q7 28 7 38q0 9 -6 15t-14 6q-47 0 -131 -117q-37 -52 -58 -104.5t-50 -167.5h-75l27 93q68 235 68 271q0 25 -22 25q-25 0 -66 -39.5t-83 -103.5q-25 -39 -42.5 -83t-53.5 -163h-75l43 144 q55 183 55 228q0 22 -41 22h-25v16l162 31l3 -2l-58 -209q130 211 220 211q29 0 44.5 -16t15.5 -44q0 -38 -40 -152q53 84 88.5 126.5t71.5 65.5q32 20 63 20q27 0 42.5 -17.5t15.5 -45.5q0 -13 -3 -28l-68 -251q-10 -38 -10 -45q0 -16 12 -16q22 0 65 53l21 26z" />
+<glyph unicode="n" d="M460 117l14 -13q-51 -70 -78 -91.5t-62 -21.5q-20 0 -33.5 13.5t-13.5 40.5q0 16 16 75l44 162q14 54 14 79q0 29 -24 29q-29 0 -63.5 -34.5t-84.5 -107.5q-33 -49 -48.5 -88t-51.5 -160h-75l96 350q2 10 2 17q0 15 -13.5 20.5t-51.5 6.5v16q39 8 87 16.5t75 14.5l4 -2 l-67 -218q74 118 128 169t103 51q31 0 48 -16.5t17 -44.5q0 -25 -10 -60l-56 -203q-14 -50 -14 -61q0 -18 16 -18q19 0 61 53q7 8 21 26z" />
+<glyph unicode="o" d="M468 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM384 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5 q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="p" horiz-adv-x="504" d="M215 428l-29 -100q75 113 171 113q55 0 85 -33t30 -92q0 -123 -93.5 -225t-203.5 -102q-36 0 -69 17q-40 -165 -40 -166q0 -16 13.5 -22.5t48.5 -6.5v-16h-203v16q32 1 45.5 14t22.5 49l115 432q16 58 16 71q0 27 -44 27h-22l-2 15l156 22q5 0 5 -4q-1 -5 -2 -9zM382 313 q0 44 -14.5 64.5t-47.5 20.5q-39 0 -78 -34t-57 -80q-22 -57 -43.5 -135t-21.5 -103q0 -17 13.5 -27.5t34.5 -10.5q78 0 145 95q69 96 69 210z" />
+<glyph unicode="q" d="M484 428l-165 -579q-2 -8 -2 -11q0 -31 57 -31h15v-16h-237v16q46 3 64 15t27 41l90 290q-59 -94 -104 -129t-104 -35q-47 0 -73.5 31t-26.5 85q0 77 44.5 156t113 129.5t135.5 50.5q63 0 77 -62l16 49h73zM380 359q0 25 -17 42.5t-42 17.5q-41 0 -93 -49 q-51 -49 -84 -119t-33 -132q0 -77 53 -77q41 0 82 36q51 44 92.5 131.5t41.5 149.5z" />
+<glyph unicode="r" horiz-adv-x="389" d="M176 223l16 35q34 75 94 138q43 45 79 45q21 0 34 -14t13 -37t-12.5 -38.5t-34.5 -15.5q-19 0 -35 26q-8 14 -16 14q-27 0 -82 -94q-34 -58 -54.5 -109.5t-56.5 -172.5h-76l81 292q16 59 16 82q0 26 -38 26q-8 0 -31 -3v17l155 27l3 -2z" />
+<glyph unicode="s" horiz-adv-x="389" d="M366 442l-20 -140h-16q-14 116 -89 116q-27 0 -43 -15t-16 -42q0 -38 54 -102q68 -79 68 -136q0 -61 -40.5 -97.5t-103.5 -36.5q-29 0 -55 10q-21 9 -44 9q-20 0 -29 -21h-16l20 159h16q20 -136 100 -136q36 0 56 20t20 57q0 45 -56 115q-63 79 -63 131q0 50 33 79t88 29 q20 0 56 -10q22 -7 36 -7q20 0 30 18h14z" />
+<glyph unicode="t" horiz-adv-x="278" d="M296 428l-5 -32h-84l-87 -328q-2 -8 -2 -14q0 -16 15 -16q12 0 28 15.5t53 63.5l13 -7q-46 -70 -75.5 -95.5t-67.5 -25.5q-46 0 -46 37q0 10 16 74l78 296h-75l-1 6q0 18 33 25q25 6 66 38.5t67 71.5q6 9 14 9q9 0 9 -8q0 -5 -1 -7l-28 -103h80z" />
+<glyph unicode="u" d="M461 119l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 18 27 128l35 139q14 58 14 67q0 12 -11 18t-50 6v14q69 8 150 27l4 -3l-89 -355q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5 h74l-79 -299q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65z" />
+<glyph unicode="v" horiz-adv-x="444" d="M207 70l31 32q54 55 95.5 125.5t41.5 105.5q0 12 -18 29q-25 22 -25 45q0 15 11 24.5t27 9.5q24 0 40 -18.5t16 -40.5q0 -58 -63 -155q-55 -85 -119 -153l-22 -23q-13 -14 -19 -21t-15 -16l-14 -14q-5 -5 -11 -10t-10 -6.5t-8 -1.5q-9 0 -9 27v24q0 138 -24 278 q-10 57 -21.5 75t-39.5 18q-20 0 -31 -1v13q55 9 112 21q11 4 20 4q6 0 9.5 -13t20.5 -101q18 -91 25 -257z" />
+<glyph unicode="w" horiz-adv-x="667" d="M403 426l32 -352q99 123 132 175.5t33 84.5q0 14 -22 35q-21 20 -21 41q0 12 11.5 21.5t27.5 9.5q22 0 37 -16t15 -40q0 -91 -212 -349l-9 -11q-35 -43 -45 -43q-8 0 -11 35l-29 310l-89 -152q-23 -38 -55 -99q-49 -94 -64 -94q-7 0 -9 9t-4 38l-4 91q-8 164 -27 242 q-7 27 -15.5 34.5t-31.5 7.5h-28v13q79 13 95 17q5 1 11.5 3t10.5 3t7 1q8 0 11 -5t8 -29q25 -120 32 -281l192 304q6 10 13 10q8 0 8 -14z" />
+<glyph unicode="x" horiz-adv-x="444" d="M243 355l12 -57q53 81 85.5 112t65.5 31q18 0 29.5 -10.5t11.5 -26.5t-9.5 -26t-24.5 -10q-9 0 -24 8.5t-28 8.5q-29 0 -98 -121q0 -13 8 -45l32 -134q10 -41 30 -41q16 0 47 40l7 10l7 10q3 4 7 8l15 -9q-43 -67 -68 -90.5t-54 -23.5q-24 0 -37 15t-22 53l-29 119 l-88 -119q-31 -42 -50.5 -55t-44.5 -13q-23 0 -36.5 11t-13.5 31q0 15 9.5 25.5t24.5 10.5q12 0 32 -11q15 -9 26 -9q17 0 51 49l82 116l-28 124q-10 44 -18.5 56t-27.5 12q-12 0 -39 -7l-18 -5l-3 16l11 4q80 29 117 29q19 0 30 -18t21 -68z" />
+<glyph unicode="y" horiz-adv-x="444" d="M243 186l21 -110q67 110 94.5 167.5t27.5 89.5q0 16 -26 32q-26 17 -26 39q0 16 11.5 26.5t28.5 10.5q22 0 37 -16t15 -39q0 -87 -131 -305q-78 -129 -151.5 -208t-116.5 -79q-23 0 -37 12t-14 31q0 17 11.5 28.5t27.5 11.5q19 0 34 -14t27 -14q18 0 48 33 q13 13 38.5 46.5t32.5 44.5q10 20 10 35q0 30 -31 155.5t-51 176.5q-14 37 -30.5 50.5t-46.5 13.5q-16 0 -31 -4v17q22 4 32 6q41 8 107 18h4q11 0 41.5 -93t43.5 -162z" />
+<glyph unicode="z" horiz-adv-x="389" d="M380 417l-289 -344q46 -10 68.5 -25t51.5 -58q34 -50 70 -50q27 0 27 15q0 5 -5 15q-8 16 -8 28q1 13 11 23.5t22 10.5q16 0 25.5 -10t9.5 -27q0 -31 -26 -53.5t-67 -22.5q-42 0 -113 44q-68 42 -105 42q-23 0 -45 -18l-9 9l310 372h-136q-40 0 -58 -11.5t-33 -48.5 l-16 4l32 116h283v-11z" />
+<glyph unicode="{" horiz-adv-x="400" d="M407 687l-3 -11q-47 -12 -70 -38.5t-39 -85.5l-45 -168q-16 -62 -40.5 -89t-73.5 -40q56 -24 56 -63q0 -31 -44 -190q-22 -84 -22 -102q0 -28 12 -43t41 -23l-3 -11q-69 2 -97 19.5t-28 58.5q0 33 32 144q34 116 34 153q0 22 -11.5 34t-41.5 23q48 13 69.5 36t36.5 78 l48 178q22 79 63 109.5t126 30.5z" />
+<glyph unicode="|" horiz-adv-x="275" d="M171 -18h-66v684h66v-684z" />
+<glyph unicode="}" horiz-adv-x="400" d="M221 676l3 11q69 -2 97 -19.5t28 -58.5q0 -35 -32 -144q-34 -117 -34 -153q0 -22 11.5 -34t41.5 -23q-48 -13 -69.5 -36t-36.5 -78l-48 -178q-22 -79 -63.5 -109.5t-125.5 -30.5l3 11q47 12 70 38.5t39 85.5l45 168q16 62 40 89t74 40q-56 24 -56 63q0 31 44 190 q22 80 22 101q0 52 -53 67z" />
+<glyph unicode="~" horiz-adv-x="541" d="M466 323l36 -50q-33 -48 -61.5 -67t-63.5 -19q-46 0 -103 33q-60 35 -113 35q-25 0 -48.5 -18.5t-36.5 -53.5l-36 50q44 86 122 86q47 0 114 -31l18 -9l27 -13q12 -5 27 -10t25 -5q29 0 46.5 14.5t46.5 57.5z" />
+<glyph unicode="&#xa1;" horiz-adv-x="389" d="M321 419q0 -20 -16 -35.5t-36 -15.5q-22 0 -38 16t-16 38q0 21 16.5 36.5t38.5 15.5t36.5 -15.5t14.5 -39.5zM224 285l17 -4q-46 -204 -72 -370q-10 -62 -26.5 -89t-43.5 -27q-40 0 -40 50q0 41 38 124q50 108 127 316z" />
+<glyph unicode="&#xa2;" d="M414 560l-42 -120q45 -4 70 -22q30 -23 30 -58q0 -20 -13.5 -34t-34.5 -14q-18 0 -28.5 11t-10.5 29q0 12 9 29q6 13 6 18q0 20 -35 21l-137 -391q11 -4 24 -4q38 0 70 18.5t75 64.5l16 -10q-45 -58 -89 -83.5t-98 -25.5q-6 0 -11 1l-47 -133h-31l48 136q-37 8 -58 25 q-50 39 -50 122q0 77 40.5 148t111.5 115q42 26 113 37l42 120h30zM202 41l132 376q-47 -10 -85 -48q-41 -42 -63.5 -104t-22.5 -123q0 -68 39 -101z" />
+<glyph unicode="&#xa3;" d="M82 361h109q15 87 36.5 141.5t59.5 99.5q57 68 137 68q41 0 67 -21t26 -55q0 -41 -39 -41q-30 0 -36 44t-40 44q-42 0 -64.5 -53t-57.5 -227h124l-7 -42h-127q-19 -81 -30.5 -114t-42.5 -101q90 -38 160 -38q39 0 79 28l10 7l11 -9q-41 -100 -142 -100q-37 0 -65.5 13 t-78.5 52q-28 -37 -48.5 -50t-47.5 -13q-31 0 -48 17t-17 47q0 28 24 48t64 20q34 0 62 -11l25 204h-112zM146 73q-35 25 -61 25q-23 0 -38 -12.5t-15 -32.5q0 -16 12.5 -26.5t30.5 -10.5q20 0 40 16t31 41z" />
+<glyph unicode="&#xa4;" d="M522 40l-48 -50l-98 98q-59 -41 -125 -41q-68 0 -127 41l-96 -98l-50 50l98 96q-41 59 -41 126q0 69 41 126l-98 98l50 48l96 -96q60 39 127 39q69 0 125 -39l98 96l48 -48l-96 -98q39 -57 39 -125q0 -67 -39 -127zM397 263q0 62 -42.5 106t-101.5 44q-62 0 -106 -43.5 t-44 -105.5q0 -64 43 -108.5t105 -44.5q61 0 103.5 44t42.5 108z" />
+<glyph unicode="&#xa5;" d="M605 653v-16q-25 -11 -38.5 -21.5t-36.5 -39.5l-181 -224h149l-12 -40h-168l-6 -8l-24 -82h178l-12 -40h-178q-31 -94 -31 -118q0 -41 54 -45l36 -3v-16h-283l4 16q54 5 76 21t35 61l25 84h-164l12 40h163l23 80l-3 10h-162l12 40h139l-63 216q-12 40 -26 51.5t-62 17.5 v16h237v-16q-46 -4 -59.5 -11t-13.5 -23q0 -27 39 -156l29 -100q19 21 28 33q93 108 127 154.5t35 71.5q0 24 -42 28l-25 3v16h189z" />
+<glyph unicode="&#xa6;" horiz-adv-x="275" d="M171 391h-66v275h66v-275zM171 -18h-66v275h66v-275z" />
+<glyph unicode="&#xa7;" d="M249 398l2 3q-38 47 -52.5 77t-14.5 63q0 55 41.5 90t105.5 35q57 0 93.5 -28t36.5 -71q0 -25 -14 -40t-38 -15q-20 0 -33 12.5t-13 32.5t21 38q13 12 13 19q0 13 -17.5 22t-42.5 9q-43 0 -67.5 -22.5t-24.5 -60.5q0 -40 26 -72l123 -150q41 -50 41 -114 q0 -57 -32.5 -91.5t-85.5 -34.5q-19 0 -33 7l-2 -3q39 -50 51 -74.5t12 -54.5q0 -59 -44.5 -98t-111.5 -39q-57 0 -96.5 31t-39.5 77q0 26 15 41t41 15q47 0 47 -43q0 -30 -27 -46q-15 -10 -15 -17q0 -15 21.5 -26t49.5 -11q45 0 73.5 25t28.5 65q0 39 -50 97l-76 87 q-71 82 -71 153q0 51 31 87t75 36q25 0 53 -11zM377 192q0 25 -12.5 51t-44.5 69q-57 76 -107 76q-28 0 -47 -19t-19 -47q0 -53 60.5 -127t104.5 -74q27 0 46 21t19 50z" />
+<glyph unicode="&#xa8;" horiz-adv-x="333" d="M205 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM405 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34z" />
+<glyph unicode="&#xa9;" horiz-adv-x="760" d="M545 240l-15 -68q-1 -8 -5 -11t-16 -7q-64 -18 -111 -18q-95 0 -151 51t-56 136q0 89 60.5 144.5t157.5 55.5q46 0 99 -18q21 -6 21 -21v-69h-16q-15 88 -107 88q-67 0 -102.5 -44.5t-35.5 -127.5q0 -84 36.5 -129.5t104.5 -45.5q43 0 71 20t49 64h16zM719 318 q0 -139 -98.5 -237.5t-238.5 -98.5q-143 0 -242 99t-99 242t99 243t240 100q144 0 241.5 -100t97.5 -248zM664 319q0 127 -82.5 216t-200.5 89q-116 0 -200.5 -89t-84.5 -212q0 -122 84.5 -210.5t200.5 -88.5q115 0 199 88t84 207z" />
+<glyph unicode="&#xaa;" horiz-adv-x="276" d="M299 673l53 2q-48 -168 -54 -203l-3 -15q-1 -3 -1 -7q0 -7 4 -7q7 0 31 24l14 15l7 -10q-37 -41 -53.5 -53.5t-36.5 -12.5q-31 0 -31 25q0 19 17 62q-38 -51 -63.5 -69t-62.5 -18q-36 0 -57 18.5t-21 51.5q0 70 61.5 135t127.5 65q50 0 59 -35l7 30zM269 620q0 36 -19 38 q-40 0 -87.5 -61.5t-47.5 -116.5q0 -16 9 -28t20 -12q39 0 79 60q20 29 33 63.5t13 56.5z" />
+<glyph unicode="&#xab;" d="M215 216v9q103 80 127 101q88 77 97 77q6 0 6 -7q0 -29 -91 -112q-31 -28 -65 -67q6 -14 20 -40q62 -116 62 -133q0 -7 -7 -7q-6 0 -20 16.5t-33.5 42.5t-28.5 36q-44 50 -67 84zM53 216v9q103 80 127 101q88 77 97 77q6 0 6 -7q0 -29 -91 -112q-25 -22 -65 -67 q6 -14 20 -40q62 -116 62 -133q0 -7 -7 -7t-21 16.5t-32.5 42t-28.5 36.5q-44 50 -67 84z" />
+<glyph unicode="&#xac;" horiz-adv-x="675" d="M590 108h-66v212h-438v66h504v-278z" />
+<glyph unicode="&#xad;" horiz-adv-x="333" d="M282 255l-13 -63h-220l14 63h219z" />
+<glyph unicode="&#xae;" horiz-adv-x="760" d="M563 146h-63q-13 0 -28 17t-41 62q-21 37 -51 82h-47v-97q0 -32 6 -38.5t42 -10.5v-15h-160v15q36 4 42 10.5t6 38.5v237q0 33 -6 39t-42 10v15h175q53 0 83.5 -24.5t30.5 -66.5q0 -71 -79 -103l57 -78q46 -62 75 -84v-9zM333 325h42q68 0 68 89q0 78 -69 78h-41v-167z M719 318q0 -139 -98.5 -237.5t-238.5 -98.5q-143 0 -242 99t-99 242t99 243t240 100q144 0 241.5 -100t97.5 -248zM664 319q0 127 -82.5 216t-200.5 89q-116 0 -200.5 -89t-84.5 -212q0 -122 84.5 -210.5t200.5 -88.5q115 0 199 88t84 207z" />
+<glyph unicode="&#xaf;" horiz-adv-x="333" d="M411 583l-11 -51h-301l11 51h301z" />
+<glyph unicode="&#xb0;" horiz-adv-x="400" d="M387 533q0 -61 -41.5 -102t-103.5 -41q-58 0 -99.5 42t-41.5 101q0 60 41.5 101.5t101.5 41.5t101.5 -41.5t41.5 -101.5zM348 533q0 44 -30.5 76.5t-73.5 32.5t-73.5 -32t-30.5 -77q0 -44 30.5 -76.5t72.5 -32.5q43 0 74 32t31 77z" />
+<glyph unicode="&#xb1;" horiz-adv-x="675" d="M590 0h-504v66h504v-66zM590 282h-219v-160h-66v160h-219v66h219v220h66v-220h219v-66z" />
+<glyph unicode="&#xb2;" horiz-adv-x="300" d="M91 572l-13 8q18 42 43 63q39 33 92 33q46 0 78.5 -29.5t32.5 -71.5q0 -26 -17 -49.5t-82 -86.5l-114 -110l2 -5h108q27 0 40 7t25 27l11 -8l-33 -79h-231v18l133 130q93 91 93 139q0 28 -23 47.5t-55 19.5q-50 0 -90 -53z" />
+<glyph unicode="&#xb3;" horiz-adv-x="300" d="M149 608l-10 7q34 61 105 61q40 0 67.5 -22t27.5 -54q0 -29 -21.5 -48t-79.5 -39l4 -2q28 -14 38 -24q21 -24 21 -62q0 -69 -52 -113t-133 -44q-73 0 -73 39q0 12 8.5 20t21.5 8q14 0 38 -17q28 -19 43 -19q36 0 60 26.5t24 66.5q0 46 -26.5 71.5t-73.5 25.5h-13v9 q147 28 147 94q0 22 -14.5 37t-35.5 15q-34 0 -73 -36z" />
+<glyph unicode="&#xb4;" horiz-adv-x="333" d="M180 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35z" />
+<glyph unicode="&#xb5;" d="M497 428l-78 -336q-6 -27 -6 -34q0 -28 26 -28q23 0 56 26l-3 -9q-32 -32 -55 -44.5t-52 -12.5q-57 0 -57 59q0 12 4 31q-77 -90 -154 -90q-76 0 -103 76q-2 -21 -2 -48q0 -25 1 -42t1 -43q0 -65 -19.5 -103.5t-51.5 -38.5q-34 0 -34 45t38 118q26 66 34 100l85 374h88 l-67 -284q-3 -10 -3 -30q0 -32 18.5 -50.5t50.5 -18.5q68 0 122 70l73 313h88z" />
+<glyph unicode="&#xb6;" horiz-adv-x="559" d="M621 653l-6 -21q-56 -4 -72 -14t-25 -44l-160 -600q-11 -42 -11 -50q0 -20 49 -24l23 -2l-5 -21h-148l200 755h-58l-200 -755h-148l5 21q58 5 74 13q10 6 13 15q18 51 68 245l30 112q-71 3 -108 28q-45 31 -45 92q0 47 16 94.5t43 79.5q34 40 82.5 58t125.5 18h257z M260 304l79 328q-62 -4 -101 -49q-28 -32 -46 -81.5t-18 -95.5q0 -53 33 -83q15 -15 53 -19z" />
+<glyph unicode="&#xb7;" horiz-adv-x="250" d="M181 253q0 -22 -17 -38t-40 -16q-22 0 -38 16t-16 38q0 24 16 40.5t39 16.5t39.5 -17t16.5 -40z" />
+<glyph unicode="&#xb8;" horiz-adv-x="333" d="M119 0l-44 -66q15 3 25 3q38 0 60 -18.5t22 -49.5q0 -38 -33.5 -62t-85.5 -24q-38 0 -93 21l17 29q41 -15 68 -15q53 0 53 41q0 19 -13 31.5t-33 12.5q-12 0 -32 -7l-9 8l60 96h38z" />
+<glyph unicode="&#xb9;" horiz-adv-x="300" d="M270 676h9q5 0 5 -5t-4 -16l-86 -274q-19 -58 -19 -74q0 -11 10 -15t39 -5v-16h-181v16q35 4 48 9t17 16l90 285q5 15 5 21q0 17 -21 17h-34v19q33 5 122 22z" />
+<glyph unicode="&#xba;" horiz-adv-x="310" d="M362 592q0 -69 -62.5 -127.5t-135.5 -58.5q-44 0 -70.5 22.5t-26.5 60.5q0 72 61 129.5t137 57.5q43 0 70 -23.5t27 -60.5zM289 607q0 47 -31 47q-41 1 -79.5 -57t-38.5 -121q0 -21 10.5 -33.5t27.5 -12.5q29 0 49 22q27 28 44.5 72t17.5 83z" />
+<glyph unicode="&#xbb;" d="M447 215l-36 -27q-47 -35 -91 -74q-87 -77 -97 -77q-6 0 -6 7q0 29 91 112q35 31 65 67l-20 40q-62 114 -62 133q0 7 7 7t20.5 -16t33 -42.5t28.5 -36.5q49 -57 67 -84v-9zM285 215l-36 -27q-47 -35 -91 -74q-87 -77 -97 -77q-6 0 -6 7q0 19 91 112l65 67l-20 40 q-62 114 -62 133q0 7 7 7q6 0 20 -16.5t33 -42t29 -36.5q49 -57 67 -84v-9z" />
+<glyph unicode="&#xbc;" horiz-adv-x="750" d="M649 676l-455 -686h-51l455 686h51zM736 406l-79 -259h55l-9 -43h-58l-30 -104h-63l32 105h-168l13 42l271 259h36zM653 333l-189 -186h129zM138 635v19q9 1 70 12q52 10 60 10q5 0 5 -5q0 -7 -3 -16l-86 -274q-19 -58 -19 -74q0 -11 10 -15t39 -5v-16h-181v16q35 4 48 9 t17 16l90 285q5 15 5 21q0 17 -25 17h-30z" />
+<glyph unicode="&#xbd;" horiz-adv-x="750" d="M635 676l-455 -686h-51l455 686h51zM516 301l-13 8q18 42 43 63q40 34 93 34q45 0 77.5 -30t32.5 -72q0 -26 -17 -49.5t-82 -86.5l-114 -110l2 -5h108q27 0 40 7t25 27l11 -8l-33 -79h-231v18l133 130q93 91 93 139q0 28 -23 47.5t-55 19.5q-50 0 -90 -53zM139 635v19 q8 1 70 12q52 10 60 10q5 0 5 -5q0 -7 -3 -16l-86 -274q-19 -60 -19 -74q0 -11 10 -15t39 -5v-16h-181v16q35 4 48 9t17 16l90 285q5 15 5 22q0 16 -24 16h-31z" />
+<glyph unicode="&#xbe;" horiz-adv-x="750" d="M650 676l-455 -686h-51l455 686h51zM736 406l-79 -259h55l-9 -43h-58l-30 -104h-63l32 105h-168l13 42l271 259h36zM653 333l-189 -186h129zM129 608l-10 7q15 28 43 44.5t62 16.5q40 0 67.5 -22t27.5 -54q0 -29 -21.5 -48t-79.5 -39v-3q27 -7 42 -23q21 -24 21 -62 q0 -69 -52 -113t-133 -44q-73 0 -73 39q0 12 8.5 20t21.5 8q14 0 38 -17q28 -19 43 -19q36 0 60 26.5t24 66.5q0 46 -26.5 71.5t-73.5 25.5h-13v9q147 28 147 94q0 22 -14.5 37t-35.5 15q-34 0 -73 -36z" />
+<glyph unicode="&#xbf;" d="M367 421q0 -22 -15 -37.5t-37 -15.5q-23 0 -38 15.5t-15 37.5q0 21 15.5 36.5t36.5 15.5q22 0 37.5 -15t15.5 -37zM284 285l17 -2q-13 -75 -31 -109.5t-81 -106.5q-49 -57 -68 -92t-19 -74q0 -40 21 -62t59 -22q32 0 51 13t19 35q0 8 -7.5 23t-7.5 28q0 17 11 27.5 t29 10.5t28.5 -13.5t10.5 -36.5q0 -48 -39.5 -78.5t-101.5 -30.5q-69 0 -108 30.5t-39 90.5q0 47 25.5 84t108.5 105q54 43 79.5 76t35.5 75z" />
+<glyph unicode="&#xc0;" horiz-adv-x="611" d="M500 742h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23zM564 0h-245v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16zM369 262l-45 263 l-149 -263h194z" />
+<glyph unicode="&#xc1;" horiz-adv-x="611" d="M292 744l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM564 0h-245v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16z M369 262l-45 263l-149 -263h194z" />
+<glyph unicode="&#xc2;" horiz-adv-x="611" d="M548 742h-36l-82 104l-137 -104h-39l157 169h49zM564 0h-245v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16zM369 262l-45 263l-149 -263h194z " />
+<glyph unicode="&#xc3;" horiz-adv-x="611" d="M544 874h28q-22 -104 -95 -104q-18 0 -57 15q-71 29 -95 29q-36 0 -51 -47h-29q15 58 38 82t62 24q32 0 86 -24q41 -19 62 -19q20 0 31.5 9.5t19.5 34.5zM564 0h-245v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16 q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16zM369 262l-45 263l-149 -263h194z" />
+<glyph unicode="&#xc4;" horiz-adv-x="611" d="M354 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM554 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM564 0h-245v16q45 2 61 14t16 39 q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16zM369 262l-45 263l-149 -263h194z" />
+<glyph unicode="&#xc5;" horiz-adv-x="611" d="M505 857q0 -41 -29.5 -70t-70.5 -29q-43 0 -71.5 29t-28.5 71q0 40 29.5 69.5t69.5 29.5q42 0 71.5 -29.5t29.5 -70.5zM471 857q0 28 -19.5 47t-47.5 19q-26 0 -45.5 -19.5t-19.5 -45.5q0 -28 18.5 -47t46.5 -19q29 0 48 18.5t19 46.5zM564 0h-245v16q45 2 61 14t16 39 q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16zM369 262l-45 263l-149 -263h194z" />
+<glyph unicode="&#xc6;" horiz-adv-x="889" d="M911 653l-33 -153l-17 2q1 13 1 36q0 53 -34.5 67.5t-157.5 14.5q-35 0 -46 -6.5t-18 -30.5l-61 -222q54 0 80 2t49.5 6t36 16.5t22 27t23.5 45.5l18 -4l-69 -232l-17 4q6 36 6 52q0 31 -22.5 40.5t-95.5 9.5h-40q-71 -253 -71 -266q0 -29 51 -29h30q112 0 167.5 27 t112.5 109l18 -5l-64 -164h-498v16q44 4 58.5 13.5t21.5 34.5l49 170h-190q-20 -25 -25 -30q-100 -120 -100 -157q0 -15 12 -20.5t52 -10.5v-16h-187v16q19 4 33.5 17.5t50.5 58.5l369 465q23 29 27.5 36.5t4.5 16.5q0 23 -38 26l-26 2v15h517zM517 613l-268 -342h173z" />
+<glyph unicode="&#xc7;" horiz-adv-x="667" d="M689 664l-37 -200l-18 3q-12 163 -153 163q-49 0 -100.5 -26.5t-94.5 -71.5q-108 -114 -108 -300q0 -205 175 -205q62 0 112.5 26t117.5 92l17 -14q-67 -79 -131.5 -114t-141.5 -35q-26 0 -50 4l-35 -52q15 3 25 3q38 0 60 -18.5t22 -49.5q0 -38 -33.5 -62t-85.5 -24 q-38 0 -93 21l17 29q41 -15 68 -15q53 0 53 41q0 19 -13 31.5t-33 12.5q-12 0 -32 -7l-9 8l56 90q-81 18 -129.5 86.5t-48.5 162.5q0 109 56.5 207t150.5 157t199 59q49 0 117 -17q29 -7 41 -7q27 0 38 22h21z" />
+<glyph unicode="&#xc8;" horiz-adv-x="611" d="M526 742h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23zM634 653l-31 -154l-22 2q3 25 3 46q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 24 -7 31q-16 15 -78 15h-78l-32 -112 q-36 -127 -36 -146q0 -34 79 -34q129 0 203 39q38 20 94 98l16 -8l-62 -162h-507v16q43 8 56 19.5t25 54.5l123 442q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497z" />
+<glyph unicode="&#xc9;" horiz-adv-x="611" d="M322 744l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM634 653l-31 -154l-22 2q3 25 3 46q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 24 -7 31q-16 15 -78 15h-78 l-32 -112q-36 -127 -36 -146q0 -34 79 -34q129 0 203 39q38 20 94 98l16 -8l-62 -162h-507v16q43 8 56 19.5t25 54.5l123 442q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497z" />
+<glyph unicode="&#xca;" horiz-adv-x="611" d="M577 742h-36l-82 104l-137 -104h-39l157 169h49zM634 653l-31 -154l-22 2q3 25 3 46q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 24 -7 31q-16 15 -78 15h-78l-32 -112q-36 -127 -36 -146 q0 -34 79 -34q129 0 203 39q38 20 94 98l16 -8l-62 -162h-507v16q43 8 56 19.5t25 54.5l123 442q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497z" />
+<glyph unicode="&#xcb;" horiz-adv-x="611" d="M385 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM585 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM634 653l-31 -154l-22 2q3 25 3 46 q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 24 -7 31q-16 15 -78 15h-78l-32 -112q-36 -127 -36 -146q0 -34 79 -34q129 0 203 39q38 20 94 98l16 -8l-62 -162h-507v16q43 8 56 19.5t25 54.5l123 442 q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497z" />
+<glyph unicode="&#xcc;" horiz-adv-x="333" d="M398 742h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23zM384 653v-16q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="&#xcd;" horiz-adv-x="333" d="M191 744l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM384 653v-16q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247 z" />
+<glyph unicode="&#xce;" horiz-adv-x="333" d="M450 742h-36l-82 104l-137 -104h-39l157 169h49zM384 653v-16q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="&#xcf;" horiz-adv-x="333" d="M257 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM457 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM384 653v-16q-42 -5 -55.5 -18 t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="&#xd0;" horiz-adv-x="722" d="M130 653h276q139 0 216.5 -68.5t77.5 -200.5q0 -87 -43 -166t-117 -135q-110 -83 -303 -83h-245v16q43 8 56 19.5t25 54.5l65 236h-90l12 42h90l46 164q11 39 11 64q0 20 -15 28.5t-62 12.5v16zM238 326l-46 -164q-22 -80 -22 -95q0 -37 69 -37q151 0 240 90 q51 51 80.5 127t29.5 157q0 108 -54 163.5t-160 55.5q-32 0 -44.5 -6t-17.5 -23l-63 -226h153l-12 -42h-153z" />
+<glyph unicode="&#xd1;" horiz-adv-x="667" d="M609 874h28q-22 -104 -95 -104q-18 0 -57 15q-71 29 -95 29q-36 0 -51 -47h-29q15 58 38 82t62 24q32 0 86 -24q41 -19 62 -19q20 0 31.5 9.5t19.5 34.5zM727 653v-16q-27 -6 -37.5 -9.5t-23 -21t-18.5 -38.5l-23 -76l-146 -507h-18l-230 550l-114 -422q-9 -31 -9 -54 q0 -21 15.5 -30.5t54.5 -12.5v-16h-198v16q43 6 61 31.5t45 120.5l117 415q-23 54 -86 54v16h160l207 -499l106 388q8 28 8 44q0 27 -13.5 37t-55.5 14v16h198z" />
+<glyph unicode="&#xd2;" horiz-adv-x="722" d="M587 742h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23zM699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5 q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#xd3;" horiz-adv-x="722" d="M383 744l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5 t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#xd4;" horiz-adv-x="722" d="M638 742h-36l-82 104l-137 -104h-39l157 169h49zM699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117 q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#xd5;" horiz-adv-x="722" d="M634 874h28q-22 -104 -95 -104q-18 0 -57 15q-71 29 -95 29q-36 0 -51 -47h-29q15 58 38 82t62 24q32 0 86 -24q41 -19 62 -19q20 0 31.5 9.5t19.5 34.5zM699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5 q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#xd6;" horiz-adv-x="722" d="M443 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM643 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM699 418q0 -107 -57.5 -205 t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181 t35 190z" />
+<glyph unicode="&#xd7;" horiz-adv-x="675" d="M582 56l-48 -48l-197 197l-196 -197l-48 48l196 197l-196 196l48 48l196 -197l197 197l48 -48l-197 -196z" />
+<glyph unicode="&#xd8;" horiz-adv-x="722" d="M669 722l-64 -96q43 -34 63 -69q31 -56 31 -126q0 -83 -36 -165.5t-94 -144.5t-134.5 -100.5t-153.5 -38.5q-41 0 -94 21l-74 -108h-44l86 127q-95 69 -95 200q0 91 46 182t128 161q120 101 234 101q53 0 105 -22l52 78h44zM190 74l356 533q-34 26 -82 26 q-110 0 -193 -125q-46 -68 -76 -162t-30 -170q0 -55 25 -102zM570 574l-355 -530q32 -29 80 -29q109 0 192 123q46 69 76.5 165t30.5 172q0 58 -24 99z" />
+<glyph unicode="&#xd9;" horiz-adv-x="722" d="M588 742h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23zM765 653v-16q-21 -5 -31.5 -9.5t-20.5 -11t-17.5 -24.5t-14.5 -39t-20 -65l-83 -285q-34 -116 -97 -169q-60 -52 -158 -52t-159.5 46t-61.5 118q0 55 44 216l52 189q9 32 9 45q0 20 -17.5 30t-62.5 11 v16h272v-16q-51 -5 -70.5 -22t-33.5 -69l-63 -226q-40 -141 -40 -179q0 -53 39.5 -85.5t98.5 -32.5q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32t-55 14v16h198z" />
+<glyph unicode="&#xda;" horiz-adv-x="722" d="M383 744l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM765 653v-16q-21 -5 -31.5 -9.5t-20.5 -11t-17.5 -24.5t-14.5 -39t-20 -65l-83 -285q-34 -116 -97 -169q-60 -52 -158 -52t-159.5 46t-61.5 118q0 55 44 216l52 189q9 32 9 45 q0 20 -17.5 30t-62.5 11v16h272v-16q-51 -5 -70.5 -22t-33.5 -69l-63 -226q-40 -141 -40 -179q0 -53 39.5 -85.5t98.5 -32.5q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32t-55 14v16h198z" />
+<glyph unicode="&#xdb;" horiz-adv-x="722" d="M635 742h-36l-82 104l-137 -104h-39l157 169h49zM765 653v-16q-21 -5 -31.5 -9.5t-20.5 -11t-17.5 -24.5t-14.5 -39t-20 -65l-83 -285q-34 -116 -97 -169q-60 -52 -158 -52t-159.5 46t-61.5 118q0 55 44 216l52 189q9 32 9 45q0 20 -17.5 30t-62.5 11v16h272v-16 q-51 -5 -70.5 -22t-33.5 -69l-63 -226q-40 -141 -40 -179q0 -53 39.5 -85.5t98.5 -32.5q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32t-55 14v16h198z" />
+<glyph unicode="&#xdc;" horiz-adv-x="722" d="M445 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM645 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM765 653v-16q-21 -5 -31.5 -9.5 t-20.5 -11t-17.5 -24.5t-14.5 -39t-20 -65l-83 -285q-34 -116 -97 -169q-60 -52 -158 -52t-159.5 46t-61.5 118q0 55 44 216l52 189q9 32 9 45q0 20 -17.5 30t-62.5 11v16h272v-16q-51 -5 -70.5 -22t-33.5 -69l-63 -226q-40 -141 -40 -179q0 -53 39.5 -85.5t98.5 -32.5 q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32t-55 14v16h198z" />
+<glyph unicode="&#xdd;" horiz-adv-x="556" d="M301 744l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM633 653v-16q-21 -7 -32 -17.5t-38 -43.5l-219 -270l-36 -123q-30 -103 -30 -127q0 -19 11.5 -27t41.5 -10l36 -3v-16h-289v16q51 3 72.5 18.5t34.5 62.5l59 205l-76 267 q-11 40 -23.5 51t-53.5 17v16h239v-16q-44 -4 -58 -11.5t-14 -24.5t36 -144l31 -110l39 46q149 176 149 213q0 24 -40 28l-29 3v16h189z" />
+<glyph unicode="&#xde;" horiz-adv-x="611" d="M302 518h56q211 0 211 -144q0 -46 -22 -88.5t-60 -69.5q-64 -46 -192 -46q-58 0 -89 10l-17 -60q-12 -42 -12 -57q0 -26 9.5 -33t56.5 -14v-16h-243v16q43 6 56 17.5t26 56.5l118 425q17 63 17 80q0 21 -12.5 29t-54.5 13v16h235v-16q-31 -4 -43.5 -12.5t-19.5 -33.5z M286 459l-71 -248q30 -5 52 -5q97 0 148 39t51 129q0 114 -134 114q-38 0 -46 -29z" />
+<glyph unicode="&#xdf;" d="M23 -4l72 319q44 192 104.5 278t154.5 86q62 0 100.5 -36t38.5 -95q0 -55 -36 -92.5t-119 -68.5l-8 -3v-3q43 -5 67 -22q26 -18 41.5 -49.5t15.5 -65.5q0 -52 -23 -106t-61 -94q-54 -57 -129 -57q-36 0 -58 18.5t-22 47.5q0 22 12 34.5t32 12.5q17 0 27.5 -11t10.5 -29 q0 -14 -8 -27q-4 -8 -4 -11q0 -13 18 -13q40 0 71 54q47 86 47 199q0 104 -81 107q-26 1 -26 15q0 13 17 13q60 0 98 50.5t38 129.5t-62 79q-87 0 -145 -218l-111 -426q-27 -103 -76 -161t-109 -58q-35 0 -56.5 17t-21.5 45q0 19 10.5 30.5t28.5 11.5q17 0 28.5 -10 t11.5 -26q0 -12 -8 -26q-4 -5 -4 -10q0 -8 17 -8q38 0 61.5 39t45.5 140z" />
+<glyph unicode="&#xe0;" horiz-adv-x="501" d="M463 111l13 -11q-56 -68 -82.5 -89t-56.5 -21q-40 0 -40 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5q-44 0 -72 30.5t-28 85.5q0 76 43.5 155t110.5 130t132 51q67 0 80 -58l11 48l3 3l61 7l7 -3q-1 -4 -6 -21q-89 -324 -89 -363q0 -13 14 -13q15 0 52 41zM365 361 q0 26 -15 42t-41 16q-68 0 -131 -92q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225zM446 492h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23z" />
+<glyph unicode="&#xe1;" horiz-adv-x="501" d="M243 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM463 111l13 -11q-56 -68 -82.5 -89t-56.5 -21q-40 0 -40 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5q-44 0 -72 30.5t-28 85.5q0 76 43.5 155t110.5 130t132 51q67 0 80 -58l11 48 l3 3l61 7l7 -3q-1 -4 -6 -21q-89 -324 -89 -363q0 -13 14 -13q15 0 52 41zM365 361q0 26 -15 42t-41 16q-68 0 -131 -92q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225z" />
+<glyph unicode="&#xe2;" horiz-adv-x="501" d="M497 492h-36l-82 104l-137 -104h-39l157 169h49zM463 111l13 -11q-56 -68 -82.5 -89t-56.5 -21q-40 0 -40 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5q-44 0 -72 30.5t-28 85.5q0 76 43.5 155t110.5 130t132 51q67 0 80 -58l11 48l3 3l61 7l7 -3q-1 -4 -6 -21 q-89 -324 -89 -363q0 -13 14 -13q15 0 52 41zM365 361q0 26 -15 42t-41 16q-68 0 -131 -92q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225z" />
+<glyph unicode="&#xe3;" horiz-adv-x="501" d="M493 624h28q-22 -104 -95 -104q-18 0 -57 15q-71 29 -95 29q-36 0 -51 -47h-29q15 58 38 82t62 24q32 0 86 -24q41 -19 62 -19q20 0 31.5 9.5t19.5 34.5zM463 111l13 -11q-56 -68 -82.5 -89t-56.5 -21q-40 0 -40 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5 q-44 0 -72 30.5t-28 85.5q0 76 43.5 155t110.5 130t132 51q67 0 80 -58l11 48l3 3l61 7l7 -3q-1 -4 -6 -21q-89 -324 -89 -363q0 -13 14 -13q15 0 52 41zM365 361q0 26 -15 42t-41 16q-68 0 -131 -92q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225z " />
+<glyph unicode="&#xe4;" horiz-adv-x="501" d="M303 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM503 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM463 111l13 -11q-56 -68 -82.5 -89 t-56.5 -21q-40 0 -40 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5q-44 0 -72 30.5t-28 85.5q0 76 43.5 155t110.5 130t132 51q67 0 80 -58l11 48l3 3l61 7l7 -3q-1 -4 -6 -21q-89 -324 -89 -363q0 -13 14 -13q15 0 52 41zM365 361q0 26 -15 42t-41 16q-68 0 -131 -92 q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225z" />
+<glyph unicode="&#xe5;" horiz-adv-x="501" d="M453 609q0 -41 -29.5 -70t-70.5 -29q-43 0 -71.5 29t-28.5 71q0 40 29.5 69.5t69.5 29.5q42 0 71.5 -29.5t29.5 -70.5zM419 609q0 28 -19.5 47t-47.5 19q-26 0 -45.5 -19.5t-19.5 -45.5q0 -28 18.5 -47t46.5 -19q29 0 48 18.5t19 46.5zM463 111l13 -11q-56 -68 -82.5 -89 t-56.5 -21q-40 0 -40 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5q-44 0 -72 30.5t-28 85.5q0 76 43.5 155t110.5 130t132 51q67 0 80 -58l11 48l3 3l61 7l7 -3q-1 -4 -6 -21q-89 -324 -89 -363q0 -13 14 -13q15 0 52 41zM365 361q0 26 -15 42t-41 16q-68 0 -131 -92 q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225z" />
+<glyph unicode="&#xe6;" horiz-adv-x="667" d="M459 439l-22 -62q59 64 122 64q37 0 59 -19t22 -51q0 -58 -66 -101q-52 -33 -190 -72q-8 -34 -8 -60q0 -55 16.5 -78.5t53.5 -23.5q60 0 142 77l10 -12q-42 -51 -96.5 -81.5t-101.5 -30.5t-75.5 33t-28.5 89q0 20 6 40q-59 -92 -102.5 -127t-92.5 -35q-38 0 -61 25.5 t-23 72.5q0 79 44.5 163t110.5 137.5t125 53.5q54 0 66 -47l19 45h71zM574 380q0 36 -35 36q-33 0 -65 -35q-28 -30 -45 -62t-39 -96q68 20 104.5 42t61.5 55q18 24 18 60zM350 370q0 23 -12.5 37t-32.5 14q-53 1 -113 -86q-37 -54 -60 -118t-23 -118q0 -60 34 -60 q42 0 80 41q54 58 90.5 141.5t36.5 148.5z" />
+<glyph unicode="&#xe7;" horiz-adv-x="444" d="M77 -96l56 90q-103 25 -103 145q0 117 89 209.5t201 92.5q46 0 75.5 -23t29.5 -58q0 -20 -13.5 -33t-34.5 -13q-39 0 -39 38q0 12 9 29q6 11 6 19q0 20 -37 20q-63 0 -109 -48q-42 -43 -66.5 -106t-24.5 -127q0 -54 24 -84t67 -30q37 0 69.5 18.5t73.5 62.5l16 -10 q-46 -58 -89.5 -82.5t-100.5 -24.5h-8l-37 -55q15 3 25 3q38 0 60 -18.5t22 -49.5q0 -38 -33.5 -62t-85.5 -24q-38 0 -93 21l17 29q41 -15 68 -15q53 0 53 41q0 19 -13 31.5t-33 12.5q-12 0 -32 -7z" />
+<glyph unicode="&#xe8;" horiz-adv-x="444" d="M358 109l12 -12q-88 -108 -204 -108q-61 0 -98 37.5t-37 99.5q0 117 93.5 216t205.5 99q39 0 60.5 -18t21.5 -50q0 -66 -76.5 -118t-207.5 -69q-10 -20 -10 -61t25.5 -66t67.5 -25q33 0 63 15.5t84 59.5zM152 252l-17 -44q112 27 161 74q50 48 50 97q0 39 -35 39 q-42 0 -87.5 -48.5t-71.5 -117.5zM414 492h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23z" />
+<glyph unicode="&#xe9;" horiz-adv-x="444" d="M208 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM358 109l12 -12q-88 -108 -204 -108q-61 0 -98 37.5t-37 99.5q0 117 93.5 216t205.5 99q39 0 60.5 -18t21.5 -50q0 -66 -76.5 -118t-207.5 -69q-10 -20 -10 -61t25.5 -66t67.5 -25 q33 0 63 15.5t84 59.5zM152 252l-17 -44q112 27 161 74q50 48 50 97q0 39 -35 39q-42 0 -87.5 -48.5t-71.5 -117.5z" />
+<glyph unicode="&#xea;" horiz-adv-x="444" d="M466 492h-36l-82 104l-137 -104h-39l157 169h49zM358 109l12 -12q-88 -108 -204 -108q-61 0 -98 37.5t-37 99.5q0 117 93.5 216t205.5 99q39 0 60.5 -18t21.5 -50q0 -66 -76.5 -118t-207.5 -69q-10 -20 -10 -61t25.5 -66t67.5 -25q33 0 63 15.5t84 59.5zM152 252l-17 -44 q112 27 161 74q50 48 50 97q0 39 -35 39q-42 0 -87.5 -48.5t-71.5 -117.5z" />
+<glyph unicode="&#xeb;" horiz-adv-x="444" d="M275 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM475 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM358 109l12 -12q-88 -108 -204 -108 q-61 0 -98 37.5t-37 99.5q0 117 93.5 216t205.5 99q39 0 60.5 -18t21.5 -50q0 -66 -76.5 -118t-207.5 -69q-10 -20 -10 -61t25.5 -66t67.5 -25q33 0 63 15.5t84 59.5zM152 252l-17 -44q112 27 161 74q50 48 50 97q0 39 -35 39q-42 0 -87.5 -48.5t-71.5 -117.5z" />
+<glyph unicode="&#xec;" horiz-adv-x="278" d="M302 492h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23zM221 115l14 -12q-41 -63 -71 -88.5t-67 -25.5q-50 0 -50 57q0 20 24 110l48 175q9 34 9 45q0 15 -11 19t-52 5v16q44 3 159 25l5 -3l-96 -342q-9 -34 -9 -45q0 -6 5 -10.5t11 -4.5q12 0 30 17.5 t51 61.5z" />
+<glyph unicode="&#xed;" horiz-adv-x="278" d="M95 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM221 115l14 -12q-41 -63 -71 -88.5t-67 -25.5q-50 0 -50 57q0 20 24 110l48 175q9 34 9 45q0 15 -11 19t-52 5v16q44 3 159 25l5 -3l-96 -342q-9 -34 -9 -45q0 -6 5 -10.5t11 -4.5 q12 0 30 17.5t51 61.5z" />
+<glyph unicode="&#xee;" horiz-adv-x="278" d="M351 492h-36l-82 104l-137 -104h-39l157 169h49zM221 115l14 -12q-41 -63 -71 -88.5t-67 -25.5q-50 0 -50 57q0 20 24 110l48 175q9 34 9 45q0 15 -11 19t-52 5v16q44 3 159 25l5 -3l-96 -342q-9 -34 -9 -45q0 -6 5 -10.5t11 -4.5q12 0 30 17.5t51 61.5z" />
+<glyph unicode="&#xef;" horiz-adv-x="278" d="M361 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM161 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM221 115l14 -12q-41 -63 -71 -88.5 t-67 -25.5q-50 0 -50 57q0 20 24 110l48 175q9 34 9 45q0 15 -11 19t-52 5v16q44 3 159 25l5 -3l-96 -342q-9 -34 -9 -45q0 -6 5 -10.5t11 -4.5q12 0 30 17.5t51 61.5z" />
+<glyph unicode="&#xf0;" d="M482 637l-101 -45q86 -98 86 -233q0 -97 -38 -182t-106 -136.5t-149 -51.5q-70 0 -108.5 35.5t-38.5 104.5q0 115 86.5 213.5t193.5 98.5q59 0 87 -49l2 1q-14 99 -72 174l-117 -51l-33 29l123 54q-47 44 -103 67l35 17q66 -15 122 -61l99 43zM384 326q0 43 -19.5 68.5 t-51.5 25.5q-69 0 -132 -89q-70 -97 -70 -224q0 -42 21.5 -69.5t56.5 -27.5q70 0 124 82q32 47 51.5 113t19.5 121z" />
+<glyph unicode="&#xf1;" d="M460 624h28q-22 -104 -95 -104q-18 0 -57 15q-71 29 -95 29q-36 0 -51 -47h-29q15 58 38 82t62 24q32 0 86 -24q41 -19 62 -19q20 0 31.5 9.5t19.5 34.5zM460 117l14 -13q-51 -70 -78 -91.5t-62 -21.5q-20 0 -33.5 13.5t-13.5 40.5q0 16 16 75l44 162q14 54 14 79 q0 29 -24 29q-29 0 -63.5 -34.5t-84.5 -107.5q-33 -49 -48.5 -88t-51.5 -160h-75l96 350q2 10 2 17q0 15 -13.5 20.5t-51.5 6.5v16q39 8 87 16.5t75 14.5l4 -2l-67 -218q74 118 128 169t103 51q31 0 48 -16.5t17 -44.5q0 -25 -10 -60l-56 -203q-14 -50 -14 -61q0 -18 16 -18 q19 0 61 53q7 8 21 26z" />
+<glyph unicode="&#xf2;" d="M468 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM384 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5 q61 0 121 83q34 46 54 110.5t20 122.5zM418 492h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23z" />
+<glyph unicode="&#xf3;" d="M215 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM468 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM384 326 q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#xf4;" d="M468 492h-36l-82 104l-137 -104h-39l157 169h49zM468 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM384 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91 q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#xf5;" d="M466 624h28q-22 -104 -95 -104q-18 0 -57 15q-71 29 -95 29q-36 0 -51 -47h-29q15 58 38 82t62 24q32 0 86 -24q41 -19 62 -19q20 0 31.5 9.5t19.5 34.5zM468 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162 t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM384 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#xf6;" d="M274 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM474 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM468 301q0 -57 -28.5 -118.5 t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM384 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z " />
+<glyph unicode="&#xf7;" horiz-adv-x="675" d="M590 220h-504v66h504v-66zM394 460q0 -22 -17 -38t-40 -16q-22 0 -38 16t-16 38q0 24 16 40.5t39 16.5t39.5 -17t16.5 -40zM394 43q0 -22 -17 -38t-41 -16q-21 0 -37 16t-16 38q0 24 16 40.5t39 16.5t39.5 -17t16.5 -40z" />
+<glyph unicode="&#xf8;" d="M428 554l-58 -119q31 -9 48.5 -22t30.5 -37q20 -35 20 -78q0 -60 -34 -125t-90 -113q-83 -71 -169 -71q-8 0 -20 2l-61 -126h-35l64 131q-39 13 -59 34q-37 39 -37 100q0 115 93 213t201 98q11 0 17 -1l55 114h34zM357 406l-190 -392q11 -4 22 -4q66 0 122 82 q32 49 53 114t21 119q0 50 -28 81zM140 29l188 389l-10 2q-52 0 -95 -46q-49 -53 -80 -129.5t-31 -147.5q0 -40 28 -68z" />
+<glyph unicode="&#xf9;" d="M461 119l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 18 27 128l35 139q14 58 14 67q0 12 -11 18t-50 6v14q69 8 150 27l4 -3l-89 -355q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5 h74l-79 -299q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65zM415 492h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23z" />
+<glyph unicode="&#xfa;" d="M210 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM461 119l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 18 27 128l35 139q14 58 14 67q0 12 -11 18t-50 6v14q69 8 150 27 l4 -3l-89 -355q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-79 -299q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65z" />
+<glyph unicode="&#xfb;" d="M465 492h-36l-82 104l-137 -104h-39l157 169h49zM461 119l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 18 27 128l35 139q14 58 14 67q0 12 -11 18t-50 6v14q69 8 150 27l4 -3l-89 -355q-3 -9 -3 -16 q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-79 -299q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65z" />
+<glyph unicode="&#xfc;" d="M269 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM469 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM461 119l14 -9q-48 -73 -75 -96 t-63 -23q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 18 27 128l35 139q14 58 14 67q0 12 -11 18t-50 6v14q69 8 150 27l4 -3l-89 -355q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-79 -299q-19 -72 -19 -78 q0 -17 11 -17q12 0 29 16t54 65z" />
+<glyph unicode="&#xfd;" horiz-adv-x="444" d="M178 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM243 186l21 -110q67 110 94.5 167.5t27.5 89.5q0 16 -26 32q-26 17 -26 39q0 16 11.5 26.5t28.5 10.5q22 0 37 -16t15 -39q0 -87 -131 -305q-78 -129 -151.5 -208t-116.5 -79 q-23 0 -37 12t-14 31q0 17 11.5 28.5t27.5 11.5q19 0 34 -14t27 -14q18 0 48 33q13 13 38.5 46.5t32.5 44.5q10 20 10 35q0 30 -31 155.5t-51 176.5q-14 37 -30.5 50.5t-46.5 13.5q-16 0 -31 -4v17q22 4 32 6q41 8 107 18h4q11 0 41.5 -93t43.5 -162z" />
+<glyph unicode="&#xfe;" d="M189 335l2 -2q68 108 162 108q55 0 85.5 -33.5t30.5 -92.5q0 -78 -44 -154t-114.5 -124t-141.5 -48q-33 0 -66 17q-37 -143 -37 -165q0 -17 14.5 -24t49.5 -7v-15h-205v16q32 1 45 13t22 46l114 434l68 250l5 19q9 35 9 43q0 17 -10.5 21.5t-54.5 5.5v17q77 9 152 23 l5 -5q-71 -275 -91 -343zM379 313q0 85 -62 85q-40 0 -77.5 -31.5t-57.5 -82.5q-22 -56 -43.5 -134.5t-21.5 -104.5q0 -16 13.5 -26.5t34.5 -10.5q82 0 145 95q31 46 50 103t19 107z" />
+<glyph unicode="&#xff;" horiz-adv-x="444" d="M242 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM442 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM243 186l21 -110q67 110 94.5 167.5 t27.5 89.5q0 16 -26 32q-26 17 -26 39q0 16 11.5 26.5t28.5 10.5q22 0 37 -16t15 -39q0 -87 -131 -305q-78 -129 -151.5 -208t-116.5 -79q-23 0 -37 12t-14 31q0 17 11.5 28.5t27.5 11.5q19 0 34 -14t27 -14q18 0 48 33q13 13 38.5 46.5t32.5 44.5q10 20 10 35 q0 30 -31 155.5t-51 176.5q-14 37 -30.5 50.5t-46.5 13.5q-16 0 -31 -4v17q22 4 32 6q41 8 107 18h4q11 0 41.5 -93t43.5 -162z" />
+<glyph unicode="&#x100;" horiz-adv-x="611" d="M536 757l-11 -51h-301l11 51h301zM564 0h-245v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16zM369 262l-45 263l-149 -263h194z" />
+<glyph unicode="&#x101;" horiz-adv-x="501" d="M481 543l-11 -51h-301l11 51h301zM463 111l13 -11q-56 -68 -82.5 -89t-56.5 -21q-40 0 -40 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5q-44 0 -72 30.5t-28 85.5q0 76 43.5 155t110.5 130t132 51q67 0 80 -58l11 48l3 3l61 7l7 -3q-1 -4 -6 -21q-89 -324 -89 -363 q0 -13 14 -13q15 0 52 41zM365 361q0 26 -15 42t-41 16q-68 0 -131 -92q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225z" />
+<glyph unicode="&#x102;" horiz-adv-x="611" d="M502 862h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM564 0h-245v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26 l92 -553q10 -62 24 -79t54 -20v-16zM369 262l-45 263l-149 -263h194z" />
+<glyph unicode="&#x103;" horiz-adv-x="501" d="M452 650h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM463 111l13 -11q-56 -68 -82.5 -89t-56.5 -21q-40 0 -40 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5q-44 0 -72 30.5t-28 85.5q0 76 43.5 155 t110.5 130t132 51q67 0 80 -58l11 48l3 3l61 7l7 -3q-1 -4 -6 -21q-89 -324 -89 -363q0 -13 14 -13q15 0 52 41zM365 361q0 26 -15 42t-41 16q-68 0 -131 -92q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225z" />
+<glyph unicode="&#x104;" horiz-adv-x="611" d="M433 0h-114v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16h-87q-10 -26 -10 -53q0 -23 16.5 -38t42.5 -15q47 0 83 32l17 -18q-52 -77 -125 -77 q-40 0 -67.5 26.5t-27.5 68.5q0 41 27 74zM369 262l-45 263l-149 -263h194z" />
+<glyph unicode="&#x105;" horiz-adv-x="501" d="M512 -74l17 -18q-52 -77 -125 -77q-40 0 -67.5 26.5t-27.5 68.5q0 37 20 64q-32 4 -32 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5q-44 0 -72 30.5t-28 85.5q0 76 43.5 155t110.5 130t132 51q67 0 80 -58l11 48l3 3l61 7l7 -3q-1 -4 -6 -21q-89 -324 -89 -363 q0 -13 14 -13q15 0 52 41l27 29l13 -11q-65 -80 -95 -98q-11 -26 -11 -55q0 -23 16.5 -38t42.5 -15q47 0 83 32zM365 361q0 26 -15 42t-41 16q-68 0 -131 -92q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225z" />
+<glyph unicode="&#x106;" horiz-adv-x="667" d="M389 706l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM689 664l-37 -200l-18 3q-18 163 -149 163q-109 0 -199 -97q-53 -56 -80.5 -136t-27.5 -165q0 -205 175 -205q62 0 113.5 26t115.5 93l18 -15q-67 -79 -131.5 -114t-141.5 -35 q-117 0 -189 69.5t-72 191.5q0 103 51 196.5t136 153.5q102 73 219 73q69 0 117 -17q20 -7 41 -7q27 0 38 22h21z" />
+<glyph unicode="&#x107;" horiz-adv-x="444" d="M208 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM350 107l16 -10q-46 -58 -89.5 -83t-99.5 -25q-71 0 -109 39t-38 115q0 67 34 129.5t89 107.5q77 61 167 61q46 0 75.5 -23t29.5 -58q0 -20 -14 -34t-34 -14t-29.5 11.5t-9.5 28.5 q0 9 7.5 23.5t7.5 24.5q0 20 -37 20q-63 0 -109 -48q-91 -96 -91 -233q0 -54 23 -84t66 -30q39 0 71 19t74 63z" />
+<glyph unicode="&#x108;" horiz-adv-x="667" d="M647 706h-36l-82 104l-137 -104h-39l157 169h49zM689 664l-37 -200l-18 3q-18 163 -149 163q-109 0 -199 -97q-53 -56 -80.5 -136t-27.5 -165q0 -205 175 -205q62 0 113.5 26t115.5 93l18 -15q-67 -79 -131.5 -114t-141.5 -35q-117 0 -189 69.5t-72 191.5q0 103 51 196.5 t136 153.5q102 73 219 73q69 0 117 -17q20 -7 41 -7q27 0 38 22h21z" />
+<glyph unicode="&#x109;" horiz-adv-x="444" d="M427 492h-36l-82 104l-137 -104h-39l157 169h49zM350 107l16 -10q-46 -58 -89.5 -83t-99.5 -25q-71 0 -109 39t-38 115q0 67 34 129.5t89 107.5q77 61 167 61q46 0 75.5 -23t29.5 -58q0 -20 -14 -34t-34 -14t-29.5 11.5t-9.5 28.5q0 9 7.5 23.5t7.5 24.5q0 20 -37 20 q-63 0 -109 -48q-91 -96 -91 -233q0 -54 23 -84t66 -30q39 0 71 19t74 63z" />
+<glyph unicode="&#x10a;" horiz-adv-x="667" d="M549 769q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM689 664l-37 -200l-18 3q-18 163 -149 163q-109 0 -199 -97q-53 -56 -80.5 -136t-27.5 -165q0 -205 175 -205q62 0 113.5 26t115.5 93l18 -15 q-67 -79 -131.5 -114t-141.5 -35q-117 0 -189 69.5t-72 191.5q0 103 51 196.5t136 153.5q102 73 219 73q69 0 117 -17q20 -7 41 -7q27 0 38 22h21z" />
+<glyph unicode="&#x10b;" horiz-adv-x="444" d="M369 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM350 107l16 -10q-46 -58 -89.5 -83t-99.5 -25q-71 0 -109 39t-38 115q0 67 34 129.5t89 107.5q77 61 167 61q46 0 75.5 -23t29.5 -58q0 -20 -14 -34 t-34 -14t-29.5 11.5t-9.5 28.5q0 9 7.5 23.5t7.5 24.5q0 20 -37 20q-63 0 -109 -48q-91 -96 -91 -233q0 -54 23 -84t66 -30q39 0 71 19t74 63z" />
+<glyph unicode="&#x10c;" horiz-adv-x="667" d="M647 875l-162 -169h-48l-95 169h38l89 -105l141 105h37zM689 664l-37 -200l-18 3q-18 163 -149 163q-109 0 -199 -97q-53 -56 -80.5 -136t-27.5 -165q0 -205 175 -205q62 0 113.5 26t115.5 93l18 -15q-67 -79 -131.5 -114t-141.5 -35q-117 0 -189 69.5t-72 191.5 q0 103 51 196.5t136 153.5q102 73 219 73q69 0 117 -17q20 -7 41 -7q27 0 38 22h21z" />
+<glyph unicode="&#x10d;" horiz-adv-x="444" d="M473 661l-162 -169h-48l-95 169h38l89 -105l141 105h37zM350 107l16 -10q-46 -58 -89.5 -83t-99.5 -25q-71 0 -109 39t-38 115q0 67 34 129.5t89 107.5q77 61 167 61q46 0 75.5 -23t29.5 -58q0 -20 -14 -34t-34 -14t-29.5 11.5t-9.5 28.5q0 9 7.5 23.5t7.5 24.5 q0 20 -37 20q-63 0 -109 -48q-91 -96 -91 -233q0 -54 23 -84t66 -30q39 0 71 19t74 63z" />
+<glyph unicode="&#x10e;" horiz-adv-x="722" d="M603 875l-162 -169h-48l-95 169h38l89 -105l141 105h37zM131 653h277q134 0 213 -70t79 -199q0 -177 -160 -301q-106 -83 -291 -83h-257v16q43 8 56.5 20t25.5 56l122 445q11 39 11 59q0 21 -16 30.5t-60 10.5v16zM310 584l-118 -422q-22 -80 -22 -95q0 -37 68 -37 q148 0 241 90q52 50 81 129.5t29 158.5q0 121 -78 180q-47 35 -131 35q-32 0 -47.5 -7.5t-22.5 -31.5z" />
+<glyph unicode="&#x10f;" horiz-adv-x="609" d="M567 461l-9 17q75 50 75 88q0 14 -20 33q-25 22 -25 46q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -86 -130 -159zM521 683l6 -6l-39 -152l-60 -219q-65 -239 -65 -246q0 -20 18 -20q13 0 27.5 12.5t54.5 58.5l12 -10q-77 -114 -147 -114q-19 0 -30 12t-11 33 q0 30 13 89q-43 -73 -84.5 -102.5t-93.5 -29.5q-50 0 -78.5 30.5t-28.5 86.5q0 119 96.5 227t195.5 108q31 0 45.5 -14t19.5 -44h1l45 163q14 49 14 71q0 16 -11 20t-53 6v17q77 7 153 23zM356 361q0 26 -14.5 41.5t-32.5 15.5q-47 0 -91 -46q-50 -53 -83 -126.5t-33 -135.5 q0 -34 15.5 -53.5t42.5 -19.5q45 0 91 49t75.5 125t29.5 150z" />
+<glyph unicode="&#x110;" horiz-adv-x="722" d="M130 653h276q139 0 216.5 -68.5t77.5 -200.5q0 -87 -43 -166t-117 -135q-110 -83 -303 -83h-245v16q43 8 56 19.5t25 54.5l65 236h-90l12 42h90l46 164q11 39 11 64q0 20 -15 28.5t-62 12.5v16zM238 326l-46 -164q-22 -80 -22 -95q0 -37 69 -37q151 0 240 90 q51 51 80.5 127t29.5 157q0 108 -54 163.5t-160 55.5q-32 0 -44.5 -6t-17.5 -23l-63 -226h153l-12 -42h-153z" />
+<glyph unicode="&#x111;" d="M580 560l-10 -39h-84l-58 -215q-65 -239 -65 -246q0 -20 18 -20q13 0 27.5 12.5t54.5 58.5l12 -10q-77 -114 -147 -114q-19 0 -30 12t-11 33q0 30 13 89q-43 -73 -84.5 -102.5t-93.5 -29.5q-50 0 -78.5 30.5t-28.5 86.5q0 119 96.5 227t195.5 108q31 0 45.5 -14t19.5 -44 h1l37 138h-182l7 39h187q10 40 10 57q0 16 -11 20t-53 6v17q77 7 153 23l6 -6l-30 -117h83zM356 361q0 26 -14.5 41.5t-32.5 15.5q-47 0 -91 -46q-50 -53 -83 -126.5t-33 -135.5q0 -34 15.5 -53.5t42.5 -19.5q45 0 91 49t75.5 125t29.5 150z" />
+<glyph unicode="&#x112;" horiz-adv-x="611" d="M596 757l-11 -51h-301l11 51h301zM634 653l-31 -154l-22 2q3 25 3 46q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 24 -7 31q-16 15 -78 15h-78l-32 -112q-36 -127 -36 -146q0 -34 79 -34 q129 0 203 39q38 20 94 98l16 -8l-62 -162h-507v16q43 8 56 19.5t25 54.5l123 442q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497z" />
+<glyph unicode="&#x113;" horiz-adv-x="444" d="M466 542l-11 -51h-301l11 51h301zM358 109l12 -12q-88 -108 -204 -108q-61 0 -98 37.5t-37 99.5q0 117 93.5 216t205.5 99q39 0 60.5 -18t21.5 -50q0 -66 -76.5 -118t-207.5 -69q-10 -20 -10 -61t25.5 -66t67.5 -25q33 0 63 15.5t84 59.5zM152 252l-17 -44q112 27 161 74 q50 48 50 97q0 39 -35 39q-42 0 -87.5 -48.5t-71.5 -117.5z" />
+<glyph unicode="&#x114;" horiz-adv-x="611" d="M572 866h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM634 653l-31 -154l-22 2q3 25 3 46q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52 q0 24 -7 31q-16 15 -78 15h-78l-32 -112q-36 -127 -36 -146q0 -34 79 -34q129 0 203 39q38 20 94 98l16 -8l-62 -162h-507v16q43 8 56 19.5t25 54.5l123 442q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497z" />
+<glyph unicode="&#x115;" horiz-adv-x="444" d="M442 650h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM358 109l12 -12q-88 -108 -204 -108q-61 0 -98 37.5t-37 99.5q0 117 93.5 216t205.5 99q39 0 60.5 -18t21.5 -50q0 -66 -76.5 -118t-207.5 -69 q-10 -20 -10 -61t25.5 -66t67.5 -25q33 0 63 15.5t84 59.5zM152 252l-17 -44q112 27 161 74q50 48 50 97q0 39 -35 39q-42 0 -87.5 -48.5t-71.5 -117.5z" />
+<glyph unicode="&#x116;" horiz-adv-x="611" d="M499 769q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM634 653l-31 -154l-22 2q3 25 3 46q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52 q0 24 -7 31q-16 15 -78 15h-78l-32 -112q-36 -127 -36 -146q0 -34 79 -34q129 0 203 39q38 20 94 98l16 -8l-62 -162h-507v16q43 8 56 19.5t25 54.5l123 442q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497z" />
+<glyph unicode="&#x117;" horiz-adv-x="444" d="M359 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM358 109l12 -12q-88 -108 -204 -108q-61 0 -98 37.5t-37 99.5q0 117 93.5 216t205.5 99q39 0 60.5 -18t21.5 -50q0 -66 -76.5 -118t-207.5 -69 q-10 -20 -10 -61t25.5 -66t67.5 -25q33 0 63 15.5t84 59.5zM152 252l-17 -44q112 27 161 74q50 48 50 97q0 39 -35 39q-42 0 -87.5 -48.5t-71.5 -117.5z" />
+<glyph unicode="&#x118;" horiz-adv-x="611" d="M299 0h-300v16q43 8 56 19.5t25 54.5l123 442q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497l-31 -154l-22 2q3 25 3 46q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 24 -7 31q-16 15 -78 15h-78 l-32 -112q-36 -127 -36 -146q0 -34 79 -34q129 0 203 39q38 20 94 98l16 -8l-62 -162h-165q-13 -29 -13 -59q0 -23 16.5 -38t42.5 -15q47 0 83 32l17 -18q-52 -77 -125 -77q-40 0 -67.5 26.5t-27.5 68.5q0 44 32 80z" />
+<glyph unicode="&#x119;" horiz-adv-x="444" d="M343 -80l17 -18q-52 -77 -125 -77q-40 0 -67.5 26.5t-27.5 68.5q0 39 23 69q-59 1 -95.5 38.5t-36.5 98.5q0 117 93.5 216t205.5 99q39 0 60.5 -18t21.5 -50q0 -66 -76.5 -118t-207.5 -69q-10 -20 -10 -61t25.5 -66t67.5 -25q33 0 63 15.5t84 59.5l12 -12 q-71 -88 -159 -104q-10 -26 -10 -52q0 -23 16.5 -38t42.5 -15q47 0 83 32zM152 252l-17 -44q112 27 161 74q50 48 50 97q0 39 -35 39q-42 0 -87.5 -48.5t-71.5 -117.5z" />
+<glyph unicode="&#x11a;" horiz-adv-x="611" d="M603 875l-162 -169h-48l-95 169h38l89 -105l141 105h37zM634 653l-31 -154l-22 2q3 25 3 46q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 24 -7 31q-16 15 -78 15h-78l-32 -112q-36 -127 -36 -146 q0 -34 79 -34q129 0 203 39q38 20 94 98l16 -8l-62 -162h-507v16q43 8 56 19.5t25 54.5l123 442q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497z" />
+<glyph unicode="&#x11b;" horiz-adv-x="444" d="M502 661l-162 -169h-48l-95 169h38l89 -105l141 105h37zM358 109l12 -12q-88 -108 -204 -108q-61 0 -98 37.5t-37 99.5q0 117 93.5 216t205.5 99q39 0 60.5 -18t21.5 -50q0 -66 -76.5 -118t-207.5 -69q-10 -20 -10 -61t25.5 -66t67.5 -25q33 0 63 15.5t84 59.5zM152 252 l-17 -44q112 27 161 74q50 48 50 97q0 39 -35 39q-42 0 -87.5 -48.5t-71.5 -117.5z" />
+<glyph unicode="&#x11c;" horiz-adv-x="722" d="M653 708h-36l-82 104l-137 -104h-39l157 169h49zM722 319v-16q-49 -3 -67.5 -16.5t-29.5 -55.5l-49 -187q-111 -62 -237 -62q-137 0 -213 76q-35 35 -54.5 88t-19.5 105q0 103 50 194t133 149q104 72 220 72q72 0 134 -24q26 -10 44 -10q36 0 60 34l15 -5l-49 -197l-18 3 q-3 64 -37 106q-48 59 -141 59q-117 0 -195 -99q-50 -63 -78 -143t-28 -162q0 -99 53 -154t149 -55q71 0 105 34q9 9 16 26.5t23 74.5q26 87 26 113q0 29 -47 33l-32 3v16h267z" />
+<glyph unicode="&#x11d;" d="M447 492h-36l-82 104l-137 -104h-39l157 169h49zM471 366h-49q9 -18 9 -51q0 -63 -57.5 -113.5t-127.5 -50.5q-18 0 -31 3q-3 1 -7 1q-13 0 -24.5 -13t-11.5 -28q0 -24 71 -42q142 -34 142 -127q0 -67 -56 -109t-154 -42q-78 0 -122.5 27.5t-44.5 80.5q0 39 22.5 66.5 t94.5 70.5q-27 17 -27 39q0 48 77 84q-79 28 -79 108q0 74 61 122.5t140 48.5q58 0 98 -28q11 -8 16 -8h60v-39zM352 348q0 39 -13.5 55t-42.5 16q-48 0 -85 -50t-37 -122q0 -35 16 -55t44 -20q50 0 85 59q33 56 33 117zM325 -90q0 35 -31.5 58.5t-111.5 48.5q-24 7 -34 11 q-7 0 -30.5 -19t-34.5 -33q-20 -25 -20 -58q0 -102 127 -102q59 0 97 27.5t38 66.5z" />
+<glyph unicode="&#x11e;" horiz-adv-x="722" d="M632 866h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM722 319v-16q-49 -3 -67.5 -16.5t-29.5 -55.5l-49 -187q-111 -62 -237 -62q-137 0 -213 76q-35 35 -54.5 88t-19.5 105q0 103 50 194t133 149 q104 72 220 72q72 0 134 -24q26 -10 44 -10q36 0 60 34l15 -5l-49 -197l-18 3q-3 64 -37 106q-48 59 -141 59q-117 0 -195 -99q-50 -63 -78 -143t-28 -162q0 -99 53 -154t149 -55q71 0 105 34q9 9 16 26.5t23 74.5q26 87 26 113q0 29 -47 33l-32 3v16h267z" />
+<glyph unicode="&#x11f;" d="M447 650h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM471 366h-49q9 -18 9 -51q0 -63 -57.5 -113.5t-127.5 -50.5q-18 0 -31 3q-3 1 -7 1q-13 0 -24.5 -13t-11.5 -28q0 -24 71 -42q142 -34 142 -127 q0 -67 -56 -109t-154 -42q-78 0 -122.5 27.5t-44.5 80.5q0 39 22.5 66.5t94.5 70.5q-27 17 -27 39q0 48 77 84q-79 28 -79 108q0 74 61 122.5t140 48.5q58 0 98 -28q11 -8 16 -8h60v-39zM352 348q0 39 -13.5 55t-42.5 16q-48 0 -85 -50t-37 -122q0 -35 16 -55t44 -20 q50 0 85 59q33 56 33 117zM325 -90q0 35 -31.5 58.5t-111.5 48.5q-24 7 -34 11q-7 0 -30.5 -19t-34.5 -33q-20 -25 -20 -58q0 -102 127 -102q59 0 97 27.5t38 66.5z" />
+<glyph unicode="&#x120;" horiz-adv-x="722" d="M539 769q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM722 319v-16q-49 -3 -67.5 -16.5t-29.5 -55.5l-49 -187q-111 -62 -237 -62q-137 0 -213 76q-35 35 -54.5 88t-19.5 105q0 103 50 194t133 149 q104 72 220 72q72 0 134 -24q26 -10 44 -10q36 0 60 34l15 -5l-49 -197l-18 3q-3 64 -37 106q-48 59 -141 59q-117 0 -195 -99q-50 -63 -78 -143t-28 -162q0 -99 53 -154t149 -55q71 0 105 34q9 9 16 26.5t23 74.5q26 87 26 113q0 29 -47 33l-32 3v16h267z" />
+<glyph unicode="&#x121;" d="M350 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM471 366h-49q9 -18 9 -51q0 -63 -57.5 -113.5t-127.5 -50.5q-18 0 -31 3q-3 1 -7 1q-13 0 -24.5 -13t-11.5 -28q0 -24 71 -42q142 -34 142 -127 q0 -67 -56 -109t-154 -42q-78 0 -122.5 27.5t-44.5 80.5q0 39 22.5 66.5t94.5 70.5q-27 17 -27 39q0 48 77 84q-79 28 -79 108q0 74 61 122.5t140 48.5q58 0 98 -28q11 -8 16 -8h60v-39zM352 348q0 39 -13.5 55t-42.5 16q-48 0 -85 -50t-37 -122q0 -35 16 -55t44 -20 q50 0 85 59q33 56 33 117zM325 -90q0 35 -31.5 58.5t-111.5 48.5q-24 7 -34 11q-7 0 -30.5 -19t-34.5 -33q-20 -25 -20 -58q0 -102 127 -102q59 0 97 27.5t38 66.5z" />
+<glyph unicode="&#x122;" horiz-adv-x="722" d="M259 -267l-9 18q75 50 75 88q0 11 -21 31q-24 21 -24 47q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159zM722 319v-16q-49 -3 -67.5 -16.5t-29.5 -55.5l-49 -187q-111 -62 -237 -62q-137 0 -213 76q-35 35 -54.5 88t-19.5 105q0 103 50 194t133 149 q104 72 220 72q72 0 134 -24q26 -10 44 -10q36 0 60 34l15 -5l-49 -197l-18 3q-3 64 -37 106q-48 59 -141 59q-117 0 -195 -99q-50 -63 -78 -143t-28 -162q0 -99 53 -154t149 -55q71 0 105 34q9 9 16 26.5t23 74.5q26 87 26 113q0 29 -47 33l-32 3v16h267z" />
+<glyph unicode="&#x123;" d="M386 724l9 -17q-75 -50 -75 -89q0 -13 20 -32q25 -22 25 -45q0 -20 -14.5 -33.5t-36.5 -13.5q-25 0 -41.5 20t-16.5 51q0 87 130 159zM471 366h-49q9 -18 9 -51q0 -63 -57.5 -113.5t-127.5 -50.5q-18 0 -31 3q-3 1 -7 1q-13 0 -24.5 -13t-11.5 -28q0 -24 71 -42 q142 -34 142 -127q0 -67 -56 -109t-154 -42q-78 0 -122.5 27.5t-44.5 80.5q0 39 22.5 66.5t94.5 70.5q-27 17 -27 39q0 48 77 84q-79 28 -79 108q0 74 61 122.5t140 48.5q58 0 98 -28q11 -8 16 -8h60v-39zM352 348q0 39 -13.5 55t-42.5 16q-48 0 -85 -50t-37 -122 q0 -35 16 -55t44 -20q50 0 85 59q33 56 33 117zM325 -90q0 35 -31.5 58.5t-111.5 48.5q-24 7 -34 11q-7 0 -30.5 -19t-34.5 -33q-20 -25 -20 -58q0 -102 127 -102q59 0 97 27.5t38 66.5z" />
+<glyph unicode="&#x124;" horiz-adv-x="722" d="M627 706h-36l-82 104l-137 -104h-39l157 169h49zM769 653v-16q-44 -8 -58 -20t-26 -54l-132 -481q-3 -12 -3 -24q0 -21 15 -29t64 -13v-16h-274v16q51 4 71.5 21t30.5 56l64 233h-285l-66 -244q-3 -10 -3 -22q0 -22 12.5 -30t57.5 -14v-16h-245v16q41 4 56.5 20t29.5 66 l118 430q12 46 12 64q0 21 -14.5 28.5t-62.5 12.5v16h271v-16q-45 -3 -67.5 -19t-32.5 -52l-54 -198h285l46 164q14 52 14 63q0 19 -16 29t-56 13v16h248z" />
+<glyph unicode="&#x125;" d="M447 706h-36l-82 104l-137 -104h-39l157 169h49zM465 118l13 -13q-46 -65 -77 -89.5t-69 -24.5q-20 0 -32 11.5t-12 30.5q0 17 20 92l55 207q7 28 7 33q0 25 -28 25q-27 0 -69.5 -40t-82.5 -100q-31 -48 -49 -93.5t-47 -156.5h-75l146 554q13 50 13 62t-13 18.5t-28 6.5 h-27v15q76 9 157 27l7 -6l-121 -447q130 211 230 211q33 0 49 -18.5t16 -48.5q0 -43 -48 -193q-33 -101 -33 -125q0 -18 16 -18q12 0 26.5 14.5t55.5 65.5z" />
+<glyph unicode="&#x126;" horiz-adv-x="722" d="M769 653v-16q-44 -8 -58 -20t-26 -54l-12 -43h88l-12 -44h-88l-108 -394q-3 -12 -3 -24q0 -21 15 -29t64 -13v-16h-274v16q51 4 71.5 21t30.5 56l64 233h-285l-66 -244q-3 -10 -3 -22q0 -22 12.5 -30t57.5 -14v-16h-245v16q41 4 56.5 20t29.5 66l102 374h-103l12 44h103 q16 57 16 76q0 21 -14.5 28.5t-62.5 12.5v16h271v-16q-45 -3 -67 -19t-33 -52l-13 -46h286q18 62 18 75q0 19 -16 29t-56 13v16h248zM563 476h-286l-29 -108h285z" />
+<glyph unicode="&#x127;" d="M465 118l13 -13q-46 -65 -77 -89.5t-69 -24.5q-20 0 -32 11.5t-12 30.5q0 17 20 92l55 207q7 28 7 33q0 25 -28 25q-27 0 -69.5 -40t-82.5 -100q-31 -48 -49 -93.5t-47 -156.5h-75l132 500h-63l15 54h62q13 50 13 62t-13 18.5t-28 6.5h-27v15q76 9 157 27l7 -6l-33 -123 h159l-15 -54h-159l-73 -270q130 211 230 211q33 0 49 -18.5t16 -48.5q0 -43 -48 -193q-33 -101 -33 -125q0 -18 16 -18q12 0 26.5 14.5t55.5 65.5z" />
+<glyph unicode="&#x128;" horiz-adv-x="333" d="M416 836h28q-22 -104 -95 -104q-18 0 -57 15q-71 29 -95 29q-36 0 -51 -47h-29q15 58 38 82t62 24q32 0 86 -24q41 -19 62 -19q20 0 31.5 9.5t19.5 34.5zM384 653v-16q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16 q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="&#x129;" horiz-adv-x="278" d="M329 624h28q-22 -104 -95 -104q-18 0 -57 15q-71 29 -95 29q-36 0 -51 -47h-29q15 58 38 82t62 24q32 0 86 -24q41 -19 62 -19q20 0 31.5 9.5t19.5 34.5zM221 115l14 -12q-41 -63 -71 -88.5t-67 -25.5q-50 0 -50 57q0 20 24 110l48 175q9 34 9 45q0 15 -11 19t-52 5v16 q44 3 159 25l5 -3l-96 -342q-9 -34 -9 -45q0 -15 16 -15q12 0 30 17.5t51 61.5z" />
+<glyph unicode="&#x12a;" horiz-adv-x="333" d="M439 757l-11 -51h-301l11 51h301zM384 653v-16q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="&#x12b;" horiz-adv-x="278" d="M221 115l14 -12q-41 -63 -71 -88.5t-67 -25.5q-50 0 -50 57q0 20 24 110l48 175q9 34 9 45q0 15 -11 19t-52 5v16q44 3 159 25l5 -3l-96 -342q-9 -34 -9 -45q0 -15 16 -15q12 0 30 17.5t51 61.5zM341 543l-11 -51h-301l11 51h301z" />
+<glyph unicode="&#x12c;" horiz-adv-x="333" d="M419 866h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM384 653v-16q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62 q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="&#x12d;" horiz-adv-x="278" d="M318 650h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM221 115l14 -12q-41 -63 -71 -88.5t-67 -25.5q-50 0 -50 57q0 20 24 110l48 175q9 34 9 45q0 15 -11 19t-52 5v16q44 3 159 25l5 -3l-96 -342 q-9 -34 -9 -45q0 -15 16 -15q12 0 30 17.5t51 61.5z" />
+<glyph unicode="&#x12e;" horiz-adv-x="333" d="M94 0h-102v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247v-16q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-98q-10 -26 -10 -53q0 -23 16.5 -38t42.5 -15q47 0 83 32l17 -18q-52 -77 -125 -77 q-40 0 -67.5 26.5t-27.5 68.5q0 41 27 74z" />
+<glyph unicode="&#x12f;" horiz-adv-x="278" d="M102 -11h-4q-49 0 -49 55q0 29 22 111l48 177q9 32 9 44q0 15 -11.5 19t-52.5 5v16q46 4 160 25l4 -3l-94 -343q-10 -34 -10 -44q0 -15 14 -15q25 0 84 78l13 -11q-46 -71 -76 -93q-15 -30 -15 -63q0 -23 16.5 -38t42.5 -15q47 0 83 32l17 -18q-52 -77 -125 -77 q-40 0 -67.5 26.5t-27.5 68.5q0 35 19 63zM264 599q0 -21 -14.5 -36t-34.5 -15q-22 0 -35 14.5t-13 38.5q0 23 13.5 38t33.5 15t35 -16.5t15 -38.5z" />
+<glyph unicode="&#x130;" horiz-adv-x="333" d="M344 769q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM384 653v-16q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62 q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="&#x131;" horiz-adv-x="278" d="M221 115l14 -12q-41 -63 -71 -88.5t-67 -25.5q-50 0 -50 57q0 20 24 110l48 175q9 34 9 45q0 15 -11 19t-52 5v16q44 3 159 25l5 -3l-96 -342q-9 -34 -9 -45q0 -15 16 -15q12 0 30 17.5t51 61.5z" />
+<glyph unicode="&#x134;" horiz-adv-x="444" d="M536 708h-36l-82 104l-137 -104h-39l157 169h49zM491 653v-16q-43 -6 -56 -17.5t-26 -56.5l-103 -367q-29 -104 -71 -159t-124 -55q-53 0 -85 24t-32 64q0 24 12.5 40t32.5 16t35.5 -13.5t15.5 -32.5q0 -6 -1.5 -14.5t-1.5 -12.5q0 -39 35 -39t53 64l127 454q12 44 12 64 t-15 28.5t-62 12.5v16h254z" />
+<glyph unicode="&#x135;" horiz-adv-x="278" d="M353 492h-36l-82 104l-137 -104h-39l157 169h49zM246 438l-104 -410q-31 -121 -76.5 -178t-110.5 -57q-35 0 -57 17t-22 44q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -12 18 -12q30 0 50.5 39t46.5 143l72 292q16 65 16 80q0 17 -10.5 24t-37.5 7h-26v16 q45 3 169 25z" />
+<glyph unicode="&#x136;" horiz-adv-x="667" d="M211 -267l-9 18q75 50 75 88q0 11 -21 31q-24 21 -24 47q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159zM722 653v-16q-28 0 -77 -37l-298 -225l168 -293q23 -40 40 -50.5t64 -15.5v-16h-275v16l29 3q46 4 46 32q0 6 -1.5 13t-6.5 16l-8 16l-11 19 q-8 14 -10 18l-123 215l-65 -237q-11 -39 -11 -51q0 -23 14.5 -31.5t56.5 -12.5v-16h-247v16q43 5 56 17t25 54l124 445q14 50 14 62q0 21 -17 31t-62 12v16h270v-16q-42 -3 -65 -18.5t-34 -55.5l-53 -194l153 109q143 101 143 137q0 15 -36 19l-24 3v16h221z" />
+<glyph unicode="&#x137;" horiz-adv-x="444" d="M85 -267l-9 18q75 50 75 88q0 11 -21 31q-24 21 -24 47q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159zM461 428v-16q-36 -2 -76 -29.5t-149 -124.5l37 -88q55 -129 81 -129q21 0 45 42q5 8 15 26l15 -11q-35 -63 -58 -86t-53 -23q-22 0 -39.5 17.5 t-41.5 64.5q-30 58 -60 141l-40 -32l-48 -180h-75l141 528q14 50 18 88q-3 24 -51 24h-18v16q75 9 157 27l6 -6l-120 -456l43 33q143 110 143 140q0 18 -37 18h-14v16h179z" />
+<glyph unicode="&#x138;" horiz-adv-x="542" d="M243 276l42 4q35 3 69 28q37 26 75 88q24 39 42 51t58 12q26 0 49 -14t23 -38q0 -18 -15 -29.5t-34 -11.5t-30.5 10t-18 19.5t-14.5 9.5q-21 0 -37 -30q-42 -74 -98 -109q15 -6 26 -22q10 -15 27.5 -76t21.5 -70q13 -32 43 -53.5t64 -29.5l-4 -15h-130q-38 25 -57 72 q-9 22 -19 63l-14 53q-15 48 -24 54q-40 -2 -54 -2l-43 -162q-4 -13 -4 -27q0 -20 16.5 -27t47.5 -8l-5 -16h-241l5 16q46 0 63 11q20 11 30 50l80 305q4 15 4 28q0 6 -1.5 10.5t-3 8t-5.5 5.5l-7 4q-3 1 -10 2l-10 2q-4 0 -13.5 0.5t-14.5 0.5l4 16h241l-4 -16 q-46 -2 -62 -11q-19 -11 -30 -51z" />
+<glyph unicode="&#x139;" horiz-adv-x="556" d="M260 706l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM559 180l-58 -180h-509v16q42 4 55 17t27 61l122 438q11 37 11 62q0 22 -15.5 31t-61.5 12v16h273v-16q-46 -3 -67.5 -19t-33.5 -58l-120 -429q-10 -38 -10 -54q0 -23 22 -32t83 -9 q77 0 110.5 7t69.5 31q41 27 82 112z" />
+<glyph unicode="&#x13a;" horiz-adv-x="278" d="M125 706l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM279 678l-153 -585q-8 -29 -8 -43q0 -18 17 -18q27 0 67 57l25 35l14 -10q-45 -71 -77.5 -98t-73.5 -27q-49 0 -49 56q0 17 4 30l137 524q3 10 3 19q0 22 -49 22h-18v16q70 8 155 27z " />
+<glyph unicode="&#x13b;" horiz-adv-x="556" d="M160 -267l-9 18q75 50 75 88q0 11 -21 31q-24 21 -24 47q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159zM559 180l-58 -180h-509v16q42 4 55 17t27 61l122 438q11 37 11 62q0 22 -15.5 31t-61.5 12v16h273v-16q-46 -3 -67.5 -19t-33.5 -58l-120 -429 q-10 -38 -10 -54q0 -23 22 -32t83 -9q77 0 110.5 7t69.5 31q41 27 82 112z" />
+<glyph unicode="&#x13c;" horiz-adv-x="278" d="M16 -267l-9 18q75 50 75 88q0 11 -21 31q-24 21 -24 47q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159zM279 678l-153 -585q-8 -29 -8 -43q0 -18 17 -18q27 0 67 57l25 35l14 -10q-45 -71 -77.5 -98t-73.5 -27q-49 0 -49 56q0 17 4 30l137 524 q3 10 3 19q0 22 -49 22h-18v16q70 8 155 27z" />
+<glyph unicode="&#x13d;" horiz-adv-x="556" d="M465 436l-9 17q75 50 75 88q0 14 -20 33q-25 22 -25 46q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -86 -130 -159zM559 180l-58 -180h-509v16q42 4 55 17t27 61l122 438q11 37 11 62q0 22 -15.5 31t-61.5 12v16h273v-16q-46 -3 -67.5 -19t-33.5 -58l-120 -429 q-10 -38 -10 -54q0 -23 22 -32t83 -9q77 0 110.5 7t69.5 31q41 27 82 112z" />
+<glyph unicode="&#x13e;" horiz-adv-x="278" d="M318 463l-9 17q75 50 75 88q0 14 -20 33q-25 22 -25 46q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -86 -130 -159zM279 678l-153 -585q-8 -29 -8 -43q0 -18 17 -18q27 0 67 57l25 35l14 -10q-45 -71 -77.5 -98t-73.5 -27q-49 0 -49 56q0 17 4 30l137 524 q3 10 3 19q0 22 -49 22h-18v16q70 8 155 27z" />
+<glyph unicode="&#x13f;" horiz-adv-x="556" d="M459 337q0 -22 -17 -38t-40 -16q-22 0 -38 16t-16 38q0 24 16 40.5t39 16.5t39.5 -17t16.5 -40zM559 180l-58 -180h-509v16q42 4 55 17t27 61l122 438q11 37 11 62q0 22 -15.5 31t-61.5 12v16h273v-16q-46 -3 -67.5 -19t-33.5 -58l-120 -429q-10 -38 -10 -54 q0 -23 22 -32t83 -9q77 0 110.5 7t69.5 31q41 27 82 112z" />
+<glyph unicode="&#x140;" horiz-adv-x="323" d="M386 337q0 -22 -17 -38t-40 -16q-22 0 -38 16t-16 38q0 24 16 40.5t39 16.5t39.5 -17t16.5 -40zM279 678l-153 -585q-8 -29 -8 -43q0 -18 17 -18q27 0 67 57l25 35l14 -10q-45 -71 -77.5 -98t-73.5 -27q-49 0 -49 56q0 17 4 30l137 524q3 10 3 19q0 22 -49 22h-18v16 q70 8 155 27z" />
+<glyph unicode="&#x141;" horiz-adv-x="556" d="M559 180l-59 -180h-508v16q41 5 56 19t27 58l52 191l-99 -59l13 48l99 59l56 200q11 37 11 62q0 22 -15.5 30t-62.5 13v16h273v-16q-44 0 -66 -16.5t-32 -51.5l-51 -181l143 85l-14 -49l-142 -83l-54 -195q-17 -60 -17 -74q0 -19 23 -27.5t75 -8.5q80 0 116.5 6.5 t71.5 29.5q42 27 84 114z" />
+<glyph unicode="&#x142;" horiz-adv-x="278" d="M307 460l-12 -46l-98 -50l-72 -275q-7 -25 -7 -38q0 -19 15 -19q26 0 69 57l26 34l13 -9q-49 -73 -80.5 -99t-70.5 -26q-49 0 -49 56q0 16 16 75l52 194l-72 -36l12 46l72 36q65 242 65 256q0 24 -49 24h-20v16q73 9 156 27l6 -6l-70 -267z" />
+<glyph unicode="&#x143;" horiz-adv-x="667" d="M361 706l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM727 653v-16q-27 -6 -37.5 -9.5t-23 -21t-18.5 -38.5l-23 -76l-146 -507h-18l-230 550l-114 -422q-9 -31 -9 -54q0 -21 15.5 -30.5t54.5 -12.5v-16h-198v16q43 6 61 31.5t45 120.5 l117 415q-23 54 -86 54v16h160l207 -499l106 388q8 28 8 44q0 27 -13.5 37t-55.5 14v16h198z" />
+<glyph unicode="&#x144;" d="M180 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM460 117l14 -13q-51 -70 -78 -91.5t-62 -21.5q-20 0 -33.5 13.5t-13.5 40.5q0 16 16 75l44 162q14 54 14 79q0 29 -24 29q-29 0 -63.5 -34.5t-84.5 -107.5q-33 -49 -48.5 -88 t-51.5 -160h-75l96 350q2 10 2 17q0 15 -13.5 20.5t-51.5 6.5v16q39 8 87 16.5t75 14.5l4 -2l-67 -218q74 118 128 169t103 51q31 0 48 -16.5t17 -44.5q0 -25 -10 -60l-56 -203q-14 -50 -14 -61q0 -18 16 -18q19 0 61 53q7 8 21 26z" />
+<glyph unicode="&#x145;" horiz-adv-x="667" d="M182 -267l-9 18q75 50 75 88q0 11 -21 31q-24 21 -24 47q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159zM727 653v-16q-27 -6 -37.5 -9.5t-23 -21t-18.5 -38.5l-23 -76l-146 -507h-18l-230 550l-114 -422q-9 -31 -9 -54q0 -21 15.5 -30.5t54.5 -12.5 v-16h-198v16q43 6 61 31.5t45 120.5l117 415q-23 54 -86 54v16h160l207 -499l106 388q8 28 8 44q0 27 -13.5 37t-55.5 14v16h198z" />
+<glyph unicode="&#x146;" d="M107 -267l-9 18q75 50 75 88q0 11 -21 31q-24 21 -24 47q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159zM460 117l14 -13q-51 -70 -78 -91.5t-62 -21.5q-20 0 -33.5 13.5t-13.5 40.5q0 16 16 75l44 162q14 54 14 79q0 29 -24 29q-29 0 -63.5 -34.5 t-84.5 -107.5q-33 -49 -48.5 -88t-51.5 -160h-75l96 350q2 10 2 17q0 15 -13.5 20.5t-51.5 6.5v16q39 8 87 16.5t75 14.5l4 -2l-67 -218q74 118 128 169t103 51q31 0 48 -16.5t17 -44.5q0 -25 -10 -60l-56 -203q-14 -50 -14 -61q0 -18 16 -18q19 0 61 53q7 8 21 26z" />
+<glyph unicode="&#x147;" horiz-adv-x="667" d="M635 875l-162 -169h-48l-95 169h38l89 -105l141 105h37zM727 653v-16q-27 -6 -37.5 -9.5t-23 -21t-18.5 -38.5l-23 -76l-146 -507h-18l-230 550l-114 -422q-9 -31 -9 -54q0 -21 15.5 -30.5t54.5 -12.5v-16h-198v16q43 6 61 31.5t45 120.5l117 415q-23 54 -86 54v16h160 l207 -499l106 388q8 28 8 44q0 27 -13.5 37t-55.5 14v16h198z" />
+<glyph unicode="&#x148;" d="M475 661l-162 -169h-48l-95 169h38l89 -105l141 105h37zM460 117l14 -13q-51 -70 -78 -91.5t-62 -21.5q-20 0 -33.5 13.5t-13.5 40.5q0 16 16 75l44 162q14 54 14 79q0 29 -24 29q-29 0 -63.5 -34.5t-84.5 -107.5q-33 -49 -48.5 -88t-51.5 -160h-75l96 350q2 10 2 17 q0 15 -13.5 20.5t-51.5 6.5v16q39 8 87 16.5t75 14.5l4 -2l-67 -218q74 118 128 169t103 51q31 0 48 -16.5t17 -44.5q0 -25 -10 -60l-56 -203q-14 -50 -14 -61q0 -18 16 -18q19 0 61 53q7 8 21 26z" />
+<glyph unicode="&#x149;" horiz-adv-x="577" d="M67 461l-9 17q75 50 75 88q0 14 -20 33q-25 22 -25 46q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -86 -130 -159zM526 117l14 -13q-51 -70 -78 -91.5t-62 -21.5q-20 0 -33.5 13.5t-13.5 40.5q0 16 16 75l44 162q14 54 14 79q0 29 -24 29q-29 0 -63.5 -34.5 t-84.5 -107.5q-33 -49 -48.5 -88t-51.5 -160h-75l96 350q2 10 2 17q0 15 -13.5 20.5t-51.5 6.5v16q39 8 87 16.5t75 14.5l4 -2l-67 -218q74 118 128 169t103 51q31 0 48 -16.5t17 -44.5q0 -25 -10 -60l-56 -203q-14 -50 -14 -61q0 -18 16 -18q19 0 61 53q7 8 21 26z" />
+<glyph unicode="&#x14a;" horiz-adv-x="722" d="M329 653l-34 -120q59 74 114.5 103.5t117.5 29.5q84 0 128.5 -61.5t44.5 -157.5q0 -57 -11 -117.5t-38 -123.5t-65.5 -112t-99.5 -80.5t-135 -31.5q-40 0 -63.5 21t-23.5 53q0 36 22.5 60.5t56.5 24.5q22 0 37.5 -18t15.5 -39q0 -9 -7 -26t-7 -21q0 -18 12 -18t28 5.5 t39 19.5t44.5 43t41 69t31 105.5t11.5 145.5q0 213 -102 213q-101 0 -219 -187l-90 -322q-11 -37 -11 -54q0 -41 55 -41h14v-16h-244v16q43 8 56.5 20t25.5 56l123 446q10 38 10 59q0 20 -15 30t-55 10h-6v16h198z" />
+<glyph unicode="&#x14b;" d="M213 439l-67 -218q74 118 128 169t103 51q31 0 48 -16.5t17 -44.5q0 -25 -10 -60l-77 -292q-32 -123 -77 -179.5t-110 -56.5q-34 0 -56.5 17.5t-22.5 44.5q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -13 18 -13q30 0 50.5 39.5t46.5 143.5l72 293 q17 68 17 71q0 29 -24 29q-29 0 -63.5 -34.5t-84.5 -107.5q-33 -50 -49 -89.5t-51 -158.5h-75l96 350q2 5 2 17q0 15 -13.5 20.5t-51.5 6.5v16q39 8 87 16.5t75 14.5z" />
+<glyph unicode="&#x14c;" horiz-adv-x="722" d="M666 757l-11 -51h-301l11 51h301zM699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163 t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#x14d;" d="M511 543l-11 -51h-301l11 51h301zM468 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM384 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228 q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#x14e;" horiz-adv-x="722" d="M680 866h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182 zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#x14f;" d="M504 650h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM468 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5 t39.5 -102.5zM384 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#x150;" horiz-adv-x="722" d="M497 706l160 160q10 10 27 10q15 0 25.5 -10.5t10.5 -25.5q0 -20 -17 -30l-171 -104h-35zM327 706l160 160q10 10 27 10q15 0 25.5 -10.5t10.5 -25.5q0 -20 -17 -30l-169 -104h-37zM699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172 q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#x151;" d="M318 494l160 160q10 10 27 10q15 0 25.5 -10.5t10.5 -25.5q0 -20 -17 -30l-171 -104h-35zM148 494l160 160q10 10 27 10q15 0 25.5 -10.5t10.5 -25.5q0 -20 -17 -30l-169 -104h-37zM468 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5 t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM384 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#x152;" horiz-adv-x="944" d="M964 653l-31 -150h-16q0 65 -12 85q-18 32 -108 32h-96q-28 0 -37 -32l-64 -227q83 0 116 5.5t53 23.5t41 66l18 -4l-66 -230l-20 2q1 8 2.5 16t2 13t1.5 13q-1 34 -19.5 45t-75.5 14l-62 3l-56 -204q-11 -43 -11 -55q0 -20 16 -28t59 -8q109 0 166.5 28t117.5 111l16 -6 l-65 -166h-346q-12 0 -45.5 -2.5t-85.5 -2.5q-19 0 -46 -1.5t-35 -1.5q-98 0 -162.5 66.5t-64.5 166.5q0 114 54.5 216.5t146 163.5t193.5 61q36 0 98 -8q37 -5 54 -5h369zM458 199l73 268q21 77 21 88q0 34 -29.5 56.5t-74.5 22.5q-74 0 -136 -54q-68 -59 -111.5 -165.5 t-43.5 -212.5q0 -178 144 -178q68 0 99 39q31 37 58 136z" />
+<glyph unicode="&#x153;" horiz-adv-x="667" d="M593 105l11 -11q-107 -106 -197 -106q-69 0 -104 68q-38 -38 -68.5 -52.5t-69.5 -14.5q-63 0 -104 41t-41 105q0 70 41 142t105.5 118t127.5 46q40 0 69.5 -21.5t42.5 -58.5q52 47 85 63.5t74 16.5q38 0 59.5 -18t21.5 -50q0 -61 -70 -109q-30 -21 -77.5 -39.5 t-79.5 -21.5q-31 -2 -36 -19q-10 -34 -10 -70q0 -37 21 -60.5t54 -23.5q28 0 57 15t88 60zM580 378q0 17 -9 27.5t-25 10.5q-34 0 -70 -39q-29 -32 -47 -65.5t-37 -96.5q65 20 88.5 31t46.5 31q53 48 53 101zM343 352q0 30 -16 48t-43 18q-40 0 -73 -35q-48 -52 -78 -130.5 t-30 -152.5q0 -43 18 -67t49 -24q49 0 89 60q29 43 56.5 135.5t27.5 147.5z" />
+<glyph unicode="&#x154;" horiz-adv-x="611" d="M289 706l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM132 653h252q97 0 150.5 -38t53.5 -103q0 -78 -66 -128q-39 -30 -131 -51l89 -235q17 -46 35.5 -64t51.5 -18v-16h-147l-123 324l-66 5l-55 -203q-13 -46 -13 -63q0 -23 13 -33t54 -14 v-16h-243v16q40 5 56.5 22t28.5 63l119 431q12 46 12 63q0 18 -14 28q-12 8 -57 14v16zM306 593l-63 -227q31 -5 51 -5q89 0 139 40t50 110q0 52 -31 82t-89 30q-49 0 -57 -30z" />
+<glyph unicode="&#x155;" horiz-adv-x="389" d="M180 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM176 223l16 35q34 75 94 138q43 45 79 45q21 0 34 -14t13 -37t-12.5 -38.5t-34.5 -15.5q-19 0 -35 26q-8 14 -16 14q-27 0 -82 -94q-34 -58 -54.5 -109.5t-56.5 -172.5h-76l81 292 q16 59 16 82q0 26 -38 26q-8 0 -31 -3v17l155 27l3 -2z" />
+<glyph unicode="&#x156;" horiz-adv-x="611" d="M177 -267l-9 18q75 50 75 88q0 11 -21 31q-24 21 -24 47q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159zM132 653h252q97 0 150.5 -38t53.5 -103q0 -78 -66 -128q-39 -30 -131 -51l89 -235q17 -46 35.5 -64t51.5 -18v-16h-147l-123 324l-66 5 l-55 -203q-13 -46 -13 -63q0 -23 13 -33t54 -14v-16h-243v16q40 5 56.5 22t28.5 63l119 431q12 46 12 63q0 18 -14 28q-12 8 -57 14v16zM306 593l-63 -227q31 -5 51 -5q89 0 139 40t50 110q0 52 -31 82t-89 30q-49 0 -57 -30z" />
+<glyph unicode="&#x157;" horiz-adv-x="389" d="M7 -267l-9 18q75 50 75 88q0 11 -21 31q-24 21 -24 47q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159zM176 223l16 35q34 75 94 138q43 45 79 45q21 0 34 -14t13 -37t-12.5 -38.5t-34.5 -15.5q-19 0 -35 26q-8 14 -16 14q-27 0 -82 -94 q-34 -58 -54.5 -109.5t-56.5 -172.5h-76l81 292q16 59 16 82q0 26 -38 26q-8 0 -31 -3v17l155 27l3 -2z" />
+<glyph unicode="&#x158;" horiz-adv-x="611" d="M574 875l-162 -169h-48l-95 169h38l89 -105l141 105h37zM132 653h252q97 0 150.5 -38t53.5 -103q0 -78 -66 -128q-39 -30 -131 -51l89 -235q17 -46 35.5 -64t51.5 -18v-16h-147l-123 324l-66 5l-55 -203q-13 -46 -13 -63q0 -23 13 -33t54 -14v-16h-243v16q40 5 56.5 22 t28.5 63l119 431q12 46 12 63q0 18 -14 28q-12 8 -57 14v16zM306 593l-63 -227q31 -5 51 -5q89 0 139 40t50 110q0 52 -31 82t-89 30q-49 0 -57 -30z" />
+<glyph unicode="&#x159;" horiz-adv-x="389" d="M426 663l-162 -169h-48l-95 169h38l89 -105l141 105h37zM176 223l16 35q34 75 94 138q43 45 79 45q21 0 34 -14t13 -37t-12.5 -38.5t-34.5 -15.5q-19 0 -35 26q-8 14 -16 14q-27 0 -82 -94q-34 -58 -54.5 -109.5t-56.5 -172.5h-76l81 292q16 59 16 82q0 26 -38 26 q-8 0 -31 -3v17l155 27l3 -2z" />
+<glyph unicode="&#x15a;" d="M236 706l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM508 667l-40 -200l-18 3q0 83 -25 123t-94 40q-52 0 -82 -26.5t-30 -73.5q0 -38 16 -63.5t83 -92.5q67 -68 90 -109t23 -91q0 -85 -57.5 -140t-144.5 -55q-38 0 -104 23q-32 12 -47 12 q-33 0 -43 -32h-18l34 224l20 -2q-2 -9 -2 -23q0 -73 40.5 -120t103.5 -47q58 0 94.5 35.5t36.5 92.5q0 33 -13 59.5t-47 63.5l-39 42q-3 3 -17 18.5t-22 23.5q-45 48 -60 78.5t-15 71.5q0 76 51.5 120t126.5 44q52 0 85 -14q29 -11 46 -11t26 5t19 21h23z" />
+<glyph unicode="&#x15b;" horiz-adv-x="389" d="M180 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM366 442l-20 -140h-16q-14 116 -89 116q-27 0 -43 -15t-16 -42q0 -38 54 -102q68 -79 68 -136q0 -61 -40.5 -97.5t-103.5 -36.5q-29 0 -55 10q-21 9 -44 9q-20 0 -29 -21h-16l20 159h16 q20 -136 100 -136q36 0 56 20t20 57q0 45 -56 115q-63 79 -63 131q0 50 33 79t88 29q20 0 56 -10q22 -7 36 -7q20 0 30 18h14z" />
+<glyph unicode="&#x15c;" d="M484 708h-36l-82 104l-137 -104h-39l157 169h49zM508 667l-40 -200l-18 3q0 83 -25 123t-94 40q-52 0 -82 -26.5t-30 -73.5q0 -38 16 -63.5t83 -92.5q67 -68 90 -109t23 -91q0 -85 -57.5 -140t-144.5 -55q-38 0 -104 23q-32 12 -47 12q-33 0 -43 -32h-18l34 224l20 -2 q-2 -9 -2 -23q0 -73 40.5 -120t103.5 -47q58 0 94.5 35.5t36.5 92.5q0 33 -13 59.5t-47 63.5l-39 42q-3 3 -17 18.5t-22 23.5q-45 48 -60 78.5t-15 71.5q0 76 51.5 120t126.5 44q52 0 85 -14q29 -11 46 -11t26 5t19 21h23z" />
+<glyph unicode="&#x15d;" horiz-adv-x="389" d="M385 492h-36l-82 104l-137 -104h-39l157 169h49zM366 442l-20 -140h-16q-14 116 -89 116q-27 0 -43 -15t-16 -42q0 -38 54 -102q68 -79 68 -136q0 -61 -40.5 -97.5t-103.5 -36.5q-29 0 -55 10q-21 9 -44 9q-20 0 -29 -21h-16l20 159h16q20 -136 100 -136q36 0 56 20 t20 57q0 45 -56 115q-63 79 -63 131q0 50 33 79t88 29q20 0 56 -10q22 -7 36 -7q20 0 30 18h14z" />
+<glyph unicode="&#x15e;" d="M157 -96l50 79q-29 4 -82 22q-32 12 -47 12q-33 0 -43 -32h-18l34 224l20 -2q-2 -9 -2 -23q0 -73 40.5 -120t103.5 -47q58 0 94.5 35.5t36.5 92.5q0 33 -13 59.5t-47 63.5l-39 42q-3 3 -17 18.5t-22 23.5q-45 48 -60 78.5t-15 71.5q0 76 51.5 120t126.5 44q52 0 85 -14 q29 -11 46 -11t26 5t19 21h23l-40 -200l-18 3q0 83 -25 123t-94 40q-52 0 -82 -26.5t-30 -73.5q0 -38 16 -63.5t83 -92.5q67 -68 90 -109t23 -91q0 -81 -53 -135t-135 -59l-32 -49q15 3 25 3q38 0 60 -18.5t22 -49.5q0 -38 -33.5 -62t-85.5 -24q-38 0 -93 21l17 29 q41 -15 68 -15q53 0 53 41q0 19 -13 31.5t-33 12.5q-12 0 -32 -7z" />
+<glyph unicode="&#x15f;" horiz-adv-x="389" d="M80 -96l54 87q-11 1 -29 8q-21 9 -44 9q-20 0 -29 -21h-16l20 159h16q20 -136 100 -136q36 0 56 20t20 57q0 45 -56 115q-63 79 -63 131q0 50 33 79t88 29q20 0 56 -10q22 -7 36 -7q20 0 30 18h14l-20 -140h-16q-14 116 -89 116q-27 0 -43 -15t-16 -42q0 -38 54 -102 q68 -79 68 -136q0 -58 -37 -94t-96 -40l-37 -55q15 3 25 3q38 0 60 -18.5t22 -49.5q0 -38 -33.5 -62t-85.5 -24q-38 0 -93 21l17 29q41 -15 68 -15q53 0 53 41q0 19 -13 31.5t-33 12.5q-12 0 -32 -7z" />
+<glyph unicode="&#x160;" d="M532 875l-162 -169h-48l-95 169h38l89 -105l141 105h37zM508 667l-40 -200l-18 3q0 83 -25 123t-94 40q-52 0 -82 -26.5t-30 -73.5q0 -38 16 -63.5t83 -92.5q67 -68 90 -109t23 -91q0 -85 -57.5 -140t-144.5 -55q-38 0 -104 23q-32 12 -47 12q-33 0 -43 -32h-18l34 224 l20 -2q-2 -9 -2 -23q0 -73 40.5 -120t103.5 -47q58 0 94.5 35.5t36.5 92.5q0 33 -13 59.5t-47 63.5l-39 42q-3 3 -17 18.5t-22 23.5q-45 48 -60 78.5t-15 71.5q0 76 51.5 120t126.5 44q52 0 85 -14q29 -11 46 -11t26 5t19 21h23z" />
+<glyph unicode="&#x161;" horiz-adv-x="389" d="M426 663l-162 -169h-48l-95 169h38l89 -105l141 105h37zM366 442l-20 -140h-16q-14 116 -89 116q-27 0 -43 -15t-16 -42q0 -38 54 -102q68 -79 68 -136q0 -61 -40.5 -97.5t-103.5 -36.5q-29 0 -55 10q-21 9 -44 9q-20 0 -29 -21h-16l20 159h16q20 -136 100 -136 q36 0 56 20t20 57q0 45 -56 115q-63 79 -63 131q0 50 33 79t88 29q20 0 56 -10q22 -7 36 -7q20 0 30 18h14z" />
+<glyph unicode="&#x162;" horiz-adv-x="556" d="M179 0h-114v16q52 5 74 20t33 55l143 527q-119 0 -160.5 -21.5t-77.5 -102.5l-18 4l42 155h532l-44 -164l-17 2q3 25 3 46q0 81 -101 81h-58l-137 -490q-14 -49 -14 -66q0 -23 11 -31.5t42 -11.5l35 -3v-16h-136l-44 -66q15 3 25 3q38 0 60 -18.5t22 -49.5 q0 -38 -33.5 -62t-85.5 -24q-38 0 -93 21l17 29q41 -15 68 -15q53 0 53 41q0 19 -13 31.5t-33 12.5q-12 0 -32 -7l-9 8z" />
+<glyph unicode="&#x163;" horiz-adv-x="278" d="M111 0l-44 -66q15 3 25 3q38 0 60 -18.5t22 -49.5q0 -38 -33.5 -62t-85.5 -24q-38 0 -93 21l17 29q41 -15 68 -15q53 0 53 41q0 19 -13 31.5t-33 12.5q-12 0 -32 -7l-9 8l60 96h38zM296 428l-5 -32h-84l-87 -328q-2 -8 -2 -14q0 -16 15 -16q12 0 28 15.5t53 63.5l13 -7 q-46 -70 -75.5 -95.5t-67.5 -25.5q-46 0 -46 37q0 10 16 74l78 296h-75l-1 6q0 18 33 25q25 6 66 38.5t67 71.5q6 9 14 9q9 0 9 -8q0 -5 -1 -7l-28 -103h80z" />
+<glyph unicode="&#x164;" horiz-adv-x="556" d="M565 875l-162 -169h-48l-95 169h38l89 -105l141 105h37zM633 653l-44 -164l-17 2q3 25 3 46q0 81 -101 81h-58l-137 -490q-14 -49 -14 -66q0 -23 11 -31.5t42 -11.5l35 -3v-16h-288v16q52 5 74 20t33 55l143 527q-119 0 -160.5 -21.5t-77.5 -102.5l-18 4l42 155h532z" />
+<glyph unicode="&#x165;" horiz-adv-x="278" d="M323 463l-9 17q75 50 75 88q0 14 -20 33q-25 22 -25 46q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -86 -130 -159zM296 428l-5 -32h-84l-87 -328q-2 -8 -2 -14q0 -16 15 -16q12 0 28 15.5t53 63.5l13 -7q-46 -70 -75.5 -95.5t-67.5 -25.5q-46 0 -46 37 q0 10 16 74l78 296h-75l-1 6q0 18 33 25q25 6 66 38.5t67 71.5q6 9 14 9q9 0 9 -8q0 -5 -1 -7l-28 -103h80z" />
+<glyph unicode="&#x166;" horiz-adv-x="556" d="M633 653l-44 -164l-17 2q3 25 3 46q0 81 -101 81h-58l-76 -271h130l-12 -44h-130l-49 -175q-14 -49 -14 -66q0 -23 11 -31.5t42 -11.5l35 -3v-16h-288v16q52 5 74 20t33 55l57 212h-115l12 44h115l74 271q-119 0 -160.5 -21.5t-77.5 -102.5l-18 4l42 155h532z" />
+<glyph unicode="&#x167;" horiz-adv-x="278" d="M296 428l-5 -32h-84l-36 -134h98l-12 -44h-97l-40 -150q-2 -8 -2 -14q0 -16 15 -16q12 0 28 15.5t53 63.5l13 -7q-46 -70 -75.5 -95.5t-67.5 -25.5q-46 0 -46 37q0 10 16 74l31 118h-57l12 44h56l36 134h-75l-1 6q0 18 33 25q25 6 66 38.5t67 71.5q6 9 14 9q9 0 9 -8 q0 -5 -1 -7l-28 -103h80z" />
+<glyph unicode="&#x168;" horiz-adv-x="722" d="M625 836h28q-22 -104 -95 -104q-18 0 -57 15q-71 29 -95 29q-36 0 -51 -47h-29q15 58 38 82t62 24q32 0 86 -24q41 -19 62 -19q20 0 31.5 9.5t19.5 34.5zM765 653v-16q-21 -5 -31.5 -9.5t-20.5 -11t-17.5 -24.5t-14.5 -39t-20 -65l-83 -285q-34 -116 -97 -169 q-60 -52 -158 -52t-159.5 46t-61.5 118q0 55 44 216l52 189q9 32 9 45q0 20 -17.5 30t-62.5 11v16h272v-16q-51 -5 -70.5 -22t-33.5 -69l-63 -226q-40 -141 -40 -179q0 -53 39.5 -85.5t98.5 -32.5q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32t-55 14v16h198z" />
+<glyph unicode="&#x169;" d="M444 624h28q-22 -104 -95 -104q-18 0 -57 15q-71 29 -95 29q-36 0 -51 -47h-29q15 58 38 82t62 24q32 0 86 -24q41 -19 62 -19q20 0 31.5 9.5t19.5 34.5zM461 119l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53 q0 18 27 128l35 139q14 58 14 67q0 12 -11 18t-50 6v14q69 8 150 27l4 -3l-89 -355q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-79 -299q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65z" />
+<glyph unicode="&#x16a;" horiz-adv-x="722" d="M651 757l-11 -51h-301l11 51h301zM765 653v-16q-21 -5 -31.5 -9.5t-20.5 -11t-17.5 -24.5t-14.5 -39t-20 -65l-83 -285q-34 -116 -97 -169q-60 -52 -158 -52t-159.5 46t-61.5 118q0 55 44 216l52 189q9 32 9 45q0 20 -17.5 30t-62.5 11v16h272v-16q-51 -5 -70.5 -22 t-33.5 -69l-63 -226q-40 -141 -40 -179q0 -53 39.5 -85.5t98.5 -32.5q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32t-55 14v16h198z" />
+<glyph unicode="&#x16b;" d="M456 543l-11 -51h-301l11 51h301zM461 119l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 18 27 128l35 139q14 58 14 67q0 12 -11 18t-50 6v14q69 8 150 27l4 -3l-89 -355q-3 -9 -3 -16q0 -25 20 -25 q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-79 -299q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65z" />
+<glyph unicode="&#x16c;" horiz-adv-x="722" d="M641 866h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM765 653v-16q-21 -5 -31.5 -9.5t-20.5 -11t-17.5 -24.5t-14.5 -39t-20 -65l-83 -285q-34 -116 -97 -169q-60 -52 -158 -52t-159.5 46t-61.5 118 q0 55 44 216l52 189q9 32 9 45q0 20 -17.5 30t-62.5 11v16h272v-16q-51 -5 -70.5 -22t-33.5 -69l-63 -226q-40 -141 -40 -179q0 -53 39.5 -85.5t98.5 -32.5q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32t-55 14v16h198z" />
+<glyph unicode="&#x16d;" d="M451 650h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5zM461 119l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 18 27 128l35 139q14 58 14 67 q0 12 -11 18t-50 6v14q69 8 150 27l4 -3l-89 -355q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-79 -299q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65z" />
+<glyph unicode="&#x16e;" horiz-adv-x="722" d="M765 653v-16q-21 -5 -31.5 -9.5t-20.5 -11t-17.5 -24.5t-14.5 -39t-20 -65l-83 -285q-34 -116 -97 -169q-60 -52 -158 -52t-159.5 46t-61.5 118q0 55 44 216l52 189q9 32 9 45q0 20 -17.5 30t-62.5 11v16h272v-16q-51 -5 -70.5 -22t-33.5 -69l-63 -226q-40 -141 -40 -179 q0 -53 39.5 -85.5t98.5 -32.5q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32t-55 14v16h198zM590 807q0 -41 -29.5 -70t-70.5 -29q-43 0 -71.5 29t-28.5 71q0 40 29 69.5t70 29.5q42 0 71.5 -29.5t29.5 -70.5zM556 807q0 28 -19.5 47t-47.5 19q-26 0 -45.5 -19.5 t-19.5 -45.5q0 -28 18.5 -47t46.5 -19q29 0 48 18.5t19 46.5z" />
+<glyph unicode="&#x16f;" d="M461 119l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 18 27 128l35 139q14 58 14 67q0 12 -11 18t-50 6v14q69 8 150 27l4 -3l-89 -355q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5 h74l-79 -299q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65zM410 591q0 -41 -29.5 -70t-70.5 -29q-43 0 -71.5 29t-28.5 71q0 40 29 69.5t70 29.5q42 0 71.5 -29.5t29.5 -70.5zM376 591q0 28 -19.5 47t-47.5 19q-26 0 -45.5 -19.5t-19.5 -45.5q0 -28 18.5 -47t46.5 -19 q29 0 48 18.5t19 46.5z" />
+<glyph unicode="&#x170;" horiz-adv-x="722" d="M461 706l160 160q10 10 27 10q15 0 25.5 -10.5t10.5 -25.5q0 -20 -17 -30l-171 -104h-35zM291 706l160 160q10 10 27 10q15 0 25.5 -10.5t10.5 -25.5q0 -20 -17 -30l-169 -104h-37zM765 653v-16q-21 -5 -31.5 -9.5t-20.5 -11t-17.5 -24.5t-14.5 -39t-20 -65l-83 -285 q-34 -116 -97 -169q-60 -52 -158 -52t-159.5 46t-61.5 118q0 55 44 216l52 189q9 32 9 45q0 20 -17.5 30t-62.5 11v16h272v-16q-51 -5 -70.5 -22t-33.5 -69l-63 -226q-40 -141 -40 -179q0 -53 39.5 -85.5t98.5 -32.5q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32 t-55 14v16h198z" />
+<glyph unicode="&#x171;" d="M288 494l160 160q10 10 27 10q15 0 25.5 -10.5t10.5 -25.5q0 -20 -17 -30l-171 -104h-35zM118 494l160 160q10 10 27 10q15 0 25.5 -10.5t10.5 -25.5q0 -20 -17 -30l-169 -104h-37zM461 119l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 45 45 197 q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 18 27 128l35 139q14 58 14 67q0 12 -11 18t-50 6v14q69 8 150 27l4 -3l-89 -355q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-79 -299q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65z" />
+<glyph unicode="&#x172;" horiz-adv-x="722" d="M548 -74l17 -18q-52 -77 -125 -77q-40 0 -67.5 26.5t-27.5 68.5q0 31 15 58q-24 -2 -37 -2q-98 0 -159.5 46t-61.5 118q0 55 44 216l52 189q9 32 9 45q0 20 -17.5 30t-62.5 11v16h272v-16q-51 -5 -70.5 -22t-33.5 -69l-63 -226q-40 -141 -40 -179q0 -53 39.5 -85.5 t98.5 -32.5q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32t-55 14v16h198v-16q-21 -5 -31.5 -9.5t-20.5 -11t-17.5 -24.5t-14.5 -39t-20 -65l-83 -285q-34 -116 -97 -169q-31 -26 -66 -38q-9 -26 -9 -49t16.5 -38t42.5 -15q47 0 83 32z" />
+<glyph unicode="&#x173;" d="M338 -9h-1q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 18 27 128l35 139q14 58 14 67q0 12 -11 18t-50 6v14q69 8 150 27l4 -3l-89 -355q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-79 -299q-19 -72 -19 -78 q0 -17 11 -17q12 0 29 16t54 65l14 -9q-51 -78 -82 -102q-14 -29 -14 -61q0 -23 16.5 -38t42.5 -15q47 0 83 32l17 -18q-52 -77 -125 -77q-40 0 -67.5 26.5t-27.5 68.5q0 36 20 65z" />
+<glyph unicode="&#x174;" horiz-adv-x="833" d="M643 708h-36l-82 104l-137 -104h-39l157 169h49zM906 653v-16q-29 -9 -42.5 -22t-34.5 -53l-301 -580h-20l-50 453h-5l-222 -453h-19l-61 514q-8 70 -13 92.5t-16 33.5q-10 10 -51 15v16h235v-16q-41 -4 -56.5 -14t-15.5 -37q0 -13 1 -20l44 -404l172 348l-8 65 q-4 38 -17.5 49t-57.5 13v16h236v-16q-39 -4 -53.5 -14t-14.5 -34q0 -3 1 -8.5t1 -6.5l40 -412l188 365q23 44 23 68q0 41 -67 42v16h184z" />
+<glyph unicode="&#x175;" horiz-adv-x="667" d="M537 492h-36l-82 104l-137 -104h-39l157 169h49zM403 426l32 -352q99 123 132 175.5t33 84.5q0 14 -22 35q-21 20 -21 41q0 12 11.5 21.5t27.5 9.5q22 0 37 -16t15 -40q0 -91 -212 -349l-9 -11q-35 -43 -45 -43q-8 0 -11 35l-29 310l-89 -152q-23 -38 -55 -99 q-49 -94 -64 -94q-7 0 -9 9t-4 38l-4 91q-8 164 -27 242q-7 27 -15.5 34.5t-31.5 7.5h-28v13q79 13 95 17q5 1 11.5 3t10.5 3t7 1q8 0 11 -5t8 -29q25 -120 32 -281l192 304q6 10 13 10q8 0 8 -14z" />
+<glyph unicode="&#x176;" horiz-adv-x="556" d="M537 708h-36l-82 104l-137 -104h-39l157 169h49zM633 653v-16q-21 -7 -32 -17.5t-38 -43.5l-219 -270l-36 -123q-30 -103 -30 -127q0 -19 11.5 -27t41.5 -10l36 -3v-16h-289v16q51 3 72.5 18.5t34.5 62.5l59 205l-76 267q-11 40 -23.5 51t-53.5 17v16h239v-16 q-44 -4 -58 -11.5t-14 -24.5t36 -144l31 -110l39 46q149 176 149 213q0 24 -40 28l-29 3v16h189z" />
+<glyph unicode="&#x177;" horiz-adv-x="444" d="M398 492h-36l-82 104l-137 -104h-39l157 169h49zM243 186l21 -110q67 110 94.5 167.5t27.5 89.5q0 16 -26 32q-26 17 -26 39q0 16 11.5 26.5t28.5 10.5q22 0 37 -16t15 -39q0 -87 -131 -305q-78 -129 -151.5 -208t-116.5 -79q-23 0 -37 12t-14 31q0 17 11.5 28.5 t27.5 11.5q19 0 34 -14t27 -14q18 0 48 33q13 13 38.5 46.5t32.5 44.5q10 20 10 35q0 30 -31 155.5t-51 176.5q-14 37 -30.5 50.5t-46.5 13.5q-16 0 -31 -4v17q22 4 32 6q41 8 107 18h4q11 0 41.5 -93t43.5 -162z" />
+<glyph unicode="&#x178;" horiz-adv-x="556" d="M339 769q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM539 769q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM633 653v-16q-21 -7 -32 -17.5 t-38 -43.5l-219 -270l-36 -123q-30 -103 -30 -127q0 -19 11.5 -27t41.5 -10l36 -3v-16h-289v16q51 3 72.5 18.5t34.5 62.5l59 205l-76 267q-11 40 -23.5 51t-53.5 17v16h239v-16q-44 -4 -58 -11.5t-14 -24.5t36 -144l31 -110l39 46q149 176 149 213q0 24 -40 28l-29 3v16 h189z" />
+<glyph unicode="&#x179;" horiz-adv-x="556" d="M297 706l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM606 639l-483 -603h161q71 0 108.5 6t64.5 26q41 30 77 104l19 -3l-54 -169h-505v14l479 603h-171q-102 0 -142 -27q-22 -15 -32.5 -30.5t-33.5 -58.5l-19 5l45 147h486v-14z" />
+<glyph unicode="&#x17a;" horiz-adv-x="389" d="M167 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM380 417l-289 -344q46 -10 68.5 -25t51.5 -58q34 -50 70 -50q27 0 27 15q0 5 -5 15q-8 16 -8 28q1 13 11 23.5t22 10.5q16 0 25.5 -10t9.5 -27q0 -31 -26 -53.5t-67 -22.5 q-42 0 -113 44q-68 42 -105 42q-23 0 -45 -18l-9 9l310 372h-136q-40 0 -58 -11.5t-33 -48.5l-16 4l32 116h283v-11z" />
+<glyph unicode="&#x17b;" horiz-adv-x="556" d="M399 769q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM606 639l-483 -603h161q71 0 108.5 6t64.5 26q41 30 77 104l19 -3l-54 -169h-505v14l479 603h-171q-102 0 -142 -27q-22 -15 -32.5 -30.5t-33.5 -58.5 l-19 5l45 147h486v-14z" />
+<glyph unicode="&#x17c;" horiz-adv-x="389" d="M289 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM380 417l-289 -344q46 -10 68.5 -25t51.5 -58q34 -50 70 -50q27 0 27 15q0 5 -5 15q-8 16 -8 28q1 13 11 23.5t22 10.5q16 0 25.5 -10t9.5 -27 q0 -31 -26 -53.5t-67 -22.5q-42 0 -113 44q-68 42 -105 42q-23 0 -45 -18l-9 9l310 372h-136q-40 0 -58 -11.5t-33 -48.5l-16 4l32 116h283v-11z" />
+<glyph unicode="&#x17d;" horiz-adv-x="556" d="M513 875l-162 -169h-48l-95 169h38l89 -105l141 105h37zM606 639l-483 -603h161q71 0 108.5 6t64.5 26q41 30 77 104l19 -3l-54 -169h-505v14l479 603h-171q-102 0 -142 -27q-22 -15 -32.5 -30.5t-33.5 -58.5l-19 5l45 147h486v-14z" />
+<glyph unicode="&#x17e;" horiz-adv-x="389" d="M426 663l-162 -169h-48l-95 169h38l89 -105l141 105h37zM380 417l-289 -344q46 -10 68.5 -25t51.5 -58q34 -50 70 -50q27 0 27 15q0 5 -5 15q-8 16 -8 28q1 13 11 23.5t22 10.5q16 0 25.5 -10t9.5 -27q0 -31 -26 -53.5t-67 -22.5q-42 0 -113 44q-68 42 -105 42 q-23 0 -45 -18l-9 9l310 372h-136q-40 0 -58 -11.5t-33 -48.5l-16 4l32 116h283v-11z" />
+<glyph unicode="&#x17f;" horiz-adv-x="383" d="M164 450h27q12 57 28 94q63 139 190 139q40 0 72 -15.5t32 -47.5q0 -15 -12 -27.5t-28 -12.5q-28 0 -45 33q-24 42 -53 42q-57 0 -76 -91l-100 -476q-3 -16 -3 -29q0 -20 9 -29q13 -13 71 -15l-3 -15h-260l3 15q50 3 69 16q21 15 30 59l69 328h-27z" />
+<glyph unicode="&#x180;" d="M223 509l-60 -219q51 83 95.5 117t98.5 34q52 0 84 -32t32 -88q0 -77 -47 -155t-122.5 -127.5t-150.5 -49.5q-46 0 -88 16t-42 37v6l125 461h-123l13 31h118l9 31q9 31 9 47t-9.5 19.5t-54.5 5.5v17q75 9 153 23l5 -5q-3 -11 -10 -40t-11 -42l-16 -56h162l-8 -31h-162z M388 306q0 86 -70 86q-69 0 -137 -115q-32 -54 -52 -119.5t-20 -111.5q0 -34 46 -34q66 0 123 59q46 48 78 114.5t32 120.5z" />
+<glyph unicode="&#x188;" d="M350 107l16 -10q-46 -58 -89.5 -83t-99.5 -25q-71 0 -109 39t-38 115q0 67 34 129.5t89 107.5q77 61 167 61q28 0 49 -9q15 53 51.5 84.5t86.5 31.5q27 0 48.5 -16t21.5 -42q0 -28 -25 -28q-14 0 -22 9.5t-11 21t-11.5 21t-22.5 9.5q-41 0 -61 -83l-10 -43q11 -16 11 -37 q0 -20 -14 -34t-34 -14t-29.5 11.5t-9.5 28.5q0 9 7.5 23.5t7.5 24.5q0 20 -37 20q-63 0 -109 -48q-91 -96 -91 -233q0 -54 23 -84t66 -30q39 0 71 19t74 63z" />
+<glyph unicode="&#x190;" horiz-adv-x="667" d="M563 168l34 -9q-15 -54 -65.5 -93t-110.5 -55.5t-122 -16.5q-59 0 -108.5 12t-87 44.5t-37.5 82.5q0 74 56.5 140t130.5 79q-49 26 -72 48.5t-23 60.5q0 55 30 99t77.5 70t100 40t102.5 14q54 0 106 -16q37 -11 67 -41.5t30 -63.5q0 -23 -13 -41.5t-34 -18.5 q-45 0 -64 81q-7 26 -38 41t-54 15q-84 0 -145 -52.5t-61 -140.5q0 -37 20 -53.5t75 -16.5q9 0 50.5 5.5t52.5 5.5q16 0 31.5 -7.5t15.5 -21.5q0 -18 -26.5 -30t-47.5 -12q-8 0 -41 2.5t-39 2.5q-74 0 -128.5 -49.5t-54.5 -125.5q0 -93 165 -93q89 0 136 21.5t92 92.5z" />
+<glyph unicode="&#x192;" horiz-adv-x="472" d="M100 437h107q69 269 210 269q32 0 54.5 -17t22.5 -42q0 -21 -15 -37.5t-35 -16.5q-14 0 -24.5 9t-10.5 21t8.5 24.5t8.5 17.5q0 12 -19 12q-27 0 -44 -18q-35 -39 -58 -146q-2 -9 -7 -35l-8 -41h126l-6 -31h-128q-21 -118 -66.5 -271t-71.5 -197q-55 -97 -132 -97 q-32 0 -53 16.5t-21 42.5q0 24 15 39.5t38 15.5q14 0 23 -11t9 -25q0 -19 -9.5 -30t-9.5 -12q0 -12 18 -12q68 0 101 174l27 158q19 99 47 209h-103z" />
+<glyph unicode="&#x195;" horiz-adv-x="672" d="M444 343l-69 -247q-9 -31 -9 -38q0 -20 17 -20q62 0 116.5 43t84 105t29.5 122q0 16 -5 29q-2 5 -25.5 26.5t-23.5 43.5q0 16 11 25t25 9q22 0 37 -13.5t20 -36.5q2 -9 2 -30q0 -63 -21 -128.5t-58 -119.5t-94 -88.5t-122 -34.5q-16 0 -25 1t-21.5 4.5t-18.5 13t-6 24.5 q0 17 20 92l55 207q7 28 7 33q0 25 -28 25q-27 0 -69.5 -40t-82.5 -100q-31 -48 -49 -93.5t-47 -156.5h-75l146 554q13 50 13 62t-13 18.5t-28 6.5h-27v15q76 9 157 27l7 -6l-121 -447q130 211 230 211q33 0 49 -18.5t16 -48.5q0 -15 -4 -31z" />
+<glyph unicode="&#x199;" d="M14 0l124 465q24 91 95 154.5t164 63.5q38 0 65.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-42 30q-38 0 -79.5 -37t-55.5 -91l-79 -300l43 33q143 110 143 140q0 18 -37 18h-14v16h179v-16q-36 -2 -76 -29.5t-149 -124.5l37 -88q55 -129 81 -129 q21 0 45 42q5 8 15 26l15 -11q-35 -63 -58 -86t-53 -23q-22 0 -39.5 17.5t-41.5 64.5q-30 58 -60 141l-40 -32l-48 -180h-75z" />
+<glyph unicode="&#x19a;" horiz-adv-x="278" d="M279 678l-79 -300h78l-8 -31h-78l-66 -254q-8 -29 -8 -43q0 -18 17 -18q27 0 67 57l25 35l14 -10q-45 -71 -77.5 -98t-73.5 -27q-49 0 -49 56q0 17 4 30l71 272h-74l8 31h74l58 221q3 10 3 19q0 22 -49 22h-18v16q70 8 155 27z" />
+<glyph unicode="&#x19b;" horiz-adv-x="490" d="M478 575l-102 -75l58 -500h-44l-34 333l-232 -333h-94l245 341q49 67 61 91q0 28 -1 39l-172 -127v54l165 119q-17 67 -45 67q-10 0 -32.5 -10t-40.5 -10q-20 0 -34 12t-14 34q0 25 19 41.5t51 16.5q105 0 136 -124l110 85v-54z" />
+<glyph unicode="&#x19e;" d="M213 439l-67 -218q74 118 128 169t103 51q31 0 48 -16.5t17 -44.5q0 -25 -10 -60l-153 -553h-81l149 515q17 60 17 79q0 13 -7.5 20.5t-19.5 7.5q-29 0 -64 -34t-84 -107q-33 -49 -48.5 -88t-51.5 -160h-75l96 350q2 10 2 17q0 15 -13.5 20.5t-51.5 6.5v16q39 8 87 16.5 t75 14.5z" />
+<glyph unicode="&#x1a0;" horiz-adv-x="722" d="M783 635q0 -55 -66 -68q-24 -3 -33 -3q-11 0 -20 2q35 -61 35 -148q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 239 97q105 0 164 -67q21 -18 47 -18q17 0 26.5 6t9.5 15q0 1 -8.5 6.5t-17.5 16.5 t-9 26t13.5 27.5t32.5 12.5q21 0 35 -15t14 -41zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#x1a1;" horiz-adv-x="534" d="M583 411q0 -55 -66 -68q-24 -3 -34 -3t-20 2q5 -22 5 -41q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q45 0 78.5 -20t49.5 -57q15 -7 32 -7q36 0 36 22l-9 6q-8 6 -17 17t-9 25 q0 15 13.5 27.5t32.5 12.5q21 0 35 -15t14 -41zM384 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#x1a5;" horiz-adv-x="504" d="M237 535l-51 -207q75 113 171 113q55 0 85 -33t30 -92q0 -123 -93.5 -225t-203.5 -102q-36 0 -69 17l-36 -135q-4 -16 -4 -31q0 -16 13.5 -22.5t48.5 -6.5v-16h-203v16q32 1 45.5 14t22.5 49l148 558q11 40 21 70.5t27.5 63.5t38 54t51.5 35t68 14q38 0 65.5 -15 t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-41 30q-50 0 -75 -100zM382 313q0 44 -14.5 64.5t-47.5 20.5q-39 0 -78 -34t-57 -80q-22 -57 -43.5 -135t-21.5 -103q0 -17 13.5 -27.5t34.5 -10.5q78 0 145 95q69 96 69 210z" />
+<glyph unicode="&#x1aa;" horiz-adv-x="340" d="M65 45l158 442q-35 -24 -75 -24q-38 0 -61.5 24t-23.5 60q0 52 44.5 94.5t96.5 42.5q57 1 86 -36.5t29 -94.5q0 -37 -8 -59l-184 -531q-28 -82 -28 -121q0 -41 36 -41q19 0 44 30t47 30q16 0 28 -11t12 -27q0 -29 -29.5 -42.5t-62.5 -13.5q-67 0 -105 34.5t-38 91.5 q0 58 34 152zM247 597q0 53 -46 53q-40 0 -72 -27t-32 -69q0 -25 17 -41t43 -16q23 0 46 13.5t37 34.5q7 40 7 52z" />
+<glyph unicode="&#x1ab;" horiz-adv-x="278" d="M296 428l-5 -32h-84l-87 -328q-2 -8 -2 -14q0 -16 15 -16q12 0 28 15.5t53 63.5l13 -7q-35 -87 -47 -133l-29 -102q-27 -93 -112 -93q-38 0 -65.5 15t-27.5 41q0 16 12.5 27t27.5 11q22 0 47 -30t42 -30q12 0 25.5 16.5t20.5 39.5l30 99q3 11 10 52q-34 -34 -77 -34 q-46 0 -46 37q0 10 16 74l78 296h-75l-1 6q0 18 33 25q25 6 66 38.5t67 71.5q6 9 14 9q9 0 9 -8q0 -5 -1 -7l-28 -103h80z" />
+<glyph unicode="&#x1ad;" horiz-adv-x="310" d="M132 396h-75l-1 6q0 18 33 25q22 5 58 32q27 108 76 166t136 58q34 0 63.5 -13.5t29.5 -42.5q0 -15 -12 -26.5t-27 -11.5q-22 0 -47 30t-42 30q-21 0 -37.5 -18t-23 -35.5t-14.5 -46.5l-33 -121h80l-5 -32h-84l-87 -328q-2 -8 -2 -14q0 -16 15 -16q12 0 28 15.5t53 63.5 l13 -7q-46 -70 -75.5 -95.5t-67.5 -25.5q-46 0 -46 37q0 10 16 74z" />
+<glyph unicode="&#x1af;" horiz-adv-x="754" d="M567 653h199q21 0 34 4.5t16.5 9t3.5 9.5q0 2 -8.5 7t-17 16t-8.5 26t13 27.5t32 12.5q21 0 35.5 -15t14.5 -40q0 -27 -18 -45.5t-49 -24.5q-7 -1 -27.5 -3t-32.5 -3q-35 -4 -51 -29t-42 -117l-83 -285q-34 -116 -97 -169q-60 -52 -158 -52t-159.5 46t-61.5 118 q0 55 44 216l52 189q9 32 9 45q0 20 -17.5 30t-62.5 11v16h272v-16q-51 -5 -70.5 -22t-33.5 -69l-63 -226q-40 -141 -40 -179q0 -53 39.5 -85.5t98.5 -32.5q84 0 135 54t85 178l64 233q23 85 23 103q0 22 -15 32t-55 14v16z" />
+<glyph unicode="&#x1b0;" horiz-adv-x="573" d="M391 432h74q82 0 82 21q0 2 -8.5 7.5t-17.5 16.5t-9 26t13 27.5t32 12.5q20 0 35 -16t15 -41q0 -27 -18 -45t-48 -23q-33 -6 -74 -6h-7l-74 -279q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 45 45 197 q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 18 27 128l35 139q14 58 14 67q0 12 -11 18t-50 6v14q69 8 150 27l4 -3l-89 -355q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5z" />
+<glyph unicode="&#x1ba;" d="M462 429l-237 -186q41 17 70 17q46 0 72 -24t26 -64q0 -93 -92 -141l-197 -101q-54 -28 -54 -83q0 -54 65 -54q28 0 49.5 15t26.5 40q13 64 52 64q22 0 35 -13t13 -31t-13.5 -41t-41.5 -36q-54 -25 -113 -25q-48 0 -81.5 26.5t-33.5 70.5q0 46 28.5 83t70.5 59l150 76 q56 29 56 73q0 50 -75 50q-38 0 -63 -10t-61 -38q-11 11 -16 18l264 212h-162q-46 0 -64 -19t-37 -67h-18l61 150h320v-21z" />
+<glyph unicode="&#x1bb;" d="M500 360l-9 -46h-148q-29 -32 -228 -233v-5h181q43 0 64 13.5t39 51.5l17 -7l-50 -134h-354v17l210 224q56 61 66 73h-248l9 46h274q43 64 43 122q0 56 -31.5 88.5t-87.5 32.5q-96 0 -146 -96l-21 7q27 75 80 118.5t130 43.5q72 0 117 -48.5t45 -120.5q0 -41 -17.5 -74 t-51.5 -73h117z" />
+<glyph unicode="&#x1be;" d="M297 447l-12 -62q7 1 23 1q68 0 106.5 -43.5t38.5 -109.5q0 -111 -72.5 -178t-180.5 -67q-50 0 -101.5 28.5t-51.5 74.5q0 19 13.5 31.5t32.5 12.5q23 0 36 -20t18 -44t22 -44t46 -20q51 0 93 69t42 121q0 47 -34.5 74t-86.5 27h-20l37 149h-77l8 31h77l15 61h47l-12 -61 h78l-8 -31h-77z" />
+<glyph unicode="&#x1c0;" horiz-adv-x="170" d="M258 736l-192 -736h-51l192 736h51z" />
+<glyph unicode="&#x1c1;" horiz-adv-x="290" d="M379 736l-193 -736h-51l193 736h51zM259 736l-193 -736h-51l193 736h51z" />
+<glyph unicode="&#x1c2;" horiz-adv-x="340" d="M429 464l-13 -51h-157l-22 -90h157l-13 -51h-157l-74 -272h-51l73 272h-157l13 51h158l22 90h-158l13 51h159l71 272h51l-72 -272h157z" />
+<glyph unicode="&#x1c3;" horiz-adv-x="333" d="M137 177l-17 5q49 227 71 369q10 64 25.5 90t43.5 26q44 0 44 -51q0 -40 -39 -123q-56 -120 -128 -316zM145 41q0 -21 -16.5 -36.5t-39.5 -15.5q-22 0 -36 15.5t-14 38.5q0 21 16.5 36.5t37.5 15.5q23 0 37.5 -16t14.5 -38z" />
+<glyph unicode="&#x1f0;" horiz-adv-x="278" d="M397 661l-162 -169h-48l-95 169h38l89 -105l141 105h37zM246 438l-104 -410q-31 -121 -76.5 -178t-110.5 -57q-35 0 -57 17t-22 44q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -12 18 -12q30 0 50.5 39t46.5 143l72 292q16 65 16 80q0 17 -10.5 24t-37.5 7 h-26v16q45 3 169 25z" />
+<glyph unicode="&#x1fa;" horiz-adv-x="611" d="M396 656l90 -541q10 -62 24 -79t54 -20v-16h-245v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l279 486q-24 8 -39.5 29t-15.5 48q0 33 23.5 56t57.5 23q32 0 55 -23.5t23 -56.5 q0 -29 -20 -51.5t-50 -26.5zM369 262l-45 263l-149 -263h194zM433 736q0 19 -14 32t-34 13q-17 0 -31 -13.5t-14 -31.5q0 -20 13.5 -34t31.5 -14q21 0 34.5 14t13.5 34zM284 810l141 121q14 12 20.5 15.5t19.5 3.5q25 0 25 -26q0 -16 -32 -35l-141 -79h-33z" />
+<glyph unicode="&#x1fb;" horiz-adv-x="501" d="M463 111l13 -11q-56 -68 -82.5 -89t-56.5 -21q-40 0 -40 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5q-44 0 -72 30.5t-28 85.5q0 76 43.5 155t110.5 130t132 51q67 0 80 -58l11 48l3 3l61 7l7 -3q-1 -4 -6 -21q-89 -324 -89 -363q0 -13 14 -13q15 0 52 41zM365 361 q0 26 -15 42t-41 16q-68 0 -131 -92q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225zM209 690l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM420 591q0 -41 -29.5 -70t-70.5 -29q-43 0 -71.5 29t-28.5 71q0 40 29 69.5 t70 29.5q42 0 71.5 -29.5t29.5 -70.5zM386 591q0 28 -19.5 47t-47.5 19q-26 0 -45.5 -19.5t-19.5 -45.5q0 -28 18.5 -47t46.5 -19q29 0 48 18.5t19 46.5z" />
+<glyph unicode="&#x1fc;" horiz-adv-x="889" d="M559 706l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM911 653l-33 -153l-17 2q1 13 1 36q0 53 -34.5 67.5t-157.5 14.5q-35 0 -46 -6.5t-18 -30.5l-61 -222q54 0 80 2t49.5 6t36 16.5t22 27t23.5 45.5l18 -4l-69 -232l-17 4q6 36 6 52 q0 31 -22.5 40.5t-95.5 9.5h-40l-62 -217q-9 -32 -9 -49q0 -29 51 -29h30q112 0 167.5 27t112.5 109l18 -5l-64 -164h-498v16q44 4 58.5 13.5t21.5 34.5l49 170h-190l-101 -131q-24 -32 -24 -56q0 -15 12 -20.5t52 -10.5v-16h-187v16q19 4 33.5 17.5t50.5 58.5l369 465 q23 29 27.5 36.5t4.5 16.5q0 25 -38 26l-26 1v16h517zM517 613l-268 -342h173z" />
+<glyph unicode="&#x1fd;" horiz-adv-x="667" d="M459 439l-22 -62q59 64 122 64q37 0 59 -19t22 -51q0 -58 -66 -101q-52 -33 -190 -72q-8 -34 -8 -60q0 -55 16.5 -78.5t53.5 -23.5q60 0 142 77l10 -12q-42 -51 -96.5 -81.5t-101.5 -30.5t-75.5 33t-28.5 89q0 20 6 40q-59 -92 -102.5 -127t-92.5 -35q-38 0 -61 25.5 t-23 72.5q0 79 44.5 163t110.5 137.5t125 53.5q54 0 66 -47l19 45h71zM574 380q0 36 -35 36q-33 0 -65 -35q-28 -30 -45 -62t-39 -96q68 20 104.5 42t61.5 55q18 24 18 60zM350 370q0 23 -12.5 37t-32.5 14q-53 1 -113 -86q-37 -54 -60 -118t-23 -118q0 -60 34 -60 q42 0 80 41q54 58 90.5 141.5t36.5 148.5zM307 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35z" />
+<glyph unicode="&#x1fe;" horiz-adv-x="722" d="M355 706l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM669 722l-61 -94q47 -36 69 -86.5t22 -127.5q0 -109 -63 -210.5t-159 -161.5t-192 -60q-58 0 -104 18l-68 -105h-44l80 124q-89 60 -89 196q0 73 34 153.5t89 146t132 108.5t157 43 q53 0 104 -20l49 76h44zM188 74l357 533q-34 26 -84 26q-78 0 -148.5 -77t-109 -179t-38.5 -187q0 -73 23 -116zM571 575l-358 -531q32 -29 82 -29q67 0 126.5 50.5t95.5 124t56.5 150t20.5 135.5q0 61 -23 100z" />
+<glyph unicode="&#x1ff;" d="M180 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM428 554l-58 -119q48 -11 73.5 -48.5t25.5 -88.5q0 -60 -34 -125t-90 -113q-83 -71 -169 -71q-8 0 -20 2l-61 -126h-35l64 131q-39 13 -59 34q-37 39 -37 100q0 115 93 213t201 98 q11 0 17 -1l55 114h34zM357 406l-190 -392q11 -4 22 -4q66 0 122 82q32 49 53 114t21 119q0 50 -28 81zM140 29l188 389l-10 2q-52 0 -95 -46q-49 -53 -80 -129.5t-31 -147.5q0 -40 28 -68z" />
+<glyph unicode="&#x237;" horiz-adv-x="278" d="M246 438l-104 -410q-31 -121 -76.5 -178t-110.5 -57q-35 0 -57 17t-22 44q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -12 18 -12q30 0 50.5 39t46.5 143l72 292q16 65 16 80q0 17 -10.5 24t-37.5 7h-26v16q45 3 169 25z" />
+<glyph unicode="&#x250;" horiz-adv-x="444" d="M173 387h1q83 73 164 73q39 0 61 -19t22 -54q0 -88 -103 -148q-56 -32 -201 -81q-18 -74 -18 -87q0 -57 60 -57q33 0 60.5 14t27.5 35q0 9 -3 20t-3 22q0 15 13.5 28t32.5 13q17 0 30 -13t13 -33q0 -46 -65 -81q-53 -29 -124 -29q-56 0 -88 22t-32 66q0 22 12 68l48 191 q5 23 5 36q0 29 -20 29q-21 0 -47 -18l7 28q49 48 102 48q47 0 47 -48q0 -16 -2 -25zM159 323l-36 -141q99 32 145 66q57 42 57 104q0 50 -54 50q-39 0 -71.5 -23t-40.5 -56z" />
+<glyph unicode="&#x251;" horiz-adv-x="511" d="M487 460l-87 -346q-6 -26 -6 -33q0 -24 41 -24q11 0 18 1l-4 -16l-159 -52l-4 3l15 61q-62 -64 -146 -64q-17 0 -36 5t-44.5 18t-41.5 44t-16 76q0 119 87.5 223t192.5 104q56 0 95 -43l74 43h21zM313 102l58 230q2 7 2 20q0 38 -23 59t-57 21q-65 0 -127.5 -80 t-62.5 -184q0 -63 31 -94.5t75 -31.5q34 0 66 17t38 43z" />
+<glyph unicode="&#x252;" horiz-adv-x="511" d="M218 457l-15 -61q62 64 146 64q17 0 36 -5t44.5 -18t41.5 -44t16 -76q0 -119 -87.5 -223t-192.5 -104q-56 0 -95 43l-74 -43h-21l87 346q6 26 6 33q0 24 -41 24q-11 0 -18 -1l4 16l159 52zM191 348l-58 -230q-2 -7 -2 -20q0 -38 23 -59t57 -21q65 0 127.5 80t62.5 184 q0 63 -31 94.5t-75 31.5q-34 0 -66 -17t-38 -43z" />
+<glyph unicode="&#x253;" d="M23 48l114 421q25 93 92.5 153.5t168.5 60.5q35 0 62.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-41 30q-38 0 -79 -38t-56 -93l-62 -228h1q50 83 94.5 117t98.5 34q52 0 84 -32t32 -88q0 -77 -47 -155t-122.5 -127.5t-150.5 -49.5q-46 0 -88 16t-42 37v6z M388 306q0 86 -70 86q-69 0 -137 -115q-32 -54 -52 -119.5t-20 -111.5q0 -34 46 -34q66 0 123 59q46 48 78 114.5t32 120.5z" />
+<glyph unicode="&#x254;" horiz-adv-x="444" d="M105 323l-16 10q46 58 89.5 83t99.5 25q71 0 109 -39t38 -115q0 -67 -34 -129.5t-89 -107.5q-77 -61 -167 -61q-46 0 -75.5 23t-29.5 58q0 20 14 34t34 14t29.5 -11.5t9.5 -28.5q0 -9 -7.5 -23.5t-7.5 -24.5q0 -20 37 -20q63 0 109 48q91 96 91 233q0 54 -23 84t-66 30 q-39 0 -71 -19t-74 -63z" />
+<glyph unicode="&#x255;" horiz-adv-x="444" d="M-3 -160l119 158q-86 31 -86 145q0 67 34 129.5t89 107.5q77 61 167 61q46 0 75.5 -23t29.5 -58q0 -20 -14 -34t-34 -14t-29.5 11.5t-9.5 28.5q0 9 7.5 23.5t7.5 24.5q0 20 -37 20q-63 0 -109 -48q-91 -96 -91 -233q0 -69 34 -95q35 40 52 57.5t43 32.5t54 15 q34 0 59 -18.5t25 -45.5q0 -49 -36 -75t-103 -26h-22q-42 0 -71 7l-118 -151h-36zM350 80q0 15 -16 25.5t-37 10.5q-12 0 -22.5 -3.5t-18 -7t-19 -14t-17 -16l-20.5 -21.5l-22 -25q34 -12 78 -12q53 0 73.5 19t20.5 44z" />
+<glyph unicode="&#x256;" d="M521 683l6 -6l-39 -152l-166 -606q-10 -39 -10 -64q2 -54 44 -54q17 0 42 30t46 30q18 0 29.5 -11.5t11.5 -26.5q0 -30 -30 -43t-64 -13q-67 0 -103 32.5t-36 91.5q0 39 13 91l35 139q-43 -73 -84.5 -102.5t-93.5 -29.5q-50 0 -78.5 30.5t-28.5 86.5q0 119 96.5 227 t195.5 108q31 0 45.5 -14t19.5 -44h1l45 163q14 49 14 71q0 16 -11 20t-53 6v17q77 7 153 23zM356 361q0 26 -14.5 41.5t-32.5 15.5q-47 0 -91 -46q-50 -53 -83 -126.5t-33 -135.5q0 -34 15.5 -53.5t42.5 -19.5q45 0 91 49t75.5 125t29.5 150z" />
+<glyph unicode="&#x257;" d="M372 383l29 101q25 87 92.5 143t164.5 56q35 0 62.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-41 30q-37 0 -78 -36.5t-55 -90.5q-124 -455 -124 -462q0 -20 18 -20q13 0 27.5 12.5t54.5 58.5l12 -10q-77 -114 -147 -114q-19 0 -30 12t-11 33q0 30 13 89 q-43 -73 -84.5 -102.5t-93.5 -29.5q-50 0 -78.5 30.5t-28.5 86.5q0 119 96.5 227t195.5 108q31 0 45.5 -14t19.5 -44zM356 361q0 26 -14.5 41.5t-32.5 15.5q-47 0 -91 -46q-50 -53 -83 -126.5t-33 -135.5q0 -34 15.5 -53.5t42.5 -19.5q45 0 91 49t75.5 125t29.5 150z" />
+<glyph unicode="&#x258;" horiz-adv-x="444" d="M31 97l18 12q32 -44 54 -59.5t55 -15.5q58 0 105 46t54 107q-98 13 -150 49.5t-52 86.5q0 51 37 84.5t91 33.5q79 0 126 -53t47 -133q0 -101 -69.5 -183.5t-165.5 -82.5q-115 0 -150 108zM329 285q0 57 -21.5 95t-57.5 38q-31 0 -50 -25.5t-19 -59.5q0 -23 16 -51 q15 -27 42 -42.5t83 -31.5q7 64 7 77z" />
+<glyph unicode="&#x259;" horiz-adv-x="444" d="M85 321l-12 12q88 108 204 108q61 0 98 -37.5t37 -99.5q0 -117 -93.5 -216t-205.5 -99q-39 0 -60.5 18t-21.5 50q0 66 76.5 118t207.5 69q10 20 10 61t-25.5 66t-67.5 25q-33 0 -63 -15.5t-84 -59.5zM291 178l17 44q-112 -27 -161 -74q-50 -48 -50 -97q0 -39 35 -39 q42 0 87.5 48.5t71.5 117.5z" />
+<glyph unicode="&#x25a;" horiz-adv-x="639" d="M612 293l27 -12q-16 -29 -44 -50t-57 -21q-65 0 -65 58q0 14 10 56l16 61l-91 -47q4 -15 4 -34q0 -117 -93.5 -216t-205.5 -99q-39 0 -60.5 18t-21.5 50q0 36 14.5 67.5t40.5 55.5t49 40t53 32l117 64q-17 80 -73 80q-33 0 -63 -15.5t-84 -59.5l-12 12q88 108 204 108 q45 0 77.5 -21t47.5 -58l134 68l5 -4l-32 -119q-6 -24 -6 -26q0 -24 11 -32.5t32 -8.5q36 0 66 53zM306 289l-98 -57q-42 -24 -76.5 -69.5t-34.5 -110.5q0 -21 7.5 -30.5t27.5 -9.5q42 0 86.5 47.5t72.5 118.5q15 38 15 111z" />
+<glyph unicode="&#x25b;" horiz-adv-x="444" d="M209 249v2q-93 21 -93 83t58 101.5t138 39.5q59 0 105 -26q22 -12 36 -33.5t14 -40.5q0 -18 -13 -31t-35 -13q-35 0 -49 52q-10 36 -19 47.5t-29 11.5q-46 0 -82 -33.5t-36 -78.5q0 -33 23 -50t61 -17h6v-30h-11q-63 0 -110.5 -38.5t-47.5 -94.5q0 -36 22.5 -57t61.5 -21 q79 0 172 62l9 -12q-92 -86 -200 -86q-76 0 -123 34q-36 25 -36 73q0 40 24.5 76.5t64.5 55.5q33 16 89 24z" />
+<glyph unicode="&#x25c;" horiz-adv-x="480" d="M223 233v30q52 1 80 21q56 38 56 91q0 30 -20 48.5t-53 18.5q-18 0 -27 -13.5t-19 -48.5q-5 -19 -17.5 -34t-30.5 -15q-22 0 -35 13t-13 31q0 16 12 38t36 35q46 27 108 27q65 0 106 -26t41 -69q0 -98 -142 -129v-2q113 -14 113 -102q0 -36 -26.5 -71.5t-63.5 -55.5 q-63 -34 -139 -34q-109 0 -158 86l15 12q62 -62 140 -62q54 0 96 40t42 95q0 35 -23 55.5t-67 20.5h-11z" />
+<glyph unicode="&#x25d;" horiz-adv-x="666" d="M639 293l27 -12q-18 -30 -45.5 -50.5t-55.5 -20.5q-65 0 -65 59q0 13 11 59l15 57l-85 -44q-23 -66 -136 -90v-2q52 -6 82.5 -32t30.5 -70q0 -36 -26.5 -71.5t-63.5 -55.5q-63 -34 -139 -34q-109 0 -158 86l15 12q62 -62 140 -62q54 0 96 40t42 95q0 35 -23 55.5 t-67 20.5h-11v30q52 1 80 21q56 38 56 91q0 30 -20 48.5t-52 18.5q-19 0 -28 -13t-18 -45q-14 -53 -51 -53q-19 0 -32.5 12.5t-13.5 29.5q0 20 13 41.5t37 34.5q46 26 107 26q64 0 105 -26.5t41 -68.5v-9l116 59l5 -4l-36 -133q-2 -8 -2 -13q0 -24 10.5 -32t32.5 -8 q34 0 66 53z" />
+<glyph unicode="&#x25e;" horiz-adv-x="490" d="M316 251v-2q113 -14 113 -103q0 -35 -25 -68.5t-56 -52.5q-65 -39 -145 -39q-87 0 -130 42t-43 117q0 84 34 159t100 123t149 48q57 0 101 -24t44 -73q0 -96 -142 -127zM234 233v30q39 0 63 11q30 14 51.5 41.5t21.5 58.5q0 30 -20 49t-51 19q-59 0 -107 -51t-70.5 -114 t-22.5 -116q0 -58 23 -98.5t70 -40.5q54 0 92 32q51 42 51 101q0 57 -51 73q-18 5 -50 5z" />
+<glyph unicode="&#x25f;" horiz-adv-x="357" d="M340 441v-16q-47 -2 -64 -17t-29 -60l-28 -112h65l-7 -31h-66l-45 -177q-31 -121 -76.5 -178t-110.5 -57q-35 0 -57 17t-22 44q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -12 18 -12q30 0 50.5 39t46.5 143l51 208h-138l7 31h139l30 123q4 18 4 26 q0 23 -15.5 31.5t-51.5 8.5v16h231z" />
+<glyph unicode="&#x260;" horiz-adv-x="714" d="M484 434l8 31q56 218 216 218q37 0 64 -15.5t27 -41.5q0 -16 -12.5 -26.5t-27.5 -10.5q-22 0 -47 30t-41 30q-34 0 -50.5 -32t-34.5 -107l-134 -537q-23 -90 -101.5 -137.5t-171.5 -47.5q-51 0 -111 19.5t-60 59.5q0 16 10.5 26.5t26.5 10.5t31 -14t27 -30t37 -30t57 -14 q62 0 108 41t62 103l23 93q-81 -67 -158 -67q-70 0 -109 51t-39 124q0 115 94.5 214.5t208.5 99.5q56 0 97 -41zM399 88l56 225q4 15 4 33q0 41 -24 69t-66 28q-54 0 -100 -42.5t-69.5 -99t-23.5 -106.5q0 -64 30 -107.5t86 -43.5q53 0 107 44z" />
+<glyph unicode="&#x261;" horiz-adv-x="595" d="M579 482l-127 -509q-23 -89 -101.5 -137t-171.5 -48q-51 0 -111 19.5t-60 59.5q0 15 10.5 26t26.5 11t31 -14t27 -30t37 -30t57 -14q62 0 108 41t62 103l23 93q-81 -67 -158 -67q-70 0 -109 51t-39 124q0 115 94.5 214.5t208.5 99.5q59 0 107 -51l14 10q6 5 12 11.5 t8.5 9.5t10.5 13.5t11 13.5h29zM399 88l56 225q4 15 4 33q0 41 -24 69t-66 28q-80 0 -136.5 -84.5t-56.5 -164.5q0 -62 29 -106t87 -44q53 0 107 44z" />
+<glyph unicode="&#x262;" horiz-adv-x="562" d="M562 231v-11q-31 -2 -44.5 -12.5t-20.5 -41.5l-32 -130q-3 -13 -82.5 -30t-112.5 -17q-98 0 -158 41t-60 125q0 70 35 130.5t96 100.5q85 55 189 55q34 0 92 -13q5 -1 14 -3t15 -3.5t8 -1.5q25 0 37 21h16l-29 -139h-16q-14 53 -34 76q-33 37 -99 37q-79 0 -132 -41 q-46 -34 -77 -97t-31 -126t39.5 -99.5t110.5 -36.5q35 0 71 10t40 28l26 104q5 23 5 35q0 16 -12 21.5t-43 6.5v11h189z" />
+<glyph unicode="&#x263;" horiz-adv-x="444" d="M243 186l21 -110q67 110 94.5 167.5t27.5 89.5q0 16 -26 32q-26 17 -26 39q0 16 11.5 26.5t28.5 10.5q22 0 37 -16t15 -39q0 -50 -44 -144q-40 -86 -109 -197l13 -73q8 -43 8 -78q0 -61 -31 -94.5t-86 -33.5q-35 0 -52.5 16.5t-17.5 44.5q0 6 1.5 13t6.5 17t10 18l15 23 q10 16 18 26l23 34l27 38q-5 52 -35.5 174t-49.5 170q-14 37 -30.5 50.5t-46.5 13.5q-16 0 -31 -4v17q15 3 34.5 7.5t39.5 8t49 6.5q8 2 20 2q11 0 41.5 -93t43.5 -162zM225 -84l-9 45q-75 -98 -75 -125q0 -37 30 -37q26 0 42 19.5t16 49.5q0 27 -4 48z" />
+<glyph unicode="&#x264;" horiz-adv-x="480" d="M232 263l63 70l25 31l32 36q14 15 28 28q24 22 43 22q24 0 38 -17.5t14 -41.5q0 -29 -11 -69q-6 23 -24.5 39t-41.5 16q-8 0 -16.5 -3t-14 -6.5t-14.5 -11.5t-12 -11t-12 -14t-10 -12l-73 -82l12 -31q8 -23 11.5 -34.5t7.5 -30t4 -35.5q0 -47 -42.5 -81.5t-89.5 -34.5 q-78 0 -78 62q0 43 47 92l57 60l-59 136q-7 16 -22 25.5t-32 9.5q-43 0 -58 -53q0 43 28.5 85.5t69.5 42.5q19 0 32.5 -6t24 -20t16 -24.5t13.5 -30.5zM185 175l-46 -50q-33 -37 -33 -63q0 -16 12.5 -24.5t29.5 -8.5q24 0 43 20t19 44q0 10 -3 22t-5.5 19t-9 22.5t-7.5 18.5 z" />
+<glyph unicode="&#x265;" d="M478 441l-146 -554q-13 -50 -13 -62t13 -18.5t28 -6.5h27v-15q-76 -9 -157 -27l-7 6l121 447q-130 -211 -230 -211q-33 0 -49 18.5t-16 48.5q0 43 48 193q34 104 34 125q0 7 -5 12.5t-12 5.5q-12 0 -26.5 -14.5t-55.5 -65.5l-13 13q46 65 77 89.5t69 24.5q20 0 32 -11.5 t12 -30.5q0 -17 -20 -92l-55 -207q-7 -28 -7 -33q0 -25 28 -25q27 0 69.5 40t82.5 100q31 48 49 93.5t47 156.5h75z" />
+<glyph unicode="&#x266;" d="M19 0l124 470q25 93 92.5 153t168.5 60q35 0 62.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-41 30q-37 0 -78.5 -36.5t-55.5 -90.5l-79 -292q130 211 230 211q33 0 49 -18.5t16 -48.5q0 -43 -48 -193q-34 -104 -34 -125q0 -7 5 -12.5t12 -5.5 q12 0 26.5 14.5t55.5 65.5l13 -13q-46 -65 -77 -89.5t-69 -24.5q-20 0 -32 11.5t-12 30.5q0 17 20 92l55 207q7 28 7 33q0 25 -28 25q-27 0 -69.5 -40t-82.5 -100q-31 -48 -49 -93.5t-47 -156.5h-75z" />
+<glyph unicode="&#x267;" d="M19 0l124 470q25 93 92.5 153t168.5 60q35 0 62.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-41 30q-37 0 -78.5 -36.5t-55.5 -90.5l-79 -292q130 211 230 211q33 0 49 -18.5t16 -48.5q0 -15 -9 -48l-94 -346q-25 -93 -92.5 -153t-168.5 -60q-35 0 -62.5 15 t-27.5 41q0 16 12.5 27t27.5 11q22 0 47 -30t41 -30q37 0 78.5 36.5t55.5 90.5l107 404q7 28 7 33q0 25 -28 25q-27 0 -69.5 -40t-82.5 -100q-31 -48 -49 -93.5t-47 -156.5h-75z" />
+<glyph unicode="&#x268;" horiz-adv-x="278" d="M264 599q0 -21 -14.5 -36t-34.5 -15q-22 0 -35 14.5t-13 38.5q0 23 13.5 38t33.5 15t35 -16.5t15 -38.5zM253 261l-8 -31h-74l-37 -135q-10 -34 -10 -44q0 -15 14 -15q25 0 84 78l13 -11q-42 -65 -71 -89.5t-66 -24.5q-49 0 -49 55q0 29 22 111l20 75h-75l9 31h75l19 71 q9 32 9 44q0 15 -11.5 19t-52.5 5v16q46 4 160 25l4 -3l-49 -177h74z" />
+<glyph unicode="&#x269;" horiz-adv-x="333" d="M253 80l13 -12q-78 -78 -143 -78q-72 0 -72 65q0 23 12 69l56 209q8 26 8 37q0 15 -8 19.5t-24 4.5q-17 0 -31 -4v19l117 36q31 9 42 9q5 0 5 -11q0 -5 -6 -26l-84 -308q-4 -16 -4 -25q0 -40 44 -40q32 0 75 36z" />
+<glyph unicode="&#x26a;" horiz-adv-x="247" d="M298 441v-17q-44 -2 -57.5 -16t-24.5 -56l-65 -259q-6 -24 -6 -40q0 -18 11.5 -26.5t40.5 -9.5v-17h-205v17q44 1 58 15.5t24 55.5l66 269q8 32 8 38q0 14 -12 20.5t-42 8.5v17h204z" />
+<glyph unicode="&#x26b;" horiz-adv-x="278" d="M303 423h28q-22 -104 -95 -104q-15 0 -48 11l-62 -237q-8 -29 -8 -43q0 -18 17 -18q27 0 67 57l25 35l14 -10q-45 -71 -77.5 -98t-73.5 -27q-49 0 -49 56q0 17 4 30l73 281q-22 6 -34 6q-37 0 -51 -46h-29q15 58 38 82t62 24q9 0 31 -4l47 181q3 10 3 19q0 22 -49 22h-18 v16q70 8 155 27l6 -5l-75 -287q28 -12 48 -12t31.5 9.5t19.5 34.5z" />
+<glyph unicode="&#x26c;" horiz-adv-x="375" d="M358 360l8 -13q-58 -58 -153 -90l-9 -3l-42 -161q-8 -29 -8 -43q0 -18 17 -18q27 0 67 57l25 35l14 -10q-45 -71 -77.5 -98t-73.5 -27q-49 0 -49 56q0 17 4 30l43 164q-16 -2 -29 -2q-37 0 -60 22.5t-23 57.5q0 52 43 92.5t93 40.5q10 0 30 -5l40 154q3 10 3 19 q0 22 -49 22h-18v16q70 8 155 27l6 -5l-102 -390l8 2q33 8 74 30t63 40zM133 275l37 142q-8 3 -16 3q-30 0 -59 -28.5t-29 -58.5q0 -24 14 -41.5t36 -17.5q13 0 17 1z" />
+<glyph unicode="&#x26d;" horiz-adv-x="252" d="M279 678l-193 -738q-15 -60 -15 -89q0 -50 39 -50q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -25 -26 -40.5t-63 -15.5q-84 0 -113 33t-29 96q0 36 11 80l163 623q3 10 3 19q0 22 -49 22h-18v16q70 8 155 27z" />
+<glyph unicode="&#x26e;" horiz-adv-x="575" d="M537 400l-206 -204q11 3 24 3q54 0 88.5 -35t34.5 -98q0 -133 -87 -216t-203 -83q-57 0 -104 31q-20 13 -31.5 33t-11.5 37q0 18 13 31t36 13q36 0 49 -58q9 -38 22.5 -48t51.5 -10q60 0 121 64t61 169q0 30 -11 52.5t-29 33t-35.5 15.5t-36.5 5q-13 0 -37 -27l-88 -90 q-29 -29 -65 -29q-23 0 -34.5 16t-11.5 37q0 19 7 46l121 462q16 61 16 66q0 24 -55 24h-12v16q72 9 155 27l6 -6l-60 -227h312v-50zM486 386h-202q-47 0 -66.5 -20t-31.5 -66l-49 -187q-13 -52 -13 -57q0 -16 14 -16q8 0 21 13z" />
+<glyph unicode="&#x26f;" horiz-adv-x="722" d="M704 432l-88 -318q-10 -38 -10 -54q0 -22 41 -22h25v-16l-162 -31l-3 2l58 209q-130 -211 -220 -211q-29 0 -44.5 16t-15.5 44q0 38 40 152q-53 -84 -88.5 -126.5t-71.5 -65.5q-32 -20 -63 -20q-27 0 -42.5 17.5t-15.5 45.5q0 13 3 28l68 251q10 37 10 45q0 16 -12 16 q-22 0 -65 -53l-21 -26l-15 12l5 7q77 107 144 107q42 0 42 -46q0 -15 -13 -66l-60 -227q-8 -32 -8 -38q0 -9 6.5 -15t14.5 -6q47 0 131 117q37 52 58 104.5t50 167.5h75l-86 -318q-8 -30 -8 -46q0 -25 21 -25q25 0 66 39.5t83 103.5q25 39 42.5 83t53.5 163h75z" />
+<glyph unicode="&#x270;" horiz-adv-x="722" d="M704 432l-176 -665h-84l121 435q-130 -211 -220 -211q-29 0 -44.5 16t-15.5 44q0 38 40 152q-53 -84 -88.5 -126.5t-71.5 -65.5q-32 -20 -63 -20q-27 0 -42.5 17.5t-15.5 45.5q0 13 3 28l68 251q10 38 10 45q0 16 -12 16q-22 0 -65 -53l-21 -26l-15 12l5 7 q77 107 144 107q42 0 42 -46q0 -15 -13 -66l-61 -227q-7 -28 -7 -38q0 -9 6.5 -15t14.5 -6q47 0 131 117q37 52 58 104.5t50 167.5h75l-27 -93q-67 -231 -67 -271q0 -25 21 -25q25 0 66 39.5t83 103.5q25 39 42.5 83t53.5 163h75z" />
+<glyph unicode="&#x271;" horiz-adv-x="690" d="M209 439l-58 -209q130 211 220 211q29 0 44.5 -16t15.5 -44q0 -38 -40 -152q53 84 88.5 126.5t71.5 65.5q32 20 63 20q27 0 42.5 -17.5t15.5 -45.5q0 -13 -3 -28l-114 -423q-20 -73 -78 -116.5t-139 -43.5q-37 0 -64.5 15t-27.5 41q0 16 12.5 27t27.5 11q22 0 47 -30 t44 -30q35 0 61.5 35t42.5 95l106 399q7 28 7 38q0 9 -6 15t-14 6q-22 0 -58 -32t-74 -85q-37 -52 -58 -104.5t-50 -167.5h-75l27 93q67 231 67 271q0 25 -21 25q-25 0 -66 -39.5t-83 -103.5q-25 -39 -42.5 -83t-53.5 -163h-75l90 325q8 30 8 47q0 22 -41 22h-25v16l162 31z " />
+<glyph unicode="&#x272;" horiz-adv-x="606" d="M566 117l14 -13q-51 -70 -78 -91.5t-62 -21.5q-21 0 -35.5 13.5t-14.5 40.5q0 18 16 75l47 162q17 60 17 79q0 13 -7.5 20.5t-19.5 7.5q-30 0 -67 -38t-88 -113q-45 -66 -86 -215l-24 -88q-45 -168 -197 -168q-37 0 -64 15.5t-27 40.5q0 16 12.5 27t27.5 11q22 0 47 -30 t41 -30q12 0 21.5 3.5t17.5 14.5t13 19t12 29t10 31t11 39l113 413q2 10 2 17q0 15 -13.5 20.5t-51.5 6.5v16q39 8 87 16.5t75 14.5l4 -2l-67 -218q74 118 128 169t103 51q31 0 48 -16.5t17 -44.5q0 -25 -10 -60l-56 -203q-14 -50 -14 -61q0 -18 16 -18q19 0 61 53 q7 8 21 26z" />
+<glyph unicode="&#x273;" horiz-adv-x="498" d="M432 320l-105 -379q-13 -49 -13 -80q0 -60 44 -60q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41t-64.5 -15q-69 0 -105 37t-36 97q0 59 10 92l83 289q17 60 17 77q0 30 -25 30q-30 0 -65.5 -34t-84.5 -107q-33 -49 -48.5 -88t-51.5 -160h-75l96 350 q2 10 2 17q0 15 -13.5 20.5t-51.5 6.5v16q39 8 87 16.5t75 14.5l4 -2l-67 -218q74 118 128 169t103 51q31 0 48 -16.5t17 -44.5q0 -25 -10 -60z" />
+<glyph unicode="&#x274;" horiz-adv-x="539" d="M599 441v-17q-37 -4 -53 -12q-27 -20 -41 -79l-84 -341h-14l-234 362l-63 -251q-8 -34 -8 -48q0 -20 12 -27.5t43 -10.5v-17h-177v17q50 4 67 19t30 67l71 285q-16 22 -27 29t-39 7v17h134l204 -319l54 218q7 27 7 45q0 11 -5 21q-8 14 -54 18v17h177z" />
+<glyph unicode="&#x275;" d="M468 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM138 240h235q11 46 11 86q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-31 -47 -47 -89zM365 207h-238 q-16 -51 -16 -106q0 -44 21 -67.5t57 -23.5q61 0 121 83q35 48 55 114z" />
+<glyph unicode="&#x276;" horiz-adv-x="718" d="M738 437l-24 -94h-18q1 6 1 18q0 32 -21.5 41.5t-87.5 9.5h-41q-53 0 -59 -23l-36 -148h76q61 0 84.5 12.5t39.5 52.5h16l-39 -155h-16v18q0 27 -14.5 37t-52.5 10h-101l-39 -157q-2 -5 -2 -14q0 -22 38 -22h89q39 0 71.5 19t70.5 66h18l-60 -110h-265q-25 0 -75.5 -2 t-67.5 -2q-81 0 -127.5 40.5t-46.5 114.5q0 80 43 149.5t111 106.5q67 36 154 36q11 0 47 -2q28 -2 89 -2h245zM336 86l64 260q4 15 4 28q0 42 -58 42q-87 0 -150.5 -83t-63.5 -194q0 -120 111 -120q76 0 93 67z" />
+<glyph unicode="&#x277;" horiz-adv-x="668" d="M638 262q0 -101 -70 -183.5t-169 -82.5q-40 0 -64 22.5t-30 61.5q-57 -84 -136 -84q-66 0 -102.5 40t-36.5 103q0 94 60 173.5t145.5 121t168.5 41.5q99 0 166.5 -58.5t67.5 -154.5zM549 299q0 77 -41 116.5t-109 39.5q-103 0 -188 -95.5t-85 -233.5q0 -88 61 -88 q32 0 60 22t35 54q5 26 5 83q0 21 1 35t5 33.5t11 31.5t21.5 20.5t34.5 8.5q23 0 37 -13t14 -31q0 -35 -31.5 -94.5t-35.5 -73.5q-2 -7 -2 -19q0 -25 16.5 -41t42.5 -16q38 0 68 30t46.5 73.5t25 85t8.5 72.5z" />
+<glyph unicode="&#x278;" horiz-adv-x="660" d="M472 599l-43 -164q87 -8 144 -49t57 -114q0 -75 -48.5 -138t-120.5 -97.5t-149 -39.5l-39 -146q-6 -21 -6 -34q0 -19 14 -26t49 -9v-15h-236v15q46 3 65.5 17t30.5 55l38 143q-87 5 -142.5 51.5t-55.5 119.5q0 78 50 139.5t120 92t145 35.5l43 161q5 22 5 33 q0 20 -14 28.5t-48 10.5v15h236v-15q-47 -2 -65.5 -14.5t-29.5 -54.5zM421 407l-102 -382q93 14 151 91.5t60 171.5q2 52 -25.5 83.5t-83.5 35.5zM235 25l102 382q-86 -4 -146.5 -79t-60.5 -168q0 -54 26.5 -90.5t78.5 -44.5z" />
+<glyph unicode="&#x279;" horiz-adv-x="402" d="M322 441l-81 -292q-16 -59 -16 -82q0 -26 38 -26q9 0 31 3v-17l-155 -27l-3 2l55 216l-16 -35q-34 -75 -94 -138q-43 -45 -79 -45q-21 0 -34 14t-13 37t12.5 38.5t34.5 15.5q19 0 35 -26q8 -14 16 -14q27 0 82 94q34 58 54.5 109.5t56.5 172.5h76z" />
+<glyph unicode="&#x27a;" horiz-adv-x="383" d="M384 678l-159 -608q-2 -10 -2 -18q0 -26 35 -33q9 -2 36 -4v-15h-158l55 218l-16 -35q-34 -75 -94 -138q-43 -45 -79 -45q-21 0 -34 14t-13 37t12.5 38.5t34.5 15.5q19 0 35 -26q8 -14 16 -14q27 0 82 94q43 73 65 137q35 103 47 149l30 116q13 48 13 54q0 25 -49 25h-18 v16q68 8 155 27z" />
+<glyph unicode="&#x27b;" horiz-adv-x="353" d="M322 441l-123 -443q-30 -106 -30 -140q0 -28 12 -42.5t32 -14.5q17 0 42 30t46 30q17 0 29 -11t12 -28q0 -27 -28 -41t-66 -14q-63 0 -101 31t-38 92q0 28 34 155l48 173l-16 -35q-34 -75 -94 -138q-43 -45 -79 -45q-21 0 -34 14t-13 37t12.5 38.5t34.5 15.5q19 0 35 -26 q8 -14 16 -14q27 0 82 94q34 58 54.5 109.5t56.5 172.5h76z" />
+<glyph unicode="&#x27c;" horiz-adv-x="333" d="M176 223l16 35q34 75 94 138q43 45 79 45q21 0 34 -14t13 -37t-12.5 -38.5t-34.5 -15.5q-19 0 -35 26q-8 14 -17 14q-24 0 -69 -73.5t-63 -120.5q-27 -71 -47 -138l-81 -277h-73l146 525q16 59 16 82q0 26 -38 26q-8 0 -31 -3v17l155 27l3 -2z" />
+<glyph unicode="&#x27d;" horiz-adv-x="390" d="M176 223l16 35q34 75 94 138q43 45 79 45q21 0 34 -14t13 -37t-12.5 -38.5t-34.5 -15.5q-19 0 -35 26q-8 14 -16 14q-26 0 -82 -94q-37 -62 -66 -140q-82 -221 -82 -284q0 -28 12 -42.5t32 -14.5q17 0 42 30t46 30q17 0 29 -11t12 -28q0 -27 -28 -41t-66 -14 q-63 0 -101 31t-38 92q0 36 21 110l81 292q16 59 16 82q0 26 -38 26q-8 0 -31 -3v17l155 27l3 -2z" />
+<glyph unicode="&#x27e;" horiz-adv-x="401" d="M45 0l69 249q30 106 78.5 163.5t138.5 57.5q38 0 65.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-41 30q-34 0 -54 -33.5t-40 -105.5l-81 -297h-76z" />
+<glyph unicode="&#x27f;" horiz-adv-x="338" d="M134 0l83 297q13 45 13 94q0 45 -35 45q-17 0 -42 -30t-47 -30q-15 0 -27.5 11t-12.5 27q0 26 27.5 41t65.5 15q68 0 101 -35t33 -97q0 -41 -14 -91l-69 -247h-76z" />
+<glyph unicode="&#x280;" horiz-adv-x="475" d="M132 464h227q66 0 104 -26t38 -70q0 -101 -154 -146l72 -170q14 -34 45 -34h10v-18h-124l-92 209h-37l-26 -106q-7 -30 -7 -43q0 -22 12.5 -31.5t40.5 -10.5v-18h-216v18q42 4 59 20t28 60l65 257q8 29 8 46q0 40 -53 45v18zM229 242h17q63 0 112.5 34t49.5 91 q0 30 -21.5 47.5t-61.5 17.5q-21 0 -50 -7z" />
+<glyph unicode="&#x281;" horiz-adv-x="475" d="M581 446h-10q-31 0 -62 -34l-157 -170q94 -29 94 -95q0 -64 -60 -105.5t-143 -41.5h-218v18q38 4 59 24q19 17 31 67l64 257q7 27 7 40q0 38 -54 40v18h216v-18q-39 -2 -58.5 -20t-30.5 -65l-26 -106h37l196 209h115v-18zM224 222l-45 -183q25 -7 46 -7q53 0 90.5 31.5 t37.5 80.5q0 41 -32 59.5t-80 18.5h-17z" />
+<glyph unicode="&#x282;" horiz-adv-x="389" d="M376 442l-20 -140h-16q-14 116 -89 116q-27 0 -43 -15t-16 -42q0 -38 54 -102q68 -79 68 -136q0 -61 -40.5 -97.5t-103.5 -36.5q-29 0 -55 10q-21 9 -44 9q-3 0 -11 -2l-19 -138q-1 -8 -1 -20q0 -32 26 -32q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41 t-65.5 -15q-93 0 -93 65q0 10 2 20l35 279h16q20 -136 100 -136q36 0 56 20t20 57q0 45 -56 115q-63 79 -63 131q0 50 33 79t88 29q20 0 56 -10q22 -7 36 -7q20 0 30 18h14z" />
+<glyph unicode="&#x283;" horiz-adv-x="415" d="M112 -72l140 537q24 94 85.5 156t150.5 62q37 0 63 -15.5t26 -40.5q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-41 30q-62 0 -98 -140l-136 -524q-24 -94 -85 -156t-150 -62q-36 0 -63 15.5t-27 39.5q0 17 12.5 28t27.5 11q22 0 47 -30t41 -30q60 0 94 127z" />
+<glyph unicode="&#x284;" horiz-adv-x="453" d="M137 31l116 465q20 80 89.5 133.5t162.5 53.5q35 0 62.5 -15t27.5 -41q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-41 30q-40 0 -75.5 -26.5t-51.5 -89.5l-127 -502h80l-5 -31h-84q-31 -110 -89.5 -171.5t-133.5 -61.5q-35 0 -63 15t-28 40q0 17 12 28t27 11q23 0 48 -30 t41 -30q27 0 58 54t54 145h-80l7 31h80z" />
+<glyph unicode="&#x285;" horiz-adv-x="339" d="M297 252l-78 -312q-23 -92 -23 -108q0 -31 30 -31q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41t-65.5 -15q-129 0 -129 129q0 39 13 89l78 312q18 72 18 99q0 40 -34 40q-17 0 -42 -30t-47 -30q-15 0 -27.5 11t-12.5 27q0 26 27.5 41t65.5 15 q133 0 133 -134q0 -54 -8 -84z" />
+<glyph unicode="&#x286;" horiz-adv-x="439" d="M159 14l116 442q30 117 101 177q59 50 137 50q32 0 60.5 -14t28.5 -43q0 -15 -12 -26t-27 -11q-23 0 -48 30t-41 30q-22 0 -39 -15t-30.5 -45.5t-20 -51.5t-16.5 -59l-131 -505q44 -44 44 -117q0 -59 -23 -99h-26q20 56 20 93q0 54 -26 90q-39 -90 -81.5 -131t-115.5 -41 q-38 0 -64.5 25.5t-26.5 61.5q0 68 57 115.5t121 47.5q26 0 43 -4zM153 -13q-23 6 -47 6q-48 0 -95.5 -41t-47.5 -93q0 -28 21 -47t53 -19q27 0 48.5 18.5t30.5 46.5q13 37 37 129z" />
+<glyph unicode="&#x287;" horiz-adv-x="330" d="M120 332l-13 7q46 70 75.5 95.5t67.5 25.5q46 0 46 -37q0 -10 -16 -74l-78 -296h75l1 -6q0 -18 -33 -25q-25 -6 -66 -38.5t-67 -71.5q-6 -9 -14 -9q-9 0 -9 8q0 5 1 7l28 103h-80l5 32h84l87 328q2 8 2 14q0 16 -15 16q-12 0 -28 -15.5t-53 -63.5z" />
+<glyph unicode="&#x288;" horiz-adv-x="278" d="M308 428l-5 -32h-84l-138 -520q-7 -26 -7 -42q0 -33 22 -33q18 0 43 30t47 30q16 0 28 -11t12 -28q0 -26 -28 -40.5t-69 -14.5q-56 0 -89.5 24.5t-33.5 58.5q0 21 12 67l126 479h-75l-1 6q0 18 33 25q25 6 66 38.5t67 71.5q6 9 14 9q9 0 9 -8q0 -5 -1 -7l-28 -103h80z " />
+<glyph unicode="&#x289;" d="M479 261l-5 -31h-63l-25 -97q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 45 43 191q-88 -142 -136.5 -191.5t-100.5 -49.5q-53 0 -53 53q0 18 27 128l15 60h-75l7 31h76l12 48q14 58 14 67q0 12 -11 18t-50 6v14 q69 8 150 27l4 -3l-45 -177h157q21 42 68 171h74l-46 -171h60zM307 230h-148l-36 -147q-3 -9 -3 -16q0 -25 19 -25q45 0 142 147z" />
+<glyph unicode="&#x28a;" horiz-adv-x="537" d="M552 430h-38q-21 0 -36.5 -16t-15.5 -35q0 -7 19.5 -44t19.5 -81q0 -103 -90 -183.5t-190 -80.5q-77 0 -124.5 48t-47.5 120q0 26 6 51q20 81 105 154q18 16 18 37q0 13 -9.5 21.5t-22.5 8.5h-38v20h145q-84 -139 -111 -246q-13 -52 -13 -90q0 -45 25.5 -74.5t70.5 -29.5 q70 0 115.5 58t65.5 137q17 70 17 143q0 46 -6 102h135v-20z" />
+<glyph unicode="&#x28b;" d="M211 438l-75 -311q-6 -24 -6 -32q0 -28 22 -46t54 -18q61 0 115.5 46.5t83.5 110t29 120.5q0 16 -5 29q-2 5 -25.5 26.5t-23.5 43.5q0 16 11 25t25 9q22 0 37 -13.5t20 -36.5q2 -9 2 -30q0 -63 -20.5 -127.5t-57.5 -119.5t-94.5 -89.5t-123.5 -34.5q-127 0 -127 90 q0 22 7 50l53 212q6 24 6 34q0 12 -11 18t-50 6v14q69 8 150 27z" />
+<glyph unicode="&#x28c;" horiz-adv-x="444" d="M426 20v-13q-55 -9 -112 -21q-11 -4 -20 -4q-6 0 -9.5 13t-20.5 101q-18 91 -25 257l-31 -32q-54 -55 -95.5 -125.5t-41.5 -105.5q0 -12 18 -29q25 -22 25 -45q0 -15 -11 -24.5t-27 -9.5q-24 0 -40 18.5t-16 40.5q0 58 63 155q55 85 119 153l22 23q13 14 19 21l15 17 l14 14l11 9t10 6.5t8 1.5q9 0 9 -27v-24q0 -138 24 -278q10 -57 21.5 -75t39.5 -18q20 0 31 1z" />
+<glyph unicode="&#x28d;" horiz-adv-x="667" d="M648 19v-13q-79 -13 -95 -17q-5 -1 -11.5 -3t-10.5 -3t-7 -1q-8 0 -11 5t-8 29q-25 120 -32 281l-192 -305q-6 -10 -13 -10q-8 0 -8 14l-32 353q-99 -123 -132 -175.5t-33 -84.5q0 -14 22 -35q21 -20 21 -41q0 -12 -11.5 -21.5t-27.5 -9.5q-22 0 -37 16t-15 40 q0 91 212 349l9 11q35 43 45 43q8 0 11 -35l29 -310l89 152q23 38 55 99q49 94 64 94q7 0 9 -9t4 -38l4 -91q8 -164 27 -242q7 -27 15.5 -34.5t31.5 -7.5h28z" />
+<glyph unicode="&#x28e;" horiz-adv-x="444" d="M193 255l-21 110q-67 -110 -94.5 -167.5t-27.5 -89.5q0 -16 26 -32q26 -17 26 -39q0 -16 -11.5 -26.5t-28.5 -10.5q-22 0 -37 16t-15 39q0 87 131 305q78 129 151.5 208t116.5 79q23 0 37 -12t14 -31q0 -17 -11.5 -28.5t-27.5 -11.5q-19 0 -34 14t-27 14q-18 0 -48 -33 q-13 -13 -38.5 -46.5t-32.5 -44.5q-10 -20 -10 -35q0 -30 31 -155.5t51 -176.5q14 -37 30.5 -50.5t46.5 -13.5q16 0 31 4v-17q-22 -4 -32 -6q-41 -8 -107 -18h-4q-11 0 -41.5 93t-43.5 162z" />
+<glyph unicode="&#x28f;" horiz-adv-x="633" d="M603 464v-18q-36 -3 -56 -16t-71 -63l-158 -155l-27 -106q-7 -28 -7 -45q0 -43 53 -43v-18h-216v18q23 0 39.5 7t26 20t13.5 24t8 27l27 110l-70 133q-36 69 -54 87t-49 20v18h210v-18q-34 -1 -44 -6t-10 -16q0 -7 11 -29l78 -151l153 151q22 22 22 40q0 10 -37 11v18 h158z" />
+<glyph unicode="&#x290;" horiz-adv-x="405" d="M348 96l-62 -206q-9 -29 -9 -44q0 -16 4.5 -23t18.5 -7q17 0 42 30t47 30q15 0 27.5 -11t12.5 -27q0 -26 -27.5 -41t-65.5 -15q-45 0 -65.5 18.5t-20.5 46.5q0 15 16 69l25 84h-274v18l291 350h-136q-40 0 -58 -11.5t-33 -48.5l-16 4l32 116h283v-11l-300 -357h209 q25 0 43 40z" />
+<glyph unicode="&#x291;" horiz-adv-x="393" d="M380 417l-300 -357h116q50 84 105 84q31 0 50 -16t19 -44q0 -84 -119 -84h-66q-18 -32 -25 -47h-24q1 1 10.5 20t14.5 27h-144v18l291 350h-136q-40 0 -58 -11.5t-33 -48.5l-16 4l32 116h283v-11zM221 60h74q22 0 34.5 8t12.5 19q0 15 -13 25.5t-28 10.5q-36 0 -80 -63z " />
+<glyph unicode="&#x292;" horiz-adv-x="413" d="M517 400l-215 -204q16 3 33 3q54 0 88.5 -35t34.5 -98q0 -133 -87 -216t-203 -83q-57 0 -104 31q-20 13 -31.5 33t-11.5 37q0 18 13 31t36 13q36 0 49 -58q9 -38 22.5 -48t51.5 -10q60 0 121 64t61 169q0 54 -32 80t-87 26q-11 0 -57 -19l-11 11l278 259h-199 q-35 0 -56 -12t-29 -26.5t-20 -47.5h-18l61 150h312v-50z" />
+<glyph unicode="&#x293;" horiz-adv-x="457" d="M544 450l-4 -15l-244 -268q2 0 6 0.5t8 0.5q52 0 95 -32.5t43 -100.5q0 -92 -59.5 -158t-139.5 -93l25 -89h-37l-24 78q-31 -6 -78 -6q-58 0 -93 20.5t-35 56.5q0 41 31 66.5t80 25.5q43 0 68 -27.5t51 -95.5q49 27 83 81t34 122q0 61 -33 90t-87 29q-11 0 -60 -19 l-11 11l264 293h-138q-50 0 -69 -19.5t-37 -68.5h-18l33 118h346zM205 -201q-25 62 -41.5 82.5t-39.5 20.5q-19 0 -33 -16t-14 -37q0 -25 26 -39t55 -14q35 0 47 3z" />
+<glyph unicode="&#x294;" d="M152 102l68 254q79 1 136.5 69.5t57.5 150.5q0 90 -59 90q-20 0 -39 -18t-24 -42q-16 -68 -55 -68q-18 0 -32 13t-14 29q0 17 11.5 39t37.5 37q48 27 110 27q85 0 122 -35.5t37 -89.5q0 -90 -68.5 -153.5t-142.5 -68.5l-62 -234q-9 -32 -9 -50q0 -22 14 -28.5t51 -8.5 v-15h-237v15q45 3 62 15q20 14 35 72z" />
+<glyph unicode="&#x295;" d="M155 102l62 234q-51 10 -85.5 40t-34.5 85q0 38 13.5 75.5t41 71t76.5 54.5t112 21q31 0 65.5 -10.5t53.5 -25.5q36 -29 36 -65q0 -18 -13 -31t-35 -13q-19 0 -32.5 16.5t-18.5 43.5q-4 23 -22 45.5t-44 22.5q-50 0 -94 -67.5t-44 -124.5q0 -49 33 -83.5t81 -34.5 l-67 -254q-8 -28 -8 -49q0 -19 13 -27.5t48 -10.5v-15h-237v15q49 2 67.5 17t32.5 70z" />
+<glyph unicode="&#x296;" horiz-adv-x="393" d="M413 662v-15q-49 -2 -67.5 -17t-32.5 -70l-60 -227q51 -10 85.5 -40t34.5 -85q0 -38 -13.5 -75.5t-41 -71t-76.5 -54.5t-112 -21q-31 0 -65.5 10.5t-53.5 25.5q-36 28 -36 65q0 18 13 31t35 13q19 0 32.5 -16.5t18.5 -43.5q4 -23 22 -45.5t44 -22.5q50 0 94 67.5 t44 124.5q0 49 -33 83.5t-81 34.5l65 247q8 34 8 49q0 19 -13 27.5t-48 10.5v15h237z" />
+<glyph unicode="&#x297;" horiz-adv-x="450" d="M28 -84l92 367q18 71 80 114.5t133 43.5q53 0 89.5 -33.5t36.5 -83.5q0 -22 -10.5 -41.5t-29.5 -19.5q-11 0 -20 8.5t-9 19.5q0 9 7 25t7 24q0 29 -19.5 47.5t-45.5 18.5q-38 0 -78.5 -28.5t-49.5 -66.5l-97 -387q-3 -14 -3 -28q0 -38 23.5 -63t61.5 -25q54 0 91.5 34.5 t50.5 86.5q2 8 4 24h25l-9 -38q-16 -65 -71 -109t-132 -44q-55 0 -93 35t-38 87q0 17 4 32z" />
+<glyph unicode="&#x298;" horiz-adv-x="723" d="M421 332q0 -27 -17.5 -45.5t-45.5 -18.5q-24 0 -43.5 18t-19.5 45q0 26 18.5 44.5t44.5 18.5t44.5 -18t18.5 -44zM704 432q0 -115 -57 -218.5t-156 -167t-213 -63.5q-115 0 -185.5 67.5t-70.5 181.5q0 118 60 221.5t159.5 164.5t211.5 61q119 0 185 -68t66 -179zM611 445 q0 94 -43.5 150t-127.5 56q-60 0 -119.5 -36.5t-104.5 -96t-73 -140t-28 -163.5q0 -92 42.5 -145.5t127.5 -53.5q80 0 156.5 64.5t123 164.5t46.5 200z" />
+<glyph unicode="&#x299;" horiz-adv-x="460" d="M126 464h208q171 0 171 -92q0 -56 -37.5 -87.5t-97.5 -39.5q109 -21 109 -93q0 -70 -64.5 -111t-159.5 -41h-236v18q44 0 64.5 16.5t29.5 54.5l70 281q4 15 4 29q0 21 -13.5 32t-47.5 15v18zM237 260h53q136 0 136 108q0 64 -112 64h-16q-18 0 -24 -22zM228 226l-40 -162 q-2 -8 -2 -12q0 -20 43 -20q68 0 114 30t46 94q0 23 -10.5 37.5t-32 21.5t-43.5 9t-54 2h-21z" />
+<glyph unicode="&#x29a;" horiz-adv-x="479" d="M198 249v2q-93 21 -93 83q0 39 24 69.5t63 48.5q52 23 105 23q84 0 128.5 -45.5t44.5 -121.5q0 -131 -85 -226.5t-207 -95.5q-57 0 -107.5 25t-50.5 80q0 45 25 80t66 55q35 17 87 23zM283 233h-13q-58 0 -107 -37.5t-49 -94.5q0 -37 23 -58t62 -21q57 0 106 52.5 t74 117.5t25 115q0 57 -22.5 96t-71.5 39q-45 0 -81 -33.5t-36 -79.5q0 -31 23 -48.5t60 -17.5h7v-30z" />
+<glyph unicode="&#x29b;" horiz-adv-x="570" d="M473 167l-32 -131q-3 -14 -84 -30.5t-108 -16.5q-102 0 -161 41t-59 125q0 122 98 204t219 82q17 0 36.5 -2.5t31.5 -4.5t35 -7t31 -7q13 42 43 68.5t70 26.5q22 0 39.5 -13t17.5 -35t-20 -22q-12 0 -19 7.5t-9.5 17t-9 17t-17.5 7.5q-34 0 -49 -67l-26 -124h-16 q-10 57 -42.5 84.5t-92.5 27.5q-99 0 -167.5 -80.5t-68.5 -182.5q0 -64 39 -100.5t110 -36.5q29 0 67.5 9t43.5 30l26 106q5 22 5 29q0 12 -7 18t-16 7.5t-32 3.5v13h189v-13q-31 -2 -44.5 -11.5t-20.5 -39.5z" />
+<glyph unicode="&#x29c;" horiz-adv-x="572" d="M671 464v-18q-45 -3 -60 -15t-25 -52l-72 -289q-5 -22 -5 -34q0 -20 12.5 -28.5t42.5 -9.5v-18h-216v18q46 2 60 15.5t26 60.5l32 126h-242l-32 -126q-6 -22 -6 -38q0 -19 12 -28t42 -10v-18h-215v18q46 3 60.5 17t26.5 62l70 282q6 23 6 36q0 17 -12 23t-44 8v18h215 v-18q-43 -3 -58.5 -14.5t-25.5 -52.5l-31 -126h242l31 126q6 24 6 37q0 16 -11.5 21.5t-44.5 8.5v18h216z" />
+<glyph unicode="&#x29d;" horiz-adv-x="403" d="M394 598q0 -20 -15 -35t-35 -15q-23 0 -38.5 14.5t-15.5 37.5q0 22 16 37t37 15q20 0 35.5 -16.5t15.5 -37.5zM361 438l-104 -410q-13 -56 -28 -88q54 -67 100 -173h-40q-24 62 -75 137q-69 -137 -190 -137q-44 0 -74 26.5t-30 67.5q0 58 51 98.5t107 40.5q53 0 91 -23 l77 312q16 65 16 80q0 17 -10.5 24t-37.5 7h-26v16q45 3 169 25zM161 -55q-16 8 -45 14t-43 6q-40 0 -79 -30.5t-39 -71.5q0 -31 25.5 -46t63.5 -15q26 0 45 10t32.5 33.5t20.5 42.5t19 57z" />
+<glyph unicode="&#x29e;" horiz-adv-x="463" d="M473 428l-141 -528q-18 -66 -18 -88q0 -24 51 -24h18v-16q-75 -9 -157 -27l-6 6l120 456l-43 -33q-143 -110 -143 -140q0 -18 37 -18h14v-16h-179v16q36 2 76 29.5t149 124.5l-37 88q-55 129 -81 129q-21 0 -45 -42q-5 -8 -15 -26l-15 11q35 63 58 86t53 23 q22 0 39.5 -17.5t41.5 -64.5q30 -58 60 -141l40 32l48 180h75z" />
+<glyph unicode="&#x29f;" horiz-adv-x="470" d="M473 127l-67 -127h-381v18q38 1 53 14.5t24 50.5l73 294q7 28 7 39q0 15 -10.5 21.5t-39.5 8.5v18h193v-18q-42 -2 -55 -16.5t-22 -53.5l-76 -307q-3 -9 -3 -18q0 -12 12 -15.5t46 -3.5h50q88 0 134 43q15 15 43 52h19z" />
+<glyph unicode="&#x2a0;" horiz-adv-x="480" d="M395 379l27 84q18 56 51.5 87.5t73.5 31.5q53 0 85 -18q34 -19 34 -53q0 -12 -8.5 -22.5t-24.5 -10.5q-31 0 -47 30q-16 31 -38 31q-19 0 -30.5 -16t-26.5 -71l-172 -603q-2 -8 -2 -11q0 -31 57 -31h15v-16h-237v16q46 3 64 15t27 41l90 290q-59 -94 -104 -129t-104 -35 q-47 0 -73.5 31t-26.5 85q0 77 44.5 156t113 129.5t135.5 50.5q63 0 77 -62zM380 359q0 25 -17 42.5t-42 17.5q-41 0 -93 -49q-51 -49 -84 -119t-33 -132q0 -77 53 -77q41 0 82 36q51 44 92.5 131.5t41.5 149.5z" />
+<glyph unicode="&#x2a1;" d="M176 193l44 163q79 1 136.5 69.5t57.5 150.5q0 90 -59 90q-20 0 -39 -18t-24 -42q-16 -68 -55 -68q-18 0 -32 13t-14 29q0 17 11.5 39t37.5 37q48 27 110 27q85 0 122 -35.5t37 -89.5q0 -90 -68.5 -153.5t-142.5 -68.5l-39 -143h77l-8 -31h-77l-16 -60q-8 -28 -8 -50 t13.5 -28.5t50.5 -8.5v-15h-236v15q44 3 61 15q21 15 36 72l16 60h-78l8 31h78z" />
+<glyph unicode="&#x2a2;" d="M179 193l38 143q-51 10 -85.5 40t-34.5 85q0 38 13.5 75.5t41 71t76.5 54.5t112 21q31 0 65.5 -10.5t53.5 -25.5q36 -29 36 -65q0 -18 -13 -31t-35 -13q-19 0 -32.5 16.5t-18.5 43.5q-4 23 -22 45.5t-44 22.5q-50 0 -94 -67.5t-44 -124.5q0 -49 33 -83.5t81 -34.5 l-43 -163h75l-8 -31h-75l-16 -60q-8 -28 -8 -49q0 -19 13 -27.5t48 -10.5v-15h-237v15q49 2 67.5 17t32.5 70l16 60h-79l8 31h79z" />
+<glyph unicode="&#x2a3;" horiz-adv-x="743" d="M741 417l-300 -357h209q26 0 43 40l16 -4l-29 -96h-302q-24 -13 -50 -13q-19 0 -30 12t-11 33q0 30 13 89q-43 -73 -84.5 -102.5t-93.5 -29.5q-50 0 -78.5 30.5t-28.5 86.5q0 119 96.5 227t195.5 108q31 0 45 -13t21 -45l45 163q14 49 14 71q0 16 -11 20t-53 6v17 q77 7 153 23l6 -6l-39 -151l-27 -98h280v-11zM669 368h-136q-40 0 -58 -11.5t-33 -48.5l-12 3l-60 -216q-7 -26 -7 -35q0 -20 18 -20q15 0 25 12zM356 361q0 26 -14.5 41.5t-32.5 15.5q-47 0 -91 -46q-50 -53 -83 -126.5t-33 -135.5q0 -34 15.5 -53.5t42.5 -19.5q45 0 91 49 t75.5 125t29.5 150z" />
+<glyph unicode="&#x2a4;" horiz-adv-x="743" d="M780 400l-206 -204q11 3 24 3q54 0 88.5 -35t34.5 -98q0 -133 -87 -216t-203 -83q-57 0 -104 31q-20 13 -31.5 33t-11.5 37q0 18 13 31t36 13q36 0 49 -58q9 -38 22.5 -48t51.5 -10q60 0 121 64t61 169q0 57 -34 81.5t-78 24.5q-13 0 -37 -27l-88 -90q-30 -31 -73 -31 q-19 0 -30 12t-11 33q0 30 13 89q-43 -73 -84.5 -102.5t-93.5 -29.5q-50 0 -78.5 30.5t-28.5 86.5q0 119 96.5 227t195.5 108q31 0 45.5 -14t19.5 -44h1l45 163q14 49 14 71q0 16 -11 20t-53 6v17q77 7 153 23l6 -6l-59 -227h312v-50zM729 386h-202q-47 0 -67.5 -21 t-33.5 -67l-54 -195q-9 -36 -9 -43q0 -20 18 -20q8 0 21 13zM356 361q0 26 -14.5 41.5t-32.5 15.5q-47 0 -91 -46q-50 -53 -83 -126.5t-33 -135.5q0 -34 15.5 -53.5t42.5 -19.5q45 0 91 49t75.5 125t29.5 150z" />
+<glyph unicode="&#x2a5;" horiz-adv-x="754" d="M741 417l-300 -357h116q50 84 105 84q31 0 50 -16t19 -44q0 -84 -119 -84h-66q-18 -32 -25 -47h-24q1 1 10.5 20t14.5 27h-144q-30 -13 -50 -13q-19 0 -30 12t-11 33q0 30 13 89q-43 -73 -84.5 -102.5t-93.5 -29.5q-50 0 -78.5 30.5t-28.5 86.5q0 119 96.5 227t195.5 108 q31 0 46 -14t20 -44l45 163q14 49 14 71q0 16 -11 20t-53 6v17q77 7 153 23l6 -6l-39 -152l-27 -97h280v-11zM582 60h74q22 0 34.5 8t12.5 19q0 15 -13 25.5t-28 10.5q-36 0 -80 -63zM669 368h-136q-40 0 -58 -11.5t-33 -48.5l-12 3l-60 -215q-7 -24 -7 -36q0 -20 18 -20 q14 0 27 15zM356 361q0 26 -14.5 41.5t-32.5 15.5q-47 0 -91 -46q-50 -53 -83 -126.5t-33 -135.5q0 -34 15.5 -53.5t42.5 -19.5q45 0 91 49t75.5 125t29.5 150z" />
+<glyph unicode="&#x2a6;" d="M523 442l-20 -140h-16q-14 116 -89 116q-27 0 -43 -15t-16 -42q0 -38 54 -102q68 -79 68 -136q0 -61 -40.5 -97.5t-103.5 -36.5q-29 0 -55 10q-45 18 -70 53q-19 -29 -50 -46t-58 -17q-46 0 -46 37q0 10 16 74l78 296h-75l-1 6q0 18 33 25q25 6 66 38.5t67 71.5q6 9 14 9 q9 0 9 -8q0 -5 -1 -7l-28 -103h107q29 13 64 13q20 0 56 -10q22 -7 36 -7q20 0 30 18h14zM214 117l13 -7q-6 -10 -9 -14q26 -86 91 -86q35 0 55.5 20t20.5 57q0 45 -56 115q-63 79 -63 131q0 36 19 63h-78l-87 -328q-2 -8 -2 -14q0 -16 15 -16q12 0 28 15.5t53 63.5z" />
+<glyph unicode="&#x2a7;" horiz-adv-x="517" d="M320 428l10 37q25 94 86 156t150 62q37 0 63 -15.5t26 -40.5q0 -16 -12.5 -27t-27.5 -11q-22 0 -47 30t-41 30q-62 0 -98 -140l-136 -524q-24 -94 -85 -156t-150 -62q-36 0 -63 15.5t-27 39.5q0 17 12.5 28t27.5 11q22 0 47 -30t41 -30q60 0 94 127l38 146 q-50 -46 -81.5 -65.5t-62.5 -19.5q-46 0 -46 37q0 10 16 74l78 296h-75l-1 6q0 18 33 25q25 6 66 38.5t67 71.5q6 9 14 9q9 0 9 -8q0 -5 -1 -7l-28 -103h104zM312 396h-105l-87 -328q-2 -8 -2 -14q0 -16 15 -16q21 0 106 79z" />
+<glyph unicode="&#x2a8;" horiz-adv-x="632" d="M207 396l-87 -328q-2 -8 -2 -17q0 -14 30 -14q32 0 84 25q-15 33 -15 81q0 67 34 129.5t89 107.5q77 61 167 61q46 0 75.5 -23t29.5 -58q0 -20 -14 -34t-34 -14t-29.5 11.5t-9.5 28.5q0 9 7.5 23.5t7.5 24.5q0 20 -37 20q-63 0 -109 -48q-91 -96 -91 -233q0 -26 4 -40 q103 50 178 50q34 0 59.5 -18.5t25.5 -46.5q0 -45 -34 -72.5t-107 -27.5q-88 0 -128 15t-55 39q-96 -49 -163 -49q-17 0 -31 8.5t-14 28.5q0 10 16 74l78 296h-75l-1 6q0 18 33 25q25 6 66 38.5t67 71.5q6 9 14 9q9 0 9 -8q0 -5 -1 -7l-28 -103h80l-5 -32h-84zM537 79 q0 17 -16 27t-41 10q-74 0 -165 -45q9 -23 39.5 -36.5t50.5 -15.5t38 -2q47 0 70.5 17.5t23.5 44.5z" />
+<glyph unicode="&#x2b0;" horiz-adv-x="378" d="M380 420l11 -9q-38 -49 -64.5 -67t-58.5 -18q-16 0 -26 8.5t-10 22.5q0 12 17 68l46 154q6 22 6 24q0 19 -25 19q-21 0 -57 -30t-69 -74q-26 -35 -41 -68.5t-39 -116.5h-63l120 404q13 41 13 52q0 8 -11 13t-24 5h-22v11q67 8 132 20l6 -4l-102 -331q108 156 192 156 q27 0 41 -13.5t14 -35.5q0 -11 -4 -23l-60 -188q-5 -18 -5 -25q0 -13 14 -13q10 0 23 11t46 48z" />
+<glyph unicode="&#x2b1;" horiz-adv-x="378" d="M7 333l112 377q17 55 63.5 91.5t103.5 36.5q53 0 90.5 -15.5t37.5 -39.5q0 -11 -8 -19t-20 -8q-5 0 -9.5 1.5t-7 2.5t-7 5t-6.5 6l-6 9q-5 6 -7 8q-26 31 -54 31q-33 0 -61.5 -27.5t-39.5 -63.5l-69 -225q108 156 192 156q28 0 41.5 -13.5t13.5 -35.5q0 -11 -4 -23 l-60 -188q-5 -15 -5 -25q0 -5 4.5 -9t9.5 -4q10 0 22.5 10.5t46.5 48.5l11 -9q-38 -49 -64 -67t-58 -18q-37 0 -37 31q0 12 17 68l46 154q6 22 6 24q0 19 -24 19q-22 0 -58 -30t-69 -74q-26 -35 -41 -68.5t-39 -116.5h-63z" />
+<glyph unicode="&#x2b2;" horiz-adv-x="300" d="M350 810q0 -16 -11 -27t-27 -11q-18 0 -29.5 11t-11.5 29q0 16 11.5 27.5t28.5 11.5q16 0 27.5 -12.5t11.5 -28.5zM325 688l-79 -311q-23 -92 -57.5 -135t-84.5 -43q-26 0 -43 13t-17 33q0 14 9 24t22 10q30 0 30 -28q0 -9 -4.5 -15t-4.5 -11q0 -8 13 -8q23 0 38.5 29 t35.5 108l55 221q12 49 12 61q0 13 -8 18t-29 5h-19v13q31 1 128 18z" />
+<glyph unicode="&#x2b3;" horiz-adv-x="320" d="M116 519l13 28q26 55 82 108q37 35 68 35q19 0 30 -11t11 -29t-11 -30t-30 -12q-17 0 -30 20q-7 11 -14 11q-24 0 -71 -73q-29 -45 -46.5 -85t-49.5 -136h-66l70 228q14 44 14 65q0 20 -33 20q-14 0 -27 -2v13l135 21l2 -2z" />
+<glyph unicode="&#x2b4;" horiz-adv-x="320" d="M318 690l-70 -228q-14 -44 -14 -65q0 -20 33 -20q1 0 27 2v-13l-135 -21l-2 2l47 169l-13 -28q-26 -55 -82 -108q-37 -35 -68 -35q-19 0 -30 11t-11 29t11 30t30 12q17 0 30 -20q7 -11 14 -11q24 0 71 73q29 45 46.5 85t49.5 136h66z" />
+<glyph unicode="&#x2b5;" horiz-adv-x="320" d="M318 690l-107 -347q-26 -82 -26 -109q0 -22 10.5 -33.5t27.5 -11.5q15 0 36.5 23.5t39.5 23.5q15 0 25.5 -8t10.5 -22q0 -21 -24 -32t-57 -11q-56 0 -88.5 24t-32.5 72q0 22 30 121l41 135l-14 -27q-32 -61 -81 -108q-37 -35 -68 -35q-19 0 -30 11t-11 29t11 30t30 12 q15 0 30 -20q7 -11 14 -11q23 0 71 73q30 45 47.5 85t48.5 136h66z" />
+<glyph unicode="&#x2b6;" horiz-adv-x="390" d="M462 671h-9q-25 0 -51 -25l-127 -124q82 -21 82 -72q0 -47 -49.5 -76t-117.5 -29h-184v13q35 4 49 17t24 50l47 187q5 22 5 28q0 28 -47 31v13h182v-13q-33 -2 -48.5 -15t-24.5 -47l-20 -78h31l161 153h97v-13zM167 507l-33 -134q20 -5 40 -5q44 0 74 22.5t30 58.5 q0 30 -32 47q-21 11 -64 11h-15z" />
+<glyph unicode="&#x2b7;" d="M321 678l26 -278q78 97 104 138.5t26 66.5q0 11 -17 28q-17 16 -17 32q0 10 9 17.5t22 7.5q17 0 29 -13t12 -32q0 -64 -168 -276q-33 -42 -42 -42q-6 0 -9 27l-23 246l-70 -121q-43 -76 -44 -78q-38 -74 -50 -74q-9 0 -10 37q-10 207 -25 263q-5 22 -12 28t-25 6h-22v9 q45 8 75 15q4 1 9 2t8.5 2t5.5 1q6 0 8 -4t7 -23q19 -78 25 -222l152 240q5 8 10 8q6 0 6 -11z" />
+<glyph unicode="&#x2b8;" horiz-adv-x="330" d="M218 499l16 -83q93 155 93 195q0 11 -20 24t-20 30q0 12 8.5 20t21.5 8q17 0 28.5 -12.5t11.5 -29.5q0 -67 -99 -232q-60 -98 -115.5 -157.5t-88.5 -59.5q-17 0 -27.5 9t-10.5 23q0 13 8.5 22t20.5 9q14 0 26 -11t21 -11q14 0 36 25q10 11 29.5 36.5t24.5 33.5q7 16 7 26 q0 23 -23.5 118.5t-38.5 133.5q-11 28 -23.5 38.5t-34.5 10.5q-11 0 -24 -3v12q65 13 94 18q1 0 6 0.5t9 0.5q8 0 31 -70.5t33 -123.5z" />
+<glyph unicode="&#x2bb;" horiz-adv-x="333" d="M232 686l4 -19q-51 -28 -76.5 -60.5t-25.5 -49.5q0 -10 10 -10q2 0 10.5 2t14.5 2q21 0 35.5 -12.5t14.5 -37.5q0 -29 -24 -43.5t-48 -14.5q-13 0 -27 4t-27.5 19t-13.5 40q0 20 4 33q15 55 64.5 97t84.5 50z" />
+<glyph unicode="&#x2c0;" horiz-adv-x="326" d="M67 446h12q68 0 110.5 45t42.5 111q0 75 -47 75q-17 0 -31.5 -15t-18.5 -32q-12 -55 -42 -55q-17 0 -27.5 10.5t-10.5 24.5q0 13 10 30.5t30 28.5q37 21 88 21q124 0 124 -99q0 -83 -60.5 -149t-135.5 -66q-13 0 -18 1l-26 -82h-37z" />
+<glyph unicode="&#x2c1;" horiz-adv-x="326" d="M141 295l14 82q-5 -1 -18 -1q-49 0 -81.5 32t-32.5 82v6q4 83 51 138.5t146 55.5q52 0 89 -25q34 -22 34 -55q0 -14 -10.5 -24.5t-27.5 -10.5q-30 0 -41 52q-4 19 -19 34.5t-32 15.5q-41 0 -78 -52.5t-37 -97.5q0 -35 29.5 -58t75.5 -23h12l-37 -151h-37z" />
+<glyph unicode="&#x2c6;" horiz-adv-x="333" d="M385 492h-36l-82 104l-137 -104h-39l157 169h49z" />
+<glyph unicode="&#x2c7;" horiz-adv-x="333" d="M426 661l-162 -169h-48l-95 169h38l89 -105l141 105h37z" />
+<glyph unicode="&#x2d8;" horiz-adv-x="333" d="M389 650h29q-11 -67 -60 -112.5t-113 -45.5q-67 0 -97.5 39.5t-30.5 118.5h29q8 -99 107 -99q46 0 83 26.5t53 72.5z" />
+<glyph unicode="&#x2d9;" horiz-adv-x="333" d="M305 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34z" />
+<glyph unicode="&#x2da;" horiz-adv-x="333" d="M355 607q0 -41 -29.5 -70t-70.5 -29q-43 0 -71.5 29t-28.5 71q0 40 29.5 69.5t69.5 29.5q42 0 71.5 -29.5t29.5 -70.5zM321 607q0 28 -19.5 47t-47.5 19q-26 0 -45.5 -19.5t-19.5 -45.5q0 -28 18.5 -47t46.5 -19q29 0 48 18.5t19 46.5z" />
+<glyph unicode="&#x2db;" horiz-adv-x="333" d="M183 -74l17 -18q-52 -77 -125 -77q-40 0 -67.5 26.5t-27.5 68.5q0 61 70 114h24q-33 -45 -33 -93q0 -23 16.5 -38t42.5 -15q47 0 83 32z" />
+<glyph unicode="&#x2dc;" horiz-adv-x="333" d="M399 624h28q-22 -104 -95 -104q-18 0 -57 15q-71 29 -95 29q-36 0 -51 -47h-29q15 58 38 82t62 24q32 0 86 -24q41 -19 62 -19q20 0 31.5 9.5t19.5 34.5z" />
+<glyph unicode="&#x2dd;" horiz-adv-x="333" d="M263 494l160 160q10 10 27 10q15 0 25.5 -10.5t10.5 -25.5q0 -20 -17 -30l-171 -104h-35zM93 494l160 160q10 10 27 10q15 0 25.5 -10.5t10.5 -25.5q0 -20 -17 -30l-169 -104h-37z" />
+<glyph unicode="&#x2e0;" horiz-adv-x="315" d="M335 684v-11q-7 0 -13.5 -3.5t-10.5 -6t-10 -9.5l-8 -10q-2 -3 -8 -13t-7 -11l-125 -191l14 -75q4 -22 4 -34q0 -44 -23 -73t-63 -29q-26 0 -44 12.5t-18 34.5q0 32 21 60l56 73l-26 157q-8 54 -19 93q-6 25 -31 25v11h133v-11h-11q-26 -3 -26 -29q0 -13 3 -34l24 -155 l104 163q17 28 17 38q0 17 -27 17v11h94zM107 372l-44 -61q-12 -24 -12 -43q0 -12 7 -20t19 -8q18 0 30.5 13.5t12.5 33.5q0 13 -5 38z" />
+<glyph unicode="&#x2e1;" horiz-adv-x="220" d="M214 833l-111 -424q-6 -21 -6 -32q0 -13 12 -13q20 0 49 42l18 25l10 -7q-32 -52 -56 -71.5t-54 -19.5q-35 0 -35 41q0 10 3 21l99 381q2 7 2 14q0 16 -35 16h-13v11q44 5 112 20z" />
+<glyph unicode="&#x2e2;" horiz-adv-x="300" d="M290 691l-16 -110h-13q-10 91 -69 91q-21 0 -34 -12t-13 -33q0 -29 43 -79q53 -63 53 -107q0 -48 -31.5 -76.5t-81.5 -28.5q-22 0 -43 8q-17 7 -34 7q-15 0 -23 -16h-12l15 124h13q16 -105 78 -105q28 0 43.5 15.5t15.5 43.5q0 36 -43 90q-50 62 -50 103q0 38 26 61 t69 23q17 0 44 -8q19 -5 28 -5q15 0 24 14h11z" />
+<glyph unicode="&#x2e3;" horiz-adv-x="380" d="M217 623l10 -45q41 64 67 88.5t52 24.5q14 0 23.5 -8t9.5 -21t-7.5 -21t-19.5 -8q-7 0 -19 7t-22 7q-23 0 -78 -96q0 -13 6 -36l26 -106q7 -32 23 -32q15 0 38 32l16 22l12 -7q-35 -54 -54.5 -72.5t-41.5 -18.5q-19 0 -29 12t-18 42l-23 94l-70 -94q-25 -34 -40 -44 t-35 -10q-39 0 -39 34q0 12 7.5 20t19.5 8q10 0 25 -9q14 -7 20 -7q13 0 41 39l65 92l-23 98q-8 36 -14.5 45t-21.5 9q-9 0 -45 -10l-2 13q71 26 101 26q15 0 23 -13.5t17 -54.5z" />
+<glyph unicode="&#x2e4;" horiz-adv-x="318" d="M87 412l41 166q-93 19 -93 96q0 66 47.5 119.5t141.5 53.5q45 0 82 -21q39 -23 39 -57q0 -14 -10.5 -24.5t-27.5 -10.5q-30 0 -40 50q-5 21 -19.5 35.5t-31.5 14.5q-39 0 -72.5 -52.5t-33.5 -97.5q0 -38 25 -64.5t62 -26.5l-45 -181q-7 -32 -7 -39q0 -15 10 -20.5 t37 -7.5v-12h-184v12q39 2 53.5 13t25.5 54z" />
+<glyph unicode="&#x2ec;" horiz-adv-x="320" d="M305 70l-132 -217h-26l-132 217h69l76 -120l76 120h69z" />
+<glyph unicode="&#x2ed;" horiz-adv-x="405" d="M395 611h-385v54h385v-54zM395 507h-385v54h385v-54z" />
+<glyph unicode="&#x384;" horiz-adv-x="289" d="M160 494l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34z" />
+<glyph unicode="&#x385;" horiz-adv-x="333" d="M160 494l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34zM168 543q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM387 543q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5 q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34z" />
+<glyph unicode="&#x386;" horiz-adv-x="611" d="M139 523l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34zM564 0h-245v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16zM369 262 l-45 263l-149 -263h194z" />
+<glyph unicode="&#x387;" horiz-adv-x="333" d="M261 384q0 -23 -16.5 -38.5t-40.5 -15.5q-22 0 -38 16t-16 38q0 24 16 40.5t39 16.5t39.5 -16.5t16.5 -40.5z" />
+<glyph unicode="&#x388;" horiz-adv-x="630" d="M7 523l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34zM679 653l-31 -154l-22 2q3 25 3 46q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 24 -7 31q-17 15 -78 15h-78l-32 -112 q-36 -127 -36 -146q0 -34 79 -34q129 0 203 39q38 20 94 98l16 -8l-62 -162h-507v16q43 8 56 19.5t25 54.5l123 442q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497z" />
+<glyph unicode="&#x389;" horiz-adv-x="740" d="M4 523l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34zM821 653v-16q-44 -8 -58 -20t-26 -54l-132 -481q-3 -12 -3 -24q0 -21 15 -29t64 -13v-16h-274v16q51 4 71.5 21t30.5 56l64 233h-285l-66 -244q-3 -10 -3 -22q0 -22 12.5 -30t57.5 -14v-16h-245v16 q41 4 56.5 20t29.5 66l118 430q12 46 12 64q0 21 -14.5 28.5t-62.5 12.5v16h271v-16q-45 -3 -67.5 -19t-32.5 -52l-54 -198h285l46 164q14 52 14 63q0 19 -16 29t-56 13v16h248z" />
+<glyph unicode="&#x38a;" horiz-adv-x="350" d="M3 523l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34zM429 653v-16q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="&#x38c;" horiz-adv-x="722" d="M58 523l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34zM699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5 q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#x38e;" horiz-adv-x="580" d="M725 604l-16 -7q-17 25 -40 25q-47 0 -92.5 -40.5t-79 -104t-55.5 -119t-37 -107.5l-40 -140q-10 -34 -10 -55q0 -19 11.5 -27t41.5 -10l36 -3v-16h-289v16q51 3 72.5 19t34.5 63l56 197q10 66 10 128q0 105 -24.5 149t-84.5 44q-20 0 -46 -11l-7 14q36 26 61.5 37.5 t57.5 11.5q143 0 143 -207q0 -30 -2 -46h3v1q37 101 100.5 175.5t121.5 74.5q28 0 48 -14q18 -14 26 -48zM8 523l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34z" />
+<glyph unicode="&#x38f;" horiz-adv-x="762" d="M242 94l5 37q-147 48 -147 203q0 65 35.5 129t96.5 114q109 89 273 89q118 0 176 -62t58 -168q0 -107 -76.5 -193t-205.5 -112l-7 -37h128q24 2 34 3.5t27 7t26.5 13.5t21 23.5t19.5 37.5l18 -5l-56 -174h-280l40 166q87 19 146.5 103.5t59.5 182.5q0 181 -140 181 q-108 0 -192 -87q-97 -102 -97 -216q0 -61 21 -105.5t63 -58.5l-24 -166h-271l42 179l17 -5q-4 -20 -4 -36q0 -26 16 -35t46 -9h131zM50 523l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34z" />
+<glyph unicode="&#x390;" horiz-adv-x="278" d="M222 114l13 -11q-42 -65 -71 -89.5t-66 -24.5q-49 0 -49 55q0 29 22 111l48 177q9 32 9 44q0 15 -11.5 19t-52.5 5v16q46 4 160 25l4 -3l-94 -343q-10 -34 -10 -44q0 -15 14 -15q25 0 84 78zM160 494l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34z M168 543q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM387 543q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34z" />
+<glyph unicode="&#x391;" horiz-adv-x="611" d="M564 0h-245v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16zM369 262l-45 263l-149 -263h194z" />
+<glyph unicode="&#x392;" horiz-adv-x="611" d="M130 653h250q208 0 208 -150q0 -70 -64 -113q-34 -23 -111 -39v-1q126 -38 126 -150q0 -98 -74.5 -149t-200.5 -51h-272v16q41 6 55.5 20t27.5 60l121 436q11 39 11 64q0 22 -15 29.5t-62 11.5v16zM248 363h38q98 0 149.5 39t51.5 113q0 56 -28 82t-89 26 q-23 0 -31.5 -1.5t-15.5 -9t-12 -25.5zM238 331l-32 -119q-35 -133 -35 -140q0 -42 67 -42q88 0 140.5 44t52.5 126q0 45 -19 77t-48 42q-34 12 -126 12z" />
+<glyph unicode="&#x393;" horiz-adv-x="611" d="M645 653l-32 -154l-21 2q3 22 3 33q0 39 -14 55.5t-54 23.5t-131 7q-35 0 -49 -6.5t-19 -25.5l-132 -473q-14 -50 -14 -60q0 -18 17 -27t60 -12v-16h-251v16q41 3 56 19t27 59l123 442q10 36 10 61q0 21 -13.5 28.5t-62.5 11.5v16h497z" />
+<glyph unicode="&#x394;" horiz-adv-x="611" d="M526 0h-558l400 668h26zM411 94l-87 432l-255 -432h342z" />
+<glyph unicode="&#x395;" horiz-adv-x="611" d="M634 653l-31 -154l-22 2q3 25 3 46q0 45 -37 59t-155 14q-42 0 -55 -4.5t-18 -21.5l-66 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 24 -7 31q-16 15 -78 15h-78l-32 -112q-36 -127 -36 -146q0 -34 79 -34q129 0 203 39q38 20 94 98l16 -8l-62 -162 h-507v16q43 8 56 19.5t25 54.5l123 442q11 37 11 64q0 20 -15.5 28.5t-61.5 12.5v16h497z" />
+<glyph unicode="&#x396;" horiz-adv-x="556" d="M606 639l-483 -603h161q71 0 108.5 6t64.5 26q41 30 77 104l19 -3l-54 -169h-505v14l479 603h-171q-102 0 -142 -27q-22 -15 -32.5 -30.5t-33.5 -58.5l-19 5l45 147h486v-14z" />
+<glyph unicode="&#x397;" horiz-adv-x="722" d="M769 653v-16q-44 -8 -58 -20t-26 -54l-132 -481q-3 -12 -3 -24q0 -21 15 -29t64 -13v-16h-274v16q51 4 71.5 21t30.5 56l64 233h-285l-66 -244q-3 -10 -3 -22q0 -22 12.5 -30t57.5 -14v-16h-245v16q41 4 56.5 20t29.5 66l118 430q12 46 12 64q0 21 -14.5 28.5t-62.5 12.5 v16h271v-16q-45 -3 -67.5 -19t-32.5 -52l-54 -198h285l46 164q14 52 14 63q0 19 -16 29t-56 13v16h248z" />
+<glyph unicode="&#x398;" horiz-adv-x="722" d="M524 429h19q-53 -137 -53 -209h-19q0 32 -10.5 45t-36.5 13h-105q-60 0 -84 -58h-19q53 129 53 209h19q6 -35 16 -46t36 -11h98q29 0 54 15t32 42zM699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -218 -71q-99 0 -156.5 61.5t-57.5 172.5q0 91 49 187.5t128 165.5 q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#x399;" horiz-adv-x="333" d="M384 653v-16q-42 -5 -55.5 -18t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="&#x39a;" horiz-adv-x="667" d="M722 653v-16q-28 0 -77 -37l-298 -225l168 -293q23 -40 40 -50.5t64 -15.5v-16h-275v16l29 3q46 4 46 32q0 6 -1.5 13t-6.5 16l-8 16l-11 19q-8 14 -10 18l-123 215l-65 -237q-11 -39 -11 -51q0 -23 14.5 -31.5t56.5 -12.5v-16h-247v16q43 5 56 17t25 54l124 445 q14 50 14 62q0 21 -17 31t-62 12v16h270v-16q-42 -3 -65 -18.5t-34 -55.5l-53 -194l153 109q143 101 143 137q0 15 -36 19l-24 3v16h221z" />
+<glyph unicode="&#x39b;" horiz-adv-x="611" d="M564 0h-245v16q45 2 61 14t16 39q0 8 -2 26l-70 430l-229 -410q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16z" />
+<glyph unicode="&#x39c;" horiz-adv-x="833" d="M872 653v-16q-41 -7 -55.5 -20.5t-25.5 -53.5l-123 -443q-14 -50 -14 -62q0 -20 18 -30.5t63 -11.5l-1 -16h-271v16q49 5 69 22t33 64l126 459l-376 -561h-17l-62 546l-118 -428q-9 -32 -9 -54q0 -43 70 -48v-16h-197v16q40 5 58.5 28.5t41.5 105.5l114 401q12 41 12 52 q0 30 -74 34v16h181l56 -492l335 492h166z" />
+<glyph unicode="&#x39d;" horiz-adv-x="667" d="M727 653v-16q-27 -6 -37.5 -9.5t-23 -21t-18.5 -38.5l-23 -76l-146 -507h-18l-230 550l-114 -422q-9 -31 -9 -54q0 -21 15.5 -30.5t54.5 -12.5v-16h-198v16q43 6 61 31.5t45 120.5l117 415q-23 54 -86 54v16h160l207 -499l106 388q8 28 8 44q0 27 -13.5 37t-55.5 14v16 h198z" />
+<glyph unicode="&#x39e;" horiz-adv-x="651" d="M680 653l-44 -164l-17 2q2 18 2 23q0 28 -14 38.5t-58 10.5h-285q-41 0 -64.5 -14.5t-38.5 -54.5l-18 4l42 155h495zM553 456l-59 -218l-17 2q2 12 2 27q0 21 -10.5 29t-50.5 8h-150q-33 0 -53.5 -12t-35.5 -49l-18 4l56 209l19 -4q-3 -11 -3 -29q0 -22 14.5 -27.5 t47.5 -5.5h143q33 0 51.5 8.5t25.5 19.5t20 41zM587 174l-56 -174h-537l44 179l17 -5q-4 -19 -4 -36q0 -44 62 -44h319q52 0 84 16t53 69z" />
+<glyph unicode="&#x39f;" horiz-adv-x="722" d="M699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5 t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#x3a0;" horiz-adv-x="722" d="M769 653v-16q-44 -8 -58 -20t-26 -54l-132 -481q-3 -12 -3 -24q0 -21 15 -29t64 -13v-16h-274v16q50 4 70.5 20.5t31.5 56.5l145 520h-285l-147 -531q-3 -10 -3 -22q0 -22 12.5 -30t57.5 -14v-16h-245v16q41 4 56.5 20t29.5 66l118 430q12 46 12 64q0 21 -14.5 28.5 t-62.5 12.5v16h638z" />
+<glyph unicode="&#x3a1;" horiz-adv-x="611" d="M146 653h241q218 0 218 -148q0 -40 -18.5 -78.5t-49.5 -64.5q-69 -57 -205 -57q-55 0 -90 8l-53 -193q-14 -54 -14 -63q0 -18 15 -27.5t54 -13.5v-16h-244v16q43 6 56.5 19.5t27.5 62.5l116 414q17 61 17 83q0 20 -14 28.5t-57 13.5v16zM320 592l-69 -245q29 -5 52 -5 q87 0 128 24q71 40 71 134q0 123 -130 123q-44 0 -52 -31z" />
+<glyph unicode="&#x3a3;" horiz-adv-x="620" d="M659 653l-31 -154l-22 2q3 15 3 43q0 45 -32.5 59t-122.5 14h-178l160 -262l-300 -261h305q57 0 90 23.5t60 81.5l19 -3l-66 -196h-550v15l350 310l-193 314v14h508z" />
+<glyph unicode="&#x3a4;" horiz-adv-x="556" d="M633 653l-44 -164l-17 2q3 25 3 46q0 81 -101 81h-58l-137 -490q-14 -49 -14 -66q0 -23 11 -31.5t42 -11.5l35 -3v-16h-288v16q52 5 74 20t33 55l143 527q-119 0 -160.5 -21.5t-77.5 -102.5l-18 4l42 155h532z" />
+<glyph unicode="&#x3a5;" horiz-adv-x="556" d="M648 604l-16 -7q-17 25 -40 25q-47 0 -92.5 -40.5t-79 -104t-55.5 -119t-37 -107.5l-40 -140q-10 -34 -10 -55q0 -19 11.5 -27t41.5 -10l36 -3v-16h-289v16q51 3 72.5 19t34.5 63l56 197q10 66 10 128q0 105 -24.5 149t-84.5 44q-20 0 -46 -11l-7 14q36 26 61.5 37.5 t57.5 11.5q143 0 143 -207q0 -30 -2 -46h3v1q37 101 100.5 175.5t121.5 74.5q28 0 48 -14q18 -14 26 -48z" />
+<glyph unicode="&#x3a6;" horiz-adv-x="741" d="M510 582l-12 -42q101 -4 167 -47t66 -132q0 -96 -91 -173q-85 -72 -260 -75q-11 -29 -11 -56q0 -23 21 -32t72 -9v-16h-297v16h9q46 0 70 20.5t36 76.5q-98 1 -164 45.5t-66 132.5q0 95 88 171q86 74 261 78q14 49 14 64q0 19 -12.5 26t-57.5 7v16h287v-16h-17 q-88 0 -103 -55zM488 510l-99 -361q120 0 179 63q60 64 60 154q0 63 -35.5 100.5t-104.5 43.5zM291 149l99 361q-113 0 -180 -70q-32 -34 -44.5 -68.5t-12.5 -83.5q0 -129 138 -139z" />
+<glyph unicode="&#x3a7;" horiz-adv-x="611" d="M655 653v-16q-33 -11 -60.5 -31.5t-64.5 -63.5l-169 -194l101 -255q18 -45 36 -58t69 -19v-16h-271v16q43 1 60 9.5t17 27.5q0 16 -14 51l-67 165l-151 -172q-23 -26 -23 -48q0 -33 66 -33v-16h-213v16q40 7 76 40.5t144 159.5l83 97l-103 255q-15 37 -33.5 51t-61.5 18 v16h263v-16q-41 -5 -56 -13.5t-15 -27.5q0 -17 16 -56l59 -147l145 167q21 24 21 43q0 31 -61 34v16h207z" />
+<glyph unicode="&#x3a8;" horiz-adv-x="675" d="M778 667v-16q-17 -4 -29.5 -12t-20 -22t-11 -23.5t-8.5 -29.5l-7 -29q-19 -65 -54 -111.5t-79.5 -72t-90.5 -36.5t-98 -11l-59 -210q-6 -24 -6 -32q0 -24 18.5 -35t71.5 -11v-16h-289v16q49 0 72.5 17t34.5 57l59 214q-197 0 -197 146q0 30 17 81t17 66q0 54 -42 54v16 h29q47 0 73.5 -28t26.5 -82q0 -17 -10.5 -58t-10.5 -60q0 -47 29 -72.5t78 -25.5l59 217q10 37 10 46q0 19 -11 26t-50 7h-11v16h278v-16h-17q-77 0 -93 -55l-67 -241q15 1 39 9t55 23.5t58 46t38 69.5q12 43 22.5 69t31 54t53 41.5t78.5 13.5h13z" />
+<glyph unicode="&#x3a9;" horiz-adv-x="762" d="M242 94l5 37q-147 48 -147 203q0 65 35.5 129t96.5 114q109 89 273 89q118 0 176 -62t58 -168q0 -107 -76.5 -193t-205.5 -112l-7 -37h128q24 2 34 3.5t27 7t26.5 13.5t21 23.5t19.5 37.5l18 -5l-56 -174h-280l40 166q87 19 146.5 103.5t59.5 182.5q0 181 -140 181 q-108 0 -192 -87q-97 -102 -97 -216q0 -61 21 -105.5t63 -58.5l-24 -166h-271l42 179l17 -5q-4 -20 -4 -36q0 -26 16 -35t46 -9h131z" />
+<glyph unicode="&#x3aa;" horiz-adv-x="333" d="M260 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM460 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM384 653v-16q-42 -5 -55.5 -18 t-26.5 -59l-120 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54l120 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="&#x3ab;" horiz-adv-x="556" d="M648 604l-16 -7q-17 25 -40 25q-47 0 -92.5 -40.5t-79 -104t-55.5 -119t-37 -107.5l-40 -140q-10 -34 -10 -55q0 -19 11.5 -27t41.5 -10l36 -3v-16h-289v16q51 3 72.5 19t34.5 63l56 197q10 66 10 128q0 105 -24.5 149t-84.5 44q-20 0 -46 -11l-7 14q36 26 61.5 37.5 t57.5 11.5q143 0 143 -207q0 -30 -2 -46h3v1q37 101 100.5 175.5t121.5 74.5q28 0 48 -14q18 -14 26 -48zM376 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM576 807q0 -20 -14.5 -34.5t-34.5 -14.5 q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34z" />
+<glyph unicode="&#x3ac;" horiz-adv-x="552" d="M549 428l-142 -261v-18q0 -39 9 -69t25 -30q23 0 51 74l16 -7q-37 -126 -101 -126q-49 0 -52 105q-88 -107 -194 -107q-69 0 -101.5 42t-32.5 110q0 61 24.5 120.5t66.5 102.5q34 34 80.5 55.5t92.5 21.5q60 0 93 -35.5t33 -83.5l46 106h86zM359 272q0 148 -77 148 q-52 0 -112.5 -92t-60.5 -203q0 -48 17 -81.5t52 -33.5q73 0 165 191q1 6 5.5 19.5t7.5 26.5t3 25zM300 494l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34z" />
+<glyph unicode="&#x3ad;" horiz-adv-x="444" d="M360 98l16 -10q-78 -99 -199 -99q-147 0 -147 111q0 45 33 81t83 49q-25 4 -39 22.5t-14 41.5q1 60 62.5 103.5t161.5 43.5q48 0 78 -23.5t30 -59.5q0 -20 -16 -33t-32 -13q-18 0 -28.5 11t-10.5 29q0 10 7.5 24.5t7.5 23.5q0 20 -37 20q-53 0 -97 -30t-44 -92 q0 -26 20.5 -39.5t53.5 -13.5q3 0 21 3.5t32 3.5t24 -6t10 -15q0 -27 -45 -27q-9 0 -22 4.5t-24 4.5q-44 0 -86.5 -28t-42.5 -79q0 -42 26 -61.5t63 -19.5q87 0 155 73zM248 494l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34z" />
+<glyph unicode="&#x3ae;" horiz-adv-x="474" d="M148 228l2 -1q133 214 221 214q31 0 51 -14.5t20 -42.5q0 -24 -10 -63l-87 -321q-30 -109 -30 -171q0 -15 8 -34h-73q-11 13 -11 44q0 50 33 170l75 274q14 47 14 72q0 35 -25 35q-40 0 -113 -93.5t-102 -190.5l-32 -106h-75l82 305q14 50 14 62q0 17 -14 17 q-4 0 -8.5 -2t-9.5 -6l-10 -9q-4 -4 -9.5 -10.5t-9 -11t-9 -11t-7.5 -8.5l-12 10q13 22 29 41q49 61 97 61q40 0 40 -45q0 -41 -39 -165zM231 494l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34z" />
+<glyph unicode="&#x3af;" horiz-adv-x="278" d="M222 114l13 -11q-42 -65 -71 -89.5t-66 -24.5q-49 0 -49 55q0 29 22 111l48 177q9 32 9 44q0 15 -11.5 19t-52.5 5v16q46 4 160 25l4 -3l-94 -343q-10 -34 -10 -44q0 -15 14 -15q25 0 84 78zM126 494l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34z" />
+<glyph unicode="&#x3b0;" horiz-adv-x="478" d="M276 426v15q85 0 127.5 -29.5t42.5 -108.5q0 -47 -21.5 -101.5t-56.5 -101.5t-85.5 -78.5t-103.5 -31.5q-134 0 -134 104q0 42 32 146l28 93q8 29 8 39q0 14 -12 14q-22 0 -69 -60l-13 9q70 106 131 106q44 0 44 -45q0 -25 -8 -52l-50 -181q-11 -39 -11 -74q0 -78 57 -78 q50 0 93.5 59.5t65 131.5t21.5 125q0 54 -20 74t-66 25zM207 494l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34zM215 543q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM434 543 q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34z" />
+<glyph unicode="&#x3b1;" horiz-adv-x="552" d="M549 428l-142 -261v-18q0 -39 9 -69t25 -30q23 0 51 74l16 -7q-37 -126 -101 -126q-49 0 -52 105q-88 -107 -194 -107q-69 0 -101.5 42t-32.5 110q0 61 24.5 120.5t66.5 102.5q34 34 80.5 55.5t92.5 21.5q60 0 93 -35.5t33 -83.5l46 106h86zM359 272q0 148 -77 148 q-52 0 -112.5 -92t-60.5 -203q0 -48 17 -81.5t52 -33.5q73 0 165 191q1 6 5.5 19.5t7.5 26.5t3 25z" />
+<glyph unicode="&#x3b2;" horiz-adv-x="506" d="M-9 -127l137 495q13 48 27.5 86.5t37.5 82t50 73t66 49t84 19.5q47 0 84 -24.5t37 -76.5q0 -57 -39.5 -108t-88.5 -73v-1q33 -3 60.5 -32.5t27.5 -78.5q0 -69 -53 -147.5t-124 -117.5q-53 -30 -124 -30q-29 0 -66 17l-38 -133q-14 -49 -31 -78h-78q16 24 31 78zM233 477 l-114 -432q0 -16 13.5 -26.5t34.5 -10.5q82 0 150 102t68 207q0 59 -40 59q-9 0 -25.5 -4t-24.5 -4q-13 0 -21.5 6.5t-8.5 15.5q0 24 44 24q3 0 19 -3t24 -3q31 0 60.5 56t29.5 102q0 53 -18 72t-49 19q-50 0 -86.5 -53t-55.5 -127z" />
+<glyph unicode="&#x3b3;" horiz-adv-x="410" d="M438 428l-274 -389l-3 -51q-1 -16 -5 -51.5t-10 -55t-15.5 -43t-24 -34t-33.5 -10.5q-38 0 -38 50q0 24 16.5 61t43.5 86t37 71q15 140 15 181q0 129 -48 129q-15 0 -33 -19t-31 -57h-16q37 139 99 139q36 0 50 -30.5t14 -87.5q0 -28 -3 -62t-8.5 -75.5t-6.5 -52.5 l178 301h96z" />
+<glyph unicode="&#x3b4;" horiz-adv-x="460" d="M460 604q0 -19 -9.5 -33.5t-29.5 -14.5q-18 0 -29 7.5t-16.5 18t-12.5 21t-22.5 18t-40.5 7.5q-32 0 -63 -16t-31 -42t26 -50t71.5 -53.5t68.5 -51.5q35 -33 50 -63.5t15 -84.5q0 -105 -75.5 -191.5t-189.5 -86.5q-71 0 -109.5 37t-38.5 105q0 96 76 178.5t172 91.5 l-34 32q-25 24 -35 35.5t-21 32t-11 39.5q0 45 30 75.5t66.5 41.5t72.5 11q44 0 82 -16.5t38 -47.5zM356 266q0 60 -19 87t-48 27q-66 0 -123.5 -88t-57.5 -191q0 -41 21.5 -66t56.5 -25q43 0 84 48t63.5 107t22.5 101z" />
+<glyph unicode="&#x3b5;" horiz-adv-x="444" d="M360 98l16 -10q-78 -99 -199 -99q-147 0 -147 111q0 45 33 81t83 49q-25 4 -39 22.5t-14 41.5q1 60 62.5 103.5t161.5 43.5q48 0 78 -23.5t30 -59.5q0 -20 -16 -33t-32 -13q-18 0 -28.5 11t-10.5 29q0 10 7.5 24.5t7.5 23.5q0 20 -37 20q-53 0 -97 -30t-44 -92 q0 -26 20.5 -39.5t53.5 -13.5q3 0 21 3.5t32 3.5t24 -6t10 -15q0 -27 -45 -27q-9 0 -22 4.5t-24 4.5q-44 0 -86.5 -28t-42.5 -79q0 -42 26 -61.5t63 -19.5q87 0 155 73z" />
+<glyph unicode="&#x3b6;" horiz-adv-x="454" d="M290 683l5 -15q-35 -13 -54 -32t-19 -38q0 -40 48 -48q30 36 84 71.5t90 35.5q31 0 31 -25q0 -33 -61.5 -69.5t-128.5 -42.5q-71 -48 -137.5 -156.5t-66.5 -200.5q0 -49 27.5 -71t81.5 -22q7 0 21 0.5t17 0.5q63 0 97 -25t34 -67q0 -45 -28 -85q-22 -34 -61 -56.5 t-73 -22.5q-28 0 -47.5 13t-19.5 39q0 17 12 29.5t31 12.5q16 0 34.5 -14.5t30.5 -14.5q33 0 57 19.5t24 49.5q0 50 -76 50q-13 0 -44.5 -5t-46.5 -5q-122 0 -122 118q0 208 212 415l-1 1q-26 0 -48 15.5t-22 42.5q0 32 30.5 59.5t88.5 42.5z" />
+<glyph unicode="&#x3b7;" horiz-adv-x="474" d="M148 228l2 -1q133 214 221 214q31 0 51 -14.5t20 -42.5q0 -24 -10 -63l-87 -321q-30 -109 -30 -171q0 -15 8 -34h-73q-11 13 -11 44q0 50 33 170l75 274q14 47 14 72q0 35 -25 35q-40 0 -113 -93.5t-102 -190.5l-32 -106h-75l82 305q14 50 14 62q0 17 -14 17 q-4 0 -8.5 -2t-9.5 -6l-10 -9q-4 -4 -9.5 -10.5t-9 -11t-9 -11t-7.5 -8.5l-12 10q13 22 29 41q49 61 97 61q40 0 40 -45q0 -41 -39 -165z" />
+<glyph unicode="&#x3b8;" horiz-adv-x="480" d="M494 511q0 -115 -37 -220t-97 -185q-88 -117 -205 -117q-60 0 -94 46t-34 126q0 151 65.5 278.5t156.5 196.5q56 42 122 42q56 0 89.5 -41t33.5 -126zM147 347h233q30 102 30 205q0 105 -53 105q-40 0 -87 -61t-77.5 -128.5t-45.5 -120.5zM373 315h-233q-29 -76 -29 -165 q0 -140 56 -140q34 0 69 33t61.5 83t46 99t29.5 90z" />
+<glyph unicode="&#x3b9;" horiz-adv-x="278" d="M222 114l13 -11q-42 -65 -71 -89.5t-66 -24.5q-49 0 -49 55q0 29 22 111l48 177q9 32 9 44q0 15 -11.5 19t-52.5 5v16q46 4 160 25l4 -3l-94 -343q-10 -34 -10 -44q0 -15 14 -15q25 0 84 78z" />
+<glyph unicode="&#x3ba;" horiz-adv-x="444" d="M153 225l3 1q133 171 229 210q13 5 26 5q26 0 40 -13.5t14 -33.5q0 -21 -13 -33.5t-33 -12.5q-12 0 -28 9.5t-26 9.5q-26 0 -54 -22.5t-90 -87.5l98 -172q25 -44 42 -56.5t49 -12.5v-16q-39 -13 -69 -13q-62 0 -98 64l-93 160l-60 -211h-76l86 309q14 53 14 67 q0 24 -33 24h-28v14q53 7 151 27l3 -3z" />
+<glyph unicode="&#x3bb;" horiz-adv-x="458" d="M415 123h16q-31 -139 -101 -139q-23 0 -38 23.5t-15 70.5q0 27 2.5 61t7 87t6.5 89l-209 -315h-96l310 428q4 36 4 79q0 108 -49 108q-14 0 -33 -18t-32 -56h-16q33 137 101 137q28 0 46 -35t18 -100q0 -68 -10 -200.5t-10 -195.5q0 -53 9.5 -76.5t31.5 -23.5q30 0 57 76 z" />
+<glyph unicode="&#x3bc;" horiz-adv-x="526" d="M469 117l14 -9q-46 -71 -74.5 -95t-62.5 -24q-21 0 -35 12t-14 33q0 31 15 76l33 104h-1q-68 -121 -113.5 -172t-89.5 -51q-28 0 -36 28l-19 -77l-16 -60q-4 -19 -10 -39t-11 -30t-11 -18h-71q24 35 44 112l131 521h75l-75 -298q-4 -18 -4 -27q0 -48 40 -48t105 96.5 t80 154.5l33 122h77l-79 -300q-19 -76 -19 -77q0 -15 11 -15q12 0 28.5 15.5t54.5 65.5z" />
+<glyph unicode="&#x3bd;" horiz-adv-x="470" d="M443 434l16 -4q-11 -64 -29 -122t-51.5 -118t-77 -103.5t-109 -72.5t-144.5 -32q-28 0 -28 22q0 6 3 13l92 333q2 10 2 17q0 16 -15 21t-50 6v16l163 31l3 -2l-105 -378q232 22 330 373z" />
+<glyph unicode="&#x3be;" horiz-adv-x="454" d="M296 683l4 -16q-73 -24 -73 -72q0 -24 29 -29q91 61 143 61q47 0 47 -31q0 -30 -39.5 -47.5t-116.5 -17.5q-37 0 -61 -34t-24 -61q0 -34 26 -53q59 41 138 41q53 0 53 -30q0 -18 -13 -30.5t-33 -18.5t-37 -8.5t-32 -2.5q-29 0 -72 13q-54 -18 -103.5 -75t-50.5 -109 q0 -49 27.5 -71t81.5 -22q7 0 21 0.5t17 0.5q63 0 97 -25t34 -67q0 -45 -28 -85q-22 -34 -61 -56.5t-73 -22.5q-28 0 -47.5 13t-19.5 39q0 17 12 29.5t31 12.5q16 0 34.5 -14.5t30.5 -14.5q33 0 57 19.5t24 49.5q0 50 -76 50q-13 0 -44.5 -5t-46.5 -5q-122 0 -122 118 q1 82 49.5 151t125.5 107q-37 25 -37 63q0 59 58 107q-13 0 -30 13.5t-17 31.5q0 73 117 103z" />
+<glyph unicode="&#x3bf;" d="M468 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM384 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5 q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#x3c0;" horiz-adv-x="504" d="M536 428l-21 -74h-102q-3 -11 -22 -76l-32 -110q-13 -47 -13 -56q0 -42 31 -42q44 0 71 61h16q-13 -55 -49.5 -98.5t-87.5 -43.5q-30 0 -44.5 21.5t-14.5 53.5q0 34 17 80l76 210h-104q-12 -32 -38 -124.5t-52 -149.5t-62 -86q-17 -12 -36 -12q-20 0 -35 13t-15 31 q0 41 30 49q50 13 72 70l82 209h-6q-45 0 -69 -9t-54 -46h-16q42 70 87.5 99.5t119.5 29.5h271z" />
+<glyph unicode="&#x3c1;" horiz-adv-x="504" d="M-9 -135l75 286q34 132 103 211t150 79q23 0 37 -1t38.5 -8t39 -20.5t26 -41t11.5 -66.5q0 -115 -95.5 -215t-202.5 -100q-38 0 -68 17l-36 -141q-10 -41 -31 -70h-78q20 31 31 70zM382 312q0 46 -17.5 77t-48.5 31q-43 0 -86 -51t-65 -130q-46 -166 -46 -194 q0 -16 14 -26.5t35 -10.5q62 1 113 53t76 120.5t25 130.5z" />
+<glyph unicode="&#x3c2;" horiz-adv-x="454" d="M453 386q0 -54 -50 -54q-12 0 -44 5.5t-49 5.5q-90 0 -159.5 -51.5t-69.5 -128.5q0 -49 27.5 -71t81.5 -22q7 0 21 0.5t17 0.5q63 0 97 -25t34 -67q0 -45 -28 -85q-22 -34 -61 -56.5t-73 -22.5q-28 0 -47.5 13t-19.5 39q0 17 12 29.5t31 12.5q16 0 34.5 -14.5t30.5 -14.5 q33 0 57 19.5t24 49.5q0 50 -76 50q-13 0 -44.5 -5t-46.5 -5q-122 0 -122 118q0 88 53 166.5t131 123t154 44.5q31 0 58 -14t27 -41z" />
+<glyph unicode="&#x3c3;" horiz-adv-x="498" d="M531 428l-18 -74h-170q15 -24 41 -44.5t40.5 -40t14.5 -52.5q0 -84 -81.5 -156t-184.5 -72q-70 0 -108 37.5t-38 103.5q0 69 37 136.5t110 114.5t163 47h194zM355 221q0 46 -16.5 82t-41.5 51q-58 0 -122 -77.5t-64 -176.5q0 -44 21 -67t57 -23q67 0 116.5 72t49.5 139z " />
+<glyph unicode="&#x3c4;" horiz-adv-x="410" d="M426 428l-21 -74h-133q-70 -159 -70 -238q0 -51 36 -51q18 0 40 20.5t35 48.5h16q-18 -61 -58.5 -103t-86.5 -42q-64 0 -64 71q0 79 98 294h-61q-80 0 -129 -88h-16q25 61 77 111.5t119 50.5h218z" />
+<glyph unicode="&#x3c5;" horiz-adv-x="478" d="M276 426v15q85 0 127.5 -29.5t42.5 -108.5q0 -47 -21.5 -101.5t-56.5 -101.5t-85.5 -78.5t-103.5 -31.5q-134 0 -134 104q0 42 32 146l28 93q8 29 8 39q0 14 -12 14q-22 0 -69 -60l-13 9q70 106 131 106q44 0 44 -45q0 -25 -8 -52l-50 -181q-11 -39 -11 -74q0 -78 57 -78 q50 0 93.5 59.5t65 131.5t21.5 125q0 54 -20 74t-66 25z" />
+<glyph unicode="&#x3c6;" horiz-adv-x="622" d="M219 10l47 167q14 51 30 90.5t39.5 79.5t56.5 62t72 22q126 0 126 -127q0 -53 -23.5 -112.5t-74.5 -114t-118 -76.5q-39 -12 -85 -12l-53 -194h-77l54 194q-83 0 -112 11q-74 29 -74 127q0 77 49.5 158.5t122.5 123.5q57 32 99 32v-16q-51 -13 -95 -68.5t-68 -125 t-24 -131.5q0 -50 28 -70t80 -20zM359 249l-64 -239q41 0 69 15q56 30 99 126.5t43 176.5q0 36 -7 55t-15 23t-21 4q-33 0 -57.5 -40.5t-46.5 -120.5z" />
+<glyph unicode="&#x3c7;" horiz-adv-x="457" d="M498 428l-285 -353q-1 -26 -1 -69q0 -89 10.5 -119.5t34.5 -30.5q12 0 28 18.5t29 55.5h16q-27 -137 -93 -137q-32 0 -47.5 36.5t-15.5 91.5q0 74 8 124l-197 -244h-93l287 345v89q0 76 -9.5 109.5t-35.5 33.5q-13 0 -30.5 -17.5t-30.5 -55.5h-16q8 30 15 50t18.5 42 t27.5 33t37 11q29 0 43.5 -32t14.5 -112q0 -3 -0.5 -13t-1.5 -38.5t-2 -71.5l196 254h93z" />
+<glyph unicode="&#x3c8;" horiz-adv-x="584" d="M668 441v-16q-28 -5 -50 -22t-35 -35t-25 -52t-16 -52l-14 -56q-50 -219 -259 -219l-54 -194h-76l54 194h-9q-69 0 -98 21q-53 38 -53 125q0 37 19 102t19 98q0 84 -56 90l1 16h53q83 0 83 -102q0 -28 -17.5 -109t-17.5 -110q0 -58 20.5 -84t61.5 -26l115 418h76 l-115 -418q37 0 68 21q75 53 105 187q10 43 17 68t22.5 58.5t34.5 51.5t51 31.5t73 13.5h22z" />
+<glyph unicode="&#x3c9;" horiz-adv-x="686" d="M472 439h18q80 0 119 -33q45 -38 45 -121q0 -73 -43 -154q-38 -70 -90 -106t-104 -36q-36 0 -60.5 11.5t-34 24.5t-19.5 35q-31 -37 -63.5 -54t-83.5 -17q-53 0 -91 36t-38 105q0 42 10 81q26 96 101 162t176 66h18v-16q-81 0 -134 -65q-38 -47 -62.5 -119.5 t-24.5 -134.5q0 -94 57 -94q33 0 70 34.5t52 76.5q-3 23 -3 51q0 41 12 86q11 42 33 71t48 29q35 0 35 -46q0 -73 -42 -146q-18 -32 -31 -51q-2 -7 -2 -21q0 -34 17.5 -59t47.5 -25q70 0 117 88q22 42 35 100.5t13 109.5q0 42 -5 61q-8 32 -32 43t-61 11v16z" />
+<glyph unicode="&#x3ca;" horiz-adv-x="278" d="M222 114l13 -11q-42 -65 -71 -89.5t-66 -24.5q-49 0 -49 55q0 29 22 111l48 177q9 32 9 44q0 15 -11.5 19t-52.5 5v16q46 4 160 25l4 -3l-94 -343q-10 -34 -10 -44q0 -15 14 -15q25 0 84 78zM159 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5 q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM359 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34z" />
+<glyph unicode="&#x3cb;" horiz-adv-x="478" d="M276 426v15q85 0 127.5 -29.5t42.5 -108.5q0 -47 -21.5 -101.5t-56.5 -101.5t-85.5 -78.5t-103.5 -31.5q-134 0 -134 104q0 42 32 146l28 93q8 29 8 39q0 14 -12 14q-22 0 -69 -60l-13 9q70 106 131 106q44 0 44 -45q0 -25 -8 -52l-50 -181q-11 -39 -11 -74q0 -78 57 -78 q50 0 93.5 59.5t65 131.5t21.5 125q0 54 -20 74t-66 25zM221 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM421 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14 q19 0 33.5 -15t14.5 -34z" />
+<glyph unicode="&#x3cc;" d="M263 494l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34zM468 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM384 326q0 45 -19 69.5 t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#x3cd;" horiz-adv-x="478" d="M276 426v15q85 0 127.5 -29.5t42.5 -108.5q0 -47 -21.5 -101.5t-56.5 -101.5t-85.5 -78.5t-103.5 -31.5q-134 0 -134 104q0 42 32 146l28 93q8 29 8 39q0 14 -12 14q-22 0 -69 -60l-13 9q70 106 131 106q44 0 44 -45q0 -25 -8 -52l-50 -181q-11 -39 -11 -74q0 -78 57 -78 q50 0 93.5 59.5t65 131.5t21.5 125q0 54 -20 74t-66 25zM216 494l94 132q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34z" />
+<glyph unicode="&#x3ce;" horiz-adv-x="686" d="M472 439h18q80 0 119 -33q45 -38 45 -121q0 -73 -43 -154q-38 -70 -90 -106t-104 -36q-36 0 -60.5 11.5t-34 24.5t-19.5 35q-31 -37 -63.5 -54t-83.5 -17q-53 0 -91 36t-38 105q0 42 10 81q26 96 101 162t176 66h18v-16q-81 0 -134 -65q-38 -47 -62.5 -119.5 t-24.5 -134.5q0 -94 57 -94q33 0 70 34.5t52 76.5q-3 23 -3 51q0 41 12 86q11 42 33 71t48 29q35 0 35 -46q0 -73 -42 -146q-18 -32 -31 -51q-2 -7 -2 -21q0 -34 17.5 -59t47.5 -25q70 0 117 88q22 42 35 100.5t13 109.5q0 42 -5 61q-8 32 -32 43t-61 11v16zM355 494l94 132 q17 23 43 23q9 0 17 -6t8 -16q0 -15 -40 -52l-88 -81h-34z" />
+<glyph unicode="&#x3d0;" horiz-adv-x="456" d="M436 617q0 -33 -22 -60t-55 -42q-56 -26 -162 -26q-20 0 -29 1q-62 -87 -96 -243q29 43 50 68.5t59 48t81 22.5q60 0 92 -50.5t32 -114.5q0 -86 -56 -158.5t-139 -72.5q-43 0 -73 20t-45 54t-21.5 69.5t-6.5 75.5q0 132 44.5 252t138.5 189q60 44 104 44q42 0 73 -19 t31 -58zM183 515h7q60 0 97.5 9.5t72.5 43.5q39 37 39 72q0 14 -9 24t-23 10q-48 0 -99.5 -51t-84.5 -108zM346 268q0 30 -17 52.5t-46 22.5q-38 0 -82.5 -43.5t-73 -98.5t-28.5 -92q0 -30 16 -54.5t44 -24.5q53 0 120 91t67 147z" />
+<glyph unicode="&#x3d1;" horiz-adv-x="556" d="M526 206l-5 -19q-37 3 -71 12q-39 -92 -99 -150.5t-140 -58.5q-134 0 -134 104q0 30 7 53l21 65q8 24 8 39q0 14 -12 14q-22 0 -69 -60l-13 9q70 106 131 106q44 0 44 -45q0 -25 -8 -52l-18 -60q-11 -39 -11 -74q0 -78 57 -78q107 0 168 212q-92 40 -150 112t-58 157 q0 88 55 140q49 46 122 46q54 0 90.5 -30.5t50.5 -73t14 -93.5q0 -129 -47 -257q42 -14 67 -18zM422 484q0 161 -79 161q-41 0 -63 -43.5t-22 -103.5q0 -38 9 -76t41 -86.5t84 -79.5q30 121 30 228z" />
+<glyph unicode="&#x3d2;" horiz-adv-x="596" d="M347 408h3q111 260 259 260q38 0 61 -22.5t23 -54.5q0 -76 -62 -76q-20 0 -33 12.5t-13 32.5q0 18 9.5 29t18.5 15t9 5q0 13 -20 13q-47 0 -94 -41.5t-82.5 -105t-59.5 -119.5t-38 -105l-41 -140q-9 -30 -9 -55q0 -19 11.5 -27t41.5 -10l36 -3v-16h-289v16q51 3 72.5 19 t34.5 63l56 197q10 66 10 128q0 105 -24.5 149t-84.5 44q-20 0 -46 -11l-7 14q36 26 61.5 37.5t57.5 11.5q74 0 108.5 -49t34.5 -149q0 -31 -4 -62z" />
+<glyph unicode="&#x3d5;" horiz-adv-x="627" d="M481 683l-67 -242q70 0 101 -12q80 -31 80 -126q0 -36 -12.5 -77t-38.5 -83t-61.5 -76.5t-86 -56t-107.5 -21.5l-54 -194h-78l54 194q-73 0 -107 11q-77 25 -77 128q0 31 13 71t38.5 82.5t60 78t83 58.5t100.5 23h15l67 242h77zM408 420l-113 -410q37 0 69 16 q57 29 102 130t45 171q0 58 -45 86q-12 7 -58 7zM217 10l114 410q-56 0 -108 -50.5t-82 -124.5t-30 -144q0 -64 48 -83q21 -8 58 -8z" />
+<glyph unicode="&#x3d6;" horiz-adv-x="792" d="M832 428l-22 -74h-64q8 -32 8 -69q0 -73 -43 -154q-38 -70 -90 -106t-104 -36q-51 0 -74.5 18t-39.5 54q-31 -39 -63 -55.5t-84 -16.5q-53 0 -91 36t-38 105q0 42 10 81q21 76 78 143h-35q-46 0 -79 -25.5t-68 -72.5h-16q24 60 80.5 116t120.5 56h614zM664 354h-370 q-35 -47 -59 -119t-24 -131q0 -94 57 -94q35 0 73.5 37t48.5 74q-2 15 -2 59t23 86t56 42q32 0 32 -46q0 -59 -57 -147q-2 -7 -2 -21q0 -34 17.5 -59t47.5 -25q44 0 78.5 33.5t52 83.5t26 96.5t8.5 84.5q0 20 -6 46z" />
+<glyph unicode="&#x3d8;" horiz-adv-x="722" d="M210 -114l27 99q-82 12 -129.5 72.5t-47.5 158.5q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182q0 -107 -57.5 -205t-149.5 -160q-76 -51 -159 -66l-17 -61q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-244v16q42 8 57.5 21t26.5 54zM594 481 q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#x3d9;" d="M92 -205l54 196q-57 7 -88 42.5t-31 94.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5q0 -57 -28.5 -118.5t-77.5 -110.5q-61 -61 -135 -77l-56 -200h-79zM384 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5 t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#x3da;" horiz-adv-x="673" d="M141 -124l18 16q18 -25 60 -39.5t82 -14.5q74 0 124.5 36t50.5 93q0 44 -32 70q-42 34 -174 50q-47 5 -81.5 14.5t-67 27.5t-49.5 49t-17 74q0 84 44.5 162.5t113.5 132.5t153 86.5t163 32.5q136 0 136 -69q0 -25 -13.5 -39t-39.5 -14q-17 0 -30.5 10t-22.5 22t-31 22 t-54 10q-75 0 -150 -38t-126 -107t-51 -148q0 -40 20 -66t56.5 -38t74.5 -19l86 -15q49 -9 81 -22q52 -20 76.5 -56t24.5 -76q0 -110 -75 -170t-177 -60q-118 0 -173 83z" />
+<glyph unicode="&#x3db;" horiz-adv-x="444" d="M467 458h15q-14 -166 -100 -213q-38 -20 -136 -20q-78 0 -121.5 -19t-43.5 -73q0 -65 77 -65q11 0 41.5 9t44.5 9q60 0 87.5 -30.5t27.5 -76.5q0 -45 -28 -85q-22 -34 -61 -56.5t-73 -22.5q-28 0 -47.5 13t-19.5 39q0 17 12 29.5t31 12.5q16 0 34.5 -14.5t30.5 -14.5 q33 0 57 19.5t24 49.5q0 50 -76 50q-13 0 -44.5 -5t-46.5 -5q-48 0 -85 27t-37 81q0 81 64 140q72 66 204 75q133 9 169 146z" />
+<glyph unicode="&#x3dc;" horiz-adv-x="557" d="M645 653l-32 -154l-21 2q3 22 3 33q0 39 -14 55.5t-54 23.5t-131 7q-35 0 -49 -6.5t-19 -25.5l-64 -227h205l-11 -36h-204l-58 -210q-14 -50 -14 -60q0 -18 17 -27t60 -12v-16h-251v16q41 3 56 19t27 59l123 442q10 36 10 61q0 21 -13.5 28.5t-62.5 11.5v16h497z" />
+<glyph unicode="&#x3dd;" horiz-adv-x="487" d="M472 433l-13 -56h-219l-60 -255h180l-9 -37h-180l-64 -275h-75l146 623h294z" />
+<glyph unicode="&#x3de;" horiz-adv-x="645" d="M675 498l-267 -354q-38 -51 -38 -73q0 -37 35 -37q48 0 91 35l8 -15q-85 -72 -146 -72q-40 0 -60 21t-20 50q0 34 18 63.5t82 98.5l162 172l-511 -144l-10 13l278 355q38 46 38 75q0 16 -10 25.5t-25 9.5q-48 0 -91 -35l-8 15q46 38 79 55t67 17q41 0 60.5 -19t19.5 -47 q0 -32 -21 -62.5t-92 -105.5l-162 -172l515 145z" />
+<glyph unicode="&#x3df;" horiz-adv-x="457" d="M445 381l-294 -381h-100l290 307h-310l294 376h100l-290 -302h310z" />
+<glyph unicode="&#x3e0;" horiz-adv-x="708" d="M23 503l-16 18q95 78 181 111.5t183 33.5q129 0 213 -89t84 -236q0 -215 -132 -373t-320 -175v23q97 21 177 98.5t122 179t42 201.5q0 63 -13 120q-57 -10 -108 -56t-87 -111t-60 -127.5t-37 -120.5h-94q14 59 46.5 128t79 137t113 119.5t136.5 66.5q-26 71 -90.5 113 t-143.5 42q-24 0 -45 -4l-75 -280h-43l72 270q-99 -26 -185 -89z" />
+<glyph unicode="&#x3e1;" horiz-adv-x="528" d="M93 532l10 20q261 -79 325 -291q20 -65 20 -137q0 -186 -105 -334l-18 11l11 27q7 16 11.5 28.5t8.5 25.5q21 78 21 156q0 52 -11 115l-180 -90l-9 27l183 92q-10 48 -32 104l-184 -92l-9 28l181 90q-67 143 -223 220z" />
+<glyph unicode="&#x3f0;" horiz-adv-x="533" d="M559 428l-156 -145q-20 -31 -41.5 -84.5t-21.5 -85.5q0 -41 49 -41q25 0 38 -11t13 -27q0 -19 -16 -33t-43 -14q-35 0 -59 23.5t-24 63.5q0 60 48 154l-1 1l-252 -229h-109l148 136q13 22 34 87t21 103q0 17 -6 22.5t-20 5.5q-12 0 -19 1t-17 4.5t-14.5 12.5t-4.5 24 q0 20 17 32.5t36 12.5q31 0 49.5 -20t18.5 -57q0 -72 -45 -181l1 -1l268 246h108z" />
+<glyph unicode="&#x3f1;" horiz-adv-x="516" d="M313 -205h-16q3 6 3 12q0 17 -28 29t-68 25t-80.5 32.5t-68.5 61t-28 100.5q0 149 86 261q41 54 103.5 89.5t126.5 35.5q62 0 101.5 -37.5t39.5 -102.5q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-77 0 -110 57l-2 -1q4 -47 33.5 -73t68 -34t76.5 -13.5t64 -21 t26 -46.5q0 -33 -33 -62zM400 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#x3f4;" horiz-adv-x="722" d="M699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM197 359h381q16 64 16 122q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-49 -65 -82 -157zM567 317h-383 q-19 -69 -19 -133q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q64 79 102 207z" />
+<glyph unicode="&#x3f5;" horiz-adv-x="444" d="M420 441l-18 -129h-16q-16 107 -99 107q-48 0 -94.5 -57.5t-59.5 -116.5h179l-6 -32h-180q-10 -31 -10 -68q0 -56 23 -88t66 -32q40 0 70.5 18t76.5 64l16 -10q-47 -58 -88.5 -83t-111.5 -25q-66 0 -102 43t-36 108q0 71 35.5 140.5t97.5 115t130 45.5q27 0 53 -8.5 t37 -8.5q15 0 21 17h16z" />
+<glyph unicode="&#x3f6;" horiz-adv-x="444" d="M92 323l-16 10q47 58 88.5 83t111.5 25q66 0 102 -43t36 -108q0 -71 -35.5 -140.5t-97.5 -115t-130 -45.5q-27 0 -53 8.5t-37 8.5q-15 0 -21 -17h-16l18 129h16q16 -107 99 -107q48 0 94.5 57.5t59.5 116.5h-179l6 32h180q10 31 10 68q0 56 -23 88t-66 32 q-40 0 -70.5 -18t-76.5 -64z" />
+<glyph unicode="&#x401;" horiz-adv-x="611" d="M631 653l-31 -154l-22 2q3 25 3 46q0 45 -37.5 59t-155.5 14q-42 0 -55 -4.5t-18 -21.5l-63 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 32 -17.5 39t-67.5 7h-78l-31 -112q-35 -126 -35 -146q0 -34 79 -34q127 0 201 39q38 20 94 98l16 -8l-62 -162 h-504v16q43 8 56 19.5t25 54.5l119 442q11 44 11 64t-15.5 28.5t-61.5 12.5v16h496zM385 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM585 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5 q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34z" />
+<glyph unicode="&#x402;" horiz-adv-x="723" d="M341 336h1q94 88 196 88q125 0 125 -108q0 -97 -50.5 -246.5t-112.5 -214.5q-60 -63 -125 -63q-39 0 -65 24.5t-26 57.5q0 32 16 53t46 21q21 0 36 -13t15 -36q0 -19 -14 -33t-14 -18q0 -19 23 -19q31 0 73 101.5t70 210.5t28 146q0 41 -13 65.5t-52 24.5 q-40 0 -77.5 -19.5t-91.5 -63.5l-45 -166q-16 -62 -16 -70q0 -41 70 -42v-16h-268v16q54 5 75 19t32 56l140 526h-51q-77 0 -111 -25t-66 -98l-18 4l42 155h512l-43 -159l-18 2q3 17 3 41q0 80 -102 80h-50z" />
+<glyph unicode="&#x403;" horiz-adv-x="569" d="M603 653l-44 -164l-17 2q3 18 3 48q0 78 -101 78h-158l-132 -489q-15 -58 -15 -73q0 -18 16.5 -27t59.5 -12v-16h-251v16q42 3 56.5 18.5t26.5 59.5l123 442q10 36 10 61q0 21 -13.5 30.5t-47.5 9.5v16h484zM355 744l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5 q0 -18 -17 -28l-171 -106h-35z" />
+<glyph unicode="&#x404;" horiz-adv-x="657" d="M680 664l-37 -198l-18 1q-9 83 -42 123t-97 40q-109 0 -199 -97q-66 -70 -93 -175h266l-13 -42h-261q-7 -39 -7 -84q0 -101 49 -157t126 -56q51 0 87.5 13.5t36.5 40.5q0 5 -5.5 17t-5.5 25q0 30 18 48t47 18q22 0 36 -15t14 -34q0 -44 -40 -82q-68 -68 -214 -68 q-117 0 -189 69.5t-72 191.5q0 103 51 196.5t136 153.5q102 73 219 73q59 0 107 -17q20 -7 41 -7q27 0 38 22h21z" />
+<glyph unicode="&#x405;" d="M498 667l-40 -200l-18 3q0 83 -25 123t-94 40q-52 0 -82 -26.5t-30 -73.5q0 -38 16 -63.5t83 -92.5q67 -68 90 -109t23 -91q0 -85 -57.5 -140t-144.5 -55q-38 0 -104 23q-32 12 -47 12q-33 0 -43 -32h-18l34 224l20 -2q-2 -9 -2 -23q0 -73 40.5 -120t103.5 -47 q58 0 94.5 35.5t36.5 92.5q0 33 -13 59.5t-47 63.5l-39 42q-3 3 -17 18.5t-22 23.5q-45 48 -60 78.5t-15 71.5q0 76 51.5 120t126.5 44q52 0 85 -14q29 -11 46 -11t26 5t19 21h23z" />
+<glyph unicode="&#x406;" horiz-adv-x="333" d="M382 653v-16q-42 -5 -55.5 -18t-26.5 -59l-116 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-245v16q42 8 57.5 21t26.5 54l117 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247z" />
+<glyph unicode="&#x407;" horiz-adv-x="333" d="M358 653v-16q-42 -5 -55.5 -18t-26.5 -59l-116 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-245v16q42 8 57.5 21t26.5 54l117 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h247zM233 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34 t35.5 14q19 0 33.5 -15t14.5 -34zM433 807q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34z" />
+<glyph unicode="&#x408;" horiz-adv-x="444" d="M463 653v-16q-43 -6 -56 -17.5t-26 -56.5l-103 -367q-29 -104 -71 -159t-124 -55q-53 0 -85 24t-32 64q0 24 12.5 40t32.5 16t35.5 -13.5t15.5 -32.5q0 -6 -1.5 -14.5t-1.5 -12.5q0 -39 35 -39t53 64l127 454q12 44 12 64t-15 28.5t-62 12.5v16h254z" />
+<glyph unicode="&#x409;" horiz-adv-x="961" d="M588 364h87q226 0 226 -132q0 -104 -81 -168t-201 -64h-286v16q41 6 56 20.5t27 59.5l129 480q4 16 4 22q0 19 -26 19h-119q-20 0 -29.5 -8.5t-14.5 -29.5l-89 -323q-47 -171 -101 -226q-44 -46 -114 -46q-36 0 -63.5 22.5t-27.5 55.5q0 55 53 55q19 0 30 -12t14 -27 t12.5 -27t26.5 -12q41 0 71 59t65 187l70 259q8 32 8 47q0 26 -15 35.5t-48 10.5l5 16h464v-16q-63 -8 -75 -55zM578 328l-50 -186q-15 -45 -15 -64q0 -42 67 -42q93 0 151 45.5t58 144.5q0 102 -140 102h-71z" />
+<glyph unicode="&#x40a;" horiz-adv-x="966" d="M591 364h89q112 0 156 -21q31 -15 50.5 -45t19.5 -70q0 -103 -81 -165.5t-201 -62.5h-286v16q41 6 56 20.5t27 59.5l63 232h-267l-67 -246q-3 -10 -3 -22q0 -22 12.5 -30t57.5 -14v-16h-245v16q41 4 57 20.5t30 65.5l117 430q12 46 12 64q0 21 -14.5 28.5t-62.5 12.5v16 h271v-16q-45 -3 -67.5 -19t-32.5 -52l-55 -202h267l44 168q12 44 12 62q0 21 -14 29.5t-57 13.5v16h247v-16q-63 -8 -76 -55zM583 328l-51 -186q-14 -42 -14 -64q0 -42 66 -42q93 0 151.5 45.5t58.5 144.5q0 102 -138 102h-73z" />
+<glyph unicode="&#x40b;" horiz-adv-x="786" d="M701 0h-269v16q50 4 69 20.5t30 56.5l21 77q22 80 22 118q0 89 -76 89q-40 0 -77.5 -19.5t-91.5 -63.5l-51 -183q-10 -38 -10 -52q0 -22 15.5 -31t54.5 -12v-16h-268v16q53 5 73 18.5t32 56.5l143 526h-51q-78 0 -112 -25t-66 -98l-18 4l42 155h512l-43 -159l-18 2 q3 17 3 41q0 80 -101 80h-50l-75 -281h1q90 88 196 88q62 0 99 -27.5t37 -81.5q0 -49 -12 -93l-34 -128q-6 -24 -6 -39q0 -18 16 -26t63 -13v-16z" />
+<glyph unicode="&#x40c;" horiz-adv-x="621" d="M225 370h28q77 0 119 39t82 121q32 66 59 94q35 37 84 37q23 0 41.5 -15.5t18.5 -35.5q0 -54 -50 -54q-18 0 -33.5 20t-21.5 20q-7 0 -14 -5t-12.5 -12t-12 -17.5t-10 -17.5t-8 -17t-5.5 -11q-42 -80 -77 -119t-90 -55v-2q30 -18 46.5 -39.5t37.5 -67.5l67 -151 q23 -40 40 -50.5t64 -15.5v-16h-165l-114 248q-3 6 -7 16l-6 14l-6 11.5t-5.5 10t-5 7.5t-5.5 7l-6 4q-4 3 -8 4.5t-9 2.5q-13 3 -27 3l-57 -217q-11 -44 -11 -51q0 -23 14.5 -31.5t56.5 -12.5v-16h-245v16q43 5 57 18t24 53l118 445q14 50 14 62q0 21 -17 31t-62 12v16h270 v-16q-42 -3 -65 -18.5t-34 -55.5zM340 744l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35z" />
+<glyph unicode="&#x40e;" horiz-adv-x="656" d="M629 831q0 -45 -45 -72.5t-98 -27.5q-52 0 -98 27.5t-46 72.5q0 28 17 42t36 14q16 0 28 -10.5t12 -27.5t-8.5 -27t-8.5 -16q0 -17 17.5 -30t50.5 -13t50 12.5t17 30.5q0 6 -8.5 16.5t-8.5 27.5q0 16 13 26.5t30 10.5q19 0 34.5 -14t15.5 -42zM716 653v-16 q-40 -4 -66.5 -25t-62.5 -86l-221 -394q-81 -146 -173 -146q-34 0 -58.5 18t-24.5 48q0 31 16.5 46t36.5 15q21 0 33 -12t14 -27t5 -27t10 -12q28 0 65 49t67 117l-84 281q-30 102 -44 124t-55 31v16h239v-16l-26 -3q-27 -3 -38 -11t-11 -27q0 -15 5 -33l79 -261l145 262 q20 38 20 48q0 25 -60 25v16h189z" />
+<glyph unicode="&#x40f;" horiz-adv-x="722" d="M747 653v-16q-44 -8 -58 -20t-25 -54l-117 -442q-14 -49 -14 -63q0 -21 14 -29t57 -13l-4 -16h-182q-72 0 -126 -75q-21 -29 -42 -104h-19q9 41 9 80q0 99 -84 99h-181v16q42 4 57.5 20.5t28.5 65.5l115 430q12 45 12 64q0 21 -14 28.5t-63 12.5v16h271v-16 q-46 -4 -68 -19.5t-32 -51.5l-131 -491q-4 -18 -4 -21q0 -18 28 -18h214q20 0 29.5 8t16.5 32l132 495q3 11 3 22q0 20 -15.5 30.5t-55.5 13.5v16h248z" />
+<glyph unicode="&#x410;" horiz-adv-x="611" d="M566 0h-245v16q45 2 61 14t16 39q0 8 -2 26l-20 131h-220l-59 -111q-22 -41 -22 -66q0 -30 62 -33v-16h-186v16q34 7 55.5 32t78.5 124l285 496h26l92 -553q10 -62 24 -79t54 -20v-16zM371 262l-45 263l-149 -263h194z" />
+<glyph unicode="&#x411;" horiz-adv-x="590" d="M603 653l-44 -165l-17 3q3 33 3 47q0 79 -103 79h-93q-32 0 -45 -6t-19 -29l-58 -218h87q226 0 226 -132q0 -104 -81 -168t-201 -64h-286v16q41 6 57.5 21.5t28.5 59.5l117 435q12 44 12 62q0 21 -13.5 29.5t-56.5 13.5v16h486zM217 328l-51 -187q-13 -39 -13 -63 q0 -42 66 -42q86 0 132.5 28.5t69.5 112.5q7 25 7 49q0 102 -140 102h-71z" />
+<glyph unicode="&#x412;" horiz-adv-x="597" d="M113 653h250q102 0 155 -34.5t53 -95.5q0 -74 -49.5 -116.5t-125.5 -55.5v-1q128 -39 128 -150q0 -98 -74.5 -149t-200.5 -51h-272v16q43 6 59 20.5t28 59.5l115 436q11 39 11 64q0 22 -15 29.5t-62 11.5v16zM232 365h37q201 0 201 150q0 55 -27.5 78.5t-89.5 23.5 q-23 0 -32 -1.5t-17 -9t-13 -25.5zM222 329l-32 -117q-32 -116 -32 -134q0 -42 67 -42q89 0 140 41.5t51 122.5q0 45 -19.5 77t-49.5 42q-29 10 -125 10z" />
+<glyph unicode="&#x413;" horiz-adv-x="569" d="M603 653l-44 -164l-17 2q3 18 3 48q0 78 -101 78h-158l-132 -489q-15 -58 -15 -73q0 -18 16.5 -27t59.5 -12v-16h-251v16q42 3 56.5 18.5t26.5 59.5l123 442q10 36 10 61q0 21 -13.5 30.5t-47.5 9.5v16h484z" />
+<glyph unicode="&#x414;" horiz-adv-x="655" d="M696 653v-16q-43 -6 -57.5 -18.5t-26.5 -56.5l-120 -448q-9 -36 -9 -52q0 -46 67 -46l-52 -195h-19q9 63 9 80q0 58 -25.5 78.5t-71.5 20.5h-306q-99 0 -169 -179h-19l53 195h19q76 0 138 118t142 410q8 27 8 47q0 26 -15 35.5t-49 10.5l5 16h498zM387 81l134 501 q3 10 3 18q0 17 -28 17h-151q-20 0 -28.5 -8t-14.5 -27q-67 -243 -113.5 -365t-100.5 -181h251q36 0 48 45z" />
+<glyph unicode="&#x415;" horiz-adv-x="611" d="M631 653l-31 -154l-22 2q3 25 3 46q0 45 -37.5 59t-155.5 14q-42 0 -55 -4.5t-18 -21.5l-63 -233h78q66 0 88 16t51 81l18 -4l-68 -232l-20 5q7 31 7 52q0 32 -17.5 39t-67.5 7h-78l-31 -112q-35 -126 -35 -146q0 -34 79 -34q127 0 201 39q38 20 94 98l16 -8l-62 -162 h-504v16q43 8 56 19.5t25 54.5l119 442q11 44 11 64t-15.5 28.5t-61.5 12.5v16h496z" />
+<glyph unicode="&#x416;" horiz-adv-x="956" d="M548 370h17q62 0 108 26q59 35 108 134q36 74 56 95q19 20 34 28t41 8q23 0 41.5 -15.5t18.5 -35.5q0 -54 -46 -54q-18 0 -29.5 20t-17.5 20q-19 0 -37 -32l-47 -84q-28 -51 -59 -80q-47 -43 -97 -58v-2q30 -18 46.5 -39.5t37.5 -67.5l67 -151q23 -40 40 -50.5t64 -15.5 v-16h-165l-114 248q-20 44 -30 57.5t-31 19.5q-14 3 -16 3l-57 -217q-11 -44 -11 -51q0 -24 11.5 -32t51.5 -12v-16h-251v16q46 5 64.5 18.5t28.5 52.5l65 241q-35 0 -61.5 -14.5t-66.5 -63.5l-204 -250h-163v16q49 5 64 13.5t51 52.5l146 180q64 78 140 81v2 q-73 36 -73 119q0 13 2.5 41t2.5 43q0 53 -19 53q-6 0 -27 -22t-39 -22q-22 0 -33.5 14t-11.5 31q0 23 24 41t57 18q88 0 88 -96q0 -13 -2.5 -47t-2.5 -45q0 -61 31.5 -82t96.5 -21h10l44 162q14 50 14 62q0 21 -17 31t-62 12v16h270v-16q-42 -3 -65 -18.5t-34 -55.5z" />
+<glyph unicode="&#x417;" horiz-adv-x="564" d="M184 667v-3q0 -18 34 -18q17 0 53 9q46 13 100 13q92 0 134.5 -42.5t42.5 -105.5q0 -61 -47 -108q-55 -55 -116 -61v-2q42 -6 80 -38.5t38 -90.5q0 -77 -46 -132t-119 -81q-64 -23 -151 -23q-86 0 -132 36t-46 99q0 31 14.5 51.5t44.5 20.5q26 0 39 -14t13 -36 q0 -17 -16 -38q-3 -4 -9.5 -10.5t-9 -11t-2.5 -8.5q0 -22 32 -37t77 -15q91 0 147 56t56 145q0 51 -32.5 79t-90.5 28h-45l9 36h40q76 0 123.5 43.5t47.5 113.5q0 45 -27 77.5t-72 32.5q-73 0 -121 -39t-84 -126l-18 -1l37 201h22z" />
+<glyph unicode="&#x418;" horiz-adv-x="708" d="M749 653v-16q-43 -7 -57.5 -19.5t-26.5 -54.5l-121 -453q-10 -34 -10 -44q0 -29 13 -37t64 -13v-16h-269v16q52 3 71 20t30 57l109 405l-399 -403q-6 -19 -6 -33q0 -23 16.5 -33.5t53.5 -12.5v-16h-242v16q47 7 60 23t31 82l110 412q12 46 12 63q0 22 -14 29t-63 12v16 h267v-16q-43 -3 -66.5 -21.5t-37.5 -72.5l-101 -381l396 401q6 24 6 37q0 18 -15 26t-51 11v16h240z" />
+<glyph unicode="&#x419;" horiz-adv-x="708" d="M749 653v-16q-43 -7 -57.5 -19.5t-26.5 -54.5l-121 -453q-10 -34 -10 -44q0 -29 13 -37t64 -13v-16h-269v16q52 3 71 20t30 57l109 405l-399 -403q-6 -19 -6 -33q0 -23 16.5 -33.5t53.5 -12.5v-16h-242v16q47 7 60 23t31 82l110 412q12 46 12 63q0 22 -14 29t-63 12v16 h267v-16q-43 -3 -66.5 -21.5t-37.5 -72.5l-101 -381l396 401q6 24 6 37q0 18 -15 26t-51 11v16h240zM613 831q0 -45 -45 -72.5t-98 -27.5q-52 0 -98 27.5t-46 72.5q0 28 17 42t36 14q16 0 28 -10.5t12 -27.5t-8.5 -27t-8.5 -16q0 -17 17.5 -30t50.5 -13t50 12.5t17 30.5 q0 6 -8.5 16.5t-8.5 27.5q0 16 13 26.5t30 10.5q19 0 34.5 -14t15.5 -42z" />
+<glyph unicode="&#x41a;" horiz-adv-x="621" d="M225 370h28q77 0 119 39t82 121q32 66 59 94q35 37 84 37q23 0 41.5 -15.5t18.5 -35.5q0 -54 -50 -54q-18 0 -33.5 20t-21.5 20q-7 0 -14 -5t-12.5 -12t-12 -17.5t-10 -17.5t-8 -17t-5.5 -11q-42 -80 -77 -119t-90 -55v-2q30 -18 46.5 -39.5t37.5 -67.5l67 -151 q23 -40 40 -50.5t64 -15.5v-16h-165l-114 248q-3 6 -7 16l-6 14l-6 11.5t-5.5 10t-5 7.5t-5.5 7l-6 4q-4 3 -8 4.5t-9 2.5q-13 3 -27 3l-57 -217q-11 -44 -11 -51q0 -23 14.5 -31.5t56.5 -12.5v-16h-245v16q43 5 57 18t24 53l118 445q14 50 14 62q0 21 -17 31t-62 12v16h270 v-16q-42 -3 -65 -18.5t-34 -55.5z" />
+<glyph unicode="&#x41b;" horiz-adv-x="699" d="M740 653v-16q-44 -7 -58 -19t-26 -55l-129 -481q-3 -12 -3 -24q0 -21 19 -30t60 -12v-16h-271v16q56 4 75 23.5t36 84.5l121 455q3 11 3 19q0 19 -26 19h-137q-20 0 -29.5 -8.5t-14.5 -29.5l-89 -323q-47 -171 -101 -226q-44 -46 -114 -46q-38 0 -64.5 20t-26.5 55 q0 27 14.5 42.5t38.5 15.5q18 0 29.5 -12.5t15.5 -28t13.5 -28t24.5 -12.5q41 0 71.5 61.5t64.5 187.5l70 259q8 32 8 47q0 26 -15 35.5t-48 10.5l5 16h483z" />
+<glyph unicode="&#x41c;" horiz-adv-x="814" d="M855 653v-16q-41 -7 -55.5 -20.5t-25.5 -53.5l-118 -443q-14 -50 -14 -62q0 -20 18 -30.5t63 -11.5l-1 -16h-270v16q49 5 69 22t33 64l123 459l-377 -561h-17l-62 546l-118 -428q-9 -32 -9 -54q0 -43 70 -48v-16h-197v16q40 5 58.5 28.5t41.5 105.5l114 401q12 41 12 52 q0 30 -74 34v16h181l56 -492l335 492h164z" />
+<glyph unicode="&#x41d;" horiz-adv-x="708" d="M749 653v-16q-44 -8 -58.5 -20t-25.5 -54l-128 -481q-3 -12 -3 -24q0 -21 15 -29t64 -13v-16h-272v16q51 4 71.5 21t30.5 56l63 233h-287l-66 -244q-3 -10 -3 -22q0 -22 12.5 -30t57.5 -14v-16h-246l2 16q42 4 57.5 20.5t28.5 65.5l115 430q12 46 12 64q0 22 -14 29 t-62 12v16h271v-16q-45 -3 -68.5 -19t-33.5 -52l-52 -198h286l45 164q14 52 14 63q0 19 -16 29t-56 13v16h246z" />
+<glyph unicode="&#x41e;" horiz-adv-x="712" d="M699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-53 -72 -83.5 -163t-30.5 -169q0 -82 33.5 -125.5 t96.5 -43.5q92 0 170 95q59 74 94 181t35 190z" />
+<glyph unicode="&#x41f;" horiz-adv-x="704" d="M745 653v-16q-44 -8 -58.5 -20t-25.5 -54l-128 -481q-3 -12 -3 -24q0 -21 15 -29t64 -13v-16h-271v16q51 4 71.5 21t30.5 56l128 485q4 18 4 21q0 18 -28 18h-215q-21 0 -30.5 -8t-16.5 -32l-133 -495q-3 -10 -3 -22q0 -22 12.5 -30t57.5 -14v-16h-245v16q42 4 58.5 20.5 t29.5 65.5l114 430q12 46 12 64q0 21 -14.5 28.5t-62.5 12.5v16h637z" />
+<glyph unicode="&#x420;" horiz-adv-x="568" d="M119 653h241q218 0 218 -148q0 -40 -18.5 -78.5t-49.5 -64.5q-69 -57 -205 -57q-50 0 -89 9l-51 -194q-14 -54 -14 -63q0 -18 15 -27.5t54 -13.5v-16h-244v16q43 6 56.5 19.5t27.5 62.5l113 414q17 63 17 83t-14 28.5t-57 13.5v16zM291 586l-66 -240q29 -5 51 -5 q85 0 128 25q71 40 71 134q0 64 -33.5 90.5t-98.5 26.5q-44 0 -52 -31z" />
+<glyph unicode="&#x421;" horiz-adv-x="667" d="M690 664l-37 -200l-18 3q-18 163 -149 163q-109 0 -199 -97q-53 -56 -80.5 -136t-27.5 -165q0 -205 175 -205q62 0 113.5 26t115.5 93l18 -15q-67 -79 -131.5 -114t-141.5 -35q-117 0 -189 69.5t-72 191.5q0 103 51 196.5t136 153.5q102 73 219 73q69 0 117 -17 q20 -7 41 -7q27 0 38 22h21z" />
+<glyph unicode="&#x422;" horiz-adv-x="556" d="M644 653l-43 -159l-18 2q3 17 3 41q0 80 -101 80h-62l-130 -489q-14 -49 -14 -66q0 -25 17 -35.5t71 -10.5v-16h-288v16q52 5 74.5 20t32.5 55l140 526h-60q-78 0 -112 -25t-66 -98l-18 4l42 155h532z" />
+<glyph unicode="&#x423;" horiz-adv-x="656" d="M716 653v-16q-40 -4 -66.5 -25t-62.5 -86l-221 -394q-81 -146 -173 -146q-34 0 -58.5 18t-24.5 48q0 31 16.5 46t36.5 15q21 0 33 -12t14 -27t5 -27t10 -12q28 0 64 48.5t66 117.5l-82 281q-29 101 -43.5 123.5t-55.5 31.5v16h239v-16l-26 -3q-27 -3 -38 -11t-11 -27 q0 -15 5 -33l77 -261l147 262q20 38 20 48q0 25 -60 25v16h189z" />
+<glyph unicode="&#x424;" horiz-adv-x="772" d="M531 582l-12 -42q102 -4 170.5 -47.5t68.5 -131.5q0 -96 -91 -173q-85 -72 -262 -75q-11 -29 -11 -51q0 -24 21.5 -35t71.5 -11v-16h-297v16h9q47 0 71.5 20.5t36.5 76.5q-99 1 -166.5 45.5t-67.5 132.5q0 95 88 171q86 74 263 78q14 49 14 64q0 18 -17 25.5t-63 7.5v16 h281v-16h-5q-88 0 -103 -55zM509 504l-95 -355q120 0 179 63q60 64 60 154q0 126 -144 138zM316 149l96 355q-116 0 -177 -64q-32 -34 -44.5 -68.5t-12.5 -83.5q0 -129 138 -139z" />
+<glyph unicode="&#x425;" horiz-adv-x="575" d="M617 653v-16q-33 -11 -60.5 -31.5t-64.5 -63.5l-169 -194l101 -255q18 -45 36 -58t69 -19v-16h-271v16q43 1 60 9.5t17 27.5q0 16 -14 51l-67 165l-151 -172q-23 -26 -23 -48q0 -33 66 -33v-16h-213v16q40 7 76 40.5t144 159.5l83 97l-103 255q-15 37 -33.5 51t-61.5 18 v16h263v-16q-41 -5 -56 -13.5t-15 -27.5q0 -17 16 -56l59 -147l145 167q21 24 21 43q0 31 -61 34v16h207z" />
+<glyph unicode="&#x426;" horiz-adv-x="706" d="M747 653v-16q-44 -8 -58.5 -20t-26.5 -54l-118 -442q-14 -49 -14 -63q0 -20 15 -28.5t59 -13.5l-52 -195h-19q2 6 5.5 36.5t3.5 42.5q0 58 -24.5 79t-69.5 21h-473v16q42 4 57.5 20.5t28.5 65.5l115 430q12 45 12 64q0 21 -14 28.5t-63 12.5v16h271v-16q-46 -4 -68 -19.5 t-32 -51.5l-131 -491q-4 -18 -4 -21q0 -18 28 -18h214q20 0 29.5 8t16.5 32l132 495q3 11 3 22q0 20 -15.5 30.5t-55.5 13.5v16h248z" />
+<glyph unicode="&#x427;" horiz-adv-x="622" d="M663 653v-16q-44 -8 -58.5 -20t-25.5 -54l-128 -481q-3 -12 -3 -24q0 -21 14.5 -29t63.5 -13v-16h-272v16q51 4 71.5 21t30.5 56l60 219q-92 -46 -190 -46q-69 0 -108.5 18.5t-39.5 69.5q0 28 10 65l36 134q8 32 8 43q0 21 -15 28.5t-63 12.5v16h271v-16 q-45 -2 -67.5 -18t-32.5 -53l-37 -138q-10 -38 -10 -57q0 -61 102 -61q71 0 145 37l50 185q13 50 13 63q0 19 -15 29t-55 13v16h245z" />
+<glyph unicode="&#x428;" horiz-adv-x="936" d="M977 653v-16q-44 -8 -58.5 -20t-25.5 -54l-117 -442q-14 -49 -14 -63q0 -20 17 -28t62 -14l-1 -16h-854v16q42 4 57.5 20.5t28.5 65.5l115 430q8 30 8 64q0 21 -13 28.5t-61 12.5v16h261v-16q-45 -4 -62.5 -18.5t-27.5 -52.5l-131 -489q-4 -12 -4 -21q0 -20 28 -20h138 q32 0 45 48l131 487q3 11 3 22q0 22 -10.5 31.5t-48.5 12.5v16h232v-16q-43 -8 -56 -19.5t-25 -54.5l-132 -486q-4 -12 -4 -21q0 -20 29 -20h132q20 0 30 9t17 33l132 493q3 11 3 22q0 21 -14.5 31t-54.5 13v16h245z" />
+<glyph unicode="&#x429;" horiz-adv-x="936" d="M977 653v-16q-44 -8 -58.5 -20t-25.5 -54l-117 -442q-14 -49 -14 -63q0 -20 15 -28.5t59 -13.5l-52 -195h-19q2 6 5.5 36.5t3.5 42.5q0 58 -24.5 79t-69.5 21h-694v16q42 4 57.5 20.5t28.5 65.5l115 430q8 30 8 64q0 21 -13 28.5t-61 12.5v16h261v-16q-45 -4 -62.5 -18.5 t-27.5 -52.5l-131 -489q-4 -12 -4 -21q0 -20 28 -20h138q32 0 45 48l131 487q3 11 3 22q0 22 -10.5 31.5t-48.5 12.5v16h232v-16q-43 -8 -56 -19.5t-25 -54.5l-132 -486q-4 -12 -4 -21q0 -20 29 -20h132q20 0 30 9t17 33l132 493q3 11 3 22q0 21 -14.5 31t-54.5 13v16h245z " />
+<glyph unicode="&#x42a;" horiz-adv-x="695" d="M339 364h87q226 0 226 -132q0 -104 -81 -168t-201 -64h-282v16q41 6 56 20.5t27 59.5l123 464q2 8 2 25q0 33 -42 33q-78 0 -108 -23t-65 -101l-18 4l42 155h365v-16q-31 -4 -48.5 -16t-24.5 -39zM329 328l-51 -186q-14 -42 -14 -64q0 -42 67 -42q93 0 151 45.5t58 144.5 q0 102 -140 102h-71z" />
+<glyph unicode="&#x42b;" horiz-adv-x="852" d="M893 653v-16q-42 -5 -56 -18.5t-26 -58.5l-114 -429q-15 -53 -15 -76q0 -20 12.5 -27t56.5 -12v-16h-246v16q42 8 57.5 21t26.5 54l117 441q13 46 13 62q0 20 -16 30.5t-56 12.5v16h246zM223 364h87q226 0 226 -132q0 -104 -81 -168t-201 -64h-282v16q41 6 56 20.5 t27 59.5l116 436q12 44 12 62q0 21 -14 29.5t-57 13.5v16h242v-16q-61 -8 -73 -55zM213 328l-49 -186q-15 -45 -15 -64q0 -42 67 -42q93 0 150.5 45.5t57.5 144.5q0 102 -140 102h-71z" />
+<glyph unicode="&#x42c;" horiz-adv-x="597" d="M224 364h87q125 0 176 -39q50 -37 50 -102q0 -97 -81.5 -160t-200.5 -63h-283v16q41 6 56 20.5t27 59.5l117 436q12 44 12 62q0 21 -14 29.5t-57 13.5v16h244v-16q-61 -8 -74 -55zM214 328l-49 -186q-15 -45 -15 -64q0 -42 67 -42q93 0 150.5 45.5t57.5 144.5 q0 102 -140 102h-71z" />
+<glyph unicode="&#x42d;" horiz-adv-x="658" d="M157 665h22q4 -22 29 -22q34 0 74 12q40 11 124 11q98 0 164 -72t66 -187q0 -176 -140 -313q-115 -112 -291 -112q-85 0 -137.5 34t-52.5 102q0 30 14.5 50.5t44.5 20.5q25 0 38.5 -14.5t13.5 -35.5t-18.5 -41t-18.5 -27q0 -22 32.5 -37t84.5 -15q120 0 210 95 q73 78 98 202h-271l11 42h266q4 27 4 60q0 212 -155 212q-84 0 -140 -39t-91 -124l-18 -1z" />
+<glyph unicode="&#x42e;" horiz-adv-x="877" d="M222 368h85q46 117 135 201q102 97 214 97q94 0 144 -60t50 -173q0 -115 -54.5 -216t-141.5 -164q-95 -71 -192 -71q-87 0 -137.5 59t-50.5 164q0 61 18 121h-82l-64 -244q-3 -10 -3 -22q0 -22 12.5 -30t57.5 -14v-16h-245v16q42 5 58 20t29 66l114 430q12 46 12 64 q0 21 -14.5 28.5t-62.5 12.5v16h272v-16q-45 -3 -67.5 -19t-32.5 -52zM756 490q0 67 -28.5 105t-80.5 38q-87 0 -169 -117q-51 -74 -80.5 -166t-29.5 -178q0 -157 109 -157q84 0 155 95q56 75 90 183.5t34 196.5z" />
+<glyph unicode="&#x42f;" horiz-adv-x="635" d="M676 653v-15q-44 -9 -58.5 -21t-25.5 -54l-117 -442q-11 -40 -11 -58q0 -23 17 -34t60 -13v-16h-274v16q51 4 71.5 21t30.5 56l58 212h-31l-293 -305h-152v16q50 3 96 49l240 245v2q-66 0 -113 39.5t-47 99.5q0 74 53 125q81 77 275 77h221zM437 347l51 185q13 43 13 63 q0 15 -7.5 21.5t-28.5 6.5q-99 0 -167 -43.5t-68 -134.5q0 -49 38.5 -76.5t104.5 -27.5q51 0 64 6z" />
+<glyph unicode="&#x430;" horiz-adv-x="514" d="M469 111l13 -11q-56 -68 -82.5 -89t-56.5 -21q-40 0 -40 41q0 25 23 115q-56 -84 -103 -120.5t-100 -36.5q-44 0 -72 30.5t-28 85.5q0 67 34 136.5t89 121.5q83 78 163 78q67 0 80 -58l11 48l3 3l61 7l7 -3q-1 -4 -6 -21q-89 -324 -89 -363q0 -13 14 -13q15 0 52 41z M371 361q0 26 -15 42t-41 16q-68 0 -131 -92q-33 -49 -55 -109t-22 -106q0 -74 60 -74q59 0 127 98q77 111 77 225z" />
+<glyph unicode="&#x431;" horiz-adv-x="498" d="M519 683h16q-28 -80 -94 -104q-21 -8 -64.5 -8.5t-54.5 -1.5q-46 -6 -90 -45.5t-73 -89t-46 -101.5l2 -1q59 57 101 79q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 58 15 115 q11 39 23 75t32.5 85.5t47 89.5t58.5 76t74.5 56t89.5 20h60q36 0 53 6.5t30 31.5zM393 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#x432;" horiz-adv-x="442" d="M276 245v-2q18 0 29.5 -0.5t31.5 -5.5t32 -14t21.5 -27.5t9.5 -44.5q0 -66 -66 -114t-147 -48q-87 0 -121.5 42t-34.5 115q0 45 15.5 93t47 95t89 77t131.5 30q48 0 78.5 -20t30.5 -63q0 -45 -41 -73.5t-106 -39.5zM357 360q0 60 -63 60q-48 0 -97.5 -46.5t-73.5 -150.5 q49 10 84 20t72.5 26.5t57.5 39t20 51.5zM313 148q0 73 -66 73q-55 0 -128 -26q-12 -33 -12 -83q0 -102 80 -102q57 0 91.5 42.5t34.5 95.5z" />
+<glyph unicode="&#x433;" horiz-adv-x="390" d="M101 348l-10 13q84 80 182 80q50 0 80.5 -25t30.5 -66q0 -38 -31 -66.5t-75 -47.5l-88 -36q-44 -19 -75 -46t-31 -62q0 -55 79 -55q34 0 64 9.5t75 40.5l12 -12q-56 -51 -96.5 -68.5t-87.5 -17.5q-61 0 -95 24t-34 67q0 34 31 63.5t75 50.5l89 42q44 20 75 45.5t31 53.5 q0 25 -19 41.5t-52 16.5q-39 0 -67.5 -10t-62.5 -35z" />
+<glyph unicode="&#x434;" horiz-adv-x="489" d="M211 666l13 17q107 -24 176.5 -117.5t69.5 -206.5q0 -97 -38 -182t-106 -136.5t-149 -51.5q-70 0 -108.5 35.5t-38.5 104.5q0 115 86.5 213.5t193.5 98.5q59 0 87 -49l2 1q-10 83 -60.5 164.5t-127.5 108.5zM387 326q0 43 -19.5 68.5t-51.5 25.5q-69 0 -132 -89 q-70 -97 -70 -224q0 -42 21.5 -69.5t56.5 -27.5q70 0 124 82q32 47 51.5 113t19.5 121z" />
+<glyph unicode="&#x435;" horiz-adv-x="440" d="M368 109l12 -12q-88 -108 -204 -108q-62 0 -102 38t-40 99q0 116 96.5 215.5t209.5 99.5q39 0 60.5 -18t21.5 -50q0 -65 -80.5 -117.5t-213.5 -69.5q-10 -20 -10 -61t25.5 -66t67.5 -25q74 0 157 75zM134 209l1 -1q68 17 106 33t65 41q50 48 50 97q0 39 -35 39 q-41 0 -100.5 -69t-86.5 -140z" />
+<glyph unicode="&#x436;" horiz-adv-x="799" d="M438 242h58q27 82 87.5 140.5t135.5 58.5q37 0 54.5 -15.5t17.5 -39.5q0 -21 -11 -31t-25 -10q-19 0 -28.5 10t-11 22.5t-8.5 22.5t-21 10q-25 0 -56 -34q-36 -40 -58 -111.5t-22 -125.5q0 -56 19.5 -85.5t51.5 -29.5q55 0 102 70l13 -9q-37 -55 -68 -75.5t-77 -20.5 q-50 0 -81 40t-31 114q0 40 10 77h-56l-61 -220h-73l61 220h-57q-24 -88 -82.5 -159.5t-135.5 -71.5q-39 0 -58 11q-27 16 -27 43q0 20 13.5 33.5t26.5 13.5q18 0 25.5 -11t6.5 -24t4 -24t20 -11q14 0 33 9.5t33 24.5q36 39 57 111t21 126q0 56 -19.5 85.5t-51.5 29.5 q-55 0 -102 -70l-13 9q37 55 68 75.5t77 20.5q51 0 81.5 -34.5t30.5 -107.5q0 -38 -4 -57h58l52 190h73z" />
+<glyph unicode="&#x437;" horiz-adv-x="376" d="M101 441h14q0 -17 13 -17q10 0 40 8.5t58 8.5q69 0 100 -27.5t31 -69.5q0 -50 -40 -79t-92 -36l-1 -1q48 -11 73 -36t25 -60q0 -50 -35 -85q-55 -58 -169 -58q-64 0 -100 24.5t-36 64.5q0 26 13 39t33 13q18 0 28.5 -11.5t10.5 -30.5q0 -11 -8 -24t-8 -25q0 -10 14 -19.5 t38 -9.5q65 0 98.5 37t33.5 90q0 38 -23 59.5t-63 21.5q-14 0 -22 -1l7 23h30q49 0 83 33t34 72q0 36 -18 55.5t-49 19.5q-85 0 -133 -108h-16z" />
+<glyph unicode="&#x438;" horiz-adv-x="527" d="M481 119l14 -9q-48 -74 -75 -96.5t-63 -22.5q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 30 27 128l35 129q17 65 17 78q0 17 -10 17q-26 0 -88 -82l-14 10q47 72 76.5 95.5t66.5 23.5q46 0 46 -48q0 -33 -22 -112l-54 -198q-3 -9 -3 -16 q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-83 -303q-15 -57 -15 -74t11 -17q12 0 29 16t54 65z" />
+<glyph unicode="&#x439;" horiz-adv-x="527" d="M481 119l14 -9q-48 -74 -75 -96.5t-63 -22.5q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 30 27 128l35 129q17 65 17 78q0 17 -10 17q-26 0 -88 -82l-14 10q47 72 76.5 95.5t66.5 23.5q46 0 46 -48q0 -33 -22 -112l-54 -198q-3 -9 -3 -16 q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-83 -303q-15 -57 -15 -74t11 -17q12 0 29 16t54 65zM458 667h18q-8 -61 -47.5 -108.5t-102.5 -47.5q-48 0 -88.5 28.5t-40.5 74.5q0 25 15.5 39t33.5 14q16 0 28 -10.5t12 -27.5t-8.5 -27t-8.5 -16 q0 -16 18 -29.5t47 -13.5q48 0 79 34.5t45 89.5z" />
+<glyph unicode="&#x43a;" horiz-adv-x="491" d="M159 242h11q35 0 63.5 20.5t48.5 49.5l38 59q20 29 47.5 49.5t61.5 20.5q23 0 39.5 -15.5t16.5 -33.5q0 -23 -13.5 -35t-32.5 -12q-17 0 -32 18.5t-31 18.5q-12 0 -28 -20t-31 -45.5t-40.5 -51.5t-53.5 -35v-2q57 -5 88 -63q11 -22 20 -55t15.5 -51t16.5 -18q25 0 49 42 q5 8 15 26l15 -11q-30 -60 -57 -84.5t-58 -24.5q-38 0 -57 27.5t-33 77.5l-9 32q-3 11 -10.5 30t-15 29t-20.5 20.5t-29 14.5l-60 -220h-75l78 292q19 73 19 81q0 15 -12 21t-42 6h-11v15q91 13 160 26l4 -2z" />
+<glyph unicode="&#x43b;" horiz-adv-x="474" d="M428 115l14 -13q-49 -67 -79 -89t-67 -22q-20 0 -33.5 13.5t-13.5 40.5q0 16 16 75l44 162q15 58 15 83q0 33 -29 33q-27 0 -58 -29q-34 -33 -64 -134l-18 -61q0 -1 -6.5 -23l-8.5 -29l-10 -27q-7 -20 -12 -30t-13.5 -23.5t-16.5 -22.5q-29 -31 -73 -31q-25 0 -42 13 t-17 38q0 23 13 34.5t31 11.5q23 0 34 -24q3 -6 4 -16t2 -15.5t5 -5.5q14 0 25.5 11t23 38t18.5 51l22 70l14 48q33 114 82.5 156.5t109.5 42.5q29 0 46.5 -17t17.5 -44q0 -25 -10 -60l-56 -203q-12 -43 -12 -61t15 -18q25 0 66 51z" />
+<glyph unicode="&#x43c;" horiz-adv-x="633" d="M587 116l14 -13q-51 -70 -78 -91.5t-62 -21.5q-20 0 -33.5 13.5t-13.5 40.5q0 89 58 268l-211 -312h-8l-39 327l-48 -150q-35 -109 -65 -145q-19 -23 -36.5 -33.5t-49.5 -10.5q-25 0 -42.5 12.5t-17.5 37.5q0 23 12.5 34.5t30.5 11.5q23 0 34 -23q3 -6 3.5 -16t1.5 -15.5 t5 -5.5q27 0 50.5 43.5t49.5 126.5l75 238h59l39 -308h2l205 308h60q-28 -85 -60.5 -211t-32.5 -165q0 -19 16 -19q18 0 61 53z" />
+<glyph unicode="&#x43d;" horiz-adv-x="504" d="M458 117l14 -13q-51 -70 -78 -91.5t-62 -21.5q-20 0 -33.5 13.5t-13.5 40.5q0 16 16 75l24 91h-174l-58 -211h-73l93 350q2 10 2 23q0 15 -13.5 20.5t-51.5 6.5v15q79 9 161 26l4 -2l-58 -206h173l54 199h73l-83 -315q-14 -56 -14 -61q0 -18 16 -18q19 0 61 53q7 8 21 26 z" />
+<glyph unicode="&#x43e;" horiz-adv-x="489" d="M470 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5zM386 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5 q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#x43f;" horiz-adv-x="511" d="M465 117l14 -13q-51 -70 -78 -91.5t-62 -21.5q-20 0 -33.5 13.5t-13.5 40.5q0 16 16 75l44 162q14 54 14 79q0 29 -24 29q-29 0 -63.5 -34.5t-84.5 -107.5q-33 -49 -48.5 -88t-51.5 -160h-75l96 353q2 10 2 20q0 15 -13.5 20.5t-51.5 6.5v15q104 14 162 26l4 -2l-67 -218 q74 118 128 169t103 51q31 0 48 -16.5t17 -44.5q0 -25 -10 -60l-56 -203q-14 -50 -14 -61q0 -18 16 -18q19 0 61 53q7 8 21 26z" />
+<glyph unicode="&#x440;" horiz-adv-x="483" d="M215 437l-31 -109q75 113 171 113q109 0 109 -125q0 -81 -42 -157t-110 -123t-139 -47q-36 0 -69 17q-40 -165 -40 -166q0 -16 13.5 -22.5t48.5 -6.5v-16h-203v16q32 1 45.5 14t22.5 49l115 432q15 55 15 67q0 27 -44 27h-24v15l157 26zM380 313q0 44 -14.5 64.5 t-47.5 20.5q-39 0 -78 -34t-57 -80q-22 -57 -43.5 -135t-21.5 -103q0 -17 13.5 -27.5t34.5 -10.5q78 0 145 95q69 96 69 210z" />
+<glyph unicode="&#x441;" horiz-adv-x="441" d="M347 107l16 -10q-46 -58 -89.5 -83t-99.5 -25q-71 0 -109 39t-38 115q0 67 34 129.5t89 107.5q77 61 167 61q46 0 75.5 -23t29.5 -58q0 -20 -14 -34t-34 -14t-29.5 11.5t-9.5 28.5q0 9 7.5 23.5t7.5 24.5q0 20 -37 20q-63 0 -109 -48q-91 -96 -91 -233q0 -54 23 -84 t66 -30q39 0 71 19t74 63z" />
+<glyph unicode="&#x442;" horiz-adv-x="741" d="M709 105l-5 -7q-77 -107 -144 -107q-40 0 -40 46q0 15 13 66l58 227q7 28 7 38q0 9 -6 15t-14 6q-47 0 -131 -117q-37 -52 -58 -104.5t-50 -167.5h-75l27 93q68 235 68 271q0 25 -22 25q-25 0 -66 -39.5t-83 -103.5q-25 -39 -42.5 -83t-53.5 -163h-75l73 262 q25 91 25 116q0 22 -41 22h-25v15q105 15 162 26l3 -2l-58 -209q130 211 220 211q29 0 44.5 -16t15.5 -44q0 -38 -40 -152q53 84 88.5 126.5t71.5 65.5q32 20 63 20q27 0 42.5 -16.5t15.5 -42.5q0 -19 -13 -67l-58 -216q-10 -38 -10 -45q0 -16 12 -16q22 0 65 53l21 26z" />
+<glyph unicode="&#x443;" horiz-adv-x="421" d="M206 186l21 -110q67 110 94.5 167.5t27.5 89.5q0 16 -26 32q-26 17 -26 39q0 16 11.5 26.5t28.5 10.5q22 0 37 -16t15 -39q0 -87 -131 -305q-78 -129 -151.5 -208t-116.5 -79q-23 0 -37 12t-14 31q0 17 11.5 28.5t27.5 11.5q19 0 31.5 -14t24.5 -14q25 0 63 43t61 81 q10 20 10 35q0 30 -31 155.5t-51 176.5q-14 37 -30.5 50.5t-46.5 13.5q-16 0 -31 -4v17q22 4 32 6q41 8 107 18h4q11 0 41.5 -93t43.5 -162z" />
+<glyph unicode="&#x444;" horiz-adv-x="702" d="M422 351h2q34 50 66 70t82 20q44 0 74.5 -39t30.5 -97q0 -74 -29.5 -146t-84 -121t-119.5 -49q-46 0 -69.5 27t-25.5 56l-41 -159q-16 -60 -16 -73q0 -16 13.5 -22.5t48.5 -6.5v-16h-203v16q32 1 45.5 14t22.5 49l48 182h-1q-31 -40 -59.5 -53.5t-65.5 -13.5 q-53 0 -82.5 45t-29.5 108q0 67 29.5 135t84.5 116t119 48q71 0 92 -69q60 220 60 242q-1 27 -41 27h-27v15q96 13 157 27l7 -6zM606 302q0 44 -19.5 74t-52.5 30q-36 0 -69 -32t-44 -64q-54 -156 -54 -203q0 -36 22.5 -59.5t46.5 -23.5q44 0 79 29.5t53.5 74.5t28 90 t9.5 84zM339 319v4q0 36 -23 59.5t-47 23.5q-41 0 -75 -30t-53.5 -74t-30 -89t-10.5 -81q0 -45 19.5 -76.5t51.5 -31.5q37 0 71 32.5t43 63.5z" />
+<glyph unicode="&#x445;" horiz-adv-x="444" d="M235 355l12 -57q53 81 85.5 112t65.5 31q18 0 29.5 -10.5t11.5 -26.5t-9.5 -26t-24.5 -10q-9 0 -24 8.5t-28 8.5q-29 0 -98 -121q0 -13 8 -45l32 -134q10 -41 30 -41q16 0 47 40l7 10l7 10q3 4 7 8l15 -9q-43 -67 -68 -90.5t-54 -23.5q-24 0 -37 15t-22 53l-29 119 l-88 -119q-31 -42 -50.5 -55t-44.5 -13q-23 0 -36.5 11t-13.5 31q0 15 9.5 25.5t24.5 10.5q12 0 32 -11q15 -9 26 -9q17 0 51 49l82 116l-28 124q-10 44 -18.5 56t-27.5 12q-12 0 -39 -7l-18 -5l-3 16l11 4q80 29 117 29q19 0 30 -18t21 -68z" />
+<glyph unicode="&#x446;" horiz-adv-x="527" d="M495 110l-34 -52q-23 -35 -23 -68q0 -13 3.5 -31.5t3.5 -29.5q0 -35 -18 -60t-78 -51l-9 18q23 11 32 23.5t9 37.5q0 4 -1.5 17t-1.5 15q0 34 41 82l-1 1q-26 -21 -61 -21q-48 0 -48 48q0 45 45 197q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 30 27 128l35 129 q17 65 17 78q0 17 -10 17q-26 0 -88 -82l-14 10q47 72 76.5 95.5t66.5 23.5q46 0 46 -48q0 -33 -22 -112l-54 -198q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-83 -303q-15 -57 -15 -74t11 -17q12 0 29 16t54 65z" />
+<glyph unicode="&#x447;" horiz-adv-x="482" d="M436 122l14 -9q-48 -73 -77 -97.5t-65 -24.5q-47 0 -47 48q0 14 22 100l13 50q-69 -32 -124 -32q-104 0 -104 72q0 16 28 118q7 25 7 29q0 12 -11 18t-50 6v15q66 7 150 26l4 -3l-47 -172q-4 -16 -4 -34q0 -23 13.5 -34t47.5 -11q44 0 97 28l59 217h74l-79 -299 q-19 -73 -19 -78q0 -17 11 -17q23 0 87 84z" />
+<glyph unicode="&#x448;" horiz-adv-x="785" d="M739 119l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 36 47 197h-2q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 24 31 131l29 97h-2l-21 -34q-90 -146 -138.5 -196.5t-101.5 -50.5t-53 53q0 30 27 128l35 129q17 65 17 78q0 17 -10 17q-26 0 -88 -82l-14 10 q47 72 76.5 95.5t66.5 23.5q46 0 46 -48q0 -33 -22 -112l-54 -198q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q34 51 53 93.5t58 149.5h74l-88 -349q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-79 -299q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16 t54 65z" />
+<glyph unicode="&#x449;" horiz-adv-x="785" d="M739 119l14 -9l-34 -52q-23 -38 -23 -66q0 -13 3.5 -32.5t3.5 -30.5q0 -35 -18 -60t-78 -51l-9 18q23 11 32 23.5t9 37.5q0 4 -1.5 17t-1.5 15q0 34 41 82l-1 1q-25 -21 -61 -21q-48 0 -48 48q0 36 47 197h-2q-89 -146 -137.5 -196.5t-101.5 -50.5t-53 53q0 24 31 131 l29 97h-2l-21 -34q-90 -146 -138.5 -196.5t-101.5 -50.5t-53 53q0 30 27 128l35 129q17 65 17 78q0 17 -10 17q-26 0 -88 -82l-14 10q47 72 76.5 95.5t66.5 23.5q46 0 46 -48q0 -33 -22 -112l-54 -198q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q34 51 53 93.5t58 149.5h74 l-88 -349q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-79 -299q-19 -72 -19 -78q0 -17 11 -17q12 0 29 16t54 65z" />
+<glyph unicode="&#x44a;" horiz-adv-x="567" d="M245 213h3q76 72 157 72q61 0 92 -28.5t31 -73.5q0 -77 -73.5 -135.5t-172.5 -58.5q-76 0 -108.5 32t-32.5 92q0 69 40.5 144t95.5 123l-1 2q-31 -13 -74 -13q-16 0 -49 7t-57 7q-43 0 -72 -53l-12 6q27 59 50.5 82t71.5 23q27 0 68 -11.5t69 -11.5q44 0 71 23l10 -9 q-44 -43 -74 -111.5t-33 -107.5zM442 179q0 68 -72 68q-49 0 -101 -41q-51 -39 -51 -140q0 -23 18.5 -38t50.5 -15q65 0 110 56t45 110z" />
+<glyph unicode="&#x44b;" horiz-adv-x="689" d="M643 117l14 -9q-43 -69 -73 -93t-67 -24q-20 0 -33.5 13.5t-13.5 40.5q0 16 16 75l82 312h73l-82 -315q-14 -56 -14 -61q0 -18 16 -18q11 0 24 11.5t37 41.5zM151 214l1 -1q76 72 157 72q61 0 92.5 -28.5t31.5 -73.5q0 -77 -74 -135.5t-173 -58.5q-76 0 -106 23t-30 65 q0 25 17 93l35 139q14 58 14 67q0 12 -11 18t-50 6v15q78 10 150 26l4 -3zM347 179q0 68 -73 68q-49 0 -101 -41q-51 -39 -51 -140q0 -23 18.5 -38t50.5 -15q65 0 110.5 56t45.5 110z" />
+<glyph unicode="&#x44c;" horiz-adv-x="471" d="M151 214l1 -1q76 72 157 72q61 0 92.5 -28.5t31.5 -73.5q0 -77 -74 -135.5t-173 -58.5q-76 0 -106 23t-30 65q0 23 17 93l35 139q14 58 14 67q0 12 -11 18t-50 6v15q78 10 150 26l4 -3zM347 179q0 68 -73 68q-49 0 -101 -41q-51 -39 -51 -140q0 -23 18.5 -38t50.5 -15 q65 0 110.5 56t45.5 110z" />
+<glyph unicode="&#x44d;" horiz-adv-x="408" d="M105 441h14q0 -17 13 -17q11 0 41 8.5t57 8.5q79 0 120 -44.5t41 -118.5q0 -119 -80 -204t-191 -85q-52 0 -82.5 25t-30.5 62q0 27 13 40.5t33 13.5q18 0 28.5 -11.5t10.5 -30.5q0 -11 -8 -24t-8 -25q0 -13 13 -21t32 -8q83 0 138 88q27 46 39 117h-137l5 22h135 q4 28 4 54q0 59 -19 94t-58 35q-90 0 -142 -108h-16z" />
+<glyph unicode="&#x44e;" horiz-adv-x="674" d="M160 233h75q23 56 64.5 103t94.5 75q56 30 120 30q62 0 101.5 -37.5t39.5 -102.5q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 42 13 83h-72l-58 -211h-76l79 292q19 70 19 80q0 28 -41 28h-25v15q105 15 162 26l3 -2zM571 326 q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-74 -113 -74 -228q0 -44 21 -67.5t57 -23.5q61 0 121 83q34 46 54 110.5t20 122.5z" />
+<glyph unicode="&#x44f;" horiz-adv-x="481" d="M435 119l14 -9q-48 -73 -75 -96t-63 -23q-48 0 -48 48q0 51 36 162h-31q-14 0 -25 -3t-28 -13.5t-34.5 -37.5t-33.5 -68q-19 -49 -44 -68.5t-63 -19.5q-28 0 -46.5 19t-18.5 60q0 23 8 40h16q-4 -20 -4 -28q0 -24 9 -36.5t23 -12.5q18 0 29.5 15.5t24.5 56.5q16 51 43 73 t68 27l1 2q-47 4 -74.5 26.5t-27.5 54.5q0 55 36 89t81.5 44.5t101.5 10.5h129l-80 -298q-18 -72 -18 -79q0 -17 11 -17q12 0 29 16t54 65zM304 223l41 157q2 8 2 11q0 19 -23 19q-151 0 -151 -118q0 -32 28.5 -50.5t72.5 -18.5h30z" />
+<glyph unicode="&#x451;" horiz-adv-x="440" d="M368 109l12 -12q-88 -108 -204 -108q-62 0 -102 38t-40 99q0 116 96.5 215.5t209.5 99.5q39 0 60.5 -18t21.5 -50q0 -65 -80.5 -117.5t-213.5 -69.5q-10 -20 -10 -61t25.5 -66t67.5 -25q74 0 157 75zM134 209l1 -1q68 17 106 33t65 41q50 48 50 97q0 39 -35 39 q-41 0 -100.5 -69t-86.5 -140zM275 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM475 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34z" />
+<glyph unicode="&#x452;" horiz-adv-x="479" d="M154 231h1q71 112 125.5 161t102.5 49q31 0 48 -16.5t17 -44.5q0 -25 -10 -60l-77 -292q-32 -123 -77 -179.5t-110 -56.5q-34 0 -56.5 17.5t-22.5 44.5q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -13 18 -13q30 0 50.5 39.5t46.5 143.5l72 293 q17 68 17 71q0 29 -24 29q-26 0 -70 -40.5t-83 -101.5q-30 -47 -44 -85t-51 -163h-75l129 491h-103l12 38h101l7 25q13 45 13 62q0 12 -13 18.5t-28 6.5h-27v15q76 9 157 27l7 -6l-40 -148h169l-12 -38h-168z" />
+<glyph unicode="&#x453;" horiz-adv-x="390" d="M101 348l-10 13q84 80 182 80q50 0 80.5 -25t30.5 -66q0 -38 -31 -66.5t-75 -47.5l-88 -36q-44 -19 -75 -46t-31 -62q0 -55 79 -55q34 0 64 9.5t75 40.5l12 -12q-56 -51 -96.5 -68.5t-87.5 -17.5q-61 0 -95 24t-34 67q0 34 31 63.5t75 50.5l89 42q44 20 75 45.5t31 53.5 q0 25 -19 41.5t-52 16.5q-39 0 -67.5 -10t-62.5 -35zM232 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35z" />
+<glyph unicode="&#x454;" horiz-adv-x="428" d="M441 441l-36 -129h-16q0 108 -63 108q-57 0 -116.5 -53t-84.5 -130h161l-5 -22h-161q-8 -29 -8 -72q0 -63 22.5 -98t64.5 -35q67 0 67 68q0 23 15 37.5t39 14.5q15 0 25 -10.5t10 -23.5q0 -46 -63 -79q-54 -28 -113 -28q-73 0 -113 37t-40 112q0 112 91.5 207.5 t202.5 95.5q27 0 50 -8.5t34 -8.5q15 0 21 17h16z" />
+<glyph unicode="&#x455;" horiz-adv-x="389" d="M341 442l-20 -140h-16q-14 116 -89 116q-27 0 -43 -15t-16 -42q0 -38 54 -102q68 -79 68 -136q0 -61 -40.5 -97.5t-103.5 -36.5q-29 0 -55 10q-21 9 -44 9q-20 0 -29 -21h-16l20 159h16q20 -136 100 -136q35 0 55.5 20t20.5 57q0 45 -56 115q-63 79 -63 131q0 50 33 79 t88 29q20 0 56 -10q22 -7 36 -7q20 0 30 18h14z" />
+<glyph unicode="&#x456;" horiz-adv-x="278" d="M258 599q0 -21 -14.5 -36t-34.5 -15q-22 0 -35 14.5t-13 38.5q0 23 13.5 38t33.5 15t35 -16.5t15 -38.5zM216 114l13 -11q-42 -65 -71 -89.5t-66 -24.5q-49 0 -49 55q0 29 22 111l48 177q9 32 9 44q0 15 -11.5 19t-52.5 5v15q65 5 160 26l4 -3l-94 -343q-10 -34 -10 -44 q0 -15 14 -15q25 0 84 78z" />
+<glyph unicode="&#x457;" horiz-adv-x="278" d="M357 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM157 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM217 115l14 -12q-41 -63 -71 -88.5 t-67 -25.5q-50 0 -50 57q0 20 24 110l48 175q9 34 9 45q0 15 -11 19t-52 5v15q55 4 159 26l5 -3l-96 -342q-9 -34 -9 -45q0 -6 5 -10.5t11 -4.5q12 0 30 17.5t51 61.5z" />
+<glyph unicode="&#x458;" horiz-adv-x="278" d="M231 598q0 -20 -15 -35t-35 -15q-23 0 -38.5 14.5t-15.5 37.5q0 22 16 37t37 15q20 0 35.5 -16.5t15.5 -37.5zM198 438l-104 -410q-31 -121 -76.5 -178t-110.5 -57q-35 0 -57 17t-22 44q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -12 18 -12q30 0 50.5 39 t46.5 143l72 292q16 65 16 80q0 17 -10.5 24t-37.5 7h-26v15q36 2 169 26z" />
+<glyph unicode="&#x459;" horiz-adv-x="679" d="M364 213h1q68 72 147 72q61 0 90 -28t29 -74q0 -77 -70.5 -135.5t-161.5 -58.5q-76 0 -106 23t-30 65q0 31 17 93l29 112q15 58 15 83q0 33 -29 33q-27 0 -58 -29q-33 -32 -64 -134l-18 -61q0 -1 -6.5 -23l-8.5 -29l-10 -27q-7 -20 -12 -30t-13.5 -23.5t-16.5 -22.5 q-29 -31 -73 -31q-25 0 -42 13t-17 38q0 23 13 34.5t31 11.5q23 0 34 -24q3 -6 4 -16t2 -15.5t5 -5.5q14 0 25.5 11t23 38t18.5 51l22 70l14 48q33 114 82.5 156.5t109.5 42.5q29 0 46.5 -17t17.5 -44q0 -25 -10 -60zM545 179q0 68 -68 68q-50 0 -91 -41q-51 -51 -51 -140 q0 -23 15.5 -38t46.5 -15q65 0 106.5 55.5t41.5 110.5z" />
+<glyph unicode="&#x45a;" horiz-adv-x="697" d="M442 438l-59 -225q68 72 147 72q61 0 90 -28t29 -74q0 -77 -70.5 -135.5t-161.5 -58.5q-76 0 -106 23t-30 65q0 23 17 93l10 41h-154l-57 -211h-76l95 350q1 5 1 23q0 15 -13.5 20.5t-51.5 6.5v15q79 9 161 26l4 -2l-58 -206h154l22 76q14 50 14 67q0 12 -11 18 q-13 6 -50 6v15q82 10 150 26zM563 179q0 68 -68 68q-50 0 -91 -41q-51 -51 -51 -140q0 -23 15.5 -38t46.5 -15q65 0 106.5 55.5t41.5 110.5z" />
+<glyph unicode="&#x45b;" horiz-adv-x="511" d="M466 118l13 -13q-46 -65 -77 -89.5t-69 -24.5q-20 0 -32 11.5t-12 30.5q0 17 20 92l55 207q7 28 7 33q0 25 -28 25q-27 0 -69.5 -40t-82.5 -100q-31 -48 -49 -93.5t-47 -156.5h-75l129 491h-103l12 38h101l7 25q13 45 13 62q0 12 -13 18.5t-28 6.5h-27v15q76 9 157 27 l7 -6l-40 -148h169l-12 -38h-168l-70 -261q130 211 230 211q33 0 49 -18.5t16 -48.5q0 -43 -48 -193q-33 -101 -33 -125q0 -18 16 -18q12 0 26.5 14.5t55.5 65.5z" />
+<glyph unicode="&#x45c;" horiz-adv-x="491" d="M159 242h11q35 0 63.5 20.5t48.5 49.5l38 59q20 29 47.5 49.5t61.5 20.5q23 0 39.5 -15.5t16.5 -33.5q0 -23 -13.5 -35t-32.5 -12q-17 0 -32 18.5t-31 18.5q-12 0 -28 -20t-31 -45.5t-40.5 -51.5t-53.5 -35v-2q57 -5 88 -63q11 -22 20 -55t15.5 -51t16.5 -18q25 0 49 42 q5 8 15 26l15 -11q-30 -60 -57 -84.5t-58 -24.5q-38 0 -57 27.5t-33 77.5l-9 32q-3 11 -10.5 30t-15 29t-20.5 20.5t-29 14.5l-60 -220h-75l78 292q19 73 19 81q0 15 -12 21t-42 6h-11v15q91 13 160 26l4 -2zM189 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5 q0 -18 -17 -28l-171 -106h-35z" />
+<glyph unicode="&#x45e;" horiz-adv-x="421" d="M206 186l21 -110q67 110 94.5 167.5t27.5 89.5q0 16 -26 32q-26 17 -26 39q0 16 11.5 26.5t28.5 10.5q22 0 37 -16t15 -39q0 -87 -131 -305q-78 -129 -151.5 -208t-116.5 -79q-23 0 -37 12t-14 31q0 17 11.5 28.5t27.5 11.5q19 0 34 -14t27 -14q18 0 48 33 q13 13 38.5 46.5t32.5 44.5q10 20 10 35q0 30 -31 155.5t-51 176.5q-14 37 -30.5 50.5t-46.5 13.5q-16 0 -31 -4v17q22 4 32 6q41 8 107 18h4q11 0 41.5 -93t43.5 -162zM399 667h18q-8 -61 -47.5 -108.5t-102.5 -47.5q-48 0 -88.5 28.5t-40.5 74.5q0 25 15.5 39t33.5 14 q16 0 28 -10.5t12 -27.5t-8.5 -27t-8.5 -16q0 -16 18 -29.5t47 -13.5q48 0 79 34.5t45 89.5z" />
+<glyph unicode="&#x45f;" horiz-adv-x="527" d="M481 119l14 -9q-48 -74 -75 -96.5t-63 -22.5q-48 0 -48 48q0 45 45 197q-99 -162 -150 -209q-13 -37 -13 -51q0 -13 4 -26t4 -24q0 -31 -18.5 -56.5t-77.5 -51.5l-9 18q23 11 32 23.5t9 37.5q0 4 -1.5 16.5t-1.5 14.5q0 9 2 16.5t7 16.5t7.5 13t11.5 14.5t10 12.5v1 q-26 -13 -55 -13q-53 0 -53 53q0 30 27 128l35 129q17 65 17 78q0 17 -10 17q-26 0 -88 -82l-14 10q47 72 76.5 95.5t66.5 23.5q46 0 46 -48q0 -33 -22 -112l-54 -198q-3 -9 -3 -16q0 -25 20 -25q45 0 142 147q33 50 51.5 91.5t58.5 151.5h74l-83 -303q-15 -57 -15 -74 t11 -17q12 0 29 16t54 65z" />
+<glyph unicode="&#x462;" horiz-adv-x="681" d="M308 364h87q226 0 226 -132q0 -104 -81 -168t-201 -64h-286l3 16q41 6 56 20.5t27 59.5l110 407h-44q-33 0 -48 -1t-35.5 -5.5t-31.5 -15.5t-25 -30.5t-28 -50.5l-18 4l32 135h208q10 40 10 55q0 21 -14 29.5t-57 13.5v16h243v-16q-61 -8 -74 -55l-12 -43h204l-37 -139 l-18 2q3 26 3 36q0 37 -27 51t-80 14h-54zM298 328l-50 -186q-15 -45 -15 -64q0 -42 66 -42q93 0 151.5 45.5t58.5 144.5q0 102 -140 102h-71z" />
+<glyph unicode="&#x463;" horiz-adv-x="542" d="M221 204l1 -1q76 72 158 72q61 0 92.5 -28.5t31.5 -73.5q0 -77 -72.5 -130.5t-172.5 -53.5q-76 0 -106 23t-30 65q0 28 17 93l61 232h-55q-57 0 -73.5 -10.5t-42.5 -61.5h-17l31 102h165l32 119q14 54 14 64q0 12 -12.5 19t-27.5 7h-28v15q84 10 157 27l7 -6l-68 -245 h165l-26 -102h-18q1 11 1 21q0 28 -18.5 39.5t-62.5 11.5h-49zM418 169q0 68 -73 68q-50 0 -102 -41q-26 -20 -37 -48t-11 -82q0 -23 18.5 -38t50.5 -15q66 0 110 51.5t44 104.5z" />
+<glyph unicode="&#x46a;" horiz-adv-x="953" d="M893 0h-280v16q71 4 71 79q0 27 -12 62q-24 66 -60.5 105t-80.5 42l-52 -193q-11 -39 -11 -51q0 -25 9 -32.5t48 -11.5v-16h-228v16q40 5 52 17t24 54l60 217q-48 -3 -108 -37.5t-113 -97.5q-54 -64 -54 -121q0 -29 43 -32v-16h-256v16q37 3 62.5 24t55.5 63q40 57 69 91 t73 72.5t97.5 57.5t118.5 22l-85 307h481l-252 -307q95 -4 162 -97q18 -25 34 -69l27 -76q11 -32 37.5 -58.5t67.5 -29.5v-16zM733 611h-289l71 -264z" />
+<glyph unicode="&#x46b;" horiz-adv-x="741" d="M673 94l13 -9q-53 -96 -137 -96q-63 0 -77 77q-1 4 -5 31t-7 35l-10 26q-7 18 -18.5 27.5t-28.5 15.5l-55 -201h-71l55 201h-1q-33 -12 -58 -39t-41 -55.5t-34 -55.5t-47.5 -44.5t-72.5 -17.5q-37 0 -57.5 15.5t-20.5 38.5q0 20 13.5 31.5t27.5 11.5q18 0 27 -10.5 t10 -22.5t7.5 -22.5t20.5 -10.5q18 0 29 21q8 15 19 43.5t23.5 51t33.5 43.5q39 39 109 44l-96 209h389l-189 -207v-2q57 -6 88.5 -38.5t31.5 -81.5q0 -3 -1 -16t-1 -17q0 -46 31 -46q53 0 100 70zM548 402h-219l76 -158z" />
+<glyph unicode="&#x472;" horiz-adv-x="712" d="M699 418q0 -107 -57.5 -205t-149.5 -160q-105 -71 -214 -71q-99 0 -158.5 62t-59.5 172q0 91 49 187.5t128 165.5q112 97 237 97q107 1 166 -66t59 -182zM594 481q0 71 -34.5 111.5t-94.5 40.5q-99 0 -186 -117q-50 -68 -80 -153q46 31 74 40t63 9q22 0 43.5 -16 t36.5 -34.5t38 -34.5t47 -16q31 0 73 28q20 80 20 142zM559 291q-61 -45 -132 -45q-25 0 -48.5 16t-38.5 34.5t-37 34.5t-45 16q-30 0 -74 -30q-19 -69 -19 -133q0 -82 33.5 -125.5t96.5 -43.5q92 0 170 95q56 68 94 181z" />
+<glyph unicode="&#x473;" horiz-adv-x="489" d="M470 301q0 -57 -28.5 -118.5t-77.5 -110.5q-83 -83 -188 -83q-70 0 -108.5 36.5t-38.5 102.5q0 83 50.5 162t129.5 121q56 30 119 30q62 0 102 -37.5t40 -102.5zM386 326q0 45 -19 69.5t-52 24.5q-67 0 -128 -91q-32 -49 -50 -97q50 38 84 38q27 0 56 -31.5t51 -31.5 q19 0 43 17q15 57 15 102zM363 195q-49 -38 -92 -38q-19 0 -33 10t-21 21.5t-18 21.5t-25 10q-21 0 -47 -19q-14 -51 -14 -100q0 -44 21 -67.5t57 -23.5q61 0 121 83q33 46 51 102z" />
+<glyph unicode="&#x474;" horiz-adv-x="646" d="M306 141l213 386q18 32 30 50.5t31.5 41t42.5 33t51 10.5q36 0 52 -16t16 -35q0 -54 -50 -54q-17 0 -32.5 20t-24.5 20q-14 0 -24.5 -8.5t-25.5 -34.5l-326 -572h-19l-82 503q-17 105 -28.5 126t-53.5 26v16h240v-16q-47 -5 -61.5 -15t-14.5 -36q0 -10 1 -15l63 -430h2z " />
+<glyph unicode="&#x475;" horiz-adv-x="464" d="M237 115h1q70 195 158 281q46 45 88 45q18 0 31 -12.5t13 -30.5q0 -46 -48 -46q-11 0 -22.5 9.5t-18.5 9.5q-25 0 -55.5 -34t-54.5 -77.5t-49.5 -103t-37.5 -90.5l-21 -59q-9 -25 -28 -25q-16 0 -16 28q-10 172 -46 297q-17 56 -29 75t-38 19h-30v15q72 11 109 20 q20 5 23 5q4 0 10 -16q27 -68 43 -155.5t18 -154.5z" />
+<glyph unicode="&#x490;" horiz-adv-x="524" d="M622 783l-49 -166h-282l-131 -489q-16 -62 -16 -73q0 -18 17 -27t60 -12v-16h-251v16q42 3 56.5 18.5t26.5 59.5l119 442q10 36 10 61q0 21 -13.5 30.5t-47.5 9.5v16h316q32 0 51.5 3t43 15t40.5 39.5t29 72.5h21z" />
+<glyph unicode="&#x491;" horiz-adv-x="337" d="M404 507l-29 -97h-134q-27 0 -34 -25l-80 -290q-8 -30 -8 -44q0 -15 12 -15q25 0 84 78l13 -11q-42 -65 -71 -89.5t-66 -24.5q-49 0 -49 55q0 29 22 111l58 215q4 13 4 24q0 13 -10.5 17t-42.5 6v15h186q66 0 86 11t42 64h17z" />
+<glyph unicode="&#x1e80;" horiz-adv-x="833" d="M576 708h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23zM906 653v-16q-29 -9 -42.5 -22t-34.5 -53l-301 -580h-20l-50 453h-5l-222 -453h-19l-61 514q-8 70 -13 92.5t-16 33.5q-10 10 -51 15v16h235v-16q-41 -4 -56.5 -14t-15.5 -37q0 -13 1 -20l44 -404 l172 348l-8 65q-4 38 -17.5 49t-57.5 13v16h236v-16q-39 -4 -53.5 -14t-14.5 -34q0 -3 1 -8.5t1 -6.5l40 -412l188 365q23 44 23 68q0 41 -67 42v16h184z" />
+<glyph unicode="&#x1e81;" horiz-adv-x="667" d="M403 426l32 -352q99 123 132 175.5t33 84.5q0 14 -22 35q-21 20 -21 41q0 12 11.5 21.5t27.5 9.5q22 0 37 -16t15 -40q0 -91 -212 -349l-9 -11q-35 -43 -45 -43q-8 0 -11 35l-29 310l-89 -152q-23 -38 -55 -99q-49 -94 -64 -94q-7 0 -9 9t-4 38l-4 91q-8 164 -27 242 q-7 27 -15.5 34.5t-31.5 7.5h-28v13q79 13 95 17q5 1 11.5 3t10.5 3t7 1q8 0 11 -5t8 -29q25 -120 32 -281l192 304q6 10 13 10q8 0 8 -14zM466 492h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23z" />
+<glyph unicode="&#x1e82;" horiz-adv-x="833" d="M389 706l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM906 653v-16q-29 -9 -42.5 -22t-34.5 -53l-301 -580h-20l-50 453h-5l-222 -453h-19l-61 514q-8 70 -13 92.5t-16 33.5q-10 10 -51 15v16h235v-16q-41 -4 -56.5 -14t-15.5 -37 q0 -13 1 -20l44 -404l172 348l-8 65q-4 38 -17.5 49t-57.5 13v16h236v-16q-39 -4 -53.5 -14t-14.5 -34q0 -3 1 -8.5t1 -6.5l40 -412l188 365q23 44 23 68q0 41 -67 42v16h184z" />
+<glyph unicode="&#x1e83;" horiz-adv-x="667" d="M269 494l162 160q10 10 25 10t25.5 -10.5t10.5 -25.5q0 -18 -17 -28l-171 -106h-35zM403 426l32 -352q99 123 132 175.5t33 84.5q0 14 -22 35q-21 20 -21 41q0 12 11.5 21.5t27.5 9.5q22 0 37 -16t15 -40q0 -91 -212 -349l-9 -11q-35 -43 -45 -43q-8 0 -11 35l-29 310 l-89 -152q-23 -38 -55 -99q-49 -94 -64 -94q-7 0 -9 9t-4 38l-4 91q-8 164 -27 242q-7 27 -15.5 34.5t-31.5 7.5h-28v13q79 13 95 17q5 1 11.5 3t10.5 3t7 1q8 0 11 -5t8 -29q25 -120 32 -281l192 304q6 10 13 10q8 0 8 -14z" />
+<glyph unicode="&#x1e84;" horiz-adv-x="833" d="M439 769q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM639 769q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM906 653v-16q-29 -9 -42.5 -22 t-34.5 -53l-301 -580h-20l-50 453h-5l-222 -453h-19l-61 514q-8 70 -13 92.5t-16 33.5q-10 10 -51 15v16h235v-16q-41 -4 -56.5 -14t-15.5 -37q0 -13 1 -20l44 -404l172 348l-8 65q-4 38 -17.5 49t-57.5 13v16h236v-16q-39 -4 -53.5 -14t-14.5 -34q0 -3 1 -8.5t1 -6.5 l40 -412l188 365q23 44 23 68q0 41 -67 42v16h184z" />
+<glyph unicode="&#x1e85;" horiz-adv-x="667" d="M329 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM529 557q0 -20 -14.5 -34.5t-34.5 -14.5q-21 0 -35 14.5t-14 35.5q0 20 14.5 34t35.5 14q19 0 33.5 -15t14.5 -34zM403 426l32 -352q99 123 132 175.5 t33 84.5q0 14 -22 35q-21 20 -21 41q0 12 11.5 21.5t27.5 9.5q22 0 37 -16t15 -40q0 -91 -212 -349l-9 -11q-35 -43 -45 -43q-8 0 -11 35l-29 310l-89 -152q-23 -38 -55 -99q-49 -94 -64 -94q-7 0 -9 9t-4 38l-4 91q-8 164 -27 242q-7 27 -15.5 34.5t-31.5 7.5h-28v13 q79 13 95 17q5 1 11.5 3t10.5 3t7 1q8 0 11 -5t8 -29q25 -120 32 -281l192 304q6 10 13 10q8 0 8 -14z" />
+<glyph unicode="&#x1ef2;" horiz-adv-x="556" d="M466 708h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23zM633 653v-16q-21 -7 -32 -17.5t-38 -43.5l-219 -270l-36 -123q-30 -103 -30 -127q0 -19 11.5 -27t41.5 -10l36 -3v-16h-289v16q51 3 72.5 18.5t34.5 62.5l59 205l-76 267q-11 40 -23.5 51t-53.5 17v16 h239v-16q-44 -4 -58 -11.5t-14 -24.5t36 -144l31 -110l39 46q149 176 149 213q0 24 -40 28l-29 3v16h189z" />
+<glyph unicode="&#x1ef3;" horiz-adv-x="444" d="M243 186l21 -110q67 110 94.5 167.5t27.5 89.5q0 16 -26 32q-26 17 -26 39q0 16 11.5 26.5t28.5 10.5q22 0 37 -16t15 -39q0 -87 -131 -305q-78 -129 -151.5 -208t-116.5 -79q-23 0 -37 12t-14 31q0 17 11.5 28.5t27.5 11.5q19 0 34 -14t27 -14q18 0 48 33 q13 13 38.5 46.5t32.5 44.5q10 20 10 35q0 30 -31 155.5t-51 176.5q-14 37 -30.5 50.5t-46.5 13.5q-16 0 -31 -4v17q22 4 32 6q41 8 107 18h4q11 0 41.5 -93t43.5 -162zM311 492h-32l-140 106q-19 15 -19 32q0 16 10 25t26 9q22 0 40 -23z" />
+<glyph unicode="&#x2000;" horiz-adv-x="511" />
+<glyph unicode="&#x2001;" horiz-adv-x="1023" />
+<glyph unicode="&#x2002;" horiz-adv-x="511" />
+<glyph unicode="&#x2003;" horiz-adv-x="1023" />
+<glyph unicode="&#x2004;" horiz-adv-x="341" />
+<glyph unicode="&#x2005;" horiz-adv-x="255" />
+<glyph unicode="&#x2006;" horiz-adv-x="170" />
+<glyph unicode="&#x2007;" horiz-adv-x="170" />
+<glyph unicode="&#x2008;" horiz-adv-x="127" />
+<glyph unicode="&#x2009;" horiz-adv-x="204" />
+<glyph unicode="&#x200a;" horiz-adv-x="56" />
+<glyph unicode="&#x2010;" horiz-adv-x="333" d="M282 257l-13 -66h-220l14 66h219z" />
+<glyph unicode="&#x2011;" horiz-adv-x="333" d="M282 257l-13 -66h-220l14 66h219z" />
+<glyph unicode="&#x2012;" d="M508 258l-8 -66h-508l8 66h508z" />
+<glyph unicode="&#x2013;" d="M505 243l-8 -46h-503l8 46h503z" />
+<glyph unicode="&#x2014;" horiz-adv-x="889" d="M894 243l-8 -46h-892l8 46h892z" />
+<glyph unicode="&#x2018;" horiz-adv-x="333" d="M301 666l9 -17q-75 -50 -75 -89q0 -13 20 -32q25 -22 25 -45q0 -20 -14.5 -33.5t-36.5 -13.5q-25 0 -41.5 20t-16.5 51q0 87 130 159z" />
+<glyph unicode="&#x2019;" horiz-adv-x="333" d="M160 436l-9 17q75 50 75 88q0 14 -20 33q-25 22 -25 46q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -86 -130 -159z" />
+<glyph unicode="&#x201a;" horiz-adv-x="333" d="M53 -129l-9 18q75 50 75 88q0 11 -21 31q-24 21 -24 47q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159z" />
+<glyph unicode="&#x201b;" horiz-adv-x="333" d="M268 455l-13 -19q-86 47 -86 131q0 39 19 69t53 30q25 0 37 -13.5t12 -33.5q0 -19 -13 -32.5t-34 -14.5q-17 -1 -25.5 -10.5t-8.5 -20.5q0 -44 59 -86z" />
+<glyph unicode="&#x201c;" horiz-adv-x="556" d="M296 666l9 -17q-75 -50 -75 -89q0 -13 20 -32q25 -22 25 -45q0 -20 -14.5 -33.5t-36.5 -13.5q-25 0 -41.5 20t-16.5 51q0 87 130 159zM505 666l9 -17q-75 -50 -75 -89q0 -13 20 -32q25 -22 25 -45q0 -20 -14.5 -33.5t-36.5 -13.5q-25 0 -41.5 20t-16.5 51q0 87 130 159z " />
+<glyph unicode="&#x201d;" horiz-adv-x="556" d="M160 436l-9 17q75 50 75 88q0 14 -20 33q-25 22 -25 46q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -86 -130 -159zM369 436l-9 17q75 50 75 88q0 14 -20 33q-25 22 -25 46q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -86 -130 -159z" />
+<glyph unicode="&#x201e;" horiz-adv-x="556" d="M275 -129l-9 17q75 50 75 89q0 13 -20 32q-25 22 -25 46q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159zM66 -129l-9 17q75 50 75 89q0 13 -20 32q-25 22 -25 46q0 20 14.5 33t36.5 13q25 0 41.5 -20.5t16.5 -50.5q0 -87 -130 -159z" />
+<glyph unicode="&#x201f;" horiz-adv-x="556" d="M268 455l-13 -19q-86 47 -86 131q0 39 19 69t53 30q25 0 37 -13.5t12 -33.5q0 -19 -13 -32.5t-34 -14.5q-17 -1 -25.5 -10.5t-8.5 -20.5q0 -44 59 -86zM477 455l-13 -19q-86 47 -86 131q0 39 19 69t53 30q25 0 37 -13.5t12 -33.5q0 -19 -13 -32.5t-34 -14.5 q-17 -1 -25.5 -10.5t-8.5 -20.5q0 -44 59 -86z" />
+<glyph unicode="&#x2020;" d="M179 -159h-22q7 40 20 101q34 172 34 252q0 12 -3 41q-2 16 -2 27q56 62 74 164q-47 0 -96 -20q-24 -11 -39 -11q-44 0 -44 42q0 40 48 40q17 0 46 -12q42 -17 90 -18q10 55 10 86q0 17 -5 41q-4 23 -4 35q0 57 47 57q42 0 42 -45q0 -19 -24 -60q-35 -60 -47 -114 q48 1 90 18q28 12 47 12q47 0 47 -40q0 -42 -44 -42q-14 0 -38 10q-49 21 -105 21q-9 -45 -9 -83q0 -54 16 -85q-20 -29 -44.5 -91.5t-36.5 -115.5z" />
+<glyph unicode="&#x2021;" d="M282 427h-18q-25 0 -64 -17q-34 -14 -51 -14q-21 0 -34.5 11.5t-13.5 30.5q0 18 12.5 29t33.5 11q16 0 48 -12q45 -17 91 -18q9 46 9 76q0 28 -6 62q-3 16 -3 26q0 22 14.5 38t33.5 16q18 0 29.5 -12.5t11.5 -32.5q0 -24 -26 -64q-35 -56 -43 -109q46 1 91 18 q33 12 49 12q20 0 32.5 -11t12.5 -29q0 -19 -13.5 -30.5t-34.5 -11.5q-17 0 -51 14q-39 17 -64 17h-26q-11 -50 -11 -85q0 -27 16 -83q-28 -27 -45 -63.5t-31 -99.5h19q25 0 64 17q34 14 51 14q21 0 34.5 -12t13.5 -30t-12.5 -29t-34.5 -11q-15 0 -47 12q-44 17 -91 18 q-10 -46 -10 -76q0 -27 6 -62q3 -17 3 -26q0 -22 -14.5 -38t-33.5 -16t-30 12.5t-11 33.5q0 24 26 64q35 56 43 108q-47 -1 -91 -18q-30 -12 -49 -12q-20 0 -32.5 11t-12.5 29q0 19 13.5 30.5t34.5 11.5q17 0 51 -14q39 -17 64 -17h26q11 52 11 86q0 12 -14 73l-2 9 q28 27 45 63.5t31 99.5z" />
+<glyph unicode="&#x2022;" horiz-adv-x="523" d="M455 252q0 -79 -57 -136t-136 -57q-80 0 -136 56.5t-56 136.5q0 78 56.5 135t135.5 57q84 0 138.5 -56t54.5 -136z" />
+<glyph unicode="&#x2026;" horiz-adv-x="889" d="M168 43q0 -22 -17 -38t-41 -16q-21 0 -37 16t-16 38q0 24 16 40.5t39 16.5t39.5 -17t16.5 -40zM465 43q0 -22 -17 -38t-41 -16q-21 0 -37 16t-16 38q0 24 16 40.5t39 16.5t39.5 -17t16.5 -40zM762 43q0 -22 -17 -38t-41 -16q-21 0 -37 16t-16 38q0 24 16 40.5t39 16.5 t39.5 -17t16.5 -40z" />
+<glyph unicode="&#x202f;" horiz-adv-x="204" />
+<glyph unicode="&#x2030;" horiz-adv-x="1117" d="M705 213q0 -91 -50 -161.5t-114 -70.5q-51 0 -86 40t-35 98q0 80 58.5 145.5t130.5 65.5q46 0 71 -30.5t25 -86.5zM682 215q0 39 -17.5 63t-45.5 24q-29 0 -49 -23q-33 -35 -55.5 -93.5t-22.5 -109.5q0 -29 16 -48.5t40 -19.5q52 0 93 63.5t41 143.5zM640 706l-430 -724 h-47l394 658q-28 -32 -54.5 -44.5t-66.5 -12.5q-35 0 -76 14q4 -23 4 -44q0 -52 -22 -104t-58 -86q-38 -37 -86 -37q-50 0 -84 39.5t-34 97.5q0 85 58 149t135 64q26 0 60 -28q47 -39 96 -39q46 0 72 15t95 82h44zM340 569q0 22 -4.5 30t-20.5 16q-23 11 -44 34 q-31 -15 -44 -26.5t-28 -36.5q-48 -76 -48 -163q0 -31 15.5 -50.5t41.5 -19.5q53 0 92.5 65t39.5 151zM1067 213q0 -91 -49.5 -161.5t-113.5 -70.5q-52 0 -87 40t-35 99q0 80 58.5 145t130.5 65q46 0 71 -30.5t25 -86.5zM1044 215q0 39 -17.5 63t-45.5 24q-35 0 -66 -43 q-24 -32 -42.5 -86.5t-18.5 -94.5q0 -31 15.5 -50.5t40.5 -19.5q52 0 93 63.5t41 143.5z" />
+<glyph unicode="&#x2031;" horiz-adv-x="1479" d="M1067 213q0 -91 -49.5 -161.5t-113.5 -70.5q-52 0 -87 40t-35 99q0 80 58.5 145t130.5 65q46 0 71 -30.5t25 -86.5zM1044 215q0 39 -17.5 63t-45.5 24q-35 0 -66 -43q-24 -32 -42.5 -86.5t-18.5 -94.5q0 -31 15.5 -50.5t40.5 -19.5q52 0 93 63.5t41 143.5zM705 213 q0 -91 -50 -161.5t-114 -70.5q-51 0 -86 40t-35 98q0 80 58.5 145.5t130.5 65.5q46 0 71 -30.5t25 -86.5zM682 215q0 39 -17.5 63t-45.5 24q-29 0 -49 -23q-33 -35 -55.5 -93.5t-22.5 -109.5q0 -29 16 -48.5t40 -19.5q52 0 93 63.5t41 143.5zM640 706l-430 -724h-47l394 658 q-28 -32 -54.5 -44.5t-66.5 -12.5q-35 0 -76 14q4 -23 4 -44q0 -52 -22 -104t-58 -86q-38 -37 -86 -37q-50 0 -84 39.5t-34 97.5q0 85 58 149t135 64q26 0 60 -28q47 -39 96 -39q46 0 72 15t95 82h44zM340 569q0 22 -4.5 30t-20.5 16q-23 11 -44 34q-31 -15 -44 -26.5 t-28 -36.5q-48 -76 -48 -163q0 -31 15.5 -50.5t41.5 -19.5q53 0 92.5 65t39.5 151zM1429 213q0 -91 -49.5 -161.5t-113.5 -70.5q-52 0 -87 40t-35 99q0 80 58.5 145t130.5 65q46 0 71 -30.5t25 -86.5zM1406 215q0 39 -17.5 63t-45.5 24q-35 0 -66 -43q-24 -32 -42.5 -86.5 t-18.5 -94.5q0 -31 15.5 -50.5t40.5 -19.5q52 0 93 63.5t41 143.5z" />
+<glyph unicode="&#x2039;" horiz-adv-x="333" d="M51 216v9q103 80 127 101q88 77 97 77q6 0 6 -7q0 -17 -27 -47q-15 -16 -62.5 -62t-66.5 -70q6 -14 20 -40q62 -116 62 -133q0 -7 -7 -7q-4 0 -23 21q-20 22 -58.5 71.5t-50.5 63.5q-16 20 -17 23z" />
+<glyph unicode="&#x203a;" horiz-adv-x="333" d="M282 215l-36 -27q-47 -35 -91 -74q-87 -77 -97 -77q-6 0 -6 7q0 18 91 112l65 67l-20 40q-62 114 -62 133q0 7 7 7q16 0 61 -68q8 -12 21 -27q49 -57 67 -84v-9z" />
+<glyph unicode="&#x203e;" d="M500 532h-500v50h500v-50z" />
+<glyph unicode="&#x2044;" horiz-adv-x="167" d="M337 676l-455 -686h-51l455 686h51z" />
+<glyph unicode="&#x205f;" horiz-adv-x="255" />
+<glyph unicode="&#x20a3;" horiz-adv-x="611" d="M51 270h89l25 90h-89l8 30h89l41 146q10 36 10 61q0 21 -13.5 28.5t-62.5 11.5v16h497l-32 -154l-21 2q3 22 3 33q0 39 -14 55.5t-54 23.5t-131 7q-35 0 -49 -6.5t-19 -25.5l-55 -198h168l-8 -30h-169l-25 -90h169l-8 -30h-169l-35 -125q-14 -50 -14 -60q0 -18 17 -27 t60 -12v-16h-251v16q41 3 56.5 19t26.5 59l40 146h-88z" />
+<glyph unicode="&#x20a4;" d="M60 285h120q8 65 13 90h-109l8 30h107q27 124 88 197q57 68 137 68q41 0 67 -21t26 -55q0 -41 -39 -41q-30 0 -36 44t-40 44q-39 0 -61.5 -46.5t-51.5 -189.5h132l-8 -30h-130q-1 -3 -21 -90h128l-8 -30h-128q-16 -60 -57 -151q90 -38 160 -38q39 0 79 28l10 7l11 -9 q-41 -100 -142 -100q-37 0 -65.5 13t-78.5 52q-28 -37 -48.5 -50t-47.5 -13q-31 0 -48 17t-17 47q0 28 24 48t64 20q34 0 62 -11l17 140h-125zM146 73q-35 25 -61 25q-23 0 -38 -12.5t-15 -32.5q0 -16 12.5 -26.5t30.5 -10.5q20 0 40 16t31 41z" />
+<glyph unicode="&#x20a7;" horiz-adv-x="1149" d="M1126 442l-20 -140h-16q-14 116 -89 116q-27 0 -43 -15t-16 -42q0 -38 54 -102q68 -79 68 -136q0 -61 -40.5 -97.5t-103.5 -36.5q-29 0 -55 10q-21 9 -44 9q-20 0 -29 -21h-16l20 159h16q20 -136 100 -136q36 0 56 20t20 57q0 45 -56 115q-63 79 -63 131q0 50 33 79 t88 29q20 0 56 -10q22 -7 36 -7q20 0 30 18h14zM825 428l-5 -32h-84l-87 -328q-2 -8 -2 -14q0 -16 15 -16q12 0 28 15.5t53 63.5l13 -7q-46 -70 -75.5 -95.5t-67.5 -25.5q-46 0 -46 37q0 10 16 74l78 296h-75l-1 6q0 18 33 25q25 6 66 38.5t67 71.5q6 9 14 9q9 0 9 -8 q0 -5 -1 -7l-28 -103h80zM242 313l-53 -193q-14 -54 -14 -63q0 -18 15 -27.5t54 -13.5v-16h-244v16q43 6 56.5 19.5t27.5 62.5l116 414q17 61 17 83q0 20 -14 28.5t-57 13.5v16h221q108 0 156.5 -37t48.5 -111q0 -89 -65 -143q-69 -57 -185 -57q-45 0 -80 8zM320 592 l-69 -245q22 -5 42 -5q44 0 63.5 4.5t44.5 19.5q68 39 68 134q0 66 -27.5 94.5t-89.5 28.5q-6 0 -10 -0.5t-7.5 -2t-5 -2.5t-3 -4.5t-2 -5t-2 -7.5t-2.5 -9z" />
+<glyph unicode="&#x20ac;" d="M24 290h33q10 47 25 90h-34l8 30h38q49 113 130.5 183.5t166.5 70.5q41 0 84.5 -13.5t62.5 -39.5l-30 -111h-15l1 15v10q0 49 -30.5 80.5t-79.5 31.5q-52 0 -104 -60.5t-93 -166.5h208l-8 -30h-210q-15 -48 -26 -90h213l-8 -30h-212q-11 -57 -11 -99q0 -133 77 -133 q48 0 82.5 20.5t93.5 85.5l10 -10q-64 -77 -110.5 -106.5t-102.5 -29.5q-66 0 -104 47t-38 129q0 38 10 96h-35z" />
+<glyph unicode="&#x20d0;" horiz-adv-x="0" d="M-17 627h-436l132 133l18 -8q-36 -30 -36 -52q0 -19 41 -19h281v-54z" />
+<glyph unicode="&#x20d1;" horiz-adv-x="0" d="M10 627h-436v54h281q41 0 41 19q0 22 -36 52l18 8z" />
+<glyph unicode="&#x20d2;" horiz-adv-x="0" d="M-234 -156h-66v818h66v-818z" />
+<glyph unicode="&#x20d6;" horiz-adv-x="0" d="M-17 627h-286q-49 0 -49 -15q0 -3 2 -6.5t7.5 -9t10 -10.5t14.5 -14l16 -16l-18 -8l-133 106l132 106l18 -8q-49 -41 -49 -56t49 -15h286v-54z" />
+<glyph unicode="&#x20d7;" horiz-adv-x="0" d="M-453 681h286q49 0 49 15q0 3 -2 6.5t-7.5 9t-10 10.5t-14.5 14l-16 16l18 8l133 -106l-132 -106l-18 8q49 41 49 56t-49 15h-286v54z" />
+<glyph unicode="&#x20db;" horiz-adv-x="0" d="M-205 622q20 0 35 -15t15 -35t-15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5zM-6 622q20 0 35 -15t15 -35t-15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5zM-404 622q20 0 35 -15t15 -35t-15 -34.5t-36 -14.5 q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5z" />
+<glyph unicode="&#x20dc;" horiz-adv-x="0" d="M-135 622q20 0 35 -15t15 -35t-15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5zM64 622q20 0 35 -15t15 -35t-15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5zM-334 622q20 0 35 -15t15 -35t-15 -34.5t-36 -14.5 q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5zM-533 622q20 0 35 -15t15 -35t-15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5z" />
+<glyph unicode="&#x20dd;" horiz-adv-x="0" d="M-723 252q0 128 63.5 237t172.5 172.5t237 63.5t237 -63.5t172.5 -172.5t63.5 -237t-63.5 -237t-172.5 -172.5t-237 -63.5t-237 63.5t-172.5 172.5t-63.5 237zM-657 252q0 -169 119 -288t288 -119t288 119t119 288t-119 288t-288 119t-288 -119t-119 -288z" />
+<glyph unicode="&#x20e1;" horiz-adv-x="0" d="M-107 548l-18 8q49 41 49 56t-49 15h-177q-50 0 -50 -15q0 -3 2 -6.5t7.5 -9t10 -10.5t14.5 -14l16 -16l-18 -8l-133 106l132 106l18 -8q-49 -41 -49 -56t49 -15h178q49 0 49 15q0 3 -2 6.5t-7.5 9t-10 10.5t-14.5 14l-16 16l18 8l133 -106z" />
+<glyph unicode="&#x20e4;" horiz-adv-x="0" d="M490 -155h-1460l721 1178zM-839 -89h1198l-608 964z" />
+<glyph unicode="&#x20e5;" horiz-adv-x="0" d="M-24 -156h-71l-335 818h71z" />
+<glyph unicode="&#x20e6;" horiz-adv-x="0" d="M-86 -156h-66v818h66v-818zM-285 -156h-66v818h66v-818z" />
+<glyph unicode="&#x20e7;" horiz-adv-x="0" d="M-595 659v66h816v-903h-66v837h-750z" />
+<glyph unicode="&#x20e8;" horiz-adv-x="0" d="M-214 -119q20 0 35 -15t15 -35t-15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5zM-15 -119q20 0 35 -15t15 -35t-15 -34.5t-36 -14.5q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5zM-413 -119q20 0 35 -15t15 -35t-15 -34.5t-36 -14.5 q-20 0 -34 14.5t-14 35.5q0 20 14.5 34.5t34.5 14.5z" />
+<glyph unicode="&#x20e9;" horiz-adv-x="0" d="M-478 538v143h533v-143h-54v89h-425v-89h-54z" />
+<glyph unicode="&#x20ea;" horiz-adv-x="0" d="M-606 286h759v-66h-758q-26 0 -26 -20q0 -14 14 -28q21 -22 52 -66l-20 -19q-54 63 -97.5 97.5t-110.5 63.5v10q67 28 110.5 63t97.5 98l20 -19q-3 -5 -9 -14l-8 -12q-2 -3 -6.5 -9t-8 -10t-9.5 -9l-12 -13q-14 -14 -14 -25q0 -7 9 -14.5t17 -7.5z" />
+<glyph unicode="&#x20ec;" horiz-adv-x="0" d="M-17 681l-132 -133l-18 8q36 30 36 52q0 19 -41 19h-281v54h436z" />
+<glyph unicode="&#x20ed;" horiz-adv-x="0" d="M-453 681h436v-54h-281q-41 0 -41 -19q0 -22 36 -52l-18 -8z" />
+<glyph unicode="&#x20ee;" horiz-adv-x="0" d="M-17 -173h-286q-49 0 -49 -15q0 -3 2 -6.5t7.5 -9t10 -10.5t14.5 -14l16 -16l-18 -8l-133 106l132 106l18 -8q-49 -41 -49 -56t49 -15h286v-54z" />
+<glyph unicode="&#x20ef;" horiz-adv-x="0" d="M-167 -173h-286v54h286q49 0 49 15t-49 56l18 8l132 -106l-133 -106l-18 8l16 16q10 9 14.5 14t10 10.5t7.5 9t2 6.5q0 15 -49 15z" />
+<glyph unicode="&#x2102;" horiz-adv-x="702" d="M702 530l-25 -21l-29 30q-20 21 -28 28l-23 21q-16 14 -27 18l-30 12q-19 7 -39.5 9t-46.5 2q-118 0 -186 -52l-132 -501q70 -57 161 -57q43 0 78 6.5t57.5 13.5t55 29t46.5 34l58 48l21 -26q-119 -142 -322 -142q-118 0 -187 64.5t-69 181.5q0 183 117 310.5t298 127.5 q166 0 252 -136zM106 103l123 459q-74 -58 -115.5 -142.5t-41.5 -177.5q0 -95 34 -139z" />
+<glyph unicode="&#x2105;" horiz-adv-x="855" d="M808 234q0 -45 -22.5 -94t-61.5 -88q-67 -66 -150 -66q-57 0 -87.5 29t-30.5 82q0 66 40.5 129t103.5 97q45 23 96 23q49 0 80.5 -30t31.5 -82zM738 248q0 76 -54 76q-53 0 -101 -72q-57 -86 -57 -172q0 -72 60 -72q44 0 92 65q60 83 60 175zM646 676l-450 -690h-49 l453 690h46zM302 411l12 -9q-36 -46 -70.5 -66t-78.5 -20q-56 0 -87 34.5t-31 96.5q0 98 79 170q65 59 142 59q40 0 67 -21.5t27 -49.5q0 -16 -11 -27.5t-27 -11.5t-24 9.5t-8 23.5q0 7 6 18.5t6 19.5q0 16 -29 16q-51 0 -87 -38q-70 -73 -70 -174q0 -40 20 -65.5t49 -25.5 q32 0 57.5 13t57.5 48z" />
+<glyph unicode="&#x210a;" horiz-adv-x="738" d="M678 424l-269 -498q44 -23 91 -23q59 0 100 30l12 -26q-54 -34 -117 -34q-61 0 -102 22q-77 -114 -203 -114q-47 0 -72.5 21.5t-25.5 49.5q0 48 54 80q44 26 115 26q59 0 91 -13l87 156l-1 1q-54 -58 -102.5 -85.5t-104.5 -27.5q-38 0 -61 29t-23 76q0 48 23 99 q-30 -20 -70 -20q-39 0 -70 17l10 26q31 -13 57 -13q64 0 129 79q57 69 131.5 114t134.5 45q36 0 60 -16.5t28 -48.5h2l28 48h68zM550 364q0 42 -54 42q-95 0 -205 -159q-86 -125 -86 -187q0 -19 12 -30t29 -11q61 0 134.5 64.5t121.5 146t48 134.5zM337 -86l-1 1 q-29 13 -84 13q-57 0 -91.5 -20t-34.5 -52q0 -18 15.5 -29.5t40.5 -11.5q93 0 155 99z" />
+<glyph unicode="&#x210b;" horiz-adv-x="997" d="M714 664l-18 -14q-124 -96 -232 -310q22 9 62 21.5t53 17.5l33 43q100 125 187.5 195t134.5 70q57 0 57 -50q0 -39 -25.5 -76t-72 -68.5t-95 -56t-111.5 -49.5q-174 -251 -174 -334q0 -15 9.5 -25t24.5 -10q55 0 167 129l21 -13q-120 -146 -202 -146q-39 0 -63 24t-24 65 q0 101 104 262l-107 -41q-57 -111 -132 -193t-145 -109q-30 -11 -56 -11q-25 0 -41 16.5t-16 43.5q0 128 283 247q4 7 20 33l22 37l23 33.5t29 38.5l30 38q19 22 40.5 43t46.5 43q-7 -1 -20 -1q-44 0 -124 44q-63 34 -102 34q-47 0 -81.5 -30.5t-34.5 -70.5q0 -42 21.5 -68 t66.5 -26q38 0 66 21.5t55 64.5l18 -9q-54 -107 -141 -107q-59 0 -93 35t-34 91q0 59 50 105t125 46q29 0 58 -10.5t84 -38.5q60 -31 86 -31q41 0 80 19q14 7 43 28l32 24zM958 635q0 22 -24 22q-27 0 -85.5 -63t-128.5 -160q238 105 238 201zM307 241q-105 -48 -163 -96 t-58 -101q0 -25 24 -29q67 0 197 226z" />
+<glyph unicode="&#x210d;" horiz-adv-x="732" d="M767 653l-175 -653h-154l83 309h-266l-84 -309h-154l175 653h154l-81 -307h266l82 307h154zM719 616h-78l-155 -579h78zM298 616h-78l-155 -579h78z" />
+<glyph unicode="&#x210e;" horiz-adv-x="513" d="M469 106l14 -11q-2 -3 -18.5 -23.5t-26.5 -29.5l-25 -24q-16 -15 -31.5 -22t-31.5 -7t-28.5 10t-12.5 32t64 267q7 24 7 44q0 35 -24 35t-63 -42.5t-71 -90.5q-58 -88 -67 -122l-32 -122h-78l152 600q2 8 2 10q0 22 -31 22q-13 0 -29 -2l-2 14l159 24l-109 -416h4 q12 14 43 53l52 65q22 26 55.5 48.5t65.5 22.5q29 0 43 -20t14 -50q0 -18 -11 -64l-58 -230q0 -2 -1 -5t-1 -5q0 -14 13 -14q22 0 63 53z" />
+<glyph unicode="&#x2110;" horiz-adv-x="897" d="M63 95h-2q0 -23 35.5 -51t84.5 -28q102 0 174 53.5t138 201.5q15 35 27 59q-56 12 -90 48t-34 93q0 91 86 145q65 40 183 40q51 0 118 -8q40 27 76 27q12 0 20.5 -5.5t8.5 -14.5q0 -52 -109 -52q-36 -26 -69 -83t-77 -152q74 20 125 99l16 -10q-51 -100 -157 -124 q-79 -170 -133 -227q-117 -121 -285 -121q-77 0 -125 35.5t-48 86.5q0 31 17 51.5t42 20.5q22 0 36.5 -13.5t14.5 -34.5q0 -20 -11.5 -34t-31.5 -14q-23 0 -30 12zM729 601v2q-15 1 -53 1q-100 0 -154 -24q-36 -16 -60.5 -47.5t-24.5 -70.5q0 -34 25 -64t74 -36 q45 87 89.5 143t103.5 96z" />
+<glyph unicode="&#x2112;" horiz-adv-x="946" d="M608 643l-12 -19q-55 33 -145 33q-86 0 -154 -42t-68 -115q0 -74 66.5 -116t175.5 -42q25 0 63 5l30 57l30 59q13 23 26 43q42 63 106.5 113t121.5 50q42 0 62.5 -22.5t20.5 -59.5q0 -68 -87 -143.5t-217 -110.5q-47 -102 -119 -185.5t-136 -108.5q69 -23 103 -23 q141 0 265 139l19 -14q-131 -156 -281 -156q-84 0 -164 30q-70 -24 -155 -24q-126 0 -126 61q0 23 29.5 40t78.5 17q21 0 46 -5.5t39 -10.5t46.5 -18t41.5 -16q42 27 99.5 98t104.5 158q-26 -3 -53 -3q-50 0 -96.5 10.5t-88 31.5t-67 60t-25.5 90q0 78 73.5 130.5 t181.5 52.5q99 0 165 -44zM890 588q0 44 -49 44q-55 0 -108.5 -80t-89.5 -183q45 12 104 45q62 34 102.5 80t40.5 94zM266 35v1q-74 43 -125 43q-67 0 -67 -25q0 -33 87 -33q66 0 105 14z" />
+<glyph unicode="&#x2113;" horiz-adv-x="579" d="M77 389l14 26q36 -25 94 -25q85 125 174.5 211t147.5 86q64 0 64 -67q0 -81 -96.5 -161t-225.5 -99q-143 -231 -143 -298q0 -43 36 -43q33 0 76.5 38t122.5 129l21 -17q-85 -99 -133.5 -139.5t-93.5 -40.5q-37 0 -62 22.5t-25 64.5q0 84 77 218q12 22 40 66q-49 2 -88 29 zM268 396l1 -1q117 26 194.5 91.5t77.5 137.5q0 31 -35 31q-37 0 -82 -47q-58 -59 -156 -212z" />
+<glyph unicode="&#x2115;" horiz-adv-x="727" d="M755 653l-174 -653h-111l-262 528h-4l-142 -528h-37l175 653h112l262 -527h2l142 527h37zM561 70l-271 546h-63l-7 -28l273 -551h59z" />
+<glyph unicode="&#x2116;" horiz-adv-x="1046" d="M1031 355q0 -86 -62.5 -155t-147.5 -69q-52 0 -80.5 36t-28.5 89q0 83 63.5 150t146.5 67q49 0 79 -34t30 -84zM970 395q0 24 -12 38.5t-35 14.5q-41 0 -77.5 -44.5t-54.5 -98t-18 -93.5q0 -25 12 -40t36 -15q39 0 75 45.5t55 100t19 92.5zM945 49l-17 -60h-280l19 60 h278zM536 183l107 386q12 42 38 70.5t65 28.5q30 0 52 -19t22 -49q0 -21 -14 -34.5t-35 -13.5t-32.5 12.5t-18 25t-13.5 12.5q-5 0 -9 -3t-8 -8t-6.5 -10.5t-5 -13.5t-4.5 -13t-3.5 -12t-2.5 -9l-155 -548h-19l-162 550h-2l-123 -429q-34 -121 -112 -121q-31 0 -53.5 22.5 t-22.5 53.5q0 22 13.5 36t35.5 14q20 0 32 -10t14.5 -22.5t6.5 -22.5t11 -10q24 0 53 101l127 449q-23 41 -86 39l5 18h163l140 -470h2z" />
+<glyph unicode="&#x2119;" horiz-adv-x="687" d="M192 653h333q73 0 117 -44.5t44 -117.5q0 -95 -56 -160q-72 -84 -223 -84h-170l-66 -247h-154zM605 595l-81 -296q57 17 91 73t34 118q0 66 -44 105zM486 293l85 313q-23 10 -58 10h-177l-89 -332h159q53 0 80 9zM298 616h-78l-155 -579h78z" />
+<glyph unicode="&#x211a;" horiz-adv-x="723" d="M606 -19l8 -33q-37 -19 -82 -19q-33 0 -63 20t-47 51q-60 -18 -124 -18q-121 0 -192 63.5t-71 182.5t51.5 219t147.5 159.5t216 59.5q121 0 192 -63.5t71 -182.5q0 -134 -67 -245t-186 -161q30 -48 77 -48q37 0 69 15zM641 541l-121 -454q75 54 115.5 139t40.5 180 q0 73 -35 135zM477 60l136 512q-28 27 -72.5 42t-86.5 15q-111 0 -182 -40l-137 -514q23 -22 54 -34q51 62 131 62q41 0 66.5 -13.5t52.5 -47.5q21 8 38 18zM107 108l121 454q-75 -56 -115.5 -140.5t-40.5 -179.5q0 -80 35 -134zM399 30q-32 36 -82 36q-54 0 -90 -38 q35 -9 70 -9q49 0 102 11z" />
+<glyph unicode="&#x211b;" horiz-adv-x="944" d="M852 669l7 -19q-34 -14 -66 -38q83 -53 83 -139q0 -64 -48.5 -111t-131.5 -50v-2q54 -40 54 -84q0 -37 -38 -97t-38 -77q0 -34 32 -34q52 0 145 101l17 -16q-101 -115 -176 -115q-37 0 -65 23.5t-28 58.5q0 33 21 63.5t42 58t21 53.5q0 48 -33 48q-30 0 -47 11 q-82 -169 -178.5 -244t-217.5 -75q-77 0 -125 36t-48 87q0 31 17 51t42 20q22 0 36.5 -13.5t14.5 -34.5q0 -20 -11.5 -34t-31.5 -14q-23 0 -30 12h-2q0 -28 35 -53.5t85 -25.5q93 0 152.5 52t144.5 203q78 139 131.5 214t120.5 124q-76 48 -192 48q-149 0 -250 -75 t-101 -174q0 -41 30 -68.5t73 -27.5q159 0 205 245h20q-7 -107 -68.5 -191t-158.5 -84q-63 0 -102.5 35.5t-39.5 94.5q0 107 111 191t282 84q125 0 221 -59q36 23 84 41zM814 486q0 64 -48 102q-11 -10 -21 -23l-18 -23q-8 -10 -19 -28l-16 -26l-16 -32l-16 -31l-17 -35 q-13 -27 -17 -36q34 0 60 -17q57 6 92.5 50t35.5 99z" />
+<glyph unicode="&#x211d;" horiz-adv-x="687" d="M192 653h333q73 0 117 -44.5t44 -117.5q0 -92 -51.5 -149.5t-142.5 -73.5l137 -268h-172l-125 264h-90l-71 -264h-154zM604 597l-74 -281q59 19 89 65t30 109q0 70 -45 107zM491 309l79 296q-31 11 -55 11h-179l-84 -315h159q51 0 80 8zM567 37l-114 228q-11 -2 -34 -2 q-8 0 -23.5 0.5t-22.5 0.5l107 -227h87zM298 616h-78l-155 -579h78z" />
+<glyph unicode="&#x2122;" horiz-adv-x="980" d="M957 653v-20q-32 -2 -44 -14t-12 -41v-254q0 -36 6.5 -43.5t43.5 -11.5v-20h-170v20q37 4 43 11.5t6 43.5v235l-154 -312h-11l-151 310v-223q0 -36 10.5 -48.5t42.5 -16.5v-20h-131v20q32 4 42 16.5t10 48.5v249q-21 48 -69 50v20h121l154 -309l160 309h103zM375 565h-20 q-11 37 -26 52.5t-41 15.5h-50v-309q0 -36 6.5 -43.5t43.5 -11.5v-20h-171v20q37 4 43.5 11.5t6.5 43.5v309h-49q-27 0 -42.5 -15.5t-25.5 -52.5h-20v88h345v-88z" />
+<glyph unicode="&#x2124;" horiz-adv-x="754" d="M750 616l-534 -576v-3h429l-9 -37h-629v37l539 577v2h-404l9 37h599v-37zM698 616h-100l-537 -579h103z" />
+<glyph unicode="&#x212c;" horiz-adv-x="950" d="M895 660l7 -19q-42 -19 -72 -40q72 -59 72 -138q0 -50 -44.5 -93.5t-108.5 -51.5v-2q45 -19 67.5 -55t22.5 -75q0 -44 -25.5 -89t-70.5 -75q-49 -33 -112 -33q-44 0 -69 24t-25 54q0 50 36 85.5t102 46.5l4 -23q-42 -5 -73.5 -33t-31.5 -61q0 -20 14.5 -34t35.5 -14 q36 0 61 15q36 21 57 63.5t21 90.5q0 69 -46 95q-24 -6 -49 -6q-38 0 -47 19q-157 -326 -414 -326q-77 0 -125 35.5t-48 86.5q0 31 17 51.5t42 20.5q22 0 36.5 -13.5t14.5 -34.5q0 -20 -11.5 -34t-31.5 -14q-23 0 -30 12h-2q0 -28 35 -53.5t85 -25.5q95 0 161.5 53.5 t150.5 201.5q71 125 134.5 203t140.5 127q-81 56 -210 56q-93 0 -177.5 -31.5t-139.5 -92.5t-55 -137q0 -47 30 -76.5t81 -29.5q84 0 144 75t65 196h20q0 -125 -64 -213t-170 -88q-63 0 -105 37t-42 106q0 66 40 122t102.5 90t132.5 53t136 19q144 0 244 -67q34 20 87 40z M841 485q0 53 -40 95q-45 -38 -81.5 -92.5t-80.5 -139.5q7 4 23 4q27 0 55 -14q60 5 92 49t32 98z" />
+<glyph unicode="&#x212f;" horiz-adv-x="627" d="M534 196l20 -20q-92 -93 -170 -140t-154 -47q-52 0 -79 29.5t-27 81.5q0 46 18 92q-34 4 -65 23.5t-47 48.5l23 17q29 -57 101 -62q44 91 132.5 156.5t176.5 65.5q32 0 51.5 -14t19.5 -41q0 -56 -85.5 -114.5t-224.5 -79.5q-42 -74 -42 -118q0 -26 15 -40.5t39 -14.5 q119 0 298 177zM245 227l1 -1q105 15 181.5 64.5t76.5 93.5q0 27 -36 27q-47 0 -106 -46.5t-117 -137.5z" />
+<glyph unicode="&#x2130;" horiz-adv-x="750" d="M421 658l-10 -18q-44 17 -110 17q-72 0 -116 -31t-44 -80q0 -53 55 -83.5t136 -30.5q6 65 56 118t116.5 80.5t129.5 27.5q100 0 100 -73q0 -62 -97.5 -118.5t-233.5 -66.5q1 -6 4 -12q75 -3 75 -31t-42 -28q-28 0 -53 14q-88 -23 -141.5 -83t-53.5 -126q0 -49 39 -84 t105 -35q94 0 149 60q35 38 35 85q0 34 -24 54t-63 20q-53 0 -99.5 -39.5t-64.5 -102.5l-21 6q20 82 74.5 130t127.5 48q66 0 100 -31.5t34 -83.5q0 -68 -78 -122t-180 -54q-91 0 -153.5 44.5t-62.5 124.5q0 79 63 140.5t174 84.5v2q-2 2 -4 7l-3 9q-2 4 -4 4 q-107 2 -171.5 41.5t-64.5 106.5q0 57 52.5 97.5t136.5 40.5q75 0 132 -29zM693 588q0 15 -15 24t-37 9q-72 0 -150 -62t-88 -129q118 7 204 57.5t86 100.5z" />
+<glyph unicode="&#x2131;" horiz-adv-x="919" d="M896 662l11 -15q-89 -73 -176 -73q-57 0 -181 30t-168 30q-93 0 -148 -39t-55 -104q0 -56 31.5 -84t75.5 -28q71 0 114.5 43.5t71.5 132.5l20 -1q-39 -205 -209 -205q-59 0 -102 37t-43 98q0 78 64 132q76 64 227 64q56 0 180.5 -28t173.5 -28q47 0 113 38zM657 568 l14 -14q-34 -33 -57 -83t-50 -134q69 14 121 15q18 27 40 42t38 15q23 0 23 -22q0 -15 -20.5 -37.5t-51.5 -37.5q-8 -22 -8 -60q0 -12 3 -26l-59 -20v18q0 33 11 70q-62 -3 -115 -12q-105 -282 -354 -282q-59 0 -104 28.5t-45 82.5q0 32 16.5 50.5t43.5 18.5q20 0 35 -14.5 t15 -34.5q0 -21 -12 -35.5t-32 -14.5q-21 0 -29 13h-2q4 -27 33.5 -45t72.5 -18q76 0 132.5 48t120.5 177q-97 -31 -177 -85l-13 15q58 70 216 124q3 6 8 17.5t6 13.5q30 69 72 120t108 107z" />
+<glyph unicode="&#x2133;" horiz-adv-x="1072" d="M1048 672l8 -13q-142 -225 -230.5 -393t-88.5 -213q0 -35 33 -35q55 0 170 132l19 -16q-120 -146 -203 -146q-37 0 -61.5 22t-24.5 60q0 149 308 563l-1 2q-66 -25 -144.5 -120t-185.5 -284q-81 -143 -113 -181q-46 -54 -100 -54q-25 0 -40.5 19t-15.5 51q0 88 143 307 q126 196 192 270l-1 1q-53 -22 -118.5 -91t-120.5 -156l-51 -83l-48 -76l-40 -64q-24 -38 -39 -58.5t-35 -45.5t-35 -37.5t-33.5 -25t-36.5 -17.5t-37 -5q-34 0 -57 22.5t-23 55.5q0 28 17.5 46.5t41.5 18.5q22 0 37 -16t15 -36q0 -18 -12 -31t-31 -13q-8 0 -15 4h-3 q3 -21 31 -21q50 0 98 51t127 184q145 242 238.5 333t179.5 91q7 0 17 -2l15 -12q-100 -141 -191.5 -297t-130.5 -245q-17 -45 -17 -61q0 -18 13 -18q18 0 36.5 23t49.5 72l60 100l68 117q28 48 72.5 110.5t82.5 103t86.5 72t96.5 37.5q16 0 28 -2z" />
+<glyph unicode="&#x2134;" horiz-adv-x="697" d="M668 223l12 -25q-31 -21 -75 -21q-41 0 -69 18q-119 -206 -269 -206q-51 0 -80 29.5t-29 87.5q0 46 18 91q-29 -24 -82 -24q-33 0 -64 17l10 26q31 -13 57 -13q68 0 123 72t130.5 119t146.5 47q39 0 63 -24.5t24 -62.5q0 -62 -34 -130q25 -17 59 -17q36 0 59 16zM554 355 q-5 51 -55 51q-53 0 -122 -62.5t-115 -139.5t-46 -121q0 -27 14 -45.5t42 -18.5q56 0 118 46t116 146q-16 25 -16 59q0 29 19 55t45 30z" />
+<glyph unicode="&#x213c;" horiz-adv-x="635" d="M630 391h-119l-74 -268q-14 -52 -14 -79q0 -11 4 -19q23 0 43 8t30 16t32 28l29 27l27 -26q-5 -4 -22 -19.5t-20 -18.5l-18 -14q-13 -11 -17.5 -12.5t-16.5 -8.5t-20 -8.5t-21.5 -4.5t-27 -3.5t-30.5 -0.5q-44 0 -74 25.5t-30 68.5q0 22 9 53l71 256h-84l-106 -391h-141 l108 391h-95v37h577v-37zM475 391h-68l-65 -241q-14 -51 -14 -68q0 -49 56 -57l2 2q0 42 13 89zM252 391h-66l-99 -354h66z" />
+<glyph unicode="&#x213f;" horiz-adv-x="750" d="M780 653l-173 -653h-155l165 616h-266l-166 -616h-155l176 653h574zM733 616h-79l-154 -579h79zM312 616h-78l-156 -579h80z" />
+<glyph unicode="&#x2145;" horiz-adv-x="713" d="M192 653h251q116 0 188 -64t72 -179q0 -183 -117 -296.5t-300 -113.5h-269zM631 539l-114 -430q71 41 110 124.5t39 171.5q0 86 -35 134zM470 86l129 473q-46 57 -156 57h-108l-153 -579h110q95 0 178 49zM298 616h-78l-156 -579h80z" />
+<glyph unicode="&#x2146;" horiz-adv-x="581" d="M634 683l-188 -683h-137l10 48q-54 -59 -140 -59q-65 0 -102 43t-37 109q0 72 27.5 139.5t85 114t131.5 46.5q37 0 73 -15t51 -45h2l83 302h141zM587 646h-67l-168 -609h67zM346 150l29 102q10 35 10 56q0 38 -23 67t-60 29q-43 0 -65 -10l-98 -356q14 -12 56 -12 q51 0 94 37t57 87zM107 56l90 326q-57 -31 -88.5 -97.5t-31.5 -136.5q0 -37 30 -92z" />
+<glyph unicode="&#x2147;" horiz-adv-x="515" d="M408 128l28 -21q-46 -60 -96 -89t-120 -29q-84 0 -132 44t-48 126q0 114 80.5 198t194.5 84q70 0 120 -40t50 -108q0 -46 -22 -110h-282l-37 -140q30 -17 77 -17q45 0 79 14t52 30.5t56 57.5zM365 220h71q12 34 12 67q0 56 -40 86zM329 220l47 169q-36 15 -66 15 q-42 0 -72 -13l-47 -171h138zM110 56l89 324q-50 -23 -86 -93.5t-36 -129.5q0 -49 33 -101z" />
+<glyph unicode="&#x2148;" horiz-adv-x="293" d="M346 653l-36 -135h-142l37 135h141zM299 616h-67l-17 -61h68zM285 428l-118 -428h-140l117 428h141zM238 391h-67l-97 -354h67z" />
+<glyph unicode="&#x2149;" horiz-adv-x="341" d="M394 653l-36 -135h-142l37 135h141zM347 616h-67l-17 -61h68zM329 428l-125 -469q-21 -79 -84 -127.5t-145 -48.5q-43 0 -79 16l25 33q34 -13 69 -13q27 0 42 7l160 602h137zM280 391h-60l-152 -568q29 14 54.5 44t33.5 60z" />
+<glyph unicode="&#x2202;" horiz-adv-x="471" d="M195 625l-10 20q38 23 98 23q188 0 188 -260q0 -49 -8 -101t-29 -110t-53 -103.5t-85 -75t-120 -29.5q-69 0 -102.5 46t-33.5 116q0 109 75.5 196.5t181.5 87.5q69 0 96 -48q7 39 7 70q0 77 -30.5 129t-100.5 52q-33 0 -74 -13zM367 319q0 44 -18.5 65t-42.5 21 q-73 0 -129 -90.5t-56 -197.5q0 -98 67 -98q54 0 97.5 59t66.5 143q15 55 15 98z" />
+<glyph unicode="&#x2212;" horiz-adv-x="675" d="M590 220h-504v66h504v-66z" />
+<glyph unicode="&#x2423;" d="M460 -120h-420v136h30v-76h360v76h30v-136z" />
+<glyph unicode="&#x2460;" horiz-adv-x="684" d="M304 473v25q26 1 54.5 5.5t46.5 9t19 4.5q7 0 7 -11q0 -2 -7 -30l-76 -266q-7 -28 -7 -30q0 -19 34 -19h15v-20h-173v20q35 2 48.5 7.5t17.5 18.5l75 259l4 20q0 10 -20 10q-5 0 -38 -3zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244 q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2461;" horiz-adv-x="684" d="M251 413l-20 6q36 98 130 98q45 0 74.5 -28.5t29.5 -71.5q0 -29 -19 -55.5t-70 -73.5l-101 -93h95q26 0 38.5 7t23.5 28l19 -6l-32 -83h-218v19l124 122l43 44q13 13 26 35.5t13 43.5q0 27 -18 43.5t-51 16.5q-58 0 -87 -52zM684 330q0 -145 -99 -244.5t-242 -99.5 q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2462;" horiz-adv-x="684" d="M290 443l-20 6q32 68 109 68q37 0 61.5 -20.5t24.5 -52.5q0 -65 -78 -84q46 -23 46 -79q0 -68 -50 -107.5t-119 -39.5q-70 0 -72 38q0 13 7.5 21t20.5 8q18 0 42 -18q20 -15 42 -15q35 0 55 23.5t20 58.5q0 84 -97 84h-18v21l32 7q22 4 33.5 7t28.5 9t26 13t15.5 19 t6.5 27q0 20 -14.5 32t-37.5 12q-32 0 -64 -38zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88 t86 214z" />
+<glyph unicode="&#x2463;" horiz-adv-x="684" d="M462 517l-68 -234h58l-10 -48h-62l-25 -95h-54l26 95h-159l15 48l249 234h30zM386 439l-164 -156h116zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5 t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2464;" horiz-adv-x="684" d="M487 517l-19 -52h-142l-17 -37q63 -10 99.5 -42.5t36.5 -87.5q0 -71 -53 -117.5t-130 -46.5q-31 0 -50 10t-19 29q0 12 7.5 20.5t18.5 8.5q14 0 38 -17q19 -15 37 -15q40 0 71.5 32.5t31.5 74.5q0 44 -34 66q-32 23 -105 32v19l64 123h165zM684 330q0 -145 -99 -244.5 t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2465;" horiz-adv-x="684" d="M479 524v-21q-52 -7 -102.5 -38t-82.5 -77q19 6 47 6q45 0 76.5 -29.5t31.5 -75.5q0 -65 -45 -110t-110 -45q-55 0 -85 34t-30 94q0 57 28.5 108.5t79.5 88.5q42 30 82.5 43.5t109.5 21.5zM387 297q0 30 -19 46t-50 16q-44 0 -64.5 -38t-20.5 -90q0 -33 16.5 -51.5 t41.5 -18.5q44 0 70 43.5t26 92.5zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2466;" horiz-adv-x="684" d="M495 506l-235 -372h-54l218 331h-123q-29 0 -46 -8.5t-39 -32.5l-18 9l54 84h233zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89 t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2467;" horiz-adv-x="684" d="M484 436q0 -34 -20.5 -54.5t-69.5 -34.5q35 -29 49.5 -53t14.5 -54q0 -48 -36.5 -77.5t-93.5 -29.5q-53 0 -90 25.5t-37 74.5q0 78 108 110q-27 27 -37.5 45t-10.5 40q0 43 30 66t81 23q50 0 81 -22.5t31 -58.5zM436 430q0 27 -18.5 44.5t-46.5 17.5q-27 0 -42 -14 t-15 -37q0 -16 11.5 -32t44.5 -43q37 15 51.5 30t14.5 34zM405 224q0 22 -12 39t-60 60q-38 -13 -61 -39t-23 -57t25 -50t58 -19t53 19t20 47zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5 t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2468;" horiz-adv-x="684" d="M200 134v21q36 6 61.5 18.5t58.5 37.5q46 36 70 76q-31 -21 -73 -21q-41 0 -69.5 29.5t-28.5 73.5q0 62 42.5 105t103.5 43q54 0 85.5 -34t31.5 -91q0 -117 -113 -198q-35 -26 -70.5 -38t-98.5 -22zM428 423q0 67 -58 67q-42 0 -65.5 -35t-23.5 -79q0 -75 58 -75 q89 0 89 122zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24b6;" horiz-adv-x="684" d="M544 141h-164v22q50 3 50 20q0 5 -2 15l-16 67h-133l-34 -56q-15 -26 -15 -34q0 -11 40 -12v-22h-124v22q23 4 37.5 19.5t45.5 65.5l169 276h19l75 -310q7 -30 17 -40t35 -11v-22zM404 299l-30 124l-75 -124h105zM684 330q0 -145 -99 -244.5t-242 -99.5 q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24b7;" horiz-adv-x="684" d="M238 517h152q130 0 130 -92q0 -64 -80 -84q58 -26 58 -85q0 -57 -44 -86t-119 -29h-165v22q26 5 34 11.5t14 28.5l63 242q5 17 5 33q0 8 -9.5 11.5t-38.5 5.5v22zM322 357h18q114 0 114 72q0 31 -16.5 44.5t-52.5 13.5q-17 0 -22.5 -2t-8.5 -13zM313 323l-18 -75l-14 -60 q0 -17 39 -17q50 0 79 21.5t29 62.5q0 48 -41 63q-15 5 -74 5zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5 t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24b8;" horiz-adv-x="684" d="M544 524l-21 -125h-20q-9 92 -94 92q-79 0 -132 -62t-53 -142q0 -115 115 -115q40 0 73 14.5t72 51.5l18 -14q-86 -90 -179 -90q-78 0 -127.5 41.5t-49.5 114.5q0 99 77.5 166.5t177.5 67.5q44 0 73 -9q16 -5 28 -5q14 0 23 14h19zM684 330q0 -145 -99 -244.5t-242 -99.5 q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24b9;" horiz-adv-x="684" d="M211 517h160q77 0 125 -42.5t48 -117.5q0 -100 -72.5 -158t-177.5 -58h-148v22q25 5 32.5 11t12.5 26l60 248q4 17 4 30q0 16 -44 17v22zM318 470l-60 -246q-7 -29 -7 -39q0 -14 37 -14q85 0 136.5 54.5t51.5 138.5q0 73 -47 105q-28 18 -73 18q-34 0 -38 -17zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24ba;" horiz-adv-x="684" d="M520 517l-17 -99h-17q1 13 1 33q-1 21 -21 27.5t-85 6.5q-36 0 -38 -9l-30 -121h36q37 0 50 8t27 42h16l-37 -141h-17q4 20 4 36q0 21 -33 21h-54l-14 -57q-18 -72 -18 -79q1 -12 43 -12q72 0 109 21q25 14 48 48h21l-36 -101h-288v22q25 4 31.5 10t11.5 26l62 251 q4 15 4 28t-45 17v22h286zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24bb;" horiz-adv-x="684" d="M520 517l-17 -99h-18l2 22q0 30 -18 37.5t-91 7.5q-31 0 -35 -12l-30 -118h37q36 0 48.5 8.5t27.5 39.5h17l-39 -143h-17q4 20 4 37q0 16 -8 20t-30 4h-48l-28 -118q-5 -20 -5 -25q0 -12 43 -15v-22h-145v22q24 1 32 9.5t13 28.5l60 246q4 19 4 32q0 8 -8 11t-36 5v22 h285zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24bc;" horiz-adv-x="684" d="M544 333v-22q-30 -2 -40.5 -8t-15.5 -27l-25 -107q-67 -35 -141 -35q-76 0 -126 43t-50 118q0 95 68 162t162 67q42 0 80 -13q17 -6 25 -6q21 0 37 19h12l-27 -125h-19q-3 40 -22 62q-28 31 -81 31q-76 0 -120.5 -64.5t-44.5 -145.5q0 -55 32 -85t88 -30q24 0 43.5 9 t23.5 22l22 73q4 15 4 25q0 11 -48 15v22h163zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88 t86 214z" />
+<glyph unicode="&#x24bd;" horiz-adv-x="684" d="M537 517v-22q-19 -4 -26 -11.5t-11 -24.5l-69 -258q-5 -23 -5 -25q0 -9 28 -13v-22h-143v22q48 4 56 38l31 121h-125l-31 -121q-5 -20 -5 -25q0 -11 25 -13v-22h-133v22q21 2 32 11.5t17 31.5l63 239q5 19 5 33q0 8 -7.5 11.5t-29.5 5.5v22h144v-22q-37 -3 -45 -34 l-25 -103h126l25 94q3 9 3 26q-2 15 -35 17v22h135zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5 t211 88t86 214z" />
+<glyph unicode="&#x24be;" horiz-adv-x="684" d="M448 517v-22q-25 -3 -33.5 -12t-15.5 -38l-60 -235q-7 -25 -7 -35q0 -12 25 -12v-22h-133v22q39 4 49 43l62 235q7 26 7 35q0 10 -8.5 13.5t-29.5 5.5v22h144zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100 q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24bf;" horiz-adv-x="684" d="M480 517v-22q-17 -2 -27 -8t-12.5 -11.5t-5.5 -17.5l-52 -202q-17 -65 -40 -93.5t-78 -28.5q-36 0 -58.5 16t-22.5 40q0 16 10.5 26.5t24.5 10.5t24 -8t10 -22q0 -5 -1.5 -9.5t-1.5 -7.5q0 -15 21 -15q24 0 34 41l63 239q5 20 5 32q0 9 -7 12.5t-30 5.5v22h144zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c0;" horiz-adv-x="684" d="M544 517v-22q-19 0 -43 -18l-162 -121l100 -159q13 -21 22.5 -26.5t37.5 -7.5v-22h-161v22q41 2 41 13q0 7 -17 33l-76 123l-30 -122q-6 -22 -6 -29q0 -9 9 -12.5t33 -5.5v-22h-149v22q26 3 34 9t13 25l62 258q4 20 4 22q0 15 -47 18v22h163v-22q-48 -3 -56 -36l-22 -96 l78 56q75 54 75 66q0 6 -17 8l-17 2v22h131zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88 t86 214z" />
+<glyph unicode="&#x24c1;" horiz-adv-x="684" d="M492 253l-34 -112h-276v22q38 4 47 38l65 244q6 23 6 32q0 16 -38 18v22h144v-22q-21 -1 -30.5 -10.5t-14.5 -27.5l-60 -233q-6 -24 -6 -32q0 -11 10.5 -14.5t40.5 -3.5q39 0 57.5 4t34.5 17q22 17 39 58h15zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100 t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c2;" horiz-adv-x="684" d="M571 517v-22q-23 -4 -31 -11t-13 -25l-67 -257q-5 -22 -5 -26q0 -7 8.5 -9.5t33.5 -3.5v-22h-150v22q38 3 50 47l61 231l-185 -300h-11l-19 295l-56 -225q-4 -20 -4 -27q0 -18 39 -21v-22h-106v22q21 2 30.5 15t19.5 55l55 222q5 19 5 27q0 10 -39 13v22h96l16 -273 l171 273h101zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c3;" horiz-adv-x="684" d="M520 517v-22q-23 -8 -30.5 -19.5t-17.5 -59.5l-60 -282h-11l-118 301l-47 -222q-4 -22 -4 -28q0 -17 37 -20v-22h-99v22q21 3 29.5 17t18.5 64l42 194q4 24 4 29q0 10 -11.5 18t-28.5 8v22h79l106 -274h1l43 202q4 16 4 28q0 18 -36 22v22h99zM684 330q0 -145 -99 -244.5 t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c4;" horiz-adv-x="684" d="M543 378q0 -98 -78 -171t-177 -73q-63 0 -102.5 37.5t-39.5 102.5q0 93 77 171.5t173 78.5q68 0 107.5 -40t39.5 -106zM473 407q0 41 -22.5 63t-59.5 22q-74 0 -124.5 -79t-50.5 -153q0 -47 22 -70.5t61 -23.5q40 0 74 25.5t55 63.5t33 78.5t12 73.5zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c5;" horiz-adv-x="684" d="M249 517h139q132 0 132 -92q0 -59 -44 -87t-112 -28q-36 0 -53 6l-30 -117q-4 -16 -4 -22q2 -14 42 -14v-22h-150v22q24 3 34 13.5t17 37.5l58 219q9 33 9 44q0 16 -38 18v22zM351 470l-32 -124q13 -1 26 -1q51 0 79.5 15.5t29.5 59.5q1 35 -18 51t-56 16q-24 0 -29 -17z M684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c6;" horiz-adv-x="684" d="M162 116l-13 18q60 39 101 72q-49 12 -76 47.5t-27 88.5q0 96 76 172.5t173 76.5q65 0 105.5 -40t40.5 -102q0 -96 -76 -172t-177 -76l-18 -18q33 0 91 -14q35 -8 58 -8q33 0 54.5 9.5t48.5 34.5l17 -13q-68 -83 -156 -83q-44 0 -94 15q-37 10 -56 10q-36 0 -72 -18z M472 473q0 42 -22 64t-59 22q-74 0 -124 -77t-50 -156q0 -43 22 -68t56 -25q77 0 127 79t50 161zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5 t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c7;" horiz-adv-x="684" d="M520 141h-91l-82 181l-35 2l-27 -108q-8 -28 -8 -38q0 -14 42 -15v-22h-150v22q24 3 34 14t17 38l61 228q6 23 6 32q0 11 -7.5 14t-30.5 6v22h145q55 0 90 -22.5t35 -64.5q0 -85 -108 -103l55 -122q10 -24 21 -33t33 -9v-22zM351 470l-30 -114q11 -1 26 -1q51 0 79 18 t28 52q0 62 -72 62q-26 0 -31 -17zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c8;" horiz-adv-x="684" d="M492 523l-22 -122h-18q-2 47 -15.5 68.5t-52.5 21.5q-28 0 -45 -12.5t-17 -34.5q0 -18 9.5 -30.5t52.5 -50.5q42 -38 57 -62.5t15 -55.5q0 -49 -36 -80t-88 -31q-32 0 -68 13q-19 7 -27 7q-18 0 -24 -20h-16l18 137h21q-3 -9 -3 -26q0 -35 23 -57t60 -22q32 0 52 17 t20 45q0 9 -5.5 20t-11.5 20t-18 22t-18 19l-19 19l-14 12q-29 26 -38.5 45t-9.5 44q0 44 33 69t78 25q35 0 57 -8q17 -5 26 -5q17 0 26 13h18zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5 t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24c9;" horiz-adv-x="684" d="M531 516l-28 -103h-20q2 18 2 27q0 23 -13 33t-43 10h-36l-67 -259q-10 -38 -10 -48q0 -13 39 -13v-22h-160v22q33 1 44.5 11.5t19.5 38.5l71 270q-69 0 -91 -12.5t-43 -57.5h-22l28 103h329zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244 q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24ca;" horiz-adv-x="684" d="M538 517v-22q-24 -6 -30.5 -16t-19.5 -61l-40 -158q-15 -58 -51.5 -92t-90.5 -34q-56 0 -94 25.5t-38 67.5q0 23 9 55l41 156q8 27 8 40q0 16 -43 17v22h155v-22q-26 -1 -36.5 -10.5t-17.5 -35.5l-47 -185q-5 -20 -5 -43q0 -25 19.5 -38t50.5 -13q44 0 69.5 22.5 t45.5 100.5l33 128q10 40 10 55t-38 19v22h110zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88 t86 214z" />
+<glyph unicode="&#x24cb;" horiz-adv-x="684" d="M544 517v-22q-21 -1 -33 -19l-214 -335h-13l-61 274q-12 54 -19.5 65.5t-33.5 14.5v22h150v-22q-27 -3 -35.5 -7t-8.5 -13q0 -10 2 -20l44 -218l118 189q25 38 25 51q0 15 -39 18v22h118zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244 q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24cc;" horiz-adv-x="684" d="M569 517v-21q-16 -5 -23.5 -12t-16.5 -26l-151 -317h-12l-35 245l-110 -245h-12l-42 284q-8 54 -17 63q-4 4 -29 7v22h130v-22q-21 -2 -29 -6.5t-8 -14.5q0 -12 2 -20l28 -199l80 179l-5 33q-2 17 -9.5 21.5t-31.5 6.5v22h131v-22q-34 -4 -34 -17q0 -9 5 -49l23 -174 l89 189q10 23 10 34q0 16 -36 17v22h103zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88 t86 214z" />
+<glyph unicode="&#x24cd;" horiz-adv-x="684" d="M520 517v-21q-38 -17 -66 -52l-81 -103l57 -139q9 -22 19 -29t38 -10v-22h-147v22q40 0 40 13q0 7 -9 27l-38 88l-71 -94q-11 -15 -11 -21q0 -13 36 -13v-22h-117v22q24 5 43 23.5t70 85.5l38 49l-57 140q-7 17 -17 24.5t-34 9.5v22h143v-22q-37 -5 -37 -15q0 -7 10 -30 l31 -77l72 90q8 11 8 19q0 12 -34 13v22h114zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88 t86 214z" />
+<glyph unicode="&#x24ce;" horiz-adv-x="684" d="M536 517v-21q-32 -10 -52 -33l-128 -149l-26 -101q-8 -29 -8 -36q0 -14 41 -14v-22h-165v22q54 0 64 40l30 112l-54 146q-7 19 -15.5 25t-34.5 9v22h156v-22q-45 -4 -45 -13q0 -8 8 -29l38 -105l81 91q30 33 30 42q0 10 -46 14v22h126zM684 330q0 -145 -99 -244.5 t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24cf;" horiz-adv-x="684" d="M520 500l-260 -326h82q76 0 100 18q21 16 42 55h18l-28 -106h-304v17l261 326h-89q-59 0 -81 -14q-20 -13 -38 -51h-18l25 98h290v-17zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5z M642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d0;" horiz-adv-x="684" d="M482 264l16 -12q-40 -43 -58.5 -56.5t-38.5 -13.5q-30 0 -30 31q0 16 7 43q-59 -73 -121 -73q-30 0 -50 19t-20 53q0 67 58.5 126.5t123.5 59.5q37 0 53 -27l5 20l4 3l40 4l8 -3l-5 -20q-50 -177 -50 -191q3 -3 6 -3q10 0 52 40zM408 388q0 28 -34 28q-46 0 -81 -47 q-46 -59 -46 -109q0 -38 39 -38q38 0 77 51q45 58 45 115zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5 t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d1;" horiz-adv-x="684" d="M337 469l-42 -145q50 69 112 69q34 0 57 -20t23 -55q0 -68 -63.5 -126t-136.5 -58q-31 0 -60 10.5t-29 26.5q0 3 1 5l79 283q5 17 5 21q0 8 -42 9v21q53 5 103 14l6 -7q-8 -32 -13 -48zM427 310q0 43 -44 43q-40 0 -82 -60q-41 -61 -41 -119q0 -15 27 -15q42 0 76 31 q27 24 45.5 58t18.5 62zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d2;" horiz-adv-x="684" d="M428 262l15 -12q-61 -68 -128 -68q-48 0 -75 24t-27 70q0 69 57.5 117t127.5 48q32 0 53 -15t21 -36q0 -14 -10 -23t-24 -9q-29 0 -29 28q0 7 4.5 16t4.5 10q0 4 -22 4q-55 0 -89 -44.5t-34 -95.5q0 -61 60 -61q43 0 95 47zM684 330q0 -145 -99 -244.5t-242 -99.5 q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d3;" horiz-adv-x="684" d="M496 524l8 -7q-2 -7 -17 -55l-59 -211q-2 -8 -7 -26l-9 -31q-3 -12 -3 -14q0 -5 10 -5q12 0 51 39l15 -11q-49 -69 -100 -69q-13 0 -22 9t-9 22q0 12 4 30q-45 -59 -104 -59q-35 0 -54.5 18.5t-19.5 53.5q0 68 59.5 126.5t122.5 58.5q32 0 43 -28l23 80q7 23 7 37 q0 7 -42 8v21q52 3 103 13zM392 340q0 27 -28 27q-48 0 -85.5 -54.5t-37.5 -100.5q0 -37 37 -37q42 0 78 52t36 113zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330 q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d4;" horiz-adv-x="684" d="M433 261l16 -12q-59 -67 -138 -67q-41 0 -67.5 23t-26.5 61q0 66 59.5 120.5t133.5 54.5q27 0 42 -12t15 -32q0 -39 -49 -68.5t-134 -39.5q-4 -9 -4 -25q0 -20 17 -32t44 -12q40 0 92 41zM418 399q0 16 -21 16q-27 0 -55 -26.5t-48 -72.5q50 6 87 28t37 55zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d5;" horiz-adv-x="684" d="M278 432h56q14 44 19 52q39 76 100 76q23 0 39 -12.5t16 -29.5q0 -12 -7.5 -21t-20.5 -9q-27 0 -27 23q0 6 4 12.5t4 7.5q0 6 -10 6q-46 0 -65 -105h65l-6 -28h-65l-35 -160q-32 -149 -117 -149q-22 0 -37 11t-15 27q0 12 7.5 20t19.5 8q11 0 18 -6.5t7 -16.5 q0 -7 -6 -15q2 -5 9 -5q37 0 53 78l42 208h-54zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88 t86 214z" />
+<glyph unicode="&#x24d6;" horiz-adv-x="684" d="M500 467h-30q3 -7 3 -24q0 -41 -38.5 -71t-86.5 -30q-12 0 -19 1.5t-8 1.5q-7 0 -13 -5.5t-6 -11.5q0 -9 46 -18q103 -22 103 -84q0 -41 -38.5 -66.5t-105.5 -25.5q-56 0 -89 18.5t-33 53.5q0 23 14 39.5t56 38.5q-11 9 -11 22q0 30 36 47q-42 21 -42 69q0 45 41.5 73.5 t95.5 28.5q41 0 79 -21h46v-36zM412 460q0 38 -37 38q-30 0 -53.5 -26t-23.5 -63q0 -41 40 -41q33 0 54 31q20 31 20 61zM404 207q0 21 -33 35q-15 7 -31 12t-34 9.5t-24 6.5q-53 -24 -53 -54q0 -56 87 -56q38 0 63 14t25 33zM684 330q0 -145 -99 -244.5t-242 -99.5 q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d7;" horiz-adv-x="684" d="M480 214l16 -11q-33 -40 -53.5 -55t-45.5 -15q-32 0 -32 30q0 18 10 51l33 113q3 11 3 18q0 6 -15 6q-17 0 -43.5 -21t-50.5 -53q-20 -27 -31 -52t-26 -87h-56l87 322q5 18 5 20q0 9 -25 9h-20v21q62 6 104 14l8 -7l-63 -226q75 101 135 101q22 0 34 -12.5t12 -32.5 q0 -7 -6 -31l-34 -117q-5 -18 -5 -23q0 -4 8 -4q13 0 51 42zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5 t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d8;" horiz-adv-x="684" d="M406 473q0 -15 -9.5 -25t-23.5 -10q-15 0 -26 10.5t-11 24.5q0 15 10.5 25t24.5 10q15 0 25 -10.5t10 -24.5zM387 214l15 -11q-27 -39 -47 -54.5t-44 -15.5q-15 0 -25 9.5t-10 27.5q0 13 13 62l26 95q5 17 5 24q0 6 -41 6v21q62 2 101 15l10 -8l-57 -196q-2 -6 -2 -11 q0 -6 7 -6q14 0 49 42zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24d9;" horiz-adv-x="684" d="M462 527q0 -14 -10 -24t-24 -10q-15 0 -25.5 10.5t-10.5 24.5t10 24.5t24 10.5q15 0 25.5 -11t10.5 -25zM445 443l-54 -219q-32 -129 -116 -129q-23 0 -38 11t-15 28q0 12 9 21t20 9t18.5 -7.5t7.5 -16.5q0 -4 -7 -16q2 -5 9 -5q18 0 29 19.5t24 72.5l38 155q8 32 8 40 q0 11 -27 11h-20v20q59 3 106 13zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24da;" horiz-adv-x="684" d="M485 385v-22q-25 -1 -50 -15t-89 -64l22 -43q35 -67 52 -67q13 0 38 38l17 -10q-25 -40 -40.5 -54.5t-35.5 -14.5q-31 0 -59 48q-10 17 -38 73l-22 -16l-27 -99h-55l81 296q10 39 10 47q0 6 -31 6h-15v21q37 2 105 15l7 -7l-65 -241l40 29q67 48 67 55q0 3 -21 3h-12v22 h121zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24db;" horiz-adv-x="684" d="M415 518l-83 -316q-6 -20 -6 -28q0 -4 9 -4q15 0 54 50l17 -9q-30 -44 -52 -60.5t-48 -16.5q-35 0 -35 36q0 9 5 29l71 269l2 15q0 5 -28 5h-14v21q47 5 99 15zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100 q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24dc;" horiz-adv-x="684" d="M559 263l18 -9q-53 -72 -104 -72q-29 0 -29 34q0 13 7 36l35 122q3 10 3 19q0 7 -13 7t-36.5 -17t-44.5 -44q-23 -29 -35.5 -58t-30.5 -94h-57l18 59q40 133 40 147q0 7 -12 7q-17 0 -43.5 -21t-50.5 -55q-26 -36 -60 -137h-56l28 87q31 96 31 123q0 6 -25 6h-19v21 q91 14 109 17l8 -3l-28 -96q72 99 130 99q21 0 32.5 -11t11.5 -29t-13 -57q25 34 38.5 49.5t39 31.5t53.5 16q18 0 29 -11.5t12 -29.5q0 -8 -4 -30l-37 -131q-4 -8 -4 -14q0 -4 5 -4q14 0 39 26zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244 q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24dd;" horiz-adv-x="684" d="M482 263l16 -11q-36 -43 -54.5 -56.5t-41.5 -13.5q-15 0 -25 9t-10 27q0 16 8 43l27 87q8 28 8 40t-17 12q-36 0 -94 -80q-17 -24 -26.5 -46t-30.5 -87h-56l55 189q3 10 3 19q0 8 -24 8h-20v21q31 4 110 17l8 -3l-33 -99q77 102 136 102q45 0 45 -42q0 -19 -4 -32 l-32 -111q-7 -21 -7 -31q0 -4 8 -4q12 0 51 42zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88 t86 214z" />
+<glyph unicode="&#x24de;" horiz-adv-x="684" d="M486 355q0 -68 -59.5 -120.5t-128.5 -52.5q-47 0 -74 22.5t-27 61.5q0 70 59 122.5t133 52.5q42 0 69.5 -23t27.5 -63zM426 366q0 50 -46 50q-48 0 -85.5 -55t-37.5 -105q0 -49 50 -49t84.5 53t34.5 106zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100 t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24df;" horiz-adv-x="684" d="M343 523l6 -8q-2 -10 -12 -45q46 53 103 53q40 0 62 -21.5t22 -59.5q0 -74 -61 -132t-135 -58q-24 0 -46 9l-18 -65l-4 -23q0 -10 44 -10v-22h-143v22q21 0 29.5 6.5t13.5 25.5l67 246q9 29 9 39q0 8 -26 8h-19v22zM457 436q0 27 -9.5 38t-31.5 11q-26 0 -50 -18t-35 -43 q-14 -33 -26 -75t-12 -58q0 -15 30 -15q53 0 93.5 52.5t40.5 107.5zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215 q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e0;" horiz-adv-x="684" d="M496 516l-96 -320q-1 -4 -2.5 -9.5t-2.5 -8.5t-1 -4q0 -11 35 -11h14v-22h-165v22q52 2 61 30l43 136q-33 -42 -61 -58.5t-64 -16.5q-33 0 -53.5 20t-20.5 55q0 71 62.5 132.5t131.5 61.5q40 0 53 -31l9 24h57zM418 468q0 12 -11.5 20.5t-27.5 8.5q-50 0 -89.5 -56 t-39.5 -104q0 -40 32 -40q27 0 54 19q31 24 56.5 71t25.5 81zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5 t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e1;" horiz-adv-x="684" d="M343 437l-25 -92q26 45 55 69q32 27 55 27q16 0 27.5 -10t11.5 -24q0 -37 -33 -37q-17 0 -26 11t-13 11q-17 0 -50 -50q-23 -33 -35 -61.5t-34 -98.5h-57l49 171q10 35 10 40q0 12 -24 12h-24v22q59 6 106 14zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100 t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e2;" horiz-adv-x="684" d="M455 440l-13 -88h-18q-7 63 -54 63q-34 0 -34 -23q0 -18 36 -51q47 -46 47 -80q0 -38 -25 -58t-67 -20q-22 0 -37 5q-13 5 -27 5q-15 0 -18 -10h-15l11 97h17q12 -72 63 -72q44 0 44 32q0 23 -37 61q-46 46 -46 75q0 64 80 64q19 0 38 -5q16 -4 21 -4q13 0 19 9h15z M684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e3;" horiz-adv-x="684" d="M442 446l-6 -38h-67l-52 -190q-7 -24 -7 -29t10 -5q9 0 20.5 11t40.5 45l20 -13q-39 -54 -63.5 -73.5t-54.5 -19.5q-41 0 -42 33q0 6 11 52l49 189h-53l-3 13q0 18 28 24q21 4 51 25t48 46q7 8 15 8q11 0 11 -12q0 -5 -3 -17l-14 -49h61zM684 330q0 -145 -99 -244.5 t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e4;" horiz-adv-x="684" d="M470 265l17 -10q-32 -44 -52 -58t-44 -14q-35 0 -35 33q0 25 17 83q-48 -68 -77 -92.5t-62 -24.5q-38 0 -38 36q0 21 15 75l17 64q8 28 8 41q0 8 -24 8h-16v21q68 7 101 14l7 -4l-49 -190l-4 -16q0 -7 11 -7q28 0 87 78q36 47 67 134h55l-52 -182q-7 -23 -7 -29 q0 -3 6 -3q13 0 52 43zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e5;" horiz-adv-x="684" d="M207 406v21q24 2 54 8t35 6q17 0 36 -123q5 -28 9 -77q43 36 70.5 76t27.5 59q0 3 -11 11q-19 14 -19 29q0 11 8 18t20 7q17 0 28.5 -11t11.5 -28q0 -39 -38 -87q-46 -58 -97 -104q-34 -29 -41 -29q-9 0 -9 21q0 66 -23 160q-7 27 -14 35t-24 8h-24zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e6;" horiz-adv-x="684" d="M388 428l27 -184q97 100 97 132q0 1 -15 13q-15 13 -15 28q0 10 8.5 17t19.5 7q16 0 28 -11t12 -27q0 -63 -138 -198q-24 -23 -31 -23t-11 30l-24 150l-47 -74q-3 -4 -13 -20.5t-18 -28.5l-18 -27q-10 -14 -18 -22t-12 -8q-12 0 -12 31q0 26 -8.5 85.5t-18.5 90.5 q-4 11 -9.5 14t-18.5 3h-22v21l31 5l34 6q15 3 17 3q7 0 10 -3.5t7 -20.5q16 -60 25 -141l112 156q7 9 11 9q8 0 10 -13zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330 q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e7;" horiz-adv-x="684" d="M363 388l6 -23q33 43 54 59.5t42 16.5q13 0 21.5 -7.5t8.5 -18.5q0 -27 -24 -27q-5 0 -14.5 5t-19.5 5q-19 0 -59 -65l29 -90q6 -18 18 -18t28 19l17 20l16 -11q-31 -42 -48.5 -56.5t-37.5 -14.5q-16 0 -25.5 9t-17.5 33l-20 59l-51 -61q-22 -25 -34 -32.5t-28 -7.5 q-17 0 -27.5 8.5t-10.5 22.5q0 11 7 18t18 7q8 0 19.5 -5.5t18.5 -5.5q12 0 31 24l49 60l-19 62q-7 21 -13 28t-17 7q-16 0 -37 -6l-6 19l10 4q53 16 77 16q13 0 22 -11.5t17 -41.5zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246 t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e8;" horiz-adv-x="684" d="M374 369l13 -54q75 104 75 139q0 4 -19 14q-19 11 -19 29q0 12 8 19.5t21 7.5q17 0 28.5 -11.5t11.5 -28.5q0 -57 -82 -179q-75 -112 -129 -151q-27 -20 -50 -20q-17 0 -28.5 9t-12.5 23q0 13 8.5 21.5t21.5 8.5q11 0 23 -8t16 -8q15 0 33 18q51 51 51 67q0 14 -24 86.5 t-40 104.5q-16 33 -49 33q-8 0 -26 -2v22q30 4 55 8l34 5q9 2 12 2q7 0 33 -59t35 -96zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89 t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24e9;" horiz-adv-x="684" d="M473 425l-184 -192q23 -4 37.5 -13.5t37.5 -33.5q14 -15 22.5 -20.5t23.5 -5.5q13 0 13 7q0 1 -4.5 7.5t-4.5 14.5q0 10 8 17t18 7q11 0 18.5 -8.5t7.5 -21.5q0 -20 -18 -34t-46 -14q-25 0 -78 26q-42 21 -68 21q-13 0 -30 -11l-14 14l197 210h-75q-25 0 -36.5 -7 t-20.5 -28l-21 4l23 77h194v-16zM684 330q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x24ea;" horiz-adv-x="684" d="M488 376q0 -89 -53.5 -165.5t-133.5 -76.5q-49 0 -76.5 36t-27.5 100q0 101 56 177.5t129 76.5q49 0 77.5 -39.5t28.5 -108.5zM431 422q0 73 -50 73q-32 0 -58 -30t-40 -73.5t-21.5 -84.5t-7.5 -71q0 -35 12.5 -54t34.5 -19q34 0 61 29t41 72.5t21 84t7 73.5zM684 330 q0 -145 -99 -244.5t-242 -99.5q-144 0 -243.5 100t-99.5 244q0 146 100.5 246t247.5 100q139 0 237.5 -101.5t98.5 -244.5zM642 330q0 127 -86 215.5t-211 88.5t-214 -89t-89 -215q0 -125 89 -213.5t214 -88.5t211 88t86 214z" />
+<glyph unicode="&#x2500;" horiz-adv-x="708" d="M719 267h-730v73h730v-73z" />
+<glyph unicode="&#x2502;" horiz-adv-x="708" d="M390 -303h-73v1213h73v-1213z" />
+<glyph unicode="&#x250c;" horiz-adv-x="708" d="M720 267h-330v-570h-73v643h403v-73z" />
+<glyph unicode="&#x2510;" horiz-adv-x="708" d="M390 -303h-73v570h-328v73h401v-643z" />
+<glyph unicode="&#x2514;" horiz-adv-x="708" d="M720 267h-403v643h73v-570h330v-73z" />
+<glyph unicode="&#x2518;" horiz-adv-x="708" d="M390 267h-401v73h328v570h73v-643z" />
+<glyph unicode="&#x251c;" horiz-adv-x="708" d="M719 267h-329v-570h-73v1213h73v-570h329v-73z" />
+<glyph unicode="&#x2524;" horiz-adv-x="708" d="M390 -303h-73v570h-328v73h328v570h73v-1213z" />
+<glyph unicode="&#x252c;" horiz-adv-x="708" d="M719 267h-329v-570h-73v570h-328v73h730v-73z" />
+<glyph unicode="&#x2534;" horiz-adv-x="708" d="M719 267h-730v73h328v570h73v-570h329v-73z" />
+<glyph unicode="&#x253c;" horiz-adv-x="708" d="M719 267h-329v-570h-73v570h-328v73h328v570h73v-570h329v-73z" />
+<glyph unicode="&#x2550;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-730v73h730v-73z" />
+<glyph unicode="&#x2551;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM483 -303h-73v1213h73v-1213z" />
+<glyph unicode="&#x2552;" horiz-adv-x="708" d="M720 174h-330v-477h-73v736h403v-73h-330v-113h330v-73z" />
+<glyph unicode="&#x2553;" horiz-adv-x="708" d="M720 267h-237v-570h-73v562h-112v-562h-73v643h495v-73z" />
+<glyph unicode="&#x2554;" horiz-adv-x="708" d="M719 360h-421v-663h-73v736h494v-73zM719 174h-236v-477h-73v550h309v-73z" />
+<glyph unicode="&#x2555;" horiz-adv-x="708" d="M390 -303h-73v477h-328v73h328v113h-328v73h401v-736z" />
+<glyph unicode="&#x2556;" horiz-adv-x="708" d="M483 -303h-73v570h-112v-570h-73v570h-236v73h494v-643z" />
+<glyph unicode="&#x2557;" horiz-adv-x="708" d="M483 -303h-73v663h-421v73h494v-736zM298 -303h-73v477h-236v73h309v-550z" />
+<glyph unicode="&#x2558;" horiz-adv-x="708" d="M720 174h-403v736h73v-477h330v-73h-330v-113h330v-73z" />
+<glyph unicode="&#x2559;" horiz-adv-x="708" d="M720 267h-495v643h73v-570h112v570h73v-570h237v-73z" />
+<glyph unicode="&#x255a;" horiz-adv-x="708" d="M719 360h-309v550h73v-477h236v-73zM719 174h-494v736h73v-663h421v-73z" />
+<glyph unicode="&#x255b;" horiz-adv-x="708" d="M390 174h-401v73h328v113h-328v73h328v477h73v-736z" />
+<glyph unicode="&#x255c;" horiz-adv-x="708" d="M483 267h-494v73h236v570h73v-570h112v570h73v-643z" />
+<glyph unicode="&#x255d;" horiz-adv-x="708" d="M298 360h-309v73h236v477h73v-550zM483 174h-494v73h421v663h73v-736z" />
+<glyph unicode="&#x255e;" horiz-adv-x="708" d="M720 174h-330v-477h-73v1213h73v-477h330v-73h-330v-113h330v-73z" />
+<glyph unicode="&#x255f;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM720 267h-237v-570h-73v1213h73v-570h237v-73z" />
+<glyph unicode="&#x2560;" horiz-adv-x="708" d="M298 -303h-73v1213h73v-1213zM720 360h-310v550h73v-477h237v-73zM720 174h-237v-477h-73v550h310v-73z" />
+<glyph unicode="&#x2561;" horiz-adv-x="708" d="M390 -303h-73v477h-328v73h328v113h-328v73h328v477h73v-1213z" />
+<glyph unicode="&#x2562;" horiz-adv-x="708" d="M483 -303h-73v1213h73v-1213zM298 -303h-73v570h-236v73h236v570h73v-1213z" />
+<glyph unicode="&#x2563;" horiz-adv-x="708" d="M483 -303h-73v1213h73v-1213zM298 360h-309v73h236v477h73v-550zM298 -303h-73v477h-236v73h309v-550z" />
+<glyph unicode="&#x2564;" horiz-adv-x="708" d="M719 360h-730v73h730v-73zM719 174h-329v-477h-73v477h-328v73h730v-73z" />
+<glyph unicode="&#x2565;" horiz-adv-x="708" d="M719 267h-236v-570h-73v570h-112v-570h-73v570h-236v73h730v-73z" />
+<glyph unicode="&#x2566;" horiz-adv-x="708" d="M719 360h-730v73h730v-73zM719 174h-236v-477h-73v550h309v-73zM298 -303h-73v477h-236v73h309v-550z" />
+<glyph unicode="&#x2567;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-730v73h328v477h73v-477h329v-73z" />
+<glyph unicode="&#x2568;" horiz-adv-x="708" d="M719 267h-730v73h236v570h73v-570h112v570h73v-570h236v-73z" />
+<glyph unicode="&#x2569;" horiz-adv-x="708" d="M719 174h-730v73h730v-73zM719 360h-309v550h73v-477h236v-73zM298 360h-309v73h236v477h73v-550z" />
+<glyph unicode="&#x256a;" horiz-adv-x="708" d="M719 174h-329v-477h-73v477h-328v73h328v113h-328v73h328v477h73v-477h329v-73h-329v-113h329v-73z" />
+<glyph unicode="&#x256b;" horiz-adv-x="708" d="M719 267h-236v-570h-73v570h-112v-570h-73v570h-236v73h236v570h73v-570h112v570h73v-570h236v-73z" />
+<glyph unicode="&#x256c;" horiz-adv-x="708" d="M719 360h-309v550h73v-477h236v-73zM298 360h-309v73h236v477h73v-550zM719 174h-236v-477h-73v550h309v-73zM298 -303h-73v477h-236v73h309v-550z" />
+<glyph unicode="&#x1d434;" horiz-adv-x="717" d="M685 0h-285v16h16q40 0 56 14.5t16 46.5q0 7 -2 21l-13 113h-198l-84 -140q-10 -11 -10 -26q2 -29 43 -29h29v-16h-218v16q67 8 108 74l356 577h18l78 -581q10 -70 74 -70h16v-16zM466 248l-25 227h-6l-139 -227h170z" />
+<glyph unicode="&#x1d435;" horiz-adv-x="696" d="M198 653h252q236 0 236 -145q0 -102 -91 -147q-28 -14 -74 -26l3 -4q52 -9 89.5 -44t37.5 -94q0 -82 -72 -137.5t-217 -55.5h-324l4 16h20q52 0 74 16.5t29 46.5l123 495q2 10 2 21q0 42 -78 42h-19zM406 611l-59 -252q30 -6 53 -6q82 0 125 44t43 119q0 52 -35 75 t-84 23q-23 0 -43 -3zM338 314l-68 -267q32 -9 71 -9q80 0 135 41t55 131q0 52 -40 80t-102 28q-36 0 -51 -4z" />
+<glyph unicode="&#x1d436;" horiz-adv-x="671" d="M711 659l-53 -223h-16q1 8 1 42q0 59 -35 101.5t-117 42.5q-72 0 -134 -34t-101.5 -88t-61.5 -119.5t-22 -130.5q0 -91 49.5 -152.5t145.5 -61.5q126 0 216 98q9 10 17 20l20 -13q-35 -53 -89 -92q-87 -61 -193 -61q-138 0 -213 80t-75 198q0 112 60 203t161.5 140.5 t221.5 49.5q27 0 79.5 -13.5t78.5 -13.5t42 27h18z" />
+<glyph unicode="&#x1d437;" horiz-adv-x="790" d="M194 653h282q140 0 214.5 -72.5t74.5 -202.5q0 -162 -115.5 -270t-305.5 -108h-306l4 16h18q90 0 105 62l122 497q4 16 4 24q0 37 -77 37h-25zM405 612l-122 -504q-5 -19 -5 -27q0 -43 95 -43q69 0 123 30.5t85 79.5t47 104t16 111q0 48 -8 89t-26.5 79.5t-56 61 t-89.5 22.5q-35 0 -59 -3z" />
+<glyph unicode="&#x1d438;" horiz-adv-x="714" d="M734 653l-42 -158h-16q2 26 2 35q-4 87 -109 87h-160l-60 -248h80q51 0 81 19t45 76h16l-58 -242h-17q0 2 3 26t3 34q0 51 -72 51h-90l-66 -258q-2 -8 -2 -10q0 -27 63 -27h67q115 0 169 36t88 124h16l-66 -198h-571l4 16h19q89 0 104 62l120 488q5 22 5 36q0 19 -16 27 t-59 8h-19l4 16h534z" />
+<glyph unicode="&#x1d439;" horiz-adv-x="618" d="M723 653l-40 -160h-16q1 8 1 36q-3 87 -110 87h-147l-62 -248h83q36 0 57.5 5.5t41.5 27t30 62.5h16l-60 -242h-16q5 23 5 61q0 50 -70 50h-97l-62 -254q0 -1 -2 -9t-2 -12q0 -41 79 -41h32l-4 -16h-342l4 16h18q52 0 75 16t31 46l124 497q4 16 4 24q0 39 -76 39h-19 l4 15h520z" />
+<glyph unicode="&#x1d43a;" horiz-adv-x="734" d="M734 329v-16q-59 0 -81.5 -15.5t-31.5 -46.5l-62 -216q-37 -22 -80 -33t-68.5 -12.5t-68.5 -1.5q-127 0 -209.5 63.5t-82.5 190.5q0 106 55 203t156.5 160t223.5 63q53 0 103 -16q6 -2 28 -11.5t35 -9.5q15 0 28 12t15 25h16l-45 -223h-16q2 20 2 32q0 62 -40.5 108 t-119.5 46q-66 0 -120.5 -27.5t-90.5 -71.5t-60.5 -100.5t-35.5 -114t-11 -113.5q0 -34 8 -63t27 -56.5t56.5 -43.5t89.5 -16q57 0 97 25l57 201q3 12 3 25q0 18 -16 27.5t-59 9.5h-19l4 16h313z" />
+<glyph unicode="&#x1d43b;" horiz-adv-x="873" d="M923 653l-4 -16h-18q-52 0 -75 -16.5t-31 -46.5l-123 -496q-4 -18 -4 -28q0 -34 78 -34h19l-4 -16h-329l4 16h18q51 0 74.5 16t30.5 46l61 242h-280l-61 -242q-4 -12 -4 -24q0 -38 77 -38h20l-4 -16h-330l4 16h18q91 0 106 62l123 496q4 12 4 24q0 39 -78 39h-20l4 16 h330l-4 -16h-18q-54 0 -76 -16t-29 -47l-52 -217h278l53 217q4 20 4 24q0 39 -76 39h-20l4 16h330z" />
+<glyph unicode="&#x1d43c;" horiz-adv-x="480" d="M530 653l-4 -16h-19q-53 0 -75.5 -16t-30.5 -46l-123 -497q-3 -12 -3 -29q0 -33 78 -33h17l-4 -16h-328l4 16h19q52 0 75 16.5t30 45.5l123 497q4 16 4 24q0 38 -77 38h-18l4 16h328z" />
+<glyph unicode="&#x1d43d;" horiz-adv-x="540" d="M620 653l-4 -16h-18q-92 0 -108 -63l-103 -413q-25 -100 -92 -145q-44 -28 -109 -28q-53 0 -89.5 26.5t-36.5 70.5q0 30 17.5 50.5t52.5 20.5q25 0 44.5 -14.5t19.5 -36.5q0 -17 -13.5 -31.5t-13.5 -27.5q0 -21 24 -21q49 0 74 96q117 455 117 477q0 39 -75 39h-20l4 16 h329z" />
+<glyph unicode="&#x1d43e;" horiz-adv-x="762" d="M802 653l-4 -16q-35 0 -59 -12t-61 -41l-271 -211l187 -278q26 -38 54.5 -58.5t72.5 -20.5l-4 -16h-287l4 16h11q24 0 35.5 6.5t11.5 26.5q0 6 -1.5 11t-3.5 7.5t-5 8.5l-6 8l-156 237h-4l-62 -243q-3 -12 -3 -22q0 -40 78 -40h17l-4 -16h-304l4 16h18q68 0 84 62 l117 472q10 39 10 49q0 38 -76 38h-18l4 16h312l-4 -16h-11q-51 0 -70 -15.5t-27 -46.5l-53 -209h5l282 221q18 14 18 29q-1 11 -11 16t-40 5l4 16h216z" />
+<glyph unicode="&#x1d43f;" horiz-adv-x="708" d="M668 190l-61 -190h-569l4 16h17q92 0 107 62l118 477q7 28 7 45q0 37 -76 37h-18l4 16h327l-4 -16h-18q-52 0 -74.5 -16t-30.5 -47l-122 -481q-5 -19 -5 -31q0 -24 40 -24h122q79 0 122.5 23.5t76.5 91.5q9 14 17 37h16z" />
+<glyph unicode="&#x1d440;" horiz-adv-x="1005" d="M1055 653l-4 -16h-17q-55 0 -76 -15t-29 -46l-127 -498q-2 -7 -2 -28q0 -34 77 -34h19l-4 -16h-330l4 16h17q54 0 76 16.5t29 45.5l112 439h-6l-345 -517h-25l-94 517h-3l-109 -428q-5 -22 -5 -40q0 -33 76 -33h20l-4 -16h-267l4 16h19q54 0 76.5 19t31.5 54l119 475 q5 21 5 38q0 35 -77 35h-19l4 16h213l89 -493h4l333 493h215z" />
+<glyph unicode="&#x1d441;" horiz-adv-x="851" d="M901 653l-4 -16h-18q-53 0 -76.5 -16t-30.5 -47l-144 -574h-24l-274 526h-6l-108 -448q-3 -12 -3 -27q0 -35 76 -35h19l-4 -16h-266l4 16h18q91 0 106 62l126 509q-22 50 -92 50h-19l4 16h200l236 -465h5l97 386q4 18 4 26q0 37 -76 37h-20l4 16h266z" />
+<glyph unicode="&#x1d442;" horiz-adv-x="732" d="M712 420q0 -75 -29 -151t-80 -138.5t-130 -102t-170 -39.5q-112 0 -182.5 65t-70.5 168q0 77 29.5 155.5t81 144t131 106.5t171.5 41q118 0 183.5 -73.5t65.5 -175.5zM596 443q0 86 -34.5 137.5t-106.5 51.5q-66 0 -118 -34t-82.5 -84.5t-50 -115.5t-26.5 -119t-7 -102 q0 -70 39.5 -110t100.5 -40t111 30t81.5 75.5t53 103t30.5 110t9 97.5z" />
+<glyph unicode="&#x1d443;" horiz-adv-x="594" d="M201 653h271q117 0 174.5 -48t57.5 -112q0 -82 -71.5 -140.5t-213.5 -58.5q-44 0 -74 5q-4 0 -12 2l-56 -223q-3 -12 -3 -23q0 -39 77 -39h32l-4 -16h-341l4 16h17q53 0 75.5 16t30.5 46l125 497q4 16 4 25q0 37 -78 37h-19zM411 613l-68 -274q32 -8 60 -8q78 0 130 48 t52 124q0 50 -29.5 81.5t-95.5 31.5q-24 0 -49 -3z" />
+<glyph unicode="&#x1d444;" horiz-adv-x="781" d="M83 -115l164 107q-88 13 -142.5 73.5t-54.5 156.5q0 76 34 155.5t91 143.5t141 105t176 41q110 0 174.5 -65.5t64.5 -181.5q0 -102 -56 -201t-157.5 -164t-219.5 -65l-64 -43l4 -5q21 4 43 4q30 0 114.5 -17t130.5 -17q74 0 136 66l13 -11q-48 -59 -105.5 -89t-141.5 -30 q-68 0 -142 16l-47 11q-34 8 -53.5 12t-33.5 4q-21 0 -58 -18zM612 467q0 163 -130 163q-63 0 -117 -34t-89 -86t-60 -115t-35.5 -119t-10.5 -100q0 -72 35 -110.5t96 -38.5q77 0 139.5 46t98 116t54.5 142.5t19 135.5z" />
+<glyph unicode="&#x1d445;" horiz-adv-x="740" d="M725 16l-2 -16h-169l-150 315q-20 -2 -29 -2q-10 0 -38 4l-62 -239q-3 -12 -3 -23q0 -39 76 -39h19l-4 -16h-325l4 16h16q52 0 74.5 16t30.5 46l124 497q5 20 5 25q0 37 -77 37h-20l4 16h271q113 0 164.5 -41t51.5 -110q0 -62 -48.5 -108.5t-129.5 -62.5l115 -229 q18 -37 41 -60t61 -26zM410 613l-64 -260q17 -4 32 -4q96 0 143.5 38t47.5 104q0 73 -34 99t-91 26q-18 0 -34 -3z" />
+<glyph unicode="&#x1d446;" horiz-adv-x="650" d="M680 668l-53 -221h-16q1 8 1 24q0 68 -40.5 114t-119.5 46q-41 0 -81 -24.5t-40 -72.5q0 -14 3 -27.5t11 -26.5l14 -22q6 -9 20 -22l21 -20q6 -6 24 -21l24 -20q55 -46 86.5 -90.5t31.5 -103.5q0 -79 -65.5 -135t-178.5 -56q-49 0 -107 19t-94 19q-32 0 -55 -38h-16 l60 236h16q0 -5 0.5 -15.5t0.5 -15.5q3 -70 42 -118.5t129 -48.5q156 0 156 136q0 50 -46 96q-16 16 -56.5 51t-57.5 51q-73 73 -73 131q0 69 56.5 122t166.5 53q46 0 106 -18.5t77 -18.5q14 0 24 12t13 25h16z" />
+<glyph unicode="&#x1d447;" horiz-adv-x="550" d="M670 653l-46 -179h-16q5 42 5 71q0 31 -17.5 47.5t-36 20t-45.5 3.5h-98l-133 -538q-5 -22 -5 -25q0 -37 76 -37h21l-4 -16h-329l4 16h18q54 0 76.5 16t29.5 46l133 538h-91q-62 0 -109.5 -40.5t-61.5 -101.5h-16l46 179h599z" />
+<glyph unicode="&#x1d448;" horiz-adv-x="705" d="M775 653l-4 -16h-16q-52 0 -75.5 -16.5t-31.5 -46.5l-87 -356q-9 -36 -20 -65t-32.5 -61.5t-49 -54t-71.5 -36t-99 -14.5q-111 0 -166.5 55t-55.5 132q0 6 6 46.5t8 48.5l76 330q1 2 1 7q0 31 -75 31h-18l4 16h328l-4 -16h-17q-54 0 -76 -16t-30 -47l-90 -360 q-7 -26 -7 -68q0 -45 38 -78.5t106 -33.5q149 0 195 189l86 351q4 14 4 26q-1 19 -17.5 28t-57.5 9h-19l4 16h263z" />
+<glyph unicode="&#x1d449;" horiz-adv-x="575" d="M760 653l-4 -16q-77 -5 -132 -77l-441 -576h-24v571q0 82 -99 82l4 16h294l-4 -16h-19q-44 0 -57 -19t-13 -51v-391l4 -1l280 366q38 48 38 74q0 22 -52 22h-20l4 16h241z" />
+<glyph unicode="&#x1d44a;" horiz-adv-x="916" d="M1101 653l-4 -16q-78 -4 -134 -77l-438 -576h-29v442h-11l-297 -442h-29v569q0 41 -23.5 62.5t-65.5 21.5h-10l4 16h288l-4 -16h-7q-19 0 -29 -1.5t-23 -7.5t-18.5 -21.5t-5.5 -40.5v-377h5l226 332v61q0 55 -82 55h-8l4 16h285l-4 -16h-18q-71 0 -71 -72v-395h6l278 370 q40 52 40 72q0 25 -54 25h-17l4 16h242z" />
+<glyph unicode="&#x1d44b;" horiz-adv-x="790" d="M810 653l-4 -16h-4q-33 0 -58.5 -11t-39.5 -23.5t-37 -39.5l-187 -213l96 -266q11 -32 28 -50t51 -18h14l-4 -16h-281l4 16h11q34 0 50.5 8t16.5 33q0 13 -4 26l-69 194l-181 -201q-12 -13 -12 -28q0 -32 56 -32h22l-4 -16h-249l4 16q78 10 140 77l208 230l-85 231 q-6 18 -10.5 27t-16 25t-30.5 23.5t-45 7.5h-9l4 16h283l-4 -16h-19q-26 0 -39 -7t-13 -28q0 -12 6 -28l60 -179l164 184q15 18 15 34q-2 24 -45 24h-9l4 16h222z" />
+<glyph unicode="&#x1d44c;" horiz-adv-x="535" d="M695 653l-4 -16q-72 -5 -124 -69l-209 -256l-59 -234q-3 -14 -3 -26q0 -36 76 -36h20l-4 -16h-328l4 16h17q53 0 75.5 16t29.5 46l61 246l-89 237q-14 37 -41.5 56.5t-81.5 19.5l4 16h299l-4 -16h-19q-35 0 -46.5 -9.5t-11.5 -30.5q0 -3 7 -27l75 -207h4l174 212 q16 20 16 34q0 28 -79 28l4 16h237z" />
+<glyph unicode="&#x1d44d;" horiz-adv-x="772" d="M802 653l-566 -615h218q42 0 70 4t59.5 17t53 43t34.5 76h16l-46 -178h-581l573 616h-202q-44 0 -71.5 -3t-60.5 -14t-55 -37t-36 -67h-17l48 158h563z" />
+<glyph unicode="&#x1d44e;" horiz-adv-x="502" d="M472 428l-91 -345q-1 -2 -1 -11q0 -17 14 -17q24 0 64 54l12 -12q-28 -42 -64 -74.5t-69 -32.5q-42 0 -42 55q0 15 11 50h-4q-82 -105 -173 -105q-45 0 -67 33.5t-22 85.5q0 67 38 144t104 132.5t134 55.5q30 0 47 -14t19 -32h1l9 33h80zM367 341q0 71 -50 71 q-47 0 -90 -50t-72 -121q-28 -70 -28 -124q0 -66 58 -66q49 0 97 57.5t70 132.5q15 49 15 100z" />
+<glyph unicode="&#x1d44f;" horiz-adv-x="470" d="M214 382l4 -4q65 63 121 63q51 0 81 -43.5t30 -107.5q0 -46 -20 -98t-53.5 -97.5t-85 -75.5t-107.5 -30q-67 0 -139 48l144 563q2 8 2 11q-1 9 -10 15t-19 6q-19 0 -30 -4l-3 16l158 24zM179 252l-55 -215q0 -5 19 -12t36 -7q57 0 102 49t65.5 110.5t20.5 116.5 q0 48 -21 70t-50 22q-47 0 -76 -42.5t-41 -91.5z" />
+<glyph unicode="&#x1d450;" horiz-adv-x="415" d="M363 111l12 -13q-93 -109 -198 -109q-68 0 -102.5 45.5t-34.5 109.5q0 108 79.5 202.5t183.5 94.5q40 0 68.5 -20.5t28.5 -55.5q0 -31 -13.5 -50.5t-40.5 -19.5q-18 0 -28 12t-10 26q0 12 14.5 29.5t14.5 28.5q0 21 -34 21q-55 0 -97.5 -49.5t-60.5 -107t-18 -102.5 q0 -60 27 -84.5t67 -24.5q73 0 142 67z" />
+<glyph unicode="&#x1d451;" horiz-adv-x="532" d="M527 668l-149 -598q-2 -6 -2 -12q0 -9 15 -9q25 0 62 56l11 -12q-28 -41 -63 -73t-67 -32q-40 0 -40 41q0 27 10 64h-5q-84 -105 -171 -105q-49 0 -68.5 38t-19.5 89q0 56 31 130t93 135t133 61q40 0 60 -15t21 -35h2l53 209q2 8 2 12q0 20 -33 20q-6 0 -27 -3l-4 15z M363 340q0 36 -13 53.5t-43 17.5q-46 0 -89.5 -54.5t-67 -123t-23.5 -118.5q0 -34 16 -50t40 -16q50 0 95.5 56t68.5 130q16 51 16 105z" />
+<glyph unicode="&#x1d452;" horiz-adv-x="445" d="M363 112l14 -13q-90 -110 -200 -110q-68 0 -102.5 47t-34.5 109q0 32 6 60q20 89 95.5 162.5t166.5 73.5q40 0 71 -17t31 -59q0 -45 -27.5 -80.5t-71.5 -56t-91.5 -32t-95.5 -13.5v-28q0 -47 33 -77t80 -30q76 0 126 64zM124 211h9q79 0 138.5 46t59.5 111q0 19 -12.5 31 t-31.5 12q-50 0 -93 -61t-70 -139z" />
+<glyph unicode="&#x1d453;" horiz-adv-x="555" d="M248 437h37q28 0 42.5 19.5t29 59.5t29.5 62q59 90 150 90q37 0 58 -16t21 -43q0 -20 -12 -30t-29 -10q-35 0 -35 25q0 8 4.5 21t4.5 16q0 8 -15 8q-36 0 -65 -35.5t-45 -96.5l-19 -70h80l-12 -38h-76l-79 -306q-20 -78 -30 -102q-71 -178 -175 -178q-35 0 -53.5 15 t-18.5 39q0 20 11.5 34.5t31.5 14.5q19 0 28 -10t9 -23q0 -10 -8 -18.5t-8 -13.5q0 -9 15 -9q13 0 25.5 8.5t22.5 25t18 32.5t15.5 41t11.5 40t9.5 38.5t7.5 29.5l87 342h-77z" />
+<glyph unicode="&#x1d454;" horiz-adv-x="492" d="M492 413l-13 -45h-81q17 -20 17 -50q0 -57 -38 -98.5t-103 -49.5q-42 -6 -65 -22t-23 -36t36.5 -32t80 -18.5t80 -31t36.5 -66.5q0 -60 -55.5 -105.5t-159.5 -45.5q-94 0 -139 33t-45 82q0 70 117 108q-24 16 -24 47q0 30 25.5 58.5t59.5 28.5v4q-47 11 -70.5 41 t-23.5 68q0 62 49 110t125 48q60 0 88 -28h126zM336 349q0 31 -11.5 46.5t-42.5 15.5q-39 0 -68.5 -43.5t-29.5 -95.5q0 -81 56 -81q33 0 56 29t31.5 63t8.5 66zM349 -69q0 27 -22.5 44.5t-50 24t-65.5 13.5t-54 13q-1 -1 -11 -6.5t-15 -9.5q-48 -35 -48 -72q0 -39 36 -68 t103 -29q63 0 95 26.5t32 63.5z" />
+<glyph unicode="&#x1d456;" horiz-adv-x="311" d="M257 566q0 -19 -14 -32.5t-34 -13.5q-21 0 -34.5 13t-13.5 33t13.5 35t34.5 15q19 0 33.5 -15.5t14.5 -34.5zM227 441l-92 -364q-1 -6 -1 -14q0 -10 13 -10q6 0 10.5 1.5t7.5 3t9 6.5t9 9t12.5 14t15.5 17l13 -10q-82 -105 -134 -105q-40 0 -40 46q0 31 79 338q2 4 2 12 q0 13 -7 17.5t-24 4.5q-14 0 -28 -4l-3 16z" />
+<glyph unicode="&#x1d457;" horiz-adv-x="389" d="M372 566q0 -19 -14 -32.5t-34 -13.5q-21 0 -34.5 13t-13.5 33t13.5 35t34.5 15q19 0 33.5 -15.5t14.5 -34.5zM351 441l-108 -425q-9 -36 -23.5 -69t-36.5 -64.5t-55 -50.5t-71 -19q-37 0 -55 18.5t-18 42.5q0 20 11.5 36t35.5 16q15 0 25 -10.5t10 -27.5q0 -7 -8 -16.5 t-8 -17.5q0 -3 3 -6.5t7 -3.5q60 0 103 172l92 363q0 22 -32 22q-15 0 -27 -5l-3 17z" />
+<glyph unicode="&#x1d458;" horiz-adv-x="542" d="M527 428l-4 -12q-47 -5 -74 -18t-59 -40l-106 -92l64 -152q13 -31 24 -45t29 -14q9 0 17 4.5t16 13t14 15.5l14 21l13 19l15 -11q0 -1 -8 -17l-16 -26q-6 -11 -18.5 -28.5t-24 -28.5t-28 -19.5t-32.5 -8.5t-29.5 7.5t-23.5 23t-14 24.5l-11 24l-63 147l-56 -49l-45 -166 h-76l148 589q3 9 3 20q0 22 -32 22q-19 0 -27 -2l-3 14l158 25l-113 -456l167 149q21 19 21 36q0 8 -8.5 13.5t-17.5 5.5h-12l4 12h194z" />
+<glyph unicode="&#x1d459;" horiz-adv-x="318" d="M278 668l-148 -591q-1 -4 -1 -11q0 -13 12 -13q15 0 33.5 19t28.5 36l16 -12q-3 -4 -20.5 -25.5t-26 -30.5t-24.5 -23.5t-31.5 -20.5t-32.5 -6q-39 0 -39 51q0 16 6 36l128 510q3 13 3 24q0 22 -31 22q-3 0 -27 -3l-3 15z" />
+<glyph unicode="&#x1d45a;" horiz-adv-x="710" d="M667 107l13 -11q-26 -44 -62 -74t-69 -30q-39 0 -39 49q0 13 6 37l56 221q6 21 6 40q0 38 -24 38q-37 0 -101.5 -94t-77.5 -148l-34 -135h-79l77 299q5 23 5 40q0 38 -23 38q-36 0 -100 -94t-78 -148l-35 -135h-78l95 374q0 31 -33 31q-11 0 -27 -2l-2 14l157 24 l-44 -169h6q111 169 192 169q27 0 41 -23t14 -58q0 -22 -9 -52l-10 -36h5q23 41 58.5 82t71.5 65q32 22 61 22q54 0 54 -71q0 -33 -7 -61l-61 -231q-2 -6 -2 -12q0 -12 15 -12q14 0 31.5 13.5t30.5 39.5z" />
+<glyph unicode="&#x1d45b;" horiz-adv-x="497" d="M467 96l-5 -6q-1 -1 -8.5 -10.5l-10.5 -13.5l-11 -12q-8 -9 -12 -14l-13 -12l-13.5 -11.5t-14 -10t-15 -8t-14.5 -4.5t-16 -2q-41 0 -41 46q0 14 7 40l57 221q7 28 7 42q0 38 -24 38q-44 0 -132 -133q-58 -87 -68 -122l-33 -124h-77l95 374q0 10 -1.5 16.5t-8.5 11 t-20 4.5q-7 0 -28 -3l-2 15l159 23l-51 -189h3q7 0 56 73q93 116 160 116q56 0 56 -62q0 -26 -11 -70l-59 -231q-1 -2 -1 -10q2 -14 15 -14q7 0 14 3.5t14 10.5l12 12q5 5 13 15t9 12z" />
+<glyph unicode="&#x1d45c;" horiz-adv-x="458" d="M438 287q0 -110 -76.5 -204t-186.5 -94q-69 0 -102 49t-33 114t31 131t90.5 112t129.5 46q64 0 105.5 -38.5t41.5 -115.5zM357 318q0 36 -15.5 64.5t-51.5 28.5q-61 0 -115 -91.5t-54 -193.5q0 -107 59 -107q49 0 92 60t64 128t21 111z" />
+<glyph unicode="&#x1d45d;" horiz-adv-x="489" d="M253 370l14 13q61 58 113 58q94 0 94 -155q0 -65 -32.5 -133.5t-92.5 -116.5t-129 -48q-37 0 -61 19l-24 -100q-5 -22 -5 -35q0 -43 61 -43h16l-3 -12h-234l3 12q22 1 36.5 6t23 18t12 22.5t9.5 32.5l117 464q0 12 -1.5 17.5t-8.5 10.5t-21 5q-12 0 -28 -4l-2 16l158 24 l-18 -69zM214 238l-46 -200q18 -21 46 -21q48 0 90 48.5t64 113.5t22 123q0 43 -15.5 63t-35.5 20q-40 0 -75 -41.5t-50 -105.5z" />
+<glyph unicode="&#x1d45e;" horiz-adv-x="458" d="M463 428l-131 -522q-3 -10 -3 -29q0 -22 13 -35t36 -13h14l-3 -12h-250l3 12h19q46 0 65 21t28 57l44 184h-6q-74 -103 -163 -103q-45 0 -67 33.5t-22 81.5q0 89 49.5 173.5t119.5 130.5q50 34 91 34q34 0 52 -15t20 -37h3l7 39h81zM358 338q0 74 -49 74q-27 0 -61 -27 q-48 -39 -85.5 -123t-37.5 -150q0 -63 52 -63q34 0 58 17q50 35 86.5 112.5t36.5 159.5z" />
+<glyph unicode="&#x1d45f;" horiz-adv-x="408" d="M175 267l5 -1q10 20 32 56q75 119 137 119q21 0 32.5 -13.5t11.5 -34.5q0 -31 -18 -56.5t-47 -25.5q-13 0 -21 6t-10.5 13t-6 13t-9.5 6q-27 0 -65.5 -69t-59.5 -124t-28 -80l-21 -76h-77l92 364q4 15 4 23q0 19 -33 19q-9 0 -27 -3l-2 15l157 23z" />
+<glyph unicode="&#x1d460;" horiz-adv-x="440" d="M390 441l-24 -146h-15q0 50 -25.5 85t-66.5 35q-21 0 -36 -14.5t-15 -43.5q0 -22 33.5 -63t67 -89.5t33.5 -89.5q0 -50 -36.5 -87.5t-98.5 -37.5q-20 0 -63.5 10t-46.5 10q-15 0 -30 -21h-17l25 156h16q0 -50 29.5 -90t74.5 -40q40 0 56.5 26.5t16.5 62.5 q0 27 -20.5 56.5t-44.5 52t-44.5 55.5t-20.5 66q0 55 33.5 81t80.5 26q23 0 51 -10t41 -10q14 0 30 20h16z" />
+<glyph unicode="&#x1d461;" horiz-adv-x="313" d="M283 438l-10 -38h-70l-78 -320q-2 -6 -2 -11q0 -12 16 -12q23 2 60 52l13 -11q-2 -2 -11.5 -15.5l-14.5 -20.5l-18 -19q-11 -13 -20 -20l-20 -15q-12 -9 -24.5 -13t-24.5 -4q-39 0 -39 52q0 19 5 37l81 320h-77l5 29q123 23 177 138h13l-31 -129h70z" />
+<glyph unicode="&#x1d462;" horiz-adv-x="474" d="M444 428l-89 -348q-1 -4 -1 -9q0 -14 14 -14q4 0 8.5 1.5t9.5 4.5l8 5q3 3 8 8.5t8 8.5l8 9q5 7 7 9l5 6l13 -11q-19 -27 -32.5 -44.5t-43.5 -40t-56 -22.5q-40 0 -40 52q0 21 4 37l26 95h-1q-2 -1 -28 -34l-58 -71q-33 -38 -51 -51q-38 -28 -72 -28q-61 0 -61 74 q0 29 8 59l59 231q6 23 6 25q0 23 -33 23q-16 0 -26 -3l-3 15l157 26l-84 -326q-3 -13 -3 -24q0 -34 26 -34q41 0 100 77q77 102 109 219l21 75h77z" />
+<glyph unicode="&#x1d463;" horiz-adv-x="506" d="M247 454l-89 -326q-4 -13 -4 -32q0 -30 15.5 -48t44.5 -18q73 0 127 60.5t83 142.5q15 45 15 74q0 25 -9.5 42t-21 24t-21 18t-9.5 25q0 42 54 42q47 0 47 -83q0 -146 -97 -280q-33 -46 -86 -75t-108 -29q-116 0 -116 93q0 32 9 62l58 210q5 20 5 25q0 20 -57 20v15 q14 4 48.5 11t60 14t47.5 17z" />
+<glyph unicode="&#x1d464;" horiz-adv-x="775" d="M531 450l-80 -289q-12 -46 -12 -70q0 -61 59 -61q123 0 195 203q15 45 15 74q0 25 -9.5 42t-20.5 24t-20.5 18t-10.5 25q-1 24 15 33t39 9q47 0 47 -83q0 -44 -12 -95.5t-36 -102.5t-56.5 -92.5t-77.5 -67.5t-94 -26q-111 0 -111 100q0 41 23 125q-17 -39 -38.5 -74 t-51 -71t-67 -58t-77.5 -22q-78 0 -78 87q0 21 19 95l47 177q5 15 5 29q0 22 -54 22v15q84 14 155 44l4 -3l-81 -307q-11 -48 -11 -73q0 -47 28 -47q56 1 153 151q37 56 60.5 116t49.5 153h84z" />
+<glyph unicode="&#x1d465;" horiz-adv-x="550" d="M305 288l45 69q55 84 111 84q49 0 49 -33q0 -16 -10.5 -29t-28.5 -13q-12 0 -24 4.5t-20 4.5q-14 0 -24.5 -5.5t-16 -12t-14.5 -20.5l-55 -85q9 -20 26.5 -75t34.5 -88.5t37 -33.5q33 0 61 57l14 -10q-2 -2 -15 -23t-25.5 -38.5t-33.5 -33.5t-41 -16q-45 0 -73 77 l-40 113l-63 -98q-20 -31 -32.5 -47t-35.5 -30.5t-49 -14.5q-25 0 -38.5 14t-13.5 33q0 14 10.5 25.5t27.5 11.5q13 0 24 -10t23 -10q31 0 70 59l65 101l-33 92q-32 89 -98 89q-23 0 -38 -6l-3 18l132 33q49 -27 75 -98z" />
+<glyph unicode="&#x1d466;" horiz-adv-x="496" d="M270 307l28 -235q71 97 118 184q28 52 28 75q0 8 -13 17.5t-26 22.5t-13 29q0 17 13 28.5t34 11.5q25 0 41 -16.5t16 -45.5q0 -51 -77 -179.5t-127 -191.5l-30 -39l-32 -40l-28 -34q-17 -21 -29.5 -32t-28 -23t-30 -17t-28.5 -5q-26 0 -41 17.5t-15 37.5t13.5 30.5 t26.5 10.5q25 0 38.5 -15.5t18.5 -15.5q12 0 45.5 35t54.5 67l-38 314q-3 30 -7.5 49t-20.5 37.5t-42 18.5l-36 -4l-2 16l150 25q17 -24 24.5 -50.5t14.5 -82.5z" />
+<glyph unicode="&#x1d467;" horiz-adv-x="499" d="M467 450v-16l-322 -360l3 -1q28 21 67 21q31 0 54 -13.5t33.5 -29.5t24 -29.5t28.5 -13.5q27 0 27 24q0 5 -6 15.5t-6 22.5q0 14 12 26t26 12q18 0 29 -12t11 -30q0 -37 -33.5 -58.5t-72.5 -21.5q-9 0 -68 14q-50 14 -99 14q-67 0 -122 -24l-11 10l328 370h-131 q-46 0 -67 -11t-37 -50l-18 4l36 137h314z" />
+<glyph unicode="&#x1d49c;" horiz-adv-x="855" d="M837 672l9 -14q-103 -202 -265 -589q60 12 103 34l9 -16q-42 -31 -124 -45l-17 -42h-97l18 39q-90 6 -162 40q-92 -94 -173 -94q-48 0 -77.5 26t-29.5 66q0 32 18 52t44 20q21 0 35.5 -14t14.5 -34q0 -18 -11.5 -33t-31.5 -15q-22 0 -29 12h-2q0 -17 18 -33.5t47 -16.5 q41 0 74 17.5t76 59.5q-122 69 -122 207q0 83 57 132t130 49q102 0 161 -82q43 62 75.5 104.5t73 85.5t79 64.5t75.5 21.5q16 0 24 -2zM772 638h-1q-56 -20 -112.5 -86t-132.5 -181q31 -61 33 -144q129 283 213 411zM536 199q0 84 -29 145q-112 -172 -172 -239 q67 -32 151 -38l49 109q1 8 1 23zM492 372q-50 75 -143 75q-57 0 -101.5 -42t-44.5 -104q0 -118 107 -182q63 69 182 253z" />
+<glyph unicode="&#x1d49e;" horiz-adv-x="797" d="M449 645l-12 -19q-55 31 -136 31q-53 0 -102.5 -16.5t-85 -53.5t-35.5 -86q0 -62 43 -97.5t108 -42.5q81 125 216.5 216.5t239.5 91.5q46 0 71 -19.5t25 -55.5q0 -60 -66.5 -123t-177 -105t-225.5 -42q-69 -100 -69 -199q0 -49 31 -79.5t86 -30.5q80 0 141 50t61 108 q0 37 -20.5 55.5t-50.5 18.5q-54 0 -102.5 -53t-55.5 -131l-22 2q0 91 58.5 158t138.5 67q55 0 86.5 -26.5t31.5 -76.5q0 -41 -27 -80t-69 -68q-78 -54 -174 -54q-85 0 -141 46.5t-56 126.5q0 81 48 171q-71 12 -120.5 55t-49.5 115q0 75 71.5 131.5t184.5 56.5 q91 0 156 -42zM331 355l1 -1q123 0 244 62q73 37 118.5 85t45.5 91q0 40 -50 40q-72 0 -173.5 -79t-185.5 -198z" />
+<glyph unicode="&#x1d49f;" horiz-adv-x="885" d="M810 587l8 -20q-27 -12 -37.5 -20t-33.5 -33q57 -89 57 -190q0 -140 -98.5 -239.5t-223.5 -99.5q-70 0 -156 33q-75 -27 -161 -27q-61 0 -95 17t-34 46q0 25 30 40t77 15q71 0 170 -52q82 50 203 246q83 135 179 216q-44 61 -121 98.5t-159 37.5q-144 0 -224.5 -64 t-80.5 -169q0 -60 46 -102.5t118 -42.5q96 0 155.5 64.5t60.5 196.5h19q2 -15 2 -43q0 -63 -23 -113t-59.5 -78t-76 -42.5t-76.5 -14.5q-89 0 -148 50.5t-59 132.5q0 110 97.5 183.5t241.5 73.5q96 0 179.5 -39t137.5 -105q39 28 85 44zM756 336q0 76 -37 144 q-41 -55 -103 -178q-75 -151 -196 -234q-33 -22 -53 -32q58 -20 111 -20q114 0 196 87.5t82 232.5zM276 39q-75 40 -132 40q-67 0 -67 -25q0 -33 87 -33q66 0 112 18z" />
+<glyph unicode="&#x1d4a2;" horiz-adv-x="773" d="M417 653l-9 -18q-49 22 -111 22q-76 0 -124.5 -34t-48.5 -82q0 -44 37 -74t102 -39q69 109 177 175t197 66q44 0 73.5 -20.5t29.5 -55.5q0 -50 -57.5 -97.5t-150 -76.5t-189.5 -29q-41 -60 -41 -128q0 -29 17 -48t49 -19q54 0 117.5 35.5t151.5 115.5l15 -16 q-34 -34 -66 -121q-82 -224 -330 -224q-72 0 -120.5 33.5t-48.5 76.5q0 30 16.5 49.5t42.5 19.5q20 0 35.5 -14t15.5 -33q0 -21 -12 -36t-32 -15q-21 0 -29 13h-2q5 -24 41.5 -43.5t82.5 -19.5q87 0 145.5 48t108.5 144l-1 1q-66 -44 -138 -44q-60 0 -98.5 34.5t-38.5 92.5 q0 55 26 106q-78 13 -122.5 49.5t-44.5 93.5q0 61 59 103.5t148 42.5q70 0 127 -34zM699 590q0 20 -16 31t-41 11q-65 0 -149 -63.5t-132 -148.5q83 0 162.5 26t127.5 65.5t48 78.5z" />
+<glyph unicode="&#x1d4a5;" horiz-adv-x="802" d="M552 193l15 -16q-71 -63 -151 -92q-53 -102 -145 -182t-184 -80q-36 0 -57 18t-21 47q0 75 125 134q35 16 190 64q20 39 53.5 125t49.5 120q-55 11 -88 44.5t-33 88.5q0 49 25.5 88.5t66.5 62t86.5 34t90.5 11.5t127 -6q36 20 66 20q9 0 16.5 -5.5t7.5 -14.5 q0 -48 -104 -48q-66 -47 -152 -240q77 18 131 101l16 -11q-53 -103 -162 -124l-87 -208q68 26 118 69zM639 605v1q-26 2 -43 2q-82 0 -130 -17q-49 -18 -84 -54t-35 -83q0 -38 28.5 -64t67.5 -27q81 159 196 242zM302 43q-17 -6 -55.5 -17.5t-63 -20t-44.5 -18.5 q-88 -43 -88 -97q0 -15 10 -26t26 -11q61 0 112.5 49t102.5 141z" />
+<glyph unicode="&#x1d4a6;" horiz-adv-x="1009" d="M771 669l13 -16q-26 -20 -49.5 -44t-40 -43.5t-37 -51t-30.5 -48.5l-31 -54l-29 -52q27 0 42 -14q32 7 60 33.5t72 91.5q76 111 125.5 163.5t86.5 52.5q22 0 36.5 -10.5t14.5 -30.5t-11 -32.5t-31 -12.5q-16 0 -30 11.5t-15 33.5h-1q-8 -7 -18.5 -26t-24.5 -49.5 t-24 -48.5q-49 -89 -97.5 -133.5t-113.5 -65.5v-2q48 -48 48 -89q0 -37 -38 -100t-38 -80q0 -34 32 -34q57 0 169 129l19 -15q-117 -144 -202 -144q-37 0 -65 23.5t-28 58.5q0 41 42.5 108t42.5 97q0 31 -40 31q-26 0 -34 15q-46 -101 -93 -169.5t-93 -103.5t-87.5 -49 t-89.5 -14q-63 0 -103 32t-40 74q0 30 17 52t46 22q20 0 33.5 -14t13.5 -36q0 -20 -12 -34.5t-32 -14.5q-21 0 -29 13h-2q3 -25 33 -44t73 -19q60 0 105 44t105 150l44 80q31 57 43.5 78t38.5 59t53 66t63 57l-1 3q-15 -5 -36 -5q-44 0 -124 44q-63 34 -102 34 q-48 0 -83 -30.5t-35 -70.5t27 -67t73 -27q77 0 131 86l18 -9q-54 -107 -151 -107q-60 0 -99.5 35.5t-39.5 90.5q0 59 51 105t126 46q29 0 58 -10.5t84 -38.5q60 -31 86 -31q34 0 76.5 19t78.5 52z" />
+<glyph unicode="&#x1d4a9;" horiz-adv-x="970" d="M569 131h1q35 54 122 263q82 196 138 256q34 37 74 37q23 0 37.5 -12.5t14.5 -33.5t-12.5 -33.5t-30.5 -12.5q-16 0 -31.5 11.5t-15.5 33.5h-3q-48 -25 -151 -277q-36 -89 -61.5 -145.5t-68.5 -125.5t-86 -105h-20q26 104 32 310q5 188 27 265l-1 1q-60 -81 -143 -248 q-91 -182 -150 -256t-123 -74q-34 0 -57 22.5t-23 54.5q0 29 17 47.5t42 18.5q22 0 37 -15.5t15 -35.5q0 -18 -11.5 -31.5t-30.5 -13.5q-9 0 -16 4h-3q1 -10 10.5 -16t20.5 -6q53 0 108.5 74t129.5 224q157 318 252 357l13 -11q-14 -48 -26 -267q-8 -165 -27 -260z" />
+<glyph unicode="&#x1d4aa;" horiz-adv-x="692" d="M663 549l-20 -2q-31 98 -126 98q-81 0 -170.5 -85.5t-147 -202.5t-57.5 -207q0 -58 29 -96.5t85 -38.5q113 0 213 103q42 44 79.5 118t37.5 160q0 52 -27.5 81t-64.5 29q-51 0 -89.5 -43t-38.5 -116q0 -53 27 -105l-22 -10q-35 57 -35 130q0 77 48.5 128.5t112.5 51.5 q55 0 97.5 -36.5t42.5 -109.5q0 -72 -30.5 -145.5t-80.5 -132.5t-121 -96t-147 -37q-83 0 -129.5 58.5t-46.5 144.5q0 126 59.5 240t161.5 183t218 69q64 0 103 -38t39 -93z" />
+<glyph unicode="&#x1d4ab;" horiz-adv-x="910" d="M856 669l7 -19q-34 -14 -66 -38q89 -67 89 -165q0 -68 -43.5 -121.5t-105.5 -53.5q-35 0 -53.5 19t-18.5 47q0 22 16 43.5t42 35.5l10 -18q-36 -21 -36 -54q0 -13 9 -21t25 -8q41 0 67.5 43t26.5 106q0 75 -55 123q-24 -23 -45.5 -57t-35.5 -62l-39 -81l-40 -86 q-84 -169 -181 -243t-218 -74q-77 0 -125 36t-48 87q0 31 17 51t42 20q22 0 36.5 -13.5t14.5 -34.5q0 -20 -11.5 -34t-31.5 -14q-23 0 -30 12h-2q0 -28 35 -53.5t85 -25.5q94 0 156 52.5t146 202.5l64 113q21 36 54 86t63.5 81.5t65.5 57.5q-76 48 -192 48q-149 0 -250 -75 t-101 -174q0 -41 30 -68.5t73 -27.5q158 0 205 249h20q-8 -113 -67 -196t-160 -83q-63 0 -102.5 35.5t-39.5 94.5q0 107 111 191t282 84q125 0 221 -59q36 23 84 41z" />
+<glyph unicode="&#x1d4ac;" horiz-adv-x="692" d="M663 549l-20 -2q-31 98 -126 98q-81 0 -170.5 -85.5t-147 -202.5t-57.5 -207q0 -58 29 -96.5t85 -38.5q71 0 134 38q-27 43 -60 43q-38 0 -76 -29l-13 17q62 58 108 58q53 0 86 -56q28 25 34 32q42 44 79.5 118t37.5 160q0 52 -27.5 81t-64.5 29q-51 0 -89.5 -43 t-38.5 -116q0 -53 27 -105l-22 -10q-35 57 -35 130q0 77 48.5 128.5t112.5 51.5q55 0 97.5 -36.5t42.5 -109.5q0 -95 -50.5 -190t-132.5 -154q26 -42 62 -42q53 0 102 48l15 -14q-68 -82 -133 -82q-33 0 -53 16t-39 45q-73 -38 -150 -38q-83 0 -129.5 58.5t-46.5 144.5 q0 126 59.5 240t161.5 183t218 69q63 0 102.5 -38t39.5 -93z" />
+<glyph unicode="&#x1d4ae;" horiz-adv-x="743" d="M397 143l-20 -4q-21 71 -54 94t-82 23q-40 0 -76 -33.5t-36 -85.5t41.5 -87t101.5 -35q76 0 134.5 47t58.5 129q0 29 -16 56.5t-39 50.5l-47 48q-23 24 -39 57t-16 69q0 67 42 116.5t97.5 70.5t113.5 21q56 0 98 -29t42 -87q0 -53 -44.5 -91t-97.5 -38v21q48 5 78.5 33 t30.5 74q0 42 -31.5 61.5t-76.5 19.5q-63 0 -119 -44.5t-56 -108.5q0 -30 16.5 -58.5t40.5 -52.5l48 -49q24 -25 40.5 -58t16.5 -69q0 -99 -82 -159t-201 -60q-81 0 -139 39t-58 118q0 71 50.5 114t116.5 43q61 0 107.5 -39.5t55.5 -116.5z" />
+<glyph unicode="&#x1d4af;" horiz-adv-x="912" d="M896 675l11 -18q-89 -73 -176 -73q-57 0 -181 28.5t-168 28.5q-92 0 -152.5 -47.5t-60.5 -113.5q0 -57 34 -89t83 -32q71 0 116.5 46.5t73.5 135.5h20q-20 -101 -76 -156.5t-141 -55.5q-64 0 -107.5 39.5t-43.5 104.5q0 96 87.5 155t223.5 59q56 0 175.5 -26.5 t168.5 -26.5q51 0 113 41zM658 553l13 -14q-38 -37 -63.5 -92t-50.5 -143q-23 -81 -69.5 -149.5t-109.5 -109.5q-90 -60 -187 -60q-61 0 -104.5 30.5t-43.5 75.5q0 35 17 54.5t44 19.5q20 0 34.5 -14.5t14.5 -34.5t-12.5 -34.5t-32.5 -14.5q-21 0 -28 12h-2q3 -27 31.5 -45 t74.5 -18q83 0 142.5 57t127.5 204q48 103 93 161.5t111 114.5z" />
+<glyph unicode="&#x1d4b0;" horiz-adv-x="842" d="M805 658l-296 -550q-17 -32 -17 -55q0 -35 33 -35q56 0 168 129l21 -13q-120 -146 -203 -146q-37 0 -61.5 21.5t-24.5 56.5q0 33 17 71l-3 1q-53 -72 -107.5 -112.5t-97.5 -40.5q-36 0 -58.5 24t-22.5 64q0 57 70 167l145 227q36 56 36 101q0 36 -38 60t-83 24 q-84 0 -145 -49.5t-61 -128.5q0 -37 19.5 -60.5t53.5 -23.5q98 0 139 119h20q-12 -56 -55 -102.5t-103 -46.5q-51 0 -83 31.5t-32 82.5q0 90 78.5 151.5t177.5 61.5q73 0 126 -38.5t53 -107.5q0 -66 -38 -124l-186 -287q-39 -61 -39 -87q0 -28 29 -28q39 0 93.5 47.5 t106 117.5t90 130t62.5 105l130 243h86z" />
+<glyph unicode="&#x1d4b1;" horiz-adv-x="932" d="M214 21l2 -2q54 11 102.5 41t98 83t91 109.5t99.5 144.5q52 80 82 122t66 86.5t63.5 63t53.5 18.5q21 0 35.5 -13t14.5 -34q0 -18 -12.5 -30.5t-30.5 -12.5q-20 0 -32 13t-12 36h-1q-52 -30 -200 -261q-146 -228 -249 -308q-117 -92 -204 -92q-14 0 -47 6q41 38 68.5 89 t78.5 182q35 88 79 152t114 131l-3 3q-15 -5 -36 -5q-52 0 -131 41.5t-110 41.5q-48 0 -83 -30.5t-35 -70.5t27.5 -67t72.5 -27q77 0 131 86l16 -9q-54 -107 -149 -107q-60 0 -99.5 35.5t-39.5 90.5q0 57 55.5 104t127.5 47q28 0 52.5 -9.5t83.5 -39.5q60 -31 86 -31 q65 0 124 49l27 22l15 -15q-72 -77 -108.5 -141.5t-76.5 -165.5q-88 -219 -207 -326z" />
+<glyph unicode="&#x1d4b2;" horiz-adv-x="1078" d="M455 24l2 -2q68 27 130 99.5t137 201.5q126 219 183.5 291.5t112.5 72.5q21 0 35.5 -12.5t14.5 -34.5q0 -18 -12.5 -30.5t-30.5 -12.5q-43 0 -43 50h-1q-27 -8 -80 -87.5t-166 -273.5q-175 -301 -319 -301q-33 0 -46 4q85 80 141 233q44 122 99.5 214t137.5 179l-1 1 q-97 -17 -262 -312q-177 -319 -326 -319q-19 0 -47 6q31 26 59 72t44.5 85t43.5 111q56 150 192 287l-2 2q-15 -5 -36 -5q-49 0 -125 41.5t-106 41.5q-47 0 -77.5 -30t-30.5 -71t24 -67.5t66 -26.5q38 0 66 21.5t55 64.5l16 -9q-54 -107 -139 -107q-56 0 -92.5 35.5 t-36.5 90.5q0 59 46.5 105t116.5 46q49 0 146 -49q7 -4 19 -10t17 -9t13 -6t14.5 -4.5t12.5 -1.5q65 0 124 49l27 22l15 -16q-117 -115 -196 -321q-79 -205 -196 -310l2 -3q50 18 104 74t88 108.5t75 125.5q183 324 309 324q18 0 51 -11q-21 -15 -39 -36t-38 -60l-30 -57 q-9 -19 -34.5 -78.5t-31.5 -74.5q-91 -206 -195 -310z" />
+<glyph unicode="&#x1d4b3;" horiz-adv-x="891" d="M571 489h2q112 198 226 198q33 0 53.5 -15.5t20.5 -47.5q0 -26 -16 -41t-38 -15q-21 0 -35.5 12t-14.5 34q0 23 17 40q-53 0 -119.5 -88.5t-134.5 -242.5q-67 -151 -67 -228q0 -65 50 -65q27 0 63 29t93 95l20 -15q-62 -80 -105.5 -116.5t-99.5 -36.5q-48 0 -74.5 25.5 t-26.5 74.5q0 32 9 55h-2q-54 -77 -111.5 -116.5t-130.5 -39.5q-53 0 -83.5 32.5t-30.5 73.5q0 30 16 51t42 21q20 0 35.5 -14t15.5 -33q0 -21 -13.5 -37t-33.5 -16q-15 0 -25 6q24 -54 94 -54q55 0 118 65.5t122 168.5q88 155 88 257q0 148 -124 148q-68 0 -114.5 -44 t-46.5 -113q0 -42 22.5 -68.5t64.5 -26.5q88 0 126 106l19 -5q-17 -61 -56.5 -96t-91.5 -35q-57 0 -91 34t-34 92q0 80 59.5 134.5t145.5 54.5q89 0 143 -56.5t54 -141.5z" />
+<glyph unicode="&#x1d4b4;" horiz-adv-x="926" d="M825 658h91q-242 -324 -370 -581q75 28 137 80l15 -15q-31 -28 -63 -49t-49.5 -30t-54.5 -25q-53 -102 -144 -183t-183 -81q-36 0 -58.5 18t-22.5 47t16.5 54.5t38.5 42t61 34t65 26.5l72 22l62 18q73 144 103 196l-3 4q-51 -71 -108 -112.5t-100 -41.5q-39 0 -62 24.5 t-23 68.5q0 36 23.5 79t83.5 121q71 91 92.5 129t21.5 65q0 33 -39.5 58t-86.5 25q-91 0 -149.5 -45t-58.5 -122q0 -32 22.5 -53.5t56.5 -21.5q103 0 149 125h20q-21 -78 -68.5 -116.5t-106.5 -38.5q-48 0 -81 30.5t-33 76.5q0 87 77.5 143.5t178.5 56.5q75 0 127 -41.5 t52 -104.5q0 -45 -29 -95.5t-111 -153.5q-86 -108 -86 -151q0 -12 7.5 -20.5t21.5 -8.5q51 0 126 71t187 224zM419 -2q-50 -16 -70 -23t-58 -21.5t-54 -24t-36.5 -24.5t-28 -30.5t-7.5 -33.5q0 -15 11.5 -26t27.5 -11q60 0 112 50t103 144z" />
+<glyph unicode="&#x1d4b5;" horiz-adv-x="932" d="M407 519l18 -8q-25 -48 -56.5 -73t-81.5 -25q-51 0 -89.5 32t-38.5 83q0 59 52 109t145 50q50 0 108.5 -13t93.5 -26t92 -36q72 46 150 46q57 0 84.5 -17t27.5 -43q0 -24 -33 -41t-83 -17q-55 0 -133 26q-56 -64 -116 -236q5 -1 11 -1q60 2 93 27l14 -17 q-55 -59 -118 -59q-14 0 -18 1q-54 -143 -158 -221q106 -36 157 -36q79 0 132 36.5t72 102.5l20 -1q-14 -85 -71.5 -131t-150.5 -46q-36 0 -75.5 10.5t-121.5 38.5q-75 -43 -162 -43q-112 0 -112 60q0 24 33 41t83 17q45 0 142 -31q59 56 120 215q-4 1 -12 1q-53 0 -95 -32 l-17 16q60 65 126 65q11 0 17 -1q68 165 157 241q-57 22 -87.5 32t-85.5 21.5t-105 11.5q-64 0 -99.5 -39.5t-35.5 -80.5q0 -40 25.5 -62.5t61.5 -22.5q42 0 68.5 17.5t51.5 58.5zM871 598q0 30 -71 30q-62 0 -106 -33q68 -25 112 -25q27 0 46 8.5t19 19.5zM283 51 q-76 28 -118 28q-27 0 -46 -8.5t-19 -19.5q0 -30 71 -30q65 0 112 30z" />
+<glyph unicode="&#x1d4b6;" horiz-adv-x="819" d="M737 194l21 -17q-141 -185 -247 -185q-37 0 -56.5 24t-19.5 61q0 19 4 32l-1 1q-110 -121 -197 -121q-44 0 -68 29.5t-24 79.5q0 45 22 95q-35 -20 -71 -20q-39 0 -70 17l10 26q31 -13 57 -13q62 0 129 79v-1q56 70 130.5 115t141.5 45q91 0 118 -71l-21 -10 q-28 51 -84 51q-73 0 -143 -70q-65 -66 -113 -150t-48 -127q0 -45 39 -45q49 0 98.5 40t104.5 105q9 52 38.5 102.5t71.5 50.5q27 0 27 -28q0 -44 -110 -146q-11 -39 -11 -63q0 -58 55 -58q31 0 87.5 40.5t129.5 131.5z" />
+<glyph unicode="&#x1d4b7;" horiz-adv-x="580" d="M127 493l20 22q32 -38 85 -47q66 92 136 155.5t130 63.5q29 0 45 -15.5t16 -39.5q0 -75 -77.5 -137.5t-190.5 -62.5q-63 -94 -124.5 -206t-61.5 -164q0 -44 36 -44q58 0 121.5 54.5t124.5 153.5q-10 29 -10 56q0 57 28 97t58 40q9 0 16.5 -8.5t7.5 -20.5q0 -67 -55 -158 q19 -32 63 -32q18 0 30 5l7 -26q-16 -9 -38 -9q-51 0 -84 32h-1q-66 -104 -136 -159t-133 -55q-41 0 -67 25.5t-26 67.5q0 64 49.5 168t116.5 192q-55 14 -86 52zM529 624q0 31 -35 31q-31 0 -73.5 -47t-109.5 -146q87 0 152.5 52.5t65.5 109.5z" />
+<glyph unicode="&#x1d4b8;" horiz-adv-x="662" d="M567 225l22 -17q-89 -110 -173.5 -164.5t-154.5 -54.5q-47 0 -75 31.5t-28 85.5q0 46 18 91q-30 -24 -76 -24q-39 0 -70 17l10 26q31 -13 57 -13q61 0 120 69q52 73 128 121t142 48q88 0 88 -79q0 -26 -18 -45.5t-43 -19.5q-40 0 -40 33q0 15 9.5 24t21.5 11.5t21.5 8.5 t9.5 16q0 21 -34 21q-55 0 -124.5 -65t-115.5 -145.5t-46 -126.5q0 -26 15 -40.5t39 -14.5q52 0 131.5 50.5t165.5 155.5z" />
+<glyph unicode="&#x1d4b9;" horiz-adv-x="845" d="M827 687l-321 -590q-14 -25 -14 -48q0 -27 28 -27q71 0 212 172l23 -17q-75 -95 -132.5 -140t-109.5 -45q-37 0 -55 20t-18 51q0 23 9 47h-2q-59 -61 -107.5 -91t-101.5 -30q-43 0 -67 28t-24 77q0 46 24 99q-31 -20 -71 -20q-39 0 -70 17l10 26q31 -13 57 -13 q62 0 129 79v-1q56 70 130 115t140 45q36 0 57 -19.5t21 -58.5h2l172 324h79zM544 365q0 41 -48 41q-41 0 -97.5 -42t-106.5 -115q-87 -125 -87 -189q0 -41 41 -41q64 -1 143 73q64 60 109.5 139t45.5 134z" />
+<glyph unicode="&#x1d4bb;" horiz-adv-x="685" d="M27 -209l194 374q-13 25 -13 58q0 87 117 147l41 80l38 66q22 41 36.5 61t35.5 45t39 36.5t39.5 20t44.5 8.5q35 0 54.5 -21.5t19.5 -48.5q0 -145 -271 -252l-115 -221q33 -18 81 -18q69 0 129 54l17 -23q-73 -61 -153 -61q-51 0 -89 19l-166 -324h-79zM643 606 q0 49 -42 49q-18 0 -36.5 -12.5t-35 -36.5t-26 -40t-22.5 -41l-62 -120q87 33 155.5 87t68.5 114z" />
+<glyph unicode="&#x1d4bd;" horiz-adv-x="753" d="M669 195l21 -17q-160 -189 -264 -189q-32 0 -51 18.5t-19 53.5q0 60 46 128l106 157q17 26 17 39q0 26 -25 26q-68 0 -171.5 -101t-185.5 -257l-28 -53h-77l237 440q-80 14 -126 69l20 21q46 -54 122 -61q69 123 115.5 170.5t103.5 47.5q31 0 47 -20t16 -45 q0 -42 -26 -78.5t-63.5 -58.5t-75.5 -34.5t-66 -12.5l-78 -153l3 -2q134 158 237 158q33 0 53 -16.5t20 -45.5q0 -48 -42 -115l-103 -164q-24 -39 -24 -60t23 -21q88 0 238 176zM359 472l1 -2q54 0 118.5 44.5t64.5 105.5q0 15 -9.5 25t-26.5 10q-30 0 -63 -40t-85 -143z " />
+<glyph unicode="&#x1d4be;" horiz-adv-x="496" d="M484 608q0 -20 -15 -35t-36 -15q-19 0 -32.5 13t-13.5 30q0 20 16.5 36t38.5 16q15 0 28.5 -14t13.5 -31zM417 188l21 -17q-78 -95 -131.5 -138.5t-98.5 -43.5q-36 0 -58 21.5t-22 60.5q0 63 57 165l60 109q-37 -30 -89 -30q-42 0 -73 17l10 26q31 -13 60 -13 q69 0 136 79h73l-160 -295q-22 -40 -22 -78q0 -14 9 -23t24 -9q35 0 80 39t124 130z" />
+<glyph unicode="&#x1d4bf;" horiz-adv-x="730" d="M718 608q0 -20 -15 -35t-36 -15q-19 0 -32.5 13t-13.5 30q0 20 16.5 36t38.5 16q15 0 28.5 -14t13.5 -31zM596 424l-264 -499q42 -22 85 -22q59 0 100 30l12 -26q-54 -34 -117 -34q-52 0 -100 22q-43 -63 -92.5 -88.5t-112.5 -25.5q-47 0 -72.5 21.5t-25.5 49.5 q0 48 54 80q42 26 115 26q58 0 91 -13l209 394q-44 -43 -114 -43q-42 0 -68 16l10 26q26 -12 60 -12q44 0 81 27t76 71h73zM254 -86l-1 1q-29 13 -84 13q-57 0 -91.5 -20t-34.5 -52q0 -18 15.5 -29.5t40.5 -11.5q93 0 155 99z" />
+<glyph unicode="&#x1d4c0;" horiz-adv-x="726" d="M643 187l23 -17q-75 -93 -133 -137t-109 -44q-35 0 -59.5 16t-24.5 47t21.5 67t21.5 53q0 18 -15 32.5t-46 14.5l11 30q76 4 142.5 45t66.5 83q0 34 -33 34q-65 0 -176 -103t-189 -255l-27 -53h-77l237 440q-80 14 -126 69l20 21q46 -54 122 -61q69 123 115.5 170.5 t103.5 47.5q31 0 47 -20t16 -45q0 -43 -26 -79.5t-63.5 -58t-75.5 -34t-66 -12.5l-88 -168l2 -1q149 172 268 172q30 0 49 -18t19 -43q0 -48 -65 -92.5t-147 -54.5l-1 -3q54 -32 54 -82q0 -28 -16.5 -59t-16.5 -43q0 -27 31 -27q33 0 86.5 40.5t123.5 127.5zM361 472l1 -2 q54 0 118.5 44.5t64.5 105.5q0 15 -9.5 25t-26.5 10q-30 0 -63 -40t-85 -143z" />
+<glyph unicode="&#x1d4c1;" horiz-adv-x="579" d="M77 389l14 26q36 -25 94 -25q85 125 174.5 211t147.5 86q64 0 64 -67q0 -81 -96.5 -161t-225.5 -99q-143 -231 -143 -298q0 -43 36 -43q33 0 76.5 38t122.5 129l21 -17q-85 -99 -133.5 -139.5t-93.5 -40.5q-37 0 -62 22.5t-25 64.5q0 84 77 218q12 22 40 66q-49 2 -88 29 zM268 396l1 -1q117 26 194.5 91.5t77.5 137.5q0 31 -35 31q-37 0 -82 -47q-58 -59 -156 -212z" />
+<glyph unicode="&#x1d4c2;" horiz-adv-x="1038" d="M957 195l21 -16q-153 -190 -265 -190q-30 0 -49.5 19t-19.5 53q0 63 45 128l104 152q19 29 19 44q0 26 -27 26q-74 0 -185 -117t-199 -294h-75l190 337q20 36 20 47q0 27 -28 27q-74 0 -185.5 -118t-196.5 -293h-77l184 342q-52 -46 -125 -46q-32 0 -58 16l10 26 q26 -12 50 -12q80 0 167 98h68l-70 -139l3 -2q134 158 238 158q31 0 51.5 -16.5t20.5 -45.5q0 -35 -17 -74l2 -1q116 137 219 137q34 0 53 -16.5t19 -45.5q0 -49 -49 -127l-96 -152q-23 -38 -23 -59q0 -22 23 -22q87 0 238 176z" />
+<glyph unicode="&#x1d4c3;" horiz-adv-x="761" d="M680 195l21 -17q-155 -189 -264 -189q-31 0 -50.5 18.5t-19.5 53.5q0 60 46 128l106 157q17 26 17 39q0 10 -7.5 18t-20.5 8q-67 0 -169.5 -101t-184.5 -257l-28 -53h-77l183 342q-52 -46 -125 -46q-32 0 -58 16l10 26q25 -12 50 -12q80 0 167 98h72l-73 -139l3 -2 q134 158 237 158q33 0 53 -16.5t20 -45.5q0 -48 -42 -115l-103 -164q-24 -39 -24 -60t23 -21q88 0 238 176z" />
+<glyph unicode="&#x1d4c5;" horiz-adv-x="773" d="M362 285l3 -2q134 158 237 158q38 0 65 -24t27 -75q0 -71 -52 -160t-122 -136q70 -28 105 -75l-22 -20q-40 35 -64.5 49t-59.5 17q-49 -28 -93 -28q-36 0 -54 9t-18 23q0 18 25.5 33t64.5 15q36 0 57 -4q46 26 108 132.5t62 173.5q0 40 -36 40q-67 0 -168.5 -100.5 t-185.5 -257.5l-141 -262h-77l296 551q-45 -46 -125 -46q-32 0 -58 16l10 26q26 -12 50 -12q81 0 167 97l72 1z" />
+<glyph unicode="&#x1d4c6;" horiz-adv-x="780" d="M725 202l18 -18q-67 -70 -219 -209q-48 -43 -89.5 -87t-60.5 -66t-25 -31h-78l169 310l-2 1q-54 -58 -102.5 -85.5t-104.5 -27.5q-38 0 -61 29t-23 76q0 48 23 99q-30 -20 -70 -20q-39 0 -70 17l10 26q31 -13 57 -13q64 0 129 79q57 69 131.5 114t134.5 45q36 0 60 -16.5 t28 -48.5h2l28 48h68l-281 -525l3 -2q31 34 166 157.5t159 147.5zM550 364q0 42 -54 42q-95 0 -205 -159q-86 -125 -86 -187q0 -19 12 -30t29 -11q61 0 134.5 64.5t121.5 146t48 134.5z" />
+<glyph unicode="&#x1d4c7;" horiz-adv-x="580" d="M569 311l3 -27q-14 -7 -32 -7q-66 0 -87 48l-260 -192l-71 -133h-73l183 346q-53 -50 -126 -50q-32 0 -58 16l10 26q26 -12 50 -12q80 0 167 98h72l-120 -228l2 -1l214 160q0 41 21.5 65t55.5 24q19 0 30.5 -9t11.5 -18l-84 -74q16 -36 62 -36q13 0 29 4z" />
+<glyph unicode="&#x1d4c8;" horiz-adv-x="515" d="M129 243l-9 27q111 38 200 149q-5 15 -5 27q0 37 18.5 61t34.5 24q11 0 19.5 -8t8.5 -24q0 -48 -42 -90q58 -95 58 -181q0 -101 -77 -172q-70 -67 -173 -67q-41 0 -70.5 19.5t-29.5 55.5q0 31 18.5 53t41.5 22q18 0 30 -9.5t12 -27.5q0 -17 -9 -26t-20 -10.5t-20 -6 t-9 -13.5q0 -11 17 -19t37 -8q74 0 130 73t56 186q0 44 -16 106h-2q-48 -56 -92.5 -85.5t-106.5 -55.5z" />
+<glyph unicode="&#x1d4c9;" horiz-adv-x="551" d="M532 526l-13 -30h-146l-209 -387q-14 -27 -14 -58q0 -14 9 -23t24 -9q36 0 79.5 38.5t127.5 134.5l21 -17q-79 -98 -133 -142t-104 -44q-33 0 -54.5 21t-21.5 60q0 59 57 164l50 92q-55 -50 -117 -50q-32 0 -58 16l10 26q26 -12 58 -12q72 0 158 117l39 73h-102l13 30 h103l71 132h79l-72 -132h145z" />
+<glyph unicode="&#x1d4ca;" horiz-adv-x="753" d="M670 190l23 -17q-75 -93 -131.5 -137t-109.5 -44q-36 0 -53 19.5t-17 51.5q0 27 8 59l-3 1q-117 -134 -211 -134q-34 0 -55.5 22.5t-21.5 65.5q0 53 46 139l68 126q-57 -46 -125 -46q-32 0 -58 16l10 26q26 -12 50 -12q80 0 167 98h75l-159 -295q-22 -39 -22 -78 q0 -13 9 -22.5t24 -9.5q71 0 170.5 114t184.5 291h78l-160 -297q-23 -42 -23 -74q0 -31 29 -31q34 0 82.5 39.5t124.5 128.5z" />
+<glyph unicode="&#x1d4cb;" horiz-adv-x="618" d="M575 210l7 -27q-21 -9 -47 -9q-43 0 -75 29q-67 -108 -131 -161t-136 -53q-37 0 -64 25t-27 72q0 60 57 162l51 92q-53 -44 -122 -44q-32 0 -58 16l10 26q26 -12 50 -12q80 0 167 98h75l-158 -295q-20 -36 -20 -70q0 -17 13.5 -28.5t34.5 -11.5q51 0 115 52t119 157 q-16 36 -16 72q0 56 22.5 98.5t54.5 42.5q29 0 29 -50q0 -36 -14.5 -84t-32.5 -74q25 -29 62 -29q17 0 34 6z" />
+<glyph unicode="&#x1d4cc;" horiz-adv-x="888" d="M845 210l7 -27q-21 -9 -47 -9q-43 0 -75 29q-67 -108 -131 -161t-136 -53q-37 0 -64 25t-27 72q0 11 1 18h-2q-89 -115 -178 -115q-37 0 -64 25t-27 72q0 60 57 162l51 92q-55 -44 -122 -44q-32 0 -58 16l10 26q26 -12 50 -12q80 0 167 98h75l-158 -295q-20 -36 -20 -70 q0 -17 13.5 -28.5t34.5 -11.5q99 0 227 229l98 176h75l-158 -295q-20 -36 -20 -70q0 -17 13.5 -28.5t34.5 -11.5q51 0 115 52t119 157q-16 36 -16 72q0 56 22.5 98.5t54.5 42.5q29 0 29 -50q0 -36 -14.5 -84t-32.5 -74q25 -29 62 -29q16 0 34 6z" />
+<glyph unicode="&#x1d4cd;" horiz-adv-x="752" d="M653 203l22 -17q-152 -194 -272 -194q-38 0 -64 20.5t-26 64.5h-2q-87 -88 -160 -88q-39 0 -62.5 19.5t-23.5 55.5q0 28 18.5 50t41.5 22q42 0 42 -36q0 -16 -9 -25.5t-20 -12t-20 -8t-9 -14.5q0 -21 36 -21q43 0 89.5 44.5t80 103.5t55.5 114t22 79q0 48 -37 48 q-41 0 -102.5 -41t-139.5 -134l-22 17q157 188 271 188q39 0 63.5 -22.5t24.5 -61.5h2q68 87 136 87q82 0 82 -76q0 -26 -18.5 -47t-42.5 -21q-40 0 -40 33q0 16 9 25t19.5 11t19.5 7.5t9 15.5q0 22 -34 22q-37 0 -91 -68t-92 -150.5t-38 -126.5q0 -20 12 -32t30 -12 q89 0 240 181z" />
+<glyph unicode="&#x1d4ce;" horiz-adv-x="658" d="M617 424l-171 -328q-53 -103 -97 -170q44 -23 90 -23q59 0 100 30l12 -26q-54 -34 -117 -34q-54 0 -102 22q-77 -114 -203 -114q-47 0 -72.5 21.5t-25.5 49.5q0 48 54 80q42 26 115 26q58 0 91 -13l99 177l-3 1q-117 -134 -211 -134q-34 0 -55.5 22.5t-21.5 65.5 q0 53 46 139l68 126q-55 -46 -125 -46q-32 0 -58 16l10 26q26 -12 50 -12q80 0 167 98h75l-159 -295q-22 -39 -22 -78q0 -32 33 -32q71 0 170.5 114t184.5 291h78zM276 -86l-1 1q-29 13 -84 13q-57 0 -91.5 -20t-34.5 -52q0 -18 15.5 -29.5t40.5 -11.5q93 0 155 99z" />
+<glyph unicode="&#x1d4cf;" horiz-adv-x="691" d="M594 178l23 -16q-73 -102 -132 -137.5t-118 -35.5q-60 0 -60 46q0 16 10 35.5t10 30.5t-9 19t-20 8q-65 0 -127 -71q-55 -63 -97 -63q-22 0 -22 20q0 49 127 108l231 188l-1 2q-18 -7 -43 -7q-55 0 -99 34q-24 -25 -58 -40t-65 -15q-35 0 -61 16l12 26q25 -12 48 -12 q58 0 102 44q-26 31 -26 63q0 23 13.5 40t33.5 17q19 0 29.5 -14.5t10.5 -35.5q0 -23 -18 -61q25 -32 77 -32q42 0 76 17q34 46 66.5 67.5t54.5 21.5q31 0 31 -23q0 -50 -120 -89l-223 -186l1 -1q31 16 72 16q36 0 55 -16.5t19 -39.5q0 -15 -8.5 -32.5t-8.5 -27.5 q0 -6 5.5 -10t11.5 -4q89 0 197 150z" />
+<glyph unicode="&#x1d608;" horiz-adv-x="666" d="M635 0h-96l-33 200h-249l-130 -200h-96l457 674h26zM495 274l-37 229l-151 -229h188z" />
+<glyph unicode="&#x1d609;" horiz-adv-x="604" d="M239 662h205q197 0 197 -117q0 -57 -33.5 -104.5t-97.5 -74.5q91 -33 91 -122q0 -102 -84 -173t-203 -71h-240zM259 394h90q200 0 200 131q0 63 -112 63h-130zM179 74h126q96 0 151.5 45t55.5 111q0 52 -42.5 69.5t-150.5 17.5h-79z" />
+<glyph unicode="&#x1d60a;" horiz-adv-x="671" d="M755 554l-26 -101h-19q-8 55 -41 89.5t-71.5 46t-84.5 11.5q-133 0 -229.5 -106t-96.5 -247q0 -87 50.5 -136t144.5 -49q123 0 246 108l38 -51q-136 -133 -306 -133q-128 0 -196 65.5t-68 176.5q0 119 59.5 222.5t160 164.5t215.5 61q75 0 136.5 -29.5t87.5 -92.5z" />
+<glyph unicode="&#x1d60b;" horiz-adv-x="692" d="M239 662h166q346 0 346 -233q0 -77 -31 -152.5t-87.5 -137.5t-146 -100.5t-197.5 -38.5h-215zM179 74h49q94 0 147 7.5t107 32.5q80 37 128.5 117.5t48.5 177.5q0 179 -292 179h-60z" />
+<glyph unicode="&#x1d60c;" horiz-adv-x="583" d="M678 662l-19 -74h-352l-50 -202h305l-19 -75h-305l-59 -237h379l-35 -74h-449l165 662h439z" />
+<glyph unicode="&#x1d60d;" horiz-adv-x="535" d="M679 662l-10 -74h-362l-50 -202h296l-19 -75h-296l-77 -311h-87l165 662h440z" />
+<glyph unicode="&#x1d60e;" horiz-adv-x="695" d="M755 565l-25 -103h-19q-32 138 -189 138q-94 0 -171.5 -50.5t-119 -127.5t-41.5 -160q0 -87 52 -143.5t152 -56.5q83 0 126.5 18t49.5 43l40 158h-89v76h195l-75 -298q-45 -26 -69 -37t-78.5 -23.5t-122.5 -12.5q-129 0 -201.5 67.5t-72.5 180.5q0 87 36.5 168.5 t97 141.5t142.5 96t168 36q165 0 214 -111z" />
+<glyph unicode="&#x1d60f;" horiz-adv-x="658" d="M749 662l-165 -662h-87l75 301h-336l-75 -301h-87l165 662h87l-72 -287h336l72 287h87z" />
+<glyph unicode="&#x1d610;" horiz-adv-x="401" d="M512 662l-10 -74h-111l-128 -514h111l-27 -74h-288l4 74h111l128 514h-111l33 74h288z" />
+<glyph unicode="&#x1d611;" horiz-adv-x="398" d="M470 662l-113 -450q-27 -107 -77 -166.5t-141 -59.5q-76 0 -117 56l38 76h17q14 -23 37.5 -39.5t46.5 -16.5q25 0 44 12.5t31.5 38t18.5 43.5t14 50l114 456h87z" />
+<glyph unicode="&#x1d612;" horiz-adv-x="634" d="M729 662l-5 -17l-378 -288l284 -357h-119l-241 302l-42 -33l-67 -269h-87l165 662h87l-72 -287l380 287h95z" />
+<glyph unicode="&#x1d613;" horiz-adv-x="559" d="M564 74l-36 -74h-454l165 662h87l-147 -588h385z" />
+<glyph unicode="&#x1d614;" horiz-adv-x="843" d="M933 662l-165 -662h-85l135 543l-386 -543h-21l-117 541l-134 -541h-85l165 662h123l104 -482l343 482h123z" />
+<glyph unicode="&#x1d615;" horiz-adv-x="675" d="M766 662l-169 -676l-65 14l-231 564l-140 -564h-87l165 662h121l198 -484l121 484h87z" />
+<glyph unicode="&#x1d616;" horiz-adv-x="714" d="M779 430q0 -123 -63.5 -227t-161 -160.5t-201.5 -56.5q-116 0 -185 66.5t-69 179.5q0 124 63.5 228t160.5 160t202 56q116 0 185 -66.5t69 -179.5zM689 421q0 85 -47.5 132t-135.5 47q-110 0 -192 -72.5t-113 -196.5q-12 -49 -12 -90q0 -85 47.5 -132t135.5 -47 q110 0 192 72.5t113 196.5q12 49 12 90z" />
+<glyph unicode="&#x1d617;" horiz-adv-x="525" d="M239 662h184q215 0 215 -133q0 -102 -81 -173t-205 -71h-120l-71 -285h-87zM250 359h88q105 0 157 40.5t52 108.5q0 80 -157 80h-83z" />
+<glyph unicode="&#x1d618;" horiz-adv-x="716" d="M651 -157l-4 -18q-39 0 -59 0.5t-54.5 2t-54 6t-47.5 12t-45.5 20t-37 30t-33.5 41.5t-24 55q-90 17 -141.5 81t-51.5 160q0 124 63.5 227.5t160.5 159.5t202 56q116 0 185 -66.5t69 -179.5q0 -85 -32.5 -163.5t-85.5 -135t-121 -94t-139 -47.5q11 -31 30.5 -50 t47.5 -27.5t50 -11t57 -2.5zM689 421q0 85 -47.5 132t-135.5 47q-110 0 -192 -72.5t-113 -196.5q-12 -49 -12 -90q0 -85 47.5 -132t135.5 -47q110 0 192 72.5t113 196.5q12 49 12 90z" />
+<glyph unicode="&#x1d619;" horiz-adv-x="589" d="M239 662h185q215 0 215 -130q0 -88 -65 -151t-164 -78l171 -303h-103l-173 299h-70l-74 -299h-87zM253 373h89q207 0 207 141q0 39 -38 56.5t-121 17.5h-83z" />
+<glyph unicode="&#x1d61a;" horiz-adv-x="541" d="M597 596l-30 -119h-19q-9 60 -49 91.5t-98 31.5q-51 0 -91.5 -35t-40.5 -77q0 -59 112 -110q79 -35 113.5 -72t34.5 -87q0 -104 -82.5 -168.5t-192.5 -64.5q-145 0 -192 84l21 135h18q14 -73 62.5 -108t105.5 -35q74 0 120 35.5t46 88.5q0 33 -23.5 57.5t-75.5 47.5 q-82 37 -119.5 75.5t-37.5 89.5q0 94 74.5 157t171.5 63q124 0 172 -80z" />
+<glyph unicode="&#x1d61b;" horiz-adv-x="608" d="M748 662l-9 -74h-245l-147 -588h-87l146 588h-245l29 74h558z" />
+<glyph unicode="&#x1d61c;" horiz-adv-x="661" d="M757 662l-105 -419q-32 -126 -114.5 -191.5t-211.5 -65.5q-209 0 -209 168q0 40 12 89l105 419h87l-102 -406q-14 -55 -14 -83q0 -52 37 -81.5t103 -29.5q55 0 102 21.5t76 57.5q25 31 49 128l98 393h87z" />
+<glyph unicode="&#x1d61d;" horiz-adv-x="654" d="M788 662l-451 -673h-26l-115 673h95l77 -498l324 498h96z" />
+<glyph unicode="&#x1d61e;" horiz-adv-x="921" d="M1057 662l-396 -673h-28l-67 446l-284 -446h-28l-60 673h95l34 -476v2l301 474l65 -476v2l273 474h95z" />
+<glyph unicode="&#x1d61f;" horiz-adv-x="700" d="M806 662l-317 -313l180 -349h-105l-145 283l-283 -283h-105l352 349l-162 313h106l125 -248l247 248h107z" />
+<glyph unicode="&#x1d620;" horiz-adv-x="630" d="M774 662l-344 -374l-72 -288h-87l71 288l-156 374h95l124 -300l274 300h95z" />
+<glyph unicode="&#x1d621;" horiz-adv-x="637" d="M763 662l-6 -21l-569 -567h433l-26 -74h-567l6 25l566 563h-392l27 74h528z" />
+<glyph unicode="&#x1d622;" horiz-adv-x="448" d="M169 302l-41 31q30 68 85.5 99t120.5 31q63 0 98 -26.5t35 -74.5q0 -14 -5 -36l-63 -250q-8 -29 -8 -76h-85l5 44q-72 -54 -162 -54q-44 0 -69 19.5t-25 56.5q0 168 320 228l8 33q2 10 2 15q0 23 -19.5 36.5t-51.5 13.5q-76 0 -130 -90h-15zM334 132l23 90 q-218 -35 -218 -126q0 -35 48 -35q68 0 147 71z" />
+<glyph unicode="&#x1d623;" horiz-adv-x="496" d="M311 679l-66 -265q67 49 140 49q70 0 110 -40.5t40 -109.5q0 -131 -95 -227t-215 -96q-103 0 -151 57l153 613l76 24zM217 302l-52 -208q31 -33 83 -33q72 0 138 63t66 164q0 48 -25.5 76t-74.5 28q-36 0 -72.5 -23.5t-62.5 -66.5z" />
+<glyph unicode="&#x1d624;" horiz-adv-x="456" d="M503 371l-57 -54h-16q-14 75 -95 75q-64 0 -124.5 -61t-60.5 -162q0 -51 28.5 -79.5t74.5 -28.5q81 0 155 105l56 -34q-96 -142 -235 -142q-74 0 -118 42t-44 118q0 130 92 221.5t198 91.5q55 0 94.5 -23t51.5 -69z" />
+<glyph unicode="&#x1d625;" horiz-adv-x="494" d="M600 679l-138 -551q-16 -66 -22 -115l-78 -24l-8 5l10 50q-69 -54 -150 -54q-65 0 -103.5 40.5t-38.5 113.5q0 125 92 222t196 97q55 0 98 -37l58 234l76 24zM391 158l43 171q-27 63 -88 63q-65 0 -128 -65.5t-63 -158.5q0 -53 26.5 -80t70.5 -27q35 0 73 26.5t66 70.5z " />
+<glyph unicode="&#x1d626;" horiz-adv-x="444" d="M403 167l57 -35q-56 -76 -108.5 -109t-124.5 -33q-73 0 -115.5 41.5t-42.5 116.5q0 96 45.5 170t109.5 109.5t129 35.5q64 0 99 -34.5t35 -94.5q0 -29 -7 -57l-14 -55h-309q-7 -28 -7 -54q0 -51 28.5 -79t74.5 -28q79 0 150 106zM188 293h215q4 16 4 33q0 66 -80 66 q-40 0 -79 -25t-60 -74z" />
+<glyph unicode="&#x1d627;" horiz-adv-x="336" d="M526 633l-38 -59l-17 -1q-24 22 -37.5 30.5t-32.5 8.5q-31 0 -56.5 -25t-38.5 -78l-14 -56h114l-17 -71h-114l-95 -382h-79l95 382h-81l17 71h81l11 41q28 101 84 149q50 40 104 40q68 0 114 -50z" />
+<glyph unicode="&#x1d628;" horiz-adv-x="496" d="M575 436l-16 -67h-78q4 -20 4 -30q0 -83 -66 -142t-147 -59q-31 0 -59 8q-54 -28 -54 -55q0 -26 40 -27q144 -5 187 -19q61 -20 61 -76q0 -49 -29.5 -86.5t-76.5 -58t-98.5 -30.5t-103.5 -10q-67 0 -106.5 22t-39.5 66q0 41 27 78.5t73 59.5q-23 18 -23 45q0 28 19.5 54 t69.5 69q-28 33 -28 78q0 80 68.5 143.5t157.5 63.5q29 0 74 -13.5t76 -13.5h68zM404 329q0 63 -71 63q-49 0 -85 -36.5t-36 -80.5q0 -30 21 -48t58 -18q49 0 81 36.5t32 83.5zM197 -15h-20q-46 -13 -73.5 -35t-27.5 -48q0 -47 89 -47q81 0 139.5 22.5t58.5 70.5 q0 37 -166 37z" />
+<glyph unicode="&#x1d629;" horiz-adv-x="487" d="M311 679l-69 -274q44 35 80.5 46.5t82.5 11.5q49 0 77 -25t28 -72q0 -21 -6 -45l-80 -321h-79l75 304q5 22 5 34q0 54 -65 54q-29 0 -73.5 -25t-69.5 -65l-75 -302h-79l164 660l76 24z" />
+<glyph unicode="&#x1d62a;" horiz-adv-x="220" d="M325 679l-23 -93h-92l23 93h92zM266 459l-114 -459h-83l109 440l80 24z" />
+<glyph unicode="&#x1d62b;" horiz-adv-x="254" d="M354 679l-23 -93h-93l23 93h93zM294 459l-121 -485q-24 -93 -74 -141.5t-117 -48.5q-50 0 -100 36l43 64h16q36 -28 58 -28q63 0 88 102l120 481l79 25z" />
+<glyph unicode="&#x1d62c;" horiz-adv-x="453" d="M556 453l-3 -14l-292 -184l191 -255h-103l-156 207l-51 -207h-79l164 660l76 24l8 -5l-94 -376l235 150h104z" />
+<glyph unicode="&#x1d62d;" horiz-adv-x="205" d="M313 679l-169 -679h-83l164 660l80 24z" />
+<glyph unicode="&#x1d62e;" horiz-adv-x="756" d="M253 459l-14 -57q64 61 154 61q88 0 115 -65q74 65 158 65q49 0 79 -26t30 -76q0 -21 -6 -46l-78 -315h-77l73 293q6 24 6 42q0 57 -61 57q-27 0 -72 -25.5t-68 -64.5l-75 -302h-77l71 290q7 32 7 45q0 57 -59 57q-27 0 -72.5 -25t-69.5 -65l-75 -302h-77l109 440l71 24z " />
+<glyph unicode="&#x1d62f;" horiz-adv-x="487" d="M251 459l-12 -57q45 36 83 48.5t83 12.5q47 0 76 -25.5t29 -65.5q0 -24 -6 -51l-80 -321h-79l75 304q5 22 5 35q0 53 -65 53q-29 0 -73.5 -25t-69.5 -65l-75 -302h-79l109 440l71 24z" />
+<glyph unicode="&#x1d630;" horiz-adv-x="499" d="M536 300q0 -49 -20.5 -103t-56.5 -100.5t-92.5 -76.5t-121.5 -30q-79 0 -124 47t-45 123q0 115 84.5 209t199.5 94q82 0 129 -43t47 -120zM455 282q0 52 -29.5 81t-82.5 29q-75 0 -130.5 -67t-55.5 -148q0 -53 28.5 -84.5t78.5 -31.5q48 0 87 26t60.5 63t32.5 72t11 60z " />
+<glyph unicode="&#x1d631;" horiz-adv-x="498" d="M256 459l-11 -50q69 54 151 54q65 0 103.5 -41.5t38.5 -114.5q0 -123 -92.5 -220t-195.5 -97q-56 0 -98 36l-54 -218l-76 -24l-8 5l162 651l73 24zM219 295l-43 -172q23 -62 88 -62q76 0 133.5 67.5t57.5 155.5q0 48 -25 78t-72 30q-35 0 -73 -26.5t-66 -70.5z" />
+<glyph unicode="&#x1d632;" horiz-adv-x="498" d="M549 458l-167 -669l-10 -5l-64 24l58 234q-67 -52 -148 -52q-66 0 -106 41.5t-40 115.5q0 123 92.5 219.5t195.5 96.5q66 0 105 -35l74 36zM395 158l43 171q-12 30 -37.5 46.5t-54.5 16.5q-65 0 -128 -65.5t-63 -158.5q0 -48 25 -77.5t72 -29.5q35 0 75.5 27t67.5 70z " />
+<glyph unicode="&#x1d633;" horiz-adv-x="336" d="M439 447l-18 -70h-20q-3 7 -15 11t-20 4q-43 0 -87 -42t-79 -116l-58 -234h-79l109 440l76 24l8 -5l-14 -64q64 68 144 68q37 0 53 -16z" />
+<glyph unicode="&#x1d634;" horiz-adv-x="389" d="M432 410l-22 -89h-15q-17 44 -42 58t-64 14t-58.5 -21.5t-19.5 -41.5t17 -34.5t50 -30.5q60 -29 83.5 -51.5t23.5 -55.5q0 -68 -56 -118t-143 -50q-45 0 -72 13t-53 42l25 103h15q18 -87 109 -87q34 0 63 17.5t29 49.5q0 15 -16 28.5t-54 32.5q-55 27 -79.5 53.5 t-24.5 60.5q0 62 52 111t129 49q87 0 123 -53z" />
+<glyph unicode="&#x1d635;" horiz-adv-x="291" d="M376 453l-17 -71h-104l-61 -245q-6 -24 -6 -39q0 -37 38 -37q36 0 70 26h12l-30 -75q-34 -22 -93 -22q-41 0 -62.5 20.5t-21.5 56.5q0 15 5 37l70 278h-80l4 17l58 54h35l16 64l77 63h18l-32 -127h104z" />
+<glyph unicode="&#x1d636;" horiz-adv-x="491" d="M536 453l-81 -325q-16 -66 -22 -115l-77 -24l-8 5l14 65q-37 -32 -83 -50.5t-85 -18.5q-47 0 -76 25.5t-29 65.5q0 25 6 50l80 322h79l-75 -304q-5 -19 -5 -35q0 -53 65 -53q28 0 74.5 29.5t71.5 70.5l72 292h79z" />
+<glyph unicode="&#x1d637;" horiz-adv-x="474" d="M555 453l-311 -467h-22l-79 467h85l48 -299l194 299h85z" />
+<glyph unicode="&#x1d638;" horiz-adv-x="702" d="M787 453l-312 -467h-22l-37 244l-183 -244h-21l-72 467h84l47 -304l129 176q-3 25 -10.5 73.5t-8.5 54.5h84l48 -294l189 294h85z" />
+<glyph unicode="&#x1d639;" horiz-adv-x="482" d="M544 453l-200 -217l108 -236h-94l-79 175l-155 -175h-94l220 239l-96 214h94l68 -151l134 151h94z" />
+<glyph unicode="&#x1d63a;" horiz-adv-x="484" d="M565 453l-301 -497q-54 -89 -102.5 -130.5t-112.5 -41.5q-48 0 -68 24l18 72h16q26 -24 54 -24q32 0 69 38.5t71 99.5q2 4 9 15.5t10 17.5q-14 81 -45 237t-37 189h86l59 -323l189 323h85z" />
+<glyph unicode="&#x1d63b;" horiz-adv-x="447" d="M517 453l-5 -20l-342 -362h264l-27 -71h-382l4 20l342 362h-227l29 71h344z" />
+<glyph unicode="&#x1d6a4;" horiz-adv-x="278" d="M221 115l14 -12q-41 -63 -71 -88.5t-67 -25.5q-50 0 -50 57q0 20 24 110l48 175q9 34 9 45q0 15 -11 19t-52 5v16q44 3 159 25l5 -3l-96 -342q-9 -34 -9 -45q0 -15 16 -15q12 0 30 17.5t51 61.5z" />
+<glyph unicode="&#x1d6a5;" horiz-adv-x="278" d="M246 438l-104 -410q-31 -121 -76.5 -178t-110.5 -57q-35 0 -57 17t-22 44q0 18 12 31t29 13q39 0 39 -37q0 -12 -6 -19.5t-6 -14.5q0 -12 18 -12q30 0 50.5 39t46.5 143l72 292q16 65 16 80q0 17 -10.5 24t-37.5 7h-26v16q45 3 169 25z" />
+<glyph unicode="&#x1d6e2;" horiz-adv-x="717" d="M685 0h-285v16h16q40 0 56 14.5t16 46.5q0 7 -2 21l-13 113h-198l-84 -140q-10 -11 -10 -26q2 -29 43 -29h29v-16h-218v16q67 8 108 74l356 577h18l78 -581q10 -70 74 -70h16v-16zM466 248l-25 227h-6l-139 -227h170z" />
+<glyph unicode="&#x1d6e3;" horiz-adv-x="696" d="M198 653h252q236 0 236 -145q0 -102 -91 -147q-28 -14 -74 -26l3 -4q52 -9 89.5 -44t37.5 -94q0 -82 -72 -137.5t-217 -55.5h-324l4 16h20q52 0 74 16.5t29 46.5l123 495q2 10 2 21q0 42 -78 42h-19zM406 611l-59 -252q30 -6 53 -6q82 0 125 44t43 119q0 52 -35 75 t-84 23q-23 0 -43 -3zM338 314l-68 -267q32 -9 71 -9q80 0 135 41t55 131q0 52 -40 80t-102 28q-36 0 -51 -4z" />
+<glyph unicode="&#x1d6e4;" horiz-adv-x="616" d="M721 653l-39 -175h-17q5 45 5 50q-1 88 -114 88h-146l-133 -538q-4 -18 -4 -24q0 -38 79 -38h32l-4 -16h-342l4 16h18q53 0 75.5 16t29.5 46l123 497q4 16 4 24q0 39 -76 39h-19l4 15h520z" />
+<glyph unicode="&#x1d6e5;" horiz-adv-x="596" d="M556 0h-526l412 667h19zM429 82l-45 393h-6l-241 -393h292z" />
+<glyph unicode="&#x1d6e6;" horiz-adv-x="714" d="M734 653l-42 -158h-16q2 26 2 35q-4 87 -109 87h-160l-60 -248h80q51 0 81 19t45 76h16l-58 -242h-17q0 2 3 26t3 34q0 51 -72 51h-90l-66 -258q-2 -8 -2 -10q0 -27 63 -27h67q115 0 169 36t88 124h16l-66 -198h-571l4 16h19q89 0 104 62l120 488q5 22 5 36q0 19 -16 27 t-59 8h-19l4 16h534z" />
+<glyph unicode="&#x1d6e7;" horiz-adv-x="772" d="M802 653l-566 -615h218q42 0 70 4t59.5 17t53 43t34.5 76h16l-46 -178h-581l573 616h-202q-44 0 -71.5 -3t-60.5 -14t-55 -37t-36 -67h-17l48 158h563z" />
+<glyph unicode="&#x1d6e8;" horiz-adv-x="873" d="M923 653l-4 -16h-18q-52 0 -75 -16.5t-31 -46.5l-123 -496q-4 -18 -4 -28q0 -34 78 -34h19l-4 -16h-329l4 16h18q51 0 74.5 16t30.5 46l61 242h-280l-61 -242q-4 -12 -4 -24q0 -38 77 -38h20l-4 -16h-330l4 16h18q91 0 106 62l123 496q4 12 4 24q0 39 -78 39h-20l4 16 h330l-4 -16h-18q-54 0 -76 -16t-29 -47l-52 -217h278l53 217q4 20 4 24q0 39 -76 39h-20l4 16h330z" />
+<glyph unicode="&#x1d6e9;" horiz-adv-x="737" d="M520 425h16q-30 -77 -30 -163v-27h-16q-1 31 -13 44t-38 13h-117q-28 0 -43 -12t-31 -45h-16q30 75 30 176v14h16q6 -34 17 -45.5t39 -11.5h118q48 0 68 57zM712 395q0 -96 -50.5 -188.5t-147 -155t-212.5 -62.5q-112 0 -182 65t-70 168q0 61 18 124t54 121t84.5 103 t115 72t140.5 27q66 0 115.5 -23t78 -62.5t42.5 -87t14 -101.5zM596 444q0 85 -34.5 136.5t-107.5 51.5q-66 0 -118.5 -34.5t-82.5 -85t-49.5 -115.5t-26 -119t-6.5 -102q0 -72 39 -110.5t100 -38.5q75 0 133 43t89.5 109.5t47.5 134.5t16 130z" />
+<glyph unicode="&#x1d6ea;" horiz-adv-x="480" d="M530 653l-4 -16h-19q-53 0 -75.5 -16t-30.5 -46l-123 -497q-3 -12 -3 -29q0 -33 78 -33h17l-4 -16h-328l4 16h19q52 0 75 16.5t30 45.5l123 497q4 16 4 24q0 38 -77 38h-18l4 16h328z" />
+<glyph unicode="&#x1d6eb;" horiz-adv-x="762" d="M802 653l-4 -16q-35 0 -59 -12t-61 -41l-271 -211l187 -278q26 -38 54.5 -58.5t72.5 -20.5l-4 -16h-287l4 16h11q24 0 35.5 6.5t11.5 26.5q0 6 -1.5 11t-3.5 7.5t-5 8.5l-6 8l-156 237h-4l-62 -243q-3 -12 -3 -22q0 -40 78 -40h17l-4 -16h-304l4 16h18q68 0 84 62 l117 472q10 39 10 49q0 38 -76 38h-18l4 16h312l-4 -16h-11q-51 0 -70 -15.5t-27 -46.5l-53 -209h5l282 221q18 14 18 29q-1 11 -11 16t-40 5l4 16h216z" />
+<glyph unicode="&#x1d6ec;" horiz-adv-x="718" d="M686 0h-287l2 16h15q70 0 70 61q0 14 -1 21l-44 378h-5l-245 -405q-10 -15 -10 -26q0 -29 43 -29h29v-16h-218v16q67 8 108 74l357 577h17l78 -569q6 -46 24 -64t50 -18h17v-16z" />
+<glyph unicode="&#x1d6ed;" horiz-adv-x="1005" d="M1055 653l-4 -16h-17q-55 0 -76 -15t-29 -46l-127 -498q-2 -7 -2 -28q0 -34 77 -34h19l-4 -16h-330l4 16h17q54 0 76 16.5t29 45.5l112 439h-6l-345 -517h-25l-94 517h-3l-109 -428q-5 -22 -5 -40q0 -33 76 -33h20l-4 -16h-267l4 16h19q54 0 76.5 19t31.5 54l119 475 q5 21 5 38q0 35 -77 35h-19l4 16h213l89 -493h4l333 493h215z" />
+<glyph unicode="&#x1d6ee;" horiz-adv-x="851" d="M901 653l-4 -16h-18q-53 0 -76.5 -16t-30.5 -47l-144 -574h-24l-274 526h-6l-108 -448q-3 -12 -3 -27q0 -35 76 -35h19l-4 -16h-266l4 16h18q91 0 106 62l126 509q-22 50 -92 50h-19l4 16h200l236 -465h5l97 386q4 18 4 26q0 37 -76 37h-20l4 16h266z" />
+<glyph unicode="&#x1d6ef;" horiz-adv-x="706" d="M741 653l-35 -152h-16q3 13 3 33q0 16 -4.5 25t-16 12.5t-20.5 4.5t-29 1h-299q-40 0 -62.5 -17.5t-33.5 -58.5h-16l37 152h492zM609 450l-52 -209h-15l2 26q0 18 -11 29.5t-28 11.5h-185q-27 0 -48.5 -20t-30.5 -47h-16l52 209h16q-3 -15 -3 -25q0 -24 16 -32.5t47 -8.5 h145q50 0 67 14t28 52h16zM629 158l-40 -158h-537l40 158h13v-14v-21q0 -24 16.5 -32.5t48.5 -8.5h339q34 0 48.5 3t29 19.5t26.5 53.5h16z" />
+<glyph unicode="&#x1d6f0;" horiz-adv-x="732" d="M712 420q0 -75 -29 -151t-80 -138.5t-130 -102t-170 -39.5q-112 0 -182.5 65t-70.5 168q0 77 29.5 155.5t81 144t131 106.5t171.5 41q118 0 183.5 -73.5t65.5 -175.5zM596 443q0 86 -34.5 137.5t-106.5 51.5q-66 0 -118 -34t-82.5 -84.5t-50 -115.5t-26.5 -119t-7 -102 q0 -70 39.5 -110t100.5 -40t111 30t81.5 75.5t53 103t30.5 110t9 97.5z" />
+<glyph unicode="&#x1d6f1;" horiz-adv-x="873" d="M923 653l-4 -16h-19q-53 0 -75 -15.5t-30 -45.5l-123 -498q-3 -10 -3 -27q0 -18 16.5 -26.5t60.5 -8.5h20l-4 -16h-331l4 16h18q54 0 75.5 13.5t30.5 48.5l132 538h-278l-133 -538q-3 -15 -3 -26q0 -22 17.5 -29t57.5 -7h19l-4 -16h-329l4 16h18q91 0 106 62l122 498 q3 12 3 24q0 19 -17 28t-59 9h-20l4 16h724z" />
+<glyph unicode="&#x1d6f2;" horiz-adv-x="594" d="M201 653h271q117 0 174.5 -48t57.5 -112q0 -82 -71.5 -140.5t-213.5 -58.5q-44 0 -74 5q-4 0 -12 2l-56 -223q-3 -12 -3 -23q0 -39 77 -39h32l-4 -16h-341l4 16h17q53 0 75.5 16t30.5 46l125 497q4 16 4 25q0 37 -78 37h-19zM411 613l-68 -274q32 -8 60 -8q78 0 130 48 t52 124q0 50 -29.5 81.5t-95.5 31.5q-24 0 -49 -3z" />
+<glyph unicode="&#x1d6f3;" horiz-adv-x="737" d="M712 395q0 -96 -50.5 -188.5t-147 -155t-212.5 -62.5q-112 0 -182 65t-70 168q0 61 18 124t54 121t84.5 103t115 72t140.5 27q66 0 115.5 -23t78 -62.5t42.5 -87t14 -101.5zM195 368h395q6 40 6 76q0 85 -34.5 136.5t-107.5 51.5q-54 0 -98.5 -22t-75 -61.5t-51 -83.5 t-34.5 -97zM575 292h-395q-9 -57 -9 -116q0 -72 39 -110.5t100 -38.5q103 0 169.5 76t95.5 189z" />
+<glyph unicode="&#x1d6f4;" horiz-adv-x="735" d="M760 653l-40 -159h-16q3 7 3 29q0 26 -8 44.5t-18.5 27.5t-30 14t-34 6t-38.5 1h-205l161 -255l-317 -279h315q57 0 94.5 26t64.5 83h16l-83 -191h-566l378 327l-210 326h534z" />
+<glyph unicode="&#x1d6f5;" horiz-adv-x="550" d="M670 653l-46 -179h-16q5 42 5 71q0 31 -17.5 47.5t-36 20t-45.5 3.5h-98l-133 -538q-5 -22 -5 -25q0 -37 76 -37h21l-4 -16h-329l4 16h18q54 0 76.5 16t29.5 46l133 538h-91q-62 0 -109.5 -40.5t-61.5 -101.5h-16l46 179h599z" />
+<glyph unicode="&#x1d6f6;" horiz-adv-x="567" d="M687 661v-16q-58 0 -126 -81l-212 -251l-57 -235q-4 -14 -4 -26q0 -36 77 -36h21l-4 -16h-328l4 16h17q53 0 75 16t29 46l61 247l-78 208q-23 61 -51 87.5t-83 26.5l4 16q53 5 85 5q31 0 55 -7.5t37.5 -16t25.5 -28t16.5 -31t13.5 -36.5l64 -185h5l176 207q27 33 42 48 t41 29.5t54 14.5q26 0 40 -2z" />
+<glyph unicode="&#x1d6f7;" horiz-adv-x="772" d="M508 578l-9 -31q102 0 175 -44t73 -132q0 -56 -24 -103t-61 -78t-83.5 -53t-91 -32t-83.5 -10h-19l-7 -31q-2 -10 -2 -15q0 -33 73 -33h26l-4 -16h-330l3 16q66 0 91 15t38 64h-13q-113 0 -174 46.5t-61 111.5q0 76 33 134.5t87 92t115.5 50.5t125.5 17q10 29 10 51 q0 39 -75 39h-19l4 16h321l-4 -16h-16q-82 0 -99 -59zM490 510l-95 -377q92 0 162.5 64t70.5 177q0 58 -34.5 97t-103.5 39zM283 133l93 377q-63 0 -118 -41t-84.5 -100t-29.5 -115q0 -52 35 -86.5t104 -34.5z" />
+<glyph unicode="&#x1d6f8;" horiz-adv-x="790" d="M810 653l-4 -16h-4q-33 0 -58.5 -11t-39.5 -23.5t-37 -39.5l-187 -213l96 -266q11 -32 28 -50t51 -18h14l-4 -16h-281l4 16h11q34 0 50.5 8t16.5 33q0 13 -4 26l-69 194l-181 -201q-12 -13 -12 -28q0 -32 56 -32h22l-4 -16h-249l4 16q78 10 140 77l208 230l-85 231 q-6 18 -10.5 27t-16 25t-30.5 23.5t-45 7.5h-9l4 16h283l-4 -16h-19q-26 0 -39 -7t-13 -28q0 -12 6 -28l60 -179l164 184q15 18 15 34q-2 24 -45 24h-9l4 16h222z" />
+<glyph unicode="&#x1d6f9;" horiz-adv-x="670" d="M743 667l-4 -16q-38 -8 -55 -51q-5 -13 -11 -41q-18 -86 -37 -124q-43 -89 -113 -127t-175 -38l-43 -181q-8 -37 -8 -43q0 -31 77 -31q16 0 21 1l-4 -16h-328l4 16q66 0 84 8q30 14 42 65l42 181q-50 0 -93.5 12t-76.5 46t-33 85q0 31 17 92t17 92q0 50 -38 54l4 16h18 q49 0 80.5 -33t31.5 -82q0 -31 -20.5 -88t-20.5 -88q0 -69 124 -69l54 218q17 71 17 77q0 8 -3.5 14t-11 9.5t-14.5 6t-18 3.5t-17.5 1.5t-16.5 0.5h-13l4 16h321l-4 -16q-29 0 -48.5 -2.5t-40.5 -15.5t-27 -38l-68 -274q78 0 116.5 37.5t64.5 118.5q3 10 9.5 34t12 41.5 t13.5 32.5q47 96 150 96h18z" />
+<glyph unicode="&#x1d6fa;" horiz-adv-x="800" d="M280 94l5 37q-147 48 -147 203q0 69 41 139q36 59 91 104q107 89 273 89q126 0 186 -73q48 -59 48 -157q0 -115 -84 -202q-76 -79 -198 -103l-7 -37h128q56 6 79 19q31 19 49 66l18 -5l-56 -174h-280l40 166q94 21 155 115q51 79 51 171q0 181 -140 181q-108 0 -192 -87 q-97 -101 -97 -216q0 -65 23 -109q23 -43 61 -55l-24 -166h-271l42 179l17 -5q-4 -17 -4 -36q0 -44 62 -44h131z" />
+<glyph unicode="&#x1d6fb;" horiz-adv-x="627" d="M600 653l-400 -668h-26l-132 668h558zM499 559h-342l87 -432z" />
+<glyph unicode="&#x1d6fc;" horiz-adv-x="524" d="M529 428l-139 -241v-37q0 -40 8.5 -69.5t25.5 -29.5q20 0 46 74l15 -7q-14 -58 -38.5 -93t-56.5 -35q-26 0 -45 26t-21 61h-2q-59 -87 -153 -87q-61 0 -95 47t-34 114q0 37 7 66q22 92 84.5 158t140.5 66q55 0 84.5 -39.5t29.5 -96.5l64 123h79zM322 273q0 31 -1.5 51 t-7.5 42.5t-19 33.5t-34 11q-46 0 -91 -86.5t-45 -199.5q0 -52 10 -78.5t44 -26.5q29 0 60 36t49 73t30 73q5 25 5 71z" />
+<glyph unicode="&#x1d6fd;" horiz-adv-x="493" d="M47 -105l116 479q25 103 49 145t84 94q64 55 123 55q42 0 70.5 -32t28.5 -82q0 -57 -27.5 -108t-72.5 -71v-1q56 -15 56 -102q0 -48 -18.5 -101.5t-44.5 -86.5q-75 -96 -192 -96q-38 0 -64 21l-28 -122q-8 -37 -23 -70h-79q8 17 22 78zM266 459l-102 -419q22 -23 49 -23 q54 0 96.5 50.5t61 112.5t18.5 115q0 63 -21 63q-10 0 -21.5 -4t-20.5 -4q-13 0 -22.5 6.5t-9.5 15.5q0 10 11.5 18.5t35.5 8.5q3 0 19.5 -2.5t24.5 -2.5q29 0 44.5 46t15.5 78q0 40 -15.5 70t-45.5 30q-22 0 -39.5 -9t-28.5 -22t-21 -36t-15.5 -42t-13.5 -50z" />
+<glyph unicode="&#x1d6fe;" horiz-adv-x="428" d="M458 428l-266 -371q-8 -87 -16 -128q-24 -116 -83 -116q-17 0 -26.5 12.5t-9.5 31.5q0 36 14.5 67.5t41.5 70t39 62.5q13 92 13 182q0 138 -58 138q-29 0 -56 -74h-16q39 138 102 138q66 0 66 -128q0 -37 -6.5 -104t-7.5 -75l179 294h90z" />
+<glyph unicode="&#x1d6ff;" horiz-adv-x="463" d="M451 608q0 -18 -12 -32t-34 -14t-32 10t-11 22.5t-15.5 22.5t-45.5 10t-60.5 -20t-29.5 -47q0 -26 23 -53t56 -51l66 -52q33 -26 56 -62t23 -75q0 -66 -18 -112q-29 -70 -89.5 -118t-141.5 -48q-70 0 -108 41t-38 104q0 93 69 174t170 91q-12 12 -35 31.5t-35.5 31.5 t-23 30.5t-10.5 37.5q0 45 29 78t65.5 46.5t72.5 13.5q43 0 76 -15t33 -45zM351 269q0 39 -13.5 69.5t-40.5 30.5q-61 0 -120 -88.5t-59 -160.5q0 -43 19.5 -72.5t50.5 -29.5q63 0 113 86t50 165z" />
+<glyph unicode="&#x1d700;" horiz-adv-x="484" d="M444 372l-14 -8q-18 26 -46 36.5t-74 10.5q-51 0 -95 -32t-44 -81q0 -24 22 -37.5t56 -13.5q10 0 29.5 4.5t32.5 4.5q38 0 38 -20q0 -31 -43 -31q-3 0 -26 3t-35 3q-45 0 -89 -27.5t-44 -75.5q0 -42 36 -60t89 -18q42 0 84.5 19.5t66.5 53.5l13 -10q-35 -50 -84 -77 t-126 -27q-86 0 -126 29t-40 73q0 53 32 88.5t84 48.5q-58 20 -58 66q0 63 61 105t164 42q46 0 86 -21t50 -48z" />
+<glyph unicode="&#x1d701;" horiz-adv-x="435" d="M290 668l4 -16q-36 -13 -55 -33.5t-19 -40.5q0 -35 49 -45q31 36 87 71t92 35q32 0 32 -24q0 -34 -63.5 -70.5t-132.5 -42.5q-72 -50 -129 -143.5t-57 -185.5q0 -91 92 -91h6q6 0 17.5 0.5t23.5 0.5q63 0 93.5 -23t30.5 -76q0 -62 -59 -114.5t-122 -52.5q-24 0 -38.5 17 t-14.5 37q0 18 12.5 30t35.5 12q11 0 27.5 -15t25.5 -15q36 0 66.5 19.5t30.5 48.5q0 49 -82 49q-5 0 -36 -4.5t-40 -4.5q-55 0 -91 39t-36 103q0 110 54.5 200t145.5 171v1q-27 0 -50 16t-23 43q0 32 32 61t91 43z" />
+<glyph unicode="&#x1d702;" horiz-adv-x="460" d="M173 251h2l57 73q45 58 83.5 87.5t79.5 29.5q60 0 60 -54q0 -13 -15 -78l-75 -313q-23 -97 -23 -144q0 -25 5 -35h-76q-11 13 -11 46q0 30 16.5 101t82.5 335q8 27 8 48q0 13 -7.5 21t-20.5 8q-31 0 -104.5 -98t-95.5 -173l-31 -105h-78l77 304q13 54 13 59q0 13 -13 13 q-22 0 -60 -50l-13 10q30 42 46 58q19 19 43.5 33t40.5 14q41 0 41 -41q0 -19 -5.5 -45.5t-15 -61t-11.5 -42.5z" />
+<glyph unicode="&#x1d703;" horiz-adv-x="484" d="M474 472q0 -98 -41 -210.5t-112 -192.5t-144 -80q-71 0 -104 44t-33 135q0 68 21.5 152t59.5 162.5t98 132t127 53.5q57 0 92.5 -50t35.5 -146zM159 344h206q25 117 25 166q0 129 -51 129q-50 0 -104 -97t-76 -198zM356 308h-207q-25 -78 -25 -165q0 -125 58 -125 q45 0 87.5 69.5t70.5 160.5l10 34z" />
+<glyph unicode="&#x1d704;" horiz-adv-x="267" d="M227 441l-92 -364q-1 -6 -1 -14q0 -11 13 -11q6 0 10.5 1.5t8 3t8.5 7t9 9.5t12.5 14t15.5 17l13 -10q-82 -105 -134 -105q-40 0 -40 46q0 27 79 334q2 4 2 12q0 13 -7 17.5t-24 4.5q-14 0 -28 -4l-3 16z" />
+<glyph unicode="&#x1d705;" horiz-adv-x="534" d="M193 251l183 136q44 33 70 43.5t56 10.5q47 0 47 -41q0 -16 -10.5 -27t-31.5 -11q-15 0 -29 13.5t-31 13.5q-26 0 -52 -21l-143 -113l112 -187q17 -29 35 -38t66 -14l-1 -16h-235l1 16q58 0 58 17q0 16 -13 33l-90 153l-57 -219h-78l94 371v9q0 20 -32 20q-12 0 -28 -3 l-2 15l161 27z" />
+<glyph unicode="&#x1d706;" horiz-adv-x="541" d="M495 124h16q-38 -140 -104 -140q-22 0 -38 27t-16 68q0 27 3 57l6 76q4 46 7 85l-218 -297h-101l319 431q2 16 2 31q0 35 -1 46q-7 96 -56 96q-25 0 -53 -74h-16q37 138 104 138q55 0 55 -136v-383q0 -101 38 -101q25 0 53 76z" />
+<glyph unicode="&#x1d707;" horiz-adv-x="579" d="M549 428l-86 -338q-8 -32 -8 -39q0 -14 17 -14q30 0 57 48l15 -6q-12 -34 -54.5 -70t-76.5 -36q-41 0 -41 41q0 37 33 171q-71 -107 -114.5 -149t-79.5 -42q-13 0 -25 7.5t-16 17.5q-39 -155 -51 -179q-6 -13 -15 -23h-74q26 37 45 114l125 497h79l-71 -298 q-4 -18 -4 -27q0 -45 54 -45q37 0 109 115t88 184l16 71h78z" />
+<glyph unicode="&#x1d708;" horiz-adv-x="452" d="M444 446l18 -5q-14 -134 -83.5 -252.5t-185.5 -197.5h-21l-62 369q-7 42 -44 42h-16v16q57 2 128 23l60 -350q136 103 206 355z" />
+<glyph unicode="&#x1d709;" horiz-adv-x="433" d="M293 668l4 -16q-32 -9 -50.5 -25.5t-22 -26.5t-3.5 -18q0 -12 8 -21.5t24 -9.5q88 67 144 67q46 0 46 -34q0 -31 -49.5 -51t-106.5 -20q-37 0 -61.5 -25t-24.5 -53t31 -52q70 46 140 46q24 0 39.5 -8t15.5 -21q0 -24 -25 -39t-50 -19t-48 -4q-37 0 -68 9 q-66 -25 -110 -75.5t-44 -110.5q0 -44 24 -61t85 -17q12 0 28 0.5t21 0.5q63 0 93.5 -23.5t30.5 -76.5q0 -62 -59.5 -114.5t-121.5 -52.5q-24 0 -38.5 17t-14.5 37q0 18 12.5 30t35.5 12q11 0 27.5 -15t25.5 -15q36 0 66.5 19.5t30.5 48.5q0 49 -82 49q-10 0 -37.5 -4.5 t-36.5 -4.5q-147 2 -147 118q0 82 47 148t123 108q-30 26 -29 69q3 51 57 89q-21 5 -35.5 20t-14.5 31q0 34 30 59t90 35z" />
+<glyph unicode="&#x1d70a;" horiz-adv-x="458" d="M438 287q0 -110 -76.5 -204t-186.5 -94q-69 0 -102 49t-33 114t31 131t90.5 112t129.5 46q64 0 105.5 -38.5t41.5 -115.5zM357 318q0 36 -15.5 64.5t-51.5 28.5q-61 0 -115 -91.5t-54 -193.5q0 -107 59 -107q49 0 92 60t64 128t21 111z" />
+<glyph unicode="&#x1d70b;" horiz-adv-x="558" d="M568 428l-23 -73h-112q-3 -8 -16 -45l-23 -66q-10 -29 -19 -66.5t-9 -60.5q0 -18 11 -33t27 -15q44 0 73 66h16q-17 -59 -56 -100.5t-88 -41.5q-28 0 -42.5 21.5t-14.5 53.5q0 34 9 62q9 27 36.5 102.5t41.5 122.5h-94q-12 -32 -33 -97l-34 -106q-14 -41 -39.5 -86.5 t-54.5 -67.5q-13 -11 -38 -11q-20 0 -35.5 13t-15.5 31q0 40 31 48q49 14 74 70l89 206q-36 0 -53.5 -2t-41 -14t-44.5 -37h-16q69 126 212 126h282z" />
+<glyph unicode="&#x1d70c;" horiz-adv-x="502" d="M30 -183l84 336q50 202 166 259q58 29 98 29q94 0 94 -155q0 -65 -32.5 -133.5t-92.5 -116.5t-129 -48q-37 0 -61 18l-44 -189h-83zM212 238l-46 -200q18 -21 46 -21q48 0 90 48.5t64 113.5t22 123q0 43 -15.5 63t-35.5 20q-41 0 -75 -39t-50 -108z" />
+<glyph unicode="&#x1d70d;" horiz-adv-x="439" d="M464 438q0 -43 -48 -43q-20 0 -32 18.5t-31 18.5q-55 0 -114.5 -31t-102.5 -89t-43 -125q0 -50 17.5 -76.5t73.5 -26.5q13 0 28 0.5t18 0.5q126 0 126 -92q0 -74 -55.5 -125t-125.5 -51q-24 0 -38.5 18t-14.5 38q0 18 12.5 30t35.5 12q11 0 27.5 -16t25.5 -16q35 0 66 21 t31 50q0 49 -82 48q-10 0 -39 -4.5t-47 -4.5q-47 0 -82 40t-35 109q0 80 52.5 162t132.5 134t156 52q32 0 60 -13t28 -39z" />
+<glyph unicode="&#x1d70e;" horiz-adv-x="537" d="M547 428l-20 -73h-173q9 -25 30.5 -46t37.5 -43t16 -54q0 -86 -75 -154.5t-181 -68.5q-71 0 -106.5 48.5t-35.5 111.5q0 122 78.5 200.5t181.5 78.5h247zM286 355h-2q-57 -5 -110 -70.5t-53 -163.5q0 -20 4.5 -41t20 -41t40.5 -20q69 0 120.5 70t51.5 137 q0 44 -21.5 77.5t-50.5 51.5z" />
+<glyph unicode="&#x1d70f;" horiz-adv-x="442" d="M472 428l-22 -73h-155q-27 -66 -60 -189q-7 -25 -7 -46q0 -26 8 -37.5t28 -11.5q19 0 41.5 20t35.5 47h16q-18 -60 -59.5 -101.5t-89.5 -41.5q-64 0 -64 67q0 12 2.5 26t5.5 23l8 25q6 15 7 19l66 200h-51q-39 0 -75 -24.5t-61 -63.5h-16q25 58 83 109.5t124 51.5h235z " />
+<glyph unicode="&#x1d710;" horiz-adv-x="460" d="M293 425l2 14q150 -24 150 -168q0 -101 -73.5 -191.5t-176.5 -90.5q-62 0 -100 29t-38 75q0 27 19 94l41 141q9 29 9 39q0 14 -15 14q-13 0 -25.5 -9.5t-42.5 -46.5l-13 9q35 51 72 78t68 27q24 0 35 -7.5t11 -28.5q0 -19 -68 -240q-13 -41 -13 -74q0 -71 63 -71 q55 0 100 48.5t66 109t21 113.5q0 120 -92 136z" />
+<glyph unicode="&#x1d711;" horiz-adv-x="666" d="M247 19l34 130q75 289 245 289q47 0 76 -38.5t29 -116.5q0 -72 -36.5 -138.5t-109.5 -111t-165 -44.5l-40 -172h-83l43 172q-83 0 -136.5 44.5t-53.5 121.5q0 112 81 199t198 87h25l-5 -16q-86 -9 -150.5 -88.5t-64.5 -177.5q0 -59 33 -99.5t80 -40.5zM380 238l-53 -219 q73 0 146.5 87t73.5 183q0 55 -12 74t-32 19q-36 0 -72 -41.5t-51 -102.5z" />
+<glyph unicode="&#x1d712;" horiz-adv-x="595" d="M645 428l-290 -343q0 -131 9 -177t32 -46q29 0 54 67h16q-34 -131 -102 -131q-55 0 -55 112q0 34 7 125l-185 -218h-101l296 349v78q0 70 -12 101.5t-40 31.5q-33 0 -57 -66h-16q16 59 39 94.5t63 35.5q56 0 56 -138q0 -21 -1 -31l-4 -72l191 228h100z" />
+<glyph unicode="&#x1d713;" horiz-adv-x="661" d="M711 439v-16q-23 -3 -42 -13t-33 -29t-23.5 -35.5t-18.5 -44.5t-13 -45l-11 -46q-22 -96 -98.5 -158.5t-169.5 -62.5l-42 -172h-81l43 172h-10q-66 0 -109.5 39.5t-43.5 125.5q0 27 16 87.5t16 95.5q0 80 -61 86l5 16q19 2 55 2q41 0 64.5 -32.5t23.5 -78.5 q0 -28 -15.5 -92t-15.5 -93q0 -55 22 -88t61 -38l100 409h81l-100 -409q58 11 105 60t65 127l11 46l11 40q8 30 15 42l18 32q12 22 25 31.5t31 21t41.5 16t51.5 4.5h26z" />
+<glyph unicode="&#x1d714;" horiz-adv-x="681" d="M465 425l6 16q190 0 190 -161q0 -120 -80 -205.5t-165 -85.5q-44 0 -72.5 25t-31.5 64q-73 -89 -154 -89q-48 0 -80.5 27t-45 61.5t-12.5 72.5q0 123 83.5 207t214.5 84h16l3 -16q-93 0 -164 -93.5t-71 -219.5q0 -37 18 -65t50 -28q41 0 78.5 34t48.5 71q-3 22 -3 51 q0 41 8.5 81t32 72.5t56.5 32.5q14 0 23.5 -14t9.5 -33q0 -82 -78 -195q0 -43 16.5 -71.5t53.5 -28.5q41 0 81 51t62 114t22 108q0 69 -27.5 97.5t-88.5 35.5z" />
+<glyph unicode="&#x1d715;" horiz-adv-x="471" d="M195 625l-10 20q38 23 98 23q188 0 188 -260q0 -49 -8 -101t-29 -110t-53 -103.5t-85 -75t-120 -29.5q-69 0 -102.5 46t-33.5 116q0 109 75.5 196.5t181.5 87.5q69 0 96 -48q7 39 7 70q0 77 -30.5 129t-100.5 52q-33 0 -74 -13zM367 319q0 44 -18.5 65t-42.5 21 q-73 0 -129 -90.5t-56 -197.5q0 -98 67 -98q54 0 97.5 59t66.5 143q15 55 15 98z" />
+<glyph unicode="&#x1d716;" horiz-adv-x="430" d="M430 441l-19 -132h-15q-16 105 -93 105q-56 0 -98.5 -51.5t-62.5 -115.5h181l-5 -36h-185q-7 -20 -7 -66q0 -47 25 -74t67 -27q74 0 144 68l12 -14q-46 -52 -91.5 -80.5t-102.5 -28.5q-67 0 -103.5 43t-36.5 109q0 72 34 140.5t97.5 114t137.5 45.5q27 0 49.5 -10 t33.5 -10q14 0 23 20h15z" />
+<glyph unicode="&#x1d717;" horiz-adv-x="554" d="M33 205l-13 9q72 106 131 106q44 0 44 -45q0 -30 -18.5 -89.5t-18.5 -96.5q0 -78 57 -78q107 0 168 212q-88 38 -148 109.5t-60 159.5q0 81 48.5 133.5t128.5 52.5q78 0 116.5 -57.5t38.5 -139.5q0 -129 -47 -257q40 -13 45 -14l-5 -19q-20 1 -49 8q-87 -209 -239 -209 q-134 0 -134 104q0 12 1.5 23.5t5 25.5t5.5 21l8 25l8 23q8 24 8 39q0 14 -12 14q-21 0 -69 -60zM423 484q0 161 -79 161q-31 0 -51.5 -27t-27 -58t-6.5 -62q0 -75 35.5 -139.5t98.5 -102.5q30 123 30 228z" />
+<glyph unicode="&#x1d718;" horiz-adv-x="561" d="M587 428l-156 -145q-22 -36 -42 -86q-21 -54 -21 -84q0 -41 49 -41q51 0 51 -38q0 -20 -17 -34q-16 -13 -42 -13q-37 0 -61 26q-22 23 -22 61q0 60 48 154l-1 1l-252 -229h-109l148 136q16 26 35 90q20 66 20 100q0 28 -26 28q-27 0 -38 6q-17 11 -17 36q0 22 21 35 q14 10 32 10q68 0 68 -77q0 -72 -45 -181l1 -1l268 246h108z" />
+<glyph unicode="&#x1d719;" horiz-adv-x="645" d="M480 668l-55 -228q86 0 140.5 -36.5t54.5 -118.5q0 -118 -80 -204q-85 -92 -226 -92l-48 -172h-81l46 172q-85 0 -138 44t-53 127q0 110 84 196q83 84 205 84h16q32 127 53 228h82zM418 411l-97 -392q86 0 150 86t64 175q0 63 -28 97.5t-89 33.5zM240 19l99 392 q-93 0 -154 -79t-61 -174q0 -51 33 -95t83 -44z" />
+<glyph unicode="&#x1d71a;" horiz-adv-x="509" d="M221 -187l-14 7q4 7 4 16q0 13 -15 24.5t-34.5 20t-44.5 24t-40 32.5q-37 43 -37 122q0 108 82 233q41 62 99.5 105.5t126.5 43.5t104.5 -42t36.5 -112q0 -115 -73.5 -206t-194.5 -91q-53 0 -86 30.5t-33 75.5h-2q-6 -22 -6 -44q0 -34 14.5 -57.5t35 -36.5t41 -24t35 -28 t14.5 -41q0 -23 -13 -52zM409 324q0 34 -15.5 61t-48.5 27q-64 0 -126.5 -91.5t-62.5 -193.5q0 -39 17.5 -73.5t52.5 -34.5q44 0 81 36t58 87t32.5 100t11.5 82z" />
+<glyph unicode="&#x1d71b;" horiz-adv-x="856" d="M866 428l-22 -73h-80q18 -35 18 -83q0 -61 -23.5 -115.5t-60 -90t-79.5 -56.5t-82 -21q-44 0 -72.5 24t-31.5 62q-71 -86 -154 -86q-70 0 -104 48.5t-34 109.5q0 123 90 208h-50q-76 0 -135 -87h-16q22 63 80 111.5t127 48.5h629zM690 355h-371q-96 -93 -96 -246 q0 -37 18 -63.5t50 -26.5q41 0 79 32.5t48 69.5q-4 30 -4 51q0 149 69 149q18 0 29 -14.5t11 -41.5q0 -68 -56 -149q0 -97 70 -97q41 0 81 49t62 110t22 106q0 42 -12 71z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.ttf b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.ttf
new file mode 100644
index 0000000..256bf6c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.ttf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.woff b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.woff
new file mode 100644
index 0000000..c6d5aae
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.woff
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.css b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.css
new file mode 100644
index 0000000..adf27ea
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.css
@@ -0,0 +1,357 @@
+/*
+ * LaTeX Math in pure HTML and CSS -- No images whatsoever
+ * v0.xa
+ * by Jay and Han
+ * Lesser GPL Licensed: http: //www.gnu.org/licenses/lgpl.html
+ *
+ * This file is automatically included by mathquill.js
+ *
+ */
+@font-face {
+  font-family: Symbola;
+  src: url(font/Symbola.eot);
+  src: local("Symbola Regular"), local("Symbola"), url(font/Symbola.ttf) format("truetype"), url(font/Symbola.otf) format("opentype"), url(font/Symbola.svg#Symbola) format("svg");
+}
+.mathquill-editable {
+  display: -moz-inline-box;
+  display: inline-block;
+  white-space: pre-wrap;
+}
+.mathquill-editable .cursor {
+  border-left: 1px solid black;
+  margin-right: -1px;
+  position: relative;
+  z-index: 1;
+  padding: 0;
+  display: -moz-inline-box;
+  display: inline-block;
+}
+.mathquill-editable .cursor.blink {
+  visibility: hidden;
+}
+.mathquill-editable,
+.mathquill-embedded-latex .mathquill-editable {
+  border: 1px solid gray;
+  padding: 2px;
+}
+.mathquill-embedded-latex .mathquill-editable {
+  margin: 1px;
+}
+.mathquill-editable.hasCursor,
+.mathquill-editable .hasCursor {
+  -webkit-box-shadow: #68b4df 0 0 3px 2px;
+  -moz-box-shadow: #68b4df 0 0 3px 2px;
+  box-shadow: #68b4df 0 0 3px 2px;
+}
+.mathquill-editable .latex-command-input {
+  color: inherit;
+  font-family: "Courier New", monospace;
+  border: 1px solid gray;
+  padding-right: 1px;
+  margin-right: 1px;
+  margin-left: 2px;
+}
+.mathquill-editable .latex-command-input.empty {
+  background: transparent;
+}
+.mathquill-editable .latex-command-input.hasCursor {
+  border-color: ActiveBorder;
+}
+.mathquill-editable.empty:after,
+.mathquill-textbox:after,
+.mathquill-rendered-math .empty:after {
+  visibility: hidden;
+  content: 'c';
+}
+.mathquill-editable .cursor:only-child:after,
+.mathquill-editable .textarea + .cursor:last-child:after {
+  visibility: hidden;
+  content: 'c';
+}
+.mathquill-textbox {
+  overflow-x: auto;
+  overflow-y: hidden;
+}
+.mathquill-rendered-math {
+  font-variant: normal;
+  font-weight: normal;
+  font-style: normal;
+  font-size: 115%;
+  line-height: 1;
+  display: -moz-inline-box;
+  display: inline-block;
+}
+.mathquill-rendered-math .non-leaf,
+.mathquill-rendered-math .scaled {
+  display: -moz-inline-box;
+  display: inline-block;
+}
+.mathquill-rendered-math var,
+.mathquill-rendered-math .text,
+.mathquill-rendered-math .nonSymbola {
+  font-family: "Times New Roman", Symbola, serif;
+  line-height: .9;
+}
+.mathquill-rendered-math * {
+  font-size: inherit;
+  line-height: inherit;
+  margin: 0;
+  padding: 0;
+  border-color: black;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  user-select: none;
+}
+.mathquill-rendered-math .empty {
+  background: #ccc;
+}
+.mathquill-rendered-math.empty {
+  background: transparent;
+}
+.mathquill-rendered-math .text {
+  font-size: 87%;
+}
+.mathquill-rendered-math .font {
+  font: 1em "Times New Roman", Symbola, serif;
+}
+.mathquill-rendered-math .font * {
+  font-family: inherit;
+  font-style: inherit;
+}
+.mathquill-rendered-math b,
+.mathquill-rendered-math b.font {
+  font-weight: bolder;
+}
+.mathquill-rendered-math var,
+.mathquill-rendered-math i,
+.mathquill-rendered-math i.font {
+  font-syle: italic;
+}
+.mathquill-rendered-math var.florin {
+  margin: 0 -0.1em;
+}
+.mathquill-rendered-math big {
+  font-size: 125%;
+}
+.mathquill-rendered-math .roman {
+  font-style: normal;
+}
+.mathquill-rendered-math .sans-serif {
+  font-family: sans-serif, Symbola, serif;
+}
+.mathquill-rendered-math .monospace {
+  font-family: monospace, Symbola, serif;
+}
+.mathquill-rendered-math .overline {
+  border-top: 1px solid black;
+  margin-top: 1px;
+}
+.mathquill-rendered-math .underline {
+  border-bottom: 1px solid black;
+  margin-bottom: 1px;
+}
+.mathquill-rendered-math .binary-operator {
+  padding: 0 0.2em;
+  display: -moz-inline-box;
+  display: inline-block;
+}
+.mathquill-rendered-math .unary-operator {
+  padding-left: 0.2em;
+}
+.mathquill-rendered-math sup,
+.mathquill-rendered-math sub {
+  position: relative;
+  font-size: 90%;
+}
+.mathquill-rendered-math sup .binary-operator,
+.mathquill-rendered-math sub .binary-operator {
+  padding: 0 .1em;
+}
+.mathquill-rendered-math sup .unary-operator,
+.mathquill-rendered-math sub .unary-operator {
+  padding-left: .1em;
+}
+.mathquill-rendered-math sup.limit,
+.mathquill-rendered-math sub.limit,
+.mathquill-rendered-math sup.nthroot,
+.mathquill-rendered-math sub.nthroot {
+  font-size: 80%;
+}
+.mathquill-rendered-math sup .fraction,
+.mathquill-rendered-math sub .fraction {
+  font-size: 70%;
+  vertical-align: -0.4em;
+}
+.mathquill-rendered-math sup .numerator,
+.mathquill-rendered-math sub .numerator {
+  padding-bottom: 0;
+}
+.mathquill-rendered-math sup .denominator,
+.mathquill-rendered-math sub .denominator {
+  padding-top: 0;
+}
+.mathquill-rendered-math sup {
+  vertical-align: .5em;
+}
+.mathquill-rendered-math sup.limit,
+.mathquill-rendered-math sup.nthroot {
+  vertical-align: 0.8em;
+}
+.mathquill-rendered-math sup.nthroot {
+  margin-right: -0.6em;
+  margin-left: .2em;
+  min-width: .5em;
+}
+.mathquill-rendered-math sub {
+  vertical-align: -0.4em;
+}
+.mathquill-rendered-math sub.limit {
+  vertical-align: -0.6em;
+}
+.mathquill-rendered-math .paren {
+  padding: 0 .1em;
+  vertical-align: bottom;
+  -webkit-transform-origin: bottom center;
+  -moz-transform-origin: bottom center;
+  -ms-transform-origin: bottom center;
+  -o-transform-origin: bottom center;
+  transform-origin: bottom center;
+}
+.mathquill-rendered-math .array {
+  vertical-align: middle;
+  text-align: center;
+}
+.mathquill-rendered-math .array > span {
+  display: block;
+}
+.mathquill-rendered-math .non-italicized-function {
+  font-family: Symbola, "Times New Roman", serif;
+  line-height: .9;
+  font-style: normal;
+  padding-right: .2em;
+}
+.mathquill-rendered-math .fraction {
+  font-size: 90%;
+  text-align: center;
+  vertical-align: -0.5em;
+  padding: 0 .2em;
+}
+.mathquill-rendered-math .fraction,
+.mathquill-rendered-math x:-moz-any-link {
+  display: -moz-groupbox;
+}
+.mathquill-rendered-math .fraction,
+.mathquill-rendered-math x:-moz-any-link,
+.mathquill-rendered-math x:default {
+  display: inline-block;
+}
+.mathquill-rendered-math .numerator,
+.mathquill-rendered-math .denominator {
+  display: block;
+}
+.mathquill-rendered-math .numerator {
+  padding: 0 0.1em;
+  margin-bottom: -0.1em;
+}
+.mathquill-rendered-math .denominator {
+  border-top: 1px solid;
+  float: right;
+  width: 100%;
+  padding: .1em .1em 0 .1em;
+  margin-right: -0.1em;
+  margin-left: -0.1em;
+}
+.mathquill-rendered-math .sqrt-prefix {
+  padding-top: 0;
+  position: relative;
+  top: .1em;
+  vertical-align: top;
+  -webkit-transform-origin: top;
+  -moz-transform-origin: top;
+  -ms-transform-origin: top;
+  -o-transform-origin: top;
+  transform-origin: top;
+}
+.mathquill-rendered-math .sqrt-stem {
+  border-top: 1px solid;
+  margin-top: 1px;
+  padding-left: .15em;
+  padding-right: .2em;
+  margin-right: .1em;
+}
+.mathquill-rendered-math .vector-prefix {
+  display: block;
+  text-align: center;
+  line-height: .25em;
+  margin-bottom: -0.1em;
+  font-size: 0.75em;
+}
+.mathquill-rendered-math .vector-stem {
+  display: block;
+}
+.mathquill-rendered-math,
+.mathquill-rendered-math .mathquill-editable {
+  cursor: text;
+  font-family: Symbola, "Times New Roman", serif;
+}
+.mathquill-rendered-math .selection,
+.mathquill-editable .selection,
+.mathquill-rendered-math .selection .non-leaf,
+.mathquill-editable .selection .non-leaf,
+.mathquill-rendered-math .selection .scaled,
+.mathquill-editable .selection .scaled {
+  background: #B4D5FE !important;
+  background: Highlight !important;
+  color: HighlightText;
+  border-color: HighlightText;
+}
+.mathquill-rendered-math .selection .matrixed,
+.mathquill-editable .selection .matrixed {
+  background: #39F !important;
+}
+.mathquill-rendered-math .selection .matrixed-container,
+.mathquill-editable .selection .matrixed-container {
+  filter: progid:DXImageTransform.Microsoft.Chroma(color='#3399FF') !important;
+}
+.mathquill-rendered-math .selection.blur,
+.mathquill-editable .selection.blur,
+.mathquill-rendered-math .selection.blur .non-leaf,
+.mathquill-editable .selection.blur .non-leaf,
+.mathquill-rendered-math .selection.blur .scaled,
+.mathquill-editable .selection.blur .scaled,
+.mathquill-rendered-math .selection.blur .matrixed,
+.mathquill-editable .selection.blur .matrixed {
+  background: #D4D4D4 !important;
+  color: black;
+  border-color: black;
+}
+.mathquill-rendered-math .selection.blur .matrixed-container,
+.mathquill-editable .selection.blur .matrixed-container {
+  filter: progid:DXImageTransform.Microsoft.Chroma(color='#D4D4D4') !important;
+}
+.mathquill-editable .textarea,
+.mathquill-rendered-math .textarea {
+  position: relative;
+  -webkit-user-select: text;
+  -moz-user-select: text;
+  user-select: text;
+}
+.mathquill-editable .textarea textarea,
+.mathquill-rendered-math .textarea textarea,
+.mathquill-editable .selectable,
+.mathquill-rendered-math .selectable {
+  -webkit-user-select: text;
+  -moz-user-select: text;
+  user-select: text;
+  position: absolute;
+  clip: rect(1em 1em 1em 1em);
+}
+.mathquill-rendered-math .matrixed {
+  background: white;
+  display: -moz-inline-box;
+  display: inline-block;
+}
+.mathquill-rendered-math .matrixed-container {
+  filter: progid:DXImageTransform.Microsoft.Chroma(color='white');
+  margin-top: -0.1em;
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.js
new file mode 100644
index 0000000..5c8b991
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.js
@@ -0,0 +1,3888 @@
+/**
+ * Copyleft 2010-2011 Jay and Han (laughinghan@gmail.com)
+ *   under the GNU Lesser General Public License
+ *     http://www.gnu.org/licenses/lgpl.html
+ * Project Website: http://mathquill.com
+ */
+
+(function() {
+
+var jQuery = window.jQuery,
+  undefined,
+  _, //temp variable of prototypes
+  mqCmdId = 'mathquill-command-id',
+  mqBlockId = 'mathquill-block-id',
+  min = Math.min,
+  max = Math.max;
+
+var __slice = [].slice;
+
+function noop() {}
+
+/**
+ * sugar to make defining lots of commands easier.
+ * TODO: rethink this.
+ */
+function bind(cons /*, args... */) {
+  var args = __slice.call(arguments, 1);
+  return function() {
+    return cons.apply(this, args);
+  };
+}
+
+/**
+ * a development-only debug method.  This definition and all
+ * calls to `pray` will be stripped from the minified
+ * build of mathquill.
+ *
+ * This function must be called by name to be removed
+ * at compile time.  Do not define another function
+ * with the same name, and only call this function by
+ * name.
+ */
+function pray(message, cond) {
+  if (!cond) throw new Error('prayer failed: '+message);
+}
+var P = (function(prototype, ownProperty, undefined) {
+  // helper functions that also help minification
+  function isObject(o) { return typeof o === 'object'; }
+  function isFunction(f) { return typeof f === 'function'; }
+
+  // a function that gets reused to make uninitialized objects
+  function BareConstructor() {}
+
+  function P(_superclass /* = Object */, definition) {
+    // handle the case where no superclass is given
+    if (definition === undefined) {
+      definition = _superclass;
+      _superclass = Object;
+    }
+
+    // C is the class to be returned.
+    //
+    // It delegates to instantiating an instance of `Bare`, so that it
+    // will always return a new instance regardless of the calling
+    // context.
+    //
+    //  TODO: the Chrome inspector shows all created objects as `C`
+    //        rather than `Object`.  Setting the .name property seems to
+    //        have no effect.  Is there a way to override this behavior?
+    function C() {
+      var self = new Bare;
+      if (isFunction(self.init)) self.init.apply(self, arguments);
+      return self;
+    }
+
+    // C.Bare is a class with a noop constructor.  Its prototype is the
+    // same as C, so that instances of C.Bare are also instances of C.
+    // New objects can be allocated without initialization by calling
+    // `new MyClass.Bare`.
+    function Bare() {}
+    C.Bare = Bare;
+
+    // Set up the prototype of the new class.
+    var _super = BareConstructor[prototype] = _superclass[prototype];
+    var proto = Bare[prototype] = C[prototype] = new BareConstructor;
+
+    // other variables, as a minifier optimization
+    var extensions;
+
+
+    // set the constructor property on the prototype, for convenience
+    proto.constructor = C;
+
+    C.mixin = function(def) {
+      Bare[prototype] = C[prototype] = P(C, def)[prototype];
+      return C;
+    }
+
+    return (C.open = function(def) {
+      extensions = {};
+
+      if (isFunction(def)) {
+        // call the defining function with all the arguments you need
+        // extensions captures the return value.
+        extensions = def.call(C, proto, _super, C, _superclass);
+      }
+      else if (isObject(def)) {
+        // if you passed an object instead, we'll take it
+        extensions = def;
+      }
+
+      // ...and extend it
+      if (isObject(extensions)) {
+        for (var ext in extensions) {
+          if (ownProperty.call(extensions, ext)) {
+            proto[ext] = extensions[ext];
+          }
+        }
+      }
+
+      // if there's no init, we assume we're inheriting a non-pjs class, so
+      // we default to applying the superclass's constructor.
+      if (!isFunction(proto.init)) {
+        proto.init = _superclass;
+      }
+
+      return C;
+    })(definition);
+  }
+
+  // ship it
+  return P;
+
+  // as a minifier optimization, we've closured in a few helper functions
+  // and the string 'prototype' (C[p] is much shorter than C.prototype)
+})('prototype', ({}).hasOwnProperty);
+/*************************************************
+ * Textarea Manager
+ *
+ * An abstraction layer wrapping the textarea in
+ * an object with methods to manipulate and listen
+ * to events on, that hides all the nasty cross-
+ * browser incompatibilities behind a uniform API.
+ *
+ * Design goal: This is a *HARD* internal
+ * abstraction barrier. Cross-browser
+ * inconsistencies are not allowed to leak through
+ * and be dealt with by event handlers. All future
+ * cross-browser issues that arise must be dealt
+ * with here, and if necessary, the API updated.
+ *
+ * Organization:
+ * - key values map and stringify()
+ * - manageTextarea()
+ *    + defer() and flush()
+ *    + event handler logic
+ *    + attach event handlers and export methods
+ ************************************************/
+
+var manageTextarea = (function() {
+  // The following [key values][1] map was compiled from the
+  // [DOM3 Events appendix section on key codes][2] and
+  // [a widely cited report on cross-browser tests of key codes][3],
+  // except for 10: 'Enter', which I've empirically observed in Safari on iOS
+  // and doesn't appear to conflict with any other known key codes.
+  //
+  // [1]: http://www.w3.org/TR/2012/WD-DOM-Level-3-Events-20120614/#keys-keyvalues
+  // [2]: http://www.w3.org/TR/2012/WD-DOM-Level-3-Events-20120614/#fixed-virtual-key-codes
+  // [3]: http://unixpapa.com/js/key.html
+  var KEY_VALUES = {
+    8: 'Backspace',
+    9: 'Tab',
+
+    10: 'Enter', // for Safari on iOS
+
+    13: 'Enter',
+
+    16: 'Shift',
+    17: 'Control',
+    18: 'Alt',
+    20: 'CapsLock',
+
+    27: 'Esc',
+
+    32: 'Spacebar',
+
+    33: 'PageUp',
+    34: 'PageDown',
+    35: 'End',
+    36: 'Home',
+
+    37: 'Left',
+    38: 'Up',
+    39: 'Right',
+    40: 'Down',
+
+    45: 'Insert',
+
+    46: 'Del',
+
+    144: 'NumLock'
+  };
+
+  // To the extent possible, create a normalized string representation
+  // of the key combo (i.e., key code and modifier keys).
+  function stringify(evt) {
+    var which = evt.which || evt.keyCode;
+    var keyVal = KEY_VALUES[which];
+    var key;
+    var modifiers = [];
+
+    if (evt.ctrlKey) modifiers.push('Ctrl');
+    if (evt.originalEvent && evt.originalEvent.metaKey) modifiers.push('Meta');
+    if (evt.altKey) modifiers.push('Alt');
+    if (evt.shiftKey) modifiers.push('Shift');
+
+    key = keyVal || String.fromCharCode(which);
+
+    if (!modifiers.length && !keyVal) return key;
+
+    modifiers.push(key);
+    return modifiers.join('-');
+  }
+
+  // create a textarea manager that calls callbacks at useful times
+  // and exports useful public methods
+  return function manageTextarea(el, opts) {
+    var keydown = null;
+    var keypress = null;
+
+    if (!opts) opts = {};
+    var textCallback = opts.text || noop;
+    var keyCallback = opts.key || noop;
+    var pasteCallback = opts.paste || noop;
+    var onCut = opts.cut || noop;
+
+    var textarea = jQuery(el);
+    var target = jQuery(opts.container || textarea);
+
+    // checkTextareaFor() is called after keypress or paste events to
+    // say "Hey, I think something was just typed" or "pasted" (resp.),
+    // so that at all subsequent opportune times (next event or timeout),
+    // will check for expected typed or pasted text.
+    // Need to check repeatedly because #135: in Safari 5.1 (at least),
+    // after selecting something and then typing, the textarea is
+    // incorrectly reported as selected during the input event (but not
+    // subsequently).
+    var checkTextarea = noop, timeoutId;
+    function checkTextareaFor(checker) {
+      checkTextarea = checker;
+      clearTimeout(timeoutId);
+      timeoutId = setTimeout(checker);
+    }
+    target.bind('keydown keypress input keyup focusout paste', function() { checkTextarea(); });
+
+
+    // -*- public methods -*- //
+    function select(text) {
+      // check textarea at least once/one last time before munging (so
+      // no race condition if selection happens after keypress/paste but
+      // before checkTextarea), then never again ('cos it's been munged)
+      checkTextarea();
+      checkTextarea = noop;
+      clearTimeout(timeoutId);
+
+      textarea.val(text);
+      if (text) textarea[0].select();
+    }
+
+    // -*- helper subroutines -*- //
+
+    // Determine whether there's a selection in the textarea.
+    // This will always return false in IE < 9, which don't support
+    // HTMLTextareaElement::selection{Start,End}.
+    function hasSelection() {
+      var dom = textarea[0];
+
+      if (!('selectionStart' in dom)) return false;
+      return dom.selectionStart !== dom.selectionEnd;
+    }
+
+    function popText(callback) {
+      var text = textarea.val();
+      textarea.val('');
+      if (text) callback(text);
+    }
+
+    function handleKey() {
+      keyCallback(stringify(keydown), keydown);
+    }
+
+    // -*- event handlers -*- //
+    function onKeydown(e) {
+      keydown = e;
+      keypress = null;
+
+      handleKey();
+    }
+
+    function onKeypress(e) {
+      // call the key handler for repeated keypresses.
+      // This excludes keypresses that happen directly
+      // after keydown.  In that case, there will be
+      // no previous keypress, so we skip it here
+      if (keydown && keypress) handleKey();
+
+      keypress = e;
+
+      checkTextareaFor(typedText);
+    }
+    function typedText() {
+      // If there is a selection, the contents of the textarea couldn't
+      // possibly have just been typed in.
+      // This happens in browsers like Firefox and Opera that fire
+      // keypress for keystrokes that are not text entry and leave the
+      // selection in the textarea alone, such as Ctrl-C.
+      // Note: we assume that browsers that don't support hasSelection()
+      // also never fire keypress on keystrokes that are not text entry.
+      // This seems reasonably safe because:
+      // - all modern browsers including IE 9+ support hasSelection(),
+      //   making it extremely unlikely any browser besides IE < 9 won't
+      // - as far as we know IE < 9 never fires keypress on keystrokes
+      //   that aren't text entry, which is only as reliable as our
+      //   tests are comprehensive, but the IE < 9 way to do
+      //   hasSelection() is poorly documented and is also only as
+      //   reliable as our tests are comprehensive
+      // If anything like #40 or #71 is reported in IE < 9, see
+      // b1318e5349160b665003e36d4eedd64101ceacd8
+      if (hasSelection()) return;
+
+      popText(textCallback);
+    }
+
+    function onBlur() { keydown = keypress = null; }
+
+    function onPaste(e) {
+      // browsers are dumb.
+      //
+      // In Linux, middle-click pasting causes onPaste to be called,
+      // when the textarea is not necessarily focused.  We focus it
+      // here to ensure that the pasted text actually ends up in the
+      // textarea.
+      //
+      // It's pretty nifty that by changing focus in this handler,
+      // we can change the target of the default action.  (This works
+      // on keydown too, FWIW).
+      //
+      // And by nifty, we mean dumb (but useful sometimes).
+      textarea.focus();
+
+      checkTextareaFor(pastedText);
+    }
+    function pastedText() {
+      popText(pasteCallback);
+    }
+
+    // -*- attach event handlers -*- //
+    target.bind({
+      keydown: onKeydown,
+      keypress: onKeypress,
+      focusout: onBlur,
+      cut: onCut,
+      paste: onPaste
+    });
+
+    // -*- export public methods -*- //
+    return {
+      select: select
+    };
+  };
+}());
+var Parser = P(function(_, _super, Parser) {
+  // The Parser object is a wrapper for a parser function.
+  // Externally, you use one to parse a string by calling
+  //   var result = SomeParser.parse('Me Me Me! Parse Me!');
+  // You should never call the constructor, rather you should
+  // construct your Parser from the base parsers and the
+  // parser combinator methods.
+
+  function parseError(stream, message) {
+    if (stream) {
+      stream = "'"+stream+"'";
+    }
+    else {
+      stream = 'EOF';
+    }
+
+    throw 'Parse Error: '+message+' at '+stream;
+  }
+
+  _.init = function(body) { this._ = body; };
+
+  _.parse = function(stream) {
+    return this.skip(eof)._(stream, success, parseError);
+
+    function success(stream, result) { return result; }
+  };
+
+  // -*- primitive combinators -*- //
+  _.or = function(alternative) {
+    pray('or is passed a parser', alternative instanceof Parser);
+
+    var self = this;
+
+    return Parser(function(stream, onSuccess, onFailure) {
+      return self._(stream, onSuccess, failure);
+
+      function failure(newStream) {
+        return alternative._(stream, onSuccess, onFailure);
+      }
+    });
+  };
+
+  _.then = function(next) {
+    var self = this;
+
+    return Parser(function(stream, onSuccess, onFailure) {
+      return self._(stream, success, onFailure);
+
+      function success(newStream, result) {
+        var nextParser = (next instanceof Parser ? next : next(result));
+        pray('a parser is returned', nextParser instanceof Parser);
+        return nextParser._(newStream, onSuccess, onFailure);
+      }
+    });
+  };
+
+  // -*- optimized iterative combinators -*- //
+  _.many = function() {
+    var self = this;
+
+    return Parser(function(stream, onSuccess, onFailure) {
+      var xs = [];
+      while (self._(stream, success, failure));
+      return onSuccess(stream, xs);
+
+      function success(newStream, x) {
+        stream = newStream;
+        xs.push(x);
+        return true;
+      }
+
+      function failure() {
+        return false;
+      }
+    });
+  };
+
+  _.times = function(min, max) {
+    if (arguments.length < 2) max = min;
+    var self = this;
+
+    return Parser(function(stream, onSuccess, onFailure) {
+      var xs = [];
+      var result = true;
+      var failure;
+
+      for (var i = 0; i < min; i += 1) {
+        result = self._(stream, success, firstFailure);
+        if (!result) return onFailure(stream, failure);
+      }
+
+      for (; i < max && result; i += 1) {
+        result = self._(stream, success, secondFailure);
+      }
+
+      return onSuccess(stream, xs);
+
+      function success(newStream, x) {
+        xs.push(x);
+        stream = newStream;
+        return true;
+      }
+
+      function firstFailure(newStream, msg) {
+        failure = msg;
+        stream = newStream;
+        return false;
+      }
+
+      function secondFailure(newStream, msg) {
+        return false;
+      }
+    });
+  };
+
+  // -*- higher-level combinators -*- //
+  _.result = function(res) { return this.then(succeed(res)); };
+  _.atMost = function(n) { return this.times(0, n); };
+  _.atLeast = function(n) {
+    var self = this;
+    return self.times(n).then(function(start) {
+      return self.many().map(function(end) {
+        return start.concat(end);
+      });
+    });
+  };
+
+  _.map = function(fn) {
+    return this.then(function(result) { return succeed(fn(result)); });
+  };
+
+  _.skip = function(two) {
+    return this.then(function(result) { return two.result(result); });
+  };
+
+  // -*- primitive parsers -*- //
+  var string = this.string = function(str) {
+    var len = str.length;
+    var expected = "expected '"+str+"'";
+
+    return Parser(function(stream, onSuccess, onFailure) {
+      var head = stream.slice(0, len);
+
+      if (head === str) {
+        return onSuccess(stream.slice(len), head);
+      }
+      else {
+        return onFailure(stream, expected);
+      }
+    });
+  };
+
+  var regex = this.regex = function(re) {
+    pray('regexp parser is anchored', re.toString().charAt(1) === '^');
+
+    var expected = 'expected '+re;
+
+    return Parser(function(stream, onSuccess, onFailure) {
+      var match = re.exec(stream);
+
+      if (match) {
+        var result = match[0];
+        return onSuccess(stream.slice(result.length), result);
+      }
+      else {
+        return onFailure(stream, expected);
+      }
+    });
+  };
+
+  var succeed = Parser.succeed = function(result) {
+    return Parser(function(stream, onSuccess) {
+      return onSuccess(stream, result);
+    });
+  };
+
+  var fail = Parser.fail = function(msg) {
+    return Parser(function(stream, _, onFailure) {
+      return onFailure(stream, msg);
+    });
+  };
+
+  var letter = Parser.letter = regex(/^[a-z]/i);
+  var letters = Parser.letters = regex(/^[a-z]*/i);
+  var digit = Parser.digit = regex(/^[0-9]/);
+  var digits = Parser.digits = regex(/^[0-9]*/);
+  var whitespace = Parser.whitespace = regex(/^\s+/);
+  var optWhitespace = Parser.optWhitespace = regex(/^\s*/);
+
+  var any = Parser.any = Parser(function(stream, onSuccess, onFailure) {
+    if (!stream) return onFailure(stream, 'expected any character');
+
+    return onSuccess(stream.slice(1), stream.charAt(0));
+  });
+
+  var all = Parser.all = Parser(function(stream, onSuccess, onFailure) {
+    return onSuccess('', stream);
+  });
+
+  var eof = Parser.eof = Parser(function(stream, onSuccess, onFailure) {
+    if (stream) return onFailure(stream, 'expected EOF');
+
+    return onSuccess(stream, stream);
+  });
+});
+/*************************************************
+ * Base classes of the MathQuill virtual DOM tree
+ *
+ * Only doing tree node manipulation via these
+ * adopt/ disown methods guarantees well-formedness
+ * of the tree.
+ ************************************************/
+
+// L = 'left'
+// R = 'right'
+//
+// the contract is that they can be used as object properties
+// and (-L) === R, and (-R) === L.
+var L = -1;
+var R = 1;
+
+function prayDirection(dir) {
+  pray('a direction was passed', dir === L || dir === R);
+}
+
+/**
+ * Tiny extension of jQuery adding directionalized DOM manipulation methods.
+ *
+ * Funny how Pjs v3 almost just works with `jQuery.fn.init`.
+ *
+ * jQuery features that don't work on $:
+ *   - jQuery.*, like jQuery.ajax, obviously (Pjs doesn't and shouldn't
+ *                                            copy constructor properties)
+ *
+ *   - jQuery(function), the shortcut for `jQuery(document).ready(function)`,
+ *     because `jQuery.fn.init` is idiosyncratic and Pjs doing, essentially,
+ *     `jQuery.fn.init.apply(this, arguments)` isn't quite right, you need:
+ *
+ *       _.init = function(s, c) { jQuery.fn.init.call(this, s, c, $(document)); };
+ *
+ *     if you actually give a shit (really, don't bother),
+ *     see https://github.com/jquery/jquery/blob/1.7.2/src/core.js#L889
+ *
+ *   - jQuery(selector), because jQuery translates that to
+ *     `jQuery(document).find(selector)`, but Pjs doesn't (should it?) let
+ *     you override the result of a constructor call
+ *       + note that because of the jQuery(document) shortcut-ness, there's also
+ *         the 3rd-argument-needs-to-be-`$(document)` thing above, but the fix
+ *         for that (as can be seen above) is really easy. This problem requires
+ *         a way more intrusive fix
+ *
+ * And that's it! Everything else just magically works because jQuery internally
+ * uses `this.constructor()` everywhere (hence calling `$`), but never ever does
+ * `this.constructor.find` or anything like that, always doing `jQuery.find`.
+ */
+var $ = P(jQuery, function(_) {
+  _.insDirOf = function(dir, el) {
+    return dir === L ?
+      this.insertBefore(el.first()) : this.insertAfter(el.last());
+  };
+  _.insAtDirEnd = function(dir, el) {
+    return dir === L ? this.prependTo(el) : this.appendTo(el);
+  };
+});
+
+var Point = P(function(_) {
+  _.parent = 0;
+  _[L] = 0;
+  _[R] = 0;
+
+  _.init = function(parent, leftward, rightward) {
+    this.parent = parent;
+    this[L] = leftward;
+    this[R] = rightward;
+  };
+});
+
+/**
+ * MathQuill virtual-DOM tree-node abstract base class
+ */
+var Node = P(function(_) {
+  _[L] = 0;
+  _[R] = 0
+  _.parent = 0;
+
+  _.init = function() {
+    this.ends = {};
+    this.ends[L] = 0;
+    this.ends[R] = 0;
+  };
+
+  _.children = function() {
+    return Fragment(this.ends[L], this.ends[R]);
+  };
+
+  _.eachChild = function(fn) {
+    return this.children().each(fn);
+  };
+
+  _.foldChildren = function(fold, fn) {
+    return this.children().fold(fold, fn);
+  };
+
+  _.adopt = function(parent, leftward, rightward) {
+    Fragment(this, this).adopt(parent, leftward, rightward);
+    return this;
+  };
+
+  _.disown = function() {
+    Fragment(this, this).disown();
+    return this;
+  };
+});
+
+/**
+ * An entity outside the virtual tree with one-way pointers (so it's only a
+ * "view" of part of the tree, not an actual node/entity in the tree) that
+ * delimits a doubly-linked list of sibling nodes.
+ * It's like a fanfic love-child between HTML DOM DocumentFragment and the Range
+ * classes: like DocumentFragment, its contents must be sibling nodes
+ * (unlike Range, whose contents are arbitrary contiguous pieces of subtrees),
+ * but like Range, it has only one-way pointers to its contents, its contents
+ * have no reference to it and in fact may still be in the visible tree (unlike
+ * DocumentFragment, whose contents must be detached from the visible tree
+ * and have their 'parent' pointers set to the DocumentFragment).
+ */
+var Fragment = P(function(_) {
+  _.init = function(leftEnd, rightEnd) {
+    pray('no half-empty fragments', !leftEnd === !rightEnd);
+
+    this.ends = {};
+
+    if (!leftEnd) return;
+
+    pray('left end node is passed to Fragment', leftEnd instanceof Node);
+    pray('right end node is passed to Fragment', rightEnd instanceof Node);
+    pray('leftEnd and rightEnd have the same parent',
+         leftEnd.parent === rightEnd.parent);
+
+    this.ends[L] = leftEnd;
+    this.ends[R] = rightEnd;
+  };
+
+  function prayWellFormed(parent, leftward, rightward) {
+    pray('a parent is always present', parent);
+    pray('leftward is properly set up', (function() {
+      // either it's empty and `rightward` is the left end child (possibly empty)
+      if (!leftward) return parent.ends[L] === rightward;
+
+      // or it's there and its [R] and .parent are properly set up
+      return leftward[R] === rightward && leftward.parent === parent;
+    })());
+
+    pray('rightward is properly set up', (function() {
+      // either it's empty and `leftward` is the right end child (possibly empty)
+      if (!rightward) return parent.ends[R] === leftward;
+
+      // or it's there and its [L] and .parent are properly set up
+      return rightward[L] === leftward && rightward.parent === parent;
+    })());
+  }
+
+  _.adopt = function(parent, leftward, rightward) {
+    prayWellFormed(parent, leftward, rightward);
+
+    var self = this;
+    self.disowned = false;
+
+    var leftEnd = self.ends[L];
+    if (!leftEnd) return this;
+
+    var rightEnd = self.ends[R];
+
+    if (leftward) {
+      // NB: this is handled in the ::each() block
+      // leftward[R] = leftEnd
+    } else {
+      parent.ends[L] = leftEnd;
+    }
+
+    if (rightward) {
+      rightward[L] = rightEnd;
+    } else {
+      parent.ends[R] = rightEnd;
+    }
+
+    self.ends[R][R] = rightward;
+
+    self.each(function(el) {
+      el[L] = leftward;
+      el.parent = parent;
+      if (leftward) leftward[R] = el;
+
+      leftward = el;
+    });
+
+    return self;
+  };
+
+  _.disown = function() {
+    var self = this;
+    var leftEnd = self.ends[L];
+
+    // guard for empty and already-disowned fragments
+    if (!leftEnd || self.disowned) return self;
+
+    self.disowned = true;
+
+    var rightEnd = self.ends[R]
+    var parent = leftEnd.parent;
+
+    prayWellFormed(parent, leftEnd[L], leftEnd);
+    prayWellFormed(parent, rightEnd, rightEnd[R]);
+
+    if (leftEnd[L]) {
+      leftEnd[L][R] = rightEnd[R];
+    } else {
+      parent.ends[L] = rightEnd[R];
+    }
+
+    if (rightEnd[R]) {
+      rightEnd[R][L] = leftEnd[L];
+    } else {
+      parent.ends[R] = leftEnd[L];
+    }
+
+    return self;
+  };
+
+  _.each = function(fn) {
+    var self = this;
+    var el = self.ends[L];
+    if (!el) return self;
+
+    for (;el !== self.ends[R][R]; el = el[R]) {
+      if (fn.call(self, el) === false) break;
+    }
+
+    return self;
+  };
+
+  _.fold = function(fold, fn) {
+    this.each(function(el) {
+      fold = fn.call(this, fold, el);
+    });
+
+    return fold;
+  };
+});
+/*************************************************
+ * Abstract classes of math blocks and commands.
+ ************************************************/
+
+var uuid = (function() {
+  var id = 0;
+
+  return function() { return id += 1; };
+})();
+
+/**
+ * Math tree node base class.
+ * Some math-tree-specific extensions to Node.
+ * Both MathBlock's and MathCommand's descend from it.
+ */
+var MathElement = P(Node, function(_, _super) {
+  _.init = function(obj) {
+    _super.init.call(this);
+    this.id = uuid();
+    MathElement[this.id] = this;
+  };
+
+  _.toString = function() {
+    return '[MathElement '+this.id+']';
+  };
+
+  _.bubble = function(event /*, args... */) {
+    var args = __slice.call(arguments, 1);
+
+    for (var ancestor = this; ancestor; ancestor = ancestor.parent) {
+      var res = ancestor[event] && ancestor[event].apply(ancestor, args);
+      if (res === false) break;
+    }
+
+    return this;
+  };
+
+  _.postOrder = function(fn /*, args... */) {
+    var args = __slice.call(arguments, 1);
+
+    if (typeof fn === 'string') {
+      var methodName = fn;
+      fn = function(el) {
+        if (methodName in el) el[methodName].apply(el, args);
+      };
+    }
+
+    (function recurse(desc) {
+      desc.eachChild(recurse);
+      fn(desc);
+    })(this);
+  };
+
+  _.jQ = $();
+  _.jQadd = function(jQ) { this.jQ = this.jQ.add(jQ); };
+
+  this.jQize = function(html) {
+    // Sets the .jQ of the entire math subtree rooted at this command.
+    // Expects .createBlocks() to have been called already, since it
+    // calls .html().
+    var jQ = $(html);
+    jQ.find('*').andSelf().each(function() {
+      var jQ = $(this),
+        cmdId = jQ.attr('mathquill-command-id'),
+        blockId = jQ.attr('mathquill-block-id');
+      if (cmdId) MathElement[cmdId].jQadd(jQ);
+      if (blockId) MathElement[blockId].jQadd(jQ);
+    });
+    return jQ;
+  };
+
+  _.finalizeInsert = function() {
+    var self = this;
+    self.postOrder('finalizeTree');
+
+    // note: this order is important.
+    // empty elements need the empty box provided by blur to
+    // be present in order for their dimensions to be measured
+    // correctly in redraw.
+    self.postOrder('blur');
+
+    // adjust context-sensitive spacing
+    self.postOrder('respace');
+    if (self[R].respace) self[R].respace();
+    if (self[L].respace) self[L].respace();
+
+    self.postOrder('redraw');
+    self.bubble('redraw');
+  };
+});
+
+/**
+ * Commands and operators, like subscripts, exponents, or fractions.
+ * Descendant commands are organized into blocks.
+ */
+var MathCommand = P(MathElement, function(_, _super) {
+  _.init = function(ctrlSeq, htmlTemplate, textTemplate) {
+    var cmd = this;
+    _super.init.call(cmd);
+
+    if (!cmd.ctrlSeq) cmd.ctrlSeq = ctrlSeq;
+    if (htmlTemplate) cmd.htmlTemplate = htmlTemplate;
+    if (textTemplate) cmd.textTemplate = textTemplate;
+  };
+
+  // obvious methods
+  _.replaces = function(replacedFragment) {
+    replacedFragment.disown();
+    this.replacedFragment = replacedFragment;
+  };
+  _.isEmpty = function() {
+    return this.foldChildren(true, function(isEmpty, child) {
+      return isEmpty && child.isEmpty();
+    });
+  };
+
+  _.parser = function() {
+    var block = latexMathParser.block;
+    var self = this;
+
+    return block.times(self.numBlocks()).map(function(blocks) {
+      self.blocks = blocks;
+
+      for (var i = 0; i < blocks.length; i += 1) {
+        blocks[i].adopt(self, self.ends[R], 0);
+      }
+
+      return self;
+    });
+  };
+
+  // createLeftOf(cursor) and the methods it calls
+  _.createLeftOf = function(cursor) {
+    var cmd = this;
+    var replacedFragment = cmd.replacedFragment;
+
+    cmd.createBlocks();
+    MathElement.jQize(cmd.html());
+    if (replacedFragment) {
+      replacedFragment.adopt(cmd.ends[L], 0, 0);
+      replacedFragment.jQ.appendTo(cmd.ends[L].jQ);
+    }
+
+    cursor.jQ.before(cmd.jQ);
+    cursor[L] = cmd.adopt(cursor.parent, cursor[L], cursor[R]);
+
+    cmd.finalizeInsert(cursor);
+
+    cmd.placeCursor(cursor);
+  };
+  _.createBlocks = function() {
+    var cmd = this,
+      numBlocks = cmd.numBlocks(),
+      blocks = cmd.blocks = Array(numBlocks);
+
+    for (var i = 0; i < numBlocks; i += 1) {
+      var newBlock = blocks[i] = MathBlock();
+      newBlock.adopt(cmd, cmd.ends[R], 0);
+    }
+  };
+  _.respace = noop; //placeholder for context-sensitive spacing
+  _.placeCursor = function(cursor) {
+    //insert the cursor at the right end of the first empty child, searching
+    //left-to-right, or if none empty, the right end child
+    cursor.insAtRightEnd(this.foldChildren(this.ends[L], function(leftward, child) {
+      return leftward.isEmpty() ? leftward : child;
+    }));
+  };
+
+  // remove()
+  _.remove = function() {
+    this.disown();
+    this.jQ.remove();
+
+    this.postOrder(function(el) { delete MathElement[el.id]; });
+
+    return this;
+  };
+
+  // methods involved in creating and cross-linking with HTML DOM nodes
+  /*
+    They all expect an .htmlTemplate like
+      '<span>&0</span>'
+    or
+      '<span><span>&0</span><span>&1</span></span>'
+
+    See html.test.js for more examples.
+
+    Requirements:
+    - For each block of the command, there must be exactly one "block content
+      marker" of the form '&<number>' where <number> is the 0-based index of the
+      block. (Like the LaTeX \newcommand syntax, but with a 0-based rather than
+      1-based index, because JavaScript because C because Dijkstra.)
+    - The block content marker must be the sole contents of the containing
+      element, there can't even be surrounding whitespace, or else we can't
+      guarantee sticking to within the bounds of the block content marker when
+      mucking with the HTML DOM.
+    - The HTML not only must be well-formed HTML (of course), but also must
+      conform to the XHTML requirements on tags, specifically all tags must
+      either be self-closing (like '<br/>') or come in matching pairs.
+      Close tags are never optional.
+
+    Note that &<number> isn't well-formed HTML; if you wanted a literal '&123',
+    your HTML template would have to have '&amp;123'.
+  */
+  _.numBlocks = function() {
+    var matches = this.htmlTemplate.match(/&\d+/g);
+    return matches ? matches.length : 0;
+  };
+  _.html = function() {
+    // Render the entire math subtree rooted at this command, as HTML.
+    // Expects .createBlocks() to have been called already, since it uses the
+    // .blocks array of child blocks.
+    //
+    // See html.test.js for example templates and intended outputs.
+    //
+    // Given an .htmlTemplate as described above,
+    // - insert the mathquill-command-id attribute into all top-level tags,
+    //   which will be used to set this.jQ in .jQize().
+    //   This is straightforward:
+    //     * tokenize into tags and non-tags
+    //     * loop through top-level tokens:
+    //         * add #cmdId attribute macro to top-level self-closing tags
+    //         * else add #cmdId attribute macro to top-level open tags
+    //             * skip the matching top-level close tag and all tag pairs
+    //               in between
+    // - for each block content marker,
+    //     + replace it with the contents of the corresponding block,
+    //       rendered as HTML
+    //     + insert the mathquill-block-id attribute into the containing tag
+    //   This is even easier, a quick regex replace, since block tags cannot
+    //   contain anything besides the block content marker.
+    //
+    // Two notes:
+    // - The outermost loop through top-level tokens should never encounter any
+    //   top-level close tags, because we should have first encountered a
+    //   matching top-level open tag, all inner tags should have appeared in
+    //   matching pairs and been skipped, and then we should have skipped the
+    //   close tag in question.
+    // - All open tags should have matching close tags, which means our inner
+    //   loop should always encounter a close tag and drop nesting to 0. If
+    //   a close tag is missing, the loop will continue until i >= tokens.length
+    //   and token becomes undefined. This will not infinite loop, even in
+    //   production without pray(), because it will then TypeError on .slice().
+
+    var cmd = this;
+    var blocks = cmd.blocks;
+    var cmdId = ' mathquill-command-id=' + cmd.id;
+    var tokens = cmd.htmlTemplate.match(/<[^<>]+>|[^<>]+/g);
+
+    pray('no unmatched angle brackets', tokens.join('') === this.htmlTemplate);
+
+    // add cmdId to all top-level tags
+    for (var i = 0, token = tokens[0]; token; i += 1, token = tokens[i]) {
+      // top-level self-closing tags
+      if (token.slice(-2) === '/>') {
+        tokens[i] = token.slice(0,-2) + cmdId + '/>';
+      }
+      // top-level open tags
+      else if (token.charAt(0) === '<') {
+        pray('not an unmatched top-level close tag', token.charAt(1) !== '/');
+
+        tokens[i] = token.slice(0,-1) + cmdId + '>';
+
+        // skip matching top-level close tag and all tag pairs in between
+        var nesting = 1;
+        do {
+          i += 1, token = tokens[i];
+          pray('no missing close tags', token);
+          // close tags
+          if (token.slice(0,2) === '</') {
+            nesting -= 1;
+          }
+          // non-self-closing open tags
+          else if (token.charAt(0) === '<' && token.slice(-2) !== '/>') {
+            nesting += 1;
+          }
+        } while (nesting > 0);
+      }
+    }
+    return tokens.join('').replace(/>&(\d+)/g, function($0, $1) {
+      return ' mathquill-block-id=' + blocks[$1].id + '>' + blocks[$1].join('html');
+    });
+  };
+
+  // methods to export a string representation of the math tree
+  _.latex = function() {
+    return this.foldChildren(this.ctrlSeq, function(latex, child) {
+      return latex + '{' + (child.latex() || ' ') + '}';
+    });
+  };
+  _.textTemplate = [''];
+  _.text = function() {
+    var cmd = this, i = 0;
+    return cmd.foldChildren(cmd.textTemplate[i], function(text, child) {
+      i += 1;
+      var child_text = child.text();
+      if (text && cmd.textTemplate[i] === '('
+          && child_text[0] === '(' && child_text.slice(-1) === ')')
+        return text + child_text.slice(1, -1) + cmd.textTemplate[i];
+      return text + child.text() + (cmd.textTemplate[i] || '');
+    });
+  };
+});
+
+/**
+ * Lightweight command without blocks or children.
+ */
+var Symbol = P(MathCommand, function(_, _super) {
+  _.init = function(ctrlSeq, html, text) {
+    if (!text) text = ctrlSeq && ctrlSeq.length > 1 ? ctrlSeq.slice(1) : ctrlSeq;
+
+    _super.init.call(this, ctrlSeq, html, [ text ]);
+  };
+
+  _.parser = function() { return Parser.succeed(this); };
+  _.numBlocks = function() { return 0; };
+
+  _.replaces = function(replacedFragment) {
+    replacedFragment.remove();
+  };
+  _.createBlocks = noop;
+  _.latex = function(){ return this.ctrlSeq; };
+  _.text = function(){ return this.textTemplate; };
+  _.placeCursor = noop;
+  _.isEmpty = function(){ return true; };
+});
+
+/**
+ * Children and parent of MathCommand's. Basically partitions all the
+ * symbols and operators that descend (in the Math DOM tree) from
+ * ancestor operators.
+ */
+var MathBlock = P(MathElement, function(_) {
+  _.join = function(methodName) {
+    return this.foldChildren('', function(fold, child) {
+      return fold + child[methodName]();
+    });
+  };
+  _.latex = function() { return this.join('latex'); };
+  _.text = function() {
+    return this.ends[L] === this.ends[R] ?
+      this.ends[L].text() :
+      '(' + this.join('text') + ')'
+    ;
+  };
+  _.isEmpty = function() {
+    return this.ends[L] === 0 && this.ends[R] === 0;
+  };
+  _.write = function(cursor, ch, replacedFragment) {
+    var cmd;
+    if (ch.match(/^[a-eg-zA-Z]$/)) //exclude f because want florin
+      cmd = Variable(ch);
+    else if (cmd = CharCmds[ch] || LatexCmds[ch])
+      cmd = cmd(ch);
+    else
+      cmd = VanillaSymbol(ch);
+
+    if (replacedFragment) cmd.replaces(replacedFragment);
+
+    cmd.createLeftOf(cursor);
+  };
+  _.focus = function() {
+    this.jQ.addClass('hasCursor');
+    this.jQ.removeClass('empty');
+
+    return this;
+  };
+  _.blur = function() {
+    this.jQ.removeClass('hasCursor');
+    if (this.isEmpty())
+      this.jQ.addClass('empty');
+
+    return this;
+  };
+});
+
+/**
+ * Math tree fragment base class.
+ * Some math-tree-specific extensions to Fragment.
+ */
+var MathFragment = P(Fragment, function(_, _super) {
+  _.init = function(leftEnd, rightEnd) {
+    // just select one thing if only one argument
+    _super.init.call(this, leftEnd, rightEnd || leftEnd);
+    this.jQ = this.fold($(), function(jQ, child){ return child.jQ.add(jQ); });
+  };
+  _.latex = function() {
+    return this.fold('', function(latex, el){ return latex + el.latex(); });
+  };
+  _.remove = function() {
+    this.jQ.remove();
+
+    this.each(function(el) {
+      el.postOrder(function(desc) {
+        delete MathElement[desc.id];
+      });
+    });
+
+    return this.disown();
+  };
+});
+/*********************************************
+ * Root math elements with event delegation.
+ ********************************************/
+
+function createRoot(jQ, root, textbox, editable) {
+  var contents = jQ.contents().detach();
+
+  if (!textbox) {
+    jQ.addClass('mathquill-rendered-math');
+  }
+
+  root.jQ = jQ.attr(mqBlockId, root.id);
+  root.revert = function() {
+    jQ.empty().unbind('.mathquill')
+      .removeClass('mathquill-rendered-math mathquill-editable mathquill-textbox')
+      .append(contents);
+  };
+
+  var cursor = root.cursor = Cursor(root);
+
+  root.renderLatex(contents.text());
+
+  //textarea stuff
+  var textareaSpan = root.textarea = $('<span class="textarea"><textarea></textarea></span>'),
+    textarea = textareaSpan.children();
+
+  /******
+   * TODO [Han]: Document this
+   */
+  var textareaSelectionTimeout;
+  root.selectionChanged = function() {
+    if (textareaSelectionTimeout === undefined) {
+      textareaSelectionTimeout = setTimeout(setTextareaSelection);
+    }
+    forceIERedraw(jQ[0]);
+  };
+  function setTextareaSelection() {
+    textareaSelectionTimeout = undefined;
+    var latex = cursor.selection ? '$'+cursor.selection.latex()+'$' : '';
+    textareaManager.select(latex);
+  }
+
+  //prevent native selection except textarea
+  jQ.bind('selectstart.mathquill', function(e) {
+    if (e.target !== textarea[0]) e.preventDefault();
+    e.stopPropagation();
+  });
+
+  //drag-to-select event handling
+  var anticursor, blink = cursor.blink;
+  jQ.bind('mousedown.mathquill', function(e) {
+    function mousemove(e) {
+      cursor.seek($(e.target), e.pageX, e.pageY);
+
+      if (cursor[L] !== anticursor[L]
+          || cursor.parent !== anticursor.parent) {
+        cursor.selectFrom(anticursor);
+      }
+
+      return false;
+    }
+
+    // docmousemove is attached to the document, so that
+    // selection still works when the mouse leaves the window.
+    function docmousemove(e) {
+      // [Han]: i delete the target because of the way seek works.
+      // it will not move the mouse to the target, but will instead
+      // just seek those X and Y coordinates.  If there is a target,
+      // it will try to move the cursor to document, which will not work.
+      // cursor.seek needs to be refactored.
+      delete e.target;
+
+      return mousemove(e);
+    }
+
+    function mouseup(e) {
+      anticursor = undefined;
+      cursor.blink = blink;
+      if (!cursor.selection) {
+        if (editable) {
+          cursor.show();
+        }
+        else {
+          textareaSpan.detach();
+        }
+      }
+
+      // delete the mouse handlers now that we're not dragging anymore
+      jQ.unbind('mousemove', mousemove);
+      $(e.target.ownerDocument).unbind('mousemove', docmousemove).unbind('mouseup', mouseup);
+    }
+
+    setTimeout(function() { textarea.focus(); });
+      // preventDefault won't prevent focus on mousedown in IE<9
+      // that means immediately after this mousedown, whatever was
+      // mousedown-ed will receive focus
+      // http://bugs.jquery.com/ticket/10345
+
+    cursor.blink = noop;
+    cursor.seek($(e.target), e.pageX, e.pageY);
+
+    anticursor = Point(cursor.parent, cursor[L], cursor[R]);
+
+    if (!editable) jQ.prepend(textareaSpan);
+
+    jQ.mousemove(mousemove);
+    $(e.target.ownerDocument).mousemove(docmousemove).mouseup(mouseup);
+
+    return false;
+  });
+
+  if (!editable) {
+    var textareaManager = manageTextarea(textarea, { container: jQ });
+    jQ.bind('cut paste', false).bind('copy', setTextareaSelection)
+      .prepend('<span class="selectable">$'+root.latex()+'$</span>');
+    textarea.blur(function() {
+      cursor.clearSelection();
+      setTimeout(detach); //detaching during blur explodes in WebKit
+    });
+    function detach() {
+      textareaSpan.detach();
+    }
+    return;
+  }
+
+  var textareaManager = manageTextarea(textarea, {
+    container: jQ,
+    key: function(key, evt) {
+      cursor.parent.bubble('onKey', key, evt);
+    },
+    text: function(text) {
+      cursor.parent.bubble('onText', text);
+    },
+    cut: function(e) {
+      if (cursor.selection) {
+        setTimeout(function() {
+          cursor.prepareEdit();
+          cursor.parent.bubble('redraw');
+        });
+      }
+
+      e.stopPropagation();
+    },
+    paste: function(text) {
+      // FIXME HACK the parser in RootTextBlock needs to be moved to
+      // Cursor::writeLatex or something so this'll work with
+      // MathQuill textboxes
+      if (text.slice(0,1) === '$' && text.slice(-1) === '$') {
+        text = text.slice(1, -1);
+      }
+      else {
+        text = '\\text{' + text + '}';
+      }
+
+      cursor.writeLatex(text).show();
+    }
+  });
+
+  jQ.prepend(textareaSpan);
+
+  //root CSS classes
+  jQ.addClass('mathquill-editable');
+  if (textbox)
+    jQ.addClass('mathquill-textbox');
+
+  //focus and blur handling
+  textarea.focus(function(e) {
+    if (!cursor.parent)
+      cursor.insAtRightEnd(root);
+    cursor.parent.jQ.addClass('hasCursor');
+    if (cursor.selection) {
+      cursor.selection.jQ.removeClass('blur');
+      setTimeout(root.selectionChanged); //re-select textarea contents after tabbing away and back
+    }
+    else
+      cursor.show();
+    e.stopPropagation();
+  }).blur(function(e) {
+    cursor.hide().parent.blur();
+    if (cursor.selection)
+      cursor.selection.jQ.addClass('blur');
+    e.stopPropagation();
+  });
+
+  jQ.bind('focus.mathquill blur.mathquill', function(e) {
+    textarea.trigger(e);
+  }).blur();
+}
+
+var RootMathBlock = P(MathBlock, function(_, _super) {
+  _.latex = function() {
+    return _super.latex.call(this).replace(/(\\[a-z]+) (?![a-z])/ig,'$1');
+  };
+  _.text = function() {
+    return this.foldChildren('', function(text, child) {
+      return text + child.text();
+    });
+  };
+  _.renderLatex = function(latex) {
+    var jQ = this.jQ;
+
+    jQ.children().slice(1).remove();
+    this.ends[L] = this.ends[R] = 0;
+
+    delete this.cursor.selection;
+    this.cursor.insAtRightEnd(this).writeLatex(latex);
+  };
+  _.onKey = function(key, e) {
+    switch (key) {
+    case 'Ctrl-Shift-Backspace':
+    case 'Ctrl-Backspace':
+      while (this.cursor[L] || this.cursor.selection) {
+        this.cursor.backspace();
+      }
+      break;
+
+    case 'Shift-Backspace':
+    case 'Backspace':
+      this.cursor.backspace();
+      break;
+
+    // Tab or Esc -> go one block right if it exists, else escape right.
+    case 'Esc':
+    case 'Tab':
+    case 'Spacebar':
+      var parent = this.cursor.parent;
+      // cursor is in root editable, continue default
+      if (parent === this.cursor.root) {
+        if (key === 'Spacebar') e.preventDefault();
+        return;
+      }
+
+      this.cursor.prepareMove();
+      if (parent[R]) {
+        // go one block right
+        this.cursor.insAtLeftEnd(parent[R]);
+      } else {
+        // get out of the block
+        this.cursor.insRightOf(parent.parent);
+      }
+      break;
+
+    // Shift-Tab -> go one block left if it exists, else escape left.
+    case 'Shift-Tab':
+    case 'Shift-Esc':
+    case 'Shift-Spacebar':
+      var parent = this.cursor.parent;
+      //cursor is in root editable, continue default
+      if (parent === this.cursor.root) {
+        if (key === 'Shift-Spacebar') e.preventDefault();
+        return;
+      }
+
+      this.cursor.prepareMove();
+      if (parent[L]) {
+        // go one block left
+        this.cursor.insAtRightEnd(parent[L]);
+      } else {
+        //get out of the block
+        this.cursor.insLeftOf(parent.parent);
+      }
+      break;
+
+    // Prevent newlines from showing up
+    case 'Enter': break;
+
+
+    // End -> move to the end of the current block.
+    case 'End':
+      this.cursor.prepareMove().insAtRightEnd(this.cursor.parent);
+      break;
+
+    // Ctrl-End -> move all the way to the end of the root block.
+    case 'Ctrl-End':
+      this.cursor.prepareMove().insAtRightEnd(this);
+      break;
+
+    // Shift-End -> select to the end of the current block.
+    case 'Shift-End':
+      while (this.cursor[R]) {
+        this.cursor.selectRight();
+      }
+      break;
+
+    // Ctrl-Shift-End -> select to the end of the root block.
+    case 'Ctrl-Shift-End':
+      while (this.cursor[R] || this.cursor.parent !== this) {
+        this.cursor.selectRight();
+      }
+      break;
+
+    // Home -> move to the start of the root block or the current block.
+    case 'Home':
+      this.cursor.prepareMove().insAtLeftEnd(this.cursor.parent);
+      break;
+
+    // Ctrl-Home -> move to the start of the current block.
+    case 'Ctrl-Home':
+      this.cursor.prepareMove().insAtLeftEnd(this);
+      break;
+
+    // Shift-Home -> select to the start of the current block.
+    case 'Shift-Home':
+      while (this.cursor[L]) {
+        this.cursor.selectLeft();
+      }
+      break;
+
+    // Ctrl-Shift-Home -> move to the start of the root block.
+    case 'Ctrl-Shift-Home':
+      while (this.cursor[L] || this.cursor.parent !== this) {
+        this.cursor.selectLeft();
+      }
+      break;
+
+    case 'Left': this.cursor.moveLeft(); break;
+    case 'Shift-Left': this.cursor.selectLeft(); break;
+    case 'Ctrl-Left': break;
+
+    case 'Right': this.cursor.moveRight(); break;
+    case 'Shift-Right': this.cursor.selectRight(); break;
+    case 'Ctrl-Right': break;
+
+    case 'Up': this.cursor.moveUp(); break;
+    case 'Down': this.cursor.moveDown(); break;
+
+    case 'Shift-Up':
+      if (this.cursor[L]) {
+        while (this.cursor[L]) this.cursor.selectLeft();
+      } else {
+        this.cursor.selectLeft();
+      }
+
+    case 'Shift-Down':
+      if (this.cursor[R]) {
+        while (this.cursor[R]) this.cursor.selectRight();
+      }
+      else {
+        this.cursor.selectRight();
+      }
+
+    case 'Ctrl-Up': break;
+    case 'Ctrl-Down': break;
+
+    case 'Ctrl-Shift-Del':
+    case 'Ctrl-Del':
+      while (this.cursor[R] || this.cursor.selection) {
+        this.cursor.deleteForward();
+      }
+      break;
+
+    case 'Shift-Del':
+    case 'Del':
+      this.cursor.deleteForward();
+      break;
+
+    case 'Meta-A':
+    case 'Ctrl-A':
+      //so not stopPropagation'd at RootMathCommand
+      if (this !== this.cursor.root) return;
+
+      this.cursor.prepareMove().insAtRightEnd(this);
+      while (this.cursor[L]) this.cursor.selectLeft();
+      break;
+
+    default:
+      return false;
+    }
+    e.preventDefault();
+    return false;
+  };
+  _.onText = function(ch) {
+    this.cursor.write(ch);
+    return false;
+  };
+});
+
+var RootMathCommand = P(MathCommand, function(_, _super) {
+  _.init = function(cursor) {
+    _super.init.call(this, '$');
+    this.cursor = cursor;
+  };
+  _.htmlTemplate = '<span class="mathquill-rendered-math">&0</span>';
+  _.createBlocks = function() {
+    this.ends[L] =
+    this.ends[R] =
+      RootMathBlock();
+
+    this.blocks = [ this.ends[L] ];
+
+    this.ends[L].parent = this;
+
+    this.ends[L].cursor = this.cursor;
+    this.ends[L].write = function(cursor, ch, replacedFragment) {
+      if (ch !== '$')
+        MathBlock.prototype.write.call(this, cursor, ch, replacedFragment);
+      else if (this.isEmpty()) {
+        cursor.insRightOf(this.parent).backspace().show();
+        VanillaSymbol('\\$','$').createLeftOf(cursor);
+      }
+      else if (!cursor[R])
+        cursor.insRightOf(this.parent);
+      else if (!cursor[L])
+        cursor.insLeftOf(this.parent);
+      else
+        MathBlock.prototype.write.call(this, cursor, ch, replacedFragment);
+    };
+  };
+  _.latex = function() {
+    return '$' + this.ends[L].latex() + '$';
+  };
+});
+
+var RootTextBlock = P(MathBlock, function(_) {
+  _.renderLatex = function(latex) {
+    var self = this;
+    var cursor = self.cursor;
+    self.jQ.children().slice(1).remove();
+    self.ends[L] = self.ends[R] = 0;
+    delete cursor.selection;
+    cursor.show().insAtRightEnd(self);
+
+    var regex = Parser.regex;
+    var string = Parser.string;
+    var eof = Parser.eof;
+    var all = Parser.all;
+
+    // Parser RootMathCommand
+    var mathMode = string('$').then(latexMathParser)
+      // because TeX is insane, math mode doesn't necessarily
+      // have to end.  So we allow for the case that math mode
+      // continues to the end of the stream.
+      .skip(string('$').or(eof))
+      .map(function(block) {
+        // HACK FIXME: this shouldn't have to have access to cursor
+        var rootMathCommand = RootMathCommand(cursor);
+
+        rootMathCommand.createBlocks();
+        var rootMathBlock = rootMathCommand.ends[L];
+        block.children().adopt(rootMathBlock, 0, 0);
+
+        return rootMathCommand;
+      })
+    ;
+
+    var escapedDollar = string('\\$').result('$');
+    var textChar = escapedDollar.or(regex(/^[^$]/)).map(VanillaSymbol);
+    var latexText = mathMode.or(textChar).many();
+    var commands = latexText.skip(eof).or(all.result(false)).parse(latex);
+
+    if (commands) {
+      for (var i = 0; i < commands.length; i += 1) {
+        commands[i].adopt(self, self.ends[R], 0);
+      }
+
+      var html = self.join('html');
+      MathElement.jQize(html).appendTo(self.jQ);
+
+      this.finalizeInsert();
+    }
+  };
+  _.onKey = function(key) {
+    if (key === 'Spacebar' || key === 'Shift-Spacebar') return;
+    RootMathBlock.prototype.onKey.apply(this, arguments);
+  };
+  _.onText = RootMathBlock.prototype.onText;
+  _.write = function(cursor, ch, replacedFragment) {
+    if (replacedFragment) replacedFragment.remove();
+    if (ch === '$')
+      RootMathCommand(cursor).createLeftOf(cursor);
+    else {
+      var html;
+      if (ch === '<') html = '&lt;';
+      else if (ch === '>') html = '&gt;';
+      VanillaSymbol(ch, html).createLeftOf(cursor);
+    }
+  };
+});
+/***************************
+ * Commands and Operators.
+ **************************/
+
+var CharCmds = {}, LatexCmds = {}; //single character commands, LaTeX commands
+
+var scale, // = function(jQ, x, y) { ... }
+//will use a CSS 2D transform to scale the jQuery-wrapped HTML elements,
+//or the filter matrix transform fallback for IE 5.5-8, or gracefully degrade to
+//increasing the fontSize to match the vertical Y scaling factor.
+
+//ideas from http://github.com/louisremi/jquery.transform.js
+//see also http://msdn.microsoft.com/en-us/library/ms533014(v=vs.85).aspx
+
+  forceIERedraw = noop,
+  div = document.createElement('div'),
+  div_style = div.style,
+  transformPropNames = {
+    transform:1,
+    WebkitTransform:1,
+    MozTransform:1,
+    OTransform:1,
+    msTransform:1
+  },
+  transformPropName;
+
+for (var prop in transformPropNames) {
+  if (prop in div_style) {
+    transformPropName = prop;
+    break;
+  }
+}
+
+if (transformPropName) {
+  scale = function(jQ, x, y) {
+    jQ.css(transformPropName, 'scale('+x+','+y+')');
+  };
+}
+else if ('filter' in div_style) { //IE 6, 7, & 8 fallback, see https://github.com/laughinghan/mathquill/wiki/Transforms
+  forceIERedraw = function(el){ el.className = el.className; };
+  scale = function(jQ, x, y) { //NOTE: assumes y > x
+    x /= (1+(y-1)/2);
+    jQ.css('fontSize', y + 'em');
+    if (!jQ.hasClass('matrixed-container')) {
+      jQ.addClass('matrixed-container')
+      .wrapInner('<span class="matrixed"></span>');
+    }
+    var innerjQ = jQ.children()
+    .css('filter', 'progid:DXImageTransform.Microsoft'
+        + '.Matrix(M11=' + x + ",SizingMethod='auto expand')"
+    );
+    function calculateMarginRight() {
+      jQ.css('marginRight', (innerjQ.width()-1)*(x-1)/x + 'px');
+    }
+    calculateMarginRight();
+    var intervalId = setInterval(calculateMarginRight);
+    $(window).load(function() {
+      clearTimeout(intervalId);
+      calculateMarginRight();
+    });
+  };
+}
+else {
+  scale = function(jQ, x, y) {
+    jQ.css('fontSize', y + 'em');
+  };
+}
+
+var Style = P(MathCommand, function(_, _super) {
+  _.init = function(ctrlSeq, tagName, attrs) {
+    _super.init.call(this, ctrlSeq, '<'+tagName+' '+attrs+'>&0</'+tagName+'>');
+  };
+});
+
+//fonts
+LatexCmds.mathrm = bind(Style, '\\mathrm', 'span', 'class="roman font"');
+LatexCmds.mathit = bind(Style, '\\mathit', 'i', 'class="font"');
+LatexCmds.mathbf = bind(Style, '\\mathbf', 'b', 'class="font"');
+LatexCmds.mathsf = bind(Style, '\\mathsf', 'span', 'class="sans-serif font"');
+LatexCmds.mathtt = bind(Style, '\\mathtt', 'span', 'class="monospace font"');
+//text-decoration
+LatexCmds.underline = bind(Style, '\\underline', 'span', 'class="non-leaf underline"');
+LatexCmds.overline = LatexCmds.bar = bind(Style, '\\overline', 'span', 'class="non-leaf overline"');
+
+var SupSub = P(MathCommand, function(_, _super) {
+  _.init = function(ctrlSeq, tag, text) {
+    _super.init.call(this, ctrlSeq, '<'+tag+' class="non-leaf">&0</'+tag+'>', [ text ]);
+  };
+  _.finalizeTree = function() {
+    //TODO: use inheritance
+    pray('SupSub is only _ and ^',
+      this.ctrlSeq === '^' || this.ctrlSeq === '_'
+    );
+
+    if (this.ctrlSeq === '_') {
+      this.down = this.ends[L];
+      this.ends[L].up = insLeftOfMeUnlessAtEnd;
+    }
+    else {
+      this.up = this.ends[L];
+      this.ends[L].down = insLeftOfMeUnlessAtEnd;
+    }
+    function insLeftOfMeUnlessAtEnd(cursor) {
+      // cursor.insLeftOf(cmd), unless cursor at the end of block, and every
+      // ancestor cmd is at the end of every ancestor block
+      var cmd = this.parent, ancestorCmd = cursor;
+      do {
+        if (ancestorCmd[R]) {
+          cursor.insLeftOf(cmd);
+          return false;
+        }
+        ancestorCmd = ancestorCmd.parent.parent;
+      } while (ancestorCmd !== cmd);
+      cursor.insRightOf(cmd);
+      return false;
+    }
+  };
+  _.latex = function() {
+    var latex = this.ends[L].latex();
+    if (latex.length === 1)
+      return this.ctrlSeq + latex;
+    else
+      return this.ctrlSeq + '{' + (latex || ' ') + '}';
+  };
+  _.redraw = function() {
+    if (this[L])
+      this[L].respace();
+    //SupSub::respace recursively calls respace on all the following SupSubs
+    //so if leftward is a SupSub, no need to call respace on this or following nodes
+    if (!(this[L] instanceof SupSub)) {
+      this.respace();
+      //and if rightward is a SupSub, then this.respace() will have already called
+      //this[R].respace()
+      if (this[R] && !(this[R] instanceof SupSub))
+        this[R].respace();
+    }
+  };
+  _.respace = function() {
+    if (
+      this[L].ctrlSeq === '\\int ' || (
+        this[L] instanceof SupSub && this[L].ctrlSeq != this.ctrlSeq
+        && this[L][L] && this[L][L].ctrlSeq === '\\int '
+      )
+    ) {
+      if (!this.limit) {
+        this.limit = true;
+        this.jQ.addClass('limit');
+      }
+    }
+    else {
+      if (this.limit) {
+        this.limit = false;
+        this.jQ.removeClass('limit');
+      }
+    }
+
+    this.respaced = this[L] instanceof SupSub && this[L].ctrlSeq != this.ctrlSeq && !this[L].respaced;
+    if (this.respaced) {
+      var fontSize = +this.jQ.css('fontSize').slice(0,-2),
+        leftWidth = this[L].jQ.outerWidth(),
+        thisWidth = this.jQ.outerWidth();
+      this.jQ.css({
+        left: (this.limit && this.ctrlSeq === '_' ? -.25 : 0) - leftWidth/fontSize + 'em',
+        marginRight: .1 - min(thisWidth, leftWidth)/fontSize + 'em'
+          //1px extra so it doesn't wrap in retarded browsers (Firefox 2, I think)
+      });
+    }
+    else if (this.limit && this.ctrlSeq === '_') {
+      this.jQ.css({
+        left: '-.25em',
+        marginRight: ''
+      });
+    }
+    else {
+      this.jQ.css({
+        left: '',
+        marginRight: ''
+      });
+    }
+
+    if (this[R] instanceof SupSub)
+      this[R].respace();
+
+    return this;
+  };
+});
+
+LatexCmds.subscript =
+LatexCmds._ = bind(SupSub, '_', 'sub', '_');
+
+LatexCmds.superscript =
+LatexCmds.supscript =
+LatexCmds['^'] = bind(SupSub, '^', 'sup', '**');
+
+var Fraction =
+LatexCmds.frac =
+LatexCmds.dfrac =
+LatexCmds.cfrac =
+LatexCmds.fraction = P(MathCommand, function(_, _super) {
+  _.ctrlSeq = '\\frac';
+  _.htmlTemplate =
+      '<span class="fraction non-leaf">'
+    +   '<span class="numerator">&0</span>'
+    +   '<span class="denominator">&1</span>'
+    +   '<span style="display:inline-block;width:0">&nbsp;</span>'
+    + '</span>'
+  ;
+  _.textTemplate = ['(', '/', ')'];
+  _.finalizeTree = function() {
+    this.up = this.ends[R].up = this.ends[L];
+    this.down = this.ends[L].down = this.ends[R];
+  };
+});
+
+var LiveFraction =
+LatexCmds.over =
+CharCmds['/'] = P(Fraction, function(_, _super) {
+  _.createLeftOf = function(cursor) {
+    if (!this.replacedFragment) {
+      var leftward = cursor[L];
+      while (leftward &&
+        !(
+          leftward instanceof BinaryOperator ||
+          leftward instanceof TextBlock ||
+          leftward instanceof BigSymbol ||
+          ',;:'.split('').indexOf(leftward.ctrlSeq) > -1
+        ) //lookbehind for operator
+      )
+        leftward = leftward[L];
+
+      if (leftward instanceof BigSymbol && leftward[R] instanceof SupSub) {
+        leftward = leftward[R];
+        if (leftward[R] instanceof SupSub && leftward[R].ctrlSeq != leftward.ctrlSeq)
+          leftward = leftward[R];
+      }
+
+      if (leftward !== cursor[L]) {
+        this.replaces(MathFragment(leftward[R] || cursor.parent.ends[L], cursor[L]));
+        cursor[L] = leftward;
+      }
+    }
+    _super.createLeftOf.call(this, cursor);
+  };
+});
+
+var SquareRoot =
+LatexCmds.sqrt =
+LatexCmds['√'] = P(MathCommand, function(_, _super) {
+  _.ctrlSeq = '\\sqrt';
+  _.htmlTemplate =
+      '<span class="non-leaf">'
+    +   '<span class="scaled sqrt-prefix">&radic;</span>'
+    +   '<span class="non-leaf sqrt-stem">&0</span>'
+    + '</span>'
+  ;
+  _.textTemplate = ['sqrt(', ')'];
+  _.parser = function() {
+    return latexMathParser.optBlock.then(function(optBlock) {
+      return latexMathParser.block.map(function(block) {
+        var nthroot = NthRoot();
+        nthroot.blocks = [ optBlock, block ];
+        optBlock.adopt(nthroot, 0, 0);
+        block.adopt(nthroot, optBlock, 0);
+        return nthroot;
+      });
+    }).or(_super.parser.call(this));
+  };
+  _.redraw = function() {
+    var block = this.ends[R].jQ;
+    scale(block.prev(), 1, block.innerHeight()/+block.css('fontSize').slice(0,-2) - .1);
+  };
+});
+
+var Vec = LatexCmds.vec = P(MathCommand, function(_, _super) {
+  _.ctrlSeq = '\\vec';
+  _.htmlTemplate =
+      '<span class="non-leaf">'
+    +   '<span class="vector-prefix">&rarr;</span>'
+    +   '<span class="vector-stem">&0</span>'
+    + '</span>'
+  ;
+  _.textTemplate = ['vec(', ')'];
+});
+
+var NthRoot =
+LatexCmds.nthroot = P(SquareRoot, function(_, _super) {
+  _.htmlTemplate =
+      '<sup class="nthroot non-leaf">&0</sup>'
+    + '<span class="scaled">'
+    +   '<span class="sqrt-prefix scaled">&radic;</span>'
+    +   '<span class="sqrt-stem non-leaf">&1</span>'
+    + '</span>'
+  ;
+  _.textTemplate = ['sqrt[', '](', ')'];
+  _.latex = function() {
+    return '\\sqrt['+this.ends[L].latex()+']{'+this.ends[R].latex()+'}';
+  };
+});
+
+// Round/Square/Curly/Angle Brackets (aka Parens/Brackets/Braces)
+var Bracket = P(MathCommand, function(_, _super) {
+  _.init = function(open, close, ctrlSeq, end) {
+    _super.init.call(this, '\\left'+ctrlSeq,
+        '<span class="non-leaf">'
+      +   '<span class="scaled paren">'+open+'</span>'
+      +   '<span class="non-leaf">&0</span>'
+      +   '<span class="scaled paren">'+close+'</span>'
+      + '</span>',
+      [open, close]);
+    this.end = '\\right'+end;
+  };
+  _.jQadd = function() {
+    _super.jQadd.apply(this, arguments);
+    var jQ = this.jQ;
+    this.bracketjQs = jQ.children(':first').add(jQ.children(':last'));
+  };
+  _.latex = function() {
+    return this.ctrlSeq + this.ends[L].latex() + this.end;
+  };
+  _.redraw = function() {
+    var blockjQ = this.ends[L].jQ;
+
+    var height = blockjQ.outerHeight()/+blockjQ.css('fontSize').slice(0,-2);
+
+    scale(this.bracketjQs, min(1 + .2*(height - 1), 1.2), 1.05*height);
+  };
+});
+
+LatexCmds.left = P(MathCommand, function(_) {
+  _.parser = function() {
+    var regex = Parser.regex;
+    var string = Parser.string;
+    var succeed = Parser.succeed;
+    var optWhitespace = Parser.optWhitespace;
+
+    return optWhitespace.then(regex(/^(?:[([|]|\\\{)/))
+      .then(function(open) {
+        if (open.charAt(0) === '\\') open = open.slice(1);
+
+        var cmd = CharCmds[open]();
+
+        return latexMathParser
+          .map(function (block) {
+            cmd.blocks = [ block ];
+            block.adopt(cmd, 0, 0);
+          })
+          .then(string('\\right'))
+          .skip(optWhitespace)
+          .then(regex(/^(?:[\])|]|\\\})/))
+          .then(function(close) {
+            if (close.slice(-1) !== cmd.end.slice(-1)) {
+              return Parser.fail('open doesn\'t match close');
+            }
+
+            return succeed(cmd);
+          })
+        ;
+      })
+    ;
+  };
+});
+
+LatexCmds.right = P(MathCommand, function(_) {
+  _.parser = function() {
+    return Parser.fail('unmatched \\right');
+  };
+});
+
+LatexCmds.lbrace =
+CharCmds['{'] = bind(Bracket, '{', '}', '\\{', '\\}');
+LatexCmds.langle =
+LatexCmds.lang = bind(Bracket, '&lang;','&rang;','\\langle ','\\rangle ');
+
+// Closing bracket matching opening bracket above
+var CloseBracket = P(Bracket, function(_, _super) {
+  _.createLeftOf = function(cursor) {
+    // if I'm at the end of my parent who is a matching open-paren,
+    // and I am not replacing a selection fragment, don't create me,
+    // just put cursor after my parent
+    if (!cursor[R] && cursor.parent.parent && cursor.parent.parent.end === this.end && !this.replacedFragment)
+      cursor.insRightOf(cursor.parent.parent);
+    else
+      _super.createLeftOf.call(this, cursor);
+  };
+  _.placeCursor = function(cursor) {
+    this.ends[L].blur();
+    cursor.insRightOf(this);
+  };
+});
+
+LatexCmds.rbrace =
+CharCmds['}'] = bind(CloseBracket, '{','}','\\{','\\}');
+LatexCmds.rangle =
+LatexCmds.rang = bind(CloseBracket, '&lang;','&rang;','\\langle ','\\rangle ');
+
+var parenMixin = function(_, _super) {
+  _.init = function(open, close) {
+    _super.init.call(this, open, close, open, close);
+  };
+};
+
+var Paren = P(Bracket, parenMixin);
+
+LatexCmds.lparen =
+CharCmds['('] = bind(Paren, '(', ')');
+LatexCmds.lbrack =
+LatexCmds.lbracket =
+CharCmds['['] = bind(Paren, '[', ']');
+
+var CloseParen = P(CloseBracket, parenMixin);
+
+LatexCmds.rparen =
+CharCmds[')'] = bind(CloseParen, '(', ')');
+LatexCmds.rbrack =
+LatexCmds.rbracket =
+CharCmds[']'] = bind(CloseParen, '[', ']');
+
+var Pipes =
+LatexCmds.lpipe =
+LatexCmds.rpipe =
+CharCmds['|'] = P(Paren, function(_, _super) {
+  _.init = function() {
+    _super.init.call(this, '|', '|');
+  };
+
+  _.createLeftOf = CloseBracket.prototype.createLeftOf;
+});
+
+var TextBlock =
+CharCmds.$ =
+LatexCmds.text =
+LatexCmds.textnormal =
+LatexCmds.textrm =
+LatexCmds.textup =
+LatexCmds.textmd = P(MathCommand, function(_, _super) {
+  _.ctrlSeq = '\\text';
+  _.htmlTemplate = '<span class="text">&0</span>';
+  _.replaces = function(replacedText) {
+    if (replacedText instanceof MathFragment)
+      this.replacedText = replacedText.remove().jQ.text();
+    else if (typeof replacedText === 'string')
+      this.replacedText = replacedText;
+  };
+  _.textTemplate = ['"', '"'];
+  _.parser = function() {
+    var self = this;
+
+    // TODO: correctly parse text mode
+    var string = Parser.string;
+    var regex = Parser.regex;
+    var optWhitespace = Parser.optWhitespace;
+    return optWhitespace
+      .then(string('{')).then(regex(/^[^}]*/)).skip(string('}'))
+      .map(function(text) {
+        self.createBlocks();
+        var block = self.ends[L];
+        for (var i = 0; i < text.length; i += 1) {
+          var ch = VanillaSymbol(text.charAt(i));
+          ch.adopt(block, block.ends[R], 0);
+        }
+        return self;
+      })
+    ;
+  };
+  _.createBlocks = function() {
+    //FIXME: another possible Law of Demeter violation, but this seems much cleaner, like it was supposed to be done this way
+    this.ends[L] =
+    this.ends[R] =
+      InnerTextBlock();
+
+    this.blocks = [ this.ends[L] ];
+
+    this.ends[L].parent = this;
+  };
+  _.finalizeInsert = function() {
+    //FIXME HACK blur removes the TextBlock
+    this.ends[L].blur = function() { delete this.blur; return this; };
+    _super.finalizeInsert.call(this);
+  };
+  _.createLeftOf = function(cursor) {
+    _super.createLeftOf.call(this, this.cursor = cursor);
+
+    if (this.replacedText)
+      for (var i = 0; i < this.replacedText.length; i += 1)
+        this.ends[L].write(cursor, this.replacedText.charAt(i));
+  };
+});
+
+var InnerTextBlock = P(MathBlock, function(_, _super) {
+  _.onKey = function(key, e) {
+    if (key === 'Spacebar' || key === 'Shift-Spacebar') return false;
+  };
+  // backspace and delete at ends of block don't unwrap
+  _.deleteOutOf = function(dir, cursor) {
+    if (this.isEmpty()) cursor.insRightOf(this.parent);
+  };
+  _.write = function(cursor, ch, replacedFragment) {
+    if (replacedFragment) replacedFragment.remove();
+
+    if (ch !== '$') {
+      var html;
+      if (ch === '<') html = '&lt;';
+      else if (ch === '>') html = '&gt;';
+      VanillaSymbol(ch, html).createLeftOf(cursor);
+    }
+    else if (this.isEmpty()) {
+      cursor.insRightOf(this.parent).backspace();
+      VanillaSymbol('\\$','$').createLeftOf(cursor);
+    }
+    else if (!cursor[R])
+      cursor.insRightOf(this.parent);
+    else if (!cursor[L])
+      cursor.insLeftOf(this.parent);
+    else { //split apart
+      var rightward = TextBlock();
+      rightward.replaces(MathFragment(cursor[R], this.ends[R]));
+
+      cursor.insRightOf(this.parent);
+
+      // FIXME HACK: pretend no prev so they don't get merged when
+      // .createLeftOf() calls blur on the InnerTextBlock
+      rightward.adopt = function() {
+        delete this.adopt;
+        this.adopt.apply(this, arguments);
+        this[L] = 0;
+      };
+      rightward.createLeftOf(cursor);
+      rightward[L] = this.parent;
+
+      cursor.insLeftOf(rightward);
+    }
+    return false;
+  };
+  _.blur = function() {
+    this.jQ.removeClass('hasCursor');
+    if (this.isEmpty()) {
+      var textblock = this.parent, cursor = textblock.cursor;
+      if (cursor.parent === this)
+        this.jQ.addClass('empty');
+      else {
+        cursor.hide();
+        textblock.remove();
+        if (cursor[R] === textblock)
+          cursor[R] = textblock[R];
+        else if (cursor[L] === textblock)
+          cursor[L] = textblock[L];
+
+        cursor.show().parent.bubble('redraw');
+      }
+    }
+    return this;
+  };
+  _.focus = function() {
+    _super.focus.call(this);
+
+    var textblock = this.parent;
+    if (textblock[R].ctrlSeq === textblock.ctrlSeq) { //TODO: seems like there should be a better way to move MathElements around
+      var innerblock = this,
+        cursor = textblock.cursor,
+        rightward = textblock[R].ends[L];
+
+      rightward.eachChild(function(child){
+        child.parent = innerblock;
+        child.jQ.appendTo(innerblock.jQ);
+      });
+
+      if (this.ends[R])
+        this.ends[R][R] = rightward.ends[L];
+      else
+        this.ends[L] = rightward.ends[L];
+
+      rightward.ends[L][L] = this.ends[R];
+      this.ends[R] = rightward.ends[R];
+
+      rightward.parent.remove();
+
+      if (cursor[L])
+        cursor.insRightOf(cursor[L]);
+      else
+        cursor.insAtLeftEnd(this);
+
+      cursor.parent.bubble('redraw');
+    }
+    else if (textblock[L].ctrlSeq === textblock.ctrlSeq) {
+      var cursor = textblock.cursor;
+      if (cursor[L])
+        textblock[L].ends[L].focus();
+      else
+        cursor.insAtRightEnd(textblock[L].ends[L]);
+    }
+    return this;
+  };
+});
+
+
+function makeTextBlock(latex, tagName, attrs) {
+  return P(TextBlock, {
+    ctrlSeq: latex,
+    htmlTemplate: '<'+tagName+' '+attrs+'>&0</'+tagName+'>'
+  });
+}
+
+LatexCmds.em = LatexCmds.italic = LatexCmds.italics =
+LatexCmds.emph = LatexCmds.textit = LatexCmds.textsl =
+  makeTextBlock('\\textit', 'i', 'class="text"');
+LatexCmds.strong = LatexCmds.bold = LatexCmds.textbf =
+  makeTextBlock('\\textbf', 'b', 'class="text"');
+LatexCmds.sf = LatexCmds.textsf =
+  makeTextBlock('\\textsf', 'span', 'class="sans-serif text"');
+LatexCmds.tt = LatexCmds.texttt =
+  makeTextBlock('\\texttt', 'span', 'class="monospace text"');
+LatexCmds.textsc =
+  makeTextBlock('\\textsc', 'span', 'style="font-variant:small-caps" class="text"');
+LatexCmds.uppercase =
+  makeTextBlock('\\uppercase', 'span', 'style="text-transform:uppercase" class="text"');
+LatexCmds.lowercase =
+  makeTextBlock('\\lowercase', 'span', 'style="text-transform:lowercase" class="text"');
+
+// input box to type a variety of LaTeX commands beginning with a backslash
+var LatexCommandInput =
+CharCmds['\\'] = P(MathCommand, function(_, _super) {
+  _.ctrlSeq = '\\';
+  _.replaces = function(replacedFragment) {
+    this._replacedFragment = replacedFragment.disown();
+    this.isEmpty = function() { return false; };
+  };
+  _.htmlTemplate = '<span class="latex-command-input non-leaf">\\<span>&0</span></span>';
+  _.textTemplate = ['\\'];
+  _.createBlocks = function() {
+    _super.createBlocks.call(this);
+    this.ends[L].focus = function() {
+      this.parent.jQ.addClass('hasCursor');
+      if (this.isEmpty())
+        this.parent.jQ.removeClass('empty');
+
+      return this;
+    };
+    this.ends[L].blur = function() {
+      this.parent.jQ.removeClass('hasCursor');
+      if (this.isEmpty())
+        this.parent.jQ.addClass('empty');
+
+      return this;
+    };
+  };
+  _.createLeftOf = function(cursor) {
+    _super.createLeftOf.call(this, cursor);
+
+    this.cursor = cursor.insAtRightEnd(this.ends[L]);
+    if (this._replacedFragment) {
+      var el = this.jQ[0];
+      this.jQ =
+        this._replacedFragment.jQ.addClass('blur').bind(
+          'mousedown mousemove', //FIXME: is monkey-patching the mousedown and mousemove handlers the right way to do this?
+          function(e) {
+            $(e.target = el).trigger(e);
+            return false;
+          }
+        ).insertBefore(this.jQ).add(this.jQ);
+    }
+
+    this.ends[L].write = function(cursor, ch, replacedFragment) {
+      if (replacedFragment) replacedFragment.remove();
+
+      if (ch.match(/[a-z]/i)) VanillaSymbol(ch).createLeftOf(cursor);
+      else {
+        this.parent.renderCommand();
+        if (ch !== '\\' || !this.isEmpty()) this.parent.parent.write(cursor, ch);
+      }
+    };
+  };
+  _.latex = function() {
+    return '\\' + this.ends[L].latex() + ' ';
+  };
+  _.onKey = function(key, e) {
+    if (key === 'Tab' || key === 'Enter' || key === 'Spacebar') {
+      this.renderCommand();
+      e.preventDefault();
+      return false;
+    }
+  };
+  _.renderCommand = function() {
+    this.jQ = this.jQ.last();
+    this.remove();
+    if (this[R]) {
+      this.cursor.insLeftOf(this[R]);
+    } else {
+      this.cursor.insAtRightEnd(this.parent);
+    }
+
+    var latex = this.ends[L].latex(), cmd;
+    if (!latex) latex = 'backslash';
+    this.cursor.insertCmd(latex, this._replacedFragment);
+  };
+});
+
+var Binomial =
+LatexCmds.binom =
+LatexCmds.binomial = P(MathCommand, function(_, _super) {
+  _.ctrlSeq = '\\binom';
+  _.htmlTemplate =
+      '<span class="paren scaled">(</span>'
+    + '<span class="non-leaf">'
+    +   '<span class="array non-leaf">'
+    +     '<span>&0</span>'
+    +     '<span>&1</span>'
+    +   '</span>'
+    + '</span>'
+    + '<span class="paren scaled">)</span>'
+  ;
+  _.textTemplate = ['choose(',',',')'];
+  _.redraw = function() {
+    var blockjQ = this.jQ.eq(1);
+
+    var height = blockjQ.outerHeight()/+blockjQ.css('fontSize').slice(0,-2);
+
+    var parens = this.jQ.filter('.paren');
+    scale(parens, min(1 + .2*(height - 1), 1.2), 1.05*height);
+  };
+});
+
+var Choose =
+LatexCmds.choose = P(Binomial, function(_) {
+  _.createLeftOf = LiveFraction.prototype.createLeftOf;
+});
+
+var Vector =
+LatexCmds.vector = P(MathCommand, function(_, _super) {
+  _.ctrlSeq = '\\vector';
+  _.htmlTemplate = '<span class="array"><span>&0</span></span>';
+  _.latex = function() {
+    return '\\begin{matrix}' + this.foldChildren([], function(latex, child) {
+      latex.push(child.latex());
+      return latex;
+    }).join('\\\\') + '\\end{matrix}';
+  };
+  _.text = function() {
+    return '[' + this.foldChildren([], function(text, child) {
+      text.push(child.text());
+      return text;
+    }).join() + ']';
+  };
+  _.createLeftOf = function(cursor) {
+    _super.createLeftOf.call(this, this.cursor = cursor);
+  };
+  _.onKey = function(key, e) {
+    var currentBlock = this.cursor.parent;
+
+    if (currentBlock.parent === this) {
+      if (key === 'Enter') { //enter
+        var newBlock = MathBlock();
+        newBlock.parent = this;
+        newBlock.jQ = $('<span></span>')
+          .attr(mqBlockId, newBlock.id)
+          .insertAfter(currentBlock.jQ);
+        if (currentBlock[R])
+          currentBlock[R][L] = newBlock;
+        else
+          this.ends[R] = newBlock;
+
+        newBlock[R] = currentBlock[R];
+        currentBlock[R] = newBlock;
+        newBlock[L] = currentBlock;
+        this.bubble('redraw').cursor.insAtRightEnd(newBlock);
+
+        e.preventDefault();
+        return false;
+      }
+      else if (key === 'Tab' && !currentBlock[R]) {
+        if (currentBlock.isEmpty()) {
+          if (currentBlock[L]) {
+            this.cursor.insRightOf(this);
+            delete currentBlock[L][R];
+            this.ends[R] = currentBlock[L];
+            currentBlock.jQ.remove();
+            this.bubble('redraw');
+
+            e.preventDefault();
+            return false;
+          }
+          else
+            return;
+        }
+
+        var newBlock = MathBlock();
+        newBlock.parent = this;
+        newBlock.jQ = $('<span></span>').attr(mqBlockId, newBlock.id).appendTo(this.jQ);
+        this.ends[R] = newBlock;
+        currentBlock[R] = newBlock;
+        newBlock[L] = currentBlock;
+        this.bubble('redraw').cursor.insAtRightEnd(newBlock);
+
+        e.preventDefault();
+        return false;
+      }
+      else if (e.which === 8) { //backspace
+        if (currentBlock.isEmpty()) {
+          if (currentBlock[L]) {
+            this.cursor.insAtRightEnd(currentBlock[L])
+            currentBlock[L][R] = currentBlock[R];
+          }
+          else {
+            this.cursor.insLeftOf(this);
+            this.ends[L] = currentBlock[R];
+          }
+
+          if (currentBlock[R])
+            currentBlock[R][L] = currentBlock[L];
+          else
+            this.ends[R] = currentBlock[L];
+
+          currentBlock.jQ.remove();
+          if (this.isEmpty())
+            this.cursor.deleteForward();
+          else
+            this.bubble('redraw');
+
+          e.preventDefault();
+          return false;
+        }
+        else if (!this.cursor[L]) {
+          e.preventDefault();
+          return false;
+        }
+      }
+    }
+  };
+});
+
+LatexCmds.editable = P(RootMathCommand, function(_, _super) {
+  _.init = function() {
+    MathCommand.prototype.init.call(this, '\\editable');
+  };
+
+  _.jQadd = function() {
+    var self = this;
+    // FIXME: this entire method is a giant hack to get around
+    // having to call createBlocks, and createRoot expecting to
+    // render the contents' LaTeX. Both need to be refactored.
+    _super.jQadd.apply(self, arguments);
+    var block = self.ends[L].disown();
+    var blockjQ = self.jQ.children().detach();
+
+    self.ends[L] =
+    self.ends[R] =
+      RootMathBlock();
+
+    self.blocks = [ self.ends[L] ];
+
+    self.ends[L].parent = self;
+
+    createRoot(self.jQ, self.ends[L], false, true);
+    self.cursor = self.ends[L].cursor;
+
+    block.children().adopt(self.ends[L], 0, 0);
+    blockjQ.appendTo(self.ends[L].jQ);
+
+    self.ends[L].cursor.insAtRightEnd(self.ends[L]);
+  };
+
+  _.latex = function(){ return this.ends[L].latex(); };
+  _.text = function(){ return this.ends[L].text(); };
+});
+/**********************************
+ * Symbols and Special Characters
+ *********************************/
+
+LatexCmds.f = bind(Symbol, 'f', '<var class="florin">&fnof;</var><span style="display:inline-block;width:0">&nbsp;</span>');
+
+var Variable = P(Symbol, function(_, _super) {
+  _.init = function(ch, html) {
+    _super.init.call(this, ch, '<var>'+(html || ch)+'</var>');
+  };
+  _.text = function() {
+    var text = this.ctrlSeq;
+    if (this[L] && !(this[L] instanceof Variable)
+        && !(this[L] instanceof BinaryOperator))
+      text = '*' + text;
+    if (this[R] && !(this[R] instanceof BinaryOperator)
+        && !(this[R].ctrlSeq === '^'))
+      text += '*';
+    return text;
+  };
+});
+
+var VanillaSymbol = P(Symbol, function(_, _super) {
+  _.init = function(ch, html) {
+    _super.init.call(this, ch, '<span>'+(html || ch)+'</span>');
+  };
+});
+
+CharCmds[' '] = bind(VanillaSymbol, '\\:', ' ');
+
+LatexCmds.prime = CharCmds["'"] = bind(VanillaSymbol, "'", '&prime;');
+
+// does not use Symbola font
+var NonSymbolaSymbol = P(Symbol, function(_, _super) {
+  _.init = function(ch, html) {
+    _super.init.call(this, ch, '<span class="nonSymbola">'+(html || ch)+'</span>');
+  };
+});
+
+LatexCmds['@'] = NonSymbolaSymbol;
+LatexCmds['&'] = bind(NonSymbolaSymbol, '\\&', '&amp;');
+LatexCmds['%'] = bind(NonSymbolaSymbol, '\\%', '%');
+
+//the following are all Greek to me, but this helped a lot: http://www.ams.org/STIX/ion/stixsig03.html
+
+//lowercase Greek letter variables
+LatexCmds.alpha =
+LatexCmds.beta =
+LatexCmds.gamma =
+LatexCmds.delta =
+LatexCmds.zeta =
+LatexCmds.eta =
+LatexCmds.theta =
+LatexCmds.iota =
+LatexCmds.kappa =
+LatexCmds.mu =
+LatexCmds.nu =
+LatexCmds.xi =
+LatexCmds.rho =
+LatexCmds.sigma =
+LatexCmds.tau =
+LatexCmds.chi =
+LatexCmds.psi =
+LatexCmds.omega = P(Variable, function(_, _super) {
+  _.init = function(latex) {
+    _super.init.call(this,'\\'+latex+' ','&'+latex+';');
+  };
+});
+
+//why can't anybody FUCKING agree on these
+LatexCmds.phi = //W3C or Unicode?
+  bind(Variable,'\\phi ','&#981;');
+
+LatexCmds.phiv = //Elsevier and 9573-13
+LatexCmds.varphi = //AMS and LaTeX
+  bind(Variable,'\\varphi ','&phi;');
+
+LatexCmds.epsilon = //W3C or Unicode?
+  bind(Variable,'\\epsilon ','&#1013;');
+
+LatexCmds.epsiv = //Elsevier and 9573-13
+LatexCmds.varepsilon = //AMS and LaTeX
+  bind(Variable,'\\varepsilon ','&epsilon;');
+
+LatexCmds.piv = //W3C/Unicode and Elsevier and 9573-13
+LatexCmds.varpi = //AMS and LaTeX
+  bind(Variable,'\\varpi ','&piv;');
+
+LatexCmds.sigmaf = //W3C/Unicode
+LatexCmds.sigmav = //Elsevier
+LatexCmds.varsigma = //LaTeX
+  bind(Variable,'\\varsigma ','&sigmaf;');
+
+LatexCmds.thetav = //Elsevier and 9573-13
+LatexCmds.vartheta = //AMS and LaTeX
+LatexCmds.thetasym = //W3C/Unicode
+  bind(Variable,'\\vartheta ','&thetasym;');
+
+LatexCmds.upsilon = //AMS and LaTeX and W3C/Unicode
+LatexCmds.upsi = //Elsevier and 9573-13
+  bind(Variable,'\\upsilon ','&upsilon;');
+
+//these aren't even mentioned in the HTML character entity references
+LatexCmds.gammad = //Elsevier
+LatexCmds.Gammad = //9573-13 -- WTF, right? I dunno if this was a typo in the reference (see above)
+LatexCmds.digamma = //LaTeX
+  bind(Variable,'\\digamma ','&#989;');
+
+LatexCmds.kappav = //Elsevier
+LatexCmds.varkappa = //AMS and LaTeX
+  bind(Variable,'\\varkappa ','&#1008;');
+
+LatexCmds.rhov = //Elsevier and 9573-13
+LatexCmds.varrho = //AMS and LaTeX
+  bind(Variable,'\\varrho ','&#1009;');
+
+//Greek constants, look best in un-italicised Times New Roman
+LatexCmds.pi = LatexCmds['π'] = bind(NonSymbolaSymbol,'\\pi ','&pi;');
+LatexCmds.lambda = bind(NonSymbolaSymbol,'\\lambda ','&lambda;');
+
+//uppercase greek letters
+
+LatexCmds.Upsilon = //LaTeX
+LatexCmds.Upsi = //Elsevier and 9573-13
+LatexCmds.upsih = //W3C/Unicode "upsilon with hook"
+LatexCmds.Upsih = //'cos it makes sense to me
+  bind(Symbol,'\\Upsilon ','<var style="font-family: serif">&upsih;</var>'); //Symbola's 'upsilon with a hook' is a capital Y without hooks :(
+
+//other symbols with the same LaTeX command and HTML character entity reference
+LatexCmds.Gamma =
+LatexCmds.Delta =
+LatexCmds.Theta =
+LatexCmds.Lambda =
+LatexCmds.Xi =
+LatexCmds.Pi =
+LatexCmds.Sigma =
+LatexCmds.Phi =
+LatexCmds.Psi =
+LatexCmds.Omega =
+LatexCmds.forall = P(VanillaSymbol, function(_, _super) {
+  _.init = function(latex) {
+    _super.init.call(this,'\\'+latex+' ','&'+latex+';');
+  };
+});
+
+// symbols that aren't a single MathCommand, but are instead a whole
+// Fragment. Creates the Fragment from a LaTeX string
+var LatexFragment = P(MathCommand, function(_) {
+  _.init = function(latex) { this.latex = latex; };
+  _.createLeftOf = function(cursor) { cursor.writeLatex(this.latex); };
+  _.parser = function() {
+    var frag = latexMathParser.parse(this.latex).children();
+    return Parser.succeed(frag);
+  };
+});
+
+// for what seems to me like [stupid reasons][1], Unicode provides
+// subscripted and superscripted versions of all ten Arabic numerals,
+// as well as [so-called "vulgar fractions"][2].
+// Nobody really cares about most of them, but some of them actually
+// predate Unicode, dating back to [ISO-8859-1][3], apparently also
+// known as "Latin-1", which among other things [Windows-1252][4]
+// largely coincides with, so Microsoft Word sometimes inserts them
+// and they get copy-pasted into MathQuill.
+//
+// (Irrelevant but funny story: Windows-1252 is actually a strict
+// superset of the "closely related but distinct"[3] "ISO 8859-1" --
+// see the lack of a dash after "ISO"? Completely different character
+// set, like elephants vs elephant seals, or "Zombies" vs "Zombie
+// Redneck Torture Family". What kind of idiot would get them confused.
+// People in fact got them confused so much, it was so common to
+// mislabel Windows-1252 text as ISO-8859-1, that most modern web
+// browsers and email clients treat the MIME charset of ISO-8859-1
+// as actually Windows-1252, behavior now standard in the HTML5 spec.)
+//
+// [1]: http://en.wikipedia.org/wiki/Unicode_subscripts_and_superscripts
+// [2]: http://en.wikipedia.org/wiki/Number_Forms
+// [3]: http://en.wikipedia.org/wiki/ISO/IEC_8859-1
+// [4]: http://en.wikipedia.org/wiki/Windows-1252
+LatexCmds['¹'] = bind(LatexFragment, '^1');
+LatexCmds['²'] = bind(LatexFragment, '^2');
+LatexCmds['³'] = bind(LatexFragment, '^3');
+LatexCmds['¼'] = bind(LatexFragment, '\\frac14');
+LatexCmds['½'] = bind(LatexFragment, '\\frac12');
+LatexCmds['¾'] = bind(LatexFragment, '\\frac34');
+
+var BinaryOperator = P(Symbol, function(_, _super) {
+  _.init = function(ctrlSeq, html, text) {
+    _super.init.call(this,
+      ctrlSeq, '<span class="binary-operator">'+html+'</span>', text
+    );
+  };
+});
+
+var PlusMinus = P(BinaryOperator, function(_) {
+  _.init = VanillaSymbol.prototype.init;
+
+  _.respace = function() {
+    if (!this[L]) {
+      this.jQ[0].className = '';
+    }
+    else if (
+      this[L] instanceof BinaryOperator &&
+      this[R] && !(this[R] instanceof BinaryOperator)
+    ) {
+      this.jQ[0].className = 'unary-operator';
+    }
+    else {
+      this.jQ[0].className = 'binary-operator';
+    }
+    return this;
+  };
+});
+
+LatexCmds['+'] = bind(PlusMinus, '+', '+');
+//yes, these are different dashes, I think one is an en dash and the other is a hyphen
+LatexCmds['–'] = LatexCmds['-'] = bind(PlusMinus, '-', '&minus;');
+LatexCmds['±'] = LatexCmds.pm = LatexCmds.plusmn = LatexCmds.plusminus =
+  bind(PlusMinus,'\\pm ','&plusmn;');
+LatexCmds.mp = LatexCmds.mnplus = LatexCmds.minusplus =
+  bind(PlusMinus,'\\mp ','&#8723;');
+
+CharCmds['*'] = LatexCmds.sdot = LatexCmds.cdot =
+  bind(BinaryOperator, '\\cdot ', '&middot;');
+//semantically should be &sdot;, but &middot; looks better
+
+LatexCmds['='] = bind(BinaryOperator, '=', '=');
+LatexCmds['<'] = bind(BinaryOperator, '<', '&lt;');
+LatexCmds['>'] = bind(BinaryOperator, '>', '&gt;');
+
+LatexCmds.notin =
+LatexCmds.sim =
+LatexCmds.cong =
+LatexCmds.equiv =
+LatexCmds.oplus =
+LatexCmds.otimes = P(BinaryOperator, function(_, _super) {
+  _.init = function(latex) {
+    _super.init.call(this, '\\'+latex+' ', '&'+latex+';');
+  };
+});
+
+LatexCmds.times = bind(BinaryOperator, '\\times ', '&times;', '[x]');
+
+LatexCmds['÷'] = LatexCmds.div = LatexCmds.divide = LatexCmds.divides =
+  bind(BinaryOperator,'\\div ','&divide;', '[/]');
+
+LatexCmds['≠'] = LatexCmds.ne = LatexCmds.neq = bind(BinaryOperator,'\\ne ','&ne;');
+
+LatexCmds.ast = LatexCmds.star = LatexCmds.loast = LatexCmds.lowast =
+  bind(BinaryOperator,'\\ast ','&lowast;');
+  //case 'there4 = // a special exception for this one, perhaps?
+LatexCmds.therefor = LatexCmds.therefore =
+  bind(BinaryOperator,'\\therefore ','&there4;');
+
+LatexCmds.cuz = // l33t
+LatexCmds.because = bind(BinaryOperator,'\\because ','&#8757;');
+
+LatexCmds.prop = LatexCmds.propto = bind(BinaryOperator,'\\propto ','&prop;');
+
+LatexCmds['≈'] = LatexCmds.asymp = LatexCmds.approx = bind(BinaryOperator,'\\approx ','&asymp;');
+
+LatexCmds.lt = bind(BinaryOperator,'<','&lt;');
+
+LatexCmds.gt = bind(BinaryOperator,'>','&gt;');
+
+LatexCmds['≤'] = LatexCmds.le = LatexCmds.leq = bind(BinaryOperator,'\\le ','&le;');
+
+LatexCmds['≥'] = LatexCmds.ge = LatexCmds.geq = bind(BinaryOperator,'\\ge ','&ge;');
+
+LatexCmds.isin = LatexCmds['in'] = bind(BinaryOperator,'\\in ','&isin;');
+
+LatexCmds.ni = LatexCmds.contains = bind(BinaryOperator,'\\ni ','&ni;');
+
+LatexCmds.notni = LatexCmds.niton = LatexCmds.notcontains = LatexCmds.doesnotcontain =
+  bind(BinaryOperator,'\\not\\ni ','&#8716;');
+
+LatexCmds.sub = LatexCmds.subset = bind(BinaryOperator,'\\subset ','&sub;');
+
+LatexCmds.sup = LatexCmds.supset = LatexCmds.superset =
+  bind(BinaryOperator,'\\supset ','&sup;');
+
+LatexCmds.nsub = LatexCmds.notsub =
+LatexCmds.nsubset = LatexCmds.notsubset =
+  bind(BinaryOperator,'\\not\\subset ','&#8836;');
+
+LatexCmds.nsup = LatexCmds.notsup =
+LatexCmds.nsupset = LatexCmds.notsupset =
+LatexCmds.nsuperset = LatexCmds.notsuperset =
+  bind(BinaryOperator,'\\not\\supset ','&#8837;');
+
+LatexCmds.sube = LatexCmds.subeq = LatexCmds.subsete = LatexCmds.subseteq =
+  bind(BinaryOperator,'\\subseteq ','&sube;');
+
+LatexCmds.supe = LatexCmds.supeq =
+LatexCmds.supsete = LatexCmds.supseteq =
+LatexCmds.supersete = LatexCmds.superseteq =
+  bind(BinaryOperator,'\\supseteq ','&supe;');
+
+LatexCmds.nsube = LatexCmds.nsubeq =
+LatexCmds.notsube = LatexCmds.notsubeq =
+LatexCmds.nsubsete = LatexCmds.nsubseteq =
+LatexCmds.notsubsete = LatexCmds.notsubseteq =
+  bind(BinaryOperator,'\\not\\subseteq ','&#8840;');
+
+LatexCmds.nsupe = LatexCmds.nsupeq =
+LatexCmds.notsupe = LatexCmds.notsupeq =
+LatexCmds.nsupsete = LatexCmds.nsupseteq =
+LatexCmds.notsupsete = LatexCmds.notsupseteq =
+LatexCmds.nsupersete = LatexCmds.nsuperseteq =
+LatexCmds.notsupersete = LatexCmds.notsuperseteq =
+  bind(BinaryOperator,'\\not\\supseteq ','&#8841;');
+
+
+//sum, product, coproduct, integral
+var BigSymbol = P(Symbol, function(_, _super) {
+  _.init = function(ch, html) {
+    _super.init.call(this, ch, '<big>'+html+'</big>');
+  };
+});
+
+LatexCmds['∑'] = LatexCmds.sum = LatexCmds.summation = bind(BigSymbol,'\\sum ','&sum;');
+LatexCmds['∏'] = LatexCmds.prod = LatexCmds.product = bind(BigSymbol,'\\prod ','&prod;');
+LatexCmds.coprod = LatexCmds.coproduct = bind(BigSymbol,'\\coprod ','&#8720;');
+LatexCmds['∫'] = LatexCmds['int'] = LatexCmds.integral = bind(BigSymbol,'\\int ','&int;');
+
+
+
+//the canonical sets of numbers
+LatexCmds.N = LatexCmds.naturals = LatexCmds.Naturals =
+  bind(VanillaSymbol,'\\mathbb{N}','&#8469;');
+
+LatexCmds.P =
+LatexCmds.primes = LatexCmds.Primes =
+LatexCmds.projective = LatexCmds.Projective =
+LatexCmds.probability = LatexCmds.Probability =
+  bind(VanillaSymbol,'\\mathbb{P}','&#8473;');
+
+LatexCmds.Z = LatexCmds.integers = LatexCmds.Integers =
+  bind(VanillaSymbol,'\\mathbb{Z}','&#8484;');
+
+LatexCmds.Q = LatexCmds.rationals = LatexCmds.Rationals =
+  bind(VanillaSymbol,'\\mathbb{Q}','&#8474;');
+
+LatexCmds.R = LatexCmds.reals = LatexCmds.Reals =
+  bind(VanillaSymbol,'\\mathbb{R}','&#8477;');
+
+LatexCmds.C =
+LatexCmds.complex = LatexCmds.Complex =
+LatexCmds.complexes = LatexCmds.Complexes =
+LatexCmds.complexplane = LatexCmds.Complexplane = LatexCmds.ComplexPlane =
+  bind(VanillaSymbol,'\\mathbb{C}','&#8450;');
+
+LatexCmds.H = LatexCmds.Hamiltonian = LatexCmds.quaternions = LatexCmds.Quaternions =
+  bind(VanillaSymbol,'\\mathbb{H}','&#8461;');
+
+//spacing
+LatexCmds.quad = LatexCmds.emsp = bind(VanillaSymbol,'\\quad ','    ');
+LatexCmds.qquad = bind(VanillaSymbol,'\\qquad ','        ');
+/* spacing special characters, gonna have to implement this in LatexCommandInput::onText somehow
+case ',':
+  return VanillaSymbol('\\, ',' ');
+case ':':
+  return VanillaSymbol('\\: ','  ');
+case ';':
+  return VanillaSymbol('\\; ','   ');
+case '!':
+  return Symbol('\\! ','<span style="margin-right:-.2em"></span>');
+*/
+
+//binary operators
+LatexCmds.diamond = bind(VanillaSymbol, '\\diamond ', '&#9671;');
+LatexCmds.bigtriangleup = bind(VanillaSymbol, '\\bigtriangleup ', '&#9651;');
+LatexCmds.ominus = bind(VanillaSymbol, '\\ominus ', '&#8854;');
+LatexCmds.uplus = bind(VanillaSymbol, '\\uplus ', '&#8846;');
+LatexCmds.bigtriangledown = bind(VanillaSymbol, '\\bigtriangledown ', '&#9661;');
+LatexCmds.sqcap = bind(VanillaSymbol, '\\sqcap ', '&#8851;');
+LatexCmds.triangleleft = bind(VanillaSymbol, '\\triangleleft ', '&#8882;');
+LatexCmds.sqcup = bind(VanillaSymbol, '\\sqcup ', '&#8852;');
+LatexCmds.triangleright = bind(VanillaSymbol, '\\triangleright ', '&#8883;');
+LatexCmds.odot = bind(VanillaSymbol, '\\odot ', '&#8857;');
+LatexCmds.bigcirc = bind(VanillaSymbol, '\\bigcirc ', '&#9711;');
+LatexCmds.dagger = bind(VanillaSymbol, '\\dagger ', '&#0134;');
+LatexCmds.ddagger = bind(VanillaSymbol, '\\ddagger ', '&#135;');
+LatexCmds.wr = bind(VanillaSymbol, '\\wr ', '&#8768;');
+LatexCmds.amalg = bind(VanillaSymbol, '\\amalg ', '&#8720;');
+
+//relationship symbols
+LatexCmds.models = bind(VanillaSymbol, '\\models ', '&#8872;');
+LatexCmds.prec = bind(VanillaSymbol, '\\prec ', '&#8826;');
+LatexCmds.succ = bind(VanillaSymbol, '\\succ ', '&#8827;');
+LatexCmds.preceq = bind(VanillaSymbol, '\\preceq ', '&#8828;');
+LatexCmds.succeq = bind(VanillaSymbol, '\\succeq ', '&#8829;');
+LatexCmds.simeq = bind(VanillaSymbol, '\\simeq ', '&#8771;');
+LatexCmds.mid = bind(VanillaSymbol, '\\mid ', '&#8739;');
+LatexCmds.ll = bind(VanillaSymbol, '\\ll ', '&#8810;');
+LatexCmds.gg = bind(VanillaSymbol, '\\gg ', '&#8811;');
+LatexCmds.parallel = bind(VanillaSymbol, '\\parallel ', '&#8741;');
+LatexCmds.bowtie = bind(VanillaSymbol, '\\bowtie ', '&#8904;');
+LatexCmds.sqsubset = bind(VanillaSymbol, '\\sqsubset ', '&#8847;');
+LatexCmds.sqsupset = bind(VanillaSymbol, '\\sqsupset ', '&#8848;');
+LatexCmds.smile = bind(VanillaSymbol, '\\smile ', '&#8995;');
+LatexCmds.sqsubseteq = bind(VanillaSymbol, '\\sqsubseteq ', '&#8849;');
+LatexCmds.sqsupseteq = bind(VanillaSymbol, '\\sqsupseteq ', '&#8850;');
+LatexCmds.doteq = bind(VanillaSymbol, '\\doteq ', '&#8784;');
+LatexCmds.frown = bind(VanillaSymbol, '\\frown ', '&#8994;');
+LatexCmds.vdash = bind(VanillaSymbol, '\\vdash ', '&#8870;');
+LatexCmds.dashv = bind(VanillaSymbol, '\\dashv ', '&#8867;');
+
+//arrows
+LatexCmds.longleftarrow = bind(VanillaSymbol, '\\longleftarrow ', '&#8592;');
+LatexCmds.longrightarrow = bind(VanillaSymbol, '\\longrightarrow ', '&#8594;');
+LatexCmds.Longleftarrow = bind(VanillaSymbol, '\\Longleftarrow ', '&#8656;');
+LatexCmds.Longrightarrow = bind(VanillaSymbol, '\\Longrightarrow ', '&#8658;');
+LatexCmds.longleftrightarrow = bind(VanillaSymbol, '\\longleftrightarrow ', '&#8596;');
+LatexCmds.updownarrow = bind(VanillaSymbol, '\\updownarrow ', '&#8597;');
+LatexCmds.Longleftrightarrow = bind(VanillaSymbol, '\\Longleftrightarrow ', '&#8660;');
+LatexCmds.Updownarrow = bind(VanillaSymbol, '\\Updownarrow ', '&#8661;');
+LatexCmds.mapsto = bind(VanillaSymbol, '\\mapsto ', '&#8614;');
+LatexCmds.nearrow = bind(VanillaSymbol, '\\nearrow ', '&#8599;');
+LatexCmds.hookleftarrow = bind(VanillaSymbol, '\\hookleftarrow ', '&#8617;');
+LatexCmds.hookrightarrow = bind(VanillaSymbol, '\\hookrightarrow ', '&#8618;');
+LatexCmds.searrow = bind(VanillaSymbol, '\\searrow ', '&#8600;');
+LatexCmds.leftharpoonup = bind(VanillaSymbol, '\\leftharpoonup ', '&#8636;');
+LatexCmds.rightharpoonup = bind(VanillaSymbol, '\\rightharpoonup ', '&#8640;');
+LatexCmds.swarrow = bind(VanillaSymbol, '\\swarrow ', '&#8601;');
+LatexCmds.leftharpoondown = bind(VanillaSymbol, '\\leftharpoondown ', '&#8637;');
+LatexCmds.rightharpoondown = bind(VanillaSymbol, '\\rightharpoondown ', '&#8641;');
+LatexCmds.nwarrow = bind(VanillaSymbol, '\\nwarrow ', '&#8598;');
+
+//Misc
+LatexCmds.ldots = bind(VanillaSymbol, '\\ldots ', '&#8230;');
+LatexCmds.cdots = bind(VanillaSymbol, '\\cdots ', '&#8943;');
+LatexCmds.vdots = bind(VanillaSymbol, '\\vdots ', '&#8942;');
+LatexCmds.ddots = bind(VanillaSymbol, '\\ddots ', '&#8944;');
+LatexCmds.surd = bind(VanillaSymbol, '\\surd ', '&#8730;');
+LatexCmds.triangle = bind(VanillaSymbol, '\\triangle ', '&#9653;');
+LatexCmds.ell = bind(VanillaSymbol, '\\ell ', '&#8467;');
+LatexCmds.top = bind(VanillaSymbol, '\\top ', '&#8868;');
+LatexCmds.flat = bind(VanillaSymbol, '\\flat ', '&#9837;');
+LatexCmds.natural = bind(VanillaSymbol, '\\natural ', '&#9838;');
+LatexCmds.sharp = bind(VanillaSymbol, '\\sharp ', '&#9839;');
+LatexCmds.wp = bind(VanillaSymbol, '\\wp ', '&#8472;');
+LatexCmds.bot = bind(VanillaSymbol, '\\bot ', '&#8869;');
+LatexCmds.clubsuit = bind(VanillaSymbol, '\\clubsuit ', '&#9827;');
+LatexCmds.diamondsuit = bind(VanillaSymbol, '\\diamondsuit ', '&#9826;');
+LatexCmds.heartsuit = bind(VanillaSymbol, '\\heartsuit ', '&#9825;');
+LatexCmds.spadesuit = bind(VanillaSymbol, '\\spadesuit ', '&#9824;');
+
+//variable-sized
+LatexCmds.oint = bind(VanillaSymbol, '\\oint ', '&#8750;');
+LatexCmds.bigcap = bind(VanillaSymbol, '\\bigcap ', '&#8745;');
+LatexCmds.bigcup = bind(VanillaSymbol, '\\bigcup ', '&#8746;');
+LatexCmds.bigsqcup = bind(VanillaSymbol, '\\bigsqcup ', '&#8852;');
+LatexCmds.bigvee = bind(VanillaSymbol, '\\bigvee ', '&#8744;');
+LatexCmds.bigwedge = bind(VanillaSymbol, '\\bigwedge ', '&#8743;');
+LatexCmds.bigodot = bind(VanillaSymbol, '\\bigodot ', '&#8857;');
+LatexCmds.bigotimes = bind(VanillaSymbol, '\\bigotimes ', '&#8855;');
+LatexCmds.bigoplus = bind(VanillaSymbol, '\\bigoplus ', '&#8853;');
+LatexCmds.biguplus = bind(VanillaSymbol, '\\biguplus ', '&#8846;');
+
+//delimiters
+LatexCmds.lfloor = bind(VanillaSymbol, '\\lfloor ', '&#8970;');
+LatexCmds.rfloor = bind(VanillaSymbol, '\\rfloor ', '&#8971;');
+LatexCmds.lceil = bind(VanillaSymbol, '\\lceil ', '&#8968;');
+LatexCmds.rceil = bind(VanillaSymbol, '\\rceil ', '&#8969;');
+LatexCmds.slash = bind(VanillaSymbol, '\\slash ', '&#47;');
+LatexCmds.opencurlybrace = bind(VanillaSymbol, '\\opencurlybrace ', '&#123;');
+LatexCmds.closecurlybrace = bind(VanillaSymbol, '\\closecurlybrace ', '&#125;');
+
+//various symbols
+
+LatexCmds.caret = bind(VanillaSymbol,'\\caret ','^');
+LatexCmds.underscore = bind(VanillaSymbol,'\\underscore ','_');
+LatexCmds.backslash = bind(VanillaSymbol,'\\backslash ','\\');
+LatexCmds.vert = bind(VanillaSymbol,'|');
+LatexCmds.perp = LatexCmds.perpendicular = bind(VanillaSymbol,'\\perp ','&perp;');
+LatexCmds.nabla = LatexCmds.del = bind(VanillaSymbol,'\\nabla ','&nabla;');
+LatexCmds.hbar = bind(VanillaSymbol,'\\hbar ','&#8463;');
+
+LatexCmds.AA = LatexCmds.Angstrom = LatexCmds.angstrom =
+  bind(VanillaSymbol,'\\text\\AA ','&#8491;');
+
+LatexCmds.ring = LatexCmds.circ = LatexCmds.circle =
+  bind(VanillaSymbol,'\\circ ','&#8728;');
+
+LatexCmds.bull = LatexCmds.bullet = bind(VanillaSymbol,'\\bullet ','&bull;');
+
+LatexCmds.setminus = LatexCmds.smallsetminus =
+  bind(VanillaSymbol,'\\setminus ','&#8726;');
+
+LatexCmds.not = //bind(Symbol,'\\not ','<span class="not">/</span>');
+LatexCmds['¬'] = LatexCmds.neg = bind(VanillaSymbol,'\\neg ','&not;');
+
+LatexCmds['…'] = LatexCmds.dots = LatexCmds.ellip = LatexCmds.hellip =
+LatexCmds.ellipsis = LatexCmds.hellipsis =
+  bind(VanillaSymbol,'\\dots ','&hellip;');
+
+LatexCmds.converges =
+LatexCmds.darr = LatexCmds.dnarr = LatexCmds.dnarrow = LatexCmds.downarrow =
+  bind(VanillaSymbol,'\\downarrow ','&darr;');
+
+LatexCmds.dArr = LatexCmds.dnArr = LatexCmds.dnArrow = LatexCmds.Downarrow =
+  bind(VanillaSymbol,'\\Downarrow ','&dArr;');
+
+LatexCmds.diverges = LatexCmds.uarr = LatexCmds.uparrow =
+  bind(VanillaSymbol,'\\uparrow ','&uarr;');
+
+LatexCmds.uArr = LatexCmds.Uparrow = bind(VanillaSymbol,'\\Uparrow ','&uArr;');
+
+LatexCmds.to = bind(BinaryOperator,'\\to ','&rarr;');
+
+LatexCmds.rarr = LatexCmds.rightarrow = bind(VanillaSymbol,'\\rightarrow ','&rarr;');
+
+LatexCmds.implies = bind(BinaryOperator,'\\Rightarrow ','&rArr;');
+
+LatexCmds.rArr = LatexCmds.Rightarrow = bind(VanillaSymbol,'\\Rightarrow ','&rArr;');
+
+LatexCmds.gets = bind(BinaryOperator,'\\gets ','&larr;');
+
+LatexCmds.larr = LatexCmds.leftarrow = bind(VanillaSymbol,'\\leftarrow ','&larr;');
+
+LatexCmds.impliedby = bind(BinaryOperator,'\\Leftarrow ','&lArr;');
+
+LatexCmds.lArr = LatexCmds.Leftarrow = bind(VanillaSymbol,'\\Leftarrow ','&lArr;');
+
+LatexCmds.harr = LatexCmds.lrarr = LatexCmds.leftrightarrow =
+  bind(VanillaSymbol,'\\leftrightarrow ','&harr;');
+
+LatexCmds.iff = bind(BinaryOperator,'\\Leftrightarrow ','&hArr;');
+
+LatexCmds.hArr = LatexCmds.lrArr = LatexCmds.Leftrightarrow =
+  bind(VanillaSymbol,'\\Leftrightarrow ','&hArr;');
+
+LatexCmds.Re = LatexCmds.Real = LatexCmds.real = bind(VanillaSymbol,'\\Re ','&real;');
+
+LatexCmds.Im = LatexCmds.imag =
+LatexCmds.image = LatexCmds.imagin = LatexCmds.imaginary = LatexCmds.Imaginary =
+  bind(VanillaSymbol,'\\Im ','&image;');
+
+LatexCmds.part = LatexCmds.partial = bind(VanillaSymbol,'\\partial ','&part;');
+
+LatexCmds.inf = LatexCmds.infin = LatexCmds.infty = LatexCmds.infinity =
+  bind(VanillaSymbol,'\\infty ','&infin;');
+
+LatexCmds.alef = LatexCmds.alefsym = LatexCmds.aleph = LatexCmds.alephsym =
+  bind(VanillaSymbol,'\\aleph ','&alefsym;');
+
+LatexCmds.xist = //LOL
+LatexCmds.xists = LatexCmds.exist = LatexCmds.exists =
+  bind(VanillaSymbol,'\\exists ','&exist;');
+
+LatexCmds.and = LatexCmds.land = LatexCmds.wedge =
+  bind(VanillaSymbol,'\\wedge ','&and;');
+
+LatexCmds.or = LatexCmds.lor = LatexCmds.vee = bind(VanillaSymbol,'\\vee ','&or;');
+
+LatexCmds.o = LatexCmds.O =
+LatexCmds.empty = LatexCmds.emptyset =
+LatexCmds.oslash = LatexCmds.Oslash =
+LatexCmds.nothing = LatexCmds.varnothing =
+  bind(BinaryOperator,'\\varnothing ','&empty;');
+
+LatexCmds.cup = LatexCmds.union = bind(BinaryOperator,'\\cup ','&cup;');
+
+LatexCmds.cap = LatexCmds.intersect = LatexCmds.intersection =
+  bind(BinaryOperator,'\\cap ','&cap;');
+
+LatexCmds.deg = LatexCmds.degree = bind(VanillaSymbol,'^\\circ ','&deg;');
+
+LatexCmds.ang = LatexCmds.angle = bind(VanillaSymbol,'\\angle ','&ang;');
+
+
+var NonItalicizedFunction = P(Symbol, function(_, _super) {
+  _.init = function(fn) {
+    _super.init.call(this, '\\'+fn+' ', '<span>'+fn+'</span>');
+  };
+  _.respace = function()
+  {
+    this.jQ[0].className =
+      (this[R] instanceof SupSub || this[R] instanceof Bracket) ?
+      '' : 'non-italicized-function';
+  };
+});
+
+LatexCmds.ln =
+LatexCmds.lg =
+LatexCmds.log =
+LatexCmds.span =
+LatexCmds.proj =
+LatexCmds.det =
+LatexCmds.dim =
+LatexCmds.min =
+LatexCmds.max =
+LatexCmds.mod =
+LatexCmds.lcm =
+LatexCmds.gcd =
+LatexCmds.gcf =
+LatexCmds.hcf =
+LatexCmds.lim = NonItalicizedFunction;
+
+(function() {
+  var trig = ['sin', 'cos', 'tan', 'sec', 'cosec', 'csc', 'cotan', 'cot'];
+  for (var i in trig) {
+    LatexCmds[trig[i]] =
+    LatexCmds[trig[i]+'h'] =
+    LatexCmds['a'+trig[i]] = LatexCmds['arc'+trig[i]] =
+    LatexCmds['a'+trig[i]+'h'] = LatexCmds['arc'+trig[i]+'h'] =
+      NonItalicizedFunction;
+  }
+}());
+
+// Parser MathCommand
+var latexMathParser = (function() {
+  function commandToBlock(cmd) {
+    var block = MathBlock();
+    cmd.adopt(block, 0, 0);
+    return block;
+  }
+  function joinBlocks(blocks) {
+    var firstBlock = blocks[0] || MathBlock();
+
+    for (var i = 1; i < blocks.length; i += 1) {
+      blocks[i].children().adopt(firstBlock, firstBlock.ends[R], 0);
+    }
+
+    return firstBlock;
+  }
+
+  var string = Parser.string;
+  var regex = Parser.regex;
+  var letter = Parser.letter;
+  var any = Parser.any;
+  var optWhitespace = Parser.optWhitespace;
+  var succeed = Parser.succeed;
+  var fail = Parser.fail;
+
+  // Parsers yielding MathCommands
+  var variable = letter.map(Variable);
+  var symbol = regex(/^[^${}\\_^]/).map(VanillaSymbol);
+
+  var controlSequence =
+    regex(/^[^\\a-eg-zA-Z]/) // hotfix #164; match MathBlock::write
+    .or(string('\\').then(
+      regex(/^[a-z]+/i)
+      .or(regex(/^\s+/).result(' '))
+      .or(any)
+    )).then(function(ctrlSeq) {
+      var cmdKlass = LatexCmds[ctrlSeq];
+
+      if (cmdKlass) {
+        return cmdKlass(ctrlSeq).parser();
+      }
+      else {
+        return fail('unknown command: \\'+ctrlSeq);
+      }
+    })
+  ;
+
+  var command =
+    controlSequence
+    .or(variable)
+    .or(symbol)
+  ;
+
+  // Parsers yielding MathBlocks
+  var mathGroup = string('{').then(function() { return mathSequence; }).skip(string('}'));
+  var mathBlock = optWhitespace.then(mathGroup.or(command.map(commandToBlock)));
+  var mathSequence = mathBlock.many().map(joinBlocks).skip(optWhitespace);
+
+  var optMathBlock =
+    string('[').then(
+      mathBlock.then(function(block) {
+        return block.join('latex') !== ']' ? succeed(block) : fail();
+      })
+      .many().map(joinBlocks).skip(optWhitespace)
+    ).skip(string(']'))
+  ;
+
+  var latexMath = mathSequence;
+
+  latexMath.block = mathBlock;
+  latexMath.optBlock = optMathBlock;
+  return latexMath;
+})();
+/********************************************
+ * Cursor and Selection "singleton" classes
+ *******************************************/
+
+/* The main thing that manipulates the Math DOM. Makes sure to manipulate the
+HTML DOM to match. */
+
+/* Sort of singletons, since there should only be one per editable math
+textbox, but any one HTML document can contain many such textboxes, so any one
+JS environment could actually contain many instances. */
+
+//A fake cursor in the fake textbox that the math is rendered in.
+var Cursor = P(Point, function(_) {
+  _.init = function(root) {
+    this.parent = this.root = root;
+    var jQ = this.jQ = this._jQ = $('<span class="cursor">&zwj;</span>');
+
+    //closured for setInterval
+    this.blink = function(){ jQ.toggleClass('blink'); };
+
+    this.upDownCache = {};
+  };
+
+  _.show = function() {
+    this.jQ = this._jQ.removeClass('blink');
+    if ('intervalId' in this) //already was shown, just restart interval
+      clearInterval(this.intervalId);
+    else { //was hidden and detached, insert this.jQ back into HTML DOM
+      if (this[R]) {
+        if (this.selection && this.selection.ends[L][L] === this[L])
+          this.jQ.insertBefore(this.selection.jQ);
+        else
+          this.jQ.insertBefore(this[R].jQ.first());
+      }
+      else
+        this.jQ.appendTo(this.parent.jQ);
+      this.parent.focus();
+    }
+    this.intervalId = setInterval(this.blink, 500);
+    return this;
+  };
+  _.hide = function() {
+    if ('intervalId' in this)
+      clearInterval(this.intervalId);
+    delete this.intervalId;
+    this.jQ.detach();
+    this.jQ = $();
+    return this;
+  };
+
+  _.withDirInsertAt = function(dir, parent, withDir, oppDir) {
+    var oldParent = this.parent;
+    this.parent = parent;
+    this[dir] = withDir;
+    this[-dir] = oppDir;
+    oldParent.blur();
+  };
+  _.insDirOf = function(dir, el) {
+    prayDirection(dir);
+    this.withDirInsertAt(dir, el.parent, el[dir], el);
+    this.parent.jQ.addClass('hasCursor');
+    this.jQ.insDirOf(dir, el.jQ);
+    return this;
+  };
+  _.insLeftOf = function(el) { return this.insDirOf(L, el); };
+  _.insRightOf = function(el) { return this.insDirOf(R, el); };
+
+  _.insAtDirEnd = function(dir, el) {
+    prayDirection(dir);
+    this.withDirInsertAt(dir, el, 0, el.ends[dir]);
+
+    // never insert before textarea
+    if (dir === L && el.textarea) {
+      this.jQ.insDirOf(-dir, el.textarea);
+    }
+    else {
+      this.jQ.insAtDirEnd(dir, el.jQ);
+    }
+
+    el.focus();
+
+    return this;
+  };
+  _.insAtLeftEnd = function(el) { return this.insAtDirEnd(L, el); };
+  _.insAtRightEnd = function(el) { return this.insAtDirEnd(R, el); };
+
+  _.hopDir = function(dir) {
+    prayDirection(dir);
+
+    this.jQ.insDirOf(dir, this[dir].jQ);
+    this[-dir] = this[dir];
+    this[dir] = this[dir][dir];
+    return this;
+  };
+  _.hopLeft = function() { return this.hopDir(L); };
+  _.hopRight = function() { return this.hopDir(R); };
+
+  _.moveDirWithin = function(dir, block) {
+    prayDirection(dir);
+
+    if (this[dir]) {
+      if (this[dir].ends[-dir]) this.insAtDirEnd(-dir, this[dir].ends[-dir]);
+      else this.hopDir(dir);
+    }
+    else {
+      // we're at the beginning/end of the containing block, so do nothing
+      if (this.parent === block) return;
+
+      if (this.parent[dir]) this.insAtDirEnd(-dir, this.parent[dir]);
+      else this.insDirOf(dir, this.parent.parent);
+    }
+  };
+  _.moveLeftWithin = function(block) {
+    return this.moveDirWithin(L, block);
+  };
+  _.moveRightWithin = function(block) {
+    return this.moveDirWithin(R, block);
+  };
+  _.moveDir = function(dir) {
+    prayDirection(dir);
+
+    clearUpDownCache(this);
+
+    if (this.selection)  {
+      this.insDirOf(dir, this.selection.ends[dir]).clearSelection();
+    }
+    else {
+      this.moveDirWithin(dir, this.root);
+    }
+
+    return this.show();
+  };
+  _.moveLeft = function() { return this.moveDir(L); };
+  _.moveRight = function() { return this.moveDir(R); };
+
+  /**
+   * moveUp and moveDown have almost identical algorithms:
+   * - first check left and right, if so insAtLeft/RightEnd of them
+   * - else check the parent's 'up'/'down' property - if it's a function,
+   *   call it with the cursor as the sole argument and use the return value.
+   *
+   *   Given undefined, will bubble up to the next ancestor block.
+   *   Given false, will stop bubbling.
+   *   Given a MathBlock,
+   *     + moveUp will insAtRightEnd of it
+   *     + moveDown will insAtLeftEnd of it
+   *
+   */
+  _.moveUp = function() { return moveUpDown(this, 'up'); };
+  _.moveDown = function() { return moveUpDown(this, 'down'); };
+  function moveUpDown(self, dir) {
+    if (self[R][dir]) self.insAtLeftEnd(self[R][dir]);
+    else if (self[L][dir]) self.insAtRightEnd(self[L][dir]);
+    else {
+      var ancestorBlock = self.parent;
+      do {
+        var prop = ancestorBlock[dir];
+        if (prop) {
+          if (typeof prop === 'function') prop = ancestorBlock[dir](self);
+          if (prop === false || prop instanceof MathBlock) {
+            self.upDownCache[ancestorBlock.id] = Point(self.parent, self[L], self[R]);
+
+            if (prop instanceof MathBlock) {
+              var cached = self.upDownCache[prop.id];
+
+              if (cached) {
+                if (cached[R]) {
+                  self.insLeftOf(cached[R]);
+                } else {
+                  self.insAtRightEnd(cached.parent);
+                }
+              } else {
+                var pageX = offset(self).left;
+                self.insAtRightEnd(prop);
+                self.seekHoriz(pageX, prop);
+              }
+            }
+            break;
+          }
+        }
+        ancestorBlock = ancestorBlock.parent.parent;
+      } while (ancestorBlock);
+    }
+
+    return self.clearSelection().show();
+  }
+
+  _.seek = function(target, pageX, pageY) {
+    clearUpDownCache(this);
+    var cmd, block, cursor = this.clearSelection().show();
+    if (target.hasClass('empty')) {
+      cursor.insAtLeftEnd(MathElement[target.attr(mqBlockId)]);
+      return cursor;
+    }
+
+    cmd = MathElement[target.attr(mqCmdId)];
+    if (cmd instanceof Symbol) { //insert at whichever side is closer
+      if (target.outerWidth() > 2*(pageX - target.offset().left))
+        cursor.insLeftOf(cmd);
+      else
+        cursor.insRightOf(cmd);
+
+      return cursor;
+    }
+    if (!cmd) {
+      block = MathElement[target.attr(mqBlockId)];
+      if (!block) { //if no MathQuill data, try parent, if still no, just start from the root
+        target = target.parent();
+        cmd = MathElement[target.attr(mqCmdId)];
+        if (!cmd) {
+          block = MathElement[target.attr(mqBlockId)];
+          if (!block) block = cursor.root;
+        }
+      }
+    }
+
+    if (cmd)
+      cursor.insRightOf(cmd);
+    else
+      cursor.insAtRightEnd(block);
+
+    return cursor.seekHoriz(pageX, cursor.root);
+  };
+  _.seekHoriz = function(pageX, block) {
+    //move cursor to position closest to click
+    var cursor = this;
+    var dist = offset(cursor).left - pageX;
+    var leftDist;
+
+    do {
+      cursor.moveLeftWithin(block);
+      leftDist = dist;
+      dist = offset(cursor).left - pageX;
+    }
+    while (dist > 0 && (cursor[L] || cursor.parent !== block));
+
+    if (-dist > leftDist) cursor.moveRightWithin(block);
+
+    return cursor;
+  };
+  function offset(self) {
+    //in Opera 11.62, .getBoundingClientRect() and hence jQuery::offset()
+    //returns all 0's on inline elements with negative margin-right (like
+    //the cursor) at the end of their parent, so temporarily remove the
+    //negative margin-right when calling jQuery::offset()
+    //Opera bug DSK-360043
+    //http://bugs.jquery.com/ticket/11523
+    //https://github.com/jquery/jquery/pull/717
+    var offset = self.jQ.removeClass('cursor').offset();
+    self.jQ.addClass('cursor');
+    return offset;
+  }
+  _.writeLatex = function(latex) {
+    var self = this;
+    clearUpDownCache(self);
+    self.show().deleteSelection();
+
+    var all = Parser.all;
+    var eof = Parser.eof;
+
+    var block = latexMathParser.skip(eof).or(all.result(false)).parse(latex);
+
+    if (block) {
+      block.children().adopt(self.parent, self[L], self[R]);
+      MathElement.jQize(block.join('html')).insertBefore(self.jQ);
+      self[L] = block.ends[R];
+      block.finalizeInsert();
+      self.parent.bubble('redraw');
+    }
+
+    return this.hide();
+  };
+  _.write = function(ch) {
+    var seln = this.prepareWrite();
+    return this.insertCh(ch, seln);
+  };
+  _.insertCh = function(ch, replacedFragment) {
+    this.parent.write(this, ch, replacedFragment);
+    return this;
+  };
+  _.insertCmd = function(latexCmd, replacedFragment) {
+    var cmd = LatexCmds[latexCmd];
+    if (cmd) {
+      cmd = cmd(latexCmd);
+      if (replacedFragment) cmd.replaces(replacedFragment);
+      cmd.createLeftOf(this);
+    }
+    else {
+      cmd = TextBlock();
+      cmd.replaces(latexCmd);
+      cmd.ends[L].focus = function(){ delete this.focus; return this; };
+      cmd.createLeftOf(this);
+      this.insRightOf(cmd);
+      if (replacedFragment)
+        replacedFragment.remove();
+    }
+    return this;
+  };
+  _.unwrapGramp = function() {
+    var gramp = this.parent.parent;
+    var greatgramp = gramp.parent;
+    var rightward = gramp[R];
+    var cursor = this;
+
+    var leftward = gramp[L];
+    gramp.disown().eachChild(function(uncle) {
+      if (uncle.isEmpty()) return;
+
+      uncle.children()
+        .adopt(greatgramp, leftward, rightward)
+        .each(function(cousin) {
+          cousin.jQ.insertBefore(gramp.jQ.first());
+        })
+      ;
+
+      leftward = uncle.ends[R];
+    });
+
+    if (!this[R]) { //then find something to be rightward to insLeftOf
+      if (this[L])
+        this[R] = this[L][R];
+      else {
+        while (!this[R]) {
+          this.parent = this.parent[R];
+          if (this.parent)
+            this[R] = this.parent.ends[L];
+          else {
+            this[R] = gramp[R];
+            this.parent = greatgramp;
+            break;
+          }
+        }
+      }
+    }
+    if (this[R])
+      this.insLeftOf(this[R]);
+    else
+      this.insAtRightEnd(greatgramp);
+
+    gramp.jQ.remove();
+
+    if (gramp[L])
+      gramp[L].respace();
+    if (gramp[R])
+      gramp[R].respace();
+  };
+  _.deleteDir = function(dir) {
+    prayDirection(dir);
+    clearUpDownCache(this);
+    this.show();
+
+    if (this.deleteSelection()); // pass
+    else if (this[dir]) {
+      if (this[dir].isEmpty())
+        this[dir] = this[dir].remove()[dir];
+      else
+        this.selectDir(dir);
+    }
+    else if (this.parent !== this.root) {
+      if (this.parent.parent.isEmpty())
+        return this.insDirOf(-dir, this.parent.parent).deleteDir(dir);
+      else
+        this.unwrapGramp();
+    }
+
+    if (this[L])
+      this[L].respace();
+    if (this[R])
+      this[R].respace();
+    this.parent.bubble('redraw');
+
+    return this;
+  };
+  _.backspace = function() { return this.deleteDir(L); };
+  _.deleteForward = function() { return this.deleteDir(R); };
+  _.selectFrom = function(anticursor) {
+    //find ancestors of each with common parent
+    var oneA = this, otherA = anticursor; //one ancestor, the other ancestor
+    loopThroughAncestors: while (true) {
+      for (var oneI = this; oneI !== oneA.parent.parent; oneI = oneI.parent.parent) //one intermediate, the other intermediate
+        if (oneI.parent === otherA.parent) {
+          left = oneI;
+          right = otherA;
+          break loopThroughAncestors;
+        }
+
+      for (var otherI = anticursor; otherI !== otherA.parent.parent; otherI = otherI.parent.parent)
+        if (oneA.parent === otherI.parent) {
+          left = oneA;
+          right = otherI;
+          break loopThroughAncestors;
+        }
+
+      if (oneA.parent.parent)
+        oneA = oneA.parent.parent;
+      if (otherA.parent.parent)
+        otherA = otherA.parent.parent;
+    }
+    //figure out which is leftward and which is rightward
+    var left, right, leftRight;
+    if (left[R] !== right) {
+      for (var rightward = left; rightward; rightward = rightward[R]) {
+        if (rightward === right[L]) {
+          leftRight = true;
+          break;
+        }
+      }
+      if (!leftRight) {
+        leftRight = right;
+        right = left;
+        left = leftRight;
+      }
+    }
+    this.hide().selection = Selection(left[L][R] || left.parent.ends[L], right[R][L] || right.parent.ends[R]);
+    this.insRightOf(right[R][L] || right.parent.ends[R]);
+    this.root.selectionChanged();
+  };
+  _.selectDir = function(dir) {
+    prayDirection(dir);
+    clearUpDownCache(this);
+
+    if (this.selection) {
+      // if cursor is at the (dir) edge of selection
+      if (this.selection.ends[dir] === this[-dir]) {
+        // then extend (dir) if possible
+        if (this[dir]) this.hopDir(dir).selection.extendDir(dir);
+        // else level up if possible
+        else if (this.parent !== this.root) {
+          this.insDirOf(dir, this.parent.parent).selection.levelUp();
+        }
+      }
+      // else cursor is at the (-dir) edge of selection, retract if possible
+      else {
+        this.hopDir(dir);
+
+        // clear the selection if we only have one thing selected
+        if (this.selection.ends[dir] === this.selection.ends[-dir]) {
+          this.clearSelection().show();
+          return;
+        }
+
+        this.selection.retractDir(dir);
+      }
+    }
+    // no selection, create one
+    else {
+      if (this[dir]) this.hopDir(dir);
+      // else edge of a block
+      else {
+        if (this.parent === this.root) return;
+
+        this.insDirOf(dir, this.parent.parent);
+      }
+
+      this.hide().selection = Selection(this[-dir]);
+    }
+
+    this.root.selectionChanged();
+  };
+  _.selectLeft = function() { return this.selectDir(L); };
+  _.selectRight = function() { return this.selectDir(R); };
+
+  function clearUpDownCache(self) {
+    self.upDownCache = {};
+  }
+
+  _.prepareMove = function() {
+    clearUpDownCache(this);
+    return this.show().clearSelection();
+  };
+  _.prepareEdit = function() {
+    clearUpDownCache(this);
+    return this.show().deleteSelection();
+  };
+  _.prepareWrite = function() {
+    clearUpDownCache(this);
+    return this.show().replaceSelection();
+  };
+
+  _.clearSelection = function() {
+    if (this.selection) {
+      this.selection.clear();
+      delete this.selection;
+      this.root.selectionChanged();
+    }
+    return this;
+  };
+  _.deleteSelection = function() {
+    if (!this.selection) return false;
+
+    this[L] = this.selection.ends[L][L];
+    this[R] = this.selection.ends[R][R];
+    this.selection.remove();
+    this.root.selectionChanged();
+    return delete this.selection;
+  };
+  _.replaceSelection = function() {
+    var seln = this.selection;
+    if (seln) {
+      this[L] = seln.ends[L][L];
+      this[R] = seln.ends[R][R];
+      delete this.selection;
+    }
+    return seln;
+  };
+});
+
+var Selection = P(MathFragment, function(_, _super) {
+  _.init = function() {
+    var frag = this;
+    _super.init.apply(frag, arguments);
+
+    frag.jQwrap(frag.jQ);
+  };
+  _.jQwrap = function(children) {
+    this.jQ = children.wrapAll('<span class="selection"></span>').parent();
+      //can't do wrapAll(this.jQ = $(...)) because wrapAll will clone it
+  };
+  _.adopt = function() {
+    this.jQ.replaceWith(this.jQ = this.jQ.children());
+    return _super.adopt.apply(this, arguments);
+  };
+  _.clear = function() {
+    this.jQ.replaceWith(this.jQ.children());
+    return this;
+  };
+  _.levelUp = function() {
+    var seln = this,
+      gramp = seln.ends[L] = seln.ends[R] = seln.ends[R].parent.parent;
+    seln.clear().jQwrap(gramp.jQ);
+    return seln;
+  };
+  _.extendDir = function(dir) {
+    prayDirection(dir);
+    this.ends[dir] = this.ends[dir][dir];
+    this.ends[dir].jQ.insAtDirEnd(dir, this.jQ);
+    return this;
+  };
+  _.extendLeft = function() { return this.extendDir(L); };
+  _.extendRight = function() { return this.extendDir(R); };
+
+  _.retractDir = function(dir) {
+    prayDirection(dir);
+    this.ends[-dir].jQ.insDirOf(-dir, this.jQ);
+    this.ends[-dir] = this.ends[-dir][dir];
+  };
+  _.retractRight = function() { return this.retractDir(R); };
+  _.retractLeft = function() { return this.retractDir(L); };
+});
+/*********************************************************
+ * The actual jQuery plugin and document ready handlers.
+ ********************************************************/
+
+//The publicy exposed method of jQuery.prototype, available (and meant to be
+//called) on jQuery-wrapped HTML DOM elements.
+jQuery.fn.mathquill = function(cmd, latex) {
+  switch (cmd) {
+  case 'redraw':
+    return this.each(function() {
+      var blockId = $(this).attr(mqBlockId),
+        rootBlock = blockId && MathElement[blockId];
+      if (rootBlock) {
+        (function postOrderRedraw(el) {
+          el.eachChild(postOrderRedraw);
+          if (el.redraw) el.redraw();
+        }(rootBlock));
+      }
+    });
+  case 'revert':
+    return this.each(function() {
+      var blockId = $(this).attr(mqBlockId),
+        block = blockId && MathElement[blockId];
+      if (block && block.revert)
+        block.revert();
+    });
+  case 'latex':
+    if (arguments.length > 1) {
+      return this.each(function() {
+        var blockId = $(this).attr(mqBlockId),
+          block = blockId && MathElement[blockId];
+        if (block)
+          block.renderLatex(latex);
+      });
+    }
+
+    var blockId = $(this).attr(mqBlockId),
+      block = blockId && MathElement[blockId];
+    return block && block.latex();
+  case 'text':
+    var blockId = $(this).attr(mqBlockId),
+      block = blockId && MathElement[blockId];
+    return block && block.text();
+  case 'html':
+    return this.html().replace(/ ?hasCursor|hasCursor /, '')
+      .replace(/ class=(""|(?= |>))/g, '')
+      .replace(/<span class="?cursor( blink)?"?><\/span>/i, '')
+      .replace(/<span class="?textarea"?><textarea><\/textarea><\/span>/i, '');
+  case 'write':
+    if (arguments.length > 1)
+      return this.each(function() {
+        var blockId = $(this).attr(mqBlockId),
+          block = blockId && MathElement[blockId],
+          cursor = block && block.cursor;
+
+        if (cursor)
+          cursor.writeLatex(latex).parent.blur();
+      });
+  case 'cmd':
+    if (arguments.length > 1)
+      return this.each(function() {
+        var blockId = $(this).attr(mqBlockId),
+          block = blockId && MathElement[blockId],
+          cursor = block && block.cursor;
+
+        if (cursor) {
+          var seln = cursor.prepareWrite();
+          if (/^\\[a-z]+$/i.test(latex)) cursor.insertCmd(latex.slice(1), seln);
+          else cursor.insertCh(latex, seln);
+          cursor.hide().parent.blur();
+        }
+      });
+  default:
+    var textbox = cmd === 'textbox',
+      editable = textbox || cmd === 'editable',
+      RootBlock = textbox ? RootTextBlock : RootMathBlock;
+    return this.each(function() {
+      createRoot($(this), RootBlock(), textbox, editable);
+    });
+  }
+};
+
+//on document ready, mathquill-ify all `<tag class="mathquill-*">latex</tag>`
+//elements according to their CSS class.
+jQuery(function() {
+  jQuery('.mathquill-editable:not(.mathquill-rendered-math)').mathquill('editable');
+  jQuery('.mathquill-textbox:not(.mathquill-rendered-math)').mathquill('textbox');
+  jQuery('.mathquill-embedded-latex').mathquill();
+});
+
+
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.min.js
new file mode 100644
index 0000000..7ad7e0c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/third-party/mathquill/mathquill.min.js
@@ -0,0 +1,2 @@
+(function(){function t(){}function e(t){var e=o.call(arguments,1);return function(){return t.apply(this,e)}}function n(t,e){if(!e)throw Error("prayer failed: "+t)}function i(t){n("a direction was passed",t===u||t===p)}function r(e,n,i,r){function s(){g=a;var t=c.selection?"$"+c.selection.latex()+"$":"";w.select(t)}function o(){l.detach()}var c,l,m,g,b,v,w,x=e.contents().detach();return i||e.addClass("mathquill-rendered-math"),n.jQ=e.attr(ce,n.id),n.revert=function(){e.empty().unbind(".mathquill").removeClass("mathquill-rendered-math mathquill-editable mathquill-textbox").append(x)},c=n.cursor=re(n),n.renderLatex(x.text()),l=n.textarea=f('<span class="textarea"><textarea></textarea></span>'),m=l.children(),n.selectionChanged=function(){g===a&&(g=setTimeout(s)),O(e[0])},e.bind("selectstart.mathquill",function(t){t.target!==m[0]&&t.preventDefault(),t.stopPropagation()}),v=c.blink,e.bind("mousedown.mathquill",function(n){function i(t){return c.seek(f(t.target),t.pageX,t.pageY),(c[u]!==b[u]||c.parent!==b.parent)&&c.selectFrom(b),!1}function s(t){return delete t.target,i(t)}function o(t){b=a,c.blink=v,c.selection||(r?c.show():l.detach()),e.unbind("mousemove",i),f(t.target.ownerDocument).unbind("mousemove",s).unbind("mouseup",o)}return setTimeout(function(){m.focus()}),c.blink=t,c.seek(f(n.target),n.pageX,n.pageY),b=d(c.parent,c[u],c[p]),r||e.prepend(l),e.mousemove(i),f(n.target.ownerDocument).mousemove(s).mouseup(o),!1}),r?(w=h(m,{container:e,key:function(t,e){c.parent.bubble("onKey",t,e)},text:function(t){c.parent.bubble("onText",t)},cut:function(t){c.selection&&setTimeout(function(){c.prepareEdit(),c.parent.bubble("redraw")}),t.stopPropagation()},paste:function(t){t="$"===t.slice(0,1)&&"$"===t.slice(-1)?t.slice(1,-1):"\\text{"+t+"}",c.writeLatex(t).show()}}),e.prepend(l),e.addClass("mathquill-editable"),i&&e.addClass("mathquill-textbox"),m.focus(function(t){c.parent||c.insAtRightEnd(n),c.parent.jQ.addClass("hasCursor"),c.selection?(c.selection.jQ.removeClass("blur"),setTimeout(n.selectionChanged)):c.show(),t.stopPropagation()}).blur(function(t){c.hide().parent.blur(),c.selection&&c.selection.jQ.addClass("blur"),t.stopPropagation()}),e.bind("focus.mathquill blur.mathquill",function(t){m.trigger(t)}).blur(),a):(w=h(m,{container:e}),e.bind("cut paste",!1).bind("copy",s).prepend('<span class="selectable">$'+n.latex()+"$</span>"),m.blur(function(){c.clearSelection(),setTimeout(o)}),a)}function s(t,e,n){return c(K,{ctrlSeq:t,htmlTemplate:"<"+e+" "+n+">&0</"+e+">"})}var a,o,c,h,l,u,p,f,d,m,g,b,v,w,x,j,k,q,y,Q,C,S,L,D,O,E,A,R,T,z,B,I,$,_,W,M,F,P,U,H,K,N,G,X,Z,Y,J,V,te,ee,ne,ie,re,se,ae=window.jQuery,oe="mathquill-command-id",ce="mathquill-block-id",he=Math.min;Math.max,o=[].slice,c=function(t,e,n){function i(t){return"object"==typeof t}function r(t){return"function"==typeof t}function s(){}function a(o,c){function h(){var t=new l;return r(t.init)&&t.init.apply(t,arguments),t}function l(){}var u,p,f;return c===n&&(c=o,o=Object),h.Bare=l,u=s[t]=o[t],p=l[t]=h[t]=new s,p.constructor=h,h.mixin=function(e){return l[t]=h[t]=a(h,e)[t],h},(h.open=function(t){if(f={},r(t)?f=t.call(h,p,u,h,o):i(t)&&(f=t),i(f))for(var n in f)e.call(f,n)&&(p[n]=f[n]);return r(p.init)||(p.init=o),h})(c)}return a}("prototype",{}.hasOwnProperty),h=function(){function e(t){var e,i=t.which||t.keyCode,r=n[i],s=[];return t.ctrlKey&&s.push("Ctrl"),t.originalEvent&&t.originalEvent.metaKey&&s.push("Meta"),t.altKey&&s.push("Alt"),t.shiftKey&&s.push("Shift"),e=r||String.fromCharCode(i),s.length||r?(s.push(e),s.join("-")):e}var n={8:"Backspace",9:"Tab",10:"Enter",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Esc",32:"Spacebar",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",45:"Insert",46:"Del",144:"NumLock"};return function(n,i){function r(t){k=t,clearTimeout(j),j=setTimeout(t)}function s(e){k(),k=t,clearTimeout(j),w.val(e),e&&w[0].select()}function a(){var t=w[0];return"selectionStart"in t?t.selectionStart!==t.selectionEnd:!1}function o(t){var e=w.val();w.val(""),e&&t(e)}function c(){g(e(q),q)}function h(t){q=t,y=null,c()}function l(t){q&&y&&c(),y=t,r(u)}function u(){a()||o(m)}function p(){q=y=null}function f(){w.focus(),r(d)}function d(){o(b)}var m,g,b,v,w,x,j,k,q=null,y=null;return i||(i={}),m=i.text||t,g=i.key||t,b=i.paste||t,v=i.cut||t,w=ae(n),x=ae(i.container||w),k=t,x.bind("keydown keypress input keyup focusout paste",function(){k()}),x.bind({keydown:h,keypress:l,focusout:p,cut:v,paste:f}),{select:s}}}(),l=c(function(t,e,i){function r(t,e){throw t=t?"'"+t+"'":"EOF","Parse Error: "+e+" at "+t}var s,a,o;t.init=function(t){this._=t},t.parse=function(t){function e(t,e){return e}return this.skip(o)._(t,e,r)},t.or=function(t){n("or is passed a parser",t instanceof i);var e=this;return i(function(n,i,r){function s(){return t._(n,i,r)}return e._(n,i,s)})},t.then=function(t){var e=this;return i(function(r,s,a){function o(e,r){var o=t instanceof i?t:t(r);return n("a parser is returned",o instanceof i),o._(e,s,a)}return e._(r,o,a)})},t.many=function(){var t=this;return i(function(e,n){function i(t,n){return e=t,s.push(n),!0}function r(){return!1}for(var s=[];t._(e,i,r););return n(e,s)})},t.times=function(t,e){2>arguments.length&&(e=t);var n=this;return i(function(i,r,s){function a(t,e){return u.push(e),i=t,!0}function o(t,e){return h=e,i=t,!1}function c(){return!1}var h,l,u=[],p=!0;for(l=0;t>l;l+=1)if(p=n._(i,a,o),!p)return s(i,h);for(;e>l&&p;l+=1)p=n._(i,a,c);return r(i,u)})},t.result=function(t){return this.then(a(t))},t.atMost=function(t){return this.times(0,t)},t.atLeast=function(t){var e=this;return e.times(t).then(function(t){return e.many().map(function(e){return t.concat(e)})})},t.map=function(t){return this.then(function(e){return a(t(e))})},t.skip=function(t){return this.then(function(e){return t.result(e)})},this.string=function(t){var e=t.length,n="expected '"+t+"'";return i(function(i,r,s){var a=i.slice(0,e);return a===t?r(i.slice(e),a):s(i,n)})},s=this.regex=function(t){n("regexp parser is anchored","^"===(""+t).charAt(1));var e="expected "+t;return i(function(n,i,r){var s,a=t.exec(n);return a?(s=a[0],i(n.slice(s.length),s)):r(n,e)})},a=i.succeed=function(t){return i(function(e,n){return n(e,t)})},i.fail=function(t){return i(function(e,n,i){return i(e,t)})},i.letter=s(/^[a-z]/i),i.letters=s(/^[a-z]*/i),i.digit=s(/^[0-9]/),i.digits=s(/^[0-9]*/),i.whitespace=s(/^\s+/),i.optWhitespace=s(/^\s*/),i.any=i(function(t,e,n){return t?e(t.slice(1),t.charAt(0)):n(t,"expected any character")}),i.all=i(function(t,e){return e("",t)}),o=i.eof=i(function(t,e,n){return t?n(t,"expected EOF"):e(t,t)})}),u=-1,p=1,f=c(ae,function(t){t.insDirOf=function(t,e){return t===u?this.insertBefore(e.first()):this.insertAfter(e.last())},t.insAtDirEnd=function(t,e){return t===u?this.prependTo(e):this.appendTo(e)}}),d=c(function(t){t.parent=0,t[u]=0,t[p]=0,t.init=function(t,e,n){this.parent=t,this[u]=e,this[p]=n}}),m=c(function(t){t[u]=0,t[p]=0,t.parent=0,t.init=function(){this.ends={},this.ends[u]=0,this.ends[p]=0},t.children=function(){return g(this.ends[u],this.ends[p])},t.eachChild=function(t){return this.children().each(t)},t.foldChildren=function(t,e){return this.children().fold(t,e)},t.adopt=function(t,e,n){return g(this,this).adopt(t,e,n),this},t.disown=function(){return g(this,this).disown(),this}}),g=c(function(t){function e(t,e,i){n("a parent is always present",t),n("leftward is properly set up",function(){return e?e[p]===i&&e.parent===t:t.ends[u]===i}()),n("rightward is properly set up",function(){return i?i[u]===e&&i.parent===t:t.ends[p]===e}())}t.init=function(t,e){n("no half-empty fragments",!t==!e),this.ends={},t&&(n("left end node is passed to Fragment",t instanceof m),n("right end node is passed to Fragment",e instanceof m),n("leftEnd and rightEnd have the same parent",t.parent===e.parent),this.ends[u]=t,this.ends[p]=e)},t.adopt=function(t,n,i){var r,s,a;return e(t,n,i),r=this,r.disowned=!1,(s=r.ends[u])?(a=r.ends[p],n||(t.ends[u]=s),i?i[u]=a:t.ends[p]=a,r.ends[p][p]=i,r.each(function(e){e[u]=n,e.parent=t,n&&(n[p]=e),n=e}),r):this},t.disown=function(){var t,n,i=this,r=i.ends[u];return!r||i.disowned?i:(i.disowned=!0,t=i.ends[p],n=r.parent,e(n,r[u],r),e(n,t,t[p]),r[u]?r[u][p]=t[p]:n.ends[u]=t[p],t[p]?t[p][u]=r[u]:n.ends[p]=r[u],i)},t.each=function(t){var e=this,n=e.ends[u];if(!n)return e;for(;n!==e.ends[p][p]&&t.call(e,n)!==!1;n=n[p]);return e},t.fold=function(t,e){return this.each(function(n){t=e.call(this,t,n)}),t}}),b=function(){var t=0;return function(){return t+=1}}(),v=c(m,function(t,e){t.init=function(){e.init.call(this),this.id=b(),v[this.id]=this},t.toString=function(){return"[MathElement "+this.id+"]"},t.bubble=function(t){var e,n,i=o.call(arguments,1);for(e=this;e&&(n=e[t]&&e[t].apply(e,i),n!==!1);e=e.parent);return this},t.postOrder=function(t){var e,n=o.call(arguments,1);"string"==typeof t&&(e=t,t=function(t){e in t&&t[e].apply(t,n)}),function i(e){e.eachChild(i),t(e)}(this)},t.jQ=f(),t.jQadd=function(t){this.jQ=this.jQ.add(t)},this.jQize=function(t){var e=f(t);return e.find("*").andSelf().each(function(){var t=f(this),e=t.attr("mathquill-command-id"),n=t.attr("mathquill-block-id");e&&v[e].jQadd(t),n&&v[n].jQadd(t)}),e},t.finalizeInsert=function(){var t=this;t.postOrder("finalizeTree"),t.postOrder("blur"),t.postOrder("respace"),t[p].respace&&t[p].respace(),t[u].respace&&t[u].respace(),t.postOrder("redraw"),t.bubble("redraw")}}),w=c(v,function(e,i){e.init=function(t,e,n){var r=this;i.init.call(r),r.ctrlSeq||(r.ctrlSeq=t),e&&(r.htmlTemplate=e),n&&(r.textTemplate=n)},e.replaces=function(t){t.disown(),this.replacedFragment=t},e.isEmpty=function(){return this.foldChildren(!0,function(t,e){return t&&e.isEmpty()})},e.parser=function(){var t=ie.block,e=this;return t.times(e.numBlocks()).map(function(t){e.blocks=t;for(var n=0;t.length>n;n+=1)t[n].adopt(e,e.ends[p],0);return e})},e.createLeftOf=function(t){var e=this,n=e.replacedFragment;e.createBlocks(),v.jQize(e.html()),n&&(n.adopt(e.ends[u],0,0),n.jQ.appendTo(e.ends[u].jQ)),t.jQ.before(e.jQ),t[u]=e.adopt(t.parent,t[u],t[p]),e.finalizeInsert(t),e.placeCursor(t)},e.createBlocks=function(){var t,e,n=this,i=n.numBlocks(),r=n.blocks=Array(i);for(t=0;i>t;t+=1)e=r[t]=j(),e.adopt(n,n.ends[p],0)},e.respace=t,e.placeCursor=function(t){t.insAtRightEnd(this.foldChildren(this.ends[u],function(t,e){return t.isEmpty()?t:e}))},e.remove=function(){return this.disown(),this.jQ.remove(),this.postOrder(function(t){delete v[t.id]}),this},e.numBlocks=function(){var t=this.htmlTemplate.match(/&\d+/g);return t?t.length:0},e.html=function(){var t,e,i,r=this,s=r.blocks,a=" mathquill-command-id="+r.id,o=r.htmlTemplate.match(/<[^<>]+>|[^<>]+/g);for(n("no unmatched angle brackets",o.join("")===this.htmlTemplate),t=0,e=o[0];e;t+=1,e=o[t])if("/>"===e.slice(-2))o[t]=e.slice(0,-2)+a+"/>";else if("<"===e.charAt(0)){n("not an unmatched top-level close tag","/"!==e.charAt(1)),o[t]=e.slice(0,-1)+a+">",i=1;do t+=1,e=o[t],n("no missing close tags",e),"</"===e.slice(0,2)?i-=1:"<"===e.charAt(0)&&"/>"!==e.slice(-2)&&(i+=1);while(i>0)}return o.join("").replace(/>&(\d+)/g,function(t,e){return" mathquill-block-id="+s[e].id+">"+s[e].join("html")})},e.latex=function(){return this.foldChildren(this.ctrlSeq,function(t,e){return t+"{"+(e.latex()||" ")+"}"})},e.textTemplate=[""],e.text=function(){var t=this,e=0;return t.foldChildren(t.textTemplate[e],function(n,i){e+=1;var r=i.text();return n&&"("===t.textTemplate[e]&&"("===r[0]&&")"===r.slice(-1)?n+r.slice(1,-1)+t.textTemplate[e]:n+i.text()+(t.textTemplate[e]||"")})}}),x=c(w,function(e,n){e.init=function(t,e,i){i||(i=t&&t.length>1?t.slice(1):t),n.init.call(this,t,e,[i])},e.parser=function(){return l.succeed(this)},e.numBlocks=function(){return 0},e.replaces=function(t){t.remove()},e.createBlocks=t,e.latex=function(){return this.ctrlSeq},e.text=function(){return this.textTemplate},e.placeCursor=t,e.isEmpty=function(){return!0}}),j=c(v,function(t){t.join=function(t){return this.foldChildren("",function(e,n){return e+n[t]()})},t.latex=function(){return this.join("latex")},t.text=function(){return this.ends[u]===this.ends[p]?this.ends[u].text():"("+this.join("text")+")"},t.isEmpty=function(){return 0===this.ends[u]&&0===this.ends[p]},t.write=function(t,e,n){var i;i=e.match(/^[a-eg-zA-Z]$/)?X(e):(i=C[e]||S[e])?i(e):Z(e),n&&i.replaces(n),i.createLeftOf(t)},t.focus=function(){return this.jQ.addClass("hasCursor"),this.jQ.removeClass("empty"),this},t.blur=function(){return this.jQ.removeClass("hasCursor"),this.isEmpty()&&this.jQ.addClass("empty"),this}}),k=c(g,function(t,e){t.init=function(t,n){e.init.call(this,t,n||t),this.jQ=this.fold(f(),function(t,e){return e.jQ.add(t)})},t.latex=function(){return this.fold("",function(t,e){return t+e.latex()})},t.remove=function(){return this.jQ.remove(),this.each(function(t){t.postOrder(function(t){delete v[t.id]})}),this.disown()}}),q=c(j,function(t,e){t.latex=function(){return e.latex.call(this).replace(/(\\[a-z]+) (?![a-z])/gi,"$1")},t.text=function(){return this.foldChildren("",function(t,e){return t+e.text()})},t.renderLatex=function(t){var e=this.jQ;e.children().slice(1).remove(),this.ends[u]=this.ends[p]=0,delete this.cursor.selection,this.cursor.insAtRightEnd(this).writeLatex(t)},t.onKey=function(t,e){var n;switch(t){case"Ctrl-Shift-Backspace":case"Ctrl-Backspace":for(;this.cursor[u]||this.cursor.selection;)this.cursor.backspace();break;case"Shift-Backspace":case"Backspace":this.cursor.backspace();break;case"Esc":case"Tab":case"Spacebar":if(n=this.cursor.parent,n===this.cursor.root)return"Spacebar"===t&&e.preventDefault(),a;this.cursor.prepareMove(),n[p]?this.cursor.insAtLeftEnd(n[p]):this.cursor.insRightOf(n.parent);break;case"Shift-Tab":case"Shift-Esc":case"Shift-Spacebar":if(n=this.cursor.parent,n===this.cursor.root)return"Shift-Spacebar"===t&&e.preventDefault(),a;this.cursor.prepareMove(),n[u]?this.cursor.insAtRightEnd(n[u]):this.cursor.insLeftOf(n.parent);break;case"Enter":break;case"End":this.cursor.prepareMove().insAtRightEnd(this.cursor.parent);break;case"Ctrl-End":this.cursor.prepareMove().insAtRightEnd(this);break;case"Shift-End":for(;this.cursor[p];)this.cursor.selectRight();break;case"Ctrl-Shift-End":for(;this.cursor[p]||this.cursor.parent!==this;)this.cursor.selectRight();break;case"Home":this.cursor.prepareMove().insAtLeftEnd(this.cursor.parent);break;case"Ctrl-Home":this.cursor.prepareMove().insAtLeftEnd(this);break;case"Shift-Home":for(;this.cursor[u];)this.cursor.selectLeft();break;case"Ctrl-Shift-Home":for(;this.cursor[u]||this.cursor.parent!==this;)this.cursor.selectLeft();break;case"Left":this.cursor.moveLeft();break;case"Shift-Left":this.cursor.selectLeft();break;case"Ctrl-Left":break;case"Right":this.cursor.moveRight();break;case"Shift-Right":this.cursor.selectRight();break;case"Ctrl-Right":break;case"Up":this.cursor.moveUp();break;case"Down":this.cursor.moveDown();break;case"Shift-Up":if(this.cursor[u])for(;this.cursor[u];)this.cursor.selectLeft();else this.cursor.selectLeft();case"Shift-Down":if(this.cursor[p])for(;this.cursor[p];)this.cursor.selectRight();else this.cursor.selectRight();case"Ctrl-Up":break;case"Ctrl-Down":break;case"Ctrl-Shift-Del":case"Ctrl-Del":for(;this.cursor[p]||this.cursor.selection;)this.cursor.deleteForward();break;case"Shift-Del":case"Del":this.cursor.deleteForward();break;case"Meta-A":case"Ctrl-A":if(this!==this.cursor.root)return;for(this.cursor.prepareMove().insAtRightEnd(this);this.cursor[u];)this.cursor.selectLeft();break;default:return!1}return e.preventDefault(),!1},t.onText=function(t){return this.cursor.write(t),!1}}),y=c(w,function(t,e){t.init=function(t){e.init.call(this,"$"),this.cursor=t},t.htmlTemplate='<span class="mathquill-rendered-math">&0</span>',t.createBlocks=function(){this.ends[u]=this.ends[p]=q(),this.blocks=[this.ends[u]],this.ends[u].parent=this,this.ends[u].cursor=this.cursor,this.ends[u].write=function(t,e,n){"$"!==e?j.prototype.write.call(this,t,e,n):this.isEmpty()?(t.insRightOf(this.parent).backspace().show(),Z("\\$","$").createLeftOf(t)):t[p]?t[u]?j.prototype.write.call(this,t,e,n):t.insLeftOf(this.parent):t.insRightOf(this.parent)}},t.latex=function(){return"$"+this.ends[u].latex()+"$"}}),Q=c(j,function(t){t.renderLatex=function(t){var e,n,i,r,s,a,o,c,h,f,d,m=this,g=m.cursor;if(m.jQ.children().slice(1).remove(),m.ends[u]=m.ends[p]=0,delete g.selection,g.show().insAtRightEnd(m),e=l.regex,n=l.string,i=l.eof,r=l.all,s=n("$").then(ie).skip(n("$").or(i)).map(function(t){var e,n=y(g);return n.createBlocks(),e=n.ends[u],t.children().adopt(e,0,0),n}),a=n("\\$").result("$"),o=a.or(e(/^[^$]/)).map(Z),c=s.or(o).many(),h=c.skip(i).or(r.result(!1)).parse(t)){for(f=0;h.length>f;f+=1)h[f].adopt(m,m.ends[p],0);d=m.join("html"),v.jQize(d).appendTo(m.jQ),this.finalizeInsert()}},t.onKey=function(t){"Spacebar"!==t&&"Shift-Spacebar"!==t&&q.prototype.onKey.apply(this,arguments)},t.onText=q.prototype.onText,t.write=function(t,e,n){if(n&&n.remove(),"$"===e)y(t).createLeftOf(t);else{var i;"<"===e?i="&lt;":">"===e&&(i="&gt;"),Z(e,i).createLeftOf(t)}}}),C={},S={},O=t,E=document.createElement("div"),A=E.style,R={transform:1,WebkitTransform:1,MozTransform:1,OTransform:1,msTransform:1};for(T in R)if(T in A){D=T;break}D?L=function(t,e,n){t.css(D,"scale("+e+","+n+")")}:"filter"in A?(O=function(t){t.className=t.className},L=function(t,e,n){function i(){t.css("marginRight",(r.width()-1)*(e-1)/e+"px")}var r,s;e/=1+(n-1)/2,t.css("fontSize",n+"em"),t.hasClass("matrixed-container")||t.addClass("matrixed-container").wrapInner('<span class="matrixed"></span>'),r=t.children().css("filter","progid:DXImageTransform.Microsoft.Matrix(M11="+e+",SizingMethod='auto expand')"),i(),s=setInterval(i),f(window).load(function(){clearTimeout(s),i()})}):L=function(t,e,n){t.css("fontSize",n+"em")},z=c(w,function(t,e){t.init=function(t,n,i){e.init.call(this,t,"<"+n+" "+i+">&0</"+n+">")}}),S.mathrm=e(z,"\\mathrm","span",'class="roman font"'),S.mathit=e(z,"\\mathit","i",'class="font"'),S.mathbf=e(z,"\\mathbf","b",'class="font"'),S.mathsf=e(z,"\\mathsf","span",'class="sans-serif font"'),S.mathtt=e(z,"\\mathtt","span",'class="monospace font"'),S.underline=e(z,"\\underline","span",'class="non-leaf underline"'),S.overline=S.bar=e(z,"\\overline","span",'class="non-leaf overline"'),B=c(w,function(t,e){t.init=function(t,n,i){e.init.call(this,t,"<"+n+' class="non-leaf">&0</'+n+">",[i])},t.finalizeTree=function(){function t(t){var e=this.parent,n=t;do{if(n[p])return t.insLeftOf(e),!1;n=n.parent.parent}while(n!==e);return t.insRightOf(e),!1}n("SupSub is only _ and ^","^"===this.ctrlSeq||"_"===this.ctrlSeq),"_"===this.ctrlSeq?(this.down=this.ends[u],this.ends[u].up=t):(this.up=this.ends[u],this.ends[u].down=t)},t.latex=function(){var t=this.ends[u].latex();return 1===t.length?this.ctrlSeq+t:this.ctrlSeq+"{"+(t||" ")+"}"},t.redraw=function(){this[u]&&this[u].respace(),this[u]instanceof B||(this.respace(),!this[p]||this[p]instanceof B||this[p].respace())},t.respace=function(){if("\\int "===this[u].ctrlSeq||this[u]instanceof B&&this[u].ctrlSeq!=this.ctrlSeq&&this[u][u]&&"\\int "===this[u][u].ctrlSeq?this.limit||(this.limit=!0,this.jQ.addClass("limit")):this.limit&&(this.limit=!1,this.jQ.removeClass("limit")),this.respaced=this[u]instanceof B&&this[u].ctrlSeq!=this.ctrlSeq&&!this[u].respaced,this.respaced){var t=+this.jQ.css("fontSize").slice(0,-2),e=this[u].jQ.outerWidth(),n=this.jQ.outerWidth();this.jQ.css({left:(this.limit&&"_"===this.ctrlSeq?-.25:0)-e/t+"em",marginRight:.1-he(n,e)/t+"em"})}else this.limit&&"_"===this.ctrlSeq?this.jQ.css({left:"-.25em",marginRight:""}):this.jQ.css({left:"",marginRight:""});return this[p]instanceof B&&this[p].respace(),this}}),S.subscript=S._=e(B,"_","sub","_"),S.superscript=S.supscript=S["^"]=e(B,"^","sup","**"),I=S.frac=S.dfrac=S.cfrac=S.fraction=c(w,function(t){t.ctrlSeq="\\frac",t.htmlTemplate='<span class="fraction non-leaf"><span class="numerator">&0</span><span class="denominator">&1</span><span style="display:inline-block;width:0">&nbsp;</span></span>',t.textTemplate=["(","/",")"],t.finalizeTree=function(){this.up=this.ends[p].up=this.ends[u],this.down=this.ends[u].down=this.ends[p]}}),$=S.over=C["/"]=c(I,function(t,e){t.createLeftOf=function(t){if(!this.replacedFragment){for(var n=t[u];n&&!(n instanceof V||n instanceof K||n instanceof ee||",;:".split("").indexOf(n.ctrlSeq)>-1);)n=n[u];n instanceof ee&&n[p]instanceof B&&(n=n[p],n[p]instanceof B&&n[p].ctrlSeq!=n.ctrlSeq&&(n=n[p])),n!==t[u]&&(this.replaces(k(n[p]||t.parent.ends[u],t[u])),t[u]=n)}e.createLeftOf.call(this,t)}}),_=S.sqrt=S["√"]=c(w,function(t,e){t.ctrlSeq="\\sqrt",t.htmlTemplate='<span class="non-leaf"><span class="scaled sqrt-prefix">&radic;</span><span class="non-leaf sqrt-stem">&0</span></span>',t.textTemplate=["sqrt(",")"],t.parser=function(){return ie.optBlock.then(function(t){return ie.block.map(function(e){var n=W();return n.blocks=[t,e],t.adopt(n,0,0),e.adopt(n,t,0),n})}).or(e.parser.call(this))},t.redraw=function(){var t=this.ends[p].jQ;L(t.prev(),1,t.innerHeight()/+t.css("fontSize").slice(0,-2)-.1)}}),S.vec=c(w,function(t){t.ctrlSeq="\\vec",t.htmlTemplate='<span class="non-leaf"><span class="vector-prefix">&rarr;</span><span class="vector-stem">&0</span></span>',t.textTemplate=["vec(",")"]}),W=S.nthroot=c(_,function(t){t.htmlTemplate='<sup class="nthroot non-leaf">&0</sup><span class="scaled"><span class="sqrt-prefix scaled">&radic;</span><span class="sqrt-stem non-leaf">&1</span></span>',t.textTemplate=["sqrt[","](",")"],t.latex=function(){return"\\sqrt["+this.ends[u].latex()+"]{"+this.ends[p].latex()+"}"}}),M=c(w,function(t,e){t.init=function(t,n,i,r){e.init.call(this,"\\left"+i,'<span class="non-leaf"><span class="scaled paren">'+t+"</span>"+'<span class="non-leaf">&0</span>'+'<span class="scaled paren">'+n+"</span>"+"</span>",[t,n]),this.end="\\right"+r},t.jQadd=function(){e.jQadd.apply(this,arguments);var t=this.jQ;this.bracketjQs=t.children(":first").add(t.children(":last"))},t.latex=function(){return this.ctrlSeq+this.ends[u].latex()+this.end},t.redraw=function(){var t=this.ends[u].jQ,e=t.outerHeight()/+t.css("fontSize").slice(0,-2);L(this.bracketjQs,he(1+.2*(e-1),1.2),1.05*e)}}),S.left=c(w,function(t){t.parser=function(){var t=l.regex,e=l.string,n=l.succeed,i=l.optWhitespace;return i.then(t(/^(?:[([|]|\\\{)/)).then(function(r){"\\"===r.charAt(0)&&(r=r.slice(1));var s=C[r]();return ie.map(function(t){s.blocks=[t],t.adopt(s,0,0)}).then(e("\\right")).skip(i).then(t(/^(?:[\])|]|\\\})/)).then(function(t){return t.slice(-1)!==s.end.slice(-1)?l.fail("open doesn't match close"):n(s)})})}}),S.right=c(w,function(t){t.parser=function(){return l.fail("unmatched \\right")}}),S.lbrace=C["{"]=e(M,"{","}","\\{","\\}"),S.langle=S.lang=e(M,"&lang;","&rang;","\\langle ","\\rangle "),F=c(M,function(t,e){t.createLeftOf=function(t){t[p]||!t.parent.parent||t.parent.parent.end!==this.end||this.replacedFragment?e.createLeftOf.call(this,t):t.insRightOf(t.parent.parent)},t.placeCursor=function(t){this.ends[u].blur(),t.insRightOf(this)}}),S.rbrace=C["}"]=e(F,"{","}","\\{","\\}"),S.rangle=S.rang=e(F,"&lang;","&rang;","\\langle ","\\rangle "),P=function(t,e){t.init=function(t,n){e.init.call(this,t,n,t,n)}},U=c(M,P),S.lparen=C["("]=e(U,"(",")"),S.lbrack=S.lbracket=C["["]=e(U,"[","]"),H=c(F,P),S.rparen=C[")"]=e(H,"(",")"),S.rbrack=S.rbracket=C["]"]=e(H,"[","]"),S.lpipe=S.rpipe=C["|"]=c(U,function(t,e){t.init=function(){e.init.call(this,"|","|")},t.createLeftOf=F.prototype.createLeftOf}),K=C.$=S.text=S.textnormal=S.textrm=S.textup=S.textmd=c(w,function(t,e){t.ctrlSeq="\\text",t.htmlTemplate='<span class="text">&0</span>',t.replaces=function(t){t instanceof k?this.replacedText=t.remove().jQ.text():"string"==typeof t&&(this.replacedText=t)},t.textTemplate=['"','"'],t.parser=function(){var t=this,e=l.string,n=l.regex,i=l.optWhitespace;return i.then(e("{")).then(n(/^[^}]*/)).skip(e("}")).map(function(e){var n,i,r;for(t.createBlocks(),n=t.ends[u],i=0;e.length>i;i+=1)r=Z(e.charAt(i)),r.adopt(n,n.ends[p],0);return t})},t.createBlocks=function(){this.ends[u]=this.ends[p]=N(),this.blocks=[this.ends[u]],this.ends[u].parent=this},t.finalizeInsert=function(){this.ends[u].blur=function(){return delete this.blur,this},e.finalizeInsert.call(this)},t.createLeftOf=function(t){if(e.createLeftOf.call(this,this.cursor=t),this.replacedText)for(var n=0;this.replacedText.length>n;n+=1)this.ends[u].write(t,this.replacedText.charAt(n))}}),N=c(j,function(t,e){t.onKey=function(t){return"Spacebar"===t||"Shift-Spacebar"===t?!1:a},t.deleteOutOf=function(t,e){this.isEmpty()&&e.insRightOf(this.parent)},t.write=function(t,e,n){var i,r;return n&&n.remove(),"$"!==e?("<"===e?i="&lt;":">"===e&&(i="&gt;"),Z(e,i).createLeftOf(t)):this.isEmpty()?(t.insRightOf(this.parent).backspace(),Z("\\$","$").createLeftOf(t)):t[p]?t[u]?(r=K(),r.replaces(k(t[p],this.ends[p])),t.insRightOf(this.parent),r.adopt=function(){delete this.adopt,this.adopt.apply(this,arguments),this[u]=0},r.createLeftOf(t),r[u]=this.parent,t.insLeftOf(r)):t.insLeftOf(this.parent):t.insRightOf(this.parent),!1},t.blur=function(){if(this.jQ.removeClass("hasCursor"),this.isEmpty()){var t=this.parent,e=t.cursor;e.parent===this?this.jQ.addClass("empty"):(e.hide(),t.remove(),e[p]===t?e[p]=t[p]:e[u]===t&&(e[u]=t[u]),e.show().parent.bubble("redraw"))}return this},t.focus=function(){var t,n,i,r;return e.focus.call(this),t=this.parent,t[p].ctrlSeq===t.ctrlSeq?(n=this,i=t.cursor,r=t[p].ends[u],r.eachChild(function(t){t.parent=n,t.jQ.appendTo(n.jQ)}),this.ends[p]?this.ends[p][p]=r.ends[u]:this.ends[u]=r.ends[u],r.ends[u][u]=this.ends[p],this.ends[p]=r.ends[p],r.parent.remove(),i[u]?i.insRightOf(i[u]):i.insAtLeftEnd(this),i.parent.bubble("redraw")):t[u].ctrlSeq===t.ctrlSeq&&(i=t.cursor,i[u]?t[u].ends[u].focus():i.insAtRightEnd(t[u].ends[u])),this}}),S.em=S.italic=S.italics=S.emph=S.textit=S.textsl=s("\\textit","i",'class="text"'),S.strong=S.bold=S.textbf=s("\\textbf","b",'class="text"'),S.sf=S.textsf=s("\\textsf","span",'class="sans-serif text"'),S.tt=S.texttt=s("\\texttt","span",'class="monospace text"'),S.textsc=s("\\textsc","span",'style="font-variant:small-caps" class="text"'),S.uppercase=s("\\uppercase","span",'style="text-transform:uppercase" class="text"'),S.lowercase=s("\\lowercase","span",'style="text-transform:lowercase" class="text"'),C["\\"]=c(w,function(t,e){t.ctrlSeq="\\",t.replaces=function(t){this._replacedFragment=t.disown(),this.isEmpty=function(){return!1}},t.htmlTemplate='<span class="latex-command-input non-leaf">\\<span>&0</span></span>',t.textTemplate=["\\"],t.createBlocks=function(){e.createBlocks.call(this),this.ends[u].focus=function(){return this.parent.jQ.addClass("hasCursor"),this.isEmpty()&&this.parent.jQ.removeClass("empty"),this},this.ends[u].blur=function(){return this.parent.jQ.removeClass("hasCursor"),this.isEmpty()&&this.parent.jQ.addClass("empty"),this}},t.createLeftOf=function(t){if(e.createLeftOf.call(this,t),this.cursor=t.insAtRightEnd(this.ends[u]),this._replacedFragment){var n=this.jQ[0];this.jQ=this._replacedFragment.jQ.addClass("blur").bind("mousedown mousemove",function(t){return f(t.target=n).trigger(t),!1}).insertBefore(this.jQ).add(this.jQ)}this.ends[u].write=function(t,e,n){n&&n.remove(),e.match(/[a-z]/i)?Z(e).createLeftOf(t):(this.parent.renderCommand(),"\\"===e&&this.isEmpty()||this.parent.parent.write(t,e))}},t.latex=function(){return"\\"+this.ends[u].latex()+" "},t.onKey=function(t,e){return"Tab"===t||"Enter"===t||"Spacebar"===t?(this.renderCommand(),e.preventDefault(),!1):a},t.renderCommand=function(){this.jQ=this.jQ.last(),this.remove(),this[p]?this.cursor.insLeftOf(this[p]):this.cursor.insAtRightEnd(this.parent);var t=this.ends[u].latex();t||(t="backslash"),this.cursor.insertCmd(t,this._replacedFragment)}}),G=S.binom=S.binomial=c(w,function(t){t.ctrlSeq="\\binom",t.htmlTemplate='<span class="paren scaled">(</span><span class="non-leaf"><span class="array non-leaf"><span>&0</span><span>&1</span></span></span><span class="paren scaled">)</span>',t.textTemplate=["choose(",",",")"],t.redraw=function(){var t=this.jQ.eq(1),e=t.outerHeight()/+t.css("fontSize").slice(0,-2),n=this.jQ.filter(".paren");L(n,he(1+.2*(e-1),1.2),1.05*e)}}),S.choose=c(G,function(t){t.createLeftOf=$.prototype.createLeftOf}),S.vector=c(w,function(t,e){t.ctrlSeq="\\vector",t.htmlTemplate='<span class="array"><span>&0</span></span>',t.latex=function(){return"\\begin{matrix}"+this.foldChildren([],function(t,e){return t.push(e.latex()),t}).join("\\\\")+"\\end{matrix}"},t.text=function(){return"["+this.foldChildren([],function(t,e){return t.push(e.text()),t}).join()+"]"},t.createLeftOf=function(t){e.createLeftOf.call(this,this.cursor=t)},t.onKey=function(t,e){var n,i=this.cursor.parent;if(i.parent===this){if("Enter"===t)return n=j(),n.parent=this,n.jQ=f("<span></span>").attr(ce,n.id).insertAfter(i.jQ),i[p]?i[p][u]=n:this.ends[p]=n,n[p]=i[p],i[p]=n,n[u]=i,this.bubble("redraw").cursor.insAtRightEnd(n),e.preventDefault(),!1;if("Tab"===t&&!i[p])return i.isEmpty()?i[u]?(this.cursor.insRightOf(this),delete i[u][p],this.ends[p]=i[u],i.jQ.remove(),this.bubble("redraw"),e.preventDefault(),!1):a:(n=j(),n.parent=this,n.jQ=f("<span></span>").attr(ce,n.id).appendTo(this.jQ),this.ends[p]=n,i[p]=n,n[u]=i,this.bubble("redraw").cursor.insAtRightEnd(n),e.preventDefault(),!1);if(8===e.which){if(i.isEmpty())return i[u]?(this.cursor.insAtRightEnd(i[u]),i[u][p]=i[p]):(this.cursor.insLeftOf(this),this.ends[u]=i[p]),i[p]?i[p][u]=i[u]:this.ends[p]=i[u],i.jQ.remove(),this.isEmpty()?this.cursor.deleteForward():this.bubble("redraw"),e.preventDefault(),!1;if(!this.cursor[u])return e.preventDefault(),!1}}}}),S.editable=c(y,function(t,e){t.init=function(){w.prototype.init.call(this,"\\editable")},t.jQadd=function(){var t,n,i=this;e.jQadd.apply(i,arguments),t=i.ends[u].disown(),n=i.jQ.children().detach(),i.ends[u]=i.ends[p]=q(),i.blocks=[i.ends[u]],i.ends[u].parent=i,r(i.jQ,i.ends[u],!1,!0),i.cursor=i.ends[u].cursor,t.children().adopt(i.ends[u],0,0),n.appendTo(i.ends[u].jQ),i.ends[u].cursor.insAtRightEnd(i.ends[u])},t.latex=function(){return this.ends[u].latex()},t.text=function(){return this.ends[u].text()}}),S.f=e(x,"f",'<var class="florin">&fnof;</var><span style="display:inline-block;width:0">&nbsp;</span>'),X=c(x,function(t,e){t.init=function(t,n){e.init.call(this,t,"<var>"+(n||t)+"</var>")},t.text=function(){var t=this.ctrlSeq;return!this[u]||this[u]instanceof X||this[u]instanceof V||(t="*"+t),!this[p]||this[p]instanceof V||"^"===this[p].ctrlSeq||(t+="*"),t}}),Z=c(x,function(t,e){t.init=function(t,n){e.init.call(this,t,"<span>"+(n||t)+"</span>")}}),C[" "]=e(Z,"\\:"," "),S.prime=C["'"]=e(Z,"'","&prime;"),Y=c(x,function(t,e){t.init=function(t,n){e.init.call(this,t,'<span class="nonSymbola">'+(n||t)+"</span>")}}),S["@"]=Y,S["&"]=e(Y,"\\&","&amp;"),S["%"]=e(Y,"\\%","%"),S.alpha=S.beta=S.gamma=S.delta=S.zeta=S.eta=S.theta=S.iota=S.kappa=S.mu=S.nu=S.xi=S.rho=S.sigma=S.tau=S.chi=S.psi=S.omega=c(X,function(t,e){t.init=function(t){e.init.call(this,"\\"+t+" ","&"+t+";")}}),S.phi=e(X,"\\phi ","&#981;"),S.phiv=S.varphi=e(X,"\\varphi ","&phi;"),S.epsilon=e(X,"\\epsilon ","&#1013;"),S.epsiv=S.varepsilon=e(X,"\\varepsilon ","&epsilon;"),S.piv=S.varpi=e(X,"\\varpi ","&piv;"),S.sigmaf=S.sigmav=S.varsigma=e(X,"\\varsigma ","&sigmaf;"),S.thetav=S.vartheta=S.thetasym=e(X,"\\vartheta ","&thetasym;"),S.upsilon=S.upsi=e(X,"\\upsilon ","&upsilon;"),S.gammad=S.Gammad=S.digamma=e(X,"\\digamma ","&#989;"),S.kappav=S.varkappa=e(X,"\\varkappa ","&#1008;"),S.rhov=S.varrho=e(X,"\\varrho ","&#1009;"),S.pi=S["π"]=e(Y,"\\pi ","&pi;"),S.lambda=e(Y,"\\lambda ","&lambda;"),S.Upsilon=S.Upsi=S.upsih=S.Upsih=e(x,"\\Upsilon ",'<var style="font-family: serif">&upsih;</var>'),S.Gamma=S.Delta=S.Theta=S.Lambda=S.Xi=S.Pi=S.Sigma=S.Phi=S.Psi=S.Omega=S.forall=c(Z,function(t,e){t.init=function(t){e.init.call(this,"\\"+t+" ","&"+t+";")}}),J=c(w,function(t){t.init=function(t){this.latex=t},t.createLeftOf=function(t){t.writeLatex(this.latex)},t.parser=function(){var t=ie.parse(this.latex).children();return l.succeed(t)}}),S["¹"]=e(J,"^1"),S["²"]=e(J,"^2"),S["³"]=e(J,"^3"),S["¼"]=e(J,"\\frac14"),S["½"]=e(J,"\\frac12"),S["¾"]=e(J,"\\frac34"),V=c(x,function(t,e){t.init=function(t,n,i){e.init.call(this,t,'<span class="binary-operator">'+n+"</span>",i)
+}}),te=c(V,function(t){t.init=Z.prototype.init,t.respace=function(){return this.jQ[0].className=this[u]?this[u]instanceof V&&this[p]&&!(this[p]instanceof V)?"unary-operator":"binary-operator":"",this}}),S["+"]=e(te,"+","+"),S["–"]=S["-"]=e(te,"-","&minus;"),S["±"]=S.pm=S.plusmn=S.plusminus=e(te,"\\pm ","&plusmn;"),S.mp=S.mnplus=S.minusplus=e(te,"\\mp ","&#8723;"),C["*"]=S.sdot=S.cdot=e(V,"\\cdot ","&middot;"),S["="]=e(V,"=","="),S["<"]=e(V,"<","&lt;"),S[">"]=e(V,">","&gt;"),S.notin=S.sim=S.cong=S.equiv=S.oplus=S.otimes=c(V,function(t,e){t.init=function(t){e.init.call(this,"\\"+t+" ","&"+t+";")}}),S.times=e(V,"\\times ","&times;","[x]"),S["÷"]=S.div=S.divide=S.divides=e(V,"\\div ","&divide;","[/]"),S["≠"]=S.ne=S.neq=e(V,"\\ne ","&ne;"),S.ast=S.star=S.loast=S.lowast=e(V,"\\ast ","&lowast;"),S.therefor=S.therefore=e(V,"\\therefore ","&there4;"),S.cuz=S.because=e(V,"\\because ","&#8757;"),S.prop=S.propto=e(V,"\\propto ","&prop;"),S["≈"]=S.asymp=S.approx=e(V,"\\approx ","&asymp;"),S.lt=e(V,"<","&lt;"),S.gt=e(V,">","&gt;"),S["≤"]=S.le=S.leq=e(V,"\\le ","&le;"),S["≥"]=S.ge=S.geq=e(V,"\\ge ","&ge;"),S.isin=S["in"]=e(V,"\\in ","&isin;"),S.ni=S.contains=e(V,"\\ni ","&ni;"),S.notni=S.niton=S.notcontains=S.doesnotcontain=e(V,"\\not\\ni ","&#8716;"),S.sub=S.subset=e(V,"\\subset ","&sub;"),S.sup=S.supset=S.superset=e(V,"\\supset ","&sup;"),S.nsub=S.notsub=S.nsubset=S.notsubset=e(V,"\\not\\subset ","&#8836;"),S.nsup=S.notsup=S.nsupset=S.notsupset=S.nsuperset=S.notsuperset=e(V,"\\not\\supset ","&#8837;"),S.sube=S.subeq=S.subsete=S.subseteq=e(V,"\\subseteq ","&sube;"),S.supe=S.supeq=S.supsete=S.supseteq=S.supersete=S.superseteq=e(V,"\\supseteq ","&supe;"),S.nsube=S.nsubeq=S.notsube=S.notsubeq=S.nsubsete=S.nsubseteq=S.notsubsete=S.notsubseteq=e(V,"\\not\\subseteq ","&#8840;"),S.nsupe=S.nsupeq=S.notsupe=S.notsupeq=S.nsupsete=S.nsupseteq=S.notsupsete=S.notsupseteq=S.nsupersete=S.nsuperseteq=S.notsupersete=S.notsuperseteq=e(V,"\\not\\supseteq ","&#8841;"),ee=c(x,function(t,e){t.init=function(t,n){e.init.call(this,t,"<big>"+n+"</big>")}}),S["∑"]=S.sum=S.summation=e(ee,"\\sum ","&sum;"),S["∏"]=S.prod=S.product=e(ee,"\\prod ","&prod;"),S.coprod=S.coproduct=e(ee,"\\coprod ","&#8720;"),S["∫"]=S["int"]=S.integral=e(ee,"\\int ","&int;"),S.N=S.naturals=S.Naturals=e(Z,"\\mathbb{N}","&#8469;"),S.P=S.primes=S.Primes=S.projective=S.Projective=S.probability=S.Probability=e(Z,"\\mathbb{P}","&#8473;"),S.Z=S.integers=S.Integers=e(Z,"\\mathbb{Z}","&#8484;"),S.Q=S.rationals=S.Rationals=e(Z,"\\mathbb{Q}","&#8474;"),S.R=S.reals=S.Reals=e(Z,"\\mathbb{R}","&#8477;"),S.C=S.complex=S.Complex=S.complexes=S.Complexes=S.complexplane=S.Complexplane=S.ComplexPlane=e(Z,"\\mathbb{C}","&#8450;"),S.H=S.Hamiltonian=S.quaternions=S.Quaternions=e(Z,"\\mathbb{H}","&#8461;"),S.quad=S.emsp=e(Z,"\\quad ","    "),S.qquad=e(Z,"\\qquad ","        "),S.diamond=e(Z,"\\diamond ","&#9671;"),S.bigtriangleup=e(Z,"\\bigtriangleup ","&#9651;"),S.ominus=e(Z,"\\ominus ","&#8854;"),S.uplus=e(Z,"\\uplus ","&#8846;"),S.bigtriangledown=e(Z,"\\bigtriangledown ","&#9661;"),S.sqcap=e(Z,"\\sqcap ","&#8851;"),S.triangleleft=e(Z,"\\triangleleft ","&#8882;"),S.sqcup=e(Z,"\\sqcup ","&#8852;"),S.triangleright=e(Z,"\\triangleright ","&#8883;"),S.odot=e(Z,"\\odot ","&#8857;"),S.bigcirc=e(Z,"\\bigcirc ","&#9711;"),S.dagger=e(Z,"\\dagger ","&#0134;"),S.ddagger=e(Z,"\\ddagger ","&#135;"),S.wr=e(Z,"\\wr ","&#8768;"),S.amalg=e(Z,"\\amalg ","&#8720;"),S.models=e(Z,"\\models ","&#8872;"),S.prec=e(Z,"\\prec ","&#8826;"),S.succ=e(Z,"\\succ ","&#8827;"),S.preceq=e(Z,"\\preceq ","&#8828;"),S.succeq=e(Z,"\\succeq ","&#8829;"),S.simeq=e(Z,"\\simeq ","&#8771;"),S.mid=e(Z,"\\mid ","&#8739;"),S.ll=e(Z,"\\ll ","&#8810;"),S.gg=e(Z,"\\gg ","&#8811;"),S.parallel=e(Z,"\\parallel ","&#8741;"),S.bowtie=e(Z,"\\bowtie ","&#8904;"),S.sqsubset=e(Z,"\\sqsubset ","&#8847;"),S.sqsupset=e(Z,"\\sqsupset ","&#8848;"),S.smile=e(Z,"\\smile ","&#8995;"),S.sqsubseteq=e(Z,"\\sqsubseteq ","&#8849;"),S.sqsupseteq=e(Z,"\\sqsupseteq ","&#8850;"),S.doteq=e(Z,"\\doteq ","&#8784;"),S.frown=e(Z,"\\frown ","&#8994;"),S.vdash=e(Z,"\\vdash ","&#8870;"),S.dashv=e(Z,"\\dashv ","&#8867;"),S.longleftarrow=e(Z,"\\longleftarrow ","&#8592;"),S.longrightarrow=e(Z,"\\longrightarrow ","&#8594;"),S.Longleftarrow=e(Z,"\\Longleftarrow ","&#8656;"),S.Longrightarrow=e(Z,"\\Longrightarrow ","&#8658;"),S.longleftrightarrow=e(Z,"\\longleftrightarrow ","&#8596;"),S.updownarrow=e(Z,"\\updownarrow ","&#8597;"),S.Longleftrightarrow=e(Z,"\\Longleftrightarrow ","&#8660;"),S.Updownarrow=e(Z,"\\Updownarrow ","&#8661;"),S.mapsto=e(Z,"\\mapsto ","&#8614;"),S.nearrow=e(Z,"\\nearrow ","&#8599;"),S.hookleftarrow=e(Z,"\\hookleftarrow ","&#8617;"),S.hookrightarrow=e(Z,"\\hookrightarrow ","&#8618;"),S.searrow=e(Z,"\\searrow ","&#8600;"),S.leftharpoonup=e(Z,"\\leftharpoonup ","&#8636;"),S.rightharpoonup=e(Z,"\\rightharpoonup ","&#8640;"),S.swarrow=e(Z,"\\swarrow ","&#8601;"),S.leftharpoondown=e(Z,"\\leftharpoondown ","&#8637;"),S.rightharpoondown=e(Z,"\\rightharpoondown ","&#8641;"),S.nwarrow=e(Z,"\\nwarrow ","&#8598;"),S.ldots=e(Z,"\\ldots ","&#8230;"),S.cdots=e(Z,"\\cdots ","&#8943;"),S.vdots=e(Z,"\\vdots ","&#8942;"),S.ddots=e(Z,"\\ddots ","&#8944;"),S.surd=e(Z,"\\surd ","&#8730;"),S.triangle=e(Z,"\\triangle ","&#9653;"),S.ell=e(Z,"\\ell ","&#8467;"),S.top=e(Z,"\\top ","&#8868;"),S.flat=e(Z,"\\flat ","&#9837;"),S.natural=e(Z,"\\natural ","&#9838;"),S.sharp=e(Z,"\\sharp ","&#9839;"),S.wp=e(Z,"\\wp ","&#8472;"),S.bot=e(Z,"\\bot ","&#8869;"),S.clubsuit=e(Z,"\\clubsuit ","&#9827;"),S.diamondsuit=e(Z,"\\diamondsuit ","&#9826;"),S.heartsuit=e(Z,"\\heartsuit ","&#9825;"),S.spadesuit=e(Z,"\\spadesuit ","&#9824;"),S.oint=e(Z,"\\oint ","&#8750;"),S.bigcap=e(Z,"\\bigcap ","&#8745;"),S.bigcup=e(Z,"\\bigcup ","&#8746;"),S.bigsqcup=e(Z,"\\bigsqcup ","&#8852;"),S.bigvee=e(Z,"\\bigvee ","&#8744;"),S.bigwedge=e(Z,"\\bigwedge ","&#8743;"),S.bigodot=e(Z,"\\bigodot ","&#8857;"),S.bigotimes=e(Z,"\\bigotimes ","&#8855;"),S.bigoplus=e(Z,"\\bigoplus ","&#8853;"),S.biguplus=e(Z,"\\biguplus ","&#8846;"),S.lfloor=e(Z,"\\lfloor ","&#8970;"),S.rfloor=e(Z,"\\rfloor ","&#8971;"),S.lceil=e(Z,"\\lceil ","&#8968;"),S.rceil=e(Z,"\\rceil ","&#8969;"),S.slash=e(Z,"\\slash ","&#47;"),S.opencurlybrace=e(Z,"\\opencurlybrace ","&#123;"),S.closecurlybrace=e(Z,"\\closecurlybrace ","&#125;"),S.caret=e(Z,"\\caret ","^"),S.underscore=e(Z,"\\underscore ","_"),S.backslash=e(Z,"\\backslash ","\\"),S.vert=e(Z,"|"),S.perp=S.perpendicular=e(Z,"\\perp ","&perp;"),S.nabla=S.del=e(Z,"\\nabla ","&nabla;"),S.hbar=e(Z,"\\hbar ","&#8463;"),S.AA=S.Angstrom=S.angstrom=e(Z,"\\text\\AA ","&#8491;"),S.ring=S.circ=S.circle=e(Z,"\\circ ","&#8728;"),S.bull=S.bullet=e(Z,"\\bullet ","&bull;"),S.setminus=S.smallsetminus=e(Z,"\\setminus ","&#8726;"),S.not=S["¬"]=S.neg=e(Z,"\\neg ","&not;"),S["…"]=S.dots=S.ellip=S.hellip=S.ellipsis=S.hellipsis=e(Z,"\\dots ","&hellip;"),S.converges=S.darr=S.dnarr=S.dnarrow=S.downarrow=e(Z,"\\downarrow ","&darr;"),S.dArr=S.dnArr=S.dnArrow=S.Downarrow=e(Z,"\\Downarrow ","&dArr;"),S.diverges=S.uarr=S.uparrow=e(Z,"\\uparrow ","&uarr;"),S.uArr=S.Uparrow=e(Z,"\\Uparrow ","&uArr;"),S.to=e(V,"\\to ","&rarr;"),S.rarr=S.rightarrow=e(Z,"\\rightarrow ","&rarr;"),S.implies=e(V,"\\Rightarrow ","&rArr;"),S.rArr=S.Rightarrow=e(Z,"\\Rightarrow ","&rArr;"),S.gets=e(V,"\\gets ","&larr;"),S.larr=S.leftarrow=e(Z,"\\leftarrow ","&larr;"),S.impliedby=e(V,"\\Leftarrow ","&lArr;"),S.lArr=S.Leftarrow=e(Z,"\\Leftarrow ","&lArr;"),S.harr=S.lrarr=S.leftrightarrow=e(Z,"\\leftrightarrow ","&harr;"),S.iff=e(V,"\\Leftrightarrow ","&hArr;"),S.hArr=S.lrArr=S.Leftrightarrow=e(Z,"\\Leftrightarrow ","&hArr;"),S.Re=S.Real=S.real=e(Z,"\\Re ","&real;"),S.Im=S.imag=S.image=S.imagin=S.imaginary=S.Imaginary=e(Z,"\\Im ","&image;"),S.part=S.partial=e(Z,"\\partial ","&part;"),S.inf=S.infin=S.infty=S.infinity=e(Z,"\\infty ","&infin;"),S.alef=S.alefsym=S.aleph=S.alephsym=e(Z,"\\aleph ","&alefsym;"),S.xist=S.xists=S.exist=S.exists=e(Z,"\\exists ","&exist;"),S.and=S.land=S.wedge=e(Z,"\\wedge ","&and;"),S.or=S.lor=S.vee=e(Z,"\\vee ","&or;"),S.o=S.O=S.empty=S.emptyset=S.oslash=S.Oslash=S.nothing=S.varnothing=e(V,"\\varnothing ","&empty;"),S.cup=S.union=e(V,"\\cup ","&cup;"),S.cap=S.intersect=S.intersection=e(V,"\\cap ","&cap;"),S.deg=S.degree=e(Z,"^\\circ ","&deg;"),S.ang=S.angle=e(Z,"\\angle ","&ang;"),ne=c(x,function(t,e){t.init=function(t){e.init.call(this,"\\"+t+" ","<span>"+t+"</span>")},t.respace=function(){this.jQ[0].className=this[p]instanceof B||this[p]instanceof M?"":"non-italicized-function"}}),S.ln=S.lg=S.log=S.span=S.proj=S.det=S.dim=S.min=S.max=S.mod=S.lcm=S.gcd=S.gcf=S.hcf=S.lim=ne,function(){var t,e=["sin","cos","tan","sec","cosec","csc","cotan","cot"];for(t in e)S[e[t]]=S[e[t]+"h"]=S["a"+e[t]]=S["arc"+e[t]]=S["a"+e[t]+"h"]=S["arc"+e[t]+"h"]=ne}(),ie=function(){function t(t){var e=j();return t.adopt(e,0,0),e}function e(t){var e,n=t[0]||j();for(e=1;t.length>e;e+=1)t[e].children().adopt(n,n.ends[p],0);return n}var n=l.string,i=l.regex,r=l.letter,s=l.any,a=l.optWhitespace,o=l.succeed,c=l.fail,h=r.map(X),u=i(/^[^${}\\_^]/).map(Z),f=i(/^[^\\a-eg-zA-Z]/).or(n("\\").then(i(/^[a-z]+/i).or(i(/^\s+/).result(" ")).or(s))).then(function(t){var e=S[t];return e?e(t).parser():c("unknown command: \\"+t)}),d=f.or(h).or(u),m=n("{").then(function(){return b}).skip(n("}")),g=a.then(m.or(d.map(t))),b=g.many().map(e).skip(a),v=n("[").then(g.then(function(t){return"]"!==t.join("latex")?o(t):c()}).many().map(e).skip(a)).skip(n("]")),w=b;return w.block=g,w.optBlock=v,w}(),re=c(d,function(t){function e(t,e){var i,r,s,a;if(t[p][e])t.insAtLeftEnd(t[p][e]);else if(t[u][e])t.insAtRightEnd(t[u][e]);else{i=t.parent;do{if(r=i[e],r&&("function"==typeof r&&(r=i[e](t)),r===!1||r instanceof j)){t.upDownCache[i.id]=d(t.parent,t[u],t[p]),r instanceof j&&(s=t.upDownCache[r.id],s?s[p]?t.insLeftOf(s[p]):t.insAtRightEnd(s.parent):(a=n(t).left,t.insAtRightEnd(r),t.seekHoriz(a,r)));break}i=i.parent.parent}while(i)}return t.clearSelection().show()}function n(t){var e=t.jQ.removeClass("cursor").offset();return t.jQ.addClass("cursor"),e}function r(t){t.upDownCache={}}t.init=function(t){this.parent=this.root=t;var e=this.jQ=this._jQ=f('<span class="cursor">&zwj;</span>');this.blink=function(){e.toggleClass("blink")},this.upDownCache={}},t.show=function(){return this.jQ=this._jQ.removeClass("blink"),"intervalId"in this?clearInterval(this.intervalId):(this[p]?this.selection&&this.selection.ends[u][u]===this[u]?this.jQ.insertBefore(this.selection.jQ):this.jQ.insertBefore(this[p].jQ.first()):this.jQ.appendTo(this.parent.jQ),this.parent.focus()),this.intervalId=setInterval(this.blink,500),this},t.hide=function(){return"intervalId"in this&&clearInterval(this.intervalId),delete this.intervalId,this.jQ.detach(),this.jQ=f(),this},t.withDirInsertAt=function(t,e,n,i){var r=this.parent;this.parent=e,this[t]=n,this[-t]=i,r.blur()},t.insDirOf=function(t,e){return i(t),this.withDirInsertAt(t,e.parent,e[t],e),this.parent.jQ.addClass("hasCursor"),this.jQ.insDirOf(t,e.jQ),this},t.insLeftOf=function(t){return this.insDirOf(u,t)},t.insRightOf=function(t){return this.insDirOf(p,t)},t.insAtDirEnd=function(t,e){return i(t),this.withDirInsertAt(t,e,0,e.ends[t]),t===u&&e.textarea?this.jQ.insDirOf(-t,e.textarea):this.jQ.insAtDirEnd(t,e.jQ),e.focus(),this},t.insAtLeftEnd=function(t){return this.insAtDirEnd(u,t)},t.insAtRightEnd=function(t){return this.insAtDirEnd(p,t)},t.hopDir=function(t){return i(t),this.jQ.insDirOf(t,this[t].jQ),this[-t]=this[t],this[t]=this[t][t],this},t.hopLeft=function(){return this.hopDir(u)},t.hopRight=function(){return this.hopDir(p)},t.moveDirWithin=function(t,e){if(i(t),this[t])this[t].ends[-t]?this.insAtDirEnd(-t,this[t].ends[-t]):this.hopDir(t);else{if(this.parent===e)return;this.parent[t]?this.insAtDirEnd(-t,this.parent[t]):this.insDirOf(t,this.parent.parent)}},t.moveLeftWithin=function(t){return this.moveDirWithin(u,t)},t.moveRightWithin=function(t){return this.moveDirWithin(p,t)},t.moveDir=function(t){return i(t),r(this),this.selection?this.insDirOf(t,this.selection.ends[t]).clearSelection():this.moveDirWithin(t,this.root),this.show()},t.moveLeft=function(){return this.moveDir(u)},t.moveRight=function(){return this.moveDir(p)},t.moveUp=function(){return e(this,"up")},t.moveDown=function(){return e(this,"down")},t.seek=function(t,e){r(this);var n,i,s=this.clearSelection().show();return t.hasClass("empty")?(s.insAtLeftEnd(v[t.attr(ce)]),s):(n=v[t.attr(oe)],n instanceof x?(t.outerWidth()>2*(e-t.offset().left)?s.insLeftOf(n):s.insRightOf(n),s):(n||(i=v[t.attr(ce)],i||(t=t.parent(),n=v[t.attr(oe)],n||(i=v[t.attr(ce)],i||(i=s.root)))),n?s.insRightOf(n):s.insAtRightEnd(i),s.seekHoriz(e,s.root)))},t.seekHoriz=function(t,e){var i,r=this,s=n(r).left-t;do r.moveLeftWithin(e),i=s,s=n(r).left-t;while(s>0&&(r[u]||r.parent!==e));return-s>i&&r.moveRightWithin(e),r},t.writeLatex=function(t){var e,n,i,s=this;return r(s),s.show().deleteSelection(),e=l.all,n=l.eof,i=ie.skip(n).or(e.result(!1)).parse(t),i&&(i.children().adopt(s.parent,s[u],s[p]),v.jQize(i.join("html")).insertBefore(s.jQ),s[u]=i.ends[p],i.finalizeInsert(),s.parent.bubble("redraw")),this.hide()},t.write=function(t){var e=this.prepareWrite();return this.insertCh(t,e)},t.insertCh=function(t,e){return this.parent.write(this,t,e),this},t.insertCmd=function(t,e){var n=S[t];return n?(n=n(t),e&&n.replaces(e),n.createLeftOf(this)):(n=K(),n.replaces(t),n.ends[u].focus=function(){return delete this.focus,this},n.createLeftOf(this),this.insRightOf(n),e&&e.remove()),this},t.unwrapGramp=function(){var t=this.parent.parent,e=t.parent,n=t[p],i=t[u];if(t.disown().eachChild(function(r){r.isEmpty()||(r.children().adopt(e,i,n).each(function(e){e.jQ.insertBefore(t.jQ.first())}),i=r.ends[p])}),!this[p])if(this[u])this[p]=this[u][p];else for(;!this[p];){if(this.parent=this.parent[p],!this.parent){this[p]=t[p],this.parent=e;break}this[p]=this.parent.ends[u]}this[p]?this.insLeftOf(this[p]):this.insAtRightEnd(e),t.jQ.remove(),t[u]&&t[u].respace(),t[p]&&t[p].respace()},t.deleteDir=function(t){if(i(t),r(this),this.show(),this.deleteSelection());else if(this[t])this[t].isEmpty()?this[t]=this[t].remove()[t]:this.selectDir(t);else if(this.parent!==this.root){if(this.parent.parent.isEmpty())return this.insDirOf(-t,this.parent.parent).deleteDir(t);this.unwrapGramp()}return this[u]&&this[u].respace(),this[p]&&this[p].respace(),this.parent.bubble("redraw"),this},t.backspace=function(){return this.deleteDir(u)},t.deleteForward=function(){return this.deleteDir(p)},t.selectFrom=function(t){var e,n,i,r,s,a,o=this,c=t;t:for(;;){for(e=this;e!==o.parent.parent;e=e.parent.parent)if(e.parent===c.parent){i=e,r=c;break t}for(n=t;n!==c.parent.parent;n=n.parent.parent)if(o.parent===n.parent){i=o,r=n;break t}o.parent.parent&&(o=o.parent.parent),c.parent.parent&&(c=c.parent.parent)}if(i[p]!==r){for(a=i;a;a=a[p])if(a===r[u]){s=!0;break}s||(s=r,r=i,i=s)}this.hide().selection=se(i[u][p]||i.parent.ends[u],r[p][u]||r.parent.ends[p]),this.insRightOf(r[p][u]||r.parent.ends[p]),this.root.selectionChanged()},t.selectDir=function(t){if(i(t),r(this),this.selection)if(this.selection.ends[t]===this[-t])this[t]?this.hopDir(t).selection.extendDir(t):this.parent!==this.root&&this.insDirOf(t,this.parent.parent).selection.levelUp();else{if(this.hopDir(t),this.selection.ends[t]===this.selection.ends[-t])return this.clearSelection().show(),a;this.selection.retractDir(t)}else{if(this[t])this.hopDir(t);else{if(this.parent===this.root)return;this.insDirOf(t,this.parent.parent)}this.hide().selection=se(this[-t])}this.root.selectionChanged()},t.selectLeft=function(){return this.selectDir(u)},t.selectRight=function(){return this.selectDir(p)},t.prepareMove=function(){return r(this),this.show().clearSelection()},t.prepareEdit=function(){return r(this),this.show().deleteSelection()},t.prepareWrite=function(){return r(this),this.show().replaceSelection()},t.clearSelection=function(){return this.selection&&(this.selection.clear(),delete this.selection,this.root.selectionChanged()),this},t.deleteSelection=function(){return this.selection?(this[u]=this.selection.ends[u][u],this[p]=this.selection.ends[p][p],this.selection.remove(),this.root.selectionChanged(),delete this.selection):!1},t.replaceSelection=function(){var t=this.selection;return t&&(this[u]=t.ends[u][u],this[p]=t.ends[p][p],delete this.selection),t}}),se=c(k,function(t,e){t.init=function(){var t=this;e.init.apply(t,arguments),t.jQwrap(t.jQ)},t.jQwrap=function(t){this.jQ=t.wrapAll('<span class="selection"></span>').parent()},t.adopt=function(){return this.jQ.replaceWith(this.jQ=this.jQ.children()),e.adopt.apply(this,arguments)},t.clear=function(){return this.jQ.replaceWith(this.jQ.children()),this},t.levelUp=function(){var t=this,e=t.ends[u]=t.ends[p]=t.ends[p].parent.parent;return t.clear().jQwrap(e.jQ),t},t.extendDir=function(t){return i(t),this.ends[t]=this.ends[t][t],this.ends[t].jQ.insAtDirEnd(t,this.jQ),this},t.extendLeft=function(){return this.extendDir(u)},t.extendRight=function(){return this.extendDir(p)},t.retractDir=function(t){i(t),this.ends[-t].jQ.insDirOf(-t,this.jQ),this.ends[-t]=this.ends[-t][t]},t.retractRight=function(){return this.retractDir(p)},t.retractLeft=function(){return this.retractDir(u)}}),ae.fn.mathquill=function(t,e){var n,i,s,a,o;switch(t){case"redraw":return this.each(function(){var t=f(this).attr(ce),e=t&&v[t];e&&function n(t){t.eachChild(n),t.redraw&&t.redraw()}(e)});case"revert":return this.each(function(){var t=f(this).attr(ce),e=t&&v[t];e&&e.revert&&e.revert()});case"latex":return arguments.length>1?this.each(function(){var t=f(this).attr(ce),n=t&&v[t];n&&n.renderLatex(e)}):(n=f(this).attr(ce),i=n&&v[n],i&&i.latex());case"text":return n=f(this).attr(ce),i=n&&v[n],i&&i.text();case"html":return this.html().replace(/ ?hasCursor|hasCursor /,"").replace(/ class=(""|(?= |>))/g,"").replace(/<span class="?cursor( blink)?"?><\/span>/i,"").replace(/<span class="?textarea"?><textarea><\/textarea><\/span>/i,"");case"write":if(arguments.length>1)return this.each(function(){var t=f(this).attr(ce),n=t&&v[t],i=n&&n.cursor;i&&i.writeLatex(e).parent.blur()});case"cmd":if(arguments.length>1)return this.each(function(){var t,n=f(this).attr(ce),i=n&&v[n],r=i&&i.cursor;r&&(t=r.prepareWrite(),/^\\[a-z]+$/i.test(e)?r.insertCmd(e.slice(1),t):r.insertCh(e,t),r.hide().parent.blur())});default:return s="textbox"===t,a=s||"editable"===t,o=s?Q:q,this.each(function(){r(f(this),o(),s,a)})}},ae(function(){ae(".mathquill-editable:not(.mathquill-rendered-math)").mathquill("editable"),ae(".mathquill-textbox:not(.mathquill-rendered-math)").mathquill("textbox"),ae(".mathquill-embedded-latex").mathquill()})})();
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.config.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.config.js
new file mode 100644
index 0000000..87fa854
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.config.js
@@ -0,0 +1,323 @@
+/**
+ *  umeditor完整配置项
+ *  可以在这里配置整个编辑器的特性
+ */
+/**************************提示********************************
+ * 所有被注释的配置项均为UEditor默认值。
+ * 修改默认配置请首先确保已经完全明确该参数的真实用途。
+ * 主要有两种修改方案,一种是取消此处注释,然后修改成对应参数;另一种是在实例化编辑器时传入对应参数。
+ * 当升级编辑器时,可直接使用旧版配置文件替换新版配置文件,不用担心旧版配置文件中因缺少新功能所需的参数而导致脚本报错。
+ **************************提示********************************/
+
+
+(function () {
+    /**
+     * 编辑器资源文件根路径。它所表示的含义是:以编辑器实例化页面为当前路径,指向编辑器资源文件(即dialog等文件夹)的路径。
+     * 鉴于很多同学在使用编辑器的时候出现的种种路径问题,此处强烈建议大家使用"相对于网站根目录的相对路径"进行配置。
+     * "相对于网站根目录的相对路径"也就是以斜杠开头的形如"/myProject/umeditor/"这样的路径。
+     * 如果站点中有多个不在同一层级的页面需要实例化编辑器,且引用了同一UEditor的时候,此处的URL可能不适用于每个页面的编辑器。
+     * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。
+     * window.UMEDITOR_HOME_URL = "/xxxx/xxxx/";
+     */
+    var URL = window.UMEDITOR_HOME_URL || (function(){
+
+        function PathStack() {
+
+            this.documentURL = self.document.URL || self.location.href;
+
+            this.separator = '/';
+            this.separatorPattern = /\\|\//g;
+            this.currentDir = './';
+            this.currentDirPattern = /^[.]\/]/;
+
+            this.path = this.documentURL;
+            this.stack = [];
+
+            this.push( this.documentURL );
+
+        }
+
+        PathStack.isParentPath = function( path ){
+            return path === '..';
+        };
+
+        PathStack.hasProtocol = function( path ){
+            return !!PathStack.getProtocol( path );
+        };
+
+        PathStack.getProtocol = function( path ){
+
+            var protocol = /^[^:]*:\/*/.exec( path );
+
+            return protocol ? protocol[0] : null;
+
+        };
+
+        PathStack.prototype = {
+            push: function( path ){
+
+                this.path = path;
+
+                update.call( this );
+                parse.call( this );
+
+                return this;
+
+            },
+            getPath: function(){
+                return this + "";
+            },
+            toString: function(){
+                return this.protocol + ( this.stack.concat( [''] ) ).join( this.separator );
+            }
+        };
+
+        function update() {
+
+            var protocol = PathStack.getProtocol( this.path || '' );
+
+            if( protocol ) {
+
+                //根协议
+                this.protocol = protocol;
+
+                //local
+                this.localSeparator = /\\|\//.exec( this.path.replace( protocol, '' ) )[0];
+
+                this.stack = [];
+            } else {
+                protocol = /\\|\//.exec( this.path );
+                protocol && (this.localSeparator = protocol[0]);
+            }
+
+        }
+
+        function parse(){
+
+            var parsedStack = this.path.replace( this.currentDirPattern, '' );
+
+            if( PathStack.hasProtocol( this.path ) ) {
+                parsedStack = parsedStack.replace( this.protocol , '');
+            }
+
+            parsedStack = parsedStack.split( this.localSeparator );
+            parsedStack.length = parsedStack.length - 1;
+
+            for(var i= 0,tempPath,l=parsedStack.length,root = this.stack;i<l;i++){
+                tempPath = parsedStack[i];
+                if(tempPath){
+                    if( PathStack.isParentPath( tempPath ) ) {
+                        root.pop();
+                    } else {
+                        root.push( tempPath );
+                    }
+                }
+
+            }
+
+
+        }
+
+        var currentPath = document.getElementsByTagName('script');
+
+        currentPath = currentPath[ currentPath.length -1 ].src;
+
+        return new PathStack().push( currentPath ) + "";
+
+
+    })();
+
+    /**
+     * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。
+     */
+    window.UMEDITOR_CONFIG = {
+        //为编辑器实例添加一个路径,这个不能被注释
+        UMEDITOR_HOME_URL : URL
+
+        //图片上传配置区
+        ,imageUrl:Feng.ctxPath + "/guns-admin/upload/imageUp"             //图片上传提交地址
+        ,imagePath:""                     //图片修正地址,引用了fixedImagePath,如有特殊需求,可自行配置
+        ,imageFieldName:"upfile"                   //图片数据的key,若此处修改,需要在后台对应文件修改对应参数
+
+
+        //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的从新定义
+        ,toolbar:[
+            'source | undo redo | bold italic underline strikethrough | superscript subscript | forecolor backcolor | removeformat |',
+            'insertorderedlist insertunorderedlist | selectall cleardoc paragraph | fontfamily fontsize' ,
+            '| justifyleft justifycenter justifyright justifyjustify |',
+            'link unlink | emotion image video  | map',
+            '| horizontal print preview fullscreen', 'drafts', 'formula'
+        ]
+
+        //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换,当然,前提条件是lang文件夹下存在对应的语言文件:
+        //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase()
+        //,lang:"zh-cn"
+        //,langPath:URL +"lang/"
+
+        //ie下的链接自动监测
+        //,autourldetectinie:false
+
+        //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换,当然,前提条件是themes文件夹下存在对应的主题文件:
+        //现有如下皮肤:default
+        //,theme:'default'
+        //,themePath:URL +"themes/"
+
+
+
+        //针对getAllHtml方法,会在对应的head标签中增加该编码设置。
+        //,charset:"utf-8"
+
+        //常用配置项目
+        //,isShow : true    //默认显示编辑器
+
+        //,initialContent:'欢迎使用UMEDITOR!'    //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子
+
+        //,initialFrameWidth:500 //初始化编辑器宽度,默认500
+        //,initialFrameHeight:500  //初始化编辑器高度,默认500
+
+        //,autoClearinitialContent:true //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了
+
+        //,textarea:'editorValue' // 提交表单时,服务器获取编辑器提交内容的所用的参数,多实例时可以给容器name属性,会将name给定的值最为每个实例的键值,不用每次实例化的时候都设置这个值
+
+        //,focus:false //初始化时,是否让编辑器获得焦点true或false
+
+        //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况)
+
+        //,fullscreen : false //是否开启初始化时即全屏,默认关闭
+
+        //,readonly : false //编辑器初始化结束后,编辑区域是否是只读的,默认是false
+
+        //,zIndex : 900     //编辑器层级的基数,默认是900
+
+        //如果自定义,最好给p标签如下的行高,要不输入中文时,会有跳动感
+        //注意这里添加的样式,最好放在.edui-editor-body .edui-body-container这两个的下边,防止跟页面上css冲突
+        //,initialStyle:'.edui-editor-body .edui-body-container p{line-height:1em}'
+
+        //,autoSyncData:true //自动同步编辑器要提交的数据
+
+        //,emotionLocalization:false //是否开启表情本地化,默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹
+
+        //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串
+
+        //fontfamily
+        //字体设置
+//        ,'fontfamily':[
+//              { name: 'songti', val: '宋体,SimSun'},
+//          ]
+
+        //fontsize
+        //字号
+        //,'fontsize':[10, 11, 12, 14, 16, 18, 20, 24, 36]
+
+        //paragraph
+        //段落格式 值留空时支持多语言自动识别,若配置,则以配置值为准
+        //,'paragraph':{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''}
+
+        //undo
+        //可以最多回退的次数,默认20
+        //,maxUndoCount:20
+        //当输入的字符数超过该值时,保存一次现场
+        //,maxInputCount:1
+
+        //imageScaleEnabled
+        // 是否允许点击文件拖拽改变大小,默认true
+        //,imageScaleEnabled:true
+
+        //dropFileEnabled
+        // 是否允许拖放图片到编辑区域,上传并插入,默认true
+        //,dropFileEnabled:true
+
+        //pasteImageEnabled
+        // 是否允许粘贴QQ截屏,上传并插入,默认true
+        //,pasteImageEnabled:true
+
+        //autoHeightEnabled
+        // 是否自动长高,默认true
+        //,autoHeightEnabled:true
+
+        //autoFloatEnabled
+        //是否保持toolbar的位置不动,默认true
+        //,autoFloatEnabled:true
+
+        //浮动时工具栏距离浏览器顶部的高度,用于某些具有固定头部的页面
+        //,topOffset:30
+
+        //填写过滤规则
+        ,filterRules: {}
+        // xss 过滤是否开启,inserthtml等操作
+ 		,xssFilterRules: true
+ 		//input xss过滤
+ 		,inputXssFilter: true
+ 		//output xss过滤
+ 		,outputXssFilter: true
+ 		// xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js
+        ,whiteList: {
+            a:      ['target', 'href', 'title', 'style', 'class', 'id'],
+			abbr:   ['title', 'style', 'class', 'id'],
+			address: ['style', 'class', 'id'],
+			area:   ['shape', 'coords', 'href', 'alt', 'style', 'class', 'id'],
+			article: ['style', 'class', 'id'],
+			aside:  ['style', 'class', 'id'],
+			audio:  ['autoplay', 'controls', 'loop', 'preload', 'src', 'style', 'class', 'id'],
+			b:      ['style', 'class', 'id'],
+			bdi:    ['dir'],
+			bdo:    ['dir'],
+			big:    [],
+			blockquote: ['cite', 'style', 'class', 'id'],
+			br:     [],
+			caption: ['style', 'class', 'id'],
+			center: [],
+			cite:   [],
+			code:   ['style', 'class', 'id'],
+			col:    ['align', 'valign', 'span', 'width', 'style', 'class', 'id'],
+			colgroup: ['align', 'valign', 'span', 'width', 'style', 'class', 'id'],
+			dd:     ['style', 'class', 'id'],
+			del:    ['datetime', 'style', 'class', 'id'],
+			details: ['open', 'style', 'class', 'id'],
+			div:    ['style', 'class', 'id'],
+			dl:     ['style', 'class', 'id'],
+			dt:     ['style', 'class', 'id'],
+			em:     ['style', 'class', 'id'],
+            embed:  ['style', 'class', 'id', '_url', 'type', 'pluginspage', 'src', 'width', 'height', 'wmode', 'play', 'loop', 'menu', 'allowscriptaccess', 'allowfullscreen'],
+			font:   ['color', 'size', 'face', 'style', 'class', 'id'],
+			footer: ['style', 'class', 'id'],
+			h1:     ['style', 'class', 'id'],
+			h2:     ['style', 'class', 'id'],
+			h3:     ['style', 'class', 'id'],
+			h4:     ['style', 'class', 'id'],
+			h5:     ['style', 'class', 'id'],
+			h6:     ['style', 'class', 'id'],
+			header: ['style', 'class', 'id'],
+			hr:     ['style', 'class', 'id'],
+			i:      ['style', 'class', 'id'],
+            iframe: ['style', 'class', 'id', 'src', 'frameborder', 'data-latex'],
+			img:    ['src', 'alt', 'title', 'width', 'height', 'style', 'class', 'id', '_url'],
+			ins:    ['datetime', 'style', 'class', 'id'],
+			li:     ['style', 'class', 'id'],
+			mark:   [],
+			nav:    [],
+			ol:     ['style', 'class', 'id'],
+			p:      ['style', 'class', 'id'],
+			pre:    ['style', 'class', 'id'],
+			s:      [],
+			section:[],
+			small:  ['style', 'class', 'id'],
+			span:   ['style', 'class', 'id'],
+			sub:    ['style', 'class', 'id'],
+			sup:    ['style', 'class', 'id'],
+			strong: ['style', 'class', 'id'],
+			table:  ['width', 'border', 'align', 'valign', 'style', 'class', 'id'],
+			tbody:  ['align', 'valign', 'style', 'class', 'id'],
+			td:     ['width', 'rowspan', 'colspan', 'align', 'valign', 'style', 'class', 'id'],
+			tfoot:  ['align', 'valign', 'style', 'class', 'id'],
+			th:     ['width', 'rowspan', 'colspan', 'align', 'valign', 'style', 'class', 'id'],
+			thead:  ['align', 'valign', 'style', 'class', 'id'],
+			tr:     ['rowspan', 'align', 'valign', 'style', 'class', 'id'],
+			tt:     ['style', 'class', 'id'],
+			u:      [],
+			ul:     ['style', 'class', 'id'],
+            svg:    ['style', 'class', 'id', 'width', 'height', 'xmlns', 'fill', 'viewBox'],
+			video:  ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'style', 'class', 'id']
+        }
+    };
+})();
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.js
new file mode 100644
index 0000000..dd2048a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.js
@@ -0,0 +1,10923 @@
+/*!
+ * UEditor Mini版本
+ * version: 1.2.2
+ * build: Wed Mar 19 2014 17:08:14 GMT+0800 (中国标准时间)
+ */
+
+(function($){
+
+UMEDITOR_CONFIG = window.UMEDITOR_CONFIG || {};
+
+window.UM = {
+    plugins : {},
+
+    commands : {},
+
+    I18N : {},
+
+    version : "1.2.2"
+};
+
+var dom = UM.dom = {};
+/**
+ * 浏览器判断模块
+ * @file
+ * @module UE.browser
+ * @since 1.2.6.1
+ */
+
+/**
+ * 提供浏览器检测的模块
+ * @unfile
+ * @module UE.browser
+ */
+var browser = UM.browser = function(){
+    var agent = navigator.userAgent.toLowerCase(),
+        opera = window.opera,
+        browser = {
+            /**
+             * @property {boolean} ie 检测当前浏览器是否为IE
+             * @example
+             * ```javascript
+             * if ( UE.browser.ie ) {
+         *     console.log( '当前浏览器是IE' );
+         * }
+             * ```
+             */
+            ie		:  /(msie\s|trident.*rv:)([\w.]+)/.test(agent),
+
+            /**
+             * @property {boolean} opera 检测当前浏览器是否为Opera
+             * @example
+             * ```javascript
+             * if ( UE.browser.opera ) {
+         *     console.log( '当前浏览器是Opera' );
+         * }
+             * ```
+             */
+            opera	: ( !!opera && opera.version ),
+
+            /**
+             * @property {boolean} webkit 检测当前浏览器是否是webkit内核的浏览器
+             * @example
+             * ```javascript
+             * if ( UE.browser.webkit ) {
+         *     console.log( '当前浏览器是webkit内核浏览器' );
+         * }
+             * ```
+             */
+            webkit	: ( agent.indexOf( ' applewebkit/' ) > -1 ),
+
+            /**
+             * @property {boolean} mac 检测当前浏览器是否是运行在mac平台下
+             * @example
+             * ```javascript
+             * if ( UE.browser.mac ) {
+         *     console.log( '当前浏览器运行在mac平台下' );
+         * }
+             * ```
+             */
+            mac	: ( agent.indexOf( 'macintosh' ) > -1 ),
+
+            /**
+             * @property {boolean} quirks 检测当前浏览器是否处于“怪异模式”下
+             * @example
+             * ```javascript
+             * if ( UE.browser.quirks ) {
+         *     console.log( '当前浏览器运行处于“怪异模式”' );
+         * }
+             * ```
+             */
+            quirks : ( document.compatMode == 'BackCompat' )
+        };
+
+    /**
+     * @property {boolean} gecko 检测当前浏览器内核是否是gecko内核
+     * @example
+     * ```javascript
+     * if ( UE.browser.gecko ) {
+    *     console.log( '当前浏览器内核是gecko内核' );
+    * }
+     * ```
+     */
+    browser.gecko =( navigator.product == 'Gecko' && !browser.webkit && !browser.opera && !browser.ie);
+
+    var version = 0;
+
+    // Internet Explorer 6.0+
+    if ( browser.ie ){
+
+
+        var v1 =  agent.match(/(?:msie\s([\w.]+))/);
+        var v2 = agent.match(/(?:trident.*rv:([\w.]+))/);
+        if(v1 && v2 && v1[1] && v2[1]){
+            version = Math.max(v1[1]*1,v2[1]*1);
+        }else if(v1 && v1[1]){
+            version = v1[1]*1;
+        }else if(v2 && v2[1]){
+            version = v2[1]*1;
+        }else{
+            version = 0;
+        }
+
+        browser.ie11Compat = document.documentMode == 11;
+        /**
+         * @property { boolean } ie9Compat 检测浏览器模式是否为 IE9 兼容模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie9Compat ) {
+         *     console.log( '当前浏览器运行在IE9兼容模式下' );
+         * }
+         * ```
+         */
+        browser.ie9Compat = document.documentMode == 9;
+
+        /**
+         * @property { boolean } ie8 检测浏览器是否是IE8浏览器
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie8 ) {
+         *     console.log( '当前浏览器是IE8浏览器' );
+         * }
+         * ```
+         */
+        browser.ie8 = !!document.documentMode;
+
+        /**
+         * @property { boolean } ie8Compat 检测浏览器模式是否为 IE8 兼容模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie8Compat ) {
+         *     console.log( '当前浏览器运行在IE8兼容模式下' );
+         * }
+         * ```
+         */
+        browser.ie8Compat = document.documentMode == 8;
+
+        /**
+         * @property { boolean } ie7Compat 检测浏览器模式是否为 IE7 兼容模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie7Compat ) {
+         *     console.log( '当前浏览器运行在IE7兼容模式下' );
+         * }
+         * ```
+         */
+        browser.ie7Compat = ( ( version == 7 && !document.documentMode )
+            || document.documentMode == 7 );
+
+        /**
+         * @property { boolean } ie6Compat 检测浏览器模式是否为 IE6 模式 或者怪异模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie6Compat ) {
+         *     console.log( '当前浏览器运行在IE6模式或者怪异模式下' );
+         * }
+         * ```
+         */
+        browser.ie6Compat = ( version < 7 || browser.quirks );
+
+        browser.ie9above = version > 8;
+
+        browser.ie9below = version < 9;
+
+    }
+
+    // Gecko.
+    if ( browser.gecko ){
+        var geckoRelease = agent.match( /rv:([\d\.]+)/ );
+        if ( geckoRelease )
+        {
+            geckoRelease = geckoRelease[1].split( '.' );
+            version = geckoRelease[0] * 10000 + ( geckoRelease[1] || 0 ) * 100 + ( geckoRelease[2] || 0 ) * 1;
+        }
+    }
+
+    /**
+     * @property { Number } chrome 检测当前浏览器是否为Chrome, 如果是,则返回Chrome的大版本号
+     * @warning 如果浏览器不是chrome, 则该值为undefined
+     * @example
+     * ```javascript
+     * if ( UE.browser.chrome ) {
+     *     console.log( '当前浏览器是Chrome' );
+     * }
+     * ```
+     */
+    if (/chrome\/(\d+\.\d)/i.test(agent)) {
+        browser.chrome = + RegExp['\x241'];
+    }
+
+    /**
+     * @property { Number } safari 检测当前浏览器是否为Safari, 如果是,则返回Safari的大版本号
+     * @warning 如果浏览器不是safari, 则该值为undefined
+     * @example
+     * ```javascript
+     * if ( UE.browser.safari ) {
+     *     console.log( '当前浏览器是Safari' );
+     * }
+     * ```
+     */
+    if(/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) && !/chrome/i.test(agent)){
+        browser.safari = + (RegExp['\x241'] || RegExp['\x242']);
+    }
+
+
+    // Opera 9.50+
+    if ( browser.opera )
+        version = parseFloat( opera.version() );
+
+    // WebKit 522+ (Safari 3+)
+    if ( browser.webkit )
+        version = parseFloat( agent.match( / applewebkit\/(\d+)/ )[1] );
+
+    /**
+     * @property { Number } version 检测当前浏览器版本号
+     * @remind
+     * <ul>
+     *     <li>IE系列返回值为5,6,7,8,9,10等</li>
+     *     <li>gecko系列会返回10900,158900等</li>
+     *     <li>webkit系列会返回其build号 (如 522等)</li>
+     * </ul>
+     * @example
+     * ```javascript
+     * console.log( '当前浏览器版本号是: ' + UE.browser.version );
+     * ```
+     */
+    browser.version = version;
+
+    /**
+     * @property { boolean } isCompatible 检测当前浏览器是否能够与UEditor良好兼容
+     * @example
+     * ```javascript
+     * if ( UE.browser.isCompatible ) {
+     *     console.log( '浏览器与UEditor能够良好兼容' );
+     * }
+     * ```
+     */
+    browser.isCompatible =
+        !browser.mobile && (
+            ( browser.ie && version >= 6 ) ||
+                ( browser.gecko && version >= 10801 ) ||
+                ( browser.opera && version >= 9.5 ) ||
+                ( browser.air && version >= 1 ) ||
+                ( browser.webkit && version >= 522 ) ||
+                false );
+    return browser;
+}();
+//快捷方式
+var ie = browser.ie,
+    webkit = browser.webkit,
+    gecko = browser.gecko,
+    opera = browser.opera;
+/**
+ * @file
+ * @name UM.Utils
+ * @short Utils
+ * @desc UEditor封装使用的静态工具函数
+ * @import editor.js
+ */
+var utils = UM.utils = {
+    /**
+     * 遍历数组,对象,nodeList
+     * @name each
+     * @grammar UM.utils.each(obj,iterator,[context])
+     * @since 1.2.4+
+     * @desc
+     * * obj 要遍历的对象
+     * * iterator 遍历的方法,方法的第一个是遍历的值,第二个是索引,第三个是obj
+     * * context  iterator的上下文
+     * @example
+     * UM.utils.each([1,2],function(v,i){
+     *     console.log(v)//值
+     *     console.log(i)//索引
+     * })
+     * UM.utils.each(document.getElementsByTagName('*'),function(n){
+     *     console.log(n.tagName)
+     * })
+     */
+    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;
+                }
+            }
+        }
+    },
+
+    makeInstance:function (obj) {
+        var noop = new Function();
+        noop.prototype = obj;
+        obj = new noop;
+        noop.prototype = null;
+        return obj;
+    },
+    /**
+     * 将source对象中的属性扩展到target对象上
+     * @name extend
+     * @grammar UM.utils.extend(target,source)  => Object  //覆盖扩展
+     * @grammar UM.utils.extend(target,source,true)  ==> Object  //保留扩展
+     */
+    extend:function (t, s, b) {
+        if (s) {
+            for (var k in s) {
+                if (!b || !t.hasOwnProperty(k)) {
+                    t[k] = s[k];
+                }
+            }
+        }
+        return t;
+    },
+    extend2:function (t) {
+        var a = arguments;
+        for (var i = 1; i < a.length; i++) {
+            var x = a[i];
+            for (var k in x) {
+                if (!t.hasOwnProperty(k)) {
+                    t[k] = x[k];
+                }
+            }
+        }
+        return t;
+    },
+    /**
+     * 模拟继承机制,subClass继承superClass
+     * @name inherits
+     * @grammar UM.utils.inherits(subClass,superClass) => subClass
+     * @example
+     * function SuperClass(){
+     *     this.name = "小李";
+     * }
+     * SuperClass.prototype = {
+     *     hello:function(str){
+     *         console.log(this.name + str);
+     *     }
+     * }
+     * function SubClass(){
+     *     this.name = "小张";
+     * }
+     * UM.utils.inherits(SubClass,SuperClass);
+     * var sub = new SubClass();
+     * sub.hello("早上好!"); ==> "小张早上好!"
+     */
+    inherits:function (subClass, superClass) {
+        var oldP = subClass.prototype,
+            newP = utils.makeInstance(superClass.prototype);
+        utils.extend(newP, oldP, true);
+        subClass.prototype = newP;
+        return (newP.constructor = subClass);
+    },
+
+    /**
+     * 用指定的context作为fn上下文,也就是this
+     * @name bind
+     * @grammar UM.utils.bind(fn,context)  =>  fn
+     */
+    bind:function (fn, context) {
+        return function () {
+            return fn.apply(context, arguments);
+        };
+    },
+
+    /**
+     * 创建延迟delay执行的函数fn
+     * @name defer
+     * @grammar UM.utils.defer(fn,delay)  =>fn   //延迟delay毫秒执行fn,返回fn
+     * @grammar UM.utils.defer(fn,delay,exclusion)  =>fn   //延迟delay毫秒执行fn,若exclusion为真,则互斥执行fn
+     * @example
+     * function test(){
+     *     console.log("延迟输出!");
+     * }
+     * //非互斥延迟执行
+     * var testDefer = UM.utils.defer(test,1000);
+     * testDefer();   =>  "延迟输出!";
+     * testDefer();   =>  "延迟输出!";
+     * //互斥延迟执行
+     * var testDefer1 = UM.utils.defer(test,1000,true);
+     * testDefer1();   =>  //本次不执行
+     * testDefer1();   =>  "延迟输出!";
+     */
+    defer:function (fn, delay, exclusion) {
+        var timerID;
+        return function () {
+            if (exclusion) {
+                clearTimeout(timerID);
+            }
+            timerID = setTimeout(fn, delay);
+        };
+    },
+
+    /**
+     * 查找元素item在数组array中的索引, 若找不到返回-1
+     * @name indexOf
+     * @grammar UM.utils.indexOf(array,item)  => index|-1  //默认从数组开头部开始搜索
+     * @grammar UM.utils.indexOf(array,item,start)  => index|-1  //start指定开始查找的位置
+     */
+    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;
+    },
+
+    /**
+     * 移除数组array中的元素item
+     * @name removeItem
+     * @grammar UM.utils.removeItem(array,item)
+     */
+    removeItem:function (array, item) {
+        for (var i = 0, l = array.length; i < l; i++) {
+            if (array[i] === item) {
+                array.splice(i, 1);
+                i--;
+            }
+        }
+    },
+
+    /**
+     * 删除字符串str的首尾空格
+     * @name trim
+     * @grammar UM.utils.trim(str) => String
+     */
+    trim:function (str) {
+        return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, '');
+    },
+
+    /**
+     * 将字符串list(以','分隔)或者数组list转成哈希对象
+     * @name listToMap
+     * @grammar UM.utils.listToMap(list)  => Object  //Object形如{test:1,br:1,textarea:1}
+     */
+    listToMap:function (list) {
+        if (!list)return {};
+        list = utils.isArray(list) ? list : list.split(',');
+        for (var i = 0, ci, obj = {}; ci = list[i++];) {
+            obj[ci.toUpperCase()] = obj[ci] = 1;
+        }
+        return obj;
+    },
+
+    /**
+     * 将str中的html符号转义,默认将转义''&<">''四个字符,可自定义reg来确定需要转义的字符
+     * @name unhtml
+     * @grammar UM.utils.unhtml(str);  => String
+     * @grammar UM.utils.unhtml(str,reg)  => String
+     * @example
+     * var html = '<body>You say:"你好!Baidu & UEditor!"</body>';
+     * UM.utils.unhtml(html);   ==>  &lt;body&gt;You say:&quot;你好!Baidu &amp; UEditor!&quot;&lt;/body&gt;
+     * UM.utils.unhtml(html,/[<>]/g)  ==>  &lt;body&gt;You say:"你好!Baidu & UEditor!"&lt;/body&gt;
+     */
+    unhtml:function (str, reg) {
+        return str ? str.replace(reg || /[&<">'](?:(amp|lt|quot|gt|#39|nbsp);)?/g, function (a, b) {
+            if (b) {
+                return a;
+            } else {
+                return {
+                    '<':'&lt;',
+                    '&':'&amp;',
+                    '"':'&quot;',
+                    '>':'&gt;',
+                    "'":'&#39;'
+                }[a]
+            }
+
+        }) : '';
+    },
+    /**
+     * 将str中的转义字符还原成html字符
+     * @name html
+     * @grammar UM.utils.html(str)  => String   //详细参见<code><a href = '#unhtml'>unhtml</a></code>
+     */
+    html:function (str) {
+        return str ? str.replace(/&((g|l|quo)t|amp|#39);/g, function (m) {
+            return {
+                '&lt;':'<',
+                '&amp;':'&',
+                '&quot;':'"',
+                '&gt;':'>',
+                '&#39;':"'"
+            }[m]
+        }) : '';
+    },
+    /**
+     * 将css样式转换为驼峰的形式。如font-size => fontSize
+     * @name cssStyleToDomStyle
+     * @grammar UM.utils.cssStyleToDomStyle(cssName)  => String
+     */
+    cssStyleToDomStyle:function () {
+        var test = document.createElement('div').style,
+            cache = {
+                'float':test.cssFloat != undefined ? 'cssFloat' : test.styleFloat != undefined ? 'styleFloat' : 'float'
+            };
+
+        return function (cssName) {
+            return cache[cssName] || (cache[cssName] = cssName.toLowerCase().replace(/-./g, function (match) {
+                return match.charAt(1).toUpperCase();
+            }));
+        };
+    }(),
+    /**
+     * 动态加载文件到doc中,并依据obj来设置属性,加载成功后执行回调函数fn
+     * @name loadFile
+     * @grammar UM.utils.loadFile(doc,obj)
+     * @grammar UM.utils.loadFile(doc,obj,fn)
+     * @example
+     * //指定加载到当前document中一个script文件,加载成功后执行function
+     * utils.loadFile( document, {
+     *     src:"test.js",
+     *     tag:"script",
+     *     type:"text/javascript",
+     *     defer:"defer"
+     * }, function () {
+     *     console.log('加载成功!')
+     * });
+     */
+    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(' ') + ' ></' + obj.tag + '>');
+                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 settings of file umeditor.config.js ')
+            };
+            doc.getElementsByTagName("head")[0].appendChild(element);
+        }
+    }(),
+    /**
+     * 判断obj对象是否为空
+     * @name isEmptyObject
+     * @grammar UM.utils.isEmptyObject(obj)  => true|false
+     * @example
+     * UM.utils.isEmptyObject({}) ==>true
+     * UM.utils.isEmptyObject([]) ==>true
+     * UM.utils.isEmptyObject("") ==>true
+     */
+    isEmptyObject:function (obj) {
+        if (obj == null) return true;
+        if (this.isArray(obj) || this.isString(obj)) return obj.length === 0;
+        for (var key in obj) if (obj.hasOwnProperty(key)) return false;
+        return true;
+    },
+
+    /**
+     * 统一将颜色值使用16进制形式表示
+     * @name fixColor
+     * @grammar UM.utils.fixColor(name,value) => value
+     * @example
+     * rgb(255,255,255)  => "#ffffff"
+     */
+    fixColor:function (name, value) {
+        if (/color/i.test(name) && /rgba?/.test(value)) {
+            var array = value.split(",");
+            if (array.length > 3)
+                return "";
+            value = "#";
+            for (var i = 0, color; color = array[i++];) {
+                color = parseInt(color.replace(/[^\d]/gi, ''), 10).toString(16);
+                value += color.length == 1 ? "0" + color : color;
+            }
+            value = value.toUpperCase();
+        }
+        return  value;
+    },
+
+    /**
+     * 深度克隆对象,从source到target
+     * @name clone
+     * @grammar UM.utils.clone(source) => anthorObj 新的对象是完整的source的副本
+     * @grammar UM.utils.clone(source,target) => target包含了source的所有内容,重名会覆盖
+     */
+    clone:function (source, target) {
+        var tmp;
+        target = target || {};
+        for (var i in source) {
+            if (source.hasOwnProperty(i)) {
+                tmp = source[i];
+                if (typeof tmp == 'object') {
+                    target[i] = utils.isArray(tmp) ? [] : {};
+                    utils.clone(source[i], target[i])
+                } else {
+                    target[i] = tmp;
+                }
+            }
+        }
+        return target;
+    },
+    /**
+     * 转换cm/pt到px
+     * @name transUnitToPx
+     * @grammar UM.utils.transUnitToPx('20pt') => '27px'
+     * @grammar UM.utils.transUnitToPx('0pt') => '0'
+     */
+    transUnitToPx:function (val) {
+        if (!/(pt|cm)/.test(val)) {
+            return val
+        }
+        var unit;
+        val.replace(/([\d.]+)(\w+)/, function (str, v, u) {
+            val = v;
+            unit = u;
+        });
+        switch (unit) {
+            case 'cm':
+                val = parseFloat(val) * 25;
+                break;
+            case 'pt':
+                val = Math.round(parseFloat(val) * 96 / 72);
+        }
+        return val + (val ? 'px' : '');
+    },
+    /**
+     * 动态添加css样式
+     * @name cssRule
+     * @grammar UM.utils.cssRule('添加的样式的节点名称',['样式','放到哪个document上'])
+     * @grammar UM.utils.cssRule('body','body{background:#ccc}') => null  //给body添加背景颜色
+     * @grammar UM.utils.cssRule('body') =>样式的字符串  //取得key值为body的样式的内容,如果没有找到key值先关的样式将返回空,例如刚才那个背景颜色,将返回 body{background:#ccc}
+     * @grammar UM.utils.cssRule('body','') =>null //清空给定的key值的背景颜色
+     */
+    cssRule:browser.ie && browser.version != 11 ? 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 = 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 = style;
+        } else {
+            head.removeChild(node)
+        }
+    }
+
+};
+/**
+ * 判断str是否为字符串
+ * @name isString
+ * @grammar UM.utils.isString(str) => true|false
+ */
+/**
+ * 判断array是否为数组
+ * @name isArray
+ * @grammar UM.utils.isArray(obj) => true|false
+ */
+/**
+ * 判断obj对象是否为方法
+ * @name isFunction
+ * @grammar UM.utils.isFunction(obj)  => true|false
+ */
+/**
+ * 判断obj对象是否为数字
+ * @name isNumber
+ * @grammar UM.utils.isNumber(obj)  => true|false
+ */
+utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object'], function (v) {
+    UM.utils['is' + v] = function (obj) {
+        return Object.prototype.toString.apply(obj) == '[object ' + v + ']';
+    }
+});
+/**
+ * @file
+ * @name UM.EventBase
+ * @short EventBase
+ * @import editor.js,core/utils.js
+ * @desc UE采用的事件基类,继承此类的对应类将获取addListener,removeListener,fireEvent方法。
+ * 在UE中,Editor以及所有ui实例都继承了该类,故可以在对应的ui对象以及editor对象上使用上述方法。
+ */
+var EventBase = UM.EventBase = function () {};
+
+EventBase.prototype = {
+    /**
+     * 注册事件监听器
+     * @name addListener
+     * @grammar editor.addListener(types,fn)  //types为事件名称,多个可用空格分隔
+     * @example
+     * editor.addListener('selectionchange',function(){
+     *      console.log("选区已经变化!");
+     * })
+     * editor.addListener('beforegetcontent aftergetcontent',function(type){
+     *         if(type == 'beforegetcontent'){
+     *             //do something
+     *         }else{
+     *             //do something
+     *         }
+     *         console.log(this.getContent) // this是注册的事件的编辑器实例
+     * })
+     */
+    addListener:function (types, listener) {
+        types = utils.trim(types).split(' ');
+        for (var i = 0, ti; ti = types[i++];) {
+            getListener(this, ti, true).push(listener);
+        }
+    },
+    /**
+     * 移除事件监听器
+     * @name removeListener
+     * @grammar editor.removeListener(types,fn)  //types为事件名称,多个可用空格分隔
+     * @example
+     * //changeCallback为方法体
+     * editor.removeListener("selectionchange",changeCallback);
+     */
+    removeListener:function (types, listener) {
+        types = utils.trim(types).split(' ');
+        for (var i = 0, ti; ti = types[i++];) {
+            utils.removeItem(getListener(this, ti) || [], listener);
+        }
+    },
+    /**
+     * 触发事件
+     * @name fireEvent
+     * @grammar editor.fireEvent(types)  //types为事件名称,多个可用空格分隔
+     * @example
+     * editor.fireEvent("selectionchange");
+     */
+    fireEvent:function () {
+        var types = arguments[0];
+        types = utils.trim(types).split(' ');
+        for (var i = 0, ti; ti = types[i++];) {
+            var listeners = getListener(this, ti),
+                r, t, k;
+            if (listeners) {
+                k = listeners.length;
+                while (k--) {
+                    if(!listeners[k])continue;
+                    t = listeners[k].apply(this, arguments);
+                    if(t === true){
+                        return t;
+                    }
+                    if (t !== undefined) {
+                        r = t;
+                    }
+                }
+            }
+            if (t = this['on' + ti.toLowerCase()]) {
+                r = t.apply(this, arguments);
+            }
+        }
+        return r;
+    }
+};
+/**
+ * 获得对象所拥有监听类型的所有监听器
+ * @public
+ * @function
+ * @param {Object} obj  查询监听器的对象
+ * @param {String} type 事件类型
+ * @param {Boolean} force  为true且当前所有type类型的侦听器不存在时,创建一个空监听器数组
+ * @returns {Array} 监听器数组
+ */
+function getListener(obj, type, force) {
+    var allListeners;
+    type = type.toLowerCase();
+    return ( ( allListeners = ( obj.__allListeners || force && ( obj.__allListeners = {} ) ) )
+        && ( allListeners[type] || force && ( allListeners[type] = [] ) ) );
+}
+
+
+///import editor.js
+///import core/dom/dom.js
+///import core/utils.js
+/**
+ * dtd html语义化的体现类
+ * @constructor
+ * @namespace dtd
+ */
+var dtd = dom.dtd = (function() {
+    function _( s ) {
+        for (var k in s) {
+            s[k.toUpperCase()] = s[k];
+        }
+        return s;
+    }
+    var X = utils.extend2;
+    var A = _({isindex:1,fieldset:1}),
+        B = _({input:1,button:1,select:1,textarea:1,label:1}),
+        C = X( _({a:1}), B ),
+        D = X( {iframe:1}, C ),
+        E = _({hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1}),
+        F = _({ins:1,del:1,script:1,style:1}),
+        G = X( _({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1}), F ),
+        H = X( _({sub:1,img:1,embed:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1}), G ),
+        I = X( _({p:1}), H ),
+        J = X( _({iframe:1}), H, B ),
+        K = _({img:1,embed:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1}),
+
+        L = X( _({a:0}), J ),//a不能被切开,所以把他
+        M = _({tr:1}),
+        N = _({'#':1}),
+        O = X( _({param:1}), K ),
+        P = X( _({form:1}), A, D, E, I ),
+        Q = _({li:1,ol:1,ul:1}),
+        R = _({style:1,script:1}),
+        S = _({base:1,link:1,meta:1,title:1}),
+        T = X( S, R ),
+        U = _({head:1,body:1}),
+        V = _({html:1});
+
+    var block = _({address:1,blockquote:1,center:1,dir:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,menu:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1}),
+
+        empty =  _({area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1});
+
+    return  _({
+
+        // $ 表示自定的属性
+
+        // body外的元素列表.
+        $nonBodyContent: X( V, U, S ),
+
+        //块结构元素列表
+        $block : block,
+
+        //内联元素列表
+        $inline : L,
+
+        $inlineWithA : X(_({a:1}),L),
+
+        $body : X( _({script:1,style:1}), block ),
+
+        $cdata : _({script:1,style:1}),
+
+        //自闭和元素
+        $empty : empty,
+
+        //不是自闭合,但不能让range选中里边
+        $nonChild : _({iframe:1,textarea:1}),
+        //列表元素列表
+        $listItem : _({dd:1,dt:1,li:1}),
+
+        //列表根元素列表
+        $list: _({ul:1,ol:1,dl:1}),
+
+        //不能认为是空的元素
+        $isNotEmpty : _({table:1,ul:1,ol:1,dl:1,iframe:1,area:1,base:1,col:1,hr:1,img:1,embed:1,input:1,link:1,meta:1,param:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1}),
+
+        //如果没有子节点就可以删除的元素列表,像span,a
+        $removeEmpty : _({a:1,abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1}),
+
+        $removeEmptyBlock : _({'p':1,'div':1}),
+
+        //在table元素里的元素列表
+        $tableContent : _({caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1,table:1}),
+        //不转换的标签
+        $notTransContent : _({pre:1,script:1,style:1,textarea:1}),
+        html: U,
+        head: T,
+        style: N,
+        script: N,
+        body: P,
+        base: {},
+        link: {},
+        meta: {},
+        title: N,
+        col : {},
+        tr : _({td:1,th:1}),
+        img : {},
+        embed: {},
+        colgroup : _({thead:1,col:1,tbody:1,tr:1,tfoot:1}),
+        noscript : P,
+        td : P,
+        br : {},
+        th : P,
+        center : P,
+        kbd : L,
+        button : X( I, E ),
+        basefont : {},
+        h5 : L,
+        h4 : L,
+        samp : L,
+        h6 : L,
+        ol : Q,
+        h1 : L,
+        h3 : L,
+        option : N,
+        h2 : L,
+        form : X( A, D, E, I ),
+        select : _({optgroup:1,option:1}),
+        font : L,
+        ins : L,
+        menu : Q,
+        abbr : L,
+        label : L,
+        table : _({thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1}),
+        code : L,
+        tfoot : M,
+        cite : L,
+        li : P,
+        input : {},
+        iframe : P,
+        strong : L,
+        textarea : N,
+        noframes : P,
+        big : L,
+        small : L,
+        //trace:
+        span :_({'#':1,br:1,b:1,strong:1,u:1,i:1,em:1,sub:1,sup:1,strike:1,span:1}),
+        hr : L,
+        dt : L,
+        sub : L,
+        optgroup : _({option:1}),
+        param : {},
+        bdo : L,
+        'var' : L,
+        div : P,
+        object : O,
+        sup : L,
+        dd : P,
+        strike : L,
+        area : {},
+        dir : Q,
+        map : X( _({area:1,form:1,p:1}), A, F, E ),
+        applet : O,
+        dl : _({dt:1,dd:1}),
+        del : L,
+        isindex : {},
+        fieldset : X( _({legend:1}), K ),
+        thead : M,
+        ul : Q,
+        acronym : L,
+        b : L,
+        a : X( _({a:1}), J ),
+        blockquote :X(_({td:1,tr:1,tbody:1,li:1}),P),
+        caption : L,
+        i : L,
+        u : L,
+        tbody : M,
+        s : L,
+        address : X( D, I ),
+        tt : L,
+        legend : L,
+        q : L,
+        pre : X( G, C ),
+        p : X(_({'a':1}),L),
+        em :L,
+        dfn : L
+    });
+})();
+
+/**
+ * @file
+ * @name UM.dom.domUtils
+ * @short DomUtils
+ * @import editor.js, core/utils.js,core/browser.js,core/dom/dtd.js
+ * @desc UEditor封装的底层dom操作库
+ */
+
+function getDomNode(node, start, ltr, startFromChild, fn, guard) {
+    var tmpNode = startFromChild && node[start],
+        parent;
+    !tmpNode && (tmpNode = node[ltr]);
+    while (!tmpNode && (parent = (parent || node).parentNode)) {
+        if (parent.tagName == 'BODY' || guard && !guard(parent)) {
+            return null;
+        }
+        tmpNode = parent[ltr];
+    }
+    if (tmpNode && fn && !fn(tmpNode)) {
+        return  getDomNode(tmpNode, start, ltr, false, fn);
+    }
+    return tmpNode;
+}
+var attrFix = ie && browser.version < 9 ? {
+        tabindex: "tabIndex",
+        readonly: "readOnly",
+        "for": "htmlFor",
+        "class": "className",
+        maxlength: "maxLength",
+        cellspacing: "cellSpacing",
+        cellpadding: "cellPadding",
+        rowspan: "rowSpan",
+        colspan: "colSpan",
+        usemap: "useMap",
+        frameborder: "frameBorder"
+    } : {
+        tabindex: "tabIndex",
+        readonly: "readOnly"
+    },
+    styleBlock = utils.listToMap([
+        '-webkit-box', '-moz-box', 'block' ,
+        'list-item' , 'table' , 'table-row-group' ,
+        'table-header-group', 'table-footer-group' ,
+        'table-row' , 'table-column-group' , 'table-column' ,
+        'table-cell' , 'table-caption'
+    ]);
+var domUtils = dom.domUtils = {
+    //节点常量
+    NODE_ELEMENT: 1,
+    NODE_DOCUMENT: 9,
+    NODE_TEXT: 3,
+    NODE_COMMENT: 8,
+    NODE_DOCUMENT_FRAGMENT: 11,
+
+    //位置关系
+    POSITION_IDENTICAL: 0,
+    POSITION_DISCONNECTED: 1,
+    POSITION_FOLLOWING: 2,
+    POSITION_PRECEDING: 4,
+    POSITION_IS_CONTAINED: 8,
+    POSITION_CONTAINS: 16,
+    //ie6使用其他的会有一段空白出现
+    fillChar: ie && browser.version == '6' ? '\ufeff' : '\u200B',
+    //-------------------------Node部分--------------------------------
+    keys: {
+        /*Backspace*/ 8: 1, /*Delete*/ 46: 1,
+        /*Shift*/ 16: 1, /*Ctrl*/ 17: 1, /*Alt*/ 18: 1,
+        37: 1, 38: 1, 39: 1, 40: 1,
+        13: 1 /*enter*/
+    },
+    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;
+    },
+    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');
+    },
+    /**
+     * 获取节点A相对于节点B的位置关系
+     * @name getPosition
+     * @grammar UM.dom.domUtils.getPosition(nodeA,nodeB)  =>  Number
+     * @example
+     *  switch (returnValue) {
+     *      case 0: //相等,同一节点
+     *      case 1: //无关,节点不相连
+     *      case 2: //跟随,即节点A头部位于节点B头部的后面
+     *      case 4: //前置,即节点A头部位于节点B头部的前面
+     *      case 8: //被包含,即节点A被节点B包含
+     *      case 10://组合类型,即节点A满足跟随节点B且被节点B包含。实际上,如果被包含,必定跟随,所以returnValue事实上不会存在8的情况。
+     *      case 16://包含,即节点A包含节点B
+     *      case 20://组合类型,即节点A满足前置节点A且包含节点B。同样,如果包含,必定前置,所以returnValue事实上也不会存在16的情况
+     *  }
+     */
+    getPosition: function (nodeA, nodeB) {
+        // 如果两个节点是同一个节点
+        if (nodeA === nodeB) {
+            // domUtils.POSITION_IDENTICAL
+            return 0;
+        }
+        var node,
+            parentsA = [nodeA],
+            parentsB = [nodeB];
+        node = nodeA;
+        while (node = node.parentNode) {
+            // 如果nodeB是nodeA的祖先节点
+            if (node === nodeB) {
+                // domUtils.POSITION_IS_CONTAINED + domUtils.POSITION_FOLLOWING
+                return 10;
+            }
+            parentsA.push(node);
+        }
+        node = nodeB;
+        while (node = node.parentNode) {
+            // 如果nodeA是nodeB的祖先节点
+            if (node === nodeA) {
+                // domUtils.POSITION_CONTAINS + domUtils.POSITION_PRECEDING
+                return 20;
+            }
+            parentsB.push(node);
+        }
+        parentsA.reverse();
+        parentsB.reverse();
+        if (parentsA[0] !== parentsB[0]) {
+            // domUtils.POSITION_DISCONNECTED
+            return 1;
+        }
+        var i = -1;
+        while (i++, parentsA[i] === parentsB[i]) {
+        }
+        nodeA = parentsA[i];
+        nodeB = parentsB[i];
+        while (nodeA = nodeA.nextSibling) {
+            if (nodeA === nodeB) {
+                // domUtils.POSITION_PRECEDING
+                return 4
+            }
+        }
+        // domUtils.POSITION_FOLLOWING
+        return  2;
+    },
+
+    /**
+     * 返回节点node在父节点中的索引位置
+     * @name getNodeIndex
+     * @grammar UM.dom.domUtils.getNodeIndex(node)  => Number  //索引值从0开始
+     */
+    getNodeIndex: function (node, ignoreTextNode) {
+        var preNode = node,
+            i = 0;
+        while (preNode = preNode.previousSibling) {
+            if (ignoreTextNode && preNode.nodeType == 3) {
+                if (preNode.nodeType != preNode.nextSibling.nodeType) {
+                    i++;
+                }
+                continue;
+            }
+            i++;
+        }
+        return i;
+    },
+
+    /**
+     * 检测节点node是否在节点doc的树上,实质上是检测是否被doc包含
+     * @name inDoc
+     * @grammar UM.dom.domUtils.inDoc(node,doc)   =>  true|false
+     */
+    inDoc: function (node, doc) {
+        return domUtils.getPosition(node, doc) == 10;
+    },
+    /**
+     * 查找node节点的祖先节点
+     * @name findParent
+     * @grammar UM.dom.domUtils.findParent(node)  => Element  // 直接返回node节点的父节点
+     * @grammar UM.dom.domUtils.findParent(node,filterFn)  => Element  //filterFn为过滤函数,node作为参数,返回true时才会将node作为符合要求的节点返回
+     * @grammar UM.dom.domUtils.findParent(node,filterFn,includeSelf)  => Element  //includeSelf指定是否包含自身
+     */
+    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;
+    },
+    /**
+     * 通过tagName查找node节点的祖先节点
+     * @name findParentByTagName
+     * @grammar UM.dom.domUtils.findParentByTagName(node,tagNames)   =>  Element  //tagNames支持数组,区分大小写
+     * @grammar UM.dom.domUtils.findParentByTagName(node,tagNames,includeSelf)   =>  Element  //includeSelf指定是否包含自身
+     * @grammar UM.dom.domUtils.findParentByTagName(node,tagNames,includeSelf,excludeFn)   =>  Element  //excludeFn指定例外过滤条件,返回true时忽略该节点
+     */
+    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的祖先节点集合
+     * @name findParents
+     * @grammar UM.dom.domUtils.findParents(node)  => Array  //返回一个祖先节点数组集合,不包含自身
+     * @grammar UM.dom.domUtils.findParents(node,includeSelf)  => Array  //返回一个祖先节点数组集合,includeSelf指定是否包含自身
+     * @grammar UM.dom.domUtils.findParents(node,includeSelf,filterFn)  => Array  //返回一个祖先节点数组集合,filterFn指定过滤条件,返回true的node将被选取
+     * @grammar UM.dom.domUtils.findParents(node,includeSelf,filterFn,closerFirst)  => Array  //返回一个祖先节点数组集合,closerFirst为true的话,node的直接父亲节点是数组的第0个
+     */
+    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
+     * @name insertAfter
+     * @grammar UM.dom.domUtils.insertAfter(node,newNode)  => newNode
+     */
+    insertAfter: function (node, newNode) {
+        return node.parentNode.insertBefore(newNode, node.nextSibling);
+    },
+
+    /**
+     * 删除节点node,并根据keepChildren指定是否保留子节点
+     * @name remove
+     * @grammar UM.dom.domUtils.remove(node)  =>  node
+     * @grammar UM.dom.domUtils.remove(node,keepChildren)  =>  node
+     */
+    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
+     *     <body>
+     *      <div id="test">
+     *          <span></span>
+     *      </div>
+     *      <i>xxx</i>
+     * </body>
+     * <script>
+     *
+     *     //output: i节点
+     *     console.log( UE.dom.domUtils.getNextDomNode( document.getElementById( "test" ) ) );
+     *
+     * </script>
+     * ```
+     * @example
+     * ```html
+     * <body>
+     *      <div>
+     *          <span></span>
+     *          <i id="test">xxx</i>
+     *      </div>
+     *      <b>xxx</b>
+     * </body>
+     * <script>
+     *
+     *     //由于id为test的i节点之后没有兄弟节点, 则查找其父节点(div)后面的兄弟节点
+     *     //output: b节点
+     *     console.log( UE.dom.domUtils.getNextDomNode( document.getElementById( "test" ) ) );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点,
+     * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false,
+     * 则执行<a href="#UE.dom.domUtils.getNextDomNode(Node)">getNextDomNode(Node node)</a>的查找过程。
+     * @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是否属于bookmark节点
+     * @name isBookmarkNode
+     * @grammar UM.dom.domUtils.isBookmarkNode(node)  => true|false
+     */
+    isBookmarkNode: function (node) {
+        return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id);
+    },
+    /**
+     * 获取节点node所在的window对象
+     * @name  getWindow
+     * @grammar UM.dom.domUtils.getWindow(node)  => 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
+     * <body>
+     *     <div></div>
+     *     <span id="test"></span>
+     *     <i></i>
+     *     <b></b>
+     *     <em>xxx</em>
+     *     <span></span>
+     * </body>
+     * <script>
+     *
+     *      UE.dom.domUtils.clearEmptySibling( document.getElementById( "test" ) );
+     *
+     *      //output: <div></div><span id="test"></span><em>xxx</em><span></span>
+     *      console.log( document.body.innerHTML );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 清除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');
+    },
+
+    /**
+     * 将一个文本节点node拆分成两个文本节点,offset指定拆分位置
+     * @name split
+     * @grammar UM.dom.domUtils.split(node,offset)  =>  TextNode  //返回从切分位置开始的后一个文本节点
+     */
+    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;
+    },
+
+    /**
+     * 检测节点node是否为空节点(包括空格、换行、占位符等字符)
+     * @name  isWhitespace
+     * @grammar  UM.dom.domUtils.isWhitespace(node)  => true|false
+     */
+    isWhitespace: function (node) {
+        return !new RegExp('[^ \t\n\r' + domUtils.fillChar + ']').test(node.nodeValue);
+    },
+    /**
+     * 获取元素element相对于viewport的位置坐标
+     * @name getXY
+     * @grammar UM.dom.domUtils.getXY(element)  => Object //返回坐标对象{x:left,y:top}
+     */
+    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};
+    },
+    /**
+     * 检查节点node是否是空inline节点
+     * @name  isEmptyInlineElement
+     * @grammar   UM.dom.domUtils.isEmptyInlineElement(node)  => 1|0
+     * @example
+     * <b><i></i></b> => 1
+     * <b><i></i><u></u></b> => 1
+     * <b></b> => 1
+     * <b>xx<i></i></b> => 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是否为块元素
+     * @name isBlockElm
+     * @grammar UM.dom.domUtils.isBlockElm(node)  => true|false
+     */
+    isBlockElm: function (node) {
+        return node.nodeType == 1 && (dtd.$block[node.tagName] || styleBlock[domUtils.getComputedStyle(node, 'display')]) && !dtd.$nonChild[node.tagName];
+    },
+
+
+    /**
+     * 原生方法getElementsByTagName的封装
+     * @name getElementsByTagName
+     * @grammar UM.dom.domUtils.getElementsByTagName(node,tagName)  => Array  //节点集合数组
+     */
+    getElementsByTagName: function (node, name, filter) {
+        if (filter && utils.isString(filter)) {
+            var className = filter;
+            filter = function (node) {
+                var result = false;
+                $.each(utils.trim(className).replace(/[ ]{2,}/g, ' ').split(' '), function (i, v) {
+                    if ($(node).hasClass(v)) {
+                        result = true;
+                        return false;
+                    }
+                })
+                return result;
+            }
+        }
+        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及其子节点不会被选中
+     * @name unSelectable
+     * @grammar UM.dom.domUtils.unSelectable(node)
+     */
+    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上的属性attrNames,attrNames为属性名称数组
+     * @name  removeAttributes
+     * @grammar UM.dom.domUtils.removeAttributes(node,attrNames)
+     * @example
+     * //Before remove
+     * <span style="font-size:14px;" id="test" name="followMe">xxxxx</span>
+     * //Remove
+     * UM.dom.domUtils.removeAttributes(node,["id","name"]);
+     * //After remove
+     * <span style="font-size:14px;">xxxxx</span>
+     */
+    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 = '';
+                    !browser.ie && node.removeAttributeNode(node.getAttributeNode('style'))
+            }
+            node.removeAttribute(ci);
+        }
+    },
+    /**
+     * 在doc下创建一个标签名为tag,属性为attrs的元素
+     * @name createElement
+     * @grammar UM.dom.domUtils.createElement(doc,tag,attrs)  =>  Node  //返回创建的节点
+     */
+    createElement: function (doc, tag, attrs) {
+        return domUtils.setAttributes(doc.createElement(tag), attrs)
+    },
+    /**
+     * 为节点node添加属性attrs,attrs为属性键值对
+     * @name setAttributes
+     * @grammar UM.dom.domUtils.setAttributes(node,attrs)  => node
+     */
+    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的计算样式
+     * @name getComputedStyle
+     * @grammar UM.dom.domUtils.getComputedStyle(element,styleName)  => String //返回对应样式名称的样式值
+     * @example
+     * getComputedStyle(document.body,"font-size")  =>  "15px"
+     * getComputedStyle(form,"color")  =>  "#ffccdd"
+     */
+    getComputedStyle: function (element, styleName) {
+        return utils.transUnitToPx(utils.fixColor(styleName, $(element).css(styleName)));
+    },
+
+    /**
+     * 阻止事件默认行为
+     * @param {Event} evt    需要组织的事件对象
+     */
+    preventDefault: function (evt) {
+        evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false);
+    },
+
+    /**
+     * 删除元素element指定的样式
+     * @method removeStyle
+     * @param { Element } element 需要删除样式的元素
+     * @param { String } styleName 需要删除的样式名
+     * @example
+     * ```html
+     * <span id="test" style="color: red; background: blue;"></span>
+     *
+     * <script>
+     *
+     *     var testNode = document.getElementById("test");
+     *
+     *     UE.dom.domUtils.removeStyle( testNode, 'color' );
+     *
+     *     //output: background: blue;
+     *     console.log( testNode.style.cssText );
+     *
+     * </script>
+     * ```
+     */
+    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的某个样式值
+     * @name getStyle
+     * @grammar UM.dom.domUtils.getStyle(element,name)  => String
+     */
+    getStyle: function (element, name) {
+        var value = element.style[ utils.cssStyleToDomStyle(name) ];
+        return utils.fixColor(name, value);
+    },
+    /**
+     * 为元素element设置样式属性值
+     * @name setStyle
+     * @grammar UM.dom.domUtils.setStyle(element,name,value)
+     */
+    setStyle: function (element, name, value) {
+        element.style[utils.cssStyleToDomStyle(name)] = value;
+        if (!utils.trim(element.style.cssText)) {
+            this.removeAttributes(element, 'style')
+        }
+    },
+
+    /**
+     * 删除_moz_dirty属性
+     * @function
+     */
+    removeDirtyAttr: function (node) {
+        for (var i = 0, ci, nodes = node.getElementsByTagName('*'); ci = nodes[i++];) {
+            ci.removeAttribute('_moz_dirty');
+        }
+        node.removeAttribute('_moz_dirty');
+    },
+    /**
+     * 返回子节点的数量
+     * @function
+     * @param {Node}    node    父节点
+     * @param  {Function}    fn    过滤子节点的规则,若为空,则得到所有子节点的数量
+     * @return {Number}    符合条件子节点的数量
+     */
+    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;
+    },
+
+    /**
+     * 判断是否为空节点
+     * @function
+     * @param {Node}    node    节点
+     * @return {Boolean}    是否为空节点
+     */
+    isEmptyNode: function (node) {
+        return !node.firstChild || domUtils.getChildCount(node, function (node) {
+            return  !domUtils.isBr(node) && !domUtils.isBookmarkNode(node) && !domUtils.isWhitespace(node)
+        }) == 0
+    },
+
+    /**
+     * 判断节点是否为br
+     * @function
+     * @param {Node}    node   节点
+     */
+    isBr: function (node) {
+        return node.nodeType == 1 && node.tagName == 'BR';
+    },
+    isFillChar: function (node, isInStart) {
+        return node.nodeType == 3 && !node.nodeValue.replace(new RegExp((isInStart ? '^' : '' ) + domUtils.fillChar), '').length
+    },
+
+    isEmptyBlock: function (node, reg) {
+        if (node.nodeType != 1)
+            return 0;
+        reg = reg || new RegExp('[ \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;
+    },
+
+    //判断是否是编辑器自定义的参数
+    isCustomeNode: function (node) {
+        return node.nodeType == 1 && node.getAttribute('_ue_custom_node_');
+    },
+    fillNode: function (doc, node) {
+        var tmpNode = browser.ie ? doc.createTextNode(domUtils.fillChar) : doc.createElement('br');
+        node.innerHTML = '';
+        node.appendChild(tmpNode);
+    },
+    isBoundaryNode: function (node, dir) {
+        var tmp;
+        while (!domUtils.isBody(node)) {
+            tmp = node;
+            node = node.parentNode;
+            if (tmp !== node[dir]) {
+                return false;
+            }
+        }
+        return true;
+    },
+    isFillChar: function (node, isInStart) {
+        return node.nodeType == 3 && !node.nodeValue.replace(new RegExp((isInStart ? '^' : '' ) + domUtils.fillChar), '').length
+    },
+    isBody: function(node){
+        return $(node).hasClass('edui-body-container');
+    }
+};
+var fillCharReg = new RegExp(domUtils.fillChar, 'g');
+///import editor.js
+///import core/utils.js
+///import core/browser.js
+///import core/dom/dom.js
+///import core/dom/dtd.js
+///import core/dom/domUtils.js
+/**
+ * @file
+ * @name UM.dom.Range
+ * @anthor zhanyi
+ * @short Range
+ * @import editor.js,core/utils.js,core/browser.js,core/dom/domUtils.js,core/dom/dtd.js
+ * @desc Range范围实现类,本类是UEditor底层核心类,统一w3cRange和ieRange之间的差异,包括接口和属性
+ */
+(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;
+    }
+
+
+    /**
+     * @name Range
+     * @grammar new UM.dom.Range(document)  => Range 实例
+     * @desc 创建一个跟document绑定的空的Range实例
+     * - ***startContainer*** 开始边界的容器节点,可以是elementNode或者是textNode
+     * - ***startOffset*** 容器节点中的偏移量,如果是elementNode就是childNodes中的第几个,如果是textNode就是nodeValue的第几个字符
+     * - ***endContainer*** 结束边界的容器节点,可以是elementNode或者是textNode
+     * - ***endOffset*** 容器节点中的偏移量,如果是elementNode就是childNodes中的第几个,如果是textNode就是nodeValue的第几个字符
+     * - ***document*** 跟range关联的document对象
+     * - ***collapsed*** 是否是闭合状态
+     */
+    var Range = dom.Range = function (document,body) {
+        var me = this;
+        me.startContainer =
+            me.startOffset =
+                me.endContainer =
+                    me.endOffset = null;
+        me.document = document;
+        me.collapsed = true;
+        me.body = body;
+    };
+
+    /**
+     * 删除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;
+        }
+    }
+
+    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;
+    }
+    Range.prototype = {
+        /**
+         * @name deleteContents
+         * @grammar range.deleteContents()  => Range
+         * @desc 删除当前选区范围中的所有内容并返回range实例,这时的range已经变成了闭合状态
+         * @example
+         * DOM Element :
+         * <b>x<i>x[x<i>xx]x</b>
+         * //执行方法后
+         * <b>x<i>x<i>|x</b>
+         * 注意range改变了
+         * range.startContainer => b
+         * range.startOffset  => 2
+         * range.endContainer => b
+         * range.endOffset => 2
+         * range.collapsed => true
+         */
+        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;
+        },
+        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;
+        },
+        /**
+         * @name  setStart
+         * @grammar range.setStart(node,offset)  => Range
+         * @desc    设置range的开始位置位于node节点内,偏移量为offset
+         * 如果node是elementNode那offset指的是childNodes中的第几个,如果是textNode那offset指的是nodeValue的第几个字符
+         */
+        setStart:function (node, offset) {
+            return setEndPoint(true, node, offset, this);
+        },
+        /**
+         * 设置range的结束位置位于node节点,偏移量为offset
+         * 如果node是elementNode那offset指的是childNodes中的第几个,如果是textNode那offset指的是nodeValue的第几个字符
+         * @name  setEnd
+         * @grammar range.setEnd(node,offset)  => Range
+         */
+        setEnd:function (node, offset) {
+            return setEndPoint(false, node, offset, this);
+        },
+        /**
+         * 将Range开始位置设置到node节点之后
+         * @name  setStartAfter
+         * @grammar range.setStartAfter(node)  => Range
+         * @example
+         * <b>xx<i>x|x</i>x</b>
+         * 执行setStartAfter(i)后
+         * range.startContainer =>b
+         * range.startOffset =>2
+         */
+        setStartAfter:function (node) {
+            return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1);
+        },
+        /**
+         * 将Range开始位置设置到node节点之前
+         * @name  setStartBefore
+         * @grammar range.setStartBefore(node)  => Range
+         * @example
+         * <b>xx<i>x|x</i>x</b>
+         * 执行setStartBefore(i)后
+         * range.startContainer =>b
+         * range.startOffset =>1
+         */
+        setStartBefore:function (node) {
+            return this.setStart(node.parentNode, domUtils.getNodeIndex(node));
+        },
+        /**
+         * 将Range结束位置设置到node节点之后
+         * @name  setEndAfter
+         * @grammar range.setEndAfter(node)  => Range
+         * @example
+         * <b>xx<i>x|x</i>x</b>
+         * setEndAfter(i)后
+         * range.endContainer =>b
+         * range.endtOffset =>2
+         */
+        setEndAfter:function (node) {
+            return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1);
+        },
+        /**
+         * 将Range结束位置设置到node节点之前
+         * @name  setEndBefore
+         * @grammar range.setEndBefore(node)  => Range
+         * @example
+         * <b>xx<i>x|x</i>x</b>
+         * 执行setEndBefore(i)后
+         * range.endContainer =>b
+         * range.endtOffset =>1
+         */
+        setEndBefore:function (node) {
+            return this.setEnd(node.parentNode, domUtils.getNodeIndex(node));
+        },
+        /**
+         * 将Range开始位置设置到node节点内的开始位置
+         * @name  setStartAtFirst
+         * @grammar range.setStartAtFirst(node)  => Range
+         */
+        setStartAtFirst:function (node) {
+            return this.setStart(node, 0);
+        },
+        /**
+         * 将Range开始位置设置到node节点内的结束位置
+         * @name  setStartAtLast
+         * @grammar range.setStartAtLast(node)  => Range
+         */
+        setStartAtLast:function (node) {
+            return this.setStart(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length);
+        },
+        /**
+         * 将Range结束位置设置到node节点内的开始位置
+         * @name  setEndAtFirst
+         * @grammar range.setEndAtFirst(node)  => Range
+         */
+        setEndAtFirst:function (node) {
+            return this.setEnd(node, 0);
+        },
+        /**
+         * 将Range结束位置设置到node节点内的结束位置
+         * @name  setEndAtLast
+         * @grammar range.setEndAtLast(node)  => Range
+         */
+        setEndAtLast:function (node) {
+            return this.setEnd(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length);
+        },
+
+        /**
+         * 选中完整的指定节点,并返回包含该节点的range
+         * @name  selectNode
+         * @grammar range.selectNode(node)  => Range
+         */
+        selectNode:function (node) {
+            return this.setStartBefore(node).setEndAfter(node);
+        },
+        /**
+         * 选中node内部的所有节点,并返回对应的range
+         * @name selectNodeContents
+         * @grammar range.selectNodeContents(node)  => Range
+         * @example
+         * <b>xx[x<i>xxx</i>]xxx</b>
+         * 执行后
+         * <b>[xxx<i>xxx</i>xxx]</b>
+         * range.startContainer =>b
+         * range.startOffset =>0
+         * range.endContainer =>b
+         * range.endOffset =>3
+         */
+        selectNodeContents:function (node) {
+            return this.setStart(node, 0).setEndAtLast(node);
+        },
+
+        /**
+         * 克隆一个新的range对象
+         * @name  cloneRange
+         * @grammar range.cloneRange() => Range
+         */
+        cloneRange:function () {
+            var me = this;
+            return new Range(me.document).setStart(me.startContainer, me.startOffset).setEnd(me.endContainer, me.endOffset);
+
+        },
+
+        /**
+         * 让选区闭合到尾部,若toStart为真,则闭合到头部
+         * @name  collapse
+         * @grammar range.collapse() => Range
+         * @grammar range.collapse(true) => Range   //闭合选区到头部
+         */
+        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的边界,使其"收缩"到最小的位置
+         * @name  shrinkBoundary
+         * @grammar range.shrinkBoundary()  => Range  //range开始位置和结束位置都调整,参见<code><a href="#adjustmentboundary">adjustmentBoundary</a></code>
+         * @grammar range.shrinkBoundary(true)  => Range  //仅调整开始位置,忽略结束位置
+         * @example
+         * <b>xx[</b>xxxxx] ==> <b>xx</b>[xxxxx]
+         * <b>x[xx</b><i>]xxx</i> ==> <b>x[xx]</b><i>xxx</i>
+         * [<b><i>xxxx</i>xxxxxxx</b>] ==> <b><i>[xxxx</i>xxxxxxx]</b>
+         */
+        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;
+        },
+
+        /**
+         * 调整边界容器,如果是textNode,就调整到elementNode上
+         * @name trimBoundary
+         * @grammar range.trimBoundary([ignoreEnd])  => Range //true忽略结束边界
+         * @example
+         * DOM Element :
+         * <b>|xxx</b>
+         * startContainer = xxx; startOffset = 0
+         * //执行后本方法后
+         * startContainer = <b>;  startOffset = 0
+         * @example
+         * Dom Element :
+         * <b>xx|x</b>
+         * startContainer = xxx;  startOffset = 2
+         * //执行本方法后,xxx被实实在在地切分成两个TextNode
+         * startContainer = <b>; startOffset = 1
+         */
+        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;
+        },
+        /**
+         * 如果选区在文本的边界上,就扩展选区到文本的父节点上
+         * @name  txtToElmBoundary
+         * @example
+         * Dom Element :
+         * <b> |xxx</b>
+         * startContainer = xxx;  startOffset = 0
+         * //本方法执行后
+         * startContainer = <b>; startOffset = 0
+         * @example
+         * Dom Element :
+         * <b> xxx| </b>
+         * startContainer = xxx; startOffset = 3
+         * //本方法执行后
+         * startContainer = <b>; startOffset = 1
+         */
+        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;
+        },
+
+        /**
+         * 在当前选区的开始位置前插入一个节点或者fragment,range的开始位置会在插入节点的前边
+         * @name  insertNode
+         * @grammar range.insertNode(node)  => Range //node可以是textNode,elementNode,fragment
+         * @example
+         * Range :
+         * xxx[x<p>xxxx</p>xxxx]x<p>sdfsdf</p>
+         * 待插入Node :
+         * <p>ssss</p>
+         * 执行本方法后的Range :
+         * xxx[<p>ssss</p>x<p>xxxx</p>xxxx]x<p>sdfsdf</p>
+         */
+        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);
+        },
+        /**
+         * 设置光标闭合位置,toEnd设置为true时光标将闭合到选区的结尾
+         * @name  setCursor
+         * @grammar range.setCursor([toEnd])  =>  Range   //toEnd为true时,光标闭合到选区的末尾
+         */
+        setCursor:function (toEnd, noFillData) {
+            return this.collapse(!toEnd).select(noFillData);
+        },
+        /**
+         * 创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置
+         * @name createBookmark
+         * @grammar range.createBookmark([serialize])  => Object  //{start:开始标记,end:结束标记,id:serialize} serialize为真时,开始结束标记是插入节点的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
+            }
+        },
+        /**
+         *  移动边界到书签位置,并删除插入的书签节点
+         *  @name  moveToBookmark
+         *  @grammar range.moveToBookmark(bookmark)  => Range //让当前的range选到给定bookmark的位置,bookmark对象是由range.createBookmark创建的
+         */
+        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的边界,使其"缩小"到最合适的位置
+         * @name adjustmentBoundary
+         * @grammar range.adjustmentBoundary() => Range   //参见<code><a href="#shrinkboundary">shrinkBoundary</a></code>
+         * @example
+         * <b>xx[</b>xxxxx] ==> <b>xx</b>[xxxxx]
+         * <b>x[xx</b><i>]xxx</i> ==> <b>x[xx</b>]<i>xxx</i>
+         */
+        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;
+        },
+
+        /**
+         * 得到一个自闭合的节点,常用于获取自闭和的节点,例如图片节点
+         * @name  getClosedNode
+         * @grammar range.getClosedNode()  => node|null
+         * @example
+         * <b>xxxx[<img />]xxx</b>
+         */
+        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选中内容节点(在页面上表现为反白显示)
+         * @name select
+         * @grammar range.select();  => Range
+         */
+        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) {
+                    //使用<span>|x<span>固定住光标
+                    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.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);
+//                    }
+//
+                    //处理光标落在文本节点的情况
+                    //处理以下的情况
+                    //<b>|xxxx</b>
+                    //<b>xxxx</b>|xxxx
+                    //xxxx<b>|</b>
+                    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;
+        },
+      
+
+        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;
+        },
+        moveToAddress : function(addr,ignoreEnd){
+            var me = this;
+            function getNode(address,isStart){
+                var tmpNode = me.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;
+        },
+        equals : function(rng){
+            for(var p in this){
+                if(this.hasOwnProperty(p)){
+                    if(this[p] !== rng[p])
+                        return false
+                }
+            }
+            return true;
+
+        },
+        scrollIntoView : function(){
+            var $span = $('<span style="padding:0;margin:0;display:block;border:0">&nbsp;</span>');
+            this.cloneRange().insertNode($span.get(0));
+            var winScrollTop = $(window).scrollTop(),
+                winHeight = $(window).height(),
+                spanTop = $span.offset().top;
+            if(spanTop < winScrollTop-winHeight || spanTop > winScrollTop + winHeight ){
+                if(spanTop > winScrollTop + winHeight){
+                    window.scrollTo(0,spanTop - winHeight + $span.height())
+                }else{
+                    window.scrollTo(0,winScrollTop - spanTop)
+                }
+
+            }
+            $span.remove();
+        },
+        getOffset : function(){
+            var bk = this.createBookmark();
+            var offset = $(bk.start).css('display','inline-block').offset();
+            this.moveToBookmark(bk);
+            return offset
+        }
+    };
+})();
+///import editor.js
+///import core/browser.js
+///import core/dom/dom.js
+///import core/dom/dtd.js
+///import core/dom/domUtils.js
+///import core/dom/Range.js
+/**
+ * @class UM.dom.Selection    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,txtRange ) {
+        var ieRange;
+        //ie下有可能报错
+        try {
+            ieRange = sel.getNative(txtRange).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,body ) {
+        var me = this;
+        me.document = doc;
+        me.body = body;
+        if ( browser.ie9below ) {
+            $( body).on('beforedeactivate', function () {
+                me._bakIERange = me.getIERange();
+            } ).on('activate', function () {
+                try {
+                    var ieNativRng =  _getIERange( me );
+                    if ( (!ieNativRng || !me.rangeInBody(ieNativRng)) && me._bakIERange ) {
+                        me._bakIERange.select();
+                    }
+                } catch ( ex ) {
+                }
+                me._bakIERange = null;
+            } );
+        }
+    };
+
+    Selection.prototype = {
+        hasNativeRange : function(){
+            var rng;
+            if(!browser.ie || browser.ie9above){
+                var nativeSel = this.getNative();
+                if(!nativeSel.rangeCount){
+                    return false;
+                }
+                rng = nativeSel.getRangeAt(0);
+            }else{
+                rng = _getIERange(this);
+            }
+            return this.rangeInBody(rng);
+        },
+        /**
+         * 获取原生seleciton对象
+         * @public
+         * @function
+         * @name    UM.dom.Selection.getNative
+         * @return {Selection}    获得selection对象
+         */
+        getNative:function (txtRange) {
+            var doc = this.document;
+            try {
+                return !doc ? null : browser.ie9below || txtRange? doc.selection : domUtils.getWindow( doc ).getSelection();
+            } catch ( e ) {
+                return null;
+            }
+        },
+        /**
+         * 获得ieRange
+         * @public
+         * @function
+         * @name    UM.dom.Selection.getIERange
+         * @return {ieRange}    返回ie原生的Range
+         */
+        getIERange:function (txtRange) {
+            var ieRange = _getIERange( this,txtRange );
+            if ( !ieRange  || !this.rangeInBody(ieRange,txtRange)) {
+                if ( this._bakIERange ) {
+                    return this._bakIERange;
+                }
+            }
+            return ieRange;
+        },
+        rangeInBody : function(rng,txtRange){
+            var node = browser.ie9below || txtRange ? rng.item ? rng.item() : rng.parentElement() : rng.startContainer;
+
+            return node === this.body || domUtils.inDoc(node,this.body);
+        },
+        /**
+         * 缓存当前选区的range和选区的开始节点
+         * @public
+         * @function
+         * @name    UM.dom.Selection.cache
+         */
+        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 start = this.getStart();
+            if ( start ) {
+                return domUtils.findParents( start, true, null, true )
+            }
+            return [];
+        },
+        /**
+         * 清空缓存
+         * @public
+         * @function
+         * @name    UM.dom.Selection.clear
+         */
+        clear:function () {
+            this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null;
+        },
+        /**
+         * 编辑器是否得到了选区
+         */
+        isFocus:function () {
+            return this.hasNativeRange()
+
+        },
+        /**
+         * 获取选区对应的Range
+         * @public
+         * @function
+         * @name    UM.dom.Selection.getRange
+         * @returns {UM.dom.Range}    得到Range对象
+         */
+        getRange:function () {
+            var me = this;
+            function optimze( range ) {
+                var child = me.body.firstChild,
+                    collapsed = range.collapsed;
+                while ( child && child.firstChild ) {
+                    range.setStart( child, 0 );
+                    child = child.firstChild;
+                }
+                if ( !range.startContainer ) {
+                    range.setStart( me.body, 0 )
+                }
+                if ( collapsed ) {
+                    range.collapse( true );
+                }
+            }
+
+            if ( me._cachedRange != null ) {
+                return this._cachedRange;
+            }
+            var range = new dom.Range( me.document,me.body );
+            if ( browser.ie9below ) {
+                var nativeRange = me.getIERange();
+                if ( nativeRange  && this.rangeInBody(nativeRange)) {
+
+                    try{
+                        transformIERangeToRange( nativeRange, range );
+                    }catch(e){
+                        optimze( range );
+                    }
+
+                } else {
+                    optimze( range );
+                }
+            } else {
+                var sel = me.getNative();
+                if ( sel && sel.rangeCount && me.rangeInBody(sel.getRangeAt( 0 ))) {
+                    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 && (this._bakRange.startContainer === this.body || domUtils.inDoc( this._bakRange.startContainer, this.body )) ){
+                        return this._bakRange;
+                    }
+                    optimze( range );
+                }
+            }
+
+            return this._bakRange = range;
+        },
+
+        /**
+         * 获取开始元素,用于状态反射
+         * @public
+         * @function
+         * @name    UM.dom.Selection.getStart
+         * @return {Element}     获得开始元素
+         */
+        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下<b>x</b>[xx] 闭合后 <b>x|</b>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 {
+                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;
+        },
+        /**
+         * 得到选区中的文本
+         * @public
+         * @function
+         * @name    UM.dom.Selection.getText
+         * @return  {String}    选区中包含的文本
+         */
+        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 '';
+        }
+    };
+})();
+/**
+ * @file
+ * @name UM.Editor
+ * @short Editor
+ * @import editor.js,core/utils.js,core/EventBase.js,core/browser.js,core/dom/dtd.js,core/dom/domUtils.js,core/dom/Range.js,core/dom/Selection.js,plugins/serialize.js
+ * @desc 编辑器主类,包含编辑器提供的大部分公用接口
+ */
+(function () {
+    var uid = 0, _selectionChangeTimer;
+
+    /**
+     * @private
+     * @ignore
+     * @param form  编辑器所在的form元素
+     * @param 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 == 'umeditor_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': 'umeditor_textarea_' + editor.options.textarea,
+                'style': "display:none"
+            }));
+            //不要产生多个textarea
+            editor.textarea = textarea;
+        }
+        textarea.value = editor.hasContents() ?
+            (editor.options.allHtmlEnabled ? editor.getAllHtml() : editor.getContent(null, null, true)) :
+            ''
+    }
+    function loadPlugins(me){
+        //初始化插件
+        for (var pi in UM.plugins) {
+            if(me.options.excludePlugins.indexOf(pi) == -1){
+                UM.plugins[pi].call(me);
+                me.plugins[pi] = 1;
+            }
+        }
+        me.langIsReady = true;
+
+        me.fireEvent("langReady");
+    }
+    function checkCurLang(I18N){
+        for(var lang in I18N){
+            return lang
+        }
+    }
+    /**
+     * UEditor编辑器类
+     * @name Editor
+     * @desc 创建一个跟编辑器实例
+     * - ***container*** 编辑器容器对象
+     * - ***iframe*** 编辑区域所在的iframe对象
+     * - ***window*** 编辑区域所在的window
+     * - ***document*** 编辑区域所在的document对象
+     * - ***body*** 编辑区域所在的body对象
+     * - ***selection*** 编辑区域的选区对象
+     */
+    var Editor = UM.Editor = function (options) {
+        var me = this;
+        me.uid = uid++;
+        EventBase.call(me);
+        me.commands = {};
+        me.options = utils.extend(utils.clone(options || {}), UMEDITOR_CONFIG, true);
+        me.shortcutkeys = {};
+        me.inputRules = [];
+        me.outputRules = [];
+        //设置默认的常用属性
+        me.setOpt({
+            isShow: true,
+            initialContent: '',
+            initialStyle:'',
+            autoClearinitialContent: false,
+            textarea: 'editorValue',
+            focus: false,
+            focusInEnd: true,
+            autoClearEmptyNode: true,
+            fullscreen: false,
+            readonly: false,
+            zIndex: 999,
+            enterTag: 'p',
+            lang: 'zh-cn',
+            langPath: me.options.UMEDITOR_HOME_URL + 'lang/',
+            theme: 'default',
+            themePath: me.options.UMEDITOR_HOME_URL + 'themes/',
+            allHtmlEnabled: false,
+            autoSyncData : true,
+            autoHeightEnabled : true,
+            excludePlugins:''
+        });
+        me.plugins = {};
+        if(!utils.isEmptyObject(UM.I18N)){
+            //修改默认的语言类型
+            me.options.lang = checkCurLang(UM.I18N);
+            loadPlugins(me)
+        }else{
+            utils.loadFile(document, {
+                src: me.options.langPath + me.options.lang + "/" + me.options.lang + ".js",
+                tag: "script",
+                type: "text/javascript",
+                defer: "defer"
+            }, function () {
+                loadPlugins(me)
+            });
+        }
+
+    };
+    Editor.prototype = {
+        /**
+         * 当编辑器ready后执行传入的fn,如果编辑器已经完成ready,就马上执行fn,fn的中的this是编辑器实例。
+         * 大部分的实例接口都需要放在该方法内部执行,否则在IE下可能会报错。
+         * @name ready
+         * @grammar editor.ready(fn) fn是当编辑器渲染好后执行的function
+         * @example
+         * var editor = new UM.ui.Editor();
+         * editor.render("myEditor");
+         * editor.ready(function(){
+         *     editor.setContent("欢迎使用UEditor!");
+         * })
+         */
+        ready: function (fn) {
+            var me = this;
+            if (fn) {
+                me.isReady ? fn.apply(me) : me.addListener('ready', fn);
+            }
+        },
+        /**
+         * 为编辑器设置默认参数值。若用户配置为空,则以默认配置为准
+         * @grammar editor.setOpt(key,value);      //传入一个键、值对
+         * @grammar editor.setOpt({ key:value});   //传入一个json对象
+         */
+        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] || ''
+        },
+        /**
+         * 销毁编辑器实例对象
+         * @name destroy
+         * @grammar editor.destroy();
+         */
+        destroy: function () {
+
+            var me = this;
+            me.fireEvent('destroy');
+            var container = me.container.parentNode;
+            if(container === document.body){
+                container = me.container;
+            }
+            var textarea = me.textarea;
+            if (!textarea) {
+                textarea = document.createElement('textarea');
+                container.parentNode.insertBefore(textarea, container);
+            } else {
+                textarea.style.display = ''
+            }
+
+            textarea.style.width = me.body.offsetWidth + 'px';
+            textarea.style.height = me.body.offsetHeight + 'px';
+            textarea.value = me.getContent();
+            textarea.id = me.key;
+            if(container.contains(textarea)){
+                $(textarea).insertBefore(container);
+            }
+            container.innerHTML = '';
+
+            domUtils.remove(container);
+            UM.clearCache(me.id);
+            //trace:2004
+            for (var p in me) {
+                if (me.hasOwnProperty(p)) {
+                    delete this[p];
+                }
+            }
+
+        },
+        initialCont : function(holder){
+
+            if(holder){
+                holder.getAttribute('name') && ( this.options.textarea = holder.getAttribute('name'));
+                if (holder && /script|textarea/ig.test(holder.tagName)) {
+                    var newDiv = document.createElement('div');
+                    holder.parentNode.insertBefore(newDiv, holder);
+                    this.options.initialContent = UM.htmlparser(holder.value || holder.innerHTML|| this.options.initialContent).toHtml();
+                    holder.className && (newDiv.className = holder.className);
+                    holder.style.cssText && (newDiv.style.cssText = holder.style.cssText);
+
+                    if (/textarea/i.test(holder.tagName)) {
+                        this.textarea = holder;
+                        this.textarea.style.display = 'none';
+
+                    } else {
+                        holder.parentNode.removeChild(holder);
+                        holder.id && (newDiv.id = holder.id);
+                    }
+                    holder = newDiv;
+                    holder.innerHTML = '';
+                }
+                return holder;
+            }else{
+                return null;
+            }
+
+        },
+        /**
+         * 渲染编辑器的DOM到指定容器,必须且只能调用一次
+         * @name render
+         * @grammar editor.render(containerId);    //可以指定一个容器ID
+         * @grammar editor.render(containerDom);   //也可以直接指定容器对象
+         */
+        render: function (container) {
+            var me = this,
+                options = me.options,
+                getStyleValue=function(attr){
+                    return parseInt($(container).css(attr));
+                };
+
+            if (utils.isString(container)) {
+                container = document.getElementById(container);
+            }
+            if (container) {
+                this.id = container.getAttribute('id');
+                UM.setEditor(this);
+                utils.cssRule('edui-style-body',me.options.initialStyle,document);
+
+                container = this.initialCont(container);
+
+                container.className += ' edui-body-container';
+
+                if(options.initialFrameWidth){
+                    options.minFrameWidth = options.initialFrameWidth
+                }else{
+                    //都没给值,先写死了
+                    options.minFrameWidth = options.initialFrameWidth = $(container).width() || UM.defaultWidth;
+                }
+                if(options.initialFrameHeight){
+                    options.minFrameHeight = options.initialFrameHeight
+                }else{
+
+                    options.initialFrameHeight = options.minFrameHeight = $(container).height() || UM.defaultHeight;
+                }
+
+                container.style.width = /%$/.test(options.initialFrameWidth) ?  '100%' : options.initialFrameWidth -
+                    getStyleValue("padding-left")-
+                    getStyleValue("padding-right")  +'px';
+
+                var height = /%$/.test(options.initialFrameHeight) ?  '100%' : (options.initialFrameHeight - getStyleValue("padding-top")- getStyleValue("padding-bottom") );
+                if(this.options.autoHeightEnabled){
+                    container.style.minHeight = height +'px';
+                    container.style.height = '';
+                    if(browser.ie && browser.version <= 6){
+                        container.style.height = height ;
+                        container.style.setExpression('height', 'this.scrollHeight <= ' + height + ' ? "' + height + 'px" : "auto"');
+                    }
+                }else{
+                    $(container).height(height)
+                }
+                container.style.zIndex = options.zIndex;
+                this._setup(container);
+
+            }
+        },
+        /**
+         * 编辑器初始化
+         * @private
+         * @ignore
+         * @param {Element} doc 编辑器Iframe中的文档对象
+         */
+        _setup: function (cont) {
+            var me = this,
+                options = me.options;
+
+            cont.contentEditable = true;
+            document.body.spellcheck = false;
+
+            me.document = document;
+            me.window = document.defaultView || document.parentWindow;
+            me.body = cont;
+            me.$body = $(cont);
+            me.selection = new dom.Selection(document,me.body);
+            me._isEnabled = false;
+            //gecko初始化就能得到range,无法判断isFocus了
+            var geckoSel;
+            if (browser.gecko && (geckoSel = this.selection.getNative())) {
+                geckoSel.removeAllRanges();
+            }
+            this._initEvents();
+            //为form提交提供一个隐藏的textarea
+            for (var form = cont.parentNode; form && !domUtils.isBody(form); form = form.parentNode) {
+                if (form.tagName == 'FORM') {
+                    me.form = form;
+                    if(me.options.autoSyncData){
+                        $(cont).on('blur',function(){
+                            setValue(form,me);
+                        })
+                    }else{
+                        $(form).on('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 = '<p>' + (browser.ie ? '' : '<br/>') + '</p>';
+            }
+            //如果要求focus, 就把光标定位到内容开始
+            if (options.focus) {
+                setTimeout(function () {
+                    me.focus(me.options.focusInEnd);
+                    //如果自动清除开着,就不需要做selectionchange;
+                    !me.options.autoClearinitialContent && me._selectionChange();
+                }, 0);
+            }
+            if (!me.container) {
+                me.container = cont.parentNode;
+            }
+
+            me._bindshortcutKeys();
+            me.isReady = 1;
+            me.fireEvent('ready');
+            options.onready && options.onready.call(me);
+            if(!browser.ie || browser.ie9above){
+
+                $(me.body).on( 'blur focus', function (e) {
+                    var nSel = me.selection.getNative();
+                    //chrome下会出现alt+tab切换时,导致选区位置不对
+                    if (e.type == 'blur') {
+                        if(nSel.rangeCount > 0 ){
+                            me._bakRange = nSel.getRangeAt(0);
+                        }
+                    } else {
+                        try {
+                            me._bakRange && nSel.addRange(me._bakRange)
+                        } catch (e) {
+                        }
+                        me._bakRange = null;
+                    }
+                });
+            }
+
+            !options.isShow && me.setHide();
+            options.readonly && me.setDisabled();
+        },
+        /**
+         * 同步编辑器的数据,为提交数据做准备,主要用于你是手动提交的情况
+         * @name sync
+         * @grammar editor.sync(); //从编辑器的容器向上查找,如果找到就同步数据
+         * @grammar editor.sync(formID); //formID制定一个要同步数据的form的id,编辑器的数据会同步到你指定form下
+         * @desc
+         * 后台取得数据得键值使用你容器上得''name''属性,如果没有就使用参数传入的''textarea''
+         * @example
+         * editor.sync();
+         * form.sumbit(); //form变量已经指向了form元素
+         *
+         */
+        sync: function (formId) {
+            var me = this,
+                form = formId ? document.getElementById(formId) :
+                    domUtils.findParent(me.body.parentNode, function (node) {
+                        return node.tagName == 'FORM'
+                    }, true);
+            form && setValue(form, me);
+        },
+        /**
+         * 设置编辑器高度
+         * @name setHeight
+         * @grammar editor.setHeight(number);  //纯数值,不带单位
+         */
+        setHeight: function (height,notSetHeight) {
+            !notSetHeight && (this.options.initialFrameHeight = height);
+            if(this.options.autoHeightEnabled){
+                $(this.body).css({
+                    'min-height':height + 'px'
+                });
+                if(browser.ie && browser.version <= 6 && this.container){
+                    this.container.style.height = height ;
+                    this.container.style.setExpression('height', 'this.scrollHeight <= ' + height + ' ? "' + height + 'px" : "auto"');
+                }
+            }else{
+                $(this.body).height(height)
+            }
+            this.fireEvent('resize');
+        },
+        /**
+         * 设置编辑器宽度
+         * @name setWidth
+         * @grammar editor.setWidth(number);  //纯数值,不带单位
+         */
+        setWidth:function(width){
+            this.$container && this.$container.width(width);
+            $(this.body).width(width - $(this.body).css('padding-left').replace('px','') * 1 - $(this.body).css('padding-right').replace('px','') * 1);
+            this.fireEvent('resize');
+        },
+        addshortcutkey: function (cmd, keys) {
+            var obj = {};
+            if (keys) {
+                obj[cmd] = keys
+            } else {
+                obj = cmd;
+            }
+            utils.extend(this.shortcutkeys, obj)
+        },
+        _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);
+                            }
+                        }
+                    }
+
+                }
+            });
+        },
+        /**
+         * 获取编辑器内容
+         * @name getContent
+         * @grammar editor.getContent()  => String //若编辑器中只包含字符"&lt;p&gt;&lt;br /&gt;&lt;/p/&gt;"会返回空。
+         * @grammar editor.getContent(fn)  => String
+         * @example
+         * getContent默认是会现调用hasContents来判断编辑器是否为空,如果是,就直接返回空字符串
+         * 你也可以传入一个fn来接替hasContents的工作,定制判断的规则
+         * editor.getContent(function(){
+         *     return false //编辑器没有内容 ,getContent直接返回空
+         * })
+         */
+        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 = UM.htmlparser(me.body.innerHTML,ignoreBlank);
+            me.filterOutputRule(root);
+            me.fireEvent('aftergetcontent',root);
+            return  root.toHtml(formatter);
+        },
+        /**
+         * 取得完整的html代码,可以直接显示成完整的html文档
+         * @name getAllHtml
+         * @grammar editor.getAllHtml()  => String
+         */
+        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 ? '<link rel="stylesheet" type="text/css" href="' + si.href + '" />' : '<style>' + si.cssText + '</style>');
+                });
+                utils.each(me.document.getElementsByTagName('script'), function (si) {
+                    headHtmlForIE9 += si.outerHTML;
+                });
+            }
+            return '<html><head>' + (me.options.charset ? '<meta http-equiv="Content-Type" content="text/html; charset=' + me.options.charset + '"/>' : '')
+                + (headHtmlForIE9 || me.document.getElementsByTagName('head')[0].innerHTML) + headHtml.join('\n') + '</head>'
+                + '<body ' + (ie && browser.version < 9 ? 'class="view"' : '') + '>' + me.getContent(null, null, true) + '</body></html>';
+        },
+        /**
+         * 得到编辑器的纯文本内容,但会保留段落格式
+         * @name getPlainTxt
+         * @grammar editor.getPlainTxt()  => String
+         */
+        getPlainTxt: function () {
+            var reg = new RegExp(domUtils.fillChar, 'g'),
+                html = this.body.innerHTML.replace(/[\n\r]/g, '');//ie要先去了\n在处理
+            html = html.replace(/<(p|div)[^>]*>(<br\/?>|&nbsp;)<\/\1>/gi, '\n')
+                .replace(/<br\/?>/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(/&nbsp;/g, ' ');
+        },
+
+        /**
+         * 获取编辑器中的纯文本内容,没有段落格式
+         * @name getContentTxt
+         * @grammar editor.getContentTxt()  => String
+         */
+        getContentTxt: function () {
+            var reg = new RegExp(domUtils.fillChar, 'g');
+            //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0
+            return this.body[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').replace(/\u00a0/g, ' ');
+        },
+
+        /**
+         * 将html设置到编辑器中, 如果是用于初始化时给编辑器赋初值,则必须放在ready方法内部执行
+         * @name setContent
+         * @grammar editor.setContent(html)
+         * @example
+         * var editor = new UM.ui.Editor()
+         * editor.ready(function(){
+         *     //需要ready后执行,否则可能报错
+         *     editor.setContent("欢迎使用UEditor!");
+         * })
+         */
+        setContent: function (html, isAppendTo, notFireSelectionchange) {
+            var me = this;
+
+            me.fireEvent('beforesetcontent', html);
+            var root = UM.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 = '<p>' + (browser.ie ? '&nbsp;' : '<br/>') + '</p>' + 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);
+            }
+        },
+
+        /**
+         * 让编辑器获得焦点,toEnd确定focus位置
+         * @name focus
+         * @grammar editor.focus([toEnd])   //默认focus到编辑器头部,toEnd为true时focus到内容尾部
+         */
+        focus: function (toEnd) {
+            try {
+                var me = this,
+                    rng = me.selection.getRange();
+                if (toEnd) {
+                    rng.setStartAtLast(me.body.lastChild).setCursor(false, true);
+                } else {
+                    rng.select(true);
+                }
+                this.fireEvent('focus');
+            } catch (e) {
+            }
+        },
+        /**
+         * 使编辑区域失去焦点
+         */
+        blur:function(){
+            var sel = this.selection.getNative();
+            sel.empty ? sel.empty() : sel.removeAllRanges();
+            this.fireEvent('blur')
+        },
+        /**
+         * 判断编辑器当前是否获得了焦点
+         */
+        isFocus : function(){
+            if(this.fireEvent('isfocus')===true){
+                return true;
+            }
+            return this.selection.isFocus();
+        },
+
+        /**
+         * 初始化UE事件及部分事件代理
+         * @private
+         * @ignore
+         */
+        _initEvents: function () {
+            var me = this,
+                cont = me.body,
+                _proxyDomEvent = function(){
+                    me._proxyDomEvent.apply(me, arguments);
+                };
+
+            $(cont)
+                .on( 'click contextmenu mousedown keydown keyup keypress mouseup mouseover mouseout selectstart', _proxyDomEvent)
+                .on( 'focus blur', _proxyDomEvent)
+                .on('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);
+                });
+        },
+        /**
+         * 触发事件代理
+         * @private
+         * @ignore
+         */
+        _proxyDomEvent: function (evt) {
+            return this.fireEvent(evt.type.replace(/^on/, ''), evt);
+        },
+        /**
+         * 变化选区
+         * @private
+         * @ignore
+         */
+        _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.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);
+        },
+        _callCmdFn: function (fnName, args) {
+            args = Array.prototype.slice.call(args,0);
+            var cmdName = args.shift().toLowerCase(),
+                cmd, cmdFn;
+            cmd = this.commands[cmdName] || UM.commands[cmdName];
+            cmdFn = cmd && cmd[fnName];
+            //没有querycommandstate或者没有command的都默认返回0
+            if ((!cmd || !cmdFn) && fnName == 'queryCommandState') {
+                return 0;
+            } else if (cmdFn) {
+                return cmdFn.apply(this, [cmdName].concat(args));
+            }
+        },
+
+        /**
+         * 执行编辑命令cmdName,完成富文本编辑效果
+         * @name execCommand
+         * @grammar editor.execCommand(cmdName)   => {*}
+         */
+        execCommand: function (cmdName) {
+            if(!this.isFocus()){
+                var bakRange = this.selection._bakRange;
+                if(bakRange){
+                    bakRange.select()
+                }else{
+                    this.focus(true)
+                }
+
+            }
+            cmdName = cmdName.toLowerCase();
+            var me = this,
+                result,
+                cmd = me.commands[cmdName] || UM.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('beforeexeccommand', cmdName);
+                    result = this._callCmdFn('execCommand', arguments);
+                    (!cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange');
+                    me.fireEvent('afterexeccommand', cmdName);
+                    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命令,查选编辑器当前的选区,返回命令的状态
+         * @name  queryCommandState
+         * @grammar editor.queryCommandState(cmdName)  => (-1|0|1)
+         * @desc
+         * * ''-1'' 当前命令不可用
+         * * ''0'' 当前命令可用
+         * * ''1'' 当前命令已经执行过了
+         */
+        queryCommandState: function (cmdName) {
+            try{
+                return this._callCmdFn('queryCommandState', arguments);
+            }catch(e){
+                return 0
+            }
+
+        },
+
+        /**
+         * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值
+         * @name  queryCommandValue
+         * @grammar editor.queryCommandValue(cmdName)  =>  {*}
+         */
+        queryCommandValue: function (cmdName) {
+            try{
+                return this._callCmdFn('queryCommandValue', arguments);
+            }catch(e){
+                return null
+            }
+        },
+        /**
+         * 检查编辑区域中是否有内容,若包含tags中的节点类型,直接返回true
+         * @name  hasContents
+         * @desc
+         * 默认有文本内容,或者有以下节点都不认为是空
+         * <code>{table:1,ul:1,ol:1,dl:1,iframe:1,area:1,base:1,col:1,hr:1,img:1,embed:1,input:1,link:1,meta:1,param:1}</code>
+         * @grammar editor.hasContents()  => (true|false)
+         * @grammar editor.hasContents(tags)  =>  (true|false)  //若文档中包含tags数组里对应的tag,直接返回true
+         * @example
+         * editor.hasContents(['span']) //如果编辑器里有这些,不认为是空
+         */
+        hasContents: function (tags) {
+            if (tags) {
+                for (var i = 0, ci; ci = tags[i++];) {
+                    if (this.body.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.body, ci);
+                for (var n = 0, cn; cn = nodes[n++];) {
+                    if (domUtils.isCustomeNode(cn)) {
+                        return true;
+                    }
+                }
+            }
+            return false;
+        },
+        /**
+         * 重置编辑器,可用来做多个tab使用同一个编辑器实例
+         * @name  reset
+         * @desc
+         * * 清空编辑器内容
+         * * 清空回退列表
+         * @grammar editor.reset()
+         */
+        reset: function () {
+            this.fireEvent('reset');
+        },
+        isEnabled: function(){
+            return this._isEnabled != true;
+        },
+
+        setEnabled: function () {
+            var me = this, range;
+
+            me.body.contentEditable = true;
+
+            /* 恢复选区 */
+            if (me.lastBk) {
+                range = me.selection.getRange();
+                try {
+                    range.moveToBookmark(me.lastBk);
+                    delete me.lastBk
+                } catch (e) {
+                    range.setStartAtFirst(me.body).collapse(true)
+                }
+                range.select(true);
+            }
+
+            /* 恢复query函数 */
+            if (me.bkqueryCommandState) {
+                me.queryCommandState = me.bkqueryCommandState;
+                delete me.bkqueryCommandState;
+            }
+
+            /* 恢复原生事件 */
+            if (me._bkproxyDomEvent) {
+                me._proxyDomEvent = me._bkproxyDomEvent;
+                delete me._bkproxyDomEvent;
+            }
+
+            /* 触发事件 */
+            me.fireEvent('setEnabled');
+        },
+        /**
+         * 设置当前编辑区域可以编辑
+         * @name enable
+         * @grammar editor.enable()
+         */
+        enable: function () {
+            return this.setEnabled();
+        },
+        setDisabled: function (except, keepDomEvent) {
+            var me = this;
+
+            me.body.contentEditable = false;
+            me._except = except ? utils.isArray(except) ? except : [except] : [];
+
+            /* 备份最后的选区 */
+            if (!me.lastBk) {
+                me.lastBk = me.selection.getRange().createBookmark(true);
+            }
+
+            /* 备份并重置query函数 */
+            if(!me.bkqueryCommandState) {
+                me.bkqueryCommandState = me.queryCommandState;
+                me.queryCommandState = function (type) {
+                    if (utils.indexOf(me._except, type) != -1) {
+                        return me.bkqueryCommandState.apply(me, arguments);
+                    }
+                    return -1;
+                };
+            }
+
+            /* 备份并墙原生事件 */
+            if(!keepDomEvent && !me._bkproxyDomEvent) {
+                me._bkproxyDomEvent = me._proxyDomEvent;
+                me._proxyDomEvent = function () {
+                    return false;
+                };
+            }
+
+            /* 触发事件 */
+            me.fireEvent('selectionchange');
+            me.fireEvent('setDisabled', me._except);
+        },
+        /** 设置当前编辑区域不可编辑,except中的命令除外
+         * @name disable
+         * @grammar editor.disable()
+         * @grammar editor.disable(except)  //例外的命令,也即即使设置了disable,此处配置的命令仍然可以执行
+         * @example
+         * //禁用工具栏中除加粗和插入图片之外的所有功能
+         * editor.disable(['bold','insertimage']);//可以是单一的String,也可以是Array
+         */
+        disable: function (except) {
+            return this.setDisabled(except);
+        },
+        /**
+         * 设置默认内容
+         * @ignore
+         * @private
+         * @param  {String} cont 要存入的内容
+         */
+        _setDefaultContent: function () {
+            function clear() {
+                var me = this;
+                if (me.document.getElementById('initContent')) {
+                    me.body.innerHTML = '<p>' + (ie ? '' : '<br/>') + '</p>';
+                    me.removeListener('firstBeforeExecCommand focus', clear);
+                    setTimeout(function () {
+                        me.focus();
+                        me._selectionChange();
+                    }, 0)
+                }
+            }
+
+            return function (cont) {
+                var me = this;
+                me.body.innerHTML = '<p id="initContent">' + cont + '</p>';
+
+                me.addListener('firstBeforeExecCommand focus', clear);
+            }
+        }(),
+        /**
+         * show方法的兼容版本
+         * @private
+         * @ignore
+         */
+        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 = '';
+            }
+
+        },
+        /**
+         * 显示编辑器
+         * @name show
+         * @grammar editor.show()
+         */
+        show: function () {
+            return this.setShow();
+        },
+        /**
+         * hide方法的兼容版本
+         * @private
+         * @ignore
+         */
+        setHide: function () {
+            var me = this;
+            if (!me.lastBk) {
+                me.lastBk = me.selection.getRange().createBookmark(true);
+            }
+            me.container.style.display = 'none'
+        },
+        /**
+         * 隐藏编辑器
+         * @name hide
+         * @grammar editor.hide()
+         */
+        hide: function () {
+            return this.setHide();
+        },
+        /**
+         * 根据制定的路径,获取对应的语言资源
+         * @name  getLang
+         * @grammar editor.getLang(path)  =>  (JSON|String) 路径根据的是lang目录下的语言文件的路径结构
+         * @example
+         * editor.getLang('contextMenu.delete') //如果当前是中文,那返回是的是删除
+         */
+        getLang: function (path) {
+            var lang = UM.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;
+        },
+        /**
+         * 计算编辑器当前内容的长度
+         * @name  getContentLength
+         * @grammar editor.getContentLength(ingoneHtml,tagNames)  =>
+         * @example
+         * editor.getLang(true)
+         */
+        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.body.getElementsByTagName(ci).length;
+                }
+            }
+            return count;
+        },
+        addInputRule: function (rule,ignoreUndo) {
+            rule.ignoreUndo = ignoreUndo;
+            this.inputRules.push(rule);
+        },
+        filterInputRule: function (root,isUndoLoad) {
+            for (var i = 0, ci; ci = this.inputRules[i++];) {
+                if(isUndoLoad && ci.ignoreUndo){
+                    continue;
+                }
+                ci.call(this, root)
+            }
+        },
+        addOutputRule: function (rule,ignoreUndo) {
+            rule.ignoreUndo = ignoreUndo;
+            this.outputRules.push(rule)
+        },
+        filterOutputRule: function (root,isUndoLoad) {
+            for (var i = 0, ci; ci = this.outputRules[i++];) {
+                if(isUndoLoad && ci.ignoreUndo){
+                    continue;
+                }
+                ci.call(this, root)
+            }
+        }
+    };
+    utils.inherits(Editor, EventBase);
+})();
+
+/**
+ * @file
+ * @name UM.filterWord
+ * @short filterWord
+ * @desc 用来过滤word粘贴过来的字符串
+ * @import editor.js,core/utils.js
+ * @anthor zhanyi
+ */
+var filterWord = UM.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( /<!--[\s\S]*?-->/ig, "" )
+            //转换图片
+            .replace(/<v:shape [^>]*>[\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 '<img width="'+ transUnit(width) +'" height="'+transUnit(height) +'" src="' + src + '" />';
+                } 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( /<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>" )
+            //去掉多余的属性
+            .replace( /\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/ig, function(str,name,marks,val){
+                //保留list的标示
+                return name == 'class' && val == 'MsoListParagraph' ? str : ''
+            })
+            //清除多余的font/span不能匹配&nbsp;有可能是空格
+            .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(/&#39;/g,'\'')
+                        .replace( /&quot;/gi, "'" )
+                        .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(!/<table/.test(tag))
+                                    n[i] = name.replace( /^mso-|-alt$/g, "" ) + ":" + transUnit( value );
+                                continue;
+                            case "horiz-align":
+                                n[i] = "text-align:" + value;
+                                continue;
+
+                            case "vert-align":
+                                n[i] = "vertical-align:" + value;
+                                continue;
+
+                            case "font-color":
+                            case "mso-foreground":
+                                n[i] = "color:" + value;
+                                continue;
+
+                            case "mso-background":
+                            case "mso-highlight":
+                                n[i] = "background:" + value;
+                                continue;
+
+                            case "mso-default-height":
+                                n[i] = "min-height:" + transUnit( value );
+                                continue;
+
+                            case "mso-default-width":
+                                n[i] = "min-width:" + transUnit( value );
+                                continue;
+
+                            case "mso-padding-between-alt":
+                                n[i] = "border-collapse:separate;border-spacing:" + transUnit( value );
+                                continue;
+
+                            case "text-line-through":
+                                if ( (value == "single") || (value == "double") ) {
+                                    n[i] = "text-decoration:line-through";
+                                }
+                                continue;
+                            case "mso-zero-height":
+                                if ( value == "yes" ) {
+                                    n[i] = "display:none";
+                                }
+                                continue;
+//                                case 'background':
+//                                    break;
+                            case 'margin':
+                                if ( !/[1-9]/.test( value ) ) {
+                                    continue;
+                                }
+
+                        }
+
+                        if ( /^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test( name )
+                            ||
+                            /text\-indent|padding|margin/.test(name) && /\-[\d.]+/.test(value)
+                            ) {
+                            continue;
+                        }
+
+                        n[i] = name + ":" + parts[1];
+                    }
+                }
+                return tag + (n.length ? ' style="' + n.join( ';').replace(/;{2,}/g,';') + '"' : '');
+            })
+            .replace(/[\d.]+(cm|pt)/g,function(str){
+                return utils.transUnitToPx(str)
+            })
+
+    }
+
+    return function ( html ) {
+        return (isWordDocument( html ) ? filterPasteWord( html ) : html);
+    };
+}();
+///import editor.js
+///import core/utils.js
+///import core/dom/dom.js
+///import core/dom/dtd.js
+///import core/htmlparser.js
+//模拟的节点类
+//by zhanyi
+(function () {
+    var uNode = UM.uNode = function (obj) {
+        this.type = obj.type;
+        this.data = obj.data;
+        this.tagName = obj.tagName;
+        this.parentNode = obj.parentNode;
+        this.attrs = obj.attrs || {};
+        this.children = obj.children;
+    };
+    var notTransAttrs = {
+        'href':1,
+        'src':1,
+        '_src':1,
+        '_href':1,
+        'cdata_data':1
+    };
+
+    var notTransTagName = {
+        style:1,
+        script:1
+    };
+
+    var indentChar = '    ',
+        breakChar = '\n';
+
+    function insertLine(arr, current, begin) {
+        arr.push(breakChar);
+        return current + (begin ? 1 : -1);
+    }
+
+    function insertIndent(arr, current) {
+        //插入缩进
+        for (var i = 0; i < current; i++) {
+            arr.push(indentChar);
+        }
+    }
+
+    //创建uNode的静态方法
+    //支持标签和html
+    uNode.createElement = function (html) {
+        if (/[<>]/.test(html)) {
+            return UM.htmlparser(html).children[0]
+        } else {
+            return new uNode({
+                type:'element',
+                children:[],
+                tagName:html
+            })
+        }
+    };
+    uNode.createText = function (data,noTrans) {
+        return new UM.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,' &nbsp;'))
+        }
+
+    }
+
+    function isElement(node, arr, formatter, current) {
+        var attrhtml = '';
+        if (node.attrs) {
+            attrhtml = [];
+            var attrs = node.attrs;
+            for (var a in attrs) {
+                //这里就针对
+                //<p>'<img src='http://nsclick.baidu.com/u.gif?&asdf=\"sdf&asdfasdfs;asdf'></p>
+                //这里边的\"做转换,要不用innerHTML直接被截断了,属性src
+                //有可能做的不够
+                attrhtml.push(a + (attrs[a] !== undefined ? '="' + (notTransAttrs[a] ? utils.html(attrs[a]).replace(/["]/g, function (a) {
+                    return '&quot;'
+                }) : 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('<!--' + node.data + '-->');
+    }
+
+    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 { UM.uNode } 返回节点本身
+         * @example
+         * ```javascript
+         * node.innerHTML('<span>text</span>');
+         * ```
+         */
+        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 = UM.htmlparser(htmlstr);
+                for (var i = 0, ci; ci = tmpRoot.children[i++];) {
+                    this.children.push(ci);
+                    ci.parentNode = this;
+                }
+                return this;
+            } else {
+                var tmpRoot = new UM.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 { UM.uNode } 返回节点本身
+         * @example
+         * ```javascript
+         * node.innerText('<span>text</span>');
+         * ```
+         */
+        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 { UM.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 { UM.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 { UM.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 { UM.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 { UM.uNode } target 要替换成该节点参数
+         * @param { UM.uNode } source 要被替换掉的节点
+         * @return { UM.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 { UM.uNode } node 要插入的节点
+         * @return { UM.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 { UM.uNode } target 要插入的节点
+         * @param { UM.uNode } source 在该参数节点前面插入
+         * @return { UM.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 { UM.uNode } target 要插入的节点
+         * @param { UM.uNode } source 在该参数节点后面插入
+         * @return { UM.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 { UM.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;
+                }
+
+            }
+        },
+        hasAttr: function( attrName ){
+            var attrVal = this.getAttr( attrName );
+            return ( attrVal !== null ) && ( attrVal !== undefined );
+        },
+        /**
+         * 获取当前节点在父节点下的位置索引
+         * @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 { UM.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))
+        },
+        hasClass: function( className ){
+            if( this.hasAttr('class') ) {
+                var classNames = this.getAttr('class').split(/\s+/),
+                    hasClass = false;
+                $.each(classNames, function(key, item){
+                    if( item === className ) {
+                        hasClass = true;
+                    }
+                });
+                return hasClass;
+            } else {
+                return false;
+            }
+        },
+        addClass: function( className ){
+
+            var classes = null,
+                hasClass = false;
+
+            if( this.hasAttr('class') ) {
+
+                classes = this.getAttr('class');
+                classes = classes.split(/\s+/);
+
+                classes.forEach( function( item ){
+
+                    if( item===className ) {
+                        hasClass = true;
+                        return;
+                    }
+
+                } );
+
+                !hasClass && classes.push( className );
+
+                this.setAttr('class', classes.join(" "));
+
+            } else {
+                this.setAttr('class', className);
+            }
+
+        },
+        removeClass: function( className ){
+            if( this.hasAttr('class') ) {
+                var cl = this.getAttr('class');
+                cl = cl.replace(new RegExp('\\b' + className + '\\b', 'g'),'');
+                this.setAttr('class', utils.trim(cl).replace(/[ ]{2,}/g,' '));
+            }
+        },
+        /**
+         * 传入一个函数,递归遍历当前节点下的所有节点
+         * @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;
+        }
+    }
+})();
+
+//html字符串转换成uNode节点
+//by zhanyi
+var htmlparser = UM.htmlparser = function (htmlstr,ignoreBlank) {
+    //todo 原来的方式  [^"'<>\/] 有\/就不能配对上 <TD vAlign=top background=../AAA.JPG> 这样的标签了
+    //先去掉了,加上的原因忘了,这里先记录
+    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 = UM.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;
+        }
+
+        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;
+
+    }
+    //如果结束是文本,就有可能丢掉,所以这里手动判断一下
+    //例如 <li>sdfsdfsdf<li>sdfsdfsdfsdf
+    if (nextIndex < htmlstr.length) {
+        text(currentParent, htmlstr.slice(nextIndex));
+    }
+    return root;
+};
+/**
+ * @file
+ * @name UM.filterNode
+ * @short filterNode
+ * @desc 根据给定的规则过滤节点
+ * @import editor.js,core/utils.js
+ * @anthor zhanyi
+ */
+var filterNode = UM.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;
+    }
+}();
+///import core
+/**
+ * @description 插入内容
+ * @name baidu.editor.execCommand
+ * @param   {String}   cmdName     inserthtml插入内容的命令
+ * @param   {String}   html                要插入的内容
+ * @author zhanyi
+ */
+UM.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 = UM.htmlparser(html);
+            //如果给了过滤规则就先进行过滤
+            if(me.options.filterRules){
+                UM.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]<br/>
+            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 = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';
+                        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)
+            }
+        }
+        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>|<[p> ==> <p></p><div></div><p>|</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 : '<br/>';
+                }catch(e){
+                    range.setStartBefore(child);
+                    domUtils.remove(child)
+                }
+
+            }
+
+        }
+        //加上true因为在删除表情等时会删两次,第一次是删的fillData
+        try{
+            if(browser.ie9below && range.startContainer.nodeType == 1 && !range.startContainer.childNodes[range.startOffset]){
+                var start = range.startContainer,pre = start.childNodes[range.startOffset-1];
+                if(pre && pre.nodeType == 1 && dtd.$empty[pre.tagName]){
+                    var txt = this.document.createTextNode(domUtils.fillChar);
+                    range.insertNode(txt).setStart(txt,0).collapse(true);
+                }
+            }
+            setTimeout(function(){
+                range.select(true);
+            })
+
+        }catch(e){}
+
+
+        setTimeout(function(){
+            range = me.selection.getRange();
+            range.scrollIntoView();
+            me.fireEvent('afterinserthtml');
+        },200);
+    }
+};
+
+///import core
+///import plugins\inserthtml.js
+///commands 插入图片,操作图片的对齐方式
+///commandsName  InsertImage,ImageNone,ImageLeft,ImageRight,ImageCenter
+///commandsTitle  图片,默认,居左,居右,居中
+///commandsDialog  dialogs\image
+/**
+ * Created by .
+ * User: zhanyi
+ * for image
+ */
+UM.commands['insertimage'] = {
+    execCommand:function (cmd, opt) {
+        opt = utils.isArray(opt) ? opt : [opt];
+        if (!opt.length) {
+            return;
+        }
+        var me = this;
+        var html = [], str = '', ci;
+        ci = opt[0];
+        if (opt.length == 1) {
+            str = '<img style="width: 100%;" src="' + ci.src + '" ' + (ci._src ? ' _src="' + ci._src + '" ' : '') +
+                (ci.width ? 'width="' + ci.width + '" ' : '') +
+                (ci.height ? ' height="' + ci.height + '" ' : '') +
+                (ci['floatStyle'] == 'left' || ci['floatStyle'] == 'right' ? ' style="float:' + ci['floatStyle'] + ';"' : '') +
+                (ci.title && ci.title != "" ? ' title="' + ci.title + '"' : '') +
+                (ci.border && ci.border != "0" ? ' border="' + ci.border + '"' : '') +
+                (ci.alt && ci.alt != "" ? ' alt="' + ci.alt + '"' : '') +
+                (ci.hspace && ci.hspace != "0" ? ' hspace = "' + ci.hspace + '"' : '') +
+                (ci.vspace && ci.vspace != "0" ? ' vspace = "' + ci.vspace + '"' : '') + '/>';
+            if (ci['floatStyle'] == 'center') {
+                str = '<p style="text-align: center">' + str + '</p>';
+            }
+            html.push(str);
+
+        } else {
+            for (var i = 0; ci = opt[i++];) {
+                str = '<p ' + (ci['floatStyle'] == 'center' ? 'style="text-align: center" ' : '') + '><img src="' + ci.src + '" ' +
+                    (ci.width ? 'width="' + ci.width + '" ' : '') + (ci._src ? ' _src="' + ci._src + '" ' : '') +
+                    (ci.height ? ' height="' + ci.height + '" ' : '') +
+                    ' style="' + (ci['floatStyle'] && ci['floatStyle'] != 'center' ? 'float:' + ci['floatStyle'] + ';' : '') +
+                    (ci.border || '') + '" ' +
+                    (ci.title ? ' title="' + ci.title + '"' : '') + ' /></p>';
+                html.push(str);
+            }
+        }
+
+        me.execCommand('insertHtml', html.join(''), true);
+    }
+};
+///import core
+///commands 段落格式,居左,居右,居中,两端对齐
+///commandsName  JustifyLeft,JustifyCenter,JustifyRight,JustifyJustify
+///commandsTitle  居左对齐,居中对齐,居右对齐,两端对齐
+/**
+ * @description 居左右中
+ * @name UM.execCommand
+ * @param   {String}   cmdName     justify执行对齐方式的命令
+ * @param   {String}   align               对齐方式:left居左,right居右,center居中,justify两端对齐
+ * @author zhanyi
+ */
+UM.plugins['justify']=function(){
+    var me = this;
+    $.each('justifyleft justifyright justifycenter justifyfull'.split(' '),function(i,cmdName){
+        me.commands[cmdName] = {
+            execCommand:function (cmdName) {
+                return this.document.execCommand(cmdName);
+            },
+            queryCommandValue: function (cmdName) {
+                var val = this.document.queryCommandValue(cmdName);
+                return   val === true || val === 'true' ? cmdName.replace(/justify/,'') : '';
+            },
+            queryCommandState: function (cmdName) {
+                return this.document.queryCommandState(cmdName) ? 1 : 0
+            }
+        };
+    })
+};
+
+///import core
+///import plugins\removeformat.js
+///commands 字体颜色,背景色,字号,字体,下划线,删除线
+///commandsName  ForeColor,BackColor,FontSize,FontFamily,Underline,StrikeThrough
+///commandsTitle  字体颜色,背景色,字号,字体,下划线,删除线
+/**
+ * @description 字体
+ * @name UM.execCommand
+ * @param {String}     cmdName    执行的功能名称
+ * @param {String}    value             传入的值
+ */
+UM.plugins['font'] = function () {
+    var me = this,
+        fonts = {
+            'forecolor': 'forecolor',
+            'backcolor': 'backcolor',
+            'fontsize': 'fontsize',
+            'fontfamily': 'fontname'
+        },
+        cmdNameToStyle = {
+            'forecolor': 'color',
+            'backcolor': 'background-color',
+            'fontsize': 'font-size',
+            'fontfamily': 'font-family'
+        },
+        cmdNameToAttr = {
+            'forecolor': 'color',
+            'fontsize': 'size',
+            'fontfamily': 'face'
+        };
+    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'},
+            { name: 'sans-serif',val:'sans-serif'}
+        ],
+        'fontsize': [10, 12,  16, 18,24, 32,48]
+    });
+
+    me.addOutputRule(function (root) {
+        utils.each(root.getNodesByTagName('font'), function (node) {
+            if (node.tagName == 'font') {
+                var cssStyle = [];
+                for (var p in node.attrs) {
+                    switch (p) {
+                        case 'size':
+                            var val =  node.attrs[p];
+                            $.each({
+                                '10':'1',
+                                '12':'2',
+                                '16':'3',
+                                '18':'4',
+                                '24':'5',
+                                '32':'6',
+                                '48':'7'
+                            },function(k,v){
+                                if(v == val){
+                                    val = k;
+                                    return false;
+                                }
+                            });
+                            cssStyle.push('font-size:' + val + '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(';')
+                };
+            }
+            node.tagName = 'span';
+            if(node.parentNode.tagName == 'span' && node.parentNode.children.length == 1){
+                $.each(node.attrs,function(k,v){
+
+                    node.parentNode.attrs[k] = k == 'style' ? node.parentNode.attrs[k] + v : v;
+                })
+                node.parentNode.removeChild(node,true);
+            }
+        });
+    });
+    for(var p in fonts){
+        (function (cmd) {
+            me.commands[cmd] = {
+                execCommand: function (cmdName,value) {
+                    if(value == 'transparent'){
+                        return;
+                    }
+                    var rng = this.selection.getRange();
+                    if(rng.collapsed){
+                        var span = $('<span></span>').css(cmdNameToStyle[cmdName],value)[0];
+                        rng.insertNode(span).setStart(span,0).setCursor();
+                    }else{
+                        if(cmdName == 'fontsize'){
+                            value  = {
+                                '10':'1',
+                                '12':'2',
+                                '16':'3',
+                                '18':'4',
+                                '24':'5',
+                                '32':'6',
+                                '48':'7'
+                            }[(value+"").replace(/px/,'')]
+                        }
+                        this.document.execCommand(fonts[cmdName],false, value);
+                        if(browser.gecko){
+                            $.each(this.$body.find('a'),function(i,a){
+                                var parent = a.parentNode;
+                                if(parent.lastChild === parent.firstChild && /FONT|SPAN/.test(parent.tagName)){
+                                    var cloneNode = parent.cloneNode(false);
+                                    cloneNode.innerHTML = a.innerHTML;
+                                    $(a).html('').append(cloneNode).insertBefore(parent);
+
+                                    $(parent).remove();
+                                }
+                            });
+                        }
+                        if(!browser.ie){
+                            var nativeRange = this.selection.getNative().getRangeAt(0);
+                            var common = nativeRange.commonAncestorContainer;
+                            var rng = this.selection.getRange(),
+                                bk = rng.createBookmark(true);
+
+                            $(common).find('a').each(function(i,n){
+                                var parent = n.parentNode;
+                                if(parent.nodeName == 'FONT'){
+                                    var font = parent.cloneNode(false);
+                                    font.innerHTML = n.innerHTML;
+                                    $(n).html('').append(font);
+                                }
+                            });
+                            rng.moveToBookmark(bk).select()
+                        }
+                        return true
+                    }
+
+                },
+                queryCommandValue: function (cmdName) {
+                    var start = me.selection.getStart();
+                    var val = $(start).css(cmdNameToStyle[cmdName]);
+                    if(val === undefined){
+                        val = $(start).attr(cmdNameToAttr[cmdName])
+                    }
+                    return val ? utils.fixColor(cmdName,val).replace(/px/,'') : '';
+                },
+                queryCommandState: function (cmdName) {
+                    return this.queryCommandValue(cmdName)
+                }
+            };
+        })(p);
+    }
+};
+///import core
+///commands 超链接,取消链接
+///commandsName  Link,Unlink
+///commandsTitle  超链接,取消链接
+///commandsDialog  dialogs\link
+/**
+ * 超链接
+ * @function
+ * @name UM.execCommand
+ * @param   {String}   cmdName     link插入超链接
+ * @param   {Object}  options         url地址,title标题,target是否打开新页
+ * @author zhanyi
+ */
+/**
+ * 取消链接
+ * @function
+ * @name UM.execCommand
+ * @param   {String}   cmdName     unlink取消链接
+ * @author zhanyi
+ */
+
+UM.plugins['link'] = function(){
+    var me = this;
+
+    me.setOpt('autourldetectinie',false);
+    //在ie下禁用autolink
+    if(browser.ie && this.options.autourldetectinie === false){
+        this.addListener('keyup',function(cmd,evt){
+            var me = this,keyCode = evt.keyCode;
+            if(keyCode == 13 || keyCode == 32){
+                var rng = me.selection.getRange();
+                var start = rng.startContainer;
+                if(keyCode == 13){
+                    if(start.nodeName == 'P'){
+                        var pre = start.previousSibling;
+                        if(pre && pre.nodeType == 1){
+                            var pre = pre.lastChild;
+                            if(pre && pre.nodeName == 'A' && !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);
+                       }
+                   }
+                }
+
+            }
+
+
+        });
+    }
+
+    this.addOutputRule(function(root){
+        $.each(root.getNodesByTagName('a'),function(i,a){
+            var _href = utils.html(a.getAttr('_href'));
+            if(!/^(ftp|https?|\/|file)/.test(_href)){
+                _href = 'http://' + _href;
+            }
+            a.setAttr('href', _href);
+            a.setAttr('_href')
+            if(a.getAttr('title')==''){
+                a.setAttr('title')
+            }
+        })
+    });
+    this.addInputRule(function(root){
+        $.each(root.getNodesByTagName('a'),function(i,a){
+            a.setAttr('_href', utils.html(a.getAttr('href')));
+        })
+    });
+    me.commands['link'] = {
+        execCommand : function( cmdName, opt ) {
+
+            var me = this;
+            var rng = me.selection.getRange();
+            if(rng.collapsed){
+                var start = rng.startContainer;
+                if(start = domUtils.findParentByTagName(start,'a',true)){
+                    $(start).attr(opt);
+                    rng.selectNode(start).select()
+                }else{
+                    rng.insertNode($('<a>' +opt.href+'</a>').attr(opt)[0]).select()
+
+                }
+
+            }else{
+                me.document.execCommand('createlink',false,'_umeditor_link');
+                utils.each(domUtils.getElementsByTagName(me.body,'a',function(n){
+
+                    return n.getAttribute('href') == '_umeditor_link'
+                }),function(l){
+                    if($(l).text() == '_umeditor_link'){
+                        $(l).text(opt.href);
+                    }
+                    domUtils.setAttributes(l,opt);
+                    rng.selectNode(l).select()
+                })
+            }
+
+        },
+        queryCommandState:function(){
+            return this.queryCommandValue('link') ? 1 : 0;
+        },
+        queryCommandValue:function(){
+            var path = this.selection.getStartElementPath();
+            var result;
+            $.each(path,function(i,n){
+                if(n.nodeName == "A"){
+                    result = n;
+                    return false;
+                }
+            })
+            return result;
+        }
+    };
+    me.commands['unlink'] = {
+        execCommand : function() {
+            this.document.execCommand('unlink');
+        }
+    };
+};
+///import core
+///commands 打印
+///commandsName  Print
+///commandsTitle  打印
+/**
+ * @description 打印
+ * @name baidu.editor.execCommand
+ * @param   {String}   cmdName     print打印编辑器内容
+ * @author zhanyi
+ */
+UM.commands['print'] = {
+    execCommand : function(){
+        var me = this,
+            id = 'editor_print_' + +new Date();
+
+        $('<iframe src="" id="' + id + '" name="' + id + '" frameborder="0"></iframe>').attr('id', id)
+            .css({
+                width:'0px',
+                height:'0px',
+                'overflow':'hidden',
+                'float':'left',
+                'position':'absolute',
+                top:'-10000px',
+                left:'-10000px'
+            })
+            .appendTo(me.$container.find('.edui-dialog-container'));
+
+        var w = window.open('', id, ''),
+            d = w.document;
+        d.open();
+        d.write('<html><head></head><body><div>'+this.getContent(null,null,true)+'</div><script>' +
+            "setTimeout(function(){" +
+            "window.print();" +
+            "setTimeout(function(){" +
+            "window.parent.$('#" + id + "').remove();" +
+            "},100);" +
+            "},200);" +
+            '</script></body></html>');
+        d.close();
+    },
+    notNeedUndo : 1
+};
+///import core
+///commands 格式
+///commandsName  Paragraph
+///commandsTitle  段落格式
+/**
+ * 段落样式
+ * @function
+ * @name UM.execCommand
+ * @param   {String}   cmdName     paragraph插入段落执行命令
+ * @param   {String}   style               标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'
+ * @param   {String}   attrs               标签的属性
+ * @author zhanyi
+ */
+UM.plugins['paragraph'] = function() {
+    var me = this;
+    me.setOpt('paragraph',{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''});
+    me.commands['paragraph'] = {
+        execCommand : function( cmdName, style ) {
+            return this.document.execCommand('formatBlock',false,'<' + style + '>');
+        },
+        queryCommandValue : function() {
+            try{
+                var  val = this.document.queryCommandValue('formatBlock')
+            }catch(e){
+            }
+            return val ;
+        }
+    };
+};
+
+///import core
+///import plugins\inserthtml.js
+///commands 分割线
+///commandsName  Horizontal
+///commandsTitle  分隔线
+/**
+ * 分割线
+ * @function
+ * @name UM.execCommand
+ * @param {String}     cmdName    horizontal插入分割线
+ */
+UM.plugins['horizontal'] = function(){
+    var me = this;
+    me.commands['horizontal'] = {
+        execCommand : function(  ) {
+            this.document.execCommand('insertHorizontalRule');
+            var rng = me.selection.getRange().txtToElmBoundary(true),
+                start = rng.startContainer;
+            if(domUtils.isBody(rng.startContainer)){
+                var next = rng.startContainer.childNodes[rng.startOffset];
+                if(!next){
+                    next = $('<p></p>').appendTo(rng.startContainer).html(browser.ie ? '&nbsp;' : '<br/>')[0]
+                }
+                rng.setStart(next,0).setCursor()
+            }else{
+
+                while(dtd.$inline[start.tagName] && start.lastChild === start.firstChild){
+
+                    var parent = start.parentNode;
+                    parent.appendChild(start.firstChild);
+                    parent.removeChild(start);
+                    start = parent;
+                }
+                while(dtd.$inline[start.tagName]){
+                    start = start.parentNode;
+                }
+                if(start.childNodes.length == 1 && start.lastChild.nodeName == 'HR'){
+                    var hr = start.lastChild;
+                    $(hr).insertBefore(start);
+                    rng.setStart(start,0).setCursor();
+                }else{
+                    hr = $('hr',start)[0];
+                    domUtils.breakParent(hr,start);
+                    var pre = hr.previousSibling;
+                    if(pre && domUtils.isEmptyBlock(pre)){
+                        $(pre).remove()
+                    }
+                    rng.setStart(hr.nextSibling,0).setCursor();
+                }
+
+            }
+        }
+    };
+
+};
+
+
+///import core
+///commands 清空文档
+///commandsName  ClearDoc
+///commandsTitle  清空文档
+/**
+ *
+ * 清空文档
+ * @function
+ * @name UM.execCommand
+ * @param   {String}   cmdName     cleardoc清空文档
+ */
+
+UM.commands['cleardoc'] = {
+    execCommand : function() {
+        var me = this,
+            range = me.selection.getRange();
+        me.body.innerHTML = "<p>"+(ie ? "" : "<br/>")+"</p>";
+        range.setStart(me.body.firstChild,0).setCursor(false,true);
+        setTimeout(function(){
+            me.fireEvent("clearDoc");
+        },0);
+
+    }
+};
+
+
+///import core
+///commands 撤销和重做
+///commandsName  Undo,Redo
+///commandsTitle  撤销,重做
+/**
+ * @description 回退
+ * @author zhanyi
+ */
+
+UM.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会产生多余的</hr>
+    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 = UM.htmlparser(scene.content.replace(fillchar, ''));
+            me.options.autoClearEmptyNode = false;
+            me.filterInputRule(root,true);
+            me.options.autoClearEmptyNode = orgState;
+            //trace:873
+            //去掉展位符
+            me.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,me.body).moveToAddress(scene.address);
+                if(browser.ie && rng.collapsed && rng.startContainer.nodeType == 1){
+                    var tmpNode = rng.startContainer.childNodes[rng.startOffset];
+                    if( !tmpNode || tmpNode.nodeType == 1 && dtd.$empty[tmpNode]){
+                        rng.insertNode(me.document.createTextNode(' ')).collapse(true);
+                    }
+                }
+                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 = UM.htmlparser(me.body.innerHTML,true);
+            me.options.autoClearEmptyNode = false;
+            me.filterOutputRule(root,true);
+            me.options.autoClearEmptyNode = orgState;
+            var cont = root.toHtml();
+            browser.ie && (cont = cont.replace(/>&nbsp;</g, '><').replace(/\s*</g, '<').replace(/>\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 &&
+                ( 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 () {
+        $(this.body).on('compositionstart', function () {
+            inputType = true;
+        }).on('compositionend', function () {
+            inputType = false;
+        })
+    });
+    //快捷键
+    me.addshortcutkey({
+        "Undo":"ctrl+90", //undo
+        "Redo":"ctrl+89,shift+ctrl+z" //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){
+
+                if (cont.selection.getRange().collapsed)
+                    cont.fireEvent('contentchange');
+                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;
+            }
+        }
+    });
+
+};
+
+///import core
+///import plugins/inserthtml.js
+///import plugins/undo.js
+///import plugins/serialize.js
+///commands 粘贴
+///commandsName  PastePlain
+///commandsTitle  纯文本粘贴模式
+/**
+ * @description 粘贴
+ * @author zhanyi
+ */
+UM.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));
+        this.body.appendChild(pastebin);
+        //trace:717 隐藏的span不能得到top
+        //bk.start.innerHTML = '&nbsp;';
+        bk.start.style.display = '';
+
+        pastebin.style.cssText = "position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" +
+        //要在现在光标平行的位置加入,否则会出现跳动的问题
+        $(bk.start).position().top  + '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;
+
+
+    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 = '<p><br/></p>';
+                        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字符,也会产生&nbsp;这里过滤掉
+            html = div.innerHTML;//.replace(/>(?:(\s|&nbsp;)*?)</g,'><');
+
+            //过滤word粘贴过来的冗余属性
+            html = UM.filterWord(html);
+            //取消了忽略空白的第二个参数,粘贴过来的有些是有空白的,会被套上相关的标签
+            var root = UM.htmlparser(html);
+            //如果给了过滤规则就先进行过滤
+            if (me.options.filterRules) {
+                UM.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)
+                    }
+                })
+            }
+            html = {'html': root.toHtml()};
+            me.fireEvent('beforepaste', html, root);
+            //抢了默认的粘贴,那后边的内容就不执行了,比如表格粘贴
+            if(!html.html){
+                return;
+            }
+
+            me.execCommand('insertHtml', html.html, true);
+            me.fireEvent("afterpaste", html);
+        }
+    }
+
+
+    me.addListener('ready', function () {
+        $(me.body).on( 'cut', function () {
+            var range = me.selection.getRange();
+            if (!range.collapsed && me.undoManger) {
+                me.undoManger.save();
+            }
+        }).on(browser.ie || browser.opera ? 'keydown' : 'paste', function (e) {
+            //ie下beforepaste在点击右键时也会触发,所以用监控键盘才处理
+            if ((browser.ie || browser.opera) && ((!e.ctrlKey && !e.metaKey) || e.keyCode != '86')) {
+                return;
+            }
+            getClipboardData.call(me, function (div) {
+                filter(div);
+            });
+        });
+
+    });
+};
+
+
+///import core
+///commands 有序列表,无序列表
+///commandsName  InsertOrderedList,InsertUnorderedList
+///commandsTitle  有序列表,无序列表
+/**
+ * 有序列表
+ * @function
+ * @name UM.execCommand
+ * @param   {String}   cmdName     insertorderlist插入有序列表
+ * @param   {String}   style               值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman
+ * @author zhanyi
+ */
+/**
+ * 无序链接
+ * @function
+ * @name UM.execCommand
+ * @param   {String}   cmdName     insertunorderlist插入无序列表
+ * * @param   {String}   style            值为:circle,disc,square
+ * @author zhanyi
+ */
+
+UM.plugins['list'] = function () {
+    var me = this;
+
+    me.setOpt( {
+        'insertorderedlist':{
+            'decimal':'',
+            'lower-alpha':'',
+            'lower-roman':'',
+            'upper-alpha':'',
+            'upper-roman':''
+        },
+        'insertunorderedlist':{
+            'circle':'',
+            'disc':'',
+            'square':''
+        }
+    } );
+
+    this.addInputRule(function(root){
+        utils.each(root.getNodesByTagName('li'), function (node) {
+            if(node.children.length == 0){
+                node.parentNode.removeChild(node);
+            }
+        })
+    });
+    me.commands['insertorderedlist'] =
+    me.commands['insertunorderedlist'] = {
+            execCommand:function (cmdName) {
+                this.document.execCommand(cmdName);
+                var rng = this.selection.getRange(),
+                    bk = rng.createBookmark(true);
+
+                this.$body.find('ol,ul').each(function(i,n){
+                    var parent = n.parentNode;
+                    if(parent.tagName == 'P' && parent.lastChild === parent.firstChild){
+                        $(n).children().each(function(j,li){
+                            var p = parent.cloneNode(false);
+                            $(p).append(li.innerHTML);
+                            $(li).html('').append(p);
+                        });
+                        $(n).insertBefore(parent);
+                        $(parent).remove();
+                    }
+
+                    if(dtd.$inline[parent.tagName]){
+                        if(parent.tagName == 'SPAN'){
+
+                            $(n).children().each(function(k,li){
+                                var span = parent.cloneNode(false);
+                                if(li.firstChild.nodeName != 'P'){
+
+                                    while(li.firstChild){
+                                        span.appendChild(li.firstChild)
+                                    };
+                                    $('<p></p>').appendTo(li).append(span);
+                                }else{
+                                    while(li.firstChild){
+                                        span.appendChild(li.firstChild)
+                                    };
+                                    $(li.firstChild).append(span);
+                                }
+                            })
+
+                        }
+                        domUtils.remove(parent,true)
+                    }
+                });
+
+
+
+
+                rng.moveToBookmark(bk).select();
+                return true;
+            },
+            queryCommandState:function (cmdName) {
+                return this.document.queryCommandState(cmdName);
+            }
+        };
+};
+
+
+///import core
+///import plugins/serialize.js
+///import plugins/undo.js
+///commands 查看源码
+///commandsName  Source
+///commandsTitle  查看源码
+(function (){
+    var sourceEditors = {
+        textarea: function (editor, holder){
+            var textarea = holder.ownerDocument.createElement('textarea');
+            textarea.style.cssText = 'resize:none;border:0;padding:0;margin:0;overflow-y:auto;outline:0';
+            // 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 {
+                container : textarea,
+                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;
+                }
+            };
+        }
+    };
+
+    UM.plugins['source'] = function (){
+        var me = this;
+        var opt = this.options;
+        var sourceMode = false;
+        var sourceEditor;
+
+        opt.sourceEditor = 'textarea';
+
+        me.setOpt({
+            sourceEditorFirst:false
+        });
+        function createSourceEditor(holder){
+            return sourceEditors.textarea(me, holder);
+        }
+
+        var bakCssText;
+        //解决在源码模式下getContent不能得到最新的内容问题
+        var oldGetContent = me.getContent,
+            bakAddress;
+
+        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.body.style.cssText;
+                    me.body.style.cssText += ';position:absolute;left:-32768px;top:-32768px;';
+
+
+                    me.fireEvent('beforegetcontent');
+                    var root = UM.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(/&nbsp;/g,' '))
+
+                            }
+                        }
+                    });
+
+                    me.fireEvent('aftergetcontent');
+
+                    var content = root.toHtml(true);
+
+                    sourceEditor = createSourceEditor(me.body.parentNode);
+
+                    sourceEditor.setContent(content);
+
+                    var getStyleValue=function(attr){
+                        return parseInt($(me.body).css(attr));
+                    };
+                    $(sourceEditor.container).width($(me.body).width()+getStyleValue("padding-left")+getStyleValue("padding-right"))
+                        .height($(me.body).height());
+                    setTimeout(function (){
+                        sourceEditor.select();
+                    });
+                    //重置getContent,源码模式下取值也能是最新的数据
+                    me.getContent = function (){
+                        return sourceEditor.getContent() || '<p>' + (browser.ie ? '' : '<br/>')+'</p>';
+                    };
+                } else {
+                    me.$body.css({
+                        'position':'',
+                        'left':'',
+                        'top':''
+                    });
+//                    me.body.style.cssText = bakCssText;
+                    var cont = sourceEditor.getContent() || '<p>' + (browser.ie ? '' : '<br/>')+'</p>';
+                    //处理掉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(cont);
+                    sourceEditor.dispose();
+                    sourceEditor = null;
+                    //还原getContent方法
+                    me.getContent = oldGetContent;
+                    var first = me.body.firstChild;
+                    //trace:1106 都删除空了,下边会报错,所以补充一个p占位
+                    if(!first){
+                        me.body.innerHTML = '<p>'+(browser.ie?'':'<br/>')+'</p>';
+                    }
+                    //要在ifm为显示时ff才能取到selection,否则报错
+                    //这里不能比较位置了
+                    me.undoManger && me.undoManger.save(true);
+                    if(browser.gecko){
+                        me.body.contentEditable = true;
+                    }
+                    try{
+                        me.selection.getRange().moveToAddress(bakAddress).select();
+                    }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
+                } ? oldQueryCommandState.apply(this, arguments)  : -1
+            }
+            return oldQueryCommandState.apply(this, arguments);
+        };
+
+    };
+
+})();
+///import core
+///import plugins/undo.js
+///commands 设置回车标签p或br
+///commandsName  EnterKey
+///commandsTitle  设置回车标签p或br
+/**
+ * @description 处理回车
+ * @author zhanyi
+ */
+UM.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, '<p>');
+                            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, '<p>');
+
+                        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);
+                    }
+
+                }
+
+            }
+
+        }
+    });
+
+    browser.ie && me.addListener('setDisabled',function(){
+        $(me.body).find('p').each(function(i,p){
+            if(domUtils.isEmptyBlock(p)){
+                p.innerHTML = '&nbsp;'
+            }
+        })
+    })
+};
+
+///import core
+///commands 预览
+///commandsName  Preview
+///commandsTitle  预览
+/**
+ * 预览
+ * @function
+ * @name UM.execCommand
+ * @param   {String}   cmdName     preview预览编辑器内容
+ */
+UM.commands['preview'] = {
+    execCommand : function(){
+        var w = window.open('', '_blank', ''),
+            d = w.document,
+            c = this.getContent(null,null,true),
+            path = this.getOpt('UMEDITOR_HOME_URL'),
+            formula = c.indexOf('mathquill-embedded-latex')!=-1 ?
+                '<link rel="stylesheet" href="' + path + 'third-party/mathquill/mathquill.css"/>' +
+                '<script src="' + path + 'third-party/jquery.min.js"></script>' +
+                '<script src="' + path + 'third-party/mathquill/mathquill.min.js"></script>':'';
+        d.open();
+        d.write('<html><head>' + formula + '</head><body><div>'+c+'</div></body></html>');
+        d.close();
+    },
+    notNeedUndo : 1
+};
+
+///import core
+///commands 加粗,斜体,上标,下标
+///commandsName  Bold,Italic,Subscript,Superscript
+///commandsTitle  加粗,加斜,下标,上标
+/**
+ * b u i等基础功能实现
+ * @function
+ * @name UM.execCommands
+ * @param    {String}    cmdName    bold加粗。italic斜体。subscript上标。superscript下标。
+*/
+UM.plugins['basestyle'] = function(){
+    var basestyles = ['bold','underline','superscript','subscript','italic','strikethrough'],
+        me = this;
+    //添加快捷键
+    me.addshortcutkey({
+        "Bold" : "ctrl+66",//^B
+        "Italic" : "ctrl+73", //^I
+        "Underline" : "ctrl+shift+85",//^U
+        "strikeThrough" : 'ctrl+shift+83' //^s
+    });
+    //过滤最后的产出数据
+    me.addOutputRule(function(root){
+        $.each(root.getNodesByTagName('b i u strike s'),function(i,node){
+            switch (node.tagName){
+                case 'b':
+                    node.tagName = 'strong';
+                    break;
+                case 'i':
+                    node.tagName = 'em';
+                    break;
+                case 'u':
+                    node.tagName = 'span';
+                    node.setStyle('text-decoration','underline');
+                    break;
+                case 's':
+                case 'strike':
+                    node.tagName = 'span';
+                    node.setStyle('text-decoration','line-through')
+            }
+        });
+    });
+    $.each(basestyles,function(i,cmd){
+        me.commands[cmd] = {
+            execCommand : function( cmdName ) {
+                var rng = this.selection.getRange();
+                if(rng.collapsed && this.queryCommandState(cmdName) != 1){
+                    var node = this.document.createElement({
+                        'bold':'strong',
+                        'underline':'u',
+                        'superscript':'sup',
+                        'subscript':'sub',
+                        'italic':'em',
+                        'strikethrough':'strike'
+                    }[cmdName]);
+                    rng.insertNode(node).setStart(node,0).setCursor(false);
+                    return true;
+                }else{
+                    return this.document.execCommand(cmdName)
+                }
+
+            },
+            queryCommandState : function(cmdName) {
+                if(browser.gecko){
+                    return this.document.queryCommandState(cmdName)
+                }
+                var path = this.selection.getStartElementPath(),result = false;
+                $.each(path,function(i,n){
+                    switch (cmdName){
+                        case 'bold':
+                            if(n.nodeName == 'STRONG' || n.nodeName == 'B'){
+                                result = 1;
+                                return false;
+                            }
+                            break;
+                        case 'underline':
+                            if(n.nodeName == 'U' || n.nodeName == 'SPAN' && $(n).css('text-decoration') == 'underline'){
+                                result = 1;
+                                return false;
+                            }
+                            break;
+                        case 'superscript':
+                            if(n.nodeName == 'SUP'){
+                                result = 1;
+                                return false;
+                            }
+                            break;
+                        case 'subscript':
+                            if(n.nodeName == 'SUB'){
+                                result = 1;
+                                return false;
+                            }
+                            break;
+                        case 'italic':
+                            if(n.nodeName == 'EM' || n.nodeName == 'I'){
+                                result = 1;
+                                return false;
+                            }
+                            break;
+                        case 'strikethrough':
+                            if(n.nodeName == 'S' || n.nodeName == 'STRIKE' || n.nodeName == 'SPAN' && $(n).css('text-decoration') == 'line-through'){
+                                result = 1;
+                                return false;
+                            }
+                            break;
+                    }
+                })
+                return result
+            }
+        };
+    })
+};
+
+
+///import core
+///import plugins/inserthtml.js
+///commands 视频
+///commandsName InsertVideo
+///commandsTitle  插入视频
+///commandsDialog  dialogs\video
+UM.plugins['video'] = function (){
+    var me =this,
+        div;
+
+    /**
+     * 创建插入视频字符窜
+     * @param url 视频地址
+     * @param width 视频宽度
+     * @param height 视频高度
+     * @param align 视频对齐
+     * @param toEmbed 是否以flash代替显示
+     * @param addParagraph  是否需要添加P 标签
+     */
+    function creatInsertStr(url,width,height,id,align,toEmbed){
+        return  !toEmbed ?
+
+                '<img ' + (id ? 'id="' + id+'"' : '') + ' width="'+ width +'" height="' + height + '" _url="'+url+'" class="edui-faked-video"'  +
+                ' src="' + me.options.UMEDITOR_HOME_URL+'themes/default/images/spacer.gif" style="background:url('+me.options.UMEDITOR_HOME_URL+'themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;'+(align ? 'float:' + align + ';': '')+'" />'
+
+                :
+                '<embed type="application/x-shockwave-flash" class="edui-faked-video" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
+                ' src="' + url + '" width="' + width  + '" height="' + height  + '"'  + (align ? ' style="float:' + align + '"': '') +
+                ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >';
+    }
+
+    function switchImgAndEmbed(root,img2embed){
+        utils.each(root.getNodesByTagName(img2embed ? 'img' : 'embed'),function(node){
+            if(node.getAttr('class') == 'edui-faked-video'){
+
+                var html = creatInsertStr( img2embed ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',img2embed);
+                node.parentNode.replaceChild(UM.uNode.createElement(html),node)
+            }
+        })
+    }
+
+    me.addOutputRule(function(root){
+        switchImgAndEmbed(root,true)
+    });
+    me.addInputRule(function(root){
+        switchImgAndEmbed(root)
+    });
+
+    me.commands["insertvideo"] = {
+        execCommand: function (cmd, videoObjs){
+            videoObjs = utils.isArray(videoObjs)?videoObjs:[videoObjs];
+            var html = [],id = 'tmpVedio';
+            for(var i=0,vi,len = videoObjs.length;i<len;i++){
+                 vi = videoObjs[i];
+                 html.push(creatInsertStr( vi.url, vi.width || 420,  vi.height || 280, id + i,vi.align,false));
+            }
+            me.execCommand("inserthtml",html.join(""),true);
+
+        },
+        queryCommandState : function(){
+            var img = me.selection.getRange().getClosedNode(),
+                flag = img && (img.className == "edui-faked-video");
+            return flag ? 1 : 0;
+        }
+    };
+};
+///import core
+///commands 全选
+///commandsName  SelectAll
+///commandsTitle  全选
+/**
+ * 选中所有
+ * @function
+ * @name UM.execCommand
+ * @param   {String}   cmdName    selectall选中编辑器里的所有内容
+ * @author zhanyi
+*/
+UM.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"
+    });
+};
+
+//UM.plugins['removeformat'] = function () {
+//    var me = this;
+//    me.commands['removeformat'] = {
+//        execCommand: function () {
+//            me.document.execCommand('removeformat');
+//
+//            /* 处理ie8和firefox选区有链接时,清除格式的bug */
+//            if (browser.gecko || browser.ie8 || browser.webkit) {
+//                var nativeRange = this.selection.getNative().getRangeAt(0),
+//                    common = nativeRange.commonAncestorContainer,
+//                    rng = me.selection.getRange(),
+//                    bk = rng.createBookmark();
+//
+//                function isEleInBookmark(node, bk){
+//                    if ( (domUtils.getPosition(node, bk.start) & domUtils.POSITION_FOLLOWING) &&
+//                        (domUtils.getPosition(bk.end, node) & domUtils.POSITION_FOLLOWING) ) {
+//                        return true;
+//                    } else if ( (domUtils.getPosition(node, bk.start) & domUtils.POSITION_CONTAINS) ||
+//                        (domUtils.getPosition(node, bk.end) & domUtils.POSITION_CONTAINS) ) {
+//                        return true;
+//                    }
+//                    return false;
+//                }
+//
+//                $(common).find('a').each(function (k, a) {
+//                    if ( isEleInBookmark(a, bk) ) {
+//                        a.removeAttribute('style');
+//                    }
+//                });
+//
+//            }
+//        }
+//    };
+//
+//};
+//
+
+
+UM.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);
+                //清除冗余的代码 <b><bookmark></b>
+                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();
+            if(!range.collapsed) {
+                doRemove( range );
+                range.select();
+            }
+
+        }
+
+    };
+
+};
+/*
+ *   处理特殊键的兼容性问题
+ */
+UM.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]<br/>
+            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 = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';
+                        rng.setStart(me.body.firstChild,0).setCursor(false,true);
+                        me._selectionChange();
+                        return;
+                    }
+                }
+            }
+        }
+
+        //处理backspace
+        if (keyCode == 8) {
+            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;
+                }
+            }
+            start = rng.startContainer;
+            if(rng.collapsed && start.nodeType == 1){
+                var currentNode = start.childNodes[rng.startOffset-1];
+                if(currentNode && currentNode.nodeType == 1 && currentNode.tagName == 'BR'){
+                    me.fireEvent('saveScene');
+                    rng.setStartBefore(currentNode).collapse(true);
+                    domUtils.remove(currentNode);
+                    rng.select();
+                    me.fireEvent('saveScene');
+                }
+            }
+
+            //trace:3613
+            if(browser.chrome){
+                if(rng.collapsed){
+
+                    while(rng.startOffset == 0 && !domUtils.isEmptyBlock(rng.startContainer)){
+                        rng.setStartBefore(rng.startContainer)
+                    }
+                    var pre = rng.startContainer.childNodes[rng.startOffset-1];
+                    if(pre && pre.nodeName == 'BR'){
+                        rng.setStartBefore(pre);
+                        me.fireEvent('saveScene');
+                        $(pre).remove();
+                        rng.setCursor();
+                        me.fireEvent('saveScene');
+                    }
+
+                }
+            }
+        }
+        //trace:1634
+        //ff的del键在容器空的时候,也会删除
+        if(browser.gecko && keyCode == 46){
+            var 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 == 8){
+            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 : '<br/>'
+                    });
+                    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()
+                }
+
+            }
+        }
+
+    })
+};
+/**
+ * 自动保存草稿
+ */
+UM.plugins['autosave'] = function() {
+
+
+    var me = this,
+        //无限循环保护
+        lastSaveTime = new Date(),
+        //最小保存间隔时间
+        MIN_TIME = 20,
+        //auto save key
+        saveKey = null;
+
+
+    //默认间隔时间
+    me.setOpt('saveInterval', 500);
+
+    //存储媒介封装
+    var LocalStorage = UM.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 save ( editor ) {
+
+        var saveData = null;
+
+        if ( new Date() - lastSaveTime < MIN_TIME ) {
+            return;
+        }
+
+        if ( !editor.hasContents() ) {
+            //这里不能调用命令来删除, 会造成事件死循环
+            saveKey && LocalStorage.removeItem( saveKey );
+            return;
+        }
+
+        lastSaveTime = new Date();
+
+        editor._saveFlag = null;
+
+        saveData = me.body.innerHTML;
+
+        if ( editor.fireEvent( "beforeautosave", {
+            content: saveData
+        } ) === false ) {
+            return;
+        }
+
+        LocalStorage.saveLocalData( saveKey, saveData );
+
+        editor.fireEvent( "afterautosave", {
+            content: saveData
+        } );
+
+    }
+
+    me.addListener('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;
+    });
+
+    me.addListener('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);
+
+        }
+
+    })
+
+
+    me.commands['clearlocaldata'] = {
+        execCommand:function (cmd, name) {
+            if ( saveKey && LocalStorage.getLocalData( saveKey ) ) {
+                LocalStorage.removeItem( saveKey )
+            }
+        },
+        notNeedUndo: true,
+        ignoreContentChange:true
+    };
+
+    me.commands['getlocaldata'] = {
+        execCommand:function (cmd, name) {
+            return saveKey ? LocalStorage.getLocalData( saveKey ) || '' : '';
+        },
+        notNeedUndo: true,
+        ignoreContentChange:true
+    };
+
+    me.commands['drafts'] = {
+        execCommand:function (cmd, name) {
+            if ( saveKey ) {
+                me.body.innerHTML = LocalStorage.getLocalData( saveKey ) || '<p>'+(browser.ie ? '&nbsp;' : '<br/>')+'</p>';
+                me.focus(true);
+            }
+        },
+        queryCommandState: function () {
+            return saveKey ? ( LocalStorage.getLocalData( saveKey ) === null ? -1 : 0 ) : -1;
+        },
+        notNeedUndo: true,
+        ignoreContentChange:true
+    }
+
+};
+
+/**
+ * @description
+ * 1.拖放文件到编辑区域,自动上传并插入到选区
+ * 2.插入粘贴板的图片,自动上传并插入到选区
+ * @author Jinqn
+ * @date 2013-10-14
+ */
+UM.plugins['autoupload'] = function () {
+
+    var me = this;
+
+    me.setOpt('pasteImageEnabled', true);
+    me.setOpt('dropFileEnabled', true);
+    var sendAndInsertImage = function (file, editor) {
+        //模拟数据
+        var fd = new FormData();
+        fd.append(editor.options.imageFieldName || 'upfile', file, file.name || ('blob.' + file.type.substr('image/'.length)));
+        fd.append('type', 'ajax');
+        var xhr = new XMLHttpRequest();
+        xhr.open("post", me.options.imageUrl, true);
+        xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+        xhr.addEventListener('load', function (e) {
+            try {
+                var json = eval('('+e.target.response+')'),
+                    link = json.url,
+                    picLink = me.options.imagePath + link;
+                editor.execCommand('insertimage', {
+                    src: picLink,
+                    _src: picLink
+                });
+            } catch (er) {
+            }
+        });
+        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;
+    }
+
+    me.addListener('ready', function () {
+        if (window.FormData && window.FileReader) {
+            var autoUploadHandler = function (e) {
+                var hasImg = false,
+                    items;
+                //获取粘贴板文件列表或者拖放文件列表
+                items = e.type == 'paste' ? getPasteImage(e.originalEvent) : getDropImage(e.originalEvent);
+                if (items) {
+                    var len = items.length,
+                        file;
+                    while (len--) {
+                        file = items[len];
+                        if (file.getAsFile) file = file.getAsFile();
+                        if (file && file.size > 0 && /image\/\w+/i.test(file.type)) {
+                            sendAndInsertImage(file, me);
+                            hasImg = true;
+                        }
+                    }
+                    if (hasImg) return false;
+                }
+
+            };
+            me.getOpt('pasteImageEnabled') && me.$body.on('paste', autoUploadHandler);
+            me.getOpt('dropFileEnabled') && me.$body.on('drop', autoUploadHandler);
+
+            //取消拖放图片时出现的文字光标位置提示
+            me.$body.on('dragover', function (e) {
+                if (e.originalEvent.dataTransfer.types[0] == 'Files') {
+                    return false;
+                }
+            });
+        }
+    });
+
+};
+/**
+ * 公式插件
+ */
+UM.plugins['formula'] = function () {
+    var me = this;
+
+    function getActiveIframe() {
+        return me.$body.find('iframe.edui-formula-active')[0] || null;
+    }
+
+    function blurActiveIframe(){
+        var iframe = getActiveIframe();
+        iframe && iframe.contentWindow.formula.blur();
+    }
+
+    me.addInputRule(function (root) {
+        $.each(root.getNodesByTagName('span'), function (i, node) {
+            if (node.hasClass('mathquill-embedded-latex')) {
+                var firstChild, latex = '';
+                while(firstChild = node.firstChild()){
+                    latex += firstChild.data;
+                    node.removeChild(firstChild);
+                }
+                node.tagName = 'iframe';
+                node.setAttr({
+                    'frameborder': '0',
+                    'src': me.getOpt('UMEDITOR_HOME_URL') + 'dialogs/formula/formula.html',
+                    'data-latex': utils.unhtml(latex)
+                });
+            }
+        });
+    });
+    me.addOutputRule(function (root) {
+        $.each(root.getNodesByTagName('iframe'), function (i, node) {
+            if (node.hasClass('mathquill-embedded-latex')) {
+                node.tagName = 'span';
+                node.appendChild(UM.uNode.createText(node.getAttr('data-latex')));
+                node.setAttr({
+                    'frameborder': '',
+                    'src': '',
+                    'data-latex': ''
+                });
+            }
+        });
+    });
+    me.addListener('click', function(){
+        blurActiveIframe();
+    });
+    me.addListener('afterexeccommand', function(type, cmd){
+        if(cmd != 'formula') {
+            blurActiveIframe();
+        }
+    });
+
+    me.commands['formula'] = {
+        execCommand: function (cmd, latex) {
+            var iframe = getActiveIframe();
+            if (iframe) {
+                iframe.contentWindow.formula.insertLatex(latex);
+            } else {
+                me.execCommand('inserthtml', '<span class="mathquill-embedded-latex">' + latex + '</span>');
+                browser.ie && browser.ie9below && setTimeout(function(){
+                    var rng = me.selection.getRange(),
+                        startContainer = rng.startContainer;
+                    if(startContainer.nodeType == 1 && !startContainer.childNodes[rng.startOffset]){
+                        rng.insertNode(me.document.createTextNode(' '));
+                        rng.setCursor()
+                    }
+                },100)
+            }
+        },
+        queryCommandState: function (cmd) {
+            return 0;
+        },
+        queryCommandValue: function (cmd) {
+            var iframe = getActiveIframe();
+            return iframe && iframe.contentWindow.formula.getLatex();
+        }
+    }
+
+};
+
+(function ($) {
+    //对jquery的扩展
+    $.parseTmpl = function parse(str, data) {
+        var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' + 'with(obj||{}){__p.push(\'' + str.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/<%=([\s\S]+?)%>/g,function (match, code) {
+            return "'," + code.replace(/\\'/g, "'") + ",'";
+        }).replace(/<%([\s\S]+?)%>/g,function (match, code) {
+                return "');" + code.replace(/\\'/g, "'").replace(/[\r\n\t]/g, ' ') + "__p.push('";
+            }).replace(/\r/g, '\\r').replace(/\n/g, '\\n').replace(/\t/g, '\\t') + "');}return __p.join('');";
+        var func = new Function('obj', tmpl);
+        return data ? func(data) : func;
+    };
+    $.extend2 = function (t, s) {
+        var a = arguments,
+            notCover = $.type(a[a.length - 1]) == 'boolean' ? a[a.length - 1] : false,
+            len = $.type(a[a.length - 1]) == 'boolean' ? 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;
+    };
+
+    $.IE6 = !!window.ActiveXObject && parseFloat(navigator.userAgent.match(/msie (\d+)/i)[1]) == 6;
+
+    //所有ui的基类
+    var _eventHandler = [];
+    var _widget = function () {
+    };
+    var _prefix = 'edui';
+    _widget.prototype = {
+        on: function (ev, cb) {
+            this.root().on(ev, $.proxy(cb, this));
+            return this;
+        },
+        off: function (ev, cb) {
+            this.root().off(ev, $.proxy(cb, this));
+            return this;
+        },
+        trigger: function (ev, data) {
+            return  this.root().trigger(ev, data) === false ? false : this;
+        },
+        root: function ($el) {
+            return this._$el || (this._$el = $el);
+        },
+        destroy: function () {
+
+        },
+        data: function (key, val) {
+            if (val !== undefined) {
+                this.root().data(_prefix + key, val);
+                return this;
+            } else {
+                return this.root().data(_prefix + key)
+            }
+        },
+        register: function (eventName, $el, fn) {
+            _eventHandler.push({
+                'evtname': eventName,
+                '$els': $.isArray($el) ? $el : [$el],
+                handler: $.proxy(fn, $el)
+            })
+        }
+    };
+
+    //从jq实例上拿到绑定的widget实例
+    $.fn.edui = function (obj) {
+        return obj ? this.data('eduiwidget', obj) : this.data('eduiwidget');
+    };
+
+    function _createClass(ClassObj, properties, supperClass) {
+        ClassObj.prototype = $.extend2(
+            $.extend({}, properties),
+            (UM.ui[supperClass] || _widget).prototype,
+            true
+        );
+        ClassObj.prototype.supper = (UM.ui[supperClass] || _widget).prototype;
+        //父class的defaultOpt 合并
+        if( UM.ui[supperClass] && UM.ui[supperClass].prototype.defaultOpt ) {
+
+            var parentDefaultOptions = UM.ui[supperClass].prototype.defaultOpt,
+                subDefaultOptions = ClassObj.prototype.defaultOpt;
+
+            ClassObj.prototype.defaultOpt = $.extend( {}, parentDefaultOptions, subDefaultOptions || {} );
+
+        }
+        return ClassObj
+    }
+
+    var _guid = 1;
+
+    function mergeToJQ(ClassObj, className) {
+        $[_prefix + className] = ClassObj;
+        $.fn[_prefix + className] = function (opt) {
+            var result, args = Array.prototype.slice.call(arguments, 1);
+
+            this.each(function (i, el) {
+                var $this = $(el);
+                var obj = $this.edui();
+                if (!obj) {
+                    ClassObj(!opt || !$.isPlainObject(opt) ? {} : opt, $this);
+                    $this.edui(obj)
+                }
+                if ($.type(opt) == 'string') {
+                    if (opt == 'this') {
+                        result = obj;
+                    } else {
+                        result = obj[opt].apply(obj, args);
+                        if (result !== obj && result !== undefined) {
+                            return false;
+                        }
+                        result = null;
+                    }
+
+                }
+            });
+
+            return result !== null ? result : this;
+        }
+    }
+
+    UM.ui = {
+        define: function (className, properties, supperClass) {
+            var ClassObj = UM.ui[className] = _createClass(function (options, $el) {
+                    var _obj = function () {
+                    };
+                    $.extend(_obj.prototype, ClassObj.prototype, {
+                            guid: className + _guid++,
+                            widgetName: className
+                        }
+                    );
+                    var obj = new _obj;
+                    if ($.type(options) == 'string') {
+                        obj.init && obj.init({});
+                        obj.root().edui(obj);
+                        obj.root().find('a').click(function (evt) {
+                            evt.preventDefault()
+                        });
+                        return obj.root()[_prefix + className].apply(obj.root(), arguments)
+                    } else {
+                        $el && obj.root($el);
+                        obj.init && obj.init(!options || $.isPlainObject(options) ? $.extend2(options || {}, obj.defaultOpt || {}, true) : options);
+                        try{
+                            obj.root().find('a').click(function (evt) {
+                                evt.preventDefault()
+                            });
+                        }catch(e){
+                        }
+
+                        return obj.root().edui(obj);
+                    }
+
+                },properties, supperClass);
+
+            mergeToJQ(ClassObj, className);
+        }
+    };
+
+    $(function () {
+        $(document).on('click mouseup mousedown dblclick mouseover', function (evt) {
+            $.each(_eventHandler, function (i, obj) {
+                if (obj.evtname == evt.type) {
+                    $.each(obj.$els, function (i, $el) {
+                        if ($el[0] !== evt.target && !$.contains($el[0], evt.target)) {
+                            obj.handler(evt);
+                        }
+                    })
+                }
+            })
+        })
+    })
+})(jQuery);
+//button 类
+UM.ui.define('button', {
+    tpl: '<<%if(!texttype){%>div class="edui-btn edui-btn-<%=icon%> <%if(name){%>edui-btn-name-<%=name%><%}%>" unselectable="on" onmousedown="return false" <%}else{%>a class="edui-text-btn"<%}%><% if(title) {%> data-original-title="<%=title%>" <%};%>> ' +
+        '<% if(icon) {%><div unselectable="on" class="edui-icon-<%=icon%> edui-icon"></div><% }; %><%if(text) {%><span unselectable="on" onmousedown="return false" class="edui-button-label"><%=text%></span><%}%>' +
+        '<%if(caret && text){%><span class="edui-button-spacing"></span><%}%>' +
+        '<% if(caret) {%><span unselectable="on" onmousedown="return false" class="edui-caret"></span><% };%></<%if(!texttype){%>div<%}else{%>a<%}%>>',
+    defaultOpt: {
+        text: '',
+        title: '',
+        icon: '',
+        width: '',
+        caret: false,
+        texttype: false,
+        click: function () {
+        }
+    },
+    init: function (options) {
+        var me = this;
+
+        me.root($($.parseTmpl(me.tpl, options)))
+            .click(function (evt) {
+                me.wrapclick(options.click, evt)
+            });
+
+        me.root().hover(function () {
+            if(!me.root().hasClass("edui-disabled")){
+                me.root().toggleClass('edui-hover')
+            }
+        })
+
+        return me;
+    },
+    wrapclick: function (fn, evt) {
+        if (!this.disabled()) {
+            this.root().trigger('wrapclick');
+            $.proxy(fn, this, evt)()
+        }
+        return this;
+    },
+    label: function (text) {
+        if (text === undefined) {
+            return this.root().find('.edui-button-label').text();
+        } else {
+            this.root().find('.edui-button-label').text(text);
+            return this;
+        }
+    },
+    disabled: function (state) {
+        if (state === undefined) {
+            return this.root().hasClass('edui-disabled')
+        }
+        this.root().toggleClass('edui-disabled', state);
+        if(this.root().hasClass('edui-disabled')){
+            this.root().removeClass('edui-hover')
+        }
+        return this;
+    },
+    active: function (state) {
+        if (state === undefined) {
+            return this.root().hasClass('edui-active')
+        }
+        this.root().toggleClass('edui-active', state)
+
+        return this;
+    },
+    mergeWith: function ($obj) {
+        var me = this;
+        me.data('$mergeObj', $obj);
+        $obj.edui().data('$mergeObj', me.root());
+        if (!$.contains(document.body, $obj[0])) {
+            $obj.appendTo(me.root());
+        }
+        me.on('click',function () {
+            me.wrapclick(function () {
+                $obj.edui().show();
+            })
+        }).register('click', me.root(), function (evt) {
+                $obj.hide()
+            });
+    }
+});
+//toolbar 类
+(function () {
+    UM.ui.define('toolbar', {
+        tpl: '<div class="edui-toolbar"  ><div class="edui-btn-toolbar" unselectable="on" onmousedown="return false"  ></div></div>'
+          ,
+        init: function () {
+            var $root = this.root($(this.tpl));
+            this.data('$btnToolbar', $root.find('.edui-btn-toolbar'))
+        },
+        appendToBtnmenu : function(data){
+            var $cont = this.data('$btnToolbar');
+            data = $.isArray(data) ? data : [data];
+            $.each(data,function(i,$item){
+                $cont.append($item)
+            })
+        }
+    });
+})();
+
+//menu 类
+UM.ui.define('menu',{
+    show : function($obj,dir,fnname,topOffset,leftOffset){
+
+        fnname = fnname || 'position';
+        if(this.trigger('beforeshow') === false){
+            return;
+        }else{
+            this.root().css($.extend({display:'block'},$obj ? {
+                top : $obj[fnname]().top + ( dir == 'right' ? 0 : $obj.outerHeight()) - (topOffset || 0),
+                left : $obj[fnname]().left + (dir == 'right' ?  $obj.outerWidth() : 0) -  (leftOffset || 0)
+            }:{}))
+            this.trigger('aftershow');
+        }
+    },
+    hide : function(all){
+        var $parentmenu;
+        if(this.trigger('beforehide') === false){
+            return;
+        } else {
+
+            if($parentmenu = this.root().data('parentmenu')){
+                if($parentmenu.data('parentmenu')|| all)
+                    $parentmenu.edui().hide();
+            }
+            this.root().css('display','none');
+            this.trigger('afterhide');
+        }
+    },
+    attachTo : function($obj){
+        var me = this;
+        if(!$obj.data('$mergeObj')){
+            $obj.data('$mergeObj',me.root());
+            $obj.on('wrapclick',function(evt){
+                me.show()
+            });
+            me.register('click',$obj,function(evt){
+               me.hide()
+            });
+            me.data('$mergeObj',$obj)
+        }
+    }
+});
+//dropmenu 类
+UM.ui.define('dropmenu', {
+    tmpl: '<ul class="edui-dropdown-menu" aria-labelledby="dropdownMenu" >' +
+        '<%for(var i=0,ci;ci=data[i++];){%>' +
+        '<%if(ci.divider){%><li class="edui-divider"></li><%}else{%>' +
+        '<li <%if(ci.active||ci.disabled){%>class="<%= ci.active|| \'\' %> <%=ci.disabled||\'\' %>" <%}%> data-value="<%= ci.value%>">' +
+        '<a href="#" tabindex="-1"><em class="edui-dropmenu-checkbox"><i class="edui-icon-ok"></i></em><%= ci.label%></a>' +
+        '</li><%}%>' +
+        '<%}%>' +
+        '</ul>',
+    defaultOpt: {
+        data: [],
+        click: function () {
+
+        }
+    },
+    init: function (options) {
+        var me = this;
+        var eventName = {
+            click: 1,
+            mouseover: 1,
+            mouseout: 1
+        };
+
+        this.root($($.parseTmpl(this.tmpl, options))).on('click', 'li[class!="edui-disabled edui-divider edui-dropdown-submenu"]',function (evt) {
+            $.proxy(options.click, me, evt, $(this).data('value'), $(this))()
+        }).find('li').each(function (i, el) {
+                var $this = $(this);
+                if (!$this.hasClass("edui-disabled edui-divider edui-dropdown-submenu")) {
+                    var data = options.data[i];
+                    $.each(eventName, function (k) {
+                        data[k] && $this[k](function (evt) {
+                            $.proxy(data[k], el)(evt, data, me.root)
+                        })
+                    })
+                }
+            })
+
+    },
+    disabled: function (cb) {
+        $('li[class!=edui-divider]', this.root()).each(function () {
+            var $el = $(this);
+            if (cb === true) {
+                $el.addClass('edui-disabled')
+            } else if ($.isFunction(cb)) {
+                $el.toggleClass('edui-disabled', cb(li))
+            } else {
+                $el.removeClass('edui-disabled')
+            }
+
+        });
+    },
+    val: function (val) {
+        var currentVal;
+        $('li[class!="edui-divider edui-disabled edui-dropdown-submenu"]', this.root()).each(function () {
+            var $el = $(this);
+            if (val === undefined) {
+                if ($el.find('em.edui-dropmenu-checked').length) {
+                    currentVal = $el.data('value');
+                    return false
+                }
+            } else {
+                $el.find('em').toggleClass('edui-dropmenu-checked', $el.data('value') == val)
+            }
+        });
+        if (val === undefined) {
+            return currentVal
+        }
+    },
+    addSubmenu: function (label, menu, index) {
+        index = index || 0;
+
+        var $list = $('li[class!=edui-divider]', this.root());
+        var $node = $('<li class="edui-dropdown-submenu"><a tabindex="-1" href="#">' + label + '</a></li>').append(menu);
+
+        if (index >= 0 && index < $list.length) {
+            $node.insertBefore($list[index]);
+        } else if (index < 0) {
+            $node.insertBefore($list[0]);
+        } else if (index >= $list.length) {
+            $node.appendTo($list);
+        }
+    }
+}, 'menu');
+//splitbutton 类
+///import button
+UM.ui.define('splitbutton',{
+    tpl :'<div class="edui-splitbutton <%if (name){%>edui-splitbutton-<%= name %><%}%>"  unselectable="on" <%if(title){%>data-original-title="<%=title%>"<%}%>><div class="edui-btn"  unselectable="on" ><%if(icon){%><div  unselectable="on" class="edui-icon-<%=icon%> edui-icon"></div><%}%><%if(text){%><%=text%><%}%></div>'+
+            '<div  unselectable="on" class="edui-btn edui-dropdown-toggle" >'+
+                '<div  unselectable="on" class="edui-caret"><\/div>'+
+            '</div>'+
+        '</div>',
+    defaultOpt:{
+        text:'',
+        title:'',
+        click:function(){}
+    },
+    init : function(options){
+        var me = this;
+        me.root( $($.parseTmpl(me.tpl,options)));
+        me.root().find('.edui-btn:first').click(function(evt){
+            if(!me.disabled()){
+                $.proxy(options.click,me)();
+            }
+        });
+        me.root().find('.edui-dropdown-toggle').click(function(){
+            if(!me.disabled()){
+                me.trigger('arrowclick')
+            }
+        });
+        me.root().hover(function () {
+            if(!me.root().hasClass("edui-disabled")){
+                me.root().toggleClass('edui-hover')
+            }
+        });
+
+        return me;
+    },
+    wrapclick:function(fn,evt){
+        if(!this.disabled()){
+            $.proxy(fn,this,evt)()
+        }
+        return this;
+    },
+    disabled : function(state){
+        if(state === undefined){
+            return this.root().hasClass('edui-disabled')
+        }
+        this.root().toggleClass('edui-disabled',state).find('.edui-btn').toggleClass('edui-disabled',state);
+        return this;
+    },
+    active:function(state){
+        if(state === undefined){
+            return this.root().hasClass('edui-active')
+        }
+        this.root().toggleClass('edui-active',state).find('.edui-btn:first').toggleClass('edui-active',state);
+        return this;
+    },
+    mergeWith:function($obj){
+        var me = this;
+        me.data('$mergeObj',$obj);
+        $obj.edui().data('$mergeObj',me.root());
+        if(!$.contains(document.body,$obj[0])){
+            $obj.appendTo(me.root());
+        }
+        me.root().delegate('.edui-dropdown-toggle','click',function(){
+            me.wrapclick(function(){
+                $obj.edui().show();
+            })
+        });
+        me.register('click',me.root().find('.edui-dropdown-toggle'),function(evt){
+            $obj.hide()
+        });
+    }
+});
+/**
+ * Created with JetBrains PhpStorm.
+ * User: hn
+ * Date: 13-7-10
+ * Time: 下午3:07
+ * To change this template use File | Settings | File Templates.
+ */
+UM.ui.define('colorsplitbutton',{
+
+    tpl : '<div class="edui-splitbutton <%if (name){%>edui-splitbutton-<%= name %><%}%>"  unselectable="on" <%if(title){%>data-original-title="<%=title%>"<%}%>><div class="edui-btn"  unselectable="on" ><%if(icon){%><div  unselectable="on" class="edui-icon-<%=icon%> edui-icon"></div><%}%><div class="edui-splitbutton-color-label" <%if (color) {%>style="background: <%=color%>"<%}%>></div><%if(text){%><%=text%><%}%></div>'+
+            '<div  unselectable="on" class="edui-btn edui-dropdown-toggle" >'+
+            '<div  unselectable="on" class="edui-caret"><\/div>'+
+            '</div>'+
+            '</div>',
+    defaultOpt: {
+        color: ''
+    },
+    init: function( options ){
+
+        var me = this;
+
+        me.supper.init.call( me, options );
+
+    },
+    colorLabel: function(){
+        return this.root().find('.edui-splitbutton-color-label');
+    }
+
+}, 'splitbutton');
+//popup 类
+UM.ui.define('popup', {
+    tpl: '<div class="edui-dropdown-menu edui-popup"'+
+        '<%if(!<%=stopprop%>){%>onmousedown="return false"<%}%>'+
+        '><div class="edui-popup-body" unselectable="on" onmousedown="return false"><%=subtpl%></div>' +
+        '<div class="edui-popup-caret"></div>' +
+        '</div>',
+    defaultOpt: {
+        stopprop:false,
+        subtpl: '',
+        width: '',
+        height: ''
+    },
+    init: function (options) {
+        this.root($($.parseTmpl(this.tpl, options)));
+        return this;
+    },
+    mergeTpl: function (data) {
+        return $.parseTmpl(this.tpl, {subtpl: data});
+    },
+    show: function ($obj, posObj) {
+        if (!posObj) posObj = {};
+
+        var fnname = posObj.fnname || 'position';
+        if (this.trigger('beforeshow') === false) {
+            return;
+        } else {
+            this.root().css($.extend({display: 'block'}, $obj ? {
+                top: $obj[fnname]().top + ( posObj.dir == 'right' ? 0 : $obj.outerHeight()) - (posObj.offsetTop || 0),
+                left: $obj[fnname]().left + (posObj.dir == 'right' ? $obj.outerWidth() : 0) - (posObj.offsetLeft || 0),
+                position: 'absolute'
+            } : {}));
+
+            this.root().find('.edui-popup-caret').css({
+                top: posObj.caretTop || 0,
+                left: posObj.caretLeft || 0,
+                position: 'absolute'
+            }).addClass(posObj.caretDir || "up")
+
+        }
+        this.trigger("aftershow");
+    },
+    hide: function () {
+        this.root().css('display', 'none');
+        this.trigger('afterhide')
+    },
+    attachTo: function ($obj, posObj) {
+        var me = this
+        if (!$obj.data('$mergeObj')) {
+            $obj.data('$mergeObj', me.root());
+            $obj.on('wrapclick', function (evt) {
+                me.show($obj, posObj)
+            });
+            me.register('click', $obj, function (evt) {
+                me.hide()
+            });
+            me.data('$mergeObj', $obj)
+        }
+    },
+    getBodyContainer: function () {
+        return this.root().find(".edui-popup-body");
+    }
+});
+//scale 类
+UM.ui.define('scale', {
+    tpl: '<div class="edui-scale" unselectable="on">' +
+        '<span class="edui-scale-hand0"></span>' +
+        '<span class="edui-scale-hand1"></span>' +
+        '<span class="edui-scale-hand2"></span>' +
+        '<span class="edui-scale-hand3"></span>' +
+        '<span class="edui-scale-hand4"></span>' +
+        '<span class="edui-scale-hand5"></span>' +
+        '<span class="edui-scale-hand6"></span>' +
+        '<span class="edui-scale-hand7"></span>' +
+        '</div>',
+    defaultOpt: {
+        $doc: $(document),
+        $wrap: $(document)
+    },
+    init: function (options) {
+        if(options.$doc) this.defaultOpt.$doc = options.$doc;
+        if(options.$wrap) this.defaultOpt.$wrap = options.$wrap;
+        this.root($($.parseTmpl(this.tpl, options)));
+        this.initStyle();
+        this.startPos = this.prePos = {x: 0, y: 0};
+        this.dragId = -1;
+        return this;
+    },
+    initStyle: function () {
+        utils.cssRule('edui-style-scale', '.edui-scale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;}' +
+            '.edui-scale span{position:absolute;left:0;top:0;width:7px;height:7px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}'
+            + '.edui-scale .edui-scale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}'
+            + '.edui-scale .edui-scale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}'
+            + '.edui-scale .edui-scale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}'
+            + '.edui-scale .edui-scale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}'
+            + '.edui-scale .edui-scale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}'
+            + '.edui-scale .edui-scale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}'
+            + '.edui-scale .edui-scale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}'
+            + '.edui-scale .edui-scale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}');
+    },
+    _eventHandler: function (e) {
+        var me = this,
+            $doc = me.defaultOpt.$doc;
+        switch (e.type) {
+            case 'mousedown':
+                var hand = e.target || e.srcElement, hand;
+                if (hand.className.indexOf('edui-scale-hand') != -1) {
+                    me.dragId = hand.className.slice(-1);
+                    me.startPos.x = me.prePos.x = e.clientX;
+                    me.startPos.y = me.prePos.y = e.clientY;
+                    $doc.bind('mousemove', $.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;
+                    me.updateTargetElement();
+                }
+                break;
+            case 'mouseup':
+                if (me.dragId != -1) {
+                    me.dragId = -1;
+                    me.updateTargetElement();
+                    var $target = me.data('$scaleTarget');
+                    if ($target.parent()) me.attachTo(me.data('$scaleTarget'));
+                }
+                $doc.unbind('mousemove', $.proxy(me._eventHandler, me));
+                break;
+            default:
+                break;
+        }
+    },
+    updateTargetElement: function () {
+        var me = this,
+            $root = me.root(),
+            $target = me.data('$scaleTarget');
+        $target.css({width: $root.width(), height: $root.height()});
+        me.attachTo($target);
+    },
+    updateContainerStyle: function (dir, offset) {
+        var me = this,
+            $dom = me.root(),
+            tmp,
+            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]
+            ];
+
+        if (rect[dir][0] != 0) {
+            tmp = parseInt($dom.offset().left) + offset.x;
+            $dom.css('left', me._validScaledProp('left', tmp));
+        }
+        if (rect[dir][1] != 0) {
+            tmp = parseInt($dom.offset().top) + offset.y;
+            $dom.css('top', me._validScaledProp('top', tmp));
+        }
+        if (rect[dir][2] != 0) {
+            tmp = $dom.width() + rect[dir][2] * offset.x;
+            $dom.css('width', me._validScaledProp('width', tmp));
+        }
+        if (rect[dir][3] != 0) {
+            tmp = $dom.height() + rect[dir][3] * offset.y;
+            $dom.css('height', me._validScaledProp('height', tmp));
+        }
+    },
+    _validScaledProp: function (prop, value) {
+        var $ele = this.root(),
+            $wrap = this.defaultOpt.$doc,
+            calc = function(val, a, b){
+                return (val + a) > b ? b - a : value;
+            };
+
+        value = isNaN(value) ? 0 : value;
+        switch (prop) {
+            case 'left':
+                return value < 0 ? 0 : calc(value, $ele.width(), $wrap.width());
+            case 'top':
+                return value < 0 ? 0 : calc(value, $ele.height(),$wrap.height());
+            case 'width':
+                return value <= 0 ? 1 : calc(value, $ele.offset().left, $wrap.width());
+            case 'height':
+                return value <= 0 ? 1 : calc(value, $ele.offset().top, $wrap.height());
+        }
+    },
+    show: function ($obj) {
+        var me = this;
+        if ($obj) me.attachTo($obj);
+        me.root().bind('mousedown', $.proxy(me._eventHandler, me));
+        me.defaultOpt.$doc.bind('mouseup', $.proxy(me._eventHandler, me));
+        me.root().show();
+        me.trigger("aftershow");
+    },
+    hide: function () {
+        var me = this;
+        me.root().unbind('mousedown', $.proxy(me._eventHandler, me));
+        me.defaultOpt.$doc.unbind('mouseup', $.proxy(me._eventHandler, me));
+        me.root().hide();
+        me.trigger('afterhide')
+    },
+    attachTo: function ($obj) {
+        var me = this,
+            imgPos = $obj.offset(),
+            $root = me.root(),
+            $wrap = me.defaultOpt.$wrap,
+            posObj = $wrap.offset();
+
+        me.data('$scaleTarget', $obj);
+        me.root().css({
+            position: 'absolute',
+            width: $obj.width(),
+            height: $obj.height(),
+            left: imgPos.left - posObj.left - parseInt($wrap.css('border-left-width')) - parseInt($root.css('border-left-width')),
+            top: imgPos.top - posObj.top - parseInt($wrap.css('border-top-width')) - parseInt($root.css('border-top-width'))
+        });
+    },
+    getScaleTarget: function () {
+        return this.data('$scaleTarget')[0];
+    }
+});
+//colorpicker 类
+UM.ui.define('colorpicker', {
+    tpl: function (opt) {
+        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(',');
+
+        var html = '<div unselectable="on" onmousedown="return false" class="edui-colorpicker<%if (name){%> edui-colorpicker-<%=name%><%}%>" >' +
+            '<table unselectable="on" onmousedown="return false">' +
+            '<tr><td colspan="10">'+opt.lang_themeColor+'</td> </tr>' +
+            '<tr class="edui-colorpicker-firstrow" >';
+
+        for (var i = 0; i < COLORS.length; i++) {
+            if (i && i % 10 === 0) {
+                html += '</tr>' + (i == 60 ? '<tr><td colspan="10">'+opt.lang_standardColor+'</td></tr>' : '') + '<tr' + (i == 60 ? ' class="edui-colorpicker-firstrow"' : '') + '>';
+            }
+            html += i < 70 ? '<td><a unselectable="on" onmousedown="return false" title="' + COLORS[i] + '" class="edui-colorpicker-colorcell"' +
+                ' data-color="#' + COLORS[i] + '"' +
+                ' style="background-color:#' + COLORS[i] + ';border:solid #ccc;' +
+                (i < 10 || i >= 60 ? 'border-width:1px;' :
+                    i >= 10 && i < 20 ? 'border-width:1px 1px 0 1px;' :
+                        'border-width:0 1px 0 1px;') +
+                '"' +
+                '></a></td>' : '';
+        }
+        html += '</tr></table></div>';
+        return html;
+    },
+    init: function (options) {
+        var me = this;
+        me.root($($.parseTmpl(me.supper.mergeTpl(me.tpl(options)),options)));
+
+        me.root().on("click",function (e) {
+            me.trigger('pickcolor',  $(e.target).data('color'));
+        });
+    }
+}, 'popup');
+/**
+ * Created with JetBrains PhpStorm.
+ * User: hn
+ * Date: 13-5-29
+ * Time: 下午8:01
+ * To change this template use File | Settings | File Templates.
+ */
+
+(function(){
+
+    var widgetName = 'combobox',
+        itemClassName = 'edui-combobox-item',
+        HOVER_CLASS = 'edui-combobox-item-hover',
+        ICON_CLASS = 'edui-combobox-checked-icon',
+        labelClassName = 'edui-combobox-item-label';
+
+    UM.ui.define( widgetName, ( function(){
+
+        return {
+            tpl: "<ul class=\"dropdown-menu edui-combobox-menu<%if (comboboxName!=='') {%> edui-combobox-<%=comboboxName%><%}%>\" unselectable=\"on\" onmousedown=\"return false\" role=\"menu\" aria-labelledby=\"dropdownMenu\">" +
+                "<%if(autoRecord) {%>" +
+                "<%for( var i=0, len = recordStack.length; i<len; i++ ) {%>" +
+                "<%var index = recordStack[i];%>" +
+                "<li class=\"<%=itemClassName%><%if( selected == index ) {%> edui-combobox-checked<%}%>\" data-item-index=\"<%=index%>\" unselectable=\"on\" onmousedown=\"return false\">" +
+                "<span class=\"edui-combobox-icon\" unselectable=\"on\" onmousedown=\"return false\"></span>" +
+                "<label class=\"<%=labelClassName%>\" style=\"<%=itemStyles[ index ]%>\" unselectable=\"on\" onmousedown=\"return false\"><%=items[index]%></label>" +
+                "</li>" +
+                "<%}%>" +
+                "<%if( i ) {%>" +
+                "<li class=\"edui-combobox-item-separator\"></li>" +
+                "<%}%>" +
+                "<%}%>" +
+                "<%for( var i=0, label; label = items[i]; i++ ) {%>" +
+                "<li class=\"<%=itemClassName%><%if( selected == i ) {%> edui-combobox-checked<%}%> edui-combobox-item-<%=i%>\" data-item-index=\"<%=i%>\" unselectable=\"on\" onmousedown=\"return false\">" +
+                "<span class=\"edui-combobox-icon\" unselectable=\"on\" onmousedown=\"return false\"></span>" +
+                "<label class=\"<%=labelClassName%>\" style=\"<%=itemStyles[ i ]%>\" unselectable=\"on\" onmousedown=\"return false\"><%=label%></label>" +
+                "</li>" +
+                "<%}%>" +
+                "</ul>",
+            defaultOpt: {
+                //记录栈初始列表
+                recordStack: [],
+                //可用项列表
+                items: [],
+		        //item对应的值列表
+                value: [],
+                comboboxName: '',
+                selected: '',
+                //自动记录
+                autoRecord: true,
+                //最多记录条数
+                recordCount: 5
+            },
+            init: function( options ){
+
+                var me = this;
+
+                $.extend( me._optionAdaptation( options ), me._createItemMapping( options.recordStack, options.items ), {
+                    itemClassName: itemClassName,
+                    iconClass: ICON_CLASS,
+                    labelClassName: labelClassName
+                } );
+
+                this._transStack( options );
+
+                me.root( $( $.parseTmpl( me.tpl, options ) ) );
+
+                this.data( 'options', options ).initEvent();
+
+            },
+            initEvent: function(){
+
+                var me = this;
+
+                me.initSelectItem();
+
+                this.initItemActive();
+
+            },
+            /**
+             * 初始化选择项
+             */
+            initSelectItem: function(){
+
+                var me = this,
+                    labelClass = "."+labelClassName;
+
+                me.root().delegate('.' + itemClassName, 'click', function(){
+
+                    var $li = $(this),
+                        index = $li.attr('data-item-index');
+
+                    me.trigger('comboboxselect', {
+                        index: index,
+                        label: $li.find(labelClass).text(),
+                        value: me.data('options').value[ index ]
+                    }).select( index );
+
+                    me.hide();
+
+                    return false;
+
+                });
+
+            },
+            initItemActive: function(){
+                var fn = {
+                    mouseenter: 'addClass',
+                    mouseleave: 'removeClass'
+                };
+                if ($.IE6) {
+                    this.root().delegate( '.'+itemClassName,  'mouseenter mouseleave', function( evt ){
+                        $(this)[ fn[ evt.type ] ]( HOVER_CLASS );
+                    }).one('afterhide', function(){
+                    });
+                }
+            },
+            /**
+             * 选择给定索引的项
+             * @param index 项索引
+             * @returns {*} 如果存在对应索引的项,则返回该项;否则返回null
+             */
+            select: function( index ){
+
+                var itemCount = this.data('options').itemCount,
+                    items = this.data('options').autowidthitem;
+
+                if ( items && !items.length ) {
+                    items = this.data('options').items;
+                }
+
+                if( itemCount == 0 ) {
+                    return null;
+                }
+
+                if( index < 0 ) {
+
+                    index = itemCount + index % itemCount;
+
+                } else if ( index >= itemCount ) {
+
+                    index = itemCount-1;
+
+                }
+
+                this.trigger( 'changebefore', items[ index ] );
+
+                this._update( index );
+
+                this.trigger( 'changeafter', items[ index ] );
+
+                return null;
+
+            },
+            selectItemByLabel: function( label ){
+
+                var itemMapping = this.data('options').itemMapping,
+                    me = this,
+                    index = null;
+
+                !$.isArray( label ) && ( label = [ label ] );
+
+                $.each( label, function( i, item ){
+
+                    index = itemMapping[ item ];
+
+                    if( index !== undefined ) {
+
+                        me.select( index );
+                        return false;
+
+                    }
+
+                } );
+
+            },
+            /**
+             * 转换记录栈
+             */
+            _transStack: function( options ) {
+
+                var temp = [],
+                    itemIndex = -1,
+                    selected = -1;
+
+                $.each( options.recordStack, function( index, item ){
+
+                    itemIndex = options.itemMapping[ item ];
+
+                    if( $.isNumeric( itemIndex ) ) {
+
+                        temp.push( itemIndex );
+
+                        //selected的合法性检测
+                        if( item == options.selected ) {
+                            selected = itemIndex;
+                        }
+
+                    }
+
+                } );
+
+                options.recordStack = temp;
+                options.selected = selected;
+                temp = null;
+
+            },
+            _optionAdaptation: function( options ) {
+
+                if( !( 'itemStyles' in options ) ) {
+
+                    options.itemStyles = [];
+
+                    for( var i = 0, len = options.items.length; i < len; i++ ) {
+                        options.itemStyles.push('');
+                    }
+
+                }
+
+                options.autowidthitem = options.autowidthitem || options.items;
+                options.itemCount = options.items.length;
+
+                return options;
+
+            },
+            _createItemMapping: function( stackItem, items ){
+
+                var temp = {},
+                    result = {
+                        recordStack: [],
+                        mapping: {}
+                    };
+
+                $.each( items, function( index, item ){
+                    temp[ item ] = index;
+                } );
+
+                result.itemMapping = temp;
+
+                $.each( stackItem, function( index, item ){
+
+                    if( temp[ item ] !== undefined ) {
+                        result.recordStack.push( temp[ item ] );
+                        result.mapping[ item ] = temp[ item ];
+                    }
+
+                } );
+
+                return result;
+
+            },
+            _update: function ( index ) {
+
+                var options = this.data("options"),
+                    newStack = [],
+                    newChilds = null;
+
+                $.each( options.recordStack, function( i, item ){
+
+                    if( item != index ) {
+                        newStack.push( item );
+                    }
+
+                } );
+
+                //压入最新的记录
+                newStack.unshift( index );
+
+                if( newStack.length > options.recordCount ) {
+                    newStack.length = options.recordCount;
+                }
+
+                options.recordStack = newStack;
+                options.selected = index;
+
+                newChilds = $( $.parseTmpl( this.tpl, options ) );
+
+                //重新渲染
+                this.root().html( newChilds.html() );
+
+                newChilds = null;
+                newStack = null;
+
+            }
+        };
+
+    } )(), 'menu' );
+
+})();
+
+/**
+ * Combox 抽象基类
+ * User: hn
+ * Date: 13-5-29
+ * Time: 下午8:01
+ * To change this template use File | Settings | File Templates.
+ */
+
+(function(){
+
+    var widgetName = 'buttoncombobox';
+
+    UM.ui.define( widgetName, ( function(){
+
+        return {
+            defaultOpt: {
+                //按钮初始文字
+                label: '',
+                title: ''
+            },
+            init: function( options ) {
+
+                var me = this;
+
+                var btnWidget = $.eduibutton({
+                    caret: true,
+                    name: options.comboboxName,
+                    title: options.title,
+                    text: options.label,
+                    click: function(){
+                        me.show( this.root() );
+                    }
+                });
+
+                me.supper.init.call( me, options );
+
+                //监听change, 改变button显示内容
+                me.on('changebefore', function( e, label ){
+                    btnWidget.eduibutton('label', label );
+                });
+
+                me.data( 'button', btnWidget );
+
+                me.attachTo(btnWidget)
+
+            },
+            button: function(){
+                return this.data( 'button' );
+            }
+        }
+
+    } )(), 'combobox' );
+
+})();
+
+/*modal 类*/
+UM.ui.define('modal', {
+    tpl: '<div class="edui-modal" style="display: flex;flex-direction: column;" tabindex="-1" >' +
+        '<div class="edui-modal-header">' +
+        '<div class="edui-close" data-hide="modal"></div>' +
+        '<h3 class="edui-title"><%=title%></h3>' +
+        '</div>' +
+        '<div class="edui-modal-body"  style="width:100%;' +
+        'height:100%;">' +
+        ' </div>' +
+        '<% if(cancellabel || oklabel) {%>' +
+        '<div class="edui-modal-footer" style="text-align: right;float:none;">' +
+        '<div class="edui-modal-tip" style="display: inline-block;float:none;"></div>' +
+        '<%if(oklabel){%><div class="edui-btn edui-btn-primary" style="display: inline-block;float:none;" data-ok="modal"><%=oklabel%></div><%}%>' +
+        '<%if(cancellabel){%><div class="edui-btn" data-hide="modal" style="display: inline-block;float:none;"><%=cancellabel%></div><%}%>' +
+        '</div>' +
+        '<%}%></div>',
+    defaultOpt: {
+        title: "",
+        cancellabel: "",
+        oklabel: "",
+        width: '',
+        height: '',
+        backdrop: true,
+        keyboard: true
+    },
+    init: function (options) {
+        var me = this;
+
+        me.root($($.parseTmpl(me.tpl, options || {})));
+
+        me.data("options", options);
+        if (options.okFn) {
+            me.on('ok', $.proxy(options.okFn, me))
+        }
+        if (options.cancelFn) {
+            me.on('beforehide', $.proxy(options.cancelFn, me))
+        }
+
+        me.root().delegate('[data-hide="modal"]', 'click', $.proxy(me.hide, me))
+            .delegate('[data-ok="modal"]', 'click', $.proxy(me.ok, me));
+
+        $('[data-hide="modal"],[data-ok="modal"]',me.root()).hover(function(){
+            $(this).toggleClass('edui-hover')
+        });
+    },
+    toggle: function () {
+        var me = this;
+        return me[!me.data("isShown") ? 'show' : 'hide']();
+    },
+    show: function () {
+
+        var me = this;
+
+        me.trigger("beforeshow");
+
+        if (me.data("isShown")) return;
+
+        me.data("isShown", true);
+
+        me.escape();
+
+        me.backdrop(function () {
+            me.autoCenter();
+            me.root()
+                .show()
+                .focus()
+                .trigger('aftershow');
+        })
+    },
+    showTip: function ( text ) {
+        $( '.edui-modal-tip', this.root() ).html( text ).fadeIn();
+    },
+    hideTip: function ( text ) {
+        $( '.edui-modal-tip', this.root() ).fadeOut( function (){
+            $(this).html('');
+        } );
+    },
+    autoCenter: function () {
+        //ie6下不用处理了
+        !$.IE6 && this.root().css("margin-left", -(this.root().width() / 2));
+    },
+    hide: function () {
+        var me = this;
+
+        me.trigger("beforehide");
+
+        if (!me.data("isShown")) return;
+
+        me.data("isShown", false);
+
+        me.escape();
+
+        me.hideModal();
+    },
+    escape: function () {
+        var me = this;
+        if (me.data("isShown") && me.data("options").keyboard) {
+            me.root().on('keyup', function (e) {
+                e.which == 27 && me.hide();
+            })
+        }
+        else if (!me.data("isShown")) {
+            me.root().off('keyup');
+        }
+    },
+    hideModal: function () {
+        var me = this;
+        me.root().hide();
+        me.backdrop(function () {
+            me.removeBackdrop();
+            me.trigger('afterhide');
+        })
+    },
+    removeBackdrop: function () {
+        this.$backdrop && this.$backdrop.remove();
+        this.$backdrop = null;
+    },
+    backdrop: function (callback) {
+        var me = this;
+        if (me.data("isShown") && me.data("options").backdrop) {
+            me.$backdrop = $('<div class="edui-modal-backdrop" />').click(
+                me.data("options").backdrop == 'static' ?
+                    $.proxy(me.root()[0].focus, me.root()[0])
+                    : $.proxy(me.hide, me)
+            )
+        }
+        me.trigger('afterbackdrop');
+        callback && callback();
+
+    },
+    attachTo: function ($obj) {
+        var me = this
+        if (!$obj.data('$mergeObj')) {
+
+            $obj.data('$mergeObj', me.root());
+            $obj.on('click', function () {
+                me.toggle($obj)
+            });
+            me.data('$mergeObj', $obj)
+        }
+    },
+    ok: function () {
+        var me = this;
+        me.trigger('beforeok');
+        if (me.trigger("ok", me) === false) {
+            return;
+        }
+        me.hide();
+    },
+    getBodyContainer: function () {
+        return this.root().find('.edui-modal-body')
+    }
+});
+
+
+/*tooltip 类*/
+UM.ui.define('tooltip', {
+    tpl: '<div class="edui-tooltip" unselectable="on" onmousedown="return false">' +
+        '<div class="edui-tooltip-arrow" unselectable="on" onmousedown="return false"></div>' +
+        '<div class="edui-tooltip-inner" unselectable="on" onmousedown="return false"></div>' +
+        '</div>',
+    init: function (options) {
+        var me = this;
+        me.root($($.parseTmpl(me.tpl, options || {})));
+    },
+    content: function (e) {
+        var me = this,
+            title = $(e.currentTarget).attr("data-original-title");
+
+        me.root().find('.edui-tooltip-inner')['text'](title);
+    },
+    position: function (e) {
+        var me = this,
+            $obj = $(e.currentTarget);
+
+        me.root().css($.extend({display: 'block'}, $obj ? {
+            top: $obj.outerHeight(),
+            left: (($obj.outerWidth() - me.root().outerWidth()) / 2)
+        } : {}))
+    },
+    show: function (e) {
+        if ($(e.currentTarget).hasClass('edui-disabled')) return;
+
+        var me = this;
+        me.content(e);
+        me.root().appendTo($(e.currentTarget));
+        me.position(e);
+        me.root().css('display', 'block');
+    },
+    hide: function () {
+        var me = this;
+        me.root().css('display', 'none')
+    },
+    attachTo: function ($obj) {
+        var me = this;
+
+        function tmp($obj) {
+            var me = this;
+
+            if (!$.contains(document.body, me.root()[0])) {
+                me.root().appendTo($obj);
+            }
+
+            me.data('tooltip', me.root());
+
+            $obj.each(function () {
+                if ($(this).attr("data-original-title")) {
+                    $(this).on('mouseenter', $.proxy(me.show, me))
+                        .on('mouseleave click', $.proxy(me.hide, me))
+
+                }
+            });
+
+        }
+
+        if ($.type($obj) === "undefined") {
+            $("[data-original-title]").each(function (i, el) {
+                tmp.call(me, $(el));
+            })
+
+        } else {
+            if (!$obj.data('tooltip')) {
+                tmp.call(me, $obj);
+            }
+        }
+    }
+});
+
+/*tab 类*/
+UM.ui.define('tab', {
+    init: function (options) {
+        var me = this,
+            slr = options.selector;
+
+        if ($.type(slr)) {
+            me.root($(slr, options.context));
+            me.data("context", options.context);
+
+            $(slr, me.data("context")).on('click', function (e) {
+                me.show(e);
+            });
+        }
+    },
+    show: function (e) {
+
+        var me = this,
+            $cur = $(e.target),
+            $ul = $cur.closest('ul'),
+            selector,
+            previous,
+            $target,
+            e;
+
+        selector = $cur.attr('data-context');
+        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '');
+
+        var $tmp = $cur.parent('li');
+
+        if (!$tmp.length || $tmp.hasClass('edui-active')) return;
+
+        previous = $ul.find('.edui-active:last a')[0];
+
+        e = $.Event('beforeshow', {
+            target: $cur[0],
+            relatedTarget: previous
+        });
+
+        me.trigger(e);
+
+        if (e.isDefaultPrevented()) return;
+
+        $target = $(selector, me.data("context"));
+
+        me.activate($cur.parent('li'), $ul);
+        me.activate($target, $target.parent(), function () {
+            me.trigger({
+                type: 'aftershow', relatedTarget: previous
+            })
+        });
+    },
+    activate: function (element, container, callback) {
+        if (element === undefined) {
+            return $(".edui-tab-item.edui-active",this.root()).index();
+        }
+
+        var $active = container.find('> .edui-active');
+
+        $active.removeClass('edui-active');
+
+        element.addClass('edui-active');
+
+        callback && callback();
+    }
+});
+
+
+//button 类
+UM.ui.define('separator', {
+    tpl: '<div class="edui-separator" unselectable="on" onmousedown="return false" ></div>',
+    init: function (options) {
+        var me = this;
+        me.root($($.parseTmpl(me.tpl, options)));
+        return me;
+    }
+});
+/**
+ * @file adapter.js
+ * @desc adapt ui to editor
+ * @import core/Editor.js, core/utils.js
+ */
+
+(function () {
+    var _editorUI = {},
+        _editors = {},
+        _readyFn = [],
+        _activeWidget = null,
+        _widgetData = {},
+        _widgetCallBack = {},
+        _cacheUI = {},
+        _maxZIndex = null;
+
+    utils.extend(UM, {
+        defaultWidth : 500,
+        defaultHeight : 500,
+        registerUI: function (name, fn) {
+            utils.each(name.split(/\s+/), function (uiname) {
+                _editorUI[uiname] = fn;
+            })
+        },
+
+        setEditor : function(editor){
+            !_editors[editor.id] && (_editors[editor.id] = editor);
+        },
+        registerWidget : function(name,pro,cb){
+            _widgetData[name] = $.extend2(pro,{
+                $root : '',
+                _preventDefault:false,
+                root:function($el){
+                    return this.$root || (this.$root = $el);
+                },
+                preventDefault:function(){
+                    this._preventDefault = true;
+                },
+                clear:false
+            });
+            if(cb){
+                _widgetCallBack[name] = cb;
+            }
+        },
+        getWidgetData : function(name){
+            return _widgetData[name]
+        },
+        setWidgetBody : function(name,$widget,editor){
+            if(!editor._widgetData){
+
+                utils.extend(editor,{
+                    _widgetData : {},
+                    getWidgetData : function(name){
+                        return this._widgetData[name];
+                    },
+                    getWidgetCallback : function(widgetName){
+                        var me = this;
+                        return function(){
+                            return  _widgetCallBack[widgetName].apply(me,[me,$widget].concat(Array.prototype.slice.call(arguments,0)))
+                        }
+                    }
+                })
+
+            }
+            var pro = _widgetData[name];
+            if(!pro){
+                return null;
+            }
+            pro = editor._widgetData[name];
+            if(!pro){
+                pro = _widgetData[name];
+                pro = editor._widgetData[name] = $.type(pro) == 'function' ? pro : utils.clone(pro);
+            }
+
+            pro.root($widget.edui().getBodyContainer());
+
+            pro.initContent(editor,$widget);
+            if(!pro._preventDefault){
+                pro.initEvent(editor,$widget);
+            }
+
+            pro.width &&  $widget.width(pro.width);
+
+
+        },
+        setActiveWidget : function($widget){
+            _activeWidget = $widget;
+        },
+        getEditor: function (id, options) {
+            var editor = _editors[id] || (_editors[id] = this.createEditor(id, options));
+            _maxZIndex = _maxZIndex ? Math.max(editor.getOpt('zIndex'), _maxZIndex):editor.getOpt('zIndex');
+            return editor;
+        },
+        setTopEditor: function(editor){
+            $.each(_editors, function(i, o){
+                if(editor == o) {
+                    editor.$container && editor.$container.css('zIndex', _maxZIndex + 1);
+                } else {
+                    o.$container && o.$container.css('zIndex', o.getOpt('zIndex'));
+                }
+            });
+        },
+        clearCache : function(id){
+            if ( _editors[id]) {
+                delete  _editors[id]
+            }
+        },
+        delEditor: function (id) {
+            var editor;
+            if (editor = _editors[id]) {
+                editor.destroy();
+            }
+        },
+        ready: function( fn ){
+            _readyFn.push( fn );
+        },
+        createEditor: function (id, opt) {
+            var editor = new UM.Editor(opt);
+            var T = this;
+
+            editor.langIsReady ? $.proxy(renderUI,T)() : editor.addListener("langReady", $.proxy(renderUI,T));
+            function renderUI(){
+
+
+                var $container = this.createUI('#' + id, editor);
+                editor.key=id;
+                editor.ready(function(){
+                    $.each( _readyFn, function( index, fn ){
+                        $.proxy( fn, editor )();
+                    } );
+                });
+                var options = editor.options;
+                if(options.initialFrameWidth){
+                    options.minFrameWidth = options.initialFrameWidth
+                }else{
+                    options.minFrameWidth = options.initialFrameWidth = editor.$body.width() || UM.defaultWidth;
+                }
+
+                $container.css({
+                    width: options.initialFrameWidth,
+                    zIndex:editor.getOpt('zIndex')
+                });
+
+                //ie6下缓存图片
+                UM.browser.ie && UM.browser.version === 6 && document.execCommand("BackgroundImageCache", false, true);
+
+                editor.render(id);
+
+
+                //添加tooltip;
+                $.eduitooltip && $.eduitooltip('attachTo', $("[data-original-title]",$container)).css('z-index',editor.getOpt('zIndex')+1);
+
+                $container.find('a').click(function(evt){
+                    evt.preventDefault()
+                });
+
+                editor.fireEvent("afteruiready");
+            }
+
+            return editor;
+
+        },
+        createUI: function (id, editor) {
+            var $editorCont = $(id),
+                $container = $('<div class="edui-container"><div class="edui-editor-body"></div></div>').insertBefore($editorCont);
+            editor.$container = $container;
+            editor.container = $container[0];
+
+            editor.$body = $editorCont;
+
+            //修正在ie9+以上的版本中,自动长高收起时的,残影问题
+            if(browser.ie && browser.ie9above){
+                var $span = $('<span style="padding:0;margin:0;height:0;width:0"></span>');
+                $span.insertAfter($container);
+            }
+            //初始化注册的ui组件
+            $.each(_editorUI,function(n,v){
+                var widget = v.call(editor,n);
+                if(widget){
+                    _cacheUI[n] = widget;
+                }
+
+            });
+
+            $container.find('.edui-editor-body').append($editorCont).before(this.createToolbar(editor.options, editor));
+
+            $container.find('.edui-toolbar').append($('<div class="edui-dialog-container"></div>'));
+
+
+            return $container;
+        },
+        createToolbar: function (options, editor) {
+            var $toolbar = $.eduitoolbar(), toolbar = $toolbar.edui();
+            //创建下来菜单列表
+
+            if (options.toolbar && options.toolbar.length) {
+                var btns = [];
+                $.each(options.toolbar,function(i,uiNames){
+                    $.each(uiNames.split(/\s+/),function(index,name){
+                        if(name == '|'){
+                                $.eduiseparator && btns.push($.eduiseparator());
+                        }else{
+                            var ui = _cacheUI[name];
+                            if(name=="fullscreen"){
+                                ui&&btns.unshift(ui);
+                            }else{
+                                ui && btns.push(ui);
+                            }
+                        }
+
+                    });
+                    btns.length && toolbar.appendToBtnmenu(btns);
+                });
+            } else {
+                $toolbar.find('.edui-btn-toolbar').remove()
+            }
+            return $toolbar;
+        }
+
+    })
+
+
+})();
+
+
+
+UM.registerUI('bold italic redo undo underline strikethrough superscript subscript insertorderedlist insertunorderedlist ' +
+    'cleardoc selectall link unlink print preview justifyleft justifycenter justifyright justifyfull removeformat horizontal drafts',
+    function(name) {
+        var me = this;
+        var $btn = $.eduibutton({
+            icon : name,
+            click : function(){
+                me.execCommand(name);
+            },
+            title: this.getLang('labelMap')[name] || ''
+        });
+
+        this.addListener('selectionchange',function(){
+            var state = this.queryCommandState(name);
+            $btn.edui().disabled(state == -1).active(state == 1)
+        });
+        return $btn;
+    }
+);
+
+
+/**
+ * 全屏组件
+ */
+
+(function(){
+
+    //状态缓存
+    var STATUS_CACHE = {},
+    //状态值列表
+        STATUS_LIST = [ 'width', 'height', 'position', 'top', 'left', 'margin', 'padding', 'overflowX', 'overflowY' ],
+        CONTENT_AREA_STATUS = {},
+    //页面状态
+        DOCUMENT_STATUS = {},
+        DOCUMENT_ELEMENT_STATUS = {},
+
+        FULLSCREENS = {};
+
+
+    UM.registerUI('fullscreen', function( name ){
+
+        var me = this,
+            $button = $.eduibutton({
+                'icon': 'fullscreen',
+                'title': (me.options.labelMap && me.options.labelMap[name]) || me.getLang("labelMap." + name),
+                'click': function(){
+                    //切换
+                    me.execCommand( name );
+                    UM.setTopEditor(me);
+                }
+            });
+
+        me.addListener( "selectionchange", function () {
+
+            var state = this.queryCommandState( name );
+            $button.edui().disabled( state == -1 ).active( state == 1 );
+
+        } );
+
+        //切换至全屏
+        me.addListener('ready', function(){
+
+            me.options.fullscreen && Fullscreen.getInstance( me ).toggle();
+
+        });
+
+        return $button;
+
+    });
+
+    UM.commands[ 'fullscreen' ] = {
+
+        execCommand: function (cmdName) {
+
+            Fullscreen.getInstance( this ).toggle();
+
+        },
+        queryCommandState: function (cmdName) {
+
+            return this._edui_fullscreen_status;
+        },
+        notNeedUndo: 1
+
+    };
+
+    function Fullscreen( editor ) {
+
+        var me = this;
+
+        if( !editor ) {
+            throw new Error('invalid params, notfound editor');
+        }
+
+        me.editor = editor;
+
+        //记录初始化的全屏组件
+        FULLSCREENS[ editor.uid ] = this;
+
+        editor.addListener('destroy', function(){
+            delete FULLSCREENS[ editor.uid ];
+            me.editor = null;
+        });
+
+    }
+
+    Fullscreen.prototype = {
+
+        /**
+         * 全屏状态切换
+         */
+        toggle: function(){
+
+            var editor = this.editor,
+            //当前编辑器的缩放状态
+                _edui_fullscreen_status = this.isFullState();
+            editor.fireEvent('beforefullscreenchange', !_edui_fullscreen_status );
+
+            //更新状态
+            this.update( !_edui_fullscreen_status );
+
+            !_edui_fullscreen_status ? this.enlarge() : this.revert();
+
+            editor.fireEvent('afterfullscreenchange', !_edui_fullscreen_status );
+            if(editor.body.contentEditable === 'true'){
+                editor.fireEvent( 'fullscreenchanged', !_edui_fullscreen_status );
+            }
+
+            editor.fireEvent( 'selectionchange' );
+
+        },
+        /**
+         * 执行放大
+         */
+        enlarge: function(){
+
+            this.saveSataus();
+
+            this.setDocumentStatus();
+
+            this.resize();
+
+        },
+        /**
+         * 全屏还原
+         */
+        revert: function(){
+
+            //还原CSS表达式
+            var options = this.editor.options,
+                height = /%$/.test(options.initialFrameHeight) ?  '100%' : (options.initialFrameHeight - this.getStyleValue("padding-top")- this.getStyleValue("padding-bottom") - this.getStyleValue('border-width'));
+
+            $.IE6 && this.getEditorHolder().style.setExpression('height', 'this.scrollHeight <= ' + height + ' ? "' + height + 'px" : "auto"');
+
+            //还原容器状态
+            this.revertContainerStatus();
+
+            this.revertContentAreaStatus();
+
+            this.revertDocumentStatus();
+
+        },
+        /**
+         * 更新状态
+         * @param isFull 当前状态是否是全屏状态
+         */
+        update: function( isFull ) {
+            this.editor._edui_fullscreen_status = isFull;
+        },
+        /**
+         * 调整当前编辑器的大小, 如果当前编辑器不处于全屏状态, 则不做调整
+         */
+        resize: function(){
+
+            var $win = null,
+                height = 0,
+                width = 0,
+                borderWidth = 0,
+                paddingWidth = 0,
+                editor = this.editor,
+                me = this,
+                bound = null,
+                editorBody = null;
+
+            if( !this.isFullState() ) {
+                return;
+            }
+
+            $win = $( window );
+            width = $win.width();
+            height = $win.height();
+            editorBody = this.getEditorHolder();
+            //文本编辑区border宽度
+            borderWidth = parseInt( domUtils.getComputedStyle( editorBody, 'border-width' ), 10 ) || 0;
+            //容器border宽度
+            borderWidth += parseInt( domUtils.getComputedStyle( editor.container, 'border-width' ), 10 ) || 0;
+            //容器padding
+            paddingWidth += parseInt( domUtils.getComputedStyle( editorBody, 'padding-left' ), 10 ) + parseInt( domUtils.getComputedStyle( editorBody, 'padding-right' ), 10 ) || 0;
+
+            //干掉css表达式
+            $.IE6 && editorBody.style.setExpression( 'height', null );
+
+            bound = this.getBound();
+
+            $( editor.container ).css( {
+                width: width + 'px',
+                height: height + 'px',
+                position: !$.IE6 ? 'fixed' : 'absolute',
+                top: bound.top,
+                left: bound.left,
+                margin: 0,
+                padding: 0,
+                overflowX: 'hidden',
+                overflowY: 'hidden'
+            } );
+
+            $( editorBody ).css({
+                width: width - 2*borderWidth - paddingWidth + 'px',
+                height: height - 2*borderWidth - ( editor.options.withoutToolbar ? 0 : $( '.edui-toolbar', editor.container ).outerHeight() ) - $( '.edui-bottombar', editor.container).outerHeight() + 'px',
+                overflowX: 'hidden',
+                overflowY: 'auto'
+            });
+
+        },
+        /**
+         * 保存状态
+         */
+        saveSataus: function(){
+
+            var styles = this.editor.container.style,
+                tmp = null,
+                cache = {};
+
+            for( var i= 0, len = STATUS_LIST.length; i<len; i++ ) {
+
+                tmp = STATUS_LIST[ i ];
+                cache[ tmp ] = styles[ tmp ];
+
+            }
+
+            STATUS_CACHE[ this.editor.uid ] = cache;
+
+            this.saveContentAreaStatus();
+            this.saveDocumentStatus();
+
+        },
+        saveContentAreaStatus: function(){
+
+            var $holder = $(this.getEditorHolder());
+
+            CONTENT_AREA_STATUS[ this.editor.uid ] = {
+                width: $holder.css("width"),
+                overflowX: $holder.css("overflowX"),
+                overflowY: $holder.css("overflowY"),
+                height: $holder.css("height")
+            };
+
+        },
+        /**
+         * 保存与指定editor相关的页面的状态
+         */
+        saveDocumentStatus: function(){
+
+            var $doc = $( this.getEditorDocumentBody() );
+
+            DOCUMENT_STATUS[ this.editor.uid ] = {
+                overflowX: $doc.css( 'overflowX' ),
+                overflowY: $doc.css( 'overflowY' )
+            };
+            DOCUMENT_ELEMENT_STATUS[ this.editor.uid ] = {
+                overflowX: $( this.getEditorDocumentElement() ).css( 'overflowX'),
+                overflowY: $( this.getEditorDocumentElement() ).css( 'overflowY' )
+            };
+
+        },
+        /**
+         * 恢复容器状态
+         */
+        revertContainerStatus: function(){
+            $( this.editor.container ).css( this.getEditorStatus() );
+        },
+        /**
+         * 恢复编辑区状态
+         */
+        revertContentAreaStatus: function(){
+            var holder = this.getEditorHolder(),
+                state = this.getContentAreaStatus();
+
+            if ( this.supportMin() ) {
+                delete state.height;
+                holder.style.height = null;
+            }
+
+            $( holder ).css( state );
+        },
+        /**
+         * 恢复页面状态
+         */
+        revertDocumentStatus: function() {
+
+            var status = this.getDocumentStatus();
+            $( this.getEditorDocumentBody() ).css( 'overflowX', status.body.overflowX );
+            $( this.getEditorDocumentElement() ).css( 'overflowY', status.html.overflowY );
+
+        },
+        setDocumentStatus: function(){
+            $(this.getEditorDocumentBody()).css( {
+                overflowX: 'hidden',
+                overflowY: 'hidden'
+            } );
+            $(this.getEditorDocumentElement()).css( {
+                overflowX: 'hidden',
+                overflowY: 'hidden'
+            } );
+        },
+        /**
+         * 检测当前编辑器是否处于全屏状态全屏状态
+         * @returns {boolean} 是否处于全屏状态
+         */
+        isFullState: function(){
+            return !!this.editor._edui_fullscreen_status;
+        },
+        /**
+         * 获取编辑器状态
+         */
+        getEditorStatus: function(){
+            return STATUS_CACHE[ this.editor.uid ];
+        },
+        getContentAreaStatus: function(){
+            return CONTENT_AREA_STATUS[ this.editor.uid ];
+        },
+        getEditorDocumentElement: function(){
+            return this.editor.container.ownerDocument.documentElement;
+        },
+        getEditorDocumentBody: function(){
+            return this.editor.container.ownerDocument.body;
+        },
+        /**
+         * 获取编辑区包裹对象
+         */
+        getEditorHolder: function(){
+            return this.editor.body;
+        },
+        /**
+         * 获取编辑器状态
+         * @returns {*}
+         */
+        getDocumentStatus: function(){
+            return {
+                'body': DOCUMENT_STATUS[ this.editor.uid ],
+                'html': DOCUMENT_ELEMENT_STATUS[ this.editor.uid ]
+            };
+        },
+        supportMin: function () {
+
+            var node = null;
+
+            if ( !this._support ) {
+
+                node = document.createElement("div");
+
+                this._support = "minWidth" in node.style;
+
+                node = null;
+
+            }
+
+            return this._support;
+
+        },
+        getBound: function () {
+
+            var tags = {
+                    html: true,
+                    body: true
+                },
+                result = {
+                    top: 0,
+                    left: 0
+                },
+                offsetParent = null;
+
+            if ( !$.IE6 ) {
+                return result;
+            }
+
+            offsetParent = this.editor.container.offsetParent;
+
+            if( offsetParent && !tags[ offsetParent.nodeName.toLowerCase() ] ) {
+                tags = offsetParent.getBoundingClientRect();
+                result.top = -tags.top;
+                result.left = -tags.left;
+            }
+
+            return result;
+
+        },
+        getStyleValue: function (attr) {
+            return parseInt(domUtils.getComputedStyle( this.getEditorHolder() ,attr));
+        }
+    };
+
+
+    $.extend( Fullscreen, {
+        /**
+         * 监听resize
+         */
+        listen: function(){
+
+            var timer = null;
+
+            if( Fullscreen._hasFullscreenListener ) {
+                return;
+            }
+
+            Fullscreen._hasFullscreenListener = true;
+
+            $( window ).on( 'resize', function(){
+
+                if( timer !== null ) {
+                    window.clearTimeout( timer );
+                    timer = null;
+                }
+
+                timer = window.setTimeout(function(){
+
+                    for( var key in FULLSCREENS ) {
+                        FULLSCREENS[ key ].resize();
+                    }
+
+                    timer = null;
+
+                }, 50);
+
+            } );
+
+        },
+
+        getInstance: function ( editor ) {
+
+            if ( !FULLSCREENS[editor.uid  ] ) {
+                new Fullscreen( editor );
+            }
+
+            return FULLSCREENS[editor.uid  ];
+
+        }
+
+    });
+
+    //开始监听
+    Fullscreen.listen();
+
+})();
+UM.registerUI('link image video map formula',function(name){
+
+    var me = this, currentRange, $dialog,
+        opt = {
+            title: (me.options.labelMap && me.options.labelMap[name]) || me.getLang("labelMap." + name),
+            url: me.options.UMEDITOR_HOME_URL + 'dialogs/' + name + '/' + name + '.js'
+        };
+
+    var $btn = $.eduibutton({
+        icon: name,
+        title: this.getLang('labelMap')[name] || ''
+    });
+    //加载模版数据
+    utils.loadFile(document,{
+        src: opt.url,
+        tag: "script",
+        type: "text/javascript",
+        defer: "defer"
+    },function(){
+        //调整数据
+        var data = UM.getWidgetData(name);
+        if(!data) return;
+        if(data.buttons){
+            var ok = data.buttons.ok;
+            if(ok){
+                opt.oklabel = ok.label || me.getLang('ok');
+                if(ok.exec){
+                    opt.okFn = function(){
+                        return $.proxy(ok.exec,null,me,$dialog)()
+                    }
+                }
+            }
+            var cancel = data.buttons.cancel;
+            if(cancel){
+                opt.cancellabel = cancel.label || me.getLang('cancel');
+                if(cancel.exec){
+                    opt.cancelFn = function(){
+                        return $.proxy(cancel.exec,null,me,$dialog)()
+                    }
+                }
+            }
+        }
+        data.width && (opt.width = data.width);
+        data.height && (opt.height = data.height);
+
+        $dialog = $.eduimodal(opt);
+
+        $dialog.attr('id', 'edui-dialog-' + name).addClass('edui-dialog-' + name)
+            .find('.edui-modal-body').addClass('edui-dialog-' + name + '-body');
+
+        $dialog.edui().on('beforehide',function () {
+            var rng = me.selection.getRange();
+            if (rng.equals(currentRange)) {
+                rng.select()
+            }
+        }).on('beforeshow', function () {
+                var $root = this.root(),
+                    win = null,
+                    offset = null;
+                currentRange = me.selection.getRange();
+                if (!$root.parent()[0]) {
+                    me.$container.find('.edui-dialog-container').append($root);
+                }
+
+                //IE6下 特殊处理, 通过计算进行定位
+                if( $.IE6 ) {
+
+                    win = {
+                        width: $( window ).width(),
+                        height: $( window ).height()
+                    };
+                    offset = $root.parents(".edui-toolbar")[0].getBoundingClientRect();
+                    $root.css({
+                        position: 'absolute',
+                        margin: 0,
+                        left: ( win.width - $root.width() ) / 2 - offset.left,
+                        top: 100 - offset.top
+                    });
+
+                }
+                UM.setWidgetBody(name,$dialog,me);
+                UM.setTopEditor(me);
+        }).on('afterbackdrop',function(){
+            this.$backdrop.css('zIndex',me.getOpt('zIndex')+1).appendTo(me.$container.find('.edui-dialog-container'))
+            $dialog.css('zIndex',me.getOpt('zIndex')+2)
+        }).on('beforeok',function(){
+            try{
+                currentRange.select()
+            }catch(e){}
+        }).attachTo($btn)
+    });
+
+
+
+
+    me.addListener('selectionchange', function () {
+        var state = this.queryCommandState(name);
+        $btn.edui().disabled(state == -1).active(state == 1)
+    });
+    return $btn;
+});
+UM.registerUI( 'emotion formula', function( name ){
+    var me = this,
+        url  = me.options.UMEDITOR_HOME_URL + 'dialogs/' +name+ '/'+name+'.js';
+
+    var $btn = $.eduibutton({
+        icon: name,
+        title: this.getLang('labelMap')[name] || ''
+    });
+
+    //加载模版数据
+    utils.loadFile(document,{
+        src: url,
+        tag: "script",
+        type: "text/javascript",
+        defer: "defer"
+    },function(){
+        var opt = {
+            url : url
+        };
+        //调整数据
+        var data = UM.getWidgetData(name);
+
+        data.width && (opt.width = data.width);
+        data.height && (opt.height = data.height);
+
+        $.eduipopup(opt).css('zIndex',me.options.zIndex + 1)
+            .addClass('edui-popup-' + name)
+            .edui()
+            .on('beforeshow',function(){
+                var $root = this.root();
+                if(!$root.parent().length){
+                    me.$container.find('.edui-dialog-container').append($root);
+                }
+                UM.setWidgetBody(name,$root,me);
+                UM.setTopEditor(me);
+            }).attachTo($btn,{
+                offsetTop:-5,
+                offsetLeft:10,
+                caretLeft:11,
+                caretTop:-8
+            });
+        me.addListener('selectionchange', function () {
+            var state = this.queryCommandState(name);
+            $btn.edui().disabled(state == -1).active(state == 1);
+        });
+    });
+    return $btn;
+
+} );
+UM.registerUI('imagescale',function () {
+    var me = this,
+        $imagescale;
+
+    me.setOpt('imageScaleEnabled', true);
+
+    if (browser.webkit && me.getOpt('imageScaleEnabled')) {
+
+        me.addListener('click', function (type, e) {
+            var range = me.selection.getRange(),
+                img = range.getClosedNode(),
+                target = e.target;
+
+            /* 点击第一个图片的后面,八个角不消失 fix:3652 */
+            if (img && img.tagName == 'IMG' && target == img) {
+
+                if (!$imagescale) {
+                    $imagescale = $.eduiscale({'$wrap':me.$container}).css('zIndex', me.options.zIndex);
+                    me.$container.append($imagescale);
+
+                    var _keyDownHandler = function () {
+                        $imagescale.edui().hide();
+                    }, _mouseDownHandler = function (e) {
+                        var ele = e.target || e.srcElement;
+                        if (ele && ele.className.indexOf('edui-scale') == -1) {
+                            _keyDownHandler(e);
+                        }
+                    }, timer;
+
+                    $imagescale.edui()
+                        .on('aftershow', function () {
+                            $(document).bind('keydown', _keyDownHandler);
+                            $(document).bind('mousedown', _mouseDownHandler);
+                            me.selection.getNative().removeAllRanges();
+                        })
+                        .on('afterhide', function () {
+                            $(document).unbind('keydown', _keyDownHandler);
+                            $(document).unbind('mousedown', _mouseDownHandler);
+                            var target = $imagescale.edui().getScaleTarget();
+                            if (target.parentNode) {
+                                me.selection.getRange().selectNode(target).select();
+                            }
+                        })
+                        .on('mousedown', function (e) {
+                            me.selection.getNative().removeAllRanges();
+                            var ele = e.target || e.srcElement;
+                            if (ele && ele.className.indexOf('edui-scale-hand') == -1) {
+                                timer = setTimeout(function() {
+                                    $imagescale.edui().hide();
+                                }, 200);
+                            }
+                        })
+                        .on('mouseup', function (e) {
+                            var ele = e.target || e.srcElement;
+                            if (ele && ele.className.indexOf('edui-scale-hand') == -1) {
+                                clearTimeout(timer);
+                            }
+                        });
+                }
+                $imagescale.edui().show($(img));
+
+            } else {
+                if ($imagescale && $imagescale.css('display') != 'none') $imagescale.edui().hide();
+
+            }
+        });
+
+        me.addListener('click', function (type, e) {
+            if (e.target.tagName == 'IMG') {
+                var range = new dom.Range(me.document, me.body);
+                range.selectNode(e.target).select();
+            }
+        });
+
+    }
+});
+UM.registerUI('autofloat',function(){
+    var me = this,
+        lang = me.getLang();
+    me.setOpt({
+        autoFloatEnabled: true,
+        topOffset: 0
+    });
+    var optsAutoFloatEnabled = me.options.autoFloatEnabled !== false,
+        topOffset = me.options.topOffset;
+
+
+    //如果不固定toolbar的位置,则直接退出
+    if(!optsAutoFloatEnabled){
+        return;
+    }
+    me.ready(function(){
+        var LteIE6 = browser.ie && browser.version <= 6,
+            quirks = browser.quirks;
+
+        function checkHasUI(){
+            if(!UM.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=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;
+            };
+        var isFullScreening = false;
+        function setFloating(){
+            if(isFullScreening){
+                return;
+            }
+            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(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(){
+
+            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(){
+            $(window).off('scroll resize',updateFloating);
+            me.removeListener('keydown', defer_updateFloating);
+        });
+
+        if(checkHasUI(me)){
+            toolbarBox = $('.edui-toolbar',me.container)[0];
+            me.addListener("afteruiready",function(){
+                setTimeout(function(){
+                    orgTop = $(toolbarBox).offset().top;
+                },100);
+            });
+            bakCssText = toolbarBox.style.cssText;
+            placeHolder.style.height = toolbarBox.offsetHeight + 'px';
+            if(LteIE6){
+                fixIE6FixedPos();
+            }
+
+            $(window).on('scroll resize',updateFloating);
+            me.addListener('keydown', defer_updateFloating);
+            me.addListener('resize', function(){
+                unsetFloating();
+                placeHolder.style.height = toolbarBox.offsetHeight + 'px';
+                updateFloating();
+            });
+
+            me.addListener('beforefullscreenchange', function (t, enabled){
+                if (enabled) {
+                    unsetFloating();
+                    isFullScreening = enabled;
+                }
+            });
+            me.addListener('fullscreenchanged', function (t, enabled){
+                if (!enabled) {
+                    updateFloating();
+                }
+                isFullScreening = enabled;
+            });
+            me.addListener('sourcemodechanged', function (t, enabled){
+                setTimeout(function (){
+                    updateFloating();
+                },0);
+            });
+            me.addListener("clearDoc",function(){
+                setTimeout(function(){
+                    updateFloating();
+                },0);
+
+            })
+        }
+    })
+
+
+});
+UM.registerUI('source',function(name){
+    var me = this;
+    me.addListener('fullscreenchanged',function(){
+        me.$container.find('textarea').width(me.$body.width() - 10).height(me.$body.height())
+
+    });
+    var $btn = $.eduibutton({
+        icon : name,
+        click : function(){
+            me.execCommand(name);
+            UM.setTopEditor(me);
+        },
+        title: this.getLang('labelMap')[name] || ''
+    });
+
+    this.addListener('selectionchange',function(){
+        var state = this.queryCommandState(name);
+        $btn.edui().disabled(state == -1).active(state == 1)
+    });
+    return $btn;
+});
+
+UM.registerUI('paragraph fontfamily fontsize', function( name ) {
+
+    var me = this,
+        label = (me.options.labelMap && me.options.labelMap[name]) || me.getLang("labelMap." + name),
+        options = {
+            label: label,
+            title: label,
+            comboboxName: name,
+            items: me.options[ name ] || [],
+            itemStyles: [],
+            value: [],
+            autowidthitem: []
+        },
+        $combox = null,
+        comboboxWidget = null;
+    if(options.items.length == 0){
+        return null;
+    }
+    switch ( name ) {
+
+        case 'paragraph':
+            options = transForParagraph( options );
+            break;
+
+        case 'fontfamily':
+            options = transForFontfamily( options );
+            break;
+
+        case 'fontsize':
+            options = transForFontsize( options );
+            break;
+
+    }
+
+    //实例化
+    $combox =  $.eduibuttoncombobox(options).css('zIndex',me.getOpt('zIndex') + 1);
+    comboboxWidget =  $combox.edui();
+
+    comboboxWidget.on('comboboxselect', function( evt, res ){
+                        me.execCommand( name, res.value );
+                    }).on("beforeshow", function(){
+                        if( $combox.parent().length === 0 ) {
+                            $combox.appendTo(  me.$container.find('.edui-dialog-container') );
+                        }
+                        UM.setTopEditor(me);
+                    });
+
+
+    //状态反射
+    this.addListener('selectionchange',function( evt ){
+
+        var state  = this.queryCommandState( name ),
+            value = this.queryCommandValue( name );
+
+        //设置按钮状态
+        comboboxWidget.button().edui().disabled( state == -1 ).active( state == 1 );
+        if(value){
+            //设置label
+            value = value.replace(/['"]/g, '').toLowerCase().split(/['|"]?\s*,\s*[\1]?/);
+
+            comboboxWidget.selectItemByLabel( value );
+        }
+
+
+    });
+
+    return comboboxWidget.button().addClass('edui-combobox');
+
+    /**
+     * 宽度自适应工具函数
+     * @param word 单词内容
+     * @param hasSuffix 是否含有后缀
+     */
+    function wordCountAdaptive ( word, hasSuffix ) {
+
+        var $tmpNode = $('<span>' ).html( word ).css( {
+                display: 'inline',
+                position: 'absolute',
+                top: -10000000,
+                left: -100000
+            } ).appendTo( document.body),
+            width = $tmpNode.width();
+
+        $tmpNode.remove();
+        $tmpNode = null;
+
+        if( width < 50 ) {
+
+            return word;
+
+        } else {
+
+            word = word.slice( 0, hasSuffix ? -4 : -1 );
+
+            if( !word.length ) {
+                return '...';
+            }
+
+            return wordCountAdaptive( word + '...', true );
+
+        }
+
+    }
+
+
+    //段落参数转换
+    function transForParagraph ( options ) {
+
+        var tempItems = [];
+
+        for( var key in options.items ) {
+
+            options.value.push( key );
+            tempItems.push( key );
+            options.autowidthitem.push( wordCountAdaptive( key ) );
+
+        }
+
+        options.items = tempItems;
+        options.autoRecord = false;
+
+        return options;
+
+    }
+
+    //字体参数转换
+    function transForFontfamily ( options ) {
+
+        var temp = null,
+            tempItems = [];
+
+        for( var i = 0, len = options.items.length; i < len; i++ ) {
+
+            temp = options.items[ i ].val;
+            tempItems.push( temp.split(/\s*,\s*/)[0] );
+            options.itemStyles.push('font-family: ' + temp);
+            options.value.push( temp );
+            options.autowidthitem.push( wordCountAdaptive( tempItems[ i ] ) );
+
+        }
+
+        options.items = tempItems;
+
+        return options;
+
+    }
+
+    //字体大小参数转换
+    function transForFontsize ( options ) {
+
+        var temp = null,
+            tempItems = [];
+
+        options.itemStyles = [];
+        options.value = [];
+
+        for( var i = 0, len = options.items.length; i < len; i++ ) {
+
+            temp = options.items[ i ];
+            tempItems.push( temp );
+            options.itemStyles.push('font-size: ' + temp +'px');
+
+        }
+
+        options.value = options.items;
+        options.items = tempItems;
+        options.autoRecord = false;
+
+        return options;
+
+    }
+
+});
+
+
+UM.registerUI('forecolor backcolor', function( name ) {
+    function getCurrentColor() {
+        return domUtils.getComputedStyle( $colorLabel[0], 'background-color' );
+    }
+
+    var me = this,
+        $colorPickerWidget = null,
+        $colorLabel = null,
+        $btn = null;
+
+    //querycommand
+    this.addListener('selectionchange', function(){
+
+        var state = this.queryCommandState( name );
+        $btn.edui().disabled( state == -1 ).active( state == 1 );
+
+    });
+
+    $btn = $.eduicolorsplitbutton({
+        icon: name,
+        caret: true,
+        name: name,
+        title: me.getLang("labelMap")[name],
+        click: function() {
+            me.execCommand( name, getCurrentColor() );
+        }
+    });
+
+    $colorLabel = $btn.edui().colorLabel();
+
+    $colorPickerWidget = $.eduicolorpicker({
+        name: name,
+        lang_clearColor: me.getLang('clearColor') || '',
+        lang_themeColor: me.getLang('themeColor') || '',
+        lang_standardColor: me.getLang('standardColor') || ''
+    })
+        .on('pickcolor', function( evt, color ){
+            window.setTimeout( function(){
+                $colorLabel.css("backgroundColor", color);
+                me.execCommand( name, color );
+            }, 0 );
+        })
+        .on('show',function(){
+            UM.setActiveWidget( colorPickerWidget.root() );
+        }).css('zIndex',me.getOpt('zIndex') + 1);
+
+    $btn.edui().on('arrowclick',function(){
+        if(!$colorPickerWidget.parent().length){
+            me.$container.find('.edui-dialog-container').append($colorPickerWidget);
+        }
+        $colorPickerWidget.edui().show($btn,{
+            caretDir:"down",
+            offsetTop:-5,
+            offsetLeft:8,
+            caretLeft:11,
+            caretTop:-8
+        });
+        UM.setTopEditor(me);
+    }).register('click', $btn, function () {
+            $colorPickerWidget.edui().hide()
+        });
+
+    return $btn;
+
+});
+
+})(jQuery)
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.min.js
new file mode 100644
index 0000000..9e7a478
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/umeditor/umeditor.min.js
@@ -0,0 +1,264 @@
+(function(g){function G(a,b,c){var d;b=b.toLowerCase();return(d=a.__allListeners||c&&(a.__allListeners={}))&&(d[b]||c&&(d[b]=[]))}function H(a,b,c,d,e,f){d=d&&a[b];var h;for(!d&&(d=a[c]);!d&&(h=(h||a).parentNode);){if("BODY"==h.tagName||f&&!f(h))return null;d=h[c]}return d&&e&&!e(d)?H(d,b,c,!1,e):d}UMEDITOR_CONFIG=window.UMEDITOR_CONFIG||{};window.UM={plugins:{},commands:{},I18N:{},version:"1.2.2"};var B=UM.dom={},m=UM.browser=function(){var a=navigator.userAgent.toLowerCase(),b=window.opera,c={ie:/(msie\s|trident.*rv:)([\w.]+)/.test(a),
+opera:!!b&&b.version,webkit:-1<a.indexOf(" applewebkit/"),mac:-1<a.indexOf("macintosh"),quirks:"BackCompat"==document.compatMode};c.gecko="Gecko"==navigator.product&&!c.webkit&&!c.opera&&!c.ie;var d=0;if(c.ie){var d=a.match(/(?:msie\s([\w.]+))/),e=a.match(/(?:trident.*rv:([\w.]+))/),d=d&&e&&d[1]&&e[1]?Math.max(1*d[1],1*e[1]):d&&d[1]?1*d[1]:e&&e[1]?1*e[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=7>d||c.quirks;c.ie9above=8<d;c.ie9below=9>d}c.gecko&&(e=a.match(/rv:([\d\.]+)/))&&(e=e[1].split("."),d=1E4*e[0]+100*(e[1]||0)+1*(e[2]||0));/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&&6<=d||c.gecko&&10801<=d||c.opera&&9.5<=d||c.air&&1<=d||c.webkit&&522<=d||!1);return c}(),E=m.ie,n=UM.utils={each:function(a,b,c){if(null!=a)if(a.length===+a.length)for(var d=0,e=a.length;d<e;d++){if(!1===b.call(c,a[d],d,a))return!1}else for(d in a)if(a.hasOwnProperty(d)&&!1===b.call(c,a[d],d,a))return!1},makeInstance:function(a){var b=new Function;b.prototype=a;a=new b;b.prototype=null;return a},extend:function(a,b,c){if(b)for(var d in b)c&&a.hasOwnProperty(d)||(a[d]=b[d]);return a},
+extend2:function(a){for(var b=arguments,c=1;c<b.length;c++){var d=b[c],e;for(e in d)a.hasOwnProperty(e)||(a[e]=d[e])}return a},inherits:function(a,b){var c=a.prototype,d=n.makeInstance(b.prototype);n.extend(d,c,!0);a.prototype=d;return d.constructor=a},bind:function(a,b){return function(){return a.apply(b,arguments)}},defer:function(a,b,c){var d;return function(){c&&clearTimeout(d);d=setTimeout(a,b)}},indexOf:function(a,b,c){var d=-1;c=this.isNumber(c)?c:0;this.each(a,function(a,f){if(f>=c&&a===b)return d=
+f,!1});return d},removeItem:function(a,b){for(var c=0,d=a.length;c<d;c++)a[c]===b&&(a.splice(c,1),c--)},trim:function(a){return a.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g,"")},listToMap:function(a){if(!a)return{};a=n.isArray(a)?a:a.split(",");for(var b=0,c,d={};c=a[b++];)d[c.toUpperCase()]=d[c]=1;return d},unhtml:function(a,b){return a?a.replace(b||/[&<">'](?:(amp|lt|quot|gt|#39|nbsp);)?/g,function(a,b){return b?a:{"<":"&lt;","&":"&amp;",'"':"&quot;",">":"&gt;","'":"&#39;"}[a]}):""},html:function(a){return a?
+a.replace(/&((g|l|quo)t|amp|#39);/g,function(a){return{"&lt;":"<","&amp;":"&","&quot;":'"',"&gt;":">","&#39;":"'"}[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,d){try{for(var e=0,f;f=b[e++];)if(f.doc===a&&f.url==(d.src||d.href))return f}catch(h){return null}}
+var b=[];return function(c,d,e){var f=a(c,d);if(f)f.ready?e&&e():f.funs.push(e);else if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){e=[];for(var h in d)"tag"!=h&&e.push(h+'="'+d[h]+'"');c.write("<"+d.tag+" "+e.join(" ")+" ></"+d.tag+">")}else if(!d.id||!c.getElementById(d.id)){var l=c.createElement(d.tag);delete d.tag;for(h in d)l.setAttribute(h,d[h]);l.onload=l.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){f=a(c,d);if(0<f.funs.length){f.ready=
+1;for(var b;b=f.funs.pop();)b()}l.onload=l.onreadystatechange=null}};l.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url settings of file umeditor.config.js ");};c.getElementsByTagName("head")[0].appendChild(l)}}}(),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(3<c.length)return"";
+b="#";for(var d=0,e;e=c[d++];)e=parseInt(e.replace(/[^\d]/gi,""),10).toString(16),b+=1==e.length?"0"+e:e;b=b.toUpperCase()}return 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]=n.isArray(c)?[]:{},n.clone(a[d],b[d])):b[d]=c);return b},transUnitToPx:function(a){if(!/(pt|cm)/.test(a))return a;var b;a.replace(/([\d.]+)(\w+)/,function(c,d,e){a=d;b=e});switch(b){case "cm":a=25*parseFloat(a);break;case "pt":a=Math.round(96*parseFloat(a)/72)}return a+
+(a?"px":"")},cssRule:m.ie&&11!=m.version?function(a,b,c){var d;c=c||document;d=c.indexList?c.indexList:c.indexList={};var e;if(d[a])e=c.styleSheets[d[a]];else{if(void 0===b)return"";e=c.createStyleSheet("",c=c.styleSheets.length);d[a]=c}if(void 0===b)return e.cssText;e.cssText=b||""}:function(a,b,c){c=c||document;var d=c.getElementsByTagName("head")[0],e;if(!(e=c.getElementById(a))){if(void 0===b)return"";e=c.createElement("style");e.id=a;d.appendChild(e)}if(void 0===b)return e.innerHTML;""!==b?e.innerHTML=
+b:d.removeChild(e)}};n.each("String Function Array Number RegExp Object".split(" "),function(a){UM.utils["is"+a]=function(b){return Object.prototype.toString.apply(b)=="[object "+a+"]"}});var I=UM.EventBase=function(){};I.prototype={addListener:function(a,b){a=n.trim(a).split(" ");for(var c=0,d;d=a[c++];)G(this,d,!0).push(b)},removeListener:function(a,b){a=n.trim(a).split(" ");for(var c=0,d;d=a[c++];)n.removeItem(G(this,d)||[],b)},fireEvent:function(){for(var a=arguments[0],a=n.trim(a).split(" "),
+b=0,c;c=a[b++];){var d=G(this,c),e,f,h;if(d)for(h=d.length;h--;)if(d[h]){f=d[h].apply(this,arguments);if(!0===f)return f;void 0!==f&&(e=f)}if(f=this["on"+c.toLowerCase()])e=f.apply(this,arguments)}return e}};var q=B.dtd=function(){function a(a){for(var b in a)a[b.toUpperCase()]=a[b];return a}var b=n.extend2,c=a({isindex:1,fieldset:1}),d=a({input:1,button:1,select:1,textarea:1,label:1}),e=b(a({a:1}),d),f=b({iframe:1},e),h=a({hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,
+dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1}),l=a({ins:1,del:1,script:1,style:1}),s=b(a({b:1,acronym:1,bdo:1,"var":1,"#":1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1}),l),p=b(a({sub:1,img:1,embed:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1}),s),r=b(a({p:1}),p),d=b(a({iframe:1}),p,d),p=a({img:1,embed:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,
+"#":1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,"var":1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1}),g=b(a({a:0}),d),u=a({tr:1}),v=a({"#":1}),w=b(a({param:1}),p),k=b(a({form:1}),c,f,h,r),m=a({li:1,ol:1,ul:1}),x=a({style:1,script:1}),q=a({base:1,link:1,meta:1,title:1}),
+x=b(q,x),C=a({head:1,body:1}),z=a({html:1}),A=a({address:1,blockquote:1,center:1,dir:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,menu:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1}),D=a({area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1});return a({$nonBodyContent:b(z,C,q),$block:A,$inline:g,$inlineWithA:b(a({a:1}),g),$body:b(a({script:1,style:1}),A),$cdata:a({script:1,style:1}),
+$empty:D,$nonChild:a({iframe:1,textarea:1}),$listItem:a({dd:1,dt:1,li:1}),$list:a({ul:1,ol:1,dl:1}),$isNotEmpty:a({table:1,ul:1,ol:1,dl:1,iframe:1,area:1,base:1,col:1,hr:1,img:1,embed:1,input:1,link:1,meta:1,param:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1}),$removeEmpty:a({a:1,abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1}),$removeEmptyBlock:a({p:1,div:1}),$tableContent:a({caption:1,
+col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1,table:1}),$notTransContent:a({pre:1,script:1,style:1,textarea:1}),html:C,head:x,style:v,script:v,body:k,base:{},link:{},meta:{},title:v,col:{},tr:a({td:1,th:1}),img:{},embed:{},colgroup:a({thead:1,col:1,tbody:1,tr:1,tfoot:1}),noscript:k,td:k,br:{},th:k,center:k,kbd:g,button:b(r,h),basefont:{},h5:g,h4:g,samp:g,h6:g,ol:m,h1:g,h3:g,option:v,h2:g,form:b(c,f,h,r),select:a({optgroup:1,option:1}),font:g,ins:g,menu:m,abbr:g,label:g,table:a({thead:1,
+col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1}),code:g,tfoot:u,cite:g,li:k,input:{},iframe:k,strong:g,textarea:v,noframes:k,big:g,small:g,span:a({"#":1,br:1,b:1,strong:1,u:1,i:1,em:1,sub:1,sup:1,strike:1,span:1}),hr:g,dt:g,sub:g,optgroup:a({option:1}),param:{},bdo:g,"var":g,div:k,object:w,sup:g,dd:k,strike:g,area:{},dir:m,map:b(a({area:1,form:1,p:1}),c,l,h),applet:w,dl:a({dt:1,dd:1}),del:g,isindex:{},fieldset:b(a({legend:1}),p),thead:u,ul:m,acronym:g,b:g,a:b(a({a:1}),d),blockquote:b(a({td:1,tr:1,
+tbody:1,li:1}),k),caption:g,i:g,u:g,tbody:u,s:g,address:b(f,r),tt:g,legend:g,q:g,pre:b(s,e),p:b(a({a:1}),g),em:g,dfn:g})}(),J=E&&9>m.version?{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder"}:{tabindex:"tabIndex",readonly:"readOnly"},K=n.listToMap("-webkit-box -moz-box block list-item table table-row-group table-header-group table-footer-group table-row table-column-group table-column table-cell table-caption".split(" ")),
+k=B.domUtils={NODE_ELEMENT:1,NODE_DOCUMENT:9,NODE_TEXT:3,NODE_COMMENT:8,NODE_DOCUMENT_FRAGMENT:11,POSITION_IDENTICAL:0,POSITION_DISCONNECTED:1,POSITION_FOLLOWING:2,POSITION_PRECEDING:4,POSITION_IS_CONTAINED:8,POSITION_CONTAINS:16,fillChar:E&&"6"==m.version?"\ufeff":"\u200b",keys:{8:1,46:1,16:1,17:1,18:1,37:1,38:1,39:1,40:1,13:1},breakParent:function(a,b){var c,d=a,e=a,f,h;do{d=d.parentNode;f?(c=d.cloneNode(!1),c.appendChild(f),f=c,c=d.cloneNode(!1),c.appendChild(h),h=c):(f=d.cloneNode(!1),h=f.cloneNode(!1));
+for(;c=e.previousSibling;)f.insertBefore(c,f.firstChild);for(;c=e.nextSibling;)h.appendChild(c);e=d}while(b!==d);c=b.parentNode;c.insertBefore(f,b);c.insertBefore(h,b);c.insertBefore(a,h);k.remove(b);return a},trimWhiteTextNode:function(a){function b(b){for(var d;(d=a[b])&&3==d.nodeType&&k.isWhitespace(d);)a.removeChild(d)}b("firstChild");b("lastChild")},getPosition:function(a,b){if(a===b)return 0;var c,d=[a],e=[b];for(c=a;c=c.parentNode;){if(c===b)return 10;d.push(c)}for(c=b;c=c.parentNode;){if(c===
+a)return 20;e.push(c)}d.reverse();e.reverse();if(d[0]!==e[0])return 1;for(c=-1;c++,d[c]===e[c];);a=d[c];for(b=e[c];a=a.nextSibling;)if(a===b)return 4;return 2},getNodeIndex:function(a,b){for(var c=a,d=0;c=c.previousSibling;)b&&3==c.nodeType?c.nodeType!=c.nextSibling.nodeType&&d++:d++;return d},inDoc:function(a,b){return 10==k.getPosition(a,b)},findParent:function(a,b,c){if(a&&!k.isBody(a))for(a=c?a:a.parentNode;a;){if(!b||b(a)||k.isBody(a))return b&&!b(a)&&k.isBody(a)?null:a;a=a.parentNode}return null},
+findParentByTagName:function(a,b,c,d){b=n.listToMap(n.isArray(b)?b:[b]);return k.findParent(a,function(a){return b[a.tagName]&&!(d&&d(a))},c)},findParents:function(a,b,c,d){for(b=b&&(c&&c(a)||!c)?[a]:[];a=k.findParent(a,c);)b.push(a);return d?b:b.reverse()},insertAfter:function(a,b){return a.parentNode.insertBefore(b,a.nextSibling)},remove:function(a,b){var c=a.parentNode,d;if(c){if(b&&a.hasChildNodes())for(;d=a.firstChild;)c.insertBefore(d,a);c.removeChild(a)}return a},getNextDomNode:function(a,
+b,c,d){return H(a,"firstChild","nextSibling",b,c,d)},getPreDomNode:function(a,b,c,d){return H(a,"lastChild","previousSibling",b,c,d)},isBookmarkNode:function(a){return 1==a.nodeType&&a.id&&/^_baidu_bookmark_/i.test(a.id)},getWindow:function(a){a=a.ownerDocument||a;return a.defaultView||a.parentWindow},getCommonAncestor:function(a,b){if(a===b)return a;for(var c=[a],d=[b],e=a,f=-1;e=e.parentNode;){if(e===b)return e;c.push(e)}for(e=b;e=e.parentNode;){if(e===a)return e;d.push(e)}c.reverse();for(d.reverse();f++,
+c[f]===d[f];);return 0==f?null:c[f-1]},clearEmptySibling:function(a,b,c){function d(a,b){for(var d;a&&!k.isBookmarkNode(a)&&(k.isEmptyInlineElement(a)||!RegExp("[^\t\n\r"+k.fillChar+"]").test(a.nodeValue));)d=a[b],k.remove(a),a=d}!b&&d(a.nextSibling,"nextSibling");!c&&d(a.previousSibling,"previousSibling")},split:function(a,b){var c=a.ownerDocument;if(m.ie&&b==a.nodeValue.length){var d=c.createTextNode("");return k.insertAfter(a,d)}d=a.splitText(b);m.ie8&&(c=c.createTextNode(""),k.insertAfter(d,c),
+k.remove(c));return d},isWhitespace:function(a){return!RegExp("[^ \t\n\r"+k.fillChar+"]").test(a.nodeValue)},getXY:function(a){for(var b=0,c=0;a.offsetParent;)c+=a.offsetTop,b+=a.offsetLeft,a=a.offsetParent;return{x:b,y:c}},isEmptyInlineElement:function(a){if(1!=a.nodeType||!q.$removeEmpty[a.tagName])return 0;for(a=a.firstChild;a;){if(k.isBookmarkNode(a)||1==a.nodeType&&!k.isEmptyInlineElement(a)||3==a.nodeType&&!k.isWhitespace(a))return 0;a=a.nextSibling}return 1},isBlockElm:function(a){return 1==
+a.nodeType&&(q.$block[a.tagName]||K[k.getComputedStyle(a,"display")])&&!q.$nonChild[a.tagName]},getElementsByTagName:function(a,b,c){if(c&&n.isString(c)){var d=c;c=function(a){var b=!1;g.each(n.trim(d).replace(/[ ]{2,}/g," ").split(" "),function(l,d){if(g(a).hasClass(d))return b=!0,!1});return b}}b=n.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var e=[],f=0,h;h=b[f++];){h=a.getElementsByTagName(h);for(var l=0,s;s=h[l++];)c&&!c(s)||e.push(s)}return e},unSelectable:E&&m.ie9below||m.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=0,c;c=a.all[b++];)switch(c.tagName.toLowerCase()){case "iframe":case "textarea":case "input":case "select":break;default:c.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=n.isArray(b)?b:n.trim(b).replace(/[ ]{2,}/g,
+" ").split(" ");for(var c=0,d;d=b[c++];){d=J[d]||d;switch(d){case "className":a[d]="";break;case "style":a.style.cssText="",!m.ie&&a.removeAttributeNode(a.getAttributeNode("style"))}a.removeAttribute(d)}},createElement:function(a,b,c){return k.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(J[c]||c,d)}}return a},getComputedStyle:function(a,b){return n.transUnitToPx(n.fixColor(b,g(a).css(b)))},preventDefault:function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},removeStyle:function(a,b){m.ie?("color"==b&&(b="(^|;)"+b),a.style.cssText=a.style.cssText.replace(RegExp(b+"[^:]*:[^;]+;?","ig"),"")):a.style.removeProperty?a.style.removeProperty(b):a.style.removeAttribute(n.cssStyleToDomStyle(b));a.style.cssText||k.removeAttributes(a,["style"])},getStyle:function(a,
+b){var c=a.style[n.cssStyleToDomStyle(b)];return n.fixColor(b,c)},setStyle:function(a,b,c){a.style[n.cssStyleToDomStyle(b)]=c;n.trim(a.style.cssText)||this.removeAttributes(a,"style")},removeDirtyAttr:function(a){for(var b=0,c,d=a.getElementsByTagName("*");c=d[b++];)c.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==k.getChildCount(a,
+function(a){return!k.isBr(a)&&!k.isBookmarkNode(a)&&!k.isWhitespace(a)})},isBr:function(a){return 1==a.nodeType&&"BR"==a.tagName},isFillChar:function(a,b){return 3==a.nodeType&&!a.nodeValue.replace(RegExp((b?"^":"")+k.fillChar),"").length},isEmptyBlock:function(a,b){if(1!=a.nodeType)return 0;b=b||RegExp("[ \t\r\n"+k.fillChar+"]","g");if(0<a[m.ie?"innerText":"textContent"].replace(b,"").length)return 0;for(var c in q.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1},isCustomeNode:function(a){return 1==
+a.nodeType&&a.getAttribute("_ue_custom_node_")},fillNode:function(a,b){var c=m.ie?a.createTextNode(k.fillChar):a.createElement("br");b.innerHTML="";b.appendChild(c)},isBoundaryNode:function(a,b){for(var c;!k.isBody(a);)if(c=a,a=a.parentNode,c!==a[b])return!1;return!0},isFillChar:function(a,b){return 3==a.nodeType&&!a.nodeValue.replace(RegExp((b?"^":"")+k.fillChar),"").length},isBody:function(a){return g(a).hasClass("edui-body-container")}},F=RegExp(k.fillChar,"g");(function(){function a(a,b,d,c){1==
+b.nodeType&&(q.$empty[b.tagName]||q.$nonChild[b.tagName])&&(d=k.getNodeIndex(b)+(a?0:1),b=b.parentNode);a?(c.startContainer=b,c.startOffset=d,c.endContainer||c.collapse(!0)):(c.endContainer=b,c.endOffset=d,c.startContainer||c.collapse(!1));c.collapsed=c.startContainer&&c.endContainer&&c.startContainer===c.endContainer&&c.startOffset==c.endOffset;return c}function b(a,b){try{if(f&&k.inDoc(f,a))if(f.nodeValue.replace(F,"").length)f.nodeValue=f.nodeValue.replace(F,"");else{var d=f.parentNode;for(k.remove(f);d&&
+k.isEmptyInlineElement(d)&&(m.safari?!(k.getPosition(d,b)&k.POSITION_CONTAINS):!d.contains(b));)f=d.parentNode,k.remove(d),d=f}}catch(c){}}function c(a,b){var d;for(a=a[b];a&&k.isFillChar(a);)d=a[b],k.remove(a),a=d}var d=0,e=k.fillChar,f,h=B.Range=function(a,b){this.startContainer=this.startOffset=this.endContainer=this.endOffset=null;this.document=a;this.collapsed=!0;this.body=b};h.prototype={deleteContents:function(){var a;if(!this.collapsed){a=this.startContainer;var b=this.endContainer,d=this.startOffset,
+c=this.endOffset,h=this.document,e=h.createDocumentFragment(),f,g;1==a.nodeType&&(a=a.childNodes[d]||(f=a.appendChild(h.createTextNode(""))));1==b.nodeType&&(b=b.childNodes[c]||(g=b.appendChild(h.createTextNode(""))));if(a===b&&3==a.nodeType)e.appendChild(h.createTextNode(a.substringData(d,c-d))),a.deleteData(d,c-d),this.collapse(!0);else{for(var t,n,x=e,q=k.findParents(a,!0),C=k.findParents(b,!0),z=0;q[z]==C[z];)z++;for(var A=z,D;D=q[A];A++){t=D.nextSibling;D==a?f||(3==this.startContainer.nodeType?
+(x.appendChild(h.createTextNode(a.nodeValue.slice(d))),a.deleteData(d,a.nodeValue.length-d)):x.appendChild(a)):(n=D.cloneNode(!1),x.appendChild(n));for(;t&&t!==b&&t!==C[A];)D=t.nextSibling,x.appendChild(t),t=D;x=n}x=e;q[z]||(x.appendChild(q[z-1].cloneNode(!1)),x=x.firstChild);for(A=z;d=C[A];A++){t=d.previousSibling;d==b?g||3!=this.endContainer.nodeType||(x.appendChild(h.createTextNode(b.substringData(0,c))),b.deleteData(0,c)):(n=d.cloneNode(!1),x.appendChild(n));if(A!=z||!q[z])for(;t&&t!==a;)d=t.previousSibling,
+x.insertBefore(t,x.firstChild),t=d;x=n}this.setStartBefore(C[z]?q[z]?C[z]:q[z-1]:C[z-1]).collapse(!0);f&&k.remove(f);g&&k.remove(g)}}m.webkit&&(a=this.startContainer,3!=a.nodeType||a.nodeValue.length||(this.setStartBefore(a).collapse(!0),k.remove(a)));return this},inFillChar:function(){var a=this.startContainer;return this.collapsed&&3==a.nodeType&&a.nodeValue.replace(RegExp("^"+k.fillChar),"").length+1==a.nodeValue.length?!0:!1},setStart:function(b,d){return a(!0,b,d,this)},setEnd:function(b,d){return a(!1,
+b,d,this)},setStartAfter:function(a){return this.setStart(a.parentNode,k.getNodeIndex(a)+1)},setStartBefore:function(a){return this.setStart(a.parentNode,k.getNodeIndex(a))},setEndAfter:function(a){return this.setEnd(a.parentNode,k.getNodeIndex(a)+1)},setEndBefore:function(a){return this.setEnd(a.parentNode,k.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(){return(new h(this.document)).setStart(this.startContainer,this.startOffset).setEnd(this.endContainer,this.endOffset)},collapse:function(a){a?(this.endContainer=this.startContainer,this.endOffset=this.startOffset):(this.startContainer=
+this.endContainer,this.startOffset=this.endOffset);this.collapsed=!0;return this},shrinkBoundary:function(a){function b(a){return 1==a.nodeType&&!k.isBookmarkNode(a)&&!q.$empty[a.tagName]&&!q.$nonChild[a.tagName]}for(var d,c=this.collapsed;1==this.startContainer.nodeType&&(d=this.startContainer.childNodes[this.startOffset])&&b(d);)this.setStart(d,0);if(c)return this.collapse(!0);if(!a)for(;1==this.endContainer.nodeType&&0<this.endOffset&&(d=this.endContainer.childNodes[this.endOffset-1])&&b(d);)this.setEnd(d,
+d.childNodes.length);return this},trimBoundary:function(a){this.txtToElmBoundary();var b=this.startContainer,d=this.startOffset,c=this.collapsed,h=this.endContainer;if(3==b.nodeType){if(0==d)this.setStartBefore(b);else if(d>=b.nodeValue.length)this.setStartAfter(b);else{var e=k.split(b,d);b===h?this.setEnd(e,this.endOffset-d):b.parentNode===h&&(this.endOffset+=1);this.setStartBefore(e)}if(c)return this.collapse(!0)}a||(d=this.endOffset,h=this.endContainer,3==h.nodeType&&(0==d?this.setEndBefore(h):
+(d<h.nodeValue.length&&k.split(h,d),this.setEndAfter(h))));return this},txtToElmBoundary:function(a){function b(a,d){var l=a[d+"Container"],c=a[d+"Offset"];if(3==l.nodeType)if(!c)a["set"+d.replace(/(\w)/,function(a){return a.toUpperCase()})+"Before"](l);else if(c>=l.nodeValue.length)a["set"+d.replace(/(\w)/,function(a){return a.toUpperCase()})+"After"](l)}if(a||!this.collapsed)b(this,"start"),b(this,"end");return this},insertNode:function(a){var b=a,d=1;11==a.nodeType&&(b=a.firstChild,d=a.childNodes.length);
+this.trimBoundary(!0);var c=this.startContainer,h=c.childNodes[this.startOffset];h?c.insertBefore(a,h):c.appendChild(a);b.parentNode===this.endContainer&&(this.endOffset+=d);return this.setStartBefore(b)},setCursor:function(a,b){return this.collapse(!a).select(b)},createBookmark:function(a,b){var c,h=this.document.createElement("span");h.style.cssText="display:none;line-height:0px;";h.appendChild(this.document.createTextNode("\u200d"));h.id="_baidu_bookmark_start_"+(b?"":d++);this.collapsed||(c=h.cloneNode(!0),
+c.id="_baidu_bookmark_end_"+(b?"":d++));this.insertNode(h);c&&this.collapse().insertNode(c).setEndBefore(c);this.setStartAfter(h);return{start:a?h.id:h,end:c?a?c.id:c:null,id:a}},moveToBookmark:function(a){var b=a.id?this.document.getElementById(a.start):a.start;a=a.end&&a.id?this.document.getElementById(a.end):a.end;this.setStartBefore(b);k.remove(b);a?(this.setEndBefore(a),k.remove(a)):this.collapse(!0);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!k.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(;!k.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},getClosedNode:function(){var a;if(!this.collapsed){var b=this.cloneRange().adjustmentBoundary().shrinkBoundary();
+b.collapsed||1!=b.startContainer.nodeType||b.startContainer!==b.endContainer||1!=b.endOffset-b.startOffset||(b=b.startContainer.childNodes[b.startOffset])&&1==b.nodeType&&(q.$empty[b.tagName]||q.$nonChild[b.tagName])&&(a=b)}return a},select:m.ie?function(a,d){var h;this.collapsed||this.shrinkBoundary();var g=this.getClosedNode();if(g&&!d){try{h=this.document.body.createControlRange(),h.addElement(g),h.select()}catch(y){}return this}var g=this.createBookmark(),u=g.start;h=this.document.body.createTextRange();
+h.moveToElementText(u);h.moveStart("character",1);if(!this.collapsed){var v=this.document.body.createTextRange(),u=g.end;v.moveToElementText(u);h.setEndPoint("EndToEnd",v)}else if(!a&&3!=this.startContainer.nodeType){var v=this.document.createTextNode(e),w=this.document.createElement("span");w.appendChild(this.document.createTextNode(e));u.parentNode.insertBefore(w,u);u.parentNode.insertBefore(v,u);b(this.document,v);f=v;c(w,"previousSibling");c(u,"nextSibling");h.moveStart("character",-1);h.collapse(!0)}this.moveToBookmark(g);
+w&&k.remove(w);try{h.select()}catch(t){}return this}:function(a){function d(a){function b(d,c,l){3==d.nodeType&&d.nodeValue.length<c&&(a[l+"Offset"]=d.nodeValue.length)}b(a.startContainer,a.startOffset,"start");b(a.endContainer,a.endOffset,"end")}var h=k.getWindow(this.document),g=h.getSelection();m.gecko?this.body.focus():h.focus();if(g){g.removeAllRanges();this.collapsed&&!a&&(a=h=this.startContainer,1==h.nodeType&&(a=h.childNodes[this.startOffset]),3==h.nodeType&&this.startOffset||(a?a.previousSibling&&
+3==a.previousSibling.nodeType:h.lastChild&&3==h.lastChild.nodeType)||(a=this.document.createTextNode(e),this.insertNode(a),b(this.document,a),c(a,"previousSibling"),c(a,"nextSibling"),f=a,this.setStart(a,m.webkit?1:0).collapse(!0)));h=this.document.createRange();if(this.collapsed&&m.opera&&1==this.startContainer.nodeType)if(a=this.startContainer.childNodes[this.startOffset]){for(;a&&k.isBlockElm(a);)if(1==a.nodeType&&a.childNodes[0])a=a.childNodes[0];else break;a&&this.setStartBefore(a).collapse(!0)}else(a=
+this.startContainer.lastChild)&&k.isBr(a)&&this.setStartBefore(a).collapse(!0);d(this);h.setStart(this.startContainer,this.startOffset);h.setEnd(this.endContainer,this.endOffset);g.addRange(h)}return this},createAddress:function(a,b){function d(a){for(var c=a?h.startContainer:h.endContainer,l=k.findParents(c,!0,function(a){return!k.isBody(a)}),e=[],f=0,p;p=l[f++];)e.push(k.getNodeIndex(p,b));l=0;if(b)if(3==c.nodeType){for(c=c.previousSibling;c&&3==c.nodeType;)l+=c.nodeValue.replace(F,"").length,c=
+c.previousSibling;l+=a?h.startOffset:h.endOffset}else if(c=c.childNodes[a?h.startOffset:h.endOffset])l=k.getNodeIndex(c,b);else for(c=a?h.startContainer:h.endContainer,a=c.firstChild;a;)if(k.isFillChar(a))a=a.nextSibling;else if(l++,3==a.nodeType)for(;a&&3==a.nodeType;)a=a.nextSibling;else a=a.nextSibling;else l=a?k.isFillChar(c)?0:h.startOffset:h.endOffset;0>l&&(l=0);e.push(l);return e}var c={},h=this;c.startAddress=d(!0);a||(c.endAddress=h.collapsed?[].concat(c.startAddress):d());return c},moveToAddress:function(a,
+b){function d(a,b){for(var l=c.body,h,e,f=0,s,p=a.length;f<p;f++)if(s=a[f],h=l,l=l.childNodes[s],!l){e=s;break}b?l?c.setStartBefore(l):c.setStart(h,e):l?c.setEndBefore(l):c.setEnd(h,e)}var c=this;d(a.startAddress,!0);!b&&a.endAddress&&d(a.endAddress);return c},equals:function(a){for(var b in this)if(this.hasOwnProperty(b)&&this[b]!==a[b])return!1;return!0},scrollIntoView:function(){var a=g('<span style="padding:0;margin:0;display:block;border:0">&nbsp;</span>');this.cloneRange().insertNode(a.get(0));
+var b=g(window).scrollTop(),d=g(window).height(),c=a.offset().top;if(c<b-d||c>b+d)c>b+d?window.scrollTo(0,c-d+a.height()):window.scrollTo(0,b-c);a.remove()},getOffset:function(){var a=this.createBookmark(),b=g(a.start).css("display","inline-block").offset();this.moveToBookmark(a);return b}}})();(function(){function a(a,b){var c=k.getNodeIndex;a=a.duplicate();a.collapse(b);var h=a.parentElement();if(!h.hasChildNodes())return{container:h,offset:0};for(var l=h.children,s,p=a.duplicate(),g=0,y=l.length-
+1,u=-1;g<=y;){u=Math.floor((g+y)/2);s=l[u];p.moveToElementText(s);var v=p.compareEndPoints("StartToStart",a);if(0<v)y=u-1;else if(0>v)g=u+1;else return{container:h,offset:c(s)}}if(-1==u){p.moveToElementText(h);p.setEndPoint("StartToStart",a);p=p.text.replace(/(\r\n|\r)/g,"\n").length;l=h.childNodes;if(!p)return s=l[l.length-1],{container:s,offset:s.nodeValue.length};for(c=l.length;0<p;)p-=l[--c].nodeValue.length;return{container:l[c],offset:-p}}p.collapse(0<v);p.setEndPoint(0<v?"StartToStart":"EndToStart",
+a);p=p.text.replace(/(\r\n|\r)/g,"\n").length;if(!p)return q.$empty[s.tagName]||q.$nonChild[s.tagName]?{container:h,offset:c(s)+(0<v?0:1)}:{container:s,offset:0<v?0:s.childNodes.length};for(;0<p;)try{l=s,s=s[0<v?"previousSibling":"nextSibling"],p-=s.nodeValue.length}catch(w){return{container:h,offset:c(l)}}return{container:s,offset:0<v?-p:s.nodeValue.length+p}}function b(b,c){if(b.item)c.selectNode(b.item(0));else{var f=a(b,!0);c.setStart(f.container,f.offset);0!=b.compareEndPoints("StartToEnd",b)&&
+(f=a(b,!1),c.setEnd(f.container,f.offset))}return c}function c(a,b){var c;try{c=a.getNative(b).createRange()}catch(h){return null}var l=c.item?c.item(0):c.parentElement();return(l.ownerDocument||l)===a.document?c:null}(B.Selection=function(a,b){var f=this;f.document=a;f.body=b;if(m.ie9below)g(b).on("beforedeactivate",function(){f._bakIERange=f.getIERange()}).on("activate",function(){try{var a=c(f);a&&f.rangeInBody(a)||!f._bakIERange||f._bakIERange.select()}catch(b){}f._bakIERange=null})}).prototype=
+{hasNativeRange:function(){var a;if(!m.ie||m.ie9above){a=this.getNative();if(!a.rangeCount)return!1;a=a.getRangeAt(0)}else a=c(this);return this.rangeInBody(a)},getNative:function(a){var b=this.document;try{return b?m.ie9below||a?b.selection:k.getWindow(b).getSelection():null}catch(c){return null}},getIERange:function(a){var b=c(this,a);return b&&this.rangeInBody(b,a)||!this._bakIERange?b:this._bakIERange},rangeInBody:function(a,b){var c=m.ie9below||b?a.item?a.item():a.parentElement():a.startContainer;
+return c===this.body||k.inDoc(c,this.body)},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?k.findParents(a,!0,null,!0):[]},clear:function(){this._cachedStartElementPath=this._cachedRange=this._cachedStartElement=null},isFocus:function(){return this.hasNativeRange()},
+getRange:function(){function a(b){for(var d=c.body.firstChild,l=b.collapsed;d&&d.firstChild;)b.setStart(d,0),d=d.firstChild;b.startContainer||b.setStart(c.body,0);l&&b.collapse(!0)}var c=this;if(null!=c._cachedRange)return this._cachedRange;var f=new B.Range(c.document,c.body);if(m.ie9below){var h=c.getIERange();if(h&&this.rangeInBody(h))try{b(h,f)}catch(l){a(f)}else a(f)}else{var s=c.getNative();if(s&&s.rangeCount&&c.rangeInBody(s.getRangeAt(0)))h=s.getRangeAt(0),s=s.getRangeAt(s.rangeCount-1),f.setStart(h.startContainer,
+h.startOffset).setEnd(s.endContainer,s.endOffset),f.collapsed&&k.isBody(f.startContainer)&&!f.startOffset&&a(f);else{if(this._bakRange&&(this._bakRange.startContainer===this.body||k.inDoc(this._bakRange.startContainer,this.body)))return this._bakRange;a(f)}}return this._bakRange=f},getStart:function(){if(this._cachedStartElement)return this._cachedStartElement;var a=m.ie9below?this.getIERange():this.getRange(),b,c;if(m.ie9below){if(!a)return this.document.body.firstChild;if(a.item)return a.item(0);
+b=a.duplicate();0<b.text.length&&b.moveStart("character",1);b.collapse(1);b=b.parentElement();for(c=a=a.parentElement();a=a.parentNode;)if(a==b){b=c;break}}else if(b=a.startContainer,1==b.nodeType&&b.hasChildNodes()&&(b=b.childNodes[Math.min(b.childNodes.length-1,a.startOffset)]),3==b.nodeType)return b.parentNode;return b},getText:function(){var a;return this.isFocus()&&(a=this.getNative())?(a=m.ie9below?a.createRange():a.getRangeAt(0),m.ie9below?a.text:a.toString()):""}}})();(function(){function a(a,
+b){var c;if(b.textarea)if(n.isString(b.textarea))for(var d=0,e,f=k.getElementsByTagName(a,"textarea");e=f[d++];){if(e.id=="umeditor_textarea_"+b.options.textarea){c=e;break}}else c=b.textarea;c||(a.appendChild(c=k.createElement(document,"textarea",{name:b.options.textarea,id:"umeditor_textarea_"+b.options.textarea,style:"display:none"})),b.textarea=c);c.value=b.hasContents()?b.options.allHtmlEnabled?b.getAllHtml():b.getContent(null,null,!0):""}function b(a){for(var b in UM.plugins)-1==a.options.excludePlugins.indexOf(b)&&
+(UM.plugins[b].call(a),a.plugins[b]=1);a.langIsReady=!0;a.fireEvent("langReady")}function c(a){for(var b in a)return b}var d=0,e,f=UM.Editor=function(a){var l=this;l.uid=d++;I.call(l);l.commands={};l.options=n.extend(n.clone(a||{}),UMEDITOR_CONFIG,!0);l.shortcutkeys={};l.inputRules=[];l.outputRules=[];l.setOpt({isShow:!0,initialContent:"",initialStyle:"",autoClearinitialContent:!1,textarea:"editorValue",focus:!1,focusInEnd:!0,autoClearEmptyNode:!0,fullscreen:!1,readonly:!1,zIndex:999,enterTag:"p",
+lang:"zh-cn",langPath:l.options.UMEDITOR_HOME_URL+"lang/",theme:"default",themePath:l.options.UMEDITOR_HOME_URL+"themes/",allHtmlEnabled:!1,autoSyncData:!0,autoHeightEnabled:!0,excludePlugins:""});l.plugins={};n.isEmptyObject(UM.I18N)?n.loadFile(document,{src:l.options.langPath+l.options.lang+"/"+l.options.lang+".js",tag:"script",type:"text/javascript",defer:"defer"},function(){b(l)}):(l.options.lang=c(UM.I18N),b(l))};f.prototype={ready:function(a){a&&(this.isReady?a.apply(this):this.addListener("ready",
+a))},setOpt:function(a,b){var c={};n.isString(a)?c[a]=b:c=a;n.extend(this.options,c,!0)},getOpt:function(a){return this.options[a]||""},destroy:function(){this.fireEvent("destroy");var a=this.container.parentNode;a===document.body&&(a=this.container);var b=this.textarea;b?b.style.display="":(b=document.createElement("textarea"),a.parentNode.insertBefore(b,a));b.style.width=this.body.offsetWidth+"px";b.style.height=this.body.offsetHeight+"px";b.value=this.getContent();b.id=this.key;a.contains(b)&&
+g(b).insertBefore(a);a.innerHTML="";k.remove(a);UM.clearCache(this.id);for(var c in this)this.hasOwnProperty(c)&&delete this[c]},initialCont:function(a){if(a){a.getAttribute("name")&&(this.options.textarea=a.getAttribute("name"));if(a&&/script|textarea/ig.test(a.tagName)){var b=document.createElement("div");a.parentNode.insertBefore(b,a);this.options.initialContent=UM.htmlparser(a.value||a.innerHTML||this.options.initialContent).toHtml();a.className&&(b.className=a.className);a.style.cssText&&(b.style.cssText=
+a.style.cssText);/textarea/i.test(a.tagName)?(this.textarea=a,this.textarea.style.display="none"):(a.parentNode.removeChild(a),a.id&&(b.id=a.id));a=b;a.innerHTML=""}return a}return null},render:function(a){var b=this.options,c=function(b){return parseInt(g(a).css(b))};n.isString(a)&&(a=document.getElementById(a));a&&(this.id=a.getAttribute("id"),UM.setEditor(this),n.cssRule("edui-style-body",this.options.initialStyle,document),a=this.initialCont(a),a.className+=" edui-body-container",b.minFrameWidth=
+b.initialFrameWidth?b.initialFrameWidth:b.initialFrameWidth=g(a).width()||UM.defaultWidth,b.initialFrameHeight?b.minFrameHeight=b.initialFrameHeight:b.initialFrameHeight=b.minFrameHeight=g(a).height()||UM.defaultHeight,a.style.width=/%$/.test(b.initialFrameWidth)?"100%":b.initialFrameWidth-c("padding-left")-c("padding-right")+"px",c=/%$/.test(b.initialFrameHeight)?"100%":b.initialFrameHeight-c("padding-top")-c("padding-bottom"),this.options.autoHeightEnabled?(a.style.minHeight=c+"px",a.style.height=
+"",m.ie&&6>=m.version&&(a.style.height=c,a.style.setExpression("height","this.scrollHeight <= "+c+' ? "'+c+'px" : "auto"'))):g(a).height(c),a.style.zIndex=b.zIndex,this._setup(a))},_setup:function(b){var c=this,d=c.options;b.contentEditable=!0;document.body.spellcheck=!1;c.document=document;c.window=document.defaultView||document.parentWindow;c.body=b;c.$body=g(b);c.selection=new B.Selection(document,c.body);c._isEnabled=!1;var e;m.gecko&&(e=this.selection.getNative())&&e.removeAllRanges();this._initEvents();
+for(var f=b.parentNode;f&&!k.isBody(f);f=f.parentNode)if("FORM"==f.tagName){c.form=f;if(c.options.autoSyncData)g(b).on("blur",function(){a(f,c)});else g(f).on("submit",function(){a(this,c)});break}if(d.initialContent)if(d.autoClearinitialContent){var y=c.execCommand;c.execCommand=function(){c.fireEvent("firstBeforeExecCommand");return y.apply(c,arguments)};this._setDefaultContent(d.initialContent)}else this.setContent(d.initialContent,!1,!0);k.isEmptyNode(c.body)&&(c.body.innerHTML="<p>"+(m.ie?"":
+"<br/>")+"</p>");d.focus&&setTimeout(function(){c.focus(c.options.focusInEnd);!c.options.autoClearinitialContent&&c._selectionChange()},0);c.container||(c.container=b.parentNode);c._bindshortcutKeys();c.isReady=1;c.fireEvent("ready");d.onready&&d.onready.call(c);if(!m.ie||m.ie9above)g(c.body).on("blur focus",function(a){var b=c.selection.getNative();if("blur"==a.type)0<b.rangeCount&&(c._bakRange=b.getRangeAt(0));else{try{c._bakRange&&b.addRange(c._bakRange)}catch(d){}c._bakRange=null}});!d.isShow&&
+c.setHide();d.readonly&&c.setDisabled()},sync:function(b){(b=b?document.getElementById(b):k.findParent(this.body.parentNode,function(a){return"FORM"==a.tagName},!0))&&a(b,this)},setHeight:function(a,b){!b&&(this.options.initialFrameHeight=a);this.options.autoHeightEnabled?(g(this.body).css({"min-height":a+"px"}),m.ie&&6>=m.version&&this.container&&(this.container.style.height=a,this.container.style.setExpression("height","this.scrollHeight <= "+a+' ? "'+a+'px" : "auto"'))):g(this.body).height(a);
+this.fireEvent("resize")},setWidth:function(a){this.$container&&this.$container.width(a);g(this.body).width(a-1*g(this.body).css("padding-left").replace("px","")-1*g(this.body).css("padding-right").replace("px",""));this.fireEvent("resize")},addshortcutkey:function(a,b){var c={};b?c[a]=b:c=a;n.extend(this.shortcutkeys,c)},_bindshortcutKeys:function(){var a=this,b=this.shortcutkeys;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which,f;for(f in b)for(var u=b[f].split(","),g=0,w;w=u[g++];){w=
+w.split(":");var t=w[0];w=w[1];if(/^(ctrl)(\+shift)?\+(\d+)$/.test(t.toLowerCase())||/^(\d+)$/.test(t))if("ctrl"==RegExp.$1&&(d.ctrlKey||d.metaKey)&&(""!=RegExp.$2?d[RegExp.$2.slice(1)+"Key"]:1)&&e==RegExp.$3||e==RegExp.$1)-1!=a.queryCommandState(f,w)&&a.execCommand(f,w),k.preventDefault(d)}})},getContent:function(a,b,c,d,e){a&&n.isFunction(a)&&(b=a);if(b?!b():!this.hasContents())return"";this.fireEvent("beforegetcontent");a=UM.htmlparser(this.body.innerHTML,d);this.filterOutputRule(a);this.fireEvent("aftergetcontent",
+a);return a.toHtml(e)},getAllHtml:function(){var a=[];this.fireEvent("getAllHtml",a);if(m.ie&&8<m.version){var b="";n.each(this.document.styleSheets,function(a){b+=a.href?'<link rel="stylesheet" type="text/css" href="'+a.href+'" />':"<style>"+a.cssText+"</style>"});n.each(this.document.getElementsByTagName("script"),function(a){b+=a.outerHTML})}return"<html><head>"+(this.options.charset?'<meta http-equiv="Content-Type" content="text/html; charset='+this.options.charset+'"/>':"")+(b||this.document.getElementsByTagName("head")[0].innerHTML)+
+a.join("\n")+"</head><body "+(E&&9>m.version?'class="view"':"")+">"+this.getContent(null,null,!0)+"</body></html>"},getPlainTxt:function(){var a=RegExp(k.fillChar,"g"),b=this.body.innerHTML.replace(/[\n\r]/g,""),b=b.replace(/<(p|div)[^>]*>(<br\/?>|&nbsp;)<\/\1>/gi,"\n").replace(/<br\/?>/gi,"\n").replace(/<[^>/]+>/g,"").replace(/(\n)?<\/([^>]+)>/g,function(a,b,c){return q.$block[c]?"\n":b?b:""});return b.replace(a,"").replace(/\u00a0/g," ").replace(/&nbsp;/g," ")},getContentTxt:function(){return this.body[m.ie?
+"innerText":"textContent"].replace(RegExp(k.fillChar,"g"),"").replace(/\u00a0/g," ")},setContent:function(b,c,d){this.fireEvent("beforesetcontent",b);b=UM.htmlparser(b);this.filterInputRule(b);b=b.toHtml();this.body.innerHTML=(c?this.body.innerHTML:"")+b;if("p"==this.options.enterTag)if(c=this.body.firstChild,!c||1==c.nodeType&&(q.$cdata[c.tagName]||"DIV"==c.tagName&&c.getAttribute("cdata_tag")||k.isCustomeNode(c))&&c===this.body.lastChild)this.body.innerHTML="<p>"+(m.ie?"&nbsp;":"<br/>")+"</p>"+
+this.body.innerHTML;else for(var e=this.document.createElement("p");c;){for(;c&&(3==c.nodeType||1==c.nodeType&&q.p[c.tagName]&&!q.$cdata[c.tagName]);)b=c.nextSibling,e.appendChild(c),c=b;if(e.firstChild)if(c)c.parentNode.insertBefore(e,c),e=this.document.createElement("p");else{this.body.appendChild(e);break}c=c.nextSibling}this.fireEvent("aftersetcontent");this.fireEvent("contentchange");!d&&this._selectionChange();this._bakRange=this._bakIERange=this._bakNativeRange=null;var f;m.gecko&&(f=this.selection.getNative())&&
+f.removeAllRanges();this.options.autoSyncData&&this.form&&a(this.form,this)},focus:function(a){try{var b=this.selection.getRange();a?b.setStartAtLast(this.body.lastChild).setCursor(!1,!0):b.select(!0);this.fireEvent("focus")}catch(c){}},blur:function(){var a=this.selection.getNative();a.empty?a.empty():a.removeAllRanges();this.fireEvent("blur")},isFocus:function(){return!0===this.fireEvent("isfocus")?!0:this.selection.isFocus()},_initEvents:function(){var a=this,b=function(){a._proxyDomEvent.apply(a,
+arguments)};g(a.body).on("click contextmenu mousedown keydown keyup keypress mouseup mouseover mouseout selectstart",b).on("focus blur",b).on("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(a.type.replace(/^on/,""),a)},_selectionChange:function(a,b){var c=this,d=!1,f,g;m.ie&&9>m.version&&b&&"mouseup"==b.type&&!this.selection.getRange().collapsed&&(d=!0,f=b.clientX,
+g=b.clientY);clearTimeout(e);e=setTimeout(function(){if(c.selection.getNative()){var a;if(d&&"None"==c.selection.getNative().type){a=c.document.body.createTextRange();try{a.moveToPoint(f,g)}catch(e){a=null}}var h;a&&(h=c.selection.getIERange,c.selection.getIERange=function(){return a});c.selection.cache();h&&(c.selection.getIERange=h);c.selection._cachedRange&&c.selection._cachedStartElement&&(c.fireEvent("beforeselectionchange"),c.fireEvent("selectionchange",!!b),c.fireEvent("afterselectionchange"),
+c.selection.clear())}},a||50)},_callCmdFn:function(a,b){b=Array.prototype.slice.call(b,0);var c=b.shift().toLowerCase(),d,e;e=(d=this.commands[c]||UM.commands[c])&&d[a];if(!(d&&e||"queryCommandState"!=a))return 0;if(e)return e.apply(this,[c].concat(b))},execCommand:function(a){if(!this.isFocus()){var b=this.selection._bakRange;b?b.select():this.focus(!0)}a=a.toLowerCase();var c,b=this.commands[a]||UM.commands[a];if(!b||!b.execCommand)return null;b.notNeedUndo||this.__hasEnterExecCommand?(c=this._callCmdFn("execCommand",
+arguments),this.__hasEnterExecCommand||b.ignoreContentChange||this._ignoreContentChange||this.fireEvent("contentchange")):(this.__hasEnterExecCommand=!0,-1!=this.queryCommandState.apply(this,arguments)&&(this.fireEvent("saveScene"),this.fireEvent("beforeexeccommand",a),c=this._callCmdFn("execCommand",arguments),b.ignoreContentChange||this._ignoreContentChange||this.fireEvent("contentchange"),this.fireEvent("afterexeccommand",a),this.fireEvent("saveScene")),this.__hasEnterExecCommand=!1);this.__hasEnterExecCommand||
+b.ignoreContentChange||this._ignoreContentChange||this._selectionChange();return c},queryCommandState:function(a){try{return this._callCmdFn("queryCommandState",arguments)}catch(b){return 0}},queryCommandValue:function(a){try{return this._callCmdFn("queryCommandValue",arguments)}catch(b){return null}},hasContents:function(a){if(a)for(var b=0,c;c=a[b++];)if(0<this.body.getElementsByTagName(c).length)return!0;if(!k.isEmptyBlock(this.body))return!0;a=["div"];for(b=0;c=a[b++];){c=k.getElementsByTagName(this.body,
+c);for(var d=0,e;e=c[d++];)if(k.isCustomeNode(e))return!0}return!1},reset:function(){this.fireEvent("reset")},isEnabled:function(){return!0!=this._isEnabled},setEnabled:function(){var a;this.body.contentEditable=!0;if(this.lastBk){a=this.selection.getRange();try{a.moveToBookmark(this.lastBk),delete this.lastBk}catch(b){a.setStartAtFirst(this.body).collapse(!0)}a.select(!0)}this.bkqueryCommandState&&(this.queryCommandState=this.bkqueryCommandState,delete this.bkqueryCommandState);this._bkproxyDomEvent&&
+(this._proxyDomEvent=this._bkproxyDomEvent,delete this._bkproxyDomEvent);this.fireEvent("setEnabled")},enable:function(){return this.setEnabled()},setDisabled:function(a,b){var c=this;c.body.contentEditable=!1;c._except=a?n.isArray(a)?a:[a]:[];c.lastBk||(c.lastBk=c.selection.getRange().createBookmark(!0));c.bkqueryCommandState||(c.bkqueryCommandState=c.queryCommandState,c.queryCommandState=function(a){return-1!=n.indexOf(c._except,a)?c.bkqueryCommandState.apply(c,arguments):-1});b||c._bkproxyDomEvent||
+(c._bkproxyDomEvent=c._proxyDomEvent,c._proxyDomEvent=function(){return!1});c.fireEvent("selectionchange");c.fireEvent("setDisabled",c._except)},disable:function(a){return this.setDisabled(a)},_setDefaultContent:function(){function a(){var b=this;b.document.getElementById("initContent")&&(b.body.innerHTML="<p>"+(E?"":"<br/>")+"</p>",b.removeListener("firstBeforeExecCommand focus",a),setTimeout(function(){b.focus();b._selectionChange()},0))}return function(b){this.body.innerHTML='<p id="initContent">'+
+b+"</p>";this.addListener("firstBeforeExecCommand focus",a)}}(),setShow:function(){var a=this.selection.getRange();if("none"==this.container.style.display){try{a.moveToBookmark(this.lastBk),delete this.lastBk}catch(b){a.setStartAtFirst(this.body).collapse(!0)}setTimeout(function(){a.select(!0)},100);this.container.style.display=""}},show:function(){return this.setShow()},setHide:function(){this.lastBk||(this.lastBk=this.selection.getRange().createBookmark(!0));this.container.style.display="none"},
+hide:function(){return this.setHide()},getLang:function(a){var b=UM.I18N[this.options.lang];if(!b)throw Error("not import language file");a=(a||"").split(".");for(var c=0,d;(d=a[c++])&&(b=b[d],b););return b},getContentLength:function(a,b){var c=this.getContent(!1,!1,!0).length;if(a){b=(b||[]).concat(["hr","img","iframe"]);for(var c=this.getContentTxt().replace(/[\t\r\n]+/g,"").length,d=0,e;e=b[d++];)c+=this.body.getElementsByTagName(e).length}return c},addInputRule:function(a,b){a.ignoreUndo=b;this.inputRules.push(a)},
+filterInputRule:function(a,b){for(var c=0,d;d=this.inputRules[c++];)b&&d.ignoreUndo||d.call(this,a)},addOutputRule:function(a,b){a.ignoreUndo=b;this.outputRules.push(a)},filterOutputRule:function(a,b){for(var c=0,d;d=this.outputRules[c++];)b&&d.ignoreUndo||d.call(this,a)}};n.inherits(f,I)})();UM.filterWord=function(){function a(a){return a=a.replace(/[\d.]+\w+/g,function(a){return n.transUnitToPx(a)})}function b(b){return b.replace(/[\t\r\n]+/g," ").replace(/\x3c!--[\s\S]*?--\x3e/ig,"").replace(/<v:shape [^>]*>[\s\S]*?.<\/v:shape>/gi,
+function(b){if(m.opera)return"";try{if(/Bitmap/i.test(b))return"";var c=b.match(/width:([ \d.]*p[tx])/i)[1],f=b.match(/height:([ \d.]*p[tx])/i)[1],h=b.match(/src=\s*"([^"]*)"/i)[1];return'<img width="'+a(c)+'" height="'+a(f)+'" src="'+h+'" />'}catch(l){return""}}).replace(/<\/?div[^>]*>/g,"").replace(/v:\w+=(["']?)[^'"]+\1/g,"").replace(/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi,"").replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,
+"<p><strong>$1</strong></p>").replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/ig,function(a,b,c,h){return"class"==b&&"MsoListParagraph"==h?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(b,c,f,h){b=[];h=h.replace(/^\s+|\s+$/,"").replace(/&#39;/g,"'").replace(/&quot;/gi,"'").split(/;\s*/g);f=0;for(var l;l=h[f];f++){var g,p=l.split(":");if(2==p.length&&(l=p[0].toLowerCase(),g=p[1].toLowerCase(),
+!(/^(background)\w*/.test(l)&&0==g.replace(/(initial|\s)/g,"").length||/^(margin)\w*/.test(l)&&/^0\w+$/.test(g)))){switch(l){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":/<table/.test(c)||(b[f]=l.replace(/^mso-|-alt$/g,
+"")+":"+a(g));continue;case "horiz-align":b[f]="text-align:"+g;continue;case "vert-align":b[f]="vertical-align:"+g;continue;case "font-color":case "mso-foreground":b[f]="color:"+g;continue;case "mso-background":case "mso-highlight":b[f]="background:"+g;continue;case "mso-default-height":b[f]="min-height:"+a(g);continue;case "mso-default-width":b[f]="min-width:"+a(g);continue;case "mso-padding-between-alt":b[f]="border-collapse:separate;border-spacing:"+a(g);continue;case "text-line-through":if("single"==
+g||"double"==g)b[f]="text-decoration:line-through";continue;case "mso-zero-height":"yes"==g&&(b[f]="display:none");continue;case "margin":if(!/[1-9]/.test(g))continue}/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test(l)||/text\-indent|padding|margin/.test(l)&&/\-[\d.]+/.test(g)||(b[f]=l+":"+p[1])}}return c+(b.length?' style="'+b.join(";").replace(/;{2,}/g,";")+'"':"")}).replace(/[\d.]+(cm|pt)/g,
+function(a){return n.transUnitToPx(a)})}return function(a){return/(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/ig.test(a)?b(a):a}}();(function(){function a(a,b,c){a.push(m);return b+(c?1:-1)}function b(a,b){for(var c=0;c<b;c++)a.push(r)}function c(e,f,l,h){switch(e.type){case "root":for(var g=0,k;k=e.children[g++];)l&&"element"==k.type&&!q.$inlineWithA[k.tagName]&&1<g&&(a(f,h,!0),b(f,h)),c(k,f,l,h);break;case "text":"pre"==e.parentNode.tagName?f.push(e.data):f.push(p[e.parentNode.tagName]?
+n.html(e.data):e.data.replace(/[ ]{2}/g," &nbsp;"));break;case "element":d(e,f,l,h);break;case "comment":f.push("\x3c!--"+e.data+"--\x3e")}return f}function d(d,e,f,h){var l="";if(d.attrs){var l=[],g=d.attrs,p;for(p in g)l.push(p+(void 0!==g[p]?'="'+(k[p]?n.html(g[p]).replace(/["]/g,function(a){return"&quot;"}):n.unhtml(g[p]))+'"':""));l=l.join(" ")}e.push("<"+d.tagName+(l?" "+l:"")+(q.$empty[d.tagName]?"/":"")+">");f&&!q.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(h=
+a(e,h,!0),b(e,h));if(d.children&&d.children.length)for(l=0;g=d.children[l++];)f&&"element"==g.type&&!q.$inlineWithA[g.tagName]&&1<l&&(a(e,h),b(e,h)),c(g,e,f,h);q.$empty[d.tagName]||(f&&!q.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(h=a(e,h),b(e,h)),e.push("</"+d.tagName+">"))}function e(a,b){var c;if("element"==a.type&&a.getAttr("id")==b)return a;if(a.children&&a.children.length)for(var d=0;c=a.children[d++];)if(c=e(c,b))return c}function f(a,b,c){"element"==a.type&&
+a.tagName==b&&c.push(a);if(a.children&&a.children.length)for(var d=0,e;e=a.children[d++];)f(e,b,c)}function h(a,b){if(a.children&&a.children.length)for(var c=0,d;d=a.children[c];)h(d,b),d.parentNode&&(d.children&&d.children.length&&b(d),d.parentNode&&c++);else b(a)}var l=UM.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},p={style:1,script:1},r="    ",
+m="\n";l.createElement=function(a){return/[<>]/.test(a)?UM.htmlparser(a).children[0]:new l({type:"element",children:[],tagName:a})};l.createText=function(a,b){return new UM.uNode({type:"text",data:b?a:n.unhtml(a||"")})};l.prototype={toHtml:function(a){var b=[];c(this,b,a,0);return b.join("")},innerHTML:function(a){if("element"!=this.type||q.$empty[this.tagName])return this;if(n.isString(a)){if(this.children)for(var b=0,c;c=this.children[b++];)c.parentNode=null;this.children=[];a=UM.htmlparser(a);
+for(b=0;c=a.children[b++];)this.children.push(c),c.parentNode=this;return this}a=new UM.uNode({type:"root",children:this.children});return a.toHtml()},innerText:function(a,b){if("element"!=this.type||q.$empty[this.tagName])return this;if(a){if(this.children)for(var c=0,d;d=this.children[c++];)d.parentNode=null;this.children=[];this.appendChild(l.createText(a,b));return 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=this.parentNode,b=0,c;c=a.children[b];b++)if(c===this)return 0==b?null:a.children[b-1]},nextSibling:function(){for(var a=this.parentNode,b=0,c;c=a.children[b++];)if(c===this)return a.children[b]},replaceChild:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c=0,d;d=this.children[c];c++)if(d===b)return this.children.splice(c,
+1,a),b.parentNode=null,a.parentNode=this,a}},appendChild:function(a){if("root"==this.type||"element"==this.type&&!q.$empty[this.tagName]){this.children||(this.children=[]);a.parentNode&&a.parentNode.removeChild(a);for(var b=0,c;c=this.children[b];b++)if(c===a){this.children.splice(b,1);break}this.children.push(a);a.parentNode=this;return a}},insertBefore:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c=0,d;d=this.children[c];c++)if(d===b)return this.children.splice(c,
+0,a),a.parentNode=this,a}},insertAfter:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c=0,d;d=this.children[c];c++)if(d===b)return this.children.splice(c+1,0,a),a.parentNode=this,a}},removeChild:function(a,b){if(this.children)for(var c=0,d;d=this.children[c];c++)if(d===a){this.children.splice(c,1);d.parentNode=null;if(b&&d.children&&d.children.length)for(var e=0,f;f=d.children[e];e++)this.children.splice(c+e,0,f),f.parentNode=this;return d}},getAttr:function(a){return this.attrs&&
+this.attrs[a.toLowerCase()]},setAttr:function(a,b){if(a)if(this.attrs||(this.attrs={}),n.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];else delete this.attrs},hasAttr:function(a){a=this.getAttr(a);return null!==a&&void 0!==a},getIndex:function(){for(var a=this.parentNode,b=0,c;c=a.children[b];b++)if(c===this)return b;return-1},getNodeById:function(a){var b;if(this.children&&this.children.length)for(var c=
+0;b=this.children[c++];)if(b=e(b,a))return b},getNodesByTagName:function(a){a=n.trim(a).replace(/[ ]{2,}/g," ").split(" ");var b=[],c=this;n.each(a,function(a){if(c.children&&c.children.length)for(var d=0,e;e=c.children[d++];)f(e,a,b)});return b},getStyle:function(a){var b=this.getAttr("style");return b?(a=b.match(RegExp("(^|;)\\s*"+a+":([^;]+)","i")))&&a[0]?a[2]:"":""},setStyle:function(a,b){function c(a,b){d=d.replace(RegExp("(^|;)\\s*"+a+":([^;]+;?)","gi"),"$1");b&&(d=a+":"+n.unhtml(b)+";"+d)}
+var d=this.getAttr("style");d||(d="");if(n.isObject(a))for(var e in a)c(e,a[e]);else c(a,b);this.setAttr("style",n.trim(d))},hasClass:function(a){if(this.hasAttr("class")){var b=this.getAttr("class").split(/\s+/),c=!1;g.each(b,function(b,d){d===a&&(c=!0)});return c}return!1},addClass:function(a){var b=null,c=!1;this.hasAttr("class")?(b=this.getAttr("class"),b=b.split(/\s+/),b.forEach(function(b){b===a&&(c=!0)}),!c&&b.push(a),this.setAttr("class",b.join(" "))):this.setAttr("class",a)},removeClass:function(a){if(this.hasAttr("class")){var b=
+this.getAttr("class"),b=b.replace(RegExp("\\b"+a+"\\b","g"),"");this.setAttr("class",n.trim(b).replace(/[ ]{2,}/g," "))}},traversal:function(a){this.children&&this.children.length&&h(this,a);return this}}})();UM.htmlparser=function(a,b){function c(a,b){if(r[a.tagName]){var c=g.createElement(r[a.tagName]);a.appendChild(c);c.appendChild(g.createText(b))}else a.appendChild(g.createText(b))}function d(a,b,c){var e;if(e=p[b]){for(var h=a,k;"root"!=h.type;){if(n.isArray(e)?-1!=n.indexOf(e,h.tagName):e==
+h.tagName){a=h;k=!0;break}h=h.parentNode}k||(a=d(a,n.isArray(e)?e[0]:e))}e=new g({parentNode:a,type:"element",tagName:b.toLowerCase(),children:q.$empty[b]?null:[]});if(c){for(h={};k=f.exec(c);)h[k[1].toLowerCase()]=l[k[1].toLowerCase()]?k[2]||k[3]||k[4]:n.unhtml(k[2]||k[3]||k[4]);e.attrs=h}a.children.push(e);return q.$empty[b]?a:e}var e=/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)--\x3e)|(?:([^\s\/>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,f=/([\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(RegExp(k.fillChar,"g"),"");b||(a=a.replace(RegExp("[\\r\\t\\n"+(b?"":" ")+"]*</?(\\w+)\\s*(?:[^>]*)>[\\r\\t\\n"+(b?"":" ")+"]*","g"),function(a,c){return c&&h[c.toLowerCase()]?a.replace(/(^[\n\r]+)|([\n\r]+$)/g,""):a.replace(RegExp("^[\\r\\n"+(b?"":" ")+"]+"),"").replace(RegExp("[\\r\\n"+(b?"":" ")+"]+$"),"")}));for(var l={href:1,src:1},g=UM.uNode,p={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"},r={ol:"li",ul:"li"},m,u=0,v=0,w=new g({type:"root",children:[]}),t=w;m=e.exec(a);){u=m.index;try{if(u>v&&c(t,a.slice(v,u)),m[3])q.$cdata[t.tagName]?c(t,m[0]):t=d(t,m[3].toLowerCase(),m[4]);else if(m[1]){if("root"!=t.type)if(q.$cdata[t.tagName]&&!q.$cdata[m[1]])c(t,m[0]);else{for(u=t;"element"==t.type&&t.tagName!=m[1].toLowerCase();)if(t=t.parentNode,"root"==
+t.type)throw t=u,"break";t=t.parentNode}}else m[2]&&t.children.push(new g({type:"comment",data:m[2],parentNode:t}))}catch(L){}v=e.lastIndex}v<a.length&&c(t,a.slice(v));return w};UM.filterNode=function(){function a(b,c){switch(b.type){case "element":var d;if(d=c[b.tagName])if("-"===d)b.parentNode.removeChild(b);else if(n.isFunction(d)){var e=b.parentNode,f=b.getIndex();d(b);if(b.parentNode){if(b.children)for(d=0;f=b.children[d];)a(f,c),f.parentNode&&d++}else for(d=f;f=e.children[d];)a(f,c),f.parentNode&&
+d++}else{if((d=d.$)&&b.attrs){var f={},h;for(e in d){h=b.getAttr(e);if("style"==e&&n.isArray(d[e])){var l=[];n.each(d[e],function(a){var c;(c=b.getStyle(a))&&l.push(a+":"+c)});h=l.join(";")}h&&(f[e]=h)}b.attrs=f}if(b.children)for(d=0;f=b.children[d];)a(f,c),f.parentNode&&d++}else if(q.$cdata[b.tagName])b.parentNode.removeChild(b);else for(e=b.parentNode,f=b.getIndex(),b.parentNode.removeChild(b,!0),d=f;f=e.children[d];)a(f,c),f.parentNode&&d++;break;case "comment":b.parentNode.removeChild(b)}}return function(b,
+c){if(n.isEmptyObject(c))return b;var d;(d=c["-"])&&n.each(d.split(" "),function(a){c[a]="-"});d=0;for(var e;e=b.children[d];)a(e,c),e.parentNode&&d++;return b}}();UM.commands.inserthtml={execCommand:function(a,b,c){var d=this,e;if(b&&!0!==d.fireEvent("beforeinserthtml",b)){e=d.selection.getRange();a=e.document.createElement("div");a.style.display="inline";c||(b=UM.htmlparser(b),d.options.filterRules&&UM.filterNode(b,d.options.filterRules),d.filterInputRule(b),b=b.toHtml());a.innerHTML=n.trim(b);
+if(!e.collapsed&&(b=e.startContainer,k.isFillChar(b)&&e.setStartBefore(b),b=e.endContainer,k.isFillChar(b)&&e.setEndAfter(b),e.txtToElmBoundary(),e.endContainer&&1==e.endContainer.nodeType&&(b=e.endContainer.childNodes[e.endOffset])&&k.isBr(b)&&e.setEndAfter(b),0==e.startOffset&&(b=e.startContainer,k.isBoundaryNode(b,"firstChild")&&(b=e.endContainer,e.endOffset==(3==b.nodeType?b.nodeValue.length:b.childNodes.length)&&k.isBoundaryNode(b,"lastChild")&&(d.body.innerHTML="<p>"+(m.ie?"":"<br/>")+"</p>",
+e.setStart(d.body.firstChild,0).collapse(!0)))),!e.collapsed&&e.deleteContents(),1==e.startContainer.nodeType)){b=e.startContainer.childNodes[e.startOffset];var f;if(b&&k.isBlockElm(b)&&(f=b.previousSibling)&&k.isBlockElm(f)){for(e.setEnd(f,f.childNodes.length).collapse();b.firstChild;)f.appendChild(b.firstChild);k.remove(b)}}var h,l;c=0;var g;e.inFillChar()&&(b=e.startContainer,k.isFillChar(b)?(e.setStartBefore(b).collapse(!0),k.remove(b)):k.isFillChar(b,!0)&&(b.nodeValue=b.nodeValue.replace(F,""),
+e.startOffset--,e.collapsed&&e.collapse(!0)));for(;b=a.firstChild;){if(c){for(h=d.document.createElement("p");b&&(3==b.nodeType||!q.$block[b.tagName]);)g=b.nextSibling,h.appendChild(b),b=g;h.firstChild&&(b=h)}e.insertNode(b);g=b.nextSibling;if(!c&&b.nodeType==k.NODE_ELEMENT&&k.isBlockElm(b)&&(h=k.findParent(b,function(a){return k.isBlockElm(a)}))&&"body"!=h.tagName.toLowerCase()&&(!q[h.tagName][b.nodeName]||b.parentNode!==h)){if(q[h.tagName][b.nodeName])for(l=b.parentNode;l!==h;)f=l,l=l.parentNode;
+else f=h;k.breakParent(b,f||l);f=b.previousSibling;k.trimWhiteTextNode(f);f.childNodes.length||k.remove(f);!m.ie&&(p=b.nextSibling)&&k.isBlockElm(p)&&p.lastChild&&!k.isBr(p.lastChild)&&p.appendChild(d.document.createElement("br"));c=1}var p=b.nextSibling;if(!a.firstChild&&p&&k.isBlockElm(p)){e.setStart(p,0).collapse(!0);break}e.setEndAfter(b).collapse()}b=e.startContainer;g&&k.isBr(g)&&k.remove(g);if(k.isBlockElm(b)&&k.isEmptyNode(b))if(g=b.nextSibling)k.remove(b),1==g.nodeType&&q.$block[g.tagName]&&
+e.setStart(g,0).collapse(!0).shrinkBoundary();else try{b.innerHTML=m.ie?k.fillChar:"<br/>"}catch(r){e.setStartBefore(b),k.remove(b)}try{if(m.ie9below&&1==e.startContainer.nodeType&&!e.startContainer.childNodes[e.startOffset]&&(f=e.startContainer.childNodes[e.startOffset-1])&&1==f.nodeType&&q.$empty[f.tagName]){var y=this.document.createTextNode(k.fillChar);e.insertNode(y).setStart(y,0).collapse(!0)}setTimeout(function(){e.select(!0)})}catch(u){}setTimeout(function(){e=d.selection.getRange();e.scrollIntoView();
+d.fireEvent("afterinserthtml")},200)}}};UM.commands.insertimage={execCommand:function(a,b){b=n.isArray(b)?b:[b];if(b.length){var c=[],d="",e;e=b[0];if(1==b.length)d='<img src="'+e.src+'" '+(e._src?' _src="'+e._src+'" ':"")+(e.width?'width="'+e.width+'" ':"")+(e.height?' height="'+e.height+'" ':"")+("left"==e.floatStyle||"right"==e.floatStyle?' style="float:'+e.floatStyle+';"':"")+(e.title&&""!=e.title?' title="'+e.title+'"':"")+(e.border&&"0"!=e.border?' border="'+e.border+'"':"")+(e.alt&&""!=e.alt?
+' alt="'+e.alt+'"':"")+(e.hspace&&"0"!=e.hspace?' hspace = "'+e.hspace+'"':"")+(e.vspace&&"0"!=e.vspace?' vspace = "'+e.vspace+'"':"")+"/>","center"==e.floatStyle&&(d='<p style="text-align: center">'+d+"</p>"),c.push(d);else for(var f=0;e=b[f++];)d="<p "+("center"==e.floatStyle?'style="text-align: center" ':"")+'><img src="'+e.src+'" '+(e.width?'width="'+e.width+'" ':"")+(e._src?' _src="'+e._src+'" ':"")+(e.height?' height="'+e.height+'" ':"")+' style="'+(e.floatStyle&&"center"!=e.floatStyle?"float:"+
+e.floatStyle+";":"")+(e.border||"")+'" '+(e.title?' title="'+e.title+'"':"")+" /></p>",c.push(d);this.execCommand("insertHtml",c.join(""),!0)}}};UM.plugins.justify=function(){var a=this;g.each(["justifyleft","justifyright","justifycenter","justifyfull"],function(b,c){a.commands[c]={execCommand:function(a){return this.document.execCommand(a)},queryCommandValue:function(a){var b=this.document.queryCommandValue(a);return!0===b||"true"===b?a.replace(/justify/,""):""},queryCommandState:function(a){return this.document.queryCommandState(a)?
+1:0}}})};UM.plugins.font=function(){var a=this,b={forecolor:"forecolor",backcolor:"backcolor",fontsize:"fontsize",fontfamily:"fontname"},c={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family"},d={forecolor:"color",fontsize:"size",fontfamily:"face"};a.setOpt({fontfamily:[{name:"songti",val:"\u5b8b\u4f53,SimSun"},{name:"yahei",val:"\u5fae\u8f6f\u96c5\u9ed1,Microsoft YaHei"},{name:"kaiti",val:"\u6977\u4f53,\u6977\u4f53_GB2312, SimKai"},{name:"heiti",val:"\u9ed1\u4f53, SimHei"},
+{name:"lishu",val:"\u96b6\u4e66, 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"},{name:"sans-serif",val:"sans-serif"}],fontsize:[10,12,16,18,24,32,48]});a.addOutputRule(function(a){n.each(a.getNodesByTagName("font"),function(a){if("font"==a.tagName){var b=[],c;for(c in a.attrs)switch(c){case "size":var d=
+a.attrs[c];g.each({10:"1",12:"2",16:"3",18:"4",24:"5",32:"6",48:"7"},function(a,b){if(b==d)return d=a,!1});b.push("font-size:"+d+"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(";")}}a.tagName="span";"span"==a.parentNode.tagName&&1==a.parentNode.children.length&&(g.each(a.attrs,function(b,c){a.parentNode.attrs[b]="style"==b?a.parentNode.attrs[b]+c:c}),a.parentNode.removeChild(a,!0))})});
+for(var e in b)(function(e){a.commands[e]={execCommand:function(a,d){if("transparent"!=d){var e=this.selection.getRange();if(e.collapsed){var f=g("<span></span>").css(c[a],d)[0];e.insertNode(f).setStart(f,0).setCursor()}else{"fontsize"==a&&(d={10:"1",12:"2",16:"3",18:"4",24:"5",32:"6",48:"7"}[(d+"").replace(/px/,"")]);this.document.execCommand(b[a],!1,d);m.gecko&&g.each(this.$body.find("a"),function(a,b){var c=b.parentNode;if(c.lastChild===c.firstChild&&/FONT|SPAN/.test(c.tagName)){var d=c.cloneNode(!1);
+d.innerHTML=b.innerHTML;g(b).html("").append(d).insertBefore(c);g(c).remove()}});if(!m.ie){var f=this.selection.getNative().getRangeAt(0).commonAncestorContainer,e=this.selection.getRange(),k=e.createBookmark(!0);g(f).find("a").each(function(a,b){var c=b.parentNode;"FONT"==c.nodeName&&(c=c.cloneNode(!1),c.innerHTML=b.innerHTML,g(b).html("").append(c))});e.moveToBookmark(k).select()}return!0}}},queryCommandValue:function(b){var e=a.selection.getStart(),f=g(e).css(c[b]);void 0===f&&(f=g(e).attr(d[b]));
+return f?n.fixColor(b,f).replace(/px/,""):""},queryCommandState:function(a){return this.queryCommandValue(a)}}})(e)};UM.plugins.link=function(){this.setOpt("autourldetectinie",!1);m.ie&&!1===this.options.autourldetectinie&&this.addListener("keyup",function(a,b){var c=b.keyCode;if(13==c||32==c){var d=this.selection.getRange().startContainer;13==c?"P"==d.nodeName&&(c=d.previousSibling)&&1==c.nodeType&&(c=c.lastChild)&&"A"==c.nodeName&&!c.getAttribute("_href")&&k.remove(c,!0):32==c&&3==d.nodeType&&/^\s$/.test(d.nodeValue)&&
+(d=d.previousSibling)&&"A"==d.nodeName&&!d.getAttribute("_href")&&k.remove(d,!0)}});this.addOutputRule(function(a){g.each(a.getNodesByTagName("a"),function(a,c){var d=n.html(c.getAttr("_href"));/^(ftp|https?|\/|file)/.test(d)||(d="http://"+d);c.setAttr("href",d);c.setAttr("_href");""==c.getAttr("title")&&c.setAttr("title")})});this.addInputRule(function(a){g.each(a.getNodesByTagName("a"),function(a,c){c.setAttr("_href",n.html(c.getAttr("href")))})});this.commands.link={execCommand:function(a,b){var c=
+this.selection.getRange();if(c.collapsed){var d=c.startContainer;(d=k.findParentByTagName(d,"a",!0))?(g(d).attr(b),c.selectNode(d).select()):c.insertNode(g("<a>"+b.href+"</a>").attr(b)[0]).select()}else this.document.execCommand("createlink",!1,"_umeditor_link"),n.each(k.getElementsByTagName(this.body,"a",function(a){return"_umeditor_link"==a.getAttribute("href")}),function(a){"_umeditor_link"==g(a).text()&&g(a).text(b.href);k.setAttributes(a,b);c.selectNode(a).select()})},queryCommandState:function(){return this.queryCommandValue("link")?
+1:0},queryCommandValue:function(){var a=this.selection.getStartElementPath(),b;g.each(a,function(a,d){if("A"==d.nodeName)return b=d,!1});return b}};this.commands.unlink={execCommand:function(){this.document.execCommand("unlink")}}};UM.commands.print={execCommand:function(){var a="editor_print_"+ +new Date;g('<iframe src="" id="'+a+'" name="'+a+'" frameborder="0"></iframe>').attr("id",a).css({width:"0px",height:"0px",overflow:"hidden","float":"left",position:"absolute",top:"-10000px",left:"-10000px"}).appendTo(this.$container.find(".edui-dialog-container"));
+var b=window.open("",a,"").document;b.open();b.write("<html><head></head><body><div>"+this.getContent(null,null,!0)+"</div><script>setTimeout(function(){window.print();setTimeout(function(){window.parent.$('#"+a+"').remove();},100);},200);\x3c/script></body></html>");b.close()},notNeedUndo:1};UM.plugins.paragraph=function(){this.setOpt("paragraph",{p:"",h1:"",h2:"",h3:"",h4:"",h5:"",h6:""});this.commands.paragraph={execCommand:function(a,b){return this.document.execCommand("formatBlock",!1,"<"+b+
+">")},queryCommandValue:function(){try{var a=this.document.queryCommandValue("formatBlock")}catch(b){}return a}}};UM.plugins.horizontal=function(){var a=this;a.commands.horizontal={execCommand:function(){this.document.execCommand("insertHorizontalRule");var b=a.selection.getRange().txtToElmBoundary(!0),c=b.startContainer;if(k.isBody(b.startContainer))(c=b.startContainer.childNodes[b.startOffset])||(c=g("<p></p>").appendTo(b.startContainer).html(m.ie?"&nbsp;":"<br/>")[0]),b.setStart(c,0).setCursor();
+else{for(;q.$inline[c.tagName]&&c.lastChild===c.firstChild;){var d=c.parentNode;d.appendChild(c.firstChild);d.removeChild(c);c=d}for(;q.$inline[c.tagName];)c=c.parentNode;1==c.childNodes.length&&"HR"==c.lastChild.nodeName?(d=c.lastChild,g(d).insertBefore(c),b.setStart(c,0).setCursor()):(d=g("hr",c)[0],k.breakParent(d,c),(c=d.previousSibling)&&k.isEmptyBlock(c)&&g(c).remove(),b.setStart(d.nextSibling,0).setCursor())}}}};UM.commands.cleardoc={execCommand:function(){var a=this,b=a.selection.getRange();
+a.body.innerHTML="<p>"+(E?"":"<br/>")+"</p>";b.setStart(a.body.firstChild,0).setCursor(!1,!0);setTimeout(function(){a.fireEvent("clearDoc")},0)}};UM.plugins.undo=function(){function a(a,b){if(a.length!=b.length)return 0;for(var c=0,d=a.length;c<d;c++)if(a[c]!=b[c])return 0;return 1}function b(){this.undoManger.save()}var c,d=this.options.maxUndoCount||20,e=this.options.maxInputCount||20,f=RegExp(k.fillChar+"|</hr>","gi"),h={ol:1,ul:1,table:1,tbody:1,tr:1,body:1},l=this.options.autoClearEmptyNode;
+this.undoManger=new function(){this.list=[];this.index=0;this.hasRedo=this.hasUndo=!1;this.undo=function(){if(this.hasUndo)if(this.list[this.index-1]||1!=this.list.length){for(;this.list[this.index].content==this.list[this.index-1].content;)if(this.index--,0==this.index)return this.restore(0);this.restore(--this.index)}else this.reset()};this.redo=function(){if(this.hasRedo){for(;this.list[this.index].content==this.list[this.index+1].content;)if(this.index++,this.index==this.list.length-1)return this.restore(this.index);
+this.restore(++this.index)}};this.restore=function(){var a=this.editor,b=this.list[this.index],c=UM.htmlparser(b.content.replace(f,""));a.options.autoClearEmptyNode=!1;a.filterInputRule(c,!0);a.options.autoClearEmptyNode=l;a.body.innerHTML=c.toHtml();a.fireEvent("afterscencerestore");m.ie&&n.each(k.getElementsByTagName(a.document,"td th caption p"),function(b){k.isEmptyNode(b)&&k.fillNode(a.document,b)});try{var d=(new B.Range(a.document,a.body)).moveToAddress(b.address);if(m.ie&&d.collapsed&&1==
+d.startContainer.nodeType){var e=d.startContainer.childNodes[d.startOffset];(!e||1==e.nodeType&&q.$empty[e])&&d.insertNode(a.document.createTextNode(" ")).collapse(!0)}d.select(h[d.startContainer.nodeName.toLowerCase()])}catch(g){}this.update();this.clearKey();a.fireEvent("reset",!0)};this.getScene=function(){var a=this.editor,b=a.selection.getRange().createAddress(!1,!0);a.fireEvent("beforegetscene");var c=UM.htmlparser(a.body.innerHTML,!0);a.options.autoClearEmptyNode=!1;a.filterOutputRule(c,!0);
+a.options.autoClearEmptyNode=l;c=c.toHtml();m.ie&&(c=c.replace(/>&nbsp;</g,"><").replace(/\s*</g,"<").replace(/>\s*/g,">"));a.fireEvent("aftergetscene");return{address:b,content:c}};this.save=function(b,e){clearTimeout(c);var f=this.getScene(e),l=this.list[this.index],h;if(h=l)if(h=l.content==f.content)b?l=1:(l=l.address,h=f.address,l=l.collapsed!=h.collapsed?0:a(l.startAddress,h.startAddress)&&a(l.endAddress,h.endAddress)?1:0),h=l;h||(this.list=this.list.slice(0,this.index+1),this.list.push(f),this.list.length>
+d&&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.hasRedo=this.hasUndo=!1;this.clearKey()};this.clearKey=function(){p=0}};this.undoManger.editor=this;this.addListener("saveScene",function(){var a=Array.prototype.splice.call(arguments,1);this.undoManger.save.apply(this.undoManger,a)});this.addListener("beforeexeccommand",
+b);this.addListener("afterexeccommand",b);this.addListener("reset",function(a,b){b||this.undoManger.reset()});this.commands.redo=this.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 s={16:1,17:1,18:1,37:1,38:1,39:1,40:1},p=0,r=!1;this.addListener("ready",function(){g(this.body).on("compositionstart",function(){r=!0}).on("compositionend",function(){r=!1})});this.addshortcutkey({Undo:"ctrl+90",
+Redo:"ctrl+89,shift+ctrl+z"});var y=!0;this.addListener("keydown",function(a,b){var d=this;if(!(s[b.keyCode||b.which]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey||r))if(d.selection.getRange().collapsed){0==d.undoManger.list.length&&d.undoManger.save(!0);clearTimeout(c);var f=function(a){a.selection.getRange().collapsed&&a.fireEvent("contentchange");a.undoManger.save(!1,!0);a.fireEvent("selectionchange")};c=setTimeout(function(){if(r)var a=setInterval(function(){r||(f(d),clearInterval(a))},300);else f(d)},
+200);p++;p>=e&&f(d)}else d.undoManger.save(!1,!0),y=!1});this.addListener("keyup",function(a,b){s[b.keyCode||b.which]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey||r||y||(this.undoManger.save(!1,!0),y=!0)})};UM.plugins.paste=function(){function a(a){var b=this.document;if(!b.getElementById("baidu_pastebin")){var c=this.selection.getRange(),h=c.createBookmark(),l=b.createElement("div");l.id="baidu_pastebin";m.webkit&&l.appendChild(b.createTextNode(k.fillChar+k.fillChar));this.body.appendChild(l);h.start.style.display=
+"";l.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:"+g(h.start).position().top+"px";c.selectNodeContents(l).select(!0);setTimeout(function(){if(m.webkit)for(var g=0,p=b.querySelectorAll("#baidu_pastebin"),r;r=p[g++];)if(k.isEmptyNode(r))k.remove(r);else{l=r;break}try{l.parentNode.removeChild(l)}catch(n){}c.moveToBookmark(h).select(!0);a(l)},0)}}function b(a){var b;if(a.firstChild){var f=k.getElementsByTagName(a,"span");b=0;for(var h;h=f[b++];)"_baidu_cut_start"!=
+h.id&&"_baidu_cut_end"!=h.id||k.remove(h);if(m.webkit){h=a.querySelectorAll("div br");for(b=0;f=h[b++];)f=f.parentNode,"DIV"==f.tagName&&1==f.childNodes.length&&(f.innerHTML="<p><br/></p>",k.remove(f));f=a.querySelectorAll("#baidu_pastebin");for(b=0;h=f[b++];){var l=c.document.createElement("p");for(h.parentNode.insertBefore(l,h);h.firstChild;)l.appendChild(h.firstChild);k.remove(h)}h=a.querySelectorAll("meta");for(b=0;f=h[b++];)k.remove(f);h=a.querySelectorAll("br");for(b=0;f=h[b++];)/^apple-/i.test(f.className)&&
+k.remove(f)}if(m.gecko)for(h=a.querySelectorAll("[_moz_dirty]"),b=0;f=h[b++];)f.removeAttribute("_moz_dirty");if(!m.ie)for(h=a.querySelectorAll("span.Apple-style-span"),b=0;f=h[b++];)k.remove(f,!0);b=a.innerHTML;b=UM.filterWord(b);a=UM.htmlparser(b);c.options.filterRules&&UM.filterNode(a,c.options.filterRules);c.filterInputRule(a);m.webkit&&((b=a.lastChild())&&"element"==b.type&&"br"==b.tagName&&a.removeChild(b),n.each(c.body.querySelectorAll("div"),function(a){k.isEmptyBlock(a)&&k.remove(a)}));b=
+{html:a.toHtml()};c.fireEvent("beforepaste",b,a);b.html&&(c.execCommand("insertHtml",b.html,!0),c.fireEvent("afterpaste",b))}}var c=this;c.addListener("ready",function(){g(c.body).on("cut",function(){!c.selection.getRange().collapsed&&c.undoManger&&c.undoManger.save()}).on(m.ie||m.opera?"keydown":"paste",function(d){(!m.ie&&!m.opera||(d.ctrlKey||d.metaKey)&&"86"==d.keyCode)&&a.call(c,function(a){b(a)})})})};UM.plugins.list=function(){this.setOpt({insertorderedlist:{decimal:"","lower-alpha":"","lower-roman":"",
+"upper-alpha":"","upper-roman":""},insertunorderedlist:{circle:"",disc:"",square:""}});this.addInputRule(function(a){n.each(a.getNodesByTagName("li"),function(a){0==a.children.length&&a.parentNode.removeChild(a)})});this.commands.insertorderedlist=this.commands.insertunorderedlist={execCommand:function(a){this.document.execCommand(a);a=this.selection.getRange();var b=a.createBookmark(!0);this.$body.find("ol,ul").each(function(a,b){var e=b.parentNode;"P"==e.tagName&&e.lastChild===e.firstChild&&(g(b).children().each(function(a,
+b){var c=e.cloneNode(!1);g(c).append(b.innerHTML);g(b).html("").append(c)}),g(b).insertBefore(e),g(e).remove());q.$inline[e.tagName]&&("SPAN"==e.tagName&&g(b).children().each(function(a,b){var c=e.cloneNode(!1);if("P"!=b.firstChild.nodeName){for(;b.firstChild;)c.appendChild(b.firstChild);g("<p></p>").appendTo(b).append(c)}else{for(;b.firstChild;)c.appendChild(b.firstChild);g(b.firstChild).append(c)}}),k.remove(e,!0))});a.moveToBookmark(b).select();return!0},queryCommandState:function(a){return this.document.queryCommandState(a)}}};
+(function(){var a={textarea:function(a,c){var d=c.ownerDocument.createElement("textarea");d.style.cssText="resize:none;border:0;padding:0;margin:0;overflow-y:auto;outline:0";m.ie&&8>m.version&&(d.style.width=c.offsetWidth+"px",d.style.height=c.offsetHeight+"px",c.onresize=function(){d.style.width=c.offsetWidth+"px";d.style.height=c.offsetHeight+"px"});c.appendChild(d);return{container:d,setContent:function(a){d.value=a},getContent:function(){return d.value},select:function(){var a;m.ie?(a=d.createTextRange(),
+a.collapse(!0),a.select()):(d.setSelectionRange(0,0),d.focus())},dispose:function(){c.removeChild(d);c=d=c.onresize=null}}}};UM.plugins.source=function(){var b=this,c=!1,d;this.options.sourceEditor="textarea";b.setOpt({sourceEditorFirst:!1});var e=b.getContent,f;b.commands.source={execCommand:function(){if(c=!c){f=b.selection.getRange().createAddress(!1,!0);b.undoManger&&b.undoManger.save(!0);m.gecko&&(b.body.contentEditable=!1);b.body.style.cssText+=";position:absolute;left:-32768px;top:-32768px;";
+b.fireEvent("beforegetcontent");var l=UM.htmlparser(b.body.innerHTML);b.filterOutputRule(l);l.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(/&nbsp;/g," "))}});b.fireEvent("aftergetcontent");l=l.toHtml(!0);d=a.textarea(b,b.body.parentNode);d.setContent(l);g(d.container).width(g(b.body).width()+parseInt(g(b.body).css("padding-left"))+
+parseInt(g(b.body).css("padding-right"))).height(g(b.body).height());setTimeout(function(){d.select()});b.getContent=function(){return d.getContent()||"<p>"+(m.ie?"":"<br/>")+"</p>"}}else{b.$body.css({position:"",left:"",top:""});l=d.getContent()||"<p>"+(m.ie?"":"<br/>")+"</p>";l=l.replace(RegExp("[\\r\\t\\n ]*</?(\\w+)\\s*(?:[^>]*)>","g"),function(a,b){return b&&!q.$inlineWithA[b.toLowerCase()]?a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,""):a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,"")});b.setContent(l);
+d.dispose();d=null;b.getContent=e;b.body.firstChild||(b.body.innerHTML="<p>"+(m.ie?"":"<br/>")+"</p>");b.undoManger&&b.undoManger.save(!0);m.gecko&&(b.body.contentEditable=!0);try{b.selection.getRange().moveToAddress(f).select()}catch(h){}}this.fireEvent("sourcemodechanged",c)},queryCommandState:function(){return c|0},notNeedUndo:1};var h=b.queryCommandState;b.queryCommandState=function(a){a=a.toLowerCase();return c?a in{source:1,fullscreen:1}?h.apply(this,arguments):-1:h.apply(this,arguments)}}})();
+UM.plugins.enterkey=function(){var a,b=this,c=b.options.enterTag;b.addListener("keyup",function(c,e){if(13==(e.keyCode||e.which)){var f=b.selection.getRange(),h=f.startContainer,l;if(m.ie)b.fireEvent("saveScene",!0,!0);else{if(/h\d/i.test(a)){if(m.gecko)k.findParentByTagName(h,"h1 h2 h3 h4 h5 h6 blockquote caption table".split(" "),!0)||(b.document.execCommand("formatBlock",!1,"<p>"),l=1);else if(1==h.nodeType){var h=b.document.createTextNode(""),g;f.insertNode(h);if(g=k.findParentByTagName(h,"div",
+!0)){for(l=b.document.createElement("p");g.firstChild;)l.appendChild(g.firstChild);g.parentNode.insertBefore(l,g);k.remove(g);f.setStartBefore(h).setCursor();l=1}k.remove(h)}b.undoManger&&l&&b.undoManger.save()}m.opera&&f.select()}}});b.addListener("keydown",function(d,e){if(13==(e.keyCode||e.which))if(b.fireEvent("beforeenterkeydown"))k.preventDefault(e);else{b.fireEvent("saveScene",!0,!0);a="";var f=b.selection.getRange();if(!f.collapsed){var h=f.startContainer,l=f.endContainer,h=k.findParentByTagName(h,
+"td",!0),l=k.findParentByTagName(l,"td",!0);if(h&&l&&h!==l||!h&&l||h&&!l){e.preventDefault?e.preventDefault():e.returnValue=!1;return}}"p"!=c||m.ie||((h=k.findParentByTagName(f.startContainer,"ol ul p h1 h2 h3 h4 h5 h6 blockquote caption".split(" "),!0))||m.opera?(a=h.tagName,"p"==h.tagName.toLowerCase()&&m.gecko&&k.removeDirtyAttr(h)):(b.document.execCommand("formatBlock",!1,"<p>"),m.gecko&&(f=b.selection.getRange(),(h=k.findParentByTagName(f.startContainer,"p",!0))&&k.removeDirtyAttr(h))))}});m.ie&&
+b.addListener("setDisabled",function(){g(b.body).find("p").each(function(a,b){k.isEmptyBlock(b)&&(b.innerHTML="&nbsp;")})})};UM.commands.preview={execCommand:function(){var a=window.open("","_blank","").document,b=this.getContent(null,null,!0),c=this.getOpt("UMEDITOR_HOME_URL"),c=-1!=b.indexOf("mathquill-embedded-latex")?'<link rel="stylesheet" href="'+c+'third-party/mathquill/mathquill.css"/><script src="'+c+'third-party/jquery.min.js">\x3c/script><script src="'+c+'third-party/mathquill/mathquill.min.js">\x3c/script>':
+"";a.open();a.write("<html><head>"+c+"</head><body><div>"+b+"</div></body></html>");a.close()},notNeedUndo:1};UM.plugins.basestyle=function(){var a=this;a.addshortcutkey({Bold:"ctrl+66",Italic:"ctrl+73",Underline:"ctrl+shift+85",strikeThrough:"ctrl+shift+83"});a.addOutputRule(function(a){g.each(a.getNodesByTagName("b i u strike s"),function(a,b){switch(b.tagName){case "b":b.tagName="strong";break;case "i":b.tagName="em";break;case "u":b.tagName="span";b.setStyle("text-decoration","underline");break;
+case "s":case "strike":b.tagName="span",b.setStyle("text-decoration","line-through")}})});g.each("bold underline superscript subscript italic strikethrough".split(" "),function(b,c){a.commands[c]={execCommand:function(a){var b=this.selection.getRange();return b.collapsed&&1!=this.queryCommandState(a)?(a=this.document.createElement({bold:"strong",underline:"u",superscript:"sup",subscript:"sub",italic:"em",strikethrough:"strike"}[a]),b.insertNode(a).setStart(a,0).setCursor(!1),!0):this.document.execCommand(a)},
+queryCommandState:function(a){if(m.gecko)return this.document.queryCommandState(a);var b=this.selection.getStartElementPath(),c=!1;g.each(b,function(b,e){switch(a){case "bold":if("STRONG"==e.nodeName||"B"==e.nodeName)return c=1,!1;break;case "underline":if("U"==e.nodeName||"SPAN"==e.nodeName&&"underline"==g(e).css("text-decoration"))return c=1,!1;break;case "superscript":if("SUP"==e.nodeName)return c=1,!1;break;case "subscript":if("SUB"==e.nodeName)return c=1,!1;break;case "italic":if("EM"==e.nodeName||
+"I"==e.nodeName)return c=1,!1;break;case "strikethrough":if("S"==e.nodeName||"STRIKE"==e.nodeName||"SPAN"==e.nodeName&&"line-through"==g(e).css("text-decoration"))return c=1,!1}});return c}}})};UM.plugins.video=function(){function a(a,b,f,h,l,g){return g?'<embed type="application/x-shockwave-flash" class="edui-faked-video" pluginspage="http://www.macromedia.com/go/getflashplayer" src="'+a+'" width="'+b+'" height="'+f+'"'+(l?' style="float:'+l+'"':"")+' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >':
+"<img "+(h?'id="'+h+'"':"")+' width="'+b+'" height="'+f+'" _url="'+a+'" class="edui-faked-video" src="'+c.options.UMEDITOR_HOME_URL+'themes/default/images/spacer.gif" style="background:url('+c.options.UMEDITOR_HOME_URL+"themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;"+(l?"float:"+l+";":"")+'" />'}function b(b,c){n.each(b.getNodesByTagName(c?"img":"embed"),function(b){if("edui-faked-video"==b.getAttr("class")){var d=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),
+b.getAttr("height"),null,b.getStyle("float")||"",c);b.parentNode.replaceChild(UM.uNode.createElement(d),b)}})}var c=this;c.addOutputRule(function(a){b(a,!0)});c.addInputRule(function(a){b(a)});c.commands.insertvideo={execCommand:function(b,e){e=n.isArray(e)?e:[e];for(var f=[],h=0,l,g=e.length;h<g;h++)l=e[h],f.push(a(l.url,l.width||420,l.height||280,"tmpVedio"+h,l.align,!1));c.execCommand("inserthtml",f.join(""),!0)},queryCommandState:function(){var a=c.selection.getRange().getClosedNode();return a&&
+"edui-faked-video"==a.className?1:0}}};UM.plugins.selectall=function(){this.commands.selectall={execCommand:function(){var a=this.body,b=this.selection.getRange();b.selectNodeContents(a);k.isEmptyBlock(a)&&(m.opera&&a.firstChild&&1==a.firstChild.nodeType&&b.setStartAtFirst(a.firstChild),b.collapse(!0));b.select(!0)},notNeedUndo:1};this.addshortcutkey({selectAll:"ctrl+65"})};UM.plugins.removeformat=function(){this.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"});this.commands.removeformat={execCommand:function(a,b,c,d,e){function f(a){if(3==a.nodeType||"span"!=a.tagName.toLowerCase())return 0;if(m.ie){var b=a.attributes;if(b.length){a=0;for(var c=b.length;a<c;a++)if(b[a].specified)return 0;return 1}}return!a.attributes.length}function h(a){var b=a.createBookmark();a.collapsed&&a.enlarge(!0);if(!e){var d=k.findParentByTagName(a.startContainer,"a",!0);d&&a.setStartBefore(d);(d=k.findParentByTagName(a.endContainer,
+"a",!0))&&a.setEndAfter(d)}p=a.createBookmark();for(d=p.start;(r=d.parentNode)&&!k.isBlockElm(r);)k.breakParent(d,r),k.clearEmptySibling(d);if(p.end){for(d=p.end;(r=d.parentNode)&&!k.isBlockElm(r);)k.breakParent(d,r),k.clearEmptySibling(d);for(var d=k.getNextDomNode(p.start,!1,n),h;d&&d!=p.end;)h=k.getNextDomNode(d,!0,n),q.$empty[d.tagName.toLowerCase()]||k.isBookmarkNode(d)||(l.test(d.tagName)?c?(k.removeStyle(d,c),f(d)&&"text-decoration"!=c&&k.remove(d,!0)):k.remove(d,!0):q.$tableContent[d.tagName]||
+q.$list[d.tagName]||(k.removeAttributes(d,g),f(d)&&k.remove(d,!0))),d=h}d=p.start.parentNode;!k.isBlockElm(d)||q.$tableContent[d.tagName]||q.$list[d.tagName]||k.removeAttributes(d,g);d=p.end.parentNode;p.end&&k.isBlockElm(d)&&!q.$tableContent[d.tagName]&&!q.$list[d.tagName]&&k.removeAttributes(d,g);a.moveToBookmark(p).moveToBookmark(b);d=a.startContainer;for(h=a.collapsed;1==d.nodeType&&k.isEmptyNode(d)&&q.$removeEmpty[d.tagName];)b=d.parentNode,a.setStartBefore(d),a.startContainer===a.endContainer&&
+a.endOffset--,k.remove(d),d=b;if(!h)for(d=a.endContainer;1==d.nodeType&&k.isEmptyNode(d)&&q.$removeEmpty[d.tagName];)b=d.parentNode,a.setEndBefore(d),k.remove(d),d=b}var l=RegExp("^(?:"+(b||this.options.removeFormatTags).replace(/,/g,"|")+")$","i"),g=c?[]:(d||this.options.removeFormatAttributes).split(",");a=new B.Range(this.document);var p,r,n=function(a){return 1==a.nodeType};a=this.selection.getRange();a.collapsed||(h(a),a.select())}}};UM.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)&&(65<=e&&90>=e||48<=e&&57>=e||96<=e&&111>=e||{13:1,8:1,46:1}[e])){var h=f.startContainer;k.isFillChar(h)&&f.setStartBefore(h);h=f.endContainer;k.isFillChar(h)&&f.setEndAfter(h);f.txtToElmBoundary();f.endContainer&&1==f.endContainer.nodeType&&(h=f.endContainer.childNodes[f.endOffset])&&k.isBr(h)&&f.setEndAfter(h);if(0==f.startOffset&&(h=f.startContainer,k.isBoundaryNode(h,"firstChild")&&
+(h=f.endContainer,f.endOffset==(3==h.nodeType?h.nodeValue.length:h.childNodes.length)&&k.isBoundaryNode(h,"lastChild")))){a.fireEvent("saveScene");a.body.innerHTML="<p>"+(m.ie?"":"<br/>")+"</p>";f.setStart(a.body.firstChild,0).setCursor(!1,!0);a._selectionChange();return}}if(8==e){f=a.selection.getRange();b=f.collapsed;if(a.fireEvent("delkeydown",d))return;var l;f.collapsed&&f.inFillChar()&&(h=f.startContainer,k.isFillChar(h)?(f.setStartBefore(h).shrinkBoundary(!0).collapse(!0),k.remove(h)):(h.nodeValue=
+h.nodeValue.replace(RegExp("^"+k.fillChar),""),f.startOffset--,f.collapse(!0).select(!0)));if(h=f.getClosedNode()){a.fireEvent("saveScene");f.setStartBefore(h);k.remove(h);f.setCursor();a.fireEvent("saveScene");k.preventDefault(d);return}if(!m.ie&&(h=k.findParentByTagName(f.startContainer,"table",!0),l=k.findParentByTagName(f.endContainer,"table",!0),h&&!l||!h&&l||h!==l)){d.preventDefault();return}h=f.startContainer;f.collapsed&&1==h.nodeType&&(h=h.childNodes[f.startOffset-1])&&1==h.nodeType&&"BR"==
+h.tagName&&(a.fireEvent("saveScene"),f.setStartBefore(h).collapse(!0),k.remove(h),f.select(),a.fireEvent("saveScene"));if(m.chrome&&f.collapsed){for(;0==f.startOffset&&!k.isEmptyBlock(f.startContainer);)f.setStartBefore(f.startContainer);(h=f.startContainer.childNodes[f.startOffset-1])&&"BR"==h.nodeName&&(f.setStartBefore(h),a.fireEvent("saveScene"),g(h).remove(),f.setCursor(),a.fireEvent("saveScene"))}}if(m.gecko&&46==e&&(e=a.selection.getRange(),e.collapsed&&(h=e.startContainer,k.isEmptyBlock(h)))){for(e=
+h.parentNode;1==k.getChildCount(e)&&!k.isBody(e);)h=e,e=e.parentNode;h===e.lastChild&&d.preventDefault()}});a.addListener("keyup",function(a,d){var e;if(8==(d.keyCode||d.which)&&!this.fireEvent("delkeyup")){e=this.selection.getRange();if(e.collapsed){var f;if((f=k.findParentByTagName(e.startContainer,"h1 h2 h3 h4 h5 h6".split(" "),!0))&&k.isEmptyBlock(f)){var h=f.previousSibling;if(h&&"TABLE"!=h.nodeName){k.remove(f);e.setStartAtLast(h).setCursor(!1,!0);return}if((h=f.nextSibling)&&"TABLE"!=h.nodeName){k.remove(f);
+e.setStartAtFirst(h).setCursor(!1,!0);return}}k.isBody(e.startContainer)&&(f=k.createElement(this.document,"p",{innerHTML:m.ie?k.fillChar:"<br/>"}),e.insertNode(f).setStart(f,0).setCursor(!1,!0))}!b&&(3==e.startContainer.nodeType||1==e.startContainer.nodeType&&k.isEmptyBlock(e.startContainer))&&(m.ie?(f=e.document.createElement("span"),e.insertNode(f).setStartBefore(f).collapse(!0),e.select(),k.remove(f)):e.select())}})};UM.plugins.autosave=function(){function a(a){var l=null;new Date-c<d||(a.hasContents()?
+(c=new Date,a._saveFlag=null,l=b.body.innerHTML,!1!==a.fireEvent("beforeautosave",{content:l})&&(f.saveLocalData(e,l),a.fireEvent("afterautosave",{content:l}))):e&&f.removeItem(e))}var b=this,c=new Date,d=20,e=null;b.setOpt("saveInterval",500);var f=UM.LocalStorage=function(){function a(){var b=document.createElement("div");b.style.display="none";if(!b.addBehavior)return null;b.addBehavior("#default#userdata");return{getItem:function(a){var d=null;try{document.body.appendChild(b),b.load(c),d=b.getAttribute(a),
+document.body.removeChild(b)}catch(e){}return d},setItem:function(a,d){document.body.appendChild(b);b.setAttribute(a,d);b.save(c);document.body.removeChild(b)},removeItem:function(a){document.body.appendChild(b);b.removeAttribute(a);b.save(c);document.body.removeChild(b)}}}var b=window.localStorage||a()||null,c="localStorage";return{saveLocalData:function(a,c){return b&&c?(b.setItem(a,c),!0):!1},getLocalData:function(a){return b?b.getItem(a):null},removeItem:function(a){b&&b.removeItem(a)}}}();b.addListener("ready",
+function(){var a=null,a=b.key?b.key+"-drafts-data":(b.container.parentNode.id||"ue-common")+"-drafts-data";e=(location.protocol+location.host+location.pathname).replace(/[.:\/]/g,"_")+a});b.addListener("contentchange",function(){e&&(b._saveFlag&&window.clearTimeout(b._saveFlag),0<b.options.saveInterval?b._saveFlag=window.setTimeout(function(){a(b)},b.options.saveInterval):a(b))});b.commands.clearlocaldata={execCommand:function(a,b){e&&f.getLocalData(e)&&f.removeItem(e)},notNeedUndo:!0,ignoreContentChange:!0};
+b.commands.getlocaldata={execCommand:function(a,b){return e?f.getLocalData(e)||"":""},notNeedUndo:!0,ignoreContentChange:!0};b.commands.drafts={execCommand:function(a,c){e&&(b.body.innerHTML=f.getLocalData(e)||"<p>"+(m.ie?"&nbsp;":"<br/>")+"</p>",b.focus(!0))},queryCommandState:function(){return e?null===f.getLocalData(e)?-1:0:-1},notNeedUndo:!0,ignoreContentChange:!0}};UM.plugins.autoupload=function(){var a=this;a.setOpt("pasteImageEnabled",!0);a.setOpt("dropFileEnabled",!0);var b=function(b,d){var e=
+new FormData;e.append(d.options.imageFieldName||"upfile",b,b.name||"blob."+b.type.substr(6));e.append("type","ajax");var f=new XMLHttpRequest;f.open("post",a.options.imageUrl,!0);f.setRequestHeader("X-Requested-With","XMLHttpRequest");f.addEventListener("load",function(b){try{var c=eval("("+b.target.response+")").url,e=a.options.imagePath+c;d.execCommand("insertimage",{src:e,_src:e})}catch(f){}});f.send(e)};a.addListener("ready",function(){if(window.FormData&&window.FileReader){var c=function(c){var e=
+!1;"paste"==c.type?(c=c.originalEvent,c=c.clipboardData&&c.clipboardData.items&&1==c.clipboardData.items.length&&/^image\//.test(c.clipboardData.items[0].type)?c.clipboardData.items:null):(c=c.originalEvent,c=c.dataTransfer&&c.dataTransfer.files?c.dataTransfer.files:null);if(c){for(var f=c.length,h;f--;)h=c[f],h.getAsFile&&(h=h.getAsFile()),h&&0<h.size&&/image\/\w+/i.test(h.type)&&(b(h,a),e=!0);if(e)return!1}};a.getOpt("pasteImageEnabled")&&a.$body.on("paste",c);a.getOpt("dropFileEnabled")&&a.$body.on("drop",
+c);a.$body.on("dragover",function(a){if("Files"==a.originalEvent.dataTransfer.types[0])return!1})}})};UM.plugins.formula=function(){function a(){return c.$body.find("iframe.edui-formula-active")[0]||null}function b(){var b=a();b&&b.contentWindow.formula.blur()}var c=this;c.addInputRule(function(a){g.each(a.getNodesByTagName("span"),function(a,b){if(b.hasClass("mathquill-embedded-latex")){for(var d,l="";d=b.firstChild();)l+=d.data,b.removeChild(d);b.tagName="iframe";b.setAttr({frameborder:"0",src:c.getOpt("UMEDITOR_HOME_URL")+
+"dialogs/formula/formula.html","data-latex":n.unhtml(l)})}})});c.addOutputRule(function(a){g.each(a.getNodesByTagName("iframe"),function(a,b){b.hasClass("mathquill-embedded-latex")&&(b.tagName="span",b.appendChild(UM.uNode.createText(b.getAttr("data-latex"))),b.setAttr({frameborder:"",src:"","data-latex":""}))})});c.addListener("click",function(){b()});c.addListener("afterexeccommand",function(a,c){"formula"!=c&&b()});c.commands.formula={execCommand:function(b,e){var f=a();f?f.contentWindow.formula.insertLatex(e):
+(c.execCommand("inserthtml",'<span class="mathquill-embedded-latex">'+e+"</span>"),m.ie&&m.ie9below&&setTimeout(function(){var a=c.selection.getRange(),b=a.startContainer;1!=b.nodeType||b.childNodes[a.startOffset]||(a.insertNode(c.document.createTextNode(" ")),a.setCursor())},100))},queryCommandState:function(a){return 0},queryCommandValue:function(b){return(b=a())&&b.contentWindow.formula.getLatex()}}};(function(a){function b(b,c,d){b.prototype=a.extend2(a.extend({},c),(UM.ui[d]||e).prototype,!0);
+b.prototype.supper=(UM.ui[d]||e).prototype;UM.ui[d]&&UM.ui[d].prototype.defaultOpt&&(b.prototype.defaultOpt=a.extend({},UM.ui[d].prototype.defaultOpt,b.prototype.defaultOpt||{}));return b}function c(b,c){a[f+c]=b;a.fn[f+c]=function(c){var d,e=Array.prototype.slice.call(arguments,1);this.each(function(f,h){var g=a(h),k=g.edui();k||(b(c&&a.isPlainObject(c)?c:{},g),g.edui(k));if("string"==a.type(c))if("this"==c)d=k;else{d=k[c].apply(k,e);if(d!==k&&void 0!==d)return!1;d=null}});return null!==d?d:this}}
+a.parseTmpl=function(a,b){var c="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/<%=([\s\S]+?)%>/g,function(a,b){return"',"+b.replace(/\\'/g,"'")+",'"}).replace(/<%([\s\S]+?)%>/g,function(a,b){return"');"+b.replace(/\\'/g,"'").replace(/[\r\n\t]/g," ")+"__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",c=new Function("obj",c);return b?c(b):c};a.extend2=function(b,
+c){for(var d=arguments,e="boolean"==a.type(d[d.length-1])?d[d.length-1]:!1,f="boolean"==a.type(d[d.length-1])?d.length-1:d.length,h=1;h<f;h++){var g=d[h],k;for(k in g)e&&b.hasOwnProperty(k)||(b[k]=g[k])}return b};a.IE6=!!window.ActiveXObject&&6==parseFloat(navigator.userAgent.match(/msie (\d+)/i)[1]);var d=[],e=function(){},f="edui";e.prototype={on:function(b,c){this.root().on(b,a.proxy(c,this));return this},off:function(b,c){this.root().off(b,a.proxy(c,this));return this},trigger:function(a,b){return!1===
+this.root().trigger(a,b)?!1:this},root:function(a){return this._$el||(this._$el=a)},destroy:function(){},data:function(a,b){return void 0!==b?(this.root().data(f+a,b),this):this.root().data(f+a)},register:function(b,c,e){d.push({evtname:b,$els:a.isArray(c)?c:[c],handler:a.proxy(e,c)})}};a.fn.edui=function(a){return a?this.data("eduiwidget",a):this.data("eduiwidget")};var h=1;UM.ui={define:function(d,e,g){var k=UM.ui[d]=b(function(b,c){var e=function(){};a.extend(e.prototype,k.prototype,{guid:d+h++,
+widgetName:d});e=new e;if("string"==a.type(b))return e.init&&e.init({}),e.root().edui(e),e.root().find("a").click(function(a){a.preventDefault()}),e.root()[f+d].apply(e.root(),arguments);c&&e.root(c);e.init&&e.init(!b||a.isPlainObject(b)?a.extend2(b||{},e.defaultOpt||{},!0):b);try{e.root().find("a").click(function(a){a.preventDefault()})}catch(g){}return e.root().edui(e)},e,g);c(k,d)}};a(function(){a(document).on("click mouseup mousedown dblclick mouseover",function(b){a.each(d,function(c,d){d.evtname==
+b.type&&a.each(d.$els,function(c,e){e[0]===b.target||a.contains(e[0],b.target)||d.handler(b)})})})})})(jQuery);UM.ui.define("button",{tpl:'<<%if(!texttype){%>div class="edui-btn edui-btn-<%=icon%> <%if(name){%>edui-btn-name-<%=name%><%}%>" unselectable="on" onmousedown="return false" <%}else{%>a class="edui-text-btn"<%}%><% if(title) {%> data-original-title="<%=title%>" <%};%>> <% if(icon) {%><div unselectable="on" class="edui-icon-<%=icon%> edui-icon"></div><% }; %><%if(text) {%><span unselectable="on" onmousedown="return false" class="edui-button-label"><%=text%></span><%}%><%if(caret && text){%><span class="edui-button-spacing"></span><%}%><% if(caret) {%><span unselectable="on" onmousedown="return false" class="edui-caret"></span><% };%></<%if(!texttype){%>div<%}else{%>a<%}%>>',
+defaultOpt:{text:"",title:"",icon:"",width:"",caret:!1,texttype:!1,click:function(){}},init:function(a){var b=this;b.root(g(g.parseTmpl(b.tpl,a))).click(function(c){b.wrapclick(a.click,c)});b.root().hover(function(){b.root().hasClass("edui-disabled")||b.root().toggleClass("edui-hover")});return b},wrapclick:function(a,b){this.disabled()||(this.root().trigger("wrapclick"),g.proxy(a,this,b)());return this},label:function(a){if(void 0===a)return this.root().find(".edui-button-label").text();this.root().find(".edui-button-label").text(a);
+return this},disabled:function(a){if(void 0===a)return this.root().hasClass("edui-disabled");this.root().toggleClass("edui-disabled",a);this.root().hasClass("edui-disabled")&&this.root().removeClass("edui-hover");return this},active:function(a){if(void 0===a)return this.root().hasClass("edui-active");this.root().toggleClass("edui-active",a);return this},mergeWith:function(a){var b=this;b.data("$mergeObj",a);a.edui().data("$mergeObj",b.root());g.contains(document.body,a[0])||a.appendTo(b.root());b.on("click",
+function(){b.wrapclick(function(){a.edui().show()})}).register("click",b.root(),function(b){a.hide()})}});(function(){UM.ui.define("toolbar",{tpl:'<div class="edui-toolbar"  ><div class="edui-btn-toolbar" unselectable="on" onmousedown="return false"  ></div></div>',init:function(){var a=this.root(g(this.tpl));this.data("$btnToolbar",a.find(".edui-btn-toolbar"))},appendToBtnmenu:function(a){var b=this.data("$btnToolbar");a=g.isArray(a)?a:[a];g.each(a,function(a,d){b.append(d)})}})})();UM.ui.define("menu",
+{show:function(a,b,c,d,e){c=c||"position";!1!==this.trigger("beforeshow")&&(this.root().css(g.extend({display:"block"},a?{top:a[c]().top+("right"==b?0:a.outerHeight())-(d||0),left:a[c]().left+("right"==b?a.outerWidth():0)-(e||0)}:{})),this.trigger("aftershow"))},hide:function(a){var b;!1!==this.trigger("beforehide")&&((b=this.root().data("parentmenu"))&&(b.data("parentmenu")||a)&&b.edui().hide(),this.root().css("display","none"),this.trigger("afterhide"))},attachTo:function(a){var b=this;a.data("$mergeObj")||
+(a.data("$mergeObj",b.root()),a.on("wrapclick",function(a){b.show()}),b.register("click",a,function(a){b.hide()}),b.data("$mergeObj",a))}});UM.ui.define("dropmenu",{tmpl:'<ul class="edui-dropdown-menu" aria-labelledby="dropdownMenu" ><%for(var i=0,ci;ci=data[i++];){%><%if(ci.divider){%><li class="edui-divider"></li><%}else{%><li <%if(ci.active||ci.disabled){%>class="<%= ci.active|| \'\' %> <%=ci.disabled||\'\' %>" <%}%> data-value="<%= ci.value%>"><a href="#" tabindex="-1"><em class="edui-dropmenu-checkbox"><i class="edui-icon-ok"></i></em><%= ci.label%></a></li><%}%><%}%></ul>',
+defaultOpt:{data:[],click:function(){}},init:function(a){var b=this,c={click:1,mouseover:1,mouseout:1};this.root(g(g.parseTmpl(this.tmpl,a))).on("click",'li[class!="edui-disabled edui-divider edui-dropdown-submenu"]',function(c){g.proxy(a.click,b,c,g(this).data("value"),g(this))()}).find("li").each(function(d,e){var f=g(this);if(!f.hasClass("edui-disabled edui-divider edui-dropdown-submenu")){var h=a.data[d];g.each(c,function(a){h[a]&&f[a](function(c){g.proxy(h[a],e)(c,h,b.root)})})}})},disabled:function(a){g("li[class!=edui-divider]",
+this.root()).each(function(){var b=g(this);!0===a?b.addClass("edui-disabled"):g.isFunction(a)?b.toggleClass("edui-disabled",a(li)):b.removeClass("edui-disabled")})},val:function(a){var b;g('li[class!="edui-divider edui-disabled edui-dropdown-submenu"]',this.root()).each(function(){var c=g(this);if(void 0===a){if(c.find("em.edui-dropmenu-checked").length)return b=c.data("value"),!1}else c.find("em").toggleClass("edui-dropmenu-checked",c.data("value")==a)});if(void 0===a)return b},addSubmenu:function(a,
+b,c){c=c||0;var d=g("li[class!=edui-divider]",this.root());a=g('<li class="edui-dropdown-submenu"><a tabindex="-1" href="#">'+a+"</a></li>").append(b);0<=c&&c<d.length?a.insertBefore(d[c]):0>c?a.insertBefore(d[0]):c>=d.length&&a.appendTo(d)}},"menu");UM.ui.define("splitbutton",{tpl:'<div class="edui-splitbutton <%if (name){%>edui-splitbutton-<%= name %><%}%>"  unselectable="on" <%if(title){%>data-original-title="<%=title%>"<%}%>><div class="edui-btn"  unselectable="on" ><%if(icon){%><div  unselectable="on" class="edui-icon-<%=icon%> edui-icon"></div><%}%><%if(text){%><%=text%><%}%></div><div  unselectable="on" class="edui-btn edui-dropdown-toggle" ><div  unselectable="on" class="edui-caret"></div></div></div>',
+defaultOpt:{text:"",title:"",click:function(){}},init:function(a){var b=this;b.root(g(g.parseTmpl(b.tpl,a)));b.root().find(".edui-btn:first").click(function(c){b.disabled()||g.proxy(a.click,b)()});b.root().find(".edui-dropdown-toggle").click(function(){b.disabled()||b.trigger("arrowclick")});b.root().hover(function(){b.root().hasClass("edui-disabled")||b.root().toggleClass("edui-hover")});return b},wrapclick:function(a,b){this.disabled()||g.proxy(a,this,b)();return this},disabled:function(a){if(void 0===
+a)return this.root().hasClass("edui-disabled");this.root().toggleClass("edui-disabled",a).find(".edui-btn").toggleClass("edui-disabled",a);return this},active:function(a){if(void 0===a)return this.root().hasClass("edui-active");this.root().toggleClass("edui-active",a).find(".edui-btn:first").toggleClass("edui-active",a);return this},mergeWith:function(a){var b=this;b.data("$mergeObj",a);a.edui().data("$mergeObj",b.root());g.contains(document.body,a[0])||a.appendTo(b.root());b.root().delegate(".edui-dropdown-toggle",
+"click",function(){b.wrapclick(function(){a.edui().show()})});b.register("click",b.root().find(".edui-dropdown-toggle"),function(b){a.hide()})}});UM.ui.define("colorsplitbutton",{tpl:'<div class="edui-splitbutton <%if (name){%>edui-splitbutton-<%= name %><%}%>"  unselectable="on" <%if(title){%>data-original-title="<%=title%>"<%}%>><div class="edui-btn"  unselectable="on" ><%if(icon){%><div  unselectable="on" class="edui-icon-<%=icon%> edui-icon"></div><%}%><div class="edui-splitbutton-color-label" <%if (color) {%>style="background: <%=color%>"<%}%>></div><%if(text){%><%=text%><%}%></div><div  unselectable="on" class="edui-btn edui-dropdown-toggle" ><div  unselectable="on" class="edui-caret"></div></div></div>',
+defaultOpt:{color:""},init:function(a){this.supper.init.call(this,a)},colorLabel:function(){return this.root().find(".edui-splitbutton-color-label")}},"splitbutton");UM.ui.define("popup",{tpl:'<div class="edui-dropdown-menu edui-popup"<%if(!<%=stopprop%>){%>onmousedown="return false"<%}%>><div class="edui-popup-body" unselectable="on" onmousedown="return false"><%=subtpl%></div><div class="edui-popup-caret"></div></div>',defaultOpt:{stopprop:!1,subtpl:"",width:"",height:""},init:function(a){this.root(g(g.parseTmpl(this.tpl,
+a)));return this},mergeTpl:function(a){return g.parseTmpl(this.tpl,{subtpl:a})},show:function(a,b){b||(b={});var c=b.fnname||"position";!1!==this.trigger("beforeshow")&&(this.root().css(g.extend({display:"block"},a?{top:a[c]().top+("right"==b.dir?0:a.outerHeight())-(b.offsetTop||0),left:a[c]().left+("right"==b.dir?a.outerWidth():0)-(b.offsetLeft||0),position:"absolute"}:{})),this.root().find(".edui-popup-caret").css({top:b.caretTop||0,left:b.caretLeft||0,position:"absolute"}).addClass(b.caretDir||
+"up"),this.trigger("aftershow"))},hide:function(){this.root().css("display","none");this.trigger("afterhide")},attachTo:function(a,b){var c=this;a.data("$mergeObj")||(a.data("$mergeObj",c.root()),a.on("wrapclick",function(d){c.show(a,b)}),c.register("click",a,function(a){c.hide()}),c.data("$mergeObj",a))},getBodyContainer:function(){return this.root().find(".edui-popup-body")}});UM.ui.define("scale",{tpl:'<div class="edui-scale" unselectable="on"><span class="edui-scale-hand0"></span><span class="edui-scale-hand1"></span><span class="edui-scale-hand2"></span><span class="edui-scale-hand3"></span><span class="edui-scale-hand4"></span><span class="edui-scale-hand5"></span><span class="edui-scale-hand6"></span><span class="edui-scale-hand7"></span></div>',
+defaultOpt:{$doc:g(document),$wrap:g(document)},init:function(a){a.$doc&&(this.defaultOpt.$doc=a.$doc);a.$wrap&&(this.defaultOpt.$wrap=a.$wrap);this.root(g(g.parseTmpl(this.tpl,a)));this.initStyle();this.startPos=this.prePos={x:0,y:0};this.dragId=-1;return this},initStyle:function(){n.cssRule("edui-style-scale",".edui-scale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;}.edui-scale span{position:absolute;left:0;top:0;width:7px;height:7px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}.edui-scale .edui-scale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}.edui-scale .edui-scale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}.edui-scale .edui-scale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}.edui-scale .edui-scale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}.edui-scale .edui-scale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}.edui-scale .edui-scale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}.edui-scale .edui-scale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}.edui-scale .edui-scale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}")},
+_eventHandler:function(a){var b=this.defaultOpt.$doc;switch(a.type){case "mousedown":var c=a.target||a.srcElement;-1!=c.className.indexOf("edui-scale-hand")&&(this.dragId=c.className.slice(-1),this.startPos.x=this.prePos.x=a.clientX,this.startPos.y=this.prePos.y=a.clientY,b.bind("mousemove",g.proxy(this._eventHandler,this)));break;case "mousemove":-1!=this.dragId&&(this.updateContainerStyle(this.dragId,{x:a.clientX-this.prePos.x,y:a.clientY-this.prePos.y}),this.prePos.x=a.clientX,this.prePos.y=a.clientY,
+this.updateTargetElement());break;case "mouseup":-1!=this.dragId&&(this.dragId=-1,this.updateTargetElement(),this.data("$scaleTarget").parent()&&this.attachTo(this.data("$scaleTarget"))),b.unbind("mousemove",g.proxy(this._eventHandler,this))}},updateTargetElement:function(){var a=this.root(),b=this.data("$scaleTarget");b.css({width:a.width(),height:a.height()});this.attachTo(b)},updateContainerStyle:function(a,b){var c=this.root(),d,e=[[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]];0!=e[a][0]&&(d=parseInt(c.offset().left)+b.x,c.css("left",this._validScaledProp("left",d)));0!=e[a][1]&&(d=parseInt(c.offset().top)+b.y,c.css("top",this._validScaledProp("top",d)));0!=e[a][2]&&(d=c.width()+e[a][2]*b.x,c.css("width",this._validScaledProp("width",d)));0!=e[a][3]&&(d=c.height()+e[a][3]*b.y,c.css("height",this._validScaledProp("height",d)))},_validScaledProp:function(a,b){var c=this.root(),d=this.defaultOpt.$doc,e=function(a,c,d){return a+c>d?d-c:b};b=isNaN(b)?
+0:b;switch(a){case "left":return 0>b?0:e(b,c.width(),d.width());case "top":return 0>b?0:e(b,c.height(),d.height());case "width":return 0>=b?1:e(b,c.offset().left,d.width());case "height":return 0>=b?1:e(b,c.offset().top,d.height())}},show:function(a){a&&this.attachTo(a);this.root().bind("mousedown",g.proxy(this._eventHandler,this));this.defaultOpt.$doc.bind("mouseup",g.proxy(this._eventHandler,this));this.root().show();this.trigger("aftershow")},hide:function(){this.root().unbind("mousedown",g.proxy(this._eventHandler,
+this));this.defaultOpt.$doc.unbind("mouseup",g.proxy(this._eventHandler,this));this.root().hide();this.trigger("afterhide")},attachTo:function(a){var b=a.offset(),c=this.root(),d=this.defaultOpt.$wrap,e=d.offset();this.data("$scaleTarget",a);this.root().css({position:"absolute",width:a.width(),height:a.height(),left:b.left-e.left-parseInt(d.css("border-left-width"))-parseInt(c.css("border-left-width")),top:b.top-e.top-parseInt(d.css("border-top-width"))-parseInt(c.css("border-top-width"))})},getScaleTarget:function(){return this.data("$scaleTarget")[0]}});
+UM.ui.define("colorpicker",{tpl:function(a){for(var b="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(" "),
+c='<div unselectable="on" onmousedown="return false" class="edui-colorpicker<%if (name){%> edui-colorpicker-<%=name%><%}%>" ><table unselectable="on" onmousedown="return false"><tr><td colspan="10">'+a.lang_themeColor+'</td> </tr><tr class="edui-colorpicker-firstrow" >',d=0;d<b.length;d++)d&&0===d%10&&(c+="</tr>"+(60==d?'<tr><td colspan="10">'+a.lang_standardColor+"</td></tr>":"")+"<tr"+(60==d?' class="edui-colorpicker-firstrow"':"")+">"),c+=70>d?'<td><a unselectable="on" onmousedown="return false" title="'+
+b[d]+'" class="edui-colorpicker-colorcell" data-color="#'+b[d]+'" style="background-color:#'+b[d]+";border:solid #ccc;"+(10>d||60<=d?"border-width:1px;":10<=d&&20>d?"border-width:1px 1px 0 1px;":"border-width:0 1px 0 1px;")+'"></a></td>':"";return c+"</tr></table></div>"},init:function(a){var b=this;b.root(g(g.parseTmpl(b.supper.mergeTpl(b.tpl(a)),a)));b.root().on("click",function(a){b.trigger("pickcolor",g(a.target).data("color"))})}},"popup");(function(){UM.ui.define("combobox",function(){return{tpl:'<ul class="dropdown-menu edui-combobox-menu<%if (comboboxName!==\'\') {%> edui-combobox-<%=comboboxName%><%}%>" unselectable="on" onmousedown="return false" role="menu" aria-labelledby="dropdownMenu"><%if(autoRecord) {%><%for( var i=0, len = recordStack.length; i<len; i++ ) {%><%var index = recordStack[i];%><li class="<%=itemClassName%><%if( selected == index ) {%> edui-combobox-checked<%}%>" data-item-index="<%=index%>" unselectable="on" onmousedown="return false"><span class="edui-combobox-icon" unselectable="on" onmousedown="return false"></span><label class="<%=labelClassName%>" style="<%=itemStyles[ index ]%>" unselectable="on" onmousedown="return false"><%=items[index]%></label></li><%}%><%if( i ) {%><li class="edui-combobox-item-separator"></li><%}%><%}%><%for( var i=0, label; label = items[i]; i++ ) {%><li class="<%=itemClassName%><%if( selected == i ) {%> edui-combobox-checked<%}%> edui-combobox-item-<%=i%>" data-item-index="<%=i%>" unselectable="on" onmousedown="return false"><span class="edui-combobox-icon" unselectable="on" onmousedown="return false"></span><label class="<%=labelClassName%>" style="<%=itemStyles[ i ]%>" unselectable="on" onmousedown="return false"><%=label%></label></li><%}%></ul>',
+defaultOpt:{recordStack:[],items:[],value:[],comboboxName:"",selected:"",autoRecord:!0,recordCount:5},init:function(a){g.extend(this._optionAdaptation(a),this._createItemMapping(a.recordStack,a.items),{itemClassName:"edui-combobox-item",iconClass:"edui-combobox-checked-icon",labelClassName:"edui-combobox-item-label"});this._transStack(a);this.root(g(g.parseTmpl(this.tpl,a)));this.data("options",a).initEvent()},initEvent:function(){this.initSelectItem();this.initItemActive()},initSelectItem:function(){var a=
+this;a.root().delegate(".edui-combobox-item","click",function(){var b=g(this),c=b.attr("data-item-index");a.trigger("comboboxselect",{index:c,label:b.find(".edui-combobox-item-label").text(),value:a.data("options").value[c]}).select(c);a.hide();return!1})},initItemActive:function(){var a={mouseenter:"addClass",mouseleave:"removeClass"};if(g.IE6)this.root().delegate(".edui-combobox-item","mouseenter mouseleave",function(b){g(this)[a[b.type]]("edui-combobox-item-hover")}).one("afterhide",function(){})},
+select:function(a){var b=this.data("options").itemCount,c=this.data("options").autowidthitem;c&&!c.length&&(c=this.data("options").items);if(0==b)return null;0>a?a=b+a%b:a>=b&&(a=b-1);this.trigger("changebefore",c[a]);this._update(a);this.trigger("changeafter",c[a]);return null},selectItemByLabel:function(a){var b=this.data("options").itemMapping,c=this,d=null;!g.isArray(a)&&(a=[a]);g.each(a,function(a,f){d=b[f];if(void 0!==d)return c.select(d),!1})},_transStack:function(a){var b=[],c=-1,d=-1;g.each(a.recordStack,
+function(e,f){c=a.itemMapping[f];g.isNumeric(c)&&(b.push(c),f==a.selected&&(d=c))});a.recordStack=b;a.selected=d;b=null},_optionAdaptation:function(a){if(!("itemStyles"in a)){a.itemStyles=[];for(var b=0,c=a.items.length;b<c;b++)a.itemStyles.push("")}a.autowidthitem=a.autowidthitem||a.items;a.itemCount=a.items.length;return a},_createItemMapping:function(a,b){var c={},d={recordStack:[],mapping:{}};g.each(b,function(a,b){c[b]=a});d.itemMapping=c;g.each(a,function(a,b){void 0!==c[b]&&(d.recordStack.push(c[b]),
+d.mapping[b]=c[b])});return d},_update:function(a){var b=this.data("options"),c=[],d=null;g.each(b.recordStack,function(b,d){d!=a&&c.push(d)});c.unshift(a);c.length>b.recordCount&&(c.length=b.recordCount);b.recordStack=c;b.selected=a;d=g(g.parseTmpl(this.tpl,b));this.root().html(d.html());c=d=null}}}(),"menu")})();(function(){UM.ui.define("buttoncombobox",function(){return{defaultOpt:{label:"",title:""},init:function(a){var b=this,c=g.eduibutton({caret:!0,name:a.comboboxName,title:a.title,text:a.label,
+click:function(){b.show(this.root())}});b.supper.init.call(b,a);b.on("changebefore",function(a,b){c.eduibutton("label",b)});b.data("button",c);b.attachTo(c)},button:function(){return this.data("button")}}}(),"combobox")})();UM.ui.define("modal",{tpl:'<div class="edui-modal" tabindex="-1" ><div class="edui-modal-header"><div class="edui-close" data-hide="modal"></div><h3 class="edui-title"><%=title%></h3></div><div class="edui-modal-body"  style="<%if(width){%>width:<%=width%>px;<%}%><%if(height){%>height:<%=height%>px;<%}%>"> </div><% if(cancellabel || oklabel) {%><div class="edui-modal-footer"><div class="edui-modal-tip"></div><%if(oklabel){%><div class="edui-btn edui-btn-primary" data-ok="modal"><%=oklabel%></div><%}%><%if(cancellabel){%><div class="edui-btn" data-hide="modal"><%=cancellabel%></div><%}%></div><%}%></div>',
+defaultOpt:{title:"",cancellabel:"",oklabel:"",width:"",height:"",backdrop:!0,keyboard:!0},init:function(a){this.root(g(g.parseTmpl(this.tpl,a||{})));this.data("options",a);if(a.okFn)this.on("ok",g.proxy(a.okFn,this));if(a.cancelFn)this.on("beforehide",g.proxy(a.cancelFn,this));this.root().delegate('[data-hide="modal"]',"click",g.proxy(this.hide,this)).delegate('[data-ok="modal"]',"click",g.proxy(this.ok,this));g('[data-hide="modal"],[data-ok="modal"]',this.root()).hover(function(){g(this).toggleClass("edui-hover")})},
+toggle:function(){return this[this.data("isShown")?"hide":"show"]()},show:function(){var a=this;a.trigger("beforeshow");a.data("isShown")||(a.data("isShown",!0),a.escape(),a.backdrop(function(){a.autoCenter();a.root().show().focus().trigger("aftershow")}))},showTip:function(a){g(".edui-modal-tip",this.root()).html(a).fadeIn()},hideTip:function(a){g(".edui-modal-tip",this.root()).fadeOut(function(){g(this).html("")})},autoCenter:function(){!g.IE6&&this.root().css("margin-left",-(this.root().width()/
+2))},hide:function(){this.trigger("beforehide");this.data("isShown")&&(this.data("isShown",!1),this.escape(),this.hideModal())},escape:function(){var a=this;if(a.data("isShown")&&a.data("options").keyboard)a.root().on("keyup",function(b){27==b.which&&a.hide()});else a.data("isShown")||a.root().off("keyup")},hideModal:function(){var a=this;a.root().hide();a.backdrop(function(){a.removeBackdrop();a.trigger("afterhide")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove();this.$backdrop=
+null},backdrop:function(a){this.data("isShown")&&this.data("options").backdrop&&(this.$backdrop=g('<div class="edui-modal-backdrop" />').click("static"==this.data("options").backdrop?g.proxy(this.root()[0].focus,this.root()[0]):g.proxy(this.hide,this)));this.trigger("afterbackdrop");a&&a()},attachTo:function(a){var b=this;a.data("$mergeObj")||(a.data("$mergeObj",b.root()),a.on("click",function(){b.toggle(a)}),b.data("$mergeObj",a))},ok:function(){this.trigger("beforeok");!1!==this.trigger("ok",this)&&
+this.hide()},getBodyContainer:function(){return this.root().find(".edui-modal-body")}});UM.ui.define("tooltip",{tpl:'<div class="edui-tooltip" unselectable="on" onmousedown="return false"><div class="edui-tooltip-arrow" unselectable="on" onmousedown="return false"></div><div class="edui-tooltip-inner" unselectable="on" onmousedown="return false"></div></div>',init:function(a){this.root(g(g.parseTmpl(this.tpl,a||{})))},content:function(a){a=g(a.currentTarget).attr("data-original-title");this.root().find(".edui-tooltip-inner").text(a)},
+position:function(a){a=g(a.currentTarget);this.root().css(g.extend({display:"block"},a?{top:a.outerHeight(),left:(a.outerWidth()-this.root().outerWidth())/2}:{}))},show:function(a){g(a.currentTarget).hasClass("edui-disabled")||(this.content(a),this.root().appendTo(g(a.currentTarget)),this.position(a),this.root().css("display","block"))},hide:function(){this.root().css("display","none")},attachTo:function(a){function b(a){var b=this;g.contains(document.body,b.root()[0])||b.root().appendTo(a);b.data("tooltip",
+b.root());a.each(function(){if(g(this).attr("data-original-title"))g(this).on("mouseenter",g.proxy(b.show,b)).on("mouseleave click",g.proxy(b.hide,b))})}var c=this;"undefined"===g.type(a)?g("[data-original-title]").each(function(a,e){b.call(c,g(e))}):a.data("tooltip")||b.call(c,a)}});UM.ui.define("tab",{init:function(a){var b=this,c=a.selector;g.type(c)&&(b.root(g(c,a.context)),b.data("context",a.context),g(c,b.data("context")).on("click",function(a){b.show(a)}))},show:function(a){var b=this,c=g(a.target),
+d=c.closest("ul"),e,f;e=(e=c.attr("data-context"))&&e.replace(/.*(?=#[^\s]*$)/,"");a=c.parent("li");a.length&&!a.hasClass("edui-active")&&(f=d.find(".edui-active:last a")[0],a=g.Event("beforeshow",{target:c[0],relatedTarget:f}),b.trigger(a),a.isDefaultPrevented()||(e=g(e,b.data("context")),b.activate(c.parent("li"),d),b.activate(e,e.parent(),function(){b.trigger({type:"aftershow",relatedTarget:f})})))},activate:function(a,b,c){if(void 0===a)return g(".edui-tab-item.edui-active",this.root()).index();
+b.find("> .edui-active").removeClass("edui-active");a.addClass("edui-active");c&&c()}});UM.ui.define("separator",{tpl:'<div class="edui-separator" unselectable="on" onmousedown="return false" ></div>',init:function(a){this.root(g(g.parseTmpl(this.tpl,a)));return this}});(function(){var a={},b={},c=[],d={},e={},f={},h=null;n.extend(UM,{defaultWidth:500,defaultHeight:500,registerUI:function(b,c){n.each(b.split(/\s+/),function(b){a[b]=c})},setEditor:function(a){!b[a.id]&&(b[a.id]=a)},registerWidget:function(a,
+b,c){d[a]=g.extend2(b,{$root:"",_preventDefault:!1,root:function(a){return this.$root||(this.$root=a)},preventDefault:function(){this._preventDefault=!0},clear:!1});c&&(e[a]=c)},getWidgetData:function(a){return d[a]},setWidgetBody:function(a,b,c){c._widgetData||n.extend(c,{_widgetData:{},getWidgetData:function(a){return this._widgetData[a]},getWidgetCallback:function(a){var c=this;return function(){return e[a].apply(c,[c,b].concat(Array.prototype.slice.call(arguments,0)))}}});var f=d[a];if(!f)return null;
+f=c._widgetData[a];f||(f=d[a],f=c._widgetData[a]="function"==g.type(f)?f:n.clone(f));f.root(b.edui().getBodyContainer());f.initContent(c,b);f._preventDefault||f.initEvent(c,b);f.width&&b.width(f.width)},setActiveWidget:function(a){},getEditor:function(a,c){var d=b[a]||(b[a]=this.createEditor(a,c));h=h?Math.max(d.getOpt("zIndex"),h):d.getOpt("zIndex");return d},setTopEditor:function(a){g.each(b,function(b,c){a==c?a.$container&&a.$container.css("zIndex",h+1):c.$container&&c.$container.css("zIndex",
+c.getOpt("zIndex"))})},clearCache:function(a){b[a]&&delete b[a]},delEditor:function(a){var c;(c=b[a])&&c.destroy()},ready:function(a){c.push(a)},createEditor:function(a,b){function d(){var b=this.createUI("#"+a,e);e.key=a;e.ready(function(){g.each(c,function(a,b){g.proxy(b,e)()})});var f=e.options;f.minFrameWidth=f.initialFrameWidth?f.initialFrameWidth:f.initialFrameWidth=e.$body.width()||UM.defaultWidth;b.css({width:f.initialFrameWidth,zIndex:e.getOpt("zIndex")});UM.browser.ie&&6===UM.browser.version&&
+document.execCommand("BackgroundImageCache",!1,!0);e.render(a);g.eduitooltip&&g.eduitooltip("attachTo",g("[data-original-title]",b)).css("z-index",e.getOpt("zIndex")+1);b.find("a").click(function(a){a.preventDefault()});e.fireEvent("afteruiready")}var e=new UM.Editor(b);e.langIsReady?g.proxy(d,this)():e.addListener("langReady",g.proxy(d,this));return e},createUI:function(b,c){var d=g(b),e=g('<div class="edui-container"><div class="edui-editor-body"></div></div>').insertBefore(d);c.$container=e;c.container=
+e[0];c.$body=d;m.ie&&m.ie9above&&g('<span style="padding:0;margin:0;height:0;width:0"></span>').insertAfter(e);g.each(a,function(a,b){var d=b.call(c,a);d&&(f[a]=d)});e.find(".edui-editor-body").append(d).before(this.createToolbar(c.options,c));e.find(".edui-toolbar").append(g('<div class="edui-dialog-container"></div>'));return e},createToolbar:function(a,b){var c=g.eduitoolbar(),d=c.edui();if(a.toolbar&&a.toolbar.length){var e=[];g.each(a.toolbar,function(a,b){g.each(b.split(/\s+/),function(a,b){if("|"==
+b)g.eduiseparator&&e.push(g.eduiseparator());else{var c=f[b];"fullscreen"==b?c&&e.unshift(c):c&&e.push(c)}});e.length&&d.appendToBtnmenu(e)})}else c.find(".edui-btn-toolbar").remove();return c}})})();UM.registerUI("bold italic redo undo underline strikethrough superscript subscript insertorderedlist insertunorderedlist cleardoc selectall link unlink print preview justifyleft justifycenter justifyright justifyfull removeformat horizontal drafts",function(a){var b=this,c=g.eduibutton({icon:a,click:function(){b.execCommand(a)},
+title:this.getLang("labelMap")[a]||""});this.addListener("selectionchange",function(){var b=this.queryCommandState(a);c.edui().disabled(-1==b).active(1==b)});return c});(function(){function a(a){var b=this;if(!a)throw Error("invalid params, notfound editor");b.editor=a;h[a.uid]=this;a.addListener("destroy",function(){delete h[a.uid];b.editor=null})}var b={},c="width height position top left margin padding overflowX overflowY".split(" "),d={},e={},f={},h={};UM.registerUI("fullscreen",function(b){var c=
+this,d=g.eduibutton({icon:"fullscreen",title:c.options.labelMap&&c.options.labelMap[b]||c.getLang("labelMap."+b),click:function(){c.execCommand(b);UM.setTopEditor(c)}});c.addListener("selectionchange",function(){var a=this.queryCommandState(b);d.edui().disabled(-1==a).active(1==a)});c.addListener("ready",function(){c.options.fullscreen&&a.getInstance(c).toggle()});return d});UM.commands.fullscreen={execCommand:function(b){a.getInstance(this).toggle()},queryCommandState:function(a){return this._edui_fullscreen_status},
+notNeedUndo:1};a.prototype={toggle:function(){var a=this.editor,b=this.isFullState();a.fireEvent("beforefullscreenchange",!b);this.update(!b);b?this.revert():this.enlarge();a.fireEvent("afterfullscreenchange",!b);"true"===a.body.contentEditable&&a.fireEvent("fullscreenchanged",!b);a.fireEvent("selectionchange")},enlarge:function(){this.saveSataus();this.setDocumentStatus();this.resize()},revert:function(){var a=this.editor.options,a=/%$/.test(a.initialFrameHeight)?"100%":a.initialFrameHeight-this.getStyleValue("padding-top")-
+this.getStyleValue("padding-bottom")-this.getStyleValue("border-width");g.IE6&&this.getEditorHolder().style.setExpression("height","this.scrollHeight <= "+a+' ? "'+a+'px" : "auto"');this.revertContainerStatus();this.revertContentAreaStatus();this.revertDocumentStatus()},update:function(a){this.editor._edui_fullscreen_status=a},resize:function(){var a=null,b=a=0,c=0,d=0,e=this.editor,f=null,h=null;this.isFullState()&&(a=g(window),b=a.width(),a=a.height(),h=this.getEditorHolder(),c=parseInt(k.getComputedStyle(h,
+"border-width"),10)||0,c+=parseInt(k.getComputedStyle(e.container,"border-width"),10)||0,d+=parseInt(k.getComputedStyle(h,"padding-left"),10)+parseInt(k.getComputedStyle(h,"padding-right"),10)||0,g.IE6&&h.style.setExpression("height",null),f=this.getBound(),g(e.container).css({width:b+"px",height:a+"px",position:g.IE6?"absolute":"fixed",top:f.top,left:f.left,margin:0,padding:0,overflowX:"hidden",overflowY:"hidden"}),g(h).css({width:b-2*c-d+"px",height:a-2*c-(e.options.withoutToolbar?0:g(".edui-toolbar",
+e.container).outerHeight())-g(".edui-bottombar",e.container).outerHeight()+"px",overflowX:"hidden",overflowY:"auto"}))},saveSataus:function(){for(var a=this.editor.container.style,d=null,e={},f=0,h=c.length;f<h;f++)d=c[f],e[d]=a[d];b[this.editor.uid]=e;this.saveContentAreaStatus();this.saveDocumentStatus()},saveContentAreaStatus:function(){var a=g(this.getEditorHolder());d[this.editor.uid]={width:a.css("width"),overflowX:a.css("overflowX"),overflowY:a.css("overflowY"),height:a.css("height")}},saveDocumentStatus:function(){var a=
+g(this.getEditorDocumentBody());e[this.editor.uid]={overflowX:a.css("overflowX"),overflowY:a.css("overflowY")};f[this.editor.uid]={overflowX:g(this.getEditorDocumentElement()).css("overflowX"),overflowY:g(this.getEditorDocumentElement()).css("overflowY")}},revertContainerStatus:function(){g(this.editor.container).css(this.getEditorStatus())},revertContentAreaStatus:function(){var a=this.getEditorHolder(),b=this.getContentAreaStatus();this.supportMin()&&(delete b.height,a.style.height=null);g(a).css(b)},
+revertDocumentStatus:function(){var a=this.getDocumentStatus();g(this.getEditorDocumentBody()).css("overflowX",a.body.overflowX);g(this.getEditorDocumentElement()).css("overflowY",a.html.overflowY)},setDocumentStatus:function(){g(this.getEditorDocumentBody()).css({overflowX:"hidden",overflowY:"hidden"});g(this.getEditorDocumentElement()).css({overflowX:"hidden",overflowY:"hidden"})},isFullState:function(){return!!this.editor._edui_fullscreen_status},getEditorStatus:function(){return b[this.editor.uid]},
+getContentAreaStatus:function(){return d[this.editor.uid]},getEditorDocumentElement:function(){return this.editor.container.ownerDocument.documentElement},getEditorDocumentBody:function(){return this.editor.container.ownerDocument.body},getEditorHolder:function(){return this.editor.body},getDocumentStatus:function(){return{body:e[this.editor.uid],html:f[this.editor.uid]}},supportMin:function(){var a=null;this._support||(a=document.createElement("div"),this._support="minWidth"in a.style);return this._support},
+getBound:function(){var a={html:!0,body:!0},b={top:0,left:0},c=null;if(!g.IE6)return b;(c=this.editor.container.offsetParent)&&!a[c.nodeName.toLowerCase()]&&(a=c.getBoundingClientRect(),b.top=-a.top,b.left=-a.left);return b},getStyleValue:function(a){return parseInt(k.getComputedStyle(this.getEditorHolder(),a))}};g.extend(a,{listen:function(){var b=null;a._hasFullscreenListener||(a._hasFullscreenListener=!0,g(window).on("resize",function(){null!==b&&(window.clearTimeout(b),b=null);b=window.setTimeout(function(){for(var a in h)h[a].resize();
+b=null},50)}))},getInstance:function(b){h[b.uid]||new a(b);return h[b.uid]}});a.listen()})();UM.registerUI("link image video map formula",function(a){var b=this,c,d,e={title:b.options.labelMap&&b.options.labelMap[a]||b.getLang("labelMap."+a),url:b.options.UMEDITOR_HOME_URL+"dialogs/"+a+"/"+a+".js"},f=g.eduibutton({icon:a,title:this.getLang("labelMap")[a]||""});n.loadFile(document,{src:e.url,tag:"script",type:"text/javascript",defer:"defer"},function(){var h=UM.getWidgetData(a);if(h){if(h.buttons){var k=
+h.buttons.ok;k&&(e.oklabel=k.label||b.getLang("ok"),k.exec&&(e.okFn=function(){return g.proxy(k.exec,null,b,d)()}));var m=h.buttons.cancel;m&&(e.cancellabel=m.label||b.getLang("cancel"),m.exec&&(e.cancelFn=function(){return g.proxy(m.exec,null,b,d)()}))}h.width&&(e.width=h.width);h.height&&(e.height=h.height);d=g.eduimodal(e);d.attr("id","edui-dialog-"+a).addClass("edui-dialog-"+a).find(".edui-modal-body").addClass("edui-dialog-"+a+"-body");d.edui().on("beforehide",function(){var a=b.selection.getRange();
+a.equals(c)&&a.select()}).on("beforeshow",function(){var e=this.root(),f=null,h=null;c=b.selection.getRange();e.parent()[0]||b.$container.find(".edui-dialog-container").append(e);g.IE6&&(f={width:g(window).width(),height:g(window).height()},h=e.parents(".edui-toolbar")[0].getBoundingClientRect(),e.css({position:"absolute",margin:0,left:(f.width-e.width())/2-h.left,top:100-h.top}));UM.setWidgetBody(a,d,b);UM.setTopEditor(b)}).on("afterbackdrop",function(){this.$backdrop.css("zIndex",b.getOpt("zIndex")+
+1).appendTo(b.$container.find(".edui-dialog-container"));d.css("zIndex",b.getOpt("zIndex")+2)}).on("beforeok",function(){try{c.select()}catch(a){}}).attachTo(f)}});b.addListener("selectionchange",function(){var b=this.queryCommandState(a);f.edui().disabled(-1==b).active(1==b)});return f});UM.registerUI("emotion formula",function(a){var b=this,c=b.options.UMEDITOR_HOME_URL+"dialogs/"+a+"/"+a+".js",d=g.eduibutton({icon:a,title:this.getLang("labelMap")[a]||""});n.loadFile(document,{src:c,tag:"script",
+type:"text/javascript",defer:"defer"},function(){var e={url:c},f=UM.getWidgetData(a);f.width&&(e.width=f.width);f.height&&(e.height=f.height);g.eduipopup(e).css("zIndex",b.options.zIndex+1).addClass("edui-popup-"+a).edui().on("beforeshow",function(){var c=this.root();c.parent().length||b.$container.find(".edui-dialog-container").append(c);UM.setWidgetBody(a,c,b);UM.setTopEditor(b)}).attachTo(d,{offsetTop:-5,offsetLeft:10,caretLeft:11,caretTop:-8});b.addListener("selectionchange",function(){var b=
+this.queryCommandState(a);d.edui().disabled(-1==b).active(1==b)})});return d});UM.registerUI("imagescale",function(){var a=this,b;a.setOpt("imageScaleEnabled",!0);m.webkit&&a.getOpt("imageScaleEnabled")&&(a.addListener("click",function(c,d){var e=a.selection.getRange().getClosedNode(),f=d.target;if(e&&"IMG"==e.tagName&&f==e){if(!b){b=g.eduiscale({$wrap:a.$container}).css("zIndex",a.options.zIndex);a.$container.append(b);var h=function(){b.edui().hide()},k=function(a){var b=a.target||a.srcElement;
+b&&-1==b.className.indexOf("edui-scale")&&h(a)},m;b.edui().on("aftershow",function(){g(document).bind("keydown",h);g(document).bind("mousedown",k);a.selection.getNative().removeAllRanges()}).on("afterhide",function(){g(document).unbind("keydown",h);g(document).unbind("mousedown",k);var c=b.edui().getScaleTarget();c.parentNode&&a.selection.getRange().selectNode(c).select()}).on("mousedown",function(c){a.selection.getNative().removeAllRanges();(c=c.target||c.srcElement)&&-1==c.className.indexOf("edui-scale-hand")&&
+(m=setTimeout(function(){b.edui().hide()},200))}).on("mouseup",function(a){(a=a.target||a.srcElement)&&-1==a.className.indexOf("edui-scale-hand")&&clearTimeout(m)})}b.edui().show(g(e))}else b&&"none"!=b.css("display")&&b.edui().hide()}),a.addListener("click",function(b,d){"IMG"==d.target.tagName&&(new B.Range(a.document,a.body)).selectNode(d.target).select()}))});UM.registerUI("autofloat",function(){var a=this,b=a.getLang();a.setOpt({autoFloatEnabled:!0,topOffset:0});var c=a.options.topOffset;!1!==
+a.options.autoFloatEnabled&&a.ready(function(){function d(){var a=document.body.style;a.backgroundImage='url("about:blank")';a.backgroundAttachment="fixed"}function e(){p.parentNode&&p.parentNode.removeChild(p);r.style.cssText=q}function f(){var b=a.container,d;try{d=b.getBoundingClientRect()}catch(f){d={left:0,top:0,height:0,width:0}}Math.round(d.left);var g=Math.round(d.top),n=Math.round(d.bottom-d.top);Math.round(d.right-d.left);for(var q;(q=b.ownerDocument)!==document&&(b=k.getWindow(q).frameElement);)d=
+b.getBoundingClientRect(),g+=d.top;b=a.options.toolbarTopOffset||0;0>g&&g+n-r.offsetHeight>b?u||(g=k.getXY(r),n=k.getComputedStyle(r,"position"),b=k.getComputedStyle(r,"left"),r.style.width=r.offsetWidth+"px",r.style.zIndex=1*a.options.zIndex+1,r.parentNode.insertBefore(p,r),h||l&&m.ie?("absolute"!=r.style.position&&(r.style.position="absolute"),r.style.top=(document.body.scrollTop||document.documentElement.scrollTop)-y+c+"px"):"fixed"!=r.style.position&&(r.style.position="fixed",r.style.top=c+"px",
+("absolute"==n||"relative"==n)&&parseFloat(b)&&(r.style.left=g.x+"px"))):e()}var h=m.ie&&6>=m.version,l=m.quirks,q,p=document.createElement("div"),r,y,u=!1,v=n.defer(function(){f()},m.ie?200:100,!0);a.addListener("destroy",function(){g(window).off("scroll resize",f);a.removeListener("keydown",v)});var w;UM.ui?w=1:(alert(b.autofloatMsg),w=0);w&&(r=g(".edui-toolbar",a.container)[0],a.addListener("afteruiready",function(){setTimeout(function(){y=g(r).offset().top},100)}),q=r.style.cssText,p.style.height=
+r.offsetHeight+"px",h&&d(),g(window).on("scroll resize",f),a.addListener("keydown",v),a.addListener("resize",function(){e();p.style.height=r.offsetHeight+"px";f()}),a.addListener("beforefullscreenchange",function(a,b){b&&(e(),u=b)}),a.addListener("fullscreenchanged",function(a,b){b||f();u=b}),a.addListener("sourcemodechanged",function(a,b){setTimeout(function(){f()},0)}),a.addListener("clearDoc",function(){setTimeout(function(){f()},0)}))})});UM.registerUI("source",function(a){var b=this;b.addListener("fullscreenchanged",
+function(){b.$container.find("textarea").width(b.$body.width()-10).height(b.$body.height())});var c=g.eduibutton({icon:a,click:function(){b.execCommand(a);UM.setTopEditor(b)},title:this.getLang("labelMap")[a]||""});this.addListener("selectionchange",function(){var b=this.queryCommandState(a);c.edui().disabled(-1==b).active(1==b)});return c});UM.registerUI("paragraph fontfamily fontsize",function(a){function b(a,c){var d=g("<span>").html(a).css({display:"inline",position:"absolute",top:-1E7,left:-1E5}).appendTo(document.body),
+e=d.width();d.remove();if(50>e)return a;a=a.slice(0,c?-4:-1);return a.length?b(a+"...",!0):"..."}function c(a){var c=[],d;for(d in a.items)a.value.push(d),c.push(d),a.autowidthitem.push(b(d));a.items=c;a.autoRecord=!1;return a}function d(a){for(var c=null,d=[],e=0,f=a.items.length;e<f;e++)c=a.items[e].val,d.push(c.split(/\s*,\s*/)[0]),a.itemStyles.push("font-family: "+c),a.value.push(c),a.autowidthitem.push(b(d[e]));a.items=d;return a}function e(a){var b=null,c=[];a.itemStyles=[];a.value=[];for(var d=
+0,e=a.items.length;d<e;d++)b=a.items[d],c.push(b),a.itemStyles.push("font-size: "+b+"px");a.value=a.items;a.items=c;a.autoRecord=!1;return a}var f=this,h=f.options.labelMap&&f.options.labelMap[a]||f.getLang("labelMap."+a),h={label:h,title:h,comboboxName:a,items:f.options[a]||[],itemStyles:[],value:[],autowidthitem:[]},k=null,m=null;if(0==h.items.length)return null;switch(a){case "paragraph":h=c(h);break;case "fontfamily":h=d(h);break;case "fontsize":h=e(h)}k=g.eduibuttoncombobox(h).css("zIndex",f.getOpt("zIndex")+
+1);m=k.edui();m.on("comboboxselect",function(b,c){f.execCommand(a,c.value)}).on("beforeshow",function(){0===k.parent().length&&k.appendTo(f.$container.find(".edui-dialog-container"));UM.setTopEditor(f)});this.addListener("selectionchange",function(b){b=this.queryCommandState(a);var c=this.queryCommandValue(a);m.button().edui().disabled(-1==b).active(1==b);c&&(c=c.replace(/['"]/g,"").toLowerCase().split(/['|"]?\s*,\s*[\1]?/),m.selectItemByLabel(c))});return m.button().addClass("edui-combobox")});UM.registerUI("forecolor backcolor",
+function(a){var b=this,c=null,d=null,e=null;this.addListener("selectionchange",function(){var b=this.queryCommandState(a);e.edui().disabled(-1==b).active(1==b)});e=g.eduicolorsplitbutton({icon:a,caret:!0,name:a,title:b.getLang("labelMap")[a],click:function(){b.execCommand(a,k.getComputedStyle(d[0],"background-color"))}});d=e.edui().colorLabel();c=g.eduicolorpicker({name:a,lang_clearColor:b.getLang("clearColor")||"",lang_themeColor:b.getLang("themeColor")||"",lang_standardColor:b.getLang("standardColor")||
+""}).on("pickcolor",function(c,e){window.setTimeout(function(){d.css("backgroundColor",e);b.execCommand(a,e)},0)}).on("show",function(){UM.setActiveWidget(colorPickerWidget.root())}).css("zIndex",b.getOpt("zIndex")+1);e.edui().on("arrowclick",function(){c.parent().length||b.$container.find(".edui-dialog-container").append(c);c.edui().show(e,{caretDir:"down",offsetTop:-5,offsetLeft:8,caretLeft:11,caretTop:-8});UM.setTopEditor(b)}).register("click",e,function(){c.edui().hide()});return e})})(jQuery);
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/validate/additional-methods.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/validate/additional-methods.min.js
new file mode 100644
index 0000000..2d8735b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/validate/additional-methods.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.13.1 - 10/14/2014
+ * http://jqueryvalidation.org/
+ * Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],a):a(jQuery)}(function(a){!function(){function b(a){return a.replace(/<.[^<>]*?>/g," ").replace(/&nbsp;|&#160;/gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}a.validator.addMethod("maxWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length<=d},a.validator.format("Please enter {0} words or less.")),a.validator.addMethod("minWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length>=d},a.validator.format("Please enter at least {0} words.")),a.validator.addMethod("rangeWords",function(a,c,d){var e=b(a),f=/\b\w+\b/g;return this.optional(c)||e.match(f).length>=d[0]&&e.match(f).length<=d[1]},a.validator.format("Please enter between {0} and {1} words."))}(),a.validator.addMethod("accept",function(b,c,d){var e,f,g="string"==typeof d?d.replace(/\s/g,"").replace(/,/g,"|"):"image/*",h=this.optional(c);if(h)return h;if("file"===a(c).attr("type")&&(g=g.replace(/\*/g,".*"),c.files&&c.files.length))for(e=0;e<c.files.length;e++)if(f=c.files[e],!f.type.match(new RegExp(".?("+g+")$","i")))return!1;return!0},a.validator.format("Please enter a value with a valid mimetype.")),a.validator.addMethod("alphanumeric",function(a,b){return this.optional(b)||/^\w+$/i.test(a)},"Letters, numbers, and underscores only please"),a.validator.addMethod("bankaccountNL",function(a,b){if(this.optional(b))return!0;if(!/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(a))return!1;var c,d,e,f=a.replace(/ /g,""),g=0,h=f.length;for(c=0;h>c;c++)d=h-c,e=f.substring(c,c+1),g+=d*e;return g%11===0},"Please specify a valid bank account number"),a.validator.addMethod("bankorgiroaccountNL",function(b,c){return this.optional(c)||a.validator.methods.bankaccountNL.call(this,b,c)||a.validator.methods.giroaccountNL.call(this,b,c)},"Please specify a valid bank or giro account number"),a.validator.addMethod("bic",function(a,b){return this.optional(b)||/^([A-Z]{6}[A-Z2-9][A-NP-Z1-2])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test(a)},"Please specify a valid BIC code"),a.validator.addMethod("cifES",function(a){"use strict";var b,c,d,e,f,g,h=[];if(a=a.toUpperCase(),!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)"))return!1;for(d=0;9>d;d++)h[d]=parseInt(a.charAt(d),10);for(c=h[2]+h[4]+h[6],e=1;8>e;e+=2)f=(2*h[e]).toString(),g=f.charAt(1),c+=parseInt(f.charAt(0),10)+(""===g?0:parseInt(g,10));return/^[ABCDEFGHJNPQRSUVW]{1}/.test(a)?(c+="",b=10-parseInt(c.charAt(c.length-1),10),a+=b,h[8].toString()===String.fromCharCode(64+b)||h[8].toString()===a.charAt(a.length-1)):!1},"Please specify a valid CIF number."),a.validator.addMethod("creditcardtypes",function(a,b,c){if(/[^0-9\-]+/.test(a))return!1;a=a.replace(/\D/g,"");var d=0;return c.mastercard&&(d|=1),c.visa&&(d|=2),c.amex&&(d|=4),c.dinersclub&&(d|=8),c.enroute&&(d|=16),c.discover&&(d|=32),c.jcb&&(d|=64),c.unknown&&(d|=128),c.all&&(d=255),1&d&&/^(5[12345])/.test(a)?16===a.length:2&d&&/^(4)/.test(a)?16===a.length:4&d&&/^(3[47])/.test(a)?15===a.length:8&d&&/^(3(0[012345]|[68]))/.test(a)?14===a.length:16&d&&/^(2(014|149))/.test(a)?15===a.length:32&d&&/^(6011)/.test(a)?16===a.length:64&d&&/^(3)/.test(a)?16===a.length:64&d&&/^(2131|1800)/.test(a)?15===a.length:128&d?!0:!1},"Please enter a valid credit card number."),a.validator.addMethod("currency",function(a,b,c){var d,e="string"==typeof c,f=e?c:c[0],g=e?!0:c[1];return f=f.replace(/,/g,""),f=g?f+"]":f+"]?",d="^["+f+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",d=new RegExp(d),this.optional(b)||d.test(a)},"Please specify a valid currency"),a.validator.addMethod("dateFA",function(a,b){return this.optional(b)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(a)},"Please enter a correct date"),a.validator.addMethod("dateITA",function(a,b){var c,d,e,f,g,h=!1,i=/^\d{1,2}\/\d{1,2}\/\d{4}$/;return i.test(a)?(c=a.split("/"),d=parseInt(c[0],10),e=parseInt(c[1],10),f=parseInt(c[2],10),g=new Date(f,e-1,d,12,0,0,0),h=g.getUTCFullYear()===f&&g.getUTCMonth()===e-1&&g.getUTCDate()===d?!0:!1):h=!1,this.optional(b)||h},"Please enter a correct date"),a.validator.addMethod("dateNL",function(a,b){return this.optional(b)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(a)},"Please enter a correct date"),a.validator.addMethod("extension",function(a,b,c){return c="string"==typeof c?c.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(b)||a.match(new RegExp(".("+c+")$","i"))},a.validator.format("Please enter a value with a valid extension.")),a.validator.addMethod("giroaccountNL",function(a,b){return this.optional(b)||/^[0-9]{1,7}$/.test(a)},"Please specify a valid giro account number"),a.validator.addMethod("iban",function(a,b){if(this.optional(b))return!0;var c,d,e,f,g,h,i,j,k,l=a.replace(/ /g,"").toUpperCase(),m="",n=!0,o="",p="";if(!/^([a-zA-Z0-9]{4} ){2,8}[a-zA-Z0-9]{1,4}|[a-zA-Z0-9]{12,34}$/.test(l))return!1;if(c=l.substring(0,2),h={AL:"\\d{8}[\\dA-Z]{16}",AD:"\\d{8}[\\dA-Z]{12}",AT:"\\d{16}",AZ:"[\\dA-Z]{4}\\d{20}",BE:"\\d{12}",BH:"[A-Z]{4}[\\dA-Z]{14}",BA:"\\d{16}",BR:"\\d{23}[A-Z][\\dA-Z]",BG:"[A-Z]{4}\\d{6}[\\dA-Z]{8}",CR:"\\d{17}",HR:"\\d{17}",CY:"\\d{8}[\\dA-Z]{16}",CZ:"\\d{20}",DK:"\\d{14}",DO:"[A-Z]{4}\\d{20}",EE:"\\d{16}",FO:"\\d{14}",FI:"\\d{14}",FR:"\\d{10}[\\dA-Z]{11}\\d{2}",GE:"[\\dA-Z]{2}\\d{16}",DE:"\\d{18}",GI:"[A-Z]{4}[\\dA-Z]{15}",GR:"\\d{7}[\\dA-Z]{16}",GL:"\\d{14}",GT:"[\\dA-Z]{4}[\\dA-Z]{20}",HU:"\\d{24}",IS:"\\d{22}",IE:"[\\dA-Z]{4}\\d{14}",IL:"\\d{19}",IT:"[A-Z]\\d{10}[\\dA-Z]{12}",KZ:"\\d{3}[\\dA-Z]{13}",KW:"[A-Z]{4}[\\dA-Z]{22}",LV:"[A-Z]{4}[\\dA-Z]{13}",LB:"\\d{4}[\\dA-Z]{20}",LI:"\\d{5}[\\dA-Z]{12}",LT:"\\d{16}",LU:"\\d{3}[\\dA-Z]{13}",MK:"\\d{3}[\\dA-Z]{10}\\d{2}",MT:"[A-Z]{4}\\d{5}[\\dA-Z]{18}",MR:"\\d{23}",MU:"[A-Z]{4}\\d{19}[A-Z]{3}",MC:"\\d{10}[\\dA-Z]{11}\\d{2}",MD:"[\\dA-Z]{2}\\d{18}",ME:"\\d{18}",NL:"[A-Z]{4}\\d{10}",NO:"\\d{11}",PK:"[\\dA-Z]{4}\\d{16}",PS:"[\\dA-Z]{4}\\d{21}",PL:"\\d{24}",PT:"\\d{21}",RO:"[A-Z]{4}[\\dA-Z]{16}",SM:"[A-Z]\\d{10}[\\dA-Z]{12}",SA:"\\d{2}[\\dA-Z]{18}",RS:"\\d{18}",SK:"\\d{20}",SI:"\\d{15}",ES:"\\d{20}",SE:"\\d{20}",CH:"\\d{5}[\\dA-Z]{12}",TN:"\\d{20}",TR:"\\d{5}[\\dA-Z]{17}",AE:"\\d{3}\\d{16}",GB:"[A-Z]{4}\\d{14}",VG:"[\\dA-Z]{4}\\d{16}"},g=h[c],"undefined"!=typeof g&&(i=new RegExp("^[A-Z]{2}\\d{2}"+g+"$",""),!i.test(l)))return!1;for(d=l.substring(4,l.length)+l.substring(0,4),j=0;j<d.length;j++)e=d.charAt(j),"0"!==e&&(n=!1),n||(m+="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(e));for(k=0;k<m.length;k++)f=m.charAt(k),p=""+o+f,o=p%97;return 1===o},"Please specify a valid IBAN"),a.validator.addMethod("integer",function(a,b){return this.optional(b)||/^-?\d+$/.test(a)},"A positive or negative non-decimal number please"),a.validator.addMethod("ipv4",function(a,b){return this.optional(b)||/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(a)},"Please enter a valid IP v4 address."),a.validator.addMethod("ipv6",function(a,b){return this.optional(b)||/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(a)},"Please enter a valid IP v6 address."),a.validator.addMethod("lettersonly",function(a,b){return this.optional(b)||/^[a-z]+$/i.test(a)},"Letters only please"),a.validator.addMethod("letterswithbasicpunc",function(a,b){return this.optional(b)||/^[a-z\-.,()'"\s]+$/i.test(a)},"Letters or punctuation only please"),a.validator.addMethod("mobileNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid mobile number"),a.validator.addMethod("mobileUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number"),a.validator.addMethod("nieES",function(a){"use strict";return a=a.toUpperCase(),a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")?/^[T]{1}/.test(a)?a[8]===/^[T]{1}[A-Z0-9]{8}$/.test(a):/^[XYZ]{1}/.test(a)?a[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.replace("X","0").replace("Y","1").replace("Z","2").substring(0,8)%23):!1:!1},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a){"use strict";return a=a.toUpperCase(),a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")?/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):/^[KLM]{1}/.test(a)?a[8]===String.fromCharCode(64):!1:!1},"Please specify a valid NIF number."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please"),a.validator.addMethod("pattern",function(a,b,c){return this.optional(b)?!0:("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number"),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/)},"Please specify a valid phone number"),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number"),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode"),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),jQuery.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=e||"undefined"==typeof c.caseSensitive?!1:c.caseSensitive,g=e||"undefined"==typeof c.includeTerritories?!1:c.includeTerritories,h=e||"undefined"==typeof c.includeMilitary?!1:c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state"),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59"),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format"),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;17>b;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c<h.length;c++)if(d.toUpperCase()===h[c]){d=i[c],d*=e,isNaN(g)&&8===c&&(g=h[c]);break}}else d*=e;k+=d}return f=k%11,10===f&&(f="X"),f===g?!0:!1},"The specified vehicle identification number (VIN) is invalid."),a.validator.addMethod("zipcodeUS",function(a,b){return this.optional(b)||/^\d{5}(-\d{4})?$/.test(a)},"The specified US ZIP Code is invalid"),a.validator.addMethod("ziprange",function(a,b){return this.optional(b)||/^90[2-5]\d\{2\}-\d{4}$/.test(a)},"Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx")});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/validate/bootstrapValidator.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/validate/bootstrapValidator.min.js
new file mode 100644
index 0000000..06282df
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/validate/bootstrapValidator.min.js
@@ -0,0 +1,14 @@
+/*!
+ * BootstrapValidator (http://bootstrapvalidator.com)
+ * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
+ *
+ * @version     v0.5.3, built on 2014-11-05 9:14:18 PM
+ * @author      https://twitter.com/nghuuphuoc
+ * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
+ * @license     Commercial: http://bootstrapvalidator.com/license/
+ *              Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0/
+ */
+if("undefined"==typeof jQuery)throw new Error("BootstrapValidator requires jQuery");!function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(+b[0]<2&&+b[1]<9||1===+b[0]&&9===+b[1]&&+b[2]<1)throw new Error("BootstrapValidator requires jQuery version 1.9.1 or higher")}(window.jQuery),function(a){var b=function(b,c){this.$form=a(b),this.options=a.extend({},a.fn.bootstrapValidator.DEFAULT_OPTIONS,c),this.$invalidFields=a([]),this.$submitButton=null,this.$hiddenButton=null,this.STATUS_NOT_VALIDATED="NOT_VALIDATED",this.STATUS_VALIDATING="VALIDATING",this.STATUS_INVALID="INVALID",this.STATUS_VALID="VALID";var d=function(){for(var a=3,b=document.createElement("div"),c=b.all||[];b.innerHTML="<!--[if gt IE "+ ++a+"]><br><![endif]-->",c[0];);return a>4?a:!a}(),e=document.createElement("div");this._changeEvent=9!==d&&"oninput"in e?"input":"keyup",this._submitIfValid=null,this._cacheFields={},this._init()};b.prototype={constructor:b,_init:function(){var b=this,c={autoFocus:this.$form.attr("data-bv-autofocus"),container:this.$form.attr("data-bv-container"),events:{formInit:this.$form.attr("data-bv-events-form-init"),formError:this.$form.attr("data-bv-events-form-error"),formSuccess:this.$form.attr("data-bv-events-form-success"),fieldAdded:this.$form.attr("data-bv-events-field-added"),fieldRemoved:this.$form.attr("data-bv-events-field-removed"),fieldInit:this.$form.attr("data-bv-events-field-init"),fieldError:this.$form.attr("data-bv-events-field-error"),fieldSuccess:this.$form.attr("data-bv-events-field-success"),fieldStatus:this.$form.attr("data-bv-events-field-status"),validatorError:this.$form.attr("data-bv-events-validator-error"),validatorSuccess:this.$form.attr("data-bv-events-validator-success")},excluded:this.$form.attr("data-bv-excluded"),feedbackIcons:{valid:this.$form.attr("data-bv-feedbackicons-valid"),invalid:this.$form.attr("data-bv-feedbackicons-invalid"),validating:this.$form.attr("data-bv-feedbackicons-validating")},group:this.$form.attr("data-bv-group"),live:this.$form.attr("data-bv-live"),message:this.$form.attr("data-bv-message"),onError:this.$form.attr("data-bv-onerror"),onSuccess:this.$form.attr("data-bv-onsuccess"),submitButtons:this.$form.attr("data-bv-submitbuttons"),threshold:this.$form.attr("data-bv-threshold"),trigger:this.$form.attr("data-bv-trigger"),verbose:this.$form.attr("data-bv-verbose"),fields:{}};this.$form.attr("novalidate","novalidate").addClass(this.options.elementClass).on("submit.bv",function(a){a.preventDefault(),b.validate()}).on("click.bv",this.options.submitButtons,function(){b.$submitButton=a(this),b._submitIfValid=!0}).find("[name], [data-bv-field]").each(function(){var d=a(this),e=d.attr("name")||d.attr("data-bv-field"),f=b._parseOptions(d);f&&(d.attr("data-bv-field",e),c.fields[e]=a.extend({},f,c.fields[e]))}),this.options=a.extend(!0,this.options,c),this.$hiddenButton=a("<button/>").attr("type","submit").prependTo(this.$form).addClass("bv-hidden-submit").css({display:"none",width:0,height:0}),this.$form.on("click.bv",'[type="submit"]',function(c){if(!c.isDefaultPrevented()){var d=a(c.target),e=d.is('[type="submit"]')?d.eq(0):d.parent('[type="submit"]').eq(0);!b.options.submitButtons||e.is(b.options.submitButtons)||e.is(b.$hiddenButton)||b.$form.off("submit.bv").submit()}});for(var d in this.options.fields)this._initField(d);this.$form.trigger(a.Event(this.options.events.formInit),{bv:this,options:this.options}),this.options.onSuccess&&this.$form.on(this.options.events.formSuccess,function(c){a.fn.bootstrapValidator.helpers.call(b.options.onSuccess,[c])}),this.options.onError&&this.$form.on(this.options.events.formError,function(c){a.fn.bootstrapValidator.helpers.call(b.options.onError,[c])})},_parseOptions:function(b){var c,d,e,f,g,h,i,j,k,l=b.attr("name")||b.attr("data-bv-field"),m={};for(d in a.fn.bootstrapValidator.validators)if(c=a.fn.bootstrapValidator.validators[d],e="data-bv-"+d.toLowerCase(),f=b.attr(e)+"",k="function"==typeof c.enableByHtml5?c.enableByHtml5(b):null,k&&"false"!==f||k!==!0&&(""===f||"true"===f||e===f.toLowerCase())){c.html5Attributes=a.extend({},{message:"message",onerror:"onError",onsuccess:"onSuccess"},c.html5Attributes),m[d]=a.extend({},k===!0?{}:k,m[d]);for(j in c.html5Attributes)g=c.html5Attributes[j],h="data-bv-"+d.toLowerCase()+"-"+j,i=b.attr(h),i&&("true"===i||h===i.toLowerCase()?i=!0:"false"===i&&(i=!1),m[d][g]=i)}var n={autoFocus:b.attr("data-bv-autofocus"),container:b.attr("data-bv-container"),excluded:b.attr("data-bv-excluded"),feedbackIcons:b.attr("data-bv-feedbackicons"),group:b.attr("data-bv-group"),message:b.attr("data-bv-message"),onError:b.attr("data-bv-onerror"),onStatus:b.attr("data-bv-onstatus"),onSuccess:b.attr("data-bv-onsuccess"),selector:b.attr("data-bv-selector"),threshold:b.attr("data-bv-threshold"),trigger:b.attr("data-bv-trigger"),verbose:b.attr("data-bv-verbose"),validators:m},o=a.isEmptyObject(n),p=a.isEmptyObject(m);return!p||!o&&this.options.fields&&this.options.fields[l]?(n.validators=m,n):null},_initField:function(b){var c=a([]);switch(typeof b){case"object":c=b,b=b.attr("data-bv-field");break;case"string":c=this.getFieldElements(b),c.attr("data-bv-field",b)}if(0!==c.length&&null!==this.options.fields[b]&&null!==this.options.fields[b].validators){var d;for(d in this.options.fields[b].validators)a.fn.bootstrapValidator.validators[d]||delete this.options.fields[b].validators[d];null===this.options.fields[b].enabled&&(this.options.fields[b].enabled=!0);for(var e=this,f=c.length,g=c.attr("type"),h=1===f||"radio"===g||"checkbox"===g,i="radio"===g||"checkbox"===g||"file"===g||"SELECT"===c.eq(0).get(0).tagName?"change":this._changeEvent,j=(this.options.fields[b].trigger||this.options.trigger||i).split(" "),k=a.map(j,function(a){return a+".update.bv"}).join(" "),l=0;f>l;l++){var m=c.eq(l),n=this.options.fields[b].group||this.options.group,o=m.parents(n),p="function"==typeof(this.options.fields[b].container||this.options.container)?(this.options.fields[b].container||this.options.container).call(this,m,this):this.options.fields[b].container||this.options.container,q=p&&"tooltip"!==p&&"popover"!==p?a(p):this._getMessageContainer(m,n);p&&"tooltip"!==p&&"popover"!==p&&q.addClass("has-error"),q.find('.help-block[data-bv-validator][data-bv-for="'+b+'"]').remove(),o.find('i[data-bv-icon-for="'+b+'"]').remove(),m.off(k).on(k,function(){e.updateStatus(a(this),e.STATUS_NOT_VALIDATED)}),m.data("bv.messages",q);for(d in this.options.fields[b].validators)m.data("bv.result."+d,this.STATUS_NOT_VALIDATED),h&&l!==f-1||a("<small/>").css("display","none").addClass("help-block").attr("data-bv-validator",d).attr("data-bv-for",b).attr("data-bv-result",this.STATUS_NOT_VALIDATED).html(this._getMessage(b,d)).appendTo(q),"function"==typeof a.fn.bootstrapValidator.validators[d].init&&a.fn.bootstrapValidator.validators[d].init(this,m,this.options.fields[b].validators[d]);if(this.options.fields[b].feedbackIcons!==!1&&"false"!==this.options.fields[b].feedbackIcons&&this.options.feedbackIcons&&this.options.feedbackIcons.validating&&this.options.feedbackIcons.invalid&&this.options.feedbackIcons.valid&&(!h||l===f-1)){o.addClass("has-feedback");var r=a("<i/>").css("display","none").addClass("form-control-feedback").attr("data-bv-icon-for",b).insertAfter(m);if("checkbox"===g||"radio"===g){var s=m.parent();s.hasClass(g)?r.insertAfter(s):s.parent().hasClass(g)&&r.insertAfter(s.parent())}0===o.find("label").length&&r.addClass("bv-no-label"),0!==o.find(".input-group").length&&r.addClass("bv-icon-input-group").insertAfter(o.find(".input-group").eq(0)),h?l===f-1&&c.data("bv.icon",r):m.data("bv.icon",r),p&&m.off("focus.container.bv").on("focus.container.bv",function(){switch(p){case"tooltip":a(this).data("bv.icon").tooltip("show");break;case"popover":a(this).data("bv.icon").popover("show")}}).off("blur.container.bv").on("blur.container.bv",function(){switch(p){case"tooltip":a(this).data("bv.icon").tooltip("hide");break;case"popover":a(this).data("bv.icon").popover("hide")}})}}switch(c.on(this.options.events.fieldSuccess,function(b,c){var d=e.getOptions(c.field,null,"onSuccess");d&&a.fn.bootstrapValidator.helpers.call(d,[b,c])}).on(this.options.events.fieldError,function(b,c){var d=e.getOptions(c.field,null,"onError");d&&a.fn.bootstrapValidator.helpers.call(d,[b,c])}).on(this.options.events.fieldStatus,function(b,c){var d=e.getOptions(c.field,null,"onStatus");d&&a.fn.bootstrapValidator.helpers.call(d,[b,c])}).on(this.options.events.validatorError,function(b,c){var d=e.getOptions(c.field,c.validator,"onError");d&&a.fn.bootstrapValidator.helpers.call(d,[b,c])}).on(this.options.events.validatorSuccess,function(b,c){var d=e.getOptions(c.field,c.validator,"onSuccess");d&&a.fn.bootstrapValidator.helpers.call(d,[b,c])}),k=a.map(j,function(a){return a+".live.bv"}).join(" "),this.options.live){case"submitted":break;case"disabled":c.off(k);break;case"enabled":default:c.off(k).on(k,function(){e._exceedThreshold(a(this))&&e.validateField(a(this))})}c.trigger(a.Event(this.options.events.fieldInit),{bv:this,field:b,element:c})}},_getMessage:function(b,c){if(!(this.options.fields[b]&&a.fn.bootstrapValidator.validators[c]&&this.options.fields[b].validators&&this.options.fields[b].validators[c]))return"";var d=this.options.fields[b].validators[c];switch(!0){case!!d.message:return d.message;case!!this.options.fields[b].message:return this.options.fields[b].message;case!!a.fn.bootstrapValidator.i18n[c]:return a.fn.bootstrapValidator.i18n[c]["default"];default:return this.options.message}},_getMessageContainer:function(a,b){var c=a.parent();if(c.is(b))return c;var d=c.attr("class");if(!d)return this._getMessageContainer(c,b);d=d.split(" ");for(var e=d.length,f=0;e>f;f++)if(/^col-(xs|sm|md|lg)-\d+$/.test(d[f])||/^col-(xs|sm|md|lg)-offset-\d+$/.test(d[f]))return c;return this._getMessageContainer(c,b)},_submit:function(){var b=this.isValid(),c=b?this.options.events.formSuccess:this.options.events.formError,d=a.Event(c);this.$form.trigger(d),this.$submitButton&&(b?this._onSuccess(d):this._onError(d))},_isExcluded:function(b){var c=b.attr("data-bv-excluded"),d=b.attr("data-bv-field")||b.attr("name");switch(!0){case!!d&&this.options.fields&&this.options.fields[d]&&("true"===this.options.fields[d].excluded||this.options.fields[d].excluded===!0):case"true"===c:case""===c:return!0;case!!d&&this.options.fields&&this.options.fields[d]&&("false"===this.options.fields[d].excluded||this.options.fields[d].excluded===!1):case"false"===c:return!1;default:if(this.options.excluded){"string"==typeof this.options.excluded&&(this.options.excluded=a.map(this.options.excluded.split(","),function(b){return a.trim(b)}));for(var e=this.options.excluded.length,f=0;e>f;f++)if("string"==typeof this.options.excluded[f]&&b.is(this.options.excluded[f])||"function"==typeof this.options.excluded[f]&&this.options.excluded[f].call(this,b,this)===!0)return!0}return!1}},_exceedThreshold:function(b){var c=b.attr("data-bv-field"),d=this.options.fields[c].threshold||this.options.threshold;if(!d)return!0;var e=-1!==a.inArray(b.attr("type"),["button","checkbox","file","hidden","image","radio","reset","submit"]);return e||b.val().length>=d},_onError:function(b){if(!b.isDefaultPrevented()){if("submitted"===this.options.live){this.options.live="enabled";var c=this;for(var d in this.options.fields)!function(b){var e=c.getFieldElements(b);if(e.length){var f=a(e[0]).attr("type"),g="radio"===f||"checkbox"===f||"file"===f||"SELECT"===a(e[0]).get(0).tagName?"change":c._changeEvent,h=c.options.fields[d].trigger||c.options.trigger||g,i=a.map(h.split(" "),function(a){return a+".live.bv"}).join(" ");e.off(i).on(i,function(){c._exceedThreshold(a(this))&&c.validateField(a(this))})}}(d)}for(var e=0;e<this.$invalidFields.length;e++){var f=this.$invalidFields.eq(e),g=this._isOptionEnabled(f.attr("data-bv-field"),"autoFocus");if(g){var h,i=f.parents(".tab-pane");i&&(h=i.attr("id"))&&a('a[href="#'+h+'"][data-toggle="tab"]').tab("show"),f.focus();break}}}},_onSuccess:function(a){a.isDefaultPrevented()||this.disableSubmitButtons(!0).defaultSubmit()},_onFieldValidated:function(b,c){var d=b.attr("data-bv-field"),e=this.options.fields[d].validators,f={},g=0,h={bv:this,field:d,element:b,validator:c,result:b.data("bv.response."+c)};if(c)switch(b.data("bv.result."+c)){case this.STATUS_INVALID:b.trigger(a.Event(this.options.events.validatorError),h);break;case this.STATUS_VALID:b.trigger(a.Event(this.options.events.validatorSuccess),h)}f[this.STATUS_NOT_VALIDATED]=0,f[this.STATUS_VALIDATING]=0,f[this.STATUS_INVALID]=0,f[this.STATUS_VALID]=0;for(var i in e)if(e[i].enabled!==!1){g++;var j=b.data("bv.result."+i);j&&f[j]++}f[this.STATUS_VALID]===g?(this.$invalidFields=this.$invalidFields.not(b),b.trigger(a.Event(this.options.events.fieldSuccess),h)):(0===f[this.STATUS_NOT_VALIDATED]||!this._isOptionEnabled(d,"verbose"))&&0===f[this.STATUS_VALIDATING]&&f[this.STATUS_INVALID]>0&&(this.$invalidFields=this.$invalidFields.add(b),b.trigger(a.Event(this.options.events.fieldError),h))},_isOptionEnabled:function(a,b){return!this.options.fields[a]||"true"!==this.options.fields[a][b]&&this.options.fields[a][b]!==!0?!this.options.fields[a]||"false"!==this.options.fields[a][b]&&this.options.fields[a][b]!==!1?"true"===this.options[b]||this.options[b]===!0:!1:!0},getFieldElements:function(b){return this._cacheFields[b]||(this._cacheFields[b]=this.options.fields[b]&&this.options.fields[b].selector?a(this.options.fields[b].selector):this.$form.find('[name="'+b+'"]')),this._cacheFields[b]},getOptions:function(a,b,c){if(!a)return c?this.options[c]:this.options;if("object"==typeof a&&(a=a.attr("data-bv-field")),!this.options.fields[a])return null;var d=this.options.fields[a];return b?d.validators&&d.validators[b]?c?d.validators[b][c]:d.validators[b]:null:c?d[c]:d},disableSubmitButtons:function(a){return a?"disabled"!==this.options.live&&this.$form.find(this.options.submitButtons).attr("disabled","disabled"):this.$form.find(this.options.submitButtons).removeAttr("disabled"),this},validate:function(){if(!this.options.fields)return this;this.disableSubmitButtons(!0),this._submitIfValid=!1;for(var a in this.options.fields)this.validateField(a);return this._submit(),this._submitIfValid=!0,this},validateField:function(b){var c=a([]);switch(typeof b){case"object":c=b,b=b.attr("data-bv-field");break;case"string":c=this.getFieldElements(b)}if(0===c.length||!this.options.fields[b]||this.options.fields[b].enabled===!1)return this;for(var d,e,f=this,g=c.attr("type"),h="radio"===g||"checkbox"===g?1:c.length,i="radio"===g||"checkbox"===g,j=this.options.fields[b].validators,k=this._isOptionEnabled(b,"verbose"),l=0;h>l;l++){var m=c.eq(l);if(!this._isExcluded(m)){var n=!1;for(d in j){if(m.data("bv.dfs."+d)&&m.data("bv.dfs."+d).reject(),n)break;var o=m.data("bv.result."+d);if(o!==this.STATUS_VALID&&o!==this.STATUS_INVALID)if(j[d].enabled!==!1){if(m.data("bv.result."+d,this.STATUS_VALIDATING),e=a.fn.bootstrapValidator.validators[d].validate(this,m,j[d]),"object"==typeof e&&e.resolve)this.updateStatus(i?b:m,this.STATUS_VALIDATING,d),m.data("bv.dfs."+d,e),e.done(function(a,b,c){a.removeData("bv.dfs."+b).data("bv.response."+b,c),c.message&&f.updateMessage(a,b,c.message),f.updateStatus(i?a.attr("data-bv-field"):a,c.valid?f.STATUS_VALID:f.STATUS_INVALID,b),c.valid&&f._submitIfValid===!0?f._submit():c.valid||k||(n=!0)});else if("object"==typeof e&&void 0!==e.valid&&void 0!==e.message){if(m.data("bv.response."+d,e),this.updateMessage(i?b:m,d,e.message),this.updateStatus(i?b:m,e.valid?this.STATUS_VALID:this.STATUS_INVALID,d),!e.valid&&!k)break}else if("boolean"==typeof e&&(m.data("bv.response."+d,e),this.updateStatus(i?b:m,e?this.STATUS_VALID:this.STATUS_INVALID,d),!e&&!k))break}else this.updateStatus(i?b:m,this.STATUS_VALID,d);else this._onFieldValidated(m,d)}}}return this},updateMessage:function(b,c,d){var e=a([]);switch(typeof b){case"object":e=b,b=b.attr("data-bv-field");break;case"string":e=this.getFieldElements(b)}e.each(function(){a(this).data("bv.messages").find('.help-block[data-bv-validator="'+c+'"][data-bv-for="'+b+'"]').html(d)})},updateStatus:function(b,c,d){var e=a([]);switch(typeof b){case"object":e=b,b=b.attr("data-bv-field");break;case"string":e=this.getFieldElements(b)}c===this.STATUS_NOT_VALIDATED&&(this._submitIfValid=!1);for(var f=this,g=e.attr("type"),h=this.options.fields[b].group||this.options.group,i="radio"===g||"checkbox"===g?1:e.length,j=0;i>j;j++){var k=e.eq(j);if(!this._isExcluded(k)){var l=k.parents(h),m=k.data("bv.messages"),n=m.find('.help-block[data-bv-validator][data-bv-for="'+b+'"]'),o=d?n.filter('[data-bv-validator="'+d+'"]'):n,p=k.data("bv.icon"),q="function"==typeof(this.options.fields[b].container||this.options.container)?(this.options.fields[b].container||this.options.container).call(this,k,this):this.options.fields[b].container||this.options.container,r=null;if(d)k.data("bv.result."+d,c);else for(var s in this.options.fields[b].validators)k.data("bv.result."+s,c);o.attr("data-bv-result",c);var t,u,v=k.parents(".tab-pane");switch(v&&(t=v.attr("id"))&&(u=a('a[href="#'+t+'"][data-toggle="tab"]').parent()),c){case this.STATUS_VALIDATING:r=null,this.disableSubmitButtons(!0),l.removeClass("has-success").removeClass("has-error"),p&&p.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).addClass(this.options.feedbackIcons.validating).show(),u&&u.removeClass("bv-tab-success").removeClass("bv-tab-error");break;case this.STATUS_INVALID:r=!1,this.disableSubmitButtons(!0),l.removeClass("has-success").addClass("has-error"),p&&p.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.validating).addClass(this.options.feedbackIcons.invalid).show(),u&&u.removeClass("bv-tab-success").addClass("bv-tab-error");break;case this.STATUS_VALID:r=0===n.filter('[data-bv-result="'+this.STATUS_NOT_VALIDATED+'"]').length?n.filter('[data-bv-result="'+this.STATUS_VALID+'"]').length===n.length:null,null!==r&&(this.disableSubmitButtons(this.$submitButton?!this.isValid():!r),p&&p.removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).removeClass(this.options.feedbackIcons.valid).addClass(r?this.options.feedbackIcons.valid:this.options.feedbackIcons.invalid).show()),l.removeClass("has-error has-success").addClass(this.isValidContainer(l)?"has-success":"has-error"),u&&u.removeClass("bv-tab-success").removeClass("bv-tab-error").addClass(this.isValidContainer(v)?"bv-tab-success":"bv-tab-error");break;case this.STATUS_NOT_VALIDATED:default:r=null,this.disableSubmitButtons(!1),l.removeClass("has-success").removeClass("has-error"),p&&p.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).hide(),u&&u.removeClass("bv-tab-success").removeClass("bv-tab-error")}switch(!0){case p&&"tooltip"===q:r===!1?p.css("cursor","pointer").tooltip("destroy").tooltip({container:"body",html:!0,placement:"auto top",title:n.filter('[data-bv-result="'+f.STATUS_INVALID+'"]').eq(0).html()}):p.css("cursor","").tooltip("destroy");break;case p&&"popover"===q:r===!1?p.css("cursor","pointer").popover("destroy").popover({container:"body",content:n.filter('[data-bv-result="'+f.STATUS_INVALID+'"]').eq(0).html(),html:!0,placement:"auto top",trigger:"hover click"}):p.css("cursor","").popover("destroy");break;default:c===this.STATUS_INVALID?o.show():o.hide()}k.trigger(a.Event(this.options.events.fieldStatus),{bv:this,field:b,element:k,status:c}),this._onFieldValidated(k,d)}}return this},isValid:function(){for(var a in this.options.fields)if(!this.isValidField(a))return!1;return!0},isValidField:function(b){var c=a([]);switch(typeof b){case"object":c=b,b=b.attr("data-bv-field");break;case"string":c=this.getFieldElements(b)}if(0===c.length||!this.options.fields[b]||this.options.fields[b].enabled===!1)return!0;for(var d,e,f,g=c.attr("type"),h="radio"===g||"checkbox"===g?1:c.length,i=0;h>i;i++)if(d=c.eq(i),!this._isExcluded(d))for(e in this.options.fields[b].validators)if(this.options.fields[b].validators[e].enabled!==!1&&(f=d.data("bv.result."+e),f!==this.STATUS_VALID))return!1;return!0},isValidContainer:function(b){var c=this,d={},e="string"==typeof b?a(b):b;if(0===e.length)return!0;e.find("[data-bv-field]").each(function(){var b=a(this),e=b.attr("data-bv-field");c._isExcluded(b)||d[e]||(d[e]=b)});for(var f in d){var g=d[f];if(g.data("bv.messages").find('.help-block[data-bv-validator][data-bv-for="'+f+'"]').filter('[data-bv-result="'+this.STATUS_INVALID+'"]').length>0)return!1}return!0},defaultSubmit:function(){this.$submitButton&&a("<input/>").attr("type","hidden").attr("data-bv-submit-hidden","").attr("name",this.$submitButton.attr("name")).val(this.$submitButton.val()).appendTo(this.$form),this.$form.off("submit.bv").submit()},getInvalidFields:function(){return this.$invalidFields},getSubmitButton:function(){return this.$submitButton},getMessages:function(b,c){var d=this,e=[],f=a([]);switch(!0){case b&&"object"==typeof b:f=b;break;case b&&"string"==typeof b:var g=this.getFieldElements(b);if(g.length>0){var h=g.attr("type");f="radio"===h||"checkbox"===h?g.eq(0):g}break;default:f=this.$invalidFields}var i=c?'[data-bv-validator="'+c+'"]':"";return f.each(function(){e=e.concat(a(this).data("bv.messages").find('.help-block[data-bv-for="'+a(this).attr("data-bv-field")+'"][data-bv-result="'+d.STATUS_INVALID+'"]'+i).map(function(){var b=a(this).attr("data-bv-validator"),c=a(this).attr("data-bv-for");return d.options.fields[c].validators[b].enabled===!1?"":a(this).html()}).get())}),e},updateOption:function(a,b,c,d){return"object"==typeof a&&(a=a.attr("data-bv-field")),this.options.fields[a]&&this.options.fields[a].validators[b]&&(this.options.fields[a].validators[b][c]=d,this.updateStatus(a,this.STATUS_NOT_VALIDATED,b)),this},addField:function(b,c){var d=a([]);switch(typeof b){case"object":d=b,b=b.attr("data-bv-field")||b.attr("name");break;case"string":delete this._cacheFields[b],d=this.getFieldElements(b)}d.attr("data-bv-field",b);for(var e=d.attr("type"),f="radio"===e||"checkbox"===e?1:d.length,g=0;f>g;g++){var h=d.eq(g),i=this._parseOptions(h);i=null===i?c:a.extend(!0,c,i),this.options.fields[b]=a.extend(!0,this.options.fields[b],i),this._cacheFields[b]=this._cacheFields[b]?this._cacheFields[b].add(h):h,this._initField("checkbox"===e||"radio"===e?b:h)}return this.disableSubmitButtons(!1),this.$form.trigger(a.Event(this.options.events.fieldAdded),{field:b,element:d,options:this.options.fields[b]}),this},removeField:function(b){var c=a([]);switch(typeof b){case"object":c=b,b=b.attr("data-bv-field")||b.attr("name"),c.attr("data-bv-field",b);break;case"string":c=this.getFieldElements(b)}if(0===c.length)return this;for(var d=c.attr("type"),e="radio"===d||"checkbox"===d?1:c.length,f=0;e>f;f++){var g=c.eq(f);this.$invalidFields=this.$invalidFields.not(g),this._cacheFields[b]=this._cacheFields[b].not(g)}return this._cacheFields[b]&&0!==this._cacheFields[b].length||delete this.options.fields[b],("checkbox"===d||"radio"===d)&&this._initField(b),this.disableSubmitButtons(!1),this.$form.trigger(a.Event(this.options.events.fieldRemoved),{field:b,element:c}),this},resetField:function(b,c){var d=a([]);switch(typeof b){case"object":d=b,b=b.attr("data-bv-field");break;case"string":d=this.getFieldElements(b)}var e=d.length;if(this.options.fields[b])for(var f=0;e>f;f++)for(var g in this.options.fields[b].validators)d.eq(f).removeData("bv.dfs."+g);if(this.updateStatus(b,this.STATUS_NOT_VALIDATED),c){var h=d.attr("type");"radio"===h||"checkbox"===h?d.removeAttr("checked").removeAttr("selected"):d.val("")}return this},resetForm:function(b){for(var c in this.options.fields)this.resetField(c,b);return this.$invalidFields=a([]),this.$submitButton=null,this.disableSubmitButtons(!1),this},revalidateField:function(a){return this.updateStatus(a,this.STATUS_NOT_VALIDATED).validateField(a),this},enableFieldValidators:function(a,b,c){var d=this.options.fields[a].validators;if(c&&d&&d[c]&&d[c].enabled!==b)this.options.fields[a].validators[c].enabled=b,this.updateStatus(a,this.STATUS_NOT_VALIDATED,c);else if(!c&&this.options.fields[a].enabled!==b){this.options.fields[a].enabled=b;for(var e in d)this.enableFieldValidators(a,b,e)}return this},getDynamicOption:function(b,c){var d="string"==typeof b?this.getFieldElements(b):b,e=d.val();if("function"==typeof c)return a.fn.bootstrapValidator.helpers.call(c,[e,this,d]);if("string"==typeof c){var f=this.getFieldElements(c);return f.length?f.val():a.fn.bootstrapValidator.helpers.call(c,[e,this,d])||c}return null},destroy:function(){var b,c,d,e,f,g;for(b in this.options.fields){c=this.getFieldElements(b),g=this.options.fields[b].group||this.options.group;for(var h=0;h<c.length;h++){if(d=c.eq(h),d.data("bv.messages").find('.help-block[data-bv-validator][data-bv-for="'+b+'"]').remove().end().end().removeData("bv.messages").parents(g).removeClass("has-feedback has-error has-success").end().off(".bv").removeAttr("data-bv-field"),f=d.data("bv.icon")){var i="function"==typeof(this.options.fields[b].container||this.options.container)?(this.options.fields[b].container||this.options.container).call(this,d,this):this.options.fields[b].container||this.options.container;switch(i){case"tooltip":f.tooltip("destroy").remove();break;case"popover":f.popover("destroy").remove();break;default:f.remove()}}d.removeData("bv.icon");for(e in this.options.fields[b].validators)d.data("bv.dfs."+e)&&d.data("bv.dfs."+e).reject(),d.removeData("bv.result."+e).removeData("bv.response."+e).removeData("bv.dfs."+e),"function"==typeof a.fn.bootstrapValidator.validators[e].destroy&&a.fn.bootstrapValidator.validators[e].destroy(this,d,this.options.fields[b].validators[e])}}this.disableSubmitButtons(!1),this.$hiddenButton.remove(),this.$form.removeClass(this.options.elementClass).off(".bv").removeData("bootstrapValidator").find("[data-bv-submit-hidden]").remove().end().find('[type="submit"]').off("click.bv")}},a.fn.bootstrapValidator=function(c){var d=arguments;return this.each(function(){var e=a(this),f=e.data("bootstrapValidator"),g="object"==typeof c&&c;f||(f=new b(this,g),e.data("bootstrapValidator",f)),"string"==typeof c&&f[c].apply(f,Array.prototype.slice.call(d,1))})},a.fn.bootstrapValidator.DEFAULT_OPTIONS={autoFocus:!0,container:null,elementClass:"bv-form",events:{formInit:"init.form.bv",formError:"error.form.bv",formSuccess:"success.form.bv",fieldAdded:"added.field.bv",fieldRemoved:"removed.field.bv",fieldInit:"init.field.bv",fieldError:"error.field.bv",fieldSuccess:"success.field.bv",fieldStatus:"status.field.bv",validatorError:"error.validator.bv",validatorSuccess:"success.validator.bv"},excluded:[":disabled",":hidden",":not(:visible)"],feedbackIcons:{valid:null,invalid:null,validating:null},fields:null,group:".form-group",live:"enabled",message:"This value is not valid",submitButtons:'[type="submit"]',threshold:null,verbose:!0},a.fn.bootstrapValidator.validators={},a.fn.bootstrapValidator.i18n={},a.fn.bootstrapValidator.Constructor=b,a.fn.bootstrapValidator.helpers={call:function(a,b){if("function"==typeof a)return a.apply(this,b);if("string"==typeof a){"()"===a.substring(a.length-2)&&(a=a.substring(0,a.length-2));for(var c=a.split("."),d=c.pop(),e=window,f=0;f<c.length;f++)e=e[c[f]];return"undefined"==typeof e[d]?null:e[d].apply(this,b)}},format:function(b,c){a.isArray(c)||(c=[c]);for(var d in c)b=b.replace("%s",c[d]);return b},date:function(a,b,c,d){if(isNaN(a)||isNaN(b)||isNaN(c))return!1;if(c.length>2||b.length>2||a.length>4)return!1;if(c=parseInt(c,10),b=parseInt(b,10),a=parseInt(a,10),1e3>a||a>9999||0>=b||b>12)return!1;var e=[31,28,31,30,31,30,31,31,30,31,30,31];if((a%400===0||a%100!==0&&a%4===0)&&(e[1]=29),0>=c||c>e[b-1])return!1;if(d===!0){var f=new Date,g=f.getFullYear(),h=f.getMonth(),i=f.getDate();return g>a||a===g&&h>b-1||a===g&&b-1===h&&i>c}return!0},luhn:function(a){for(var b=a.length,c=0,d=[[0,1,2,3,4,5,6,7,8,9],[0,2,4,6,8,1,3,5,7,9]],e=0;b--;)e+=d[c][parseInt(a.charAt(b),10)],c^=1;return e%10===0&&e>0},mod11And10:function(a){for(var b=5,c=a.length,d=0;c>d;d++)b=(2*(b||10)%11+parseInt(a.charAt(d),10))%10;return 1===b},mod37And36:function(a,b){b=b||"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";for(var c=b.length,d=a.length,e=Math.floor(c/2),f=0;d>f;f++)e=(2*(e||c)%(c+1)+b.indexOf(a.charAt(f)))%c;return 1===e}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.base64=a.extend(a.fn.bootstrapValidator.i18n.base64||{},{"default":"Please enter a valid base 64 encoded"}),a.fn.bootstrapValidator.validators.base64={validate:function(a,b){var c=b.val();return""===c?!0:/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.between=a.extend(a.fn.bootstrapValidator.i18n.between||{},{"default":"Please enter a value between %s and %s",notInclusive:"Please enter a value between %s and %s strictly"}),a.fn.bootstrapValidator.validators.between={html5Attributes:{message:"message",min:"min",max:"max",inclusive:"inclusive"},enableByHtml5:function(a){return"range"===a.attr("type")?{min:a.attr("min"),max:a.attr("max")}:!1},validate:function(b,c,d){var e=c.val();if(""===e)return!0;if(e=this._format(e),!a.isNumeric(e))return!1;var f=a.isNumeric(d.min)?d.min:b.getDynamicOption(c,d.min),g=a.isNumeric(d.max)?d.max:b.getDynamicOption(c,d.max),h=this._format(f),i=this._format(g);return e=parseFloat(e),d.inclusive===!0||void 0===d.inclusive?{valid:e>=h&&i>=e,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.between["default"],[f,g])}:{valid:e>h&&i>e,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.between.notInclusive,[f,g])}},_format:function(a){return(a+"").replace(",",".")}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.blank={validate:function(){return!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.callback=a.extend(a.fn.bootstrapValidator.i18n.callback||{},{"default":"Please enter a valid value"}),a.fn.bootstrapValidator.validators.callback={html5Attributes:{message:"message",callback:"callback"},validate:function(b,c,d){var e=c.val(),f=new a.Deferred,g={valid:!0};if(d.callback){var h=a.fn.bootstrapValidator.helpers.call(d.callback,[e,b,c]);g="boolean"==typeof h?{valid:h}:h}return f.resolve(c,"callback",g),f}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.choice=a.extend(a.fn.bootstrapValidator.i18n.choice||{},{"default":"Please enter a valid value",less:"Please choose %s options at minimum",more:"Please choose %s options at maximum",between:"Please choose %s - %s options"}),a.fn.bootstrapValidator.validators.choice={html5Attributes:{message:"message",min:"min",max:"max"},validate:function(b,c,d){var e=c.is("select")?b.getFieldElements(c.attr("data-bv-field")).find("option").filter(":selected").length:b.getFieldElements(c.attr("data-bv-field")).filter(":checked").length,f=d.min?a.isNumeric(d.min)?d.min:b.getDynamicOption(c,d.min):null,g=d.max?a.isNumeric(d.max)?d.max:b.getDynamicOption(c,d.max):null,h=!0,i=d.message||a.fn.bootstrapValidator.i18n.choice["default"];switch((f&&e<parseInt(f,10)||g&&e>parseInt(g,10))&&(h=!1),!0){case!!f&&!!g:i=a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.choice.between,[parseInt(f,10),parseInt(g,10)]);break;case!!f:i=a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.choice.less,parseInt(f,10));break;case!!g:i=a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.choice.more,parseInt(g,10))}return{valid:h,message:i}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.color=a.extend(a.fn.bootstrapValidator.i18n.color||{},{"default":"Please enter a valid color"}),a.fn.bootstrapValidator.validators.color={SUPPORTED_TYPES:["hex","rgb","rgba","hsl","hsla","keyword"],KEYWORD_COLORS:["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","transparent","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"],validate:function(b,c,d){var e=c.val();
+if(""===e)return!0;var f=d.type||this.SUPPORTED_TYPES;a.isArray(f)||(f=f.replace(/s/g,"").split(","));for(var g,h,i=!1,j=0;j<f.length;j++)if(h=f[j],g="_"+h.toLowerCase(),i=i||this[g](e))return!0;return!1},_hex:function(a){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a)},_hsl:function(a){return/^hsl\((\s*(-?\d+)\s*,)(\s*(\b(0?\d{1,2}|100)\b%)\s*,)(\s*(\b(0?\d{1,2}|100)\b%)\s*)\)$/.test(a)},_hsla:function(a){return/^hsla\((\s*(-?\d+)\s*,)(\s*(\b(0?\d{1,2}|100)\b%)\s*,){2}(\s*(0?(\.\d+)?|1(\.0+)?)\s*)\)$/.test(a)},_keyword:function(b){return a.inArray(b,this.KEYWORD_COLORS)>=0},_rgb:function(a){var b=/^rgb\((\s*(\b([01]?\d{1,2}|2[0-4]\d|25[0-5])\b)\s*,){2}(\s*(\b([01]?\d{1,2}|2[0-4]\d|25[0-5])\b)\s*)\)$/,c=/^rgb\((\s*(\b(0?\d{1,2}|100)\b%)\s*,){2}(\s*(\b(0?\d{1,2}|100)\b%)\s*)\)$/;return b.test(a)||c.test(a)},_rgba:function(a){var b=/^rgba\((\s*(\b([01]?\d{1,2}|2[0-4]\d|25[0-5])\b)\s*,){3}(\s*(0?(\.\d+)?|1(\.0+)?)\s*)\)$/,c=/^rgba\((\s*(\b(0?\d{1,2}|100)\b%)\s*,){3}(\s*(0?(\.\d+)?|1(\.0+)?)\s*)\)$/;return b.test(a)||c.test(a)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.creditCard=a.extend(a.fn.bootstrapValidator.i18n.creditCard||{},{"default":"Please enter a valid credit card number"}),a.fn.bootstrapValidator.validators.creditCard={validate:function(b,c){var d=c.val();if(""===d)return!0;if(/[^0-9-\s]+/.test(d))return!1;if(d=d.replace(/\D/g,""),!a.fn.bootstrapValidator.helpers.luhn(d))return!1;var e,f,g={AMERICAN_EXPRESS:{length:[15],prefix:["34","37"]},DINERS_CLUB:{length:[14],prefix:["300","301","302","303","304","305","36"]},DINERS_CLUB_US:{length:[16],prefix:["54","55"]},DISCOVER:{length:[16],prefix:["6011","622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925","644","645","646","647","648","649","65"]},JCB:{length:[16],prefix:["3528","3529","353","354","355","356","357","358"]},LASER:{length:[16,17,18,19],prefix:["6304","6706","6771","6709"]},MAESTRO:{length:[12,13,14,15,16,17,18,19],prefix:["5018","5020","5038","6304","6759","6761","6762","6763","6764","6765","6766"]},MASTERCARD:{length:[16],prefix:["51","52","53","54","55"]},SOLO:{length:[16,18,19],prefix:["6334","6767"]},UNIONPAY:{length:[16,17,18,19],prefix:["622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925"]},VISA:{length:[16],prefix:["4"]}};for(e in g)for(f in g[e].prefix)if(d.substr(0,g[e].prefix[f].length)===g[e].prefix[f]&&-1!==a.inArray(d.length,g[e].length))return!0;return!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.cusip=a.extend(a.fn.bootstrapValidator.i18n.cusip||{},{"default":"Please enter a valid CUSIP number"}),a.fn.bootstrapValidator.validators.cusip={validate:function(b,c){var d=c.val();if(""===d)return!0;if(d=d.toUpperCase(),!/^[0-9A-Z]{9}$/.test(d))return!1;for(var e=a.map(d.split(""),function(a){var b=a.charCodeAt(0);return b>="A".charCodeAt(0)&&b<="Z".charCodeAt(0)?b-"A".charCodeAt(0)+10:a}),f=e.length,g=0,h=0;f-1>h;h++){var i=parseInt(e[h],10);h%2!==0&&(i*=2),i>9&&(i-=9),g+=i}return g=(10-g%10)%10,g===e[f-1]}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.cvv=a.extend(a.fn.bootstrapValidator.i18n.cvv||{},{"default":"Please enter a valid CVV number"}),a.fn.bootstrapValidator.validators.cvv={html5Attributes:{message:"message",ccfield:"creditCardField"},validate:function(b,c,d){var e=c.val();if(""===e)return!0;if(!/^[0-9]{3,4}$/.test(e))return!1;if(!d.creditCardField)return!0;var f=b.getFieldElements(d.creditCardField).val();if(""===f)return!0;f=f.replace(/\D/g,"");var g,h,i={AMERICAN_EXPRESS:{length:[15],prefix:["34","37"]},DINERS_CLUB:{length:[14],prefix:["300","301","302","303","304","305","36"]},DINERS_CLUB_US:{length:[16],prefix:["54","55"]},DISCOVER:{length:[16],prefix:["6011","622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925","644","645","646","647","648","649","65"]},JCB:{length:[16],prefix:["3528","3529","353","354","355","356","357","358"]},LASER:{length:[16,17,18,19],prefix:["6304","6706","6771","6709"]},MAESTRO:{length:[12,13,14,15,16,17,18,19],prefix:["5018","5020","5038","6304","6759","6761","6762","6763","6764","6765","6766"]},MASTERCARD:{length:[16],prefix:["51","52","53","54","55"]},SOLO:{length:[16,18,19],prefix:["6334","6767"]},UNIONPAY:{length:[16,17,18,19],prefix:["622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925"]},VISA:{length:[16],prefix:["4"]}},j=null;for(g in i)for(h in i[g].prefix)if(f.substr(0,i[g].prefix[h].length)===i[g].prefix[h]&&-1!==a.inArray(f.length,i[g].length)){j=g;break}return null===j?!1:"AMERICAN_EXPRESS"===j?4===e.length:3===e.length}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.date=a.extend(a.fn.bootstrapValidator.i18n.date||{},{"default":"Please enter a valid date",min:"Please enter a date after %s",max:"Please enter a date before %s",range:"Please enter a date in the range %s - %s"}),a.fn.bootstrapValidator.validators.date={html5Attributes:{message:"message",format:"format",min:"min",max:"max",separator:"separator"},validate:function(b,c,d){var e=c.val();if(""===e)return!0;d.format=d.format||"MM/DD/YYYY","date"===c.attr("type")&&(d.format="YYYY-MM-DD");var f=d.format.split(" "),g=f[0],h=f.length>1?f[1]:null,i=f.length>2?f[2]:null,j=e.split(" "),k=j[0],l=j.length>1?j[1]:null;if(f.length!==j.length)return{valid:!1,message:d.message||a.fn.bootstrapValidator.i18n.date["default"]};var m=d.separator;if(m||(m=-1!==k.indexOf("/")?"/":-1!==k.indexOf("-")?"-":null),null===m||-1===k.indexOf(m))return{valid:!1,message:d.message||a.fn.bootstrapValidator.i18n.date["default"]};if(k=k.split(m),g=g.split(m),k.length!==g.length)return{valid:!1,message:d.message||a.fn.bootstrapValidator.i18n.date["default"]};var n=k[a.inArray("YYYY",g)],o=k[a.inArray("MM",g)],p=k[a.inArray("DD",g)];if(!n||!o||!p||4!==n.length)return{valid:!1,message:d.message||a.fn.bootstrapValidator.i18n.date["default"]};var q=null,r=null,s=null;if(h){if(h=h.split(":"),l=l.split(":"),h.length!==l.length)return{valid:!1,message:d.message||a.fn.bootstrapValidator.i18n.date["default"]};if(r=l.length>0?l[0]:null,q=l.length>1?l[1]:null,s=l.length>2?l[2]:null){if(isNaN(s)||s.length>2)return{valid:!1,message:d.message||a.fn.bootstrapValidator.i18n.date["default"]};if(s=parseInt(s,10),0>s||s>60)return{valid:!1,message:d.message||a.fn.bootstrapValidator.i18n.date["default"]}}if(r){if(isNaN(r)||r.length>2)return{valid:!1,message:d.message||a.fn.bootstrapValidator.i18n.date["default"]};if(r=parseInt(r,10),0>r||r>=24||i&&r>12)return{valid:!1,message:d.message||a.fn.bootstrapValidator.i18n.date["default"]}}if(q){if(isNaN(q)||q.length>2)return{valid:!1,message:d.message||a.fn.bootstrapValidator.i18n.date["default"]};if(q=parseInt(q,10),0>q||q>59)return{valid:!1,message:d.message||a.fn.bootstrapValidator.i18n.date["default"]}}}var t=a.fn.bootstrapValidator.helpers.date(n,o,p),u=d.message||a.fn.bootstrapValidator.i18n.date["default"],v=null,w=null,x=d.min,y=d.max;switch(x&&(isNaN(Date.parse(x))&&(x=b.getDynamicOption(c,x)),v=this._parseDate(x,g,m)),y&&(isNaN(Date.parse(y))&&(y=b.getDynamicOption(c,y)),w=this._parseDate(y,g,m)),k=new Date(n,o,p,r,q,s),!0){case x&&!y&&t:t=k.getTime()>=v.getTime(),u=d.message||a.fn.bootstrapValidator.helpers.format(a.fn.bootstrapValidator.i18n.date.min,x);break;case y&&!x&&t:t=k.getTime()<=w.getTime(),u=d.message||a.fn.bootstrapValidator.helpers.format(a.fn.bootstrapValidator.i18n.date.max,y);break;case y&&x&&t:t=k.getTime()<=w.getTime()&&k.getTime()>=v.getTime(),u=d.message||a.fn.bootstrapValidator.helpers.format(a.fn.bootstrapValidator.i18n.date.range,[x,y])}return{valid:t,message:u}},_parseDate:function(b,c,d){var e=0,f=0,g=0,h=b.split(" "),i=h[0],j=h.length>1?h[1]:null;i=i.split(d);var k=i[a.inArray("YYYY",c)],l=i[a.inArray("MM",c)],m=i[a.inArray("DD",c)];return j&&(j=j.split(":"),f=j.length>0?j[0]:null,e=j.length>1?j[1]:null,g=j.length>2?j[2]:null),new Date(k,l,m,f,e,g)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.different=a.extend(a.fn.bootstrapValidator.i18n.different||{},{"default":"Please enter a different value"}),a.fn.bootstrapValidator.validators.different={html5Attributes:{message:"message",field:"field"},validate:function(a,b,c){var d=b.val();if(""===d)return!0;for(var e=c.field.split(","),f=!0,g=0;g<e.length;g++){var h=a.getFieldElements(e[g]);if(null!=h&&0!==h.length){var i=h.val();d===i?f=!1:""!==i&&a.updateStatus(h,a.STATUS_VALID,"different")}}return f}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.digits=a.extend(a.fn.bootstrapValidator.i18n.digits||{},{"default":"Please enter only digits"}),a.fn.bootstrapValidator.validators.digits={validate:function(a,b){var c=b.val();return""===c?!0:/^\d+$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.ean=a.extend(a.fn.bootstrapValidator.i18n.ean||{},{"default":"Please enter a valid EAN number"}),a.fn.bootstrapValidator.validators.ean={validate:function(a,b){var c=b.val();if(""===c)return!0;if(!/^(\d{8}|\d{12}|\d{13})$/.test(c))return!1;for(var d=c.length,e=0,f=8===d?[3,1]:[1,3],g=0;d-1>g;g++)e+=parseInt(c.charAt(g),10)*f[g%2];return e=(10-e%10)%10,e+""===c.charAt(d-1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.emailAddress=a.extend(a.fn.bootstrapValidator.i18n.emailAddress||{},{"default":"Please enter a valid email address"}),a.fn.bootstrapValidator.validators.emailAddress={html5Attributes:{message:"message",multiple:"multiple",separator:"separator"},enableByHtml5:function(a){return"email"===a.attr("type")},validate:function(a,b,c){var d=b.val();if(""===d)return!0;var e=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,f=c.multiple===!0||"true"===c.multiple;if(f){for(var g=c.separator||/[,;]/,h=this._splitEmailAddresses(d,g),i=0;i<h.length;i++)if(!e.test(h[i]))return!1;return!0}return e.test(d)},_splitEmailAddresses:function(a,b){for(var c=a.split(/"/),d=c.length,e=[],f="",g=0;d>g;g++)if(g%2===0){var h=c[g].split(b),i=h.length;if(1===i)f+=h[0];else{e.push(f+h[0]);for(var j=1;i-1>j;j++)e.push(h[j]);f=h[i-1]}}else f+='"'+c[g],d-1>g&&(f+='"');return e.push(f),e}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.file=a.extend(a.fn.bootstrapValidator.i18n.file||{},{"default":"Please choose a valid file"}),a.fn.bootstrapValidator.validators.file={html5Attributes:{extension:"extension",maxfiles:"maxFiles",minfiles:"minFiles",maxsize:"maxSize",minsize:"minSize",maxtotalsize:"maxTotalSize",mintotalsize:"minTotalSize",message:"message",type:"type"},validate:function(b,c,d){var e=c.val();if(""===e)return!0;var f,g=d.extension?d.extension.toLowerCase().split(","):null,h=d.type?d.type.toLowerCase().split(","):null,i=window.File&&window.FileList&&window.FileReader;if(i){var j=c.get(0).files,k=j.length,l=0;if(d.maxFiles&&k>parseInt(d.maxFiles,10)||d.minFiles&&k<parseInt(d.minFiles,10))return!1;for(var m=0;k>m;m++)if(l+=j[m].size,f=j[m].name.substr(j[m].name.lastIndexOf(".")+1),d.minSize&&j[m].size<parseInt(d.minSize,10)||d.maxSize&&j[m].size>parseInt(d.maxSize,10)||g&&-1===a.inArray(f.toLowerCase(),g)||j[m].type&&h&&-1===a.inArray(j[m].type.toLowerCase(),h))return!1;if(d.maxTotalSize&&l>parseInt(d.maxTotalSize,10)||d.minTotalSize&&l<parseInt(d.minTotalSize,10))return!1}else if(f=e.substr(e.lastIndexOf(".")+1),g&&-1===a.inArray(f.toLowerCase(),g))return!1;return!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.greaterThan=a.extend(a.fn.bootstrapValidator.i18n.greaterThan||{},{"default":"Please enter a value greater than or equal to %s",notInclusive:"Please enter a value greater than %s"}),a.fn.bootstrapValidator.validators.greaterThan={html5Attributes:{message:"message",value:"value",inclusive:"inclusive"},enableByHtml5:function(a){var b=a.attr("type"),c=a.attr("min");return c&&"date"!==b?{value:c}:!1},validate:function(b,c,d){var e=c.val();if(""===e)return!0;if(e=this._format(e),!a.isNumeric(e))return!1;var f=a.isNumeric(d.value)?d.value:b.getDynamicOption(c,d.value),g=this._format(f);return e=parseFloat(e),d.inclusive===!0||void 0===d.inclusive?{valid:e>=g,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.greaterThan["default"],f)}:{valid:e>g,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.greaterThan.notInclusive,f)}},_format:function(a){return(a+"").replace(",",".")}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.grid=a.extend(a.fn.bootstrapValidator.i18n.grid||{},{"default":"Please enter a valid GRId number"}),a.fn.bootstrapValidator.validators.grid={validate:function(b,c){var d=c.val();return""===d?!0:(d=d.toUpperCase(),/^[GRID:]*([0-9A-Z]{2})[-\s]*([0-9A-Z]{5})[-\s]*([0-9A-Z]{10})[-\s]*([0-9A-Z]{1})$/g.test(d)?(d=d.replace(/\s/g,"").replace(/-/g,""),"GRID:"===d.substr(0,5)&&(d=d.substr(5)),a.fn.bootstrapValidator.helpers.mod37And36(d)):!1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.hex=a.extend(a.fn.bootstrapValidator.i18n.hex||{},{"default":"Please enter a valid hexadecimal number"}),a.fn.bootstrapValidator.validators.hex={validate:function(a,b){var c=b.val();return""===c?!0:/^[0-9a-fA-F]+$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.hexColor=a.extend(a.fn.bootstrapValidator.i18n.hexColor||{},{"default":"Please enter a valid hex color"}),a.fn.bootstrapValidator.validators.hexColor={enableByHtml5:function(a){return"color"===a.attr("type")},validate:function(a,b){var c=b.val();return""===c?!0:"color"===b.attr("type")?/^#[0-9A-F]{6}$/i.test(c):/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.iban=a.extend(a.fn.bootstrapValidator.i18n.iban||{},{"default":"Please enter a valid IBAN number",countryNotSupported:"The country code %s is not supported",country:"Please enter a valid IBAN number in %s",countries:{AD:"Andorra",AE:"United Arab Emirates",AL:"Albania",AO:"Angola",AT:"Austria",AZ:"Azerbaijan",BA:"Bosnia and Herzegovina",BE:"Belgium",BF:"Burkina Faso",BG:"Bulgaria",BH:"Bahrain",BI:"Burundi",BJ:"Benin",BR:"Brazil",CH:"Switzerland",CI:"Ivory Coast",CM:"Cameroon",CR:"Costa Rica",CV:"Cape Verde",CY:"Cyprus",CZ:"Czech Republic",DE:"Germany",DK:"Denmark",DO:"Dominican Republic",DZ:"Algeria",EE:"Estonia",ES:"Spain",FI:"Finland",FO:"Faroe Islands",FR:"France",GB:"United Kingdom",GE:"Georgia",GI:"Gibraltar",GL:"Greenland",GR:"Greece",GT:"Guatemala",HR:"Croatia",HU:"Hungary",IE:"Ireland",IL:"Israel",IR:"Iran",IS:"Iceland",IT:"Italy",JO:"Jordan",KW:"Kuwait",KZ:"Kazakhstan",LB:"Lebanon",LI:"Liechtenstein",LT:"Lithuania",LU:"Luxembourg",LV:"Latvia",MC:"Monaco",MD:"Moldova",ME:"Montenegro",MG:"Madagascar",MK:"Macedonia",ML:"Mali",MR:"Mauritania",MT:"Malta",MU:"Mauritius",MZ:"Mozambique",NL:"Netherlands",NO:"Norway",PK:"Pakistan",PL:"Poland",PS:"Palestine",PT:"Portugal",QA:"Qatar",RO:"Romania",RS:"Serbia",SA:"Saudi Arabia",SE:"Sweden",SI:"Slovenia",SK:"Slovakia",SM:"San Marino",SN:"Senegal",TN:"Tunisia",TR:"Turkey",VG:"Virgin Islands, British"}}),a.fn.bootstrapValidator.validators.iban={html5Attributes:{message:"message",country:"country"},REGEX:{AD:"AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}",AE:"AE[0-9]{2}[0-9]{3}[0-9]{16}",AL:"AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}",AO:"AO[0-9]{2}[0-9]{21}",AT:"AT[0-9]{2}[0-9]{5}[0-9]{11}",AZ:"AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}",BA:"BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}",BE:"BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}",BF:"BF[0-9]{2}[0-9]{23}",BG:"BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}",BH:"BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}",BI:"BI[0-9]{2}[0-9]{12}",BJ:"BJ[0-9]{2}[A-Z]{1}[0-9]{23}",BR:"BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]",CH:"CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}",CI:"CI[0-9]{2}[A-Z]{1}[0-9]{23}",CM:"CM[0-9]{2}[0-9]{23}",CR:"CR[0-9]{2}[0-9]{3}[0-9]{14}",CV:"CV[0-9]{2}[0-9]{21}",CY:"CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}",CZ:"CZ[0-9]{2}[0-9]{20}",DE:"DE[0-9]{2}[0-9]{8}[0-9]{10}",DK:"DK[0-9]{2}[0-9]{14}",DO:"DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}",DZ:"DZ[0-9]{2}[0-9]{20}",EE:"EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}",ES:"ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}",FI:"FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}",FO:"FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}",FR:"FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}",GB:"GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}",GE:"GE[0-9]{2}[A-Z]{2}[0-9]{16}",GI:"GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}",GL:"GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}",GR:"GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}",GT:"GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}",HR:"HR[0-9]{2}[0-9]{7}[0-9]{10}",HU:"HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}",IE:"IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}",IL:"IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}",IR:"IR[0-9]{2}[0-9]{22}",IS:"IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}",IT:"IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}",JO:"JO[0-9]{2}[A-Z]{4}[0-9]{4}[0]{8}[A-Z0-9]{10}",KW:"KW[0-9]{2}[A-Z]{4}[0-9]{22}",KZ:"KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}",LB:"LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}",LI:"LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}",LT:"LT[0-9]{2}[0-9]{5}[0-9]{11}",LU:"LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}",LV:"LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}",MC:"MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}",MD:"MD[0-9]{2}[A-Z0-9]{20}",ME:"ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",MG:"MG[0-9]{2}[0-9]{23}",MK:"MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}",ML:"ML[0-9]{2}[A-Z]{1}[0-9]{23}",MR:"MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}",MT:"MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}",MU:"MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}",MZ:"MZ[0-9]{2}[0-9]{21}",NL:"NL[0-9]{2}[A-Z]{4}[0-9]{10}",NO:"NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}",PK:"PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}",PL:"PL[0-9]{2}[0-9]{8}[0-9]{16}",PS:"PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}",PT:"PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}",QA:"QA[0-9]{2}[A-Z]{4}[A-Z0-9]{21}",RO:"RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}",RS:"RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",SA:"SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}",SE:"SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}",SI:"SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}",SK:"SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}",SM:"SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}",SN:"SN[0-9]{2}[A-Z]{1}[0-9]{23}",TN:"TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",TR:"TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}",VG:"VG[0-9]{2}[A-Z]{4}[0-9]{16}"},validate:function(b,c,d){var e=c.val();if(""===e)return!0;e=e.replace(/[^a-zA-Z0-9]/g,"").toUpperCase();var f=d.country;if(f?"string"==typeof f&&this.REGEX[f]||(f=b.getDynamicOption(c,f)):f=e.substr(0,2),!this.REGEX[f])return{valid:!1,message:a.fn.bootstrapValidator.helpers.format(a.fn.bootstrapValidator.i18n.iban.countryNotSupported,f)};if(!new RegExp("^"+this.REGEX[f]+"$").test(e))return{valid:!1,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.iban.country,a.fn.bootstrapValidator.i18n.iban.countries[f])};e=e.substr(4)+e.substr(0,4),e=a.map(e.split(""),function(a){var b=a.charCodeAt(0);return b>="A".charCodeAt(0)&&b<="Z".charCodeAt(0)?b-"A".charCodeAt(0)+10:a}),e=e.join("");for(var g=parseInt(e.substr(0,1),10),h=e.length,i=1;h>i;++i)g=(10*g+parseInt(e.substr(i,1),10))%97;return{valid:1===g,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.iban.country,a.fn.bootstrapValidator.i18n.iban.countries[f])}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.id=a.extend(a.fn.bootstrapValidator.i18n.id||{},{"default":"Please enter a valid identification number",countryNotSupported:"The country code %s is not supported",country:"Please enter a valid identification number in %s",countries:{BA:"Bosnia and Herzegovina",BG:"Bulgaria",BR:"Brazil",CH:"Switzerland",CL:"Chile",CN:"China",CZ:"Czech Republic",DK:"Denmark",EE:"Estonia",ES:"Spain",FI:"Finland",HR:"Croatia",IE:"Ireland",IS:"Iceland",LT:"Lithuania",LV:"Latvia",ME:"Montenegro",MK:"Macedonia",NL:"Netherlands",RO:"Romania",RS:"Serbia",SE:"Sweden",SI:"Slovenia",SK:"Slovakia",SM:"San Marino",TH:"Thailand",ZA:"South Africa"}}),a.fn.bootstrapValidator.validators.id={html5Attributes:{message:"message",country:"country"},COUNTRY_CODES:["BA","BG","BR","CH","CL","CN","CZ","DK","EE","ES","FI","HR","IE","IS","LT","LV","ME","MK","NL","RO","RS","SE","SI","SK","SM","TH","ZA"],validate:function(b,c,d){var e=c.val();if(""===e)return!0;var f=d.country;if(f?("string"!=typeof f||-1===a.inArray(f.toUpperCase(),this.COUNTRY_CODES))&&(f=b.getDynamicOption(c,f)):f=e.substr(0,2),-1===a.inArray(f,this.COUNTRY_CODES))return{valid:!1,message:a.fn.bootstrapValidator.helpers.format(a.fn.bootstrapValidator.i18n.id.countryNotSupported,f)};var g=["_",f.toLowerCase()].join("");return this[g](e)?!0:{valid:!1,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.id.country,a.fn.bootstrapValidator.i18n.id.countries[f.toUpperCase()])}},_validateJMBG:function(a,b){if(!/^\d{13}$/.test(a))return!1;var c=parseInt(a.substr(0,2),10),d=parseInt(a.substr(2,2),10),e=(parseInt(a.substr(4,3),10),parseInt(a.substr(7,2),10)),f=parseInt(a.substr(12,1),10);if(c>31||d>12)return!1;for(var g=0,h=0;6>h;h++)g+=(7-h)*(parseInt(a.charAt(h),10)+parseInt(a.charAt(h+6),10));if(g=11-g%11,(10===g||11===g)&&(g=0),g!==f)return!1;switch(b.toUpperCase()){case"BA":return e>=10&&19>=e;case"MK":return e>=41&&49>=e;case"ME":return e>=20&&29>=e;case"RS":return e>=70&&99>=e;case"SI":return e>=50&&59>=e;default:return!0}},_ba:function(a){return this._validateJMBG(a,"BA")},_mk:function(a){return this._validateJMBG(a,"MK")},_me:function(a){return this._validateJMBG(a,"ME")},_rs:function(a){return this._validateJMBG(a,"RS")},_si:function(a){return this._validateJMBG(a,"SI")},_bg:function(b){if(!/^\d{10}$/.test(b)&&!/^\d{6}\s\d{3}\s\d{1}$/.test(b))return!1;b=b.replace(/\s/g,"");var c=parseInt(b.substr(0,2),10)+1900,d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10);if(d>40?(c+=100,d-=40):d>20&&(c-=100,d-=20),!a.fn.bootstrapValidator.helpers.date(c,d,e))return!1;for(var f=0,g=[2,4,8,5,10,9,7,3,6],h=0;9>h;h++)f+=parseInt(b.charAt(h),10)*g[h];return f=f%11%10,f+""===b.substr(9,1)},_br:function(a){if(/^1{11}|2{11}|3{11}|4{11}|5{11}|6{11}|7{11}|8{11}|9{11}|0{11}$/.test(a))return!1;if(!/^\d{11}$/.test(a)&&!/^\d{3}\.\d{3}\.\d{3}-\d{2}$/.test(a))return!1;a=a.replace(/\./g,"").replace(/-/g,"");for(var b=0,c=0;9>c;c++)b+=(10-c)*parseInt(a.charAt(c),10);if(b=11-b%11,(10===b||11===b)&&(b=0),b+""!==a.charAt(9))return!1;var d=0;for(c=0;10>c;c++)d+=(11-c)*parseInt(a.charAt(c),10);return d=11-d%11,(10===d||11===d)&&(d=0),d+""===a.charAt(10)},_ch:function(a){if(!/^756[\.]{0,1}[0-9]{4}[\.]{0,1}[0-9]{4}[\.]{0,1}[0-9]{2}$/.test(a))return!1;a=a.replace(/\D/g,"").substr(3);for(var b=a.length,c=0,d=8===b?[3,1]:[1,3],e=0;b-1>e;e++)c+=parseInt(a.charAt(e),10)*d[e%2];return c=10-c%10,c+""===a.charAt(b-1)},_cl:function(a){if(!/^\d{7,8}[-]{0,1}[0-9K]$/i.test(a))return!1;for(a=a.replace(/\-/g,"");a.length<9;)a="0"+a;for(var b=0,c=[3,2,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b=11-b%11,11===b?b=0:10===b&&(b="K"),b+""===a.charAt(8).toUpperCase()},_cn:function(b){if(b=b.trim(),!/^\d{15}$/.test(b)&&!/^\d{17}[\dXx]{1}$/.test(b))return!1;var c={11:{0:[0],1:[[0,9],[11,17]],2:[0,28,29]},12:{0:[0],1:[[0,16]],2:[0,21,23,25]},13:{0:[0],1:[[0,5],7,8,21,[23,33],[81,85]],2:[[0,5],[7,9],[23,25],27,29,30,81,83],3:[[0,4],[21,24]],4:[[0,4],6,21,[23,35],81],5:[[0,3],[21,35],81,82],6:[[0,4],[21,38],[81,84]],7:[[0,3],5,6,[21,33]],8:[[0,4],[21,28]],9:[[0,3],[21,30],[81,84]],10:[[0,3],[22,26],28,81,82],11:[[0,2],[21,28],81,82]},14:{0:[0],1:[0,1,[5,10],[21,23],81],2:[[0,3],11,12,[21,27]],3:[[0,3],11,21,22],4:[[0,2],11,21,[23,31],81],5:[[0,2],21,22,24,25,81],6:[[0,3],[21,24]],7:[[0,2],[21,29],81],8:[[0,2],[21,30],81,82],9:[[0,2],[21,32],81],10:[[0,2],[21,34],81,82],11:[[0,2],[21,30],81,82],23:[[0,3],22,23,[25,30],32,33]},15:{0:[0],1:[[0,5],[21,25]],2:[[0,7],[21,23]],3:[[0,4]],4:[[0,4],[21,26],[28,30]],5:[[0,2],[21,26],81],6:[[0,2],[21,27]],7:[[0,3],[21,27],[81,85]],8:[[0,2],[21,26]],9:[[0,2],[21,29],81],22:[[0,2],[21,24]],25:[[0,2],[22,31]],26:[[0,2],[24,27],[29,32],34],28:[0,1,[22,27]],29:[0,[21,23]]},21:{0:[0],1:[[0,6],[11,14],[22,24],81],2:[[0,4],[11,13],24,[81,83]],3:[[0,4],11,21,23,81],4:[[0,4],11,[21,23]],5:[[0,5],21,22],6:[[0,4],24,81,82],7:[[0,3],11,26,27,81,82],8:[[0,4],11,81,82],9:[[0,5],11,21,22],10:[[0,5],11,21,81],11:[[0,3],21,22],12:[[0,2],4,21,23,24,81,82],13:[[0,3],21,22,24,81,82],14:[[0,4],21,22,81]},22:{0:[0],1:[[0,6],12,22,[81,83]],2:[[0,4],11,21,[81,84]],3:[[0,3],22,23,81,82],4:[[0,3],21,22],5:[[0,3],21,23,24,81,82],6:[[0,2],4,5,[21,23],25,81],7:[[0,2],[21,24],81],8:[[0,2],21,22,81,82],24:[[0,6],24,26]},23:{0:[0],1:[[0,12],21,[23,29],[81,84]],2:[[0,8],21,[23,25],27,[29,31],81],3:[[0,7],21,81,82],4:[[0,7],21,22],5:[[0,3],5,6,[21,24]],6:[[0,6],[21,24]],7:[[0,16],22,81],8:[[0,5],11,22,26,28,33,81,82],9:[[0,4],21],10:[[0,5],24,25,81,[83,85]],11:[[0,2],21,23,24,81,82],12:[[0,2],[21,26],[81,83]],27:[[0,4],[21,23]]},31:{0:[0],1:[0,1,[3,10],[12,20]],2:[0,30]},32:{0:[0],1:[[0,7],11,[13,18],24,25],2:[[0,6],11,81,82],3:[[0,5],11,12,[21,24],81,82],4:[[0,2],4,5,11,12,81,82],5:[[0,9],[81,85]],6:[[0,2],11,12,21,23,[81,84]],7:[0,1,3,5,6,[21,24]],8:[[0,4],11,26,[29,31]],9:[[0,3],[21,25],28,81,82],10:[[0,3],11,12,23,81,84,88],11:[[0,2],11,12,[81,83]],12:[[0,4],[81,84]],13:[[0,2],11,[21,24]]},33:{0:[0],1:[[0,6],[8,10],22,27,82,83,85],2:[0,1,[3,6],11,12,25,26,[81,83]],3:[[0,4],22,24,[26,29],81,82],4:[[0,2],11,21,24,[81,83]],5:[[0,3],[21,23]],6:[[0,2],21,24,[81,83]],7:[[0,3],23,26,27,[81,84]],8:[[0,3],22,24,25,81],9:[[0,3],21,22],10:[[0,4],[21,24],81,82],11:[[0,2],[21,27],81]},34:{0:[0],1:[[0,4],11,[21,24],81],2:[[0,4],7,8,[21,23],25],3:[[0,4],11,[21,23]],4:[[0,6],21],5:[[0,4],6,[21,23]],6:[[0,4],21],7:[[0,3],11,21],8:[[0,3],11,[22,28],81],10:[[0,4],[21,24]],11:[[0,3],22,[24,26],81,82],12:[[0,4],21,22,25,26,82],13:[[0,2],[21,24]],14:[[0,2],[21,24]],15:[[0,3],[21,25]],16:[[0,2],[21,23]],17:[[0,2],[21,23]],18:[[0,2],[21,25],81]},35:{0:[0],1:[[0,5],11,[21,25],28,81,82],2:[[0,6],[11,13]],3:[[0,5],22],4:[[0,3],21,[23,30],81],5:[[0,5],21,[24,27],[81,83]],6:[[0,3],[22,29],81],7:[[0,2],[21,25],[81,84]],8:[[0,2],[21,25],81],9:[[0,2],[21,26],81,82]},36:{0:[0],1:[[0,5],11,[21,24]],2:[[0,3],22,81],3:[[0,2],13,[21,23]],4:[[0,3],21,[23,30],81,82],5:[[0,2],21],6:[[0,2],22,81],7:[[0,2],[21,35],81,82],8:[[0,3],[21,30],81],9:[[0,2],[21,26],[81,83]],10:[[0,2],[21,30]],11:[[0,2],[21,30],81]},37:{0:[0],1:[[0,5],12,13,[24,26],81],2:[[0,3],5,[11,14],[81,85]],3:[[0,6],[21,23]],4:[[0,6],81],5:[[0,3],[21,23]],6:[[0,2],[11,13],34,[81,87]],7:[[0,5],24,25,[81,86]],8:[[0,2],11,[26,32],[81,83]],9:[[0,3],11,21,23,82,83],10:[[0,2],[81,83]],11:[[0,3],21,22],12:[[0,3]],13:[[0,2],11,12,[21,29]],14:[[0,2],[21,28],81,82],15:[[0,2],[21,26],81],16:[[0,2],[21,26]],17:[[0,2],[21,28]]},41:{0:[0],1:[[0,6],8,22,[81,85]],2:[[0,5],11,[21,25]],3:[[0,7],11,[22,29],81],4:[[0,4],11,[21,23],25,81,82],5:[[0,3],5,6,22,23,26,27,81],6:[[0,3],11,21,22],7:[[0,4],11,21,[24,28],81,82],8:[[0,4],11,[21,23],25,[81,83]],9:[[0,2],22,23,[26,28]],10:[[0,2],[23,25],81,82],11:[[0,4],[21,23]],12:[[0,2],21,22,24,81,82],13:[[0,3],[21,30],81],14:[[0,3],[21,26],81],15:[[0,3],[21,28]],16:[[0,2],[21,28],81],17:[[0,2],[21,29]],90:[0,1]},42:{0:[0],1:[[0,7],[11,17]],2:[[0,5],22,81],3:[[0,3],[21,25],81],5:[[0,6],[25,29],[81,83]],6:[[0,2],6,7,[24,26],[82,84]],7:[[0,4]],8:[[0,2],4,21,22,81],9:[[0,2],[21,23],81,82,84],10:[[0,3],[22,24],81,83,87],11:[[0,2],[21,27],81,82],12:[[0,2],[21,24],81],13:[[0,3],21,81],28:[[0,2],22,23,[25,28]],90:[0,[4,6],21]},43:{0:[0],1:[[0,5],11,12,21,22,24,81],2:[[0,4],11,21,[23,25],81],3:[[0,2],4,21,81,82],4:[0,1,[5,8],12,[21,24],26,81,82],5:[[0,3],11,[21,25],[27,29],81],6:[[0,3],11,21,23,24,26,81,82],7:[[0,3],[21,26],81],8:[[0,2],11,21,22],9:[[0,3],[21,23],81],10:[[0,3],[21,28],81],11:[[0,3],[21,29]],12:[[0,2],[21,30],81],13:[[0,2],21,22,81,82],31:[0,1,[22,27],30]},44:{0:[0],1:[[0,7],[11,16],83,84],2:[[0,5],21,22,24,29,32,33,81,82],3:[0,1,[3,8]],4:[[0,4]],5:[0,1,[6,15],23,82,83],6:[0,1,[4,8]],7:[0,1,[3,5],81,[83,85]],8:[[0,4],11,23,25,[81,83]],9:[[0,3],23,[81,83]],12:[[0,3],[23,26],83,84],13:[[0,3],[22,24],81],14:[[0,2],[21,24],26,27,81],15:[[0,2],21,23,81],16:[[0,2],[21,25]],17:[[0,2],21,23,81],18:[[0,3],21,23,[25,27],81,82],19:[0],20:[0],51:[[0,3],21,22],52:[[0,3],21,22,24,81],53:[[0,2],[21,23],81]},45:{0:[0],1:[[0,9],[21,27]],2:[[0,5],[21,26]],3:[[0,5],11,12,[21,32]],4:[0,1,[3,6],11,[21,23],81],5:[[0,3],12,21],6:[[0,3],21,81],7:[[0,3],21,22],8:[[0,4],21,81],9:[[0,3],[21,24],81],10:[[0,2],[21,31]],11:[[0,2],[21,23]],12:[[0,2],[21,29],81],13:[[0,2],[21,24],81],14:[[0,2],[21,25],81]},46:{0:[0],1:[0,1,[5,8]],2:[0,1],3:[0,[21,23]],90:[[0,3],[5,7],[21,39]]},50:{0:[0],1:[[0,19]],2:[0,[22,38],[40,43]],3:[0,[81,84]]},51:{0:[0],1:[0,1,[4,8],[12,15],[21,24],29,31,32,[81,84]],3:[[0,4],11,21,22],4:[[0,3],11,21,22],5:[[0,4],21,22,24,25],6:[0,1,3,23,26,[81,83]],7:[0,1,3,4,[22,27],81],8:[[0,2],11,12,[21,24]],9:[[0,4],[21,23]],10:[[0,2],11,24,25,28],11:[[0,2],[11,13],23,24,26,29,32,33,81],13:[[0,4],[21,25],81],14:[[0,2],[21,25]],15:[[0,3],[21,29]],16:[[0,3],[21,23],81],17:[[0,3],[21,25],81],18:[[0,3],[21,27]],19:[[0,3],[21,23]],20:[[0,2],21,22,81],32:[0,[21,33]],33:[0,[21,38]],34:[0,1,[22,37]]},52:{0:[0],1:[[0,3],[11,15],[21,23],81],2:[0,1,3,21,22],3:[[0,3],[21,30],81,82],4:[[0,2],[21,25]],5:[[0,2],[21,27]],6:[[0,3],[21,28]],22:[0,1,[22,30]],23:[0,1,[22,28]],24:[0,1,[22,28]],26:[0,1,[22,36]],27:[[0,2],22,23,[25,32]]},53:{0:[0],1:[[0,3],[11,14],21,22,[24,29],81],3:[[0,2],[21,26],28,81],4:[[0,2],[21,28]],5:[[0,2],[21,24]],6:[[0,2],[21,30]],7:[[0,2],[21,24]],8:[[0,2],[21,29]],9:[[0,2],[21,27]],23:[0,1,[22,29],31],25:[[0,4],[22,32]],26:[0,1,[21,28]],27:[0,1,[22,30]],28:[0,1,22,23],29:[0,1,[22,32]],31:[0,2,3,[22,24]],34:[0,[21,23]],33:[0,21,[23,25]],35:[0,[21,28]]},54:{0:[0],1:[[0,2],[21,27]],21:[0,[21,29],32,33],22:[0,[21,29],[31,33]],23:[0,1,[22,38]],24:[0,[21,31]],25:[0,[21,27]],26:[0,[21,27]]},61:{0:[0],1:[[0,4],[11,16],22,[24,26]],2:[[0,4],22],3:[[0,4],[21,24],[26,31]],4:[[0,4],[22,31],81],5:[[0,2],[21,28],81,82],6:[[0,2],[21,32]],7:[[0,2],[21,30]],8:[[0,2],[21,31]],9:[[0,2],[21,29]],10:[[0,2],[21,26]]},62:{0:[0],1:[[0,5],11,[21,23]],2:[0,1],3:[[0,2],21],4:[[0,3],[21,23]],5:[[0,3],[21,25]],6:[[0,2],[21,23]],7:[[0,2],[21,25]],8:[[0,2],[21,26]],9:[[0,2],[21,24],81,82],10:[[0,2],[21,27]],11:[[0,2],[21,26]],12:[[0,2],[21,28]],24:[0,21,[24,29]],26:[0,21,[23,30]],29:[0,1,[21,27]],30:[0,1,[21,27]]},63:{0:[0],1:[[0,5],[21,23]],2:[0,2,[21,25]],21:[0,[21,23],[26,28]],22:[0,[21,24]],23:[0,[21,24]],25:[0,[21,25]],26:[0,[21,26]],27:[0,1,[21,26]],28:[[0,2],[21,23]]},64:{0:[0],1:[0,1,[4,6],21,22,81],2:[[0,3],5,[21,23]],3:[[0,3],[21,24],81],4:[[0,2],[21,25]],5:[[0,2],21,22]},65:{0:[0],1:[[0,9],21],2:[[0,5]],21:[0,1,22,23],22:[0,1,22,23],23:[[0,3],[23,25],27,28],28:[0,1,[22,29]],29:[0,1,[22,29]],30:[0,1,[22,24]],31:[0,1,[21,31]],32:[0,1,[21,27]],40:[0,2,3,[21,28]],42:[[0,2],21,[23,26]],43:[0,1,[21,26]],90:[[0,4]],27:[[0,2],22,23]},71:{0:[0]},81:{0:[0]},82:{0:[0]}},d=parseInt(b.substr(0,2),10),e=parseInt(b.substr(2,2),10),f=parseInt(b.substr(4,2),10);if(!c[d]||!c[d][e])return!1;for(var g=!1,h=c[d][e],i=0;i<h.length;i++)if(a.isArray(h[i])&&h[i][0]<=f&&f<=h[i][1]||!a.isArray(h[i])&&f===h[i]){g=!0;break}if(!g)return!1;var j;j=18===b.length?b.substr(6,8):"19"+b.substr(6,6);var k=parseInt(j.substr(0,4),10),l=parseInt(j.substr(4,2),10),m=parseInt(j.substr(6,2),10);if(!a.fn.bootstrapValidator.helpers.date(k,l,m))return!1;if(18===b.length){var n=0,o=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];for(i=0;17>i;i++)n+=parseInt(b.charAt(i),10)*o[i];n=(12-n%11)%11;var p="X"!==b.charAt(17).toUpperCase()?parseInt(b.charAt(17),10):10;return p===n}return!0
+},_cz:function(b){if(!/^\d{9,10}$/.test(b))return!1;var c=1900+parseInt(b.substr(0,2),10),d=parseInt(b.substr(2,2),10)%50%20,e=parseInt(b.substr(4,2),10);if(9===b.length){if(c>=1980&&(c-=100),c>1953)return!1}else 1954>c&&(c+=100);if(!a.fn.bootstrapValidator.helpers.date(c,d,e))return!1;if(10===b.length){var f=parseInt(b.substr(0,9),10)%11;return 1985>c&&(f%=10),f+""===b.substr(9,1)}return!0},_dk:function(b){if(!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(b))return!1;b=b.replace(/-/g,"");var c=parseInt(b.substr(0,2),10),d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10);switch(!0){case-1!=="5678".indexOf(b.charAt(6))&&e>=58:e+=1800;break;case-1!=="0123".indexOf(b.charAt(6)):case-1!=="49".indexOf(b.charAt(6))&&e>=37:e+=1900;break;default:e+=2e3}return a.fn.bootstrapValidator.helpers.date(e,d,c)},_ee:function(a){return this._lt(a)},_es:function(a){if(!/^[0-9A-Z]{8}[-]{0,1}[0-9A-Z]$/.test(a)&&!/^[XYZ][-]{0,1}[0-9]{7}[-]{0,1}[0-9A-Z]$/.test(a))return!1;a=a.replace(/-/g,"");var b="XYZ".indexOf(a.charAt(0));-1!==b&&(a=b+a.substr(1)+"");var c=parseInt(a.substr(0,8),10);return c="TRWAGMYFPDXBNJZSQVHLCKE"[c%23],c===a.substr(8,1)},_fi:function(b){if(!/^[0-9]{6}[-+A][0-9]{3}[0-9ABCDEFHJKLMNPRSTUVWXY]$/.test(b))return!1;var c=parseInt(b.substr(0,2),10),d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10),f={"+":1800,"-":1900,A:2e3};if(e=f[b.charAt(6)]+e,!a.fn.bootstrapValidator.helpers.date(e,d,c))return!1;var g=parseInt(b.substr(7,3),10);if(2>g)return!1;var h=b.substr(0,6)+b.substr(7,3)+"";return h=parseInt(h,10),"0123456789ABCDEFHJKLMNPRSTUVWXY".charAt(h%31)===b.charAt(10)},_hr:function(b){return/^[0-9]{11}$/.test(b)?a.fn.bootstrapValidator.helpers.mod11And10(b):!1},_ie:function(a){if(!/^\d{7}[A-W][AHWTX]?$/.test(a))return!1;var b=function(a){for(;a.length<7;)a="0"+a;for(var b="WABCDEFGHIJKLMNOPQRSTUV",c=0,d=0;7>d;d++)c+=parseInt(a.charAt(d),10)*(8-d);return c+=9*b.indexOf(a.substr(7)),b[c%23]};return 9!==a.length||"A"!==a.charAt(8)&&"H"!==a.charAt(8)?a.charAt(7)===b(a.substr(0,7)):a.charAt(7)===b(a.substr(0,7)+a.substr(8)+"")},_is:function(b){if(!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(b))return!1;b=b.replace(/-/g,"");var c=parseInt(b.substr(0,2),10),d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10),f=parseInt(b.charAt(9),10);if(e=9===f?1900+e:100*(20+f)+e,!a.fn.bootstrapValidator.helpers.date(e,d,c,!0))return!1;for(var g=0,h=[3,2,7,6,5,4,3,2],i=0;8>i;i++)g+=parseInt(b.charAt(i),10)*h[i];return g=11-g%11,g+""===b.charAt(8)},_lt:function(b){if(!/^[0-9]{11}$/.test(b))return!1;var c=parseInt(b.charAt(0),10),d=parseInt(b.substr(1,2),10),e=parseInt(b.substr(3,2),10),f=parseInt(b.substr(5,2),10),g=c%2===0?17+c/2:17+(c+1)/2;if(d=100*g+d,!a.fn.bootstrapValidator.helpers.date(d,e,f,!0))return!1;for(var h=0,i=[1,2,3,4,5,6,7,8,9,1],j=0;10>j;j++)h+=parseInt(b.charAt(j),10)*i[j];if(h%=11,10!==h)return h+""===b.charAt(10);for(h=0,i=[3,4,5,6,7,8,9,1,2,3],j=0;10>j;j++)h+=parseInt(b.charAt(j),10)*i[j];return h%=11,10===h&&(h=0),h+""===b.charAt(10)},_lv:function(b){if(!/^[0-9]{6}[-]{0,1}[0-9]{5}$/.test(b))return!1;b=b.replace(/\D/g,"");var c=parseInt(b.substr(0,2),10),d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10);if(e=e+1800+100*parseInt(b.charAt(6),10),!a.fn.bootstrapValidator.helpers.date(e,d,c,!0))return!1;for(var f=0,g=[10,5,8,4,2,1,6,3,7,9],h=0;10>h;h++)f+=parseInt(b.charAt(h),10)*g[h];return f=(f+1)%11%10,f+""===b.charAt(10)},_nl:function(a){for(;a.length<9;)a="0"+a;if(!/^[0-9]{4}[.]{0,1}[0-9]{2}[.]{0,1}[0-9]{3}$/.test(a))return!1;if(a=a.replace(/\./g,""),0===parseInt(a,10))return!1;for(var b=0,c=a.length,d=0;c-1>d;d++)b+=(9-d)*parseInt(a.charAt(d),10);return b%=11,10===b&&(b=0),b+""===a.charAt(c-1)},_ro:function(b){if(!/^[0-9]{13}$/.test(b))return!1;var c=parseInt(b.charAt(0),10);if(0===c||7===c||8===c)return!1;var d=parseInt(b.substr(1,2),10),e=parseInt(b.substr(3,2),10),f=parseInt(b.substr(5,2),10),g={1:1900,2:1900,3:1800,4:1800,5:2e3,6:2e3};if(f>31&&e>12)return!1;if(9!==c&&(d=g[c+""]+d,!a.fn.bootstrapValidator.helpers.date(d,e,f)))return!1;for(var h=0,i=[2,7,9,1,4,6,3,5,8,2,7,9],j=b.length,k=0;j-1>k;k++)h+=parseInt(b.charAt(k),10)*i[k];return h%=11,10===h&&(h=1),h+""===b.charAt(j-1)},_se:function(b){if(!/^[0-9]{10}$/.test(b)&&!/^[0-9]{6}[-|+][0-9]{4}$/.test(b))return!1;b=b.replace(/[^0-9]/g,"");var c=parseInt(b.substr(0,2),10)+1900,d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10);return a.fn.bootstrapValidator.helpers.date(c,d,e)?a.fn.bootstrapValidator.helpers.luhn(b):!1},_sk:function(a){return this._cz(a)},_sm:function(a){return/^\d{5}$/.test(a)},_th:function(a){if(13!==a.length)return!1;for(var b=0,c=0;12>c;c++)b+=parseInt(a.charAt(c),10)*(13-c);return(11-b%11)%10===parseInt(a.charAt(12),10)},_za:function(b){if(!/^[0-9]{10}[0|1][8|9][0-9]$/.test(b))return!1;var c=parseInt(b.substr(0,2),10),d=(new Date).getFullYear()%100,e=parseInt(b.substr(2,2),10),f=parseInt(b.substr(4,2),10);return c=c>=d?c+1900:c+2e3,a.fn.bootstrapValidator.helpers.date(c,e,f)?a.fn.bootstrapValidator.helpers.luhn(b):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.identical=a.extend(a.fn.bootstrapValidator.i18n.identical||{},{"default":"Please enter the same value"}),a.fn.bootstrapValidator.validators.identical={html5Attributes:{message:"message",field:"field"},validate:function(a,b,c){var d=b.val();if(""===d)return!0;var e=a.getFieldElements(c.field);return null===e||0===e.length?!0:d===e.val()?(a.updateStatus(c.field,a.STATUS_VALID,"identical"),!0):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.imei=a.extend(a.fn.bootstrapValidator.i18n.imei||{},{"default":"Please enter a valid IMEI number"}),a.fn.bootstrapValidator.validators.imei={validate:function(b,c){var d=c.val();if(""===d)return!0;switch(!0){case/^\d{15}$/.test(d):case/^\d{2}-\d{6}-\d{6}-\d{1}$/.test(d):case/^\d{2}\s\d{6}\s\d{6}\s\d{1}$/.test(d):return d=d.replace(/[^0-9]/g,""),a.fn.bootstrapValidator.helpers.luhn(d);case/^\d{14}$/.test(d):case/^\d{16}$/.test(d):case/^\d{2}-\d{6}-\d{6}(|-\d{2})$/.test(d):case/^\d{2}\s\d{6}\s\d{6}(|\s\d{2})$/.test(d):return!0;default:return!1}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.imo=a.extend(a.fn.bootstrapValidator.i18n.imo||{},{"default":"Please enter a valid IMO number"}),a.fn.bootstrapValidator.validators.imo={validate:function(a,b){var c=b.val();if(""===c)return!0;if(!/^IMO \d{7}$/i.test(c))return!1;for(var d=0,e=c.replace(/^.*(\d{7})$/,"$1"),f=6;f>=1;f--)d+=e.slice(6-f,-f)*(f+1);return d%10===parseInt(e.charAt(6),10)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.integer=a.extend(a.fn.bootstrapValidator.i18n.integer||{},{"default":"Please enter a valid number"}),a.fn.bootstrapValidator.validators.integer={enableByHtml5:function(a){return"number"===a.attr("type")&&(void 0===a.attr("step")||a.attr("step")%1===0)},validate:function(a,b){if(this.enableByHtml5(b)&&b.get(0).validity&&b.get(0).validity.badInput===!0)return!1;var c=b.val();return""===c?!0:/^(?:-?(?:0|[1-9][0-9]*))$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.ip=a.extend(a.fn.bootstrapValidator.i18n.ip||{},{"default":"Please enter a valid IP address",ipv4:"Please enter a valid IPv4 address",ipv6:"Please enter a valid IPv6 address"}),a.fn.bootstrapValidator.validators.ip={html5Attributes:{message:"message",ipv4:"ipv4",ipv6:"ipv6"},validate:function(b,c,d){var e=c.val();if(""===e)return!0;d=a.extend({},{ipv4:!0,ipv6:!0},d);var f,g=/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,h=/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/,i=!1;switch(!0){case d.ipv4&&!d.ipv6:i=g.test(e),f=d.message||a.fn.bootstrapValidator.i18n.ip.ipv4;break;case!d.ipv4&&d.ipv6:i=h.test(e),f=d.message||a.fn.bootstrapValidator.i18n.ip.ipv6;break;case d.ipv4&&d.ipv6:default:i=g.test(e)||h.test(e),f=d.message||a.fn.bootstrapValidator.i18n.ip["default"]}return{valid:i,message:f}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.isbn=a.extend(a.fn.bootstrapValidator.i18n.isbn||{},{"default":"Please enter a valid ISBN number"}),a.fn.bootstrapValidator.validators.isbn={validate:function(a,b){var c=b.val();if(""===c)return!0;var d;switch(!0){case/^\d{9}[\dX]$/.test(c):case 13===c.length&&/^(\d+)-(\d+)-(\d+)-([\dX])$/.test(c):case 13===c.length&&/^(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(c):d="ISBN10";break;case/^(978|979)\d{9}[\dX]$/.test(c):case 17===c.length&&/^(978|979)-(\d+)-(\d+)-(\d+)-([\dX])$/.test(c):case 17===c.length&&/^(978|979)\s(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(c):d="ISBN13";break;default:return!1}c=c.replace(/[^0-9X]/gi,"");var e,f,g=c.split(""),h=g.length,i=0;switch(d){case"ISBN10":for(i=0,e=0;h-1>e;e++)i+=parseInt(g[e],10)*(10-e);return f=11-i%11,11===f?f=0:10===f&&(f="X"),f+""===g[h-1];case"ISBN13":for(i=0,e=0;h-1>e;e++)i+=e%2===0?parseInt(g[e],10):3*parseInt(g[e],10);return f=10-i%10,10===f&&(f="0"),f+""===g[h-1];default:return!1}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.isin=a.extend(a.fn.bootstrapValidator.i18n.isin||{},{"default":"Please enter a valid ISIN number"}),a.fn.bootstrapValidator.validators.isin={COUNTRY_CODES:"AF|AX|AL|DZ|AS|AD|AO|AI|AQ|AG|AR|AM|AW|AU|AT|AZ|BS|BH|BD|BB|BY|BE|BZ|BJ|BM|BT|BO|BQ|BA|BW|BV|BR|IO|BN|BG|BF|BI|KH|CM|CA|CV|KY|CF|TD|CL|CN|CX|CC|CO|KM|CG|CD|CK|CR|CI|HR|CU|CW|CY|CZ|DK|DJ|DM|DO|EC|EG|SV|GQ|ER|EE|ET|FK|FO|FJ|FI|FR|GF|PF|TF|GA|GM|GE|DE|GH|GI|GR|GL|GD|GP|GU|GT|GG|GN|GW|GY|HT|HM|VA|HN|HK|HU|IS|IN|ID|IR|IQ|IE|IM|IL|IT|JM|JP|JE|JO|KZ|KE|KI|KP|KR|KW|KG|LA|LV|LB|LS|LR|LY|LI|LT|LU|MO|MK|MG|MW|MY|MV|ML|MT|MH|MQ|MR|MU|YT|MX|FM|MD|MC|MN|ME|MS|MA|MZ|MM|NA|NR|NP|NL|NC|NZ|NI|NE|NG|NU|NF|MP|NO|OM|PK|PW|PS|PA|PG|PY|PE|PH|PN|PL|PT|PR|QA|RE|RO|RU|RW|BL|SH|KN|LC|MF|PM|VC|WS|SM|ST|SA|SN|RS|SC|SL|SG|SX|SK|SI|SB|SO|ZA|GS|SS|ES|LK|SD|SR|SJ|SZ|SE|CH|SY|TW|TJ|TZ|TH|TL|TG|TK|TO|TT|TN|TR|TM|TC|TV|UG|UA|AE|GB|US|UM|UY|UZ|VU|VE|VN|VG|VI|WF|EH|YE|ZM|ZW",validate:function(a,b){var c=b.val();if(""===c)return!0;c=c.toUpperCase();var d=new RegExp("^("+this.COUNTRY_CODES+")[0-9A-Z]{10}$");if(!d.test(c))return!1;for(var e="",f=c.length,g=0;f-1>g;g++){var h=c.charCodeAt(g);e+=h>57?(h-55).toString():c.charAt(g)}var i="",j=e.length,k=j%2!==0?0:1;for(g=0;j>g;g++)i+=parseInt(e[g],10)*(g%2===k?2:1)+"";var l=0;for(g=0;g<i.length;g++)l+=parseInt(i.charAt(g),10);return l=(10-l%10)%10,l+""===c.charAt(f-1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.ismn=a.extend(a.fn.bootstrapValidator.i18n.ismn||{},{"default":"Please enter a valid ISMN number"}),a.fn.bootstrapValidator.validators.ismn={validate:function(a,b){var c=b.val();if(""===c)return!0;var d;switch(!0){case/^M\d{9}$/.test(c):case/^M-\d{4}-\d{4}-\d{1}$/.test(c):case/^M\s\d{4}\s\d{4}\s\d{1}$/.test(c):d="ISMN10";break;case/^9790\d{9}$/.test(c):case/^979-0-\d{4}-\d{4}-\d{1}$/.test(c):case/^979\s0\s\d{4}\s\d{4}\s\d{1}$/.test(c):d="ISMN13";break;default:return!1}"ISMN10"===d&&(c="9790"+c.substr(1)),c=c.replace(/[^0-9]/gi,"");for(var e=c.length,f=0,g=[1,3],h=0;e-1>h;h++)f+=parseInt(c.charAt(h),10)*g[h%2];return f=10-f%10,f+""===c.charAt(e-1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.issn=a.extend(a.fn.bootstrapValidator.i18n.issn||{},{"default":"Please enter a valid ISSN number"}),a.fn.bootstrapValidator.validators.issn={validate:function(a,b){var c=b.val();if(""===c)return!0;if(!/^\d{4}\-\d{3}[\dX]$/.test(c))return!1;c=c.replace(/[^0-9X]/gi,"");var d=c.split(""),e=d.length,f=0;"X"===d[7]&&(d[7]=10);for(var g=0;e>g;g++)f+=parseInt(d[g],10)*(8-g);return f%11===0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.lessThan=a.extend(a.fn.bootstrapValidator.i18n.lessThan||{},{"default":"Please enter a value less than or equal to %s",notInclusive:"Please enter a value less than %s"}),a.fn.bootstrapValidator.validators.lessThan={html5Attributes:{message:"message",value:"value",inclusive:"inclusive"},enableByHtml5:function(a){var b=a.attr("type"),c=a.attr("max");return c&&"date"!==b?{value:c}:!1},validate:function(b,c,d){var e=c.val();if(""===e)return!0;if(e=this._format(e),!a.isNumeric(e))return!1;var f=a.isNumeric(d.value)?d.value:b.getDynamicOption(c,d.value),g=this._format(f);return e=parseFloat(e),d.inclusive===!0||void 0===d.inclusive?{valid:g>=e,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.lessThan["default"],f)}:{valid:g>e,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.lessThan.notInclusive,f)}},_format:function(a){return(a+"").replace(",",".")}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.mac=a.extend(a.fn.bootstrapValidator.i18n.mac||{},{"default":"Please enter a valid MAC address"}),a.fn.bootstrapValidator.validators.mac={validate:function(a,b){var c=b.val();return""===c?!0:/^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.meid=a.extend(a.fn.bootstrapValidator.i18n.meid||{},{"default":"Please enter a valid MEID number"}),a.fn.bootstrapValidator.validators.meid={validate:function(b,c){var d=c.val();if(""===d)return!0;switch(!0){case/^[0-9A-F]{15}$/i.test(d):case/^[0-9A-F]{2}[- ][0-9A-F]{6}[- ][0-9A-F]{6}[- ][0-9A-F]$/i.test(d):case/^\d{19}$/.test(d):case/^\d{5}[- ]\d{5}[- ]\d{4}[- ]\d{4}[- ]\d$/.test(d):var e=d.charAt(d.length-1);if(d=d.replace(/[- ]/g,""),d.match(/^\d*$/i))return a.fn.bootstrapValidator.helpers.luhn(d);d=d.slice(0,-1);for(var f="",g=1;13>=g;g+=2)f+=(2*parseInt(d.charAt(g),16)).toString(16);var h=0;for(g=0;g<f.length;g++)h+=parseInt(f.charAt(g),16);return h%10===0?"0"===e:e===(2*(10*Math.floor((h+10)/10)-h)).toString(16);case/^[0-9A-F]{14}$/i.test(d):case/^[0-9A-F]{2}[- ][0-9A-F]{6}[- ][0-9A-F]{6}$/i.test(d):case/^\d{18}$/.test(d):case/^\d{5}[- ]\d{5}[- ]\d{4}[- ]\d{4}$/.test(d):return!0;default:return!1}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.notEmpty=a.extend(a.fn.bootstrapValidator.i18n.notEmpty||{},{"default":"Please enter a value"}),a.fn.bootstrapValidator.validators.notEmpty={enableByHtml5:function(a){var b=a.attr("required")+"";return"required"===b||"true"===b},validate:function(b,c){var d=c.attr("type");return"radio"===d||"checkbox"===d?b.getFieldElements(c.attr("data-bv-field")).filter(":checked").length>0:"number"===d&&c.get(0).validity&&c.get(0).validity.badInput===!0?!0:""!==a.trim(c.val())}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.numeric=a.extend(a.fn.bootstrapValidator.i18n.numeric||{},{"default":"Please enter a valid float number"}),a.fn.bootstrapValidator.validators.numeric={html5Attributes:{message:"message",separator:"separator"},enableByHtml5:function(a){return"number"===a.attr("type")&&void 0!==a.attr("step")&&a.attr("step")%1!==0},validate:function(a,b,c){if(this.enableByHtml5(b)&&b.get(0).validity&&b.get(0).validity.badInput===!0)return!1;var d=b.val();if(""===d)return!0;var e=c.separator||".";return"."!==e&&(d=d.replace(e,".")),!isNaN(parseFloat(d))&&isFinite(d)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.phone=a.extend(a.fn.bootstrapValidator.i18n.phone||{},{"default":"Please enter a valid phone number",countryNotSupported:"The country code %s is not supported",country:"Please enter a valid phone number in %s",countries:{BR:"Brazil",CN:"China",CZ:"Czech Republic",DE:"Germany",DK:"Denmark",ES:"Spain",FR:"France",GB:"United Kingdom",MA:"Morocco",PK:"Pakistan",RO:"Romania",RU:"Russia",SK:"Slovakia",TH:"Thailand",US:"USA",VE:"Venezuela"}}),a.fn.bootstrapValidator.validators.phone={html5Attributes:{message:"message",country:"country"},COUNTRY_CODES:["BR","CN","CZ","DE","DK","ES","FR","GB","MA","PK","RO","RU","SK","TH","US","VE"],validate:function(b,c,d){var e=c.val();if(""===e)return!0;var f=d.country;if(("string"!=typeof f||-1===a.inArray(f,this.COUNTRY_CODES))&&(f=b.getDynamicOption(c,f)),!f||-1===a.inArray(f.toUpperCase(),this.COUNTRY_CODES))return{valid:!1,message:a.fn.bootstrapValidator.helpers.format(a.fn.bootstrapValidator.i18n.phone.countryNotSupported,f)};var g=!0;switch(f.toUpperCase()){case"BR":e=a.trim(e),g=/^(([\d]{4}[-.\s]{1}[\d]{2,3}[-.\s]{1}[\d]{2}[-.\s]{1}[\d]{2})|([\d]{4}[-.\s]{1}[\d]{3}[-.\s]{1}[\d]{4})|((\(?\+?[0-9]{2}\)?\s?)?(\(?\d{2}\)?\s?)?\d{4,5}[-.\s]?\d{4}))$/.test(e);break;case"CN":e=a.trim(e),g=/^((00|\+)?(86(?:-| )))?((\d{11})|(\d{3}[- ]{1}\d{4}[- ]{1}\d{4})|((\d{2,4}[- ]){1}(\d{7,8}|(\d{3,4}[- ]{1}\d{4}))([- ]{1}\d{1,4})?))$/.test(e);break;case"CZ":g=/^(((00)([- ]?)|\+)(420)([- ]?))?((\d{3})([- ]?)){2}(\d{3})$/.test(e);break;case"DE":e=a.trim(e),g=/^(((((((00|\+)49[ \-/]?)|0)[1-9][0-9]{1,4})[ \-/]?)|((((00|\+)49\()|\(0)[1-9][0-9]{1,4}\)[ \-/]?))[0-9]{1,7}([ \-/]?[0-9]{1,5})?)$/.test(e);break;case"DK":e=a.trim(e),g=/^(\+45|0045|\(45\))?\s?[2-9](\s?\d){7}$/.test(e);break;case"ES":e=a.trim(e),g=/^(?:(?:(?:\+|00)34\D?))?(?:9|6)(?:\d\D?){8}$/.test(e);break;case"FR":e=a.trim(e),g=/^(?:(?:(?:\+|00)33[ ]?(?:\(0\)[ ]?)?)|0){1}[1-9]{1}([ .-]?)(?:\d{2}\1?){3}\d{2}$/.test(e);break;case"GB":e=a.trim(e),g=/^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$/.test(e);break;case"MA":e=a.trim(e),g=/^(?:(?:(?:\+|00)212[\s]?(?:[\s]?\(0\)[\s]?)?)|0){1}(?:5[\s.-]?[2-3]|6[\s.-]?[13-9]){1}[0-9]{1}(?:[\s.-]?\d{2}){3}$/.test(e);break;case"PK":e=a.trim(e),g=/^0?3[0-9]{2}[0-9]{7}$/.test(e);break;case"RO":g=/^(\+4|)?(07[0-8]{1}[0-9]{1}|02[0-9]{2}|03[0-9]{2}){1}?(\s|\.|\-)?([0-9]{3}(\s|\.|\-|)){2}$/g.test(e);break;case"RU":g=/^((8|\+7|007)[\-\.\/ ]?)?([\(\/\.]?\d{3}[\)\/\.]?[\-\.\/ ]?)?[\d\-\.\/ ]{7,10}$/g.test(e);break;case"SK":g=/^(((00)([- ]?)|\+)(420)([- ]?))?((\d{3})([- ]?)){2}(\d{3})$/.test(e);break;case"TH":g=/^0\(?([6|8-9]{2})*-([0-9]{3})*-([0-9]{4})$/.test(e);break;case"VE":e=a.trim(e),g=/^0(?:2(?:12|4[0-9]|5[1-9]|6[0-9]|7[0-8]|8[1-35-8]|9[1-5]|3[45789])|4(?:1[246]|2[46]))\d{7}$/.test(e);break;case"US":default:e=e.replace(/\D/g,""),g=/^(?:(1\-?)|(\+1 ?))?\(?(\d{3})[\)\-\.]?(\d{3})[\-\.]?(\d{4})$/.test(e)&&10===e.length}return{valid:g,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.phone.country,a.fn.bootstrapValidator.i18n.phone.countries[f])}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.regexp=a.extend(a.fn.bootstrapValidator.i18n.regexp||{},{"default":"Please enter a value matching the pattern"}),a.fn.bootstrapValidator.validators.regexp={html5Attributes:{message:"message",regexp:"regexp"},enableByHtml5:function(a){var b=a.attr("pattern");return b?{regexp:b}:!1},validate:function(a,b,c){var d=b.val();if(""===d)return!0;var e="string"==typeof c.regexp?new RegExp(c.regexp):c.regexp;return e.test(d)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.remote=a.extend(a.fn.bootstrapValidator.i18n.remote||{},{"default":"Please enter a valid value"}),a.fn.bootstrapValidator.validators.remote={html5Attributes:{message:"message",name:"name",type:"type",url:"url",data:"data",delay:"delay"},destroy:function(a,b){b.data("bv.remote.timer")&&(clearTimeout(b.data("bv.remote.timer")),b.removeData("bv.remote.timer"))},validate:function(b,c,d){function e(){var b=a.ajax({type:k,headers:l,url:j,dataType:"json",data:i});return b.then(function(a){a.valid=a.valid===!0||"true"===a.valid,g.resolve(c,"remote",a)}),g.fail(function(){b.abort()}),g}var f=c.val(),g=new a.Deferred;if(""===f)return g.resolve(c,"remote",{valid:!0}),g;var h=c.attr("data-bv-field"),i=d.data||{},j=d.url,k=d.type||"GET",l=d.headers||{};return"function"==typeof i&&(i=i.call(this,b)),"string"==typeof i&&(i=JSON.parse(i)),"function"==typeof j&&(j=j.call(this,b)),i[d.name||h]=f,d.delay?(c.data("bv.remote.timer")&&clearTimeout(c.data("bv.remote.timer")),c.data("bv.remote.timer",setTimeout(e,d.delay)),g):e()}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.rtn=a.extend(a.fn.bootstrapValidator.i18n.rtn||{},{"default":"Please enter a valid RTN number"}),a.fn.bootstrapValidator.validators.rtn={validate:function(a,b){var c=b.val();if(""===c)return!0;if(!/^\d{9}$/.test(c))return!1;for(var d=0,e=0;e<c.length;e+=3)d+=3*parseInt(c.charAt(e),10)+7*parseInt(c.charAt(e+1),10)+parseInt(c.charAt(e+2),10);return 0!==d&&d%10===0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.sedol=a.extend(a.fn.bootstrapValidator.i18n.sedol||{},{"default":"Please enter a valid SEDOL number"}),a.fn.bootstrapValidator.validators.sedol={validate:function(a,b){var c=b.val();if(""===c)return!0;if(c=c.toUpperCase(),!/^[0-9A-Z]{7}$/.test(c))return!1;for(var d=0,e=[1,3,1,7,3,9,1],f=c.length,g=0;f-1>g;g++)d+=e[g]*parseInt(c.charAt(g),36);return d=(10-d%10)%10,d+""===c.charAt(f-1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.siren=a.extend(a.fn.bootstrapValidator.i18n.siren||{},{"default":"Please enter a valid SIREN number"}),a.fn.bootstrapValidator.validators.siren={validate:function(b,c){var d=c.val();return""===d?!0:/^\d{9}$/.test(d)?a.fn.bootstrapValidator.helpers.luhn(d):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.siret=a.extend(a.fn.bootstrapValidator.i18n.siret||{},{"default":"Please enter a valid SIRET number"}),a.fn.bootstrapValidator.validators.siret={validate:function(a,b){var c=b.val();if(""===c)return!0;for(var d,e=0,f=c.length,g=0;f>g;g++)d=parseInt(c.charAt(g),10),g%2===0&&(d=2*d,d>9&&(d-=9)),e+=d;return e%10===0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.step=a.extend(a.fn.bootstrapValidator.i18n.step||{},{"default":"Please enter a valid step of %s"}),a.fn.bootstrapValidator.validators.step={html5Attributes:{message:"message",base:"baseValue",step:"step"},validate:function(b,c,d){var e=c.val();if(""===e)return!0;if(d=a.extend({},{baseValue:0,step:1},d),e=parseFloat(e),!a.isNumeric(e))return!1;var f=function(a,b){var c=Math.pow(10,b);a*=c;var d=a>0|-(0>a),e=a%1===.5*d;return e?(Math.floor(a)+(d>0))/c:Math.round(a)/c},g=function(a,b){if(0===b)return 1;var c=(a+"").split("."),d=(b+"").split("."),e=(1===c.length?0:c[1].length)+(1===d.length?0:d[1].length);return f(a-b*Math.floor(a/b),e)},h=g(e-d.baseValue,d.step);return{valid:0===h||h===d.step,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.step["default"],[d.step])}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.stringCase=a.extend(a.fn.bootstrapValidator.i18n.stringCase||{},{"default":"Please enter only lowercase characters",upper:"Please enter only uppercase characters"}),a.fn.bootstrapValidator.validators.stringCase={html5Attributes:{message:"message","case":"case"},validate:function(b,c,d){var e=c.val();if(""===e)return!0;var f=(d["case"]||"lower").toLowerCase();return{valid:"upper"===f?e===e.toUpperCase():e===e.toLowerCase(),message:d.message||("upper"===f?a.fn.bootstrapValidator.i18n.stringCase.upper:a.fn.bootstrapValidator.i18n.stringCase["default"])}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.stringLength=a.extend(a.fn.bootstrapValidator.i18n.stringLength||{},{"default":"Please enter a value with valid length",less:"Please enter less than %s characters",more:"Please enter more than %s characters",between:"Please enter value between %s and %s characters long"}),a.fn.bootstrapValidator.validators.stringLength={html5Attributes:{message:"message",min:"min",max:"max",trim:"trim",utf8bytes:"utf8Bytes"},enableByHtml5:function(b){var c={},d=b.attr("maxlength"),e=b.attr("minlength");return d&&(c.max=parseInt(d,10)),e&&(c.min=parseInt(e,10)),a.isEmptyObject(c)?!1:c},validate:function(b,c,d){var e=c.val();if((d.trim===!0||"true"===d.trim)&&(e=a.trim(e)),""===e)return!0;var f=a.isNumeric(d.min)?d.min:b.getDynamicOption(c,d.min),g=a.isNumeric(d.max)?d.max:b.getDynamicOption(c,d.max),h=function(a){for(var b=a.length,c=a.length-1;c>=0;c--){var d=a.charCodeAt(c);d>127&&2047>=d?b++:d>2047&&65535>=d&&(b+=2),d>=56320&&57343>=d&&c--}return b},i=d.utf8Bytes?h(e):e.length,j=!0,k=d.message||a.fn.bootstrapValidator.i18n.stringLength["default"];switch((f&&i<parseInt(f,10)||g&&i>parseInt(g,10))&&(j=!1),!0){case!!f&&!!g:k=a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.stringLength.between,[parseInt(f,10),parseInt(g,10)]);break;case!!f:k=a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.stringLength.more,parseInt(f,10));break;case!!g:k=a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.stringLength.less,parseInt(g,10))}return{valid:j,message:k}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.uri=a.extend(a.fn.bootstrapValidator.i18n.uri||{},{"default":"Please enter a valid URI"}),a.fn.bootstrapValidator.validators.uri={html5Attributes:{message:"message",allowlocal:"allowLocal",protocol:"protocol"},enableByHtml5:function(a){return"url"===a.attr("type")},validate:function(a,b,c){var d=b.val();if(""===d)return!0;var e=c.allowLocal===!0||"true"===c.allowLocal,f=(c.protocol||"http, https, ftp").split(",").join("|").replace(/\s/g,""),g=new RegExp("^(?:(?:"+f+")://)(?:\\S+(?::\\S*)?@)?(?:"+(e?"":"(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})")+"(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))"+(e?"?":"")+")(?::\\d{2,5})?(?:/[^\\s]*)?$","i");return g.test(d)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.uuid=a.extend(a.fn.bootstrapValidator.i18n.uuid||{},{"default":"Please enter a valid UUID number",version:"Please enter a valid UUID version %s number"}),a.fn.bootstrapValidator.validators.uuid={html5Attributes:{message:"message",version:"version"},validate:function(b,c,d){var e=c.val();if(""===e)return!0;var f={3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i},g=d.version?d.version+"":"all";return{valid:null===f[g]?!0:f[g].test(e),message:d.version?a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.uuid.version,d.version):d.message||a.fn.bootstrapValidator.i18n.uuid["default"]}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.vat=a.extend(a.fn.bootstrapValidator.i18n.vat||{},{"default":"Please enter a valid VAT number",countryNotSupported:"The country code %s is not supported",country:"Please enter a valid VAT number in %s",countries:{AT:"Austria",BE:"Belgium",BG:"Bulgaria",BR:"Brazil",CH:"Switzerland",CY:"Cyprus",CZ:"Czech Republic",DE:"Germany",DK:"Denmark",EE:"Estonia",ES:"Spain",FI:"Finland",FR:"France",GB:"United Kingdom",GR:"Greek",EL:"Greek",HU:"Hungary",HR:"Croatia",IE:"Ireland",IS:"Iceland",IT:"Italy",LT:"Lithuania",LU:"Luxembourg",LV:"Latvia",MT:"Malta",NL:"Netherlands",NO:"Norway",PL:"Poland",PT:"Portugal",RO:"Romania",RU:"Russia",RS:"Serbia",SE:"Sweden",SI:"Slovenia",SK:"Slovakia",VE:"Venezuela",ZA:"South Africa"}}),a.fn.bootstrapValidator.validators.vat={html5Attributes:{message:"message",country:"country"},COUNTRY_CODES:["AT","BE","BG","BR","CH","CY","CZ","DE","DK","EE","EL","ES","FI","FR","GB","GR","HR","HU","IE","IS","IT","LT","LU","LV","MT","NL","NO","PL","PT","RO","RU","RS","SE","SK","SI","VE","ZA"],validate:function(b,c,d){var e=c.val();if(""===e)return!0;var f=d.country;if(f?("string"!=typeof f||-1===a.inArray(f.toUpperCase(),this.COUNTRY_CODES))&&(f=b.getDynamicOption(c,f)):f=e.substr(0,2),-1===a.inArray(f,this.COUNTRY_CODES))return{valid:!1,message:a.fn.bootstrapValidator.helpers.format(a.fn.bootstrapValidator.i18n.vat.countryNotSupported,f)};var g=["_",f.toLowerCase()].join("");return this[g](e)?!0:{valid:!1,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.vat.country,a.fn.bootstrapValidator.i18n.vat.countries[f.toUpperCase()])}},_at:function(a){if(/^ATU[0-9]{8}$/.test(a)&&(a=a.substr(2)),!/^U[0-9]{8}$/.test(a))return!1;a=a.substr(1);for(var b=0,c=[1,2,1,2,1,2,1],d=0,e=0;7>e;e++)d=parseInt(a.charAt(e),10)*c[e],d>9&&(d=Math.floor(d/10)+d%10),b+=d;return b=10-(b+4)%10,10===b&&(b=0),b+""===a.substr(7,1)},_be:function(a){if(/^BE[0]{0,1}[0-9]{9}$/.test(a)&&(a=a.substr(2)),!/^[0]{0,1}[0-9]{9}$/.test(a))return!1;if(9===a.length&&(a="0"+a),"0"===a.substr(1,1))return!1;var b=parseInt(a.substr(0,8),10)+parseInt(a.substr(8,2),10);return b%97===0},_bg:function(b){if(/^BG[0-9]{9,10}$/.test(b)&&(b=b.substr(2)),!/^[0-9]{9,10}$/.test(b))return!1;var c=0,d=0;if(9===b.length){for(d=0;8>d;d++)c+=parseInt(b.charAt(d),10)*(d+1);if(c%=11,10===c)for(c=0,d=0;8>d;d++)c+=parseInt(b.charAt(d),10)*(d+3);return c%=10,c+""===b.substr(8)}if(10===b.length){var e=function(b){var c=parseInt(b.substr(0,2),10)+1900,d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10);if(d>40?(c+=100,d-=40):d>20&&(c-=100,d-=20),!a.fn.bootstrapValidator.helpers.date(c,d,e))return!1;for(var f=0,g=[2,4,8,5,10,9,7,3,6],h=0;9>h;h++)f+=parseInt(b.charAt(h),10)*g[h];return f=f%11%10,f+""===b.substr(9,1)},f=function(a){for(var b=0,c=[21,19,17,13,11,9,7,3,1],d=0;9>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b%=10,b+""===a.substr(9,1)},g=function(a){for(var b=0,c=[4,3,2,7,6,5,4,3,2],d=0;9>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b=11-b%11,10===b?!1:(11===b&&(b=0),b+""===a.substr(9,1))};return e(b)||f(b)||g(b)}return!1},_br:function(a){if(""===a)return!0;var b=a.replace(/[^\d]+/g,"");if(""===b||14!==b.length)return!1;if("00000000000000"===b||"11111111111111"===b||"22222222222222"===b||"33333333333333"===b||"44444444444444"===b||"55555555555555"===b||"66666666666666"===b||"77777777777777"===b||"88888888888888"===b||"99999999999999"===b)return!1;for(var c=b.length-2,d=b.substring(0,c),e=b.substring(c),f=0,g=c-7,h=c;h>=1;h--)f+=parseInt(d.charAt(c-h),10)*g--,2>g&&(g=9);var i=2>f%11?0:11-f%11;if(i!==parseInt(e.charAt(0),10))return!1;for(c+=1,d=b.substring(0,c),f=0,g=c-7,h=c;h>=1;h--)f+=parseInt(d.charAt(c-h),10)*g--,2>g&&(g=9);return i=2>f%11?0:11-f%11,i===parseInt(e.charAt(1),10)},_ch:function(a){if(/^CHE[0-9]{9}(MWST)?$/.test(a)&&(a=a.substr(2)),!/^E[0-9]{9}(MWST)?$/.test(a))return!1;a=a.substr(1);for(var b=0,c=[5,4,3,2,7,6,5,4],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b=11-b%11,10===b?!1:(11===b&&(b=0),b+""===a.substr(8,1))},_cy:function(a){if(/^CY[0-5|9]{1}[0-9]{7}[A-Z]{1}$/.test(a)&&(a=a.substr(2)),!/^[0-5|9]{1}[0-9]{7}[A-Z]{1}$/.test(a))return!1;if("12"===a.substr(0,2))return!1;for(var b=0,c={0:1,1:0,2:5,3:7,4:9,5:13,6:15,7:17,8:19,9:21},d=0;8>d;d++){var e=parseInt(a.charAt(d),10);d%2===0&&(e=c[e+""]),b+=e}return b="ABCDEFGHIJKLMNOPQRSTUVWXYZ"[b%26],b+""===a.substr(8,1)},_cz:function(b){if(/^CZ[0-9]{8,10}$/.test(b)&&(b=b.substr(2)),!/^[0-9]{8,10}$/.test(b))return!1;var c=0,d=0;if(8===b.length){if(b.charAt(0)+""=="9")return!1;for(c=0,d=0;7>d;d++)c+=parseInt(b.charAt(d),10)*(8-d);return c=11-c%11,10===c&&(c=0),11===c&&(c=1),c+""===b.substr(7,1)
+}if(9===b.length&&b.charAt(0)+""=="6"){for(c=0,d=0;7>d;d++)c+=parseInt(b.charAt(d+1),10)*(8-d);return c=11-c%11,10===c&&(c=0),11===c&&(c=1),c=[8,7,6,5,4,3,2,1,0,9,10][c-1],c+""===b.substr(8,1)}if(9===b.length||10===b.length){var e=1900+parseInt(b.substr(0,2),10),f=parseInt(b.substr(2,2),10)%50%20,g=parseInt(b.substr(4,2),10);if(9===b.length){if(e>=1980&&(e-=100),e>1953)return!1}else 1954>e&&(e+=100);if(!a.fn.bootstrapValidator.helpers.date(e,f,g))return!1;if(10===b.length){var h=parseInt(b.substr(0,9),10)%11;return 1985>e&&(h%=10),h+""===b.substr(9,1)}return!0}return!1},_de:function(b){return/^DE[0-9]{9}$/.test(b)&&(b=b.substr(2)),/^[0-9]{9}$/.test(b)?a.fn.bootstrapValidator.helpers.mod11And10(b):!1},_dk:function(a){if(/^DK[0-9]{8}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{8}$/.test(a))return!1;for(var b=0,c=[2,7,6,5,4,3,2,1],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b%11===0},_ee:function(a){if(/^EE[0-9]{9}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{9}$/.test(a))return!1;for(var b=0,c=[3,7,1,3,7,1,3,7,1],d=0;9>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b%10===0},_es:function(a){if(/^ES[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(a)&&(a=a.substr(2)),!/^[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(a))return!1;var b=function(a){var b=parseInt(a.substr(0,8),10);return b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b+""===a.substr(8,1)},c=function(a){var b=["XYZ".indexOf(a.charAt(0)),a.substr(1)].join("");return b=parseInt(b,10),b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b+""===a.substr(8,1)},d=function(a){var b,c=a.charAt(0);if(-1!=="KLM".indexOf(c))return b=parseInt(a.substr(1,8),10),b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b+""===a.substr(8,1);if(-1!=="ABCDEFGHJNPQRSUVW".indexOf(c)){for(var d=0,e=[2,1,2,1,2,1,2],f=0,g=0;7>g;g++)f=parseInt(a.charAt(g+1),10)*e[g],f>9&&(f=Math.floor(f/10)+f%10),d+=f;return d=10-d%10,d+""===a.substr(8,1)||"JABCDEFGHI"[d]===a.substr(8,1)}return!1},e=a.charAt(0);return/^[0-9]$/.test(e)?b(a):/^[XYZ]$/.test(e)?c(a):d(a)},_fi:function(a){if(/^FI[0-9]{8}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{8}$/.test(a))return!1;for(var b=0,c=[7,9,10,5,8,4,2,1],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b%11===0},_fr:function(b){if(/^FR[0-9A-Z]{2}[0-9]{9}$/.test(b)&&(b=b.substr(2)),!/^[0-9A-Z]{2}[0-9]{9}$/.test(b))return!1;if(!a.fn.bootstrapValidator.helpers.luhn(b.substr(2)))return!1;if(/^[0-9]{2}$/.test(b.substr(0,2)))return b.substr(0,2)===parseInt(b.substr(2)+"12",10)%97+"";var c,d="0123456789ABCDEFGHJKLMNPQRSTUVWXYZ";return c=/^[0-9]{1}$/.test(b.charAt(0))?24*d.indexOf(b.charAt(0))+d.indexOf(b.charAt(1))-10:34*d.indexOf(b.charAt(0))+d.indexOf(b.charAt(1))-100,(parseInt(b.substr(2),10)+1+Math.floor(c/11))%11===c%11},_gb:function(a){if((/^GB[0-9]{9}$/.test(a)||/^GB[0-9]{12}$/.test(a)||/^GBGD[0-9]{3}$/.test(a)||/^GBHA[0-9]{3}$/.test(a)||/^GB(GD|HA)8888[0-9]{5}$/.test(a))&&(a=a.substr(2)),!(/^[0-9]{9}$/.test(a)||/^[0-9]{12}$/.test(a)||/^GD[0-9]{3}$/.test(a)||/^HA[0-9]{3}$/.test(a)||/^(GD|HA)8888[0-9]{5}$/.test(a)))return!1;var b=a.length;if(5===b){var c=a.substr(0,2),d=parseInt(a.substr(2),10);return"GD"===c&&500>d||"HA"===c&&d>=500}if(11===b&&("GD8888"===a.substr(0,6)||"HA8888"===a.substr(0,6)))return"GD"===a.substr(0,2)&&parseInt(a.substr(6,3),10)>=500||"HA"===a.substr(0,2)&&parseInt(a.substr(6,3),10)<500?!1:parseInt(a.substr(6,3),10)%97===parseInt(a.substr(9,2),10);if(9===b||12===b){for(var e=0,f=[8,7,6,5,4,3,2,10,1],g=0;9>g;g++)e+=parseInt(a.charAt(g),10)*f[g];return e%=97,parseInt(a.substr(0,3),10)>=100?0===e||42===e||55===e:0===e}return!0},_gr:function(a){if(/^(GR|EL)[0-9]{9}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{9}$/.test(a))return!1;8===a.length&&(a="0"+a);for(var b=0,c=[256,128,64,32,16,8,4,2],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b=b%11%10,b+""===a.substr(8,1)},_el:function(a){return this._gr(a)},_hu:function(a){if(/^HU[0-9]{8}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{8}$/.test(a))return!1;for(var b=0,c=[9,7,3,1,9,7,3,1],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b%10===0},_hr:function(b){return/^HR[0-9]{11}$/.test(b)&&(b=b.substr(2)),/^[0-9]{11}$/.test(b)?a.fn.bootstrapValidator.helpers.mod11And10(b):!1},_ie:function(a){if(/^IE[0-9]{1}[0-9A-Z\*\+]{1}[0-9]{5}[A-Z]{1,2}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{1}[0-9A-Z\*\+]{1}[0-9]{5}[A-Z]{1,2}$/.test(a))return!1;var b=function(a){for(;a.length<7;)a="0"+a;for(var b="WABCDEFGHIJKLMNOPQRSTUV",c=0,d=0;7>d;d++)c+=parseInt(a.charAt(d),10)*(8-d);return c+=9*b.indexOf(a.substr(7)),b[c%23]};return/^[0-9]+$/.test(a.substr(0,7))?a.charAt(7)===b(a.substr(0,7)+a.substr(8)+""):-1!=="ABCDEFGHIJKLMNOPQRSTUVWXYZ+*".indexOf(a.charAt(1))?a.charAt(7)===b(a.substr(2,5)+a.substr(0,1)+""):!0},_is:function(a){return/^IS[0-9]{5,6}$/.test(a)&&(a=a.substr(2)),/^[0-9]{5,6}$/.test(a)},_it:function(b){if(/^IT[0-9]{11}$/.test(b)&&(b=b.substr(2)),!/^[0-9]{11}$/.test(b))return!1;if(0===parseInt(b.substr(0,7),10))return!1;var c=parseInt(b.substr(7,3),10);return 1>c||c>201&&999!==c&&888!==c?!1:a.fn.bootstrapValidator.helpers.luhn(b)},_lt:function(a){if(/^LT([0-9]{7}1[0-9]{1}|[0-9]{10}1[0-9]{1})$/.test(a)&&(a=a.substr(2)),!/^([0-9]{7}1[0-9]{1}|[0-9]{10}1[0-9]{1})$/.test(a))return!1;var b,c=a.length,d=0;for(b=0;c-1>b;b++)d+=parseInt(a.charAt(b),10)*(1+b%9);var e=d%11;if(10===e)for(d=0,b=0;c-1>b;b++)d+=parseInt(a.charAt(b),10)*(1+(b+2)%9);return e=e%11%10,e+""===a.charAt(c-1)},_lu:function(a){return/^LU[0-9]{8}$/.test(a)&&(a=a.substr(2)),/^[0-9]{8}$/.test(a)?parseInt(a.substr(0,6),10)%89+""===a.substr(6,2):!1},_lv:function(b){if(/^LV[0-9]{11}$/.test(b)&&(b=b.substr(2)),!/^[0-9]{11}$/.test(b))return!1;var c,d=parseInt(b.charAt(0),10),e=0,f=[],g=b.length;if(d>3){for(e=0,f=[9,1,4,8,3,10,2,5,7,6,1],c=0;g>c;c++)e+=parseInt(b.charAt(c),10)*f[c];return e%=11,3===e}var h=parseInt(b.substr(0,2),10),i=parseInt(b.substr(2,2),10),j=parseInt(b.substr(4,2),10);if(j=j+1800+100*parseInt(b.charAt(6),10),!a.fn.bootstrapValidator.helpers.date(j,i,h))return!1;for(e=0,f=[10,5,8,4,2,1,6,3,7,9],c=0;g-1>c;c++)e+=parseInt(b.charAt(c),10)*f[c];return e=(e+1)%11%10,e+""===b.charAt(g-1)},_mt:function(a){if(/^MT[0-9]{8}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{8}$/.test(a))return!1;for(var b=0,c=[3,4,6,7,8,9,10,1],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b%37===0},_nl:function(a){if(/^NL[0-9]{9}B[0-9]{2}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{9}B[0-9]{2}$/.test(a))return!1;for(var b=0,c=[9,8,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b%=11,b>9&&(b=0),b+""===a.substr(8,1)},_no:function(a){if(/^NO[0-9]{9}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{9}$/.test(a))return!1;for(var b=0,c=[3,2,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b=11-b%11,11===b&&(b=0),b+""===a.substr(8,1)},_pl:function(a){if(/^PL[0-9]{10}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{10}$/.test(a))return!1;for(var b=0,c=[6,5,7,2,3,4,5,6,7,-1],d=0;10>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b%11===0},_pt:function(a){if(/^PT[0-9]{9}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{9}$/.test(a))return!1;for(var b=0,c=[9,8,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b=11-b%11,b>9&&(b=0),b+""===a.substr(8,1)},_ro:function(a){if(/^RO[1-9][0-9]{1,9}$/.test(a)&&(a=a.substr(2)),!/^[1-9][0-9]{1,9}$/.test(a))return!1;for(var b=a.length,c=[7,5,3,2,1,7,5,3,2].slice(10-b),d=0,e=0;b-1>e;e++)d+=parseInt(a.charAt(e),10)*c[e];return d=10*d%11%10,d+""===a.substr(b-1,1)},_ru:function(a){if(/^RU([0-9]{10}|[0-9]{12})$/.test(a)&&(a=a.substr(2)),!/^([0-9]{10}|[0-9]{12})$/.test(a))return!1;var b=0;if(10===a.length){var c=0,d=[2,4,10,3,5,9,4,6,8,0];for(b=0;10>b;b++)c+=parseInt(a.charAt(b),10)*d[b];return c%=11,c>9&&(c%=10),c+""===a.substr(9,1)}if(12===a.length){var e=0,f=[7,2,4,10,3,5,9,4,6,8,0],g=0,h=[3,7,2,4,10,3,5,9,4,6,8,0];for(b=0;11>b;b++)e+=parseInt(a.charAt(b),10)*f[b],g+=parseInt(a.charAt(b),10)*h[b];return e%=11,e>9&&(e%=10),g%=11,g>9&&(g%=10),e+""===a.substr(10,1)&&g+""===a.substr(11,1)}return!1},_rs:function(a){if(/^RS[0-9]{9}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{9}$/.test(a))return!1;for(var b=10,c=0,d=0;8>d;d++)c=(parseInt(a.charAt(d),10)+b)%10,0===c&&(c=10),b=2*c%11;return(b+parseInt(a.substr(8,1),10))%10===1},_se:function(b){return/^SE[0-9]{10}01$/.test(b)&&(b=b.substr(2)),/^[0-9]{10}01$/.test(b)?(b=b.substr(0,10),a.fn.bootstrapValidator.helpers.luhn(b)):!1},_si:function(a){if(/^SI[0-9]{8}$/.test(a)&&(a=a.substr(2)),!/^[0-9]{8}$/.test(a))return!1;for(var b=0,c=[8,7,6,5,4,3,2],d=0;7>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b=11-b%11,10===b&&(b=0),b+""===a.substr(7,1)},_sk:function(a){return/^SK[1-9][0-9][(2-4)|(6-9)][0-9]{7}$/.test(a)&&(a=a.substr(2)),/^[1-9][0-9][(2-4)|(6-9)][0-9]{7}$/.test(a)?parseInt(a,10)%11===0:!1},_ve:function(a){if(/^VE[VEJPG][0-9]{9}$/.test(a)&&(a=a.substr(2)),!/^[VEJPG][0-9]{9}$/.test(a))return!1;for(var b={V:4,E:8,J:12,P:16,G:20},c=b[a.charAt(0)],d=[3,2,7,6,5,4,3,2],e=0;8>e;e++)c+=parseInt(a.charAt(e+1),10)*d[e];return c=11-c%11,(11===c||10===c)&&(c=0),c+""===a.substr(9,1)},_za:function(a){return/^ZA4[0-9]{9}$/.test(a)&&(a=a.substr(2)),/^4[0-9]{9}$/.test(a)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.vin=a.extend(a.fn.bootstrapValidator.i18n.vin||{},{"default":"Please enter a valid VIN number"}),a.fn.bootstrapValidator.validators.vin={validate:function(a,b){var c=b.val();if(""===c)return!0;if(!/^[a-hj-npr-z0-9]{8}[0-9xX][a-hj-npr-z0-9]{8}$/i.test(c))return!1;c=c.toUpperCase();for(var d={A:1,B:2,C:3,D:4,E:5,F:6,G:7,H:8,J:1,K:2,L:3,M:4,N:5,P:7,R:9,S:2,T:3,U:4,V:5,W:6,X:7,Y:8,Z:9,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,0:0},e=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],f=0,g=c.length,h=0;g>h;h++)f+=d[c.charAt(h)+""]*e[h];var i=f%11;return 10===i&&(i="X"),i+""===c.charAt(8)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.i18n.zipCode=a.extend(a.fn.bootstrapValidator.i18n.zipCode||{},{"default":"Please enter a valid postal code",countryNotSupported:"The country code %s is not supported",country:"Please enter a valid postal code in %s",countries:{AT:"Austria",BR:"Brazil",CA:"Canada",CH:"Switzerland",CZ:"Czech Republic",DE:"Germany",DK:"Denmark",FR:"France",GB:"United Kingdom",IE:"Ireland",IT:"Italy",MA:"Morocco",NL:"Netherlands",PT:"Portugal",RO:"Romania",RU:"Russia",SE:"Sweden",SG:"Singapore",SK:"Slovakia",US:"USA"}}),a.fn.bootstrapValidator.validators.zipCode={html5Attributes:{message:"message",country:"country"},COUNTRY_CODES:["AT","BR","CA","CH","CZ","DE","DK","FR","GB","IE","IT","MA","NL","PT","RO","RU","SE","SG","SK","US"],validate:function(b,c,d){var e=c.val();if(""===e||!d.country)return!0;var f=d.country;if(("string"!=typeof f||-1===a.inArray(f,this.COUNTRY_CODES))&&(f=b.getDynamicOption(c,f)),!f||-1===a.inArray(f.toUpperCase(),this.COUNTRY_CODES))return{valid:!1,message:a.fn.bootstrapValidator.helpers.format(a.fn.bootstrapValidator.i18n.zipCode.countryNotSupported,f)};var g=!1;switch(f=f.toUpperCase()){case"AT":g=/^([1-9]{1})(\d{3})$/.test(e);break;case"BR":g=/^(\d{2})([\.]?)(\d{3})([\-]?)(\d{3})$/.test(e);break;case"CA":g=/^(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|X|Y){1}[0-9]{1}(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z){1}\s?[0-9]{1}(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z){1}[0-9]{1}$/i.test(e);break;case"CH":g=/^([1-9]{1})(\d{3})$/.test(e);break;case"CZ":g=/^(\d{3})([ ]?)(\d{2})$/.test(e);break;case"DE":g=/^(?!01000|99999)(0[1-9]\d{3}|[1-9]\d{4})$/.test(e);break;case"DK":g=/^(DK(-|\s)?)?\d{4}$/i.test(e);break;case"FR":g=/^[0-9]{5}$/i.test(e);break;case"GB":g=this._gb(e);break;case"IE":g=/^(D6W|[ACDEFHKNPRTVWXY]\d{2})\s[0-9ACDEFHKNPRTVWXY]{4}$/.test(e);break;case"IT":g=/^(I-|IT-)?\d{5}$/i.test(e);break;case"MA":g=/^[1-9][0-9]{4}$/i.test(e);break;case"NL":g=/^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$/i.test(e);break;case"PT":g=/^[1-9]\d{3}-\d{3}$/.test(e);break;case"RO":g=/^(0[1-8]{1}|[1-9]{1}[0-5]{1})?[0-9]{4}$/i.test(e);break;case"RU":g=/^[0-9]{6}$/i.test(e);break;case"SE":g=/^(S-)?\d{3}\s?\d{2}$/i.test(e);break;case"SG":g=/^([0][1-9]|[1-6][0-9]|[7]([0-3]|[5-9])|[8][0-2])(\d{4})$/i.test(e);break;case"SK":g=/^(\d{3})([ ]?)(\d{2})$/.test(e);break;case"US":default:g=/^\d{4,5}([\-]?\d{4})?$/.test(e)}return{valid:g,message:a.fn.bootstrapValidator.helpers.format(d.message||a.fn.bootstrapValidator.i18n.zipCode.country,a.fn.bootstrapValidator.i18n.zipCode.countries[f])}},_gb:function(a){for(var b="[ABCDEFGHIJKLMNOPRSTUWYZ]",c="[ABCDEFGHKLMNOPQRSTUVWXY]",d="[ABCDEFGHJKPMNRSTUVWXY]",e="[ABEHMNPRVWXY]",f="[ABDEFGHJLNPQRSTUWXYZ]",g=[new RegExp("^("+b+"{1}"+c+"?[0-9]{1,2})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^("+b+"{1}[0-9]{1}"+d+"{1})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^("+b+"{1}"+c+"{1}?[0-9]{1}"+e+"{1})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^(BF1)(\\s*)([0-6]{1}[ABDEFGHJLNPQRST]{1}[ABDEFGHJLNPQRSTUWZYZ]{1})$","i"),/^(GIR)(\s*)(0AA)$/i,/^(BFPO)(\s*)([0-9]{1,4})$/i,/^(BFPO)(\s*)(c\/o\s*[0-9]{1,3})$/i,/^([A-Z]{4})(\s*)(1ZZ)$/i,/^(AI-2640)$/i],h=0;h<g.length;h++)if(g[h].test(a))return!0;return!1}}}(window.jQuery);
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/validate/zh_CN.js b/management/guns-admin/src/main/webapp/static/js/plugins/validate/zh_CN.js
new file mode 100644
index 0000000..0c1ed5d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/validate/zh_CN.js
@@ -0,0 +1,370 @@
+(function ($) {
+    /**
+     * Simplified Chinese language package
+     * Translated by @shamiao
+     */
+    $.fn.bootstrapValidator.i18n = $.extend(true, $.fn.bootstrapValidator.i18n, {
+        base64: {
+            'default': '请输入有效的Base64编码'
+        },
+        between: {
+            'default': '请输入在 %s 和 %s 之间的数值',
+            notInclusive: '请输入在 %s 和 %s 之间(不含两端)的数值'
+        },
+        callback: {
+            'default': '请输入有效的值'
+        },
+        choice: {
+            'default': '请输入有效的值',
+            less: '请至少选中 %s 个选项',
+            more: '最多只能选中 %s 个选项',
+            between: '请选择 %s 至 %s 个选项'
+        },
+        color: {
+            'default': '请输入有效的颜色值'
+        },
+        creditCard: {
+            'default': '请输入有效的信用卡号码'
+        },
+        cusip: {
+            'default': '请输入有效的美国CUSIP代码'
+        },
+        cvv: {
+            'default': '请输入有效的CVV代码'
+        },
+        date: {
+            'default': '请输入有效的日期', 
+            min: '请输入 %s 或之后的日期',
+            max: '请输入 %s 或以前的日期',
+            range: '请输入 %s 和 %s 之间的日期'
+        },
+        different: {
+            'default': '请输入不同的值'
+        },
+        digits: {
+            'default': '请输入有效的数字'
+        },
+        ean: {
+            'default': '请输入有效的EAN商品编码'
+        },
+        emailAddress: {
+            'default': '请输入有效的邮件地址'
+        },
+        file: {
+            'default': '请选择有效的文件'
+        },
+        greaterThan: {
+            'default': '请输入大于等于 %s 的数值',
+            notInclusive: '请输入大于 %s 的数值'
+        },
+        grid: {
+            'default': '请输入有效的GRId编码'
+        },
+        hex: {
+            'default': '请输入有效的16进制数'
+        },
+        hexColor: {
+            'default': '请输入有效的16进制颜色值'
+        },
+        iban: {
+            'default': '请输入有效的IBAN(国际银行账户)号码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的IBAN(国际银行账户)号码',
+            countries: {
+                AD: '安道​​尔',
+                AE: '阿联酋',
+                AL: '阿尔巴尼亚',
+                AO: '安哥拉',
+                AT: '奥地利',
+                AZ: '阿塞拜疆',
+                BA: '波斯尼亚和黑塞哥维那',
+                BE: '比利时',
+                BF: '布基纳法索',
+                BG: '保加利亚',
+                BH: '巴林',
+                BI: '布隆迪',
+                BJ: '贝宁',
+                BR: '巴西',
+                CH: '瑞士',
+                CI: '科特迪瓦',
+                CM: '喀麦隆',
+                CR: '哥斯达黎加',
+                CV: '佛得角',
+                CY: '塞浦路斯',
+                CZ: '捷克共和国',
+                DE: '德国',
+                DK: '丹麦',
+                DO: '多米尼加共和国',
+                DZ: '阿尔及利亚',
+                EE: '爱沙尼亚',
+                ES: '西班牙',
+                FI: '芬兰',
+                FO: '法罗群岛',
+                FR: '法国',
+                GB: '英国',
+                GE: '格鲁吉亚',
+                GI: '直布罗陀',
+                GL: '格陵兰岛',
+                GR: '希腊',
+                GT: '危地马拉',
+                HR: '克罗地亚',
+                HU: '匈牙利',
+                IE: '爱尔兰',
+                IL: '以色列',
+                IR: '伊朗',
+                IS: '冰岛',
+                IT: '意大利',
+                JO: '约旦',
+                KW: '科威特',
+                KZ: '哈萨克斯坦',
+                LB: '黎巴嫩',
+                LI: '列支敦士登',
+                LT: '立陶宛',
+                LU: '卢森堡',
+                LV: '拉脱维亚',
+                MC: '摩纳哥',
+                MD: '摩尔多瓦',
+                ME: '黑山',
+                MG: '马达加斯加',
+                MK: '马其顿',
+                ML: '马里',
+                MR: '毛里塔尼亚',
+                MT: '马耳他',
+                MU: '毛里求斯',
+                MZ: '莫桑比克',
+                NL: '荷兰',
+                NO: '挪威',
+                PK: '巴基斯坦',
+                PL: '波兰',
+                PS: '巴勒斯坦',
+                PT: '葡萄牙',
+                QA: '卡塔尔',
+                RO: '罗马尼亚',
+                RS: '塞尔维亚',
+                SA: '沙特阿拉伯',
+                SE: '瑞典',
+                SI: '斯洛文尼亚',
+                SK: '斯洛伐克',
+                SM: '圣马力诺',
+                SN: '塞内加尔',
+                TN: '突尼斯',
+                TR: '土耳其',
+                VG: '英属维尔京群岛'
+            }
+        },
+        id: {
+            'default': '请输入有效的身份证件号码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的身份证件号码',
+            countries: {
+                BA: '波黑',
+                BG: '保加利亚',
+                BR: '巴西',
+                CH: '瑞士',
+                CL: '智利',
+                CN: '中国',
+                CZ: '捷克共和国',
+                DK: '丹麦',
+                EE: '爱沙尼亚',
+                ES: '西班牙',
+                FI: '芬兰',
+                HR: '克罗地亚',
+                IE: '爱尔兰',
+                IS: '冰岛',
+                LT: '立陶宛',
+                LV: '拉脱维亚',
+                ME: '黑山',
+                MK: '马其顿',
+                NL: '荷兰',
+                RO: '罗马尼亚',
+                RS: '塞尔维亚',
+                SE: '瑞典',
+                SI: '斯洛文尼亚',
+                SK: '斯洛伐克',
+                SM: '圣马力诺',
+                TH: '泰国',
+                ZA: '南非'
+            }
+        },
+        identical: {
+            'default': '请输入相同的值'
+        },
+        imei: {
+            'default': '请输入有效的IMEI(手机串号)'
+        },
+        imo: {
+            'default': '请输入有效的国际海事组织(IMO)号码'
+        },
+        integer: {
+            'default': '请输入有效的整数值'
+        },
+        ip: {
+            'default': '请输入有效的IP地址',
+            ipv4: '请输入有效的IPv4地址',
+            ipv6: '请输入有效的IPv6地址'
+        },
+        isbn: {
+            'default': '请输入有效的ISBN(国际标准书号)'
+        },
+        isin: {
+            'default': '请输入有效的ISIN(国际证券编码)'
+        },
+        ismn: {
+            'default': '请输入有效的ISMN(印刷音乐作品编码)'
+        },
+        issn: {
+            'default': '请输入有效的ISSN(国际标准杂志书号)'
+        },
+        lessThan: {
+            'default': '请输入小于等于 %s 的数值',
+            notInclusive: '请输入小于 %s 的数值'
+        },
+        mac: {
+            'default': '请输入有效的MAC物理地址'
+        },
+        meid: {
+            'default': '请输入有效的MEID(移动设备识别码)'
+        },
+        notEmpty: {
+            'default': '请填写必填项目'
+        },
+        numeric: {
+            'default': '请输入有效的数值,允许小数'
+        },
+        phone: {
+            'default': '请输入有效的电话号码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的电话号码',
+            countries: {
+                BR: '巴西',
+                CN: '中国',
+                CZ: '捷克共和国',
+                DE: '德国',
+                DK: '丹麦',
+                ES: '西班牙',
+                FR: '法国',
+                GB: '英国',
+                MA: '摩洛哥',
+                PK: '巴基斯坦',
+                RO: '罗马尼亚',
+                RU: '俄罗斯',
+                SK: '斯洛伐克',
+                TH: '泰国',
+                US: '美国',
+                VE: '委内瑞拉'
+            }
+        },
+        regexp: {
+            'default': '请输入符合正则表达式限制的值'
+        },
+        remote: {
+            'default': '请输入有效的值'
+        },
+        rtn: {
+            'default': '请输入有效的RTN号码'
+        },
+        sedol: {
+            'default': '请输入有效的SEDOL代码'
+        },
+        siren: {
+            'default': '请输入有效的SIREN号码'
+        },
+        siret: {
+            'default': '请输入有效的SIRET号码'
+        },
+        step: {
+            'default': '请输入在基础值上,增加 %s 的整数倍的数值'
+        },
+        stringCase: {
+            'default': '只能输入小写字母',
+            upper: '只能输入大写字母'
+        },
+        stringLength: {
+            'default': '请输入符合长度限制的值',
+            less: '最多只能输入 %s 个字符',
+            more: '需要输入至少 %s 个字符',
+            between: '请输入 %s 至 %s 个字符'
+        },
+        uri: {
+            'default': '请输入一个有效的URL地址'
+        },
+        uuid: {
+            'default': '请输入有效的UUID',
+            version: '请输入版本 %s 的UUID'
+        },
+        vat: {
+            'default': '请输入有效的VAT(税号)',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的VAT(税号)',
+            countries: {
+                AT: '奥地利',
+                BE: '比利时',
+                BG: '保加利亚',
+                BR: '巴西',
+                CH: '瑞士',
+                CY: '塞浦路斯',
+                CZ: '捷克共和国',
+                DE: '德国',
+                DK: '丹麦',
+                EE: '爱沙尼亚',
+                ES: '西班牙',
+                FI: '芬兰',
+                FR: '法语',
+                GB: '英国',
+                GR: '希腊',
+                EL: '希腊',
+                HU: '匈牙利',
+                HR: '克罗地亚',
+                IE: '爱尔兰',
+                IS: '冰岛',
+                IT: '意大利',
+                LT: '立陶宛',
+                LU: '卢森堡',
+                LV: '拉脱维亚',
+                MT: '马耳他',
+                NL: '荷兰',
+                NO: '挪威',
+                PL: '波兰',
+                PT: '葡萄牙',
+                RO: '罗马尼亚',
+                RU: '俄罗斯',
+                RS: '塞尔维亚',
+                SE: '瑞典',
+                SI: '斯洛文尼亚',
+                SK: '斯洛伐克',
+                VE: '委内瑞拉',
+                ZA: '南非'
+            }
+        },
+        vin: {
+            'default': '请输入有效的VIN(美国车辆识别号码)'
+        },
+        zipCode: {
+            'default': '请输入有效的邮政编码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的邮政编码',
+            countries: {
+                AT: '奥地利',
+                BR: '巴西',
+                CA: '加拿大',
+                CH: '瑞士',
+                CZ: '捷克共和国',
+                DE: '德国',
+                DK: '丹麦',
+                FR: '法国',
+                GB: '英国',
+                IE: '爱尔兰',
+                IT: '意大利',
+                MA: '摩洛哥',
+                NL: '荷兰',
+                PT: '葡萄牙',
+                RO: '罗马尼亚',
+                RU: '俄罗斯',
+                SE: '瑞典',
+                SG: '新加坡',
+                SK: '斯洛伐克',
+                US: '美国'
+            }
+        }
+    });
+}(window.jQuery));
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/wangEditor/wangEditor.js b/management/guns-admin/src/main/webapp/static/js/plugins/wangEditor/wangEditor.js
new file mode 100644
index 0000000..e9c8afa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/wangEditor/wangEditor.js
@@ -0,0 +1,3967 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+        typeof define === 'function' && define.amd ? define(factory) :
+            (global.wangEditor = factory());
+}(this, (function () { 'use strict';
+
+    /*
+     poly-fill
+     */
+
+    var polyfill = function () {
+
+        // Object.assign
+        if (typeof Object.assign != 'function') {
+            Object.assign = function (target, varArgs) {
+                // .length of function is 2
+                if (target == null) {
+                    // TypeError if undefined or null
+                    throw new TypeError('Cannot convert undefined or null to object');
+                }
+
+                var to = Object(target);
+
+                for (var index = 1; index < arguments.length; index++) {
+                    var nextSource = arguments[index];
+
+                    if (nextSource != null) {
+                        // Skip over if undefined or null
+                        for (var nextKey in nextSource) {
+                            // Avoid bugs when hasOwnProperty is shadowed
+                            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
+                                to[nextKey] = nextSource[nextKey];
+                            }
+                        }
+                    }
+                }
+                return to;
+            };
+        }
+
+        // IE 中兼容 Element.prototype.matches
+        if (!Element.prototype.matches) {
+            Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {
+                    var matches = (this.document || this.ownerDocument).querySelectorAll(s),
+                        i = matches.length;
+                    while (--i >= 0 && matches.item(i) !== this) {}
+                    return i > -1;
+                };
+        }
+    };
+
+    /*
+     DOM 操作 API
+     */
+
+// 根据 html 代码片段创建 dom 对象
+    function createElemByHTML(html) {
+        var div = void 0;
+        div = document.createElement('div');
+        div.innerHTML = html;
+        return div.children;
+    }
+
+// 是否是 DOM List
+    function isDOMList(selector) {
+        if (!selector) {
+            return false;
+        }
+        if (selector instanceof HTMLCollection || selector instanceof NodeList) {
+            return true;
+        }
+        return false;
+    }
+
+// 封装 document.querySelectorAll
+    function querySelectorAll(selector) {
+        var result = document.querySelectorAll(selector);
+        if (isDOMList(result)) {
+            return result;
+        } else {
+            return [result];
+        }
+    }
+
+// 创建构造函数
+    function DomElement(selector) {
+        if (!selector) {
+            return;
+        }
+
+        // selector 本来就是 DomElement 对象,直接返回
+        if (selector instanceof DomElement) {
+            return selector;
+        }
+
+        this.selector = selector;
+
+        // 根据 selector 得出的结果(如 DOM,DOM List)
+        var selectorResult = [];
+        if (selector.nodeType === 1) {
+            // 单个 DOM 节点
+            selectorResult = [selector];
+        } else if (isDOMList(selector)) {
+            // DOM List
+            selectorResult = selector;
+        } else if (typeof selector === 'string') {
+            // 字符串
+            selector = selector.replace('/\n/mg', '').trim();
+            if (selector.indexOf('<') === 0) {
+                // 如 <div>
+                selectorResult = createElemByHTML(selector);
+            } else {
+                // 如 #id .class
+                selectorResult = querySelectorAll(selector);
+            }
+        }
+
+        var length = selectorResult.length;
+        if (!length) {
+            // 空数组
+            return this;
+        }
+
+        // 加入 DOM 节点
+        var i = void 0;
+        for (i = 0; i < length; i++) {
+            this[i] = selectorResult[i];
+        }
+        this.length = length;
+    }
+
+// 修改原型
+    DomElement.prototype = {
+        constructor: DomElement,
+
+        // 类数组,forEach
+        forEach: function forEach(fn) {
+            var i = void 0;
+            for (i = 0; i < this.length; i++) {
+                var elem = this[i];
+                var result = fn.call(elem, elem, i);
+                if (result === false) {
+                    break;
+                }
+            }
+            return this;
+        },
+
+        // 获取第几个元素
+        get: function get(index) {
+            var length = this.length;
+            if (index >= length) {
+                index = index % length;
+            }
+            return $(this[index]);
+        },
+
+        // 第一个
+        first: function first() {
+            return this.get(0);
+        },
+
+        // 最后一个
+        last: function last() {
+            var length = this.length;
+            return this.get(length - 1);
+        },
+
+        // 绑定事件
+        on: function on(type, selector, fn) {
+            // selector 不为空,证明绑定事件要加代理
+            if (!fn) {
+                fn = selector;
+                selector = null;
+            }
+
+            // type 是否有多个
+            var types = [];
+            types = type.split(/\s+/);
+
+            return this.forEach(function (elem) {
+                types.forEach(function (type) {
+                    if (!type) {
+                        return;
+                    }
+
+                    if (!selector) {
+                        // 无代理
+                        elem.addEventListener(type, fn, false);
+                        return;
+                    }
+
+                    // 有代理
+                    elem.addEventListener(type, function (e) {
+                        var target = e.target;
+                        if (target.matches(selector)) {
+                            fn.call(target, e);
+                        }
+                    }, false);
+                });
+            });
+        },
+
+        // 取消事件绑定
+        off: function off(type, fn) {
+            return this.forEach(function (elem) {
+                elem.removeEventListener(type, fn, false);
+            });
+        },
+
+        // 获取/设置 属性
+        attr: function attr(key, val) {
+            if (val == null) {
+                // 获取值
+                return this[0].getAttribute(key);
+            } else {
+                // 设置值
+                return this.forEach(function (elem) {
+                    elem.setAttribute(key, val);
+                });
+            }
+        },
+
+        // 添加 class
+        addClass: function addClass(className) {
+            if (!className) {
+                return this;
+            }
+            return this.forEach(function (elem) {
+                var arr = void 0;
+                if (elem.className) {
+                    // 解析当前 className 转换为数组
+                    arr = elem.className.split(/\s/);
+                    arr = arr.filter(function (item) {
+                        return !!item.trim();
+                    });
+                    // 添加 class
+                    if (arr.indexOf(className) < 0) {
+                        arr.push(className);
+                    }
+                    // 修改 elem.class
+                    elem.className = arr.join(' ');
+                } else {
+                    elem.className = className;
+                }
+            });
+        },
+
+        // 删除 class
+        removeClass: function removeClass(className) {
+            if (!className) {
+                return this;
+            }
+            return this.forEach(function (elem) {
+                var arr = void 0;
+                if (elem.className) {
+                    // 解析当前 className 转换为数组
+                    arr = elem.className.split(/\s/);
+                    arr = arr.filter(function (item) {
+                        item = item.trim();
+                        // 删除 class
+                        if (!item || item === className) {
+                            return false;
+                        }
+                        return true;
+                    });
+                    // 修改 elem.class
+                    elem.className = arr.join(' ');
+                }
+            });
+        },
+
+        // 修改 css
+        css: function css(key, val) {
+            var currentStyle = key + ':' + val + ';';
+            return this.forEach(function (elem) {
+                var style = (elem.getAttribute('style') || '').trim();
+                var styleArr = void 0,
+                    resultArr = [];
+                if (style) {
+                    // 将 style 按照 ; 拆分为数组
+                    styleArr = style.split(';');
+                    styleArr.forEach(function (item) {
+                        // 对每项样式,按照 : 拆分为 key 和 value
+                        var arr = item.split(':').map(function (i) {
+                            return i.trim();
+                        });
+                        if (arr.length === 2) {
+                            resultArr.push(arr[0] + ':' + arr[1]);
+                        }
+                    });
+                    // 替换或者新增
+                    resultArr = resultArr.map(function (item) {
+                        if (item.indexOf(key) === 0) {
+                            return currentStyle;
+                        } else {
+                            return item;
+                        }
+                    });
+                    if (resultArr.indexOf(currentStyle) < 0) {
+                        resultArr.push(currentStyle);
+                    }
+                    // 结果
+                    elem.setAttribute('style', resultArr.join('; '));
+                } else {
+                    // style 无值
+                    elem.setAttribute('style', currentStyle);
+                }
+            });
+        },
+
+        // 显示
+        show: function show() {
+            return this.css('display', 'block');
+        },
+
+        // 隐藏
+        hide: function hide() {
+            return this.css('display', 'none');
+        },
+
+        // 获取子节点
+        children: function children() {
+            var elem = this[0];
+            if (!elem) {
+                return null;
+            }
+
+            return $(elem.children);
+        },
+
+        // 增加子节点
+        append: function append($children) {
+            return this.forEach(function (elem) {
+                $children.forEach(function (child) {
+                    elem.appendChild(child);
+                });
+            });
+        },
+
+        // 移除当前节点
+        remove: function remove() {
+            return this.forEach(function (elem) {
+                if (elem.remove) {
+                    elem.remove();
+                } else {
+                    var parent = elem.parentElement;
+                    parent && parent.removeChild(elem);
+                }
+            });
+        },
+
+        // 是否包含某个子节点
+        isContain: function isContain($child) {
+            var elem = this[0];
+            var child = $child[0];
+            return elem.contains(child);
+        },
+
+        // 尺寸数据
+        getSizeData: function getSizeData() {
+            var elem = this[0];
+            return elem.getBoundingClientRect(); // 可得到 bottom height left right top width 的数据
+        },
+
+        // 封装 nodeName
+        getNodeName: function getNodeName() {
+            var elem = this[0];
+            return elem.nodeName;
+        },
+
+        // 从当前元素查找
+        find: function find(selector) {
+            var elem = this[0];
+            return $(elem.querySelectorAll(selector));
+        },
+
+        // 获取当前元素的 text
+        text: function text(val) {
+            if (!val) {
+                // 获取 text
+                var elem = this[0];
+                return elem.innerHTML.replace(/<.*?>/g, function () {
+                    return '';
+                });
+            } else {
+                // 设置 text
+                return this.forEach(function (elem) {
+                    elem.innerHTML = val;
+                });
+            }
+        },
+
+        // 获取 html
+        html: function html(value) {
+            var elem = this[0];
+            if (value == null) {
+                return elem.innerHTML;
+            } else {
+                elem.innerHTML = value;
+                return this;
+            }
+        },
+
+        // 获取 value
+        val: function val() {
+            var elem = this[0];
+            return elem.value.trim();
+        },
+
+        // focus
+        focus: function focus() {
+            return this.forEach(function (elem) {
+                elem.focus();
+            });
+        },
+
+        // parent
+        parent: function parent() {
+            var elem = this[0];
+            return $(elem.parentElement);
+        },
+
+        // parentUntil 找到符合 selector 的父节点
+        parentUntil: function parentUntil(selector, _currentElem) {
+            var results = document.querySelectorAll(selector);
+            var length = results.length;
+            if (!length) {
+                // 传入的 selector 无效
+                return null;
+            }
+
+            var elem = _currentElem || this[0];
+            if (elem.nodeName === 'BODY') {
+                return null;
+            }
+
+            var parent = elem.parentElement;
+            var i = void 0;
+            for (i = 0; i < length; i++) {
+                if (parent === results[i]) {
+                    // 找到,并返回
+                    return $(parent);
+                }
+            }
+
+            // 继续查找
+            return this.parentUntil(selector, parent);
+        },
+
+        // 判断两个 elem 是否相等
+        equal: function equal($elem) {
+            if ($elem.nodeType === 1) {
+                return this[0] === $elem;
+            } else {
+                return this[0] === $elem[0];
+            }
+        },
+
+        // 将该元素插入到某个元素前面
+        insertBefore: function insertBefore(selector) {
+            var $referenceNode = $(selector);
+            var referenceNode = $referenceNode[0];
+            if (!referenceNode) {
+                return this;
+            }
+            return this.forEach(function (elem) {
+                var parent = referenceNode.parentNode;
+                parent.insertBefore(elem, referenceNode);
+            });
+        },
+
+        // 将该元素插入到某个元素后面
+        insertAfter: function insertAfter(selector) {
+            var $referenceNode = $(selector);
+            var referenceNode = $referenceNode[0];
+            if (!referenceNode) {
+                return this;
+            }
+            return this.forEach(function (elem) {
+                var parent = referenceNode.parentNode;
+                if (parent.lastChild === referenceNode) {
+                    // 最后一个元素
+                    parent.appendChild(elem);
+                } else {
+                    // 不是最后一个元素
+                    parent.insertBefore(elem, referenceNode.nextSibling);
+                }
+            });
+        }
+    };
+
+// new 一个对象
+    function $(selector) {
+        return new DomElement(selector);
+    }
+
+    /*
+     配置信息
+     */
+
+    var config = {
+
+        // 默认菜单配置
+        menus: ['head', 'bold', 'italic', 'underline', 'strikeThrough', 'foreColor', 'backColor', 'link', 'list', 'justify', 'quote', 'emoticon', 'image', 'table', 'video', 'code', 'undo', 'redo'],
+
+        // 编辑区域的 z-index
+        zIndex: 10000,
+
+        // 是否开启 debug 模式(debug 模式下错误会 throw error 形式抛出)
+        debug: false,
+
+        // onchange 事件
+        // onchange: function (html) {
+        //     // html 即变化之后的内容
+        //     console.log(html)
+        // },
+
+        // 是否显示添加网络图片的 tab
+        showLinkImg: true,
+
+        // 默认上传图片 max size: 5M
+        uploadImgMaxSize: 5 * 1024 * 1024,
+
+        // 配置一次最多上传几个图片
+        // uploadImgMaxLength: 5,
+
+        // 上传图片,是否显示 base64 格式
+        uploadImgShowBase64: false,
+
+        // 上传图片,server 地址(如果有值,则 base64 格式的配置则失效)
+        // uploadImgServer: '/upload',
+
+        // 自定义配置 filename
+        uploadFileName: '',
+
+        // 上传图片的自定义参数
+        uploadImgParams: {
+            token: 'abcdef12345'
+        },
+
+        // 上传图片的自定义header
+        uploadImgHeaders: {
+            // 'Accept': 'text/x-json'
+        },
+
+        // 配置 XHR withCredentials
+        withCredentials: false,
+
+        // 自定义上传图片超时时间 ms
+        uploadImgTimeout: 5000,
+
+        // 上传图片 hook
+        uploadImgHooks: {
+            // customInsert: function (insertLinkImg, result, editor) {
+            //     console.log('customInsert')
+            //     // 图片上传并返回结果,自定义插入图片的事件,而不是编辑器自动插入图片
+            //     const data = result.data1 || []
+            //     data.forEach(link => {
+            //         insertLinkImg(link)
+            //     })
+            // },
+            before: function before(xhr, editor, files) {
+                // 图片上传之前触发
+            },
+            success: function success(xhr, editor, result) {
+                // 图片上传并返回结果,图片插入成功之后触发
+            },
+            fail: function fail(xhr, editor, result) {
+                // 图片上传并返回结果,但图片插入错误时触发
+            },
+            error: function error(xhr, editor) {
+                // 图片上传出错时触发
+            },
+            timeout: function timeout(xhr, editor) {
+                // 图片上传超时时触发
+            }
+        }
+    };
+
+    /*
+     工具
+     */
+
+// 和 UA 相关的属性
+    var UA = {
+        _ua: navigator.userAgent,
+
+        // 是否 webkit
+        isWebkit: function isWebkit() {
+            var reg = /webkit/i;
+            return reg.test(this._ua);
+        },
+
+        // 是否 IE
+        isIE: function isIE() {
+            return 'ActiveXObject' in window;
+        }
+    };
+
+// 遍历对象
+    function objForEach(obj, fn) {
+        var key = void 0,
+            result = void 0;
+        for (key in obj) {
+            if (obj.hasOwnProperty(key)) {
+                result = fn.call(obj, key, obj[key]);
+                if (result === false) {
+                    break;
+                }
+            }
+        }
+    }
+
+// 遍历类数组
+    function arrForEach(fakeArr, fn) {
+        var i = void 0,
+            item = void 0,
+            result = void 0;
+        var length = fakeArr.length || 0;
+        for (i = 0; i < length; i++) {
+            item = fakeArr[i];
+            result = fn.call(fakeArr, item, i);
+            if (result === false) {
+                break;
+            }
+        }
+    }
+
+// 获取随机数
+    function getRandom(prefix) {
+        return prefix + Math.random().toString().slice(2);
+    }
+
+// 替换 html 特殊字符
+    function replaceHtmlSymbol(html) {
+        if (html == null) {
+            return '';
+        }
+        return html.replace(/</gm, '&lt;').replace(/>/gm, '&gt;').replace(/"/gm, '&quot;');
+    }
+
+// 返回百分比的格式
+
+    /*
+     bold-menu
+     */
+// 构造函数
+    function Bold(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-bold"><i/>\n        </div>');
+        this.type = 'click';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Bold.prototype = {
+        constructor: Bold,
+
+        // 点击事件
+        onClick: function onClick(e) {
+            // 点击菜单将触发这里
+
+            var editor = this.editor;
+            var isSeleEmpty = editor.selection.isSelectionEmpty();
+
+            if (isSeleEmpty) {
+                // 选区是空的,插入并选中一个“空白”
+                editor.selection.createEmptyRange();
+            }
+
+            // 执行 bold 命令
+            editor.cmd.do('bold');
+
+            if (isSeleEmpty) {
+                // 需要将选取折叠起来
+                editor.selection.collapseRange();
+                editor.selection.restoreSelection();
+            }
+        },
+
+        // 试图改变 active 状态
+        tryChangeActive: function tryChangeActive(e) {
+            var editor = this.editor;
+            var $elem = this.$elem;
+            if (editor.cmd.queryCommandState('bold')) {
+                this._active = true;
+                $elem.addClass('w-e-active');
+            } else {
+                this._active = false;
+                $elem.removeClass('w-e-active');
+            }
+        }
+    };
+
+    /*
+     droplist
+     */
+    var _emptyFn = function _emptyFn() {};
+
+// 构造函数
+    function DropList(menu, opt) {
+        var _this = this;
+
+        // droplist 所依附的菜单
+        this.menu = menu;
+        this.opt = opt;
+        // 容器
+        var $container = $('<div class="w-e-droplist"></div>');
+
+        // 标题
+        var $title = opt.$title;
+        if ($title) {
+            $title.addClass('w-e-dp-title');
+            $container.append($title);
+        }
+
+        var list = opt.list || [];
+        var type = opt.type || 'list'; // 'list' 列表形式(如“标题”菜单) / 'inline-block' 块状形式(如“颜色”菜单)
+        var onClick = opt.onClick || _emptyFn;
+
+        // 加入 DOM 并绑定事件
+        var $list = $('<ul class="' + (type === 'list' ? 'w-e-list' : 'w-e-block') + '"></ul>');
+        $container.append($list);
+        list.forEach(function (item) {
+            var $elem = item.$elem;
+            var value = item.value;
+            var $li = $('<li class="w-e-item"></li>');
+            if ($elem) {
+                $li.append($elem);
+                $list.append($li);
+                $elem.on('click', function (e) {
+                    onClick(value);
+
+                    // 隐藏
+                    _this.hideTimeoutId = setTimeout(function () {
+                        _this.hide();
+                    }, 0);
+                });
+            }
+        });
+
+        // 绑定隐藏事件
+        $container.on('mouseleave', function (e) {
+            _this.hideTimeoutId = setTimeout(function () {
+                _this.hide();
+            }, 0);
+        });
+
+        // 记录属性
+        this.$container = $container;
+
+        // 基本属性
+        this._rendered = false;
+        this._show = false;
+    }
+
+// 原型
+    DropList.prototype = {
+        constructor: DropList,
+
+        // 显示(插入DOM)
+        show: function show() {
+            if (this.hideTimeoutId) {
+                // 清除之前的定时隐藏
+                clearTimeout(this.hideTimeoutId);
+            }
+
+            var menu = this.menu;
+            var $menuELem = menu.$elem;
+            var $container = this.$container;
+            if (this._show) {
+                return;
+            }
+            if (this._rendered) {
+                // 显示
+                $container.show();
+            } else {
+                // 加入 DOM 之前先定位位置
+                var menuHeight = $menuELem.getSizeData().height || 0;
+                var width = this.opt.width || 100; // 默认为 100
+                $container.css('margin-top', menuHeight + 'px').css('width', width + 'px');
+
+                // 加入到 DOM
+                $menuELem.append($container);
+                this._rendered = true;
+            }
+
+            // 修改属性
+            this._show = true;
+        },
+
+        // 隐藏(移除DOM)
+        hide: function hide() {
+            if (this.showTimeoutId) {
+                // 清除之前的定时显示
+                clearTimeout(this.showTimeoutId);
+            }
+
+            var $container = this.$container;
+            if (!this._show) {
+                return;
+            }
+            // 隐藏并需改属性
+            $container.hide();
+            this._show = false;
+        }
+    };
+
+    /*
+     menu - header
+     */
+// 构造函数
+    function Head(editor) {
+        var _this = this;
+
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-header"><i/></div>');
+        this.type = 'droplist';
+
+        // 当前是否 active 状态
+        this._active = false;
+
+        // 初始化 droplist
+        this.droplist = new DropList(this, {
+            width: 100,
+            $title: $('<p>设置标题</p>'),
+            type: 'list', // droplist 以列表形式展示
+            list: [{ $elem: $('<h1>H1</h1>'), value: '<h1>' }, { $elem: $('<h2>H2</h2>'), value: '<h2>' }, { $elem: $('<h3>H3</h3>'), value: '<h3>' }, { $elem: $('<h4>H4</h4>'), value: '<h4>' }, { $elem: $('<h5>H5</h5>'), value: '<h5>' }, { $elem: $('<p>正文</p>'), value: '<p>' }],
+            onClick: function onClick(value) {
+                // 注意 this 是指向当前的 Head 对象
+                _this._command(value);
+            }
+        });
+    }
+
+// 原型
+    Head.prototype = {
+        constructor: Head,
+
+        // 执行命令
+        _command: function _command(value) {
+            var editor = this.editor;
+            editor.cmd.do('formatBlock', value);
+        },
+
+        // 试图改变 active 状态
+        tryChangeActive: function tryChangeActive(e) {
+            var editor = this.editor;
+            var $elem = this.$elem;
+            var reg = /^h/i;
+            var cmdValue = editor.cmd.queryCommandValue('formatBlock');
+            if (reg.test(cmdValue)) {
+                this._active = true;
+                $elem.addClass('w-e-active');
+            } else {
+                this._active = false;
+                $elem.removeClass('w-e-active');
+            }
+        }
+    };
+
+    /*
+     panel
+     */
+
+    var emptyFn = function emptyFn() {};
+
+// 记录已经显示 panel 的菜单
+    var _isCreatedPanelMenus = [];
+
+// 构造函数
+    function Panel(menu, opt) {
+        this.menu = menu;
+        this.opt = opt;
+    }
+
+// 原型
+    Panel.prototype = {
+        constructor: Panel,
+
+        // 显示(插入DOM)
+        show: function show() {
+            var _this = this;
+
+            var menu = this.menu;
+            if (_isCreatedPanelMenus.indexOf(menu) >= 0) {
+                // 该菜单已经创建了 panel 不能再创建
+                return;
+            }
+
+            var editor = menu.editor;
+            var $body = $('body');
+            var $textContainerElem = editor.$textContainerElem;
+            var opt = this.opt;
+
+            // panel 的容器
+            var $container = $('<div class="w-e-panel-container"></div>');
+            var width = opt.width || 300; // 默认 300px
+            $container.css('width', width + 'px').css('margin-left', (0 - width) / 2 + 'px');
+
+            // 添加关闭按钮
+            var $closeBtn = $('<i class="w-e-icon-close w-e-panel-close"></i>');
+            $container.append($closeBtn);
+            $closeBtn.on('click', function () {
+                _this.hide();
+            });
+
+            // 准备 tabs 容器
+            var $tabTitleContainer = $('<ul class="w-e-panel-tab-title"></ul>');
+            var $tabContentContainer = $('<div class="w-e-panel-tab-content"></div>');
+            $container.append($tabTitleContainer).append($tabContentContainer);
+
+            // 设置高度
+            var height = opt.height;
+            if (height) {
+                $tabContentContainer.css('height', height + 'px').css('overflow-y', 'auto');
+            }
+
+            // tabs
+            var tabs = opt.tabs || [];
+            var tabTitleArr = [];
+            var tabContentArr = [];
+            tabs.forEach(function (tab, tabIndex) {
+                if (!tab) {
+                    return;
+                }
+                var title = tab.title || '';
+                var tpl = tab.tpl || '';
+
+                // 添加到 DOM
+                var $title = $('<li class="w-e-item">' + title + '</li>');
+                $tabTitleContainer.append($title);
+                var $content = $(tpl);
+                $tabContentContainer.append($content);
+
+                // 记录到内存
+                $title._index = tabIndex;
+                tabTitleArr.push($title);
+                tabContentArr.push($content);
+
+                // 设置 active 项
+                if (tabIndex === 0) {
+                    $title._active = true;
+                    $title.addClass('w-e-active');
+                } else {
+                    $content.hide();
+                }
+
+                // 绑定 tab 的事件
+                $title.on('click', function (e) {
+                    if ($title._active) {
+                        return;
+                    }
+                    // 隐藏所有的 tab
+                    tabTitleArr.forEach(function ($title) {
+                        $title._active = false;
+                        $title.removeClass('w-e-active');
+                    });
+                    tabContentArr.forEach(function ($content) {
+                        $content.hide();
+                    });
+
+                    // 显示当前的 tab
+                    $title._active = true;
+                    $title.addClass('w-e-active');
+                    $content.show();
+                });
+            });
+
+            // 绑定关闭事件
+            $container.on('click', function (e) {
+                // 点击时阻止冒泡
+                e.stopPropagation();
+            });
+            $body.on('click', function (e) {
+                _this.hide();
+            });
+
+            // 添加到 DOM
+            $textContainerElem.append($container);
+
+            // 绑定 opt 的事件,只有添加到 DOM 之后才能绑定成功
+            tabs.forEach(function (tab, index) {
+                if (!tab) {
+                    return;
+                }
+                var events = tab.events || [];
+                events.forEach(function (event) {
+                    var selector = event.selector;
+                    var type = event.type;
+                    var fn = event.fn || emptyFn;
+                    var $content = tabContentArr[index];
+                    $content.find(selector).on(type, function (e) {
+                        e.stopPropagation();
+                        var needToHide = fn(e);
+                        // 执行完事件之后,是否要关闭 panel
+                        if (needToHide) {
+                            _this.hide();
+                        }
+                    });
+                });
+            });
+
+            // focus 第一个 elem
+            var $inputs = $container.find('input[type=text],textarea');
+            if ($inputs.length) {
+                $inputs.get(0).focus();
+            }
+
+            // 添加到属性
+            this.$container = $container;
+
+            // 隐藏其他 panel
+            this._hideOtherPanels();
+            // 记录该 menu 已经创建了 panel
+            _isCreatedPanelMenus.push(menu);
+        },
+
+        // 隐藏(移除DOM)
+        hide: function hide() {
+            var menu = this.menu;
+            var $container = this.$container;
+            if ($container) {
+                $container.remove();
+            }
+
+            // 将该 menu 记录中移除
+            _isCreatedPanelMenus = _isCreatedPanelMenus.filter(function (item) {
+                if (item === menu) {
+                    return false;
+                } else {
+                    return true;
+                }
+            });
+        },
+
+        // 一个 panel 展示时,隐藏其他 panel
+        _hideOtherPanels: function _hideOtherPanels() {
+            if (!_isCreatedPanelMenus.length) {
+                return;
+            }
+            _isCreatedPanelMenus.forEach(function (menu) {
+                var panel = menu.panel || {};
+                if (panel.hide) {
+                    panel.hide();
+                }
+            });
+        }
+    };
+
+    /*
+     menu - link
+     */
+// 构造函数
+    function Link(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-link"><i/></div>');
+        this.type = 'panel';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Link.prototype = {
+        constructor: Link,
+
+        // 点击事件
+        onClick: function onClick(e) {
+            var editor = this.editor;
+            var $linkelem = void 0;
+
+            if (this._active) {
+                // 当前选区在链接里面
+                $linkelem = editor.selection.getSelectionContainerElem();
+                if (!$linkelem) {
+                    return;
+                }
+                // 将该元素都包含在选取之内,以便后面整体替换
+                editor.selection.createRangeByElem($linkelem);
+                editor.selection.restoreSelection();
+                // 显示 panel
+                this._createPanel($linkelem.text(), $linkelem.attr('href'));
+            } else {
+                // 当前选区不在链接里面
+                if (editor.selection.isSelectionEmpty()) {
+                    // 选区是空的,未选中内容
+                    this._createPanel('', '');
+                } else {
+                    // 选中内容了
+                    this._createPanel(editor.selection.getSelectionText(), '');
+                }
+            }
+        },
+
+        // 创建 panel
+        _createPanel: function _createPanel(text, link) {
+            var _this = this;
+
+            // panel 中需要用到的id
+            var inputLinkId = getRandom('input-link');
+            var inputTextId = getRandom('input-text');
+            var btnOkId = getRandom('btn-ok');
+            var btnDelId = getRandom('btn-del');
+
+            // 是否显示“删除链接”
+            var delBtnDisplay = this._active ? 'inline-block' : 'none';
+
+            // 初始化并显示 panel
+            var panel = new Panel(this, {
+                width: 300,
+                // panel 中可包含多个 tab
+                tabs: [{
+                    // tab 的标题
+                    title: '链接',
+                    // 模板
+                    tpl: '<div>\n                            <input id="' + inputTextId + '" type="text" class="block" value="' + text + '" placeholder="\u94FE\u63A5\u6587\u5B57"/></td>\n                            <input id="' + inputLinkId + '" type="text" class="block" value="' + link + '" placeholder="http://..."/></td>\n                            <div class="w-e-button-container">\n                                <button id="' + btnOkId + '" class="right">\u63D2\u5165</button>\n                                <button id="' + btnDelId + '" class="gray right" style="display:' + delBtnDisplay + '">\u5220\u9664\u94FE\u63A5</button>\n                            </div>\n                        </div>',
+                    // 事件绑定
+                    events: [
+                        // 插入链接
+                        {
+                            selector: '#' + btnOkId,
+                            type: 'click',
+                            fn: function fn() {
+                                // 执行插入链接
+                                var $link = $('#' + inputLinkId);
+                                var $text = $('#' + inputTextId);
+                                var link = $link.val();
+                                var text = $text.val();
+                                _this._insertLink(text, link);
+
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true;
+                            }
+                        },
+                        // 删除链接
+                        {
+                            selector: '#' + btnDelId,
+                            type: 'click',
+                            fn: function fn() {
+                                // 执行删除链接
+                                _this._delLink();
+
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true;
+                            }
+                        }]
+                } // tab end
+                ] // tabs end
+            });
+
+            // 显示 panel
+            panel.show();
+
+            // 记录属性
+            this.panel = panel;
+        },
+
+        // 删除当前链接
+        _delLink: function _delLink() {
+            if (!this._active) {
+                return;
+            }
+            var editor = this.editor;
+            var $selectionELem = editor.selection.getSelectionContainerElem();
+            if (!$selectionELem) {
+                return;
+            }
+            var selectionText = editor.selection.getSelectionText();
+            editor.cmd.do('insertHTML', '<span>' + selectionText + '</span>');
+        },
+
+        // 插入链接
+        _insertLink: function _insertLink(text, link) {
+            if (!text || !link) {
+                return;
+            }
+            var editor = this.editor;
+            editor.cmd.do('insertHTML', '<a href="' + link + '" target="_blank">' + text + '</a>');
+        },
+
+        // 试图改变 active 状态
+        tryChangeActive: function tryChangeActive(e) {
+            var editor = this.editor;
+            var $elem = this.$elem;
+            var $selectionELem = editor.selection.getSelectionContainerElem();
+            if (!$selectionELem) {
+                return;
+            }
+            if ($selectionELem.getNodeName() === 'A') {
+                this._active = true;
+                $elem.addClass('w-e-active');
+            } else {
+                this._active = false;
+                $elem.removeClass('w-e-active');
+            }
+        }
+    };
+
+    /*
+     italic-menu
+     */
+// 构造函数
+    function Italic(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-italic"><i/>\n        </div>');
+        this.type = 'click';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Italic.prototype = {
+        constructor: Italic,
+
+        // 点击事件
+        onClick: function onClick(e) {
+            // 点击菜单将触发这里
+
+            var editor = this.editor;
+            var isSeleEmpty = editor.selection.isSelectionEmpty();
+
+            if (isSeleEmpty) {
+                // 选区是空的,插入并选中一个“空白”
+                editor.selection.createEmptyRange();
+            }
+
+            // 执行 italic 命令
+            editor.cmd.do('italic');
+
+            if (isSeleEmpty) {
+                // 需要将选取折叠起来
+                editor.selection.collapseRange();
+                editor.selection.restoreSelection();
+            }
+        },
+
+        // 试图改变 active 状态
+        tryChangeActive: function tryChangeActive(e) {
+            var editor = this.editor;
+            var $elem = this.$elem;
+            if (editor.cmd.queryCommandState('italic')) {
+                this._active = true;
+                $elem.addClass('w-e-active');
+            } else {
+                this._active = false;
+                $elem.removeClass('w-e-active');
+            }
+        }
+    };
+
+    /*
+     redo-menu
+     */
+// 构造函数
+    function Redo(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-redo"><i/>\n        </div>');
+        this.type = 'click';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Redo.prototype = {
+        constructor: Redo,
+
+        // 点击事件
+        onClick: function onClick(e) {
+            // 点击菜单将触发这里
+
+            var editor = this.editor;
+
+            // 执行 redo 命令
+            editor.cmd.do('redo');
+        }
+    };
+
+    /*
+     strikeThrough-menu
+     */
+// 构造函数
+    function StrikeThrough(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-strikethrough"><i/>\n        </div>');
+        this.type = 'click';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    StrikeThrough.prototype = {
+        constructor: StrikeThrough,
+
+        // 点击事件
+        onClick: function onClick(e) {
+            // 点击菜单将触发这里
+
+            var editor = this.editor;
+            var isSeleEmpty = editor.selection.isSelectionEmpty();
+
+            if (isSeleEmpty) {
+                // 选区是空的,插入并选中一个“空白”
+                editor.selection.createEmptyRange();
+            }
+
+            // 执行 strikeThrough 命令
+            editor.cmd.do('strikeThrough');
+
+            if (isSeleEmpty) {
+                // 需要将选取折叠起来
+                editor.selection.collapseRange();
+                editor.selection.restoreSelection();
+            }
+        },
+
+        // 试图改变 active 状态
+        tryChangeActive: function tryChangeActive(e) {
+            var editor = this.editor;
+            var $elem = this.$elem;
+            if (editor.cmd.queryCommandState('strikeThrough')) {
+                this._active = true;
+                $elem.addClass('w-e-active');
+            } else {
+                this._active = false;
+                $elem.removeClass('w-e-active');
+            }
+        }
+    };
+
+    /*
+     underline-menu
+     */
+// 构造函数
+    function Underline(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-underline"><i/>\n        </div>');
+        this.type = 'click';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Underline.prototype = {
+        constructor: Underline,
+
+        // 点击事件
+        onClick: function onClick(e) {
+            // 点击菜单将触发这里
+
+            var editor = this.editor;
+            var isSeleEmpty = editor.selection.isSelectionEmpty();
+
+            if (isSeleEmpty) {
+                // 选区是空的,插入并选中一个“空白”
+                editor.selection.createEmptyRange();
+            }
+
+            // 执行 underline 命令
+            editor.cmd.do('underline');
+
+            if (isSeleEmpty) {
+                // 需要将选取折叠起来
+                editor.selection.collapseRange();
+                editor.selection.restoreSelection();
+            }
+        },
+
+        // 试图改变 active 状态
+        tryChangeActive: function tryChangeActive(e) {
+            var editor = this.editor;
+            var $elem = this.$elem;
+            if (editor.cmd.queryCommandState('underline')) {
+                this._active = true;
+                $elem.addClass('w-e-active');
+            } else {
+                this._active = false;
+                $elem.removeClass('w-e-active');
+            }
+        }
+    };
+
+    /*
+     undo-menu
+     */
+// 构造函数
+    function Undo(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-undo"><i/>\n        </div>');
+        this.type = 'click';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Undo.prototype = {
+        constructor: Undo,
+
+        // 点击事件
+        onClick: function onClick(e) {
+            // 点击菜单将触发这里
+
+            var editor = this.editor;
+
+            // 执行 undo 命令
+            editor.cmd.do('undo');
+        }
+    };
+
+    /*
+     menu - list
+     */
+// 构造函数
+    function List(editor) {
+        var _this = this;
+
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-list2"><i/></div>');
+        this.type = 'droplist';
+
+        // 当前是否 active 状态
+        this._active = false;
+
+        // 初始化 droplist
+        this.droplist = new DropList(this, {
+            width: 120,
+            $title: $('<p>设置列表</p>'),
+            type: 'list', // droplist 以列表形式展示
+            list: [{ $elem: $('<span><i class="w-e-icon-list-numbered"></i> 有序列表</span>'), value: 'insertOrderedList' }, { $elem: $('<span><i class="w-e-icon-list2"></i> 无序列表</span>'), value: 'insertUnorderedList' }],
+            onClick: function onClick(value) {
+                // 注意 this 是指向当前的 List 对象
+                _this._command(value);
+            }
+        });
+    }
+
+// 原型
+    List.prototype = {
+        constructor: List,
+
+        // 执行命令
+        _command: function _command(value) {
+            var editor = this.editor;
+            var $textElem = editor.$textElem;
+            editor.selection.restoreSelection();
+            if (editor.cmd.queryCommandState(value)) {
+                return;
+            }
+            editor.cmd.do(value);
+
+            // 验证列表是否被包裹在 <p> 之内
+            var $selectionElem = editor.selection.getSelectionContainerElem();
+            if ($selectionElem.getNodeName() === 'LI') {
+                $selectionElem = $selectionElem.parent();
+            }
+            if (/^ol|ul$/i.test($selectionElem.getNodeName()) === false) {
+                return;
+            }
+            if ($selectionElem.equal($textElem)) {
+                // 证明是顶级标签,没有被 <p> 包裹
+                return;
+            }
+            var $parent = $selectionElem.parent();
+            if ($parent.equal($textElem)) {
+                // $parent 是顶级标签,不能删除
+                return;
+            }
+
+            $selectionElem.insertAfter($parent);
+            $parent.remove();
+        },
+
+        // 试图改变 active 状态
+        tryChangeActive: function tryChangeActive(e) {
+            var editor = this.editor;
+            var $elem = this.$elem;
+            if (editor.cmd.queryCommandState('insertUnOrderedList') || editor.cmd.queryCommandState('insertOrderedList')) {
+                this._active = true;
+                $elem.addClass('w-e-active');
+            } else {
+                this._active = false;
+                $elem.removeClass('w-e-active');
+            }
+        }
+    };
+
+    /*
+     menu - justify
+     */
+// 构造函数
+    function Justify(editor) {
+        var _this = this;
+
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-paragraph-left"><i/></div>');
+        this.type = 'droplist';
+
+        // 当前是否 active 状态
+        this._active = false;
+
+        // 初始化 droplist
+        this.droplist = new DropList(this, {
+            width: 100,
+            $title: $('<p>对齐方式</p>'),
+            type: 'list', // droplist 以列表形式展示
+            list: [{ $elem: $('<span><i class="w-e-icon-paragraph-left"></i> 靠左</span>'), value: 'justifyLeft' }, { $elem: $('<span><i class="w-e-icon-paragraph-center"></i> 居中</span>'), value: 'justifyCenter' }, { $elem: $('<span><i class="w-e-icon-paragraph-right"></i> 靠右</span>'), value: 'justifyRight' }],
+            onClick: function onClick(value) {
+                // 注意 this 是指向当前的 List 对象
+                _this._command(value);
+            }
+        });
+    }
+
+// 原型
+    Justify.prototype = {
+        constructor: Justify,
+
+        // 执行命令
+        _command: function _command(value) {
+            var editor = this.editor;
+            editor.cmd.do(value);
+        }
+    };
+
+    /*
+     menu - backcolor
+     */
+// 构造函数
+    function BackColor(editor) {
+        var _this = this;
+
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-pencil2"><i/></div>');
+        this.type = 'droplist';
+
+        // 当前是否 active 状态
+        this._active = false;
+
+        // 初始化 droplist
+        this.droplist = new DropList(this, {
+            width: 120,
+            $title: $('<p>文字颜色</p>'),
+            type: 'inline-block', // droplist 内容以 block 形式展示
+            list: [{ $elem: $('<i style="color:#000000;" class="w-e-icon-pencil2"></i>'), value: '#000000' }, { $elem: $('<i style="color:#eeece0;" class="w-e-icon-pencil2"></i>'), value: '#eeece0' }, { $elem: $('<i style="color:#1c487f;" class="w-e-icon-pencil2"></i>'), value: '#1c487f' }, { $elem: $('<i style="color:#4d80bf;" class="w-e-icon-pencil2"></i>'), value: '#4d80bf' }, { $elem: $('<i style="color:#c24f4a;" class="w-e-icon-pencil2"></i>'), value: '#c24f4a' }, { $elem: $('<i style="color:#8baa4a;" class="w-e-icon-pencil2"></i>'), value: '#8baa4a' }, { $elem: $('<i style="color:#7b5ba1;" class="w-e-icon-pencil2"></i>'), value: '#7b5ba1' }, { $elem: $('<i style="color:#46acc8;" class="w-e-icon-pencil2"></i>'), value: '#46acc8' }, { $elem: $('<i style="color:#f9963b;" class="w-e-icon-pencil2"></i>'), value: '#f9963b' }, { $elem: $('<i style="color:#ffffff;" class="w-e-icon-pencil2"></i>'), value: '#ffffff' }],
+            onClick: function onClick(value) {
+                // 注意 this 是指向当前的 BackColor 对象
+                _this._command(value);
+            }
+        });
+    }
+
+// 原型
+    BackColor.prototype = {
+        constructor: BackColor,
+
+        // 执行命令
+        _command: function _command(value) {
+            var editor = this.editor;
+            editor.cmd.do('foreColor', value);
+        }
+    };
+
+    /*
+     menu - forecolor
+     */
+// 构造函数
+    function ForeColor$1(editor) {
+        var _this = this;
+
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-paint-brush"><i/></div>');
+        this.type = 'droplist';
+
+        // 当前是否 active 状态
+        this._active = false;
+
+        // 初始化 droplist
+        this.droplist = new DropList(this, {
+            width: 120,
+            $title: $('<p>背景色</p>'),
+            type: 'inline-block', // droplist 内容以 block 形式展示
+            list: [{ $elem: $('<i style="color:#000000;" class="w-e-icon-paint-brush"></i>'), value: '#000000' }, { $elem: $('<i style="color:#eeece0;" class="w-e-icon-paint-brush"></i>'), value: '#eeece0' }, { $elem: $('<i style="color:#1c487f;" class="w-e-icon-paint-brush"></i>'), value: '#1c487f' }, { $elem: $('<i style="color:#4d80bf;" class="w-e-icon-paint-brush"></i>'), value: '#4d80bf' }, { $elem: $('<i style="color:#c24f4a;" class="w-e-icon-paint-brush"></i>'), value: '#c24f4a' }, { $elem: $('<i style="color:#8baa4a;" class="w-e-icon-paint-brush"></i>'), value: '#8baa4a' }, { $elem: $('<i style="color:#7b5ba1;" class="w-e-icon-paint-brush"></i>'), value: '#7b5ba1' }, { $elem: $('<i style="color:#46acc8;" class="w-e-icon-paint-brush"></i>'), value: '#46acc8' }, { $elem: $('<i style="color:#f9963b;" class="w-e-icon-paint-brush"></i>'), value: '#f9963b' }, { $elem: $('<i style="color:#ffffff;" class="w-e-icon-paint-brush"></i>'), value: '#ffffff' }],
+            onClick: function onClick(value) {
+                // 注意 this 是指向当前的 ForeColor 对象
+                _this._command(value);
+            }
+        });
+    }
+
+// 原型
+    ForeColor$1.prototype = {
+        constructor: ForeColor$1,
+
+        // 执行命令
+        _command: function _command(value) {
+            var editor = this.editor;
+            editor.cmd.do('backColor', value);
+        }
+    };
+
+    /*
+     menu - quote
+     */
+// 构造函数
+    function Quote(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-quotes-left"><i/>\n        </div>');
+        this.type = 'click';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Quote.prototype = {
+        constructor: Quote,
+
+        onClick: function onClick(e) {
+            var editor = this.editor;
+            editor.cmd.do('formatBlock', '<BLOCKQUOTE>');
+        },
+
+        tryChangeActive: function tryChangeActive(e) {
+            var editor = this.editor;
+            var $elem = this.$elem;
+            var reg = /^BLOCKQUOTE$/i;
+            var cmdValue = editor.cmd.queryCommandValue('formatBlock');
+            if (reg.test(cmdValue)) {
+                this._active = true;
+                $elem.addClass('w-e-active');
+            } else {
+                this._active = false;
+                $elem.removeClass('w-e-active');
+            }
+        }
+    };
+
+    /*
+     menu - code
+     */
+// 构造函数
+    function Code(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-terminal"><i/>\n        </div>');
+        this.type = 'panel';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Code.prototype = {
+        constructor: Code,
+
+        onClick: function onClick(e) {
+            var editor = this.editor;
+            var $startElem = editor.selection.getSelectionStartElem();
+            var $endElem = editor.selection.getSelectionEndElem();
+            var isSeleEmpty = editor.selection.isSelectionEmpty();
+            var selectionText = editor.selection.getSelectionText();
+            var $code = void 0;
+
+            if (!$startElem.equal($endElem)) {
+                // 跨元素选择,不做处理
+                editor.selection.restoreSelection();
+                return;
+            }
+            if (!isSeleEmpty) {
+                // 选取不是空,用 <code> 包裹即可
+                $code = $('<code>' + selectionText + '</code>');
+                editor.cmd.do('insertElem', $code);
+                editor.selection.createRangeByElem($code, false);
+                editor.selection.restoreSelection();
+                return;
+            }
+
+            // 选取是空,且没有夸元素选择,则插入 <pre><code></code></prev>
+            if (this._active) {
+                // 选中状态,将编辑内容
+                this._createPanel($startElem.html());
+            } else {
+                // 未选中状态,将创建内容
+                this._createPanel();
+            }
+        },
+
+        _createPanel: function _createPanel(value) {
+            var _this = this;
+
+            // value - 要编辑的内容
+            value = value || '';
+            var type = !value ? 'new' : 'edit';
+            var textId = getRandom('texxt');
+            var btnId = getRandom('btn');
+
+            var panel = new Panel(this, {
+                width: 500,
+                // 一个 Panel 包含多个 tab
+                tabs: [{
+                    // 标题
+                    title: '插入代码',
+                    // 模板
+                    tpl: '<div>\n                        <textarea id="' + textId + '" style="height:145px;;">' + value + '</textarea>\n                        <div class="w-e-button-container">\n                            <button id="' + btnId + '" class="right">\u63D2\u5165</button>\n                        </div>\n                    <div>',
+                    // 事件绑定
+                    events: [
+                        // 插入代码
+                        {
+                            selector: '#' + btnId,
+                            type: 'click',
+                            fn: function fn() {
+                                var $text = $('#' + textId);
+                                var text = $text.val() || $text.html();
+                                text = replaceHtmlSymbol(text);
+                                if (type === 'new') {
+                                    // 新插入
+                                    _this._insertCode(text);
+                                } else {
+                                    // 编辑更新
+                                    _this._updateCode(text);
+                                }
+
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true;
+                            }
+                        }]
+                } // first tab end
+                ] // tabs end
+            }); // new Panel end
+
+            // 显示 panel
+            panel.show();
+
+            // 记录属性
+            this.panel = panel;
+        },
+
+        // 插入代码
+        _insertCode: function _insertCode(value) {
+            var editor = this.editor;
+            editor.cmd.do('insertHTML', '<pre><code>' + value + '</code></pre><p><br></p>');
+        },
+
+        // 更新代码
+        _updateCode: function _updateCode(value) {
+            var editor = this.editor;
+            var $selectionELem = editor.selection.getSelectionContainerElem();
+            if (!$selectionELem) {
+                return;
+            }
+            $selectionELem.html(value);
+            editor.selection.restoreSelection();
+        },
+
+        // 试图改变 active 状态
+        tryChangeActive: function tryChangeActive(e) {
+            var editor = this.editor;
+            var $elem = this.$elem;
+            var $selectionELem = editor.selection.getSelectionContainerElem();
+            if (!$selectionELem) {
+                return;
+            }
+            var $parentElem = $selectionELem.parent();
+            if ($selectionELem.getNodeName() === 'CODE' && $parentElem.getNodeName() === 'PRE') {
+                this._active = true;
+                $elem.addClass('w-e-active');
+            } else {
+                this._active = false;
+                $elem.removeClass('w-e-active');
+            }
+        }
+    };
+
+    /*
+     menu - emoticon
+     */
+// 构造函数
+    function Emoticon(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-happy"><i/>\n        </div>');
+        this.type = 'panel';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Emoticon.prototype = {
+        constructor: Emoticon,
+
+        onClick: function onClick() {
+            this._createPanel();
+        },
+
+        _createPanel: function _createPanel() {
+            var _this = this;
+
+            // 拼接表情字符串
+            var faceHtml = '';
+            var faceStr = '😀 😃 😄 😁 😆 😅 😂  😊 😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 😜 😝 😛 🤑 🤗 🤓 😎 😏 😒 😞 😔 😟 😕 🙁  😣 😖 😫 😩 😤 😠 😡 😶 😐 😑 😯 😦 😧 😮 😲 😵 😳 😱 😨 😰 😢 😥 😭 😓 😪 😴 🙄 🤔 😬 🤐';
+            faceStr.split(/\s/).forEach(function (item) {
+                if (item) {
+                    faceHtml += '<span class="w-e-item">' + item + '</span>';
+                }
+            });
+
+            var handHtml = '';
+            var handStr = '🙌 👏 👋 👍 👎 👊 ✊ ️👌 ✋ 👐 💪 🙏 ️👆 👇 👈 👉 🖕 🖐 🤘 🖖';
+            handStr.split(/\s/).forEach(function (item) {
+                if (item) {
+                    handHtml += '<span class="w-e-item">' + item + '</span>';
+                }
+            });
+
+            var panel = new Panel(this, {
+                width: 300,
+                height: 200,
+                // 一个 Panel 包含多个 tab
+                tabs: [{
+                    // 标题
+                    title: '表情',
+                    // 模板
+                    tpl: '<div class="w-e-emoticon-container">' + faceHtml + '</div>',
+                    // 事件绑定
+                    events: [{
+                        selector: 'span.w-e-item',
+                        type: 'click',
+                        fn: function fn(e) {
+                            var target = e.target;
+                            _this._insert(target.innerHTML);
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true;
+                        }
+                    }]
+                }, // first tab end
+                    {
+                        // 标题
+                        title: '手势',
+                        // 模板
+                        tpl: '<div class="w-e-emoticon-container">' + handHtml + '</div>',
+                        // 事件绑定
+                        events: [{
+                            selector: 'span.w-e-item',
+                            type: 'click',
+                            fn: function fn(e) {
+                                var target = e.target;
+                                _this._insert(target.innerHTML);
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true;
+                            }
+                        }]
+                    } // second tab end
+                ] // tabs end
+            });
+
+            // 显示 panel
+            panel.show();
+
+            // 记录属性
+            this.panel = panel;
+        },
+
+        // 插入表情
+        _insert: function _insert(emoji) {
+            var editor = this.editor;
+            editor.cmd.do('insertHTML', '<span>' + emoji + '</span>');
+        }
+    };
+
+    /*
+     menu - table
+     */
+// 构造函数
+    function Table(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-table2"><i/></div>');
+        this.type = 'panel';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Table.prototype = {
+        constructor: Table,
+
+        onClick: function onClick() {
+            if (this._active) {
+                // 编辑现有表格
+                this._createEditPanel();
+            } else {
+                // 插入新表格
+                this._createInsertPanel();
+            }
+        },
+
+        // 创建插入新表格的 panel
+        _createInsertPanel: function _createInsertPanel() {
+            var _this = this;
+
+            // 用到的 id
+            var btnInsertId = getRandom('btn');
+            var textRowNum = getRandom('row');
+            var textColNum = getRandom('col');
+
+            var panel = new Panel(this, {
+                width: 250,
+                // panel 包含多个 tab
+                tabs: [{
+                    // 标题
+                    title: '插入表格',
+                    // 模板
+                    tpl: '<div>\n                        <p style="text-align:left; padding:5px 0;">\n                            \u521B\u5EFA\n                            <input id="' + textRowNum + '" type="text" value="5" style="width:40px;text-align:center;"/>\n                            \u884C\n                            <input id="' + textColNum + '" type="text" value="5" style="width:40px;text-align:center;"/>\n                            \u5217\u7684\u8868\u683C\n                        </p>\n                        <div class="w-e-button-container">\n                            <button id="' + btnInsertId + '" class="right">\u63D2\u5165</button>\n                        </div>\n                    </div>',
+                    // 事件绑定
+                    events: [{
+                        // 点击按钮,插入表格
+                        selector: '#' + btnInsertId,
+                        type: 'click',
+                        fn: function fn() {
+                            var rowNum = parseInt($('#' + textRowNum).val());
+                            var colNum = parseInt($('#' + textColNum).val());
+
+                            if (rowNum && colNum && rowNum > 0 && colNum > 0) {
+                                // form 数据有效
+                                _this._insert(rowNum, colNum);
+                            }
+
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true;
+                        }
+                    }]
+                } // first tab end
+                ] // tabs end
+            }); // panel end
+
+            // 展示 panel
+            panel.show();
+
+            // 记录属性
+            this.panel = panel;
+        },
+
+        // 插入表格
+        _insert: function _insert(rowNum, colNum) {
+            // 拼接 table 模板
+            var r = void 0,
+                c = void 0;
+            var html = '<table border="0" width="100%" cellpadding="0" cellspacing="0">';
+            for (r = 0; r < rowNum; r++) {
+                html += '<tr>';
+                if (r === 0) {
+                    for (c = 0; c < colNum; c++) {
+                        html += '<th>&nbsp;</th>';
+                    }
+                } else {
+                    for (c = 0; c < colNum; c++) {
+                        html += '<td>&nbsp;</td>';
+                    }
+                }
+                html += '</tr>';
+            }
+            html += '</table><p><br></p>';
+
+            // 执行命令
+            var editor = this.editor;
+            editor.cmd.do('insertHTML', html);
+
+            // 防止 firefox 下出现 resize 的控制点
+            editor.cmd.do('enableObjectResizing', false);
+            editor.cmd.do('enableInlineTableEditing', false);
+        },
+
+        // 创建编辑表格的 panel
+        _createEditPanel: function _createEditPanel() {
+            var _this2 = this;
+
+            // 可用的 id
+            var addRowBtnId = getRandom('add-row');
+            var addColBtnId = getRandom('add-col');
+            var delRowBtnId = getRandom('del-row');
+            var delColBtnId = getRandom('del-col');
+            var delTableBtnId = getRandom('del-table');
+
+            // 创建 panel 对象
+            var panel = new Panel(this, {
+                width: 320,
+                // panel 包含多个 tab
+                tabs: [{
+                    // 标题
+                    title: '编辑表格',
+                    // 模板
+                    tpl: '<div>\n                        <div class="w-e-button-container" style="border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;">\n                            <button id="' + addRowBtnId + '" class="left">\u589E\u52A0\u884C</button>\n                            <button id="' + delRowBtnId + '" class="red left">\u5220\u9664\u884C</button>\n                            <button id="' + addColBtnId + '" class="left">\u589E\u52A0\u5217</button>\n                            <button id="' + delColBtnId + '" class="red left">\u5220\u9664\u5217</button>\n                        </div>\n                        <div class="w-e-button-container">\n                            <button id="' + delTableBtnId + '" class="gray left">\u5220\u9664\u8868\u683C</button>\n                        </dv>\n                    </div>',
+                    // 事件绑定
+                    events: [{
+                        // 增加行
+                        selector: '#' + addRowBtnId,
+                        type: 'click',
+                        fn: function fn() {
+                            _this2._addRow();
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true;
+                        }
+                    }, {
+                        // 增加列
+                        selector: '#' + addColBtnId,
+                        type: 'click',
+                        fn: function fn() {
+                            _this2._addCol();
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true;
+                        }
+                    }, {
+                        // 删除行
+                        selector: '#' + delRowBtnId,
+                        type: 'click',
+                        fn: function fn() {
+                            _this2._delRow();
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true;
+                        }
+                    }, {
+                        // 删除列
+                        selector: '#' + delColBtnId,
+                        type: 'click',
+                        fn: function fn() {
+                            _this2._delCol();
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true;
+                        }
+                    }, {
+                        // 删除表格
+                        selector: '#' + delTableBtnId,
+                        type: 'click',
+                        fn: function fn() {
+                            _this2._delTable();
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true;
+                        }
+                    }]
+                }]
+            });
+            // 显示 panel
+            panel.show();
+        },
+
+        // 获取选中的单元格的位置信息
+        _getLocationData: function _getLocationData() {
+            var result = {};
+            var editor = this.editor;
+            var $selectionELem = editor.selection.getSelectionContainerElem();
+            if (!$selectionELem) {
+                return;
+            }
+            var nodeName = $selectionELem.getNodeName();
+            if (nodeName !== 'TD' && nodeName !== 'TH') {
+                return;
+            }
+
+            // 获取 td index
+            var $tr = $selectionELem.parent();
+            var $tds = $tr.children();
+            var tdLength = $tds.length;
+            $tds.forEach(function (td, index) {
+                if (td === $selectionELem[0]) {
+                    // 记录并跳出循环
+                    result.td = {
+                        index: index,
+                        elem: td,
+                        length: tdLength
+                    };
+                    return false;
+                }
+            });
+
+            // 获取 tr index
+            var $tbody = $tr.parent();
+            var $trs = $tbody.children();
+            var trLength = $trs.length;
+            $trs.forEach(function (tr, index) {
+                if (tr === $tr[0]) {
+                    // 记录并跳出循环
+                    result.tr = {
+                        index: index,
+                        elem: tr,
+                        length: trLength
+                    };
+                    return false;
+                }
+            });
+
+            // 返回结果
+            return result;
+        },
+
+        // 增加行
+        _addRow: function _addRow() {
+            // 获取当前单元格的位置信息
+            var locationData = this._getLocationData();
+            if (!locationData) {
+                return;
+            }
+            var trData = locationData.tr;
+            var $currentTr = $(trData.elem);
+            var tdData = locationData.td;
+            var tdLength = tdData.length;
+
+            // 拼接即将插入的字符串
+            var newTr = document.createElement('tr');
+            var tpl = '',
+                i = void 0;
+            for (i = 0; i < tdLength; i++) {
+                tpl += '<td>&nbsp;</td>';
+            }
+            newTr.innerHTML = tpl;
+            // 插入
+            $(newTr).insertAfter($currentTr);
+        },
+
+        // 增加列
+        _addCol: function _addCol() {
+            // 获取当前单元格的位置信息
+            var locationData = this._getLocationData();
+            if (!locationData) {
+                return;
+            }
+            var trData = locationData.tr;
+            var tdData = locationData.td;
+            var tdIndex = tdData.index;
+            var $currentTr = $(trData.elem);
+            var $trParent = $currentTr.parent();
+            var $trs = $trParent.children();
+
+            // 遍历所有行
+            $trs.forEach(function (tr) {
+                var $tr = $(tr);
+                var $tds = $tr.children();
+                var $currentTd = $tds.get(tdIndex);
+                var name = $currentTd.getNodeName().toLowerCase();
+
+                // new 一个 td,并插入
+                var newTd = document.createElement(name);
+                $(newTd).insertAfter($currentTd);
+            });
+        },
+
+        // 删除行
+        _delRow: function _delRow() {
+            // 获取当前单元格的位置信息
+            var locationData = this._getLocationData();
+            if (!locationData) {
+                return;
+            }
+            var trData = locationData.tr;
+            var $currentTr = $(trData.elem);
+            $currentTr.remove();
+        },
+
+        // 删除列
+        _delCol: function _delCol() {
+            // 获取当前单元格的位置信息
+            var locationData = this._getLocationData();
+            if (!locationData) {
+                return;
+            }
+            var trData = locationData.tr;
+            var tdData = locationData.td;
+            var tdIndex = tdData.index;
+            var $currentTr = $(trData.elem);
+            var $trParent = $currentTr.parent();
+            var $trs = $trParent.children();
+
+            // 遍历所有行
+            $trs.forEach(function (tr) {
+                var $tr = $(tr);
+                var $tds = $tr.children();
+                var $currentTd = $tds.get(tdIndex);
+                // 删除
+                $currentTd.remove();
+            });
+        },
+
+        // 删除表格
+        _delTable: function _delTable() {
+            var editor = this.editor;
+            var $selectionELem = editor.selection.getSelectionContainerElem();
+            if (!$selectionELem) {
+                return;
+            }
+            var $table = $selectionELem.parentUntil('table');
+            if (!$table) {
+                return;
+            }
+            $table.remove();
+        },
+
+        // 试图改变 active 状态
+        tryChangeActive: function tryChangeActive(e) {
+            var editor = this.editor;
+            var $elem = this.$elem;
+            var $selectionELem = editor.selection.getSelectionContainerElem();
+            if (!$selectionELem) {
+                return;
+            }
+            var nodeName = $selectionELem.getNodeName();
+            if (nodeName === 'TD' || nodeName === 'TH') {
+                this._active = true;
+                $elem.addClass('w-e-active');
+            } else {
+                this._active = false;
+                $elem.removeClass('w-e-active');
+            }
+        }
+    };
+
+    /*
+     menu - video
+     */
+// 构造函数
+    function Video(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-play"><i/></div>');
+        this.type = 'panel';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Video.prototype = {
+        constructor: Video,
+
+        onClick: function onClick() {
+            this._createPanel();
+        },
+
+        _createPanel: function _createPanel() {
+            var _this = this;
+
+            // 创建 id
+            var textValId = getRandom('text-val');
+            var btnId = getRandom('btn');
+
+            // 创建 panel
+            var panel = new Panel(this, {
+                width: 350,
+                // 一个 panel 多个 tab
+                tabs: [{
+                    // 标题
+                    title: '插入视频',
+                    // 模板
+                    tpl: '<div>\n                        <input id="' + textValId + '" type="text" class="block" placeholder="\u683C\u5F0F\u5982\uFF1A<iframe src=... ></iframe>"/>\n                        <div class="w-e-button-container">\n                            <button id="' + btnId + '" class="right">\u63D2\u5165</button>\n                        </div>\n                    </div>',
+                    // 事件绑定
+                    events: [{
+                        selector: '#' + btnId,
+                        type: 'click',
+                        fn: function fn() {
+                            var $text = $('#' + textValId);
+                            var val = $text.val().trim();
+
+                            // 测试用视频地址
+                            // <iframe height=498 width=510 src='http://player.youku.com/embed/XMjcwMzc3MzM3Mg==' frameborder=0 'allowfullscreen'></iframe>
+
+                            if (val) {
+                                // 插入视频
+                                _this._insert(val);
+                            }
+
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true;
+                        }
+                    }]
+                } // first tab end
+                ] // tabs end
+            }); // panel end
+
+            // 显示 panel
+            panel.show();
+
+            // 记录属性
+            this.panel = panel;
+        },
+
+        // 插入视频
+        _insert: function _insert(val) {
+            var editor = this.editor;
+            editor.cmd.do('insertHTML', val + '<p><br></p>');
+        }
+    };
+
+    /*
+     menu - img
+     */
+// 构造函数
+    function Image(editor) {
+        this.editor = editor;
+        this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-image"><i/></div>');
+        this.type = 'panel';
+
+        // 当前是否 active 状态
+        this._active = false;
+    }
+
+// 原型
+    Image.prototype = {
+        constructor: Image,
+
+        onClick: function onClick() {
+            if (this._active) {
+                this._createEditPanel();
+            } else {
+                this._createInsertPanel();
+            }
+        },
+
+        _createEditPanel: function _createEditPanel() {
+            var editor = this.editor;
+
+            // id
+            var width30 = getRandom('width-30');
+            var width50 = getRandom('width-50');
+            var width100 = getRandom('width-100');
+            var delBtn = getRandom('del-btn');
+
+            // tab 配置
+            var tabsConfig = [{
+                title: '编辑图片',
+                tpl: '<div>\n                    <div class="w-e-button-container" style="border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;">\n                        <span style="float:left;font-size:14px;margin:4px 5px 0 5px;color:#333;">\u6700\u5927\u5BBD\u5EA6\uFF1A</span>\n                        <button id="' + width30 + '" class="left">30%</button>\n                        <button id="' + width50 + '" class="left">50%</button>\n                        <button id="' + width100 + '" class="left">100%</button>\n                    </div>\n                    <div class="w-e-button-container">\n                        <button id="' + delBtn + '" class="gray left">\u5220\u9664\u56FE\u7247</button>\n                    </dv>\n                </div>',
+                events: [{
+                    selector: '#' + width30,
+                    type: 'click',
+                    fn: function fn() {
+                        var $img = editor._selectedImg;
+                        if ($img) {
+                            $img.css('max-width', '30%');
+                        }
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }, {
+                    selector: '#' + width50,
+                    type: 'click',
+                    fn: function fn() {
+                        var $img = editor._selectedImg;
+                        if ($img) {
+                            $img.css('max-width', '50%');
+                        }
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }, {
+                    selector: '#' + width100,
+                    type: 'click',
+                    fn: function fn() {
+                        var $img = editor._selectedImg;
+                        if ($img) {
+                            $img.css('max-width', '100%');
+                        }
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }, {
+                    selector: '#' + delBtn,
+                    type: 'click',
+                    fn: function fn() {
+                        var $img = editor._selectedImg;
+                        if ($img) {
+                            $img.remove();
+                        }
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }]
+            }];
+
+            // 创建 panel 并显示
+            var panel = new Panel(this, {
+                width: 300,
+                tabs: tabsConfig
+            });
+            panel.show();
+
+            // 记录属性
+            this.panel = panel;
+        },
+
+        _createInsertPanel: function _createInsertPanel() {
+            var editor = this.editor;
+            var uploadImg = editor.uploadImg;
+            var config = editor.config;
+
+            // id
+            var upTriggerId = getRandom('up-trigger');
+            var upFileId = getRandom('up-file');
+            var linkUrlId = getRandom('link-url');
+            var linkBtnId = getRandom('link-btn');
+
+            // tabs 的配置
+            var tabsConfig = [{
+                title: '上传图片',
+                tpl: '<div class="w-e-up-img-container">\n                    <div id="' + upTriggerId + '" class="w-e-up-btn">\n                        <i class="w-e-icon-upload2"></i>\n                    </div>\n                    <div style="display:none;">\n                        <input id="' + upFileId + '" type="file" multiple="multiple" accept="image/jpg,image/jpeg,image/png,image/gif,image/bmp"/>\n                    </div>\n                </div>',
+                events: [{
+                    // 触发选择图片
+                    selector: '#' + upTriggerId,
+                    type: 'click',
+                    fn: function fn() {
+                        var $file = $('#' + upFileId);
+                        var fileElem = $file[0];
+                        if (fileElem) {
+                            fileElem.click();
+                        } else {
+                            // 返回 true 可关闭 panel
+                            return true;
+                        }
+                    }
+                }, {
+                    // 选择图片完毕
+                    selector: '#' + upFileId,
+                    type: 'change',
+                    fn: function fn() {
+                        var $file = $('#' + upFileId);
+                        var fileElem = $file[0];
+                        if (!fileElem) {
+                            // 返回 true 可关闭 panel
+                            return true;
+                        }
+
+                        // 获取选中的 file 对象列表
+                        var fileList = fileElem.files;
+                        if (fileList.length) {
+                            uploadImg.uploadImg(fileList);
+                        }
+
+                        // 返回 true 可关闭 panel
+                        return true;
+                    }
+                }]
+            }, // first tab end
+                {
+                    title: '网络图片',
+                    tpl: '<div>\n                    <input id="' + linkUrlId + '" type="text" class="block" placeholder="\u56FE\u7247\u94FE\u63A5"/></td>\n                    <div class="w-e-button-container">\n                        <button id="' + linkBtnId + '" class="right">\u63D2\u5165</button>\n                    </div>\n                </div>',
+                    events: [{
+                        selector: '#' + linkBtnId,
+                        type: 'click',
+                        fn: function fn() {
+                            var $linkUrl = $('#' + linkUrlId);
+                            var url = $linkUrl.val().trim();
+
+                            if (url) {
+                                uploadImg.insertLinkImg(url);
+                            }
+
+                            // 返回 true 表示函数执行结束之后关闭 panel
+                            return true;
+                        }
+                    }]
+                } // second tab end
+            ]; // tabs end
+
+            // 判断 tabs 的显示
+            var tabsConfigResult = [];
+            if ((config.uploadImgShowBase64 || config.uploadImgServer) && window.FileReader) {
+                // 显示“上传图片”
+                tabsConfigResult.push(tabsConfig[0]);
+            }
+            if (config.showLinkImg) {
+                // 显示“网络图片”
+                tabsConfigResult.push(tabsConfig[1]);
+            }
+
+            // 创建 panel 并显示
+            var panel = new Panel(this, {
+                width: 300,
+                tabs: tabsConfigResult
+            });
+            panel.show();
+
+            // 记录属性
+            this.panel = panel;
+        },
+
+        // 试图改变 active 状态
+        tryChangeActive: function tryChangeActive(e) {
+            var editor = this.editor;
+            var $elem = this.$elem;
+            if (editor._selectedImg) {
+                this._active = true;
+                $elem.addClass('w-e-active');
+            } else {
+                this._active = false;
+                $elem.removeClass('w-e-active');
+            }
+        }
+    };
+
+    /*
+     所有菜单的汇总
+     */
+
+// 存储菜单的构造函数
+    var MenuConstructors = {};
+
+    MenuConstructors.bold = Bold;
+
+    MenuConstructors.head = Head;
+
+    MenuConstructors.link = Link;
+
+    MenuConstructors.italic = Italic;
+
+    MenuConstructors.redo = Redo;
+
+    MenuConstructors.strikeThrough = StrikeThrough;
+
+    MenuConstructors.underline = Underline;
+
+    MenuConstructors.undo = Undo;
+
+    MenuConstructors.list = List;
+
+    MenuConstructors.justify = Justify;
+
+    MenuConstructors.foreColor = BackColor;
+
+    MenuConstructors.backColor = ForeColor$1;
+
+    MenuConstructors.quote = Quote;
+
+    MenuConstructors.code = Code;
+
+    MenuConstructors.emoticon = Emoticon;
+
+    MenuConstructors.table = Table;
+
+    MenuConstructors.video = Video;
+
+    MenuConstructors.image = Image;
+
+    /*
+     菜单集合
+     */
+// 构造函数
+    function Menus(editor) {
+        this.editor = editor;
+        this.menus = {};
+    }
+
+// 修改原型
+    Menus.prototype = {
+        constructor: Menus,
+
+        // 初始化菜单
+        init: function init() {
+            var _this = this;
+
+            var editor = this.editor;
+            var config = editor.config || {};
+            var configMenus = config.menus || []; // 获取配置中的菜单
+
+            // 根据配置信息,创建菜单
+            configMenus.forEach(function (menuKey) {
+                var MenuConstructor = MenuConstructors[menuKey];
+                if (MenuConstructor && typeof MenuConstructor === 'function') {
+                    // 创建单个菜单
+                    _this.menus[menuKey] = new MenuConstructor(editor);
+                }
+            });
+
+            // 添加到菜单栏
+            this._addToToolbar();
+
+            // 绑定事件
+            this._bindEvent();
+        },
+
+        // 添加到菜单栏
+        _addToToolbar: function _addToToolbar() {
+            var editor = this.editor;
+            var $toolbarElem = editor.$toolbarElem;
+            var menus = this.menus;
+            objForEach(menus, function (key, menu) {
+                var $elem = menu.$elem;
+                if ($elem) {
+                    $toolbarElem.append($elem);
+                }
+            });
+        },
+
+        // 绑定菜单 click mouseenter 事件
+        _bindEvent: function _bindEvent() {
+            var menus = this.menus;
+            var editor = this.editor;
+            objForEach(menus, function (key, menu) {
+                var type = menu.type;
+                if (!type) {
+                    return;
+                }
+                var $elem = menu.$elem;
+                var droplist = menu.droplist;
+                var panel = menu.panel;
+
+                // 点击类型,例如 bold
+                if (type === 'click' && menu.onClick) {
+                    $elem.on('click', function (e) {
+                        if (editor.selection.getRange() == null) {
+                            return;
+                        }
+                        menu.onClick(e);
+                    });
+                }
+
+                // 下拉框,例如 head
+                if (type === 'droplist' && droplist) {
+                    $elem.on('mouseenter', function (e) {
+                        if (editor.selection.getRange() == null) {
+                            return;
+                        }
+                        // 显示
+                        droplist.showTimeoutId = setTimeout(function () {
+                            droplist.show();
+                        }, 200);
+                    }).on('mouseleave', function (e) {
+                        // 隐藏
+                        droplist.hideTimeoutId = setTimeout(function () {
+                            droplist.hide();
+                        }, 0);
+                    });
+                }
+
+                // 弹框类型,例如 link
+                if (type === 'panel' && menu.onClick) {
+                    $elem.on('click', function (e) {
+                        e.stopPropagation();
+                        if (editor.selection.getRange() == null) {
+                            return;
+                        }
+                        // 在自定义事件中显示 panel
+                        menu.onClick(e);
+                    });
+                }
+            });
+        },
+
+        // 尝试修改菜单状态
+        changeActive: function changeActive() {
+            var menus = this.menus;
+            objForEach(menus, function (key, menu) {
+                if (menu.tryChangeActive) {
+                    setTimeout(function () {
+                        menu.tryChangeActive();
+                    }, 100);
+                }
+            });
+        }
+    };
+
+    /*
+     粘贴信息的处理
+     */
+
+// 获取粘贴的纯文本
+    function getPasteText(e) {
+        var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData;
+        var pasteText = void 0;
+        if (clipboardData == null) {
+            pasteText = window.clipboardData && window.clipboardData.getData('text');
+        } else {
+            pasteText = clipboardData.getData('text/plain');
+        }
+
+        return replaceHtmlSymbol(pasteText);
+    }
+
+// 获取粘贴的html
+    function getPasteHtml(e) {
+        var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData;
+        var pasteText = void 0,
+            pasteHtml = void 0;
+        if (clipboardData == null) {
+            pasteText = window.clipboardData && window.clipboardData.getData('text');
+        } else {
+            pasteText = clipboardData.getData('text/plain');
+            pasteHtml = clipboardData.getData('text/html');
+        }
+        if (!pasteHtml && pasteText) {
+            pasteHtml = '<p>' + replaceHtmlSymbol(pasteText) + '</p>';
+        }
+        if (!pasteHtml) {
+            return;
+        }
+
+        // 过滤word中状态过来的无用字符
+        var docSplitHtml = pasteHtml.split('</html>');
+        if (docSplitHtml.length === 2) {
+            pasteHtml = docSplitHtml[0];
+        }
+
+        // 过滤无用标签
+        pasteHtml = pasteHtml.replace(/<(meta|script|link).+?>/igm, '');
+
+        // 过滤样式
+        pasteHtml = pasteHtml.replace(/\s?(class|style)=('|").+?('|")/igm, '');
+
+        return pasteHtml;
+    }
+
+// 获取粘贴的图片文件
+    function getPasteImgs(e) {
+        var result = [];
+        var txt = getPasteText(e);
+        if (txt) {
+            // 有文字,就忽略图片
+            return result;
+        }
+
+        var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData || {};
+        var items = clipboardData.items;
+        if (!items) {
+            return result;
+        }
+
+        objForEach(items, function (key, value) {
+            var type = value.type;
+            if (/image/i.test(type)) {
+                result.push(value.getAsFile());
+            }
+        });
+
+        return result;
+    }
+
+    /*
+     编辑区域
+     */
+
+// 构造函数
+    function Text(editor) {
+        this.editor = editor;
+    }
+
+// 修改原型
+    Text.prototype = {
+        constructor: Text,
+
+        // 初始化
+        init: function init() {
+            // 绑定事件
+            this._bindEvent();
+        },
+
+        // 清空内容
+        clear: function clear() {
+            this.html('<p><br></p>');
+        },
+
+        // 获取 设置 html
+        html: function html(val) {
+            var editor = this.editor;
+            var $textElem = editor.$textElem;
+            if (val == null) {
+                return $textElem.html();
+            } else {
+                $textElem.html(val);
+
+                // 初始化选取,将光标定位到内容尾部
+                editor.initSelection();
+            }
+        },
+
+        // 获取 设置 text
+        text: function text(val) {
+            var editor = this.editor;
+            var $textElem = editor.$textElem;
+            if (val == null) {
+                return $textElem.text();
+            } else {
+                $textElem.text('<p>' + val + '</p>');
+
+                // 初始化选取,将光标定位到内容尾部
+                editor.initSelection();
+            }
+        },
+
+        // 追加内容
+        append: function append(html) {
+            var editor = this.editor;
+            var $textElem = editor.$textElem;
+            $textElem.append($(html));
+
+            // 初始化选取,将光标定位到内容尾部
+            editor.initSelection();
+        },
+
+        // 绑定事件
+        _bindEvent: function _bindEvent() {
+            // 实时保存选取
+            this._saveRangeRealTime();
+
+            // 按回车建时的特殊处理
+            this._enterKeyHandle();
+
+            // 清空时保留 <p><br></p>
+            this._clearHandle();
+
+            // 粘贴事件(粘贴文字,粘贴图片)
+            this._pasteHandle();
+
+            // tab 特殊处理
+            this._tabHandle();
+
+            // img 点击
+            this._imgHandle();
+        },
+
+        // 实时保存选取
+        _saveRangeRealTime: function _saveRangeRealTime() {
+            var editor = this.editor;
+            var $textElem = editor.$textElem;
+
+            // 保存当前的选区
+            function saveRange(e) {
+                // 随时保存选区
+                editor.selection.saveRange();
+                // 更新按钮 ative 状态
+                editor.menus.changeActive();
+            }
+            // 按键后保存
+            $textElem.on('keyup', saveRange);
+            $textElem.on('mousedown', function (e) {
+                // mousedown 状态下,鼠标滑动到编辑区域外面,也需要保存选区
+                $textElem.on('mouseleave', saveRange);
+            });
+            $textElem.on('mouseup', function (e) {
+                saveRange();
+                // 在编辑器区域之内完成点击,取消鼠标滑动到编辑区外面的事件
+                $textElem.off('mouseleave', saveRange);
+            });
+        },
+
+        // 按回车键时的特殊处理
+        _enterKeyHandle: function _enterKeyHandle() {
+            var editor = this.editor;
+            var $textElem = editor.$textElem;
+
+            // 将回车之后生成的非 <p> 的顶级标签,改为 <p>
+            function pHandle(e) {
+                var $selectionElem = editor.selection.getSelectionContainerElem();
+                var $parentElem = $selectionElem.parent();
+                if (!$parentElem.equal($textElem)) {
+                    // 不是顶级标签
+                    return;
+                }
+                var nodeName = $selectionElem.getNodeName();
+                if (nodeName === 'P') {
+                    // 当前的标签是 P ,不用做处理
+                    return;
+                }
+
+                if ($selectionElem.text()) {
+                    // 有内容,不做处理
+                    return;
+                }
+
+                // 插入 <p> ,并将选取定位到 <p>,删除当前标签
+                var $p = $('<p><br></p>');
+                $p.insertBefore($selectionElem);
+                editor.selection.createRangeByElem($p, true);
+                editor.selection.restoreSelection();
+                $selectionElem.remove();
+            }
+
+            $textElem.on('keyup', function (e) {
+                if (e.keyCode !== 13) {
+                    // 不是回车键
+                    return;
+                }
+                // 将回车之后生成的非 <p> 的顶级标签,改为 <p>
+                pHandle(e);
+            });
+
+            // <pre><code></code></pre> 回车时 特殊处理
+            function codeHandle(e) {
+                var $selectionElem = editor.selection.getSelectionContainerElem();
+                if (!$selectionElem) {
+                    return;
+                }
+                var $parentElem = $selectionElem.parent();
+                var selectionNodeName = $selectionElem.getNodeName();
+                var parentNodeName = $parentElem.getNodeName();
+
+                if (selectionNodeName !== 'CODE' || parentNodeName !== 'PRE') {
+                    // 不符合要求 忽略
+                    return;
+                }
+
+                if (!editor.cmd.queryCommandSupported('insertHTML')) {
+                    // 必须原生支持 insertHTML 命令
+                    return;
+                }
+
+                var _startOffset = editor.selection.getRange().startOffset;
+                editor.cmd.do('insertHTML', '\n');
+                editor.selection.saveRange();
+                if (editor.selection.getRange().startOffset === _startOffset) {
+                    // 没起作用,再来一遍
+                    editor.cmd.do('insertHTML', '\n');
+                }
+
+                // 阻止默认行为
+                e.preventDefault();
+            }
+
+            $textElem.on('keydown', function (e) {
+                if (e.keyCode !== 13) {
+                    // 不是回车键
+                    return;
+                }
+                // <pre><code></code></pre> 回车时 特殊处理
+                codeHandle(e);
+            });
+        },
+
+        // 清空时保留 <p><br></p>
+        _clearHandle: function _clearHandle() {
+            var editor = this.editor;
+            var $textElem = editor.$textElem;
+
+            $textElem.on('keydown', function (e) {
+                if (e.keyCode !== 8) {
+                    return;
+                }
+                var txtHtml = $textElem.html().toLowerCase().trim();
+                if (txtHtml === '<p><br></p>') {
+                    // 最后剩下一个空行,就不再删除了
+                    e.preventDefault();
+                    return;
+                }
+            });
+
+            $textElem.on('keyup', function (e) {
+                if (e.keyCode !== 8) {
+                    return;
+                }
+                var $p = void 0;
+                var txtHtml = $textElem.html().toLowerCase().trim();
+
+                // firefox 时用 txtHtml === '<br>' 判断,其他用 !txtHtml 判断
+                if (!txtHtml || txtHtml === '<br>') {
+                    // 内容空了
+                    $p = $('<p><br/></p>');
+                    $textElem.html(''); // 一定要先清空,否则在 firefox 下有问题
+                    $textElem.append($p);
+                    editor.selection.createRangeByElem($p, false, true);
+                    editor.selection.restoreSelection();
+                }
+            });
+        },
+
+        // 粘贴事件(粘贴文字 粘贴图片)
+        _pasteHandle: function _pasteHandle() {
+            var editor = this.editor;
+            var $textElem = editor.$textElem;
+
+            // 粘贴文字
+            $textElem.on('paste', function (e) {
+                if (UA.isIE()) {
+                    // IE 下放弃下面的判断
+                    return;
+                }
+
+                // 阻止默认行为,使用 execCommand 的粘贴命令
+                e.preventDefault();
+
+                // 获取粘贴的文字
+                var pasteHtml = getPasteHtml(e);
+                var pasteText = getPasteText(e);
+                pasteText = pasteText.replace(/\n/gm, '<br>');
+
+                var $selectionElem = editor.selection.getSelectionContainerElem();
+                if (!$selectionElem) {
+                    return;
+                }
+                var nodeName = $selectionElem.getNodeName();
+
+                // code 中粘贴忽略
+                if (nodeName === 'CODE' || nodeName === 'PRE') {
+                    return;
+                }
+
+                // 表格中忽略,可能会出现异常问题
+                if (nodeName === 'TD' || nodeName === 'TH') {
+                    return;
+                }
+
+                if (nodeName === 'DIV' || $textElem.html() === '<p><br></p>') {
+                    // 是 div,可粘贴过滤样式的文字和链接
+                    if (!pasteHtml) {
+                        return;
+                    }
+                    try {
+                        // firefox 中,获取的 pasteHtml 可能是没有 <ul> 包裹的 <li>
+                        // 因此执行 insertHTML 会报错
+                        editor.cmd.do('insertHTML', pasteHtml);
+                    } catch (ex) {
+                        // 此时使用 pasteText 来兼容一下
+                        editor.cmd.do('insertHTML', '<p>' + pasteText + '</p>');
+                    }
+                } else {
+                    // 不是 div,证明在已有内容的元素中粘贴,只粘贴纯文本
+                    if (!pasteText) {
+                        return;
+                    }
+                    editor.cmd.do('insertHTML', '<p>' + pasteText + '</p>');
+                }
+            });
+
+            // 粘贴图片
+            $textElem.on('paste', function (e) {
+                e.preventDefault();
+
+                // 获取粘贴的图片
+                var pasteFiles = getPasteImgs(e);
+                if (!pasteFiles || !pasteFiles.length) {
+                    return;
+                }
+
+                // 获取当前的元素
+                var $selectionElem = editor.selection.getSelectionContainerElem();
+                if (!$selectionElem) {
+                    return;
+                }
+                var nodeName = $selectionElem.getNodeName();
+
+                // code 中粘贴忽略
+                if (nodeName === 'CODE' || nodeName === 'PRE') {
+                    return;
+                }
+
+                // 上传图片
+                var uploadImg = editor.uploadImg;
+                uploadImg.uploadImg(pasteFiles);
+            });
+        },
+
+        // tab 特殊处理
+        _tabHandle: function _tabHandle() {
+            var editor = this.editor;
+            var $textElem = editor.$textElem;
+
+            $textElem.on('keydown', function (e) {
+                if (e.keyCode !== 9) {
+                    return;
+                }
+                if (!editor.cmd.queryCommandSupported('insertHTML')) {
+                    // 必须原生支持 insertHTML 命令
+                    return;
+                }
+                var $selectionElem = editor.selection.getSelectionContainerElem();
+                if (!$selectionElem) {
+                    return;
+                }
+                var $parentElem = $selectionElem.parent();
+                var selectionNodeName = $selectionElem.getNodeName();
+                var parentNodeName = $parentElem.getNodeName();
+
+                if (selectionNodeName === 'CODE' && parentNodeName === 'PRE') {
+                    // <pre><code> 里面
+                    editor.cmd.do('insertHTML', '    ');
+                } else {
+                    // 普通文字
+                    editor.cmd.do('insertHTML', '&nbsp;&nbsp;&nbsp;&nbsp;');
+                }
+
+                e.preventDefault();
+            });
+        },
+
+        // img 点击
+        _imgHandle: function _imgHandle() {
+            var editor = this.editor;
+            var $textElem = editor.$textElem;
+            var selectedClass = 'w-e-selected';
+
+            // 为图片增加 selected 样式
+            $textElem.on('click', 'img', function (e) {
+                var img = this;
+                var $img = $(img);
+
+                // 去掉所有图片的 selected 样式
+                $textElem.find('img').removeClass(selectedClass);
+
+                // 为点击的图片增加样式,并记录当前图片
+                $img.addClass(selectedClass);
+                editor._selectedImg = $img;
+
+                // 修改选取
+                editor.selection.createRangeByElem($img);
+            });
+
+            // 去掉图片的 selected 样式
+            $textElem.on('click  keyup', function (e) {
+                if (e.target.matches('img')) {
+                    // 点击的是图片,忽略
+                    return;
+                }
+                // 取消掉 selected 样式,并删除记录
+                $textElem.find('img').removeClass(selectedClass);
+                editor._selectedImg = null;
+            });
+        }
+    };
+
+    /*
+     命令,封装 document.execCommand
+     */
+
+// 构造函数
+    function Command(editor) {
+        this.editor = editor;
+    }
+
+// 修改原型
+    Command.prototype = {
+        constructor: Command,
+
+        // 执行命令
+        do: function _do(name, value) {
+            var editor = this.editor;
+
+            // 如果无选区,忽略
+            if (!editor.selection.getRange()) {
+                return;
+            }
+
+            // 恢复选取
+            editor.selection.restoreSelection();
+
+            // 执行
+            var _name = '_' + name;
+            if (this[_name]) {
+                // 有自定义事件
+                this[_name](value);
+            } else {
+                // 默认 command
+                this._execCommand(name, value);
+            }
+
+            // 修改菜单状态
+            editor.menus.changeActive();
+
+            // 最后,恢复选取保证光标在原来的位置闪烁
+            editor.selection.saveRange();
+            editor.selection.restoreSelection();
+
+            // 触发 onchange
+            editor.change && editor.change();
+        },
+
+        // 自定义 insertHTML 事件
+        _insertHTML: function _insertHTML(html) {
+            var editor = this.editor;
+            var range = editor.selection.getRange();
+
+            // 保证传入的参数是 html 代码
+            var test = /^<.+>$/.test(html);
+            if (!test && !UA.isWebkit()) {
+                // webkit 可以插入非 html 格式的文字
+                throw new Error('执行 insertHTML 命令时传入的参数必须是 html 格式');
+            }
+
+            if (this.queryCommandSupported('insertHTML')) {
+                // W3C
+                this._execCommand('insertHTML', html);
+            } else if (range.insertNode) {
+                // IE
+                range.deleteContents();
+                range.insertNode($(html)[0]);
+            } else if (range.pasteHTML) {
+                // IE <= 10
+                range.pasteHTML(html);
+            }
+        },
+
+        // 插入 elem
+        _insertElem: function _insertElem($elem) {
+            var editor = this.editor;
+            var range = editor.selection.getRange();
+
+            if (range.insertNode) {
+                range.deleteContents();
+                range.insertNode($elem[0]);
+            }
+        },
+
+        // 封装 execCommand
+        _execCommand: function _execCommand(name, value) {
+            document.execCommand(name, false, value);
+        },
+
+        // 封装 document.queryCommandValue
+        queryCommandValue: function queryCommandValue(name) {
+            return document.queryCommandValue(name);
+        },
+
+        // 封装 document.queryCommandState
+        queryCommandState: function queryCommandState(name) {
+            return document.queryCommandState(name);
+        },
+
+        // 封装 document.queryCommandSupported
+        queryCommandSupported: function queryCommandSupported(name) {
+            return document.queryCommandSupported(name);
+        }
+    };
+
+    /*
+     selection range API
+     */
+
+// 构造函数
+    function API(editor) {
+        this.editor = editor;
+        this._currentRange = null;
+    }
+
+// 修改原型
+    API.prototype = {
+        constructor: API,
+
+        // 获取 range 对象
+        getRange: function getRange() {
+            return this._currentRange;
+        },
+
+        // 保存选区
+        saveRange: function saveRange(_range) {
+            if (_range) {
+                // 保存已有选区
+                this._currentRange = _range;
+                return;
+            }
+
+            // 获取当前的选区
+            var selection = window.getSelection();
+            if (selection.rangeCount === 0) {
+                return;
+            }
+            var range = selection.getRangeAt(0);
+
+            // 判断选区内容是否在编辑内容之内
+            var $containerElem = this.getSelectionContainerElem(range);
+            if (!$containerElem) {
+                return;
+            }
+            var editor = this.editor;
+            var $textElem = editor.$textElem;
+            if ($textElem.isContain($containerElem)) {
+                // 是编辑内容之内的
+                this._currentRange = range;
+            }
+        },
+
+        // 折叠选区
+        collapseRange: function collapseRange(toStart) {
+            if (toStart == null) {
+                // 默认为 false
+                toStart = false;
+            }
+            var range = this._currentRange;
+            if (range) {
+                range.collapse(toStart);
+            }
+        },
+
+        // 选中区域的文字
+        getSelectionText: function getSelectionText() {
+            var range = this._currentRange;
+            if (range) {
+                return this._currentRange.toString();
+            } else {
+                return '';
+            }
+        },
+
+        // 选区的 $Elem
+        getSelectionContainerElem: function getSelectionContainerElem(range) {
+            range = range || this._currentRange;
+            var elem = void 0;
+            if (range) {
+                elem = range.commonAncestorContainer;
+                return $(elem.nodeType === 1 ? elem : elem.parentNode);
+            }
+        },
+        getSelectionStartElem: function getSelectionStartElem(range) {
+            range = range || this._currentRange;
+            var elem = void 0;
+            if (range) {
+                elem = range.startContainer;
+                return $(elem.nodeType === 1 ? elem : elem.parentNode);
+            }
+        },
+        getSelectionEndElem: function getSelectionEndElem(range) {
+            range = range || this._currentRange;
+            var elem = void 0;
+            if (range) {
+                elem = range.endContainer;
+                return $(elem.nodeType === 1 ? elem : elem.parentNode);
+            }
+        },
+
+        // 选区是否为空
+        isSelectionEmpty: function isSelectionEmpty() {
+            var range = this._currentRange;
+            if (range && range.startContainer) {
+                if (range.startContainer === range.endContainer) {
+                    if (range.startOffset === range.endOffset) {
+                        return true;
+                    }
+                }
+            }
+            return false;
+        },
+
+        // 恢复选区
+        restoreSelection: function restoreSelection() {
+            var selection = window.getSelection();
+            selection.removeAllRanges();
+            selection.addRange(this._currentRange);
+        },
+
+        // 创建一个空白(即 &#8203 字符)选区
+        createEmptyRange: function createEmptyRange() {
+            var editor = this.editor;
+            var range = this.getRange();
+            var $elem = void 0;
+
+            if (!range) {
+                // 当前无 range
+                return;
+            }
+            if (!this.isSelectionEmpty()) {
+                // 当前选区必须没有内容才可以
+                return;
+            }
+
+            // 目前只支持 webkit 内核
+            if (UA.isWebkit()) {
+                // 插入 &#8203
+                editor.cmd.do('insertHTML', '&#8203;');
+                // 修改 offset 位置
+                range.setEnd(range.endContainer, range.endOffset + 1);
+                // 存储
+                this.saveRange(range);
+            } else {
+                $elem = $('<strong>&#8203;</strong>');
+                editor.cmd.do('insertElem', $elem);
+                this.createRangeByElem($elem, true);
+            }
+        },
+
+        // 根据 $Elem 设置选区
+        createRangeByElem: function createRangeByElem($elem, toStart, isContent) {
+            // $elem - 经过封装的 elem
+            // toStart - true 开始位置,false 结束位置
+            // isContent - 是否选中Elem的内容
+            if (!$elem.length) {
+                return;
+            }
+
+            var elem = $elem[0];
+            var range = document.createRange();
+
+            if (isContent) {
+                range.selectNodeContents(elem);
+            } else {
+                range.selectNode(elem);
+            }
+
+            if (typeof toStart === 'boolean') {
+                range.collapse(toStart);
+            }
+
+            // 存储 range
+            this.saveRange(range);
+        }
+    };
+
+    /*
+     上传进度条
+     */
+
+    function Progress(editor) {
+        this.editor = editor;
+        this._time = 0;
+        this._isShow = false;
+        this._isRender = false;
+        this._timeoutId = 0;
+        this.$textContainer = editor.$textContainerElem;
+        this.$bar = $('<div class="w-e-progress"></div>');
+    }
+
+    Progress.prototype = {
+        constructor: Progress,
+
+        show: function show(progress) {
+            var _this = this;
+
+            // 状态处理
+            if (this._isShow) {
+                return;
+            }
+            this._isShow = true;
+
+            // 渲染
+            var $bar = this.$bar;
+            if (!this._isRender) {
+                var $textContainer = this.$textContainer;
+                $textContainer.append($bar);
+            } else {
+                this._isRender = true;
+            }
+
+            // 改变进度(节流,100ms 渲染一次)
+            if (Date.now() - this._time > 100) {
+                if (progress <= 1) {
+                    $bar.css('width', progress * 100 + '%');
+                    this._time = Date.now();
+                }
+            }
+
+            // 隐藏
+            var timeoutId = this._timeoutId;
+            if (timeoutId) {
+                clearTimeout(timeoutId);
+            }
+            timeoutId = setTimeout(function () {
+                _this._hide();
+            }, 500);
+        },
+
+        _hide: function _hide() {
+            var $bar = this.$bar;
+            $bar.remove();
+
+            // 修改状态
+            this._time = 0;
+            this._isShow = false;
+            this._isRender = false;
+        }
+    };
+
+    var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
+        return typeof obj;
+    } : function (obj) {
+        return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+    };
+
+    /*
+     上传图片
+     */
+
+// 构造函数
+    function UploadImg(editor) {
+        this.editor = editor;
+    }
+
+// 原型
+    UploadImg.prototype = {
+        constructor: UploadImg,
+
+        // 根据 debug 弹出不同的信息
+        _alert: function _alert(alertInfo, debugInfo) {
+            var editor = this.editor;
+            var debug = editor.config.debug;
+
+            if (debug) {
+                throw new Error('wangEditor: ' + (debugInfo || alertInfo));
+            } else {
+                alert(alertInfo);
+            }
+        },
+
+        // 根据链接插入图片
+        insertLinkImg: function insertLinkImg(link) {
+            var _this2 = this;
+
+            if (!link) {
+                return;
+            }
+            var editor = this.editor;
+
+            var img = document.createElement('img');
+            img.onload = function () {
+                img = null;
+                editor.cmd.do('insertHTML', '<img src="' + link + '" style="max-width:100%;"/>');
+            };
+            img.onerror = function () {
+                img = null;
+                // 无法成功下载图片
+                _this2._alert('插入图片错误', 'wangEditor: \u63D2\u5165\u56FE\u7247\u51FA\u9519\uFF0C\u56FE\u7247\u94FE\u63A5\u662F "' + link + '"\uFF0C\u4E0B\u8F7D\u8BE5\u94FE\u63A5\u5931\u8D25');
+                return;
+            };
+            img.onabort = function () {
+                img = null;
+            };
+            img.src = link;
+        },
+
+        // 上传图片
+        uploadImg: function uploadImg(files) {
+            var _this3 = this;
+
+            if (!files || !files.length) {
+                return;
+            }
+
+            // ------------------------------ 获取配置信息 ------------------------------
+            var editor = this.editor;
+            var config = editor.config;
+            var maxSize = config.uploadImgMaxSize;
+            var maxSizeM = maxSize / 1000 / 1000;
+            var maxLength = config.uploadImgMaxLength || 10000;
+            var uploadImgServer = config.uploadImgServer;
+            var uploadImgShowBase64 = config.uploadImgShowBase64;
+            var uploadFileName = config.uploadFileName || '';
+            var uploadImgParams = config.uploadImgParams || {};
+            var uploadImgHeaders = config.uploadImgHeaders || {};
+            var hooks = config.uploadImgHooks || {};
+            var timeout = config.uploadImgTimeout || 3000;
+            var withCredentials = config.withCredentials;
+            if (withCredentials == null) {
+                withCredentials = false;
+            }
+
+            // ------------------------------ 验证文件信息 ------------------------------
+            var resultFiles = [];
+            var errInfo = [];
+            arrForEach(files, function (file) {
+                var name = file.name;
+                var size = file.size;
+                if (/\.(jpg|jpeg|png|bmp|gif)$/i.test(name) === false) {
+                    // 后缀名不合法,不是图片
+                    errInfo.push('\u3010' + name + '\u3011\u4E0D\u662F\u56FE\u7247');
+                    return;
+                }
+                if (maxSize < size) {
+                    // 上传图片过大
+                    errInfo.push('\u3010' + name + '\u3011\u5927\u4E8E ' + maxSizeM + 'M');
+                    return;
+                }
+
+                // 验证通过的加入结果列表
+                resultFiles.push(file);
+            });
+            // 抛出验证信息
+            if (errInfo.length) {
+                this._alert('图片验证未通过: \n' + errInfo.join('\n'));
+                return;
+            }
+            if (resultFiles.length > maxLength) {
+                this._alert('一次最多上传' + maxLength + '张图片');
+                return;
+            }
+
+            // 添加图片数据
+            var formdata = new FormData();
+            arrForEach(resultFiles, function (file) {
+                var name = uploadFileName || file.name;
+                formdata.append(name, file);
+            });
+
+            // ------------------------------ 上传图片 ------------------------------
+            if (uploadImgServer && typeof uploadImgServer === 'string') {
+                // 添加参数
+                var uploadImgServerArr = uploadImgServer.split('#');
+                uploadImgServer = uploadImgServerArr[0];
+                var uploadImgServerHash = uploadImgServerArr[1] || '';
+                objForEach(uploadImgParams, function (key, val) {
+                    val = encodeURIComponent(val);
+
+                    // 第一,将参数拼接到 url 中
+                    if (uploadImgServer.indexOf('?') > 0) {
+                        uploadImgServer += '&';
+                    } else {
+                        uploadImgServer += '?';
+                    }
+                    uploadImgServer = uploadImgServer + key + '=' + val;
+
+                    // 第二,将参数添加到 formdata 中
+                    formdata.append(key, val);
+                });
+                if (uploadImgServerHash) {
+                    uploadImgServer += '#' + uploadImgServerHash;
+                }
+
+                // 定义 xhr
+                var xhr = new XMLHttpRequest();
+                xhr.open('POST', uploadImgServer);
+
+                // 设置超时
+                xhr.timeout = timeout;
+                xhr.ontimeout = function () {
+                    // hook - timeout
+                    if (hooks.timeout && typeof hooks.timeout === 'function') {
+                        hooks.timeout(xhr, editor);
+                    }
+
+                    _this3._alert('上传图片超时');
+                };
+
+                // 监控 progress
+                if (xhr.upload) {
+                    xhr.upload.onprogress = function (e) {
+                        var percent = void 0;
+                        // 进度条
+                        var progressBar = new Progress(editor);
+                        if (e.lengthComputable) {
+                            percent = e.loaded / e.total;
+                            progressBar.show(percent);
+                        }
+                    };
+                }
+
+                // 返回数据
+                xhr.onreadystatechange = function () {
+                    var result = void 0;
+                    if (xhr.readyState === 4) {
+                        if (xhr.status < 200 || xhr.status >= 300) {
+                            // hook - error
+                            if (hooks.error && typeof hooks.error === 'function') {
+                                hooks.error(xhr, editor);
+                            }
+
+                            // xhr 返回状态错误
+                            _this3._alert('上传图片发生错误', '\u4E0A\u4F20\u56FE\u7247\u53D1\u751F\u9519\u8BEF\uFF0C\u670D\u52A1\u5668\u8FD4\u56DE\u72B6\u6001\u662F ' + xhr.status);
+                            return;
+                        }
+
+                        result = xhr.responseText;
+                        if ((typeof result === 'undefined' ? 'undefined' : _typeof(result)) !== 'object') {
+                            try {
+                                result = JSON.parse(result);
+                            } catch (ex) {
+                                // hook - fail
+                                if (hooks.fail && typeof hooks.fail === 'function') {
+                                    hooks.fail(xhr, editor, result);
+                                }
+
+                                _this3._alert('上传图片失败', '上传图片返回结果错误,返回结果是: ' + result);
+                                return;
+                            }
+                        }
+                        if (!hooks.customInsert && result.errno != '0') {
+                            // hook - fail
+                            if (hooks.fail && typeof hooks.fail === 'function') {
+                                hooks.fail(xhr, editor, result);
+                            }
+
+                            // 数据错误
+                            _this3._alert('上传图片失败', '上传图片返回结果错误,返回结果 errno=' + result.errno);
+                        } else {
+                            if (hooks.customInsert && typeof hooks.customInsert === 'function') {
+                                // 使用者自定义插入方法
+                                hooks.customInsert(_this3.insertLinkImg.bind(_this3), result, editor);
+                            } else {
+                                // 将图片插入编辑器
+                                var data = result.data || [];
+                                data.forEach(function (link) {
+                                    _this3.insertLinkImg(link);
+                                });
+                            }
+
+                            // hook - success
+                            if (hooks.success && typeof hooks.success === 'function') {
+                                hooks.success(xhr, editor, result);
+                            }
+                        }
+                    }
+                };
+
+                // hook - before
+                if (hooks.before && typeof hooks.before === 'function') {
+                    hooks.before(xhr, editor, resultFiles);
+                }
+
+                // 自定义 headers
+                objForEach(uploadImgHeaders, function (key, val) {
+                    xhr.setRequestHeader(key, val);
+                });
+
+                // 跨域传 cookie
+                xhr.withCredentials = withCredentials;
+
+                // 发送请求
+                xhr.send(formdata);
+
+                // 注意,要 return 。不去操作接下来的 base64 显示方式
+                return;
+            }
+
+            // 显示 base64 格式
+            if (uploadImgShowBase64) {
+                arrForEach(files, function (file) {
+                    var _this = _this3;
+                    var reader = new FileReader();
+                    reader.readAsDataURL(file);
+                    reader.onload = function () {
+                        _this.insertLinkImg(this.result);
+                    };
+                });
+            }
+        }
+    };
+
+    /*
+     编辑器构造函数
+     */
+
+// id,累加
+    var editorId = 1;
+
+// 构造函数
+    function Editor(toolbarSelector, textSelector) {
+        if (toolbarSelector == null) {
+            // 没有传入任何参数,报错
+            throw new Error('错误:初始化编辑器时候未传入任何参数,请查阅文档');
+        }
+        // id,用以区分单个页面不同的编辑器对象
+        this.id = 'wangEditor-' + editorId++;
+
+        this.toolbarSelector = toolbarSelector;
+        this.textSelector = textSelector;
+
+        // 自定义配置
+        this.customConfig = {};
+    }
+
+// 修改原型
+    Editor.prototype = {
+        constructor: Editor,
+
+        // 初始化配置
+        _initConfig: function _initConfig() {
+            // _config 是默认配置,this.customConfig 是用户自定义配置,将它们 merge 之后再赋值
+            var target = {};
+            this.config = Object.assign(target, config, this.customConfig);
+        },
+
+        // 初始化 DOM
+        _initDom: function _initDom() {
+            var _this = this;
+
+            var toolbarSelector = this.toolbarSelector;
+            var $toolbarSelector = $(toolbarSelector);
+            var textSelector = this.textSelector;
+
+            var config$$1 = this.config;
+            var zIndex = config$$1.zIndex || '10000';
+
+            // 定义变量
+            var $toolbarElem = void 0,
+                $textContainerElem = void 0,
+                $textElem = void 0,
+                $children = void 0;
+
+            if (textSelector == null) {
+                // 只传入一个参数,即是容器的选择器或元素,toolbar 和 text 的元素自行创建
+                $toolbarElem = $('<div></div>');
+                $textContainerElem = $('<div></div>');
+
+                // 将编辑器区域原有的内容,暂存起来
+                $children = $toolbarSelector.children();
+
+                // 添加到 DOM 结构中
+                $toolbarSelector.append($toolbarElem).append($textContainerElem);
+
+                // 自行创建的,需要配置默认的样式
+                $toolbarElem.css('background-color', '#f1f1f1').css('border', '1px solid #ccc');
+                $textContainerElem.css('border', '1px solid #ccc').css('border-top', 'none').css('height', '150px');
+            } else {
+                // toolbar 和 text 的选择器都有值,记录属性
+                $toolbarElem = $toolbarSelector;
+                $textContainerElem = $(textSelector);
+                // 将编辑器区域原有的内容,暂存起来
+                $children = $textContainerElem.children();
+            }
+
+            // 编辑区域
+            $textElem = $('<div></div>');
+            $textElem.attr('contenteditable', 'true').css('width', '100%').css('height', '100%');
+
+            // 初始化编辑区域内容
+            if ($children && $children.length) {
+                $textElem.append($children);
+            } else {
+                $textElem.append($('<p><br></p>'));
+            }
+
+            // 编辑区域加入DOM
+            $textContainerElem.append($textElem);
+
+            // 设置通用的 class
+            $toolbarElem.addClass('w-e-toolbar');
+            $textContainerElem.addClass('w-e-text-container');
+            $textContainerElem.css('z-index', zIndex);
+            $textElem.addClass('w-e-text');
+
+            // 记录属性
+            this.$toolbarElem = $toolbarElem;
+            this.$textContainerElem = $textContainerElem;
+            this.$textElem = $textElem;
+
+            // 绑定 onchange
+            $textContainerElem.on('click keyup', function () {
+                _this.change && _this.change();
+            });
+            $toolbarElem.on('click', function () {
+                this.change && this.change();
+            });
+        },
+
+        // 封装 command
+        _initCommand: function _initCommand() {
+            this.cmd = new Command(this);
+        },
+
+        // 封装 selection range API
+        _initSelectionAPI: function _initSelectionAPI() {
+            this.selection = new API(this);
+        },
+
+        // 添加图片上传
+        _initUploadImg: function _initUploadImg() {
+            this.uploadImg = new UploadImg(this);
+        },
+
+        // 初始化菜单
+        _initMenus: function _initMenus() {
+            this.menus = new Menus(this);
+            this.menus.init();
+        },
+
+        // 添加 text 区域
+        _initText: function _initText() {
+            this.txt = new Text(this);
+            this.txt.init();
+        },
+
+        // 初始化选区,将光标定位到内容尾部
+        initSelection: function initSelection() {
+            var $textElem = this.$textElem;
+            var $children = $textElem.children();
+            if (!$children.length) {
+                // 如果编辑器区域无内容,添加一个空行,重新设置选区
+                $textElem.append($('<p><br></p>'));
+                this.initSelection();
+                return;
+            }
+
+            var $last = $children.last();
+            var html = $last.html().toLowerCase();
+            var nodeName = $last.getNodeName();
+            if (html !== '<br>' && html !== '<br\/>' || nodeName !== 'P') {
+                // 最后一个元素不是 <p><br></p>,添加一个空行,重新设置选区
+                $textElem.append($('<p><br></p>'));
+                this.initSelection();
+                return;
+            }
+
+            this.selection.createRangeByElem($last, true);
+            this.selection.restoreSelection();
+        },
+
+        // 绑定事件
+        _bindEvent: function _bindEvent() {
+            // -------- 绑定 onchange 事件 --------
+            var onChangeTimeoutId = 0;
+            var beforeChangeHtml = this.txt.html();
+            var config$$1 = this.config;
+            var onchange = config$$1.onchange;
+            if (onchange && typeof onchange === 'function') {
+                // 触发 change 的有三个场景:
+                // 1. $textContainerElem.on('click keyup')
+                // 2. $toolbarElem.on('click')
+                // 3. editor.cmd.do()
+                this.change = function () {
+                    // 判断是否有变化
+                    var currentHtml = this.txt.html();
+                    if (currentHtml.length === beforeChangeHtml.length) {
+                        return;
+                    }
+
+                    // 执行,使用节流
+                    if (onChangeTimeoutId) {
+                        clearTimeout(onChangeTimeoutId);
+                    }
+                    onChangeTimeoutId = setTimeout(function () {
+                        // 触发配置的 onchange 函数
+                        onchange(currentHtml);
+                        beforeChangeHtml = currentHtml;
+                    }, 200);
+                };
+            }
+        },
+
+        // 创建编辑器
+        create: function create() {
+            // 初始化配置信息
+            this._initConfig();
+
+            // 初始化 DOM
+            this._initDom();
+
+            // 封装 command API
+            this._initCommand();
+
+            // 封装 selection range API
+            this._initSelectionAPI();
+
+            // 添加 text
+            this._initText();
+
+            // 初始化菜单
+            this._initMenus();
+
+            // 添加 图片上传
+            this._initUploadImg();
+
+            // 初始化选区,将光标定位到内容尾部
+            this.initSelection();
+
+            // 绑定事件
+            this._bindEvent();
+        }
+    };
+
+// 检验是否浏览器环境
+    try {
+        document;
+    } catch (ex) {
+        throw new Error('请在浏览器环境下运行');
+    }
+
+// polyfill
+    polyfill();
+
+// 这里的 `inlinecss` 将被替换成 css 代码的内容,详情可去 ./gulpfile.js 中搜索 `inlinecss` 关键字
+    var inlinecss = '.w-e-toolbar,.w-e-text-container,.w-e-menu-panel {  padding: 0;  margin: 0;  box-sizing: border-box;}.w-e-toolbar *,.w-e-text-container *,.w-e-menu-panel * {  padding: 0;  margin: 0;  box-sizing: border-box;}.w-e-clear-fix:after {  content: "";  display: table;  clear: both;}.w-e-toolbar .w-e-droplist {  position: absolute;  left: 0;  top: 0;  background-color: #fff;  border: 1px solid #f1f1f1;  border-right-color: #ccc;  border-bottom-color: #ccc;}.w-e-toolbar .w-e-droplist .w-e-dp-title {  text-align: center;  color: #999;  line-height: 2;  border-bottom: 1px solid #f1f1f1;  font-size: 13px;}.w-e-toolbar .w-e-droplist ul.w-e-list {  list-style: none;  line-height: 1;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item {  color: #333;  padding: 5px 0;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover {  background-color: #f1f1f1;}.w-e-toolbar .w-e-droplist ul.w-e-block {  list-style: none;  text-align: left;  padding: 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item {  display: inline-block;  *display: inline;  *zoom: 1;  padding: 3px 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover {  background-color: #f1f1f1;}@font-face {  font-family: \'icomoon\';  src: url(data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAABXAAAsAAAAAFXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIPAmNtYXAAAAFoAAAA9AAAAPRAxxN6Z2FzcAAAAlwAAAAIAAAACAAAABBnbHlmAAACZAAAEHwAABB8kRGt5WhlYWQAABLgAAAANgAAADYN4rlyaGhlYQAAExgAAAAkAAAAJAfEA99obXR4AAATPAAAAHwAAAB8cAcDvGxvY2EAABO4AAAAQAAAAEAx8jYEbWF4cAAAE/gAAAAgAAAAIAAqALZuYW1lAAAUGAAAAYYAAAGGmUoJ+3Bvc3QAABWgAAAAIAAAACAAAwAAAAMD3AGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA8fwDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEANgAAAAyACAABAASAAEAIOkG6Q3pEulH6Wbpd+m56bvpxunL6d/qDepl6mjqcep58A3wFPEg8dzx/P/9//8AAAAAACDpBukN6RLpR+ll6Xfpuem76cbpy+nf6g3qYupo6nHqd/AN8BTxIPHc8fz//f//AAH/4xb+FvgW9BbAFqMWkxZSFlEWRxZDFjAWAxWvFa0VpRWgEA0QBw78DkEOIgADAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAIAAP/ABAADwAAEABMAAAE3AScBAy4BJxM3ASMBAyUBNQEHAYCAAcBA/kCfFzsyY4ABgMD+gMACgAGA/oBOAUBAAcBA/kD+nTI7FwERTgGA/oD9gMABgMD+gIAABAAAAAAEAAOAABAAIQAtADQAAAE4ATEROAExITgBMRE4ATEhNSEiBhURFBYzITI2NRE0JiMHFAYjIiY1NDYzMhYTITUTATM3A8D8gAOA/IAaJiYaA4AaJiYagDgoKDg4KCg4QP0A4AEAQOADQP0AAwBAJhr9ABomJhoDABom4Cg4OCgoODj9uIABgP7AwAAAAgAAAEAEAANAACgALAAAAS4DIyIOAgcOAxUUHgIXHgMzMj4CNz4DNTQuAicBEQ0BA9U2cXZ5Pz95dnE2Cw8LBgYLDws2cXZ5Pz95dnE2Cw8LBgYLDwv9qwFA/sADIAgMCAQECAwIKVRZWy8vW1lUKQgMCAQECAwIKVRZWy8vW1lUKf3gAYDAwAAAAAACAMD/wANAA8AAEwAfAAABIg4CFRQeAjEwPgI1NC4CAyImNTQ2MzIWFRQGAgBCdVcyZHhkZHhkMld1QlBwcFBQcHADwDJXdUJ4+syCgsz6eEJ1VzL+AHBQUHBwUFBwAAABAAAAAAQAA4AAIQAAASIOAgcnESEnPgEzMh4CFRQOAgcXPgM1NC4CIwIANWRcUiOWAYCQNYtQUItpPBIiMB5VKEAtGFCLu2oDgBUnNyOW/oCQNDw8aYtQK1FJQRpgI1ZibDlqu4tQAAEAAAAABAADgAAgAAATFB4CFzcuAzU0PgIzMhYXByERBy4DIyIOAgAYLUAoVR4wIhI8aYtQUIs1kAGAliNSXGQ1aruLUAGAOWxiViNgGkFJUStQi2k8PDSQAYCWIzcnFVCLuwACAAAAQAQBAwAAHgA9AAATMh4CFRQOAiMiLgI1JzQ+AjMVIgYHDgEHPgEhMh4CFRQOAiMiLgI1JzQ+AjMVIgYHDgEHPgHhLlI9IyM9Ui4uUj0jAUZ6o11AdS0JEAcIEgJJLlI9IyM9Ui4uUj0jAUZ6o11AdS0JEAcIEgIAIz1SLi5SPSMjPVIuIF2jekaAMC4IEwoCASM9Ui4uUj0jIz1SLiBdo3pGgDAuCBMKAgEAAAYAQP/ABAADwAADAAcACwARAB0AKQAAJSEVIREhFSERIRUhJxEjNSM1ExUzFSM1NzUjNTMVFREjNTM1IzUzNSM1AYACgP2AAoD9gAKA/YDAQEBAgMCAgMDAgICAgICAAgCAAgCAwP8AwED98jJAkjwyQJLu/sBAQEBAQAAGAAD/wAQAA8AAAwAHAAsAFwAjAC8AAAEhFSERIRUhESEVIQE0NjMyFhUUBiMiJhE0NjMyFhUUBiMiJhE0NjMyFhUUBiMiJgGAAoD9gAKA/YACgP2A/oBLNTVLSzU1S0s1NUtLNTVLSzU1S0s1NUsDgID/AID/AIADQDVLSzU1S0v+tTVLSzU1S0v+tTVLSzU1S0sAAwAAAAAEAAOgAAMADQAUAAA3IRUhJRUhNRMhFSE1ISUJASMRIxEABAD8AAQA/ACAAQABAAEA/WABIAEg4IBAQMBAQAEAgIDAASD+4P8AAQAAAAAAAgBT/8wDrQO0AC8AXAAAASImJy4BNDY/AT4BMzIWFx4BFAYPAQYiJyY0PwE2NCcuASMiBg8BBhQXFhQHDgEjAyImJy4BNDY/ATYyFxYUDwEGFBceATMyNj8BNjQnJjQ3NjIXHgEUBg8BDgEjAbgKEwgjJCQjwCNZMTFZIyMkJCNYDywPDw9YKSkUMxwcMxTAKSkPDwgTCrgxWSMjJCQjWA8sDw8PWCkpFDMcHDMUwCkpDw8PKxAjJCQjwCNZMQFECAckWl5aJMAiJSUiJFpeWiRXEBAPKw9YKXQpFBUVFMApdCkPKxAHCP6IJSIkWl5aJFcQEA8rD1gpdCkUFRUUwCl0KQ8rEA8PJFpeWiTAIiUAAAAABQAA/8AEAAPAABMAJwA7AEcAUwAABTI+AjU0LgIjIg4CFRQeAhMyHgIVFA4CIyIuAjU0PgITMj4CNw4DIyIuAiceAyc0NjMyFhUUBiMiJiU0NjMyFhUUBiMiJgIAaruLUFCLu2pqu4tQUIu7alaYcUFBcZhWVphxQUFxmFYrVVFMIwU3Vm8/P29WNwUjTFFV1SUbGyUlGxslAYAlGxslJRsbJUBQi7tqaruLUFCLu2pqu4tQA6BBcZhWVphxQUFxmFZWmHFB/gkMFSAUQ3RWMTFWdEMUIBUM9yg4OCgoODgoKDg4KCg4OAAAAAADAAD/wAQAA8AAEwAnADMAAAEiDgIVFB4CMzI+AjU0LgIDIi4CNTQ+AjMyHgIVFA4CEwcnBxcHFzcXNyc3AgBqu4tQUIu7amq7i1BQi7tqVphxQUFxmFZWmHFBQXGYSqCgYKCgYKCgYKCgA8BQi7tqaruLUFCLu2pqu4tQ/GBBcZhWVphxQUFxmFZWmHFBAqCgoGCgoGCgoGCgoAADAMAAAANAA4AAEgAbACQAAAE+ATU0LgIjIREhMj4CNTQmATMyFhUUBisBEyMRMzIWFRQGAsQcIChGXTX+wAGANV1GKET+hGUqPDwpZp+fnyw+PgHbIlQvNV1GKPyAKEZdNUZ0AUZLNTVL/oABAEs1NUsAAAIAwAAAA0ADgAAbAB8AAAEzERQOAiMiLgI1ETMRFBYXHgEzMjY3PgE1ASEVIQLAgDJXdUJCdVcygBsYHEkoKEkcGBv+AAKA/YADgP5gPGlOLS1OaTwBoP5gHjgXGBsbGBc4Hv6ggAAAAQCAAAADgAOAAAsAAAEVIwEzFSE1MwEjNQOAgP7AgP5AgAFAgAOAQP0AQEADAEAAAQAAAAAEAAOAAD0AAAEVIx4BFRQGBw4BIyImJy4BNTMUFjMyNjU0JiMhNSEuAScuATU0Njc+ATMyFhceARUjNCYjIgYVFBYzMhYXBADrFRY1MCxxPj5xLDA1gHJOTnJyTv4AASwCBAEwNTUwLHE+PnEsMDWAck5OcnJOO24rAcBAHUEiNWIkISQkISRiNTRMTDQ0TEABAwEkYjU1YiQhJCQhJGI1NExMNDRMIR8AAAAHAAD/wAQAA8AAAwAHAAsADwATABsAIwAAEzMVIzczFSMlMxUjNzMVIyUzFSMDEyETMxMhEwEDIQMjAyEDAICAwMDAAQCAgMDAwAEAgIAQEP0AECAQAoAQ/UAQAwAQIBD9gBABwEBAQEBAQEBAQAJA/kABwP6AAYD8AAGA/oABQP7AAAAKAAAAAAQAA4AAAwAHAAsADwATABcAGwAfACMAJwAAExEhEQE1IRUdASE1ARUhNSMVITURIRUhJSEVIRE1IRUBIRUhITUhFQAEAP2AAQD/AAEA/wBA/wABAP8AAoABAP8AAQD8gAEA/wACgAEAA4D8gAOA/cDAwEDAwAIAwMDAwP8AwMDAAQDAwP7AwMDAAAAFAAAAAAQAA4AAAwAHAAsADwATAAATIRUhFSEVIREhFSERIRUhESEVIQAEAPwAAoD9gAKA/YAEAPwABAD8AAOAgECA/wCAAUCA/wCAAAAAAAUAAAAABAADgAADAAcACwAPABMAABMhFSEXIRUhESEVIQMhFSERIRUhAAQA/ADAAoD9gAKA/YDABAD8AAQA/AADgIBAgP8AgAFAgP8AgAAABQAAAAAEAAOAAAMABwALAA8AEwAAEyEVIQUhFSERIRUhASEVIREhFSEABAD8AAGAAoD9gAKA/YD+gAQA/AAEAPwAA4CAQID/AIABQID/AIAAAAAAAQA/AD8C5gLmACwAACUUDwEGIyIvAQcGIyIvASY1ND8BJyY1ND8BNjMyHwE3NjMyHwEWFRQPARcWFQLmEE4QFxcQqKgQFxYQThAQqKgQEE4QFhcQqKgQFxcQThAQqKgQwxYQThAQqKgQEE4QFhcQqKgQFxcQThAQqKgQEE4QFxcQqKgQFwAAAAYAAAAAAyUDbgAUACgAPABNAFUAggAAAREUBwYrASInJjURNDc2OwEyFxYVMxEUBwYrASInJjURNDc2OwEyFxYXERQHBisBIicmNRE0NzY7ATIXFhMRIREUFxYXFjMhMjc2NzY1ASEnJicjBgcFFRQHBisBERQHBiMhIicmNREjIicmPQE0NzY7ATc2NzY7ATIXFh8BMzIXFhUBJQYFCCQIBQYGBQgkCAUGkgUFCCUIBQUFBQglCAUFkgUFCCUIBQUFBQglCAUFSf4ABAQFBAIB2wIEBAQE/oABABsEBrUGBAH3BgUINxobJv4lJhsbNwgFBQUFCLEoCBcWF7cXFhYJKLAIBQYCEv63CAUFBQUIAUkIBQYGBQj+twgFBQUFCAFJCAUGBgUI/rcIBQUFBQgBSQgFBgYF/lsCHf3jDQsKBQUFBQoLDQJmQwUCAgVVJAgGBf3jMCIjISIvAiAFBggkCAUFYBUPDw8PFWAFBQgAAgAHAEkDtwKvABoALgAACQEGIyIvASY1ND8BJyY1ND8BNjMyFwEWFRQHARUUBwYjISInJj0BNDc2MyEyFxYBTv72BgcIBR0GBuHhBgYdBQgHBgEKBgYCaQUFCP3bCAUFBQUIAiUIBQUBhf72BgYcBggHBuDhBgcHBh0FBf71BQgHBv77JQgFBQUFCCUIBQUFBQAAAAEAIwAAA90DbgCzAAAlIicmIyIHBiMiJyY1NDc2NzY3Njc2PQE0JyYjISIHBh0BFBcWFxYzFhcWFRQHBiMiJyYjIgcGIyInJjU0NzY3Njc2NzY9ARE0NTQ1NCc0JyYnJicmJyYnJiMiJyY1NDc2MzIXFjMyNzYzMhcWFRQHBiMGBwYHBh0BFBcWMyEyNzY9ATQnJicmJyY1NDc2MzIXFjMyNzYzMhcWFRQHBgciBwYHBhURFBcWFxYXMhcWFRQHBiMDwRkzMhoZMjMZDQgHCQoNDBEQChIBBxX+fhYHARUJEhMODgwLBwcOGzU1GhgxMRgNBwcJCQsMEA8JEgECAQIDBAQFCBIRDQ0KCwcHDho1NRoYMDEYDgcHCQoMDRAQCBQBBw8BkA4HARQKFxcPDgcHDhkzMhkZMTEZDgcHCgoNDRARCBQUCRERDg0KCwcHDgACAgICDAsPEQkJAQEDAwUMROAMBQMDBQzUUQ0GAQIBCAgSDwwNAgICAgwMDhEICQECAwMFDUUhAdACDQ0ICA4OCgoLCwcHAwYBAQgIEg8MDQICAgINDA8RCAgBAgEGDFC2DAcBAQcMtlAMBgEBBgcWDwwNAgICAg0MDxEICAEBAgYNT/3mRAwGAgIBCQgRDwwNAAACAAD/twP/A7cAEwA5AAABMhcWFRQHAgcGIyInJjU0NwE2MwEWFxYfARYHBiMiJyYnJicmNRYXFhcWFxYzMjc2NzY3Njc2NzY3A5soHh4avkw3RUg0NDUBbSEp/fgXJicvAQJMTHtHNjYhIRARBBMUEBASEQkXCA8SExUVHR0eHikDtxsaKCQz/plGNDU0SUkwAUsf/bErHx8NKHpNTBobLi86OkQDDw4LCwoKFiUbGhERCgsEBAIAAQAAAAAAANox8glfDzz1AAsEAAAAAADVYbp/AAAAANVhun8AAP+3BAEDwAAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAA//8EAQABAAAAAAAAAAAAAAAAAAAAHwQAAAAAAAAAAAAAAAIAAAAEAAAABAAAAAQAAAAEAADABAAAAAQAAAAEAAAABAAAQAQAAAAEAAAABAAAUwQAAAAEAAAABAAAwAQAAMAEAACABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAyUAPwMlAAADvgAHBAAAIwP/AAAAAAAAAAoAFAAeAEwAlADaAQoBPgFwAcgCBgJQAnoDBAN6A8gEAgQ2BE4EpgToBTAFWAWABaoF7gamBvAH4gg+AAEAAAAfALQACgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAHAAAAAQAAAAAAAgAHAGAAAQAAAAAAAwAHADYAAQAAAAAABAAHAHUAAQAAAAAABQALABUAAQAAAAAABgAHAEsAAQAAAAAACgAaAIoAAwABBAkAAQAOAAcAAwABBAkAAgAOAGcAAwABBAkAAwAOAD0AAwABBAkABAAOAHwAAwABBAkABQAWACAAAwABBAkABgAOAFIAAwABBAkACgA0AKRpY29tb29uAGkAYwBvAG0AbwBvAG5WZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBpY29tb29uAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG5SZWd1bGFyAFIAZQBnAHUAbABhAHJpY29tb29uAGkAYwBvAG0AbwBvAG5Gb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format(\'truetype\');  font-weight: normal;  font-style: normal;}[class^="w-e-icon-"],[class*=" w-e-icon-"] {  /* use !important to prevent issues with browser extensions that change fonts */  font-family: \'icomoon\' !important;  speak: none;  font-style: normal;  font-weight: normal;  font-variant: normal;  text-transform: none;  line-height: 1;  /* Better Font Rendering =========== */  -webkit-font-smoothing: antialiased;  -moz-osx-font-smoothing: grayscale;}.w-e-icon-close:before {  content: "\\f00d";}.w-e-icon-upload2:before {  content: "\\e9c6";}.w-e-icon-trash-o:before {  content: "\\f014";}.w-e-icon-header:before {  content: "\\f1dc";}.w-e-icon-pencil2:before {  content: "\\e906";}.w-e-icon-paint-brush:before {  content: "\\f1fc";}.w-e-icon-image:before {  content: "\\e90d";}.w-e-icon-play:before {  content: "\\e912";}.w-e-icon-location:before {  content: "\\e947";}.w-e-icon-undo:before {  content: "\\e965";}.w-e-icon-redo:before {  content: "\\e966";}.w-e-icon-quotes-left:before {  content: "\\e977";}.w-e-icon-list-numbered:before {  content: "\\e9b9";}.w-e-icon-list2:before {  content: "\\e9bb";}.w-e-icon-link:before {  content: "\\e9cb";}.w-e-icon-happy:before {  content: "\\e9df";}.w-e-icon-bold:before {  content: "\\ea62";}.w-e-icon-underline:before {  content: "\\ea63";}.w-e-icon-italic:before {  content: "\\ea64";}.w-e-icon-strikethrough:before {  content: "\\ea65";}.w-e-icon-table2:before {  content: "\\ea71";}.w-e-icon-paragraph-left:before {  content: "\\ea77";}.w-e-icon-paragraph-center:before {  content: "\\ea78";}.w-e-icon-paragraph-right:before {  content: "\\ea79";}.w-e-icon-terminal:before {  content: "\\f120";}.w-e-icon-page-break:before {  content: "\\ea68";}.w-e-icon-cancel-circle:before {  content: "\\ea0d";}.w-e-toolbar {  display: -webkit-box;  display: -ms-flexbox;  display: flex;  padding: 0 5px;  /* 单个菜单 */}.w-e-toolbar .w-e-menu {  position: relative;  z-index: 10001;  text-align: center;  padding: 5px 10px;  cursor: pointer;}.w-e-toolbar .w-e-menu i {  color: #999;}.w-e-toolbar .w-e-menu:hover i {  color: #333;}.w-e-toolbar .w-e-active i {  color: #1e88e5;}.w-e-toolbar .w-e-active:hover i {  color: #1e88e5;}.w-e-text-container .w-e-panel-container {  position: absolute;  top: 0;  left: 50%;  border: 1px solid #ccc;  border-top: 0;  box-shadow: 1px 1px 2px #ccc;  color: #333;  background-color: #fff;  /* 为 emotion panel 定制的样式 */  /* 上传图片的 panel 定制样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-close {  position: absolute;  right: 0;  top: 0;  padding: 5px;  margin: 2px 5px 0 0;  cursor: pointer;  color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-close:hover {  color: #333;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title {  list-style: none;  display: -webkit-box;  display: -ms-flexbox;  display: flex;  font-size: 14px;  margin: 2px 10px 0 10px;  border-bottom: 1px solid #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item {  padding: 3px 5px;  color: #999;  cursor: pointer;  margin: 0 3px;  position: relative;  top: 1px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active {  color: #333;  border-bottom: 1px solid #333;  cursor: default;  font-weight: 700;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content {  padding: 10px 15px 10px 15px;  font-size: 16px;  /* 输入框的样式 */  /* 按钮的样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus {  outline: none;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea {  width: 100%;  border: 1px solid #ccc;  padding: 5px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus {  border-color: #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text] {  border: none;  border-bottom: 1px solid #ccc;  font-size: 14px;  height: 20px;  color: #333;  text-align: left;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small {  width: 30px;  text-align: center;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block {  display: block;  width: 100%;  margin: 10px 0;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus {  border-bottom: 2px solid #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button {  font-size: 14px;  color: #1e88e5;  border: none;  padding: 5px 10px;  background-color: #fff;  cursor: pointer;  border-radius: 3px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left {  float: left;  margin-right: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right {  float: right;  margin-left: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray {  color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red {  color: #c24f4a;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover {  background-color: #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after {  content: "";  display: table;  clear: both;}.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item {  cursor: pointer;  font-size: 18px;  padding: 0 3px;  display: inline-block;  *display: inline;  *zoom: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container {  text-align: center;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn {  display: inline-block;  *display: inline;  *zoom: 1;  color: #999;  cursor: pointer;  font-size: 60px;  line-height: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover {  color: #333;}.w-e-text-container {  position: relative;}.w-e-text-container .w-e-progress {  position: absolute;  background-color: #1e88e5;  bottom: 0;  left: 0;  height: 1px;}.w-e-text {  padding: 0 10px;  overflow-y: scroll;}.w-e-text p,.w-e-text h1,.w-e-text h2,.w-e-text h3,.w-e-text h4,.w-e-text h5,.w-e-text table,.w-e-text pre {  margin: 10px 0;  line-height: 1.5;}.w-e-text ul,.w-e-text ol {  margin: 10px 0 10px 20px;}.w-e-text blockquote {  display: block;  border-left: 8px solid #d0e5f2;  padding: 5px 10px;  margin: 10px 0;  line-height: 1.4;  font-size: 100%;  background-color: #f1f1f1;}.w-e-text code {  display: inline-block;  *display: inline;  *zoom: 1;  background-color: #f1f1f1;  border-radius: 3px;  padding: 3px 5px;  margin: 0 3px;}.w-e-text pre code {  display: block;}.w-e-text table {  border-top: 1px solid #ccc;  border-left: 1px solid #ccc;}.w-e-text table td,.w-e-text table th {  border-bottom: 1px solid #ccc;  border-right: 1px solid #ccc;  padding: 3px 5px;}.w-e-text table th {  border-bottom: 2px solid #ccc;  text-align: center;}.w-e-text:focus {  outline: none;}.w-e-text img {  cursor: pointer;}.w-e-text img:hover {  box-shadow: 0 0 5px #333;}.w-e-text img.w-e-selected {  border: 2px solid #1e88e5;}.w-e-text img.w-e-selected:hover {  box-shadow: none;}';
+
+// 将 css 代码添加到 <style> 中
+    var style = document.createElement('style');
+    style.type = 'text/css';
+    style.innerHTML = inlinecss;
+    document.getElementsByTagName('HEAD').item(0).appendChild(style);
+
+// 返回
+    var index = window.wangEditor || Editor;
+
+    return index;
+
+})));
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/Uploader.swf b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/Uploader.swf
new file mode 100644
index 0000000..bd75d60
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/Uploader.swf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.css b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.css
new file mode 100644
index 0000000..12f451f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.css
@@ -0,0 +1,28 @@
+.webuploader-container {
+	position: relative;
+}
+.webuploader-element-invisible {
+	position: absolute !important;
+	clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
+    clip: rect(1px,1px,1px,1px);
+}
+.webuploader-pick {
+	position: relative;
+	display: inline-block;
+	cursor: pointer;
+	background: #00b7ee;
+	padding: 10px 15px;
+	color: #fff;
+	text-align: center;
+	border-radius: 3px;
+	overflow: hidden;
+}
+.webuploader-pick-hover {
+	background: #00a2d4;
+}
+
+.webuploader-pick-disable {
+	opacity: 0.6;
+	pointer-events:none;
+}
+
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.custom.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.custom.js
new file mode 100644
index 0000000..7fca9c2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.custom.js
@@ -0,0 +1,6502 @@
+/*! WebUploader 0.1.5 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+
+            return obj;
+        },
+
+        makeExport = function( dollar ) {
+            root.__dollar = dollar;
+
+            // exports every module.
+            return exportsTo( factory( root, _define, _require ) );
+        },
+
+        origin;
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = makeExport();
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([ 'jquery' ], makeExport );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = makeExport();
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( window, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        var $ = window.__dollar || window.jQuery || window.Zepto;
+
+        if ( !$ ) {
+            throw new Error('jQuery or Zepto not found!');
+        }
+
+        return $;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * 直接来源于jquery的代码。
+     * @fileOverview Promise/A+
+     * @beta
+     */
+    define('promise-builtin',[
+        'dollar'
+    ], function( $ ) {
+
+        var api;
+
+        // 简单版Callbacks, 默认memory,可选once.
+        function Callbacks( once ) {
+            var list = [],
+                stack = !once && [],
+                fire = function( data ) {
+                    memory = data;
+                    fired = true;
+                    firingIndex = firingStart || 0;
+                    firingStart = 0;
+                    firingLength = list.length;
+                    firing = true;
+
+                    for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+                        list[ firingIndex ].apply( data[ 0 ], data[ 1 ] );
+                    }
+                    firing = false;
+
+                    if ( list ) {
+                        if ( stack ) {
+                            stack.length && fire( stack.shift() );
+                        }  else {
+                            list = [];
+                        }
+                    }
+                },
+                self = {
+                    add: function() {
+                        if ( list ) {
+                            var start = list.length;
+                            (function add ( args ) {
+                                $.each( args, function( _, arg ) {
+                                    var type = $.type( arg );
+                                    if ( type === 'function' ) {
+                                        list.push( arg );
+                                    } else if ( arg && arg.length &&
+                                            type !== 'string' ) {
+
+                                        add( arg );
+                                    }
+                                });
+                            })( arguments );
+
+                            if ( firing ) {
+                                firingLength = list.length;
+                            } else if ( memory ) {
+                                firingStart = start;
+                                fire( memory );
+                            }
+                        }
+                        return this;
+                    },
+
+                    disable: function() {
+                        list = stack = memory = undefined;
+                        return this;
+                    },
+
+                    // Lock the list in its current state
+                    lock: function() {
+                        stack = undefined;
+                        if ( !memory ) {
+                            self.disable();
+                        }
+                        return this;
+                    },
+
+                    fireWith: function( context, args ) {
+                        if ( list && (!fired || stack) ) {
+                            args = args || [];
+                            args = [ context, args.slice ? args.slice() : args ];
+                            if ( firing ) {
+                                stack.push( args );
+                            } else {
+                                fire( args );
+                            }
+                        }
+                        return this;
+                    },
+
+                    fire: function() {
+                        self.fireWith( this, arguments );
+                        return this;
+                    }
+                },
+
+                fired, firing, firingStart, firingLength, firingIndex, memory;
+
+            return self;
+        }
+
+        function Deferred( func ) {
+            var tuples = [
+                    // action, add listener, listener list, final state
+                    [ 'resolve', 'done', Callbacks( true ), 'resolved' ],
+                    [ 'reject', 'fail', Callbacks( true ), 'rejected' ],
+                    [ 'notify', 'progress', Callbacks() ]
+                ],
+                state = 'pending',
+                promise = {
+                    state: function() {
+                        return state;
+                    },
+                    always: function() {
+                        deferred.done( arguments ).fail( arguments );
+                        return this;
+                    },
+                    then: function( /* fnDone, fnFail, fnProgress */ ) {
+                        var fns = arguments;
+                        return Deferred(function( newDefer ) {
+                            $.each( tuples, function( i, tuple ) {
+                                var action = tuple[ 0 ],
+                                    fn = $.isFunction( fns[ i ] ) && fns[ i ];
+
+                                // deferred[ done | fail | progress ] for
+                                // forwarding actions to newDefer
+                                deferred[ tuple[ 1 ] ](function() {
+                                    var returned;
+
+                                    returned = fn && fn.apply( this, arguments );
+
+                                    if ( returned &&
+                                            $.isFunction( returned.promise ) ) {
+
+                                        returned.promise()
+                                                .done( newDefer.resolve )
+                                                .fail( newDefer.reject )
+                                                .progress( newDefer.notify );
+                                    } else {
+                                        newDefer[ action + 'With' ](
+                                                this === promise ?
+                                                newDefer.promise() :
+                                                this,
+                                                fn ? [ returned ] : arguments );
+                                    }
+                                });
+                            });
+                            fns = null;
+                        }).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 ? $.extend( obj, promise ) : promise;
+                    }
+                },
+                deferred = {};
+
+            // Keep pipe for back-compat
+            promise.pipe = promise.then;
+
+            // Add list-specific methods
+            $.each( tuples, function( i, tuple ) {
+                var list = tuple[ 2 ],
+                    stateString = tuple[ 3 ];
+
+                // promise[ done | fail | progress ] = list.add
+                promise[ tuple[ 1 ] ] = list.add;
+
+                // Handle state
+                if ( stateString ) {
+                    list.add(function() {
+                        // state = [ resolved | rejected ]
+                        state = stateString;
+
+                    // [ reject_list | resolve_list ].disable; progress_list.lock
+                    }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+                }
+
+                // deferred[ resolve | reject | notify ]
+                deferred[ tuple[ 0 ] ] = function() {
+                    deferred[ tuple[ 0 ] + 'With' ]( this === deferred ? promise :
+                            this, arguments );
+                    return this;
+                };
+                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;
+        }
+
+        api = {
+            /**
+             * 创建一个[Deferred](http://api.jquery.com/category/deferred-object/)对象。
+             * 详细的Deferred用法说明,请参照jQuery的API文档。
+             *
+             * Deferred对象在钩子回掉函数中经常要用到,用来处理需要等待的异步操作。
+             *
+             * @for  Base
+             * @method Deferred
+             * @grammar Base.Deferred() => Deferred
+             * @example
+             * // 在文件开始发送前做些异步操作。
+             * // WebUploader会等待此异步操作完成后,开始发送文件。
+             * Uploader.register({
+             *     'before-send-file': 'doSomthingAsync'
+             * }, {
+             *
+             *     doSomthingAsync: function() {
+             *         var deferred = Base.Deferred();
+             *
+             *         // 模拟一次异步操作。
+             *         setTimeout(deferred.resolve, 2000);
+             *
+             *         return deferred.promise();
+             *     }
+             * });
+             */
+            Deferred: Deferred,
+
+            /**
+             * 判断传入的参数是否为一个promise对象。
+             * @method isPromise
+             * @grammar Base.isPromise( anything ) => Boolean
+             * @param  {*}  anything 检测对象。
+             * @return {Boolean}
+             * @for  Base
+             * @example
+             * console.log( Base.isPromise() );    // => false
+             * console.log( Base.isPromise({ key: '123' }) );    // => false
+             * console.log( Base.isPromise( Base.Deferred().promise() ) );    // => true
+             *
+             * // Deferred也是一个Promise
+             * console.log( Base.isPromise( Base.Deferred() ) );    // => true
+             */
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            },
+
+            /**
+             * 返回一个promise,此promise在所有传入的promise都完成了后完成。
+             * 详细请查看[这里](http://api.jquery.com/jQuery.when/)。
+             *
+             * @method when
+             * @for  Base
+             * @grammar Base.when( promise1[, promise2[, promise3...]] ) => Promise
+             */
+            when: function( subordinate /* , ..., subordinateN */ ) {
+                var i = 0,
+                    slice = [].slice,
+                    resolveValues = slice.call( arguments ),
+                    length = resolveValues.length,
+
+                    // the count of uncompleted subordinates
+                    remaining = length !== 1 || (subordinate &&
+                        $.isFunction( subordinate.promise )) ? length : 0,
+
+                    // the master Deferred. If resolveValues consist of
+                    // only a single Deferred, just use that.
+                    deferred = remaining === 1 ? subordinate : Deferred(),
+
+                    // Update function for both resolve and progress values
+                    updateFunc = function( i, contexts, values ) {
+                        return function( value ) {
+                            contexts[ i ] = this;
+                            values[ i ] = arguments.length > 1 ?
+                                    slice.call( arguments ) : value;
+
+                            if ( values === progressValues ) {
+                                deferred.notifyWith( contexts, values );
+                            } else if ( !(--remaining) ) {
+                                deferred.resolveWith( contexts, values );
+                            }
+                        };
+                    },
+
+                    progressValues, progressContexts, resolveContexts;
+
+                // add listeners to Deferred subordinates; treat others as resolved
+                if ( length > 1 ) {
+                    progressValues = new Array( length );
+                    progressContexts = new Array( length );
+                    resolveContexts = new Array( length );
+                    for ( ; i < length; i++ ) {
+                        if ( resolveValues[ i ] &&
+                                $.isFunction( resolveValues[ i ].promise ) ) {
+
+                            resolveValues[ i ].promise()
+                                    .done( updateFunc( i, resolveContexts,
+                                            resolveValues ) )
+                                    .fail( deferred.reject )
+                                    .progress( updateFunc( i, progressContexts,
+                                            progressValues ) );
+                        } else {
+                            --remaining;
+                        }
+                    }
+                }
+
+                // if we're not waiting on anything, resolve the master
+                if ( !remaining ) {
+                    deferred.resolveWith( resolveContexts, resolveValues );
+                }
+
+                return deferred.promise();
+            }
+        };
+
+        return api;
+    });
+    define('promise',[
+        'promise-builtin'
+    ], function( $ ) {
+        return $;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id为该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档中对类的使用可能省略掉了`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+
+        var noop = function() {},
+            call = Function.call;
+
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+
+        function createObject( proto ) {
+            var f;
+
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+
+
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.5',
+
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+
+            Deferred: promise.Deferred,
+
+            isPromise: promise.isPromise,
+
+            when: promise.when,
+
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match( /(?:trident)(?:.*rv:([\w.]+))?/i ),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+
+                /* jshint camelcase: false */
+
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+
+                return child;
+            },
+
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数noop](#WebUploader:Base.noop)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+
+            nextTick: (function() {
+
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+
+            while ( ++i < len ) {
+                handler = events[ i ];
+
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+
+            return !stoped;
+        }
+
+        protos = {
+
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+
+                if ( !callback ) {
+                    return this;
+                }
+
+                set = this._events || (this._events = []);
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+
+                    set.push( handler );
+                });
+
+                return this;
+            },
+
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+
+                if ( !callback ) {
+                    return me;
+                }
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+
+                return me;
+            },
+
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+
+                if ( !events ) {
+                    return this;
+                }
+
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+
+                return this;
+            },
+
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+
+                if ( !this._events || !type ) {
+                    return this;
+                }
+
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$;
+
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            cancelFile: 'cancel-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            md5File: 'md5-file',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            predictRuntimeType: 'predict-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+
+            _init: function( opts ) {
+                var me = this;
+
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     compress: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.option( 'compress', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+
+                // setter
+                if ( arguments.length > 1 ) {
+
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `progressNum` 上传中的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `queueNum` 还在队列中的文件数
+             * * `interruptNum` 被暂停的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+
+                return stats ? {
+                    successNum: stats.numOfSuccess,
+                    progressNum: stats.numOfProgress,
+
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue,
+                    interruptNum: stats.numofInterrupt
+                } : {};
+            },
+
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+
+                    return false;
+                }
+
+                return true;
+            },
+
+            /**
+             * 销毁 webuploader 实例
+             * @method destroy
+             * @grammar destroy() => undefined
+             */
+            destroy: function() {
+                this.request( 'destroy', arguments );
+                this.off();
+            },
+
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            factories = {},
+
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+
+        $.extend( Runtime.prototype, {
+
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+
+                if ( this._container ) {
+                    return this._container;
+                }
+
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                this._parent = parent;
+                return container;
+            },
+
+            init: Base.noop,
+            exec: Base.noop,
+
+            destroy: function() {
+                this._container && this._container.remove();
+                this._parent && this._parent.removeClass('webuploader-container');
+                this.off();
+            }
+        });
+
+        Runtime.orders = 'html5,flash';
+
+
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+
+            type = type || getFirstKey( factories );
+
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+
+        var cache;
+
+        cache = (function() {
+            var obj = {};
+
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+
+                get: function( ruid, standalone ) {
+                    var i;
+
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+
+                        return obj[ i ];
+                    }
+
+                    return null;
+                },
+
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+
+            this.uid = Base.guid('client_');
+
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+
+            this.connectRuntime = function( opts, cb ) {
+
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+
+                deferred.done( cb );
+
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                runtime.__client--;
+
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+
+                runtime = null;
+            };
+
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+
+                return runtime.exec.apply( this, args );
+            };
+
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+
+        function Blob( ruid, source ) {
+            var me = this;
+
+            me.source = source;
+            me.ruid = ruid;
+            this.size = source.size || 0;
+
+            // 如果没有指定 mimetype, 但是知道文件后缀。
+            if ( !source.type && this.ext &&
+                    ~'jpg,jpeg,png,gif,bmp'.indexOf( this.ext ) ) {
+                this.type = 'image/' + (this.ext === 'jpg' ? 'jpeg' : this.ext);
+            } else {
+                this.type = source.type || 'application/octet-stream';
+            }
+
+            RuntimeClient.call( me, 'Blob' );
+            this.uid = source.uid || this.uid;
+
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+
+            getSource: function() {
+                return this.source;
+            }
+        });
+
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+
+        function File( ruid, file ) {
+            var ext;
+
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+
+            // todo 支持其他类型文件的转换。
+            // 如果有 mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && file.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( file.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+
+            Blob.apply( this, arguments );
+        }
+
+        return Base.inherits( Blob, File );
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+
+        var $ = Base.$;
+
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+
+            opts.container = $( opts.id );
+
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+
+                button.addClass('webuploader-pick');
+
+                me.on( 'all', function( type ) {
+                    var files;
+
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+
+                this._resizeHandler = Base.bindFn( this.refresh, this );
+                $( window ).on( 'resize', this._resizeHandler );
+            },
+
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+
+                    pos = button.offset();
+
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+
+            enable: function() {
+                var btn = this.options.button;
+
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+
+            disable: function() {
+                var btn = this.options.button;
+
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+
+                btn.addClass('webuploader-pick-disable');
+            },
+
+            destroy: function() {
+                var btn = this.options.button;
+                $( window ).off( 'resize', this._resizeHandler );
+                btn.removeClass('webuploader-pick-disable webuploader-pick-hover ' +
+                    'webuploader-pick');
+            }
+        });
+
+        return FilePicker;
+    });
+
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            _destroy = Uploader.prototype.destroy,
+            IGNORE = {},
+            widgetClass = [];
+
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+
+            var length = obj.length,
+                type = $.type( obj );
+
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+
+        $.extend( Widget.prototype, {
+
+            init: Base.noop,
+
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+
+                    return IGNORE;
+                }
+
+                return this[ map[ apiName ] ].apply( this, args );
+
+            },
+
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+
+            /**
+             * @property {String | Array} [disableWidgets=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 默认所有 Uploader.register 了的 widget 都会被加载,如果禁用某一部分,请通过此 option 指定黑名单。
+             */
+
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [],
+                    deactives = me.options.disableWidgets || '';
+
+                $.each( widgetClass, function( _, klass ) {
+                    (!deactives || !~deactives.indexOf( klass._name )) &&
+                        widgets.push( new klass( me ) );
+                });
+
+                return _init.apply( me, arguments );
+            },
+
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets && widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+
+                args = isArrayLike( args ) ? args : [ args ];
+
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+
+                    if ( rlt !== IGNORE ) {
+
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个 tick 中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+
+                                if ( args.length === 1 ) {
+                                    args = args[ 0 ];
+                                }
+
+                                setTimeout(function() {
+                                    deferred.resolve( args );
+                                }, 1 );
+
+                                return deferred.promise();
+                            })[ callback ? key : 'done' ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            },
+
+            destroy: function() {
+                _destroy.apply( this, arguments );
+                this._widgets = null;
+            }
+        });
+
+        /**
+         * 添加组件
+         * @grammar Uploader.register(proto);
+         * @grammar Uploader.register(map, proto);
+         * @param  {object} responseMap API 名称与函数实现的映射
+         * @param  {object} proto 组件原型,构造函数通过 constructor 属性定义
+         * @method Uploader.register
+         * @for Uploader
+         * @example
+         * Uploader.register({
+         *     'make-thumb': 'makeThumb'
+         * }, {
+         *     init: function( options ) {},
+         *     makeThumb: function() {}
+         * });
+         *
+         * Uploader.register({
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init', destroy: 'destroy', name: 'anonymous' },
+                klass;
+
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+
+                // 自动生成 map 表。
+                $.each(widgetProto, function(key) {
+                    if ( key[0] === '_' || key === 'name' ) {
+                        key === 'name' && (map.name = widgetProto.name);
+                        return;
+                    }
+
+                    map[key.replace(/[A-Z]/g, '-$&').toLowerCase()] = key;
+                });
+
+            } else {
+                map = $.extend( map, responseMap );
+            }
+
+            widgetProto.responseMap = map;
+            klass = Base.inherits( Widget, widgetProto );
+            klass._name = map.name;
+            widgetClass.push( klass );
+
+            return klass;
+        };
+
+        /**
+         * 删除插件,只有在注册时指定了名字的才能被删除。
+         * @grammar Uploader.unRegister(name);
+         * @param  {string} name 组件名字
+         * @method Uploader.unRegister
+         * @for Uploader
+         * @example
+         *
+         * Uploader.register({
+         *     name: 'custom',
+         *
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         *
+         * Uploader.unRegister('custom');
+         */
+        Uploader.unRegister = Widget.unRegister = function( name ) {
+            if ( !name || name === 'anonymous' ) {
+                return;
+            }
+
+            // 删除指定的插件。
+            for ( var i = widgetClass.length; i--; ) {
+                if ( widgetClass[i]._name === name ) {
+                    widgetClass.splice(i, 1)
+                }
+            }
+        };
+
+        return Widget;
+    });
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor|dom} 指定选择文件的按钮容器,不指定则不创建按钮。**注意** 这里虽然写的是 id, 但是不是只支持 id, 还支持 class, 或者 dom 节点。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+
+        return Uploader.register({
+            name: 'picker',
+
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addBtn( opts.pick );
+            },
+
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addBtn: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    promises = [];
+
+                if ( !pick ) {
+                    return;
+                }
+
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+
+                $( pick.id ).each(function() {
+                    var options, picker, deferred;
+
+                    deferred = Base.Deferred();
+
+                    options = $.extend({}, pick, {
+                        accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                        swf: opts.swf,
+                        runtimeOrder: opts.runtimeOrder,
+                        id: this
+                    });
+
+                    picker = new FilePicker( options );
+
+                    picker.once( 'ready', deferred.resolve );
+                    picker.on( 'select', function( files ) {
+                        me.owner.request( 'add-file', [ files ]);
+                    });
+                    picker.init();
+
+                    me.pickers.push( picker );
+
+                    promises.push( deferred.promise() );
+                });
+
+                return Base.when.apply( Base, promises );
+            },
+
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            },
+
+            destroy: function() {
+                $.each( this.pickers, function() {
+                    this.destroy();
+                });
+                this.pickers = null;
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+
+        // 默认选项。
+        Image.options = {
+
+            // 默认的图片处理质量
+            quality: 90,
+
+            // 是否裁剪
+            crop: false,
+
+            // 是否保留头部信息
+            preserveHeaders: false,
+
+            // 是否允许放大。
+            allowMagnify: false
+        };
+
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+
+            info: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+
+                // getter
+                return this._info;
+            },
+
+            meta: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+
+                // getter
+                return this._meta;
+            },
+
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+
+            crop: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'crop' ].concat( args ) );
+            },
+
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+
+        var $ = Base.$,
+            throttle;
+
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true,
+             *
+             *     // 如果发现压缩后文件大小比原来还大,则使用原来图片
+             *     // 此属性可能会影响图片自动纠正功能
+             *     noCompressIfLarger: false,
+             *
+             *     // 单位字节,如果图片大小小于此值,不会采用压缩。
+             *     compressSize: 0
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+
+        return Uploader.register({
+
+            name: 'image',
+
+
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * 当 width 或者 height 的值介于 0 - 1 时,被当成百分比使用。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             * 也可以借助服务端,将 base64 数据传给服务端,生成一个临时文件供预览。
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+
+                file = this.request( 'get-file', file );
+
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+
+                opts = $.extend({}, this.options.thumb );
+
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+
+                width = width || opts.width;
+                height = height || opts.height;
+
+                image = new Image( opts );
+
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                // 当 resize 完后
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+
+                image.once( 'error', function( reason ) {
+                    cb( reason || true );
+                    image.destroy();
+                });
+
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+
+            beforeSendFile: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 0,
+                    noCompressIfLarger = opts && opts.noCompressIfLarger || false,
+                    image, deferred;
+
+                file = this.request( 'get-file', file );
+
+                // 只压缩 jpeg 图片格式。
+                // gif 可能会丢失针
+                // bmp png 基本上尺寸都不大,且压缩比比较小。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+
+                image = new Image( opts );
+
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    var width = opts.width,
+                        height = opts.height;
+
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                image.once( 'complete', function() {
+                    var blob, size;
+
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+
+                        size = file.size;
+
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( !noCompressIfLarger || blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+
+                            file.trigger( 'resize', blob.size, size );
+                        }
+
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application/octet-stream'
+             */
+            this.type = source.type || 'application/octet-stream';
+
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+
+
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+
+            this.source = source;
+            this.loaded = 0;
+
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+
+        $.extend( WUFile.prototype, {
+
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+
+                var prevStatus = statusMap[ this.id ];
+
+                typeof text !== 'undefined' && (this.statusText = text);
+
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+
+            },
+
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+
+            destroy: function() {
+                this.off();
+                delete statusMap[ this.id ];
+            }
+        });
+
+        Mediator.installTo( WUFile.prototype );
+
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+
+        return WUFile;
+    });
+
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被取消的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * * `numofDeleted` 被移除的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0,
+                numofDeleted: 0,
+                numofInterrupt: 0
+            };
+
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+
+            // 存储所有文件
+            this._map = {};
+        }
+
+        $.extend( Queue.prototype, {
+
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+
+                status = status || STATUS.QUEUED;
+
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+
+                return null;
+            },
+
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+
+                    ret.push( file );
+                }
+
+                return ret;
+            },
+
+            /**
+             * 在队列中删除文件。
+             * @grammar removeFile( file ) => Array
+             * @method removeFile
+             * @param {File} 文件对象。
+             */
+            removeFile: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( existing ) {
+                    delete this._map[ file.id ];
+                    file.destroy();
+                    this.stats.numofDeleted++;
+                }
+            },
+
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+            },
+
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt--;
+                        break;
+                }
+
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt++;
+                        break;
+                }
+            }
+
+        });
+
+        Mediator.installTo( Queue.prototype );
+
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+
+        return Uploader.register({
+            name: 'queue',
+
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+
+                    me.accept = new RegExp( accept, 'i' );
+                }
+
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                this.placeholder = runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+
+
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+
+                    file = new WUFile( file );
+                }
+
+                return file;
+            },
+
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || !file.size || this.accept &&
+
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+
+                return !invalid;
+            },
+
+
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+
+            _addFile: function( file ) {
+                var me = this;
+
+                file = me._wrapFile( file );
+
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @property {Boolean} [auto=false]
+             * @namespace options
+             * @for Uploader
+             * @description 设置为 true 后,不需要手动调用上传,有文件选择即开始上传。
+             *
+             */
+
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFile: function( files ) {
+                var me = this;
+
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+
+                me.owner.trigger( 'filesQueued', files );
+
+                if ( me.options.auto ) {
+                    setTimeout(function() {
+                        me.request('start-upload');
+                    }, 20 );
+                }
+            },
+
+            getStats: function() {
+                return this.stats;
+            },
+
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+
+             /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @grammar removeFile( file, true ) => undefined
+             * @grammar removeFile( id, true ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件, 默认只会标记文件状态为已取消,如果第二个参数为 `true` 则会从 queue 中移除。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file, remove ) {
+                var me = this;
+
+                file = file.id ? file : me.queue.getFile( file );
+
+                this.request( 'cancel-file', file );
+
+                if ( remove ) {
+                    this.queue.removeFile( file );
+                }
+            },
+
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+
+                me.request('start-upload');
+            },
+
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+
+            /**
+             * @event reset
+             * @description 当 uploader 被重置的时候触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.owner.trigger('reset');
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            },
+
+            destroy: function() {
+                this.reset();
+                this.placeholder && this.placeholder.destroy();
+            }
+        });
+
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+
+        /**
+         * @property {Object} [runtimeOrder=html5,flash]
+         * @namespace options
+         * @for Uploader
+         * @description 指定运行时启动顺序。默认会想尝试 html5 是否支持,如果支持则使用 html5, 否则则使用 flash.
+         *
+         * 可以将此值设置成 `flash`,来强制使用 flash 运行时。
+         */
+
+        return Uploader.register({
+            name: 'runtime',
+
+            init: function() {
+                if ( !this.predictRuntimeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntimeType() => String
+             * @method predictRuntimeType
+             * @for  Uploader
+             */
+            predictRuntimeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+
+        var $ = Base.$;
+
+        function Transport( opts ) {
+            var me = this;
+
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+
+        Transport.options = {
+            server: '',
+            method: 'POST',
+
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+
+        $.extend( Transport.prototype, {
+
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+
+                if ( !duration ) {
+                    return;
+                }
+
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+
+        });
+
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+
+
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+
+
+            /**
+             * @property {Object} [formData={}]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: {}
+
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len, api;
+
+            api = {
+                file: file,
+
+                has: function() {
+                    return !!pending.length;
+                },
+
+                shift: function() {
+                    return pending.shift();
+                },
+
+                unshift: function( block ) {
+                    pending.unshift( block );
+                }
+            };
+
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++,
+                    cuted: api
+                });
+                start += len;
+            }
+
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+
+            return api;
+        }
+
+        Uploader.register({
+            name: 'upload',
+
+            init: function() {
+                var owner = this.owner,
+                    me = this;
+
+                this.runing = false;
+                this.progress = false;
+
+                owner
+                    .on( 'startUpload', function() {
+                        me.progress = true;
+                    })
+                    .on( 'uploadFinished', function() {
+                        me.progress = false;
+                    });
+
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+
+                // 缓存分好片的文件。
+                this.stack = [];
+
+                // 缓存即将上传的文件。
+                this.pending = [];
+
+                // 跟踪还有多少分片在上传中但是没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+
+                owner.on( 'uploadComplete', function( file ) {
+
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+
+            reset: function() {
+                this.request( 'stop-upload', true );
+                this.runing = false;
+                this.pool = [];
+                this.stack = [];
+                this.pending = [];
+                this.remaning = 0;
+                this._trigged = false;
+                this._promise = null;
+            },
+
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             *
+             * 可以指定开始某一个文件。
+             * @grammar upload() => undefined
+             * @grammar upload( file | fileId) => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            startUpload: function(file) {
+                var me = this;
+
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+
+                // 如果指定了开始某个文件,则只开始指定文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        $.each( me.pool, function( _, v ) {
+
+                            // 之前暂停过。
+                            if (v.file !== file) {
+                                return;
+                            }
+
+                            v.transport && v.transport.send();
+                        });
+
+                        file.setStatus( Status.QUEUED );
+                    } else if (file.getStatus() === Status.PROGRESS) {
+                        return;
+                    } else {
+                        file.setStatus( Status.QUEUED );
+                    }
+                } else {
+                    $.each( me.request( 'get-files', [ Status.INITED ] ), function() {
+                        this.setStatus( Status.QUEUED );
+                    });
+                }
+
+                if ( me.runing ) {
+                    return;
+                }
+
+                me.runing = true;
+
+                var files = [];
+
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        files.push(file);
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+
+                var file;
+                while ( (file = files.shift()) ) {
+                    file.setStatus( Status.PROGRESS );
+                }
+
+                file || $.each( me.request( 'get-files',
+                        Status.INTERRUPT ), function() {
+                    this.setStatus( Status.PROGRESS );
+                });
+
+                me._trigged = false;
+                Base.nextTick( me.__tick );
+                me.owner.trigger('startUpload');
+            },
+
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             *
+             * 如果第一个参数是文件,则只暂停指定文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @grammar stop( file ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stopUpload: function( file, interrupt ) {
+                var me = this;
+
+                if (file === true) {
+                    interrupt = file;
+                    file = null;
+                }
+
+                if ( me.runing === false ) {
+                    return;
+                }
+
+                // 如果只是暂停某个文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if ( file.getStatus() !== Status.PROGRESS &&
+                            file.getStatus() !== Status.QUEUED ) {
+                        return;
+                    }
+
+                    file.setStatus( Status.INTERRUPT );
+                    $.each( me.pool, function( _, v ) {
+
+                        // 只 abort 指定的文件。
+                        if (v.file !== file) {
+                            return;
+                        }
+
+                        v.transport && v.transport.abort();
+                        me._putback(v);
+                        me._popBlock(v);
+                    });
+
+                    return Base.nextTick( me.__tick );
+                }
+
+                me.runing = false;
+
+                if (this._promise && this._promise.file) {
+                    this._promise.file.setStatus( Status.INTERRUPT );
+                }
+
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+
+                me.owner.trigger('stopUpload');
+            },
+
+            /**
+             * @method cancelFile
+             * @grammar cancelFile( file ) => undefined
+             * @grammar cancelFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 标记文件状态为已取消, 同时将中断文件传输。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.cancelFile( file );
+             * })
+             */
+            cancelFile: function( file ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                file.setStatus( Status.CANCELLED );
+                this.owner.trigger( 'fileDequeued', file );
+            },
+
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.progress;
+            },
+
+            _getStats: function() {
+                return this.request('get-stats');
+            },
+
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                this.owner.trigger( 'uploadSkip', file );
+            },
+
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+
+                    fn = function( val ) {
+                        me._promise = null;
+
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me._getStats().numOfQueue &&
+                    !me._getStats().numofInterrupt ) {
+                    me.runing = false;
+
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+
+            _putback: function(block) {
+                var idx;
+
+                block.cuted.unshift(block);
+                idx = this.stack.indexOf(block.cuted);
+
+                if (!~idx) {
+                    this.stack.unshift(block.cuted);
+                }
+            },
+
+            _getStack: function() {
+                var i = 0,
+                    act;
+
+                while ( (act = this.stack[ i++ ]) ) {
+                    if ( act.has() && act.file.getStatus() === Status.PROGRESS ) {
+                        return act;
+                    } else if (!act.has() ||
+                            act.file.getStatus() !== Status.PROGRESS &&
+                            act.file.getStatus() !== Status.INTERRUPT ) {
+
+                        // 把已经处理完了的,或者,状态为非 progress(上传中)、
+                        // interupt(暂停中) 的移除。
+                        this.stack.splice( --i, 1 );
+                    }
+                }
+
+                return null;
+            },
+
+            _nextBlock: function() {
+                var me = this,
+                    opts = me.options,
+                    act, next, done, preparing;
+
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( (act = this._getStack()) ) {
+
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+
+                    return act.shift();
+
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me._getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me.stack.push(act);
+                        return act.shift();
+                    };
+
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    if ( isPromise( next) ) {
+                        preparing = next.file;
+                        next = next[ next.pipe ? 'pipe' : 'then' ]( done );
+                        next.file = preparing;
+                        return next;
+                    }
+
+                    return done( next );
+                }
+            },
+
+
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.PROGRESS ||
+                            file.getStatus() === Status.INTERRUPT ) {
+                            return file;
+                        }
+
+                        return me._finishFile( file );
+                    });
+
+                    me.owner.trigger( 'uploadStart', file );
+                    file.setStatus( Status.PROGRESS );
+
+                    promise.file = file;
+
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+
+                    pending.push( promise );
+                }
+            },
+
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+
+                // 有可能在 before-send-file 的 promise 期间改变了文件状态。
+                // 如:暂停,取消
+                // 我们不能中断 promise, 但是可以在 promise 完后,不做上传操作。
+                if ( file.getStatus() !== Status.PROGRESS ) {
+
+                    // 如果是中断,则还需要放回去。
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        me._putback(block);
+                    }
+
+                    return;
+                }
+
+                me.pool.push( block );
+                me.remaning++;
+
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me.updateFileProgress( file );
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+
+
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @param {Object} headers 可以扩展此对象来控制上传头部。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+
+
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+
+                block.transport = tr;
+
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    block.percentage = percentage;
+                    me.updateFileProgress( file );
+                });
+
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+
+                    return reject;
+                };
+
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+
+                        block.retried++;
+                        tr.send();
+
+                    } else {
+
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            },
+
+            updateFileProgress: function(file) {
+                var totalPercent = 0,
+                    uploaded = 0;
+
+                if (!file.blocks) {
+                    return;
+                }
+
+                $.each( file.blocks, function( _, v ) {
+                    uploaded += (v.percentage || 0) * (v.end - v.start);
+                });
+
+                totalPercent = uploaded / file.size;
+                this.owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+            }
+
+        });
+    });
+    /**
+     * @fileOverview 日志组件,主要用来收集错误信息,可以帮助 webuploader 更好的定位问题和发展。
+     *
+     * 如果您不想要启用此功能,请在打包的时候去掉 log 模块。
+     *
+     * 或者可以在初始化的时候通过 options.disableWidgets 属性禁用。
+     *
+     * 如:
+     * WebUploader.create({
+     *     ...
+     *
+     *     disableWidgets: 'log',
+     *
+     *     ...
+     * })
+     */
+    define('widgets/log',[
+        'base',
+        'uploader',
+        'widgets/widget'
+    ], function( Base, Uploader ) {
+        var $ = Base.$,
+            logUrl = ' http://static.tieba.baidu.com/tb/pms/img/st.gif??',
+            product = (location.hostname || location.host || 'protected').toLowerCase(),
+
+            // 只针对 baidu 内部产品用户做统计功能。
+            enable = product && /baidu/i.exec(product),
+            base;
+
+        if (!enable) {
+            return;
+        }
+
+        base = {
+            dv: 3,
+            master: 'webuploader',
+            online: /test/.exec(product) ? 0 : 1,
+            module: '',
+            product: product,
+            type: 0
+        };
+
+        function send(data) {
+            var obj = $.extend({}, base, data),
+                url = logUrl.replace(/^(.*)\?/, '$1' + $.param( obj )),
+                image = new Image();
+
+            image.src = url;
+        }
+
+        return Uploader.register({
+            name: 'log',
+
+            init: function() {
+                var owner = this.owner,
+                    count = 0,
+                    size = 0;
+
+                owner
+                    .on('error', function(code) {
+                        send({
+                            type: 2,
+                            c_error_code: code
+                        });
+                    })
+                    .on('uploadError', function(file, reason) {
+                        send({
+                            type: 2,
+                            c_error_code: 'UPLOAD_ERROR',
+                            c_reason: '' + reason
+                        });
+                    })
+                    .on('uploadComplete', function(file) {
+                        count++;
+                        size += file.size;
+                    }).
+                    on('uploadFinished', function() {
+                        send({
+                            c_count: count,
+                            c_size: size
+                        });
+                        count = size = 0;
+                    });
+
+                send({
+                    c_usage: 1
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+
+        function CompBase( owner, runtime ) {
+
+            this.owner = owner;
+            this.options = owner.options;
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var type = 'html5',
+            components = {};
+
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destroy = this.destroy;
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+
+            me.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+        }
+
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+
+        });
+
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+
+                blob = slice.call( blob, start, end );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var $ = Base.$;
+
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    label = this.label = $( document.createElement('label') ),
+                    input =  this.input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+
+                label.on( 'click', function() {
+                    input.trigger('click');
+                });
+
+                label.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+
+                    input.attr( 'accept', arr.join(',') );
+                }
+
+                container.append( input );
+                container.append( label );
+
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+
+                    me.files = e.target.files;
+
+                    // reset input
+                    clone = this.cloneNode( true );
+                    clone.value = null;
+                    this.parentNode.replaceChild( clone, this );
+
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+
+                    owner.trigger('change');
+                });
+
+                label.on( 'mouseenter mouseleave', mouseHandler );
+
+            },
+
+
+            getFiles: function() {
+                return this.files;
+            },
+
+            destroy: function() {
+                this.input.off();
+                this.label.off();
+            }
+        });
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/util',[
+        'base'
+    ], function( Base ) {
+
+        var urlAPI = window.createObjectURL && window ||
+                window.URL && URL.revokeObjectURL && URL ||
+                window.webkitURL,
+            createObjectURL = Base.noop,
+            revokeObjectURL = createObjectURL;
+
+        if ( urlAPI ) {
+
+            // 更安全的方式调用,比如android里面就能把context改成其他的对象。
+            createObjectURL = function() {
+                return urlAPI.createObjectURL.apply( urlAPI, arguments );
+            };
+
+            revokeObjectURL = function() {
+                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
+            };
+        }
+
+        return {
+            createObjectURL: createObjectURL,
+            revokeObjectURL: revokeObjectURL,
+
+            dataURL2Blob: function( dataURI ) {
+                var byteStr, intArray, ab, i, mimetype, parts;
+
+                parts = dataURI.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+
+                ab = new ArrayBuffer( byteStr.length );
+                intArray = new Uint8Array( ab );
+
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+
+                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
+
+                return this.arrayBufferToBlob( ab, mimetype );
+            },
+
+            dataURL2ArrayBuffer: function( dataURI ) {
+                var byteStr, intArray, i, parts;
+
+                parts = dataURI.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+
+                intArray = new Uint8Array( byteStr.length );
+
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+
+                return intArray.buffer;
+            },
+
+            arrayBufferToBlob: function( buffer, type ) {
+                var builder = window.BlobBuilder || window.WebKitBlobBuilder,
+                    bb;
+
+                // android不支持直接new Blob, 只能借助blobbuilder.
+                if ( builder ) {
+                    bb = new builder();
+                    bb.append( buffer );
+                    return bb.getBlob( type );
+                }
+
+                return new Blob([ buffer ], type ? { type: type } : {} );
+            },
+
+            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
+            // 你得到的结果是png.
+            canvasToDataUrl: function( canvas, type, quality ) {
+                return canvas.toDataURL( type, quality / 100 );
+            },
+
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            parseMeta: function( blob, callback ) {
+                callback( false, {});
+            },
+
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            updateImageHead: function( data ) {
+                return data;
+            }
+        };
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/imagemeta',[
+        'runtime/html5/util'
+    ], function( Util ) {
+
+        var api;
+
+        api = {
+            parsers: {
+                0xffe1: []
+            },
+
+            maxMetaDataSize: 262144,
+
+            parse: function( blob, cb ) {
+                var me = this,
+                    fr = new FileReader();
+
+                fr.onload = function() {
+                    cb( false, me._parse( this.result ) );
+                    fr = fr.onload = fr.onerror = null;
+                };
+
+                fr.onerror = function( e ) {
+                    cb( e.message );
+                    fr = fr.onload = fr.onerror = null;
+                };
+
+                blob = blob.slice( 0, me.maxMetaDataSize );
+                fr.readAsArrayBuffer( blob.getSource() );
+            },
+
+            _parse: function( buffer, noParse ) {
+                if ( buffer.byteLength < 6 ) {
+                    return;
+                }
+
+                var dataview = new DataView( buffer ),
+                    offset = 2,
+                    maxOffset = dataview.byteLength - 4,
+                    headLength = offset,
+                    ret = {},
+                    markerBytes, markerLength, parsers, i;
+
+                if ( dataview.getUint16( 0 ) === 0xffd8 ) {
+
+                    while ( offset < maxOffset ) {
+                        markerBytes = dataview.getUint16( offset );
+
+                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
+                                markerBytes === 0xfffe ) {
+
+                            markerLength = dataview.getUint16( offset + 2 ) + 2;
+
+                            if ( offset + markerLength > dataview.byteLength ) {
+                                break;
+                            }
+
+                            parsers = api.parsers[ markerBytes ];
+
+                            if ( !noParse && parsers ) {
+                                for ( i = 0; i < parsers.length; i += 1 ) {
+                                    parsers[ i ].call( api, dataview, offset,
+                                            markerLength, ret );
+                                }
+                            }
+
+                            offset += markerLength;
+                            headLength = offset;
+                        } else {
+                            break;
+                        }
+                    }
+
+                    if ( headLength > 6 ) {
+                        if ( buffer.slice ) {
+                            ret.imageHead = buffer.slice( 2, headLength );
+                        } else {
+                            // Workaround for IE10, which does not yet
+                            // support ArrayBuffer.slice:
+                            ret.imageHead = new Uint8Array( buffer )
+                                    .subarray( 2, headLength );
+                        }
+                    }
+                }
+
+                return ret;
+            },
+
+            updateImageHead: function( buffer, head ) {
+                var data = this._parse( buffer, true ),
+                    buf1, buf2, bodyoffset;
+
+
+                bodyoffset = 2;
+                if ( data.imageHead ) {
+                    bodyoffset = 2 + data.imageHead.byteLength;
+                }
+
+                if ( buffer.slice ) {
+                    buf2 = buffer.slice( bodyoffset );
+                } else {
+                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
+                }
+
+                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
+
+                buf1[ 0 ] = 0xFF;
+                buf1[ 1 ] = 0xD8;
+                buf1.set( new Uint8Array( head ), 2 );
+                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
+
+                return buf1.buffer;
+            }
+        };
+
+        Util.parseMeta = function() {
+            return api.parse.apply( api, arguments );
+        };
+
+        Util.updateImageHead = function() {
+            return api.updateImageHead.apply( api, arguments );
+        };
+
+        return api;
+    });
+    /**
+     * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
+     * 暂时项目中只用了orientation.
+     *
+     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
+     * @fileOverview EXIF解析
+     */
+
+    // Sample
+    // ====================================
+    // Make : Apple
+    // Model : iPhone 4S
+    // Orientation : 1
+    // XResolution : 72 [72/1]
+    // YResolution : 72 [72/1]
+    // ResolutionUnit : 2
+    // Software : QuickTime 7.7.1
+    // DateTime : 2013:09:01 22:53:55
+    // ExifIFDPointer : 190
+    // ExposureTime : 0.058823529411764705 [1/17]
+    // FNumber : 2.4 [12/5]
+    // ExposureProgram : Normal program
+    // ISOSpeedRatings : 800
+    // ExifVersion : 0220
+    // DateTimeOriginal : 2013:09:01 22:52:51
+    // DateTimeDigitized : 2013:09:01 22:52:51
+    // ComponentsConfiguration : YCbCr
+    // ShutterSpeedValue : 4.058893515764426
+    // ApertureValue : 2.5260688216892597 [4845/1918]
+    // BrightnessValue : -0.3126686601998395
+    // MeteringMode : Pattern
+    // Flash : Flash did not fire, compulsory flash mode
+    // FocalLength : 4.28 [107/25]
+    // SubjectArea : [4 values]
+    // FlashpixVersion : 0100
+    // ColorSpace : 1
+    // PixelXDimension : 2448
+    // PixelYDimension : 3264
+    // SensingMethod : One-chip color area sensor
+    // ExposureMode : 0
+    // WhiteBalance : Auto white balance
+    // FocalLengthIn35mmFilm : 35
+    // SceneCaptureType : Standard
+    define('runtime/html5/imagemeta/exif',[
+        'base',
+        'runtime/html5/imagemeta'
+    ], function( Base, ImageMeta ) {
+
+        var EXIF = {};
+
+        EXIF.ExifMap = function() {
+            return this;
+        };
+
+        EXIF.ExifMap.prototype.map = {
+            'Orientation': 0x0112
+        };
+
+        EXIF.ExifMap.prototype.get = function( id ) {
+            return this[ id ] || this[ this.map[ id ] ];
+        };
+
+        EXIF.exifTagTypes = {
+            // byte, 8-bit unsigned int:
+            1: {
+                getValue: function( dataView, dataOffset ) {
+                    return dataView.getUint8( dataOffset );
+                },
+                size: 1
+            },
+
+            // ascii, 8-bit byte:
+            2: {
+                getValue: function( dataView, dataOffset ) {
+                    return String.fromCharCode( dataView.getUint8( dataOffset ) );
+                },
+                size: 1,
+                ascii: true
+            },
+
+            // short, 16 bit int:
+            3: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint16( dataOffset, littleEndian );
+                },
+                size: 2
+            },
+
+            // long, 32 bit int:
+            4: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+
+            // rational = two long values,
+            // first is numerator, second is denominator:
+            5: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian ) /
+                        dataView.getUint32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            },
+
+            // slong, 32 bit signed int:
+            9: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+
+            // srational, two slongs, first is numerator, second is denominator:
+            10: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian ) /
+                        dataView.getInt32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            }
+        };
+
+        // undefined, 8-bit byte, value depending on field:
+        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
+
+        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
+                littleEndian ) {
+
+            var tagType = EXIF.exifTagTypes[ type ],
+                tagSize, dataOffset, values, i, str, c;
+
+            if ( !tagType ) {
+                Base.log('Invalid Exif data: Invalid tag type.');
+                return;
+            }
+
+            tagSize = tagType.size * length;
+
+            // Determine if the value is contained in the dataOffset bytes,
+            // or if the value at the dataOffset is a pointer to the actual data:
+            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
+                    littleEndian ) : (offset + 8);
+
+            if ( dataOffset + tagSize > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid data offset.');
+                return;
+            }
+
+            if ( length === 1 ) {
+                return tagType.getValue( dataView, dataOffset, littleEndian );
+            }
+
+            values = [];
+
+            for ( i = 0; i < length; i += 1 ) {
+                values[ i ] = tagType.getValue( dataView,
+                        dataOffset + i * tagType.size, littleEndian );
+            }
+
+            if ( tagType.ascii ) {
+                str = '';
+
+                // Concatenate the chars:
+                for ( i = 0; i < values.length; i += 1 ) {
+                    c = values[ i ];
+
+                    // Ignore the terminating NULL byte(s):
+                    if ( c === '\u0000' ) {
+                        break;
+                    }
+                    str += c;
+                }
+
+                return str;
+            }
+            return values;
+        };
+
+        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
+                data ) {
+
+            var tag = dataView.getUint16( offset, littleEndian );
+            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
+                    dataView.getUint16( offset + 2, littleEndian ),    // tag type
+                    dataView.getUint32( offset + 4, littleEndian ),    // tag length
+                    littleEndian );
+        };
+
+        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
+                littleEndian, data ) {
+
+            var tagsNumber, dirEndOffset, i;
+
+            if ( dirOffset + 6 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory offset.');
+                return;
+            }
+
+            tagsNumber = dataView.getUint16( dirOffset, littleEndian );
+            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
+
+            if ( dirEndOffset + 4 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory size.');
+                return;
+            }
+
+            for ( i = 0; i < tagsNumber; i += 1 ) {
+                this.parseExifTag( dataView, tiffOffset,
+                        dirOffset + 2 + 12 * i,    // tag offset
+                        littleEndian, data );
+            }
+
+            // Return the offset to the next directory:
+            return dataView.getUint32( dirEndOffset, littleEndian );
+        };
+
+        // EXIF.getExifThumbnail = function(dataView, offset, length) {
+        //     var hexData,
+        //         i,
+        //         b;
+        //     if (!length || offset + length > dataView.byteLength) {
+        //         Base.log('Invalid Exif data: Invalid thumbnail data.');
+        //         return;
+        //     }
+        //     hexData = [];
+        //     for (i = 0; i < length; i += 1) {
+        //         b = dataView.getUint8(offset + i);
+        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));
+        //     }
+        //     return 'data:image/jpeg,%' + hexData.join('%');
+        // };
+
+        EXIF.parseExifData = function( dataView, offset, length, data ) {
+
+            var tiffOffset = offset + 10,
+                littleEndian, dirOffset;
+
+            // Check for the ASCII code for "Exif" (0x45786966):
+            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
+                // No Exif data, might be XMP data instead
+                return;
+            }
+            if ( tiffOffset + 8 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid segment size.');
+                return;
+            }
+
+            // Check for the two null bytes:
+            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
+                Base.log('Invalid Exif data: Missing byte alignment offset.');
+                return;
+            }
+
+            // Check the byte alignment:
+            switch ( dataView.getUint16( tiffOffset ) ) {
+                case 0x4949:
+                    littleEndian = true;
+                    break;
+
+                case 0x4D4D:
+                    littleEndian = false;
+                    break;
+
+                default:
+                    Base.log('Invalid Exif data: Invalid byte alignment marker.');
+                    return;
+            }
+
+            // Check for the TIFF tag marker (0x002A):
+            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
+                Base.log('Invalid Exif data: Missing TIFF marker.');
+                return;
+            }
+
+            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
+            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
+            // Create the exif object to store the tags:
+            data.exif = new EXIF.ExifMap();
+            // Parse the tags of the main image directory and retrieve the
+            // offset to the next directory, usually the thumbnail directory:
+            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
+                    tiffOffset + dirOffset, littleEndian, data );
+
+            // 尝试读取缩略图
+            // if ( dirOffset ) {
+            //     thumbnailData = {exif: {}};
+            //     dirOffset = EXIF.parseExifTags(
+            //         dataView,
+            //         tiffOffset,
+            //         tiffOffset + dirOffset,
+            //         littleEndian,
+            //         thumbnailData
+            //     );
+
+            //     // Check for JPEG Thumbnail offset:
+            //     if (thumbnailData.exif[0x0201]) {
+            //         data.exif.Thumbnail = EXIF.getExifThumbnail(
+            //             dataView,
+            //             tiffOffset + thumbnailData.exif[0x0201],
+            //             thumbnailData.exif[0x0202] // Thumbnail data length
+            //         );
+            //     }
+            // }
+        };
+
+        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
+        return EXIF;
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('runtime/html5/image',[
+        'base',
+        'runtime/html5/runtime',
+        'runtime/html5/util'
+    ], function( Base, Html5Runtime, Util ) {
+
+        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
+
+        return Html5Runtime.register( 'Image', {
+
+            // flag: 标记是否被修改过。
+            modified: false,
+
+            init: function() {
+                var me = this,
+                    img = new Image();
+
+                img.onload = function() {
+
+                    me._info = {
+                        type: me.type,
+                        width: this.width,
+                        height: this.height
+                    };
+
+                    // 读取meta信息。
+                    if ( !me._metas && 'image/jpeg' === me.type ) {
+                        Util.parseMeta( me._blob, function( error, ret ) {
+                            me._metas = ret;
+                            me.owner.trigger('load');
+                        });
+                    } else {
+                        me.owner.trigger('load');
+                    }
+                };
+
+                img.onerror = function() {
+                    me.owner.trigger('error');
+                };
+
+                me._img = img;
+            },
+
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    img = me._img;
+
+                me._blob = blob;
+                me.type = blob.type;
+                img.src = Util.createObjectURL( blob.getSource() );
+                me.owner.once( 'load', function() {
+                    Util.revokeObjectURL( img.src );
+                });
+            },
+
+            resize: function( width, height ) {
+                var canvas = this._canvas ||
+                        (this._canvas = document.createElement('canvas'));
+
+                this._resize( this._img, canvas, width, height );
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger( 'complete', 'resize' );
+            },
+
+            crop: function( x, y, w, h, s ) {
+                var cvs = this._canvas ||
+                        (this._canvas = document.createElement('canvas')),
+                    opts = this.options,
+                    img = this._img,
+                    iw = img.naturalWidth,
+                    ih = img.naturalHeight,
+                    orientation = this.getOrientation();
+
+                s = s || 1;
+
+                // todo 解决 orientation 的问题。
+                // values that require 90 degree rotation
+                // if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+
+                //     switch ( orientation ) {
+                //         case 6:
+                //             tmp = x;
+                //             x = y;
+                //             y = iw * s - tmp - w;
+                //             console.log(ih * s, tmp, w)
+                //             break;
+                //     }
+
+                //     (w ^= h, h ^= w, w ^= h);
+                // }
+
+                cvs.width = w;
+                cvs.height = h;
+
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+                this._renderImageToCanvas( cvs, img, -x, -y, iw * s, ih * s );
+
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger( 'complete', 'crop' );
+            },
+
+            getAsBlob: function( type ) {
+                var blob = this._blob,
+                    opts = this.options,
+                    canvas;
+
+                type = type || this.type;
+
+                // blob需要重新生成。
+                if ( this.modified || this.type !== type ) {
+                    canvas = this._canvas;
+
+                    if ( type === 'image/jpeg' ) {
+
+                        blob = Util.canvasToDataUrl( canvas, type, opts.quality );
+
+                        if ( opts.preserveHeaders && this._metas &&
+                                this._metas.imageHead ) {
+
+                            blob = Util.dataURL2ArrayBuffer( blob );
+                            blob = Util.updateImageHead( blob,
+                                    this._metas.imageHead );
+                            blob = Util.arrayBufferToBlob( blob, type );
+                            return blob;
+                        }
+                    } else {
+                        blob = Util.canvasToDataUrl( canvas, type );
+                    }
+
+                    blob = Util.dataURL2Blob( blob );
+                }
+
+                return blob;
+            },
+
+            getAsDataUrl: function( type ) {
+                var opts = this.options;
+
+                type = type || this.type;
+
+                if ( type === 'image/jpeg' ) {
+                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );
+                } else {
+                    return this._canvas.toDataURL( type );
+                }
+            },
+
+            getOrientation: function() {
+                return this._metas && this._metas.exif &&
+                        this._metas.exif.get('Orientation') || 1;
+            },
+
+            info: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+
+                // getter
+                return this._info;
+            },
+
+            meta: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+
+                // getter
+                return this._meta;
+            },
+
+            destroy: function() {
+                var canvas = this._canvas;
+                this._img.onload = null;
+
+                if ( canvas ) {
+                    canvas.getContext('2d')
+                            .clearRect( 0, 0, canvas.width, canvas.height );
+                    canvas.width = canvas.height = 0;
+                    this._canvas = null;
+                }
+
+                // 释放内存。非常重要,否则释放不了image的内存。
+                this._img.src = BLANK;
+                this._img = this._blob = null;
+            },
+
+            _resize: function( img, cvs, width, height ) {
+                var opts = this.options,
+                    naturalWidth = img.width,
+                    naturalHeight = img.height,
+                    orientation = this.getOrientation(),
+                    scale, w, h, x, y;
+
+                // values that require 90 degree rotation
+                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+
+                    // 交换width, height的值。
+                    width ^= height;
+                    height ^= width;
+                    width ^= height;
+                }
+
+                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
+                        height / naturalHeight );
+
+                // 不允许放大。
+                opts.allowMagnify || (scale = Math.min( 1, scale ));
+
+                w = naturalWidth * scale;
+                h = naturalHeight * scale;
+
+                if ( opts.crop ) {
+                    cvs.width = width;
+                    cvs.height = height;
+                } else {
+                    cvs.width = w;
+                    cvs.height = h;
+                }
+
+                x = (cvs.width - w) / 2;
+                y = (cvs.height - h) / 2;
+
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+
+                this._renderImageToCanvas( cvs, img, x, y, w, h );
+            },
+
+            _rotate2Orientaion: function( canvas, orientation ) {
+                var width = canvas.width,
+                    height = canvas.height,
+                    ctx = canvas.getContext('2d');
+
+                switch ( orientation ) {
+                    case 5:
+                    case 6:
+                    case 7:
+                    case 8:
+                        canvas.width = height;
+                        canvas.height = width;
+                        break;
+                }
+
+                switch ( orientation ) {
+                    case 2:    // horizontal flip
+                        ctx.translate( width, 0 );
+                        ctx.scale( -1, 1 );
+                        break;
+
+                    case 3:    // 180 rotate left
+                        ctx.translate( width, height );
+                        ctx.rotate( Math.PI );
+                        break;
+
+                    case 4:    // vertical flip
+                        ctx.translate( 0, height );
+                        ctx.scale( 1, -1 );
+                        break;
+
+                    case 5:    // vertical flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.scale( 1, -1 );
+                        break;
+
+                    case 6:    // 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( 0, -height );
+                        break;
+
+                    case 7:    // horizontal flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( width, -height );
+                        ctx.scale( -1, 1 );
+                        break;
+
+                    case 8:    // 90 rotate left
+                        ctx.rotate( -0.5 * Math.PI );
+                        ctx.translate( -width, 0 );
+                        break;
+                }
+            },
+
+            // https://github.com/stomita/ios-imagefile-megapixel/
+            // blob/master/src/megapix-image.js
+            _renderImageToCanvas: (function() {
+
+                // 如果不是ios, 不需要这么复杂!
+                if ( !Base.os.ios ) {
+                    return function( canvas ) {
+                        var args = Base.slice( arguments, 1 ),
+                            ctx = canvas.getContext('2d');
+
+                        ctx.drawImage.apply( ctx, args );
+                    };
+                }
+
+                /**
+                 * Detecting vertical squash in loaded image.
+                 * Fixes a bug which squash image vertically while drawing into
+                 * canvas for some images.
+                 */
+                function detectVerticalSquash( img, iw, ih ) {
+                    var canvas = document.createElement('canvas'),
+                        ctx = canvas.getContext('2d'),
+                        sy = 0,
+                        ey = ih,
+                        py = ih,
+                        data, alpha, ratio;
+
+
+                    canvas.width = 1;
+                    canvas.height = ih;
+                    ctx.drawImage( img, 0, 0 );
+                    data = ctx.getImageData( 0, 0, 1, ih ).data;
+
+                    // search image edge pixel position in case
+                    // it is squashed vertically.
+                    while ( py > sy ) {
+                        alpha = data[ (py - 1) * 4 + 3 ];
+
+                        if ( alpha === 0 ) {
+                            ey = py;
+                        } else {
+                            sy = py;
+                        }
+
+                        py = (ey + sy) >> 1;
+                    }
+
+                    ratio = (py / ih);
+                    return (ratio === 0) ? 1 : ratio;
+                }
+
+                // fix ie7 bug
+                // http://stackoverflow.com/questions/11929099/
+                // html5-canvas-drawimage-ratio-bug-ios
+                if ( Base.os.ios >= 7 ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        var iw = img.naturalWidth,
+                            ih = img.naturalHeight,
+                            vertSquashRatio = detectVerticalSquash( img, iw, ih );
+
+                        return canvas.getContext('2d').drawImage( img, 0, 0,
+                                iw * vertSquashRatio, ih * vertSquashRatio,
+                                x, y, w, h );
+                    };
+                }
+
+                /**
+                 * Detect subsampling in loaded image.
+                 * In iOS, larger images than 2M pixels may be
+                 * subsampled in rendering.
+                 */
+                function detectSubsampling( img ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        canvas, ctx;
+
+                    // subsampling may happen overmegapixel image
+                    if ( iw * ih > 1024 * 1024 ) {
+                        canvas = document.createElement('canvas');
+                        canvas.width = canvas.height = 1;
+                        ctx = canvas.getContext('2d');
+                        ctx.drawImage( img, -iw + 1, 0 );
+
+                        // subsampled image becomes half smaller in rendering size.
+                        // check alpha channel value to confirm image is covering
+                        // edge pixel or not. if alpha value is 0
+                        // image is not covering, hence subsampled.
+                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
+                    } else {
+                        return false;
+                    }
+                }
+
+
+                return function( canvas, img, x, y, width, height ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        ctx = canvas.getContext('2d'),
+                        subsampled = detectSubsampling( img ),
+                        doSquash = this.type === 'image/jpeg',
+                        d = 1024,
+                        sy = 0,
+                        dy = 0,
+                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
+
+                    if ( subsampled ) {
+                        iw /= 2;
+                        ih /= 2;
+                    }
+
+                    ctx.save();
+                    tmpCanvas = document.createElement('canvas');
+                    tmpCanvas.width = tmpCanvas.height = d;
+
+                    tmpCtx = tmpCanvas.getContext('2d');
+                    vertSquashRatio = doSquash ?
+                            detectVerticalSquash( img, iw, ih ) : 1;
+
+                    dw = Math.ceil( d * width / iw );
+                    dh = Math.ceil( d * height / ih / vertSquashRatio );
+
+                    while ( sy < ih ) {
+                        sx = 0;
+                        dx = 0;
+                        while ( sx < iw ) {
+                            tmpCtx.clearRect( 0, 0, d, d );
+                            tmpCtx.drawImage( img, -sx, -sy );
+                            ctx.drawImage( tmpCanvas, 0, 0, d, d,
+                                    x + dx, y + dy, dw, dh );
+                            sx += d;
+                            dx += dw;
+                        }
+                        sy += d;
+                        dy += dh;
+                    }
+                    ctx.restore();
+                    tmpCanvas = tmpCtx = null;
+                };
+            })()
+        });
+    });
+    /**
+     * 这个方式性能不行,但是可以解决android里面的toDataUrl的bug
+     * android里面toDataUrl('image/jpege')得到的结果却是png.
+     *
+     * 所以这里没辙,只能借助这个工具
+     * @fileOverview jpeg encoder
+     */
+    define('runtime/html5/jpegencoder',[], function( require, exports, module ) {
+
+        /*
+          Copyright (c) 2008, Adobe Systems Incorporated
+          All rights reserved.
+
+          Redistribution and use in source and binary forms, with or without
+          modification, are permitted provided that the following conditions are
+          met:
+
+          * Redistributions of source code must retain the above copyright notice,
+            this list of conditions and the following disclaimer.
+
+          * Redistributions in binary form must reproduce the above copyright
+            notice, this list of conditions and the following disclaimer in the
+            documentation and/or other materials provided with the distribution.
+
+          * Neither the name of Adobe Systems Incorporated nor the names of its
+            contributors may be used to endorse or promote products derived from
+            this software without specific prior written permission.
+
+          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+          IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+          PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+          CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+          EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+          PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+          PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+          NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+          SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+        */
+        /*
+        JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009
+
+        Basic GUI blocking jpeg encoder
+        */
+
+        function JPEGEncoder(quality) {
+          var self = this;
+            var fround = Math.round;
+            var ffloor = Math.floor;
+            var YTable = new Array(64);
+            var UVTable = new Array(64);
+            var fdtbl_Y = new Array(64);
+            var fdtbl_UV = new Array(64);
+            var YDC_HT;
+            var UVDC_HT;
+            var YAC_HT;
+            var UVAC_HT;
+
+            var bitcode = new Array(65535);
+            var category = new Array(65535);
+            var outputfDCTQuant = new Array(64);
+            var DU = new Array(64);
+            var byteout = [];
+            var bytenew = 0;
+            var bytepos = 7;
+
+            var YDU = new Array(64);
+            var UDU = new Array(64);
+            var VDU = new Array(64);
+            var clt = new Array(256);
+            var RGB_YUV_TABLE = new Array(2048);
+            var currentQuality;
+
+            var ZigZag = [
+                     0, 1, 5, 6,14,15,27,28,
+                     2, 4, 7,13,16,26,29,42,
+                     3, 8,12,17,25,30,41,43,
+                     9,11,18,24,31,40,44,53,
+                    10,19,23,32,39,45,52,54,
+                    20,22,33,38,46,51,55,60,
+                    21,34,37,47,50,56,59,61,
+                    35,36,48,49,57,58,62,63
+                ];
+
+            var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
+            var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
+            var std_ac_luminance_values = [
+                    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
+                    0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
+                    0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
+                    0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
+                    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
+                    0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
+                    0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
+                    0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
+                    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
+                    0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
+                    0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
+                    0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
+                    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
+                    0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
+                    0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
+                    0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
+                    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
+                    0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
+                    0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
+                    0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+
+            var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
+            var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
+            var std_ac_chrominance_values = [
+                    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
+                    0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
+                    0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
+                    0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
+                    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
+                    0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
+                    0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
+                    0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
+                    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
+                    0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
+                    0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
+                    0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
+                    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
+                    0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
+                    0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
+                    0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
+                    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
+                    0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
+                    0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
+                    0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+
+            function initQuantTables(sf){
+                    var YQT = [
+                        16, 11, 10, 16, 24, 40, 51, 61,
+                        12, 12, 14, 19, 26, 58, 60, 55,
+                        14, 13, 16, 24, 40, 57, 69, 56,
+                        14, 17, 22, 29, 51, 87, 80, 62,
+                        18, 22, 37, 56, 68,109,103, 77,
+                        24, 35, 55, 64, 81,104,113, 92,
+                        49, 64, 78, 87,103,121,120,101,
+                        72, 92, 95, 98,112,100,103, 99
+                    ];
+
+                    for (var i = 0; i < 64; i++) {
+                        var t = ffloor((YQT[i]*sf+50)/100);
+                        if (t < 1) {
+                            t = 1;
+                        } else if (t > 255) {
+                            t = 255;
+                        }
+                        YTable[ZigZag[i]] = t;
+                    }
+                    var UVQT = [
+                        17, 18, 24, 47, 99, 99, 99, 99,
+                        18, 21, 26, 66, 99, 99, 99, 99,
+                        24, 26, 56, 99, 99, 99, 99, 99,
+                        47, 66, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99
+                    ];
+                    for (var j = 0; j < 64; j++) {
+                        var u = ffloor((UVQT[j]*sf+50)/100);
+                        if (u < 1) {
+                            u = 1;
+                        } else if (u > 255) {
+                            u = 255;
+                        }
+                        UVTable[ZigZag[j]] = u;
+                    }
+                    var aasf = [
+                        1.0, 1.387039845, 1.306562965, 1.175875602,
+                        1.0, 0.785694958, 0.541196100, 0.275899379
+                    ];
+                    var k = 0;
+                    for (var row = 0; row < 8; row++)
+                    {
+                        for (var col = 0; col < 8; col++)
+                        {
+                            fdtbl_Y[k]  = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            k++;
+                        }
+                    }
+                }
+
+                function computeHuffmanTbl(nrcodes, std_table){
+                    var codevalue = 0;
+                    var pos_in_table = 0;
+                    var HT = new Array();
+                    for (var k = 1; k <= 16; k++) {
+                        for (var j = 1; j <= nrcodes[k]; j++) {
+                            HT[std_table[pos_in_table]] = [];
+                            HT[std_table[pos_in_table]][0] = codevalue;
+                            HT[std_table[pos_in_table]][1] = k;
+                            pos_in_table++;
+                            codevalue++;
+                        }
+                        codevalue*=2;
+                    }
+                    return HT;
+                }
+
+                function initHuffmanTbl()
+                {
+                    YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
+                    UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
+                    YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
+                    UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
+                }
+
+                function initCategoryNumber()
+                {
+                    var nrlower = 1;
+                    var nrupper = 2;
+                    for (var cat = 1; cat <= 15; cat++) {
+                        //Positive numbers
+                        for (var nr = nrlower; nr<nrupper; nr++) {
+                            category[32767+nr] = cat;
+                            bitcode[32767+nr] = [];
+                            bitcode[32767+nr][1] = cat;
+                            bitcode[32767+nr][0] = nr;
+                        }
+                        //Negative numbers
+                        for (var nrneg =-(nrupper-1); nrneg<=-nrlower; nrneg++) {
+                            category[32767+nrneg] = cat;
+                            bitcode[32767+nrneg] = [];
+                            bitcode[32767+nrneg][1] = cat;
+                            bitcode[32767+nrneg][0] = nrupper-1+nrneg;
+                        }
+                        nrlower <<= 1;
+                        nrupper <<= 1;
+                    }
+                }
+
+                function initRGBYUVTable() {
+                    for(var i = 0; i < 256;i++) {
+                        RGB_YUV_TABLE[i]            =  19595 * i;
+                        RGB_YUV_TABLE[(i+ 256)>>0]  =  38470 * i;
+                        RGB_YUV_TABLE[(i+ 512)>>0]  =   7471 * i + 0x8000;
+                        RGB_YUV_TABLE[(i+ 768)>>0]  = -11059 * i;
+                        RGB_YUV_TABLE[(i+1024)>>0]  = -21709 * i;
+                        RGB_YUV_TABLE[(i+1280)>>0]  =  32768 * i + 0x807FFF;
+                        RGB_YUV_TABLE[(i+1536)>>0]  = -27439 * i;
+                        RGB_YUV_TABLE[(i+1792)>>0]  = - 5329 * i;
+                    }
+                }
+
+                // IO functions
+                function writeBits(bs)
+                {
+                    var value = bs[0];
+                    var posval = bs[1]-1;
+                    while ( posval >= 0 ) {
+                        if (value & (1 << posval) ) {
+                            bytenew |= (1 << bytepos);
+                        }
+                        posval--;
+                        bytepos--;
+                        if (bytepos < 0) {
+                            if (bytenew == 0xFF) {
+                                writeByte(0xFF);
+                                writeByte(0);
+                            }
+                            else {
+                                writeByte(bytenew);
+                            }
+                            bytepos=7;
+                            bytenew=0;
+                        }
+                    }
+                }
+
+                function writeByte(value)
+                {
+                    byteout.push(clt[value]); // write char directly instead of converting later
+                }
+
+                function writeWord(value)
+                {
+                    writeByte((value>>8)&0xFF);
+                    writeByte((value   )&0xFF);
+                }
+
+                // DCT & quantization core
+                function fDCTQuant(data, fdtbl)
+                {
+                    var d0, d1, d2, d3, d4, d5, d6, d7;
+                    /* Pass 1: process rows. */
+                    var dataOff=0;
+                    var i;
+                    var I8 = 8;
+                    var I64 = 64;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff+1];
+                        d2 = data[dataOff+2];
+                        d3 = data[dataOff+3];
+                        d4 = data[dataOff+4];
+                        d5 = data[dataOff+5];
+                        d6 = data[dataOff+6];
+                        d7 = data[dataOff+7];
+
+                        var tmp0 = d0 + d7;
+                        var tmp7 = d0 - d7;
+                        var tmp1 = d1 + d6;
+                        var tmp6 = d1 - d6;
+                        var tmp2 = d2 + d5;
+                        var tmp5 = d2 - d5;
+                        var tmp3 = d3 + d4;
+                        var tmp4 = d3 - d4;
+
+                        /* Even part */
+                        var tmp10 = tmp0 + tmp3;    /* phase 2 */
+                        var tmp13 = tmp0 - tmp3;
+                        var tmp11 = tmp1 + tmp2;
+                        var tmp12 = tmp1 - tmp2;
+
+                        data[dataOff] = tmp10 + tmp11; /* phase 3 */
+                        data[dataOff+4] = tmp10 - tmp11;
+
+                        var z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */
+                        data[dataOff+2] = tmp13 + z1; /* phase 5 */
+                        data[dataOff+6] = tmp13 - z1;
+
+                        /* Odd part */
+                        tmp10 = tmp4 + tmp5; /* phase 2 */
+                        tmp11 = tmp5 + tmp6;
+                        tmp12 = tmp6 + tmp7;
+
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */
+                        var z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */
+                        var z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */
+                        var z3 = tmp11 * 0.707106781; /* c4 */
+
+                        var z11 = tmp7 + z3;    /* phase 5 */
+                        var z13 = tmp7 - z3;
+
+                        data[dataOff+5] = z13 + z2; /* phase 6 */
+                        data[dataOff+3] = z13 - z2;
+                        data[dataOff+1] = z11 + z4;
+                        data[dataOff+7] = z11 - z4;
+
+                        dataOff += 8; /* advance pointer to next row */
+                    }
+
+                    /* Pass 2: process columns. */
+                    dataOff = 0;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff + 8];
+                        d2 = data[dataOff + 16];
+                        d3 = data[dataOff + 24];
+                        d4 = data[dataOff + 32];
+                        d5 = data[dataOff + 40];
+                        d6 = data[dataOff + 48];
+                        d7 = data[dataOff + 56];
+
+                        var tmp0p2 = d0 + d7;
+                        var tmp7p2 = d0 - d7;
+                        var tmp1p2 = d1 + d6;
+                        var tmp6p2 = d1 - d6;
+                        var tmp2p2 = d2 + d5;
+                        var tmp5p2 = d2 - d5;
+                        var tmp3p2 = d3 + d4;
+                        var tmp4p2 = d3 - d4;
+
+                        /* Even part */
+                        var tmp10p2 = tmp0p2 + tmp3p2;  /* phase 2 */
+                        var tmp13p2 = tmp0p2 - tmp3p2;
+                        var tmp11p2 = tmp1p2 + tmp2p2;
+                        var tmp12p2 = tmp1p2 - tmp2p2;
+
+                        data[dataOff] = tmp10p2 + tmp11p2; /* phase 3 */
+                        data[dataOff+32] = tmp10p2 - tmp11p2;
+
+                        var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781; /* c4 */
+                        data[dataOff+16] = tmp13p2 + z1p2; /* phase 5 */
+                        data[dataOff+48] = tmp13p2 - z1p2;
+
+                        /* Odd part */
+                        tmp10p2 = tmp4p2 + tmp5p2; /* phase 2 */
+                        tmp11p2 = tmp5p2 + tmp6p2;
+                        tmp12p2 = tmp6p2 + tmp7p2;
+
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433; /* c6 */
+                        var z2p2 = 0.541196100 * tmp10p2 + z5p2; /* c2-c6 */
+                        var z4p2 = 1.306562965 * tmp12p2 + z5p2; /* c2+c6 */
+                        var z3p2 = tmp11p2 * 0.707106781; /* c4 */
+
+                        var z11p2 = tmp7p2 + z3p2;  /* phase 5 */
+                        var z13p2 = tmp7p2 - z3p2;
+
+                        data[dataOff+40] = z13p2 + z2p2; /* phase 6 */
+                        data[dataOff+24] = z13p2 - z2p2;
+                        data[dataOff+ 8] = z11p2 + z4p2;
+                        data[dataOff+56] = z11p2 - z4p2;
+
+                        dataOff++; /* advance pointer to next column */
+                    }
+
+                    // Quantize/descale the coefficients
+                    var fDCTQuant;
+                    for (i=0; i<I64; ++i)
+                    {
+                        // Apply the quantization and scaling factor & Round to nearest integer
+                        fDCTQuant = data[i]*fdtbl[i];
+                        outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);
+                        //outputfDCTQuant[i] = fround(fDCTQuant);
+
+                    }
+                    return outputfDCTQuant;
+                }
+
+                function writeAPP0()
+                {
+                    writeWord(0xFFE0); // marker
+                    writeWord(16); // length
+                    writeByte(0x4A); // J
+                    writeByte(0x46); // F
+                    writeByte(0x49); // I
+                    writeByte(0x46); // F
+                    writeByte(0); // = "JFIF",'\0'
+                    writeByte(1); // versionhi
+                    writeByte(1); // versionlo
+                    writeByte(0); // xyunits
+                    writeWord(1); // xdensity
+                    writeWord(1); // ydensity
+                    writeByte(0); // thumbnwidth
+                    writeByte(0); // thumbnheight
+                }
+
+                function writeSOF0(width, height)
+                {
+                    writeWord(0xFFC0); // marker
+                    writeWord(17);   // length, truecolor YUV JPG
+                    writeByte(8);    // precision
+                    writeWord(height);
+                    writeWord(width);
+                    writeByte(3);    // nrofcomponents
+                    writeByte(1);    // IdY
+                    writeByte(0x11); // HVY
+                    writeByte(0);    // QTY
+                    writeByte(2);    // IdU
+                    writeByte(0x11); // HVU
+                    writeByte(1);    // QTU
+                    writeByte(3);    // IdV
+                    writeByte(0x11); // HVV
+                    writeByte(1);    // QTV
+                }
+
+                function writeDQT()
+                {
+                    writeWord(0xFFDB); // marker
+                    writeWord(132);    // length
+                    writeByte(0);
+                    for (var i=0; i<64; i++) {
+                        writeByte(YTable[i]);
+                    }
+                    writeByte(1);
+                    for (var j=0; j<64; j++) {
+                        writeByte(UVTable[j]);
+                    }
+                }
+
+                function writeDHT()
+                {
+                    writeWord(0xFFC4); // marker
+                    writeWord(0x01A2); // length
+
+                    writeByte(0); // HTYDCinfo
+                    for (var i=0; i<16; i++) {
+                        writeByte(std_dc_luminance_nrcodes[i+1]);
+                    }
+                    for (var j=0; j<=11; j++) {
+                        writeByte(std_dc_luminance_values[j]);
+                    }
+
+                    writeByte(0x10); // HTYACinfo
+                    for (var k=0; k<16; k++) {
+                        writeByte(std_ac_luminance_nrcodes[k+1]);
+                    }
+                    for (var l=0; l<=161; l++) {
+                        writeByte(std_ac_luminance_values[l]);
+                    }
+
+                    writeByte(1); // HTUDCinfo
+                    for (var m=0; m<16; m++) {
+                        writeByte(std_dc_chrominance_nrcodes[m+1]);
+                    }
+                    for (var n=0; n<=11; n++) {
+                        writeByte(std_dc_chrominance_values[n]);
+                    }
+
+                    writeByte(0x11); // HTUACinfo
+                    for (var o=0; o<16; o++) {
+                        writeByte(std_ac_chrominance_nrcodes[o+1]);
+                    }
+                    for (var p=0; p<=161; p++) {
+                        writeByte(std_ac_chrominance_values[p]);
+                    }
+                }
+
+                function writeSOS()
+                {
+                    writeWord(0xFFDA); // marker
+                    writeWord(12); // length
+                    writeByte(3); // nrofcomponents
+                    writeByte(1); // IdY
+                    writeByte(0); // HTY
+                    writeByte(2); // IdU
+                    writeByte(0x11); // HTU
+                    writeByte(3); // IdV
+                    writeByte(0x11); // HTV
+                    writeByte(0); // Ss
+                    writeByte(0x3f); // Se
+                    writeByte(0); // Bf
+                }
+
+                function processDU(CDU, fdtbl, DC, HTDC, HTAC){
+                    var EOB = HTAC[0x00];
+                    var M16zeroes = HTAC[0xF0];
+                    var pos;
+                    var I16 = 16;
+                    var I63 = 63;
+                    var I64 = 64;
+                    var DU_DCT = fDCTQuant(CDU, fdtbl);
+                    //ZigZag reorder
+                    for (var j=0;j<I64;++j) {
+                        DU[ZigZag[j]]=DU_DCT[j];
+                    }
+                    var Diff = DU[0] - DC; DC = DU[0];
+                    //Encode DC
+                    if (Diff==0) {
+                        writeBits(HTDC[0]); // Diff might be 0
+                    } else {
+                        pos = 32767+Diff;
+                        writeBits(HTDC[category[pos]]);
+                        writeBits(bitcode[pos]);
+                    }
+                    //Encode ACs
+                    var end0pos = 63; // was const... which is crazy
+                    for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {};
+                    //end0pos = first element in reverse order !=0
+                    if ( end0pos == 0) {
+                        writeBits(EOB);
+                        return DC;
+                    }
+                    var i = 1;
+                    var lng;
+                    while ( i <= end0pos ) {
+                        var startpos = i;
+                        for (; (DU[i]==0) && (i<=end0pos); ++i) {}
+                        var nrzeroes = i-startpos;
+                        if ( nrzeroes >= I16 ) {
+                            lng = nrzeroes>>4;
+                            for (var nrmarker=1; nrmarker <= lng; ++nrmarker)
+                                writeBits(M16zeroes);
+                            nrzeroes = nrzeroes&0xF;
+                        }
+                        pos = 32767+DU[i];
+                        writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
+                        writeBits(bitcode[pos]);
+                        i++;
+                    }
+                    if ( end0pos != I63 ) {
+                        writeBits(EOB);
+                    }
+                    return DC;
+                }
+
+                function initCharLookupTable(){
+                    var sfcc = String.fromCharCode;
+                    for(var i=0; i < 256; i++){ ///// ACHTUNG // 255
+                        clt[i] = sfcc(i);
+                    }
+                }
+
+                this.encode = function(image,quality) // image data object
+                {
+                    // var time_start = new Date().getTime();
+
+                    if(quality) setQuality(quality);
+
+                    // Initialize bit writer
+                    byteout = new Array();
+                    bytenew=0;
+                    bytepos=7;
+
+                    // Add JPEG headers
+                    writeWord(0xFFD8); // SOI
+                    writeAPP0();
+                    writeDQT();
+                    writeSOF0(image.width,image.height);
+                    writeDHT();
+                    writeSOS();
+
+
+                    // Encode 8x8 macroblocks
+                    var DCY=0;
+                    var DCU=0;
+                    var DCV=0;
+
+                    bytenew=0;
+                    bytepos=7;
+
+
+                    this.encode.displayName = "_encode_";
+
+                    var imageData = image.data;
+                    var width = image.width;
+                    var height = image.height;
+
+                    var quadWidth = width*4;
+                    var tripleWidth = width*3;
+
+                    var x, y = 0;
+                    var r, g, b;
+                    var start,p, col,row,pos;
+                    while(y < height){
+                        x = 0;
+                        while(x < quadWidth){
+                        start = quadWidth * y + x;
+                        p = start;
+                        col = -1;
+                        row = 0;
+
+                        for(pos=0; pos < 64; pos++){
+                            row = pos >> 3;// /8
+                            col = ( pos & 7 ) * 4; // %8
+                            p = start + ( row * quadWidth ) + col;
+
+                            if(y+row >= height){ // padding bottom
+                                p-= (quadWidth*(y+1+row-height));
+                            }
+
+                            if(x+col >= quadWidth){ // padding right
+                                p-= ((x+col) - quadWidth +4)
+                            }
+
+                            r = imageData[ p++ ];
+                            g = imageData[ p++ ];
+                            b = imageData[ p++ ];
+
+
+                            /* // calculate YUV values dynamically
+                            YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
+                            UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
+                            VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
+                            */
+
+                            // use lookup table (slightly faster)
+                            YDU[pos] = ((RGB_YUV_TABLE[r]             + RGB_YUV_TABLE[(g +  256)>>0] + RGB_YUV_TABLE[(b +  512)>>0]) >> 16)-128;
+                            UDU[pos] = ((RGB_YUV_TABLE[(r +  768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;
+                            VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;
+
+                        }
+
+                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
+                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
+                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
+                        x+=32;
+                        }
+                        y+=8;
+                    }
+
+
+                    ////////////////////////////////////////////////////////////////
+
+                    // Do the bit alignment of the EOI marker
+                    if ( bytepos >= 0 ) {
+                        var fillbits = [];
+                        fillbits[1] = bytepos+1;
+                        fillbits[0] = (1<<(bytepos+1))-1;
+                        writeBits(fillbits);
+                    }
+
+                    writeWord(0xFFD9); //EOI
+
+                    var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
+
+                    byteout = [];
+
+                    // benchmarking
+                    // var duration = new Date().getTime() - time_start;
+                    // console.log('Encoding time: '+ currentQuality + 'ms');
+                    //
+
+                    return jpegDataUri
+            }
+
+            function setQuality(quality){
+                if (quality <= 0) {
+                    quality = 1;
+                }
+                if (quality > 100) {
+                    quality = 100;
+                }
+
+                if(currentQuality == quality) return // don't recalc if unchanged
+
+                var sf = 0;
+                if (quality < 50) {
+                    sf = Math.floor(5000 / quality);
+                } else {
+                    sf = Math.floor(200 - quality*2);
+                }
+
+                initQuantTables(sf);
+                currentQuality = quality;
+                // console.log('Quality set to: '+quality +'%');
+            }
+
+            function init(){
+                // var time_start = new Date().getTime();
+                if(!quality) quality = 50;
+                // Create tables
+                initCharLookupTable()
+                initHuffmanTbl();
+                initCategoryNumber();
+                initRGBYUVTable();
+
+                setQuality(quality);
+                // var duration = new Date().getTime() - time_start;
+                // console.log('Initialization '+ duration + 'ms');
+            }
+
+            init();
+
+        };
+
+        JPEGEncoder.encode = function( data, quality ) {
+            var encoder = new JPEGEncoder( quality );
+
+            return encoder.encode( data );
+        }
+
+        return JPEGEncoder;
+    });
+    /**
+     * @fileOverview Fix android canvas.toDataUrl bug.
+     */
+    define('runtime/html5/androidpatch',[
+        'runtime/html5/util',
+        'runtime/html5/jpegencoder',
+        'base'
+    ], function( Util, encoder, Base ) {
+        var origin = Util.canvasToDataUrl,
+            supportJpeg;
+
+        Util.canvasToDataUrl = function( canvas, type, quality ) {
+            var ctx, w, h, fragement, parts;
+
+            // 非android手机直接跳过。
+            if ( !Base.os.android ) {
+                return origin.apply( null, arguments );
+            }
+
+            // 检测是否canvas支持jpeg导出,根据数据格式来判断。
+            // JPEG 前两位分别是:255, 216
+            if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {
+                fragement = origin.apply( null, arguments );
+
+                parts = fragement.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    fragement = atob( parts[ 1 ] );
+                } else {
+                    fragement = decodeURIComponent( parts[ 1 ] );
+                }
+
+                fragement = fragement.substring( 0, 2 );
+
+                supportJpeg = fragement.charCodeAt( 0 ) === 255 &&
+                        fragement.charCodeAt( 1 ) === 216;
+            }
+
+            // 只有在android环境下才修复
+            if ( type === 'image/jpeg' && !supportJpeg ) {
+                w = canvas.width;
+                h = canvas.height;
+                ctx = canvas.getContext('2d');
+
+                return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );
+            }
+
+            return origin.apply( null, arguments );
+        };
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var noop = Base.noop,
+            $ = Base.$;
+
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+
+                if ( binary ) {
+                    // 强制设置成 content-type 为文件流。
+                    xhr.overrideMimeType &&
+                            xhr.overrideMimeType('application/octet-stream');
+
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+
+            getResponse: function() {
+                return this._response;
+            },
+
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+
+                    return me.trigger( 'progress', percentage );
+                };
+
+                xhr.onreadystatechange = function() {
+
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+
+
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+
+            _parseJson: function( str ) {
+                var json;
+
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+
+                return json;
+            }
+        });
+    });
+    define('webuploader',[
+        'base',
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/log',
+        'runtime/html5/blob',
+        'runtime/html5/filepicker',
+        'runtime/html5/imagemeta/exif',
+        'runtime/html5/image',
+        'runtime/html5/androidpatch',
+        'runtime/html5/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.custom.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.custom.min.js
new file mode 100644
index 0000000..eaf9e64
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.custom.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.5 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}return a},j=function(c){return a.__dollar=c,i(b(a,f,e))};"object"==typeof module&&"object"==typeof module.exports?module.exports=j():"function"==typeof define&&define.amd?define(["jquery"],j):(c=a.WebUploader,a.WebUploader=j(),a.WebUploader.noConflict=function(){a.WebUploader=c})}(window,function(a,b,c){return b("dollar-third",[],function(){var b=a.__dollar||a.jQuery||a.Zepto;if(!b)throw new Error("jQuery or Zepto not found!");return b}),b("dollar",["dollar-third"],function(a){return a}),b("promise-builtin",["dollar"],function(a){function b(b){var c,d,e,f,g,h,i=[],j=!b&&[],k=function(a){for(h=a,c=!0,g=e||0,e=0,f=i.length,d=!0;i&&f>g;g++)i[g].apply(a[0],a[1]);d=!1,i&&(j?j.length&&k(j.shift()):i=[])},l={add:function(){if(i){var b=i.length;!function c(b){a.each(b,function(b,d){var e=a.type(d);"function"===e?i.push(d):d&&d.length&&"string"!==e&&c(d)})}(arguments),d?f=i.length:h&&(e=b,k(h))}return this},disable:function(){return i=j=h=void 0,this},lock:function(){return j=void 0,h||l.disable(),this},fireWith:function(a,b){return!i||c&&!j||(b=b||[],b=[a,b.slice?b.slice():b],d?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this}};return l}function c(d){var e=[["resolve","done",b(!0),"resolved"],["reject","fail",b(!0),"rejected"],["notify","progress",b()]],f="pending",g={state:function(){return f},always:function(){return h.done(arguments).fail(arguments),this},then:function(){var b=arguments;return c(function(c){a.each(e,function(d,e){var f=e[0],i=a.isFunction(b[d])&&b[d];h[e[1]](function(){var b;b=i&&i.apply(this,arguments),b&&a.isFunction(b.promise)?b.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===g?c.promise():this,i?[b]:arguments)})}),b=null}).promise()},promise:function(b){return null!=b?a.extend(b,g):g}},h={};return g.pipe=g.then,a.each(e,function(a,b){var c=b[2],d=b[3];g[b[1]]=c.add,d&&c.add(function(){f=d},e[1^a][2].disable,e[2][2].lock),h[b[0]]=function(){return h[b[0]+"With"](this===h?g:this,arguments),this},h[b[0]+"With"]=c.fireWith}),g.promise(h),d&&d.call(h,h),h}var d;return d={Deferred:c,isPromise:function(a){return a&&"function"==typeof a.then},when:function(b){var d,e,f,g=0,h=[].slice,i=h.call(arguments),j=i.length,k=1!==j||b&&a.isFunction(b.promise)?j:0,l=1===k?b:c(),m=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?h.call(arguments):e,c===d?l.notifyWith(b,c):--k||l.resolveWith(b,c)}};if(j>1)for(d=new Array(j),e=new Array(j),f=new Array(j);j>g;g++)i[g]&&a.isFunction(i[g].promise)?i[g].promise().done(m(g,f,i)).fail(l.reject).progress(m(g,e,d)):--k;return k||l.resolveWith(f,i),l.promise()}}}),b("promise",["promise-builtin"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.5",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",cancelFile:"cancel-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",md5File:"md5-file",getDimension:"get-dimension",addButton:"add-btn",predictRuntimeType:"predict-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return a?{successNum:a.numOfSuccess,progressNum:a.numOfProgress,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue,interruptNum:a.numofInterrupt}:{}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},destroy:function(){this.request("destroy",arguments),this.off()},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,this._parent=a,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.remove(),this._parent&&this._parent.removeClass("webuploader-container"),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,this.size=c.size||0,this.type=!c.type&&this.ext&&~"jpg,jpeg,png,gif,bmp".indexOf(this.ext)?"image/"+("jpg"===this.ext?"jpeg":this.ext):c.type||"application/octet-stream",b.call(d,"Blob"),this.uid=c.uid||this.uid,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&c.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(c.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString(),b.apply(this,arguments)}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var c=this,e=c.options,g=e.button;g.addClass("webuploader-pick"),c.on("all",function(a){var b;switch(a){case"mouseenter":g.addClass("webuploader-pick-hover");break;case"mouseleave":g.removeClass("webuploader-pick-hover");break;case"change":b=c.exec("getFiles"),c.trigger("select",f.map(b,function(a){return a=new d(c.getRuid(),a),a._refer=e.container,a}),e.container)}}),c.connectRuntime(e,function(){c.refresh(),c.exec("init",e),c.trigger("ready")}),this._resizeHandler=b.bindFn(this.refresh,this),f(a).on("resize",this._resizeHandler)},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){var b=this.options.button;f(a).off("resize",this._resizeHandler),b.removeClass("webuploader-pick-disable webuploader-pick-hover webuploader-pick")}}),e}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g=b.prototype.destroy,h={},i=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):h},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[],c=a.options.disableWidgets||"";return e.each(i,function(d,e){(!c||!~c.indexOf(e._name))&&b.push(new e(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,g,i,j,k=0,l=this._widgets,m=l&&l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],g=f.invoke(b,d),g!==h&&(a.isPromise(g)?o.push(g):n.push(g));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return 1===c.length&&(c=c[0]),setTimeout(function(){b.resolve(c)},1),b.promise()})[e?j:"done"](e||a.noop)):n[0]},destroy:function(){g.apply(this,arguments),this._widgets=null}}),b.register=d.register=function(b,c){var f,g={init:"init",destroy:"destroy",name:"anonymous"};return 1===arguments.length?(c=b,e.each(c,function(a){return"_"===a[0]||"name"===a?void("name"===a&&(g.name=c.name)):void(g[a.replace(/[A-Z]/g,"-$&").toLowerCase()]=a)})):g=e.extend(g,b),c.responseMap=g,f=a.inherits(d,c),f._name=g.name,i.push(f),f},b.unRegister=d.unRegister=function(a){if(a&&"anonymous"!==a)for(var b=i.length;b--;)i[b]._name===a&&i.splice(b,1)},d}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({name:"picker",init:function(a){return this.pickers=[],a.pick&&this.addBtn(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addBtn:function(b){var e=this,f=e.options,g=f.accept,h=[];if(b)return d.isPlainObject(b)||(b={id:b}),d(b.id).each(function(){var i,j,k;k=a.Deferred(),i=d.extend({},b,{accept:d.isPlainObject(g)?[g]:g,swf:f.swf,runtimeOrder:f.runtimeOrder,id:this}),j=new c(i),j.once("ready",k.resolve),j.on("select",function(a){e.owner.request("add-file",[a])}),j.init(),e.pickers.push(j),h.push(k.promise())}),a.when.apply(a,h)},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})},destroy:function(){d.each(this.pickers,function(){this.destroy()}),this.pickers=null}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!1,allowMagnify:!1},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},crop:function(){var b=a.slice(arguments);return this.exec.apply(this,["crop"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({name:"image",makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),1>=f&&f>0&&(f=a._info.width*f),1>=g&&g>0&&(g=a._info.height*g),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(a){b(a||!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},beforeSendFile:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||0,i=g&&g.noCompressIfLarger||!1;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){var a=g.width,c=g.height;b._info=b._info||d.info(),b._meta=b._meta||d.meta(),1>=a&&a>0&&(a=b._info.width*a),1>=c&&c>0&&(c=b._info.height*c),d.resize(a,c)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,(!i||a.size<c)&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application/octet-stream",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destroy:function(){this.off(),delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0,numofDeleted:0,numofInterrupt:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},removeFile:function(a){var b=this._map[a.id];b&&(delete this._map[a.id],a.destroy(),this.stats.numofDeleted++)},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)}))},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--;break;case f.INTERRUPT:c.numofInterrupt--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++;break;case f.INTERRUPT:c.numofInterrupt++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({name:"queue",init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),this.placeholder=l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||!a.size||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFile:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&setTimeout(function(){b.request("start-upload")},20)},getStats:function(){return this.stats},removeFile:function(a,b){var c=this;a=a.id?a:c.queue.getFile(a),this.request("cancel-file",a),b&&this.queue.removeFile(a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.owner.trigger("reset"),this.queue=new c,this.stats=this.queue.stats},destroy:function(){this.reset(),this.placeholder&&this.placeholder.destroy()}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({name:"runtime",init:function(){if(!this.predictRuntimeType())throw Error("Runtime Error")},predictRuntimeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){var c,d,e=[],f=a.source,g=f.size,h=b?Math.ceil(g/b):1,i=0,j=0;for(d={file:a,has:function(){return!!e.length},shift:function(){return e.shift()},unshift:function(a){e.unshift(a)}};h>j;)c=Math.min(b,g-i),e.push({file:a,start:i,end:b?i+c:g,total:g,chunks:h,chunk:j++,cuted:d}),i+=c;return a.blocks=e.concat(),a.remaning=e.length,d}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:{}}),b.register({name:"upload",init:function(){var b=this.owner,c=this;this.runing=!1,this.progress=!1,b.on("startUpload",function(){c.progress=!0}).on("uploadFinished",function(){c.progress=!1}),this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},reset:function(){this.request("stop-upload",!0),this.runing=!1,this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this._trigged=!1,this._promise=null},startUpload:function(b){var c=this;if(f.each(c.request("get-files",h.INVALID),function(){c.request("remove-file",this)}),b)if(b=b.id?b:c.request("get-file",b),b.getStatus()===h.INTERRUPT)f.each(c.pool,function(a,c){c.file===b&&c.transport&&c.transport.send()}),b.setStatus(h.QUEUED);else{if(b.getStatus()===h.PROGRESS)return;b.setStatus(h.QUEUED)}else f.each(c.request("get-files",[h.INITED]),function(){this.setStatus(h.QUEUED)});if(!c.runing){c.runing=!0;var d=[];f.each(c.pool,function(a,b){var e=b.file;e.getStatus()===h.INTERRUPT&&(d.push(e),c._trigged=!1,b.transport&&b.transport.send())});for(var b;b=d.shift();)b.setStatus(h.PROGRESS);b||f.each(c.request("get-files",h.INTERRUPT),function(){this.setStatus(h.PROGRESS)}),c._trigged=!1,a.nextTick(c.__tick),c.owner.trigger("startUpload")}},stopUpload:function(b,c){var d=this;if(b===!0&&(c=b,b=null),d.runing!==!1){if(b){if(b=b.id?b:d.request("get-file",b),b.getStatus()!==h.PROGRESS&&b.getStatus()!==h.QUEUED)return;return b.setStatus(h.INTERRUPT),f.each(d.pool,function(a,c){c.file===b&&(c.transport&&c.transport.abort(),d._putback(c),d._popBlock(c))}),a.nextTick(d.__tick)}d.runing=!1,this._promise&&this._promise.file&&this._promise.file.setStatus(h.INTERRUPT),c&&f.each(d.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),d.owner.trigger("stopUpload")}},cancelFile:function(a){a=a.id?a:this.request("get-file",a),a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),a.setStatus(h.CANCELLED),this.owner.trigger("fileDequeued",a)},isInProgress:function(){return!!this.progress},_getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=a.id?a:this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d._getStats().numOfQueue||d._getStats().numofInterrupt||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_putback:function(a){var b;a.cuted.unshift(a),b=this.stack.indexOf(a.cuted),~b||this.stack.unshift(a.cuted)},_getStack:function(){for(var a,b=0;a=this.stack[b++];){if(a.has()&&a.file.getStatus()===h.PROGRESS)return a;(!a.has()||a.file.getStatus()!==h.PROGRESS&&a.file.getStatus()!==h.INTERRUPT)&&this.stack.splice(--b,1)}return null},_nextBlock:function(){var a,b,c,d,f=this,h=f.options;return(a=this._getStack())?(h.prepareNextFile&&!f.pending.length&&f._prepareNextFile(),a.shift()):f.runing?(!f.pending.length&&f._getStats().numOfQueue&&f._prepareNextFile(),b=f.pending.shift(),c=function(b){return b?(a=e(b,h.chunked?h.chunkSize:0),f.stack.push(a),a.shift()):null},g(b)?(d=b.file,b=b[b.pipe?"pipe":"then"](c),b.file=d,b):c(b)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.PROGRESS||c.getStatus()===h.INTERRUPT?c:b._finishFile(c)}),b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),a.file=c,a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;return e.getStatus()!==h.PROGRESS?void(e.getStatus()===h.INTERRUPT&&d._putback(b)):(d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),void c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d.updateFileProgress(e),d._popBlock(b),a.nextTick(d.__tick))}))},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){b.percentage=a,g.updateFileProgress(k)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)
+}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})},updateFileProgress:function(a){var b=0,c=0;a.blocks&&(f.each(a.blocks,function(a,b){c+=(b.percentage||0)*(b.end-b.start)}),b=c/a.size,this.owner.trigger("uploadProgress",a,b||0))}})}),b("widgets/log",["base","uploader","widgets/widget"],function(a,b){function c(a){var b=e.extend({},d,a),c=f.replace(/^(.*)\?/,"$1"+e.param(b)),g=new Image;g.src=c}var d,e=a.$,f=" http://static.tieba.baidu.com/tb/pms/img/st.gif??",g=(location.hostname||location.host||"protected").toLowerCase(),h=g&&/baidu/i.exec(g);if(h)return d={dv:3,master:"webuploader",online:/test/.exec(g)?0:1,module:"",product:g,type:0},b.register({name:"log",init:function(){var a=this.owner,b=0,d=0;a.on("error",function(a){c({type:2,c_error_code:a})}).on("uploadError",function(a,b){c({type:2,c_error_code:"UPLOAD_ERROR",c_reason:""+b})}).on("uploadComplete",function(a){b++,d+=a.size}).on("uploadFinished",function(){c({c_count:b,c_size:d}),b=d=0}),c({c_usage:1})}})}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destroy;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destroy=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=this.label=c(document.createElement("label")),k=this.input=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),b.value=null,this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){this.input.off(),this.label.off()}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;e<b.length;e++)c[e]=b.charCodeAt(e);return f=g[0].split(":")[1].split(";")[0],this.arrayBufferToBlob(d,f)},dataURL2ArrayBuffer:function(a){var b,c,d,e;for(e=a.split(","),b=~e[0].indexOf("base64")?atob(e[1]):decodeURIComponent(e[1]),c=new Uint8Array(b.length),d=0;d<b.length;d++)c[d]=b.charCodeAt(d);return c.buffer},arrayBufferToBlob:function(b,c){var d,e=a.BlobBuilder||a.WebKitBlobBuilder;return e?(d=new e,d.append(b),d.getBlob(c)):new Blob([b],c?{type:c}:{})},canvasToDataUrl:function(a,b,c){return a.toDataURL(b,c/100)},parseMeta:function(a,b){b(!1,{})},updateImageHead:function(a){return a}}}),b("runtime/html5/imagemeta",["runtime/html5/util"],function(a){var b;return b={parsers:{65505:[]},maxMetaDataSize:262144,parse:function(a,b){var c=this,d=new FileReader;d.onload=function(){b(!1,c._parse(this.result)),d=d.onload=d.onerror=null},d.onerror=function(a){b(a.message),d=d.onload=d.onerror=null},a=a.slice(0,c.maxMetaDataSize),d.readAsArrayBuffer(a.getSource())},_parse:function(a,c){if(!(a.byteLength<6)){var d,e,f,g,h=new DataView(a),i=2,j=h.byteLength-4,k=i,l={};if(65496===h.getUint16(0)){for(;j>i&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g<f.length;g+=1)f[g].call(b,h,i,e,l);i+=e,k=i}k>6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;l<k.length&&(n=k[l],"\x00"!==n);l+=1)m+=n;return m}return k},c.parseExifTag=function(a,b,d,e,f){var g=a.getUint16(d,e);f.exif[g]=c.getExifValue(a,b,d,a.getUint16(d+2,e),a.getUint32(d+4,e),e)},c.parseExifTags=function(b,c,d,e,f){var g,h,i;if(d+6>b.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete","resize")},crop:function(a,b,c,d,e){var f=this._canvas||(this._canvas=document.createElement("canvas")),g=this.options,h=this._img,i=h.naturalWidth,j=h.naturalHeight,k=this.getOrientation();e=e||1,f.width=c,f.height=d,g.preserveHeaders||this._rotate2Orientaion(f,k),this._renderImageToCanvas(f,h,-a,-b,i*e,j*e),this._blob=null,this.modified=!0,this.owner.trigger("complete","crop")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,a,e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(b){var c=a.slice(arguments,1),d=b.getContext("2d");d.drawImage.apply(d,c)}}()})}),b("runtime/html5/jpegencoder",[],function(){function a(a){function b(a){for(var b=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],c=0;64>c;c++){var d=y((b[c]*a+50)/100);1>d?d=1:d>255&&(d=255),z[P[c]]=d}for(var e=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],f=0;64>f;f++){var g=y((e[f]*a+50)/100);1>g?g=1:g>255&&(g=255),A[P[f]]=g}for(var h=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],i=0,j=0;8>j;j++)for(var k=0;8>k;k++)B[i]=1/(z[P[i]]*h[j]*h[k]*8),C[i]=1/(A[P[i]]*h[j]*h[k]*8),i++}function c(a,b){for(var c=0,d=0,e=new Array,f=1;16>=f;f++){for(var g=1;g<=a[f];g++)e[b[d]]=[],e[b[d]][0]=c,e[b[d]][1]=f,d++,c++;c*=2}return e}function d(){t=c(Q,R),u=c(U,V),v=c(S,T),w=c(W,X)}function e(){for(var a=1,b=2,c=1;15>=c;c++){for(var d=a;b>d;d++)E[32767+d]=c,D[32767+d]=[],D[32767+d][1]=c,D[32767+d][0]=d;for(var e=-(b-1);-a>=e;e++)E[32767+e]=c,D[32767+e]=[],D[32767+e][1]=c,D[32767+e][0]=b-1+e;a<<=1,b<<=1}}function f(){for(var a=0;256>a;a++)O[a]=19595*a,O[a+256>>0]=38470*a,O[a+512>>0]=7471*a+32768,O[a+768>>0]=-11059*a,O[a+1024>>0]=-21709*a,O[a+1280>>0]=32768*a+8421375,O[a+1536>>0]=-27439*a,O[a+1792>>0]=-5329*a}function g(a){for(var b=a[0],c=a[1]-1;c>=0;)b&1<<c&&(I|=1<<J),c--,J--,0>J&&(255==I?(h(255),h(0)):h(I),J=7,I=0)}function h(a){H.push(N[a])}function i(a){h(a>>8&255),h(255&a)}function j(a,b){var c,d,e,f,g,h,i,j,k,l=0,m=8,n=64;for(k=0;m>k;++k){c=a[l],d=a[l+1],e=a[l+2],f=a[l+3],g=a[l+4],h=a[l+5],i=a[l+6],j=a[l+7];var o=c+j,p=c-j,q=d+i,r=d-i,s=e+h,t=e-h,u=f+g,v=f-g,w=o+u,x=o-u,y=q+s,z=q-s;a[l]=w+y,a[l+4]=w-y;var A=.707106781*(z+x);a[l+2]=x+A,a[l+6]=x-A,w=v+t,y=t+r,z=r+p;var B=.382683433*(w-z),C=.5411961*w+B,D=1.306562965*z+B,E=.707106781*y,G=p+E,H=p-E;a[l+5]=H+C,a[l+3]=H-C,a[l+1]=G+D,a[l+7]=G-D,l+=8}for(l=0,k=0;m>k;++k){c=a[l],d=a[l+8],e=a[l+16],f=a[l+24],g=a[l+32],h=a[l+40],i=a[l+48],j=a[l+56];var I=c+j,J=c-j,K=d+i,L=d-i,M=e+h,N=e-h,O=f+g,P=f-g,Q=I+O,R=I-O,S=K+M,T=K-M;a[l]=Q+S,a[l+32]=Q-S;var U=.707106781*(T+R);a[l+16]=R+U,a[l+48]=R-U,Q=P+N,S=N+L,T=L+J;var V=.382683433*(Q-T),W=.5411961*Q+V,X=1.306562965*T+V,Y=.707106781*S,Z=J+Y,$=J-Y;a[l+40]=$+W,a[l+24]=$-W,a[l+8]=Z+X,a[l+56]=Z-X,l++}var _;for(k=0;n>k;++k)_=a[k]*b[k],F[k]=_>0?_+.5|0:_-.5|0;return F}function k(){i(65504),i(16),h(74),h(70),h(73),h(70),h(0),h(1),h(1),h(0),i(1),i(1),h(0),h(0)}function l(a,b){i(65472),i(17),h(8),i(b),i(a),h(3),h(1),h(17),h(0),h(2),h(17),h(1),h(3),h(17),h(1)}function m(){i(65499),i(132),h(0);for(var a=0;64>a;a++)h(z[a]);h(1);for(var b=0;64>b;b++)h(A[b])}function n(){i(65476),i(418),h(0);for(var a=0;16>a;a++)h(Q[a+1]);for(var b=0;11>=b;b++)h(R[b]);h(16);for(var c=0;16>c;c++)h(S[c+1]);for(var d=0;161>=d;d++)h(T[d]);h(1);for(var e=0;16>e;e++)h(U[e+1]);for(var f=0;11>=f;f++)h(V[f]);h(17);for(var g=0;16>g;g++)h(W[g+1]);for(var j=0;161>=j;j++)h(X[j])}function o(){i(65498),i(12),h(3),h(1),h(0),h(2),h(17),h(3),h(17),h(0),h(63),h(0)}function p(a,b,c,d,e){for(var f,h=e[0],i=e[240],k=16,l=63,m=64,n=j(a,b),o=0;m>o;++o)G[P[o]]=n[o];var p=G[0]-c;c=G[0],0==p?g(d[0]):(f=32767+p,g(d[E[f]]),g(D[f]));for(var q=63;q>0&&0==G[q];q--);if(0==q)return g(h),c;for(var r,s=1;q>=s;){for(var t=s;0==G[s]&&q>=s;++s);var u=s-t;if(u>=k){r=u>>4;for(var v=1;r>=v;++v)g(i);u=15&u}f=32767+G[s],g(e[(u<<4)+E[f]]),g(D[f]),s++}return q!=l&&g(h),c}function q(){for(var a=String.fromCharCode,b=0;256>b;b++)N[b]=a(b)}function r(a){if(0>=a&&(a=1),a>100&&(a=100),x!=a){var c=0;c=Math.floor(50>a?5e3/a:200-2*a),b(c),x=a}}function s(){a||(a=50),q(),d(),e(),f(),r(a)}var t,u,v,w,x,y=(Math.round,Math.floor),z=new Array(64),A=new Array(64),B=new Array(64),C=new Array(64),D=new Array(65535),E=new Array(65535),F=new Array(64),G=new Array(64),H=[],I=0,J=7,K=new Array(64),L=new Array(64),M=new Array(64),N=new Array(256),O=new Array(2048),P=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],Q=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],R=[0,1,2,3,4,5,6,7,8,9,10,11],S=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],T=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],U=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],V=[0,1,2,3,4,5,6,7,8,9,10,11],W=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],X=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];this.encode=function(a,b){b&&r(b),H=new Array,I=0,J=7,i(65496),k(),m(),l(a.width,a.height),n(),o();var c=0,d=0,e=0;I=0,J=7,this.encode.displayName="_encode_";for(var f,h,j,q,s,x,y,z,A,D=a.data,E=a.width,F=a.height,G=4*E,N=0;F>N;){for(f=0;G>f;){for(s=G*N+f,x=s,y=-1,z=0,A=0;64>A;A++)z=A>>3,y=4*(7&A),x=s+z*G+y,N+z>=F&&(x-=G*(N+1+z-F)),f+y>=G&&(x-=f+y-G+4),h=D[x++],j=D[x++],q=D[x++],K[A]=(O[h]+O[j+256>>0]+O[q+512>>0]>>16)-128,L[A]=(O[h+768>>0]+O[j+1024>>0]+O[q+1280>>0]>>16)-128,M[A]=(O[h+1280>>0]+O[j+1536>>0]+O[q+1792>>0]>>16)-128;c=p(K,B,c,t,v),d=p(L,C,d,u,w),e=p(M,C,e,u,w),f+=32}N+=8}if(J>=0){var P=[];P[1]=J+1,P[0]=(1<<J+1)-1,g(P)}i(65497);var Q="data:image/jpeg;base64,"+btoa(H.join(""));return H=[],Q},s()}return a.encode=function(b,c){var d=new a(c);return d.encode(b)},a}),b("runtime/html5/androidpatch",["runtime/html5/util","runtime/html5/jpegencoder","base"],function(a,b,c){var d,e=a.canvasToDataUrl;a.canvasToDataUrl=function(a,f,g){var h,i,j,k,l;return c.os.android?("image/jpeg"===f&&"undefined"==typeof d&&(k=e.apply(null,arguments),l=k.split(","),k=~l[0].indexOf("base64")?atob(l[1]):decodeURIComponent(l[1]),k=k.substring(0,2),d=255===k.charCodeAt(0)&&216===k.charCodeAt(1)),"image/jpeg"!==f||d?e.apply(null,arguments):(i=a.width,j=a.height,h=a.getContext("2d"),b.encode(h.getImageData(0,0,i,j),g))):e.apply(null,arguments)}}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType&&h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("webuploader",["base","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/log","runtime/html5/blob","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/image","runtime/html5/androidpatch","runtime/html5/transport"],function(a){return a}),c("webuploader")});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.fis.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.fis.js
new file mode 100644
index 0000000..431c519
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.fis.js
@@ -0,0 +1,8083 @@
+/*! WebUploader 0.1.5 */
+
+
+var jQuery = require('example:widget/ui/jquery/jquery.js')
+
+return (function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+
+            return obj;
+        },
+
+        makeExport = function( dollar ) {
+            root.__dollar = dollar;
+
+            // exports every module.
+            return exportsTo( factory( root, _define, _require ) );
+        };
+
+    return makeExport( jQuery );
+})( window, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        var $ = window.__dollar || window.jQuery || window.Zepto;
+
+        if ( !$ ) {
+            throw new Error('jQuery or Zepto not found!');
+        }
+
+        return $;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id为该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档中对类的使用可能省略掉了`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+
+        var noop = function() {},
+            call = Function.call;
+
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+
+        function createObject( proto ) {
+            var f;
+
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+
+
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.5',
+
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+
+            Deferred: promise.Deferred,
+
+            isPromise: promise.isPromise,
+
+            when: promise.when,
+
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match( /(?:trident)(?:.*rv:([\w.]+))?/i ),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+
+                /* jshint camelcase: false */
+
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+
+                return child;
+            },
+
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数noop](#WebUploader:Base.noop)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+
+            nextTick: (function() {
+
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+
+            while ( ++i < len ) {
+                handler = events[ i ];
+
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+
+            return !stoped;
+        }
+
+        protos = {
+
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+
+                if ( !callback ) {
+                    return this;
+                }
+
+                set = this._events || (this._events = []);
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+
+                    set.push( handler );
+                });
+
+                return this;
+            },
+
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+
+                if ( !callback ) {
+                    return me;
+                }
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+
+                return me;
+            },
+
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+
+                if ( !events ) {
+                    return this;
+                }
+
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+
+                return this;
+            },
+
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+
+                if ( !this._events || !type ) {
+                    return this;
+                }
+
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$;
+
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            cancelFile: 'cancel-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            md5File: 'md5-file',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            predictRuntimeType: 'predict-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+
+            _init: function( opts ) {
+                var me = this;
+
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     compress: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.option( 'compress', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+
+                // setter
+                if ( arguments.length > 1 ) {
+
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `progressNum` 上传中的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `queueNum` 还在队列中的文件数
+             * * `interruptNum` 被暂停的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+
+                return stats ? {
+                    successNum: stats.numOfSuccess,
+                    progressNum: stats.numOfProgress,
+
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue,
+                    interruptNum: stats.numofInterrupt
+                } : {};
+            },
+
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+
+                    return false;
+                }
+
+                return true;
+            },
+
+            /**
+             * 销毁 webuploader 实例
+             * @method destroy
+             * @grammar destroy() => undefined
+             */
+            destroy: function() {
+                this.request( 'destroy', arguments );
+                this.off();
+            },
+
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            factories = {},
+
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+
+        $.extend( Runtime.prototype, {
+
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+
+                if ( this._container ) {
+                    return this._container;
+                }
+
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                this._parent = parent;
+                return container;
+            },
+
+            init: Base.noop,
+            exec: Base.noop,
+
+            destroy: function() {
+                this._container && this._container.remove();
+                this._parent && this._parent.removeClass('webuploader-container');
+                this.off();
+            }
+        });
+
+        Runtime.orders = 'html5,flash';
+
+
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+
+            type = type || getFirstKey( factories );
+
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+
+        var cache;
+
+        cache = (function() {
+            var obj = {};
+
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+
+                get: function( ruid, standalone ) {
+                    var i;
+
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+
+                        return obj[ i ];
+                    }
+
+                    return null;
+                },
+
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+
+            this.uid = Base.guid('client_');
+
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+
+            this.connectRuntime = function( opts, cb ) {
+
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+
+                deferred.done( cb );
+
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                runtime.__client--;
+
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+
+                runtime = null;
+            };
+
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+
+                return runtime.exec.apply( this, args );
+            };
+
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+
+            opts.container = $( opts.container );
+
+            if ( !opts.container.length ) {
+                return;
+            }
+
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( DragAndDrop.prototype );
+
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            _destroy = Uploader.prototype.destroy,
+            IGNORE = {},
+            widgetClass = [];
+
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+
+            var length = obj.length,
+                type = $.type( obj );
+
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+
+        $.extend( Widget.prototype, {
+
+            init: Base.noop,
+
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+
+                    return IGNORE;
+                }
+
+                return this[ map[ apiName ] ].apply( this, args );
+
+            },
+
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+
+            /**
+             * @property {String | Array} [disableWidgets=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 默认所有 Uploader.register 了的 widget 都会被加载,如果禁用某一部分,请通过此 option 指定黑名单。
+             */
+
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [],
+                    deactives = me.options.disableWidgets || '';
+
+                $.each( widgetClass, function( _, klass ) {
+                    (!deactives || !~deactives.indexOf( klass._name )) &&
+                        widgets.push( new klass( me ) );
+                });
+
+                return _init.apply( me, arguments );
+            },
+
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets && widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+
+                args = isArrayLike( args ) ? args : [ args ];
+
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+
+                    if ( rlt !== IGNORE ) {
+
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个 tick 中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+
+                                if ( args.length === 1 ) {
+                                    args = args[ 0 ];
+                                }
+
+                                setTimeout(function() {
+                                    deferred.resolve( args );
+                                }, 1 );
+
+                                return deferred.promise();
+                            })[ callback ? key : 'done' ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            },
+
+            destroy: function() {
+                _destroy.apply( this, arguments );
+                this._widgets = null;
+            }
+        });
+
+        /**
+         * 添加组件
+         * @grammar Uploader.register(proto);
+         * @grammar Uploader.register(map, proto);
+         * @param  {object} responseMap API 名称与函数实现的映射
+         * @param  {object} proto 组件原型,构造函数通过 constructor 属性定义
+         * @method Uploader.register
+         * @for Uploader
+         * @example
+         * Uploader.register({
+         *     'make-thumb': 'makeThumb'
+         * }, {
+         *     init: function( options ) {},
+         *     makeThumb: function() {}
+         * });
+         *
+         * Uploader.register({
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init', destroy: 'destroy', name: 'anonymous' },
+                klass;
+
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+
+                // 自动生成 map 表。
+                $.each(widgetProto, function(key) {
+                    if ( key[0] === '_' || key === 'name' ) {
+                        key === 'name' && (map.name = widgetProto.name);
+                        return;
+                    }
+
+                    map[key.replace(/[A-Z]/g, '-$&').toLowerCase()] = key;
+                });
+
+            } else {
+                map = $.extend( map, responseMap );
+            }
+
+            widgetProto.responseMap = map;
+            klass = Base.inherits( Widget, widgetProto );
+            klass._name = map.name;
+            widgetClass.push( klass );
+
+            return klass;
+        };
+
+        /**
+         * 删除插件,只有在注册时指定了名字的才能被删除。
+         * @grammar Uploader.unRegister(name);
+         * @param  {string} name 组件名字
+         * @method Uploader.unRegister
+         * @for Uploader
+         * @example
+         *
+         * Uploader.register({
+         *     name: 'custom',
+         *
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         *
+         * Uploader.unRegister('custom');
+         */
+        Uploader.unRegister = Widget.unRegister = function( name ) {
+            if ( !name || name === 'anonymous' ) {
+                return;
+            }
+
+            // 删除指定的插件。
+            for ( var i = widgetClass.length; i--; ) {
+                if ( widgetClass[i]._name === name ) {
+                    widgetClass.splice(i, 1)
+                }
+            }
+        };
+
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+
+        Uploader.options.dnd = '';
+
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @property {Selector} [disableGlobalDnd=false]  是否禁掉整个页面的拖拽功能,如果不禁用,图片拖进来的时候会默认被浏览器打开。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            name: 'dnd',
+
+            init: function( opts ) {
+
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+
+                this.dnd = dnd = new Dnd( options );
+
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+
+                dnd.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.dnd && this.dnd.destroy();
+            }
+        });
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( FilePaste.prototype );
+
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            name: 'paste',
+
+            init: function( opts ) {
+
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+
+                this.paste = paste = new FilePaste( options );
+
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.paste && this.paste.destroy();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+
+        function Blob( ruid, source ) {
+            var me = this;
+
+            me.source = source;
+            me.ruid = ruid;
+            this.size = source.size || 0;
+
+            // 如果没有指定 mimetype, 但是知道文件后缀。
+            if ( !source.type && this.ext &&
+                    ~'jpg,jpeg,png,gif,bmp'.indexOf( this.ext ) ) {
+                this.type = 'image/' + (this.ext === 'jpg' ? 'jpeg' : this.ext);
+            } else {
+                this.type = source.type || 'application/octet-stream';
+            }
+
+            RuntimeClient.call( me, 'Blob' );
+            this.uid = source.uid || this.uid;
+
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+
+            getSource: function() {
+                return this.source;
+            }
+        });
+
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+
+        function File( ruid, file ) {
+            var ext;
+
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+
+            // todo 支持其他类型文件的转换。
+            // 如果有 mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && file.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( file.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+
+            Blob.apply( this, arguments );
+        }
+
+        return Base.inherits( Blob, File );
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+
+        var $ = Base.$;
+
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+
+            opts.container = $( opts.id );
+
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+
+                button.addClass('webuploader-pick');
+
+                me.on( 'all', function( type ) {
+                    var files;
+
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+
+                this._resizeHandler = Base.bindFn( this.refresh, this );
+                $( window ).on( 'resize', this._resizeHandler );
+            },
+
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+
+                    pos = button.offset();
+
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+
+            enable: function() {
+                var btn = this.options.button;
+
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+
+            disable: function() {
+                var btn = this.options.button;
+
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+
+                btn.addClass('webuploader-pick-disable');
+            },
+
+            destroy: function() {
+                var btn = this.options.button;
+                $( window ).off( 'resize', this._resizeHandler );
+                btn.removeClass('webuploader-pick-disable webuploader-pick-hover ' +
+                    'webuploader-pick');
+            }
+        });
+
+        return FilePicker;
+    });
+
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor|dom} 指定选择文件的按钮容器,不指定则不创建按钮。**注意** 这里虽然写的是 id, 但是不是只支持 id, 还支持 class, 或者 dom 节点。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+
+        return Uploader.register({
+            name: 'picker',
+
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addBtn( opts.pick );
+            },
+
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addBtn: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    promises = [];
+
+                if ( !pick ) {
+                    return;
+                }
+
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+
+                $( pick.id ).each(function() {
+                    var options, picker, deferred;
+
+                    deferred = Base.Deferred();
+
+                    options = $.extend({}, pick, {
+                        accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                        swf: opts.swf,
+                        runtimeOrder: opts.runtimeOrder,
+                        id: this
+                    });
+
+                    picker = new FilePicker( options );
+
+                    picker.once( 'ready', deferred.resolve );
+                    picker.on( 'select', function( files ) {
+                        me.owner.request( 'add-file', [ files ]);
+                    });
+                    picker.init();
+
+                    me.pickers.push( picker );
+
+                    promises.push( deferred.promise() );
+                });
+
+                return Base.when.apply( Base, promises );
+            },
+
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            },
+
+            destroy: function() {
+                $.each( this.pickers, function() {
+                    this.destroy();
+                });
+                this.pickers = null;
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+
+        // 默认选项。
+        Image.options = {
+
+            // 默认的图片处理质量
+            quality: 90,
+
+            // 是否裁剪
+            crop: false,
+
+            // 是否保留头部信息
+            preserveHeaders: false,
+
+            // 是否允许放大。
+            allowMagnify: false
+        };
+
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+
+            info: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+
+                // getter
+                return this._info;
+            },
+
+            meta: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+
+                // getter
+                return this._meta;
+            },
+
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+
+            crop: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'crop' ].concat( args ) );
+            },
+
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+
+        var $ = Base.$,
+            throttle;
+
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true,
+             *
+             *     // 如果发现压缩后文件大小比原来还大,则使用原来图片
+             *     // 此属性可能会影响图片自动纠正功能
+             *     noCompressIfLarger: false,
+             *
+             *     // 单位字节,如果图片大小小于此值,不会采用压缩。
+             *     compressSize: 0
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+
+        return Uploader.register({
+
+            name: 'image',
+
+
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * 当 width 或者 height 的值介于 0 - 1 时,被当成百分比使用。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             * 也可以借助服务端,将 base64 数据传给服务端,生成一个临时文件供预览。
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+
+                file = this.request( 'get-file', file );
+
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+
+                opts = $.extend({}, this.options.thumb );
+
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+
+                width = width || opts.width;
+                height = height || opts.height;
+
+                image = new Image( opts );
+
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                // 当 resize 完后
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+
+                image.once( 'error', function( reason ) {
+                    cb( reason || true );
+                    image.destroy();
+                });
+
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+
+            beforeSendFile: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 0,
+                    noCompressIfLarger = opts && opts.noCompressIfLarger || false,
+                    image, deferred;
+
+                file = this.request( 'get-file', file );
+
+                // 只压缩 jpeg 图片格式。
+                // gif 可能会丢失针
+                // bmp png 基本上尺寸都不大,且压缩比比较小。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+
+                image = new Image( opts );
+
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    var width = opts.width,
+                        height = opts.height;
+
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                image.once( 'complete', function() {
+                    var blob, size;
+
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+
+                        size = file.size;
+
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( !noCompressIfLarger || blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+
+                            file.trigger( 'resize', blob.size, size );
+                        }
+
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application/octet-stream'
+             */
+            this.type = source.type || 'application/octet-stream';
+
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+
+
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+
+            this.source = source;
+            this.loaded = 0;
+
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+
+        $.extend( WUFile.prototype, {
+
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+
+                var prevStatus = statusMap[ this.id ];
+
+                typeof text !== 'undefined' && (this.statusText = text);
+
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+
+            },
+
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+
+            destroy: function() {
+                this.off();
+                delete statusMap[ this.id ];
+            }
+        });
+
+        Mediator.installTo( WUFile.prototype );
+
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+
+        return WUFile;
+    });
+
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被取消的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * * `numofDeleted` 被移除的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0,
+                numofDeleted: 0,
+                numofInterrupt: 0
+            };
+
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+
+            // 存储所有文件
+            this._map = {};
+        }
+
+        $.extend( Queue.prototype, {
+
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+
+                status = status || STATUS.QUEUED;
+
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+
+                return null;
+            },
+
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+
+                    ret.push( file );
+                }
+
+                return ret;
+            },
+
+            /**
+             * 在队列中删除文件。
+             * @grammar removeFile( file ) => Array
+             * @method removeFile
+             * @param {File} 文件对象。
+             */
+            removeFile: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( existing ) {
+                    delete this._map[ file.id ];
+                    file.destroy();
+                    this.stats.numofDeleted++;
+                }
+            },
+
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+            },
+
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt--;
+                        break;
+                }
+
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt++;
+                        break;
+                }
+            }
+
+        });
+
+        Mediator.installTo( Queue.prototype );
+
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+
+        return Uploader.register({
+            name: 'queue',
+
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+
+                    me.accept = new RegExp( accept, 'i' );
+                }
+
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                this.placeholder = runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+
+
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+
+                    file = new WUFile( file );
+                }
+
+                return file;
+            },
+
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || !file.size || this.accept &&
+
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+
+                return !invalid;
+            },
+
+
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+
+            _addFile: function( file ) {
+                var me = this;
+
+                file = me._wrapFile( file );
+
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @property {Boolean} [auto=false]
+             * @namespace options
+             * @for Uploader
+             * @description 设置为 true 后,不需要手动调用上传,有文件选择即开始上传。
+             *
+             */
+
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFile: function( files ) {
+                var me = this;
+
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+
+                me.owner.trigger( 'filesQueued', files );
+
+                if ( me.options.auto ) {
+                    setTimeout(function() {
+                        me.request('start-upload');
+                    }, 20 );
+                }
+            },
+
+            getStats: function() {
+                return this.stats;
+            },
+
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+
+             /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @grammar removeFile( file, true ) => undefined
+             * @grammar removeFile( id, true ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件, 默认只会标记文件状态为已取消,如果第二个参数为 `true` 则会从 queue 中移除。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file, remove ) {
+                var me = this;
+
+                file = file.id ? file : me.queue.getFile( file );
+
+                this.request( 'cancel-file', file );
+
+                if ( remove ) {
+                    this.queue.removeFile( file );
+                }
+            },
+
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+
+                me.request('start-upload');
+            },
+
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+
+            /**
+             * @event reset
+             * @description 当 uploader 被重置的时候触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.owner.trigger('reset');
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            },
+
+            destroy: function() {
+                this.reset();
+                this.placeholder && this.placeholder.destroy();
+            }
+        });
+
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+
+        /**
+         * @property {Object} [runtimeOrder=html5,flash]
+         * @namespace options
+         * @for Uploader
+         * @description 指定运行时启动顺序。默认会想尝试 html5 是否支持,如果支持则使用 html5, 否则则使用 flash.
+         *
+         * 可以将此值设置成 `flash`,来强制使用 flash 运行时。
+         */
+
+        return Uploader.register({
+            name: 'runtime',
+
+            init: function() {
+                if ( !this.predictRuntimeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntimeType() => String
+             * @method predictRuntimeType
+             * @for  Uploader
+             */
+            predictRuntimeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+
+        var $ = Base.$;
+
+        function Transport( opts ) {
+            var me = this;
+
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+
+        Transport.options = {
+            server: '',
+            method: 'POST',
+
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+
+        $.extend( Transport.prototype, {
+
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+
+                if ( !duration ) {
+                    return;
+                }
+
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+
+        });
+
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+
+
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+
+
+            /**
+             * @property {Object} [formData={}]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: {}
+
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len, api;
+
+            api = {
+                file: file,
+
+                has: function() {
+                    return !!pending.length;
+                },
+
+                shift: function() {
+                    return pending.shift();
+                },
+
+                unshift: function( block ) {
+                    pending.unshift( block );
+                }
+            };
+
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++,
+                    cuted: api
+                });
+                start += len;
+            }
+
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+
+            return api;
+        }
+
+        Uploader.register({
+            name: 'upload',
+
+            init: function() {
+                var owner = this.owner,
+                    me = this;
+
+                this.runing = false;
+                this.progress = false;
+
+                owner
+                    .on( 'startUpload', function() {
+                        me.progress = true;
+                    })
+                    .on( 'uploadFinished', function() {
+                        me.progress = false;
+                    });
+
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+
+                // 缓存分好片的文件。
+                this.stack = [];
+
+                // 缓存即将上传的文件。
+                this.pending = [];
+
+                // 跟踪还有多少分片在上传中但是没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+
+                owner.on( 'uploadComplete', function( file ) {
+
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+
+            reset: function() {
+                this.request( 'stop-upload', true );
+                this.runing = false;
+                this.pool = [];
+                this.stack = [];
+                this.pending = [];
+                this.remaning = 0;
+                this._trigged = false;
+                this._promise = null;
+            },
+
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             *
+             * 可以指定开始某一个文件。
+             * @grammar upload() => undefined
+             * @grammar upload( file | fileId) => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            startUpload: function(file) {
+                var me = this;
+
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+
+                // 如果指定了开始某个文件,则只开始指定文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        $.each( me.pool, function( _, v ) {
+
+                            // 之前暂停过。
+                            if (v.file !== file) {
+                                return;
+                            }
+
+                            v.transport && v.transport.send();
+                        });
+
+                        file.setStatus( Status.QUEUED );
+                    } else if (file.getStatus() === Status.PROGRESS) {
+                        return;
+                    } else {
+                        file.setStatus( Status.QUEUED );
+                    }
+                } else {
+                    $.each( me.request( 'get-files', [ Status.INITED ] ), function() {
+                        this.setStatus( Status.QUEUED );
+                    });
+                }
+
+                if ( me.runing ) {
+                    return;
+                }
+
+                me.runing = true;
+
+                var files = [];
+
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        files.push(file);
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+
+                var file;
+                while ( (file = files.shift()) ) {
+                    file.setStatus( Status.PROGRESS );
+                }
+
+                file || $.each( me.request( 'get-files',
+                        Status.INTERRUPT ), function() {
+                    this.setStatus( Status.PROGRESS );
+                });
+
+                me._trigged = false;
+                Base.nextTick( me.__tick );
+                me.owner.trigger('startUpload');
+            },
+
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             *
+             * 如果第一个参数是文件,则只暂停指定文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @grammar stop( file ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stopUpload: function( file, interrupt ) {
+                var me = this;
+
+                if (file === true) {
+                    interrupt = file;
+                    file = null;
+                }
+
+                if ( me.runing === false ) {
+                    return;
+                }
+
+                // 如果只是暂停某个文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if ( file.getStatus() !== Status.PROGRESS &&
+                            file.getStatus() !== Status.QUEUED ) {
+                        return;
+                    }
+
+                    file.setStatus( Status.INTERRUPT );
+                    $.each( me.pool, function( _, v ) {
+
+                        // 只 abort 指定的文件。
+                        if (v.file !== file) {
+                            return;
+                        }
+
+                        v.transport && v.transport.abort();
+                        me._putback(v);
+                        me._popBlock(v);
+                    });
+
+                    return Base.nextTick( me.__tick );
+                }
+
+                me.runing = false;
+
+                if (this._promise && this._promise.file) {
+                    this._promise.file.setStatus( Status.INTERRUPT );
+                }
+
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+
+                me.owner.trigger('stopUpload');
+            },
+
+            /**
+             * @method cancelFile
+             * @grammar cancelFile( file ) => undefined
+             * @grammar cancelFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 标记文件状态为已取消, 同时将中断文件传输。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.cancelFile( file );
+             * })
+             */
+            cancelFile: function( file ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                file.setStatus( Status.CANCELLED );
+                this.owner.trigger( 'fileDequeued', file );
+            },
+
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.progress;
+            },
+
+            _getStats: function() {
+                return this.request('get-stats');
+            },
+
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                this.owner.trigger( 'uploadSkip', file );
+            },
+
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+
+                    fn = function( val ) {
+                        me._promise = null;
+
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me._getStats().numOfQueue &&
+                    !me._getStats().numofInterrupt ) {
+                    me.runing = false;
+
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+
+            _putback: function(block) {
+                var idx;
+
+                block.cuted.unshift(block);
+                idx = this.stack.indexOf(block.cuted);
+
+                if (!~idx) {
+                    this.stack.unshift(block.cuted);
+                }
+            },
+
+            _getStack: function() {
+                var i = 0,
+                    act;
+
+                while ( (act = this.stack[ i++ ]) ) {
+                    if ( act.has() && act.file.getStatus() === Status.PROGRESS ) {
+                        return act;
+                    } else if (!act.has() ||
+                            act.file.getStatus() !== Status.PROGRESS &&
+                            act.file.getStatus() !== Status.INTERRUPT ) {
+
+                        // 把已经处理完了的,或者,状态为非 progress(上传中)、
+                        // interupt(暂停中) 的移除。
+                        this.stack.splice( --i, 1 );
+                    }
+                }
+
+                return null;
+            },
+
+            _nextBlock: function() {
+                var me = this,
+                    opts = me.options,
+                    act, next, done, preparing;
+
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( (act = this._getStack()) ) {
+
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+
+                    return act.shift();
+
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me._getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me.stack.push(act);
+                        return act.shift();
+                    };
+
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    if ( isPromise( next) ) {
+                        preparing = next.file;
+                        next = next[ next.pipe ? 'pipe' : 'then' ]( done );
+                        next.file = preparing;
+                        return next;
+                    }
+
+                    return done( next );
+                }
+            },
+
+
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.PROGRESS ||
+                            file.getStatus() === Status.INTERRUPT ) {
+                            return file;
+                        }
+
+                        return me._finishFile( file );
+                    });
+
+                    me.owner.trigger( 'uploadStart', file );
+                    file.setStatus( Status.PROGRESS );
+
+                    promise.file = file;
+
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+
+                    pending.push( promise );
+                }
+            },
+
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+
+                // 有可能在 before-send-file 的 promise 期间改变了文件状态。
+                // 如:暂停,取消
+                // 我们不能中断 promise, 但是可以在 promise 完后,不做上传操作。
+                if ( file.getStatus() !== Status.PROGRESS ) {
+
+                    // 如果是中断,则还需要放回去。
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        me._putback(block);
+                    }
+
+                    return;
+                }
+
+                me.pool.push( block );
+                me.remaning++;
+
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me.updateFileProgress( file );
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+
+
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @param {Object} headers 可以扩展此对象来控制上传头部。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+
+
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+
+                block.transport = tr;
+
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    block.percentage = percentage;
+                    me.updateFileProgress( file );
+                });
+
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+
+                    return reject;
+                };
+
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+
+                        block.retried++;
+                        tr.send();
+
+                    } else {
+
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            },
+
+            updateFileProgress: function(file) {
+                var totalPercent = 0,
+                    uploaded = 0;
+
+                if (!file.blocks) {
+                    return;
+                }
+
+                $.each( file.blocks, function( _, v ) {
+                    uploaded += (v.percentage || 0) * (v.end - v.start);
+                });
+
+                totalPercent = uploaded / file.size;
+                this.owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+            }
+
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+
+        var $ = Base.$,
+            validators = {},
+            api;
+
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * * `Q_TYPE_DENIED` 当文件类型不满足时触发。。
+         * @for  Uploader
+         */
+
+        // 暴露给外面的api
+        api = {
+
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            name: 'validator',
+
+            init: function() {
+                var me = this;
+                Base.nextTick(function() {
+                    $.each( validators, function() {
+                        this.call( me.owner );
+                    });
+                });
+            }
+        });
+
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileNumLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return count >= max ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileSizeLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return invalid ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', max, file );
+                    return false;
+                }
+
+            });
+
+        });
+
+        /**
+         * @property {Boolean} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+
+            if ( opts.duplicate ) {
+                return;
+            }
+
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+
+                return hash;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (mapping[ hash ] = true);
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (delete mapping[ hash ]);
+            });
+
+            uploader.on( 'reset', function() {
+                mapping = {};
+            });
+        });
+
+        return api;
+    });
+
+    /**
+     * @fileOverview Md5
+     */
+    define('lib/md5',[
+        'runtime/client',
+        'mediator'
+    ], function( RuntimeClient, Mediator ) {
+
+        function Md5() {
+            RuntimeClient.call( this, 'Md5' );
+        }
+
+        // 让 Md5 具备事件功能。
+        Mediator.installTo( Md5.prototype );
+
+        Md5.prototype.loadFromBlob = function( blob ) {
+            var me = this;
+
+            if ( me.getRuid() ) {
+                me.disconnectRuntime();
+            }
+
+            // 连接到blob归属的同一个runtime.
+            me.connectRuntime( blob.ruid, function() {
+                me.exec('init');
+                me.exec( 'loadFromBlob', blob );
+            });
+        };
+
+        Md5.prototype.getResult = function() {
+            return this.exec('getResult');
+        };
+
+        return Md5;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/md5',[
+        'base',
+        'uploader',
+        'lib/md5',
+        'lib/blob',
+        'widgets/widget'
+    ], function( Base, Uploader, Md5, Blob ) {
+
+        return Uploader.register({
+            name: 'md5',
+
+
+            /**
+             * 计算文件 md5 值,返回一个 promise 对象,可以监听 progress 进度。
+             *
+             *
+             * @method md5File
+             * @grammar md5File( file[, start[, end]] ) => promise
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.md5File( file )
+             *
+             *         // 及时显示进度
+             *         .progress(function(percentage) {
+             *             console.log('Percentage:', percentage);
+             *         })
+             *
+             *         // 完成
+             *         .then(function(val) {
+             *             console.log('md5 result:', val);
+             *         });
+             *
+             * });
+             */
+            md5File: function( file, start, end ) {
+                var md5 = new Md5(),
+                    deferred = Base.Deferred(),
+                    blob = (file instanceof Blob) ? file :
+                        this.request( 'get-file', file ).source;
+
+                md5.on( 'progress load', function( e ) {
+                    e = e || {};
+                    deferred.notify( e.total ? e.loaded / e.total : 1 );
+                });
+
+                md5.on( 'complete', function() {
+                    deferred.resolve( md5.getResult() );
+                });
+
+                md5.on( 'error', function( reason ) {
+                    deferred.reject( reason );
+                });
+
+                if ( arguments.length > 1 ) {
+                    start = start || 0;
+                    end = end || 0;
+                    start < 0 && (start = blob.size + start);
+                    end < 0 && (end = blob.size + end);
+                    end = Math.min( end, blob.size );
+                    blob = blob.slice( start, end );
+                }
+
+                md5.loadFromBlob( blob );
+
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+
+        function CompBase( owner, runtime ) {
+
+            this.owner = owner;
+            this.options = owner.options;
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var type = 'html5',
+            components = {};
+
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destroy = this.destroy;
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+
+            me.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+        }
+
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+
+        });
+
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+
+                blob = slice.call( blob, start, end );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+
+                e = e.originalEvent || e;
+
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+
+                return false;
+            },
+
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+
+                return false;
+            },
+
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 ),
+                    dataTransfer, data;
+
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                e = e.originalEvent || e;
+                dataTransfer = e.dataTransfer;
+
+                // 如果是页面内拖拽,还不能处理,不阻止事件。
+                // 此处 ie11 下会报参数错误,
+                try {
+                    data = dataTransfer.getData('text/html');
+                } catch( err ) {
+                }
+
+                if ( data ) {
+                    return;
+                }
+
+                me._getTansferFiles( dataTransfer, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( dataTransfer, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, file, item, i, len, canAccessFolder;
+
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+
+                Base.when.apply( Base, promises ).done(function() {
+
+                    if ( !results.length ) {
+                        return;
+                    }
+
+                    callback( results );
+                });
+            },
+
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                var elem = this.elem;
+
+                // 还没 init 就调用 destroy
+                if (!elem) {
+                    return;
+                }
+
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragOverHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+
+                    allowed.push( new File( ruid, blob ) );
+                }
+
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var $ = Base.$;
+
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    label = this.label = $( document.createElement('label') ),
+                    input =  this.input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+
+                label.on( 'click', function() {
+                    input.trigger('click');
+                });
+
+                label.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+
+                    input.attr( 'accept', arr.join(',') );
+                }
+
+                container.append( input );
+                container.append( label );
+
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+
+                    me.files = e.target.files;
+
+                    // reset input
+                    clone = this.cloneNode( true );
+                    clone.value = null;
+                    this.parentNode.replaceChild( clone, this );
+
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+
+                    owner.trigger('change');
+                });
+
+                label.on( 'mouseenter mouseleave', mouseHandler );
+
+            },
+
+
+            getFiles: function() {
+                return this.files;
+            },
+
+            destroy: function() {
+                this.input.off();
+                this.label.off();
+            }
+        });
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/util',[
+        'base'
+    ], function( Base ) {
+
+        var urlAPI = window.createObjectURL && window ||
+                window.URL && URL.revokeObjectURL && URL ||
+                window.webkitURL,
+            createObjectURL = Base.noop,
+            revokeObjectURL = createObjectURL;
+
+        if ( urlAPI ) {
+
+            // 更安全的方式调用,比如android里面就能把context改成其他的对象。
+            createObjectURL = function() {
+                return urlAPI.createObjectURL.apply( urlAPI, arguments );
+            };
+
+            revokeObjectURL = function() {
+                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
+            };
+        }
+
+        return {
+            createObjectURL: createObjectURL,
+            revokeObjectURL: revokeObjectURL,
+
+            dataURL2Blob: function( dataURI ) {
+                var byteStr, intArray, ab, i, mimetype, parts;
+
+                parts = dataURI.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+
+                ab = new ArrayBuffer( byteStr.length );
+                intArray = new Uint8Array( ab );
+
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+
+                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
+
+                return this.arrayBufferToBlob( ab, mimetype );
+            },
+
+            dataURL2ArrayBuffer: function( dataURI ) {
+                var byteStr, intArray, i, parts;
+
+                parts = dataURI.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+
+                intArray = new Uint8Array( byteStr.length );
+
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+
+                return intArray.buffer;
+            },
+
+            arrayBufferToBlob: function( buffer, type ) {
+                var builder = window.BlobBuilder || window.WebKitBlobBuilder,
+                    bb;
+
+                // android不支持直接new Blob, 只能借助blobbuilder.
+                if ( builder ) {
+                    bb = new builder();
+                    bb.append( buffer );
+                    return bb.getBlob( type );
+                }
+
+                return new Blob([ buffer ], type ? { type: type } : {} );
+            },
+
+            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
+            // 你得到的结果是png.
+            canvasToDataUrl: function( canvas, type, quality ) {
+                return canvas.toDataURL( type, quality / 100 );
+            },
+
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            parseMeta: function( blob, callback ) {
+                callback( false, {});
+            },
+
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            updateImageHead: function( data ) {
+                return data;
+            }
+        };
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/imagemeta',[
+        'runtime/html5/util'
+    ], function( Util ) {
+
+        var api;
+
+        api = {
+            parsers: {
+                0xffe1: []
+            },
+
+            maxMetaDataSize: 262144,
+
+            parse: function( blob, cb ) {
+                var me = this,
+                    fr = new FileReader();
+
+                fr.onload = function() {
+                    cb( false, me._parse( this.result ) );
+                    fr = fr.onload = fr.onerror = null;
+                };
+
+                fr.onerror = function( e ) {
+                    cb( e.message );
+                    fr = fr.onload = fr.onerror = null;
+                };
+
+                blob = blob.slice( 0, me.maxMetaDataSize );
+                fr.readAsArrayBuffer( blob.getSource() );
+            },
+
+            _parse: function( buffer, noParse ) {
+                if ( buffer.byteLength < 6 ) {
+                    return;
+                }
+
+                var dataview = new DataView( buffer ),
+                    offset = 2,
+                    maxOffset = dataview.byteLength - 4,
+                    headLength = offset,
+                    ret = {},
+                    markerBytes, markerLength, parsers, i;
+
+                if ( dataview.getUint16( 0 ) === 0xffd8 ) {
+
+                    while ( offset < maxOffset ) {
+                        markerBytes = dataview.getUint16( offset );
+
+                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
+                                markerBytes === 0xfffe ) {
+
+                            markerLength = dataview.getUint16( offset + 2 ) + 2;
+
+                            if ( offset + markerLength > dataview.byteLength ) {
+                                break;
+                            }
+
+                            parsers = api.parsers[ markerBytes ];
+
+                            if ( !noParse && parsers ) {
+                                for ( i = 0; i < parsers.length; i += 1 ) {
+                                    parsers[ i ].call( api, dataview, offset,
+                                            markerLength, ret );
+                                }
+                            }
+
+                            offset += markerLength;
+                            headLength = offset;
+                        } else {
+                            break;
+                        }
+                    }
+
+                    if ( headLength > 6 ) {
+                        if ( buffer.slice ) {
+                            ret.imageHead = buffer.slice( 2, headLength );
+                        } else {
+                            // Workaround for IE10, which does not yet
+                            // support ArrayBuffer.slice:
+                            ret.imageHead = new Uint8Array( buffer )
+                                    .subarray( 2, headLength );
+                        }
+                    }
+                }
+
+                return ret;
+            },
+
+            updateImageHead: function( buffer, head ) {
+                var data = this._parse( buffer, true ),
+                    buf1, buf2, bodyoffset;
+
+
+                bodyoffset = 2;
+                if ( data.imageHead ) {
+                    bodyoffset = 2 + data.imageHead.byteLength;
+                }
+
+                if ( buffer.slice ) {
+                    buf2 = buffer.slice( bodyoffset );
+                } else {
+                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
+                }
+
+                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
+
+                buf1[ 0 ] = 0xFF;
+                buf1[ 1 ] = 0xD8;
+                buf1.set( new Uint8Array( head ), 2 );
+                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
+
+                return buf1.buffer;
+            }
+        };
+
+        Util.parseMeta = function() {
+            return api.parse.apply( api, arguments );
+        };
+
+        Util.updateImageHead = function() {
+            return api.updateImageHead.apply( api, arguments );
+        };
+
+        return api;
+    });
+    /**
+     * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
+     * 暂时项目中只用了orientation.
+     *
+     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
+     * @fileOverview EXIF解析
+     */
+
+    // Sample
+    // ====================================
+    // Make : Apple
+    // Model : iPhone 4S
+    // Orientation : 1
+    // XResolution : 72 [72/1]
+    // YResolution : 72 [72/1]
+    // ResolutionUnit : 2
+    // Software : QuickTime 7.7.1
+    // DateTime : 2013:09:01 22:53:55
+    // ExifIFDPointer : 190
+    // ExposureTime : 0.058823529411764705 [1/17]
+    // FNumber : 2.4 [12/5]
+    // ExposureProgram : Normal program
+    // ISOSpeedRatings : 800
+    // ExifVersion : 0220
+    // DateTimeOriginal : 2013:09:01 22:52:51
+    // DateTimeDigitized : 2013:09:01 22:52:51
+    // ComponentsConfiguration : YCbCr
+    // ShutterSpeedValue : 4.058893515764426
+    // ApertureValue : 2.5260688216892597 [4845/1918]
+    // BrightnessValue : -0.3126686601998395
+    // MeteringMode : Pattern
+    // Flash : Flash did not fire, compulsory flash mode
+    // FocalLength : 4.28 [107/25]
+    // SubjectArea : [4 values]
+    // FlashpixVersion : 0100
+    // ColorSpace : 1
+    // PixelXDimension : 2448
+    // PixelYDimension : 3264
+    // SensingMethod : One-chip color area sensor
+    // ExposureMode : 0
+    // WhiteBalance : Auto white balance
+    // FocalLengthIn35mmFilm : 35
+    // SceneCaptureType : Standard
+    define('runtime/html5/imagemeta/exif',[
+        'base',
+        'runtime/html5/imagemeta'
+    ], function( Base, ImageMeta ) {
+
+        var EXIF = {};
+
+        EXIF.ExifMap = function() {
+            return this;
+        };
+
+        EXIF.ExifMap.prototype.map = {
+            'Orientation': 0x0112
+        };
+
+        EXIF.ExifMap.prototype.get = function( id ) {
+            return this[ id ] || this[ this.map[ id ] ];
+        };
+
+        EXIF.exifTagTypes = {
+            // byte, 8-bit unsigned int:
+            1: {
+                getValue: function( dataView, dataOffset ) {
+                    return dataView.getUint8( dataOffset );
+                },
+                size: 1
+            },
+
+            // ascii, 8-bit byte:
+            2: {
+                getValue: function( dataView, dataOffset ) {
+                    return String.fromCharCode( dataView.getUint8( dataOffset ) );
+                },
+                size: 1,
+                ascii: true
+            },
+
+            // short, 16 bit int:
+            3: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint16( dataOffset, littleEndian );
+                },
+                size: 2
+            },
+
+            // long, 32 bit int:
+            4: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+
+            // rational = two long values,
+            // first is numerator, second is denominator:
+            5: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian ) /
+                        dataView.getUint32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            },
+
+            // slong, 32 bit signed int:
+            9: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+
+            // srational, two slongs, first is numerator, second is denominator:
+            10: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian ) /
+                        dataView.getInt32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            }
+        };
+
+        // undefined, 8-bit byte, value depending on field:
+        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
+
+        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
+                littleEndian ) {
+
+            var tagType = EXIF.exifTagTypes[ type ],
+                tagSize, dataOffset, values, i, str, c;
+
+            if ( !tagType ) {
+                Base.log('Invalid Exif data: Invalid tag type.');
+                return;
+            }
+
+            tagSize = tagType.size * length;
+
+            // Determine if the value is contained in the dataOffset bytes,
+            // or if the value at the dataOffset is a pointer to the actual data:
+            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
+                    littleEndian ) : (offset + 8);
+
+            if ( dataOffset + tagSize > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid data offset.');
+                return;
+            }
+
+            if ( length === 1 ) {
+                return tagType.getValue( dataView, dataOffset, littleEndian );
+            }
+
+            values = [];
+
+            for ( i = 0; i < length; i += 1 ) {
+                values[ i ] = tagType.getValue( dataView,
+                        dataOffset + i * tagType.size, littleEndian );
+            }
+
+            if ( tagType.ascii ) {
+                str = '';
+
+                // Concatenate the chars:
+                for ( i = 0; i < values.length; i += 1 ) {
+                    c = values[ i ];
+
+                    // Ignore the terminating NULL byte(s):
+                    if ( c === '\u0000' ) {
+                        break;
+                    }
+                    str += c;
+                }
+
+                return str;
+            }
+            return values;
+        };
+
+        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
+                data ) {
+
+            var tag = dataView.getUint16( offset, littleEndian );
+            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
+                    dataView.getUint16( offset + 2, littleEndian ),    // tag type
+                    dataView.getUint32( offset + 4, littleEndian ),    // tag length
+                    littleEndian );
+        };
+
+        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
+                littleEndian, data ) {
+
+            var tagsNumber, dirEndOffset, i;
+
+            if ( dirOffset + 6 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory offset.');
+                return;
+            }
+
+            tagsNumber = dataView.getUint16( dirOffset, littleEndian );
+            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
+
+            if ( dirEndOffset + 4 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory size.');
+                return;
+            }
+
+            for ( i = 0; i < tagsNumber; i += 1 ) {
+                this.parseExifTag( dataView, tiffOffset,
+                        dirOffset + 2 + 12 * i,    // tag offset
+                        littleEndian, data );
+            }
+
+            // Return the offset to the next directory:
+            return dataView.getUint32( dirEndOffset, littleEndian );
+        };
+
+        // EXIF.getExifThumbnail = function(dataView, offset, length) {
+        //     var hexData,
+        //         i,
+        //         b;
+        //     if (!length || offset + length > dataView.byteLength) {
+        //         Base.log('Invalid Exif data: Invalid thumbnail data.');
+        //         return;
+        //     }
+        //     hexData = [];
+        //     for (i = 0; i < length; i += 1) {
+        //         b = dataView.getUint8(offset + i);
+        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));
+        //     }
+        //     return 'data:image/jpeg,%' + hexData.join('%');
+        // };
+
+        EXIF.parseExifData = function( dataView, offset, length, data ) {
+
+            var tiffOffset = offset + 10,
+                littleEndian, dirOffset;
+
+            // Check for the ASCII code for "Exif" (0x45786966):
+            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
+                // No Exif data, might be XMP data instead
+                return;
+            }
+            if ( tiffOffset + 8 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid segment size.');
+                return;
+            }
+
+            // Check for the two null bytes:
+            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
+                Base.log('Invalid Exif data: Missing byte alignment offset.');
+                return;
+            }
+
+            // Check the byte alignment:
+            switch ( dataView.getUint16( tiffOffset ) ) {
+                case 0x4949:
+                    littleEndian = true;
+                    break;
+
+                case 0x4D4D:
+                    littleEndian = false;
+                    break;
+
+                default:
+                    Base.log('Invalid Exif data: Invalid byte alignment marker.');
+                    return;
+            }
+
+            // Check for the TIFF tag marker (0x002A):
+            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
+                Base.log('Invalid Exif data: Missing TIFF marker.');
+                return;
+            }
+
+            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
+            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
+            // Create the exif object to store the tags:
+            data.exif = new EXIF.ExifMap();
+            // Parse the tags of the main image directory and retrieve the
+            // offset to the next directory, usually the thumbnail directory:
+            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
+                    tiffOffset + dirOffset, littleEndian, data );
+
+            // 尝试读取缩略图
+            // if ( dirOffset ) {
+            //     thumbnailData = {exif: {}};
+            //     dirOffset = EXIF.parseExifTags(
+            //         dataView,
+            //         tiffOffset,
+            //         tiffOffset + dirOffset,
+            //         littleEndian,
+            //         thumbnailData
+            //     );
+
+            //     // Check for JPEG Thumbnail offset:
+            //     if (thumbnailData.exif[0x0201]) {
+            //         data.exif.Thumbnail = EXIF.getExifThumbnail(
+            //             dataView,
+            //             tiffOffset + thumbnailData.exif[0x0201],
+            //             thumbnailData.exif[0x0202] // Thumbnail data length
+            //         );
+            //     }
+            // }
+        };
+
+        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
+        return EXIF;
+    });
+    /**
+     * 这个方式性能不行,但是可以解决android里面的toDataUrl的bug
+     * android里面toDataUrl('image/jpege')得到的结果却是png.
+     *
+     * 所以这里没辙,只能借助这个工具
+     * @fileOverview jpeg encoder
+     */
+    define('runtime/html5/jpegencoder',[], function( require, exports, module ) {
+
+        /*
+          Copyright (c) 2008, Adobe Systems Incorporated
+          All rights reserved.
+
+          Redistribution and use in source and binary forms, with or without
+          modification, are permitted provided that the following conditions are
+          met:
+
+          * Redistributions of source code must retain the above copyright notice,
+            this list of conditions and the following disclaimer.
+
+          * Redistributions in binary form must reproduce the above copyright
+            notice, this list of conditions and the following disclaimer in the
+            documentation and/or other materials provided with the distribution.
+
+          * Neither the name of Adobe Systems Incorporated nor the names of its
+            contributors may be used to endorse or promote products derived from
+            this software without specific prior written permission.
+
+          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+          IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+          PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+          CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+          EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+          PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+          PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+          NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+          SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+        */
+        /*
+        JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009
+
+        Basic GUI blocking jpeg encoder
+        */
+
+        function JPEGEncoder(quality) {
+          var self = this;
+            var fround = Math.round;
+            var ffloor = Math.floor;
+            var YTable = new Array(64);
+            var UVTable = new Array(64);
+            var fdtbl_Y = new Array(64);
+            var fdtbl_UV = new Array(64);
+            var YDC_HT;
+            var UVDC_HT;
+            var YAC_HT;
+            var UVAC_HT;
+
+            var bitcode = new Array(65535);
+            var category = new Array(65535);
+            var outputfDCTQuant = new Array(64);
+            var DU = new Array(64);
+            var byteout = [];
+            var bytenew = 0;
+            var bytepos = 7;
+
+            var YDU = new Array(64);
+            var UDU = new Array(64);
+            var VDU = new Array(64);
+            var clt = new Array(256);
+            var RGB_YUV_TABLE = new Array(2048);
+            var currentQuality;
+
+            var ZigZag = [
+                     0, 1, 5, 6,14,15,27,28,
+                     2, 4, 7,13,16,26,29,42,
+                     3, 8,12,17,25,30,41,43,
+                     9,11,18,24,31,40,44,53,
+                    10,19,23,32,39,45,52,54,
+                    20,22,33,38,46,51,55,60,
+                    21,34,37,47,50,56,59,61,
+                    35,36,48,49,57,58,62,63
+                ];
+
+            var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
+            var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
+            var std_ac_luminance_values = [
+                    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
+                    0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
+                    0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
+                    0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
+                    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
+                    0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
+                    0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
+                    0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
+                    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
+                    0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
+                    0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
+                    0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
+                    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
+                    0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
+                    0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
+                    0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
+                    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
+                    0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
+                    0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
+                    0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+
+            var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
+            var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
+            var std_ac_chrominance_values = [
+                    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
+                    0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
+                    0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
+                    0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
+                    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
+                    0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
+                    0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
+                    0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
+                    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
+                    0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
+                    0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
+                    0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
+                    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
+                    0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
+                    0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
+                    0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
+                    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
+                    0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
+                    0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
+                    0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+
+            function initQuantTables(sf){
+                    var YQT = [
+                        16, 11, 10, 16, 24, 40, 51, 61,
+                        12, 12, 14, 19, 26, 58, 60, 55,
+                        14, 13, 16, 24, 40, 57, 69, 56,
+                        14, 17, 22, 29, 51, 87, 80, 62,
+                        18, 22, 37, 56, 68,109,103, 77,
+                        24, 35, 55, 64, 81,104,113, 92,
+                        49, 64, 78, 87,103,121,120,101,
+                        72, 92, 95, 98,112,100,103, 99
+                    ];
+
+                    for (var i = 0; i < 64; i++) {
+                        var t = ffloor((YQT[i]*sf+50)/100);
+                        if (t < 1) {
+                            t = 1;
+                        } else if (t > 255) {
+                            t = 255;
+                        }
+                        YTable[ZigZag[i]] = t;
+                    }
+                    var UVQT = [
+                        17, 18, 24, 47, 99, 99, 99, 99,
+                        18, 21, 26, 66, 99, 99, 99, 99,
+                        24, 26, 56, 99, 99, 99, 99, 99,
+                        47, 66, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99
+                    ];
+                    for (var j = 0; j < 64; j++) {
+                        var u = ffloor((UVQT[j]*sf+50)/100);
+                        if (u < 1) {
+                            u = 1;
+                        } else if (u > 255) {
+                            u = 255;
+                        }
+                        UVTable[ZigZag[j]] = u;
+                    }
+                    var aasf = [
+                        1.0, 1.387039845, 1.306562965, 1.175875602,
+                        1.0, 0.785694958, 0.541196100, 0.275899379
+                    ];
+                    var k = 0;
+                    for (var row = 0; row < 8; row++)
+                    {
+                        for (var col = 0; col < 8; col++)
+                        {
+                            fdtbl_Y[k]  = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            k++;
+                        }
+                    }
+                }
+
+                function computeHuffmanTbl(nrcodes, std_table){
+                    var codevalue = 0;
+                    var pos_in_table = 0;
+                    var HT = new Array();
+                    for (var k = 1; k <= 16; k++) {
+                        for (var j = 1; j <= nrcodes[k]; j++) {
+                            HT[std_table[pos_in_table]] = [];
+                            HT[std_table[pos_in_table]][0] = codevalue;
+                            HT[std_table[pos_in_table]][1] = k;
+                            pos_in_table++;
+                            codevalue++;
+                        }
+                        codevalue*=2;
+                    }
+                    return HT;
+                }
+
+                function initHuffmanTbl()
+                {
+                    YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
+                    UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
+                    YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
+                    UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
+                }
+
+                function initCategoryNumber()
+                {
+                    var nrlower = 1;
+                    var nrupper = 2;
+                    for (var cat = 1; cat <= 15; cat++) {
+                        //Positive numbers
+                        for (var nr = nrlower; nr<nrupper; nr++) {
+                            category[32767+nr] = cat;
+                            bitcode[32767+nr] = [];
+                            bitcode[32767+nr][1] = cat;
+                            bitcode[32767+nr][0] = nr;
+                        }
+                        //Negative numbers
+                        for (var nrneg =-(nrupper-1); nrneg<=-nrlower; nrneg++) {
+                            category[32767+nrneg] = cat;
+                            bitcode[32767+nrneg] = [];
+                            bitcode[32767+nrneg][1] = cat;
+                            bitcode[32767+nrneg][0] = nrupper-1+nrneg;
+                        }
+                        nrlower <<= 1;
+                        nrupper <<= 1;
+                    }
+                }
+
+                function initRGBYUVTable() {
+                    for(var i = 0; i < 256;i++) {
+                        RGB_YUV_TABLE[i]            =  19595 * i;
+                        RGB_YUV_TABLE[(i+ 256)>>0]  =  38470 * i;
+                        RGB_YUV_TABLE[(i+ 512)>>0]  =   7471 * i + 0x8000;
+                        RGB_YUV_TABLE[(i+ 768)>>0]  = -11059 * i;
+                        RGB_YUV_TABLE[(i+1024)>>0]  = -21709 * i;
+                        RGB_YUV_TABLE[(i+1280)>>0]  =  32768 * i + 0x807FFF;
+                        RGB_YUV_TABLE[(i+1536)>>0]  = -27439 * i;
+                        RGB_YUV_TABLE[(i+1792)>>0]  = - 5329 * i;
+                    }
+                }
+
+                // IO functions
+                function writeBits(bs)
+                {
+                    var value = bs[0];
+                    var posval = bs[1]-1;
+                    while ( posval >= 0 ) {
+                        if (value & (1 << posval) ) {
+                            bytenew |= (1 << bytepos);
+                        }
+                        posval--;
+                        bytepos--;
+                        if (bytepos < 0) {
+                            if (bytenew == 0xFF) {
+                                writeByte(0xFF);
+                                writeByte(0);
+                            }
+                            else {
+                                writeByte(bytenew);
+                            }
+                            bytepos=7;
+                            bytenew=0;
+                        }
+                    }
+                }
+
+                function writeByte(value)
+                {
+                    byteout.push(clt[value]); // write char directly instead of converting later
+                }
+
+                function writeWord(value)
+                {
+                    writeByte((value>>8)&0xFF);
+                    writeByte((value   )&0xFF);
+                }
+
+                // DCT & quantization core
+                function fDCTQuant(data, fdtbl)
+                {
+                    var d0, d1, d2, d3, d4, d5, d6, d7;
+                    /* Pass 1: process rows. */
+                    var dataOff=0;
+                    var i;
+                    var I8 = 8;
+                    var I64 = 64;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff+1];
+                        d2 = data[dataOff+2];
+                        d3 = data[dataOff+3];
+                        d4 = data[dataOff+4];
+                        d5 = data[dataOff+5];
+                        d6 = data[dataOff+6];
+                        d7 = data[dataOff+7];
+
+                        var tmp0 = d0 + d7;
+                        var tmp7 = d0 - d7;
+                        var tmp1 = d1 + d6;
+                        var tmp6 = d1 - d6;
+                        var tmp2 = d2 + d5;
+                        var tmp5 = d2 - d5;
+                        var tmp3 = d3 + d4;
+                        var tmp4 = d3 - d4;
+
+                        /* Even part */
+                        var tmp10 = tmp0 + tmp3;    /* phase 2 */
+                        var tmp13 = tmp0 - tmp3;
+                        var tmp11 = tmp1 + tmp2;
+                        var tmp12 = tmp1 - tmp2;
+
+                        data[dataOff] = tmp10 + tmp11; /* phase 3 */
+                        data[dataOff+4] = tmp10 - tmp11;
+
+                        var z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */
+                        data[dataOff+2] = tmp13 + z1; /* phase 5 */
+                        data[dataOff+6] = tmp13 - z1;
+
+                        /* Odd part */
+                        tmp10 = tmp4 + tmp5; /* phase 2 */
+                        tmp11 = tmp5 + tmp6;
+                        tmp12 = tmp6 + tmp7;
+
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */
+                        var z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */
+                        var z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */
+                        var z3 = tmp11 * 0.707106781; /* c4 */
+
+                        var z11 = tmp7 + z3;    /* phase 5 */
+                        var z13 = tmp7 - z3;
+
+                        data[dataOff+5] = z13 + z2; /* phase 6 */
+                        data[dataOff+3] = z13 - z2;
+                        data[dataOff+1] = z11 + z4;
+                        data[dataOff+7] = z11 - z4;
+
+                        dataOff += 8; /* advance pointer to next row */
+                    }
+
+                    /* Pass 2: process columns. */
+                    dataOff = 0;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff + 8];
+                        d2 = data[dataOff + 16];
+                        d3 = data[dataOff + 24];
+                        d4 = data[dataOff + 32];
+                        d5 = data[dataOff + 40];
+                        d6 = data[dataOff + 48];
+                        d7 = data[dataOff + 56];
+
+                        var tmp0p2 = d0 + d7;
+                        var tmp7p2 = d0 - d7;
+                        var tmp1p2 = d1 + d6;
+                        var tmp6p2 = d1 - d6;
+                        var tmp2p2 = d2 + d5;
+                        var tmp5p2 = d2 - d5;
+                        var tmp3p2 = d3 + d4;
+                        var tmp4p2 = d3 - d4;
+
+                        /* Even part */
+                        var tmp10p2 = tmp0p2 + tmp3p2;  /* phase 2 */
+                        var tmp13p2 = tmp0p2 - tmp3p2;
+                        var tmp11p2 = tmp1p2 + tmp2p2;
+                        var tmp12p2 = tmp1p2 - tmp2p2;
+
+                        data[dataOff] = tmp10p2 + tmp11p2; /* phase 3 */
+                        data[dataOff+32] = tmp10p2 - tmp11p2;
+
+                        var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781; /* c4 */
+                        data[dataOff+16] = tmp13p2 + z1p2; /* phase 5 */
+                        data[dataOff+48] = tmp13p2 - z1p2;
+
+                        /* Odd part */
+                        tmp10p2 = tmp4p2 + tmp5p2; /* phase 2 */
+                        tmp11p2 = tmp5p2 + tmp6p2;
+                        tmp12p2 = tmp6p2 + tmp7p2;
+
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433; /* c6 */
+                        var z2p2 = 0.541196100 * tmp10p2 + z5p2; /* c2-c6 */
+                        var z4p2 = 1.306562965 * tmp12p2 + z5p2; /* c2+c6 */
+                        var z3p2 = tmp11p2 * 0.707106781; /* c4 */
+
+                        var z11p2 = tmp7p2 + z3p2;  /* phase 5 */
+                        var z13p2 = tmp7p2 - z3p2;
+
+                        data[dataOff+40] = z13p2 + z2p2; /* phase 6 */
+                        data[dataOff+24] = z13p2 - z2p2;
+                        data[dataOff+ 8] = z11p2 + z4p2;
+                        data[dataOff+56] = z11p2 - z4p2;
+
+                        dataOff++; /* advance pointer to next column */
+                    }
+
+                    // Quantize/descale the coefficients
+                    var fDCTQuant;
+                    for (i=0; i<I64; ++i)
+                    {
+                        // Apply the quantization and scaling factor & Round to nearest integer
+                        fDCTQuant = data[i]*fdtbl[i];
+                        outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);
+                        //outputfDCTQuant[i] = fround(fDCTQuant);
+
+                    }
+                    return outputfDCTQuant;
+                }
+
+                function writeAPP0()
+                {
+                    writeWord(0xFFE0); // marker
+                    writeWord(16); // length
+                    writeByte(0x4A); // J
+                    writeByte(0x46); // F
+                    writeByte(0x49); // I
+                    writeByte(0x46); // F
+                    writeByte(0); // = "JFIF",'\0'
+                    writeByte(1); // versionhi
+                    writeByte(1); // versionlo
+                    writeByte(0); // xyunits
+                    writeWord(1); // xdensity
+                    writeWord(1); // ydensity
+                    writeByte(0); // thumbnwidth
+                    writeByte(0); // thumbnheight
+                }
+
+                function writeSOF0(width, height)
+                {
+                    writeWord(0xFFC0); // marker
+                    writeWord(17);   // length, truecolor YUV JPG
+                    writeByte(8);    // precision
+                    writeWord(height);
+                    writeWord(width);
+                    writeByte(3);    // nrofcomponents
+                    writeByte(1);    // IdY
+                    writeByte(0x11); // HVY
+                    writeByte(0);    // QTY
+                    writeByte(2);    // IdU
+                    writeByte(0x11); // HVU
+                    writeByte(1);    // QTU
+                    writeByte(3);    // IdV
+                    writeByte(0x11); // HVV
+                    writeByte(1);    // QTV
+                }
+
+                function writeDQT()
+                {
+                    writeWord(0xFFDB); // marker
+                    writeWord(132);    // length
+                    writeByte(0);
+                    for (var i=0; i<64; i++) {
+                        writeByte(YTable[i]);
+                    }
+                    writeByte(1);
+                    for (var j=0; j<64; j++) {
+                        writeByte(UVTable[j]);
+                    }
+                }
+
+                function writeDHT()
+                {
+                    writeWord(0xFFC4); // marker
+                    writeWord(0x01A2); // length
+
+                    writeByte(0); // HTYDCinfo
+                    for (var i=0; i<16; i++) {
+                        writeByte(std_dc_luminance_nrcodes[i+1]);
+                    }
+                    for (var j=0; j<=11; j++) {
+                        writeByte(std_dc_luminance_values[j]);
+                    }
+
+                    writeByte(0x10); // HTYACinfo
+                    for (var k=0; k<16; k++) {
+                        writeByte(std_ac_luminance_nrcodes[k+1]);
+                    }
+                    for (var l=0; l<=161; l++) {
+                        writeByte(std_ac_luminance_values[l]);
+                    }
+
+                    writeByte(1); // HTUDCinfo
+                    for (var m=0; m<16; m++) {
+                        writeByte(std_dc_chrominance_nrcodes[m+1]);
+                    }
+                    for (var n=0; n<=11; n++) {
+                        writeByte(std_dc_chrominance_values[n]);
+                    }
+
+                    writeByte(0x11); // HTUACinfo
+                    for (var o=0; o<16; o++) {
+                        writeByte(std_ac_chrominance_nrcodes[o+1]);
+                    }
+                    for (var p=0; p<=161; p++) {
+                        writeByte(std_ac_chrominance_values[p]);
+                    }
+                }
+
+                function writeSOS()
+                {
+                    writeWord(0xFFDA); // marker
+                    writeWord(12); // length
+                    writeByte(3); // nrofcomponents
+                    writeByte(1); // IdY
+                    writeByte(0); // HTY
+                    writeByte(2); // IdU
+                    writeByte(0x11); // HTU
+                    writeByte(3); // IdV
+                    writeByte(0x11); // HTV
+                    writeByte(0); // Ss
+                    writeByte(0x3f); // Se
+                    writeByte(0); // Bf
+                }
+
+                function processDU(CDU, fdtbl, DC, HTDC, HTAC){
+                    var EOB = HTAC[0x00];
+                    var M16zeroes = HTAC[0xF0];
+                    var pos;
+                    var I16 = 16;
+                    var I63 = 63;
+                    var I64 = 64;
+                    var DU_DCT = fDCTQuant(CDU, fdtbl);
+                    //ZigZag reorder
+                    for (var j=0;j<I64;++j) {
+                        DU[ZigZag[j]]=DU_DCT[j];
+                    }
+                    var Diff = DU[0] - DC; DC = DU[0];
+                    //Encode DC
+                    if (Diff==0) {
+                        writeBits(HTDC[0]); // Diff might be 0
+                    } else {
+                        pos = 32767+Diff;
+                        writeBits(HTDC[category[pos]]);
+                        writeBits(bitcode[pos]);
+                    }
+                    //Encode ACs
+                    var end0pos = 63; // was const... which is crazy
+                    for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {};
+                    //end0pos = first element in reverse order !=0
+                    if ( end0pos == 0) {
+                        writeBits(EOB);
+                        return DC;
+                    }
+                    var i = 1;
+                    var lng;
+                    while ( i <= end0pos ) {
+                        var startpos = i;
+                        for (; (DU[i]==0) && (i<=end0pos); ++i) {}
+                        var nrzeroes = i-startpos;
+                        if ( nrzeroes >= I16 ) {
+                            lng = nrzeroes>>4;
+                            for (var nrmarker=1; nrmarker <= lng; ++nrmarker)
+                                writeBits(M16zeroes);
+                            nrzeroes = nrzeroes&0xF;
+                        }
+                        pos = 32767+DU[i];
+                        writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
+                        writeBits(bitcode[pos]);
+                        i++;
+                    }
+                    if ( end0pos != I63 ) {
+                        writeBits(EOB);
+                    }
+                    return DC;
+                }
+
+                function initCharLookupTable(){
+                    var sfcc = String.fromCharCode;
+                    for(var i=0; i < 256; i++){ ///// ACHTUNG // 255
+                        clt[i] = sfcc(i);
+                    }
+                }
+
+                this.encode = function(image,quality) // image data object
+                {
+                    // var time_start = new Date().getTime();
+
+                    if(quality) setQuality(quality);
+
+                    // Initialize bit writer
+                    byteout = new Array();
+                    bytenew=0;
+                    bytepos=7;
+
+                    // Add JPEG headers
+                    writeWord(0xFFD8); // SOI
+                    writeAPP0();
+                    writeDQT();
+                    writeSOF0(image.width,image.height);
+                    writeDHT();
+                    writeSOS();
+
+
+                    // Encode 8x8 macroblocks
+                    var DCY=0;
+                    var DCU=0;
+                    var DCV=0;
+
+                    bytenew=0;
+                    bytepos=7;
+
+
+                    this.encode.displayName = "_encode_";
+
+                    var imageData = image.data;
+                    var width = image.width;
+                    var height = image.height;
+
+                    var quadWidth = width*4;
+                    var tripleWidth = width*3;
+
+                    var x, y = 0;
+                    var r, g, b;
+                    var start,p, col,row,pos;
+                    while(y < height){
+                        x = 0;
+                        while(x < quadWidth){
+                        start = quadWidth * y + x;
+                        p = start;
+                        col = -1;
+                        row = 0;
+
+                        for(pos=0; pos < 64; pos++){
+                            row = pos >> 3;// /8
+                            col = ( pos & 7 ) * 4; // %8
+                            p = start + ( row * quadWidth ) + col;
+
+                            if(y+row >= height){ // padding bottom
+                                p-= (quadWidth*(y+1+row-height));
+                            }
+
+                            if(x+col >= quadWidth){ // padding right
+                                p-= ((x+col) - quadWidth +4)
+                            }
+
+                            r = imageData[ p++ ];
+                            g = imageData[ p++ ];
+                            b = imageData[ p++ ];
+
+
+                            /* // calculate YUV values dynamically
+                            YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
+                            UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
+                            VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
+                            */
+
+                            // use lookup table (slightly faster)
+                            YDU[pos] = ((RGB_YUV_TABLE[r]             + RGB_YUV_TABLE[(g +  256)>>0] + RGB_YUV_TABLE[(b +  512)>>0]) >> 16)-128;
+                            UDU[pos] = ((RGB_YUV_TABLE[(r +  768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;
+                            VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;
+
+                        }
+
+                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
+                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
+                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
+                        x+=32;
+                        }
+                        y+=8;
+                    }
+
+
+                    ////////////////////////////////////////////////////////////////
+
+                    // Do the bit alignment of the EOI marker
+                    if ( bytepos >= 0 ) {
+                        var fillbits = [];
+                        fillbits[1] = bytepos+1;
+                        fillbits[0] = (1<<(bytepos+1))-1;
+                        writeBits(fillbits);
+                    }
+
+                    writeWord(0xFFD9); //EOI
+
+                    var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
+
+                    byteout = [];
+
+                    // benchmarking
+                    // var duration = new Date().getTime() - time_start;
+                    // console.log('Encoding time: '+ currentQuality + 'ms');
+                    //
+
+                    return jpegDataUri
+            }
+
+            function setQuality(quality){
+                if (quality <= 0) {
+                    quality = 1;
+                }
+                if (quality > 100) {
+                    quality = 100;
+                }
+
+                if(currentQuality == quality) return // don't recalc if unchanged
+
+                var sf = 0;
+                if (quality < 50) {
+                    sf = Math.floor(5000 / quality);
+                } else {
+                    sf = Math.floor(200 - quality*2);
+                }
+
+                initQuantTables(sf);
+                currentQuality = quality;
+                // console.log('Quality set to: '+quality +'%');
+            }
+
+            function init(){
+                // var time_start = new Date().getTime();
+                if(!quality) quality = 50;
+                // Create tables
+                initCharLookupTable()
+                initHuffmanTbl();
+                initCategoryNumber();
+                initRGBYUVTable();
+
+                setQuality(quality);
+                // var duration = new Date().getTime() - time_start;
+                // console.log('Initialization '+ duration + 'ms');
+            }
+
+            init();
+
+        };
+
+        JPEGEncoder.encode = function( data, quality ) {
+            var encoder = new JPEGEncoder( quality );
+
+            return encoder.encode( data );
+        }
+
+        return JPEGEncoder;
+    });
+    /**
+     * @fileOverview Fix android canvas.toDataUrl bug.
+     */
+    define('runtime/html5/androidpatch',[
+        'runtime/html5/util',
+        'runtime/html5/jpegencoder',
+        'base'
+    ], function( Util, encoder, Base ) {
+        var origin = Util.canvasToDataUrl,
+            supportJpeg;
+
+        Util.canvasToDataUrl = function( canvas, type, quality ) {
+            var ctx, w, h, fragement, parts;
+
+            // 非android手机直接跳过。
+            if ( !Base.os.android ) {
+                return origin.apply( null, arguments );
+            }
+
+            // 检测是否canvas支持jpeg导出,根据数据格式来判断。
+            // JPEG 前两位分别是:255, 216
+            if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {
+                fragement = origin.apply( null, arguments );
+
+                parts = fragement.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    fragement = atob( parts[ 1 ] );
+                } else {
+                    fragement = decodeURIComponent( parts[ 1 ] );
+                }
+
+                fragement = fragement.substring( 0, 2 );
+
+                supportJpeg = fragement.charCodeAt( 0 ) === 255 &&
+                        fragement.charCodeAt( 1 ) === 216;
+            }
+
+            // 只有在android环境下才修复
+            if ( type === 'image/jpeg' && !supportJpeg ) {
+                w = canvas.width;
+                h = canvas.height;
+                ctx = canvas.getContext('2d');
+
+                return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );
+            }
+
+            return origin.apply( null, arguments );
+        };
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('runtime/html5/image',[
+        'base',
+        'runtime/html5/runtime',
+        'runtime/html5/util'
+    ], function( Base, Html5Runtime, Util ) {
+
+        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
+
+        return Html5Runtime.register( 'Image', {
+
+            // flag: 标记是否被修改过。
+            modified: false,
+
+            init: function() {
+                var me = this,
+                    img = new Image();
+
+                img.onload = function() {
+
+                    me._info = {
+                        type: me.type,
+                        width: this.width,
+                        height: this.height
+                    };
+
+                    // 读取meta信息。
+                    if ( !me._metas && 'image/jpeg' === me.type ) {
+                        Util.parseMeta( me._blob, function( error, ret ) {
+                            me._metas = ret;
+                            me.owner.trigger('load');
+                        });
+                    } else {
+                        me.owner.trigger('load');
+                    }
+                };
+
+                img.onerror = function() {
+                    me.owner.trigger('error');
+                };
+
+                me._img = img;
+            },
+
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    img = me._img;
+
+                me._blob = blob;
+                me.type = blob.type;
+                img.src = Util.createObjectURL( blob.getSource() );
+                me.owner.once( 'load', function() {
+                    Util.revokeObjectURL( img.src );
+                });
+            },
+
+            resize: function( width, height ) {
+                var canvas = this._canvas ||
+                        (this._canvas = document.createElement('canvas'));
+
+                this._resize( this._img, canvas, width, height );
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger( 'complete', 'resize' );
+            },
+
+            crop: function( x, y, w, h, s ) {
+                var cvs = this._canvas ||
+                        (this._canvas = document.createElement('canvas')),
+                    opts = this.options,
+                    img = this._img,
+                    iw = img.naturalWidth,
+                    ih = img.naturalHeight,
+                    orientation = this.getOrientation();
+
+                s = s || 1;
+
+                // todo 解决 orientation 的问题。
+                // values that require 90 degree rotation
+                // if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+
+                //     switch ( orientation ) {
+                //         case 6:
+                //             tmp = x;
+                //             x = y;
+                //             y = iw * s - tmp - w;
+                //             console.log(ih * s, tmp, w)
+                //             break;
+                //     }
+
+                //     (w ^= h, h ^= w, w ^= h);
+                // }
+
+                cvs.width = w;
+                cvs.height = h;
+
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+                this._renderImageToCanvas( cvs, img, -x, -y, iw * s, ih * s );
+
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger( 'complete', 'crop' );
+            },
+
+            getAsBlob: function( type ) {
+                var blob = this._blob,
+                    opts = this.options,
+                    canvas;
+
+                type = type || this.type;
+
+                // blob需要重新生成。
+                if ( this.modified || this.type !== type ) {
+                    canvas = this._canvas;
+
+                    if ( type === 'image/jpeg' ) {
+
+                        blob = Util.canvasToDataUrl( canvas, type, opts.quality );
+
+                        if ( opts.preserveHeaders && this._metas &&
+                                this._metas.imageHead ) {
+
+                            blob = Util.dataURL2ArrayBuffer( blob );
+                            blob = Util.updateImageHead( blob,
+                                    this._metas.imageHead );
+                            blob = Util.arrayBufferToBlob( blob, type );
+                            return blob;
+                        }
+                    } else {
+                        blob = Util.canvasToDataUrl( canvas, type );
+                    }
+
+                    blob = Util.dataURL2Blob( blob );
+                }
+
+                return blob;
+            },
+
+            getAsDataUrl: function( type ) {
+                var opts = this.options;
+
+                type = type || this.type;
+
+                if ( type === 'image/jpeg' ) {
+                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );
+                } else {
+                    return this._canvas.toDataURL( type );
+                }
+            },
+
+            getOrientation: function() {
+                return this._metas && this._metas.exif &&
+                        this._metas.exif.get('Orientation') || 1;
+            },
+
+            info: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+
+                // getter
+                return this._info;
+            },
+
+            meta: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+
+                // getter
+                return this._meta;
+            },
+
+            destroy: function() {
+                var canvas = this._canvas;
+                this._img.onload = null;
+
+                if ( canvas ) {
+                    canvas.getContext('2d')
+                            .clearRect( 0, 0, canvas.width, canvas.height );
+                    canvas.width = canvas.height = 0;
+                    this._canvas = null;
+                }
+
+                // 释放内存。非常重要,否则释放不了image的内存。
+                this._img.src = BLANK;
+                this._img = this._blob = null;
+            },
+
+            _resize: function( img, cvs, width, height ) {
+                var opts = this.options,
+                    naturalWidth = img.width,
+                    naturalHeight = img.height,
+                    orientation = this.getOrientation(),
+                    scale, w, h, x, y;
+
+                // values that require 90 degree rotation
+                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+
+                    // 交换width, height的值。
+                    width ^= height;
+                    height ^= width;
+                    width ^= height;
+                }
+
+                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
+                        height / naturalHeight );
+
+                // 不允许放大。
+                opts.allowMagnify || (scale = Math.min( 1, scale ));
+
+                w = naturalWidth * scale;
+                h = naturalHeight * scale;
+
+                if ( opts.crop ) {
+                    cvs.width = width;
+                    cvs.height = height;
+                } else {
+                    cvs.width = w;
+                    cvs.height = h;
+                }
+
+                x = (cvs.width - w) / 2;
+                y = (cvs.height - h) / 2;
+
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+
+                this._renderImageToCanvas( cvs, img, x, y, w, h );
+            },
+
+            _rotate2Orientaion: function( canvas, orientation ) {
+                var width = canvas.width,
+                    height = canvas.height,
+                    ctx = canvas.getContext('2d');
+
+                switch ( orientation ) {
+                    case 5:
+                    case 6:
+                    case 7:
+                    case 8:
+                        canvas.width = height;
+                        canvas.height = width;
+                        break;
+                }
+
+                switch ( orientation ) {
+                    case 2:    // horizontal flip
+                        ctx.translate( width, 0 );
+                        ctx.scale( -1, 1 );
+                        break;
+
+                    case 3:    // 180 rotate left
+                        ctx.translate( width, height );
+                        ctx.rotate( Math.PI );
+                        break;
+
+                    case 4:    // vertical flip
+                        ctx.translate( 0, height );
+                        ctx.scale( 1, -1 );
+                        break;
+
+                    case 5:    // vertical flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.scale( 1, -1 );
+                        break;
+
+                    case 6:    // 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( 0, -height );
+                        break;
+
+                    case 7:    // horizontal flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( width, -height );
+                        ctx.scale( -1, 1 );
+                        break;
+
+                    case 8:    // 90 rotate left
+                        ctx.rotate( -0.5 * Math.PI );
+                        ctx.translate( -width, 0 );
+                        break;
+                }
+            },
+
+            // https://github.com/stomita/ios-imagefile-megapixel/
+            // blob/master/src/megapix-image.js
+            _renderImageToCanvas: (function() {
+
+                // 如果不是ios, 不需要这么复杂!
+                if ( !Base.os.ios ) {
+                    return function( canvas ) {
+                        var args = Base.slice( arguments, 1 ),
+                            ctx = canvas.getContext('2d');
+
+                        ctx.drawImage.apply( ctx, args );
+                    };
+                }
+
+                /**
+                 * Detecting vertical squash in loaded image.
+                 * Fixes a bug which squash image vertically while drawing into
+                 * canvas for some images.
+                 */
+                function detectVerticalSquash( img, iw, ih ) {
+                    var canvas = document.createElement('canvas'),
+                        ctx = canvas.getContext('2d'),
+                        sy = 0,
+                        ey = ih,
+                        py = ih,
+                        data, alpha, ratio;
+
+
+                    canvas.width = 1;
+                    canvas.height = ih;
+                    ctx.drawImage( img, 0, 0 );
+                    data = ctx.getImageData( 0, 0, 1, ih ).data;
+
+                    // search image edge pixel position in case
+                    // it is squashed vertically.
+                    while ( py > sy ) {
+                        alpha = data[ (py - 1) * 4 + 3 ];
+
+                        if ( alpha === 0 ) {
+                            ey = py;
+                        } else {
+                            sy = py;
+                        }
+
+                        py = (ey + sy) >> 1;
+                    }
+
+                    ratio = (py / ih);
+                    return (ratio === 0) ? 1 : ratio;
+                }
+
+                // fix ie7 bug
+                // http://stackoverflow.com/questions/11929099/
+                // html5-canvas-drawimage-ratio-bug-ios
+                if ( Base.os.ios >= 7 ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        var iw = img.naturalWidth,
+                            ih = img.naturalHeight,
+                            vertSquashRatio = detectVerticalSquash( img, iw, ih );
+
+                        return canvas.getContext('2d').drawImage( img, 0, 0,
+                                iw * vertSquashRatio, ih * vertSquashRatio,
+                                x, y, w, h );
+                    };
+                }
+
+                /**
+                 * Detect subsampling in loaded image.
+                 * In iOS, larger images than 2M pixels may be
+                 * subsampled in rendering.
+                 */
+                function detectSubsampling( img ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        canvas, ctx;
+
+                    // subsampling may happen overmegapixel image
+                    if ( iw * ih > 1024 * 1024 ) {
+                        canvas = document.createElement('canvas');
+                        canvas.width = canvas.height = 1;
+                        ctx = canvas.getContext('2d');
+                        ctx.drawImage( img, -iw + 1, 0 );
+
+                        // subsampled image becomes half smaller in rendering size.
+                        // check alpha channel value to confirm image is covering
+                        // edge pixel or not. if alpha value is 0
+                        // image is not covering, hence subsampled.
+                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
+                    } else {
+                        return false;
+                    }
+                }
+
+
+                return function( canvas, img, x, y, width, height ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        ctx = canvas.getContext('2d'),
+                        subsampled = detectSubsampling( img ),
+                        doSquash = this.type === 'image/jpeg',
+                        d = 1024,
+                        sy = 0,
+                        dy = 0,
+                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
+
+                    if ( subsampled ) {
+                        iw /= 2;
+                        ih /= 2;
+                    }
+
+                    ctx.save();
+                    tmpCanvas = document.createElement('canvas');
+                    tmpCanvas.width = tmpCanvas.height = d;
+
+                    tmpCtx = tmpCanvas.getContext('2d');
+                    vertSquashRatio = doSquash ?
+                            detectVerticalSquash( img, iw, ih ) : 1;
+
+                    dw = Math.ceil( d * width / iw );
+                    dh = Math.ceil( d * height / ih / vertSquashRatio );
+
+                    while ( sy < ih ) {
+                        sx = 0;
+                        dx = 0;
+                        while ( sx < iw ) {
+                            tmpCtx.clearRect( 0, 0, d, d );
+                            tmpCtx.drawImage( img, -sx, -sy );
+                            ctx.drawImage( tmpCanvas, 0, 0, d, d,
+                                    x + dx, y + dy, dw, dh );
+                            sx += d;
+                            dx += dw;
+                        }
+                        sy += d;
+                        dy += dh;
+                    }
+                    ctx.restore();
+                    tmpCanvas = tmpCtx = null;
+                };
+            })()
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var noop = Base.noop,
+            $ = Base.$;
+
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+
+                if ( binary ) {
+                    // 强制设置成 content-type 为文件流。
+                    xhr.overrideMimeType &&
+                            xhr.overrideMimeType('application/octet-stream');
+
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+
+            getResponse: function() {
+                return this._response;
+            },
+
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+
+                    return me.trigger( 'progress', percentage );
+                };
+
+                xhr.onreadystatechange = function() {
+
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+
+
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+
+            _parseJson: function( str ) {
+                var json;
+
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/html5/md5',[
+        'runtime/html5/runtime'
+    ], function( FlashRuntime ) {
+
+        /*
+         * Fastest md5 implementation around (JKM md5)
+         * Credits: Joseph Myers
+         *
+         * @see http://www.myersdaily.org/joseph/javascript/md5-text.html
+         * @see http://jsperf.com/md5-shootout/7
+         */
+
+        /* this function is much faster,
+          so if possible we use it. Some IEs
+          are the only ones I know of that
+          need the idiotic second function,
+          generated by an if clause.  */
+        var add32 = function (a, b) {
+            return (a + b) & 0xFFFFFFFF;
+        },
+
+        cmn = function (q, a, b, x, s, t) {
+            a = add32(add32(a, q), add32(x, t));
+            return add32((a << s) | (a >>> (32 - s)), b);
+        },
+
+        ff = function (a, b, c, d, x, s, t) {
+            return cmn((b & c) | ((~b) & d), a, b, x, s, t);
+        },
+
+        gg = function (a, b, c, d, x, s, t) {
+            return cmn((b & d) | (c & (~d)), a, b, x, s, t);
+        },
+
+        hh = function (a, b, c, d, x, s, t) {
+            return cmn(b ^ c ^ d, a, b, x, s, t);
+        },
+
+        ii = function (a, b, c, d, x, s, t) {
+            return cmn(c ^ (b | (~d)), a, b, x, s, t);
+        },
+
+        md5cycle = function (x, k) {
+            var a = x[0],
+                b = x[1],
+                c = x[2],
+                d = x[3];
+
+            a = ff(a, b, c, d, k[0], 7, -680876936);
+            d = ff(d, a, b, c, k[1], 12, -389564586);
+            c = ff(c, d, a, b, k[2], 17, 606105819);
+            b = ff(b, c, d, a, k[3], 22, -1044525330);
+            a = ff(a, b, c, d, k[4], 7, -176418897);
+            d = ff(d, a, b, c, k[5], 12, 1200080426);
+            c = ff(c, d, a, b, k[6], 17, -1473231341);
+            b = ff(b, c, d, a, k[7], 22, -45705983);
+            a = ff(a, b, c, d, k[8], 7, 1770035416);
+            d = ff(d, a, b, c, k[9], 12, -1958414417);
+            c = ff(c, d, a, b, k[10], 17, -42063);
+            b = ff(b, c, d, a, k[11], 22, -1990404162);
+            a = ff(a, b, c, d, k[12], 7, 1804603682);
+            d = ff(d, a, b, c, k[13], 12, -40341101);
+            c = ff(c, d, a, b, k[14], 17, -1502002290);
+            b = ff(b, c, d, a, k[15], 22, 1236535329);
+
+            a = gg(a, b, c, d, k[1], 5, -165796510);
+            d = gg(d, a, b, c, k[6], 9, -1069501632);
+            c = gg(c, d, a, b, k[11], 14, 643717713);
+            b = gg(b, c, d, a, k[0], 20, -373897302);
+            a = gg(a, b, c, d, k[5], 5, -701558691);
+            d = gg(d, a, b, c, k[10], 9, 38016083);
+            c = gg(c, d, a, b, k[15], 14, -660478335);
+            b = gg(b, c, d, a, k[4], 20, -405537848);
+            a = gg(a, b, c, d, k[9], 5, 568446438);
+            d = gg(d, a, b, c, k[14], 9, -1019803690);
+            c = gg(c, d, a, b, k[3], 14, -187363961);
+            b = gg(b, c, d, a, k[8], 20, 1163531501);
+            a = gg(a, b, c, d, k[13], 5, -1444681467);
+            d = gg(d, a, b, c, k[2], 9, -51403784);
+            c = gg(c, d, a, b, k[7], 14, 1735328473);
+            b = gg(b, c, d, a, k[12], 20, -1926607734);
+
+            a = hh(a, b, c, d, k[5], 4, -378558);
+            d = hh(d, a, b, c, k[8], 11, -2022574463);
+            c = hh(c, d, a, b, k[11], 16, 1839030562);
+            b = hh(b, c, d, a, k[14], 23, -35309556);
+            a = hh(a, b, c, d, k[1], 4, -1530992060);
+            d = hh(d, a, b, c, k[4], 11, 1272893353);
+            c = hh(c, d, a, b, k[7], 16, -155497632);
+            b = hh(b, c, d, a, k[10], 23, -1094730640);
+            a = hh(a, b, c, d, k[13], 4, 681279174);
+            d = hh(d, a, b, c, k[0], 11, -358537222);
+            c = hh(c, d, a, b, k[3], 16, -722521979);
+            b = hh(b, c, d, a, k[6], 23, 76029189);
+            a = hh(a, b, c, d, k[9], 4, -640364487);
+            d = hh(d, a, b, c, k[12], 11, -421815835);
+            c = hh(c, d, a, b, k[15], 16, 530742520);
+            b = hh(b, c, d, a, k[2], 23, -995338651);
+
+            a = ii(a, b, c, d, k[0], 6, -198630844);
+            d = ii(d, a, b, c, k[7], 10, 1126891415);
+            c = ii(c, d, a, b, k[14], 15, -1416354905);
+            b = ii(b, c, d, a, k[5], 21, -57434055);
+            a = ii(a, b, c, d, k[12], 6, 1700485571);
+            d = ii(d, a, b, c, k[3], 10, -1894986606);
+            c = ii(c, d, a, b, k[10], 15, -1051523);
+            b = ii(b, c, d, a, k[1], 21, -2054922799);
+            a = ii(a, b, c, d, k[8], 6, 1873313359);
+            d = ii(d, a, b, c, k[15], 10, -30611744);
+            c = ii(c, d, a, b, k[6], 15, -1560198380);
+            b = ii(b, c, d, a, k[13], 21, 1309151649);
+            a = ii(a, b, c, d, k[4], 6, -145523070);
+            d = ii(d, a, b, c, k[11], 10, -1120210379);
+            c = ii(c, d, a, b, k[2], 15, 718787259);
+            b = ii(b, c, d, a, k[9], 21, -343485551);
+
+            x[0] = add32(a, x[0]);
+            x[1] = add32(b, x[1]);
+            x[2] = add32(c, x[2]);
+            x[3] = add32(d, x[3]);
+        },
+
+        /* there needs to be support for Unicode here,
+           * unless we pretend that we can redefine the MD-5
+           * algorithm for multi-byte characters (perhaps
+           * by adding every four 16-bit characters and
+           * shortening the sum to 32 bits). Otherwise
+           * I suggest performing MD-5 as if every character
+           * was two bytes--e.g., 0040 0025 = @%--but then
+           * how will an ordinary MD-5 sum be matched?
+           * There is no way to standardize text to something
+           * like UTF-8 before transformation; speed cost is
+           * utterly prohibitive. The JavaScript standard
+           * itself needs to look at this: it should start
+           * providing access to strings as preformed UTF-8
+           * 8-bit unsigned value arrays.
+           */
+        md5blk = function (s) {
+            var md5blks = [],
+                i; /* Andy King said do it this way. */
+
+            for (i = 0; i < 64; i += 4) {
+                md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
+            }
+            return md5blks;
+        },
+
+        md5blk_array = function (a) {
+            var md5blks = [],
+                i; /* Andy King said do it this way. */
+
+            for (i = 0; i < 64; i += 4) {
+                md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);
+            }
+            return md5blks;
+        },
+
+        md51 = function (s) {
+            var n = s.length,
+                state = [1732584193, -271733879, -1732584194, 271733878],
+                i,
+                length,
+                tail,
+                tmp,
+                lo,
+                hi;
+
+            for (i = 64; i <= n; i += 64) {
+                md5cycle(state, md5blk(s.substring(i - 64, i)));
+            }
+            s = s.substring(i - 64);
+            length = s.length;
+            tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
+            }
+            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+            if (i > 55) {
+                md5cycle(state, tail);
+                for (i = 0; i < 16; i += 1) {
+                    tail[i] = 0;
+                }
+            }
+
+            // Beware that the final length might not fit in 32 bits so we take care of that
+            tmp = n * 8;
+            tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+            lo = parseInt(tmp[2], 16);
+            hi = parseInt(tmp[1], 16) || 0;
+
+            tail[14] = lo;
+            tail[15] = hi;
+
+            md5cycle(state, tail);
+            return state;
+        },
+
+        md51_array = function (a) {
+            var n = a.length,
+                state = [1732584193, -271733879, -1732584194, 271733878],
+                i,
+                length,
+                tail,
+                tmp,
+                lo,
+                hi;
+
+            for (i = 64; i <= n; i += 64) {
+                md5cycle(state, md5blk_array(a.subarray(i - 64, i)));
+            }
+
+            // Not sure if it is a bug, however IE10 will always produce a sub array of length 1
+            // containing the last element of the parent array if the sub array specified starts
+            // beyond the length of the parent array - weird.
+            // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue
+            a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);
+
+            length = a.length;
+            tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= a[i] << ((i % 4) << 3);
+            }
+
+            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+            if (i > 55) {
+                md5cycle(state, tail);
+                for (i = 0; i < 16; i += 1) {
+                    tail[i] = 0;
+                }
+            }
+
+            // Beware that the final length might not fit in 32 bits so we take care of that
+            tmp = n * 8;
+            tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+            lo = parseInt(tmp[2], 16);
+            hi = parseInt(tmp[1], 16) || 0;
+
+            tail[14] = lo;
+            tail[15] = hi;
+
+            md5cycle(state, tail);
+
+            return state;
+        },
+
+        hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'],
+
+        rhex = function (n) {
+            var s = '',
+                j;
+            for (j = 0; j < 4; j += 1) {
+                s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];
+            }
+            return s;
+        },
+
+        hex = function (x) {
+            var i;
+            for (i = 0; i < x.length; i += 1) {
+                x[i] = rhex(x[i]);
+            }
+            return x.join('');
+        },
+
+        md5 = function (s) {
+            return hex(md51(s));
+        },
+
+
+
+        ////////////////////////////////////////////////////////////////////////////
+
+        /**
+         * SparkMD5 OOP implementation.
+         *
+         * Use this class to perform an incremental md5, otherwise use the
+         * static methods instead.
+         */
+        SparkMD5 = function () {
+            // call reset to init the instance
+            this.reset();
+        };
+
+
+        // In some cases the fast add32 function cannot be used..
+        if (md5('hello') !== '5d41402abc4b2a76b9719d911017c592') {
+            add32 = function (x, y) {
+                var lsw = (x & 0xFFFF) + (y & 0xFFFF),
+                    msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+                return (msw << 16) | (lsw & 0xFFFF);
+            };
+        }
+
+
+        /**
+         * Appends a string.
+         * A conversion will be applied if an utf8 string is detected.
+         *
+         * @param {String} str The string to be appended
+         *
+         * @return {SparkMD5} The instance itself
+         */
+        SparkMD5.prototype.append = function (str) {
+            // converts the string to utf8 bytes if necessary
+            if (/[\u0080-\uFFFF]/.test(str)) {
+                str = unescape(encodeURIComponent(str));
+            }
+
+            // then append as binary
+            this.appendBinary(str);
+
+            return this;
+        };
+
+        /**
+         * Appends a binary string.
+         *
+         * @param {String} contents The binary string to be appended
+         *
+         * @return {SparkMD5} The instance itself
+         */
+        SparkMD5.prototype.appendBinary = function (contents) {
+            this._buff += contents;
+            this._length += contents.length;
+
+            var length = this._buff.length,
+                i;
+
+            for (i = 64; i <= length; i += 64) {
+                md5cycle(this._state, md5blk(this._buff.substring(i - 64, i)));
+            }
+
+            this._buff = this._buff.substr(i - 64);
+
+            return this;
+        };
+
+        /**
+         * Finishes the incremental computation, reseting the internal state and
+         * returning the result.
+         * Use the raw parameter to obtain the raw result instead of the hex one.
+         *
+         * @param {Boolean} raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.prototype.end = function (raw) {
+            var buff = this._buff,
+                length = buff.length,
+                i,
+                tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+                ret;
+
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);
+            }
+
+            this._finish(tail, length);
+            ret = !!raw ? this._state : hex(this._state);
+
+            this.reset();
+
+            return ret;
+        };
+
+        /**
+         * Finish the final calculation based on the tail.
+         *
+         * @param {Array}  tail   The tail (will be modified)
+         * @param {Number} length The length of the remaining buffer
+         */
+        SparkMD5.prototype._finish = function (tail, length) {
+            var i = length,
+                tmp,
+                lo,
+                hi;
+
+            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+            if (i > 55) {
+                md5cycle(this._state, tail);
+                for (i = 0; i < 16; i += 1) {
+                    tail[i] = 0;
+                }
+            }
+
+            // Do the final computation based on the tail and length
+            // Beware that the final length may not fit in 32 bits so we take care of that
+            tmp = this._length * 8;
+            tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+            lo = parseInt(tmp[2], 16);
+            hi = parseInt(tmp[1], 16) || 0;
+
+            tail[14] = lo;
+            tail[15] = hi;
+            md5cycle(this._state, tail);
+        };
+
+        /**
+         * Resets the internal state of the computation.
+         *
+         * @return {SparkMD5} The instance itself
+         */
+        SparkMD5.prototype.reset = function () {
+            this._buff = "";
+            this._length = 0;
+            this._state = [1732584193, -271733879, -1732584194, 271733878];
+
+            return this;
+        };
+
+        /**
+         * Releases memory used by the incremental buffer and other aditional
+         * resources. If you plan to use the instance again, use reset instead.
+         */
+        SparkMD5.prototype.destroy = function () {
+            delete this._state;
+            delete this._buff;
+            delete this._length;
+        };
+
+
+        /**
+         * Performs the md5 hash on a string.
+         * A conversion will be applied if utf8 string is detected.
+         *
+         * @param {String}  str The string
+         * @param {Boolean} raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.hash = function (str, raw) {
+            // converts the string to utf8 bytes if necessary
+            if (/[\u0080-\uFFFF]/.test(str)) {
+                str = unescape(encodeURIComponent(str));
+            }
+
+            var hash = md51(str);
+
+            return !!raw ? hash : hex(hash);
+        };
+
+        /**
+         * Performs the md5 hash on a binary string.
+         *
+         * @param {String}  content The binary string
+         * @param {Boolean} raw     True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.hashBinary = function (content, raw) {
+            var hash = md51(content);
+
+            return !!raw ? hash : hex(hash);
+        };
+
+        /**
+         * SparkMD5 OOP implementation for array buffers.
+         *
+         * Use this class to perform an incremental md5 ONLY for array buffers.
+         */
+        SparkMD5.ArrayBuffer = function () {
+            // call reset to init the instance
+            this.reset();
+        };
+
+        ////////////////////////////////////////////////////////////////////////////
+
+        /**
+         * Appends an array buffer.
+         *
+         * @param {ArrayBuffer} arr The array to be appended
+         *
+         * @return {SparkMD5.ArrayBuffer} The instance itself
+         */
+        SparkMD5.ArrayBuffer.prototype.append = function (arr) {
+            // TODO: we could avoid the concatenation here but the algorithm would be more complex
+            //       if you find yourself needing extra performance, please make a PR.
+            var buff = this._concatArrayBuffer(this._buff, arr),
+                length = buff.length,
+                i;
+
+            this._length += arr.byteLength;
+
+            for (i = 64; i <= length; i += 64) {
+                md5cycle(this._state, md5blk_array(buff.subarray(i - 64, i)));
+            }
+
+            // Avoids IE10 weirdness (documented above)
+            this._buff = (i - 64) < length ? buff.subarray(i - 64) : new Uint8Array(0);
+
+            return this;
+        };
+
+        /**
+         * Finishes the incremental computation, reseting the internal state and
+         * returning the result.
+         * Use the raw parameter to obtain the raw result instead of the hex one.
+         *
+         * @param {Boolean} raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.ArrayBuffer.prototype.end = function (raw) {
+            var buff = this._buff,
+                length = buff.length,
+                tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+                i,
+                ret;
+
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= buff[i] << ((i % 4) << 3);
+            }
+
+            this._finish(tail, length);
+            ret = !!raw ? this._state : hex(this._state);
+
+            this.reset();
+
+            return ret;
+        };
+
+        SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;
+
+        /**
+         * Resets the internal state of the computation.
+         *
+         * @return {SparkMD5.ArrayBuffer} The instance itself
+         */
+        SparkMD5.ArrayBuffer.prototype.reset = function () {
+            this._buff = new Uint8Array(0);
+            this._length = 0;
+            this._state = [1732584193, -271733879, -1732584194, 271733878];
+
+            return this;
+        };
+
+        /**
+         * Releases memory used by the incremental buffer and other aditional
+         * resources. If you plan to use the instance again, use reset instead.
+         */
+        SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;
+
+        /**
+         * Concats two array buffers, returning a new one.
+         *
+         * @param  {ArrayBuffer} first  The first array buffer
+         * @param  {ArrayBuffer} second The second array buffer
+         *
+         * @return {ArrayBuffer} The new array buffer
+         */
+        SparkMD5.ArrayBuffer.prototype._concatArrayBuffer = function (first, second) {
+            var firstLength = first.length,
+                result = new Uint8Array(firstLength + second.byteLength);
+
+            result.set(first);
+            result.set(new Uint8Array(second), firstLength);
+
+            return result;
+        };
+
+        /**
+         * Performs the md5 hash on an array buffer.
+         *
+         * @param {ArrayBuffer} arr The array buffer
+         * @param {Boolean}     raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.ArrayBuffer.hash = function (arr, raw) {
+            var hash = md51_array(new Uint8Array(arr));
+
+            return !!raw ? hash : hex(hash);
+        };
+
+        return FlashRuntime.register( 'Md5', {
+            init: function() {
+                // do nothing.
+            },
+
+            loadFromBlob: function( file ) {
+                var blob = file.getSource(),
+                    chunkSize = 2 * 1024 * 1024,
+                    chunks = Math.ceil( blob.size / chunkSize ),
+                    chunk = 0,
+                    owner = this.owner,
+                    spark = new SparkMD5.ArrayBuffer(),
+                    me = this,
+                    blobSlice = blob.mozSlice || blob.webkitSlice || blob.slice,
+                    loadNext, fr;
+
+                fr = new FileReader();
+
+                loadNext = function() {
+                    var start, end;
+
+                    start = chunk * chunkSize;
+                    end = Math.min( start + chunkSize, blob.size );
+
+                    fr.onload = function( e ) {
+                        spark.append( e.target.result );
+                        owner.trigger( 'progress', {
+                            total: file.size,
+                            loaded: end
+                        });
+                    };
+
+                    fr.onloadend = function() {
+                        fr.onloadend = fr.onload = null;
+
+                        if ( ++chunk < chunks ) {
+                            setTimeout( loadNext, 1 );
+                        } else {
+                            setTimeout(function(){
+                                owner.trigger('load');
+                                me.result = spark.end();
+                                loadNext = file = blob = spark = null;
+                                owner.trigger('complete');
+                            }, 50 );
+                        }
+                    };
+
+                    fr.readAsArrayBuffer( blobSlice.call( blob, start, end ) );
+                };
+
+                loadNext();
+            },
+
+            getResult: function() {
+                return this.result;
+            }
+        });
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+
+
+        function getFlashVersion() {
+            var version;
+
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destroy = this.destroy,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                clients[ uid ] = client;
+
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+
+                    instance = pool[ uid ];
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+
+                return me.flashExec.apply( client, arguments );
+            };
+
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+
+                // console.log.apply( console, arguments );
+
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+
+                // Base.log( evt, obj );
+            }
+
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+
+            this.jsreciver = jsreciver;
+
+            this.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+
+                return flash.exec( this.uid, comp, fn, args );
+            };
+
+            // @todo
+        }
+
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+
+                container.html( html );
+            },
+
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+
+        });
+
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+
+            return component;
+        };
+
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+
+                delete copy.button;
+                delete copy.id;
+                delete copy.container;
+
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+
+            destroy: function() {
+                this.flashExec( 'FilePicker', 'destroy' );
+            }
+        });
+    });
+    /**
+     * @fileOverview 图片压缩
+     */
+    define('runtime/flash/image',[
+        'runtime/flash/runtime'
+    ], function( FlashRuntime ) {
+
+        return FlashRuntime.register( 'Image', {
+            // init: function( options ) {
+            //     var owner = this.owner;
+
+            //     this.flashExec( 'Image', 'init', options );
+            //     owner.on( 'load', function() {
+            //         debugger;
+            //     });
+            // },
+
+            loadFromBlob: function( blob ) {
+                var owner = this.owner;
+
+                owner.info() && this.flashExec( 'Image', 'info', owner.info() );
+                owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );
+
+                this.flashExec( 'Image', 'loadFromBlob', blob.uid );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+
+                xhr.connectRuntime( blob.ruid );
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server,
+                    forceURLStream: opts.forceURLStream,
+                    mimeType: 'application/octet-stream'
+                }, binary );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            getResponse: function() {
+                return this._response || '';
+            },
+
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    var percent = e.loaded / e.total;
+                    percent = Math.min( 1, Math.max( 0, percent ) );
+                    return me.trigger( 'progress', percent );
+                });
+
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        readBody = false,
+                        err = '',
+                        p;
+
+                    xhr.off();
+                    me._xhr = null;
+
+                    if ( status >= 200 && status < 300 ) {
+                        readBody = true;
+                    } else if ( status >= 500 && status < 600 ) {
+                        readBody = true;
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+
+                    if ( readBody ) {
+                        me._response = xhr.exec('getResponse');
+                        me._response = decodeURIComponent( me._response );
+
+                        // flash 处理可能存在 bug, 没辙只能靠 js 了
+                        // try {
+                        //     me._responseJson = xhr.exec('getResponseAsJson');
+                        // } catch ( error ) {
+
+                        p = window.JSON && window.JSON.parse || function( s ) {
+                            try {
+                                return new Function('return ' + s).call();
+                            } catch ( err ) {
+                                return {};
+                            }
+                        };
+                        me._responseJson  = me._response ? p(me._response) : {};
+
+                        // }
+                    }
+
+                    xhr.destroy();
+                    xhr = null;
+
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/flash/blob',[
+        'runtime/flash/runtime',
+        'lib/blob'
+    ], function( FlashRuntime, Blob ) {
+
+        return FlashRuntime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.flashExec( 'Blob', 'slice', start, end );
+
+                return new Blob( blob.uid, blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Md5 flash实现
+     */
+    define('runtime/flash/md5',[
+        'runtime/flash/runtime'
+    ], function( FlashRuntime ) {
+
+        return FlashRuntime.register( 'Md5', {
+            init: function() {
+                // do nothing.
+            },
+
+            loadFromBlob: function( blob ) {
+                return this.flashExec( 'Md5', 'loadFromBlob', blob.uid );
+            }
+        });
+    });
+    /**
+     * @fileOverview 完全版本。
+     */
+    define('preset/all',[
+        'base',
+
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+        'widgets/md5',
+
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/imagemeta/exif',
+        'runtime/html5/androidpatch',
+        'runtime/html5/image',
+        'runtime/html5/transport',
+        'runtime/html5/md5',
+
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/image',
+        'runtime/flash/transport',
+        'runtime/flash/blob',
+        'runtime/flash/md5'
+    ], function( Base ) {
+        return Base;
+    });
+    /**
+     * @fileOverview 日志组件,主要用来收集错误信息,可以帮助 webuploader 更好的定位问题和发展。
+     *
+     * 如果您不想要启用此功能,请在打包的时候去掉 log 模块。
+     *
+     * 或者可以在初始化的时候通过 options.disableWidgets 属性禁用。
+     *
+     * 如:
+     * WebUploader.create({
+     *     ...
+     *
+     *     disableWidgets: 'log',
+     *
+     *     ...
+     * })
+     */
+    define('widgets/log',[
+        'base',
+        'uploader',
+        'widgets/widget'
+    ], function( Base, Uploader ) {
+        var $ = Base.$,
+            logUrl = ' http://static.tieba.baidu.com/tb/pms/img/st.gif??',
+            product = (location.hostname || location.host || 'protected').toLowerCase(),
+
+            // 只针对 baidu 内部产品用户做统计功能。
+            enable = product && /baidu/i.exec(product),
+            base;
+
+        if (!enable) {
+            return;
+        }
+
+        base = {
+            dv: 3,
+            master: 'webuploader',
+            online: /test/.exec(product) ? 0 : 1,
+            module: '',
+            product: product,
+            type: 0
+        };
+
+        function send(data) {
+            var obj = $.extend({}, base, data),
+                url = logUrl.replace(/^(.*)\?/, '$1' + $.param( obj )),
+                image = new Image();
+
+            image.src = url;
+        }
+
+        return Uploader.register({
+            name: 'log',
+
+            init: function() {
+                var owner = this.owner,
+                    count = 0,
+                    size = 0;
+
+                owner
+                    .on('error', function(code) {
+                        send({
+                            type: 2,
+                            c_error_code: code
+                        });
+                    })
+                    .on('uploadError', function(file, reason) {
+                        send({
+                            type: 2,
+                            c_error_code: 'UPLOAD_ERROR',
+                            c_reason: '' + reason
+                        });
+                    })
+                    .on('uploadComplete', function(file) {
+                        count++;
+                        size += file.size;
+                    }).
+                    on('uploadFinished', function() {
+                        send({
+                            c_count: count,
+                            c_size: size
+                        });
+                        count = size = 0;
+                    });
+
+                send({
+                    c_usage: 1
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('webuploader',[
+        'preset/all',
+        'widgets/log'
+    ], function( preset ) {
+        return preset;
+    });
+
+    var _require = require;
+    return _require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.flashonly.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.flashonly.js
new file mode 100644
index 0000000..c2f5946
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.flashonly.js
@@ -0,0 +1,4622 @@
+/*! WebUploader 0.1.5 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+
+            return obj;
+        },
+
+        makeExport = function( dollar ) {
+            root.__dollar = dollar;
+
+            // exports every module.
+            return exportsTo( factory( root, _define, _require ) );
+        },
+
+        origin;
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = makeExport();
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([ 'jquery' ], makeExport );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = makeExport();
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( window, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        var $ = window.__dollar || window.jQuery || window.Zepto;
+
+        if ( !$ ) {
+            throw new Error('jQuery or Zepto not found!');
+        }
+
+        return $;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id为该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档中对类的使用可能省略掉了`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+
+        var noop = function() {},
+            call = Function.call;
+
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+
+        function createObject( proto ) {
+            var f;
+
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+
+
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.5',
+
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+
+            Deferred: promise.Deferred,
+
+            isPromise: promise.isPromise,
+
+            when: promise.when,
+
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match( /(?:trident)(?:.*rv:([\w.]+))?/i ),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+
+                /* jshint camelcase: false */
+
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+
+                return child;
+            },
+
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数noop](#WebUploader:Base.noop)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+
+            nextTick: (function() {
+
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+
+            while ( ++i < len ) {
+                handler = events[ i ];
+
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+
+            return !stoped;
+        }
+
+        protos = {
+
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+
+                if ( !callback ) {
+                    return this;
+                }
+
+                set = this._events || (this._events = []);
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+
+                    set.push( handler );
+                });
+
+                return this;
+            },
+
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+
+                if ( !callback ) {
+                    return me;
+                }
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+
+                return me;
+            },
+
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+
+                if ( !events ) {
+                    return this;
+                }
+
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+
+                return this;
+            },
+
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+
+                if ( !this._events || !type ) {
+                    return this;
+                }
+
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$;
+
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            cancelFile: 'cancel-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            md5File: 'md5-file',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            predictRuntimeType: 'predict-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+
+            _init: function( opts ) {
+                var me = this;
+
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     compress: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.option( 'compress', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+
+                // setter
+                if ( arguments.length > 1 ) {
+
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `progressNum` 上传中的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `queueNum` 还在队列中的文件数
+             * * `interruptNum` 被暂停的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+
+                return stats ? {
+                    successNum: stats.numOfSuccess,
+                    progressNum: stats.numOfProgress,
+
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue,
+                    interruptNum: stats.numofInterrupt
+                } : {};
+            },
+
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+
+                    return false;
+                }
+
+                return true;
+            },
+
+            /**
+             * 销毁 webuploader 实例
+             * @method destroy
+             * @grammar destroy() => undefined
+             */
+            destroy: function() {
+                this.request( 'destroy', arguments );
+                this.off();
+            },
+
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            factories = {},
+
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+
+        $.extend( Runtime.prototype, {
+
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+
+                if ( this._container ) {
+                    return this._container;
+                }
+
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                this._parent = parent;
+                return container;
+            },
+
+            init: Base.noop,
+            exec: Base.noop,
+
+            destroy: function() {
+                this._container && this._container.remove();
+                this._parent && this._parent.removeClass('webuploader-container');
+                this.off();
+            }
+        });
+
+        Runtime.orders = 'html5,flash';
+
+
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+
+            type = type || getFirstKey( factories );
+
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+
+        var cache;
+
+        cache = (function() {
+            var obj = {};
+
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+
+                get: function( ruid, standalone ) {
+                    var i;
+
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+
+                        return obj[ i ];
+                    }
+
+                    return null;
+                },
+
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+
+            this.uid = Base.guid('client_');
+
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+
+            this.connectRuntime = function( opts, cb ) {
+
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+
+                deferred.done( cb );
+
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                runtime.__client--;
+
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+
+                runtime = null;
+            };
+
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+
+                return runtime.exec.apply( this, args );
+            };
+
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+
+        function Blob( ruid, source ) {
+            var me = this;
+
+            me.source = source;
+            me.ruid = ruid;
+            this.size = source.size || 0;
+
+            // 如果没有指定 mimetype, 但是知道文件后缀。
+            if ( !source.type && this.ext &&
+                    ~'jpg,jpeg,png,gif,bmp'.indexOf( this.ext ) ) {
+                this.type = 'image/' + (this.ext === 'jpg' ? 'jpeg' : this.ext);
+            } else {
+                this.type = source.type || 'application/octet-stream';
+            }
+
+            RuntimeClient.call( me, 'Blob' );
+            this.uid = source.uid || this.uid;
+
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+
+            getSource: function() {
+                return this.source;
+            }
+        });
+
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+
+        function File( ruid, file ) {
+            var ext;
+
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+
+            // todo 支持其他类型文件的转换。
+            // 如果有 mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && file.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( file.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+
+            Blob.apply( this, arguments );
+        }
+
+        return Base.inherits( Blob, File );
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+
+        var $ = Base.$;
+
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+
+            opts.container = $( opts.id );
+
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+
+                button.addClass('webuploader-pick');
+
+                me.on( 'all', function( type ) {
+                    var files;
+
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+
+                this._resizeHandler = Base.bindFn( this.refresh, this );
+                $( window ).on( 'resize', this._resizeHandler );
+            },
+
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+
+                    pos = button.offset();
+
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+
+            enable: function() {
+                var btn = this.options.button;
+
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+
+            disable: function() {
+                var btn = this.options.button;
+
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+
+                btn.addClass('webuploader-pick-disable');
+            },
+
+            destroy: function() {
+                var btn = this.options.button;
+                $( window ).off( 'resize', this._resizeHandler );
+                btn.removeClass('webuploader-pick-disable webuploader-pick-hover ' +
+                    'webuploader-pick');
+            }
+        });
+
+        return FilePicker;
+    });
+
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            _destroy = Uploader.prototype.destroy,
+            IGNORE = {},
+            widgetClass = [];
+
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+
+            var length = obj.length,
+                type = $.type( obj );
+
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+
+        $.extend( Widget.prototype, {
+
+            init: Base.noop,
+
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+
+                    return IGNORE;
+                }
+
+                return this[ map[ apiName ] ].apply( this, args );
+
+            },
+
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+
+            /**
+             * @property {String | Array} [disableWidgets=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 默认所有 Uploader.register 了的 widget 都会被加载,如果禁用某一部分,请通过此 option 指定黑名单。
+             */
+
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [],
+                    deactives = me.options.disableWidgets || '';
+
+                $.each( widgetClass, function( _, klass ) {
+                    (!deactives || !~deactives.indexOf( klass._name )) &&
+                        widgets.push( new klass( me ) );
+                });
+
+                return _init.apply( me, arguments );
+            },
+
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets && widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+
+                args = isArrayLike( args ) ? args : [ args ];
+
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+
+                    if ( rlt !== IGNORE ) {
+
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个 tick 中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+
+                                if ( args.length === 1 ) {
+                                    args = args[ 0 ];
+                                }
+
+                                setTimeout(function() {
+                                    deferred.resolve( args );
+                                }, 1 );
+
+                                return deferred.promise();
+                            })[ callback ? key : 'done' ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            },
+
+            destroy: function() {
+                _destroy.apply( this, arguments );
+                this._widgets = null;
+            }
+        });
+
+        /**
+         * 添加组件
+         * @grammar Uploader.register(proto);
+         * @grammar Uploader.register(map, proto);
+         * @param  {object} responseMap API 名称与函数实现的映射
+         * @param  {object} proto 组件原型,构造函数通过 constructor 属性定义
+         * @method Uploader.register
+         * @for Uploader
+         * @example
+         * Uploader.register({
+         *     'make-thumb': 'makeThumb'
+         * }, {
+         *     init: function( options ) {},
+         *     makeThumb: function() {}
+         * });
+         *
+         * Uploader.register({
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init', destroy: 'destroy', name: 'anonymous' },
+                klass;
+
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+
+                // 自动生成 map 表。
+                $.each(widgetProto, function(key) {
+                    if ( key[0] === '_' || key === 'name' ) {
+                        key === 'name' && (map.name = widgetProto.name);
+                        return;
+                    }
+
+                    map[key.replace(/[A-Z]/g, '-$&').toLowerCase()] = key;
+                });
+
+            } else {
+                map = $.extend( map, responseMap );
+            }
+
+            widgetProto.responseMap = map;
+            klass = Base.inherits( Widget, widgetProto );
+            klass._name = map.name;
+            widgetClass.push( klass );
+
+            return klass;
+        };
+
+        /**
+         * 删除插件,只有在注册时指定了名字的才能被删除。
+         * @grammar Uploader.unRegister(name);
+         * @param  {string} name 组件名字
+         * @method Uploader.unRegister
+         * @for Uploader
+         * @example
+         *
+         * Uploader.register({
+         *     name: 'custom',
+         *
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         *
+         * Uploader.unRegister('custom');
+         */
+        Uploader.unRegister = Widget.unRegister = function( name ) {
+            if ( !name || name === 'anonymous' ) {
+                return;
+            }
+
+            // 删除指定的插件。
+            for ( var i = widgetClass.length; i--; ) {
+                if ( widgetClass[i]._name === name ) {
+                    widgetClass.splice(i, 1)
+                }
+            }
+        };
+
+        return Widget;
+    });
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor|dom} 指定选择文件的按钮容器,不指定则不创建按钮。**注意** 这里虽然写的是 id, 但是不是只支持 id, 还支持 class, 或者 dom 节点。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+
+        return Uploader.register({
+            name: 'picker',
+
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addBtn( opts.pick );
+            },
+
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addBtn: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    promises = [];
+
+                if ( !pick ) {
+                    return;
+                }
+
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+
+                $( pick.id ).each(function() {
+                    var options, picker, deferred;
+
+                    deferred = Base.Deferred();
+
+                    options = $.extend({}, pick, {
+                        accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                        swf: opts.swf,
+                        runtimeOrder: opts.runtimeOrder,
+                        id: this
+                    });
+
+                    picker = new FilePicker( options );
+
+                    picker.once( 'ready', deferred.resolve );
+                    picker.on( 'select', function( files ) {
+                        me.owner.request( 'add-file', [ files ]);
+                    });
+                    picker.init();
+
+                    me.pickers.push( picker );
+
+                    promises.push( deferred.promise() );
+                });
+
+                return Base.when.apply( Base, promises );
+            },
+
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            },
+
+            destroy: function() {
+                $.each( this.pickers, function() {
+                    this.destroy();
+                });
+                this.pickers = null;
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+
+        // 默认选项。
+        Image.options = {
+
+            // 默认的图片处理质量
+            quality: 90,
+
+            // 是否裁剪
+            crop: false,
+
+            // 是否保留头部信息
+            preserveHeaders: false,
+
+            // 是否允许放大。
+            allowMagnify: false
+        };
+
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+
+            info: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+
+                // getter
+                return this._info;
+            },
+
+            meta: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+
+                // getter
+                return this._meta;
+            },
+
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+
+            crop: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'crop' ].concat( args ) );
+            },
+
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+
+        var $ = Base.$,
+            throttle;
+
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true,
+             *
+             *     // 如果发现压缩后文件大小比原来还大,则使用原来图片
+             *     // 此属性可能会影响图片自动纠正功能
+             *     noCompressIfLarger: false,
+             *
+             *     // 单位字节,如果图片大小小于此值,不会采用压缩。
+             *     compressSize: 0
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+
+        return Uploader.register({
+
+            name: 'image',
+
+
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * 当 width 或者 height 的值介于 0 - 1 时,被当成百分比使用。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             * 也可以借助服务端,将 base64 数据传给服务端,生成一个临时文件供预览。
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+
+                file = this.request( 'get-file', file );
+
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+
+                opts = $.extend({}, this.options.thumb );
+
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+
+                width = width || opts.width;
+                height = height || opts.height;
+
+                image = new Image( opts );
+
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                // 当 resize 完后
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+
+                image.once( 'error', function( reason ) {
+                    cb( reason || true );
+                    image.destroy();
+                });
+
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+
+            beforeSendFile: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 0,
+                    noCompressIfLarger = opts && opts.noCompressIfLarger || false,
+                    image, deferred;
+
+                file = this.request( 'get-file', file );
+
+                // 只压缩 jpeg 图片格式。
+                // gif 可能会丢失针
+                // bmp png 基本上尺寸都不大,且压缩比比较小。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+
+                image = new Image( opts );
+
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    var width = opts.width,
+                        height = opts.height;
+
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                image.once( 'complete', function() {
+                    var blob, size;
+
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+
+                        size = file.size;
+
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( !noCompressIfLarger || blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+
+                            file.trigger( 'resize', blob.size, size );
+                        }
+
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application/octet-stream'
+             */
+            this.type = source.type || 'application/octet-stream';
+
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+
+
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+
+            this.source = source;
+            this.loaded = 0;
+
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+
+        $.extend( WUFile.prototype, {
+
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+
+                var prevStatus = statusMap[ this.id ];
+
+                typeof text !== 'undefined' && (this.statusText = text);
+
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+
+            },
+
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+
+            destroy: function() {
+                this.off();
+                delete statusMap[ this.id ];
+            }
+        });
+
+        Mediator.installTo( WUFile.prototype );
+
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+
+        return WUFile;
+    });
+
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被取消的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * * `numofDeleted` 被移除的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0,
+                numofDeleted: 0,
+                numofInterrupt: 0
+            };
+
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+
+            // 存储所有文件
+            this._map = {};
+        }
+
+        $.extend( Queue.prototype, {
+
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+
+                status = status || STATUS.QUEUED;
+
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+
+                return null;
+            },
+
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+
+                    ret.push( file );
+                }
+
+                return ret;
+            },
+
+            /**
+             * 在队列中删除文件。
+             * @grammar removeFile( file ) => Array
+             * @method removeFile
+             * @param {File} 文件对象。
+             */
+            removeFile: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( existing ) {
+                    delete this._map[ file.id ];
+                    file.destroy();
+                    this.stats.numofDeleted++;
+                }
+            },
+
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+            },
+
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt--;
+                        break;
+                }
+
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt++;
+                        break;
+                }
+            }
+
+        });
+
+        Mediator.installTo( Queue.prototype );
+
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+
+        return Uploader.register({
+            name: 'queue',
+
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+
+                    me.accept = new RegExp( accept, 'i' );
+                }
+
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                this.placeholder = runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+
+
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+
+                    file = new WUFile( file );
+                }
+
+                return file;
+            },
+
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || !file.size || this.accept &&
+
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+
+                return !invalid;
+            },
+
+
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+
+            _addFile: function( file ) {
+                var me = this;
+
+                file = me._wrapFile( file );
+
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @property {Boolean} [auto=false]
+             * @namespace options
+             * @for Uploader
+             * @description 设置为 true 后,不需要手动调用上传,有文件选择即开始上传。
+             *
+             */
+
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFile: function( files ) {
+                var me = this;
+
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+
+                me.owner.trigger( 'filesQueued', files );
+
+                if ( me.options.auto ) {
+                    setTimeout(function() {
+                        me.request('start-upload');
+                    }, 20 );
+                }
+            },
+
+            getStats: function() {
+                return this.stats;
+            },
+
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+
+             /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @grammar removeFile( file, true ) => undefined
+             * @grammar removeFile( id, true ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件, 默认只会标记文件状态为已取消,如果第二个参数为 `true` 则会从 queue 中移除。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file, remove ) {
+                var me = this;
+
+                file = file.id ? file : me.queue.getFile( file );
+
+                this.request( 'cancel-file', file );
+
+                if ( remove ) {
+                    this.queue.removeFile( file );
+                }
+            },
+
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+
+                me.request('start-upload');
+            },
+
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+
+            /**
+             * @event reset
+             * @description 当 uploader 被重置的时候触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.owner.trigger('reset');
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            },
+
+            destroy: function() {
+                this.reset();
+                this.placeholder && this.placeholder.destroy();
+            }
+        });
+
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+
+        /**
+         * @property {Object} [runtimeOrder=html5,flash]
+         * @namespace options
+         * @for Uploader
+         * @description 指定运行时启动顺序。默认会想尝试 html5 是否支持,如果支持则使用 html5, 否则则使用 flash.
+         *
+         * 可以将此值设置成 `flash`,来强制使用 flash 运行时。
+         */
+
+        return Uploader.register({
+            name: 'runtime',
+
+            init: function() {
+                if ( !this.predictRuntimeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntimeType() => String
+             * @method predictRuntimeType
+             * @for  Uploader
+             */
+            predictRuntimeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+
+        var $ = Base.$;
+
+        function Transport( opts ) {
+            var me = this;
+
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+
+        Transport.options = {
+            server: '',
+            method: 'POST',
+
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+
+        $.extend( Transport.prototype, {
+
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+
+                if ( !duration ) {
+                    return;
+                }
+
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+
+        });
+
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+
+
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+
+
+            /**
+             * @property {Object} [formData={}]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: {}
+
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len, api;
+
+            api = {
+                file: file,
+
+                has: function() {
+                    return !!pending.length;
+                },
+
+                shift: function() {
+                    return pending.shift();
+                },
+
+                unshift: function( block ) {
+                    pending.unshift( block );
+                }
+            };
+
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++,
+                    cuted: api
+                });
+                start += len;
+            }
+
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+
+            return api;
+        }
+
+        Uploader.register({
+            name: 'upload',
+
+            init: function() {
+                var owner = this.owner,
+                    me = this;
+
+                this.runing = false;
+                this.progress = false;
+
+                owner
+                    .on( 'startUpload', function() {
+                        me.progress = true;
+                    })
+                    .on( 'uploadFinished', function() {
+                        me.progress = false;
+                    });
+
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+
+                // 缓存分好片的文件。
+                this.stack = [];
+
+                // 缓存即将上传的文件。
+                this.pending = [];
+
+                // 跟踪还有多少分片在上传中但是没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+
+                owner.on( 'uploadComplete', function( file ) {
+
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+
+            reset: function() {
+                this.request( 'stop-upload', true );
+                this.runing = false;
+                this.pool = [];
+                this.stack = [];
+                this.pending = [];
+                this.remaning = 0;
+                this._trigged = false;
+                this._promise = null;
+            },
+
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             *
+             * 可以指定开始某一个文件。
+             * @grammar upload() => undefined
+             * @grammar upload( file | fileId) => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            startUpload: function(file) {
+                var me = this;
+
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+
+                // 如果指定了开始某个文件,则只开始指定文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        $.each( me.pool, function( _, v ) {
+
+                            // 之前暂停过。
+                            if (v.file !== file) {
+                                return;
+                            }
+
+                            v.transport && v.transport.send();
+                        });
+
+                        file.setStatus( Status.QUEUED );
+                    } else if (file.getStatus() === Status.PROGRESS) {
+                        return;
+                    } else {
+                        file.setStatus( Status.QUEUED );
+                    }
+                } else {
+                    $.each( me.request( 'get-files', [ Status.INITED ] ), function() {
+                        this.setStatus( Status.QUEUED );
+                    });
+                }
+
+                if ( me.runing ) {
+                    return;
+                }
+
+                me.runing = true;
+
+                var files = [];
+
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        files.push(file);
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+
+                var file;
+                while ( (file = files.shift()) ) {
+                    file.setStatus( Status.PROGRESS );
+                }
+
+                file || $.each( me.request( 'get-files',
+                        Status.INTERRUPT ), function() {
+                    this.setStatus( Status.PROGRESS );
+                });
+
+                me._trigged = false;
+                Base.nextTick( me.__tick );
+                me.owner.trigger('startUpload');
+            },
+
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             *
+             * 如果第一个参数是文件,则只暂停指定文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @grammar stop( file ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stopUpload: function( file, interrupt ) {
+                var me = this;
+
+                if (file === true) {
+                    interrupt = file;
+                    file = null;
+                }
+
+                if ( me.runing === false ) {
+                    return;
+                }
+
+                // 如果只是暂停某个文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if ( file.getStatus() !== Status.PROGRESS &&
+                            file.getStatus() !== Status.QUEUED ) {
+                        return;
+                    }
+
+                    file.setStatus( Status.INTERRUPT );
+                    $.each( me.pool, function( _, v ) {
+
+                        // 只 abort 指定的文件。
+                        if (v.file !== file) {
+                            return;
+                        }
+
+                        v.transport && v.transport.abort();
+                        me._putback(v);
+                        me._popBlock(v);
+                    });
+
+                    return Base.nextTick( me.__tick );
+                }
+
+                me.runing = false;
+
+                if (this._promise && this._promise.file) {
+                    this._promise.file.setStatus( Status.INTERRUPT );
+                }
+
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+
+                me.owner.trigger('stopUpload');
+            },
+
+            /**
+             * @method cancelFile
+             * @grammar cancelFile( file ) => undefined
+             * @grammar cancelFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 标记文件状态为已取消, 同时将中断文件传输。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.cancelFile( file );
+             * })
+             */
+            cancelFile: function( file ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                file.setStatus( Status.CANCELLED );
+                this.owner.trigger( 'fileDequeued', file );
+            },
+
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.progress;
+            },
+
+            _getStats: function() {
+                return this.request('get-stats');
+            },
+
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                this.owner.trigger( 'uploadSkip', file );
+            },
+
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+
+                    fn = function( val ) {
+                        me._promise = null;
+
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me._getStats().numOfQueue &&
+                    !me._getStats().numofInterrupt ) {
+                    me.runing = false;
+
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+
+            _putback: function(block) {
+                var idx;
+
+                block.cuted.unshift(block);
+                idx = this.stack.indexOf(block.cuted);
+
+                if (!~idx) {
+                    this.stack.unshift(block.cuted);
+                }
+            },
+
+            _getStack: function() {
+                var i = 0,
+                    act;
+
+                while ( (act = this.stack[ i++ ]) ) {
+                    if ( act.has() && act.file.getStatus() === Status.PROGRESS ) {
+                        return act;
+                    } else if (!act.has() ||
+                            act.file.getStatus() !== Status.PROGRESS &&
+                            act.file.getStatus() !== Status.INTERRUPT ) {
+
+                        // 把已经处理完了的,或者,状态为非 progress(上传中)、
+                        // interupt(暂停中) 的移除。
+                        this.stack.splice( --i, 1 );
+                    }
+                }
+
+                return null;
+            },
+
+            _nextBlock: function() {
+                var me = this,
+                    opts = me.options,
+                    act, next, done, preparing;
+
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( (act = this._getStack()) ) {
+
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+
+                    return act.shift();
+
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me._getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me.stack.push(act);
+                        return act.shift();
+                    };
+
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    if ( isPromise( next) ) {
+                        preparing = next.file;
+                        next = next[ next.pipe ? 'pipe' : 'then' ]( done );
+                        next.file = preparing;
+                        return next;
+                    }
+
+                    return done( next );
+                }
+            },
+
+
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.PROGRESS ||
+                            file.getStatus() === Status.INTERRUPT ) {
+                            return file;
+                        }
+
+                        return me._finishFile( file );
+                    });
+
+                    me.owner.trigger( 'uploadStart', file );
+                    file.setStatus( Status.PROGRESS );
+
+                    promise.file = file;
+
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+
+                    pending.push( promise );
+                }
+            },
+
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+
+                // 有可能在 before-send-file 的 promise 期间改变了文件状态。
+                // 如:暂停,取消
+                // 我们不能中断 promise, 但是可以在 promise 完后,不做上传操作。
+                if ( file.getStatus() !== Status.PROGRESS ) {
+
+                    // 如果是中断,则还需要放回去。
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        me._putback(block);
+                    }
+
+                    return;
+                }
+
+                me.pool.push( block );
+                me.remaning++;
+
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me.updateFileProgress( file );
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+
+
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @param {Object} headers 可以扩展此对象来控制上传头部。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+
+
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+
+                block.transport = tr;
+
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    block.percentage = percentage;
+                    me.updateFileProgress( file );
+                });
+
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+
+                    return reject;
+                };
+
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+
+                        block.retried++;
+                        tr.send();
+
+                    } else {
+
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            },
+
+            updateFileProgress: function(file) {
+                var totalPercent = 0,
+                    uploaded = 0;
+
+                if (!file.blocks) {
+                    return;
+                }
+
+                $.each( file.blocks, function( _, v ) {
+                    uploaded += (v.percentage || 0) * (v.end - v.start);
+                });
+
+                totalPercent = uploaded / file.size;
+                this.owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+            }
+
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+
+        var $ = Base.$,
+            validators = {},
+            api;
+
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * * `Q_TYPE_DENIED` 当文件类型不满足时触发。。
+         * @for  Uploader
+         */
+
+        // 暴露给外面的api
+        api = {
+
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            name: 'validator',
+
+            init: function() {
+                var me = this;
+                Base.nextTick(function() {
+                    $.each( validators, function() {
+                        this.call( me.owner );
+                    });
+                });
+            }
+        });
+
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileNumLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return count >= max ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileSizeLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return invalid ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', max, file );
+                    return false;
+                }
+
+            });
+
+        });
+
+        /**
+         * @property {Boolean} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+
+            if ( opts.duplicate ) {
+                return;
+            }
+
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+
+                return hash;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (mapping[ hash ] = true);
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (delete mapping[ hash ]);
+            });
+
+            uploader.on( 'reset', function() {
+                mapping = {};
+            });
+        });
+
+        return api;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+
+        function CompBase( owner, runtime ) {
+
+            this.owner = owner;
+            this.options = owner.options;
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+
+        return CompBase;
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+
+
+        function getFlashVersion() {
+            var version;
+
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destroy = this.destroy,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                clients[ uid ] = client;
+
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+
+                    instance = pool[ uid ];
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+
+                return me.flashExec.apply( client, arguments );
+            };
+
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+
+                // console.log.apply( console, arguments );
+
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+
+                // Base.log( evt, obj );
+            }
+
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+
+            this.jsreciver = jsreciver;
+
+            this.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+
+                return flash.exec( this.uid, comp, fn, args );
+            };
+
+            // @todo
+        }
+
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+
+                container.html( html );
+            },
+
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+
+        });
+
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+
+            return component;
+        };
+
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+
+                delete copy.button;
+                delete copy.id;
+                delete copy.container;
+
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+
+            destroy: function() {
+                this.flashExec( 'FilePicker', 'destroy' );
+            }
+        });
+    });
+    /**
+     * @fileOverview 图片压缩
+     */
+    define('runtime/flash/image',[
+        'runtime/flash/runtime'
+    ], function( FlashRuntime ) {
+
+        return FlashRuntime.register( 'Image', {
+            // init: function( options ) {
+            //     var owner = this.owner;
+
+            //     this.flashExec( 'Image', 'init', options );
+            //     owner.on( 'load', function() {
+            //         debugger;
+            //     });
+            // },
+
+            loadFromBlob: function( blob ) {
+                var owner = this.owner;
+
+                owner.info() && this.flashExec( 'Image', 'info', owner.info() );
+                owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );
+
+                this.flashExec( 'Image', 'loadFromBlob', blob.uid );
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/flash/blob',[
+        'runtime/flash/runtime',
+        'lib/blob'
+    ], function( FlashRuntime, Blob ) {
+
+        return FlashRuntime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.flashExec( 'Blob', 'slice', start, end );
+
+                return new Blob( blob.uid, blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+
+                xhr.connectRuntime( blob.ruid );
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server,
+                    forceURLStream: opts.forceURLStream,
+                    mimeType: 'application/octet-stream'
+                }, binary );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            getResponse: function() {
+                return this._response || '';
+            },
+
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    var percent = e.loaded / e.total;
+                    percent = Math.min( 1, Math.max( 0, percent ) );
+                    return me.trigger( 'progress', percent );
+                });
+
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        readBody = false,
+                        err = '',
+                        p;
+
+                    xhr.off();
+                    me._xhr = null;
+
+                    if ( status >= 200 && status < 300 ) {
+                        readBody = true;
+                    } else if ( status >= 500 && status < 600 ) {
+                        readBody = true;
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+
+                    if ( readBody ) {
+                        me._response = xhr.exec('getResponse');
+                        me._response = decodeURIComponent( me._response );
+
+                        // flash 处理可能存在 bug, 没辙只能靠 js 了
+                        // try {
+                        //     me._responseJson = xhr.exec('getResponseAsJson');
+                        // } catch ( error ) {
+
+                        p = window.JSON && window.JSON.parse || function( s ) {
+                            try {
+                                return new Function('return ' + s).call();
+                            } catch ( err ) {
+                                return {};
+                            }
+                        };
+                        me._responseJson  = me._response ? p(me._response) : {};
+
+                        // }
+                    }
+
+                    xhr.destroy();
+                    xhr = null;
+
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview 只有flash实现的文件版本。
+     */
+    define('preset/flashonly',[
+        'base',
+
+        // widgets
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+
+        // runtimes
+
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/image',
+        'runtime/flash/blob',
+        'runtime/flash/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/flashonly'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.flashonly.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.flashonly.min.js
new file mode 100644
index 0000000..a50273d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.flashonly.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.5 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}return a},j=function(c){return a.__dollar=c,i(b(a,f,e))};"object"==typeof module&&"object"==typeof module.exports?module.exports=j():"function"==typeof define&&define.amd?define(["jquery"],j):(c=a.WebUploader,a.WebUploader=j(),a.WebUploader.noConflict=function(){a.WebUploader=c})}(window,function(a,b,c){return b("dollar-third",[],function(){var b=a.__dollar||a.jQuery||a.Zepto;if(!b)throw new Error("jQuery or Zepto not found!");return b}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.5",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",cancelFile:"cancel-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",md5File:"md5-file",getDimension:"get-dimension",addButton:"add-btn",predictRuntimeType:"predict-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return a?{successNum:a.numOfSuccess,progressNum:a.numOfProgress,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue,interruptNum:a.numofInterrupt}:{}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},destroy:function(){this.request("destroy",arguments),this.off()},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,this._parent=a,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.remove(),this._parent&&this._parent.removeClass("webuploader-container"),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,this.size=c.size||0,this.type=!c.type&&this.ext&&~"jpg,jpeg,png,gif,bmp".indexOf(this.ext)?"image/"+("jpg"===this.ext?"jpeg":this.ext):c.type||"application/octet-stream",b.call(d,"Blob"),this.uid=c.uid||this.uid,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&c.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(c.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString(),b.apply(this,arguments)}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var c=this,e=c.options,g=e.button;g.addClass("webuploader-pick"),c.on("all",function(a){var b;switch(a){case"mouseenter":g.addClass("webuploader-pick-hover");break;case"mouseleave":g.removeClass("webuploader-pick-hover");break;case"change":b=c.exec("getFiles"),c.trigger("select",f.map(b,function(a){return a=new d(c.getRuid(),a),a._refer=e.container,a}),e.container)}}),c.connectRuntime(e,function(){c.refresh(),c.exec("init",e),c.trigger("ready")}),this._resizeHandler=b.bindFn(this.refresh,this),f(a).on("resize",this._resizeHandler)},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){var b=this.options.button;f(a).off("resize",this._resizeHandler),b.removeClass("webuploader-pick-disable webuploader-pick-hover webuploader-pick")}}),e}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g=b.prototype.destroy,h={},i=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):h},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[],c=a.options.disableWidgets||"";return e.each(i,function(d,e){(!c||!~c.indexOf(e._name))&&b.push(new e(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,g,i,j,k=0,l=this._widgets,m=l&&l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],g=f.invoke(b,d),g!==h&&(a.isPromise(g)?o.push(g):n.push(g));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return 1===c.length&&(c=c[0]),setTimeout(function(){b.resolve(c)},1),b.promise()})[e?j:"done"](e||a.noop)):n[0]},destroy:function(){g.apply(this,arguments),this._widgets=null}}),b.register=d.register=function(b,c){var f,g={init:"init",destroy:"destroy",name:"anonymous"};return 1===arguments.length?(c=b,e.each(c,function(a){return"_"===a[0]||"name"===a?void("name"===a&&(g.name=c.name)):void(g[a.replace(/[A-Z]/g,"-$&").toLowerCase()]=a)})):g=e.extend(g,b),c.responseMap=g,f=a.inherits(d,c),f._name=g.name,i.push(f),f},b.unRegister=d.unRegister=function(a){if(a&&"anonymous"!==a)for(var b=i.length;b--;)i[b]._name===a&&i.splice(b,1)},d}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({name:"picker",init:function(a){return this.pickers=[],a.pick&&this.addBtn(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addBtn:function(b){var e=this,f=e.options,g=f.accept,h=[];if(b)return d.isPlainObject(b)||(b={id:b}),d(b.id).each(function(){var i,j,k;k=a.Deferred(),i=d.extend({},b,{accept:d.isPlainObject(g)?[g]:g,swf:f.swf,runtimeOrder:f.runtimeOrder,id:this}),j=new c(i),j.once("ready",k.resolve),j.on("select",function(a){e.owner.request("add-file",[a])}),j.init(),e.pickers.push(j),h.push(k.promise())}),a.when.apply(a,h)},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})},destroy:function(){d.each(this.pickers,function(){this.destroy()}),this.pickers=null}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!1,allowMagnify:!1},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},crop:function(){var b=a.slice(arguments);return this.exec.apply(this,["crop"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({name:"image",makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),1>=f&&f>0&&(f=a._info.width*f),1>=g&&g>0&&(g=a._info.height*g),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(a){b(a||!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},beforeSendFile:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||0,i=g&&g.noCompressIfLarger||!1;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){var a=g.width,c=g.height;b._info=b._info||d.info(),b._meta=b._meta||d.meta(),1>=a&&a>0&&(a=b._info.width*a),1>=c&&c>0&&(c=b._info.height*c),d.resize(a,c)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,(!i||a.size<c)&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application/octet-stream",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destroy:function(){this.off(),delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0,numofDeleted:0,numofInterrupt:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},removeFile:function(a){var b=this._map[a.id];b&&(delete this._map[a.id],a.destroy(),this.stats.numofDeleted++)},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)}))},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--;break;case f.INTERRUPT:c.numofInterrupt--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++;break;case f.INTERRUPT:c.numofInterrupt++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({name:"queue",init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),this.placeholder=l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||!a.size||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFile:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&setTimeout(function(){b.request("start-upload")},20)},getStats:function(){return this.stats},removeFile:function(a,b){var c=this;a=a.id?a:c.queue.getFile(a),this.request("cancel-file",a),b&&this.queue.removeFile(a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.owner.trigger("reset"),this.queue=new c,this.stats=this.queue.stats},destroy:function(){this.reset(),this.placeholder&&this.placeholder.destroy()}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({name:"runtime",init:function(){if(!this.predictRuntimeType())throw Error("Runtime Error")},predictRuntimeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){var c,d,e=[],f=a.source,g=f.size,h=b?Math.ceil(g/b):1,i=0,j=0;for(d={file:a,has:function(){return!!e.length},shift:function(){return e.shift()},unshift:function(a){e.unshift(a)}};h>j;)c=Math.min(b,g-i),e.push({file:a,start:i,end:b?i+c:g,total:g,chunks:h,chunk:j++,cuted:d}),i+=c;return a.blocks=e.concat(),a.remaning=e.length,d}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:{}}),b.register({name:"upload",init:function(){var b=this.owner,c=this;this.runing=!1,this.progress=!1,b.on("startUpload",function(){c.progress=!0}).on("uploadFinished",function(){c.progress=!1}),this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},reset:function(){this.request("stop-upload",!0),this.runing=!1,this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this._trigged=!1,this._promise=null},startUpload:function(b){var c=this;if(f.each(c.request("get-files",h.INVALID),function(){c.request("remove-file",this)}),b)if(b=b.id?b:c.request("get-file",b),b.getStatus()===h.INTERRUPT)f.each(c.pool,function(a,c){c.file===b&&c.transport&&c.transport.send()}),b.setStatus(h.QUEUED);else{if(b.getStatus()===h.PROGRESS)return;b.setStatus(h.QUEUED)}else f.each(c.request("get-files",[h.INITED]),function(){this.setStatus(h.QUEUED)});if(!c.runing){c.runing=!0;var d=[];f.each(c.pool,function(a,b){var e=b.file;e.getStatus()===h.INTERRUPT&&(d.push(e),c._trigged=!1,b.transport&&b.transport.send())});for(var b;b=d.shift();)b.setStatus(h.PROGRESS);b||f.each(c.request("get-files",h.INTERRUPT),function(){this.setStatus(h.PROGRESS)}),c._trigged=!1,a.nextTick(c.__tick),c.owner.trigger("startUpload")}},stopUpload:function(b,c){var d=this;if(b===!0&&(c=b,b=null),d.runing!==!1){if(b){if(b=b.id?b:d.request("get-file",b),b.getStatus()!==h.PROGRESS&&b.getStatus()!==h.QUEUED)return;return b.setStatus(h.INTERRUPT),f.each(d.pool,function(a,c){c.file===b&&(c.transport&&c.transport.abort(),d._putback(c),d._popBlock(c))}),a.nextTick(d.__tick)}d.runing=!1,this._promise&&this._promise.file&&this._promise.file.setStatus(h.INTERRUPT),c&&f.each(d.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),d.owner.trigger("stopUpload")}},cancelFile:function(a){a=a.id?a:this.request("get-file",a),a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),a.setStatus(h.CANCELLED),this.owner.trigger("fileDequeued",a)},isInProgress:function(){return!!this.progress},_getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=a.id?a:this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d._getStats().numOfQueue||d._getStats().numofInterrupt||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_putback:function(a){var b;a.cuted.unshift(a),b=this.stack.indexOf(a.cuted),~b||this.stack.unshift(a.cuted)},_getStack:function(){for(var a,b=0;a=this.stack[b++];){if(a.has()&&a.file.getStatus()===h.PROGRESS)return a;(!a.has()||a.file.getStatus()!==h.PROGRESS&&a.file.getStatus()!==h.INTERRUPT)&&this.stack.splice(--b,1)}return null},_nextBlock:function(){var a,b,c,d,f=this,h=f.options;return(a=this._getStack())?(h.prepareNextFile&&!f.pending.length&&f._prepareNextFile(),a.shift()):f.runing?(!f.pending.length&&f._getStats().numOfQueue&&f._prepareNextFile(),b=f.pending.shift(),c=function(b){return b?(a=e(b,h.chunked?h.chunkSize:0),f.stack.push(a),a.shift()):null},g(b)?(d=b.file,b=b[b.pipe?"pipe":"then"](c),b.file=d,b):c(b)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.PROGRESS||c.getStatus()===h.INTERRUPT?c:b._finishFile(c)}),b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),a.file=c,a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;return e.getStatus()!==h.PROGRESS?void(e.getStatus()===h.INTERRUPT&&d._putback(b)):(d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),void c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d.updateFileProgress(e),d._popBlock(b),a.nextTick(d.__tick))}))},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){b.percentage=a,g.updateFileProgress(k)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})},updateFileProgress:function(a){var b=0,c=0;a.blocks&&(f.each(a.blocks,function(a,b){c+=(b.percentage||0)*(b.end-b.start)}),b=c/a.size,this.owner.trigger("uploadProgress",a,b||0))}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({name:"validator",init:function(){var b=this;a.nextTick(function(){e.each(f,function(){this.call(b.owner)})})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileNumLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("reset",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileSizeLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("reset",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",d,a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));
+return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}),b.on("reset",function(){d={}}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destroy,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destroy=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.id,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){this.flashExec("FilePicker","destroy")}})}),b("runtime/flash/image",["runtime/flash/runtime"],function(a){return a.register("Image",{loadFromBlob:function(a){var b=this.owner;b.info()&&this.flashExec("Image","info",b.info()),b.meta()&&this.flashExec("Image","meta",b.meta()),this.flashExec("Image","loadFromBlob",a.uid)}})}),b("runtime/flash/blob",["runtime/flash/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.flashExec("Blob","slice",a,c);return new b(d.uid,d)}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(b,c,d){var e=b.$;return c.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,d=this._initAjax(),f=b._blob,g=c.server;d.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+e.param(b._formData),a=f.uid):(e.each(b._formData,function(a,b){d.exec("append",a,b)}),d.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(d,c.headers),d.exec("send",{method:c.method,url:g,forceURLStream:c.forceURLStream,mimeType:"application/octet-stream"},a)},getStatus:function(){return this._status},getResponse:function(){return this._response||""},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var b=this,c=new d("XMLHttpRequest");return c.on("uploadprogress progress",function(a){var c=a.loaded/a.total;return c=Math.min(1,Math.max(0,c)),b.trigger("progress",c)}),c.on("load",function(){var d,e=c.exec("getStatus"),f=!1,g="";return c.off(),b._xhr=null,e>=200&&300>e?f=!0:e>=500&&600>e?(f=!0,g="server"):g="http",f&&(b._response=c.exec("getResponse"),b._response=decodeURIComponent(b._response),d=a.JSON&&a.JSON.parse||function(a){try{return new Function("return "+a).call()}catch(b){return{}}},b._responseJson=b._response?d(b._response):{}),c.destroy(),c=null,g?b.trigger("error",g):b.trigger("load")}),c.on("error",function(){c.off(),b._xhr=null,b.trigger("error","http")}),b._xhr=c,c},_setRequestHeader:function(a,b){e.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("preset/flashonly",["base","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/flash/filepicker","runtime/flash/image","runtime/flash/blob","runtime/flash/transport"],function(a){return a}),b("webuploader",["preset/flashonly"],function(a){return a}),c("webuploader")});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.html5only.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.html5only.js
new file mode 100644
index 0000000..bec91d2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.html5only.js
@@ -0,0 +1,6030 @@
+/*! WebUploader 0.1.5 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+
+            return obj;
+        },
+
+        makeExport = function( dollar ) {
+            root.__dollar = dollar;
+
+            // exports every module.
+            return exportsTo( factory( root, _define, _require ) );
+        },
+
+        origin;
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = makeExport();
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([ 'jquery' ], makeExport );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = makeExport();
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( window, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        var $ = window.__dollar || window.jQuery || window.Zepto;
+
+        if ( !$ ) {
+            throw new Error('jQuery or Zepto not found!');
+        }
+
+        return $;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id为该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档中对类的使用可能省略掉了`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+
+        var noop = function() {},
+            call = Function.call;
+
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+
+        function createObject( proto ) {
+            var f;
+
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+
+
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.5',
+
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+
+            Deferred: promise.Deferred,
+
+            isPromise: promise.isPromise,
+
+            when: promise.when,
+
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match( /(?:trident)(?:.*rv:([\w.]+))?/i ),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+
+                /* jshint camelcase: false */
+
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+
+                return child;
+            },
+
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数noop](#WebUploader:Base.noop)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+
+            nextTick: (function() {
+
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+
+            while ( ++i < len ) {
+                handler = events[ i ];
+
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+
+            return !stoped;
+        }
+
+        protos = {
+
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+
+                if ( !callback ) {
+                    return this;
+                }
+
+                set = this._events || (this._events = []);
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+
+                    set.push( handler );
+                });
+
+                return this;
+            },
+
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+
+                if ( !callback ) {
+                    return me;
+                }
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+
+                return me;
+            },
+
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+
+                if ( !events ) {
+                    return this;
+                }
+
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+
+                return this;
+            },
+
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+
+                if ( !this._events || !type ) {
+                    return this;
+                }
+
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$;
+
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            cancelFile: 'cancel-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            md5File: 'md5-file',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            predictRuntimeType: 'predict-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+
+            _init: function( opts ) {
+                var me = this;
+
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     compress: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.option( 'compress', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+
+                // setter
+                if ( arguments.length > 1 ) {
+
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `progressNum` 上传中的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `queueNum` 还在队列中的文件数
+             * * `interruptNum` 被暂停的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+
+                return stats ? {
+                    successNum: stats.numOfSuccess,
+                    progressNum: stats.numOfProgress,
+
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue,
+                    interruptNum: stats.numofInterrupt
+                } : {};
+            },
+
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+
+                    return false;
+                }
+
+                return true;
+            },
+
+            /**
+             * 销毁 webuploader 实例
+             * @method destroy
+             * @grammar destroy() => undefined
+             */
+            destroy: function() {
+                this.request( 'destroy', arguments );
+                this.off();
+            },
+
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            factories = {},
+
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+
+        $.extend( Runtime.prototype, {
+
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+
+                if ( this._container ) {
+                    return this._container;
+                }
+
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                this._parent = parent;
+                return container;
+            },
+
+            init: Base.noop,
+            exec: Base.noop,
+
+            destroy: function() {
+                this._container && this._container.remove();
+                this._parent && this._parent.removeClass('webuploader-container');
+                this.off();
+            }
+        });
+
+        Runtime.orders = 'html5,flash';
+
+
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+
+            type = type || getFirstKey( factories );
+
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+
+        var cache;
+
+        cache = (function() {
+            var obj = {};
+
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+
+                get: function( ruid, standalone ) {
+                    var i;
+
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+
+                        return obj[ i ];
+                    }
+
+                    return null;
+                },
+
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+
+            this.uid = Base.guid('client_');
+
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+
+            this.connectRuntime = function( opts, cb ) {
+
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+
+                deferred.done( cb );
+
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                runtime.__client--;
+
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+
+                runtime = null;
+            };
+
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+
+                return runtime.exec.apply( this, args );
+            };
+
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+
+            opts.container = $( opts.container );
+
+            if ( !opts.container.length ) {
+                return;
+            }
+
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( DragAndDrop.prototype );
+
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            _destroy = Uploader.prototype.destroy,
+            IGNORE = {},
+            widgetClass = [];
+
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+
+            var length = obj.length,
+                type = $.type( obj );
+
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+
+        $.extend( Widget.prototype, {
+
+            init: Base.noop,
+
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+
+                    return IGNORE;
+                }
+
+                return this[ map[ apiName ] ].apply( this, args );
+
+            },
+
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+
+            /**
+             * @property {String | Array} [disableWidgets=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 默认所有 Uploader.register 了的 widget 都会被加载,如果禁用某一部分,请通过此 option 指定黑名单。
+             */
+
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [],
+                    deactives = me.options.disableWidgets || '';
+
+                $.each( widgetClass, function( _, klass ) {
+                    (!deactives || !~deactives.indexOf( klass._name )) &&
+                        widgets.push( new klass( me ) );
+                });
+
+                return _init.apply( me, arguments );
+            },
+
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets && widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+
+                args = isArrayLike( args ) ? args : [ args ];
+
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+
+                    if ( rlt !== IGNORE ) {
+
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个 tick 中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+
+                                if ( args.length === 1 ) {
+                                    args = args[ 0 ];
+                                }
+
+                                setTimeout(function() {
+                                    deferred.resolve( args );
+                                }, 1 );
+
+                                return deferred.promise();
+                            })[ callback ? key : 'done' ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            },
+
+            destroy: function() {
+                _destroy.apply( this, arguments );
+                this._widgets = null;
+            }
+        });
+
+        /**
+         * 添加组件
+         * @grammar Uploader.register(proto);
+         * @grammar Uploader.register(map, proto);
+         * @param  {object} responseMap API 名称与函数实现的映射
+         * @param  {object} proto 组件原型,构造函数通过 constructor 属性定义
+         * @method Uploader.register
+         * @for Uploader
+         * @example
+         * Uploader.register({
+         *     'make-thumb': 'makeThumb'
+         * }, {
+         *     init: function( options ) {},
+         *     makeThumb: function() {}
+         * });
+         *
+         * Uploader.register({
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init', destroy: 'destroy', name: 'anonymous' },
+                klass;
+
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+
+                // 自动生成 map 表。
+                $.each(widgetProto, function(key) {
+                    if ( key[0] === '_' || key === 'name' ) {
+                        key === 'name' && (map.name = widgetProto.name);
+                        return;
+                    }
+
+                    map[key.replace(/[A-Z]/g, '-$&').toLowerCase()] = key;
+                });
+
+            } else {
+                map = $.extend( map, responseMap );
+            }
+
+            widgetProto.responseMap = map;
+            klass = Base.inherits( Widget, widgetProto );
+            klass._name = map.name;
+            widgetClass.push( klass );
+
+            return klass;
+        };
+
+        /**
+         * 删除插件,只有在注册时指定了名字的才能被删除。
+         * @grammar Uploader.unRegister(name);
+         * @param  {string} name 组件名字
+         * @method Uploader.unRegister
+         * @for Uploader
+         * @example
+         *
+         * Uploader.register({
+         *     name: 'custom',
+         *
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         *
+         * Uploader.unRegister('custom');
+         */
+        Uploader.unRegister = Widget.unRegister = function( name ) {
+            if ( !name || name === 'anonymous' ) {
+                return;
+            }
+
+            // 删除指定的插件。
+            for ( var i = widgetClass.length; i--; ) {
+                if ( widgetClass[i]._name === name ) {
+                    widgetClass.splice(i, 1)
+                }
+            }
+        };
+
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+
+        Uploader.options.dnd = '';
+
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @property {Selector} [disableGlobalDnd=false]  是否禁掉整个页面的拖拽功能,如果不禁用,图片拖进来的时候会默认被浏览器打开。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            name: 'dnd',
+
+            init: function( opts ) {
+
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+
+                this.dnd = dnd = new Dnd( options );
+
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+
+                dnd.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.dnd && this.dnd.destroy();
+            }
+        });
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( FilePaste.prototype );
+
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            name: 'paste',
+
+            init: function( opts ) {
+
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+
+                this.paste = paste = new FilePaste( options );
+
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.paste && this.paste.destroy();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+
+        function Blob( ruid, source ) {
+            var me = this;
+
+            me.source = source;
+            me.ruid = ruid;
+            this.size = source.size || 0;
+
+            // 如果没有指定 mimetype, 但是知道文件后缀。
+            if ( !source.type && this.ext &&
+                    ~'jpg,jpeg,png,gif,bmp'.indexOf( this.ext ) ) {
+                this.type = 'image/' + (this.ext === 'jpg' ? 'jpeg' : this.ext);
+            } else {
+                this.type = source.type || 'application/octet-stream';
+            }
+
+            RuntimeClient.call( me, 'Blob' );
+            this.uid = source.uid || this.uid;
+
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+
+            getSource: function() {
+                return this.source;
+            }
+        });
+
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+
+        function File( ruid, file ) {
+            var ext;
+
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+
+            // todo 支持其他类型文件的转换。
+            // 如果有 mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && file.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( file.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+
+            Blob.apply( this, arguments );
+        }
+
+        return Base.inherits( Blob, File );
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+
+        var $ = Base.$;
+
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+
+            opts.container = $( opts.id );
+
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+
+                button.addClass('webuploader-pick');
+
+                me.on( 'all', function( type ) {
+                    var files;
+
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+
+                this._resizeHandler = Base.bindFn( this.refresh, this );
+                $( window ).on( 'resize', this._resizeHandler );
+            },
+
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+
+                    pos = button.offset();
+
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+
+            enable: function() {
+                var btn = this.options.button;
+
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+
+            disable: function() {
+                var btn = this.options.button;
+
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+
+                btn.addClass('webuploader-pick-disable');
+            },
+
+            destroy: function() {
+                var btn = this.options.button;
+                $( window ).off( 'resize', this._resizeHandler );
+                btn.removeClass('webuploader-pick-disable webuploader-pick-hover ' +
+                    'webuploader-pick');
+            }
+        });
+
+        return FilePicker;
+    });
+
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor|dom} 指定选择文件的按钮容器,不指定则不创建按钮。**注意** 这里虽然写的是 id, 但是不是只支持 id, 还支持 class, 或者 dom 节点。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+
+        return Uploader.register({
+            name: 'picker',
+
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addBtn( opts.pick );
+            },
+
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addBtn: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    promises = [];
+
+                if ( !pick ) {
+                    return;
+                }
+
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+
+                $( pick.id ).each(function() {
+                    var options, picker, deferred;
+
+                    deferred = Base.Deferred();
+
+                    options = $.extend({}, pick, {
+                        accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                        swf: opts.swf,
+                        runtimeOrder: opts.runtimeOrder,
+                        id: this
+                    });
+
+                    picker = new FilePicker( options );
+
+                    picker.once( 'ready', deferred.resolve );
+                    picker.on( 'select', function( files ) {
+                        me.owner.request( 'add-file', [ files ]);
+                    });
+                    picker.init();
+
+                    me.pickers.push( picker );
+
+                    promises.push( deferred.promise() );
+                });
+
+                return Base.when.apply( Base, promises );
+            },
+
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            },
+
+            destroy: function() {
+                $.each( this.pickers, function() {
+                    this.destroy();
+                });
+                this.pickers = null;
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+
+        // 默认选项。
+        Image.options = {
+
+            // 默认的图片处理质量
+            quality: 90,
+
+            // 是否裁剪
+            crop: false,
+
+            // 是否保留头部信息
+            preserveHeaders: false,
+
+            // 是否允许放大。
+            allowMagnify: false
+        };
+
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+
+            info: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+
+                // getter
+                return this._info;
+            },
+
+            meta: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+
+                // getter
+                return this._meta;
+            },
+
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+
+            crop: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'crop' ].concat( args ) );
+            },
+
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+
+        var $ = Base.$,
+            throttle;
+
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true,
+             *
+             *     // 如果发现压缩后文件大小比原来还大,则使用原来图片
+             *     // 此属性可能会影响图片自动纠正功能
+             *     noCompressIfLarger: false,
+             *
+             *     // 单位字节,如果图片大小小于此值,不会采用压缩。
+             *     compressSize: 0
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+
+        return Uploader.register({
+
+            name: 'image',
+
+
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * 当 width 或者 height 的值介于 0 - 1 时,被当成百分比使用。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             * 也可以借助服务端,将 base64 数据传给服务端,生成一个临时文件供预览。
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+
+                file = this.request( 'get-file', file );
+
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+
+                opts = $.extend({}, this.options.thumb );
+
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+
+                width = width || opts.width;
+                height = height || opts.height;
+
+                image = new Image( opts );
+
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                // 当 resize 完后
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+
+                image.once( 'error', function( reason ) {
+                    cb( reason || true );
+                    image.destroy();
+                });
+
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+
+            beforeSendFile: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 0,
+                    noCompressIfLarger = opts && opts.noCompressIfLarger || false,
+                    image, deferred;
+
+                file = this.request( 'get-file', file );
+
+                // 只压缩 jpeg 图片格式。
+                // gif 可能会丢失针
+                // bmp png 基本上尺寸都不大,且压缩比比较小。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+
+                image = new Image( opts );
+
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    var width = opts.width,
+                        height = opts.height;
+
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                image.once( 'complete', function() {
+                    var blob, size;
+
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+
+                        size = file.size;
+
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( !noCompressIfLarger || blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+
+                            file.trigger( 'resize', blob.size, size );
+                        }
+
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application/octet-stream'
+             */
+            this.type = source.type || 'application/octet-stream';
+
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+
+
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+
+            this.source = source;
+            this.loaded = 0;
+
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+
+        $.extend( WUFile.prototype, {
+
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+
+                var prevStatus = statusMap[ this.id ];
+
+                typeof text !== 'undefined' && (this.statusText = text);
+
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+
+            },
+
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+
+            destroy: function() {
+                this.off();
+                delete statusMap[ this.id ];
+            }
+        });
+
+        Mediator.installTo( WUFile.prototype );
+
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+
+        return WUFile;
+    });
+
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被取消的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * * `numofDeleted` 被移除的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0,
+                numofDeleted: 0,
+                numofInterrupt: 0
+            };
+
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+
+            // 存储所有文件
+            this._map = {};
+        }
+
+        $.extend( Queue.prototype, {
+
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+
+                status = status || STATUS.QUEUED;
+
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+
+                return null;
+            },
+
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+
+                    ret.push( file );
+                }
+
+                return ret;
+            },
+
+            /**
+             * 在队列中删除文件。
+             * @grammar removeFile( file ) => Array
+             * @method removeFile
+             * @param {File} 文件对象。
+             */
+            removeFile: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( existing ) {
+                    delete this._map[ file.id ];
+                    file.destroy();
+                    this.stats.numofDeleted++;
+                }
+            },
+
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+            },
+
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt--;
+                        break;
+                }
+
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt++;
+                        break;
+                }
+            }
+
+        });
+
+        Mediator.installTo( Queue.prototype );
+
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+
+        return Uploader.register({
+            name: 'queue',
+
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+
+                    me.accept = new RegExp( accept, 'i' );
+                }
+
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                this.placeholder = runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+
+
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+
+                    file = new WUFile( file );
+                }
+
+                return file;
+            },
+
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || !file.size || this.accept &&
+
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+
+                return !invalid;
+            },
+
+
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+
+            _addFile: function( file ) {
+                var me = this;
+
+                file = me._wrapFile( file );
+
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @property {Boolean} [auto=false]
+             * @namespace options
+             * @for Uploader
+             * @description 设置为 true 后,不需要手动调用上传,有文件选择即开始上传。
+             *
+             */
+
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFile: function( files ) {
+                var me = this;
+
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+
+                me.owner.trigger( 'filesQueued', files );
+
+                if ( me.options.auto ) {
+                    setTimeout(function() {
+                        me.request('start-upload');
+                    }, 20 );
+                }
+            },
+
+            getStats: function() {
+                return this.stats;
+            },
+
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+
+             /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @grammar removeFile( file, true ) => undefined
+             * @grammar removeFile( id, true ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件, 默认只会标记文件状态为已取消,如果第二个参数为 `true` 则会从 queue 中移除。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file, remove ) {
+                var me = this;
+
+                file = file.id ? file : me.queue.getFile( file );
+
+                this.request( 'cancel-file', file );
+
+                if ( remove ) {
+                    this.queue.removeFile( file );
+                }
+            },
+
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+
+                me.request('start-upload');
+            },
+
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+
+            /**
+             * @event reset
+             * @description 当 uploader 被重置的时候触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.owner.trigger('reset');
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            },
+
+            destroy: function() {
+                this.reset();
+                this.placeholder && this.placeholder.destroy();
+            }
+        });
+
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+
+        /**
+         * @property {Object} [runtimeOrder=html5,flash]
+         * @namespace options
+         * @for Uploader
+         * @description 指定运行时启动顺序。默认会想尝试 html5 是否支持,如果支持则使用 html5, 否则则使用 flash.
+         *
+         * 可以将此值设置成 `flash`,来强制使用 flash 运行时。
+         */
+
+        return Uploader.register({
+            name: 'runtime',
+
+            init: function() {
+                if ( !this.predictRuntimeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntimeType() => String
+             * @method predictRuntimeType
+             * @for  Uploader
+             */
+            predictRuntimeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+
+        var $ = Base.$;
+
+        function Transport( opts ) {
+            var me = this;
+
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+
+        Transport.options = {
+            server: '',
+            method: 'POST',
+
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+
+        $.extend( Transport.prototype, {
+
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+
+                if ( !duration ) {
+                    return;
+                }
+
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+
+        });
+
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+
+
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+
+
+            /**
+             * @property {Object} [formData={}]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: {}
+
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len, api;
+
+            api = {
+                file: file,
+
+                has: function() {
+                    return !!pending.length;
+                },
+
+                shift: function() {
+                    return pending.shift();
+                },
+
+                unshift: function( block ) {
+                    pending.unshift( block );
+                }
+            };
+
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++,
+                    cuted: api
+                });
+                start += len;
+            }
+
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+
+            return api;
+        }
+
+        Uploader.register({
+            name: 'upload',
+
+            init: function() {
+                var owner = this.owner,
+                    me = this;
+
+                this.runing = false;
+                this.progress = false;
+
+                owner
+                    .on( 'startUpload', function() {
+                        me.progress = true;
+                    })
+                    .on( 'uploadFinished', function() {
+                        me.progress = false;
+                    });
+
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+
+                // 缓存分好片的文件。
+                this.stack = [];
+
+                // 缓存即将上传的文件。
+                this.pending = [];
+
+                // 跟踪还有多少分片在上传中但是没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+
+                owner.on( 'uploadComplete', function( file ) {
+
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+
+            reset: function() {
+                this.request( 'stop-upload', true );
+                this.runing = false;
+                this.pool = [];
+                this.stack = [];
+                this.pending = [];
+                this.remaning = 0;
+                this._trigged = false;
+                this._promise = null;
+            },
+
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             *
+             * 可以指定开始某一个文件。
+             * @grammar upload() => undefined
+             * @grammar upload( file | fileId) => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            startUpload: function(file) {
+                var me = this;
+
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+
+                // 如果指定了开始某个文件,则只开始指定文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        $.each( me.pool, function( _, v ) {
+
+                            // 之前暂停过。
+                            if (v.file !== file) {
+                                return;
+                            }
+
+                            v.transport && v.transport.send();
+                        });
+
+                        file.setStatus( Status.QUEUED );
+                    } else if (file.getStatus() === Status.PROGRESS) {
+                        return;
+                    } else {
+                        file.setStatus( Status.QUEUED );
+                    }
+                } else {
+                    $.each( me.request( 'get-files', [ Status.INITED ] ), function() {
+                        this.setStatus( Status.QUEUED );
+                    });
+                }
+
+                if ( me.runing ) {
+                    return;
+                }
+
+                me.runing = true;
+
+                var files = [];
+
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        files.push(file);
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+
+                var file;
+                while ( (file = files.shift()) ) {
+                    file.setStatus( Status.PROGRESS );
+                }
+
+                file || $.each( me.request( 'get-files',
+                        Status.INTERRUPT ), function() {
+                    this.setStatus( Status.PROGRESS );
+                });
+
+                me._trigged = false;
+                Base.nextTick( me.__tick );
+                me.owner.trigger('startUpload');
+            },
+
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             *
+             * 如果第一个参数是文件,则只暂停指定文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @grammar stop( file ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stopUpload: function( file, interrupt ) {
+                var me = this;
+
+                if (file === true) {
+                    interrupt = file;
+                    file = null;
+                }
+
+                if ( me.runing === false ) {
+                    return;
+                }
+
+                // 如果只是暂停某个文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if ( file.getStatus() !== Status.PROGRESS &&
+                            file.getStatus() !== Status.QUEUED ) {
+                        return;
+                    }
+
+                    file.setStatus( Status.INTERRUPT );
+                    $.each( me.pool, function( _, v ) {
+
+                        // 只 abort 指定的文件。
+                        if (v.file !== file) {
+                            return;
+                        }
+
+                        v.transport && v.transport.abort();
+                        me._putback(v);
+                        me._popBlock(v);
+                    });
+
+                    return Base.nextTick( me.__tick );
+                }
+
+                me.runing = false;
+
+                if (this._promise && this._promise.file) {
+                    this._promise.file.setStatus( Status.INTERRUPT );
+                }
+
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+
+                me.owner.trigger('stopUpload');
+            },
+
+            /**
+             * @method cancelFile
+             * @grammar cancelFile( file ) => undefined
+             * @grammar cancelFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 标记文件状态为已取消, 同时将中断文件传输。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.cancelFile( file );
+             * })
+             */
+            cancelFile: function( file ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                file.setStatus( Status.CANCELLED );
+                this.owner.trigger( 'fileDequeued', file );
+            },
+
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.progress;
+            },
+
+            _getStats: function() {
+                return this.request('get-stats');
+            },
+
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                this.owner.trigger( 'uploadSkip', file );
+            },
+
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+
+                    fn = function( val ) {
+                        me._promise = null;
+
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me._getStats().numOfQueue &&
+                    !me._getStats().numofInterrupt ) {
+                    me.runing = false;
+
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+
+            _putback: function(block) {
+                var idx;
+
+                block.cuted.unshift(block);
+                idx = this.stack.indexOf(block.cuted);
+
+                if (!~idx) {
+                    this.stack.unshift(block.cuted);
+                }
+            },
+
+            _getStack: function() {
+                var i = 0,
+                    act;
+
+                while ( (act = this.stack[ i++ ]) ) {
+                    if ( act.has() && act.file.getStatus() === Status.PROGRESS ) {
+                        return act;
+                    } else if (!act.has() ||
+                            act.file.getStatus() !== Status.PROGRESS &&
+                            act.file.getStatus() !== Status.INTERRUPT ) {
+
+                        // 把已经处理完了的,或者,状态为非 progress(上传中)、
+                        // interupt(暂停中) 的移除。
+                        this.stack.splice( --i, 1 );
+                    }
+                }
+
+                return null;
+            },
+
+            _nextBlock: function() {
+                var me = this,
+                    opts = me.options,
+                    act, next, done, preparing;
+
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( (act = this._getStack()) ) {
+
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+
+                    return act.shift();
+
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me._getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me.stack.push(act);
+                        return act.shift();
+                    };
+
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    if ( isPromise( next) ) {
+                        preparing = next.file;
+                        next = next[ next.pipe ? 'pipe' : 'then' ]( done );
+                        next.file = preparing;
+                        return next;
+                    }
+
+                    return done( next );
+                }
+            },
+
+
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.PROGRESS ||
+                            file.getStatus() === Status.INTERRUPT ) {
+                            return file;
+                        }
+
+                        return me._finishFile( file );
+                    });
+
+                    me.owner.trigger( 'uploadStart', file );
+                    file.setStatus( Status.PROGRESS );
+
+                    promise.file = file;
+
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+
+                    pending.push( promise );
+                }
+            },
+
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+
+                // 有可能在 before-send-file 的 promise 期间改变了文件状态。
+                // 如:暂停,取消
+                // 我们不能中断 promise, 但是可以在 promise 完后,不做上传操作。
+                if ( file.getStatus() !== Status.PROGRESS ) {
+
+                    // 如果是中断,则还需要放回去。
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        me._putback(block);
+                    }
+
+                    return;
+                }
+
+                me.pool.push( block );
+                me.remaning++;
+
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me.updateFileProgress( file );
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+
+
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @param {Object} headers 可以扩展此对象来控制上传头部。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+
+
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+
+                block.transport = tr;
+
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    block.percentage = percentage;
+                    me.updateFileProgress( file );
+                });
+
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+
+                    return reject;
+                };
+
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+
+                        block.retried++;
+                        tr.send();
+
+                    } else {
+
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            },
+
+            updateFileProgress: function(file) {
+                var totalPercent = 0,
+                    uploaded = 0;
+
+                if (!file.blocks) {
+                    return;
+                }
+
+                $.each( file.blocks, function( _, v ) {
+                    uploaded += (v.percentage || 0) * (v.end - v.start);
+                });
+
+                totalPercent = uploaded / file.size;
+                this.owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+            }
+
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+
+        var $ = Base.$,
+            validators = {},
+            api;
+
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * * `Q_TYPE_DENIED` 当文件类型不满足时触发。。
+         * @for  Uploader
+         */
+
+        // 暴露给外面的api
+        api = {
+
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            name: 'validator',
+
+            init: function() {
+                var me = this;
+                Base.nextTick(function() {
+                    $.each( validators, function() {
+                        this.call( me.owner );
+                    });
+                });
+            }
+        });
+
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileNumLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return count >= max ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileSizeLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return invalid ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', max, file );
+                    return false;
+                }
+
+            });
+
+        });
+
+        /**
+         * @property {Boolean} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+
+            if ( opts.duplicate ) {
+                return;
+            }
+
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+
+                return hash;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (mapping[ hash ] = true);
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (delete mapping[ hash ]);
+            });
+
+            uploader.on( 'reset', function() {
+                mapping = {};
+            });
+        });
+
+        return api;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+
+        function CompBase( owner, runtime ) {
+
+            this.owner = owner;
+            this.options = owner.options;
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var type = 'html5',
+            components = {};
+
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destroy = this.destroy;
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+
+            me.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+        }
+
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+
+        });
+
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+
+                blob = slice.call( blob, start, end );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+
+                e = e.originalEvent || e;
+
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+
+                return false;
+            },
+
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+
+                return false;
+            },
+
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 ),
+                    dataTransfer, data;
+
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                e = e.originalEvent || e;
+                dataTransfer = e.dataTransfer;
+
+                // 如果是页面内拖拽,还不能处理,不阻止事件。
+                // 此处 ie11 下会报参数错误,
+                try {
+                    data = dataTransfer.getData('text/html');
+                } catch( err ) {
+                }
+
+                if ( data ) {
+                    return;
+                }
+
+                me._getTansferFiles( dataTransfer, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( dataTransfer, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, file, item, i, len, canAccessFolder;
+
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+
+                Base.when.apply( Base, promises ).done(function() {
+
+                    if ( !results.length ) {
+                        return;
+                    }
+
+                    callback( results );
+                });
+            },
+
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                var elem = this.elem;
+
+                // 还没 init 就调用 destroy
+                if (!elem) {
+                    return;
+                }
+
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragOverHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+
+                    allowed.push( new File( ruid, blob ) );
+                }
+
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var $ = Base.$;
+
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    label = this.label = $( document.createElement('label') ),
+                    input =  this.input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+
+                label.on( 'click', function() {
+                    input.trigger('click');
+                });
+
+                label.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+
+                    input.attr( 'accept', arr.join(',') );
+                }
+
+                container.append( input );
+                container.append( label );
+
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+
+                    me.files = e.target.files;
+
+                    // reset input
+                    clone = this.cloneNode( true );
+                    clone.value = null;
+                    this.parentNode.replaceChild( clone, this );
+
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+
+                    owner.trigger('change');
+                });
+
+                label.on( 'mouseenter mouseleave', mouseHandler );
+
+            },
+
+
+            getFiles: function() {
+                return this.files;
+            },
+
+            destroy: function() {
+                this.input.off();
+                this.label.off();
+            }
+        });
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/util',[
+        'base'
+    ], function( Base ) {
+
+        var urlAPI = window.createObjectURL && window ||
+                window.URL && URL.revokeObjectURL && URL ||
+                window.webkitURL,
+            createObjectURL = Base.noop,
+            revokeObjectURL = createObjectURL;
+
+        if ( urlAPI ) {
+
+            // 更安全的方式调用,比如android里面就能把context改成其他的对象。
+            createObjectURL = function() {
+                return urlAPI.createObjectURL.apply( urlAPI, arguments );
+            };
+
+            revokeObjectURL = function() {
+                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
+            };
+        }
+
+        return {
+            createObjectURL: createObjectURL,
+            revokeObjectURL: revokeObjectURL,
+
+            dataURL2Blob: function( dataURI ) {
+                var byteStr, intArray, ab, i, mimetype, parts;
+
+                parts = dataURI.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+
+                ab = new ArrayBuffer( byteStr.length );
+                intArray = new Uint8Array( ab );
+
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+
+                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
+
+                return this.arrayBufferToBlob( ab, mimetype );
+            },
+
+            dataURL2ArrayBuffer: function( dataURI ) {
+                var byteStr, intArray, i, parts;
+
+                parts = dataURI.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+
+                intArray = new Uint8Array( byteStr.length );
+
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+
+                return intArray.buffer;
+            },
+
+            arrayBufferToBlob: function( buffer, type ) {
+                var builder = window.BlobBuilder || window.WebKitBlobBuilder,
+                    bb;
+
+                // android不支持直接new Blob, 只能借助blobbuilder.
+                if ( builder ) {
+                    bb = new builder();
+                    bb.append( buffer );
+                    return bb.getBlob( type );
+                }
+
+                return new Blob([ buffer ], type ? { type: type } : {} );
+            },
+
+            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
+            // 你得到的结果是png.
+            canvasToDataUrl: function( canvas, type, quality ) {
+                return canvas.toDataURL( type, quality / 100 );
+            },
+
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            parseMeta: function( blob, callback ) {
+                callback( false, {});
+            },
+
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            updateImageHead: function( data ) {
+                return data;
+            }
+        };
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/imagemeta',[
+        'runtime/html5/util'
+    ], function( Util ) {
+
+        var api;
+
+        api = {
+            parsers: {
+                0xffe1: []
+            },
+
+            maxMetaDataSize: 262144,
+
+            parse: function( blob, cb ) {
+                var me = this,
+                    fr = new FileReader();
+
+                fr.onload = function() {
+                    cb( false, me._parse( this.result ) );
+                    fr = fr.onload = fr.onerror = null;
+                };
+
+                fr.onerror = function( e ) {
+                    cb( e.message );
+                    fr = fr.onload = fr.onerror = null;
+                };
+
+                blob = blob.slice( 0, me.maxMetaDataSize );
+                fr.readAsArrayBuffer( blob.getSource() );
+            },
+
+            _parse: function( buffer, noParse ) {
+                if ( buffer.byteLength < 6 ) {
+                    return;
+                }
+
+                var dataview = new DataView( buffer ),
+                    offset = 2,
+                    maxOffset = dataview.byteLength - 4,
+                    headLength = offset,
+                    ret = {},
+                    markerBytes, markerLength, parsers, i;
+
+                if ( dataview.getUint16( 0 ) === 0xffd8 ) {
+
+                    while ( offset < maxOffset ) {
+                        markerBytes = dataview.getUint16( offset );
+
+                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
+                                markerBytes === 0xfffe ) {
+
+                            markerLength = dataview.getUint16( offset + 2 ) + 2;
+
+                            if ( offset + markerLength > dataview.byteLength ) {
+                                break;
+                            }
+
+                            parsers = api.parsers[ markerBytes ];
+
+                            if ( !noParse && parsers ) {
+                                for ( i = 0; i < parsers.length; i += 1 ) {
+                                    parsers[ i ].call( api, dataview, offset,
+                                            markerLength, ret );
+                                }
+                            }
+
+                            offset += markerLength;
+                            headLength = offset;
+                        } else {
+                            break;
+                        }
+                    }
+
+                    if ( headLength > 6 ) {
+                        if ( buffer.slice ) {
+                            ret.imageHead = buffer.slice( 2, headLength );
+                        } else {
+                            // Workaround for IE10, which does not yet
+                            // support ArrayBuffer.slice:
+                            ret.imageHead = new Uint8Array( buffer )
+                                    .subarray( 2, headLength );
+                        }
+                    }
+                }
+
+                return ret;
+            },
+
+            updateImageHead: function( buffer, head ) {
+                var data = this._parse( buffer, true ),
+                    buf1, buf2, bodyoffset;
+
+
+                bodyoffset = 2;
+                if ( data.imageHead ) {
+                    bodyoffset = 2 + data.imageHead.byteLength;
+                }
+
+                if ( buffer.slice ) {
+                    buf2 = buffer.slice( bodyoffset );
+                } else {
+                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
+                }
+
+                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
+
+                buf1[ 0 ] = 0xFF;
+                buf1[ 1 ] = 0xD8;
+                buf1.set( new Uint8Array( head ), 2 );
+                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
+
+                return buf1.buffer;
+            }
+        };
+
+        Util.parseMeta = function() {
+            return api.parse.apply( api, arguments );
+        };
+
+        Util.updateImageHead = function() {
+            return api.updateImageHead.apply( api, arguments );
+        };
+
+        return api;
+    });
+    /**
+     * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
+     * 暂时项目中只用了orientation.
+     *
+     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
+     * @fileOverview EXIF解析
+     */
+
+    // Sample
+    // ====================================
+    // Make : Apple
+    // Model : iPhone 4S
+    // Orientation : 1
+    // XResolution : 72 [72/1]
+    // YResolution : 72 [72/1]
+    // ResolutionUnit : 2
+    // Software : QuickTime 7.7.1
+    // DateTime : 2013:09:01 22:53:55
+    // ExifIFDPointer : 190
+    // ExposureTime : 0.058823529411764705 [1/17]
+    // FNumber : 2.4 [12/5]
+    // ExposureProgram : Normal program
+    // ISOSpeedRatings : 800
+    // ExifVersion : 0220
+    // DateTimeOriginal : 2013:09:01 22:52:51
+    // DateTimeDigitized : 2013:09:01 22:52:51
+    // ComponentsConfiguration : YCbCr
+    // ShutterSpeedValue : 4.058893515764426
+    // ApertureValue : 2.5260688216892597 [4845/1918]
+    // BrightnessValue : -0.3126686601998395
+    // MeteringMode : Pattern
+    // Flash : Flash did not fire, compulsory flash mode
+    // FocalLength : 4.28 [107/25]
+    // SubjectArea : [4 values]
+    // FlashpixVersion : 0100
+    // ColorSpace : 1
+    // PixelXDimension : 2448
+    // PixelYDimension : 3264
+    // SensingMethod : One-chip color area sensor
+    // ExposureMode : 0
+    // WhiteBalance : Auto white balance
+    // FocalLengthIn35mmFilm : 35
+    // SceneCaptureType : Standard
+    define('runtime/html5/imagemeta/exif',[
+        'base',
+        'runtime/html5/imagemeta'
+    ], function( Base, ImageMeta ) {
+
+        var EXIF = {};
+
+        EXIF.ExifMap = function() {
+            return this;
+        };
+
+        EXIF.ExifMap.prototype.map = {
+            'Orientation': 0x0112
+        };
+
+        EXIF.ExifMap.prototype.get = function( id ) {
+            return this[ id ] || this[ this.map[ id ] ];
+        };
+
+        EXIF.exifTagTypes = {
+            // byte, 8-bit unsigned int:
+            1: {
+                getValue: function( dataView, dataOffset ) {
+                    return dataView.getUint8( dataOffset );
+                },
+                size: 1
+            },
+
+            // ascii, 8-bit byte:
+            2: {
+                getValue: function( dataView, dataOffset ) {
+                    return String.fromCharCode( dataView.getUint8( dataOffset ) );
+                },
+                size: 1,
+                ascii: true
+            },
+
+            // short, 16 bit int:
+            3: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint16( dataOffset, littleEndian );
+                },
+                size: 2
+            },
+
+            // long, 32 bit int:
+            4: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+
+            // rational = two long values,
+            // first is numerator, second is denominator:
+            5: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian ) /
+                        dataView.getUint32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            },
+
+            // slong, 32 bit signed int:
+            9: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+
+            // srational, two slongs, first is numerator, second is denominator:
+            10: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian ) /
+                        dataView.getInt32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            }
+        };
+
+        // undefined, 8-bit byte, value depending on field:
+        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
+
+        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
+                littleEndian ) {
+
+            var tagType = EXIF.exifTagTypes[ type ],
+                tagSize, dataOffset, values, i, str, c;
+
+            if ( !tagType ) {
+                Base.log('Invalid Exif data: Invalid tag type.');
+                return;
+            }
+
+            tagSize = tagType.size * length;
+
+            // Determine if the value is contained in the dataOffset bytes,
+            // or if the value at the dataOffset is a pointer to the actual data:
+            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
+                    littleEndian ) : (offset + 8);
+
+            if ( dataOffset + tagSize > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid data offset.');
+                return;
+            }
+
+            if ( length === 1 ) {
+                return tagType.getValue( dataView, dataOffset, littleEndian );
+            }
+
+            values = [];
+
+            for ( i = 0; i < length; i += 1 ) {
+                values[ i ] = tagType.getValue( dataView,
+                        dataOffset + i * tagType.size, littleEndian );
+            }
+
+            if ( tagType.ascii ) {
+                str = '';
+
+                // Concatenate the chars:
+                for ( i = 0; i < values.length; i += 1 ) {
+                    c = values[ i ];
+
+                    // Ignore the terminating NULL byte(s):
+                    if ( c === '\u0000' ) {
+                        break;
+                    }
+                    str += c;
+                }
+
+                return str;
+            }
+            return values;
+        };
+
+        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
+                data ) {
+
+            var tag = dataView.getUint16( offset, littleEndian );
+            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
+                    dataView.getUint16( offset + 2, littleEndian ),    // tag type
+                    dataView.getUint32( offset + 4, littleEndian ),    // tag length
+                    littleEndian );
+        };
+
+        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
+                littleEndian, data ) {
+
+            var tagsNumber, dirEndOffset, i;
+
+            if ( dirOffset + 6 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory offset.');
+                return;
+            }
+
+            tagsNumber = dataView.getUint16( dirOffset, littleEndian );
+            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
+
+            if ( dirEndOffset + 4 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory size.');
+                return;
+            }
+
+            for ( i = 0; i < tagsNumber; i += 1 ) {
+                this.parseExifTag( dataView, tiffOffset,
+                        dirOffset + 2 + 12 * i,    // tag offset
+                        littleEndian, data );
+            }
+
+            // Return the offset to the next directory:
+            return dataView.getUint32( dirEndOffset, littleEndian );
+        };
+
+        // EXIF.getExifThumbnail = function(dataView, offset, length) {
+        //     var hexData,
+        //         i,
+        //         b;
+        //     if (!length || offset + length > dataView.byteLength) {
+        //         Base.log('Invalid Exif data: Invalid thumbnail data.');
+        //         return;
+        //     }
+        //     hexData = [];
+        //     for (i = 0; i < length; i += 1) {
+        //         b = dataView.getUint8(offset + i);
+        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));
+        //     }
+        //     return 'data:image/jpeg,%' + hexData.join('%');
+        // };
+
+        EXIF.parseExifData = function( dataView, offset, length, data ) {
+
+            var tiffOffset = offset + 10,
+                littleEndian, dirOffset;
+
+            // Check for the ASCII code for "Exif" (0x45786966):
+            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
+                // No Exif data, might be XMP data instead
+                return;
+            }
+            if ( tiffOffset + 8 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid segment size.');
+                return;
+            }
+
+            // Check for the two null bytes:
+            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
+                Base.log('Invalid Exif data: Missing byte alignment offset.');
+                return;
+            }
+
+            // Check the byte alignment:
+            switch ( dataView.getUint16( tiffOffset ) ) {
+                case 0x4949:
+                    littleEndian = true;
+                    break;
+
+                case 0x4D4D:
+                    littleEndian = false;
+                    break;
+
+                default:
+                    Base.log('Invalid Exif data: Invalid byte alignment marker.');
+                    return;
+            }
+
+            // Check for the TIFF tag marker (0x002A):
+            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
+                Base.log('Invalid Exif data: Missing TIFF marker.');
+                return;
+            }
+
+            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
+            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
+            // Create the exif object to store the tags:
+            data.exif = new EXIF.ExifMap();
+            // Parse the tags of the main image directory and retrieve the
+            // offset to the next directory, usually the thumbnail directory:
+            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
+                    tiffOffset + dirOffset, littleEndian, data );
+
+            // 尝试读取缩略图
+            // if ( dirOffset ) {
+            //     thumbnailData = {exif: {}};
+            //     dirOffset = EXIF.parseExifTags(
+            //         dataView,
+            //         tiffOffset,
+            //         tiffOffset + dirOffset,
+            //         littleEndian,
+            //         thumbnailData
+            //     );
+
+            //     // Check for JPEG Thumbnail offset:
+            //     if (thumbnailData.exif[0x0201]) {
+            //         data.exif.Thumbnail = EXIF.getExifThumbnail(
+            //             dataView,
+            //             tiffOffset + thumbnailData.exif[0x0201],
+            //             thumbnailData.exif[0x0202] // Thumbnail data length
+            //         );
+            //     }
+            // }
+        };
+
+        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
+        return EXIF;
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('runtime/html5/image',[
+        'base',
+        'runtime/html5/runtime',
+        'runtime/html5/util'
+    ], function( Base, Html5Runtime, Util ) {
+
+        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
+
+        return Html5Runtime.register( 'Image', {
+
+            // flag: 标记是否被修改过。
+            modified: false,
+
+            init: function() {
+                var me = this,
+                    img = new Image();
+
+                img.onload = function() {
+
+                    me._info = {
+                        type: me.type,
+                        width: this.width,
+                        height: this.height
+                    };
+
+                    // 读取meta信息。
+                    if ( !me._metas && 'image/jpeg' === me.type ) {
+                        Util.parseMeta( me._blob, function( error, ret ) {
+                            me._metas = ret;
+                            me.owner.trigger('load');
+                        });
+                    } else {
+                        me.owner.trigger('load');
+                    }
+                };
+
+                img.onerror = function() {
+                    me.owner.trigger('error');
+                };
+
+                me._img = img;
+            },
+
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    img = me._img;
+
+                me._blob = blob;
+                me.type = blob.type;
+                img.src = Util.createObjectURL( blob.getSource() );
+                me.owner.once( 'load', function() {
+                    Util.revokeObjectURL( img.src );
+                });
+            },
+
+            resize: function( width, height ) {
+                var canvas = this._canvas ||
+                        (this._canvas = document.createElement('canvas'));
+
+                this._resize( this._img, canvas, width, height );
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger( 'complete', 'resize' );
+            },
+
+            crop: function( x, y, w, h, s ) {
+                var cvs = this._canvas ||
+                        (this._canvas = document.createElement('canvas')),
+                    opts = this.options,
+                    img = this._img,
+                    iw = img.naturalWidth,
+                    ih = img.naturalHeight,
+                    orientation = this.getOrientation();
+
+                s = s || 1;
+
+                // todo 解决 orientation 的问题。
+                // values that require 90 degree rotation
+                // if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+
+                //     switch ( orientation ) {
+                //         case 6:
+                //             tmp = x;
+                //             x = y;
+                //             y = iw * s - tmp - w;
+                //             console.log(ih * s, tmp, w)
+                //             break;
+                //     }
+
+                //     (w ^= h, h ^= w, w ^= h);
+                // }
+
+                cvs.width = w;
+                cvs.height = h;
+
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+                this._renderImageToCanvas( cvs, img, -x, -y, iw * s, ih * s );
+
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger( 'complete', 'crop' );
+            },
+
+            getAsBlob: function( type ) {
+                var blob = this._blob,
+                    opts = this.options,
+                    canvas;
+
+                type = type || this.type;
+
+                // blob需要重新生成。
+                if ( this.modified || this.type !== type ) {
+                    canvas = this._canvas;
+
+                    if ( type === 'image/jpeg' ) {
+
+                        blob = Util.canvasToDataUrl( canvas, type, opts.quality );
+
+                        if ( opts.preserveHeaders && this._metas &&
+                                this._metas.imageHead ) {
+
+                            blob = Util.dataURL2ArrayBuffer( blob );
+                            blob = Util.updateImageHead( blob,
+                                    this._metas.imageHead );
+                            blob = Util.arrayBufferToBlob( blob, type );
+                            return blob;
+                        }
+                    } else {
+                        blob = Util.canvasToDataUrl( canvas, type );
+                    }
+
+                    blob = Util.dataURL2Blob( blob );
+                }
+
+                return blob;
+            },
+
+            getAsDataUrl: function( type ) {
+                var opts = this.options;
+
+                type = type || this.type;
+
+                if ( type === 'image/jpeg' ) {
+                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );
+                } else {
+                    return this._canvas.toDataURL( type );
+                }
+            },
+
+            getOrientation: function() {
+                return this._metas && this._metas.exif &&
+                        this._metas.exif.get('Orientation') || 1;
+            },
+
+            info: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+
+                // getter
+                return this._info;
+            },
+
+            meta: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+
+                // getter
+                return this._meta;
+            },
+
+            destroy: function() {
+                var canvas = this._canvas;
+                this._img.onload = null;
+
+                if ( canvas ) {
+                    canvas.getContext('2d')
+                            .clearRect( 0, 0, canvas.width, canvas.height );
+                    canvas.width = canvas.height = 0;
+                    this._canvas = null;
+                }
+
+                // 释放内存。非常重要,否则释放不了image的内存。
+                this._img.src = BLANK;
+                this._img = this._blob = null;
+            },
+
+            _resize: function( img, cvs, width, height ) {
+                var opts = this.options,
+                    naturalWidth = img.width,
+                    naturalHeight = img.height,
+                    orientation = this.getOrientation(),
+                    scale, w, h, x, y;
+
+                // values that require 90 degree rotation
+                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+
+                    // 交换width, height的值。
+                    width ^= height;
+                    height ^= width;
+                    width ^= height;
+                }
+
+                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
+                        height / naturalHeight );
+
+                // 不允许放大。
+                opts.allowMagnify || (scale = Math.min( 1, scale ));
+
+                w = naturalWidth * scale;
+                h = naturalHeight * scale;
+
+                if ( opts.crop ) {
+                    cvs.width = width;
+                    cvs.height = height;
+                } else {
+                    cvs.width = w;
+                    cvs.height = h;
+                }
+
+                x = (cvs.width - w) / 2;
+                y = (cvs.height - h) / 2;
+
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+
+                this._renderImageToCanvas( cvs, img, x, y, w, h );
+            },
+
+            _rotate2Orientaion: function( canvas, orientation ) {
+                var width = canvas.width,
+                    height = canvas.height,
+                    ctx = canvas.getContext('2d');
+
+                switch ( orientation ) {
+                    case 5:
+                    case 6:
+                    case 7:
+                    case 8:
+                        canvas.width = height;
+                        canvas.height = width;
+                        break;
+                }
+
+                switch ( orientation ) {
+                    case 2:    // horizontal flip
+                        ctx.translate( width, 0 );
+                        ctx.scale( -1, 1 );
+                        break;
+
+                    case 3:    // 180 rotate left
+                        ctx.translate( width, height );
+                        ctx.rotate( Math.PI );
+                        break;
+
+                    case 4:    // vertical flip
+                        ctx.translate( 0, height );
+                        ctx.scale( 1, -1 );
+                        break;
+
+                    case 5:    // vertical flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.scale( 1, -1 );
+                        break;
+
+                    case 6:    // 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( 0, -height );
+                        break;
+
+                    case 7:    // horizontal flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( width, -height );
+                        ctx.scale( -1, 1 );
+                        break;
+
+                    case 8:    // 90 rotate left
+                        ctx.rotate( -0.5 * Math.PI );
+                        ctx.translate( -width, 0 );
+                        break;
+                }
+            },
+
+            // https://github.com/stomita/ios-imagefile-megapixel/
+            // blob/master/src/megapix-image.js
+            _renderImageToCanvas: (function() {
+
+                // 如果不是ios, 不需要这么复杂!
+                if ( !Base.os.ios ) {
+                    return function( canvas ) {
+                        var args = Base.slice( arguments, 1 ),
+                            ctx = canvas.getContext('2d');
+
+                        ctx.drawImage.apply( ctx, args );
+                    };
+                }
+
+                /**
+                 * Detecting vertical squash in loaded image.
+                 * Fixes a bug which squash image vertically while drawing into
+                 * canvas for some images.
+                 */
+                function detectVerticalSquash( img, iw, ih ) {
+                    var canvas = document.createElement('canvas'),
+                        ctx = canvas.getContext('2d'),
+                        sy = 0,
+                        ey = ih,
+                        py = ih,
+                        data, alpha, ratio;
+
+
+                    canvas.width = 1;
+                    canvas.height = ih;
+                    ctx.drawImage( img, 0, 0 );
+                    data = ctx.getImageData( 0, 0, 1, ih ).data;
+
+                    // search image edge pixel position in case
+                    // it is squashed vertically.
+                    while ( py > sy ) {
+                        alpha = data[ (py - 1) * 4 + 3 ];
+
+                        if ( alpha === 0 ) {
+                            ey = py;
+                        } else {
+                            sy = py;
+                        }
+
+                        py = (ey + sy) >> 1;
+                    }
+
+                    ratio = (py / ih);
+                    return (ratio === 0) ? 1 : ratio;
+                }
+
+                // fix ie7 bug
+                // http://stackoverflow.com/questions/11929099/
+                // html5-canvas-drawimage-ratio-bug-ios
+                if ( Base.os.ios >= 7 ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        var iw = img.naturalWidth,
+                            ih = img.naturalHeight,
+                            vertSquashRatio = detectVerticalSquash( img, iw, ih );
+
+                        return canvas.getContext('2d').drawImage( img, 0, 0,
+                                iw * vertSquashRatio, ih * vertSquashRatio,
+                                x, y, w, h );
+                    };
+                }
+
+                /**
+                 * Detect subsampling in loaded image.
+                 * In iOS, larger images than 2M pixels may be
+                 * subsampled in rendering.
+                 */
+                function detectSubsampling( img ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        canvas, ctx;
+
+                    // subsampling may happen overmegapixel image
+                    if ( iw * ih > 1024 * 1024 ) {
+                        canvas = document.createElement('canvas');
+                        canvas.width = canvas.height = 1;
+                        ctx = canvas.getContext('2d');
+                        ctx.drawImage( img, -iw + 1, 0 );
+
+                        // subsampled image becomes half smaller in rendering size.
+                        // check alpha channel value to confirm image is covering
+                        // edge pixel or not. if alpha value is 0
+                        // image is not covering, hence subsampled.
+                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
+                    } else {
+                        return false;
+                    }
+                }
+
+
+                return function( canvas, img, x, y, width, height ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        ctx = canvas.getContext('2d'),
+                        subsampled = detectSubsampling( img ),
+                        doSquash = this.type === 'image/jpeg',
+                        d = 1024,
+                        sy = 0,
+                        dy = 0,
+                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
+
+                    if ( subsampled ) {
+                        iw /= 2;
+                        ih /= 2;
+                    }
+
+                    ctx.save();
+                    tmpCanvas = document.createElement('canvas');
+                    tmpCanvas.width = tmpCanvas.height = d;
+
+                    tmpCtx = tmpCanvas.getContext('2d');
+                    vertSquashRatio = doSquash ?
+                            detectVerticalSquash( img, iw, ih ) : 1;
+
+                    dw = Math.ceil( d * width / iw );
+                    dh = Math.ceil( d * height / ih / vertSquashRatio );
+
+                    while ( sy < ih ) {
+                        sx = 0;
+                        dx = 0;
+                        while ( sx < iw ) {
+                            tmpCtx.clearRect( 0, 0, d, d );
+                            tmpCtx.drawImage( img, -sx, -sy );
+                            ctx.drawImage( tmpCanvas, 0, 0, d, d,
+                                    x + dx, y + dy, dw, dh );
+                            sx += d;
+                            dx += dw;
+                        }
+                        sy += d;
+                        dy += dh;
+                    }
+                    ctx.restore();
+                    tmpCanvas = tmpCtx = null;
+                };
+            })()
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var noop = Base.noop,
+            $ = Base.$;
+
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+
+                if ( binary ) {
+                    // 强制设置成 content-type 为文件流。
+                    xhr.overrideMimeType &&
+                            xhr.overrideMimeType('application/octet-stream');
+
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+
+            getResponse: function() {
+                return this._response;
+            },
+
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+
+                    return me.trigger( 'progress', percentage );
+                };
+
+                xhr.onreadystatechange = function() {
+
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+
+
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+
+            _parseJson: function( str ) {
+                var json;
+
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview 只有html5实现的文件版本。
+     */
+    define('preset/html5only',[
+        'base',
+
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/imagemeta/exif',
+        'runtime/html5/image',
+        'runtime/html5/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/html5only'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.html5only.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.html5only.min.js
new file mode 100644
index 0000000..4b83edd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.html5only.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.5 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}return a},j=function(c){return a.__dollar=c,i(b(a,f,e))};"object"==typeof module&&"object"==typeof module.exports?module.exports=j():"function"==typeof define&&define.amd?define(["jquery"],j):(c=a.WebUploader,a.WebUploader=j(),a.WebUploader.noConflict=function(){a.WebUploader=c})}(window,function(a,b,c){return b("dollar-third",[],function(){var b=a.__dollar||a.jQuery||a.Zepto;if(!b)throw new Error("jQuery or Zepto not found!");return b}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.5",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",cancelFile:"cancel-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",md5File:"md5-file",getDimension:"get-dimension",addButton:"add-btn",predictRuntimeType:"predict-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return a?{successNum:a.numOfSuccess,progressNum:a.numOfProgress,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue,interruptNum:a.numofInterrupt}:{}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},destroy:function(){this.request("destroy",arguments),this.off()},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,this._parent=a,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.remove(),this._parent&&this._parent.removeClass("webuploader-container"),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g=b.prototype.destroy,h={},i=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):h},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[],c=a.options.disableWidgets||"";return e.each(i,function(d,e){(!c||!~c.indexOf(e._name))&&b.push(new e(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,g,i,j,k=0,l=this._widgets,m=l&&l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],g=f.invoke(b,d),g!==h&&(a.isPromise(g)?o.push(g):n.push(g));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return 1===c.length&&(c=c[0]),setTimeout(function(){b.resolve(c)},1),b.promise()})[e?j:"done"](e||a.noop)):n[0]},destroy:function(){g.apply(this,arguments),this._widgets=null}}),b.register=d.register=function(b,c){var f,g={init:"init",destroy:"destroy",name:"anonymous"};return 1===arguments.length?(c=b,e.each(c,function(a){return"_"===a[0]||"name"===a?void("name"===a&&(g.name=c.name)):void(g[a.replace(/[A-Z]/g,"-$&").toLowerCase()]=a)})):g=e.extend(g,b),c.responseMap=g,f=a.inherits(d,c),f._name=g.name,i.push(f),f},b.unRegister=d.unRegister=function(a){if(a&&"anonymous"!==a)for(var b=i.length;b--;)i[b]._name===a&&i.splice(b,1)},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({name:"dnd",init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return this.dnd=e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}},destroy:function(){this.dnd&&this.dnd.destroy()}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({name:"paste",init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return this.paste=e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}},destroy:function(){this.paste&&this.paste.destroy()}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,this.size=c.size||0,this.type=!c.type&&this.ext&&~"jpg,jpeg,png,gif,bmp".indexOf(this.ext)?"image/"+("jpg"===this.ext?"jpeg":this.ext):c.type||"application/octet-stream",b.call(d,"Blob"),this.uid=c.uid||this.uid,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&c.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(c.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString(),b.apply(this,arguments)}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var c=this,e=c.options,g=e.button;g.addClass("webuploader-pick"),c.on("all",function(a){var b;switch(a){case"mouseenter":g.addClass("webuploader-pick-hover");break;case"mouseleave":g.removeClass("webuploader-pick-hover");break;case"change":b=c.exec("getFiles"),c.trigger("select",f.map(b,function(a){return a=new d(c.getRuid(),a),a._refer=e.container,a}),e.container)}}),c.connectRuntime(e,function(){c.refresh(),c.exec("init",e),c.trigger("ready")}),this._resizeHandler=b.bindFn(this.refresh,this),f(a).on("resize",this._resizeHandler)},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){var b=this.options.button;f(a).off("resize",this._resizeHandler),b.removeClass("webuploader-pick-disable webuploader-pick-hover webuploader-pick")}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({name:"picker",init:function(a){return this.pickers=[],a.pick&&this.addBtn(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addBtn:function(b){var e=this,f=e.options,g=f.accept,h=[];if(b)return d.isPlainObject(b)||(b={id:b}),d(b.id).each(function(){var i,j,k;k=a.Deferred(),i=d.extend({},b,{accept:d.isPlainObject(g)?[g]:g,swf:f.swf,runtimeOrder:f.runtimeOrder,id:this}),j=new c(i),j.once("ready",k.resolve),j.on("select",function(a){e.owner.request("add-file",[a])}),j.init(),e.pickers.push(j),h.push(k.promise())}),a.when.apply(a,h)},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})},destroy:function(){d.each(this.pickers,function(){this.destroy()}),this.pickers=null}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!1,allowMagnify:!1},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},crop:function(){var b=a.slice(arguments);return this.exec.apply(this,["crop"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({name:"image",makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),1>=f&&f>0&&(f=a._info.width*f),1>=g&&g>0&&(g=a._info.height*g),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(a){b(a||!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},beforeSendFile:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||0,i=g&&g.noCompressIfLarger||!1;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){var a=g.width,c=g.height;b._info=b._info||d.info(),b._meta=b._meta||d.meta(),1>=a&&a>0&&(a=b._info.width*a),1>=c&&c>0&&(c=b._info.height*c),d.resize(a,c)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,(!i||a.size<c)&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application/octet-stream",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destroy:function(){this.off(),delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0,numofDeleted:0,numofInterrupt:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},removeFile:function(a){var b=this._map[a.id];b&&(delete this._map[a.id],a.destroy(),this.stats.numofDeleted++)},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)}))},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--;break;case f.INTERRUPT:c.numofInterrupt--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++;break;case f.INTERRUPT:c.numofInterrupt++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({name:"queue",init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),this.placeholder=l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||!a.size||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFile:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&setTimeout(function(){b.request("start-upload")},20)},getStats:function(){return this.stats},removeFile:function(a,b){var c=this;a=a.id?a:c.queue.getFile(a),this.request("cancel-file",a),b&&this.queue.removeFile(a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.owner.trigger("reset"),this.queue=new c,this.stats=this.queue.stats},destroy:function(){this.reset(),this.placeholder&&this.placeholder.destroy()}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({name:"runtime",init:function(){if(!this.predictRuntimeType())throw Error("Runtime Error")},predictRuntimeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){var c,d,e=[],f=a.source,g=f.size,h=b?Math.ceil(g/b):1,i=0,j=0;for(d={file:a,has:function(){return!!e.length},shift:function(){return e.shift()},unshift:function(a){e.unshift(a)}};h>j;)c=Math.min(b,g-i),e.push({file:a,start:i,end:b?i+c:g,total:g,chunks:h,chunk:j++,cuted:d}),i+=c;return a.blocks=e.concat(),a.remaning=e.length,d}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:{}}),b.register({name:"upload",init:function(){var b=this.owner,c=this;this.runing=!1,this.progress=!1,b.on("startUpload",function(){c.progress=!0}).on("uploadFinished",function(){c.progress=!1}),this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},reset:function(){this.request("stop-upload",!0),this.runing=!1,this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this._trigged=!1,this._promise=null},startUpload:function(b){var c=this;if(f.each(c.request("get-files",h.INVALID),function(){c.request("remove-file",this)}),b)if(b=b.id?b:c.request("get-file",b),b.getStatus()===h.INTERRUPT)f.each(c.pool,function(a,c){c.file===b&&c.transport&&c.transport.send()}),b.setStatus(h.QUEUED);else{if(b.getStatus()===h.PROGRESS)return;b.setStatus(h.QUEUED)}else f.each(c.request("get-files",[h.INITED]),function(){this.setStatus(h.QUEUED)});if(!c.runing){c.runing=!0;var d=[];f.each(c.pool,function(a,b){var e=b.file;e.getStatus()===h.INTERRUPT&&(d.push(e),c._trigged=!1,b.transport&&b.transport.send())});for(var b;b=d.shift();)b.setStatus(h.PROGRESS);b||f.each(c.request("get-files",h.INTERRUPT),function(){this.setStatus(h.PROGRESS)}),c._trigged=!1,a.nextTick(c.__tick),c.owner.trigger("startUpload")}},stopUpload:function(b,c){var d=this;if(b===!0&&(c=b,b=null),d.runing!==!1){if(b){if(b=b.id?b:d.request("get-file",b),b.getStatus()!==h.PROGRESS&&b.getStatus()!==h.QUEUED)return;return b.setStatus(h.INTERRUPT),f.each(d.pool,function(a,c){c.file===b&&(c.transport&&c.transport.abort(),d._putback(c),d._popBlock(c))}),a.nextTick(d.__tick)}d.runing=!1,this._promise&&this._promise.file&&this._promise.file.setStatus(h.INTERRUPT),c&&f.each(d.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),d.owner.trigger("stopUpload")}},cancelFile:function(a){a=a.id?a:this.request("get-file",a),a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),a.setStatus(h.CANCELLED),this.owner.trigger("fileDequeued",a)},isInProgress:function(){return!!this.progress},_getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=a.id?a:this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d._getStats().numOfQueue||d._getStats().numofInterrupt||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_putback:function(a){var b;a.cuted.unshift(a),b=this.stack.indexOf(a.cuted),~b||this.stack.unshift(a.cuted)},_getStack:function(){for(var a,b=0;a=this.stack[b++];){if(a.has()&&a.file.getStatus()===h.PROGRESS)return a;(!a.has()||a.file.getStatus()!==h.PROGRESS&&a.file.getStatus()!==h.INTERRUPT)&&this.stack.splice(--b,1)}return null},_nextBlock:function(){var a,b,c,d,f=this,h=f.options;return(a=this._getStack())?(h.prepareNextFile&&!f.pending.length&&f._prepareNextFile(),a.shift()):f.runing?(!f.pending.length&&f._getStats().numOfQueue&&f._prepareNextFile(),b=f.pending.shift(),c=function(b){return b?(a=e(b,h.chunked?h.chunkSize:0),f.stack.push(a),a.shift()):null},g(b)?(d=b.file,b=b[b.pipe?"pipe":"then"](c),b.file=d,b):c(b)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.PROGRESS||c.getStatus()===h.INTERRUPT?c:b._finishFile(c)}),b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),a.file=c,a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;return e.getStatus()!==h.PROGRESS?void(e.getStatus()===h.INTERRUPT&&d._putback(b)):(d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),void c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d.updateFileProgress(e),d._popBlock(b),a.nextTick(d.__tick))}))},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){b.percentage=a,g.updateFileProgress(k)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)
+}).always(function(){d.trigger("uploadComplete",a)})},updateFileProgress:function(a){var b=0,c=0;a.blocks&&(f.each(a.blocks,function(a,b){c+=(b.percentage||0)*(b.end-b.start)}),b=c/a.size,this.owner.trigger("uploadProgress",a,b||0))}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({name:"validator",init:function(){var b=this;a.nextTick(function(){e.each(f,function(){this.call(b.owner)})})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileNumLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("reset",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileSizeLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("reset",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",d,a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}),b.on("reset",function(){d={}}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destroy;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destroy=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b,f,g=this,h=g.getRuid(),i=g.elem.parent().get(0);if(i&&!d.contains(i,a.currentTarget))return!1;a=a.originalEvent||a,b=a.dataTransfer;try{f=b.getData("text/html")}catch(j){}return f?void 0:(g._getTansferFiles(b,function(a){g.trigger("drop",d.map(a,function(a){return new c(h,a)}))}),g.dndOver=!1,g.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k=[],l=[];for(d=b.items,e=b.files,j=!(!d||!d[0].webkitGetAsEntry),h=0,i=e.length;i>h;h++)f=e[h],g=d&&d[h],j&&g.webkitGetAsEntry().isDirectory?l.push(this._traverseDirectoryTree(g.webkitGetAsEntry(),k)):k.push(f);a.when.apply(a,l).done(function(){k.length&&c(k)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a&&(a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragOverHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler)))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=this.label=c(document.createElement("label")),k=this.input=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),b.value=null,this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){this.input.off(),this.label.off()}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;e<b.length;e++)c[e]=b.charCodeAt(e);return f=g[0].split(":")[1].split(";")[0],this.arrayBufferToBlob(d,f)},dataURL2ArrayBuffer:function(a){var b,c,d,e;for(e=a.split(","),b=~e[0].indexOf("base64")?atob(e[1]):decodeURIComponent(e[1]),c=new Uint8Array(b.length),d=0;d<b.length;d++)c[d]=b.charCodeAt(d);return c.buffer},arrayBufferToBlob:function(b,c){var d,e=a.BlobBuilder||a.WebKitBlobBuilder;return e?(d=new e,d.append(b),d.getBlob(c)):new Blob([b],c?{type:c}:{})},canvasToDataUrl:function(a,b,c){return a.toDataURL(b,c/100)},parseMeta:function(a,b){b(!1,{})},updateImageHead:function(a){return a}}}),b("runtime/html5/imagemeta",["runtime/html5/util"],function(a){var b;return b={parsers:{65505:[]},maxMetaDataSize:262144,parse:function(a,b){var c=this,d=new FileReader;d.onload=function(){b(!1,c._parse(this.result)),d=d.onload=d.onerror=null},d.onerror=function(a){b(a.message),d=d.onload=d.onerror=null},a=a.slice(0,c.maxMetaDataSize),d.readAsArrayBuffer(a.getSource())},_parse:function(a,c){if(!(a.byteLength<6)){var d,e,f,g,h=new DataView(a),i=2,j=h.byteLength-4,k=i,l={};if(65496===h.getUint16(0)){for(;j>i&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g<f.length;g+=1)f[g].call(b,h,i,e,l);i+=e,k=i}k>6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;l<k.length&&(n=k[l],"\x00"!==n);l+=1)m+=n;return m}return k},c.parseExifTag=function(a,b,d,e,f){var g=a.getUint16(d,e);f.exif[g]=c.getExifValue(a,b,d,a.getUint16(d+2,e),a.getUint32(d+4,e),e)},c.parseExifTags=function(b,c,d,e,f){var g,h,i;if(d+6>b.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete","resize")},crop:function(a,b,c,d,e){var f=this._canvas||(this._canvas=document.createElement("canvas")),g=this.options,h=this._img,i=h.naturalWidth,j=h.naturalHeight,k=this.getOrientation();e=e||1,f.width=c,f.height=d,g.preserveHeaders||this._rotate2Orientaion(f,k),this._renderImageToCanvas(f,h,-a,-b,i*e,j*e),this._blob=null,this.modified=!0,this.owner.trigger("complete","crop")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,a,e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(b){var c=a.slice(arguments,1),d=b.getContext("2d");d.drawImage.apply(d,c)}}()})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType&&h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("preset/html5only",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/image","runtime/html5/transport"],function(a){return a}),b("webuploader",["preset/html5only"],function(a){return a}),c("webuploader")});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.js
new file mode 100644
index 0000000..c805c9a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.js
@@ -0,0 +1,8106 @@
+/*! WebUploader 0.1.5 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+
+            return obj;
+        },
+
+        makeExport = function( dollar ) {
+            root.__dollar = dollar;
+
+            // exports every module.
+            return exportsTo( factory( root, _define, _require ) );
+        },
+
+        origin;
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = makeExport();
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([ 'jquery' ], makeExport );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = makeExport();
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( window, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        var $ = window.__dollar || window.jQuery || window.Zepto;
+
+        if ( !$ ) {
+            throw new Error('jQuery or Zepto not found!');
+        }
+
+        return $;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id为该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档中对类的使用可能省略掉了`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+
+        var noop = function() {},
+            call = Function.call;
+
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+
+        function createObject( proto ) {
+            var f;
+
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+
+
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.5',
+
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+
+            Deferred: promise.Deferred,
+
+            isPromise: promise.isPromise,
+
+            when: promise.when,
+
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match( /(?:trident)(?:.*rv:([\w.]+))?/i ),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+
+                /* jshint camelcase: false */
+
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+
+                return child;
+            },
+
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数noop](#WebUploader:Base.noop)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+
+            nextTick: (function() {
+
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+
+            while ( ++i < len ) {
+                handler = events[ i ];
+
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+
+            return !stoped;
+        }
+
+        protos = {
+
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+
+                if ( !callback ) {
+                    return this;
+                }
+
+                set = this._events || (this._events = []);
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+
+                    set.push( handler );
+                });
+
+                return this;
+            },
+
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+
+                if ( !callback ) {
+                    return me;
+                }
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+
+                return me;
+            },
+
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+
+                if ( !events ) {
+                    return this;
+                }
+
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+
+                return this;
+            },
+
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+
+                if ( !this._events || !type ) {
+                    return this;
+                }
+
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$;
+
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            cancelFile: 'cancel-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            md5File: 'md5-file',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            predictRuntimeType: 'predict-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+
+            _init: function( opts ) {
+                var me = this;
+
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     compress: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.option( 'compress', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+
+                // setter
+                if ( arguments.length > 1 ) {
+
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `progressNum` 上传中的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `queueNum` 还在队列中的文件数
+             * * `interruptNum` 被暂停的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+
+                return stats ? {
+                    successNum: stats.numOfSuccess,
+                    progressNum: stats.numOfProgress,
+
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue,
+                    interruptNum: stats.numofInterrupt
+                } : {};
+            },
+
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+
+                    return false;
+                }
+
+                return true;
+            },
+
+            /**
+             * 销毁 webuploader 实例
+             * @method destroy
+             * @grammar destroy() => undefined
+             */
+            destroy: function() {
+                this.request( 'destroy', arguments );
+                this.off();
+            },
+
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            factories = {},
+
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+
+        $.extend( Runtime.prototype, {
+
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+
+                if ( this._container ) {
+                    return this._container;
+                }
+
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                this._parent = parent;
+                return container;
+            },
+
+            init: Base.noop,
+            exec: Base.noop,
+
+            destroy: function() {
+                this._container && this._container.remove();
+                this._parent && this._parent.removeClass('webuploader-container');
+                this.off();
+            }
+        });
+
+        Runtime.orders = 'html5,flash';
+
+
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+
+            type = type || getFirstKey( factories );
+
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+
+        var cache;
+
+        cache = (function() {
+            var obj = {};
+
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+
+                get: function( ruid, standalone ) {
+                    var i;
+
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+
+                        return obj[ i ];
+                    }
+
+                    return null;
+                },
+
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+
+            this.uid = Base.guid('client_');
+
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+
+            this.connectRuntime = function( opts, cb ) {
+
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+
+                deferred.done( cb );
+
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                runtime.__client--;
+
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+
+                runtime = null;
+            };
+
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+
+                return runtime.exec.apply( this, args );
+            };
+
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+
+            opts.container = $( opts.container );
+
+            if ( !opts.container.length ) {
+                return;
+            }
+
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( DragAndDrop.prototype );
+
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            _destroy = Uploader.prototype.destroy,
+            IGNORE = {},
+            widgetClass = [];
+
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+
+            var length = obj.length,
+                type = $.type( obj );
+
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+
+        $.extend( Widget.prototype, {
+
+            init: Base.noop,
+
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+
+                    return IGNORE;
+                }
+
+                return this[ map[ apiName ] ].apply( this, args );
+
+            },
+
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+
+            /**
+             * @property {String | Array} [disableWidgets=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 默认所有 Uploader.register 了的 widget 都会被加载,如果禁用某一部分,请通过此 option 指定黑名单。
+             */
+
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [],
+                    deactives = me.options.disableWidgets || '';
+
+                $.each( widgetClass, function( _, klass ) {
+                    (!deactives || !~deactives.indexOf( klass._name )) &&
+                        widgets.push( new klass( me ) );
+                });
+
+                return _init.apply( me, arguments );
+            },
+
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets && widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+
+                args = isArrayLike( args ) ? args : [ args ];
+
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+
+                    if ( rlt !== IGNORE ) {
+
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个 tick 中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+
+                                if ( args.length === 1 ) {
+                                    args = args[ 0 ];
+                                }
+
+                                setTimeout(function() {
+                                    deferred.resolve( args );
+                                }, 1 );
+
+                                return deferred.promise();
+                            })[ callback ? key : 'done' ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            },
+
+            destroy: function() {
+                _destroy.apply( this, arguments );
+                this._widgets = null;
+            }
+        });
+
+        /**
+         * 添加组件
+         * @grammar Uploader.register(proto);
+         * @grammar Uploader.register(map, proto);
+         * @param  {object} responseMap API 名称与函数实现的映射
+         * @param  {object} proto 组件原型,构造函数通过 constructor 属性定义
+         * @method Uploader.register
+         * @for Uploader
+         * @example
+         * Uploader.register({
+         *     'make-thumb': 'makeThumb'
+         * }, {
+         *     init: function( options ) {},
+         *     makeThumb: function() {}
+         * });
+         *
+         * Uploader.register({
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init', destroy: 'destroy', name: 'anonymous' },
+                klass;
+
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+
+                // 自动生成 map 表。
+                $.each(widgetProto, function(key) {
+                    if ( key[0] === '_' || key === 'name' ) {
+                        key === 'name' && (map.name = widgetProto.name);
+                        return;
+                    }
+
+                    map[key.replace(/[A-Z]/g, '-$&').toLowerCase()] = key;
+                });
+
+            } else {
+                map = $.extend( map, responseMap );
+            }
+
+            widgetProto.responseMap = map;
+            klass = Base.inherits( Widget, widgetProto );
+            klass._name = map.name;
+            widgetClass.push( klass );
+
+            return klass;
+        };
+
+        /**
+         * 删除插件,只有在注册时指定了名字的才能被删除。
+         * @grammar Uploader.unRegister(name);
+         * @param  {string} name 组件名字
+         * @method Uploader.unRegister
+         * @for Uploader
+         * @example
+         *
+         * Uploader.register({
+         *     name: 'custom',
+         *
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         *
+         * Uploader.unRegister('custom');
+         */
+        Uploader.unRegister = Widget.unRegister = function( name ) {
+            if ( !name || name === 'anonymous' ) {
+                return;
+            }
+
+            // 删除指定的插件。
+            for ( var i = widgetClass.length; i--; ) {
+                if ( widgetClass[i]._name === name ) {
+                    widgetClass.splice(i, 1)
+                }
+            }
+        };
+
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+
+        Uploader.options.dnd = '';
+
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @property {Selector} [disableGlobalDnd=false]  是否禁掉整个页面的拖拽功能,如果不禁用,图片拖进来的时候会默认被浏览器打开。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            name: 'dnd',
+
+            init: function( opts ) {
+
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+
+                this.dnd = dnd = new Dnd( options );
+
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+
+                dnd.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.dnd && this.dnd.destroy();
+            }
+        });
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( FilePaste.prototype );
+
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            name: 'paste',
+
+            init: function( opts ) {
+
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+
+                this.paste = paste = new FilePaste( options );
+
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.paste && this.paste.destroy();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+
+        function Blob( ruid, source ) {
+            var me = this;
+
+            me.source = source;
+            me.ruid = ruid;
+            this.size = source.size || 0;
+
+            // 如果没有指定 mimetype, 但是知道文件后缀。
+            if ( !source.type && this.ext &&
+                    ~'jpg,jpeg,png,gif,bmp'.indexOf( this.ext ) ) {
+                this.type = 'image/' + (this.ext === 'jpg' ? 'jpeg' : this.ext);
+            } else {
+                this.type = source.type || 'application/octet-stream';
+            }
+
+            RuntimeClient.call( me, 'Blob' );
+            this.uid = source.uid || this.uid;
+
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+
+            getSource: function() {
+                return this.source;
+            }
+        });
+
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+
+        function File( ruid, file ) {
+            var ext;
+
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+
+            // todo 支持其他类型文件的转换。
+            // 如果有 mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && file.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( file.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+
+            Blob.apply( this, arguments );
+        }
+
+        return Base.inherits( Blob, File );
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+
+        var $ = Base.$;
+
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+
+            opts.container = $( opts.id );
+
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+
+                button.addClass('webuploader-pick');
+
+                me.on( 'all', function( type ) {
+                    var files;
+
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+
+                this._resizeHandler = Base.bindFn( this.refresh, this );
+                $( window ).on( 'resize', this._resizeHandler );
+            },
+
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+
+                    pos = button.offset();
+
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+
+            enable: function() {
+                var btn = this.options.button;
+
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+
+            disable: function() {
+                var btn = this.options.button;
+
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+
+                btn.addClass('webuploader-pick-disable');
+            },
+
+            destroy: function() {
+                var btn = this.options.button;
+                $( window ).off( 'resize', this._resizeHandler );
+                btn.removeClass('webuploader-pick-disable webuploader-pick-hover ' +
+                    'webuploader-pick');
+            }
+        });
+
+        return FilePicker;
+    });
+
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor|dom} 指定选择文件的按钮容器,不指定则不创建按钮。**注意** 这里虽然写的是 id, 但是不是只支持 id, 还支持 class, 或者 dom 节点。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+
+        return Uploader.register({
+            name: 'picker',
+
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addBtn( opts.pick );
+            },
+
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addBtn: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    promises = [];
+
+                if ( !pick ) {
+                    return;
+                }
+
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+
+                $( pick.id ).each(function() {
+                    var options, picker, deferred;
+
+                    deferred = Base.Deferred();
+
+                    options = $.extend({}, pick, {
+                        accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                        swf: opts.swf,
+                        runtimeOrder: opts.runtimeOrder,
+                        id: this
+                    });
+
+                    picker = new FilePicker( options );
+
+                    picker.once( 'ready', deferred.resolve );
+                    picker.on( 'select', function( files ) {
+                        me.owner.request( 'add-file', [ files ]);
+                    });
+                    picker.init();
+
+                    me.pickers.push( picker );
+
+                    promises.push( deferred.promise() );
+                });
+
+                return Base.when.apply( Base, promises );
+            },
+
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            },
+
+            destroy: function() {
+                $.each( this.pickers, function() {
+                    this.destroy();
+                });
+                this.pickers = null;
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+
+        // 默认选项。
+        Image.options = {
+
+            // 默认的图片处理质量
+            quality: 90,
+
+            // 是否裁剪
+            crop: false,
+
+            // 是否保留头部信息
+            preserveHeaders: false,
+
+            // 是否允许放大。
+            allowMagnify: false
+        };
+
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+
+            info: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+
+                // getter
+                return this._info;
+            },
+
+            meta: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+
+                // getter
+                return this._meta;
+            },
+
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+
+            crop: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'crop' ].concat( args ) );
+            },
+
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+
+        var $ = Base.$,
+            throttle;
+
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true,
+             *
+             *     // 如果发现压缩后文件大小比原来还大,则使用原来图片
+             *     // 此属性可能会影响图片自动纠正功能
+             *     noCompressIfLarger: false,
+             *
+             *     // 单位字节,如果图片大小小于此值,不会采用压缩。
+             *     compressSize: 0
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+
+        return Uploader.register({
+
+            name: 'image',
+
+
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * 当 width 或者 height 的值介于 0 - 1 时,被当成百分比使用。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             * 也可以借助服务端,将 base64 数据传给服务端,生成一个临时文件供预览。
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+
+                file = this.request( 'get-file', file );
+
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+
+                opts = $.extend({}, this.options.thumb );
+
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+
+                width = width || opts.width;
+                height = height || opts.height;
+
+                image = new Image( opts );
+
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                // 当 resize 完后
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+
+                image.once( 'error', function( reason ) {
+                    cb( reason || true );
+                    image.destroy();
+                });
+
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+
+            beforeSendFile: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 0,
+                    noCompressIfLarger = opts && opts.noCompressIfLarger || false,
+                    image, deferred;
+
+                file = this.request( 'get-file', file );
+
+                // 只压缩 jpeg 图片格式。
+                // gif 可能会丢失针
+                // bmp png 基本上尺寸都不大,且压缩比比较小。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+
+                image = new Image( opts );
+
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    var width = opts.width,
+                        height = opts.height;
+
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                image.once( 'complete', function() {
+                    var blob, size;
+
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+
+                        size = file.size;
+
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( !noCompressIfLarger || blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+
+                            file.trigger( 'resize', blob.size, size );
+                        }
+
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application/octet-stream'
+             */
+            this.type = source.type || 'application/octet-stream';
+
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+
+
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+
+            this.source = source;
+            this.loaded = 0;
+
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+
+        $.extend( WUFile.prototype, {
+
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+
+                var prevStatus = statusMap[ this.id ];
+
+                typeof text !== 'undefined' && (this.statusText = text);
+
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+
+            },
+
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+
+            destroy: function() {
+                this.off();
+                delete statusMap[ this.id ];
+            }
+        });
+
+        Mediator.installTo( WUFile.prototype );
+
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+
+        return WUFile;
+    });
+
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被取消的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * * `numofDeleted` 被移除的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0,
+                numofDeleted: 0,
+                numofInterrupt: 0
+            };
+
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+
+            // 存储所有文件
+            this._map = {};
+        }
+
+        $.extend( Queue.prototype, {
+
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+
+                status = status || STATUS.QUEUED;
+
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+
+                return null;
+            },
+
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+
+                    ret.push( file );
+                }
+
+                return ret;
+            },
+
+            /**
+             * 在队列中删除文件。
+             * @grammar removeFile( file ) => Array
+             * @method removeFile
+             * @param {File} 文件对象。
+             */
+            removeFile: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( existing ) {
+                    delete this._map[ file.id ];
+                    file.destroy();
+                    this.stats.numofDeleted++;
+                }
+            },
+
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+            },
+
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt--;
+                        break;
+                }
+
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt++;
+                        break;
+                }
+            }
+
+        });
+
+        Mediator.installTo( Queue.prototype );
+
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+
+        return Uploader.register({
+            name: 'queue',
+
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+
+                    me.accept = new RegExp( accept, 'i' );
+                }
+
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                this.placeholder = runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+
+
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+
+                    file = new WUFile( file );
+                }
+
+                return file;
+            },
+
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || !file.size || this.accept &&
+
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+
+                return !invalid;
+            },
+
+
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+
+            _addFile: function( file ) {
+                var me = this;
+
+                file = me._wrapFile( file );
+
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @property {Boolean} [auto=false]
+             * @namespace options
+             * @for Uploader
+             * @description 设置为 true 后,不需要手动调用上传,有文件选择即开始上传。
+             *
+             */
+
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFile: function( files ) {
+                var me = this;
+
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+
+                me.owner.trigger( 'filesQueued', files );
+
+                if ( me.options.auto ) {
+                    setTimeout(function() {
+                        me.request('start-upload');
+                    }, 20 );
+                }
+            },
+
+            getStats: function() {
+                return this.stats;
+            },
+
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+
+             /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @grammar removeFile( file, true ) => undefined
+             * @grammar removeFile( id, true ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件, 默认只会标记文件状态为已取消,如果第二个参数为 `true` 则会从 queue 中移除。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file, remove ) {
+                var me = this;
+
+                file = file.id ? file : me.queue.getFile( file );
+
+                this.request( 'cancel-file', file );
+
+                if ( remove ) {
+                    this.queue.removeFile( file );
+                }
+            },
+
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+
+                me.request('start-upload');
+            },
+
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+
+            /**
+             * @event reset
+             * @description 当 uploader 被重置的时候触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.owner.trigger('reset');
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            },
+
+            destroy: function() {
+                this.reset();
+                this.placeholder && this.placeholder.destroy();
+            }
+        });
+
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+
+        /**
+         * @property {Object} [runtimeOrder=html5,flash]
+         * @namespace options
+         * @for Uploader
+         * @description 指定运行时启动顺序。默认会想尝试 html5 是否支持,如果支持则使用 html5, 否则则使用 flash.
+         *
+         * 可以将此值设置成 `flash`,来强制使用 flash 运行时。
+         */
+
+        return Uploader.register({
+            name: 'runtime',
+
+            init: function() {
+                if ( !this.predictRuntimeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntimeType() => String
+             * @method predictRuntimeType
+             * @for  Uploader
+             */
+            predictRuntimeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+
+        var $ = Base.$;
+
+        function Transport( opts ) {
+            var me = this;
+
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+
+        Transport.options = {
+            server: '',
+            method: 'POST',
+
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+
+        $.extend( Transport.prototype, {
+
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+
+                if ( !duration ) {
+                    return;
+                }
+
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+
+        });
+
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+
+
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+
+
+            /**
+             * @property {Object} [formData={}]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: {}
+
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len, api;
+
+            api = {
+                file: file,
+
+                has: function() {
+                    return !!pending.length;
+                },
+
+                shift: function() {
+                    return pending.shift();
+                },
+
+                unshift: function( block ) {
+                    pending.unshift( block );
+                }
+            };
+
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++,
+                    cuted: api
+                });
+                start += len;
+            }
+
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+
+            return api;
+        }
+
+        Uploader.register({
+            name: 'upload',
+
+            init: function() {
+                var owner = this.owner,
+                    me = this;
+
+                this.runing = false;
+                this.progress = false;
+
+                owner
+                    .on( 'startUpload', function() {
+                        me.progress = true;
+                    })
+                    .on( 'uploadFinished', function() {
+                        me.progress = false;
+                    });
+
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+
+                // 缓存分好片的文件。
+                this.stack = [];
+
+                // 缓存即将上传的文件。
+                this.pending = [];
+
+                // 跟踪还有多少分片在上传中但是没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+
+                owner.on( 'uploadComplete', function( file ) {
+
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+
+            reset: function() {
+                this.request( 'stop-upload', true );
+                this.runing = false;
+                this.pool = [];
+                this.stack = [];
+                this.pending = [];
+                this.remaning = 0;
+                this._trigged = false;
+                this._promise = null;
+            },
+
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             *
+             * 可以指定开始某一个文件。
+             * @grammar upload() => undefined
+             * @grammar upload( file | fileId) => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            startUpload: function(file) {
+                var me = this;
+
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+
+                // 如果指定了开始某个文件,则只开始指定文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        $.each( me.pool, function( _, v ) {
+
+                            // 之前暂停过。
+                            if (v.file !== file) {
+                                return;
+                            }
+
+                            v.transport && v.transport.send();
+                        });
+
+                        file.setStatus( Status.QUEUED );
+                    } else if (file.getStatus() === Status.PROGRESS) {
+                        return;
+                    } else {
+                        file.setStatus( Status.QUEUED );
+                    }
+                } else {
+                    $.each( me.request( 'get-files', [ Status.INITED ] ), function() {
+                        this.setStatus( Status.QUEUED );
+                    });
+                }
+
+                if ( me.runing ) {
+                    return;
+                }
+
+                me.runing = true;
+
+                var files = [];
+
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        files.push(file);
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+
+                var file;
+                while ( (file = files.shift()) ) {
+                    file.setStatus( Status.PROGRESS );
+                }
+
+                file || $.each( me.request( 'get-files',
+                        Status.INTERRUPT ), function() {
+                    this.setStatus( Status.PROGRESS );
+                });
+
+                me._trigged = false;
+                Base.nextTick( me.__tick );
+                me.owner.trigger('startUpload');
+            },
+
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             *
+             * 如果第一个参数是文件,则只暂停指定文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @grammar stop( file ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stopUpload: function( file, interrupt ) {
+                var me = this;
+
+                if (file === true) {
+                    interrupt = file;
+                    file = null;
+                }
+
+                if ( me.runing === false ) {
+                    return;
+                }
+
+                // 如果只是暂停某个文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if ( file.getStatus() !== Status.PROGRESS &&
+                            file.getStatus() !== Status.QUEUED ) {
+                        return;
+                    }
+
+                    file.setStatus( Status.INTERRUPT );
+                    $.each( me.pool, function( _, v ) {
+
+                        // 只 abort 指定的文件。
+                        if (v.file !== file) {
+                            return;
+                        }
+
+                        v.transport && v.transport.abort();
+                        me._putback(v);
+                        me._popBlock(v);
+                    });
+
+                    return Base.nextTick( me.__tick );
+                }
+
+                me.runing = false;
+
+                if (this._promise && this._promise.file) {
+                    this._promise.file.setStatus( Status.INTERRUPT );
+                }
+
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+
+                me.owner.trigger('stopUpload');
+            },
+
+            /**
+             * @method cancelFile
+             * @grammar cancelFile( file ) => undefined
+             * @grammar cancelFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 标记文件状态为已取消, 同时将中断文件传输。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.cancelFile( file );
+             * })
+             */
+            cancelFile: function( file ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                file.setStatus( Status.CANCELLED );
+                this.owner.trigger( 'fileDequeued', file );
+            },
+
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.progress;
+            },
+
+            _getStats: function() {
+                return this.request('get-stats');
+            },
+
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                this.owner.trigger( 'uploadSkip', file );
+            },
+
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+
+                    fn = function( val ) {
+                        me._promise = null;
+
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me._getStats().numOfQueue &&
+                    !me._getStats().numofInterrupt ) {
+                    me.runing = false;
+
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+
+            _putback: function(block) {
+                var idx;
+
+                block.cuted.unshift(block);
+                idx = this.stack.indexOf(block.cuted);
+
+                if (!~idx) {
+                    this.stack.unshift(block.cuted);
+                }
+            },
+
+            _getStack: function() {
+                var i = 0,
+                    act;
+
+                while ( (act = this.stack[ i++ ]) ) {
+                    if ( act.has() && act.file.getStatus() === Status.PROGRESS ) {
+                        return act;
+                    } else if (!act.has() ||
+                            act.file.getStatus() !== Status.PROGRESS &&
+                            act.file.getStatus() !== Status.INTERRUPT ) {
+
+                        // 把已经处理完了的,或者,状态为非 progress(上传中)、
+                        // interupt(暂停中) 的移除。
+                        this.stack.splice( --i, 1 );
+                    }
+                }
+
+                return null;
+            },
+
+            _nextBlock: function() {
+                var me = this,
+                    opts = me.options,
+                    act, next, done, preparing;
+
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( (act = this._getStack()) ) {
+
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+
+                    return act.shift();
+
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me._getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me.stack.push(act);
+                        return act.shift();
+                    };
+
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    if ( isPromise( next) ) {
+                        preparing = next.file;
+                        next = next[ next.pipe ? 'pipe' : 'then' ]( done );
+                        next.file = preparing;
+                        return next;
+                    }
+
+                    return done( next );
+                }
+            },
+
+
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.PROGRESS ||
+                            file.getStatus() === Status.INTERRUPT ) {
+                            return file;
+                        }
+
+                        return me._finishFile( file );
+                    });
+
+                    me.owner.trigger( 'uploadStart', file );
+                    file.setStatus( Status.PROGRESS );
+
+                    promise.file = file;
+
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+
+                    pending.push( promise );
+                }
+            },
+
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+
+                // 有可能在 before-send-file 的 promise 期间改变了文件状态。
+                // 如:暂停,取消
+                // 我们不能中断 promise, 但是可以在 promise 完后,不做上传操作。
+                if ( file.getStatus() !== Status.PROGRESS ) {
+
+                    // 如果是中断,则还需要放回去。
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        me._putback(block);
+                    }
+
+                    return;
+                }
+
+                me.pool.push( block );
+                me.remaning++;
+
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me.updateFileProgress( file );
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+
+
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @param {Object} headers 可以扩展此对象来控制上传头部。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+
+
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+
+                block.transport = tr;
+
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    block.percentage = percentage;
+                    me.updateFileProgress( file );
+                });
+
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+
+                    return reject;
+                };
+
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+
+                        block.retried++;
+                        tr.send();
+
+                    } else {
+
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            },
+
+            updateFileProgress: function(file) {
+                var totalPercent = 0,
+                    uploaded = 0;
+
+                if (!file.blocks) {
+                    return;
+                }
+
+                $.each( file.blocks, function( _, v ) {
+                    uploaded += (v.percentage || 0) * (v.end - v.start);
+                });
+
+                totalPercent = uploaded / file.size;
+                this.owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+            }
+
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+
+        var $ = Base.$,
+            validators = {},
+            api;
+
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * * `Q_TYPE_DENIED` 当文件类型不满足时触发。。
+         * @for  Uploader
+         */
+
+        // 暴露给外面的api
+        api = {
+
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            name: 'validator',
+
+            init: function() {
+                var me = this;
+                Base.nextTick(function() {
+                    $.each( validators, function() {
+                        this.call( me.owner );
+                    });
+                });
+            }
+        });
+
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileNumLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return count >= max ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileSizeLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return invalid ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', max, file );
+                    return false;
+                }
+
+            });
+
+        });
+
+        /**
+         * @property {Boolean} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+
+            if ( opts.duplicate ) {
+                return;
+            }
+
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+
+                return hash;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (mapping[ hash ] = true);
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (delete mapping[ hash ]);
+            });
+
+            uploader.on( 'reset', function() {
+                mapping = {};
+            });
+        });
+
+        return api;
+    });
+
+    /**
+     * @fileOverview Md5
+     */
+    define('lib/md5',[
+        'runtime/client',
+        'mediator'
+    ], function( RuntimeClient, Mediator ) {
+
+        function Md5() {
+            RuntimeClient.call( this, 'Md5' );
+        }
+
+        // 让 Md5 具备事件功能。
+        Mediator.installTo( Md5.prototype );
+
+        Md5.prototype.loadFromBlob = function( blob ) {
+            var me = this;
+
+            if ( me.getRuid() ) {
+                me.disconnectRuntime();
+            }
+
+            // 连接到blob归属的同一个runtime.
+            me.connectRuntime( blob.ruid, function() {
+                me.exec('init');
+                me.exec( 'loadFromBlob', blob );
+            });
+        };
+
+        Md5.prototype.getResult = function() {
+            return this.exec('getResult');
+        };
+
+        return Md5;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/md5',[
+        'base',
+        'uploader',
+        'lib/md5',
+        'lib/blob',
+        'widgets/widget'
+    ], function( Base, Uploader, Md5, Blob ) {
+
+        return Uploader.register({
+            name: 'md5',
+
+
+            /**
+             * 计算文件 md5 值,返回一个 promise 对象,可以监听 progress 进度。
+             *
+             *
+             * @method md5File
+             * @grammar md5File( file[, start[, end]] ) => promise
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.md5File( file )
+             *
+             *         // 及时显示进度
+             *         .progress(function(percentage) {
+             *             console.log('Percentage:', percentage);
+             *         })
+             *
+             *         // 完成
+             *         .then(function(val) {
+             *             console.log('md5 result:', val);
+             *         });
+             *
+             * });
+             */
+            md5File: function( file, start, end ) {
+                var md5 = new Md5(),
+                    deferred = Base.Deferred(),
+                    blob = (file instanceof Blob) ? file :
+                        this.request( 'get-file', file ).source;
+
+                md5.on( 'progress load', function( e ) {
+                    e = e || {};
+                    deferred.notify( e.total ? e.loaded / e.total : 1 );
+                });
+
+                md5.on( 'complete', function() {
+                    deferred.resolve( md5.getResult() );
+                });
+
+                md5.on( 'error', function( reason ) {
+                    deferred.reject( reason );
+                });
+
+                if ( arguments.length > 1 ) {
+                    start = start || 0;
+                    end = end || 0;
+                    start < 0 && (start = blob.size + start);
+                    end < 0 && (end = blob.size + end);
+                    end = Math.min( end, blob.size );
+                    blob = blob.slice( start, end );
+                }
+
+                md5.loadFromBlob( blob );
+
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+
+        function CompBase( owner, runtime ) {
+
+            this.owner = owner;
+            this.options = owner.options;
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var type = 'html5',
+            components = {};
+
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destroy = this.destroy;
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+
+            me.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+        }
+
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+
+        });
+
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+
+                blob = slice.call( blob, start, end );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+
+                e = e.originalEvent || e;
+
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+
+                return false;
+            },
+
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+
+                return false;
+            },
+
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 ),
+                    dataTransfer, data;
+
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                e = e.originalEvent || e;
+                dataTransfer = e.dataTransfer;
+
+                // 如果是页面内拖拽,还不能处理,不阻止事件。
+                // 此处 ie11 下会报参数错误,
+                try {
+                    data = dataTransfer.getData('text/html');
+                } catch( err ) {
+                }
+
+                if ( data ) {
+                    return;
+                }
+
+                me._getTansferFiles( dataTransfer, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( dataTransfer, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, file, item, i, len, canAccessFolder;
+
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+
+                Base.when.apply( Base, promises ).done(function() {
+
+                    if ( !results.length ) {
+                        return;
+                    }
+
+                    callback( results );
+                });
+            },
+
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                var elem = this.elem;
+
+                // 还没 init 就调用 destroy
+                if (!elem) {
+                    return;
+                }
+
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragOverHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+
+                    allowed.push( new File( ruid, blob ) );
+                }
+
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var $ = Base.$;
+
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    label = this.label = $( document.createElement('label') ),
+                    input =  this.input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+
+                label.on( 'click', function() {
+                    input.trigger('click');
+                });
+
+                label.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+
+                    input.attr( 'accept', arr.join(',') );
+                }
+
+                container.append( input );
+                container.append( label );
+
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+
+                    me.files = e.target.files;
+
+                    // reset input
+                    clone = this.cloneNode( true );
+                    clone.value = null;
+                    this.parentNode.replaceChild( clone, this );
+
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+
+                    owner.trigger('change');
+                });
+
+                label.on( 'mouseenter mouseleave', mouseHandler );
+
+            },
+
+
+            getFiles: function() {
+                return this.files;
+            },
+
+            destroy: function() {
+                this.input.off();
+                this.label.off();
+            }
+        });
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/util',[
+        'base'
+    ], function( Base ) {
+
+        var urlAPI = window.createObjectURL && window ||
+                window.URL && URL.revokeObjectURL && URL ||
+                window.webkitURL,
+            createObjectURL = Base.noop,
+            revokeObjectURL = createObjectURL;
+
+        if ( urlAPI ) {
+
+            // 更安全的方式调用,比如android里面就能把context改成其他的对象。
+            createObjectURL = function() {
+                return urlAPI.createObjectURL.apply( urlAPI, arguments );
+            };
+
+            revokeObjectURL = function() {
+                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
+            };
+        }
+
+        return {
+            createObjectURL: createObjectURL,
+            revokeObjectURL: revokeObjectURL,
+
+            dataURL2Blob: function( dataURI ) {
+                var byteStr, intArray, ab, i, mimetype, parts;
+
+                parts = dataURI.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+
+                ab = new ArrayBuffer( byteStr.length );
+                intArray = new Uint8Array( ab );
+
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+
+                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
+
+                return this.arrayBufferToBlob( ab, mimetype );
+            },
+
+            dataURL2ArrayBuffer: function( dataURI ) {
+                var byteStr, intArray, i, parts;
+
+                parts = dataURI.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+
+                intArray = new Uint8Array( byteStr.length );
+
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+
+                return intArray.buffer;
+            },
+
+            arrayBufferToBlob: function( buffer, type ) {
+                var builder = window.BlobBuilder || window.WebKitBlobBuilder,
+                    bb;
+
+                // android不支持直接new Blob, 只能借助blobbuilder.
+                if ( builder ) {
+                    bb = new builder();
+                    bb.append( buffer );
+                    return bb.getBlob( type );
+                }
+
+                return new Blob([ buffer ], type ? { type: type } : {} );
+            },
+
+            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
+            // 你得到的结果是png.
+            canvasToDataUrl: function( canvas, type, quality ) {
+                return canvas.toDataURL( type, quality / 100 );
+            },
+
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            parseMeta: function( blob, callback ) {
+                callback( false, {});
+            },
+
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            updateImageHead: function( data ) {
+                return data;
+            }
+        };
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/imagemeta',[
+        'runtime/html5/util'
+    ], function( Util ) {
+
+        var api;
+
+        api = {
+            parsers: {
+                0xffe1: []
+            },
+
+            maxMetaDataSize: 262144,
+
+            parse: function( blob, cb ) {
+                var me = this,
+                    fr = new FileReader();
+
+                fr.onload = function() {
+                    cb( false, me._parse( this.result ) );
+                    fr = fr.onload = fr.onerror = null;
+                };
+
+                fr.onerror = function( e ) {
+                    cb( e.message );
+                    fr = fr.onload = fr.onerror = null;
+                };
+
+                blob = blob.slice( 0, me.maxMetaDataSize );
+                fr.readAsArrayBuffer( blob.getSource() );
+            },
+
+            _parse: function( buffer, noParse ) {
+                if ( buffer.byteLength < 6 ) {
+                    return;
+                }
+
+                var dataview = new DataView( buffer ),
+                    offset = 2,
+                    maxOffset = dataview.byteLength - 4,
+                    headLength = offset,
+                    ret = {},
+                    markerBytes, markerLength, parsers, i;
+
+                if ( dataview.getUint16( 0 ) === 0xffd8 ) {
+
+                    while ( offset < maxOffset ) {
+                        markerBytes = dataview.getUint16( offset );
+
+                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
+                                markerBytes === 0xfffe ) {
+
+                            markerLength = dataview.getUint16( offset + 2 ) + 2;
+
+                            if ( offset + markerLength > dataview.byteLength ) {
+                                break;
+                            }
+
+                            parsers = api.parsers[ markerBytes ];
+
+                            if ( !noParse && parsers ) {
+                                for ( i = 0; i < parsers.length; i += 1 ) {
+                                    parsers[ i ].call( api, dataview, offset,
+                                            markerLength, ret );
+                                }
+                            }
+
+                            offset += markerLength;
+                            headLength = offset;
+                        } else {
+                            break;
+                        }
+                    }
+
+                    if ( headLength > 6 ) {
+                        if ( buffer.slice ) {
+                            ret.imageHead = buffer.slice( 2, headLength );
+                        } else {
+                            // Workaround for IE10, which does not yet
+                            // support ArrayBuffer.slice:
+                            ret.imageHead = new Uint8Array( buffer )
+                                    .subarray( 2, headLength );
+                        }
+                    }
+                }
+
+                return ret;
+            },
+
+            updateImageHead: function( buffer, head ) {
+                var data = this._parse( buffer, true ),
+                    buf1, buf2, bodyoffset;
+
+
+                bodyoffset = 2;
+                if ( data.imageHead ) {
+                    bodyoffset = 2 + data.imageHead.byteLength;
+                }
+
+                if ( buffer.slice ) {
+                    buf2 = buffer.slice( bodyoffset );
+                } else {
+                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
+                }
+
+                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
+
+                buf1[ 0 ] = 0xFF;
+                buf1[ 1 ] = 0xD8;
+                buf1.set( new Uint8Array( head ), 2 );
+                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
+
+                return buf1.buffer;
+            }
+        };
+
+        Util.parseMeta = function() {
+            return api.parse.apply( api, arguments );
+        };
+
+        Util.updateImageHead = function() {
+            return api.updateImageHead.apply( api, arguments );
+        };
+
+        return api;
+    });
+    /**
+     * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
+     * 暂时项目中只用了orientation.
+     *
+     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
+     * @fileOverview EXIF解析
+     */
+
+    // Sample
+    // ====================================
+    // Make : Apple
+    // Model : iPhone 4S
+    // Orientation : 1
+    // XResolution : 72 [72/1]
+    // YResolution : 72 [72/1]
+    // ResolutionUnit : 2
+    // Software : QuickTime 7.7.1
+    // DateTime : 2013:09:01 22:53:55
+    // ExifIFDPointer : 190
+    // ExposureTime : 0.058823529411764705 [1/17]
+    // FNumber : 2.4 [12/5]
+    // ExposureProgram : Normal program
+    // ISOSpeedRatings : 800
+    // ExifVersion : 0220
+    // DateTimeOriginal : 2013:09:01 22:52:51
+    // DateTimeDigitized : 2013:09:01 22:52:51
+    // ComponentsConfiguration : YCbCr
+    // ShutterSpeedValue : 4.058893515764426
+    // ApertureValue : 2.5260688216892597 [4845/1918]
+    // BrightnessValue : -0.3126686601998395
+    // MeteringMode : Pattern
+    // Flash : Flash did not fire, compulsory flash mode
+    // FocalLength : 4.28 [107/25]
+    // SubjectArea : [4 values]
+    // FlashpixVersion : 0100
+    // ColorSpace : 1
+    // PixelXDimension : 2448
+    // PixelYDimension : 3264
+    // SensingMethod : One-chip color area sensor
+    // ExposureMode : 0
+    // WhiteBalance : Auto white balance
+    // FocalLengthIn35mmFilm : 35
+    // SceneCaptureType : Standard
+    define('runtime/html5/imagemeta/exif',[
+        'base',
+        'runtime/html5/imagemeta'
+    ], function( Base, ImageMeta ) {
+
+        var EXIF = {};
+
+        EXIF.ExifMap = function() {
+            return this;
+        };
+
+        EXIF.ExifMap.prototype.map = {
+            'Orientation': 0x0112
+        };
+
+        EXIF.ExifMap.prototype.get = function( id ) {
+            return this[ id ] || this[ this.map[ id ] ];
+        };
+
+        EXIF.exifTagTypes = {
+            // byte, 8-bit unsigned int:
+            1: {
+                getValue: function( dataView, dataOffset ) {
+                    return dataView.getUint8( dataOffset );
+                },
+                size: 1
+            },
+
+            // ascii, 8-bit byte:
+            2: {
+                getValue: function( dataView, dataOffset ) {
+                    return String.fromCharCode( dataView.getUint8( dataOffset ) );
+                },
+                size: 1,
+                ascii: true
+            },
+
+            // short, 16 bit int:
+            3: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint16( dataOffset, littleEndian );
+                },
+                size: 2
+            },
+
+            // long, 32 bit int:
+            4: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+
+            // rational = two long values,
+            // first is numerator, second is denominator:
+            5: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian ) /
+                        dataView.getUint32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            },
+
+            // slong, 32 bit signed int:
+            9: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+
+            // srational, two slongs, first is numerator, second is denominator:
+            10: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian ) /
+                        dataView.getInt32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            }
+        };
+
+        // undefined, 8-bit byte, value depending on field:
+        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
+
+        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
+                littleEndian ) {
+
+            var tagType = EXIF.exifTagTypes[ type ],
+                tagSize, dataOffset, values, i, str, c;
+
+            if ( !tagType ) {
+                Base.log('Invalid Exif data: Invalid tag type.');
+                return;
+            }
+
+            tagSize = tagType.size * length;
+
+            // Determine if the value is contained in the dataOffset bytes,
+            // or if the value at the dataOffset is a pointer to the actual data:
+            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
+                    littleEndian ) : (offset + 8);
+
+            if ( dataOffset + tagSize > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid data offset.');
+                return;
+            }
+
+            if ( length === 1 ) {
+                return tagType.getValue( dataView, dataOffset, littleEndian );
+            }
+
+            values = [];
+
+            for ( i = 0; i < length; i += 1 ) {
+                values[ i ] = tagType.getValue( dataView,
+                        dataOffset + i * tagType.size, littleEndian );
+            }
+
+            if ( tagType.ascii ) {
+                str = '';
+
+                // Concatenate the chars:
+                for ( i = 0; i < values.length; i += 1 ) {
+                    c = values[ i ];
+
+                    // Ignore the terminating NULL byte(s):
+                    if ( c === '\u0000' ) {
+                        break;
+                    }
+                    str += c;
+                }
+
+                return str;
+            }
+            return values;
+        };
+
+        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
+                data ) {
+
+            var tag = dataView.getUint16( offset, littleEndian );
+            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
+                    dataView.getUint16( offset + 2, littleEndian ),    // tag type
+                    dataView.getUint32( offset + 4, littleEndian ),    // tag length
+                    littleEndian );
+        };
+
+        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
+                littleEndian, data ) {
+
+            var tagsNumber, dirEndOffset, i;
+
+            if ( dirOffset + 6 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory offset.');
+                return;
+            }
+
+            tagsNumber = dataView.getUint16( dirOffset, littleEndian );
+            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
+
+            if ( dirEndOffset + 4 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory size.');
+                return;
+            }
+
+            for ( i = 0; i < tagsNumber; i += 1 ) {
+                this.parseExifTag( dataView, tiffOffset,
+                        dirOffset + 2 + 12 * i,    // tag offset
+                        littleEndian, data );
+            }
+
+            // Return the offset to the next directory:
+            return dataView.getUint32( dirEndOffset, littleEndian );
+        };
+
+        // EXIF.getExifThumbnail = function(dataView, offset, length) {
+        //     var hexData,
+        //         i,
+        //         b;
+        //     if (!length || offset + length > dataView.byteLength) {
+        //         Base.log('Invalid Exif data: Invalid thumbnail data.');
+        //         return;
+        //     }
+        //     hexData = [];
+        //     for (i = 0; i < length; i += 1) {
+        //         b = dataView.getUint8(offset + i);
+        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));
+        //     }
+        //     return 'data:image/jpeg,%' + hexData.join('%');
+        // };
+
+        EXIF.parseExifData = function( dataView, offset, length, data ) {
+
+            var tiffOffset = offset + 10,
+                littleEndian, dirOffset;
+
+            // Check for the ASCII code for "Exif" (0x45786966):
+            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
+                // No Exif data, might be XMP data instead
+                return;
+            }
+            if ( tiffOffset + 8 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid segment size.');
+                return;
+            }
+
+            // Check for the two null bytes:
+            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
+                Base.log('Invalid Exif data: Missing byte alignment offset.');
+                return;
+            }
+
+            // Check the byte alignment:
+            switch ( dataView.getUint16( tiffOffset ) ) {
+                case 0x4949:
+                    littleEndian = true;
+                    break;
+
+                case 0x4D4D:
+                    littleEndian = false;
+                    break;
+
+                default:
+                    Base.log('Invalid Exif data: Invalid byte alignment marker.');
+                    return;
+            }
+
+            // Check for the TIFF tag marker (0x002A):
+            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
+                Base.log('Invalid Exif data: Missing TIFF marker.');
+                return;
+            }
+
+            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
+            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
+            // Create the exif object to store the tags:
+            data.exif = new EXIF.ExifMap();
+            // Parse the tags of the main image directory and retrieve the
+            // offset to the next directory, usually the thumbnail directory:
+            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
+                    tiffOffset + dirOffset, littleEndian, data );
+
+            // 尝试读取缩略图
+            // if ( dirOffset ) {
+            //     thumbnailData = {exif: {}};
+            //     dirOffset = EXIF.parseExifTags(
+            //         dataView,
+            //         tiffOffset,
+            //         tiffOffset + dirOffset,
+            //         littleEndian,
+            //         thumbnailData
+            //     );
+
+            //     // Check for JPEG Thumbnail offset:
+            //     if (thumbnailData.exif[0x0201]) {
+            //         data.exif.Thumbnail = EXIF.getExifThumbnail(
+            //             dataView,
+            //             tiffOffset + thumbnailData.exif[0x0201],
+            //             thumbnailData.exif[0x0202] // Thumbnail data length
+            //         );
+            //     }
+            // }
+        };
+
+        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
+        return EXIF;
+    });
+    /**
+     * 这个方式性能不行,但是可以解决android里面的toDataUrl的bug
+     * android里面toDataUrl('image/jpege')得到的结果却是png.
+     *
+     * 所以这里没辙,只能借助这个工具
+     * @fileOverview jpeg encoder
+     */
+    define('runtime/html5/jpegencoder',[], function( require, exports, module ) {
+
+        /*
+          Copyright (c) 2008, Adobe Systems Incorporated
+          All rights reserved.
+
+          Redistribution and use in source and binary forms, with or without
+          modification, are permitted provided that the following conditions are
+          met:
+
+          * Redistributions of source code must retain the above copyright notice,
+            this list of conditions and the following disclaimer.
+
+          * Redistributions in binary form must reproduce the above copyright
+            notice, this list of conditions and the following disclaimer in the
+            documentation and/or other materials provided with the distribution.
+
+          * Neither the name of Adobe Systems Incorporated nor the names of its
+            contributors may be used to endorse or promote products derived from
+            this software without specific prior written permission.
+
+          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+          IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+          PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+          CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+          EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+          PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+          PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+          NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+          SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+        */
+        /*
+        JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009
+
+        Basic GUI blocking jpeg encoder
+        */
+
+        function JPEGEncoder(quality) {
+          var self = this;
+            var fround = Math.round;
+            var ffloor = Math.floor;
+            var YTable = new Array(64);
+            var UVTable = new Array(64);
+            var fdtbl_Y = new Array(64);
+            var fdtbl_UV = new Array(64);
+            var YDC_HT;
+            var UVDC_HT;
+            var YAC_HT;
+            var UVAC_HT;
+
+            var bitcode = new Array(65535);
+            var category = new Array(65535);
+            var outputfDCTQuant = new Array(64);
+            var DU = new Array(64);
+            var byteout = [];
+            var bytenew = 0;
+            var bytepos = 7;
+
+            var YDU = new Array(64);
+            var UDU = new Array(64);
+            var VDU = new Array(64);
+            var clt = new Array(256);
+            var RGB_YUV_TABLE = new Array(2048);
+            var currentQuality;
+
+            var ZigZag = [
+                     0, 1, 5, 6,14,15,27,28,
+                     2, 4, 7,13,16,26,29,42,
+                     3, 8,12,17,25,30,41,43,
+                     9,11,18,24,31,40,44,53,
+                    10,19,23,32,39,45,52,54,
+                    20,22,33,38,46,51,55,60,
+                    21,34,37,47,50,56,59,61,
+                    35,36,48,49,57,58,62,63
+                ];
+
+            var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
+            var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
+            var std_ac_luminance_values = [
+                    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
+                    0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
+                    0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
+                    0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
+                    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
+                    0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
+                    0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
+                    0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
+                    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
+                    0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
+                    0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
+                    0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
+                    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
+                    0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
+                    0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
+                    0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
+                    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
+                    0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
+                    0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
+                    0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+
+            var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
+            var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
+            var std_ac_chrominance_values = [
+                    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
+                    0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
+                    0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
+                    0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
+                    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
+                    0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
+                    0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
+                    0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
+                    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
+                    0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
+                    0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
+                    0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
+                    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
+                    0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
+                    0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
+                    0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
+                    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
+                    0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
+                    0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
+                    0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+
+            function initQuantTables(sf){
+                    var YQT = [
+                        16, 11, 10, 16, 24, 40, 51, 61,
+                        12, 12, 14, 19, 26, 58, 60, 55,
+                        14, 13, 16, 24, 40, 57, 69, 56,
+                        14, 17, 22, 29, 51, 87, 80, 62,
+                        18, 22, 37, 56, 68,109,103, 77,
+                        24, 35, 55, 64, 81,104,113, 92,
+                        49, 64, 78, 87,103,121,120,101,
+                        72, 92, 95, 98,112,100,103, 99
+                    ];
+
+                    for (var i = 0; i < 64; i++) {
+                        var t = ffloor((YQT[i]*sf+50)/100);
+                        if (t < 1) {
+                            t = 1;
+                        } else if (t > 255) {
+                            t = 255;
+                        }
+                        YTable[ZigZag[i]] = t;
+                    }
+                    var UVQT = [
+                        17, 18, 24, 47, 99, 99, 99, 99,
+                        18, 21, 26, 66, 99, 99, 99, 99,
+                        24, 26, 56, 99, 99, 99, 99, 99,
+                        47, 66, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99
+                    ];
+                    for (var j = 0; j < 64; j++) {
+                        var u = ffloor((UVQT[j]*sf+50)/100);
+                        if (u < 1) {
+                            u = 1;
+                        } else if (u > 255) {
+                            u = 255;
+                        }
+                        UVTable[ZigZag[j]] = u;
+                    }
+                    var aasf = [
+                        1.0, 1.387039845, 1.306562965, 1.175875602,
+                        1.0, 0.785694958, 0.541196100, 0.275899379
+                    ];
+                    var k = 0;
+                    for (var row = 0; row < 8; row++)
+                    {
+                        for (var col = 0; col < 8; col++)
+                        {
+                            fdtbl_Y[k]  = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            k++;
+                        }
+                    }
+                }
+
+                function computeHuffmanTbl(nrcodes, std_table){
+                    var codevalue = 0;
+                    var pos_in_table = 0;
+                    var HT = new Array();
+                    for (var k = 1; k <= 16; k++) {
+                        for (var j = 1; j <= nrcodes[k]; j++) {
+                            HT[std_table[pos_in_table]] = [];
+                            HT[std_table[pos_in_table]][0] = codevalue;
+                            HT[std_table[pos_in_table]][1] = k;
+                            pos_in_table++;
+                            codevalue++;
+                        }
+                        codevalue*=2;
+                    }
+                    return HT;
+                }
+
+                function initHuffmanTbl()
+                {
+                    YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
+                    UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
+                    YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
+                    UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
+                }
+
+                function initCategoryNumber()
+                {
+                    var nrlower = 1;
+                    var nrupper = 2;
+                    for (var cat = 1; cat <= 15; cat++) {
+                        //Positive numbers
+                        for (var nr = nrlower; nr<nrupper; nr++) {
+                            category[32767+nr] = cat;
+                            bitcode[32767+nr] = [];
+                            bitcode[32767+nr][1] = cat;
+                            bitcode[32767+nr][0] = nr;
+                        }
+                        //Negative numbers
+                        for (var nrneg =-(nrupper-1); nrneg<=-nrlower; nrneg++) {
+                            category[32767+nrneg] = cat;
+                            bitcode[32767+nrneg] = [];
+                            bitcode[32767+nrneg][1] = cat;
+                            bitcode[32767+nrneg][0] = nrupper-1+nrneg;
+                        }
+                        nrlower <<= 1;
+                        nrupper <<= 1;
+                    }
+                }
+
+                function initRGBYUVTable() {
+                    for(var i = 0; i < 256;i++) {
+                        RGB_YUV_TABLE[i]            =  19595 * i;
+                        RGB_YUV_TABLE[(i+ 256)>>0]  =  38470 * i;
+                        RGB_YUV_TABLE[(i+ 512)>>0]  =   7471 * i + 0x8000;
+                        RGB_YUV_TABLE[(i+ 768)>>0]  = -11059 * i;
+                        RGB_YUV_TABLE[(i+1024)>>0]  = -21709 * i;
+                        RGB_YUV_TABLE[(i+1280)>>0]  =  32768 * i + 0x807FFF;
+                        RGB_YUV_TABLE[(i+1536)>>0]  = -27439 * i;
+                        RGB_YUV_TABLE[(i+1792)>>0]  = - 5329 * i;
+                    }
+                }
+
+                // IO functions
+                function writeBits(bs)
+                {
+                    var value = bs[0];
+                    var posval = bs[1]-1;
+                    while ( posval >= 0 ) {
+                        if (value & (1 << posval) ) {
+                            bytenew |= (1 << bytepos);
+                        }
+                        posval--;
+                        bytepos--;
+                        if (bytepos < 0) {
+                            if (bytenew == 0xFF) {
+                                writeByte(0xFF);
+                                writeByte(0);
+                            }
+                            else {
+                                writeByte(bytenew);
+                            }
+                            bytepos=7;
+                            bytenew=0;
+                        }
+                    }
+                }
+
+                function writeByte(value)
+                {
+                    byteout.push(clt[value]); // write char directly instead of converting later
+                }
+
+                function writeWord(value)
+                {
+                    writeByte((value>>8)&0xFF);
+                    writeByte((value   )&0xFF);
+                }
+
+                // DCT & quantization core
+                function fDCTQuant(data, fdtbl)
+                {
+                    var d0, d1, d2, d3, d4, d5, d6, d7;
+                    /* Pass 1: process rows. */
+                    var dataOff=0;
+                    var i;
+                    var I8 = 8;
+                    var I64 = 64;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff+1];
+                        d2 = data[dataOff+2];
+                        d3 = data[dataOff+3];
+                        d4 = data[dataOff+4];
+                        d5 = data[dataOff+5];
+                        d6 = data[dataOff+6];
+                        d7 = data[dataOff+7];
+
+                        var tmp0 = d0 + d7;
+                        var tmp7 = d0 - d7;
+                        var tmp1 = d1 + d6;
+                        var tmp6 = d1 - d6;
+                        var tmp2 = d2 + d5;
+                        var tmp5 = d2 - d5;
+                        var tmp3 = d3 + d4;
+                        var tmp4 = d3 - d4;
+
+                        /* Even part */
+                        var tmp10 = tmp0 + tmp3;    /* phase 2 */
+                        var tmp13 = tmp0 - tmp3;
+                        var tmp11 = tmp1 + tmp2;
+                        var tmp12 = tmp1 - tmp2;
+
+                        data[dataOff] = tmp10 + tmp11; /* phase 3 */
+                        data[dataOff+4] = tmp10 - tmp11;
+
+                        var z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */
+                        data[dataOff+2] = tmp13 + z1; /* phase 5 */
+                        data[dataOff+6] = tmp13 - z1;
+
+                        /* Odd part */
+                        tmp10 = tmp4 + tmp5; /* phase 2 */
+                        tmp11 = tmp5 + tmp6;
+                        tmp12 = tmp6 + tmp7;
+
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */
+                        var z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */
+                        var z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */
+                        var z3 = tmp11 * 0.707106781; /* c4 */
+
+                        var z11 = tmp7 + z3;    /* phase 5 */
+                        var z13 = tmp7 - z3;
+
+                        data[dataOff+5] = z13 + z2; /* phase 6 */
+                        data[dataOff+3] = z13 - z2;
+                        data[dataOff+1] = z11 + z4;
+                        data[dataOff+7] = z11 - z4;
+
+                        dataOff += 8; /* advance pointer to next row */
+                    }
+
+                    /* Pass 2: process columns. */
+                    dataOff = 0;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff + 8];
+                        d2 = data[dataOff + 16];
+                        d3 = data[dataOff + 24];
+                        d4 = data[dataOff + 32];
+                        d5 = data[dataOff + 40];
+                        d6 = data[dataOff + 48];
+                        d7 = data[dataOff + 56];
+
+                        var tmp0p2 = d0 + d7;
+                        var tmp7p2 = d0 - d7;
+                        var tmp1p2 = d1 + d6;
+                        var tmp6p2 = d1 - d6;
+                        var tmp2p2 = d2 + d5;
+                        var tmp5p2 = d2 - d5;
+                        var tmp3p2 = d3 + d4;
+                        var tmp4p2 = d3 - d4;
+
+                        /* Even part */
+                        var tmp10p2 = tmp0p2 + tmp3p2;  /* phase 2 */
+                        var tmp13p2 = tmp0p2 - tmp3p2;
+                        var tmp11p2 = tmp1p2 + tmp2p2;
+                        var tmp12p2 = tmp1p2 - tmp2p2;
+
+                        data[dataOff] = tmp10p2 + tmp11p2; /* phase 3 */
+                        data[dataOff+32] = tmp10p2 - tmp11p2;
+
+                        var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781; /* c4 */
+                        data[dataOff+16] = tmp13p2 + z1p2; /* phase 5 */
+                        data[dataOff+48] = tmp13p2 - z1p2;
+
+                        /* Odd part */
+                        tmp10p2 = tmp4p2 + tmp5p2; /* phase 2 */
+                        tmp11p2 = tmp5p2 + tmp6p2;
+                        tmp12p2 = tmp6p2 + tmp7p2;
+
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433; /* c6 */
+                        var z2p2 = 0.541196100 * tmp10p2 + z5p2; /* c2-c6 */
+                        var z4p2 = 1.306562965 * tmp12p2 + z5p2; /* c2+c6 */
+                        var z3p2 = tmp11p2 * 0.707106781; /* c4 */
+
+                        var z11p2 = tmp7p2 + z3p2;  /* phase 5 */
+                        var z13p2 = tmp7p2 - z3p2;
+
+                        data[dataOff+40] = z13p2 + z2p2; /* phase 6 */
+                        data[dataOff+24] = z13p2 - z2p2;
+                        data[dataOff+ 8] = z11p2 + z4p2;
+                        data[dataOff+56] = z11p2 - z4p2;
+
+                        dataOff++; /* advance pointer to next column */
+                    }
+
+                    // Quantize/descale the coefficients
+                    var fDCTQuant;
+                    for (i=0; i<I64; ++i)
+                    {
+                        // Apply the quantization and scaling factor & Round to nearest integer
+                        fDCTQuant = data[i]*fdtbl[i];
+                        outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);
+                        //outputfDCTQuant[i] = fround(fDCTQuant);
+
+                    }
+                    return outputfDCTQuant;
+                }
+
+                function writeAPP0()
+                {
+                    writeWord(0xFFE0); // marker
+                    writeWord(16); // length
+                    writeByte(0x4A); // J
+                    writeByte(0x46); // F
+                    writeByte(0x49); // I
+                    writeByte(0x46); // F
+                    writeByte(0); // = "JFIF",'\0'
+                    writeByte(1); // versionhi
+                    writeByte(1); // versionlo
+                    writeByte(0); // xyunits
+                    writeWord(1); // xdensity
+                    writeWord(1); // ydensity
+                    writeByte(0); // thumbnwidth
+                    writeByte(0); // thumbnheight
+                }
+
+                function writeSOF0(width, height)
+                {
+                    writeWord(0xFFC0); // marker
+                    writeWord(17);   // length, truecolor YUV JPG
+                    writeByte(8);    // precision
+                    writeWord(height);
+                    writeWord(width);
+                    writeByte(3);    // nrofcomponents
+                    writeByte(1);    // IdY
+                    writeByte(0x11); // HVY
+                    writeByte(0);    // QTY
+                    writeByte(2);    // IdU
+                    writeByte(0x11); // HVU
+                    writeByte(1);    // QTU
+                    writeByte(3);    // IdV
+                    writeByte(0x11); // HVV
+                    writeByte(1);    // QTV
+                }
+
+                function writeDQT()
+                {
+                    writeWord(0xFFDB); // marker
+                    writeWord(132);    // length
+                    writeByte(0);
+                    for (var i=0; i<64; i++) {
+                        writeByte(YTable[i]);
+                    }
+                    writeByte(1);
+                    for (var j=0; j<64; j++) {
+                        writeByte(UVTable[j]);
+                    }
+                }
+
+                function writeDHT()
+                {
+                    writeWord(0xFFC4); // marker
+                    writeWord(0x01A2); // length
+
+                    writeByte(0); // HTYDCinfo
+                    for (var i=0; i<16; i++) {
+                        writeByte(std_dc_luminance_nrcodes[i+1]);
+                    }
+                    for (var j=0; j<=11; j++) {
+                        writeByte(std_dc_luminance_values[j]);
+                    }
+
+                    writeByte(0x10); // HTYACinfo
+                    for (var k=0; k<16; k++) {
+                        writeByte(std_ac_luminance_nrcodes[k+1]);
+                    }
+                    for (var l=0; l<=161; l++) {
+                        writeByte(std_ac_luminance_values[l]);
+                    }
+
+                    writeByte(1); // HTUDCinfo
+                    for (var m=0; m<16; m++) {
+                        writeByte(std_dc_chrominance_nrcodes[m+1]);
+                    }
+                    for (var n=0; n<=11; n++) {
+                        writeByte(std_dc_chrominance_values[n]);
+                    }
+
+                    writeByte(0x11); // HTUACinfo
+                    for (var o=0; o<16; o++) {
+                        writeByte(std_ac_chrominance_nrcodes[o+1]);
+                    }
+                    for (var p=0; p<=161; p++) {
+                        writeByte(std_ac_chrominance_values[p]);
+                    }
+                }
+
+                function writeSOS()
+                {
+                    writeWord(0xFFDA); // marker
+                    writeWord(12); // length
+                    writeByte(3); // nrofcomponents
+                    writeByte(1); // IdY
+                    writeByte(0); // HTY
+                    writeByte(2); // IdU
+                    writeByte(0x11); // HTU
+                    writeByte(3); // IdV
+                    writeByte(0x11); // HTV
+                    writeByte(0); // Ss
+                    writeByte(0x3f); // Se
+                    writeByte(0); // Bf
+                }
+
+                function processDU(CDU, fdtbl, DC, HTDC, HTAC){
+                    var EOB = HTAC[0x00];
+                    var M16zeroes = HTAC[0xF0];
+                    var pos;
+                    var I16 = 16;
+                    var I63 = 63;
+                    var I64 = 64;
+                    var DU_DCT = fDCTQuant(CDU, fdtbl);
+                    //ZigZag reorder
+                    for (var j=0;j<I64;++j) {
+                        DU[ZigZag[j]]=DU_DCT[j];
+                    }
+                    var Diff = DU[0] - DC; DC = DU[0];
+                    //Encode DC
+                    if (Diff==0) {
+                        writeBits(HTDC[0]); // Diff might be 0
+                    } else {
+                        pos = 32767+Diff;
+                        writeBits(HTDC[category[pos]]);
+                        writeBits(bitcode[pos]);
+                    }
+                    //Encode ACs
+                    var end0pos = 63; // was const... which is crazy
+                    for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {};
+                    //end0pos = first element in reverse order !=0
+                    if ( end0pos == 0) {
+                        writeBits(EOB);
+                        return DC;
+                    }
+                    var i = 1;
+                    var lng;
+                    while ( i <= end0pos ) {
+                        var startpos = i;
+                        for (; (DU[i]==0) && (i<=end0pos); ++i) {}
+                        var nrzeroes = i-startpos;
+                        if ( nrzeroes >= I16 ) {
+                            lng = nrzeroes>>4;
+                            for (var nrmarker=1; nrmarker <= lng; ++nrmarker)
+                                writeBits(M16zeroes);
+                            nrzeroes = nrzeroes&0xF;
+                        }
+                        pos = 32767+DU[i];
+                        writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
+                        writeBits(bitcode[pos]);
+                        i++;
+                    }
+                    if ( end0pos != I63 ) {
+                        writeBits(EOB);
+                    }
+                    return DC;
+                }
+
+                function initCharLookupTable(){
+                    var sfcc = String.fromCharCode;
+                    for(var i=0; i < 256; i++){ ///// ACHTUNG // 255
+                        clt[i] = sfcc(i);
+                    }
+                }
+
+                this.encode = function(image,quality) // image data object
+                {
+                    // var time_start = new Date().getTime();
+
+                    if(quality) setQuality(quality);
+
+                    // Initialize bit writer
+                    byteout = new Array();
+                    bytenew=0;
+                    bytepos=7;
+
+                    // Add JPEG headers
+                    writeWord(0xFFD8); // SOI
+                    writeAPP0();
+                    writeDQT();
+                    writeSOF0(image.width,image.height);
+                    writeDHT();
+                    writeSOS();
+
+
+                    // Encode 8x8 macroblocks
+                    var DCY=0;
+                    var DCU=0;
+                    var DCV=0;
+
+                    bytenew=0;
+                    bytepos=7;
+
+
+                    this.encode.displayName = "_encode_";
+
+                    var imageData = image.data;
+                    var width = image.width;
+                    var height = image.height;
+
+                    var quadWidth = width*4;
+                    var tripleWidth = width*3;
+
+                    var x, y = 0;
+                    var r, g, b;
+                    var start,p, col,row,pos;
+                    while(y < height){
+                        x = 0;
+                        while(x < quadWidth){
+                        start = quadWidth * y + x;
+                        p = start;
+                        col = -1;
+                        row = 0;
+
+                        for(pos=0; pos < 64; pos++){
+                            row = pos >> 3;// /8
+                            col = ( pos & 7 ) * 4; // %8
+                            p = start + ( row * quadWidth ) + col;
+
+                            if(y+row >= height){ // padding bottom
+                                p-= (quadWidth*(y+1+row-height));
+                            }
+
+                            if(x+col >= quadWidth){ // padding right
+                                p-= ((x+col) - quadWidth +4)
+                            }
+
+                            r = imageData[ p++ ];
+                            g = imageData[ p++ ];
+                            b = imageData[ p++ ];
+
+
+                            /* // calculate YUV values dynamically
+                            YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
+                            UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
+                            VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
+                            */
+
+                            // use lookup table (slightly faster)
+                            YDU[pos] = ((RGB_YUV_TABLE[r]             + RGB_YUV_TABLE[(g +  256)>>0] + RGB_YUV_TABLE[(b +  512)>>0]) >> 16)-128;
+                            UDU[pos] = ((RGB_YUV_TABLE[(r +  768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;
+                            VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;
+
+                        }
+
+                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
+                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
+                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
+                        x+=32;
+                        }
+                        y+=8;
+                    }
+
+
+                    ////////////////////////////////////////////////////////////////
+
+                    // Do the bit alignment of the EOI marker
+                    if ( bytepos >= 0 ) {
+                        var fillbits = [];
+                        fillbits[1] = bytepos+1;
+                        fillbits[0] = (1<<(bytepos+1))-1;
+                        writeBits(fillbits);
+                    }
+
+                    writeWord(0xFFD9); //EOI
+
+                    var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
+
+                    byteout = [];
+
+                    // benchmarking
+                    // var duration = new Date().getTime() - time_start;
+                    // console.log('Encoding time: '+ currentQuality + 'ms');
+                    //
+
+                    return jpegDataUri
+            }
+
+            function setQuality(quality){
+                if (quality <= 0) {
+                    quality = 1;
+                }
+                if (quality > 100) {
+                    quality = 100;
+                }
+
+                if(currentQuality == quality) return // don't recalc if unchanged
+
+                var sf = 0;
+                if (quality < 50) {
+                    sf = Math.floor(5000 / quality);
+                } else {
+                    sf = Math.floor(200 - quality*2);
+                }
+
+                initQuantTables(sf);
+                currentQuality = quality;
+                // console.log('Quality set to: '+quality +'%');
+            }
+
+            function init(){
+                // var time_start = new Date().getTime();
+                if(!quality) quality = 50;
+                // Create tables
+                initCharLookupTable()
+                initHuffmanTbl();
+                initCategoryNumber();
+                initRGBYUVTable();
+
+                setQuality(quality);
+                // var duration = new Date().getTime() - time_start;
+                // console.log('Initialization '+ duration + 'ms');
+            }
+
+            init();
+
+        };
+
+        JPEGEncoder.encode = function( data, quality ) {
+            var encoder = new JPEGEncoder( quality );
+
+            return encoder.encode( data );
+        }
+
+        return JPEGEncoder;
+    });
+    /**
+     * @fileOverview Fix android canvas.toDataUrl bug.
+     */
+    define('runtime/html5/androidpatch',[
+        'runtime/html5/util',
+        'runtime/html5/jpegencoder',
+        'base'
+    ], function( Util, encoder, Base ) {
+        var origin = Util.canvasToDataUrl,
+            supportJpeg;
+
+        Util.canvasToDataUrl = function( canvas, type, quality ) {
+            var ctx, w, h, fragement, parts;
+
+            // 非android手机直接跳过。
+            if ( !Base.os.android ) {
+                return origin.apply( null, arguments );
+            }
+
+            // 检测是否canvas支持jpeg导出,根据数据格式来判断。
+            // JPEG 前两位分别是:255, 216
+            if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {
+                fragement = origin.apply( null, arguments );
+
+                parts = fragement.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    fragement = atob( parts[ 1 ] );
+                } else {
+                    fragement = decodeURIComponent( parts[ 1 ] );
+                }
+
+                fragement = fragement.substring( 0, 2 );
+
+                supportJpeg = fragement.charCodeAt( 0 ) === 255 &&
+                        fragement.charCodeAt( 1 ) === 216;
+            }
+
+            // 只有在android环境下才修复
+            if ( type === 'image/jpeg' && !supportJpeg ) {
+                w = canvas.width;
+                h = canvas.height;
+                ctx = canvas.getContext('2d');
+
+                return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );
+            }
+
+            return origin.apply( null, arguments );
+        };
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('runtime/html5/image',[
+        'base',
+        'runtime/html5/runtime',
+        'runtime/html5/util'
+    ], function( Base, Html5Runtime, Util ) {
+
+        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
+
+        return Html5Runtime.register( 'Image', {
+
+            // flag: 标记是否被修改过。
+            modified: false,
+
+            init: function() {
+                var me = this,
+                    img = new Image();
+
+                img.onload = function() {
+
+                    me._info = {
+                        type: me.type,
+                        width: this.width,
+                        height: this.height
+                    };
+
+                    // 读取meta信息。
+                    if ( !me._metas && 'image/jpeg' === me.type ) {
+                        Util.parseMeta( me._blob, function( error, ret ) {
+                            me._metas = ret;
+                            me.owner.trigger('load');
+                        });
+                    } else {
+                        me.owner.trigger('load');
+                    }
+                };
+
+                img.onerror = function() {
+                    me.owner.trigger('error');
+                };
+
+                me._img = img;
+            },
+
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    img = me._img;
+
+                me._blob = blob;
+                me.type = blob.type;
+                img.src = Util.createObjectURL( blob.getSource() );
+                me.owner.once( 'load', function() {
+                    Util.revokeObjectURL( img.src );
+                });
+            },
+
+            resize: function( width, height ) {
+                var canvas = this._canvas ||
+                        (this._canvas = document.createElement('canvas'));
+
+                this._resize( this._img, canvas, width, height );
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger( 'complete', 'resize' );
+            },
+
+            crop: function( x, y, w, h, s ) {
+                var cvs = this._canvas ||
+                        (this._canvas = document.createElement('canvas')),
+                    opts = this.options,
+                    img = this._img,
+                    iw = img.naturalWidth,
+                    ih = img.naturalHeight,
+                    orientation = this.getOrientation();
+
+                s = s || 1;
+
+                // todo 解决 orientation 的问题。
+                // values that require 90 degree rotation
+                // if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+
+                //     switch ( orientation ) {
+                //         case 6:
+                //             tmp = x;
+                //             x = y;
+                //             y = iw * s - tmp - w;
+                //             console.log(ih * s, tmp, w)
+                //             break;
+                //     }
+
+                //     (w ^= h, h ^= w, w ^= h);
+                // }
+
+                cvs.width = w;
+                cvs.height = h;
+
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+                this._renderImageToCanvas( cvs, img, -x, -y, iw * s, ih * s );
+
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger( 'complete', 'crop' );
+            },
+
+            getAsBlob: function( type ) {
+                var blob = this._blob,
+                    opts = this.options,
+                    canvas;
+
+                type = type || this.type;
+
+                // blob需要重新生成。
+                if ( this.modified || this.type !== type ) {
+                    canvas = this._canvas;
+
+                    if ( type === 'image/jpeg' ) {
+
+                        blob = Util.canvasToDataUrl( canvas, type, opts.quality );
+
+                        if ( opts.preserveHeaders && this._metas &&
+                                this._metas.imageHead ) {
+
+                            blob = Util.dataURL2ArrayBuffer( blob );
+                            blob = Util.updateImageHead( blob,
+                                    this._metas.imageHead );
+                            blob = Util.arrayBufferToBlob( blob, type );
+                            return blob;
+                        }
+                    } else {
+                        blob = Util.canvasToDataUrl( canvas, type );
+                    }
+
+                    blob = Util.dataURL2Blob( blob );
+                }
+
+                return blob;
+            },
+
+            getAsDataUrl: function( type ) {
+                var opts = this.options;
+
+                type = type || this.type;
+
+                if ( type === 'image/jpeg' ) {
+                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );
+                } else {
+                    return this._canvas.toDataURL( type );
+                }
+            },
+
+            getOrientation: function() {
+                return this._metas && this._metas.exif &&
+                        this._metas.exif.get('Orientation') || 1;
+            },
+
+            info: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+
+                // getter
+                return this._info;
+            },
+
+            meta: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+
+                // getter
+                return this._meta;
+            },
+
+            destroy: function() {
+                var canvas = this._canvas;
+                this._img.onload = null;
+
+                if ( canvas ) {
+                    canvas.getContext('2d')
+                            .clearRect( 0, 0, canvas.width, canvas.height );
+                    canvas.width = canvas.height = 0;
+                    this._canvas = null;
+                }
+
+                // 释放内存。非常重要,否则释放不了image的内存。
+                this._img.src = BLANK;
+                this._img = this._blob = null;
+            },
+
+            _resize: function( img, cvs, width, height ) {
+                var opts = this.options,
+                    naturalWidth = img.width,
+                    naturalHeight = img.height,
+                    orientation = this.getOrientation(),
+                    scale, w, h, x, y;
+
+                // values that require 90 degree rotation
+                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+
+                    // 交换width, height的值。
+                    width ^= height;
+                    height ^= width;
+                    width ^= height;
+                }
+
+                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
+                        height / naturalHeight );
+
+                // 不允许放大。
+                opts.allowMagnify || (scale = Math.min( 1, scale ));
+
+                w = naturalWidth * scale;
+                h = naturalHeight * scale;
+
+                if ( opts.crop ) {
+                    cvs.width = width;
+                    cvs.height = height;
+                } else {
+                    cvs.width = w;
+                    cvs.height = h;
+                }
+
+                x = (cvs.width - w) / 2;
+                y = (cvs.height - h) / 2;
+
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+
+                this._renderImageToCanvas( cvs, img, x, y, w, h );
+            },
+
+            _rotate2Orientaion: function( canvas, orientation ) {
+                var width = canvas.width,
+                    height = canvas.height,
+                    ctx = canvas.getContext('2d');
+
+                switch ( orientation ) {
+                    case 5:
+                    case 6:
+                    case 7:
+                    case 8:
+                        canvas.width = height;
+                        canvas.height = width;
+                        break;
+                }
+
+                switch ( orientation ) {
+                    case 2:    // horizontal flip
+                        ctx.translate( width, 0 );
+                        ctx.scale( -1, 1 );
+                        break;
+
+                    case 3:    // 180 rotate left
+                        ctx.translate( width, height );
+                        ctx.rotate( Math.PI );
+                        break;
+
+                    case 4:    // vertical flip
+                        ctx.translate( 0, height );
+                        ctx.scale( 1, -1 );
+                        break;
+
+                    case 5:    // vertical flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.scale( 1, -1 );
+                        break;
+
+                    case 6:    // 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( 0, -height );
+                        break;
+
+                    case 7:    // horizontal flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( width, -height );
+                        ctx.scale( -1, 1 );
+                        break;
+
+                    case 8:    // 90 rotate left
+                        ctx.rotate( -0.5 * Math.PI );
+                        ctx.translate( -width, 0 );
+                        break;
+                }
+            },
+
+            // https://github.com/stomita/ios-imagefile-megapixel/
+            // blob/master/src/megapix-image.js
+            _renderImageToCanvas: (function() {
+
+                // 如果不是ios, 不需要这么复杂!
+                if ( !Base.os.ios ) {
+                    return function( canvas ) {
+                        var args = Base.slice( arguments, 1 ),
+                            ctx = canvas.getContext('2d');
+
+                        ctx.drawImage.apply( ctx, args );
+                    };
+                }
+
+                /**
+                 * Detecting vertical squash in loaded image.
+                 * Fixes a bug which squash image vertically while drawing into
+                 * canvas for some images.
+                 */
+                function detectVerticalSquash( img, iw, ih ) {
+                    var canvas = document.createElement('canvas'),
+                        ctx = canvas.getContext('2d'),
+                        sy = 0,
+                        ey = ih,
+                        py = ih,
+                        data, alpha, ratio;
+
+
+                    canvas.width = 1;
+                    canvas.height = ih;
+                    ctx.drawImage( img, 0, 0 );
+                    data = ctx.getImageData( 0, 0, 1, ih ).data;
+
+                    // search image edge pixel position in case
+                    // it is squashed vertically.
+                    while ( py > sy ) {
+                        alpha = data[ (py - 1) * 4 + 3 ];
+
+                        if ( alpha === 0 ) {
+                            ey = py;
+                        } else {
+                            sy = py;
+                        }
+
+                        py = (ey + sy) >> 1;
+                    }
+
+                    ratio = (py / ih);
+                    return (ratio === 0) ? 1 : ratio;
+                }
+
+                // fix ie7 bug
+                // http://stackoverflow.com/questions/11929099/
+                // html5-canvas-drawimage-ratio-bug-ios
+                if ( Base.os.ios >= 7 ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        var iw = img.naturalWidth,
+                            ih = img.naturalHeight,
+                            vertSquashRatio = detectVerticalSquash( img, iw, ih );
+
+                        return canvas.getContext('2d').drawImage( img, 0, 0,
+                                iw * vertSquashRatio, ih * vertSquashRatio,
+                                x, y, w, h );
+                    };
+                }
+
+                /**
+                 * Detect subsampling in loaded image.
+                 * In iOS, larger images than 2M pixels may be
+                 * subsampled in rendering.
+                 */
+                function detectSubsampling( img ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        canvas, ctx;
+
+                    // subsampling may happen overmegapixel image
+                    if ( iw * ih > 1024 * 1024 ) {
+                        canvas = document.createElement('canvas');
+                        canvas.width = canvas.height = 1;
+                        ctx = canvas.getContext('2d');
+                        ctx.drawImage( img, -iw + 1, 0 );
+
+                        // subsampled image becomes half smaller in rendering size.
+                        // check alpha channel value to confirm image is covering
+                        // edge pixel or not. if alpha value is 0
+                        // image is not covering, hence subsampled.
+                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
+                    } else {
+                        return false;
+                    }
+                }
+
+
+                return function( canvas, img, x, y, width, height ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        ctx = canvas.getContext('2d'),
+                        subsampled = detectSubsampling( img ),
+                        doSquash = this.type === 'image/jpeg',
+                        d = 1024,
+                        sy = 0,
+                        dy = 0,
+                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
+
+                    if ( subsampled ) {
+                        iw /= 2;
+                        ih /= 2;
+                    }
+
+                    ctx.save();
+                    tmpCanvas = document.createElement('canvas');
+                    tmpCanvas.width = tmpCanvas.height = d;
+
+                    tmpCtx = tmpCanvas.getContext('2d');
+                    vertSquashRatio = doSquash ?
+                            detectVerticalSquash( img, iw, ih ) : 1;
+
+                    dw = Math.ceil( d * width / iw );
+                    dh = Math.ceil( d * height / ih / vertSquashRatio );
+
+                    while ( sy < ih ) {
+                        sx = 0;
+                        dx = 0;
+                        while ( sx < iw ) {
+                            tmpCtx.clearRect( 0, 0, d, d );
+                            tmpCtx.drawImage( img, -sx, -sy );
+                            ctx.drawImage( tmpCanvas, 0, 0, d, d,
+                                    x + dx, y + dy, dw, dh );
+                            sx += d;
+                            dx += dw;
+                        }
+                        sy += d;
+                        dy += dh;
+                    }
+                    ctx.restore();
+                    tmpCanvas = tmpCtx = null;
+                };
+            })()
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var noop = Base.noop,
+            $ = Base.$;
+
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+
+                if ( binary ) {
+                    // 强制设置成 content-type 为文件流。
+                    xhr.overrideMimeType &&
+                            xhr.overrideMimeType('application/octet-stream');
+
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+
+            getResponse: function() {
+                return this._response;
+            },
+
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+
+                    return me.trigger( 'progress', percentage );
+                };
+
+                xhr.onreadystatechange = function() {
+
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+
+
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+
+            _parseJson: function( str ) {
+                var json;
+
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/html5/md5',[
+        'runtime/html5/runtime'
+    ], function( FlashRuntime ) {
+
+        /*
+         * Fastest md5 implementation around (JKM md5)
+         * Credits: Joseph Myers
+         *
+         * @see http://www.myersdaily.org/joseph/javascript/md5-text.html
+         * @see http://jsperf.com/md5-shootout/7
+         */
+
+        /* this function is much faster,
+          so if possible we use it. Some IEs
+          are the only ones I know of that
+          need the idiotic second function,
+          generated by an if clause.  */
+        var add32 = function (a, b) {
+            return (a + b) & 0xFFFFFFFF;
+        },
+
+        cmn = function (q, a, b, x, s, t) {
+            a = add32(add32(a, q), add32(x, t));
+            return add32((a << s) | (a >>> (32 - s)), b);
+        },
+
+        ff = function (a, b, c, d, x, s, t) {
+            return cmn((b & c) | ((~b) & d), a, b, x, s, t);
+        },
+
+        gg = function (a, b, c, d, x, s, t) {
+            return cmn((b & d) | (c & (~d)), a, b, x, s, t);
+        },
+
+        hh = function (a, b, c, d, x, s, t) {
+            return cmn(b ^ c ^ d, a, b, x, s, t);
+        },
+
+        ii = function (a, b, c, d, x, s, t) {
+            return cmn(c ^ (b | (~d)), a, b, x, s, t);
+        },
+
+        md5cycle = function (x, k) {
+            var a = x[0],
+                b = x[1],
+                c = x[2],
+                d = x[3];
+
+            a = ff(a, b, c, d, k[0], 7, -680876936);
+            d = ff(d, a, b, c, k[1], 12, -389564586);
+            c = ff(c, d, a, b, k[2], 17, 606105819);
+            b = ff(b, c, d, a, k[3], 22, -1044525330);
+            a = ff(a, b, c, d, k[4], 7, -176418897);
+            d = ff(d, a, b, c, k[5], 12, 1200080426);
+            c = ff(c, d, a, b, k[6], 17, -1473231341);
+            b = ff(b, c, d, a, k[7], 22, -45705983);
+            a = ff(a, b, c, d, k[8], 7, 1770035416);
+            d = ff(d, a, b, c, k[9], 12, -1958414417);
+            c = ff(c, d, a, b, k[10], 17, -42063);
+            b = ff(b, c, d, a, k[11], 22, -1990404162);
+            a = ff(a, b, c, d, k[12], 7, 1804603682);
+            d = ff(d, a, b, c, k[13], 12, -40341101);
+            c = ff(c, d, a, b, k[14], 17, -1502002290);
+            b = ff(b, c, d, a, k[15], 22, 1236535329);
+
+            a = gg(a, b, c, d, k[1], 5, -165796510);
+            d = gg(d, a, b, c, k[6], 9, -1069501632);
+            c = gg(c, d, a, b, k[11], 14, 643717713);
+            b = gg(b, c, d, a, k[0], 20, -373897302);
+            a = gg(a, b, c, d, k[5], 5, -701558691);
+            d = gg(d, a, b, c, k[10], 9, 38016083);
+            c = gg(c, d, a, b, k[15], 14, -660478335);
+            b = gg(b, c, d, a, k[4], 20, -405537848);
+            a = gg(a, b, c, d, k[9], 5, 568446438);
+            d = gg(d, a, b, c, k[14], 9, -1019803690);
+            c = gg(c, d, a, b, k[3], 14, -187363961);
+            b = gg(b, c, d, a, k[8], 20, 1163531501);
+            a = gg(a, b, c, d, k[13], 5, -1444681467);
+            d = gg(d, a, b, c, k[2], 9, -51403784);
+            c = gg(c, d, a, b, k[7], 14, 1735328473);
+            b = gg(b, c, d, a, k[12], 20, -1926607734);
+
+            a = hh(a, b, c, d, k[5], 4, -378558);
+            d = hh(d, a, b, c, k[8], 11, -2022574463);
+            c = hh(c, d, a, b, k[11], 16, 1839030562);
+            b = hh(b, c, d, a, k[14], 23, -35309556);
+            a = hh(a, b, c, d, k[1], 4, -1530992060);
+            d = hh(d, a, b, c, k[4], 11, 1272893353);
+            c = hh(c, d, a, b, k[7], 16, -155497632);
+            b = hh(b, c, d, a, k[10], 23, -1094730640);
+            a = hh(a, b, c, d, k[13], 4, 681279174);
+            d = hh(d, a, b, c, k[0], 11, -358537222);
+            c = hh(c, d, a, b, k[3], 16, -722521979);
+            b = hh(b, c, d, a, k[6], 23, 76029189);
+            a = hh(a, b, c, d, k[9], 4, -640364487);
+            d = hh(d, a, b, c, k[12], 11, -421815835);
+            c = hh(c, d, a, b, k[15], 16, 530742520);
+            b = hh(b, c, d, a, k[2], 23, -995338651);
+
+            a = ii(a, b, c, d, k[0], 6, -198630844);
+            d = ii(d, a, b, c, k[7], 10, 1126891415);
+            c = ii(c, d, a, b, k[14], 15, -1416354905);
+            b = ii(b, c, d, a, k[5], 21, -57434055);
+            a = ii(a, b, c, d, k[12], 6, 1700485571);
+            d = ii(d, a, b, c, k[3], 10, -1894986606);
+            c = ii(c, d, a, b, k[10], 15, -1051523);
+            b = ii(b, c, d, a, k[1], 21, -2054922799);
+            a = ii(a, b, c, d, k[8], 6, 1873313359);
+            d = ii(d, a, b, c, k[15], 10, -30611744);
+            c = ii(c, d, a, b, k[6], 15, -1560198380);
+            b = ii(b, c, d, a, k[13], 21, 1309151649);
+            a = ii(a, b, c, d, k[4], 6, -145523070);
+            d = ii(d, a, b, c, k[11], 10, -1120210379);
+            c = ii(c, d, a, b, k[2], 15, 718787259);
+            b = ii(b, c, d, a, k[9], 21, -343485551);
+
+            x[0] = add32(a, x[0]);
+            x[1] = add32(b, x[1]);
+            x[2] = add32(c, x[2]);
+            x[3] = add32(d, x[3]);
+        },
+
+        /* there needs to be support for Unicode here,
+           * unless we pretend that we can redefine the MD-5
+           * algorithm for multi-byte characters (perhaps
+           * by adding every four 16-bit characters and
+           * shortening the sum to 32 bits). Otherwise
+           * I suggest performing MD-5 as if every character
+           * was two bytes--e.g., 0040 0025 = @%--but then
+           * how will an ordinary MD-5 sum be matched?
+           * There is no way to standardize text to something
+           * like UTF-8 before transformation; speed cost is
+           * utterly prohibitive. The JavaScript standard
+           * itself needs to look at this: it should start
+           * providing access to strings as preformed UTF-8
+           * 8-bit unsigned value arrays.
+           */
+        md5blk = function (s) {
+            var md5blks = [],
+                i; /* Andy King said do it this way. */
+
+            for (i = 0; i < 64; i += 4) {
+                md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
+            }
+            return md5blks;
+        },
+
+        md5blk_array = function (a) {
+            var md5blks = [],
+                i; /* Andy King said do it this way. */
+
+            for (i = 0; i < 64; i += 4) {
+                md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);
+            }
+            return md5blks;
+        },
+
+        md51 = function (s) {
+            var n = s.length,
+                state = [1732584193, -271733879, -1732584194, 271733878],
+                i,
+                length,
+                tail,
+                tmp,
+                lo,
+                hi;
+
+            for (i = 64; i <= n; i += 64) {
+                md5cycle(state, md5blk(s.substring(i - 64, i)));
+            }
+            s = s.substring(i - 64);
+            length = s.length;
+            tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
+            }
+            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+            if (i > 55) {
+                md5cycle(state, tail);
+                for (i = 0; i < 16; i += 1) {
+                    tail[i] = 0;
+                }
+            }
+
+            // Beware that the final length might not fit in 32 bits so we take care of that
+            tmp = n * 8;
+            tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+            lo = parseInt(tmp[2], 16);
+            hi = parseInt(tmp[1], 16) || 0;
+
+            tail[14] = lo;
+            tail[15] = hi;
+
+            md5cycle(state, tail);
+            return state;
+        },
+
+        md51_array = function (a) {
+            var n = a.length,
+                state = [1732584193, -271733879, -1732584194, 271733878],
+                i,
+                length,
+                tail,
+                tmp,
+                lo,
+                hi;
+
+            for (i = 64; i <= n; i += 64) {
+                md5cycle(state, md5blk_array(a.subarray(i - 64, i)));
+            }
+
+            // Not sure if it is a bug, however IE10 will always produce a sub array of length 1
+            // containing the last element of the parent array if the sub array specified starts
+            // beyond the length of the parent array - weird.
+            // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue
+            a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);
+
+            length = a.length;
+            tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= a[i] << ((i % 4) << 3);
+            }
+
+            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+            if (i > 55) {
+                md5cycle(state, tail);
+                for (i = 0; i < 16; i += 1) {
+                    tail[i] = 0;
+                }
+            }
+
+            // Beware that the final length might not fit in 32 bits so we take care of that
+            tmp = n * 8;
+            tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+            lo = parseInt(tmp[2], 16);
+            hi = parseInt(tmp[1], 16) || 0;
+
+            tail[14] = lo;
+            tail[15] = hi;
+
+            md5cycle(state, tail);
+
+            return state;
+        },
+
+        hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'],
+
+        rhex = function (n) {
+            var s = '',
+                j;
+            for (j = 0; j < 4; j += 1) {
+                s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];
+            }
+            return s;
+        },
+
+        hex = function (x) {
+            var i;
+            for (i = 0; i < x.length; i += 1) {
+                x[i] = rhex(x[i]);
+            }
+            return x.join('');
+        },
+
+        md5 = function (s) {
+            return hex(md51(s));
+        },
+
+
+
+        ////////////////////////////////////////////////////////////////////////////
+
+        /**
+         * SparkMD5 OOP implementation.
+         *
+         * Use this class to perform an incremental md5, otherwise use the
+         * static methods instead.
+         */
+        SparkMD5 = function () {
+            // call reset to init the instance
+            this.reset();
+        };
+
+
+        // In some cases the fast add32 function cannot be used..
+        if (md5('hello') !== '5d41402abc4b2a76b9719d911017c592') {
+            add32 = function (x, y) {
+                var lsw = (x & 0xFFFF) + (y & 0xFFFF),
+                    msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+                return (msw << 16) | (lsw & 0xFFFF);
+            };
+        }
+
+
+        /**
+         * Appends a string.
+         * A conversion will be applied if an utf8 string is detected.
+         *
+         * @param {String} str The string to be appended
+         *
+         * @return {SparkMD5} The instance itself
+         */
+        SparkMD5.prototype.append = function (str) {
+            // converts the string to utf8 bytes if necessary
+            if (/[\u0080-\uFFFF]/.test(str)) {
+                str = unescape(encodeURIComponent(str));
+            }
+
+            // then append as binary
+            this.appendBinary(str);
+
+            return this;
+        };
+
+        /**
+         * Appends a binary string.
+         *
+         * @param {String} contents The binary string to be appended
+         *
+         * @return {SparkMD5} The instance itself
+         */
+        SparkMD5.prototype.appendBinary = function (contents) {
+            this._buff += contents;
+            this._length += contents.length;
+
+            var length = this._buff.length,
+                i;
+
+            for (i = 64; i <= length; i += 64) {
+                md5cycle(this._state, md5blk(this._buff.substring(i - 64, i)));
+            }
+
+            this._buff = this._buff.substr(i - 64);
+
+            return this;
+        };
+
+        /**
+         * Finishes the incremental computation, reseting the internal state and
+         * returning the result.
+         * Use the raw parameter to obtain the raw result instead of the hex one.
+         *
+         * @param {Boolean} raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.prototype.end = function (raw) {
+            var buff = this._buff,
+                length = buff.length,
+                i,
+                tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+                ret;
+
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);
+            }
+
+            this._finish(tail, length);
+            ret = !!raw ? this._state : hex(this._state);
+
+            this.reset();
+
+            return ret;
+        };
+
+        /**
+         * Finish the final calculation based on the tail.
+         *
+         * @param {Array}  tail   The tail (will be modified)
+         * @param {Number} length The length of the remaining buffer
+         */
+        SparkMD5.prototype._finish = function (tail, length) {
+            var i = length,
+                tmp,
+                lo,
+                hi;
+
+            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+            if (i > 55) {
+                md5cycle(this._state, tail);
+                for (i = 0; i < 16; i += 1) {
+                    tail[i] = 0;
+                }
+            }
+
+            // Do the final computation based on the tail and length
+            // Beware that the final length may not fit in 32 bits so we take care of that
+            tmp = this._length * 8;
+            tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+            lo = parseInt(tmp[2], 16);
+            hi = parseInt(tmp[1], 16) || 0;
+
+            tail[14] = lo;
+            tail[15] = hi;
+            md5cycle(this._state, tail);
+        };
+
+        /**
+         * Resets the internal state of the computation.
+         *
+         * @return {SparkMD5} The instance itself
+         */
+        SparkMD5.prototype.reset = function () {
+            this._buff = "";
+            this._length = 0;
+            this._state = [1732584193, -271733879, -1732584194, 271733878];
+
+            return this;
+        };
+
+        /**
+         * Releases memory used by the incremental buffer and other aditional
+         * resources. If you plan to use the instance again, use reset instead.
+         */
+        SparkMD5.prototype.destroy = function () {
+            delete this._state;
+            delete this._buff;
+            delete this._length;
+        };
+
+
+        /**
+         * Performs the md5 hash on a string.
+         * A conversion will be applied if utf8 string is detected.
+         *
+         * @param {String}  str The string
+         * @param {Boolean} raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.hash = function (str, raw) {
+            // converts the string to utf8 bytes if necessary
+            if (/[\u0080-\uFFFF]/.test(str)) {
+                str = unescape(encodeURIComponent(str));
+            }
+
+            var hash = md51(str);
+
+            return !!raw ? hash : hex(hash);
+        };
+
+        /**
+         * Performs the md5 hash on a binary string.
+         *
+         * @param {String}  content The binary string
+         * @param {Boolean} raw     True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.hashBinary = function (content, raw) {
+            var hash = md51(content);
+
+            return !!raw ? hash : hex(hash);
+        };
+
+        /**
+         * SparkMD5 OOP implementation for array buffers.
+         *
+         * Use this class to perform an incremental md5 ONLY for array buffers.
+         */
+        SparkMD5.ArrayBuffer = function () {
+            // call reset to init the instance
+            this.reset();
+        };
+
+        ////////////////////////////////////////////////////////////////////////////
+
+        /**
+         * Appends an array buffer.
+         *
+         * @param {ArrayBuffer} arr The array to be appended
+         *
+         * @return {SparkMD5.ArrayBuffer} The instance itself
+         */
+        SparkMD5.ArrayBuffer.prototype.append = function (arr) {
+            // TODO: we could avoid the concatenation here but the algorithm would be more complex
+            //       if you find yourself needing extra performance, please make a PR.
+            var buff = this._concatArrayBuffer(this._buff, arr),
+                length = buff.length,
+                i;
+
+            this._length += arr.byteLength;
+
+            for (i = 64; i <= length; i += 64) {
+                md5cycle(this._state, md5blk_array(buff.subarray(i - 64, i)));
+            }
+
+            // Avoids IE10 weirdness (documented above)
+            this._buff = (i - 64) < length ? buff.subarray(i - 64) : new Uint8Array(0);
+
+            return this;
+        };
+
+        /**
+         * Finishes the incremental computation, reseting the internal state and
+         * returning the result.
+         * Use the raw parameter to obtain the raw result instead of the hex one.
+         *
+         * @param {Boolean} raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.ArrayBuffer.prototype.end = function (raw) {
+            var buff = this._buff,
+                length = buff.length,
+                tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+                i,
+                ret;
+
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= buff[i] << ((i % 4) << 3);
+            }
+
+            this._finish(tail, length);
+            ret = !!raw ? this._state : hex(this._state);
+
+            this.reset();
+
+            return ret;
+        };
+
+        SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;
+
+        /**
+         * Resets the internal state of the computation.
+         *
+         * @return {SparkMD5.ArrayBuffer} The instance itself
+         */
+        SparkMD5.ArrayBuffer.prototype.reset = function () {
+            this._buff = new Uint8Array(0);
+            this._length = 0;
+            this._state = [1732584193, -271733879, -1732584194, 271733878];
+
+            return this;
+        };
+
+        /**
+         * Releases memory used by the incremental buffer and other aditional
+         * resources. If you plan to use the instance again, use reset instead.
+         */
+        SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;
+
+        /**
+         * Concats two array buffers, returning a new one.
+         *
+         * @param  {ArrayBuffer} first  The first array buffer
+         * @param  {ArrayBuffer} second The second array buffer
+         *
+         * @return {ArrayBuffer} The new array buffer
+         */
+        SparkMD5.ArrayBuffer.prototype._concatArrayBuffer = function (first, second) {
+            var firstLength = first.length,
+                result = new Uint8Array(firstLength + second.byteLength);
+
+            result.set(first);
+            result.set(new Uint8Array(second), firstLength);
+
+            return result;
+        };
+
+        /**
+         * Performs the md5 hash on an array buffer.
+         *
+         * @param {ArrayBuffer} arr The array buffer
+         * @param {Boolean}     raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.ArrayBuffer.hash = function (arr, raw) {
+            var hash = md51_array(new Uint8Array(arr));
+
+            return !!raw ? hash : hex(hash);
+        };
+
+        return FlashRuntime.register( 'Md5', {
+            init: function() {
+                // do nothing.
+            },
+
+            loadFromBlob: function( file ) {
+                var blob = file.getSource(),
+                    chunkSize = 2 * 1024 * 1024,
+                    chunks = Math.ceil( blob.size / chunkSize ),
+                    chunk = 0,
+                    owner = this.owner,
+                    spark = new SparkMD5.ArrayBuffer(),
+                    me = this,
+                    blobSlice = blob.mozSlice || blob.webkitSlice || blob.slice,
+                    loadNext, fr;
+
+                fr = new FileReader();
+
+                loadNext = function() {
+                    var start, end;
+
+                    start = chunk * chunkSize;
+                    end = Math.min( start + chunkSize, blob.size );
+
+                    fr.onload = function( e ) {
+                        spark.append( e.target.result );
+                        owner.trigger( 'progress', {
+                            total: file.size,
+                            loaded: end
+                        });
+                    };
+
+                    fr.onloadend = function() {
+                        fr.onloadend = fr.onload = null;
+
+                        if ( ++chunk < chunks ) {
+                            setTimeout( loadNext, 1 );
+                        } else {
+                            setTimeout(function(){
+                                owner.trigger('load');
+                                me.result = spark.end();
+                                loadNext = file = blob = spark = null;
+                                owner.trigger('complete');
+                            }, 50 );
+                        }
+                    };
+
+                    fr.readAsArrayBuffer( blobSlice.call( blob, start, end ) );
+                };
+
+                loadNext();
+            },
+
+            getResult: function() {
+                return this.result;
+            }
+        });
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+
+
+        function getFlashVersion() {
+            var version;
+
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destroy = this.destroy,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                clients[ uid ] = client;
+
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+
+                    instance = pool[ uid ];
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+
+                return me.flashExec.apply( client, arguments );
+            };
+
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+
+                // console.log.apply( console, arguments );
+
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+
+                // Base.log( evt, obj );
+            }
+
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+
+            this.jsreciver = jsreciver;
+
+            this.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+
+                return flash.exec( this.uid, comp, fn, args );
+            };
+
+            // @todo
+        }
+
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+
+                container.html( html );
+            },
+
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+
+        });
+
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+
+            return component;
+        };
+
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+
+                delete copy.button;
+                delete copy.id;
+                delete copy.container;
+
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+
+            destroy: function() {
+                this.flashExec( 'FilePicker', 'destroy' );
+            }
+        });
+    });
+    /**
+     * @fileOverview 图片压缩
+     */
+    define('runtime/flash/image',[
+        'runtime/flash/runtime'
+    ], function( FlashRuntime ) {
+
+        return FlashRuntime.register( 'Image', {
+            // init: function( options ) {
+            //     var owner = this.owner;
+
+            //     this.flashExec( 'Image', 'init', options );
+            //     owner.on( 'load', function() {
+            //         debugger;
+            //     });
+            // },
+
+            loadFromBlob: function( blob ) {
+                var owner = this.owner;
+
+                owner.info() && this.flashExec( 'Image', 'info', owner.info() );
+                owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );
+
+                this.flashExec( 'Image', 'loadFromBlob', blob.uid );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+
+                xhr.connectRuntime( blob.ruid );
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server,
+                    forceURLStream: opts.forceURLStream,
+                    mimeType: 'application/octet-stream'
+                }, binary );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            getResponse: function() {
+                return this._response || '';
+            },
+
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    var percent = e.loaded / e.total;
+                    percent = Math.min( 1, Math.max( 0, percent ) );
+                    return me.trigger( 'progress', percent );
+                });
+
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        readBody = false,
+                        err = '',
+                        p;
+
+                    xhr.off();
+                    me._xhr = null;
+
+                    if ( status >= 200 && status < 300 ) {
+                        readBody = true;
+                    } else if ( status >= 500 && status < 600 ) {
+                        readBody = true;
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+
+                    if ( readBody ) {
+                        me._response = xhr.exec('getResponse');
+                        me._response = decodeURIComponent( me._response );
+
+                        // flash 处理可能存在 bug, 没辙只能靠 js 了
+                        // try {
+                        //     me._responseJson = xhr.exec('getResponseAsJson');
+                        // } catch ( error ) {
+
+                        p = window.JSON && window.JSON.parse || function( s ) {
+                            try {
+                                return new Function('return ' + s).call();
+                            } catch ( err ) {
+                                return {};
+                            }
+                        };
+                        me._responseJson  = me._response ? p(me._response) : {};
+
+                        // }
+                    }
+
+                    xhr.destroy();
+                    xhr = null;
+
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/flash/blob',[
+        'runtime/flash/runtime',
+        'lib/blob'
+    ], function( FlashRuntime, Blob ) {
+
+        return FlashRuntime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.flashExec( 'Blob', 'slice', start, end );
+
+                return new Blob( blob.uid, blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Md5 flash实现
+     */
+    define('runtime/flash/md5',[
+        'runtime/flash/runtime'
+    ], function( FlashRuntime ) {
+
+        return FlashRuntime.register( 'Md5', {
+            init: function() {
+                // do nothing.
+            },
+
+            loadFromBlob: function( blob ) {
+                return this.flashExec( 'Md5', 'loadFromBlob', blob.uid );
+            }
+        });
+    });
+    /**
+     * @fileOverview 完全版本。
+     */
+    define('preset/all',[
+        'base',
+
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+        'widgets/md5',
+
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/imagemeta/exif',
+        'runtime/html5/androidpatch',
+        'runtime/html5/image',
+        'runtime/html5/transport',
+        'runtime/html5/md5',
+
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/image',
+        'runtime/flash/transport',
+        'runtime/flash/blob',
+        'runtime/flash/md5'
+    ], function( Base ) {
+        return Base;
+    });
+    /**
+     * @fileOverview 日志组件,主要用来收集错误信息,可以帮助 webuploader 更好的定位问题和发展。
+     *
+     * 如果您不想要启用此功能,请在打包的时候去掉 log 模块。
+     *
+     * 或者可以在初始化的时候通过 options.disableWidgets 属性禁用。
+     *
+     * 如:
+     * WebUploader.create({
+     *     ...
+     *
+     *     disableWidgets: 'log',
+     *
+     *     ...
+     * })
+     */
+    define('widgets/log',[
+        'base',
+        'uploader',
+        'widgets/widget'
+    ], function( Base, Uploader ) {
+        var $ = Base.$,
+            logUrl = ' http://static.tieba.baidu.com/tb/pms/img/st.gif??',
+            product = (location.hostname || location.host || 'protected').toLowerCase(),
+
+            // 只针对 baidu 内部产品用户做统计功能。
+            enable = product && /baidu/i.exec(product),
+            base;
+
+        if (!enable) {
+            return;
+        }
+
+        base = {
+            dv: 3,
+            master: 'webuploader',
+            online: /test/.exec(product) ? 0 : 1,
+            module: '',
+            product: product,
+            type: 0
+        };
+
+        function send(data) {
+            var obj = $.extend({}, base, data),
+                url = logUrl.replace(/^(.*)\?/, '$1' + $.param( obj )),
+                image = new Image();
+
+            image.src = url;
+        }
+
+        return Uploader.register({
+            name: 'log',
+
+            init: function() {
+                var owner = this.owner,
+                    count = 0,
+                    size = 0;
+
+                owner
+                    .on('error', function(code) {
+                        send({
+                            type: 2,
+                            c_error_code: code
+                        });
+                    })
+                    .on('uploadError', function(file, reason) {
+                        send({
+                            type: 2,
+                            c_error_code: 'UPLOAD_ERROR',
+                            c_reason: '' + reason
+                        });
+                    })
+                    .on('uploadComplete', function(file) {
+                        count++;
+                        size += file.size;
+                    }).
+                    on('uploadFinished', function() {
+                        send({
+                            c_count: count,
+                            c_size: size
+                        });
+                        count = size = 0;
+                    });
+
+                send({
+                    c_usage: 1
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('webuploader',[
+        'preset/all',
+        'widgets/log'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.min.js
new file mode 100644
index 0000000..43cb93b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.min.js
@@ -0,0 +1,3 @@
+/* WebUploader 0.1.5 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}return a},j=function(c){return a.__dollar=c,i(b(a,f,e))};"object"==typeof module&&"object"==typeof module.exports?module.exports=j():"function"==typeof define&&define.amd?define(["jquery"],j):(c=a.WebUploader,a.WebUploader=j(),a.WebUploader.noConflict=function(){a.WebUploader=c})}(window,function(a,b,c){return b("dollar-third",[],function(){var b=a.__dollar||a.jQuery||a.Zepto;if(!b)throw new Error("jQuery or Zepto not found!");return b}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.5",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",cancelFile:"cancel-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",md5File:"md5-file",getDimension:"get-dimension",addButton:"add-btn",predictRuntimeType:"predict-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return a?{successNum:a.numOfSuccess,progressNum:a.numOfProgress,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue,interruptNum:a.numofInterrupt}:{}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},destroy:function(){this.request("destroy",arguments),this.off()},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,this._parent=a,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.remove(),this._parent&&this._parent.removeClass("webuploader-container"),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g=b.prototype.destroy,h={},i=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):h},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[],c=a.options.disableWidgets||"";return e.each(i,function(d,e){(!c||!~c.indexOf(e._name))&&b.push(new e(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,g,i,j,k=0,l=this._widgets,m=l&&l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],g=f.invoke(b,d),g!==h&&(a.isPromise(g)?o.push(g):n.push(g));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return 1===c.length&&(c=c[0]),setTimeout(function(){b.resolve(c)},1),b.promise()})[e?j:"done"](e||a.noop)):n[0]},destroy:function(){g.apply(this,arguments),this._widgets=null}}),b.register=d.register=function(b,c){var f,g={init:"init",destroy:"destroy",name:"anonymous"};return 1===arguments.length?(c=b,e.each(c,function(a){return"_"===a[0]||"name"===a?void("name"===a&&(g.name=c.name)):void(g[a.replace(/[A-Z]/g,"-$&").toLowerCase()]=a)})):g=e.extend(g,b),c.responseMap=g,f=a.inherits(d,c),f._name=g.name,i.push(f),f},b.unRegister=d.unRegister=function(a){if(a&&"anonymous"!==a)for(var b=i.length;b--;)i[b]._name===a&&i.splice(b,1)},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({name:"dnd",init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return this.dnd=e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}},destroy:function(){this.dnd&&this.dnd.destroy()}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({name:"paste",init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return this.paste=e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}},destroy:function(){this.paste&&this.paste.destroy()}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,this.size=c.size||0,this.type=!c.type&&this.ext&&~"jpg,jpeg,png,gif,bmp".indexOf(this.ext)?"image/"+("jpg"===this.ext?"jpeg":this.ext):c.type||"application/octet-stream",b.call(d,"Blob"),this.uid=c.uid||this.uid,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&c.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(c.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString(),b.apply(this,arguments)}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var c=this,e=c.options,g=e.button;g.addClass("webuploader-pick"),c.on("all",function(a){var b;switch(a){case"mouseenter":g.addClass("webuploader-pick-hover");break;case"mouseleave":g.removeClass("webuploader-pick-hover");break;case"change":b=c.exec("getFiles"),c.trigger("select",f.map(b,function(a){return a=new d(c.getRuid(),a),a._refer=e.container,a}),e.container)}}),c.connectRuntime(e,function(){c.refresh(),c.exec("init",e),c.trigger("ready")}),this._resizeHandler=b.bindFn(this.refresh,this),f(a).on("resize",this._resizeHandler)},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){var b=this.options.button;f(a).off("resize",this._resizeHandler),b.removeClass("webuploader-pick-disable webuploader-pick-hover webuploader-pick")}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({name:"picker",init:function(a){return this.pickers=[],a.pick&&this.addBtn(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addBtn:function(b){var e=this,f=e.options,g=f.accept,h=[];if(b)return d.isPlainObject(b)||(b={id:b}),d(b.id).each(function(){var i,j,k;k=a.Deferred(),i=d.extend({},b,{accept:d.isPlainObject(g)?[g]:g,swf:f.swf,runtimeOrder:f.runtimeOrder,id:this}),j=new c(i),j.once("ready",k.resolve),j.on("select",function(a){e.owner.request("add-file",[a])}),j.init(),e.pickers.push(j),h.push(k.promise())}),a.when.apply(a,h)},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})},destroy:function(){d.each(this.pickers,function(){this.destroy()}),this.pickers=null}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!1,allowMagnify:!1},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},crop:function(){var b=a.slice(arguments);return this.exec.apply(this,["crop"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({name:"image",makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),1>=f&&f>0&&(f=a._info.width*f),1>=g&&g>0&&(g=a._info.height*g),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(a){b(a||!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},beforeSendFile:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||0,i=g&&g.noCompressIfLarger||!1;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){var a=g.width,c=g.height;b._info=b._info||d.info(),b._meta=b._meta||d.meta(),1>=a&&a>0&&(a=b._info.width*a),1>=c&&c>0&&(c=b._info.height*c),d.resize(a,c)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,(!i||a.size<c)&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application/octet-stream",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destroy:function(){this.off(),delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0,numofDeleted:0,numofInterrupt:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},removeFile:function(a){var b=this._map[a.id];b&&(delete this._map[a.id],a.destroy(),this.stats.numofDeleted++)},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)}))},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--;break;case f.INTERRUPT:c.numofInterrupt--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++;break;case f.INTERRUPT:c.numofInterrupt++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({name:"queue",init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),this.placeholder=l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||!a.size||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFile:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&setTimeout(function(){b.request("start-upload")},20)},getStats:function(){return this.stats},removeFile:function(a,b){var c=this;a=a.id?a:c.queue.getFile(a),this.request("cancel-file",a),b&&this.queue.removeFile(a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.owner.trigger("reset"),this.queue=new c,this.stats=this.queue.stats},destroy:function(){this.reset(),this.placeholder&&this.placeholder.destroy()}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({name:"runtime",init:function(){if(!this.predictRuntimeType())throw Error("Runtime Error")},predictRuntimeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){var c,d,e=[],f=a.source,g=f.size,h=b?Math.ceil(g/b):1,i=0,j=0;for(d={file:a,has:function(){return!!e.length},shift:function(){return e.shift()},unshift:function(a){e.unshift(a)}};h>j;)c=Math.min(b,g-i),e.push({file:a,start:i,end:b?i+c:g,total:g,chunks:h,chunk:j++,cuted:d}),i+=c;return a.blocks=e.concat(),a.remaning=e.length,d}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:{}}),b.register({name:"upload",init:function(){var b=this.owner,c=this;this.runing=!1,this.progress=!1,b.on("startUpload",function(){c.progress=!0}).on("uploadFinished",function(){c.progress=!1}),this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},reset:function(){this.request("stop-upload",!0),this.runing=!1,this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this._trigged=!1,this._promise=null},startUpload:function(b){var c=this;if(f.each(c.request("get-files",h.INVALID),function(){c.request("remove-file",this)}),b)if(b=b.id?b:c.request("get-file",b),b.getStatus()===h.INTERRUPT)f.each(c.pool,function(a,c){c.file===b&&c.transport&&c.transport.send()}),b.setStatus(h.QUEUED);else{if(b.getStatus()===h.PROGRESS)return;b.setStatus(h.QUEUED)}else f.each(c.request("get-files",[h.INITED]),function(){this.setStatus(h.QUEUED)});if(!c.runing){c.runing=!0;var d=[];f.each(c.pool,function(a,b){var e=b.file;e.getStatus()===h.INTERRUPT&&(d.push(e),c._trigged=!1,b.transport&&b.transport.send())});for(var b;b=d.shift();)b.setStatus(h.PROGRESS);b||f.each(c.request("get-files",h.INTERRUPT),function(){this.setStatus(h.PROGRESS)}),c._trigged=!1,a.nextTick(c.__tick),c.owner.trigger("startUpload")}},stopUpload:function(b,c){var d=this;if(b===!0&&(c=b,b=null),d.runing!==!1){if(b){if(b=b.id?b:d.request("get-file",b),b.getStatus()!==h.PROGRESS&&b.getStatus()!==h.QUEUED)return;return b.setStatus(h.INTERRUPT),f.each(d.pool,function(a,c){c.file===b&&(c.transport&&c.transport.abort(),d._putback(c),d._popBlock(c))}),a.nextTick(d.__tick)}d.runing=!1,this._promise&&this._promise.file&&this._promise.file.setStatus(h.INTERRUPT),c&&f.each(d.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),d.owner.trigger("stopUpload")}},cancelFile:function(a){a=a.id?a:this.request("get-file",a),a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),a.setStatus(h.CANCELLED),this.owner.trigger("fileDequeued",a)},isInProgress:function(){return!!this.progress},_getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=a.id?a:this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d._getStats().numOfQueue||d._getStats().numofInterrupt||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_putback:function(a){var b;a.cuted.unshift(a),b=this.stack.indexOf(a.cuted),~b||this.stack.unshift(a.cuted)},_getStack:function(){for(var a,b=0;a=this.stack[b++];){if(a.has()&&a.file.getStatus()===h.PROGRESS)return a;(!a.has()||a.file.getStatus()!==h.PROGRESS&&a.file.getStatus()!==h.INTERRUPT)&&this.stack.splice(--b,1)}return null},_nextBlock:function(){var a,b,c,d,f=this,h=f.options;return(a=this._getStack())?(h.prepareNextFile&&!f.pending.length&&f._prepareNextFile(),a.shift()):f.runing?(!f.pending.length&&f._getStats().numOfQueue&&f._prepareNextFile(),b=f.pending.shift(),c=function(b){return b?(a=e(b,h.chunked?h.chunkSize:0),f.stack.push(a),a.shift()):null},g(b)?(d=b.file,b=b[b.pipe?"pipe":"then"](c),b.file=d,b):c(b)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.PROGRESS||c.getStatus()===h.INTERRUPT?c:b._finishFile(c)}),b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),a.file=c,a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;return e.getStatus()!==h.PROGRESS?void(e.getStatus()===h.INTERRUPT&&d._putback(b)):(d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),void c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d.updateFileProgress(e),d._popBlock(b),a.nextTick(d.__tick))}))},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){b.percentage=a,g.updateFileProgress(k)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)
+}).always(function(){d.trigger("uploadComplete",a)})},updateFileProgress:function(a){var b=0,c=0;a.blocks&&(f.each(a.blocks,function(a,b){c+=(b.percentage||0)*(b.end-b.start)}),b=c/a.size,this.owner.trigger("uploadProgress",a,b||0))}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({name:"validator",init:function(){var b=this;a.nextTick(function(){e.each(f,function(){this.call(b.owner)})})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileNumLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("reset",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileSizeLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("reset",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",d,a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}),b.on("reset",function(){d={}}))}),d}),b("lib/md5",["runtime/client","mediator"],function(a,b){function c(){a.call(this,"Md5")}return b.installTo(c.prototype),c.prototype.loadFromBlob=function(a){var b=this;b.getRuid()&&b.disconnectRuntime(),b.connectRuntime(a.ruid,function(){b.exec("init"),b.exec("loadFromBlob",a)})},c.prototype.getResult=function(){return this.exec("getResult")},c}),b("widgets/md5",["base","uploader","lib/md5","lib/blob","widgets/widget"],function(a,b,c,d){return b.register({name:"md5",md5File:function(b,e,f){var g=new c,h=a.Deferred(),i=b instanceof d?b:this.request("get-file",b).source;return g.on("progress load",function(a){a=a||{},h.notify(a.total?a.loaded/a.total:1)}),g.on("complete",function(){h.resolve(g.getResult())}),g.on("error",function(a){h.reject(a)}),arguments.length>1&&(e=e||0,f=f||0,0>e&&(e=i.size+e),0>f&&(f=i.size+f),f=Math.min(f,i.size),i=i.slice(e,f)),g.loadFromBlob(i),h.promise()}})}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destroy;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destroy=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b,f,g=this,h=g.getRuid(),i=g.elem.parent().get(0);if(i&&!d.contains(i,a.currentTarget))return!1;a=a.originalEvent||a,b=a.dataTransfer;try{f=b.getData("text/html")}catch(j){}return f?void 0:(g._getTansferFiles(b,function(a){g.trigger("drop",d.map(a,function(a){return new c(h,a)}))}),g.dndOver=!1,g.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k=[],l=[];for(d=b.items,e=b.files,j=!(!d||!d[0].webkitGetAsEntry),h=0,i=e.length;i>h;h++)f=e[h],g=d&&d[h],j&&g.webkitGetAsEntry().isDirectory?l.push(this._traverseDirectoryTree(g.webkitGetAsEntry(),k)):k.push(f);a.when.apply(a,l).done(function(){k.length&&c(k)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a&&(a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragOverHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler)))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=this.label=c(document.createElement("label")),k=this.input=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),b.value=null,this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){this.input.off(),this.label.off()}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;e<b.length;e++)c[e]=b.charCodeAt(e);return f=g[0].split(":")[1].split(";")[0],this.arrayBufferToBlob(d,f)},dataURL2ArrayBuffer:function(a){var b,c,d,e;for(e=a.split(","),b=~e[0].indexOf("base64")?atob(e[1]):decodeURIComponent(e[1]),c=new Uint8Array(b.length),d=0;d<b.length;d++)c[d]=b.charCodeAt(d);return c.buffer},arrayBufferToBlob:function(b,c){var d,e=a.BlobBuilder||a.WebKitBlobBuilder;return e?(d=new e,d.append(b),d.getBlob(c)):new Blob([b],c?{type:c}:{})},canvasToDataUrl:function(a,b,c){return a.toDataURL(b,c/100)},parseMeta:function(a,b){b(!1,{})},updateImageHead:function(a){return a}}}),b("runtime/html5/imagemeta",["runtime/html5/util"],function(a){var b;return b={parsers:{65505:[]},maxMetaDataSize:262144,parse:function(a,b){var c=this,d=new FileReader;d.onload=function(){b(!1,c._parse(this.result)),d=d.onload=d.onerror=null},d.onerror=function(a){b(a.message),d=d.onload=d.onerror=null},a=a.slice(0,c.maxMetaDataSize),d.readAsArrayBuffer(a.getSource())},_parse:function(a,c){if(!(a.byteLength<6)){var d,e,f,g,h=new DataView(a),i=2,j=h.byteLength-4,k=i,l={};if(65496===h.getUint16(0)){for(;j>i&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g<f.length;g+=1)f[g].call(b,h,i,e,l);i+=e,k=i}k>6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;l<k.length&&(n=k[l],"\x00"!==n);l+=1)m+=n;return m}return k},c.parseExifTag=function(a,b,d,e,f){var g=a.getUint16(d,e);f.exif[g]=c.getExifValue(a,b,d,a.getUint16(d+2,e),a.getUint32(d+4,e),e)},c.parseExifTags=function(b,c,d,e,f){var g,h,i;if(d+6>b.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/jpegencoder",[],function(){function a(a){function b(a){for(var b=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],c=0;64>c;c++){var d=y((b[c]*a+50)/100);1>d?d=1:d>255&&(d=255),z[P[c]]=d}for(var e=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],f=0;64>f;f++){var g=y((e[f]*a+50)/100);1>g?g=1:g>255&&(g=255),A[P[f]]=g}for(var h=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],i=0,j=0;8>j;j++)for(var k=0;8>k;k++)B[i]=1/(z[P[i]]*h[j]*h[k]*8),C[i]=1/(A[P[i]]*h[j]*h[k]*8),i++}function c(a,b){for(var c=0,d=0,e=new Array,f=1;16>=f;f++){for(var g=1;g<=a[f];g++)e[b[d]]=[],e[b[d]][0]=c,e[b[d]][1]=f,d++,c++;c*=2}return e}function d(){t=c(Q,R),u=c(U,V),v=c(S,T),w=c(W,X)}function e(){for(var a=1,b=2,c=1;15>=c;c++){for(var d=a;b>d;d++)E[32767+d]=c,D[32767+d]=[],D[32767+d][1]=c,D[32767+d][0]=d;for(var e=-(b-1);-a>=e;e++)E[32767+e]=c,D[32767+e]=[],D[32767+e][1]=c,D[32767+e][0]=b-1+e;a<<=1,b<<=1}}function f(){for(var a=0;256>a;a++)O[a]=19595*a,O[a+256>>0]=38470*a,O[a+512>>0]=7471*a+32768,O[a+768>>0]=-11059*a,O[a+1024>>0]=-21709*a,O[a+1280>>0]=32768*a+8421375,O[a+1536>>0]=-27439*a,O[a+1792>>0]=-5329*a}function g(a){for(var b=a[0],c=a[1]-1;c>=0;)b&1<<c&&(I|=1<<J),c--,J--,0>J&&(255==I?(h(255),h(0)):h(I),J=7,I=0)}function h(a){H.push(N[a])}function i(a){h(a>>8&255),h(255&a)}function j(a,b){var c,d,e,f,g,h,i,j,k,l=0,m=8,n=64;for(k=0;m>k;++k){c=a[l],d=a[l+1],e=a[l+2],f=a[l+3],g=a[l+4],h=a[l+5],i=a[l+6],j=a[l+7];var o=c+j,p=c-j,q=d+i,r=d-i,s=e+h,t=e-h,u=f+g,v=f-g,w=o+u,x=o-u,y=q+s,z=q-s;a[l]=w+y,a[l+4]=w-y;var A=.707106781*(z+x);a[l+2]=x+A,a[l+6]=x-A,w=v+t,y=t+r,z=r+p;var B=.382683433*(w-z),C=.5411961*w+B,D=1.306562965*z+B,E=.707106781*y,G=p+E,H=p-E;a[l+5]=H+C,a[l+3]=H-C,a[l+1]=G+D,a[l+7]=G-D,l+=8}for(l=0,k=0;m>k;++k){c=a[l],d=a[l+8],e=a[l+16],f=a[l+24],g=a[l+32],h=a[l+40],i=a[l+48],j=a[l+56];var I=c+j,J=c-j,K=d+i,L=d-i,M=e+h,N=e-h,O=f+g,P=f-g,Q=I+O,R=I-O,S=K+M,T=K-M;a[l]=Q+S,a[l+32]=Q-S;var U=.707106781*(T+R);a[l+16]=R+U,a[l+48]=R-U,Q=P+N,S=N+L,T=L+J;var V=.382683433*(Q-T),W=.5411961*Q+V,X=1.306562965*T+V,Y=.707106781*S,Z=J+Y,$=J-Y;a[l+40]=$+W,a[l+24]=$-W,a[l+8]=Z+X,a[l+56]=Z-X,l++}var _;for(k=0;n>k;++k)_=a[k]*b[k],F[k]=_>0?_+.5|0:_-.5|0;return F}function k(){i(65504),i(16),h(74),h(70),h(73),h(70),h(0),h(1),h(1),h(0),i(1),i(1),h(0),h(0)}function l(a,b){i(65472),i(17),h(8),i(b),i(a),h(3),h(1),h(17),h(0),h(2),h(17),h(1),h(3),h(17),h(1)}function m(){i(65499),i(132),h(0);for(var a=0;64>a;a++)h(z[a]);h(1);for(var b=0;64>b;b++)h(A[b])}function n(){i(65476),i(418),h(0);for(var a=0;16>a;a++)h(Q[a+1]);for(var b=0;11>=b;b++)h(R[b]);h(16);for(var c=0;16>c;c++)h(S[c+1]);for(var d=0;161>=d;d++)h(T[d]);h(1);for(var e=0;16>e;e++)h(U[e+1]);for(var f=0;11>=f;f++)h(V[f]);h(17);for(var g=0;16>g;g++)h(W[g+1]);for(var j=0;161>=j;j++)h(X[j])}function o(){i(65498),i(12),h(3),h(1),h(0),h(2),h(17),h(3),h(17),h(0),h(63),h(0)}function p(a,b,c,d,e){for(var f,h=e[0],i=e[240],k=16,l=63,m=64,n=j(a,b),o=0;m>o;++o)G[P[o]]=n[o];var p=G[0]-c;c=G[0],0==p?g(d[0]):(f=32767+p,g(d[E[f]]),g(D[f]));for(var q=63;q>0&&0==G[q];q--);if(0==q)return g(h),c;for(var r,s=1;q>=s;){for(var t=s;0==G[s]&&q>=s;++s);var u=s-t;if(u>=k){r=u>>4;for(var v=1;r>=v;++v)g(i);u=15&u}f=32767+G[s],g(e[(u<<4)+E[f]]),g(D[f]),s++}return q!=l&&g(h),c}function q(){for(var a=String.fromCharCode,b=0;256>b;b++)N[b]=a(b)}function r(a){if(0>=a&&(a=1),a>100&&(a=100),x!=a){var c=0;c=Math.floor(50>a?5e3/a:200-2*a),b(c),x=a}}function s(){a||(a=50),q(),d(),e(),f(),r(a)}var t,u,v,w,x,y=(Math.round,Math.floor),z=new Array(64),A=new Array(64),B=new Array(64),C=new Array(64),D=new Array(65535),E=new Array(65535),F=new Array(64),G=new Array(64),H=[],I=0,J=7,K=new Array(64),L=new Array(64),M=new Array(64),N=new Array(256),O=new Array(2048),P=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],Q=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],R=[0,1,2,3,4,5,6,7,8,9,10,11],S=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],T=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],U=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],V=[0,1,2,3,4,5,6,7,8,9,10,11],W=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],X=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];this.encode=function(a,b){b&&r(b),H=new Array,I=0,J=7,i(65496),k(),m(),l(a.width,a.height),n(),o();var c=0,d=0,e=0;I=0,J=7,this.encode.displayName="_encode_";for(var f,h,j,q,s,x,y,z,A,D=a.data,E=a.width,F=a.height,G=4*E,N=0;F>N;){for(f=0;G>f;){for(s=G*N+f,x=s,y=-1,z=0,A=0;64>A;A++)z=A>>3,y=4*(7&A),x=s+z*G+y,N+z>=F&&(x-=G*(N+1+z-F)),f+y>=G&&(x-=f+y-G+4),h=D[x++],j=D[x++],q=D[x++],K[A]=(O[h]+O[j+256>>0]+O[q+512>>0]>>16)-128,L[A]=(O[h+768>>0]+O[j+1024>>0]+O[q+1280>>0]>>16)-128,M[A]=(O[h+1280>>0]+O[j+1536>>0]+O[q+1792>>0]>>16)-128;c=p(K,B,c,t,v),d=p(L,C,d,u,w),e=p(M,C,e,u,w),f+=32}N+=8}if(J>=0){var P=[];P[1]=J+1,P[0]=(1<<J+1)-1,g(P)}i(65497);var Q="data:image/jpeg;base64,"+btoa(H.join(""));return H=[],Q},s()}return a.encode=function(b,c){var d=new a(c);return d.encode(b)},a}),b("runtime/html5/androidpatch",["runtime/html5/util","runtime/html5/jpegencoder","base"],function(a,b,c){var d,e=a.canvasToDataUrl;a.canvasToDataUrl=function(a,f,g){var h,i,j,k,l;return c.os.android?("image/jpeg"===f&&"undefined"==typeof d&&(k=e.apply(null,arguments),l=k.split(","),k=~l[0].indexOf("base64")?atob(l[1]):decodeURIComponent(l[1]),k=k.substring(0,2),d=255===k.charCodeAt(0)&&216===k.charCodeAt(1)),"image/jpeg"!==f||d?e.apply(null,arguments):(i=a.width,j=a.height,h=a.getContext("2d"),b.encode(h.getImageData(0,0,i,j),g))):e.apply(null,arguments)}}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete","resize")},crop:function(a,b,c,d,e){var f=this._canvas||(this._canvas=document.createElement("canvas")),g=this.options,h=this._img,i=h.naturalWidth,j=h.naturalHeight,k=this.getOrientation();e=e||1,f.width=c,f.height=d,g.preserveHeaders||this._rotate2Orientaion(f,k),this._renderImageToCanvas(f,h,-a,-b,i*e,j*e),this._blob=null,this.modified=!0,this.owner.trigger("complete","crop")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,a,e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(b){var c=a.slice(arguments,1),d=b.getContext("2d");d.drawImage.apply(d,c)}}()})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType&&h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("runtime/html5/md5",["runtime/html5/runtime"],function(a){var b=function(a,b){return a+b&4294967295},c=function(a,c,d,e,f,g){return c=b(b(c,a),b(e,g)),b(c<<f|c>>>32-f,d)},d=function(a,b,d,e,f,g,h){return c(b&d|~b&e,a,b,f,g,h)},e=function(a,b,d,e,f,g,h){return c(b&e|d&~e,a,b,f,g,h)},f=function(a,b,d,e,f,g,h){return c(b^d^e,a,b,f,g,h)},g=function(a,b,d,e,f,g,h){return c(d^(b|~e),a,b,f,g,h)},h=function(a,c){var h=a[0],i=a[1],j=a[2],k=a[3];h=d(h,i,j,k,c[0],7,-680876936),k=d(k,h,i,j,c[1],12,-389564586),j=d(j,k,h,i,c[2],17,606105819),i=d(i,j,k,h,c[3],22,-1044525330),h=d(h,i,j,k,c[4],7,-176418897),k=d(k,h,i,j,c[5],12,1200080426),j=d(j,k,h,i,c[6],17,-1473231341),i=d(i,j,k,h,c[7],22,-45705983),h=d(h,i,j,k,c[8],7,1770035416),k=d(k,h,i,j,c[9],12,-1958414417),j=d(j,k,h,i,c[10],17,-42063),i=d(i,j,k,h,c[11],22,-1990404162),h=d(h,i,j,k,c[12],7,1804603682),k=d(k,h,i,j,c[13],12,-40341101),j=d(j,k,h,i,c[14],17,-1502002290),i=d(i,j,k,h,c[15],22,1236535329),h=e(h,i,j,k,c[1],5,-165796510),k=e(k,h,i,j,c[6],9,-1069501632),j=e(j,k,h,i,c[11],14,643717713),i=e(i,j,k,h,c[0],20,-373897302),h=e(h,i,j,k,c[5],5,-701558691),k=e(k,h,i,j,c[10],9,38016083),j=e(j,k,h,i,c[15],14,-660478335),i=e(i,j,k,h,c[4],20,-405537848),h=e(h,i,j,k,c[9],5,568446438),k=e(k,h,i,j,c[14],9,-1019803690),j=e(j,k,h,i,c[3],14,-187363961),i=e(i,j,k,h,c[8],20,1163531501),h=e(h,i,j,k,c[13],5,-1444681467),k=e(k,h,i,j,c[2],9,-51403784),j=e(j,k,h,i,c[7],14,1735328473),i=e(i,j,k,h,c[12],20,-1926607734),h=f(h,i,j,k,c[5],4,-378558),k=f(k,h,i,j,c[8],11,-2022574463),j=f(j,k,h,i,c[11],16,1839030562),i=f(i,j,k,h,c[14],23,-35309556),h=f(h,i,j,k,c[1],4,-1530992060),k=f(k,h,i,j,c[4],11,1272893353),j=f(j,k,h,i,c[7],16,-155497632),i=f(i,j,k,h,c[10],23,-1094730640),h=f(h,i,j,k,c[13],4,681279174),k=f(k,h,i,j,c[0],11,-358537222),j=f(j,k,h,i,c[3],16,-722521979),i=f(i,j,k,h,c[6],23,76029189),h=f(h,i,j,k,c[9],4,-640364487),k=f(k,h,i,j,c[12],11,-421815835),j=f(j,k,h,i,c[15],16,530742520),i=f(i,j,k,h,c[2],23,-995338651),h=g(h,i,j,k,c[0],6,-198630844),k=g(k,h,i,j,c[7],10,1126891415),j=g(j,k,h,i,c[14],15,-1416354905),i=g(i,j,k,h,c[5],21,-57434055),h=g(h,i,j,k,c[12],6,1700485571),k=g(k,h,i,j,c[3],10,-1894986606),j=g(j,k,h,i,c[10],15,-1051523),i=g(i,j,k,h,c[1],21,-2054922799),h=g(h,i,j,k,c[8],6,1873313359),k=g(k,h,i,j,c[15],10,-30611744),j=g(j,k,h,i,c[6],15,-1560198380),i=g(i,j,k,h,c[13],21,1309151649),h=g(h,i,j,k,c[4],6,-145523070),k=g(k,h,i,j,c[11],10,-1120210379),j=g(j,k,h,i,c[2],15,718787259),i=g(i,j,k,h,c[9],21,-343485551),a[0]=b(h,a[0]),a[1]=b(i,a[1]),a[2]=b(j,a[2]),a[3]=b(k,a[3])},i=function(a){var b,c=[];for(b=0;64>b;b+=4)c[b>>2]=a.charCodeAt(b)+(a.charCodeAt(b+1)<<8)+(a.charCodeAt(b+2)<<16)+(a.charCodeAt(b+3)<<24);return c},j=function(a){var b,c=[];for(b=0;64>b;b+=4)c[b>>2]=a[b]+(a[b+1]<<8)+(a[b+2]<<16)+(a[b+3]<<24);return c},k=function(a){var b,c,d,e,f,g,j=a.length,k=[1732584193,-271733879,-1732584194,271733878];for(b=64;j>=b;b+=64)h(k,i(a.substring(b-64,b)));for(a=a.substring(b-64),c=a.length,d=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],b=0;c>b;b+=1)d[b>>2]|=a.charCodeAt(b)<<(b%4<<3);if(d[b>>2]|=128<<(b%4<<3),b>55)for(h(k,d),b=0;16>b;b+=1)d[b]=0;return e=8*j,e=e.toString(16).match(/(.*?)(.{0,8})$/),f=parseInt(e[2],16),g=parseInt(e[1],16)||0,d[14]=f,d[15]=g,h(k,d),k},l=function(a){var b,c,d,e,f,g,i=a.length,k=[1732584193,-271733879,-1732584194,271733878];for(b=64;i>=b;b+=64)h(k,j(a.subarray(b-64,b)));for(a=i>b-64?a.subarray(b-64):new Uint8Array(0),c=a.length,d=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],b=0;c>b;b+=1)d[b>>2]|=a[b]<<(b%4<<3);if(d[b>>2]|=128<<(b%4<<3),b>55)for(h(k,d),b=0;16>b;b+=1)d[b]=0;return e=8*i,e=e.toString(16).match(/(.*?)(.{0,8})$/),f=parseInt(e[2],16),g=parseInt(e[1],16)||0,d[14]=f,d[15]=g,h(k,d),k},m=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"],n=function(a){var b,c="";for(b=0;4>b;b+=1)c+=m[a>>8*b+4&15]+m[a>>8*b&15];return c},o=function(a){var b;for(b=0;b<a.length;b+=1)a[b]=n(a[b]);return a.join("")},p=function(a){return o(k(a))},q=function(){this.reset()};return"5d41402abc4b2a76b9719d911017c592"!==p("hello")&&(b=function(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c}),q.prototype.append=function(a){return/[\u0080-\uFFFF]/.test(a)&&(a=unescape(encodeURIComponent(a))),this.appendBinary(a),this},q.prototype.appendBinary=function(a){this._buff+=a,this._length+=a.length;var b,c=this._buff.length;for(b=64;c>=b;b+=64)h(this._state,i(this._buff.substring(b-64,b)));return this._buff=this._buff.substr(b-64),this},q.prototype.end=function(a){var b,c,d=this._buff,e=d.length,f=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(b=0;e>b;b+=1)f[b>>2]|=d.charCodeAt(b)<<(b%4<<3);return this._finish(f,e),c=a?this._state:o(this._state),this.reset(),c},q.prototype._finish=function(a,b){var c,d,e,f=b;if(a[f>>2]|=128<<(f%4<<3),f>55)for(h(this._state,a),f=0;16>f;f+=1)a[f]=0;c=8*this._length,c=c.toString(16).match(/(.*?)(.{0,8})$/),d=parseInt(c[2],16),e=parseInt(c[1],16)||0,a[14]=d,a[15]=e,h(this._state,a)},q.prototype.reset=function(){return this._buff="",this._length=0,this._state=[1732584193,-271733879,-1732584194,271733878],this},q.prototype.destroy=function(){delete this._state,delete this._buff,delete this._length},q.hash=function(a,b){/[\u0080-\uFFFF]/.test(a)&&(a=unescape(encodeURIComponent(a)));var c=k(a);return b?c:o(c)},q.hashBinary=function(a,b){var c=k(a);return b?c:o(c)},q.ArrayBuffer=function(){this.reset()},q.ArrayBuffer.prototype.append=function(a){var b,c=this._concatArrayBuffer(this._buff,a),d=c.length;for(this._length+=a.byteLength,b=64;d>=b;b+=64)h(this._state,j(c.subarray(b-64,b)));return this._buff=d>b-64?c.subarray(b-64):new Uint8Array(0),this},q.ArrayBuffer.prototype.end=function(a){var b,c,d=this._buff,e=d.length,f=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
+for(b=0;e>b;b+=1)f[b>>2]|=d[b]<<(b%4<<3);return this._finish(f,e),c=a?this._state:o(this._state),this.reset(),c},q.ArrayBuffer.prototype._finish=q.prototype._finish,q.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._state=[1732584193,-271733879,-1732584194,271733878],this},q.ArrayBuffer.prototype.destroy=q.prototype.destroy,q.ArrayBuffer.prototype._concatArrayBuffer=function(a,b){var c=a.length,d=new Uint8Array(c+b.byteLength);return d.set(a),d.set(new Uint8Array(b),c),d},q.ArrayBuffer.hash=function(a,b){var c=l(new Uint8Array(a));return b?c:o(c)},a.register("Md5",{init:function(){},loadFromBlob:function(a){var b,c,d=a.getSource(),e=2097152,f=Math.ceil(d.size/e),g=0,h=this.owner,i=new q.ArrayBuffer,j=this,k=d.mozSlice||d.webkitSlice||d.slice;c=new FileReader,(b=function(){var l,m;l=g*e,m=Math.min(l+e,d.size),c.onload=function(b){i.append(b.target.result),h.trigger("progress",{total:a.size,loaded:m})},c.onloadend=function(){c.onloadend=c.onload=null,++g<f?setTimeout(b,1):setTimeout(function(){h.trigger("load"),j.result=i.end(),b=a=d=i=null,h.trigger("complete")},50)},c.readAsArrayBuffer(k.call(d,l,m))})()},getResult:function(){return this.result}})}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destroy,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destroy=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.id,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){this.flashExec("FilePicker","destroy")}})}),b("runtime/flash/image",["runtime/flash/runtime"],function(a){return a.register("Image",{loadFromBlob:function(a){var b=this.owner;b.info()&&this.flashExec("Image","info",b.info()),b.meta()&&this.flashExec("Image","meta",b.meta()),this.flashExec("Image","loadFromBlob",a.uid)}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(b,c,d){var e=b.$;return c.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,d=this._initAjax(),f=b._blob,g=c.server;d.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+e.param(b._formData),a=f.uid):(e.each(b._formData,function(a,b){d.exec("append",a,b)}),d.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(d,c.headers),d.exec("send",{method:c.method,url:g,forceURLStream:c.forceURLStream,mimeType:"application/octet-stream"},a)},getStatus:function(){return this._status},getResponse:function(){return this._response||""},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var b=this,c=new d("XMLHttpRequest");return c.on("uploadprogress progress",function(a){var c=a.loaded/a.total;return c=Math.min(1,Math.max(0,c)),b.trigger("progress",c)}),c.on("load",function(){var d,e=c.exec("getStatus"),f=!1,g="";return c.off(),b._xhr=null,e>=200&&300>e?f=!0:e>=500&&600>e?(f=!0,g="server"):g="http",f&&(b._response=c.exec("getResponse"),b._response=decodeURIComponent(b._response),d=a.JSON&&a.JSON.parse||function(a){try{return new Function("return "+a).call()}catch(b){return{}}},b._responseJson=b._response?d(b._response):{}),c.destroy(),c=null,g?b.trigger("error",g):b.trigger("load")}),c.on("error",function(){c.off(),b._xhr=null,b.trigger("error","http")}),b._xhr=c,c},_setRequestHeader:function(a,b){e.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("runtime/flash/blob",["runtime/flash/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.flashExec("Blob","slice",a,c);return new b(d.uid,d)}})}),b("runtime/flash/md5",["runtime/flash/runtime"],function(a){return a.register("Md5",{init:function(){},loadFromBlob:function(a){return this.flashExec("Md5","loadFromBlob",a.uid)}})}),b("preset/all",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","widgets/md5","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/androidpatch","runtime/html5/image","runtime/html5/transport","runtime/html5/md5","runtime/flash/filepicker","runtime/flash/image","runtime/flash/transport","runtime/flash/blob","runtime/flash/md5"],function(a){return a}),b("widgets/log",["base","uploader","widgets/widget"],function(a,b){function c(a){var b=e.extend({},d,a),c=f.replace(/^(.*)\?/,"$1"+e.param(b)),g=new Image;g.src=c}var d,e=a.$,f=" http://static.tieba.baidu.com/tb/pms/img/st.gif??",g=(location.hostname||location.host||"protected").toLowerCase(),h=g&&/baidu/i.exec(g);if(h)return d={dv:3,master:"webuploader",online:/test/.exec(g)?0:1,module:"",product:g,type:0},b.register({name:"log",init:function(){var a=this.owner,b=0,d=0;a.on("error",function(a){c({type:2,c_error_code:a})}).on("uploadError",function(a,b){c({type:2,c_error_code:"UPLOAD_ERROR",c_reason:""+b})}).on("uploadComplete",function(a){b++,d+=a.size}).on("uploadFinished",function(){c({c_count:b,c_size:d}),b=d=0}),c({c_usage:1})}})}),b("webuploader",["preset/all","widgets/log"],function(a){return a}),c("webuploader")});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.noimage.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.noimage.js
new file mode 100644
index 0000000..fa51de5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.noimage.js
@@ -0,0 +1,5026 @@
+/*! WebUploader 0.1.5 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+
+            return obj;
+        },
+
+        makeExport = function( dollar ) {
+            root.__dollar = dollar;
+
+            // exports every module.
+            return exportsTo( factory( root, _define, _require ) );
+        },
+
+        origin;
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = makeExport();
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([ 'jquery' ], makeExport );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = makeExport();
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( window, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        var $ = window.__dollar || window.jQuery || window.Zepto;
+
+        if ( !$ ) {
+            throw new Error('jQuery or Zepto not found!');
+        }
+
+        return $;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id为该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档中对类的使用可能省略掉了`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+
+        var noop = function() {},
+            call = Function.call;
+
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+
+        function createObject( proto ) {
+            var f;
+
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+
+
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.5',
+
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+
+            Deferred: promise.Deferred,
+
+            isPromise: promise.isPromise,
+
+            when: promise.when,
+
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match( /(?:trident)(?:.*rv:([\w.]+))?/i ),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+
+                /* jshint camelcase: false */
+
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+
+                return child;
+            },
+
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数noop](#WebUploader:Base.noop)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+
+            nextTick: (function() {
+
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+
+            while ( ++i < len ) {
+                handler = events[ i ];
+
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+
+            return !stoped;
+        }
+
+        protos = {
+
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+
+                if ( !callback ) {
+                    return this;
+                }
+
+                set = this._events || (this._events = []);
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+
+                    set.push( handler );
+                });
+
+                return this;
+            },
+
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+
+                if ( !callback ) {
+                    return me;
+                }
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+
+                return me;
+            },
+
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+
+                if ( !events ) {
+                    return this;
+                }
+
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+
+                return this;
+            },
+
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+
+                if ( !this._events || !type ) {
+                    return this;
+                }
+
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$;
+
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            cancelFile: 'cancel-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            md5File: 'md5-file',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            predictRuntimeType: 'predict-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+
+            _init: function( opts ) {
+                var me = this;
+
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     compress: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.option( 'compress', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+
+                // setter
+                if ( arguments.length > 1 ) {
+
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `progressNum` 上传中的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `queueNum` 还在队列中的文件数
+             * * `interruptNum` 被暂停的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+
+                return stats ? {
+                    successNum: stats.numOfSuccess,
+                    progressNum: stats.numOfProgress,
+
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue,
+                    interruptNum: stats.numofInterrupt
+                } : {};
+            },
+
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+
+                    return false;
+                }
+
+                return true;
+            },
+
+            /**
+             * 销毁 webuploader 实例
+             * @method destroy
+             * @grammar destroy() => undefined
+             */
+            destroy: function() {
+                this.request( 'destroy', arguments );
+                this.off();
+            },
+
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            factories = {},
+
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+
+        $.extend( Runtime.prototype, {
+
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+
+                if ( this._container ) {
+                    return this._container;
+                }
+
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                this._parent = parent;
+                return container;
+            },
+
+            init: Base.noop,
+            exec: Base.noop,
+
+            destroy: function() {
+                this._container && this._container.remove();
+                this._parent && this._parent.removeClass('webuploader-container');
+                this.off();
+            }
+        });
+
+        Runtime.orders = 'html5,flash';
+
+
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+
+            type = type || getFirstKey( factories );
+
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+
+        var cache;
+
+        cache = (function() {
+            var obj = {};
+
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+
+                get: function( ruid, standalone ) {
+                    var i;
+
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+
+                        return obj[ i ];
+                    }
+
+                    return null;
+                },
+
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+
+            this.uid = Base.guid('client_');
+
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+
+            this.connectRuntime = function( opts, cb ) {
+
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+
+                deferred.done( cb );
+
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                runtime.__client--;
+
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+
+                runtime = null;
+            };
+
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+
+                return runtime.exec.apply( this, args );
+            };
+
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+
+            opts.container = $( opts.container );
+
+            if ( !opts.container.length ) {
+                return;
+            }
+
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( DragAndDrop.prototype );
+
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            _destroy = Uploader.prototype.destroy,
+            IGNORE = {},
+            widgetClass = [];
+
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+
+            var length = obj.length,
+                type = $.type( obj );
+
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+
+        $.extend( Widget.prototype, {
+
+            init: Base.noop,
+
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+
+                    return IGNORE;
+                }
+
+                return this[ map[ apiName ] ].apply( this, args );
+
+            },
+
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+
+            /**
+             * @property {String | Array} [disableWidgets=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 默认所有 Uploader.register 了的 widget 都会被加载,如果禁用某一部分,请通过此 option 指定黑名单。
+             */
+
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [],
+                    deactives = me.options.disableWidgets || '';
+
+                $.each( widgetClass, function( _, klass ) {
+                    (!deactives || !~deactives.indexOf( klass._name )) &&
+                        widgets.push( new klass( me ) );
+                });
+
+                return _init.apply( me, arguments );
+            },
+
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets && widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+
+                args = isArrayLike( args ) ? args : [ args ];
+
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+
+                    if ( rlt !== IGNORE ) {
+
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个 tick 中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+
+                                if ( args.length === 1 ) {
+                                    args = args[ 0 ];
+                                }
+
+                                setTimeout(function() {
+                                    deferred.resolve( args );
+                                }, 1 );
+
+                                return deferred.promise();
+                            })[ callback ? key : 'done' ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            },
+
+            destroy: function() {
+                _destroy.apply( this, arguments );
+                this._widgets = null;
+            }
+        });
+
+        /**
+         * 添加组件
+         * @grammar Uploader.register(proto);
+         * @grammar Uploader.register(map, proto);
+         * @param  {object} responseMap API 名称与函数实现的映射
+         * @param  {object} proto 组件原型,构造函数通过 constructor 属性定义
+         * @method Uploader.register
+         * @for Uploader
+         * @example
+         * Uploader.register({
+         *     'make-thumb': 'makeThumb'
+         * }, {
+         *     init: function( options ) {},
+         *     makeThumb: function() {}
+         * });
+         *
+         * Uploader.register({
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init', destroy: 'destroy', name: 'anonymous' },
+                klass;
+
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+
+                // 自动生成 map 表。
+                $.each(widgetProto, function(key) {
+                    if ( key[0] === '_' || key === 'name' ) {
+                        key === 'name' && (map.name = widgetProto.name);
+                        return;
+                    }
+
+                    map[key.replace(/[A-Z]/g, '-$&').toLowerCase()] = key;
+                });
+
+            } else {
+                map = $.extend( map, responseMap );
+            }
+
+            widgetProto.responseMap = map;
+            klass = Base.inherits( Widget, widgetProto );
+            klass._name = map.name;
+            widgetClass.push( klass );
+
+            return klass;
+        };
+
+        /**
+         * 删除插件,只有在注册时指定了名字的才能被删除。
+         * @grammar Uploader.unRegister(name);
+         * @param  {string} name 组件名字
+         * @method Uploader.unRegister
+         * @for Uploader
+         * @example
+         *
+         * Uploader.register({
+         *     name: 'custom',
+         *
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         *
+         * Uploader.unRegister('custom');
+         */
+        Uploader.unRegister = Widget.unRegister = function( name ) {
+            if ( !name || name === 'anonymous' ) {
+                return;
+            }
+
+            // 删除指定的插件。
+            for ( var i = widgetClass.length; i--; ) {
+                if ( widgetClass[i]._name === name ) {
+                    widgetClass.splice(i, 1)
+                }
+            }
+        };
+
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+
+        Uploader.options.dnd = '';
+
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @property {Selector} [disableGlobalDnd=false]  是否禁掉整个页面的拖拽功能,如果不禁用,图片拖进来的时候会默认被浏览器打开。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            name: 'dnd',
+
+            init: function( opts ) {
+
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+
+                this.dnd = dnd = new Dnd( options );
+
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+
+                dnd.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.dnd && this.dnd.destroy();
+            }
+        });
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( FilePaste.prototype );
+
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            name: 'paste',
+
+            init: function( opts ) {
+
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+
+                this.paste = paste = new FilePaste( options );
+
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.paste && this.paste.destroy();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+
+        function Blob( ruid, source ) {
+            var me = this;
+
+            me.source = source;
+            me.ruid = ruid;
+            this.size = source.size || 0;
+
+            // 如果没有指定 mimetype, 但是知道文件后缀。
+            if ( !source.type && this.ext &&
+                    ~'jpg,jpeg,png,gif,bmp'.indexOf( this.ext ) ) {
+                this.type = 'image/' + (this.ext === 'jpg' ? 'jpeg' : this.ext);
+            } else {
+                this.type = source.type || 'application/octet-stream';
+            }
+
+            RuntimeClient.call( me, 'Blob' );
+            this.uid = source.uid || this.uid;
+
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+
+            getSource: function() {
+                return this.source;
+            }
+        });
+
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+
+        function File( ruid, file ) {
+            var ext;
+
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+
+            // todo 支持其他类型文件的转换。
+            // 如果有 mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && file.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( file.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+
+            Blob.apply( this, arguments );
+        }
+
+        return Base.inherits( Blob, File );
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+
+        var $ = Base.$;
+
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+
+            opts.container = $( opts.id );
+
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+
+                button.addClass('webuploader-pick');
+
+                me.on( 'all', function( type ) {
+                    var files;
+
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+
+                this._resizeHandler = Base.bindFn( this.refresh, this );
+                $( window ).on( 'resize', this._resizeHandler );
+            },
+
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+
+                    pos = button.offset();
+
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+
+            enable: function() {
+                var btn = this.options.button;
+
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+
+            disable: function() {
+                var btn = this.options.button;
+
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+
+                btn.addClass('webuploader-pick-disable');
+            },
+
+            destroy: function() {
+                var btn = this.options.button;
+                $( window ).off( 'resize', this._resizeHandler );
+                btn.removeClass('webuploader-pick-disable webuploader-pick-hover ' +
+                    'webuploader-pick');
+            }
+        });
+
+        return FilePicker;
+    });
+
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor|dom} 指定选择文件的按钮容器,不指定则不创建按钮。**注意** 这里虽然写的是 id, 但是不是只支持 id, 还支持 class, 或者 dom 节点。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+
+        return Uploader.register({
+            name: 'picker',
+
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addBtn( opts.pick );
+            },
+
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addBtn: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    promises = [];
+
+                if ( !pick ) {
+                    return;
+                }
+
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+
+                $( pick.id ).each(function() {
+                    var options, picker, deferred;
+
+                    deferred = Base.Deferred();
+
+                    options = $.extend({}, pick, {
+                        accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                        swf: opts.swf,
+                        runtimeOrder: opts.runtimeOrder,
+                        id: this
+                    });
+
+                    picker = new FilePicker( options );
+
+                    picker.once( 'ready', deferred.resolve );
+                    picker.on( 'select', function( files ) {
+                        me.owner.request( 'add-file', [ files ]);
+                    });
+                    picker.init();
+
+                    me.pickers.push( picker );
+
+                    promises.push( deferred.promise() );
+                });
+
+                return Base.when.apply( Base, promises );
+            },
+
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            },
+
+            destroy: function() {
+                $.each( this.pickers, function() {
+                    this.destroy();
+                });
+                this.pickers = null;
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application/octet-stream'
+             */
+            this.type = source.type || 'application/octet-stream';
+
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+
+
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+
+            this.source = source;
+            this.loaded = 0;
+
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+
+        $.extend( WUFile.prototype, {
+
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+
+                var prevStatus = statusMap[ this.id ];
+
+                typeof text !== 'undefined' && (this.statusText = text);
+
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+
+            },
+
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+
+            destroy: function() {
+                this.off();
+                delete statusMap[ this.id ];
+            }
+        });
+
+        Mediator.installTo( WUFile.prototype );
+
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+
+        return WUFile;
+    });
+
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被取消的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * * `numofDeleted` 被移除的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0,
+                numofDeleted: 0,
+                numofInterrupt: 0
+            };
+
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+
+            // 存储所有文件
+            this._map = {};
+        }
+
+        $.extend( Queue.prototype, {
+
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+
+                status = status || STATUS.QUEUED;
+
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+
+                return null;
+            },
+
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+
+                    ret.push( file );
+                }
+
+                return ret;
+            },
+
+            /**
+             * 在队列中删除文件。
+             * @grammar removeFile( file ) => Array
+             * @method removeFile
+             * @param {File} 文件对象。
+             */
+            removeFile: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( existing ) {
+                    delete this._map[ file.id ];
+                    file.destroy();
+                    this.stats.numofDeleted++;
+                }
+            },
+
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+            },
+
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt--;
+                        break;
+                }
+
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt++;
+                        break;
+                }
+            }
+
+        });
+
+        Mediator.installTo( Queue.prototype );
+
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+
+        return Uploader.register({
+            name: 'queue',
+
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+
+                    me.accept = new RegExp( accept, 'i' );
+                }
+
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                this.placeholder = runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+
+
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+
+                    file = new WUFile( file );
+                }
+
+                return file;
+            },
+
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || !file.size || this.accept &&
+
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+
+                return !invalid;
+            },
+
+
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+
+            _addFile: function( file ) {
+                var me = this;
+
+                file = me._wrapFile( file );
+
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @property {Boolean} [auto=false]
+             * @namespace options
+             * @for Uploader
+             * @description 设置为 true 后,不需要手动调用上传,有文件选择即开始上传。
+             *
+             */
+
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFile: function( files ) {
+                var me = this;
+
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+
+                me.owner.trigger( 'filesQueued', files );
+
+                if ( me.options.auto ) {
+                    setTimeout(function() {
+                        me.request('start-upload');
+                    }, 20 );
+                }
+            },
+
+            getStats: function() {
+                return this.stats;
+            },
+
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+
+             /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @grammar removeFile( file, true ) => undefined
+             * @grammar removeFile( id, true ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件, 默认只会标记文件状态为已取消,如果第二个参数为 `true` 则会从 queue 中移除。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file, remove ) {
+                var me = this;
+
+                file = file.id ? file : me.queue.getFile( file );
+
+                this.request( 'cancel-file', file );
+
+                if ( remove ) {
+                    this.queue.removeFile( file );
+                }
+            },
+
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+
+                me.request('start-upload');
+            },
+
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+
+            /**
+             * @event reset
+             * @description 当 uploader 被重置的时候触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.owner.trigger('reset');
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            },
+
+            destroy: function() {
+                this.reset();
+                this.placeholder && this.placeholder.destroy();
+            }
+        });
+
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+
+        /**
+         * @property {Object} [runtimeOrder=html5,flash]
+         * @namespace options
+         * @for Uploader
+         * @description 指定运行时启动顺序。默认会想尝试 html5 是否支持,如果支持则使用 html5, 否则则使用 flash.
+         *
+         * 可以将此值设置成 `flash`,来强制使用 flash 运行时。
+         */
+
+        return Uploader.register({
+            name: 'runtime',
+
+            init: function() {
+                if ( !this.predictRuntimeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntimeType() => String
+             * @method predictRuntimeType
+             * @for  Uploader
+             */
+            predictRuntimeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+
+        var $ = Base.$;
+
+        function Transport( opts ) {
+            var me = this;
+
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+
+        Transport.options = {
+            server: '',
+            method: 'POST',
+
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+
+        $.extend( Transport.prototype, {
+
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+
+                if ( !duration ) {
+                    return;
+                }
+
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+
+        });
+
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+
+
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+
+
+            /**
+             * @property {Object} [formData={}]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: {}
+
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len, api;
+
+            api = {
+                file: file,
+
+                has: function() {
+                    return !!pending.length;
+                },
+
+                shift: function() {
+                    return pending.shift();
+                },
+
+                unshift: function( block ) {
+                    pending.unshift( block );
+                }
+            };
+
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++,
+                    cuted: api
+                });
+                start += len;
+            }
+
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+
+            return api;
+        }
+
+        Uploader.register({
+            name: 'upload',
+
+            init: function() {
+                var owner = this.owner,
+                    me = this;
+
+                this.runing = false;
+                this.progress = false;
+
+                owner
+                    .on( 'startUpload', function() {
+                        me.progress = true;
+                    })
+                    .on( 'uploadFinished', function() {
+                        me.progress = false;
+                    });
+
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+
+                // 缓存分好片的文件。
+                this.stack = [];
+
+                // 缓存即将上传的文件。
+                this.pending = [];
+
+                // 跟踪还有多少分片在上传中但是没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+
+                owner.on( 'uploadComplete', function( file ) {
+
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+
+            reset: function() {
+                this.request( 'stop-upload', true );
+                this.runing = false;
+                this.pool = [];
+                this.stack = [];
+                this.pending = [];
+                this.remaning = 0;
+                this._trigged = false;
+                this._promise = null;
+            },
+
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             *
+             * 可以指定开始某一个文件。
+             * @grammar upload() => undefined
+             * @grammar upload( file | fileId) => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            startUpload: function(file) {
+                var me = this;
+
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+
+                // 如果指定了开始某个文件,则只开始指定文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        $.each( me.pool, function( _, v ) {
+
+                            // 之前暂停过。
+                            if (v.file !== file) {
+                                return;
+                            }
+
+                            v.transport && v.transport.send();
+                        });
+
+                        file.setStatus( Status.QUEUED );
+                    } else if (file.getStatus() === Status.PROGRESS) {
+                        return;
+                    } else {
+                        file.setStatus( Status.QUEUED );
+                    }
+                } else {
+                    $.each( me.request( 'get-files', [ Status.INITED ] ), function() {
+                        this.setStatus( Status.QUEUED );
+                    });
+                }
+
+                if ( me.runing ) {
+                    return;
+                }
+
+                me.runing = true;
+
+                var files = [];
+
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        files.push(file);
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+
+                var file;
+                while ( (file = files.shift()) ) {
+                    file.setStatus( Status.PROGRESS );
+                }
+
+                file || $.each( me.request( 'get-files',
+                        Status.INTERRUPT ), function() {
+                    this.setStatus( Status.PROGRESS );
+                });
+
+                me._trigged = false;
+                Base.nextTick( me.__tick );
+                me.owner.trigger('startUpload');
+            },
+
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             *
+             * 如果第一个参数是文件,则只暂停指定文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @grammar stop( file ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stopUpload: function( file, interrupt ) {
+                var me = this;
+
+                if (file === true) {
+                    interrupt = file;
+                    file = null;
+                }
+
+                if ( me.runing === false ) {
+                    return;
+                }
+
+                // 如果只是暂停某个文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if ( file.getStatus() !== Status.PROGRESS &&
+                            file.getStatus() !== Status.QUEUED ) {
+                        return;
+                    }
+
+                    file.setStatus( Status.INTERRUPT );
+                    $.each( me.pool, function( _, v ) {
+
+                        // 只 abort 指定的文件。
+                        if (v.file !== file) {
+                            return;
+                        }
+
+                        v.transport && v.transport.abort();
+                        me._putback(v);
+                        me._popBlock(v);
+                    });
+
+                    return Base.nextTick( me.__tick );
+                }
+
+                me.runing = false;
+
+                if (this._promise && this._promise.file) {
+                    this._promise.file.setStatus( Status.INTERRUPT );
+                }
+
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+
+                me.owner.trigger('stopUpload');
+            },
+
+            /**
+             * @method cancelFile
+             * @grammar cancelFile( file ) => undefined
+             * @grammar cancelFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 标记文件状态为已取消, 同时将中断文件传输。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.cancelFile( file );
+             * })
+             */
+            cancelFile: function( file ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                file.setStatus( Status.CANCELLED );
+                this.owner.trigger( 'fileDequeued', file );
+            },
+
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.progress;
+            },
+
+            _getStats: function() {
+                return this.request('get-stats');
+            },
+
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                this.owner.trigger( 'uploadSkip', file );
+            },
+
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+
+                    fn = function( val ) {
+                        me._promise = null;
+
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me._getStats().numOfQueue &&
+                    !me._getStats().numofInterrupt ) {
+                    me.runing = false;
+
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+
+            _putback: function(block) {
+                var idx;
+
+                block.cuted.unshift(block);
+                idx = this.stack.indexOf(block.cuted);
+
+                if (!~idx) {
+                    this.stack.unshift(block.cuted);
+                }
+            },
+
+            _getStack: function() {
+                var i = 0,
+                    act;
+
+                while ( (act = this.stack[ i++ ]) ) {
+                    if ( act.has() && act.file.getStatus() === Status.PROGRESS ) {
+                        return act;
+                    } else if (!act.has() ||
+                            act.file.getStatus() !== Status.PROGRESS &&
+                            act.file.getStatus() !== Status.INTERRUPT ) {
+
+                        // 把已经处理完了的,或者,状态为非 progress(上传中)、
+                        // interupt(暂停中) 的移除。
+                        this.stack.splice( --i, 1 );
+                    }
+                }
+
+                return null;
+            },
+
+            _nextBlock: function() {
+                var me = this,
+                    opts = me.options,
+                    act, next, done, preparing;
+
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( (act = this._getStack()) ) {
+
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+
+                    return act.shift();
+
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me._getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me.stack.push(act);
+                        return act.shift();
+                    };
+
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    if ( isPromise( next) ) {
+                        preparing = next.file;
+                        next = next[ next.pipe ? 'pipe' : 'then' ]( done );
+                        next.file = preparing;
+                        return next;
+                    }
+
+                    return done( next );
+                }
+            },
+
+
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.PROGRESS ||
+                            file.getStatus() === Status.INTERRUPT ) {
+                            return file;
+                        }
+
+                        return me._finishFile( file );
+                    });
+
+                    me.owner.trigger( 'uploadStart', file );
+                    file.setStatus( Status.PROGRESS );
+
+                    promise.file = file;
+
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+
+                    pending.push( promise );
+                }
+            },
+
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+
+                // 有可能在 before-send-file 的 promise 期间改变了文件状态。
+                // 如:暂停,取消
+                // 我们不能中断 promise, 但是可以在 promise 完后,不做上传操作。
+                if ( file.getStatus() !== Status.PROGRESS ) {
+
+                    // 如果是中断,则还需要放回去。
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        me._putback(block);
+                    }
+
+                    return;
+                }
+
+                me.pool.push( block );
+                me.remaning++;
+
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me.updateFileProgress( file );
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+
+
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @param {Object} headers 可以扩展此对象来控制上传头部。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+
+
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+
+                block.transport = tr;
+
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    block.percentage = percentage;
+                    me.updateFileProgress( file );
+                });
+
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+
+                    return reject;
+                };
+
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+
+                        block.retried++;
+                        tr.send();
+
+                    } else {
+
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            },
+
+            updateFileProgress: function(file) {
+                var totalPercent = 0,
+                    uploaded = 0;
+
+                if (!file.blocks) {
+                    return;
+                }
+
+                $.each( file.blocks, function( _, v ) {
+                    uploaded += (v.percentage || 0) * (v.end - v.start);
+                });
+
+                totalPercent = uploaded / file.size;
+                this.owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+            }
+
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+
+        var $ = Base.$,
+            validators = {},
+            api;
+
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * * `Q_TYPE_DENIED` 当文件类型不满足时触发。。
+         * @for  Uploader
+         */
+
+        // 暴露给外面的api
+        api = {
+
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            name: 'validator',
+
+            init: function() {
+                var me = this;
+                Base.nextTick(function() {
+                    $.each( validators, function() {
+                        this.call( me.owner );
+                    });
+                });
+            }
+        });
+
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileNumLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return count >= max ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileSizeLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return invalid ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', max, file );
+                    return false;
+                }
+
+            });
+
+        });
+
+        /**
+         * @property {Boolean} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+
+            if ( opts.duplicate ) {
+                return;
+            }
+
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+
+                return hash;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (mapping[ hash ] = true);
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (delete mapping[ hash ]);
+            });
+
+            uploader.on( 'reset', function() {
+                mapping = {};
+            });
+        });
+
+        return api;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+
+        function CompBase( owner, runtime ) {
+
+            this.owner = owner;
+            this.options = owner.options;
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var type = 'html5',
+            components = {};
+
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destroy = this.destroy;
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+
+            me.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+        }
+
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+
+        });
+
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+
+                blob = slice.call( blob, start, end );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+
+                e = e.originalEvent || e;
+
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+
+                return false;
+            },
+
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+
+                return false;
+            },
+
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 ),
+                    dataTransfer, data;
+
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                e = e.originalEvent || e;
+                dataTransfer = e.dataTransfer;
+
+                // 如果是页面内拖拽,还不能处理,不阻止事件。
+                // 此处 ie11 下会报参数错误,
+                try {
+                    data = dataTransfer.getData('text/html');
+                } catch( err ) {
+                }
+
+                if ( data ) {
+                    return;
+                }
+
+                me._getTansferFiles( dataTransfer, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( dataTransfer, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, file, item, i, len, canAccessFolder;
+
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+
+                Base.when.apply( Base, promises ).done(function() {
+
+                    if ( !results.length ) {
+                        return;
+                    }
+
+                    callback( results );
+                });
+            },
+
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                var elem = this.elem;
+
+                // 还没 init 就调用 destroy
+                if (!elem) {
+                    return;
+                }
+
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragOverHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+
+                    allowed.push( new File( ruid, blob ) );
+                }
+
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var $ = Base.$;
+
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    label = this.label = $( document.createElement('label') ),
+                    input =  this.input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+
+                label.on( 'click', function() {
+                    input.trigger('click');
+                });
+
+                label.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+
+                    input.attr( 'accept', arr.join(',') );
+                }
+
+                container.append( input );
+                container.append( label );
+
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+
+                    me.files = e.target.files;
+
+                    // reset input
+                    clone = this.cloneNode( true );
+                    clone.value = null;
+                    this.parentNode.replaceChild( clone, this );
+
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+
+                    owner.trigger('change');
+                });
+
+                label.on( 'mouseenter mouseleave', mouseHandler );
+
+            },
+
+
+            getFiles: function() {
+                return this.files;
+            },
+
+            destroy: function() {
+                this.input.off();
+                this.label.off();
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var noop = Base.noop,
+            $ = Base.$;
+
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+
+                if ( binary ) {
+                    // 强制设置成 content-type 为文件流。
+                    xhr.overrideMimeType &&
+                            xhr.overrideMimeType('application/octet-stream');
+
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+
+            getResponse: function() {
+                return this._response;
+            },
+
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+
+                    return me.trigger( 'progress', percentage );
+                };
+
+                xhr.onreadystatechange = function() {
+
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+
+
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+
+            _parseJson: function( str ) {
+                var json;
+
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+
+
+        function getFlashVersion() {
+            var version;
+
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destroy = this.destroy,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                clients[ uid ] = client;
+
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+
+                    instance = pool[ uid ];
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+
+                return me.flashExec.apply( client, arguments );
+            };
+
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+
+                // console.log.apply( console, arguments );
+
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+
+                // Base.log( evt, obj );
+            }
+
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+
+            this.jsreciver = jsreciver;
+
+            this.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+
+                return flash.exec( this.uid, comp, fn, args );
+            };
+
+            // @todo
+        }
+
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+
+                container.html( html );
+            },
+
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+
+        });
+
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+
+            return component;
+        };
+
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+
+                delete copy.button;
+                delete copy.id;
+                delete copy.container;
+
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+
+            destroy: function() {
+                this.flashExec( 'FilePicker', 'destroy' );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+
+                xhr.connectRuntime( blob.ruid );
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server,
+                    forceURLStream: opts.forceURLStream,
+                    mimeType: 'application/octet-stream'
+                }, binary );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            getResponse: function() {
+                return this._response || '';
+            },
+
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    var percent = e.loaded / e.total;
+                    percent = Math.min( 1, Math.max( 0, percent ) );
+                    return me.trigger( 'progress', percent );
+                });
+
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        readBody = false,
+                        err = '',
+                        p;
+
+                    xhr.off();
+                    me._xhr = null;
+
+                    if ( status >= 200 && status < 300 ) {
+                        readBody = true;
+                    } else if ( status >= 500 && status < 600 ) {
+                        readBody = true;
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+
+                    if ( readBody ) {
+                        me._response = xhr.exec('getResponse');
+                        me._response = decodeURIComponent( me._response );
+
+                        // flash 处理可能存在 bug, 没辙只能靠 js 了
+                        // try {
+                        //     me._responseJson = xhr.exec('getResponseAsJson');
+                        // } catch ( error ) {
+
+                        p = window.JSON && window.JSON.parse || function( s ) {
+                            try {
+                                return new Function('return ' + s).call();
+                            } catch ( err ) {
+                                return {};
+                            }
+                        };
+                        me._responseJson  = me._response ? p(me._response) : {};
+
+                        // }
+                    }
+
+                    xhr.destroy();
+                    xhr = null;
+
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/flash/blob',[
+        'runtime/flash/runtime',
+        'lib/blob'
+    ], function( FlashRuntime, Blob ) {
+
+        return FlashRuntime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.flashExec( 'Blob', 'slice', start, end );
+
+                return new Blob( blob.uid, blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview 没有图像处理的版本。
+     */
+    define('preset/withoutimage',[
+        'base',
+
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/transport',
+
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/transport',
+        'runtime/flash/blob'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/withoutimage'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.noimage.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.noimage.min.js
new file mode 100644
index 0000000..7d889db
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.noimage.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.5 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}return a},j=function(c){return a.__dollar=c,i(b(a,f,e))};"object"==typeof module&&"object"==typeof module.exports?module.exports=j():"function"==typeof define&&define.amd?define(["jquery"],j):(c=a.WebUploader,a.WebUploader=j(),a.WebUploader.noConflict=function(){a.WebUploader=c})}(window,function(a,b,c){return b("dollar-third",[],function(){var b=a.__dollar||a.jQuery||a.Zepto;if(!b)throw new Error("jQuery or Zepto not found!");return b}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.5",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",cancelFile:"cancel-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",md5File:"md5-file",getDimension:"get-dimension",addButton:"add-btn",predictRuntimeType:"predict-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return a?{successNum:a.numOfSuccess,progressNum:a.numOfProgress,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue,interruptNum:a.numofInterrupt}:{}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},destroy:function(){this.request("destroy",arguments),this.off()},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,this._parent=a,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.remove(),this._parent&&this._parent.removeClass("webuploader-container"),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g=b.prototype.destroy,h={},i=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):h},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[],c=a.options.disableWidgets||"";return e.each(i,function(d,e){(!c||!~c.indexOf(e._name))&&b.push(new e(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,g,i,j,k=0,l=this._widgets,m=l&&l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],g=f.invoke(b,d),g!==h&&(a.isPromise(g)?o.push(g):n.push(g));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return 1===c.length&&(c=c[0]),setTimeout(function(){b.resolve(c)},1),b.promise()})[e?j:"done"](e||a.noop)):n[0]},destroy:function(){g.apply(this,arguments),this._widgets=null}}),b.register=d.register=function(b,c){var f,g={init:"init",destroy:"destroy",name:"anonymous"};return 1===arguments.length?(c=b,e.each(c,function(a){return"_"===a[0]||"name"===a?void("name"===a&&(g.name=c.name)):void(g[a.replace(/[A-Z]/g,"-$&").toLowerCase()]=a)})):g=e.extend(g,b),c.responseMap=g,f=a.inherits(d,c),f._name=g.name,i.push(f),f},b.unRegister=d.unRegister=function(a){if(a&&"anonymous"!==a)for(var b=i.length;b--;)i[b]._name===a&&i.splice(b,1)},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({name:"dnd",init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return this.dnd=e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}},destroy:function(){this.dnd&&this.dnd.destroy()}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({name:"paste",init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return this.paste=e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}},destroy:function(){this.paste&&this.paste.destroy()}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,this.size=c.size||0,this.type=!c.type&&this.ext&&~"jpg,jpeg,png,gif,bmp".indexOf(this.ext)?"image/"+("jpg"===this.ext?"jpeg":this.ext):c.type||"application/octet-stream",b.call(d,"Blob"),this.uid=c.uid||this.uid,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&c.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(c.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString(),b.apply(this,arguments)}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var c=this,e=c.options,g=e.button;g.addClass("webuploader-pick"),c.on("all",function(a){var b;switch(a){case"mouseenter":g.addClass("webuploader-pick-hover");break;case"mouseleave":g.removeClass("webuploader-pick-hover");break;case"change":b=c.exec("getFiles"),c.trigger("select",f.map(b,function(a){return a=new d(c.getRuid(),a),a._refer=e.container,a}),e.container)}}),c.connectRuntime(e,function(){c.refresh(),c.exec("init",e),c.trigger("ready")}),this._resizeHandler=b.bindFn(this.refresh,this),f(a).on("resize",this._resizeHandler)},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){var b=this.options.button;f(a).off("resize",this._resizeHandler),b.removeClass("webuploader-pick-disable webuploader-pick-hover webuploader-pick")}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({name:"picker",init:function(a){return this.pickers=[],a.pick&&this.addBtn(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addBtn:function(b){var e=this,f=e.options,g=f.accept,h=[];if(b)return d.isPlainObject(b)||(b={id:b}),d(b.id).each(function(){var i,j,k;k=a.Deferred(),i=d.extend({},b,{accept:d.isPlainObject(g)?[g]:g,swf:f.swf,runtimeOrder:f.runtimeOrder,id:this}),j=new c(i),j.once("ready",k.resolve),j.on("select",function(a){e.owner.request("add-file",[a])}),j.init(),e.pickers.push(j),h.push(k.promise())}),a.when.apply(a,h)},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})},destroy:function(){d.each(this.pickers,function(){this.destroy()}),this.pickers=null}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application/octet-stream",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destroy:function(){this.off(),delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0,numofDeleted:0,numofInterrupt:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},removeFile:function(a){var b=this._map[a.id];b&&(delete this._map[a.id],a.destroy(),this.stats.numofDeleted++)},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)}))},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--;break;case f.INTERRUPT:c.numofInterrupt--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++;break;case f.INTERRUPT:c.numofInterrupt++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({name:"queue",init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),this.placeholder=l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||!a.size||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFile:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&setTimeout(function(){b.request("start-upload")},20)},getStats:function(){return this.stats},removeFile:function(a,b){var c=this;a=a.id?a:c.queue.getFile(a),this.request("cancel-file",a),b&&this.queue.removeFile(a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.owner.trigger("reset"),this.queue=new c,this.stats=this.queue.stats},destroy:function(){this.reset(),this.placeholder&&this.placeholder.destroy()}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({name:"runtime",init:function(){if(!this.predictRuntimeType())throw Error("Runtime Error")},predictRuntimeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){var c,d,e=[],f=a.source,g=f.size,h=b?Math.ceil(g/b):1,i=0,j=0;for(d={file:a,has:function(){return!!e.length},shift:function(){return e.shift()},unshift:function(a){e.unshift(a)}};h>j;)c=Math.min(b,g-i),e.push({file:a,start:i,end:b?i+c:g,total:g,chunks:h,chunk:j++,cuted:d}),i+=c;return a.blocks=e.concat(),a.remaning=e.length,d}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:{}}),b.register({name:"upload",init:function(){var b=this.owner,c=this;this.runing=!1,this.progress=!1,b.on("startUpload",function(){c.progress=!0}).on("uploadFinished",function(){c.progress=!1}),this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},reset:function(){this.request("stop-upload",!0),this.runing=!1,this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this._trigged=!1,this._promise=null},startUpload:function(b){var c=this;if(f.each(c.request("get-files",h.INVALID),function(){c.request("remove-file",this)}),b)if(b=b.id?b:c.request("get-file",b),b.getStatus()===h.INTERRUPT)f.each(c.pool,function(a,c){c.file===b&&c.transport&&c.transport.send()}),b.setStatus(h.QUEUED);else{if(b.getStatus()===h.PROGRESS)return;b.setStatus(h.QUEUED)}else f.each(c.request("get-files",[h.INITED]),function(){this.setStatus(h.QUEUED)});if(!c.runing){c.runing=!0;var d=[];f.each(c.pool,function(a,b){var e=b.file;e.getStatus()===h.INTERRUPT&&(d.push(e),c._trigged=!1,b.transport&&b.transport.send())});for(var b;b=d.shift();)b.setStatus(h.PROGRESS);b||f.each(c.request("get-files",h.INTERRUPT),function(){this.setStatus(h.PROGRESS)}),c._trigged=!1,a.nextTick(c.__tick),c.owner.trigger("startUpload")}},stopUpload:function(b,c){var d=this;if(b===!0&&(c=b,b=null),d.runing!==!1){if(b){if(b=b.id?b:d.request("get-file",b),b.getStatus()!==h.PROGRESS&&b.getStatus()!==h.QUEUED)return;return b.setStatus(h.INTERRUPT),f.each(d.pool,function(a,c){c.file===b&&(c.transport&&c.transport.abort(),d._putback(c),d._popBlock(c))}),a.nextTick(d.__tick)}d.runing=!1,this._promise&&this._promise.file&&this._promise.file.setStatus(h.INTERRUPT),c&&f.each(d.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),d.owner.trigger("stopUpload")}},cancelFile:function(a){a=a.id?a:this.request("get-file",a),a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),a.setStatus(h.CANCELLED),this.owner.trigger("fileDequeued",a)},isInProgress:function(){return!!this.progress},_getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=a.id?a:this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d._getStats().numOfQueue||d._getStats().numofInterrupt||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_putback:function(a){var b;a.cuted.unshift(a),b=this.stack.indexOf(a.cuted),~b||this.stack.unshift(a.cuted)},_getStack:function(){for(var a,b=0;a=this.stack[b++];){if(a.has()&&a.file.getStatus()===h.PROGRESS)return a;(!a.has()||a.file.getStatus()!==h.PROGRESS&&a.file.getStatus()!==h.INTERRUPT)&&this.stack.splice(--b,1)}return null},_nextBlock:function(){var a,b,c,d,f=this,h=f.options;return(a=this._getStack())?(h.prepareNextFile&&!f.pending.length&&f._prepareNextFile(),a.shift()):f.runing?(!f.pending.length&&f._getStats().numOfQueue&&f._prepareNextFile(),b=f.pending.shift(),c=function(b){return b?(a=e(b,h.chunked?h.chunkSize:0),f.stack.push(a),a.shift()):null},g(b)?(d=b.file,b=b[b.pipe?"pipe":"then"](c),b.file=d,b):c(b)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.PROGRESS||c.getStatus()===h.INTERRUPT?c:b._finishFile(c)}),b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),a.file=c,a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;return e.getStatus()!==h.PROGRESS?void(e.getStatus()===h.INTERRUPT&&d._putback(b)):(d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),void c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d.updateFileProgress(e),d._popBlock(b),a.nextTick(d.__tick))}))},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){b.percentage=a,g.updateFileProgress(k)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})},updateFileProgress:function(a){var b=0,c=0;a.blocks&&(f.each(a.blocks,function(a,b){c+=(b.percentage||0)*(b.end-b.start)}),b=c/a.size,this.owner.trigger("uploadProgress",a,b||0))}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({name:"validator",init:function(){var b=this;a.nextTick(function(){e.each(f,function(){this.call(b.owner)})})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileNumLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("reset",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileSizeLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("reset",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",d,a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}),b.on("reset",function(){d={}}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destroy;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destroy=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;
+return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b,f,g=this,h=g.getRuid(),i=g.elem.parent().get(0);if(i&&!d.contains(i,a.currentTarget))return!1;a=a.originalEvent||a,b=a.dataTransfer;try{f=b.getData("text/html")}catch(j){}return f?void 0:(g._getTansferFiles(b,function(a){g.trigger("drop",d.map(a,function(a){return new c(h,a)}))}),g.dndOver=!1,g.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k=[],l=[];for(d=b.items,e=b.files,j=!(!d||!d[0].webkitGetAsEntry),h=0,i=e.length;i>h;h++)f=e[h],g=d&&d[h],j&&g.webkitGetAsEntry().isDirectory?l.push(this._traverseDirectoryTree(g.webkitGetAsEntry(),k)):k.push(f);a.when.apply(a,l).done(function(){k.length&&c(k)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a&&(a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragOverHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler)))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=this.label=c(document.createElement("label")),k=this.input=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),b.value=null,this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){this.input.off(),this.label.off()}})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType&&h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destroy,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destroy=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.id,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){this.flashExec("FilePicker","destroy")}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(b,c,d){var e=b.$;return c.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,d=this._initAjax(),f=b._blob,g=c.server;d.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+e.param(b._formData),a=f.uid):(e.each(b._formData,function(a,b){d.exec("append",a,b)}),d.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(d,c.headers),d.exec("send",{method:c.method,url:g,forceURLStream:c.forceURLStream,mimeType:"application/octet-stream"},a)},getStatus:function(){return this._status},getResponse:function(){return this._response||""},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var b=this,c=new d("XMLHttpRequest");return c.on("uploadprogress progress",function(a){var c=a.loaded/a.total;return c=Math.min(1,Math.max(0,c)),b.trigger("progress",c)}),c.on("load",function(){var d,e=c.exec("getStatus"),f=!1,g="";return c.off(),b._xhr=null,e>=200&&300>e?f=!0:e>=500&&600>e?(f=!0,g="server"):g="http",f&&(b._response=c.exec("getResponse"),b._response=decodeURIComponent(b._response),d=a.JSON&&a.JSON.parse||function(a){try{return new Function("return "+a).call()}catch(b){return{}}},b._responseJson=b._response?d(b._response):{}),c.destroy(),c=null,g?b.trigger("error",g):b.trigger("load")}),c.on("error",function(){c.off(),b._xhr=null,b.trigger("error","http")}),b._xhr=c,c},_setRequestHeader:function(a,b){e.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("runtime/flash/blob",["runtime/flash/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.flashExec("Blob","slice",a,c);return new b(d.uid,d)}})}),b("preset/withoutimage",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/transport","runtime/flash/filepicker","runtime/flash/transport","runtime/flash/blob"],function(a){return a}),b("webuploader",["preset/withoutimage"],function(a){return a}),c("webuploader")});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.nolog.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.nolog.js
new file mode 100644
index 0000000..b6624e6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.nolog.js
@@ -0,0 +1,8012 @@
+/*! WebUploader 0.1.5 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+
+            return obj;
+        },
+
+        makeExport = function( dollar ) {
+            root.__dollar = dollar;
+
+            // exports every module.
+            return exportsTo( factory( root, _define, _require ) );
+        },
+
+        origin;
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = makeExport();
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([ 'jquery' ], makeExport );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = makeExport();
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( window, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        var $ = window.__dollar || window.jQuery || window.Zepto;
+
+        if ( !$ ) {
+            throw new Error('jQuery or Zepto not found!');
+        }
+
+        return $;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id为该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档中对类的使用可能省略掉了`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+
+        var noop = function() {},
+            call = Function.call;
+
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+
+        function createObject( proto ) {
+            var f;
+
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+
+
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.5',
+
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+
+            Deferred: promise.Deferred,
+
+            isPromise: promise.isPromise,
+
+            when: promise.when,
+
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match( /(?:trident)(?:.*rv:([\w.]+))?/i ),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+
+                /* jshint camelcase: false */
+
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+
+                return child;
+            },
+
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数noop](#WebUploader:Base.noop)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+
+            nextTick: (function() {
+
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+
+            while ( ++i < len ) {
+                handler = events[ i ];
+
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+
+            return !stoped;
+        }
+
+        protos = {
+
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+
+                if ( !callback ) {
+                    return this;
+                }
+
+                set = this._events || (this._events = []);
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+
+                    set.push( handler );
+                });
+
+                return this;
+            },
+
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+
+                if ( !callback ) {
+                    return me;
+                }
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+
+                return me;
+            },
+
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+
+                if ( !events ) {
+                    return this;
+                }
+
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+
+                return this;
+            },
+
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+
+                if ( !this._events || !type ) {
+                    return this;
+                }
+
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$;
+
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            cancelFile: 'cancel-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            md5File: 'md5-file',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            predictRuntimeType: 'predict-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+
+            _init: function( opts ) {
+                var me = this;
+
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     compress: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.option( 'compress', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+
+                // setter
+                if ( arguments.length > 1 ) {
+
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `progressNum` 上传中的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `queueNum` 还在队列中的文件数
+             * * `interruptNum` 被暂停的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+
+                return stats ? {
+                    successNum: stats.numOfSuccess,
+                    progressNum: stats.numOfProgress,
+
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue,
+                    interruptNum: stats.numofInterrupt
+                } : {};
+            },
+
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+
+                    return false;
+                }
+
+                return true;
+            },
+
+            /**
+             * 销毁 webuploader 实例
+             * @method destroy
+             * @grammar destroy() => undefined
+             */
+            destroy: function() {
+                this.request( 'destroy', arguments );
+                this.off();
+            },
+
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            factories = {},
+
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+
+        $.extend( Runtime.prototype, {
+
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+
+                if ( this._container ) {
+                    return this._container;
+                }
+
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                this._parent = parent;
+                return container;
+            },
+
+            init: Base.noop,
+            exec: Base.noop,
+
+            destroy: function() {
+                this._container && this._container.remove();
+                this._parent && this._parent.removeClass('webuploader-container');
+                this.off();
+            }
+        });
+
+        Runtime.orders = 'html5,flash';
+
+
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+
+            type = type || getFirstKey( factories );
+
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+
+        var cache;
+
+        cache = (function() {
+            var obj = {};
+
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+
+                get: function( ruid, standalone ) {
+                    var i;
+
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+
+                        return obj[ i ];
+                    }
+
+                    return null;
+                },
+
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+
+            this.uid = Base.guid('client_');
+
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+
+            this.connectRuntime = function( opts, cb ) {
+
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+
+                deferred.done( cb );
+
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                runtime.__client--;
+
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+
+                runtime = null;
+            };
+
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+
+                return runtime.exec.apply( this, args );
+            };
+
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+
+            opts.container = $( opts.container );
+
+            if ( !opts.container.length ) {
+                return;
+            }
+
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( DragAndDrop.prototype );
+
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            _destroy = Uploader.prototype.destroy,
+            IGNORE = {},
+            widgetClass = [];
+
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+
+            var length = obj.length,
+                type = $.type( obj );
+
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+
+        $.extend( Widget.prototype, {
+
+            init: Base.noop,
+
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+
+                    return IGNORE;
+                }
+
+                return this[ map[ apiName ] ].apply( this, args );
+
+            },
+
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+
+            /**
+             * @property {String | Array} [disableWidgets=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 默认所有 Uploader.register 了的 widget 都会被加载,如果禁用某一部分,请通过此 option 指定黑名单。
+             */
+
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [],
+                    deactives = me.options.disableWidgets || '';
+
+                $.each( widgetClass, function( _, klass ) {
+                    (!deactives || !~deactives.indexOf( klass._name )) &&
+                        widgets.push( new klass( me ) );
+                });
+
+                return _init.apply( me, arguments );
+            },
+
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets && widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+
+                args = isArrayLike( args ) ? args : [ args ];
+
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+
+                    if ( rlt !== IGNORE ) {
+
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个 tick 中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+
+                                if ( args.length === 1 ) {
+                                    args = args[ 0 ];
+                                }
+
+                                setTimeout(function() {
+                                    deferred.resolve( args );
+                                }, 1 );
+
+                                return deferred.promise();
+                            })[ callback ? key : 'done' ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            },
+
+            destroy: function() {
+                _destroy.apply( this, arguments );
+                this._widgets = null;
+            }
+        });
+
+        /**
+         * 添加组件
+         * @grammar Uploader.register(proto);
+         * @grammar Uploader.register(map, proto);
+         * @param  {object} responseMap API 名称与函数实现的映射
+         * @param  {object} proto 组件原型,构造函数通过 constructor 属性定义
+         * @method Uploader.register
+         * @for Uploader
+         * @example
+         * Uploader.register({
+         *     'make-thumb': 'makeThumb'
+         * }, {
+         *     init: function( options ) {},
+         *     makeThumb: function() {}
+         * });
+         *
+         * Uploader.register({
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init', destroy: 'destroy', name: 'anonymous' },
+                klass;
+
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+
+                // 自动生成 map 表。
+                $.each(widgetProto, function(key) {
+                    if ( key[0] === '_' || key === 'name' ) {
+                        key === 'name' && (map.name = widgetProto.name);
+                        return;
+                    }
+
+                    map[key.replace(/[A-Z]/g, '-$&').toLowerCase()] = key;
+                });
+
+            } else {
+                map = $.extend( map, responseMap );
+            }
+
+            widgetProto.responseMap = map;
+            klass = Base.inherits( Widget, widgetProto );
+            klass._name = map.name;
+            widgetClass.push( klass );
+
+            return klass;
+        };
+
+        /**
+         * 删除插件,只有在注册时指定了名字的才能被删除。
+         * @grammar Uploader.unRegister(name);
+         * @param  {string} name 组件名字
+         * @method Uploader.unRegister
+         * @for Uploader
+         * @example
+         *
+         * Uploader.register({
+         *     name: 'custom',
+         *
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         *
+         * Uploader.unRegister('custom');
+         */
+        Uploader.unRegister = Widget.unRegister = function( name ) {
+            if ( !name || name === 'anonymous' ) {
+                return;
+            }
+
+            // 删除指定的插件。
+            for ( var i = widgetClass.length; i--; ) {
+                if ( widgetClass[i]._name === name ) {
+                    widgetClass.splice(i, 1)
+                }
+            }
+        };
+
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+
+        Uploader.options.dnd = '';
+
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @property {Selector} [disableGlobalDnd=false]  是否禁掉整个页面的拖拽功能,如果不禁用,图片拖进来的时候会默认被浏览器打开。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            name: 'dnd',
+
+            init: function( opts ) {
+
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+
+                this.dnd = dnd = new Dnd( options );
+
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+
+                dnd.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.dnd && this.dnd.destroy();
+            }
+        });
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( FilePaste.prototype );
+
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            name: 'paste',
+
+            init: function( opts ) {
+
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+
+                this.paste = paste = new FilePaste( options );
+
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.paste && this.paste.destroy();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+
+        function Blob( ruid, source ) {
+            var me = this;
+
+            me.source = source;
+            me.ruid = ruid;
+            this.size = source.size || 0;
+
+            // 如果没有指定 mimetype, 但是知道文件后缀。
+            if ( !source.type && this.ext &&
+                    ~'jpg,jpeg,png,gif,bmp'.indexOf( this.ext ) ) {
+                this.type = 'image/' + (this.ext === 'jpg' ? 'jpeg' : this.ext);
+            } else {
+                this.type = source.type || 'application/octet-stream';
+            }
+
+            RuntimeClient.call( me, 'Blob' );
+            this.uid = source.uid || this.uid;
+
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+
+            getSource: function() {
+                return this.source;
+            }
+        });
+
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+
+        function File( ruid, file ) {
+            var ext;
+
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+
+            // todo 支持其他类型文件的转换。
+            // 如果有 mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && file.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( file.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+
+            Blob.apply( this, arguments );
+        }
+
+        return Base.inherits( Blob, File );
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+
+        var $ = Base.$;
+
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+
+            opts.container = $( opts.id );
+
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+
+                button.addClass('webuploader-pick');
+
+                me.on( 'all', function( type ) {
+                    var files;
+
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+
+                this._resizeHandler = Base.bindFn( this.refresh, this );
+                $( window ).on( 'resize', this._resizeHandler );
+            },
+
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+
+                    pos = button.offset();
+
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+
+            enable: function() {
+                var btn = this.options.button;
+
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+
+            disable: function() {
+                var btn = this.options.button;
+
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+
+                btn.addClass('webuploader-pick-disable');
+            },
+
+            destroy: function() {
+                var btn = this.options.button;
+                $( window ).off( 'resize', this._resizeHandler );
+                btn.removeClass('webuploader-pick-disable webuploader-pick-hover ' +
+                    'webuploader-pick');
+            }
+        });
+
+        return FilePicker;
+    });
+
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor|dom} 指定选择文件的按钮容器,不指定则不创建按钮。**注意** 这里虽然写的是 id, 但是不是只支持 id, 还支持 class, 或者 dom 节点。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+
+        return Uploader.register({
+            name: 'picker',
+
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addBtn( opts.pick );
+            },
+
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addBtn: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    promises = [];
+
+                if ( !pick ) {
+                    return;
+                }
+
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+
+                $( pick.id ).each(function() {
+                    var options, picker, deferred;
+
+                    deferred = Base.Deferred();
+
+                    options = $.extend({}, pick, {
+                        accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                        swf: opts.swf,
+                        runtimeOrder: opts.runtimeOrder,
+                        id: this
+                    });
+
+                    picker = new FilePicker( options );
+
+                    picker.once( 'ready', deferred.resolve );
+                    picker.on( 'select', function( files ) {
+                        me.owner.request( 'add-file', [ files ]);
+                    });
+                    picker.init();
+
+                    me.pickers.push( picker );
+
+                    promises.push( deferred.promise() );
+                });
+
+                return Base.when.apply( Base, promises );
+            },
+
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            },
+
+            destroy: function() {
+                $.each( this.pickers, function() {
+                    this.destroy();
+                });
+                this.pickers = null;
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+
+        // 默认选项。
+        Image.options = {
+
+            // 默认的图片处理质量
+            quality: 90,
+
+            // 是否裁剪
+            crop: false,
+
+            // 是否保留头部信息
+            preserveHeaders: false,
+
+            // 是否允许放大。
+            allowMagnify: false
+        };
+
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+
+            info: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+
+                // getter
+                return this._info;
+            },
+
+            meta: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+
+                // getter
+                return this._meta;
+            },
+
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+
+            crop: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'crop' ].concat( args ) );
+            },
+
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+
+        var $ = Base.$,
+            throttle;
+
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true,
+             *
+             *     // 如果发现压缩后文件大小比原来还大,则使用原来图片
+             *     // 此属性可能会影响图片自动纠正功能
+             *     noCompressIfLarger: false,
+             *
+             *     // 单位字节,如果图片大小小于此值,不会采用压缩。
+             *     compressSize: 0
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+
+        return Uploader.register({
+
+            name: 'image',
+
+
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * 当 width 或者 height 的值介于 0 - 1 时,被当成百分比使用。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             * 也可以借助服务端,将 base64 数据传给服务端,生成一个临时文件供预览。
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+
+                file = this.request( 'get-file', file );
+
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+
+                opts = $.extend({}, this.options.thumb );
+
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+
+                width = width || opts.width;
+                height = height || opts.height;
+
+                image = new Image( opts );
+
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                // 当 resize 完后
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+
+                image.once( 'error', function( reason ) {
+                    cb( reason || true );
+                    image.destroy();
+                });
+
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+
+            beforeSendFile: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 0,
+                    noCompressIfLarger = opts && opts.noCompressIfLarger || false,
+                    image, deferred;
+
+                file = this.request( 'get-file', file );
+
+                // 只压缩 jpeg 图片格式。
+                // gif 可能会丢失针
+                // bmp png 基本上尺寸都不大,且压缩比比较小。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+
+                image = new Image( opts );
+
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    var width = opts.width,
+                        height = opts.height;
+
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+
+                    // 如果 width 的值介于 0 - 1
+                    // 说明设置的是百分比。
+                    if ( width <= 1 && width > 0 ) {
+                        width = file._info.width * width;
+                    }
+
+                    // 同样的规则应用于 height
+                    if ( height <= 1 && height > 0 ) {
+                        height = file._info.height * height;
+                    }
+
+                    image.resize( width, height );
+                });
+
+                image.once( 'complete', function() {
+                    var blob, size;
+
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+
+                        size = file.size;
+
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( !noCompressIfLarger || blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+
+                            file.trigger( 'resize', blob.size, size );
+                        }
+
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application/octet-stream'
+             */
+            this.type = source.type || 'application/octet-stream';
+
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+
+
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+
+            this.source = source;
+            this.loaded = 0;
+
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+
+        $.extend( WUFile.prototype, {
+
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+
+                var prevStatus = statusMap[ this.id ];
+
+                typeof text !== 'undefined' && (this.statusText = text);
+
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+
+            },
+
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+
+            destroy: function() {
+                this.off();
+                delete statusMap[ this.id ];
+            }
+        });
+
+        Mediator.installTo( WUFile.prototype );
+
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+
+        return WUFile;
+    });
+
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被取消的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * * `numofDeleted` 被移除的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0,
+                numofDeleted: 0,
+                numofInterrupt: 0
+            };
+
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+
+            // 存储所有文件
+            this._map = {};
+        }
+
+        $.extend( Queue.prototype, {
+
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+
+                status = status || STATUS.QUEUED;
+
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+
+                return null;
+            },
+
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+
+                    ret.push( file );
+                }
+
+                return ret;
+            },
+
+            /**
+             * 在队列中删除文件。
+             * @grammar removeFile( file ) => Array
+             * @method removeFile
+             * @param {File} 文件对象。
+             */
+            removeFile: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( existing ) {
+                    delete this._map[ file.id ];
+                    file.destroy();
+                    this.stats.numofDeleted++;
+                }
+            },
+
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+            },
+
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt--;
+                        break;
+                }
+
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt++;
+                        break;
+                }
+            }
+
+        });
+
+        Mediator.installTo( Queue.prototype );
+
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+
+        return Uploader.register({
+            name: 'queue',
+
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+
+                    me.accept = new RegExp( accept, 'i' );
+                }
+
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                this.placeholder = runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+
+
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+
+                    file = new WUFile( file );
+                }
+
+                return file;
+            },
+
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || !file.size || this.accept &&
+
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+
+                return !invalid;
+            },
+
+
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+
+            _addFile: function( file ) {
+                var me = this;
+
+                file = me._wrapFile( file );
+
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @property {Boolean} [auto=false]
+             * @namespace options
+             * @for Uploader
+             * @description 设置为 true 后,不需要手动调用上传,有文件选择即开始上传。
+             *
+             */
+
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFile: function( files ) {
+                var me = this;
+
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+
+                me.owner.trigger( 'filesQueued', files );
+
+                if ( me.options.auto ) {
+                    setTimeout(function() {
+                        me.request('start-upload');
+                    }, 20 );
+                }
+            },
+
+            getStats: function() {
+                return this.stats;
+            },
+
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+
+             /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @grammar removeFile( file, true ) => undefined
+             * @grammar removeFile( id, true ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件, 默认只会标记文件状态为已取消,如果第二个参数为 `true` 则会从 queue 中移除。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file, remove ) {
+                var me = this;
+
+                file = file.id ? file : me.queue.getFile( file );
+
+                this.request( 'cancel-file', file );
+
+                if ( remove ) {
+                    this.queue.removeFile( file );
+                }
+            },
+
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+
+                me.request('start-upload');
+            },
+
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+
+            /**
+             * @event reset
+             * @description 当 uploader 被重置的时候触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.owner.trigger('reset');
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            },
+
+            destroy: function() {
+                this.reset();
+                this.placeholder && this.placeholder.destroy();
+            }
+        });
+
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+
+        /**
+         * @property {Object} [runtimeOrder=html5,flash]
+         * @namespace options
+         * @for Uploader
+         * @description 指定运行时启动顺序。默认会想尝试 html5 是否支持,如果支持则使用 html5, 否则则使用 flash.
+         *
+         * 可以将此值设置成 `flash`,来强制使用 flash 运行时。
+         */
+
+        return Uploader.register({
+            name: 'runtime',
+
+            init: function() {
+                if ( !this.predictRuntimeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntimeType() => String
+             * @method predictRuntimeType
+             * @for  Uploader
+             */
+            predictRuntimeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+
+        var $ = Base.$;
+
+        function Transport( opts ) {
+            var me = this;
+
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+
+        Transport.options = {
+            server: '',
+            method: 'POST',
+
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+
+        $.extend( Transport.prototype, {
+
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+
+                if ( !duration ) {
+                    return;
+                }
+
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+
+        });
+
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+
+
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+
+
+            /**
+             * @property {Object} [formData={}]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: {}
+
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len, api;
+
+            api = {
+                file: file,
+
+                has: function() {
+                    return !!pending.length;
+                },
+
+                shift: function() {
+                    return pending.shift();
+                },
+
+                unshift: function( block ) {
+                    pending.unshift( block );
+                }
+            };
+
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++,
+                    cuted: api
+                });
+                start += len;
+            }
+
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+
+            return api;
+        }
+
+        Uploader.register({
+            name: 'upload',
+
+            init: function() {
+                var owner = this.owner,
+                    me = this;
+
+                this.runing = false;
+                this.progress = false;
+
+                owner
+                    .on( 'startUpload', function() {
+                        me.progress = true;
+                    })
+                    .on( 'uploadFinished', function() {
+                        me.progress = false;
+                    });
+
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+
+                // 缓存分好片的文件。
+                this.stack = [];
+
+                // 缓存即将上传的文件。
+                this.pending = [];
+
+                // 跟踪还有多少分片在上传中但是没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+
+                owner.on( 'uploadComplete', function( file ) {
+
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+
+            reset: function() {
+                this.request( 'stop-upload', true );
+                this.runing = false;
+                this.pool = [];
+                this.stack = [];
+                this.pending = [];
+                this.remaning = 0;
+                this._trigged = false;
+                this._promise = null;
+            },
+
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             *
+             * 可以指定开始某一个文件。
+             * @grammar upload() => undefined
+             * @grammar upload( file | fileId) => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            startUpload: function(file) {
+                var me = this;
+
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+
+                // 如果指定了开始某个文件,则只开始指定文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        $.each( me.pool, function( _, v ) {
+
+                            // 之前暂停过。
+                            if (v.file !== file) {
+                                return;
+                            }
+
+                            v.transport && v.transport.send();
+                        });
+
+                        file.setStatus( Status.QUEUED );
+                    } else if (file.getStatus() === Status.PROGRESS) {
+                        return;
+                    } else {
+                        file.setStatus( Status.QUEUED );
+                    }
+                } else {
+                    $.each( me.request( 'get-files', [ Status.INITED ] ), function() {
+                        this.setStatus( Status.QUEUED );
+                    });
+                }
+
+                if ( me.runing ) {
+                    return;
+                }
+
+                me.runing = true;
+
+                var files = [];
+
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        files.push(file);
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+
+                var file;
+                while ( (file = files.shift()) ) {
+                    file.setStatus( Status.PROGRESS );
+                }
+
+                file || $.each( me.request( 'get-files',
+                        Status.INTERRUPT ), function() {
+                    this.setStatus( Status.PROGRESS );
+                });
+
+                me._trigged = false;
+                Base.nextTick( me.__tick );
+                me.owner.trigger('startUpload');
+            },
+
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             *
+             * 如果第一个参数是文件,则只暂停指定文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @grammar stop( file ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stopUpload: function( file, interrupt ) {
+                var me = this;
+
+                if (file === true) {
+                    interrupt = file;
+                    file = null;
+                }
+
+                if ( me.runing === false ) {
+                    return;
+                }
+
+                // 如果只是暂停某个文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if ( file.getStatus() !== Status.PROGRESS &&
+                            file.getStatus() !== Status.QUEUED ) {
+                        return;
+                    }
+
+                    file.setStatus( Status.INTERRUPT );
+                    $.each( me.pool, function( _, v ) {
+
+                        // 只 abort 指定的文件。
+                        if (v.file !== file) {
+                            return;
+                        }
+
+                        v.transport && v.transport.abort();
+                        me._putback(v);
+                        me._popBlock(v);
+                    });
+
+                    return Base.nextTick( me.__tick );
+                }
+
+                me.runing = false;
+
+                if (this._promise && this._promise.file) {
+                    this._promise.file.setStatus( Status.INTERRUPT );
+                }
+
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+
+                me.owner.trigger('stopUpload');
+            },
+
+            /**
+             * @method cancelFile
+             * @grammar cancelFile( file ) => undefined
+             * @grammar cancelFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 标记文件状态为已取消, 同时将中断文件传输。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.cancelFile( file );
+             * })
+             */
+            cancelFile: function( file ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                file.setStatus( Status.CANCELLED );
+                this.owner.trigger( 'fileDequeued', file );
+            },
+
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.progress;
+            },
+
+            _getStats: function() {
+                return this.request('get-stats');
+            },
+
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                this.owner.trigger( 'uploadSkip', file );
+            },
+
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+
+                    fn = function( val ) {
+                        me._promise = null;
+
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me._getStats().numOfQueue &&
+                    !me._getStats().numofInterrupt ) {
+                    me.runing = false;
+
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+
+            _putback: function(block) {
+                var idx;
+
+                block.cuted.unshift(block);
+                idx = this.stack.indexOf(block.cuted);
+
+                if (!~idx) {
+                    this.stack.unshift(block.cuted);
+                }
+            },
+
+            _getStack: function() {
+                var i = 0,
+                    act;
+
+                while ( (act = this.stack[ i++ ]) ) {
+                    if ( act.has() && act.file.getStatus() === Status.PROGRESS ) {
+                        return act;
+                    } else if (!act.has() ||
+                            act.file.getStatus() !== Status.PROGRESS &&
+                            act.file.getStatus() !== Status.INTERRUPT ) {
+
+                        // 把已经处理完了的,或者,状态为非 progress(上传中)、
+                        // interupt(暂停中) 的移除。
+                        this.stack.splice( --i, 1 );
+                    }
+                }
+
+                return null;
+            },
+
+            _nextBlock: function() {
+                var me = this,
+                    opts = me.options,
+                    act, next, done, preparing;
+
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( (act = this._getStack()) ) {
+
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+
+                    return act.shift();
+
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me._getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me.stack.push(act);
+                        return act.shift();
+                    };
+
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    if ( isPromise( next) ) {
+                        preparing = next.file;
+                        next = next[ next.pipe ? 'pipe' : 'then' ]( done );
+                        next.file = preparing;
+                        return next;
+                    }
+
+                    return done( next );
+                }
+            },
+
+
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.PROGRESS ||
+                            file.getStatus() === Status.INTERRUPT ) {
+                            return file;
+                        }
+
+                        return me._finishFile( file );
+                    });
+
+                    me.owner.trigger( 'uploadStart', file );
+                    file.setStatus( Status.PROGRESS );
+
+                    promise.file = file;
+
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+
+                    pending.push( promise );
+                }
+            },
+
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+
+                // 有可能在 before-send-file 的 promise 期间改变了文件状态。
+                // 如:暂停,取消
+                // 我们不能中断 promise, 但是可以在 promise 完后,不做上传操作。
+                if ( file.getStatus() !== Status.PROGRESS ) {
+
+                    // 如果是中断,则还需要放回去。
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        me._putback(block);
+                    }
+
+                    return;
+                }
+
+                me.pool.push( block );
+                me.remaning++;
+
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me.updateFileProgress( file );
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+
+
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @param {Object} headers 可以扩展此对象来控制上传头部。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+
+
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+
+                block.transport = tr;
+
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    block.percentage = percentage;
+                    me.updateFileProgress( file );
+                });
+
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+
+                    return reject;
+                };
+
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+
+                        block.retried++;
+                        tr.send();
+
+                    } else {
+
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            },
+
+            updateFileProgress: function(file) {
+                var totalPercent = 0,
+                    uploaded = 0;
+
+                if (!file.blocks) {
+                    return;
+                }
+
+                $.each( file.blocks, function( _, v ) {
+                    uploaded += (v.percentage || 0) * (v.end - v.start);
+                });
+
+                totalPercent = uploaded / file.size;
+                this.owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+            }
+
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+
+        var $ = Base.$,
+            validators = {},
+            api;
+
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * * `Q_TYPE_DENIED` 当文件类型不满足时触发。。
+         * @for  Uploader
+         */
+
+        // 暴露给外面的api
+        api = {
+
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            name: 'validator',
+
+            init: function() {
+                var me = this;
+                Base.nextTick(function() {
+                    $.each( validators, function() {
+                        this.call( me.owner );
+                    });
+                });
+            }
+        });
+
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileNumLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return count >= max ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileSizeLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return invalid ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', max, file );
+                    return false;
+                }
+
+            });
+
+        });
+
+        /**
+         * @property {Boolean} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+
+            if ( opts.duplicate ) {
+                return;
+            }
+
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+
+                return hash;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (mapping[ hash ] = true);
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (delete mapping[ hash ]);
+            });
+
+            uploader.on( 'reset', function() {
+                mapping = {};
+            });
+        });
+
+        return api;
+    });
+
+    /**
+     * @fileOverview Md5
+     */
+    define('lib/md5',[
+        'runtime/client',
+        'mediator'
+    ], function( RuntimeClient, Mediator ) {
+
+        function Md5() {
+            RuntimeClient.call( this, 'Md5' );
+        }
+
+        // 让 Md5 具备事件功能。
+        Mediator.installTo( Md5.prototype );
+
+        Md5.prototype.loadFromBlob = function( blob ) {
+            var me = this;
+
+            if ( me.getRuid() ) {
+                me.disconnectRuntime();
+            }
+
+            // 连接到blob归属的同一个runtime.
+            me.connectRuntime( blob.ruid, function() {
+                me.exec('init');
+                me.exec( 'loadFromBlob', blob );
+            });
+        };
+
+        Md5.prototype.getResult = function() {
+            return this.exec('getResult');
+        };
+
+        return Md5;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/md5',[
+        'base',
+        'uploader',
+        'lib/md5',
+        'lib/blob',
+        'widgets/widget'
+    ], function( Base, Uploader, Md5, Blob ) {
+
+        return Uploader.register({
+            name: 'md5',
+
+
+            /**
+             * 计算文件 md5 值,返回一个 promise 对象,可以监听 progress 进度。
+             *
+             *
+             * @method md5File
+             * @grammar md5File( file[, start[, end]] ) => promise
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.md5File( file )
+             *
+             *         // 及时显示进度
+             *         .progress(function(percentage) {
+             *             console.log('Percentage:', percentage);
+             *         })
+             *
+             *         // 完成
+             *         .then(function(val) {
+             *             console.log('md5 result:', val);
+             *         });
+             *
+             * });
+             */
+            md5File: function( file, start, end ) {
+                var md5 = new Md5(),
+                    deferred = Base.Deferred(),
+                    blob = (file instanceof Blob) ? file :
+                        this.request( 'get-file', file ).source;
+
+                md5.on( 'progress load', function( e ) {
+                    e = e || {};
+                    deferred.notify( e.total ? e.loaded / e.total : 1 );
+                });
+
+                md5.on( 'complete', function() {
+                    deferred.resolve( md5.getResult() );
+                });
+
+                md5.on( 'error', function( reason ) {
+                    deferred.reject( reason );
+                });
+
+                if ( arguments.length > 1 ) {
+                    start = start || 0;
+                    end = end || 0;
+                    start < 0 && (start = blob.size + start);
+                    end < 0 && (end = blob.size + end);
+                    end = Math.min( end, blob.size );
+                    blob = blob.slice( start, end );
+                }
+
+                md5.loadFromBlob( blob );
+
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+
+        function CompBase( owner, runtime ) {
+
+            this.owner = owner;
+            this.options = owner.options;
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var type = 'html5',
+            components = {};
+
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destroy = this.destroy;
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+
+            me.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+        }
+
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+
+        });
+
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+
+                blob = slice.call( blob, start, end );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+
+                e = e.originalEvent || e;
+
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+
+                return false;
+            },
+
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+
+                return false;
+            },
+
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 ),
+                    dataTransfer, data;
+
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                e = e.originalEvent || e;
+                dataTransfer = e.dataTransfer;
+
+                // 如果是页面内拖拽,还不能处理,不阻止事件。
+                // 此处 ie11 下会报参数错误,
+                try {
+                    data = dataTransfer.getData('text/html');
+                } catch( err ) {
+                }
+
+                if ( data ) {
+                    return;
+                }
+
+                me._getTansferFiles( dataTransfer, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( dataTransfer, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, file, item, i, len, canAccessFolder;
+
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+
+                Base.when.apply( Base, promises ).done(function() {
+
+                    if ( !results.length ) {
+                        return;
+                    }
+
+                    callback( results );
+                });
+            },
+
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                var elem = this.elem;
+
+                // 还没 init 就调用 destroy
+                if (!elem) {
+                    return;
+                }
+
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragOverHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+
+                    allowed.push( new File( ruid, blob ) );
+                }
+
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var $ = Base.$;
+
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    label = this.label = $( document.createElement('label') ),
+                    input =  this.input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+
+                label.on( 'click', function() {
+                    input.trigger('click');
+                });
+
+                label.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+
+                    input.attr( 'accept', arr.join(',') );
+                }
+
+                container.append( input );
+                container.append( label );
+
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+
+                    me.files = e.target.files;
+
+                    // reset input
+                    clone = this.cloneNode( true );
+                    clone.value = null;
+                    this.parentNode.replaceChild( clone, this );
+
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+
+                    owner.trigger('change');
+                });
+
+                label.on( 'mouseenter mouseleave', mouseHandler );
+
+            },
+
+
+            getFiles: function() {
+                return this.files;
+            },
+
+            destroy: function() {
+                this.input.off();
+                this.label.off();
+            }
+        });
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/util',[
+        'base'
+    ], function( Base ) {
+
+        var urlAPI = window.createObjectURL && window ||
+                window.URL && URL.revokeObjectURL && URL ||
+                window.webkitURL,
+            createObjectURL = Base.noop,
+            revokeObjectURL = createObjectURL;
+
+        if ( urlAPI ) {
+
+            // 更安全的方式调用,比如android里面就能把context改成其他的对象。
+            createObjectURL = function() {
+                return urlAPI.createObjectURL.apply( urlAPI, arguments );
+            };
+
+            revokeObjectURL = function() {
+                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
+            };
+        }
+
+        return {
+            createObjectURL: createObjectURL,
+            revokeObjectURL: revokeObjectURL,
+
+            dataURL2Blob: function( dataURI ) {
+                var byteStr, intArray, ab, i, mimetype, parts;
+
+                parts = dataURI.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+
+                ab = new ArrayBuffer( byteStr.length );
+                intArray = new Uint8Array( ab );
+
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+
+                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
+
+                return this.arrayBufferToBlob( ab, mimetype );
+            },
+
+            dataURL2ArrayBuffer: function( dataURI ) {
+                var byteStr, intArray, i, parts;
+
+                parts = dataURI.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+
+                intArray = new Uint8Array( byteStr.length );
+
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+
+                return intArray.buffer;
+            },
+
+            arrayBufferToBlob: function( buffer, type ) {
+                var builder = window.BlobBuilder || window.WebKitBlobBuilder,
+                    bb;
+
+                // android不支持直接new Blob, 只能借助blobbuilder.
+                if ( builder ) {
+                    bb = new builder();
+                    bb.append( buffer );
+                    return bb.getBlob( type );
+                }
+
+                return new Blob([ buffer ], type ? { type: type } : {} );
+            },
+
+            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
+            // 你得到的结果是png.
+            canvasToDataUrl: function( canvas, type, quality ) {
+                return canvas.toDataURL( type, quality / 100 );
+            },
+
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            parseMeta: function( blob, callback ) {
+                callback( false, {});
+            },
+
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            updateImageHead: function( data ) {
+                return data;
+            }
+        };
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/imagemeta',[
+        'runtime/html5/util'
+    ], function( Util ) {
+
+        var api;
+
+        api = {
+            parsers: {
+                0xffe1: []
+            },
+
+            maxMetaDataSize: 262144,
+
+            parse: function( blob, cb ) {
+                var me = this,
+                    fr = new FileReader();
+
+                fr.onload = function() {
+                    cb( false, me._parse( this.result ) );
+                    fr = fr.onload = fr.onerror = null;
+                };
+
+                fr.onerror = function( e ) {
+                    cb( e.message );
+                    fr = fr.onload = fr.onerror = null;
+                };
+
+                blob = blob.slice( 0, me.maxMetaDataSize );
+                fr.readAsArrayBuffer( blob.getSource() );
+            },
+
+            _parse: function( buffer, noParse ) {
+                if ( buffer.byteLength < 6 ) {
+                    return;
+                }
+
+                var dataview = new DataView( buffer ),
+                    offset = 2,
+                    maxOffset = dataview.byteLength - 4,
+                    headLength = offset,
+                    ret = {},
+                    markerBytes, markerLength, parsers, i;
+
+                if ( dataview.getUint16( 0 ) === 0xffd8 ) {
+
+                    while ( offset < maxOffset ) {
+                        markerBytes = dataview.getUint16( offset );
+
+                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
+                                markerBytes === 0xfffe ) {
+
+                            markerLength = dataview.getUint16( offset + 2 ) + 2;
+
+                            if ( offset + markerLength > dataview.byteLength ) {
+                                break;
+                            }
+
+                            parsers = api.parsers[ markerBytes ];
+
+                            if ( !noParse && parsers ) {
+                                for ( i = 0; i < parsers.length; i += 1 ) {
+                                    parsers[ i ].call( api, dataview, offset,
+                                            markerLength, ret );
+                                }
+                            }
+
+                            offset += markerLength;
+                            headLength = offset;
+                        } else {
+                            break;
+                        }
+                    }
+
+                    if ( headLength > 6 ) {
+                        if ( buffer.slice ) {
+                            ret.imageHead = buffer.slice( 2, headLength );
+                        } else {
+                            // Workaround for IE10, which does not yet
+                            // support ArrayBuffer.slice:
+                            ret.imageHead = new Uint8Array( buffer )
+                                    .subarray( 2, headLength );
+                        }
+                    }
+                }
+
+                return ret;
+            },
+
+            updateImageHead: function( buffer, head ) {
+                var data = this._parse( buffer, true ),
+                    buf1, buf2, bodyoffset;
+
+
+                bodyoffset = 2;
+                if ( data.imageHead ) {
+                    bodyoffset = 2 + data.imageHead.byteLength;
+                }
+
+                if ( buffer.slice ) {
+                    buf2 = buffer.slice( bodyoffset );
+                } else {
+                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
+                }
+
+                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
+
+                buf1[ 0 ] = 0xFF;
+                buf1[ 1 ] = 0xD8;
+                buf1.set( new Uint8Array( head ), 2 );
+                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
+
+                return buf1.buffer;
+            }
+        };
+
+        Util.parseMeta = function() {
+            return api.parse.apply( api, arguments );
+        };
+
+        Util.updateImageHead = function() {
+            return api.updateImageHead.apply( api, arguments );
+        };
+
+        return api;
+    });
+    /**
+     * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
+     * 暂时项目中只用了orientation.
+     *
+     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
+     * @fileOverview EXIF解析
+     */
+
+    // Sample
+    // ====================================
+    // Make : Apple
+    // Model : iPhone 4S
+    // Orientation : 1
+    // XResolution : 72 [72/1]
+    // YResolution : 72 [72/1]
+    // ResolutionUnit : 2
+    // Software : QuickTime 7.7.1
+    // DateTime : 2013:09:01 22:53:55
+    // ExifIFDPointer : 190
+    // ExposureTime : 0.058823529411764705 [1/17]
+    // FNumber : 2.4 [12/5]
+    // ExposureProgram : Normal program
+    // ISOSpeedRatings : 800
+    // ExifVersion : 0220
+    // DateTimeOriginal : 2013:09:01 22:52:51
+    // DateTimeDigitized : 2013:09:01 22:52:51
+    // ComponentsConfiguration : YCbCr
+    // ShutterSpeedValue : 4.058893515764426
+    // ApertureValue : 2.5260688216892597 [4845/1918]
+    // BrightnessValue : -0.3126686601998395
+    // MeteringMode : Pattern
+    // Flash : Flash did not fire, compulsory flash mode
+    // FocalLength : 4.28 [107/25]
+    // SubjectArea : [4 values]
+    // FlashpixVersion : 0100
+    // ColorSpace : 1
+    // PixelXDimension : 2448
+    // PixelYDimension : 3264
+    // SensingMethod : One-chip color area sensor
+    // ExposureMode : 0
+    // WhiteBalance : Auto white balance
+    // FocalLengthIn35mmFilm : 35
+    // SceneCaptureType : Standard
+    define('runtime/html5/imagemeta/exif',[
+        'base',
+        'runtime/html5/imagemeta'
+    ], function( Base, ImageMeta ) {
+
+        var EXIF = {};
+
+        EXIF.ExifMap = function() {
+            return this;
+        };
+
+        EXIF.ExifMap.prototype.map = {
+            'Orientation': 0x0112
+        };
+
+        EXIF.ExifMap.prototype.get = function( id ) {
+            return this[ id ] || this[ this.map[ id ] ];
+        };
+
+        EXIF.exifTagTypes = {
+            // byte, 8-bit unsigned int:
+            1: {
+                getValue: function( dataView, dataOffset ) {
+                    return dataView.getUint8( dataOffset );
+                },
+                size: 1
+            },
+
+            // ascii, 8-bit byte:
+            2: {
+                getValue: function( dataView, dataOffset ) {
+                    return String.fromCharCode( dataView.getUint8( dataOffset ) );
+                },
+                size: 1,
+                ascii: true
+            },
+
+            // short, 16 bit int:
+            3: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint16( dataOffset, littleEndian );
+                },
+                size: 2
+            },
+
+            // long, 32 bit int:
+            4: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+
+            // rational = two long values,
+            // first is numerator, second is denominator:
+            5: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian ) /
+                        dataView.getUint32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            },
+
+            // slong, 32 bit signed int:
+            9: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+
+            // srational, two slongs, first is numerator, second is denominator:
+            10: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian ) /
+                        dataView.getInt32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            }
+        };
+
+        // undefined, 8-bit byte, value depending on field:
+        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
+
+        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
+                littleEndian ) {
+
+            var tagType = EXIF.exifTagTypes[ type ],
+                tagSize, dataOffset, values, i, str, c;
+
+            if ( !tagType ) {
+                Base.log('Invalid Exif data: Invalid tag type.');
+                return;
+            }
+
+            tagSize = tagType.size * length;
+
+            // Determine if the value is contained in the dataOffset bytes,
+            // or if the value at the dataOffset is a pointer to the actual data:
+            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
+                    littleEndian ) : (offset + 8);
+
+            if ( dataOffset + tagSize > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid data offset.');
+                return;
+            }
+
+            if ( length === 1 ) {
+                return tagType.getValue( dataView, dataOffset, littleEndian );
+            }
+
+            values = [];
+
+            for ( i = 0; i < length; i += 1 ) {
+                values[ i ] = tagType.getValue( dataView,
+                        dataOffset + i * tagType.size, littleEndian );
+            }
+
+            if ( tagType.ascii ) {
+                str = '';
+
+                // Concatenate the chars:
+                for ( i = 0; i < values.length; i += 1 ) {
+                    c = values[ i ];
+
+                    // Ignore the terminating NULL byte(s):
+                    if ( c === '\u0000' ) {
+                        break;
+                    }
+                    str += c;
+                }
+
+                return str;
+            }
+            return values;
+        };
+
+        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
+                data ) {
+
+            var tag = dataView.getUint16( offset, littleEndian );
+            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
+                    dataView.getUint16( offset + 2, littleEndian ),    // tag type
+                    dataView.getUint32( offset + 4, littleEndian ),    // tag length
+                    littleEndian );
+        };
+
+        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
+                littleEndian, data ) {
+
+            var tagsNumber, dirEndOffset, i;
+
+            if ( dirOffset + 6 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory offset.');
+                return;
+            }
+
+            tagsNumber = dataView.getUint16( dirOffset, littleEndian );
+            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
+
+            if ( dirEndOffset + 4 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory size.');
+                return;
+            }
+
+            for ( i = 0; i < tagsNumber; i += 1 ) {
+                this.parseExifTag( dataView, tiffOffset,
+                        dirOffset + 2 + 12 * i,    // tag offset
+                        littleEndian, data );
+            }
+
+            // Return the offset to the next directory:
+            return dataView.getUint32( dirEndOffset, littleEndian );
+        };
+
+        // EXIF.getExifThumbnail = function(dataView, offset, length) {
+        //     var hexData,
+        //         i,
+        //         b;
+        //     if (!length || offset + length > dataView.byteLength) {
+        //         Base.log('Invalid Exif data: Invalid thumbnail data.');
+        //         return;
+        //     }
+        //     hexData = [];
+        //     for (i = 0; i < length; i += 1) {
+        //         b = dataView.getUint8(offset + i);
+        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));
+        //     }
+        //     return 'data:image/jpeg,%' + hexData.join('%');
+        // };
+
+        EXIF.parseExifData = function( dataView, offset, length, data ) {
+
+            var tiffOffset = offset + 10,
+                littleEndian, dirOffset;
+
+            // Check for the ASCII code for "Exif" (0x45786966):
+            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
+                // No Exif data, might be XMP data instead
+                return;
+            }
+            if ( tiffOffset + 8 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid segment size.');
+                return;
+            }
+
+            // Check for the two null bytes:
+            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
+                Base.log('Invalid Exif data: Missing byte alignment offset.');
+                return;
+            }
+
+            // Check the byte alignment:
+            switch ( dataView.getUint16( tiffOffset ) ) {
+                case 0x4949:
+                    littleEndian = true;
+                    break;
+
+                case 0x4D4D:
+                    littleEndian = false;
+                    break;
+
+                default:
+                    Base.log('Invalid Exif data: Invalid byte alignment marker.');
+                    return;
+            }
+
+            // Check for the TIFF tag marker (0x002A):
+            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
+                Base.log('Invalid Exif data: Missing TIFF marker.');
+                return;
+            }
+
+            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
+            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
+            // Create the exif object to store the tags:
+            data.exif = new EXIF.ExifMap();
+            // Parse the tags of the main image directory and retrieve the
+            // offset to the next directory, usually the thumbnail directory:
+            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
+                    tiffOffset + dirOffset, littleEndian, data );
+
+            // 尝试读取缩略图
+            // if ( dirOffset ) {
+            //     thumbnailData = {exif: {}};
+            //     dirOffset = EXIF.parseExifTags(
+            //         dataView,
+            //         tiffOffset,
+            //         tiffOffset + dirOffset,
+            //         littleEndian,
+            //         thumbnailData
+            //     );
+
+            //     // Check for JPEG Thumbnail offset:
+            //     if (thumbnailData.exif[0x0201]) {
+            //         data.exif.Thumbnail = EXIF.getExifThumbnail(
+            //             dataView,
+            //             tiffOffset + thumbnailData.exif[0x0201],
+            //             thumbnailData.exif[0x0202] // Thumbnail data length
+            //         );
+            //     }
+            // }
+        };
+
+        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
+        return EXIF;
+    });
+    /**
+     * 这个方式性能不行,但是可以解决android里面的toDataUrl的bug
+     * android里面toDataUrl('image/jpege')得到的结果却是png.
+     *
+     * 所以这里没辙,只能借助这个工具
+     * @fileOverview jpeg encoder
+     */
+    define('runtime/html5/jpegencoder',[], function( require, exports, module ) {
+
+        /*
+          Copyright (c) 2008, Adobe Systems Incorporated
+          All rights reserved.
+
+          Redistribution and use in source and binary forms, with or without
+          modification, are permitted provided that the following conditions are
+          met:
+
+          * Redistributions of source code must retain the above copyright notice,
+            this list of conditions and the following disclaimer.
+
+          * Redistributions in binary form must reproduce the above copyright
+            notice, this list of conditions and the following disclaimer in the
+            documentation and/or other materials provided with the distribution.
+
+          * Neither the name of Adobe Systems Incorporated nor the names of its
+            contributors may be used to endorse or promote products derived from
+            this software without specific prior written permission.
+
+          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+          IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+          PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+          CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+          EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+          PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+          PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+          NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+          SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+        */
+        /*
+        JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009
+
+        Basic GUI blocking jpeg encoder
+        */
+
+        function JPEGEncoder(quality) {
+          var self = this;
+            var fround = Math.round;
+            var ffloor = Math.floor;
+            var YTable = new Array(64);
+            var UVTable = new Array(64);
+            var fdtbl_Y = new Array(64);
+            var fdtbl_UV = new Array(64);
+            var YDC_HT;
+            var UVDC_HT;
+            var YAC_HT;
+            var UVAC_HT;
+
+            var bitcode = new Array(65535);
+            var category = new Array(65535);
+            var outputfDCTQuant = new Array(64);
+            var DU = new Array(64);
+            var byteout = [];
+            var bytenew = 0;
+            var bytepos = 7;
+
+            var YDU = new Array(64);
+            var UDU = new Array(64);
+            var VDU = new Array(64);
+            var clt = new Array(256);
+            var RGB_YUV_TABLE = new Array(2048);
+            var currentQuality;
+
+            var ZigZag = [
+                     0, 1, 5, 6,14,15,27,28,
+                     2, 4, 7,13,16,26,29,42,
+                     3, 8,12,17,25,30,41,43,
+                     9,11,18,24,31,40,44,53,
+                    10,19,23,32,39,45,52,54,
+                    20,22,33,38,46,51,55,60,
+                    21,34,37,47,50,56,59,61,
+                    35,36,48,49,57,58,62,63
+                ];
+
+            var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
+            var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
+            var std_ac_luminance_values = [
+                    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
+                    0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
+                    0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
+                    0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
+                    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
+                    0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
+                    0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
+                    0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
+                    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
+                    0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
+                    0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
+                    0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
+                    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
+                    0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
+                    0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
+                    0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
+                    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
+                    0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
+                    0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
+                    0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+
+            var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
+            var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
+            var std_ac_chrominance_values = [
+                    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
+                    0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
+                    0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
+                    0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
+                    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
+                    0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
+                    0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
+                    0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
+                    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
+                    0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
+                    0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
+                    0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
+                    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
+                    0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
+                    0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
+                    0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
+                    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
+                    0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
+                    0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
+                    0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+
+            function initQuantTables(sf){
+                    var YQT = [
+                        16, 11, 10, 16, 24, 40, 51, 61,
+                        12, 12, 14, 19, 26, 58, 60, 55,
+                        14, 13, 16, 24, 40, 57, 69, 56,
+                        14, 17, 22, 29, 51, 87, 80, 62,
+                        18, 22, 37, 56, 68,109,103, 77,
+                        24, 35, 55, 64, 81,104,113, 92,
+                        49, 64, 78, 87,103,121,120,101,
+                        72, 92, 95, 98,112,100,103, 99
+                    ];
+
+                    for (var i = 0; i < 64; i++) {
+                        var t = ffloor((YQT[i]*sf+50)/100);
+                        if (t < 1) {
+                            t = 1;
+                        } else if (t > 255) {
+                            t = 255;
+                        }
+                        YTable[ZigZag[i]] = t;
+                    }
+                    var UVQT = [
+                        17, 18, 24, 47, 99, 99, 99, 99,
+                        18, 21, 26, 66, 99, 99, 99, 99,
+                        24, 26, 56, 99, 99, 99, 99, 99,
+                        47, 66, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99
+                    ];
+                    for (var j = 0; j < 64; j++) {
+                        var u = ffloor((UVQT[j]*sf+50)/100);
+                        if (u < 1) {
+                            u = 1;
+                        } else if (u > 255) {
+                            u = 255;
+                        }
+                        UVTable[ZigZag[j]] = u;
+                    }
+                    var aasf = [
+                        1.0, 1.387039845, 1.306562965, 1.175875602,
+                        1.0, 0.785694958, 0.541196100, 0.275899379
+                    ];
+                    var k = 0;
+                    for (var row = 0; row < 8; row++)
+                    {
+                        for (var col = 0; col < 8; col++)
+                        {
+                            fdtbl_Y[k]  = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            k++;
+                        }
+                    }
+                }
+
+                function computeHuffmanTbl(nrcodes, std_table){
+                    var codevalue = 0;
+                    var pos_in_table = 0;
+                    var HT = new Array();
+                    for (var k = 1; k <= 16; k++) {
+                        for (var j = 1; j <= nrcodes[k]; j++) {
+                            HT[std_table[pos_in_table]] = [];
+                            HT[std_table[pos_in_table]][0] = codevalue;
+                            HT[std_table[pos_in_table]][1] = k;
+                            pos_in_table++;
+                            codevalue++;
+                        }
+                        codevalue*=2;
+                    }
+                    return HT;
+                }
+
+                function initHuffmanTbl()
+                {
+                    YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
+                    UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
+                    YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
+                    UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
+                }
+
+                function initCategoryNumber()
+                {
+                    var nrlower = 1;
+                    var nrupper = 2;
+                    for (var cat = 1; cat <= 15; cat++) {
+                        //Positive numbers
+                        for (var nr = nrlower; nr<nrupper; nr++) {
+                            category[32767+nr] = cat;
+                            bitcode[32767+nr] = [];
+                            bitcode[32767+nr][1] = cat;
+                            bitcode[32767+nr][0] = nr;
+                        }
+                        //Negative numbers
+                        for (var nrneg =-(nrupper-1); nrneg<=-nrlower; nrneg++) {
+                            category[32767+nrneg] = cat;
+                            bitcode[32767+nrneg] = [];
+                            bitcode[32767+nrneg][1] = cat;
+                            bitcode[32767+nrneg][0] = nrupper-1+nrneg;
+                        }
+                        nrlower <<= 1;
+                        nrupper <<= 1;
+                    }
+                }
+
+                function initRGBYUVTable() {
+                    for(var i = 0; i < 256;i++) {
+                        RGB_YUV_TABLE[i]            =  19595 * i;
+                        RGB_YUV_TABLE[(i+ 256)>>0]  =  38470 * i;
+                        RGB_YUV_TABLE[(i+ 512)>>0]  =   7471 * i + 0x8000;
+                        RGB_YUV_TABLE[(i+ 768)>>0]  = -11059 * i;
+                        RGB_YUV_TABLE[(i+1024)>>0]  = -21709 * i;
+                        RGB_YUV_TABLE[(i+1280)>>0]  =  32768 * i + 0x807FFF;
+                        RGB_YUV_TABLE[(i+1536)>>0]  = -27439 * i;
+                        RGB_YUV_TABLE[(i+1792)>>0]  = - 5329 * i;
+                    }
+                }
+
+                // IO functions
+                function writeBits(bs)
+                {
+                    var value = bs[0];
+                    var posval = bs[1]-1;
+                    while ( posval >= 0 ) {
+                        if (value & (1 << posval) ) {
+                            bytenew |= (1 << bytepos);
+                        }
+                        posval--;
+                        bytepos--;
+                        if (bytepos < 0) {
+                            if (bytenew == 0xFF) {
+                                writeByte(0xFF);
+                                writeByte(0);
+                            }
+                            else {
+                                writeByte(bytenew);
+                            }
+                            bytepos=7;
+                            bytenew=0;
+                        }
+                    }
+                }
+
+                function writeByte(value)
+                {
+                    byteout.push(clt[value]); // write char directly instead of converting later
+                }
+
+                function writeWord(value)
+                {
+                    writeByte((value>>8)&0xFF);
+                    writeByte((value   )&0xFF);
+                }
+
+                // DCT & quantization core
+                function fDCTQuant(data, fdtbl)
+                {
+                    var d0, d1, d2, d3, d4, d5, d6, d7;
+                    /* Pass 1: process rows. */
+                    var dataOff=0;
+                    var i;
+                    var I8 = 8;
+                    var I64 = 64;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff+1];
+                        d2 = data[dataOff+2];
+                        d3 = data[dataOff+3];
+                        d4 = data[dataOff+4];
+                        d5 = data[dataOff+5];
+                        d6 = data[dataOff+6];
+                        d7 = data[dataOff+7];
+
+                        var tmp0 = d0 + d7;
+                        var tmp7 = d0 - d7;
+                        var tmp1 = d1 + d6;
+                        var tmp6 = d1 - d6;
+                        var tmp2 = d2 + d5;
+                        var tmp5 = d2 - d5;
+                        var tmp3 = d3 + d4;
+                        var tmp4 = d3 - d4;
+
+                        /* Even part */
+                        var tmp10 = tmp0 + tmp3;    /* phase 2 */
+                        var tmp13 = tmp0 - tmp3;
+                        var tmp11 = tmp1 + tmp2;
+                        var tmp12 = tmp1 - tmp2;
+
+                        data[dataOff] = tmp10 + tmp11; /* phase 3 */
+                        data[dataOff+4] = tmp10 - tmp11;
+
+                        var z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */
+                        data[dataOff+2] = tmp13 + z1; /* phase 5 */
+                        data[dataOff+6] = tmp13 - z1;
+
+                        /* Odd part */
+                        tmp10 = tmp4 + tmp5; /* phase 2 */
+                        tmp11 = tmp5 + tmp6;
+                        tmp12 = tmp6 + tmp7;
+
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */
+                        var z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */
+                        var z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */
+                        var z3 = tmp11 * 0.707106781; /* c4 */
+
+                        var z11 = tmp7 + z3;    /* phase 5 */
+                        var z13 = tmp7 - z3;
+
+                        data[dataOff+5] = z13 + z2; /* phase 6 */
+                        data[dataOff+3] = z13 - z2;
+                        data[dataOff+1] = z11 + z4;
+                        data[dataOff+7] = z11 - z4;
+
+                        dataOff += 8; /* advance pointer to next row */
+                    }
+
+                    /* Pass 2: process columns. */
+                    dataOff = 0;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff + 8];
+                        d2 = data[dataOff + 16];
+                        d3 = data[dataOff + 24];
+                        d4 = data[dataOff + 32];
+                        d5 = data[dataOff + 40];
+                        d6 = data[dataOff + 48];
+                        d7 = data[dataOff + 56];
+
+                        var tmp0p2 = d0 + d7;
+                        var tmp7p2 = d0 - d7;
+                        var tmp1p2 = d1 + d6;
+                        var tmp6p2 = d1 - d6;
+                        var tmp2p2 = d2 + d5;
+                        var tmp5p2 = d2 - d5;
+                        var tmp3p2 = d3 + d4;
+                        var tmp4p2 = d3 - d4;
+
+                        /* Even part */
+                        var tmp10p2 = tmp0p2 + tmp3p2;  /* phase 2 */
+                        var tmp13p2 = tmp0p2 - tmp3p2;
+                        var tmp11p2 = tmp1p2 + tmp2p2;
+                        var tmp12p2 = tmp1p2 - tmp2p2;
+
+                        data[dataOff] = tmp10p2 + tmp11p2; /* phase 3 */
+                        data[dataOff+32] = tmp10p2 - tmp11p2;
+
+                        var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781; /* c4 */
+                        data[dataOff+16] = tmp13p2 + z1p2; /* phase 5 */
+                        data[dataOff+48] = tmp13p2 - z1p2;
+
+                        /* Odd part */
+                        tmp10p2 = tmp4p2 + tmp5p2; /* phase 2 */
+                        tmp11p2 = tmp5p2 + tmp6p2;
+                        tmp12p2 = tmp6p2 + tmp7p2;
+
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433; /* c6 */
+                        var z2p2 = 0.541196100 * tmp10p2 + z5p2; /* c2-c6 */
+                        var z4p2 = 1.306562965 * tmp12p2 + z5p2; /* c2+c6 */
+                        var z3p2 = tmp11p2 * 0.707106781; /* c4 */
+
+                        var z11p2 = tmp7p2 + z3p2;  /* phase 5 */
+                        var z13p2 = tmp7p2 - z3p2;
+
+                        data[dataOff+40] = z13p2 + z2p2; /* phase 6 */
+                        data[dataOff+24] = z13p2 - z2p2;
+                        data[dataOff+ 8] = z11p2 + z4p2;
+                        data[dataOff+56] = z11p2 - z4p2;
+
+                        dataOff++; /* advance pointer to next column */
+                    }
+
+                    // Quantize/descale the coefficients
+                    var fDCTQuant;
+                    for (i=0; i<I64; ++i)
+                    {
+                        // Apply the quantization and scaling factor & Round to nearest integer
+                        fDCTQuant = data[i]*fdtbl[i];
+                        outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);
+                        //outputfDCTQuant[i] = fround(fDCTQuant);
+
+                    }
+                    return outputfDCTQuant;
+                }
+
+                function writeAPP0()
+                {
+                    writeWord(0xFFE0); // marker
+                    writeWord(16); // length
+                    writeByte(0x4A); // J
+                    writeByte(0x46); // F
+                    writeByte(0x49); // I
+                    writeByte(0x46); // F
+                    writeByte(0); // = "JFIF",'\0'
+                    writeByte(1); // versionhi
+                    writeByte(1); // versionlo
+                    writeByte(0); // xyunits
+                    writeWord(1); // xdensity
+                    writeWord(1); // ydensity
+                    writeByte(0); // thumbnwidth
+                    writeByte(0); // thumbnheight
+                }
+
+                function writeSOF0(width, height)
+                {
+                    writeWord(0xFFC0); // marker
+                    writeWord(17);   // length, truecolor YUV JPG
+                    writeByte(8);    // precision
+                    writeWord(height);
+                    writeWord(width);
+                    writeByte(3);    // nrofcomponents
+                    writeByte(1);    // IdY
+                    writeByte(0x11); // HVY
+                    writeByte(0);    // QTY
+                    writeByte(2);    // IdU
+                    writeByte(0x11); // HVU
+                    writeByte(1);    // QTU
+                    writeByte(3);    // IdV
+                    writeByte(0x11); // HVV
+                    writeByte(1);    // QTV
+                }
+
+                function writeDQT()
+                {
+                    writeWord(0xFFDB); // marker
+                    writeWord(132);    // length
+                    writeByte(0);
+                    for (var i=0; i<64; i++) {
+                        writeByte(YTable[i]);
+                    }
+                    writeByte(1);
+                    for (var j=0; j<64; j++) {
+                        writeByte(UVTable[j]);
+                    }
+                }
+
+                function writeDHT()
+                {
+                    writeWord(0xFFC4); // marker
+                    writeWord(0x01A2); // length
+
+                    writeByte(0); // HTYDCinfo
+                    for (var i=0; i<16; i++) {
+                        writeByte(std_dc_luminance_nrcodes[i+1]);
+                    }
+                    for (var j=0; j<=11; j++) {
+                        writeByte(std_dc_luminance_values[j]);
+                    }
+
+                    writeByte(0x10); // HTYACinfo
+                    for (var k=0; k<16; k++) {
+                        writeByte(std_ac_luminance_nrcodes[k+1]);
+                    }
+                    for (var l=0; l<=161; l++) {
+                        writeByte(std_ac_luminance_values[l]);
+                    }
+
+                    writeByte(1); // HTUDCinfo
+                    for (var m=0; m<16; m++) {
+                        writeByte(std_dc_chrominance_nrcodes[m+1]);
+                    }
+                    for (var n=0; n<=11; n++) {
+                        writeByte(std_dc_chrominance_values[n]);
+                    }
+
+                    writeByte(0x11); // HTUACinfo
+                    for (var o=0; o<16; o++) {
+                        writeByte(std_ac_chrominance_nrcodes[o+1]);
+                    }
+                    for (var p=0; p<=161; p++) {
+                        writeByte(std_ac_chrominance_values[p]);
+                    }
+                }
+
+                function writeSOS()
+                {
+                    writeWord(0xFFDA); // marker
+                    writeWord(12); // length
+                    writeByte(3); // nrofcomponents
+                    writeByte(1); // IdY
+                    writeByte(0); // HTY
+                    writeByte(2); // IdU
+                    writeByte(0x11); // HTU
+                    writeByte(3); // IdV
+                    writeByte(0x11); // HTV
+                    writeByte(0); // Ss
+                    writeByte(0x3f); // Se
+                    writeByte(0); // Bf
+                }
+
+                function processDU(CDU, fdtbl, DC, HTDC, HTAC){
+                    var EOB = HTAC[0x00];
+                    var M16zeroes = HTAC[0xF0];
+                    var pos;
+                    var I16 = 16;
+                    var I63 = 63;
+                    var I64 = 64;
+                    var DU_DCT = fDCTQuant(CDU, fdtbl);
+                    //ZigZag reorder
+                    for (var j=0;j<I64;++j) {
+                        DU[ZigZag[j]]=DU_DCT[j];
+                    }
+                    var Diff = DU[0] - DC; DC = DU[0];
+                    //Encode DC
+                    if (Diff==0) {
+                        writeBits(HTDC[0]); // Diff might be 0
+                    } else {
+                        pos = 32767+Diff;
+                        writeBits(HTDC[category[pos]]);
+                        writeBits(bitcode[pos]);
+                    }
+                    //Encode ACs
+                    var end0pos = 63; // was const... which is crazy
+                    for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {};
+                    //end0pos = first element in reverse order !=0
+                    if ( end0pos == 0) {
+                        writeBits(EOB);
+                        return DC;
+                    }
+                    var i = 1;
+                    var lng;
+                    while ( i <= end0pos ) {
+                        var startpos = i;
+                        for (; (DU[i]==0) && (i<=end0pos); ++i) {}
+                        var nrzeroes = i-startpos;
+                        if ( nrzeroes >= I16 ) {
+                            lng = nrzeroes>>4;
+                            for (var nrmarker=1; nrmarker <= lng; ++nrmarker)
+                                writeBits(M16zeroes);
+                            nrzeroes = nrzeroes&0xF;
+                        }
+                        pos = 32767+DU[i];
+                        writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
+                        writeBits(bitcode[pos]);
+                        i++;
+                    }
+                    if ( end0pos != I63 ) {
+                        writeBits(EOB);
+                    }
+                    return DC;
+                }
+
+                function initCharLookupTable(){
+                    var sfcc = String.fromCharCode;
+                    for(var i=0; i < 256; i++){ ///// ACHTUNG // 255
+                        clt[i] = sfcc(i);
+                    }
+                }
+
+                this.encode = function(image,quality) // image data object
+                {
+                    // var time_start = new Date().getTime();
+
+                    if(quality) setQuality(quality);
+
+                    // Initialize bit writer
+                    byteout = new Array();
+                    bytenew=0;
+                    bytepos=7;
+
+                    // Add JPEG headers
+                    writeWord(0xFFD8); // SOI
+                    writeAPP0();
+                    writeDQT();
+                    writeSOF0(image.width,image.height);
+                    writeDHT();
+                    writeSOS();
+
+
+                    // Encode 8x8 macroblocks
+                    var DCY=0;
+                    var DCU=0;
+                    var DCV=0;
+
+                    bytenew=0;
+                    bytepos=7;
+
+
+                    this.encode.displayName = "_encode_";
+
+                    var imageData = image.data;
+                    var width = image.width;
+                    var height = image.height;
+
+                    var quadWidth = width*4;
+                    var tripleWidth = width*3;
+
+                    var x, y = 0;
+                    var r, g, b;
+                    var start,p, col,row,pos;
+                    while(y < height){
+                        x = 0;
+                        while(x < quadWidth){
+                        start = quadWidth * y + x;
+                        p = start;
+                        col = -1;
+                        row = 0;
+
+                        for(pos=0; pos < 64; pos++){
+                            row = pos >> 3;// /8
+                            col = ( pos & 7 ) * 4; // %8
+                            p = start + ( row * quadWidth ) + col;
+
+                            if(y+row >= height){ // padding bottom
+                                p-= (quadWidth*(y+1+row-height));
+                            }
+
+                            if(x+col >= quadWidth){ // padding right
+                                p-= ((x+col) - quadWidth +4)
+                            }
+
+                            r = imageData[ p++ ];
+                            g = imageData[ p++ ];
+                            b = imageData[ p++ ];
+
+
+                            /* // calculate YUV values dynamically
+                            YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
+                            UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
+                            VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
+                            */
+
+                            // use lookup table (slightly faster)
+                            YDU[pos] = ((RGB_YUV_TABLE[r]             + RGB_YUV_TABLE[(g +  256)>>0] + RGB_YUV_TABLE[(b +  512)>>0]) >> 16)-128;
+                            UDU[pos] = ((RGB_YUV_TABLE[(r +  768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;
+                            VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;
+
+                        }
+
+                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
+                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
+                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
+                        x+=32;
+                        }
+                        y+=8;
+                    }
+
+
+                    ////////////////////////////////////////////////////////////////
+
+                    // Do the bit alignment of the EOI marker
+                    if ( bytepos >= 0 ) {
+                        var fillbits = [];
+                        fillbits[1] = bytepos+1;
+                        fillbits[0] = (1<<(bytepos+1))-1;
+                        writeBits(fillbits);
+                    }
+
+                    writeWord(0xFFD9); //EOI
+
+                    var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
+
+                    byteout = [];
+
+                    // benchmarking
+                    // var duration = new Date().getTime() - time_start;
+                    // console.log('Encoding time: '+ currentQuality + 'ms');
+                    //
+
+                    return jpegDataUri
+            }
+
+            function setQuality(quality){
+                if (quality <= 0) {
+                    quality = 1;
+                }
+                if (quality > 100) {
+                    quality = 100;
+                }
+
+                if(currentQuality == quality) return // don't recalc if unchanged
+
+                var sf = 0;
+                if (quality < 50) {
+                    sf = Math.floor(5000 / quality);
+                } else {
+                    sf = Math.floor(200 - quality*2);
+                }
+
+                initQuantTables(sf);
+                currentQuality = quality;
+                // console.log('Quality set to: '+quality +'%');
+            }
+
+            function init(){
+                // var time_start = new Date().getTime();
+                if(!quality) quality = 50;
+                // Create tables
+                initCharLookupTable()
+                initHuffmanTbl();
+                initCategoryNumber();
+                initRGBYUVTable();
+
+                setQuality(quality);
+                // var duration = new Date().getTime() - time_start;
+                // console.log('Initialization '+ duration + 'ms');
+            }
+
+            init();
+
+        };
+
+        JPEGEncoder.encode = function( data, quality ) {
+            var encoder = new JPEGEncoder( quality );
+
+            return encoder.encode( data );
+        }
+
+        return JPEGEncoder;
+    });
+    /**
+     * @fileOverview Fix android canvas.toDataUrl bug.
+     */
+    define('runtime/html5/androidpatch',[
+        'runtime/html5/util',
+        'runtime/html5/jpegencoder',
+        'base'
+    ], function( Util, encoder, Base ) {
+        var origin = Util.canvasToDataUrl,
+            supportJpeg;
+
+        Util.canvasToDataUrl = function( canvas, type, quality ) {
+            var ctx, w, h, fragement, parts;
+
+            // 非android手机直接跳过。
+            if ( !Base.os.android ) {
+                return origin.apply( null, arguments );
+            }
+
+            // 检测是否canvas支持jpeg导出,根据数据格式来判断。
+            // JPEG 前两位分别是:255, 216
+            if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {
+                fragement = origin.apply( null, arguments );
+
+                parts = fragement.split(',');
+
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    fragement = atob( parts[ 1 ] );
+                } else {
+                    fragement = decodeURIComponent( parts[ 1 ] );
+                }
+
+                fragement = fragement.substring( 0, 2 );
+
+                supportJpeg = fragement.charCodeAt( 0 ) === 255 &&
+                        fragement.charCodeAt( 1 ) === 216;
+            }
+
+            // 只有在android环境下才修复
+            if ( type === 'image/jpeg' && !supportJpeg ) {
+                w = canvas.width;
+                h = canvas.height;
+                ctx = canvas.getContext('2d');
+
+                return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );
+            }
+
+            return origin.apply( null, arguments );
+        };
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('runtime/html5/image',[
+        'base',
+        'runtime/html5/runtime',
+        'runtime/html5/util'
+    ], function( Base, Html5Runtime, Util ) {
+
+        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
+
+        return Html5Runtime.register( 'Image', {
+
+            // flag: 标记是否被修改过。
+            modified: false,
+
+            init: function() {
+                var me = this,
+                    img = new Image();
+
+                img.onload = function() {
+
+                    me._info = {
+                        type: me.type,
+                        width: this.width,
+                        height: this.height
+                    };
+
+                    // 读取meta信息。
+                    if ( !me._metas && 'image/jpeg' === me.type ) {
+                        Util.parseMeta( me._blob, function( error, ret ) {
+                            me._metas = ret;
+                            me.owner.trigger('load');
+                        });
+                    } else {
+                        me.owner.trigger('load');
+                    }
+                };
+
+                img.onerror = function() {
+                    me.owner.trigger('error');
+                };
+
+                me._img = img;
+            },
+
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    img = me._img;
+
+                me._blob = blob;
+                me.type = blob.type;
+                img.src = Util.createObjectURL( blob.getSource() );
+                me.owner.once( 'load', function() {
+                    Util.revokeObjectURL( img.src );
+                });
+            },
+
+            resize: function( width, height ) {
+                var canvas = this._canvas ||
+                        (this._canvas = document.createElement('canvas'));
+
+                this._resize( this._img, canvas, width, height );
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger( 'complete', 'resize' );
+            },
+
+            crop: function( x, y, w, h, s ) {
+                var cvs = this._canvas ||
+                        (this._canvas = document.createElement('canvas')),
+                    opts = this.options,
+                    img = this._img,
+                    iw = img.naturalWidth,
+                    ih = img.naturalHeight,
+                    orientation = this.getOrientation();
+
+                s = s || 1;
+
+                // todo 解决 orientation 的问题。
+                // values that require 90 degree rotation
+                // if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+
+                //     switch ( orientation ) {
+                //         case 6:
+                //             tmp = x;
+                //             x = y;
+                //             y = iw * s - tmp - w;
+                //             console.log(ih * s, tmp, w)
+                //             break;
+                //     }
+
+                //     (w ^= h, h ^= w, w ^= h);
+                // }
+
+                cvs.width = w;
+                cvs.height = h;
+
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+                this._renderImageToCanvas( cvs, img, -x, -y, iw * s, ih * s );
+
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger( 'complete', 'crop' );
+            },
+
+            getAsBlob: function( type ) {
+                var blob = this._blob,
+                    opts = this.options,
+                    canvas;
+
+                type = type || this.type;
+
+                // blob需要重新生成。
+                if ( this.modified || this.type !== type ) {
+                    canvas = this._canvas;
+
+                    if ( type === 'image/jpeg' ) {
+
+                        blob = Util.canvasToDataUrl( canvas, type, opts.quality );
+
+                        if ( opts.preserveHeaders && this._metas &&
+                                this._metas.imageHead ) {
+
+                            blob = Util.dataURL2ArrayBuffer( blob );
+                            blob = Util.updateImageHead( blob,
+                                    this._metas.imageHead );
+                            blob = Util.arrayBufferToBlob( blob, type );
+                            return blob;
+                        }
+                    } else {
+                        blob = Util.canvasToDataUrl( canvas, type );
+                    }
+
+                    blob = Util.dataURL2Blob( blob );
+                }
+
+                return blob;
+            },
+
+            getAsDataUrl: function( type ) {
+                var opts = this.options;
+
+                type = type || this.type;
+
+                if ( type === 'image/jpeg' ) {
+                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );
+                } else {
+                    return this._canvas.toDataURL( type );
+                }
+            },
+
+            getOrientation: function() {
+                return this._metas && this._metas.exif &&
+                        this._metas.exif.get('Orientation') || 1;
+            },
+
+            info: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+
+                // getter
+                return this._info;
+            },
+
+            meta: function( val ) {
+
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+
+                // getter
+                return this._meta;
+            },
+
+            destroy: function() {
+                var canvas = this._canvas;
+                this._img.onload = null;
+
+                if ( canvas ) {
+                    canvas.getContext('2d')
+                            .clearRect( 0, 0, canvas.width, canvas.height );
+                    canvas.width = canvas.height = 0;
+                    this._canvas = null;
+                }
+
+                // 释放内存。非常重要,否则释放不了image的内存。
+                this._img.src = BLANK;
+                this._img = this._blob = null;
+            },
+
+            _resize: function( img, cvs, width, height ) {
+                var opts = this.options,
+                    naturalWidth = img.width,
+                    naturalHeight = img.height,
+                    orientation = this.getOrientation(),
+                    scale, w, h, x, y;
+
+                // values that require 90 degree rotation
+                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+
+                    // 交换width, height的值。
+                    width ^= height;
+                    height ^= width;
+                    width ^= height;
+                }
+
+                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
+                        height / naturalHeight );
+
+                // 不允许放大。
+                opts.allowMagnify || (scale = Math.min( 1, scale ));
+
+                w = naturalWidth * scale;
+                h = naturalHeight * scale;
+
+                if ( opts.crop ) {
+                    cvs.width = width;
+                    cvs.height = height;
+                } else {
+                    cvs.width = w;
+                    cvs.height = h;
+                }
+
+                x = (cvs.width - w) / 2;
+                y = (cvs.height - h) / 2;
+
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+
+                this._renderImageToCanvas( cvs, img, x, y, w, h );
+            },
+
+            _rotate2Orientaion: function( canvas, orientation ) {
+                var width = canvas.width,
+                    height = canvas.height,
+                    ctx = canvas.getContext('2d');
+
+                switch ( orientation ) {
+                    case 5:
+                    case 6:
+                    case 7:
+                    case 8:
+                        canvas.width = height;
+                        canvas.height = width;
+                        break;
+                }
+
+                switch ( orientation ) {
+                    case 2:    // horizontal flip
+                        ctx.translate( width, 0 );
+                        ctx.scale( -1, 1 );
+                        break;
+
+                    case 3:    // 180 rotate left
+                        ctx.translate( width, height );
+                        ctx.rotate( Math.PI );
+                        break;
+
+                    case 4:    // vertical flip
+                        ctx.translate( 0, height );
+                        ctx.scale( 1, -1 );
+                        break;
+
+                    case 5:    // vertical flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.scale( 1, -1 );
+                        break;
+
+                    case 6:    // 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( 0, -height );
+                        break;
+
+                    case 7:    // horizontal flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( width, -height );
+                        ctx.scale( -1, 1 );
+                        break;
+
+                    case 8:    // 90 rotate left
+                        ctx.rotate( -0.5 * Math.PI );
+                        ctx.translate( -width, 0 );
+                        break;
+                }
+            },
+
+            // https://github.com/stomita/ios-imagefile-megapixel/
+            // blob/master/src/megapix-image.js
+            _renderImageToCanvas: (function() {
+
+                // 如果不是ios, 不需要这么复杂!
+                if ( !Base.os.ios ) {
+                    return function( canvas ) {
+                        var args = Base.slice( arguments, 1 ),
+                            ctx = canvas.getContext('2d');
+
+                        ctx.drawImage.apply( ctx, args );
+                    };
+                }
+
+                /**
+                 * Detecting vertical squash in loaded image.
+                 * Fixes a bug which squash image vertically while drawing into
+                 * canvas for some images.
+                 */
+                function detectVerticalSquash( img, iw, ih ) {
+                    var canvas = document.createElement('canvas'),
+                        ctx = canvas.getContext('2d'),
+                        sy = 0,
+                        ey = ih,
+                        py = ih,
+                        data, alpha, ratio;
+
+
+                    canvas.width = 1;
+                    canvas.height = ih;
+                    ctx.drawImage( img, 0, 0 );
+                    data = ctx.getImageData( 0, 0, 1, ih ).data;
+
+                    // search image edge pixel position in case
+                    // it is squashed vertically.
+                    while ( py > sy ) {
+                        alpha = data[ (py - 1) * 4 + 3 ];
+
+                        if ( alpha === 0 ) {
+                            ey = py;
+                        } else {
+                            sy = py;
+                        }
+
+                        py = (ey + sy) >> 1;
+                    }
+
+                    ratio = (py / ih);
+                    return (ratio === 0) ? 1 : ratio;
+                }
+
+                // fix ie7 bug
+                // http://stackoverflow.com/questions/11929099/
+                // html5-canvas-drawimage-ratio-bug-ios
+                if ( Base.os.ios >= 7 ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        var iw = img.naturalWidth,
+                            ih = img.naturalHeight,
+                            vertSquashRatio = detectVerticalSquash( img, iw, ih );
+
+                        return canvas.getContext('2d').drawImage( img, 0, 0,
+                                iw * vertSquashRatio, ih * vertSquashRatio,
+                                x, y, w, h );
+                    };
+                }
+
+                /**
+                 * Detect subsampling in loaded image.
+                 * In iOS, larger images than 2M pixels may be
+                 * subsampled in rendering.
+                 */
+                function detectSubsampling( img ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        canvas, ctx;
+
+                    // subsampling may happen overmegapixel image
+                    if ( iw * ih > 1024 * 1024 ) {
+                        canvas = document.createElement('canvas');
+                        canvas.width = canvas.height = 1;
+                        ctx = canvas.getContext('2d');
+                        ctx.drawImage( img, -iw + 1, 0 );
+
+                        // subsampled image becomes half smaller in rendering size.
+                        // check alpha channel value to confirm image is covering
+                        // edge pixel or not. if alpha value is 0
+                        // image is not covering, hence subsampled.
+                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
+                    } else {
+                        return false;
+                    }
+                }
+
+
+                return function( canvas, img, x, y, width, height ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        ctx = canvas.getContext('2d'),
+                        subsampled = detectSubsampling( img ),
+                        doSquash = this.type === 'image/jpeg',
+                        d = 1024,
+                        sy = 0,
+                        dy = 0,
+                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
+
+                    if ( subsampled ) {
+                        iw /= 2;
+                        ih /= 2;
+                    }
+
+                    ctx.save();
+                    tmpCanvas = document.createElement('canvas');
+                    tmpCanvas.width = tmpCanvas.height = d;
+
+                    tmpCtx = tmpCanvas.getContext('2d');
+                    vertSquashRatio = doSquash ?
+                            detectVerticalSquash( img, iw, ih ) : 1;
+
+                    dw = Math.ceil( d * width / iw );
+                    dh = Math.ceil( d * height / ih / vertSquashRatio );
+
+                    while ( sy < ih ) {
+                        sx = 0;
+                        dx = 0;
+                        while ( sx < iw ) {
+                            tmpCtx.clearRect( 0, 0, d, d );
+                            tmpCtx.drawImage( img, -sx, -sy );
+                            ctx.drawImage( tmpCanvas, 0, 0, d, d,
+                                    x + dx, y + dy, dw, dh );
+                            sx += d;
+                            dx += dw;
+                        }
+                        sy += d;
+                        dy += dh;
+                    }
+                    ctx.restore();
+                    tmpCanvas = tmpCtx = null;
+                };
+            })()
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var noop = Base.noop,
+            $ = Base.$;
+
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+
+                if ( binary ) {
+                    // 强制设置成 content-type 为文件流。
+                    xhr.overrideMimeType &&
+                            xhr.overrideMimeType('application/octet-stream');
+
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+
+            getResponse: function() {
+                return this._response;
+            },
+
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+
+                    return me.trigger( 'progress', percentage );
+                };
+
+                xhr.onreadystatechange = function() {
+
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+
+
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+
+            _parseJson: function( str ) {
+                var json;
+
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/html5/md5',[
+        'runtime/html5/runtime'
+    ], function( FlashRuntime ) {
+
+        /*
+         * Fastest md5 implementation around (JKM md5)
+         * Credits: Joseph Myers
+         *
+         * @see http://www.myersdaily.org/joseph/javascript/md5-text.html
+         * @see http://jsperf.com/md5-shootout/7
+         */
+
+        /* this function is much faster,
+          so if possible we use it. Some IEs
+          are the only ones I know of that
+          need the idiotic second function,
+          generated by an if clause.  */
+        var add32 = function (a, b) {
+            return (a + b) & 0xFFFFFFFF;
+        },
+
+        cmn = function (q, a, b, x, s, t) {
+            a = add32(add32(a, q), add32(x, t));
+            return add32((a << s) | (a >>> (32 - s)), b);
+        },
+
+        ff = function (a, b, c, d, x, s, t) {
+            return cmn((b & c) | ((~b) & d), a, b, x, s, t);
+        },
+
+        gg = function (a, b, c, d, x, s, t) {
+            return cmn((b & d) | (c & (~d)), a, b, x, s, t);
+        },
+
+        hh = function (a, b, c, d, x, s, t) {
+            return cmn(b ^ c ^ d, a, b, x, s, t);
+        },
+
+        ii = function (a, b, c, d, x, s, t) {
+            return cmn(c ^ (b | (~d)), a, b, x, s, t);
+        },
+
+        md5cycle = function (x, k) {
+            var a = x[0],
+                b = x[1],
+                c = x[2],
+                d = x[3];
+
+            a = ff(a, b, c, d, k[0], 7, -680876936);
+            d = ff(d, a, b, c, k[1], 12, -389564586);
+            c = ff(c, d, a, b, k[2], 17, 606105819);
+            b = ff(b, c, d, a, k[3], 22, -1044525330);
+            a = ff(a, b, c, d, k[4], 7, -176418897);
+            d = ff(d, a, b, c, k[5], 12, 1200080426);
+            c = ff(c, d, a, b, k[6], 17, -1473231341);
+            b = ff(b, c, d, a, k[7], 22, -45705983);
+            a = ff(a, b, c, d, k[8], 7, 1770035416);
+            d = ff(d, a, b, c, k[9], 12, -1958414417);
+            c = ff(c, d, a, b, k[10], 17, -42063);
+            b = ff(b, c, d, a, k[11], 22, -1990404162);
+            a = ff(a, b, c, d, k[12], 7, 1804603682);
+            d = ff(d, a, b, c, k[13], 12, -40341101);
+            c = ff(c, d, a, b, k[14], 17, -1502002290);
+            b = ff(b, c, d, a, k[15], 22, 1236535329);
+
+            a = gg(a, b, c, d, k[1], 5, -165796510);
+            d = gg(d, a, b, c, k[6], 9, -1069501632);
+            c = gg(c, d, a, b, k[11], 14, 643717713);
+            b = gg(b, c, d, a, k[0], 20, -373897302);
+            a = gg(a, b, c, d, k[5], 5, -701558691);
+            d = gg(d, a, b, c, k[10], 9, 38016083);
+            c = gg(c, d, a, b, k[15], 14, -660478335);
+            b = gg(b, c, d, a, k[4], 20, -405537848);
+            a = gg(a, b, c, d, k[9], 5, 568446438);
+            d = gg(d, a, b, c, k[14], 9, -1019803690);
+            c = gg(c, d, a, b, k[3], 14, -187363961);
+            b = gg(b, c, d, a, k[8], 20, 1163531501);
+            a = gg(a, b, c, d, k[13], 5, -1444681467);
+            d = gg(d, a, b, c, k[2], 9, -51403784);
+            c = gg(c, d, a, b, k[7], 14, 1735328473);
+            b = gg(b, c, d, a, k[12], 20, -1926607734);
+
+            a = hh(a, b, c, d, k[5], 4, -378558);
+            d = hh(d, a, b, c, k[8], 11, -2022574463);
+            c = hh(c, d, a, b, k[11], 16, 1839030562);
+            b = hh(b, c, d, a, k[14], 23, -35309556);
+            a = hh(a, b, c, d, k[1], 4, -1530992060);
+            d = hh(d, a, b, c, k[4], 11, 1272893353);
+            c = hh(c, d, a, b, k[7], 16, -155497632);
+            b = hh(b, c, d, a, k[10], 23, -1094730640);
+            a = hh(a, b, c, d, k[13], 4, 681279174);
+            d = hh(d, a, b, c, k[0], 11, -358537222);
+            c = hh(c, d, a, b, k[3], 16, -722521979);
+            b = hh(b, c, d, a, k[6], 23, 76029189);
+            a = hh(a, b, c, d, k[9], 4, -640364487);
+            d = hh(d, a, b, c, k[12], 11, -421815835);
+            c = hh(c, d, a, b, k[15], 16, 530742520);
+            b = hh(b, c, d, a, k[2], 23, -995338651);
+
+            a = ii(a, b, c, d, k[0], 6, -198630844);
+            d = ii(d, a, b, c, k[7], 10, 1126891415);
+            c = ii(c, d, a, b, k[14], 15, -1416354905);
+            b = ii(b, c, d, a, k[5], 21, -57434055);
+            a = ii(a, b, c, d, k[12], 6, 1700485571);
+            d = ii(d, a, b, c, k[3], 10, -1894986606);
+            c = ii(c, d, a, b, k[10], 15, -1051523);
+            b = ii(b, c, d, a, k[1], 21, -2054922799);
+            a = ii(a, b, c, d, k[8], 6, 1873313359);
+            d = ii(d, a, b, c, k[15], 10, -30611744);
+            c = ii(c, d, a, b, k[6], 15, -1560198380);
+            b = ii(b, c, d, a, k[13], 21, 1309151649);
+            a = ii(a, b, c, d, k[4], 6, -145523070);
+            d = ii(d, a, b, c, k[11], 10, -1120210379);
+            c = ii(c, d, a, b, k[2], 15, 718787259);
+            b = ii(b, c, d, a, k[9], 21, -343485551);
+
+            x[0] = add32(a, x[0]);
+            x[1] = add32(b, x[1]);
+            x[2] = add32(c, x[2]);
+            x[3] = add32(d, x[3]);
+        },
+
+        /* there needs to be support for Unicode here,
+           * unless we pretend that we can redefine the MD-5
+           * algorithm for multi-byte characters (perhaps
+           * by adding every four 16-bit characters and
+           * shortening the sum to 32 bits). Otherwise
+           * I suggest performing MD-5 as if every character
+           * was two bytes--e.g., 0040 0025 = @%--but then
+           * how will an ordinary MD-5 sum be matched?
+           * There is no way to standardize text to something
+           * like UTF-8 before transformation; speed cost is
+           * utterly prohibitive. The JavaScript standard
+           * itself needs to look at this: it should start
+           * providing access to strings as preformed UTF-8
+           * 8-bit unsigned value arrays.
+           */
+        md5blk = function (s) {
+            var md5blks = [],
+                i; /* Andy King said do it this way. */
+
+            for (i = 0; i < 64; i += 4) {
+                md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
+            }
+            return md5blks;
+        },
+
+        md5blk_array = function (a) {
+            var md5blks = [],
+                i; /* Andy King said do it this way. */
+
+            for (i = 0; i < 64; i += 4) {
+                md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);
+            }
+            return md5blks;
+        },
+
+        md51 = function (s) {
+            var n = s.length,
+                state = [1732584193, -271733879, -1732584194, 271733878],
+                i,
+                length,
+                tail,
+                tmp,
+                lo,
+                hi;
+
+            for (i = 64; i <= n; i += 64) {
+                md5cycle(state, md5blk(s.substring(i - 64, i)));
+            }
+            s = s.substring(i - 64);
+            length = s.length;
+            tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
+            }
+            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+            if (i > 55) {
+                md5cycle(state, tail);
+                for (i = 0; i < 16; i += 1) {
+                    tail[i] = 0;
+                }
+            }
+
+            // Beware that the final length might not fit in 32 bits so we take care of that
+            tmp = n * 8;
+            tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+            lo = parseInt(tmp[2], 16);
+            hi = parseInt(tmp[1], 16) || 0;
+
+            tail[14] = lo;
+            tail[15] = hi;
+
+            md5cycle(state, tail);
+            return state;
+        },
+
+        md51_array = function (a) {
+            var n = a.length,
+                state = [1732584193, -271733879, -1732584194, 271733878],
+                i,
+                length,
+                tail,
+                tmp,
+                lo,
+                hi;
+
+            for (i = 64; i <= n; i += 64) {
+                md5cycle(state, md5blk_array(a.subarray(i - 64, i)));
+            }
+
+            // Not sure if it is a bug, however IE10 will always produce a sub array of length 1
+            // containing the last element of the parent array if the sub array specified starts
+            // beyond the length of the parent array - weird.
+            // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue
+            a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);
+
+            length = a.length;
+            tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= a[i] << ((i % 4) << 3);
+            }
+
+            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+            if (i > 55) {
+                md5cycle(state, tail);
+                for (i = 0; i < 16; i += 1) {
+                    tail[i] = 0;
+                }
+            }
+
+            // Beware that the final length might not fit in 32 bits so we take care of that
+            tmp = n * 8;
+            tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+            lo = parseInt(tmp[2], 16);
+            hi = parseInt(tmp[1], 16) || 0;
+
+            tail[14] = lo;
+            tail[15] = hi;
+
+            md5cycle(state, tail);
+
+            return state;
+        },
+
+        hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'],
+
+        rhex = function (n) {
+            var s = '',
+                j;
+            for (j = 0; j < 4; j += 1) {
+                s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];
+            }
+            return s;
+        },
+
+        hex = function (x) {
+            var i;
+            for (i = 0; i < x.length; i += 1) {
+                x[i] = rhex(x[i]);
+            }
+            return x.join('');
+        },
+
+        md5 = function (s) {
+            return hex(md51(s));
+        },
+
+
+
+        ////////////////////////////////////////////////////////////////////////////
+
+        /**
+         * SparkMD5 OOP implementation.
+         *
+         * Use this class to perform an incremental md5, otherwise use the
+         * static methods instead.
+         */
+        SparkMD5 = function () {
+            // call reset to init the instance
+            this.reset();
+        };
+
+
+        // In some cases the fast add32 function cannot be used..
+        if (md5('hello') !== '5d41402abc4b2a76b9719d911017c592') {
+            add32 = function (x, y) {
+                var lsw = (x & 0xFFFF) + (y & 0xFFFF),
+                    msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+                return (msw << 16) | (lsw & 0xFFFF);
+            };
+        }
+
+
+        /**
+         * Appends a string.
+         * A conversion will be applied if an utf8 string is detected.
+         *
+         * @param {String} str The string to be appended
+         *
+         * @return {SparkMD5} The instance itself
+         */
+        SparkMD5.prototype.append = function (str) {
+            // converts the string to utf8 bytes if necessary
+            if (/[\u0080-\uFFFF]/.test(str)) {
+                str = unescape(encodeURIComponent(str));
+            }
+
+            // then append as binary
+            this.appendBinary(str);
+
+            return this;
+        };
+
+        /**
+         * Appends a binary string.
+         *
+         * @param {String} contents The binary string to be appended
+         *
+         * @return {SparkMD5} The instance itself
+         */
+        SparkMD5.prototype.appendBinary = function (contents) {
+            this._buff += contents;
+            this._length += contents.length;
+
+            var length = this._buff.length,
+                i;
+
+            for (i = 64; i <= length; i += 64) {
+                md5cycle(this._state, md5blk(this._buff.substring(i - 64, i)));
+            }
+
+            this._buff = this._buff.substr(i - 64);
+
+            return this;
+        };
+
+        /**
+         * Finishes the incremental computation, reseting the internal state and
+         * returning the result.
+         * Use the raw parameter to obtain the raw result instead of the hex one.
+         *
+         * @param {Boolean} raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.prototype.end = function (raw) {
+            var buff = this._buff,
+                length = buff.length,
+                i,
+                tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+                ret;
+
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);
+            }
+
+            this._finish(tail, length);
+            ret = !!raw ? this._state : hex(this._state);
+
+            this.reset();
+
+            return ret;
+        };
+
+        /**
+         * Finish the final calculation based on the tail.
+         *
+         * @param {Array}  tail   The tail (will be modified)
+         * @param {Number} length The length of the remaining buffer
+         */
+        SparkMD5.prototype._finish = function (tail, length) {
+            var i = length,
+                tmp,
+                lo,
+                hi;
+
+            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+            if (i > 55) {
+                md5cycle(this._state, tail);
+                for (i = 0; i < 16; i += 1) {
+                    tail[i] = 0;
+                }
+            }
+
+            // Do the final computation based on the tail and length
+            // Beware that the final length may not fit in 32 bits so we take care of that
+            tmp = this._length * 8;
+            tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+            lo = parseInt(tmp[2], 16);
+            hi = parseInt(tmp[1], 16) || 0;
+
+            tail[14] = lo;
+            tail[15] = hi;
+            md5cycle(this._state, tail);
+        };
+
+        /**
+         * Resets the internal state of the computation.
+         *
+         * @return {SparkMD5} The instance itself
+         */
+        SparkMD5.prototype.reset = function () {
+            this._buff = "";
+            this._length = 0;
+            this._state = [1732584193, -271733879, -1732584194, 271733878];
+
+            return this;
+        };
+
+        /**
+         * Releases memory used by the incremental buffer and other aditional
+         * resources. If you plan to use the instance again, use reset instead.
+         */
+        SparkMD5.prototype.destroy = function () {
+            delete this._state;
+            delete this._buff;
+            delete this._length;
+        };
+
+
+        /**
+         * Performs the md5 hash on a string.
+         * A conversion will be applied if utf8 string is detected.
+         *
+         * @param {String}  str The string
+         * @param {Boolean} raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.hash = function (str, raw) {
+            // converts the string to utf8 bytes if necessary
+            if (/[\u0080-\uFFFF]/.test(str)) {
+                str = unescape(encodeURIComponent(str));
+            }
+
+            var hash = md51(str);
+
+            return !!raw ? hash : hex(hash);
+        };
+
+        /**
+         * Performs the md5 hash on a binary string.
+         *
+         * @param {String}  content The binary string
+         * @param {Boolean} raw     True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.hashBinary = function (content, raw) {
+            var hash = md51(content);
+
+            return !!raw ? hash : hex(hash);
+        };
+
+        /**
+         * SparkMD5 OOP implementation for array buffers.
+         *
+         * Use this class to perform an incremental md5 ONLY for array buffers.
+         */
+        SparkMD5.ArrayBuffer = function () {
+            // call reset to init the instance
+            this.reset();
+        };
+
+        ////////////////////////////////////////////////////////////////////////////
+
+        /**
+         * Appends an array buffer.
+         *
+         * @param {ArrayBuffer} arr The array to be appended
+         *
+         * @return {SparkMD5.ArrayBuffer} The instance itself
+         */
+        SparkMD5.ArrayBuffer.prototype.append = function (arr) {
+            // TODO: we could avoid the concatenation here but the algorithm would be more complex
+            //       if you find yourself needing extra performance, please make a PR.
+            var buff = this._concatArrayBuffer(this._buff, arr),
+                length = buff.length,
+                i;
+
+            this._length += arr.byteLength;
+
+            for (i = 64; i <= length; i += 64) {
+                md5cycle(this._state, md5blk_array(buff.subarray(i - 64, i)));
+            }
+
+            // Avoids IE10 weirdness (documented above)
+            this._buff = (i - 64) < length ? buff.subarray(i - 64) : new Uint8Array(0);
+
+            return this;
+        };
+
+        /**
+         * Finishes the incremental computation, reseting the internal state and
+         * returning the result.
+         * Use the raw parameter to obtain the raw result instead of the hex one.
+         *
+         * @param {Boolean} raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.ArrayBuffer.prototype.end = function (raw) {
+            var buff = this._buff,
+                length = buff.length,
+                tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+                i,
+                ret;
+
+            for (i = 0; i < length; i += 1) {
+                tail[i >> 2] |= buff[i] << ((i % 4) << 3);
+            }
+
+            this._finish(tail, length);
+            ret = !!raw ? this._state : hex(this._state);
+
+            this.reset();
+
+            return ret;
+        };
+
+        SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;
+
+        /**
+         * Resets the internal state of the computation.
+         *
+         * @return {SparkMD5.ArrayBuffer} The instance itself
+         */
+        SparkMD5.ArrayBuffer.prototype.reset = function () {
+            this._buff = new Uint8Array(0);
+            this._length = 0;
+            this._state = [1732584193, -271733879, -1732584194, 271733878];
+
+            return this;
+        };
+
+        /**
+         * Releases memory used by the incremental buffer and other aditional
+         * resources. If you plan to use the instance again, use reset instead.
+         */
+        SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;
+
+        /**
+         * Concats two array buffers, returning a new one.
+         *
+         * @param  {ArrayBuffer} first  The first array buffer
+         * @param  {ArrayBuffer} second The second array buffer
+         *
+         * @return {ArrayBuffer} The new array buffer
+         */
+        SparkMD5.ArrayBuffer.prototype._concatArrayBuffer = function (first, second) {
+            var firstLength = first.length,
+                result = new Uint8Array(firstLength + second.byteLength);
+
+            result.set(first);
+            result.set(new Uint8Array(second), firstLength);
+
+            return result;
+        };
+
+        /**
+         * Performs the md5 hash on an array buffer.
+         *
+         * @param {ArrayBuffer} arr The array buffer
+         * @param {Boolean}     raw True to get the raw result, false to get the hex result
+         *
+         * @return {String|Array} The result
+         */
+        SparkMD5.ArrayBuffer.hash = function (arr, raw) {
+            var hash = md51_array(new Uint8Array(arr));
+
+            return !!raw ? hash : hex(hash);
+        };
+
+        return FlashRuntime.register( 'Md5', {
+            init: function() {
+                // do nothing.
+            },
+
+            loadFromBlob: function( file ) {
+                var blob = file.getSource(),
+                    chunkSize = 2 * 1024 * 1024,
+                    chunks = Math.ceil( blob.size / chunkSize ),
+                    chunk = 0,
+                    owner = this.owner,
+                    spark = new SparkMD5.ArrayBuffer(),
+                    me = this,
+                    blobSlice = blob.mozSlice || blob.webkitSlice || blob.slice,
+                    loadNext, fr;
+
+                fr = new FileReader();
+
+                loadNext = function() {
+                    var start, end;
+
+                    start = chunk * chunkSize;
+                    end = Math.min( start + chunkSize, blob.size );
+
+                    fr.onload = function( e ) {
+                        spark.append( e.target.result );
+                        owner.trigger( 'progress', {
+                            total: file.size,
+                            loaded: end
+                        });
+                    };
+
+                    fr.onloadend = function() {
+                        fr.onloadend = fr.onload = null;
+
+                        if ( ++chunk < chunks ) {
+                            setTimeout( loadNext, 1 );
+                        } else {
+                            setTimeout(function(){
+                                owner.trigger('load');
+                                me.result = spark.end();
+                                loadNext = file = blob = spark = null;
+                                owner.trigger('complete');
+                            }, 50 );
+                        }
+                    };
+
+                    fr.readAsArrayBuffer( blobSlice.call( blob, start, end ) );
+                };
+
+                loadNext();
+            },
+
+            getResult: function() {
+                return this.result;
+            }
+        });
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+
+
+        function getFlashVersion() {
+            var version;
+
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destroy = this.destroy,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                clients[ uid ] = client;
+
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+
+                    instance = pool[ uid ];
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+
+                return me.flashExec.apply( client, arguments );
+            };
+
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+
+                // console.log.apply( console, arguments );
+
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+
+                // Base.log( evt, obj );
+            }
+
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+
+            this.jsreciver = jsreciver;
+
+            this.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+
+                return flash.exec( this.uid, comp, fn, args );
+            };
+
+            // @todo
+        }
+
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+
+                container.html( html );
+            },
+
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+
+        });
+
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+
+            return component;
+        };
+
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+
+                delete copy.button;
+                delete copy.id;
+                delete copy.container;
+
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+
+            destroy: function() {
+                this.flashExec( 'FilePicker', 'destroy' );
+            }
+        });
+    });
+    /**
+     * @fileOverview 图片压缩
+     */
+    define('runtime/flash/image',[
+        'runtime/flash/runtime'
+    ], function( FlashRuntime ) {
+
+        return FlashRuntime.register( 'Image', {
+            // init: function( options ) {
+            //     var owner = this.owner;
+
+            //     this.flashExec( 'Image', 'init', options );
+            //     owner.on( 'load', function() {
+            //         debugger;
+            //     });
+            // },
+
+            loadFromBlob: function( blob ) {
+                var owner = this.owner;
+
+                owner.info() && this.flashExec( 'Image', 'info', owner.info() );
+                owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );
+
+                this.flashExec( 'Image', 'loadFromBlob', blob.uid );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+
+                xhr.connectRuntime( blob.ruid );
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server,
+                    forceURLStream: opts.forceURLStream,
+                    mimeType: 'application/octet-stream'
+                }, binary );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            getResponse: function() {
+                return this._response || '';
+            },
+
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    var percent = e.loaded / e.total;
+                    percent = Math.min( 1, Math.max( 0, percent ) );
+                    return me.trigger( 'progress', percent );
+                });
+
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        readBody = false,
+                        err = '',
+                        p;
+
+                    xhr.off();
+                    me._xhr = null;
+
+                    if ( status >= 200 && status < 300 ) {
+                        readBody = true;
+                    } else if ( status >= 500 && status < 600 ) {
+                        readBody = true;
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+
+                    if ( readBody ) {
+                        me._response = xhr.exec('getResponse');
+                        me._response = decodeURIComponent( me._response );
+
+                        // flash 处理可能存在 bug, 没辙只能靠 js 了
+                        // try {
+                        //     me._responseJson = xhr.exec('getResponseAsJson');
+                        // } catch ( error ) {
+
+                        p = window.JSON && window.JSON.parse || function( s ) {
+                            try {
+                                return new Function('return ' + s).call();
+                            } catch ( err ) {
+                                return {};
+                            }
+                        };
+                        me._responseJson  = me._response ? p(me._response) : {};
+
+                        // }
+                    }
+
+                    xhr.destroy();
+                    xhr = null;
+
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/flash/blob',[
+        'runtime/flash/runtime',
+        'lib/blob'
+    ], function( FlashRuntime, Blob ) {
+
+        return FlashRuntime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.flashExec( 'Blob', 'slice', start, end );
+
+                return new Blob( blob.uid, blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Md5 flash实现
+     */
+    define('runtime/flash/md5',[
+        'runtime/flash/runtime'
+    ], function( FlashRuntime ) {
+
+        return FlashRuntime.register( 'Md5', {
+            init: function() {
+                // do nothing.
+            },
+
+            loadFromBlob: function( blob ) {
+                return this.flashExec( 'Md5', 'loadFromBlob', blob.uid );
+            }
+        });
+    });
+    /**
+     * @fileOverview 完全版本。
+     */
+    define('preset/all',[
+        'base',
+
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+        'widgets/md5',
+
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/imagemeta/exif',
+        'runtime/html5/androidpatch',
+        'runtime/html5/image',
+        'runtime/html5/transport',
+        'runtime/html5/md5',
+
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/image',
+        'runtime/flash/transport',
+        'runtime/flash/blob',
+        'runtime/flash/md5'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/all'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.nolog.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.nolog.min.js
new file mode 100644
index 0000000..990b2ab
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.nolog.min.js
@@ -0,0 +1,3 @@
+/* WebUploader 0.1.5 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}return a},j=function(c){return a.__dollar=c,i(b(a,f,e))};"object"==typeof module&&"object"==typeof module.exports?module.exports=j():"function"==typeof define&&define.amd?define(["jquery"],j):(c=a.WebUploader,a.WebUploader=j(),a.WebUploader.noConflict=function(){a.WebUploader=c})}(window,function(a,b,c){return b("dollar-third",[],function(){var b=a.__dollar||a.jQuery||a.Zepto;if(!b)throw new Error("jQuery or Zepto not found!");return b}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.5",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",cancelFile:"cancel-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",md5File:"md5-file",getDimension:"get-dimension",addButton:"add-btn",predictRuntimeType:"predict-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return a?{successNum:a.numOfSuccess,progressNum:a.numOfProgress,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue,interruptNum:a.numofInterrupt}:{}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},destroy:function(){this.request("destroy",arguments),this.off()},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,this._parent=a,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.remove(),this._parent&&this._parent.removeClass("webuploader-container"),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g=b.prototype.destroy,h={},i=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):h},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[],c=a.options.disableWidgets||"";return e.each(i,function(d,e){(!c||!~c.indexOf(e._name))&&b.push(new e(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,g,i,j,k=0,l=this._widgets,m=l&&l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],g=f.invoke(b,d),g!==h&&(a.isPromise(g)?o.push(g):n.push(g));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return 1===c.length&&(c=c[0]),setTimeout(function(){b.resolve(c)},1),b.promise()})[e?j:"done"](e||a.noop)):n[0]},destroy:function(){g.apply(this,arguments),this._widgets=null}}),b.register=d.register=function(b,c){var f,g={init:"init",destroy:"destroy",name:"anonymous"};return 1===arguments.length?(c=b,e.each(c,function(a){return"_"===a[0]||"name"===a?void("name"===a&&(g.name=c.name)):void(g[a.replace(/[A-Z]/g,"-$&").toLowerCase()]=a)})):g=e.extend(g,b),c.responseMap=g,f=a.inherits(d,c),f._name=g.name,i.push(f),f},b.unRegister=d.unRegister=function(a){if(a&&"anonymous"!==a)for(var b=i.length;b--;)i[b]._name===a&&i.splice(b,1)},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({name:"dnd",init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return this.dnd=e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}},destroy:function(){this.dnd&&this.dnd.destroy()}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({name:"paste",init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return this.paste=e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}},destroy:function(){this.paste&&this.paste.destroy()}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,this.size=c.size||0,this.type=!c.type&&this.ext&&~"jpg,jpeg,png,gif,bmp".indexOf(this.ext)?"image/"+("jpg"===this.ext?"jpeg":this.ext):c.type||"application/octet-stream",b.call(d,"Blob"),this.uid=c.uid||this.uid,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&c.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(c.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString(),b.apply(this,arguments)}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var c=this,e=c.options,g=e.button;g.addClass("webuploader-pick"),c.on("all",function(a){var b;switch(a){case"mouseenter":g.addClass("webuploader-pick-hover");break;case"mouseleave":g.removeClass("webuploader-pick-hover");break;case"change":b=c.exec("getFiles"),c.trigger("select",f.map(b,function(a){return a=new d(c.getRuid(),a),a._refer=e.container,a}),e.container)}}),c.connectRuntime(e,function(){c.refresh(),c.exec("init",e),c.trigger("ready")}),this._resizeHandler=b.bindFn(this.refresh,this),f(a).on("resize",this._resizeHandler)},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){var b=this.options.button;f(a).off("resize",this._resizeHandler),b.removeClass("webuploader-pick-disable webuploader-pick-hover webuploader-pick")}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({name:"picker",init:function(a){return this.pickers=[],a.pick&&this.addBtn(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addBtn:function(b){var e=this,f=e.options,g=f.accept,h=[];if(b)return d.isPlainObject(b)||(b={id:b}),d(b.id).each(function(){var i,j,k;k=a.Deferred(),i=d.extend({},b,{accept:d.isPlainObject(g)?[g]:g,swf:f.swf,runtimeOrder:f.runtimeOrder,id:this}),j=new c(i),j.once("ready",k.resolve),j.on("select",function(a){e.owner.request("add-file",[a])}),j.init(),e.pickers.push(j),h.push(k.promise())}),a.when.apply(a,h)},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})},destroy:function(){d.each(this.pickers,function(){this.destroy()}),this.pickers=null}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!1,allowMagnify:!1},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},crop:function(){var b=a.slice(arguments);return this.exec.apply(this,["crop"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({name:"image",makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),1>=f&&f>0&&(f=a._info.width*f),1>=g&&g>0&&(g=a._info.height*g),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(a){b(a||!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},beforeSendFile:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||0,i=g&&g.noCompressIfLarger||!1;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){var a=g.width,c=g.height;b._info=b._info||d.info(),b._meta=b._meta||d.meta(),1>=a&&a>0&&(a=b._info.width*a),1>=c&&c>0&&(c=b._info.height*c),d.resize(a,c)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,(!i||a.size<c)&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application/octet-stream",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destroy:function(){this.off(),delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0,numofDeleted:0,numofInterrupt:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},removeFile:function(a){var b=this._map[a.id];b&&(delete this._map[a.id],a.destroy(),this.stats.numofDeleted++)},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)}))},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--;break;case f.INTERRUPT:c.numofInterrupt--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++;break;case f.INTERRUPT:c.numofInterrupt++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({name:"queue",init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),this.placeholder=l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||!a.size||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFile:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&setTimeout(function(){b.request("start-upload")},20)},getStats:function(){return this.stats},removeFile:function(a,b){var c=this;a=a.id?a:c.queue.getFile(a),this.request("cancel-file",a),b&&this.queue.removeFile(a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.owner.trigger("reset"),this.queue=new c,this.stats=this.queue.stats},destroy:function(){this.reset(),this.placeholder&&this.placeholder.destroy()}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({name:"runtime",init:function(){if(!this.predictRuntimeType())throw Error("Runtime Error")},predictRuntimeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){var c,d,e=[],f=a.source,g=f.size,h=b?Math.ceil(g/b):1,i=0,j=0;for(d={file:a,has:function(){return!!e.length},shift:function(){return e.shift()},unshift:function(a){e.unshift(a)}};h>j;)c=Math.min(b,g-i),e.push({file:a,start:i,end:b?i+c:g,total:g,chunks:h,chunk:j++,cuted:d}),i+=c;return a.blocks=e.concat(),a.remaning=e.length,d}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:{}}),b.register({name:"upload",init:function(){var b=this.owner,c=this;this.runing=!1,this.progress=!1,b.on("startUpload",function(){c.progress=!0}).on("uploadFinished",function(){c.progress=!1}),this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},reset:function(){this.request("stop-upload",!0),this.runing=!1,this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this._trigged=!1,this._promise=null},startUpload:function(b){var c=this;if(f.each(c.request("get-files",h.INVALID),function(){c.request("remove-file",this)}),b)if(b=b.id?b:c.request("get-file",b),b.getStatus()===h.INTERRUPT)f.each(c.pool,function(a,c){c.file===b&&c.transport&&c.transport.send()}),b.setStatus(h.QUEUED);else{if(b.getStatus()===h.PROGRESS)return;b.setStatus(h.QUEUED)}else f.each(c.request("get-files",[h.INITED]),function(){this.setStatus(h.QUEUED)});if(!c.runing){c.runing=!0;var d=[];f.each(c.pool,function(a,b){var e=b.file;e.getStatus()===h.INTERRUPT&&(d.push(e),c._trigged=!1,b.transport&&b.transport.send())});for(var b;b=d.shift();)b.setStatus(h.PROGRESS);b||f.each(c.request("get-files",h.INTERRUPT),function(){this.setStatus(h.PROGRESS)}),c._trigged=!1,a.nextTick(c.__tick),c.owner.trigger("startUpload")}},stopUpload:function(b,c){var d=this;if(b===!0&&(c=b,b=null),d.runing!==!1){if(b){if(b=b.id?b:d.request("get-file",b),b.getStatus()!==h.PROGRESS&&b.getStatus()!==h.QUEUED)return;return b.setStatus(h.INTERRUPT),f.each(d.pool,function(a,c){c.file===b&&(c.transport&&c.transport.abort(),d._putback(c),d._popBlock(c))}),a.nextTick(d.__tick)}d.runing=!1,this._promise&&this._promise.file&&this._promise.file.setStatus(h.INTERRUPT),c&&f.each(d.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),d.owner.trigger("stopUpload")}},cancelFile:function(a){a=a.id?a:this.request("get-file",a),a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),a.setStatus(h.CANCELLED),this.owner.trigger("fileDequeued",a)},isInProgress:function(){return!!this.progress},_getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=a.id?a:this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d._getStats().numOfQueue||d._getStats().numofInterrupt||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_putback:function(a){var b;a.cuted.unshift(a),b=this.stack.indexOf(a.cuted),~b||this.stack.unshift(a.cuted)},_getStack:function(){for(var a,b=0;a=this.stack[b++];){if(a.has()&&a.file.getStatus()===h.PROGRESS)return a;(!a.has()||a.file.getStatus()!==h.PROGRESS&&a.file.getStatus()!==h.INTERRUPT)&&this.stack.splice(--b,1)}return null},_nextBlock:function(){var a,b,c,d,f=this,h=f.options;return(a=this._getStack())?(h.prepareNextFile&&!f.pending.length&&f._prepareNextFile(),a.shift()):f.runing?(!f.pending.length&&f._getStats().numOfQueue&&f._prepareNextFile(),b=f.pending.shift(),c=function(b){return b?(a=e(b,h.chunked?h.chunkSize:0),f.stack.push(a),a.shift()):null},g(b)?(d=b.file,b=b[b.pipe?"pipe":"then"](c),b.file=d,b):c(b)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.PROGRESS||c.getStatus()===h.INTERRUPT?c:b._finishFile(c)}),b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),a.file=c,a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;return e.getStatus()!==h.PROGRESS?void(e.getStatus()===h.INTERRUPT&&d._putback(b)):(d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),void c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d.updateFileProgress(e),d._popBlock(b),a.nextTick(d.__tick))}))},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){b.percentage=a,g.updateFileProgress(k)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)
+}).always(function(){d.trigger("uploadComplete",a)})},updateFileProgress:function(a){var b=0,c=0;a.blocks&&(f.each(a.blocks,function(a,b){c+=(b.percentage||0)*(b.end-b.start)}),b=c/a.size,this.owner.trigger("uploadProgress",a,b||0))}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({name:"validator",init:function(){var b=this;a.nextTick(function(){e.each(f,function(){this.call(b.owner)})})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileNumLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("reset",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileSizeLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("reset",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",d,a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}),b.on("reset",function(){d={}}))}),d}),b("lib/md5",["runtime/client","mediator"],function(a,b){function c(){a.call(this,"Md5")}return b.installTo(c.prototype),c.prototype.loadFromBlob=function(a){var b=this;b.getRuid()&&b.disconnectRuntime(),b.connectRuntime(a.ruid,function(){b.exec("init"),b.exec("loadFromBlob",a)})},c.prototype.getResult=function(){return this.exec("getResult")},c}),b("widgets/md5",["base","uploader","lib/md5","lib/blob","widgets/widget"],function(a,b,c,d){return b.register({name:"md5",md5File:function(b,e,f){var g=new c,h=a.Deferred(),i=b instanceof d?b:this.request("get-file",b).source;return g.on("progress load",function(a){a=a||{},h.notify(a.total?a.loaded/a.total:1)}),g.on("complete",function(){h.resolve(g.getResult())}),g.on("error",function(a){h.reject(a)}),arguments.length>1&&(e=e||0,f=f||0,0>e&&(e=i.size+e),0>f&&(f=i.size+f),f=Math.min(f,i.size),i=i.slice(e,f)),g.loadFromBlob(i),h.promise()}})}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destroy;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destroy=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b,f,g=this,h=g.getRuid(),i=g.elem.parent().get(0);if(i&&!d.contains(i,a.currentTarget))return!1;a=a.originalEvent||a,b=a.dataTransfer;try{f=b.getData("text/html")}catch(j){}return f?void 0:(g._getTansferFiles(b,function(a){g.trigger("drop",d.map(a,function(a){return new c(h,a)}))}),g.dndOver=!1,g.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k=[],l=[];for(d=b.items,e=b.files,j=!(!d||!d[0].webkitGetAsEntry),h=0,i=e.length;i>h;h++)f=e[h],g=d&&d[h],j&&g.webkitGetAsEntry().isDirectory?l.push(this._traverseDirectoryTree(g.webkitGetAsEntry(),k)):k.push(f);a.when.apply(a,l).done(function(){k.length&&c(k)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a&&(a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragOverHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler)))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=this.label=c(document.createElement("label")),k=this.input=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),b.value=null,this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){this.input.off(),this.label.off()}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;e<b.length;e++)c[e]=b.charCodeAt(e);return f=g[0].split(":")[1].split(";")[0],this.arrayBufferToBlob(d,f)},dataURL2ArrayBuffer:function(a){var b,c,d,e;for(e=a.split(","),b=~e[0].indexOf("base64")?atob(e[1]):decodeURIComponent(e[1]),c=new Uint8Array(b.length),d=0;d<b.length;d++)c[d]=b.charCodeAt(d);return c.buffer},arrayBufferToBlob:function(b,c){var d,e=a.BlobBuilder||a.WebKitBlobBuilder;return e?(d=new e,d.append(b),d.getBlob(c)):new Blob([b],c?{type:c}:{})},canvasToDataUrl:function(a,b,c){return a.toDataURL(b,c/100)},parseMeta:function(a,b){b(!1,{})},updateImageHead:function(a){return a}}}),b("runtime/html5/imagemeta",["runtime/html5/util"],function(a){var b;return b={parsers:{65505:[]},maxMetaDataSize:262144,parse:function(a,b){var c=this,d=new FileReader;d.onload=function(){b(!1,c._parse(this.result)),d=d.onload=d.onerror=null},d.onerror=function(a){b(a.message),d=d.onload=d.onerror=null},a=a.slice(0,c.maxMetaDataSize),d.readAsArrayBuffer(a.getSource())},_parse:function(a,c){if(!(a.byteLength<6)){var d,e,f,g,h=new DataView(a),i=2,j=h.byteLength-4,k=i,l={};if(65496===h.getUint16(0)){for(;j>i&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g<f.length;g+=1)f[g].call(b,h,i,e,l);i+=e,k=i}k>6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;l<k.length&&(n=k[l],"\x00"!==n);l+=1)m+=n;return m}return k},c.parseExifTag=function(a,b,d,e,f){var g=a.getUint16(d,e);f.exif[g]=c.getExifValue(a,b,d,a.getUint16(d+2,e),a.getUint32(d+4,e),e)},c.parseExifTags=function(b,c,d,e,f){var g,h,i;if(d+6>b.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/jpegencoder",[],function(){function a(a){function b(a){for(var b=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],c=0;64>c;c++){var d=y((b[c]*a+50)/100);1>d?d=1:d>255&&(d=255),z[P[c]]=d}for(var e=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],f=0;64>f;f++){var g=y((e[f]*a+50)/100);1>g?g=1:g>255&&(g=255),A[P[f]]=g}for(var h=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],i=0,j=0;8>j;j++)for(var k=0;8>k;k++)B[i]=1/(z[P[i]]*h[j]*h[k]*8),C[i]=1/(A[P[i]]*h[j]*h[k]*8),i++}function c(a,b){for(var c=0,d=0,e=new Array,f=1;16>=f;f++){for(var g=1;g<=a[f];g++)e[b[d]]=[],e[b[d]][0]=c,e[b[d]][1]=f,d++,c++;c*=2}return e}function d(){t=c(Q,R),u=c(U,V),v=c(S,T),w=c(W,X)}function e(){for(var a=1,b=2,c=1;15>=c;c++){for(var d=a;b>d;d++)E[32767+d]=c,D[32767+d]=[],D[32767+d][1]=c,D[32767+d][0]=d;for(var e=-(b-1);-a>=e;e++)E[32767+e]=c,D[32767+e]=[],D[32767+e][1]=c,D[32767+e][0]=b-1+e;a<<=1,b<<=1}}function f(){for(var a=0;256>a;a++)O[a]=19595*a,O[a+256>>0]=38470*a,O[a+512>>0]=7471*a+32768,O[a+768>>0]=-11059*a,O[a+1024>>0]=-21709*a,O[a+1280>>0]=32768*a+8421375,O[a+1536>>0]=-27439*a,O[a+1792>>0]=-5329*a}function g(a){for(var b=a[0],c=a[1]-1;c>=0;)b&1<<c&&(I|=1<<J),c--,J--,0>J&&(255==I?(h(255),h(0)):h(I),J=7,I=0)}function h(a){H.push(N[a])}function i(a){h(a>>8&255),h(255&a)}function j(a,b){var c,d,e,f,g,h,i,j,k,l=0,m=8,n=64;for(k=0;m>k;++k){c=a[l],d=a[l+1],e=a[l+2],f=a[l+3],g=a[l+4],h=a[l+5],i=a[l+6],j=a[l+7];var o=c+j,p=c-j,q=d+i,r=d-i,s=e+h,t=e-h,u=f+g,v=f-g,w=o+u,x=o-u,y=q+s,z=q-s;a[l]=w+y,a[l+4]=w-y;var A=.707106781*(z+x);a[l+2]=x+A,a[l+6]=x-A,w=v+t,y=t+r,z=r+p;var B=.382683433*(w-z),C=.5411961*w+B,D=1.306562965*z+B,E=.707106781*y,G=p+E,H=p-E;a[l+5]=H+C,a[l+3]=H-C,a[l+1]=G+D,a[l+7]=G-D,l+=8}for(l=0,k=0;m>k;++k){c=a[l],d=a[l+8],e=a[l+16],f=a[l+24],g=a[l+32],h=a[l+40],i=a[l+48],j=a[l+56];var I=c+j,J=c-j,K=d+i,L=d-i,M=e+h,N=e-h,O=f+g,P=f-g,Q=I+O,R=I-O,S=K+M,T=K-M;a[l]=Q+S,a[l+32]=Q-S;var U=.707106781*(T+R);a[l+16]=R+U,a[l+48]=R-U,Q=P+N,S=N+L,T=L+J;var V=.382683433*(Q-T),W=.5411961*Q+V,X=1.306562965*T+V,Y=.707106781*S,Z=J+Y,$=J-Y;a[l+40]=$+W,a[l+24]=$-W,a[l+8]=Z+X,a[l+56]=Z-X,l++}var _;for(k=0;n>k;++k)_=a[k]*b[k],F[k]=_>0?_+.5|0:_-.5|0;return F}function k(){i(65504),i(16),h(74),h(70),h(73),h(70),h(0),h(1),h(1),h(0),i(1),i(1),h(0),h(0)}function l(a,b){i(65472),i(17),h(8),i(b),i(a),h(3),h(1),h(17),h(0),h(2),h(17),h(1),h(3),h(17),h(1)}function m(){i(65499),i(132),h(0);for(var a=0;64>a;a++)h(z[a]);h(1);for(var b=0;64>b;b++)h(A[b])}function n(){i(65476),i(418),h(0);for(var a=0;16>a;a++)h(Q[a+1]);for(var b=0;11>=b;b++)h(R[b]);h(16);for(var c=0;16>c;c++)h(S[c+1]);for(var d=0;161>=d;d++)h(T[d]);h(1);for(var e=0;16>e;e++)h(U[e+1]);for(var f=0;11>=f;f++)h(V[f]);h(17);for(var g=0;16>g;g++)h(W[g+1]);for(var j=0;161>=j;j++)h(X[j])}function o(){i(65498),i(12),h(3),h(1),h(0),h(2),h(17),h(3),h(17),h(0),h(63),h(0)}function p(a,b,c,d,e){for(var f,h=e[0],i=e[240],k=16,l=63,m=64,n=j(a,b),o=0;m>o;++o)G[P[o]]=n[o];var p=G[0]-c;c=G[0],0==p?g(d[0]):(f=32767+p,g(d[E[f]]),g(D[f]));for(var q=63;q>0&&0==G[q];q--);if(0==q)return g(h),c;for(var r,s=1;q>=s;){for(var t=s;0==G[s]&&q>=s;++s);var u=s-t;if(u>=k){r=u>>4;for(var v=1;r>=v;++v)g(i);u=15&u}f=32767+G[s],g(e[(u<<4)+E[f]]),g(D[f]),s++}return q!=l&&g(h),c}function q(){for(var a=String.fromCharCode,b=0;256>b;b++)N[b]=a(b)}function r(a){if(0>=a&&(a=1),a>100&&(a=100),x!=a){var c=0;c=Math.floor(50>a?5e3/a:200-2*a),b(c),x=a}}function s(){a||(a=50),q(),d(),e(),f(),r(a)}var t,u,v,w,x,y=(Math.round,Math.floor),z=new Array(64),A=new Array(64),B=new Array(64),C=new Array(64),D=new Array(65535),E=new Array(65535),F=new Array(64),G=new Array(64),H=[],I=0,J=7,K=new Array(64),L=new Array(64),M=new Array(64),N=new Array(256),O=new Array(2048),P=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],Q=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],R=[0,1,2,3,4,5,6,7,8,9,10,11],S=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],T=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],U=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],V=[0,1,2,3,4,5,6,7,8,9,10,11],W=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],X=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];this.encode=function(a,b){b&&r(b),H=new Array,I=0,J=7,i(65496),k(),m(),l(a.width,a.height),n(),o();var c=0,d=0,e=0;I=0,J=7,this.encode.displayName="_encode_";for(var f,h,j,q,s,x,y,z,A,D=a.data,E=a.width,F=a.height,G=4*E,N=0;F>N;){for(f=0;G>f;){for(s=G*N+f,x=s,y=-1,z=0,A=0;64>A;A++)z=A>>3,y=4*(7&A),x=s+z*G+y,N+z>=F&&(x-=G*(N+1+z-F)),f+y>=G&&(x-=f+y-G+4),h=D[x++],j=D[x++],q=D[x++],K[A]=(O[h]+O[j+256>>0]+O[q+512>>0]>>16)-128,L[A]=(O[h+768>>0]+O[j+1024>>0]+O[q+1280>>0]>>16)-128,M[A]=(O[h+1280>>0]+O[j+1536>>0]+O[q+1792>>0]>>16)-128;c=p(K,B,c,t,v),d=p(L,C,d,u,w),e=p(M,C,e,u,w),f+=32}N+=8}if(J>=0){var P=[];P[1]=J+1,P[0]=(1<<J+1)-1,g(P)}i(65497);var Q="data:image/jpeg;base64,"+btoa(H.join(""));return H=[],Q},s()}return a.encode=function(b,c){var d=new a(c);return d.encode(b)},a}),b("runtime/html5/androidpatch",["runtime/html5/util","runtime/html5/jpegencoder","base"],function(a,b,c){var d,e=a.canvasToDataUrl;a.canvasToDataUrl=function(a,f,g){var h,i,j,k,l;return c.os.android?("image/jpeg"===f&&"undefined"==typeof d&&(k=e.apply(null,arguments),l=k.split(","),k=~l[0].indexOf("base64")?atob(l[1]):decodeURIComponent(l[1]),k=k.substring(0,2),d=255===k.charCodeAt(0)&&216===k.charCodeAt(1)),"image/jpeg"!==f||d?e.apply(null,arguments):(i=a.width,j=a.height,h=a.getContext("2d"),b.encode(h.getImageData(0,0,i,j),g))):e.apply(null,arguments)}}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete","resize")},crop:function(a,b,c,d,e){var f=this._canvas||(this._canvas=document.createElement("canvas")),g=this.options,h=this._img,i=h.naturalWidth,j=h.naturalHeight,k=this.getOrientation();e=e||1,f.width=c,f.height=d,g.preserveHeaders||this._rotate2Orientaion(f,k),this._renderImageToCanvas(f,h,-a,-b,i*e,j*e),this._blob=null,this.modified=!0,this.owner.trigger("complete","crop")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,a,e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(b){var c=a.slice(arguments,1),d=b.getContext("2d");d.drawImage.apply(d,c)}}()})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType&&h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("runtime/html5/md5",["runtime/html5/runtime"],function(a){var b=function(a,b){return a+b&4294967295},c=function(a,c,d,e,f,g){return c=b(b(c,a),b(e,g)),b(c<<f|c>>>32-f,d)},d=function(a,b,d,e,f,g,h){return c(b&d|~b&e,a,b,f,g,h)},e=function(a,b,d,e,f,g,h){return c(b&e|d&~e,a,b,f,g,h)},f=function(a,b,d,e,f,g,h){return c(b^d^e,a,b,f,g,h)},g=function(a,b,d,e,f,g,h){return c(d^(b|~e),a,b,f,g,h)},h=function(a,c){var h=a[0],i=a[1],j=a[2],k=a[3];h=d(h,i,j,k,c[0],7,-680876936),k=d(k,h,i,j,c[1],12,-389564586),j=d(j,k,h,i,c[2],17,606105819),i=d(i,j,k,h,c[3],22,-1044525330),h=d(h,i,j,k,c[4],7,-176418897),k=d(k,h,i,j,c[5],12,1200080426),j=d(j,k,h,i,c[6],17,-1473231341),i=d(i,j,k,h,c[7],22,-45705983),h=d(h,i,j,k,c[8],7,1770035416),k=d(k,h,i,j,c[9],12,-1958414417),j=d(j,k,h,i,c[10],17,-42063),i=d(i,j,k,h,c[11],22,-1990404162),h=d(h,i,j,k,c[12],7,1804603682),k=d(k,h,i,j,c[13],12,-40341101),j=d(j,k,h,i,c[14],17,-1502002290),i=d(i,j,k,h,c[15],22,1236535329),h=e(h,i,j,k,c[1],5,-165796510),k=e(k,h,i,j,c[6],9,-1069501632),j=e(j,k,h,i,c[11],14,643717713),i=e(i,j,k,h,c[0],20,-373897302),h=e(h,i,j,k,c[5],5,-701558691),k=e(k,h,i,j,c[10],9,38016083),j=e(j,k,h,i,c[15],14,-660478335),i=e(i,j,k,h,c[4],20,-405537848),h=e(h,i,j,k,c[9],5,568446438),k=e(k,h,i,j,c[14],9,-1019803690),j=e(j,k,h,i,c[3],14,-187363961),i=e(i,j,k,h,c[8],20,1163531501),h=e(h,i,j,k,c[13],5,-1444681467),k=e(k,h,i,j,c[2],9,-51403784),j=e(j,k,h,i,c[7],14,1735328473),i=e(i,j,k,h,c[12],20,-1926607734),h=f(h,i,j,k,c[5],4,-378558),k=f(k,h,i,j,c[8],11,-2022574463),j=f(j,k,h,i,c[11],16,1839030562),i=f(i,j,k,h,c[14],23,-35309556),h=f(h,i,j,k,c[1],4,-1530992060),k=f(k,h,i,j,c[4],11,1272893353),j=f(j,k,h,i,c[7],16,-155497632),i=f(i,j,k,h,c[10],23,-1094730640),h=f(h,i,j,k,c[13],4,681279174),k=f(k,h,i,j,c[0],11,-358537222),j=f(j,k,h,i,c[3],16,-722521979),i=f(i,j,k,h,c[6],23,76029189),h=f(h,i,j,k,c[9],4,-640364487),k=f(k,h,i,j,c[12],11,-421815835),j=f(j,k,h,i,c[15],16,530742520),i=f(i,j,k,h,c[2],23,-995338651),h=g(h,i,j,k,c[0],6,-198630844),k=g(k,h,i,j,c[7],10,1126891415),j=g(j,k,h,i,c[14],15,-1416354905),i=g(i,j,k,h,c[5],21,-57434055),h=g(h,i,j,k,c[12],6,1700485571),k=g(k,h,i,j,c[3],10,-1894986606),j=g(j,k,h,i,c[10],15,-1051523),i=g(i,j,k,h,c[1],21,-2054922799),h=g(h,i,j,k,c[8],6,1873313359),k=g(k,h,i,j,c[15],10,-30611744),j=g(j,k,h,i,c[6],15,-1560198380),i=g(i,j,k,h,c[13],21,1309151649),h=g(h,i,j,k,c[4],6,-145523070),k=g(k,h,i,j,c[11],10,-1120210379),j=g(j,k,h,i,c[2],15,718787259),i=g(i,j,k,h,c[9],21,-343485551),a[0]=b(h,a[0]),a[1]=b(i,a[1]),a[2]=b(j,a[2]),a[3]=b(k,a[3])},i=function(a){var b,c=[];for(b=0;64>b;b+=4)c[b>>2]=a.charCodeAt(b)+(a.charCodeAt(b+1)<<8)+(a.charCodeAt(b+2)<<16)+(a.charCodeAt(b+3)<<24);return c},j=function(a){var b,c=[];for(b=0;64>b;b+=4)c[b>>2]=a[b]+(a[b+1]<<8)+(a[b+2]<<16)+(a[b+3]<<24);return c},k=function(a){var b,c,d,e,f,g,j=a.length,k=[1732584193,-271733879,-1732584194,271733878];for(b=64;j>=b;b+=64)h(k,i(a.substring(b-64,b)));for(a=a.substring(b-64),c=a.length,d=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],b=0;c>b;b+=1)d[b>>2]|=a.charCodeAt(b)<<(b%4<<3);if(d[b>>2]|=128<<(b%4<<3),b>55)for(h(k,d),b=0;16>b;b+=1)d[b]=0;return e=8*j,e=e.toString(16).match(/(.*?)(.{0,8})$/),f=parseInt(e[2],16),g=parseInt(e[1],16)||0,d[14]=f,d[15]=g,h(k,d),k},l=function(a){var b,c,d,e,f,g,i=a.length,k=[1732584193,-271733879,-1732584194,271733878];for(b=64;i>=b;b+=64)h(k,j(a.subarray(b-64,b)));for(a=i>b-64?a.subarray(b-64):new Uint8Array(0),c=a.length,d=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],b=0;c>b;b+=1)d[b>>2]|=a[b]<<(b%4<<3);if(d[b>>2]|=128<<(b%4<<3),b>55)for(h(k,d),b=0;16>b;b+=1)d[b]=0;return e=8*i,e=e.toString(16).match(/(.*?)(.{0,8})$/),f=parseInt(e[2],16),g=parseInt(e[1],16)||0,d[14]=f,d[15]=g,h(k,d),k},m=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"],n=function(a){var b,c="";for(b=0;4>b;b+=1)c+=m[a>>8*b+4&15]+m[a>>8*b&15];return c},o=function(a){var b;for(b=0;b<a.length;b+=1)a[b]=n(a[b]);return a.join("")},p=function(a){return o(k(a))},q=function(){this.reset()};return"5d41402abc4b2a76b9719d911017c592"!==p("hello")&&(b=function(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c}),q.prototype.append=function(a){return/[\u0080-\uFFFF]/.test(a)&&(a=unescape(encodeURIComponent(a))),this.appendBinary(a),this},q.prototype.appendBinary=function(a){this._buff+=a,this._length+=a.length;var b,c=this._buff.length;for(b=64;c>=b;b+=64)h(this._state,i(this._buff.substring(b-64,b)));return this._buff=this._buff.substr(b-64),this},q.prototype.end=function(a){var b,c,d=this._buff,e=d.length,f=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(b=0;e>b;b+=1)f[b>>2]|=d.charCodeAt(b)<<(b%4<<3);return this._finish(f,e),c=a?this._state:o(this._state),this.reset(),c},q.prototype._finish=function(a,b){var c,d,e,f=b;if(a[f>>2]|=128<<(f%4<<3),f>55)for(h(this._state,a),f=0;16>f;f+=1)a[f]=0;c=8*this._length,c=c.toString(16).match(/(.*?)(.{0,8})$/),d=parseInt(c[2],16),e=parseInt(c[1],16)||0,a[14]=d,a[15]=e,h(this._state,a)},q.prototype.reset=function(){return this._buff="",this._length=0,this._state=[1732584193,-271733879,-1732584194,271733878],this},q.prototype.destroy=function(){delete this._state,delete this._buff,delete this._length},q.hash=function(a,b){/[\u0080-\uFFFF]/.test(a)&&(a=unescape(encodeURIComponent(a)));var c=k(a);return b?c:o(c)},q.hashBinary=function(a,b){var c=k(a);return b?c:o(c)},q.ArrayBuffer=function(){this.reset()},q.ArrayBuffer.prototype.append=function(a){var b,c=this._concatArrayBuffer(this._buff,a),d=c.length;for(this._length+=a.byteLength,b=64;d>=b;b+=64)h(this._state,j(c.subarray(b-64,b)));return this._buff=d>b-64?c.subarray(b-64):new Uint8Array(0),this},q.ArrayBuffer.prototype.end=function(a){var b,c,d=this._buff,e=d.length,f=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
+for(b=0;e>b;b+=1)f[b>>2]|=d[b]<<(b%4<<3);return this._finish(f,e),c=a?this._state:o(this._state),this.reset(),c},q.ArrayBuffer.prototype._finish=q.prototype._finish,q.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._state=[1732584193,-271733879,-1732584194,271733878],this},q.ArrayBuffer.prototype.destroy=q.prototype.destroy,q.ArrayBuffer.prototype._concatArrayBuffer=function(a,b){var c=a.length,d=new Uint8Array(c+b.byteLength);return d.set(a),d.set(new Uint8Array(b),c),d},q.ArrayBuffer.hash=function(a,b){var c=l(new Uint8Array(a));return b?c:o(c)},a.register("Md5",{init:function(){},loadFromBlob:function(a){var b,c,d=a.getSource(),e=2097152,f=Math.ceil(d.size/e),g=0,h=this.owner,i=new q.ArrayBuffer,j=this,k=d.mozSlice||d.webkitSlice||d.slice;c=new FileReader,(b=function(){var l,m;l=g*e,m=Math.min(l+e,d.size),c.onload=function(b){i.append(b.target.result),h.trigger("progress",{total:a.size,loaded:m})},c.onloadend=function(){c.onloadend=c.onload=null,++g<f?setTimeout(b,1):setTimeout(function(){h.trigger("load"),j.result=i.end(),b=a=d=i=null,h.trigger("complete")},50)},c.readAsArrayBuffer(k.call(d,l,m))})()},getResult:function(){return this.result}})}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destroy,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destroy=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.id,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){this.flashExec("FilePicker","destroy")}})}),b("runtime/flash/image",["runtime/flash/runtime"],function(a){return a.register("Image",{loadFromBlob:function(a){var b=this.owner;b.info()&&this.flashExec("Image","info",b.info()),b.meta()&&this.flashExec("Image","meta",b.meta()),this.flashExec("Image","loadFromBlob",a.uid)}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(b,c,d){var e=b.$;return c.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,d=this._initAjax(),f=b._blob,g=c.server;d.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+e.param(b._formData),a=f.uid):(e.each(b._formData,function(a,b){d.exec("append",a,b)}),d.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(d,c.headers),d.exec("send",{method:c.method,url:g,forceURLStream:c.forceURLStream,mimeType:"application/octet-stream"},a)},getStatus:function(){return this._status},getResponse:function(){return this._response||""},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var b=this,c=new d("XMLHttpRequest");return c.on("uploadprogress progress",function(a){var c=a.loaded/a.total;return c=Math.min(1,Math.max(0,c)),b.trigger("progress",c)}),c.on("load",function(){var d,e=c.exec("getStatus"),f=!1,g="";return c.off(),b._xhr=null,e>=200&&300>e?f=!0:e>=500&&600>e?(f=!0,g="server"):g="http",f&&(b._response=c.exec("getResponse"),b._response=decodeURIComponent(b._response),d=a.JSON&&a.JSON.parse||function(a){try{return new Function("return "+a).call()}catch(b){return{}}},b._responseJson=b._response?d(b._response):{}),c.destroy(),c=null,g?b.trigger("error",g):b.trigger("load")}),c.on("error",function(){c.off(),b._xhr=null,b.trigger("error","http")}),b._xhr=c,c},_setRequestHeader:function(a,b){e.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("runtime/flash/blob",["runtime/flash/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.flashExec("Blob","slice",a,c);return new b(d.uid,d)}})}),b("runtime/flash/md5",["runtime/flash/runtime"],function(a){return a.register("Md5",{init:function(){},loadFromBlob:function(a){return this.flashExec("Md5","loadFromBlob",a.uid)}})}),b("preset/all",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","widgets/md5","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/androidpatch","runtime/html5/image","runtime/html5/transport","runtime/html5/md5","runtime/flash/filepicker","runtime/flash/image","runtime/flash/transport","runtime/flash/blob","runtime/flash/md5"],function(a){return a}),b("webuploader",["preset/all"],function(a){return a}),c("webuploader")});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.withoutimage.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.withoutimage.js
new file mode 100644
index 0000000..08f4976
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.withoutimage.js
@@ -0,0 +1,4993 @@
+/*! WebUploader 0.1.5 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+
+            return obj;
+        },
+
+        makeExport = function( dollar ) {
+            root.__dollar = dollar;
+
+            // exports every module.
+            return exportsTo( factory( root, _define, _require ) );
+        },
+
+        origin;
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = makeExport();
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([ 'jquery' ], makeExport );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = makeExport();
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( window, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        var $ = window.__dollar || window.jQuery || window.Zepto;
+
+        if ( !$ ) {
+            throw new Error('jQuery or Zepto not found!');
+        }
+
+        return $;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id为该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档中对类的使用可能省略掉了`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+
+        var noop = function() {},
+            call = Function.call;
+
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+
+        function createObject( proto ) {
+            var f;
+
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+
+
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.5',
+
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+
+            Deferred: promise.Deferred,
+
+            isPromise: promise.isPromise,
+
+            when: promise.when,
+
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match( /(?:trident)(?:.*rv:([\w.]+))?/i ),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+
+                return ret;
+            })( navigator.userAgent ),
+
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+
+                /* jshint camelcase: false */
+
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+
+                return child;
+            },
+
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数noop](#WebUploader:Base.noop)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+
+            nextTick: (function() {
+
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+
+            while ( ++i < len ) {
+                handler = events[ i ];
+
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+
+            return !stoped;
+        }
+
+        protos = {
+
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+
+                if ( !callback ) {
+                    return this;
+                }
+
+                set = this._events || (this._events = []);
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+
+                    set.push( handler );
+                });
+
+                return this;
+            },
+
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+
+                if ( !callback ) {
+                    return me;
+                }
+
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+
+                return me;
+            },
+
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+
+                if ( !events ) {
+                    return this;
+                }
+
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+
+                return this;
+            },
+
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+
+                if ( !this._events || !type ) {
+                    return this;
+                }
+
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$;
+
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            cancelFile: 'cancel-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            md5File: 'md5-file',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            predictRuntimeType: 'predict-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+
+            _init: function( opts ) {
+                var me = this;
+
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     compress: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.option( 'compress', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+
+                // setter
+                if ( arguments.length > 1 ) {
+
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `progressNum` 上传中的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `queueNum` 还在队列中的文件数
+             * * `interruptNum` 被暂停的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+
+                return stats ? {
+                    successNum: stats.numOfSuccess,
+                    progressNum: stats.numOfProgress,
+
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue,
+                    interruptNum: stats.numofInterrupt
+                } : {};
+            },
+
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+
+                    return false;
+                }
+
+                return true;
+            },
+
+            /**
+             * 销毁 webuploader 实例
+             * @method destroy
+             * @grammar destroy() => undefined
+             */
+            destroy: function() {
+                this.request( 'destroy', arguments );
+                this.off();
+            },
+
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            factories = {},
+
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+
+        $.extend( Runtime.prototype, {
+
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+
+                if ( this._container ) {
+                    return this._container;
+                }
+
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                this._parent = parent;
+                return container;
+            },
+
+            init: Base.noop,
+            exec: Base.noop,
+
+            destroy: function() {
+                this._container && this._container.remove();
+                this._parent && this._parent.removeClass('webuploader-container');
+                this.off();
+            }
+        });
+
+        Runtime.orders = 'html5,flash';
+
+
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+
+            type = type || getFirstKey( factories );
+
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+
+        var cache;
+
+        cache = (function() {
+            var obj = {};
+
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+
+                get: function( ruid, standalone ) {
+                    var i;
+
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+
+                        return obj[ i ];
+                    }
+
+                    return null;
+                },
+
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+
+            this.uid = Base.guid('client_');
+
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+
+            this.connectRuntime = function( opts, cb ) {
+
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+
+                deferred.done( cb );
+
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                runtime.__client--;
+
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+
+                runtime = null;
+            };
+
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+
+                return runtime.exec.apply( this, args );
+            };
+
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+
+            opts.container = $( opts.container );
+
+            if ( !opts.container.length ) {
+                return;
+            }
+
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( DragAndDrop.prototype );
+
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            _destroy = Uploader.prototype.destroy,
+            IGNORE = {},
+            widgetClass = [];
+
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+
+            var length = obj.length,
+                type = $.type( obj );
+
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+
+        $.extend( Widget.prototype, {
+
+            init: Base.noop,
+
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+
+                    return IGNORE;
+                }
+
+                return this[ map[ apiName ] ].apply( this, args );
+
+            },
+
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+
+            /**
+             * @property {String | Array} [disableWidgets=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 默认所有 Uploader.register 了的 widget 都会被加载,如果禁用某一部分,请通过此 option 指定黑名单。
+             */
+
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [],
+                    deactives = me.options.disableWidgets || '';
+
+                $.each( widgetClass, function( _, klass ) {
+                    (!deactives || !~deactives.indexOf( klass._name )) &&
+                        widgets.push( new klass( me ) );
+                });
+
+                return _init.apply( me, arguments );
+            },
+
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets && widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+
+                args = isArrayLike( args ) ? args : [ args ];
+
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+
+                    if ( rlt !== IGNORE ) {
+
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个 tick 中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+
+                                if ( args.length === 1 ) {
+                                    args = args[ 0 ];
+                                }
+
+                                setTimeout(function() {
+                                    deferred.resolve( args );
+                                }, 1 );
+
+                                return deferred.promise();
+                            })[ callback ? key : 'done' ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            },
+
+            destroy: function() {
+                _destroy.apply( this, arguments );
+                this._widgets = null;
+            }
+        });
+
+        /**
+         * 添加组件
+         * @grammar Uploader.register(proto);
+         * @grammar Uploader.register(map, proto);
+         * @param  {object} responseMap API 名称与函数实现的映射
+         * @param  {object} proto 组件原型,构造函数通过 constructor 属性定义
+         * @method Uploader.register
+         * @for Uploader
+         * @example
+         * Uploader.register({
+         *     'make-thumb': 'makeThumb'
+         * }, {
+         *     init: function( options ) {},
+         *     makeThumb: function() {}
+         * });
+         *
+         * Uploader.register({
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init', destroy: 'destroy', name: 'anonymous' },
+                klass;
+
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+
+                // 自动生成 map 表。
+                $.each(widgetProto, function(key) {
+                    if ( key[0] === '_' || key === 'name' ) {
+                        key === 'name' && (map.name = widgetProto.name);
+                        return;
+                    }
+
+                    map[key.replace(/[A-Z]/g, '-$&').toLowerCase()] = key;
+                });
+
+            } else {
+                map = $.extend( map, responseMap );
+            }
+
+            widgetProto.responseMap = map;
+            klass = Base.inherits( Widget, widgetProto );
+            klass._name = map.name;
+            widgetClass.push( klass );
+
+            return klass;
+        };
+
+        /**
+         * 删除插件,只有在注册时指定了名字的才能被删除。
+         * @grammar Uploader.unRegister(name);
+         * @param  {string} name 组件名字
+         * @method Uploader.unRegister
+         * @for Uploader
+         * @example
+         *
+         * Uploader.register({
+         *     name: 'custom',
+         *
+         *     'make-thumb': function() {
+         *
+         *     }
+         * });
+         *
+         * Uploader.unRegister('custom');
+         */
+        Uploader.unRegister = Widget.unRegister = function( name ) {
+            if ( !name || name === 'anonymous' ) {
+                return;
+            }
+
+            // 删除指定的插件。
+            for ( var i = widgetClass.length; i--; ) {
+                if ( widgetClass[i]._name === name ) {
+                    widgetClass.splice(i, 1)
+                }
+            }
+        };
+
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+
+        Uploader.options.dnd = '';
+
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @property {Selector} [disableGlobalDnd=false]  是否禁掉整个页面的拖拽功能,如果不禁用,图片拖进来的时候会默认被浏览器打开。
+         * @namespace options
+         * @for Uploader
+         */
+
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            name: 'dnd',
+
+            init: function( opts ) {
+
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+
+                this.dnd = dnd = new Dnd( options );
+
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+
+                dnd.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.dnd && this.dnd.destroy();
+            }
+        });
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+
+        var $ = Base.$;
+
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+
+            init: function() {
+                var me = this;
+
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            }
+        });
+
+        Mediator.installTo( FilePaste.prototype );
+
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            name: 'paste',
+
+            init: function( opts ) {
+
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+
+                this.paste = paste = new FilePaste( options );
+
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                this.paste && this.paste.destroy();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+
+        function Blob( ruid, source ) {
+            var me = this;
+
+            me.source = source;
+            me.ruid = ruid;
+            this.size = source.size || 0;
+
+            // 如果没有指定 mimetype, 但是知道文件后缀。
+            if ( !source.type && this.ext &&
+                    ~'jpg,jpeg,png,gif,bmp'.indexOf( this.ext ) ) {
+                this.type = 'image/' + (this.ext === 'jpg' ? 'jpeg' : this.ext);
+            } else {
+                this.type = source.type || 'application/octet-stream';
+            }
+
+            RuntimeClient.call( me, 'Blob' );
+            this.uid = source.uid || this.uid;
+
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+
+            getSource: function() {
+                return this.source;
+            }
+        });
+
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+
+        function File( ruid, file ) {
+            var ext;
+
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+
+            // todo 支持其他类型文件的转换。
+            // 如果有 mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && file.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( file.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+
+            Blob.apply( this, arguments );
+        }
+
+        return Base.inherits( Blob, File );
+    });
+
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+
+        var $ = Base.$;
+
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+
+            opts.container = $( opts.id );
+
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+
+                button.addClass('webuploader-pick');
+
+                me.on( 'all', function( type ) {
+                    var files;
+
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+
+                this._resizeHandler = Base.bindFn( this.refresh, this );
+                $( window ).on( 'resize', this._resizeHandler );
+            },
+
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+
+                    pos = button.offset();
+
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+
+            enable: function() {
+                var btn = this.options.button;
+
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+
+            disable: function() {
+                var btn = this.options.button;
+
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+
+                btn.addClass('webuploader-pick-disable');
+            },
+
+            destroy: function() {
+                var btn = this.options.button;
+                $( window ).off( 'resize', this._resizeHandler );
+                btn.removeClass('webuploader-pick-disable webuploader-pick-hover ' +
+                    'webuploader-pick');
+            }
+        });
+
+        return FilePicker;
+    });
+
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+
+        $.extend( Uploader.options, {
+
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+
+        return Uploader.register({
+            name: 'picker',
+
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addBtn( opts.pick );
+            },
+
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addBtn: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    promises = [];
+
+                if ( !pick ) {
+                    return;
+                }
+
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+
+                $( pick.id ).each(function() {
+                    var options, picker, deferred;
+
+                    deferred = Base.Deferred();
+
+                    options = $.extend({}, pick, {
+                        accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                        swf: opts.swf,
+                        runtimeOrder: opts.runtimeOrder,
+                        id: this
+                    });
+
+                    picker = new FilePicker( options );
+
+                    picker.once( 'ready', deferred.resolve );
+                    picker.on( 'select', function( files ) {
+                        me.owner.request( 'add-file', [ files ]);
+                    });
+                    picker.init();
+
+                    me.pickers.push( picker );
+
+                    promises.push( deferred.promise() );
+                });
+
+                return Base.when.apply( Base, promises );
+            },
+
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            },
+
+            destroy: function() {
+                $.each( this.pickers, function() {
+                    this.destroy();
+                });
+                this.pickers = null;
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application/octet-stream'
+             */
+            this.type = source.type || 'application/octet-stream';
+
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+
+
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+
+            this.source = source;
+            this.loaded = 0;
+
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+
+        $.extend( WUFile.prototype, {
+
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+
+                var prevStatus = statusMap[ this.id ];
+
+                typeof text !== 'undefined' && (this.statusText = text);
+
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+
+            },
+
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+
+            destroy: function() {
+                this.off();
+                delete statusMap[ this.id ];
+            }
+        });
+
+        Mediator.installTo( WUFile.prototype );
+
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+
+        return WUFile;
+    });
+
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被取消的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * * `numofDeleted` 被移除的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0,
+                numofDeleted: 0,
+                numofInterrupt: 0,
+            };
+
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+
+            // 存储所有文件
+            this._map = {};
+        }
+
+        $.extend( Queue.prototype, {
+
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+
+                status = status || STATUS.QUEUED;
+
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+
+                return null;
+            },
+
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+
+                    ret.push( file );
+                }
+
+                return ret;
+            },
+
+            /**
+             * 在队列中删除文件。
+             * @grammar removeFile( file ) => Array
+             * @method removeFile
+             * @param {File} 文件对象。
+             */
+            removeFile: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( existing ) {
+                    delete this._map[ file.id ];
+                    file.destroy();
+                    this.stats.numofDeleted++;
+                }
+            },
+
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+            },
+
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt--;
+                        break;
+                }
+
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+
+
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+
+                    case STATUS.INTERRUPT:
+                        stats.numofInterrupt++;
+                        break;
+                }
+            }
+
+        });
+
+        Mediator.installTo( Queue.prototype );
+
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+
+        return Uploader.register({
+            name: 'queue',
+
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+
+                    me.accept = new RegExp( accept, 'i' );
+                }
+
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                this.placeholder = runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+
+
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+
+                    file = new WUFile( file );
+                }
+
+                return file;
+            },
+
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || !file.size || this.accept &&
+
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+
+                return !invalid;
+            },
+
+
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+
+            _addFile: function( file ) {
+                var me = this;
+
+                file = me._wrapFile( file );
+
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @property {Boolean} [auto=false]
+             * @namespace options
+             * @for Uploader
+             * @description 设置为 true 后,不需要手动调用上传,有文件选择即开始上传。
+             *
+             */
+
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFile: function( files ) {
+                var me = this;
+
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+
+                me.owner.trigger( 'filesQueued', files );
+
+                if ( me.options.auto ) {
+                    setTimeout(function() {
+                        me.request('start-upload');
+                    }, 20 );
+                }
+            },
+
+            getStats: function() {
+                return this.stats;
+            },
+
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+
+             /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @grammar removeFile( file, true ) => undefined
+             * @grammar removeFile( id, true ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件, 默认只会标记文件状态为已取消,如果第二个参数为 `true` 则会从 queue 中移除。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file, remove ) {
+                var me = this;
+
+                file = file.id ? file : me.queue.getFile( file );
+
+                this.request( 'cancel-file', file );
+
+                if ( remove ) {
+                    this.queue.removeFile( file );
+                }
+            },
+
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+
+                me.request('start-upload');
+            },
+
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+
+            /**
+             * @event reset
+             * @description 当 uploader 被重置的时候触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.owner.trigger('reset');
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            },
+
+            destroy: function() {
+                this.reset();
+                this.placeholder && this.placeholder.destroy();
+            }
+        });
+
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+
+        return Uploader.register({
+            name: 'runtime',
+
+            init: function() {
+                if ( !this.predictRuntimeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntimeType() => String
+             * @method predictRuntimeType
+             * @for  Uploader
+             */
+            predictRuntimeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+
+        var $ = Base.$;
+
+        function Transport( opts ) {
+            var me = this;
+
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+
+        Transport.options = {
+            server: '',
+            method: 'POST',
+
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+
+        $.extend( Transport.prototype, {
+
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+
+                if ( !duration ) {
+                    return;
+                }
+
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+
+        });
+
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+
+
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+
+
+            /**
+             * @property {Object} [formData={}]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: {}
+
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len, api;
+
+            api = {
+                file: file,
+
+                has: function() {
+                    return !!pending.length;
+                },
+
+                shift: function() {
+                    return pending.shift();
+                },
+
+                unshift: function( block ) {
+                    pending.unshift( block );
+                }
+            };
+
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++,
+                    cuted: api
+                });
+                start += len;
+            }
+
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+
+            return api;
+        }
+
+        Uploader.register({
+            name: 'upload',
+
+            init: function() {
+                var owner = this.owner,
+                    me = this;
+
+                this.runing = false;
+                this.progress = false;
+
+                owner
+                    .on( 'startUpload', function() {
+                        me.progress = true;
+                    })
+                    .on( 'uploadFinished', function() {
+                        me.progress = false;
+                    });
+
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+
+                // 缓存分好片的文件。
+                this.stack = [];
+
+                // 缓存即将上传的文件。
+                this.pending = [];
+
+                // 跟踪还有多少分片在上传中但是没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+
+                owner.on( 'uploadComplete', function( file ) {
+
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+
+            reset: function() {
+                this.request( 'stop-upload', true );
+                this.runing = false;
+                this.pool = [];
+                this.stack = [];
+                this.pending = [];
+                this.remaning = 0;
+                this._trigged = false;
+                this._promise = null;
+            },
+
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             *
+             * 可以指定开始某一个文件。
+             * @grammar upload() => undefined
+             * @grammar upload( file | fileId) => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            startUpload: function(file) {
+                var me = this;
+
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+
+                // 如果指定了开始某个文件,则只开始指定文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        $.each( me.pool, function( _, v ) {
+
+                            // 之前暂停过。
+                            if (v.file !== file) {
+                                return;
+                            }
+
+                            v.transport && v.transport.send();
+                        });
+
+                        file.setStatus( Status.QUEUED );
+                    } else if (file.getStatus() === Status.PROGRESS) {
+                        return;
+                    } else {
+                        file.setStatus( Status.QUEUED );
+                    }
+                } else {
+                    $.each( me.request( 'get-files', [ Status.INITED ] ), function() {
+                        this.setStatus( Status.QUEUED );
+                    });
+                }
+
+                if ( me.runing ) {
+                    return;
+                }
+
+                me.runing = true;
+
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        file.setStatus( Status.PROGRESS );
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+
+                file || $.each( me.request( 'get-files',
+                        Status.INTERRUPT ), function() {
+                    this.setStatus( Status.PROGRESS );
+                });
+
+                me._trigged = false;
+                Base.nextTick( me.__tick );
+                me.owner.trigger('startUpload');
+            },
+
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             *
+             * 如果第一个参数是文件,则只暂停指定文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @grammar stop( file ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stopUpload: function( file, interrupt ) {
+                var me = this;
+
+                if (file === true) {
+                    interrupt = file;
+                    file = null;
+                }
+
+                if ( me.runing === false ) {
+                    return;
+                }
+
+                // 如果只是暂停某个文件。
+                if ( file ) {
+                    file = file.id ? file : me.request( 'get-file', file );
+
+                    if ( file.getStatus() !== Status.PROGRESS &&
+                            file.getStatus() !== Status.QUEUED ) {
+                        return;
+                    }
+
+                    file.setStatus( Status.INTERRUPT );
+                    $.each( me.pool, function( _, v ) {
+
+                        // 只 abort 指定的文件。
+                        if (v.file !== file) {
+                            return;
+                        }
+
+                        v.transport && v.transport.abort();
+                        me._putback(v);
+                        me._popBlock(v);
+                    });
+
+                    return Base.nextTick( me.__tick );
+                }
+
+                me.runing = false;
+
+                if (this._promise && this._promise.file) {
+                    this._promise.file.setStatus( Status.INTERRUPT );
+                }
+
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+
+                me.owner.trigger('stopUpload');
+            },
+
+            /**
+             * @method cancelFile
+             * @grammar cancelFile( file ) => undefined
+             * @grammar cancelFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 标记文件状态为已取消, 同时将中断文件传输。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.cancelFile( file );
+             * })
+             */
+            cancelFile: function( file ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                file.setStatus( Status.CANCELLED );
+                this.owner.trigger( 'fileDequeued', file );
+            },
+
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.progress;
+            },
+
+            _getStats: function() {
+                return this.request('get-stats');
+            },
+
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = file.id ? file : this.request( 'get-file', file );
+
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+
+                this.owner.trigger( 'uploadSkip', file );
+            },
+
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+
+                    fn = function( val ) {
+                        me._promise = null;
+
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me._getStats().numOfQueue &&
+                    !me._getStats().numofInterrupt ) {
+                    me.runing = false;
+
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+
+            _putback: function(block) {
+                var idx;
+
+                block.cuted.unshift(block);
+                idx = this.stack.indexOf(block.cuted);
+
+                if (!~idx) {
+                    this.stack.unshift(block.cuted);
+                }
+            },
+
+            _getStack: function() {
+                var i = 0,
+                    act;
+
+                while ( (act = this.stack[ i++ ]) ) {
+                    if ( act.has() && act.file.getStatus() === Status.PROGRESS ) {
+                        return act;
+                    } else if (!act.has() ||
+                            act.file.getStatus() !== Status.PROGRESS &&
+                            act.file.getStatus() !== Status.INTERRUPT ) {
+
+                        // 把已经处理完了的,或者,状态为非 progress(上传中)、
+                        // interupt(暂停中) 的移除。
+                        this.stack.splice( --i, 1 );
+                    }
+                }
+
+                return null;
+            },
+
+            _nextBlock: function() {
+                var me = this,
+                    opts = me.options,
+                    act, next, done, preparing;
+
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( (act = this._getStack()) ) {
+
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+
+                    return act.shift();
+
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me._getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me.stack.push(act);
+                        return act.shift();
+                    };
+
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    if ( isPromise( next) ) {
+                        preparing = next.file;
+                        next = next[ next.pipe ? 'pipe' : 'then' ]( done );
+                        next.file = preparing;
+                        return next;
+                    }
+
+                    return done( next );
+                }
+            },
+
+
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.PROGRESS ||
+                            file.getStatus() === Status.INTERRUPT ) {
+                            return file;
+                        }
+
+                        return me._finishFile( file );
+                    });
+
+                    me.owner.trigger( 'uploadStart', file );
+                    file.setStatus( Status.PROGRESS );
+
+                    promise.file = file;
+
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+
+                    pending.push( promise );
+                }
+            },
+
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+
+                // 有可能在 before-send-file 的 promise 期间改变了文件状态。
+                // 如:暂停,取消
+                // 我们不能中断 promise, 但是可以在 promise 完后,不做上传操作。
+                if ( file.getStatus() !== Status.PROGRESS ) {
+
+                    // 如果是中断,则还需要放回去。
+                    if (file.getStatus() === Status.INTERRUPT) {
+                        me._putback(block);
+                    }
+
+                    return;
+                }
+
+                me.pool.push( block );
+                me.remaning++;
+
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+
+
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @param {Object} headers 可以扩展此对象来控制上传头部。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+
+
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+
+                block.transport = tr;
+
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    var totalPercent = 0,
+                        uploaded = 0;
+
+                    // 可能没有abort掉,progress还是执行进来了。
+                    // if ( !file.blocks ) {
+                    //     return;
+                    // }
+
+                    totalPercent = block.percentage = percentage;
+
+                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。
+                        $.each( file.blocks, function( _, v ) {
+                            uploaded += (v.percentage || 0) * (v.end - v.start);
+                        });
+
+                        totalPercent = uploaded / file.size;
+                    }
+
+                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+                });
+
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+
+                    return reject;
+                };
+
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+
+                        block.retried++;
+                        tr.send();
+
+                    } else {
+
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            }
+
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+
+        var $ = Base.$,
+            validators = {},
+            api;
+
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * * `Q_TYPE_DENIED` 当文件类型不满足时触发。。
+         * @for  Uploader
+         */
+
+        // 暴露给外面的api
+        api = {
+
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            name: 'validator',
+
+            init: function() {
+                var me = this;
+                Base.nextTick(function() {
+                    $.each( validators, function() {
+                        this.call( me.owner );
+                    });
+                });
+            }
+        });
+
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileNumLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return count >= max ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = parseInt( opts.fileSizeLimit, 10 ),
+                flag = true;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+
+                return invalid ? false : true;
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+
+            uploader.on( 'reset', function() {
+                count = 0;
+            });
+        });
+
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+
+            if ( !max ) {
+                return;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', max, file );
+                    return false;
+                }
+
+            });
+
+        });
+
+        /**
+         * @property {Boolean} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+
+            if ( opts.duplicate ) {
+                return;
+            }
+
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+
+                return hash;
+            }
+
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (mapping[ hash ] = true);
+            });
+
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+
+                hash && (delete mapping[ hash ]);
+            });
+
+            uploader.on( 'reset', function() {
+                mapping = {};
+            });
+        });
+
+        return api;
+    });
+
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+
+        function CompBase( owner, runtime ) {
+
+            this.owner = owner;
+            this.options = owner.options;
+
+            this.getRuntime = function() {
+                return runtime;
+            };
+
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var type = 'html5',
+            components = {};
+
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destroy = this.destroy;
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+
+            me.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+        }
+
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+
+        });
+
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+
+                blob = slice.call( blob, start, end );
+
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+
+                e = e.originalEvent || e;
+
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+
+                return false;
+            },
+
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+
+                return false;
+            },
+
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 ),
+                    dataTransfer, data;
+
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+
+                e = e.originalEvent || e;
+                dataTransfer = e.dataTransfer;
+
+                // 如果是页面内拖拽,还不能处理,不阻止事件。
+                // 此处 ie11 下会报参数错误,
+                try {
+                    data = dataTransfer.getData('text/html');
+                } catch( err ) {
+                }
+
+                if ( data ) {
+                    return;
+                }
+
+                me._getTansferFiles( dataTransfer, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( dataTransfer, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, file, item, i, len, canAccessFolder;
+
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+
+                Base.when.apply( Base, promises ).done(function() {
+
+                    if ( !results.length ) {
+                        return;
+                    }
+
+                    callback( results );
+                });
+            },
+
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+
+                return deferred.promise();
+            },
+
+            destroy: function() {
+                var elem = this.elem;
+
+                // 还没 init 就调用 destroy
+                if (!elem) {
+                    return;
+                }
+
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragOverHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+
+                    allowed.push( new File( ruid, blob ) );
+                }
+
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var $ = Base.$;
+
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    label = this.label = $( document.createElement('label') ),
+                    input =  this.input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+
+                label.on( 'click', function() {
+                    input.trigger('click');
+                });
+
+                label.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+
+                    input.attr( 'accept', arr.join(',') );
+                }
+
+                container.append( input );
+                container.append( label );
+
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+
+                    me.files = e.target.files;
+
+                    // reset input
+                    clone = this.cloneNode( true );
+                    clone.value = null;
+                    this.parentNode.replaceChild( clone, this );
+
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+
+                    owner.trigger('change');
+                });
+
+                label.on( 'mouseenter mouseleave', mouseHandler );
+
+            },
+
+
+            getFiles: function() {
+                return this.files;
+            },
+
+            destroy: function() {
+                this.input.off();
+                this.label.off();
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+
+        var noop = Base.noop,
+            $ = Base.$;
+
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+
+                if ( binary ) {
+                    // 强制设置成 content-type 为文件流。
+                    xhr.overrideMimeType &&
+                            xhr.overrideMimeType('application/octet-stream');
+
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+
+            getResponse: function() {
+                return this._response;
+            },
+
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+
+                    return me.trigger( 'progress', percentage );
+                };
+
+                xhr.onreadystatechange = function() {
+
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+
+
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+
+            _parseJson: function( str ) {
+                var json;
+
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+
+
+        function getFlashVersion() {
+            var version;
+
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destroy = this.destroy,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+
+            Runtime.apply( me, arguments );
+            me.type = type;
+
+
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+
+                clients[ uid ] = client;
+
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+
+                    instance = pool[ uid ];
+
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+
+                return me.flashExec.apply( client, arguments );
+            };
+
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+
+                // console.log.apply( console, arguments );
+
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+
+                // Base.log( evt, obj );
+            }
+
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+
+            this.jsreciver = jsreciver;
+
+            this.destroy = function() {
+                // @todo 删除池子中的所有实例
+                return destroy && destroy.apply( this, arguments );
+            };
+
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+
+                return flash.exec( this.uid, comp, fn, args );
+            };
+
+            // @todo
+        }
+
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+
+                container.html( html );
+            },
+
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+
+        });
+
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+
+            return component;
+        };
+
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+
+                delete copy.button;
+                delete copy.id;
+                delete copy.container;
+
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+
+            destroy: function() {
+                this.flashExec( 'FilePicker', 'destroy' );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+
+                xhr.connectRuntime( blob.ruid );
+
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server,
+                    forceURLStream: opts.forceURLStream,
+                    mimeType: 'application/octet-stream'
+                }, binary );
+            },
+
+            getStatus: function() {
+                return this._status;
+            },
+
+            getResponse: function() {
+                return this._response || '';
+            },
+
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+
+            abort: function() {
+                var xhr = this._xhr;
+
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+
+            destroy: function() {
+                this.abort();
+            },
+
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    var percent = e.loaded / e.total;
+                    percent = Math.min( 1, Math.max( 0, percent ) );
+                    return me.trigger( 'progress', percent );
+                });
+
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        readBody = false,
+                        err = '',
+                        p;
+
+                    xhr.off();
+                    me._xhr = null;
+
+                    if ( status >= 200 && status < 300 ) {
+                        readBody = true;
+                    } else if ( status >= 500 && status < 600 ) {
+                        readBody = true;
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+
+                    if ( readBody ) {
+                        me._response = xhr.exec('getResponse');
+                        me._response = decodeURIComponent( me._response );
+
+                        // flash 处理可能存在 bug, 没辙只能靠 js 了
+                        // try {
+                        //     me._responseJson = xhr.exec('getResponseAsJson');
+                        // } catch ( error ) {
+
+                        p = window.JSON && window.JSON.parse || function( s ) {
+                            try {
+                                return new Function('return ' + s).call();
+                            } catch ( err ) {
+                                return {};
+                            }
+                        };
+                        me._responseJson  = me._response ? p(me._response) : {};
+
+                        // }
+                    }
+
+                    xhr.destroy();
+                    xhr = null;
+
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+
+                me._xhr = xhr;
+                return xhr;
+            },
+
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview 没有图像处理的版本。
+     */
+    define('preset/withoutimage',[
+        'base',
+
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/transport',
+
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/withoutimage'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.withoutimage.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.withoutimage.min.js
new file mode 100644
index 0000000..349be36
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/webuploader/webuploader.withoutimage.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.5 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}return a},j=function(c){return a.__dollar=c,i(b(a,f,e))};"object"==typeof module&&"object"==typeof module.exports?module.exports=j():"function"==typeof define&&define.amd?define(["jquery"],j):(c=a.WebUploader,a.WebUploader=j(),a.WebUploader.noConflict=function(){a.WebUploader=c})}(window,function(a,b,c){return b("dollar-third",[],function(){var b=a.__dollar||a.jQuery||a.Zepto;if(!b)throw new Error("jQuery or Zepto not found!");return b}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.5",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",cancelFile:"cancel-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",md5File:"md5-file",getDimension:"get-dimension",addButton:"add-btn",predictRuntimeType:"predict-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return a?{successNum:a.numOfSuccess,progressNum:a.numOfProgress,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue,interruptNum:a.numofInterrupt}:{}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},destroy:function(){this.request("destroy",arguments),this.off()},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,this._parent=a,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.remove(),this._parent&&this._parent.removeClass("webuploader-container"),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g=b.prototype.destroy,h={},i=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):h},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[],c=a.options.disableWidgets||"";return e.each(i,function(d,e){(!c||!~c.indexOf(e._name))&&b.push(new e(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,g,i,j,k=0,l=this._widgets,m=l&&l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],g=f.invoke(b,d),g!==h&&(a.isPromise(g)?o.push(g):n.push(g));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return 1===c.length&&(c=c[0]),setTimeout(function(){b.resolve(c)},1),b.promise()})[e?j:"done"](e||a.noop)):n[0]},destroy:function(){g.apply(this,arguments),this._widgets=null}}),b.register=d.register=function(b,c){var f,g={init:"init",destroy:"destroy",name:"anonymous"};return 1===arguments.length?(c=b,e.each(c,function(a){return"_"===a[0]||"name"===a?void("name"===a&&(g.name=c.name)):void(g[a.replace(/[A-Z]/g,"-$&").toLowerCase()]=a)})):g=e.extend(g,b),c.responseMap=g,f=a.inherits(d,c),f._name=g.name,i.push(f),f},b.unRegister=d.unRegister=function(a){if(a&&"anonymous"!==a)for(var b=i.length;b--;)i[b]._name===a&&i.splice(b,1)},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({name:"dnd",init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return this.dnd=e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}},destroy:function(){this.dnd&&this.dnd.destroy()}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({name:"paste",init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return this.paste=e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}},destroy:function(){this.paste&&this.paste.destroy()}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,this.size=c.size||0,this.type=!c.type&&this.ext&&~"jpg,jpeg,png,gif,bmp".indexOf(this.ext)?"image/"+("jpg"===this.ext?"jpeg":this.ext):c.type||"application/octet-stream",b.call(d,"Blob"),this.uid=c.uid||this.uid,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&c.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(c.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString(),b.apply(this,arguments)}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var c=this,e=c.options,g=e.button;g.addClass("webuploader-pick"),c.on("all",function(a){var b;switch(a){case"mouseenter":g.addClass("webuploader-pick-hover");break;case"mouseleave":g.removeClass("webuploader-pick-hover");break;case"change":b=c.exec("getFiles"),c.trigger("select",f.map(b,function(a){return a=new d(c.getRuid(),a),a._refer=e.container,a}),e.container)}}),c.connectRuntime(e,function(){c.refresh(),c.exec("init",e),c.trigger("ready")}),this._resizeHandler=b.bindFn(this.refresh,this),f(a).on("resize",this._resizeHandler)},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){var b=this.options.button;f(a).off("resize",this._resizeHandler),b.removeClass("webuploader-pick-disable webuploader-pick-hover webuploader-pick")}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({name:"picker",init:function(a){return this.pickers=[],a.pick&&this.addBtn(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addBtn:function(b){var e=this,f=e.options,g=f.accept,h=[];if(b)return d.isPlainObject(b)||(b={id:b}),d(b.id).each(function(){var i,j,k;k=a.Deferred(),i=d.extend({},b,{accept:d.isPlainObject(g)?[g]:g,swf:f.swf,runtimeOrder:f.runtimeOrder,id:this}),j=new c(i),j.once("ready",k.resolve),j.on("select",function(a){e.owner.request("add-file",[a])}),j.init(),e.pickers.push(j),h.push(k.promise())}),a.when.apply(a,h)},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})},destroy:function(){d.each(this.pickers,function(){this.destroy()}),this.pickers=null}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application/octet-stream",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destroy:function(){this.off(),delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0,numofDeleted:0,numofInterrupt:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},removeFile:function(a){var b=this._map[a.id];b&&(delete this._map[a.id],a.destroy(),this.stats.numofDeleted++)},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)}))},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--;break;case f.INTERRUPT:c.numofInterrupt--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++;break;case f.INTERRUPT:c.numofInterrupt++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({name:"queue",init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),this.placeholder=l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||!a.size||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFile:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&setTimeout(function(){b.request("start-upload")},20)},getStats:function(){return this.stats},removeFile:function(a,b){var c=this;a=a.id?a:c.queue.getFile(a),this.request("cancel-file",a),b&&this.queue.removeFile(a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.owner.trigger("reset"),this.queue=new c,this.stats=this.queue.stats},destroy:function(){this.reset(),this.placeholder&&this.placeholder.destroy()}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({name:"runtime",init:function(){if(!this.predictRuntimeType())throw Error("Runtime Error")},predictRuntimeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){var c,d,e=[],f=a.source,g=f.size,h=b?Math.ceil(g/b):1,i=0,j=0;for(d={file:a,has:function(){return!!e.length},shift:function(){return e.shift()},unshift:function(a){e.unshift(a)}};h>j;)c=Math.min(b,g-i),e.push({file:a,start:i,end:b?i+c:g,total:g,chunks:h,chunk:j++,cuted:d}),i+=c;return a.blocks=e.concat(),a.remaning=e.length,d}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:{}}),b.register({name:"upload",init:function(){var b=this.owner,c=this;this.runing=!1,this.progress=!1,b.on("startUpload",function(){c.progress=!0}).on("uploadFinished",function(){c.progress=!1}),this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},reset:function(){this.request("stop-upload",!0),this.runing=!1,this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this._trigged=!1,this._promise=null},startUpload:function(b){var c=this;if(f.each(c.request("get-files",h.INVALID),function(){c.request("remove-file",this)}),b)if(b=b.id?b:c.request("get-file",b),b.getStatus()===h.INTERRUPT)f.each(c.pool,function(a,c){c.file===b&&c.transport&&c.transport.send()}),b.setStatus(h.QUEUED);else{if(b.getStatus()===h.PROGRESS)return;b.setStatus(h.QUEUED)}else f.each(c.request("get-files",[h.INITED]),function(){this.setStatus(h.QUEUED)});c.runing||(c.runing=!0,f.each(c.pool,function(a,b){var d=b.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),c._trigged=!1,b.transport&&b.transport.send())}),b||f.each(c.request("get-files",h.INTERRUPT),function(){this.setStatus(h.PROGRESS)}),c._trigged=!1,a.nextTick(c.__tick),c.owner.trigger("startUpload"))},stopUpload:function(b,c){var d=this;if(b===!0&&(c=b,b=null),d.runing!==!1){if(b){if(b=b.id?b:d.request("get-file",b),b.getStatus()!==h.PROGRESS&&b.getStatus()!==h.QUEUED)return;return b.setStatus(h.INTERRUPT),f.each(d.pool,function(a,c){c.file===b&&(c.transport&&c.transport.abort(),d._putback(c),d._popBlock(c))}),a.nextTick(d.__tick)}d.runing=!1,this._promise&&this._promise.file&&this._promise.file.setStatus(h.INTERRUPT),c&&f.each(d.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),d.owner.trigger("stopUpload")}},cancelFile:function(a){a=a.id?a:this.request("get-file",a),a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),a.setStatus(h.CANCELLED),this.owner.trigger("fileDequeued",a)},isInProgress:function(){return!!this.progress},_getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=a.id?a:this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d._getStats().numOfQueue||d._getStats().numofInterrupt||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_putback:function(a){var b;a.cuted.unshift(a),b=this.stack.indexOf(a.cuted),~b||this.stack.unshift(a.cuted)},_getStack:function(){for(var a,b=0;a=this.stack[b++];){if(a.has()&&a.file.getStatus()===h.PROGRESS)return a;(!a.has()||a.file.getStatus()!==h.PROGRESS&&a.file.getStatus()!==h.INTERRUPT)&&this.stack.splice(--b,1)}return null},_nextBlock:function(){var a,b,c,d,f=this,h=f.options;return(a=this._getStack())?(h.prepareNextFile&&!f.pending.length&&f._prepareNextFile(),a.shift()):f.runing?(!f.pending.length&&f._getStats().numOfQueue&&f._prepareNextFile(),b=f.pending.shift(),c=function(b){return b?(a=e(b,h.chunked?h.chunkSize:0),f.stack.push(a),a.shift()):null},g(b)?(d=b.file,b=b[b.pipe?"pipe":"then"](c),b.file=d,b):c(b)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.PROGRESS||c.getStatus()===h.INTERRUPT?c:b._finishFile(c)}),b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),a.file=c,a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;return e.getStatus()!==h.PROGRESS?void(e.getStatus()===h.INTERRUPT&&d._putback(b)):(d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),void c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d._popBlock(b),a.nextTick(d.__tick))}))},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){var c=0,d=0;c=b.percentage=a,b.chunks>1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({name:"validator",init:function(){var b=this;a.nextTick(function(){e.each(f,function(){this.call(b.owner)})})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileNumLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("reset",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileSizeLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("reset",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",d,a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}),b.on("reset",function(){d={}}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destroy;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destroy=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;
+return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b,f,g=this,h=g.getRuid(),i=g.elem.parent().get(0);if(i&&!d.contains(i,a.currentTarget))return!1;a=a.originalEvent||a,b=a.dataTransfer;try{f=b.getData("text/html")}catch(j){}return f?void 0:(g._getTansferFiles(b,function(a){g.trigger("drop",d.map(a,function(a){return new c(h,a)}))}),g.dndOver=!1,g.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k=[],l=[];for(d=b.items,e=b.files,j=!(!d||!d[0].webkitGetAsEntry),h=0,i=e.length;i>h;h++)f=e[h],g=d&&d[h],j&&g.webkitGetAsEntry().isDirectory?l.push(this._traverseDirectoryTree(g.webkitGetAsEntry(),k)):k.push(f);a.when.apply(a,l).done(function(){k.length&&c(k)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a&&(a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragOverHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler)))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=this.label=c(document.createElement("label")),k=this.input=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),b.value=null,this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){this.input.off(),this.label.off()}})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType&&h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destroy,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destroy=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.id,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){this.flashExec("FilePicker","destroy")}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(b,c,d){var e=b.$;return c.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,d=this._initAjax(),f=b._blob,g=c.server;d.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+e.param(b._formData),a=f.uid):(e.each(b._formData,function(a,b){d.exec("append",a,b)}),d.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(d,c.headers),d.exec("send",{method:c.method,url:g,forceURLStream:c.forceURLStream,mimeType:"application/octet-stream"},a)},getStatus:function(){return this._status},getResponse:function(){return this._response||""},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var b=this,c=new d("XMLHttpRequest");return c.on("uploadprogress progress",function(a){var c=a.loaded/a.total;return c=Math.min(1,Math.max(0,c)),b.trigger("progress",c)}),c.on("load",function(){var d,e=c.exec("getStatus"),f=!1,g="";return c.off(),b._xhr=null,e>=200&&300>e?f=!0:e>=500&&600>e?(f=!0,g="server"):g="http",f&&(b._response=c.exec("getResponse"),b._response=decodeURIComponent(b._response),d=a.JSON&&a.JSON.parse||function(a){try{return new Function("return "+a).call()}catch(b){return{}}},b._responseJson=b._response?d(b._response):{}),c.destroy(),c=null,g?b.trigger("error",g):b.trigger("load")}),c.on("error",function(){c.off(),b._xhr=null,b.trigger("error","http")}),b._xhr=c,c},_setRequestHeader:function(a,b){e.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("preset/withoutimage",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/transport","runtime/flash/filepicker","runtime/flash/transport"],function(a){return a}),b("webuploader",["preset/withoutimage"],function(a){return a}),c("webuploader")});
diff --git a/management/guns-admin/src/main/webapp/static/js/plugins/ztree/jquery.ztree.all.min.js b/management/guns-admin/src/main/webapp/static/js/plugins/ztree/jquery.ztree.all.min.js
new file mode 100644
index 0000000..390a5f8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/plugins/ztree/jquery.ztree.all.min.js
@@ -0,0 +1,165 @@
+
+/*
+ * JQuery zTree core v3.5.28
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2017-01-20
+ */
+(function(q){var H,I,J,K,L,M,u,r={},v={},w={},N={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:!0,dblClickExpand:!0,expandSpeed:"fast",fontCss:{},nameIsHTML:!1,selectedMulti:!0,showIcon:!0,showLine:!0,showTitle:!0,txtSelectedEnable:!1},data:{key:{children:"children",name:"name",title:"",url:"url",icon:"icon"},simpleData:{enable:!1,idKey:"id",pIdKey:"pId",rootPId:null},keep:{parent:!1,leaf:!1}},async:{enable:!1,contentType:"application/x-www-form-urlencoded",type:"post",dataType:"text",
+url:"",autoParam:[],otherParam:[],dataFilter:null},callback:{beforeAsync:null,beforeClick:null,beforeDblClick:null,beforeRightClick:null,beforeMouseDown:null,beforeMouseUp:null,beforeExpand:null,beforeCollapse:null,beforeRemove:null,onAsyncError:null,onAsyncSuccess:null,onNodeCreated:null,onClick:null,onDblClick:null,onRightClick:null,onMouseDown:null,onMouseUp:null,onExpand:null,onCollapse:null,onRemove:null}},x=[function(b){var a=b.treeObj,c=f.event;a.bind(c.NODECREATED,function(a,c,g){j.apply(b.callback.onNodeCreated,
+[a,c,g])});a.bind(c.CLICK,function(a,c,g,l,h){j.apply(b.callback.onClick,[c,g,l,h])});a.bind(c.EXPAND,function(a,c,g){j.apply(b.callback.onExpand,[a,c,g])});a.bind(c.COLLAPSE,function(a,c,g){j.apply(b.callback.onCollapse,[a,c,g])});a.bind(c.ASYNC_SUCCESS,function(a,c,g,l){j.apply(b.callback.onAsyncSuccess,[a,c,g,l])});a.bind(c.ASYNC_ERROR,function(a,c,g,l,h,f){j.apply(b.callback.onAsyncError,[a,c,g,l,h,f])});a.bind(c.REMOVE,function(a,c,g){j.apply(b.callback.onRemove,[a,c,g])});a.bind(c.SELECTED,
+function(a,c,g){j.apply(b.callback.onSelected,[c,g])});a.bind(c.UNSELECTED,function(a,c,g){j.apply(b.callback.onUnSelected,[c,g])})}],y=[function(b){var a=f.event;b.treeObj.unbind(a.NODECREATED).unbind(a.CLICK).unbind(a.EXPAND).unbind(a.COLLAPSE).unbind(a.ASYNC_SUCCESS).unbind(a.ASYNC_ERROR).unbind(a.REMOVE).unbind(a.SELECTED).unbind(a.UNSELECTED)}],z=[function(b){var a=h.getCache(b);a||(a={},h.setCache(b,a));a.nodes=[];a.doms=[]}],A=[function(b,a,c,d,e,g){if(c){var l=h.getRoot(b),f=b.data.key.children;
+c.level=a;c.tId=b.treeId+"_"+ ++l.zId;c.parentTId=d?d.tId:null;c.open=typeof c.open=="string"?j.eqs(c.open,"true"):!!c.open;c[f]&&c[f].length>0?(c.isParent=!0,c.zAsync=!0):(c.isParent=typeof c.isParent=="string"?j.eqs(c.isParent,"true"):!!c.isParent,c.open=c.isParent&&!b.async.enable?c.open:!1,c.zAsync=!c.isParent);c.isFirstNode=e;c.isLastNode=g;c.getParentNode=function(){return h.getNodeCache(b,c.parentTId)};c.getPreNode=function(){return h.getPreNode(b,c)};c.getNextNode=function(){return h.getNextNode(b,
+c)};c.getIndex=function(){return h.getNodeIndex(b,c)};c.getPath=function(){return h.getNodePath(b,c)};c.isAjaxing=!1;h.fixPIdKeyValue(b,c)}}],t=[function(b){var a=b.target,c=h.getSetting(b.data.treeId),d="",e=null,g="",l="",i=null,n=null,k=null;if(j.eqs(b.type,"mousedown"))l="mousedown";else if(j.eqs(b.type,"mouseup"))l="mouseup";else if(j.eqs(b.type,"contextmenu"))l="contextmenu";else if(j.eqs(b.type,"click"))if(j.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+f.id.SWITCH)!==null)d=j.getNodeMainDom(a).id,
+g="switchNode";else{if(k=j.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+f.id.A}]))d=j.getNodeMainDom(k).id,g="clickNode"}else if(j.eqs(b.type,"dblclick")&&(l="dblclick",k=j.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+f.id.A}])))d=j.getNodeMainDom(k).id,g="switchNode";if(l.length>0&&d.length==0&&(k=j.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+f.id.A}])))d=j.getNodeMainDom(k).id;if(d.length>0)switch(e=h.getNodeCache(c,d),g){case "switchNode":e.isParent?j.eqs(b.type,"click")||j.eqs(b.type,"dblclick")&&
+j.apply(c.view.dblClickExpand,[c.treeId,e],c.view.dblClickExpand)?i=H:g="":g="";break;case "clickNode":i=I}switch(l){case "mousedown":n=J;break;case "mouseup":n=K;break;case "dblclick":n=L;break;case "contextmenu":n=M}return{stop:!1,node:e,nodeEventType:g,nodeEventCallback:i,treeEventType:l,treeEventCallback:n}}],B=[function(b){var a=h.getRoot(b);a||(a={},h.setRoot(b,a));a[b.data.key.children]=[];a.expandTriggerFlag=!1;a.curSelectedList=[];a.noSelection=!0;a.createdNodes=[];a.zId=0;a._ver=(new Date).getTime()}],
+C=[],D=[],E=[],F=[],G=[],h={addNodeCache:function(b,a){h.getCache(b).nodes[h.getNodeCacheId(a.tId)]=a},getNodeCacheId:function(b){return b.substring(b.lastIndexOf("_")+1)},addAfterA:function(b){D.push(b)},addBeforeA:function(b){C.push(b)},addInnerAfterA:function(b){F.push(b)},addInnerBeforeA:function(b){E.push(b)},addInitBind:function(b){x.push(b)},addInitUnBind:function(b){y.push(b)},addInitCache:function(b){z.push(b)},addInitNode:function(b){A.push(b)},addInitProxy:function(b,a){a?t.splice(0,0,
+b):t.push(b)},addInitRoot:function(b){B.push(b)},addNodesData:function(b,a,c,d){var e=b.data.key.children;a[e]?c>=a[e].length&&(c=-1):(a[e]=[],c=-1);if(a[e].length>0&&c===0)a[e][0].isFirstNode=!1,i.setNodeLineIcos(b,a[e][0]);else if(a[e].length>0&&c<0)a[e][a[e].length-1].isLastNode=!1,i.setNodeLineIcos(b,a[e][a[e].length-1]);a.isParent=!0;c<0?a[e]=a[e].concat(d):(b=[c,0].concat(d),a[e].splice.apply(a[e],b))},addSelectedNode:function(b,a){var c=h.getRoot(b);h.isSelectedNode(b,a)||c.curSelectedList.push(a)},
+addCreatedNode:function(b,a){(b.callback.onNodeCreated||b.view.addDiyDom)&&h.getRoot(b).createdNodes.push(a)},addZTreeTools:function(b){G.push(b)},exSetting:function(b){q.extend(!0,N,b)},fixPIdKeyValue:function(b,a){b.data.simpleData.enable&&(a[b.data.simpleData.pIdKey]=a.parentTId?a.getParentNode()[b.data.simpleData.idKey]:b.data.simpleData.rootPId)},getAfterA:function(b,a,c){for(var d=0,e=D.length;d<e;d++)D[d].apply(this,arguments)},getBeforeA:function(b,a,c){for(var d=0,e=C.length;d<e;d++)C[d].apply(this,
+arguments)},getInnerAfterA:function(b,a,c){for(var d=0,e=F.length;d<e;d++)F[d].apply(this,arguments)},getInnerBeforeA:function(b,a,c){for(var d=0,e=E.length;d<e;d++)E[d].apply(this,arguments)},getCache:function(b){return w[b.treeId]},getNodeIndex:function(b,a){if(!a)return null;for(var c=b.data.key.children,d=a.parentTId?a.getParentNode():h.getRoot(b),e=0,g=d[c].length-1;e<=g;e++)if(d[c][e]===a)return e;return-1},getNextNode:function(b,a){if(!a)return null;for(var c=b.data.key.children,d=a.parentTId?
+a.getParentNode():h.getRoot(b),e=0,g=d[c].length-1;e<=g;e++)if(d[c][e]===a)return e==g?null:d[c][e+1];return null},getNodeByParam:function(b,a,c,d){if(!a||!c)return null;for(var e=b.data.key.children,g=0,l=a.length;g<l;g++){if(a[g][c]==d)return a[g];var f=h.getNodeByParam(b,a[g][e],c,d);if(f)return f}return null},getNodeCache:function(b,a){if(!a)return null;var c=w[b.treeId].nodes[h.getNodeCacheId(a)];return c?c:null},getNodeName:function(b,a){return""+a[b.data.key.name]},getNodePath:function(b,a){if(!a)return null;
+var c;(c=a.parentTId?a.getParentNode().getPath():[])&&c.push(a);return c},getNodeTitle:function(b,a){return""+a[b.data.key.title===""?b.data.key.name:b.data.key.title]},getNodes:function(b){return h.getRoot(b)[b.data.key.children]},getNodesByParam:function(b,a,c,d){if(!a||!c)return[];for(var e=b.data.key.children,g=[],l=0,f=a.length;l<f;l++)a[l][c]==d&&g.push(a[l]),g=g.concat(h.getNodesByParam(b,a[l][e],c,d));return g},getNodesByParamFuzzy:function(b,a,c,d){if(!a||!c)return[];for(var e=b.data.key.children,
+g=[],d=d.toLowerCase(),l=0,f=a.length;l<f;l++)typeof a[l][c]=="string"&&a[l][c].toLowerCase().indexOf(d)>-1&&g.push(a[l]),g=g.concat(h.getNodesByParamFuzzy(b,a[l][e],c,d));return g},getNodesByFilter:function(b,a,c,d,e){if(!a)return d?null:[];for(var g=b.data.key.children,f=d?null:[],i=0,n=a.length;i<n;i++){if(j.apply(c,[a[i],e],!1)){if(d)return a[i];f.push(a[i])}var k=h.getNodesByFilter(b,a[i][g],c,d,e);if(d&&k)return k;f=d?k:f.concat(k)}return f},getPreNode:function(b,a){if(!a)return null;for(var c=
+b.data.key.children,d=a.parentTId?a.getParentNode():h.getRoot(b),e=0,g=d[c].length;e<g;e++)if(d[c][e]===a)return e==0?null:d[c][e-1];return null},getRoot:function(b){return b?v[b.treeId]:null},getRoots:function(){return v},getSetting:function(b){return r[b]},getSettings:function(){return r},getZTreeTools:function(b){return(b=this.getRoot(this.getSetting(b)))?b.treeTools:null},initCache:function(b){for(var a=0,c=z.length;a<c;a++)z[a].apply(this,arguments)},initNode:function(b,a,c,d,e,g){for(var f=
+0,h=A.length;f<h;f++)A[f].apply(this,arguments)},initRoot:function(b){for(var a=0,c=B.length;a<c;a++)B[a].apply(this,arguments)},isSelectedNode:function(b,a){for(var c=h.getRoot(b),d=0,e=c.curSelectedList.length;d<e;d++)if(a===c.curSelectedList[d])return!0;return!1},removeNodeCache:function(b,a){var c=b.data.key.children;if(a[c])for(var d=0,e=a[c].length;d<e;d++)h.removeNodeCache(b,a[c][d]);h.getCache(b).nodes[h.getNodeCacheId(a.tId)]=null},removeSelectedNode:function(b,a){for(var c=h.getRoot(b),
+d=0,e=c.curSelectedList.length;d<e;d++)if(a===c.curSelectedList[d]||!h.getNodeCache(b,c.curSelectedList[d].tId))c.curSelectedList.splice(d,1),b.treeObj.trigger(f.event.UNSELECTED,[b.treeId,a]),d--,e--},setCache:function(b,a){w[b.treeId]=a},setRoot:function(b,a){v[b.treeId]=a},setZTreeTools:function(b,a){for(var c=0,d=G.length;c<d;c++)G[c].apply(this,arguments)},transformToArrayFormat:function(b,a){if(!a)return[];var c=b.data.key.children,d=[];if(j.isArray(a))for(var e=0,g=a.length;e<g;e++)d.push(a[e]),
+a[e][c]&&(d=d.concat(h.transformToArrayFormat(b,a[e][c])));else d.push(a),a[c]&&(d=d.concat(h.transformToArrayFormat(b,a[c])));return d},transformTozTreeFormat:function(b,a){var c,d,e=b.data.simpleData.idKey,g=b.data.simpleData.pIdKey,f=b.data.key.children;if(!e||e==""||!a)return[];if(j.isArray(a)){var h=[],i={};for(c=0,d=a.length;c<d;c++)i[a[c][e]]=a[c];for(c=0,d=a.length;c<d;c++)i[a[c][g]]&&a[c][e]!=a[c][g]?(i[a[c][g]][f]||(i[a[c][g]][f]=[]),i[a[c][g]][f].push(a[c])):h.push(a[c]);return h}else return[a]}},
+m={bindEvent:function(b){for(var a=0,c=x.length;a<c;a++)x[a].apply(this,arguments)},unbindEvent:function(b){for(var a=0,c=y.length;a<c;a++)y[a].apply(this,arguments)},bindTree:function(b){var a={treeId:b.treeId},c=b.treeObj;b.view.txtSelectedEnable||c.bind("selectstart",u).css({"-moz-user-select":"-moz-none"});c.bind("click",a,m.proxy);c.bind("dblclick",a,m.proxy);c.bind("mouseover",a,m.proxy);c.bind("mouseout",a,m.proxy);c.bind("mousedown",a,m.proxy);c.bind("mouseup",a,m.proxy);c.bind("contextmenu",
+a,m.proxy)},unbindTree:function(b){b.treeObj.unbind("selectstart",u).unbind("click",m.proxy).unbind("dblclick",m.proxy).unbind("mouseover",m.proxy).unbind("mouseout",m.proxy).unbind("mousedown",m.proxy).unbind("mouseup",m.proxy).unbind("contextmenu",m.proxy)},doProxy:function(b){for(var a=[],c=0,d=t.length;c<d;c++){var e=t[c].apply(this,arguments);a.push(e);if(e.stop)break}return a},proxy:function(b){var a=h.getSetting(b.data.treeId);if(!j.uCanDo(a,b))return!0;for(var a=m.doProxy(b),c=!0,d=0,e=a.length;d<
+e;d++){var g=a[d];g.nodeEventCallback&&(c=g.nodeEventCallback.apply(g,[b,g.node])&&c);g.treeEventCallback&&(c=g.treeEventCallback.apply(g,[b,g.node])&&c)}return c}};H=function(b,a){var c=h.getSetting(b.data.treeId);if(a.open){if(j.apply(c.callback.beforeCollapse,[c.treeId,a],!0)==!1)return!0}else if(j.apply(c.callback.beforeExpand,[c.treeId,a],!0)==!1)return!0;h.getRoot(c).expandTriggerFlag=!0;i.switchNode(c,a);return!0};I=function(b,a){var c=h.getSetting(b.data.treeId),d=c.view.autoCancelSelected&&
+(b.ctrlKey||b.metaKey)&&h.isSelectedNode(c,a)?0:c.view.autoCancelSelected&&(b.ctrlKey||b.metaKey)&&c.view.selectedMulti?2:1;if(j.apply(c.callback.beforeClick,[c.treeId,a,d],!0)==!1)return!0;d===0?i.cancelPreSelectedNode(c,a):i.selectNode(c,a,d===2);c.treeObj.trigger(f.event.CLICK,[b,c.treeId,a,d]);return!0};J=function(b,a){var c=h.getSetting(b.data.treeId);j.apply(c.callback.beforeMouseDown,[c.treeId,a],!0)&&j.apply(c.callback.onMouseDown,[b,c.treeId,a]);return!0};K=function(b,a){var c=h.getSetting(b.data.treeId);
+j.apply(c.callback.beforeMouseUp,[c.treeId,a],!0)&&j.apply(c.callback.onMouseUp,[b,c.treeId,a]);return!0};L=function(b,a){var c=h.getSetting(b.data.treeId);j.apply(c.callback.beforeDblClick,[c.treeId,a],!0)&&j.apply(c.callback.onDblClick,[b,c.treeId,a]);return!0};M=function(b,a){var c=h.getSetting(b.data.treeId);j.apply(c.callback.beforeRightClick,[c.treeId,a],!0)&&j.apply(c.callback.onRightClick,[b,c.treeId,a]);return typeof c.callback.onRightClick!="function"};u=function(b){b=b.originalEvent.srcElement.nodeName.toLowerCase();
+return b==="input"||b==="textarea"};var j={apply:function(b,a,c){return typeof b=="function"?b.apply(O,a?a:[]):c},canAsync:function(b,a){var c=b.data.key.children;return b.async.enable&&a&&a.isParent&&!(a.zAsync||a[c]&&a[c].length>0)},clone:function(b){if(b===null)return null;var a=j.isArray(b)?[]:{},c;for(c in b)a[c]=b[c]instanceof Date?new Date(b[c].getTime()):typeof b[c]==="object"?j.clone(b[c]):b[c];return a},eqs:function(b,a){return b.toLowerCase()===a.toLowerCase()},isArray:function(b){return Object.prototype.toString.apply(b)===
+"[object Array]"},isElement:function(b){return typeof HTMLElement==="object"?b instanceof HTMLElement:b&&typeof b==="object"&&b!==null&&b.nodeType===1&&typeof b.nodeName==="string"},$:function(b,a,c){a&&typeof a!="string"&&(c=a,a="");return typeof b=="string"?q(b,c?c.treeObj.get(0).ownerDocument:null):q("#"+b.tId+a,c?c.treeObj:null)},getMDom:function(b,a,c){if(!a)return null;for(;a&&a.id!==b.treeId;){for(var d=0,e=c.length;a.tagName&&d<e;d++)if(j.eqs(a.tagName,c[d].tagName)&&a.getAttribute(c[d].attrName)!==
+null)return a;a=a.parentNode}return null},getNodeMainDom:function(b){return q(b).parent("li").get(0)||q(b).parentsUntil("li").parent().get(0)},isChildOrSelf:function(b,a){return q(b).closest("#"+a).length>0},uCanDo:function(){return!0}},i={addNodes:function(b,a,c,d,e){if(!b.data.keep.leaf||!a||a.isParent)if(j.isArray(d)||(d=[d]),b.data.simpleData.enable&&(d=h.transformTozTreeFormat(b,d)),a){var g=k(a,f.id.SWITCH,b),l=k(a,f.id.ICON,b),p=k(a,f.id.UL,b);if(!a.open)i.replaceSwitchClass(a,g,f.folder.CLOSE),
+i.replaceIcoClass(a,l,f.folder.CLOSE),a.open=!1,p.css({display:"none"});h.addNodesData(b,a,c,d);i.createNodes(b,a.level+1,d,a,c);e||i.expandCollapseParentNode(b,a,!0)}else h.addNodesData(b,h.getRoot(b),c,d),i.createNodes(b,0,d,null,c)},appendNodes:function(b,a,c,d,e,g,f){if(!c)return[];var j=[],n=b.data.key.children,k=(d?d:h.getRoot(b))[n],m,Q;if(!k||e>=k.length-c.length)e=-1;for(var s=0,R=c.length;s<R;s++){var o=c[s];g&&(m=(e===0||k.length==c.length)&&s==0,Q=e<0&&s==c.length-1,h.initNode(b,a,o,d,
+m,Q,f),h.addNodeCache(b,o));m=[];o[n]&&o[n].length>0&&(m=i.appendNodes(b,a+1,o[n],o,-1,g,f&&o.open));f&&(i.makeDOMNodeMainBefore(j,b,o),i.makeDOMNodeLine(j,b,o),h.getBeforeA(b,o,j),i.makeDOMNodeNameBefore(j,b,o),h.getInnerBeforeA(b,o,j),i.makeDOMNodeIcon(j,b,o),h.getInnerAfterA(b,o,j),i.makeDOMNodeNameAfter(j,b,o),h.getAfterA(b,o,j),o.isParent&&o.open&&i.makeUlHtml(b,o,j,m.join("")),i.makeDOMNodeMainAfter(j,b,o),h.addCreatedNode(b,o))}return j},appendParentULDom:function(b,a){var c=[],d=k(a,b);!d.get(0)&&
+a.parentTId&&(i.appendParentULDom(b,a.getParentNode()),d=k(a,b));var e=k(a,f.id.UL,b);e.get(0)&&e.remove();e=i.appendNodes(b,a.level+1,a[b.data.key.children],a,-1,!1,!0);i.makeUlHtml(b,a,c,e.join(""));d.append(c.join(""))},asyncNode:function(b,a,c,d){var e,g;if(a&&!a.isParent)return j.apply(d),!1;else if(a&&a.isAjaxing)return!1;else if(j.apply(b.callback.beforeAsync,[b.treeId,a],!0)==!1)return j.apply(d),!1;if(a)a.isAjaxing=!0,k(a,f.id.ICON,b).attr({style:"","class":f.className.BUTTON+" "+f.className.ICO_LOADING});
+var l={};for(e=0,g=b.async.autoParam.length;a&&e<g;e++){var p=b.async.autoParam[e].split("="),n=p;p.length>1&&(n=p[1],p=p[0]);l[n]=a[p]}if(j.isArray(b.async.otherParam))for(e=0,g=b.async.otherParam.length;e<g;e+=2)l[b.async.otherParam[e]]=b.async.otherParam[e+1];else for(var m in b.async.otherParam)l[m]=b.async.otherParam[m];var P=h.getRoot(b)._ver;q.ajax({contentType:b.async.contentType,cache:!1,type:b.async.type,url:j.apply(b.async.url,[b.treeId,a],b.async.url),data:b.async.contentType.indexOf("application/json")>
+-1?JSON.stringify(l):l,dataType:b.async.dataType,success:function(e){if(P==h.getRoot(b)._ver){var g=[];try{g=!e||e.length==0?[]:typeof e=="string"?eval("("+e+")"):e}catch(l){g=e}if(a)a.isAjaxing=null,a.zAsync=!0;i.setNodeLineIcos(b,a);g&&g!==""?(g=j.apply(b.async.dataFilter,[b.treeId,a,g],g),i.addNodes(b,a,-1,g?j.clone(g):[],!!c)):i.addNodes(b,a,-1,[],!!c);b.treeObj.trigger(f.event.ASYNC_SUCCESS,[b.treeId,a,e]);j.apply(d)}},error:function(c,d,e){if(P==h.getRoot(b)._ver){if(a)a.isAjaxing=null;i.setNodeLineIcos(b,
+a);b.treeObj.trigger(f.event.ASYNC_ERROR,[b.treeId,a,c,d,e])}}});return!0},cancelPreSelectedNode:function(b,a,c){var d=h.getRoot(b).curSelectedList,e,g;for(e=d.length-1;e>=0;e--)if(g=d[e],a===g||!a&&(!c||c!==g))if(k(g,f.id.A,b).removeClass(f.node.CURSELECTED),a){h.removeSelectedNode(b,a);break}else d.splice(e,1),b.treeObj.trigger(f.event.UNSELECTED,[b.treeId,g])},createNodeCallback:function(b){if(b.callback.onNodeCreated||b.view.addDiyDom)for(var a=h.getRoot(b);a.createdNodes.length>0;){var c=a.createdNodes.shift();
+j.apply(b.view.addDiyDom,[b.treeId,c]);b.callback.onNodeCreated&&b.treeObj.trigger(f.event.NODECREATED,[b.treeId,c])}},createNodes:function(b,a,c,d,e){if(c&&c.length!=0){var g=h.getRoot(b),l=b.data.key.children,l=!d||d.open||!!k(d[l][0],b).get(0);g.createdNodes=[];var a=i.appendNodes(b,a,c,d,e,!0,l),j,n;d?(d=k(d,f.id.UL,b),d.get(0)&&(j=d)):j=b.treeObj;j&&(e>=0&&(n=j.children()[e]),e>=0&&n?q(n).before(a.join("")):j.append(a.join("")));i.createNodeCallback(b)}},destroy:function(b){b&&(h.initCache(b),
+h.initRoot(b),m.unbindTree(b),m.unbindEvent(b),b.treeObj.empty(),delete r[b.treeId])},expandCollapseNode:function(b,a,c,d,e){var g=h.getRoot(b),l=b.data.key.children,p;if(a){if(g.expandTriggerFlag)p=e,e=function(){p&&p();a.open?b.treeObj.trigger(f.event.EXPAND,[b.treeId,a]):b.treeObj.trigger(f.event.COLLAPSE,[b.treeId,a])},g.expandTriggerFlag=!1;if(!a.open&&a.isParent&&(!k(a,f.id.UL,b).get(0)||a[l]&&a[l].length>0&&!k(a[l][0],b).get(0)))i.appendParentULDom(b,a),i.createNodeCallback(b);if(a.open==c)j.apply(e,
+[]);else{var c=k(a,f.id.UL,b),g=k(a,f.id.SWITCH,b),n=k(a,f.id.ICON,b);a.isParent?(a.open=!a.open,a.iconOpen&&a.iconClose&&n.attr("style",i.makeNodeIcoStyle(b,a)),a.open?(i.replaceSwitchClass(a,g,f.folder.OPEN),i.replaceIcoClass(a,n,f.folder.OPEN),d==!1||b.view.expandSpeed==""?(c.show(),j.apply(e,[])):a[l]&&a[l].length>0?c.slideDown(b.view.expandSpeed,e):(c.show(),j.apply(e,[]))):(i.replaceSwitchClass(a,g,f.folder.CLOSE),i.replaceIcoClass(a,n,f.folder.CLOSE),d==!1||b.view.expandSpeed==""||!(a[l]&&
+a[l].length>0)?(c.hide(),j.apply(e,[])):c.slideUp(b.view.expandSpeed,e))):j.apply(e,[])}}else j.apply(e,[])},expandCollapseParentNode:function(b,a,c,d,e){a&&(a.parentTId?(i.expandCollapseNode(b,a,c,d),a.parentTId&&i.expandCollapseParentNode(b,a.getParentNode(),c,d,e)):i.expandCollapseNode(b,a,c,d,e))},expandCollapseSonNode:function(b,a,c,d,e){var g=h.getRoot(b),f=b.data.key.children,g=a?a[f]:g[f],f=a?!1:d,j=h.getRoot(b).expandTriggerFlag;h.getRoot(b).expandTriggerFlag=!1;if(g)for(var k=0,m=g.length;k<
+m;k++)g[k]&&i.expandCollapseSonNode(b,g[k],c,f);h.getRoot(b).expandTriggerFlag=j;i.expandCollapseNode(b,a,c,d,e)},isSelectedNode:function(b,a){if(!a)return!1;var c=h.getRoot(b).curSelectedList,d;for(d=c.length-1;d>=0;d--)if(a===c[d])return!0;return!1},makeDOMNodeIcon:function(b,a,c){var d=h.getNodeName(a,c),d=a.view.nameIsHTML?d:d.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");b.push("<span id='",c.tId,f.id.ICON,"' title='' treeNode",f.id.ICON," class='",i.makeNodeIcoClass(a,c),"' style='",
+i.makeNodeIcoStyle(a,c),"'></span><span id='",c.tId,f.id.SPAN,"' class='",f.className.NAME,"'>",d,"</span>")},makeDOMNodeLine:function(b,a,c){b.push("<span id='",c.tId,f.id.SWITCH,"' title='' class='",i.makeNodeLineClass(a,c),"' treeNode",f.id.SWITCH,"></span>")},makeDOMNodeMainAfter:function(b){b.push("</li>")},makeDOMNodeMainBefore:function(b,a,c){b.push("<li id='",c.tId,"' class='",f.className.LEVEL,c.level,"' tabindex='0' hidefocus='true' treenode>")},makeDOMNodeNameAfter:function(b){b.push("</a>")},
+makeDOMNodeNameBefore:function(b,a,c){var d=h.getNodeTitle(a,c),e=i.makeNodeUrl(a,c),g=i.makeNodeFontCss(a,c),l=[],k;for(k in g)l.push(k,":",g[k],";");b.push("<a id='",c.tId,f.id.A,"' class='",f.className.LEVEL,c.level,"' treeNode",f.id.A,' onclick="',c.click||"",'" ',e!=null&&e.length>0?"href='"+e+"'":""," target='",i.makeNodeTarget(c),"' style='",l.join(""),"'");j.apply(a.view.showTitle,[a.treeId,c],a.view.showTitle)&&d&&b.push("title='",d.replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,
+"&gt;"),"'");b.push(">")},makeNodeFontCss:function(b,a){var c=j.apply(b.view.fontCss,[b.treeId,a],b.view.fontCss);return c&&typeof c!="function"?c:{}},makeNodeIcoClass:function(b,a){var c=["ico"];a.isAjaxing||(c[0]=(a.iconSkin?a.iconSkin+"_":"")+c[0],a.isParent?c.push(a.open?f.folder.OPEN:f.folder.CLOSE):c.push(f.folder.DOCU));return f.className.BUTTON+" "+c.join("_")},makeNodeIcoStyle:function(b,a){var c=[];if(!a.isAjaxing){var d=a.isParent&&a.iconOpen&&a.iconClose?a.open?a.iconOpen:a.iconClose:
+a[b.data.key.icon];d&&c.push("background:url(",d,") 0 0 no-repeat;");(b.view.showIcon==!1||!j.apply(b.view.showIcon,[b.treeId,a],!0))&&c.push("width:0px;height:0px;")}return c.join("")},makeNodeLineClass:function(b,a){var c=[];b.view.showLine?a.level==0&&a.isFirstNode&&a.isLastNode?c.push(f.line.ROOT):a.level==0&&a.isFirstNode?c.push(f.line.ROOTS):a.isLastNode?c.push(f.line.BOTTOM):c.push(f.line.CENTER):c.push(f.line.NOLINE);a.isParent?c.push(a.open?f.folder.OPEN:f.folder.CLOSE):c.push(f.folder.DOCU);
+return i.makeNodeLineClassEx(a)+c.join("_")},makeNodeLineClassEx:function(b){return f.className.BUTTON+" "+f.className.LEVEL+b.level+" "+f.className.SWITCH+" "},makeNodeTarget:function(b){return b.target||"_blank"},makeNodeUrl:function(b,a){var c=b.data.key.url;return a[c]?a[c]:null},makeUlHtml:function(b,a,c,d){c.push("<ul id='",a.tId,f.id.UL,"' class='",f.className.LEVEL,a.level," ",i.makeUlLineClass(b,a),"' style='display:",a.open?"block":"none","'>");c.push(d);c.push("</ul>")},makeUlLineClass:function(b,
+a){return b.view.showLine&&!a.isLastNode?f.line.LINE:""},removeChildNodes:function(b,a){if(a){var c=b.data.key.children,d=a[c];if(d){for(var e=0,g=d.length;e<g;e++)h.removeNodeCache(b,d[e]);h.removeSelectedNode(b);delete a[c];b.data.keep.parent?k(a,f.id.UL,b).empty():(a.isParent=!1,a.open=!1,c=k(a,f.id.SWITCH,b),d=k(a,f.id.ICON,b),i.replaceSwitchClass(a,c,f.folder.DOCU),i.replaceIcoClass(a,d,f.folder.DOCU),k(a,f.id.UL,b).remove())}}},scrollIntoView:function(b){if(b){if(!Element.prototype.scrollIntoViewIfNeeded)Element.prototype.scrollIntoViewIfNeeded=
+function(a){function b(a,d,e,f){return{left:a,top:d,width:e,height:f,right:a+e,bottom:d+f,translate:function(g,h){return b(g+a,h+d,e,f)},relativeFromTo:function(h,i){var j=a,l=d,h=h.offsetParent,i=i.offsetParent;if(h===i)return g;for(;h;h=h.offsetParent)j+=h.offsetLeft+h.clientLeft,l+=h.offsetTop+h.clientTop;for(;i;i=i.offsetParent)j-=i.offsetLeft+i.clientLeft,l-=i.offsetTop+i.clientTop;return b(j,l,e,f)}}}for(var d,e=this,g=b(this.offsetLeft,this.offsetTop,this.offsetWidth,this.offsetHeight);j.isElement(d=
+e.parentNode);){var f=d.offsetLeft+d.clientLeft,h=d.offsetTop+d.clientTop,g=g.relativeFromTo(e,d).translate(-f,-h);d.scrollLeft=!1===a||g.left<=d.scrollLeft+d.clientWidth&&d.scrollLeft<=g.right-d.clientWidth+d.clientWidth?Math.min(g.left,Math.max(g.right-d.clientWidth,d.scrollLeft)):(g.right-d.clientWidth+g.left)/2;d.scrollTop=!1===a||g.top<=d.scrollTop+d.clientHeight&&d.scrollTop<=g.bottom-d.clientHeight+d.clientHeight?Math.min(g.top,Math.max(g.bottom-d.clientHeight,d.scrollTop)):(g.bottom-d.clientHeight+
+g.top)/2;g=g.translate(f-d.scrollLeft,h-d.scrollTop);e=d}};b.scrollIntoViewIfNeeded()}},setFirstNode:function(b,a){var c=b.data.key.children;if(a[c].length>0)a[c][0].isFirstNode=!0},setLastNode:function(b,a){var c=b.data.key.children,d=a[c].length;if(d>0)a[c][d-1].isLastNode=!0},removeNode:function(b,a){var c=h.getRoot(b),d=b.data.key.children,e=a.parentTId?a.getParentNode():c;a.isFirstNode=!1;a.isLastNode=!1;a.getPreNode=function(){return null};a.getNextNode=function(){return null};if(h.getNodeCache(b,
+a.tId)){k(a,b).remove();h.removeNodeCache(b,a);h.removeSelectedNode(b,a);for(var g=0,j=e[d].length;g<j;g++)if(e[d][g].tId==a.tId){e[d].splice(g,1);break}i.setFirstNode(b,e);i.setLastNode(b,e);var p,g=e[d].length;if(!b.data.keep.parent&&g==0)e.isParent=!1,e.open=!1,g=k(e,f.id.UL,b),j=k(e,f.id.SWITCH,b),p=k(e,f.id.ICON,b),i.replaceSwitchClass(e,j,f.folder.DOCU),i.replaceIcoClass(e,p,f.folder.DOCU),g.css("display","none");else if(b.view.showLine&&g>0){var n=e[d][g-1],g=k(n,f.id.UL,b),j=k(n,f.id.SWITCH,
+b);p=k(n,f.id.ICON,b);e==c?e[d].length==1?i.replaceSwitchClass(n,j,f.line.ROOT):(c=k(e[d][0],f.id.SWITCH,b),i.replaceSwitchClass(e[d][0],c,f.line.ROOTS),i.replaceSwitchClass(n,j,f.line.BOTTOM)):i.replaceSwitchClass(n,j,f.line.BOTTOM);g.removeClass(f.line.LINE)}}},replaceIcoClass:function(b,a,c){if(a&&!b.isAjaxing&&(b=a.attr("class"),b!=void 0)){b=b.split("_");switch(c){case f.folder.OPEN:case f.folder.CLOSE:case f.folder.DOCU:b[b.length-1]=c}a.attr("class",b.join("_"))}},replaceSwitchClass:function(b,
+a,c){if(a){var d=a.attr("class");if(d!=void 0){d=d.split("_");switch(c){case f.line.ROOT:case f.line.ROOTS:case f.line.CENTER:case f.line.BOTTOM:case f.line.NOLINE:d[0]=i.makeNodeLineClassEx(b)+c;break;case f.folder.OPEN:case f.folder.CLOSE:case f.folder.DOCU:d[1]=c}a.attr("class",d.join("_"));c!==f.folder.DOCU?a.removeAttr("disabled"):a.attr("disabled","disabled")}}},selectNode:function(b,a,c){c||i.cancelPreSelectedNode(b,null,a);k(a,f.id.A,b).addClass(f.node.CURSELECTED);h.addSelectedNode(b,a);
+b.treeObj.trigger(f.event.SELECTED,[b.treeId,a])},setNodeFontCss:function(b,a){var c=k(a,f.id.A,b),d=i.makeNodeFontCss(b,a);d&&c.css(d)},setNodeLineIcos:function(b,a){if(a){var c=k(a,f.id.SWITCH,b),d=k(a,f.id.UL,b),e=k(a,f.id.ICON,b),g=i.makeUlLineClass(b,a);g.length==0?d.removeClass(f.line.LINE):d.addClass(g);c.attr("class",i.makeNodeLineClass(b,a));a.isParent?c.removeAttr("disabled"):c.attr("disabled","disabled");e.removeAttr("style");e.attr("style",i.makeNodeIcoStyle(b,a));e.attr("class",i.makeNodeIcoClass(b,
+a))}},setNodeName:function(b,a){var c=h.getNodeTitle(b,a),d=k(a,f.id.SPAN,b);d.empty();b.view.nameIsHTML?d.html(h.getNodeName(b,a)):d.text(h.getNodeName(b,a));j.apply(b.view.showTitle,[b.treeId,a],b.view.showTitle)&&k(a,f.id.A,b).attr("title",!c?"":c)},setNodeTarget:function(b,a){k(a,f.id.A,b).attr("target",i.makeNodeTarget(a))},setNodeUrl:function(b,a){var c=k(a,f.id.A,b),d=i.makeNodeUrl(b,a);d==null||d.length==0?c.removeAttr("href"):c.attr("href",d)},switchNode:function(b,a){a.open||!j.canAsync(b,
+a)?i.expandCollapseNode(b,a,!a.open):b.async.enable?i.asyncNode(b,a)||i.expandCollapseNode(b,a,!a.open):a&&i.expandCollapseNode(b,a,!a.open)}};q.fn.zTree={consts:{className:{BUTTON:"button",LEVEL:"level",ICO_LOADING:"ico_loading",SWITCH:"switch",NAME:"node_name"},event:{NODECREATED:"ztree_nodeCreated",CLICK:"ztree_click",EXPAND:"ztree_expand",COLLAPSE:"ztree_collapse",ASYNC_SUCCESS:"ztree_async_success",ASYNC_ERROR:"ztree_async_error",REMOVE:"ztree_remove",SELECTED:"ztree_selected",UNSELECTED:"ztree_unselected"},
+id:{A:"_a",ICON:"_ico",SPAN:"_span",SWITCH:"_switch",UL:"_ul"},line:{ROOT:"root",ROOTS:"roots",CENTER:"center",BOTTOM:"bottom",NOLINE:"noline",LINE:"line"},folder:{OPEN:"open",CLOSE:"close",DOCU:"docu"},node:{CURSELECTED:"curSelectedNode"}},_z:{tools:j,view:i,event:m,data:h},getZTreeObj:function(b){return(b=h.getZTreeTools(b))?b:null},destroy:function(b){if(b&&b.length>0)i.destroy(h.getSetting(b));else for(var a in r)i.destroy(r[a])},init:function(b,a,c){var d=j.clone(N);q.extend(!0,d,a);d.treeId=
+b.attr("id");d.treeObj=b;d.treeObj.empty();r[d.treeId]=d;if(typeof document.body.style.maxHeight==="undefined")d.view.expandSpeed="";h.initRoot(d);b=h.getRoot(d);a=d.data.key.children;c=c?j.clone(j.isArray(c)?c:[c]):[];b[a]=d.data.simpleData.enable?h.transformTozTreeFormat(d,c):c;h.initCache(d);m.unbindTree(d);m.bindTree(d);m.unbindEvent(d);m.bindEvent(d);c={setting:d,addNodes:function(a,b,c,f){function h(){i.addNodes(d,a,b,m,f==!0)}a||(a=null);if(a&&!a.isParent&&d.data.keep.leaf)return null;var k=
+parseInt(b,10);isNaN(k)?(f=!!c,c=b,b=-1):b=k;if(!c)return null;var m=j.clone(j.isArray(c)?c:[c]);j.canAsync(d,a)?i.asyncNode(d,a,f,h):h();return m},cancelSelectedNode:function(a){i.cancelPreSelectedNode(d,a)},destroy:function(){i.destroy(d)},expandAll:function(a){a=!!a;i.expandCollapseSonNode(d,null,a,!0);return a},expandNode:function(a,b,c,f,n){function m(){var b=k(a,d).get(0);b&&f!==!1&&i.scrollIntoView(b)}if(!a||!a.isParent)return null;b!==!0&&b!==!1&&(b=!a.open);if((n=!!n)&&b&&j.apply(d.callback.beforeExpand,
+[d.treeId,a],!0)==!1)return null;else if(n&&!b&&j.apply(d.callback.beforeCollapse,[d.treeId,a],!0)==!1)return null;b&&a.parentTId&&i.expandCollapseParentNode(d,a.getParentNode(),b,!1);if(b===a.open&&!c)return null;h.getRoot(d).expandTriggerFlag=n;!j.canAsync(d,a)&&c?i.expandCollapseSonNode(d,a,b,!0,m):(a.open=!b,i.switchNode(this.setting,a),m());return b},getNodes:function(){return h.getNodes(d)},getNodeByParam:function(a,b,c){return!a?null:h.getNodeByParam(d,c?c[d.data.key.children]:h.getNodes(d),
+a,b)},getNodeByTId:function(a){return h.getNodeCache(d,a)},getNodesByParam:function(a,b,c){return!a?null:h.getNodesByParam(d,c?c[d.data.key.children]:h.getNodes(d),a,b)},getNodesByParamFuzzy:function(a,b,c){return!a?null:h.getNodesByParamFuzzy(d,c?c[d.data.key.children]:h.getNodes(d),a,b)},getNodesByFilter:function(a,b,c,f){b=!!b;return!a||typeof a!="function"?b?null:[]:h.getNodesByFilter(d,c?c[d.data.key.children]:h.getNodes(d),a,b,f)},getNodeIndex:function(a){if(!a)return null;for(var b=d.data.key.children,
+c=a.parentTId?a.getParentNode():h.getRoot(d),f=0,i=c[b].length;f<i;f++)if(c[b][f]==a)return f;return-1},getSelectedNodes:function(){for(var a=[],b=h.getRoot(d).curSelectedList,c=0,f=b.length;c<f;c++)a.push(b[c]);return a},isSelectedNode:function(a){return h.isSelectedNode(d,a)},reAsyncChildNodes:function(a,b,c){if(this.setting.async.enable){var j=!a;j&&(a=h.getRoot(d));if(b=="refresh"){for(var b=this.setting.data.key.children,n=0,m=a[b]?a[b].length:0;n<m;n++)h.removeNodeCache(d,a[b][n]);h.removeSelectedNode(d);
+a[b]=[];j?this.setting.treeObj.empty():k(a,f.id.UL,d).empty()}i.asyncNode(this.setting,j?null:a,!!c)}},refresh:function(){this.setting.treeObj.empty();var a=h.getRoot(d),b=a[d.data.key.children];h.initRoot(d);a[d.data.key.children]=b;h.initCache(d);i.createNodes(d,0,a[d.data.key.children],null,-1)},removeChildNodes:function(a){if(!a)return null;var b=a[d.data.key.children];i.removeChildNodes(d,a);return b?b:null},removeNode:function(a,b){a&&(b=!!b,b&&j.apply(d.callback.beforeRemove,[d.treeId,a],!0)==
+!1||(i.removeNode(d,a),b&&this.setting.treeObj.trigger(f.event.REMOVE,[d.treeId,a])))},selectNode:function(a,b,c){function f(){if(!c){var b=k(a,d).get(0);i.scrollIntoView(b)}}if(a&&j.uCanDo(d)){b=d.view.selectedMulti&&b;if(a.parentTId)i.expandCollapseParentNode(d,a.getParentNode(),!0,!1,f);else if(!c)try{k(a,d).focus().blur()}catch(h){}i.selectNode(d,a,b)}},transformTozTreeNodes:function(a){return h.transformTozTreeFormat(d,a)},transformToArray:function(a){return h.transformToArrayFormat(d,a)},updateNode:function(a){a&&
+k(a,d).get(0)&&j.uCanDo(d)&&(i.setNodeName(d,a),i.setNodeTarget(d,a),i.setNodeUrl(d,a),i.setNodeLineIcos(d,a),i.setNodeFontCss(d,a))}};b.treeTools=c;h.setZTreeTools(d,c);b[a]&&b[a].length>0?i.createNodes(d,0,b[a],null,-1):d.async.enable&&d.async.url&&d.async.url!==""&&i.asyncNode(d);return c}};var O=q.fn.zTree,k=j.$,f=O.consts})(jQuery);
+
+/*
+ * JQuery zTree excheck v3.5.28
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2017-01-20
+ */
+(function(m){var p,q,r,o={event:{CHECK:"ztree_check"},id:{CHECK:"_check"},checkbox:{STYLE:"checkbox",DEFAULT:"chk",DISABLED:"disable",FALSE:"false",TRUE:"true",FULL:"full",PART:"part",FOCUS:"focus"},radio:{STYLE:"radio",TYPE_ALL:"all",TYPE_LEVEL:"level"}},v={check:{enable:!1,autoCheckTrigger:!1,chkStyle:o.checkbox.STYLE,nocheckInherit:!1,chkDisabledInherit:!1,radioType:o.radio.TYPE_LEVEL,chkboxType:{Y:"ps",N:"ps"}},data:{key:{checked:"checked"}},callback:{beforeCheck:null,onCheck:null}};p=function(c,
+a){if(a.chkDisabled===!0)return!1;var b=g.getSetting(c.data.treeId),d=b.data.key.checked;if(k.apply(b.callback.beforeCheck,[b.treeId,a],!0)==!1)return!0;a[d]=!a[d];e.checkNodeRelation(b,a);d=n(a,j.id.CHECK,b);e.setChkClass(b,d,a);e.repairParentChkClassWithSelf(b,a);b.treeObj.trigger(j.event.CHECK,[c,b.treeId,a]);return!0};q=function(c,a){if(a.chkDisabled===!0)return!1;var b=g.getSetting(c.data.treeId),d=n(a,j.id.CHECK,b);a.check_Focus=!0;e.setChkClass(b,d,a);return!0};r=function(c,a){if(a.chkDisabled===
+!0)return!1;var b=g.getSetting(c.data.treeId),d=n(a,j.id.CHECK,b);a.check_Focus=!1;e.setChkClass(b,d,a);return!0};m.extend(!0,m.fn.zTree.consts,o);m.extend(!0,m.fn.zTree._z,{tools:{},view:{checkNodeRelation:function(c,a){var b,d,h,i=c.data.key.children,l=c.data.key.checked;b=j.radio;if(c.check.chkStyle==b.STYLE){var f=g.getRadioCheckedList(c);if(a[l])if(c.check.radioType==b.TYPE_ALL){for(d=f.length-1;d>=0;d--)b=f[d],b[l]&&b!=a&&(b[l]=!1,f.splice(d,1),e.setChkClass(c,n(b,j.id.CHECK,c),b),b.parentTId!=
+a.parentTId&&e.repairParentChkClassWithSelf(c,b));f.push(a)}else{f=a.parentTId?a.getParentNode():g.getRoot(c);for(d=0,h=f[i].length;d<h;d++)b=f[i][d],b[l]&&b!=a&&(b[l]=!1,e.setChkClass(c,n(b,j.id.CHECK,c),b))}else if(c.check.radioType==b.TYPE_ALL)for(d=0,h=f.length;d<h;d++)if(a==f[d]){f.splice(d,1);break}}else a[l]&&(!a[i]||a[i].length==0||c.check.chkboxType.Y.indexOf("s")>-1)&&e.setSonNodeCheckBox(c,a,!0),!a[l]&&(!a[i]||a[i].length==0||c.check.chkboxType.N.indexOf("s")>-1)&&e.setSonNodeCheckBox(c,
+a,!1),a[l]&&c.check.chkboxType.Y.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!0),!a[l]&&c.check.chkboxType.N.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!1)},makeChkClass:function(c,a){var b=c.data.key.checked,d=j.checkbox,h=j.radio,i="",i=a.chkDisabled===!0?d.DISABLED:a.halfCheck?d.PART:c.check.chkStyle==h.STYLE?a.check_Child_State<1?d.FULL:d.PART:a[b]?a.check_Child_State===2||a.check_Child_State===-1?d.FULL:d.PART:a.check_Child_State<1?d.FULL:d.PART,b=c.check.chkStyle+"_"+(a[b]?d.TRUE:d.FALSE)+
+"_"+i,b=a.check_Focus&&a.chkDisabled!==!0?b+"_"+d.FOCUS:b;return j.className.BUTTON+" "+d.DEFAULT+" "+b},repairAllChk:function(c,a){if(c.check.enable&&c.check.chkStyle===j.checkbox.STYLE)for(var b=c.data.key.checked,d=c.data.key.children,h=g.getRoot(c),i=0,l=h[d].length;i<l;i++){var f=h[d][i];f.nocheck!==!0&&f.chkDisabled!==!0&&(f[b]=a);e.setSonNodeCheckBox(c,f,a)}},repairChkClass:function(c,a){if(a&&(g.makeChkFlag(c,a),a.nocheck!==!0)){var b=n(a,j.id.CHECK,c);e.setChkClass(c,b,a)}},repairParentChkClass:function(c,
+a){if(a&&a.parentTId){var b=a.getParentNode();e.repairChkClass(c,b);e.repairParentChkClass(c,b)}},repairParentChkClassWithSelf:function(c,a){if(a){var b=c.data.key.children;a[b]&&a[b].length>0?e.repairParentChkClass(c,a[b][0]):e.repairParentChkClass(c,a)}},repairSonChkDisabled:function(c,a,b,d){if(a){var h=c.data.key.children;if(a.chkDisabled!=b)a.chkDisabled=b;e.repairChkClass(c,a);if(a[h]&&d)for(var i=0,l=a[h].length;i<l;i++)e.repairSonChkDisabled(c,a[h][i],b,d)}},repairParentChkDisabled:function(c,
+a,b,d){if(a){if(a.chkDisabled!=b&&d)a.chkDisabled=b;e.repairChkClass(c,a);e.repairParentChkDisabled(c,a.getParentNode(),b,d)}},setChkClass:function(c,a,b){a&&(b.nocheck===!0?a.hide():a.show(),a.attr("class",e.makeChkClass(c,b)))},setParentNodeCheckBox:function(c,a,b,d){var h=c.data.key.children,i=c.data.key.checked,l=n(a,j.id.CHECK,c);d||(d=a);g.makeChkFlag(c,a);a.nocheck!==!0&&a.chkDisabled!==!0&&(a[i]=b,e.setChkClass(c,l,a),c.check.autoCheckTrigger&&a!=d&&c.treeObj.trigger(j.event.CHECK,[null,c.treeId,
+a]));if(a.parentTId){l=!0;if(!b)for(var h=a.getParentNode()[h],f=0,k=h.length;f<k;f++)if(h[f].nocheck!==!0&&h[f].chkDisabled!==!0&&h[f][i]||(h[f].nocheck===!0||h[f].chkDisabled===!0)&&h[f].check_Child_State>0){l=!1;break}l&&e.setParentNodeCheckBox(c,a.getParentNode(),b,d)}},setSonNodeCheckBox:function(c,a,b,d){if(a){var h=c.data.key.children,i=c.data.key.checked,l=n(a,j.id.CHECK,c);d||(d=a);var f=!1;if(a[h])for(var k=0,m=a[h].length;k<m;k++){var o=a[h][k];e.setSonNodeCheckBox(c,o,b,d);o.chkDisabled===
+!0&&(f=!0)}if(a!=g.getRoot(c)&&a.chkDisabled!==!0){f&&a.nocheck!==!0&&g.makeChkFlag(c,a);if(a.nocheck!==!0&&a.chkDisabled!==!0){if(a[i]=b,!f)a.check_Child_State=a[h]&&a[h].length>0?b?2:0:-1}else a.check_Child_State=-1;e.setChkClass(c,l,a);c.check.autoCheckTrigger&&a!=d&&a.nocheck!==!0&&a.chkDisabled!==!0&&c.treeObj.trigger(j.event.CHECK,[null,c.treeId,a])}}}},event:{},data:{getRadioCheckedList:function(c){for(var a=g.getRoot(c).radioCheckedList,b=0,d=a.length;b<d;b++)g.getNodeCache(c,a[b].tId)||(a.splice(b,
+1),b--,d--);return a},getCheckStatus:function(c,a){if(!c.check.enable||a.nocheck||a.chkDisabled)return null;var b=c.data.key.checked;return{checked:a[b],half:a.halfCheck?a.halfCheck:c.check.chkStyle==j.radio.STYLE?a.check_Child_State===2:a[b]?a.check_Child_State>-1&&a.check_Child_State<2:a.check_Child_State>0}},getTreeCheckedNodes:function(c,a,b,d){if(!a)return[];for(var h=c.data.key.children,i=c.data.key.checked,e=b&&c.check.chkStyle==j.radio.STYLE&&c.check.radioType==j.radio.TYPE_ALL,d=!d?[]:d,
+f=0,k=a.length;f<k;f++){if(a[f].nocheck!==!0&&a[f].chkDisabled!==!0&&a[f][i]==b&&(d.push(a[f]),e))break;g.getTreeCheckedNodes(c,a[f][h],b,d);if(e&&d.length>0)break}return d},getTreeChangeCheckedNodes:function(c,a,b){if(!a)return[];for(var d=c.data.key.children,h=c.data.key.checked,b=!b?[]:b,i=0,e=a.length;i<e;i++)a[i].nocheck!==!0&&a[i].chkDisabled!==!0&&a[i][h]!=a[i].checkedOld&&b.push(a[i]),g.getTreeChangeCheckedNodes(c,a[i][d],b);return b},makeChkFlag:function(c,a){if(a){var b=c.data.key.children,
+d=c.data.key.checked,h=-1;if(a[b])for(var i=0,e=a[b].length;i<e;i++){var f=a[b][i],g=-1;if(c.check.chkStyle==j.radio.STYLE)if(g=f.nocheck===!0||f.chkDisabled===!0?f.check_Child_State:f.halfCheck===!0?2:f[d]?2:f.check_Child_State>0?2:0,g==2){h=2;break}else g==0&&(h=0);else if(c.check.chkStyle==j.checkbox.STYLE)if(g=f.nocheck===!0||f.chkDisabled===!0?f.check_Child_State:f.halfCheck===!0?1:f[d]?f.check_Child_State===-1||f.check_Child_State===2?2:1:f.check_Child_State>0?1:0,g===1){h=1;break}else if(g===
+2&&h>-1&&i>0&&g!==h){h=1;break}else if(h===2&&g>-1&&g<2){h=1;break}else g>-1&&(h=g)}a.check_Child_State=h}}}});var m=m.fn.zTree,k=m._z.tools,j=m.consts,e=m._z.view,g=m._z.data,n=k.$;g.exSetting(v);g.addInitBind(function(c){c.treeObj.bind(j.event.CHECK,function(a,b,d,h){a.srcEvent=b;k.apply(c.callback.onCheck,[a,d,h])})});g.addInitUnBind(function(c){c.treeObj.unbind(j.event.CHECK)});g.addInitCache(function(){});g.addInitNode(function(c,a,b,d){if(b){a=c.data.key.checked;typeof b[a]=="string"&&(b[a]=
+k.eqs(b[a],"true"));b[a]=!!b[a];b.checkedOld=b[a];if(typeof b.nocheck=="string")b.nocheck=k.eqs(b.nocheck,"true");b.nocheck=!!b.nocheck||c.check.nocheckInherit&&d&&!!d.nocheck;if(typeof b.chkDisabled=="string")b.chkDisabled=k.eqs(b.chkDisabled,"true");b.chkDisabled=!!b.chkDisabled||c.check.chkDisabledInherit&&d&&!!d.chkDisabled;if(typeof b.halfCheck=="string")b.halfCheck=k.eqs(b.halfCheck,"true");b.halfCheck=!!b.halfCheck;b.check_Child_State=-1;b.check_Focus=!1;b.getCheckStatus=function(){return g.getCheckStatus(c,
+b)};c.check.chkStyle==j.radio.STYLE&&c.check.radioType==j.radio.TYPE_ALL&&b[a]&&g.getRoot(c).radioCheckedList.push(b)}});g.addInitProxy(function(c){var a=c.target,b=g.getSetting(c.data.treeId),d="",h=null,e="",l=null;if(k.eqs(c.type,"mouseover")){if(b.check.enable&&k.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+j.id.CHECK)!==null)d=k.getNodeMainDom(a).id,e="mouseoverCheck"}else if(k.eqs(c.type,"mouseout")){if(b.check.enable&&k.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+j.id.CHECK)!==null)d=
+k.getNodeMainDom(a).id,e="mouseoutCheck"}else if(k.eqs(c.type,"click")&&b.check.enable&&k.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+j.id.CHECK)!==null)d=k.getNodeMainDom(a).id,e="checkNode";if(d.length>0)switch(h=g.getNodeCache(b,d),e){case "checkNode":l=p;break;case "mouseoverCheck":l=q;break;case "mouseoutCheck":l=r}return{stop:e==="checkNode",node:h,nodeEventType:e,nodeEventCallback:l,treeEventType:"",treeEventCallback:null}},!0);g.addInitRoot(function(c){g.getRoot(c).radioCheckedList=[]});
+g.addBeforeA(function(c,a,b){c.check.enable&&(g.makeChkFlag(c,a),b.push("<span ID='",a.tId,j.id.CHECK,"' class='",e.makeChkClass(c,a),"' treeNode",j.id.CHECK,a.nocheck===!0?" style='display:none;'":"","></span>"))});g.addZTreeTools(function(c,a){a.checkNode=function(a,b,c,g){var f=this.setting.data.key.checked;if(a.chkDisabled!==!0&&(b!==!0&&b!==!1&&(b=!a[f]),g=!!g,(a[f]!==b||c)&&!(g&&k.apply(this.setting.callback.beforeCheck,[this.setting.treeId,a],!0)==!1)&&k.uCanDo(this.setting)&&this.setting.check.enable&&
+a.nocheck!==!0))a[f]=b,b=n(a,j.id.CHECK,this.setting),(c||this.setting.check.chkStyle===j.radio.STYLE)&&e.checkNodeRelation(this.setting,a),e.setChkClass(this.setting,b,a),e.repairParentChkClassWithSelf(this.setting,a),g&&this.setting.treeObj.trigger(j.event.CHECK,[null,this.setting.treeId,a])};a.checkAllNodes=function(a){e.repairAllChk(this.setting,!!a)};a.getCheckedNodes=function(a){var b=this.setting.data.key.children;return g.getTreeCheckedNodes(this.setting,g.getRoot(this.setting)[b],a!==!1)};
+a.getChangeCheckedNodes=function(){var a=this.setting.data.key.children;return g.getTreeChangeCheckedNodes(this.setting,g.getRoot(this.setting)[a])};a.setChkDisabled=function(a,b,c,g){b=!!b;c=!!c;e.repairSonChkDisabled(this.setting,a,b,!!g);e.repairParentChkDisabled(this.setting,a.getParentNode(),b,c)};var b=a.updateNode;a.updateNode=function(c,g){b&&b.apply(a,arguments);if(c&&this.setting.check.enable&&n(c,this.setting).get(0)&&k.uCanDo(this.setting)){var i=n(c,j.id.CHECK,this.setting);(g==!0||this.setting.check.chkStyle===
+j.radio.STYLE)&&e.checkNodeRelation(this.setting,c);e.setChkClass(this.setting,i,c);e.repairParentChkClassWithSelf(this.setting,c)}}});var s=e.createNodes;e.createNodes=function(c,a,b,d,g){s&&s.apply(e,arguments);b&&e.repairParentChkClassWithSelf(c,d)};var t=e.removeNode;e.removeNode=function(c,a){var b=a.getParentNode();t&&t.apply(e,arguments);a&&b&&(e.repairChkClass(c,b),e.repairParentChkClass(c,b))};var u=e.appendNodes;e.appendNodes=function(c,a,b,d,h,i,j){var f="";u&&(f=u.apply(e,arguments));
+d&&g.makeChkFlag(c,d);return f}})(jQuery);
+
+/*
+ * JQuery zTree exedit v3.5.28
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2017-01-20
+ */
+(function(v){var J={event:{DRAG:"ztree_drag",DROP:"ztree_drop",RENAME:"ztree_rename",DRAGMOVE:"ztree_dragmove"},id:{EDIT:"_edit",INPUT:"_input",REMOVE:"_remove"},move:{TYPE_INNER:"inner",TYPE_PREV:"prev",TYPE_NEXT:"next"},node:{CURSELECTED_EDIT:"curSelectedNode_Edit",TMPTARGET_TREE:"tmpTargetzTree",TMPTARGET_NODE:"tmpTargetNode"}},x={onHoverOverNode:function(b,a){var c=m.getSetting(b.data.treeId),d=m.getRoot(c);if(d.curHoverNode!=a)x.onHoverOutNode(b);d.curHoverNode=a;f.addHoverDom(c,a)},onHoverOutNode:function(b){var b=
+m.getSetting(b.data.treeId),a=m.getRoot(b);if(a.curHoverNode&&!m.isSelectedNode(b,a.curHoverNode))f.removeTreeDom(b,a.curHoverNode),a.curHoverNode=null},onMousedownNode:function(b,a){function c(b){if(B.dragFlag==0&&Math.abs(O-b.clientX)<e.edit.drag.minMoveSize&&Math.abs(P-b.clientY)<e.edit.drag.minMoveSize)return!0;var a,c,n,k,i;i=e.data.key.children;M.css("cursor","pointer");if(B.dragFlag==0){if(g.apply(e.callback.beforeDrag,[e.treeId,l],!0)==!1)return r(b),!0;for(a=0,c=l.length;a<c;a++){if(a==0)B.dragNodeShowBefore=
+[];n=l[a];n.isParent&&n.open?(f.expandCollapseNode(e,n,!n.open),B.dragNodeShowBefore[n.tId]=!0):B.dragNodeShowBefore[n.tId]=!1}B.dragFlag=1;t.showHoverDom=!1;g.showIfameMask(e,!0);n=!0;k=-1;if(l.length>1){var j=l[0].parentTId?l[0].getParentNode()[i]:m.getNodes(e);i=[];for(a=0,c=j.length;a<c;a++)if(B.dragNodeShowBefore[j[a].tId]!==void 0&&(n&&k>-1&&k+1!==a&&(n=!1),i.push(j[a]),k=a),l.length===i.length){l=i;break}}n&&(I=l[0].getPreNode(),R=l[l.length-1].getNextNode());D=o("<ul class='zTreeDragUL'></ul>",
+e);for(a=0,c=l.length;a<c;a++)n=l[a],n.editNameFlag=!1,f.selectNode(e,n,a>0),f.removeTreeDom(e,n),a>e.edit.drag.maxShowNodeNum-1||(k=o("<li id='"+n.tId+"_tmp'></li>",e),k.append(o(n,d.id.A,e).clone()),k.css("padding","0"),k.children("#"+n.tId+d.id.A).removeClass(d.node.CURSELECTED),D.append(k),a==e.edit.drag.maxShowNodeNum-1&&(k=o("<li id='"+n.tId+"_moretmp'><a>  ...  </a></li>",e),D.append(k)));D.attr("id",l[0].tId+d.id.UL+"_tmp");D.addClass(e.treeObj.attr("class"));D.appendTo(M);A=o("<span class='tmpzTreeMove_arrow'></span>",
+e);A.attr("id","zTreeMove_arrow_tmp");A.appendTo(M);e.treeObj.trigger(d.event.DRAG,[b,e.treeId,l])}if(B.dragFlag==1){s&&A.attr("id")==b.target.id&&u&&b.clientX+G.scrollLeft()+2>v("#"+u+d.id.A,s).offset().left?(n=v("#"+u+d.id.A,s),b.target=n.length>0?n.get(0):b.target):s&&(s.removeClass(d.node.TMPTARGET_TREE),u&&v("#"+u+d.id.A,s).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+J.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+J.move.TYPE_INNER));
+u=s=null;K=!1;h=e;n=m.getSettings();for(var y in n)if(n[y].treeId&&n[y].edit.enable&&n[y].treeId!=e.treeId&&(b.target.id==n[y].treeId||v(b.target).parents("#"+n[y].treeId).length>0))K=!0,h=n[y];y=G.scrollTop();k=G.scrollLeft();i=h.treeObj.offset();a=h.treeObj.get(0).scrollHeight;n=h.treeObj.get(0).scrollWidth;c=b.clientY+y-i.top;var p=h.treeObj.height()+i.top-b.clientY-y,q=b.clientX+k-i.left,H=h.treeObj.width()+i.left-b.clientX-k;i=c<e.edit.drag.borderMax&&c>e.edit.drag.borderMin;var j=p<e.edit.drag.borderMax&&
+p>e.edit.drag.borderMin,F=q<e.edit.drag.borderMax&&q>e.edit.drag.borderMin,x=H<e.edit.drag.borderMax&&H>e.edit.drag.borderMin,p=c>e.edit.drag.borderMin&&p>e.edit.drag.borderMin&&q>e.edit.drag.borderMin&&H>e.edit.drag.borderMin,q=i&&h.treeObj.scrollTop()<=0,H=j&&h.treeObj.scrollTop()+h.treeObj.height()+10>=a,N=F&&h.treeObj.scrollLeft()<=0,Q=x&&h.treeObj.scrollLeft()+h.treeObj.width()+10>=n;if(b.target&&g.isChildOrSelf(b.target,h.treeId)){for(var E=b.target;E&&E.tagName&&!g.eqs(E.tagName,"li")&&E.id!=
+h.treeId;)E=E.parentNode;var S=!0;for(a=0,c=l.length;a<c;a++)if(n=l[a],E.id===n.tId){S=!1;break}else if(o(n,e).find("#"+E.id).length>0){S=!1;break}if(S&&b.target&&g.isChildOrSelf(b.target,E.id+d.id.A))s=v(E),u=E.id}n=l[0];if(p&&g.isChildOrSelf(b.target,h.treeId)){if(!s&&(b.target.id==h.treeId||q||H||N||Q)&&(K||!K&&n.parentTId))s=h.treeObj;i?h.treeObj.scrollTop(h.treeObj.scrollTop()-10):j&&h.treeObj.scrollTop(h.treeObj.scrollTop()+10);F?h.treeObj.scrollLeft(h.treeObj.scrollLeft()-10):x&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+
+10);s&&s!=h.treeObj&&s.offset().left<h.treeObj.offset().left&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+s.offset().left-h.treeObj.offset().left)}D.css({top:b.clientY+y+3+"px",left:b.clientX+k+3+"px"});c=a=0;if(s&&s.attr("id")!=h.treeId){var z=u==null?null:m.getNodeCache(h,u);i=(b.ctrlKey||b.metaKey)&&e.edit.drag.isMove&&e.edit.drag.isCopy||!e.edit.drag.isMove&&e.edit.drag.isCopy;k=!!(I&&u===I.tId);F=!!(R&&u===R.tId);j=n.parentTId&&n.parentTId==u;n=(i||!F)&&g.apply(h.edit.drag.prev,[h.treeId,l,z],
+!!h.edit.drag.prev);k=(i||!k)&&g.apply(h.edit.drag.next,[h.treeId,l,z],!!h.edit.drag.next);i=(i||!j)&&!(h.data.keep.leaf&&!z.isParent)&&g.apply(h.edit.drag.inner,[h.treeId,l,z],!!h.edit.drag.inner);j=function(){s=null;u="";w=d.move.TYPE_INNER;A.css({display:"none"});if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null};if(!n&&!k&&!i)j();else if(F=v("#"+u+d.id.A,s),x=z.isLastNode?null:v("#"+z.getNextNode().tId+d.id.A,s.next()),p=F.offset().top,q=F.offset().left,
+H=n?i?0.25:k?0.5:1:-1,N=k?i?0.75:n?0.5:0:-1,y=(b.clientY+y-p)/F.height(),(H==1||y<=H&&y>=-0.2)&&n?(a=1-A.width(),c=p-A.height()/2,w=d.move.TYPE_PREV):(N==0||y>=N&&y<=1.2)&&k?(a=1-A.width(),c=x==null||z.isParent&&z.open?p+F.height()-A.height()/2:x.offset().top-A.height()/2,w=d.move.TYPE_NEXT):i?(a=5-A.width(),c=p,w=d.move.TYPE_INNER):j(),s){A.css({display:"block",top:c+"px",left:q+a+"px"});F.addClass(d.node.TMPTARGET_NODE+"_"+w);if(T!=u||U!=w)L=(new Date).getTime();if(z&&z.isParent&&w==d.move.TYPE_INNER&&
+(y=!0,window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId!==z.tId?(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null):window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId===z.tId&&(y=!1),y))window.zTreeMoveTimer=setTimeout(function(){w==d.move.TYPE_INNER&&z&&z.isParent&&!z.open&&(new Date).getTime()-L>h.edit.drag.autoOpenTime&&g.apply(h.callback.beforeDragOpen,[h.treeId,z],!0)&&(f.switchNode(h,z),h.edit.drag.autoExpandTrigger&&h.treeObj.trigger(d.event.EXPAND,[h.treeId,z]))},
+h.edit.drag.autoOpenTime+50),window.zTreeMoveTargetNodeTId=z.tId}}else if(w=d.move.TYPE_INNER,s&&g.apply(h.edit.drag.inner,[h.treeId,l,null],!!h.edit.drag.inner)?s.addClass(d.node.TMPTARGET_TREE):s=null,A.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;T=u;U=w;e.treeObj.trigger(d.event.DRAGMOVE,[b,e.treeId,l])}return!1}function r(b){if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;U=T=
+null;G.unbind("mousemove",c);G.unbind("mouseup",r);G.unbind("selectstart",k);M.css("cursor","auto");s&&(s.removeClass(d.node.TMPTARGET_TREE),u&&v("#"+u+d.id.A,s).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+J.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+J.move.TYPE_INNER));g.showIfameMask(e,!1);t.showHoverDom=!0;if(B.dragFlag!=0){B.dragFlag=0;var a,i,j;for(a=0,i=l.length;a<i;a++)j=l[a],j.isParent&&B.dragNodeShowBefore[j.tId]&&!j.open&&(f.expandCollapseNode(e,
+j,!j.open),delete B.dragNodeShowBefore[j.tId]);D&&D.remove();A&&A.remove();var p=(b.ctrlKey||b.metaKey)&&e.edit.drag.isMove&&e.edit.drag.isCopy||!e.edit.drag.isMove&&e.edit.drag.isCopy;!p&&s&&u&&l[0].parentTId&&u==l[0].parentTId&&w==d.move.TYPE_INNER&&(s=null);if(s){var q=u==null?null:m.getNodeCache(h,u);if(g.apply(e.callback.beforeDrop,[h.treeId,l,q,w,p],!0)==!1)f.selectNodes(x,l);else{var C=p?g.clone(l):l;a=function(){if(K){if(!p)for(var a=0,c=l.length;a<c;a++)f.removeNode(e,l[a]);w==d.move.TYPE_INNER?
+f.addNodes(h,q,-1,C):f.addNodes(h,q.getParentNode(),w==d.move.TYPE_PREV?q.getIndex():q.getIndex()+1,C)}else if(p&&w==d.move.TYPE_INNER)f.addNodes(h,q,-1,C);else if(p)f.addNodes(h,q.getParentNode(),w==d.move.TYPE_PREV?q.getIndex():q.getIndex()+1,C);else if(w!=d.move.TYPE_NEXT)for(a=0,c=C.length;a<c;a++)f.moveNode(h,q,C[a],w,!1);else for(a=-1,c=C.length-1;a<c;c--)f.moveNode(h,q,C[c],w,!1);f.selectNodes(h,C);a=o(C[0],e).get(0);f.scrollIntoView(a);e.treeObj.trigger(d.event.DROP,[b,h.treeId,C,q,w,p])};
+w==d.move.TYPE_INNER&&g.canAsync(h,q)?f.asyncNode(h,q,!1,a):a()}}else f.selectNodes(x,l),e.treeObj.trigger(d.event.DROP,[b,e.treeId,l,null,null,null])}}function k(){return!1}var i,j,e=m.getSetting(b.data.treeId),B=m.getRoot(e),t=m.getRoots();if(b.button==2||!e.edit.enable||!e.edit.drag.isCopy&&!e.edit.drag.isMove)return!0;var p=b.target,q=m.getRoot(e).curSelectedList,l=[];if(m.isSelectedNode(e,a))for(i=0,j=q.length;i<j;i++){if(q[i].editNameFlag&&g.eqs(p.tagName,"input")&&p.getAttribute("treeNode"+
+d.id.INPUT)!==null)return!0;l.push(q[i]);if(l[0].parentTId!==q[i].parentTId){l=[a];break}}else l=[a];f.editNodeBlur=!0;f.cancelCurEditNode(e);var G=v(e.treeObj.get(0).ownerDocument),M=v(e.treeObj.get(0).ownerDocument.body),D,A,s,K=!1,h=e,x=e,I,R,T=null,U=null,u=null,w=d.move.TYPE_INNER,O=b.clientX,P=b.clientY,L=(new Date).getTime();g.uCanDo(e)&&G.bind("mousemove",c);G.bind("mouseup",r);G.bind("selectstart",k);b.preventDefault&&b.preventDefault();return!0}};v.extend(!0,v.fn.zTree.consts,J);v.extend(!0,
+v.fn.zTree._z,{tools:{getAbs:function(b){b=b.getBoundingClientRect();return[b.left+(document.body.scrollLeft+document.documentElement.scrollLeft),b.top+(document.body.scrollTop+document.documentElement.scrollTop)]},inputFocus:function(b){b.get(0)&&(b.focus(),g.setCursorPosition(b.get(0),b.val().length))},inputSelect:function(b){b.get(0)&&(b.focus(),b.select())},setCursorPosition:function(b,a){if(b.setSelectionRange)b.focus(),b.setSelectionRange(a,a);else if(b.createTextRange){var c=b.createTextRange();
+c.collapse(!0);c.moveEnd("character",a);c.moveStart("character",a);c.select()}},showIfameMask:function(b,a){for(var c=m.getRoot(b);c.dragMaskList.length>0;)c.dragMaskList[0].remove(),c.dragMaskList.shift();if(a)for(var d=o("iframe",b),f=0,i=d.length;f<i;f++){var j=d.get(f),e=g.getAbs(j),j=o("<div id='zTreeMask_"+f+"' class='zTreeMask' style='top:"+e[1]+"px; left:"+e[0]+"px; width:"+j.offsetWidth+"px; height:"+j.offsetHeight+"px;'></div>",b);j.appendTo(o("body",b));c.dragMaskList.push(j)}}},view:{addEditBtn:function(b,
+a){if(!(a.editNameFlag||o(a,d.id.EDIT,b).length>0)&&g.apply(b.edit.showRenameBtn,[b.treeId,a],b.edit.showRenameBtn)){var c=o(a,d.id.A,b),r="<span class='"+d.className.BUTTON+" edit' id='"+a.tId+d.id.EDIT+"' title='"+g.apply(b.edit.renameTitle,[b.treeId,a],b.edit.renameTitle)+"' treeNode"+d.id.EDIT+" style='display:none;'></span>";c.append(r);o(a,d.id.EDIT,b).bind("click",function(){if(!g.uCanDo(b)||g.apply(b.callback.beforeEditName,[b.treeId,a],!0)==!1)return!1;f.editNode(b,a);return!1}).show()}},
+addRemoveBtn:function(b,a){if(!(a.editNameFlag||o(a,d.id.REMOVE,b).length>0)&&g.apply(b.edit.showRemoveBtn,[b.treeId,a],b.edit.showRemoveBtn)){var c=o(a,d.id.A,b),r="<span class='"+d.className.BUTTON+" remove' id='"+a.tId+d.id.REMOVE+"' title='"+g.apply(b.edit.removeTitle,[b.treeId,a],b.edit.removeTitle)+"' treeNode"+d.id.REMOVE+" style='display:none;'></span>";c.append(r);o(a,d.id.REMOVE,b).bind("click",function(){if(!g.uCanDo(b)||g.apply(b.callback.beforeRemove,[b.treeId,a],!0)==!1)return!1;f.removeNode(b,
+a);b.treeObj.trigger(d.event.REMOVE,[b.treeId,a]);return!1}).bind("mousedown",function(){return!0}).show()}},addHoverDom:function(b,a){if(m.getRoots().showHoverDom)a.isHover=!0,b.edit.enable&&(f.addEditBtn(b,a),f.addRemoveBtn(b,a)),g.apply(b.view.addHoverDom,[b.treeId,a])},cancelCurEditNode:function(b,a,c){var r=m.getRoot(b),k=b.data.key.name,i=r.curEditNode;if(i){var j=r.curEditInput,a=a?a:c?i[k]:j.val();if(g.apply(b.callback.beforeRename,[b.treeId,i,a,c],!0)===!1)return!1;i[k]=a;o(i,d.id.A,b).removeClass(d.node.CURSELECTED_EDIT);
+j.unbind();f.setNodeName(b,i);i.editNameFlag=!1;r.curEditNode=null;r.curEditInput=null;f.selectNode(b,i,!1);b.treeObj.trigger(d.event.RENAME,[b.treeId,i,c])}return r.noSelection=!0},editNode:function(b,a){var c=m.getRoot(b);f.editNodeBlur=!1;if(m.isSelectedNode(b,a)&&c.curEditNode==a&&a.editNameFlag)setTimeout(function(){g.inputFocus(c.curEditInput)},0);else{var r=b.data.key.name;a.editNameFlag=!0;f.removeTreeDom(b,a);f.cancelCurEditNode(b);f.selectNode(b,a,!1);o(a,d.id.SPAN,b).html("<input type=text class='rename' id='"+
+a.tId+d.id.INPUT+"' treeNode"+d.id.INPUT+" >");var k=o(a,d.id.INPUT,b);k.attr("value",a[r]);b.edit.editNameSelectAll?g.inputSelect(k):g.inputFocus(k);k.bind("blur",function(){f.editNodeBlur||f.cancelCurEditNode(b)}).bind("keydown",function(a){a.keyCode=="13"?(f.editNodeBlur=!0,f.cancelCurEditNode(b)):a.keyCode=="27"&&f.cancelCurEditNode(b,null,!0)}).bind("click",function(){return!1}).bind("dblclick",function(){return!1});o(a,d.id.A,b).addClass(d.node.CURSELECTED_EDIT);c.curEditInput=k;c.noSelection=
+!1;c.curEditNode=a}},moveNode:function(b,a,c,r,k,i){var j=m.getRoot(b),e=b.data.key.children;if(a!=c&&(!b.data.keep.leaf||!a||a.isParent||r!=d.move.TYPE_INNER)){var g=c.parentTId?c.getParentNode():j,t=a===null||a==j;t&&a===null&&(a=j);if(t)r=d.move.TYPE_INNER;j=a.parentTId?a.getParentNode():j;if(r!=d.move.TYPE_PREV&&r!=d.move.TYPE_NEXT)r=d.move.TYPE_INNER;if(r==d.move.TYPE_INNER)if(t)c.parentTId=null;else{if(!a.isParent)a.isParent=!0,a.open=!!a.open,f.setNodeLineIcos(b,a);c.parentTId=a.tId}var p;
+t?p=t=b.treeObj:(!i&&r==d.move.TYPE_INNER?f.expandCollapseNode(b,a,!0,!1):i||f.expandCollapseNode(b,a.getParentNode(),!0,!1),t=o(a,b),p=o(a,d.id.UL,b),t.get(0)&&!p.get(0)&&(p=[],f.makeUlHtml(b,a,p,""),t.append(p.join(""))),p=o(a,d.id.UL,b));var q=o(c,b);q.get(0)?t.get(0)||q.remove():q=f.appendNodes(b,c.level,[c],null,-1,!1,!0).join("");p.get(0)&&r==d.move.TYPE_INNER?p.append(q):t.get(0)&&r==d.move.TYPE_PREV?t.before(q):t.get(0)&&r==d.move.TYPE_NEXT&&t.after(q);var l=-1,v=0,x=null,t=null,D=c.level;
+if(c.isFirstNode){if(l=0,g[e].length>1)x=g[e][1],x.isFirstNode=!0}else if(c.isLastNode)l=g[e].length-1,x=g[e][l-1],x.isLastNode=!0;else for(p=0,q=g[e].length;p<q;p++)if(g[e][p].tId==c.tId){l=p;break}l>=0&&g[e].splice(l,1);if(r!=d.move.TYPE_INNER)for(p=0,q=j[e].length;p<q;p++)j[e][p].tId==a.tId&&(v=p);if(r==d.move.TYPE_INNER){a[e]||(a[e]=[]);if(a[e].length>0)t=a[e][a[e].length-1],t.isLastNode=!1;a[e].splice(a[e].length,0,c);c.isLastNode=!0;c.isFirstNode=a[e].length==1}else a.isFirstNode&&r==d.move.TYPE_PREV?
+(j[e].splice(v,0,c),t=a,t.isFirstNode=!1,c.parentTId=a.parentTId,c.isFirstNode=!0,c.isLastNode=!1):a.isLastNode&&r==d.move.TYPE_NEXT?(j[e].splice(v+1,0,c),t=a,t.isLastNode=!1,c.parentTId=a.parentTId,c.isFirstNode=!1,c.isLastNode=!0):(r==d.move.TYPE_PREV?j[e].splice(v,0,c):j[e].splice(v+1,0,c),c.parentTId=a.parentTId,c.isFirstNode=!1,c.isLastNode=!1);m.fixPIdKeyValue(b,c);m.setSonNodeLevel(b,c.getParentNode(),c);f.setNodeLineIcos(b,c);f.repairNodeLevelClass(b,c,D);!b.data.keep.parent&&g[e].length<
+1?(g.isParent=!1,g.open=!1,a=o(g,d.id.UL,b),r=o(g,d.id.SWITCH,b),e=o(g,d.id.ICON,b),f.replaceSwitchClass(g,r,d.folder.DOCU),f.replaceIcoClass(g,e,d.folder.DOCU),a.css("display","none")):x&&f.setNodeLineIcos(b,x);t&&f.setNodeLineIcos(b,t);b.check&&b.check.enable&&f.repairChkClass&&(f.repairChkClass(b,g),f.repairParentChkClassWithSelf(b,g),g!=c.parent&&f.repairParentChkClassWithSelf(b,c));i||f.expandCollapseParentNode(b,c.getParentNode(),!0,k)}},removeEditBtn:function(b,a){o(a,d.id.EDIT,b).unbind().remove()},
+removeRemoveBtn:function(b,a){o(a,d.id.REMOVE,b).unbind().remove()},removeTreeDom:function(b,a){a.isHover=!1;f.removeEditBtn(b,a);f.removeRemoveBtn(b,a);g.apply(b.view.removeHoverDom,[b.treeId,a])},repairNodeLevelClass:function(b,a,c){if(c!==a.level){var f=o(a,b),g=o(a,d.id.A,b),b=o(a,d.id.UL,b),c=d.className.LEVEL+c,a=d.className.LEVEL+a.level;f.removeClass(c);f.addClass(a);g.removeClass(c);g.addClass(a);b.removeClass(c);b.addClass(a)}},selectNodes:function(b,a){for(var c=0,d=a.length;c<d;c++)f.selectNode(b,
+a[c],c>0)}},event:{},data:{setSonNodeLevel:function(b,a,c){if(c){var d=b.data.key.children;c.level=a?a.level+1:0;if(c[d])for(var a=0,f=c[d].length;a<f;a++)c[d][a]&&m.setSonNodeLevel(b,c,c[d][a])}}}});var I=v.fn.zTree,g=I._z.tools,d=I.consts,f=I._z.view,m=I._z.data,o=g.$;m.exSetting({edit:{enable:!1,editNameSelectAll:!1,showRemoveBtn:!0,showRenameBtn:!0,removeTitle:"remove",renameTitle:"rename",drag:{autoExpandTrigger:!1,isCopy:!0,isMove:!0,prev:!0,next:!0,inner:!0,minMoveSize:5,borderMax:10,borderMin:-5,
+maxShowNodeNum:5,autoOpenTime:500}},view:{addHoverDom:null,removeHoverDom:null},callback:{beforeDrag:null,beforeDragOpen:null,beforeDrop:null,beforeEditName:null,beforeRename:null,onDrag:null,onDragMove:null,onDrop:null,onRename:null}});m.addInitBind(function(b){var a=b.treeObj,c=d.event;a.bind(c.RENAME,function(a,c,d,f){g.apply(b.callback.onRename,[a,c,d,f])});a.bind(c.DRAG,function(a,c,d,f){g.apply(b.callback.onDrag,[c,d,f])});a.bind(c.DRAGMOVE,function(a,c,d,f){g.apply(b.callback.onDragMove,[c,
+d,f])});a.bind(c.DROP,function(a,c,d,f,e,m,o){g.apply(b.callback.onDrop,[c,d,f,e,m,o])})});m.addInitUnBind(function(b){var b=b.treeObj,a=d.event;b.unbind(a.RENAME);b.unbind(a.DRAG);b.unbind(a.DRAGMOVE);b.unbind(a.DROP)});m.addInitCache(function(){});m.addInitNode(function(b,a,c){if(c)c.isHover=!1,c.editNameFlag=!1});m.addInitProxy(function(b){var a=b.target,c=m.getSetting(b.data.treeId),f=b.relatedTarget,k="",i=null,j="",e=null,o=null;if(g.eqs(b.type,"mouseover")){if(o=g.getMDom(c,a,[{tagName:"a",
+attrName:"treeNode"+d.id.A}]))k=g.getNodeMainDom(o).id,j="hoverOverNode"}else if(g.eqs(b.type,"mouseout"))o=g.getMDom(c,f,[{tagName:"a",attrName:"treeNode"+d.id.A}]),o||(k="remove",j="hoverOutNode");else if(g.eqs(b.type,"mousedown")&&(o=g.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+d.id.A}])))k=g.getNodeMainDom(o).id,j="mousedownNode";if(k.length>0)switch(i=m.getNodeCache(c,k),j){case "mousedownNode":e=x.onMousedownNode;break;case "hoverOverNode":e=x.onHoverOverNode;break;case "hoverOutNode":e=
+x.onHoverOutNode}return{stop:!1,node:i,nodeEventType:j,nodeEventCallback:e,treeEventType:"",treeEventCallback:null}});m.addInitRoot(function(b){var b=m.getRoot(b),a=m.getRoots();b.curEditNode=null;b.curEditInput=null;b.curHoverNode=null;b.dragFlag=0;b.dragNodeShowBefore=[];b.dragMaskList=[];a.showHoverDom=!0});m.addZTreeTools(function(b,a){a.cancelEditName=function(a){m.getRoot(this.setting).curEditNode&&f.cancelCurEditNode(this.setting,a?a:null,!0)};a.copyNode=function(a,b,k,i){if(!b)return null;
+if(a&&!a.isParent&&this.setting.data.keep.leaf&&k===d.move.TYPE_INNER)return null;var j=this,e=g.clone(b);if(!a)a=null,k=d.move.TYPE_INNER;k==d.move.TYPE_INNER?(b=function(){f.addNodes(j.setting,a,-1,[e],i)},g.canAsync(this.setting,a)?f.asyncNode(this.setting,a,i,b):b()):(f.addNodes(this.setting,a.parentNode,-1,[e],i),f.moveNode(this.setting,a,e,k,!1,i));return e};a.editName=function(a){a&&a.tId&&a===m.getNodeCache(this.setting,a.tId)&&(a.parentTId&&f.expandCollapseParentNode(this.setting,a.getParentNode(),
+!0),f.editNode(this.setting,a))};a.moveNode=function(a,b,k,i){function j(){f.moveNode(e.setting,a,b,k,!1,i)}if(!b)return b;if(a&&!a.isParent&&this.setting.data.keep.leaf&&k===d.move.TYPE_INNER)return null;else if(a&&(b.parentTId==a.tId&&k==d.move.TYPE_INNER||o(b,this.setting).find("#"+a.tId).length>0))return null;else a||(a=null);var e=this;g.canAsync(this.setting,a)&&k===d.move.TYPE_INNER?f.asyncNode(this.setting,a,i,j):j();return b};a.setEditable=function(a){this.setting.edit.enable=a;return this.refresh()}});
+var O=f.cancelPreSelectedNode;f.cancelPreSelectedNode=function(b,a){for(var c=m.getRoot(b).curSelectedList,d=0,g=c.length;d<g;d++)if(!a||a===c[d])if(f.removeTreeDom(b,c[d]),a)break;O&&O.apply(f,arguments)};var P=f.createNodes;f.createNodes=function(b,a,c,d,g){P&&P.apply(f,arguments);c&&f.repairParentChkClassWithSelf&&f.repairParentChkClassWithSelf(b,d)};var W=f.makeNodeUrl;f.makeNodeUrl=function(b,a){return b.edit.enable?null:W.apply(f,arguments)};var L=f.removeNode;f.removeNode=function(b,a){var c=
+m.getRoot(b);if(c.curEditNode===a)c.curEditNode=null;L&&L.apply(f,arguments)};var Q=f.selectNode;f.selectNode=function(b,a,c){var d=m.getRoot(b);if(m.isSelectedNode(b,a)&&d.curEditNode==a&&a.editNameFlag)return!1;Q&&Q.apply(f,arguments);f.addHoverDom(b,a);return!0};var V=g.uCanDo;g.uCanDo=function(b,a){var c=m.getRoot(b);if(a&&(g.eqs(a.type,"mouseover")||g.eqs(a.type,"mouseout")||g.eqs(a.type,"mousedown")||g.eqs(a.type,"mouseup")))return!0;if(c.curEditNode)f.editNodeBlur=!1,c.curEditInput.focus();
+return!c.curEditNode&&(V?V.apply(f,arguments):!0)}})(jQuery);
+
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/ASPJson.class.asp b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/ASPJson.class.asp
new file mode 100644
index 0000000..acd48b9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/ASPJson.class.asp
@@ -0,0 +1,271 @@
+<%
+'Februari 2014 - Version 1.17 by Gerrit van Kuipers
+Class AspJSON
+	Public data
+	Private p_JSONstring
+	private aj_in_string, aj_in_escape, aj_i_tmp, aj_char_tmp, aj_s_tmp, aj_line_tmp, aj_line, aj_lines, aj_currentlevel, aj_currentkey, aj_currentvalue, aj_newlabel, aj_XmlHttp, aj_RegExp, aj_colonfound
+
+	Private Sub Class_Initialize()
+		Set data = Collection()
+
+	    Set aj_RegExp = new regexp
+	    aj_RegExp.Pattern = "\s{0,}(\S{1}[\s,\S]*\S{1})\s{0,}"
+	    aj_RegExp.Global = False
+	    aj_RegExp.IgnoreCase = True
+	    aj_RegExp.Multiline = True
+	End Sub
+
+	Private Sub Class_Terminate()
+		Set data = Nothing
+	    Set aj_RegExp = Nothing
+	End Sub
+
+	Public Sub loadJSON(inputsource)
+		inputsource = aj_MultilineTrim(inputsource)
+		If Len(inputsource) = 0 Then Err.Raise 1, "loadJSON Error", "No data to load."
+		
+		select case Left(inputsource, 1)
+			case "{", "["
+			case else
+				Set aj_XmlHttp = Server.CreateObject("Msxml2.ServerXMLHTTP")
+				aj_XmlHttp.open "GET", inputsource, False
+				aj_XmlHttp.setRequestHeader "Content-Type", "text/json"
+				aj_XmlHttp.setRequestHeader "CharSet", "UTF-8"
+				aj_XmlHttp.Send
+				inputsource = aj_XmlHttp.responseText
+				set aj_XmlHttp = Nothing
+		end select
+
+		p_JSONstring = CleanUpJSONstring(inputsource)
+		aj_lines = Split(p_JSONstring, Chr(13) & Chr(10))
+
+		Dim level(99)
+		aj_currentlevel = 1
+		Set level(aj_currentlevel) = data
+		For Each aj_line In aj_lines
+			aj_currentkey = ""
+			aj_currentvalue = ""
+			If Instr(aj_line, ":") > 0 Then
+				aj_in_string = False
+				aj_in_escape = False
+				aj_colonfound = False
+				For aj_i_tmp = 1 To Len(aj_line)
+					If aj_in_escape Then
+						aj_in_escape = False
+					Else
+						Select Case Mid(aj_line, aj_i_tmp, 1)
+							Case """"
+								aj_in_string = Not aj_in_string
+							Case ":"
+								If Not aj_in_escape And Not aj_in_string Then
+									aj_currentkey = Left(aj_line, aj_i_tmp - 1)
+									aj_currentvalue = Mid(aj_line, aj_i_tmp + 1)
+									aj_colonfound = True
+									Exit For
+								End If
+							Case "\"
+								aj_in_escape = True
+						End Select
+					End If
+				Next
+				if aj_colonfound then
+					aj_currentkey = aj_Strip(aj_JSONDecode(aj_currentkey), """")
+					If Not level(aj_currentlevel).exists(aj_currentkey) Then level(aj_currentlevel).Add aj_currentkey, ""
+				end if
+			End If
+			If right(aj_line,1) = "{" Or right(aj_line,1) = "[" Then
+				If Len(aj_currentkey) = 0 Then aj_currentkey = level(aj_currentlevel).Count
+				Set level(aj_currentlevel).Item(aj_currentkey) = Collection()
+				Set level(aj_currentlevel + 1) = level(aj_currentlevel).Item(aj_currentkey)
+				aj_currentlevel = aj_currentlevel + 1
+				aj_currentkey = ""
+			ElseIf right(aj_line,1) = "}" Or right(aj_line,1) = "]" or right(aj_line,2) = "}," Or right(aj_line,2) = "]," Then
+				aj_currentlevel = aj_currentlevel - 1
+			ElseIf Len(Trim(aj_line)) > 0 Then
+				if Len(aj_currentvalue) = 0 Then aj_currentvalue = aj_line
+				aj_currentvalue = getJSONValue(aj_currentvalue)
+
+				If Len(aj_currentkey) = 0 Then aj_currentkey = level(aj_currentlevel).Count
+				level(aj_currentlevel).Item(aj_currentkey) = aj_currentvalue
+			End If
+		Next
+	End Sub
+
+	Public Function Collection()
+		set Collection = Server.CreateObject("Scripting.Dictionary")
+	End Function
+
+	Public Function AddToCollection(dictobj)
+		if TypeName(dictobj) <> "Dictionary" then Err.Raise 1, "AddToCollection Error", "Not a collection."
+		aj_newlabel = dictobj.Count
+		dictobj.Add aj_newlabel, Collection()
+		set AddToCollection = dictobj.item(aj_newlabel)
+	end function
+
+	Private Function CleanUpJSONstring(aj_originalstring)
+		aj_originalstring = Replace(aj_originalstring, Chr(13) & Chr(10), "")
+		aj_originalstring = Mid(aj_originalstring, 2, Len(aj_originalstring) - 2)
+		aj_in_string = False : aj_in_escape = False : aj_s_tmp = ""
+		For aj_i_tmp = 1 To Len(aj_originalstring)
+			aj_char_tmp = Mid(aj_originalstring, aj_i_tmp, 1)
+			If aj_in_escape Then
+				aj_in_escape = False
+				aj_s_tmp = aj_s_tmp & aj_char_tmp
+			Else
+				Select Case aj_char_tmp
+					Case "\" : aj_s_tmp = aj_s_tmp & aj_char_tmp : aj_in_escape = True
+					Case """" : aj_s_tmp = aj_s_tmp & aj_char_tmp : aj_in_string = Not aj_in_string
+					Case "{", "["
+						aj_s_tmp = aj_s_tmp & aj_char_tmp & aj_InlineIf(aj_in_string, "", Chr(13) & Chr(10))
+					Case "}", "]"
+						aj_s_tmp = aj_s_tmp & aj_InlineIf(aj_in_string, "", Chr(13) & Chr(10)) & aj_char_tmp
+					Case "," : aj_s_tmp = aj_s_tmp & aj_char_tmp & aj_InlineIf(aj_in_string, "", Chr(13) & Chr(10))
+					Case Else : aj_s_tmp = aj_s_tmp & aj_char_tmp
+				End Select
+			End If
+		Next
+
+		CleanUpJSONstring = ""
+		aj_s_tmp = split(aj_s_tmp, Chr(13) & Chr(10))
+		For Each aj_line_tmp In aj_s_tmp
+			aj_line_tmp = replace(replace(aj_line_tmp, chr(10), ""), chr(13), "")
+			CleanUpJSONstring = CleanUpJSONstring & aj_Trim(aj_line_tmp) & Chr(13) & Chr(10)
+		Next
+	End Function
+
+	Private Function getJSONValue(ByVal val)
+		val = Trim(val)
+		If Left(val,1) = ":"  Then val = Mid(val, 2)
+		If Right(val,1) = "," Then val = Left(val, Len(val) - 1)
+		val = Trim(val)
+
+		Select Case val
+			Case "true"  : getJSONValue = True
+			Case "false" : getJSONValue = False
+			Case "null" : getJSONValue = Null
+			Case Else
+				If (Instr(val, """") = 0) Then
+					If IsNumeric(val) Then
+						getJSONValue = CDbl(val)
+					Else
+						getJSONValue = val
+					End If
+				Else
+					If Left(val,1) = """" Then val = Mid(val, 2)
+					If Right(val,1) = """" Then val = Left(val, Len(val) - 1)
+					getJSONValue = aj_JSONDecode(Trim(val))
+				End If
+		End Select
+	End Function
+
+	Private JSONoutput_level
+	Public Function JSONoutput()
+		dim wrap_dicttype, aj_label
+		JSONoutput_level = 1
+		wrap_dicttype = "[]"
+		For Each aj_label In data
+			 If Not aj_IsInt(aj_label) Then wrap_dicttype = "{}"
+		Next
+		JSONoutput = Left(wrap_dicttype, 1) & Chr(13) & Chr(10) & GetDict(data) & Right(wrap_dicttype, 1)
+	End Function
+
+    Public Function PrintJson
+        Response.AddHeader "Content-Type", "text/plain"
+        If IsEmpty(Request.QueryString("callback")) Then
+            Response.Write JSONoutput()
+        Else
+            Response.Write Request.QueryString("callback") & "(" & JSONoutput() & ")"
+        End If
+    End Function
+
+	Private Function GetDict(objDict)
+		dim aj_item, aj_keyvals, aj_label, aj_dicttype
+		For Each aj_item In objDict
+			Select Case TypeName(objDict.Item(aj_item))
+				Case "Dictionary"
+					GetDict = GetDict & Space(JSONoutput_level * 4)
+					
+					aj_dicttype = "[]"
+					For Each aj_label In objDict.Item(aj_item).Keys
+						 If Not aj_IsInt(aj_label) Then aj_dicttype = "{}"
+					Next
+					If aj_IsInt(aj_item) Then
+						GetDict = GetDict & (Left(aj_dicttype,1) & Chr(13) & Chr(10))
+					Else
+						GetDict = GetDict & ("""" & aj_JSONEncode(aj_item) & """" & ": " & Left(aj_dicttype,1) & Chr(13) & Chr(10))
+					End If
+					JSONoutput_level = JSONoutput_level + 1
+					
+					aj_keyvals = objDict.Keys
+					GetDict = GetDict & (GetSubDict(objDict.Item(aj_item)) & Space(JSONoutput_level * 4) & Right(aj_dicttype,1) & aj_InlineIf(aj_item = aj_keyvals(objDict.Count - 1),"" , ",") & Chr(13) & Chr(10))
+				Case Else
+					aj_keyvals =  objDict.Keys
+					GetDict = GetDict & (Space(JSONoutput_level * 4) & aj_InlineIf(aj_IsInt(aj_item), "", """" & aj_JSONEncode(aj_item) & """: ") & WriteValue(objDict.Item(aj_item)) & aj_InlineIf(aj_item = aj_keyvals(objDict.Count - 1),"" , ",") & Chr(13) & Chr(10))
+			End Select
+		Next
+	End Function
+
+	Private Function aj_IsInt(val)
+		aj_IsInt = (TypeName(val) = "Integer" Or TypeName(val) = "Long")
+	End Function
+
+	Private Function GetSubDict(objSubDict)
+		GetSubDict = GetDict(objSubDict)
+		JSONoutput_level= JSONoutput_level -1
+	End Function
+
+	Private Function WriteValue(ByVal val)
+		Select Case TypeName(val)
+			Case "Double", "Integer", "Long": WriteValue = val
+			Case "Null"						: WriteValue = "null"
+			Case "Boolean"					: WriteValue = aj_InlineIf(val, "true", "false")
+			Case Else						: WriteValue = """" & aj_JSONEncode(val) & """"
+		End Select
+	End Function
+
+	Private Function aj_JSONEncode(ByVal val)
+		val = Replace(val, "\", "\\")
+		val = Replace(val, """", "\""")
+		'val = Replace(val, "/", "\/")
+		val = Replace(val, Chr(8), "\b")
+		val = Replace(val, Chr(12), "\f")
+		val = Replace(val, Chr(10), "\n")
+		val = Replace(val, Chr(13), "\r")
+		val = Replace(val, Chr(9), "\t")
+		aj_JSONEncode = Trim(val)
+	End Function
+
+	Private Function aj_JSONDecode(ByVal val)
+		val = Replace(val, "\""", """")
+		val = Replace(val, "\\", "\")
+		val = Replace(val, "\/", "/")
+		val = Replace(val, "\b", Chr(8))
+		val = Replace(val, "\f", Chr(12))
+		val = Replace(val, "\n", Chr(10))
+		val = Replace(val, "\r", Chr(13))
+		val = Replace(val, "\t", Chr(9))
+		aj_JSONDecode = Trim(val)
+	End Function
+
+	Private Function aj_InlineIf(condition, returntrue, returnfalse)
+		If condition Then aj_InlineIf = returntrue Else aj_InlineIf = returnfalse
+	End Function
+
+	Private Function aj_Strip(ByVal val, stripper)
+		If Left(val, 1) = stripper Then val = Mid(val, 2)
+		If Right(val, 1) = stripper Then val = Left(val, Len(val) - 1)
+		aj_Strip = val
+	End Function
+
+	Private Function aj_MultilineTrim(TextData)
+		aj_MultilineTrim = aj_RegExp.Replace(TextData, "$1")
+	End Function
+
+	private function aj_Trim(val)
+		aj_Trim = Trim(val)
+		Do While Left(aj_Trim, 1) = Chr(9) : aj_Trim = Mid(aj_Trim, 2) : Loop
+		Do While Right(aj_Trim, 1) = Chr(9) : aj_Trim = Left(aj_Trim, Len(aj_Trim) - 1) : Loop
+		aj_Trim = Trim(aj_Trim)
+	end function
+End Class
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/MultiformProcessor.class.asp b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/MultiformProcessor.class.asp
new file mode 100644
index 0000000..ec2b4e1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/MultiformProcessor.class.asp
@@ -0,0 +1,138 @@
+<%
+' Power by Techird
+' Processor Usage:
+'   Set p = new MultiformProcessor
+'   Set formValues = p.Process()
+'   filename = formValues.Item("filename")
+'   Set stream = formValues.Item("file1") // the name of the file input
+'   stream.SaveToFile "upload/" & filename
+'   stream.Close
+Class MultiformProcessor
+    Private adTypeBinary
+    Private adTypeText
+    Private adModeReadWrite
+    Private binCtLf
+    Private binCtLf2
+
+
+    private Sub Class_Initialize()
+        adTypeBinary = 1
+        adTypeText = 2
+        adModeReadWrite = 3
+        binCtLf = ChrB(13) & ChrB(10)
+        binCtLf2 = binCtLf & binCtLf
+    End Sub
+
+    Private Function OpenStream( optype )
+        Set stream = Server.CreateObject("ADODB.Stream")
+        stream.Type = optype
+        stream.Mode = adModeReadWrite
+        stream.Open
+        Set OpenStream = stream
+    End Function
+
+    Private Function CopyStreamPart( stream, pBgn, pEnd )
+        Dim iStream, oStream
+        Set iStream = stream
+        Set oStream = OpenStream( adTypeBinary )
+        iStream.Position = pBgn
+        iStream.CopyTo oStream, pEnd - pBgn
+        Set CopyStreamPart = oStream
+    End Function
+
+    Private Function GetString( stream, pBgn, pEnd )
+        Dim iStream, oStream
+        Set iStream = stream
+        Set oStream = OpenStream( adTypeBinary )
+        iStream.Position = pBgn
+        iStream.CopyTo oStream, pEnd - pBgn
+        oStream.Position = 0
+        oStream.Type = adTypeText
+        oStream.Charset = GetCharset
+        GetString = oStream.ReadText
+        oStream.Close
+    End Function
+
+    Private Function GetCharset()
+        If Charset = "" Then
+            GetCharset = "utf-8"
+        Else
+            GetCharset = Charset
+        End If
+    End Function
+
+    'See RFC 2388
+    'http://www.ietf.org/rfc/rfc2388.txt
+    public Function Process()
+        Dim formBytes, bLen, pBgn, pEnd, header, stream
+        Dim varPtn, filePtn, formValues, key, field
+
+        formBytes = Request.BinaryRead( Request.TotalBytes )
+
+        Set stream = OpenStream( adTypeBinary )
+            stream.Write formBytes
+
+        Set varPtn = new RegExp
+            varPtn.Pattern = "(\w+?)=""(.+?)"""
+            varPtn.Global = True
+
+        Set filePtn = new RegExp
+            filePtn.Pattern = "filename="
+
+        Set formValues = Server.CreateObject("Scripting.Dictionary")
+
+        'Find boundary
+        bLen = InStrB( 1, formBytes, binCtLf ) - 1
+        boundary = LeftB( formBytes, bLen )
+
+        'Init begin pointer to byte start
+        pBgn = 1
+
+        Do
+            'Find begin pointer and end pointer for block header
+            pBgn = pBgn + bLen + LenB( binCtLf ) - 1
+            pEnd = InStrB( pBgn, formBytes, binCtLf2 )
+
+            'If next block not found, means all blocks processed
+            If pEnd = 0 Then
+                Exit Do 'Load Finished
+            End If
+
+            'Decode the headerf
+            header = GetString( stream, pBgn, pEnd )
+
+            'Test if the block is a file block
+            isFileBlock = filePtn.Test( header ) 
+
+            'Find begin pointer and end pointer for block content
+            pBgn = pEnd + LenB(binCtLf2) - 1
+            pEnd = InStrB(pBgn, formBytes, boundary) - LenB( binCtLf ) - 1
+
+            'Extract field values from header, which like key = "filed"
+            Set matches = varPtn.Execute( header )
+            For Each match In matches
+                key = match.SubMatches(0)
+                field = match.SubMatches(1)
+                'filename as a field
+                If key = "filename" Then
+                    formValues.Add key, field 
+                'name specified fields
+                ElseIf key = "name" Then
+                    If isFileBlock Then
+                        'Resolve content as stream for fileblock
+                        formValues.Add field, CopyStreamPart(stream, pBgn, pEnd)
+                    Else
+                        'Resolve content as string for non-fileblock
+                        formValues.Add field, GetString(stream, pBgn, pEnd)
+                    End If
+                End If
+            Next
+
+            'Move over the begin pointer to next block
+            pBgn = pEnd + LenB( binCtLf ) + 1
+        Loop
+        stream.Close
+        Set Process = formValues
+    End Function
+End Class    
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/PathFormatter.class.asp b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/PathFormatter.class.asp
new file mode 100644
index 0000000..b0196a0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/PathFormatter.class.asp
@@ -0,0 +1,81 @@
+<%
+
+Class PathFormatter
+    Public Function Format( ByVal pathFormat, ByVal filename )
+        Dim ext, name
+        If IsEmpty( format ) Then
+            format = "{yyyy}{mm}{dd}{hh}{ii}{ss}{rand:6}"
+        End If
+
+        Set invalidPattern = new RegExp
+        invalidPattern.Pattern = "[\\\/\:\*\?\<\>\|""]"
+        invalidPattern.Global = true
+        filename = invalidPattern.Replace( filename, "" )
+
+        ext = GetExt( filename )
+        name = GetNameWithoutExt( filename )
+
+        pathFormat = Replace( pathFormat, "{filename}", name )
+        pathFormat = Replace( pathFormat, "{time}", TimeStamp() )
+        pathFormat = Replace( pathFormat, "{yyyy}", Year(Now) )
+        pathFormat = Replace( pathFormat, "{yy}", Year(Now) Mod 100 )
+        pathFormat = Replace( pathFormat, "{mm}", LeadZero( Month(Now) ) )
+        pathFormat = Replace( pathFormat, "{dd}", LeadZero( Day(Now) ) )
+        pathFormat = Replace( pathFormat, "{hh}", LeadZero( Hour(Now) ) )
+        pathFormat = Replace( pathFormat, "{ii}", LeadZero( Minute(Now) ) )
+        pathFormat = Replace( pathFormat, "{ss}", LeadZero( Second(Now) ) )
+
+        Set randPattern = new RegExp
+        randPattern.Pattern = "{rand(\:?)(\d+)}"
+        Set matches = randPattern.Execute(pathFormat)
+        If matches.Count Then
+            Set match = matches(0)
+            digit = 6
+            If match.SubMatches.Count > 1 Then
+                digit = 0 + match.SubMatches(1)
+            End If
+            min = 1
+            Do While digit > 0
+                min = min * 10
+                digit = digit - 1
+            Loop
+            max = min * 10
+            pathFormat = randPattern.Replace( pathFormat, Rand( min, max ) )
+        End If
+        Format = pathFormat + ext
+    End Function
+    
+    Private Function GetExt( file )
+        GetExt = Right( file, Len(file) - InStrRev(file, ".") + 1 )
+    End Function
+
+    Private Function GetNameWithoutExt( file )
+        GetNameWithoutExt = Left( file, InStrRev(file, ".") - 1 )
+    End Function
+
+    Private Function TimeStamp()
+        TimeStamp = DateDiff("s", "1970-1-1 8:00:00", Now())
+    End Function
+
+    Private Function Rand( min, max )
+        Randomize 
+        Rand = Int( (max - min + 1) * Rnd + min )
+    End Function
+
+    Private Function GetFormatedDate()
+        Dim yyyy, mm, dd
+        yyyy = Year(Date)
+        mm = LeadZero(Month(Date))
+        dd = LeadZero(Day(Date))
+        GetFormatedDate = yyyy & mm & dd
+    End Function
+
+    Private Function LeadZero( number )
+        If number < 10 Then
+            LeadZero = "0" & number
+        Else
+            LeadZero = number
+        End If
+    End Function
+End Class
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/README.md b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/README.md
new file mode 100644
index 0000000..bf3a221
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/README.md
@@ -0,0 +1,115 @@
+# UEditor ASP 支持说明
+
+应广大用户要求,UEditor 团队在原本支持的 PHP、Java 和 .Net 的后台的基础上,推出了 ASP 后台的支持。
+
+## 支持版本 ##
+支持 UEditor 1.2.6+ 的版本
+
+## 支持功能 ##
+支持所有其他后台已支持的功能,包括:
+
+1. 图片上传
+2. 远程图片转存
+3. 图片管理
+4. 涂鸦上传(包括背景)
+5. Word 图片转存
+6. 截图上传
+7. 文件上传
+
+## 部署指南 ##
+Classic ASP 一般在 IIS 上运行。其它 ASP 服务器不介绍部署方式,请自行研究。
+
+### 配置 ###
+
+对于 v1.4.0 之前的版本,需要修改 `ueditor.config.js`。最简单的方法,就是把文件中的 php 都替换成 asp。要修改的配置包括:
+
+```javascript
+{
+     imageUrl:URL+"asp/imageUp.asp"
+    ,imagePath:URL + "asp/"
+    ,scrawlUrl:URL+"asp/scrawlUp.asp"
+    ,scrawlPath:URL+"asp/"
+    ,fileUrl:URL+"asp/fileUp.asp"
+    ,filePath:URL + "asp/"
+    ,catcherUrl:URL +"asp/getRemoteImage.asp"
+    ,catcherPath:URL + "asp/"
+    ,imageManagerUrl:URL + "asp/imageManager.asp"
+    ,imageManagerPath:URL + "asp/"
+    ,snapscreenServerUrl: URL +"asp/imageUp.asp"
+    ,snapscreenPath: URL + "asp/"
+    ,wordImageUrl:URL + "asp/imageUp.asp"
+    ,wordImagePath:URL + "asp/"
+    ,getMovieUrl:URL+"asp/getMovie.asp"
+}
+```
+
+UEditor v1.4.0 后进行了后端的统一配置,后端相关的配置文件是 `config.json`,在具体的后台目录下。需要注意以下两个类型的配置:
+
+
+```javascript
+{
+    "{tpl}UrlPrefix": "/ueditor/asp/",
+    "{tpl}PathFormat": "upload/{tpl}/{yyyy}{mm}{dd}/{time}{rand:6}"
+}
+```
+
+`{tpl}PathFormat` 是资源(图片、涂鸦、文件等)保存的位置以及文件名格式,这个路径在 ASP 中是相对运行目录的。
+
+`{tpl}UrlPrefix` 是资源定位的基本路径,在 ASP 后台中一般设置成 ASP 的目录。
+
+比如,IIS 中运行的 UEditor ASP 的目录为 C:\iis_pub\wwwroot\mysite\ueditor\asp,而网站的访问地址为 http://localhost/mysite/,那么你可以这样修改这两类配置项:
+
+```javascript
+{
+    "{tpl}UrlPrefix": "/mysite/ueditor/asp/",
+    "{tpl}PathFormat": "upload/{tpl}/{yyyy}{mm}{dd}/{time}{rand:6}"
+}
+```
+
+
+### 在 IIS 6.X 中部署
+IIS 的安装在这里不介绍,请自行查阅相关资料。
+
+1. 启用 ASP 拓展
+	* 打开 IIS 管理器
+	* 展开本地计算机
+	* 选中 Web 服务拓展
+	* 允许 Active Server Pages 拓展
+
+2. 配置网站脚本执行权限(如果使用虚拟路径,请跳过本步骤)
+	* 在网站上右击,点属性
+	* 切换到主目录选项卡,勾选*读取*、*写入*两个权限,并且*执行权限*选择*纯脚本*
+	* 点确定
+
+3. 使用虚拟路径
+	* 在网站上右击,点*新建* - *虚拟路径*
+	* 按照向导填写名称和路径
+	* 勾选*读取*、*执行脚本*和*写入*三个权限
+	* 完成虚拟目录的创建
+
+4. 配置脚本执行身份
+	* 在网站或虚拟路径上右击,点属性
+	* 选择*目录安全性*选项卡
+	* 在*身份验证和访问控制*中点击*编辑*
+	* 勾选*启用匿名访问*,点击用户名后面的*浏览*
+	* 输入*administrator*点确定
+	* 输入*administrator*账号的密码
+	* 点击确定,再确认一次密码
+
+5. 设置最大 HTTP 请求大小限制
+	* 找到位于 C:\Windows\System32\Inetsrv 中的 metabase.XML,打开,查找ASPMaxRequestEntityAllowed,修改为需要的值(如10240000 即 10M)
+	> ASP 文件中也有上传文件大小的限制,不过先验证的限制是 IIS 中设置的,所以如果 IIS 中设置最大 256K,那么就算 ASP 中设置了最大 10M,那么超过 256K 的文件也无法上传,而且 ASP 没法给出错误信息。
+
+### 在 IIS 7.X 中部署
+IIS7 默认不安装 ASP,需要手动添加进去。添加方法请读者自行查阅。
+
+1. 配置脚本执行身份
+	* 选中网站或者应用程序
+	* 双击 IIS 中的*身份验证*
+	* 双击匿名身份验证
+	* 填写*administrator*的用户名和密码,确定
+
+2. 设置最大 HTTP 请求大小限制
+    * 打开 IIS 控制台
+    * 双击 ASP,展开*限制属性*,修改*醉倒请求实体主体限制*为需要的值(如10240000 即 10M)
+    > ASP 文件中也有上传文件大小的限制,不过先验证的限制是 IIS 中设置的,所以如果 IIS 中设置最大 256K,那么就算 ASP 中设置了最大 10M,那么超过 256K 的文件也无法上传,而且 ASP 没法给出错误信息。
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/Uploader.Class.asp b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/Uploader.Class.asp
new file mode 100644
index 0000000..42d773a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/Uploader.Class.asp
@@ -0,0 +1,219 @@
+<!--#include file="PathFormatter.class.asp"-->
+<!--#include file="MultiformProcessor.class.asp"-->
+
+<%
+' ASP 文件上传类
+' Author: techird
+' Email: techird@qq.com
+
+'配置
+'MAX_SIZE 在这里设定了之后如果出现大上传失败,请执行以下步骤
+'IIS 6 
+    '找到位于 C:\Windows\System32\Inetsrv 中的 metabase.XML 打开,找到ASPMaxRequestEntityAllowed 把他修改为需要的值(如10240000即10M)
+'IIS 7
+    '打开IIS控制台,选择 ASP,在限制属性里有一个“最大请求实体主题限制”,设置需要的值
+
+CURRENT_ENCODING = "gb2312"
+
+Class Uploader
+
+    '上传配置
+    Private cfgMaxSize
+    Private cfgAllowType
+    Private cfgPathFormat
+    Private cfgFileField
+
+    '上传返回信息
+    Private stateString
+    Private rsOriginalFileName
+    Private rsFilePath
+
+    Private rsFileName
+    Private rsFileSize
+    Private rsState
+    Private rsFormValues
+
+    Private Sub Class_Initialize
+        Set stateString = Server.CreateObject("Scripting.Dictionary")
+        stateString.Add "SIZE_LIMIT_EXCCEED", "File size exceeded!"
+        stateString.Add "TYPE_NOW_ALLOW", "File type not allowed!"
+    End Sub
+
+    Public Property Let MaxSize(ByVal size)
+        cfgMaxSize = size
+    End Property
+
+    Public Property Let AllowType(ByVal types)
+        Set cfgAllowType = types
+    End Property
+
+    Public Property Let PathFormat(ByVal format)
+        cfgPathFormat = format
+    End Property
+
+    Public Property Let FileField(ByVal field)
+        cfgFileField = field
+    End Property
+
+    Public Property Get OriginalFileName
+        OriginalFileName = rsOriginalFileName
+    End Property
+
+    Public Property Get FileName
+        FileName = rsFileName
+    End Property 
+
+    Public Property Get FilePath
+        FilePath = rsFilePath
+    End Property
+
+    Public Property Get FileSize
+        FileSize = rsFileSize
+    End Property
+
+    Public Property Get State
+        State = rsState
+    End Property
+
+    Public Property Get FormValues
+        Set FormValues = rsFormValues
+    End Property
+
+    Public Function UploadForm()
+        ProcessForm()
+        SaveFile()
+    End Function
+
+    Public Function ProcessForm()        
+        Set processor = new MultiformProcessor
+        Set rsFormValues = processor.Process()
+    End Function
+
+    Public Function SaveFile()
+        Dim stream, filename
+        Set stream = rsFormValues.Item( cfgFileField )
+        filename = rsFormValues.Item( "filename" )
+        DoUpload stream, filename
+    End Function
+
+    Public Function UploadBase64( filename ) 
+        Dim stream, content
+        content = Request.Item ( cfgFileField )
+        Set stream = Base64Decode( content )
+
+        DoUpload stream, filename
+    End Function
+
+    Public Function UploadRemote( url )
+        Dim stream, filename
+        filename = Right( url, Len(url) - InStrRev(url, "/") )
+
+        Set stream = CrawlImage( url )
+
+        If Not IsNull(stream) Then
+            DoUpload stream, filename
+        Else
+            rsState = "Failed"
+        End If
+        Set stream = Nothing
+    End Function
+
+    Private Function DoUpload( stream, filename )
+
+        rsFileSize = stream.Size
+        If rsFileSize > cfgMaxSize Then
+            rsState = stateString.Item( "SIZE_LIMIT_EXCCEED" )
+            Exit Function
+        End If
+
+        rsOriginalFileName = filename
+        fileType = GetExt(filename)
+        If CheckExt(fileType) = False Then
+            rsState = stateString.Item( "TYPE_NOW_ALLOW" )
+            Exit Function
+        End If
+        
+        Set formatter = new PathFormatter
+        rsFilePath = formatter.format( cfgPathFormat, filename )
+        
+        savePath = Server.MapPath(rsFilePath)
+        CheckOrCreatePath(  GetDirectoryName(savePath) )
+
+        stream.SaveToFile savePath
+        stream.Close
+        rsState = "SUCCESS"
+    End Function
+
+    Private Function GetDirectoryName(path)
+        GetDirectoryName = Left( path, InStrRev(path, "\") )
+    End Function
+
+    Private Function Base64Decode( content )
+        dim xml, stream, node
+        Set xml = Server.CreateObject("MSXML2.DOMDocument")
+        Set stream = Server.CreateObject("ADODB.Stream")
+        Set node = xml.CreateElement("tmpNode")
+        node.dataType = "bin.base64"
+        node.Text = content
+        stream.Charset = CURRENT_ENCODING
+        stream.Type = 1
+        stream.Open()
+        stream.Write( node.nodeTypedValue )
+        Set Base64Decode = stream
+        Set node = Nothing
+        Set stream = Nothing
+        Set xml = Nothing
+    End Function
+
+    Private Function CrawlImage( url )
+        Dim http, stream
+        Set http = Server.CreateObject("Microsoft.XMLHTTP")
+        http.Open "GET", url, false
+        http.Send
+        If http.Status = 200 Then
+            Set stream = Server.CreateObject("ADODB.Stream")
+            stream.Type = 1
+            stream.Open()
+            stream.Write http.ResponseBody
+            Set CrawlImage = stream
+        Else
+            Set CrawlImage = null
+        End If
+        Set http = Nothing
+    End Function
+
+    Private Function CheckExt( fileType )
+        If IsEmpty (cfgAllowType) Then
+            CheckExt = true
+             Exit Function
+        End If
+        For Each ext In cfgAllowType
+            If UCase(fileType) = UCase(cfgAllowType.Item(ext)) Then 
+                CheckExt = true
+                Exit Function
+            End If
+        Next
+        CheckExt = false
+    End Function
+    
+    Private Function GetExt( file )
+        GetExt = Right( file, Len(file) - InStrRev(file, ".") + 1 )
+    End Function
+
+    Private Function CheckOrCreatePath( ByVal path )
+        Set fs = Server.CreateObject("Scripting.FileSystemObject")
+        Dim parts
+        parts = Split( path, "\" )
+        path = ""
+        For Each part in parts
+            path = path + part + "\"
+            If fs.FolderExists( path ) = False Then
+                fs.CreateFolder( path )
+            End If
+        Next
+    End Function
+End Class
+
+
+
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_config.asp b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_config.asp
new file mode 100644
index 0000000..d3726a4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_config.asp
@@ -0,0 +1,9 @@
+<!--#include file="ASPJson.class.asp"-->
+<!--#include file="config_loader.asp"-->
+
+<%
+	Set json = new ASPJson
+    Set json.data = config
+
+    json.PrintJson()
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_crawler.asp b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_crawler.asp
new file mode 100644
index 0000000..1235916
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_crawler.asp
@@ -0,0 +1,32 @@
+<!--#include file="ASPJson.class.asp"-->
+<!--#include file="config_loader.asp"-->
+<!--#include file="Uploader.class.asp"-->
+<%	
+
+    Set up = new Uploader    
+    up.MaxSize = config.Item("catcherMaxSize")
+    up.AllowType = config.Item("catcherAllowFiles")
+    up.PathFormat = config.Item("catcherPathFormat")
+
+    urls = Split(Request.Item("source[]"), ", ")
+    Set list = new ASPJson.Collection
+
+    For i = 0 To UBound(urls)
+    	up.UploadRemote( urls(i) )
+        Dim instance
+        Set instance = new ASPJson.Collection
+        instance.Add "state", up.State
+        instance.Add "url", up.FilePath
+        instance.Add "source", urls(i)
+        list.Add i, instance
+    Next
+
+    Set json = new ASPJson
+
+    With json.data
+        .Add "state", "SUCCESS"
+        .Add "list", list
+    End With
+
+    json.PrintJson()
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_list.asp b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_list.asp
new file mode 100644
index 0000000..74bf809
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_list.asp
@@ -0,0 +1,81 @@
+<!--#include file="ASPJson.class.asp"-->
+<!--#include file="config_loader.asp"-->
+
+<%
+    listTemplateName = Session.Value("ueditor_asp_listTemplateName")
+
+    start = CInt(Request.Item("start"))
+    size = CInt(Request.Item("size"))
+    total = 0
+
+    If size < 0 Then
+        size = CInt(config.Item( listTemplateName + "ManagerListSize" ))
+    End If
+
+    path = config.Item( listTemplateName + "ManagerListPath" )
+    Set extensions = config.Item( listTemplateName + "ManagerAllowFiles")
+
+    Set list = new ASPJson.Collection
+
+    Set fso = Server.CreateObject("Scripting.FileSystemObject")
+    If fso.FolderExists(Server.MapPath(path)) = False Then
+        state = "找不到目录:" + path
+    Else
+        Set all = ListAllFilesInFolder( fso, path )
+        total = all.Count
+        index = 0
+        For Each file in all
+            If index >= start And index < start + size Then
+                Dim fileObject
+                Set fileObject = new ASPJson.Collection
+                fileObject.Add "url", file
+                list.Add index - start, fileObject
+            End If
+            index = index + 1
+        Next
+        state = "SUCCESS"
+    End If
+    
+    Set json = new ASPJson
+    With json.data
+        .Add "state", state
+        .Add "list", list
+        .Add "start", start
+        .Add "size", size
+        .Add "total", total
+    End With
+
+    json.PrintJson()
+
+    Function ListAllFilesInFolder( fso, path )
+        Dim list
+        Set list = Server.CreateObject("Scripting.Dictionary")
+        Set folder = fso.GetFolder(Server.MapPath(path))
+        For Each file In folder.Files
+            If CheckExt(file.Name) Then
+                list.Add path & "/" & file.Name, true
+            End If
+        Next
+        For Each subFolder In folder.SubFolders
+            Set subList = ListAllFilesInFolder( fso, path & "/" & subFolder.Name )
+            For Each subListFile In subList
+                list.Add subListFile, true
+            Next
+        Next
+        Set ListAllFilesInFolder = list
+    End Function
+
+    Function CheckExt( filename )
+        For Each ext In extensions
+            If UCase(GetExt(filename)) = UCase(extensions.Item(ext)) Then 
+                CheckExt = true
+                Exit Function
+            End If
+        Next
+        CheckExt = false
+    End Function
+    
+    Function GetExt( file )
+        GetExt = Right( file, Len(file) - InStrRev(file, ".") + 1 )
+    End Function
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_upload.asp b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_upload.asp
new file mode 100644
index 0000000..19300c1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/action_upload.asp
@@ -0,0 +1,29 @@
+<!--#include file="ASPJson.class.asp"-->
+<!--#include file="config_loader.asp"-->
+<!--#include file="Uploader.class.asp"-->
+<%
+    uploadTemplateName = Session.Value("ueditor_asp_uploadTemplateName")
+
+    Set up = new Uploader
+    up.MaxSize = config.Item( uploadTemplateName & "MaxSize" )
+    up.FileField = config.Item( uploadTemplateName & "FieldName" )
+    up.PathFormat = config.Item( uploadTemplateName & "PathFormat" )
+
+    If Not IsEmpty( Session.Value("base64Upload") ) Then
+        up.UploadBase64( Session.Value("base64Upload") )
+    Else
+        up.AllowType = config.Item( uploadTemplateName & "AllowFiles" )
+        up.UploadForm()
+    End If
+
+    Set json = new ASPJson
+
+    With json.data
+        .Add "url", up.FilePath
+        .Add "original", up.OriginalFileName
+        .Add "state", up.State
+        .Add "title", up.OriginalFileName
+    End With
+    
+    json.PrintJson()
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/config.json b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/config.json
new file mode 100644
index 0000000..9a20cc7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/config.json
@@ -0,0 +1,94 @@
+/* 前后端通信相关的配置,注释只允许使用多行方式 */
+{
+    /* 上传图片配置项 */
+    "imageActionName": "uploadimage", /* 执行上传图片的action名称 */
+    "imageFieldName": "upfile", /* 提交的图片表单名称 */
+    "imageMaxSize": 2048000, /* 上传大小限制,单位B */
+    "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */
+    "imageCompressEnable": true, /* 是否压缩图片,默认是true */
+    "imageCompressBorder": 1600, /* 图片压缩最长边限制 */
+    "imageInsertAlign": "none", /* 插入的图片浮动方式 */
+    "imageUrlPrefix": "/ueditor/asp/", /* 图片访问路径前缀 */
+    "imagePathFormat": "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": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */
+    "scrawlUrlPrefix": "/ueditor/asp/", /* 图片访问路径前缀 */
+    "scrawlInsertAlign": "none",
+
+    /* 截图工具上传 */
+    "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */
+    "snapscreenPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "snapscreenUrlPrefix": "/ueditor/asp/", /* 图片访问路径前缀 */
+    "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */
+
+    /* 抓取远程图片配置 */
+    "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"],
+    "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */
+    "catcherFieldName": "source", /* 提交的图片列表表单名称 */
+    "catcherPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "catcherUrlPrefix": "/ueditor/asp/", /* 图片访问路径前缀 */
+    "catcherMaxSize": 2048000, /* 上传大小限制,单位B */
+    "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */
+
+    /* 上传视频配置 */
+    "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */
+    "videoFieldName": "upfile", /* 提交的视频表单名称 */
+    "videoPathFormat": "upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "videoUrlPrefix": "/ueditor/asp/", /* 视频访问路径前缀 */
+    "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": "upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "fileUrlPrefix": "/ueditor/asp/", /* 文件访问路径前缀 */
+    "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"
+    ], /* 上传文件格式显示 */
+
+    /* 列出指定目录下的图片 */
+    "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */
+    "imageManagerListPath": "upload/image", /* 指定要列出图片的目录 */
+    "imageManagerListSize": 20, /* 每次列出文件数量 */
+    "imageManagerUrlPrefix": "/ueditor/asp/", /* 图片访问路径前缀 */
+    "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */
+    "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */
+
+    /* 列出指定目录下的文件 */
+    "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */
+    "fileManagerListPath": "upload/file", /* 指定要列出文件的目录 */
+    "fileManagerUrlPrefix": "/ueditor/asp/", /* 文件访问路径前缀 */
+    "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"
+    ] /* 列出的文件类型 */
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/config_loader.asp b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/config_loader.asp
new file mode 100644
index 0000000..085f79c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/config_loader.asp
@@ -0,0 +1,21 @@
+<%
+	Set json = new ASPJson
+    Set fso = Server.CreateObject("Scripting.FileSystemObject")
+
+    Set stream = Server.CreateObject("ADODB.Stream")
+
+    stream.Open()
+    stream.Charset = "UTF-8"
+    stream.LoadFromFile Server.MapPath( "config.json" )
+
+    content = stream.ReadText()
+
+    Set commentPattern = new RegExp
+    commentPattern.Multiline = true
+    commentPattern.Pattern = "/\*[\s\S]+?\*/"
+    commentPattern.Global = true
+    content = commentPattern.Replace(content, "")
+    json.loadJSON( content )
+
+    Set config = json.data
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/controller.asp b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/controller.asp
new file mode 100644
index 0000000..5dd2ff7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/asp/controller.asp
@@ -0,0 +1,44 @@
+<%@ LANGUAGE="VBSCRIPT" CODEPAGE="65001" %>
+<%
+    action = Request.Item("action")
+
+    Session.Contents.Remove("ueditor_asp_uploadTemplateName")
+    Session.Contents.Remove("ueditor_asp_base64Upload")
+    Session.Contents.Remove("ueditor_asp_listTemplateName")
+
+
+    Select Case action
+
+        Case "config"
+            Server.Execute("action_config.asp")
+
+        Case "uploadimage"
+            Session.Value("ueditor_asp_uploadTemplateName") = "image"
+            Server.Execute("action_upload.asp")
+
+        Case "uploadscrawl"
+            Session.Value("ueditor_asp_uploadTemplateName") = "scrawl"
+            Session.Value("base64Upload") = "scrawl.png"
+            Server.Execute("action_upload.asp")
+
+        Case "uploadvideo"
+            Session.Value("ueditor_asp_uploadTemplateName") = "video"
+            Server.Execute("action_upload.asp")
+
+        Case "uploadfile"
+            Session.Value("ueditor_asp_uploadTemplateName") = "file"
+            Server.Execute("action_upload.asp")
+
+        Case "listimage"
+            Session.Value("ueditor_asp_listTemplateName") = "image"
+            Server.Execute("action_list.asp")
+
+        Case "listfile"
+            Session.Value("ueditor_asp_listTemplateName") = "file"
+            Server.Execute("action_list.asp")
+
+        Case "catchimage"
+            Server.Execute("action_crawler.asp")
+    End Select
+
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/anchor/anchor.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/anchor/anchor.html
new file mode 100644
index 0000000..f277847
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/anchor/anchor.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+    "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+        <title></title>
+        <style type="text/css">
+            *{color: #838383;margin: 0;padding: 0}
+            html,body {font-size: 12px;overflow: hidden; }
+            .content{padding:5px 0 0 15px;}
+            input{width:210px;height:21px;line-height:21px;margin-left: 4px;}
+        </style>
+    </head>
+    <body>
+        <div class="content">
+            <span><var id="lang_input_anchorName"></var></span><input id="anchorName"  value="" />
+        </div>
+        <script type="text/javascript" src="../internal.js"></script>
+        <script type="text/javascript">
+            var anchorInput = $G('anchorName'),
+                node = editor.selection.getRange().getClosedNode();
+            if(node && node.tagName == 'IMG' && (node = node.getAttribute('anchorname'))){
+                anchorInput.value = node;
+            }
+            anchorInput.onkeydown = function(evt){
+                evt = evt || window.event;
+                if(evt.keyCode == 13){
+                    editor.execCommand('anchor', anchorInput.value);
+                    dialog.close();
+                    domUtils.preventDefault(evt)
+                }
+            };
+            dialog.onok = function (){
+                editor.execCommand('anchor', anchorInput.value);
+                dialog.close();
+            };
+            $focus(anchorInput);
+        </script>
+    </body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.css
new file mode 100644
index 0000000..548b428
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.css
@@ -0,0 +1,681 @@
+@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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.html
new file mode 100644
index 0000000..2ae9282
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>ueditor图片对话框</title>
+    <script type="text/javascript" src="../internal.js"></script>
+
+    <!-- jquery -->
+    <script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
+
+    <!-- webuploader -->
+    <script src="../../third-party/webuploader/webuploader.min.js"></script>
+    <link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
+
+    <!-- attachment dialog -->
+    <link rel="stylesheet" href="attachment.css" type="text/css" />
+</head>
+<body>
+
+    <div class="wrapper">
+        <div id="tabhead" class="tabhead">
+            <span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
+            <span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
+        </div>
+        <div id="tabbody" class="tabbody">
+            <!-- 上传图片 -->
+            <div id="upload" class="panel focus">
+                <div id="queueList" class="queueList">
+                    <div class="statusBar element-invisible">
+                        <div class="progress">
+                            <span class="text">0%</span>
+                            <span class="percentage"></span>
+                        </div><div class="info"></div>
+                        <div class="btns">
+                            <div id="filePickerBtn"></div>
+                            <div class="uploadBtn"><var id="lang_start_upload"></var></div>
+                        </div>
+                    </div>
+                    <div id="dndArea" class="placeholder">
+                        <div class="filePickerContainer">
+                            <div id="filePickerReady"></div>
+                        </div>
+                    </div>
+                    <ul class="filelist element-invisible">
+                        <li id="filePickerBlock" class="filePickerBlock"></li>
+                    </ul>
+                </div>
+            </div>
+
+            <!-- 在线图片 -->
+            <div id="online" class="panel">
+                <div id="fileList"><var id="lang_imgLoading"></var></div>
+            </div>
+
+        </div>
+    </div>
+    <script type="text/javascript" src="attachment.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.js
new file mode 100644
index 0000000..ce3be63
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/attachment.js
@@ -0,0 +1,754 @@
+/**
+ * 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('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
+                        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($('<div>').html(lang.errorNotSupport)).hide();
+                return;
+            } else if (!editor.getOpt('fileActionName')) {
+                $('#filePickerReady').after($('<div>').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 = $('<li id="' + file.id + '">' +
+                        '<p class="title">' + file.name + '</p>' +
+                        '<p class="imgWrap"></p>' +
+                        '<p class="progress"><span></span></p>' +
+                        '</li>'),
+
+                    $btns = $('<div class="file-panel">' +
+                        '<span class="cancel">' + lang.uploadDelete + '</span>' +
+                        '<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
+                        '<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
+                    $prgress = $li.find('p.progress span'),
+                    $wrap = $li.find('p.imgWrap'),
+                    $info = $('<p class="error"></p>').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('<i class="file-preview file-type-' + file.ext.toLowerCase() + '"></i>' +
+                        '<span class="file-title" title="' + file.name + '">' + file.name + '</span>');
+                    } 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 = $('<img src="' + src + '">');
+                                    $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('<span class="success"></span>');
+                    } 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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_chm.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_chm.gif
new file mode 100644
index 0000000..9ca4fb6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_chm.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_default.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_default.png
new file mode 100644
index 0000000..50ac1cb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_default.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_doc.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_doc.gif
new file mode 100644
index 0000000..206fede
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_doc.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_exe.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_exe.gif
new file mode 100644
index 0000000..2e3b7a2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_exe.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_jpg.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_jpg.gif
new file mode 100644
index 0000000..5d5dec0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_jpg.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_mp3.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_mp3.gif
new file mode 100644
index 0000000..b351a1f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_mp3.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_mv.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_mv.gif
new file mode 100644
index 0000000..26019b0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_mv.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_pdf.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_pdf.gif
new file mode 100644
index 0000000..bbb65c8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_pdf.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_ppt.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_ppt.gif
new file mode 100644
index 0000000..ccb26fb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_ppt.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_psd.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_psd.gif
new file mode 100644
index 0000000..2e8743a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_psd.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_rar.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_rar.gif
new file mode 100644
index 0000000..5359e46
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_rar.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_txt.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_txt.gif
new file mode 100644
index 0000000..e7b8dd2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_txt.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_xls.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_xls.gif
new file mode 100644
index 0000000..e86c1c6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/fileTypeImages/icon_xls.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/alignicon.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/alignicon.gif
new file mode 100644
index 0000000..005a5ac
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/alignicon.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/alignicon.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/alignicon.png
new file mode 100644
index 0000000..4b6c444
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/alignicon.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/bg.png
new file mode 100644
index 0000000..580be0a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/file-icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/file-icons.gif
new file mode 100644
index 0000000..d8c02c2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/file-icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/file-icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/file-icons.png
new file mode 100644
index 0000000..3ff82c8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/file-icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/icons.gif
new file mode 100644
index 0000000..78459de
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/icons.png
new file mode 100644
index 0000000..12e4700
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/image.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/image.png
new file mode 100644
index 0000000..19699f6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/image.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/progress.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/progress.png
new file mode 100644
index 0000000..717c486
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/progress.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/success.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/success.gif
new file mode 100644
index 0000000..8d4f311
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/success.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/success.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/success.png
new file mode 100644
index 0000000..94f968d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/attachment/images/success.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.css
new file mode 100644
index 0000000..5c41fe9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.css
@@ -0,0 +1,94 @@
+.wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative}
+.tabbody{height:225px;}
+.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;}
+.tabbody .focus { display: block;}
+
+body{font-size: 12px;color: #888;overflow: hidden;}
+input,label{vertical-align:middle}
+.clear{clear: both;}
+.pl{padding-left: 18px;padding-left: 23px\9;}
+
+#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;}
+#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;}
+#imageList img {cursor: pointer;border: 2px solid white;}
+
+.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;}
+.content div{margin: 10px 0 10px 5px;}
+.content .iptradio{margin: 0px 5px 5px 0px;}
+.txt{width:280px;}
+
+.wrapcolor{height: 19px;}
+div.color{float: left;margin: 0;}
+#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;}
+div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;}
+#custom input{height: 15px;min-height: 15px;width:20px;}
+#repeatType{width:100px;}
+
+
+/* 图片管理样式 */
+#imgManager {
+    width: 100%;
+    height: 225px;
+}
+#imgManager #imageList{
+    width: 100%;
+    overflow-x: hidden;
+    overflow-y: auto;
+}
+#imgManager ul {
+    display: block;
+    list-style: none;
+    margin: 0;
+    padding: 0;
+}
+#imgManager li {
+    float: left;
+    display: block;
+    list-style: none;
+    padding: 0;
+    width: 113px;
+    height: 113px;
+    margin: 9px 0 0 19px;
+    background-color: #eee;
+    overflow: hidden;
+    cursor: pointer;
+    position: relative;
+}
+#imgManager li.clearFloat {
+    float: none;
+    clear: both;
+    display: block;
+    width:0;
+    height:0;
+    margin: 0;
+    padding: 0;
+}
+#imgManager li img {
+    cursor: pointer;
+}
+#imgManager li .icon {
+    cursor: pointer;
+    width: 113px;
+    height: 113px;
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 2;
+    border: 0;
+    background-repeat: no-repeat;
+}
+#imgManager li .icon:hover {
+    width: 107px;
+    height: 107px;
+    border: 3px solid #1094fa;
+}
+#imgManager li.selected .icon {
+    background-image: url(images/success.png);
+    background-position: 75px 75px;
+}
+#imgManager li.selected .icon:hover {
+    width: 107px;
+    height: 107px;
+    border: 3px solid #1094fa;
+    background-position: 72px 72px;
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.html
new file mode 100644
index 0000000..3cc2ac1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="background.css">
+</head>
+<body>
+    <div id="bg_container" class="wrapper">
+        <div id="tabHeads" class="tabhead">
+            <span class="focus" data-content-id="normal"><var id="lang_background_normal"></var></span>
+            <span class="" data-content-id="imgManager"><var id="lang_background_local"></var></span>
+        </div>
+        <div id="tabBodys" class="tabbody">
+            <div id="normal" class="panel focus">
+                <fieldset class="bgarea">
+                    <legend><var id="lang_background_set"></var></legend>
+                    <div class="content">
+                        <div>
+                            <label><input id="nocolorRadio" class="iptradio" type="radio" name="t" value="none" checked="checked"><var id="lang_background_none"></var></label>
+                            <label><input id="coloredRadio" class="iptradio" type="radio" name="t" value="color"><var id="lang_background_colored"></var></label>
+                        </div>
+                        <div class="wrapcolor pl">
+                            <div class="color">
+                                <var id="lang_background_color"></var>:
+                            </div>
+                            <div id="colorPicker"></div>
+                            <div class="clear"></div>
+                        </div>
+                        <div class="wrapcolor pl">
+                            <label><var id="lang_background_netimg"></var>:</label><input class="txt" type="text" id="url">
+                        </div>
+                        <div id="alignment" class="alignment">
+                            <var id="lang_background_align"></var>:<select id="repeatType">
+                                <option value="center"></option>
+                                <option value="repeat-x"></option>
+                                <option value="repeat-y"></option>
+                                <option value="repeat"></option>
+                                <option value="self"></option>
+                            </select>
+                        </div>
+                        <div id="custom" >
+                            <var id="lang_background_position"></var>:x:<input type="text" size="1" id="x" maxlength="4" value="0">px&nbsp;&nbsp;y:<input type="text" size="1" id="y" maxlength="4" value="0">px
+                        </div>
+                    </div>
+                </fieldset>
+
+            </div>
+            <div id="imgManager" class="panel">
+                <div id="imageList" style=""></div>
+            </div>
+        </div>
+    </div>
+    <script type="text/javascript" src="background.js"></script>
+</body>
+</html>
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.js
new file mode 100644
index 0000000..9a4a131
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/background.js
@@ -0,0 +1,376 @@
+(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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/images/bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/images/bg.png
new file mode 100644
index 0000000..580be0a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/images/bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/images/success.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/images/success.png
new file mode 100644
index 0000000..94f968d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/background/images/success.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/chart.config.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/chart.config.js
new file mode 100644
index 0000000..678b00d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/chart.config.js
@@ -0,0 +1,65 @@
+/*
+ * 图表配置文件
+ * */
+
+
+//不同类型的配置
+var typeConfig = [
+    {
+        chart: {
+            type: 'line'
+        },
+        plotOptions: {
+            line: {
+                dataLabels: {
+                    enabled: false
+                },
+                enableMouseTracking: true
+            }
+        }
+    }, {
+        chart: {
+            type: 'line'
+        },
+        plotOptions: {
+            line: {
+                dataLabels: {
+                    enabled: true
+                },
+                enableMouseTracking: false
+            }
+        }
+    }, {
+        chart: {
+            type: 'area'
+        }
+    }, {
+        chart: {
+            type: 'bar'
+        }
+    }, {
+        chart: {
+            type: 'column'
+        }
+    }, {
+        chart: {
+            plotBackgroundColor: null,
+            plotBorderWidth: null,
+            plotShadow: false
+        },
+        plotOptions: {
+            pie: {
+                allowPointSelect: true,
+                cursor: 'pointer',
+                dataLabels: {
+                    enabled: true,
+                    color: '#000000',
+                    connectorColor: '#000000',
+                    formatter: function() {
+                        return '<b>'+ this.point.name +'</b>: '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %';
+                    }
+                }
+            }
+        }
+    }
+];
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/charts.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/charts.css
new file mode 100644
index 0000000..ac3c764
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/charts.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/charts.html
new file mode 100644
index 0000000..70e2314
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/charts.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>chart</title>
+        <meta chartset="utf-8">
+        <link rel="stylesheet" type="text/css" href="charts.css">
+        <script type="text/javascript" src="../internal.js"></script>
+    </head>
+    <body>
+        <div class="main">
+            <div class="table-view">
+                <h3><var id="lang_data_source"></var></h3>
+                <div id="tableContainer" class="table-container"></div>
+                <h3><var id="lang_chart_format"></var></h3>
+                <form name="data-form">
+                    <div class="charts-format">
+                        <fieldset>
+                            <legend><var id="lang_data_align"></var></legend>
+                            <div class="format-item-container">
+                                <label>
+                                    <input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="1" checked="checked">
+                                    <var id="lang_chart_align_same"></var>
+                                </label>
+                                <label>
+                                    <input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="-1">
+                                    <var id="lang_chart_align_reverse"></var>
+                                </label>
+                                <br>
+                            </div>
+                        </fieldset>
+                        <fieldset>
+                            <legend><var id="lang_chart_title"></var></legend>
+                            <div class="format-item-container">
+                                <label>
+                                    <var id="lang_chart_main_title"></var><input type="text" name="title" class="data-item">
+                                </label>
+                                <label>
+                                    <var id="lang_chart_sub_title"></var><input type="text" name="sub-title" class="data-item not-pie-item">
+                                </label>
+                                <label>
+                                    <var id="lang_chart_x_title"></var><input type="text" name="x-title" class="data-item not-pie-item">
+                                </label>
+                                <label>
+                                    <var id="lang_chart_y_title"></var><input type="text" name="y-title" class="data-item not-pie-item">
+                                </label>
+                            </div>
+                        </fieldset>
+                        <fieldset>
+                            <legend><var id="lang_chart_tip"></var></legend>
+                            <div class="format-item-container">
+                                <label>
+                                    <var id="lang_cahrt_tip_prefix"></var>
+                                    <input type="text" id="tipInput" name="tip" class="data-item" disabled="disabled">
+                                </label>
+                                <p><var id="lang_cahrt_tip_description"></var></p>
+                            </div>
+                        </fieldset>
+                        <fieldset>
+                            <legend><var id="lang_chart_data_unit"></var></legend>
+                            <div class="format-item-container">
+                                <label><var id="lang_chart_data_unit_title"></var><input type="text" name="unit" class="data-item"></label>
+                                <p><var id="lang_chart_data_unit_description"></var></p>
+                            </div>
+                        </fieldset>
+                    </div>
+                </form>
+            </div>
+            <div class="charts-view">
+                <div id="chartsContainer" class="charts-container"></div>
+                <div id="chartsType" class="charts-type">
+                    <h3><var id="lang_chart_type"></var></h3>
+                    <div class="scroll-view">
+                        <div class="scroll-container">
+                            <div id="scrollBed" class="scroll-bed"></div>
+                        </div>
+                        <div id="buttonContainer" class="button-container">
+                            <a href="#" data-title="prev"><var id="lang_prev_btn"></var></a>
+                            <a href="#" data-title="next"><var id="lang_next_btn"></var></a>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <script src="../../third-party/jquery-1.10.2.min.js"></script>
+        <script src="../../third-party/highcharts/highcharts.js"></script>
+        <script src="chart.config.js"></script>
+        <script src="charts.js"></script>
+    </body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/charts.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/charts.js
new file mode 100644
index 0000000..37344fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/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 = "<div class='edui-charts-not-data'>未找到数据</div>";
+        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( '<div class="view-box" data-chart-type="'+ i +'"><img width="300" src="images/charts'+ i +'.png"></div>' );
+
+    }
+
+    $( "#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( '<th>'+ value +'</th>' );
+            } else {
+                tableHtml[ i ].push( '<td><input type="text" class="data-item" value="'+ value +'"></td>' );
+            }
+
+            tableData[ i ][ j ] = value;
+
+        }
+
+        tableHtml[ i ] = tableHtml[ i ].join( "" );
+
+    }
+
+    //draw 表格
+    $( "#tableContainer" ).html( '<table id="showTable" border="1"><tbody><tr>'+ tableHtml.join( "</tr><tr>" ) +'</tr></tbody></table>' );
+
+}
+
+/*
+ * 根据表格已有的图表属性初始化当前图表属性
+ */
+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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts0.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts0.png
new file mode 100644
index 0000000..9485e5e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts0.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts1.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts1.png
new file mode 100644
index 0000000..b5a0039
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts1.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts2.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts2.png
new file mode 100644
index 0000000..7c91a39
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts2.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts3.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts3.png
new file mode 100644
index 0000000..a6bc29b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts3.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts4.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts4.png
new file mode 100644
index 0000000..742006a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts4.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts5.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts5.png
new file mode 100644
index 0000000..c49a296
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/charts/images/charts5.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/emotion.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/emotion.css
new file mode 100644
index 0000000..f801105
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/emotion.css
@@ -0,0 +1,43 @@
+.jd img{
+    background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+.pp img{
+    background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:25px;height:25px;display:block;
+}
+.ldw img{
+    background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+.tsj img{
+    background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+.cat img{
+    background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+.bb img{
+    background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+.youa img{
+    background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+
+.smileytable td {height: 37px;}
+#tabPanel{margin-left:5px;overflow: hidden;}
+#tabContent {float:left;background:#FFFFFF;}
+#tabContent div{display: none;width:480px;overflow:hidden;}
+#tabIconReview.show{left:17px;display:block;}
+.menuFocus{background:#ACCD3C;}
+.menuDefault{background:#FFFFFF;}
+#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;}
+img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;}
+
+.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;}
+.tabbody table{width: 100%;}
+.tabbody td{border:1px solid #BAC498;}
+.tabbody td span{display: block;zoom:1;padding:0 4px;}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/emotion.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/emotion.html
new file mode 100644
index 0000000..fca0850
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/emotion.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="robots" content="noindex, nofollow"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="emotion.css">
+</head>
+<body>
+<div id="tabPanel" class="wrapper">
+    <div id="tabHeads" class="tabhead">
+        <span><var id="lang_input_choice"></var></span>
+        <span><var id="lang_input_Tuzki"></var></span>
+        <span><var id="lang_input_lvdouwa"></var></span>
+        <span><var id="lang_input_BOBO"></var></span>
+        <span><var id="lang_input_babyCat"></var></span>
+        <span><var id="lang_input_bubble"></var></span>
+        <span><var id="lang_input_youa"></var></span>
+    </div>
+    <div id="tabBodys" class="tabbody">
+        <div id="tab0"></div>
+        <div id="tab1"></div>
+        <div id="tab2"></div>
+        <div id="tab3"></div>
+        <div id="tab4"></div>
+        <div id="tab5"></div>
+        <div id="tab6"></div>
+    </div>
+</div>
+<div id="tabIconReview">
+    <img id='faceReview' class='review' src="../../themes/default/images/spacer.gif"/>
+</div>
+<script type="text/javascript" src="emotion.js"></script>
+<script type="text/javascript">
+    var emotion = {
+        tabNum:7, //切换面板数量
+        SmilmgName:{ tab0:['j_00', 84], tab1:['t_00', 40], tab2:['w_00', 52], tab3:['B_00', 63], tab4:['C_00', 20], tab5:['i_f', 50], tab6:['y_00', 40] }, //图片前缀名
+        imageFolders:{ tab0:'jx2/', tab1:'tsj/', tab2:'ldw/', tab3:'bobo/', tab4:'babycat/', tab5:'face/', tab6:'youa/'}, //图片对应文件夹路径
+        imageCss:{tab0:'jd', tab1:'tsj', tab2:'ldw', tab3:'bb', tab4:'cat', tab5:'pp', tab6:'youa'}, //图片css类名
+        imageCssOffset:{tab0:35, tab1:35, tab2:35, tab3:35, tab4:35, tab5:25, tab6:35}, //图片偏移
+        SmileyInfor:{
+            tab0:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'],
+            tab1:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'],
+            tab2:['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'],
+            tab3:['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'],
+            tab4:['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'],
+            tab5:['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'],
+            tab6:['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上']
+        }
+    };
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/emotion.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/emotion.js
new file mode 100644
index 0000000..6e158a9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/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 = ['<table class="smileytable">'],
+            i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,
+            sUrl, realUrl, posflag, offset, infor;
+
+    for ( ; i < imgNum; ) {
+        textHTML.push( '<tr>' );
+        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( '<td  class="' + tableCss + '"   border="1" width="' + iColWidth + '%" style="border-collapse:collapse;" align="center"  bgcolor="transparent" onclick="InsertSmiley(\'' + realUrl.replace( /'/g, "\\'" ) + '\',event)" onmouseover="over(this,\'' + sUrl + '\',\'' + posflag + '\')" onmouseout="out(this)">' );
+                textHTML.push( '<span>' );
+                textHTML.push( '<img  style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>' );
+                textHTML.push( '</span>' );
+            } else {
+                textHTML.push( '<td width="' + iColWidth + '%"   bgcolor="#FFFFFF">' );
+            }
+            textHTML.push( '</td>' );
+        }
+        textHTML.push( '</tr>' );
+    }
+    textHTML.push( '</table>' );
+    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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/0.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/0.gif
new file mode 100644
index 0000000..6964168
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/0.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/bface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/bface.gif
new file mode 100644
index 0000000..14fe618
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/bface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/cface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/cface.gif
new file mode 100644
index 0000000..bff947f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/cface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/fface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/fface.gif
new file mode 100644
index 0000000..0d8a6af
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/fface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/jxface2.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/jxface2.gif
new file mode 100644
index 0000000..a959c90
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/jxface2.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/neweditor-tab-bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/neweditor-tab-bg.png
new file mode 100644
index 0000000..8f398b0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/neweditor-tab-bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/tface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/tface.gif
new file mode 100644
index 0000000..1354f54
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/tface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/wface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/wface.gif
new file mode 100644
index 0000000..5667160
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/wface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/yface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/yface.gif
new file mode 100644
index 0000000..51608be
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/emotion/images/yface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/gmap/gmap.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/gmap/gmap.html
new file mode 100644
index 0000000..c4cbfe6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/gmap/gmap.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .content{width:530px; height: 350px;margin: 10px auto;}
+        .content table{width: 100%}
+        .content table td{vertical-align: middle;}
+        #address{width:220px;height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}
+    </style>
+    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
+</head>
+<body>
+<div class="content">
+    <table>
+        <tr>
+            <td><label for="address"><var id="lang_input_address"></var></label></td>
+            <td><input id="address" type="text" /></td>
+            <td><a id="doSearch" href="javascript:void(0)" class="button"><var id="lang_input_search"></var></a></td>
+        </tr>
+    </table>
+    <div id="container" style="width: 100%; height: 340px;margin: 5px auto; border: 1px solid gray;"></div>
+</div>
+<script type="text/javascript">
+    domUtils.on(window,"load",function(){
+        var map = new google.maps.Map(document.getElementById('container'), {
+                zoom: 3,
+                streetViewControl: false,
+                scaleControl: true,
+                mapTypeId: google.maps.MapTypeId.ROADMAP
+            });
+            var imgcss;
+            var marker = new google.maps.Marker({
+                map: map,
+                draggable: true
+            });
+            function doSearch(){
+                var address = document.getElementById('address').value;
+                var geocoder = new google.maps.Geocoder();
+                geocoder.geocode( { 'address': address}, function (results, status) {
+                    if (status == google.maps.GeocoderStatus.OK) {
+                        var bounds = results[0].geometry.viewport;
+                        map.fitBounds(bounds);
+                        marker.setPosition(results[0].geometry.location);
+                        marker.setTitle(address);
+                    } else alert(lang.searchError);
+                });
+            }
+            $G('address').onkeydown = function (evt){
+                evt = evt || event;
+                if (evt.keyCode == 13) {
+                    doSearch();
+                }
+            };
+            $G("doSearch").onclick = doSearch;
+            dialog.onok = function (){
+                var center = map.getCenter();
+                var point = marker.getPosition();
+                var url = "http://maps.googleapis.com/maps/api/staticmap?center=" + center.lat() + ',' + center.lng() + "&zoom=" + map.zoom + "&size=520x340&maptype=" + map.getMapTypeId() + "&markers=" + point.lat() + ',' + point.lng() + "&sensor=false";
+                editor.execCommand('inserthtml', '<img width="520" height="340" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>');
+            };
+
+            function getPars(str,par){
+                var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
+                return reg.exec(str)[1];
+            }
+            var img = editor.selection.getRange().getClosedNode();
+            if(img && img.src.indexOf("http://maps.googleapis.com/maps/api/staticmap")!=-1){
+                var url = img.getAttribute("src");
+                var centers = getPars(url,"center").split(",");
+                point = new google.maps.LatLng(Number(centers[0]),Number(centers[1]));
+                map.setCenter(point);
+                map.setZoom(Number(getPars(url,"zoom")));
+                centers = getPars(url,"markers").split(",");
+                marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1])));
+                imgcss = img.style.cssText;
+            }else{
+                setTimeout(function(){
+                    doSearch();
+                },30)
+            }
+    });
+
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.css
new file mode 100644
index 0000000..4478475
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.css
@@ -0,0 +1,7 @@
+.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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.html
new file mode 100644
index 0000000..9e50060
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title>帮助</title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="help.css">
+</head>
+<body>
+<div class="wrapper" id="helptab">
+    <div id="tabHeads" class="tabhead">
+        <span class="focus" tabsrc="about"><var id="lang_input_about"></var></span>
+        <span tabsrc="shortcuts"><var id="lang_input_shortcuts"></var></span>
+    </div>
+    <div id="tabBodys" class="tabbody">
+        <div id="about" class="panel">
+            <h1>UEditor</h1>
+            <p id="version"></p>
+            <p><var id="lang_input_introduction"></var></p>
+        </div>
+        <div id="shortcuts" class="panel">
+            <table>
+                <thead>
+                <tr>
+                    <td><var id="lang_Txt_shortcuts"></var></td>
+                    <td><var id="lang_Txt_func"></var></td>
+                </tr>
+                </thead>
+                <tbody>
+                <tr>
+                    <td>ctrl+b</td>
+                    <td><var id="lang_Txt_bold"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+c</td>
+                    <td><var id="lang_Txt_copy"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+x</td>
+                    <td><var id="lang_Txt_cut"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+v</td>
+                    <td><var id="lang_Txt_Paste"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+y</td>
+                    <td><var id="lang_Txt_undo"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+z</td>
+                    <td><var id="lang_Txt_redo"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+i</td>
+                    <td><var id="lang_Txt_italic"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+u</td>
+                    <td><var id="lang_Txt_underline"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+a</td>
+                    <td><var id="lang_Txt_selectAll"></var></td>
+                </tr>
+                <tr>
+                    <td>shift+enter</td>
+                    <td><var id="lang_Txt_visualEnter"></var></td>
+                </tr>
+                <tr>
+                    <td>alt+z</td>
+                    <td><var id="lang_Txt_fullscreen"></var></td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="help.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.js
new file mode 100644
index 0000000..9a2272e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/help/help.js
@@ -0,0 +1,56 @@
+/**
+ * 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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.css
new file mode 100644
index 0000000..52c2295
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.css
@@ -0,0 +1,894 @@
+@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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.html
new file mode 100644
index 0000000..08ca022
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.html
@@ -0,0 +1,120 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>ueditor图片对话框</title>
+    <script type="text/javascript" src="../internal.js"></script>
+
+    <!-- jquery -->
+    <script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
+
+    <!-- webuploader -->
+    <script src="../../third-party/webuploader/webuploader.min.js"></script>
+    <link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
+
+    <!-- image dialog -->
+    <link rel="stylesheet" href="image.css" type="text/css" />
+</head>
+<body>
+
+    <div class="wrapper">
+        <div id="tabhead" class="tabhead">
+            <span class="tab" data-content-id="remote"><var id="lang_tab_remote"></var></span>
+            <span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
+            <span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
+            <span class="tab" data-content-id="search"><var id="lang_tab_search"></var></span>
+        </div>
+        <div class="alignBar">
+            <label class="algnLabel"><var id="lang_input_align"></var></label>
+                    <span id="alignIcon">
+                        <span id="noneAlign" class="none-align focus" data-align="none"></span>
+                        <span id="leftAlign" class="left-align" data-align="left"></span>
+                        <span id="rightAlign" class="right-align" data-align="right"></span>
+                        <span id="centerAlign" class="center-align" data-align="center"></span>
+                    </span>
+            <input id="align" name="align" type="hidden" value="none"/>
+        </div>
+        <div id="tabbody" class="tabbody">
+
+            <!-- 远程图片 -->
+            <div id="remote" class="panel">
+                <div class="top">
+                    <div class="row">
+                        <label for="url"><var id="lang_input_url"></var></label>
+                        <span><input class="text" id="url" type="text"/></span>
+                    </div>
+                </div>
+                <div class="left">
+                    <div class="row">
+                        <label><var id="lang_input_size"></var></label>
+                        <span><var id="lang_input_width">&nbsp;&nbsp;</var><input class="text" type="text" id="width"/>px </span>
+                        <span><var id="lang_input_height">&nbsp;&nbsp;</var><input class="text" type="text" id="height"/>px </span>
+                        <span><input id="lock" type="checkbox" disabled="disabled"><span id="lockicon"></span></span>
+                    </div>
+                    <div class="row">
+                        <label><var id="lang_input_border"></var></label>
+                        <span><input class="text" type="text" id="border"/>px </span>
+                    </div>
+                    <div class="row">
+                        <label><var id="lang_input_vhspace"></var></label>
+                        <span><input class="text" type="text" id="vhSpace"/>px </span>
+                    </div>
+                    <div class="row">
+                        <label><var id="lang_input_title"></var></label>
+                        <span><input class="text" type="text" id="title"/></span>
+                    </div>
+                </div>
+                <div class="right"><div id="preview"></div></div>
+            </div>
+
+            <!-- 上传图片 -->
+            <div id="upload" class="panel focus">
+                <div id="queueList" class="queueList">
+                    <div class="statusBar element-invisible">
+                        <div class="progress">
+                            <span class="text">0%</span>
+                            <span class="percentage"></span>
+                        </div><div class="info"></div>
+                        <div class="btns">
+                            <div id="filePickerBtn"></div>
+                            <div class="uploadBtn"><var id="lang_start_upload"></var></div>
+                        </div>
+                    </div>
+                    <div id="dndArea" class="placeholder">
+                        <div class="filePickerContainer">
+                            <div id="filePickerReady"></div>
+                        </div>
+                    </div>
+                    <ul class="filelist element-invisible">
+                        <li id="filePickerBlock" class="filePickerBlock"></li>
+                    </ul>
+                </div>
+            </div>
+
+            <!-- 在线图片 -->
+            <div id="online" class="panel">
+                <div id="imageList"><var id="lang_imgLoading"></var></div>
+            </div>
+
+            <!-- 搜索图片 -->
+            <div id="search" class="panel">
+                <div class="searchBar">
+                    <input id="searchTxt" class="searchTxt text" type="text" />
+                    <select id="searchType" class="searchType">
+                        <option value="&s=4&z=0"></option>
+                        <option value="&s=1&z=19"></option>
+                        <option value="&s=2&z=0"></option>
+                        <option value="&s=3&z=0"></option>
+                    </select>
+                    <input id="searchReset" type="button"  />
+                    <input id="searchBtn" type="button"  />
+                </div>
+                <div id="searchList" class="searchList"><ul id="searchListUl"></ul></div>
+            </div>
+
+        </div>
+    </div>
+    <script type="text/javascript" src="image.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.js
new file mode 100644
index 0000000..c4f52aa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/image.js
@@ -0,0 +1,1139 @@
+/**
+ * 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('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
+                        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("&amp;", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&amp;", "&")),
+                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 = $G('width').value,
+                oh = $G('height').value,
+                border = $G('border').value,
+                title = $G('title').value,
+                preview = $G('preview'),
+                width,
+                height;
+
+            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 = '<img src="' + url + '" width="' + width + '" height="' + height + '" border="' + border + 'px solid #000" title="' + title + '" />';
+            }
+        },
+        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($('<div>').html(lang.errorNotSupport)).hide();
+                return;
+            } else if (!editor.getOpt('imageActionName')) {
+                $('#filePickerReady').after($('<div>').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 = $('<li id="' + file.id + '">' +
+                        '<p class="title">' + file.name + '</p>' +
+                        '<p class="imgWrap"></p>' +
+                        '<p class="progress"><span></span></p>' +
+                        '</li>'),
+
+                    $btns = $('<div class="file-panel">' +
+                        '<span class="cancel">' + lang.uploadDelete + '</span>' +
+                        '<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
+                        '<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
+                    $prgress = $li.find('p.progress span'),
+                    $wrap = $li.find('p.imgWrap'),
+                    $info = $('<p class="error"></p>').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 = $('<img src="' + src + '">');
+                                $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('<span class="success"></span>');
+                    } 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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/alignicon.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/alignicon.jpg
new file mode 100644
index 0000000..754755b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/alignicon.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/bg.png
new file mode 100644
index 0000000..580be0a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/icons.gif
new file mode 100644
index 0000000..78459de
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/icons.png
new file mode 100644
index 0000000..12e4700
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/image.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/image.png
new file mode 100644
index 0000000..19699f6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/image.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/progress.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/progress.png
new file mode 100644
index 0000000..717c486
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/progress.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/success.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/success.gif
new file mode 100644
index 0000000..8d4f311
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/success.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/success.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/success.png
new file mode 100644
index 0000000..94f968d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/image/images/success.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/insertframe/insertframe.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/insertframe/insertframe.html
new file mode 100644
index 0000000..7f1f3e9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/insertframe/insertframe.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .warp {width: 320px;height: 153px;margin-left:5px;padding: 20px 0 0 15px;position: relative;}
+        #url {width: 290px; margin-bottom: 2px; margin-left: -6px; margin-left: -2px\9;*margin-left:0;_margin-left:0; }
+        .format span{display: inline-block; width: 58px;text-align: center; zoom:1;}
+        table td{padding:5px 0;}
+        #align{width: 65px;height: 23px;line-height: 22px;}
+    </style>
+</head>
+<body>
+<div class="warp">
+        <table width="300" cellpadding="0" cellspacing="0">
+            <tr>
+                <td colspan="2" class="format">
+                    <span><var id="lang_input_address"></var></span>
+                    <input style="width:200px" id="url" type="text" value=""/>
+                </td>
+            </tr>
+            <tr>
+                <td colspan="2" class="format"><span><var id="lang_input_width"></var></span><input style="width:200px" type="text" id="width"/> px</td>
+
+            </tr>
+            <tr>
+                <td colspan="2" class="format"><span><var id="lang_input_height"></var></span><input style="width:200px" type="text" id="height"/> px</td>
+            </tr>
+            <tr>
+                <td><span><var id="lang_input_isScroll"></var></span><input type="checkbox" id="scroll"/> </td>
+                <td><span><var id="lang_input_frameborder"></var></span><input type="checkbox" id="frameborder"/> </td>
+            </tr>
+
+            <tr>
+                <td colspan="2"><span><var id="lang_input_alignMode"></var></span>
+                    <select id="align">
+                        <option value=""></option>
+                        <option value="left"></option>
+                        <option value="right"></option>
+                    </select>
+                </td>
+            </tr>
+        </table>
+</div>
+<script type="text/javascript">
+    var iframe = editor._iframe;
+    if(iframe){
+        $G("url").value = iframe.getAttribute("src")||"";
+        $G("width").value = iframe.getAttribute("width")||iframe.style.width.replace("px","")||"";
+        $G("height").value = iframe.getAttribute("height") || iframe.style.height.replace("px","") ||"";
+        $G("scroll").checked = (iframe.getAttribute("scrolling") == "yes") ? true : false;
+        $G("frameborder").checked = (iframe.getAttribute("frameborder") == "1") ? true : false;
+        $G("align").value = iframe.align ? iframe.align : "";
+    }
+    function queding(){
+        var  url = $G("url").value.replace(/^\s*|\s*$/ig,""),
+                width = $G("width").value,
+                height = $G("height").value,
+                scroll = $G("scroll"),
+                frameborder = $G("frameborder"),
+                float = $G("align").value,
+                newIframe = editor.document.createElement("iframe"),
+                div;
+        if(!url){
+            alert(lang.enterAddress);
+            return false;
+        }
+        newIframe.setAttribute("src",/http:\/\/|https:\/\//ig.test(url) ? url : "http://"+url);
+        /^[1-9]+[.]?\d*$/g.test( width ) ? newIframe.setAttribute("width",width) : "";
+        /^[1-9]+[.]?\d*$/g.test( height ) ? newIframe.setAttribute("height",height) : "";
+        scroll.checked ?  newIframe.setAttribute("scrolling","yes") : newIframe.setAttribute("scrolling","no");
+        frameborder.checked ?  newIframe.setAttribute("frameborder","1",0) : newIframe.setAttribute("frameborder","0",0);
+        float ? newIframe.setAttribute("align",float) :  newIframe.setAttribute("align","");
+        if(iframe){
+            iframe.parentNode.insertBefore(newIframe,iframe);
+            domUtils.remove(iframe);
+        }else{
+            div = editor.document.createElement("div");
+            div.appendChild(newIframe);
+            editor.execCommand("inserthtml",div.innerHTML);
+        }
+        editor._iframe = null;
+        dialog.close();
+    }
+    dialog.onok = queding;
+    $G("url").onkeydown = function(evt){
+        evt = evt || event;
+        if(evt.keyCode == 13){
+            queding();
+        }
+    };
+    $focus($G( "url" ));
+
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/internal.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/internal.js
new file mode 100644
index 0000000..44dc17f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/link/link.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/link/link.html
new file mode 100644
index 0000000..55ab4d1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/link/link.html
@@ -0,0 +1,126 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        *{margin:0;padding:0;color: #838383;}
+        table{font-size: 12px;margin: 10px;line-height: 30px}
+        .txt{width:300px;height:21px;line-height:21px;border:1px solid #d7d7d7;}
+    </style>
+</head>
+<body>
+    <table>
+        <tr>
+            <td><label for="text"> <var id="lang_input_text"></var></label></td>
+            <td><input class="txt" id="text" type="text" disabled="true"/></td>
+        </tr>
+        <tr>
+            <td><label for="href"> <var id="lang_input_url"></var></label></td>
+            <td><input class="txt" id="href" type="text" /></td>
+        </tr>
+        <tr>
+            <td><label for="title"> <var id="lang_input_title"></var></label></td>
+            <td><input class="txt" id="title" type="text"/></td>
+        </tr>
+        <tr>
+             <td colspan="2">
+                 <label for="target"><var id="lang_input_target"></var></label>
+                 <input id="target" type="checkbox"/>
+             </td>
+        </tr>
+        <tr>
+            <td colspan="2" id="msg"></td>
+        </tr>
+    </table>
+<script type="text/javascript">
+    var range = editor.selection.getRange(),
+        link = range.collapsed ? editor.queryCommandValue( "link" ) : editor.selection.getStart(),
+        url,
+        text = $G('text'),
+        rangeLink = domUtils.findParentByTagName(range.getCommonAncestor(),'a',true),
+        orgText;
+    link = domUtils.findParentByTagName( link, "a", true );
+    if(link){
+        url = utils.html(link.getAttribute( '_href' ) || link.getAttribute( 'href', 2 ));
+
+        if(rangeLink === link && !link.getElementsByTagName('img').length){
+            text.removeAttribute('disabled');
+            orgText = text.value = link[browser.ie ? 'innerText':'textContent'];
+        }else{
+            text.setAttribute('disabled','true');
+            text.value = lang.validLink;
+        }
+
+    }else{
+        if(range.collapsed){
+            text.removeAttribute('disabled');
+            text.value = '';
+        }else{
+            text.setAttribute('disabled','true');
+            text.value = lang.validLink;
+        }
+
+    }
+    $G("title").value = url ? link.title : "";
+    $G("href").value = url ? url: '';
+    $G("target").checked = url && link.target == "_blank" ? true :  false;
+    $focus($G("href"));
+
+    function handleDialogOk(){
+        var href =$G('href').value.replace(/^\s+|\s+$/g, '');
+        if(href){
+            if(!hrefStartWith(href,["http","/","ftp://",'#'])) {
+                href  = "http://" + href;
+            }
+            var obj = {
+                'href' : href,
+                'target' : $G("target").checked ? "_blank" : '_self',
+                'title' : $G("title").value.replace(/^\s+|\s+$/g, ''),
+                '_href':href
+            };
+            //修改链接内容的情况太特殊了,所以先做到这里了
+            //todo:情况多的时候,做到command里
+            if(orgText && text.value != orgText){
+                link[browser.ie ? 'innerText' : 'textContent'] =  obj.textValue = text.value;
+                range.selectNode(link).select()
+            }
+            if(range.collapsed){
+                obj.textValue = text.value;
+            }
+            editor.execCommand('link',utils.clearEmptyAttrs(obj) );
+            dialog.close();
+        }
+    }
+    dialog.onok = handleDialogOk;
+    $G('href').onkeydown = $G('title').onkeydown = function(evt){
+        evt = evt || window.event;
+        if (evt.keyCode == 13) {
+            handleDialogOk();
+            return false;
+        }
+    };
+    $G('href').onblur = function(){
+        if(!hrefStartWith(this.value,["http","/","ftp://",'#'])){
+            $G("msg").innerHTML = "<span style='color: red'>"+lang.httpPrompt+"</span>";
+        }else{
+            $G("msg").innerHTML = "";
+        }
+    };
+
+    function hrefStartWith(href,arr){
+        href = href.replace(/^\s+|\s+$/g, '');
+        for(var i=0,ai;ai=arr[i++];){
+            if(href.indexOf(ai)==0){
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+</script>
+</body>
+</html>
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/map/map.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/map/map.html
new file mode 100644
index 0000000..e763b8e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/map/map.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.1&services=true"></script>
+    <style type="text/css">
+        .content{width:530px; height: 350px;margin: 10px auto;}
+        .content table{width: 100%}
+        .content table td{vertical-align: middle;}
+        #city,#address{height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}
+        #city{width:60px}
+        #address{width:130px}
+        #is_dynamic_label span{vertical-align:middle;margin: 3px 0px 3px 3px;}
+        #is_dynamic_label input{vertical-align:middle;margin: 3px 3px 3px 50px;}
+    </style>
+</head>
+<body>
+<div class="content">
+    <table>
+        <tr>
+            <td><var id="lang_city"></var>:</td>
+            <td><input id="city" type="text" /></td>
+            <td><var id="lang_address"></var>:</td>
+            <td><input id="address" type="text" value="" /></td>
+            <td><a href="javascript:doSearch()" class="button"><var id="lang_search"></var></a></td>
+            <td><label id="is_dynamic_label" for="is_dynamic"><input id="is_dynamic" type="checkbox" name="is_dynamic" /><span><var id="lang_dynamicmap"></var></span></label></td>
+        </tr>
+    </table>
+    <div style="width:100%;height:340px;margin:5px auto;border:1px solid gray" id="container"></div>
+
+</div>
+<script type="text/javascript">
+    var map = new BMap.Map("container"),marker,point,styleStr;
+    map.enableScrollWheelZoom();
+    map.enableContinuousZoom();
+    function doSearch(){
+        if (!document.getElementById('city').value) {
+            alert(lang.cityMsg);
+            return;
+        }
+        var search = new BMap.LocalSearch(document.getElementById('city').value, {
+            onSearchComplete: function (results){
+                if (results && results.getNumPois()) {
+                    var points = [];
+                    for (var i=0; i<results.getCurrentNumPois(); i++) {
+                        points.push(results.getPoi(i).point);
+                    }
+                    if (points.length > 1) {
+                        map.setViewport(points);
+                    } else {
+                        map.centerAndZoom(points[0], 13);
+                    }
+                    point = map.getCenter();
+                    marker.setPoint(point);
+                } else {
+                    alert(lang.errorMsg);
+                }
+            }
+        });
+        search.search(document.getElementById('address').value || document.getElementById('city').value);
+    }
+    //获得参数
+    function getPars(str,par){
+        var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
+        return reg.exec(str)[1];
+    }
+    function init(){
+        var mapNode = editor.selection.getRange().getClosedNode(),
+            isMapImg = mapNode && /api[.]map[.]baidu[.]com/ig.test(mapNode.getAttribute("src")),
+            isMapIframe = mapNode && domUtils.hasClass(mapNode, 'ueditor_baidumap');
+        if(isMapImg || isMapIframe){
+            var url, centerPos, markerPos;
+            if(isMapIframe) {
+                url = decodeURIComponent(mapNode.getAttribute("src"));
+                $G('is_dynamic').checked = true;
+                styleStr = mapNode.style.cssText;
+            } else {
+                url = mapNode.getAttribute("src");
+                styleStr = mapNode.style.cssText;
+            }
+
+            centerPos = getPars(url,"center").split(",");
+            markerPos = getPars(url, "markers").split(",");
+            point = new BMap.Point(Number(centerPos[0]),Number(centerPos[1]));
+            marker = new BMap.Marker(new BMap.Point(Number(markerPos[0]), Number(markerPos[1])));
+            map.addControl(new BMap.NavigationControl());
+            map.centerAndZoom(point, Number(getPars(url,"zoom")));
+        }else{
+            point = new BMap.Point(116.404, 39.915);    // 创建点坐标
+            marker = new BMap.Marker(point);
+            map.addControl(new BMap.NavigationControl());
+            map.centerAndZoom(point, 10);                     // 初始化地图,设置中心点坐标和地图级别。
+        }
+        marker.enableDragging();
+        map.addOverlay(marker);
+    }
+    init();
+    document.getElementById('address').onkeydown = function (evt){
+        evt = evt || event;
+        if (evt.keyCode == 13) {
+            doSearch();
+        }
+    };
+    dialog.onok = function (){
+        var center = map.getCenter();
+        var zoom = map.zoomLevel;
+        var size = map.getSize();
+        var mapWidth = size.width;
+        var mapHeight = size.height;
+        var point = marker.getPoint();
+
+        if($G('is_dynamic').checked) {
+            var URL = editor.options.UEDITOR_HOME_URL,
+                url = [URL + (/\/$/.test(URL) ? '':'/') + "dialogs/map/show.html" +
+                    '#center=' + center.lng + ',' + center.lat,
+                    '&zoom=' + zoom,
+                    '&width=' + mapWidth,
+                    '&height=' + mapHeight,
+                    '&markers=' + point.lng + ',' + point.lat,
+                    '&markerStyles=' + 'l,A'].join('');
+            editor.execCommand('inserthtml', '<iframe class="ueditor_baidumap" src="' + url + '"' + (styleStr ? ' style="' + styleStr + '"' :'') + ' frameborder="0" width="' + (mapWidth+4) + '" height="' + (mapHeight+4) + '"></iframe>');
+        } else {
+            var url = "http://api.map.baidu.com/staticimage?center=" + center.lng + ',' + center.lat +
+                    "&zoom=" + zoom + "&width=" + size.width + '&height=' + size.height + "&markers=" + point.lng + ',' + point.lat;
+            editor.execCommand('inserthtml', '<img width="'+ size.width +'"height="'+ size.height +'" src="' + url + '"' + (styleStr ? ' style="' + styleStr + '"' :'') + '/>');
+        }
+    };
+    document.getElementById("address").focus();
+</script>
+
+
+</body>
+</html>
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/map/show.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/map/show.html
new file mode 100644
index 0000000..329cfeb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/map/show.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8"/>
+    <meta name="keywords" content="百度地图,百度地图API,百度地图自定义工具,百度地图所见即所得工具"/>
+    <meta name="description" content="百度地图API自定义地图,帮助用户在可视化操作下生成百度地图"/>
+    <title>百度地图API自定义地图</title>
+    <!--引用百度地图API-->
+    <style type="text/css">
+        html, body {
+            margin: 0;
+            padding: 0;
+            overflow: hidden;
+        }
+    </style>
+    <script type="text/javascript" src="http://api.map.baidu.com/api?key=&v=1.1&services=true"></script>
+</head>
+
+<body onload="initMap();">
+<!--百度地图容器-->
+<div style="width:697px;height:550px;border:#ccc solid 1px;" id="dituContent"></div>
+</body>
+<script type="text/javascript">
+    function getParam(name) {
+        return location.href.match(new RegExp('[?#&]' + name + '=([^?#&]+)', 'i')) ? RegExp.$1 : '';
+    }
+    var map, marker;
+    var centerParam = getParam('center');
+    var zoomParam = getParam('zoom');
+    var widthParam = getParam('width');
+    var heightParam = getParam('height');
+    var markersParam = getParam('markers');
+    var markerStylesParam = getParam('markerStyles');
+
+    //创建和初始化地图函数:
+    function initMap() {
+        // [FF]切换模式后报错
+        if (!window.BMap) {
+            return;
+        }
+        var dituContent = document.getElementById('dituContent');
+        dituContent.style.width = widthParam + 'px';
+        dituContent.style.height = heightParam + 'px';
+
+        createMap();//创建地图
+        setMapEvent();//设置地图事件
+        addMapControl();//向地图添加控件
+
+        // 创建标注
+        var markersArr = markersParam.split(',');
+        var point = new BMap.Point(markersArr[0], markersArr[1]);
+        marker = new BMap.Marker(point);
+        marker.enableDragging();
+        map.addOverlay(marker); // 将标注添加到地图中
+
+        if(parent.editor && parent.document.body.contentEditable=="true") { //在编辑状态下
+            setMapListener();//地图改变修改外层的iframe标签src属性
+        }
+    }
+
+    //创建地图函数:
+    function createMap() {
+        map = new BMap.Map("dituContent");//在百度地图容器中创建一个地图
+        var centerArr = centerParam.split(',');
+        var point = new BMap.Point(parseFloat(centerArr[0]), parseFloat(centerArr[1]));//定义一个中心点坐标
+        map.centerAndZoom(point, parseInt(zoomParam));//设定地图的中心点和坐标并将地图显示在地图容器中
+    }
+
+    //地图事件设置函数:
+    function setMapEvent() {
+        map.enableDragging();//启用地图拖拽事件,默认启用(可不写)
+        map.enableScrollWheelZoom();//启用地图滚轮放大缩小
+        map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写)
+        map.enableKeyboard();//启用键盘上下左右键移动地图
+    }
+
+    //地图控件添加函数:
+    function addMapControl() {
+        //向地图中添加缩放控件
+        var ctrl_nav = new BMap.NavigationControl({anchor: BMAP_ANCHOR_TOP_LEFT, type: BMAP_NAVIGATION_CONTROL_LARGE});
+        map.addControl(ctrl_nav);
+        //向地图中添加缩略图控件
+        var ctrl_ove = new BMap.OverviewMapControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, isOpen: 1});
+        map.addControl(ctrl_ove);
+        //向地图中添加比例尺控件
+        var ctrl_sca = new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT});
+        map.addControl(ctrl_sca);
+    }
+
+    function setMapListener() {
+        var editor = parent.editor, containerIframe,
+            iframes = parent.document.getElementsByTagName('iframe');
+        for (var key in iframes) {
+            if (iframes[key].contentWindow == window) {
+                containerIframe = iframes[key];
+                break;
+            }
+        }
+        if (containerIframe) {
+            map.addEventListener('moveend', mapListenerHandler);
+            map.addEventListener('zoomend', mapListenerHandler);
+            marker.addEventListener('dragend', mapListenerHandler);
+        }
+
+        function mapListenerHandler() {
+            var zoom = map.getZoom(),
+                center = map.getCenter(),
+                marker = window.marker.getPoint();
+            containerIframe.src = containerIframe.src.
+                replace(new RegExp('([?#&])center=([^?#&]+)', 'i'), '$1center=' + center.lng + ',' + center.lat).
+                replace(new RegExp('([?#&])markers=([^?#&]+)', 'i'), '$1markers=' + marker.lng + ',' + marker.lat).
+                replace(new RegExp('([?#&])zoom=([^?#&]+)', 'i'), '$1zoom=' + zoom);
+            editor.fireEvent('saveScene');
+        }
+    }
+</script>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.css
new file mode 100644
index 0000000..8fb7a94
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.css
@@ -0,0 +1,30 @@
+.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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.html
new file mode 100644
index 0000000..e7ef04f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <title>插入音乐</title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="music.css">
+</head>
+<body>
+<div class="wrapper">
+    <div class="searchBar">
+        <input id="J_searchName" type="text"/>
+        <input type="button" class="searchBtn" id="J_searchBtn">
+    </div>
+    <div class="resultBar" id="J_resultBar">
+        <div class="loading" style="display:none"></div>
+        <div class="empty"><var id="lang_input_tips"></var></div>
+    </div>
+    <div id="J_preview"></div>
+</div>
+<script type="text/javascript" src="music.js"></script>
+<script type="text/javascript">
+    var music = new Music;
+    dialog.onok = function () {
+        music.exec();
+    };
+    dialog.oncancel = function () {
+        $G('J_preview').innerHTML = "";
+    };
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.js
new file mode 100644
index 0000000..1c538bf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/music/music.js
@@ -0,0 +1,192 @@
+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 = '<div class="loading"></div>';
+
+            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 = '<embed class="BDE_try_Music" allowfullscreen="false" pluginspage="http://www.macromedia.com/go/getflashplayer"';
+            html += ' src="' + playerUrl + '"';
+            html += ' width="1" height="1" style="position:absolute;left:-2000px;"';
+            html += ' type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false"';
+            html += ' menu="false" allowscriptaccess="never" scale="noborder">';
+            return html;
+        },
+        _byteLength:function (str) {
+            return str.replace(/[^\u0000-\u007f]/g, "\u0061\u0061").length;
+        },
+        _getMaxText:function (s) {
+            var me = this;
+            s = me._removeHtml(s);
+            if (me._byteLength(s) > 12)
+                return s.substring(0, 5) + '...';
+            if (!s) s = "&nbsp;";
+            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 '<div class="empty">' + lang.emptyTxt + '</div>';
+            data = me._rebuildData(data);
+            var s = [], p = [], t = [];
+            s.push('<div id="J_listPanel" class="listPanel">');
+            p.push('<div class="page">');
+            for (var i = 0, tmpList; tmpList = data[i++];) {
+                panels.push('panel' + i);
+                pages.push('page' + i);
+                if (i == 1) {
+                    s.push('<div id="panel' + i + '" class="panelon">');
+                    if (data.length != 1) {
+                        t.push('<div id="page' + i + '" onclick="music.onpageclick(' + i + ')" class="pageon">' + (i ) + '</div>');
+                    }
+                } else {
+                    s.push('<div id="panel' + i + '" class="paneloff">');
+                    t.push('<div id="page' + i + '" onclick="music.onpageclick(' + i + ')" class="pageoff">' + (i ) + '</div>');
+                }
+                s.push('<div class="m-box">');
+                s.push('<div class="m-h"><span class="m-t">' + lang.chapter + '</span><span class="m-s">' + lang.singer
+                    + '</span><span class="m-z">' + lang.special + '</span><span class="m-try-t">' + lang.listenTest + '</span></div>');
+                for (var j = 0, tmpObj; tmpObj = tmpList[j++];) {
+                    s.push('<label for="radio-' + i + '-' + j + '" class="m-m">');
+                    s.push('<input type="radio" id="radio-' + i + '-' + j + '" name="musicId" class="m-l" onclick="music.doselect(' + (me.pageSize * (i-1) + (j-1)) + ')"/>');
+                    s.push('<span class="m-t">' + me._getMaxText(tmpObj.title) + '</span>');
+                    s.push('<span class="m-s">' + me._getMaxText(tmpObj.author) + '</span>');
+                    s.push('<span class="m-z">' + me._getMaxText(tmpObj.album_title) + '</span>');
+                    s.push('<span class="m-try" onclick="music.doselect(' + (me.pageSize * (i-1) + (j-1)) + ');music.listenTest(this)"></span>');
+                    s.push('</label>');
+                }
+                s.push('</div>');
+                s.push('</div>');
+            }
+            t.reverse();
+            p.push(t.join(''));
+            s.push('</div>');
+            p.push('</div>');
+            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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/preview/preview.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/preview/preview.html
new file mode 100644
index 0000000..f6b433b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/preview/preview.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+    "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+        <style>
+            html,body{
+                height:100%;
+                width:100%;
+                padding:0;
+                margin:0;
+            }
+            #preview{
+                width:100%;
+                height:100%;
+                padding:0;
+                margin:0;
+            }
+            #preview *{font-family:sans-serif;font-size:16px;}
+        </style>
+        <script type="text/javascript" src="../internal.js"></script>
+        <script src="../../ueditor.parse.js"></script>
+        <title></title>
+    </head>
+    <body class="view">
+        <div id="preview" style="margin:8px">
+
+        </div>
+    </body>
+    <script>
+        document.getElementById('preview').innerHTML = editor.getContent();
+        uParse('#preview',{
+            rootPath : '../../',
+            chartContainerHeight:500
+        })
+        dialog.oncancel = function(){
+            document.getElementById('preview').innerHTML = '';
+        }
+    </script>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/addimg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/addimg.png
new file mode 100644
index 0000000..03a8713
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/addimg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/brush.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/brush.png
new file mode 100644
index 0000000..efa6fdb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/brush.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/delimg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/delimg.png
new file mode 100644
index 0000000..5a892e4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/delimg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/delimgH.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/delimgH.png
new file mode 100644
index 0000000..2f0c5c9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/delimgH.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/empty.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/empty.png
new file mode 100644
index 0000000..0375196
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/empty.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/emptyH.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/emptyH.png
new file mode 100644
index 0000000..838ca72
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/emptyH.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/eraser.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/eraser.png
new file mode 100644
index 0000000..63e87ce
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/eraser.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/redo.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/redo.png
new file mode 100644
index 0000000..12cd9bb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/redo.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/redoH.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/redoH.png
new file mode 100644
index 0000000..d9f33d3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/redoH.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/scale.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/scale.png
new file mode 100644
index 0000000..935a3f3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/scale.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/scaleH.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/scaleH.png
new file mode 100644
index 0000000..72e64a9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/scaleH.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/size.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/size.png
new file mode 100644
index 0000000..8366845
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/size.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/undo.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/undo.png
new file mode 100644
index 0000000..084c7cc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/undo.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/undoH.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/undoH.png
new file mode 100644
index 0000000..fde7eb3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/images/undoH.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.css
new file mode 100644
index 0000000..b18430d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.css
@@ -0,0 +1,72 @@
+/*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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.html
new file mode 100644
index 0000000..9371abd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="robots" content="noindex, nofollow"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="scrawl.css">
+</head>
+<body>
+<div class="main" id="J_wrap">
+    <div class="hot">
+        <div class="drawBoard border_style1">
+            <canvas id="J_brushBoard" class="brushBorad" width="360" height="300"></canvas>
+            <div id="J_picBoard" class="picBoard" style="width: 360px;height: 300px"></div>
+        </div>
+        <div id="J_operateBar" class="operateBar">
+            <span id="J_previousStep" class="previousStep">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_previousStep"></var></em>
+            </span>
+            <span id="J_nextStep" class="nextStep">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_nextsStep"></var></em>
+            </span>
+            <span id="J_clearBoard" class="clearBoard">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_clear"></var></em>
+            </span>
+            <span id="J_sacleBoard" class="scaleBoard">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_ScalePic"></var></em>
+            </span>
+        </div>
+    </div>
+    <div class="drawToolbar border_style1">
+        <div id="J_colorBar" class="colorBar"></div>
+        <div id="J_brushBar" class="sectionBar">
+            <em class="brushIcon"></em>
+            <a href="javascript:void(0)" class="size1">1</a>
+            <a href="javascript:void(0)" class="size2">3</a>
+            <a href="javascript:void(0)" class="size3">5</a>
+            <a href="javascript:void(0)" class="size4">7</a>
+        </div>
+        <div id="J_eraserBar" class="sectionBar">
+            <em class="eraserIcon"></em>
+            <a href="javascript:void(0)" class="size1">1</a>
+            <a href="javascript:void(0)" class="size2">3</a>
+            <a href="javascript:void(0)" class="size3">5</a>
+            <a href="javascript:void(0)" class="size4">7</a>
+        </div>
+        <div class="sectionBar">
+            <div id="J_addImg" class="addImgH">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_addPic"></var></em>
+                <form method="post" id="fileForm" enctype="multipart/form-data" class="addImgH_form" target="up">
+                    <input type="file" name="upfile" id="J_imgTxt"
+                           accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>
+                </form>
+                <iframe name="up" style="display: none"></iframe>
+            </div>
+        </div>
+        <div class="sectionBar">
+            <span id="J_removeImg" class="removeImg">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_removePic"></var></em>
+            </span>
+        </div>
+    </div>
+</div>
+<div id="J_maskLayer" class="maskLayerNull"></div>
+
+<script type="text/javascript" src="scrawl.js"></script>
+<script type="text/javascript">
+    var settings = {
+        drawBrushSize:3, //画笔初始大小
+        drawBrushColor:"#4bacc6", //画笔初始颜色
+        colorList:['c00000', 'ff0000', 'ffc000', 'ffff00', '92d050', '00b050', '00b0f0', '0070c0', '002060', '7030a0', 'ffffff',
+            '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646'], //画笔选择颜色
+        saveNum:10  //撤销次数
+    };
+
+    var scrawlObj = new scrawl( settings );
+    scrawlObj.isCancelScrawl = false;
+
+    dialog.onok = function () {
+        exec( scrawlObj );
+        return false;
+    };
+    dialog.oncancel = function () {
+        scrawlObj.isCancelScrawl = true;
+    };
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.js
new file mode 100644
index 0000000..e0c005e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/scrawl/scrawl.js
@@ -0,0 +1,671 @@
+/**
+ * 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("<table id='J_colorList'>");
+            for (var i = 0, color; color = colorList[i++];) {
+                if ((i - 1) % 5 == 0) {
+                    if (i != 1) {
+                        arr.push("</tr>");
+                    }
+                    arr.push("<tr>");
+                }
+                tmp = '#' + color;
+                arr.push("<td><a title='" + tmp + "' href='javascript:void(0)' style='background-color:" + tmp + "'></a></td>");
+            }
+            arr.push("</tr></table>");
+            $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("<span class='hand" + i + "'></span>");
+        }
+        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 + "&nbsp;&nbsp;&nbsp;<input type='button' value='" + lang.continueBtn + "'  onclick='removeMaskLayer()'/>");
+    }
+}
+
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/searchreplace/searchreplace.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/searchreplace/searchreplace.html
new file mode 100644
index 0000000..b91f190
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/searchreplace/searchreplace.html
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .warpper{ position:relative;width: 380px; height: 100%; margin: 10px auto;}
+        .tabbody{height: 160px;}
+        .tabbody table{width:100%;border-collapse: separate;border-spacing: 3px;}
+        .tabbody .panel{width:373px;height:100%;padding-left: 5px;position: absolute;background-color: #fff;}
+        .tabbody input.int{ width:190px;height:21px;border:1px solid #d7d7d7;line-height:21px;}
+        .tabbody input.btn{padding: 0 5px; text-align:center;line-height:24px; text-decoration: none;height:24px;background:url("../../themes/default/images/dialog-title-bg.png") repeat-x;border:1px solid #ccc; }
+    </style>
+</head>
+<body>
+<div class="warpper" id="searchtab">
+    <div id="head" class="tabhead">
+        <span  tabsrc="find" class="focus"><var id="lang_tab_search"></var></span>
+        <span  tabsrc="replace" ><var id="lang_tab_replace"></var></span>
+    </div>
+    <div class="tabbody">
+        <div class="panel" id="find">
+            <table>
+                <tr>
+                    <td width="80"><var id="lang_search1"></var>: </td>
+                    <td><input id="findtxt" type="text" class="int" /></td>
+                </tr>
+                <!--<tr>-->
+
+                    <!--<td colspan="2"><span style="color:red"><var id="lang_searchReg"></var></span></td>-->
+                <!--</tr>-->
+                <tr>
+                    <td><var id="lang_case_sensitive1"></var></td>
+                    <td>
+                        <input id="matchCase" type="checkbox" />
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        <input id="nextFindBtn" type="button" class="btn" />
+                        <input id="preFindBtn" type="button" class="btn" />
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        &nbsp;
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        <span id="search-msg" style="color:red"></span>
+                    </td>
+                </tr>
+            </table>
+        </div>
+        <div class="panel" id="replace">
+            <table>
+                <tr>
+                    <td width="80"><var id="lang_search2"></var>: </td>
+                    <td><input id="findtxt1" type="text" class="int"  /></td>
+                </tr>
+                <!--<tr>-->
+
+                    <!--<td colspan="2"><span style="color:red"><var id="lang_searchReg1"></var></span></td>-->
+                <!--</tr>-->
+                <tr>
+                    <td><var id="lang_replace"></var>: </td>
+                    <td><input id="replacetxt" type="text" class="int" /></td>
+                </tr>
+                <tr>
+                    <td><var id="lang_case_sensitive2"></var></td>
+                    <td>
+                        <input id="matchCase1" type="checkbox" />
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        <input id="nextReplaceBtn" type="button" class="btn" />
+                        <input id="preReplaceBtn" type="button" class="btn" />
+                        <input id="repalceBtn" type="button" class="btn" />
+                        <input id="repalceAllBtn" type="button" class="btn" />
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        &nbsp;
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        <span id="replace-msg" style="color:red"></span>
+                    </td>
+                </tr>
+            </table>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="searchreplace.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/searchreplace/searchreplace.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/searchreplace/searchreplace.js
new file mode 100644
index 0000000..1b52857
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/searchreplace/searchreplace.js
@@ -0,0 +1,164 @@
+/**
+ * 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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/snapscreen/snapscreen.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/snapscreen/snapscreen.html
new file mode 100644
index 0000000..cf8209e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/snapscreen/snapscreen.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+        <title></title>
+        <script type="text/javascript" src="../internal.js"></script>
+        <style type="text/css">
+            *{color: #838383}
+            html,body {
+                font-size: 12px;
+                width:100%;
+                height:100%;
+                overflow: hidden;
+                margin:0px;
+                padding:0px;
+            }
+            h2 { font-size: 16px; margin: 20px auto;}
+            .content{
+                padding:5px 15px 0 15px;
+                height:100%;
+            }
+            dt,dd { margin-left: 0; padding-left: 0;}
+            dt a { display: block;
+                    height: 30px;
+                    line-height: 30px;
+                    width: 55px;
+                    background: #EFEFEF;
+                    border: 1px solid #CCC;
+                    padding: 0 10px;
+                    text-decoration: none;
+            }
+            dt a:hover{
+                background: #e0e0e0;
+                border-color: #999
+            }
+            dt a:active{
+                background: #ccc;
+                border-color: #999;
+                color: #666;
+            }
+            dd { line-height:20px;margin-top: 10px;}
+            span{ padding-right:4px;}
+            input{width:210px;height:21px;background: #FFF;border:1px solid #d7d7d7;padding: 0px; margin: 0px; }
+
+
+        </style>
+    </head>
+    <body>
+        <div class="content">
+            <h2><var id="lang_showMsg"></var></h2>
+            <dl>
+                <dt><a href="../../third-party/snapscreen/UEditorSnapscreen.exe" target="_blank" id="downlink"><var id="lang_download"></var></a></dt>
+                <dd><var id="lang_step1"></var></dd>
+                <dd><var id="lang_step2"></var></dd>
+            </dl>
+        </div>
+    </body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/spechars/spechars.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/spechars/spechars.html
new file mode 100644
index 0000000..0b5c416
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/spechars/spechars.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        html,body{overflow:hidden;}
+        #specharsTab{width: 97%;margin: 10px auto; zoom:1;position: relative}
+        .tabbody {height:447px;}
+        .tabbody span{ margin: 5px 3px;text-align: center;display:inline-block;width: 40px;height:16px;line-height: 16px;cursor: pointer; }
+    </style>
+</head>
+<body>
+    <div id="specharsTab">
+        <div id="tabHeads" class="tabhead"></div><div id="tabBodys" class="tabbody"></div>
+    </div>
+<script type="text/javascript" src="spechars.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/spechars/spechars.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/spechars/spechars.js
new file mode 100644
index 0000000..f4c155e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/spechars/spechars.js
@@ -0,0 +1,57 @@
+/**
+ * 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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/dragicon.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/dragicon.png
new file mode 100644
index 0000000..f26203b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/dragicon.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.css
new file mode 100644
index 0000000..c6f9396
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.css
@@ -0,0 +1,84 @@
+body{
+    overflow: hidden;
+    width: 540px;
+}
+.wrapper {
+    margin: 10px auto 0;
+    font-size: 12px;
+    overflow: hidden;
+    width: 520px;
+    height: 315px;
+}
+
+.clear {
+    clear: both;
+}
+
+.wrapper .left {
+    float: left;
+    margin-left: 10px;;
+}
+
+.wrapper .right {
+    float: right;
+    border-left: 2px dotted #EDEDED;
+    padding-left: 15px;
+}
+
+.section {
+    margin-bottom: 15px;
+    width: 240px;
+    overflow: hidden;
+}
+
+.section h3 {
+    font-weight: bold;
+    padding: 5px 0;
+    margin-bottom: 10px;
+    border-bottom: 1px solid #EDEDED;
+    font-size: 12px;
+}
+
+.section ul {
+    list-style: none;
+    overflow: hidden;
+    clear: both;
+
+}
+
+.section li {
+    float: left;
+    width: 120px;;
+}
+
+.section .tone {
+    width: 80px;;
+}
+
+.section .preview {
+    width: 220px;
+}
+
+.section .preview table {
+    text-align: center;
+    vertical-align: middle;
+    color: #666;
+}
+
+.section .preview caption {
+    font-weight: bold;
+}
+
+.section .preview td {
+    border-width: 1px;
+    border-style: solid;
+    height: 22px;
+}
+
+.section .preview th {
+    border-style: solid;
+    border-color: #DDD;
+    border-width: 2px 1px 1px 1px;
+    height: 22px;
+    background-color: #F7F7F7;
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.html
new file mode 100644
index 0000000..3c412fb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="edittable.css">
+</head>
+<body>
+<div class="wrapper">
+    <div class="left">
+        <div class="section">
+            <h3><var id="lang_tableStyle"></var></h3>
+            <ul>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_title" name="style"/><var id="lang_insertTitle"></var></label>
+                </li>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_titleCol" name="style"/><var id="lang_insertTitleCol"></var></label>
+                </li>
+            </ul>
+            <ul>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_caption" name="style"/><var id="lang_insertCaption"></var></label>
+                </li>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_sorttable" name="style"/><var id="lang_orderbycontent"></var></label>
+                </li>
+            </ul>
+            <div class="clear"></div>
+        </div>
+        <div class="section">
+            <h3><var id="lang_tableSize"></var></h3>
+            <ul>
+                <li>
+                    <label><input type="radio" id="J_autoSizeContent" name="size"/><var id="lang_autoSizeContent"></var></label>
+                </li>
+                <li>
+                    <label><input type="radio" id="J_autoSizePage" name="size"/><var id="lang_autoSizePage"></var></label>
+                </li>
+            </ul>
+            <div class="clear"></div>
+        </div>
+        <div class="section">
+            <h3><var id="lang_borderStyle"></var></h3>
+            <ul>
+                <li>
+                    <span><var id="lang_color"></var></span>
+                    <input type="text" class="tone" id="J_tone" readonly='readonly' />
+                </li>
+            </ul>
+            <div class="clear"></div>
+        </div>
+    </div>
+    <div class="right">
+        <div class="section">
+            <h3><var id="lang_example"></var></h3>
+            <div class="preview" id="J_preview">
+            </div>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="edittable.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.js
new file mode 100644
index 0000000..11dbee7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittable.js
@@ -0,0 +1,237 @@
+/**
+ * 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 = '<span>^</span>';
+            arr.push("<table id='J_example'>");
+            if (hasCaption) {
+                arr.push("<caption>" + lang.captionName + "</caption>")
+            }
+            if (hasTitle) {
+                arr.push("<tr>");
+                if(hasTitleCol) { arr.push("<th>" + lang.titleName + "</th>"); }
+                for (var j = 0; j < 5; j++) {
+                    arr.push("<th>" + lang.titleName + "</th>");
+                }
+                arr.push("</tr>");
+            }
+            for (var i = 0; i < 6; i++) {
+                arr.push("<tr>");
+                if(hasTitleCol) { arr.push("<th>" + lang.titleName + "</th>") }
+                for (var k = 0; k < 5; k++) {
+                    arr.push("<td>" + lang.cellsName + "</td>")
+                }
+                arr.push("</tr>");
+            }
+            arr.push("</table>");
+            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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittd.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittd.html
new file mode 100644
index 0000000..49a52f7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittd.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .section {
+            text-align: center;
+            margin-top: 10px;
+        }
+        .section input {
+            margin-left: 5px;
+            width: 70px;
+        }
+    </style>
+</head>
+<body>
+<div class="section">
+    <span><var id="lang_tdBkColor"></var></span>
+    <input type="text" id="J_tone"/>
+</div>
+<script type="text/javascript">
+    var tone = $G("J_tone"),
+            colorPiker = new UE.ui.ColorPicker({
+                editor:editor
+            }),
+            colorPop = new UE.ui.Popup({
+                editor:editor,
+                content:colorPiker
+            });
+    domUtils.on(tone, "click", function () {
+        colorPop.showAnchor(tone);
+    });
+    domUtils.on(document, 'mousedown', function () {
+        colorPop.hide();
+    });
+    colorPiker.addListener("pickcolor", function () {
+        tone.value = arguments[1];
+        colorPop.hide();
+    });
+    colorPiker.addListener("picknocolor", function () {
+        tone.value="";
+        colorPop.hide();
+    });
+    dialog.onok=function(){
+        editor.execCommand("edittd",tone.value);
+    };
+
+    var start = editor.selection.getStart(),
+        cell = start && domUtils.findParentByTagName(start, ["td", "th"], true);
+    if(cell){
+        var color = domUtils.getComputedStyle(cell,'background-color');
+        if(/^#/.test(color)){
+            tone.value = color
+        }
+
+    }
+
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittip.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittip.html
new file mode 100644
index 0000000..954f7bb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/table/edittip.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>表格删除提示</title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .section {
+            width: 200px;
+            margin: 10px auto 0;
+            font-size: 14px;
+        }
+
+        .item {
+            text-align: center;
+        }
+    </style>
+</head>
+<body>
+<div class="section">
+    <div class="item">
+        <label><input type="radio" id="J_delRow" name="cmd" checked/><var id="lang_delRow"></var></label>
+    </div>
+    <div class="item">
+        <label><input type="radio" id="J_delCol" name="cmd"/><var id="lang_delCol"></var></label>
+    </div>
+</div>
+<script type="text/javascript">
+    dialog.onok = function () {
+        $G("J_delRow").checked ? editor.execCommand("deleterow") : editor.execCommand("deletecol");
+    };
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/config.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/config.js
new file mode 100644
index 0000000..417b8f7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/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':'<p class="ue_t">&nbsp;欢迎使用UEditor!</p>',
+        "html":'<p class="ue_t">欢迎使用UEditor!</p>'
+
+    },
+    {
+        "pre":"pre1.png",
+        'title':lang.blog,
+        'preHtml':'<h1 label="Title center" name="tc" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;"><span style="color:#c0504d;">深入理解Range</span></h1><p style="text-align:center;"><strong class=" ">UEditor二次开发</strong></p><h3><span class=" " style="font-family:幼圆">什么是Range</span></h3><p style="text-indent:2em;">对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 </p><br /><h3><span class=" " style="font-family:幼圆">Range能干什么</span></h3><p style="text-indent:2em;">在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。</p>',
+        "html":'<h1 class="ue_t" label="Title center" name="tc" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;"><span style="color:#c0504d;">[键入文档标题]</span></h1><p style="text-align:center;"><strong class="ue_t">[键入文档副标题]</strong></p><h3><span class="ue_t" style="font-family:幼圆">[标题 1]</span></h3><p class="ue_t"  style="text-indent:2em;">对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。</p><h3><span class="ue_t" style="font-family:幼圆">[标题 2]</span></h3><p class="ue_t"  style="text-indent:2em;">在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。 您还可以使用“开始”选项卡上的其他控件来直接设置文本格式。大多数控件都允许您选择是使用当前主题外观,还是使用某种直接指定的格式。 </p><h3><span class="ue_t" style="font-family:幼圆">[标题 3]</span></h3><p class="ue_t">对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。</p><p class="ue_t"><br /></p>'
+
+    },
+    {
+        "pre":"pre2.png",
+        'title':lang.resume,
+        'preHtml':'<h1 label="Title left" name="tl" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;"><span style="color:#e36c09;" class=" ">WEB前端开发简历</span></h1><table width="100%" border="1" bordercolor="#95B3D7" style="border-collapse:collapse;"><tbody><tr><td width="100" style="text-align:center;"><p><span style="background-color:transparent;">插</span><br /></p><p>入</p><p>照</p><p>片</p></td><td><p><span style="background-color:transparent;"> 联系电话:</span><span class="ue_t" style="background-color:transparent;">[键入您的电话]</span><br /></p><p><span style="background-color:transparent;"> 电子邮件:</span><span class="ue_t" style="background-color:transparent;">[键入您的电子邮件地址]</span><br /></p><p><span style="background-color:transparent;"> 家庭住址:</span><span class="ue_t" style="background-color:transparent;">[键入您的地址]</span><br /></p></td></tr></tbody></table><h3><span style="color:#E36C09;font-size:20px;">目标职位</span></h3><p style="text-indent:2em;" class=" ">WEB前端研发工程师</p><h3><span style="color:#e36c09;font-size:20px;">学历</span></h3><p><span style="display:none;line-height:0px;" id="_baidu_bookmark_start_26"></span></p><ol style="list-style-type:decimal;"><li><p><span class="ue_t">[起止时间]</span> <span class="ue_t">[学校名称] </span> <span class="ue_t">[所学专业]</span> <span class="ue_t">[所获学位]</span></p></li></ol><h3><span style="color:#e36c09;font-size:20px;" class="ue_t">工作经验</span></h3><p><br /></p>',
+        "html":'<h1 label="Title left" name="tl" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;"><span style="color:#e36c09;" class="ue_t">[此处键入简历标题]</span></h1><p><span style="color:#e36c09;"><br /></span></p><table width="100%" border="1" bordercolor="#95B3D7" style="border-collapse:collapse;"><tbody><tr><td width="200" style="text-align:center;" class="ue_t">【此处插入照片】</td><td><p><br /></p><p> 联系电话:<span class="ue_t">[键入您的电话]</span></p><p><br /></p><p> 电子邮件:<span class="ue_t">[键入您的电子邮件地址]</span></p><p><br /></p><p> 家庭住址:<span class="ue_t">[键入您的地址]</span></p><p><br /></p></td></tr></tbody></table><h3><span style="color:#e36c09;font-size:20px;">目标职位</span></h3><p style="text-indent:2em;" class="ue_t">[此处键入您的期望职位]</p><h3><span style="color:#e36c09;font-size:20px;">学历</span></h3><p><span style="display:none;line-height:0px;" id="_baidu_bookmark_start_26"></span></p><ol style="list-style-type:decimal;"><li><p><span class="ue_t">[键入起止时间]</span> <span class="ue_t">[键入学校名称] </span> <span class="ue_t">[键入所学专业]</span> <span class="ue_t">[键入所获学位]</span></p></li><li><p><span class="ue_t">[键入起止时间]</span> <span class="ue_t">[键入学校名称]</span> <span class="ue_t">[键入所学专业]</span> <span class="ue_t">[键入所获学位]</span></p></li></ol><h3><span style="color:#e36c09;font-size:20px;" class="ue_t">工作经验</span></h3><ol style="list-style-type:decimal;"><li><p><span class="ue_t">[键入起止时间]</span> <span class="ue_t">[键入公司名称]</span> <span class="ue_t">[键入职位名称]</span> </p></li><ol style="list-style-type:lower-alpha;"><li><p><span class="ue_t">[键入负责项目]</span> <span class="ue_t">[键入项目简介]</span></p></li><li><p><span class="ue_t">[键入负责项目]</span> <span class="ue_t">[键入项目简介]</span></p></li></ol><li><p><span class="ue_t">[键入起止时间]</span> <span class="ue_t">[键入公司名称]</span> <span class="ue_t">[键入职位名称]</span> </p></li><ol style="list-style-type:lower-alpha;"><li><p><span class="ue_t">[键入负责项目]</span> <span class="ue_t">[键入项目简介]</span></p></li></ol></ol><p><span style="color:#e36c09;font-size:20px;">掌握技能</span></p><p style="text-indent:2em;"> &nbsp;<span class="ue_t">[这里可以键入您所掌握的技能]</span><br /></p>'
+
+    },
+    {
+        "pre":"pre3.png",
+        'title':lang.richText,
+        'preHtml':'<h1 label="Title center" name="tc" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;" class="ue_t">[此处键入文章标题]</h1><p><img src="http://img.baidu.com/hi/youa/y_0034.gif" width="150" height="100" border="0" hspace="0" vspace="0" style="width:150px;height:100px;float:left;" />图文混排方法</p><p>图片居左,文字围绕图片排版</p><p>方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文</p><p><br /></p><p><img src="http://img.baidu.com/hi/youa/y_0040.gif" width="100" height="100" border="0" hspace="0" vspace="0" style="width:100px;height:100px;float:right;" /></p><p>还有没有什么其他的环绕方式呢?这里是居右环绕</p><p><br /></p><p>欢迎大家多多尝试,为UEditor提供更多高质量模板!</p>',
+        "html":'<p><br /></p><h1 label="Title center" name="tc" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;" class="ue_t">[此处键入文章标题]</h1><p><img src="http://img.baidu.com/hi/youa/y_0034.gif" width="300" height="200" border="0" hspace="0" vspace="0" style="width:300px;height:200px;float:left;" />图文混排方法</p><p>1. 图片居左,文字围绕图片排版</p><p>方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文本</p><p><br /></p><p>2. 图片居右,文字围绕图片排版</p><p>方法:在文字前面插入图片,设置居右对齐,然后即可在左边输入多行文本</p><p><br /></p><p>3. 图片居中环绕排版</p><p>方法:亲,这个真心没有办法。。。</p><p><br /></p><p><br /></p><p><img src="http://img.baidu.com/hi/youa/y_0040.gif" width="300" height="300" border="0" hspace="0" vspace="0" style="width:300px;height:300px;float:right;" /></p><p>还有没有什么其他的环绕方式呢?这里是居右环绕</p><p><br /></p><p>欢迎大家多多尝试,为UEditor提供更多高质量模板!</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p><br /></p>'
+    },
+    {
+        "pre":"pre4.png",
+        'title':lang.sciPapers,
+        'preHtml':'<h2 style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;text-align:center;" class="ue_t">[键入文章标题]</h2><p><strong><span style="font-size:12px;">摘要</span></strong><span style="font-size:12px;" class="ue_t">:这里可以输入很长很长很长很长很长很长很长很长很差的摘要</span></p><p style="line-height:1.5em;"><strong>标题 1</strong></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">这里可以输入很多内容,可以图文混排,可以有列表等。</span></p><p style="line-height:1.5em;"><strong>标题 2</strong></p><ol style="list-style-type:lower-alpha;"><li><p class="ue_t">列表 1</p></li><li><p class="ue_t">列表 2</p></li><ol style="list-style-type:lower-roman;"><li><p class="ue_t">多级列表 1</p></li><li><p class="ue_t">多级列表 2</p></li></ol><li><p class="ue_t">列表 3<br /></p></li></ol><p style="line-height:1.5em;"><strong>标题 3</strong></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">来个文字图文混排的</span></p><p style="text-indent:2em;"><br /></p>',
+        'html':'<h2 style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;text-align:center;" class="ue_t">[键入文章标题]</h2><p><strong><span style="font-size:12px;">摘要</span></strong><span style="font-size:12px;" class="ue_t">:这里可以输入很长很长很长很长很长很长很长很长很差的摘要</span></p><p style="line-height:1.5em;"><strong>标题 1</strong></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">这里可以输入很多内容,可以图文混排,可以有列表等。</span></p><p style="line-height:1.5em;"><strong>标题 2</strong></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">来个列表瞅瞅:</span></p><ol style="list-style-type:lower-alpha;"><li><p class="ue_t">列表 1</p></li><li><p class="ue_t">列表 2</p></li><ol style="list-style-type:lower-roman;"><li><p class="ue_t">多级列表 1</p></li><li><p class="ue_t">多级列表 2</p></li></ol><li><p class="ue_t">列表 3<br /></p></li></ol><p style="line-height:1.5em;"><strong>标题 3</strong></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">来个文字图文混排的</span></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">这里可以多行</span></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">右边是图片</span></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">绝对没有问题的,不信你也可以试试看</span></p><p><br /></p>'
+    }
+];
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/bg.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/bg.gif
new file mode 100644
index 0000000..8c1d10a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/bg.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre0.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre0.png
new file mode 100644
index 0000000..8f3c16a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre0.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre1.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre1.png
new file mode 100644
index 0000000..5a03f96
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre1.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre2.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre2.png
new file mode 100644
index 0000000..5a55672
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre2.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre3.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre3.png
new file mode 100644
index 0000000..d852d29
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre3.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre4.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre4.png
new file mode 100644
index 0000000..0d7bc72
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/images/pre4.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/template.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/template.css
new file mode 100644
index 0000000..6c1608d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/template.css
@@ -0,0 +1,18 @@
+.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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/template.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/template.html
new file mode 100644
index 0000000..d9903a4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/template.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="template.css">
+</head>
+<body>
+    <div class="wrap">
+        <div class="left">
+            <div class="top">
+                <label><var id="lang_template_clear"></var>:<input id="issave" type="checkbox"></label>
+            </div>
+            <div class="bottom border_style1" id="preview"></div>
+        </div>
+        <fieldset  class="right border_style1">
+            <legend><var id="lang_template_select"></var></legend>
+            <div class="pre" id="preitem"></div>
+        </fieldset>
+        <div class="clear"></div>
+    </div>
+    <script type="text/javascript" src="config.js"></script>
+    <script type="text/javascript" src="template.js"></script>
+</body>
+</html>
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/template.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/template/template.js
new file mode 100644
index 0000000..80a334b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/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 += '<div class="preitem" onclick="pre(' + i + ')"><img src="' + "images/" + tmp.pre + '" ' + (tmp.title ? "alt=" + tmp.title + " title=" + tmp.title + "" : "") + '></div>';
+        }
+        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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/bg.png
new file mode 100644
index 0000000..580be0a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/center_focus.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/center_focus.jpg
new file mode 100644
index 0000000..262b029
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/center_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/file-icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/file-icons.gif
new file mode 100644
index 0000000..d8c02c2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/file-icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/file-icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/file-icons.png
new file mode 100644
index 0000000..3ff82c8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/file-icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/icons.gif
new file mode 100644
index 0000000..78459de
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/icons.png
new file mode 100644
index 0000000..12e4700
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/image.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/image.png
new file mode 100644
index 0000000..19699f6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/image.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/left_focus.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/left_focus.jpg
new file mode 100644
index 0000000..7886d27
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/left_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/none_focus.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/none_focus.jpg
new file mode 100644
index 0000000..7c768dc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/none_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/progress.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/progress.png
new file mode 100644
index 0000000..717c486
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/progress.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/right_focus.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/right_focus.jpg
new file mode 100644
index 0000000..173e10d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/right_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/success.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/success.gif
new file mode 100644
index 0000000..8d4f311
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/success.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/success.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/success.png
new file mode 100644
index 0000000..94f968d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/images/success.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.css
new file mode 100644
index 0000000..5870e7a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.css
@@ -0,0 +1,635 @@
+@charset "utf-8";
+.wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative}
+.tabbody{height: 335px;}
+.tabbody .panel {
+    position: absolute;
+    width: 0;
+    height: 0;
+    background: #fff;
+    overflow: hidden;
+    display: none;
+}
+.tabbody .panel.focus {
+    width: 100%;
+    height: 335px;
+    display: block;
+}
+
+.tabbody .panel table td{vertical-align: middle;}
+#videoUrl {
+    width: 490px;
+    height: 21px;
+    line-height: 21px;
+    margin: 8px 5px;
+    background: #FFF;
+    border: 1px solid #d7d7d7;
+}
+#videoSearchTxt{margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;}
+#searchList{width: 570px;overflow: auto;zoom:1;height: 270px;}
+#searchList div{float: left;width: 120px;height: 135px;margin: 5px 15px;}
+#searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*不用缩略图*/
+#searchList p{margin-left: 10px;}
+#videoType{
+    width: 65px;
+    height: 23px;
+    line-height: 22px;
+    border: 1px solid #d7d7d7;
+}
+#videoSearchBtn,#videoSearchReset{
+    /*width: 80px;*/
+    height: 25px;
+    line-height: 25px;
+    background: #eee;
+    border: 1px solid #d7d7d7;
+    cursor: pointer;
+    padding: 0 5px;
+}
+
+
+
+#preview{position: relative;width: 420px;padding:0;overflow: hidden; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left}
+#preview .previewMsg {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;background-color: #666;}
+#preview .previewMsg span{display:block;margin: 125px auto 0 auto;text-align:center;font-size:18px;color:#fff;}
+#preview .previewVideo {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;}
+.edui-video-wrapper fieldset{
+    border: 1px solid #ddd;
+    padding-left: 5px;
+    margin-bottom: 20px;
+    padding-bottom: 5px;
+    width: 115px;
+}
+
+#videoInfo {width: 120px;float: left;margin-left: 10px;_margin-left:7px;}
+fieldset{
+    border: 1px solid #ddd;
+    padding-left: 5px;
+    margin-bottom: 20px;
+    padding-bottom: 5px;
+    width: 115px;
+}
+fieldset legend{font-weight: bold;}
+fieldset p{line-height: 30px;}
+fieldset input.txt{
+    width: 65px;
+    height: 21px;
+    line-height: 21px;
+    margin: 8px 5px;
+    background: #FFF;
+    border: 1px solid #d7d7d7;
+}
+label.url{font-weight: bold;margin-left: 5px;color: #06c;}
+#videoFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;}
+#videoFloat .focus{opacity: 1;filter: alpha(opacity = 100)}
+span.view{display: inline-block;width: 30px;float: right;cursor: pointer;color: blue}
+
+
+
+
+/* upload video */
+.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: 335px;
+    display: block;
+    clip: auto;
+}
+#upload_alignment div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;}
+#upload_alignment .focus{opacity: 1;filter: alpha(opacity = 100)}
+#upload_left { width:427px; float:left; }
+#upload_left .controller { height: 30px; clear: both; }
+#uploadVideoInfo{margin-top:10px;float:right;padding-right:8px;}
+
+#upload .queueList {
+    margin: 0;
+}
+
+#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;
+    margin-right:0;
+    border: 2px dashed #e6e6e6;
+    *border: 0px dashed #e6e6e6;
+    height: 161px;
+    padding-top: 150px;
+    text-align: center;
+    width: 97%;
+    float: left;
+    background: url(./images/image.png) center 70px no-repeat;
+    color: #cccccc;
+    font-size: 18px;
+    position: relative;
+    top:0;
+    *margin-left: 0;
+    *left: 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: 285px;
+}
+
+#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: 15px 0 0 20px;
+    *margin: 15px 0 0 15px;
+    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;
+}
+
+
+/* 在线文件的文件预览图标 */
+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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.html
new file mode 100644
index 0000000..5007882
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="video.css" />
+</head>
+<body>
+<div class="wrapper">
+    <div id="videoTab">
+        <div id="tabHeads" class="tabhead">
+            <span tabSrc="video" class="focus" data-content-id="video"><var id="lang_tab_insertV"></var></span>
+            <span tabSrc="upload" data-content-id="upload"><var id="lang_tab_uploadV"></var></span>
+        </div>
+        <div id="tabBodys" class="tabbody">
+            <div id="video" class="panel focus">
+               <table><tr><td><label for="videoUrl" class="url"><var id="lang_video_url"></var></label></td><td><input id="videoUrl" type="text"></td></tr></table>
+               <div id="preview"></div>
+               <div id="videoInfo">
+                   <fieldset>
+                       <legend><var id="lang_video_size"></var></legend>
+                       <table>
+                           <tr><td><label for="videoWidth"><var id="lang_videoW"></var></label></td><td><input class="txt" id="videoWidth" type="text"/></td></tr>
+                           <tr><td><label for="videoHeight"><var id="lang_videoH"></var></label></td><td><input class="txt" id="videoHeight" type="text"/></td></tr>
+                       </table>
+                   </fieldset>
+                   <fieldset>
+                      <legend><var id="lang_alignment"></var></legend>
+                      <div id="videoFloat"></div>
+                  </fieldset>
+               </div>
+            </div>
+            <div id="upload" class="panel">
+                <div id="upload_left">
+                    <div id="queueList" class="queueList">
+                        <div class="statusBar element-invisible">
+                            <div class="progress">
+                                <span class="text">0%</span>
+                                <span class="percentage"></span>
+                            </div><div class="info"></div>
+                            <div class="btns">
+                                <div id="filePickerBtn"></div>
+                                <div class="uploadBtn"><var id="lang_start_upload"></var></div>
+                            </div>
+                        </div>
+                        <div id="dndArea" class="placeholder">
+                            <div class="filePickerContainer">
+                                <div id="filePickerReady"></div>
+                            </div>
+                        </div>
+                        <ul class="filelist element-invisible">
+                            <li id="filePickerBlock" class="filePickerBlock"></li>
+                        </ul>
+                    </div>
+                </div>
+                <div id="uploadVideoInfo">
+                    <fieldset>
+                        <legend><var id="lang_upload_size"></var></legend>
+                        <table>
+                            <tr><td><label><var id="lang_upload_width"></var></label></td><td><input class="txt" id="upload_width" type="text"/></td></tr>
+                            <tr><td><label><var id="lang_upload_height"></var></label></td><td><input class="txt" id="upload_height" type="text"/></td></tr>
+                        </table>
+                    </fieldset>
+                    <fieldset>
+                        <legend><var id="lang_upload_alignment"></var></legend>
+                        <div id="upload_alignment"></div>
+                    </fieldset>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- jquery -->
+<script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
+
+<!-- webuploader -->
+<script type="text/javascript" src="../../third-party/webuploader/webuploader.min.js"></script>
+<link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
+
+<!-- video -->
+<script type="text/javascript" src="video.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.js
new file mode 100644
index 0000000..8d99b9f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/video/video.js
@@ -0,0 +1,789 @@
+/**
+ * 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);
+
+        $G("preview").innerHTML = '<div class="previewMsg"><span>'+lang.urlError+'</span></div>'+
+        '<embed class="previewVideo" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
+            ' src="' + conUrl + '"' +
+            ' width="' + 420  + '"' +
+            ' height="' + 280  + '"' +
+            ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >' +
+        '</embed>';
+    }
+
+
+    /* 插入上传视频 */
+    function insertUpload(){
+        var videoObjs=[],
+            uploadDir = editor.getOpt('videoUrlPrefix'),
+            width = $G('upload_width').value || 420,
+            height = $G('upload_height').value || 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('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
+            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($('<div>').html(lang.errorNotSupport)).hide();
+                return;
+            } else if (!editor.getOpt('videoActionName')) {
+                $('#filePickerReady').after($('<div>').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 = $('<li id="' + file.id + '">' +
+                        '<p class="title">' + file.name + '</p>' +
+                        '<p class="imgWrap"></p>' +
+                        '<p class="progress"><span></span></p>' +
+                        '</li>'),
+
+                    $btns = $('<div class="file-panel">' +
+                        '<span class="cancel">' + lang.uploadDelete + '</span>' +
+                        '<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
+                        '<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
+                    $prgress = $li.find('p.progress span'),
+                    $wrap = $li.find('p.imgWrap'),
+                    $info = $('<p class="error"></p>').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('<i class="file-preview file-type-' + file.ext.toLowerCase() + '"></i>' +
+                            '<span class="file-title">' + file.name + '</span>');
+                    } 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 = $('<img src="' + src + '">');
+                                    $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('<span class="success"></span>');
+                    } 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();
+        }
+    };
+
+})();
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/webapp/webapp.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/webapp/webapp.html
new file mode 100644
index 0000000..1614377
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/webapp/webapp.html
@@ -0,0 +1,53 @@
+<!DOCTYPE>
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .wrapper{width: 540px; margin: 10px auto;}
+        #appShow {border: 1px solid #ddd;}
+        .errorMsg{font-size: 13px;margin: 10px;color: #dd0000}
+    </style>
+</head>
+<body>
+    <div class="wrapper">
+        <div id="appShow"></div>
+    </div>
+    <script type="text/javascript">
+        //此处配置您在百度上申请到的appkey。
+        var apikey = editor.options.webAppKey;
+        if ( apikey && apikey.length == 24 ) {
+            var searchConfig = {
+                container:'appShow', //容器ID
+                tips:"", //该值用于自动清空
+                search:1, //是否显示搜索框
+                ps:12, //每页显示的条数
+                suggest:1, //是否开启搜索自动完成
+                limit:0, //搜索结果显示条数,0表示无限制
+                searchNow:0, //是否在初始化完成时立即搜索
+                apikey:apikey, //每人得
+                pager:1,
+                cid:7134562,
+                outputHTML:1
+            },baiduApp;
+
+            function clickCallback() {
+                baiduApp.addEventListener( 'getAppHTML', function ( e, data ) {
+                    var url = 'http://app.baidu.com/app/enter?appid='+data.data['app_id'] +'&tn=app_canvas&app_spce_id=1&apikey='+apikey+'&api_key=' + apikey;
+                    editor.execCommand( "webapp", {url:url,width:data.uniWidth,height:data.uniHeight+60,logo:data.data['app_logo'],title:data.data['app_name']});
+                    dialog.close();
+                } );
+            }
+
+            var script = document.createElement( "script" );
+            script.type = "text/javascript";
+            script.src = "http://app.baidu.com/appweb/api/search?auto=yes&container=container&apikey=" + apikey + "&instanceName=baiduApp&callback=clickCallback&config=searchConfig";
+            document.body.appendChild( script );
+        } else {
+            $G( "appShow" ).innerHTML = "<p class='errorMsg'>"+lang.tip1+"<a title='"+lang.anthorApi+"' href='http://app.baidu.com/static/cms/getapikey.html' target='_blank'>"+lang.applyFor+"</a></p><p class='errorMsg'>"+lang.tip2+"</p>" ;
+        }
+
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/fClipboard_ueditor.swf b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/fClipboard_ueditor.swf
new file mode 100644
index 0000000..ac5d27f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/fClipboard_ueditor.swf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/imageUploader.swf b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/imageUploader.swf
new file mode 100644
index 0000000..2a554ca
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/imageUploader.swf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/tangram.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/tangram.js
new file mode 100644
index 0000000..2ebd8fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/tangram.js
@@ -0,0 +1,1495 @@
+// Copyright (c) 2009, Baidu Inc. All rights reserved.
+// 
+// Licensed under the BSD License
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//      http:// tangram.baidu.com/license.html
+// 
+// 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.
+ /**
+ * @namespace T Tangram七巧板
+ * @name T
+ * @version 1.6.0
+*/
+
+/**
+ * 声明baidu包
+ * @author: allstar, erik, meizz, berg
+ */
+var T,
+    baidu = T = baidu || {version: "1.5.0"};
+baidu.guid = "$BAIDU$";
+baidu.$$ = window[baidu.guid] = window[baidu.guid] || {global:{}};
+
+/**
+ * 使用flash资源封装的一些功能
+ * @namespace baidu.flash
+ */
+baidu.flash = baidu.flash || {};
+
+/**
+ * 操作dom的方法
+ * @namespace baidu.dom 
+ */
+baidu.dom = baidu.dom || {};
+
+
+/**
+ * 从文档中获取指定的DOM元素
+ * @name baidu.dom.g
+ * @function
+ * @grammar baidu.dom.g(id)
+ * @param {string|HTMLElement} id 元素的id或DOM元素.
+ * @shortcut g,T.G
+ * @meta standard
+ * @see baidu.dom.q
+ *
+ * @return {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数.
+ */
+baidu.dom.g = function(id) {
+    if (!id) return null;
+    if ('string' == typeof id || id instanceof String) {
+        return document.getElementById(id);
+    } else if (id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {
+        return id;
+    }
+    return null;
+};
+baidu.g = baidu.G = baidu.dom.g;
+
+
+/**
+ * 操作数组的方法
+ * @namespace baidu.array
+ */
+
+baidu.array = baidu.array || {};
+
+
+/**
+ * 遍历数组中所有元素
+ * @name baidu.array.each
+ * @function
+ * @grammar baidu.array.each(source, iterator[, thisObject])
+ * @param {Array} source 需要遍历的数组
+ * @param {Function} iterator 对每个数组元素进行调用的函数,该函数有两个参数,第一个为数组元素,第二个为数组索引值,function (item, index)。
+ * @param {Object} [thisObject] 函数调用时的this指针,如果没有此参数,默认是当前遍历的数组
+ * @remark
+ * each方法不支持对Object的遍历,对Object的遍历使用baidu.object.each 。
+ * @shortcut each
+ * @meta standard
+ *             
+ * @returns {Array} 遍历的数组
+ */
+ 
+baidu.each = baidu.array.forEach = baidu.array.each = function (source, iterator, thisObject) {
+    var returnValue, item, i, len = source.length;
+    
+    if ('function' == typeof iterator) {
+        for (i = 0; i < len; i++) {
+            item = source[i];
+            returnValue = iterator.call(thisObject || source, item, i);
+    
+            if (returnValue === false) {
+                break;
+            }
+        }
+    }
+    return source;
+};
+
+/**
+ * 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。
+ * @namespace baidu.lang
+ */
+baidu.lang = baidu.lang || {};
+
+
+/**
+ * 判断目标参数是否为function或Function实例
+ * @name baidu.lang.isFunction
+ * @function
+ * @grammar baidu.lang.isFunction(source)
+ * @param {Any} source 目标参数
+ * @version 1.2
+ * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
+ * @meta standard
+ * @returns {boolean} 类型判断结果
+ */
+baidu.lang.isFunction = function (source) {
+    return '[object Function]' == Object.prototype.toString.call(source);
+};
+
+/**
+ * 判断目标参数是否string类型或String对象
+ * @name baidu.lang.isString
+ * @function
+ * @grammar baidu.lang.isString(source)
+ * @param {Any} source 目标参数
+ * @shortcut isString
+ * @meta standard
+ * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
+ *             
+ * @returns {boolean} 类型判断结果
+ */
+baidu.lang.isString = function (source) {
+    return '[object String]' == Object.prototype.toString.call(source);
+};
+baidu.isString = baidu.lang.isString;
+
+
+/**
+ * 判断浏览器类型和特性的属性
+ * @namespace baidu.browser
+ */
+baidu.browser = baidu.browser || {};
+
+
+/**
+ * 判断是否为opera浏览器
+ * @property opera opera版本号
+ * @grammar baidu.browser.opera
+ * @meta standard
+ * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome
+ * @returns {Number} opera版本号
+ */
+
+/**
+ * opera 从10开始不是用opera后面的字符串进行版本的判断
+ * 在Browser identification最后添加Version + 数字进行版本标识
+ * opera后面的数字保持在9.80不变
+ */
+baidu.browser.opera = /opera(\/| )(\d+(\.\d+)?)(.+?(version\/(\d+(\.\d+)?)))?/i.test(navigator.userAgent) ?  + ( RegExp["\x246"] || RegExp["\x242"] ) : undefined;
+
+
+/**
+ * 在目标元素的指定位置插入HTML代码
+ * @name baidu.dom.insertHTML
+ * @function
+ * @grammar baidu.dom.insertHTML(element, position, html)
+ * @param {HTMLElement|string} element 目标元素或目标元素的id
+ * @param {string} position 插入html的位置信息,取值为beforeBegin,afterBegin,beforeEnd,afterEnd
+ * @param {string} html 要插入的html
+ * @remark
+ * 
+ * 对于position参数,大小写不敏感<br>
+ * 参数的意思:beforeBegin&lt;span&gt;afterBegin   this is span! beforeEnd&lt;/span&gt; afterEnd <br />
+ * 此外,如果使用本函数插入带有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,'&amp;')
+                .replace(/</g,'&lt;')
+                .replace(/>/g,'&gt;')
+                .replace(/"/g, "&quot;")
+                .replace(/'/g, "&#39;");
+};
+
+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 = ['<object '];
+    for (i = 0, len = objProperties.length; i < len; i++) {
+        item = objProperties[i];
+        str.push(' ', item, '="', encodeHTML(options[item]), '"');
+    }
+    str.push('>');
+    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('<param name="' + k + '" value="' + encodeHTML(item) + '" />');
+        }
+    }
+    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('<embed');
+    var salign;
+    for (k in options) {
+        item = options[k];
+        if (item || item === false || item === 0) {
+            if ((new RegExp("^salign\x24", "i")).test(k)) {
+                salign = item;
+                continue;
+            }
+            
+            str.push(' ', k, '="', encodeHTML(item), '"');
+        }
+    }
+    
+    if (salign) {
+        str.push(' salign="', encodeHTML(salign), '"');
+    }
+    str.push('></embed></object>');
+    
+    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相同的成员将会被覆盖。<br>
+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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/wordimage.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/wordimage.html
new file mode 100644
index 0000000..6cf6067
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/wordimage.html
@@ -0,0 +1,111 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .wrapper{width: 600px;padding: 10px;height: 352px;overflow: hidden;position: relative;border-bottom: 1px solid #d7d7d7}
+        .localPath input{float: left;width: 350px;line-height: 20px;height: 20px;}
+        #clipboard{float:left;width: 70px;height: 30px; }
+        .description{ color: #0066cc; margin-top: 2px; width: 450px; height: 45px;float: left;line-height: 22px}
+        #upload{width: 100px;height: 30px;float: right; margin:10px 2px 0 0;cursor: pointer;}
+        #msg{ width: 140px; height: 30px; line-height:25px;float: left;color: red}
+    </style>
+</head>
+<body>
+    <div class="wrapper">
+        <div class="localPath">
+            <input id="localPath" type="text" readonly />
+            <div id="clipboard"></div>
+            <div id="msg"></div>
+        </div>
+        <div id="flashContainer"></div>
+        <div>
+            <div id="upload" style="display: none" ><img id="uploadBtn"></div>
+            <div class="description">
+                <span style="color: red"><var id="lang_resave"></var>: </span><var id="lang_step"></var>
+            </div>
+          </div>
+    </div>
+    <script type="text/javascript" src="tangram.js"></script>
+    <script type="text/javascript" src="wordimage.js"></script>
+    <script type="text/javascript">
+        editor.setOpt({
+            wordImageFieldName:"upfile",
+            compressSide:0,
+            maxImageSideLength:900
+        });
+
+            //全局变量
+        var imageUrls = [],          //用于保存从服务器返回的图片信息数组
+            selectedImageCount = 0,  //当前已选择的但未上传的图片数量
+            optImageUrl = editor.getActionUrl(editor.getOpt('imageActionName')),
+            optImageFieldName = editor.getOpt('imageFieldName'),
+            optImageCompressBorder = editor.getOpt('imageCompressEnable') ? editor.getOpt('imageCompressBorder'):null,
+            maxSize = editor.getOpt('imageMaxSize') / 1024,
+            extension = editor.getOpt('imageAllowFiles').join(';').replace(/\./g, '*.');
+
+        /* 添加额外的GET参数 */
+        var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
+            urlWidthParams = optImageUrl + (optImageUrl.indexOf('?') == -1 ? '?':'&') + params;
+
+        utils.domReady(function(){
+            //创建Flash相关的参数集合
+            var flashOptions = {
+                container:"flashContainer",                                                    //flash容器id
+                url:urlWidthParams,                                           // 上传处理页面的url地址
+                ext:editor.queryCommandValue('serverParam') || {},                                 //可向服务器提交的自定义参数列表
+                fileType:'{"description":"'+lang.fileType+'", "extension":"' + extension + '"}',     //上传文件格式限制
+                flashUrl:'imageUploader.swf',                                                  //上传用的flash组件地址
+                width:600,          //flash的宽度
+                height:272,         //flash的高度
+                gridWidth:120,     // 每一个预览图片所占的宽度
+                gridHeight:120,    // 每一个预览图片所占的高度
+                picWidth:100,      // 单张预览图片的宽度
+                picHeight:100,     // 单张预览图片的高度
+                uploadDataFieldName: optImageFieldName,    // POST请求中图片数据的key
+                picDescFieldName:'pictitle',      // POST请求中图片描述的key
+                maxSize: maxSize,                         // 文件的最大体积,单位M
+                compressSize:1,                   // 上传前如果图片体积超过该值,会先压缩,单位M
+                maxNum:32,                         // 单次最大可上传多少个文件
+                compressSide: 0,                 //等比压缩的基准,0为按照最长边,1为按照宽度,2为按照高度
+                compressLength: optImageCompressBorder        //能接受的最大边长,超过该值Flash会自动等比压缩
+            };
+            //回调函数集合,支持传递函数名的字符串、函数句柄以及函数本身三种类型
+            var callbacks={
+                selectFileCallback: function(selectFiles){                // 选择文件的回调
+                    selectedImageCount += selectFiles.length;
+                    if(selectedImageCount) baidu.g("upload").style.display = "";
+                    dialog.buttons[0].setDisabled(true); //初始化时置灰确定按钮
+                },
+                deleteFileCallback: function(delFiles){                 // 删除文件的回调
+                    selectedImageCount -= delFiles.length;
+                    if (!selectedImageCount) {
+                        baidu.g("upload").style.display = "none";
+                        dialog.buttons[0].setDisabled(false);         //没有选择图片时重新点亮按钮
+                    }
+                },
+                uploadCompleteCallback: function(data){               // 单个文件上传完成的回调
+                    try{var info = eval("(" + data.info + ")");
+                    info && imageUrls.push(info);
+                    selectedImageCount--;
+                    }catch(e){}
+                },
+                uploadErrorCallback: function (data){         // 单个文件上传失败的回调,
+                    console && console.log(data);
+                },
+                allCompleteCallback: function(){              // 全部上传完成时的回调
+                    dialog.buttons[0].setDisabled(false);    //上传完毕后点亮按钮
+                }
+                //exceedFileCallback: 'exceedFileCallback',   // 文件超出限制的最大体积时的回调
+                //startUploadCallback: startUploadCallback    // 开始上传某个文件时的回调
+            };
+            wordImage.init(flashOptions,callbacks);
+        });
+
+    </script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/wordimage.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/wordimage.js
new file mode 100644
index 0000000..98f3a22
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/dialogs/wordimage/wordimage.js
@@ -0,0 +1,157 @@
+/**
+ * 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 + "</br>";
+	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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/index.html b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/index.html
new file mode 100644
index 0000000..a416418
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/index.html
@@ -0,0 +1,175 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title>完整demo</title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" charset="utf-8" src="ueditor.config.js"></script>
+    <script type="text/javascript" charset="utf-8" src="ueditor.all.min.js"> </script>
+    <!--建议手动加在语言,避免在ie下有时因为加载语言失败导致编辑器加载失败-->
+    <!--这里加载的语言文件会覆盖你在配置项目里添加的语言类型,比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文-->
+    <script type="text/javascript" charset="utf-8" src="lang/zh-cn/zh-cn.js"></script>
+
+    <style type="text/css">
+        div{
+            width:100%;
+        }
+    </style>
+</head>
+<body>
+<div>
+    <h1>完整demo</h1>
+    <script id="editor" type="text/plain" style="width:1024px;height:500px;"></script>
+</div>
+<div id="btns">
+    <div>
+        <button onclick="getAllHtml()">获得整个html的内容</button>
+        <button onclick="getContent()">获得内容</button>
+        <button onclick="setContent()">写入内容</button>
+        <button onclick="setContent(true)">追加内容</button>
+        <button onclick="getContentTxt()">获得纯文本</button>
+        <button onclick="getPlainTxt()">获得带格式的纯文本</button>
+        <button onclick="hasContent()">判断是否有内容</button>
+        <button onclick="setFocus()">使编辑器获得焦点</button>
+        <button onmousedown="isFocus(event)">编辑器是否获得焦点</button>
+        <button onmousedown="setblur(event)" >编辑器失去焦点</button>
+
+    </div>
+    <div>
+        <button onclick="getText()">获得当前选中的文本</button>
+        <button onclick="insertHtml()">插入给定的内容</button>
+        <button id="enable" onclick="setEnabled()">可以编辑</button>
+        <button onclick="setDisabled()">不可编辑</button>
+        <button onclick=" UE.getEditor('editor').setHide()">隐藏编辑器</button>
+        <button onclick=" UE.getEditor('editor').setShow()">显示编辑器</button>
+        <button onclick=" UE.getEditor('editor').setHeight(300)">设置高度为300默认关闭了自动长高</button>
+    </div>
+
+    <div>
+        <button onclick="getLocalData()" >获取草稿箱内容</button>
+        <button onclick="clearLocalData()" >清空草稿箱</button>
+    </div>
+
+</div>
+<div>
+    <button onclick="createEditor()">
+    创建编辑器</button>
+    <button onclick="deleteEditor()">
+    删除编辑器</button>
+</div>
+
+<script type="text/javascript">
+
+    //实例化编辑器
+    //建议使用工厂方法getEditor创建和引用编辑器实例,如果在某个闭包下引用该编辑器,直接调用UE.getEditor('editor')就能拿到相关的实例
+    var ue = UE.getEditor('editor');
+
+
+    function isFocus(e){
+        alert(UE.getEditor('editor').isFocus());
+        UE.dom.domUtils.preventDefault(e)
+    }
+    function setblur(e){
+        UE.getEditor('editor').blur();
+        UE.dom.domUtils.preventDefault(e)
+    }
+    function insertHtml() {
+        var value = prompt('插入html代码', '');
+        UE.getEditor('editor').execCommand('insertHtml', value)
+    }
+    function createEditor() {
+        enableBtn();
+        UE.getEditor('editor');
+    }
+    function getAllHtml() {
+        alert(UE.getEditor('editor').getAllHtml())
+    }
+    function getContent() {
+        var arr = [];
+        arr.push("使用editor.getContent()方法可以获得编辑器的内容");
+        arr.push("内容为:");
+        arr.push(UE.getEditor('editor').getContent());
+        alert(arr.join("\n"));
+    }
+    function getPlainTxt() {
+        var arr = [];
+        arr.push("使用editor.getPlainTxt()方法可以获得编辑器的带格式的纯文本内容");
+        arr.push("内容为:");
+        arr.push(UE.getEditor('editor').getPlainTxt());
+        alert(arr.join('\n'))
+    }
+    function setContent(isAppendTo) {
+        var arr = [];
+        arr.push("使用editor.setContent('欢迎使用ueditor')方法可以设置编辑器的内容");
+        UE.getEditor('editor').setContent('欢迎使用ueditor', isAppendTo);
+        alert(arr.join("\n"));
+    }
+    function setDisabled() {
+        UE.getEditor('editor').setDisabled('fullscreen');
+        disableBtn("enable");
+    }
+
+    function setEnabled() {
+        UE.getEditor('editor').setEnabled();
+        enableBtn();
+    }
+
+    function getText() {
+        //当你点击按钮时编辑区域已经失去了焦点,如果直接用getText将不会得到内容,所以要在选回来,然后取得内容
+        var range = UE.getEditor('editor').selection.getRange();
+        range.select();
+        var txt = UE.getEditor('editor').selection.getText();
+        alert(txt)
+    }
+
+    function getContentTxt() {
+        var arr = [];
+        arr.push("使用editor.getContentTxt()方法可以获得编辑器的纯文本内容");
+        arr.push("编辑器的纯文本内容为:");
+        arr.push(UE.getEditor('editor').getContentTxt());
+        alert(arr.join("\n"));
+    }
+    function hasContent() {
+        var arr = [];
+        arr.push("使用editor.hasContents()方法判断编辑器里是否有内容");
+        arr.push("判断结果为:");
+        arr.push(UE.getEditor('editor').hasContents());
+        alert(arr.join("\n"));
+    }
+    function setFocus() {
+        UE.getEditor('editor').focus();
+    }
+    function deleteEditor() {
+        disableBtn();
+        UE.getEditor('editor').destroy();
+    }
+    function disableBtn(str) {
+        var div = document.getElementById('btns');
+        var btns = UE.dom.domUtils.getElementsByTagName(div, "button");
+        for (var i = 0, btn; btn = btns[i++];) {
+            if (btn.id == str) {
+                UE.dom.domUtils.removeAttributes(btn, ["disabled"]);
+            } else {
+                btn.setAttribute("disabled", "true");
+            }
+        }
+    }
+    function enableBtn() {
+        var div = document.getElementById('btns');
+        var btns = UE.dom.domUtils.getElementsByTagName(div, "button");
+        for (var i = 0, btn; btn = btns[i++];) {
+            UE.dom.domUtils.removeAttributes(btn, ["disabled"]);
+        }
+    }
+
+    function getLocalData () {
+        alert(UE.getEditor('editor').execCommand( "getlocaldata" ));
+    }
+
+    function clearLocalData () {
+        UE.getEditor('editor').execCommand( "clearlocaldata" );
+        alert("已清空草稿箱")
+    }
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/config.json b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/config.json
new file mode 100644
index 0000000..53b6c97
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/config.json
@@ -0,0 +1,94 @@
+/* 前后端通信相关的配置,注释只允许使用多行方式 */
+{
+    /* 上传图片配置项 */
+    "imageActionName": "uploadimage", /* 执行上传图片的action名称 */
+    "imageFieldName": "upfile", /* 提交的图片表单名称 */
+    "imageMaxSize": 2048000, /* 上传大小限制,单位B */
+    "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */
+    "imageCompressEnable": true, /* 是否压缩图片,默认是true */
+    "imageCompressBorder": 1600, /* 图片压缩最长边限制 */
+    "imageInsertAlign": "none", /* 插入的图片浮动方式 */
+    "imageUrlPrefix": "", /* 图片访问路径前缀 */
+    "imagePathFormat": "/ueditor/jsp/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": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */
+    "scrawlUrlPrefix": "", /* 图片访问路径前缀 */
+    "scrawlInsertAlign": "none",
+
+    /* 截图工具上传 */
+    "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */
+    "snapscreenPathFormat": "/ueditor/jsp/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": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "catcherUrlPrefix": "", /* 图片访问路径前缀 */
+    "catcherMaxSize": 2048000, /* 上传大小限制,单位B */
+    "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */
+
+    /* 上传视频配置 */
+    "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */
+    "videoFieldName": "upfile", /* 提交的视频表单名称 */
+    "videoPathFormat": "/ueditor/jsp/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": "/ueditor/jsp/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"
+    ], /* 上传文件格式显示 */
+
+    /* 列出指定目录下的图片 */
+    "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */
+    "imageManagerListPath": "/ueditor/jsp/upload/image/", /* 指定要列出图片的目录 */
+    "imageManagerListSize": 20, /* 每次列出文件数量 */
+    "imageManagerUrlPrefix": "", /* 图片访问路径前缀 */
+    "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */
+    "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */
+
+    /* 列出指定目录下的文件 */
+    "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */
+    "fileManagerListPath": "/ueditor/jsp/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"
+    ] /* 列出的文件类型 */
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/controller.jsp b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/controller.jsp
new file mode 100644
index 0000000..6a3ef2f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/controller.jsp
@@ -0,0 +1,14 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+	import="com.baidu.ueditor.ActionEnter"
+    pageEncoding="UTF-8"%>
+<%@ page trimDirectiveWhitespaces="true" %>
+<%
+
+    request.setCharacterEncoding( "utf-8" );
+	response.setHeader("Content-Type" , "text/html");
+	
+	String rootPath = application.getRealPath( "/" );
+	
+	out.write( new ActionEnter( request, rootPath ).exec() );
+	
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/ActionEnter.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/ActionEnter.java
new file mode 100644
index 0000000..33a3dc7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/ActionEnter.java
@@ -0,0 +1,127 @@
+package com.baidu.ueditor;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.baidu.ueditor.define.ActionMap;
+import com.baidu.ueditor.define.AppInfo;
+import com.baidu.ueditor.define.BaseState;
+import com.baidu.ueditor.define.State;
+import com.baidu.ueditor.hunter.FileManager;
+import com.baidu.ueditor.hunter.ImageHunter;
+import com.baidu.ueditor.upload.Uploader;
+
+public class ActionEnter {
+	
+	private HttpServletRequest request = null;
+	
+	private String rootPath = null;
+	private String contextPath = null;
+	
+	private String actionType = null;
+	
+	private ConfigManager configManager = null;
+
+	public ActionEnter ( HttpServletRequest request, String rootPath ) {
+		
+		this.request = request;
+		this.rootPath = rootPath;
+		this.actionType = request.getParameter( "action" );
+		this.contextPath = request.getContextPath();
+		this.configManager = ConfigManager.getInstance( this.rootPath, this.contextPath, request.getRequestURI() );
+		
+	}
+	
+	public String exec () {
+		
+		String callbackName = this.request.getParameter("callback");
+		
+		if ( callbackName != null ) {
+
+			if ( !validCallbackName( callbackName ) ) {
+				return new BaseState( false, AppInfo.ILLEGAL ).toJSONString();
+			}
+			
+			return callbackName+"("+this.invoke()+");";
+			
+		} else {
+			return this.invoke();
+		}
+
+	}
+	
+	public String invoke() {
+		
+		if ( actionType == null || !ActionMap.mapping.containsKey( actionType ) ) {
+			return new BaseState( false, AppInfo.INVALID_ACTION ).toJSONString();
+		}
+		
+		if ( this.configManager == null || !this.configManager.valid() ) {
+			return new BaseState( false, AppInfo.CONFIG_ERROR ).toJSONString();
+		}
+		
+		State state = null;
+		
+		int actionCode = ActionMap.getType( this.actionType );
+		
+		Map<String, Object> conf = null;
+		
+		switch ( actionCode ) {
+		
+			case ActionMap.CONFIG:
+				return this.configManager.getAllConfig().toString();
+				
+			case ActionMap.UPLOAD_IMAGE:
+			case ActionMap.UPLOAD_SCRAWL:
+			case ActionMap.UPLOAD_VIDEO:
+			case ActionMap.UPLOAD_FILE:
+				conf = this.configManager.getConfig( actionCode );
+				state = new Uploader( request, conf ).doExec();
+				break;
+				
+			case ActionMap.CATCH_IMAGE:
+				conf = configManager.getConfig( actionCode );
+				String[] list = this.request.getParameterValues( (String)conf.get( "fieldName" ) );
+				state = new ImageHunter( conf ).capture( list );
+				break;
+				
+			case ActionMap.LIST_IMAGE:
+			case ActionMap.LIST_FILE:
+				conf = configManager.getConfig( actionCode );
+				int start = this.getStartIndex();
+				state = new FileManager( conf ).listFile( start );
+				break;
+				
+		}
+		
+		return state.toJSONString();
+		
+	}
+	
+	public int getStartIndex () {
+		
+		String start = this.request.getParameter( "start" );
+		
+		try {
+			return Integer.parseInt( start );
+		} catch ( Exception e ) {
+			return 0;
+		}
+		
+	}
+	
+	/**
+	 * callback参数验证
+	 */
+	public boolean validCallbackName ( String name ) {
+		
+		if ( name.matches( "^[a-zA-Z_]+[\\w0-9_]*$" ) ) {
+			return true;
+		}
+		
+		return false;
+		
+	}
+	
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/ConfigManager.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/ConfigManager.java
new file mode 100644
index 0000000..5551ee9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/ConfigManager.java
@@ -0,0 +1,222 @@
+package com.baidu.ueditor;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import com.baidu.ueditor.define.ActionMap;
+
+/**
+ * 配置管理器
+ * @author hancong03@baidu.com
+ *
+ */
+public final class ConfigManager {
+
+	private final String rootPath;
+	private final String originalPath;
+	private final String contextPath;
+	private static final String configFileName = "config.json";
+	private String parentPath = null;
+	private JSONObject jsonConfig = null;
+	// 涂鸦上传filename定义
+	private final static String SCRAWL_FILE_NAME = "scrawl";
+	// 远程图片抓取filename定义
+	private final static String REMOTE_FILE_NAME = "remote";
+	
+	/*
+	 * 通过一个给定的路径构建一个配置管理器, 该管理器要求地址路径所在目录下必须存在config.properties文件
+	 */
+	private ConfigManager ( String rootPath, String contextPath, String uri ) throws FileNotFoundException, IOException {
+		
+		rootPath = rootPath.replace( "\\", "/" );
+		
+		this.rootPath = rootPath;
+		this.contextPath = contextPath;
+		
+		if ( contextPath.length() > 0 ) {
+			this.originalPath = this.rootPath + uri.substring( contextPath.length() );
+		} else {
+			this.originalPath = this.rootPath + uri;
+		}
+		
+		this.initEnv();
+		
+	}
+	
+	/**
+	 * 配置管理器构造工厂
+	 * @param rootPath 服务器根路径
+	 * @param contextPath 服务器所在项目路径
+	 * @param uri 当前访问的uri
+	 * @return 配置管理器实例或者null
+	 */
+	public static ConfigManager getInstance ( String rootPath, String contextPath, String uri ) {
+		
+		try {
+			return new ConfigManager(rootPath, contextPath, uri);
+		} catch ( Exception e ) {
+			return null;
+		}
+		
+	}
+	
+	// 验证配置文件加载是否正确
+	public boolean valid () {
+		return this.jsonConfig != null;
+	}
+	
+	public JSONObject getAllConfig () {
+		
+		return this.jsonConfig;
+		
+	}
+	
+	public Map<String, Object> getConfig ( int type ) {
+		
+		Map<String, Object> conf = new HashMap<String, Object>();
+		String savePath = null;
+		
+		switch ( type ) {
+		
+			case ActionMap.UPLOAD_FILE:
+				conf.put( "isBase64", "false" );
+				conf.put( "maxSize", this.jsonConfig.getLong( "fileMaxSize" ) );
+				conf.put( "allowFiles", this.getArray( "fileAllowFiles" ) );
+				conf.put( "fieldName", this.jsonConfig.getString( "fileFieldName" ) );
+				savePath = this.jsonConfig.getString( "filePathFormat" );
+				break;
+				
+			case ActionMap.UPLOAD_IMAGE:
+				conf.put( "isBase64", "false" );
+				conf.put( "maxSize", this.jsonConfig.getLong( "imageMaxSize" ) );
+				conf.put( "allowFiles", this.getArray( "imageAllowFiles" ) );
+				conf.put( "fieldName", this.jsonConfig.getString( "imageFieldName" ) );
+				savePath = this.jsonConfig.getString( "imagePathFormat" );
+				break;
+				
+			case ActionMap.UPLOAD_VIDEO:
+				conf.put( "maxSize", this.jsonConfig.getLong( "videoMaxSize" ) );
+				conf.put( "allowFiles", this.getArray( "videoAllowFiles" ) );
+				conf.put( "fieldName", this.jsonConfig.getString( "videoFieldName" ) );
+				savePath = this.jsonConfig.getString( "videoPathFormat" );
+				break;
+				
+			case ActionMap.UPLOAD_SCRAWL:
+				conf.put( "filename", ConfigManager.SCRAWL_FILE_NAME );
+				conf.put( "maxSize", this.jsonConfig.getLong( "scrawlMaxSize" ) );
+				conf.put( "fieldName", this.jsonConfig.getString( "scrawlFieldName" ) );
+				conf.put( "isBase64", "true" );
+				savePath = this.jsonConfig.getString( "scrawlPathFormat" );
+				break;
+				
+			case ActionMap.CATCH_IMAGE:
+				conf.put( "filename", ConfigManager.REMOTE_FILE_NAME );
+				conf.put( "filter", this.getArray( "catcherLocalDomain" ) );
+				conf.put( "maxSize", this.jsonConfig.getLong( "catcherMaxSize" ) );
+				conf.put( "allowFiles", this.getArray( "catcherAllowFiles" ) );
+				conf.put( "fieldName", this.jsonConfig.getString( "catcherFieldName" ) + "[]" );
+				savePath = this.jsonConfig.getString( "catcherPathFormat" );
+				break;
+				
+			case ActionMap.LIST_IMAGE:
+				conf.put( "allowFiles", this.getArray( "imageManagerAllowFiles" ) );
+				conf.put( "dir", this.jsonConfig.getString( "imageManagerListPath" ) );
+				conf.put( "count", this.jsonConfig.getInt( "imageManagerListSize" ) );
+				break;
+				
+			case ActionMap.LIST_FILE:
+				conf.put( "allowFiles", this.getArray( "fileManagerAllowFiles" ) );
+				conf.put( "dir", this.jsonConfig.getString( "fileManagerListPath" ) );
+				conf.put( "count", this.jsonConfig.getInt( "fileManagerListSize" ) );
+				break;
+				
+		}
+		
+		conf.put( "savePath", savePath );
+		conf.put( "rootPath", this.rootPath );
+		
+		return conf;
+		
+	}
+	
+	private void initEnv () throws FileNotFoundException, IOException {
+		
+		File file = new File( this.originalPath );
+		
+		if ( !file.isAbsolute() ) {
+			file = new File( file.getAbsolutePath() );
+		}
+		
+		this.parentPath = file.getParent();
+		
+		String configContent = this.readFile( this.getConfigPath() );
+		
+		try{
+			JSONObject jsonConfig = new JSONObject( configContent );
+			this.jsonConfig = jsonConfig;
+		} catch ( Exception e ) {
+			this.jsonConfig = null;
+		}
+		
+	}
+	
+	private String getConfigPath () {
+		return this.parentPath + File.separator + ConfigManager.configFileName;
+	}
+
+	private String[] getArray ( String key ) {
+		
+		JSONArray jsonArray = this.jsonConfig.getJSONArray( key );
+		String[] result = new String[ jsonArray.length() ];
+		
+		for ( int i = 0, len = jsonArray.length(); i < len; i++ ) {
+			result[i] = jsonArray.getString( i );
+		}
+		
+		return result;
+		
+	}
+	
+	private String readFile ( String path ) throws IOException {
+		
+		StringBuilder builder = new StringBuilder();
+		
+		try {
+			
+			InputStreamReader reader = new InputStreamReader( new FileInputStream( path ), "UTF-8" );
+			BufferedReader bfReader = new BufferedReader( reader );
+			
+			String tmpContent = null;
+			
+			while ( ( tmpContent = bfReader.readLine() ) != null ) {
+				builder.append( tmpContent );
+			}
+			
+			bfReader.close();
+			
+		} catch ( UnsupportedEncodingException e ) {
+			// 忽略
+		}
+		
+		return this.filter( builder.toString() );
+		
+	}
+	
+	// 过滤输入字符串, 剔除多行注释以及替换掉反斜杠
+	private String filter ( String input ) {
+		
+		return input.replaceAll( "/\\*[\\s\\S]*?\\*/", "" );
+		
+	}
+	
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/Encoder.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/Encoder.java
new file mode 100644
index 0000000..00bce19
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/Encoder.java
@@ -0,0 +1,24 @@
+package com.baidu.ueditor;
+
+public class Encoder {
+
+	public static String toUnicode ( String input ) {
+		
+		StringBuilder builder = new StringBuilder();
+		char[] chars = input.toCharArray();
+		
+		for ( char ch : chars ) {
+			
+			if ( ch < 256 ) {
+				builder.append( ch );
+			} else {
+				builder.append( "\\u" +  Integer.toHexString( ch& 0xffff ) );
+			}
+			
+		}
+		
+		return builder.toString();
+		
+	}
+	
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/PathFormat.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/PathFormat.java
new file mode 100644
index 0000000..080ea48
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/PathFormat.java
@@ -0,0 +1,157 @@
+package com.baidu.ueditor;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class PathFormat {
+	
+	private static final String TIME = "time";
+	private static final String FULL_YEAR = "yyyy";
+	private static final String YEAR = "yy";
+	private static final String MONTH = "mm";
+	private static final String DAY = "dd";
+	private static final String HOUR = "hh";
+	private static final String MINUTE = "ii";
+	private static final String SECOND = "ss";
+	private static final String RAND = "rand";
+	
+	private static Date currentDate = null;
+	
+	public static String parse ( String input ) {
+		
+		Pattern pattern = Pattern.compile( "\\{([^\\}]+)\\}", Pattern.CASE_INSENSITIVE  );
+		Matcher matcher = pattern.matcher(input);
+		
+		PathFormat.currentDate = new Date();
+		
+		StringBuffer sb = new StringBuffer();
+		
+		while ( matcher.find() ) {
+			
+			matcher.appendReplacement(sb, PathFormat.getString( matcher.group( 1 ) ) );
+			
+		}
+		
+		matcher.appendTail(sb);
+		
+		return sb.toString();
+	}
+	
+	/**
+	 * 格式化路径, 把windows路径替换成标准路径
+	 * @param input 待格式化的路径
+	 * @return 格式化后的路径
+	 */
+	public static String format ( String input ) {
+		
+		return input.replace( "\\", "/" );
+		
+	}
+
+	public static String parse ( String input, String filename ) {
+	
+		Pattern pattern = Pattern.compile( "\\{([^\\}]+)\\}", Pattern.CASE_INSENSITIVE  );
+		Matcher matcher = pattern.matcher(input);
+		String matchStr = null;
+		
+		PathFormat.currentDate = new Date();
+		
+		StringBuffer sb = new StringBuffer();
+		
+		while ( matcher.find() ) {
+			
+			matchStr = matcher.group( 1 );
+			if ( matchStr.indexOf( "filename" ) != -1 ) {
+				filename = filename.replace( "$", "\\$" ).replaceAll( "[\\/:*?\"<>|]", "" );
+				matcher.appendReplacement(sb, filename );
+			} else {
+				matcher.appendReplacement(sb, PathFormat.getString( matchStr ) );
+			}
+			
+		}
+		
+		matcher.appendTail(sb);
+		
+		return sb.toString();
+	}
+		
+	private static String getString ( String pattern ) {
+		
+		pattern = pattern.toLowerCase();
+		
+		// time 处理
+		if ( pattern.indexOf( PathFormat.TIME ) != -1 ) {
+			return PathFormat.getTimestamp();
+		} else if ( pattern.indexOf( PathFormat.FULL_YEAR ) != -1 ) {
+			return PathFormat.getFullYear();
+		} else if ( pattern.indexOf( PathFormat.YEAR ) != -1 ) {
+			return PathFormat.getYear();
+		} else if ( pattern.indexOf( PathFormat.MONTH ) != -1 ) {
+			return PathFormat.getMonth();
+		} else if ( pattern.indexOf( PathFormat.DAY ) != -1 ) {
+			return PathFormat.getDay();
+		} else if ( pattern.indexOf( PathFormat.HOUR ) != -1 ) {
+			return PathFormat.getHour();
+		} else if ( pattern.indexOf( PathFormat.MINUTE ) != -1 ) {
+			return PathFormat.getMinute();
+		} else if ( pattern.indexOf( PathFormat.SECOND ) != -1 ) {
+			return PathFormat.getSecond();
+		} else if ( pattern.indexOf( PathFormat.RAND ) != -1 ) {
+			return PathFormat.getRandom( pattern );
+		}
+		
+		return pattern;
+		
+	}
+
+	private static String getTimestamp () {
+		return System.currentTimeMillis() + "";
+	}
+	
+	private static String getFullYear () {
+		return new SimpleDateFormat( "yyyy" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getYear () {
+		return new SimpleDateFormat( "yy" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getMonth () {
+		return new SimpleDateFormat( "MM" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getDay () {
+		return new SimpleDateFormat( "dd" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getHour () {
+		return new SimpleDateFormat( "HH" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getMinute () {
+		return new SimpleDateFormat( "mm" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getSecond () {
+		return new SimpleDateFormat( "ss" ).format( PathFormat.currentDate );
+	}
+	
+	private static String getRandom ( String pattern ) {
+		
+		int length = 0;
+		pattern = pattern.split( ":" )[ 1 ].trim();
+		
+		length = Integer.parseInt( pattern );
+		
+		return ( Math.random() + "" ).replace( ".", "" ).substring( 0, length );
+		
+	}
+
+	public static void main(String[] args) {
+		// TODO Auto-generated method stub
+
+	}
+
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/ActionMap.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/ActionMap.java
new file mode 100644
index 0000000..88f4f32
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/ActionMap.java
@@ -0,0 +1,42 @@
+package com.baidu.ueditor.define;
+
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * 定义请求action类型
+ * @author hancong03@baidu.com
+ *
+ */
+@SuppressWarnings("serial")
+public final class ActionMap {
+
+	public static final Map<String, Integer> mapping;
+	// 获取配置请求
+	public static final int CONFIG = 0;
+	public static final int UPLOAD_IMAGE = 1;
+	public static final int UPLOAD_SCRAWL = 2;
+	public static final int UPLOAD_VIDEO = 3;
+	public static final int UPLOAD_FILE = 4;
+	public static final int CATCH_IMAGE = 5;
+	public static final int LIST_FILE = 6;
+	public static final int LIST_IMAGE = 7;
+	
+	static {
+		mapping = new HashMap<String, Integer>(){{
+			put( "config", ActionMap.CONFIG );
+			put( "uploadimage", ActionMap.UPLOAD_IMAGE );
+			put( "uploadscrawl", ActionMap.UPLOAD_SCRAWL );
+			put( "uploadvideo", ActionMap.UPLOAD_VIDEO );
+			put( "uploadfile", ActionMap.UPLOAD_FILE );
+			put( "catchimage", ActionMap.CATCH_IMAGE );
+			put( "listfile", ActionMap.LIST_FILE );
+			put( "listimage", ActionMap.LIST_IMAGE );
+		}};
+	}
+	
+	public static int getType ( String key ) {
+		return ActionMap.mapping.get( key );
+	}
+	
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/ActionState.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/ActionState.java
new file mode 100644
index 0000000..b0fad34
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/ActionState.java
@@ -0,0 +1,5 @@
+package com.baidu.ueditor.define;
+
+public enum ActionState {
+	UNKNOW_ERROR
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/AppInfo.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/AppInfo.java
new file mode 100644
index 0000000..b869f2a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/AppInfo.java
@@ -0,0 +1,77 @@
+package com.baidu.ueditor.define;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public final class AppInfo {
+	
+	public static final int SUCCESS = 0;
+	public static final int MAX_SIZE = 1;
+	public static final int PERMISSION_DENIED = 2;
+	public static final int FAILED_CREATE_FILE = 3;
+	public static final int IO_ERROR = 4;
+	public static final int NOT_MULTIPART_CONTENT = 5;
+	public static final int PARSE_REQUEST_ERROR = 6;
+	public static final int NOTFOUND_UPLOAD_DATA = 7;
+	public static final int NOT_ALLOW_FILE_TYPE = 8;
+	
+	public static final int INVALID_ACTION = 101;
+	public static final int CONFIG_ERROR = 102;
+	
+	public static final int PREVENT_HOST = 201;
+	public static final int CONNECTION_ERROR = 202;
+	public static final int REMOTE_FAIL = 203;
+	
+	public static final int NOT_DIRECTORY = 301;
+	public static final int NOT_EXIST = 302;
+	
+	public static final int ILLEGAL = 401;
+
+	public static Map<Integer, String> info = new HashMap<Integer, String>(){{
+		
+		put( AppInfo.SUCCESS, "SUCCESS" );
+		
+		// 无效的Action
+		put( AppInfo.INVALID_ACTION, "\u65E0\u6548\u7684Action" );
+		// 配置文件初始化失败
+		put( AppInfo.CONFIG_ERROR, "\u914D\u7F6E\u6587\u4EF6\u521D\u59CB\u5316\u5931\u8D25" );
+		// 抓取远程图片失败
+		put( AppInfo.REMOTE_FAIL, "\u6293\u53D6\u8FDC\u7A0B\u56FE\u7247\u5931\u8D25" );
+		
+		// 被阻止的远程主机
+		put( AppInfo.PREVENT_HOST, "\u88AB\u963B\u6B62\u7684\u8FDC\u7A0B\u4E3B\u673A" );
+		// 远程连接出错
+		put( AppInfo.CONNECTION_ERROR, "\u8FDC\u7A0B\u8FDE\u63A5\u51FA\u9519" );
+		
+		// "文件大小超出限制"
+		put( AppInfo.MAX_SIZE, "\u6587\u4ef6\u5927\u5c0f\u8d85\u51fa\u9650\u5236" );
+		// 权限不足, 多指写权限
+		put( AppInfo.PERMISSION_DENIED, "\u6743\u9650\u4E0D\u8DB3" );
+		// 创建文件失败
+		put( AppInfo.FAILED_CREATE_FILE, "\u521B\u5EFA\u6587\u4EF6\u5931\u8D25" );
+		// IO错误
+		put( AppInfo.IO_ERROR, "IO\u9519\u8BEF" );
+		// 上传表单不是multipart/form-data类型
+		put( AppInfo.NOT_MULTIPART_CONTENT, "\u4E0A\u4F20\u8868\u5355\u4E0D\u662Fmultipart/form-data\u7C7B\u578B" );
+		// 解析上传表单错误
+		put( AppInfo.PARSE_REQUEST_ERROR, "\u89E3\u6790\u4E0A\u4F20\u8868\u5355\u9519\u8BEF" );
+		// 未找到上传数据
+		put( AppInfo.NOTFOUND_UPLOAD_DATA, "\u672A\u627E\u5230\u4E0A\u4F20\u6570\u636E" );
+		// 不允许的文件类型
+		put( AppInfo.NOT_ALLOW_FILE_TYPE, "\u4E0D\u5141\u8BB8\u7684\u6587\u4EF6\u7C7B\u578B" );
+		
+		// 指定路径不是目录
+		put( AppInfo.NOT_DIRECTORY, "\u6307\u5B9A\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55" );
+		// 指定路径并不存在
+		put( AppInfo.NOT_EXIST, "\u6307\u5B9A\u8DEF\u5F84\u5E76\u4E0D\u5B58\u5728" );
+		
+		// callback参数名不合法
+		put( AppInfo.ILLEGAL, "Callback\u53C2\u6570\u540D\u4E0D\u5408\u6CD5" );
+		
+	}};
+	
+	public static String getStateInfo ( int key ) {
+		return AppInfo.info.get( key );
+	}
+	
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/BaseState.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/BaseState.java
new file mode 100644
index 0000000..dcc881b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/BaseState.java
@@ -0,0 +1,90 @@
+package com.baidu.ueditor.define;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import com.baidu.ueditor.Encoder;
+
+public class BaseState implements State {
+
+	private boolean state = false;
+	private String info = null;
+	
+	private Map<String, String> infoMap = new HashMap<String, String>();
+	
+	public BaseState () {
+		this.state = true;
+	}
+	
+	public BaseState ( boolean state ) {
+		this.setState( state );
+	}
+	
+	public BaseState ( boolean state, String info ) {
+		this.setState( state );
+		this.info = info;
+	}
+	
+	public BaseState ( boolean state, int infoCode ) {
+		this.setState( state );
+		this.info = AppInfo.getStateInfo( infoCode );
+	}
+	
+	public boolean isSuccess () {
+		return this.state;
+	}
+	
+	public void setState ( boolean state ) {
+		this.state = state;
+	}
+	
+	public void setInfo ( String info ) {
+		this.info = info;
+	}
+	
+	public void setInfo ( int infoCode ) {
+		this.info = AppInfo.getStateInfo( infoCode );
+	}
+	
+	@Override
+	public String toJSONString() {
+		return this.toString();
+	}
+	
+	public String toString () {
+		
+		String key = null;
+		String stateVal = this.isSuccess() ? AppInfo.getStateInfo( AppInfo.SUCCESS ) : this.info;
+		
+		StringBuilder builder = new StringBuilder();
+		
+		builder.append( "{\"state\": \"" + stateVal + "\"" );
+		
+		Iterator<String> iterator = this.infoMap.keySet().iterator();
+		
+		while ( iterator.hasNext() ) {
+			
+			key = iterator.next();
+			
+			builder.append( ",\"" + key + "\": \"" + this.infoMap.get(key) + "\"" );
+			
+		}
+		
+		builder.append( "}" );
+
+		return Encoder.toUnicode( builder.toString() );
+
+	}
+
+	@Override
+	public void putInfo(String name, String val) {
+		this.infoMap.put(name, val);
+	}
+
+	@Override
+	public void putInfo(String name, long val) {
+		this.putInfo(name, val+"");
+	}
+
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/FileType.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/FileType.java
new file mode 100644
index 0000000..9195b85
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/FileType.java
@@ -0,0 +1,31 @@
+package com.baidu.ueditor.define;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class FileType {
+
+	public static final String JPG = "JPG";
+	
+	private static final Map<String, String> types = new HashMap<String, String>(){{
+		
+		put( FileType.JPG, ".jpg" );
+		
+	}};
+	
+	public static String getSuffix ( String key ) {
+		return FileType.types.get( key );
+	}
+	
+	/**
+	 * 根据给定的文件名,获取其后缀信息
+	 * @param filename
+	 * @return
+	 */
+	public static String getSuffixByFilename ( String filename ) {
+		
+		return filename.substring( filename.lastIndexOf( "." ) ).toLowerCase();
+		
+	}
+	
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/MIMEType.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/MIMEType.java
new file mode 100644
index 0000000..77c6cdd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/MIMEType.java
@@ -0,0 +1,20 @@
+package com.baidu.ueditor.define;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class MIMEType {
+
+	public static final Map<String, String> types = new HashMap<String, String>(){{
+		put( "image/gif", ".gif" );
+		put( "image/jpeg", ".jpg" );
+		put( "image/jpg", ".jpg" );
+		put( "image/png", ".png" );
+		put( "image/bmp", ".bmp" );
+	}};
+	
+	public static String getSuffix ( String mime ) {
+		return MIMEType.types.get( mime );
+	}
+	
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/MultiState.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/MultiState.java
new file mode 100644
index 0000000..26caefb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/MultiState.java
@@ -0,0 +1,112 @@
+package com.baidu.ueditor.define;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.baidu.ueditor.Encoder;
+
+/**
+ * 多状态集合状态
+ * 其包含了多个状态的集合, 其本身自己也是一个状态
+ * @author hancong03@baidu.com
+ *
+ */
+public class MultiState implements State {
+
+	private boolean state = false;
+	private String info = null;
+	private Map<String, Long> intMap = new HashMap<String, Long>();
+	private Map<String, String> infoMap = new HashMap<String, String>();
+	private List<String> stateList = new ArrayList<String>();
+	
+	public MultiState ( boolean state ) {
+		this.state = state;
+	}
+	
+	public MultiState ( boolean state, String info ) {
+		this.state = state;
+		this.info = info;
+	}
+	
+	public MultiState ( boolean state, int infoKey ) {
+		this.state = state;
+		this.info = AppInfo.getStateInfo( infoKey );
+	}
+	
+	@Override
+	public boolean isSuccess() {
+		return this.state;
+	}
+	
+	public void addState ( State state ) {
+		stateList.add( state.toJSONString() );
+	}
+
+	/**
+	 * 该方法调用无效果
+	 */
+	@Override
+	public void putInfo(String name, String val) {
+		this.infoMap.put(name, val);
+	}
+
+	@Override
+	public String toJSONString() {
+		
+		String stateVal = this.isSuccess() ? AppInfo.getStateInfo( AppInfo.SUCCESS ) : this.info;
+		
+		StringBuilder builder = new StringBuilder();
+		
+		builder.append( "{\"state\": \"" + stateVal + "\"" );
+		
+		// 数字转换
+		Iterator<String> iterator = this.intMap.keySet().iterator();
+		
+		while ( iterator.hasNext() ) {
+			
+			stateVal = iterator.next();
+			
+			builder.append( ",\""+ stateVal +"\": " + this.intMap.get( stateVal ) );
+			
+		}
+		
+		iterator = this.infoMap.keySet().iterator();
+		
+		while ( iterator.hasNext() ) {
+			
+			stateVal = iterator.next();
+			
+			builder.append( ",\""+ stateVal +"\": \"" + this.infoMap.get( stateVal ) + "\"" );
+			
+		}
+		
+		builder.append( ", list: [" );
+		
+		
+		iterator = this.stateList.iterator();
+		
+		while ( iterator.hasNext() ) {
+			
+			builder.append( iterator.next() + "," );
+			
+		}
+		
+		if ( this.stateList.size() > 0 ) {
+			builder.deleteCharAt( builder.length() - 1 );
+		}
+		
+		builder.append( " ]}" );
+
+		return Encoder.toUnicode( builder.toString() );
+
+	}
+
+	@Override
+	public void putInfo(String name, long val) {
+		this.intMap.put( name, val );
+	}
+
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/State.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/State.java
new file mode 100644
index 0000000..8f22274
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/define/State.java
@@ -0,0 +1,18 @@
+package com.baidu.ueditor.define;
+
+/**
+ * 处理状态接口
+ * @author hancong03@baidu.com
+ *
+ */
+public interface State {
+	
+	public boolean isSuccess ();
+	
+	public void putInfo( String name, String val );
+	
+	public void putInfo ( String name, long val );
+	
+	public String toJSONString ();
+
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/hunter/FileManager.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/hunter/FileManager.java
new file mode 100644
index 0000000..5a8c1a0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/hunter/FileManager.java
@@ -0,0 +1,112 @@
+package com.baidu.ueditor.hunter;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.commons.io.FileUtils;
+
+import com.baidu.ueditor.PathFormat;
+import com.baidu.ueditor.define.AppInfo;
+import com.baidu.ueditor.define.BaseState;
+import com.baidu.ueditor.define.MultiState;
+import com.baidu.ueditor.define.State;
+
+public class FileManager {
+
+	private String dir = null;
+	private String rootPath = null;
+	private String[] allowFiles = null;
+	private int count = 0;
+	
+	public FileManager ( Map<String, Object> conf ) {
+
+		this.rootPath = (String)conf.get( "rootPath" );
+		this.dir = this.rootPath + (String)conf.get( "dir" );
+		this.allowFiles = this.getAllowFiles( conf.get("allowFiles") );
+		this.count = (Integer)conf.get( "count" );
+		
+	}
+	
+	public State listFile ( int index ) {
+		
+		File dir = new File( this.dir );
+		State state = null;
+
+		if ( !dir.exists() ) {
+			return new BaseState( false, AppInfo.NOT_EXIST );
+		}
+		
+		if ( !dir.isDirectory() ) {
+			return new BaseState( false, AppInfo.NOT_DIRECTORY );
+		}
+		
+		Collection<File> list = FileUtils.listFiles( dir, this.allowFiles, true );
+		
+		if ( index < 0 || index > list.size() ) {
+			state = new MultiState( true );
+		} else {
+			Object[] fileList = Arrays.copyOfRange( list.toArray(), index, index + this.count );
+			state = this.getState( fileList );
+		}
+		
+		state.putInfo( "start", index );
+		state.putInfo( "total", list.size() );
+		
+		return state;
+		
+	}
+	
+	private State getState ( Object[] files ) {
+		
+		MultiState state = new MultiState( true );
+		BaseState fileState = null;
+		
+		File file = null;
+		
+		for ( Object obj : files ) {
+			if ( obj == null ) {
+				break;
+			}
+			file = (File)obj;
+			fileState = new BaseState( true );
+			fileState.putInfo( "url", PathFormat.format( this.getPath( file ) ) );
+			state.addState( fileState );
+		}
+		
+		return state;
+		
+	}
+	
+	private String getPath ( File file ) {
+		
+		String path = file.getAbsolutePath();
+		
+		return path.replace( this.rootPath, "/" );
+		
+	}
+	
+	private String[] getAllowFiles ( Object fileExt ) {
+		
+		String[] exts = null;
+		String ext = null;
+		
+		if ( fileExt == null ) {
+			return new String[ 0 ];
+		}
+		
+		exts = (String[])fileExt;
+		
+		for ( int i = 0, len = exts.length; i < len; i++ ) {
+			
+			ext = exts[ i ];
+			exts[ i ] = ext.replace( ".", "" );
+			
+		}
+		
+		return exts;
+		
+	}
+	
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/hunter/ImageHunter.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/hunter/ImageHunter.java
new file mode 100644
index 0000000..2631975
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/hunter/ImageHunter.java
@@ -0,0 +1,133 @@
+package com.baidu.ueditor.hunter;
+
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import com.baidu.ueditor.PathFormat;
+import com.baidu.ueditor.define.AppInfo;
+import com.baidu.ueditor.define.BaseState;
+import com.baidu.ueditor.define.MIMEType;
+import com.baidu.ueditor.define.MultiState;
+import com.baidu.ueditor.define.State;
+import com.baidu.ueditor.upload.StorageManager;
+
+/**
+ * 图片抓取器
+ * @author hancong03@baidu.com
+ *
+ */
+public class ImageHunter {
+
+	private String filename = null;
+	private String savePath = null;
+	private String rootPath = null;
+	private List<String> allowTypes = null;
+	private long maxSize = -1;
+	
+	private List<String> filters = null;
+	
+	public ImageHunter ( Map<String, Object> conf ) {
+		
+		this.filename = (String)conf.get( "filename" );
+		this.savePath = (String)conf.get( "savePath" );
+		this.rootPath = (String)conf.get( "rootPath" );
+		this.maxSize = (Long)conf.get( "maxSize" );
+		this.allowTypes = Arrays.asList( (String[])conf.get( "allowFiles" ) );
+		this.filters = Arrays.asList( (String[])conf.get( "filter" ) );
+		
+	}
+	
+	public State capture ( String[] list ) {
+		
+		MultiState state = new MultiState( true );
+		
+		for ( String source : list ) {
+			state.addState( captureRemoteData( source ) );
+		}
+		
+		return state;
+		
+	}
+
+	public State captureRemoteData ( String urlStr ) {
+		
+		HttpURLConnection connection = null;
+		URL url = null;
+		String suffix = null;
+		
+		try {
+			url = new URL( urlStr );
+
+			if ( !validHost( url.getHost() ) ) {
+				return new BaseState( false, AppInfo.PREVENT_HOST );
+			}
+			
+			connection = (HttpURLConnection) url.openConnection();
+		
+			connection.setInstanceFollowRedirects( true );
+			connection.setUseCaches( true );
+		
+			if ( !validContentState( connection.getResponseCode() ) ) {
+				return new BaseState( false, AppInfo.CONNECTION_ERROR );
+			}
+			
+			suffix = MIMEType.getSuffix( connection.getContentType() );
+			
+			if ( !validFileType( suffix ) ) {
+				return new BaseState( false, AppInfo.NOT_ALLOW_FILE_TYPE );
+			}
+			
+			if ( !validFileSize( connection.getContentLength() ) ) {
+				return new BaseState( false, AppInfo.MAX_SIZE );
+			}
+			
+			String savePath = this.getPath( this.savePath, this.filename, suffix );
+			String physicalPath = this.rootPath + savePath;
+
+			State state = StorageManager.saveFileByInputStream( connection.getInputStream(), physicalPath );
+			
+			if ( state.isSuccess() ) {
+				state.putInfo( "url", PathFormat.format( savePath ) );
+				state.putInfo( "source", urlStr );
+			}
+			
+			return state;
+			
+		} catch ( Exception e ) {
+			return new BaseState( false, AppInfo.REMOTE_FAIL );
+		}
+		
+	}
+	
+	private String getPath ( String savePath, String filename, String suffix  ) {
+		
+		return PathFormat.parse( savePath + suffix, filename );
+		
+	}
+	
+	private boolean validHost ( String hostname ) {
+		
+		return !filters.contains( hostname );
+		
+	}
+	
+	private boolean validContentState ( int code ) {
+		
+		return HttpURLConnection.HTTP_OK == code;
+		
+	}
+	
+	private boolean validFileType ( String type ) {
+		
+		return this.allowTypes.contains( type );
+		
+	}
+	
+	private boolean validFileSize ( int size ) {
+		return size < this.maxSize;
+	}
+	
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/Base64Uploader.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/Base64Uploader.java
new file mode 100644
index 0000000..2f81076
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/Base64Uploader.java
@@ -0,0 +1,52 @@
+package com.baidu.ueditor.upload;
+
+import com.baidu.ueditor.PathFormat;
+import com.baidu.ueditor.define.AppInfo;
+import com.baidu.ueditor.define.BaseState;
+import com.baidu.ueditor.define.FileType;
+import com.baidu.ueditor.define.State;
+
+import java.util.Map;
+
+import org.apache.commons.codec.binary.Base64;
+
+public final class Base64Uploader {
+
+	public static State save(String content, Map<String, Object> conf) {
+		
+		byte[] data = decode(content);
+
+		long maxSize = ((Long) conf.get("maxSize")).longValue();
+
+		if (!validSize(data, maxSize)) {
+			return new BaseState(false, AppInfo.MAX_SIZE);
+		}
+
+		String suffix = FileType.getSuffix("JPG");
+
+		String savePath = PathFormat.parse((String) conf.get("savePath"),
+				(String) conf.get("filename"));
+		
+		savePath = savePath + suffix;
+		String physicalPath = (String) conf.get("rootPath") + savePath;
+
+		State storageState = StorageManager.saveBinaryFile(data, physicalPath);
+
+		if (storageState.isSuccess()) {
+			storageState.putInfo("url", PathFormat.format(savePath));
+			storageState.putInfo("type", suffix);
+			storageState.putInfo("original", "");
+		}
+
+		return storageState;
+	}
+
+	private static byte[] decode(String content) {
+		return Base64.decodeBase64(content);
+	}
+
+	private static boolean validSize(byte[] data, long length) {
+		return data.length <= length;
+	}
+	
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/BinaryUploader.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/BinaryUploader.java
new file mode 100644
index 0000000..c69f9dd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/BinaryUploader.java
@@ -0,0 +1,98 @@
+package com.baidu.ueditor.upload;
+
+import com.baidu.ueditor.PathFormat;
+import com.baidu.ueditor.define.AppInfo;
+import com.baidu.ueditor.define.BaseState;
+import com.baidu.ueditor.define.FileType;
+import com.baidu.ueditor.define.State;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.fileupload.FileItemIterator;
+import org.apache.commons.fileupload.FileItemStream;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+
+public class BinaryUploader {
+
+	public static final State save(HttpServletRequest request,
+			Map<String, Object> conf) {
+		FileItemStream fileStream = null;
+		boolean isAjaxUpload = request.getHeader( "X_Requested_With" ) != null;
+
+		if (!ServletFileUpload.isMultipartContent(request)) {
+			return new BaseState(false, AppInfo.NOT_MULTIPART_CONTENT);
+		}
+
+		ServletFileUpload upload = new ServletFileUpload(
+				new DiskFileItemFactory());
+
+        if ( isAjaxUpload ) {
+            upload.setHeaderEncoding( "UTF-8" );
+        }
+
+		try {
+			FileItemIterator iterator = upload.getItemIterator(request);
+
+			while (iterator.hasNext()) {
+				fileStream = iterator.next();
+
+				if (!fileStream.isFormField())
+					break;
+				fileStream = null;
+			}
+
+			if (fileStream == null) {
+				return new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA);
+			}
+
+			String savePath = (String) conf.get("savePath");
+			String originFileName = fileStream.getName();
+			String suffix = FileType.getSuffixByFilename(originFileName);
+
+			originFileName = originFileName.substring(0,
+					originFileName.length() - suffix.length());
+			savePath = savePath + suffix;
+
+			long maxSize = ((Long) conf.get("maxSize")).longValue();
+
+			if (!validType(suffix, (String[]) conf.get("allowFiles"))) {
+				return new BaseState(false, AppInfo.NOT_ALLOW_FILE_TYPE);
+			}
+
+			savePath = PathFormat.parse(savePath, originFileName);
+
+			String physicalPath = (String) conf.get("rootPath") + savePath;
+
+			InputStream is = fileStream.openStream();
+			State storageState = StorageManager.saveFileByInputStream(is,
+					physicalPath, maxSize);
+			is.close();
+
+			if (storageState.isSuccess()) {
+				storageState.putInfo("url", PathFormat.format(savePath));
+				storageState.putInfo("type", suffix);
+				storageState.putInfo("original", originFileName + suffix);
+			}
+
+			return storageState;
+		} catch (FileUploadException e) {
+			return new BaseState(false, AppInfo.PARSE_REQUEST_ERROR);
+		} catch (IOException e) {
+		}
+		return new BaseState(false, AppInfo.IO_ERROR);
+	}
+
+	private static boolean validType(String type, String[] allowTypes) {
+		List<String> list = Arrays.asList(allowTypes);
+
+		return list.contains(type);
+	}
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/StorageManager.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/StorageManager.java
new file mode 100644
index 0000000..33911c6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/StorageManager.java
@@ -0,0 +1,155 @@
+package com.baidu.ueditor.upload;
+
+import com.baidu.ueditor.define.AppInfo;
+import com.baidu.ueditor.define.BaseState;
+import com.baidu.ueditor.define.State;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.io.FileUtils;
+
+public class StorageManager {
+	public static final int BUFFER_SIZE = 8192;
+
+	public StorageManager() {
+	}
+
+	public static State saveBinaryFile(byte[] data, String path) {
+		File file = new File(path);
+
+		State state = valid(file);
+
+		if (!state.isSuccess()) {
+			return state;
+		}
+
+		try {
+			BufferedOutputStream bos = new BufferedOutputStream(
+					new FileOutputStream(file));
+			bos.write(data);
+			bos.flush();
+			bos.close();
+		} catch (IOException ioe) {
+			return new BaseState(false, AppInfo.IO_ERROR);
+		}
+
+		state = new BaseState(true, file.getAbsolutePath());
+		state.putInfo( "size", data.length );
+		state.putInfo( "title", file.getName() );
+		return state;
+	}
+
+	public static State saveFileByInputStream(InputStream is, String path,
+			long maxSize) {
+		State state = null;
+
+		File tmpFile = getTmpFile();
+
+		byte[] dataBuf = new byte[ 2048 ];
+		BufferedInputStream bis = new BufferedInputStream(is, StorageManager.BUFFER_SIZE);
+
+		try {
+			BufferedOutputStream bos = new BufferedOutputStream(
+					new FileOutputStream(tmpFile), StorageManager.BUFFER_SIZE);
+
+			int count = 0;
+			while ((count = bis.read(dataBuf)) != -1) {
+				bos.write(dataBuf, 0, count);
+			}
+			bos.flush();
+			bos.close();
+
+			if (tmpFile.length() > maxSize) {
+				tmpFile.delete();
+				return new BaseState(false, AppInfo.MAX_SIZE);
+			}
+
+			state = saveTmpFile(tmpFile, path);
+
+			if (!state.isSuccess()) {
+				tmpFile.delete();
+			}
+
+			return state;
+			
+		} catch (IOException e) {
+		}
+		return new BaseState(false, AppInfo.IO_ERROR);
+	}
+
+	public static State saveFileByInputStream(InputStream is, String path) {
+		State state = null;
+
+		File tmpFile = getTmpFile();
+
+		byte[] dataBuf = new byte[ 2048 ];
+		BufferedInputStream bis = new BufferedInputStream(is, StorageManager.BUFFER_SIZE);
+
+		try {
+			BufferedOutputStream bos = new BufferedOutputStream(
+					new FileOutputStream(tmpFile), StorageManager.BUFFER_SIZE);
+
+			int count = 0;
+			while ((count = bis.read(dataBuf)) != -1) {
+				bos.write(dataBuf, 0, count);
+			}
+			bos.flush();
+			bos.close();
+
+			state = saveTmpFile(tmpFile, path);
+
+			if (!state.isSuccess()) {
+				tmpFile.delete();
+			}
+
+			return state;
+		} catch (IOException e) {
+		}
+		return new BaseState(false, AppInfo.IO_ERROR);
+	}
+
+	private static File getTmpFile() {
+		File tmpDir = FileUtils.getTempDirectory();
+		String tmpFileName = (Math.random() * 10000 + "").replace(".", "");
+		return new File(tmpDir, tmpFileName);
+	}
+
+	private static State saveTmpFile(File tmpFile, String path) {
+		State state = null;
+		File targetFile = new File(path);
+
+		if (targetFile.canWrite()) {
+			return new BaseState(false, AppInfo.PERMISSION_DENIED);
+		}
+		try {
+			FileUtils.moveFile(tmpFile, targetFile);
+		} catch (IOException e) {
+			return new BaseState(false, AppInfo.IO_ERROR);
+		}
+
+		state = new BaseState(true);
+		state.putInfo( "size", targetFile.length() );
+		state.putInfo( "title", targetFile.getName() );
+		
+		return state;
+	}
+
+	private static State valid(File file) {
+		File parentPath = file.getParentFile();
+
+		if ((!parentPath.exists()) && (!parentPath.mkdirs())) {
+			return new BaseState(false, AppInfo.FAILED_CREATE_FILE);
+		}
+
+		if (!parentPath.canWrite()) {
+			return new BaseState(false, AppInfo.PERMISSION_DENIED);
+		}
+
+		return new BaseState(true);
+	}
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/Uploader.java b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/Uploader.java
new file mode 100644
index 0000000..2312d1b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/jsp/src/com/baidu/ueditor/upload/Uploader.java
@@ -0,0 +1,29 @@
+package com.baidu.ueditor.upload;
+
+import com.baidu.ueditor.define.State;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+
+public class Uploader {
+	private HttpServletRequest request = null;
+	private Map<String, Object> conf = null;
+
+	public Uploader(HttpServletRequest request, Map<String, Object> conf) {
+		this.request = request;
+		this.conf = conf;
+	}
+
+	public final State doExec() {
+		String filedName = (String) this.conf.get("fieldName");
+		State state = null;
+
+		if ("true".equals(this.conf.get("isBase64"))) {
+			state = Base64Uploader.save(this.request.getParameter(filedName),
+					this.conf);
+		} else {
+			state = BinaryUploader.save(this.request, this.conf);
+		}
+
+		return state;
+	}
+}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/en.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/en.js
new file mode 100644
index 0000000..c7e22f5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/en.js
@@ -0,0 +1,684 @@
+/**
+ * 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':'<span style="color:red;">The number of characters has exceeded allowable maximum values, the server may refuse to save!</span>',
+    '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':" &nbsp;The video is loading, please wait…",
+        'clickToSelect':"Click to select",
+        'goToSource':'Visit source video ',
+        'noVideo':" &nbsp; &nbsp;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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/addimage.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/addimage.png
new file mode 100644
index 0000000..3a2fd17
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/addimage.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/alldeletebtnhoverskin.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/alldeletebtnhoverskin.png
new file mode 100644
index 0000000..355eeab
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/alldeletebtnhoverskin.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/alldeletebtnupskin.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/alldeletebtnupskin.png
new file mode 100644
index 0000000..61658ce
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/alldeletebtnupskin.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/background.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/background.png
new file mode 100644
index 0000000..d5bf5fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/background.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/button.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/button.png
new file mode 100644
index 0000000..098874c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/button.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/copy.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/copy.png
new file mode 100644
index 0000000..f982e8b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/copy.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/deletedisable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/deletedisable.png
new file mode 100644
index 0000000..c8ee750
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/deletedisable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/deleteenable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/deleteenable.png
new file mode 100644
index 0000000..26acc88
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/deleteenable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/listbackground.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/listbackground.png
new file mode 100644
index 0000000..4f82ccd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/listbackground.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/localimage.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/localimage.png
new file mode 100644
index 0000000..12c8e6a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/localimage.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/music.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/music.png
new file mode 100644
index 0000000..2f495fe
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/music.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotateleftdisable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotateleftdisable.png
new file mode 100644
index 0000000..741526e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotateleftdisable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotateleftenable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotateleftenable.png
new file mode 100644
index 0000000..e164ddb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotateleftenable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotaterightdisable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotaterightdisable.png
new file mode 100644
index 0000000..5a78c26
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotaterightdisable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotaterightenable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotaterightenable.png
new file mode 100644
index 0000000..d768531
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/rotaterightenable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/upload.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/upload.png
new file mode 100644
index 0000000..7bb15b3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/en/images/upload.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/copy.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/copy.png
new file mode 100644
index 0000000..b2536aa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/copy.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/localimage.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/localimage.png
new file mode 100644
index 0000000..7303c36
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/localimage.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/music.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/music.png
new file mode 100644
index 0000000..354edeb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/music.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/upload.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/upload.png
new file mode 100644
index 0000000..08d4d92
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/images/upload.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/zh-cn.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/zh-cn.js
new file mode 100644
index 0000000..a26ea5b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/lang/zh-cn/zh-cn.js
@@ -0,0 +1,669 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-6-12
+ * Time: 下午5:02
+ * To change this template use File | Settings | File Templates.
+ */
+UE.I18N['zh-cn'] = {
+    'labelMap':{
+        'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图',
+        'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框',
+        'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用',
+        'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览',
+        'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期',
+        'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格',
+        'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行',
+        'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题',
+        'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言',
+        'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'多图上传','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接',
+        'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图',
+        'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐',
+        'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表',
+        'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入',
+        'rowspacingtop':'段前距', 'rowspacingbottom':'段后距',  'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认',
+        'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存',
+        'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版',
+        'webapp':'百度应用','touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦',
+        'music':'音乐','inserttable':'插入表格','drafts': '从草稿箱加载', 'charts': '图表'
+    },
+    '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':'○ 大圆圈',
+        'disc':'● 小黑点',
+        'square':'■ 小方块 ',
+        'dash' :'— 破折号',
+        'dot':' 。 小圆圈'
+    },
+    'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'},
+    'fontfamily':{
+        'songti':'宋体',
+        'kaiti':'楷体',
+        'heiti':'黑体',
+        'lishu':'隶书',
+        'yahei':'微软雅黑',
+        'andaleMono':'andale mono',
+        'arial': 'arial',
+        'arialBlack':'arial black',
+        'comicSansMs':'comic sans ms',
+        'impact':'impact',
+        'timesNewRoman':'times new roman'
+    },
+    'customstyle':{
+        'tc':'标题居中',
+        'tl':'标题居左',
+        'im':'强调',
+        'hi':'明显强调'
+    },
+    'autoupload': {
+        'exceedSizeError': '文件大小超出限制',
+        'exceedTypeError': '文件格式不允许',
+        'jsonEncodeError': '服务器返回格式错误',
+        'loading':"正在上传...",
+        'loadError':"上传错误",
+        'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
+    },
+    'simpleupload':{
+        'exceedSizeError': '文件大小超出限制',
+        'exceedTypeError': '文件格式不允许',
+        'jsonEncodeError': '服务器返回格式错误',
+        'loading':"正在上传...",
+        'loadError':"上传错误",
+        'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
+    },
+    'elementPathTip':"元素路径",
+    'wordCountTip':"字数统计",
+    'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ',
+    'wordOverFlowMsg':'<span style="color:red;">字数超出最大允许值,服务器可能拒绝保存!</span>',
+    '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':" &nbsp;视频加载中,请等待……",
+        'clickToSelect':"点击选中",
+        'goToSource':'访问源视频',
+        'noVideo':" &nbsp; &nbsp;抱歉,找不到对应的视频,请重试!",
+
+        '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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/Config.cs b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/Config.cs
new file mode 100644
index 0000000..91c130f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/Config.cs
@@ -0,0 +1,55 @@
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Dynamic;
+using System.IO;
+using System.Linq;
+using System.Web;
+
+/// <summary>
+/// Config 的摘要说明
+/// </summary>
+public static class Config
+{
+    private static bool noCache = true;
+    private static JObject BuildItems()
+    {
+        var json = File.ReadAllText(HttpContext.Current.Server.MapPath("config.json"));
+        return JObject.Parse(json);
+    }
+
+    public static JObject Items
+    {
+        get
+        {
+            if (noCache || _Items == null)
+            {
+                _Items = BuildItems();
+            }
+            return _Items;
+        }
+    }
+    private static JObject _Items;
+
+
+    public static T GetValue<T>(string key)
+    {
+        return Items[key].Value<T>();
+    }
+
+    public static String[] GetStringList(string key)
+    {
+        return Items[key].Select(x => x.Value<String>()).ToArray();
+    }
+
+    public static String GetString(string key)
+    {
+        return GetValue<String>(key);
+    }
+
+    public static int GetInt(string key)
+    {
+        return GetValue<int>(key);
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/ConfigHandler.cs b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/ConfigHandler.cs
new file mode 100644
index 0000000..03cdc9a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/ConfigHandler.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+
+/// <summary>
+/// Config 的摘要说明
+/// </summary>
+public class ConfigHandler : Handler
+{
+    public ConfigHandler(HttpContext context) : base(context) { }
+
+    public override void Process()
+    {
+        WriteJson(Config.Items);
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/CrawlerHandler.cs b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/CrawlerHandler.cs
new file mode 100644
index 0000000..8213a77
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/CrawlerHandler.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Web;
+
+/// <summary>
+/// Crawler 的摘要说明
+/// </summary>
+public class CrawlerHandler : Handler
+{
+    private string[] Sources;
+    private Crawler[] Crawlers;
+    public CrawlerHandler(HttpContext context) : base(context) { }
+
+    public override void Process()
+    {
+        Sources = Request.Form.GetValues("source[]");
+        if (Sources == null || Sources.Length == 0)
+        {
+            WriteJson(new
+            {
+                state = "参数错误:没有指定抓取源"
+            });
+            return;
+        }
+        Crawlers = Sources.Select(x => new Crawler(x, Server).Fetch()).ToArray();
+        WriteJson(new
+        {
+            state = "SUCCESS",
+            list = Crawlers.Select(x => new
+            {
+                state = x.State,
+                source = x.SourceUrl,
+                url = x.ServerUrl
+            })
+        });
+    }
+}
+
+public class Crawler
+{
+    public string SourceUrl { get; set; }
+    public string ServerUrl { get; set; }
+    public string State { get; set; }
+
+    private HttpServerUtility Server { get; set; }
+
+
+    public Crawler(string sourceUrl, HttpServerUtility server)
+    {
+        this.SourceUrl = sourceUrl;
+        this.Server = server;
+    }
+
+    public Crawler Fetch()
+    {
+        var request = HttpWebRequest.Create(this.SourceUrl) as HttpWebRequest;
+        using (var response = request.GetResponse() as HttpWebResponse)
+        {
+            if (response.StatusCode != HttpStatusCode.OK)
+            {
+                State = "Url returns " + response.StatusCode + ", " + response.StatusDescription;
+                return this;
+            }
+            if (response.ContentType.IndexOf("image") == -1)
+            {
+                State = "Url is not an image";
+                return this;
+            }
+            ServerUrl = PathFormatter.Format(Path.GetFileName(this.SourceUrl), Config.GetString("catcherPathFormat"));
+            var savePath = Server.MapPath(ServerUrl);
+            if (!Directory.Exists(Path.GetDirectoryName(savePath)))
+            {
+                Directory.CreateDirectory(Path.GetDirectoryName(savePath));
+            }
+            try
+            {
+                var stream = response.GetResponseStream();
+                var reader = new BinaryReader(stream);
+                byte[] bytes;
+                using (var ms = new MemoryStream())
+                {
+                    byte[] buffer = new byte[4096];
+                    int count;
+                    while ((count = reader.Read(buffer, 0, buffer.Length)) != 0)
+                    {
+                        ms.Write(buffer, 0, count);
+                    }
+                    bytes = ms.ToArray();
+                }
+                File.WriteAllBytes(savePath, bytes);
+                State = "SUCCESS";
+            }
+            catch (Exception e)
+            {
+                State = "抓取错误:" + e.Message;
+            }
+            return this;
+        }
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/Handler.cs b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/Handler.cs
new file mode 100644
index 0000000..4d20ed5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/Handler.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using Newtonsoft.Json;
+
+
+/// <summary>
+/// Handler 的摘要说明
+/// </summary>
+public abstract class Handler
+{
+	public Handler(HttpContext context)
+	{
+        this.Request = context.Request;
+        this.Response = context.Response;
+        this.Context = context;
+        this.Server = context.Server;
+	}
+
+    public abstract void Process();
+
+    protected void WriteJson(object response)
+    {
+        string jsonpCallback = Request["callback"],
+            json = JsonConvert.SerializeObject(response);
+        if (String.IsNullOrWhiteSpace(jsonpCallback))
+        {
+            Response.AddHeader("Content-Type", "text/plain");
+            Response.Write(json);
+        }
+        else 
+        {
+            Response.AddHeader("Content-Type", "application/javascript");
+            Response.Write(String.Format("{0}({1});", jsonpCallback, json));
+        }
+        Response.End();
+    }
+
+    public HttpRequest Request { get; private set; }
+    public HttpResponse Response { get; private set; }
+    public HttpContext Context { get; private set; }
+    public HttpServerUtility Server { get; private set; }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/ListFileHandler.cs b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/ListFileHandler.cs
new file mode 100644
index 0000000..2cfa22a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/ListFileHandler.cs
@@ -0,0 +1,106 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Web;
+
+/// <summary>
+/// FileManager 的摘要说明
+/// </summary>
+public class ListFileManager : Handler
+{
+    enum ResultState
+    {
+        Success,
+        InvalidParam,
+        AuthorizError,
+        IOError,
+        PathNotFound
+    }
+
+    private int Start;
+    private int Size;
+    private int Total;
+    private ResultState State;
+    private String PathToList;
+    private String[] FileList;
+    private String[] SearchExtensions;
+
+    public ListFileManager(HttpContext context, string pathToList, string[] searchExtensions)
+        : base(context)
+    {
+        this.SearchExtensions = searchExtensions.Select(x => x.ToLower()).ToArray();
+        this.PathToList = pathToList;
+    }
+
+    public override void Process()
+    {
+        try
+        {
+            Start = String.IsNullOrEmpty(Request["start"]) ? 0 : Convert.ToInt32(Request["start"]);
+            Size = String.IsNullOrEmpty(Request["size"]) ? Config.GetInt("imageManagerListSize") : Convert.ToInt32(Request["size"]);
+        }
+        catch (FormatException)
+        {
+            State = ResultState.InvalidParam;
+            WriteResult();
+            return;
+        }
+        var buildingList = new List<String>();
+        try
+        {
+            var localPath = Server.MapPath(PathToList);
+            buildingList.AddRange(Directory.GetFiles(localPath, "*", SearchOption.AllDirectories)
+                .Where(x => SearchExtensions.Contains(Path.GetExtension(x).ToLower()))
+                .Select(x => PathToList + x.Substring(localPath.Length).Replace("\\", "/")));
+            Total = buildingList.Count;
+            FileList = buildingList.OrderBy(x => x).Skip(Start).Take(Size).ToArray();
+        }
+        catch (UnauthorizedAccessException)
+        {
+            State = ResultState.AuthorizError;
+        }
+        catch (DirectoryNotFoundException)
+        {
+            State = ResultState.PathNotFound;
+        }
+        catch (IOException)
+        {
+            State = ResultState.IOError;
+        }
+        finally
+        {
+            WriteResult();
+        }
+    }
+
+    private void WriteResult()
+    {
+        WriteJson(new
+        {
+            state = GetStateString(),
+            list = FileList == null ? null : FileList.Select(x => new { url = x }),
+            start = Start,
+            size = Size,
+            total = Total
+        });
+    }
+
+    private string GetStateString()
+    {
+        switch (State)
+        {
+            case ResultState.Success:
+                return "SUCCESS";
+            case ResultState.InvalidParam:
+                return "参数不正确";
+            case ResultState.PathNotFound:
+                return "路径不存在";
+            case ResultState.AuthorizError:
+                return "文件系统权限不足";
+            case ResultState.IOError:
+                return "文件系统读取错误";
+        }
+        return "未知错误";
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/NotSupportedHandler.cs b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/NotSupportedHandler.cs
new file mode 100644
index 0000000..d9d7323
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/NotSupportedHandler.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+
+/// <summary>
+/// NotSupportedHandler 的摘要说明
+/// </summary>
+public class NotSupportedHandler : Handler
+{
+    public NotSupportedHandler(HttpContext context)
+        : base(context)
+    {
+    }
+
+    public override void Process()
+    {
+        WriteJson(new
+        {
+            state = "action 参数为空或者 action 不被支持。"
+        });
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/PathFormater.cs b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/PathFormater.cs
new file mode 100644
index 0000000..e6fbfd4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/PathFormater.cs
@@ -0,0 +1,50 @@
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Web;
+
+/// <summary>
+/// PathFormater 的摘要说明
+/// </summary>
+public static class PathFormatter
+{
+    public static string Format(string originFileName, string pathFormat)
+    {
+        if (String.IsNullOrWhiteSpace(pathFormat))
+        {
+            pathFormat = "{filename}{rand:6}";
+        }
+
+        var invalidPattern = new Regex(@"[\\\/\:\*\?\042\<\>\|]");
+        originFileName = invalidPattern.Replace(originFileName, "");
+
+        string extension = Path.GetExtension(originFileName);
+        string filename = Path.GetFileNameWithoutExtension(originFileName);
+
+        pathFormat = pathFormat.Replace("{filename}", filename);
+        pathFormat = new Regex(@"\{rand(\:?)(\d+)\}", RegexOptions.Compiled).Replace(pathFormat, new MatchEvaluator(delegate(Match match)
+        {
+            var digit = 6;
+            if (match.Groups.Count > 2)
+            {
+                digit = Convert.ToInt32(match.Groups[2].Value);
+            }
+            var rand = new Random();
+            return rand.Next((int)Math.Pow(10, digit), (int)Math.Pow(10, digit + 1)).ToString();
+        }));
+
+        pathFormat = pathFormat.Replace("{time}", DateTime.Now.Ticks.ToString());
+        pathFormat = pathFormat.Replace("{yyyy}", DateTime.Now.Year.ToString());
+        pathFormat = pathFormat.Replace("{yy}", (DateTime.Now.Year % 100).ToString("D2"));
+        pathFormat = pathFormat.Replace("{mm}", DateTime.Now.Month.ToString("D2"));
+        pathFormat = pathFormat.Replace("{dd}", DateTime.Now.Day.ToString("D2"));
+        pathFormat = pathFormat.Replace("{hh}", DateTime.Now.Hour.ToString("D2"));
+        pathFormat = pathFormat.Replace("{ii}", DateTime.Now.Minute.ToString("D2"));
+        pathFormat = pathFormat.Replace("{ss}", DateTime.Now.Second.ToString("D2"));
+
+        return pathFormat + extension;
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/UploadHandler.cs b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/UploadHandler.cs
new file mode 100644
index 0000000..ea45e79
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/App_Code/UploadHandler.cs
@@ -0,0 +1,182 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Web;
+
+/// <summary>
+/// UploadHandler 的摘要说明
+/// </summary>
+public class UploadHandler : Handler
+{
+
+    public UploadConfig UploadConfig { get; private set; }
+    public UploadResult Result { get; private set; }
+
+    public UploadHandler(HttpContext context, UploadConfig config)
+        : base(context)
+    {
+        this.UploadConfig = config;
+        this.Result = new UploadResult() { State = UploadState.Unknown };
+    }
+
+    public override void Process()
+    {
+        byte[] uploadFileBytes = null;
+        string uploadFileName = null;
+
+        if (UploadConfig.Base64)
+        {
+            uploadFileName = UploadConfig.Base64Filename;
+            uploadFileBytes = Convert.FromBase64String(Request[UploadConfig.UploadFieldName]);
+        }
+        else
+        {
+            var file = Request.Files[UploadConfig.UploadFieldName];
+            uploadFileName = file.FileName;
+
+            if (!CheckFileType(uploadFileName))
+            {
+                Result.State = UploadState.TypeNotAllow;
+                WriteResult();
+                return;
+            }
+            if (!CheckFileSize(file.ContentLength))
+            {
+                Result.State = UploadState.SizeLimitExceed;
+                WriteResult();
+                return;
+            }
+
+            uploadFileBytes = new byte[file.ContentLength];
+            try
+            {
+                file.InputStream.Read(uploadFileBytes, 0, file.ContentLength);
+            }
+            catch (Exception)
+            {
+                Result.State = UploadState.NetworkError;
+                WriteResult();
+            }
+        }
+
+        Result.OriginFileName = uploadFileName;
+
+        var savePath = PathFormatter.Format(uploadFileName, UploadConfig.PathFormat);
+        var localPath = Server.MapPath(savePath);
+        try
+        {
+            if (!Directory.Exists(Path.GetDirectoryName(localPath)))
+            {
+                Directory.CreateDirectory(Path.GetDirectoryName(localPath));
+            }
+            File.WriteAllBytes(localPath, uploadFileBytes);
+            Result.Url = savePath;
+            Result.State = UploadState.Success;
+        }
+        catch (Exception e)
+        {
+            Result.State = UploadState.FileAccessError;
+            Result.ErrorMessage = e.Message;
+        }
+        finally
+        {
+            WriteResult();
+        }
+    }
+
+    private void WriteResult()
+    {
+        this.WriteJson(new
+        {
+            state = GetStateMessage(Result.State),
+            url = Result.Url,
+            title = Result.OriginFileName,
+            original = Result.OriginFileName,
+            error = Result.ErrorMessage
+        });
+    }
+
+    private string GetStateMessage(UploadState state)
+    {
+        switch (state)
+        {
+            case UploadState.Success:
+                return "SUCCESS";
+            case UploadState.FileAccessError:
+                return "文件访问出错,请检查写入权限";
+            case UploadState.SizeLimitExceed:
+                return "文件大小超出服务器限制";
+            case UploadState.TypeNotAllow:
+                return "不允许的文件格式";
+            case UploadState.NetworkError:
+                return "网络错误"; 
+        }
+        return "未知错误";
+    }
+
+    private bool CheckFileType(string filename)
+    {
+        var fileExtension = Path.GetExtension(filename).ToLower();
+        return UploadConfig.AllowExtensions.Select(x => x.ToLower()).Contains(fileExtension);
+    }
+
+    private bool CheckFileSize(int size)
+    {
+        return size < UploadConfig.SizeLimit;
+    }
+}
+
+public class UploadConfig
+{
+    /// <summary>
+    /// 文件命名规则
+    /// </summary>
+    public string PathFormat { get; set; }
+
+    /// <summary>
+    /// 上传表单域名称
+    /// </summary>
+    public string UploadFieldName { get; set; }
+
+    /// <summary>
+    /// 上传大小限制
+    /// </summary>
+    public int SizeLimit { get; set; }
+
+    /// <summary>
+    /// 上传允许的文件格式
+    /// </summary>
+    public string[] AllowExtensions { get; set; }
+
+    /// <summary>
+    /// 文件是否以 Base64 的形式上传
+    /// </summary>
+    public bool Base64 { get; set; }
+
+    /// <summary>
+    /// Base64 字符串所表示的文件名
+    /// </summary>
+    public string Base64Filename { get; set; }
+}
+
+public class UploadResult
+{
+    public UploadState State { get; set; }
+    public string Url { get; set; }
+    public string OriginFileName { get; set; }
+
+    public string ErrorMessage { get; set; }
+}
+
+public enum UploadState
+{
+    Success = 0,
+    SizeLimitExceed = -1,
+    TypeNotAllow = -2,
+    FileAccessError = -3,
+    NetworkError = -4,
+    Unknown = 1,
+}
+
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.dll b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.dll
new file mode 100644
index 0000000..551ed2c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.dll
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.pdb b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.pdb
new file mode 100644
index 0000000..dd6a719
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.pdb
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.xml b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.xml
new file mode 100644
index 0000000..5204a37
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Bin/Newtonsoft.Json.xml
@@ -0,0 +1,8472 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Newtonsoft.Json</name>
+    </assembly>
+    <members>
+        <member name="T:Newtonsoft.Json.Bson.BsonReader">
+            <summary>
+            Represents a reader that provides fast, non-cached, forward-only access to serialized Json data.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonReader">
+            <summary>
+            Represents a reader that provides fast, non-cached, forward-only access to serialized Json data.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonReader"/> class with the specified <see cref="T:System.IO.TextReader"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.Read">
+            <summary>
+            Reads the next JSON token from the stream.
+            </summary>
+            <returns>true if the next token was read successfully; false if there are no more tokens to read.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.ReadAsInt32">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.ReadAsString">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.String"/>.
+            </summary>
+            <returns>A <see cref="T:System.String"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.ReadAsBytes">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:Byte[]"/>.
+            </summary>
+            <returns>A <see cref="T:Byte[]"/> or a null reference if the next JSON token is null. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.ReadAsDecimal">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.ReadAsDateTime">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.String"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.ReadAsDateTimeOffset">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.Skip">
+            <summary>
+            Skips the children of the current token.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.SetToken(Newtonsoft.Json.JsonToken)">
+            <summary>
+            Sets the current token.
+            </summary>
+            <param name="newToken">The new token.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.SetToken(Newtonsoft.Json.JsonToken,System.Object)">
+            <summary>
+            Sets the current token and value.
+            </summary>
+            <param name="newToken">The new token.</param>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.SetStateBasedOnCurrent">
+            <summary>
+            Sets the state based on current token type.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.System#IDisposable#Dispose">
+            <summary>
+            Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.Dispose(System.Boolean)">
+            <summary>
+            Releases unmanaged and - optionally - managed resources
+            </summary>
+            <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReader.Close">
+            <summary>
+            Changes the <see cref="T:Newtonsoft.Json.JsonReader.State"/> to Closed. 
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.CurrentState">
+            <summary>
+            Gets the current reader state.
+            </summary>
+            <value>The current reader state.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.CloseInput">
+            <summary>
+            Gets or sets a value indicating whether the underlying stream or
+            <see cref="T:System.IO.TextReader"/> should be closed when the reader is closed.
+            </summary>
+            <value>
+            true to close the underlying stream or <see cref="T:System.IO.TextReader"/> when
+            the reader is closed; otherwise false. The default is true.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.SupportMultipleContent">
+            <summary>
+            Gets or sets a value indicating whether multiple pieces of JSON content can
+            be read from a continuous stream without erroring.
+            </summary>
+            <value>
+            true to support reading multiple pieces of JSON content; otherwise false. The default is false.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.QuoteChar">
+            <summary>
+            Gets the quotation mark character used to enclose the value of a string.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.DateTimeZoneHandling">
+            <summary>
+            Get or set how <see cref="T:System.DateTime"/> time zones are handling when reading JSON.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.DateParseHandling">
+            <summary>
+            Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.FloatParseHandling">
+            <summary>
+            Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.MaxDepth">
+            <summary>
+            Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a <see cref="T:Newtonsoft.Json.JsonReaderException"/>.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.TokenType">
+            <summary>
+            Gets the type of the current JSON token. 
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.Value">
+            <summary>
+            Gets the text value of the current JSON token.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.ValueType">
+            <summary>
+            Gets The Common Language Runtime (CLR) type for the current JSON token.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.Depth">
+            <summary>
+            Gets the depth of the current token in the JSON document.
+            </summary>
+            <value>The depth of the current token in the JSON document.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.Path">
+            <summary>
+            Gets the path of the current JSON token. 
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReader.Culture">
+            <summary>
+            Gets or sets the culture used when reading JSON. Defaults to <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonReader.State">
+            <summary>
+            Specifies the state of the reader.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.Start">
+            <summary>
+            The Read method has not been called.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.Complete">
+            <summary>
+            The end of the file has been reached successfully.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.Property">
+            <summary>
+            Reader is at a property.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.ObjectStart">
+            <summary>
+            Reader is at the start of an object.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.Object">
+            <summary>
+            Reader is in an object.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.ArrayStart">
+            <summary>
+            Reader is at the start of an array.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.Array">
+            <summary>
+            Reader is in an array.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.Closed">
+            <summary>
+            The Close method has been called.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.PostValue">
+            <summary>
+            Reader has just read a value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.ConstructorStart">
+            <summary>
+            Reader is at the start of a constructor.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.Constructor">
+            <summary>
+            Reader in a constructor.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.Error">
+            <summary>
+            An error occurred that prevents the read operation from continuing.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonReader.State.Finished">
+            <summary>
+            The end of the file has been reached successfully.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.#ctor(System.IO.Stream)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Bson.BsonReader"/> class.
+            </summary>
+            <param name="stream">The stream.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.#ctor(System.IO.BinaryReader)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Bson.BsonReader"/> class.
+            </summary>
+            <param name="reader">The reader.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.#ctor(System.IO.Stream,System.Boolean,System.DateTimeKind)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Bson.BsonReader"/> class.
+            </summary>
+            <param name="stream">The stream.</param>
+            <param name="readRootValueAsArray">if set to <c>true</c> the root object will be read as a JSON array.</param>
+            <param name="dateTimeKindHandling">The <see cref="T:System.DateTimeKind"/> used when reading <see cref="T:System.DateTime"/> values from BSON.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.#ctor(System.IO.BinaryReader,System.Boolean,System.DateTimeKind)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Bson.BsonReader"/> class.
+            </summary>
+            <param name="reader">The reader.</param>
+            <param name="readRootValueAsArray">if set to <c>true</c> the root object will be read as a JSON array.</param>
+            <param name="dateTimeKindHandling">The <see cref="T:System.DateTimeKind"/> used when reading <see cref="T:System.DateTime"/> values from BSON.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.ReadAsBytes">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:Byte[]"/>.
+            </summary>
+            <returns>
+            A <see cref="T:Byte[]"/> or a null reference if the next JSON token is null. This method will return <c>null</c> at the end of an array.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.ReadAsDecimal">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.ReadAsInt32">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.ReadAsString">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.String"/>.
+            </summary>
+            <returns>A <see cref="T:System.String"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.ReadAsDateTime">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.String"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.ReadAsDateTimeOffset">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>
+            A <see cref="T:System.Nullable`1"/>. This method will return <c>null</c> at the end of an array.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.Read">
+            <summary>
+            Reads the next JSON token from the stream.
+            </summary>
+            <returns>
+            true if the next token was read successfully; false if there are no more tokens to read.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonReader.Close">
+            <summary>
+            Changes the <see cref="T:Newtonsoft.Json.JsonReader.State"/> to Closed.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Bson.BsonReader.JsonNet35BinaryCompatibility">
+            <summary>
+            Gets or sets a value indicating whether binary data reading should compatible with incorrect Json.NET 3.5 written binary.
+            </summary>
+            <value>
+            	<c>true</c> if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Bson.BsonReader.ReadRootValueAsArray">
+            <summary>
+            Gets or sets a value indicating whether the root object will be read as a JSON array.
+            </summary>
+            <value>
+            	<c>true</c> if the root object will be read as a JSON array; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Bson.BsonReader.DateTimeKindHandling">
+            <summary>
+            Gets or sets the <see cref="T:System.DateTimeKind"/> used when reading <see cref="T:System.DateTime"/> values from BSON.
+            </summary>
+            <value>The <see cref="T:System.DateTimeKind"/> used when reading <see cref="T:System.DateTime"/> values from BSON.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Bson.BsonWriter">
+            <summary>
+            Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonWriter">
+            <summary>
+            Represents a writer that provides a fast, non-cached, forward-only way of generating Json data.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.#ctor">
+            <summary>
+            Creates an instance of the <c>JsonWriter</c> class. 
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.Flush">
+            <summary>
+            Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.Close">
+            <summary>
+            Closes this stream and the underlying stream.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteStartObject">
+            <summary>
+            Writes the beginning of a Json object.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteEndObject">
+            <summary>
+            Writes the end of a Json object.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteStartArray">
+            <summary>
+            Writes the beginning of a Json array.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteEndArray">
+            <summary>
+            Writes the end of an array.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteStartConstructor(System.String)">
+            <summary>
+            Writes the start of a constructor with the given name.
+            </summary>
+            <param name="name">The name of the constructor.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteEndConstructor">
+            <summary>
+            Writes the end constructor.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WritePropertyName(System.String)">
+            <summary>
+            Writes the property name of a name/value pair on a JSON object.
+            </summary>
+            <param name="name">The name of the property.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WritePropertyName(System.String,System.Boolean)">
+            <summary>
+            Writes the property name of a name/value pair on a JSON object.
+            </summary>
+            <param name="name">The name of the property.</param>
+            <param name="escape">A flag to indicate whether the text should be escaped when it is written as a JSON property name.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteEnd">
+            <summary>
+            Writes the end of the current Json object or array.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteToken(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Writes the current <see cref="T:Newtonsoft.Json.JsonReader"/> token and its children.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read the token from.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteToken(Newtonsoft.Json.JsonReader,System.Boolean)">
+            <summary>
+            Writes the current <see cref="T:Newtonsoft.Json.JsonReader"/> token.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read the token from.</param>
+            <param name="writeChildren">A flag indicating whether the current token's children should be written.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteEnd(Newtonsoft.Json.JsonToken)">
+            <summary>
+            Writes the specified end token.
+            </summary>
+            <param name="token">The end token to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteIndent">
+            <summary>
+            Writes indent characters.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValueDelimiter">
+            <summary>
+            Writes the JSON value delimiter.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteIndentSpace">
+            <summary>
+            Writes an indent space.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteNull">
+            <summary>
+            Writes a null value.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteUndefined">
+            <summary>
+            Writes an undefined value.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteRaw(System.String)">
+            <summary>
+            Writes raw JSON without changing the writer's state.
+            </summary>
+            <param name="json">The raw JSON to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteRawValue(System.String)">
+            <summary>
+            Writes raw JSON where a value is expected and updates the writer's state.
+            </summary>
+            <param name="json">The raw JSON to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.String)">
+            <summary>
+            Writes a <see cref="T:System.String"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.String"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Int32)">
+            <summary>
+            Writes a <see cref="T:System.Int32"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int32"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.UInt32)">
+            <summary>
+            Writes a <see cref="T:System.UInt32"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt32"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Int64)">
+            <summary>
+            Writes a <see cref="T:System.Int64"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int64"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.UInt64)">
+            <summary>
+            Writes a <see cref="T:System.UInt64"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt64"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Single)">
+            <summary>
+            Writes a <see cref="T:System.Single"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Single"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Double)">
+            <summary>
+            Writes a <see cref="T:System.Double"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Double"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Boolean)">
+            <summary>
+            Writes a <see cref="T:System.Boolean"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Boolean"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Int16)">
+            <summary>
+            Writes a <see cref="T:System.Int16"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int16"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.UInt16)">
+            <summary>
+            Writes a <see cref="T:System.UInt16"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt16"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Char)">
+            <summary>
+            Writes a <see cref="T:System.Char"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Char"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Byte)">
+            <summary>
+            Writes a <see cref="T:System.Byte"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Byte"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.SByte)">
+            <summary>
+            Writes a <see cref="T:System.SByte"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.SByte"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Decimal)">
+            <summary>
+            Writes a <see cref="T:System.Decimal"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Decimal"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.DateTime)">
+            <summary>
+            Writes a <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.DateTime"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.DateTimeOffset)">
+            <summary>
+            Writes a <see cref="T:System.DateTimeOffset"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.DateTimeOffset"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Guid)">
+            <summary>
+            Writes a <see cref="T:System.Guid"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Guid"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.TimeSpan)">
+            <summary>
+            Writes a <see cref="T:System.TimeSpan"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.TimeSpan"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Int32})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.UInt32})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Int64})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.UInt64})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Single})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Double})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Boolean})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Int16})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.UInt16})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Char})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Byte})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.SByte})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Decimal})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.DateTime})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.DateTimeOffset})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.Guid})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Nullable{System.TimeSpan})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Byte[])">
+            <summary>
+            Writes a <see cref="T:Byte[]"/> value.
+            </summary>
+            <param name="value">The <see cref="T:Byte[]"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Uri)">
+            <summary>
+            Writes a <see cref="T:System.Uri"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Uri"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteValue(System.Object)">
+            <summary>
+            Writes a <see cref="T:System.Object"/> value.
+            An error will raised if the value cannot be written as a single JSON token.
+            </summary>
+            <param name="value">The <see cref="T:System.Object"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteComment(System.String)">
+            <summary>
+            Writes out a comment <code>/*...*/</code> containing the specified text. 
+            </summary>
+            <param name="text">Text to place inside the comment.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.WriteWhitespace(System.String)">
+            <summary>
+            Writes out the given white space.
+            </summary>
+            <param name="ws">The string of white space characters.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriter.SetWriteState(Newtonsoft.Json.JsonToken,System.Object)">
+            <summary>
+            Sets the state of the JsonWriter,
+            </summary>
+            <param name="token">The JsonToken being written.</param>
+            <param name="value">The value being written.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriter.CloseOutput">
+            <summary>
+            Gets or sets a value indicating whether the underlying stream or
+            <see cref="T:System.IO.TextReader"/> should be closed when the writer is closed.
+            </summary>
+            <value>
+            true to close the underlying stream or <see cref="T:System.IO.TextReader"/> when
+            the writer is closed; otherwise false. The default is true.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriter.Top">
+            <summary>
+            Gets the top.
+            </summary>
+            <value>The top.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriter.WriteState">
+            <summary>
+            Gets the state of the writer.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriter.Path">
+            <summary>
+            Gets the path of the writer. 
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriter.Formatting">
+            <summary>
+            Indicates how JSON text output is formatted.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriter.DateFormatHandling">
+            <summary>
+            Get or set how dates are written to JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriter.DateTimeZoneHandling">
+            <summary>
+            Get or set how <see cref="T:System.DateTime"/> time zones are handling when writing JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriter.StringEscapeHandling">
+            <summary>
+            Get or set how strings are escaped when writing JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriter.FloatFormatHandling">
+            <summary>
+            Get or set how special floating point numbers, e.g. <see cref="F:System.Double.NaN"/>,
+            <see cref="F:System.Double.PositiveInfinity"/> and <see cref="F:System.Double.NegativeInfinity"/>,
+            are written to JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriter.DateFormatString">
+            <summary>
+            Get or set how <see cref="T:System.DateTime"/> and <see cref="T:System.DateTimeOffset"/> values are formatting when writing JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriter.Culture">
+            <summary>
+            Gets or sets the culture used when writing JSON. Defaults to <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.#ctor(System.IO.Stream)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Bson.BsonWriter"/> class.
+            </summary>
+            <param name="stream">The stream.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.#ctor(System.IO.BinaryWriter)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Bson.BsonWriter"/> class.
+            </summary>
+            <param name="writer">The writer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.Flush">
+            <summary>
+            Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteEnd(Newtonsoft.Json.JsonToken)">
+            <summary>
+            Writes the end.
+            </summary>
+            <param name="token">The token.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteComment(System.String)">
+            <summary>
+            Writes out a comment <code>/*...*/</code> containing the specified text.
+            </summary>
+            <param name="text">Text to place inside the comment.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteStartConstructor(System.String)">
+            <summary>
+            Writes the start of a constructor with the given name.
+            </summary>
+            <param name="name">The name of the constructor.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteRaw(System.String)">
+            <summary>
+            Writes raw JSON.
+            </summary>
+            <param name="json">The raw JSON to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteRawValue(System.String)">
+            <summary>
+            Writes raw JSON where a value is expected and updates the writer's state.
+            </summary>
+            <param name="json">The raw JSON to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteStartArray">
+            <summary>
+            Writes the beginning of a Json array.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteStartObject">
+            <summary>
+            Writes the beginning of a Json object.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WritePropertyName(System.String)">
+            <summary>
+            Writes the property name of a name/value pair on a Json object.
+            </summary>
+            <param name="name">The name of the property.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.Close">
+            <summary>
+            Closes this stream and the underlying stream.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Object)">
+            <summary>
+            Writes a <see cref="T:System.Object"/> value.
+            An error will raised if the value cannot be written as a single JSON token.
+            </summary>
+            <param name="value">The <see cref="T:System.Object"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteNull">
+            <summary>
+            Writes a null value.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteUndefined">
+            <summary>
+            Writes an undefined value.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.String)">
+            <summary>
+            Writes a <see cref="T:System.String"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.String"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Int32)">
+            <summary>
+            Writes a <see cref="T:System.Int32"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int32"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.UInt32)">
+            <summary>
+            Writes a <see cref="T:System.UInt32"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt32"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Int64)">
+            <summary>
+            Writes a <see cref="T:System.Int64"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int64"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.UInt64)">
+            <summary>
+            Writes a <see cref="T:System.UInt64"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt64"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Single)">
+            <summary>
+            Writes a <see cref="T:System.Single"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Single"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Double)">
+            <summary>
+            Writes a <see cref="T:System.Double"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Double"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Boolean)">
+            <summary>
+            Writes a <see cref="T:System.Boolean"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Boolean"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Int16)">
+            <summary>
+            Writes a <see cref="T:System.Int16"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int16"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.UInt16)">
+            <summary>
+            Writes a <see cref="T:System.UInt16"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt16"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Char)">
+            <summary>
+            Writes a <see cref="T:System.Char"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Char"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Byte)">
+            <summary>
+            Writes a <see cref="T:System.Byte"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Byte"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.SByte)">
+            <summary>
+            Writes a <see cref="T:System.SByte"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.SByte"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Decimal)">
+            <summary>
+            Writes a <see cref="T:System.Decimal"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Decimal"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.DateTime)">
+            <summary>
+            Writes a <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.DateTime"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.DateTimeOffset)">
+            <summary>
+            Writes a <see cref="T:System.DateTimeOffset"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.DateTimeOffset"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Byte[])">
+            <summary>
+            Writes a <see cref="T:Byte[]"/> value.
+            </summary>
+            <param name="value">The <see cref="T:Byte[]"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Guid)">
+            <summary>
+            Writes a <see cref="T:System.Guid"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Guid"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.TimeSpan)">
+            <summary>
+            Writes a <see cref="T:System.TimeSpan"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.TimeSpan"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteValue(System.Uri)">
+            <summary>
+            Writes a <see cref="T:System.Uri"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Uri"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteObjectId(System.Byte[])">
+            <summary>
+            Writes a <see cref="T:Byte[]"/> value that represents a BSON object id.
+            </summary>
+            <param name="value">The Object ID value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonWriter.WriteRegex(System.String,System.String)">
+            <summary>
+            Writes a BSON regex.
+            </summary>
+            <param name="pattern">The regex pattern.</param>
+            <param name="options">The regex options.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Bson.BsonWriter.DateTimeKindHandling">
+            <summary>
+            Gets or sets the <see cref="T:System.DateTimeKind"/> used when writing <see cref="T:System.DateTime"/> values to BSON.
+            When set to <see cref="F:System.DateTimeKind.Unspecified"/> no conversion will occur.
+            </summary>
+            <value>The <see cref="T:System.DateTimeKind"/> used when writing <see cref="T:System.DateTime"/> values to BSON.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Bson.BsonObjectId">
+            <summary>
+            Represents a BSON Oid (object id).
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Bson.BsonObjectId.#ctor(System.Byte[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Bson.BsonObjectId"/> class.
+            </summary>
+            <param name="value">The Oid value.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Bson.BsonObjectId.Value">
+            <summary>
+            Gets or sets the value of the Oid.
+            </summary>
+            <value>The value of the Oid.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.BinaryConverter">
+            <summary>
+            Converts a binary value to and from a base 64 string value.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonConverter">
+            <summary>
+            Converts an object to and from JSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConverter.GetSchema">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> of the JSON produced by the JsonConverter.
+            </summary>
+            <returns>The <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> of the JSON produced by the JsonConverter.</returns>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonConverter.CanRead">
+            <summary>
+            Gets a value indicating whether this <see cref="T:Newtonsoft.Json.JsonConverter"/> can read JSON.
+            </summary>
+            <value><c>true</c> if this <see cref="T:Newtonsoft.Json.JsonConverter"/> can read JSON; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonConverter.CanWrite">
+            <summary>
+            Gets a value indicating whether this <see cref="T:Newtonsoft.Json.JsonConverter"/> can write JSON.
+            </summary>
+            <value><c>true</c> if this <see cref="T:Newtonsoft.Json.JsonConverter"/> can write JSON; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.BinaryConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.BinaryConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.BinaryConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.DataSetConverter">
+            <summary>
+            Converts a <see cref="T:System.Data.DataSet"/> to and from JSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.DataSetConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.DataSetConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.DataSetConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified value type.
+            </summary>
+            <param name="valueType">Type of the value.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified value type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.DataTableConverter">
+            <summary>
+            Converts a <see cref="T:System.Data.DataTable"/> to and from JSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.DataTableConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.DataTableConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.DataTableConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified value type.
+            </summary>
+            <param name="valueType">Type of the value.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified value type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.CustomCreationConverter`1">
+            <summary>
+            Create a custom object
+            </summary>
+            <typeparam name="T">The object type to convert.</typeparam>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.CustomCreationConverter`1.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.CustomCreationConverter`1.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.CustomCreationConverter`1.Create(System.Type)">
+            <summary>
+            Creates an object which will then be populated by the serializer.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>The created object.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.CustomCreationConverter`1.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Converters.CustomCreationConverter`1.CanWrite">
+            <summary>
+            Gets a value indicating whether this <see cref="T:Newtonsoft.Json.JsonConverter"/> can write JSON.
+            </summary>
+            <value>
+            	<c>true</c> if this <see cref="T:Newtonsoft.Json.JsonConverter"/> can write JSON; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.DateTimeConverterBase">
+            <summary>
+            Provides a base class for converting a <see cref="T:System.DateTime"/> to and from JSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.DateTimeConverterBase.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.DiscriminatedUnionConverter">
+            <summary>
+            Converts a F# discriminated union type to and from JSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.DiscriminatedUnionConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.DiscriminatedUnionConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.DiscriminatedUnionConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.EntityKeyMemberConverter">
+            <summary>
+            Converts an Entity Framework EntityKey to and from JSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.EntityKeyMemberConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.EntityKeyMemberConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.EntityKeyMemberConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.ExpandoObjectConverter">
+            <summary>
+            Converts an ExpandoObject to and from JSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.ExpandoObjectConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.ExpandoObjectConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.ExpandoObjectConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Converters.ExpandoObjectConverter.CanWrite">
+            <summary>
+            Gets a value indicating whether this <see cref="T:Newtonsoft.Json.JsonConverter"/> can write JSON.
+            </summary>
+            <value>
+            	<c>true</c> if this <see cref="T:Newtonsoft.Json.JsonConverter"/> can write JSON; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.KeyValuePairConverter">
+            <summary>
+            Converts a <see cref="T:System.Collections.Generic.KeyValuePair`2"/> to and from JSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.KeyValuePairConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.KeyValuePairConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.KeyValuePairConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.BsonObjectIdConverter">
+            <summary>
+            Converts a <see cref="T:Newtonsoft.Json.Bson.BsonObjectId"/> to and from JSON and BSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.BsonObjectIdConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.BsonObjectIdConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.BsonObjectIdConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.RegexConverter">
+            <summary>
+            Converts a <see cref="T:System.Text.RegularExpressions.Regex"/> to and from JSON and BSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.RegexConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.RegexConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.RegexConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.StringEnumConverter">
+            <summary>
+            Converts an <see cref="T:System.Enum"/> to and from its name string value.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.StringEnumConverter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Converters.StringEnumConverter"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.StringEnumConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.StringEnumConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.StringEnumConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            <c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Converters.StringEnumConverter.CamelCaseText">
+            <summary>
+            Gets or sets a value indicating whether the written enum text should be camel case.
+            </summary>
+            <value><c>true</c> if the written enum text will be camel case; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Converters.StringEnumConverter.AllowIntegerValues">
+            <summary>
+            Gets or sets a value indicating whether integer values are allowed.
+            </summary>
+            <value><c>true</c> if integers are allowed; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.ConstructorHandling">
+            <summary>
+            Specifies how constructors are used when initializing objects during deserialization by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.ConstructorHandling.Default">
+            <summary>
+            First attempt to use the public default constructor, then fall back to single paramatized constructor, then the non-public default constructor.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.ConstructorHandling.AllowNonPublicDefaultConstructor">
+            <summary>
+            Json.NET will use a non-public default constructor before falling back to a paramatized constructor.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.VersionConverter">
+            <summary>
+            Converts a <see cref="T:System.Version"/> to and from a string (e.g. "1.2.3.4").
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.VersionConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.VersionConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing property value of the JSON that is being converted.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.VersionConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified object type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.FloatFormatHandling">
+            <summary>
+            Specifies float format handling options when writing special floating point numbers, e.g. <see cref="F:System.Double.NaN"/>,
+            <see cref="F:System.Double.PositiveInfinity"/> and <see cref="F:System.Double.NegativeInfinity"/> with <see cref="T:Newtonsoft.Json.JsonWriter"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.FloatFormatHandling.String">
+            <summary>
+            Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity".
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.FloatFormatHandling.Symbol">
+            <summary>
+            Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity.
+            Note that this will produce non-valid JSON.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.FloatFormatHandling.DefaultValue">
+            <summary>
+            Write special floating point values as the property's default value in JSON, e.g. 0.0 for a <see cref="T:System.Double"/> property, null for a <see cref="T:System.Nullable`1"/> property.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.FloatParseHandling">
+            <summary>
+            Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.FloatParseHandling.Double">
+            <summary>
+            Floating point numbers are parsed to <see cref="F:Newtonsoft.Json.FloatParseHandling.Double"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.FloatParseHandling.Decimal">
+            <summary>
+            Floating point numbers are parsed to <see cref="F:Newtonsoft.Json.FloatParseHandling.Decimal"/>.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonDictionaryAttribute">
+            <summary>
+            Instructs the <see cref="T:Newtonsoft.Json.JsonSerializer"/> how to serialize the collection.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonContainerAttribute">
+            <summary>
+            Instructs the <see cref="T:Newtonsoft.Json.JsonSerializer"/> how to serialize the object.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonContainerAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonContainerAttribute"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonContainerAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonContainerAttribute"/> class with the specified container Id.
+            </summary>
+            <param name="id">The container Id.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonContainerAttribute.Id">
+            <summary>
+            Gets or sets the id.
+            </summary>
+            <value>The id.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonContainerAttribute.Title">
+            <summary>
+            Gets or sets the title.
+            </summary>
+            <value>The title.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonContainerAttribute.Description">
+            <summary>
+            Gets or sets the description.
+            </summary>
+            <value>The description.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonContainerAttribute.ItemConverterType">
+            <summary>
+            Gets the collection's items converter.
+            </summary>
+            <value>The collection's items converter.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonContainerAttribute.IsReference">
+            <summary>
+            Gets or sets a value that indicates whether to preserve object references.
+            </summary>
+            <value>
+            	<c>true</c> to keep object reference; otherwise, <c>false</c>. The default is <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonContainerAttribute.ItemIsReference">
+            <summary>
+            Gets or sets a value that indicates whether to preserve collection's items references.
+            </summary>
+            <value>
+            	<c>true</c> to keep collection's items object references; otherwise, <c>false</c>. The default is <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonContainerAttribute.ItemReferenceLoopHandling">
+            <summary>
+            Gets or sets the reference loop handling used when serializing the collection's items.
+            </summary>
+            <value>The reference loop handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonContainerAttribute.ItemTypeNameHandling">
+            <summary>
+            Gets or sets the type name handling used when serializing the collection's items.
+            </summary>
+            <value>The type name handling.</value>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonDictionaryAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonDictionaryAttribute"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonDictionaryAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonDictionaryAttribute"/> class with the specified container Id.
+            </summary>
+            <param name="id">The container Id.</param>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonException">
+            <summary>
+            The exception thrown when an error occurs during Json serialization or deserialization.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonException.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonException"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonException"/> class
+            with a specified error message.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonException"/> class
+            with a specified error message and a reference to the inner exception that is the cause of this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonException"/> class.
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="info"/> parameter is null. </exception>
+            <exception cref="T:System.Runtime.Serialization.SerializationException">The class name is null or <see cref="P:System.Exception.HResult"/> is zero (0). </exception>
+        </member>
+        <member name="T:Newtonsoft.Json.DateFormatHandling">
+            <summary>
+            Specifies how dates are formatted when writing JSON text.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DateFormatHandling.IsoDateFormat">
+            <summary>
+            Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z".
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat">
+            <summary>
+            Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/".
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.DateParseHandling">
+            <summary>
+            Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DateParseHandling.None">
+            <summary>
+            Date formatted strings are not parsed to a date type and are read as strings.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DateParseHandling.DateTime">
+            <summary>
+            Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to <see cref="F:Newtonsoft.Json.DateParseHandling.DateTime"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DateParseHandling.DateTimeOffset">
+            <summary>
+            Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to <see cref="F:Newtonsoft.Json.DateParseHandling.DateTimeOffset"/>.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.DateTimeZoneHandling">
+            <summary>
+            Specifies how to treat the time value when converting between string and <see cref="T:System.DateTime"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DateTimeZoneHandling.Local">
+            <summary>
+            Treat as local time. If the <see cref="T:System.DateTime"/> object represents a Coordinated Universal Time (UTC), it is converted to the local time.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DateTimeZoneHandling.Utc">
+            <summary>
+            Treat as a UTC. If the <see cref="T:System.DateTime"/> object represents a local time, it is converted to a UTC.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DateTimeZoneHandling.Unspecified">
+            <summary>
+            Treat as a local time if a <see cref="T:System.DateTime"/> is being converted to a string.
+            If a string is being converted to <see cref="T:System.DateTime"/>, convert to a local time if a time zone is specified.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DateTimeZoneHandling.RoundtripKind">
+            <summary>
+            Time zone information should be preserved when converting.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Formatting">
+            <summary>
+            Specifies formatting options for the <see cref="T:Newtonsoft.Json.JsonTextWriter"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Formatting.None">
+            <summary>
+            No special formatting is applied. This is the default.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Formatting.Indented">
+            <summary>
+            Causes child objects to be indented according to the <see cref="P:Newtonsoft.Json.JsonTextWriter.Indentation"/> and <see cref="P:Newtonsoft.Json.JsonTextWriter.IndentChar"/> settings.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonConstructorAttribute">
+            <summary>
+            Instructs the <see cref="T:Newtonsoft.Json.JsonSerializer"/> to use the specified constructor when deserializing that object.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonExtensionDataAttribute">
+            <summary>
+            Instructs the <see cref="T:Newtonsoft.Json.JsonSerializer"/> to deserialize properties with no matching class member into the specified collection
+            and write values during serialization.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonExtensionDataAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonExtensionDataAttribute"/> class.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonExtensionDataAttribute.WriteData">
+            <summary>
+            Gets or sets a value that indicates whether to write extension data when serializing the object.
+            </summary>
+            <value>
+            	<c>true</c> to write extension data when serializing the object; otherwise, <c>false</c>. The default is <c>true</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonExtensionDataAttribute.ReadData">
+            <summary>
+            Gets or sets a value that indicates whether to read extension data when deserializing the object.
+            </summary>
+            <value>
+            	<c>true</c> to read extension data when deserializing the object; otherwise, <c>false</c>. The default is <c>true</c>.
+            </value>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.DiagnosticsTraceWriter">
+            <summary>
+            Represents a trace writer that writes to the application's <see cref="T:System.Diagnostics.TraceListener"/> instances.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.ITraceWriter">
+            <summary>
+            Represents a trace writer.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.ITraceWriter.Trace(System.Diagnostics.TraceLevel,System.String,System.Exception)">
+            <summary>
+            Writes the specified trace level, message and optional exception.
+            </summary>
+            <param name="level">The <see cref="T:System.Diagnostics.TraceLevel"/> at which to write this trace.</param>
+            <param name="message">The trace message.</param>
+            <param name="ex">The trace exception. This parameter is optional.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.ITraceWriter.LevelFilter">
+            <summary>
+            Gets the <see cref="T:System.Diagnostics.TraceLevel"/> that will be used to filter the trace messages passed to the writer.
+            For example a filter level of <code>Info</code> will exclude <code>Verbose</code> messages and include <code>Info</code>,
+            <code>Warning</code> and <code>Error</code> messages.
+            </summary>
+            <value>The <see cref="T:System.Diagnostics.TraceLevel"/> that will be used to filter the trace messages passed to the writer.</value>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DiagnosticsTraceWriter.Trace(System.Diagnostics.TraceLevel,System.String,System.Exception)">
+            <summary>
+            Writes the specified trace level, message and optional exception.
+            </summary>
+            <param name="level">The <see cref="T:System.Diagnostics.TraceLevel"/> at which to write this trace.</param>
+            <param name="message">The trace message.</param>
+            <param name="ex">The trace exception. This parameter is optional.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.DiagnosticsTraceWriter.LevelFilter">
+            <summary>
+            Gets the <see cref="T:System.Diagnostics.TraceLevel"/> that will be used to filter the trace messages passed to the writer.
+            For example a filter level of <code>Info</code> will exclude <code>Verbose</code> messages and include <code>Info</code>,
+            <code>Warning</code> and <code>Error</code> messages.
+            </summary>
+            <value>
+            The <see cref="T:System.Diagnostics.TraceLevel"/> that will be used to filter the trace messages passed to the writer.
+            </value>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.ExpressionValueProvider">
+            <summary>
+            Get and set values for a <see cref="T:System.Reflection.MemberInfo"/> using dynamic methods.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.IValueProvider">
+            <summary>
+            Provides methods to get and set values.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.IValueProvider.SetValue(System.Object,System.Object)">
+            <summary>
+            Sets the value.
+            </summary>
+            <param name="target">The target to set the value on.</param>
+            <param name="value">The value to set on the target.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.IValueProvider.GetValue(System.Object)">
+            <summary>
+            Gets the value.
+            </summary>
+            <param name="target">The target to get the value from.</param>
+            <returns>The value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.ExpressionValueProvider.#ctor(System.Reflection.MemberInfo)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.ExpressionValueProvider"/> class.
+            </summary>
+            <param name="memberInfo">The member info.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.ExpressionValueProvider.SetValue(System.Object,System.Object)">
+            <summary>
+            Sets the value.
+            </summary>
+            <param name="target">The target to set the value on.</param>
+            <param name="value">The value to set on the target.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.ExpressionValueProvider.GetValue(System.Object)">
+            <summary>
+            Gets the value.
+            </summary>
+            <param name="target">The target to get the value from.</param>
+            <returns>The value.</returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonContainerContract">
+            <summary>
+            Contract details for a <see cref="T:System.Type"/> used by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonContract">
+            <summary>
+            Contract details for a <see cref="T:System.Type"/> used by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.UnderlyingType">
+            <summary>
+            Gets the underlying type for the contract.
+            </summary>
+            <value>The underlying type for the contract.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.CreatedType">
+            <summary>
+            Gets or sets the type created during deserialization.
+            </summary>
+            <value>The type created during deserialization.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.IsReference">
+            <summary>
+            Gets or sets whether this type contract is serialized as a reference.
+            </summary>
+            <value>Whether this type contract is serialized as a reference.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.Converter">
+            <summary>
+            Gets or sets the default <see cref="T:Newtonsoft.Json.JsonConverter"/> for this contract.
+            </summary>
+            <value>The converter.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.OnDeserializedCallbacks">
+            <summary>
+            Gets or sets all methods called immediately after deserialization of the object.
+            </summary>
+            <value>The methods called immediately after deserialization of the object.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.OnDeserializingCallbacks">
+            <summary>
+            Gets or sets all methods called during deserialization of the object.
+            </summary>
+            <value>The methods called during deserialization of the object.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.OnSerializedCallbacks">
+            <summary>
+            Gets or sets all methods called after serialization of the object graph.
+            </summary>
+            <value>The methods called after serialization of the object graph.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.OnSerializingCallbacks">
+            <summary>
+            Gets or sets all methods called before serialization of the object.
+            </summary>
+            <value>The methods called before serialization of the object.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.OnErrorCallbacks">
+            <summary>
+            Gets or sets all method called when an error is thrown during the serialization of the object.
+            </summary>
+            <value>The methods called when an error is thrown during the serialization of the object.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.OnDeserialized">
+            <summary>
+            Gets or sets the method called immediately after deserialization of the object.
+            </summary>
+            <value>The method called immediately after deserialization of the object.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.OnDeserializing">
+            <summary>
+            Gets or sets the method called during deserialization of the object.
+            </summary>
+            <value>The method called during deserialization of the object.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.OnSerialized">
+            <summary>
+            Gets or sets the method called after serialization of the object graph.
+            </summary>
+            <value>The method called after serialization of the object graph.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.OnSerializing">
+            <summary>
+            Gets or sets the method called before serialization of the object.
+            </summary>
+            <value>The method called before serialization of the object.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.OnError">
+            <summary>
+            Gets or sets the method called when an error is thrown during the serialization of the object.
+            </summary>
+            <value>The method called when an error is thrown during the serialization of the object.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.DefaultCreator">
+            <summary>
+            Gets or sets the default creator method used to create the object.
+            </summary>
+            <value>The default creator method used to create the object.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContract.DefaultCreatorNonPublic">
+            <summary>
+            Gets or sets a value indicating whether the default creator is non public.
+            </summary>
+            <value><c>true</c> if the default object creator is non-public; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonContainerContract.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.JsonContainerContract"/> class.
+            </summary>
+            <param name="underlyingType">The underlying type for the contract.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContainerContract.ItemConverter">
+            <summary>
+            Gets or sets the default collection items <see cref="T:Newtonsoft.Json.JsonConverter"/>.
+            </summary>
+            <value>The converter.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContainerContract.ItemIsReference">
+            <summary>
+            Gets or sets a value indicating whether the collection items preserve object references.
+            </summary>
+            <value><c>true</c> if collection items preserve object references; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContainerContract.ItemReferenceLoopHandling">
+            <summary>
+            Gets or sets the collection item reference loop handling.
+            </summary>
+            <value>The reference loop handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonContainerContract.ItemTypeNameHandling">
+            <summary>
+            Gets or sets the collection item type name handling.
+            </summary>
+            <value>The type name handling.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.MemoryTraceWriter">
+            <summary>
+            Represents a trace writer that writes to memory. When the trace message limit is
+            reached then old trace messages will be removed as new messages are added.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.MemoryTraceWriter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.MemoryTraceWriter"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.MemoryTraceWriter.Trace(System.Diagnostics.TraceLevel,System.String,System.Exception)">
+            <summary>
+            Writes the specified trace level, message and optional exception.
+            </summary>
+            <param name="level">The <see cref="T:System.Diagnostics.TraceLevel"/> at which to write this trace.</param>
+            <param name="message">The trace message.</param>
+            <param name="ex">The trace exception. This parameter is optional.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.MemoryTraceWriter.GetTraceMessages">
+            <summary>
+            Returns an enumeration of the most recent trace messages.
+            </summary>
+            <returns>An enumeration of the most recent trace messages.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.MemoryTraceWriter.ToString">
+            <summary>
+            Returns a <see cref="T:System.String"/> of the most recent trace messages.
+            </summary>
+            <returns>
+            A <see cref="T:System.String"/> of the most recent trace messages.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.MemoryTraceWriter.LevelFilter">
+            <summary>
+            Gets the <see cref="T:System.Diagnostics.TraceLevel"/> that will be used to filter the trace messages passed to the writer.
+            For example a filter level of <code>Info</code> will exclude <code>Verbose</code> messages and include <code>Info</code>,
+            <code>Warning</code> and <code>Error</code> messages.
+            </summary>
+            <value>
+            The <see cref="T:System.Diagnostics.TraceLevel"/> that will be used to filter the trace messages passed to the writer.
+            </value>
+        </member>
+        <member name="T:Newtonsoft.Json.IJsonLineInfo">
+            <summary>
+            Provides an interface to enable a class to return line and position information.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.IJsonLineInfo.HasLineInfo">
+            <summary>
+            Gets a value indicating whether the class can return line information.
+            </summary>
+            <returns>
+            	<c>true</c> if LineNumber and LinePosition can be provided; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.IJsonLineInfo.LineNumber">
+            <summary>
+            Gets the current line number.
+            </summary>
+            <value>The current line number or 0 if no line information is available (for example, HasLineInfo returns false).</value>
+        </member>
+        <member name="P:Newtonsoft.Json.IJsonLineInfo.LinePosition">
+            <summary>
+            Gets the current line position.
+            </summary>
+            <value>The current line position or 0 if no line information is available (for example, HasLineInfo returns false).</value>
+        </member>
+        <member name="T:Newtonsoft.Json.StringEscapeHandling">
+            <summary>
+            Specifies how strings are escaped when writing JSON text.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.StringEscapeHandling.Default">
+            <summary>
+            Only control characters (e.g. newline) are escaped.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.StringEscapeHandling.EscapeNonAscii">
+            <summary>
+            All non-ASCII and control characters (e.g. newline) are escaped.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.StringEscapeHandling.EscapeHtml">
+            <summary>
+            HTML (&lt;, &gt;, &amp;, &apos;, &quot;) and control characters (e.g. newline) are escaped.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JRaw">
+            <summary>
+            Represents a raw JSON string.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JValue">
+            <summary>
+            Represents a value in JSON (string, integer, date, etc).
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Represents an abstract JSON token.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.IJEnumerable`1">
+            <summary>
+            Represents a collection of <see cref="T:Newtonsoft.Json.Linq.JToken"/> objects.
+            </summary>
+            <typeparam name="T">The type of token</typeparam>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.IJEnumerable`1.Item(System.Object)">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Linq.IJEnumerable`1"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.DeepEquals(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Linq.JToken)">
+            <summary>
+            Compares the values of two tokens, including the values of all descendant tokens.
+            </summary>
+            <param name="t1">The first <see cref="T:Newtonsoft.Json.Linq.JToken"/> to compare.</param>
+            <param name="t2">The second <see cref="T:Newtonsoft.Json.Linq.JToken"/> to compare.</param>
+            <returns>true if the tokens are equal; otherwise false.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.AddAfterSelf(System.Object)">
+            <summary>
+            Adds the specified content immediately after this token.
+            </summary>
+            <param name="content">A content object that contains simple content or a collection of content objects to be added after this token.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.AddBeforeSelf(System.Object)">
+            <summary>
+            Adds the specified content immediately before this token.
+            </summary>
+            <param name="content">A content object that contains simple content or a collection of content objects to be added before this token.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.Ancestors">
+            <summary>
+            Returns a collection of the ancestor tokens of this token.
+            </summary>
+            <returns>A collection of the ancestor tokens of this token.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.AfterSelf">
+            <summary>
+            Returns a collection of the sibling tokens after this token, in document order.
+            </summary>
+            <returns>A collection of the sibling tokens after this tokens, in document order.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.BeforeSelf">
+            <summary>
+            Returns a collection of the sibling tokens before this token, in document order.
+            </summary>
+            <returns>A collection of the sibling tokens before this token, in document order.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.Value``1(System.Object)">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified key converted to the specified type.
+            </summary>
+            <typeparam name="T">The type to convert the token to.</typeparam>
+            <param name="key">The token key.</param>
+            <returns>The converted token value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.Children">
+            <summary>
+            Returns a collection of the child tokens of this token, in document order.
+            </summary>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> containing the child tokens of this <see cref="T:Newtonsoft.Json.Linq.JToken"/>, in document order.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.Children``1">
+            <summary>
+            Returns a collection of the child tokens of this token, in document order, filtered by the specified type.
+            </summary>
+            <typeparam name="T">The type to filter the child tokens on.</typeparam>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JEnumerable`1"/> containing the child tokens of this <see cref="T:Newtonsoft.Json.Linq.JToken"/>, in document order.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.Values``1">
+            <summary>
+            Returns a collection of the child values of this token, in document order.
+            </summary>
+            <typeparam name="T">The type to convert the values to.</typeparam>
+            <returns>A <see cref="T:System.Collections.Generic.IEnumerable`1"/> containing the child values of this <see cref="T:Newtonsoft.Json.Linq.JToken"/>, in document order.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.Remove">
+            <summary>
+            Removes this token from its parent.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.Replace(Newtonsoft.Json.Linq.JToken)">
+            <summary>
+            Replaces this token with the specified token.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])">
+            <summary>
+            Writes this token to a <see cref="T:Newtonsoft.Json.JsonWriter"/>.
+            </summary>
+            <param name="writer">A <see cref="T:Newtonsoft.Json.JsonWriter"/> into which this method will write.</param>
+            <param name="converters">A collection of <see cref="T:Newtonsoft.Json.JsonConverter"/> which will be used when writing the token.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.ToString">
+            <summary>
+            Returns the indented JSON for this token.
+            </summary>
+            <returns>
+            The indented JSON for this token.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.ToString(Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonConverter[])">
+            <summary>
+            Returns the JSON for this token using the given formatting and converters.
+            </summary>
+            <param name="formatting">Indicates how the output is formatted.</param>
+            <param name="converters">A collection of <see cref="T:Newtonsoft.Json.JsonConverter"/> which will be used when writing the token.</param>
+            <returns>The JSON for this token using the given formatting and converters.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Boolean">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Boolean"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.DateTimeOffset">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.DateTimeOffset"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Boolean}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Int64">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Int64"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.DateTime}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.DateTimeOffset}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Decimal}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Double}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Char}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Int32">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Int32"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Int16">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Int16"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.UInt16">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.UInt16"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Char">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Char"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Byte">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Byte"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.SByte">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.SByte"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Int32}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Int16}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.UInt16}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Byte}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.SByte}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.DateTime">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.DateTime"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Int64}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Single}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Decimal">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Decimal"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.UInt32}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.UInt64}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Double">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Double"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Single">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Single"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.String">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.String"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.UInt32">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.UInt32"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.UInt64">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.UInt64"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Byte[]">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Byte[]"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Guid">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Guid"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.Guid}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Guid"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.TimeSpan">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.TimeSpan"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Nullable{System.TimeSpan}">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.TimeSpan"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Explicit(Newtonsoft.Json.Linq.JToken)~System.Uri">
+            <summary>
+            Performs an explicit conversion from <see cref="T:Newtonsoft.Json.Linq.JToken"/> to <see cref="T:System.Uri"/>.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>The result of the conversion.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Boolean)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Boolean"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.DateTimeOffset)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.DateTimeOffset"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Byte)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Byte"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Byte})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.SByte)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.SByte"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.SByte})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Boolean})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Int64)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.DateTime})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.DateTimeOffset})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Decimal})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Double})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Int16)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Int16"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.UInt16)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.UInt16"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Int32)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Int32"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Int32})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.DateTime)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.DateTime"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Int64})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Single})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Decimal)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Decimal"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Int16})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.UInt16})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.UInt32})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.UInt64})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Double)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Double"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Single)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Single"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.String)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.String"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.UInt32)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.UInt32"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.UInt64)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.UInt64"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Byte[])~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Byte[]"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Uri)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Uri"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.TimeSpan)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.TimeSpan"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.TimeSpan})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Guid)~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Guid"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.op_Implicit(System.Nullable{System.Guid})~Newtonsoft.Json.Linq.JToken">
+            <summary>
+            Performs an implicit conversion from <see cref="T:System.Nullable`1"/> to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="value">The value to create a <see cref="T:Newtonsoft.Json.Linq.JValue"/> from.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JValue"/> initialized with the specified value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.CreateReader">
+            <summary>
+            Creates an <see cref="T:Newtonsoft.Json.JsonReader"/> for this token.
+            </summary>
+            <returns>An <see cref="T:Newtonsoft.Json.JsonReader"/> that can be used to read this token and its descendants.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.FromObject(System.Object)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Linq.JToken"/> from an object.
+            </summary>
+            <param name="o">The object that will be used to create <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the value of the specified object</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.FromObject(System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Linq.JToken"/> from an object using the specified <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+            <param name="o">The object that will be used to create <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</param>
+            <param name="jsonSerializer">The <see cref="T:Newtonsoft.Json.JsonSerializer"/> that will be used when reading the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the value of the specified object</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.ToObject``1">
+            <summary>
+            Creates the specified .NET type from the <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <typeparam name="T">The object type that the token will be deserialized to.</typeparam>
+            <returns>The new object created from the JSON value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.ToObject(System.Type)">
+            <summary>
+            Creates the specified .NET type from the <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="objectType">The object type that the token will be deserialized to.</param>
+            <returns>The new object created from the JSON value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.ToObject``1(Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Creates the specified .NET type from the <see cref="T:Newtonsoft.Json.Linq.JToken"/> using the specified <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+            <typeparam name="T">The object type that the token will be deserialized to.</typeparam>
+            <param name="jsonSerializer">The <see cref="T:Newtonsoft.Json.JsonSerializer"/> that will be used when creating the object.</param>
+            <returns>The new object created from the JSON value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.ToObject(System.Type,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Creates the specified .NET type from the <see cref="T:Newtonsoft.Json.Linq.JToken"/> using the specified <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+            <param name="objectType">The object type that the token will be deserialized to.</param>
+            <param name="jsonSerializer">The <see cref="T:Newtonsoft.Json.JsonSerializer"/> that will be used when creating the object.</param>
+            <returns>The new object created from the JSON value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.ReadFrom(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Linq.JToken"/> from a <see cref="T:Newtonsoft.Json.JsonReader"/>.
+            </summary>
+            <param name="reader">An <see cref="T:Newtonsoft.Json.JsonReader"/> positioned at the token to read into this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</param>
+            <returns>
+            An <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the token and its descendant tokens
+            that were read from the reader. The runtime type of the token is determined
+            by the token type of the first token encountered in the reader.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.Parse(System.String)">
+            <summary>
+            Load a <see cref="T:Newtonsoft.Json.Linq.JToken"/> from a string that contains JSON.
+            </summary>
+            <param name="json">A <see cref="T:System.String"/> that contains JSON.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JToken"/> populated from the string that contains JSON.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.Load(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Linq.JToken"/> from a <see cref="T:Newtonsoft.Json.JsonReader"/>.
+            </summary>
+            <param name="reader">An <see cref="T:Newtonsoft.Json.JsonReader"/> positioned at the token to read into this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</param>
+            <returns>
+            An <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the token and its descendant tokens
+            that were read from the reader. The runtime type of the token is determined
+            by the token type of the first token encountered in the reader.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.SelectToken(System.String)">
+            <summary>
+            Selects a <see cref="T:Newtonsoft.Json.Linq.JToken"/> using a JPath expression. Selects the token that matches the object path.
+            </summary>
+            <param name="path">
+            A <see cref="T:System.String"/> that contains a JPath expression.
+            </param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JToken"/>, or null.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.SelectToken(System.String,System.Boolean)">
+            <summary>
+            Selects a <see cref="T:Newtonsoft.Json.Linq.JToken"/> using a JPath expression. Selects the token that matches the object path.
+            </summary>
+            <param name="path">
+            A <see cref="T:System.String"/> that contains a JPath expression.
+            </param>
+            <param name="errorWhenNoMatch">A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.SelectTokens(System.String)">
+            <summary>
+            Selects a collection of elements using a JPath expression.
+            </summary>
+            <param name="path">
+            A <see cref="T:System.String"/> that contains a JPath expression.
+            </param>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> that contains the selected elements.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.SelectTokens(System.String,System.Boolean)">
+            <summary>
+            Selects a collection of elements using a JPath expression.
+            </summary>
+            <param name="path">
+            A <see cref="T:System.String"/> that contains a JPath expression.
+            </param>
+            <param name="errorWhenNoMatch">A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression.</param>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> that contains the selected elements.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.GetMetaObject(System.Linq.Expressions.Expression)">
+            <summary>
+            Returns the <see cref="T:System.Dynamic.DynamicMetaObject"/> responsible for binding operations performed on this object.
+            </summary>
+            <param name="parameter">The expression tree representation of the runtime value.</param>
+            <returns>
+            The <see cref="T:System.Dynamic.DynamicMetaObject"/> to bind this object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.System#Dynamic#IDynamicMetaObjectProvider#GetMetaObject(System.Linq.Expressions.Expression)">
+            <summary>
+            Returns the <see cref="T:System.Dynamic.DynamicMetaObject"/> responsible for binding operations performed on this object.
+            </summary>
+            <param name="parameter">The expression tree representation of the runtime value.</param>
+            <returns>
+            The <see cref="T:System.Dynamic.DynamicMetaObject"/> to bind this object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JToken.DeepClone">
+            <summary>
+            Creates a new instance of the <see cref="T:Newtonsoft.Json.Linq.JToken"/>. All child tokens are recursively cloned.
+            </summary>
+            <returns>A new instance of the <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JToken.EqualityComparer">
+            <summary>
+            Gets a comparer that can compare two tokens for value equality.
+            </summary>
+            <value>A <see cref="T:Newtonsoft.Json.Linq.JTokenEqualityComparer"/> that can compare two nodes for value equality.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JToken.Parent">
+            <summary>
+            Gets or sets the parent.
+            </summary>
+            <value>The parent.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JToken.Root">
+            <summary>
+            Gets the root <see cref="T:Newtonsoft.Json.Linq.JToken"/> of this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <value>The root <see cref="T:Newtonsoft.Json.Linq.JToken"/> of this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JToken.Type">
+            <summary>
+            Gets the node type for this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <value>The type.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JToken.HasValues">
+            <summary>
+            Gets a value indicating whether this token has child tokens.
+            </summary>
+            <value>
+            	<c>true</c> if this token has child values; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JToken.Next">
+            <summary>
+            Gets the next sibling token of this node.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the next sibling token.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JToken.Previous">
+            <summary>
+            Gets the previous sibling token of this node.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the previous sibling token.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JToken.Path">
+            <summary>
+            Gets the path of the JSON token. 
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JToken.Item(System.Object)">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified key.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified key.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JToken.First">
+            <summary>
+            Get the first child token of this token.
+            </summary>
+            <value>A <see cref="T:Newtonsoft.Json.Linq.JToken"/> containing the first child token of the <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JToken.Last">
+            <summary>
+            Get the last child token of this token.
+            </summary>
+            <value>A <see cref="T:Newtonsoft.Json.Linq.JToken"/> containing the last child token of the <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</value>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(Newtonsoft.Json.Linq.JValue)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class from another <see cref="T:Newtonsoft.Json.Linq.JValue"/> object.
+            </summary>
+            <param name="other">A <see cref="T:Newtonsoft.Json.Linq.JValue"/> object to copy from.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.Int64)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.Decimal)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.Char)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.UInt64)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.Double)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.Single)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.DateTime)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.DateTimeOffset)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.Boolean)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.Guid)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.Uri)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.TimeSpan)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JValue"/> class with the given value.
+            </summary>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.CreateComment(System.String)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Linq.JValue"/> comment with the given value.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JValue"/> comment with the given value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.CreateString(System.String)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Linq.JValue"/> string with the given value.
+            </summary>
+            <param name="value">The value.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JValue"/> string with the given value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])">
+            <summary>
+            Writes this token to a <see cref="T:Newtonsoft.Json.JsonWriter"/>.
+            </summary>
+            <param name="writer">A <see cref="T:Newtonsoft.Json.JsonWriter"/> into which this method will write.</param>
+            <param name="converters">A collection of <see cref="T:Newtonsoft.Json.JsonConverter"/> which will be used when writing the token.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.Equals(Newtonsoft.Json.Linq.JValue)">
+            <summary>
+            Indicates whether the current object is equal to another object of the same type.
+            </summary>
+            <returns>
+            true if the current object is equal to the <paramref name="other"/> parameter; otherwise, false.
+            </returns>
+            <param name="other">An object to compare with this object.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.Equals(System.Object)">
+            <summary>
+            Determines whether the specified <see cref="T:System.Object"/> is equal to the current <see cref="T:System.Object"/>.
+            </summary>
+            <param name="obj">The <see cref="T:System.Object"/> to compare with the current <see cref="T:System.Object"/>.</param>
+            <returns>
+            true if the specified <see cref="T:System.Object"/> is equal to the current <see cref="T:System.Object"/>; otherwise, false.
+            </returns>
+            <exception cref="T:System.NullReferenceException">
+            The <paramref name="obj"/> parameter is null.
+            </exception>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.GetHashCode">
+            <summary>
+            Serves as a hash function for a particular type.
+            </summary>
+            <returns>
+            A hash code for the current <see cref="T:System.Object"/>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.ToString">
+            <summary>
+            Returns a <see cref="T:System.String"/> that represents this instance.
+            </summary>
+            <returns>
+            A <see cref="T:System.String"/> that represents this instance.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.ToString(System.String)">
+            <summary>
+            Returns a <see cref="T:System.String"/> that represents this instance.
+            </summary>
+            <param name="format">The format.</param>
+            <returns>
+            A <see cref="T:System.String"/> that represents this instance.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.ToString(System.IFormatProvider)">
+            <summary>
+            Returns a <see cref="T:System.String"/> that represents this instance.
+            </summary>
+            <param name="formatProvider">The format provider.</param>
+            <returns>
+            A <see cref="T:System.String"/> that represents this instance.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.ToString(System.String,System.IFormatProvider)">
+            <summary>
+            Returns a <see cref="T:System.String"/> that represents this instance.
+            </summary>
+            <param name="format">The format.</param>
+            <param name="formatProvider">The format provider.</param>
+            <returns>
+            A <see cref="T:System.String"/> that represents this instance.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.GetMetaObject(System.Linq.Expressions.Expression)">
+            <summary>
+            Returns the <see cref="T:System.Dynamic.DynamicMetaObject"/> responsible for binding operations performed on this object.
+            </summary>
+            <param name="parameter">The expression tree representation of the runtime value.</param>
+            <returns>
+            The <see cref="T:System.Dynamic.DynamicMetaObject"/> to bind this object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JValue.CompareTo(Newtonsoft.Json.Linq.JValue)">
+            <summary>
+            Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object.
+            </summary>
+            <param name="obj">An object to compare with this instance.</param>
+            <returns>
+            A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings:
+            Value
+            Meaning
+            Less than zero
+            This instance is less than <paramref name="obj"/>.
+            Zero
+            This instance is equal to <paramref name="obj"/>.
+            Greater than zero
+            This instance is greater than <paramref name="obj"/>.
+            </returns>
+            <exception cref="T:System.ArgumentException">
+            	<paramref name="obj"/> is not the same type as this instance.
+            </exception>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JValue.HasValues">
+            <summary>
+            Gets a value indicating whether this token has child tokens.
+            </summary>
+            <value>
+            	<c>true</c> if this token has child values; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JValue.Type">
+            <summary>
+            Gets the node type for this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <value>The type.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JValue.Value">
+            <summary>
+            Gets or sets the underlying token value.
+            </summary>
+            <value>The underlying token value.</value>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JRaw.#ctor(Newtonsoft.Json.Linq.JRaw)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JRaw"/> class from another <see cref="T:Newtonsoft.Json.Linq.JRaw"/> object.
+            </summary>
+            <param name="other">A <see cref="T:Newtonsoft.Json.Linq.JRaw"/> object to copy from.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JRaw.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JRaw"/> class.
+            </summary>
+            <param name="rawJson">The raw json.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JRaw.Create(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Creates an instance of <see cref="T:Newtonsoft.Json.Linq.JRaw"/> with the content of the reader's current token.
+            </summary>
+            <param name="reader">The reader.</param>
+            <returns>An instance of <see cref="T:Newtonsoft.Json.Linq.JRaw"/> with the content of the reader's current token.</returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Required">
+            <summary>
+            Indicating whether a property is required.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Required.Default">
+            <summary>
+            The property is not required. The default state.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Required.AllowNull">
+            <summary>
+            The property must be defined in JSON but can be a null value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Required.Always">
+            <summary>
+            The property must be defined in JSON and cannot be a null value.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonDynamicContract">
+            <summary>
+            Contract details for a <see cref="T:System.Type"/> used by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonDynamicContract.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.JsonDynamicContract"/> class.
+            </summary>
+            <param name="underlyingType">The underlying type for the contract.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonDynamicContract.Properties">
+            <summary>
+            Gets the object's properties.
+            </summary>
+            <value>The object's properties.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonDynamicContract.PropertyNameResolver">
+            <summary>
+            Gets or sets the property name resolver.
+            </summary>
+            <value>The property name resolver.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonISerializableContract">
+            <summary>
+            Contract details for a <see cref="T:System.Type"/> used by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonISerializableContract.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.JsonISerializableContract"/> class.
+            </summary>
+            <param name="underlyingType">The underlying type for the contract.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonISerializableContract.ISerializableCreator">
+            <summary>
+            Gets or sets the ISerializable object constructor.
+            </summary>
+            <value>The ISerializable object constructor.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonLinqContract">
+            <summary>
+            Contract details for a <see cref="T:System.Type"/> used by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonLinqContract.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.JsonLinqContract"/> class.
+            </summary>
+            <param name="underlyingType">The underlying type for the contract.</param>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonPrimitiveContract">
+            <summary>
+            Contract details for a <see cref="T:System.Type"/> used by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonPrimitiveContract.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.JsonPrimitiveContract"/> class.
+            </summary>
+            <param name="underlyingType">The underlying type for the contract.</param>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.DynamicValueProvider">
+            <summary>
+            Get and set values for a <see cref="T:System.Reflection.MemberInfo"/> using dynamic methods.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DynamicValueProvider.#ctor(System.Reflection.MemberInfo)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.DynamicValueProvider"/> class.
+            </summary>
+            <param name="memberInfo">The member info.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DynamicValueProvider.SetValue(System.Object,System.Object)">
+            <summary>
+            Sets the value.
+            </summary>
+            <param name="target">The target to set the value on.</param>
+            <param name="value">The value to set on the target.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(System.Object)">
+            <summary>
+            Gets the value.
+            </summary>
+            <param name="target">The target to get the value from.</param>
+            <returns>The value.</returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.ErrorEventArgs">
+            <summary>
+            Provides data for the Error event.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.ErrorEventArgs.#ctor(System.Object,Newtonsoft.Json.Serialization.ErrorContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.ErrorEventArgs"/> class.
+            </summary>
+            <param name="currentObject">The current object.</param>
+            <param name="errorContext">The error context.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.ErrorEventArgs.CurrentObject">
+            <summary>
+            Gets the current object the error event is being raised against.
+            </summary>
+            <value>The current object the error event is being raised against.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.ErrorEventArgs.ErrorContext">
+            <summary>
+            Gets the error context.
+            </summary>
+            <value>The error context.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JPropertyDescriptor">
+            <summary>
+            Represents a view of a <see cref="T:Newtonsoft.Json.Linq.JProperty"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JPropertyDescriptor.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JPropertyDescriptor"/> class.
+            </summary>
+            <param name="name">The name.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JPropertyDescriptor.CanResetValue(System.Object)">
+            <summary>
+            When overridden in a derived class, returns whether resetting an object changes its value.
+            </summary>
+            <returns>
+            true if resetting the component changes its value; otherwise, false.
+            </returns>
+            <param name="component">The component to test for reset capability. 
+                            </param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JPropertyDescriptor.GetValue(System.Object)">
+            <summary>
+            When overridden in a derived class, gets the current value of the property on a component.
+            </summary>
+            <returns>
+            The value of a property for a given component.
+            </returns>
+            <param name="component">The component with the property for which to retrieve the value. 
+                            </param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JPropertyDescriptor.ResetValue(System.Object)">
+            <summary>
+            When overridden in a derived class, resets the value for this property of the component to the default value.
+            </summary>
+            <param name="component">The component with the property value that is to be reset to the default value. 
+                            </param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JPropertyDescriptor.SetValue(System.Object,System.Object)">
+            <summary>
+            When overridden in a derived class, sets the value of the component to a different value.
+            </summary>
+            <param name="component">The component with the property value that is to be set. 
+                            </param><param name="value">The new value. 
+                            </param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JPropertyDescriptor.ShouldSerializeValue(System.Object)">
+            <summary>
+            When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted.
+            </summary>
+            <returns>
+            true if the property should be persisted; otherwise, false.
+            </returns>
+            <param name="component">The component with the property to be examined for persistence. 
+                            </param>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JPropertyDescriptor.ComponentType">
+            <summary>
+            When overridden in a derived class, gets the type of the component this property is bound to.
+            </summary>
+            <returns>
+            A <see cref="T:System.Type"/> that represents the type of component this property is bound to. When the <see cref="M:System.ComponentModel.PropertyDescriptor.GetValue(System.Object)"/> or <see cref="M:System.ComponentModel.PropertyDescriptor.SetValue(System.Object,System.Object)"/> methods are invoked, the object specified might be an instance of this type.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JPropertyDescriptor.IsReadOnly">
+            <summary>
+            When overridden in a derived class, gets a value indicating whether this property is read-only.
+            </summary>
+            <returns>
+            true if the property is read-only; otherwise, false.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JPropertyDescriptor.PropertyType">
+            <summary>
+            When overridden in a derived class, gets the type of the property.
+            </summary>
+            <returns>
+            A <see cref="T:System.Type"/> that represents the type of the property.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JPropertyDescriptor.NameHashCode">
+            <summary>
+            Gets the hash code for the name of the member.
+            </summary>
+            <value></value>
+            <returns>
+            The hash code for the name of the member.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.IReferenceResolver">
+            <summary>
+            Used to resolve references when serializing and deserializing JSON by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.IReferenceResolver.ResolveReference(System.Object,System.String)">
+            <summary>
+            Resolves a reference to its object.
+            </summary>
+            <param name="context">The serialization context.</param>
+            <param name="reference">The reference to resolve.</param>
+            <returns>The object that</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.IReferenceResolver.GetReference(System.Object,System.Object)">
+            <summary>
+            Gets the reference for the sepecified object.
+            </summary>
+            <param name="context">The serialization context.</param>
+            <param name="value">The object to get a reference for.</param>
+            <returns>The reference to the object.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.IReferenceResolver.IsReferenced(System.Object,System.Object)">
+            <summary>
+            Determines whether the specified object is referenced.
+            </summary>
+            <param name="context">The serialization context.</param>
+            <param name="value">The object to test for a reference.</param>
+            <returns>
+            	<c>true</c> if the specified object is referenced; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.IReferenceResolver.AddReference(System.Object,System.String,System.Object)">
+            <summary>
+            Adds a reference to the specified object.
+            </summary>
+            <param name="context">The serialization context.</param>
+            <param name="reference">The reference.</param>
+            <param name="value">The object to reference.</param>
+        </member>
+        <member name="T:Newtonsoft.Json.PreserveReferencesHandling">
+            <summary>
+            Specifies reference handling options for the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement ISerializable.
+            </summary>
+            <example>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\SerializationTests.cs" region="PreservingObjectReferencesOn" title="Preserve Object References"/>       
+            </example>
+        </member>
+        <member name="F:Newtonsoft.Json.PreserveReferencesHandling.None">
+            <summary>
+            Do not preserve references when serializing types.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.PreserveReferencesHandling.Objects">
+            <summary>
+            Preserve references when serializing into a JSON object structure.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.PreserveReferencesHandling.Arrays">
+            <summary>
+            Preserve references when serializing into a JSON array structure.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.PreserveReferencesHandling.All">
+            <summary>
+            Preserve references when serializing.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonArrayAttribute">
+            <summary>
+            Instructs the <see cref="T:Newtonsoft.Json.JsonSerializer"/> how to serialize the collection.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonArrayAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonArrayAttribute"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonArrayAttribute.#ctor(System.Boolean)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonObjectAttribute"/> class with a flag indicating whether the array can contain null items
+            </summary>
+            <param name="allowNullItems">A flag indicating whether the array can contain null items.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonArrayAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonArrayAttribute"/> class with the specified container Id.
+            </summary>
+            <param name="id">The container Id.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonArrayAttribute.AllowNullItems">
+            <summary>
+            Gets or sets a value indicating whether null items are allowed in the collection.
+            </summary>
+            <value><c>true</c> if null items are allowed in the collection; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.DefaultValueHandling">
+            <summary>
+            Specifies default value handling options for the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+            <example>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\SerializationTests.cs" region="ReducingSerializedJsonSizeDefaultValueHandlingObject" title="DefaultValueHandling Class"/>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\SerializationTests.cs" region="ReducingSerializedJsonSizeDefaultValueHandlingExample" title="DefaultValueHandling Ignore Example"/>
+            </example>
+        </member>
+        <member name="F:Newtonsoft.Json.DefaultValueHandling.Include">
+            <summary>
+            Include members where the member value is the same as the member's default value when serializing objects.
+            Included members are written to JSON. Has no effect when deserializing.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DefaultValueHandling.Ignore">
+            <summary>
+            Ignore members where the member value is the same as the member's default value when serializing objects
+            so that is is not written to JSON.
+            This option will ignore all default values (e.g. <c>null</c> for objects and nullable typesl; <c>0</c> for integers,
+            decimals and floating point numbers; and <c>false</c> for booleans). The default value ignored can be changed by
+            placing the <see cref="T:System.ComponentModel.DefaultValueAttribute"/> on the property.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DefaultValueHandling.Populate">
+            <summary>
+            Members with a default value but no JSON will be set to their default value when deserializing.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.DefaultValueHandling.IgnoreAndPopulate">
+            <summary>
+            Ignore members where the member value is the same as the member's default value when serializing objects
+            and sets members to their default value when deserializing.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonConverterAttribute">
+            <summary>
+            Instructs the <see cref="T:Newtonsoft.Json.JsonSerializer"/> to use the specified <see cref="T:Newtonsoft.Json.JsonConverter"/> when serializing the member or class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConverterAttribute.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonConverterAttribute"/> class.
+            </summary>
+            <param name="converterType">Type of the converter.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonConverterAttribute.ConverterType">
+            <summary>
+            Gets the type of the converter.
+            </summary>
+            <value>The type of the converter.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonObjectAttribute">
+            <summary>
+            Instructs the <see cref="T:Newtonsoft.Json.JsonSerializer"/> how to serialize the object.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonObjectAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonObjectAttribute"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonObjectAttribute.#ctor(Newtonsoft.Json.MemberSerialization)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonObjectAttribute"/> class with the specified member serialization.
+            </summary>
+            <param name="memberSerialization">The member serialization.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonObjectAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonObjectAttribute"/> class with the specified container Id.
+            </summary>
+            <param name="id">The container Id.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonObjectAttribute.MemberSerialization">
+            <summary>
+            Gets or sets the member serialization.
+            </summary>
+            <value>The member serialization.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonObjectAttribute.ItemRequired">
+            <summary>
+            Gets or sets a value that indicates whether the object's properties are required.
+            </summary>
+            <value>
+            	A value indicating whether the object's properties are required.
+            </value>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonSerializerSettings">
+            <summary>
+            Specifies the settings on a <see cref="T:Newtonsoft.Json.JsonSerializer"/> object.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializerSettings.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> class.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.ReferenceLoopHandling">
+            <summary>
+            Gets or sets how reference loops (e.g. a class referencing itself) is handled.
+            </summary>
+            <value>Reference loop handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.MissingMemberHandling">
+            <summary>
+            Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization.
+            </summary>
+            <value>Missing member handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.ObjectCreationHandling">
+            <summary>
+            Gets or sets how objects are created during deserialization.
+            </summary>
+            <value>The object creation handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.NullValueHandling">
+            <summary>
+            Gets or sets how null values are handled during serialization and deserialization.
+            </summary>
+            <value>Null value handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.DefaultValueHandling">
+            <summary>
+            Gets or sets how null default are handled during serialization and deserialization.
+            </summary>
+            <value>The default value handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.Converters">
+            <summary>
+            Gets or sets a collection <see cref="T:Newtonsoft.Json.JsonConverter"/> that will be used during serialization.
+            </summary>
+            <value>The converters.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.PreserveReferencesHandling">
+            <summary>
+            Gets or sets how object references are preserved by the serializer.
+            </summary>
+            <value>The preserve references handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.TypeNameHandling">
+            <summary>
+            Gets or sets how type name writing and reading is handled by the serializer.
+            </summary>
+            <value>The type name handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.TypeNameAssemblyFormat">
+            <summary>
+            Gets or sets how a type name assembly is written and resolved by the serializer.
+            </summary>
+            <value>The type name assembly format.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.ConstructorHandling">
+            <summary>
+            Gets or sets how constructors are used during deserialization.
+            </summary>
+            <value>The constructor handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.ContractResolver">
+            <summary>
+            Gets or sets the contract resolver used by the serializer when
+            serializing .NET objects to JSON and vice versa.
+            </summary>
+            <value>The contract resolver.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.ReferenceResolver">
+            <summary>
+            Gets or sets the <see cref="T:Newtonsoft.Json.Serialization.IReferenceResolver"/> used by the serializer when resolving references.
+            </summary>
+            <value>The reference resolver.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.TraceWriter">
+            <summary>
+            Gets or sets the <see cref="T:Newtonsoft.Json.Serialization.ITraceWriter"/> used by the serializer when writing trace messages.
+            </summary>
+            <value>The trace writer.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.Binder">
+            <summary>
+            Gets or sets the <see cref="T:System.Runtime.Serialization.SerializationBinder"/> used by the serializer when resolving type names.
+            </summary>
+            <value>The binder.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.Error">
+            <summary>
+            Gets or sets the error handler called during serialization and deserialization.
+            </summary>
+            <value>The error handler called during serialization and deserialization.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.Context">
+            <summary>
+            Gets or sets the <see cref="T:System.Runtime.Serialization.StreamingContext"/> used by the serializer when invoking serialization callback methods.
+            </summary>
+            <value>The context.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.DateFormatString">
+            <summary>
+            Get or set how <see cref="T:System.DateTime"/> and <see cref="T:System.DateTimeOffset"/> values are formatting when writing JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.MaxDepth">
+            <summary>
+            Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a <see cref="T:Newtonsoft.Json.JsonReaderException"/>.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.Formatting">
+            <summary>
+            Indicates how JSON text output is formatted.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.DateFormatHandling">
+            <summary>
+            Get or set how dates are written to JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.DateTimeZoneHandling">
+            <summary>
+            Get or set how <see cref="T:System.DateTime"/> time zones are handling during serialization and deserialization.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.DateParseHandling">
+            <summary>
+            Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.FloatFormatHandling">
+            <summary>
+            Get or set how special floating point numbers, e.g. <see cref="F:System.Double.NaN"/>,
+            <see cref="F:System.Double.PositiveInfinity"/> and <see cref="F:System.Double.NegativeInfinity"/>,
+            are written as JSON.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.FloatParseHandling">
+            <summary>
+            Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.StringEscapeHandling">
+            <summary>
+            Get or set how strings are escaped when writing JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.Culture">
+            <summary>
+            Gets or sets the culture used when reading JSON. Defaults to <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializerSettings.CheckAdditionalContent">
+            <summary>
+            Gets a value indicating whether there will be a check for additional content after deserializing an object.
+            </summary>
+            <value>
+            	<c>true</c> if there will be a check for additional content after deserializing an object; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonValidatingReader">
+            <summary>
+            Represents a reader that provides <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> validation.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonValidatingReader.#ctor(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonValidatingReader"/> class that
+            validates the content returned from the given <see cref="T:Newtonsoft.Json.JsonReader"/>.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from while validating.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonValidatingReader.ReadAsInt32">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonValidatingReader.ReadAsBytes">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:Byte[]"/>.
+            </summary>
+            <returns>
+            A <see cref="T:Byte[]"/> or a null reference if the next JSON token is null.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonValidatingReader.ReadAsDecimal">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonValidatingReader.ReadAsString">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.String"/>.
+            </summary>
+            <returns>A <see cref="T:System.String"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonValidatingReader.ReadAsDateTime">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.String"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonValidatingReader.ReadAsDateTimeOffset">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonValidatingReader.Read">
+            <summary>
+            Reads the next JSON token from the stream.
+            </summary>
+            <returns>
+            true if the next token was read successfully; false if there are no more tokens to read.
+            </returns>
+        </member>
+        <member name="E:Newtonsoft.Json.JsonValidatingReader.ValidationEventHandler">
+            <summary>
+            Sets an event handler for receiving schema validation errors.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonValidatingReader.Value">
+            <summary>
+            Gets the text value of the current JSON token.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonValidatingReader.Depth">
+            <summary>
+            Gets the depth of the current token in the JSON document.
+            </summary>
+            <value>The depth of the current token in the JSON document.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonValidatingReader.Path">
+            <summary>
+            Gets the path of the current JSON token. 
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonValidatingReader.QuoteChar">
+            <summary>
+            Gets the quotation mark character used to enclose the value of a string.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonValidatingReader.TokenType">
+            <summary>
+            Gets the type of the current JSON token.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonValidatingReader.ValueType">
+            <summary>
+            Gets the Common Language Runtime (CLR) type for the current JSON token.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonValidatingReader.Schema">
+            <summary>
+            Gets or sets the schema.
+            </summary>
+            <value>The schema.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonValidatingReader.Reader">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.JsonReader"/> used to construct this <see cref="T:Newtonsoft.Json.JsonValidatingReader"/>.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.JsonReader"/> specified in the constructor.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JTokenEqualityComparer">
+            <summary>
+            Compares tokens to determine whether they are equal.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenEqualityComparer.Equals(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Linq.JToken)">
+            <summary>
+            Determines whether the specified objects are equal.
+            </summary>
+            <param name="x">The first object of type <see cref="T:Newtonsoft.Json.Linq.JToken"/> to compare.</param>
+            <param name="y">The second object of type <see cref="T:Newtonsoft.Json.Linq.JToken"/> to compare.</param>
+            <returns>
+            true if the specified objects are equal; otherwise, false.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenEqualityComparer.GetHashCode(Newtonsoft.Json.Linq.JToken)">
+            <summary>
+            Returns a hash code for the specified object.
+            </summary>
+            <param name="obj">The <see cref="T:System.Object"/> for which a hash code is to be returned.</param>
+            <returns>A hash code for the specified object.</returns>
+            <exception cref="T:System.ArgumentNullException">The type of <paramref name="obj"/> is a reference type and <paramref name="obj"/> is null.</exception>
+        </member>
+        <member name="T:Newtonsoft.Json.MemberSerialization">
+            <summary>
+            Specifies the member serialization options for the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.MemberSerialization.OptOut">
+            <summary>
+            All public members are serialized by default. Members can be excluded using <see cref="T:Newtonsoft.Json.JsonIgnoreAttribute"/> or <see cref="T:System.NonSerializedAttribute"/>.
+            This is the default member serialization mode.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.MemberSerialization.OptIn">
+            <summary>
+            Only members must be marked with <see cref="T:Newtonsoft.Json.JsonPropertyAttribute"/> or <see cref="T:System.Runtime.Serialization.DataMemberAttribute"/> are serialized.
+            This member serialization mode can also be set by marking the class with <see cref="T:System.Runtime.Serialization.DataContractAttribute"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.MemberSerialization.Fields">
+            <summary>
+            All public and private fields are serialized. Members can be excluded using <see cref="T:Newtonsoft.Json.JsonIgnoreAttribute"/> or <see cref="T:System.NonSerializedAttribute"/>.
+            This member serialization mode can also be set by marking the class with <see cref="T:System.SerializableAttribute"/>
+            and setting IgnoreSerializableAttribute on <see cref="T:Newtonsoft.Json.Serialization.DefaultContractResolver"/> to false.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.ObjectCreationHandling">
+            <summary>
+            Specifies how object creation is handled by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.ObjectCreationHandling.Auto">
+            <summary>
+            Reuse existing objects, create new objects when needed.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.ObjectCreationHandling.Reuse">
+            <summary>
+            Only reuse existing objects.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.ObjectCreationHandling.Replace">
+            <summary>
+            Always create new objects.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.IsoDateTimeConverter">
+            <summary>
+            Converts a <see cref="T:System.DateTime"/> to and from the ISO 8601 date format (e.g. 2008-04-12T12:53Z).
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.IsoDateTimeConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.IsoDateTimeConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Converters.IsoDateTimeConverter.DateTimeStyles">
+            <summary>
+            Gets or sets the date time styles used when converting a date to and from JSON.
+            </summary>
+            <value>The date time styles used when converting a date to and from JSON.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Converters.IsoDateTimeConverter.DateTimeFormat">
+            <summary>
+            Gets or sets the date time format used when converting a date to and from JSON.
+            </summary>
+            <value>The date time format used when converting a date to and from JSON.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Converters.IsoDateTimeConverter.Culture">
+            <summary>
+            Gets or sets the culture used when converting a date to and from JSON.
+            </summary>
+            <value>The culture used when converting a date to and from JSON.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.JavaScriptDateTimeConverter">
+            <summary>
+            Converts a <see cref="T:System.DateTime"/> to and from a JavaScript date constructor (e.g. new Date(52231943)).
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.JavaScriptDateTimeConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="value">The value.</param>
+            <param name="serializer">The calling serializer.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.JavaScriptDateTimeConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing property value of the JSON that is being converted.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Converters.XmlNodeConverter">
+            <summary>
+            Converts XML to and from JSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.XmlNodeConverter.WriteJson(Newtonsoft.Json.JsonWriter,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Writes the JSON representation of the object.
+            </summary>
+            <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param>
+            <param name="serializer">The calling serializer.</param>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.XmlNodeConverter.ReadJson(Newtonsoft.Json.JsonReader,System.Type,System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Reads the JSON representation of the object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param>
+            <param name="objectType">Type of the object.</param>
+            <param name="existingValue">The existing value of object being read.</param>
+            <param name="serializer">The calling serializer.</param>
+            <returns>The object value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.XmlNodeConverter.IsNamespaceAttribute(System.String,System.String@)">
+            <summary>
+            Checks if the attributeName is a namespace attribute.
+            </summary>
+            <param name="attributeName">Attribute name to test.</param>
+            <param name="prefix">The attribute name prefix if it has one, otherwise an empty string.</param>
+            <returns>True if attribute name is for a namespace attribute, otherwise false.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Converters.XmlNodeConverter.CanConvert(System.Type)">
+            <summary>
+            Determines whether this instance can convert the specified value type.
+            </summary>
+            <param name="valueType">Type of the value.</param>
+            <returns>
+            	<c>true</c> if this instance can convert the specified value type; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Converters.XmlNodeConverter.DeserializeRootElementName">
+            <summary>
+            Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produces multiple root elements.
+            </summary>
+            <value>The name of the deserialize root element.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Converters.XmlNodeConverter.WriteArrayAttribute">
+            <summary>
+            Gets or sets a flag to indicate whether to write the Json.NET array attribute.
+            This attribute helps preserve arrays when converting the written XML back to JSON.
+            </summary>
+            <value><c>true</c> if the array attibute is written to the XML; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Converters.XmlNodeConverter.OmitRootObject">
+            <summary>
+            Gets or sets a value indicating whether to write the root JSON object.
+            </summary>
+            <value><c>true</c> if the JSON root object is omitted; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonTextReader">
+            <summary>
+            Represents a reader that provides fast, non-cached, forward-only access to JSON text data.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextReader.#ctor(System.IO.TextReader)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonReader"/> class with the specified <see cref="T:System.IO.TextReader"/>.
+            </summary>
+            <param name="reader">The <c>TextReader</c> containing the XML data to read.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextReader.Read">
+            <summary>
+            Reads the next JSON token from the stream.
+            </summary>
+            <returns>
+            true if the next token was read successfully; false if there are no more tokens to read.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextReader.ReadAsBytes">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:Byte[]"/>.
+            </summary>
+            <returns>
+            A <see cref="T:Byte[]"/> or a null reference if the next JSON token is null. This method will return <c>null</c> at the end of an array.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextReader.ReadAsDecimal">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextReader.ReadAsInt32">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextReader.ReadAsString">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.String"/>.
+            </summary>
+            <returns>A <see cref="T:System.String"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextReader.ReadAsDateTime">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.String"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextReader.ReadAsDateTimeOffset">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.DateTimeOffset"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextReader.Close">
+            <summary>
+            Changes the state to closed. 
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextReader.HasLineInfo">
+            <summary>
+            Gets a value indicating whether the class can return line information.
+            </summary>
+            <returns>
+            	<c>true</c> if LineNumber and LinePosition can be provided; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonTextReader.LineNumber">
+            <summary>
+            Gets the current line number.
+            </summary>
+            <value>
+            The current line number or 0 if no line information is available (for example, HasLineInfo returns false).
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonTextReader.LinePosition">
+            <summary>
+            Gets the current line position.
+            </summary>
+            <value>
+            The current line position or 0 if no line information is available (for example, HasLineInfo returns false).
+            </value>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonPropertyAttribute">
+            <summary>
+            Instructs the <see cref="T:Newtonsoft.Json.JsonSerializer"/> to always serialize the member with the specified name.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonPropertyAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonPropertyAttribute"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonPropertyAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonPropertyAttribute"/> class with the specified name.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.ItemConverterType">
+            <summary>
+            Gets or sets the converter used when serializing the property's collection items.
+            </summary>
+            <value>The collection's items converter.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.NullValueHandling">
+            <summary>
+            Gets or sets the null value handling used when serializing this property.
+            </summary>
+            <value>The null value handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.DefaultValueHandling">
+            <summary>
+            Gets or sets the default value handling used when serializing this property.
+            </summary>
+            <value>The default value handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.ReferenceLoopHandling">
+            <summary>
+            Gets or sets the reference loop handling used when serializing this property.
+            </summary>
+            <value>The reference loop handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.ObjectCreationHandling">
+            <summary>
+            Gets or sets the object creation handling used when deserializing this property.
+            </summary>
+            <value>The object creation handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.TypeNameHandling">
+            <summary>
+            Gets or sets the type name handling used when serializing this property.
+            </summary>
+            <value>The type name handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.IsReference">
+            <summary>
+            Gets or sets whether this property's value is serialized as a reference.
+            </summary>
+            <value>Whether this property's value is serialized as a reference.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.Order">
+            <summary>
+            Gets or sets the order of serialization and deserialization of a member.
+            </summary>
+            <value>The numeric order of serialization or deserialization.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.Required">
+            <summary>
+            Gets or sets a value indicating whether this property is required.
+            </summary>
+            <value>
+            	A value indicating whether this property is required.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.PropertyName">
+            <summary>
+            Gets or sets the name of the property.
+            </summary>
+            <value>The name of the property.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.ItemReferenceLoopHandling">
+            <summary>
+            Gets or sets the the reference loop handling used when serializing the property's collection items.
+            </summary>
+            <value>The collection's items reference loop handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.ItemTypeNameHandling">
+            <summary>
+            Gets or sets the the type name handling used when serializing the property's collection items.
+            </summary>
+            <value>The collection's items type name handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonPropertyAttribute.ItemIsReference">
+            <summary>
+            Gets or sets whether this property's collection items are serialized as a reference.
+            </summary>
+            <value>Whether this property's collection items are serialized as a reference.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonIgnoreAttribute">
+            <summary>
+            Instructs the <see cref="T:Newtonsoft.Json.JsonSerializer"/> not to serialize the public field or public read/write property value.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonTextWriter">
+            <summary>
+            Represents a writer that provides a fast, non-cached, forward-only way of generating Json data.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.#ctor(System.IO.TextWriter)">
+            <summary>
+            Creates an instance of the <c>JsonWriter</c> class using the specified <see cref="T:System.IO.TextWriter"/>. 
+            </summary>
+            <param name="textWriter">The <c>TextWriter</c> to write to.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.Flush">
+            <summary>
+            Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.Close">
+            <summary>
+            Closes this stream and the underlying stream.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteStartObject">
+            <summary>
+            Writes the beginning of a Json object.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteStartArray">
+            <summary>
+            Writes the beginning of a Json array.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteStartConstructor(System.String)">
+            <summary>
+            Writes the start of a constructor with the given name.
+            </summary>
+            <param name="name">The name of the constructor.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteEnd(Newtonsoft.Json.JsonToken)">
+            <summary>
+            Writes the specified end token.
+            </summary>
+            <param name="token">The end token to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WritePropertyName(System.String)">
+            <summary>
+            Writes the property name of a name/value pair on a Json object.
+            </summary>
+            <param name="name">The name of the property.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WritePropertyName(System.String,System.Boolean)">
+            <summary>
+            Writes the property name of a name/value pair on a JSON object.
+            </summary>
+            <param name="name">The name of the property.</param>
+            <param name="escape">A flag to indicate whether the text should be escaped when it is written as a JSON property name.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteIndent">
+            <summary>
+            Writes indent characters.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValueDelimiter">
+            <summary>
+            Writes the JSON value delimiter.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteIndentSpace">
+            <summary>
+            Writes an indent space.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Object)">
+            <summary>
+            Writes a <see cref="T:System.Object"/> value.
+            An error will raised if the value cannot be written as a single JSON token.
+            </summary>
+            <param name="value">The <see cref="T:System.Object"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteNull">
+            <summary>
+            Writes a null value.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteUndefined">
+            <summary>
+            Writes an undefined value.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteRaw(System.String)">
+            <summary>
+            Writes raw JSON.
+            </summary>
+            <param name="json">The raw JSON to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.String)">
+            <summary>
+            Writes a <see cref="T:System.String"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.String"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Int32)">
+            <summary>
+            Writes a <see cref="T:System.Int32"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int32"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.UInt32)">
+            <summary>
+            Writes a <see cref="T:System.UInt32"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt32"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Int64)">
+            <summary>
+            Writes a <see cref="T:System.Int64"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int64"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.UInt64)">
+            <summary>
+            Writes a <see cref="T:System.UInt64"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt64"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Single)">
+            <summary>
+            Writes a <see cref="T:System.Single"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Single"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Nullable{System.Single})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Double)">
+            <summary>
+            Writes a <see cref="T:System.Double"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Double"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Nullable{System.Double})">
+            <summary>
+            Writes a <see cref="T:System.Nullable`1"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Nullable`1"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Boolean)">
+            <summary>
+            Writes a <see cref="T:System.Boolean"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Boolean"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Int16)">
+            <summary>
+            Writes a <see cref="T:System.Int16"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int16"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.UInt16)">
+            <summary>
+            Writes a <see cref="T:System.UInt16"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt16"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Char)">
+            <summary>
+            Writes a <see cref="T:System.Char"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Char"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Byte)">
+            <summary>
+            Writes a <see cref="T:System.Byte"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Byte"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.SByte)">
+            <summary>
+            Writes a <see cref="T:System.SByte"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.SByte"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Decimal)">
+            <summary>
+            Writes a <see cref="T:System.Decimal"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Decimal"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.DateTime)">
+            <summary>
+            Writes a <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.DateTime"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Byte[])">
+            <summary>
+            Writes a <see cref="T:Byte[]"/> value.
+            </summary>
+            <param name="value">The <see cref="T:Byte[]"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.DateTimeOffset)">
+            <summary>
+            Writes a <see cref="T:System.DateTimeOffset"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.DateTimeOffset"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Guid)">
+            <summary>
+            Writes a <see cref="T:System.Guid"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Guid"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.TimeSpan)">
+            <summary>
+            Writes a <see cref="T:System.TimeSpan"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.TimeSpan"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteValue(System.Uri)">
+            <summary>
+            Writes a <see cref="T:System.Uri"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Uri"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteComment(System.String)">
+            <summary>
+            Writes out a comment <code>/*...*/</code> containing the specified text. 
+            </summary>
+            <param name="text">Text to place inside the comment.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonTextWriter.WriteWhitespace(System.String)">
+            <summary>
+            Writes out the given white space.
+            </summary>
+            <param name="ws">The string of white space characters.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonTextWriter.Indentation">
+            <summary>
+            Gets or sets how many IndentChars to write for each level in the hierarchy when <see cref="T:Newtonsoft.Json.Formatting"/> is set to <c>Formatting.Indented</c>.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonTextWriter.QuoteChar">
+            <summary>
+            Gets or sets which character to use to quote attribute values.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonTextWriter.IndentChar">
+            <summary>
+            Gets or sets which character to use for indenting when <see cref="T:Newtonsoft.Json.Formatting"/> is set to <c>Formatting.Indented</c>.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonTextWriter.QuoteName">
+            <summary>
+            Gets or sets a value indicating whether object names will be surrounded with quotes.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonWriterException">
+            <summary>
+            The exception thrown when an error occurs while reading Json text.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriterException.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonWriterException"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriterException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonWriterException"/> class
+            with a specified error message.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriterException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonWriterException"/> class
+            with a specified error message and a reference to the inner exception that is the cause of this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonWriterException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonWriterException"/> class.
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="info"/> parameter is null. </exception>
+            <exception cref="T:System.Runtime.Serialization.SerializationException">The class name is null or <see cref="P:System.Exception.HResult"/> is zero (0). </exception>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonWriterException.Path">
+            <summary>
+            Gets the path to the JSON where the error occurred.
+            </summary>
+            <value>The path to the JSON where the error occurred.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonReaderException">
+            <summary>
+            The exception thrown when an error occurs while reading Json text.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReaderException.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonReaderException"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReaderException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonReaderException"/> class
+            with a specified error message.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReaderException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonReaderException"/> class
+            with a specified error message and a reference to the inner exception that is the cause of this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonReaderException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonReaderException"/> class.
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="info"/> parameter is null. </exception>
+            <exception cref="T:System.Runtime.Serialization.SerializationException">The class name is null or <see cref="P:System.Exception.HResult"/> is zero (0). </exception>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReaderException.LineNumber">
+            <summary>
+            Gets the line number indicating where the error occurred.
+            </summary>
+            <value>The line number indicating where the error occurred.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReaderException.LinePosition">
+            <summary>
+            Gets the line position indicating where the error occurred.
+            </summary>
+            <value>The line position indicating where the error occurred.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonReaderException.Path">
+            <summary>
+            Gets the path to the JSON where the error occurred.
+            </summary>
+            <value>The path to the JSON where the error occurred.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonConverterCollection">
+            <summary>
+            Represents a collection of <see cref="T:Newtonsoft.Json.JsonConverter"/>.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonConvert">
+            <summary>
+            Provides methods for converting between common language runtime types and JSON types.
+            </summary>
+            <example>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\SerializationTests.cs" region="SerializeObject" title="Serializing and Deserializing JSON with JsonConvert" />
+            </example>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonConvert.True">
+            <summary>
+            Represents JavaScript's boolean value true as a string. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonConvert.False">
+            <summary>
+            Represents JavaScript's boolean value false as a string. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonConvert.Null">
+            <summary>
+            Represents JavaScript's null as a string. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonConvert.Undefined">
+            <summary>
+            Represents JavaScript's undefined as a string. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonConvert.PositiveInfinity">
+            <summary>
+            Represents JavaScript's positive infinity as a string. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonConvert.NegativeInfinity">
+            <summary>
+            Represents JavaScript's negative infinity as a string. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonConvert.NaN">
+            <summary>
+            Represents JavaScript's NaN as a string. This field is read-only.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.DateTime)">
+            <summary>
+            Converts the <see cref="T:System.DateTime"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.DateTime"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.DateTime,Newtonsoft.Json.DateFormatHandling,Newtonsoft.Json.DateTimeZoneHandling)">
+            <summary>
+            Converts the <see cref="T:System.DateTime"/> to its JSON string representation using the <see cref="T:Newtonsoft.Json.DateFormatHandling"/> specified.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <param name="format">The format the date will be converted to.</param>
+            <param name="timeZoneHandling">The time zone handling when the date is converted to a string.</param>
+            <returns>A JSON string representation of the <see cref="T:System.DateTime"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.DateTimeOffset)">
+            <summary>
+            Converts the <see cref="T:System.DateTimeOffset"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.DateTimeOffset"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.DateTimeOffset,Newtonsoft.Json.DateFormatHandling)">
+            <summary>
+            Converts the <see cref="T:System.DateTimeOffset"/> to its JSON string representation using the <see cref="T:Newtonsoft.Json.DateFormatHandling"/> specified.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <param name="format">The format the date will be converted to.</param>
+            <returns>A JSON string representation of the <see cref="T:System.DateTimeOffset"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Boolean)">
+            <summary>
+            Converts the <see cref="T:System.Boolean"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Boolean"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Char)">
+            <summary>
+            Converts the <see cref="T:System.Char"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Char"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Enum)">
+            <summary>
+            Converts the <see cref="T:System.Enum"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Enum"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Int32)">
+            <summary>
+            Converts the <see cref="T:System.Int32"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Int32"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Int16)">
+            <summary>
+            Converts the <see cref="T:System.Int16"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Int16"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.UInt16)">
+            <summary>
+            Converts the <see cref="T:System.UInt16"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.UInt16"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.UInt32)">
+            <summary>
+            Converts the <see cref="T:System.UInt32"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.UInt32"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Int64)">
+            <summary>
+            Converts the <see cref="T:System.Int64"/>  to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Int64"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.UInt64)">
+            <summary>
+            Converts the <see cref="T:System.UInt64"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.UInt64"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Single)">
+            <summary>
+            Converts the <see cref="T:System.Single"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Single"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Double)">
+            <summary>
+            Converts the <see cref="T:System.Double"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Double"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Byte)">
+            <summary>
+            Converts the <see cref="T:System.Byte"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Byte"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.SByte)">
+            <summary>
+            Converts the <see cref="T:System.SByte"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.SByte"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Decimal)">
+            <summary>
+            Converts the <see cref="T:System.Decimal"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.SByte"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Guid)">
+            <summary>
+            Converts the <see cref="T:System.Guid"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Guid"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.TimeSpan)">
+            <summary>
+            Converts the <see cref="T:System.TimeSpan"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.TimeSpan"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Uri)">
+            <summary>
+            Converts the <see cref="T:System.Uri"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Uri"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.String)">
+            <summary>
+            Converts the <see cref="T:System.String"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.String"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.String,System.Char)">
+            <summary>
+            Converts the <see cref="T:System.String"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <param name="delimiter">The string delimiter character.</param>
+            <returns>A JSON string representation of the <see cref="T:System.String"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.ToString(System.Object)">
+            <summary>
+            Converts the <see cref="T:System.Object"/> to its JSON string representation.
+            </summary>
+            <param name="value">The value to convert.</param>
+            <returns>A JSON string representation of the <see cref="T:System.Object"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object)">
+            <summary>
+            Serializes the specified object to a JSON string.
+            </summary>
+            <param name="value">The object to serialize.</param>
+            <returns>A JSON string representation of the object.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,Newtonsoft.Json.Formatting)">
+            <summary>
+            Serializes the specified object to a JSON string using formatting.
+            </summary>
+            <param name="value">The object to serialize.</param>
+            <param name="formatting">Indicates how the output is formatted.</param>
+            <returns>
+            A JSON string representation of the object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,Newtonsoft.Json.JsonConverter[])">
+            <summary>
+            Serializes the specified object to a JSON string using a collection of <see cref="T:Newtonsoft.Json.JsonConverter"/>.
+            </summary>
+            <param name="value">The object to serialize.</param>
+            <param name="converters">A collection converters used while serializing.</param>
+            <returns>A JSON string representation of the object.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonConverter[])">
+            <summary>
+            Serializes the specified object to a JSON string using formatting and a collection of <see cref="T:Newtonsoft.Json.JsonConverter"/>.
+            </summary>
+            <param name="value">The object to serialize.</param>
+            <param name="formatting">Indicates how the output is formatted.</param>
+            <param name="converters">A collection converters used while serializing.</param>
+            <returns>A JSON string representation of the object.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Serializes the specified object to a JSON string using <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            </summary>
+            <param name="value">The object to serialize.</param>
+            <param name="settings">The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to serialize the object.
+            If this is null, default serialization settings will be is used.</param>
+            <returns>
+            A JSON string representation of the object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,System.Type,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Serializes the specified object to a JSON string using a type, formatting and <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            </summary>
+            <param name="value">The object to serialize.</param>
+            <param name="settings">The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to serialize the object.
+            If this is null, default serialization settings will be is used.</param>
+            <param name="type">
+            The type of the value being serialized.
+            This parameter is used when <see cref="T:Newtonsoft.Json.TypeNameHandling"/> is Auto to write out the type name if the type of the value does not match.
+            Specifing the type is optional.
+            </param>
+            <returns>
+            A JSON string representation of the object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Serializes the specified object to a JSON string using formatting and <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            </summary>
+            <param name="value">The object to serialize.</param>
+            <param name="formatting">Indicates how the output is formatted.</param>
+            <param name="settings">The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to serialize the object.
+            If this is null, default serialization settings will be is used.</param>
+            <returns>
+            A JSON string representation of the object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeObject(System.Object,System.Type,Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Serializes the specified object to a JSON string using a type, formatting and <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            </summary>
+            <param name="value">The object to serialize.</param>
+            <param name="formatting">Indicates how the output is formatted.</param>
+            <param name="settings">The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to serialize the object.
+            If this is null, default serialization settings will be is used.</param>
+            <param name="type">
+            The type of the value being serialized.
+            This parameter is used when <see cref="T:Newtonsoft.Json.TypeNameHandling"/> is Auto to write out the type name if the type of the value does not match.
+            Specifing the type is optional.
+            </param>
+            <returns>
+            A JSON string representation of the object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeObjectAsync(System.Object)">
+            <summary>
+            Asynchronously serializes the specified object to a JSON string.
+            Serialization will happen on a new thread.
+            </summary>
+            <param name="value">The object to serialize.</param>
+            <returns>
+            A task that represents the asynchronous serialize operation. The value of the <c>TResult</c> parameter contains a JSON string representation of the object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeObjectAsync(System.Object,Newtonsoft.Json.Formatting)">
+            <summary>
+            Asynchronously serializes the specified object to a JSON string using formatting.
+            Serialization will happen on a new thread.
+            </summary>
+            <param name="value">The object to serialize.</param>
+            <param name="formatting">Indicates how the output is formatted.</param>
+            <returns>
+            A task that represents the asynchronous serialize operation. The value of the <c>TResult</c> parameter contains a JSON string representation of the object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeObjectAsync(System.Object,Newtonsoft.Json.Formatting,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Asynchronously serializes the specified object to a JSON string using formatting and a collection of <see cref="T:Newtonsoft.Json.JsonConverter"/>.
+            Serialization will happen on a new thread.
+            </summary>
+            <param name="value">The object to serialize.</param>
+            <param name="formatting">Indicates how the output is formatted.</param>
+            <param name="settings">The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to serialize the object.
+            If this is null, default serialization settings will be is used.</param>
+            <returns>
+            A task that represents the asynchronous serialize operation. The value of the <c>TResult</c> parameter contains a JSON string representation of the object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObject(System.String)">
+            <summary>
+            Deserializes the JSON to a .NET object.
+            </summary>
+            <param name="value">The JSON to deserialize.</param>
+            <returns>The deserialized object from the Json string.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObject(System.String,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Deserializes the JSON to a .NET object using <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            </summary>
+            <param name="value">The JSON to deserialize.</param>
+            <param name="settings">
+            The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to deserialize the object.
+            If this is null, default serialization settings will be is used.
+            </param>
+            <returns>The deserialized object from the JSON string.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObject(System.String,System.Type)">
+            <summary>
+            Deserializes the JSON to the specified .NET type.
+            </summary>
+            <param name="value">The JSON to deserialize.</param>
+            <param name="type">The <see cref="T:System.Type"/> of object being deserialized.</param>
+            <returns>The deserialized object from the Json string.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObject``1(System.String)">
+            <summary>
+            Deserializes the JSON to the specified .NET type.
+            </summary>
+            <typeparam name="T">The type of the object to deserialize to.</typeparam>
+            <param name="value">The JSON to deserialize.</param>
+            <returns>The deserialized object from the Json string.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeAnonymousType``1(System.String,``0)">
+            <summary>
+            Deserializes the JSON to the given anonymous type.
+            </summary>
+            <typeparam name="T">
+            The anonymous type to deserialize to. This can't be specified
+            traditionally and must be infered from the anonymous type passed
+            as a parameter.
+            </typeparam>
+            <param name="value">The JSON to deserialize.</param>
+            <param name="anonymousTypeObject">The anonymous type object.</param>
+            <returns>The deserialized anonymous type from the JSON string.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeAnonymousType``1(System.String,``0,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Deserializes the JSON to the given anonymous type using <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            </summary>
+            <typeparam name="T">
+            The anonymous type to deserialize to. This can't be specified
+            traditionally and must be infered from the anonymous type passed
+            as a parameter.
+            </typeparam>
+            <param name="value">The JSON to deserialize.</param>
+            <param name="anonymousTypeObject">The anonymous type object.</param>
+            <param name="settings">
+            The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to deserialize the object.
+            If this is null, default serialization settings will be is used.
+            </param>
+            <returns>The deserialized anonymous type from the JSON string.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObject``1(System.String,Newtonsoft.Json.JsonConverter[])">
+            <summary>
+            Deserializes the JSON to the specified .NET type using a collection of <see cref="T:Newtonsoft.Json.JsonConverter"/>.
+            </summary>
+            <typeparam name="T">The type of the object to deserialize to.</typeparam>
+            <param name="value">The JSON to deserialize.</param>
+            <param name="converters">Converters to use while deserializing.</param>
+            <returns>The deserialized object from the JSON string.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObject``1(System.String,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Deserializes the JSON to the specified .NET type using <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            </summary>
+            <typeparam name="T">The type of the object to deserialize to.</typeparam>
+            <param name="value">The object to deserialize.</param>
+            <param name="settings">
+            The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to deserialize the object.
+            If this is null, default serialization settings will be is used.
+            </param>
+            <returns>The deserialized object from the JSON string.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObject(System.String,System.Type,Newtonsoft.Json.JsonConverter[])">
+            <summary>
+            Deserializes the JSON to the specified .NET type using a collection of <see cref="T:Newtonsoft.Json.JsonConverter"/>.
+            </summary>
+            <param name="value">The JSON to deserialize.</param>
+            <param name="type">The type of the object to deserialize.</param>
+            <param name="converters">Converters to use while deserializing.</param>
+            <returns>The deserialized object from the JSON string.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObject(System.String,System.Type,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Deserializes the JSON to the specified .NET type using <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            </summary>
+            <param name="value">The JSON to deserialize.</param>
+            <param name="type">The type of the object to deserialize to.</param>
+            <param name="settings">
+            The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to deserialize the object.
+            If this is null, default serialization settings will be is used.
+            </param>
+            <returns>The deserialized object from the JSON string.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObjectAsync``1(System.String)">
+            <summary>
+            Asynchronously deserializes the JSON to the specified .NET type.
+            Deserialization will happen on a new thread.
+            </summary>
+            <typeparam name="T">The type of the object to deserialize to.</typeparam>
+            <param name="value">The JSON to deserialize.</param>
+            <returns>
+            A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObjectAsync``1(System.String,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Asynchronously deserializes the JSON to the specified .NET type using <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            Deserialization will happen on a new thread.
+            </summary>
+            <typeparam name="T">The type of the object to deserialize to.</typeparam>
+            <param name="value">The JSON to deserialize.</param>
+            <param name="settings">
+            The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to deserialize the object.
+            If this is null, default serialization settings will be is used.
+            </param>
+            <returns>
+            A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObjectAsync(System.String)">
+            <summary>
+            Asynchronously deserializes the JSON to the specified .NET type.
+            Deserialization will happen on a new thread.
+            </summary>
+            <param name="value">The JSON to deserialize.</param>
+            <returns>
+            A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeObjectAsync(System.String,System.Type,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Asynchronously deserializes the JSON to the specified .NET type using <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            Deserialization will happen on a new thread.
+            </summary>
+            <param name="value">The JSON to deserialize.</param>
+            <param name="type">The type of the object to deserialize to.</param>
+            <param name="settings">
+            The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to deserialize the object.
+            If this is null, default serialization settings will be is used.
+            </param>
+            <returns>
+            A task that represents the asynchronous deserialize operation. The value of the <c>TResult</c> parameter contains the deserialized object from the JSON string.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.PopulateObject(System.String,System.Object)">
+            <summary>
+            Populates the object with values from the JSON string.
+            </summary>
+            <param name="value">The JSON to populate values from.</param>
+            <param name="target">The target object to populate values onto.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.PopulateObject(System.String,System.Object,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Populates the object with values from the JSON string using <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            </summary>
+            <param name="value">The JSON to populate values from.</param>
+            <param name="target">The target object to populate values onto.</param>
+            <param name="settings">
+            The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to deserialize the object.
+            If this is null, default serialization settings will be is used.
+            </param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.PopulateObjectAsync(System.String,System.Object,Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Asynchronously populates the object with values from the JSON string using <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            </summary>
+            <param name="value">The JSON to populate values from.</param>
+            <param name="target">The target object to populate values onto.</param>
+            <param name="settings">
+            The <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/> used to deserialize the object.
+            If this is null, default serialization settings will be is used.
+            </param>
+            <returns>
+            A task that represents the asynchronous populate operation.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeXmlNode(System.Xml.XmlNode)">
+            <summary>
+            Serializes the XML node to a JSON string.
+            </summary>
+            <param name="node">The node to serialize.</param>
+            <returns>A JSON string of the XmlNode.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeXmlNode(System.Xml.XmlNode,Newtonsoft.Json.Formatting)">
+            <summary>
+            Serializes the XML node to a JSON string using formatting.
+            </summary>
+            <param name="node">The node to serialize.</param>
+            <param name="formatting">Indicates how the output is formatted.</param>
+            <returns>A JSON string of the XmlNode.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeXmlNode(System.Xml.XmlNode,Newtonsoft.Json.Formatting,System.Boolean)">
+            <summary>
+            Serializes the XML node to a JSON string using formatting and omits the root object if <paramref name="omitRootObject"/> is <c>true</c>.
+            </summary>
+            <param name="node">The node to serialize.</param>
+            <param name="formatting">Indicates how the output is formatted.</param>
+            <param name="omitRootObject">Omits writing the root object.</param>
+            <returns>A JSON string of the XmlNode.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeXmlNode(System.String)">
+            <summary>
+            Deserializes the XmlNode from a JSON string.
+            </summary>
+            <param name="value">The JSON string.</param>
+            <returns>The deserialized XmlNode</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeXmlNode(System.String,System.String)">
+            <summary>
+            Deserializes the XmlNode from a JSON string nested in a root elment specified by <paramref name="deserializeRootElementName"/>.
+            </summary>
+            <param name="value">The JSON string.</param>
+            <param name="deserializeRootElementName">The name of the root element to append when deserializing.</param>
+            <returns>The deserialized XmlNode</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeXmlNode(System.String,System.String,System.Boolean)">
+            <summary>
+            Deserializes the XmlNode from a JSON string nested in a root elment specified by <paramref name="deserializeRootElementName"/>
+            and writes a .NET array attribute for collections.
+            </summary>
+            <param name="value">The JSON string.</param>
+            <param name="deserializeRootElementName">The name of the root element to append when deserializing.</param>
+            <param name="writeArrayAttribute">
+            A flag to indicate whether to write the Json.NET array attribute.
+            This attribute helps preserve arrays when converting the written XML back to JSON.
+            </param>
+            <returns>The deserialized XmlNode</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeXNode(System.Xml.Linq.XObject)">
+            <summary>
+            Serializes the <see cref="T:System.Xml.Linq.XNode"/> to a JSON string.
+            </summary>
+            <param name="node">The node to convert to JSON.</param>
+            <returns>A JSON string of the XNode.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeXNode(System.Xml.Linq.XObject,Newtonsoft.Json.Formatting)">
+            <summary>
+            Serializes the <see cref="T:System.Xml.Linq.XNode"/> to a JSON string using formatting.
+            </summary>
+            <param name="node">The node to convert to JSON.</param>
+            <param name="formatting">Indicates how the output is formatted.</param>
+            <returns>A JSON string of the XNode.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.SerializeXNode(System.Xml.Linq.XObject,Newtonsoft.Json.Formatting,System.Boolean)">
+            <summary>
+            Serializes the <see cref="T:System.Xml.Linq.XNode"/> to a JSON string using formatting and omits the root object if <paramref name="omitRootObject"/> is <c>true</c>.
+            </summary>
+            <param name="node">The node to serialize.</param>
+            <param name="formatting">Indicates how the output is formatted.</param>
+            <param name="omitRootObject">Omits writing the root object.</param>
+            <returns>A JSON string of the XNode.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeXNode(System.String)">
+            <summary>
+            Deserializes the <see cref="T:System.Xml.Linq.XNode"/> from a JSON string.
+            </summary>
+            <param name="value">The JSON string.</param>
+            <returns>The deserialized XNode</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeXNode(System.String,System.String)">
+            <summary>
+            Deserializes the <see cref="T:System.Xml.Linq.XNode"/> from a JSON string nested in a root elment specified by <paramref name="deserializeRootElementName"/>.
+            </summary>
+            <param name="value">The JSON string.</param>
+            <param name="deserializeRootElementName">The name of the root element to append when deserializing.</param>
+            <returns>The deserialized XNode</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonConvert.DeserializeXNode(System.String,System.String,System.Boolean)">
+            <summary>
+            Deserializes the <see cref="T:System.Xml.Linq.XNode"/> from a JSON string nested in a root elment specified by <paramref name="deserializeRootElementName"/>
+            and writes a .NET array attribute for collections.
+            </summary>
+            <param name="value">The JSON string.</param>
+            <param name="deserializeRootElementName">The name of the root element to append when deserializing.</param>
+            <param name="writeArrayAttribute">
+            A flag to indicate whether to write the Json.NET array attribute.
+            This attribute helps preserve arrays when converting the written XML back to JSON.
+            </param>
+            <returns>The deserialized XNode</returns>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonConvert.DefaultSettings">
+            <summary>
+            Gets or sets a function that creates default <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            Default settings are automatically used by serialization methods on <see cref="T:Newtonsoft.Json.JsonConvert"/>,
+            and <see cref="M:Newtonsoft.Json.Linq.JToken.ToObject``1"/> and <see cref="M:Newtonsoft.Json.Linq.JToken.FromObject(System.Object)"/> on <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            To serialize without using any default settings create a <see cref="T:Newtonsoft.Json.JsonSerializer"/> with
+            <see cref="M:Newtonsoft.Json.JsonSerializer.Create"/>.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonSerializationException">
+            <summary>
+            The exception thrown when an error occurs during Json serialization or deserialization.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializationException.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonSerializationException"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializationException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonSerializationException"/> class
+            with a specified error message.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializationException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonSerializationException"/> class
+            with a specified error message and a reference to the inner exception that is the cause of this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializationException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonSerializationException"/> class.
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="info"/> parameter is null. </exception>
+            <exception cref="T:System.Runtime.Serialization.SerializationException">The class name is null or <see cref="P:System.Exception.HResult"/> is zero (0). </exception>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonSerializer">
+            <summary>
+            Serializes and deserializes objects into and from the JSON format.
+            The <see cref="T:Newtonsoft.Json.JsonSerializer"/> enables you to control how objects are encoded into JSON.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.JsonSerializer"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Create">
+            <summary>
+            Creates a new <see cref="T:Newtonsoft.Json.JsonSerializer"/> instance.
+            The <see cref="T:Newtonsoft.Json.JsonSerializer"/> will not use default settings.
+            </summary>
+            <returns>
+            A new <see cref="T:Newtonsoft.Json.JsonSerializer"/> instance.
+            The <see cref="T:Newtonsoft.Json.JsonSerializer"/> will not use default settings.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Create(Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Creates a new <see cref="T:Newtonsoft.Json.JsonSerializer"/> instance using the specified <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            The <see cref="T:Newtonsoft.Json.JsonSerializer"/> will not use default settings.
+            </summary>
+            <param name="settings">The settings to be applied to the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.</param>
+            <returns>
+            A new <see cref="T:Newtonsoft.Json.JsonSerializer"/> instance using the specified <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            The <see cref="T:Newtonsoft.Json.JsonSerializer"/> will not use default settings.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.CreateDefault">
+            <summary>
+            Creates a new <see cref="T:Newtonsoft.Json.JsonSerializer"/> instance.
+            The <see cref="T:Newtonsoft.Json.JsonSerializer"/> will use default settings.
+            </summary>
+            <returns>
+            A new <see cref="T:Newtonsoft.Json.JsonSerializer"/> instance.
+            The <see cref="T:Newtonsoft.Json.JsonSerializer"/> will use default settings.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.CreateDefault(Newtonsoft.Json.JsonSerializerSettings)">
+            <summary>
+            Creates a new <see cref="T:Newtonsoft.Json.JsonSerializer"/> instance using the specified <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            The <see cref="T:Newtonsoft.Json.JsonSerializer"/> will use default settings.
+            </summary>
+            <param name="settings">The settings to be applied to the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.</param>
+            <returns>
+            A new <see cref="T:Newtonsoft.Json.JsonSerializer"/> instance using the specified <see cref="T:Newtonsoft.Json.JsonSerializerSettings"/>.
+            The <see cref="T:Newtonsoft.Json.JsonSerializer"/> will use default settings.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Populate(System.IO.TextReader,System.Object)">
+            <summary>
+            Populates the JSON values onto the target object.
+            </summary>
+            <param name="reader">The <see cref="T:System.IO.TextReader"/> that contains the JSON structure to reader values from.</param>
+            <param name="target">The target object to populate values onto.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Populate(Newtonsoft.Json.JsonReader,System.Object)">
+            <summary>
+            Populates the JSON values onto the target object.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> that contains the JSON structure to reader values from.</param>
+            <param name="target">The target object to populate values onto.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Deserialize(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Deserializes the Json structure contained by the specified <see cref="T:Newtonsoft.Json.JsonReader"/>.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> that contains the JSON structure to deserialize.</param>
+            <returns>The <see cref="T:System.Object"/> being deserialized.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Deserialize(System.IO.TextReader,System.Type)">
+            <summary>
+            Deserializes the Json structure contained by the specified <see cref="T:System.IO.StringReader"/>
+            into an instance of the specified type.
+            </summary>
+            <param name="reader">The <see cref="T:System.IO.TextReader"/> containing the object.</param>
+            <param name="objectType">The <see cref="T:System.Type"/> of object being deserialized.</param>
+            <returns>The instance of <paramref name="objectType"/> being deserialized.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Deserialize``1(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Deserializes the Json structure contained by the specified <see cref="T:Newtonsoft.Json.JsonReader"/>
+            into an instance of the specified type.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> containing the object.</param>
+            <typeparam name="T">The type of the object to deserialize.</typeparam>
+            <returns>The instance of <typeparamref name="T"/> being deserialized.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Deserialize(Newtonsoft.Json.JsonReader,System.Type)">
+            <summary>
+            Deserializes the Json structure contained by the specified <see cref="T:Newtonsoft.Json.JsonReader"/>
+            into an instance of the specified type.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> containing the object.</param>
+            <param name="objectType">The <see cref="T:System.Type"/> of object being deserialized.</param>
+            <returns>The instance of <paramref name="objectType"/> being deserialized.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Serialize(System.IO.TextWriter,System.Object)">
+            <summary>
+            Serializes the specified <see cref="T:System.Object"/> and writes the Json structure
+            to a <c>Stream</c> using the specified <see cref="T:System.IO.TextWriter"/>. 
+            </summary>
+            <param name="textWriter">The <see cref="T:System.IO.TextWriter"/> used to write the Json structure.</param>
+            <param name="value">The <see cref="T:System.Object"/> to serialize.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Serialize(Newtonsoft.Json.JsonWriter,System.Object,System.Type)">
+            <summary>
+            Serializes the specified <see cref="T:System.Object"/> and writes the Json structure
+            to a <c>Stream</c> using the specified <see cref="T:System.IO.TextWriter"/>. 
+            </summary>
+            <param name="jsonWriter">The <see cref="T:Newtonsoft.Json.JsonWriter"/> used to write the Json structure.</param>
+            <param name="value">The <see cref="T:System.Object"/> to serialize.</param>
+            <param name="objectType">
+            The type of the value being serialized.
+            This parameter is used when <see cref="P:Newtonsoft.Json.JsonSerializer.TypeNameHandling"/> is Auto to write out the type name if the type of the value does not match.
+            Specifing the type is optional.
+            </param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Serialize(System.IO.TextWriter,System.Object,System.Type)">
+            <summary>
+            Serializes the specified <see cref="T:System.Object"/> and writes the Json structure
+            to a <c>Stream</c> using the specified <see cref="T:System.IO.TextWriter"/>. 
+            </summary>
+            <param name="textWriter">The <see cref="T:System.IO.TextWriter"/> used to write the Json structure.</param>
+            <param name="value">The <see cref="T:System.Object"/> to serialize.</param>
+            <param name="objectType">
+            The type of the value being serialized.
+            This parameter is used when <see cref="P:Newtonsoft.Json.JsonSerializer.TypeNameHandling"/> is Auto to write out the type name if the type of the value does not match.
+            Specifing the type is optional.
+            </param>
+        </member>
+        <member name="M:Newtonsoft.Json.JsonSerializer.Serialize(Newtonsoft.Json.JsonWriter,System.Object)">
+            <summary>
+            Serializes the specified <see cref="T:System.Object"/> and writes the Json structure
+            to a <c>Stream</c> using the specified <see cref="T:Newtonsoft.Json.JsonWriter"/>. 
+            </summary>
+            <param name="jsonWriter">The <see cref="T:Newtonsoft.Json.JsonWriter"/> used to write the Json structure.</param>
+            <param name="value">The <see cref="T:System.Object"/> to serialize.</param>
+        </member>
+        <member name="E:Newtonsoft.Json.JsonSerializer.Error">
+            <summary>
+            Occurs when the <see cref="T:Newtonsoft.Json.JsonSerializer"/> errors during serialization and deserialization.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.ReferenceResolver">
+            <summary>
+            Gets or sets the <see cref="T:Newtonsoft.Json.Serialization.IReferenceResolver"/> used by the serializer when resolving references.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.Binder">
+            <summary>
+            Gets or sets the <see cref="T:System.Runtime.Serialization.SerializationBinder"/> used by the serializer when resolving type names.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.TraceWriter">
+            <summary>
+            Gets or sets the <see cref="T:Newtonsoft.Json.Serialization.ITraceWriter"/> used by the serializer when writing trace messages.
+            </summary>
+            <value>The trace writer.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.TypeNameHandling">
+            <summary>
+            Gets or sets how type name writing and reading is handled by the serializer.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.TypeNameAssemblyFormat">
+            <summary>
+            Gets or sets how a type name assembly is written and resolved by the serializer.
+            </summary>
+            <value>The type name assembly format.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.PreserveReferencesHandling">
+            <summary>
+            Gets or sets how object references are preserved by the serializer.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.ReferenceLoopHandling">
+            <summary>
+            Get or set how reference loops (e.g. a class referencing itself) is handled.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.MissingMemberHandling">
+            <summary>
+            Get or set how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.NullValueHandling">
+            <summary>
+            Get or set how null values are handled during serialization and deserialization.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.DefaultValueHandling">
+            <summary>
+            Get or set how null default are handled during serialization and deserialization.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.ObjectCreationHandling">
+            <summary>
+            Gets or sets how objects are created during deserialization.
+            </summary>
+            <value>The object creation handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.ConstructorHandling">
+            <summary>
+            Gets or sets how constructors are used during deserialization.
+            </summary>
+            <value>The constructor handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.Converters">
+            <summary>
+            Gets a collection <see cref="T:Newtonsoft.Json.JsonConverter"/> that will be used during serialization.
+            </summary>
+            <value>Collection <see cref="T:Newtonsoft.Json.JsonConverter"/> that will be used during serialization.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.ContractResolver">
+            <summary>
+            Gets or sets the contract resolver used by the serializer when
+            serializing .NET objects to JSON and vice versa.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.Context">
+            <summary>
+            Gets or sets the <see cref="T:System.Runtime.Serialization.StreamingContext"/> used by the serializer when invoking serialization callback methods.
+            </summary>
+            <value>The context.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.Formatting">
+            <summary>
+            Indicates how JSON text output is formatted.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.DateFormatHandling">
+            <summary>
+            Get or set how dates are written to JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.DateTimeZoneHandling">
+            <summary>
+            Get or set how <see cref="T:System.DateTime"/> time zones are handling during serialization and deserialization.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.DateParseHandling">
+            <summary>
+            Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.FloatParseHandling">
+            <summary>
+            Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.FloatFormatHandling">
+            <summary>
+            Get or set how special floating point numbers, e.g. <see cref="F:System.Double.NaN"/>,
+            <see cref="F:System.Double.PositiveInfinity"/> and <see cref="F:System.Double.NegativeInfinity"/>,
+            are written as JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.StringEscapeHandling">
+            <summary>
+            Get or set how strings are escaped when writing JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.DateFormatString">
+            <summary>
+            Get or set how <see cref="T:System.DateTime"/> and <see cref="T:System.DateTimeOffset"/> values are formatting when writing JSON text.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.Culture">
+            <summary>
+            Gets or sets the culture used when reading JSON. Defaults to <see cref="P:System.Globalization.CultureInfo.InvariantCulture"/>.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.MaxDepth">
+            <summary>
+            Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a <see cref="T:Newtonsoft.Json.JsonReaderException"/>.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.JsonSerializer.CheckAdditionalContent">
+            <summary>
+            Gets a value indicating whether there will be a check for additional JSON content after deserializing an object.
+            </summary>
+            <value>
+            	<c>true</c> if there will be a check for additional JSON content after deserializing an object; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.Extensions">
+            <summary>
+            Contains the LINQ to JSON extension methods.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.Ancestors``1(System.Collections.Generic.IEnumerable{``0})">
+            <summary>
+            Returns a collection of tokens that contains the ancestors of every token in the source collection.
+            </summary>
+            <typeparam name="T">The type of the objects in source, constrained to <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</typeparam>
+            <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the source collection.</param>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the ancestors of every node in the source collection.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.Descendants``1(System.Collections.Generic.IEnumerable{``0})">
+            <summary>
+            Returns a collection of tokens that contains the descendants of every token in the source collection.
+            </summary>
+            <typeparam name="T">The type of the objects in source, constrained to <see cref="T:Newtonsoft.Json.Linq.JContainer"/>.</typeparam>
+            <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the source collection.</param>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the descendants of every node in the source collection.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.Properties(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JObject})">
+            <summary>
+            Returns a collection of child properties of every object in the source collection.
+            </summary>
+            <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JObject"/> that contains the source collection.</param>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JProperty"/> that contains the properties of every object in the source collection.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.Values(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken},System.Object)">
+            <summary>
+            Returns a collection of child values of every object in the source collection with the given key.
+            </summary>
+            <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the source collection.</param>
+            <param name="key">The token key.</param>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the values of every node in the source collection with the given key.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.Values(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken})">
+            <summary>
+            Returns a collection of child values of every object in the source collection.
+            </summary>
+            <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the source collection.</param>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the values of every node in the source collection.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.Values``1(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken},System.Object)">
+            <summary>
+            Returns a collection of converted child values of every object in the source collection with the given key.
+            </summary>
+            <typeparam name="U">The type to convert the values to.</typeparam>
+            <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the source collection.</param>
+            <param name="key">The token key.</param>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> that contains the converted values of every node in the source collection with the given key.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.Values``1(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken})">
+            <summary>
+            Returns a collection of converted child values of every object in the source collection.
+            </summary>
+            <typeparam name="U">The type to convert the values to.</typeparam>
+            <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the source collection.</param>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> that contains the converted values of every node in the source collection.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.Value``1(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken})">
+            <summary>
+            Converts the value.
+            </summary>
+            <typeparam name="U">The type to convert the value to.</typeparam>
+            <param name="value">A <see cref="T:Newtonsoft.Json.Linq.JToken"/> cast as a <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</param>
+            <returns>A converted value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.Value``2(System.Collections.Generic.IEnumerable{``0})">
+            <summary>
+            Converts the value.
+            </summary>
+            <typeparam name="T">The source collection type.</typeparam>
+            <typeparam name="U">The type to convert the value to.</typeparam>
+            <param name="value">A <see cref="T:Newtonsoft.Json.Linq.JToken"/> cast as a <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</param>
+            <returns>A converted value.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.Children``1(System.Collections.Generic.IEnumerable{``0})">
+            <summary>
+            Returns a collection of child tokens of every array in the source collection.
+            </summary>
+            <typeparam name="T">The source collection type.</typeparam>
+            <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the source collection.</param>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the values of every node in the source collection.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.Children``2(System.Collections.Generic.IEnumerable{``0})">
+            <summary>
+            Returns a collection of converted child tokens of every array in the source collection.
+            </summary>
+            <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the source collection.</param>
+            <typeparam name="U">The type to convert the values to.</typeparam>
+            <typeparam name="T">The source collection type.</typeparam>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> that contains the converted values of every node in the source collection.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.AsJEnumerable(System.Collections.Generic.IEnumerable{Newtonsoft.Json.Linq.JToken})">
+            <summary>
+            Returns the input typed as <see cref="T:Newtonsoft.Json.Linq.IJEnumerable`1"/>.
+            </summary>
+            <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the source collection.</param>
+            <returns>The input typed as <see cref="T:Newtonsoft.Json.Linq.IJEnumerable`1"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.Extensions.AsJEnumerable``1(System.Collections.Generic.IEnumerable{``0})">
+            <summary>
+            Returns the input typed as <see cref="T:Newtonsoft.Json.Linq.IJEnumerable`1"/>.
+            </summary>
+            <typeparam name="T">The source collection type.</typeparam>
+            <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> that contains the source collection.</param>
+            <returns>The input typed as <see cref="T:Newtonsoft.Json.Linq.IJEnumerable`1"/>.</returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JConstructor">
+            <summary>
+            Represents a JSON constructor.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JContainer">
+            <summary>
+            Represents a token that can contain other tokens.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JContainer.OnAddingNew(System.ComponentModel.AddingNewEventArgs)">
+            <summary>
+            Raises the <see cref="E:Newtonsoft.Json.Linq.JContainer.AddingNew"/> event.
+            </summary>
+            <param name="e">The <see cref="T:System.ComponentModel.AddingNewEventArgs"/> instance containing the event data.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JContainer.OnListChanged(System.ComponentModel.ListChangedEventArgs)">
+            <summary>
+            Raises the <see cref="E:Newtonsoft.Json.Linq.JContainer.ListChanged"/> event.
+            </summary>
+            <param name="e">The <see cref="T:System.ComponentModel.ListChangedEventArgs"/> instance containing the event data.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JContainer.OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs)">
+            <summary>
+            Raises the <see cref="E:Newtonsoft.Json.Linq.JContainer.CollectionChanged"/> event.
+            </summary>
+            <param name="e">The <see cref="T:System.Collections.Specialized.NotifyCollectionChangedEventArgs"/> instance containing the event data.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JContainer.Children">
+            <summary>
+            Returns a collection of the child tokens of this token, in document order.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of <see cref="T:Newtonsoft.Json.Linq.JToken"/> containing the child tokens of this <see cref="T:Newtonsoft.Json.Linq.JToken"/>, in document order.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JContainer.Values``1">
+            <summary>
+            Returns a collection of the child values of this token, in document order.
+            </summary>
+            <typeparam name="T">The type to convert the values to.</typeparam>
+            <returns>
+            A <see cref="T:System.Collections.Generic.IEnumerable`1"/> containing the child values of this <see cref="T:Newtonsoft.Json.Linq.JToken"/>, in document order.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JContainer.Descendants">
+            <summary>
+            Returns a collection of the descendant tokens for this token in document order.
+            </summary>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> containing the descendant tokens of the <see cref="T:Newtonsoft.Json.Linq.JToken"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JContainer.Add(System.Object)">
+            <summary>
+            Adds the specified content as children of this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="content">The content to be added.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JContainer.AddFirst(System.Object)">
+            <summary>
+            Adds the specified content as the first children of this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="content">The content to be added.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JContainer.CreateWriter">
+            <summary>
+            Creates an <see cref="T:Newtonsoft.Json.JsonWriter"/> that can be used to add tokens to the <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <returns>An <see cref="T:Newtonsoft.Json.JsonWriter"/> that is ready to have content written to it.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JContainer.ReplaceAll(System.Object)">
+            <summary>
+            Replaces the children nodes of this token with the specified content.
+            </summary>
+            <param name="content">The content.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JContainer.RemoveAll">
+            <summary>
+            Removes the child nodes from this token.
+            </summary>
+        </member>
+        <member name="E:Newtonsoft.Json.Linq.JContainer.ListChanged">
+            <summary>
+            Occurs when the list changes or an item in the list changes.
+            </summary>
+        </member>
+        <member name="E:Newtonsoft.Json.Linq.JContainer.AddingNew">
+            <summary>
+            Occurs before an item is added to the collection.
+            </summary>
+        </member>
+        <member name="E:Newtonsoft.Json.Linq.JContainer.CollectionChanged">
+            <summary>
+            Occurs when the items list of the collection has changed, or the collection is reset.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JContainer.ChildrenTokens">
+            <summary>
+            Gets the container's children tokens.
+            </summary>
+            <value>The container's children tokens.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JContainer.HasValues">
+            <summary>
+            Gets a value indicating whether this token has child tokens.
+            </summary>
+            <value>
+            	<c>true</c> if this token has child values; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JContainer.First">
+            <summary>
+            Get the first child token of this token.
+            </summary>
+            <value>
+            A <see cref="T:Newtonsoft.Json.Linq.JToken"/> containing the first child token of the <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JContainer.Last">
+            <summary>
+            Get the last child token of this token.
+            </summary>
+            <value>
+            A <see cref="T:Newtonsoft.Json.Linq.JToken"/> containing the last child token of the <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JContainer.Count">
+            <summary>
+            Gets the count of child JSON tokens.
+            </summary>
+            <value>The count of child JSON tokens</value>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JConstructor.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JConstructor"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JConstructor.#ctor(Newtonsoft.Json.Linq.JConstructor)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JConstructor"/> class from another <see cref="T:Newtonsoft.Json.Linq.JConstructor"/> object.
+            </summary>
+            <param name="other">A <see cref="T:Newtonsoft.Json.Linq.JConstructor"/> object to copy from.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JConstructor.#ctor(System.String,System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JConstructor"/> class with the specified name and content.
+            </summary>
+            <param name="name">The constructor name.</param>
+            <param name="content">The contents of the constructor.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JConstructor.#ctor(System.String,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JConstructor"/> class with the specified name and content.
+            </summary>
+            <param name="name">The constructor name.</param>
+            <param name="content">The contents of the constructor.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JConstructor.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JConstructor"/> class with the specified name.
+            </summary>
+            <param name="name">The constructor name.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JConstructor.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])">
+            <summary>
+            Writes this token to a <see cref="T:Newtonsoft.Json.JsonWriter"/>.
+            </summary>
+            <param name="writer">A <see cref="T:Newtonsoft.Json.JsonWriter"/> into which this method will write.</param>
+            <param name="converters">A collection of <see cref="T:Newtonsoft.Json.JsonConverter"/> which will be used when writing the token.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JConstructor.Load(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Loads an <see cref="T:Newtonsoft.Json.Linq.JConstructor"/> from a <see cref="T:Newtonsoft.Json.JsonReader"/>. 
+            </summary>
+            <param name="reader">A <see cref="T:Newtonsoft.Json.JsonReader"/> that will be read for the content of the <see cref="T:Newtonsoft.Json.Linq.JConstructor"/>.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JConstructor"/> that contains the JSON that was read from the specified <see cref="T:Newtonsoft.Json.JsonReader"/>.</returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JConstructor.ChildrenTokens">
+            <summary>
+            Gets the container's children tokens.
+            </summary>
+            <value>The container's children tokens.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JConstructor.Name">
+            <summary>
+            Gets or sets the name of this constructor.
+            </summary>
+            <value>The constructor name.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JConstructor.Type">
+            <summary>
+            Gets the node type for this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <value>The type.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JConstructor.Item(System.Object)">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified key.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified key.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JEnumerable`1">
+            <summary>
+            Represents a collection of <see cref="T:Newtonsoft.Json.Linq.JToken"/> objects.
+            </summary>
+            <typeparam name="T">The type of token</typeparam>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JEnumerable`1.Empty">
+            <summary>
+            An empty collection of <see cref="T:Newtonsoft.Json.Linq.JToken"/> objects.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JEnumerable`1.#ctor(System.Collections.Generic.IEnumerable{`0})">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JEnumerable`1"/> struct.
+            </summary>
+            <param name="enumerable">The enumerable.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JEnumerable`1.GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through the collection.
+            </summary>
+            <returns>
+            A <see cref="T:System.Collections.Generic.IEnumerator`1"/> that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JEnumerable`1.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JEnumerable`1.Equals(System.Object)">
+            <summary>
+            Determines whether the specified <see cref="T:System.Object"/> is equal to this instance.
+            </summary>
+            <param name="obj">The <see cref="T:System.Object"/> to compare with this instance.</param>
+            <returns>
+            	<c>true</c> if the specified <see cref="T:System.Object"/> is equal to this instance; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JEnumerable`1.GetHashCode">
+            <summary>
+            Returns a hash code for this instance.
+            </summary>
+            <returns>
+            A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. 
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JEnumerable`1.Item(System.Object)">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Linq.IJEnumerable`1"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JObject">
+            <summary>
+            Represents a JSON object.
+            </summary>
+            <example>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\LinqToJsonTests.cs" region="LinqToJsonCreateParse" title="Parsing a JSON Object from Text" />
+            </example>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JObject"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.#ctor(Newtonsoft.Json.Linq.JObject)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JObject"/> class from another <see cref="T:Newtonsoft.Json.Linq.JObject"/> object.
+            </summary>
+            <param name="other">A <see cref="T:Newtonsoft.Json.Linq.JObject"/> object to copy from.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.#ctor(System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JObject"/> class with the specified content.
+            </summary>
+            <param name="content">The contents of the object.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JObject"/> class with the specified content.
+            </summary>
+            <param name="content">The contents of the object.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.Properties">
+            <summary>
+            Gets an <see cref="T:System.Collections.Generic.IEnumerable`1"/> of this object's properties.
+            </summary>
+            <returns>An <see cref="T:System.Collections.Generic.IEnumerable`1"/> of this object's properties.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.Property(System.String)">
+            <summary>
+            Gets a <see cref="T:Newtonsoft.Json.Linq.JProperty"/> the specified name.
+            </summary>
+            <param name="name">The property name.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JProperty"/> with the specified name or null.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.PropertyValues">
+            <summary>
+            Gets an <see cref="T:Newtonsoft.Json.Linq.JEnumerable`1"/> of this object's property values.
+            </summary>
+            <returns>An <see cref="T:Newtonsoft.Json.Linq.JEnumerable`1"/> of this object's property values.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.Load(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Loads an <see cref="T:Newtonsoft.Json.Linq.JObject"/> from a <see cref="T:Newtonsoft.Json.JsonReader"/>. 
+            </summary>
+            <param name="reader">A <see cref="T:Newtonsoft.Json.JsonReader"/> that will be read for the content of the <see cref="T:Newtonsoft.Json.Linq.JObject"/>.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JObject"/> that contains the JSON that was read from the specified <see cref="T:Newtonsoft.Json.JsonReader"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.Parse(System.String)">
+            <summary>
+            Load a <see cref="T:Newtonsoft.Json.Linq.JObject"/> from a string that contains JSON.
+            </summary>
+            <param name="json">A <see cref="T:System.String"/> that contains JSON.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JObject"/> populated from the string that contains JSON.</returns>
+            <example>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\LinqToJsonTests.cs" region="LinqToJsonCreateParse" title="Parsing a JSON Object from Text"/>
+            </example>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.FromObject(System.Object)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Linq.JObject"/> from an object.
+            </summary>
+            <param name="o">The object that will be used to create <see cref="T:Newtonsoft.Json.Linq.JObject"/>.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JObject"/> with the values of the specified object</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.FromObject(System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Linq.JArray"/> from an object.
+            </summary>
+            <param name="o">The object that will be used to create <see cref="T:Newtonsoft.Json.Linq.JArray"/>.</param>
+            <param name="jsonSerializer">The <see cref="T:Newtonsoft.Json.JsonSerializer"/> that will be used to read the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JArray"/> with the values of the specified object</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])">
+            <summary>
+            Writes this token to a <see cref="T:Newtonsoft.Json.JsonWriter"/>.
+            </summary>
+            <param name="writer">A <see cref="T:Newtonsoft.Json.JsonWriter"/> into which this method will write.</param>
+            <param name="converters">A collection of <see cref="T:Newtonsoft.Json.JsonConverter"/> which will be used when writing the token.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.GetValue(System.String)">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified property name.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified property name.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.GetValue(System.String,System.StringComparison)">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified property name.
+            The exact property name will be searched for first and if no matching property is found then
+            the <see cref="T:System.StringComparison"/> will be used to match a property.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <param name="comparison">One of the enumeration values that specifies how the strings will be compared.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified property name.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.TryGetValue(System.String,System.StringComparison,Newtonsoft.Json.Linq.JToken@)">
+            <summary>
+            Tries to get the <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified property name.
+            The exact property name will be searched for first and if no matching property is found then
+            the <see cref="T:System.StringComparison"/> will be used to match a property.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <param name="value">The value.</param>
+            <param name="comparison">One of the enumeration values that specifies how the strings will be compared.</param>
+            <returns>true if a value was successfully retrieved; otherwise, false.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.Add(System.String,Newtonsoft.Json.Linq.JToken)">
+            <summary>
+            Adds the specified property name.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.Remove(System.String)">
+            <summary>
+            Removes the property with the specified name.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <returns>true if item was successfully removed; otherwise, false.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.TryGetValue(System.String,Newtonsoft.Json.Linq.JToken@)">
+            <summary>
+            Tries the get value.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <param name="value">The value.</param>
+            <returns>true if a value was successfully retrieved; otherwise, false.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through the collection.
+            </summary>
+            <returns>
+            A <see cref="T:System.Collections.Generic.IEnumerator`1"/> that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.OnPropertyChanged(System.String)">
+            <summary>
+            Raises the <see cref="E:Newtonsoft.Json.Linq.JObject.PropertyChanged"/> event with the provided arguments.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.OnPropertyChanging(System.String)">
+            <summary>
+            Raises the <see cref="E:Newtonsoft.Json.Linq.JObject.PropertyChanging"/> event with the provided arguments.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetProperties">
+            <summary>
+            Returns the properties for this instance of a component.
+            </summary>
+            <returns>
+            A <see cref="T:System.ComponentModel.PropertyDescriptorCollection"/> that represents the properties for this component instance.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetProperties(System.Attribute[])">
+            <summary>
+            Returns the properties for this instance of a component using the attribute array as a filter.
+            </summary>
+            <param name="attributes">An array of type <see cref="T:System.Attribute"/> that is used as a filter.</param>
+            <returns>
+            A <see cref="T:System.ComponentModel.PropertyDescriptorCollection"/> that represents the filtered properties for this component instance.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetAttributes">
+            <summary>
+            Returns a collection of custom attributes for this instance of a component.
+            </summary>
+            <returns>
+            An <see cref="T:System.ComponentModel.AttributeCollection"/> containing the attributes for this object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetClassName">
+            <summary>
+            Returns the class name of this instance of a component.
+            </summary>
+            <returns>
+            The class name of the object, or null if the class does not have a name.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetComponentName">
+            <summary>
+            Returns the name of this instance of a component.
+            </summary>
+            <returns>
+            The name of the object, or null if the object does not have a name.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetConverter">
+            <summary>
+            Returns a type converter for this instance of a component.
+            </summary>
+            <returns>
+            A <see cref="T:System.ComponentModel.TypeConverter"/> that is the converter for this object, or null if there is no <see cref="T:System.ComponentModel.TypeConverter"/> for this object.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetDefaultEvent">
+            <summary>
+            Returns the default event for this instance of a component.
+            </summary>
+            <returns>
+            An <see cref="T:System.ComponentModel.EventDescriptor"/> that represents the default event for this object, or null if this object does not have events.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetDefaultProperty">
+            <summary>
+            Returns the default property for this instance of a component.
+            </summary>
+            <returns>
+            A <see cref="T:System.ComponentModel.PropertyDescriptor"/> that represents the default property for this object, or null if this object does not have properties.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetEditor(System.Type)">
+            <summary>
+            Returns an editor of the specified type for this instance of a component.
+            </summary>
+            <param name="editorBaseType">A <see cref="T:System.Type"/> that represents the editor for this object.</param>
+            <returns>
+            An <see cref="T:System.Object"/> of the specified type that is the editor for this object, or null if the editor cannot be found.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetEvents(System.Attribute[])">
+            <summary>
+            Returns the events for this instance of a component using the specified attribute array as a filter.
+            </summary>
+            <param name="attributes">An array of type <see cref="T:System.Attribute"/> that is used as a filter.</param>
+            <returns>
+            An <see cref="T:System.ComponentModel.EventDescriptorCollection"/> that represents the filtered events for this component instance.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetEvents">
+            <summary>
+            Returns the events for this instance of a component.
+            </summary>
+            <returns>
+            An <see cref="T:System.ComponentModel.EventDescriptorCollection"/> that represents the events for this component instance.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.System#ComponentModel#ICustomTypeDescriptor#GetPropertyOwner(System.ComponentModel.PropertyDescriptor)">
+            <summary>
+            Returns an object that contains the property described by the specified property descriptor.
+            </summary>
+            <param name="pd">A <see cref="T:System.ComponentModel.PropertyDescriptor"/> that represents the property whose owner is to be found.</param>
+            <returns>
+            An <see cref="T:System.Object"/> that represents the owner of the specified property.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JObject.GetMetaObject(System.Linq.Expressions.Expression)">
+            <summary>
+            Returns the <see cref="T:System.Dynamic.DynamicMetaObject"/> responsible for binding operations performed on this object.
+            </summary>
+            <param name="parameter">The expression tree representation of the runtime value.</param>
+            <returns>
+            The <see cref="T:System.Dynamic.DynamicMetaObject"/> to bind this object.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JObject.ChildrenTokens">
+            <summary>
+            Gets the container's children tokens.
+            </summary>
+            <value>The container's children tokens.</value>
+        </member>
+        <member name="E:Newtonsoft.Json.Linq.JObject.PropertyChanged">
+            <summary>
+            Occurs when a property value changes.
+            </summary>
+        </member>
+        <member name="E:Newtonsoft.Json.Linq.JObject.PropertyChanging">
+            <summary>
+            Occurs when a property value is changing.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JObject.Type">
+            <summary>
+            Gets the node type for this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <value>The type.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JObject.Item(System.Object)">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified key.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified key.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JObject.Item(System.String)">
+            <summary>
+            Gets or sets the <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified property name.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JArray">
+            <summary>
+            Represents a JSON array.
+            </summary>
+            <example>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\LinqToJsonTests.cs" region="LinqToJsonCreateParseArray" title="Parsing a JSON Array from Text" />
+            </example>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JArray"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.#ctor(Newtonsoft.Json.Linq.JArray)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JArray"/> class from another <see cref="T:Newtonsoft.Json.Linq.JArray"/> object.
+            </summary>
+            <param name="other">A <see cref="T:Newtonsoft.Json.Linq.JArray"/> object to copy from.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.#ctor(System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JArray"/> class with the specified content.
+            </summary>
+            <param name="content">The contents of the array.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JArray"/> class with the specified content.
+            </summary>
+            <param name="content">The contents of the array.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.Load(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Loads an <see cref="T:Newtonsoft.Json.Linq.JArray"/> from a <see cref="T:Newtonsoft.Json.JsonReader"/>. 
+            </summary>
+            <param name="reader">A <see cref="T:Newtonsoft.Json.JsonReader"/> that will be read for the content of the <see cref="T:Newtonsoft.Json.Linq.JArray"/>.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JArray"/> that contains the JSON that was read from the specified <see cref="T:Newtonsoft.Json.JsonReader"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.Parse(System.String)">
+            <summary>
+            Load a <see cref="T:Newtonsoft.Json.Linq.JArray"/> from a string that contains JSON.
+            </summary>
+            <param name="json">A <see cref="T:System.String"/> that contains JSON.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JArray"/> populated from the string that contains JSON.</returns>
+            <example>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\LinqToJsonTests.cs" region="LinqToJsonCreateParseArray" title="Parsing a JSON Array from Text"/>
+            </example>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.FromObject(System.Object)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Linq.JArray"/> from an object.
+            </summary>
+            <param name="o">The object that will be used to create <see cref="T:Newtonsoft.Json.Linq.JArray"/>.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JArray"/> with the values of the specified object</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.FromObject(System.Object,Newtonsoft.Json.JsonSerializer)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Linq.JArray"/> from an object.
+            </summary>
+            <param name="o">The object that will be used to create <see cref="T:Newtonsoft.Json.Linq.JArray"/>.</param>
+            <param name="jsonSerializer">The <see cref="T:Newtonsoft.Json.JsonSerializer"/> that will be used to read the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JArray"/> with the values of the specified object</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])">
+            <summary>
+            Writes this token to a <see cref="T:Newtonsoft.Json.JsonWriter"/>.
+            </summary>
+            <param name="writer">A <see cref="T:Newtonsoft.Json.JsonWriter"/> into which this method will write.</param>
+            <param name="converters">A collection of <see cref="T:Newtonsoft.Json.JsonConverter"/> which will be used when writing the token.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.IndexOf(Newtonsoft.Json.Linq.JToken)">
+            <summary>
+            Determines the index of a specific item in the <see cref="T:System.Collections.Generic.IList`1"/>.
+            </summary>
+            <param name="item">The object to locate in the <see cref="T:System.Collections.Generic.IList`1"/>.</param>
+            <returns>
+            The index of <paramref name="item"/> if found in the list; otherwise, -1.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.Insert(System.Int32,Newtonsoft.Json.Linq.JToken)">
+            <summary>
+            Inserts an item to the <see cref="T:System.Collections.Generic.IList`1"/> at the specified index.
+            </summary>
+            <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
+            <param name="item">The object to insert into the <see cref="T:System.Collections.Generic.IList`1"/>.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            	<paramref name="index"/> is not a valid index in the <see cref="T:System.Collections.Generic.IList`1"/>.</exception>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.Generic.IList`1"/> is read-only.</exception>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.RemoveAt(System.Int32)">
+            <summary>
+            Removes the <see cref="T:System.Collections.Generic.IList`1"/> item at the specified index.
+            </summary>
+            <param name="index">The zero-based index of the item to remove.</param>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            	<paramref name="index"/> is not a valid index in the <see cref="T:System.Collections.Generic.IList`1"/>.</exception>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.Generic.IList`1"/> is read-only.</exception>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through the collection.
+            </summary>
+            <returns>
+            A <see cref="T:System.Collections.Generic.IEnumerator`1" /> that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.Add(Newtonsoft.Json.Linq.JToken)">
+            <summary>
+            Adds an item to the <see cref="T:System.Collections.Generic.ICollection`1"/>.
+            </summary>
+            <param name="item">The object to add to the <see cref="T:System.Collections.Generic.ICollection`1"/>.</param>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only.</exception>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.Clear">
+            <summary>
+            Removes all items from the <see cref="T:System.Collections.Generic.ICollection`1"/>.
+            </summary>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only. </exception>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.Contains(Newtonsoft.Json.Linq.JToken)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.Generic.ICollection`1"/> contains a specific value.
+            </summary>
+            <param name="item">The object to locate in the <see cref="T:System.Collections.Generic.ICollection`1"/>.</param>
+            <returns>
+            true if <paramref name="item"/> is found in the <see cref="T:System.Collections.Generic.ICollection`1"/>; otherwise, false.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.CopyTo(Newtonsoft.Json.Linq.JToken[],System.Int32)">
+            <summary>
+            Copies to.
+            </summary>
+            <param name="array">The array.</param>
+            <param name="arrayIndex">Index of the array.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JArray.Remove(Newtonsoft.Json.Linq.JToken)">
+            <summary>
+            Removes the first occurrence of a specific object from the <see cref="T:System.Collections.Generic.ICollection`1"/>.
+            </summary>
+            <param name="item">The object to remove from the <see cref="T:System.Collections.Generic.ICollection`1"/>.</param>
+            <returns>
+            true if <paramref name="item"/> was successfully removed from the <see cref="T:System.Collections.Generic.ICollection`1"/>; otherwise, false. This method also returns false if <paramref name="item"/> is not found in the original <see cref="T:System.Collections.Generic.ICollection`1"/>.
+            </returns>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only.</exception>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JArray.ChildrenTokens">
+            <summary>
+            Gets the container's children tokens.
+            </summary>
+            <value>The container's children tokens.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JArray.Type">
+            <summary>
+            Gets the node type for this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <value>The type.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JArray.Item(System.Object)">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified key.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.Linq.JToken"/> with the specified key.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JArray.Item(System.Int32)">
+            <summary>
+            Gets or sets the <see cref="T:Newtonsoft.Json.Linq.JToken"/> at the specified index.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JArray.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.Generic.ICollection`1" /> is read-only.
+            </summary>
+            <returns>true if the <see cref="T:System.Collections.Generic.ICollection`1" /> is read-only; otherwise, false.</returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JTokenReader">
+            <summary>
+            Represents a reader that provides fast, non-cached, forward-only access to serialized Json data.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenReader.#ctor(Newtonsoft.Json.Linq.JToken)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JTokenReader"/> class.
+            </summary>
+            <param name="token">The token to read from.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenReader.ReadAsBytes">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:Byte[]"/>.
+            </summary>
+            <returns>
+            A <see cref="T:Byte[]"/> or a null reference if the next JSON token is null. This method will return <c>null</c> at the end of an array.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenReader.ReadAsDecimal">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenReader.ReadAsInt32">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenReader.ReadAsString">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.String"/>.
+            </summary>
+            <returns>A <see cref="T:System.String"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenReader.ReadAsDateTime">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.String"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenReader.ReadAsDateTimeOffset">
+            <summary>
+            Reads the next JSON token from the stream as a <see cref="T:System.Nullable`1"/>.
+            </summary>
+            <returns>A <see cref="T:System.Nullable`1"/>. This method will return <c>null</c> at the end of an array.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenReader.Read">
+            <summary>
+            Reads the next JSON token from the stream.
+            </summary>
+            <returns>
+            true if the next token was read successfully; false if there are no more tokens to read.
+            </returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JTokenWriter">
+            <summary>
+            Represents a writer that provides a fast, non-cached, forward-only way of generating Json data.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.#ctor(Newtonsoft.Json.Linq.JContainer)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JTokenWriter"/> class writing to the given <see cref="T:Newtonsoft.Json.Linq.JContainer"/>.
+            </summary>
+            <param name="container">The container being written to.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JTokenWriter"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.Flush">
+            <summary>
+            Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.Close">
+            <summary>
+            Closes this stream and the underlying stream.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteStartObject">
+            <summary>
+            Writes the beginning of a Json object.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteStartArray">
+            <summary>
+            Writes the beginning of a Json array.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteStartConstructor(System.String)">
+            <summary>
+            Writes the start of a constructor with the given name.
+            </summary>
+            <param name="name">The name of the constructor.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteEnd(Newtonsoft.Json.JsonToken)">
+            <summary>
+            Writes the end.
+            </summary>
+            <param name="token">The token.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WritePropertyName(System.String)">
+            <summary>
+            Writes the property name of a name/value pair on a Json object.
+            </summary>
+            <param name="name">The name of the property.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Object)">
+            <summary>
+            Writes a <see cref="T:System.Object"/> value.
+            An error will raised if the value cannot be written as a single JSON token.
+            </summary>
+            <param name="value">The <see cref="T:System.Object"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteNull">
+            <summary>
+            Writes a null value.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteUndefined">
+            <summary>
+            Writes an undefined value.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteRaw(System.String)">
+            <summary>
+            Writes raw JSON.
+            </summary>
+            <param name="json">The raw JSON to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteComment(System.String)">
+            <summary>
+            Writes out a comment <code>/*...*/</code> containing the specified text.
+            </summary>
+            <param name="text">Text to place inside the comment.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.String)">
+            <summary>
+            Writes a <see cref="T:System.String"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.String"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Int32)">
+            <summary>
+            Writes a <see cref="T:System.Int32"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int32"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.UInt32)">
+            <summary>
+            Writes a <see cref="T:System.UInt32"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt32"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Int64)">
+            <summary>
+            Writes a <see cref="T:System.Int64"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int64"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.UInt64)">
+            <summary>
+            Writes a <see cref="T:System.UInt64"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt64"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Single)">
+            <summary>
+            Writes a <see cref="T:System.Single"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Single"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Double)">
+            <summary>
+            Writes a <see cref="T:System.Double"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Double"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Boolean)">
+            <summary>
+            Writes a <see cref="T:System.Boolean"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Boolean"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Int16)">
+            <summary>
+            Writes a <see cref="T:System.Int16"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Int16"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.UInt16)">
+            <summary>
+            Writes a <see cref="T:System.UInt16"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.UInt16"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Char)">
+            <summary>
+            Writes a <see cref="T:System.Char"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Char"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Byte)">
+            <summary>
+            Writes a <see cref="T:System.Byte"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Byte"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.SByte)">
+            <summary>
+            Writes a <see cref="T:System.SByte"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.SByte"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Decimal)">
+            <summary>
+            Writes a <see cref="T:System.Decimal"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Decimal"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.DateTime)">
+            <summary>
+            Writes a <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.DateTime"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.DateTimeOffset)">
+            <summary>
+            Writes a <see cref="T:System.DateTimeOffset"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.DateTimeOffset"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Byte[])">
+            <summary>
+            Writes a <see cref="T:Byte[]"/> value.
+            </summary>
+            <param name="value">The <see cref="T:Byte[]"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.TimeSpan)">
+            <summary>
+            Writes a <see cref="T:System.TimeSpan"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.TimeSpan"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Guid)">
+            <summary>
+            Writes a <see cref="T:System.Guid"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Guid"/> value to write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JTokenWriter.WriteValue(System.Uri)">
+            <summary>
+            Writes a <see cref="T:System.Uri"/> value.
+            </summary>
+            <param name="value">The <see cref="T:System.Uri"/> value to write.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JTokenWriter.Token">
+            <summary>
+            Gets the token being writen.
+            </summary>
+            <value>The token being writen.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JProperty">
+            <summary>
+            Represents a JSON property.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JProperty.#ctor(Newtonsoft.Json.Linq.JProperty)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JProperty"/> class from another <see cref="T:Newtonsoft.Json.Linq.JProperty"/> object.
+            </summary>
+            <param name="other">A <see cref="T:Newtonsoft.Json.Linq.JProperty"/> object to copy from.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JProperty.#ctor(System.String,System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JProperty"/> class.
+            </summary>
+            <param name="name">The property name.</param>
+            <param name="content">The property content.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JProperty.#ctor(System.String,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Linq.JProperty"/> class.
+            </summary>
+            <param name="name">The property name.</param>
+            <param name="content">The property content.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JProperty.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.JsonConverter[])">
+            <summary>
+            Writes this token to a <see cref="T:Newtonsoft.Json.JsonWriter"/>.
+            </summary>
+            <param name="writer">A <see cref="T:Newtonsoft.Json.JsonWriter"/> into which this method will write.</param>
+            <param name="converters">A collection of <see cref="T:Newtonsoft.Json.JsonConverter"/> which will be used when writing the token.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Linq.JProperty.Load(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Loads an <see cref="T:Newtonsoft.Json.Linq.JProperty"/> from a <see cref="T:Newtonsoft.Json.JsonReader"/>. 
+            </summary>
+            <param name="reader">A <see cref="T:Newtonsoft.Json.JsonReader"/> that will be read for the content of the <see cref="T:Newtonsoft.Json.Linq.JProperty"/>.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Linq.JProperty"/> that contains the JSON that was read from the specified <see cref="T:Newtonsoft.Json.JsonReader"/>.</returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JProperty.ChildrenTokens">
+            <summary>
+            Gets the container's children tokens.
+            </summary>
+            <value>The container's children tokens.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JProperty.Name">
+            <summary>
+            Gets the property name.
+            </summary>
+            <value>The property name.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JProperty.Value">
+            <summary>
+            Gets or sets the property value.
+            </summary>
+            <value>The property value.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Linq.JProperty.Type">
+            <summary>
+            Gets the node type for this <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <value>The type.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Linq.JTokenType">
+            <summary>
+            Specifies the type of token.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.None">
+            <summary>
+            No token type has been set.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Object">
+            <summary>
+            A JSON object.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Array">
+            <summary>
+            A JSON array.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Constructor">
+            <summary>
+            A JSON constructor.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Property">
+            <summary>
+            A JSON object property.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Comment">
+            <summary>
+            A comment.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Integer">
+            <summary>
+            An integer value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Float">
+            <summary>
+            A float value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.String">
+            <summary>
+            A string value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Boolean">
+            <summary>
+            A boolean value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Null">
+            <summary>
+            A null value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Undefined">
+            <summary>
+            An undefined value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Date">
+            <summary>
+            A date value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Raw">
+            <summary>
+            A raw JSON value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Bytes">
+            <summary>
+            A collection of bytes value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Guid">
+            <summary>
+            A Guid value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.Uri">
+            <summary>
+            A Uri value.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Linq.JTokenType.TimeSpan">
+            <summary>
+            A TimeSpan value.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Schema.Extensions">
+            <summary>
+            Contains the JSON schema extension methods.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.Extensions.IsValid(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Schema.JsonSchema)">
+            <summary>
+            Determines whether the <see cref="T:Newtonsoft.Json.Linq.JToken"/> is valid.
+            </summary>
+            <param name="source">The source <see cref="T:Newtonsoft.Json.Linq.JToken"/> to test.</param>
+            <param name="schema">The schema to test with.</param>
+            <returns>
+            	<c>true</c> if the specified <see cref="T:Newtonsoft.Json.Linq.JToken"/> is valid; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.Extensions.IsValid(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Schema.JsonSchema,System.Collections.Generic.IList{System.String}@)">
+            <summary>
+            Determines whether the <see cref="T:Newtonsoft.Json.Linq.JToken"/> is valid.
+            </summary>
+            <param name="source">The source <see cref="T:Newtonsoft.Json.Linq.JToken"/> to test.</param>
+            <param name="schema">The schema to test with.</param>
+            <param name="errorMessages">When this method returns, contains any error messages generated while validating. </param>
+            <returns>
+            	<c>true</c> if the specified <see cref="T:Newtonsoft.Json.Linq.JToken"/> is valid; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.Extensions.Validate(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Schema.JsonSchema)">
+            <summary>
+            Validates the specified <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="source">The source <see cref="T:Newtonsoft.Json.Linq.JToken"/> to test.</param>
+            <param name="schema">The schema to test with.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.Extensions.Validate(Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Schema.JsonSchema,Newtonsoft.Json.Schema.ValidationEventHandler)">
+            <summary>
+            Validates the specified <see cref="T:Newtonsoft.Json.Linq.JToken"/>.
+            </summary>
+            <param name="source">The source <see cref="T:Newtonsoft.Json.Linq.JToken"/> to test.</param>
+            <param name="schema">The schema to test with.</param>
+            <param name="validationEventHandler">The validation event handler.</param>
+        </member>
+        <member name="T:Newtonsoft.Json.Schema.JsonSchemaException">
+            <summary>
+            Returns detailed information about the schema exception.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchemaException.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Schema.JsonSchemaException"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchemaException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Schema.JsonSchemaException"/> class
+            with a specified error message.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchemaException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Schema.JsonSchemaException"/> class
+            with a specified error message and a reference to the inner exception that is the cause of this exception.
+            </summary>
+            <param name="message">The error message that explains the reason for the exception.</param>
+            <param name="innerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchemaException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Schema.JsonSchemaException"/> class.
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="info"/> parameter is null. </exception>
+            <exception cref="T:System.Runtime.Serialization.SerializationException">The class name is null or <see cref="P:System.Exception.HResult"/> is zero (0). </exception>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchemaException.LineNumber">
+            <summary>
+            Gets the line number indicating where the error occurred.
+            </summary>
+            <value>The line number indicating where the error occurred.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchemaException.LinePosition">
+            <summary>
+            Gets the line position indicating where the error occurred.
+            </summary>
+            <value>The line position indicating where the error occurred.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchemaException.Path">
+            <summary>
+            Gets the path to the JSON where the error occurred.
+            </summary>
+            <value>The path to the JSON where the error occurred.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Schema.JsonSchemaResolver">
+            <summary>
+            Resolves <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from an id.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchemaResolver.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Schema.JsonSchemaResolver"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchemaResolver.GetSchema(System.String)">
+            <summary>
+            Gets a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> for the specified reference.
+            </summary>
+            <param name="reference">The id.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> for the specified reference.</returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchemaResolver.LoadedSchemas">
+            <summary>
+            Gets or sets the loaded schemas.
+            </summary>
+            <value>The loaded schemas.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Schema.UndefinedSchemaIdHandling">
+            <summary>
+            Specifies undefined schema Id handling options for the <see cref="T:Newtonsoft.Json.Schema.JsonSchemaGenerator"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.UndefinedSchemaIdHandling.None">
+            <summary>
+            Do not infer a schema Id.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.UndefinedSchemaIdHandling.UseTypeName">
+            <summary>
+            Use the .NET type name as the schema Id.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.UndefinedSchemaIdHandling.UseAssemblyQualifiedName">
+            <summary>
+            Use the assembly qualified .NET type name as the schema Id.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Schema.ValidationEventArgs">
+            <summary>
+            Returns detailed information related to the <see cref="T:Newtonsoft.Json.Schema.ValidationEventHandler"/>.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.ValidationEventArgs.Exception">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Schema.JsonSchemaException"/> associated with the validation error.
+            </summary>
+            <value>The JsonSchemaException associated with the validation error.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.ValidationEventArgs.Path">
+            <summary>
+            Gets the path of the JSON location where the validation error occurred.
+            </summary>
+            <value>The path of the JSON location where the validation error occurred.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.ValidationEventArgs.Message">
+            <summary>
+            Gets the text description corresponding to the validation error.
+            </summary>
+            <value>The text description.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Schema.ValidationEventHandler">
+            <summary>
+            Represents the callback method that will handle JSON schema validation events and the <see cref="T:Newtonsoft.Json.Schema.ValidationEventArgs"/>.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver">
+            <summary>
+            Resolves member mappings for a type, camel casing property names.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.DefaultContractResolver">
+            <summary>
+            Used by <see cref="T:Newtonsoft.Json.JsonSerializer"/> to resolves a <see cref="T:Newtonsoft.Json.Serialization.JsonContract"/> for a given <see cref="T:System.Type"/>.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.IContractResolver">
+            <summary>
+            Used by <see cref="T:Newtonsoft.Json.JsonSerializer"/> to resolves a <see cref="T:Newtonsoft.Json.Serialization.JsonContract"/> for a given <see cref="T:System.Type"/>.
+            </summary>
+            <example>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\SerializationTests.cs" region="ReducingSerializedJsonSizeContractResolverObject" title="IContractResolver Class"/>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\SerializationTests.cs" region="ReducingSerializedJsonSizeContractResolverExample" title="IContractResolver Example"/>
+            </example>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.IContractResolver.ResolveContract(System.Type)">
+            <summary>
+            Resolves the contract for a given type.
+            </summary>
+            <param name="type">The type to resolve a contract for.</param>
+            <returns>The contract for a given type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.DefaultContractResolver"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.#ctor(System.Boolean)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.DefaultContractResolver"/> class.
+            </summary>
+            <param name="shareCache">
+            If set to <c>true</c> the <see cref="T:Newtonsoft.Json.Serialization.DefaultContractResolver"/> will use a cached shared with other resolvers of the same type.
+            Sharing the cache will significantly performance because expensive reflection will only happen once but could cause unexpected
+            behavior if different instances of the resolver are suppose to produce different results. When set to false it is highly
+            recommended to reuse <see cref="T:Newtonsoft.Json.Serialization.DefaultContractResolver"/> instances with the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </param>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract(System.Type)">
+            <summary>
+            Resolves the contract for a given type.
+            </summary>
+            <param name="type">The type to resolve a contract for.</param>
+            <returns>The contract for a given type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.GetSerializableMembers(System.Type)">
+            <summary>
+            Gets the serializable members for the type.
+            </summary>
+            <param name="objectType">The type to get serializable members for.</param>
+            <returns>The serializable members for the type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateObjectContract(System.Type)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Serialization.JsonObjectContract"/> for the given type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Serialization.JsonObjectContract"/> for the given type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateConstructorParameters(System.Reflection.ConstructorInfo,Newtonsoft.Json.Serialization.JsonPropertyCollection)">
+            <summary>
+            Creates the constructor parameters.
+            </summary>
+            <param name="constructor">The constructor to create properties for.</param>
+            <param name="memberProperties">The type's member properties.</param>
+            <returns>Properties for the given <see cref="T:System.Reflection.ConstructorInfo"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreatePropertyFromConstructorParameter(Newtonsoft.Json.Serialization.JsonProperty,System.Reflection.ParameterInfo)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> for the given <see cref="T:System.Reflection.ParameterInfo"/>.
+            </summary>
+            <param name="matchingMemberProperty">The matching member property.</param>
+            <param name="parameterInfo">The constructor parameter.</param>
+            <returns>A created <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> for the given <see cref="T:System.Reflection.ParameterInfo"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContractConverter(System.Type)">
+            <summary>
+            Resolves the default <see cref="T:Newtonsoft.Json.JsonConverter"/> for the contract.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>The contract's default <see cref="T:Newtonsoft.Json.JsonConverter"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateDictionaryContract(System.Type)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Serialization.JsonDictionaryContract"/> for the given type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Serialization.JsonDictionaryContract"/> for the given type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateArrayContract(System.Type)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Serialization.JsonArrayContract"/> for the given type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Serialization.JsonArrayContract"/> for the given type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreatePrimitiveContract(System.Type)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Serialization.JsonPrimitiveContract"/> for the given type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Serialization.JsonPrimitiveContract"/> for the given type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateLinqContract(System.Type)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Serialization.JsonLinqContract"/> for the given type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Serialization.JsonLinqContract"/> for the given type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateISerializableContract(System.Type)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Serialization.JsonISerializableContract"/> for the given type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Serialization.JsonISerializableContract"/> for the given type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateDynamicContract(System.Type)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Serialization.JsonDynamicContract"/> for the given type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Serialization.JsonDynamicContract"/> for the given type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateStringContract(System.Type)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Serialization.JsonStringContract"/> for the given type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Serialization.JsonStringContract"/> for the given type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract(System.Type)">
+            <summary>
+            Determines which contract type is created for the given type.
+            </summary>
+            <param name="objectType">Type of the object.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Serialization.JsonContract"/> for the given type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateProperties(System.Type,Newtonsoft.Json.MemberSerialization)">
+            <summary>
+            Creates properties for the given <see cref="T:Newtonsoft.Json.Serialization.JsonContract"/>.
+            </summary>
+            <param name="type">The type to create properties for.</param>
+            /// <param name="memberSerialization">The member serialization mode for the type.</param>
+            <returns>Properties for the given <see cref="T:Newtonsoft.Json.Serialization.JsonContract"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateMemberValueProvider(System.Reflection.MemberInfo)">
+            <summary>
+            Creates the <see cref="T:Newtonsoft.Json.Serialization.IValueProvider"/> used by the serializer to get and set values from a member.
+            </summary>
+            <param name="member">The member.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Serialization.IValueProvider"/> used by the serializer to get and set values from a member.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.CreateProperty(System.Reflection.MemberInfo,Newtonsoft.Json.MemberSerialization)">
+            <summary>
+            Creates a <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> for the given <see cref="T:System.Reflection.MemberInfo"/>.
+            </summary>
+            <param name="memberSerialization">The member's parent <see cref="T:Newtonsoft.Json.MemberSerialization"/>.</param>
+            <param name="member">The member to create a <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> for.</param>
+            <returns>A created <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> for the given <see cref="T:System.Reflection.MemberInfo"/>.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.ResolvePropertyName(System.String)">
+            <summary>
+            Resolves the name of the property.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <returns>Name of the property.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultContractResolver.GetResolvedPropertyName(System.String)">
+            <summary>
+            Gets the resolved name of the property.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <returns>Name of the property.</returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.DefaultContractResolver.DynamicCodeGeneration">
+            <summary>
+            Gets a value indicating whether members are being get and set using dynamic code generation.
+            This value is determined by the runtime permissions available.
+            </summary>
+            <value>
+            	<c>true</c> if using dynamic code generation; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.DefaultContractResolver.DefaultMembersSearchFlags">
+            <summary>
+            Gets or sets the default members search flags.
+            </summary>
+            <value>The default members search flags.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.DefaultContractResolver.SerializeCompilerGeneratedMembers">
+            <summary>
+            Gets or sets a value indicating whether compiler generated members should be serialized.
+            </summary>
+            <value>
+            	<c>true</c> if serialized compiler generated members; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.DefaultContractResolver.IgnoreSerializableInterface">
+            <summary>
+            Gets or sets a value indicating whether to ignore the <see cref="T:System.Runtime.Serialization.ISerializable"/> interface when serializing and deserializing types.
+            </summary>
+            <value>
+            	<c>true</c> if the <see cref="T:System.Runtime.Serialization.ISerializable"/> interface will be ignored when serializing and deserializing types; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.DefaultContractResolver.IgnoreSerializableAttribute">
+            <summary>
+            Gets or sets a value indicating whether to ignore the <see cref="T:System.SerializableAttribute"/> attribute when serializing and deserializing types.
+            </summary>
+            <value>
+            	<c>true</c> if the <see cref="T:System.SerializableAttribute"/> attribute will be ignored when serializing and deserializing types; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver.ResolvePropertyName(System.String)">
+            <summary>
+            Resolves the name of the property.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <returns>The property name camel cased.</returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.DefaultSerializationBinder">
+            <summary>
+            The default serialization binder used when resolving and loading classes from type names.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultSerializationBinder.BindToType(System.String,System.String)">
+            <summary>
+            When overridden in a derived class, controls the binding of a serialized object to a type.
+            </summary>
+            <param name="assemblyName">Specifies the <see cref="T:System.Reflection.Assembly"/> name of the serialized object.</param>
+            <param name="typeName">Specifies the <see cref="T:System.Type"/> name of the serialized object.</param>
+            <returns>
+            The type of the object the formatter creates a new instance of.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.DefaultSerializationBinder.BindToName(System.Type,System.String@,System.String@)">
+            <summary>
+            When overridden in a derived class, controls the binding of a serialized object to a type.
+            </summary>
+            <param name="serializedType">The type of the object the formatter creates a new instance of.</param>
+            <param name="assemblyName">Specifies the <see cref="T:System.Reflection.Assembly"/> name of the serialized object. </param>
+            <param name="typeName">Specifies the <see cref="T:System.Type"/> name of the serialized object. </param>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.ErrorContext">
+            <summary>
+            Provides information surrounding an error.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.ErrorContext.Error">
+            <summary>
+            Gets the error.
+            </summary>
+            <value>The error.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.ErrorContext.OriginalObject">
+            <summary>
+            Gets the original object that caused the error.
+            </summary>
+            <value>The original object that caused the error.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.ErrorContext.Member">
+            <summary>
+            Gets the member that caused the error.
+            </summary>
+            <value>The member that caused the error.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.ErrorContext.Path">
+            <summary>
+            Gets the path of the JSON location where the error occurred.
+            </summary>
+            <value>The path of the JSON location where the error occurred.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.ErrorContext.Handled">
+            <summary>
+            Gets or sets a value indicating whether this <see cref="T:Newtonsoft.Json.Serialization.ErrorContext"/> is handled.
+            </summary>
+            <value><c>true</c> if handled; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonArrayContract">
+            <summary>
+            Contract details for a <see cref="T:System.Type"/> used by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonArrayContract.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.JsonArrayContract"/> class.
+            </summary>
+            <param name="underlyingType">The underlying type for the contract.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonArrayContract.CollectionItemType">
+            <summary>
+            Gets the <see cref="T:System.Type"/> of the collection items.
+            </summary>
+            <value>The <see cref="T:System.Type"/> of the collection items.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonArrayContract.IsMultidimensionalArray">
+            <summary>
+            Gets a value indicating whether the collection type is a multidimensional array.
+            </summary>
+            <value><c>true</c> if the collection type is a multidimensional array; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.SerializationCallback">
+            <summary>
+            Handles <see cref="T:Newtonsoft.Json.JsonSerializer"/> serialization callback events.
+            </summary>
+            <param name="o">The object that raised the callback event.</param>
+            <param name="context">The streaming context.</param>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.SerializationErrorCallback">
+            <summary>
+            Handles <see cref="T:Newtonsoft.Json.JsonSerializer"/> serialization error callback events.
+            </summary>
+            <param name="o">The object that raised the callback event.</param>
+            <param name="context">The streaming context.</param>
+            <param name="errorContext">The error context.</param>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.ExtensionDataSetter">
+            <summary>
+            Sets extension data for an object during deserialization.
+            </summary>
+            <param name="o">The object to set extension data on.</param>
+            <param name="key">The extension data key.</param>
+            <param name="value">The extension data value.</param>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.ExtensionDataGetter">
+            <summary>
+            Gets extension data for an object during serialization.
+            </summary>
+            <param name="o">The object to set extension data on.</param>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonDictionaryContract">
+            <summary>
+            Contract details for a <see cref="T:System.Type"/> used by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonDictionaryContract.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.JsonDictionaryContract"/> class.
+            </summary>
+            <param name="underlyingType">The underlying type for the contract.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonDictionaryContract.PropertyNameResolver">
+            <summary>
+            Gets or sets the property name resolver.
+            </summary>
+            <value>The property name resolver.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonDictionaryContract.DictionaryKeyType">
+            <summary>
+            Gets the <see cref="T:System.Type"/> of the dictionary keys.
+            </summary>
+            <value>The <see cref="T:System.Type"/> of the dictionary keys.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonDictionaryContract.DictionaryValueType">
+            <summary>
+            Gets the <see cref="T:System.Type"/> of the dictionary values.
+            </summary>
+            <value>The <see cref="T:System.Type"/> of the dictionary values.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonProperty">
+            <summary>
+            Maps a JSON property to a .NET member or constructor parameter.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonProperty.ToString">
+            <summary>
+            Returns a <see cref="T:System.String"/> that represents this instance.
+            </summary>
+            <returns>
+            A <see cref="T:System.String"/> that represents this instance.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.PropertyName">
+            <summary>
+            Gets or sets the name of the property.
+            </summary>
+            <value>The name of the property.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.DeclaringType">
+            <summary>
+            Gets or sets the type that declared this property.
+            </summary>
+            <value>The type that declared this property.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.Order">
+            <summary>
+            Gets or sets the order of serialization and deserialization of a member.
+            </summary>
+            <value>The numeric order of serialization or deserialization.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.UnderlyingName">
+            <summary>
+            Gets or sets the name of the underlying member or parameter.
+            </summary>
+            <value>The name of the underlying member or parameter.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.ValueProvider">
+            <summary>
+            Gets the <see cref="T:Newtonsoft.Json.Serialization.IValueProvider"/> that will get and set the <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> during serialization.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.Serialization.IValueProvider"/> that will get and set the <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> during serialization.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.PropertyType">
+            <summary>
+            Gets or sets the type of the property.
+            </summary>
+            <value>The type of the property.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.Converter">
+            <summary>
+            Gets or sets the <see cref="T:Newtonsoft.Json.JsonConverter"/> for the property.
+            If set this converter takes presidence over the contract converter for the property type.
+            </summary>
+            <value>The converter.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.MemberConverter">
+            <summary>
+            Gets or sets the member converter.
+            </summary>
+            <value>The member converter.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.Ignored">
+            <summary>
+            Gets or sets a value indicating whether this <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> is ignored.
+            </summary>
+            <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.Readable">
+            <summary>
+            Gets or sets a value indicating whether this <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> is readable.
+            </summary>
+            <value><c>true</c> if readable; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.Writable">
+            <summary>
+            Gets or sets a value indicating whether this <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> is writable.
+            </summary>
+            <value><c>true</c> if writable; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.HasMemberAttribute">
+            <summary>
+            Gets or sets a value indicating whether this <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> has a member attribute.
+            </summary>
+            <value><c>true</c> if has a member attribute; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.DefaultValue">
+            <summary>
+            Gets the default value.
+            </summary>
+            <value>The default value.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.Required">
+            <summary>
+            Gets or sets a value indicating whether this <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> is required.
+            </summary>
+            <value>A value indicating whether this <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> is required.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.IsReference">
+            <summary>
+            Gets or sets a value indicating whether this property preserves object references.
+            </summary>
+            <value>
+            	<c>true</c> if this instance is reference; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.NullValueHandling">
+            <summary>
+            Gets or sets the property null value handling.
+            </summary>
+            <value>The null value handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.DefaultValueHandling">
+            <summary>
+            Gets or sets the property default value handling.
+            </summary>
+            <value>The default value handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.ReferenceLoopHandling">
+            <summary>
+            Gets or sets the property reference loop handling.
+            </summary>
+            <value>The reference loop handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.ObjectCreationHandling">
+            <summary>
+            Gets or sets the property object creation handling.
+            </summary>
+            <value>The object creation handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.TypeNameHandling">
+            <summary>
+            Gets or sets or sets the type name handling.
+            </summary>
+            <value>The type name handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.ShouldSerialize">
+            <summary>
+            Gets or sets a predicate used to determine whether the property should be serialize.
+            </summary>
+            <value>A predicate used to determine whether the property should be serialize.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.GetIsSpecified">
+            <summary>
+            Gets or sets a predicate used to determine whether the property should be serialized.
+            </summary>
+            <value>A predicate used to determine whether the property should be serialized.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.SetIsSpecified">
+            <summary>
+            Gets or sets an action used to set whether the property has been deserialized.
+            </summary>
+            <value>An action used to set whether the property has been deserialized.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.ItemConverter">
+            <summary>
+            Gets or sets the converter used when serializing the property's collection items.
+            </summary>
+            <value>The collection's items converter.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.ItemIsReference">
+            <summary>
+            Gets or sets whether this property's collection items are serialized as a reference.
+            </summary>
+            <value>Whether this property's collection items are serialized as a reference.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.ItemTypeNameHandling">
+            <summary>
+            Gets or sets the the type name handling used when serializing the property's collection items.
+            </summary>
+            <value>The collection's items type name handling.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonProperty.ItemReferenceLoopHandling">
+            <summary>
+            Gets or sets the the reference loop handling used when serializing the property's collection items.
+            </summary>
+            <value>The collection's items reference loop handling.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonPropertyCollection">
+            <summary>
+            A collection of <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> objects.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonPropertyCollection.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.JsonPropertyCollection"/> class.
+            </summary>
+            <param name="type">The type.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonPropertyCollection.GetKeyForItem(Newtonsoft.Json.Serialization.JsonProperty)">
+            <summary>
+            When implemented in a derived class, extracts the key from the specified element.
+            </summary>
+            <param name="item">The element from which to extract the key.</param>
+            <returns>The key for the specified element.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonPropertyCollection.AddProperty(Newtonsoft.Json.Serialization.JsonProperty)">
+            <summary>
+            Adds a <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> object.
+            </summary>
+            <param name="property">The property to add to the collection.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonPropertyCollection.GetClosestMatchProperty(System.String)">
+            <summary>
+            Gets the closest matching <see cref="T:Newtonsoft.Json.Serialization.JsonProperty"/> object.
+            First attempts to get an exact case match of propertyName and then
+            a case insensitive match.
+            </summary>
+            <param name="propertyName">Name of the property.</param>
+            <returns>A matching property if found.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonPropertyCollection.GetProperty(System.String,System.StringComparison)">
+            <summary>
+            Gets a property by property name.
+            </summary>
+            <param name="propertyName">The name of the property to get.</param>
+            <param name="comparisonType">Type property name string comparison.</param>
+            <returns>A matching property if found.</returns>
+        </member>
+        <member name="T:Newtonsoft.Json.MissingMemberHandling">
+            <summary>
+            Specifies missing member handling options for the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.MissingMemberHandling.Ignore">
+            <summary>
+            Ignore a missing member and do not attempt to deserialize it.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.MissingMemberHandling.Error">
+            <summary>
+            Throw a <see cref="T:Newtonsoft.Json.JsonSerializationException"/> when a missing member is encountered during deserialization.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.NullValueHandling">
+            <summary>
+            Specifies null value handling options for the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+            <example>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\SerializationTests.cs" region="ReducingSerializedJsonSizeNullValueHandlingObject" title="NullValueHandling Class"/>
+              <code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\SerializationTests.cs" region="ReducingSerializedJsonSizeNullValueHandlingExample" title="NullValueHandling Ignore Example"/>
+            </example>
+        </member>
+        <member name="F:Newtonsoft.Json.NullValueHandling.Include">
+            <summary>
+            Include null values when serializing and deserializing objects.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.NullValueHandling.Ignore">
+            <summary>
+            Ignore null values when serializing and deserializing objects.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.ReferenceLoopHandling">
+            <summary>
+            Specifies reference loop handling options for the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.ReferenceLoopHandling.Error">
+            <summary>
+            Throw a <see cref="T:Newtonsoft.Json.JsonSerializationException"/> when a loop is encountered.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.ReferenceLoopHandling.Ignore">
+            <summary>
+            Ignore loop references and do not serialize.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.ReferenceLoopHandling.Serialize">
+            <summary>
+            Serialize loop references.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Schema.JsonSchema">
+            <summary>
+            An in-memory representation of a JSON Schema.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchema.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> class.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchema.Read(Newtonsoft.Json.JsonReader)">
+            <summary>
+            Reads a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from the specified <see cref="T:Newtonsoft.Json.JsonReader"/>.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> containing the JSON Schema to read.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> object representing the JSON Schema.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchema.Read(Newtonsoft.Json.JsonReader,Newtonsoft.Json.Schema.JsonSchemaResolver)">
+            <summary>
+            Reads a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from the specified <see cref="T:Newtonsoft.Json.JsonReader"/>.
+            </summary>
+            <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> containing the JSON Schema to read.</param>
+            <param name="resolver">The <see cref="T:Newtonsoft.Json.Schema.JsonSchemaResolver"/> to use when resolving schema references.</param>
+            <returns>The <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> object representing the JSON Schema.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchema.Parse(System.String)">
+            <summary>
+            Load a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from a string that contains schema JSON.
+            </summary>
+            <param name="json">A <see cref="T:System.String"/> that contains JSON.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> populated from the string that contains JSON.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchema.Parse(System.String,Newtonsoft.Json.Schema.JsonSchemaResolver)">
+            <summary>
+            Parses the specified json.
+            </summary>
+            <param name="json">The json.</param>
+            <param name="resolver">The resolver.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> populated from the string that contains JSON.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchema.WriteTo(Newtonsoft.Json.JsonWriter)">
+            <summary>
+            Writes this schema to a <see cref="T:Newtonsoft.Json.JsonWriter"/>.
+            </summary>
+            <param name="writer">A <see cref="T:Newtonsoft.Json.JsonWriter"/> into which this method will write.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchema.WriteTo(Newtonsoft.Json.JsonWriter,Newtonsoft.Json.Schema.JsonSchemaResolver)">
+            <summary>
+            Writes this schema to a <see cref="T:Newtonsoft.Json.JsonWriter"/> using the specified <see cref="T:Newtonsoft.Json.Schema.JsonSchemaResolver"/>.
+            </summary>
+            <param name="writer">A <see cref="T:Newtonsoft.Json.JsonWriter"/> into which this method will write.</param>
+            <param name="resolver">The resolver used.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchema.ToString">
+            <summary>
+            Returns a <see cref="T:System.String"/> that represents the current <see cref="T:System.Object"/>.
+            </summary>
+            <returns>
+            A <see cref="T:System.String"/> that represents the current <see cref="T:System.Object"/>.
+            </returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Id">
+            <summary>
+            Gets or sets the id.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Title">
+            <summary>
+            Gets or sets the title.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Required">
+            <summary>
+            Gets or sets whether the object is required.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.ReadOnly">
+            <summary>
+            Gets or sets whether the object is read only.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Hidden">
+            <summary>
+            Gets or sets whether the object is visible to users.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Transient">
+            <summary>
+            Gets or sets whether the object is transient.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Description">
+            <summary>
+            Gets or sets the description of the object.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Type">
+            <summary>
+            Gets or sets the types of values allowed by the object.
+            </summary>
+            <value>The type.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Pattern">
+            <summary>
+            Gets or sets the pattern.
+            </summary>
+            <value>The pattern.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.MinimumLength">
+            <summary>
+            Gets or sets the minimum length.
+            </summary>
+            <value>The minimum length.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.MaximumLength">
+            <summary>
+            Gets or sets the maximum length.
+            </summary>
+            <value>The maximum length.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.DivisibleBy">
+            <summary>
+            Gets or sets a number that the value should be divisble by.
+            </summary>
+            <value>A number that the value should be divisble by.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Minimum">
+            <summary>
+            Gets or sets the minimum.
+            </summary>
+            <value>The minimum.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Maximum">
+            <summary>
+            Gets or sets the maximum.
+            </summary>
+            <value>The maximum.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.ExclusiveMinimum">
+            <summary>
+            Gets or sets a flag indicating whether the value can not equal the number defined by the "minimum" attribute.
+            </summary>
+            <value>A flag indicating whether the value can not equal the number defined by the "minimum" attribute.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.ExclusiveMaximum">
+            <summary>
+            Gets or sets a flag indicating whether the value can not equal the number defined by the "maximum" attribute.
+            </summary>
+            <value>A flag indicating whether the value can not equal the number defined by the "maximum" attribute.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.MinimumItems">
+            <summary>
+            Gets or sets the minimum number of items.
+            </summary>
+            <value>The minimum number of items.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.MaximumItems">
+            <summary>
+            Gets or sets the maximum number of items.
+            </summary>
+            <value>The maximum number of items.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Items">
+            <summary>
+            Gets or sets the <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> of items.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> of items.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.PositionalItemsValidation">
+            <summary>
+            Gets or sets a value indicating whether items in an array are validated using the <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> instance at their array position from <see cref="P:Newtonsoft.Json.Schema.JsonSchema.Items"/>.
+            </summary>
+            <value>
+            	<c>true</c> if items are validated using their array position; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.AdditionalItems">
+            <summary>
+            Gets or sets the <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> of additional items.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> of additional items.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.AllowAdditionalItems">
+            <summary>
+            Gets or sets a value indicating whether additional items are allowed.
+            </summary>
+            <value>
+            	<c>true</c> if additional items are allowed; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.UniqueItems">
+            <summary>
+            Gets or sets whether the array items must be unique.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Properties">
+            <summary>
+            Gets or sets the <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> of properties.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> of properties.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.AdditionalProperties">
+            <summary>
+            Gets or sets the <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> of additional properties.
+            </summary>
+            <value>The <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> of additional properties.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.PatternProperties">
+            <summary>
+            Gets or sets the pattern properties.
+            </summary>
+            <value>The pattern properties.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.AllowAdditionalProperties">
+            <summary>
+            Gets or sets a value indicating whether additional properties are allowed.
+            </summary>
+            <value>
+            	<c>true</c> if additional properties are allowed; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Requires">
+            <summary>
+            Gets or sets the required property if this property is present.
+            </summary>
+            <value>The required property if this property is present.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Enum">
+            <summary>
+            Gets or sets the a collection of valid enum values allowed.
+            </summary>
+            <value>A collection of valid enum values allowed.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Disallow">
+            <summary>
+            Gets or sets disallowed types.
+            </summary>
+            <value>The disallow types.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Default">
+            <summary>
+            Gets or sets the default value.
+            </summary>
+            <value>The default value.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Extends">
+            <summary>
+            Gets or sets the collection of <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> that this schema extends.
+            </summary>
+            <value>The collection of <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> that this schema extends.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchema.Format">
+            <summary>
+            Gets or sets the format.
+            </summary>
+            <value>The format.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Schema.JsonSchemaGenerator">
+            <summary>
+            Generates a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from a specified <see cref="T:System.Type"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchemaGenerator.Generate(System.Type)">
+            <summary>
+            Generate a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from the specified type.
+            </summary>
+            <param name="type">The type to generate a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> generated from the specified type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchemaGenerator.Generate(System.Type,Newtonsoft.Json.Schema.JsonSchemaResolver)">
+            <summary>
+            Generate a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from the specified type.
+            </summary>
+            <param name="type">The type to generate a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from.</param>
+            <param name="resolver">The <see cref="T:Newtonsoft.Json.Schema.JsonSchemaResolver"/> used to resolve schema references.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> generated from the specified type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchemaGenerator.Generate(System.Type,System.Boolean)">
+            <summary>
+            Generate a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from the specified type.
+            </summary>
+            <param name="type">The type to generate a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from.</param>
+            <param name="rootSchemaNullable">Specify whether the generated root <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> will be nullable.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> generated from the specified type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Schema.JsonSchemaGenerator.Generate(System.Type,Newtonsoft.Json.Schema.JsonSchemaResolver,System.Boolean)">
+            <summary>
+            Generate a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from the specified type.
+            </summary>
+            <param name="type">The type to generate a <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> from.</param>
+            <param name="resolver">The <see cref="T:Newtonsoft.Json.Schema.JsonSchemaResolver"/> used to resolve schema references.</param>
+            <param name="rootSchemaNullable">Specify whether the generated root <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> will be nullable.</param>
+            <returns>A <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/> generated from the specified type.</returns>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchemaGenerator.UndefinedSchemaIdHandling">
+            <summary>
+            Gets or sets how undefined schemas are handled by the serializer.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Schema.JsonSchemaGenerator.ContractResolver">
+            <summary>
+            Gets or sets the contract resolver.
+            </summary>
+            <value>The contract resolver.</value>
+        </member>
+        <member name="T:Newtonsoft.Json.Schema.JsonSchemaType">
+            <summary>
+            The value types allowed by the <see cref="T:Newtonsoft.Json.Schema.JsonSchema"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.JsonSchemaType.None">
+            <summary>
+            No type specified.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.JsonSchemaType.String">
+            <summary>
+            String type.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.JsonSchemaType.Float">
+            <summary>
+            Float type.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.JsonSchemaType.Integer">
+            <summary>
+            Integer type.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.JsonSchemaType.Boolean">
+            <summary>
+            Boolean type.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.JsonSchemaType.Object">
+            <summary>
+            Object type.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.JsonSchemaType.Array">
+            <summary>
+            Array type.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.JsonSchemaType.Null">
+            <summary>
+            Null type.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.Schema.JsonSchemaType.Any">
+            <summary>
+            Any type.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonObjectContract">
+            <summary>
+            Contract details for a <see cref="T:System.Type"/> used by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonObjectContract.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.JsonObjectContract"/> class.
+            </summary>
+            <param name="underlyingType">The underlying type for the contract.</param>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonObjectContract.MemberSerialization">
+            <summary>
+            Gets or sets the object member serialization.
+            </summary>
+            <value>The member object serialization.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonObjectContract.ItemRequired">
+            <summary>
+            Gets or sets a value that indicates whether the object's properties are required.
+            </summary>
+            <value>
+            	A value indicating whether the object's properties are required.
+            </value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonObjectContract.Properties">
+            <summary>
+            Gets the object's properties.
+            </summary>
+            <value>The object's properties.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonObjectContract.ConstructorParameters">
+            <summary>
+            Gets the constructor parameters required for any non-default constructor
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonObjectContract.OverrideConstructor">
+            <summary>
+            Gets or sets the override constructor used to create the object.
+            This is set when a constructor is marked up using the
+            JsonConstructor attribute.
+            </summary>
+            <value>The override constructor.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonObjectContract.ParametrizedConstructor">
+            <summary>
+            Gets or sets the parametrized constructor used to create the object.
+            </summary>
+            <value>The parametrized constructor.</value>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonObjectContract.ExtensionDataSetter">
+            <summary>
+            Gets or sets the extension data setter.
+            </summary>
+        </member>
+        <member name="P:Newtonsoft.Json.Serialization.JsonObjectContract.ExtensionDataGetter">
+            <summary>
+            Gets or sets the extension data getter.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.JsonStringContract">
+            <summary>
+            Contract details for a <see cref="T:System.Type"/> used by the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.JsonStringContract.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.JsonStringContract"/> class.
+            </summary>
+            <param name="underlyingType">The underlying type for the contract.</param>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.ReflectionValueProvider">
+            <summary>
+            Get and set values for a <see cref="T:System.Reflection.MemberInfo"/> using reflection.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.ReflectionValueProvider.#ctor(System.Reflection.MemberInfo)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.ReflectionValueProvider"/> class.
+            </summary>
+            <param name="memberInfo">The member info.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.ReflectionValueProvider.SetValue(System.Object,System.Object)">
+            <summary>
+            Sets the value.
+            </summary>
+            <param name="target">The target to set the value on.</param>
+            <param name="value">The value to set on the target.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Serialization.ReflectionValueProvider.GetValue(System.Object)">
+            <summary>
+            Gets the value.
+            </summary>
+            <param name="target">The target to get the value from.</param>
+            <returns>The value.</returns>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.OnErrorAttribute">
+            <summary>
+            When applied to a method, specifies that the method is called when an error occurs serializing an object.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.DynamicProxyMetaObject`1.CallMethodWithResult(System.String,System.Dynamic.DynamicMetaObjectBinder,System.Linq.Expressions.Expression[],Newtonsoft.Json.Utilities.DynamicProxyMetaObject{`0}.Fallback,Newtonsoft.Json.Utilities.DynamicProxyMetaObject{`0}.Fallback)">
+            <summary>
+            Helper method for generating a MetaObject which calls a
+            specific method on Dynamic that returns a result
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.DynamicProxyMetaObject`1.CallMethodReturnLast(System.String,System.Dynamic.DynamicMetaObjectBinder,System.Linq.Expressions.Expression[],Newtonsoft.Json.Utilities.DynamicProxyMetaObject{`0}.Fallback)">
+            <summary>
+            Helper method for generating a MetaObject which calls a
+            specific method on Dynamic, but uses one of the arguments for
+            the result.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.DynamicProxyMetaObject`1.CallMethodNoResult(System.String,System.Dynamic.DynamicMetaObjectBinder,System.Linq.Expressions.Expression[],Newtonsoft.Json.Utilities.DynamicProxyMetaObject{`0}.Fallback)">
+            <summary>
+            Helper method for generating a MetaObject which calls a
+            specific method on Dynamic, but uses one of the arguments for
+            the result.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.DynamicProxyMetaObject`1.GetRestrictions">
+            <summary>
+            Returns a Restrictions object which includes our current restrictions merged
+            with a restriction limiting our type
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Serialization.ObjectConstructor`1">
+            <summary>
+            Represents a method that constructs an object.
+            </summary>
+            <typeparam name="T">The object type to create.</typeparam>
+        </member>
+        <member name="T:Newtonsoft.Json.TypeNameHandling">
+            <summary>
+            Specifies type name handling options for the <see cref="T:Newtonsoft.Json.JsonSerializer"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.TypeNameHandling.None">
+            <summary>
+            Do not include the .NET type name when serializing types.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.TypeNameHandling.Objects">
+            <summary>
+            Include the .NET type name when serializing into a JSON object structure.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.TypeNameHandling.Arrays">
+            <summary>
+            Include the .NET type name when serializing into a JSON array structure.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.TypeNameHandling.All">
+            <summary>
+            Always include the .NET type name when serializing.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.TypeNameHandling.Auto">
+            <summary>
+            Include the .NET type name when the type of the object being serialized is not the same as its declared type.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.ConvertUtils.Convert(System.Object,System.Globalization.CultureInfo,System.Type)">
+            <summary>
+            Converts the value to the specified type.
+            </summary>
+            <param name="initialValue">The value to convert.</param>
+            <param name="culture">The culture to use when converting.</param>
+            <param name="targetType">The type to convert the value to.</param>
+            <returns>The converted type.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.ConvertUtils.TryConvert(System.Object,System.Globalization.CultureInfo,System.Type,System.Object@)">
+            <summary>
+            Converts the value to the specified type.
+            </summary>
+            <param name="initialValue">The value to convert.</param>
+            <param name="culture">The culture to use when converting.</param>
+            <param name="targetType">The type to convert the value to.</param>
+            <param name="convertedValue">The converted value if the conversion was successful or the default value of <c>T</c> if it failed.</param>
+            <returns>
+            	<c>true</c> if <c>initialValue</c> was converted successfully; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.ConvertUtils.ConvertOrCast(System.Object,System.Globalization.CultureInfo,System.Type)">
+            <summary>
+            Converts the value to the specified type. If the value is unable to be converted, the
+            value is checked whether it assignable to the specified type.
+            </summary>
+            <param name="initialValue">The value to convert.</param>
+            <param name="culture">The culture to use when converting.</param>
+            <param name="targetType">The type to convert or cast the value to.</param>
+            <returns>
+            The converted type. If conversion was unsuccessful, the initial value
+            is returned if assignable to the target type.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.EnumUtils.GetNamesAndValues``1">
+            <summary>
+            Gets a dictionary of the names and values of an Enum type.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.EnumUtils.GetNamesAndValues``1(System.Type)">
+            <summary>
+            Gets a dictionary of the names and values of an Enum type.
+            </summary>
+            <param name="enumType">The enum type to get names and values for.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Newtonsoft.Json.JsonToken">
+            <summary>
+            Specifies the type of Json token.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.None">
+            <summary>
+            This is returned by the <see cref="T:Newtonsoft.Json.JsonReader"/> if a <see cref="M:Newtonsoft.Json.JsonReader.Read"/> method has not been called. 
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.StartObject">
+            <summary>
+            An object start token.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.StartArray">
+            <summary>
+            An array start token.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.StartConstructor">
+            <summary>
+            A constructor start token.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.PropertyName">
+            <summary>
+            An object property name.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.Comment">
+            <summary>
+            A comment.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.Raw">
+            <summary>
+            Raw JSON.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.Integer">
+            <summary>
+            An integer.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.Float">
+            <summary>
+            A float.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.String">
+            <summary>
+            A string.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.Boolean">
+            <summary>
+            A boolean.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.Null">
+            <summary>
+            A null token.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.Undefined">
+            <summary>
+            An undefined token.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.EndObject">
+            <summary>
+            An object end token.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.EndArray">
+            <summary>
+            An array end token.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.EndConstructor">
+            <summary>
+            A constructor end token.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.Date">
+            <summary>
+            A Date.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.JsonToken.Bytes">
+            <summary>
+            Byte data.
+            </summary>
+        </member>
+        <member name="T:Newtonsoft.Json.Utilities.StringBuffer">
+            <summary>
+            Builds a string. Unlike StringBuilder this class lets you reuse it's internal buffer.
+            </summary>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.CollectionUtils.IsNullOrEmpty``1(System.Collections.Generic.ICollection{``0})">
+            <summary>
+            Determines whether the collection is null or empty.
+            </summary>
+            <param name="collection">The collection.</param>
+            <returns>
+            	<c>true</c> if the collection is null or empty; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.CollectionUtils.AddRange``1(System.Collections.Generic.IList{``0},System.Collections.Generic.IEnumerable{``0})">
+            <summary>
+            Adds the elements of the specified collection to the specified generic IList.
+            </summary>
+            <param name="initial">The list to add to.</param>
+            <param name="collection">The collection of elements to add.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.CollectionUtils.IndexOf``1(System.Collections.Generic.IEnumerable{``0},``0,System.Collections.Generic.IEqualityComparer{``0})">
+            <summary>
+            Returns the index of the first occurrence in a sequence by using a specified IEqualityComparer.
+            </summary>
+            <typeparam name="TSource">The type of the elements of source.</typeparam>
+            <param name="list">A sequence in which to locate a value.</param>
+            <param name="value">The object to locate in the sequence</param>
+            <param name="comparer">An equality comparer to compare values.</param>
+            <returns>The zero-based index of the first occurrence of value within the entire sequence, if found; otherwise, –1.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.ReflectionUtils.GetCollectionItemType(System.Type)">
+            <summary>
+            Gets the type of the typed collection's items.
+            </summary>
+            <param name="type">The type.</param>
+            <returns>The type of the typed collection's items.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.ReflectionUtils.GetMemberUnderlyingType(System.Reflection.MemberInfo)">
+            <summary>
+            Gets the member's underlying type.
+            </summary>
+            <param name="member">The member.</param>
+            <returns>The underlying type of the member.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.ReflectionUtils.IsIndexedProperty(System.Reflection.MemberInfo)">
+            <summary>
+            Determines whether the member is an indexed property.
+            </summary>
+            <param name="member">The member.</param>
+            <returns>
+            	<c>true</c> if the member is an indexed property; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.ReflectionUtils.IsIndexedProperty(System.Reflection.PropertyInfo)">
+            <summary>
+            Determines whether the property is an indexed property.
+            </summary>
+            <param name="property">The property.</param>
+            <returns>
+            	<c>true</c> if the property is an indexed property; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.ReflectionUtils.GetMemberValue(System.Reflection.MemberInfo,System.Object)">
+            <summary>
+            Gets the member's value on the object.
+            </summary>
+            <param name="member">The member.</param>
+            <param name="target">The target object.</param>
+            <returns>The member's value on the object.</returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.ReflectionUtils.SetMemberValue(System.Reflection.MemberInfo,System.Object,System.Object)">
+            <summary>
+            Sets the member's value on the target object.
+            </summary>
+            <param name="member">The member.</param>
+            <param name="target">The target.</param>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.ReflectionUtils.CanReadMemberValue(System.Reflection.MemberInfo,System.Boolean)">
+            <summary>
+            Determines whether the specified MemberInfo can be read.
+            </summary>
+            <param name="member">The MemberInfo to determine whether can be read.</param>
+            /// <param name="nonPublic">if set to <c>true</c> then allow the member to be gotten non-publicly.</param>
+            <returns>
+            	<c>true</c> if the specified MemberInfo can be read; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.ReflectionUtils.CanSetMemberValue(System.Reflection.MemberInfo,System.Boolean,System.Boolean)">
+            <summary>
+            Determines whether the specified MemberInfo can be set.
+            </summary>
+            <param name="member">The MemberInfo to determine whether can be set.</param>
+            <param name="nonPublic">if set to <c>true</c> then allow the member to be set non-publicly.</param>
+            <param name="canSetReadOnly">if set to <c>true</c> then allow the member to be set if read-only.</param>
+            <returns>
+            	<c>true</c> if the specified MemberInfo can be set; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.StringUtils.IsWhiteSpace(System.String)">
+            <summary>
+            Determines whether the string is all white space. Empty string will return false.
+            </summary>
+            <param name="s">The string to test whether it is all white space.</param>
+            <returns>
+            	<c>true</c> if the string is all white space; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Newtonsoft.Json.Utilities.StringUtils.NullEmptyString(System.String)">
+            <summary>
+            Nulls an empty string.
+            </summary>
+            <param name="s">The string.</param>
+            <returns>Null if the string was null, otherwise the string unchanged.</returns>
+        </member>
+        <member name="T:Newtonsoft.Json.WriteState">
+            <summary>
+            Specifies the state of the <see cref="T:Newtonsoft.Json.JsonWriter"/>.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.WriteState.Error">
+            <summary>
+            An exception has been thrown, which has left the <see cref="T:Newtonsoft.Json.JsonWriter"/> in an invalid state.
+            You may call the <see cref="M:Newtonsoft.Json.JsonWriter.Close"/> method to put the <see cref="T:Newtonsoft.Json.JsonWriter"/> in the <c>Closed</c> state.
+            Any other <see cref="T:Newtonsoft.Json.JsonWriter"/> method calls results in an <see cref="T:System.InvalidOperationException"/> being thrown. 
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.WriteState.Closed">
+            <summary>
+            The <see cref="M:Newtonsoft.Json.JsonWriter.Close"/> method has been called. 
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.WriteState.Object">
+            <summary>
+            An object is being written. 
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.WriteState.Array">
+            <summary>
+            A array is being written.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.WriteState.Constructor">
+            <summary>
+            A constructor is being written.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.WriteState.Property">
+            <summary>
+            A property is being written.
+            </summary>
+        </member>
+        <member name="F:Newtonsoft.Json.WriteState.Start">
+            <summary>
+            A write method has not been called.
+            </summary>
+        </member>
+    </members>
+</doc>
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/README.md b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/README.md
new file mode 100644
index 0000000..b7c7ddd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/README.md
@@ -0,0 +1,141 @@
+UEditor ASP.NET 后台使用说明
+=====
+
+## 背景
+
+UEditor 在 1.4 版本之后进行了一次[前后端统一配置](../_doc/3.1 后端请求规范.md)的整理,.Net 的后台也进行了一次重写,跟之前的版本差别较大,升级的用户注意阅读本文档。
+
+本文档介绍 UEditor ASP.NET 后台的部署、配置、源码说明。
+
+
+## 1. 部署说明
+
+### 1.1. 安装并注册 .NET Framework 4.0
+
+代码的运行时环境是 .NET Framework 4.0,首先要确认 IIS 已经安装了 .NET 4.0 的运行时框架。方法是打开「IIS 管理器」,选择根目录下的「应用程序池」,在右侧查看是否有一个应用程序池的版本是 v4.0,如果存在,则 IIS 已经安装了所需的运行时环境,此时读者可以跳过本节。
+
+![检查 .NET 4.0 安装情况](../_doc/images/net-publish-1.png)
+
+如果没有找到对应的应用程序池,需要手动安装。
+
+Windows 7 和 Windows Server 2008 R2 默认安装了 .Net Framework 4.0,如果是 Server 03 和老掉牙的 Windows XP,则需要手动安装 [.NET Framework 4.0](http://www.microsoft.com/zh-cn/download/details.aspx?id=17718)。
+
+安装完 .NET Framework 4.0 后,还需要向 IIS 注册应用程序池,注册的方法是,使用**管理员权限**打开命令提示符(CMD),输入以下命令:
+
+```shell
+C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis -i
+```
+
+安装完毕后,在 IIS 管理器刷新就能看到 4.0 的应用程序池。
+
+### 1.2. 设置 .NET 应用程序
+
+代码要求以应用程序的形式来运行(可以方便加入库依赖和组织代码)。需要把 `net` 目录转换为应用程序。
+
+1. 在 IIS 中,展开到 `ueditor/net` 目录,在目录上右击,点击「转换为应用程序」。
+
+   ![转换为应用程序](../_doc/images/net-publish-2.png)
+
+2. 弹出的对话框中,点击「选择...」来指定使用的应用程序池。选择版本为 4.0 的应用程序池,然后点确定。
+
+   ![选择应用程序池](../_doc/images/net-publish-3.png)
+
+3. 设置连接凭据。点击「链接为...」按钮,在弹出的对话框中指定一个对目录具有读写权限的用户(如 administrator),然后点确定。
+
+   ![设置连接凭据](../_doc/images/net-publish-4.png)
+
+   设置完毕后,可以点击「测试设置...」来测试权限是否正常。
+
+   ![设置连接凭据](../_doc/images/net-publish-5.png)
+
+### 1.3. 运行测试
+
+在浏览器中运行 `net/controller.ashx`,如果返回 "`{"state":"action 参数为空或者 action 不被支持。"}`",则表示应用程序运行成功。
+
+如果你确认上述步骤已经执行,但是依然有问题,请给我们[提 Issue](https://github.com/fex-team/ueditor/issues/new?labels=NET%E5%90%8E%E5%8F%B0),我们会尽快答复解决。
+
+## 2. 配置说明
+
+前后端配置统一之后,配置文件由后台读取,返回给前端。但是部分配置是给后台使用的。
+
+### 2.1. 上传配置说明
+
+关于上传的部分,后台需要关心以下模板的配置项。
+
+```json
+{
+    "{tpl}FieldName": "upfile",
+    "{tpl}PathFormat": "upload/{tpl}/{yyyy}{mm}{dd}/{time}{rand:6}",
+    "{tpl}UrlPrefix": "/ueditor/net/",
+    "{tpl}AllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"],
+    "{tpl}MaxSize": 2048000
+}
+```
+
+"{tpl}FieldName" 表示提交的表单的文件域名称。
+
+"{tpl}PathFormat" 表示上传文件保存的路径和名称。注意,这里的路径是相对应用程序的,如果需要修改的话,请自行修改源码。
+
+"{tpl}UrlPrefix" 表示上传文件访问的 URL 前缀。注意,这里应该给出应用程序的 URL 路径,否则上传的文件不能正确定位。
+
+> 举个例子,如果你的 UEditor 的位置在 `http://www.mydomain.com/myapp/ueditor`,对应的本地路径是 `C:\iis_pub\www\myapp\ueditor`,那么 .NET 应用程序的位置在 `http://www.mydomain.com/myapp/ueditor/net`,对应的本地路径是 `C:\iis_pub\www\myapp\ueditor\net`。图片上传配置项应该如下:
+> 
+> { 
+>    "imagePathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}",
+>    "imageUrlPrefix": "/myapp/ueditor/net/",
+> }
+>
+> 上传的文件会保存在 `C:\iis_pub\www\myapp\ueditor\net\upload\image\{日期}\{文件名}`
+
+"{tpl}AllowFiles" 限制文件上传的类型,注意要有 "."。
+
+"{tpl}MaxSize" 限制文件上传的大小。注意这里的限制是代码上的判断,应用程序本身还有一个请求报文大小限制。该限制在 web.config 文件中修改,注意要有以下的节:
+
+```xml
+<configuration>
+  <system.web>
+    <httpRuntime requestValidationMode="2.0" maxRequestLength="102400" />
+  </system.web>
+</configuration>
+```
+
+maxRequestLength 就是请求报文大小限制,该大小应该要比设置的所有上传大小都大,否则应用程序执行之前,请求会被被拒绝。
+
+## 3. 源码说明
+
+可以看到 net 目录内的源码结构是这样的:
+
+```
+net
+    App_Code
+        Config.cs
+        Handler.cs
+        PathFormatter.cs
+        *Handler.cs
+    Bin
+        Newtonsoft.Json.dll
+    config.json
+    controller.ashx
+    net.sln
+    README.md
+    Web.config
+```
+
+App_Code 上的文件是应用程序的源码。
+
+- Config.cs 负责读取配置文件
+- Handler.cs 是请求处理器的基类,提供了一些基本对象的访问以及输出控制。如果需要增加处理器,应该从该基类继承
+- PathFormatter.cs 解析 PathFormat,把信息填充为运行时信息。
+- *Handler.cs 是各种处理器,处理各种 UEditor 需要的请求。
+
+Bin 里面的是应用程序的依赖库,当前依赖 Newtonsoft 的 Json 库。Bin 目录和 App_Code 目录受应用程序保护,不用担心被用户访问到。
+
+config.json 是 UEditor 后端的配置文件,上一节已经介绍了比较重要的配置项。
+
+controller.ashx 是 UEditor 请求的入口,它把不同的 action 分发到不同的 Handler 来处理。
+
+net.sln 是项目的解决方案文件,安装 Visual Studio 2013 或以上的机器可以打开进行项目的改造。
+
+README.md 是本说明文件。
+
+Web.config 是应用程序的配置文件。
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Web.config b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Web.config
new file mode 100644
index 0000000..992ee52
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/Web.config
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+  <system.web>
+    <compilation debug="true" targetFramework="4.0" />
+    <httpRuntime requestValidationMode="2.0" maxRequestLength="102400 " />
+    <pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"></pages>
+    <globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-CN" />
+  </system.web>
+</configuration>
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/config.json b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/config.json
new file mode 100644
index 0000000..55d948f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/config.json
@@ -0,0 +1,94 @@
+/* 前后端通信相关的配置,注释只允许使用多行方式 */
+{
+    /* 上传图片配置项 */
+    "imageActionName": "uploadimage", /* 执行上传图片的action名称 */
+    "imageFieldName": "upfile", /* 提交的图片表单名称 */
+    "imageMaxSize": 2048000, /* 上传大小限制,单位B */
+    "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */
+    "imageCompressEnable": true, /* 是否压缩图片,默认是true */
+    "imageCompressBorder": 1600, /* 图片压缩最长边限制 */
+    "imageInsertAlign": "none", /* 插入的图片浮动方式 */
+    "imageUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */
+    "imagePathFormat": "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": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */
+    "scrawlUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */
+    "scrawlInsertAlign": "none",
+
+    /* 截图工具上传 */
+    "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */
+    "snapscreenPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "snapscreenUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */
+    "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */
+
+    /* 抓取远程图片配置 */
+    "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"],
+    "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */
+    "catcherFieldName": "source", /* 提交的图片列表表单名称 */
+    "catcherPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "catcherUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */
+    "catcherMaxSize": 2048000, /* 上传大小限制,单位B */
+    "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */
+
+    /* 上传视频配置 */
+    "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */
+    "videoFieldName": "upfile", /* 提交的视频表单名称 */
+    "videoPathFormat": "upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "videoUrlPrefix": "/ueditor/net/", /* 视频访问路径前缀 */
+    "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": "upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "fileUrlPrefix": "/ueditor/net/", /* 文件访问路径前缀 */
+    "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"
+    ], /* 上传文件格式显示 */
+
+    /* 列出指定目录下的图片 */
+    "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */
+    "imageManagerListPath": "upload/image", /* 指定要列出图片的目录 */
+    "imageManagerListSize": 20, /* 每次列出文件数量 */
+    "imageManagerUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */
+    "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */
+    "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */
+
+    /* 列出指定目录下的文件 */
+    "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */
+    "fileManagerListPath": "upload/file", /* 指定要列出文件的目录 */
+    "fileManagerUrlPrefix": "/ueditor/net/", /* 文件访问路径前缀 */
+    "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"
+    ] /* 列出的文件类型 */
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/controller.ashx b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/controller.ashx
new file mode 100644
index 0000000..320714e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/controller.ashx
@@ -0,0 +1,80 @@
+<%@ WebHandler Language="C#" Class="UEditorHandler" %>
+
+using System;
+using System.Web;
+using System.IO;
+using System.Collections;
+using Newtonsoft.Json;
+
+public class UEditorHandler : IHttpHandler
+{
+    public void ProcessRequest(HttpContext context)
+    {
+        Handler action = null;
+        switch (context.Request["action"])
+        {
+            case "config":
+                action = new ConfigHandler(context);
+                break;
+            case "uploadimage":
+                action = new UploadHandler(context, new UploadConfig()
+                {
+                    AllowExtensions = Config.GetStringList("imageAllowFiles"),
+                    PathFormat = Config.GetString("imagePathFormat"),
+                    SizeLimit = Config.GetInt("imageMaxSize"),
+                    UploadFieldName = Config.GetString("imageFieldName")
+                });
+                break;
+            case "uploadscrawl":
+                action = new UploadHandler(context, new UploadConfig()
+                {
+                    AllowExtensions = new string[] { ".png" },
+                    PathFormat = Config.GetString("scrawlPathFormat"),
+                    SizeLimit = Config.GetInt("scrawlMaxSize"),
+                    UploadFieldName = Config.GetString("scrawlFieldName"),
+                    Base64 = true,
+                    Base64Filename = "scrawl.png"
+                });
+                break;
+            case "uploadvideo":
+                action = new UploadHandler(context, new UploadConfig()
+                {
+                    AllowExtensions = Config.GetStringList("videoAllowFiles"),
+                    PathFormat = Config.GetString("videoPathFormat"),
+                    SizeLimit = Config.GetInt("videoMaxSize"),
+                    UploadFieldName = Config.GetString("videoFieldName")
+                });
+                break;
+            case "uploadfile":
+                action = new UploadHandler(context, new UploadConfig()
+                {
+                    AllowExtensions = Config.GetStringList("fileAllowFiles"),
+                    PathFormat = Config.GetString("filePathFormat"),
+                    SizeLimit = Config.GetInt("fileMaxSize"),
+                    UploadFieldName = Config.GetString("fileFieldName")
+                });
+                break;
+            case "listimage":
+                action = new ListFileManager(context, Config.GetString("imageManagerListPath"), Config.GetStringList("imageManagerAllowFiles"));
+                break;
+            case "listfile":
+                action = new ListFileManager(context, Config.GetString("fileManagerListPath"), Config.GetStringList("fileManagerAllowFiles"));
+                break;
+            case "catchimage":
+                action = new CrawlerHandler(context);
+                break;
+            default:
+                action = new NotSupportedHandler(context);
+                break;
+        }
+        action.Process();
+    }
+
+    public bool IsReusable
+    {
+        get
+        {
+            return false;
+        }
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/net.sln b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/net.sln
new file mode 100644
index 0000000..280d399
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/net/net.sln
@@ -0,0 +1,38 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.21005.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "net", "http://localhost:7957", "{36F65A7F-64E7-4E05-BBC2-EAB6E4EDAF30}"
+	ProjectSection(WebsiteProperties) = preProject
+		UseIISExpress = "true"
+		TargetFrameworkMoniker = ".NETFramework,Version%3Dv4.0"
+		Debug.AspNetCompiler.VirtualPath = "/localhost_7957"
+		Debug.AspNetCompiler.PhysicalPath = "..\..\..\..\prj\ueditor\net\"
+		Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\localhost_7957\"
+		Debug.AspNetCompiler.Updateable = "true"
+		Debug.AspNetCompiler.ForceOverwrite = "true"
+		Debug.AspNetCompiler.FixedNames = "false"
+		Debug.AspNetCompiler.Debug = "True"
+		Release.AspNetCompiler.VirtualPath = "/localhost_7957"
+		Release.AspNetCompiler.PhysicalPath = "..\..\..\..\prj\ueditor\net\"
+		Release.AspNetCompiler.TargetPath = "PrecompiledWeb\localhost_7957\"
+		Release.AspNetCompiler.Updateable = "true"
+		Release.AspNetCompiler.ForceOverwrite = "true"
+		Release.AspNetCompiler.FixedNames = "false"
+		Release.AspNetCompiler.Debug = "False"
+		SlnRelativePath = "..\..\..\..\prj\ueditor\net\"
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{36F65A7F-64E7-4E05-BBC2-EAB6E4EDAF30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{36F65A7F-64E7-4E05-BBC2-EAB6E4EDAF30}.Debug|Any CPU.Build.0 = Debug|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/Uploader.class.php b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/Uploader.class.php
new file mode 100644
index 0000000..092ef27
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/Uploader.class.php
@@ -0,0 +1,349 @@
+<?php
+
+/**
+ * Created by JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-7-18
+ * Time: 上午11: 32
+ * UEditor编辑器通用上传类
+ */
+class Uploader
+{
+    private $fileField; //文件域名
+    private $file; //文件上传对象
+    private $base64; //文件上传对象
+    private $config; //配置信息
+    private $oriName; //原始文件名
+    private $fileName; //新文件名
+    private $fullName; //完整文件名,即从当前配置目录开始的URL
+    private $filePath; //完整文件名,即从当前配置目录开始的URL
+    private $fileSize; //文件大小
+    private $fileType; //文件类型
+    private $stateInfo; //上传状态信息,
+    private $stateMap = array( //上传状态映射表,国际化用户需考虑此处数据的国际化
+        "SUCCESS", //上传成功标记,在UEditor中内不可改变,否则flash判断会出错
+        "文件大小超出 upload_max_filesize 限制",
+        "文件大小超出 MAX_FILE_SIZE 限制",
+        "文件未被完整上传",
+        "没有文件被上传",
+        "上传文件为空",
+        "ERROR_TMP_FILE" => "临时文件错误",
+        "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不正确"
+    );
+
+    /**
+     * 构造函数
+     * @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 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;
+        }
+
+        //创建目录失败
+        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];
+        }
+    }
+
+    /**
+     * 处理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 saveRemote()
+    {
+        $imgUrl = htmlspecialchars($this->fileField);
+        $imgUrl = str_replace("&amp;", "&", $imgUrl);
+
+        //http开头验证
+        if (strpos($imgUrl, "http") !== 0) {
+            $this->stateInfo = $this->getStateInfo("ERROR_HTTP_LINK");
+            return;
+        }
+        //获取请求头并检测死链
+        $heads = get_headers($imgUrl);
+        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']) || 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 getFileName () {
+        return substr($this->filePath, strrpos($this->filePath, '/') + 1);
+    }
+
+    /**
+     * 获取文件完整路径
+     * @return string
+     */
+    private function getFilePath()
+    {
+        $fullname = $this->fullName;
+        $rootPath = $_SERVER['DOCUMENT_ROOT'];
+
+        if (substr($fullname, 0, 1) != '/') {
+            $fullname = '/' . $fullname;
+        }
+
+        return $rootPath . $fullname;
+    }
+
+    /**
+     * 文件类型检测
+     * @return bool
+     */
+    private function checkType()
+    {
+        return in_array($this->getFileExt(), $this->config["allowFiles"]);
+    }
+
+    /**
+     * 文件大小检测
+     * @return bool
+     */
+    private function  checkSize()
+    {
+        return $this->fileSize <= ($this->config["maxSize"]);
+    }
+
+    /**
+     * 获取当前上传成功文件的各项信息
+     * @return array
+     */
+    public function getFileInfo()
+    {
+        return array(
+            "state" => $this->stateInfo,
+            "url" => $this->fullName,
+            "title" => $this->fileName,
+            "original" => $this->oriName,
+            "type" => $this->fileType,
+            "size" => $this->fileSize
+        );
+    }
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_crawler.php b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_crawler.php
new file mode 100644
index 0000000..b9e18df
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_crawler.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * 抓取远程图片
+ * User: Jinqn
+ * Date: 14-04-14
+ * Time: 下午19:18
+ */
+set_time_limit(0);
+include("Uploader.class.php");
+
+/* 上传配置 */
+$config = array(
+    "pathFormat" => $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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_list.php b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_list.php
new file mode 100644
index 0000000..bf9cd62
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_list.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * 获取已上传的文件列表
+ * User: Jinqn
+ * Date: 14-04-09
+ * Time: 上午10:17
+ */
+include "Uploader.class.php";
+
+/* 判断类型 */
+switch ($_GET['action']) {
+    /* 列出文件 */
+    case 'listfile':
+        $allowFiles = $CONFIG['fileManagerAllowFiles'];
+        $listSize = $CONFIG['fileManagerListSize'];
+        $path = $CONFIG['fileManagerListPath'];
+        break;
+    /* 列出图片 */
+    case 'listimage':
+    default:
+        $allowFiles = $CONFIG['imageManagerAllowFiles'];
+        $listSize = $CONFIG['imageManagerListSize'];
+        $path = $CONFIG['imageManagerListPath'];
+}
+$allowFiles = substr(str_replace(".", "|", join("", $allowFiles)), 1);
+
+/* 获取参数 */
+$size = isset($_GET['size']) ? htmlspecialchars($_GET['size']) : $listSize;
+$start = isset($_GET['start']) ? htmlspecialchars($_GET['start']) : 0;
+$end = $start + $size;
+
+/* 获取文件列表 */
+$path = $_SERVER['DOCUMENT_ROOT'] . (substr($path, 0, 1) == "/" ? "":"/") . $path;
+$files = getfiles($path, $allowFiles);
+if (!count($files)) {
+    return json_encode(array(
+        "state" => "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)
+));
+
+return $result;
+
+
+/**
+ * 遍历获取目录下的指定类型的文件
+ * @param $path
+ * @param array $files
+ * @return array
+ */
+function getfiles($path, $allowFiles, &$files = array())
+{
+    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)) {
+                    $files[] = array(
+                        'url'=> substr($path2, strlen($_SERVER['DOCUMENT_ROOT'])),
+                        'mtime'=> filemtime($path2)
+                    );
+                }
+            }
+        }
+    }
+    return $files;
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_upload.php b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_upload.php
new file mode 100644
index 0000000..d55b659
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/action_upload.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * 上传附件和上传视频
+ * User: Jinqn
+ * Date: 14-04-09
+ * Time: 上午10:17
+ */
+include "Uploader.class.php";
+
+/* 上传配置 */
+$base64 = "upload";
+switch (htmlspecialchars($_GET['action'])) {
+    case 'uploadimage':
+        $config = array(
+            "pathFormat" => $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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/config.json b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/config.json
new file mode 100644
index 0000000..dd5bc17
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/config.json
@@ -0,0 +1,94 @@
+/* 前后端通信相关的配置,注释只允许使用多行方式 */
+{
+    /* 上传图片配置项 */
+    "imageActionName": "uploadimage", /* 执行上传图片的action名称 */
+    "imageFieldName": "upfile", /* 提交的图片表单名称 */
+    "imageMaxSize": 2048000, /* 上传大小限制,单位B */
+    "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */
+    "imageCompressEnable": true, /* 是否压缩图片,默认是true */
+    "imageCompressBorder": 1600, /* 图片压缩最长边限制 */
+    "imageInsertAlign": "none", /* 插入的图片浮动方式 */
+    "imageUrlPrefix": "", /* 图片访问路径前缀 */
+    "imagePathFormat": "/ueditor/php/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": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */
+    "scrawlUrlPrefix": "", /* 图片访问路径前缀 */
+    "scrawlInsertAlign": "none",
+
+    /* 截图工具上传 */
+    "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */
+    "snapscreenPathFormat": "/ueditor/php/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": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "catcherUrlPrefix": "", /* 图片访问路径前缀 */
+    "catcherMaxSize": 2048000, /* 上传大小限制,单位B */
+    "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */
+
+    /* 上传视频配置 */
+    "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */
+    "videoFieldName": "upfile", /* 提交的视频表单名称 */
+    "videoPathFormat": "/ueditor/php/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": "/ueditor/php/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"
+    ], /* 上传文件格式显示 */
+
+    /* 列出指定目录下的图片 */
+    "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */
+    "imageManagerListPath": "/ueditor/php/upload/image/", /* 指定要列出图片的目录 */
+    "imageManagerListSize": 20, /* 每次列出文件数量 */
+    "imageManagerUrlPrefix": "", /* 图片访问路径前缀 */
+    "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */
+    "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */
+
+    /* 列出指定目录下的文件 */
+    "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */
+    "fileManagerListPath": "/ueditor/php/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"
+    ] /* 列出的文件类型 */
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/controller.php b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/controller.php
new file mode 100644
index 0000000..d498117
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/php/controller.php
@@ -0,0 +1,59 @@
+<?php
+//header('Access-Control-Allow-Origin: http://www.baidu.com'); //设置http://www.baidu.com允许跨域访问
+//header('Access-Control-Allow-Headers: X-Requested-With,X_Requested_With'); //设置允许的跨域header
+date_default_timezone_set("Asia/Chongqing");
+error_reporting(E_ERROR);
+header("Content-Type: text/html; charset=utf-8");
+
+$CONFIG = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents("config.json")), true);
+$action = $_GET['action'];
+
+switch ($action) {
+    case 'config':
+        $result =  json_encode($CONFIG);
+        break;
+
+    /* 上传图片 */
+    case 'uploadimage':
+    /* 上传涂鸦 */
+    case 'uploadscrawl':
+    /* 上传视频 */
+    case 'uploadvideo':
+    /* 上传文件 */
+    case 'uploadfile':
+        $result = include("action_upload.php");
+        break;
+
+    /* 列出图片 */
+    case 'listimage':
+        $result = include("action_list.php");
+        break;
+    /* 列出文件 */
+    case 'listfile':
+        $result = include("action_list.php");
+        break;
+
+    /* 抓取远程文件 */
+    case 'catchimage':
+        $result = include("action_crawler.php");
+        break;
+
+    default:
+        $result = json_encode(array(
+            'state'=> '请求地址出错'
+        ));
+        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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/css/ueditor.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/css/ueditor.css
new file mode 100644
index 0000000..44ae805
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/css/ueditor.css
@@ -0,0 +1,1903 @@
+/*基础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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/css/ueditor.min.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/css/ueditor.min.css
new file mode 100644
index 0000000..a9c7209
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/css/ueditor.min.css
@@ -0,0 +1,8 @@
+/*!
+ * UEditor
+ * version: ueditor
+ * build: Thu May 29 2014 16:47:49 GMT+0800 (中国标准时间)
+ */
+
+
+.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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/dialogbase.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/dialogbase.css
new file mode 100644
index 0000000..cd663d5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/anchor.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/anchor.gif
new file mode 100644
index 0000000..5aa797b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/anchor.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow.png
new file mode 100644
index 0000000..d900886
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow_down.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow_down.png
new file mode 100644
index 0000000..e9257e8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow_down.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow_up.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow_up.png
new file mode 100644
index 0000000..74277af
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/arrow_up.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/button-bg.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/button-bg.gif
new file mode 100644
index 0000000..ec7fa2e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/button-bg.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cancelbutton.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cancelbutton.gif
new file mode 100644
index 0000000..df4bc2c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cancelbutton.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/charts.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/charts.png
new file mode 100644
index 0000000..713965c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/charts.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_h.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_h.gif
new file mode 100644
index 0000000..d7c3e7e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_h.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_h.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_h.png
new file mode 100644
index 0000000..2088fc2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_h.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_v.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_v.gif
new file mode 100644
index 0000000..bb508db
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_v.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_v.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_v.png
new file mode 100644
index 0000000..6f39ca3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/cursor_v.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/dialog-title-bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/dialog-title-bg.png
new file mode 100644
index 0000000..f744f26
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/dialog-title-bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/filescan.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/filescan.png
new file mode 100644
index 0000000..1d27158
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/filescan.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/highlighted.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/highlighted.gif
new file mode 100644
index 0000000..9272b49
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/highlighted.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons-all.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons-all.gif
new file mode 100644
index 0000000..21915e5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons-all.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons.gif
new file mode 100644
index 0000000..7abd30a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons.png
new file mode 100644
index 0000000..c015e3a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/loaderror.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/loaderror.png
new file mode 100644
index 0000000..35ff333
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/loaderror.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/loading.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/loading.gif
new file mode 100644
index 0000000..b713e27
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/loading.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/lock.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/lock.gif
new file mode 100644
index 0000000..b4e6d78
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/lock.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/neweditor-tab-bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/neweditor-tab-bg.png
new file mode 100644
index 0000000..8f398b0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/neweditor-tab-bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/pagebreak.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/pagebreak.gif
new file mode 100644
index 0000000..8d1cffd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/pagebreak.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/scale.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/scale.png
new file mode 100644
index 0000000..f45adb5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/scale.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/sortable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/sortable.png
new file mode 100644
index 0000000..1bca649
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/sortable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/spacer.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/spacer.gif
new file mode 100644
index 0000000..5bfd67a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/spacer.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/sparator_v.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/sparator_v.png
new file mode 100644
index 0000000..8cf5662
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/sparator_v.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/table-cell-align.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/table-cell-align.png
new file mode 100644
index 0000000..ddf4285
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/table-cell-align.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/tangram-colorpicker.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/tangram-colorpicker.png
new file mode 100644
index 0000000..738e500
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/tangram-colorpicker.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/toolbar_bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/toolbar_bg.png
new file mode 100644
index 0000000..7ab685f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/toolbar_bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/unhighlighted.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/unhighlighted.gif
new file mode 100644
index 0000000..7ad0b67
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/unhighlighted.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/upload.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/upload.png
new file mode 100644
index 0000000..08d4d92
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/upload.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/videologo.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/videologo.gif
new file mode 100644
index 0000000..555af74
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/videologo.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/word.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/word.gif
new file mode 100644
index 0000000..9ef5d09
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/word.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/wordpaste.png b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/wordpaste.png
new file mode 100644
index 0000000..9367758
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/default/images/wordpaste.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/iframe.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/iframe.css
new file mode 100644
index 0000000..774013a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/themes/iframe.css
@@ -0,0 +1 @@
+/*可以在这里添加你自己的css*/
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/SyntaxHighlighter/shCore.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/SyntaxHighlighter/shCore.js
new file mode 100644
index 0000000..3249184
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/SyntaxHighlighter/shCore.js
@@ -0,0 +1,3655 @@
+// XRegExp 1.5.1
+// (c) 2007-2012 Steven Levithan
+// MIT License
+// <http://xregexp.com>
+// 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: /<img\b([^>]+)>/i, backref: 1}, // <img> tag attributes
+    //     {regex: XRegExp('(?ix) \\s src=" (?<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): (?<name>
+    XRegExp.addToken(
+        /\(\?<([$\w]+)>/,
+        function (match) {
+            this.captureNames.push(match[1]);
+            this.hasNamedCapture = true;
+            return "(";
+        }
+    );
+
+    // Named backreference: \k<name>
+    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 : '&nbsp;',
+
+            /** Enables use of <SCRIPT type="syntaxhighlighter" /> tags. */
+            useScriptTags : true,
+
+            /** Blogger mode flag. */
+            bloggerMode : false,
+
+            stripBrs : false,
+
+            /** Name of the tag that SyntaxHighlighter will automatically look for. */
+            tagName : 'pre',
+
+            strings : {
+                expandSource : 'expand source',
+                help : '?',
+                alert: 'SyntaxHighlighter\n\n',
+                noBrush : 'Can\'t find brush for: ',
+                brushNotHtmlScript : 'Brush wasn\'t configured for html-script option: ',
+
+                // this is populated by the build script
+                aboutDialog : '@ABOUT@'
+            }
+        },
+
+        /** Internal 'global' variables. */
+        vars : {
+            discoveredBrushes : null,
+            highlighters : {}
+        },
+
+        /** This object is populated by user included external brush files. */
+        brushes : {},
+
+        /** Common regular expressions. */
+        regexLib : {
+            multiLineCComments			: /\/\*[\s\S]*?\*\//gm,
+            singleLineCComments			: /\/\/.*$/gm,
+            singleLinePerlComments		: /#.*$/gm,
+            doubleQuotedString			: /"([^\\"\n]|\\.)*"/g,
+            singleQuotedString			: /'([^\\'\n]|\\.)*'/g,
+            multiLineDoubleQuotedString	: new XRegExp('"([^\\\\"]|\\\\.)*"', 'gs'),
+            multiLineSingleQuotedString	: new XRegExp("'([^\\\\']|\\\\.)*'", 'gs'),
+            xmlComments					: /(&lt;|<)!--[\s\S]*?--(&gt;|>)/gm,
+            url							: /\w+:\/\/[\w-.\/?%&=:@;#]*/g,
+
+            /** <?= ?> tags. */
+            phpScriptTags 				: { left: /(&lt;|<)\?(?:=|php)?/g, right: /\?(&gt;|>)/g, 'eof' : true },
+
+            /** <%= %> tags. */
+            aspScriptTags				: { left: /(&lt;|<)%=?/g, right: /%(&gt;|>)/g },
+
+            /** <script> tags. */
+            scriptScriptTags			: { left: /(&lt;|<)\s*script.*?(&gt;|>)/gi, right: /(&lt;|<)\/\s*script\s*(&gt;|>)/gi }
+        },
+
+        toolbar: {
+            /**
+             * Generates HTML markup for the toolbar.
+             * @param {Highlighter} highlighter Highlighter instance.
+             * @return {String} Returns HTML markup.
+             */
+            getHtml: function(highlighter)
+            {
+                var html = '<div class="toolbar">',
+                    items = sh.toolbar.items,
+                    list = items.list
+                    ;
+
+                function defaultGetHtml(highlighter, name)
+                {
+                    return sh.toolbar.getButtonHtml(highlighter, name, sh.config.strings[name]);
+                };
+
+                for (var i = 0; i < list.length; i++)
+                    html += (items[list[i]].getHtml || defaultGetHtml)(highlighter, list[i]);
+
+                html += '</div>';
+
+                return html;
+            },
+
+            /**
+             * Generates HTML markup for a regular button in the toolbar.
+             * @param {Highlighter} highlighter Highlighter instance.
+             * @param {String} commandName		Command name that would be executed.
+             * @param {String} label			Label text to display.
+             * @return {String}					Returns HTML markup.
+             */
+            getButtonHtml: function(highlighter, commandName, label)
+            {
+                return '<span><a href="#" class="toolbar_item'
+                    + ' command_' + commandName
+                    + ' ' + commandName
+                    + '">' + label + '</a></span>'
+                    ;
+            },
+
+            /**
+             * Event handler for a toolbar anchor.
+             */
+            handler: function(e)
+            {
+                var target = e.target,
+                    className = target.className || ''
+                    ;
+
+                function getValue(name)
+                {
+                    var r = new RegExp(name + '_(\\w+)'),
+                        match = r.exec(className)
+                        ;
+
+                    return match ? match[1] : null;
+                };
+
+                var highlighter = getHighlighterById(findParentElement(target, '.syntaxhighlighter').id),
+                    commandName = getValue('command')
+                    ;
+
+                // execute the toolbar command
+                if (highlighter && commandName)
+                    sh.toolbar.items[commandName].execute(highlighter);
+
+                // disable default A click behaviour
+                e.preventDefault();
+            },
+
+            /** Collection of toolbar items. */
+            items : {
+                // Ordered lis of items in the toolbar. Can't expect `for (var n in items)` to be consistent.
+                list: ['expandSource', 'help'],
+
+                expandSource: {
+                    getHtml: function(highlighter)
+                    {
+                        if (highlighter.getParam('collapse') != true)
+                            return '';
+
+                        var title = highlighter.getParam('title');
+                        return sh.toolbar.getButtonHtml(highlighter, 'expandSource', title ? title : sh.config.strings.expandSource);
+                    },
+
+                    execute: function(highlighter)
+                    {
+                        var div = getHighlighterDivById(highlighter.id);
+                        removeClass(div, 'collapsed');
+                    }
+                },
+
+                /** Command to display the about dialog window. */
+                help: {
+                    execute: function(highlighter)
+                    {
+                        var wnd = popup('', '_blank', 500, 250, 'scrollbars=0'),
+                            doc = wnd.document
+                            ;
+
+                        doc.write(sh.config.strings.aboutDialog);
+                        doc.close();
+                        wnd.focus();
+                    }
+                }
+            }
+        },
+
+        /**
+         * Finds all elements on the page which should be processes by SyntaxHighlighter.
+         *
+         * @param {Object} globalParams		Optional parameters which override element's
+         * 									parameters. Only used if element is specified.
+         *
+         * @param {Object} element	Optional element to highlight. If none is
+         * 							provided, all elements in the current document
+         * 							are returned which qualify.
+         *
+         * @return {Array}	Returns list of <code>{ target: DOMElement, params: Object }</code> objects.
+         */
+        findElements: function(globalParams, element)
+        {
+            var elements = element ? [element] : toArray(document.getElementsByTagName(sh.config.tagName)),
+                conf = sh.config,
+                result = []
+                ;
+
+            // support for <SCRIPT TYPE="syntaxhighlighter" /> feature
+            if (conf.useScriptTags)
+                elements = elements.concat(getSyntaxHighlighterScriptTags());
+
+            if (elements.length === 0)
+                return result;
+
+            for (var i = 0; i < elements.length; i++)
+            {
+                var item = {
+                    target: elements[i],
+                    // local params take precedence over globals
+                    params: merge(globalParams, parseParams(elements[i].className))
+                };
+
+                if (item.params['brush'] == null)
+                    continue;
+
+                result.push(item);
+            }
+
+            return result;
+        },
+
+        /**
+         * Shorthand to highlight all elements on the page that are marked as
+         * SyntaxHighlighter source code.
+         *
+         * @param {Object} globalParams		Optional parameters which override element's
+         * 									parameters. Only used if element is specified.
+         *
+         * @param {Object} element	Optional element to highlight. If none is
+         * 							provided, all elements in the current document
+         * 							are highlighted.
+         */
+        highlight: function(globalParams, element)
+        {
+            var elements = this.findElements(globalParams, element),
+                propertyName = 'innerHTML',
+                highlighter = null,
+                conf = sh.config
+                ;
+
+            if (elements.length === 0)
+                return;
+
+            for (var i = 0; i < elements.length; i++)
+            {
+                var element = elements[i],
+                    target = element.target,
+                    params = element.params,
+                    brushName = params.brush,
+                    code
+                    ;
+
+                if (brushName == null)
+                    continue;
+
+                // Instantiate a brush
+                if (params['html-script'] == 'true' || sh.defaults['html-script'] == true)
+                {
+                    highlighter = new sh.HtmlScript(brushName);
+                    brushName = 'htmlscript';
+                }
+                else
+                {
+                    var brush = findBrush(brushName);
+
+                    if (brush)
+                        highlighter = new brush();
+                    else
+                        continue;
+                }
+
+                code = target[propertyName];
+
+                // remove CDATA from <SCRIPT/> tags if it's present
+                if (conf.useScriptTags)
+                    code = stripCData(code);
+
+                // Inject title if the attribute is present
+                if ((target.title || '') != '')
+                    params.title = target.title;
+
+                params['brush'] = brushName;
+                highlighter.init(params);
+                element = highlighter.getDiv(code);
+
+                // carry over ID
+                if ((target.id || '') != '')
+                    element.id = target.id;
+                //by zhanyi 去掉多余的外围div
+                var tmp = element.firstChild.firstChild;
+                tmp.className = element.firstChild.className;
+
+                target.parentNode.replaceChild(tmp, target);
+            }
+        },
+
+        /**
+         * Main entry point for the SyntaxHighlighter.
+         * @param {Object} params Optional params to apply to all highlighted elements.
+         */
+        all: function(params)
+        {
+            attachEvent(
+                window,
+                'load',
+                function() { sh.highlight(params); }
+            );
+        }
+    }; // end of sh
+
+    /**
+     * Checks if target DOM elements has specified CSS class.
+     * @param {DOMElement} target Target DOM element to check.
+     * @param {String} className Name of the CSS class to check for.
+     * @return {Boolean} Returns true if class name is present, false otherwise.
+     */
+    function hasClass(target, className)
+    {
+        return target.className.indexOf(className) != -1;
+    };
+
+    /**
+     * Adds CSS class name to the target DOM element.
+     * @param {DOMElement} target Target DOM element.
+     * @param {String} className New CSS class to add.
+     */
+    function addClass(target, className)
+    {
+        if (!hasClass(target, className))
+            target.className += ' ' + className;
+    };
+
+    /**
+     * Removes CSS class name from the target DOM element.
+     * @param {DOMElement} target Target DOM element.
+     * @param {String} className CSS class to remove.
+     */
+    function removeClass(target, className)
+    {
+        target.className = target.className.replace(className, '');
+    };
+
+    /**
+     * Converts the source to array object. Mostly used for function arguments and
+     * lists returned by getElementsByTagName() which aren't Array objects.
+     * @param {List} source Source list.
+     * @return {Array} Returns array.
+     */
+    function toArray(source)
+    {
+        var result = [];
+
+        for (var i = 0; i < source.length; i++)
+            result.push(source[i]);
+
+        return result;
+    };
+
+    /**
+     * Splits block of text into lines.
+     * @param {String} block Block of text.
+     * @return {Array} Returns array of lines.
+     */
+    function splitLines(block)
+    {
+        return block.split(/\r?\n/);
+    }
+
+    /**
+     * Generates HTML ID for the highlighter.
+     * @param {String} highlighterId Highlighter ID.
+     * @return {String} Returns HTML ID.
+     */
+    function getHighlighterId(id)
+    {
+        var prefix = 'highlighter_';
+        return id.indexOf(prefix) == 0 ? id : prefix + id;
+    };
+
+    /**
+     * Finds Highlighter instance by ID.
+     * @param {String} highlighterId Highlighter ID.
+     * @return {Highlighter} Returns instance of the highlighter.
+     */
+    function getHighlighterById(id)
+    {
+        return sh.vars.highlighters[getHighlighterId(id)];
+    };
+
+    /**
+     * Finds highlighter's DIV container.
+     * @param {String} highlighterId Highlighter ID.
+     * @return {Element} Returns highlighter's DIV element.
+     */
+    function getHighlighterDivById(id)
+    {
+        return document.getElementById(getHighlighterId(id));
+    };
+
+    /**
+     * Stores highlighter so that getHighlighterById() can do its thing. Each
+     * highlighter must call this method to preserve itself.
+     * @param {Highilghter} highlighter Highlighter instance.
+     */
+    function storeHighlighter(highlighter)
+    {
+        sh.vars.highlighters[getHighlighterId(highlighter.id)] = highlighter;
+    };
+
+    /**
+     * Looks for a child or parent node which has specified classname.
+     * Equivalent to jQuery's $(container).find(".className")
+     * @param {Element} target Target element.
+     * @param {String} search Class name or node name to look for.
+     * @param {Boolean} reverse If set to true, will go up the node tree instead of down.
+     * @return {Element} Returns found child or parent element on null.
+     */
+    function findElement(target, search, reverse /* optional */)
+    {
+        if (target == null)
+            return null;
+
+        var nodes			= reverse != true ? target.childNodes : [ target.parentNode ],
+            propertyToFind	= { '#' : 'id', '.' : 'className' }[search.substr(0, 1)] || 'nodeName',
+            expectedValue,
+            found
+            ;
+
+        expectedValue = propertyToFind != 'nodeName'
+            ? search.substr(1)
+            : search.toUpperCase()
+        ;
+
+        // main return of the found node
+        if ((target[propertyToFind] || '').indexOf(expectedValue) != -1)
+            return target;
+
+        for (var i = 0; nodes && i < nodes.length && found == null; i++)
+            found = findElement(nodes[i], search, reverse);
+
+        return found;
+    };
+
+    /**
+     * Looks for a parent node which has specified classname.
+     * This is an alias to <code>findElement(container, className, true)</code>.
+     * @param {Element} target Target element.
+     * @param {String} className Class name to look for.
+     * @return {Element} Returns found parent element on null.
+     */
+    function findParentElement(target, className)
+    {
+        return findElement(target, className, true);
+    };
+
+    /**
+     * Finds an index of element in the array.
+     * @ignore
+     * @param {Object} searchElement
+     * @param {Number} fromIndex
+     * @return {Number} Returns index of element if found; -1 otherwise.
+     */
+    function indexOf(array, searchElement, fromIndex)
+    {
+        fromIndex = Math.max(fromIndex || 0, 0);
+
+        for (var i = fromIndex; i < array.length; i++)
+            if(array[i] == searchElement)
+                return i;
+
+        return -1;
+    };
+
+    /**
+     * Generates a unique element ID.
+     */
+    function guid(prefix)
+    {
+        return (prefix || '') + Math.round(Math.random() * 1000000).toString();
+    };
+
+    /**
+     * Merges two objects. Values from obj2 override values in obj1.
+     * Function is NOT recursive and works only for one dimensional objects.
+     * @param {Object} obj1 First object.
+     * @param {Object} obj2 Second object.
+     * @return {Object} Returns combination of both objects.
+     */
+    function merge(obj1, obj2)
+    {
+        var result = {}, name;
+
+        for (name in obj1)
+            result[name] = obj1[name];
+
+        for (name in obj2)
+            result[name] = obj2[name];
+
+        return result;
+    };
+
+    /**
+     * Attempts to convert string to boolean.
+     * @param {String} value Input string.
+     * @return {Boolean} Returns true if input was "true", false if input was "false" and value otherwise.
+     */
+    function toBoolean(value)
+    {
+        var result = { "true" : true, "false" : false }[value];
+        return result == null ? value : result;
+    };
+
+    /**
+     * Opens up a centered popup window.
+     * @param {String} url		URL to open in the window.
+     * @param {String} name		Popup name.
+     * @param {int} width		Popup width.
+     * @param {int} height		Popup height.
+     * @param {String} options	window.open() options.
+     * @return {Window}			Returns window instance.
+     */
+    function popup(url, name, width, height, options)
+    {
+        var x = (screen.width - width) / 2,
+            y = (screen.height - height) / 2
+            ;
+
+        options +=	', left=' + x +
+            ', top=' + y +
+            ', width=' + width +
+            ', height=' + height
+        ;
+        options = options.replace(/^,/, '');
+
+        var win = window.open(url, name, options);
+        win.focus();
+        return win;
+    };
+
+    /**
+     * Adds event handler to the target object.
+     * @param {Object} obj		Target object.
+     * @param {String} type		Name of the event.
+     * @param {Function} func	Handling function.
+     */
+    function attachEvent(obj, type, func, scope)
+    {
+        function handler(e)
+        {
+            e = e || window.event;
+
+            if (!e.target)
+            {
+                e.target = e.srcElement;
+                e.preventDefault = function()
+                {
+                    this.returnValue = false;
+                };
+            }
+
+            func.call(scope || window, e);
+        };
+
+        if (obj.attachEvent)
+        {
+            obj.attachEvent('on' + type, handler);
+        }
+        else
+        {
+            obj.addEventListener(type, handler, false);
+        }
+    };
+
+    /**
+     * Displays an alert.
+     * @param {String} str String to display.
+     */
+    function alert(str)
+    {
+        window.alert(sh.config.strings.alert + str);
+    };
+
+    /**
+     * Finds a brush by its alias.
+     *
+     * @param {String} alias		Brush alias.
+     * @param {Boolean} showAlert	Suppresses the alert if false.
+     * @return {Brush}				Returns bursh constructor if found, null otherwise.
+     */
+    function findBrush(alias, showAlert)
+    {
+        var brushes = sh.vars.discoveredBrushes,
+            result = null
+            ;
+
+        if (brushes == null)
+        {
+            brushes = {};
+
+            // Find all brushes
+            for (var brush in sh.brushes)
+            {
+                var info = sh.brushes[brush],
+                    aliases = info.aliases
+                    ;
+
+                if (aliases == null)
+                    continue;
+
+                // keep the brush name
+                info.brushName = brush.toLowerCase();
+
+                for (var i = 0; i < aliases.length; i++)
+                    brushes[aliases[i]] = brush;
+            }
+
+            sh.vars.discoveredBrushes = brushes;
+        }
+
+        result = sh.brushes[brushes[alias]];
+
+        if (result == null && showAlert)
+            alert(sh.config.strings.noBrush + alias);
+
+        return result;
+    };
+
+    /**
+     * Executes a callback on each line and replaces each line with result from the callback.
+     * @param {Object} str			Input string.
+     * @param {Object} callback		Callback function taking one string argument and returning a string.
+     */
+    function eachLine(str, callback)
+    {
+        var lines = splitLines(str);
+
+        for (var i = 0; i < lines.length; i++)
+            lines[i] = callback(lines[i], i);
+
+        // include \r to enable copy-paste on windows (ie8) without getting everything on one line
+        return lines.join('\r\n');
+    };
+
+    /**
+     * This is a special trim which only removes first and last empty lines
+     * and doesn't affect valid leading space on the first line.
+     *
+     * @param {String} str   Input string
+     * @return {String}      Returns string without empty first and last lines.
+     */
+    function trimFirstAndLastLines(str)
+    {
+        return str.replace(/^[ ]*[\n]+|[\n]*[ ]*$/g, '');
+    };
+
+    /**
+     * Parses key/value pairs into hash object.
+     *
+     * Understands the following formats:
+     * - name: word;
+     * - name: [word, word];
+     * - name: "string";
+     * - name: 'string';
+     *
+     * For example:
+     *   name1: value; name2: [value, value]; name3: 'value'
+     *
+     * @param {String} str    Input string.
+     * @return {Object}       Returns deserialized object.
+     */
+    function parseParams(str)
+    {
+        var match,
+            result = {},
+            arrayRegex = new XRegExp("^\\[(?<values>(.*?))\\]$"),
+            regex = new XRegExp(
+                "(?<name>[\\w-]+)" +
+                    "\\s*:\\s*" +
+                    "(?<value>" +
+                    "[\\w-%#]+|" +		// word
+                    "\\[.*?\\]|" +		// [] array
+                    '".*?"|' +			// "" string
+                    "'.*?'" +			// '' string
+                    ")\\s*;?",
+                "g"
+            )
+            ;
+
+        while ((match = regex.exec(str)) != null)
+        {
+            var value = match.value
+                    .replace(/^['"]|['"]$/g, '') // strip quotes from end of strings
+                ;
+
+            // try to parse array value
+            if (value != null && arrayRegex.test(value))
+            {
+                var m = arrayRegex.exec(value);
+                value = m.values.length > 0 ? m.values.split(/\s*,\s*/) : [];
+            }
+
+            result[match.name] = value;
+        }
+
+        return result;
+    };
+
+    /**
+     * Wraps each line of the string into <code/> tag with given style applied to it.
+     *
+     * @param {String} str   Input string.
+     * @param {String} css   Style name to apply to the string.
+     * @return {String}      Returns input string with each line surrounded by <span/> tag.
+     */
+    function wrapLinesWithCode(str, css)
+    {
+        if (str == null || str.length == 0 || str == '\n')
+            return str;
+
+        str = str.replace(/</g, '&lt;');
+
+        // Replace two or more sequential spaces with &nbsp; leaving last space untouched.
+        str = str.replace(/ {2,}/g, function(m)
+        {
+            var spaces = '';
+
+            for (var i = 0; i < m.length - 1; i++)
+                spaces += sh.config.space;
+
+            return spaces + ' ';
+        });
+
+        // Split each line and apply <span class="...">...</span> to them so that
+        // leading spaces aren't included.
+        if (css != null)
+            str = eachLine(str, function(line)
+            {
+                if (line.length == 0)
+                    return '';
+
+                var spaces = '';
+
+                line = line.replace(/^(&nbsp;| )+/, function(s)
+                {
+                    spaces = s;
+                    return '';
+                });
+
+                if (line.length == 0)
+                    return spaces;
+
+                return spaces + '<code class="' + css + '">' + line + '</code>';
+            });
+
+        return str;
+    };
+
+    /**
+     * Pads number with zeros until it's length is the same as given length.
+     *
+     * @param {Number} number	Number to pad.
+     * @param {Number} length	Max string length with.
+     * @return {String}			Returns a string padded with proper amount of '0'.
+     */
+    function padNumber(number, length)
+    {
+        var result = number.toString();
+
+        while (result.length < length)
+            result = '0' + result;
+
+        return result;
+    };
+
+    /**
+     * Replaces tabs with spaces.
+     *
+     * @param {String} code		Source code.
+     * @param {Number} tabSize	Size of the tab.
+     * @return {String}			Returns code with all tabs replaces by spaces.
+     */
+    function processTabs(code, tabSize)
+    {
+        var tab = '';
+
+        for (var i = 0; i < tabSize; i++)
+            tab += ' ';
+
+        return code.replace(/\t/g, tab);
+    };
+
+    /**
+     * Replaces tabs with smart spaces.
+     *
+     * @param {String} code    Code to fix the tabs in.
+     * @param {Number} tabSize Number of spaces in a column.
+     * @return {String}        Returns code with all tabs replaces with roper amount of spaces.
+     */
+    function processSmartTabs(code, tabSize)
+    {
+        var lines = splitLines(code),
+            tab = '\t',
+            spaces = ''
+            ;
+
+        // Create a string with 1000 spaces to copy spaces from...
+        // It's assumed that there would be no indentation longer than that.
+        for (var i = 0; i < 50; i++)
+            spaces += '                    '; // 20 spaces * 50
+
+        // This function inserts specified amount of spaces in the string
+        // where a tab is while removing that given tab.
+        function insertSpaces(line, pos, count)
+        {
+            return line.substr(0, pos)
+                + spaces.substr(0, count)
+                + line.substr(pos + 1, line.length) // pos + 1 will get rid of the tab
+                ;
+        };
+
+        // Go through all the lines and do the 'smart tabs' magic.
+        code = eachLine(code, function(line)
+        {
+            if (line.indexOf(tab) == -1)
+                return line;
+
+            var pos = 0;
+
+            while ((pos = line.indexOf(tab)) != -1)
+            {
+                // This is pretty much all there is to the 'smart tabs' logic.
+                // Based on the position within the line and size of a tab,
+                // calculate the amount of spaces we need to insert.
+                var spaces = tabSize - pos % tabSize;
+                line = insertSpaces(line, pos, spaces);
+            }
+
+            return line;
+        });
+
+        return code;
+    };
+
+    /**
+     * Performs various string fixes based on configuration.
+     */
+    function fixInputString(str)
+    {
+        var br = /<br\s*\/?>|&lt;br\s*\/?&gt;/gi;
+
+        if (sh.config.bloggerMode == true)
+            str = str.replace(br, '\n');
+
+        if (sh.config.stripBrs == true)
+            str = str.replace(br, '');
+
+        return str;
+    };
+
+    /**
+     * Removes all white space at the begining and end of a string.
+     *
+     * @param {String} str   String to trim.
+     * @return {String}      Returns string without leading and following white space characters.
+     */
+    function trim(str)
+    {
+        return str.replace(/^\s+|\s+$/g, '');
+    };
+
+    /**
+     * Unindents a block of text by the lowest common indent amount.
+     * @param {String} str   Text to unindent.
+     * @return {String}      Returns unindented text block.
+     */
+    function unindent(str)
+    {
+        var lines = splitLines(fixInputString(str)),
+            indents = new Array(),
+            regex = /^\s*/,
+            min = 1000
+            ;
+
+        // go through every line and check for common number of indents
+        for (var i = 0; i < lines.length && min > 0; i++)
+        {
+            var line = lines[i];
+
+            if (trim(line).length == 0)
+                continue;
+
+            var matches = regex.exec(line);
+
+            // In the event that just one line doesn't have leading white space
+            // we can't unindent anything, so bail completely.
+            if (matches == null)
+                return str;
+
+            min = Math.min(matches[0].length, min);
+        }
+
+        // trim minimum common number of white space from the begining of every line
+        if (min > 0)
+            for (var i = 0; i < lines.length; i++)
+                lines[i] = lines[i].substr(min);
+
+        return lines.join('\n');
+    };
+
+    /**
+     * Callback method for Array.sort() which sorts matches by
+     * index position and then by length.
+     *
+     * @param {Match} m1	Left object.
+     * @param {Match} m2    Right object.
+     * @return {Number}     Returns -1, 0 or -1 as a comparison result.
+     */
+    function matchesSortCallback(m1, m2)
+    {
+        // sort matches by index first
+        if(m1.index < m2.index)
+            return -1;
+        else if(m1.index > m2.index)
+            return 1;
+        else
+        {
+            // if index is the same, sort by length
+            if(m1.length < m2.length)
+                return -1;
+            else if(m1.length > m2.length)
+                return 1;
+        }
+
+        return 0;
+    };
+
+    /**
+     * Executes given regular expression on provided code and returns all
+     * matches that are found.
+     *
+     * @param {String} code    Code to execute regular expression on.
+     * @param {Object} regex   Regular expression item info from <code>regexList</code> collection.
+     * @return {Array}         Returns a list of Match objects.
+     */
+    function getMatches(code, regexInfo)
+    {
+        function defaultAdd(match, regexInfo)
+        {
+            return match[0];
+        };
+
+        var index = 0,
+            match = null,
+            matches = [],
+            func = regexInfo.func ? regexInfo.func : defaultAdd
+            ;
+
+        while((match = regexInfo.regex.exec(code)) != null)
+        {
+            var resultMatch = func(match, regexInfo);
+
+            if (typeof(resultMatch) == 'string')
+                resultMatch = [new sh.Match(resultMatch, match.index, regexInfo.css)];
+
+            matches = matches.concat(resultMatch);
+        }
+
+        return matches;
+    };
+
+    /**
+     * Turns all URLs in the code into <a/> tags.
+     * @param {String} code Input code.
+     * @return {String} Returns code with </a> tags.
+     */
+    function processUrls(code)
+    {
+        var gt = /(.*)((&gt;|&lt;).*)/;
+
+        return code.replace(sh.regexLib.url, function(m)
+        {
+            var suffix = '',
+                match = null
+                ;
+
+            // We include &lt; and &gt; in the URL for the common cases like <http://google.com>
+            // The problem is that they get transformed into &lt;http://google.com&gt;
+            // Where as &gt; easily looks like part of the URL string.
+
+            if (match = gt.exec(m))
+            {
+                m = match[1];
+                suffix = match[2];
+            }
+
+            return '<a href="' + m + '">' + m + '</a>' + suffix;
+        });
+    };
+
+    /**
+     * Finds all <SCRIPT TYPE="syntaxhighlighter" /> elementss.
+     * @return {Array} Returns array of all found SyntaxHighlighter tags.
+     */
+    function getSyntaxHighlighterScriptTags()
+    {
+        var tags = document.getElementsByTagName('script'),
+            result = []
+            ;
+
+        for (var i = 0; i < tags.length; i++)
+            if (tags[i].type == 'syntaxhighlighter')
+                result.push(tags[i]);
+
+        return result;
+    };
+
+    /**
+     * Strips <![CDATA[]]> from <SCRIPT /> content because it should be used
+     * there in most cases for XHTML compliance.
+     * @param {String} original	Input code.
+     * @return {String} Returns code without leading <![CDATA[]]> tags.
+     */
+    function stripCData(original)
+    {
+        var left = '<![CDATA[',
+            right = ']]>',
+        // for some reason IE inserts some leading blanks here
+            copy = trim(original),
+            changed = false,
+            leftLength = left.length,
+            rightLength = right.length
+            ;
+
+        if (copy.indexOf(left) == 0)
+        {
+            copy = copy.substring(leftLength);
+            changed = true;
+        }
+
+        var copyLength = copy.length;
+
+        if (copy.indexOf(right) == copyLength - rightLength)
+        {
+            copy = copy.substring(0, copyLength - rightLength);
+            changed = true;
+        }
+
+        return changed ? copy : original;
+    };
+
+
+    /**
+     * Quick code mouse double click handler.
+     */
+    function quickCodeHandler(e)
+    {
+        var target = e.target,
+            highlighterDiv = findParentElement(target, '.syntaxhighlighter'),
+            container = findParentElement(target, '.container'),
+            textarea = document.createElement('textarea'),
+            highlighter
+            ;
+
+        if (!container || !highlighterDiv || findElement(container, 'textarea'))
+            return;
+
+        highlighter = getHighlighterById(highlighterDiv.id);
+
+        // add source class name
+        addClass(highlighterDiv, 'source');
+
+        // Have to go over each line and grab it's text, can't just do it on the
+        // container because Firefox loses all \n where as Webkit doesn't.
+        var lines = container.childNodes,
+            code = []
+            ;
+
+        for (var i = 0; i < lines.length; i++)
+            code.push(lines[i].innerText || lines[i].textContent);
+
+        // using \r instead of \r or \r\n makes this work equally well on IE, FF and Webkit
+        code = code.join('\r');
+
+        // For Webkit browsers, replace nbsp with a breaking space
+        code = code.replace(/\u00a0/g, " ");
+
+        // inject <textarea/> tag
+        textarea.appendChild(document.createTextNode(code));
+        container.appendChild(textarea);
+
+        // preselect all text
+        textarea.focus();
+        textarea.select();
+
+        // set up handler for lost focus
+        attachEvent(textarea, 'blur', function(e)
+        {
+            textarea.parentNode.removeChild(textarea);
+            removeClass(highlighterDiv, 'source');
+        });
+    };
+
+    /**
+     * Match object.
+     */
+    sh.Match = function(value, index, css)
+    {
+        this.value = value;
+        this.index = index;
+        this.length = value.length;
+        this.css = css;
+        this.brushName = null;
+    };
+
+    sh.Match.prototype.toString = function()
+    {
+        return this.value;
+    };
+
+    /**
+     * Simulates HTML code with a scripting language embedded.
+     *
+     * @param {String} scriptBrushName Brush name of the scripting language.
+     */
+    sh.HtmlScript = function(scriptBrushName)
+    {
+        var brushClass = findBrush(scriptBrushName),
+            scriptBrush,
+            xmlBrush = new sh.brushes.Xml(),
+            bracketsRegex = null,
+            ref = this,
+            methodsToExpose = 'getDiv getHtml init'.split(' ')
+            ;
+
+        if (brushClass == null)
+            return;
+
+        scriptBrush = new brushClass();
+
+        for(var i = 0; i < methodsToExpose.length; i++)
+            // make a closure so we don't lose the name after i changes
+            (function() {
+                var name = methodsToExpose[i];
+
+                ref[name] = function()
+                {
+                    return xmlBrush[name].apply(xmlBrush, arguments);
+                };
+            })();
+
+        if (scriptBrush.htmlScript == null)
+        {
+            alert(sh.config.strings.brushNotHtmlScript + scriptBrushName);
+            return;
+        }
+
+        xmlBrush.regexList.push(
+            { regex: scriptBrush.htmlScript.code, func: process }
+        );
+
+        function offsetMatches(matches, offset)
+        {
+            for (var j = 0; j < matches.length; j++)
+                matches[j].index += offset;
+        }
+
+        function process(match, info)
+        {
+            var code = match.code,
+                matches = [],
+                regexList = scriptBrush.regexList,
+                offset = match.index + match.left.length,
+                htmlScript = scriptBrush.htmlScript,
+                result
+                ;
+
+            // add all matches from the code
+            for (var i = 0; i < regexList.length; i++)
+            {
+                result = getMatches(code, regexList[i]);
+                offsetMatches(result, offset);
+                matches = matches.concat(result);
+            }
+
+            // add left script bracket
+            if (htmlScript.left != null && match.left != null)
+            {
+                result = getMatches(match.left, htmlScript.left);
+                offsetMatches(result, match.index);
+                matches = matches.concat(result);
+            }
+
+            // add right script bracket
+            if (htmlScript.right != null && match.right != null)
+            {
+                result = getMatches(match.right, htmlScript.right);
+                offsetMatches(result, match.index + match[0].lastIndexOf(match.right));
+                matches = matches.concat(result);
+            }
+
+            for (var j = 0; j < matches.length; j++)
+                matches[j].brushName = brushClass.brushName;
+
+            return matches;
+        }
+    };
+
+    /**
+     * Main Highlither class.
+     * @constructor
+     */
+    sh.Highlighter = function()
+    {
+        // not putting any code in here because of the prototype inheritance
+    };
+
+    sh.Highlighter.prototype = {
+        /**
+         * Returns value of the parameter passed to the highlighter.
+         * @param {String} name				Name of the parameter.
+         * @param {Object} defaultValue		Default value.
+         * @return {Object}					Returns found value or default value otherwise.
+         */
+        getParam: function(name, defaultValue)
+        {
+            var result = this.params[name];
+            return toBoolean(result == null ? defaultValue : result);
+        },
+
+        /**
+         * Shortcut to document.createElement().
+         * @param {String} name		Name of the element to create (DIV, A, etc).
+         * @return {HTMLElement}	Returns new HTML element.
+         */
+        create: function(name)
+        {
+            return document.createElement(name);
+        },
+
+        /**
+         * Applies all regular expression to the code and stores all found
+         * matches in the `this.matches` array.
+         * @param {Array} regexList		List of regular expressions.
+         * @param {String} code			Source code.
+         * @return {Array}				Returns list of matches.
+         */
+        findMatches: function(regexList, code)
+        {
+            var result = [];
+
+            if (regexList != null)
+                for (var i = 0; i < regexList.length; i++)
+                    // BUG: length returns len+1 for array if methods added to prototype chain (oising@gmail.com)
+                    if (typeof (regexList[i]) == "object")
+                        result = result.concat(getMatches(code, regexList[i]));
+
+            // sort and remove nested the matches
+            return this.removeNestedMatches(result.sort(matchesSortCallback));
+        },
+
+        /**
+         * Checks to see if any of the matches are inside of other matches.
+         * This process would get rid of highligted strings inside comments,
+         * keywords inside strings and so on.
+         */
+        removeNestedMatches: function(matches)
+        {
+            // Optimized by Jose Prado (http://joseprado.com)
+            for (var i = 0; i < matches.length; i++)
+            {
+                if (matches[i] === null)
+                    continue;
+
+                var itemI = matches[i],
+                    itemIEndPos = itemI.index + itemI.length
+                    ;
+
+                for (var j = i + 1; j < matches.length && matches[i] !== null; j++)
+                {
+                    var itemJ = matches[j];
+
+                    if (itemJ === null)
+                        continue;
+                    else if (itemJ.index > itemIEndPos)
+                        break;
+                    else if (itemJ.index == itemI.index && itemJ.length > itemI.length)
+                        matches[i] = null;
+                    else if (itemJ.index >= itemI.index && itemJ.index < itemIEndPos)
+                        matches[j] = null;
+                }
+            }
+
+            return matches;
+        },
+
+        /**
+         * Creates an array containing integer line numbers starting from the 'first-line' param.
+         * @return {Array} Returns array of integers.
+         */
+        figureOutLineNumbers: function(code)
+        {
+            var lines = [],
+                firstLine = parseInt(this.getParam('first-line'))
+                ;
+
+            eachLine(code, function(line, index)
+            {
+                lines.push(index + firstLine);
+            });
+
+            return lines;
+        },
+
+        /**
+         * Determines if specified line number is in the highlighted list.
+         */
+        isLineHighlighted: function(lineNumber)
+        {
+            var list = this.getParam('highlight', []);
+
+            if (typeof(list) != 'object' && list.push == null)
+                list = [ list ];
+
+            return indexOf(list, lineNumber.toString()) != -1;
+        },
+
+        /**
+         * Generates HTML markup for a single line of code while determining alternating line style.
+         * @param {Integer} lineNumber	Line number.
+         * @param {String} code Line	HTML markup.
+         * @return {String}				Returns HTML markup.
+         */
+        getLineHtml: function(lineIndex, lineNumber, code)
+        {
+            var classes = [
+                'line',
+                'number' + lineNumber,
+                'index' + lineIndex,
+                'alt' + (lineNumber % 2 == 0 ? 1 : 2).toString()
+            ];
+
+            if (this.isLineHighlighted(lineNumber))
+                classes.push('highlighted');
+
+            if (lineNumber == 0)
+                classes.push('break');
+
+            return '<div class="' + classes.join(' ') + '">' + code + '</div>';
+        },
+
+        /**
+         * Generates HTML markup for line number column.
+         * @param {String} code			Complete code HTML markup.
+         * @param {Array} lineNumbers	Calculated line numbers.
+         * @return {String}				Returns HTML markup.
+         */
+        getLineNumbersHtml: function(code, lineNumbers)
+        {
+            var html = '',
+                count = splitLines(code).length,
+                firstLine = parseInt(this.getParam('first-line')),
+                pad = this.getParam('pad-line-numbers')
+                ;
+
+            if (pad == true)
+                pad = (firstLine + count - 1).toString().length;
+            else if (isNaN(pad) == true)
+                pad = 0;
+
+            for (var i = 0; i < count; i++)
+            {
+                var lineNumber = lineNumbers ? lineNumbers[i] : firstLine + i,
+                    code = lineNumber == 0 ? sh.config.space : padNumber(lineNumber, pad)
+                    ;
+
+                html += this.getLineHtml(i, lineNumber, code);
+            }
+
+            return html;
+        },
+
+        /**
+         * Splits block of text into individual DIV lines.
+         * @param {String} code			Code to highlight.
+         * @param {Array} lineNumbers	Calculated line numbers.
+         * @return {String}				Returns highlighted code in HTML form.
+         */
+        getCodeLinesHtml: function(html, lineNumbers)
+        {
+            html = trim(html);
+
+            var lines = splitLines(html),
+                padLength = this.getParam('pad-line-numbers'),
+                firstLine = parseInt(this.getParam('first-line')),
+                html = '',
+                brushName = this.getParam('brush')
+                ;
+
+            for (var i = 0; i < lines.length; i++)
+            {
+                var line = lines[i],
+                    indent = /^(&nbsp;|\s)+/.exec(line),
+                    spaces = null,
+                    lineNumber = lineNumbers ? lineNumbers[i] : firstLine + i;
+                ;
+
+                if (indent != null)
+                {
+                    spaces = indent[0].toString();
+                    line = line.substr(spaces.length);
+                    spaces = spaces.replace(' ', sh.config.space);
+                }
+
+                line = trim(line);
+
+                if (line.length == 0)
+                    line = sh.config.space;
+
+                html += this.getLineHtml(
+                    i,
+                    lineNumber,
+                    (spaces != null ? '<code class="' + brushName + ' spaces">' + spaces + '</code>' : '') + line
+                );
+            }
+
+            return html;
+        },
+
+        /**
+         * Returns HTML for the table title or empty string if title is null.
+         */
+        getTitleHtml: function(title)
+        {
+            return title ? '<caption>' + title + '</caption>' : '';
+        },
+
+        /**
+         * Finds all matches in the source code.
+         * @param {String} code		Source code to process matches in.
+         * @param {Array} matches	Discovered regex matches.
+         * @return {String} Returns formatted HTML with processed mathes.
+         */
+        getMatchesHtml: function(code, matches)
+        {
+            var pos = 0,
+                result = '',
+                brushName = this.getParam('brush', '')
+                ;
+
+            function getBrushNameCss(match)
+            {
+                var result = match ? (match.brushName || brushName) : brushName;
+                return result ? result + ' ' : '';
+            };
+
+            // Finally, go through the final list of matches and pull the all
+            // together adding everything in between that isn't a match.
+            for (var i = 0; i < matches.length; i++)
+            {
+                var match = matches[i],
+                    matchBrushName
+                    ;
+
+                if (match === null || match.length === 0)
+                    continue;
+
+                matchBrushName = getBrushNameCss(match);
+
+                result += wrapLinesWithCode(code.substr(pos, match.index - pos), matchBrushName + 'plain')
+                    + wrapLinesWithCode(match.value, matchBrushName + match.css)
+                ;
+
+                pos = match.index + match.length + (match.offset || 0);
+            }
+
+            // don't forget to add whatever's remaining in the string
+            result += wrapLinesWithCode(code.substr(pos), getBrushNameCss() + 'plain');
+
+            return result;
+        },
+
+        /**
+         * Generates HTML markup for the whole syntax highlighter.
+         * @param {String} code Source code.
+         * @return {String} Returns HTML markup.
+         */
+        getHtml: function(code)
+        {
+            var html = '',
+                classes = [ 'syntaxhighlighter' ],
+                tabSize,
+                matches,
+                lineNumbers
+                ;
+
+            // process light mode
+            if (this.getParam('light') == true)
+                this.params.toolbar = this.params.gutter = false;
+
+            className = 'syntaxhighlighter';
+
+            if (this.getParam('collapse') == true)
+                classes.push('collapsed');
+
+            if ((gutter = this.getParam('gutter')) == false)
+                classes.push('nogutter');
+
+            // add custom user style name
+            classes.push(this.getParam('class-name'));
+
+            // add brush alias to the class name for custom CSS
+            classes.push(this.getParam('brush'));
+
+            code = trimFirstAndLastLines(code)
+                .replace(/\r/g, ' ') // IE lets these buggers through
+            ;
+
+            tabSize = this.getParam('tab-size');
+
+            // replace tabs with spaces
+            code = this.getParam('smart-tabs') == true
+                ? processSmartTabs(code, tabSize)
+                : processTabs(code, tabSize)
+            ;
+
+            // unindent code by the common indentation
+            if (this.getParam('unindent'))
+                code = unindent(code);
+
+            if (gutter)
+                lineNumbers = this.figureOutLineNumbers(code);
+
+            // find matches in the code using brushes regex list
+            matches = this.findMatches(this.regexList, code);
+            // processes found matches into the html
+            html = this.getMatchesHtml(code, matches);
+            // finally, split all lines so that they wrap well
+            html = this.getCodeLinesHtml(html, lineNumbers);
+
+            // finally, process the links
+            if (this.getParam('auto-links'))
+                html = processUrls(html);
+
+            if (typeof(navigator) != 'undefined' && navigator.userAgent && navigator.userAgent.match(/MSIE/))
+                classes.push('ie');
+
+            html =
+                '<div id="' + getHighlighterId(this.id) + '" class="' + classes.join(' ') + '">'
+                    + (this.getParam('toolbar') ? sh.toolbar.getHtml(this) : '')
+                    + '<table border="0" cellpadding="0" cellspacing="0">'
+                    + this.getTitleHtml(this.getParam('title'))
+                    + '<tbody>'
+                    + '<tr>'
+                    + (gutter ? '<td class="gutter">' + this.getLineNumbersHtml(code) + '</td>' : '')
+                    + '<td class="code">'
+                    + '<div class="container">'
+                    + html
+                    + '</div>'
+                    + '</td>'
+                    + '</tr>'
+                    + '</tbody>'
+                    + '</table>'
+                    + '</div>'
+            ;
+
+            return html;
+        },
+
+        /**
+         * Highlights the code and returns complete HTML.
+         * @param {String} code     Code to highlight.
+         * @return {Element}        Returns container DIV element with all markup.
+         */
+        getDiv: function(code)
+        {
+            if (code === null)
+                code = '';
+
+            this.code = code;
+
+            var div = this.create('div');
+
+            // create main HTML
+            div.innerHTML = this.getHtml(code);
+
+            // set up click handlers
+            if (this.getParam('toolbar'))
+                attachEvent(findElement(div, '.toolbar'), 'click', sh.toolbar.handler);
+
+            if (this.getParam('quick-code'))
+                attachEvent(findElement(div, '.code'), 'dblclick', quickCodeHandler);
+
+            return div;
+        },
+
+        /**
+         * Initializes the highlighter/brush.
+         *
+         * Constructor isn't used for initialization so that nothing executes during necessary
+         * `new SyntaxHighlighter.Highlighter()` call when setting up brush inheritence.
+         *
+         * @param {Hash} params Highlighter parameters.
+         */
+        init: function(params)
+        {
+            this.id = guid();
+
+            // register this instance in the highlighters list
+            storeHighlighter(this);
+
+            // local params take precedence over defaults
+            this.params = merge(sh.defaults, params || {})
+
+            // process light mode
+            if (this.getParam('light') == true)
+                this.params.toolbar = this.params.gutter = false;
+        },
+
+        /**
+         * Converts space separated list of keywords into a regular expression string.
+         * @param {String} str    Space separated keywords.
+         * @return {String}       Returns regular expression string.
+         */
+        getKeywords: function(str)
+        {
+            str = str
+                .replace(/^\s+|\s+$/g, '')
+                .replace(/\s+/g, '|')
+            ;
+
+            return '\\b(?:' + str + ')\\b';
+        },
+
+        /**
+         * Makes a brush compatible with the `html-script` functionality.
+         * @param {Object} regexGroup Object containing `left` and `right` regular expressions.
+         */
+        forHtmlScript: function(regexGroup)
+        {
+            var regex = { 'end' : regexGroup.right.source };
+
+            if(regexGroup.eof)
+                regex.end = "(?:(?:" + regex.end + ")|$)";
+
+            this.htmlScript = {
+                left : { regex: regexGroup.left, css: 'script' },
+                right : { regex: regexGroup.right, css: 'script' },
+                code : new XRegExp(
+                    "(?<left>" + regexGroup.left.source + ")" +
+                        "(?<code>.*?)" +
+                        "(?<right>" + regex.end + ")",
+                    "sgi"
+                )
+            };
+        }
+    }; // end of Highlighter
+
+    return sh;
+}(); // end of anonymous function
+
+// CommonJS
+typeof(exports) != 'undefined' ? exports.SyntaxHighlighter = SyntaxHighlighter : null;
+
+;(function()
+{
+    // CommonJS
+    SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+    function Brush()
+    {
+        // Created by Peter Atoria @ http://iAtoria.com
+
+        var inits 	 =  'class interface function package';
+
+        var keywords =	'-Infinity ...rest Array as AS3 Boolean break case catch const continue Date decodeURI ' +
+                'decodeURIComponent default delete do dynamic each else encodeURI encodeURIComponent escape ' +
+                'extends false final finally flash_proxy for get if implements import in include Infinity ' +
+                'instanceof int internal is isFinite isNaN isXMLName label namespace NaN native new null ' +
+                'Null Number Object object_proxy override parseFloat parseInt private protected public ' +
+                'return set static String super switch this throw true try typeof uint undefined unescape ' +
+                'use void while with'
+            ;
+
+        this.regexList = [
+            { regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },		// one line comments
+            { regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },		// multiline comments
+            { regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },		// double quoted strings
+            { regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },		// single quoted strings
+            { regex: /\b([\d]+(\.[\d]+)?|0x[a-f0-9]+)\b/gi,				css: 'value' },			// numbers
+            { regex: new RegExp(this.getKeywords(inits), 'gm'),			css: 'color3' },		// initializations
+            { regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' },		// keywords
+            { regex: new RegExp('var', 'gm'),							css: 'variable' },		// variable
+            { regex: new RegExp('trace', 'gm'),							css: 'color1' }			// trace
+        ];
+
+        this.forHtmlScript(SyntaxHighlighter.regexLib.scriptScriptTags);
+    };
+
+    Brush.prototype	= new SyntaxHighlighter.Highlighter();
+    Brush.aliases	= ['actionscript3', 'as3'];
+
+    SyntaxHighlighter.brushes.AS3 = Brush;
+
+    // CommonJS
+    typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+
+;(function()
+{
+    // CommonJS
+    SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+    function Brush()
+    {
+        // AppleScript brush by David Chambers
+        // http://davidchambersdesign.com/
+        var keywords   = 'after before beginning continue copy each end every from return get global in local named of set some that the then times to where whose with without';
+        var ordinals   = 'first second third fourth fifth sixth seventh eighth ninth tenth last front back middle';
+        var specials   = 'activate add alias AppleScript ask attachment boolean class constant delete duplicate empty exists false id integer list make message modal modified new no paragraph pi properties quit real record remove rest result reveal reverse run running save string true word yes';
+
+        this.regexList = [
+
+            { regex: /(--|#).*$/gm,
+                css: 'comments' },
+
+            { regex: /\(\*(?:[\s\S]*?\(\*[\s\S]*?\*\))*[\s\S]*?\*\)/gm, // support nested comments
+                css: 'comments' },
+
+            { regex: /"[\s\S]*?"/gm,
+                css: 'string' },
+
+            { regex: /(?:,|:|¬|'s\b|\(|\)|\{|\}|«|\b\w*»)/g,
+                css: 'color1' },
+
+            { regex: /(-)?(\d)+(\.(\d)?)?(E\+(\d)+)?/g, // numbers
+                css: 'color1' },
+
+            { regex: /(?:&(amp;|gt;|lt;)?|=|� |>|<|≥|>=|≤|<=|\*|\+|-|\/|÷|\^)/g,
+                css: 'color2' },
+
+            { regex: /\b(?:and|as|div|mod|not|or|return(?!\s&)(ing)?|equals|(is(n't| not)? )?equal( to)?|does(n't| not) equal|(is(n't| not)? )?(greater|less) than( or equal( to)?)?|(comes|does(n't| not) come) (after|before)|is(n't| not)?( in)? (back|front) of|is(n't| not)? behind|is(n't| not)?( (in|contained by))?|does(n't| not) contain|contain(s)?|(start|begin|end)(s)? with|((but|end) )?(consider|ignor)ing|prop(erty)?|(a )?ref(erence)?( to)?|repeat (until|while|with)|((end|exit) )?repeat|((else|end) )?if|else|(end )?(script|tell|try)|(on )?error|(put )?into|(of )?(it|me)|its|my|with (timeout( of)?|transaction)|end (timeout|transaction))\b/g,
+                css: 'keyword' },
+
+            { regex: /\b\d+(st|nd|rd|th)\b/g, // ordinals
+                css: 'keyword' },
+
+            { regex: /\b(?:about|above|against|around|at|below|beneath|beside|between|by|(apart|aside) from|(instead|out) of|into|on(to)?|over|since|thr(ough|u)|under)\b/g,
+                css: 'color3' },
+
+            { regex: /\b(?:adding folder items to|after receiving|choose( ((remote )?application|color|folder|from list|URL))?|clipboard info|set the clipboard to|(the )?clipboard|entire contents|display(ing| (alert|dialog|mode))?|document( (edited|file|nib name))?|file( (name|type))?|(info )?for|giving up after|(name )?extension|quoted form|return(ed)?|second(?! item)(s)?|list (disks|folder)|text item(s| delimiters)?|(Unicode )?text|(disk )?item(s)?|((current|list) )?view|((container|key) )?window|with (data|icon( (caution|note|stop))?|parameter(s)?|prompt|properties|seed|title)|case|diacriticals|hyphens|numeric strings|punctuation|white space|folder creation|application(s( folder)?| (processes|scripts position|support))?|((desktop )?(pictures )?|(documents|downloads|favorites|home|keychain|library|movies|music|public|scripts|sites|system|users|utilities|workflows) )folder|desktop|Folder Action scripts|font(s| panel)?|help|internet plugins|modem scripts|(system )?preferences|printer descriptions|scripting (additions|components)|shared (documents|libraries)|startup (disk|items)|temporary items|trash|on server|in AppleTalk zone|((as|long|short) )?user name|user (ID|locale)|(with )?password|in (bundle( with identifier)?|directory)|(close|open for) access|read|write( permission)?|(g|s)et eof|using( delimiters)?|starting at|default (answer|button|color|country code|entr(y|ies)|identifiers|items|name|location|script editor)|hidden( answer)?|open(ed| (location|untitled))?|error (handling|reporting)|(do( shell)?|load|run|store) script|administrator privileges|altering line endings|get volume settings|(alert|boot|input|mount|output|set) volume|output muted|(fax|random )?number|round(ing)?|up|down|toward zero|to nearest|as taught in school|system (attribute|info)|((AppleScript( Studio)?|system) )?version|(home )?directory|(IPv4|primary Ethernet) address|CPU (type|speed)|physical memory|time (stamp|to GMT)|replacing|ASCII (character|number)|localized string|from table|offset|summarize|beep|delay|say|(empty|multiple) selections allowed|(of|preferred) type|invisibles|showing( package contents)?|editable URL|(File|FTP|News|Media|Web) [Ss]ervers|Telnet hosts|Directory services|Remote applications|waiting until completion|saving( (in|to))?|path (for|to( (((current|frontmost) )?application|resource))?)|POSIX (file|path)|(background|RGB) color|(OK|cancel) button name|cancel button|button(s)?|cubic ((centi)?met(re|er)s|yards|feet|inches)|square ((kilo)?met(re|er)s|miles|yards|feet)|(centi|kilo)?met(re|er)s|miles|yards|feet|inches|lit(re|er)s|gallons|quarts|(kilo)?grams|ounces|pounds|degrees (Celsius|Fahrenheit|Kelvin)|print( (dialog|settings))?|clos(e(able)?|ing)|(de)?miniaturized|miniaturizable|zoom(ed|able)|attribute run|action (method|property|title)|phone|email|((start|end)ing|home) page|((birth|creation|current|custom|modification) )?date|((((phonetic )?(first|last|middle))|computer|host|maiden|related) |nick)?name|aim|icq|jabber|msn|yahoo|address(es)?|save addressbook|should enable action|city|country( code)?|formatte(r|d address)|(palette )?label|state|street|zip|AIM [Hh]andle(s)?|my card|select(ion| all)?|unsaved|(alpha )?value|entr(y|ies)|group|(ICQ|Jabber|MSN) handle|person|people|company|department|icon image|job title|note|organization|suffix|vcard|url|copies|collating|pages (across|down)|request print time|target( printer)?|((GUI Scripting|Script menu) )?enabled|show Computer scripts|(de)?activated|awake from nib|became (key|main)|call method|of (class|object)|center|clicked toolbar item|closed|for document|exposed|(can )?hide|idle|keyboard (down|up)|event( (number|type))?|launch(ed)?|load (image|movie|nib|sound)|owner|log|mouse (down|dragged|entered|exited|moved|up)|move|column|localization|resource|script|register|drag (info|types)|resigned (active|key|main)|resiz(e(d)?|able)|right mouse (down|dragged|up)|scroll wheel|(at )?index|should (close|open( untitled)?|quit( after last window closed)?|zoom)|((proposed|screen) )?bounds|show(n)?|behind|in front of|size (mode|to fit)|update(d| toolbar item)?|was (hidden|miniaturized)|will (become active|close|finish launching|hide|miniaturize|move|open|quit|(resign )?active|((maximum|minimum|proposed) )?size|show|zoom)|bundle|data source|movie|pasteboard|sound|tool(bar| tip)|(color|open|save) panel|coordinate system|frontmost|main( (bundle|menu|window))?|((services|(excluded from )?windows) )?menu|((executable|frameworks|resource|scripts|shared (frameworks|support)) )?path|(selected item )?identifier|data|content(s| view)?|character(s)?|click count|(command|control|option|shift) key down|context|delta (x|y|z)|key( code)?|location|pressure|unmodified characters|types|(first )?responder|playing|(allowed|selectable) identifiers|allows customization|(auto saves )?configuration|visible|image( name)?|menu form representation|tag|user(-| )defaults|associated file name|(auto|needs) display|current field editor|floating|has (resize indicator|shadow)|hides when deactivated|level|minimized (image|title)|opaque|position|release when closed|sheet|title(d)?)\b/g,
+                css: 'color3' },
+
+            { regex: new RegExp(this.getKeywords(specials), 'gm'), css: 'color3' },
+            { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' },
+            { regex: new RegExp(this.getKeywords(ordinals), 'gm'), css: 'keyword' }
+        ];
+    };
+
+    Brush.prototype = new SyntaxHighlighter.Highlighter();
+    Brush.aliases = ['applescript'];
+
+    SyntaxHighlighter.brushes.AppleScript = Brush;
+
+    // CommonJS
+    typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'if fi then elif else for do done until while break continue case esac function return in eq ne ge le';
+		var commands =  'alias apropos awk basename bash bc bg builtin bzip2 cal cat cd cfdisk chgrp chmod chown chroot' +
+						'cksum clear cmp comm command cp cron crontab csplit cut date dc dd ddrescue declare df ' +
+						'diff diff3 dig dir dircolors dirname dirs du echo egrep eject enable env ethtool eval ' +
+						'exec exit expand export expr false fdformat fdisk fg fgrep file find fmt fold format ' +
+						'free fsck ftp gawk getopts grep groups gzip hash head history hostname id ifconfig ' +
+						'import install join kill less let ln local locate logname logout look lpc lpr lprint ' +
+						'lprintd lprintq lprm ls lsof make man mkdir mkfifo mkisofs mknod more mount mtools ' +
+						'mv netstat nice nl nohup nslookup open op passwd paste pathchk ping popd pr printcap ' +
+						'printenv printf ps pushd pwd quota quotacheck quotactl ram rcp read readonly renice ' +
+						'remsync rm rmdir rsync screen scp sdiff sed select seq set sftp shift shopt shutdown ' +
+						'sleep sort source split ssh strace su sudo sum symlink sync tail tar tee test time ' +
+						'times touch top traceroute trap tr true tsort tty type ulimit umask umount unalias ' +
+						'uname unexpand uniq units unset unshar useradd usermod users uuencode uudecode v vdir ' +
+						'vi watch wc whereis which who whoami Wget xargs yes'
+						;
+
+		this.regexList = [
+			{ regex: /^#!.*$/gm,											css: 'preprocessor bold' },
+			{ regex: /\/[\w-\/]+/gm,										css: 'plain' },
+			{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments,		css: 'comments' },		// one line comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,			css: 'string' },		// double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,			css: 'string' },		// single quoted strings
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),			css: 'keyword' },		// keywords
+			{ regex: new RegExp(this.getKeywords(commands), 'gm'),			css: 'functions' }		// commands
+			];
+	}
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['bash', 'shell', 'sh'];
+
+	SyntaxHighlighter.brushes.Bash = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Jen
+		// http://www.jensbits.com/2009/05/14/coldfusion-brush-for-syntaxhighlighter-plus
+	
+		var funcs	=	'Abs ACos AddSOAPRequestHeader AddSOAPResponseHeader AjaxLink AjaxOnLoad ArrayAppend ArrayAvg ArrayClear ArrayDeleteAt ' + 
+						'ArrayInsertAt ArrayIsDefined ArrayIsEmpty ArrayLen ArrayMax ArrayMin ArraySet ArraySort ArraySum ArraySwap ArrayToList ' + 
+						'Asc ASin Atn BinaryDecode BinaryEncode BitAnd BitMaskClear BitMaskRead BitMaskSet BitNot BitOr BitSHLN BitSHRN BitXor ' + 
+						'Ceiling CharsetDecode CharsetEncode Chr CJustify Compare CompareNoCase Cos CreateDate CreateDateTime CreateObject ' + 
+						'CreateODBCDate CreateODBCDateTime CreateODBCTime CreateTime CreateTimeSpan CreateUUID DateAdd DateCompare DateConvert ' + 
+						'DateDiff DateFormat DatePart Day DayOfWeek DayOfWeekAsString DayOfYear DaysInMonth DaysInYear DE DecimalFormat DecrementValue ' + 
+						'Decrypt DecryptBinary DeleteClientVariable DeserializeJSON DirectoryExists DollarFormat DotNetToCFType Duplicate Encrypt ' + 
+						'EncryptBinary Evaluate Exp ExpandPath FileClose FileCopy FileDelete FileExists FileIsEOF FileMove FileOpen FileRead ' + 
+						'FileReadBinary FileReadLine FileSetAccessMode FileSetAttribute FileSetLastModified FileWrite Find FindNoCase FindOneOf ' + 
+						'FirstDayOfMonth Fix FormatBaseN GenerateSecretKey GetAuthUser GetBaseTagData GetBaseTagList GetBaseTemplatePath ' + 
+						'GetClientVariablesList GetComponentMetaData GetContextRoot GetCurrentTemplatePath GetDirectoryFromPath GetEncoding ' + 
+						'GetException GetFileFromPath GetFileInfo GetFunctionList GetGatewayHelper GetHttpRequestData GetHttpTimeString ' + 
+						'GetK2ServerDocCount GetK2ServerDocCountLimit GetLocale GetLocaleDisplayName GetLocalHostIP GetMetaData GetMetricData ' + 
+						'GetPageContext GetPrinterInfo GetProfileSections GetProfileString GetReadableImageFormats GetSOAPRequest GetSOAPRequestHeader ' + 
+						'GetSOAPResponse GetSOAPResponseHeader GetTempDirectory GetTempFile GetTemplatePath GetTickCount GetTimeZoneInfo GetToken ' + 
+						'GetUserRoles GetWriteableImageFormats Hash Hour HTMLCodeFormat HTMLEditFormat IIf ImageAddBorder ImageBlur ImageClearRect ' + 
+						'ImageCopy ImageCrop ImageDrawArc ImageDrawBeveledRect ImageDrawCubicCurve ImageDrawLine ImageDrawLines ImageDrawOval ' + 
+						'ImageDrawPoint ImageDrawQuadraticCurve ImageDrawRect ImageDrawRoundRect ImageDrawText ImageFlip ImageGetBlob ImageGetBufferedImage ' + 
+						'ImageGetEXIFTag ImageGetHeight ImageGetIPTCTag ImageGetWidth ImageGrayscale ImageInfo ImageNegative ImageNew ImageOverlay ImagePaste ' + 
+						'ImageRead ImageReadBase64 ImageResize ImageRotate ImageRotateDrawingAxis ImageScaleToFit ImageSetAntialiasing ImageSetBackgroundColor ' + 
+						'ImageSetDrawingColor ImageSetDrawingStroke ImageSetDrawingTransparency ImageSharpen ImageShear ImageShearDrawingAxis ImageTranslate ' + 
+						'ImageTranslateDrawingAxis ImageWrite ImageWriteBase64 ImageXORDrawingMode IncrementValue InputBaseN Insert Int IsArray IsBinary ' + 
+						'IsBoolean IsCustomFunction IsDate IsDDX IsDebugMode IsDefined IsImage IsImageFile IsInstanceOf IsJSON IsLeapYear IsLocalHost ' + 
+						'IsNumeric IsNumericDate IsObject IsPDFFile IsPDFObject IsQuery IsSimpleValue IsSOAPRequest IsStruct IsUserInAnyRole IsUserInRole ' + 
+						'IsUserLoggedIn IsValid IsWDDX IsXML IsXmlAttribute IsXmlDoc IsXmlElem IsXmlNode IsXmlRoot JavaCast JSStringFormat LCase Left Len ' + 
+						'ListAppend ListChangeDelims ListContains ListContainsNoCase ListDeleteAt ListFind ListFindNoCase ListFirst ListGetAt ListInsertAt ' + 
+						'ListLast ListLen ListPrepend ListQualify ListRest ListSetAt ListSort ListToArray ListValueCount ListValueCountNoCase LJustify Log ' + 
+						'Log10 LSCurrencyFormat LSDateFormat LSEuroCurrencyFormat LSIsCurrency LSIsDate LSIsNumeric LSNumberFormat LSParseCurrency LSParseDateTime ' + 
+						'LSParseEuroCurrency LSParseNumber LSTimeFormat LTrim Max Mid Min Minute Month MonthAsString Now NumberFormat ParagraphFormat ParseDateTime ' + 
+						'Pi PrecisionEvaluate PreserveSingleQuotes Quarter QueryAddColumn QueryAddRow QueryConvertForGrid QueryNew QuerySetCell QuotedValueList Rand ' + 
+						'Randomize RandRange REFind REFindNoCase ReleaseComObject REMatch REMatchNoCase RemoveChars RepeatString Replace ReplaceList ReplaceNoCase ' + 
+						'REReplace REReplaceNoCase Reverse Right RJustify Round RTrim Second SendGatewayMessage SerializeJSON SetEncoding SetLocale SetProfileString ' + 
+						'SetVariable Sgn Sin Sleep SpanExcluding SpanIncluding Sqr StripCR StructAppend StructClear StructCopy StructCount StructDelete StructFind ' + 
+						'StructFindKey StructFindValue StructGet StructInsert StructIsEmpty StructKeyArray StructKeyExists StructKeyList StructKeyList StructNew ' + 
+						'StructSort StructUpdate Tan TimeFormat ToBase64 ToBinary ToScript ToString Trim UCase URLDecode URLEncodedFormat URLSessionFormat Val ' + 
+						'ValueList VerifyClient Week Wrap Wrap WriteOutput XmlChildPos XmlElemNew XmlFormat XmlGetNodeType XmlNew XmlParse XmlSearch XmlTransform ' + 
+						'XmlValidate Year YesNoFormat';
+
+		var keywords =	'cfabort cfajaximport cfajaxproxy cfapplet cfapplication cfargument cfassociate cfbreak cfcache cfcalendar ' + 
+						'cfcase cfcatch cfchart cfchartdata cfchartseries cfcol cfcollection cfcomponent cfcontent cfcookie cfdbinfo ' + 
+						'cfdefaultcase cfdirectory cfdiv cfdocument cfdocumentitem cfdocumentsection cfdump cfelse cfelseif cferror ' + 
+						'cfexchangecalendar cfexchangeconnection cfexchangecontact cfexchangefilter cfexchangemail cfexchangetask ' + 
+						'cfexecute cfexit cffeed cffile cfflush cfform cfformgroup cfformitem cfftp cffunction cfgrid cfgridcolumn ' + 
+						'cfgridrow cfgridupdate cfheader cfhtmlhead cfhttp cfhttpparam cfif cfimage cfimport cfinclude cfindex ' + 
+						'cfinput cfinsert cfinterface cfinvoke cfinvokeargument cflayout cflayoutarea cfldap cflocation cflock cflog ' + 
+						'cflogin cfloginuser cflogout cfloop cfmail cfmailparam cfmailpart cfmenu cfmenuitem cfmodule cfNTauthenticate ' + 
+						'cfobject cfobjectcache cfoutput cfparam cfpdf cfpdfform cfpdfformparam cfpdfparam cfpdfsubform cfpod cfpop ' + 
+						'cfpresentation cfpresentationslide cfpresenter cfprint cfprocessingdirective cfprocparam cfprocresult ' + 
+						'cfproperty cfquery cfqueryparam cfregistry cfreport cfreportparam cfrethrow cfreturn cfsavecontent cfschedule ' + 
+						'cfscript cfsearch cfselect cfset cfsetting cfsilent cfslider cfsprydataset cfstoredproc cfswitch cftable ' + 
+						'cftextarea cfthread cfthrow cftimer cftooltip cftrace cftransaction cftree cftreeitem cftry cfupdate cfwddx ' + 
+						'cfwindow cfxml cfzip cfzipparam';
+
+		var operators =	'all and any between cross in join like not null or outer some';
+
+		this.regexList = [
+			{ regex: new RegExp('--(.*)$', 'gm'),						css: 'comments' },  // one line and multiline comments
+			{ regex: SyntaxHighlighter.regexLib.xmlComments,			css: 'comments' },    // single quoted strings
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },    // double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },    // single quoted strings
+			{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),		css: 'functions' }, // functions
+			{ regex: new RegExp(this.getKeywords(operators), 'gmi'),	css: 'color1' },    // operators and such
+			{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),		css: 'keyword' }    // keyword
+			];
+	}
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['coldfusion','cf'];
+	
+	SyntaxHighlighter.brushes.ColdFusion = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Copyright 2006 Shin, YoungJin
+	
+		var datatypes =	'ATOM BOOL BOOLEAN BYTE CHAR COLORREF DWORD DWORDLONG DWORD_PTR ' +
+						'DWORD32 DWORD64 FLOAT HACCEL HALF_PTR HANDLE HBITMAP HBRUSH ' +
+						'HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP ' +
+						'HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HINSTANCE HKEY ' +
+						'HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRESULT ' +
+						'HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 INT64 LANGID LCID LCTYPE ' +
+						'LGRPID LONG LONGLONG LONG_PTR LONG32 LONG64 LPARAM LPBOOL LPBYTE LPCOLORREF ' +
+						'LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR ' +
+						'LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWSTR ' +
+						'PDWORDLONG PDWORD_PTR PDWORD32 PDWORD64 PFLOAT PHALF_PTR PHANDLE PHKEY PINT ' +
+						'PINT_PTR PINT32 PINT64 PLCID PLONG PLONGLONG PLONG_PTR PLONG32 PLONG64 POINTER_32 ' +
+						'POINTER_64 PSHORT PSIZE_T PSSIZE_T PSTR PTBYTE PTCHAR PTSTR PUCHAR PUHALF_PTR ' +
+						'PUINT PUINT_PTR PUINT32 PUINT64 PULONG PULONGLONG PULONG_PTR PULONG32 PULONG64 ' +
+						'PUSHORT PVOID PWCHAR PWORD PWSTR SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SHORT ' +
+						'SIZE_T SSIZE_T TBYTE TCHAR UCHAR UHALF_PTR UINT UINT_PTR UINT32 UINT64 ULONG ' +
+						'ULONGLONG ULONG_PTR ULONG32 ULONG64 USHORT USN VOID WCHAR WORD WPARAM WPARAM WPARAM ' +
+						'char bool short int __int32 __int64 __int8 __int16 long float double __wchar_t ' +
+						'clock_t _complex _dev_t _diskfree_t div_t ldiv_t _exception _EXCEPTION_POINTERS ' +
+						'FILE _finddata_t _finddatai64_t _wfinddata_t _wfinddatai64_t __finddata64_t ' +
+						'__wfinddata64_t _FPIEEE_RECORD fpos_t _HEAPINFO _HFILE lconv intptr_t ' +
+						'jmp_buf mbstate_t _off_t _onexit_t _PNH ptrdiff_t _purecall_handler ' +
+						'sig_atomic_t size_t _stat __stat64 _stati64 terminate_function ' +
+						'time_t __time64_t _timeb __timeb64 tm uintptr_t _utimbuf ' +
+						'va_list wchar_t wctrans_t wctype_t wint_t signed';
+
+		var keywords =	'auto break case catch class const decltype __finally __exception __try ' +
+						'const_cast continue private public protected __declspec ' +
+						'default delete deprecated dllexport dllimport do dynamic_cast ' +
+						'else enum explicit extern if for friend goto inline ' +
+						'mutable naked namespace new noinline noreturn nothrow ' +
+						'register reinterpret_cast return selectany ' +
+						'sizeof static static_cast struct switch template this ' +
+						'thread throw true false try typedef typeid typename union ' +
+						'using uuid virtual void volatile whcar_t while';
+					
+		var functions =	'assert isalnum isalpha iscntrl isdigit isgraph islower isprint' +
+						'ispunct isspace isupper isxdigit tolower toupper errno localeconv ' +
+						'setlocale acos asin atan atan2 ceil cos cosh exp fabs floor fmod ' +
+						'frexp ldexp log log10 modf pow sin sinh sqrt tan tanh jmp_buf ' +
+						'longjmp setjmp raise signal sig_atomic_t va_arg va_end va_start ' +
+						'clearerr fclose feof ferror fflush fgetc fgetpos fgets fopen ' +
+						'fprintf fputc fputs fread freopen fscanf fseek fsetpos ftell ' +
+						'fwrite getc getchar gets perror printf putc putchar puts remove ' +
+						'rename rewind scanf setbuf setvbuf sprintf sscanf tmpfile tmpnam ' +
+						'ungetc vfprintf vprintf vsprintf abort abs atexit atof atoi atol ' +
+						'bsearch calloc div exit free getenv labs ldiv malloc mblen mbstowcs ' +
+						'mbtowc qsort rand realloc srand strtod strtol strtoul system ' +
+						'wcstombs wctomb memchr memcmp memcpy memmove memset strcat strchr ' +
+						'strcmp strcoll strcpy strcspn strerror strlen strncat strncmp ' +
+						'strncpy strpbrk strrchr strspn strstr strtok strxfrm asctime ' +
+						'clock ctime difftime gmtime localtime mktime strftime time';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },			// one line comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },			// multiline comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },			// strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },			// strings
+			{ regex: /^ *#.*/gm,										css: 'preprocessor' },
+			{ regex: new RegExp(this.getKeywords(datatypes), 'gm'),		css: 'color1 bold' },
+			{ regex: new RegExp(this.getKeywords(functions), 'gm'),		css: 'functions bold' },
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword bold' }
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['cpp', 'c'];
+
+	SyntaxHighlighter.brushes.Cpp = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'abstract as base bool break byte case catch char checked class const ' +
+						'continue decimal default delegate do double else enum event explicit volatile ' +
+						'extern false finally fixed float for foreach get goto if implicit in int ' +
+						'interface internal is lock long namespace new null object operator out ' +
+						'override params private protected public readonly ref return sbyte sealed set ' +
+						'short sizeof stackalloc static string struct switch this throw true try ' +
+						'typeof uint ulong unchecked unsafe ushort using virtual void while var ' +
+						'from group by into select let where orderby join on equals ascending descending';
+
+		function fixComments(match, regexInfo)
+		{
+			var css = (match[0].indexOf("///") == 0)
+				? 'color1'
+				: 'comments'
+				;
+			
+			return [new SyntaxHighlighter.Match(match[0], match.index, css)];
+		}
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	func : fixComments },		// one line comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },			// multiline comments
+			{ regex: /@"(?:[^"]|"")*"/g,								css: 'string' },			// @-quoted strings
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },			// strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },			// strings
+			{ regex: /^\s*#.*/gm,										css: 'preprocessor' },		// preprocessor tags like #region and #endregion
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' },			// c# keyword
+			{ regex: /\bpartial(?=\s+(?:class|interface|struct)\b)/g,	css: 'keyword' },			// contextual keyword: 'partial'
+			{ regex: /\byield(?=\s+(?:return|break)\b)/g,				css: 'keyword' }			// contextual keyword: 'yield'
+			];
+		
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['c#', 'c-sharp', 'csharp'];
+
+	SyntaxHighlighter.brushes.CSharp = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		function getKeywordsCSS(str)
+		{
+			return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b';
+		};
+	
+		function getValuesCSS(str)
+		{
+			return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b';
+		};
+
+		var keywords =	'ascent azimuth background-attachment background-color background-image background-position ' +
+						'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
+						'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
+						'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
+						'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
+						'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
+						'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
+						'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
+						'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
+						'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
+						'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
+						'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
+						'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
+						'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
+
+		var values =	'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
+						'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
+						'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double '+
+						'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
+						'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
+						'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
+						'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
+						'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
+						'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
+						'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
+						'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
+						'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
+						'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
+						'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
+
+		var fonts =		'[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';
+	
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },	// multiline comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },	// double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },	// single quoted strings
+			{ regex: /\#[a-fA-F0-9]{3,6}/g,								css: 'value' },		// html colors
+			{ regex: /(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)/g,				css: 'value' },		// sizes
+			{ regex: /!important/g,										css: 'color3' },	// !important
+			{ regex: new RegExp(getKeywordsCSS(keywords), 'gm'),		css: 'keyword' },	// keywords
+			{ regex: new RegExp(getValuesCSS(values), 'g'),				css: 'value' },		// values
+			{ regex: new RegExp(this.getKeywords(fonts), 'g'),			css: 'color1' }		// fonts
+			];
+
+		this.forHtmlScript({ 
+			left: /(&lt;|<)\s*style.*?(&gt;|>)/gi, 
+			right: /(&lt;|<)\/\s*style\s*(&gt;|>)/gi 
+			});
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['css'];
+
+	SyntaxHighlighter.brushes.CSS = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'abs addr and ansichar ansistring array as asm begin boolean byte cardinal ' +
+						'case char class comp const constructor currency destructor div do double ' +
+						'downto else end except exports extended false file finalization finally ' +
+						'for function goto if implementation in inherited int64 initialization ' +
+						'integer interface is label library longint longword mod nil not object ' +
+						'of on or packed pansichar pansistring pchar pcurrency pdatetime pextended ' +
+						'pint64 pointer private procedure program property pshortstring pstring ' +
+						'pvariant pwidechar pwidestring protected public published raise real real48 ' +
+						'record repeat set shl shortint shortstring shr single smallint string then ' +
+						'threadvar to true try type unit until uses val var varirnt while widechar ' +
+						'widestring with word write writeln xor';
+
+		this.regexList = [
+			{ regex: /\(\*[\s\S]*?\*\)/gm,								css: 'comments' },  	// multiline comments (* *)
+			{ regex: /{(?!\$)[\s\S]*?}/gm,								css: 'comments' },  	// multiline comments { }
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },  	// one line
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },		// strings
+			{ regex: /\{\$[a-zA-Z]+ .+\}/g,								css: 'color1' },		// compiler Directives and Region tags
+			{ regex: /\b[\d\.]+\b/g,									css: 'value' },			// numbers 12345
+			{ regex: /\$[a-zA-Z0-9]+\b/g,								css: 'value' },			// numbers $F5D3
+			{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),		css: 'keyword' }		// keyword
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['delphi', 'pascal', 'pas'];
+
+	SyntaxHighlighter.brushes.Delphi = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		this.regexList = [
+			{ regex: /^\+\+\+ .*$/gm,	css: 'color2' },	// new file
+			{ regex: /^\-\-\- .*$/gm,	css: 'color2' },	// old file
+			{ regex: /^\s.*$/gm,		css: 'color1' },	// unchanged
+			{ regex: /^@@.*@@.*$/gm,	css: 'variable' },	// location
+			{ regex: /^\+.*$/gm,		css: 'string' },	// additions
+			{ regex: /^\-.*$/gm,		css: 'color3' }		// deletions
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['diff', 'patch'];
+
+	SyntaxHighlighter.brushes.Diff = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Jean-Lou Dupont
+		// http://jldupont.blogspot.com/2009/06/erlang-syntax-highlighter.html  
+
+		// According to: http://erlang.org/doc/reference_manual/introduction.html#1.5
+		var keywords = 'after and andalso band begin bnot bor bsl bsr bxor '+
+			'case catch cond div end fun if let not of or orelse '+
+			'query receive rem try when xor'+
+			// additional
+			' module export import define';
+
+		this.regexList = [
+			{ regex: new RegExp("[A-Z][A-Za-z0-9_]+", 'g'), 			css: 'constants' },
+			{ regex: new RegExp("\\%.+", 'gm'), 						css: 'comments' },
+			{ regex: new RegExp("\\?[A-Za-z0-9_]+", 'g'), 				css: 'preprocessor' },
+			{ regex: new RegExp("[a-z0-9_]+:[a-z0-9_]+", 'g'), 			css: 'functions' },
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },
+			{ regex: new RegExp(this.getKeywords(keywords),	'gm'),		css: 'keyword' }
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['erl', 'erlang'];
+
+	SyntaxHighlighter.brushes.Erland = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Andres Almiray
+		// http://jroller.com/aalmiray/entry/nice_source_code_syntax_highlighter
+
+		var keywords =	'as assert break case catch class continue def default do else extends finally ' +
+						'if in implements import instanceof interface new package property return switch ' +
+						'throw throws try while public protected private static';
+		var types    =  'void boolean byte char short int long float double';
+		var constants = 'null';
+		var methods   = 'allProperties count get size '+
+						'collect each eachProperty eachPropertyName eachWithIndex find findAll ' +
+						'findIndexOf grep inject max min reverseEach sort ' +
+						'asImmutable asSynchronized flatten intersect join pop reverse subMap toList ' +
+						'padRight padLeft contains eachMatch toCharacter toLong toUrl tokenize ' +
+						'eachFile eachFileRecurse eachB yte eachLine readBytes readLine getText ' +
+						'splitEachLine withReader append encodeBase64 decodeBase64 filterLine ' +
+						'transformChar transformLine withOutputStream withPrintWriter withStream ' +
+						'withStreams withWriter withWriterAppend write writeLine '+
+						'dump inspect invokeMethod print println step times upto use waitForOrKill '+
+						'getText';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,				css: 'comments' },		// one line comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,					css: 'comments' },		// multiline comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,					css: 'string' },		// strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,					css: 'string' },		// strings
+			{ regex: /""".*"""/g,													css: 'string' },		// GStrings
+			{ regex: new RegExp('\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b', 'gi'),	css: 'value' },			// numbers
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),					css: 'keyword' },		// goovy keyword
+			{ regex: new RegExp(this.getKeywords(types), 'gm'),						css: 'color1' },		// goovy/java type
+			{ regex: new RegExp(this.getKeywords(constants), 'gm'),					css: 'constants' },		// constants
+			{ regex: new RegExp(this.getKeywords(methods), 'gm'),					css: 'functions' }		// methods
+			];
+
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	}
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['groovy'];
+
+	SyntaxHighlighter.brushes.Groovy = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'abstract assert boolean break byte case catch char class const ' +
+						'continue default do double else enum extends ' +
+						'false final finally float for goto if implements import ' +
+						'instanceof int interface long native new null ' +
+						'package private protected public return ' +
+						'short static strictfp super switch synchronized this throw throws true ' +
+						'transient try void volatile while';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },		// one line comments
+			{ regex: /\/\*([^\*][\s\S]*)?\*\//gm,						css: 'comments' },	 	// multiline comments
+			{ regex: /\/\*(?!\*\/)\*[\s\S]*?\*\//gm,					css: 'preprocessor' },	// documentation comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },		// strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },		// strings
+			{ regex: /\b([\d]+(\.[\d]+)?|0x[a-f0-9]+)\b/gi,				css: 'value' },			// numbers
+			{ regex: /(?!\@interface\b)\@[\$\w]+\b/g,					css: 'color1' },		// annotation @anno
+			{ regex: /\@interface\b/g,									css: 'color2' },		// @interface keyword
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' }		// java keyword
+			];
+
+		this.forHtmlScript({
+			left	: /(&lt;|<)%[@!=]?/g, 
+			right	: /%(&gt;|>)/g 
+		});
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['java'];
+
+	SyntaxHighlighter.brushes.Java = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Patrick Webster
+		// http://patrickwebster.blogspot.com/2009/04/javafx-brush-for-syntaxhighlighter.html
+		var datatypes =	'Boolean Byte Character Double Duration '
+						+ 'Float Integer Long Number Short String Void'
+						;
+
+		var keywords = 'abstract after and as assert at before bind bound break catch class '
+						+ 'continue def delete else exclusive extends false finally first for from '
+						+ 'function if import in indexof init insert instanceof into inverse last '
+						+ 'lazy mixin mod nativearray new not null on or override package postinit '
+						+ 'protected public public-init public-read replace return reverse sizeof '
+						+ 'step super then this throw true try tween typeof var where while with '
+						+ 'attribute let private readonly static trigger'
+						;
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },
+			{ regex: /(-?\.?)(\b(\d*\.?\d+|\d+\.?\d*)(e[+-]?\d+)?|0x[a-f\d]+)\b\.?/gi, css: 'color2' },	// numbers
+			{ regex: new RegExp(this.getKeywords(datatypes), 'gm'),		css: 'variable' },	// datatypes
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' }
+		];
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['jfx', 'javafx'];
+
+	SyntaxHighlighter.brushes.JavaFX = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'break case catch continue ' +
+						'default delete do else false  ' +
+						'for function if in instanceof ' +
+						'new null return super switch ' +
+						'this throw true try typeof var while with'
+						;
+
+		var r = SyntaxHighlighter.regexLib;
+		
+		this.regexList = [
+			{ regex: r.multiLineDoubleQuotedString,					css: 'string' },			// double quoted strings
+			{ regex: r.multiLineSingleQuotedString,					css: 'string' },			// single quoted strings
+			{ regex: r.singleLineCComments,							css: 'comments' },			// one line comments
+			{ regex: r.multiLineCComments,							css: 'comments' },			// multiline comments
+			{ regex: /\s*#.*/gm,									css: 'preprocessor' },		// preprocessor tags like #region and #endregion
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),	css: 'keyword' }			// keywords
+			];
+	
+		this.forHtmlScript(r.scriptScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['js', 'jscript', 'javascript'];
+
+	SyntaxHighlighter.brushes.JScript = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by David Simmons-Duffin and Marty Kube
+	
+		var funcs = 
+			'abs accept alarm atan2 bind binmode chdir chmod chomp chop chown chr ' + 
+			'chroot close closedir connect cos crypt defined delete each endgrent ' + 
+			'endhostent endnetent endprotoent endpwent endservent eof exec exists ' + 
+			'exp fcntl fileno flock fork format formline getc getgrent getgrgid ' + 
+			'getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr ' + 
+			'getnetbyname getnetent getpeername getpgrp getppid getpriority ' + 
+			'getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid ' + 
+			'getservbyname getservbyport getservent getsockname getsockopt glob ' + 
+			'gmtime grep hex index int ioctl join keys kill lc lcfirst length link ' + 
+			'listen localtime lock log lstat map mkdir msgctl msgget msgrcv msgsnd ' + 
+			'oct open opendir ord pack pipe pop pos print printf prototype push ' + 
+			'quotemeta rand read readdir readline readlink readpipe recv rename ' + 
+			'reset reverse rewinddir rindex rmdir scalar seek seekdir select semctl ' + 
+			'semget semop send setgrent sethostent setnetent setpgrp setpriority ' + 
+			'setprotoent setpwent setservent setsockopt shift shmctl shmget shmread ' + 
+			'shmwrite shutdown sin sleep socket socketpair sort splice split sprintf ' + 
+			'sqrt srand stat study substr symlink syscall sysopen sysread sysseek ' + 
+			'system syswrite tell telldir time times tr truncate uc ucfirst umask ' + 
+			'undef unlink unpack unshift utime values vec wait waitpid warn write ' +
+			// feature
+			'say';
+    
+		var keywords =  
+			'bless caller continue dbmclose dbmopen die do dump else elsif eval exit ' +
+			'for foreach goto if import last local my next no our package redo ref ' + 
+			'require return sub tie tied unless untie until use wantarray while ' +
+			// feature
+			'given when default ' +
+			// Try::Tiny
+			'try catch finally ' +
+			// Moose
+			'has extends with before after around override augment';
+    
+		this.regexList = [
+			{ regex: /(<<|&lt;&lt;)((\w+)|(['"])(.+?)\4)[\s\S]+?\n\3\5\n/g,	css: 'string' },	// here doc (maybe html encoded)
+			{ regex: /#.*$/gm,										css: 'comments' },
+			{ regex: /^#!.*\n/g,									css: 'preprocessor' },	// shebang
+			{ regex: /-?\w+(?=\s*=(>|&gt;))/g,	css: 'string' }, // fat comma
+
+			// is this too much?
+			{ regex: /\bq[qwxr]?\([\s\S]*?\)/g,	css: 'string' }, // quote-like operators ()
+			{ regex: /\bq[qwxr]?\{[\s\S]*?\}/g,	css: 'string' }, // quote-like operators {}
+			{ regex: /\bq[qwxr]?\[[\s\S]*?\]/g,	css: 'string' }, // quote-like operators []
+			{ regex: /\bq[qwxr]?(<|&lt;)[\s\S]*?(>|&gt;)/g,	css: 'string' }, // quote-like operators <>
+			{ regex: /\bq[qwxr]?([^\w({<[])[\s\S]*?\1/g,	css: 'string' }, // quote-like operators non-paired
+
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,	css: 'string' },
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,	css: 'string' },
+			// currently ignoring single quote package separator and utf8 names
+			{ regex: /(?:&amp;|[$@%*]|\$#)[a-zA-Z_](\w+|::)*/g,   		css: 'variable' },
+			{ regex: /\b__(?:END|DATA)__\b[\s\S]*$/g,				css: 'comments' },
+			{ regex: /(^|\n)=\w[\s\S]*?(\n=cut\s*\n|$)/g,				css: 'comments' },		// pod
+			{ regex: new RegExp(this.getKeywords(funcs), 'gm'),		css: 'functions' },
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),	css: 'keyword' }
+		];
+
+		this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags);
+	}
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases		= ['perl', 'Perl', 'pl'];
+
+	SyntaxHighlighter.brushes.Perl = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var funcs	=	'abs acos acosh addcslashes addslashes ' +
+						'array_change_key_case array_chunk array_combine array_count_values array_diff '+
+						'array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill '+
+						'array_filter array_flip array_intersect array_intersect_assoc array_intersect_key '+
+						'array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map '+
+						'array_merge array_merge_recursive array_multisort array_pad array_pop array_product '+
+						'array_push array_rand array_reduce array_reverse array_search array_shift '+
+						'array_slice array_splice array_sum array_udiff array_udiff_assoc '+
+						'array_udiff_uassoc array_uintersect array_uintersect_assoc '+
+						'array_uintersect_uassoc array_unique array_unshift array_values array_walk '+
+						'array_walk_recursive atan atan2 atanh base64_decode base64_encode base_convert '+
+						'basename bcadd bccomp bcdiv bcmod bcmul bindec bindtextdomain bzclose bzcompress '+
+						'bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite ceil chdir '+
+						'checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split class_exists '+
+						'closedir closelog copy cos cosh count count_chars date decbin dechex decoct '+
+						'deg2rad delete ebcdic2ascii echo empty end ereg ereg_replace eregi eregi_replace error_log '+
+						'error_reporting escapeshellarg escapeshellcmd eval exec exit exp explode extension_loaded '+
+						'feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents '+
+						'fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype '+
+						'floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread fscanf '+
+						'fseek fsockopen fstat ftell ftok getallheaders getcwd getdate getenv gethostbyaddr gethostbyname '+
+						'gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt '+
+						'getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext '+
+						'gettimeofday gettype glob gmdate gmmktime ini_alter ini_get ini_get_all ini_restore ini_set '+
+						'interface_exists intval ip2long is_a is_array is_bool is_callable is_dir is_double '+
+						'is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long '+
+						'is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault '+
+						'is_string is_subclass_of is_uploaded_file is_writable is_writeable mkdir mktime nl2br '+
+						'parse_ini_file parse_str parse_url passthru pathinfo print readlink realpath rewind rewinddir rmdir '+
+						'round str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split '+
+						'str_word_count strcasecmp strchr strcmp strcoll strcspn strftime strip_tags stripcslashes '+
+						'stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk '+
+						'strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime '+
+						'strtoupper strtr strval substr substr_compare';
+
+		var keywords =	'abstract and array as break case catch cfunction class clone const continue declare default die do ' +
+						'else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach ' +
+						'function global goto if implements include include_once interface instanceof insteadof namespace new ' +
+						'old_function or private protected public return require require_once static switch ' +
+						'trait throw try use var while xor ';
+		
+		var constants	= '__FILE__ __LINE__ __METHOD__ __FUNCTION__ __CLASS__';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },			// one line comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },			// multiline comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },			// double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },			// single quoted strings
+			{ regex: /\$\w+/g,											css: 'variable' },			// variables
+			{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),		css: 'functions' },			// common functions
+			{ regex: new RegExp(this.getKeywords(constants), 'gmi'),	css: 'constants' },			// constants
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' }			// keyword
+			];
+
+		this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['php'];
+
+	SyntaxHighlighter.brushes.Php = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['text', 'plain'];
+
+	SyntaxHighlighter.brushes.Plain = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Joel 'Jaykul' Bennett, http://PoshCode.org | http://HuddledMasses.org
+		var keywords =	'while validateset validaterange validatepattern validatelength validatecount ' +
+						'until trap switch return ref process param parameter in if global: '+
+						'function foreach for finally filter end elseif else dynamicparam do default ' +
+						'continue cmdletbinding break begin alias \\? % #script #private #local #global '+
+						'mandatory parametersetname position valuefrompipeline ' +
+						'valuefrompipelinebypropertyname valuefromremainingarguments helpmessage ';
+
+		var operators =	' and as band bnot bor bxor casesensitive ccontains ceq cge cgt cle ' +
+						'clike clt cmatch cne cnotcontains cnotlike cnotmatch contains ' +
+						'creplace eq exact f file ge gt icontains ieq ige igt ile ilike ilt ' +
+						'imatch ine inotcontains inotlike inotmatch ireplace is isnot le like ' +
+						'lt match ne not notcontains notlike notmatch or regex replace wildcard';
+						
+		var verbs =		'write where wait use update unregister undo trace test tee take suspend ' +
+						'stop start split sort skip show set send select scroll resume restore ' +
+						'restart resolve resize reset rename remove register receive read push ' +
+						'pop ping out new move measure limit join invoke import group get format ' +
+						'foreach export expand exit enter enable disconnect disable debug cxnew ' +
+						'copy convertto convertfrom convert connect complete compare clear ' +
+						'checkpoint aggregate add';
+
+		// I can't find a way to match the comment based help in multi-line comments, because SH won't highlight in highlights, and javascript doesn't support lookbehind
+		var commenthelp = ' component description example externalhelp forwardhelpcategory forwardhelptargetname forwardhelptargetname functionality inputs link notes outputs parameter remotehelprunspace role synopsis';
+
+		this.regexList = [
+			{ regex: new RegExp('^\\s*#[#\\s]*\\.('+this.getKeywords(commenthelp)+').*$', 'gim'),			css: 'preprocessor help bold' },		// comment-based help
+			{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments,										css: 'comments' },						// one line comments
+			{ regex: /(&lt;|<)#[\s\S]*?#(&gt;|>)/gm,														css: 'comments here' },					// multi-line comments
+			
+			{ regex: new RegExp('@"\\n[\\s\\S]*?\\n"@', 'gm'),												css: 'script string here' },			// double quoted here-strings
+			{ regex: new RegExp("@'\\n[\\s\\S]*?\\n'@", 'gm'),												css: 'script string single here' },		// single quoted here-strings
+			{ regex: new RegExp('"(?:\\$\\([^\\)]*\\)|[^"]|`"|"")*[^`]"','g'),								css: 'string' },						// double quoted strings
+			{ regex: new RegExp("'(?:[^']|'')*'", 'g'),														css: 'string single' },					// single quoted strings
+			
+			{ regex: new RegExp('[\\$|@|@@](?:(?:global|script|private|env):)?[A-Z0-9_]+', 'gi'),			css: 'variable' },						// $variables
+			{ regex: new RegExp('(?:\\b'+verbs.replace(/ /g, '\\b|\\b')+')-[a-zA-Z_][a-zA-Z0-9_]*', 'gmi'),	css: 'functions' },						// functions and cmdlets
+			{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),											css: 'keyword' },						// keywords
+			{ regex: new RegExp('-'+this.getKeywords(operators), 'gmi'),									css: 'operator value' },				// operators
+			{ regex: new RegExp('\\[[A-Z_\\[][A-Z0-9_. `,\\[\\]]*\\]', 'gi'),								css: 'constants' },						// .Net [Type]s
+			{ regex: new RegExp('\\s+-(?!'+this.getKeywords(operators)+')[a-zA-Z_][a-zA-Z0-9_]*', 'gmi'),	css: 'color1' },						// parameters	  
+		];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['powershell', 'ps', 'posh'];
+
+	SyntaxHighlighter.brushes.PowerShell = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Gheorghe Milas and Ahmad Sherif
+	
+		var keywords =  'and assert break class continue def del elif else ' +
+						'except exec finally for from global if import in is ' +
+						'lambda not or pass print raise return try yield while';
+
+		var funcs = '__import__ abs all any apply basestring bin bool buffer callable ' +
+					'chr classmethod cmp coerce compile complex delattr dict dir ' +
+					'divmod enumerate eval execfile file filter float format frozenset ' +
+					'getattr globals hasattr hash help hex id input int intern ' +
+					'isinstance issubclass iter len list locals long map max min next ' +
+					'object oct open ord pow print property range raw_input reduce ' +
+					'reload repr reversed round set setattr slice sorted staticmethod ' +
+					'str sum super tuple type type unichr unicode vars xrange zip';
+
+		var special =  'None True False self cls class_';
+
+		this.regexList = [
+				{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' },
+				{ regex: /^\s*@\w+/gm, 										css: 'decorator' },
+				{ regex: /(['\"]{3})([^\1])*?\1/gm, 						css: 'comments' },
+				{ regex: /"(?!")(?:\.|\\\"|[^\""\n])*"/gm, 					css: 'string' },
+				{ regex: /'(?!')(?:\.|(\\\')|[^\''\n])*'/gm, 				css: 'string' },
+				{ regex: /\+|\-|\*|\/|\%|=|==/gm, 							css: 'keyword' },
+				{ regex: /\b\d+\.?\w*/g, 									css: 'value' },
+				{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),		css: 'functions' },
+				{ regex: new RegExp(this.getKeywords(keywords), 'gm'), 		css: 'keyword' },
+				{ regex: new RegExp(this.getKeywords(special), 'gm'), 		css: 'color1' }
+				];
+			
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['py', 'python'];
+
+	SyntaxHighlighter.brushes.Python = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Erik Peterson.
+	
+		var keywords =	'alias and BEGIN begin break case class def define_method defined do each else elsif ' +
+						'END end ensure false for if in module new next nil not or raise redo rescue retry return ' +
+						'self super then throw true undef unless until when while yield';
+
+		var builtins =	'Array Bignum Binding Class Continuation Dir Exception FalseClass File::Stat File Fixnum Fload ' +
+						'Hash Integer IO MatchData Method Module NilClass Numeric Object Proc Range Regexp String Struct::TMS Symbol ' +
+						'ThreadGroup Thread Time TrueClass';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments,	css: 'comments' },		// one line comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },		// double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },		// single quoted strings
+			{ regex: /\b[A-Z0-9_]+\b/g,									css: 'constants' },		// constants
+			{ regex: /:[a-z][A-Za-z0-9_]*/g,							css: 'color2' },		// symbols
+			{ regex: /(\$|@@|@)\w+/g,									css: 'variable bold' },	// $global, @instance, and @@class variables
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' },		// keywords
+			{ regex: new RegExp(this.getKeywords(builtins), 'gm'),		css: 'color1' }			// builtins
+			];
+
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['ruby', 'rails', 'ror', 'rb'];
+
+	SyntaxHighlighter.brushes.Ruby = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		function getKeywordsCSS(str)
+		{
+			return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b';
+		};
+	
+		function getValuesCSS(str)
+		{
+			return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b';
+		};
+
+		var keywords =	'ascent azimuth background-attachment background-color background-image background-position ' +
+						'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
+						'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
+						'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
+						'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
+						'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
+						'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
+						'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
+						'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
+						'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
+						'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
+						'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
+						'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
+						'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
+		
+		var values =	'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
+						'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
+						'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero digits disc dotted double '+
+						'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
+						'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
+						'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
+						'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
+						'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
+						'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
+						'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
+						'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
+						'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
+						'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
+						'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
+		
+		var fonts =		'[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';
+		
+		var statements		= '!important !default';
+		var preprocessor	= '@import @extend @debug @warn @if @for @while @mixin @include';
+		
+		var r = SyntaxHighlighter.regexLib;
+		
+		this.regexList = [
+			{ regex: r.multiLineCComments,								css: 'comments' },		// multiline comments
+			{ regex: r.singleLineCComments,								css: 'comments' },		// singleline comments
+			{ regex: r.doubleQuotedString,								css: 'string' },		// double quoted strings
+			{ regex: r.singleQuotedString,								css: 'string' },		// single quoted strings
+			{ regex: /\#[a-fA-F0-9]{3,6}/g,								css: 'value' },			// html colors
+			{ regex: /\b(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)\b/g,			css: 'value' },			// sizes
+			{ regex: /\$\w+/g,											css: 'variable' },		// variables
+			{ regex: new RegExp(this.getKeywords(statements), 'g'),		css: 'color3' },		// statements
+			{ regex: new RegExp(this.getKeywords(preprocessor), 'g'),	css: 'preprocessor' },	// preprocessor
+			{ regex: new RegExp(getKeywordsCSS(keywords), 'gm'),		css: 'keyword' },		// keywords
+			{ regex: new RegExp(getValuesCSS(values), 'g'),				css: 'value' },			// values
+			{ regex: new RegExp(this.getKeywords(fonts), 'g'),			css: 'color1' }			// fonts
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['sass', 'scss'];
+
+	SyntaxHighlighter.brushes.Sass = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Yegor Jbanov and David Bernard.
+	
+		var keywords =	'val sealed case def true trait implicit forSome import match object null finally super ' +
+						'override try lazy for var catch throw type extends class while with new final yield abstract ' +
+						'else do if return protected private this package false';
+
+		var keyops =	'[_:=><%#@]+';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,			css: 'comments' },	// one line comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,				css: 'comments' },	// multiline comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString,	css: 'string' },	// multi-line strings
+			{ regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString,    css: 'string' },	// double-quoted string
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,				css: 'string' },	// strings
+			{ regex: /0x[a-f0-9]+|\d+(\.\d+)?/gi,								css: 'value' },		// numbers
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),				css: 'keyword' },	// keywords
+			{ regex: new RegExp(keyops, 'gm'),									css: 'keyword' }	// scala keyword
+			];
+	}
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['scala'];
+
+	SyntaxHighlighter.brushes.Scala = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var funcs	=	'abs avg case cast coalesce convert count current_timestamp ' +
+						'current_user day isnull left lower month nullif replace right ' +
+						'session_user space substring sum system_user upper user year';
+
+		var keywords =	'absolute action add after alter as asc at authorization begin bigint ' +
+						'binary bit by cascade char character check checkpoint close collate ' +
+						'column commit committed connect connection constraint contains continue ' +
+						'create cube current current_date current_time cursor database date ' +
+						'deallocate dec decimal declare default delete desc distinct double drop ' +
+						'dynamic else end end-exec escape except exec execute false fetch first ' +
+						'float for force foreign forward free from full function global goto grant ' +
+						'group grouping having hour ignore index inner insensitive insert instead ' +
+						'int integer intersect into is isolation key last level load local max min ' +
+						'minute modify move name national nchar next no numeric of off on only ' +
+						'open option order out output partial password precision prepare primary ' +
+						'prior privileges procedure public read real references relative repeatable ' +
+						'restrict return returns revoke rollback rollup rows rule schema scroll ' +
+						'second section select sequence serializable set size smallint static ' +
+						'statistics table temp temporary then time timestamp to top transaction ' +
+						'translation trigger true truncate uncommitted union unique update values ' +
+						'varchar varying view when where with work';
+
+		var operators =	'all and any between cross in join like not null or outer some';
+
+		this.regexList = [
+			{ regex: /--(.*)$/gm,												css: 'comments' },			// one line and multiline comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString,	css: 'string' },			// double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString,	css: 'string' },			// single quoted strings
+			{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),				css: 'color2' },			// functions
+			{ regex: new RegExp(this.getKeywords(operators), 'gmi'),			css: 'color1' },			// operators and such
+			{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),				css: 'keyword' }			// keyword
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['sql'];
+
+	SyntaxHighlighter.brushes.Sql = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto ' +
+						'Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate ' +
+						'CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType ' +
+						'Date Decimal Declare Default Delegate Dim DirectCast Do Double Each ' +
+						'Else ElseIf End Enum Erase Error Event Exit False Finally For Friend ' +
+						'Function Get GetType GoSub GoTo Handles If Implements Imports In ' +
+						'Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module ' +
+						'MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing ' +
+						'NotInheritable NotOverridable Object On Option Optional Or OrElse ' +
+						'Overloads Overridable Overrides ParamArray Preserve Private Property ' +
+						'Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume ' +
+						'Return Select Set Shadows Shared Short Single Static Step Stop String ' +
+						'Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until ' +
+						'Variant When While With WithEvents WriteOnly Xor';
+
+		this.regexList = [
+			{ regex: /'.*$/gm,										css: 'comments' },			// one line comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,	css: 'string' },			// strings
+			{ regex: /^\s*#.*$/gm,									css: 'preprocessor' },		// preprocessor tags like #region and #endregion
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),	css: 'keyword' }			// vb keyword
+			];
+
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['vb', 'vbnet'];
+
+	SyntaxHighlighter.brushes.Vb = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		function process(match, regexInfo)
+		{
+			var constructor = SyntaxHighlighter.Match,
+				code = match[0],
+				tag = new XRegExp('(&lt;|<)[\\s\\/\\?]*(?<name>[:\\w-\\.]+)', 'xg').exec(code),
+				result = []
+				;
+		
+			if (match.attributes != null) 
+			{
+				var attributes,
+					regex = new XRegExp('(?<name> [\\w:\\-\\.]+)' +
+										'\\s*=\\s*' +
+										'(?<value> ".*?"|\'.*?\'|\\w+)',
+										'xg');
+
+				while ((attributes = regex.exec(code)) != null) 
+				{
+					result.push(new constructor(attributes.name, match.index + attributes.index, 'color1'));
+					result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string'));
+				}
+			}
+
+			if (tag != null)
+				result.push(
+					new constructor(tag.name, match.index + tag[0].indexOf(tag.name), 'keyword')
+				);
+
+			return result;
+		}
+	
+		this.regexList = [
+			{ regex: new XRegExp('(\\&lt;|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\&gt;|>)', 'gm'),			css: 'color2' },	// <![ ... [ ... ]]>
+			{ regex: SyntaxHighlighter.regexLib.xmlComments,												css: 'comments' },	// <!-- ... -->
+			{ regex: new XRegExp('(&lt;|<)[\\s\\/\\?]*(\\w+)(?<attributes>.*?)[\\s\\/\\?]*(&gt;|>)', 'sg'), func: process }
+		];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['xml', 'xhtml', 'xslt', 'html'];
+
+	SyntaxHighlighter.brushes.Xml = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/SyntaxHighlighter/shCoreDefault.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/SyntaxHighlighter/shCoreDefault.css
new file mode 100644
index 0000000..e156a6f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/SyntaxHighlighter/shCoreDefault.css
@@ -0,0 +1 @@
+.syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter,.syntaxhighlighter td,.syntaxhighlighter tr,.syntaxhighlighter tbody,.syntaxhighlighter thead,.syntaxhighlighter caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0!important;-webkit-border-radius:0 0 0 0!important;background:none!important;border:0!important;bottom:auto!important;float:none!important;left:auto!important;line-height:1.1em!important;margin:0!important;outline:0!important;overflow:visible!important;padding:0!important;position:static!important;right:auto!important;text-align:left!important;top:auto!important;vertical-align:baseline!important;width:auto!important;box-sizing:content-box!important;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-weight:normal!important;font-style:normal!important;min-height:inherit!important;min-height:auto!important;font-size:13px!important}.syntaxhighlighter{width:100%!important;margin:.3em 0 .3em 0!important;position:relative!important;overflow:auto!important;background-color:#f5f5f5!important;border:1px solid #ccc!important;border-radius:4px!important;border-collapse:separate!important}.syntaxhighlighter.source{overflow:hidden!important}.syntaxhighlighter .bold{font-weight:bold!important}.syntaxhighlighter .italic{font-style:italic!important}.syntaxhighlighter .gutter div{white-space:pre!important;word-wrap:normal}.syntaxhighlighter caption{text-align:left!important;padding:.5em 0 .5em 1em!important}.syntaxhighlighter td.code{width:100%!important}.syntaxhighlighter td.code .container{position:relative!important}.syntaxhighlighter td.code .container textarea{box-sizing:border-box!important;position:absolute!important;left:0!important;top:0!important;width:100%!important;border:none!important;background:white!important;padding-left:1em!important;overflow:hidden!important;white-space:pre!important}.syntaxhighlighter td.gutter .line{text-align:right!important;padding:0 .5em 0 1em!important}.syntaxhighlighter td.code .line{padding:0 1em!important}.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0!important}.syntaxhighlighter.show{display:block!important}.syntaxhighlighter.collapsed table{display:none!important}.syntaxhighlighter.collapsed .toolbar{padding:.1em .8em 0 .8em!important;font-size:1em!important;position:static!important;width:auto!important}.syntaxhighlighter.collapsed .toolbar span{display:inline!important;margin-right:1em!important}.syntaxhighlighter.collapsed .toolbar span a{padding:0!important;display:none!important}.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline!important}.syntaxhighlighter .toolbar{position:absolute!important;right:1px!important;top:1px!important;width:11px!important;height:11px!important;font-size:10px!important;z-index:10!important}.syntaxhighlighter .toolbar span.title{display:inline!important}.syntaxhighlighter .toolbar a{display:block!important;text-align:center!important;text-decoration:none!important;padding-top:1px!important}.syntaxhighlighter .toolbar a.expandSource{display:none!important}.syntaxhighlighter.ie{font-size:.9em!important;padding:1px 0 1px 0!important}.syntaxhighlighter.ie .toolbar{line-height:8px!important}.syntaxhighlighter.ie .toolbar a{padding-top:0!important}.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none!important}.syntaxhighlighter.printing .line .number{color:#bbb!important}.syntaxhighlighter.printing .line .content{color:black!important}.syntaxhighlighter.printing .toolbar{display:none!important}.syntaxhighlighter.printing a{text-decoration:none!important}.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black!important}.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200!important}.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue!important}.syntaxhighlighter.printing .keyword{color:#ff7800!important;font-weight:bold!important}.syntaxhighlighter.printing .preprocessor{color:gray!important}.syntaxhighlighter.printing .variable{color:#a70!important}.syntaxhighlighter.printing .value{color:#090!important}.syntaxhighlighter.printing .functions{color:#ff1493!important}.syntaxhighlighter.printing .constants{color:#06c!important}.syntaxhighlighter.printing .script{font-weight:bold!important}.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray!important}.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493!important}.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red!important}.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black!important}.syntaxhighlighter{background-color:#f5f5f5!important}.syntaxhighlighter .line.highlighted.number{color:black!important}.syntaxhighlighter caption{color:black!important}.syntaxhighlighter .gutter{color:#afafaf!important;background-color:#f7f7f9!important;border-right:1px solid #e1e1e8!important;padding:9.5px 0 9.5px 9.5px!important;border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;user-select:none!important;-moz-user-select:none!important;-webkit-user-select:none!important}.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c!important;color:white!important}.syntaxhighlighter.printing .line .content{border:none!important}.syntaxhighlighter.collapsed{overflow:visible!important}.syntaxhighlighter.collapsed .toolbar{color:blue!important;background:white!important;border:1px solid #6ce26c!important}.syntaxhighlighter.collapsed .toolbar a{color:blue!important}.syntaxhighlighter.collapsed .toolbar a:hover{color:red!important}.syntaxhighlighter .toolbar{color:white!important;background:#6ce26c!important;border:none!important}.syntaxhighlighter .toolbar a{color:white!important}.syntaxhighlighter .toolbar a:hover{color:black!important}.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black!important}.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200!important}.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue!important}.syntaxhighlighter .keyword{color:#ff7800!important}.syntaxhighlighter .preprocessor{color:gray!important}.syntaxhighlighter .variable{color:#a70!important}.syntaxhighlighter .value{color:#090!important}.syntaxhighlighter .functions{color:#ff1493!important}.syntaxhighlighter .constants{color:#06c!important}.syntaxhighlighter .script{font-weight:bold!important;color:#ff7800!important;background-color:none!important}.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray!important}.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493!important}.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red!important}.syntaxhighlighter .keyword{font-weight:bold!important}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/codemirror/codemirror.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/codemirror/codemirror.css
new file mode 100644
index 0000000..461ae19
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/codemirror/codemirror.css
@@ -0,0 +1,104 @@
+.CodeMirror {
+    line-height: 1em;
+    font-family: monospace;
+}
+
+.CodeMirror-scroll {
+    overflow: auto;
+    height: 300px;
+    /* This is needed to prevent an IE[67] bug where the scrolled content
+       is visible outside of the scrolling box. */
+    position: relative;
+}
+
+.CodeMirror-gutter {
+    position: absolute; left: 0; top: 0;
+    z-index: 10;
+    background-color: #f7f7f7;
+    border-right: 1px solid #eee;
+    min-width: 2em;
+    height: 100%;
+}
+.CodeMirror-gutter-text {
+    color: #aaa;
+    text-align: right;
+    padding: .4em .2em .4em .4em;
+    white-space: pre !important;
+}
+.CodeMirror-lines {
+    padding: .4em;
+}
+
+.CodeMirror pre {
+    -moz-border-radius: 0;
+    -webkit-border-radius: 0;
+    -o-border-radius: 0;
+    border-radius: 0;
+    border-width: 0; margin: 0; padding: 0; background: transparent;
+    font-family: inherit;
+    font-size: inherit;
+    padding: 0; margin: 0;
+    white-space: pre;
+    word-wrap: normal;
+}
+
+.CodeMirror-wrap pre {
+    word-wrap: break-word;
+    white-space: pre-wrap;
+}
+.CodeMirror-wrap .CodeMirror-scroll {
+    overflow-x: hidden;
+}
+
+.CodeMirror textarea {
+    outline: none !important;
+}
+
+.CodeMirror pre.CodeMirror-cursor {
+    z-index: 10;
+    position: absolute;
+    visibility: hidden;
+    border-left: 1px solid black;
+}
+.CodeMirror-focused pre.CodeMirror-cursor {
+    visibility: visible;
+}
+
+span.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused span.CodeMirror-selected { background: #d2dcf8; }
+
+.CodeMirror-searching {background: #ffa;}
+
+/* Default theme */
+
+.cm-s-default span.cm-keyword {color: #708;}
+.cm-s-default span.cm-atom {color: #219;}
+.cm-s-default span.cm-number {color: #164;}
+.cm-s-default span.cm-def {color: #00f;}
+.cm-s-default span.cm-variable {color: black;}
+.cm-s-default span.cm-variable-2 {color: #05a;}
+.cm-s-default span.cm-variable-3 {color: #085;}
+.cm-s-default span.cm-property {color: black;}
+.cm-s-default span.cm-operator {color: black;}
+.cm-s-default span.cm-comment {color: #a50;}
+.cm-s-default span.cm-string {color: #a11;}
+.cm-s-default span.cm-string-2 {color: #f50;}
+.cm-s-default span.cm-meta {color: #555;}
+.cm-s-default span.cm-error {color: #f00;}
+.cm-s-default span.cm-qualifier {color: #555;}
+.cm-s-default span.cm-builtin {color: #30a;}
+.cm-s-default span.cm-bracket {color: #cc7;}
+.cm-s-default span.cm-tag {color: #170;}
+.cm-s-default span.cm-attribute {color: #00c;}
+.cm-s-default span.cm-header {color: #a0a;}
+.cm-s-default span.cm-quote {color: #090;}
+.cm-s-default span.cm-hr {color: #999;}
+.cm-s-default span.cm-link {color: #00c;}
+
+span.cm-header, span.cm-strong {font-weight: bold;}
+span.cm-em {font-style: italic;}
+span.cm-emstrong {font-style: italic; font-weight: bold;}
+span.cm-link {text-decoration: underline;}
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/codemirror/codemirror.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/codemirror/codemirror.js
new file mode 100644
index 0000000..966c320
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/codemirror/codemirror.js
@@ -0,0 +1,3581 @@
+// CodeMirror version 2.2
+//
+// All functions that need access to the editor's state live inside
+// the CodeMirror function. Below that, at the bottom of the file,
+// some utilities are defined.
+
+// CodeMirror is the only global var we claim
+var CodeMirror = (function() {
+    // This is the function that produces an editor instance. It's
+    // closure is used to store the editor state.
+    function CodeMirror(place, givenOptions) {
+        // Determine effective options based on given values and defaults.
+        var options = {}, defaults = CodeMirror.defaults;
+        for (var opt in defaults)
+            if (defaults.hasOwnProperty(opt))
+                options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt];
+
+        var targetDocument = options["document"];
+        // The element in which the editor lives.
+        var wrapper = targetDocument.createElement("div");
+        wrapper.className = "CodeMirror" + (options.lineWrapping ? " CodeMirror-wrap" : "");
+        // This mess creates the base DOM structure for the editor.
+        wrapper.innerHTML =
+            '<div style="overflow: hidden; position: relative; width: 3px; height: 0px;">' + // Wraps and hides input textarea
+                '<textarea style="position: absolute; padding: 0; width: 1px;" wrap="off" ' +
+                'autocorrect="off" autocapitalize="off"></textarea></div>' +
+                '<div class="CodeMirror-scroll" tabindex="-1">' +
+                '<div style="position: relative">' + // Set to the height of the text, causes scrolling
+                '<div style="position: relative">' + // Moved around its parent to cover visible view
+                '<div class="CodeMirror-gutter"><div class="CodeMirror-gutter-text"></div></div>' +
+                // Provides positioning relative to (visible) text origin
+                '<div class="CodeMirror-lines"><div style="position: relative">' +
+                '<div style="position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden"></div>' +
+                '<pre class="CodeMirror-cursor">&#160;</pre>' + // Absolutely positioned blinky cursor
+                '<div></div>' + // This DIV contains the actual code
+                '</div></div></div></div></div>';
+        if (place.appendChild) place.appendChild(wrapper); else place(wrapper);
+        // I've never seen more elegant code in my life.
+        var inputDiv = wrapper.firstChild, input = inputDiv.firstChild,
+            scroller = wrapper.lastChild, code = scroller.firstChild,
+            mover = code.firstChild, gutter = mover.firstChild, gutterText = gutter.firstChild,
+            lineSpace = gutter.nextSibling.firstChild, measure = lineSpace.firstChild,
+            cursor = measure.nextSibling, lineDiv = cursor.nextSibling;
+        themeChanged();
+        // Needed to hide big blue blinking cursor on Mobile Safari
+        if (/AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent)) input.style.width = "0px";
+        if (!webkit) lineSpace.draggable = true;
+        if (options.tabindex != null) input.tabIndex = options.tabindex;
+        if (!options.gutter && !options.lineNumbers) gutter.style.display = "none";
+
+        // Check for problem with IE innerHTML not working when we have a
+        // P (or similar) parent node.
+        try { stringWidth("x"); }
+        catch (e) {
+            if (e.message.match(/runtime/i))
+                e = new Error("A CodeMirror inside a P-style element does not work in Internet Explorer. (innerHTML bug)");
+            throw e;
+        }
+
+        // Delayed object wrap timeouts, making sure only one is active. blinker holds an interval.
+        var poll = new Delayed(), highlight = new Delayed(), blinker;
+
+        // mode holds a mode API object. doc is the tree of Line objects,
+        // work an array of lines that should be parsed, and history the
+        // undo history (instance of History constructor).
+        var mode, doc = new BranchChunk([new LeafChunk([new Line("")])]), work, focused;
+        loadMode();
+        // The selection. These are always maintained to point at valid
+        // positions. Inverted is used to remember that the user is
+        // selecting bottom-to-top.
+        var sel = {from: {line: 0, ch: 0}, to: {line: 0, ch: 0}, inverted: false};
+        // Selection-related flags. shiftSelecting obviously tracks
+        // whether the user is holding shift.
+        var shiftSelecting, lastClick, lastDoubleClick, draggingText, overwrite = false;
+        // Variables used by startOperation/endOperation to track what
+        // happened during the operation.
+        var updateInput, userSelChange, changes, textChanged, selectionChanged, leaveInputAlone,
+            gutterDirty, callbacks;
+        // Current visible range (may be bigger than the view window).
+        var displayOffset = 0, showingFrom = 0, showingTo = 0, lastSizeC = 0;
+        // bracketHighlighted is used to remember that a backet has been
+        // marked.
+        var bracketHighlighted;
+        // Tracks the maximum line length so that the horizontal scrollbar
+        // can be kept static when scrolling.
+        var maxLine = "", maxWidth, tabText = computeTabText();
+
+        // Initialize the content.
+        operation(function(){setValue(options.value || ""); updateInput = false;})();
+        var history = new History();
+
+        // Register our event handlers.
+        connect(scroller, "mousedown", operation(onMouseDown));
+        connect(scroller, "dblclick", operation(onDoubleClick));
+        connect(lineSpace, "dragstart", onDragStart);
+        connect(lineSpace, "selectstart", e_preventDefault);
+        // Gecko browsers fire contextmenu *after* opening the menu, at
+        // which point we can't mess with it anymore. Context menu is
+        // handled in onMouseDown for Gecko.
+        if (!gecko) connect(scroller, "contextmenu", onContextMenu);
+        connect(scroller, "scroll", function() {
+            updateDisplay([]);
+            if (options.fixedGutter) gutter.style.left = scroller.scrollLeft + "px";
+            if (options.onScroll) options.onScroll(instance);
+        });
+        connect(window, "resize", function() {updateDisplay(true);});
+        connect(input, "keyup", operation(onKeyUp));
+        connect(input, "input", fastPoll);
+        connect(input, "keydown", operation(onKeyDown));
+        connect(input, "keypress", operation(onKeyPress));
+        connect(input, "focus", onFocus);
+        connect(input, "blur", onBlur);
+
+        connect(scroller, "dragenter", e_stop);
+        connect(scroller, "dragover", e_stop);
+        connect(scroller, "drop", operation(onDrop));
+        connect(scroller, "paste", function(){focusInput(); fastPoll();});
+        connect(input, "paste", fastPoll);
+        connect(input, "cut", operation(function(){replaceSelection("");}));
+
+        // IE throws unspecified error in certain cases, when
+        // trying to access activeElement before onload
+        var hasFocus; try { hasFocus = (targetDocument.activeElement == input); } catch(e) { }
+        if (hasFocus) setTimeout(onFocus, 20);
+        else onBlur();
+
+        function isLine(l) {return l >= 0 && l < doc.size;}
+        // The instance object that we'll return. Mostly calls out to
+        // local functions in the CodeMirror function. Some do some extra
+        // range checking and/or clipping. operation is used to wrap the
+        // call so that changes it makes are tracked, and the display is
+        // updated afterwards.
+        var instance = wrapper.CodeMirror = {
+            getValue: getValue,
+            setValue: operation(setValue),
+            getSelection: getSelection,
+            replaceSelection: operation(replaceSelection),
+            focus: function(){focusInput(); onFocus(); fastPoll();},
+            setOption: function(option, value) {
+                var oldVal = options[option];
+                options[option] = value;
+                if (option == "mode" || option == "indentUnit") loadMode();
+                else if (option == "readOnly" && value) {onBlur(); input.blur();}
+                else if (option == "theme") themeChanged();
+                else if (option == "lineWrapping" && oldVal != value) operation(wrappingChanged)();
+                else if (option == "tabSize") operation(tabsChanged)();
+                if (option == "lineNumbers" || option == "gutter" || option == "firstLineNumber" || option == "theme")
+                    operation(gutterChanged)();
+            },
+            getOption: function(option) {return options[option];},
+            undo: operation(undo),
+            redo: operation(redo),
+            indentLine: operation(function(n, dir) {
+                if (isLine(n)) indentLine(n, dir == null ? "smart" : dir ? "add" : "subtract");
+            }),
+            indentSelection: operation(indentSelected),
+            historySize: function() {return {undo: history.done.length, redo: history.undone.length};},
+            clearHistory: function() {history = new History();},
+            matchBrackets: operation(function(){matchBrackets(true);}),
+            getTokenAt: operation(function(pos) {
+                pos = clipPos(pos);
+                return getLine(pos.line).getTokenAt(mode, getStateBefore(pos.line), pos.ch);
+            }),
+            getStateAfter: function(line) {
+                line = clipLine(line == null ? doc.size - 1: line);
+                return getStateBefore(line + 1);
+            },
+            cursorCoords: function(start){
+                if (start == null) start = sel.inverted;
+                return pageCoords(start ? sel.from : sel.to);
+            },
+            charCoords: function(pos){return pageCoords(clipPos(pos));},
+            coordsChar: function(coords) {
+                var off = eltOffset(lineSpace);
+                return coordsChar(coords.x - off.left, coords.y - off.top);
+            },
+            markText: operation(markText),
+            setBookmark: setBookmark,
+            setMarker: operation(addGutterMarker),
+            clearMarker: operation(removeGutterMarker),
+            setLineClass: operation(setLineClass),
+            hideLine: operation(function(h) {return setLineHidden(h, true);}),
+            showLine: operation(function(h) {return setLineHidden(h, false);}),
+            onDeleteLine: function(line, f) {
+                if (typeof line == "number") {
+                    if (!isLine(line)) return null;
+                    line = getLine(line);
+                }
+                (line.handlers || (line.handlers = [])).push(f);
+                return line;
+            },
+            lineInfo: lineInfo,
+            addWidget: function(pos, node, scroll, vert, horiz) {
+                pos = localCoords(clipPos(pos));
+                var top = pos.yBot, left = pos.x;
+                node.style.position = "absolute";
+                code.appendChild(node);
+                if (vert == "over") top = pos.y;
+                else if (vert == "near") {
+                    var vspace = Math.max(scroller.offsetHeight, doc.height * textHeight()),
+                        hspace = Math.max(code.clientWidth, lineSpace.clientWidth) - paddingLeft();
+                    if (pos.yBot + node.offsetHeight > vspace && pos.y > node.offsetHeight)
+                        top = pos.y - node.offsetHeight;
+                    if (left + node.offsetWidth > hspace)
+                        left = hspace - node.offsetWidth;
+                }
+                node.style.top = (top + paddingTop()) + "px";
+                node.style.left = node.style.right = "";
+                if (horiz == "right") {
+                    left = code.clientWidth - node.offsetWidth;
+                    node.style.right = "0px";
+                } else {
+                    if (horiz == "left") left = 0;
+                    else if (horiz == "middle") left = (code.clientWidth - node.offsetWidth) / 2;
+                    node.style.left = (left + paddingLeft()) + "px";
+                }
+                if (scroll)
+                    scrollIntoView(left, top, left + node.offsetWidth, top + node.offsetHeight);
+            },
+
+            lineCount: function() {return doc.size;},
+            clipPos: clipPos,
+            getCursor: function(start) {
+                if (start == null) start = sel.inverted;
+                return copyPos(start ? sel.from : sel.to);
+            },
+            somethingSelected: function() {return !posEq(sel.from, sel.to);},
+            setCursor: operation(function(line, ch, user) {
+                if (ch == null && typeof line.line == "number") setCursor(line.line, line.ch, user);
+                else setCursor(line, ch, user);
+            }),
+            setSelection: operation(function(from, to, user) {
+                (user ? setSelectionUser : setSelection)(clipPos(from), clipPos(to || from));
+            }),
+            getLine: function(line) {if (isLine(line)) return getLine(line).text;},
+            getLineHandle: function(line) {if (isLine(line)) return getLine(line);},
+            setLine: operation(function(line, text) {
+                if (isLine(line)) replaceRange(text, {line: line, ch: 0}, {line: line, ch: getLine(line).text.length});
+            }),
+            removeLine: operation(function(line) {
+                if (isLine(line)) replaceRange("", {line: line, ch: 0}, clipPos({line: line+1, ch: 0}));
+            }),
+            replaceRange: operation(replaceRange),
+            getRange: function(from, to) {return getRange(clipPos(from), clipPos(to));},
+
+            execCommand: function(cmd) {return commands[cmd](instance);},
+            // Stuff used by commands, probably not much use to outside code.
+            moveH: operation(moveH),
+            deleteH: operation(deleteH),
+            moveV: operation(moveV),
+            toggleOverwrite: function() {overwrite = !overwrite;},
+
+            posFromIndex: function(off) {
+                var lineNo = 0, ch;
+                doc.iter(0, doc.size, function(line) {
+                    var sz = line.text.length + 1;
+                    if (sz > off) { ch = off; return true; }
+                    off -= sz;
+                    ++lineNo;
+                });
+                return clipPos({line: lineNo, ch: ch});
+            },
+            indexFromPos: function (coords) {
+                if (coords.line < 0 || coords.ch < 0) return 0;
+                var index = coords.ch;
+                doc.iter(0, coords.line, function (line) {
+                    index += line.text.length + 1;
+                });
+                return index;
+            },
+
+            operation: function(f){return operation(f)();},
+            refresh: function(){updateDisplay(true);},
+            getInputField: function(){return input;},
+            getWrapperElement: function(){return wrapper;},
+            getScrollerElement: function(){return scroller;},
+            getGutterElement: function(){return gutter;}
+        };
+
+        function getLine(n) { return getLineAt(doc, n); }
+        function updateLineHeight(line, height) {
+            gutterDirty = true;
+            var diff = height - line.height;
+            for (var n = line; n; n = n.parent) n.height += diff;
+        }
+
+        function setValue(code) {
+            var top = {line: 0, ch: 0};
+            updateLines(top, {line: doc.size - 1, ch: getLine(doc.size-1).text.length},
+                splitLines(code), top, top);
+            updateInput = true;
+        }
+        function getValue(code) {
+            var text = [];
+            doc.iter(0, doc.size, function(line) { text.push(line.text); });
+            return text.join("\n");
+        }
+
+        function onMouseDown(e) {
+            setShift(e.shiftKey);
+            // Check whether this is a click in a widget
+            for (var n = e_target(e); n != wrapper; n = n.parentNode)
+                if (n.parentNode == code && n != mover) return;
+
+            // See if this is a click in the gutter
+            for (var n = e_target(e); n != wrapper; n = n.parentNode)
+                if (n.parentNode == gutterText) {
+                    if (options.onGutterClick)
+                        options.onGutterClick(instance, indexOf(gutterText.childNodes, n) + showingFrom, e);
+                    return e_preventDefault(e);
+                }
+
+            var start = posFromMouse(e);
+
+            switch (e_button(e)) {
+                case 3:
+                    if (gecko && !mac) onContextMenu(e);
+                    return;
+                case 2:
+                    if (start) setCursor(start.line, start.ch, true);
+                    return;
+            }
+            // For button 1, if it was clicked inside the editor
+            // (posFromMouse returning non-null), we have to adjust the
+            // selection.
+            if (!start) {if (e_target(e) == scroller) e_preventDefault(e); return;}
+
+            if (!focused) onFocus();
+
+            var now = +new Date;
+            if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
+                e_preventDefault(e);
+                setTimeout(focusInput, 20);
+                return selectLine(start.line);
+            } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {
+                lastDoubleClick = {time: now, pos: start};
+                e_preventDefault(e);
+                return selectWordAt(start);
+            } else { lastClick = {time: now, pos: start}; }
+
+            var last = start, going;
+            if (dragAndDrop && !posEq(sel.from, sel.to) &&
+                !posLess(start, sel.from) && !posLess(sel.to, start)) {
+                // Let the drag handler handle this.
+                if (webkit) lineSpace.draggable = true;
+                var up = connect(targetDocument, "mouseup", operation(function(e2) {
+                    if (webkit) lineSpace.draggable = false;
+                    draggingText = false;
+                    up();
+                    if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
+                        e_preventDefault(e2);
+                        setCursor(start.line, start.ch, true);
+                        focusInput();
+                    }
+                }), true);
+                draggingText = true;
+                return;
+            }
+            e_preventDefault(e);
+            setCursor(start.line, start.ch, true);
+
+            function extend(e) {
+                var cur = posFromMouse(e, true);
+                if (cur && !posEq(cur, last)) {
+                    if (!focused) onFocus();
+                    last = cur;
+                    setSelectionUser(start, cur);
+                    updateInput = false;
+                    var visible = visibleLines();
+                    if (cur.line >= visible.to || cur.line < visible.from)
+                        going = setTimeout(operation(function(){extend(e);}), 150);
+                }
+            }
+
+            var move = connect(targetDocument, "mousemove", operation(function(e) {
+                clearTimeout(going);
+                e_preventDefault(e);
+                extend(e);
+            }), true);
+            var up = connect(targetDocument, "mouseup", operation(function(e) {
+                clearTimeout(going);
+                var cur = posFromMouse(e);
+                if (cur) setSelectionUser(start, cur);
+                e_preventDefault(e);
+                focusInput();
+                updateInput = true;
+                move(); up();
+            }), true);
+        }
+        function onDoubleClick(e) {
+            for (var n = e_target(e); n != wrapper; n = n.parentNode)
+                if (n.parentNode == gutterText) return e_preventDefault(e);
+            var start = posFromMouse(e);
+            if (!start) return;
+            lastDoubleClick = {time: +new Date, pos: start};
+            e_preventDefault(e);
+            selectWordAt(start);
+        }
+        function onDrop(e) {
+            e.preventDefault();
+            var pos = posFromMouse(e, true), files = e.dataTransfer.files;
+            if (!pos || options.readOnly) return;
+            if (files && files.length && window.FileReader && window.File) {
+                function loadFile(file, i) {
+                    var reader = new FileReader;
+                    reader.onload = function() {
+                        text[i] = reader.result;
+                        if (++read == n) {
+                            pos = clipPos(pos);
+                            operation(function() {
+                                var end = replaceRange(text.join(""), pos, pos);
+                                setSelectionUser(pos, end);
+                            })();
+                        }
+                    };
+                    reader.readAsText(file);
+                }
+                var n = files.length, text = Array(n), read = 0;
+                for (var i = 0; i < n; ++i) loadFile(files[i], i);
+            }
+            else {
+                try {
+                    var text = e.dataTransfer.getData("Text");
+                    if (text) {
+                        var end = replaceRange(text, pos, pos);
+                        var curFrom = sel.from, curTo = sel.to;
+                        setSelectionUser(pos, end);
+                        if (draggingText) replaceRange("", curFrom, curTo);
+                        focusInput();
+                    }
+                }
+                catch(e){}
+            }
+        }
+        function onDragStart(e) {
+            var txt = getSelection();
+            // This will reset escapeElement
+            htmlEscape(txt);
+            e.dataTransfer.setDragImage(escapeElement, 0, 0);
+            e.dataTransfer.setData("Text", txt);
+        }
+        function handleKeyBinding(e) {
+            var name = keyNames[e.keyCode], next = keyMap[options.keyMap].auto, bound, dropShift;
+            if (name == null || e.altGraphKey) {
+                if (next) options.keyMap = next;
+                return null;
+            }
+            if (e.altKey) name = "Alt-" + name;
+            if (e.ctrlKey) name = "Ctrl-" + name;
+            if (e.metaKey) name = "Cmd-" + name;
+            if (e.shiftKey && (bound = lookupKey("Shift-" + name, options.extraKeys, options.keyMap))) {
+                dropShift = true;
+            } else {
+                bound = lookupKey(name, options.extraKeys, options.keyMap);
+            }
+            if (typeof bound == "string") {
+                if (commands.propertyIsEnumerable(bound)) bound = commands[bound];
+                else bound = null;
+            }
+            if (next && (bound || !isModifierKey(e))) options.keyMap = next;
+            if (!bound) return false;
+            if (dropShift) {
+                var prevShift = shiftSelecting;
+                shiftSelecting = null;
+                bound(instance);
+                shiftSelecting = prevShift;
+            } else bound(instance);
+            e_preventDefault(e);
+            return true;
+        }
+        var lastStoppedKey = null;
+        function onKeyDown(e) {
+            if (!focused) onFocus();
+            var code = e.keyCode;
+            // IE does strange things with escape.
+            if (ie && code == 27) { e.returnValue = false; }
+            setShift(code == 16 || e.shiftKey);
+            // First give onKeyEvent option a chance to handle this.
+            if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
+            var handled = handleKeyBinding(e);
+            if (window.opera) {
+                lastStoppedKey = handled ? e.keyCode : null;
+                // Opera has no cut event... we try to at least catch the key combo
+                if (!handled && (mac ? e.metaKey : e.ctrlKey) && e.keyCode == 88)
+                    replaceSelection("");
+            }
+        }
+        function onKeyPress(e) {
+            if (window.opera && e.keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
+            if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
+            if (window.opera && !e.which && handleKeyBinding(e)) return;
+            if (options.electricChars && mode.electricChars) {
+                var ch = String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode);
+                if (mode.electricChars.indexOf(ch) > -1)
+                    setTimeout(operation(function() {indentLine(sel.to.line, "smart");}), 75);
+            }
+            fastPoll();
+        }
+        function onKeyUp(e) {
+            if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
+            if (e.keyCode == 16) shiftSelecting = null;
+        }
+
+        function onFocus() {
+            if (options.readOnly) return;
+            if (!focused) {
+                if (options.onFocus) options.onFocus(instance);
+                focused = true;
+                if (wrapper.className.search(/\bCodeMirror-focused\b/) == -1)
+                    wrapper.className += " CodeMirror-focused";
+                if (!leaveInputAlone) resetInput(true);
+            }
+            slowPoll();
+            restartBlink();
+        }
+        function onBlur() {
+            if (focused) {
+                if (options.onBlur) options.onBlur(instance);
+                focused = false;
+                wrapper.className = wrapper.className.replace(" CodeMirror-focused", "");
+            }
+            clearInterval(blinker);
+            setTimeout(function() {if (!focused) shiftSelecting = null;}, 150);
+        }
+
+        // Replace the range from from to to by the strings in newText.
+        // Afterwards, set the selection to selFrom, selTo.
+        function updateLines(from, to, newText, selFrom, selTo) {
+            if (history) {
+                var old = [];
+                doc.iter(from.line, to.line + 1, function(line) { old.push(line.text); });
+                history.addChange(from.line, newText.length, old);
+                while (history.done.length > options.undoDepth) history.done.shift();
+            }
+            updateLinesNoUndo(from, to, newText, selFrom, selTo);
+        }
+        function unredoHelper(from, to) {
+            var change = from.pop();
+            if (change) {
+                var replaced = [], end = change.start + change.added;
+                doc.iter(change.start, end, function(line) { replaced.push(line.text); });
+                to.push({start: change.start, added: change.old.length, old: replaced});
+                var pos = clipPos({line: change.start + change.old.length - 1,
+                    ch: editEnd(replaced[replaced.length-1], change.old[change.old.length-1])});
+                updateLinesNoUndo({line: change.start, ch: 0}, {line: end - 1, ch: getLine(end-1).text.length}, change.old, pos, pos);
+                updateInput = true;
+            }
+        }
+        function undo() {unredoHelper(history.done, history.undone);}
+        function redo() {unredoHelper(history.undone, history.done);}
+
+        function updateLinesNoUndo(from, to, newText, selFrom, selTo) {
+            var recomputeMaxLength = false, maxLineLength = maxLine.length;
+            if (!options.lineWrapping)
+                doc.iter(from.line, to.line, function(line) {
+                    if (line.text.length == maxLineLength) {recomputeMaxLength = true; return true;}
+                });
+            if (from.line != to.line || newText.length > 1) gutterDirty = true;
+
+            var nlines = to.line - from.line, firstLine = getLine(from.line), lastLine = getLine(to.line);
+            // First adjust the line structure, taking some care to leave highlighting intact.
+            if (from.ch == 0 && to.ch == 0 && newText[newText.length - 1] == "") {
+                // This is a whole-line replace. Treated specially to make
+                // sure line objects move the way they are supposed to.
+                var added = [], prevLine = null;
+                if (from.line) {
+                    prevLine = getLine(from.line - 1);
+                    prevLine.fixMarkEnds(lastLine);
+                } else lastLine.fixMarkStarts();
+                for (var i = 0, e = newText.length - 1; i < e; ++i)
+                    added.push(Line.inheritMarks(newText[i], prevLine));
+                if (nlines) doc.remove(from.line, nlines, callbacks);
+                if (added.length) doc.insert(from.line, added);
+            } else if (firstLine == lastLine) {
+                if (newText.length == 1)
+                    firstLine.replace(from.ch, to.ch, newText[0]);
+                else {
+                    lastLine = firstLine.split(to.ch, newText[newText.length-1]);
+                    firstLine.replace(from.ch, null, newText[0]);
+                    firstLine.fixMarkEnds(lastLine);
+                    var added = [];
+                    for (var i = 1, e = newText.length - 1; i < e; ++i)
+                        added.push(Line.inheritMarks(newText[i], firstLine));
+                    added.push(lastLine);
+                    doc.insert(from.line + 1, added);
+                }
+            } else if (newText.length == 1) {
+                firstLine.replace(from.ch, null, newText[0]);
+                lastLine.replace(null, to.ch, "");
+                firstLine.append(lastLine);
+                doc.remove(from.line + 1, nlines, callbacks);
+            } else {
+                var added = [];
+                firstLine.replace(from.ch, null, newText[0]);
+                lastLine.replace(null, to.ch, newText[newText.length-1]);
+                firstLine.fixMarkEnds(lastLine);
+                for (var i = 1, e = newText.length - 1; i < e; ++i)
+                    added.push(Line.inheritMarks(newText[i], firstLine));
+                if (nlines > 1) doc.remove(from.line + 1, nlines - 1, callbacks);
+                doc.insert(from.line + 1, added);
+            }
+            if (options.lineWrapping) {
+                var perLine = scroller.clientWidth / charWidth() - 3;
+                doc.iter(from.line, from.line + newText.length, function(line) {
+                    if (line.hidden) return;
+                    var guess = Math.ceil(line.text.length / perLine) || 1;
+                    if (guess != line.height) updateLineHeight(line, guess);
+                });
+            } else {
+                doc.iter(from.line, i + newText.length, function(line) {
+                    var l = line.text;
+                    if (l.length > maxLineLength) {
+                        maxLine = l; maxLineLength = l.length; maxWidth = null;
+                        recomputeMaxLength = false;
+                    }
+                });
+                if (recomputeMaxLength) {
+                    maxLineLength = 0; maxLine = ""; maxWidth = null;
+                    doc.iter(0, doc.size, function(line) {
+                        var l = line.text;
+                        if (l.length > maxLineLength) {
+                            maxLineLength = l.length; maxLine = l;
+                        }
+                    });
+                }
+            }
+
+            // Add these lines to the work array, so that they will be
+            // highlighted. Adjust work lines if lines were added/removed.
+            var newWork = [], lendiff = newText.length - nlines - 1;
+            for (var i = 0, l = work.length; i < l; ++i) {
+                var task = work[i];
+                if (task < from.line) newWork.push(task);
+                else if (task > to.line) newWork.push(task + lendiff);
+            }
+            var hlEnd = from.line + Math.min(newText.length, 500);
+            highlightLines(from.line, hlEnd);
+            newWork.push(hlEnd);
+            work = newWork;
+            startWorker(100);
+            // Remember that these lines changed, for updating the display
+            changes.push({from: from.line, to: to.line + 1, diff: lendiff});
+            var changeObj = {from: from, to: to, text: newText};
+            if (textChanged) {
+                for (var cur = textChanged; cur.next; cur = cur.next) {}
+                cur.next = changeObj;
+            } else textChanged = changeObj;
+
+            // Update the selection
+            function updateLine(n) {return n <= Math.min(to.line, to.line + lendiff) ? n : n + lendiff;}
+            setSelection(selFrom, selTo, updateLine(sel.from.line), updateLine(sel.to.line));
+
+            // Make sure the scroll-size div has the correct height.
+            code.style.height = (doc.height * textHeight() + 2 * paddingTop()) + "px";
+        }
+
+        function replaceRange(code, from, to) {
+            from = clipPos(from);
+            if (!to) to = from; else to = clipPos(to);
+            code = splitLines(code);
+            function adjustPos(pos) {
+                if (posLess(pos, from)) return pos;
+                if (!posLess(to, pos)) return end;
+                var line = pos.line + code.length - (to.line - from.line) - 1;
+                var ch = pos.ch;
+                if (pos.line == to.line)
+                    ch += code[code.length-1].length - (to.ch - (to.line == from.line ? from.ch : 0));
+                return {line: line, ch: ch};
+            }
+            var end;
+            replaceRange1(code, from, to, function(end1) {
+                end = end1;
+                return {from: adjustPos(sel.from), to: adjustPos(sel.to)};
+            });
+            return end;
+        }
+        function replaceSelection(code, collapse) {
+            replaceRange1(splitLines(code), sel.from, sel.to, function(end) {
+                if (collapse == "end") return {from: end, to: end};
+                else if (collapse == "start") return {from: sel.from, to: sel.from};
+                else return {from: sel.from, to: end};
+            });
+        }
+        function replaceRange1(code, from, to, computeSel) {
+            var endch = code.length == 1 ? code[0].length + from.ch : code[code.length-1].length;
+            var newSel = computeSel({line: from.line + code.length - 1, ch: endch});
+            updateLines(from, to, code, newSel.from, newSel.to);
+        }
+
+        function getRange(from, to) {
+            var l1 = from.line, l2 = to.line;
+            if (l1 == l2) return getLine(l1).text.slice(from.ch, to.ch);
+            var code = [getLine(l1).text.slice(from.ch)];
+            doc.iter(l1 + 1, l2, function(line) { code.push(line.text); });
+            code.push(getLine(l2).text.slice(0, to.ch));
+            return code.join("\n");
+        }
+        function getSelection() {
+            return getRange(sel.from, sel.to);
+        }
+
+        var pollingFast = false; // Ensures slowPoll doesn't cancel fastPoll
+        function slowPoll() {
+            if (pollingFast) return;
+            poll.set(options.pollInterval, function() {
+                startOperation();
+                readInput();
+                if (focused) slowPoll();
+                endOperation();
+            });
+        }
+        function fastPoll() {
+            var missed = false;
+            pollingFast = true;
+            function p() {
+                startOperation();
+                var changed = readInput();
+                if (!changed && !missed) {missed = true; poll.set(60, p);}
+                else {pollingFast = false; slowPoll();}
+                endOperation();
+            }
+            poll.set(20, p);
+        }
+
+        // Previnput is a hack to work with IME. If we reset the textarea
+        // on every change, that breaks IME. So we look for changes
+        // compared to the previous content instead. (Modern browsers have
+        // events that indicate IME taking place, but these are not widely
+        // supported or compatible enough yet to rely on.)
+        var prevInput = "";
+        function readInput() {
+            if (leaveInputAlone || !focused || hasSelection(input)) return false;
+            var text = input.value;
+            if (text == prevInput) return false;
+            shiftSelecting = null;
+            var same = 0, l = Math.min(prevInput.length, text.length);
+            while (same < l && prevInput[same] == text[same]) ++same;
+            if (same < prevInput.length)
+                sel.from = {line: sel.from.line, ch: sel.from.ch - (prevInput.length - same)};
+            else if (overwrite && posEq(sel.from, sel.to))
+                sel.to = {line: sel.to.line, ch: Math.min(getLine(sel.to.line).text.length, sel.to.ch + (text.length - same))};
+            replaceSelection(text.slice(same), "end");
+            prevInput = text;
+            return true;
+        }
+        function resetInput(user) {
+            if (!posEq(sel.from, sel.to)) {
+                prevInput = "";
+                input.value = getSelection();
+                input.select();
+            } else if (user) prevInput = input.value = "";
+        }
+
+        function focusInput() {
+            if (!options.readOnly) input.focus();
+        }
+
+        function scrollEditorIntoView() {
+            if (!cursor.getBoundingClientRect) return;
+            var rect = cursor.getBoundingClientRect();
+            // IE returns bogus coordinates when the instance sits inside of an iframe and the cursor is hidden
+            if (ie && rect.top == rect.bottom) return;
+            var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
+            if (rect.top < 0 || rect.bottom > winH) cursor.scrollIntoView();
+        }
+        function scrollCursorIntoView() {
+            var cursor = localCoords(sel.inverted ? sel.from : sel.to);
+            var x = options.lineWrapping ? Math.min(cursor.x, lineSpace.offsetWidth) : cursor.x;
+            return scrollIntoView(x, cursor.y, x, cursor.yBot);
+        }
+        function scrollIntoView(x1, y1, x2, y2) {
+            var pl = paddingLeft(), pt = paddingTop(), lh = textHeight();
+            y1 += pt; y2 += pt; x1 += pl; x2 += pl;
+            var screen = scroller.clientHeight, screentop = scroller.scrollTop, scrolled = false, result = true;
+            if (y1 < screentop) {scroller.scrollTop = Math.max(0, y1 - 2*lh); scrolled = true;}
+            else if (y2 > screentop + screen) {scroller.scrollTop = y2 + lh - screen; scrolled = true;}
+
+            var screenw = scroller.clientWidth, screenleft = scroller.scrollLeft;
+            var gutterw = options.fixedGutter ? gutter.clientWidth : 0;
+            if (x1 < screenleft + gutterw) {
+                if (x1 < 50) x1 = 0;
+                scroller.scrollLeft = Math.max(0, x1 - 10 - gutterw);
+                scrolled = true;
+            }
+            else if (x2 > screenw + screenleft - 3) {
+                scroller.scrollLeft = x2 + 10 - screenw;
+                scrolled = true;
+                if (x2 > code.clientWidth) result = false;
+            }
+            if (scrolled && options.onScroll) options.onScroll(instance);
+            return result;
+        }
+
+        function visibleLines() {
+            var lh = textHeight(), top = scroller.scrollTop - paddingTop();
+            var from_height = Math.max(0, Math.floor(top / lh));
+            var to_height = Math.ceil((top + scroller.clientHeight) / lh);
+            return {from: lineAtHeight(doc, from_height),
+                to: lineAtHeight(doc, to_height)};
+        }
+        // Uses a set of changes plus the current scroll position to
+        // determine which DOM updates have to be made, and makes the
+        // updates.
+        function updateDisplay(changes, suppressCallback) {
+            if (!scroller.clientWidth) {
+                showingFrom = showingTo = displayOffset = 0;
+                return;
+            }
+            // Compute the new visible window
+            var visible = visibleLines();
+            // Bail out if the visible area is already rendered and nothing changed.
+            if (changes !== true && changes.length == 0 && visible.from >= showingFrom && visible.to <= showingTo) return;
+            var from = Math.max(visible.from - 100, 0), to = Math.min(doc.size, visible.to + 100);
+            if (showingFrom < from && from - showingFrom < 20) from = showingFrom;
+            if (showingTo > to && showingTo - to < 20) to = Math.min(doc.size, showingTo);
+
+            // Create a range of theoretically intact lines, and punch holes
+            // in that using the change info.
+            var intact = changes === true ? [] :
+                computeIntact([{from: showingFrom, to: showingTo, domStart: 0}], changes);
+            // Clip off the parts that won't be visible
+            var intactLines = 0;
+            for (var i = 0; i < intact.length; ++i) {
+                var range = intact[i];
+                if (range.from < from) {range.domStart += (from - range.from); range.from = from;}
+                if (range.to > to) range.to = to;
+                if (range.from >= range.to) intact.splice(i--, 1);
+                else intactLines += range.to - range.from;
+            }
+            if (intactLines == to - from) return;
+            intact.sort(function(a, b) {return a.domStart - b.domStart;});
+
+            var th = textHeight(), gutterDisplay = gutter.style.display;
+            lineDiv.style.display = gutter.style.display = "none";
+            patchDisplay(from, to, intact);
+            lineDiv.style.display = "";
+
+            // Position the mover div to align with the lines it's supposed
+            // to be showing (which will cover the visible display)
+            var different = from != showingFrom || to != showingTo || lastSizeC != scroller.clientHeight + th;
+            // This is just a bogus formula that detects when the editor is
+            // resized or the font size changes.
+            if (different) lastSizeC = scroller.clientHeight + th;
+            showingFrom = from; showingTo = to;
+            displayOffset = heightAtLine(doc, from);
+            mover.style.top = (displayOffset * th) + "px";
+            code.style.height = (doc.height * th + 2 * paddingTop()) + "px";
+
+            // Since this is all rather error prone, it is honoured with the
+            // only assertion in the whole file.
+            if (lineDiv.childNodes.length != showingTo - showingFrom)
+                throw new Error("BAD PATCH! " + JSON.stringify(intact) + " size=" + (showingTo - showingFrom) +
+                    " nodes=" + lineDiv.childNodes.length);
+
+            if (options.lineWrapping) {
+                maxWidth = scroller.clientWidth;
+                var curNode = lineDiv.firstChild;
+                doc.iter(showingFrom, showingTo, function(line) {
+                    if (!line.hidden) {
+                        var height = Math.round(curNode.offsetHeight / th) || 1;
+                        if (line.height != height) {updateLineHeight(line, height); gutterDirty = true;}
+                    }
+                    curNode = curNode.nextSibling;
+                });
+            } else {
+                if (maxWidth == null) maxWidth = stringWidth(maxLine);
+                if (maxWidth > scroller.clientWidth) {
+                    lineSpace.style.width = maxWidth + "px";
+                    // Needed to prevent odd wrapping/hiding of widgets placed in here.
+                    code.style.width = "";
+                    code.style.width = scroller.scrollWidth + "px";
+                } else {
+                    lineSpace.style.width = code.style.width = "";
+                }
+            }
+            gutter.style.display = gutterDisplay;
+            if (different || gutterDirty) updateGutter();
+            updateCursor();
+            if (!suppressCallback && options.onUpdate) options.onUpdate(instance);
+            return true;
+        }
+
+        function computeIntact(intact, changes) {
+            for (var i = 0, l = changes.length || 0; i < l; ++i) {
+                var change = changes[i], intact2 = [], diff = change.diff || 0;
+                for (var j = 0, l2 = intact.length; j < l2; ++j) {
+                    var range = intact[j];
+                    if (change.to <= range.from && change.diff)
+                        intact2.push({from: range.from + diff, to: range.to + diff,
+                            domStart: range.domStart});
+                    else if (change.to <= range.from || change.from >= range.to)
+                        intact2.push(range);
+                    else {
+                        if (change.from > range.from)
+                            intact2.push({from: range.from, to: change.from, domStart: range.domStart});
+                        if (change.to < range.to)
+                            intact2.push({from: change.to + diff, to: range.to + diff,
+                                domStart: range.domStart + (change.to - range.from)});
+                    }
+                }
+                intact = intact2;
+            }
+            return intact;
+        }
+
+        function patchDisplay(from, to, intact) {
+            // The first pass removes the DOM nodes that aren't intact.
+            if (!intact.length) lineDiv.innerHTML = "";
+            else {
+                function killNode(node) {
+                    var tmp = node.nextSibling;
+                    node.parentNode.removeChild(node);
+                    return tmp;
+                }
+                var domPos = 0, curNode = lineDiv.firstChild, n;
+                for (var i = 0; i < intact.length; ++i) {
+                    var cur = intact[i];
+                    while (cur.domStart > domPos) {curNode = killNode(curNode); domPos++;}
+                    for (var j = 0, e = cur.to - cur.from; j < e; ++j) {curNode = curNode.nextSibling; domPos++;}
+                }
+                while (curNode) curNode = killNode(curNode);
+            }
+            // This pass fills in the lines that actually changed.
+            var nextIntact = intact.shift(), curNode = lineDiv.firstChild, j = from;
+            var sfrom = sel.from.line, sto = sel.to.line, inSel = sfrom < from && sto >= from;
+            var scratch = targetDocument.createElement("div"), newElt;
+            doc.iter(from, to, function(line) {
+                var ch1 = null, ch2 = null;
+                if (inSel) {
+                    ch1 = 0;
+                    if (sto == j) {inSel = false; ch2 = sel.to.ch;}
+                } else if (sfrom == j) {
+                    if (sto == j) {ch1 = sel.from.ch; ch2 = sel.to.ch;}
+                    else {inSel = true; ch1 = sel.from.ch;}
+                }
+                if (nextIntact && nextIntact.to == j) nextIntact = intact.shift();
+                if (!nextIntact || nextIntact.from > j) {
+                    if (line.hidden) scratch.innerHTML = "<pre></pre>";
+                    else scratch.innerHTML = line.getHTML(ch1, ch2, true, tabText);
+                    lineDiv.insertBefore(scratch.firstChild, curNode);
+                } else {
+                    curNode = curNode.nextSibling;
+                }
+                ++j;
+            });
+        }
+
+        function updateGutter() {
+            if (!options.gutter && !options.lineNumbers) return;
+            var hText = mover.offsetHeight, hEditor = scroller.clientHeight;
+            gutter.style.height = (hText - hEditor < 2 ? hEditor : hText) + "px";
+            var html = [], i = showingFrom;
+            doc.iter(showingFrom, Math.max(showingTo, showingFrom + 1), function(line) {
+                if (line.hidden) {
+                    html.push("<pre></pre>");
+                } else {
+                    var marker = line.gutterMarker;
+                    var text = options.lineNumbers ? i + options.firstLineNumber : null;
+                    if (marker && marker.text)
+                        text = marker.text.replace("%N%", text != null ? text : "");
+                    else if (text == null)
+                        text = "\u00a0";
+                    html.push((marker && marker.style ? '<pre class="' + marker.style + '">' : "<pre>"), text);
+                    for (var j = 1; j < line.height; ++j) html.push("<br/>&#160;");
+                    html.push("</pre>");
+                }
+                ++i;
+            });
+            gutter.style.display = "none";
+            gutterText.innerHTML = html.join("");
+            var minwidth = String(doc.size).length, firstNode = gutterText.firstChild, val = eltText(firstNode), pad = "";
+            while (val.length + pad.length < minwidth) pad += "\u00a0";
+            if (pad) firstNode.insertBefore(targetDocument.createTextNode(pad), firstNode.firstChild);
+            gutter.style.display = "";
+            lineSpace.style.marginLeft = gutter.offsetWidth + "px";
+            gutterDirty = false;
+        }
+        function updateCursor() {
+            var head = sel.inverted ? sel.from : sel.to, lh = textHeight();
+            var pos = localCoords(head, true);
+            var wrapOff = eltOffset(wrapper), lineOff = eltOffset(lineDiv);
+            inputDiv.style.top = (pos.y + lineOff.top - wrapOff.top) + "px";
+            inputDiv.style.left = (pos.x + lineOff.left - wrapOff.left) + "px";
+            if (posEq(sel.from, sel.to)) {
+                cursor.style.top = pos.y + "px";
+                cursor.style.left = (options.lineWrapping ? Math.min(pos.x, lineSpace.offsetWidth) : pos.x) + "px";
+                cursor.style.display = "";
+            }
+            else cursor.style.display = "none";
+        }
+
+        function setShift(val) {
+            if (val) shiftSelecting = shiftSelecting || (sel.inverted ? sel.to : sel.from);
+            else shiftSelecting = null;
+        }
+        function setSelectionUser(from, to) {
+            var sh = shiftSelecting && clipPos(shiftSelecting);
+            if (sh) {
+                if (posLess(sh, from)) from = sh;
+                else if (posLess(to, sh)) to = sh;
+            }
+            setSelection(from, to);
+            userSelChange = true;
+        }
+        // Update the selection. Last two args are only used by
+        // updateLines, since they have to be expressed in the line
+        // numbers before the update.
+        function setSelection(from, to, oldFrom, oldTo) {
+            goalColumn = null;
+            if (oldFrom == null) {oldFrom = sel.from.line; oldTo = sel.to.line;}
+            if (posEq(sel.from, from) && posEq(sel.to, to)) return;
+            if (posLess(to, from)) {var tmp = to; to = from; from = tmp;}
+
+            // Skip over hidden lines.
+            if (from.line != oldFrom) from = skipHidden(from, oldFrom, sel.from.ch);
+            if (to.line != oldTo) to = skipHidden(to, oldTo, sel.to.ch);
+
+            if (posEq(from, to)) sel.inverted = false;
+            else if (posEq(from, sel.to)) sel.inverted = false;
+            else if (posEq(to, sel.from)) sel.inverted = true;
+
+            // Some ugly logic used to only mark the lines that actually did
+            // see a change in selection as changed, rather than the whole
+            // selected range.
+            if (posEq(from, to)) {
+                if (!posEq(sel.from, sel.to))
+                    changes.push({from: oldFrom, to: oldTo + 1});
+            }
+            else if (posEq(sel.from, sel.to)) {
+                changes.push({from: from.line, to: to.line + 1});
+            }
+            else {
+                if (!posEq(from, sel.from)) {
+                    if (from.line < oldFrom)
+                        changes.push({from: from.line, to: Math.min(to.line, oldFrom) + 1});
+                    else
+                        changes.push({from: oldFrom, to: Math.min(oldTo, from.line) + 1});
+                }
+                if (!posEq(to, sel.to)) {
+                    if (to.line < oldTo)
+                        changes.push({from: Math.max(oldFrom, from.line), to: oldTo + 1});
+                    else
+                        changes.push({from: Math.max(from.line, oldTo), to: to.line + 1});
+                }
+            }
+            sel.from = from; sel.to = to;
+            selectionChanged = true;
+        }
+        function skipHidden(pos, oldLine, oldCh) {
+            function getNonHidden(dir) {
+                var lNo = pos.line + dir, end = dir == 1 ? doc.size : -1;
+                while (lNo != end) {
+                    var line = getLine(lNo);
+                    if (!line.hidden) {
+                        var ch = pos.ch;
+                        if (ch > oldCh || ch > line.text.length) ch = line.text.length;
+                        return {line: lNo, ch: ch};
+                    }
+                    lNo += dir;
+                }
+            }
+            var line = getLine(pos.line);
+            if (!line.hidden) return pos;
+            if (pos.line >= oldLine) return getNonHidden(1) || getNonHidden(-1);
+            else return getNonHidden(-1) || getNonHidden(1);
+        }
+        function setCursor(line, ch, user) {
+            var pos = clipPos({line: line, ch: ch || 0});
+            (user ? setSelectionUser : setSelection)(pos, pos);
+        }
+
+        function clipLine(n) {return Math.max(0, Math.min(n, doc.size-1));}
+        function clipPos(pos) {
+            if (pos.line < 0) return {line: 0, ch: 0};
+            if (pos.line >= doc.size) return {line: doc.size-1, ch: getLine(doc.size-1).text.length};
+            var ch = pos.ch, linelen = getLine(pos.line).text.length;
+            if (ch == null || ch > linelen) return {line: pos.line, ch: linelen};
+            else if (ch < 0) return {line: pos.line, ch: 0};
+            else return pos;
+        }
+
+        function findPosH(dir, unit) {
+            var end = sel.inverted ? sel.from : sel.to, line = end.line, ch = end.ch;
+            var lineObj = getLine(line);
+            function findNextLine() {
+                for (var l = line + dir, e = dir < 0 ? -1 : doc.size; l != e; l += dir) {
+                    var lo = getLine(l);
+                    if (!lo.hidden) { line = l; lineObj = lo; return true; }
+                }
+            }
+            function moveOnce(boundToLine) {
+                if (ch == (dir < 0 ? 0 : lineObj.text.length)) {
+                    if (!boundToLine && findNextLine()) ch = dir < 0 ? lineObj.text.length : 0;
+                    else return false;
+                } else ch += dir;
+                return true;
+            }
+            if (unit == "char") moveOnce();
+            else if (unit == "column") moveOnce(true);
+            else if (unit == "word") {
+                var sawWord = false;
+                for (;;) {
+                    if (dir < 0) if (!moveOnce()) break;
+                    if (isWordChar(lineObj.text.charAt(ch))) sawWord = true;
+                    else if (sawWord) {if (dir < 0) {dir = 1; moveOnce();} break;}
+                    if (dir > 0) if (!moveOnce()) break;
+                }
+            }
+            return {line: line, ch: ch};
+        }
+        function moveH(dir, unit) {
+            var pos = dir < 0 ? sel.from : sel.to;
+            if (shiftSelecting || posEq(sel.from, sel.to)) pos = findPosH(dir, unit);
+            setCursor(pos.line, pos.ch, true);
+        }
+        function deleteH(dir, unit) {
+            if (!posEq(sel.from, sel.to)) replaceRange("", sel.from, sel.to);
+            else if (dir < 0) replaceRange("", findPosH(dir, unit), sel.to);
+            else replaceRange("", sel.from, findPosH(dir, unit));
+            userSelChange = true;
+        }
+        var goalColumn = null;
+        function moveV(dir, unit) {
+            var dist = 0, pos = localCoords(sel.inverted ? sel.from : sel.to, true);
+            if (goalColumn != null) pos.x = goalColumn;
+            if (unit == "page") dist = scroller.clientHeight;
+            else if (unit == "line") dist = textHeight();
+            var target = coordsChar(pos.x, pos.y + dist * dir + 2);
+            setCursor(target.line, target.ch, true);
+            goalColumn = pos.x;
+        }
+
+        function selectWordAt(pos) {
+            var line = getLine(pos.line).text;
+            var start = pos.ch, end = pos.ch;
+            while (start > 0 && isWordChar(line.charAt(start - 1))) --start;
+            while (end < line.length && isWordChar(line.charAt(end))) ++end;
+            setSelectionUser({line: pos.line, ch: start}, {line: pos.line, ch: end});
+        }
+        function selectLine(line) {
+            setSelectionUser({line: line, ch: 0}, {line: line, ch: getLine(line).text.length});
+        }
+        function indentSelected(mode) {
+            if (posEq(sel.from, sel.to)) return indentLine(sel.from.line, mode);
+            var e = sel.to.line - (sel.to.ch ? 0 : 1);
+            for (var i = sel.from.line; i <= e; ++i) indentLine(i, mode);
+        }
+
+        function indentLine(n, how) {
+            if (!how) how = "add";
+            if (how == "smart") {
+                if (!mode.indent) how = "prev";
+                else var state = getStateBefore(n);
+            }
+
+            var line = getLine(n), curSpace = line.indentation(options.tabSize),
+                curSpaceString = line.text.match(/^\s*/)[0], indentation;
+            if (how == "prev") {
+                if (n) indentation = getLine(n-1).indentation(options.tabSize);
+                else indentation = 0;
+            }
+            else if (how == "smart") indentation = mode.indent(state, line.text.slice(curSpaceString.length), line.text);
+            else if (how == "add") indentation = curSpace + options.indentUnit;
+            else if (how == "subtract") indentation = curSpace - options.indentUnit;
+            indentation = Math.max(0, indentation);
+            var diff = indentation - curSpace;
+
+            if (!diff) {
+                if (sel.from.line != n && sel.to.line != n) return;
+                var indentString = curSpaceString;
+            }
+            else {
+                var indentString = "", pos = 0;
+                if (options.indentWithTabs)
+                    for (var i = Math.floor(indentation / options.tabSize); i; --i) {pos += options.tabSize; indentString += "\t";}
+                while (pos < indentation) {++pos; indentString += " ";}
+            }
+
+            replaceRange(indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length});
+        }
+
+        function loadMode() {
+            mode = CodeMirror.getMode(options, options.mode);
+            doc.iter(0, doc.size, function(line) { line.stateAfter = null; });
+            work = [0];
+            startWorker();
+        }
+        function gutterChanged() {
+            var visible = options.gutter || options.lineNumbers;
+            gutter.style.display = visible ? "" : "none";
+            if (visible) gutterDirty = true;
+            else lineDiv.parentNode.style.marginLeft = 0;
+        }
+        function wrappingChanged(from, to) {
+            if (options.lineWrapping) {
+                wrapper.className += " CodeMirror-wrap";
+                var perLine = scroller.clientWidth / charWidth() - 3;
+                doc.iter(0, doc.size, function(line) {
+                    if (line.hidden) return;
+                    var guess = Math.ceil(line.text.length / perLine) || 1;
+                    if (guess != 1) updateLineHeight(line, guess);
+                });
+                lineSpace.style.width = code.style.width = "";
+            } else {
+                wrapper.className = wrapper.className.replace(" CodeMirror-wrap", "");
+                maxWidth = null; maxLine = "";
+                doc.iter(0, doc.size, function(line) {
+                    if (line.height != 1 && !line.hidden) updateLineHeight(line, 1);
+                    if (line.text.length > maxLine.length) maxLine = line.text;
+                });
+            }
+            changes.push({from: 0, to: doc.size});
+        }
+        function computeTabText() {
+            for (var str = '<span class="cm-tab">', i = 0; i < options.tabSize; ++i) str += " ";
+            return str + "</span>";
+        }
+        function tabsChanged() {
+            tabText = computeTabText();
+            updateDisplay(true);
+        }
+        function themeChanged() {
+            scroller.className = scroller.className.replace(/\s*cm-s-\w+/g, "") +
+                options.theme.replace(/(^|\s)\s*/g, " cm-s-");
+        }
+
+        function TextMarker() { this.set = []; }
+        TextMarker.prototype.clear = operation(function() {
+            var min = Infinity, max = -Infinity;
+            for (var i = 0, e = this.set.length; i < e; ++i) {
+                var line = this.set[i], mk = line.marked;
+                if (!mk || !line.parent) continue;
+                var lineN = lineNo(line);
+                min = Math.min(min, lineN); max = Math.max(max, lineN);
+                for (var j = 0; j < mk.length; ++j)
+                    if (mk[j].set == this.set) mk.splice(j--, 1);
+            }
+            if (min != Infinity)
+                changes.push({from: min, to: max + 1});
+        });
+        TextMarker.prototype.find = function() {
+            var from, to;
+            for (var i = 0, e = this.set.length; i < e; ++i) {
+                var line = this.set[i], mk = line.marked;
+                for (var j = 0; j < mk.length; ++j) {
+                    var mark = mk[j];
+                    if (mark.set == this.set) {
+                        if (mark.from != null || mark.to != null) {
+                            var found = lineNo(line);
+                            if (found != null) {
+                                if (mark.from != null) from = {line: found, ch: mark.from};
+                                if (mark.to != null) to = {line: found, ch: mark.to};
+                            }
+                        }
+                    }
+                }
+            }
+            return {from: from, to: to};
+        };
+
+        function markText(from, to, className) {
+            from = clipPos(from); to = clipPos(to);
+            var tm = new TextMarker();
+            function add(line, from, to, className) {
+                getLine(line).addMark(new MarkedText(from, to, className, tm.set));
+            }
+            if (from.line == to.line) add(from.line, from.ch, to.ch, className);
+            else {
+                add(from.line, from.ch, null, className);
+                for (var i = from.line + 1, e = to.line; i < e; ++i)
+                    add(i, null, null, className);
+                add(to.line, null, to.ch, className);
+            }
+            changes.push({from: from.line, to: to.line + 1});
+            return tm;
+        }
+
+        function setBookmark(pos) {
+            pos = clipPos(pos);
+            var bm = new Bookmark(pos.ch);
+            getLine(pos.line).addMark(bm);
+            return bm;
+        }
+
+        function addGutterMarker(line, text, className) {
+            if (typeof line == "number") line = getLine(clipLine(line));
+            line.gutterMarker = {text: text, style: className};
+            gutterDirty = true;
+            return line;
+        }
+        function removeGutterMarker(line) {
+            if (typeof line == "number") line = getLine(clipLine(line));
+            line.gutterMarker = null;
+            gutterDirty = true;
+        }
+
+        function changeLine(handle, op) {
+            var no = handle, line = handle;
+            if (typeof handle == "number") line = getLine(clipLine(handle));
+            else no = lineNo(handle);
+            if (no == null) return null;
+            if (op(line, no)) changes.push({from: no, to: no + 1});
+            else return null;
+            return line;
+        }
+        function setLineClass(handle, className) {
+            return changeLine(handle, function(line) {
+                if (line.className != className) {
+                    line.className = className;
+                    return true;
+                }
+            });
+        }
+        function setLineHidden(handle, hidden) {
+            return changeLine(handle, function(line, no) {
+                if (line.hidden != hidden) {
+                    line.hidden = hidden;
+                    updateLineHeight(line, hidden ? 0 : 1);
+                    if (hidden && (sel.from.line == no || sel.to.line == no))
+                        setSelection(skipHidden(sel.from, sel.from.line, sel.from.ch),
+                            skipHidden(sel.to, sel.to.line, sel.to.ch));
+                    return (gutterDirty = true);
+                }
+            });
+        }
+
+        function lineInfo(line) {
+            if (typeof line == "number") {
+                if (!isLine(line)) return null;
+                var n = line;
+                line = getLine(line);
+                if (!line) return null;
+            }
+            else {
+                var n = lineNo(line);
+                if (n == null) return null;
+            }
+            var marker = line.gutterMarker;
+            return {line: n, handle: line, text: line.text, markerText: marker && marker.text,
+                markerClass: marker && marker.style, lineClass: line.className};
+        }
+
+        function stringWidth(str) {
+            measure.innerHTML = "<pre><span>x</span></pre>";
+            measure.firstChild.firstChild.firstChild.nodeValue = str;
+            return measure.firstChild.firstChild.offsetWidth || 10;
+        }
+        // These are used to go from pixel positions to character
+        // positions, taking varying character widths into account.
+        function charFromX(line, x) {
+            if (x <= 0) return 0;
+            var lineObj = getLine(line), text = lineObj.text;
+            function getX(len) {
+                measure.innerHTML = "<pre><span>" + lineObj.getHTML(null, null, false, tabText, len) + "</span></pre>";
+                return measure.firstChild.firstChild.offsetWidth;
+            }
+            var from = 0, fromX = 0, to = text.length, toX;
+            // Guess a suitable upper bound for our search.
+            var estimated = Math.min(to, Math.ceil(x / charWidth()));
+            for (;;) {
+                var estX = getX(estimated);
+                if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));
+                else {toX = estX; to = estimated; break;}
+            }
+            if (x > toX) return to;
+            // Try to guess a suitable lower bound as well.
+            estimated = Math.floor(to * 0.8); estX = getX(estimated);
+            if (estX < x) {from = estimated; fromX = estX;}
+            // Do a binary search between these bounds.
+            for (;;) {
+                if (to - from <= 1) return (toX - x > x - fromX) ? from : to;
+                var middle = Math.ceil((from + to) / 2), middleX = getX(middle);
+                if (middleX > x) {to = middle; toX = middleX;}
+                else {from = middle; fromX = middleX;}
+            }
+        }
+
+        var tempId = Math.floor(Math.random() * 0xffffff).toString(16);
+        function measureLine(line, ch) {
+            var extra = "";
+            // Include extra text at the end to make sure the measured line is wrapped in the right way.
+            if (options.lineWrapping) {
+                var end = line.text.indexOf(" ", ch + 2);
+                extra = htmlEscape(line.text.slice(ch + 1, end < 0 ? line.text.length : end + (ie ? 5 : 0)));
+            }
+            measure.innerHTML = "<pre>" + line.getHTML(null, null, false, tabText, ch) +
+                '<span id="CodeMirror-temp-' + tempId + '">' + htmlEscape(line.text.charAt(ch) || " ") + "</span>" +
+                extra + "</pre>";
+            var elt = document.getElementById("CodeMirror-temp-" + tempId);
+            var top = elt.offsetTop, left = elt.offsetLeft;
+            // Older IEs report zero offsets for spans directly after a wrap
+            if (ie && ch && top == 0 && left == 0) {
+                var backup = document.createElement("span");
+                backup.innerHTML = "x";
+                elt.parentNode.insertBefore(backup, elt.nextSibling);
+                top = backup.offsetTop;
+            }
+            return {top: top, left: left};
+        }
+        function localCoords(pos, inLineWrap) {
+            var x, lh = textHeight(), y = lh * (heightAtLine(doc, pos.line) - (inLineWrap ? displayOffset : 0));
+            if (pos.ch == 0) x = 0;
+            else {
+                var sp = measureLine(getLine(pos.line), pos.ch);
+                x = sp.left;
+                if (options.lineWrapping) y += Math.max(0, sp.top);
+            }
+            return {x: x, y: y, yBot: y + lh};
+        }
+        // Coords must be lineSpace-local
+        function coordsChar(x, y) {
+            if (y < 0) y = 0;
+            var th = textHeight(), cw = charWidth(), heightPos = displayOffset + Math.floor(y / th);
+            var lineNo = lineAtHeight(doc, heightPos);
+            if (lineNo >= doc.size) return {line: doc.size - 1, ch: getLine(doc.size - 1).text.length};
+            var lineObj = getLine(lineNo), text = lineObj.text;
+            var tw = options.lineWrapping, innerOff = tw ? heightPos - heightAtLine(doc, lineNo) : 0;
+            if (x <= 0 && innerOff == 0) return {line: lineNo, ch: 0};
+            function getX(len) {
+                var sp = measureLine(lineObj, len);
+                if (tw) {
+                    var off = Math.round(sp.top / th);
+                    return Math.max(0, sp.left + (off - innerOff) * scroller.clientWidth);
+                }
+                return sp.left;
+            }
+            var from = 0, fromX = 0, to = text.length, toX;
+            // Guess a suitable upper bound for our search.
+            var estimated = Math.min(to, Math.ceil((x + innerOff * scroller.clientWidth * .9) / cw));
+            for (;;) {
+                var estX = getX(estimated);
+                if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));
+                else {toX = estX; to = estimated; break;}
+            }
+            if (x > toX) return {line: lineNo, ch: to};
+            // Try to guess a suitable lower bound as well.
+            estimated = Math.floor(to * 0.8); estX = getX(estimated);
+            if (estX < x) {from = estimated; fromX = estX;}
+            // Do a binary search between these bounds.
+            for (;;) {
+                if (to - from <= 1) return {line: lineNo, ch: (toX - x > x - fromX) ? from : to};
+                var middle = Math.ceil((from + to) / 2), middleX = getX(middle);
+                if (middleX > x) {to = middle; toX = middleX;}
+                else {from = middle; fromX = middleX;}
+            }
+        }
+        function pageCoords(pos) {
+            var local = localCoords(pos, true), off = eltOffset(lineSpace);
+            return {x: off.left + local.x, y: off.top + local.y, yBot: off.top + local.yBot};
+        }
+
+        var cachedHeight, cachedHeightFor, measureText;
+        function textHeight() {
+            if (measureText == null) {
+                measureText = "<pre>";
+                for (var i = 0; i < 49; ++i) measureText += "x<br/>";
+                measureText += "x</pre>";
+            }
+            var offsetHeight = lineDiv.clientHeight;
+            if (offsetHeight == cachedHeightFor) return cachedHeight;
+            cachedHeightFor = offsetHeight;
+            measure.innerHTML = measureText;
+            cachedHeight = measure.firstChild.offsetHeight / 50 || 1;
+            measure.innerHTML = "";
+            return cachedHeight;
+        }
+        var cachedWidth, cachedWidthFor = 0;
+        function charWidth() {
+            if (scroller.clientWidth == cachedWidthFor) return cachedWidth;
+            cachedWidthFor = scroller.clientWidth;
+            return (cachedWidth = stringWidth("x"));
+        }
+        function paddingTop() {return lineSpace.offsetTop;}
+        function paddingLeft() {return lineSpace.offsetLeft;}
+
+        function posFromMouse(e, liberal) {
+            var offW = eltOffset(scroller, true), x, y;
+            // Fails unpredictably on IE[67] when mouse is dragged around quickly.
+            try { x = e.clientX; y = e.clientY; } catch (e) { return null; }
+            // This is a mess of a heuristic to try and determine whether a
+            // scroll-bar was clicked or not, and to return null if one was
+            // (and !liberal).
+            if (!liberal && (x - offW.left > scroller.clientWidth || y - offW.top > scroller.clientHeight))
+                return null;
+            var offL = eltOffset(lineSpace, true);
+            return coordsChar(x - offL.left, y - offL.top);
+        }
+        function onContextMenu(e) {
+            var pos = posFromMouse(e);
+            if (!pos || window.opera) return; // Opera is difficult.
+            if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))
+                operation(setCursor)(pos.line, pos.ch);
+
+            var oldCSS = input.style.cssText;
+            inputDiv.style.position = "absolute";
+            input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
+                "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; " +
+                "border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
+            leaveInputAlone = true;
+            var val = input.value = getSelection();
+            focusInput();
+            input.select();
+            function rehide() {
+                var newVal = splitLines(input.value).join("\n");
+                if (newVal != val) operation(replaceSelection)(newVal, "end");
+                inputDiv.style.position = "relative";
+                input.style.cssText = oldCSS;
+                leaveInputAlone = false;
+                resetInput(true);
+                slowPoll();
+            }
+
+            if (gecko) {
+                e_stop(e);
+                var mouseup = connect(window, "mouseup", function() {
+                    mouseup();
+                    setTimeout(rehide, 20);
+                }, true);
+            }
+            else {
+                setTimeout(rehide, 50);
+            }
+        }
+
+        // Cursor-blinking
+        function restartBlink() {
+            clearInterval(blinker);
+            var on = true;
+            cursor.style.visibility = "";
+            blinker = setInterval(function() {
+                cursor.style.visibility = (on = !on) ? "" : "hidden";
+            }, 650);
+        }
+
+        var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};
+        function matchBrackets(autoclear) {
+            var head = sel.inverted ? sel.from : sel.to, line = getLine(head.line), pos = head.ch - 1;
+            var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];
+            if (!match) return;
+            var ch = match.charAt(0), forward = match.charAt(1) == ">", d = forward ? 1 : -1, st = line.styles;
+            for (var off = pos + 1, i = 0, e = st.length; i < e; i+=2)
+                if ((off -= st[i].length) <= 0) {var style = st[i+1]; break;}
+
+            var stack = [line.text.charAt(pos)], re = /[(){}[\]]/;
+            function scan(line, from, to) {
+                if (!line.text) return;
+                var st = line.styles, pos = forward ? 0 : line.text.length - 1, cur;
+                for (var i = forward ? 0 : st.length - 2, e = forward ? st.length : -2; i != e; i += 2*d) {
+                    var text = st[i];
+                    if (st[i+1] != null && st[i+1] != style) {pos += d * text.length; continue;}
+                    for (var j = forward ? 0 : text.length - 1, te = forward ? text.length : -1; j != te; j += d, pos+=d) {
+                        if (pos >= from && pos < to && re.test(cur = text.charAt(j))) {
+                            var match = matching[cur];
+                            if (match.charAt(1) == ">" == forward) stack.push(cur);
+                            else if (stack.pop() != match.charAt(0)) return {pos: pos, match: false};
+                            else if (!stack.length) return {pos: pos, match: true};
+                        }
+                    }
+                }
+            }
+            for (var i = head.line, e = forward ? Math.min(i + 100, doc.size) : Math.max(-1, i - 100); i != e; i+=d) {
+                var line = getLine(i), first = i == head.line;
+                var found = scan(line, first && forward ? pos + 1 : 0, first && !forward ? pos : line.text.length);
+                if (found) break;
+            }
+            if (!found) found = {pos: null, match: false};
+            var style = found.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
+            var one = markText({line: head.line, ch: pos}, {line: head.line, ch: pos+1}, style),
+                two = found.pos != null && markText({line: i, ch: found.pos}, {line: i, ch: found.pos + 1}, style);
+            var clear = operation(function(){one.clear(); two && two.clear();});
+            if (autoclear) setTimeout(clear, 800);
+            else bracketHighlighted = clear;
+        }
+
+        // Finds the line to start with when starting a parse. Tries to
+        // find a line with a stateAfter, so that it can start with a
+        // valid state. If that fails, it returns the line with the
+        // smallest indentation, which tends to need the least context to
+        // parse correctly.
+        function findStartLine(n) {
+            var minindent, minline;
+            for (var search = n, lim = n - 40; search > lim; --search) {
+                if (search == 0) return 0;
+                var line = getLine(search-1);
+                if (line.stateAfter) return search;
+                var indented = line.indentation(options.tabSize);
+                if (minline == null || minindent > indented) {
+                    minline = search - 1;
+                    minindent = indented;
+                }
+            }
+            return minline;
+        }
+        function getStateBefore(n) {
+            var start = findStartLine(n), state = start && getLine(start-1).stateAfter;
+            if (!state) state = startState(mode);
+            else state = copyState(mode, state);
+            doc.iter(start, n, function(line) {
+                line.highlight(mode, state, options.tabSize);
+                line.stateAfter = copyState(mode, state);
+            });
+            if (start < n) changes.push({from: start, to: n});
+            if (n < doc.size && !getLine(n).stateAfter) work.push(n);
+            return state;
+        }
+        function highlightLines(start, end) {
+            var state = getStateBefore(start);
+            doc.iter(start, end, function(line) {
+                line.highlight(mode, state, options.tabSize);
+                line.stateAfter = copyState(mode, state);
+            });
+        }
+        function highlightWorker() {
+            var end = +new Date + options.workTime;
+            var foundWork = work.length;
+            while (work.length) {
+                if (!getLine(showingFrom).stateAfter) var task = showingFrom;
+                else var task = work.pop();
+                if (task >= doc.size) continue;
+                var start = findStartLine(task), state = start && getLine(start-1).stateAfter;
+                if (state) state = copyState(mode, state);
+                else state = startState(mode);
+
+                var unchanged = 0, compare = mode.compareStates, realChange = false,
+                    i = start, bail = false;
+                doc.iter(i, doc.size, function(line) {
+                    var hadState = line.stateAfter;
+                    if (+new Date > end) {
+                        work.push(i);
+                        startWorker(options.workDelay);
+                        if (realChange) changes.push({from: task, to: i + 1});
+                        return (bail = true);
+                    }
+                    var changed = line.highlight(mode, state, options.tabSize);
+                    if (changed) realChange = true;
+                    line.stateAfter = copyState(mode, state);
+                    if (compare) {
+                        if (hadState && compare(hadState, state)) return true;
+                    } else {
+                        if (changed !== false || !hadState) unchanged = 0;
+                        else if (++unchanged > 3 && (!mode.indent || mode.indent(hadState, "") == mode.indent(state, "")))
+                            return true;
+                    }
+                    ++i;
+                });
+                if (bail) return;
+                if (realChange) changes.push({from: task, to: i + 1});
+            }
+            if (foundWork && options.onHighlightComplete)
+                options.onHighlightComplete(instance);
+        }
+        function startWorker(time) {
+            if (!work.length) return;
+            highlight.set(time, operation(highlightWorker));
+        }
+
+        // Operations are used to wrap changes in such a way that each
+        // change won't have to update the cursor and display (which would
+        // be awkward, slow, and error-prone), but instead updates are
+        // batched and then all combined and executed at once.
+        function startOperation() {
+            updateInput = userSelChange = textChanged = null;
+            changes = []; selectionChanged = false; callbacks = [];
+        }
+        function endOperation() {
+            var reScroll = false, updated;
+            if (selectionChanged) reScroll = !scrollCursorIntoView();
+            if (changes.length) updated = updateDisplay(changes, true);
+            else {
+                if (selectionChanged) updateCursor();
+                if (gutterDirty) updateGutter();
+            }
+            if (reScroll) scrollCursorIntoView();
+            if (selectionChanged) {scrollEditorIntoView(); restartBlink();}
+
+            if (focused && !leaveInputAlone &&
+                (updateInput === true || (updateInput !== false && selectionChanged)))
+                resetInput(userSelChange);
+
+            if (selectionChanged && options.matchBrackets)
+                setTimeout(operation(function() {
+                    if (bracketHighlighted) {bracketHighlighted(); bracketHighlighted = null;}
+                    if (posEq(sel.from, sel.to)) matchBrackets(false);
+                }), 20);
+            var tc = textChanged, cbs = callbacks; // these can be reset by callbacks
+            if (selectionChanged && options.onCursorActivity)
+                options.onCursorActivity(instance);
+            if (tc && options.onChange && instance)
+                options.onChange(instance, tc);
+            for (var i = 0; i < cbs.length; ++i) cbs[i](instance);
+            if (updated && options.onUpdate) options.onUpdate(instance);
+        }
+        var nestedOperation = 0;
+        function operation(f) {
+            return function() {
+                if (!nestedOperation++) startOperation();
+                try {var result = f.apply(this, arguments);}
+                finally {if (!--nestedOperation) endOperation();}
+                return result;
+            };
+        }
+
+        for (var ext in extensions)
+            if (extensions.propertyIsEnumerable(ext) &&
+                !instance.propertyIsEnumerable(ext))
+                instance[ext] = extensions[ext];
+        return instance;
+    } // (end of function CodeMirror)
+
+    // The default configuration options.
+    CodeMirror.defaults = {
+        value: "",
+        mode: null,
+        theme: "default",
+        indentUnit: 2,
+        indentWithTabs: false,
+        tabSize: 4,
+        keyMap: "default",
+        extraKeys: null,
+        electricChars: true,
+        onKeyEvent: null,
+        lineWrapping: false,
+        lineNumbers: false,
+        gutter: false,
+        fixedGutter: false,
+        firstLineNumber: 1,
+        readOnly: false,
+        onChange: null,
+        onCursorActivity: null,
+        onGutterClick: null,
+        onHighlightComplete: null,
+        onUpdate: null,
+        onFocus: null, onBlur: null, onScroll: null,
+        matchBrackets: false,
+        workTime: 100,
+        workDelay: 200,
+        pollInterval: 100,
+        undoDepth: 40,
+        tabindex: null,
+        document: window.document
+    };
+
+    var mac = /Mac/.test(navigator.platform);
+    var win = /Win/.test(navigator.platform);
+
+    // Known modes, by name and by MIME
+    var modes = {}, mimeModes = {};
+    CodeMirror.defineMode = function(name, mode) {
+        if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
+        modes[name] = mode;
+    };
+    CodeMirror.defineMIME = function(mime, spec) {
+        mimeModes[mime] = spec;
+    };
+    CodeMirror.getMode = function(options, spec) {
+        if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
+            spec = mimeModes[spec];
+        if (typeof spec == "string")
+            var mname = spec, config = {};
+        else if (spec != null)
+            var mname = spec.name, config = spec;
+        var mfactory = modes[mname];
+        if (!mfactory) {
+            if (window.console) console.warn("No mode " + mname + " found, falling back to plain text.");
+            return CodeMirror.getMode(options, "text/plain");
+        }
+        return mfactory(options, config || {});
+    };
+    CodeMirror.listModes = function() {
+        var list = [];
+        for (var m in modes)
+            if (modes.propertyIsEnumerable(m)) list.push(m);
+        return list;
+    };
+    CodeMirror.listMIMEs = function() {
+        var list = [];
+        for (var m in mimeModes)
+            if (mimeModes.propertyIsEnumerable(m)) list.push({mime: m, mode: mimeModes[m]});
+        return list;
+    };
+
+    var extensions = CodeMirror.extensions = {};
+    CodeMirror.defineExtension = function(name, func) {
+        extensions[name] = func;
+    };
+
+    var commands = CodeMirror.commands = {
+        selectAll: function(cm) {cm.setSelection({line: 0, ch: 0}, {line: cm.lineCount() - 1});},
+        killLine: function(cm) {
+            var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);
+            if (!sel && cm.getLine(from.line).length == from.ch) cm.replaceRange("", from, {line: from.line + 1, ch: 0});
+            else cm.replaceRange("", from, sel ? to : {line: from.line});
+        },
+        deleteLine: function(cm) {var l = cm.getCursor().line; cm.replaceRange("", {line: l, ch: 0}, {line: l});},
+        undo: function(cm) {cm.undo();},
+        redo: function(cm) {cm.redo();},
+        goDocStart: function(cm) {cm.setCursor(0, 0, true);},
+        goDocEnd: function(cm) {cm.setSelection({line: cm.lineCount() - 1}, null, true);},
+        goLineStart: function(cm) {cm.setCursor(cm.getCursor().line, 0, true);},
+        goLineStartSmart: function(cm) {
+            var cur = cm.getCursor();
+            var text = cm.getLine(cur.line), firstNonWS = Math.max(0, text.search(/\S/));
+            cm.setCursor(cur.line, cur.ch <= firstNonWS && cur.ch ? 0 : firstNonWS, true);
+        },
+        goLineEnd: function(cm) {cm.setSelection({line: cm.getCursor().line}, null, true);},
+        goLineUp: function(cm) {cm.moveV(-1, "line");},
+        goLineDown: function(cm) {cm.moveV(1, "line");},
+        goPageUp: function(cm) {cm.moveV(-1, "page");},
+        goPageDown: function(cm) {cm.moveV(1, "page");},
+        goCharLeft: function(cm) {cm.moveH(-1, "char");},
+        goCharRight: function(cm) {cm.moveH(1, "char");},
+        goColumnLeft: function(cm) {cm.moveH(-1, "column");},
+        goColumnRight: function(cm) {cm.moveH(1, "column");},
+        goWordLeft: function(cm) {cm.moveH(-1, "word");},
+        goWordRight: function(cm) {cm.moveH(1, "word");},
+        delCharLeft: function(cm) {cm.deleteH(-1, "char");},
+        delCharRight: function(cm) {cm.deleteH(1, "char");},
+        delWordLeft: function(cm) {cm.deleteH(-1, "word");},
+        delWordRight: function(cm) {cm.deleteH(1, "word");},
+        indentAuto: function(cm) {cm.indentSelection("smart");},
+        indentMore: function(cm) {cm.indentSelection("add");},
+        indentLess: function(cm) {cm.indentSelection("subtract");},
+        insertTab: function(cm) {cm.replaceSelection("\t", "end");},
+        transposeChars: function(cm) {
+            var cur = cm.getCursor(), line = cm.getLine(cur.line);
+            if (cur.ch > 0 && cur.ch < line.length - 1)
+                cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1),
+                    {line: cur.line, ch: cur.ch - 1}, {line: cur.line, ch: cur.ch + 1});
+        },
+        newlineAndIndent: function(cm) {
+            cm.replaceSelection("\n", "end");
+            cm.indentLine(cm.getCursor().line);
+        },
+        toggleOverwrite: function(cm) {cm.toggleOverwrite();}
+    };
+
+    var keyMap = CodeMirror.keyMap = {};
+    keyMap.basic = {
+        "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
+        "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
+        "Delete": "delCharRight", "Backspace": "delCharLeft", "Tab": "indentMore", "Shift-Tab": "indentLess",
+        "Enter": "newlineAndIndent", "Insert": "toggleOverwrite"
+    };
+    // Note that the save and find-related commands aren't defined by
+    // default. Unknown commands are simply ignored.
+    keyMap.pcDefault = {
+        "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
+        "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
+        "Ctrl-Left": "goWordLeft", "Ctrl-Right": "goWordRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
+        "Ctrl-Backspace": "delWordLeft", "Ctrl-Delete": "delWordRight", "Ctrl-S": "save", "Ctrl-F": "find",
+        "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
+        fallthrough: "basic"
+    };
+    keyMap.macDefault = {
+        "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
+        "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goWordLeft",
+        "Alt-Right": "goWordRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delWordLeft",
+        "Ctrl-Alt-Backspace": "delWordRight", "Alt-Delete": "delWordRight", "Cmd-S": "save", "Cmd-F": "find",
+        "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
+        fallthrough: ["basic", "emacsy"]
+    };
+    keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
+    keyMap.emacsy = {
+        "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
+        "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
+        "Ctrl-V": "goPageUp", "Shift-Ctrl-V": "goPageDown", "Ctrl-D": "delCharRight", "Ctrl-H": "delCharLeft",
+        "Alt-D": "delWordRight", "Alt-Backspace": "delWordLeft", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
+    };
+
+    function lookupKey(name, extraMap, map) {
+        function lookup(name, map, ft) {
+            var found = map[name];
+            if (found != null) return found;
+            if (ft == null) ft = map.fallthrough;
+            if (ft == null) return map.catchall;
+            if (typeof ft == "string") return lookup(name, keyMap[ft]);
+            for (var i = 0, e = ft.length; i < e; ++i) {
+                found = lookup(name, keyMap[ft[i]]);
+                if (found != null) return found;
+            }
+            return null;
+        }
+        return extraMap ? lookup(name, extraMap, map) : lookup(name, keyMap[map]);
+    }
+    function isModifierKey(event) {
+        var name = keyNames[event.keyCode];
+        return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
+    }
+
+    CodeMirror.fromTextArea = function(textarea, options) {
+        if (!options) options = {};
+        options.value = textarea.value;
+        if (!options.tabindex && textarea.tabindex)
+            options.tabindex = textarea.tabindex;
+
+        function save() {textarea.value = instance.getValue();}
+        if (textarea.form) {
+            // Deplorable hack to make the submit method do the right thing.
+            var rmSubmit = connect(textarea.form, "submit", save, true);
+            if (typeof textarea.form.submit == "function") {
+                var realSubmit = textarea.form.submit;
+                function wrappedSubmit() {
+                    save();
+                    textarea.form.submit = realSubmit;
+                    textarea.form.submit();
+                    textarea.form.submit = wrappedSubmit;
+                }
+                textarea.form.submit = wrappedSubmit;
+            }
+        }
+
+        textarea.style.display = "none";
+        var instance = CodeMirror(function(node) {
+            textarea.parentNode.insertBefore(node, textarea.nextSibling);
+        }, options);
+        instance.save = save;
+        instance.getTextArea = function() { return textarea; };
+        instance.toTextArea = function() {
+            save();
+            textarea.parentNode.removeChild(instance.getWrapperElement());
+            textarea.style.display = "";
+            if (textarea.form) {
+                rmSubmit();
+                if (typeof textarea.form.submit == "function")
+                    textarea.form.submit = realSubmit;
+            }
+        };
+        return instance;
+    };
+
+    // Utility functions for working with state. Exported because modes
+    // sometimes need to do this.
+    function copyState(mode, state) {
+        if (state === true) return state;
+        if (mode.copyState) return mode.copyState(state);
+        var nstate = {};
+        for (var n in state) {
+            var val = state[n];
+            if (val instanceof Array) val = val.concat([]);
+            nstate[n] = val;
+        }
+        return nstate;
+    }
+    CodeMirror.copyState = copyState;
+    function startState(mode, a1, a2) {
+        return mode.startState ? mode.startState(a1, a2) : true;
+    }
+    CodeMirror.startState = startState;
+
+    // The character stream used by a mode's parser.
+    function StringStream(string, tabSize) {
+        this.pos = this.start = 0;
+        this.string = string;
+        this.tabSize = tabSize || 8;
+    }
+    StringStream.prototype = {
+        eol: function() {return this.pos >= this.string.length;},
+        sol: function() {return this.pos == 0;},
+        peek: function() {return this.string.charAt(this.pos);},
+        next: function() {
+            if (this.pos < this.string.length)
+                return this.string.charAt(this.pos++);
+        },
+        eat: function(match) {
+            var ch = this.string.charAt(this.pos);
+            if (typeof match == "string") var ok = ch == match;
+            else var ok = ch && (match.test ? match.test(ch) : match(ch));
+            if (ok) {++this.pos; return ch;}
+        },
+        eatWhile: function(match) {
+            var start = this.pos;
+            while (this.eat(match)){}
+            return this.pos > start;
+        },
+        eatSpace: function() {
+            var start = this.pos;
+            while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
+            return this.pos > start;
+        },
+        skipToEnd: function() {this.pos = this.string.length;},
+        skipTo: function(ch) {
+            var found = this.string.indexOf(ch, this.pos);
+            if (found > -1) {this.pos = found; return true;}
+        },
+        backUp: function(n) {this.pos -= n;},
+        column: function() {return countColumn(this.string, this.start, this.tabSize);},
+        indentation: function() {return countColumn(this.string, null, this.tabSize);},
+        match: function(pattern, consume, caseInsensitive) {
+            if (typeof pattern == "string") {
+                function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
+                if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
+                    if (consume !== false) this.pos += pattern.length;
+                    return true;
+                }
+            }
+            else {
+                var match = this.string.slice(this.pos).match(pattern);
+                if (match && consume !== false) this.pos += match[0].length;
+                return match;
+            }
+        },
+        current: function(){return this.string.slice(this.start, this.pos);}
+    };
+    CodeMirror.StringStream = StringStream;
+
+    function MarkedText(from, to, className, set) {
+        this.from = from; this.to = to; this.style = className; this.set = set;
+    }
+    MarkedText.prototype = {
+        attach: function(line) { this.set.push(line); },
+        detach: function(line) {
+            var ix = indexOf(this.set, line);
+            if (ix > -1) this.set.splice(ix, 1);
+        },
+        split: function(pos, lenBefore) {
+            if (this.to <= pos && this.to != null) return null;
+            var from = this.from < pos || this.from == null ? null : this.from - pos + lenBefore;
+            var to = this.to == null ? null : this.to - pos + lenBefore;
+            return new MarkedText(from, to, this.style, this.set);
+        },
+        dup: function() { return new MarkedText(null, null, this.style, this.set); },
+        clipTo: function(fromOpen, from, toOpen, to, diff) {
+            if (this.from != null && this.from >= from)
+                this.from = Math.max(to, this.from) + diff;
+            if (this.to != null && this.to > from)
+                this.to = to < this.to ? this.to + diff : from;
+            if (fromOpen && to > this.from && (to < this.to || this.to == null))
+                this.from = null;
+            if (toOpen && (from < this.to || this.to == null) && (from > this.from || this.from == null))
+                this.to = null;
+        },
+        isDead: function() { return this.from != null && this.to != null && this.from >= this.to; },
+        sameSet: function(x) { return this.set == x.set; }
+    };
+
+    function Bookmark(pos) {
+        this.from = pos; this.to = pos; this.line = null;
+    }
+    Bookmark.prototype = {
+        attach: function(line) { this.line = line; },
+        detach: function(line) { if (this.line == line) this.line = null; },
+        split: function(pos, lenBefore) {
+            if (pos < this.from) {
+                this.from = this.to = (this.from - pos) + lenBefore;
+                return this;
+            }
+        },
+        isDead: function() { return this.from > this.to; },
+        clipTo: function(fromOpen, from, toOpen, to, diff) {
+            if ((fromOpen || from < this.from) && (toOpen || to > this.to)) {
+                this.from = 0; this.to = -1;
+            } else if (this.from > from) {
+                this.from = this.to = Math.max(to, this.from) + diff;
+            }
+        },
+        sameSet: function(x) { return false; },
+        find: function() {
+            if (!this.line || !this.line.parent) return null;
+            return {line: lineNo(this.line), ch: this.from};
+        },
+        clear: function() {
+            if (this.line) {
+                var found = indexOf(this.line.marked, this);
+                if (found != -1) this.line.marked.splice(found, 1);
+                this.line = null;
+            }
+        }
+    };
+
+    // Line objects. These hold state related to a line, including
+    // highlighting info (the styles array).
+    function Line(text, styles) {
+        this.styles = styles || [text, null];
+        this.text = text;
+        this.height = 1;
+        this.marked = this.gutterMarker = this.className = this.handlers = null;
+        this.stateAfter = this.parent = this.hidden = null;
+    }
+    Line.inheritMarks = function(text, orig) {
+        var ln = new Line(text), mk = orig && orig.marked;
+        if (mk) {
+            for (var i = 0; i < mk.length; ++i) {
+                if (mk[i].to == null && mk[i].style) {
+                    var newmk = ln.marked || (ln.marked = []), mark = mk[i];
+                    var nmark = mark.dup(); newmk.push(nmark); nmark.attach(ln);
+                }
+            }
+        }
+        return ln;
+    }
+    Line.prototype = {
+        // Replace a piece of a line, keeping the styles around it intact.
+        replace: function(from, to_, text) {
+            var st = [], mk = this.marked, to = to_ == null ? this.text.length : to_;
+            copyStyles(0, from, this.styles, st);
+            if (text) st.push(text, null);
+            copyStyles(to, this.text.length, this.styles, st);
+            this.styles = st;
+            this.text = this.text.slice(0, from) + text + this.text.slice(to);
+            this.stateAfter = null;
+            if (mk) {
+                var diff = text.length - (to - from);
+                for (var i = 0, mark = mk[i]; i < mk.length; ++i) {
+                    mark.clipTo(from == null, from || 0, to_ == null, to, diff);
+                    if (mark.isDead()) {mark.detach(this); mk.splice(i--, 1);}
+                }
+            }
+        },
+        // Split a part off a line, keeping styles and markers intact.
+        split: function(pos, textBefore) {
+            var st = [textBefore, null], mk = this.marked;
+            copyStyles(pos, this.text.length, this.styles, st);
+            var taken = new Line(textBefore + this.text.slice(pos), st);
+            if (mk) {
+                for (var i = 0; i < mk.length; ++i) {
+                    var mark = mk[i];
+                    var newmark = mark.split(pos, textBefore.length);
+                    if (newmark) {
+                        if (!taken.marked) taken.marked = [];
+                        taken.marked.push(newmark); newmark.attach(taken);
+                    }
+                }
+            }
+            return taken;
+        },
+        append: function(line) {
+            var mylen = this.text.length, mk = line.marked, mymk = this.marked;
+            this.text += line.text;
+            copyStyles(0, line.text.length, line.styles, this.styles);
+            if (mymk) {
+                for (var i = 0; i < mymk.length; ++i)
+                    if (mymk[i].to == null) mymk[i].to = mylen;
+            }
+            if (mk && mk.length) {
+                if (!mymk) this.marked = mymk = [];
+                outer: for (var i = 0; i < mk.length; ++i) {
+                    var mark = mk[i];
+                    if (!mark.from) {
+                        for (var j = 0; j < mymk.length; ++j) {
+                            var mymark = mymk[j];
+                            if (mymark.to == mylen && mymark.sameSet(mark)) {
+                                mymark.to = mark.to == null ? null : mark.to + mylen;
+                                if (mymark.isDead()) {
+                                    mymark.detach(this);
+                                    mk.splice(i--, 1);
+                                }
+                                continue outer;
+                            }
+                        }
+                    }
+                    mymk.push(mark);
+                    mark.attach(this);
+                    mark.from += mylen;
+                    if (mark.to != null) mark.to += mylen;
+                }
+            }
+        },
+        fixMarkEnds: function(other) {
+            var mk = this.marked, omk = other.marked;
+            if (!mk) return;
+            for (var i = 0; i < mk.length; ++i) {
+                var mark = mk[i], close = mark.to == null;
+                if (close && omk) {
+                    for (var j = 0; j < omk.length; ++j)
+                        if (omk[j].sameSet(mark)) {close = false; break;}
+                }
+                if (close) mark.to = this.text.length;
+            }
+        },
+        fixMarkStarts: function() {
+            var mk = this.marked;
+            if (!mk) return;
+            for (var i = 0; i < mk.length; ++i)
+                if (mk[i].from == null) mk[i].from = 0;
+        },
+        addMark: function(mark) {
+            mark.attach(this);
+            if (this.marked == null) this.marked = [];
+            this.marked.push(mark);
+            this.marked.sort(function(a, b){return (a.from || 0) - (b.from || 0);});
+        },
+        // Run the given mode's parser over a line, update the styles
+        // array, which contains alternating fragments of text and CSS
+        // classes.
+        highlight: function(mode, state, tabSize) {
+            var stream = new StringStream(this.text, tabSize), st = this.styles, pos = 0;
+            var changed = false, curWord = st[0], prevWord;
+            if (this.text == "" && mode.blankLine) mode.blankLine(state);
+            while (!stream.eol()) {
+                var style = mode.token(stream, state);
+                var substr = this.text.slice(stream.start, stream.pos);
+                stream.start = stream.pos;
+                if (pos && st[pos-1] == style)
+                    st[pos-2] += substr;
+                else if (substr) {
+                    if (!changed && (st[pos+1] != style || (pos && st[pos-2] != prevWord))) changed = true;
+                    st[pos++] = substr; st[pos++] = style;
+                    prevWord = curWord; curWord = st[pos];
+                }
+                // Give up when line is ridiculously long
+                if (stream.pos > 5000) {
+                    st[pos++] = this.text.slice(stream.pos); st[pos++] = null;
+                    break;
+                }
+            }
+            if (st.length != pos) {st.length = pos; changed = true;}
+            if (pos && st[pos-2] != prevWord) changed = true;
+            // Short lines with simple highlights return null, and are
+            // counted as changed by the driver because they are likely to
+            // highlight the same way in various contexts.
+            return changed || (st.length < 5 && this.text.length < 10 ? null : false);
+        },
+        // Fetch the parser token for a given character. Useful for hacks
+        // that want to inspect the mode state (say, for completion).
+        getTokenAt: function(mode, state, ch) {
+            var txt = this.text, stream = new StringStream(txt);
+            while (stream.pos < ch && !stream.eol()) {
+                stream.start = stream.pos;
+                var style = mode.token(stream, state);
+            }
+            return {start: stream.start,
+                end: stream.pos,
+                string: stream.current(),
+                className: style || null,
+                state: state};
+        },
+        indentation: function(tabSize) {return countColumn(this.text, null, tabSize);},
+        // Produces an HTML fragment for the line, taking selection,
+        // marking, and highlighting into account.
+        getHTML: function(sfrom, sto, includePre, tabText, endAt) {
+            var html = [], first = true;
+            if (includePre)
+                html.push(this.className ? '<pre class="' + this.className + '">': "<pre>");
+            function span(text, style) {
+                if (!text) return;
+                // Work around a bug where, in some compat modes, IE ignores leading spaces
+                if (first && ie && text.charAt(0) == " ") text = "\u00a0" + text.slice(1);
+                first = false;
+                if (style) html.push('<span class="', style, '">', htmlEscape(text).replace(/\t/g, tabText), "</span>");
+                else html.push(htmlEscape(text).replace(/\t/g, tabText));
+            }
+            var st = this.styles, allText = this.text, marked = this.marked;
+            if (sfrom == sto) sfrom = null;
+            var len = allText.length;
+            if (endAt != null) len = Math.min(endAt, len);
+
+            if (!allText && endAt == null)
+                span(" ", sfrom != null && sto == null ? "CodeMirror-selected" : null);
+            else if (!marked && sfrom == null)
+                for (var i = 0, ch = 0; ch < len; i+=2) {
+                    var str = st[i], style = st[i+1], l = str.length;
+                    if (ch + l > len) str = str.slice(0, len - ch);
+                    ch += l;
+                    span(str, style && "cm-" + style);
+                }
+            else {
+                var pos = 0, i = 0, text = "", style, sg = 0;
+                var markpos = -1, mark = null;
+                function nextMark() {
+                    if (marked) {
+                        markpos += 1;
+                        mark = (markpos < marked.length) ? marked[markpos] : null;
+                    }
+                }
+                nextMark();
+                while (pos < len) {
+                    var upto = len;
+                    var extraStyle = "";
+                    if (sfrom != null) {
+                        if (sfrom > pos) upto = sfrom;
+                        else if (sto == null || sto > pos) {
+                            extraStyle = " CodeMirror-selected";
+                            if (sto != null) upto = Math.min(upto, sto);
+                        }
+                    }
+                    while (mark && mark.to != null && mark.to <= pos) nextMark();
+                    if (mark) {
+                        if (mark.from > pos) upto = Math.min(upto, mark.from);
+                        else {
+                            extraStyle += " " + mark.style;
+                            if (mark.to != null) upto = Math.min(upto, mark.to);
+                        }
+                    }
+                    for (;;) {
+                        var end = pos + text.length;
+                        var appliedStyle = style;
+                        if (extraStyle) appliedStyle = style ? style + extraStyle : extraStyle;
+                        span(end > upto ? text.slice(0, upto - pos) : text, appliedStyle);
+                        if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
+                        pos = end;
+                        text = st[i++]; style = "cm-" + st[i++];
+                    }
+                }
+                if (sfrom != null && sto == null) span(" ", "CodeMirror-selected");
+            }
+            if (includePre) html.push("</pre>");
+            return html.join("");
+        },
+        cleanUp: function() {
+            this.parent = null;
+            if (this.marked)
+                for (var i = 0, e = this.marked.length; i < e; ++i) this.marked[i].detach(this);
+        }
+    };
+    // Utility used by replace and split above
+    function copyStyles(from, to, source, dest) {
+        for (var i = 0, pos = 0, state = 0; pos < to; i+=2) {
+            var part = source[i], end = pos + part.length;
+            if (state == 0) {
+                if (end > from) dest.push(part.slice(from - pos, Math.min(part.length, to - pos)), source[i+1]);
+                if (end >= from) state = 1;
+            }
+            else if (state == 1) {
+                if (end > to) dest.push(part.slice(0, to - pos), source[i+1]);
+                else dest.push(part, source[i+1]);
+            }
+            pos = end;
+        }
+    }
+
+    // Data structure that holds the sequence of lines.
+    function LeafChunk(lines) {
+        this.lines = lines;
+        this.parent = null;
+        for (var i = 0, e = lines.length, height = 0; i < e; ++i) {
+            lines[i].parent = this;
+            height += lines[i].height;
+        }
+        this.height = height;
+    }
+    LeafChunk.prototype = {
+        chunkSize: function() { return this.lines.length; },
+        remove: function(at, n, callbacks) {
+            for (var i = at, e = at + n; i < e; ++i) {
+                var line = this.lines[i];
+                this.height -= line.height;
+                line.cleanUp();
+                if (line.handlers)
+                    for (var j = 0; j < line.handlers.length; ++j) callbacks.push(line.handlers[j]);
+            }
+            this.lines.splice(at, n);
+        },
+        collapse: function(lines) {
+            lines.splice.apply(lines, [lines.length, 0].concat(this.lines));
+        },
+        insertHeight: function(at, lines, height) {
+            this.height += height;
+            this.lines.splice.apply(this.lines, [at, 0].concat(lines));
+            for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this;
+        },
+        iterN: function(at, n, op) {
+            for (var e = at + n; at < e; ++at)
+                if (op(this.lines[at])) return true;
+        }
+    };
+    function BranchChunk(children) {
+        this.children = children;
+        var size = 0, height = 0;
+        for (var i = 0, e = children.length; i < e; ++i) {
+            var ch = children[i];
+            size += ch.chunkSize(); height += ch.height;
+            ch.parent = this;
+        }
+        this.size = size;
+        this.height = height;
+        this.parent = null;
+    }
+    BranchChunk.prototype = {
+        chunkSize: function() { return this.size; },
+        remove: function(at, n, callbacks) {
+            this.size -= n;
+            for (var i = 0; i < this.children.length; ++i) {
+                var child = this.children[i], sz = child.chunkSize();
+                if (at < sz) {
+                    var rm = Math.min(n, sz - at), oldHeight = child.height;
+                    child.remove(at, rm, callbacks);
+                    this.height -= oldHeight - child.height;
+                    if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
+                    if ((n -= rm) == 0) break;
+                    at = 0;
+                } else at -= sz;
+            }
+            if (this.size - n < 25) {
+                var lines = [];
+                this.collapse(lines);
+                this.children = [new LeafChunk(lines)];
+            }
+        },
+        collapse: function(lines) {
+            for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines);
+        },
+        insert: function(at, lines) {
+            var height = 0;
+            for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height;
+            this.insertHeight(at, lines, height);
+        },
+        insertHeight: function(at, lines, height) {
+            this.size += lines.length;
+            this.height += height;
+            for (var i = 0, e = this.children.length; i < e; ++i) {
+                var child = this.children[i], sz = child.chunkSize();
+                if (at <= sz) {
+                    child.insertHeight(at, lines, height);
+                    if (child.lines && child.lines.length > 50) {
+                        while (child.lines.length > 50) {
+                            var spilled = child.lines.splice(child.lines.length - 25, 25);
+                            var newleaf = new LeafChunk(spilled);
+                            child.height -= newleaf.height;
+                            this.children.splice(i + 1, 0, newleaf);
+                            newleaf.parent = this;
+                        }
+                        this.maybeSpill();
+                    }
+                    break;
+                }
+                at -= sz;
+            }
+        },
+        maybeSpill: function() {
+            if (this.children.length <= 10) return;
+            var me = this;
+            do {
+                var spilled = me.children.splice(me.children.length - 5, 5);
+                var sibling = new BranchChunk(spilled);
+                if (!me.parent) { // Become the parent node
+                    var copy = new BranchChunk(me.children);
+                    copy.parent = me;
+                    me.children = [copy, sibling];
+                    me = copy;
+                } else {
+                    me.size -= sibling.size;
+                    me.height -= sibling.height;
+                    var myIndex = indexOf(me.parent.children, me);
+                    me.parent.children.splice(myIndex + 1, 0, sibling);
+                }
+                sibling.parent = me.parent;
+            } while (me.children.length > 10);
+            me.parent.maybeSpill();
+        },
+        iter: function(from, to, op) { this.iterN(from, to - from, op); },
+        iterN: function(at, n, op) {
+            for (var i = 0, e = this.children.length; i < e; ++i) {
+                var child = this.children[i], sz = child.chunkSize();
+                if (at < sz) {
+                    var used = Math.min(n, sz - at);
+                    if (child.iterN(at, used, op)) return true;
+                    if ((n -= used) == 0) break;
+                    at = 0;
+                } else at -= sz;
+            }
+        }
+    };
+
+    function getLineAt(chunk, n) {
+        while (!chunk.lines) {
+            for (var i = 0;; ++i) {
+                var child = chunk.children[i], sz = child.chunkSize();
+                if (n < sz) { chunk = child; break; }
+                n -= sz;
+            }
+        }
+        return chunk.lines[n];
+    }
+    function lineNo(line) {
+        if (line.parent == null) return null;
+        var cur = line.parent, no = indexOf(cur.lines, line);
+        for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
+            for (var i = 0, e = chunk.children.length; ; ++i) {
+                if (chunk.children[i] == cur) break;
+                no += chunk.children[i].chunkSize();
+            }
+        }
+        return no;
+    }
+    function lineAtHeight(chunk, h) {
+        var n = 0;
+        outer: do {
+            for (var i = 0, e = chunk.children.length; i < e; ++i) {
+                var child = chunk.children[i], ch = child.height;
+                if (h < ch) { chunk = child; continue outer; }
+                h -= ch;
+                n += child.chunkSize();
+            }
+            return n;
+        } while (!chunk.lines);
+        for (var i = 0, e = chunk.lines.length; i < e; ++i) {
+            var line = chunk.lines[i], lh = line.height;
+            if (h < lh) break;
+            h -= lh;
+        }
+        return n + i;
+    }
+    function heightAtLine(chunk, n) {
+        var h = 0;
+        outer: do {
+            for (var i = 0, e = chunk.children.length; i < e; ++i) {
+                var child = chunk.children[i], sz = child.chunkSize();
+                if (n < sz) { chunk = child; continue outer; }
+                n -= sz;
+                h += child.height;
+            }
+            return h;
+        } while (!chunk.lines);
+        for (var i = 0; i < n; ++i) h += chunk.lines[i].height;
+        return h;
+    }
+
+    // The history object 'chunks' changes that are made close together
+    // and at almost the same time into bigger undoable units.
+    function History() {
+        this.time = 0;
+        this.done = []; this.undone = [];
+    }
+    History.prototype = {
+        addChange: function(start, added, old) {
+            this.undone.length = 0;
+            var time = +new Date, last = this.done[this.done.length - 1];
+            if (time - this.time > 400 || !last ||
+                last.start > start + added || last.start + last.added < start - last.added + last.old.length)
+                this.done.push({start: start, added: added, old: old});
+            else {
+                var oldoff = 0;
+                if (start < last.start) {
+                    for (var i = last.start - start - 1; i >= 0; --i)
+                        last.old.unshift(old[i]);
+                    last.added += last.start - start;
+                    last.start = start;
+                }
+                else if (last.start < start) {
+                    oldoff = start - last.start;
+                    added += oldoff;
+                }
+                for (var i = last.added - oldoff, e = old.length; i < e; ++i)
+                    last.old.push(old[i]);
+                if (last.added < added) last.added = added;
+            }
+            this.time = time;
+        }
+    };
+
+    function stopMethod() {e_stop(this);}
+    // Ensure an event has a stop method.
+    function addStop(event) {
+        if (!event.stop) event.stop = stopMethod;
+        return event;
+    }
+
+    function e_preventDefault(e) {
+        if (e.preventDefault) e.preventDefault();
+        else e.returnValue = false;
+    }
+    function e_stopPropagation(e) {
+        if (e.stopPropagation) e.stopPropagation();
+        else e.cancelBubble = true;
+    }
+    function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
+    CodeMirror.e_stop = e_stop;
+    CodeMirror.e_preventDefault = e_preventDefault;
+    CodeMirror.e_stopPropagation = e_stopPropagation;
+
+    function e_target(e) {return e.target || e.srcElement;}
+    function e_button(e) {
+        if (e.which) return e.which;
+        else if (e.button & 1) return 1;
+        else if (e.button & 2) return 3;
+        else if (e.button & 4) return 2;
+    }
+
+    // Event handler registration. If disconnect is true, it'll return a
+    // function that unregisters the handler.
+    function connect(node, type, handler, disconnect) {
+        if (typeof node.addEventListener == "function") {
+            node.addEventListener(type, handler, false);
+            if (disconnect) return function() {node.removeEventListener(type, handler, false);};
+        }
+        else {
+            var wrapHandler = function(event) {handler(event || window.event);};
+            node.attachEvent("on" + type, wrapHandler);
+            if (disconnect) return function() {node.detachEvent("on" + type, wrapHandler);};
+        }
+    }
+    CodeMirror.connect = connect;
+
+    function Delayed() {this.id = null;}
+    Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}};
+
+    // Detect drag-and-drop
+    var dragAndDrop = function() {
+        // IE8 has ondragstart and ondrop properties, but doesn't seem to
+        // actually support ondragstart the way it's supposed to work.
+        if (/MSIE [1-8]\b/.test(navigator.userAgent)) return false;
+        var div = document.createElement('div');
+        return "draggable" in div;
+    }();
+
+    var gecko = /gecko\/\d{7}/i.test(navigator.userAgent);
+    var ie = /MSIE \d/.test(navigator.userAgent);
+    var webkit = /WebKit\//.test(navigator.userAgent);
+
+    var lineSep = "\n";
+    // Feature-detect whether newlines in textareas are converted to \r\n
+    (function () {
+        var te = document.createElement("textarea");
+        te.value = "foo\nbar";
+        if (te.value.indexOf("\r") > -1) lineSep = "\r\n";
+    }());
+
+    // Counts the column offset in a string, taking tabs into account.
+    // Used mostly to find indentation.
+    function countColumn(string, end, tabSize) {
+        if (end == null) {
+            end = string.search(/[^\s\u00a0]/);
+            if (end == -1) end = string.length;
+        }
+        for (var i = 0, n = 0; i < end; ++i) {
+            if (string.charAt(i) == "\t") n += tabSize - (n % tabSize);
+            else ++n;
+        }
+        return n;
+    }
+
+    function computedStyle(elt) {
+        if (elt.currentStyle) return elt.currentStyle;
+        return window.getComputedStyle(elt, null);
+    }
+
+    // Find the position of an element by following the offsetParent chain.
+    // If screen==true, it returns screen (rather than page) coordinates.
+    function eltOffset(node, screen) {
+        var bod = node.ownerDocument.body;
+        var x = 0, y = 0, skipBody = false;
+        for (var n = node; n; n = n.offsetParent) {
+            var ol = n.offsetLeft, ot = n.offsetTop;
+            // Firefox reports weird inverted offsets when the body has a border.
+            if (n == bod) { x += Math.abs(ol); y += Math.abs(ot); }
+            else { x += ol, y += ot; }
+            if (screen && computedStyle(n).position == "fixed")
+                skipBody = true;
+        }
+        var e = screen && !skipBody ? null : bod;
+        for (var n = node.parentNode; n != e; n = n.parentNode)
+            if (n.scrollLeft != null) { x -= n.scrollLeft; y -= n.scrollTop;}
+        return {left: x, top: y};
+    }
+    // Use the faster and saner getBoundingClientRect method when possible.
+    if (document.documentElement.getBoundingClientRect != null) eltOffset = function(node, screen) {
+        // Take the parts of bounding client rect that we are interested in so we are able to edit if need be,
+        // since the returned value cannot be changed externally (they are kept in sync as the element moves within the page)
+        try { var box = node.getBoundingClientRect(); box = { top: box.top, left: box.left }; }
+        catch(e) { box = {top: 0, left: 0}; }
+        if (!screen) {
+            // Get the toplevel scroll, working around browser differences.
+            if (window.pageYOffset == null) {
+                var t = document.documentElement || document.body.parentNode;
+                if (t.scrollTop == null) t = document.body;
+                box.top += t.scrollTop; box.left += t.scrollLeft;
+            } else {
+                box.top += window.pageYOffset; box.left += window.pageXOffset;
+            }
+        }
+        return box;
+    };
+
+    // Get a node's text content.
+    function eltText(node) {
+        return node.textContent || node.innerText || node.nodeValue || "";
+    }
+
+    // Operations on {line, ch} objects.
+    function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
+    function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}
+    function copyPos(x) {return {line: x.line, ch: x.ch};}
+
+    var escapeElement = document.createElement("pre");
+    function htmlEscape(str) {
+        escapeElement.textContent = str;
+        return escapeElement.innerHTML;
+    }
+    // Recent (late 2011) Opera betas insert bogus newlines at the start
+    // of the textContent, so we strip those.
+    if (htmlEscape("a") == "\na")
+        htmlEscape = function(str) {
+            escapeElement.textContent = str;
+            return escapeElement.innerHTML.slice(1);
+        };
+    // Some IEs don't preserve tabs through innerHTML
+    else if (htmlEscape("\t") != "\t")
+        htmlEscape = function(str) {
+            escapeElement.innerHTML = "";
+            escapeElement.appendChild(document.createTextNode(str));
+            return escapeElement.innerHTML;
+        };
+    CodeMirror.htmlEscape = htmlEscape;
+
+    // Used to position the cursor after an undo/redo by finding the
+    // last edited character.
+    function editEnd(from, to) {
+        if (!to) return from ? from.length : 0;
+        if (!from) return to.length;
+        for (var i = from.length, j = to.length; i >= 0 && j >= 0; --i, --j)
+            if (from.charAt(i) != to.charAt(j)) break;
+        return j + 1;
+    }
+
+    function indexOf(collection, elt) {
+        if (collection.indexOf) return collection.indexOf(elt);
+        for (var i = 0, e = collection.length; i < e; ++i)
+            if (collection[i] == elt) return i;
+        return -1;
+    }
+    function isWordChar(ch) {
+        return /\w/.test(ch) || ch.toUpperCase() != ch.toLowerCase();
+    }
+
+    // See if "".split is the broken IE version, if so, provide an
+    // alternative way to split lines.
+    var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
+        var pos = 0, nl, result = [];
+        while ((nl = string.indexOf("\n", pos)) > -1) {
+            result.push(string.slice(pos, string.charAt(nl-1) == "\r" ? nl - 1 : nl));
+            pos = nl + 1;
+        }
+        result.push(string.slice(pos));
+        return result;
+    } : function(string){return string.split(/\r?\n/);};
+    CodeMirror.splitLines = splitLines;
+
+    var hasSelection = window.getSelection ? function(te) {
+        try { return te.selectionStart != te.selectionEnd; }
+        catch(e) { return false; }
+    } : function(te) {
+        try {var range = te.ownerDocument.selection.createRange();}
+        catch(e) {}
+        if (!range || range.parentElement() != te) return false;
+        return range.compareEndPoints("StartToEnd", range) != 0;
+    };
+
+    CodeMirror.defineMode("null", function() {
+        return {token: function(stream) {stream.skipToEnd();}};
+    });
+    CodeMirror.defineMIME("text/plain", "null");
+
+    var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
+        19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
+        36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
+        46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 186: ";", 187: "=", 188: ",",
+        189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 63276: "PageUp",
+        63277: "PageDown", 63275: "End", 63273: "Home", 63234: "Left", 63232: "Up", 63235: "Right",
+        63233: "Down", 63302: "Insert", 63272: "Delete"};
+    CodeMirror.keyNames = keyNames;
+    (function() {
+        // Number keys
+        for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i);
+        // Alphabetic keys
+        for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
+        // Function keys
+        for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
+    })();
+
+    return CodeMirror;
+})();
+CodeMirror.defineMode("xml", function(config, parserConfig) {
+    var indentUnit = config.indentUnit;
+    var Kludges = parserConfig.htmlMode ? {
+        autoSelfClosers: {"br": true, "img": true, "hr": true, "link": true, "input": true,
+            "meta": true, "col": true, "frame": true, "base": true, "area": true},
+        doNotIndent: {"pre": true},
+        allowUnquoted: true
+    } : {autoSelfClosers: {}, doNotIndent: {}, allowUnquoted: false};
+    var alignCDATA = parserConfig.alignCDATA;
+
+    // Return variables for tokenizers
+    var tagName, type;
+
+    function inText(stream, state) {
+        function chain(parser) {
+            state.tokenize = parser;
+            return parser(stream, state);
+        }
+
+        var ch = stream.next();
+        if (ch == "<") {
+            if (stream.eat("!")) {
+                if (stream.eat("[")) {
+                    if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));
+                    else return null;
+                }
+                else if (stream.match("--")) return chain(inBlock("comment", "-->"));
+                else if (stream.match("DOCTYPE", true, true)) {
+                    stream.eatWhile(/[\w\._\-]/);
+                    return chain(doctype(1));
+                }
+                else return null;
+            }
+            else if (stream.eat("?")) {
+                stream.eatWhile(/[\w\._\-]/);
+                state.tokenize = inBlock("meta", "?>");
+                return "meta";
+            }
+            else {
+                type = stream.eat("/") ? "closeTag" : "openTag";
+                stream.eatSpace();
+                tagName = "";
+                var c;
+                while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c;
+                state.tokenize = inTag;
+                return "tag";
+            }
+        }
+        else if (ch == "&") {
+            stream.eatWhile(/[^;]/);
+            stream.eat(";");
+            return "atom";
+        }
+        else {
+            stream.eatWhile(/[^&<]/);
+            return null;
+        }
+    }
+
+    function inTag(stream, state) {
+        var ch = stream.next();
+        if (ch == ">" || (ch == "/" && stream.eat(">"))) {
+            state.tokenize = inText;
+            type = ch == ">" ? "endTag" : "selfcloseTag";
+            return "tag";
+        }
+        else if (ch == "=") {
+            type = "equals";
+            return null;
+        }
+        else if (/[\'\"]/.test(ch)) {
+            state.tokenize = inAttribute(ch);
+            return state.tokenize(stream, state);
+        }
+        else {
+            stream.eatWhile(/[^\s\u00a0=<>\"\'\/?]/);
+            return "word";
+        }
+    }
+
+    function inAttribute(quote) {
+        return function(stream, state) {
+            while (!stream.eol()) {
+                if (stream.next() == quote) {
+                    state.tokenize = inTag;
+                    break;
+                }
+            }
+            return "string";
+        };
+    }
+
+    function inBlock(style, terminator) {
+        return function(stream, state) {
+            while (!stream.eol()) {
+                if (stream.match(terminator)) {
+                    state.tokenize = inText;
+                    break;
+                }
+                stream.next();
+            }
+            return style;
+        };
+    }
+    function doctype(depth) {
+        return function(stream, state) {
+            var ch;
+            while ((ch = stream.next()) != null) {
+                if (ch == "<") {
+                    state.tokenize = doctype(depth + 1);
+                    return state.tokenize(stream, state);
+                } else if (ch == ">") {
+                    if (depth == 1) {
+                        state.tokenize = inText;
+                        break;
+                    } else {
+                        state.tokenize = doctype(depth - 1);
+                        return state.tokenize(stream, state);
+                    }
+                }
+            }
+            return "meta";
+        };
+    }
+
+    var curState, setStyle;
+    function pass() {
+        for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);
+    }
+    function cont() {
+        pass.apply(null, arguments);
+        return true;
+    }
+
+    function pushContext(tagName, startOfLine) {
+        var noIndent = Kludges.doNotIndent.hasOwnProperty(tagName) || (curState.context && curState.context.noIndent);
+        curState.context = {
+            prev: curState.context,
+            tagName: tagName,
+            indent: curState.indented,
+            startOfLine: startOfLine,
+            noIndent: noIndent
+        };
+    }
+    function popContext() {
+        if (curState.context) curState.context = curState.context.prev;
+    }
+
+    function element(type) {
+        if (type == "openTag") {
+            curState.tagName = tagName;
+            return cont(attributes, endtag(curState.startOfLine));
+        } else if (type == "closeTag") {
+            var err = false;
+            if (curState.context) {
+                err = curState.context.tagName != tagName;
+            } else {
+                err = true;
+            }
+            if (err) setStyle = "error";
+            return cont(endclosetag(err));
+        }
+        return cont();
+    }
+    function endtag(startOfLine) {
+        return function(type) {
+            if (type == "selfcloseTag" ||
+                (type == "endTag" && Kludges.autoSelfClosers.hasOwnProperty(curState.tagName.toLowerCase())))
+                return cont();
+            if (type == "endTag") {pushContext(curState.tagName, startOfLine); return cont();}
+            return cont();
+        };
+    }
+    function endclosetag(err) {
+        return function(type) {
+            if (err) setStyle = "error";
+            if (type == "endTag") { popContext(); return cont(); }
+            setStyle = "error";
+            return cont(arguments.callee);
+        }
+    }
+
+    function attributes(type) {
+        if (type == "word") {setStyle = "attribute"; return cont(attributes);}
+        if (type == "equals") return cont(attvalue, attributes);
+        if (type == "string") {setStyle = "error"; return cont(attributes);}
+        return pass();
+    }
+    function attvalue(type) {
+        if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return cont();}
+        if (type == "string") return cont(attvaluemaybe);
+        return pass();
+    }
+    function attvaluemaybe(type) {
+        if (type == "string") return cont(attvaluemaybe);
+        else return pass();
+    }
+
+    return {
+        startState: function() {
+            return {tokenize: inText, cc: [], indented: 0, startOfLine: true, tagName: null, context: null};
+        },
+
+        token: function(stream, state) {
+            if (stream.sol()) {
+                state.startOfLine = true;
+                state.indented = stream.indentation();
+            }
+            if (stream.eatSpace()) return null;
+
+            setStyle = type = tagName = null;
+            var style = state.tokenize(stream, state);
+            state.type = type;
+            if ((style || type) && style != "comment") {
+                curState = state;
+                while (true) {
+                    var comb = state.cc.pop() || element;
+                    if (comb(type || style)) break;
+                }
+            }
+            state.startOfLine = false;
+            return setStyle || style;
+        },
+
+        indent: function(state, textAfter, fullLine) {
+            var context = state.context;
+            if ((state.tokenize != inTag && state.tokenize != inText) ||
+                context && context.noIndent)
+                return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;
+            if (alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0;
+            if (context && /^<\//.test(textAfter))
+                context = context.prev;
+            while (context && !context.startOfLine)
+                context = context.prev;
+            if (context) return context.indent + indentUnit;
+            else return 0;
+        },
+
+        compareStates: function(a, b) {
+            if (a.indented != b.indented || a.tokenize != b.tokenize) return false;
+            for (var ca = a.context, cb = b.context; ; ca = ca.prev, cb = cb.prev) {
+                if (!ca || !cb) return ca == cb;
+                if (ca.tagName != cb.tagName) return false;
+            }
+        },
+
+        electricChars: "/"
+    };
+});
+
+CodeMirror.defineMIME("application/xml", "xml");
+CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true});
+CodeMirror.defineMode("javascript", function(config, parserConfig) {
+    var indentUnit = config.indentUnit;
+    var jsonMode = parserConfig.json;
+
+    // Tokenizer
+
+    var keywords = function(){
+        function kw(type) {return {type: type, style: "keyword"};}
+        var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
+        var operator = kw("operator"), atom = {type: "atom", style: "atom"};
+        return {
+            "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
+            "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C,
+            "var": kw("var"), "const": kw("var"), "let": kw("var"),
+            "function": kw("function"), "catch": kw("catch"),
+            "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
+            "in": operator, "typeof": operator, "instanceof": operator,
+            "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom
+        };
+    }();
+
+    var isOperatorChar = /[+\-*&%=<>!?|]/;
+
+    function chain(stream, state, f) {
+        state.tokenize = f;
+        return f(stream, state);
+    }
+
+    function nextUntilUnescaped(stream, end) {
+        var escaped = false, next;
+        while ((next = stream.next()) != null) {
+            if (next == end && !escaped)
+                return false;
+            escaped = !escaped && next == "\\";
+        }
+        return escaped;
+    }
+
+    // Used as scratch variables to communicate multiple values without
+    // consing up tons of objects.
+    var type, content;
+    function ret(tp, style, cont) {
+        type = tp; content = cont;
+        return style;
+    }
+
+    function jsTokenBase(stream, state) {
+        var ch = stream.next();
+        if (ch == '"' || ch == "'")
+            return chain(stream, state, jsTokenString(ch));
+        else if (/[\[\]{}\(\),;\:\.]/.test(ch))
+            return ret(ch);
+        else if (ch == "0" && stream.eat(/x/i)) {
+            stream.eatWhile(/[\da-f]/i);
+            return ret("number", "number");
+        }
+        else if (/\d/.test(ch)) {
+            stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
+            return ret("number", "number");
+        }
+        else if (ch == "/") {
+            if (stream.eat("*")) {
+                return chain(stream, state, jsTokenComment);
+            }
+            else if (stream.eat("/")) {
+                stream.skipToEnd();
+                return ret("comment", "comment");
+            }
+            else if (state.reAllowed) {
+                nextUntilUnescaped(stream, "/");
+                stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
+                return ret("regexp", "string");
+            }
+            else {
+                stream.eatWhile(isOperatorChar);
+                return ret("operator", null, stream.current());
+            }
+        }
+        else if (ch == "#") {
+            stream.skipToEnd();
+            return ret("error", "error");
+        }
+        else if (isOperatorChar.test(ch)) {
+            stream.eatWhile(isOperatorChar);
+            return ret("operator", null, stream.current());
+        }
+        else {
+            stream.eatWhile(/[\w\$_]/);
+            var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
+            return (known && state.kwAllowed) ? ret(known.type, known.style, word) :
+                ret("variable", "variable", word);
+        }
+    }
+
+    function jsTokenString(quote) {
+        return function(stream, state) {
+            if (!nextUntilUnescaped(stream, quote))
+                state.tokenize = jsTokenBase;
+            return ret("string", "string");
+        };
+    }
+
+    function jsTokenComment(stream, state) {
+        var maybeEnd = false, ch;
+        while (ch = stream.next()) {
+            if (ch == "/" && maybeEnd) {
+                state.tokenize = jsTokenBase;
+                break;
+            }
+            maybeEnd = (ch == "*");
+        }
+        return ret("comment", "comment");
+    }
+
+    // Parser
+
+    var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true};
+
+    function JSLexical(indented, column, type, align, prev, info) {
+        this.indented = indented;
+        this.column = column;
+        this.type = type;
+        this.prev = prev;
+        this.info = info;
+        if (align != null) this.align = align;
+    }
+
+    function inScope(state, varname) {
+        for (var v = state.localVars; v; v = v.next)
+            if (v.name == varname) return true;
+    }
+
+    function parseJS(state, style, type, content, stream) {
+        var cc = state.cc;
+        // Communicate our context to the combinators.
+        // (Less wasteful than consing up a hundred closures on every call.)
+        cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
+
+        if (!state.lexical.hasOwnProperty("align"))
+            state.lexical.align = true;
+
+        while(true) {
+            var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
+            if (combinator(type, content)) {
+                while(cc.length && cc[cc.length - 1].lex)
+                    cc.pop()();
+                if (cx.marked) return cx.marked;
+                if (type == "variable" && inScope(state, content)) return "variable-2";
+                return style;
+            }
+        }
+    }
+
+    // Combinator utils
+
+    var cx = {state: null, column: null, marked: null, cc: null};
+    function pass() {
+        for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
+    }
+    function cont() {
+        pass.apply(null, arguments);
+        return true;
+    }
+    function register(varname) {
+        var state = cx.state;
+        if (state.context) {
+            cx.marked = "def";
+            for (var v = state.localVars; v; v = v.next)
+                if (v.name == varname) return;
+            state.localVars = {name: varname, next: state.localVars};
+        }
+    }
+
+    // Combinators
+
+    var defaultVars = {name: "this", next: {name: "arguments"}};
+    function pushcontext() {
+        if (!cx.state.context) cx.state.localVars = defaultVars;
+        cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
+    }
+    function popcontext() {
+        cx.state.localVars = cx.state.context.vars;
+        cx.state.context = cx.state.context.prev;
+    }
+    function pushlex(type, info) {
+        var result = function() {
+            var state = cx.state;
+            state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)
+        };
+        result.lex = true;
+        return result;
+    }
+    function poplex() {
+        var state = cx.state;
+        if (state.lexical.prev) {
+            if (state.lexical.type == ")")
+                state.indented = state.lexical.indented;
+            state.lexical = state.lexical.prev;
+        }
+    }
+    poplex.lex = true;
+
+    function expect(wanted) {
+        return function expecting(type) {
+            if (type == wanted) return cont();
+            else if (wanted == ";") return pass();
+            else return cont(arguments.callee);
+        };
+    }
+
+    function statement(type) {
+        if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
+        if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
+        if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
+        if (type == "{") return cont(pushlex("}"), block, poplex);
+        if (type == ";") return cont();
+        if (type == "function") return cont(functiondef);
+        if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
+            poplex, statement, poplex);
+        if (type == "variable") return cont(pushlex("stat"), maybelabel);
+        if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
+            block, poplex, poplex);
+        if (type == "case") return cont(expression, expect(":"));
+        if (type == "default") return cont(expect(":"));
+        if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
+            statement, poplex, popcontext);
+        return pass(pushlex("stat"), expression, expect(";"), poplex);
+    }
+    function expression(type) {
+        if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);
+        if (type == "function") return cont(functiondef);
+        if (type == "keyword c") return cont(maybeexpression);
+        if (type == "(") return cont(pushlex(")"), expression, expect(")"), poplex, maybeoperator);
+        if (type == "operator") return cont(expression);
+        if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator);
+        if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator);
+        return cont();
+    }
+    function maybeexpression(type) {
+        if (type.match(/[;\}\)\],]/)) return pass();
+        return pass(expression);
+    }
+
+    function maybeoperator(type, value) {
+        if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
+        if (type == "operator") return cont(expression);
+        if (type == ";") return;
+        if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
+        if (type == ".") return cont(property, maybeoperator);
+        if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator);
+    }
+    function maybelabel(type) {
+        if (type == ":") return cont(poplex, statement);
+        return pass(maybeoperator, expect(";"), poplex);
+    }
+    function property(type) {
+        if (type == "variable") {cx.marked = "property"; return cont();}
+    }
+    function objprop(type) {
+        if (type == "variable") cx.marked = "property";
+        if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression);
+    }
+    function commasep(what, end) {
+        function proceed(type) {
+            if (type == ",") return cont(what, proceed);
+            if (type == end) return cont();
+            return cont(expect(end));
+        }
+        return function commaSeparated(type) {
+            if (type == end) return cont();
+            else return pass(what, proceed);
+        };
+    }
+    function block(type) {
+        if (type == "}") return cont();
+        return pass(statement, block);
+    }
+    function vardef1(type, value) {
+        if (type == "variable"){register(value); return cont(vardef2);}
+        return cont();
+    }
+    function vardef2(type, value) {
+        if (value == "=") return cont(expression, vardef2);
+        if (type == ",") return cont(vardef1);
+    }
+    function forspec1(type) {
+        if (type == "var") return cont(vardef1, forspec2);
+        if (type == ";") return pass(forspec2);
+        if (type == "variable") return cont(formaybein);
+        return pass(forspec2);
+    }
+    function formaybein(type, value) {
+        if (value == "in") return cont(expression);
+        return cont(maybeoperator, forspec2);
+    }
+    function forspec2(type, value) {
+        if (type == ";") return cont(forspec3);
+        if (value == "in") return cont(expression);
+        return cont(expression, expect(";"), forspec3);
+    }
+    function forspec3(type) {
+        if (type != ")") cont(expression);
+    }
+    function functiondef(type, value) {
+        if (type == "variable") {register(value); return cont(functiondef);}
+        if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext);
+    }
+    function funarg(type, value) {
+        if (type == "variable") {register(value); return cont();}
+    }
+
+    // Interface
+
+    return {
+        startState: function(basecolumn) {
+            return {
+                tokenize: jsTokenBase,
+                reAllowed: true,
+                kwAllowed: true,
+                cc: [],
+                lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
+                localVars: null,
+                context: null,
+                indented: 0
+            };
+        },
+
+        token: function(stream, state) {
+            if (stream.sol()) {
+                if (!state.lexical.hasOwnProperty("align"))
+                    state.lexical.align = false;
+                state.indented = stream.indentation();
+            }
+            if (stream.eatSpace()) return null;
+            var style = state.tokenize(stream, state);
+            if (type == "comment") return style;
+            state.reAllowed = type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/);
+            state.kwAllowed = type != '.';
+            return parseJS(state, style, type, content, stream);
+        },
+
+        indent: function(state, textAfter) {
+            if (state.tokenize != jsTokenBase) return 0;
+            var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical,
+                type = lexical.type, closing = firstChar == type;
+            if (type == "vardef") return lexical.indented + 4;
+            else if (type == "form" && firstChar == "{") return lexical.indented;
+            else if (type == "stat" || type == "form") return lexical.indented + indentUnit;
+            else if (lexical.info == "switch" && !closing)
+                return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
+            else if (lexical.align) return lexical.column + (closing ? 0 : 1);
+            else return lexical.indented + (closing ? 0 : indentUnit);
+        },
+
+        electricChars: ":{}"
+    };
+});
+
+CodeMirror.defineMIME("text/javascript", "javascript");
+CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
+
+CodeMirror.defineMode("css", function(config) {
+    var indentUnit = config.indentUnit, type;
+    function ret(style, tp) {type = tp; return style;}
+
+    function tokenBase(stream, state) {
+        var ch = stream.next();
+        if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());}
+        else if (ch == "/" && stream.eat("*")) {
+            state.tokenize = tokenCComment;
+            return tokenCComment(stream, state);
+        }
+        else if (ch == "<" && stream.eat("!")) {
+            state.tokenize = tokenSGMLComment;
+            return tokenSGMLComment(stream, state);
+        }
+        else if (ch == "=") ret(null, "compare");
+        else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare");
+        else if (ch == "\"" || ch == "'") {
+            state.tokenize = tokenString(ch);
+            return state.tokenize(stream, state);
+        }
+        else if (ch == "#") {
+            stream.eatWhile(/[\w\\\-]/);
+            return ret("atom", "hash");
+        }
+        else if (ch == "!") {
+            stream.match(/^\s*\w*/);
+            return ret("keyword", "important");
+        }
+        else if (/\d/.test(ch)) {
+            stream.eatWhile(/[\w.%]/);
+            return ret("number", "unit");
+        }
+        else if (/[,.+>*\/]/.test(ch)) {
+            return ret(null, "select-op");
+        }
+        else if (/[;{}:\[\]]/.test(ch)) {
+            return ret(null, ch);
+        }
+        else {
+            stream.eatWhile(/[\w\\\-]/);
+            return ret("variable", "variable");
+        }
+    }
+
+    function tokenCComment(stream, state) {
+        var maybeEnd = false, ch;
+        while ((ch = stream.next()) != null) {
+            if (maybeEnd && ch == "/") {
+                state.tokenize = tokenBase;
+                break;
+            }
+            maybeEnd = (ch == "*");
+        }
+        return ret("comment", "comment");
+    }
+
+    function tokenSGMLComment(stream, state) {
+        var dashes = 0, ch;
+        while ((ch = stream.next()) != null) {
+            if (dashes >= 2 && ch == ">") {
+                state.tokenize = tokenBase;
+                break;
+            }
+            dashes = (ch == "-") ? dashes + 1 : 0;
+        }
+        return ret("comment", "comment");
+    }
+
+    function tokenString(quote) {
+        return function(stream, state) {
+            var escaped = false, ch;
+            while ((ch = stream.next()) != null) {
+                if (ch == quote && !escaped)
+                    break;
+                escaped = !escaped && ch == "\\";
+            }
+            if (!escaped) state.tokenize = tokenBase;
+            return ret("string", "string");
+        };
+    }
+
+    return {
+        startState: function(base) {
+            return {tokenize: tokenBase,
+                baseIndent: base || 0,
+                stack: []};
+        },
+
+        token: function(stream, state) {
+            if (stream.eatSpace()) return null;
+            var style = state.tokenize(stream, state);
+
+            var context = state.stack[state.stack.length-1];
+            if (type == "hash" && context == "rule") style = "atom";
+            else if (style == "variable") {
+                if (context == "rule") style = "number";
+                else if (!context || context == "@media{") style = "tag";
+            }
+
+            if (context == "rule" && /^[\{\};]$/.test(type))
+                state.stack.pop();
+            if (type == "{") {
+                if (context == "@media") state.stack[state.stack.length-1] = "@media{";
+                else state.stack.push("{");
+            }
+            else if (type == "}") state.stack.pop();
+            else if (type == "@media") state.stack.push("@media");
+            else if (context == "{" && type != "comment") state.stack.push("rule");
+            return style;
+        },
+
+        indent: function(state, textAfter) {
+            var n = state.stack.length;
+            if (/^\}/.test(textAfter))
+                n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
+            return state.baseIndent + n * indentUnit;
+        },
+
+        electricChars: "}"
+    };
+});
+
+CodeMirror.defineMIME("text/css", "css");
+CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
+    var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true});
+    var jsMode = CodeMirror.getMode(config, "javascript");
+    var cssMode = CodeMirror.getMode(config, "css");
+
+    function html(stream, state) {
+        var style = htmlMode.token(stream, state.htmlState);
+        if (style == "tag" && stream.current() == ">" && state.htmlState.context) {
+            if (/^script$/i.test(state.htmlState.context.tagName)) {
+                state.token = javascript;
+                state.localState = jsMode.startState(htmlMode.indent(state.htmlState, ""));
+                state.mode = "javascript";
+            }
+            else if (/^style$/i.test(state.htmlState.context.tagName)) {
+                state.token = css;
+                state.localState = cssMode.startState(htmlMode.indent(state.htmlState, ""));
+                state.mode = "css";
+            }
+        }
+        return style;
+    }
+    function maybeBackup(stream, pat, style) {
+        var cur = stream.current();
+        var close = cur.search(pat);
+        if (close > -1) stream.backUp(cur.length - close);
+        return style;
+    }
+    function javascript(stream, state) {
+        if (stream.match(/^<\/\s*script\s*>/i, false)) {
+            state.token = html;
+            state.curState = null;
+            state.mode = "html";
+            return html(stream, state);
+        }
+        return maybeBackup(stream, /<\/\s*script\s*>/,
+            jsMode.token(stream, state.localState));
+    }
+    function css(stream, state) {
+        if (stream.match(/^<\/\s*style\s*>/i, false)) {
+            state.token = html;
+            state.localState = null;
+            state.mode = "html";
+            return html(stream, state);
+        }
+        return maybeBackup(stream, /<\/\s*style\s*>/,
+            cssMode.token(stream, state.localState));
+    }
+
+    return {
+        startState: function() {
+            var state = htmlMode.startState();
+            return {token: html, localState: null, mode: "html", htmlState: state};
+        },
+
+        copyState: function(state) {
+            if (state.localState)
+                var local = CodeMirror.copyState(state.token == css ? cssMode : jsMode, state.localState);
+            return {token: state.token, localState: local, mode: state.mode,
+                htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};
+        },
+
+        token: function(stream, state) {
+            return state.token(stream, state);
+        },
+
+        indent: function(state, textAfter) {
+            if (state.token == html || /^\s*<\//.test(textAfter))
+                return htmlMode.indent(state.htmlState, textAfter);
+            else if (state.token == javascript)
+                return jsMode.indent(state.localState, textAfter);
+            else
+                return cssMode.indent(state.localState, textAfter);
+        },
+
+        compareStates: function(a, b) {
+            return htmlMode.compareStates(a.htmlState, b.htmlState);
+        },
+
+        electricChars: "/{}:"
+    }
+});
+
+CodeMirror.defineMIME("text/html", "htmlmixed");
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/mootools-adapter.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/mootools-adapter.js
new file mode 100644
index 0000000..50fb0f4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/mootools-adapter.js
@@ -0,0 +1,13 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+ MooTools adapter
+
+ (c) 2010-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(){var e=window,h=document,f=e.MooTools.version.substring(0,3),i=f==="1.2"||f==="1.1",j=i||f==="1.3",g=e.$extend||function(){return Object.append.apply(Object,arguments)};e.HighchartsAdapter={init:function(a){var b=Fx.prototype,c=b.start,d=Fx.Morph.prototype,e=d.compute;b.start=function(b,d){var e=this.element;if(b.d)this.paths=a.init(e,e.d,this.toD);c.apply(this,arguments);return this};d.compute=function(b,c,d){var f=this.paths;if(f)this.element.attr("d",a.step(f[0],f[1],d,this.toD));else return e.apply(this,
+arguments)}},adapterRun:function(a,b){if(b==="width"||b==="height")return parseInt($(a).getStyle(b),10)},getScript:function(a,b){var c=h.getElementsByTagName("head")[0],d=h.createElement("script");d.type="text/javascript";d.src=a;d.onload=b;c.appendChild(d)},animate:function(a,b,c){var d=a.attr,f=c&&c.complete;if(d&&!a.setStyle)a.getStyle=a.attr,a.setStyle=function(){var a=arguments;this.attr.call(this,a[0],a[1][0])},a.$family=function(){return!0};e.HighchartsAdapter.stop(a);c=new Fx.Morph(d?a:$(a),
+g({transition:Fx.Transitions.Quad.easeInOut},c));if(d)c.element=a;if(b.d)c.toD=b.d;f&&c.addEvent("complete",f);c.start(b);a.fx=c},each:function(a,b){return i?$each(a,b):Array.each(a,b)},map:function(a,b){return a.map(b)},grep:function(a,b){return a.filter(b)},inArray:function(a,b,c){return b?b.indexOf(a,c):-1},offset:function(a){a=a.getPosition();return{left:a.x,top:a.y}},extendWithEvents:function(a){a.addEvent||(a.nodeName?$(a):g(a,new Events))},addEvent:function(a,b,c){typeof b==="string"&&(b===
+"unload"&&(b="beforeunload"),e.HighchartsAdapter.extendWithEvents(a),a.addEvent(b,c))},removeEvent:function(a,b,c){typeof a!=="string"&&a.addEvent&&(b?(b==="unload"&&(b="beforeunload"),c?a.removeEvent(b,c):a.removeEvents&&a.removeEvents(b)):a.removeEvents())},fireEvent:function(a,b,c,d){b={type:b,target:a};b=j?new Event(b):new DOMEvent(b);b=g(b,c);if(!b.target&&b.event)b.target=b.event.target;b.preventDefault=function(){d=null};a.fireEvent&&a.fireEvent(b.type,b);d&&d(b)},washMouseEvent:function(a){if(a.page)a.pageX=
+a.page.x,a.pageY=a.page.y;return a},stop:function(a){a.fx&&a.fx.cancel()}}})();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/mootools-adapter.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/mootools-adapter.src.js
new file mode 100644
index 0000000..a310f0b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/mootools-adapter.src.js
@@ -0,0 +1,313 @@
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ * MooTools adapter
+ *
+ * (c) 2010-2013 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Fx, $, $extend, $each, $merge, Events, Event, DOMEvent */
+
+(function () {
+
+var win = window,
+	doc = document,
+	mooVersion = win.MooTools.version.substring(0, 3), // Get the first three characters of the version number
+	legacy = mooVersion === '1.2' || mooVersion === '1.1', // 1.1 && 1.2 considered legacy, 1.3 is not.
+	legacyEvent = legacy || mooVersion === '1.3', // In versions 1.1 - 1.3 the event class is named Event, in newer versions it is named DOMEvent.
+	$extend = win.$extend || function () {
+		return Object.append.apply(Object, arguments);
+	};
+
+win.HighchartsAdapter = {
+	/**
+	 * Initialize the adapter. This is run once as Highcharts is first run.
+	 * @param {Object} pathAnim The helper object to do animations across adapters.
+	 */
+	init: function (pathAnim) {
+		var fxProto = Fx.prototype,
+			fxStart = fxProto.start,
+			morphProto = Fx.Morph.prototype,
+			morphCompute = morphProto.compute;
+
+		// override Fx.start to allow animation of SVG element wrappers
+		/*jslint unparam: true*//* allow unused parameters in fx functions */
+		fxProto.start = function (from, to) {
+			var fx = this,
+				elem = fx.element;
+
+			// special for animating paths
+			if (from.d) {
+				//this.fromD = this.element.d.split(' ');
+				fx.paths = pathAnim.init(
+					elem,
+					elem.d,
+					fx.toD
+				);
+			}
+			fxStart.apply(fx, arguments);
+
+			return this; // chainable
+		};
+
+		// override Fx.step to allow animation of SVG element wrappers
+		morphProto.compute = function (from, to, delta) {
+			var fx = this,
+				paths = fx.paths;
+
+			if (paths) {
+				fx.element.attr(
+					'd',
+					pathAnim.step(paths[0], paths[1], delta, fx.toD)
+				);
+			} else {
+				return morphCompute.apply(fx, arguments);
+			}
+		};
+		/*jslint unparam: false*/
+	},
+	
+	/**
+	 * Run a general method on the framework, following jQuery syntax
+	 * @param {Object} el The HTML element
+	 * @param {String} method Which method to run on the wrapped element
+	 */
+	adapterRun: function (el, method) {
+		
+		// This currently works for getting inner width and height. If adding
+		// more methods later, we need a conditional implementation for each.
+		if (method === 'width' || method === 'height') {
+			return parseInt($(el).getStyle(method), 10);
+		}
+	},
+
+	/**
+	 * Downloads a script and executes a callback when done.
+	 * @param {String} scriptLocation
+	 * @param {Function} callback
+	 */
+	getScript: function (scriptLocation, callback) {
+		// We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script.
+		var head = doc.getElementsByTagName('head')[0];
+		var script = doc.createElement('script');
+
+		script.type = 'text/javascript';
+		script.src = scriptLocation;
+		script.onload = callback;
+
+		head.appendChild(script);
+	},
+
+	/**
+	 * Animate a HTML element or SVG element wrapper
+	 * @param {Object} el
+	 * @param {Object} params
+	 * @param {Object} options jQuery-like animation options: duration, easing, callback
+	 */
+	animate: function (el, params, options) {
+		var isSVGElement = el.attr,
+			effect,
+			complete = options && options.complete;
+
+		if (isSVGElement && !el.setStyle) {
+			// add setStyle and getStyle methods for internal use in Moo
+			el.getStyle = el.attr;
+			el.setStyle = function () { // property value is given as array in Moo - break it down
+				var args = arguments;
+				this.attr.call(this, args[0], args[1][0]);
+			};
+			// dirty hack to trick Moo into handling el as an element wrapper
+			el.$family = function () { return true; };
+		}
+
+		// stop running animations
+		win.HighchartsAdapter.stop(el);
+
+		// define and run the effect
+		effect = new Fx.Morph(
+			isSVGElement ? el : $(el),
+			$extend({
+				transition: Fx.Transitions.Quad.easeInOut
+			}, options)
+		);
+
+		// Make sure that the element reference is set when animating svg elements
+		if (isSVGElement) {
+			effect.element = el;
+		}
+
+		// special treatment for paths
+		if (params.d) {
+			effect.toD = params.d;
+		}
+
+		// jQuery-like events
+		if (complete) {
+			effect.addEvent('complete', complete);
+		}
+
+		// run
+		effect.start(params);
+
+		// record for use in stop method
+		el.fx = effect;
+	},
+
+	/**
+	 * MooTool's each function
+	 *
+	 */
+	each: function (arr, fn) {
+		return legacy ?
+			$each(arr, fn) :
+			Array.each(arr, fn);
+	},
+
+	/**
+	 * Map an array
+	 * @param {Array} arr
+	 * @param {Function} fn
+	 */
+	map: function (arr, fn) {
+		return arr.map(fn);
+	},
+
+	/**
+	 * Grep or filter an array
+	 * @param {Array} arr
+	 * @param {Function} fn
+	 */
+	grep: function (arr, fn) {
+		return arr.filter(fn);
+	},
+	
+	/**
+	 * Return the index of an item in an array, or -1 if not matched
+	 */
+	inArray: function (item, arr, from) {
+		return arr ? arr.indexOf(item, from) : -1;
+	},
+
+	/**
+	 * Get the offset of an element relative to the top left corner of the web page
+	 */
+	offset: function (el) {
+		var offsets = el.getPosition(); // #1496
+		return {
+			left: offsets.x,
+			top: offsets.y
+		};
+	},
+
+	/**
+	 * Extends an object with Events, if its not done
+	 */
+	extendWithEvents: function (el) {
+		// if the addEvent method is not defined, el is a custom Highcharts object
+		// like series or point
+		if (!el.addEvent) {
+			if (el.nodeName) {
+				el = $(el); // a dynamically generated node
+			} else {
+				$extend(el, new Events()); // a custom object
+			}
+		}
+	},
+
+	/**
+	 * Add an event listener
+	 * @param {Object} el HTML element or custom object
+	 * @param {String} type Event type
+	 * @param {Function} fn Event handler
+	 */
+	addEvent: function (el, type, fn) {
+		if (typeof type === 'string') { // chart broke due to el being string, type function
+
+			if (type === 'unload') { // Moo self destructs before custom unload events
+				type = 'beforeunload';
+			}
+
+			win.HighchartsAdapter.extendWithEvents(el);
+
+			el.addEvent(type, fn);
+		}
+	},
+
+	removeEvent: function (el, type, fn) {
+		if (typeof el === 'string') {
+			// el.removeEvents below apperantly calls this method again. Do not quite understand why, so for now just bail out.
+			return;
+		}
+		
+		if (el.addEvent) { // If el doesn't have an addEvent method, there are no events to remove
+			if (type) {
+				if (type === 'unload') { // Moo self destructs before custom unload events
+					type = 'beforeunload';
+				}
+	
+				if (fn) {
+					el.removeEvent(type, fn);
+				} else if (el.removeEvents) { // #958
+					el.removeEvents(type);
+				}
+			} else {
+				el.removeEvents();
+			}
+		}
+	},
+
+	fireEvent: function (el, event, eventArguments, defaultFunction) {
+		var eventArgs = {
+			type: event,
+			target: el
+		};
+		// create an event object that keeps all functions
+		event = legacyEvent ? new Event(eventArgs) : new DOMEvent(eventArgs);
+		event = $extend(event, eventArguments);
+
+		// When running an event on the Chart.prototype, MooTools nests the target in event.event
+		if (!event.target && event.event) {
+			event.target = event.event.target;
+		}
+
+		// override the preventDefault function to be able to use
+		// this for custom events
+		event.preventDefault = function () {
+			defaultFunction = null;
+		};
+		// if fireEvent is not available on the object, there hasn't been added
+		// any events to it above
+		if (el.fireEvent) {
+			el.fireEvent(event.type, event);
+		}
+
+		// fire the default if it is passed and it is not prevented above
+		if (defaultFunction) {
+			defaultFunction(event);
+		}
+	},
+	
+	/**
+	 * Set back e.pageX and e.pageY that MooTools has abstracted away. #1165, #1346.
+	 */
+	washMouseEvent: function (e) {
+		if (e.page) {
+			e.pageX = e.page.x;
+			e.pageY = e.page.y;
+		}
+		return e;
+	},
+
+	/**
+	 * Stop running animations on the object
+	 */
+	stop: function (el) {
+		if (el.fx) {
+			el.fx.cancel();
+		}
+	}
+};
+
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/prototype-adapter.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/prototype-adapter.js
new file mode 100644
index 0000000..8a57cca
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/prototype-adapter.js
@@ -0,0 +1,15 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+ Prototype adapter
+
+ @author Michael Nelson, Torstein Hønsi.
+
+ Feel free to use and modify this script.
+ Highcharts license: www.highcharts.com/license.
+*/
+var HighchartsAdapter=function(){var f=typeof Effect!=="undefined";return{init:function(a){if(f)Effect.HighchartsTransition=Class.create(Effect.Base,{initialize:function(b,c,d,g){var e;this.element=b;this.key=c;e=b.attr?b.attr(c):$(b).getStyle(c);if(c==="d")this.paths=a.init(b,b.d,d),this.toD=d,e=0,d=1;this.start(Object.extend(g||{},{from:e,to:d,attribute:c}))},setup:function(){HighchartsAdapter._extend(this.element);if(!this.element._highchart_animation)this.element._highchart_animation={};this.element._highchart_animation[this.key]=
+this},update:function(b){var c=this.paths,d=this.element;c&&(b=a.step(c[0],c[1],b,this.toD));d.attr?d.element&&d.attr(this.options.attribute,b):(c={},c[this.options.attribute]=b,$(d).setStyle(c))},finish:function(){this.element&&this.element._highchart_animation&&delete this.element._highchart_animation[this.key]}})},adapterRun:function(a,b){return parseInt($(a).getStyle(b),10)},getScript:function(a,b){var c=$$("head")[0];c&&c.appendChild((new Element("script",{type:"text/javascript",src:a})).observe("load",
+b))},addNS:function(a){var b=/^(?:click|mouse(?:down|up|over|move|out))$/;return/^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/.test(a)||b.test(a)?a:"h:"+a},addEvent:function(a,b,c){a.addEventListener||a.attachEvent?Event.observe($(a),HighchartsAdapter.addNS(b),c):(HighchartsAdapter._extend(a),a._highcharts_observe(b,c))},animate:function(a,b,c){var d,c=c||{};c.delay=0;c.duration=(c.duration||500)/1E3;c.afterFinish=c.complete;if(f)for(d in b)new Effect.HighchartsTransition($(a),
+d,b[d],c);else{if(a.attr)for(d in b)a.attr(d,b[d]);c.complete&&c.complete()}a.attr||$(a).setStyle(b)},stop:function(a){var b;if(a._highcharts_extended&&a._highchart_animation)for(b in a._highchart_animation)a._highchart_animation[b].cancel()},each:function(a,b){$A(a).each(b)},inArray:function(a,b,c){return b?b.indexOf(a,c):-1},offset:function(a){return $(a).cumulativeOffset()},fireEvent:function(a,b,c,d){a.fire?a.fire(HighchartsAdapter.addNS(b),c):a._highcharts_extended&&(c=c||{},a._highcharts_fire(b,
+c));c&&c.defaultPrevented&&(d=null);d&&d(c)},removeEvent:function(a,b,c){$(a).stopObserving&&(b&&(b=HighchartsAdapter.addNS(b)),$(a).stopObserving(b,c));window===a?Event.stopObserving(a,b,c):(HighchartsAdapter._extend(a),a._highcharts_stop_observing(b,c))},washMouseEvent:function(a){return a},grep:function(a,b){return a.findAll(b)},map:function(a,b){return a.map(b)},_extend:function(a){a._highcharts_extended||Object.extend(a,{_highchart_events:{},_highchart_animation:null,_highcharts_extended:!0,
+_highcharts_observe:function(b,a){this._highchart_events[b]=[this._highchart_events[b],a].compact().flatten()},_highcharts_stop_observing:function(b,a){b?a?this._highchart_events[b]=[this._highchart_events[b]].compact().flatten().without(a):delete this._highchart_events[b]:this._highchart_events={}},_highcharts_fire:function(a,c){var d=this;(this._highchart_events[a]||[]).each(function(a){if(!c.stopped)c.preventDefault=function(){c.defaultPrevented=!0},c.target=d,a.bind(this)(c)===!1&&c.preventDefault()}.bind(this))}})}}}();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/prototype-adapter.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/prototype-adapter.src.js
new file mode 100644
index 0000000..9c8529e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/prototype-adapter.src.js
@@ -0,0 +1,316 @@
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ * Prototype adapter
+ *
+ * @author Michael Nelson, Torstein Hønsi.
+ *
+ * Feel free to use and modify this script.
+ * Highcharts license: www.highcharts.com/license.
+ */
+
+// JSLint options:
+/*global Effect, Class, Event, Element, $, $$, $A */
+
+// Adapter interface between prototype and the Highcharts charting library
+var HighchartsAdapter = (function () {
+
+var hasEffect = typeof Effect !== 'undefined';
+
+return {
+
+	/**
+	 * Initialize the adapter. This is run once as Highcharts is first run.
+	 * @param {Object} pathAnim The helper object to do animations across adapters.
+	 */
+	init: function (pathAnim) {
+		if (hasEffect) {
+			/**
+			 * Animation for Highcharts SVG element wrappers only
+			 * @param {Object} element
+			 * @param {Object} attribute
+			 * @param {Object} to
+			 * @param {Object} options
+			 */
+			Effect.HighchartsTransition = Class.create(Effect.Base, {
+				initialize: function (element, attr, to, options) {
+					var from,
+						opts;
+
+					this.element = element;
+					this.key = attr;
+					from = element.attr ? element.attr(attr) : $(element).getStyle(attr);
+
+					// special treatment for paths
+					if (attr === 'd') {
+						this.paths = pathAnim.init(
+							element,
+							element.d,
+							to
+						);
+						this.toD = to;
+
+
+						// fake values in order to read relative position as a float in update
+						from = 0;
+						to = 1;
+					}
+
+					opts = Object.extend((options || {}), {
+						from: from,
+						to: to,
+						attribute: attr
+					});
+					this.start(opts);
+				},
+				setup: function () {
+					HighchartsAdapter._extend(this.element);
+					// If this is the first animation on this object, create the _highcharts_animation helper that
+					// contain pointers to the animation objects.
+					if (!this.element._highchart_animation) {
+						this.element._highchart_animation = {};
+					}
+
+					// Store a reference to this animation instance.
+					this.element._highchart_animation[this.key] = this;
+				},
+				update: function (position) {
+					var paths = this.paths,
+						element = this.element,
+						obj;
+
+					if (paths) {
+						position = pathAnim.step(paths[0], paths[1], position, this.toD);
+					}
+
+					if (element.attr) { // SVGElement
+						
+						if (element.element) { // If not, it has been destroyed (#1405)
+							element.attr(this.options.attribute, position);
+						}
+					
+					} else { // HTML, #409
+						obj = {};
+						obj[this.options.attribute] = position;
+						$(element).setStyle(obj);
+					}
+					
+				},
+				finish: function () {
+					// Delete the property that holds this animation now that it is finished.
+					// Both canceled animations and complete ones gets a 'finish' call.
+					if (this.element && this.element._highchart_animation) { // #1405
+						delete this.element._highchart_animation[this.key];
+					}
+				}
+			});
+		}
+	},
+	
+	/**
+	 * Run a general method on the framework, following jQuery syntax
+	 * @param {Object} el The HTML element
+	 * @param {String} method Which method to run on the wrapped element
+	 */
+	adapterRun: function (el, method) {
+		
+		// This currently works for getting inner width and height. If adding
+		// more methods later, we need a conditional implementation for each.
+		return parseInt($(el).getStyle(method), 10);
+		
+	},
+
+	/**
+	 * Downloads a script and executes a callback when done.
+	 * @param {String} scriptLocation
+	 * @param {Function} callback
+	 */
+	getScript: function (scriptLocation, callback) {
+		var head = $$('head')[0]; // Returns an array, so pick the first element.
+		if (head) {
+			// Append a new 'script' element, set its type and src attributes, add a 'load' handler that calls the callback
+			head.appendChild(new Element('script', { type: 'text/javascript', src: scriptLocation}).observe('load', callback));
+		}
+	},
+
+	/**
+	 * Custom events in prototype needs to be namespaced. This method adds a namespace 'h:' in front of
+	 * events that are not recognized as native.
+	 */
+	addNS: function (eventName) {
+		var HTMLEvents = /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,
+			MouseEvents = /^(?:click|mouse(?:down|up|over|move|out))$/;
+		return (HTMLEvents.test(eventName) || MouseEvents.test(eventName)) ?
+			eventName :
+			'h:' + eventName;
+	},
+
+	// el needs an event to be attached. el is not necessarily a dom element
+	addEvent: function (el, event, fn) {
+		if (el.addEventListener || el.attachEvent) {
+			Event.observe($(el), HighchartsAdapter.addNS(event), fn);
+
+		} else {
+			HighchartsAdapter._extend(el);
+			el._highcharts_observe(event, fn);
+		}
+	},
+
+	// motion makes things pretty. use it if effects is loaded, if not... still get to the end result.
+	animate: function (el, params, options) {
+		var key,
+			fx;
+
+		// default options
+		options = options || {};
+		options.delay = 0;
+		options.duration = (options.duration || 500) / 1000;
+		options.afterFinish = options.complete;
+
+		// animate wrappers and DOM elements
+		if (hasEffect) {
+			for (key in params) {
+				// The fx variable is seemingly thrown away here, but the Effect.setup will add itself to the _highcharts_animation object
+				// on the element itself so its not really lost.
+				fx = new Effect.HighchartsTransition($(el), key, params[key], options);
+			}
+		} else {
+			if (el.attr) { // #409 without effects
+				for (key in params) {
+					el.attr(key, params[key]);
+				}
+			}
+			if (options.complete) {
+				options.complete();
+			}
+		}
+
+		if (!el.attr) { // HTML element, #409
+			$(el).setStyle(params);
+		}
+	},
+
+	// this only occurs in higcharts 2.0+
+	stop: function (el) {
+		var key;
+		if (el._highcharts_extended && el._highchart_animation) {
+			for (key in el._highchart_animation) {
+				// Cancel the animation
+				// The 'finish' function in the Effect object will remove the reference
+				el._highchart_animation[key].cancel();
+			}
+		}
+	},
+
+	// um.. each
+	each: function (arr, fn) {
+		$A(arr).each(fn);
+	},
+	
+	inArray: function (item, arr, from) {
+		return arr ? arr.indexOf(item, from) : -1;
+	},
+
+	/**
+	 * Get the cumulative offset relative to the top left of the page. This method, unlike its
+	 * jQuery and MooTools counterpart, still suffers from issue #208 regarding the position
+	 * of a chart within a fixed container.
+	 */
+	offset: function (el) {
+		return $(el).cumulativeOffset();
+	},
+
+	// fire an event based on an event name (event) and an object (el).
+	// again, el may not be a dom element
+	fireEvent: function (el, event, eventArguments, defaultFunction) {
+		if (el.fire) {
+			el.fire(HighchartsAdapter.addNS(event), eventArguments);
+		} else if (el._highcharts_extended) {
+			eventArguments = eventArguments || {};
+			el._highcharts_fire(event, eventArguments);
+		}
+
+		if (eventArguments && eventArguments.defaultPrevented) {
+			defaultFunction = null;
+		}
+
+		if (defaultFunction) {
+			defaultFunction(eventArguments);
+		}
+	},
+
+	removeEvent: function (el, event, handler) {
+		if ($(el).stopObserving) {
+			if (event) {
+				event = HighchartsAdapter.addNS(event);
+			}
+			$(el).stopObserving(event, handler);
+		} if (window === el) {
+			Event.stopObserving(el, event, handler);
+		} else {
+			HighchartsAdapter._extend(el);
+			el._highcharts_stop_observing(event, handler);
+		}
+	},
+	
+	washMouseEvent: function (e) {
+		return e;
+	},
+
+	// um, grep
+	grep: function (arr, fn) {
+		return arr.findAll(fn);
+	},
+
+	// um, map
+	map: function (arr, fn) {
+		return arr.map(fn);
+	},
+
+	// extend an object to handle highchart events (highchart objects, not svg elements).
+	// this is a very simple way of handling events but whatever, it works (i think)
+	_extend: function (object) {
+		if (!object._highcharts_extended) {
+			Object.extend(object, {
+				_highchart_events: {},
+				_highchart_animation: null,
+				_highcharts_extended: true,
+				_highcharts_observe: function (name, fn) {
+					this._highchart_events[name] = [this._highchart_events[name], fn].compact().flatten();
+				},
+				_highcharts_stop_observing: function (name, fn) {
+					if (name) {
+						if (fn) {
+							this._highchart_events[name] = [this._highchart_events[name]].compact().flatten().without(fn);
+						} else {
+							delete this._highchart_events[name];
+						}
+					} else {
+						this._highchart_events = {};
+					}
+				},
+				_highcharts_fire: function (name, args) {
+					var target = this;
+					(this._highchart_events[name] || []).each(function (fn) {
+						// args is never null here
+						if (args.stopped) {
+							return; // "throw $break" wasn't working. i think because of the scope of 'this'.
+						}
+
+						// Attach a simple preventDefault function to skip default handler if called
+						args.preventDefault = function () {
+							args.defaultPrevented = true;
+						};
+						args.target = target;
+
+						// If the event handler return false, prevent the default handler from executing
+						if (fn.bind(this)(args) === false) {
+							args.preventDefault();
+						}
+					}
+.bind(this));
+				}
+			});
+		}
+	}
+};
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/standalone-framework.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/standalone-framework.js
new file mode 100644
index 0000000..70a92db
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/standalone-framework.js
@@ -0,0 +1,17 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+
+ Standalone Highcharts Framework
+
+ License: MIT License
+*/
+var HighchartsAdapter=function(){function o(c){function a(a,b,d){a.removeEventListener(b,d,!1)}function d(a,b,d){d=a.HCProxiedMethods[d.toString()];a.detachEvent("on"+b,d)}function b(b,c){var f=b.HCEvents,i,g,k,j;if(b.removeEventListener)i=a;else if(b.attachEvent)i=d;else return;c?(g={},g[c]=!0):g=f;for(j in g)if(f[j])for(k=f[j].length;k--;)i(b,j,f[j][k])}c.HCExtended||Highcharts.extend(c,{HCExtended:!0,HCEvents:{},bind:function(b,a){var d=this,c=this.HCEvents,g;if(d.addEventListener)d.addEventListener(b,
+a,!1);else if(d.attachEvent){g=function(b){a.call(d,b)};if(!d.HCProxiedMethods)d.HCProxiedMethods={};d.HCProxiedMethods[a.toString()]=g;d.attachEvent("on"+b,g)}c[b]===r&&(c[b]=[]);c[b].push(a)},unbind:function(c,h){var f,i;c?(f=this.HCEvents[c]||[],h?(i=HighchartsAdapter.inArray(h,f),i>-1&&(f.splice(i,1),this.HCEvents[c]=f),this.removeEventListener?a(this,c,h):this.attachEvent&&d(this,c,h)):(b(this,c),this.HCEvents[c]=[])):(b(this),this.HCEvents={})},trigger:function(b,a){var d=this.HCEvents[b]||
+[],c=d.length,g,k,j;k=function(){a.defaultPrevented=!0};for(g=0;g<c;g++){j=d[g];if(a.stopped)break;a.preventDefault=k;a.target=this;a.type=b;j.call(this,a)===!1&&a.preventDefault()}}});return c}var r,l=document,p=[],m=[],q,n;Math.easeInOutSine=function(c,a,d,b){return-d/2*(Math.cos(Math.PI*c/b)-1)+a};return{init:function(c){if(!l.defaultView)this._getStyle=function(a,d){var b;return a.style[d]?a.style[d]:(d==="opacity"&&(d="filter"),b=a.currentStyle[d.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()})],
+d==="filter"&&(b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(b,a){return a/100})),b===""?1:b)},this.adapterRun=function(a,d){var b={width:"clientWidth",height:"clientHeight"}[d];if(b)return a.style.zoom=1,a[b]-2*parseInt(HighchartsAdapter._getStyle(a,"padding"),10)};if(!Array.prototype.forEach)this.each=function(a,d){for(var b=0,c=a.length;b<c;b++)if(d.call(a[b],a[b],b,a)===!1)return b};if(!Array.prototype.indexOf)this.inArray=function(a,d){var b,c=0;if(d)for(b=d.length;c<b;c++)if(d[c]===a)return c;
+return-1};if(!Array.prototype.filter)this.grep=function(a,d){for(var b=[],c=0,h=a.length;c<h;c++)d(a[c],c)&&b.push(a[c]);return b};n=function(a,c,b){this.options=c;this.elem=a;this.prop=b};n.prototype={update:function(){var a;a=this.paths;var d=this.elem,b=d.element;a&&b?d.attr("d",c.step(a[0],a[1],this.now,this.toD)):d.attr?b&&d.attr(this.prop,this.now):(a={},a[d]=this.now+this.unit,Highcharts.css(d,a));this.options.step&&this.options.step.call(this.elem,this.now,this)},custom:function(a,c,b){var e=
+this,h=function(a){return e.step(a)},f;this.startTime=+new Date;this.start=a;this.end=c;this.unit=b;this.now=this.start;this.pos=this.state=0;h.elem=this.elem;h()&&m.push(h)===1&&(q=setInterval(function(){for(f=0;f<m.length;f++)m[f]()||m.splice(f--,1);m.length||clearInterval(q)},13))},step:function(a){var c=+new Date,b;b=this.options;var e;if(this.elem.stopAnimation)b=!1;else if(a||c>=b.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();a=this.options.curAnim[this.prop]=
+!0;for(e in b.curAnim)b.curAnim[e]!==!0&&(a=!1);a&&b.complete&&b.complete.call(this.elem);b=!1}else e=c-this.startTime,this.state=e/b.duration,this.pos=b.easing(e,0,1,b.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update(),b=!0;return b}};this.animate=function(a,d,b){var e,h="",f,i,g;a.stopAnimation=!1;if(typeof b!=="object"||b===null)e=arguments,b={duration:e[2],easing:e[3],complete:e[4]};if(typeof b.duration!=="number")b.duration=400;b.easing=Math[b.easing]||Math.easeInOutSine;
+b.curAnim=Highcharts.extend({},d);for(g in d)i=new n(a,b,g),f=null,g==="d"?(i.paths=c.init(a,a.d,d.d),i.toD=d.d,e=0,f=1):a.attr?e=a.attr(g):(e=parseFloat(HighchartsAdapter._getStyle(a,g))||0,g!=="opacity"&&(h="px")),f||(f=parseFloat(d[g])),i.custom(e,f,h)}},_getStyle:function(c,a){return window.getComputedStyle(c).getPropertyValue(a)},getScript:function(c,a){var d=l.getElementsByTagName("head")[0],b=l.createElement("script");b.type="text/javascript";b.src=c;b.onload=a;d.appendChild(b)},inArray:function(c,
+a){return a.indexOf?a.indexOf(c):p.indexOf.call(a,c)},adapterRun:function(c,a){return parseInt(HighchartsAdapter._getStyle(c,a),10)},grep:function(c,a){return p.filter.call(c,a)},map:function(c,a){for(var d=[],b=0,e=c.length;b<e;b++)d[b]=a.call(c[b],c[b],b,c);return d},offset:function(c){for(var a=0,d=0;c;)a+=c.offsetLeft,d+=c.offsetTop,c=c.offsetParent;return{left:a,top:d}},addEvent:function(c,a,d){o(c).bind(a,d)},removeEvent:function(c,a,d){o(c).unbind(a,d)},fireEvent:function(c,a,d,b){var e;l.createEvent&&
+(c.dispatchEvent||c.fireEvent)?(e=l.createEvent("Events"),e.initEvent(a,!0,!0),e.target=c,Highcharts.extend(e,d),c.dispatchEvent?c.dispatchEvent(e):c.fireEvent(a,e)):c.HCExtended===!0&&(d=d||{},c.trigger(a,d));d&&d.defaultPrevented&&(b=null);b&&b(d)},washMouseEvent:function(c){return c},stop:function(c){c.stopAnimation=!0},each:function(c,a){return Array.prototype.forEach.call(c,a)}}}();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/standalone-framework.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/standalone-framework.src.js
new file mode 100644
index 0000000..8e9831d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/adapters/standalone-framework.src.js
@@ -0,0 +1,583 @@
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ *
+ * Standalone Highcharts Framework
+ *
+ * License: MIT License
+ */
+
+
+/*global Highcharts */
+var HighchartsAdapter = (function () {
+
+var UNDEFINED,
+	doc = document,
+	emptyArray = [],
+	timers = [],
+	timerId,
+	Fx;
+
+Math.easeInOutSine = function (t, b, c, d) {
+	return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
+};
+
+
+
+/**
+ * Extend given object with custom events
+ */
+function augment(obj) {
+	function removeOneEvent(el, type, fn) {
+		el.removeEventListener(type, fn, false);
+	}
+
+	function IERemoveOneEvent(el, type, fn) {
+		fn = el.HCProxiedMethods[fn.toString()];
+		el.detachEvent('on' + type, fn);
+	}
+
+	function removeAllEvents(el, type) {
+		var events = el.HCEvents,
+			remove,
+			types,
+			len,
+			n;
+
+		if (el.removeEventListener) {
+			remove = removeOneEvent;
+		} else if (el.attachEvent) {
+			remove = IERemoveOneEvent;
+		} else {
+			return; // break on non-DOM events
+		}
+
+
+		if (type) {
+			types = {};
+			types[type] = true;
+		} else {
+			types = events;
+		}
+
+		for (n in types) {
+			if (events[n]) {
+				len = events[n].length;
+				while (len--) {
+					remove(el, n, events[n][len]);
+				}
+			}
+		}
+	}
+
+	if (!obj.HCExtended) {
+		Highcharts.extend(obj, {
+			HCExtended: true,
+
+			HCEvents: {},
+
+			bind: function (name, fn) {
+				var el = this,
+					events = this.HCEvents,
+					wrappedFn;
+
+				// handle DOM events in modern browsers
+				if (el.addEventListener) {
+					el.addEventListener(name, fn, false);
+
+				// handle old IE implementation
+				} else if (el.attachEvent) {
+					
+					wrappedFn = function (e) {
+						fn.call(el, e);
+					};
+
+					if (!el.HCProxiedMethods) {
+						el.HCProxiedMethods = {};
+					}
+
+					// link wrapped fn with original fn, so we can get this in removeEvent
+					el.HCProxiedMethods[fn.toString()] = wrappedFn;
+
+					el.attachEvent('on' + name, wrappedFn);
+				}
+
+
+				if (events[name] === UNDEFINED) {
+					events[name] = [];
+				}
+
+				events[name].push(fn);
+			},
+
+			unbind: function (name, fn) {
+				var events,
+					index;
+
+				if (name) {
+					events = this.HCEvents[name] || [];
+					if (fn) {
+						index = HighchartsAdapter.inArray(fn, events);
+						if (index > -1) {
+							events.splice(index, 1);
+							this.HCEvents[name] = events;
+						}
+						if (this.removeEventListener) {
+							removeOneEvent(this, name, fn);
+						} else if (this.attachEvent) {
+							IERemoveOneEvent(this, name, fn);
+						}
+					} else {
+						removeAllEvents(this, name);
+						this.HCEvents[name] = [];
+					}
+				} else {
+					removeAllEvents(this);
+					this.HCEvents = {};
+				}
+			},
+
+			trigger: function (name, args) {
+				var events = this.HCEvents[name] || [],
+					target = this,
+					len = events.length,
+					i,
+					preventDefault,
+					fn;
+
+				// Attach a simple preventDefault function to skip default handler if called
+				preventDefault = function () {
+					args.defaultPrevented = true;
+				};
+				
+				for (i = 0; i < len; i++) {
+					fn = events[i];
+
+					// args is never null here
+					if (args.stopped) {
+						return;
+					}
+
+					args.preventDefault = preventDefault;
+					args.target = target;
+					args.type = name; // #2297	
+					
+					// If the event handler return false, prevent the default handler from executing
+					if (fn.call(this, args) === false) {
+						args.preventDefault();
+					}
+				}
+			}
+		});
+	}
+
+	return obj;
+}
+
+
+return {
+	/**
+	 * Initialize the adapter. This is run once as Highcharts is first run.
+	 */
+	init: function (pathAnim) {
+
+		/**
+		 * Compatibility section to add support for legacy IE. This can be removed if old IE 
+		 * support is not needed.
+		 */
+		if (!doc.defaultView) {
+			this._getStyle = function (el, prop) {
+				var val;
+				if (el.style[prop]) {
+					return el.style[prop];
+				} else {
+					if (prop === 'opacity') {
+						prop = 'filter';
+					}
+					/*jslint unparam: true*/
+					val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b) { return b.toUpperCase(); })];
+					if (prop === 'filter') {
+						val = val.replace(
+							/alpha\(opacity=([0-9]+)\)/, 
+							function (a, b) { 
+								return b / 100; 
+							}
+						);
+					}
+					/*jslint unparam: false*/
+					return val === '' ? 1 : val;
+				} 
+			};
+			this.adapterRun = function (elem, method) {
+				var alias = { width: 'clientWidth', height: 'clientHeight' }[method];
+
+				if (alias) {
+					elem.style.zoom = 1;
+					return elem[alias] - 2 * parseInt(HighchartsAdapter._getStyle(elem, 'padding'), 10);
+				}
+			};
+		}
+
+		if (!Array.prototype.forEach) {
+			this.each = function (arr, fn) { // legacy
+				var i = 0, 
+					len = arr.length;
+				for (; i < len; i++) {
+					if (fn.call(arr[i], arr[i], i, arr) === false) {
+						return i;
+					}
+				}
+			};
+		}
+
+		if (!Array.prototype.indexOf) {
+			this.inArray = function (item, arr) {
+				var len, 
+					i = 0;
+
+				if (arr) {
+					len = arr.length;
+					
+					for (; i < len; i++) {
+						if (arr[i] === item) {
+							return i;
+						}
+					}
+				}
+
+				return -1;
+			};
+		}
+
+		if (!Array.prototype.filter) {
+			this.grep = function (elements, callback) {
+				var ret = [],
+					i = 0,
+					length = elements.length;
+
+				for (; i < length; i++) {
+					if (!!callback(elements[i], i)) {
+						ret.push(elements[i]);
+					}
+				}
+
+				return ret;
+			};
+		}
+
+		//--- End compatibility section ---
+
+
+		/**
+		 * Start of animation specific code
+		 */
+		Fx = function (elem, options, prop) {
+			this.options = options;
+			this.elem = elem;
+			this.prop = prop;
+		};
+		Fx.prototype = {
+			
+			update: function () {
+				var styles,
+					paths = this.paths,
+					elem = this.elem,
+					elemelem = elem.element; // if destroyed, it is null
+
+				// Animating a path definition on SVGElement
+				if (paths && elemelem) {
+					elem.attr('d', pathAnim.step(paths[0], paths[1], this.now, this.toD));
+				
+				// Other animations on SVGElement
+				} else if (elem.attr) {
+					if (elemelem) {
+						elem.attr(this.prop, this.now);
+					}
+
+				// HTML styles
+				} else {
+					styles = {};
+					styles[elem] = this.now + this.unit;
+					Highcharts.css(elem, styles);
+				}
+				
+				if (this.options.step) {
+					this.options.step.call(this.elem, this.now, this);
+				}
+
+			},
+			custom: function (from, to, unit) {
+				var self = this,
+					t = function (gotoEnd) {
+						return self.step(gotoEnd);
+					},
+					i;
+
+				this.startTime = +new Date();
+				this.start = from;
+				this.end = to;
+				this.unit = unit;
+				this.now = this.start;
+				this.pos = this.state = 0;
+
+				t.elem = this.elem;
+
+				if (t() && timers.push(t) === 1) {
+					timerId = setInterval(function () {
+						
+						for (i = 0; i < timers.length; i++) {
+							if (!timers[i]()) {
+								timers.splice(i--, 1);
+							}
+						}
+
+						if (!timers.length) {
+							clearInterval(timerId);
+						}
+					}, 13);
+				}
+			},
+			
+			step: function (gotoEnd) {
+				var t = +new Date(),
+					ret,
+					done,
+					options = this.options,
+					i;
+
+				if (this.elem.stopAnimation) {
+					ret = false;
+
+				} else if (gotoEnd || t >= options.duration + this.startTime) {
+					this.now = this.end;
+					this.pos = this.state = 1;
+					this.update();
+
+					this.options.curAnim[this.prop] = true;
+
+					done = true;
+					for (i in options.curAnim) {
+						if (options.curAnim[i] !== true) {
+							done = false;
+						}
+					}
+
+					if (done) {
+						if (options.complete) {
+							options.complete.call(this.elem);
+						}
+					}
+					ret = false;
+
+				} else {
+					var n = t - this.startTime;
+					this.state = n / options.duration;
+					this.pos = options.easing(n, 0, 1, options.duration);
+					this.now = this.start + ((this.end - this.start) * this.pos);
+					this.update();
+					ret = true;
+				}
+				return ret;
+			}
+		};
+
+		/**
+		 * The adapter animate method
+		 */
+		this.animate = function (el, prop, opt) {
+			var start,
+				unit = '',
+				end,
+				fx,
+				args,
+				name;
+
+			el.stopAnimation = false; // ready for new
+
+			if (typeof opt !== 'object' || opt === null) {
+				args = arguments;
+				opt = {
+					duration: args[2],
+					easing: args[3],
+					complete: args[4]
+				};
+			}
+			if (typeof opt.duration !== 'number') {
+				opt.duration = 400;
+			}
+			opt.easing = Math[opt.easing] || Math.easeInOutSine;
+			opt.curAnim = Highcharts.extend({}, prop);
+			
+			for (name in prop) {
+				fx = new Fx(el, opt, name);
+				end = null;
+				
+				if (name === 'd') {
+					fx.paths = pathAnim.init(
+						el,
+						el.d,
+						prop.d
+					);
+					fx.toD = prop.d;
+					start = 0;
+					end = 1;
+				} else if (el.attr) {
+					start = el.attr(name);
+				} else {
+					start = parseFloat(HighchartsAdapter._getStyle(el, name)) || 0;
+					if (name !== 'opacity') {
+						unit = 'px';
+					}
+				}
+	
+				if (!end) {
+					end = parseFloat(prop[name]);
+				}
+				fx.custom(start, end, unit);
+			}	
+		};
+	},
+
+	/**
+	 * Internal method to return CSS value for given element and property
+	 */
+	_getStyle: function (el, prop) {
+		return window.getComputedStyle(el).getPropertyValue(prop);
+	},
+
+	/**
+	 * Downloads a script and executes a callback when done.
+	 * @param {String} scriptLocation
+	 * @param {Function} callback
+	 */
+	getScript: function (scriptLocation, callback) {
+		// We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script.
+		var head = doc.getElementsByTagName('head')[0],
+			script = doc.createElement('script');
+
+		script.type = 'text/javascript';
+		script.src = scriptLocation;
+		script.onload = callback;
+
+		head.appendChild(script);
+	},
+
+	/**
+	 * Return the index of an item in an array, or -1 if not found
+	 */
+	inArray: function (item, arr) {
+		return arr.indexOf ? arr.indexOf(item) : emptyArray.indexOf.call(arr, item);
+	},
+
+
+	/**
+	 * A direct link to adapter methods
+	 */
+	adapterRun: function (elem, method) {
+		return parseInt(HighchartsAdapter._getStyle(elem, method), 10);
+	},
+
+	/**
+	 * Filter an array
+	 */
+	grep: function (elements, callback) {
+		return emptyArray.filter.call(elements, callback);
+	},
+
+	/**
+	 * Map an array
+	 */
+	map: function (arr, fn) {
+		var results = [], i = 0, len = arr.length;
+
+		for (; i < len; i++) {
+			results[i] = fn.call(arr[i], arr[i], i, arr);
+		}
+
+		return results;
+	},
+
+	offset: function (el) {
+		var left = 0,
+			top = 0;
+
+		while (el) {
+			left += el.offsetLeft;
+			top += el.offsetTop;
+			el = el.offsetParent;
+		}
+
+		return {
+			left: left,
+			top: top
+		};
+	},
+
+	/**
+	 * Add an event listener
+	 */
+	addEvent: function (el, type, fn) {
+		augment(el).bind(type, fn);
+	},
+
+	/**
+	 * Remove event added with addEvent
+	 */
+	removeEvent: function (el, type, fn) {
+		augment(el).unbind(type, fn);
+	},
+
+	/**
+	 * Fire an event on a custom object
+	 */
+	fireEvent: function (el, type, eventArguments, defaultFunction) {
+		var e;
+
+		if (doc.createEvent && (el.dispatchEvent || el.fireEvent)) {
+			e = doc.createEvent('Events');
+			e.initEvent(type, true, true);
+			e.target = el;
+
+			Highcharts.extend(e, eventArguments);
+
+			if (el.dispatchEvent) {
+				el.dispatchEvent(e);
+			} else {
+				el.fireEvent(type, e);
+			}
+
+		} else if (el.HCExtended === true) {
+			eventArguments = eventArguments || {};
+			el.trigger(type, eventArguments);
+		}
+
+		if (eventArguments && eventArguments.defaultPrevented) {
+			defaultFunction = null;
+		}
+
+		if (defaultFunction) {
+			defaultFunction(eventArguments);
+		}
+	},
+
+	washMouseEvent: function (e) {
+		return e;
+	},
+
+
+	/**
+	 * Stop running animation
+	 */
+	stop: function (el) {
+		el.stopAnimation = true;
+	},
+
+	/**
+	 * Utility for iterating over an array. Parameters are reversed compared to jQuery.
+	 * @param {Array} arr
+	 * @param {Function} fn
+	 */
+	each: function (arr, fn) { // modern browsers
+		return Array.prototype.forEach.call(arr, fn);
+	}
+};
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts-more.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts-more.js
new file mode 100644
index 0000000..85af9f5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts-more.js
@@ -0,0 +1,50 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+
+ (c) 2009-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(j,C){function J(a,b,c){this.init.call(this,a,b,c)}function K(a,b,c){a.call(this,b,c);if(this.chart.polar)this.closeSegment=function(a){var c=this.xAxis.center;a.push("L",c[0],c[1])},this.closedStacks=!0}function L(a,b){var c=this.chart,d=this.options.animation,g=this.group,f=this.markerGroup,e=this.xAxis.center,i=c.plotLeft,n=c.plotTop;if(c.polar){if(c.renderer.isSVG)if(d===!0&&(d={}),b){if(c={translateX:e[0]+i,translateY:e[1]+n,scaleX:0.001,scaleY:0.001},g.attr(c),f)f.attrSetters=g.attrSetters,
+f.attr(c)}else c={translateX:i,translateY:n,scaleX:1,scaleY:1},g.animate(c,d),f&&f.animate(c,d),this.animate=null}else a.call(this,b)}var P=j.arrayMin,Q=j.arrayMax,s=j.each,F=j.extend,p=j.merge,R=j.map,r=j.pick,v=j.pInt,m=j.getOptions().plotOptions,h=j.seriesTypes,x=j.extendClass,M=j.splat,o=j.wrap,N=j.Axis,u=j.Tick,z=j.Series,q=h.column.prototype,t=Math,D=t.round,A=t.floor,S=t.max,w=function(){};F(J.prototype,{init:function(a,b,c){var d=this,g=d.defaultOptions;d.chart=b;if(b.angular)g.background=
+{};d.options=a=p(g,a);(a=a.background)&&s([].concat(M(a)).reverse(),function(a){var b=a.backgroundColor,a=p(d.defaultBackgroundOptions,a);if(b)a.backgroundColor=b;a.color=a.backgroundColor;c.options.plotBands.unshift(a)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{shape:"circle",borderWidth:1,borderColor:"silver",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#FFF"],[1,"#DDD"]]},from:Number.MIN_VALUE,innerRadius:0,to:Number.MAX_VALUE,
+outerRadius:"105%"}});var G=N.prototype,u=u.prototype,T={getOffset:w,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:w,setCategories:w,setTitle:w},O={isRadial:!0,defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,plotBands:[],tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,
+distance:15,x:0,y:null},maxPadding:0,minPadding:0,plotBands:[],showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},plotBands:[],showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){this.options=p(this.defaultOptions,this.defaultRadialOptions,a)},getOffset:function(){G.getOffset.call(this);this.chart.axisOffset[this.side]=0},getLinePath:function(a,b){var c=this.center,b=r(b,c[2]/2-this.offset);return this.chart.renderer.symbols.arc(this.left+
+c[0],this.top+c[1],b,b,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0})},setAxisTranslation:function(){G.setAxisTranslation.call(this);if(this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.isXAxis))this.minPixelPadding=this.transA*this.minPointOffset+(this.reversed?(this.endAngleRad-this.startAngleRad)/4:0)},beforeSetTickPositions:function(){this.autoConnect&&(this.max+=this.categories&&
+1||this.pointRange||this.closestPointRange||0)},setAxisSize:function(){G.setAxisSize.call(this);if(this.isRadial)this.center=this.pane.center=h.pie.prototype.getCenter.call(this.pane),this.len=this.width=this.height=this.isCircular?this.center[2]*(this.endAngleRad-this.startAngleRad)/2:this.center[2]/2},getPosition:function(a,b){if(!this.isCircular)b=this.translate(a),a=this.min;return this.postTranslate(this.translate(a),r(b,this.center[2]/2)-this.offset)},postTranslate:function(a,b){var c=this.chart,
+d=this.center,a=this.startAngleRad+a;return{x:c.plotLeft+d[0]+Math.cos(a)*b,y:c.plotTop+d[1]+Math.sin(a)*b}},getPlotBandPath:function(a,b,c){var d=this.center,g=this.startAngleRad,f=d[2]/2,e=[r(c.outerRadius,"100%"),c.innerRadius,r(c.thickness,10)],i=/%$/,n,l=this.isCircular;this.options.gridLineInterpolation==="polygon"?d=this.getPlotLinePath(a).concat(this.getPlotLinePath(b,!0)):(l||(e[0]=this.translate(a),e[1]=this.translate(b)),e=R(e,function(a){i.test(a)&&(a=v(a,10)*f/100);return a}),c.shape===
+"circle"||!l?(a=-Math.PI/2,b=Math.PI*1.5,n=!0):(a=g+this.translate(a),b=g+this.translate(b)),d=this.chart.renderer.symbols.arc(this.left+d[0],this.top+d[1],e[0],e[0],{start:a,end:b,innerR:r(e[1],e[0]-e[2]),open:n}));return d},getPlotLinePath:function(a,b){var c=this.center,d=this.chart,g=this.getPosition(a),f,e,i;this.isCircular?i=["M",c[0]+d.plotLeft,c[1]+d.plotTop,"L",g.x,g.y]:this.options.gridLineInterpolation==="circle"?(a=this.translate(a))&&(i=this.getLinePath(0,a)):(f=d.xAxis[0],i=[],a=this.translate(a),
+c=f.tickPositions,f.autoConnect&&(c=c.concat([c[0]])),b&&(c=[].concat(c).reverse()),s(c,function(c,b){e=f.getPosition(c,a);i.push(b?"L":"M",e.x,e.y)}));return i},getTitlePosition:function(){var a=this.center,b=this.chart,c=this.options.title;return{x:b.plotLeft+a[0]+(c.x||0),y:b.plotTop+a[1]-{high:0.5,middle:0.25,low:0}[c.align]*a[2]+(c.y||0)}}};o(G,"init",function(a,b,c){var k;var d=b.angular,g=b.polar,f=c.isX,e=d&&f,i,n;n=b.options;var l=c.pane||0;if(d){if(F(this,e?T:O),i=!f)this.defaultRadialOptions=
+this.defaultRadialGaugeOptions}else if(g)F(this,O),this.defaultRadialOptions=(i=f)?this.defaultRadialXOptions:p(this.defaultYAxisOptions,this.defaultRadialYOptions);a.call(this,b,c);if(!e&&(d||g)){a=this.options;if(!b.panes)b.panes=[];this.pane=(k=b.panes[l]=b.panes[l]||new J(M(n.pane)[l],b,this),l=k);l=l.options;b.inverted=!1;n.chart.zoomType=null;this.startAngleRad=b=(l.startAngle-90)*Math.PI/180;this.endAngleRad=n=(r(l.endAngle,l.startAngle+360)-90)*Math.PI/180;this.offset=a.offset||0;if((this.isCircular=
+i)&&c.max===C&&n-b===2*Math.PI)this.autoConnect=!0}});o(u,"getPosition",function(a,b,c,d,g){var f=this.axis;return f.getPosition?f.getPosition(c):a.call(this,b,c,d,g)});o(u,"getLabelPosition",function(a,b,c,d,g,f,e,i,n){var l=this.axis,k=f.y,h=f.align,j=(l.translate(this.pos)+l.startAngleRad+Math.PI/2)/Math.PI*180%360;l.isRadial?(a=l.getPosition(this.pos,l.center[2]/2+r(f.distance,-25)),f.rotation==="auto"?d.attr({rotation:j}):k===null&&(k=v(d.styles.lineHeight)*0.9-d.getBBox().height/2),h===null&&
+(h=l.isCircular?j>20&&j<160?"left":j>200&&j<340?"right":"center":"center",d.attr({align:h})),a.x+=f.x,a.y+=k):a=a.call(this,b,c,d,g,f,e,i,n);return a});o(u,"getMarkPath",function(a,b,c,d,g,f,e){var i=this.axis;i.isRadial?(a=i.getPosition(this.pos,i.center[2]/2+d),b=["M",b,c,"L",a.x,a.y]):b=a.call(this,b,c,d,g,f,e);return b});m.arearange=p(m.area,{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'<span style="color:{series.color}">{series.name}</span>: <b>{point.low}</b> - <b>{point.high}</b><br/>'},
+trackByArea:!0,dataLabels:{verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0}});h.arearange=j.extendClass(h.area,{type:"arearange",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",getSegments:function(){var a=this;s(a.points,function(b){if(!a.options.connectNulls&&(b.low===null||b.high===null))b.y=null;else if(b.low===null&&b.high!==null)b.y=b.high});z.prototype.getSegments.call(this)},translate:function(){var a=this.yAxis;h.area.prototype.translate.apply(this);
+s(this.points,function(b){var c=b.low,d=b.high,g=b.plotY;d===null&&c===null?b.y=null:c===null?(b.plotLow=b.plotY=null,b.plotHigh=a.translate(d,0,1,0,1)):d===null?(b.plotLow=g,b.plotHigh=null):(b.plotLow=g,b.plotHigh=a.translate(d,0,1,0,1))})},getSegmentPath:function(a){var b,c=[],d=a.length,g=z.prototype.getSegmentPath,f,e;e=this.options;var i=e.step;for(b=HighchartsAdapter.grep(a,function(a){return a.plotLow!==null});d--;)f=a[d],f.plotHigh!==null&&c.push({plotX:f.plotX,plotY:f.plotHigh});a=g.call(this,
+b);if(i)i===!0&&(i="left"),e.step={left:"right",center:"center",right:"left"}[i];c=g.call(this,c);e.step=i;e=[].concat(a,c);c[0]="L";this.areaPath=this.areaPath.concat(a,c);return e},drawDataLabels:function(){var a=this.data,b=a.length,c,d=[],g=z.prototype,f=this.options.dataLabels,e,i=this.chart.inverted;if(f.enabled||this._hasPointLabels){for(c=b;c--;)e=a[c],e.y=e.high,e.plotY=e.plotHigh,d[c]=e.dataLabel,e.dataLabel=e.dataLabelUpper,e.below=!1,i?(f.align="left",f.x=f.xHigh):f.y=f.yHigh;g.drawDataLabels.apply(this,
+arguments);for(c=b;c--;)e=a[c],e.dataLabelUpper=e.dataLabel,e.dataLabel=d[c],e.y=e.low,e.plotY=e.plotLow,e.below=!0,i?(f.align="right",f.x=f.xLow):f.y=f.yLow;g.drawDataLabels.apply(this,arguments)}},alignDataLabel:h.column.prototype.alignDataLabel,getSymbol:h.column.prototype.getSymbol,drawPoints:w});m.areasplinerange=p(m.arearange);h.areasplinerange=x(h.arearange,{type:"areasplinerange",getPointSpline:h.spline.prototype.getPointSpline});m.columnrange=p(m.column,m.arearange,{lineWidth:1,pointRange:null});
+h.columnrange=x(h.arearange,{type:"columnrange",translate:function(){var a=this,b=a.yAxis,c;q.translate.apply(a);s(a.points,function(d){var g=d.shapeArgs,f=a.options.minPointLength,e;d.plotHigh=c=b.translate(d.high,0,1,0,1);d.plotLow=d.plotY;e=c;d=d.plotY-c;d<f&&(f-=d,d+=f,e-=f/2);g.height=d;g.y=e})},trackerGroups:["group","dataLabels"],drawGraph:w,pointAttrToOptions:q.pointAttrToOptions,drawPoints:q.drawPoints,drawTracker:q.drawTracker,animate:q.animate,getColumnMetrics:q.getColumnMetrics});m.gauge=
+p(m.line,{dataLabels:{enabled:!0,y:15,borderWidth:1,borderColor:"silver",borderRadius:3,style:{fontWeight:"bold"},verticalAlign:"top",zIndex:2},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1});u={type:"gauge",pointClass:j.extendClass(j.Point,{setState:function(a){this.state=a}}),angular:!0,drawGraph:w,fixedBox:!0,trackerGroups:["group","dataLabels"],translate:function(){var a=this.yAxis,b=this.options,c=a.center;this.generatePoints();s(this.points,function(d){var g=p(b.dial,d.dial),f=
+v(r(g.radius,80))*c[2]/200,e=v(r(g.baseLength,70))*f/100,i=v(r(g.rearLength,10))*f/100,n=g.baseWidth||3,l=g.topWidth||1,k=a.startAngleRad+a.translate(d.y,null,null,null,!0);b.wrap===!1&&(k=Math.max(a.startAngleRad,Math.min(a.endAngleRad,k)));k=k*180/Math.PI;d.shapeType="path";d.shapeArgs={d:g.path||["M",-i,-n/2,"L",e,-n/2,f,-l/2,f,l/2,e,n/2,-i,n/2,"z"],translateX:c[0],translateY:c[1],rotation:k};d.plotX=c[0];d.plotY=c[1]})},drawPoints:function(){var a=this,b=a.yAxis.center,c=a.pivot,d=a.options,g=
+d.pivot,f=a.chart.renderer;s(a.points,function(c){var b=c.graphic,g=c.shapeArgs,l=g.d,k=p(d.dial,c.dial);b?(b.animate(g),g.d=l):c.graphic=f[c.shapeType](g).attr({stroke:k.borderColor||"none","stroke-width":k.borderWidth||0,fill:k.backgroundColor||"black",rotation:g.rotation}).add(a.group)});c?c.animate({translateX:b[0],translateY:b[1]}):a.pivot=f.circle(0,0,r(g.radius,5)).attr({"stroke-width":g.borderWidth||0,stroke:g.borderColor||"silver",fill:g.backgroundColor||"black"}).translate(b[0],b[1]).add(a.group)},
+animate:function(a){var b=this;if(!a)s(b.points,function(a){var d=a.graphic;d&&(d.attr({rotation:b.yAxis.startAngleRad*180/Math.PI}),d.animate({rotation:a.shapeArgs.rotation},b.options.animation))}),b.animate=null},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);h.pie.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:h.pie.prototype.setData,drawTracker:h.column.prototype.drawTracker};h.gauge=
+j.extendClass(h.line,u);m.boxplot=p(m.column,{fillColor:"#FFFFFF",lineWidth:1,medianWidth:2,states:{hover:{brightness:-0.3}},threshold:null,tooltip:{pointFormat:'<span style="color:{series.color};font-weight:bold">{series.name}</span><br/>Maximum: {point.high}<br/>Upper quartile: {point.q3}<br/>Median: {point.median}<br/>Lower quartile: {point.q1}<br/>Minimum: {point.low}<br/>'},whiskerLength:"50%",whiskerWidth:2});h.boxplot=x(h.column,{type:"boxplot",pointArrayMap:["low","q1","median","q3","high"],
+toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:"high",pointAttrToOptions:{fill:"fillColor",stroke:"color","stroke-width":"lineWidth"},drawDataLabels:w,translate:function(){var a=this.yAxis,b=this.pointArrayMap;h.column.prototype.translate.apply(this);s(this.points,function(c){s(b,function(b){c[b]!==null&&(c[b+"Plot"]=a.translate(c[b],0,1,0,1))})})},drawPoints:function(){var a=this,b=a.points,c=a.options,d=a.chart.renderer,g,f,e,i,n,l,k,h,j,m,o,H,p,E,I,q,w,t,v,u,z,y,x=a.doQuartiles!==
+!1,B=parseInt(a.options.whiskerLength,10)/100;s(b,function(b){j=b.graphic;z=b.shapeArgs;o={};E={};q={};y=b.color||a.color;if(b.plotY!==C)if(g=b.pointAttr[b.selected?"selected":""],w=z.width,t=A(z.x),v=t+w,u=D(w/2),f=A(x?b.q1Plot:b.lowPlot),e=A(x?b.q3Plot:b.lowPlot),i=A(b.highPlot),n=A(b.lowPlot),o.stroke=b.stemColor||c.stemColor||y,o["stroke-width"]=r(b.stemWidth,c.stemWidth,c.lineWidth),o.dashstyle=b.stemDashStyle||c.stemDashStyle,E.stroke=b.whiskerColor||c.whiskerColor||y,E["stroke-width"]=r(b.whiskerWidth,
+c.whiskerWidth,c.lineWidth),q.stroke=b.medianColor||c.medianColor||y,q["stroke-width"]=r(b.medianWidth,c.medianWidth,c.lineWidth),k=o["stroke-width"]%2/2,h=t+u+k,m=["M",h,e,"L",h,i,"M",h,f,"L",h,n,"z"],x&&(k=g["stroke-width"]%2/2,h=A(h)+k,f=A(f)+k,e=A(e)+k,t+=k,v+=k,H=["M",t,e,"L",t,f,"L",v,f,"L",v,e,"L",t,e,"z"]),B&&(k=E["stroke-width"]%2/2,i+=k,n+=k,p=["M",h-u*B,i,"L",h+u*B,i,"M",h-u*B,n,"L",h+u*B,n]),k=q["stroke-width"]%2/2,l=D(b.medianPlot)+k,I=["M",t,l,"L",v,l,"z"],j)b.stem.animate({d:m}),B&&
+b.whiskers.animate({d:p}),x&&b.box.animate({d:H}),b.medianShape.animate({d:I});else{b.graphic=j=d.g().add(a.group);b.stem=d.path(m).attr(o).add(j);if(B)b.whiskers=d.path(p).attr(E).add(j);if(x)b.box=d.path(H).attr(g).add(j);b.medianShape=d.path(I).attr(q).add(j)}})}});m.errorbar=p(m.boxplot,{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:m.arearange.tooltip.pointFormat},whiskerWidth:null});h.errorbar=x(h.boxplot,{type:"errorbar",pointArrayMap:["low","high"],toYData:function(a){return[a.low,
+a.high]},pointValKey:"high",doQuartiles:!1,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||h.column.prototype.getColumnMetrics.call(this)}});m.waterfall=p(m.column,{lineWidth:1,lineColor:"#333",dashStyle:"dot",borderColor:"#333"});h.waterfall=x(h.column,{type:"waterfall",upColorProp:"fill",pointArrayMap:["low","y"],pointValKey:"y",init:function(a,b){b.stacking=!0;h.column.prototype.init.call(this,a,b)},translate:function(){var a=this.options,b=this.yAxis,c,d,
+g,f,e,i,n,l,k;c=a.threshold;a=a.borderWidth%2/2;h.column.prototype.translate.apply(this);l=c;g=this.points;for(d=0,c=g.length;d<c;d++){f=g[d];e=f.shapeArgs;i=this.getStack(d);k=i.points[this.index];if(isNaN(f.y))f.y=this.yData[d];n=S(l,l+f.y)+k[0];e.y=b.translate(n,0,1);f.isSum||f.isIntermediateSum?(e.y=b.translate(k[1],0,1),e.height=b.translate(k[0],0,1)-e.y):l+=i.total;e.height<0&&(e.y+=e.height,e.height*=-1);f.plotY=e.y=D(e.y)-a;e.height=D(e.height);f.yBottom=e.y+e.height}},processData:function(a){var b=
+this.yData,c=this.points,d,g=b.length,f=this.options.threshold||0,e,i,h,l,k,j;i=e=h=l=f;for(j=0;j<g;j++)k=b[j],d=c&&c[j]?c[j]:{},k==="sum"||d.isSum?b[j]=i:k==="intermediateSum"||d.isIntermediateSum?(b[j]=e,e=f):(i+=k,e+=k),h=Math.min(i,h),l=Math.max(i,l);z.prototype.processData.call(this,a);this.dataMin=h;this.dataMax=l},toYData:function(a){if(a.isSum)return"sum";else if(a.isIntermediateSum)return"intermediateSum";return a.y},getAttribs:function(){h.column.prototype.getAttribs.apply(this,arguments);
+var a=this.options,b=a.states,c=a.upColor||this.color,a=j.Color(c).brighten(0.1).get(),d=p(this.pointAttr),g=this.upColorProp;d[""][g]=c;d.hover[g]=b.hover.upColor||a;d.select[g]=b.select.upColor||c;s(this.points,function(a){if(a.y>0&&!a.color)a.pointAttr=d,a.color=c})},getGraphPath:function(){var a=this.data,b=a.length,c=D(this.options.lineWidth+this.options.borderWidth)%2/2,d=[],g,f,e;for(e=1;e<b;e++)f=a[e].shapeArgs,g=a[e-1].shapeArgs,f=["M",g.x+g.width,g.y+c,"L",f.x,g.y+c],a[e-1].y<0&&(f[2]+=
+g.height,f[5]+=g.height),d=d.concat(f);return d},getExtremes:w,getStack:function(a){var b=this.yAxis.stacks,c=this.stackKey;this.processedYData[a]<this.options.threshold&&(c="-"+c);return b[c][a]},drawGraph:z.prototype.drawGraph});m.bubble=p(m.scatter,{dataLabels:{inside:!0,style:{color:"white",textShadow:"0px 0px 3px black"},verticalAlign:"middle"},marker:{lineColor:null,lineWidth:1},minSize:8,maxSize:"20%",tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0});
+h.bubble=x(h.scatter,{type:"bubble",pointArrayMap:["y","z"],trackerGroups:["group","dataLabelsGroup"],pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor"},applyOpacity:function(a){var b=this.options.marker,c=r(b.fillOpacity,0.5),a=a||b.fillColor||this.color;c!==1&&(a=j.Color(a).setOpacity(c).get("rgba"));return a},convertAttribs:function(){var a=z.prototype.convertAttribs.apply(this,arguments);a.fill=this.applyOpacity(a.fill);return a},getRadii:function(a,b,c,d){var g,
+f,e,i=this.zData,h=[];for(f=0,g=i.length;f<g;f++)e=b-a,e=e>0?(i[f]-a)/(b-a):0.5,h.push(t.ceil(c+e*(d-c))/2);this.radii=h},animate:function(a){var b=this.options.animation;if(!a)s(this.points,function(a){var d=a.graphic,a=a.shapeArgs;d&&a&&(d.attr("r",1),d.animate({r:a.r},b))}),this.animate=null},translate:function(){var a,b=this.data,c,d,g=this.radii;h.scatter.prototype.translate.call(this);for(a=b.length;a--;)c=b[a],d=g?g[a]:0,c.negative=c.z<(this.options.zThreshold||0),d>=this.minPxSize/2?(c.shapeType=
+"circle",c.shapeArgs={x:c.plotX,y:c.plotY,r:d},c.dlBox={x:c.plotX-d,y:c.plotY-d,width:2*d,height:2*d}):c.shapeArgs=c.plotY=c.dlBox=C},drawLegendSymbol:function(a,b){var c=v(a.itemStyle.fontSize)/2;b.legendSymbol=this.chart.renderer.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker=!0},drawPoints:h.column.prototype.drawPoints,alignDataLabel:h.column.prototype.alignDataLabel});N.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,d=0,g=b,f=this.isXAxis,
+e=f?"xData":"yData",i=this.min,h={},j=t.min(c.plotWidth,c.plotHeight),k=Number.MAX_VALUE,m=-Number.MAX_VALUE,o=this.max-i,p=b/o,q=[];this.tickPositions&&(s(this.series,function(b){var c=b.options;if(b.type==="bubble"&&b.visible&&(a.allowZoomOutside=!0,q.push(b),f))s(["minSize","maxSize"],function(a){var b=c[a],d=/%$/.test(b),b=v(b);h[a]=d?j*b/100:b}),b.minPxSize=h.minSize,b=b.zData,b.length&&(k=t.min(k,t.max(P(b),c.displayNegative===!1?c.zThreshold:-Number.MAX_VALUE)),m=t.max(m,Q(b)))}),s(q,function(a){var b=
+a[e],c=b.length,j;f&&a.getRadii(k,m,h.minSize,h.maxSize);if(o>0)for(;c--;)j=a.radii[c],d=Math.min((b[c]-i)*p-j,d),g=Math.max((b[c]-i)*p+j,g)}),q.length&&o>0&&r(this.options.min,this.userMin)===C&&r(this.options.max,this.userMax)===C&&(g-=b,p*=(b+d-g)/b,this.min+=d/p,this.max+=g/p))};var y=z.prototype,m=j.Pointer.prototype;y.toXY=function(a){var b,c=this.chart;b=a.plotX;var d=a.plotY;a.rectPlotX=b;a.rectPlotY=d;a.clientX=(b/Math.PI*180+this.xAxis.pane.options.startAngle)%360;b=this.xAxis.postTranslate(a.plotX,
+this.yAxis.len-d);a.plotX=a.polarPlotX=b.x-c.plotLeft;a.plotY=a.polarPlotY=b.y-c.plotTop};y.orderTooltipPoints=function(a){if(this.chart.polar&&(a.sort(function(a,c){return a.clientX-c.clientX}),a[0]))a[0].wrappedClientX=a[0].clientX+360,a.push(a[0])};o(h.area.prototype,"init",K);o(h.areaspline.prototype,"init",K);o(h.spline.prototype,"getPointSpline",function(a,b,c,d){var g,f,e,i,h,j,k;if(this.chart.polar){g=c.plotX;f=c.plotY;a=b[d-1];e=b[d+1];this.connectEnds&&(a||(a=b[b.length-2]),e||(e=b[1]));
+if(a&&e)i=a.plotX,h=a.plotY,b=e.plotX,j=e.plotY,i=(1.5*g+i)/2.5,h=(1.5*f+h)/2.5,e=(1.5*g+b)/2.5,k=(1.5*f+j)/2.5,b=Math.sqrt(Math.pow(i-g,2)+Math.pow(h-f,2)),j=Math.sqrt(Math.pow(e-g,2)+Math.pow(k-f,2)),i=Math.atan2(h-f,i-g),h=Math.atan2(k-f,e-g),k=Math.PI/2+(i+h)/2,Math.abs(i-k)>Math.PI/2&&(k-=Math.PI),i=g+Math.cos(k)*b,h=f+Math.sin(k)*b,e=g+Math.cos(Math.PI+k)*j,k=f+Math.sin(Math.PI+k)*j,c.rightContX=e,c.rightContY=k;d?(c=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,i||g,h||f,g,f],a.rightContX=
+a.rightContY=null):c=["M",g,f]}else c=a.call(this,b,c,d);return c});o(y,"translate",function(a){a.call(this);if(this.chart.polar&&!this.preventPostTranslate)for(var a=this.points,b=a.length;b--;)this.toXY(a[b])});o(y,"getSegmentPath",function(a,b){var c=this.points;if(this.chart.polar&&this.options.connectEnds!==!1&&b[b.length-1]===c[c.length-1]&&c[0].y!==null)this.connectEnds=!0,b=[].concat(b,[c[0]]);return a.call(this,b)});o(y,"animate",L);o(q,"animate",L);o(y,"setTooltipPoints",function(a,b){this.chart.polar&&
+F(this.xAxis,{tooltipLen:360});return a.call(this,b)});o(q,"translate",function(a){var b=this.xAxis,c=this.yAxis.len,d=b.center,g=b.startAngleRad,f=this.chart.renderer,e,h;this.preventPostTranslate=!0;a.call(this);if(b.isRadial){b=this.points;for(h=b.length;h--;)e=b[h],a=e.barX+g,e.shapeType="path",e.shapeArgs={d:f.symbols.arc(d[0],d[1],c-e.plotY,null,{start:a,end:a+e.pointWidth,innerR:c-r(e.yBottom,c)})},this.toXY(e)}});o(q,"alignDataLabel",function(a,b,c,d,g,f){if(this.chart.polar){a=b.rectPlotX/
+Math.PI*180;if(d.align===null)d.align=a>20&&a<160?"left":a>200&&a<340?"right":"center";if(d.verticalAlign===null)d.verticalAlign=a<45||a>315?"bottom":a>135&&a<225?"top":"middle";y.alignDataLabel.call(this,b,c,d,g,f)}else a.call(this,b,c,d,g,f)});o(m,"getIndex",function(a,b){var c,d=this.chart,g;d.polar?(g=d.xAxis[0].center,c=b.chartX-g[0]-d.plotLeft,d=b.chartY-g[1]-d.plotTop,c=180-Math.round(Math.atan2(c,d)/Math.PI*180)):c=a.call(this,b);return c});o(m,"getCoordinates",function(a,b){var c=this.chart,
+d={xAxis:[],yAxis:[]};c.polar?s(c.axes,function(a){var f=a.isXAxis,e=a.center,h=b.chartX-e[0]-c.plotLeft,e=b.chartY-e[1]-c.plotTop;d[f?"xAxis":"yAxis"].push({axis:a,value:a.translate(f?Math.PI-Math.atan2(h,e):Math.sqrt(Math.pow(h,2)+Math.pow(e,2)),!0)})}):d=a.call(this,b);return d})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts-more.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts-more.src.js
new file mode 100644
index 0000000..39d4941
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts-more.src.js
@@ -0,0 +1,2430 @@
+// ==ClosureCompiler==
+// @compilation_level SIMPLE_OPTIMIZATIONS
+
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ *
+ * (c) 2009-2013 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts, HighchartsAdapter, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console */
+
+(function (Highcharts, UNDEFINED) {
+var arrayMin = Highcharts.arrayMin,
+	arrayMax = Highcharts.arrayMax,
+	each = Highcharts.each,
+	extend = Highcharts.extend,
+	merge = Highcharts.merge,
+	map = Highcharts.map,
+	pick = Highcharts.pick,
+	pInt = Highcharts.pInt,
+	defaultPlotOptions = Highcharts.getOptions().plotOptions,
+	seriesTypes = Highcharts.seriesTypes,
+	extendClass = Highcharts.extendClass,
+	splat = Highcharts.splat,
+	wrap = Highcharts.wrap,
+	Axis = Highcharts.Axis,
+	Tick = Highcharts.Tick,
+	Series = Highcharts.Series,
+	colProto = seriesTypes.column.prototype,
+	math = Math,
+	mathRound = math.round,
+	mathFloor = math.floor,
+	mathMax = math.max,
+	noop = function () {};/**
+ * The Pane object allows options that are common to a set of X and Y axes.
+ * 
+ * In the future, this can be extended to basic Highcharts and Highstock.
+ */
+function Pane(options, chart, firstAxis) {
+	this.init.call(this, options, chart, firstAxis);
+}
+
+// Extend the Pane prototype
+extend(Pane.prototype, {
+	
+	/**
+	 * Initiate the Pane object
+	 */
+	init: function (options, chart, firstAxis) {
+		var pane = this,
+			backgroundOption,
+			defaultOptions = pane.defaultOptions;
+		
+		pane.chart = chart;
+		
+		// Set options
+		if (chart.angular) { // gauges
+			defaultOptions.background = {}; // gets extended by this.defaultBackgroundOptions
+		}
+		pane.options = options = merge(defaultOptions, options);
+		
+		backgroundOption = options.background;
+		
+		// To avoid having weighty logic to place, update and remove the backgrounds,
+		// push them to the first axis' plot bands and borrow the existing logic there.
+		if (backgroundOption) {
+			each([].concat(splat(backgroundOption)).reverse(), function (config) {
+				var backgroundColor = config.backgroundColor; // if defined, replace the old one (specific for gradients)
+				config = merge(pane.defaultBackgroundOptions, config);
+				if (backgroundColor) {
+					config.backgroundColor = backgroundColor;
+				}
+				config.color = config.backgroundColor; // due to naming in plotBands
+				firstAxis.options.plotBands.unshift(config);
+			});
+		}
+	},
+	
+	/**
+	 * The default options object
+	 */
+	defaultOptions: {
+		// background: {conditional},
+		center: ['50%', '50%'],
+		size: '85%',
+		startAngle: 0
+		//endAngle: startAngle + 360
+	},	
+	
+	/**
+	 * The default background options
+	 */
+	defaultBackgroundOptions: {
+		shape: 'circle',
+		borderWidth: 1,
+		borderColor: 'silver',
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#FFF'],
+				[1, '#DDD']
+			]
+		},
+		from: Number.MIN_VALUE, // corrected to axis min
+		innerRadius: 0,
+		to: Number.MAX_VALUE, // corrected to axis max
+		outerRadius: '105%'
+	}
+	
+});
+var axisProto = Axis.prototype,
+	tickProto = Tick.prototype;
+	
+/**
+ * Augmented methods for the x axis in order to hide it completely, used for the X axis in gauges
+ */
+var hiddenAxisMixin = {
+	getOffset: noop,
+	redraw: function () {
+		this.isDirty = false; // prevent setting Y axis dirty
+	},
+	render: function () {
+		this.isDirty = false; // prevent setting Y axis dirty
+	},
+	setScale: noop,
+	setCategories: noop,
+	setTitle: noop
+};
+
+/**
+ * Augmented methods for the value axis
+ */
+/*jslint unparam: true*/
+var radialAxisMixin = {
+	isRadial: true,
+	
+	/**
+	 * The default options extend defaultYAxisOptions
+	 */
+	defaultRadialGaugeOptions: {
+		labels: {
+			align: 'center',
+			x: 0,
+			y: null // auto
+		},
+		minorGridLineWidth: 0,
+		minorTickInterval: 'auto',
+		minorTickLength: 10,
+		minorTickPosition: 'inside',
+		minorTickWidth: 1,
+		plotBands: [],
+		tickLength: 10,
+		tickPosition: 'inside',
+		tickWidth: 2,
+		title: {
+			rotation: 0
+		},
+		zIndex: 2 // behind dials, points in the series group
+	},
+	
+	// Circular axis around the perimeter of a polar chart
+	defaultRadialXOptions: {
+		gridLineWidth: 1, // spokes
+		labels: {
+			align: null, // auto
+			distance: 15,
+			x: 0,
+			y: null // auto
+		},
+		maxPadding: 0,
+		minPadding: 0,
+		plotBands: [],
+		showLastLabel: false, 
+		tickLength: 0
+	},
+	
+	// Radial axis, like a spoke in a polar chart
+	defaultRadialYOptions: {
+		gridLineInterpolation: 'circle',
+		labels: {
+			align: 'right',
+			x: -3,
+			y: -2
+		},
+		plotBands: [],
+		showLastLabel: false,
+		title: {
+			x: 4,
+			text: null,
+			rotation: 90
+		}
+	},
+	
+	/**
+	 * Merge and set options
+	 */
+	setOptions: function (userOptions) {
+		
+		this.options = merge(
+			this.defaultOptions,
+			this.defaultRadialOptions,
+			userOptions
+		);
+		
+	},
+	
+	/**
+	 * Wrap the getOffset method to return zero offset for title or labels in a radial 
+	 * axis
+	 */
+	getOffset: function () {
+		// Call the Axis prototype method (the method we're in now is on the instance)
+		axisProto.getOffset.call(this);
+		
+		// Title or label offsets are not counted
+		this.chart.axisOffset[this.side] = 0;
+	},
+
+
+	/**
+	 * Get the path for the axis line. This method is also referenced in the getPlotLinePath
+	 * method.
+	 */
+	getLinePath: function (lineWidth, radius) {
+		var center = this.center;
+		radius = pick(radius, center[2] / 2 - this.offset);
+		
+		return this.chart.renderer.symbols.arc(
+			this.left + center[0],
+			this.top + center[1],
+			radius,
+			radius, 
+			{
+				start: this.startAngleRad,
+				end: this.endAngleRad,
+				open: true,
+				innerR: 0
+			}
+		);
+	},
+
+	/**
+	 * Override setAxisTranslation by setting the translation to the difference
+	 * in rotation. This allows the translate method to return angle for 
+	 * any given value.
+	 */
+	setAxisTranslation: function () {
+		
+		// Call uber method		
+		axisProto.setAxisTranslation.call(this);
+			
+		// Set transA and minPixelPadding
+		if (this.center) { // it's not defined the first time
+			if (this.isCircular) {
+				
+				this.transA = (this.endAngleRad - this.startAngleRad) / 
+					((this.max - this.min) || 1);
+					
+				
+			} else { 
+				this.transA = (this.center[2] / 2) / ((this.max - this.min) || 1);
+			}
+			
+			if (this.isXAxis) {
+				this.minPixelPadding = this.transA * this.minPointOffset +
+					(this.reversed ? (this.endAngleRad - this.startAngleRad) / 4 : 0); // ???
+			}
+		}
+	},
+	
+	/**
+	 * In case of auto connect, add one closestPointRange to the max value right before
+	 * tickPositions are computed, so that ticks will extend passed the real max.
+	 */
+	beforeSetTickPositions: function () {
+		if (this.autoConnect) {
+			this.max += (this.categories && 1) || this.pointRange || this.closestPointRange || 0; // #1197, #2260
+		}
+	},
+	
+	/**
+	 * Override the setAxisSize method to use the arc's circumference as length. This
+	 * allows tickPixelInterval to apply to pixel lengths along the perimeter
+	 */
+	setAxisSize: function () {
+		
+		axisProto.setAxisSize.call(this);
+
+		if (this.isRadial) {
+
+			// Set the center array
+			this.center = this.pane.center = seriesTypes.pie.prototype.getCenter.call(this.pane);
+			
+			this.len = this.width = this.height = this.isCircular ?
+				this.center[2] * (this.endAngleRad - this.startAngleRad) / 2 :
+				this.center[2] / 2;
+		}
+	},
+	
+	/**
+	 * Returns the x, y coordinate of a point given by a value and a pixel distance
+	 * from center
+	 */
+	getPosition: function (value, length) {
+		if (!this.isCircular) {
+			length = this.translate(value);
+			value = this.min;	
+		}
+		
+		return this.postTranslate(
+			this.translate(value),
+			pick(length, this.center[2] / 2) - this.offset
+		);		
+	},
+	
+	/**
+	 * Translate from intermediate plotX (angle), plotY (axis.len - radius) to final chart coordinates. 
+	 */
+	postTranslate: function (angle, radius) {
+		
+		var chart = this.chart,
+			center = this.center;
+			
+		angle = this.startAngleRad + angle;
+		
+		return {
+			x: chart.plotLeft + center[0] + Math.cos(angle) * radius,
+			y: chart.plotTop + center[1] + Math.sin(angle) * radius
+		}; 
+		
+	},
+	
+	/**
+	 * Find the path for plot bands along the radial axis
+	 */
+	getPlotBandPath: function (from, to, options) {
+		var center = this.center,
+			startAngleRad = this.startAngleRad,
+			fullRadius = center[2] / 2,
+			radii = [
+				pick(options.outerRadius, '100%'),
+				options.innerRadius,
+				pick(options.thickness, 10)
+			],
+			percentRegex = /%$/,
+			start,
+			end,
+			open,
+			isCircular = this.isCircular, // X axis in a polar chart
+			ret;
+			
+		// Polygonal plot bands
+		if (this.options.gridLineInterpolation === 'polygon') {
+			ret = this.getPlotLinePath(from).concat(this.getPlotLinePath(to, true));
+		
+		// Circular grid bands
+		} else {
+			
+			// Plot bands on Y axis (radial axis) - inner and outer radius depend on to and from
+			if (!isCircular) {
+				radii[0] = this.translate(from);
+				radii[1] = this.translate(to);
+			}
+			
+			// Convert percentages to pixel values
+			radii = map(radii, function (radius) {
+				if (percentRegex.test(radius)) {
+					radius = (pInt(radius, 10) * fullRadius) / 100;
+				}
+				return radius;
+			});
+			
+			// Handle full circle
+			if (options.shape === 'circle' || !isCircular) {
+				start = -Math.PI / 2;
+				end = Math.PI * 1.5;
+				open = true;
+			} else {
+				start = startAngleRad + this.translate(from);
+				end = startAngleRad + this.translate(to);
+			}
+		
+		
+			ret = this.chart.renderer.symbols.arc(
+				this.left + center[0],
+				this.top + center[1],
+				radii[0],
+				radii[0],
+				{
+					start: start,
+					end: end,
+					innerR: pick(radii[1], radii[0] - radii[2]),
+					open: open
+				}
+			);
+		}
+		 
+		return ret;
+	},
+	
+	/**
+	 * Find the path for plot lines perpendicular to the radial axis.
+	 */
+	getPlotLinePath: function (value, reverse) {
+		var axis = this,
+			center = axis.center,
+			chart = axis.chart,
+			end = axis.getPosition(value),
+			xAxis,
+			xy,
+			tickPositions,
+			ret;
+		
+		// Spokes
+		if (axis.isCircular) {
+			ret = ['M', center[0] + chart.plotLeft, center[1] + chart.plotTop, 'L', end.x, end.y];
+		
+		// Concentric circles			
+		} else if (axis.options.gridLineInterpolation === 'circle') {
+			value = axis.translate(value);
+			if (value) { // a value of 0 is in the center
+				ret = axis.getLinePath(0, value);
+			}
+		// Concentric polygons 
+		} else {
+			xAxis = chart.xAxis[0];
+			ret = [];
+			value = axis.translate(value);
+			tickPositions = xAxis.tickPositions;
+			if (xAxis.autoConnect) {
+				tickPositions = tickPositions.concat([tickPositions[0]]);
+			}
+			// Reverse the positions for concatenation of polygonal plot bands
+			if (reverse) {
+				tickPositions = [].concat(tickPositions).reverse();
+			}
+				
+			each(tickPositions, function (pos, i) {
+				xy = xAxis.getPosition(pos, value);
+				ret.push(i ? 'L' : 'M', xy.x, xy.y);
+			});
+			
+		}
+		return ret;
+	},
+	
+	/**
+	 * Find the position for the axis title, by default inside the gauge
+	 */
+	getTitlePosition: function () {
+		var center = this.center,
+			chart = this.chart,
+			titleOptions = this.options.title;
+		
+		return { 
+			x: chart.plotLeft + center[0] + (titleOptions.x || 0), 
+			y: chart.plotTop + center[1] - ({ high: 0.5, middle: 0.25, low: 0 }[titleOptions.align] * 
+				center[2]) + (titleOptions.y || 0)  
+		};
+	}
+	
+};
+/*jslint unparam: false*/
+
+/**
+ * Override axisProto.init to mix in special axis instance functions and function overrides
+ */
+wrap(axisProto, 'init', function (proceed, chart, userOptions) {
+	var axis = this,
+		angular = chart.angular,
+		polar = chart.polar,
+		isX = userOptions.isX,
+		isHidden = angular && isX,
+		isCircular,
+		startAngleRad,
+		endAngleRad,
+		options,
+		chartOptions = chart.options,
+		paneIndex = userOptions.pane || 0,
+		pane,
+		paneOptions;
+		
+	// Before prototype.init
+	if (angular) {
+		extend(this, isHidden ? hiddenAxisMixin : radialAxisMixin);
+		isCircular =  !isX;
+		if (isCircular) {
+			this.defaultRadialOptions = this.defaultRadialGaugeOptions;
+		}
+		
+	} else if (polar) {
+		//extend(this, userOptions.isX ? radialAxisMixin : radialAxisMixin);
+		extend(this, radialAxisMixin);
+		isCircular = isX;
+		this.defaultRadialOptions = isX ? this.defaultRadialXOptions : merge(this.defaultYAxisOptions, this.defaultRadialYOptions);
+		
+	}
+	
+	// Run prototype.init
+	proceed.call(this, chart, userOptions);
+	
+	if (!isHidden && (angular || polar)) {
+		options = this.options;
+		
+		// Create the pane and set the pane options.
+		if (!chart.panes) {
+			chart.panes = [];
+		}
+		this.pane = pane = chart.panes[paneIndex] = chart.panes[paneIndex] || new Pane(
+			splat(chartOptions.pane)[paneIndex],
+			chart,
+			axis
+		);
+		paneOptions = pane.options;
+		
+			
+		// Disable certain features on angular and polar axes
+		chart.inverted = false;
+		chartOptions.chart.zoomType = null;
+		
+		// Start and end angle options are
+		// given in degrees relative to top, while internal computations are
+		// in radians relative to right (like SVG).
+		this.startAngleRad = startAngleRad = (paneOptions.startAngle - 90) * Math.PI / 180;
+		this.endAngleRad = endAngleRad = (pick(paneOptions.endAngle, paneOptions.startAngle + 360)  - 90) * Math.PI / 180;
+		this.offset = options.offset || 0;
+		
+		this.isCircular = isCircular;
+		
+		// Automatically connect grid lines?
+		if (isCircular && userOptions.max === UNDEFINED && endAngleRad - startAngleRad === 2 * Math.PI) {
+			this.autoConnect = true;
+		}
+	}
+	
+});
+
+/**
+ * Add special cases within the Tick class' methods for radial axes.
+ */	
+wrap(tickProto, 'getPosition', function (proceed, horiz, pos, tickmarkOffset, old) {
+	var axis = this.axis;
+	
+	return axis.getPosition ? 
+		axis.getPosition(pos) :
+		proceed.call(this, horiz, pos, tickmarkOffset, old);	
+});
+
+/**
+ * Wrap the getLabelPosition function to find the center position of the label
+ * based on the distance option
+ */	
+wrap(tickProto, 'getLabelPosition', function (proceed, x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {
+	var axis = this.axis,
+		optionsY = labelOptions.y,
+		ret,
+		align = labelOptions.align,
+		angle = ((axis.translate(this.pos) + axis.startAngleRad + Math.PI / 2) / Math.PI * 180) % 360;
+	
+	if (axis.isRadial) {
+		ret = axis.getPosition(this.pos, (axis.center[2] / 2) + pick(labelOptions.distance, -25));
+		
+		// Automatically rotated
+		if (labelOptions.rotation === 'auto') {
+			label.attr({ 
+				rotation: angle
+			});
+		
+		// Vertically centered
+		} else if (optionsY === null) {
+			optionsY = pInt(label.styles.lineHeight) * 0.9 - label.getBBox().height / 2;
+		
+		}
+		
+		// Automatic alignment
+		if (align === null) {
+			if (axis.isCircular) {
+				if (angle > 20 && angle < 160) {
+					align = 'left'; // right hemisphere
+				} else if (angle > 200 && angle < 340) {
+					align = 'right'; // left hemisphere
+				} else {
+					align = 'center'; // top or bottom
+				}
+			} else {
+				align = 'center';
+			}
+			label.attr({
+				align: align
+			});
+		}
+		
+		ret.x += labelOptions.x;
+		ret.y += optionsY;
+		
+	} else {
+		ret = proceed.call(this, x, y, label, horiz, labelOptions, tickmarkOffset, index, step);
+	}
+	return ret;
+});
+
+/**
+ * Wrap the getMarkPath function to return the path of the radial marker
+ */
+wrap(tickProto, 'getMarkPath', function (proceed, x, y, tickLength, tickWidth, horiz, renderer) {
+	var axis = this.axis,
+		endPoint,
+		ret;
+		
+	if (axis.isRadial) {
+		endPoint = axis.getPosition(this.pos, axis.center[2] / 2 + tickLength);
+		ret = [
+			'M',
+			x,
+			y,
+			'L',
+			endPoint.x,
+			endPoint.y
+		];
+	} else {
+		ret = proceed.call(this, x, y, tickLength, tickWidth, horiz, renderer);
+	}
+	return ret;
+});/* 
+ * The AreaRangeSeries class
+ * 
+ */
+
+/**
+ * Extend the default options with map options
+ */
+defaultPlotOptions.arearange = merge(defaultPlotOptions.area, {
+	lineWidth: 1,
+	marker: null,
+	threshold: null,
+	tooltip: {
+		pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.low}</b> - <b>{point.high}</b><br/>' 
+	},
+	trackByArea: true,
+	dataLabels: {
+		verticalAlign: null,
+		xLow: 0,
+		xHigh: 0,
+		yLow: 0,
+		yHigh: 0	
+	}
+});
+
+/**
+ * Add the series type
+ */
+seriesTypes.arearange = Highcharts.extendClass(seriesTypes.area, {
+	type: 'arearange',
+	pointArrayMap: ['low', 'high'],
+	toYData: function (point) {
+		return [point.low, point.high];
+	},
+	pointValKey: 'low',
+	
+	/**
+	 * Extend getSegments to force null points if the higher value is null. #1703.
+	 */
+	getSegments: function () {
+		var series = this;
+
+		each(series.points, function (point) {
+			if (!series.options.connectNulls && (point.low === null || point.high === null)) {
+				point.y = null;
+			} else if (point.low === null && point.high !== null) {
+				point.y = point.high;
+			}
+		});
+		Series.prototype.getSegments.call(this);
+	},
+	
+	/**
+	 * Translate data points from raw values x and y to plotX and plotY
+	 */
+	translate: function () {
+		var series = this,
+			yAxis = series.yAxis;
+
+		seriesTypes.area.prototype.translate.apply(series);
+
+		// Set plotLow and plotHigh
+		each(series.points, function (point) {
+
+			var low = point.low,
+				high = point.high,
+				plotY = point.plotY;
+
+			if (high === null && low === null) {
+				point.y = null;
+			} else if (low === null) {
+				point.plotLow = point.plotY = null;
+				point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
+			} else if (high === null) {
+				point.plotLow = plotY;
+				point.plotHigh = null;
+			} else {
+				point.plotLow = plotY;
+				point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
+			}
+		});
+	},
+	
+	/**
+	 * Extend the line series' getSegmentPath method by applying the segment
+	 * path to both lower and higher values of the range
+	 */
+	getSegmentPath: function (segment) {
+		
+		var lowSegment,
+			highSegment = [],
+			i = segment.length,
+			baseGetSegmentPath = Series.prototype.getSegmentPath,
+			point,
+			linePath,
+			lowerPath,
+			options = this.options,
+			step = options.step,
+			higherPath;
+			
+		// Remove nulls from low segment
+		lowSegment = HighchartsAdapter.grep(segment, function (point) {
+			return point.plotLow !== null;
+		});
+		
+		// Make a segment with plotX and plotY for the top values
+		while (i--) {
+			point = segment[i];
+			if (point.plotHigh !== null) {
+				highSegment.push({
+					plotX: point.plotX,
+					plotY: point.plotHigh
+				});
+			}
+		}
+		
+		// Get the paths
+		lowerPath = baseGetSegmentPath.call(this, lowSegment);
+		if (step) {
+			if (step === true) {
+				step = 'left';
+			}
+			options.step = { left: 'right', center: 'center', right: 'left' }[step]; // swap for reading in getSegmentPath
+		}
+		higherPath = baseGetSegmentPath.call(this, highSegment);
+		options.step = step;
+		
+		// Create a line on both top and bottom of the range
+		linePath = [].concat(lowerPath, higherPath);
+		
+		// For the area path, we need to change the 'move' statement into 'lineTo' or 'curveTo'
+		higherPath[0] = 'L'; // this probably doesn't work for spline			
+		this.areaPath = this.areaPath.concat(lowerPath, higherPath);
+		
+		return linePath;
+	},
+	
+	/**
+	 * Extend the basic drawDataLabels method by running it for both lower and higher
+	 * values.
+	 */
+	drawDataLabels: function () {
+		
+		var data = this.data,
+			length = data.length,
+			i,
+			originalDataLabels = [],
+			seriesProto = Series.prototype,
+			dataLabelOptions = this.options.dataLabels,
+			point,
+			inverted = this.chart.inverted;
+			
+		if (dataLabelOptions.enabled || this._hasPointLabels) {
+			
+			// Step 1: set preliminary values for plotY and dataLabel and draw the upper labels
+			i = length;
+			while (i--) {
+				point = data[i];
+				
+				// Set preliminary values
+				point.y = point.high;
+				point.plotY = point.plotHigh;
+				
+				// Store original data labels and set preliminary label objects to be picked up 
+				// in the uber method
+				originalDataLabels[i] = point.dataLabel;
+				point.dataLabel = point.dataLabelUpper;
+				
+				// Set the default offset
+				point.below = false;
+				if (inverted) {
+					dataLabelOptions.align = 'left';
+					dataLabelOptions.x = dataLabelOptions.xHigh;								
+				} else {
+					dataLabelOptions.y = dataLabelOptions.yHigh;
+				}
+			}
+			seriesProto.drawDataLabels.apply(this, arguments); // #1209
+			
+			// Step 2: reorganize and handle data labels for the lower values
+			i = length;
+			while (i--) {
+				point = data[i];
+				
+				// Move the generated labels from step 1, and reassign the original data labels
+				point.dataLabelUpper = point.dataLabel;
+				point.dataLabel = originalDataLabels[i];
+				
+				// Reset values
+				point.y = point.low;
+				point.plotY = point.plotLow;
+				
+				// Set the default offset
+				point.below = true;
+				if (inverted) {
+					dataLabelOptions.align = 'right';
+					dataLabelOptions.x = dataLabelOptions.xLow;
+				} else {
+					dataLabelOptions.y = dataLabelOptions.yLow;
+				}
+			}
+			seriesProto.drawDataLabels.apply(this, arguments);
+		}
+	
+	},
+	
+	alignDataLabel: seriesTypes.column.prototype.alignDataLabel,
+	
+	getSymbol: seriesTypes.column.prototype.getSymbol,
+	
+	drawPoints: noop
+});/**
+ * The AreaSplineRangeSeries class
+ */
+
+defaultPlotOptions.areasplinerange = merge(defaultPlotOptions.arearange);
+
+/**
+ * AreaSplineRangeSeries object
+ */
+seriesTypes.areasplinerange = extendClass(seriesTypes.arearange, {
+	type: 'areasplinerange',
+	getPointSpline: seriesTypes.spline.prototype.getPointSpline
+});/**
+ * The ColumnRangeSeries class
+ */
+defaultPlotOptions.columnrange = merge(defaultPlotOptions.column, defaultPlotOptions.arearange, {
+	lineWidth: 1,
+	pointRange: null
+});
+
+/**
+ * ColumnRangeSeries object
+ */
+seriesTypes.columnrange = extendClass(seriesTypes.arearange, {
+	type: 'columnrange',
+	/**
+	 * Translate data points from raw values x and y to plotX and plotY
+	 */
+	translate: function () {
+		var series = this,
+			yAxis = series.yAxis,
+			plotHigh;
+
+		colProto.translate.apply(series);
+
+		// Set plotLow and plotHigh
+		each(series.points, function (point) {
+			var shapeArgs = point.shapeArgs,
+				minPointLength = series.options.minPointLength,
+				heightDifference,
+				height,
+				y;
+
+			point.plotHigh = plotHigh = yAxis.translate(point.high, 0, 1, 0, 1);
+			point.plotLow = point.plotY;
+
+			// adjust shape
+			y = plotHigh;
+			height = point.plotY - plotHigh;
+
+			if (height < minPointLength) {
+				heightDifference = (minPointLength - height);
+				height += heightDifference;
+				y -= heightDifference / 2;
+			}
+			shapeArgs.height = height;
+			shapeArgs.y = y;
+		});
+	},
+	trackerGroups: ['group', 'dataLabels'],
+	drawGraph: noop,
+	pointAttrToOptions: colProto.pointAttrToOptions,
+	drawPoints: colProto.drawPoints,
+	drawTracker: colProto.drawTracker,
+	animate: colProto.animate,
+	getColumnMetrics: colProto.getColumnMetrics
+});
+/* 
+ * The GaugeSeries class
+ */
+
+
+
+/**
+ * Extend the default options
+ */
+defaultPlotOptions.gauge = merge(defaultPlotOptions.line, {
+	dataLabels: {
+		enabled: true,
+		y: 15,
+		borderWidth: 1,
+		borderColor: 'silver',
+		borderRadius: 3,
+		style: {
+			fontWeight: 'bold'
+		},
+		verticalAlign: 'top',
+		zIndex: 2
+	},
+	dial: {
+		// radius: '80%',
+		// backgroundColor: 'black',
+		// borderColor: 'silver',
+		// borderWidth: 0,
+		// baseWidth: 3,
+		// topWidth: 1,
+		// baseLength: '70%' // of radius
+		// rearLength: '10%'
+	},
+	pivot: {
+		//radius: 5,
+		//borderWidth: 0
+		//borderColor: 'silver',
+		//backgroundColor: 'black'
+	},
+	tooltip: {
+		headerFormat: ''
+	},
+	showInLegend: false
+});
+
+/**
+ * Extend the point object
+ */
+var GaugePoint = Highcharts.extendClass(Highcharts.Point, {
+	/**
+	 * Don't do any hover colors or anything
+	 */
+	setState: function (state) {
+		this.state = state;
+	}
+});
+
+
+/**
+ * Add the series type
+ */
+var GaugeSeries = {
+	type: 'gauge',
+	pointClass: GaugePoint,
+	
+	// chart.angular will be set to true when a gauge series is present, and this will
+	// be used on the axes
+	angular: true, 
+	drawGraph: noop,
+	fixedBox: true,
+	trackerGroups: ['group', 'dataLabels'],
+	
+	/**
+	 * Calculate paths etc
+	 */
+	translate: function () {
+		
+		var series = this,
+			yAxis = series.yAxis,
+			options = series.options,
+			center = yAxis.center;
+			
+		series.generatePoints();
+		
+		each(series.points, function (point) {
+			
+			var dialOptions = merge(options.dial, point.dial),
+				radius = (pInt(pick(dialOptions.radius, 80)) * center[2]) / 200,
+				baseLength = (pInt(pick(dialOptions.baseLength, 70)) * radius) / 100,
+				rearLength = (pInt(pick(dialOptions.rearLength, 10)) * radius) / 100,
+				baseWidth = dialOptions.baseWidth || 3,
+				topWidth = dialOptions.topWidth || 1,
+				rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true);
+
+			// Handle the wrap option
+			if (options.wrap === false) {
+				rotation = Math.max(yAxis.startAngleRad, Math.min(yAxis.endAngleRad, rotation));
+			}
+			rotation = rotation * 180 / Math.PI;
+				
+			point.shapeType = 'path';
+			point.shapeArgs = {
+				d: dialOptions.path || [
+					'M', 
+					-rearLength, -baseWidth / 2, 
+					'L', 
+					baseLength, -baseWidth / 2,
+					radius, -topWidth / 2,
+					radius, topWidth / 2,
+					baseLength, baseWidth / 2,
+					-rearLength, baseWidth / 2,
+					'z'
+				],
+				translateX: center[0],
+				translateY: center[1],
+				rotation: rotation
+			};
+			
+			// Positions for data label
+			point.plotX = center[0];
+			point.plotY = center[1];
+		});
+	},
+	
+	/**
+	 * Draw the points where each point is one needle
+	 */
+	drawPoints: function () {
+		
+		var series = this,
+			center = series.yAxis.center,
+			pivot = series.pivot,
+			options = series.options,
+			pivotOptions = options.pivot,
+			renderer = series.chart.renderer;
+		
+		each(series.points, function (point) {
+			
+			var graphic = point.graphic,
+				shapeArgs = point.shapeArgs,
+				d = shapeArgs.d,
+				dialOptions = merge(options.dial, point.dial); // #1233
+			
+			if (graphic) {
+				graphic.animate(shapeArgs);
+				shapeArgs.d = d; // animate alters it
+			} else {
+				point.graphic = renderer[point.shapeType](shapeArgs)
+					.attr({
+						stroke: dialOptions.borderColor || 'none',
+						'stroke-width': dialOptions.borderWidth || 0,
+						fill: dialOptions.backgroundColor || 'black',
+						rotation: shapeArgs.rotation // required by VML when animation is false
+					})
+					.add(series.group);
+			}
+		});
+		
+		// Add or move the pivot
+		if (pivot) {
+			pivot.animate({ // #1235
+				translateX: center[0],
+				translateY: center[1]
+			});
+		} else {
+			series.pivot = renderer.circle(0, 0, pick(pivotOptions.radius, 5))
+				.attr({
+					'stroke-width': pivotOptions.borderWidth || 0,
+					stroke: pivotOptions.borderColor || 'silver',
+					fill: pivotOptions.backgroundColor || 'black'
+				})
+				.translate(center[0], center[1])
+				.add(series.group);
+		}
+	},
+	
+	/**
+	 * Animate the arrow up from startAngle
+	 */
+	animate: function (init) {
+		var series = this;
+
+		if (!init) {
+			each(series.points, function (point) {
+				var graphic = point.graphic;
+
+				if (graphic) {
+					// start value
+					graphic.attr({
+						rotation: series.yAxis.startAngleRad * 180 / Math.PI
+					});
+
+					// animate
+					graphic.animate({
+						rotation: point.shapeArgs.rotation
+					}, series.options.animation);
+				}
+			});
+
+			// delete this function to allow it only once
+			series.animate = null;
+		}
+	},
+	
+	render: function () {
+		this.group = this.plotGroup(
+			'group', 
+			'series', 
+			this.visible ? 'visible' : 'hidden', 
+			this.options.zIndex, 
+			this.chart.seriesGroup
+		);
+		seriesTypes.pie.prototype.render.call(this);
+		this.group.clip(this.chart.clipRect);
+	},
+	
+	setData: seriesTypes.pie.prototype.setData,
+	drawTracker: seriesTypes.column.prototype.drawTracker
+};
+seriesTypes.gauge = Highcharts.extendClass(seriesTypes.line, GaugeSeries);/* ****************************************************************************
+ * Start Box plot series code											      *
+ *****************************************************************************/
+
+// Set default options
+defaultPlotOptions.boxplot = merge(defaultPlotOptions.column, {
+	fillColor: '#FFFFFF',
+	lineWidth: 1,
+	//medianColor: null,
+	medianWidth: 2,
+	states: {
+		hover: {
+			brightness: -0.3
+		}
+	},
+	//stemColor: null,
+	//stemDashStyle: 'solid'
+	//stemWidth: null,
+	threshold: null,
+	tooltip: {
+		pointFormat: '<span style="color:{series.color};font-weight:bold">{series.name}</span><br/>' +
+			'Maximum: {point.high}<br/>' +
+			'Upper quartile: {point.q3}<br/>' +
+			'Median: {point.median}<br/>' +
+			'Lower quartile: {point.q1}<br/>' +
+			'Minimum: {point.low}<br/>'
+			
+	},
+	//whiskerColor: null,
+	whiskerLength: '50%',
+	whiskerWidth: 2
+});
+
+// Create the series object
+seriesTypes.boxplot = extendClass(seriesTypes.column, {
+	type: 'boxplot',
+	pointArrayMap: ['low', 'q1', 'median', 'q3', 'high'], // array point configs are mapped to this
+	toYData: function (point) { // return a plain array for speedy calculation
+		return [point.low, point.q1, point.median, point.q3, point.high];
+	},
+	pointValKey: 'high', // defines the top of the tracker
+	
+	/**
+	 * One-to-one mapping from options to SVG attributes
+	 */
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		fill: 'fillColor',
+		stroke: 'color',
+		'stroke-width': 'lineWidth'
+	},
+	
+	/**
+	 * Disable data labels for box plot
+	 */
+	drawDataLabels: noop,
+
+	/**
+	 * Translate data points from raw values x and y to plotX and plotY
+	 */
+	translate: function () {
+		var series = this,
+			yAxis = series.yAxis,
+			pointArrayMap = series.pointArrayMap;
+
+		seriesTypes.column.prototype.translate.apply(series);
+
+		// do the translation on each point dimension
+		each(series.points, function (point) {
+			each(pointArrayMap, function (key) {
+				if (point[key] !== null) {
+					point[key + 'Plot'] = yAxis.translate(point[key], 0, 1, 0, 1);
+				}
+			});
+		});
+	},
+
+	/**
+	 * Draw the data points
+	 */
+	drawPoints: function () {
+		var series = this,  //state = series.state,
+			points = series.points,
+			options = series.options,
+			chart = series.chart,
+			renderer = chart.renderer,
+			pointAttr,
+			q1Plot,
+			q3Plot,
+			highPlot,
+			lowPlot,
+			medianPlot,
+			crispCorr,
+			crispX,
+			graphic,
+			stemPath,
+			stemAttr,
+			boxPath,
+			whiskersPath,
+			whiskersAttr,
+			medianPath,
+			medianAttr,
+			width,
+			left,
+			right,
+			halfWidth,
+			shapeArgs,
+			color,
+			doQuartiles = series.doQuartiles !== false, // error bar inherits this series type but doesn't do quartiles
+			whiskerLength = parseInt(series.options.whiskerLength, 10) / 100;
+
+
+		each(points, function (point) {
+
+			graphic = point.graphic;
+			shapeArgs = point.shapeArgs; // the box
+			stemAttr = {};
+			whiskersAttr = {};
+			medianAttr = {};
+			color = point.color || series.color;
+			
+			if (point.plotY !== UNDEFINED) {
+
+				pointAttr = point.pointAttr[point.selected ? 'selected' : ''];
+
+				// crisp vector coordinates
+				width = shapeArgs.width;
+				left = mathFloor(shapeArgs.x);
+				right = left + width;
+				halfWidth = mathRound(width / 2);
+				//crispX = mathRound(left + halfWidth) + crispCorr;
+				q1Plot = mathFloor(doQuartiles ? point.q1Plot : point.lowPlot);// + crispCorr;
+				q3Plot = mathFloor(doQuartiles ? point.q3Plot : point.lowPlot);// + crispCorr;
+				highPlot = mathFloor(point.highPlot);// + crispCorr;
+				lowPlot = mathFloor(point.lowPlot);// + crispCorr;
+				
+				// Stem attributes
+				stemAttr.stroke = point.stemColor || options.stemColor || color;
+				stemAttr['stroke-width'] = pick(point.stemWidth, options.stemWidth, options.lineWidth);
+				stemAttr.dashstyle = point.stemDashStyle || options.stemDashStyle;
+				
+				// Whiskers attributes
+				whiskersAttr.stroke = point.whiskerColor || options.whiskerColor || color;
+				whiskersAttr['stroke-width'] = pick(point.whiskerWidth, options.whiskerWidth, options.lineWidth);
+				
+				// Median attributes
+				medianAttr.stroke = point.medianColor || options.medianColor || color;
+				medianAttr['stroke-width'] = pick(point.medianWidth, options.medianWidth, options.lineWidth);
+				
+				
+				// The stem
+				crispCorr = (stemAttr['stroke-width'] % 2) / 2;
+				crispX = left + halfWidth + crispCorr;				
+				stemPath = [
+					// stem up
+					'M',
+					crispX, q3Plot,
+					'L',
+					crispX, highPlot,
+					
+					// stem down
+					'M',
+					crispX, q1Plot,
+					'L',
+					crispX, lowPlot,
+					'z'
+				];
+				
+				// The box
+				if (doQuartiles) {
+					crispCorr = (pointAttr['stroke-width'] % 2) / 2;
+					crispX = mathFloor(crispX) + crispCorr;
+					q1Plot = mathFloor(q1Plot) + crispCorr;
+					q3Plot = mathFloor(q3Plot) + crispCorr;
+					left += crispCorr;
+					right += crispCorr;
+					boxPath = [
+						'M',
+						left, q3Plot,
+						'L',
+						left, q1Plot,
+						'L',
+						right, q1Plot,
+						'L',
+						right, q3Plot,
+						'L',
+						left, q3Plot,
+						'z'
+					];
+				}
+				
+				// The whiskers
+				if (whiskerLength) {
+					crispCorr = (whiskersAttr['stroke-width'] % 2) / 2;
+					highPlot = highPlot + crispCorr;
+					lowPlot = lowPlot + crispCorr;
+					whiskersPath = [
+						// High whisker
+						'M',
+						crispX - halfWidth * whiskerLength, 
+						highPlot,
+						'L',
+						crispX + halfWidth * whiskerLength, 
+						highPlot,
+						
+						// Low whisker
+						'M',
+						crispX - halfWidth * whiskerLength, 
+						lowPlot,
+						'L',
+						crispX + halfWidth * whiskerLength, 
+						lowPlot
+					];
+				}
+				
+				// The median
+				crispCorr = (medianAttr['stroke-width'] % 2) / 2;				
+				medianPlot = mathRound(point.medianPlot) + crispCorr;
+				medianPath = [
+					'M',
+					left, 
+					medianPlot,
+					'L',
+					right, 
+					medianPlot,
+					'z'
+				];
+				
+				// Create or update the graphics
+				if (graphic) { // update
+					
+					point.stem.animate({ d: stemPath });
+					if (whiskerLength) {
+						point.whiskers.animate({ d: whiskersPath });
+					}
+					if (doQuartiles) {
+						point.box.animate({ d: boxPath });
+					}
+					point.medianShape.animate({ d: medianPath });
+					
+				} else { // create new
+					point.graphic = graphic = renderer.g()
+						.add(series.group);
+					
+					point.stem = renderer.path(stemPath)
+						.attr(stemAttr)
+						.add(graphic);
+						
+					if (whiskerLength) {
+						point.whiskers = renderer.path(whiskersPath) 
+							.attr(whiskersAttr)
+							.add(graphic);
+					}
+					if (doQuartiles) {
+						point.box = renderer.path(boxPath)
+							.attr(pointAttr)
+							.add(graphic);
+					}	
+					point.medianShape = renderer.path(medianPath)
+						.attr(medianAttr)
+						.add(graphic);
+				}
+			}
+		});
+
+	}
+
+
+});
+
+/* ****************************************************************************
+ * End Box plot series code												*
+ *****************************************************************************/
+/* ****************************************************************************
+ * Start error bar series code                                                *
+ *****************************************************************************/
+
+// 1 - set default options
+defaultPlotOptions.errorbar = merge(defaultPlotOptions.boxplot, {
+	color: '#000000',
+	grouping: false,
+	linkedTo: ':previous',
+	tooltip: {
+		pointFormat: defaultPlotOptions.arearange.tooltip.pointFormat
+	},
+	whiskerWidth: null
+});
+
+// 2 - Create the series object
+seriesTypes.errorbar = extendClass(seriesTypes.boxplot, {
+	type: 'errorbar',
+	pointArrayMap: ['low', 'high'], // array point configs are mapped to this
+	toYData: function (point) { // return a plain array for speedy calculation
+		return [point.low, point.high];
+	},
+	pointValKey: 'high', // defines the top of the tracker
+	doQuartiles: false,
+
+	/**
+	 * Get the width and X offset, either on top of the linked series column
+	 * or standalone
+	 */
+	getColumnMetrics: function () {
+		return (this.linkedParent && this.linkedParent.columnMetrics) || 
+			seriesTypes.column.prototype.getColumnMetrics.call(this);
+	}
+});
+
+/* ****************************************************************************
+ * End error bar series code                                                  *
+ *****************************************************************************/
+/* ****************************************************************************
+ * Start Waterfall series code                                                *
+ *****************************************************************************/
+
+// 1 - set default options
+defaultPlotOptions.waterfall = merge(defaultPlotOptions.column, {
+	lineWidth: 1,
+	lineColor: '#333',
+	dashStyle: 'dot',
+	borderColor: '#333'
+});
+
+
+// 2 - Create the series object
+seriesTypes.waterfall = extendClass(seriesTypes.column, {
+	type: 'waterfall',
+
+	upColorProp: 'fill',
+
+	pointArrayMap: ['low', 'y'],
+
+	pointValKey: 'y',
+
+	/**
+	 * Init waterfall series, force stacking
+	 */
+	init: function (chart, options) {
+		// force stacking
+		options.stacking = true;
+
+		seriesTypes.column.prototype.init.call(this, chart, options);
+	},
+
+
+	/**
+	 * Translate data points from raw values
+	 */
+	translate: function () {
+		var series = this,
+			options = series.options,
+			axis = series.yAxis,
+			len,
+			i,
+			points,
+			point,
+			shapeArgs,
+			stack,
+			y,
+			previousY,
+			stackPoint,
+			threshold = options.threshold,
+			crispCorr = (options.borderWidth % 2) / 2;
+
+		// run column series translate
+		seriesTypes.column.prototype.translate.apply(this);
+
+		previousY = threshold;
+		points = series.points;
+
+		for (i = 0, len = points.length; i < len; i++) {
+			// cache current point object
+			point = points[i];
+			shapeArgs = point.shapeArgs;
+
+			// get current stack
+			stack = series.getStack(i);
+			stackPoint = stack.points[series.index];
+
+			// override point value for sums
+			if (isNaN(point.y)) {
+				point.y = series.yData[i];
+			}
+
+			// up points
+			y = mathMax(previousY, previousY + point.y) + stackPoint[0];
+			shapeArgs.y = axis.translate(y, 0, 1);
+
+
+			// sum points
+			if (point.isSum || point.isIntermediateSum) {
+				shapeArgs.y = axis.translate(stackPoint[1], 0, 1);
+				shapeArgs.height = axis.translate(stackPoint[0], 0, 1) - shapeArgs.y;
+
+			// if it's not the sum point, update previous stack end position
+			} else {
+				previousY += stack.total;
+			}
+
+			// negative points
+			if (shapeArgs.height < 0) {
+				shapeArgs.y += shapeArgs.height;
+				shapeArgs.height *= -1;
+			}
+
+			point.plotY = shapeArgs.y = mathRound(shapeArgs.y) - crispCorr;
+			shapeArgs.height = mathRound(shapeArgs.height);
+			point.yBottom = shapeArgs.y + shapeArgs.height;
+		}
+	},
+
+	/**
+	 * Call default processData then override yData to reflect waterfall's extremes on yAxis
+	 */
+	processData: function (force) {
+		var series = this,
+			options = series.options,
+			yData = series.yData,
+			points = series.points,
+			point,
+			dataLength = yData.length,
+			threshold = options.threshold || 0,
+			subSum,
+			sum,
+			dataMin,
+			dataMax,
+			y,
+			i;
+
+		sum = subSum = dataMin = dataMax = threshold;
+
+		for (i = 0; i < dataLength; i++) {
+			y = yData[i];
+			point = points && points[i] ? points[i] : {};
+
+			if (y === "sum" || point.isSum) {
+				yData[i] = sum;
+			} else if (y === "intermediateSum" || point.isIntermediateSum) {
+				yData[i] = subSum;
+				subSum = threshold;
+			} else {
+				sum += y;
+				subSum += y;
+			}
+			dataMin = Math.min(sum, dataMin);
+			dataMax = Math.max(sum, dataMax);
+		}
+
+		Series.prototype.processData.call(this, force);
+
+		// Record extremes
+		series.dataMin = dataMin;
+		series.dataMax = dataMax;
+	},
+
+	/**
+	 * Return y value or string if point is sum
+	 */
+	toYData: function (pt) {
+		if (pt.isSum) {
+			return "sum";
+		} else if (pt.isIntermediateSum) {
+			return "intermediateSum";
+		}
+
+		return pt.y;
+	},
+
+	/**
+	 * Postprocess mapping between options and SVG attributes
+	 */
+	getAttribs: function () {
+		seriesTypes.column.prototype.getAttribs.apply(this, arguments);
+
+		var series = this,
+			options = series.options,
+			stateOptions = options.states,
+			upColor = options.upColor || series.color,
+			hoverColor = Highcharts.Color(upColor).brighten(0.1).get(),
+			seriesDownPointAttr = merge(series.pointAttr),
+			upColorProp = series.upColorProp;
+
+		seriesDownPointAttr[''][upColorProp] = upColor;
+		seriesDownPointAttr.hover[upColorProp] = stateOptions.hover.upColor || hoverColor;
+		seriesDownPointAttr.select[upColorProp] = stateOptions.select.upColor || upColor;
+
+		each(series.points, function (point) {
+			if (point.y > 0 && !point.color) {
+				point.pointAttr = seriesDownPointAttr;
+				point.color = upColor;
+			}
+		});
+	},
+
+	/**
+	 * Draw columns' connector lines
+	 */
+	getGraphPath: function () {
+
+		var data = this.data,
+			length = data.length,
+			lineWidth = this.options.lineWidth + this.options.borderWidth,
+			normalizer = mathRound(lineWidth) % 2 / 2,
+			path = [],
+			M = 'M',
+			L = 'L',
+			prevArgs,
+			pointArgs,
+			i,
+			d;
+
+		for (i = 1; i < length; i++) {
+			pointArgs = data[i].shapeArgs;
+			prevArgs = data[i - 1].shapeArgs;
+
+			d = [
+				M,
+				prevArgs.x + prevArgs.width, prevArgs.y + normalizer,
+				L,
+				pointArgs.x, prevArgs.y + normalizer
+			];
+
+			if (data[i - 1].y < 0) {
+				d[2] += prevArgs.height;
+				d[5] += prevArgs.height;
+			}
+
+			path = path.concat(d);
+		}
+
+		return path;
+	},
+
+	/**
+	 * Extremes are recorded in processData
+	 */
+	getExtremes: noop,
+
+	/**
+	 * Return stack for given index
+	 */
+	getStack: function (i) {
+		var axis = this.yAxis,
+			stacks = axis.stacks,
+			key = this.stackKey;
+
+		if (this.processedYData[i] < this.options.threshold) {
+			key = '-' + key;
+		}
+
+		return stacks[key][i];
+	},
+
+	drawGraph: Series.prototype.drawGraph
+});
+
+/* ****************************************************************************
+ * End Waterfall series code                                                  *
+ *****************************************************************************/
+/* ****************************************************************************
+ * Start Bubble series code											          *
+ *****************************************************************************/
+
+// 1 - set default options
+defaultPlotOptions.bubble = merge(defaultPlotOptions.scatter, {
+	dataLabels: {
+		inside: true,
+		style: {
+			color: 'white',
+			textShadow: '0px 0px 3px black'
+		},
+		verticalAlign: 'middle'
+	},
+	// displayNegative: true,
+	marker: {
+		// fillOpacity: 0.5,
+		lineColor: null, // inherit from series.color
+		lineWidth: 1
+	},
+	minSize: 8,
+	maxSize: '20%',
+	// negativeColor: null,
+	tooltip: {
+		pointFormat: '({point.x}, {point.y}), Size: {point.z}'
+	},
+	turboThreshold: 0,
+	zThreshold: 0
+});
+
+// 2 - Create the series object
+seriesTypes.bubble = extendClass(seriesTypes.scatter, {
+	type: 'bubble',
+	pointArrayMap: ['y', 'z'],
+	trackerGroups: ['group', 'dataLabelsGroup'],
+	
+	/**
+	 * Mapping between SVG attributes and the corresponding options
+	 */
+	pointAttrToOptions: { 
+		stroke: 'lineColor',
+		'stroke-width': 'lineWidth',
+		fill: 'fillColor'
+	},
+	
+	/**
+	 * Apply the fillOpacity to all fill positions
+	 */
+	applyOpacity: function (fill) {
+		var markerOptions = this.options.marker,
+			fillOpacity = pick(markerOptions.fillOpacity, 0.5);
+		
+		// When called from Legend.colorizeItem, the fill isn't predefined
+		fill = fill || markerOptions.fillColor || this.color; 
+		
+		if (fillOpacity !== 1) {
+			fill = Highcharts.Color(fill).setOpacity(fillOpacity).get('rgba');
+		}
+		return fill;
+	},
+	
+	/**
+	 * Extend the convertAttribs method by applying opacity to the fill
+	 */
+	convertAttribs: function () {
+		var obj = Series.prototype.convertAttribs.apply(this, arguments);
+		
+		obj.fill = this.applyOpacity(obj.fill);
+		
+		return obj;
+	},
+
+	/**
+	 * Get the radius for each point based on the minSize, maxSize and each point's Z value. This
+	 * must be done prior to Series.translate because the axis needs to add padding in 
+	 * accordance with the point sizes.
+	 */
+	getRadii: function (zMin, zMax, minSize, maxSize) {
+		var len,
+			i,
+			pos,
+			zData = this.zData,
+			radii = [],
+			zRange;
+		
+		// Set the shape type and arguments to be picked up in drawPoints
+		for (i = 0, len = zData.length; i < len; i++) {
+			zRange = zMax - zMin;
+			pos = zRange > 0 ? // relative size, a number between 0 and 1
+				(zData[i] - zMin) / (zMax - zMin) : 
+				0.5;
+			radii.push(math.ceil(minSize + pos * (maxSize - minSize)) / 2);
+		}
+		this.radii = radii;
+	},
+	
+	/**
+	 * Perform animation on the bubbles
+	 */
+	animate: function (init) {
+		var animation = this.options.animation;
+		
+		if (!init) { // run the animation
+			each(this.points, function (point) {
+				var graphic = point.graphic,
+					shapeArgs = point.shapeArgs;
+
+				if (graphic && shapeArgs) {
+					// start values
+					graphic.attr('r', 1);
+
+					// animate
+					graphic.animate({
+						r: shapeArgs.r
+					}, animation);
+				}
+			});
+
+			// delete this function to allow it only once
+			this.animate = null;
+		}
+	},
+	
+	/**
+	 * Extend the base translate method to handle bubble size
+	 */
+	translate: function () {
+		
+		var i,
+			data = this.data,
+			point,
+			radius,
+			radii = this.radii;
+		
+		// Run the parent method
+		seriesTypes.scatter.prototype.translate.call(this);
+		
+		// Set the shape type and arguments to be picked up in drawPoints
+		i = data.length;
+		
+		while (i--) {
+			point = data[i];
+			radius = radii ? radii[i] : 0; // #1737
+
+			// Flag for negativeColor to be applied in Series.js
+			point.negative = point.z < (this.options.zThreshold || 0);
+			
+			if (radius >= this.minPxSize / 2) {
+				// Shape arguments
+				point.shapeType = 'circle';
+				point.shapeArgs = {
+					x: point.plotX,
+					y: point.plotY,
+					r: radius
+				};
+				
+				// Alignment box for the data label
+				point.dlBox = {
+					x: point.plotX - radius,
+					y: point.plotY - radius,
+					width: 2 * radius,
+					height: 2 * radius
+				};
+			} else { // below zThreshold
+				point.shapeArgs = point.plotY = point.dlBox = UNDEFINED; // #1691
+			}
+		}
+	},
+	
+	/**
+	 * Get the series' symbol in the legend
+	 * 
+	 * @param {Object} legend The legend object
+	 * @param {Object} item The series (this) or point
+	 */
+	drawLegendSymbol: function (legend, item) {
+		var radius = pInt(legend.itemStyle.fontSize) / 2;
+		
+		item.legendSymbol = this.chart.renderer.circle(
+			radius,
+			legend.baseline - radius,
+			radius
+		).attr({
+			zIndex: 3
+		}).add(item.legendGroup);
+		item.legendSymbol.isMarker = true;	
+		
+	},
+	
+	drawPoints: seriesTypes.column.prototype.drawPoints,
+	alignDataLabel: seriesTypes.column.prototype.alignDataLabel
+});
+
+/**
+ * Add logic to pad each axis with the amount of pixels
+ * necessary to avoid the bubbles to overflow.
+ */
+Axis.prototype.beforePadding = function () {
+	var axis = this,
+		axisLength = this.len,
+		chart = this.chart,
+		pxMin = 0, 
+		pxMax = axisLength,
+		isXAxis = this.isXAxis,
+		dataKey = isXAxis ? 'xData' : 'yData',
+		min = this.min,
+		extremes = {},
+		smallestSize = math.min(chart.plotWidth, chart.plotHeight),
+		zMin = Number.MAX_VALUE,
+		zMax = -Number.MAX_VALUE,
+		range = this.max - min,
+		transA = axisLength / range,
+		activeSeries = [];
+
+	// Handle padding on the second pass, or on redraw
+	if (this.tickPositions) {
+		each(this.series, function (series) {
+
+			var seriesOptions = series.options,
+				zData;
+
+			if (series.type === 'bubble' && series.visible) {
+
+				// Correction for #1673
+				axis.allowZoomOutside = true;
+
+				// Cache it
+				activeSeries.push(series);
+
+				if (isXAxis) { // because X axis is evaluated first
+				
+					// For each series, translate the size extremes to pixel values
+					each(['minSize', 'maxSize'], function (prop) {
+						var length = seriesOptions[prop],
+							isPercent = /%$/.test(length);
+						
+						length = pInt(length);
+						extremes[prop] = isPercent ?
+							smallestSize * length / 100 :
+							length;
+						
+					});
+					series.minPxSize = extremes.minSize;
+					
+					// Find the min and max Z
+					zData = series.zData;
+					if (zData.length) { // #1735
+						zMin = math.min(
+							zMin,
+							math.max(
+								arrayMin(zData), 
+								seriesOptions.displayNegative === false ? seriesOptions.zThreshold : -Number.MAX_VALUE
+							)
+						);
+						zMax = math.max(zMax, arrayMax(zData));
+					}
+				}
+			}
+		});
+
+		each(activeSeries, function (series) {
+
+			var data = series[dataKey],
+				i = data.length,
+				radius;
+
+			if (isXAxis) {
+				series.getRadii(zMin, zMax, extremes.minSize, extremes.maxSize);
+			}
+			
+			if (range > 0) {
+				while (i--) {
+					radius = series.radii[i];
+					pxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);
+					pxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);
+				}
+			}
+		});
+		
+		if (activeSeries.length && range > 0 && pick(this.options.min, this.userMin) === UNDEFINED && pick(this.options.max, this.userMax) === UNDEFINED) {
+			pxMax -= axisLength;
+			transA *= (axisLength + pxMin - pxMax) / axisLength;
+			this.min += pxMin / transA;
+			this.max += pxMax / transA;
+		}
+	}
+};
+
+/* ****************************************************************************
+ * End Bubble series code                                                     *
+ *****************************************************************************/
+/**
+ * Extensions for polar charts. Additionally, much of the geometry required for polar charts is
+ * gathered in RadialAxes.js.
+ * 
+ */
+
+var seriesProto = Series.prototype,
+	pointerProto = Highcharts.Pointer.prototype;
+
+
+
+/**
+ * Translate a point's plotX and plotY from the internal angle and radius measures to 
+ * true plotX, plotY coordinates
+ */
+seriesProto.toXY = function (point) {
+	var xy,
+		chart = this.chart,
+		plotX = point.plotX,
+		plotY = point.plotY;
+	
+	// Save rectangular plotX, plotY for later computation
+	point.rectPlotX = plotX;
+	point.rectPlotY = plotY;
+	
+	// Record the angle in degrees for use in tooltip
+	point.clientX = ((plotX / Math.PI * 180) + this.xAxis.pane.options.startAngle) % 360;
+	
+	// Find the polar plotX and plotY
+	xy = this.xAxis.postTranslate(point.plotX, this.yAxis.len - plotY);
+	point.plotX = point.polarPlotX = xy.x - chart.plotLeft;
+	point.plotY = point.polarPlotY = xy.y - chart.plotTop;
+};
+
+/** 
+ * Order the tooltip points to get the mouse capture ranges correct. #1915. 
+ */
+seriesProto.orderTooltipPoints = function (points) {
+	if (this.chart.polar) {
+		points.sort(function (a, b) {
+			return a.clientX - b.clientX;
+		});
+
+		// Wrap mouse tracking around to capture movement on the segment to the left
+		// of the north point (#1469, #2093).
+		if (points[0]) {
+			points[0].wrappedClientX = points[0].clientX + 360;
+			points.push(points[0]);
+		}
+	}
+};
+
+
+/**
+ * Add some special init logic to areas and areasplines
+ */
+function initArea(proceed, chart, options) {
+	proceed.call(this, chart, options);
+	if (this.chart.polar) {
+		
+		/**
+		 * Overridden method to close a segment path. While in a cartesian plane the area 
+		 * goes down to the threshold, in the polar chart it goes to the center.
+		 */
+		this.closeSegment = function (path) {
+			var center = this.xAxis.center;
+			path.push(
+				'L',
+				center[0],
+				center[1]
+			);			
+		};
+		
+		// Instead of complicated logic to draw an area around the inner area in a stack,
+		// just draw it behind
+		this.closedStacks = true;
+	}
+}
+wrap(seriesTypes.area.prototype, 'init', initArea);
+wrap(seriesTypes.areaspline.prototype, 'init', initArea);
+		
+
+/**
+ * Overridden method for calculating a spline from one point to the next
+ */
+wrap(seriesTypes.spline.prototype, 'getPointSpline', function (proceed, segment, point, i) {
+	
+	var ret,
+		smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc;
+		denom = smoothing + 1,
+		plotX, 
+		plotY,
+		lastPoint,
+		nextPoint,
+		lastX,
+		lastY,
+		nextX,
+		nextY,
+		leftContX,
+		leftContY,
+		rightContX,
+		rightContY,
+		distanceLeftControlPoint,
+		distanceRightControlPoint,
+		leftContAngle,
+		rightContAngle,
+		jointAngle;
+		
+		
+	if (this.chart.polar) {
+		
+		plotX = point.plotX;
+		plotY = point.plotY;
+		lastPoint = segment[i - 1];
+		nextPoint = segment[i + 1];
+			
+		// Connect ends
+		if (this.connectEnds) {
+			if (!lastPoint) {
+				lastPoint = segment[segment.length - 2]; // not the last but the second last, because the segment is already connected
+			}
+			if (!nextPoint) {
+				nextPoint = segment[1];
+			}	
+		}
+
+		// find control points
+		if (lastPoint && nextPoint) {
+		
+			lastX = lastPoint.plotX;
+			lastY = lastPoint.plotY;
+			nextX = nextPoint.plotX;
+			nextY = nextPoint.plotY;
+			leftContX = (smoothing * plotX + lastX) / denom;
+			leftContY = (smoothing * plotY + lastY) / denom;
+			rightContX = (smoothing * plotX + nextX) / denom;
+			rightContY = (smoothing * plotY + nextY) / denom;
+			distanceLeftControlPoint = Math.sqrt(Math.pow(leftContX - plotX, 2) + Math.pow(leftContY - plotY, 2));
+			distanceRightControlPoint = Math.sqrt(Math.pow(rightContX - plotX, 2) + Math.pow(rightContY - plotY, 2));
+			leftContAngle = Math.atan2(leftContY - plotY, leftContX - plotX);
+			rightContAngle = Math.atan2(rightContY - plotY, rightContX - plotX);
+			jointAngle = (Math.PI / 2) + ((leftContAngle + rightContAngle) / 2);
+				
+				
+			// Ensure the right direction, jointAngle should be in the same quadrant as leftContAngle
+			if (Math.abs(leftContAngle - jointAngle) > Math.PI / 2) {
+				jointAngle -= Math.PI;
+			}
+			
+			// Find the corrected control points for a spline straight through the point
+			leftContX = plotX + Math.cos(jointAngle) * distanceLeftControlPoint;
+			leftContY = plotY + Math.sin(jointAngle) * distanceLeftControlPoint;
+			rightContX = plotX + Math.cos(Math.PI + jointAngle) * distanceRightControlPoint;
+			rightContY = plotY + Math.sin(Math.PI + jointAngle) * distanceRightControlPoint;
+			
+			// Record for drawing in next point
+			point.rightContX = rightContX;
+			point.rightContY = rightContY;
+
+		}
+		
+		
+		// moveTo or lineTo
+		if (!i) {
+			ret = ['M', plotX, plotY];
+		} else { // curve from last point to this
+			ret = [
+				'C',
+				lastPoint.rightContX || lastPoint.plotX,
+				lastPoint.rightContY || lastPoint.plotY,
+				leftContX || plotX,
+				leftContY || plotY,
+				plotX,
+				plotY
+			];
+			lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later
+		}
+		
+		
+	} else {
+		ret = proceed.call(this, segment, point, i);
+	}
+	return ret;
+});
+
+/**
+ * Extend translate. The plotX and plotY values are computed as if the polar chart were a
+ * cartesian plane, where plotX denotes the angle in radians and (yAxis.len - plotY) is the pixel distance from
+ * center. 
+ */
+wrap(seriesProto, 'translate', function (proceed) {
+		
+	// Run uber method
+	proceed.call(this);
+	
+	// Postprocess plot coordinates
+	if (this.chart.polar && !this.preventPostTranslate) {
+		var points = this.points,
+			i = points.length;
+		while (i--) {
+			// Translate plotX, plotY from angle and radius to true plot coordinates
+			this.toXY(points[i]);
+		}
+	}
+});
+
+/** 
+ * Extend getSegmentPath to allow connecting ends across 0 to provide a closed circle in 
+ * line-like series.
+ */
+wrap(seriesProto, 'getSegmentPath', function (proceed, segment) {
+		
+	var points = this.points;
+	
+	// Connect the path
+	if (this.chart.polar && this.options.connectEnds !== false && 
+			segment[segment.length - 1] === points[points.length - 1] && points[0].y !== null) {
+		this.connectEnds = true; // re-used in splines
+		segment = [].concat(segment, [points[0]]);
+	}
+	
+	// Run uber method
+	return proceed.call(this, segment);
+	
+});
+
+
+function polarAnimate(proceed, init) {
+	var chart = this.chart,
+		animation = this.options.animation,
+		group = this.group,
+		markerGroup = this.markerGroup,
+		center = this.xAxis.center,
+		plotLeft = chart.plotLeft,
+		plotTop = chart.plotTop,
+		attribs;
+
+	// Specific animation for polar charts
+	if (chart.polar) {
+		
+		// Enable animation on polar charts only in SVG. In VML, the scaling is different, plus animation
+		// would be so slow it would't matter.
+		if (chart.renderer.isSVG) {
+
+			if (animation === true) {
+				animation = {};
+			}
+	
+			// Initialize the animation
+			if (init) {
+				
+				// Scale down the group and place it in the center
+				attribs = {
+					translateX: center[0] + plotLeft,
+					translateY: center[1] + plotTop,
+					scaleX: 0.001, // #1499
+					scaleY: 0.001
+				};
+					
+				group.attr(attribs);
+				if (markerGroup) {
+					markerGroup.attrSetters = group.attrSetters;
+					markerGroup.attr(attribs);
+				}
+				
+			// Run the animation
+			} else {
+				attribs = {
+					translateX: plotLeft,
+					translateY: plotTop,
+					scaleX: 1,
+					scaleY: 1
+				};
+				group.animate(attribs, animation);
+				if (markerGroup) {
+					markerGroup.animate(attribs, animation);
+				}
+				
+				// Delete this function to allow it only once
+				this.animate = null;
+			}
+		}
+	
+	// For non-polar charts, revert to the basic animation
+	} else {
+		proceed.call(this, init);
+	} 
+}
+
+// Define the animate method for both regular series and column series and their derivatives
+wrap(seriesProto, 'animate', polarAnimate);
+wrap(colProto, 'animate', polarAnimate);
+
+
+/**
+ * Throw in a couple of properties to let setTooltipPoints know we're indexing the points
+ * in degrees (0-360), not plot pixel width.
+ */
+wrap(seriesProto, 'setTooltipPoints', function (proceed, renew) {
+		
+	if (this.chart.polar) {
+		extend(this.xAxis, {
+			tooltipLen: 360 // degrees are the resolution unit of the tooltipPoints array
+		});	
+	}
+	
+	// Run uber method
+	return proceed.call(this, renew);
+});
+
+
+/**
+ * Extend the column prototype's translate method
+ */
+wrap(colProto, 'translate', function (proceed) {
+		
+	var xAxis = this.xAxis,
+		len = this.yAxis.len,
+		center = xAxis.center,
+		startAngleRad = xAxis.startAngleRad,
+		renderer = this.chart.renderer,
+		start,
+		points,
+		point,
+		i;
+	
+	this.preventPostTranslate = true;
+	
+	// Run uber method
+	proceed.call(this);
+	
+	// Postprocess plot coordinates
+	if (xAxis.isRadial) {
+		points = this.points;
+		i = points.length;
+		while (i--) {
+			point = points[i];
+			start = point.barX + startAngleRad;
+			point.shapeType = 'path';
+			point.shapeArgs = {
+				d: renderer.symbols.arc(
+					center[0],
+					center[1],
+					len - point.plotY,
+					null, 
+					{
+						start: start,
+						end: start + point.pointWidth,
+						innerR: len - pick(point.yBottom, len)
+					}
+				)
+			};
+			this.toXY(point); // provide correct plotX, plotY for tooltip
+		}
+	}
+});
+
+
+/**
+ * Align column data labels outside the columns. #1199.
+ */
+wrap(colProto, 'alignDataLabel', function (proceed, point, dataLabel, options, alignTo, isNew) {
+	
+	if (this.chart.polar) {
+		var angle = point.rectPlotX / Math.PI * 180,
+			align,
+			verticalAlign;
+		
+		// Align nicely outside the perimeter of the columns
+		if (options.align === null) {
+			if (angle > 20 && angle < 160) {
+				align = 'left'; // right hemisphere
+			} else if (angle > 200 && angle < 340) {
+				align = 'right'; // left hemisphere
+			} else {
+				align = 'center'; // top or bottom
+			}
+			options.align = align;
+		}
+		if (options.verticalAlign === null) {
+			if (angle < 45 || angle > 315) {
+				verticalAlign = 'bottom'; // top part
+			} else if (angle > 135 && angle < 225) {
+				verticalAlign = 'top'; // bottom part
+			} else {
+				verticalAlign = 'middle'; // left or right
+			}
+			options.verticalAlign = verticalAlign;
+		}
+		
+		seriesProto.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);
+	} else {
+		proceed.call(this, point, dataLabel, options, alignTo, isNew);
+	}
+	
+});
+
+/**
+ * Extend the mouse tracker to return the tooltip position index in terms of
+ * degrees rather than pixels
+ */
+wrap(pointerProto, 'getIndex', function (proceed, e) {
+	var ret,
+		chart = this.chart,
+		center,
+		x,
+		y;
+	
+	if (chart.polar) {
+		center = chart.xAxis[0].center;
+		x = e.chartX - center[0] - chart.plotLeft;
+		y = e.chartY - center[1] - chart.plotTop;
+		
+		ret = 180 - Math.round(Math.atan2(x, y) / Math.PI * 180);
+	
+	} else {
+	
+		// Run uber method
+		ret = proceed.call(this, e);
+	}
+	return ret;
+});
+
+/**
+ * Extend getCoordinates to prepare for polar axis values
+ */
+wrap(pointerProto, 'getCoordinates', function (proceed, e) {
+	var chart = this.chart,
+		ret = {
+			xAxis: [],
+			yAxis: []
+		};
+	
+	if (chart.polar) {	
+
+		each(chart.axes, function (axis) {
+			var isXAxis = axis.isXAxis,
+				center = axis.center,
+				x = e.chartX - center[0] - chart.plotLeft,
+				y = e.chartY - center[1] - chart.plotTop;
+			
+			ret[isXAxis ? 'xAxis' : 'yAxis'].push({
+				axis: axis,
+				value: axis.translate(
+					isXAxis ?
+						Math.PI - Math.atan2(x, y) : // angle 
+						Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)), // distance from center
+					true
+				)
+			});
+		});
+		
+	} else {
+		ret = proceed.call(this, e);
+	}
+	
+	return ret;
+});
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts.js
new file mode 100644
index 0000000..f8edd5f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts.js
@@ -0,0 +1,283 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+
+ (c) 2009-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(){function r(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function x(){var a,b=arguments.length,c={},d=function(a,b){var c,h;typeof a!=="object"&&(a={});for(h in b)b.hasOwnProperty(h)&&(c=b[h],a[h]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&typeof c.nodeType!=="number"?d(a[h]||{},c):b[h]);return a};for(a=0;a<b;a++)c=d(c,arguments[a]);return c}function C(a,b){return parseInt(a,b||10)}function ea(a){return typeof a==="string"}function T(a){return typeof a===
+"object"}function Ia(a){return Object.prototype.toString.call(a)==="[object Array]"}function sa(a){return typeof a==="number"}function na(a){return R.log(a)/R.LN10}function fa(a){return R.pow(10,a)}function ga(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function u(a){return a!==w&&a!==null}function v(a,b,c){var d,e;if(ea(b))u(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(u(b)&&T(b))for(d in b)a.setAttribute(d,b[d]);return e}function ja(a){return Ia(a)?
+a:[a]}function o(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],typeof c!=="undefined"&&c!==null)return c}function K(a,b){if(ta&&b&&b.opacity!==w)b.filter="alpha(opacity="+b.opacity*100+")";r(a.style,b)}function U(a,b,c,d,e){a=y.createElement(a);b&&r(a,b);e&&K(a,{padding:0,border:S,margin:0});c&&K(a,c);d&&d.appendChild(a);return a}function ha(a,b){var c=function(){};c.prototype=new a;r(c.prototype,b);return c}function Aa(a,b,c,d){var e=M.lang,a=+a||0,f=b===-1?(a.toString().split(".")[1]||
+"").length:isNaN(b=N(b))?2:b,b=c===void 0?e.decimalPoint:c,d=d===void 0?e.thousandsSep:d,e=a<0?"-":"",c=String(C(a=N(a).toFixed(f))),g=c.length>3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+N(a-c).toFixed(f).slice(2):"")}function Ba(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function mb(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this,a)}}function Ca(a,b){for(var c="{",d=!1,
+e,f,g,h,i,j=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h<i;h++)e=e[g[h]];if(f.length)f=f.join(":"),g=/\.([0-9])/,h=M.lang,i=void 0,/f$/.test(f)?(i=(i=f.match(g))?i[1]:-1,e=Aa(e,i,h.decimalPoint,f.indexOf(",")>-1?h.thousandsSep:"")):e=Xa(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function nb(a){return R.pow(10,P(R.log(a)/R.LN10))}function ob(a,b,c,d){var e,c=o(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals===
+!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(a=b[d],e<=(b[d]+(b[d+1]||b[d]))/2)break;a*=c;return a}function Cb(a,b){var c=b||[[Db,[1,2,5,10,20,25,50,100,200,500]],[pb,[1,2,5,10,15,30]],[Ya,[1,2,5,10,15,30]],[Qa,[1,2,3,4,6,8,12]],[ua,[1,2]],[Za,[1,2]],[Ra,[1,2,3,4,6]],[Da,null]],d=c[c.length-1],e=D[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=D[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+D[c[g+1][0]])/2)break;e===D[Da]&&a<5*e&&(f=[1,2,5]);c=ob(a/e,f,d[0]===Da?nb(a/e):1);
+return{unitRange:e,count:c,unitName:d[0]}}function Eb(a,b,c,d){var e=[],f={},g=M.global.useUTC,h,i=new Date(b),j=a.unitRange,k=a.count;if(u(b)){j>=D[pb]&&(i.setMilliseconds(0),i.setSeconds(j>=D[Ya]?0:k*P(i.getSeconds()/k)));if(j>=D[Ya])i[Fb](j>=D[Qa]?0:k*P(i[qb]()/k));if(j>=D[Qa])i[Gb](j>=D[ua]?0:k*P(i[rb]()/k));if(j>=D[ua])i[sb](j>=D[Ra]?1:k*P(i[Sa]()/k));j>=D[Ra]&&(i[Hb](j>=D[Da]?0:k*P(i[$a]()/k)),h=i[ab]());j>=D[Da]&&(h-=h%k,i[Ib](h));if(j===D[Za])i[sb](i[Sa]()-i[tb]()+o(d,1));b=1;h=i[ab]();for(var d=
+i.getTime(),l=i[$a](),m=i[Sa](),p=g?0:(864E5+i.getTimezoneOffset()*6E4)%864E5;d<c;)e.push(d),j===D[Da]?d=bb(h+b*k,0):j===D[Ra]?d=bb(h,l+b*k):!g&&(j===D[ua]||j===D[Za])?d=bb(h,l,m+b*k*(j===D[ua]?1:7)):d+=j*k,b++;e.push(d);n(ub(e,function(a){return j<=D[Qa]&&a%D[ua]===p}),function(a){f[a]=ua})}e.info=r(a,{higherRanks:f,totalRange:j*k});return e}function Jb(){this.symbol=this.color=0}function Kb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].ss_i=e;a.sort(function(a,c){d=b(a,c);return d===0?a.ss_i-c.ss_i:
+d});for(e=0;e<c;e++)delete a[e].ss_i}function Ja(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function va(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);return c}function Ka(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Ta(a){cb||(cb=U(Ea));a&&cb.appendChild(a);cb.innerHTML=""}function ka(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;else O.console&&console.log(c)}function ia(a){return parseFloat(a.toPrecision(14))}
+function La(a,b){Fa=o(a,b.animation)}function Lb(){var a=M.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";bb=a?Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,o(c,1),o(g,0),o(h,0),o(i,0))).getTime()};qb=b+"Minutes";rb=b+"Hours";tb=b+"Day";Sa=b+"Date";$a=b+"Month";ab=b+"FullYear";Fb=c+"Minutes";Gb=c+"Hours";sb=c+"Date";Hb=c+"Month";Ib=c+"FullYear"}function wa(){}function Ma(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function vb(a,b){this.axis=a;if(b)this.options=
+b,this.id=b.id}function Mb(a,b,c,d,e,f){var g=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=null;this.points={};this.stack=e;this.percent=f==="percent";this.alignOptions={align:b.align||(g?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(g?"middle":c?"bottom":"top"),y:o(b.y,g?4:c?14:-6),x:o(b.x,g?c?-6:6:0)};this.textAlign=b.textAlign||(g?c?"right":"left":"center")}function db(){this.init.apply(this,arguments)}function wb(){this.init.apply(this,arguments)}
+function xb(a,b){this.init(a,b)}function eb(a,b){this.init(a,b)}function yb(){this.init.apply(this,arguments)}var w,y=document,O=window,R=Math,t=R.round,P=R.floor,xa=R.ceil,s=R.max,I=R.min,N=R.abs,V=R.cos,ca=R.sin,ya=R.PI,Ua=ya*2/360,oa=navigator.userAgent,Nb=O.opera,ta=/msie/i.test(oa)&&!Nb,fb=y.documentMode===8,gb=/AppleWebKit/.test(oa),hb=/Firefox/.test(oa),Ob=/(Mobile|Android|Windows Phone)/.test(oa),za="http://www.w3.org/2000/svg",Z=!!y.createElementNS&&!!y.createElementNS(za,"svg").createSVGRect,
+Ub=hb&&parseInt(oa.split("Firefox/")[1],10)<4,$=!Z&&!ta&&!!y.createElement("canvas").getContext,Va,ib=y.documentElement.ontouchstart!==w,Pb={},zb=0,cb,M,Xa,Fa,Ab,D,pa=function(){},Ga=[],Ea="div",S="none",Qb="rgba(192,192,192,"+(Z?1.0E-4:0.002)+")",Db="millisecond",pb="second",Ya="minute",Qa="hour",ua="day",Za="week",Ra="month",Da="year",Rb="stroke-width",bb,qb,rb,tb,Sa,$a,ab,Fb,Gb,sb,Hb,Ib,W={};O.Highcharts=O.Highcharts?ka(16,!0):{};Xa=function(a,b,c){if(!u(b)||isNaN(b))return"Invalid date";var a=
+o(a,"%Y-%m-%d %H:%M:%S"),d=new Date(b),e,f=d[rb](),g=d[tb](),h=d[Sa](),i=d[$a](),j=d[ab](),k=M.lang,l=k.weekdays,d=r({a:l[g].substr(0,3),A:l[g],d:Ba(h),e:h,b:k.shortMonths[i],B:k.months[i],m:Ba(i+1),y:j.toString().substr(2,2),Y:j,H:Ba(f),I:Ba(f%12||12),l:f%12||12,M:Ba(d[qb]()),p:f<12?"AM":"PM",P:f<12?"am":"pm",S:Ba(d.getSeconds()),L:Ba(t(b%1E3),3)},Highcharts.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+
+a.substr(1):a};Jb.prototype={wrapColor:function(a){if(this.color>=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};D=function(){for(var a=0,b=arguments,c=b.length,d={};a<c;a++)d[b[a++]]=b[a];return d}(Db,1,pb,1E3,Ya,6E4,Qa,36E5,ua,864E5,Za,6048E5,Ra,26784E5,Da,31556952E3);Ab={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&
+(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=[].concat(b).splice(b.length-f,f),e&&(d[f-6]=d[f-2],d[f-5]=d[f-1]),b=b.concat(d);h&&(b=b.concat(h),c=c.concat(i));return[b,c]},step:function(a,b,c,d){var e=[],f=a.length;if(c===1)e=d;else if(f===b.length&&c<1)for(;f--;)d=parseFloat(a[f]),e[f]=isNaN(d)?a[f]:c*parseFloat(b[f]-d)+d;else e=b;return e}};
+(function(a){O.HighchartsAdapter=O.HighchartsAdapter||a&&{init:function(b){var c=a.fx,d=c.step,e,f=a.Tween,g=f&&f.propHooks;e=a.cssHooks.opacity;a.extend(a.easing,{easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c}});a.each(["cur","_default","width","height","opacity"],function(a,b){var e=d,k,l;b==="cur"?e=c.prototype:b==="_default"&&f&&(e=g[b],b="set");(k=e[b])&&(e[b]=function(c){c=a?c:this;if(c.prop!=="align")return l=c.elem,l.attr?l.attr(c.prop,b==="cur"?w:c.now):k.apply(this,arguments)})});
+mb(e,"get",function(a,b,c){return b.attr?b.opacity||0:a.call(this,b,c)});e=function(a){var c=a.elem,d;if(!a.started)d=b.init(c,c.d,c.toD),a.start=d[0],a.end=d[1],a.started=!0;c.attr("d",b.step(a.start,a.end,a.pos,c.toD))};f?g.d={set:e}:d.d=e;this.each=Array.prototype.forEach?function(a,b){return Array.prototype.forEach.call(a,b)}:function(a,b){for(var c=0,d=a.length;c<d;c++)if(b.call(a[c],a[c],c,a)===!1)return c};a.fn.highcharts=function(){var a="Chart",b=arguments,c,d;ea(b[0])&&(a=b[0],b=Array.prototype.slice.call(b,
+1));c=b[0];if(c!==w)c.chart=c.chart||{},c.chart.renderTo=this[0],new Highcharts[a](c,b[1]),d=this;c===w&&(d=Ga[v(this[0],"data-highcharts-chart")]);return d}},getScript:a.getScript,inArray:a.inArray,adapterRun:function(b,c){return a(b)[c]()},grep:a.grep,map:function(a,c){for(var d=[],e=0,f=a.length;e<f;e++)d[e]=c.call(a[e],a[e],e,a);return d},offset:function(b){return a(b).offset()},addEvent:function(b,c,d){a(b).bind(c,d)},removeEvent:function(b,c,d){var e=y.removeEventListener?"removeEventListener":
+"detachEvent";y[e]&&b&&!b[e]&&(b[e]=function(){});a(b).unbind(c,d)},fireEvent:function(b,c,d,e){var f=a.Event(c),g="detached"+c,h;!ta&&d&&(delete d.layerX,delete d.layerY);r(f,d);b[c]&&(b[g]=b[c],b[c]=null);a.each(["preventDefault","stopPropagation"],function(a,b){var c=f[b];f[b]=function(){try{c.call(f)}catch(a){b==="preventDefault"&&(h=!0)}}});a(b).trigger(f);b[g]&&(b[c]=b[g],b[g]=null);e&&!f.isDefaultPrevented()&&!h&&e(f)},washMouseEvent:function(a){var c=a.originalEvent||a;if(c.pageX===w)c.pageX=
+a.pageX,c.pageY=a.pageY;return c},animate:function(b,c,d){var e=a(b);if(!b.style)b.style={};if(c.d)b.toD=c.d,c.d=1;e.stop();c.opacity!==w&&b.attr&&(c.opacity+="px");e.animate(c,d)},stop:function(b){a(b).stop()}}})(O.jQuery);var X=O.HighchartsAdapter,G=X||{};X&&X.init.call(X,Ab);var jb=G.adapterRun,Vb=G.getScript,qa=G.inArray,n=G.each,ub=G.grep,Wb=G.offset,Na=G.map,J=G.addEvent,aa=G.removeEvent,z=G.fireEvent,Xb=G.washMouseEvent,Bb=G.animate,Wa=G.stop,G={enabled:!0,x:0,y:15,style:{color:"#666",cursor:"default",
+fontSize:"11px",lineHeight:"14px"}};M={colors:"#2f7ed8,#0d233a,#8bbc21,#910000,#1aadce,#492970,#f28f43,#77a1e5,#c42525,#a6c96a".split(","),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",
+numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:","},global:{useUTC:!0,canvasToolsURL:"http://code.highcharts.com/3.0.6/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/3.0.6/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:5,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],style:{fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif',
+fontSize:"12px"},backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#274b6d",fontSize:"16px"}},subtitle:{text:"",align:"center",style:{color:"#4d759e"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,marker:{enabled:!0,lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0},select:{fillColor:"#FFFFFF",
+lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:x(G,{align:"center",enabled:!1,formatter:function(){return this.y===null?"":Aa(this.y,-1)},verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,showInLegend:!0,states:{hover:{marker:{}},select:{marker:{}}},stickyTracking:!0}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderWidth:1,borderColor:"#909090",borderRadius:5,navigation:{activeColor:"#274b6d",
+inactiveColor:"#CCC"},shadow:!1,itemStyle:{cursor:"pointer",color:"#274b6d",fontSize:"12px"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolWidth:16,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"1em"},style:{position:"absolute",backgroundColor:"white",opacity:0.5,textAlign:"center"}},tooltip:{enabled:!0,animation:Z,
+backgroundColor:"rgba(255, 255, 255, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',shadow:!0,snap:Ob?25:10,style:{color:"#333333",cursor:"default",
+fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",fontSize:"9px"}}};var Y=M.plotOptions,X=Y.line;Lb();var ra=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Na(a.stops,function(a){return ra(a[1])}):(c=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(a))?b=[C(c[1]),C(c[2]),
+C(c[3]),parseFloat(c[4],10)]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))?b=[C(c[1],16),C(c[2],16),C(c[3],16),1]:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(a))&&(b=[C(c[1]),C(c[2]),C(c[3]),1])})(a);return{get:function(c){var f;d?(f=x(a),f.stops=[].concat(f.stops),n(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)n(d,
+function(b){b.brighten(a)});else if(sa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=C(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this}}};wa.prototype={init:function(a,b){this.element=b==="span"?U(b):y.createElementNS(za,b);this.renderer=a;this.attrSetters={}},opacity:1,animate:function(a,b,c){b=o(b,Fa,!0);Wa(this);if(b){b=x(b);if(c)b.complete=c;Bb(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName.toLowerCase(),
+i=this.renderer,j,k=this.attrSetters,l=this.shadows,m,p,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,h==="circle"?c={x:"cx",y:"cy"}[c]||c:c==="strokeWidth"&&(c="stroke-width"),q=v(g,c)||this[c]||0,c!=="d"&&c!=="visibility"&&c!=="fill"&&(q=parseFloat(q));else{for(c in a)if(j=!1,d=a[c],e=k[c]&&k[c].call(this,d,c),e!==!1){e!==w&&(d=e);if(c==="d")d&&d.join&&(d=d.join(" ")),/(NaN| {2}|^$)/.test(d)&&(d="M 0 0");else if(c==="x"&&h==="text")for(e=0;e<g.childNodes.length;e++)f=g.childNodes[e],v(f,"x")===
+v(g,"x")&&v(f,"x",d);else if(this.rotation&&(c==="x"||c==="y"))p=!0;else if(c==="fill")d=i.color(d,g,c);else if(h==="circle"&&(c==="x"||c==="y"))c={x:"cx",y:"cy"}[c]||c;else if(h==="rect"&&c==="r")v(g,{rx:d,ry:d}),j=!0;else if(c==="translateX"||c==="translateY"||c==="rotation"||c==="verticalAlign"||c==="scaleX"||c==="scaleY")j=p=!0;else if(c==="stroke")d=i.color(d,g,c);else if(c==="dashstyle")if(c="stroke-dasharray",d=d&&d.toLowerCase(),d==="solid")d=S;else{if(d){d=d.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot",
+"3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(e=d.length;e--;)d[e]=C(d[e])*o(a["stroke-width"],this["stroke-width"]);d=d.join(",")}}else if(c==="width")d=C(d);else if(c==="align")c="text-anchor",d={left:"start",center:"middle",right:"end"}[d];else if(c==="title")e=g.getElementsByTagName("title")[0],e||(e=y.createElementNS(za,"title"),g.appendChild(e)),e.textContent=d;c==="strokeWidth"&&
+(c="stroke-width");if(c==="stroke-width"||c==="stroke"){this[c]=d;if(this.stroke&&this["stroke-width"])v(g,"stroke",this.stroke),v(g,"stroke-width",this["stroke-width"]),this.hasStroke=!0;else if(c==="stroke-width"&&d===0&&this.hasStroke)g.removeAttribute("stroke"),this.hasStroke=!1;j=!0}this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c)&&(m||(this.symbolAttr(a),m=!0),j=!0);if(l&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(c))for(e=l.length;e--;)v(l[e],
+c,c==="height"?s(d-(l[e].cutHeight||0),0):d);if((c==="width"||c==="height")&&h==="rect"&&d<0)d=0;this[c]=d;c==="text"?(d!==this.textStr&&delete this.bBox,this.textStr=d,this.added&&i.buildText(this)):j||v(g,c,d)}p&&this.updateTransform()}return q},addClass:function(a){var b=this.element,c=v(b,"class")||"";c.indexOf(a)===-1&&v(b,"class",c+" "+a);return this},symbolAttr:function(a){var b=this;n("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(c){b[c]=o(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x,
+b.y,b.width,b.height,b)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":S)},crisp:function(a,b,c,d,e){var f,g={},h={},i,a=a||this.strokeWidth||this.attr&&this.attr("stroke-width")||0;i=t(a)%2/2;h.x=P(b||this.x||0)+i;h.y=P(c||this.y||0)+i;h.width=P((d||this.width||0)-2*i);h.height=P((e||this.height||0)-2*i);h.strokeWidth=a;for(f in h)this[f]!==h[f]&&(this[f]=g[f]=h[f]);return g},css:function(a){var b=this.element,c=a&&a.width&&b.nodeName.toLowerCase()==="text",
+d,e="",f=function(a,b){return"-"+b.toLowerCase()};if(a&&a.color)a.fill=a.color;this.styles=a=r(this.styles,a);$&&c&&delete a.width;if(ta&&!Z)c&&delete a.width,K(this.element,a);else{for(d in a)e+=d.replace(/([A-Z])/g,f)+":"+a[d]+";";v(b,"style",e)}c&&this.added&&this.renderer.buildText(this);return this},on:function(a,b){var c=this,d=c.element;ib&&a==="click"?(d.ontouchstart=function(a){c.touchEventFired=Date.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(oa.indexOf("Android")===-1||
+Date.now()-(c.touchEventFired||0)>1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){this.element.radialReference=a;return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},htmlCss:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();this.styles=r(this.styles,a);K(this.element,a);return this},htmlGetBBox:function(){var a=
+this.element,b=this.bBox;if(!b){if(a.nodeName==="text")a.style.position="absolute";b=this.bBox={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}return b},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=g&&g!=="left",j=this.shadows;K(b,{marginLeft:c,marginTop:d});j&&n(j,function(a){K(a,{marginLeft:c+1,marginTop:d+1})});
+this.inverted&&n(b.childNodes,function(c){a.invertChild(c,b)});if(b.tagName==="SPAN"){var k,l,j=this.rotation,m;k=0;var p=1,q=0,ba;m=C(this.textWidth);var A=this.xCorr||0,L=this.yCorr||0,Sb=[j,g,b.innerHTML,this.textWidth].join(",");if(Sb!==this.cTT){u(j)&&(k=j*Ua,p=V(k),q=ca(k),this.setSpanRotation(j,q,p));k=o(this.elemWidth,b.offsetWidth);l=o(this.elemHeight,b.offsetHeight);if(k>m&&/[ \-]/.test(b.textContent||b.innerText))K(b,{width:m+"px",display:"block",whiteSpace:"normal"}),k=m;m=a.fontMetrics(b.style.fontSize).b;
+A=p<0&&-k;L=q<0&&-l;ba=p*q<0;A+=q*m*(ba?1-h:h);L-=p*m*(j?ba?h:1-h:1);i&&(A-=k*h*(p<0?-1:1),j&&(L-=l*h*(q<0?-1:1)),K(b,{textAlign:g}));this.xCorr=A;this.yCorr=L}K(b,{left:e+A+"px",top:f+L+"px"});if(gb)l=b.offsetHeight;this.cTT=Sb}}else this.alignOnAdd=!0},setSpanRotation:function(a){var b={};b[ta?"-ms-transform":gb?"-webkit-transform":hb?"MozTransform":Nb?"-o-transform":""]=b.transform="rotate("+a+"deg)";K(this.element,b)},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=
+this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(this.x||0)+" "+(this.y||0)+")");(u(c)||u(d))&&a.push("scale("+o(c,1)+" "+o(d,1)+")");a.length&&v(this.element,"transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions=
+a,this.alignByTranslate=b,!c||ea(c))this.alignTo=d=c||"renderer",ga(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=o(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=t(f);if(e==="bottom"||e==="middle")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=t(g);this[this.placed?"animate":"attr"](h);this.placed=
+!0;this.alignAttr=h;return this},getBBox:function(){var a=this.bBox,b=this.renderer,c,d=this.rotation;c=this.element;var e=this.styles,f=d*Ua;if(!a){if(c.namespaceURI===za||b.forExport){try{a=c.getBBox?r({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(g){}if(!a||a.width<0)a={width:0,height:0}}else a=this.htmlGetBBox();if(b.isSVG){b=a.width;c=a.height;if(ta&&e&&e.fontSize==="11px"&&c.toPrecision(3)==="22.7")a.height=c=14;if(d)a.width=N(c*ca(f))+N(b*V(f)),a.height=N(c*V(f))+N(b*ca(f))}this.bBox=
+a}return a},show:function(){return this.attr({visibility:"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.hide()}})},add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=d.childNodes,f=this.element,g=v(f,"zIndex"),h;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(g)c.handleZ=!0,g=C(g);if(c.handleZ)for(c=0;c<e.length;c++)if(a=
+e[c],b=v(a,"zIndex"),a!==f&&(C(b)>g||!u(g)&&u(b))){d.insertBefore(f,a);h=!0;break}h||d.appendChild(f);this.added=!0;z(this,"add");return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&b.parentNode,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;Wa(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f<a.stops.length;f++)a.stops[f]=a.stops[f].destroy();
+a.stops=null}a.safeRemoveChild(b);for(c&&n(c,function(b){a.safeRemoveChild(b)});d&&d.childNodes.length===0;)b=d.parentNode,a.safeRemoveChild(d),d=b;a.alignTo&&ga(a.renderer.alignedObjects,a);for(e in a)delete a[e];return null},shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,j,k;if(a){i=o(a.width,3);j=(a.opacity||0.15)/i;k=this.parentInverted?"(-1,-1)":"("+o(a.offsetX,1)+", "+o(a.offsetY,1)+")";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;v(f,{isShadow:"true",stroke:a.color||"black","stroke-opacity":j*
+e,"stroke-width":h,transform:"translate"+k,fill:S});if(c)v(f,"height",s(v(f,"height")-h,0)),f.cutHeight=h;b?b.element.appendChild(f):g.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this}};var Ha=function(){this.init.apply(this,arguments)};Ha.prototype={Element:wa,init:function(a,b,c,d){var e=location,f,g;f=this.createElement("svg").attr({version:"1.1"});g=f.element;a.appendChild(g);a.innerHTML.indexOf("xmlns")===-1&&v(g,"xmlns",za);this.isSVG=!0;this.box=g;this.boxWrapper=f;this.alignedObjects=
+[];this.url=(hb||gb)&&y.getElementsByTagName("base").length?e.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(y.createTextNode("Created with Highcharts 3.0.6"));this.defs=this.createElement("defs").add();this.forExport=d;this.gradients={};this.setSize(b,c,!1);var h;if(hb&&a.getBoundingClientRect)this.subPixelFix=b=function(){K(a,{left:0,top:0});h=a.getBoundingClientRect();K(a,{left:xa(h.left)-h.left+"px",top:xa(h.top)-
+h.top+"px"})},b(),J(O,"resize",b)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Ka(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&aa(O,"resize",this.subPixelFix);return this.alignedObjects=null},createElement:function(a){var b=new this.Element;b.init(this,a);return b},draw:function(){},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=o(a.textStr,
+"").toString().replace(/<(b|strong)>/g,'<span style="font-weight:bold">').replace(/<(i|em)>/g,'<span style="font-style:italic">').replace(/<a/g,"<span").replace(/<\/(b|strong|i|em|a)>/g,"</span>").split(/<br.*?>/g),f=b.childNodes,g=/style="([^"]+)"/,h=/href="(http[^"]+)"/,i=v(b,"x"),j=a.styles,k=j&&j.width&&C(j.width),l=j&&j.lineHeight,m=f.length;m--;)b.removeChild(f[m]);k&&!a.added&&this.box.appendChild(b);e[e.length-1]===""&&e.pop();n(e,function(e,f){var m,o=0,e=e.replace(/<span/g,"|||<span").replace(/<\/span>/g,
+"</span>|||");m=e.split("|||");n(m,function(e){if(e!==""||m.length===1){var p={},n=y.createElementNS(za,"tspan"),s;g.test(e)&&(s=e.match(g)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),v(n,"style",s));h.test(e)&&!d&&(v(n,"onclick",'location.href="'+e.match(h)[1]+'"'),K(n,{cursor:"pointer"}));e=(e.replace(/<(.|\n)*?>/g,"")||" ").replace(/&lt;/g,"<").replace(/&gt;/g,">");if(e!==" "&&(n.appendChild(y.createTextNode(e)),o?p.dx=0:p.x=i,v(n,p),!o&&f&&(!Z&&d&&K(n,{display:"block"}),v(n,"dy",l||c.fontMetrics(/px$/.test(n.style.fontSize)?
+n.style.fontSize:j.fontSize).h,gb&&n.offsetHeight)),b.appendChild(n),o++,k))for(var e=e.replace(/([^\^])-/g,"$1- ").split(" "),u,t,p=a._clipHeight,E=[],w=C(l||16),B=1;e.length||E.length;)delete a.bBox,u=a.getBBox(),t=u.width,u=t>k,!u||e.length===1?(e=E,E=[],e.length&&(B++,p&&B*w>p?(e=["..."],a.attr("title",a.textStr)):(n=y.createElementNS(za,"tspan"),v(n,{dy:w,x:i}),s&&v(n,"style",s),b.appendChild(n),t>k&&(k=t)))):(n.removeChild(n.firstChild),E.unshift(e.pop())),e.length&&n.appendChild(y.createTextNode(e.join(" ").replace(/- /g,
+"-")))}})})},button:function(a,b,c,d,e,f,g,h){var i=this.label(a,b,c,null,null,null,null,null,"button"),j=0,k,l,m,p,q,n,a={x1:0,y1:0,x2:0,y2:1},e=x({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);m=e.style;delete e.style;f=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);p=f.style;delete f.style;g=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);q=g.style;
+delete g.style;h=x(e,{style:{color:"#CCC"}},h);n=h.style;delete h.style;J(i.element,ta?"mouseover":"mouseenter",function(){j!==3&&i.attr(f).css(p)});J(i.element,ta?"mouseout":"mouseleave",function(){j!==3&&(k=[e,f,g][j],l=[m,p,q][j],i.attr(k).css(l))});i.setState=function(a){(i.state=j=a)?a===2?i.attr(g).css(q):a===3&&i.attr(h).css(n):i.attr(e).css(m)};return i.on("click",function(){j!==3&&d.call(i)}).attr(e).css(r({cursor:"default"},m))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=t(a[1])-b%
+2/2);a[2]===a[5]&&(a[2]=a[5]=t(a[2])+b%2/2);return a},path:function(a){var b={fill:S};Ia(a)?b.d=a:T(a)&&r(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=T(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(T(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a,b,c,d,e,f){e=T(a)?a.r:e;e=this.createElement("rect").attr({rx:e,ry:e,
+fill:S});return e.attr(T(a)?a:e.crisp(f,a,b,s(c,0),s(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[o(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return u(a)?b.attr({"class":"highcharts-"+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:S};arguments.length>1&&r(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink",
+"href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(t(b),t(c),d,e,f),i=/^url\((.*?)\)$/,j,k;if(h)g=this.path(h),r(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&r(g,f);else if(i.test(a))k=function(a,b){a.element&&(a.attr({width:b[0],height:b[1]}),a.alignByTranslate||a.translate(t((d-b[0])/2),t((e-b[1])/2)))},j=a.match(i)[1],a=Pb[j],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),U("img",{onload:function(){k(g,
+Pb[j]=[this.width,this.height])},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,
+e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=V(f),j=ca(f),k=V(g),g=ca(g),e=e.end-f<ya?0:1;return["M",a+c*i,b+c*j,"A",c,c,0,e,1,a+c*k,b+c*g,h?"M":"L",a+d*k,b+d*g,"A",d,d,0,e,0,a+d*i,b+d*j,h?"":"Z"]}},clipRect:function(a,b,c,d){var e="highcharts-"+zb++,f=this.createElement("clipPath").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;return a},color:function(a,b,c){var d=this,e,f=/^rgba/,g,h,i,j,k,l,m,p=[];a&&a.linearGradient?g="linearGradient":a&&a.radialGradient&&
+(g="radialGradient");if(g){c=a[g];h=d.gradients;j=a.stops;b=b.radialReference;Ia(c)&&(a[g]=c={x1:c[0],y1:c[1],x2:c[2],y2:c[3],gradientUnits:"userSpaceOnUse"});g==="radialGradient"&&b&&!u(c.gradientUnits)&&(c=x(c,{cx:b[0]-b[2]/2+c.cx*b[2],cy:b[1]-b[2]/2+c.cy*b[2],r:c.r*b[2],gradientUnits:"userSpaceOnUse"}));for(m in c)m!=="id"&&p.push(m,c[m]);for(m in j)p.push(j[m]);p=p.join(",");h[p]?a=h[p].id:(c.id=a="highcharts-"+zb++,h[p]=i=d.createElement(g).attr(c).add(d.defs),i.stops=[],n(j,function(a){f.test(a[1])?
+(e=ra(a[1]),k=e.get("rgb"),l=e.get("a")):(k=a[1],l=1);a=d.createElement("stop").attr({offset:a[0],"stop-color":k,"stop-opacity":l}).add(i);i.stops.push(a)}));return"url("+d.url+"#"+a+")"}else return f.test(a)?(e=ra(a),v(b,c+"-opacity",e.get("a")),e.get("rgb")):(b.removeAttribute(c+"-opacity"),a)},text:function(a,b,c,d){var e=M.chart.style,f=$||!Z&&this.forExport;if(d&&!this.forExport)return this.html(a,b,c);b=t(o(b,0));c=t(o(c,0));a=this.createElement("text").attr({x:b,y:c,text:a}).css({fontFamily:e.fontFamily,
+fontSize:e.fontSize});f&&a.css({position:"absolute"});a.x=b;a.y=c;return a},html:function(a,b,c){var d=M.chart.style,e=this.createElement("span"),f=e.attrSetters,g=e.element,h=e.renderer;f.text=function(a){a!==g.innerHTML&&delete this.bBox;g.innerHTML=a;return!1};f.x=f.y=f.align=function(a,b){b==="align"&&(b="textAlign");e[b]=a;e.htmlUpdateTransform();return!1};e.attr({text:a,x:t(b),y:t(c)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:d.fontFamily,fontSize:d.fontSize});e.css=e.htmlCss;
+if(h.isSVG)e.add=function(a){var b,c=h.box.parentNode,d=[];if(a){if(b=a.div,!b){for(;a;)d.push(a),a=a.parentGroup;n(d.reverse(),function(a){var d;b=a.div=a.div||U(Ea,{className:v(a.element,"class")},{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;r(a.attrSetters,{translateX:function(a){d.left=a+"px"},translateY:function(a){d.top=a+"px"},visibility:function(a,b){d[b]=a}})})}}else b=c;b.appendChild(g);e.added=!0;e.alignOnAdd&&e.htmlUpdateTransform();return e};
+return e},fontMetrics:function(a){var a=C(a||11),a=a<24?a+4:t(a*1.2),b=t(a*0.8);return{h:a,b:b}},label:function(a,b,c,d,e,f,g,h,i){function j(){var a,b;a=o.element.style;L=(Oa===void 0||la===void 0||q.styles.textAlign)&&o.getBBox();q.width=(Oa||L.width||0)+2*da+kb;q.height=(la||L.height||0)+2*da;v=da+p.fontMetrics(a&&a.fontSize).b;if(C){if(!A)a=t(-s*da),b=h?-v:0,q.box=A=d?p.symbol(d,a,b,q.width,q.height):p.rect(a,b,q.width,q.height,0,lb[Rb]),A.add(q);A.isImg||A.attr(x({width:q.width,height:q.height},
+lb));lb=null}}function k(){var a=q.styles,a=a&&a.textAlign,b=kb+da*(1-s),c;c=h?0:v;if(u(Oa)&&(a==="center"||a==="right"))b+={center:0.5,right:1}[a]*(Oa-L.width);(b!==o.x||c!==o.y)&&o.attr({x:b,y:c});o.x=b;o.y=c}function l(a,b){A?A.attr(a,b):lb[a]=b}function m(){o.add(q);q.attr({text:a,x:b,y:c});A&&u(e)&&q.attr({anchorX:e,anchorY:f})}var p=this,q=p.g(i),o=p.text("",0,0,g).attr({zIndex:1}),A,L,s=0,da=3,kb=0,Oa,la,E,H,B=0,lb={},v,g=q.attrSetters,C;J(q,"add",m);g.width=function(a){Oa=a;return!1};g.height=
+function(a){la=a;return!1};g.padding=function(a){u(a)&&a!==da&&(da=a,k());return!1};g.paddingLeft=function(a){u(a)&&a!==kb&&(kb=a,k());return!1};g.align=function(a){s={left:0,center:0.5,right:1}[a];return!1};g.text=function(a,b){o.attr(b,a);j();k();return!1};g[Rb]=function(a,b){C=!0;B=a%2/2;l(b,a);return!1};g.stroke=g.fill=g.r=function(a,b){b==="fill"&&(C=!0);l(b,a);return!1};g.anchorX=function(a,b){e=a;l(b,a+B-E);return!1};g.anchorY=function(a,b){f=a;l(b,a-H);return!1};g.x=function(a){q.x=a;a-=s*
+((Oa||L.width)+da);E=t(a);q.attr("translateX",E);return!1};g.y=function(a){H=q.y=t(a);q.attr("translateY",H);return!1};var y=q.css;return r(q,{css:function(a){if(a){var b={},a=x(a);n("fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration,textShadow".split(","),function(c){a[c]!==w&&(b[c]=a[c],delete a[c])});o.css(b)}return y.call(q,a)},getBBox:function(){return{width:L.width+2*da,height:L.height+2*da,x:L.x-da,y:L.y-da}},shadow:function(a){A&&A.shadow(a);return q},destroy:function(){aa(q,
+"add",m);aa(q.element,"mouseenter");aa(q.element,"mouseleave");o&&(o=o.destroy());A&&(A=A.destroy());wa.prototype.destroy.call(q);q=p=j=k=l=m=null}})}};Va=Ha;var F;if(!Z&&!$){Highcharts.VMLElement=F={init:function(a,b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ","absolute",";"],e=b===Ea;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=
+U(c);this.renderer=a;this.attrSetters={}},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();z(this,"add");return this},updateTransform:wa.prototype.htmlUpdateTransform,setSpanRotation:function(a,b,c){K(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",c,", M12=",-b,", M21=",b,", M22=",c,", sizingMethod='auto expand')"].join(""):
+S})},pathToVML:function(a){for(var b=a.length,c=[],d;b--;)if(sa(a[b]))c[b]=t(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))d=a[b]==="wa"?1:-1,c[b+5]===c[b+7]&&(c[b+7]-=d),c[b+6]===c[b+8]&&(c[b+8]-=d);return c.join(" ")||"x"},attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,i=this.renderer,j=this.symbolName,k,l=this.shadows,m,p=this.attrSetters,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,q=c==="strokeWidth"||c==="stroke-width"?
+this.strokeweight:this[c];else for(c in a)if(d=a[c],m=!1,e=p[c]&&p[c].call(this,d,c),e!==!1&&d!==null){e!==w&&(d=e);if(j&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c))k||(this.symbolAttr(a),k=!0),m=!0;else if(c==="d"){d=d||[];this.d=d.join(" ");f.path=d=this.pathToVML(d);if(l)for(e=l.length;e--;)l[e].path=l[e].cutOff?this.cutOffPath(d,l[e].cutOff):d;m=!0}else if(c==="visibility"){if(l)for(e=l.length;e--;)l[e].style[c]=d;h==="DIV"&&(d=d==="hidden"?"-999em":0,fb||(g[c]=d?"visible":
+"hidden"),c="top");g[c]=d;m=!0}else if(c==="zIndex")d&&(g[c]=d),m=!0;else if(qa(c,["x","y","width","height"])!==-1)this[c]=d,c==="x"||c==="y"?c={x:"left",y:"top"}[c]:d=s(0,d),this.updateClipping?(this[c]=d,this.updateClipping()):g[c]=d,m=!0;else if(c==="class"&&h==="DIV")f.className=d;else if(c==="stroke")d=i.color(d,f,c),c="strokecolor";else if(c==="stroke-width"||c==="strokeWidth")f.stroked=d?!0:!1,c="strokeweight",this[c]=d,sa(d)&&(d+="px");else if(c==="dashstyle")(f.getElementsByTagName("stroke")[0]||
+U(i.prepVML(["<stroke/>"]),null,null,f))[c]=d||"solid",this.dashstyle=d,m=!0;else if(c==="fill")if(h==="SPAN")g.color=d;else{if(h!=="IMG")f.filled=d!==S?!0:!1,d=i.color(d,f,c,this),c="fillcolor"}else if(c==="opacity")m=!0;else if(h==="shape"&&c==="rotation")this[c]=f.style[c]=d,f.style.left=-t(ca(d*Ua)+1)+"px",f.style.top=t(V(d*Ua))+"px";else if(c==="translateX"||c==="translateY"||c==="rotation")this[c]=d,this.updateTransform(),m=!0;else if(c==="text")this.bBox=null,f.innerHTML=d,m=!0;m||(fb?f[c]=
+d:v(f,c,d))}return q},clip:function(a){var b=this,c;a?(c=a.members,ga(c,b),c.push(b),b.destroyClip=function(){ga(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:fb?"inherit":"rect(auto)"});return b.css(a)},css:wa.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Ta(a)},destroy:function(){this.destroyClip&&this.destroyClip();return wa.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=O.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,
+b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=C(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,p,q;k&&typeof k.value!=="string"&&(k="x");m=k;if(a){p=o(a.width,3);q=(a.opacity||0.15)/p;for(e=1;e<=3;e++){l=p*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=['<shape isShadow="true" strokeweight="',l,'" filled="false" path="',m,'" coordsize="10 10" style="',f.style.cssText,'" />'];h=U(g.prepVML(j),null,
+{left:C(i.left)+o(a.offsetX,1),top:C(i.top)+o(a.offsetY,1)});if(c)h.cutOff=l+1;j=['<stroke color="',a.color||"black",'" opacity="',q*e,'"/>'];U(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this}};F=ha(wa,F);var ma={Element:F,isIE8:oa.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d,e;this.alignedObjects=[];d=this.createElement(Ea);e=d.element;e.style.position="relative";a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=
+d;this.setSize(b,c,!1);y.namespaces.hcv||(y.namespaces.add("hcv","urn:schemas-microsoft-com:vml"),(y.styleSheets.length?y.styleSheets[0]:y.createStyleSheet()).cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } ")},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=T(a);return r(e,{members:[],left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=
+a.element,c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+t(a?e:d)+"px,"+t(a?f:b)+"px,"+t(a?b:f)+"px,"+t(a?d:e)+"px)"};!a&&fb&&c==="DIV"&&r(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){n(e.members,function(a){a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=S;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var k,l,m=a.linearGradient||a.radialGradient,
+p,q,o,A,L,s="",a=a.stops,u,t=[],w=function(){h=['<fill colors="'+t.join(",")+'" opacity="',o,'" o:opacity2="',q,'" type="',i,'" ',s,'focus="100%" method="any" />'];U(e.prepVML(h),null,null,b)};p=a[0];u=a[a.length-1];p[0]>0&&a.unshift([0,p[1]]);u[0]<1&&a.push([1,u[1]]);n(a,function(a,b){g.test(a[1])?(f=ra(a[1]),k=f.get("rgb"),l=f.get("a")):(k=a[1],l=1);t.push(a[0]*100+"% "+k);b?(o=l,A=k):(q=l,L=k)});if(c==="fill")if(i==="gradient")c=m.x1||m[0]||0,a=m.y1||m[1]||0,p=m.x2||m[2]||0,m=m.y2||m[3]||0,s='angle="'+
+(90-R.atan((m-a)/(p-c))*180/ya)+'"',w();else{var j=m.r,r=j*2,E=j*2,H=m.cx,B=m.cy,x=b.radialReference,v,j=function(){x&&(v=d.getBBox(),H+=(x[0]-v.x)/v.width-0.5,B+=(x[1]-v.y)/v.height-0.5,r*=x[2]/v.width,E*=x[2]/v.height);s='src="'+M.global.VMLRadialGradientURL+'" size="'+r+","+E+'" origin="0.5,0.5" position="'+H+","+B+'" color2="'+L+'" ';w()};d.added?j():J(d,"add",j);j=A}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=ra(a),h=["<",c,' opacity="',f.get("a"),'"/>'],U(this.prepVML(h),null,null,b),j=
+f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","<hcv:");return a},text:Ha.prototype.html,path:function(a){var b={coordsize:"10 10"};
+Ia(a)?b.d=a:T(a)&&r(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,c){var d=this.symbol("circle");if(T(a))c=a.r,b=a.y,a=a.x;d.isCircle=!0;d.r=c;return d.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement(Ea).attr(b)},image:function(a,b,c,d,e){var f=this.createElement("img").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){var g=this.symbol("rect");g.r=
+T(a)?a.r:e;return g.attr(T(a)?a:g.crisp(f,a,b,s(c,0),s(d,0)))},invertChild:function(a,b){var c=b.style;K(a,{flip:"x",left:C(c.width)-1,top:C(c.height)-1,rotation:-90})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=V(f),i=ca(f),j=V(g),k=ca(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);
+e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){var f=a+c,g=b+d,h;!u(e)||!e.r?f=Ha.prototype.symbols.square.apply(0,arguments):(h=I(e.r,c,d),f=["M",a+h,b,"L",f-h,b,"wa",f-2*h,b,f,b+2*h,f-h,b,f,b+h,"L",f,g-h,"wa",f-2*h,g-2*h,f,g,f,g-h,f-h,g,"L",a+h,g,"wa",a,g-2*h,a+2*h,g,a+h,g,a,g-h,"L",a,b+h,"wa",a,b,a+2*h,b+2*h,a,b+h,a+h,b,"x","e"]);return f}}};Highcharts.VMLRenderer=F=function(){this.init.apply(this,arguments)};F.prototype=x(Ha.prototype,
+ma);Va=F}var Tb;if($)Highcharts.CanVGRenderer=F=function(){za="http://www.w3.org/1999/xhtml"},F.prototype.symbols={},Tb=function(){function a(){var a=b.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,d){b.length===0&&Vb(d,a);b.push(c)}}}(),Va=F;Ma.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.horiz,e=a.categories,f=a.series[0]&&a.series[0].names,g=this.pos,h=b.labels,i=a.tickPositions,d=d&&e&&!h.step&&!h.staggerLines&&!h.rotation&&c.plotWidth/i.length||
+!d&&(c.margin[3]||c.chartWidth*0.33),j=g===i[0],k=g===i[i.length-1],l,f=e?o(e[g],f&&f[g],g):g,e=this.label,m=i.info;a.isDatetimeAxis&&m&&(l=b.dateTimeLabelFormats[m.higherRanks[g]||m.unitName]);this.isFirst=j;this.isLast=k;b=a.labelFormatter.call({axis:a,chart:c,isFirst:j,isLast:k,dateTimeLabelFormat:l,value:a.isLog?ia(fa(f)):f});g=d&&{width:s(1,t(d-2*(h.padding||10)))+"px"};g=r(g,h.style);if(u(e))e&&e.attr({text:b}).css(g);else{l={align:a.labelAlign};if(sa(h.rotation))l.rotation=h.rotation;if(d&&
+h.ellipsis)l._clipHeight=a.len/i.length;this.label=u(b)&&h.enabled?c.renderer.text(b,0,0,h.useHTML).attr(l).css(g).add(a.labelGroup):null}},getLabelSize:function(){var a=this.label,b=this.axis;return a?(this.labelBBox=a.getBBox())[b.horiz?"height":"width"]:0},getLabelSides:function(){var a=this.axis,b=this.labelBBox.width,a=b*{left:0,center:0.5,right:1}[a.labelAlign]-a.options.labels.x;return[-a,b-a]},handleOverflow:function(a,b){var c=!0,d=this.axis,e=d.chart,f=this.isFirst,g=this.isLast,h=b.x,i=
+d.reversed,j=d.tickPositions;if(f||g){var k=this.getLabelSides(),l=k[0],k=k[1],e=e.plotLeft,m=e+d.len,j=(d=d.ticks[j[a+(f?1:-1)]])&&d.label.xy&&d.label.xy.x+d.getLabelSides()[f?0:1];f&&!i||g&&i?h+l<e&&(h=e-l,d&&h+k>j&&(c=!1)):h+k>m&&(h=m-k,d&&h+l<j&&(c=!1));b.x=h}return c},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?
+g-e.bottom+e.offset-(e.opposite?e.height:0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,j=i.transA,k=i.reversed,l=i.staggerLines,m=i.chart.renderer.fontMetrics(e.style.fontSize).b,p=e.rotation,a=a+e.x-(f&&d?f*j*(k?-1:1):0),b=b+e.y-(f&&!d?f*j*(k?1:-1):0);p&&i.side===2&&(b-=m-m*V(p*Ua));!u(e.y)&&!p&&(b+=m-c.getBBox().height/2);l&&(b+=g/(h||1)%l*(i.labelOffset/l));return{x:a,y:b}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine(["M",a,b,"L",
+a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,j=this.pos,k=e.labels,l=this.gridLine,m=h?h+"Grid":"grid",p=h?h+"Tick":"tick",q=e[m+"LineWidth"],n=e[m+"LineColor"],A=e[m+"LineDashStyle"],s=e[p+"Length"],m=e[p+"Width"]||0,u=e[p+"Color"],t=e[p+"Position"],p=this.mark,r=k.step,v=!0,x=d.tickmarkOffset,E=this.getPosition(g,j,x,b),H=E.x,E=E.y,B=g&&H===d.pos+d.len||!g&&E===d.pos?-1:1,C=d.staggerLines;this.isActive=!0;if(q){j=
+d.getPlotLinePath(j+x,q*B,b,!0);if(l===w){l={stroke:n,"stroke-width":q};if(A)l.dashstyle=A;if(!h)l.zIndex=1;if(b)l.opacity=0;this.gridLine=l=q?f.path(j).attr(l).add(d.gridGroup):null}if(!b&&l&&j)l[this.isNew?"attr":"animate"]({d:j,opacity:c})}if(m&&s)t==="inside"&&(s=-s),d.opposite&&(s=-s),b=this.getMarkPath(H,E,s,m*B,g,f),p?p.animate({d:b,opacity:c}):this.mark=f.path(b).attr({stroke:u,"stroke-width":m,opacity:c}).add(d.axisGroup);if(i&&!isNaN(H))i.xy=E=this.getLabelPosition(H,E,i,g,k,x,a,r),this.isFirst&&
+!this.isLast&&!o(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!o(e.showLastLabel,1)?v=!1:!C&&g&&k.overflow==="justify"&&!this.handleOverflow(a,E)&&(v=!1),r&&a%r&&(v=!1),v&&!isNaN(E.y)?(E.opacity=c,i[this.isNew?"attr":"animate"](E),this.isNew=!1):i.attr("y",-9999)},destroy:function(){Ka(this,this.axis)}};vb.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=(b.pointRange||0)/2,e=a.options,f=e.label,g=a.label,h=e.width,i=e.to,j=e.from,k=u(j)&&u(i),l=e.value,m=e.dashStyle,p=a.svgElem,q=
+[],n,A=e.color,L=e.zIndex,t=e.events,w=b.chart.renderer;b.isLog&&(j=na(j),i=na(i),l=na(l));if(h){if(q=b.getPlotLinePath(l,h),d={stroke:A,"stroke-width":h},m)d.dashstyle=m}else if(k){if(j=s(j,b.min-d),i=I(i,b.max+d),q=b.getPlotBandPath(j,i,e),d={fill:A},e.borderWidth)d.stroke=e.borderColor,d["stroke-width"]=e.borderWidth}else return;if(u(L))d.zIndex=L;if(p)q?p.animate({d:q},null,p.onGetPath):(p.hide(),p.onGetPath=function(){p.show()});else if(q&&q.length&&(a.svgElem=p=w.path(q).attr(d).add(),t))for(n in e=
+function(b){p.on(b,function(c){t[b].apply(a,[c])})},t)e(n);if(f&&u(f.text)&&q&&q.length&&b.width>0&&b.height>0){f=x({align:c&&k&&"center",x:c?!k&&4:10,verticalAlign:!c&&k&&"middle",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},f);if(!g)a.label=g=w.text(f.text,0,0,f.useHTML).attr({align:f.textAlign||f.align,rotation:f.rotation,zIndex:L}).css(f.style).add();b=[q[1],q[4],o(q[6],q[1])];q=[q[2],q[5],o(q[7],q[2])];c=Ja(b);k=Ja(q);g.align(f,!1,{x:c,y:k,width:va(b)-c,height:va(q)-k});g.show()}else g&&g.hide();return a},
+destroy:function(){ga(this.axis.plotLinesAndBands,this);delete this.axis;Ka(this)}};Mb.prototype={destroy:function(){Ka(this,this.axis)},render:function(a){var b=this.options,c=b.format,c=c?Ca(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,0,0,b.useHTML).css(b.style).attr({align:this.textAlign,rotation:b.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=this.isNegative,
+g=c.translate(this.percent?100:this.total,0,0,0,1),c=c.translate(0),c=N(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e.attr({visibility:this.options.crop===!1||d.isInsidePlot(f.x,f.y)?Z?"inherit":"visible":"hidden"})}};db.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",
+month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:G,lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#4d759e",fontWeight:"bold"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,
+gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return Aa(this.total,-1)},style:G.style}},defaultLeftAxisOptions:{labels:{x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-5},
+title:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.xOrY=(this.isXAxis=c)?"x":"y";this.opposite=b.opposite;this.side=this.horiz?this.opposite?0:2:this.opposite?1:3;this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.isLog=e==="logarithmic";this.isDatetimeAxis=
+e==="datetime";this.isLinked=u(d.linkedTo);this.tickmarkOffset=this.categories&&d.tickmarkPlacement==="between"?0.5:0;this.ticks={};this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stackExtremes={};this.min=this.max=null;var f,d=this.options.events;qa(this,a.axes)===-1&&(a.axes.push(this),a[c?"xAxis":"yAxis"].push(this));this.series=this.series||
+[];if(a.inverted&&c&&this.reversed===w)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)J(this,f,d[f]);if(this.isLog)this.val2lin=na,this.lin2val=fa},setOptions:function(a){this.options=x(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],x(M[this.isXAxis?"xAxis":"yAxis"],a))},update:function(a,b){var c=this.chart,a=c.options[this.xOrY+
+"Axis"][this.options.index]=x(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.userMin=this.userMax=w;this.init(c,r(a,{events:w}));c.isDirtyBox=!0;o(b,!0)&&c.redraw()},remove:function(a){var b=this.chart,c=this.xOrY+"Axis";n(this.series,function(a){a.remove(!1)});ga(b.axes,this);ga(b[c],this);b.options[c].splice(this.options.index,1);n(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;o(a,!0)&&b.redraw()},defaultLabelFormatter:function(){var a=this.axis,b=this.value,
+c=a.categories,d=this.dateTimeLabelFormat,e=M.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ca(h,this);else if(c)g=b;else if(d)g=Xa(d,b);else if(f&&a>=1E3)for(;f--&&g===w;)c=Math.pow(1E3,f+1),a>=c&&e[f]!==null&&(g=Aa(b/c,-1)+e[f]);g===w&&(g=b>=1E3?Aa(b,0):Aa(b,-1));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=null;a.stackExtremes={};a.buildStacks();n(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d;
+d=c.options.threshold;var e;a.hasVisibleSeries=!0;a.isLog&&d<=0&&(d=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=I(o(a.dataMin,d[0]),Ja(d)),a.dataMax=s(o(a.dataMax,d[0]),va(d))}else{c.getExtremes();e=c.dataMax;c=c.dataMin;if(u(c)&&u(e))a.dataMin=I(o(a.dataMin,c),c),a.dataMax=s(o(a.dataMax,e),e);if(u(d))if(a.dataMin>=d)a.dataMin=d,a.ignoreMinPadding=!0;else if(a.dataMax<d)a.dataMax=d,a.ignoreMaxPadding=!0}}})},translate:function(a,b,c,d,e,f){var g=this.len,h=1,i=0,j=d?this.oldTransA:this.transA,
+d=d?this.oldMin:this.min,k=this.minPixelPadding,e=(this.options.ordinal||this.isLog&&e)&&this.lin2val;if(!j)j=this.transA;c&&(h*=-1,i=g);this.reversed&&(h*=-1,i-=h*g);b?(a=a*h+i,a-=k,a=a/j+d,e&&(a=this.lin2val(a))):(e&&(a=this.val2lin(a)),f==="between"&&(f=0.5),a=h*(a-d)*j+i+h*k+(sa(f)?j*f*this.pointRange:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,
+b,c,d){var e=this.chart,f=this.left,g=this.top,h,i,j,a=this.translate(a,null,null,c),k=c&&e.oldChartHeight||e.chartHeight,l=c&&e.oldChartWidth||e.chartWidth,m;h=this.transB;c=i=t(a+h);h=j=t(k-a-h);if(isNaN(a))m=!0;else if(this.horiz){if(h=g,j=k-this.bottom,c<f||c>f+this.width)m=!0}else if(c=f,i=l-this.right,h<g||h>g+this.height)m=!0;return m&&!d?null:e.renderer.crispLine(["M",c,h,"L",i,j],b||0)},getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b),d=this.getPlotLinePath(a);d&&c?d.push(c[4],
+c[5],c[1],c[2]):d=null;return d},getLinearTickPositions:function(a,b,c){for(var d,b=ia(P(b/a)*a),c=ia(xa(c/a)*a),e=[];b<=c;){e.push(b);b=ia(b+a);if(b===d)break;d=b}return e},getLogTickPositions:function(a,b,c,d){var e=this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=t(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=P(b),h,i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!l;f++){i=e.length;for(h=0;h<i&&!l;h++)j=na(fa(f)*e[h]),j>b&&(!d||
+k<=c)&&g.push(k),k>c&&(l=!0),k=j}else if(b=fa(b),c=fa(c),a=e[d?"minorTickInterval":"tickInterval"],a=o(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=ob(a,null,nb(a)),g=Na(this.getLinearTickPositions(a,b,c),na),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e;if(this.isLog){e=b.length;for(a=1;a<e;a++)d=d.concat(this.getLogTickPositions(c,
+b[a-1],b[a],!0))}else if(this.isDatetimeAxis&&a.minorTickInterval==="auto")d=d.concat(Eb(Cb(c),this.min,this.max,a.startOfWeek)),d[0]<this.min&&d.shift();else for(b=this.min+(b[0]-this.min)%c;b<=this.max;b+=c)d.push(b);return d},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-this.dataMin>=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===w&&!this.isLog)u(a.min)||u(a.max)?this.minRange=null:(n(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-
+1;g>0;g--)if(h=i[g]-i[g-1],f===w||h<f)f=h}),this.minRange=I(f*5,this.dataMax-this.dataMin));if(c-b<this.minRange){var k=this.minRange;d=(k-c+b)/2;d=[b-d,o(a.min,b-d)];if(e)d[2]=this.dataMin;b=va(d);c=[b+k,o(a.max,b+k)];if(e)c[2]=this.dataMax;c=Ja(c);c-b<k&&(d[0]=c-k,d[1]=o(a.min,c-k),b=va(d))}this.min=b;this.max=c},setAxisTranslation:function(a){var b=this.max-this.min,c=0,d,e=0,f=0,g=this.linkedParent,h=this.transA;if(this.isXAxis)g?(e=g.minPointOffset,f=g.pointRangePadding):n(this.series,function(a){var g=
+a.pointRange,h=a.options.pointPlacement,l=a.closestPointRange;g>b&&(g=0);c=s(c,g);e=s(e,ea(h)?0:g/2);f=s(f,h==="on"?0:g);!a.noSharedTooltip&&u(l)&&(d=u(d)?I(d,l):l)}),g=this.ordinalSlope&&d?this.ordinalSlope/d:1,this.minPointOffset=e*=g,this.pointRangePadding=f*=g,this.pointRange=I(c,b),this.closestPointRange=d;if(a)this.oldTransA=h;this.translationSlope=this.transA=h=this.len/(b+f||1);this.transB=this.horiz?this.left:this.bottom;this.minPixelPadding=h*e},setTickPositions:function(a){var b=this,c=
+b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=b.options.tickPositioner,j=d.maxPadding,k=d.minPadding,l=d.tickInterval,m=d.minTickInterval,p=d.tickPixelInterval,q,ba=b.categories;h?(b.linkedParent=c[g?"xAxis":"yAxis"][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=o(c.min,c.dataMin),b.max=o(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&ka(11,1)):(b.min=o(b.userMin,d.min,b.dataMin),b.max=o(b.userMax,d.max,b.dataMax));if(e)!a&&I(b.min,o(b.dataMin,b.min))<=0&&
+ka(10,1),b.min=ia(na(b.min)),b.max=ia(na(b.max));if(b.range&&(b.userMin=b.min=s(b.min,b.max-b.range),b.userMax=b.max,a))b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!ba&&!b.usePercentage&&!h&&u(b.min)&&u(b.max)&&(c=b.max-b.min)){if(!u(d.min)&&!u(b.userMin)&&k&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=c*k;if(!u(d.max)&&!u(b.userMax)&&j&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*j}b.min===b.max||b.min===void 0||b.max===void 0?b.tickInterval=1:h&&!l&&p===b.linkedParent.options.tickPixelInterval?
+b.tickInterval=b.linkedParent.tickInterval:(b.tickInterval=o(l,ba?1:(b.max-b.min)*p/s(b.len,p)),!u(l)&&b.len<p&&!this.isRadial&&(q=!0,b.tickInterval/=4));g&&!a&&n(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange)b.tickInterval=s(b.pointRange,b.tickInterval);if(!l&&b.tickInterval<m)b.tickInterval=
+m;if(!f&&!e&&!l)b.tickInterval=ob(b.tickInterval,null,nb(b.tickInterval),d);b.minorTickInterval=d.minorTickInterval==="auto"&&b.tickInterval?b.tickInterval/5:d.minorTickInterval;b.tickPositions=a=d.tickPositions?[].concat(d.tickPositions):i&&i.apply(b,[b.min,b.max]);if(!a)!b.ordinalPositions&&(b.max-b.min)/b.tickInterval>s(2*b.len,200)&&ka(19,!0),a=f?(b.getNonLinearTimeTicks||Eb)(Cb(b.tickInterval,d.units),b.min,b.max,d.startOfWeek,b.ordinalPositions,b.closestPointRange,!0):e?b.getLogTickPositions(b.tickInterval,
+b.min,b.max):b.getLinearTickPositions(b.tickInterval,b.min,b.max),q&&a.splice(1,a.length-2),b.tickPositions=a;if(!h)e=a[0],f=a[a.length-1],h=b.minPointOffset||0,d.startOnTick?b.min=e:b.min-h>e&&a.shift(),d.endOnTick?b.max=f:b.max+h<f&&a.pop(),a.length===1&&(b.min-=0.001,b.max+=0.001)},setMaxTicks:function(){var a=this.chart,b=a.maxTicks||{},c=this.tickPositions,d=this._maxTicksKey=[this.xOrY,this.pos,this.len].join("-");if(!this.isLinked&&!this.isDatetimeAxis&&c&&c.length>(b[d]||0)&&this.options.alignTicks!==
+!1)b[d]=c.length;a.maxTicks=b},adjustTickAmount:function(){var a=this._maxTicksKey,b=this.tickPositions,c=this.chart.maxTicks;if(c&&c[a]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1){var d=this.tickAmount,e=b.length;this.tickAmount=a=c[a];if(e<a){for(;b.length<a;)b.push(ia(b[b.length-1]+this.tickInterval));this.transA*=(e-1)/(a-1);this.max=b[b.length-1]}if(u(d)&&a!==d)this.isDirty=!0}},setScale:function(){var a=this.stacks,b,c,d,e;this.oldMin=this.min;this.oldMax=
+this.max;this.oldAxisLength=this.len;this.setAxisSize();e=this.len!==this.oldAxisLength;n(this.series,function(a){if(a.isDirtyData||a.isDirty||a.xAxis.isDirty)d=!0});if(e||d||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax){if(!this.isXAxis)for(b in a)delete a[b];this.forceRedraw=!1;this.getSeriesExtremes();this.setTickPositions();this.oldUserMin=this.userMin;this.oldUserMax=this.userMax;if(!this.isDirty)this.isDirty=e||this.min!==this.oldMin||this.max!==
+this.oldMax}else if(!this.isXAxis){if(this.oldStacks)a=this.stacks=this.oldStacks;for(b in a)for(c in a[b])a[b][c].cum=a[b][c].total}this.setMaxTicks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=o(c,!0),e=r(e,{min:a,max:b});z(f,"setExtremes",e,function(){f.userMin=a;f.userMax=b;f.eventArgs=e;f.isDirtyExtremes=!0;c&&g.redraw(d)})},zoom:function(a,b){this.allowZoomOutside||(u(this.dataMin)&&a<=this.dataMin&&(a=w),u(this.dataMax)&&b>=this.dataMax&&(b=w));this.displayBtn=a!==w||b!==w;this.setExtremes(a,
+b,!1,w,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=b.offsetRight||0,e=this.horiz,f,g;this.left=g=o(b.left,a.plotLeft+c);this.top=f=o(b.top,a.plotTop);this.width=c=o(b.width,a.plotWidth-c+d);this.height=b=o(b.height,a.plotHeight);this.bottom=a.chartHeight-b-f;this.right=a.chartWidth-c-g;this.len=s(e?c:b,0);this.pos=e?g:f},getExtremes:function(){var a=this.isLog;return{min:a?ia(fa(this.min)):this.min,max:a?ia(fa(this.max)):this.max,dataMin:this.dataMin,
+dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?fa(this.min):this.min,b=b?fa(this.max):this.max;c>a||a===null?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},addPlotBand:function(a){this.addPlotBandOrLine(a,"plotBands")},addPlotLine:function(a){this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(a,b){var c=(new vb(this,a)).render(),d=this.userOptions;c&&(b&&(d[b]=d[b]||[],d[b].push(a)),this.plotLinesAndBands.push(c));return c},
+autoLabelAlign:function(a){a=(o(a,0)-this.side*90+720)%360;return a>15&&a<165?"right":a>195&&a<345?"left":"center"},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k=0,l,m=0,p=d.title,q=d.labels,ba=0,A=b.axisOffset,L=b.clipOffset,t=[-1,1,1,-1][h],r,v=1,x=o(q.maxStaggerLines,5),la,E,H,B;a.hasData=j=a.hasVisibleSeries||u(a.min)&&u(a.max)&&!!e;a.showAxis=b=j||o(d.showEmpty,!0);a.staggerLines=a.horiz&&q.staggerLines;
+if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g("axis-labels").attr({zIndex:q.zIndex||7}).add();if(j||a.isLinked){a.labelAlign=o(q.align||a.autoLabelAlign(q.rotation));n(e,function(b){f[b]?f[b].addLabel():f[b]=new Ma(a,b)});if(a.horiz&&!a.staggerLines&&x&&!q.rotation){for(r=a.reversed?[].concat(e).reverse():e;v<x;){j=[];la=!1;for(q=0;q<r.length;q++)E=r[q],H=(H=f[E].label&&f[E].label.getBBox())?H.width:
+0,B=q%v,H&&(E=a.translate(E),j[B]!==w&&E<j[B]&&(la=!0),j[B]=E+H);if(la)v++;else break}if(v>1)a.staggerLines=v}n(e,function(b){if(h===0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)ba=s(f[b].getLabelSize(),ba)});if(a.staggerLines)ba*=a.staggerLines,a.labelOffset=ba}else for(r in f)f[r].destroy(),delete f[r];if(p&&p.text&&p.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(p.text,0,0,p.useHTML).attr({zIndex:7,rotation:p.rotation||0,align:p.textAlign||{low:"left",middle:"center",high:"right"}[p.align]}).css(p.style).add(a.axisGroup),
+a.axisTitle.isNew=!0;if(b)k=a.axisTitle.getBBox()[g?"height":"width"],m=o(p.margin,g?5:10),l=p.offset;a.axisTitle[b?"show":"hide"]()}a.offset=t*o(d.offset,A[h]);a.axisTitleMargin=o(l,ba+m+(h!==2&&ba&&t*d.labels[g?"y":"x"]));A[h]=s(A[h],a.axisTitleMargin+k+t*a.offset);L[i]=s(L[i],P(d.lineWidth/2)*2)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",
+e?this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=C(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this,
+b=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.stacks,j=a.ticks,k=a.minorTicks,l=a.alternateBands,m=d.stackLabels,p=d.alternateGridColor,q=a.tickmarkOffset,o=d.lineWidth,A,s=b.hasRendered&&u(a.oldMin)&&!isNaN(a.oldMin);A=a.hasData;var t=a.showAxis,r,v;n([j,k,l],function(a){for(var b in a)a[b].isActive=!1});if(A||f)if(a.minorTickInterval&&!a.categories&&n(a.getMinorTickPositions(),function(b){k[b]||(k[b]=new Ma(a,b,"minor"));s&&k[b].isNew&&k[b].render(null,
+!0);k[b].render(null,!1,1)}),g.length&&(n(g.slice(1).concat([g[0]]),function(b,c){c=c===g.length-1?0:c+1;if(!f||b>=a.min&&b<=a.max)j[b]||(j[b]=new Ma(a,b)),s&&j[b].isNew&&j[b].render(c,!0),j[b].render(c,!1,1)}),q&&a.min===0&&(j[-1]||(j[-1]=new Ma(a,-1,null,!0)),j[-1].render(-1))),p&&n(g,function(b,c){if(c%2===0&&b<a.max)l[b]||(l[b]=new vb(a)),r=b+q,v=g[c+1]!==w?g[c+1]+q:a.max,l[b].options={from:e?fa(r):r,to:e?fa(v):v,color:p},l[b].render(),l[b].isActive=!0}),!a._addedPlotLB)n((d.plotLines||[]).concat(d.plotBands||
+[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0;n([j,k,l],function(a){var c,d,e=[],f=Fa?Fa.duration||500:0,g=function(){for(d=e.length;d--;)a[e[d]]&&!a[e[d]].isActive&&(a[e[d]].destroy(),delete a[e[d]])};for(c in a)if(!a[c].isActive)a[c].render(c,!1,0),a[c].isActive=!1,e.push(c);a===l||!b.hasRendered||!f?g():f&&setTimeout(g,f)});if(o)A=a.getLinePath(o),a.axisLine?a.axisLine.animate({d:A}):a.axisLine=c.path(A).attr({stroke:d.lineColor,"stroke-width":o,zIndex:7}).add(a.axisGroup),a.axisLine[t?
+"show":"hide"]();if(h&&t)h[h.isNew?"attr":"animate"](a.getTitlePosition()),h.isNew=!1;if(m&&m.enabled){var x,la,d=a.stackTotalGroup;if(!d)a.stackTotalGroup=d=c.g("stack-labels").attr({visibility:"visible",zIndex:6}).add();d.translate(b.plotLeft,b.plotTop);for(x in i)for(la in c=i[x],c)c[la].render(d)}a.isDirty=!1},removePlotBandOrLine:function(a){for(var b=this.plotLinesAndBands,c=this.options,d=this.userOptions,e=b.length;e--;)b[e].id===a&&b[e].destroy();n([c.plotLines||[],d.plotLines||[],c.plotBands||
+[],d.plotBands||[]],function(b){for(e=b.length;e--;)b[e].id===a&&ga(b,b[e])})},setTitle:function(a,b){this.update({title:a},b)},redraw:function(){var a=this.chart.pointer;a.reset&&a.reset(!0);this.render();n(this.plotLinesAndBands,function(a){a.render()});n(this.series,function(a){a.isDirty=!0})},buildStacks:function(){var a=this.series,b=a.length;if(!this.isXAxis){for(;b--;)a[b].setStackedPoints();if(this.usePercentage)for(b=0;b<a.length;b++)a[b].setPercentStacks()}},setCategories:function(a,b){this.update({categories:a},
+b)},destroy:function(a){var b=this,c=b.stacks,d,e=b.plotLinesAndBands;a||aa(b);for(d in c)Ka(c[d]),c[d]=null;n([b.ticks,b.minorTicks,b.alternateBands],function(a){Ka(a)});for(a=e.length;a--;)e[a].destroy();n("stackTotalGroup,axisLine,axisGroup,gridGroup,labelGroup,axisTitle".split(","),function(a){b[a]&&(b[a]=b[a].destroy())})}};wb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=C(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.label=
+a.renderer.label("",0,0,b.shape,null,null,b.useHTML,null,"tooltip").attr({padding:e,fill:b.backgroundColor,"stroke-width":c,r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-999});$||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){n(this.crosshairs,function(a){a&&a.destroy()});if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden;
+r(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:g?(2*f.anchorX+c)/3:c,anchorY:g?(f.anchorY+d)/2:d});e.label.attr(f);if(g&&(N(a-f.x)>1||N(b-f.y)>1))clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(){var a=this,b;clearTimeout(this.hideTimer);if(!this.isHidden)b=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){a.label.fadeOut();a.isHidden=!0},o(this.options.hideDelay,500)),b&&n(b,function(a){a.setState()}),this.chart.hoverPoints=
+null},hideCrosshairs:function(){n(this.crosshairs,function(a){a&&a.hide()})},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=0,h=0,i,a=ja(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===w&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(n(a,function(a){i=a.series.yAxis;g+=a.plotX;h+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&i?i.top-f:0)}),g/=a.length,h/=a.length,c=[e?d.plotWidth-h:g,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-g:
+h]);return Na(c,t)},getPosition:function(a,b,c){var d=this.chart,e=d.plotLeft,f=d.plotTop,g=d.plotWidth,h=d.plotHeight,i=o(this.options.distance,12),j=c.plotX,c=c.plotY,d=j+e+(d.inverted?i:-a-i),k=c-b+f+15,l;d<7&&(d=e+s(j,0)+i);d+a>e+g&&(d-=d+a-(e+g),k=c-b+f-i,l=!0);k<f+5&&(k=f+5,l&&c>=k&&c<=k+b&&(k=c+f+i));k+b>f+h&&(k=s(f,f+h-b-i));return{x:d,y:k}},defaultFormatter:function(a){var b=this.points||ja(this),c=b[0].series,d;d=[c.tooltipHeaderFormatter(b[0])];n(b,function(a){c=a.series;d.push(c.tooltipFormatter&&
+c.tooltipFormatter(a)||a.point.tooltipFormatter(c.tooltipOptions.pointFormat))});d.push(a.options.footerFormat||"");return d.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h={},i,j=[];i=e.formatter||this.defaultFormatter;var h=c.hoverPoints,k,l=e.crosshairs,m=this.shared;clearTimeout(this.hideTimer);this.followPointer=ja(a)[0].series.tooltipOptions.followPointer;g=this.getAnchor(a,b);f=g[0];g=g[1];m&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,h&&n(h,
+function(a){a.setState()}),n(a,function(a){a.setState("hover");j.push(a.getLabelConfig())}),h={x:a[0].category,y:a[0].y},h.points=j,a=a[0]):h=a.getLabelConfig();i=i.call(h,this);h=a.series;i===!1?this.hide():(this.isHidden&&(Wa(d),d.attr("opacity",1).show()),d.attr({text:i}),k=e.borderColor||a.color||h.color||"#606060",d.attr({stroke:k}),this.updatePosition({plotX:f,plotY:g}),this.isHidden=!1);if(l){l=ja(l);for(d=l.length;d--;)if(m=a.series,e=m[d?"yAxis":"xAxis"],l[d]&&e)if(h=d?o(a.stackY,a.y):a.x,
+e.isLog&&(h=na(h)),d===1&&m.modifyValue&&(h=m.modifyValue(h)),e=e.getPlotLinePath(h,1),this.crosshairs[d])this.crosshairs[d].attr({d:e,visibility:"visible"});else{h={"stroke-width":l[d].width||1,stroke:l[d].color||"#C0C0C0",zIndex:l[d].zIndex||2};if(l[d].dashStyle)h.dashstyle=l[d].dashStyle;this.crosshairs[d]=c.renderer.path(e).attr(h).add()}}z(c,"tooltipRefresh",{text:i,x:f+c.plotLeft,y:g+c.plotTop,borderColor:k})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||
+this.getPosition).call(this,c.width,c.height,a);this.move(t(c.x),t(c.y),a.plotX+b.plotLeft,a.plotY+b.plotTop)}};xb.prototype={init:function(a,b){var c=b.chart,d=c.events,e=$?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(b.tooltip.enabled)a.tooltip=new wb(a,b.tooltip);this.setDOMEvents()},normalize:function(a,b){var c,
+d,a=a||O.event;if(!a.target)a.target=a.srcElement;a=Xb(a);d=a.touches?a.touches.item(0):a;if(!b)this.chartPosition=b=Wb(this.chart.container);d.pageX===w?(c=s(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,d=d.pageY-b.top);return r(a,{chartX:t(c),chartY:t(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};n(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},getIndex:function(a){var b=this.chart;return b.inverted?
+b.plotHeight+b.plotTop-a.chartY:a.chartX-b.plotLeft},runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e,f=b.hoverPoint,g=b.hoverSeries,h,i,j=b.chartWidth,k=this.getIndex(a);if(d&&this.options.tooltip.shared&&(!g||!g.noSharedTooltip)){e=[];h=c.length;for(i=0;i<h;i++)if(c[i].visible&&c[i].options.enableMouseTracking!==!1&&!c[i].noSharedTooltip&&c[i].tooltipPoints.length&&(b=c[i].tooltipPoints[k])&&b.series)b._dist=N(k-b.clientX),j=I(j,b._dist),e.push(b);for(h=e.length;h--;)e[h]._dist>
+j&&e.splice(h,1);if(e.length&&e[0].clientX!==this.hoverX)d.refresh(e,a),this.hoverX=e[0].clientX}if(g&&g.tracker){if((b=g.tooltipPoints[k])&&b!==f)b.onMouseOver(a)}else d&&d.followPointer&&!d.isHidden&&(a=d.getAnchor([{}],a),d.updatePosition({plotX:a[0],plotY:a[1]}))},reset:function(a){var b=this.chart,c=b.hoverSeries,d=b.hoverPoint,e=b.tooltip,b=e&&e.shared?b.hoverPoints:d;(a=a&&e&&b)&&ja(b)[0].plotX===w&&(a=!1);if(a)e.refresh(b);else{if(d)d.onMouseOut();if(c)c.onMouseOut();e&&(e.hide(),e.hideCrosshairs());
+this.hoverX=null}},scaleGroups:function(a,b){var c=this.chart,d;n(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},pinchTranslateDirection:function(a,b,c,d,e,f,g){var h=this.chart,i=a?"x":"y",j=a?"X":"Y",k="chart"+j,l=a?"width":"height",m=h["plot"+(a?"Left":"Top")],p,q,o=1,n=h.inverted,s=h.bounds[a?"h":"v"],
+t=b.length===1,u=b[0][k],r=c[0][k],w=!t&&b[1][k],v=!t&&c[1][k],x,c=function(){!t&&N(u-w)>20&&(o=N(r-v)/N(u-w));q=(m-r)/o+u;p=h["plot"+(a?"Width":"Height")]/o};c();b=q;b<s.min?(b=s.min,x=!0):b+p>s.max&&(b=s.max-p,x=!0);x?(r-=0.8*(r-g[i][0]),t||(v-=0.8*(v-g[i][1])),c()):g[i]=[r,v];n||(f[i]=q-m,f[l]=p);f=n?1/o:o;e[l]=p;e[i]=b;d[n?a?"scaleY":"scaleX":"scale"+j]=o;d["translate"+j]=f*m+(r-f*u)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=c.tooltip&&c.tooltip.options.followTouchMove,f=a.touches,
+g=f.length,h=b.lastValidTouch,i=b.zoomHor||b.pinchHor,j=b.zoomVert||b.pinchVert,k=i||j,l=b.selectionMarker,m={},p=g===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||c.runChartClick),q={};(k||e)&&!p&&a.preventDefault();Na(f,function(a){return b.normalize(a)});if(a.type==="touchstart")n(f,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),h.x=[d[0].chartX,d[1]&&d[1].chartX],h.y=[d[0].chartY,d[1]&&d[1].chartY],n(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],
+d=a.minPixelPadding,e=a.toPixels(a.dataMin),f=a.toPixels(a.dataMax),g=I(e,f),e=s(e,f);b.min=I(a.pos,g-d);b.max=s(a.pos+a.len,e+d)}});else if(d.length){if(!l)b.selectionMarker=l=r({destroy:pa},c.plotBox);i&&b.pinchTranslateDirection(!0,d,f,m,l,q,h);j&&b.pinchTranslateDirection(!1,d,f,m,l,q,h);b.hasPinched=k;b.scaleGroups(m,q);!k&&e&&g===1&&this.runPointActions(b.normalize(a))}},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=
+this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,j=b.plotWidth,k=b.plotHeight,l,m=this.mouseDownX,p=this.mouseDownY;d<h?d=h:d>h+j&&(d=h+j);e<i?e=i:e>i+k&&(e=i+k);this.hasDragged=Math.sqrt(Math.pow(m-d,2)+Math.pow(p-e,2));if(this.hasDragged>10){l=b.isInsidePlot(m-h,p-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!this.selectionMarker)this.selectionMarker=b.renderer.rect(h,i,f?1:j,g?
+1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();this.selectionMarker&&f&&(d-=m,this.selectionMarker.attr({width:N(d),x:(d>0?0:d)+m}));this.selectionMarker&&g&&(d=e-p,this.selectionMarker.attr({height:N(d),y:(d>0?0:d)+p}));l&&!this.selectionMarker&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this.chart,c=this.hasPinched;if(this.selectionMarker){var d={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},e=this.selectionMarker,f=e.x,g=e.y,h;if(this.hasDragged||
+c)n(b.axes,function(a){if(a.zoomEnabled){var b=a.horiz,c=a.toValue(b?f:g),b=a.toValue(b?f+e.width:g+e.height);!isNaN(c)&&!isNaN(b)&&(d[a.xOrY+"Axis"].push({axis:a,min:I(c,b),max:s(c,b)}),h=!0)}}),h&&z(b,"selection",d,function(a){b.zoom(r(a,c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();c&&this.scaleGroups()}if(b)K(b.container,{cursor:b._cursor}),b.cancelClick=this.hasDragged>10,b.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=
+this.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){this.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,d=b.hoverSeries,a=this.normalize(a,c);c&&d&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){this.reset();this.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart,a=this.normalize(a);a.returnValue=
+!1;b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=v(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;if(b&&!b.options.stickyTracking&&!this.inClass(a.toElement||a.relatedTarget,"highcharts-tooltip"))b.onMouseOut()},
+onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,f=b.inverted,g,h,i,a=this.normalize(a);a.cancelBubble=!0;if(!b.cancelClick)c&&this.inClass(a.target,"highcharts-tracker")?(g=this.chartPosition,h=c.plotX,i=c.plotY,r(c,{pageX:g.left+d+(f?b.plotWidth-i:h),pageY:g.top+e+(f?b.plotHeight-h:i)}),z(c.series,"click",r(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(r(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&z(b,"click",a))},onContainerTouchStart:function(a){var b=
+this.chart;a.touches.length===1?(a=this.normalize(a),b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)?(this.runPointActions(a),this.pinch(a)):this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchMove:function(a){(a.touches.length===1||a.touches.length===2)&&this.pinch(a)},onDocumentTouchEnd:function(a){this.drop(a)},setDOMEvents:function(){var a=this,b=a.chart.container,c;this._events=c=[[b,"onmousedown","onContainerMouseDown"],[b,"onmousemove","onContainerMouseMove"],[b,"onclick",
+"onContainerClick"],[b,"mouseleave","onContainerMouseLeave"],[y,"mousemove","onDocumentMouseMove"],[y,"mouseup","onDocumentMouseUp"]];ib&&c.push([b,"ontouchstart","onContainerTouchStart"],[b,"ontouchmove","onContainerTouchMove"],[y,"touchend","onDocumentTouchEnd"]);n(c,function(b){a["_"+b[2]]=function(c){a[b[2]](c)};b[1].indexOf("on")===0?b[0][b[1]]=a["_"+b[2]]:J(b[0],b[1],a["_"+b[2]])})},destroy:function(){var a=this;n(a._events,function(b){b[1].indexOf("on")===0?b[0][b[1]]=null:aa(b[0],b[1],a["_"+
+b[2]])});delete a._events;clearInterval(a.tooltipTimeout)}};eb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=o(b.padding,8),f=b.itemMarginTop||0;this.options=b;if(b.enabled)c.baseline=C(d.fontSize)+3+f,c.itemStyle=d,c.itemHiddenStyle=x(d,b.itemHiddenStyle),c.itemMarginTop=f,c.padding=e,c.initialItemX=e,c.initialItemY=e-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.lastLineHeight=0,c.render(),J(c.chart,"endResize",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options,
+d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.color:g,g=a.options&&a.options.marker,i={stroke:h,fill:h},j;d&&d.css({fill:c,color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(j in g=a.convertAttribs(g),g)d=g[j],d!==w&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;a.legendGroup&&a.legendGroup.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=
+e,f.y=d},destroyItem:function(a){var b=a.checkbox;n(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Ta(a.checkbox)},destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight;if(b)c=b.translateY,n(this.allItems,function(e){var f=e.checkbox,g;f&&(g=c+f.y+(a||0)+3,K(f,{left:b.translateX+e.legendItemWidth+f.x-
+20+"px",top:g+"px",display:g>c-6&&g<c+d-6?"":S}))})},renderTitle:function(){var a=this.padding,b=this.options.title,c=0;if(b.text){if(!this.title)this.title=this.chart.renderer.label(b.text,a-3,a-4,null,null,null,null,null,"legend-title").attr({zIndex:1}).css(b.style).add(this.group);a=this.title.getBBox();c=a.height;this.offsetWidth=a.width;this.contentGroup.attr({translateY:c})}this.titleHeight=c},renderItem:function(a){var B;var b=this,c=b.chart,d=c.renderer,e=b.options,f=e.layout==="horizontal",
+g=e.symbolWidth,h=e.symbolPadding,i=b.itemStyle,j=b.itemHiddenStyle,k=b.padding,l=f?o(e.itemDistance,8):0,m=!e.rtl,p=e.width,q=e.itemMarginBottom||0,n=b.itemMarginTop,A=b.initialItemX,t=a.legendItem,u=a.series||a,r=u.options,w=r.showCheckbox,v=e.useHTML;if(!t&&(a.legendGroup=d.g("legend-item").attr({zIndex:1}).add(b.scrollGroup),u.drawLegendSymbol(b,a),a.legendItem=t=d.text(e.labelFormat?Ca(e.labelFormat,a):e.labelFormatter.call(a),m?g+h:-h,b.baseline,v).css(x(a.visible?i:j)).attr({align:m?"left":
+"right",zIndex:2}).add(a.legendGroup),(v?t:a.legendGroup).on("mouseover",function(){a.setState("hover");t.css(b.options.itemHoverStyle)}).on("mouseout",function(){t.css(a.visible?i:j);a.setState()}).on("click",function(b){var c=function(){a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):z(a,"legendItemClick",b,c)}),b.colorizeItem(a,a.visible),r&&w))a.checkbox=U("input",{type:"checkbox",checked:a.selected,defaultChecked:a.selected},e.itemCheckboxStyle,c.container),
+J(a.checkbox,"click",function(b){z(a,"checkboxClick",{checked:b.target.checked},function(){a.select()})});d=t.getBBox();B=a.legendItemWidth=e.itemWidth||g+h+d.width+l+(w?20:0),e=B;b.itemHeight=g=d.height;if(f&&b.itemX-A+e>(p||c.chartWidth-2*k-A))b.itemX=A,b.itemY+=n+b.lastLineHeight+q,b.lastLineHeight=0;b.maxItemWidth=s(b.maxItemWidth,e);b.lastItemY=n+b.itemY+q;b.lastLineHeight=s(g,b.lastLineHeight);a._legendItemPos=[b.itemX,b.itemY];f?b.itemX+=e:(b.itemY+=n+g+q,b.lastLineHeight=g);b.offsetWidth=
+p||s((f?b.itemX-A-l:e)+k,b.offsetWidth)},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=[];n(b.series,function(a){var b=a.options;b.showInLegend&&!u(b.linkedTo)&&(e=e.concat(a.legendItems||
+(b.legendType==="point"?a.data:a)))});Kb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;n(e,function(b){a.renderItem(b)});g=j.width||a.offsetWidth;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h);if(l||m){g+=k;h+=k;if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp(null,null,null,g,h)),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor,
+"stroke-width":l||0,fill:m||S}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;n(e,function(b){a.positionItem(b)});f&&d.align(r({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h=this.clipRect,i=e.navigation,j=o(i.animation,!0),k=i.arrowSize||12,l=this.nav;e.layout===
+"horizontal"&&(f/=2);g&&(f=I(f,g));if(a>f&&!e.useHTML){this.clipHeight=c=f-20-this.titleHeight;this.pageCount=xa(a/c);this.currentPage=o(this.currentPage,1);this.fullHeight=a;if(!h)h=b.clipRect=d.clipRect(0,0,9999,0),b.contentGroup.clip(h);h.attr({height:c});if(!l)this.nav=l=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,k,k).on("click",function(){b.scroll(-1,j)}).add(l),this.pager=d.text("",15,10).css(i.style).add(l),this.down=d.symbol("triangle-down",0,0,k,k).on("click",
+function(){b.scroll(1,j)}).add(l);b.scroll(0);a=f}else if(l)h.attr({height:c.chartHeight}),l.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pageCount,d=this.currentPage+a,e=this.clipHeight,f=this.options.navigation,g=f.activeColor,h=f.inactiveColor,f=this.pager,i=this.padding;d>c&&(d=c);if(d>0)b!==w&&La(b,this.chart),this.nav.attr({translateX:i,translateY:e+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:d===1?h:g}).css({cursor:d===
+1?"default":"pointer"}),f.attr({text:d+"/"+this.pageCount}),this.down.attr({x:18+this.pager.getBBox().width,fill:d===c?h:g}).css({cursor:d===c?"default":"pointer"}),e=-I(e*(d-1),this.fullHeight-e+i)+1,this.scrollGroup.animate({translateY:e}),f.attr({text:d+"/"+c}),this.currentPage=d,this.positionCheckboxes(e)}};/Trident.*?11\.0/.test(oa)&&mb(eb.prototype,"positionItem",function(a,b){var c=this;setTimeout(function(){a.call(c,b)})});yb.prototype={init:function(a,b){var c,d=a.series;a.series=null;c=
+x(M,a);c.series=a.series=d;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=Ga.length;Ga.push(f);d.reflow!==!1&&J(f,"load",function(){f.initReflow()});if(e)for(g in e)J(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=$?!1:o(d.animation,!0);f.pointCount=0;f.counters=new Jb;f.firstRender()},
+initSeries:function(a){var b=this.options.chart;(b=W[a.type||b.type||b.defaultSeriesType])||ka(17,!0);b=new b;b.init(this,a);return b},addSeries:function(a,b,c){var d,e=this;a&&(b=o(b,!0),z(e,"addSeries",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?"xAxis":"yAxis",f=this.options;new db(this,x(a,{index:this[e].length,isX:b}));f[e]=ja(f[e]||{});f[e].push(a);o(c,!0)&&this.redraw(d)},isInsidePlot:function(a,b,
+c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&n(this.axes,function(a){a.adjustTickAmount()});this.maxTicks=null},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.isDirtyBox,j=c.length,k=j,l=this.renderer,m=l.isHidden(),p=[];La(a,this);m&&this.cloneRenderTo();for(this.layOutTitles();k--;)if(a=c[k],a.options.stacking&&(g=!0,a.isDirty)){h=!0;
+break}if(h)for(k=j;k--;)if(a=c[k],a.options.stacking)a.isDirty=!0;n(c,function(a){a.isDirty&&a.options.legendType==="point"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(this.hasCartesianSeries){if(!this.isResizing)this.maxTicks=null,n(b,function(a){a.setScale()});this.adjustTickAmounts();this.getMargins();n(b,function(a){a.isDirty&&(i=!0)});n(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,p.push(function(){z(a,"afterSetExtremes",r(a.eventArgs,
+a.getExtremes()));delete a.eventArgs});(i||g)&&a.redraw()})}i&&this.drawChartBox();n(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset&&d.reset(!0);l.draw();z(this,"redraw");m&&this.cloneRenderTo(!0);n(p,function(a){a.call()})},showLoading:function(a){var b=this.options,c=this.loadingDiv,d=b.loading;if(!c)this.loadingDiv=c=U(Ea,{className:"highcharts-loading"},r(d.style,{zIndex:10,display:S}),this.container),this.loadingSpan=U("span",null,d.labelStyle,c);this.loadingSpan.innerHTML=
+a||b.lang.loading;if(!this.loadingShown)K(c,{opacity:0,display:"",left:this.plotLeft+"px",top:this.plotTop+"px",width:this.plotWidth+"px",height:this.plotHeight+"px"}),Bb(c,{opacity:d.style.opacity},{duration:d.showDuration||0}),this.loadingShown=!0},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&Bb(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){K(b,{display:S})}});this.loadingShown=!1},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id===
+a)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis=ja(b.xAxis||{}),b=b.yAxis=ja(b.yAxis||{});n(c,function(a,b){a.index=b;a.isX=!0});n(b,function(a,b){a.index=b});c=c.concat(b);n(c,function(b){new db(a,b)});a.adjustTickAmounts()},getSelectedPoints:function(){var a=[];n(this.series,function(b){a=a.concat(ub(b.points||[],
+function(a){return a.selected}))});return a},getSelectedSeries:function(){return ub(this.series,function(a){return a.selected})},getStacks:function(){var a=this;n(a.yAxis,function(a){if(a.stacks&&a.hasVisibleSeries)a.oldStacks=a.stacks});n(a.series,function(b){if(b.options.stacking&&(b.visible===!0||a.options.chart.ignoreHiddenSeries===!1))b.stackKey=b.type+o(b.options.stack,"")})},showResetZoom:function(){var a=this,b=M.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo===
+"chart"?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,f)},zoomOut:function(){var a=this;z(a,"selection",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var b,c=this.pointer,d=!1,e;!a||a.resetSelection?n(this.axes,function(a){b=a.zoom()}):n(a.xAxis.concat(a.yAxis),function(a){var e=a.axis,h=e.isXAxis;if(c[h?"zoomX":"zoomY"]||c[h?"pinchX":"pinchY"])b=
+e.zoom(a.min,a.max),e.displayBtn&&(d=!0)});e=this.resetZoomButton;if(d&&!e)this.showResetZoom();else if(!d&&T(e))this.resetZoomButton=e.destroy();b&&this.redraw(o(this.options.chart.animation,a&&a.animation,this.pointCount<100))},pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&n(d,function(a){a.setState()});n(b==="xy"?[1,0]:[1],function(b){var d=a[b?"chartX":"chartY"],h=c[b?"xAxis":"yAxis"][0],i=c[b?"mouseDownX":"mouseDownY"],j=(h.pointRange||0)/2,k=h.getExtremes(),l=h.toValue(i-d,!0)+j,i=h.toValue(i+
+c[b?"plotWidth":"plotHeight"]-d,!0)-j;h.series.length&&l>I(k.dataMin,k.min)&&i<s(k.dataMax,k.max)&&(h.setExtremes(l,i,!1,!1,{trigger:"pan"}),e=!0);c[b?"mouseDownX":"mouseDownY"]=d});e&&c.redraw(!1);K(c.container,{cursor:"move"})},setTitle:function(a,b){var f;var c=this,d=c.options,e;e=d.title=x(d.title,a);f=d.subtitle=x(d.subtitle,b),d=f;n([["title",a,e],["subtitle",b,d]],function(a){var b=a[0],d=c[b],e=a[1],a=a[2];d&&e&&(c[b]=d=d.destroy());a&&a.text&&!d&&(c[b]=c.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,
+"class":"highcharts-"+b,zIndex:a.zIndex||4}).css(a.style).add())});c.layOutTitles()},layOutTitles:function(){var a=0,b=this.title,c=this.subtitle,d=this.options,e=d.title,d=d.subtitle,f=this.spacingBox.width-44;if(b&&(b.css({width:(e.width||f)+"px"}).align(r({y:15},e),!1,"spacingBox"),!e.floating&&!e.verticalAlign))a=b.getBBox().height,a>=18&&a<=25&&(a=15);c&&(c.css({width:(d.width||f)+"px"}).align(r({y:a+e.margin},d),!1,"spacingBox"),!d.floating&&!d.verticalAlign&&(a=xa(a+c.getBBox().height)));this.titleOffset=
+a},getChartSize:function(){var a=this.options.chart,b=this.renderToClone||this.renderTo;this.containerWidth=jb(b,"width");this.containerHeight=jb(b,"height");this.chartWidth=s(0,a.width||this.containerWidth||600);this.chartHeight=s(0,o(a.height,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Ta(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=
+b=this.renderTo.cloneNode(0),K(b,{position:"absolute",top:"-9999px",display:"block"}),y.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,c,d,e;this.renderTo=a=b.renderTo;e="highcharts-"+zb++;if(ea(a))this.renderTo=a=y.getElementById(a);a||ka(13,!0);c=C(v(a,"data-highcharts-chart"));!isNaN(c)&&Ga[c]&&Ga[c].destroy();v(a,"data-highcharts-chart",this.index);a.innerHTML="";a.offsetWidth||this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight;
+this.container=a=U(Ea,{className:"highcharts-container"+(b.className?" "+b.className:""),id:e},r({position:"relative",overflow:"hidden",width:c+"px",height:d+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},b.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=b.forExport?new Ha(a,c,d,!0):new Va(a,c,d);$&&this.renderer.create(this,a,c,d)},getMargins:function(){var a=this.spacing,b,c=this.legend,d=this.margin,e=this.options.legend,
+f=o(e.margin,10),g=e.x,h=e.y,i=e.align,j=e.verticalAlign,k=this.titleOffset;this.resetMargins();b=this.axisOffset;if(k&&!u(d[0]))this.plotTop=s(this.plotTop,k+this.options.title.margin+a[0]);if(c.display&&!e.floating)if(i==="right"){if(!u(d[1]))this.marginRight=s(this.marginRight,c.legendWidth-g+f+a[1])}else if(i==="left"){if(!u(d[3]))this.plotLeft=s(this.plotLeft,c.legendWidth+g+f+a[3])}else if(j==="top"){if(!u(d[0]))this.plotTop=s(this.plotTop,c.legendHeight+h+f+a[0])}else if(j==="bottom"&&!u(d[2]))this.marginBottom=
+s(this.marginBottom,c.legendHeight-h+f+a[2]);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);this.hasCartesianSeries&&n(this.axes,function(a){a.getOffset()});u(d[3])||(this.plotLeft+=b[3]);u(d[0])||(this.plotTop+=b[0]);u(d[2])||(this.marginBottom+=b[2]);u(d[1])||(this.marginRight+=b[1]);this.setChartSize()},initReflow:function(){function a(a){var g=c.width||jb(d,"width"),h=c.height||jb(d,"height"),a=a?a.target:O;if(!b.hasUserSize&&
+g&&h&&(a===O||a===y)){if(g!==b.containerWidth||h!==b.containerHeight)clearTimeout(e),b.reflowTimeout=e=setTimeout(function(){if(b.container)b.setSize(g,h,!1),b.hasUserSize=null},100);b.containerWidth=g;b.containerHeight=h}}var b=this,c=b.options.chart,d=b.renderTo,e;b.reflow=a;J(O,"resize",a);J(b,"destroy",function(){aa(O,"resize",a)})},setSize:function(a,b,c){var d=this,e,f,g;d.isResizing+=1;g=function(){d&&z(d,"endResize",null,function(){d.isResizing-=1})};La(c,d);d.oldChartHeight=d.chartHeight;
+d.oldChartWidth=d.chartWidth;if(u(a))d.chartWidth=e=s(0,t(a)),d.hasUserSize=!!e;if(u(b))d.chartHeight=f=s(0,t(b));K(d.container,{width:e+"px",height:f+"px"});d.setChartSize(!0);d.renderer.setSize(e,f,c);d.maxTicks=null;n(d.axes,function(a){a.isDirty=!0;a.setScale()});n(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.getMargins();d.redraw(c);d.oldChartHeight=null;z(d,"resize");Fa===!1?g():setTimeout(g,Fa&&Fa.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,
+d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,j,k,l;this.plotLeft=i=t(this.plotLeft);this.plotTop=j=t(this.plotTop);this.plotWidth=k=s(0,t(d-i-this.marginRight));this.plotHeight=l=s(0,t(e-j-this.marginBottom));this.plotSizeX=b?l:k;this.plotSizeY=b?k:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:l};d=2*P(this.plotBorderWidth/2);
+b=xa(s(d,h[3])/2);c=xa(s(d,h[0])/2);this.clipBox={x:b,y:c,width:P(this.plotSizeX-s(d,h[1])/2-b),height:P(this.plotSizeY-s(d,h[2])/2-c)};a||n(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this.spacing,b=this.margin;this.plotTop=o(b[0],a[0]);this.marginRight=o(b[1],a[1]);this.marginBottom=o(b[2],a[2]);this.plotLeft=o(b[3],a[3]);this.axisOffset=[0,0,0,0];this.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,
+d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,p,q=this.plotLeft,o=this.plotTop,n=this.plotWidth,s=this.plotHeight,t=this.plotBox,u=this.clipRect,r=this.clipBox;p=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp(null,null,null,c-p,d-p));else{e={fill:j||S};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=b.rect(p/2,p/
+2,c-p,d-p,a.borderRadius,i).attr(e).add().shadow(a.shadow)}if(k)f?f.animate(t):this.plotBackground=b.rect(q,o,n,s,0).attr({fill:k}).add().shadow(a.plotShadow);if(l)h?h.animate(t):this.plotBGImage=b.image(l,q,o,n,s).add();u?u.animate({width:r.width,height:r.height}):this.clipRect=b.clipRect(r);if(m)g?g.animate(g.crisp(null,q,o,n,s)):this.plotBorder=b.rect(q,o,n,s,0,-m).attr({stroke:a.plotBorderColor,"stroke-width":m,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,
+c,d=a.options.series,e,f;n(["inverted","angular","polar"],function(g){c=W[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=W[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;n(b,function(a){a.linkedSeries.length=0});n(b,function(b){var d=b.options.linkedTo;if(ea(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d})},render:function(){var a=this,b=a.axes,c=a.renderer,d=a.options,
+e=d.labels,f=d.credits,g;a.setTitle();a.legend=new eb(a,d.legend);a.getStacks();n(b,function(a){a.setScale()});a.getMargins();a.maxTicks=null;n(b,function(a){a.setTickPositions(!0);a.setMaxTicks()});a.adjustTickAmounts();a.getMargins();a.drawChartBox();a.hasCartesianSeries&&n(b,function(a){a.render()});if(!a.seriesGroup)a.seriesGroup=c.g("series-group").attr({zIndex:3}).add();n(a.series,function(a){a.translate();a.setTooltipPoints();a.render()});e.items&&n(e.items,function(b){var d=r(e.style,b.style),
+f=C(d.left)+a.plotLeft,g=C(d.top)+a.plotTop+12;delete d.left;delete d.top;c.text(b.html,f,g).attr({zIndex:2}).css(d).add()});if(f.enabled&&!a.credits)g=f.href,a.credits=c.text(f.text,0,0).on("click",function(){if(g)location.href=g}).attr({align:f.position.align,zIndex:8}).css(f.style).add().align(f.position);a.hasRendered=!0},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;z(a,"destroy");Ga[a.index]=w;a.renderTo.removeAttribute("data-highcharts-chart");aa(a);for(e=
+b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();n("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML="",aa(d),f&&Ta(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!Z&&O==O.top&&y.readyState!=="complete"||$&&!O.canvg?($?Tb.push(function(){a.firstRender()},
+a.options.global.canvasToolsURL):y.attachEvent("onreadystatechange",function(){y.detachEvent("onreadystatechange",a.firstRender);y.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender())a.getContainer(),z(a,"init"),a.resetMargins(),a.setChartSize(),a.propFromSeries(),a.getAxes(),n(b.series||[],function(b){a.initSeries(b)}),a.linkSeries(),z(a,"beforeRender"),a.pointer=new xb(a,b),a.render(),a.renderer.draw(),c&&c.apply(a,
+[a]),n(a.callbacks,function(b){b.apply(a,[a])}),a.cloneRenderTo(!0),z(a,"load")},splashArray:function(a,b){var c=b[a],c=T(c)?c:[c,c,c,c];return[o(b[a+"Top"],c[0]),o(b[a+"Right"],c[1]),o(b[a+"Bottom"],c[2]),o(b[a+"Left"],c[3])]}};yb.prototype.callbacks=[];var Pa=function(){};Pa.prototype={init:function(a,b,c){this.series=a;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter=
+0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.pointValKey,a=Pa.prototype.optionsToObject.call(this,a);r(this,a);this.options=this.options?r(this.options,a):a;if(d)this.y=this[d];if(this.x===w&&c)this.x=b===w?c.autoIncrement():b;return this},optionsToObject:function(a){var b,c=this.series,d=c.pointArrayMap||["y"],e=d.length,f=0,g=0;if(typeof a==="number"||a===null)b={y:a};else if(Ia(a)){b={};if(a.length>e){c=typeof a[0];if(c==="string")b.name=a[0];else if(c===
+"number")b.x=a[0];f++}for(;g<e;)b[d[g++]]=a[f++]}else if(typeof a==="object"){b=a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}return b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),ga(b,this),!b.length))a.hoverPoints=null;if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)aa(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=null},destroyElements:function(){for(var a=
+"graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup".split(","),b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},select:function(a,b){var c=this,d=c.series,e=d.chart,a=o(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[qa(c,d.data)]=
+c.options;c.setState(a&&"select");b||n(e.getSelectedPoints(),function(a){if(a.selected&&a!==c)a.selected=a.options.selected=!1,d.options.data[qa(a,d.data)]=a.options,a.setState(""),a.firePointEvent("unselect")})})},onMouseOver:function(a){var b=this.series,c=b.chart,d=c.tooltip,e=c.hoverPoint;if(e&&e!==this)e.onMouseOut();this.firePointEvent("mouseOver");d&&(!d.shared||b.noSharedTooltip)&&d.refresh(this,a);this.setState("hover");c.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints;
+if(!b||qa(this,b)===-1)this.firePointEvent("mouseOut"),this.setState(),a.hoverPoint=null},tooltipFormatter:function(a){var b=this.series,c=b.tooltipOptions,d=o(c.valueDecimals,""),e=c.valuePrefix||"",f=c.valueSuffix||"";n(b.pointArrayMap||["y"],function(b){b="{point."+b;if(e||f)a=a.replace(b+"}",e+b+"}"+f);a=a.replace(b+"}",b+":,."+d+"f}")});return Ca(a,{point:this,series:this.series})},update:function(a,b,c){var d=this,e=d.series,f=d.graphic,g,h=e.data,i=e.chart,j=e.options,b=o(b,!0);d.firePointEvent("update",
+{options:a},function(){d.applyOptions(a);if(T(a)&&(e.getAttribs(),f))a.marker&&a.marker.symbol?d.graphic=f.destroy():f.attr(d.pointAttr[d.state||""]);g=qa(d,h);e.xData[g]=d.x;e.yData[g]=e.toYData?e.toYData(d):d.y;e.zData[g]=d.z;j.data[g]=d.options;e.isDirty=e.isDirtyData=!0;if(!e.fixedBox&&e.hasCartesianSeries)i.isDirtyBox=!0;j.legendType==="point"&&i.legend.destroyItem(d);b&&i.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.points,f=d.chart,g,h=d.data;La(b,f);a=o(a,!0);c.firePointEvent("remove",
+null,function(){g=qa(c,h);h.length===e.length&&e.splice(g,1);h.splice(g,1);d.options.data.splice(g,1);d.xData.splice(g,1);d.yData.splice(g,1);d.zData.splice(g,1);c.destroy();d.isDirty=!0;d.isDirtyData=!0;a&&f.redraw()})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a==="click"&&e.allowPointSelect&&(c=function(a){d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});z(this,a,b,c)},importEvents:function(){if(!this.hasImportedEvents){var a=
+x(this.series.options.point,this.options).events,b;this.events=a;for(b in a)J(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a){var b=this.plotX,c=this.plotY,d=this.series,e=d.options.states,f=Y[d.type].marker&&d.options.marker,g=f&&!f.enabled,h=f&&f.states[a],i=h&&h.enabled===!1,j=d.stateMarkerGraphic,k=this.marker||{},l=d.chart,m=this.pointAttr,a=a||"";if(!(a===this.state||this.selected&&a!=="select"||e[a]&&e[a].enabled===!1||a&&(i||g&&!h.enabled))){if(this.graphic)e=f&&this.graphic.symbolName&&
+m[a].r,this.graphic.attr(x(m[a],e?{x:b-e,y:c-e,width:2*e,height:2*e}:{}));else{if(a&&h)e=h.radius,k=k.symbol||d.symbol,j&&j.currentSymbol!==k&&(j=j.destroy()),j?j.attr({x:b-e,y:c-e}):(d.stateMarkerGraphic=j=l.renderer.symbol(k,b-e,c-e,2*e,2*e).attr(m[a]).add(d.markerGroup),j.currentSymbol=k);if(j)j[a&&l.isInsidePlot(b,c)?"show":"hide"]()}this.state=a}}};var Q=function(){};Q.prototype={isCartesian:!0,type:"line",pointClass:Pa,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",
+fill:"fillColor",r:"radius"},colorCounter:0,init:function(a,b){var c,d,e=a.series;this.chart=a;this.options=b=this.setOptions(b);this.linkedSeries=[];this.bindAxes();r(this,{name:b.name,state:"",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if($)b.animation=!1;d=b.events;for(c in d)J(this,c,d[c]);if(d&&d.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;this.getColor();this.getSymbol();this.setData(b.data,!1);if(this.isCartesian)a.hasCartesianSeries=
+!0;e.push(this);this._i=e.length-1;Kb(e,function(a,b){return o(a.options.index,a._i)-o(b.options.index,a._i)});n(e,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;a.isCartesian&&n(["xAxis","yAxis"],function(e){n(c[e],function(c){d=c.options;if(b[e]===d.index||b[e]!==w&&b[e]===d.id||b[e]===w&&d.index===0)c.series.push(a),a[e]=c,c.isDirty=!0});a[e]||ka(18,!0)})},autoIncrement:function(){var a=this.options,b=this.xIncrement,b=o(b,a.pointStart,
+0);this.pointInterval=o(this.pointInterval,a.pointInterval,1);this.xIncrement=b+this.pointInterval;return b},getSegments:function(){var a=-1,b=[],c,d=this.points,e=d.length;if(e)if(this.options.connectNulls){for(c=e;c--;)d[c].y===null&&d.splice(c,1);d.length&&(b=[d])}else n(d,function(c,g){c.y===null?(g>a+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart.options,c=b.plotOptions,d=c[this.type];this.userOptions=a;a=x(d,c.series,
+a);this.tooltipOptions=x(b.tooltip,a.tooltip);d.marker===null&&delete a.marker;return a},getColor:function(){var a=this.options,b=this.userOptions,c=this.chart.options.colors,d=this.chart.counters,e;e=a.color||Y[this.type].color;if(!e&&!a.colorByPoint)u(b._colorIndex)?a=b._colorIndex:(b._colorIndex=d.color,a=d.color++),e=c[a];this.color=e;d.wrapColor(c.length)},getSymbol:function(){var a=this.userOptions,b=this.options.marker,c=this.chart,d=c.options.symbols,c=c.counters;this.symbol=b.symbol;if(!this.symbol)u(a._symbolIndex)?
+a=a._symbolIndex:(a._symbolIndex=c.symbol,a=c.symbol++),this.symbol=d[a];if(/^url/.test(this.symbol))b.radius=0;c.wrapSymbol(d.length)},drawLegendSymbol:function(a){var b=this.options,c=b.marker,d=a.options,e;e=d.symbolWidth;var f=this.chart.renderer,g=this.legendGroup,a=a.baseline-t(f.fontMetrics(d.itemStyle.fontSize).b*0.3);if(b.lineWidth){d={"stroke-width":b.lineWidth};if(b.dashStyle)d.dashstyle=b.dashStyle;this.legendLine=f.path(["M",0,a,"L",e,a]).attr(d).add(g)}if(c&&c.enabled)b=c.radius,this.legendSymbol=
+e=f.symbol(this.symbol,e/2-b,a-b,2*b,2*b).add(g),e.isMarker=!0},addPoint:function(a,b,c,d){var e=this.options,f=this.data,g=this.graph,h=this.area,i=this.chart,j=this.xData,k=this.yData,l=this.zData,m=this.names,p=g&&g.shift||0,q=e.data,s;La(d,i);c&&n([g,h,this.graphNeg,this.areaNeg],function(a){if(a)a.shift=p+1});if(h)h.isArea=!0;b=o(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);g=d.x;h=j.length;if(this.requireSorting&&g<j[h-1])for(s=!0;h&&j[h-1]>g;)h--;j.splice(h,0,g);
+k.splice(h,0,this.toYData?this.toYData(d):d.y);l.splice(h,0,d.z);if(m)m[g]=d.name;q.splice(h,0,a);s&&(this.data.splice(h,0,null),this.processData());e.legendType==="point"&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),j.shift(),k.shift(),l.shift(),q.shift()));this.isDirtyData=this.isDirty=!0;b&&(this.getAttribs(),i.redraw())},setData:function(a,b){var c=this.points,d=this.options,e=this.chart,f=null,g=this.xAxis,h=g&&g.categories&&!g.categories.length?[]:null,i;this.xIncrement=
+null;this.pointRange=g&&g.categories?1:d.pointRange;this.colorCounter=0;var j=[],k=[],l=[],m=a?a.length:[];i=o(d.turboThreshold,1E3);var p=this.pointArrayMap,p=p&&p.length,q=!!this.toYData;if(i&&m>i){for(i=0;f===null&&i<m;)f=a[i],i++;if(sa(f)){f=o(d.pointStart,0);d=o(d.pointInterval,1);for(i=0;i<m;i++)j[i]=f,k[i]=a[i],f+=d;this.xIncrement=f}else if(Ia(f))if(p)for(i=0;i<m;i++)d=a[i],j[i]=d[0],k[i]=d.slice(1,p+1);else for(i=0;i<m;i++)d=a[i],j[i]=d[0],k[i]=d[1];else ka(12)}else for(i=0;i<m;i++)if(a[i]!==
+w&&(d={series:this},this.pointClass.prototype.applyOptions.apply(d,[a[i]]),j[i]=d.x,k[i]=q?this.toYData(d):d.y,l[i]=d.z,h&&d.name))h[d.x]=d.name;ea(k[0])&&ka(14,!0);this.data=[];this.options.data=a;this.xData=j;this.yData=k;this.zData=l;this.names=h;for(i=c&&c.length||0;i--;)c[i]&&c[i].destroy&&c[i].destroy();if(g)g.minRange=g.userMinRange;this.isDirty=this.isDirtyData=e.isDirtyBox=!0;o(b,!0)&&e.redraw(!1)},remove:function(a,b){var c=this,d=c.chart,a=o(a,!0);if(!c.isRemoving)c.isRemoving=!0,z(c,"remove",
+null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)});c.isRemoving=!1},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e;e=0;var f,g,h=this.xAxis,i=this.options,j=i.cropThreshold,k=this.isCartesian;if(k&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!a)return!1;if(k&&this.sorted&&(!j||d>j||this.forceCrop))if(a=h.min,h=h.max,b[d-1]<a||b[0]>h)b=[],c=[];else if(b[0]<a||b[d-1]>h)e=this.cropData(this.xData,this.yData,a,h),b=e.xData,c=e.yData,e=e.start,
+f=!0;for(h=b.length-1;h>=0;h--)d=b[h]-b[h-1],d>0&&(g===w||d<g)?g=d:d<0&&this.requireSorting&&ka(15);this.cropped=f;this.cropStart=e;this.processedXData=b;this.processedYData=c;if(i.pointRange===null)this.pointRange=g||1;this.closestPointRange=g},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,h=o(this.cropShoulder,1),i;for(i=0;i<e;i++)if(a[i]>=c){f=s(0,i-h);break}for(;i<e;i++)if(a[i]>d){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,
+b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(m=0;m<g;m++)i=h+m,j?l[m]=(new f).init(this,[d[m]].concat(ja(e[m]))):(b[i]?k=b[i]:a[i]!==w&&(b[i]=k=(new f).init(this,a[i],d[m])),l[m]=k);if(b&&(g!==(c=b.length)||j))for(m=0;m<c;m++)if(m===h&&!j&&(m+=g),b[m])b[m].destroyElements(),b[m].plotX=w;this.data=b;this.points=l},setStackedPoints:function(){if(this.options.stacking&&
+!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var a=this.processedXData,b=this.processedYData,c=[],d=b.length,e=this.options,f=e.threshold,g=e.stack,e=e.stacking,h=this.stackKey,i="-"+h,j=this.negStacks,k=this.yAxis,l=k.stacks,m=k.oldStacks,p,q,o,n,t;for(o=0;o<d;o++){n=a[o];t=b[o];q=(p=j&&t<f)?i:h;l[q]||(l[q]={});if(!l[q][n])m[q]&&m[q][n]?(l[q][n]=m[q][n],l[q][n].total=null):l[q][n]=new Mb(k,k.options.stackLabels,p,n,g,e);q=l[q][n];q.points[this.index]=[q.cum||0];e==="percent"?
+(p=p?h:i,j&&l[p]&&l[p][n]?(p=l[p][n],q.total=p.total=s(p.total,q.total)+N(t)||0):q.total+=N(t)||0):q.total+=t||0;q.cum=(q.cum||0)+(t||0);q.points[this.index].push(q.cum);c[o]=q.cum}if(e==="percent")k.usePercentage=!0;this.stackedYData=c;k.oldStacks={}}},setPercentStacks:function(){var a=this,b=a.stackKey,c=a.yAxis.stacks;n([b,"-"+b],function(b){var d;for(var e=a.xData.length,f,g;e--;)if(f=a.xData[e],d=(g=c[b]&&c[b][f])&&g.points[a.index],f=d)g=g.total?100/g.total:0,f[0]=ia(f[0]*g),f[1]=ia(f[1]*g),
+a.stackedYData[e]=f[1]})},getExtremes:function(){var a=this.yAxis,b=this.processedXData,c=this.stackedYData||this.processedYData,d=c.length,e=[],f=0,g=this.xAxis.getExtremes(),h=g.min,g=g.max,i,j,k,l;for(l=0;l<d;l++)if(j=b[l],k=c[l],i=k!==null&&k!==w&&(!a.isLog||k.length||k>0),j=this.getExtremesFromAll||this.cropped||(b[l+1]||j)>=h&&(b[l-1]||j)<=g,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=o(void 0,Ja(e));this.dataMax=o(void 0,va(e))},translate:function(){this.processedXData||
+this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i==="between"||sa(i),k=a.threshold,a=0;a<g;a++){var l=f[a],m=l.x,p=l.y,q=l.low,n=e.stacks[(this.negStacks&&p<k?"-":"")+this.stackKey];if(e.isLog&&p<=0)l.y=p=null;l.plotX=c.translate(m,0,0,0,1,i,this.type==="flags");if(b&&this.visible&&n&&n[m])n=n[m],p=n.points[this.index],q=p[0],p=p[1],q===0&&(q=o(k,e.min)),e.isLog&&
+q<=0&&(q=null),l.percentage=b==="percent"&&p,l.total=l.stackTotal=n.total,l.stackY=p,n.setOffset(this.pointXOffset||0,this.barW||0);l.yBottom=u(q)?e.translate(q,0,1,0,1):null;h&&(p=this.modifyValue(p,l));l.plotY=typeof p==="number"&&p!==Infinity?e.translate(p,0,1,0,1):w;l.clientX=j?c.translate(m,0,0,0,1):l.plotX;l.negative=l.y<(k||0);l.category=d&&d[l.x]!==w?d[l.x]:l.x}this.getSegments()},setTooltipPoints:function(a){var b=[],c,d,e=this.xAxis,f=e&&e.getExtremes(),g=e?e.tooltipLen||e.len:this.chart.plotSizeX,
+h,i,j=[];if(this.options.enableMouseTracking!==!1){if(a)this.tooltipPoints=null;n(this.segments||this.points,function(a){b=b.concat(a)});e&&e.reversed&&(b=b.reverse());this.orderTooltipPoints&&this.orderTooltipPoints(b);a=b.length;for(i=0;i<a;i++)if(e=b[i],c=e.x,c>=f.min&&c<=f.max){h=b[i+1];c=d===w?0:d+1;for(d=b[i+1]?I(s(0,P((e.clientX+(h?h.wrappedClientX||h.clientX:g))/2)),g):g;c>=0&&c<=d;)j[c++]=e}this.tooltipPoints=j}},tooltipHeaderFormatter:function(a){var b=this.tooltipOptions,c=b.xDateFormat,
+d=b.dateTimeLabelFormats,e=this.xAxis,f=e&&e.options.type==="datetime",b=b.headerFormat,e=e&&e.closestPointRange,g;if(f&&!c)if(e)for(g in D){if(D[g]>=e){c=d[g];break}}else c=d.day;f&&c&&sa(a.key)&&(b=b.replace("{point.key}","{point.key:"+c+"}"));return Ca(b,{point:a,series:this})},onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&z(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,
+b=this.chart,c=b.tooltip,d=b.hoverPoint;if(d)d.onMouseOut();this&&a.events.mouseOut&&z(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b=this,c=b.chart,d=c.renderer,e;e=b.options.animation;var f=c.clipBox,g=c.inverted,h;if(e&&!T(e))e=Y[b.type].animation;h="_sharedClip"+e.duration+e.easing;if(a)a=c[h],e=c[h+"m"],a||(c[h]=a=d.clipRect(r(f,{width:0})),c[h+"m"]=e=d.clipRect(-99,g?-c.plotLeft:-c.plotTop,99,g?
+c.chartWidth:c.chartHeight)),b.group.clip(a),b.markerGroup.clip(e),b.sharedClipKey=h;else{if(a=c[h])a.animate({width:c.plotSizeX},e),c[h+"m"].animate({width:c.plotSizeX+99},e);b.animate=null;b.animationTimeout=setTimeout(function(){b.afterAnimate()},e.duration)}},afterAnimate:function(){var a=this.chart,b=this.sharedClipKey,c=this.group;c&&this.options.clip!==!1&&(c.clip(a.clipRect),this.markerGroup.clip());setTimeout(function(){b&&a[b]&&(a[b]=a[b].destroy(),a[b+"m"]=a[b+"m"].destroy())},100)},drawPoints:function(){var a,
+b=this.points,c=this.chart,d,e,f,g,h,i,j,k,l=this.options.marker,m,p=this.markerGroup;if(l.enabled||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=P(g.plotX),e=g.plotY,k=g.graphic,i=g.marker||{},a=l.enabled&&i.enabled===w||i.enabled,m=c.isInsidePlot(t(d),e,c.inverted),a&&e!==w&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""],h=a.r,i=o(i.symbol,this.symbol),j=i.indexOf("url")===0,k)k.attr({visibility:m?Z?"inherit":"visible":"hidden"}).animate(r({x:d-h,y:e-h},k.symbolName?{width:2*
+h,height:2*h}:{}));else{if(m&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(p)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=o(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=Y[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color,h={stroke:g,fill:g},i=a.points||[],j=[],k,l=a.pointAttrToOptions,m=b.negativeColor,p=c.lineColor,q;
+b.marker?(e.radius=e.radius||c.radius+2,e.lineWidth=e.lineWidth||c.lineWidth+1):e.color=e.color||ra(e.color||g).brighten(e.brightness).get();j[""]=a.convertAttribs(c,h);n(["hover","select"],function(b){j[b]=a.convertAttribs(d[b],j[""])});a.pointAttr=j;for(g=i.length;g--;){h=i[g];if((c=h.options&&h.options.marker||h.options)&&c.enabled===!1)c.radius=0;if(h.negative&&m)h.color=h.fillColor=m;f=b.colorByPoint||h.color;if(h.options)for(q in l)u(c[l[q]])&&(f=!0);if(f){c=c||{};k=[];d=c.states||{};f=d.hover=
+d.hover||{};if(!b.marker)f.color=ra(f.color||h.color).brighten(f.brightness||e.brightness).get();k[""]=a.convertAttribs(r({color:h.color,fillColor:h.color,lineColor:p===null?h.color:w},c),j[""]);k.hover=a.convertAttribs(d.hover,j.hover,k[""]);k.select=a.convertAttribs(d.select,j.select,k[""])}else k=j;h.pointAttr=k}},update:function(a,b){var c=this.chart,d=this.type,e=W[d].prototype,f,a=x(this.userOptions,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1);
+for(f in e)e.hasOwnProperty(f)&&(this[f]=w);r(this,W[a.type||d].prototype);this.init(c,a);o(b,!0)&&c.redraw(!1)},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(oa),d,e,f=a.data||[],g,h,i;z(a,"destroy");aa(a);n(["xAxis","yAxis"],function(b){if(i=a[b])ga(i.series,a),i.isDirty=i.forceRedraw=!0,i.stacks={}});a.legendItem&&a.chart.legend.destroyItem(a);for(e=f.length;e--;)(g=f[e])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);n("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","),
+function(b){a[b]&&(d=c&&b==="group"?"hide":"destroy",a[b][d]())});if(b.hoverSeries===a)b.hoverSeries=null;ga(b.series,a);for(h in a)delete a[h]},drawDataLabels:function(){var a=this,b=a.options.dataLabels,c=a.points,d,e,f,g;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),g=a.plotGroup("dataLabelsGroup","data-labels",a.visible?"visible":"hidden",b.zIndex||6),e=b,n(c,function(c){var i,j=c.dataLabel,k,l,m=c.connector,p=!0;d=c.options&&c.options.dataLabels;i=o(d&&d.enabled,e.enabled);
+if(j&&!i)c.dataLabel=j.destroy();else if(i){b=x(e,d);i=b.rotation;k=c.getLabelConfig();f=b.format?Ca(b.format,k):b.formatter.call(k,b);b.style.color=o(b.color,b.style.color,a.color,"black");if(j)if(u(f))j.attr({text:f}),p=!1;else{if(c.dataLabel=j=j.destroy(),m)c.connector=m.destroy()}else if(u(f)){j={fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth,r:b.borderRadius||0,rotation:i,padding:b.padding,zIndex:1};for(l in j)j[l]===w&&delete j[l];j=c.dataLabel=a.chart.renderer[i?"text":
+"label"](f,0,-999,null,null,null,b.useHTML).attr(j).css(b.style).add(g).shadow(b.shadow)}j&&a.alignDataLabel(c,j,b,null,p)}})},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=o(a.plotX,-999),i=o(a.plotY,-999),j=b.getBBox();if(a=this.visible&&f.isInsidePlot(a.plotX,a.plotY,g))d=r({x:g?f.plotWidth-i:h,y:t(g?f.plotHeight-h:i),width:0,height:0},d),r(c,{width:j.width,height:j.height}),c.rotation?(g={align:c.align,x:d.x+c.x+d.width/2,y:d.y+c.y+d.height/2},b[e?"attr":"animate"](g)):(b.align(c,
+null,d),g=b.alignAttr,o(c.overflow,"justify")==="justify"?this.justifyDataLabel(b,c,g,j,d,e):o(c.crop,!0)&&(a=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+j.width,g.y+j.height)));a||b.attr({y:-999})},justifyDataLabel:function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k;j=c.x;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0;j=c.y;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height;if(j>g.plotHeight)i===
+"top"?b.verticalAlign="bottom":b.y=g.plotHeight-j,k=!0;if(k)a.placed=!f,a.align(b,null,e)},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;n(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?"L":"M"),d&&f&&(i=a[f-1],d==="right"?c.push(i.plotX,h):d==="center"?c.push((i.plotX+g)/2,i.plotY,(i.plotX+g)/2,h):c.push(g,i.plotY)),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];n(a.segments,function(e){c=
+a.getSegmentPath(e);e.length>1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color]],d=b.lineWidth,e=b.dashStyle,f=this.getGraphPath(),g=b.negativeColor;g&&c.push(["graphNeg",g]);n(c,function(c,g){var j=c[0],k=a[j];if(k)Wa(k),k.animate({d:f});else if(d&&f.length)k={stroke:c[1],"stroke-width":d,zIndex:1},e?k.dashstyle=e:k["stroke-linecap"]=k["stroke-linejoin"]="round",a[j]=a.chart.renderer.path(f).attr(k).add(a.group).shadow(!g&&
+b.shadow)})},clipNeg:function(){var a=this.options,b=this.chart,c=b.renderer,d=a.negativeColor||a.negativeFillColor,e,f=this.graph,g=this.area,h=this.posClip,i=this.negClip;e=b.chartWidth;var j=b.chartHeight,k=s(e,j),l=this.yAxis;if(d&&(f||g)){d=t(l.toPixels(a.threshold||0,!0));a={x:0,y:0,width:k,height:d};k={x:0,y:d,width:k,height:k};if(b.inverted)a.height=k.y=b.plotWidth-d,c.isVML&&(a={x:b.plotWidth-d-b.plotLeft,y:0,width:e,height:j},k={x:d+b.plotLeft-e,y:0,width:b.plotLeft+d,height:e});l.reversed?
+(b=k,e=a):(b=a,e=k);h?(h.animate(b),i.animate(e)):(this.posClip=h=c.clipRect(b),this.negClip=i=c.clipRect(e),f&&this.graphNeg&&(f.clip(h),this.graphNeg.clip(i)),g&&(g.clip(h),this.areaNeg.clip(i)))}},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};n(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)J(c,"resize",a),J(b,"destroy",function(){aa(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a],
+g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e));f[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){return{translateX:this.xAxis?this.xAxis.left:this.chart.plotLeft,translateY:this.yAxis?this.yAxis.top:this.chart.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this.chart,b,c=this.options,d=c.animation&&!!this.animate&&a.renderer.isSVG,e=this.visible?"visible":"hidden",f=c.zIndex,g=this.hasRendered,h=a.seriesGroup;b=this.plotGroup("group",
+"series",e,f,h);this.markerGroup=this.plotGroup("markerGroup","markers",e,f,h);d&&this.animate(!0);this.getAttribs();b.inverted=this.isCartesian?a.inverted:!1;this.drawGraph&&(this.drawGraph(),this.clipNeg());this.drawDataLabels();this.drawPoints();this.options.enableMouseTracking!==!1&&this.drawTracker();a.inverted&&this.invertGroups();c.clip!==!1&&!this.sharedClipKey&&!g&&b.clip(a.clipRect);d?this.animate():g||this.afterAnimate();this.isDirty=this.isDirtyData=!1;this.hasRendered=!0},redraw:function(){var a=
+this.chart,b=this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:o(d&&d.left,a.plotLeft),translateY:o(e&&e.top,a.plotTop)}));this.translate();this.setTooltipPoints(!0);this.render();b&&z(this,"updatedData")},setState:function(a){var b=this.options,c=this.graph,d=this.graphNeg,e=b.states,b=b.lineWidth,a=a||"";if(this.state!==a)this.state=a,e[a]&&e[a].enabled===!1||(a&&(b=e[a].lineWidth||b+1),c&&!c.dashstyle&&
+(a={"stroke-width":b},c.attr(a),d&&d.attr(a)))},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===w?!h:a)?"show":"hide";n(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&n(d.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});n(c.linkedSeries,function(b){b.setVisible(a,
+!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();z(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===w?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;z(this,a?"select":"unselect")},drawTracker:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,l=k&&{cursor:k},k=a.singlePoints,m,p=function(){if(f.hoverSeries!==
+a)a.onMouseOver()};if(e&&!c)for(m=e+1;m--;)d[m]==="M"&&d.splice(m+1,0,d[m+1]-i,d[m+2],"L"),(m&&d[m]==="M"||m===e)&&d.splice(m,0,"L",d[m-2]+i,d[m-1]);for(m=0;m<k.length;m++)e=k[m],d.push("M",e.plotX-i,e.plotY,"L",e.plotX+i,e.plotY);j?j.attr({d:d}):(a.tracker=h.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?"visible":"hidden",stroke:Qb,fill:c?Qb:S,"stroke-width":b.lineWidth+(c?0:2*i),zIndex:2}).add(a.group),n([a.tracker,a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover",
+p).on("mouseout",function(a){g.onTrackerMouseOut(a)}).css(l);if(ib)a.on("touchstart",p)}))}};G=ha(Q);W.line=G;Y.area=x(X,{threshold:0});G=ha(Q,{type:"area",getSegments:function(){var a=[],b=[],c=[],d=this.xAxis,e=this.yAxis,f=e.stacks[this.stackKey],g={},h,i,j=this.points,k=this.options.connectNulls,l,m,p;if(this.options.stacking&&!this.cropped){for(m=0;m<j.length;m++)g[j[m].x]=j[m];for(p in f)c.push(+p);c.sort(function(a,b){return a-b});n(c,function(a){if(!k||g[a]&&g[a].y!==null)g[a]?b.push(g[a]):
+(h=d.translate(a),l=f[a].percent?f[a].total?f[a].cum*100/f[a].total:0:f[a].cum,i=e.toPixels(l,!0),b.push({y:null,plotX:h,clientX:h,plotY:i,yBottom:i,onMouseOver:pa}))});b.length&&a.push(b)}else Q.prototype.getSegments.call(this),a=this.segments;this.segments=a},getSegmentPath:function(a){var b=Q.prototype.getSegmentPath.call(this,a),c=[].concat(b),d,e=this.options;d=b.length;var f=this.yAxis.getThreshold(e.threshold),g;d===3&&c.push("L",b[1],b[2]);if(e.stacking&&!this.closedStacks)for(d=a.length-
+1;d>=0;d--)g=o(a[d].yBottom,f),d<a.length-1&&e.step&&c.push(a[d+1].plotX,g),c.push(a[d].plotX,g);else this.closeSegment(c,a,f);this.areaPath=this.areaPath.concat(c);return b},closeSegment:function(a,b,c){a.push("L",b[b.length-1].plotX,c,"L",b[0].plotX,c)},drawGraph:function(){this.areaPath=[];Q.prototype.drawGraph.apply(this);var a=this,b=this.areaPath,c=this.options,d=c.negativeColor,e=c.negativeFillColor,f=[["area",this.color,c.fillColor]];(d||e)&&f.push(["areaNeg",d,e]);n(f,function(d){var e=d[0],
+f=a[e];f?f.animate({d:b}):a[e]=a.chart.renderer.path(b).attr({fill:o(d[2],ra(d[1]).setOpacity(o(c.fillOpacity,0.75)).get()),zIndex:0}).add(a.group)})},drawLegendSymbol:function(a,b){b.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,a.options.symbolWidth,12,2).attr({zIndex:3}).add(b.legendGroup)}});W.area=G;Y.spline=x(X);F=ha(Q,{type:"spline",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,f=a[c-1],g=a[c+1],h,i,j,k;if(f&&g){a=f.plotY;j=g.plotX;var g=g.plotY,l;h=(1.5*d+f.plotX)/2.5;i=(1.5*
+e+a)/2.5;j=(1.5*d+j)/2.5;k=(1.5*e+g)/2.5;l=(k-i)*(j-d)/(j-h)+e-k;i+=l;k+=l;i>a&&i>e?(i=s(a,e),k=2*e-i):i<a&&i<e&&(i=I(a,e),k=2*e-i);k>g&&k>e?(k=s(g,e),i=2*e-k):k<g&&k<e&&(k=I(g,e),i=2*e-k);b.rightContX=j;b.rightContY=k}c?(b=["C",f.rightContX||f.plotX,f.rightContY||f.plotY,h||d,i||e,d,e],f.rightContX=f.rightContY=null):b=["M",d,e];return b}});W.spline=F;Y.areaspline=x(Y.area);ma=G.prototype;F=ha(F,{type:"areaspline",closedStacks:!0,getSegmentPath:ma.getSegmentPath,closeSegment:ma.closeSegment,drawGraph:ma.drawGraph,
+drawLegendSymbol:ma.drawLegendSymbol});W.areaspline=F;Y.column=x(X,{borderColor:"#FFFFFF",borderWidth:1,borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},stickyTracking:!1,threshold:0});F=ha(Q,{type:"column",pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color",
+r:"borderRadius"},cropShoulder:0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){Q.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},getColumnMetrics:function(){var a=this,b=a.options,c=a.xAxis,d=a.yAxis,e=c.reversed,f,g={},h,i=0;b.grouping===!1?i=1:n(a.chart.series,function(b){var c=b.options,e=b.yAxis;if(b.type===a.type&&b.visible&&d.len===e.len&&d.pos===e.pos)c.stacking?(f=b.stackKey,g[f]===
+w&&(g[f]=i++),h=g[f]):c.grouping!==!1&&(h=i++),b.columnIndex=h});var c=I(N(c.transA)*(c.ordinalSlope||b.pointRange||c.closestPointRange||1),c.len),j=c*b.groupPadding,k=(c-2*j)/i,l=b.pointWidth,b=u(l)?(k-l)/2:k*b.pointPadding,l=o(l,k-2*b);return a.columnMetrics={width:l,offset:b+(j+((e?i-(a.columnIndex||0):a.columnIndex)||0)*k-c/2)*(e?-1:1)}},translate:function(){var a=this.chart,b=this.options,c=b.borderWidth,d=this.yAxis,e=this.translatedThreshold=d.getThreshold(b.threshold),f=o(b.minPointLength,
+5),b=this.getColumnMetrics(),g=b.width,h=this.barW=xa(s(g,1+2*c)),i=this.pointXOffset=b.offset,j=-(c%2?0.5:0),k=c%2?0.5:1;a.renderer.isVML&&a.inverted&&(k+=1);Q.prototype.translate.apply(this);n(this.points,function(a){var b=o(a.yBottom,e),c=I(s(-999-b,a.plotY),d.len+999+b),n=a.plotX+i,u=h,r=I(c,b),w,c=s(c,b)-r;N(c)<f&&f&&(c=f,r=t(N(r-e)>f?b-f:e-(d.translate(a.y,0,1,0,1)<=e?f:0)));a.barX=n;a.pointWidth=g;b=N(n)<0.5;u=t(n+u)+j;n=t(n)+j;u-=n;w=N(r)<0.5;c=t(r+c)+k;r=t(r)+k;c-=r;b&&(n+=1,u-=1);w&&(r-=
+1,c+=1);a.shapeType="rect";a.shapeArgs={x:n,y:r,width:u,height:c}})},getSymbol:pa,drawLegendSymbol:G.prototype.drawLegendSymbol,drawGraph:pa,drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d;n(a.points,function(e){var f=e.plotY,g=e.graphic;if(f!==w&&!isNaN(f)&&e.y!==null)d=e.shapeArgs,g?(Wa(g),g.animate(x(d))):e.graphic=c[e.shapeType](d).attr(e.pointAttr[e.selected?"select":""]).add(a.group).shadow(b.shadow,null,b.stacking&&!b.borderRadius);else if(g)e.graphic=g.destroy()})},drawTracker:function(){var a=
+this,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(c){var d=c.target,e;if(b.hoverSeries!==a)a.onMouseOver();for(;d&&!e;)e=d.point,d=d.parentNode;if(e!==w&&e!==b.hoverPoint)e.onMouseOver(c)};n(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)n(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),ib))a[b].on("touchstart",
+f)}),a._hasTracking=!0},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=a.dlBox||a.shapeArgs,i=a.below||a.plotY>o(this.translatedThreshold,f.plotSizeY),j=o(c.inside,!!this.options.stacking);if(h&&(d=x(h),g&&(d={x:f.plotWidth-d.y-d.height,y:f.plotHeight-d.x-d.width,width:d.height,height:d.width}),!j))g?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=o(c.align,!g||j?"center":i?"right":"left");c.verticalAlign=o(c.verticalAlign,g||j?"middle":i?"top":"bottom");Q.prototype.alignDataLabel.call(this,
+a,b,c,d,e)},animate:function(a){var b=this.yAxis,c=this.options,d=this.chart.inverted,e={};if(Z)a?(e.scaleY=0.001,a=I(b.pos+b.len,s(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):(e.scaleY=1,e[d?"translateX":"translateY"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0});Q.prototype.remove.apply(a,arguments)}});W.column=F;Y.bar=
+x(Y.column);ma=ha(F,{type:"bar",inverted:!0});W.bar=ma;Y.scatter=x(X,{lineWidth:0,tooltip:{headerFormat:'<span style="font-size: 10px; color:{series.color}">{series.name}</span><br/>',pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>",followPointer:!0},stickyTracking:!1});ma=ha(Q,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup"],drawTracker:F.prototype.drawTracker,setTooltipPoints:pa});W.scatter=ma;Y.pie=x(X,{borderColor:"#FFFFFF",borderWidth:1,
+center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});X={type:"pie",isCartesian:!1,pointClass:ha(Pa,{init:function(){Pa.prototype.init.apply(this,arguments);var a=this,b;if(a.y<0)a.y=null;r(a,{visible:a.visible!==!1,name:o(a.name,"Slice")});b=function(b){a.slice(b.type===
+"select")};J(a,"select",b);J(a,"unselect",b);return a},setVisible:function(a){var b=this,c=b.series,d=c.chart,e;b.visible=b.options.visible=a=a===w?!b.visible:a;c.options.data[qa(b,c.data)]=b.options;e=a?"show":"hide";n(["graphic","dataLabel","connector","shadowGroup"],function(a){if(b[a])b[a][e]()});b.legendItem&&d.legend.colorizeItem(b,a);if(!c.isDirty&&c.options.ignoreHiddenPoint)c.isDirty=!0,d.redraw()},slice:function(a,b,c){var d=this.series;La(c,d.chart);o(b,!0);this.sliced=this.options.sliced=
+a=u(a)?a:!this.sliced;d.options.data[qa(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:pa,animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)n(c,function(a){var c=a.graphic,a=a.shapeArgs;c&&(c.attr({r:b.center[3]/
+2,start:d,end:d}),c.animate({r:a.r,start:a.start,end:a.end},b.options.animation))}),b.animate=null},setData:function(a,b){Q.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();o(b,!0)&&this.chart.redraw()},generatePoints:function(){var a,b=0,c,d,e,f=this.options.ignoreHiddenPoint;Q.prototype.generatePoints.call(this);c=this.points;d=c.length;for(a=0;a<d;a++)e=c[a],b+=f&&!e.visible?0:e.y;this.total=b;for(a=0;a<d;a++)e=c[a],e.percentage=b>0?e.y/b*100:0,e.total=b},getCenter:function(){var a=
+this.options,b=this.chart,c=2*(a.slicedOffset||0),d,e=b.plotWidth-2*c,f=b.plotHeight-2*c,b=a.center,a=[o(b[0],"50%"),o(b[1],"50%"),a.size||"100%",a.innerSize||0],g=I(e,f),h;return Na(a,function(a,b){h=/%$/.test(a);d=b<2||b===2&&h;return(h?[e,f,g,g][b]*C(a)/100:a)+(d?c:0)})},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=ya/180*(i-90),i=(this.endAngleRad=ya/180*((c.endAngle||i+360)-90))-j,k=this.points,
+l=c.dataLabels.distance,c=c.ignoreHiddenPoint,m,n=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=R.asin((b-a[1])/(a[2]/2+l));return a[0]+(c?-1:1)*V(h)*(a[2]/2+l)};for(m=0;m<n;m++){o=k[m];f=j+b*i;if(!c||o.visible)b+=o.percentage/100;g=j+b*i;o.shapeType="arc";o.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:t(f*1E3)/1E3,end:t(g*1E3)/1E3};h=(g+f)/2;h>0.75*i&&(h-=2*ya);o.slicedTranslation={translateX:t(V(h)*d),translateY:t(ca(h)*d)};f=V(h)*a[2]/2;g=ca(h)*a[2]/2;o.tooltipPos=
+[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-ya/2||h>ya/2?1:0;o.angle=h;e=I(e,l/2);o.labelPos=[a[0]+f+V(h)*l,a[1]+g+ca(h)*l,a[0]+f+V(h)*e,a[1]+g+ca(h)*e,a[0]+f,a[1]+g,l<0?"center":o.half?"right":"left",h]}},setTooltipPoints:pa,drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);n(a.points,function(h){d=h.graphic;g=h.shapeArgs;f=h.shadowGroup;if(e&&!f)f=h.shadowGroup=b.g("shadow").add(a.shadowGroup);c=h.sliced?
+h.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);d?d.animate(r(g,c)):h.graphic=d=b.arc(g).setRadialReference(a.center).attr(h.pointAttr[h.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(c).add(a.group).shadow(e,f);h.visible===!1&&h.setVisible(!1)})},sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawDataLabels:function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=o(e.connectorPadding,10),g=o(e.connectorWidth,1),
+h=d.plotWidth,d=d.plotHeight,i,j,k=o(e.softConnector,!0),l=e.distance,m=a.center,p=m[2]/2,q=m[1],u=l>0,r,w,v,x,C=[[],[]],y,z,E,H,B,D=[0,0,0,0],I=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){Q.prototype.drawDataLabels.apply(a);n(b,function(a){a.dataLabel&&C[a.half].push(a)});for(H=0;!x&&b[H];)x=b[H]&&b[H].dataLabel&&(b[H].dataLabel.getBBox().height||21),H++;for(H=2;H--;){var b=[],K=[],G=C[H],J=G.length,F;a.sortByAngle(G,H-0.5);if(l>0){for(B=q-p-l;B<=q+p+l;B+=x)b.push(B);
+w=b.length;if(J>w){c=[].concat(G);c.sort(I);for(B=J;B--;)c[B].rank=B;for(B=J;B--;)G[B].rank>=w&&G.splice(B,1);J=G.length}for(B=0;B<J;B++){c=G[B];v=c.labelPos;c=9999;var O,M;for(M=0;M<w;M++)O=N(b[M]-v[1]),O<c&&(c=O,F=M);if(F<B&&b[B]!==null)F=B;else for(w<J-B+F&&b[B]!==null&&(F=w-J+B);b[F]===null;)F++;K.push({i:F,y:b[F]});b[F]=null}K.sort(I)}for(B=0;B<J;B++){c=G[B];v=c.labelPos;r=c.dataLabel;E=c.visible===!1?"hidden":"visible";c=v[1];if(l>0){if(w=K.pop(),F=w.i,z=w.y,c>z&&b[F+1]!==null||c<z&&b[F-1]!==
+null)z=c}else z=c;y=e.justify?m[0]+(H?-1:1)*(p+l):a.getX(F===0||F===b.length-1?c:z,H);r._attr={visibility:E,align:v[6]};r._pos={x:y+e.x+({left:f,right:-f}[v[6]]||0),y:z+e.y-10};r.connX=y;r.connY=z;if(this.options.size===null)w=r.width,y-w<f?D[3]=s(t(w-y+f),D[3]):y+w>h-f&&(D[1]=s(t(y+w-h+f),D[1])),z-x/2<0?D[0]=s(t(-z+x/2),D[0]):z+x/2>d&&(D[2]=s(t(z+x/2-d),D[2]))}}if(va(D)===0||this.verifyDataLabelOverflow(D))this.placeDataLabels(),u&&g&&n(this.points,function(b){i=b.connector;v=b.labelPos;if((r=b.dataLabel)&&
+r._pos)E=r._attr.visibility,y=r.connX,z=r.connY,j=k?["M",y+(v[6]==="left"?5:-5),z,"C",y,z,2*v[2]-v[4],2*v[3]-v[5],v[2],v[3],"L",v[4],v[5]]:["M",y+(v[6]==="left"?5:-5),z,"L",v[2],v[3],"L",v[4],v[5]],i?(i.animate({d:j}),i.attr("visibility",E)):b.connector=i=a.chart.renderer.path(j).attr({"stroke-width":g,stroke:e.connectorColor||b.color||"#606060",visibility:E}).add(a.group);else if(i)b.connector=i.destroy()})}},verifyDataLabelOverflow:function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize||
+80,f;d[0]!==null?e=s(b[2]-s(a[1],a[3]),c):(e=s(b[2]-a[1]-a[3],c),b[0]+=(a[3]-a[1])/2);d[1]!==null?e=s(I(e,b[2]-s(a[0],a[2])),c):(e=s(I(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);e<b[2]?(b[2]=e,this.translate(b),n(this.points,function(a){if(a.dataLabel)a.dataLabel._pos=null}),this.drawDataLabels()):f=!0;return f},placeDataLabels:function(){n(this.points,function(a){var a=a.dataLabel,b;if(a)(b=a._pos)?(a.attr(a._attr),a[a.moved?"animate":"attr"](b),a.moved=!0):a&&a.attr({y:-999})})},alignDataLabel:pa,
+drawTracker:F.prototype.drawTracker,drawLegendSymbol:G.prototype.drawLegendSymbol,getSymbol:pa};X=ha(Q,X);W.pie=X;r(Highcharts,{Axis:db,Chart:yb,Color:ra,Legend:eb,Pointer:xb,Point:Pa,Tick:Ma,Tooltip:wb,Renderer:Va,Series:Q,SVGElement:wa,SVGRenderer:Ha,arrayMin:Ja,arrayMax:va,charts:Ga,dateFormat:Xa,format:Ca,pathAnim:Ab,getOptions:function(){return M},hasBidiBug:Ub,isTouchDevice:Ob,numberFormat:Aa,seriesTypes:W,setOptions:function(a){M=x(M,a);Lb();return M},addEvent:J,removeEvent:aa,createElement:U,
+discardElement:Ta,css:K,each:n,extend:r,map:Na,merge:x,pick:o,splat:ja,extendClass:ha,pInt:C,wrap:mb,svg:Z,canvas:$,vml:!Z&&!$,product:"Highcharts",version:"3.0.6"})})();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts.src.js
new file mode 100644
index 0000000..a29b0fa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/highcharts.src.js
@@ -0,0 +1,16974 @@
+// ==ClosureCompiler==
+// @compilation_level SIMPLE_OPTIMIZATIONS
+
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ *
+ * (c) 2009-2013 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console, each, grep */
+
+(function () {
+// encapsulated variables
+var UNDEFINED,
+	doc = document,
+	win = window,
+	math = Math,
+	mathRound = math.round,
+	mathFloor = math.floor,
+	mathCeil = math.ceil,
+	mathMax = math.max,
+	mathMin = math.min,
+	mathAbs = math.abs,
+	mathCos = math.cos,
+	mathSin = math.sin,
+	mathPI = math.PI,
+	deg2rad = mathPI * 2 / 360,
+
+
+	// some variables
+	userAgent = navigator.userAgent,
+	isOpera = win.opera,
+	isIE = /msie/i.test(userAgent) && !isOpera,
+	docMode8 = doc.documentMode === 8,
+	isWebKit = /AppleWebKit/.test(userAgent),
+	isFirefox = /Firefox/.test(userAgent),
+	isTouchDevice = /(Mobile|Android|Windows Phone)/.test(userAgent),
+	SVG_NS = 'http://www.w3.org/2000/svg',
+	hasSVG = !!doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect,
+	hasBidiBug = isFirefox && parseInt(userAgent.split('Firefox/')[1], 10) < 4, // issue #38
+	useCanVG = !hasSVG && !isIE && !!doc.createElement('canvas').getContext,
+	Renderer,
+	hasTouch = doc.documentElement.ontouchstart !== UNDEFINED,
+	symbolSizes = {},
+	idCounter = 0,
+	garbageBin,
+	defaultOptions,
+	dateFormat, // function
+	globalAnimation,
+	pathAnim,
+	timeUnits,
+	noop = function () {},
+	charts = [],
+	PRODUCT = 'Highcharts',
+	VERSION = '3.0.6',
+
+	// some constants for frequently used strings
+	DIV = 'div',
+	ABSOLUTE = 'absolute',
+	RELATIVE = 'relative',
+	HIDDEN = 'hidden',
+	PREFIX = 'highcharts-',
+	VISIBLE = 'visible',
+	PX = 'px',
+	NONE = 'none',
+	M = 'M',
+	L = 'L',
+	/*
+	 * Empirical lowest possible opacities for TRACKER_FILL
+	 * IE6: 0.002
+	 * IE7: 0.002
+	 * IE8: 0.002
+	 * IE9: 0.00000000001 (unlimited)
+	 * IE10: 0.0001 (exporting only)
+	 * FF: 0.00000000001 (unlimited)
+	 * Chrome: 0.000001
+	 * Safari: 0.000001
+	 * Opera: 0.00000000001 (unlimited)
+	 */
+	TRACKER_FILL = 'rgba(192,192,192,' + (hasSVG ? 0.0001 : 0.002) + ')', // invisible but clickable
+	//TRACKER_FILL = 'rgba(192,192,192,0.5)',
+	NORMAL_STATE = '',
+	HOVER_STATE = 'hover',
+	SELECT_STATE = 'select',
+	MILLISECOND = 'millisecond',
+	SECOND = 'second',
+	MINUTE = 'minute',
+	HOUR = 'hour',
+	DAY = 'day',
+	WEEK = 'week',
+	MONTH = 'month',
+	YEAR = 'year',
+
+	// constants for attributes
+	LINEAR_GRADIENT = 'linearGradient',
+	STOPS = 'stops',
+	STROKE_WIDTH = 'stroke-width',
+
+	// time methods, changed based on whether or not UTC is used
+	makeTime,
+	getMinutes,
+	getHours,
+	getDay,
+	getDate,
+	getMonth,
+	getFullYear,
+	setMinutes,
+	setHours,
+	setDate,
+	setMonth,
+	setFullYear,
+
+
+	// lookup over the types and the associated classes
+	seriesTypes = {};
+
+// The Highcharts namespace
+win.Highcharts = win.Highcharts ? error(16, true) : {};
+
+/**
+ * Extend an object with the members of another
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to add to the first one
+ */
+function extend(a, b) {
+	var n;
+	if (!a) {
+		a = {};
+	}
+	for (n in b) {
+		a[n] = b[n];
+	}
+	return a;
+}
+	
+/**
+ * Deep merge two or more objects and return a third object.
+ * Previously this function redirected to jQuery.extend(true), but this had two limitations.
+ * First, it deep merged arrays, which lead to workarounds in Highcharts. Second,
+ * it copied properties from extended prototypes. 
+ */
+function merge() {
+	var i,
+		len = arguments.length,
+		ret = {},
+		doCopy = function (copy, original) {
+			var value, key;
+
+			// An object is replacing a primitive
+			if (typeof copy !== 'object') {
+				copy = {};
+			}
+
+			for (key in original) {
+				if (original.hasOwnProperty(key)) {
+					value = original[key];
+
+					// Copy the contents of objects, but not arrays or DOM nodes
+					if (value && typeof value === 'object' && Object.prototype.toString.call(value) !== '[object Array]'
+							&& typeof value.nodeType !== 'number') {
+						copy[key] = doCopy(copy[key] || {}, value);
+				
+					// Primitives and arrays are copied over directly
+					} else {
+						copy[key] = original[key];
+					}
+				}
+			}
+			return copy;
+		};
+
+	// For each argument, extend the return
+	for (i = 0; i < len; i++) {
+		ret = doCopy(ret, arguments[i]);
+	}
+
+	return ret;
+}
+
+/**
+ * Take an array and turn into a hash with even number arguments as keys and odd numbers as
+ * values. Allows creating constants for commonly used style properties, attributes etc.
+ * Avoid it in performance critical situations like looping
+ */
+function hash() {
+	var i = 0,
+		args = arguments,
+		length = args.length,
+		obj = {};
+	for (; i < length; i++) {
+		obj[args[i++]] = args[i];
+	}
+	return obj;
+}
+
+/**
+ * Shortcut for parseInt
+ * @param {Object} s
+ * @param {Number} mag Magnitude
+ */
+function pInt(s, mag) {
+	return parseInt(s, mag || 10);
+}
+
+/**
+ * Check for string
+ * @param {Object} s
+ */
+function isString(s) {
+	return typeof s === 'string';
+}
+
+/**
+ * Check for object
+ * @param {Object} obj
+ */
+function isObject(obj) {
+	return typeof obj === 'object';
+}
+
+/**
+ * Check for array
+ * @param {Object} obj
+ */
+function isArray(obj) {
+	return Object.prototype.toString.call(obj) === '[object Array]';
+}
+
+/**
+ * Check for number
+ * @param {Object} n
+ */
+function isNumber(n) {
+	return typeof n === 'number';
+}
+
+function log2lin(num) {
+	return math.log(num) / math.LN10;
+}
+function lin2log(num) {
+	return math.pow(10, num);
+}
+
+/**
+ * Remove last occurence of an item from an array
+ * @param {Array} arr
+ * @param {Mixed} item
+ */
+function erase(arr, item) {
+	var i = arr.length;
+	while (i--) {
+		if (arr[i] === item) {
+			arr.splice(i, 1);
+			break;
+		}
+	}
+	//return arr;
+}
+
+/**
+ * Returns true if the object is not null or undefined. Like MooTools' $.defined.
+ * @param {Object} obj
+ */
+function defined(obj) {
+	return obj !== UNDEFINED && obj !== null;
+}
+
+/**
+ * Set or get an attribute or an object of attributes. Can't use jQuery attr because
+ * it attempts to set expando properties on the SVG element, which is not allowed.
+ *
+ * @param {Object} elem The DOM element to receive the attribute(s)
+ * @param {String|Object} prop The property or an abject of key-value pairs
+ * @param {String} value The value if a single property is set
+ */
+function attr(elem, prop, value) {
+	var key,
+		setAttribute = 'setAttribute',
+		ret;
+
+	// if the prop is a string
+	if (isString(prop)) {
+		// set the value
+		if (defined(value)) {
+
+			elem[setAttribute](prop, value);
+
+		// get the value
+		} else if (elem && elem.getAttribute) { // elem not defined when printing pie demo...
+			ret = elem.getAttribute(prop);
+		}
+
+	// else if prop is defined, it is a hash of key/value pairs
+	} else if (defined(prop) && isObject(prop)) {
+		for (key in prop) {
+			elem[setAttribute](key, prop[key]);
+		}
+	}
+	return ret;
+}
+/**
+ * Check if an element is an array, and if not, make it into an array. Like
+ * MooTools' $.splat.
+ */
+function splat(obj) {
+	return isArray(obj) ? obj : [obj];
+}
+
+
+/**
+ * Return the first value that is defined. Like MooTools' $.pick.
+ */
+function pick() {
+	var args = arguments,
+		i,
+		arg,
+		length = args.length;
+	for (i = 0; i < length; i++) {
+		arg = args[i];
+		if (typeof arg !== 'undefined' && arg !== null) {
+			return arg;
+		}
+	}
+}
+
+/**
+ * Set CSS on a given element
+ * @param {Object} el
+ * @param {Object} styles Style object with camel case property names
+ */
+function css(el, styles) {
+	if (isIE) {
+		if (styles && styles.opacity !== UNDEFINED) {
+			styles.filter = 'alpha(opacity=' + (styles.opacity * 100) + ')';
+		}
+	}
+	extend(el.style, styles);
+}
+
+/**
+ * Utility function to create element with attributes and styles
+ * @param {Object} tag
+ * @param {Object} attribs
+ * @param {Object} styles
+ * @param {Object} parent
+ * @param {Object} nopad
+ */
+function createElement(tag, attribs, styles, parent, nopad) {
+	var el = doc.createElement(tag);
+	if (attribs) {
+		extend(el, attribs);
+	}
+	if (nopad) {
+		css(el, {padding: 0, border: NONE, margin: 0});
+	}
+	if (styles) {
+		css(el, styles);
+	}
+	if (parent) {
+		parent.appendChild(el);
+	}
+	return el;
+}
+
+/**
+ * Extend a prototyped class by new members
+ * @param {Object} parent
+ * @param {Object} members
+ */
+function extendClass(parent, members) {
+	var object = function () {};
+	object.prototype = new parent();
+	extend(object.prototype, members);
+	return object;
+}
+
+/**
+ * Format a number and return a string based on input settings
+ * @param {Number} number The input number to format
+ * @param {Number} decimals The amount of decimals
+ * @param {String} decPoint The decimal point, defaults to the one given in the lang options
+ * @param {String} thousandsSep The thousands separator, defaults to the one given in the lang options
+ */
+function numberFormat(number, decimals, decPoint, thousandsSep) {
+	var lang = defaultOptions.lang,
+		// http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format/
+		n = +number || 0,
+		c = decimals === -1 ?
+			(n.toString().split('.')[1] || '').length : // preserve decimals
+			(isNaN(decimals = mathAbs(decimals)) ? 2 : decimals),
+		d = decPoint === undefined ? lang.decimalPoint : decPoint,
+		t = thousandsSep === undefined ? lang.thousandsSep : thousandsSep,
+		s = n < 0 ? "-" : "",
+		i = String(pInt(n = mathAbs(n).toFixed(c))),
+		j = i.length > 3 ? i.length % 3 : 0;
+
+	return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) +
+		(c ? d + mathAbs(n - i).toFixed(c).slice(2) : "");
+}
+
+/**
+ * Pad a string to a given length by adding 0 to the beginning
+ * @param {Number} number
+ * @param {Number} length
+ */
+function pad(number, length) {
+	// Create an array of the remaining length +1 and join it with 0's
+	return new Array((length || 2) + 1 - String(number).length).join(0) + number;
+}
+
+/**
+ * Wrap a method with extended functionality, preserving the original function
+ * @param {Object} obj The context object that the method belongs to 
+ * @param {String} method The name of the method to extend
+ * @param {Function} func A wrapper function callback. This function is called with the same arguments
+ * as the original function, except that the original function is unshifted and passed as the first 
+ * argument. 
+ */
+function wrap(obj, method, func) {
+	var proceed = obj[method];
+	obj[method] = function () {
+		var args = Array.prototype.slice.call(arguments);
+		args.unshift(proceed);
+		return func.apply(this, args);
+	};
+}
+
+/**
+ * Based on http://www.php.net/manual/en/function.strftime.php
+ * @param {String} format
+ * @param {Number} timestamp
+ * @param {Boolean} capitalize
+ */
+dateFormat = function (format, timestamp, capitalize) {
+	if (!defined(timestamp) || isNaN(timestamp)) {
+		return 'Invalid date';
+	}
+	format = pick(format, '%Y-%m-%d %H:%M:%S');
+
+	var date = new Date(timestamp),
+		key, // used in for constuct below
+		// get the basic time values
+		hours = date[getHours](),
+		day = date[getDay](),
+		dayOfMonth = date[getDate](),
+		month = date[getMonth](),
+		fullYear = date[getFullYear](),
+		lang = defaultOptions.lang,
+		langWeekdays = lang.weekdays,
+
+		// List all format keys. Custom formats can be added from the outside. 
+		replacements = extend({
+
+			// Day
+			'a': langWeekdays[day].substr(0, 3), // Short weekday, like 'Mon'
+			'A': langWeekdays[day], // Long weekday, like 'Monday'
+			'd': pad(dayOfMonth), // Two digit day of the month, 01 to 31
+			'e': dayOfMonth, // Day of the month, 1 through 31
+
+			// Week (none implemented)
+			//'W': weekNumber(),
+
+			// Month
+			'b': lang.shortMonths[month], // Short month, like 'Jan'
+			'B': lang.months[month], // Long month, like 'January'
+			'm': pad(month + 1), // Two digit month number, 01 through 12
+
+			// Year
+			'y': fullYear.toString().substr(2, 2), // Two digits year, like 09 for 2009
+			'Y': fullYear, // Four digits year, like 2009
+
+			// Time
+			'H': pad(hours), // Two digits hours in 24h format, 00 through 23
+			'I': pad((hours % 12) || 12), // Two digits hours in 12h format, 00 through 11
+			'l': (hours % 12) || 12, // Hours in 12h format, 1 through 12
+			'M': pad(date[getMinutes]()), // Two digits minutes, 00 through 59
+			'p': hours < 12 ? 'AM' : 'PM', // Upper case AM or PM
+			'P': hours < 12 ? 'am' : 'pm', // Lower case AM or PM
+			'S': pad(date.getSeconds()), // Two digits seconds, 00 through  59
+			'L': pad(mathRound(timestamp % 1000), 3) // Milliseconds (naming from Ruby)
+		}, Highcharts.dateFormats);
+
+
+	// do the replaces
+	for (key in replacements) {
+		while (format.indexOf('%' + key) !== -1) { // regex would do it in one line, but this is faster
+			format = format.replace('%' + key, typeof replacements[key] === 'function' ? replacements[key](timestamp) : replacements[key]);
+		}
+	}
+
+	// Optionally capitalize the string and return
+	return capitalize ? format.substr(0, 1).toUpperCase() + format.substr(1) : format;
+};
+
+/** 
+ * Format a single variable. Similar to sprintf, without the % prefix.
+ */
+function formatSingle(format, val) {
+	var floatRegex = /f$/,
+		decRegex = /\.([0-9])/,
+		lang = defaultOptions.lang,
+		decimals;
+
+	if (floatRegex.test(format)) { // float
+		decimals = format.match(decRegex);
+		decimals = decimals ? decimals[1] : -1;
+		val = numberFormat(
+			val,
+			decimals,
+			lang.decimalPoint,
+			format.indexOf(',') > -1 ? lang.thousandsSep : ''
+		);
+	} else {
+		val = dateFormat(format, val);
+	}
+	return val;
+}
+
+/**
+ * Format a string according to a subset of the rules of Python's String.format method.
+ */
+function format(str, ctx) {
+	var splitter = '{',
+		isInside = false,
+		segment,
+		valueAndFormat,
+		path,
+		i,
+		len,
+		ret = [],
+		val,
+		index;
+	
+	while ((index = str.indexOf(splitter)) !== -1) {
+		
+		segment = str.slice(0, index);
+		if (isInside) { // we're on the closing bracket looking back
+			
+			valueAndFormat = segment.split(':');
+			path = valueAndFormat.shift().split('.'); // get first and leave format
+			len = path.length;
+			val = ctx;
+
+			// Assign deeper paths
+			for (i = 0; i < len; i++) {
+				val = val[path[i]];
+			}
+
+			// Format the replacement
+			if (valueAndFormat.length) {
+				val = formatSingle(valueAndFormat.join(':'), val);
+			}
+
+			// Push the result and advance the cursor
+			ret.push(val);
+			
+		} else {
+			ret.push(segment);
+			
+		}
+		str = str.slice(index + 1); // the rest
+		isInside = !isInside; // toggle
+		splitter = isInside ? '}' : '{'; // now look for next matching bracket
+	}
+	ret.push(str);
+	return ret.join('');
+}
+
+/**
+ * Get the magnitude of a number
+ */
+function getMagnitude(num) {
+	return math.pow(10, mathFloor(math.log(num) / math.LN10));
+}
+
+/**
+ * Take an interval and normalize it to multiples of 1, 2, 2.5 and 5
+ * @param {Number} interval
+ * @param {Array} multiples
+ * @param {Number} magnitude
+ * @param {Object} options
+ */
+function normalizeTickInterval(interval, multiples, magnitude, options) {
+	var normalized, i;
+
+	// round to a tenfold of 1, 2, 2.5 or 5
+	magnitude = pick(magnitude, 1);
+	normalized = interval / magnitude;
+
+	// multiples for a linear scale
+	if (!multiples) {
+		multiples = [1, 2, 2.5, 5, 10];
+
+		// the allowDecimals option
+		if (options && options.allowDecimals === false) {
+			if (magnitude === 1) {
+				multiples = [1, 2, 5, 10];
+			} else if (magnitude <= 0.1) {
+				multiples = [1 / magnitude];
+			}
+		}
+	}
+
+	// normalize the interval to the nearest multiple
+	for (i = 0; i < multiples.length; i++) {
+		interval = multiples[i];
+		if (normalized <= (multiples[i] + (multiples[i + 1] || multiples[i])) / 2) {
+			break;
+		}
+	}
+
+	// multiply back to the correct magnitude
+	interval *= magnitude;
+
+	return interval;
+}
+
+/**
+ * Get a normalized tick interval for dates. Returns a configuration object with
+ * unit range (interval), count and name. Used to prepare data for getTimeTicks. 
+ * Previously this logic was part of getTimeTicks, but as getTimeTicks now runs
+ * of segments in stock charts, the normalizing logic was extracted in order to 
+ * prevent it for running over again for each segment having the same interval. 
+ * #662, #697.
+ */
+function normalizeTimeTickInterval(tickInterval, unitsOption) {
+	var units = unitsOption || [[
+				MILLISECOND, // unit name
+				[1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples
+			], [
+				SECOND,
+				[1, 2, 5, 10, 15, 30]
+			], [
+				MINUTE,
+				[1, 2, 5, 10, 15, 30]
+			], [
+				HOUR,
+				[1, 2, 3, 4, 6, 8, 12]
+			], [
+				DAY,
+				[1, 2]
+			], [
+				WEEK,
+				[1, 2]
+			], [
+				MONTH,
+				[1, 2, 3, 4, 6]
+			], [
+				YEAR,
+				null
+			]],
+		unit = units[units.length - 1], // default unit is years
+		interval = timeUnits[unit[0]],
+		multiples = unit[1],
+		count,
+		i;
+		
+	// loop through the units to find the one that best fits the tickInterval
+	for (i = 0; i < units.length; i++) {
+		unit = units[i];
+		interval = timeUnits[unit[0]];
+		multiples = unit[1];
+
+
+		if (units[i + 1]) {
+			// lessThan is in the middle between the highest multiple and the next unit.
+			var lessThan = (interval * multiples[multiples.length - 1] +
+						timeUnits[units[i + 1][0]]) / 2;
+
+			// break and keep the current unit
+			if (tickInterval <= lessThan) {
+				break;
+			}
+		}
+	}
+
+	// prevent 2.5 years intervals, though 25, 250 etc. are allowed
+	if (interval === timeUnits[YEAR] && tickInterval < 5 * interval) {
+		multiples = [1, 2, 5];
+	}
+
+	// get the count
+	count = normalizeTickInterval(
+		tickInterval / interval, 
+		multiples,
+		unit[0] === YEAR ? getMagnitude(tickInterval / interval) : 1 // #1913
+	);
+	
+	return {
+		unitRange: interval,
+		count: count,
+		unitName: unit[0]
+	};
+}
+
+/**
+ * Set the tick positions to a time unit that makes sense, for example
+ * on the first of each month or on every Monday. Return an array
+ * with the time positions. Used in datetime axes as well as for grouping
+ * data on a datetime axis.
+ *
+ * @param {Object} normalizedInterval The interval in axis values (ms) and the count
+ * @param {Number} min The minimum in axis values
+ * @param {Number} max The maximum in axis values
+ * @param {Number} startOfWeek
+ */
+function getTimeTicks(normalizedInterval, min, max, startOfWeek) {
+	var tickPositions = [],
+		i,
+		higherRanks = {},
+		useUTC = defaultOptions.global.useUTC,
+		minYear, // used in months and years as a basis for Date.UTC()
+		minDate = new Date(min),
+		interval = normalizedInterval.unitRange,
+		count = normalizedInterval.count;
+
+	if (defined(min)) { // #1300
+		if (interval >= timeUnits[SECOND]) { // second
+			minDate.setMilliseconds(0);
+			minDate.setSeconds(interval >= timeUnits[MINUTE] ? 0 :
+				count * mathFloor(minDate.getSeconds() / count));
+		}
+	
+		if (interval >= timeUnits[MINUTE]) { // minute
+			minDate[setMinutes](interval >= timeUnits[HOUR] ? 0 :
+				count * mathFloor(minDate[getMinutes]() / count));
+		}
+	
+		if (interval >= timeUnits[HOUR]) { // hour
+			minDate[setHours](interval >= timeUnits[DAY] ? 0 :
+				count * mathFloor(minDate[getHours]() / count));
+		}
+	
+		if (interval >= timeUnits[DAY]) { // day
+			minDate[setDate](interval >= timeUnits[MONTH] ? 1 :
+				count * mathFloor(minDate[getDate]() / count));
+		}
+	
+		if (interval >= timeUnits[MONTH]) { // month
+			minDate[setMonth](interval >= timeUnits[YEAR] ? 0 :
+				count * mathFloor(minDate[getMonth]() / count));
+			minYear = minDate[getFullYear]();
+		}
+	
+		if (interval >= timeUnits[YEAR]) { // year
+			minYear -= minYear % count;
+			minDate[setFullYear](minYear);
+		}
+	
+		// week is a special case that runs outside the hierarchy
+		if (interval === timeUnits[WEEK]) {
+			// get start of current week, independent of count
+			minDate[setDate](minDate[getDate]() - minDate[getDay]() +
+				pick(startOfWeek, 1));
+		}
+	
+	
+		// get tick positions
+		i = 1;
+		minYear = minDate[getFullYear]();
+		var time = minDate.getTime(),
+			minMonth = minDate[getMonth](),
+			minDateDate = minDate[getDate](),
+			timezoneOffset = useUTC ? 
+				0 : 
+				(24 * 3600 * 1000 + minDate.getTimezoneOffset() * 60 * 1000) % (24 * 3600 * 1000); // #950
+	
+		// iterate and add tick positions at appropriate values
+		while (time < max) {
+			tickPositions.push(time);
+	
+			// if the interval is years, use Date.UTC to increase years
+			if (interval === timeUnits[YEAR]) {
+				time = makeTime(minYear + i * count, 0);
+	
+			// if the interval is months, use Date.UTC to increase months
+			} else if (interval === timeUnits[MONTH]) {
+				time = makeTime(minYear, minMonth + i * count);
+	
+			// if we're using global time, the interval is not fixed as it jumps
+			// one hour at the DST crossover
+			} else if (!useUTC && (interval === timeUnits[DAY] || interval === timeUnits[WEEK])) {
+				time = makeTime(minYear, minMonth, minDateDate +
+					i * count * (interval === timeUnits[DAY] ? 1 : 7));
+	
+			// else, the interval is fixed and we use simple addition
+			} else {
+				time += interval * count;
+			}
+	
+			i++;
+		}
+	
+		// push the last time
+		tickPositions.push(time);
+
+
+		// mark new days if the time is dividible by day (#1649, #1760)
+		each(grep(tickPositions, function (time) {
+			return interval <= timeUnits[HOUR] && time % timeUnits[DAY] === timezoneOffset;
+		}), function (time) {
+			higherRanks[time] = DAY;
+		});
+	}
+
+
+	// record information on the chosen unit - for dynamic label formatter
+	tickPositions.info = extend(normalizedInterval, {
+		higherRanks: higherRanks,
+		totalRange: interval * count
+	});
+
+	return tickPositions;
+}
+
+/**
+ * Helper class that contains variuos counters that are local to the chart.
+ */
+function ChartCounters() {
+	this.color = 0;
+	this.symbol = 0;
+}
+
+ChartCounters.prototype =  {
+	/**
+	 * Wraps the color counter if it reaches the specified length.
+	 */
+	wrapColor: function (length) {
+		if (this.color >= length) {
+			this.color = 0;
+		}
+	},
+
+	/**
+	 * Wraps the symbol counter if it reaches the specified length.
+	 */
+	wrapSymbol: function (length) {
+		if (this.symbol >= length) {
+			this.symbol = 0;
+		}
+	}
+};
+
+
+/**
+ * Utility method that sorts an object array and keeping the order of equal items.
+ * ECMA script standard does not specify the behaviour when items are equal.
+ */
+function stableSort(arr, sortFunction) {
+	var length = arr.length,
+		sortValue,
+		i;
+
+	// Add index to each item
+	for (i = 0; i < length; i++) {
+		arr[i].ss_i = i; // stable sort index
+	}
+
+	arr.sort(function (a, b) {
+		sortValue = sortFunction(a, b);
+		return sortValue === 0 ? a.ss_i - b.ss_i : sortValue;
+	});
+
+	// Remove index from items
+	for (i = 0; i < length; i++) {
+		delete arr[i].ss_i; // stable sort index
+	}
+}
+
+/**
+ * Non-recursive method to find the lowest member of an array. Math.min raises a maximum
+ * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This
+ * method is slightly slower, but safe.
+ */
+function arrayMin(data) {
+	var i = data.length,
+		min = data[0];
+
+	while (i--) {
+		if (data[i] < min) {
+			min = data[i];
+		}
+	}
+	return min;
+}
+
+/**
+ * Non-recursive method to find the lowest member of an array. Math.min raises a maximum
+ * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This
+ * method is slightly slower, but safe.
+ */
+function arrayMax(data) {
+	var i = data.length,
+		max = data[0];
+
+	while (i--) {
+		if (data[i] > max) {
+			max = data[i];
+		}
+	}
+	return max;
+}
+
+/**
+ * Utility method that destroys any SVGElement or VMLElement that are properties on the given object.
+ * It loops all properties and invokes destroy if there is a destroy method. The property is
+ * then delete'ed.
+ * @param {Object} The object to destroy properties on
+ * @param {Object} Exception, do not destroy this property, only delete it.
+ */
+function destroyObjectProperties(obj, except) {
+	var n;
+	for (n in obj) {
+		// If the object is non-null and destroy is defined
+		if (obj[n] && obj[n] !== except && obj[n].destroy) {
+			// Invoke the destroy
+			obj[n].destroy();
+		}
+
+		// Delete the property from the object.
+		delete obj[n];
+	}
+}
+
+
+/**
+ * Discard an element by moving it to the bin and delete
+ * @param {Object} The HTML node to discard
+ */
+function discardElement(element) {
+	// create a garbage bin element, not part of the DOM
+	if (!garbageBin) {
+		garbageBin = createElement(DIV);
+	}
+
+	// move the node and empty bin
+	if (element) {
+		garbageBin.appendChild(element);
+	}
+	garbageBin.innerHTML = '';
+}
+
+/**
+ * Provide error messages for debugging, with links to online explanation 
+ */
+function error(code, stop) {
+	var msg = 'Highcharts error #' + code + ': www.highcharts.com/errors/' + code;
+	if (stop) {
+		throw msg;
+	} else if (win.console) {
+		console.log(msg);
+	}
+}
+
+/**
+ * Fix JS round off float errors
+ * @param {Number} num
+ */
+function correctFloat(num) {
+	return parseFloat(
+		num.toPrecision(14)
+	);
+}
+
+/**
+ * Set the global animation to either a given value, or fall back to the
+ * given chart's animation option
+ * @param {Object} animation
+ * @param {Object} chart
+ */
+function setAnimation(animation, chart) {
+	globalAnimation = pick(animation, chart.animation);
+}
+
+/**
+ * The time unit lookup
+ */
+/*jslint white: true*/
+timeUnits = hash(
+	MILLISECOND, 1,
+	SECOND, 1000,
+	MINUTE, 60000,
+	HOUR, 3600000,
+	DAY, 24 * 3600000,
+	WEEK, 7 * 24 * 3600000,
+	MONTH, 31 * 24 * 3600000,
+	YEAR, 31556952000
+);
+/*jslint white: false*/
+/**
+ * Path interpolation algorithm used across adapters
+ */
+pathAnim = {
+	/**
+	 * Prepare start and end values so that the path can be animated one to one
+	 */
+	init: function (elem, fromD, toD) {
+		fromD = fromD || '';
+		var shift = elem.shift,
+			bezier = fromD.indexOf('C') > -1,
+			numParams = bezier ? 7 : 3,
+			endLength,
+			slice,
+			i,
+			start = fromD.split(' '),
+			end = [].concat(toD), // copy
+			startBaseLine,
+			endBaseLine,
+			sixify = function (arr) { // in splines make move points have six parameters like bezier curves
+				i = arr.length;
+				while (i--) {
+					if (arr[i] === M) {
+						arr.splice(i + 1, 0, arr[i + 1], arr[i + 2], arr[i + 1], arr[i + 2]);
+					}
+				}
+			};
+
+		if (bezier) {
+			sixify(start);
+			sixify(end);
+		}
+
+		// pull out the base lines before padding
+		if (elem.isArea) {
+			startBaseLine = start.splice(start.length - 6, 6);
+			endBaseLine = end.splice(end.length - 6, 6);
+		}
+
+		// if shifting points, prepend a dummy point to the end path
+		if (shift <= end.length / numParams && start.length === end.length) {
+			while (shift--) {
+				end = [].concat(end).splice(0, numParams).concat(end);
+			}
+		}
+		elem.shift = 0; // reset for following animations
+
+		// copy and append last point until the length matches the end length
+		if (start.length) {
+			endLength = end.length;
+			while (start.length < endLength) {
+
+				//bezier && sixify(start);
+				slice = [].concat(start).splice(start.length - numParams, numParams);
+				if (bezier) { // disable first control point
+					slice[numParams - 6] = slice[numParams - 2];
+					slice[numParams - 5] = slice[numParams - 1];
+				}
+				start = start.concat(slice);
+			}
+		}
+
+		if (startBaseLine) { // append the base lines for areas
+			start = start.concat(startBaseLine);
+			end = end.concat(endBaseLine);
+		}
+		return [start, end];
+	},
+
+	/**
+	 * Interpolate each value of the path and return the array
+	 */
+	step: function (start, end, pos, complete) {
+		var ret = [],
+			i = start.length,
+			startVal;
+
+		if (pos === 1) { // land on the final path without adjustment points appended in the ends
+			ret = complete;
+
+		} else if (i === end.length && pos < 1) {
+			while (i--) {
+				startVal = parseFloat(start[i]);
+				ret[i] =
+					isNaN(startVal) ? // a letter instruction like M or L
+						start[i] :
+						pos * (parseFloat(end[i] - startVal)) + startVal;
+
+			}
+		} else { // if animation is finished or length not matching, land on right value
+			ret = end;
+		}
+		return ret;
+	}
+};
+
+(function ($) {
+	/**
+	 * The default HighchartsAdapter for jQuery
+	 */
+	win.HighchartsAdapter = win.HighchartsAdapter || ($ && {
+		
+		/**
+		 * Initialize the adapter by applying some extensions to jQuery
+		 */
+		init: function (pathAnim) {
+			
+			// extend the animate function to allow SVG animations
+			var Fx = $.fx,
+				Step = Fx.step,
+				dSetter,
+				Tween = $.Tween,
+				propHooks = Tween && Tween.propHooks,
+				opacityHook = $.cssHooks.opacity;
+			
+			/*jslint unparam: true*//* allow unused param x in this function */
+			$.extend($.easing, {
+				easeOutQuad: function (x, t, b, c, d) {
+					return -c * (t /= d) * (t - 2) + b;
+				}
+			});
+			/*jslint unparam: false*/
+		
+			// extend some methods to check for elem.attr, which means it is a Highcharts SVG object
+			$.each(['cur', '_default', 'width', 'height', 'opacity'], function (i, fn) {
+				var obj = Step,
+					base,
+					elem;
+					
+				// Handle different parent objects
+				if (fn === 'cur') {
+					obj = Fx.prototype; // 'cur', the getter, relates to Fx.prototype
+				
+				} else if (fn === '_default' && Tween) { // jQuery 1.8 model
+					obj = propHooks[fn];
+					fn = 'set';
+				}
+		
+				// Overwrite the method
+				base = obj[fn];
+				if (base) { // step.width and step.height don't exist in jQuery < 1.7
+		
+					// create the extended function replacement
+					obj[fn] = function (fx) {
+		
+						// Fx.prototype.cur does not use fx argument
+						fx = i ? fx : this;
+
+						// Don't run animations on textual properties like align (#1821)
+						if (fx.prop === 'align') {
+							return;
+						}
+		
+						// shortcut
+						elem = fx.elem;
+		
+						// Fx.prototype.cur returns the current value. The other ones are setters
+						// and returning a value has no effect.
+						return elem.attr ? // is SVG element wrapper
+							elem.attr(fx.prop, fn === 'cur' ? UNDEFINED : fx.now) : // apply the SVG wrapper's method
+							base.apply(this, arguments); // use jQuery's built-in method
+					};
+				}
+			});
+
+			// Extend the opacity getter, needed for fading opacity with IE9 and jQuery 1.10+
+			wrap(opacityHook, 'get', function (proceed, elem, computed) {
+				return elem.attr ? (elem.opacity || 0) : proceed.call(this, elem, computed);
+			});
+			
+			
+			// Define the setter function for d (path definitions)
+			dSetter = function (fx) {
+				var elem = fx.elem,
+					ends;
+		
+				// Normally start and end should be set in state == 0, but sometimes,
+				// for reasons unknown, this doesn't happen. Perhaps state == 0 is skipped
+				// in these cases
+				if (!fx.started) {
+					ends = pathAnim.init(elem, elem.d, elem.toD);
+					fx.start = ends[0];
+					fx.end = ends[1];
+					fx.started = true;
+				}
+		
+		
+				// interpolate each value of the path
+				elem.attr('d', pathAnim.step(fx.start, fx.end, fx.pos, elem.toD));
+			};
+			
+			// jQuery 1.8 style
+			if (Tween) {
+				propHooks.d = {
+					set: dSetter
+				};
+			// pre 1.8
+			} else {
+				// animate paths
+				Step.d = dSetter;
+			}
+			
+			/**
+			 * Utility for iterating over an array. Parameters are reversed compared to jQuery.
+			 * @param {Array} arr
+			 * @param {Function} fn
+			 */
+			this.each = Array.prototype.forEach ?
+				function (arr, fn) { // modern browsers
+					return Array.prototype.forEach.call(arr, fn);
+					
+				} : 
+				function (arr, fn) { // legacy
+					var i = 0, 
+						len = arr.length;
+					for (; i < len; i++) {
+						if (fn.call(arr[i], arr[i], i, arr) === false) {
+							return i;
+						}
+					}
+				};
+			
+			/**
+			 * Register Highcharts as a plugin in the respective framework
+			 */
+			$.fn.highcharts = function () {
+				var constr = 'Chart', // default constructor
+					args = arguments,
+					options,
+					ret,
+					chart;
+
+				if (isString(args[0])) {
+					constr = args[0];
+					args = Array.prototype.slice.call(args, 1); 
+				}
+				options = args[0];
+
+				// Create the chart
+				if (options !== UNDEFINED) {
+					/*jslint unused:false*/
+					options.chart = options.chart || {};
+					options.chart.renderTo = this[0];
+					chart = new Highcharts[constr](options, args[1]);
+					ret = this;
+					/*jslint unused:true*/
+				}
+
+				// When called without parameters or with the return argument, get a predefined chart
+				if (options === UNDEFINED) {
+					ret = charts[attr(this[0], 'data-highcharts-chart')];
+				}	
+
+				return ret;
+			};
+
+		},
+
+		
+		/**
+		 * Downloads a script and executes a callback when done.
+		 * @param {String} scriptLocation
+		 * @param {Function} callback
+		 */
+		getScript: $.getScript,
+		
+		/**
+		 * Return the index of an item in an array, or -1 if not found
+		 */
+		inArray: $.inArray,
+		
+		/**
+		 * A direct link to jQuery methods. MooTools and Prototype adapters must be implemented for each case of method.
+		 * @param {Object} elem The HTML element
+		 * @param {String} method Which method to run on the wrapped element
+		 */
+		adapterRun: function (elem, method) {
+			return $(elem)[method]();
+		},
+	
+		/**
+		 * Filter an array
+		 */
+		grep: $.grep,
+	
+		/**
+		 * Map an array
+		 * @param {Array} arr
+		 * @param {Function} fn
+		 */
+		map: function (arr, fn) {
+			//return jQuery.map(arr, fn);
+			var results = [],
+				i = 0,
+				len = arr.length;
+			for (; i < len; i++) {
+				results[i] = fn.call(arr[i], arr[i], i, arr);
+			}
+			return results;
+	
+		},
+	
+		/**
+		 * Get the position of an element relative to the top left of the page
+		 */
+		offset: function (el) {
+			return $(el).offset();
+		},
+	
+		/**
+		 * Add an event listener
+		 * @param {Object} el A HTML element or custom object
+		 * @param {String} event The event type
+		 * @param {Function} fn The event handler
+		 */
+		addEvent: function (el, event, fn) {
+			$(el).bind(event, fn);
+		},
+	
+		/**
+		 * Remove event added with addEvent
+		 * @param {Object} el The object
+		 * @param {String} eventType The event type. Leave blank to remove all events.
+		 * @param {Function} handler The function to remove
+		 */
+		removeEvent: function (el, eventType, handler) {
+			// workaround for jQuery issue with unbinding custom events:
+			// http://forum.jQuery.com/topic/javascript-error-when-unbinding-a-custom-event-using-jQuery-1-4-2
+			var func = doc.removeEventListener ? 'removeEventListener' : 'detachEvent';
+			if (doc[func] && el && !el[func]) {
+				el[func] = function () {};
+			}
+	
+			$(el).unbind(eventType, handler);
+		},
+	
+		/**
+		 * Fire an event on a custom object
+		 * @param {Object} el
+		 * @param {String} type
+		 * @param {Object} eventArguments
+		 * @param {Function} defaultFunction
+		 */
+		fireEvent: function (el, type, eventArguments, defaultFunction) {
+			var event = $.Event(type),
+				detachedType = 'detached' + type,
+				defaultPrevented;
+	
+			// Remove warnings in Chrome when accessing layerX and layerY. Although Highcharts
+			// never uses these properties, Chrome includes them in the default click event and
+			// raises the warning when they are copied over in the extend statement below.
+			//
+			// To avoid problems in IE (see #1010) where we cannot delete the properties and avoid
+			// testing if they are there (warning in chrome) the only option is to test if running IE.
+			if (!isIE && eventArguments) {
+				delete eventArguments.layerX;
+				delete eventArguments.layerY;
+			}
+	
+			extend(event, eventArguments);
+	
+			// Prevent jQuery from triggering the object method that is named the
+			// same as the event. For example, if the event is 'select', jQuery
+			// attempts calling el.select and it goes into a loop.
+			if (el[type]) {
+				el[detachedType] = el[type];
+				el[type] = null;
+			}
+	
+			// Wrap preventDefault and stopPropagation in try/catch blocks in
+			// order to prevent JS errors when cancelling events on non-DOM
+			// objects. #615.
+			/*jslint unparam: true*/
+			$.each(['preventDefault', 'stopPropagation'], function (i, fn) {
+				var base = event[fn];
+				event[fn] = function () {
+					try {
+						base.call(event);
+					} catch (e) {
+						if (fn === 'preventDefault') {
+							defaultPrevented = true;
+						}
+					}
+				};
+			});
+			/*jslint unparam: false*/
+	
+			// trigger it
+			$(el).trigger(event);
+	
+			// attach the method
+			if (el[detachedType]) {
+				el[type] = el[detachedType];
+				el[detachedType] = null;
+			}
+	
+			if (defaultFunction && !event.isDefaultPrevented() && !defaultPrevented) {
+				defaultFunction(event);
+			}
+		},
+		
+		/**
+		 * Extension method needed for MooTools
+		 */
+		washMouseEvent: function (e) {
+			var ret = e.originalEvent || e;
+			
+			// computed by jQuery, needed by IE8
+			if (ret.pageX === UNDEFINED) { // #1236
+				ret.pageX = e.pageX;
+				ret.pageY = e.pageY;
+			}
+			
+			return ret;
+		},
+	
+		/**
+		 * Animate a HTML element or SVG element wrapper
+		 * @param {Object} el
+		 * @param {Object} params
+		 * @param {Object} options jQuery-like animation options: duration, easing, callback
+		 */
+		animate: function (el, params, options) {
+			var $el = $(el);
+			if (!el.style) {
+				el.style = {}; // #1881
+			}
+			if (params.d) {
+				el.toD = params.d; // keep the array form for paths, used in $.fx.step.d
+				params.d = 1; // because in jQuery, animating to an array has a different meaning
+			}
+	
+			$el.stop();
+			if (params.opacity !== UNDEFINED && el.attr) {
+				params.opacity += 'px'; // force jQuery to use same logic as width and height (#2161)
+			}
+			$el.animate(params, options);
+	
+		},
+		/**
+		 * Stop running animation
+		 */
+		stop: function (el) {
+			$(el).stop();
+		}
+	});
+}(win.jQuery));
+
+
+// check for a custom HighchartsAdapter defined prior to this file
+var globalAdapter = win.HighchartsAdapter,
+	adapter = globalAdapter || {};
+	
+// Initialize the adapter
+if (globalAdapter) {
+	globalAdapter.init.call(globalAdapter, pathAnim);
+}
+
+
+// Utility functions. If the HighchartsAdapter is not defined, adapter is an empty object
+// and all the utility functions will be null. In that case they are populated by the
+// default adapters below.
+var adapterRun = adapter.adapterRun,
+	getScript = adapter.getScript,
+	inArray = adapter.inArray,
+	each = adapter.each,
+	grep = adapter.grep,
+	offset = adapter.offset,
+	map = adapter.map,
+	addEvent = adapter.addEvent,
+	removeEvent = adapter.removeEvent,
+	fireEvent = adapter.fireEvent,
+	washMouseEvent = adapter.washMouseEvent,
+	animate = adapter.animate,
+	stop = adapter.stop;
+
+
+
+/* ****************************************************************************
+ * Handle the options                                                         *
+ *****************************************************************************/
+var
+
+defaultLabelOptions = {
+	enabled: true,
+	// rotation: 0,
+	// align: 'center',
+	x: 0,
+	y: 15,
+	/*formatter: function () {
+		return this.value;
+	},*/
+	style: {
+		color: '#666',
+		cursor: 'default',
+		fontSize: '11px',
+		lineHeight: '14px'
+	}
+};
+
+defaultOptions = {
+	colors: ['#2f7ed8', '#0d233a', '#8bbc21', '#910000', '#1aadce', '#492970',
+		'#f28f43', '#77a1e5', '#c42525', '#a6c96a'],
+	symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],
+	lang: {
+		loading: 'Loading...',
+		months: ['January', 'February', 'March', 'April', 'May', 'June', 'July',
+				'August', 'September', 'October', 'November', 'December'],
+		shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		decimalPoint: '.',
+		numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels
+		resetZoom: 'Reset zoom',
+		resetZoomTitle: 'Reset zoom level 1:1',
+		thousandsSep: ','
+	},
+	global: {
+		useUTC: true,
+		canvasToolsURL: 'http://code.highcharts.com/3.0.6/modules/canvas-tools.js',
+		VMLRadialGradientURL: 'http://code.highcharts.com/3.0.6/gfx/vml-radial-gradient.png'
+	},
+	chart: {
+		//animation: true,
+		//alignTicks: false,
+		//reflow: true,
+		//className: null,
+		//events: { load, selection },
+		//margin: [null],
+		//marginTop: null,
+		//marginRight: null,
+		//marginBottom: null,
+		//marginLeft: null,
+		borderColor: '#4572A7',
+		//borderWidth: 0,
+		borderRadius: 5,
+		defaultSeriesType: 'line',
+		ignoreHiddenSeries: true,
+		//inverted: false,
+		//shadow: false,
+		spacing: [10, 10, 15, 10],
+		//spacingTop: 10,
+		//spacingRight: 10,
+		//spacingBottom: 15,
+		//spacingLeft: 10,
+		style: {
+			fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif', // default font
+			fontSize: '12px'
+		},
+		backgroundColor: '#FFFFFF',
+		//plotBackgroundColor: null,
+		plotBorderColor: '#C0C0C0',
+		//plotBorderWidth: 0,
+		//plotShadow: false,
+		//zoomType: ''
+		resetZoomButton: {
+			theme: {
+				zIndex: 20
+			},
+			position: {
+				align: 'right',
+				x: -10,
+				//verticalAlign: 'top',
+				y: 10
+			}
+			// relativeTo: 'plot'
+		}
+	},
+	title: {
+		text: 'Chart title',
+		align: 'center',
+		// floating: false,
+		margin: 15,
+		// x: 0,
+		// verticalAlign: 'top',
+		// y: null,
+		style: {
+			color: '#274b6d',//#3E576F',
+			fontSize: '16px'
+		}
+
+	},
+	subtitle: {
+		text: '',
+		align: 'center',
+		// floating: false
+		// x: 0,
+		// verticalAlign: 'top',
+		// y: null,
+		style: {
+			color: '#4d759e'
+		}
+	},
+
+	plotOptions: {
+		line: { // base series options
+			allowPointSelect: false,
+			showCheckbox: false,
+			animation: {
+				duration: 1000
+			},
+			//connectNulls: false,
+			//cursor: 'default',
+			//clip: true,
+			//dashStyle: null,
+			//enableMouseTracking: true,
+			events: {},
+			//legendIndex: 0,
+			lineWidth: 2,
+			//shadow: false,
+			// stacking: null,
+			marker: {
+				enabled: true,
+				//symbol: null,
+				lineWidth: 0,
+				radius: 4,
+				lineColor: '#FFFFFF',
+				//fillColor: null,
+				states: { // states for a single point
+					hover: {
+						enabled: true
+						//radius: base + 2
+					},
+					select: {
+						fillColor: '#FFFFFF',
+						lineColor: '#000000',
+						lineWidth: 2
+					}
+				}
+			},
+			point: {
+				events: {}
+			},
+			dataLabels: merge(defaultLabelOptions, {
+				align: 'center',
+				enabled: false,
+				formatter: function () {
+					return this.y === null ? '' : numberFormat(this.y, -1);
+				},
+				verticalAlign: 'bottom', // above singular point
+				y: 0
+				// backgroundColor: undefined,
+				// borderColor: undefined,
+				// borderRadius: undefined,
+				// borderWidth: undefined,
+				// padding: 3,
+				// shadow: false
+			}),
+			cropThreshold: 300, // draw points outside the plot area when the number of points is less than this
+			pointRange: 0,
+			//pointStart: 0,
+			//pointInterval: 1,
+			showInLegend: true,
+			states: { // states for the entire series
+				hover: {
+					//enabled: false,
+					//lineWidth: base + 1,
+					marker: {
+						// lineWidth: base + 1,
+						// radius: base + 1
+					}
+				},
+				select: {
+					marker: {}
+				}
+			},
+			stickyTracking: true
+			//tooltip: {
+				//pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b>'
+				//valueDecimals: null,
+				//xDateFormat: '%A, %b %e, %Y',
+				//valuePrefix: '',
+				//ySuffix: ''				
+			//}
+			// turboThreshold: 1000
+			// zIndex: null
+		}
+	},
+	labels: {
+		//items: [],
+		style: {
+			//font: defaultFont,
+			position: ABSOLUTE,
+			color: '#3E576F'
+		}
+	},
+	legend: {
+		enabled: true,
+		align: 'center',
+		//floating: false,
+		layout: 'horizontal',
+		labelFormatter: function () {
+			return this.name;
+		},
+		borderWidth: 1,
+		borderColor: '#909090',
+		borderRadius: 5,
+		navigation: {
+			// animation: true,
+			activeColor: '#274b6d',
+			// arrowSize: 12
+			inactiveColor: '#CCC'
+			// style: {} // text styles
+		},
+		// margin: 10,
+		// reversed: false,
+		shadow: false,
+		// backgroundColor: null,
+		/*style: {
+			padding: '5px'
+		},*/
+		itemStyle: {
+			cursor: 'pointer',
+			color: '#274b6d',
+			fontSize: '12px'
+		},
+		itemHoverStyle: {
+			//cursor: 'pointer', removed as of #601
+			color: '#000'
+		},
+		itemHiddenStyle: {
+			color: '#CCC'
+		},
+		itemCheckboxStyle: {
+			position: ABSOLUTE,
+			width: '13px', // for IE precision
+			height: '13px'
+		},
+		// itemWidth: undefined,
+		symbolWidth: 16,
+		symbolPadding: 5,
+		verticalAlign: 'bottom',
+		// width: undefined,
+		x: 0,
+		y: 0,
+		title: {
+			//text: null,
+			style: {
+				fontWeight: 'bold'
+			}
+		}			
+	},
+
+	loading: {
+		// hideDuration: 100,
+		labelStyle: {
+			fontWeight: 'bold',
+			position: RELATIVE,
+			top: '1em'
+		},
+		// showDuration: 0,
+		style: {
+			position: ABSOLUTE,
+			backgroundColor: 'white',
+			opacity: 0.5,
+			textAlign: 'center'
+		}
+	},
+
+	tooltip: {
+		enabled: true,
+		animation: hasSVG,
+		//crosshairs: null,
+		backgroundColor: 'rgba(255, 255, 255, .85)',
+		borderWidth: 1,
+		borderRadius: 3,
+		dateTimeLabelFormats: { 
+			millisecond: '%A, %b %e, %H:%M:%S.%L',
+			second: '%A, %b %e, %H:%M:%S',
+			minute: '%A, %b %e, %H:%M',
+			hour: '%A, %b %e, %H:%M',
+			day: '%A, %b %e, %Y',
+			week: 'Week from %A, %b %e, %Y',
+			month: '%B %Y',
+			year: '%Y'
+		},
+		//formatter: defaultFormatter,
+		headerFormat: '<span style="font-size: 10px">{point.key}</span><br/>',
+		pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',
+		shadow: true,
+		//shared: false,
+		snap: isTouchDevice ? 25 : 10,
+		style: {
+			color: '#333333',
+			cursor: 'default',
+			fontSize: '12px',
+			padding: '8px',
+			whiteSpace: 'nowrap'
+		}
+		//xDateFormat: '%A, %b %e, %Y',
+		//valueDecimals: null,
+		//valuePrefix: '',
+		//valueSuffix: ''
+	},
+
+	credits: {
+		enabled: true,
+		text: 'Highcharts.com',
+		href: 'http://www.highcharts.com',
+		position: {
+			align: 'right',
+			x: -10,
+			verticalAlign: 'bottom',
+			y: -5
+		},
+		style: {
+			cursor: 'pointer',
+			color: '#909090',
+			fontSize: '9px'
+		}
+	}
+};
+
+
+
+
+// Series defaults
+var defaultPlotOptions = defaultOptions.plotOptions,
+	defaultSeriesOptions = defaultPlotOptions.line;
+
+// set the default time methods
+setTimeMethods();
+
+
+
+/**
+ * Set the time methods globally based on the useUTC option. Time method can be either
+ * local time or UTC (default).
+ */
+function setTimeMethods() {
+	var useUTC = defaultOptions.global.useUTC,
+		GET = useUTC ? 'getUTC' : 'get',
+		SET = useUTC ? 'setUTC' : 'set';
+
+	makeTime = useUTC ? Date.UTC : function (year, month, date, hours, minutes, seconds) {
+		return new Date(
+			year,
+			month,
+			pick(date, 1),
+			pick(hours, 0),
+			pick(minutes, 0),
+			pick(seconds, 0)
+		).getTime();
+	};
+	getMinutes =  GET + 'Minutes';
+	getHours =    GET + 'Hours';
+	getDay =      GET + 'Day';
+	getDate =     GET + 'Date';
+	getMonth =    GET + 'Month';
+	getFullYear = GET + 'FullYear';
+	setMinutes =  SET + 'Minutes';
+	setHours =    SET + 'Hours';
+	setDate =     SET + 'Date';
+	setMonth =    SET + 'Month';
+	setFullYear = SET + 'FullYear';
+
+}
+
+/**
+ * Merge the default options with custom options and return the new options structure
+ * @param {Object} options The new custom options
+ */
+function setOptions(options) {
+	
+	// Pull out axis options and apply them to the respective default axis options 
+	/*defaultXAxisOptions = merge(defaultXAxisOptions, options.xAxis);
+	defaultYAxisOptions = merge(defaultYAxisOptions, options.yAxis);
+	options.xAxis = options.yAxis = UNDEFINED;*/
+	
+	// Merge in the default options
+	defaultOptions = merge(defaultOptions, options);
+	
+	// Apply UTC
+	setTimeMethods();
+
+	return defaultOptions;
+}
+
+/**
+ * Get the updated default options. Merely exposing defaultOptions for outside modules
+ * isn't enough because the setOptions method creates a new object.
+ */
+function getOptions() {
+	return defaultOptions;
+}
+
+
+/**
+ * Handle color operations. The object methods are chainable.
+ * @param {String} input The input color in either rbga or hex format
+ */
+var Color = function (input) {
+	// declare variables
+	var rgba = [], result, stops;
+
+	/**
+	 * Parse the input color to rgba array
+	 * @param {String} input
+	 */
+	function init(input) {
+
+		// Gradients
+		if (input && input.stops) {
+			stops = map(input.stops, function (stop) {
+				return Color(stop[1]);
+			});
+
+		// Solid colors
+		} else {
+			// rgba
+			result = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(input);
+			if (result) {
+				rgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];
+			} else { 
+				// hex
+				result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(input);
+				if (result) {
+					rgba = [pInt(result[1], 16), pInt(result[2], 16), pInt(result[3], 16), 1];
+				} else {
+					// rgb
+					result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(input);
+					if (result) {
+						rgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];
+					}
+				}
+			}
+		}		
+
+	}
+	/**
+	 * Return the color a specified format
+	 * @param {String} format
+	 */
+	function get(format) {
+		var ret;
+
+		if (stops) {
+			ret = merge(input);
+			ret.stops = [].concat(ret.stops);
+			each(stops, function (stop, i) {
+				ret.stops[i] = [ret.stops[i][0], stop.get(format)];
+			});
+
+		// it's NaN if gradient colors on a column chart
+		} else if (rgba && !isNaN(rgba[0])) {
+			if (format === 'rgb') {
+				ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';
+			} else if (format === 'a') {
+				ret = rgba[3];
+			} else {
+				ret = 'rgba(' + rgba.join(',') + ')';
+			}
+		} else {
+			ret = input;
+		}
+		return ret;
+	}
+
+	/**
+	 * Brighten the color
+	 * @param {Number} alpha
+	 */
+	function brighten(alpha) {
+		if (stops) {
+			each(stops, function (stop) {
+				stop.brighten(alpha);
+			});
+		
+		} else if (isNumber(alpha) && alpha !== 0) {
+			var i;
+			for (i = 0; i < 3; i++) {
+				rgba[i] += pInt(alpha * 255);
+
+				if (rgba[i] < 0) {
+					rgba[i] = 0;
+				}
+				if (rgba[i] > 255) {
+					rgba[i] = 255;
+				}
+			}
+		}
+		return this;
+	}
+	/**
+	 * Set the color's opacity to a given alpha value
+	 * @param {Number} alpha
+	 */
+	function setOpacity(alpha) {
+		rgba[3] = alpha;
+		return this;
+	}
+
+	// initialize: parse the input
+	init(input);
+
+	// public methods
+	return {
+		get: get,
+		brighten: brighten,
+		rgba: rgba,
+		setOpacity: setOpacity
+	};
+};
+
+
+/**
+ * A wrapper object for SVG elements
+ */
+function SVGElement() {}
+
+SVGElement.prototype = {
+	/**
+	 * Initialize the SVG renderer
+	 * @param {Object} renderer
+	 * @param {String} nodeName
+	 */
+	init: function (renderer, nodeName) {
+		var wrapper = this;
+		wrapper.element = nodeName === 'span' ?
+			createElement(nodeName) :
+			doc.createElementNS(SVG_NS, nodeName);
+		wrapper.renderer = renderer;
+		/**
+		 * A collection of attribute setters. These methods, if defined, are called right before a certain
+		 * attribute is set on an element wrapper. Returning false prevents the default attribute
+		 * setter to run. Returning a value causes the default setter to set that value. Used in
+		 * Renderer.label.
+		 */
+		wrapper.attrSetters = {};
+	},
+	/**
+	 * Default base for animation
+	 */
+	opacity: 1,
+	/**
+	 * Animate a given attribute
+	 * @param {Object} params
+	 * @param {Number} options The same options as in jQuery animation
+	 * @param {Function} complete Function to perform at the end of animation
+	 */
+	animate: function (params, options, complete) {
+		var animOptions = pick(options, globalAnimation, true);
+		stop(this); // stop regardless of animation actually running, or reverting to .attr (#607)
+		if (animOptions) {
+			animOptions = merge(animOptions);
+			if (complete) { // allows using a callback with the global animation without overwriting it
+				animOptions.complete = complete;
+			}
+			animate(this, params, animOptions);
+		} else {
+			this.attr(params);
+			if (complete) {
+				complete();
+			}
+		}
+	},
+	/**
+	 * Set or get a given attribute
+	 * @param {Object|String} hash
+	 * @param {Mixed|Undefined} val
+	 */
+	attr: function (hash, val) {
+		var wrapper = this,
+			key,
+			value,
+			result,
+			i,
+			child,
+			element = wrapper.element,
+			nodeName = element.nodeName.toLowerCase(), // Android2 requires lower for "text"
+			renderer = wrapper.renderer,
+			skipAttr,
+			titleNode,
+			attrSetters = wrapper.attrSetters,
+			shadows = wrapper.shadows,
+			hasSetSymbolSize,
+			doTransform,
+			ret = wrapper;
+
+		// single key-value pair
+		if (isString(hash) && defined(val)) {
+			key = hash;
+			hash = {};
+			hash[key] = val;
+		}
+
+		// used as a getter: first argument is a string, second is undefined
+		if (isString(hash)) {
+			key = hash;
+			if (nodeName === 'circle') {
+				key = { x: 'cx', y: 'cy' }[key] || key;
+			} else if (key === 'strokeWidth') {
+				key = 'stroke-width';
+			}
+			ret = attr(element, key) || wrapper[key] || 0;
+			if (key !== 'd' && key !== 'visibility' && key !== 'fill') { // 'd' is string in animation step
+				ret = parseFloat(ret);
+			}
+
+		// setter
+		} else {
+
+			for (key in hash) {
+				skipAttr = false; // reset
+				value = hash[key];
+
+				// check for a specific attribute setter
+				result = attrSetters[key] && attrSetters[key].call(wrapper, value, key);
+
+				if (result !== false) {
+					if (result !== UNDEFINED) {
+						value = result; // the attribute setter has returned a new value to set
+					}
+
+
+					// paths
+					if (key === 'd') {
+						if (value && value.join) { // join path
+							value = value.join(' ');
+						}
+						if (/(NaN| {2}|^$)/.test(value)) {
+							value = 'M 0 0';
+						}
+						//wrapper.d = value; // shortcut for animations
+
+					// update child tspans x values
+					} else if (key === 'x' && nodeName === 'text') {
+						for (i = 0; i < element.childNodes.length; i++) {
+							child = element.childNodes[i];
+							// if the x values are equal, the tspan represents a linebreak
+							if (attr(child, 'x') === attr(element, 'x')) {
+								//child.setAttribute('x', value);
+								attr(child, 'x', value);
+							}
+						}
+
+					} else if (wrapper.rotation && (key === 'x' || key === 'y')) {
+						doTransform = true;
+
+					// apply gradients
+					} else if (key === 'fill') {
+						value = renderer.color(value, element, key);
+
+					// circle x and y
+					} else if (nodeName === 'circle' && (key === 'x' || key === 'y')) {
+						key = { x: 'cx', y: 'cy' }[key] || key;
+
+					// rectangle border radius
+					} else if (nodeName === 'rect' && key === 'r') {
+						attr(element, {
+							rx: value,
+							ry: value
+						});
+						skipAttr = true;
+
+					// translation and text rotation
+					} else if (key === 'translateX' || key === 'translateY' || key === 'rotation' ||
+							key === 'verticalAlign' || key === 'scaleX' || key === 'scaleY') {
+						doTransform = true;
+						skipAttr = true;
+
+					// apply opacity as subnode (required by legacy WebKit and Batik)
+					} else if (key === 'stroke') {
+						value = renderer.color(value, element, key);
+
+					// emulate VML's dashstyle implementation
+					} else if (key === 'dashstyle') {
+						key = 'stroke-dasharray';
+						value = value && value.toLowerCase();
+						if (value === 'solid') {
+							value = NONE;
+						} else if (value) {
+							value = value
+								.replace('shortdashdotdot', '3,1,1,1,1,1,')
+								.replace('shortdashdot', '3,1,1,1')
+								.replace('shortdot', '1,1,')
+								.replace('shortdash', '3,1,')
+								.replace('longdash', '8,3,')
+								.replace(/dot/g, '1,3,')
+								.replace('dash', '4,3,')
+								.replace(/,$/, '')
+								.split(','); // ending comma
+
+							i = value.length;
+							while (i--) {
+								value[i] = pInt(value[i]) * pick(hash['stroke-width'], wrapper['stroke-width']);
+							}
+							value = value.join(',');
+						}
+
+					// IE9/MooTools combo: MooTools returns objects instead of numbers and IE9 Beta 2
+					// is unable to cast them. Test again with final IE9.
+					} else if (key === 'width') {
+						value = pInt(value);
+
+					// Text alignment
+					} else if (key === 'align') {
+						key = 'text-anchor';
+						value = { left: 'start', center: 'middle', right: 'end' }[value];
+
+					// Title requires a subnode, #431
+					} else if (key === 'title') {
+						titleNode = element.getElementsByTagName('title')[0];
+						if (!titleNode) {
+							titleNode = doc.createElementNS(SVG_NS, 'title');
+							element.appendChild(titleNode);
+						}
+						titleNode.textContent = value;
+					}
+
+					// jQuery animate changes case
+					if (key === 'strokeWidth') {
+						key = 'stroke-width';
+					}
+
+					// In Chrome/Win < 6 as well as Batik, the stroke attribute can't be set when the stroke-
+					// width is 0. #1369
+					if (key === 'stroke-width' || key === 'stroke') {
+						wrapper[key] = value;
+						// Only apply the stroke attribute if the stroke width is defined and larger than 0
+						if (wrapper.stroke && wrapper['stroke-width']) {
+							attr(element, 'stroke', wrapper.stroke);
+							attr(element, 'stroke-width', wrapper['stroke-width']);
+							wrapper.hasStroke = true;
+						} else if (key === 'stroke-width' && value === 0 && wrapper.hasStroke) {
+							element.removeAttribute('stroke');
+							wrapper.hasStroke = false;
+						}
+						skipAttr = true;
+					}
+
+					// symbols
+					if (wrapper.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(key)) {
+
+
+						if (!hasSetSymbolSize) {
+							wrapper.symbolAttr(hash);
+							hasSetSymbolSize = true;
+						}
+						skipAttr = true;
+					}
+
+					// let the shadow follow the main element
+					if (shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {
+						i = shadows.length;
+						while (i--) {
+							attr(
+								shadows[i],
+								key,
+								key === 'height' ?
+									mathMax(value - (shadows[i].cutHeight || 0), 0) :
+									value
+							);
+						}
+					}
+
+					// validate heights
+					if ((key === 'width' || key === 'height') && nodeName === 'rect' && value < 0) {
+						value = 0;
+					}
+
+					// Record for animation and quick access without polling the DOM
+					wrapper[key] = value;
+
+
+					if (key === 'text') {
+						// Delete bBox memo when the text changes
+						if (value !== wrapper.textStr) {
+							delete wrapper.bBox;
+						}
+						wrapper.textStr = value;
+						if (wrapper.added) {
+							renderer.buildText(wrapper);
+						}
+					} else if (!skipAttr) {
+						attr(element, key, value);
+					}
+
+				}
+
+			}
+
+			// Update transform. Do this outside the loop to prevent redundant updating for batch setting
+			// of attributes.
+			if (doTransform) {
+				wrapper.updateTransform();
+			}
+
+		}
+
+		return ret;
+	},
+
+
+	/**
+	 * Add a class name to an element
+	 */
+	addClass: function (className) {
+		var element = this.element,
+			currentClassName = attr(element, 'class') || '';
+
+		if (currentClassName.indexOf(className) === -1) {
+			attr(element, 'class', currentClassName + ' ' + className);
+		}
+		return this;
+	},
+	/* hasClass and removeClass are not (yet) needed
+	hasClass: function (className) {
+		return attr(this.element, 'class').indexOf(className) !== -1;
+	},
+	removeClass: function (className) {
+		attr(this.element, 'class', attr(this.element, 'class').replace(className, ''));
+		return this;
+	},
+	*/
+
+	/**
+	 * If one of the symbol size affecting parameters are changed,
+	 * check all the others only once for each call to an element's
+	 * .attr() method
+	 * @param {Object} hash
+	 */
+	symbolAttr: function (hash) {
+		var wrapper = this;
+
+		each(['x', 'y', 'r', 'start', 'end', 'width', 'height', 'innerR', 'anchorX', 'anchorY'], function (key) {
+			wrapper[key] = pick(hash[key], wrapper[key]);
+		});
+
+		wrapper.attr({
+			d: wrapper.renderer.symbols[wrapper.symbolName](
+				wrapper.x,
+				wrapper.y,
+				wrapper.width,
+				wrapper.height,
+				wrapper
+			)
+		});
+	},
+
+	/**
+	 * Apply a clipping path to this object
+	 * @param {String} id
+	 */
+	clip: function (clipRect) {
+		return this.attr('clip-path', clipRect ? 'url(' + this.renderer.url + '#' + clipRect.id + ')' : NONE);
+	},
+
+	/**
+	 * Calculate the coordinates needed for drawing a rectangle crisply and return the
+	 * calculated attributes
+	 * @param {Number} strokeWidth
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	crisp: function (strokeWidth, x, y, width, height) {
+
+		var wrapper = this,
+			key,
+			attribs = {},
+			values = {},
+			normalizer;
+
+		strokeWidth = strokeWidth || wrapper.strokeWidth || (wrapper.attr && wrapper.attr('stroke-width')) || 0;
+		normalizer = mathRound(strokeWidth) % 2 / 2; // mathRound because strokeWidth can sometimes have roundoff errors
+
+		// normalize for crisp edges
+		values.x = mathFloor(x || wrapper.x || 0) + normalizer;
+		values.y = mathFloor(y || wrapper.y || 0) + normalizer;
+		values.width = mathFloor((width || wrapper.width || 0) - 2 * normalizer);
+		values.height = mathFloor((height || wrapper.height || 0) - 2 * normalizer);
+		values.strokeWidth = strokeWidth;
+
+		for (key in values) {
+			if (wrapper[key] !== values[key]) { // only set attribute if changed
+				wrapper[key] = attribs[key] = values[key];
+			}
+		}
+
+		return attribs;
+	},
+
+	/**
+	 * Set styles for the element
+	 * @param {Object} styles
+	 */
+	css: function (styles) {
+		/*jslint unparam: true*//* allow unused param a in the regexp function below */
+		var elemWrapper = this,
+			elem = elemWrapper.element,
+			textWidth = styles && styles.width && elem.nodeName.toLowerCase() === 'text',
+			n,
+			serializedCss = '',
+			hyphenate = function (a, b) { return '-' + b.toLowerCase(); };
+		/*jslint unparam: false*/
+
+		// convert legacy
+		if (styles && styles.color) {
+			styles.fill = styles.color;
+		}
+
+		// Merge the new styles with the old ones
+		styles = extend(
+			elemWrapper.styles,
+			styles
+		);
+
+		// store object
+		elemWrapper.styles = styles;
+
+
+		// Don't handle line wrap on canvas
+		if (useCanVG && textWidth) {
+			delete styles.width;
+		}
+
+		// serialize and set style attribute
+		if (isIE && !hasSVG) { // legacy IE doesn't support setting style attribute
+			if (textWidth) {
+				delete styles.width;
+			}
+			css(elemWrapper.element, styles);
+		} else {
+			for (n in styles) {
+				serializedCss += n.replace(/([A-Z])/g, hyphenate) + ':' + styles[n] + ';';
+			}
+			attr(elem, 'style', serializedCss); // #1881
+		}
+
+
+		// re-build text
+		if (textWidth && elemWrapper.added) {
+			elemWrapper.renderer.buildText(elemWrapper);
+		}
+
+		return elemWrapper;
+	},
+
+	/**
+	 * Add an event listener
+	 * @param {String} eventType
+	 * @param {Function} handler
+	 */
+	on: function (eventType, handler) {
+		var svgElement = this,
+			element = svgElement.element;
+		
+		// touch
+		if (hasTouch && eventType === 'click') {
+			element.ontouchstart = function (e) {			
+				svgElement.touchEventFired = Date.now();				
+				e.preventDefault();
+				handler.call(element, e);
+			};
+			element.onclick = function (e) {												
+				if (userAgent.indexOf('Android') === -1 || Date.now() - (svgElement.touchEventFired || 0) > 1100) { // #2269
+					handler.call(element, e);
+				}
+			};			
+		} else {
+			// simplest possible event model for internal use
+			element['on' + eventType] = handler;
+		}
+		return this;
+	},
+
+	/**
+	 * Set the coordinates needed to draw a consistent radial gradient across
+	 * pie slices regardless of positioning inside the chart. The format is
+	 * [centerX, centerY, diameter] in pixels.
+	 */
+	setRadialReference: function (coordinates) {
+		this.element.radialReference = coordinates;
+		return this;
+	},
+
+	/**
+	 * Move an object and its children by x and y values
+	 * @param {Number} x
+	 * @param {Number} y
+	 */
+	translate: function (x, y) {
+		return this.attr({
+			translateX: x,
+			translateY: y
+		});
+	},
+
+	/**
+	 * Invert a group, rotate and flip
+	 */
+	invert: function () {
+		var wrapper = this;
+		wrapper.inverted = true;
+		wrapper.updateTransform();
+		return wrapper;
+	},
+
+	/**
+	 * Apply CSS to HTML elements. This is used in text within SVG rendering and
+	 * by the VML renderer
+	 */
+	htmlCss: function (styles) {
+		var wrapper = this,
+			element = wrapper.element,
+			textWidth = styles && element.tagName === 'SPAN' && styles.width;
+
+		if (textWidth) {
+			delete styles.width;
+			wrapper.textWidth = textWidth;
+			wrapper.updateTransform();
+		}
+
+		wrapper.styles = extend(wrapper.styles, styles);
+		css(wrapper.element, styles);
+
+		return wrapper;
+	},
+
+
+
+	/**
+	 * VML and useHTML method for calculating the bounding box based on offsets
+	 * @param {Boolean} refresh Whether to force a fresh value from the DOM or to
+	 * use the cached value
+	 *
+	 * @return {Object} A hash containing values for x, y, width and height
+	 */
+
+	htmlGetBBox: function () {
+		var wrapper = this,
+			element = wrapper.element,
+			bBox = wrapper.bBox;
+
+		// faking getBBox in exported SVG in legacy IE
+		if (!bBox) {
+			// faking getBBox in exported SVG in legacy IE (is this a duplicate of the fix for #1079?)
+			if (element.nodeName === 'text') {
+				element.style.position = ABSOLUTE;
+			}
+
+			bBox = wrapper.bBox = {
+				x: element.offsetLeft,
+				y: element.offsetTop,
+				width: element.offsetWidth,
+				height: element.offsetHeight
+			};
+		}
+
+		return bBox;
+	},
+
+	/**
+	 * VML override private method to update elements based on internal
+	 * properties based on SVG transform
+	 */
+	htmlUpdateTransform: function () {
+		// aligning non added elements is expensive
+		if (!this.added) {
+			this.alignOnAdd = true;
+			return;
+		}
+
+		var wrapper = this,
+			renderer = wrapper.renderer,
+			elem = wrapper.element,
+			translateX = wrapper.translateX || 0,
+			translateY = wrapper.translateY || 0,
+			x = wrapper.x || 0,
+			y = wrapper.y || 0,
+			align = wrapper.textAlign || 'left',
+			alignCorrection = { left: 0, center: 0.5, right: 1 }[align],
+			nonLeft = align && align !== 'left',
+			shadows = wrapper.shadows;
+
+		// apply translate
+		css(elem, {
+			marginLeft: translateX,
+			marginTop: translateY
+		});
+		if (shadows) { // used in labels/tooltip
+			each(shadows, function (shadow) {
+				css(shadow, {
+					marginLeft: translateX + 1,
+					marginTop: translateY + 1
+				});
+			});
+		}
+
+		// apply inversion
+		if (wrapper.inverted) { // wrapper is a group
+			each(elem.childNodes, function (child) {
+				renderer.invertChild(child, elem);
+			});
+		}
+
+		if (elem.tagName === 'SPAN') {
+
+			var width, height,
+				rotation = wrapper.rotation,
+				baseline,
+				radians = 0,
+				costheta = 1,
+				sintheta = 0,
+				quad,
+				textWidth = pInt(wrapper.textWidth),
+				xCorr = wrapper.xCorr || 0,
+				yCorr = wrapper.yCorr || 0,
+				currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth].join(',');
+
+			if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed
+
+				if (defined(rotation)) {
+
+					radians = rotation * deg2rad; // deg to rad
+					costheta = mathCos(radians);
+					sintheta = mathSin(radians);
+
+					wrapper.setSpanRotation(rotation, sintheta, costheta);
+
+				}
+
+				width = pick(wrapper.elemWidth, elem.offsetWidth);
+				height = pick(wrapper.elemHeight, elem.offsetHeight);
+
+				// update textWidth
+				if (width > textWidth && /[ \-]/.test(elem.textContent || elem.innerText)) { // #983, #1254
+					css(elem, {
+						width: textWidth + PX,
+						display: 'block',
+						whiteSpace: 'normal'
+					});
+					width = textWidth;
+				}
+
+				// correct x and y
+				baseline = renderer.fontMetrics(elem.style.fontSize).b;
+				xCorr = costheta < 0 && -width;
+				yCorr = sintheta < 0 && -height;
+
+				// correct for baseline and corners spilling out after rotation
+				quad = costheta * sintheta < 0;
+				xCorr += sintheta * baseline * (quad ? 1 - alignCorrection : alignCorrection);
+				yCorr -= costheta * baseline * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1);
+
+				// correct for the length/height of the text
+				if (nonLeft) {
+					xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1);
+					if (rotation) {
+						yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1);
+					}
+					css(elem, {
+						textAlign: align
+					});
+				}
+
+				// record correction
+				wrapper.xCorr = xCorr;
+				wrapper.yCorr = yCorr;
+			}
+
+			// apply position with correction
+			css(elem, {
+				left: (x + xCorr) + PX,
+				top: (y + yCorr) + PX
+			});
+
+			// force reflow in webkit to apply the left and top on useHTML element (#1249)
+			if (isWebKit) {
+				height = elem.offsetHeight; // assigned to height for JSLint purpose
+			}
+
+			// record current text transform
+			wrapper.cTT = currentTextTransform;
+		}
+	},
+
+	/**
+	 * Set the rotation of an individual HTML span
+	 */
+	setSpanRotation: function (rotation) {
+		var rotationStyle = {},
+			cssTransformKey = isIE ? '-ms-transform' : isWebKit ? '-webkit-transform' : isFirefox ? 'MozTransform' : isOpera ? '-o-transform' : '';
+
+		rotationStyle[cssTransformKey] = rotationStyle.transform = 'rotate(' + rotation + 'deg)';
+		css(this.element, rotationStyle);
+	},
+
+	/**
+	 * Private method to update the transform attribute based on internal
+	 * properties
+	 */
+	updateTransform: function () {
+		var wrapper = this,
+			translateX = wrapper.translateX || 0,
+			translateY = wrapper.translateY || 0,
+			scaleX = wrapper.scaleX,
+			scaleY = wrapper.scaleY,
+			inverted = wrapper.inverted,
+			rotation = wrapper.rotation,
+			transform;
+
+		// flipping affects translate as adjustment for flipping around the group's axis
+		if (inverted) {
+			translateX += wrapper.attr('width');
+			translateY += wrapper.attr('height');
+		}
+
+		// Apply translate. Nearly all transformed elements have translation, so instead
+		// of checking for translate = 0, do it always (#1767, #1846).
+		transform = ['translate(' + translateX + ',' + translateY + ')'];
+
+		// apply rotation
+		if (inverted) {
+			transform.push('rotate(90) scale(-1,1)');
+		} else if (rotation) { // text rotation
+			transform.push('rotate(' + rotation + ' ' + (wrapper.x || 0) + ' ' + (wrapper.y || 0) + ')');
+		}
+
+		// apply scale
+		if (defined(scaleX) || defined(scaleY)) {
+			transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');
+		}
+
+		if (transform.length) {
+			attr(wrapper.element, 'transform', transform.join(' '));
+		}
+	},
+	/**
+	 * Bring the element to the front
+	 */
+	toFront: function () {
+		var element = this.element;
+		element.parentNode.appendChild(element);
+		return this;
+	},
+
+
+	/**
+	 * Break down alignment options like align, verticalAlign, x and y
+	 * to x and y relative to the chart.
+	 *
+	 * @param {Object} alignOptions
+	 * @param {Boolean} alignByTranslate
+	 * @param {String[Object} box The box to align to, needs a width and height. When the
+	 *        box is a string, it refers to an object in the Renderer. For example, when
+	 *        box is 'spacingBox', it refers to Renderer.spacingBox which holds width, height
+	 *        x and y properties.
+	 *
+	 */
+	align: function (alignOptions, alignByTranslate, box) {
+		var align,
+			vAlign,
+			x,
+			y,
+			attribs = {},
+			alignTo,
+			renderer = this.renderer,
+			alignedObjects = renderer.alignedObjects;
+
+		// First call on instanciate
+		if (alignOptions) {
+			this.alignOptions = alignOptions;
+			this.alignByTranslate = alignByTranslate;
+			if (!box || isString(box)) { // boxes other than renderer handle this internally
+				this.alignTo = alignTo = box || 'renderer';
+				erase(alignedObjects, this); // prevent duplicates, like legendGroup after resize
+				alignedObjects.push(this);
+				box = null; // reassign it below
+			}
+
+		// When called on resize, no arguments are supplied
+		} else {
+			alignOptions = this.alignOptions;
+			alignByTranslate = this.alignByTranslate;
+			alignTo = this.alignTo;
+		}
+
+		box = pick(box, renderer[alignTo], renderer);
+
+		// Assign variables
+		align = alignOptions.align;
+		vAlign = alignOptions.verticalAlign;
+		x = (box.x || 0) + (alignOptions.x || 0); // default: left align
+		y = (box.y || 0) + (alignOptions.y || 0); // default: top align
+
+		// Align
+		if (align === 'right' || align === 'center') {
+			x += (box.width - (alignOptions.width || 0)) /
+					{ right: 1, center: 2 }[align];
+		}
+		attribs[alignByTranslate ? 'translateX' : 'x'] = mathRound(x);
+
+
+		// Vertical align
+		if (vAlign === 'bottom' || vAlign === 'middle') {
+			y += (box.height - (alignOptions.height || 0)) /
+					({ bottom: 1, middle: 2 }[vAlign] || 1);
+
+		}
+		attribs[alignByTranslate ? 'translateY' : 'y'] = mathRound(y);
+
+		// Animate only if already placed
+		this[this.placed ? 'animate' : 'attr'](attribs);
+		this.placed = true;
+		this.alignAttr = attribs;
+
+		return this;
+	},
+
+	/**
+	 * Get the bounding box (width, height, x and y) for the element
+	 */
+	getBBox: function () {
+		var wrapper = this,
+			bBox = wrapper.bBox,
+			renderer = wrapper.renderer,
+			width,
+			height,
+			rotation = wrapper.rotation,
+			element = wrapper.element,
+			styles = wrapper.styles,
+			rad = rotation * deg2rad;
+
+		if (!bBox) {
+			// SVG elements
+			if (element.namespaceURI === SVG_NS || renderer.forExport) {
+				try { // Fails in Firefox if the container has display: none.
+
+					bBox = element.getBBox ?
+						// SVG: use extend because IE9 is not allowed to change width and height in case
+						// of rotation (below)
+						extend({}, element.getBBox()) :
+						// Canvas renderer and legacy IE in export mode
+						{
+							width: element.offsetWidth,
+							height: element.offsetHeight
+						};
+				} catch (e) {}
+
+				// If the bBox is not set, the try-catch block above failed. The other condition
+				// is for Opera that returns a width of -Infinity on hidden elements.
+				if (!bBox || bBox.width < 0) {
+					bBox = { width: 0, height: 0 };
+				}
+
+
+			// VML Renderer or useHTML within SVG
+			} else {
+
+				bBox = wrapper.htmlGetBBox();
+
+			}
+
+			// True SVG elements as well as HTML elements in modern browsers using the .useHTML option
+			// need to compensated for rotation
+			if (renderer.isSVG) {
+				width = bBox.width;
+				height = bBox.height;
+
+				// Workaround for wrong bounding box in IE9 and IE10 (#1101, #1505, #1669)
+				if (isIE && styles && styles.fontSize === '11px' && height.toPrecision(3) === '22.7') {
+					bBox.height = height = 14;
+				}
+
+				// Adjust for rotated text
+				if (rotation) {
+					bBox.width = mathAbs(height * mathSin(rad)) + mathAbs(width * mathCos(rad));
+					bBox.height = mathAbs(height * mathCos(rad)) + mathAbs(width * mathSin(rad));
+				}
+			}
+
+			wrapper.bBox = bBox;
+		}
+		return bBox;
+	},
+
+	/**
+	 * Show the element
+	 */
+	show: function () {
+		return this.attr({ visibility: VISIBLE });
+	},
+
+	/**
+	 * Hide the element
+	 */
+	hide: function () {
+		return this.attr({ visibility: HIDDEN });
+	},
+
+	fadeOut: function (duration) {
+		var elemWrapper = this;
+		elemWrapper.animate({
+			opacity: 0
+		}, {
+			duration: duration || 150,
+			complete: function () {
+				elemWrapper.hide();
+			}
+		});
+	},
+
+	/**
+	 * Add the element
+	 * @param {Object|Undefined} parent Can be an element, an element wrapper or undefined
+	 *    to append the element to the renderer.box.
+	 */
+	add: function (parent) {
+
+		var renderer = this.renderer,
+			parentWrapper = parent || renderer,
+			parentNode = parentWrapper.element || renderer.box,
+			childNodes = parentNode.childNodes,
+			element = this.element,
+			zIndex = attr(element, 'zIndex'),
+			otherElement,
+			otherZIndex,
+			i,
+			inserted;
+
+		if (parent) {
+			this.parentGroup = parent;
+		}
+
+		// mark as inverted
+		this.parentInverted = parent && parent.inverted;
+
+		// build formatted text
+		if (this.textStr !== undefined) {
+			renderer.buildText(this);
+		}
+
+		// mark the container as having z indexed children
+		if (zIndex) {
+			parentWrapper.handleZ = true;
+			zIndex = pInt(zIndex);
+		}
+
+		// insert according to this and other elements' zIndex
+		if (parentWrapper.handleZ) { // this element or any of its siblings has a z index
+			for (i = 0; i < childNodes.length; i++) {
+				otherElement = childNodes[i];
+				otherZIndex = attr(otherElement, 'zIndex');
+				if (otherElement !== element && (
+						// insert before the first element with a higher zIndex
+						pInt(otherZIndex) > zIndex ||
+						// if no zIndex given, insert before the first element with a zIndex
+						(!defined(zIndex) && defined(otherZIndex))
+
+						)) {
+					parentNode.insertBefore(element, otherElement);
+					inserted = true;
+					break;
+				}
+			}
+		}
+
+		// default: append at the end
+		if (!inserted) {
+			parentNode.appendChild(element);
+		}
+
+		// mark as added
+		this.added = true;
+
+		// fire an event for internal hooks
+		fireEvent(this, 'add');
+
+		return this;
+	},
+
+	/**
+	 * Removes a child either by removeChild or move to garbageBin.
+	 * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.
+	 */
+	safeRemoveChild: function (element) {
+		var parentNode = element.parentNode;
+		if (parentNode) {
+			parentNode.removeChild(element);
+		}
+	},
+
+	/**
+	 * Destroy the element and element wrapper
+	 */
+	destroy: function () {
+		var wrapper = this,
+			element = wrapper.element || {},
+			shadows = wrapper.shadows,
+			parentToClean = wrapper.renderer.isSVG && element.nodeName === 'SPAN' && element.parentNode,
+			grandParent,
+			key,
+			i;
+
+		// remove events
+		element.onclick = element.onmouseout = element.onmouseover = element.onmousemove = element.point = null;
+		stop(wrapper); // stop running animations
+
+		if (wrapper.clipPath) {
+			wrapper.clipPath = wrapper.clipPath.destroy();
+		}
+
+		// Destroy stops in case this is a gradient object
+		if (wrapper.stops) {
+			for (i = 0; i < wrapper.stops.length; i++) {
+				wrapper.stops[i] = wrapper.stops[i].destroy();
+			}
+			wrapper.stops = null;
+		}
+
+		// remove element
+		wrapper.safeRemoveChild(element);
+
+		// destroy shadows
+		if (shadows) {
+			each(shadows, function (shadow) {
+				wrapper.safeRemoveChild(shadow);
+			});
+		}
+
+		// In case of useHTML, clean up empty containers emulating SVG groups (#1960).
+		while (parentToClean && parentToClean.childNodes.length === 0) {
+			grandParent = parentToClean.parentNode;
+			wrapper.safeRemoveChild(parentToClean);
+			parentToClean = grandParent;
+		}
+
+		// remove from alignObjects
+		if (wrapper.alignTo) {
+			erase(wrapper.renderer.alignedObjects, wrapper);
+		}
+
+		for (key in wrapper) {
+			delete wrapper[key];
+		}
+
+		return null;
+	},
+
+	/**
+	 * Add a shadow to the element. Must be done after the element is added to the DOM
+	 * @param {Boolean|Object} shadowOptions
+	 */
+	shadow: function (shadowOptions, group, cutOff) {
+		var shadows = [],
+			i,
+			shadow,
+			element = this.element,
+			strokeWidth,
+			shadowWidth,
+			shadowElementOpacity,
+
+			// compensate for inverted plot area
+			transform;
+
+
+		if (shadowOptions) {
+			shadowWidth = pick(shadowOptions.width, 3);
+			shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;
+			transform = this.parentInverted ?
+				'(-1,-1)' :
+				'(' + pick(shadowOptions.offsetX, 1) + ', ' + pick(shadowOptions.offsetY, 1) + ')';
+			for (i = 1; i <= shadowWidth; i++) {
+				shadow = element.cloneNode(0);
+				strokeWidth = (shadowWidth * 2) + 1 - (2 * i);
+				attr(shadow, {
+					'isShadow': 'true',
+					'stroke': shadowOptions.color || 'black',
+					'stroke-opacity': shadowElementOpacity * i,
+					'stroke-width': strokeWidth,
+					'transform': 'translate' + transform,
+					'fill': NONE
+				});
+				if (cutOff) {
+					attr(shadow, 'height', mathMax(attr(shadow, 'height') - strokeWidth, 0));
+					shadow.cutHeight = strokeWidth;
+				}
+
+				if (group) {
+					group.element.appendChild(shadow);
+				} else {
+					element.parentNode.insertBefore(shadow, element);
+				}
+
+				shadows.push(shadow);
+			}
+
+			this.shadows = shadows;
+		}
+		return this;
+
+	}
+};
+
+
+/**
+ * The default SVG renderer
+ */
+var SVGRenderer = function () {
+	this.init.apply(this, arguments);
+};
+SVGRenderer.prototype = {
+	Element: SVGElement,
+
+	/**
+	 * Initialize the SVGRenderer
+	 * @param {Object} container
+	 * @param {Number} width
+	 * @param {Number} height
+	 * @param {Boolean} forExport
+	 */
+	init: function (container, width, height, forExport) {
+		var renderer = this,
+			loc = location,
+			boxWrapper,
+			element,
+			desc;
+
+		boxWrapper = renderer.createElement('svg')
+			.attr({
+				version: '1.1'
+			});
+		element = boxWrapper.element;
+		container.appendChild(element);
+
+		// For browsers other than IE, add the namespace attribute (#1978)
+		if (container.innerHTML.indexOf('xmlns') === -1) {
+			attr(element, 'xmlns', SVG_NS);
+		}
+
+		// object properties
+		renderer.isSVG = true;
+		renderer.box = element;
+		renderer.boxWrapper = boxWrapper;
+		renderer.alignedObjects = [];
+
+		// Page url used for internal references. #24, #672, #1070
+		renderer.url = (isFirefox || isWebKit) && doc.getElementsByTagName('base').length ?
+			loc.href
+				.replace(/#.*?$/, '') // remove the hash
+				.replace(/([\('\)])/g, '\\$1') // escape parantheses and quotes
+				.replace(/ /g, '%20') : // replace spaces (needed for Safari only)
+			'';
+
+		// Add description
+		desc = this.createElement('desc').add();
+		desc.element.appendChild(doc.createTextNode('Created with ' + PRODUCT + ' ' + VERSION));
+
+
+		renderer.defs = this.createElement('defs').add();
+		renderer.forExport = forExport;
+		renderer.gradients = {}; // Object where gradient SvgElements are stored
+
+		renderer.setSize(width, height, false);
+
+
+
+		// Issue 110 workaround:
+		// In Firefox, if a div is positioned by percentage, its pixel position may land
+		// between pixels. The container itself doesn't display this, but an SVG element
+		// inside this container will be drawn at subpixel precision. In order to draw
+		// sharp lines, this must be compensated for. This doesn't seem to work inside
+		// iframes though (like in jsFiddle).
+		var subPixelFix, rect;
+		if (isFirefox && container.getBoundingClientRect) {
+			renderer.subPixelFix = subPixelFix = function () {
+				css(container, { left: 0, top: 0 });
+				rect = container.getBoundingClientRect();
+				css(container, {
+					left: (mathCeil(rect.left) - rect.left) + PX,
+					top: (mathCeil(rect.top) - rect.top) + PX
+				});
+			};
+
+			// run the fix now
+			subPixelFix();
+
+			// run it on resize
+			addEvent(win, 'resize', subPixelFix);
+		}
+	},
+
+	/**
+	 * Detect whether the renderer is hidden. This happens when one of the parent elements
+	 * has display: none. #608.
+	 */
+	isHidden: function () {
+		return !this.boxWrapper.getBBox().width;
+	},
+
+	/**
+	 * Destroys the renderer and its allocated members.
+	 */
+	destroy: function () {
+		var renderer = this,
+			rendererDefs = renderer.defs;
+		renderer.box = null;
+		renderer.boxWrapper = renderer.boxWrapper.destroy();
+
+		// Call destroy on all gradient elements
+		destroyObjectProperties(renderer.gradients || {});
+		renderer.gradients = null;
+
+		// Defs are null in VMLRenderer
+		// Otherwise, destroy them here.
+		if (rendererDefs) {
+			renderer.defs = rendererDefs.destroy();
+		}
+
+		// Remove sub pixel fix handler
+		// We need to check that there is a handler, otherwise all functions that are registered for event 'resize' are removed
+		// See issue #982
+		if (renderer.subPixelFix) {
+			removeEvent(win, 'resize', renderer.subPixelFix);
+		}
+
+		renderer.alignedObjects = null;
+
+		return null;
+	},
+
+	/**
+	 * Create a wrapper for an SVG element
+	 * @param {Object} nodeName
+	 */
+	createElement: function (nodeName) {
+		var wrapper = new this.Element();
+		wrapper.init(this, nodeName);
+		return wrapper;
+	},
+
+	/**
+	 * Dummy function for use in canvas renderer
+	 */
+	draw: function () {},
+
+	/**
+	 * Parse a simple HTML string into SVG tspans
+	 *
+	 * @param {Object} textNode The parent text SVG node
+	 */
+	buildText: function (wrapper) {
+		var textNode = wrapper.element,
+			renderer = this,
+			forExport = renderer.forExport,
+			lines = pick(wrapper.textStr, '').toString()
+				.replace(/<(b|strong)>/g, '<span style="font-weight:bold">')
+				.replace(/<(i|em)>/g, '<span style="font-style:italic">')
+				.replace(/<a/g, '<span')
+				.replace(/<\/(b|strong|i|em|a)>/g, '</span>')
+				.split(/<br.*?>/g),
+			childNodes = textNode.childNodes,
+			styleRegex = /style="([^"]+)"/,
+			hrefRegex = /href="(http[^"]+)"/,
+			parentX = attr(textNode, 'x'),
+			textStyles = wrapper.styles,
+			width = textStyles && textStyles.width && pInt(textStyles.width),
+			textLineHeight = textStyles && textStyles.lineHeight,
+			i = childNodes.length;
+
+		/// remove old text
+		while (i--) {
+			textNode.removeChild(childNodes[i]);
+		}
+
+		if (width && !wrapper.added) {
+			this.box.appendChild(textNode); // attach it to the DOM to read offset width
+		}
+
+		// remove empty line at end
+		if (lines[lines.length - 1] === '') {
+			lines.pop();
+		}
+
+		// build the lines
+		each(lines, function (line, lineNo) {
+			var spans, spanNo = 0;
+
+			line = line.replace(/<span/g, '|||<span').replace(/<\/span>/g, '</span>|||');
+			spans = line.split('|||');
+
+			each(spans, function (span) {
+				if (span !== '' || spans.length === 1) {
+					var attributes = {},
+						tspan = doc.createElementNS(SVG_NS, 'tspan'),
+						spanStyle; // #390
+					if (styleRegex.test(span)) {
+						spanStyle = span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2');
+						attr(tspan, 'style', spanStyle);
+					}
+					if (hrefRegex.test(span) && !forExport) { // Not for export - #1529
+						attr(tspan, 'onclick', 'location.href=\"' + span.match(hrefRegex)[1] + '\"');
+						css(tspan, { cursor: 'pointer' });
+					}
+
+					span = (span.replace(/<(.|\n)*?>/g, '') || ' ')
+						.replace(/&lt;/g, '<')
+						.replace(/&gt;/g, '>');
+
+					// Nested tags aren't supported, and cause crash in Safari (#1596)
+					if (span !== ' ') {
+
+						// add the text node
+						tspan.appendChild(doc.createTextNode(span));
+
+						if (!spanNo) { // first span in a line, align it to the left
+							attributes.x = parentX;
+						} else {
+							attributes.dx = 0; // #16
+						}
+
+						// add attributes
+						attr(tspan, attributes);
+
+						// first span on subsequent line, add the line height
+						if (!spanNo && lineNo) {
+
+							// allow getting the right offset height in exporting in IE
+							if (!hasSVG && forExport) {
+								css(tspan, { display: 'block' });
+							}
+
+							// Set the line height based on the font size of either
+							// the text element or the tspan element
+							attr(
+								tspan,
+								'dy',
+								textLineHeight || renderer.fontMetrics(
+									/px$/.test(tspan.style.fontSize) ?
+										tspan.style.fontSize :
+										textStyles.fontSize
+								).h,
+								// Safari 6.0.2 - too optimized for its own good (#1539)
+								// TODO: revisit this with future versions of Safari
+								isWebKit && tspan.offsetHeight
+							);
+						}
+
+						// Append it
+						textNode.appendChild(tspan);
+
+						spanNo++;
+
+						// check width and apply soft breaks
+						if (width) {
+							var words = span.replace(/([^\^])-/g, '$1- ').split(' '), // #1273
+								tooLong,
+								actualWidth,
+								clipHeight = wrapper._clipHeight,
+								rest = [],
+								dy = pInt(textLineHeight || 16),
+								softLineNo = 1,
+								bBox;
+
+							while (words.length || rest.length) {
+								delete wrapper.bBox; // delete cache
+								bBox = wrapper.getBBox();
+								actualWidth = bBox.width;
+								tooLong = actualWidth > width;
+								if (!tooLong || words.length === 1) { // new line needed
+									words = rest;
+									rest = [];
+									if (words.length) {
+										softLineNo++;
+
+										if (clipHeight && softLineNo * dy > clipHeight) {
+											words = ['...'];
+											wrapper.attr('title', wrapper.textStr);
+										} else {
+
+											tspan = doc.createElementNS(SVG_NS, 'tspan');
+											attr(tspan, {
+												dy: dy,
+												x: parentX
+											});
+											if (spanStyle) { // #390
+												attr(tspan, 'style', spanStyle);
+											}
+											textNode.appendChild(tspan);
+
+											if (actualWidth > width) { // a single word is pressing it out
+												width = actualWidth;
+											}
+										}
+									}
+								} else { // append to existing line tspan
+									tspan.removeChild(tspan.firstChild);
+									rest.unshift(words.pop());
+								}
+								if (words.length) {
+									tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));
+								}
+							}
+						}
+					}
+				}
+			});
+		});
+	},
+
+	/**
+	 * Create a button with preset states
+	 * @param {String} text
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Function} callback
+	 * @param {Object} normalState
+	 * @param {Object} hoverState
+	 * @param {Object} pressedState
+	 */
+	button: function (text, x, y, callback, normalState, hoverState, pressedState, disabledState) {
+		var label = this.label(text, x, y, null, null, null, null, null, 'button'),
+			curState = 0,
+			stateOptions,
+			stateStyle,
+			normalStyle,
+			hoverStyle,
+			pressedStyle,
+			disabledStyle,
+			STYLE = 'style',
+			verticalGradient = { x1: 0, y1: 0, x2: 0, y2: 1 };
+
+		// Normal state - prepare the attributes
+		normalState = merge({
+			'stroke-width': 1,
+			stroke: '#CCCCCC',
+			fill: {
+				linearGradient: verticalGradient,
+				stops: [
+					[0, '#FEFEFE'],
+					[1, '#F6F6F6']
+				]
+			},
+			r: 2,
+			padding: 5,
+			style: {
+				color: 'black'
+			}
+		}, normalState);
+		normalStyle = normalState[STYLE];
+		delete normalState[STYLE];
+
+		// Hover state
+		hoverState = merge(normalState, {
+			stroke: '#68A',
+			fill: {
+				linearGradient: verticalGradient,
+				stops: [
+					[0, '#FFF'],
+					[1, '#ACF']
+				]
+			}
+		}, hoverState);
+		hoverStyle = hoverState[STYLE];
+		delete hoverState[STYLE];
+
+		// Pressed state
+		pressedState = merge(normalState, {
+			stroke: '#68A',
+			fill: {
+				linearGradient: verticalGradient,
+				stops: [
+					[0, '#9BD'],
+					[1, '#CDF']
+				]
+			}
+		}, pressedState);
+		pressedStyle = pressedState[STYLE];
+		delete pressedState[STYLE];
+
+		// Disabled state
+		disabledState = merge(normalState, {
+			style: {
+				color: '#CCC'
+			}
+		}, disabledState);
+		disabledStyle = disabledState[STYLE];
+		delete disabledState[STYLE];
+
+		// Add the events. IE9 and IE10 need mouseover and mouseout to funciton (#667).
+		addEvent(label.element, isIE ? 'mouseover' : 'mouseenter', function () {
+			if (curState !== 3) {
+				label.attr(hoverState)
+					.css(hoverStyle);
+			}
+		});
+		addEvent(label.element, isIE ? 'mouseout' : 'mouseleave', function () {
+			if (curState !== 3) {
+				stateOptions = [normalState, hoverState, pressedState][curState];
+				stateStyle = [normalStyle, hoverStyle, pressedStyle][curState];
+				label.attr(stateOptions)
+					.css(stateStyle);
+			}
+		});
+
+		label.setState = function (state) {
+			label.state = curState = state;
+			if (!state) {
+				label.attr(normalState)
+					.css(normalStyle);
+			} else if (state === 2) {
+				label.attr(pressedState)
+					.css(pressedStyle);
+			} else if (state === 3) {
+				label.attr(disabledState)
+					.css(disabledStyle);
+			}
+		};
+
+		return label
+			.on('click', function () {
+				if (curState !== 3) {
+					callback.call(label);
+				}
+			})
+			.attr(normalState)
+			.css(extend({ cursor: 'default' }, normalStyle));
+	},
+
+	/**
+	 * Make a straight line crisper by not spilling out to neighbour pixels
+	 * @param {Array} points
+	 * @param {Number} width
+	 */
+	crispLine: function (points, width) {
+		// points format: [M, 0, 0, L, 100, 0]
+		// normalize to a crisp line
+		if (points[1] === points[4]) {
+			// Substract due to #1129. Now bottom and left axis gridlines behave the same.
+			points[1] = points[4] = mathRound(points[1]) - (width % 2 / 2);
+		}
+		if (points[2] === points[5]) {
+			points[2] = points[5] = mathRound(points[2]) + (width % 2 / 2);
+		}
+		return points;
+	},
+
+
+	/**
+	 * Draw a path
+	 * @param {Array} path An SVG path in array form
+	 */
+	path: function (path) {
+		var attr = {
+			fill: NONE
+		};
+		if (isArray(path)) {
+			attr.d = path;
+		} else if (isObject(path)) { // attributes
+			extend(attr, path);
+		}
+		return this.createElement('path').attr(attr);
+	},
+
+	/**
+	 * Draw and return an SVG circle
+	 * @param {Number} x The x position
+	 * @param {Number} y The y position
+	 * @param {Number} r The radius
+	 */
+	circle: function (x, y, r) {
+		var attr = isObject(x) ?
+			x :
+			{
+				x: x,
+				y: y,
+				r: r
+			};
+
+		return this.createElement('circle').attr(attr);
+	},
+
+	/**
+	 * Draw and return an arc
+	 * @param {Number} x X position
+	 * @param {Number} y Y position
+	 * @param {Number} r Radius
+	 * @param {Number} innerR Inner radius like used in donut charts
+	 * @param {Number} start Starting angle
+	 * @param {Number} end Ending angle
+	 */
+	arc: function (x, y, r, innerR, start, end) {
+		var arc;
+
+		if (isObject(x)) {
+			y = x.y;
+			r = x.r;
+			innerR = x.innerR;
+			start = x.start;
+			end = x.end;
+			x = x.x;
+		}
+
+		// Arcs are defined as symbols for the ability to set
+		// attributes in attr and animate
+		arc = this.symbol('arc', x || 0, y || 0, r || 0, r || 0, {
+			innerR: innerR || 0,
+			start: start || 0,
+			end: end || 0
+		});
+		arc.r = r; // #959
+		return arc;
+	},
+
+	/**
+	 * Draw and return a rectangle
+	 * @param {Number} x Left position
+	 * @param {Number} y Top position
+	 * @param {Number} width
+	 * @param {Number} height
+	 * @param {Number} r Border corner radius
+	 * @param {Number} strokeWidth A stroke width can be supplied to allow crisp drawing
+	 */
+	rect: function (x, y, width, height, r, strokeWidth) {
+
+		r = isObject(x) ? x.r : r;
+
+		var wrapper = this.createElement('rect').attr({
+				rx: r,
+				ry: r,
+				fill: NONE
+			});
+		return wrapper.attr(
+				isObject(x) ?
+					x :
+					// do not crispify when an object is passed in (as in column charts)
+					wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))
+			);
+	},
+
+	/**
+	 * Resize the box and re-align all aligned elements
+	 * @param {Object} width
+	 * @param {Object} height
+	 * @param {Boolean} animate
+	 *
+	 */
+	setSize: function (width, height, animate) {
+		var renderer = this,
+			alignedObjects = renderer.alignedObjects,
+			i = alignedObjects.length;
+
+		renderer.width = width;
+		renderer.height = height;
+
+		renderer.boxWrapper[pick(animate, true) ? 'animate' : 'attr']({
+			width: width,
+			height: height
+		});
+
+		while (i--) {
+			alignedObjects[i].align();
+		}
+	},
+
+	/**
+	 * Create a group
+	 * @param {String} name The group will be given a class name of 'highcharts-{name}'.
+	 *     This can be used for styling and scripting.
+	 */
+	g: function (name) {
+		var elem = this.createElement('g');
+		return defined(name) ? elem.attr({ 'class': PREFIX + name }) : elem;
+	},
+
+	/**
+	 * Display an image
+	 * @param {String} src
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	image: function (src, x, y, width, height) {
+		var attribs = {
+				preserveAspectRatio: NONE
+			},
+			elemWrapper;
+
+		// optional properties
+		if (arguments.length > 1) {
+			extend(attribs, {
+				x: x,
+				y: y,
+				width: width,
+				height: height
+			});
+		}
+
+		elemWrapper = this.createElement('image').attr(attribs);
+
+		// set the href in the xlink namespace
+		if (elemWrapper.element.setAttributeNS) {
+			elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink',
+				'href', src);
+		} else {
+			// could be exporting in IE
+			// using href throws "not supported" in ie7 and under, requries regex shim to fix later
+			elemWrapper.element.setAttribute('hc-svg-href', src);
+	}
+
+		return elemWrapper;
+	},
+
+	/**
+	 * Draw a symbol out of pre-defined shape paths from the namespace 'symbol' object.
+	 *
+	 * @param {Object} symbol
+	 * @param {Object} x
+	 * @param {Object} y
+	 * @param {Object} radius
+	 * @param {Object} options
+	 */
+	symbol: function (symbol, x, y, width, height, options) {
+
+		var obj,
+
+			// get the symbol definition function
+			symbolFn = this.symbols[symbol],
+
+			// check if there's a path defined for this symbol
+			path = symbolFn && symbolFn(
+				mathRound(x),
+				mathRound(y),
+				width,
+				height,
+				options
+			),
+
+			imageElement,
+			imageRegex = /^url\((.*?)\)$/,
+			imageSrc,
+			imageSize,
+			centerImage;
+
+		if (path) {
+
+			obj = this.path(path);
+			// expando properties for use in animate and attr
+			extend(obj, {
+				symbolName: symbol,
+				x: x,
+				y: y,
+				width: width,
+				height: height
+			});
+			if (options) {
+				extend(obj, options);
+			}
+
+
+		// image symbols
+		} else if (imageRegex.test(symbol)) {
+
+			// On image load, set the size and position
+			centerImage = function (img, size) {
+				if (img.element) { // it may be destroyed in the meantime (#1390)
+					img.attr({
+						width: size[0],
+						height: size[1]
+					});
+
+					if (!img.alignByTranslate) { // #185
+						img.translate(
+							mathRound((width - size[0]) / 2), // #1378
+							mathRound((height - size[1]) / 2)
+						);
+					}
+				}
+			};
+
+			imageSrc = symbol.match(imageRegex)[1];
+			imageSize = symbolSizes[imageSrc];
+
+			// Ireate the image synchronously, add attribs async
+			obj = this.image(imageSrc)
+				.attr({
+					x: x,
+					y: y
+				});
+			obj.isImg = true;
+
+			if (imageSize) {
+				centerImage(obj, imageSize);
+			} else {
+				// Initialize image to be 0 size so export will still function if there's no cached sizes.
+				//
+				obj.attr({ width: 0, height: 0 });
+
+				// Create a dummy JavaScript image to get the width and height. Due to a bug in IE < 8,
+				// the created element must be assigned to a variable in order to load (#292).
+				imageElement = createElement('img', {
+					onload: function () {
+						centerImage(obj, symbolSizes[imageSrc] = [this.width, this.height]);
+					},
+					src: imageSrc
+				});
+			}
+		}
+
+		return obj;
+	},
+
+	/**
+	 * An extendable collection of functions for defining symbol paths.
+	 */
+	symbols: {
+		'circle': function (x, y, w, h) {
+			var cpw = 0.166 * w;
+			return [
+				M, x + w / 2, y,
+				'C', x + w + cpw, y, x + w + cpw, y + h, x + w / 2, y + h,
+				'C', x - cpw, y + h, x - cpw, y, x + w / 2, y,
+				'Z'
+			];
+		},
+
+		'square': function (x, y, w, h) {
+			return [
+				M, x, y,
+				L, x + w, y,
+				x + w, y + h,
+				x, y + h,
+				'Z'
+			];
+		},
+
+		'triangle': function (x, y, w, h) {
+			return [
+				M, x + w / 2, y,
+				L, x + w, y + h,
+				x, y + h,
+				'Z'
+			];
+		},
+
+		'triangle-down': function (x, y, w, h) {
+			return [
+				M, x, y,
+				L, x + w, y,
+				x + w / 2, y + h,
+				'Z'
+			];
+		},
+		'diamond': function (x, y, w, h) {
+			return [
+				M, x + w / 2, y,
+				L, x + w, y + h / 2,
+				x + w / 2, y + h,
+				x, y + h / 2,
+				'Z'
+			];
+		},
+		'arc': function (x, y, w, h, options) {
+			var start = options.start,
+				radius = options.r || w || h,
+				end = options.end - 0.001, // to prevent cos and sin of start and end from becoming equal on 360 arcs (related: #1561)
+				innerRadius = options.innerR,
+				open = options.open,
+				cosStart = mathCos(start),
+				sinStart = mathSin(start),
+				cosEnd = mathCos(end),
+				sinEnd = mathSin(end),
+				longArc = options.end - start < mathPI ? 0 : 1;
+
+			return [
+				M,
+				x + radius * cosStart,
+				y + radius * sinStart,
+				'A', // arcTo
+				radius, // x radius
+				radius, // y radius
+				0, // slanting
+				longArc, // long or short arc
+				1, // clockwise
+				x + radius * cosEnd,
+				y + radius * sinEnd,
+				open ? M : L,
+				x + innerRadius * cosEnd,
+				y + innerRadius * sinEnd,
+				'A', // arcTo
+				innerRadius, // x radius
+				innerRadius, // y radius
+				0, // slanting
+				longArc, // long or short arc
+				0, // clockwise
+				x + innerRadius * cosStart,
+				y + innerRadius * sinStart,
+
+				open ? '' : 'Z' // close
+			];
+		}
+	},
+
+	/**
+	 * Define a clipping rectangle
+	 * @param {String} id
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	clipRect: function (x, y, width, height) {
+		var wrapper,
+			id = PREFIX + idCounter++,
+
+			clipPath = this.createElement('clipPath').attr({
+				id: id
+			}).add(this.defs);
+
+		wrapper = this.rect(x, y, width, height, 0).add(clipPath);
+		wrapper.id = id;
+		wrapper.clipPath = clipPath;
+
+		return wrapper;
+	},
+
+
+	/**
+	 * Take a color and return it if it's a string, make it a gradient if it's a
+	 * gradient configuration object. Prior to Highstock, an array was used to define
+	 * a linear gradient with pixel positions relative to the SVG. In newer versions
+	 * we change the coordinates to apply relative to the shape, using coordinates
+	 * 0-1 within the shape. To preserve backwards compatibility, linearGradient
+	 * in this definition is an object of x1, y1, x2 and y2.
+	 *
+	 * @param {Object} color The color or config object
+	 */
+	color: function (color, elem, prop) {
+		var renderer = this,
+			colorObject,
+			regexRgba = /^rgba/,
+			gradName,
+			gradAttr,
+			gradients,
+			gradientObject,
+			stops,
+			stopColor,
+			stopOpacity,
+			radialReference,
+			n,
+			id,
+			key = [];
+
+		// Apply linear or radial gradients
+		if (color && color.linearGradient) {
+			gradName = 'linearGradient';
+		} else if (color && color.radialGradient) {
+			gradName = 'radialGradient';
+		}
+
+		if (gradName) {
+			gradAttr = color[gradName];
+			gradients = renderer.gradients;
+			stops = color.stops;
+			radialReference = elem.radialReference;
+
+			// Keep < 2.2 kompatibility
+			if (isArray(gradAttr)) {
+				color[gradName] = gradAttr = {
+					x1: gradAttr[0],
+					y1: gradAttr[1],
+					x2: gradAttr[2],
+					y2: gradAttr[3],
+					gradientUnits: 'userSpaceOnUse'
+				};
+			}
+
+			// Correct the radial gradient for the radial reference system
+			if (gradName === 'radialGradient' && radialReference && !defined(gradAttr.gradientUnits)) {
+				gradAttr = merge(gradAttr, {
+					cx: (radialReference[0] - radialReference[2] / 2) + gradAttr.cx * radialReference[2],
+					cy: (radialReference[1] - radialReference[2] / 2) + gradAttr.cy * radialReference[2],
+					r: gradAttr.r * radialReference[2],
+					gradientUnits: 'userSpaceOnUse'
+				});
+			}
+
+			// Build the unique key to detect whether we need to create a new element (#1282)
+			for (n in gradAttr) {
+				if (n !== 'id') {
+					key.push(n, gradAttr[n]);
+				}
+			}
+			for (n in stops) {
+				key.push(stops[n]);
+			}
+			key = key.join(',');
+
+			// Check if a gradient object with the same config object is created within this renderer
+			if (gradients[key]) {
+				id = gradients[key].id;
+
+			} else {
+
+				// Set the id and create the element
+				gradAttr.id = id = PREFIX + idCounter++;
+				gradients[key] = gradientObject = renderer.createElement(gradName)
+					.attr(gradAttr)
+					.add(renderer.defs);
+
+
+				// The gradient needs to keep a list of stops to be able to destroy them
+				gradientObject.stops = [];
+				each(stops, function (stop) {
+					var stopObject;
+					if (regexRgba.test(stop[1])) {
+						colorObject = Color(stop[1]);
+						stopColor = colorObject.get('rgb');
+						stopOpacity = colorObject.get('a');
+					} else {
+						stopColor = stop[1];
+						stopOpacity = 1;
+					}
+					stopObject = renderer.createElement('stop').attr({
+						offset: stop[0],
+						'stop-color': stopColor,
+						'stop-opacity': stopOpacity
+					}).add(gradientObject);
+
+					// Add the stop element to the gradient
+					gradientObject.stops.push(stopObject);
+				});
+			}
+
+			// Return the reference to the gradient object
+			return 'url(' + renderer.url + '#' + id + ')';
+
+		// Webkit and Batik can't show rgba.
+		} else if (regexRgba.test(color)) {
+			colorObject = Color(color);
+			attr(elem, prop + '-opacity', colorObject.get('a'));
+
+			return colorObject.get('rgb');
+
+
+		} else {
+			// Remove the opacity attribute added above. Does not throw if the attribute is not there.
+			elem.removeAttribute(prop + '-opacity');
+
+			return color;
+		}
+
+	},
+
+
+	/**
+	 * Add text to the SVG object
+	 * @param {String} str
+	 * @param {Number} x Left position
+	 * @param {Number} y Top position
+	 * @param {Boolean} useHTML Use HTML to render the text
+	 */
+	text: function (str, x, y, useHTML) {
+
+		// declare variables
+		var renderer = this,
+			defaultChartStyle = defaultOptions.chart.style,
+			fakeSVG = useCanVG || (!hasSVG && renderer.forExport),
+			wrapper;
+
+		if (useHTML && !renderer.forExport) {
+			return renderer.html(str, x, y);
+		}
+
+		x = mathRound(pick(x, 0));
+		y = mathRound(pick(y, 0));
+
+		wrapper = renderer.createElement('text')
+			.attr({
+				x: x,
+				y: y,
+				text: str
+			})
+			.css({
+				fontFamily: defaultChartStyle.fontFamily,
+				fontSize: defaultChartStyle.fontSize
+			});
+
+		// Prevent wrapping from creating false offsetWidths in export in legacy IE (#1079, #1063)
+		if (fakeSVG) {
+			wrapper.css({
+				position: ABSOLUTE
+			});
+		}
+
+		wrapper.x = x;
+		wrapper.y = y;
+		return wrapper;
+	},
+
+
+	/**
+	 * Create HTML text node. This is used by the VML renderer as well as the SVG
+	 * renderer through the useHTML option.
+	 *
+	 * @param {String} str
+	 * @param {Number} x
+	 * @param {Number} y
+	 */
+	html: function (str, x, y) {
+		var defaultChartStyle = defaultOptions.chart.style,
+			wrapper = this.createElement('span'),
+			attrSetters = wrapper.attrSetters,
+			element = wrapper.element,
+			renderer = wrapper.renderer;
+
+		// Text setter
+		attrSetters.text = function (value) {
+			if (value !== element.innerHTML) {
+				delete this.bBox;
+			}
+			element.innerHTML = value;
+			return false;
+		};
+
+		// Various setters which rely on update transform
+		attrSetters.x = attrSetters.y = attrSetters.align = function (value, key) {
+			if (key === 'align') {
+				key = 'textAlign'; // Do not overwrite the SVGElement.align method. Same as VML.
+			}
+			wrapper[key] = value;
+			wrapper.htmlUpdateTransform();
+			return false;
+		};
+
+		// Set the default attributes
+		wrapper.attr({
+				text: str,
+				x: mathRound(x),
+				y: mathRound(y)
+			})
+			.css({
+				position: ABSOLUTE,
+				whiteSpace: 'nowrap',
+				fontFamily: defaultChartStyle.fontFamily,
+				fontSize: defaultChartStyle.fontSize
+			});
+
+		// Use the HTML specific .css method
+		wrapper.css = wrapper.htmlCss;
+
+		// This is specific for HTML within SVG
+		if (renderer.isSVG) {
+			wrapper.add = function (svgGroupWrapper) {
+
+				var htmlGroup,
+					container = renderer.box.parentNode,
+					parentGroup,
+					parents = [];
+
+				// Create a mock group to hold the HTML elements
+				if (svgGroupWrapper) {
+					htmlGroup = svgGroupWrapper.div;
+					if (!htmlGroup) {
+
+						// Read the parent chain into an array and read from top down
+						parentGroup = svgGroupWrapper;
+						while (parentGroup) {
+
+							parents.push(parentGroup);
+
+							// Move up to the next parent group
+							parentGroup = parentGroup.parentGroup;
+						}
+
+						// Ensure dynamically updating position when any parent is translated
+						each(parents.reverse(), function (parentGroup) {
+							var htmlGroupStyle;
+
+							// Create a HTML div and append it to the parent div to emulate
+							// the SVG group structure
+							htmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, {
+								className: attr(parentGroup.element, 'class')
+							}, {
+								position: ABSOLUTE,
+								left: (parentGroup.translateX || 0) + PX,
+								top: (parentGroup.translateY || 0) + PX
+							}, htmlGroup || container); // the top group is appended to container
+
+							// Shortcut
+							htmlGroupStyle = htmlGroup.style;
+
+							// Set listeners to update the HTML div's position whenever the SVG group
+							// position is changed
+							extend(parentGroup.attrSetters, {
+								translateX: function (value) {
+									htmlGroupStyle.left = value + PX;
+								},
+								translateY: function (value) {
+									htmlGroupStyle.top = value + PX;
+								},
+								visibility: function (value, key) {
+									htmlGroupStyle[key] = value;
+								}
+							});
+						});
+
+					}
+				} else {
+					htmlGroup = container;
+				}
+
+				htmlGroup.appendChild(element);
+
+				// Shared with VML:
+				wrapper.added = true;
+				if (wrapper.alignOnAdd) {
+					wrapper.htmlUpdateTransform();
+				}
+
+				return wrapper;
+			};
+		}
+		return wrapper;
+	},
+
+	/**
+	 * Utility to return the baseline offset and total line height from the font size
+	 */
+	fontMetrics: function (fontSize) {
+		fontSize = pInt(fontSize || 11);
+
+		// Empirical values found by comparing font size and bounding box height.
+		// Applies to the default font family. http://jsfiddle.net/highcharts/7xvn7/
+		var lineHeight = fontSize < 24 ? fontSize + 4 : mathRound(fontSize * 1.2),
+			baseline = mathRound(lineHeight * 0.8);
+
+		return {
+			h: lineHeight,
+			b: baseline
+		};
+	},
+
+	/**
+	 * Add a label, a text item that can hold a colored or gradient background
+	 * as well as a border and shadow.
+	 * @param {string} str
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {String} shape
+	 * @param {Number} anchorX In case the shape has a pointer, like a flag, this is the
+	 *    coordinates it should be pinned to
+	 * @param {Number} anchorY
+	 * @param {Boolean} baseline Whether to position the label relative to the text baseline,
+	 *    like renderer.text, or to the upper border of the rectangle.
+	 * @param {String} className Class name for the group
+	 */
+	label: function (str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {
+
+		var renderer = this,
+			wrapper = renderer.g(className),
+			text = renderer.text('', 0, 0, useHTML)
+				.attr({
+					zIndex: 1
+				}),
+				//.add(wrapper),
+			box,
+			bBox,
+			alignFactor = 0,
+			padding = 3,
+			paddingLeft = 0,
+			width,
+			height,
+			wrapperX,
+			wrapperY,
+			crispAdjust = 0,
+			deferredAttr = {},
+			baselineOffset,
+			attrSetters = wrapper.attrSetters,
+			needsBox;
+
+		/**
+		 * This function runs after the label is added to the DOM (when the bounding box is
+		 * available), and after the text of the label is updated to detect the new bounding
+		 * box and reflect it in the border box.
+		 */
+		function updateBoxSize() {
+			var boxX,
+				boxY,
+				style = text.element.style;
+
+			bBox = (width === undefined || height === undefined || wrapper.styles.textAlign) &&
+				text.getBBox();
+			wrapper.width = (width || bBox.width || 0) + 2 * padding + paddingLeft;
+			wrapper.height = (height || bBox.height || 0) + 2 * padding;
+
+			// update the label-scoped y offset
+			baselineOffset = padding + renderer.fontMetrics(style && style.fontSize).b;
+
+			if (needsBox) {
+
+				// create the border box if it is not already present
+				if (!box) {
+					boxX = mathRound(-alignFactor * padding);
+					boxY = baseline ? -baselineOffset : 0;
+
+					wrapper.box = box = shape ?
+						renderer.symbol(shape, boxX, boxY, wrapper.width, wrapper.height) :
+						renderer.rect(boxX, boxY, wrapper.width, wrapper.height, 0, deferredAttr[STROKE_WIDTH]);
+					box.add(wrapper);
+				}
+
+				// apply the box attributes
+				if (!box.isImg) { // #1630
+					box.attr(merge({
+						width: wrapper.width,
+						height: wrapper.height
+					}, deferredAttr));
+				}
+				deferredAttr = null;
+			}
+		}
+
+		/**
+		 * This function runs after setting text or padding, but only if padding is changed
+		 */
+		function updateTextPadding() {
+			var styles = wrapper.styles,
+				textAlign = styles && styles.textAlign,
+				x = paddingLeft + padding * (1 - alignFactor),
+				y;
+
+			// determin y based on the baseline
+			y = baseline ? 0 : baselineOffset;
+
+			// compensate for alignment
+			if (defined(width) && (textAlign === 'center' || textAlign === 'right')) {
+				x += { center: 0.5, right: 1 }[textAlign] * (width - bBox.width);
+			}
+
+			// update if anything changed
+			if (x !== text.x || y !== text.y) {
+				text.attr({
+					x: x,
+					y: y
+				});
+			}
+
+			// record current values
+			text.x = x;
+			text.y = y;
+		}
+
+		/**
+		 * Set a box attribute, or defer it if the box is not yet created
+		 * @param {Object} key
+		 * @param {Object} value
+		 */
+		function boxAttr(key, value) {
+			if (box) {
+				box.attr(key, value);
+			} else {
+				deferredAttr[key] = value;
+			}
+		}
+
+		function getSizeAfterAdd() {
+			text.add(wrapper);
+			wrapper.attr({
+				text: str, // alignment is available now
+				x: x,
+				y: y
+			});
+
+			if (box && defined(anchorX)) {
+				wrapper.attr({
+					anchorX: anchorX,
+					anchorY: anchorY
+				});
+			}
+		}
+
+		/**
+		 * After the text element is added, get the desired size of the border box
+		 * and add it before the text in the DOM.
+		 */
+		addEvent(wrapper, 'add', getSizeAfterAdd);
+
+		/*
+		 * Add specific attribute setters.
+		 */
+
+		// only change local variables
+		attrSetters.width = function (value) {
+			width = value;
+			return false;
+		};
+		attrSetters.height = function (value) {
+			height = value;
+			return false;
+		};
+		attrSetters.padding =  function (value) {
+			if (defined(value) && value !== padding) {
+				padding = value;
+				updateTextPadding();
+			}
+			return false;
+		};
+		attrSetters.paddingLeft =  function (value) {
+			if (defined(value) && value !== paddingLeft) {
+				paddingLeft = value;
+				updateTextPadding();
+			}
+			return false;
+		};
+
+
+		// change local variable and set attribue as well
+		attrSetters.align = function (value) {
+			alignFactor = { left: 0, center: 0.5, right: 1 }[value];
+			return false; // prevent setting text-anchor on the group
+		};
+
+		// apply these to the box and the text alike
+		attrSetters.text = function (value, key) {
+			text.attr(key, value);
+			updateBoxSize();
+			updateTextPadding();
+			return false;
+		};
+
+		// apply these to the box but not to the text
+		attrSetters[STROKE_WIDTH] = function (value, key) {
+			needsBox = true;
+			crispAdjust = value % 2 / 2;
+			boxAttr(key, value);
+			return false;
+		};
+		attrSetters.stroke = attrSetters.fill = attrSetters.r = function (value, key) {
+			if (key === 'fill') {
+				needsBox = true;
+			}
+			boxAttr(key, value);
+			return false;
+		};
+		attrSetters.anchorX = function (value, key) {
+			anchorX = value;
+			boxAttr(key, value + crispAdjust - wrapperX);
+			return false;
+		};
+		attrSetters.anchorY = function (value, key) {
+			anchorY = value;
+			boxAttr(key, value - wrapperY);
+			return false;
+		};
+
+		// rename attributes
+		attrSetters.x = function (value) {
+			wrapper.x = value; // for animation getter
+			value -= alignFactor * ((width || bBox.width) + padding);
+			wrapperX = mathRound(value);
+
+			wrapper.attr('translateX', wrapperX);
+			return false;
+		};
+		attrSetters.y = function (value) {
+			wrapperY = wrapper.y = mathRound(value);
+			wrapper.attr('translateY', wrapperY);
+			return false;
+		};
+
+		// Redirect certain methods to either the box or the text
+		var baseCss = wrapper.css;
+		return extend(wrapper, {
+			/**
+			 * Pick up some properties and apply them to the text instead of the wrapper
+			 */
+			css: function (styles) {
+				if (styles) {
+					var textStyles = {};
+					styles = merge(styles); // create a copy to avoid altering the original object (#537)
+					each(['fontSize', 'fontWeight', 'fontFamily', 'color', 'lineHeight', 'width', 'textDecoration', 'textShadow'], function (prop) {
+						if (styles[prop] !== UNDEFINED) {
+							textStyles[prop] = styles[prop];
+							delete styles[prop];
+						}
+					});
+					text.css(textStyles);
+				}
+				return baseCss.call(wrapper, styles);
+			},
+			/**
+			 * Return the bounding box of the box, not the group
+			 */
+			getBBox: function () {
+				return {
+					width: bBox.width + 2 * padding,
+					height: bBox.height + 2 * padding,
+					x: bBox.x - padding,
+					y: bBox.y - padding
+				};
+			},
+			/**
+			 * Apply the shadow to the box
+			 */
+			shadow: function (b) {
+				if (box) {
+					box.shadow(b);
+				}
+				return wrapper;
+			},
+			/**
+			 * Destroy and release memory.
+			 */
+			destroy: function () {
+				removeEvent(wrapper, 'add', getSizeAfterAdd);
+
+				// Added by button implementation
+				removeEvent(wrapper.element, 'mouseenter');
+				removeEvent(wrapper.element, 'mouseleave');
+
+				if (text) {
+					text = text.destroy();
+				}
+				if (box) {
+					box = box.destroy();
+				}
+				// Call base implementation to destroy the rest
+				SVGElement.prototype.destroy.call(wrapper);
+
+				// Release local pointers (#1298)
+				wrapper = renderer = updateBoxSize = updateTextPadding = boxAttr = getSizeAfterAdd = null;
+			}
+		});
+	}
+}; // end SVGRenderer
+
+
+// general renderer
+Renderer = SVGRenderer;
+
+
+/* ****************************************************************************
+ *                                                                            *
+ * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE                              *
+ *                                                                            *
+ * For applications and websites that don't need IE support, like platform    *
+ * targeted mobile apps and web apps, this code can be removed.               *
+ *                                                                            *
+ *****************************************************************************/
+
+/**
+ * @constructor
+ */
+var VMLRenderer, VMLElement;
+if (!hasSVG && !useCanVG) {
+
+/**
+ * The VML element wrapper.
+ */
+Highcharts.VMLElement = VMLElement = {
+
+	/**
+	 * Initialize a new VML element wrapper. It builds the markup as a string
+	 * to minimize DOM traffic.
+	 * @param {Object} renderer
+	 * @param {Object} nodeName
+	 */
+	init: function (renderer, nodeName) {
+		var wrapper = this,
+			markup =  ['<', nodeName, ' filled="f" stroked="f"'],
+			style = ['position: ', ABSOLUTE, ';'],
+			isDiv = nodeName === DIV;
+
+		// divs and shapes need size
+		if (nodeName === 'shape' || isDiv) {
+			style.push('left:0;top:0;width:1px;height:1px;');
+		}
+		style.push('visibility: ', isDiv ? HIDDEN : VISIBLE);
+
+		markup.push(' style="', style.join(''), '"/>');
+
+		// create element with default attributes and style
+		if (nodeName) {
+			markup = isDiv || nodeName === 'span' || nodeName === 'img' ?
+				markup.join('')
+				: renderer.prepVML(markup);
+			wrapper.element = createElement(markup);
+		}
+
+		wrapper.renderer = renderer;
+		wrapper.attrSetters = {};
+	},
+
+	/**
+	 * Add the node to the given parent
+	 * @param {Object} parent
+	 */
+	add: function (parent) {
+		var wrapper = this,
+			renderer = wrapper.renderer,
+			element = wrapper.element,
+			box = renderer.box,
+			inverted = parent && parent.inverted,
+
+			// get the parent node
+			parentNode = parent ?
+				parent.element || parent :
+				box;
+
+
+		// if the parent group is inverted, apply inversion on all children
+		if (inverted) { // only on groups
+			renderer.invertChild(element, parentNode);
+		}
+
+		// append it
+		parentNode.appendChild(element);
+
+		// align text after adding to be able to read offset
+		wrapper.added = true;
+		if (wrapper.alignOnAdd && !wrapper.deferUpdateTransform) {
+			wrapper.updateTransform();
+		}
+
+		// fire an event for internal hooks
+		fireEvent(wrapper, 'add');
+
+		return wrapper;
+	},
+
+	/**
+	 * VML always uses htmlUpdateTransform
+	 */
+	updateTransform: SVGElement.prototype.htmlUpdateTransform,
+
+	/**
+	 * Set the rotation of a span with oldIE's filter
+	 */
+	setSpanRotation: function (rotation, sintheta, costheta) {
+		// Adjust for alignment and rotation. Rotation of useHTML content is not yet implemented
+		// but it can probably be implemented for Firefox 3.5+ on user request. FF3.5+
+		// has support for CSS3 transform. The getBBox method also needs to be updated
+		// to compensate for the rotation, like it currently does for SVG.
+		// Test case: http://highcharts.com/tests/?file=text-rotation
+		css(this.element, {
+			filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta,
+				', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta,
+				', sizingMethod=\'auto expand\')'].join('') : NONE
+		});
+	},
+
+	/**
+	 * Converts a subset of an SVG path definition to its VML counterpart. Takes an array
+	 * as the parameter and returns a string.
+	 */
+	pathToVML: function (value) {
+		// convert paths
+		var i = value.length,
+			path = [],
+			clockwise;
+
+		while (i--) {
+
+			// Multiply by 10 to allow subpixel precision.
+			// Substracting half a pixel seems to make the coordinates
+			// align with SVG, but this hasn't been tested thoroughly
+			if (isNumber(value[i])) {
+				path[i] = mathRound(value[i] * 10) - 5;
+			} else if (value[i] === 'Z') { // close the path
+				path[i] = 'x';
+			} else {
+				path[i] = value[i];
+
+				// When the start X and end X coordinates of an arc are too close,
+				// they are rounded to the same value above. In this case, substract 1 from the end X
+				// position. #760, #1371.
+				if (value.isArc && (value[i] === 'wa' || value[i] === 'at')) {
+					clockwise = value[i] === 'wa' ? 1 : -1; // #1642
+					if (path[i + 5] === path[i + 7]) {
+						path[i + 7] -= clockwise;
+					}
+					// Start and end Y (#1410)
+					if (path[i + 6] === path[i + 8]) {
+						path[i + 8] -= clockwise;
+					}
+				}
+			}
+		}
+		// Loop up again to handle path shortcuts (#2132)
+		/*while (i++ < path.length) {
+			if (path[i] === 'H') { // horizontal line to
+				path[i] = 'L';
+				path.splice(i + 2, 0, path[i - 1]);
+			} else if (path[i] === 'V') { // vertical line to
+				path[i] = 'L';
+				path.splice(i + 1, 0, path[i - 2]);
+			}
+		}*/
+		return path.join(' ') || 'x';
+	},
+
+	/**
+	 * Get or set attributes
+	 */
+	attr: function (hash, val) {
+		var wrapper = this,
+			key,
+			value,
+			i,
+			result,
+			element = wrapper.element || {},
+			elemStyle = element.style,
+			nodeName = element.nodeName,
+			renderer = wrapper.renderer,
+			symbolName = wrapper.symbolName,
+			hasSetSymbolSize,
+			shadows = wrapper.shadows,
+			skipAttr,
+			attrSetters = wrapper.attrSetters,
+			ret = wrapper;
+
+		// single key-value pair
+		if (isString(hash) && defined(val)) {
+			key = hash;
+			hash = {};
+			hash[key] = val;
+		}
+
+		// used as a getter, val is undefined
+		if (isString(hash)) {
+			key = hash;
+			if (key === 'strokeWidth' || key === 'stroke-width') {
+				ret = wrapper.strokeweight;
+			} else {
+				ret = wrapper[key];
+			}
+
+		// setter
+		} else {
+			for (key in hash) {
+				value = hash[key];
+				skipAttr = false;
+
+				// check for a specific attribute setter
+				result = attrSetters[key] && attrSetters[key].call(wrapper, value, key);
+
+				if (result !== false && value !== null) { // #620
+
+					if (result !== UNDEFINED) {
+						value = result; // the attribute setter has returned a new value to set
+					}
+
+
+					// prepare paths
+					// symbols
+					if (symbolName && /^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(key)) {
+						// if one of the symbol size affecting parameters are changed,
+						// check all the others only once for each call to an element's
+						// .attr() method
+						if (!hasSetSymbolSize) {
+							wrapper.symbolAttr(hash);
+
+							hasSetSymbolSize = true;
+						}
+						skipAttr = true;
+
+					} else if (key === 'd') {
+						value = value || [];
+						wrapper.d = value.join(' '); // used in getter for animation
+
+						element.path = value = wrapper.pathToVML(value);
+
+						// update shadows
+						if (shadows) {
+							i = shadows.length;
+							while (i--) {
+								shadows[i].path = shadows[i].cutOff ? this.cutOffPath(value, shadows[i].cutOff) : value;
+							}
+						}
+						skipAttr = true;
+
+					// handle visibility
+					} else if (key === 'visibility') {
+
+						// let the shadow follow the main element
+						if (shadows) {
+							i = shadows.length;
+							while (i--) {
+								shadows[i].style[key] = value;
+							}
+						}
+
+						// Instead of toggling the visibility CSS property, move the div out of the viewport.
+						// This works around #61 and #586
+						if (nodeName === 'DIV') {
+							value = value === HIDDEN ? '-999em' : 0;
+
+							// In order to redraw, IE7 needs the div to be visible when tucked away
+							// outside the viewport. So the visibility is actually opposite of
+							// the expected value. This applies to the tooltip only.
+							if (!docMode8) {
+								elemStyle[key] = value ? VISIBLE : HIDDEN;
+							}
+							key = 'top';
+						}
+						elemStyle[key] = value;
+						skipAttr = true;
+
+					// directly mapped to css
+					} else if (key === 'zIndex') {
+
+						if (value) {
+							elemStyle[key] = value;
+						}
+						skipAttr = true;
+
+					// x, y, width, height
+					} else if (inArray(key, ['x', 'y', 'width', 'height']) !== -1) {
+
+						wrapper[key] = value; // used in getter
+
+						if (key === 'x' || key === 'y') {
+							key = { x: 'left', y: 'top' }[key];
+						} else {
+							value = mathMax(0, value); // don't set width or height below zero (#311)
+						}
+
+						// clipping rectangle special
+						if (wrapper.updateClipping) {
+							wrapper[key] = value; // the key is now 'left' or 'top' for 'x' and 'y'
+							wrapper.updateClipping();
+						} else {
+							// normal
+							elemStyle[key] = value;
+						}
+
+						skipAttr = true;
+
+					// class name
+					} else if (key === 'class' && nodeName === 'DIV') {
+						// IE8 Standards mode has problems retrieving the className
+						element.className = value;
+
+					// stroke
+					} else if (key === 'stroke') {
+
+						value = renderer.color(value, element, key);
+
+						key = 'strokecolor';
+
+					// stroke width
+					} else if (key === 'stroke-width' || key === 'strokeWidth') {
+						element.stroked = value ? true : false;
+						key = 'strokeweight';
+						wrapper[key] = value; // used in getter, issue #113
+						if (isNumber(value)) {
+							value += PX;
+						}
+
+					// dashStyle
+					} else if (key === 'dashstyle') {
+						var strokeElem = element.getElementsByTagName('stroke')[0] ||
+							createElement(renderer.prepVML(['<stroke/>']), null, null, element);
+						strokeElem[key] = value || 'solid';
+						wrapper.dashstyle = value; /* because changing stroke-width will change the dash length
+							and cause an epileptic effect */
+						skipAttr = true;
+
+					// fill
+					} else if (key === 'fill') {
+
+						if (nodeName === 'SPAN') { // text color
+							elemStyle.color = value;
+						} else if (nodeName !== 'IMG') { // #1336
+							element.filled = value !== NONE ? true : false;
+
+							value = renderer.color(value, element, key, wrapper);
+
+							key = 'fillcolor';
+						}
+
+					// opacity: don't bother - animation is too slow and filters introduce artifacts
+					} else if (key === 'opacity') {
+						/*css(element, {
+							opacity: value
+						});*/
+						skipAttr = true;
+
+					// rotation on VML elements
+					} else if (nodeName === 'shape' && key === 'rotation') {
+
+						wrapper[key] = element.style[key] = value; // style is for #1873
+
+						// Correction for the 1x1 size of the shape container. Used in gauge needles.
+						element.style.left = -mathRound(mathSin(value * deg2rad) + 1) + PX;
+						element.style.top = mathRound(mathCos(value * deg2rad)) + PX;
+
+					// translation for animation
+					} else if (key === 'translateX' || key === 'translateY' || key === 'rotation') {
+						wrapper[key] = value;
+						wrapper.updateTransform();
+
+						skipAttr = true;
+
+					// text for rotated and non-rotated elements
+					} else if (key === 'text') {
+						this.bBox = null;
+						element.innerHTML = value;
+						skipAttr = true;
+					}
+
+
+					if (!skipAttr) {
+						if (docMode8) { // IE8 setAttribute bug
+							element[key] = value;
+						} else {
+							attr(element, key, value);
+						}
+					}
+
+				}
+			}
+		}
+		return ret;
+	},
+
+	/**
+	 * Set the element's clipping to a predefined rectangle
+	 *
+	 * @param {String} id The id of the clip rectangle
+	 */
+	clip: function (clipRect) {
+		var wrapper = this,
+			clipMembers,
+			cssRet;
+
+		if (clipRect) {
+			clipMembers = clipRect.members;
+			erase(clipMembers, wrapper); // Ensure unique list of elements (#1258)
+			clipMembers.push(wrapper);
+			wrapper.destroyClip = function () {
+				erase(clipMembers, wrapper);
+			};
+			cssRet = clipRect.getCSS(wrapper);
+
+		} else {
+			if (wrapper.destroyClip) {
+				wrapper.destroyClip();
+			}
+			cssRet = { clip: docMode8 ? 'inherit' : 'rect(auto)' }; // #1214
+		}
+
+		return wrapper.css(cssRet);
+
+	},
+
+	/**
+	 * Set styles for the element
+	 * @param {Object} styles
+	 */
+	css: SVGElement.prototype.htmlCss,
+
+	/**
+	 * Removes a child either by removeChild or move to garbageBin.
+	 * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.
+	 */
+	safeRemoveChild: function (element) {
+		// discardElement will detach the node from its parent before attaching it
+		// to the garbage bin. Therefore it is important that the node is attached and have parent.
+		if (element.parentNode) {
+			discardElement(element);
+		}
+	},
+
+	/**
+	 * Extend element.destroy by removing it from the clip members array
+	 */
+	destroy: function () {
+		if (this.destroyClip) {
+			this.destroyClip();
+		}
+
+		return SVGElement.prototype.destroy.apply(this);
+	},
+
+	/**
+	 * Add an event listener. VML override for normalizing event parameters.
+	 * @param {String} eventType
+	 * @param {Function} handler
+	 */
+	on: function (eventType, handler) {
+		// simplest possible event model for internal use
+		this.element['on' + eventType] = function () {
+			var evt = win.event;
+			evt.target = evt.srcElement;
+			handler(evt);
+		};
+		return this;
+	},
+
+	/**
+	 * In stacked columns, cut off the shadows so that they don't overlap
+	 */
+	cutOffPath: function (path, length) {
+
+		var len;
+
+		path = path.split(/[ ,]/);
+		len = path.length;
+
+		if (len === 9 || len === 11) {
+			path[len - 4] = path[len - 2] = pInt(path[len - 2]) - 10 * length;
+		}
+		return path.join(' ');
+	},
+
+	/**
+	 * Apply a drop shadow by copying elements and giving them different strokes
+	 * @param {Boolean|Object} shadowOptions
+	 */
+	shadow: function (shadowOptions, group, cutOff) {
+		var shadows = [],
+			i,
+			element = this.element,
+			renderer = this.renderer,
+			shadow,
+			elemStyle = element.style,
+			markup,
+			path = element.path,
+			strokeWidth,
+			modifiedPath,
+			shadowWidth,
+			shadowElementOpacity;
+
+		// some times empty paths are not strings
+		if (path && typeof path.value !== 'string') {
+			path = 'x';
+		}
+		modifiedPath = path;
+
+		if (shadowOptions) {
+			shadowWidth = pick(shadowOptions.width, 3);
+			shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;
+			for (i = 1; i <= 3; i++) {
+
+				strokeWidth = (shadowWidth * 2) + 1 - (2 * i);
+
+				// Cut off shadows for stacked column items
+				if (cutOff) {
+					modifiedPath = this.cutOffPath(path.value, strokeWidth + 0.5);
+				}
+
+				markup = ['<shape isShadow="true" strokeweight="', strokeWidth,
+					'" filled="false" path="', modifiedPath,
+					'" coordsize="10 10" style="', element.style.cssText, '" />'];
+
+				shadow = createElement(renderer.prepVML(markup),
+					null, {
+						left: pInt(elemStyle.left) + pick(shadowOptions.offsetX, 1),
+						top: pInt(elemStyle.top) + pick(shadowOptions.offsetY, 1)
+					}
+				);
+				if (cutOff) {
+					shadow.cutOff = strokeWidth + 1;
+				}
+
+				// apply the opacity
+				markup = ['<stroke color="', shadowOptions.color || 'black', '" opacity="', shadowElementOpacity * i, '"/>'];
+				createElement(renderer.prepVML(markup), null, null, shadow);
+
+
+				// insert it
+				if (group) {
+					group.element.appendChild(shadow);
+				} else {
+					element.parentNode.insertBefore(shadow, element);
+				}
+
+				// record it
+				shadows.push(shadow);
+
+			}
+
+			this.shadows = shadows;
+		}
+		return this;
+
+	}
+};
+VMLElement = extendClass(SVGElement, VMLElement);
+
+/**
+ * The VML renderer
+ */
+var VMLRendererExtension = { // inherit SVGRenderer
+
+	Element: VMLElement,
+	isIE8: userAgent.indexOf('MSIE 8.0') > -1,
+
+
+	/**
+	 * Initialize the VMLRenderer
+	 * @param {Object} container
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	init: function (container, width, height) {
+		var renderer = this,
+			boxWrapper,
+			box;
+
+		renderer.alignedObjects = [];
+
+		boxWrapper = renderer.createElement(DIV);
+		box = boxWrapper.element;
+		box.style.position = RELATIVE; // for freeform drawing using renderer directly
+		container.appendChild(boxWrapper.element);
+
+
+		// generate the containing box
+		renderer.isVML = true;
+		renderer.box = box;
+		renderer.boxWrapper = boxWrapper;
+
+
+		renderer.setSize(width, height, false);
+
+		// The only way to make IE6 and IE7 print is to use a global namespace. However,
+		// with IE8 the only way to make the dynamic shapes visible in screen and print mode
+		// seems to be to add the xmlns attribute and the behaviour style inline.
+		if (!doc.namespaces.hcv) {
+
+			doc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml');
+
+			// Setup default CSS (#2153)
+			(doc.styleSheets.length ? doc.styleSheets[0] : doc.createStyleSheet()).cssText +=
+				'hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke' +
+				'{ behavior:url(#default#VML); display: inline-block; } ';
+
+		}
+	},
+
+
+	/**
+	 * Detect whether the renderer is hidden. This happens when one of the parent elements
+	 * has display: none
+	 */
+	isHidden: function () {
+		return !this.box.offsetWidth;
+	},
+
+	/**
+	 * Define a clipping rectangle. In VML it is accomplished by storing the values
+	 * for setting the CSS style to all associated members.
+	 *
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	clipRect: function (x, y, width, height) {
+
+		// create a dummy element
+		var clipRect = this.createElement(),
+			isObj = isObject(x);
+
+		// mimic a rectangle with its style object for automatic updating in attr
+		return extend(clipRect, {
+			members: [],
+			left: (isObj ? x.x : x) + 1,
+			top: (isObj ? x.y : y) + 1,
+			width: (isObj ? x.width : width) - 1,
+			height: (isObj ? x.height : height) - 1,
+			getCSS: function (wrapper) {
+				var element = wrapper.element,
+					nodeName = element.nodeName,
+					isShape = nodeName === 'shape',
+					inverted = wrapper.inverted,
+					rect = this,
+					top = rect.top - (isShape ? element.offsetTop : 0),
+					left = rect.left,
+					right = left + rect.width,
+					bottom = top + rect.height,
+					ret = {
+						clip: 'rect(' +
+							mathRound(inverted ? left : top) + 'px,' +
+							mathRound(inverted ? bottom : right) + 'px,' +
+							mathRound(inverted ? right : bottom) + 'px,' +
+							mathRound(inverted ? top : left) + 'px)'
+					};
+
+				// issue 74 workaround
+				if (!inverted && docMode8 && nodeName === 'DIV') {
+					extend(ret, {
+						width: right + PX,
+						height: bottom + PX
+					});
+				}
+				return ret;
+			},
+
+			// used in attr and animation to update the clipping of all members
+			updateClipping: function () {
+				each(clipRect.members, function (member) {
+					member.css(clipRect.getCSS(member));
+				});
+			}
+		});
+
+	},
+
+
+	/**
+	 * Take a color and return it if it's a string, make it a gradient if it's a
+	 * gradient configuration object, and apply opacity.
+	 *
+	 * @param {Object} color The color or config object
+	 */
+	color: function (color, elem, prop, wrapper) {
+		var renderer = this,
+			colorObject,
+			regexRgba = /^rgba/,
+			markup,
+			fillType,
+			ret = NONE;
+
+		// Check for linear or radial gradient
+		if (color && color.linearGradient) {
+			fillType = 'gradient';
+		} else if (color && color.radialGradient) {
+			fillType = 'pattern';
+		}
+
+
+		if (fillType) {
+
+			var stopColor,
+				stopOpacity,
+				gradient = color.linearGradient || color.radialGradient,
+				x1,
+				y1,
+				x2,
+				y2,
+				opacity1,
+				opacity2,
+				color1,
+				color2,
+				fillAttr = '',
+				stops = color.stops,
+				firstStop,
+				lastStop,
+				colors = [],
+				addFillNode = function () {
+					// Add the fill subnode. When colors attribute is used, the meanings of opacity and o:opacity2
+					// are reversed.
+					markup = ['<fill colors="' + colors.join(',') + '" opacity="', opacity2, '" o:opacity2="', opacity1,
+						'" type="', fillType, '" ', fillAttr, 'focus="100%" method="any" />'];
+					createElement(renderer.prepVML(markup), null, null, elem);
+				};
+
+			// Extend from 0 to 1
+			firstStop = stops[0];
+			lastStop = stops[stops.length - 1];
+			if (firstStop[0] > 0) {
+				stops.unshift([
+					0,
+					firstStop[1]
+				]);
+			}
+			if (lastStop[0] < 1) {
+				stops.push([
+					1,
+					lastStop[1]
+				]);
+			}
+
+			// Compute the stops
+			each(stops, function (stop, i) {
+				if (regexRgba.test(stop[1])) {
+					colorObject = Color(stop[1]);
+					stopColor = colorObject.get('rgb');
+					stopOpacity = colorObject.get('a');
+				} else {
+					stopColor = stop[1];
+					stopOpacity = 1;
+				}
+
+				// Build the color attribute
+				colors.push((stop[0] * 100) + '% ' + stopColor);
+
+				// Only start and end opacities are allowed, so we use the first and the last
+				if (!i) {
+					opacity1 = stopOpacity;
+					color2 = stopColor;
+				} else {
+					opacity2 = stopOpacity;
+					color1 = stopColor;
+				}
+			});
+
+			// Apply the gradient to fills only.
+			if (prop === 'fill') {
+
+				// Handle linear gradient angle
+				if (fillType === 'gradient') {
+					x1 = gradient.x1 || gradient[0] || 0;
+					y1 = gradient.y1 || gradient[1] || 0;
+					x2 = gradient.x2 || gradient[2] || 0;
+					y2 = gradient.y2 || gradient[3] || 0;
+					fillAttr = 'angle="' + (90  - math.atan(
+						(y2 - y1) / // y vector
+						(x2 - x1) // x vector
+						) * 180 / mathPI) + '"';
+
+					addFillNode();
+
+				// Radial (circular) gradient
+				} else {
+
+					var r = gradient.r,
+						sizex = r * 2,
+						sizey = r * 2,
+						cx = gradient.cx,
+						cy = gradient.cy,
+						radialReference = elem.radialReference,
+						bBox,
+						applyRadialGradient = function () {
+							if (radialReference) {
+								bBox = wrapper.getBBox();
+								cx += (radialReference[0] - bBox.x) / bBox.width - 0.5;
+								cy += (radialReference[1] - bBox.y) / bBox.height - 0.5;
+								sizex *= radialReference[2] / bBox.width;
+								sizey *= radialReference[2] / bBox.height;
+							}
+							fillAttr = 'src="' + defaultOptions.global.VMLRadialGradientURL + '" ' +
+								'size="' + sizex + ',' + sizey + '" ' +
+								'origin="0.5,0.5" ' +
+								'position="' + cx + ',' + cy + '" ' +
+								'color2="' + color2 + '" ';
+
+							addFillNode();
+						};
+
+					// Apply radial gradient
+					if (wrapper.added) {
+						applyRadialGradient();
+					} else {
+						// We need to know the bounding box to get the size and position right
+						addEvent(wrapper, 'add', applyRadialGradient);
+					}
+
+					// The fill element's color attribute is broken in IE8 standards mode, so we
+					// need to set the parent shape's fillcolor attribute instead.
+					ret = color1;
+				}
+
+			// Gradients are not supported for VML stroke, return the first color. #722.
+			} else {
+				ret = stopColor;
+			}
+
+		// if the color is an rgba color, split it and add a fill node
+		// to hold the opacity component
+		} else if (regexRgba.test(color) && elem.tagName !== 'IMG') {
+
+			colorObject = Color(color);
+
+			markup = ['<', prop, ' opacity="', colorObject.get('a'), '"/>'];
+			createElement(this.prepVML(markup), null, null, elem);
+
+			ret = colorObject.get('rgb');
+
+
+		} else {
+			var propNodes = elem.getElementsByTagName(prop); // 'stroke' or 'fill' node
+			if (propNodes.length) {
+				propNodes[0].opacity = 1;
+				propNodes[0].type = 'solid';
+			}
+			ret = color;
+		}
+
+		return ret;
+	},
+
+	/**
+	 * Take a VML string and prepare it for either IE8 or IE6/IE7.
+	 * @param {Array} markup A string array of the VML markup to prepare
+	 */
+	prepVML: function (markup) {
+		var vmlStyle = 'display:inline-block;behavior:url(#default#VML);',
+			isIE8 = this.isIE8;
+
+		markup = markup.join('');
+
+		if (isIE8) { // add xmlns and style inline
+			markup = markup.replace('/>', ' xmlns="urn:schemas-microsoft-com:vml" />');
+			if (markup.indexOf('style="') === -1) {
+				markup = markup.replace('/>', ' style="' + vmlStyle + '" />');
+			} else {
+				markup = markup.replace('style="', 'style="' + vmlStyle);
+			}
+
+		} else { // add namespace
+			markup = markup.replace('<', '<hcv:');
+		}
+
+		return markup;
+	},
+
+	/**
+	 * Create rotated and aligned text
+	 * @param {String} str
+	 * @param {Number} x
+	 * @param {Number} y
+	 */
+	text: SVGRenderer.prototype.html,
+
+	/**
+	 * Create and return a path element
+	 * @param {Array} path
+	 */
+	path: function (path) {
+		var attr = {
+			// subpixel precision down to 0.1 (width and height = 1px)
+			coordsize: '10 10'
+		};
+		if (isArray(path)) {
+			attr.d = path;
+		} else if (isObject(path)) { // attributes
+			extend(attr, path);
+		}
+		// create the shape
+		return this.createElement('shape').attr(attr);
+	},
+
+	/**
+	 * Create and return a circle element. In VML circles are implemented as
+	 * shapes, which is faster than v:oval
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} r
+	 */
+	circle: function (x, y, r) {
+		var circle = this.symbol('circle');
+		if (isObject(x)) {
+			r = x.r;
+			y = x.y;
+			x = x.x;
+		}
+		circle.isCircle = true; // Causes x and y to mean center (#1682)
+		circle.r = r;
+		return circle.attr({ x: x, y: y });
+	},
+
+	/**
+	 * Create a group using an outer div and an inner v:group to allow rotating
+	 * and flipping. A simple v:group would have problems with positioning
+	 * child HTML elements and CSS clip.
+	 *
+	 * @param {String} name The name of the group
+	 */
+	g: function (name) {
+		var wrapper,
+			attribs;
+
+		// set the class name
+		if (name) {
+			attribs = { 'className': PREFIX + name, 'class': PREFIX + name };
+		}
+
+		// the div to hold HTML and clipping
+		wrapper = this.createElement(DIV).attr(attribs);
+
+		return wrapper;
+	},
+
+	/**
+	 * VML override to create a regular HTML image
+	 * @param {String} src
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	image: function (src, x, y, width, height) {
+		var obj = this.createElement('img')
+			.attr({ src: src });
+
+		if (arguments.length > 1) {
+			obj.attr({
+				x: x,
+				y: y,
+				width: width,
+				height: height
+			});
+		}
+		return obj;
+	},
+
+	/**
+	 * VML uses a shape for rect to overcome bugs and rotation problems
+	 */
+	rect: function (x, y, width, height, r, strokeWidth) {
+
+		var wrapper = this.symbol('rect');
+		wrapper.r = isObject(x) ? x.r : r;
+
+		//return wrapper.attr(wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0)));
+		return wrapper.attr(
+				isObject(x) ?
+					x :
+					// do not crispify when an object is passed in (as in column charts)
+					wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))
+			);
+	},
+
+	/**
+	 * In the VML renderer, each child of an inverted div (group) is inverted
+	 * @param {Object} element
+	 * @param {Object} parentNode
+	 */
+	invertChild: function (element, parentNode) {
+		var parentStyle = parentNode.style;
+		css(element, {
+			flip: 'x',
+			left: pInt(parentStyle.width) - 1,
+			top: pInt(parentStyle.height) - 1,
+			rotation: -90
+		});
+	},
+
+	/**
+	 * Symbol definitions that override the parent SVG renderer's symbols
+	 *
+	 */
+	symbols: {
+		// VML specific arc function
+		arc: function (x, y, w, h, options) {
+			var start = options.start,
+				end = options.end,
+				radius = options.r || w || h,
+				innerRadius = options.innerR,
+				cosStart = mathCos(start),
+				sinStart = mathSin(start),
+				cosEnd = mathCos(end),
+				sinEnd = mathSin(end),
+				ret;
+
+			if (end - start === 0) { // no angle, don't show it.
+				return ['x'];
+			}
+
+			ret = [
+				'wa', // clockwise arc to
+				x - radius, // left
+				y - radius, // top
+				x + radius, // right
+				y + radius, // bottom
+				x + radius * cosStart, // start x
+				y + radius * sinStart, // start y
+				x + radius * cosEnd, // end x
+				y + radius * sinEnd  // end y
+			];
+
+			if (options.open && !innerRadius) {
+				ret.push(
+					'e',
+					M,
+					x,// - innerRadius,
+					y// - innerRadius
+				);
+			}
+
+			ret.push(
+				'at', // anti clockwise arc to
+				x - innerRadius, // left
+				y - innerRadius, // top
+				x + innerRadius, // right
+				y + innerRadius, // bottom
+				x + innerRadius * cosEnd, // start x
+				y + innerRadius * sinEnd, // start y
+				x + innerRadius * cosStart, // end x
+				y + innerRadius * sinStart, // end y
+				'x', // finish path
+				'e' // close
+			);
+
+			ret.isArc = true;
+			return ret;
+
+		},
+		// Add circle symbol path. This performs significantly faster than v:oval.
+		circle: function (x, y, w, h, wrapper) {
+
+			if (wrapper) {
+				w = h = 2 * wrapper.r;
+			}
+
+			// Center correction, #1682
+			if (wrapper && wrapper.isCircle) {
+				x -= w / 2;
+				y -= h / 2;
+			}
+
+			// Return the path
+			return [
+				'wa', // clockwisearcto
+				x, // left
+				y, // top
+				x + w, // right
+				y + h, // bottom
+				x + w, // start x
+				y + h / 2,     // start y
+				x + w, // end x
+				y + h / 2,     // end y
+				//'x', // finish path
+				'e' // close
+			];
+		},
+		/**
+		 * Add rectangle symbol path which eases rotation and omits arcsize problems
+		 * compared to the built-in VML roundrect shape
+		 *
+		 * @param {Number} left Left position
+		 * @param {Number} top Top position
+		 * @param {Number} r Border radius
+		 * @param {Object} options Width and height
+		 */
+
+		rect: function (left, top, width, height, options) {
+
+			var right = left + width,
+				bottom = top + height,
+				ret,
+				r;
+
+			// No radius, return the more lightweight square
+			if (!defined(options) || !options.r) {
+				ret = SVGRenderer.prototype.symbols.square.apply(0, arguments);
+
+			// Has radius add arcs for the corners
+			} else {
+
+				r = mathMin(options.r, width, height);
+				ret = [
+					M,
+					left + r, top,
+
+					L,
+					right - r, top,
+					'wa',
+					right - 2 * r, top,
+					right, top + 2 * r,
+					right - r, top,
+					right, top + r,
+
+					L,
+					right, bottom - r,
+					'wa',
+					right - 2 * r, bottom - 2 * r,
+					right, bottom,
+					right, bottom - r,
+					right - r, bottom,
+
+					L,
+					left + r, bottom,
+					'wa',
+					left, bottom - 2 * r,
+					left + 2 * r, bottom,
+					left + r, bottom,
+					left, bottom - r,
+
+					L,
+					left, top + r,
+					'wa',
+					left, top,
+					left + 2 * r, top + 2 * r,
+					left, top + r,
+					left + r, top,
+
+
+					'x',
+					'e'
+				];
+			}
+			return ret;
+		}
+	}
+};
+Highcharts.VMLRenderer = VMLRenderer = function () {
+	this.init.apply(this, arguments);
+};
+VMLRenderer.prototype = merge(SVGRenderer.prototype, VMLRendererExtension);
+
+	// general renderer
+	Renderer = VMLRenderer;
+}
+
+/* ****************************************************************************
+ *                                                                            *
+ * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE                                *
+ *                                                                            *
+ *****************************************************************************/
+/* ****************************************************************************
+ *                                                                            *
+ * START OF ANDROID < 3 SPECIFIC CODE. THIS CAN BE REMOVED IF YOU'RE NOT      *
+ * TARGETING THAT SYSTEM.                                                     *
+ *                                                                            *
+ *****************************************************************************/
+var CanVGRenderer,
+	CanVGController;
+
+if (useCanVG) {
+	/**
+	 * The CanVGRenderer is empty from start to keep the source footprint small.
+	 * When requested, the CanVGController downloads the rest of the source packaged
+	 * together with the canvg library.
+	 */
+	Highcharts.CanVGRenderer = CanVGRenderer = function () {
+		// Override the global SVG namespace to fake SVG/HTML that accepts CSS
+		SVG_NS = 'http://www.w3.org/1999/xhtml';
+	};
+
+	/**
+	 * Start with an empty symbols object. This is needed when exporting is used (exporting.src.js will add a few symbols), but 
+	 * the implementation from SvgRenderer will not be merged in until first render.
+	 */
+	CanVGRenderer.prototype.symbols = {};
+
+	/**
+	 * Handles on demand download of canvg rendering support.
+	 */
+	CanVGController = (function () {
+		// List of renderering calls
+		var deferredRenderCalls = [];
+
+		/**
+		 * When downloaded, we are ready to draw deferred charts.
+		 */
+		function drawDeferred() {
+			var callLength = deferredRenderCalls.length,
+				callIndex;
+
+			// Draw all pending render calls
+			for (callIndex = 0; callIndex < callLength; callIndex++) {
+				deferredRenderCalls[callIndex]();
+			}
+			// Clear the list
+			deferredRenderCalls = [];
+		}
+
+		return {
+			push: function (func, scriptLocation) {
+				// Only get the script once
+				if (deferredRenderCalls.length === 0) {
+					getScript(scriptLocation, drawDeferred);
+				}
+				// Register render call
+				deferredRenderCalls.push(func);
+			}
+		};
+	}());
+
+	Renderer = CanVGRenderer;
+} // end CanVGRenderer
+
+/* ****************************************************************************
+ *                                                                            *
+ * END OF ANDROID < 3 SPECIFIC CODE                                           *
+ *                                                                            *
+ *****************************************************************************/
+
+/**
+ * The Tick class
+ */
+function Tick(axis, pos, type, noLabel) {
+	this.axis = axis;
+	this.pos = pos;
+	this.type = type || '';
+	this.isNew = true;
+
+	if (!type && !noLabel) {
+		this.addLabel();
+	}
+}
+
+Tick.prototype = {
+	/**
+	 * Write the tick label
+	 */
+	addLabel: function () {
+		var tick = this,
+			axis = tick.axis,
+			options = axis.options,
+			chart = axis.chart,
+			horiz = axis.horiz,
+			categories = axis.categories,
+			names = axis.series[0] && axis.series[0].names,
+			pos = tick.pos,
+			labelOptions = options.labels,
+			str,
+			tickPositions = axis.tickPositions,
+			width = (horiz && categories &&
+				!labelOptions.step && !labelOptions.staggerLines &&
+				!labelOptions.rotation &&
+				chart.plotWidth / tickPositions.length) ||
+				(!horiz && (chart.margin[3] || chart.chartWidth * 0.33)), // #1580, #1931
+			isFirst = pos === tickPositions[0],
+			isLast = pos === tickPositions[tickPositions.length - 1],
+			css,
+			attr,
+			value = categories ?
+				pick(categories[pos], names && names[pos], pos) : 
+				pos,
+			label = tick.label,
+			tickPositionInfo = tickPositions.info,
+			dateTimeLabelFormat;
+
+		// Set the datetime label format. If a higher rank is set for this position, use that. If not,
+		// use the general format.
+		if (axis.isDatetimeAxis && tickPositionInfo) {
+			dateTimeLabelFormat = options.dateTimeLabelFormats[tickPositionInfo.higherRanks[pos] || tickPositionInfo.unitName];
+		}
+
+		// set properties for access in render method
+		tick.isFirst = isFirst;
+		tick.isLast = isLast;
+
+		// get the string
+		str = axis.labelFormatter.call({
+			axis: axis,
+			chart: chart,
+			isFirst: isFirst,
+			isLast: isLast,
+			dateTimeLabelFormat: dateTimeLabelFormat,
+			value: axis.isLog ? correctFloat(lin2log(value)) : value
+		});
+
+		// prepare CSS
+		css = width && { width: mathMax(1, mathRound(width - 2 * (labelOptions.padding || 10))) + PX };
+		css = extend(css, labelOptions.style);
+
+		// first call
+		if (!defined(label)) {
+			attr = {
+				align: axis.labelAlign
+			};
+			if (isNumber(labelOptions.rotation)) {
+				attr.rotation = labelOptions.rotation;
+			}
+			if (width && labelOptions.ellipsis) {
+				attr._clipHeight = axis.len / tickPositions.length;
+			}
+
+			tick.label =
+				defined(str) && labelOptions.enabled ?
+					chart.renderer.text(
+							str,
+							0,
+							0,
+							labelOptions.useHTML
+						)
+						.attr(attr)
+						// without position absolute, IE export sometimes is wrong
+						.css(css)
+						.add(axis.labelGroup) :
+					null;
+
+		// update
+		} else if (label) {
+			label.attr({
+					text: str
+				})
+				.css(css);
+		}
+	},
+
+	/**
+	 * Get the offset height or width of the label
+	 */
+	getLabelSize: function () {
+		var label = this.label,
+			axis = this.axis;
+		return label ?
+			((this.labelBBox = label.getBBox()))[axis.horiz ? 'height' : 'width'] :
+			0;
+	},
+
+	/**
+	 * Find how far the labels extend to the right and left of the tick's x position. Used for anti-collision
+	 * detection with overflow logic.
+	 */
+	getLabelSides: function () {
+		var bBox = this.labelBBox, // assume getLabelSize has run at this point
+			axis = this.axis,
+			options = axis.options,
+			labelOptions = options.labels,
+			width = bBox.width,
+			leftSide = width * { left: 0, center: 0.5, right: 1 }[axis.labelAlign] - labelOptions.x;
+
+		return [-leftSide, width - leftSide];
+	},
+
+	/**
+	 * Handle the label overflow by adjusting the labels to the left and right edge, or
+	 * hide them if they collide into the neighbour label.
+	 */
+	handleOverflow: function (index, xy) {
+		var show = true,
+			axis = this.axis,
+			chart = axis.chart,
+			isFirst = this.isFirst,
+			isLast = this.isLast,
+			x = xy.x,
+			reversed = axis.reversed,
+			tickPositions = axis.tickPositions;
+
+		if (isFirst || isLast) {
+
+			var sides = this.getLabelSides(),
+				leftSide = sides[0],
+				rightSide = sides[1],
+				plotLeft = chart.plotLeft,
+				plotRight = plotLeft + axis.len,
+				neighbour = axis.ticks[tickPositions[index + (isFirst ? 1 : -1)]],
+				neighbourEdge = neighbour && neighbour.label.xy && neighbour.label.xy.x + neighbour.getLabelSides()[isFirst ? 0 : 1];
+
+			if ((isFirst && !reversed) || (isLast && reversed)) {
+				// Is the label spilling out to the left of the plot area?
+				if (x + leftSide < plotLeft) {
+
+					// Align it to plot left
+					x = plotLeft - leftSide;
+
+					// Hide it if it now overlaps the neighbour label
+					if (neighbour && x + rightSide > neighbourEdge) {
+						show = false;
+					}
+				}
+
+			} else {
+				// Is the label spilling out to the right of the plot area?
+				if (x + rightSide > plotRight) {
+
+					// Align it to plot right
+					x = plotRight - rightSide;
+
+					// Hide it if it now overlaps the neighbour label
+					if (neighbour && x + leftSide < neighbourEdge) {
+						show = false;
+					}
+
+				}
+			}
+
+			// Set the modified x position of the label
+			xy.x = x;
+		}
+		return show;
+	},
+
+	/**
+	 * Get the x and y position for ticks and labels
+	 */
+	getPosition: function (horiz, pos, tickmarkOffset, old) {
+		var axis = this.axis,
+			chart = axis.chart,
+			cHeight = (old && chart.oldChartHeight) || chart.chartHeight;
+		
+		return {
+			x: horiz ?
+				axis.translate(pos + tickmarkOffset, null, null, old) + axis.transB :
+				axis.left + axis.offset + (axis.opposite ? ((old && chart.oldChartWidth) || chart.chartWidth) - axis.right - axis.left : 0),
+
+			y: horiz ?
+				cHeight - axis.bottom + axis.offset - (axis.opposite ? axis.height : 0) :
+				cHeight - axis.translate(pos + tickmarkOffset, null, null, old) - axis.transB
+		};
+		
+	},
+	
+	/**
+	 * Get the x, y position of the tick label
+	 */
+	getLabelPosition: function (x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {
+		var axis = this.axis,
+			transA = axis.transA,
+			reversed = axis.reversed,
+			staggerLines = axis.staggerLines,
+			baseline = axis.chart.renderer.fontMetrics(labelOptions.style.fontSize).b,
+			rotation = labelOptions.rotation;
+			
+		x = x + labelOptions.x - (tickmarkOffset && horiz ?
+			tickmarkOffset * transA * (reversed ? -1 : 1) : 0);
+		y = y + labelOptions.y - (tickmarkOffset && !horiz ?
+			tickmarkOffset * transA * (reversed ? 1 : -1) : 0);
+
+		// Correct for rotation (#1764)
+		if (rotation && axis.side === 2) {
+			y -= baseline - baseline * mathCos(rotation * deg2rad);
+		}
+		
+		// Vertically centered
+		if (!defined(labelOptions.y) && !rotation) { // #1951
+			y += baseline - label.getBBox().height / 2;
+		}
+		
+		// Correct for staggered labels
+		if (staggerLines) {
+			y += (index / (step || 1) % staggerLines) * (axis.labelOffset / staggerLines);
+		}
+		
+		return {
+			x: x,
+			y: y
+		};
+	},
+	
+	/**
+	 * Extendible method to return the path of the marker
+	 */
+	getMarkPath: function (x, y, tickLength, tickWidth, horiz, renderer) {
+		return renderer.crispLine([
+				M,
+				x,
+				y,
+				L,
+				x + (horiz ? 0 : -tickLength),
+				y + (horiz ? tickLength : 0)
+			], tickWidth);
+	},
+
+	/**
+	 * Put everything in place
+	 *
+	 * @param index {Number}
+	 * @param old {Boolean} Use old coordinates to prepare an animation into new position
+	 */
+	render: function (index, old, opacity) {
+		var tick = this,
+			axis = tick.axis,
+			options = axis.options,
+			chart = axis.chart,
+			renderer = chart.renderer,
+			horiz = axis.horiz,
+			type = tick.type,
+			label = tick.label,
+			pos = tick.pos,
+			labelOptions = options.labels,
+			gridLine = tick.gridLine,
+			gridPrefix = type ? type + 'Grid' : 'grid',
+			tickPrefix = type ? type + 'Tick' : 'tick',
+			gridLineWidth = options[gridPrefix + 'LineWidth'],
+			gridLineColor = options[gridPrefix + 'LineColor'],
+			dashStyle = options[gridPrefix + 'LineDashStyle'],
+			tickLength = options[tickPrefix + 'Length'],
+			tickWidth = options[tickPrefix + 'Width'] || 0,
+			tickColor = options[tickPrefix + 'Color'],
+			tickPosition = options[tickPrefix + 'Position'],
+			gridLinePath,
+			mark = tick.mark,
+			markPath,
+			step = labelOptions.step,
+			attribs,
+			show = true,
+			tickmarkOffset = axis.tickmarkOffset,
+			xy = tick.getPosition(horiz, pos, tickmarkOffset, old),
+			x = xy.x,
+			y = xy.y,
+			reverseCrisp = ((horiz && x === axis.pos + axis.len) || (!horiz && y === axis.pos)) ? -1 : 1, // #1480, #1687
+			staggerLines = axis.staggerLines;
+
+		this.isActive = true;
+		
+		// create the grid line
+		if (gridLineWidth) {
+			gridLinePath = axis.getPlotLinePath(pos + tickmarkOffset, gridLineWidth * reverseCrisp, old, true);
+
+			if (gridLine === UNDEFINED) {
+				attribs = {
+					stroke: gridLineColor,
+					'stroke-width': gridLineWidth
+				};
+				if (dashStyle) {
+					attribs.dashstyle = dashStyle;
+				}
+				if (!type) {
+					attribs.zIndex = 1;
+				}
+				if (old) {
+					attribs.opacity = 0;
+				}
+				tick.gridLine = gridLine =
+					gridLineWidth ?
+						renderer.path(gridLinePath)
+							.attr(attribs).add(axis.gridGroup) :
+						null;
+			}
+
+			// If the parameter 'old' is set, the current call will be followed
+			// by another call, therefore do not do any animations this time
+			if (!old && gridLine && gridLinePath) {
+				gridLine[tick.isNew ? 'attr' : 'animate']({
+					d: gridLinePath,
+					opacity: opacity
+				});
+			}
+		}
+
+		// create the tick mark
+		if (tickWidth && tickLength) {
+
+			// negate the length
+			if (tickPosition === 'inside') {
+				tickLength = -tickLength;
+			}
+			if (axis.opposite) {
+				tickLength = -tickLength;
+			}
+
+			markPath = tick.getMarkPath(x, y, tickLength, tickWidth * reverseCrisp, horiz, renderer);
+
+			if (mark) { // updating
+				mark.animate({
+					d: markPath,
+					opacity: opacity
+				});
+			} else { // first time
+				tick.mark = renderer.path(
+					markPath
+				).attr({
+					stroke: tickColor,
+					'stroke-width': tickWidth,
+					opacity: opacity
+				}).add(axis.axisGroup);
+			}
+		}
+
+		// the label is created on init - now move it into place
+		if (label && !isNaN(x)) {
+			label.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);
+
+			// Apply show first and show last. If the tick is both first and last, it is 
+			// a single centered tick, in which case we show the label anyway (#2100).
+			if ((tick.isFirst && !tick.isLast && !pick(options.showFirstLabel, 1)) ||
+					(tick.isLast && !tick.isFirst && !pick(options.showLastLabel, 1))) {
+				show = false;
+
+			// Handle label overflow and show or hide accordingly
+			} else if (!staggerLines && horiz && labelOptions.overflow === 'justify' && !tick.handleOverflow(index, xy)) {
+				show = false;
+			}
+
+			// apply step
+			if (step && index % step) {
+				// show those indices dividable by step
+				show = false;
+			}
+
+			// Set the new position, and show or hide
+			if (show && !isNaN(xy.y)) {
+				xy.opacity = opacity;
+				label[tick.isNew ? 'attr' : 'animate'](xy);
+				tick.isNew = false;
+			} else {
+				label.attr('y', -9999); // #1338
+			}
+		}
+	},
+
+	/**
+	 * Destructor for the tick prototype
+	 */
+	destroy: function () {
+		destroyObjectProperties(this, this.axis);
+	}
+};
+
+/**
+ * The object wrapper for plot lines and plot bands
+ * @param {Object} options
+ */
+function PlotLineOrBand(axis, options) {
+	this.axis = axis;
+
+	if (options) {
+		this.options = options;
+		this.id = options.id;
+	}
+}
+
+PlotLineOrBand.prototype = {
+	
+	/**
+	 * Render the plot line or plot band. If it is already existing,
+	 * move it.
+	 */
+	render: function () {
+		var plotLine = this,
+			axis = plotLine.axis,
+			horiz = axis.horiz,
+			halfPointRange = (axis.pointRange || 0) / 2,
+			options = plotLine.options,
+			optionsLabel = options.label,
+			label = plotLine.label,
+			width = options.width,
+			to = options.to,
+			from = options.from,
+			isBand = defined(from) && defined(to),
+			value = options.value,
+			dashStyle = options.dashStyle,
+			svgElem = plotLine.svgElem,
+			path = [],
+			addEvent,
+			eventType,
+			xs,
+			ys,
+			x,
+			y,
+			color = options.color,
+			zIndex = options.zIndex,
+			events = options.events,
+			attribs,
+			renderer = axis.chart.renderer;
+
+		// logarithmic conversion
+		if (axis.isLog) {
+			from = log2lin(from);
+			to = log2lin(to);
+			value = log2lin(value);
+		}
+
+		// plot line
+		if (width) {
+			path = axis.getPlotLinePath(value, width);
+			attribs = {
+				stroke: color,
+				'stroke-width': width
+			};
+			if (dashStyle) {
+				attribs.dashstyle = dashStyle;
+			}
+		} else if (isBand) { // plot band
+			
+			// keep within plot area
+			from = mathMax(from, axis.min - halfPointRange);
+			to = mathMin(to, axis.max + halfPointRange);
+			
+			path = axis.getPlotBandPath(from, to, options);
+			attribs = {
+				fill: color
+			};
+			if (options.borderWidth) {
+				attribs.stroke = options.borderColor;
+				attribs['stroke-width'] = options.borderWidth;
+			}
+		} else {
+			return;
+		}
+		// zIndex
+		if (defined(zIndex)) {
+			attribs.zIndex = zIndex;
+		}
+
+		// common for lines and bands
+		if (svgElem) {
+			if (path) {
+				svgElem.animate({
+					d: path
+				}, null, svgElem.onGetPath);
+			} else {
+				svgElem.hide();
+				svgElem.onGetPath = function () {
+					svgElem.show();
+				};
+			}
+		} else if (path && path.length) {
+			plotLine.svgElem = svgElem = renderer.path(path)
+				.attr(attribs).add();
+
+			// events
+			if (events) {
+				addEvent = function (eventType) {
+					svgElem.on(eventType, function (e) {
+						events[eventType].apply(plotLine, [e]);
+					});
+				};
+				for (eventType in events) {
+					addEvent(eventType);
+				}
+			}
+		}
+
+		// the plot band/line label
+		if (optionsLabel && defined(optionsLabel.text) && path && path.length && axis.width > 0 && axis.height > 0) {
+			// apply defaults
+			optionsLabel = merge({
+				align: horiz && isBand && 'center',
+				x: horiz ? !isBand && 4 : 10,
+				verticalAlign : !horiz && isBand && 'middle',
+				y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,
+				rotation: horiz && !isBand && 90
+			}, optionsLabel);
+
+			// add the SVG element
+			if (!label) {
+				plotLine.label = label = renderer.text(
+						optionsLabel.text,
+						0,
+						0,
+						optionsLabel.useHTML
+					)
+					.attr({
+						align: optionsLabel.textAlign || optionsLabel.align,
+						rotation: optionsLabel.rotation,
+						zIndex: zIndex
+					})
+					.css(optionsLabel.style)
+					.add();
+			}
+
+			// get the bounding box and align the label
+			xs = [path[1], path[4], pick(path[6], path[1])];
+			ys = [path[2], path[5], pick(path[7], path[2])];
+			x = arrayMin(xs);
+			y = arrayMin(ys);
+
+			label.align(optionsLabel, false, {
+				x: x,
+				y: y,
+				width: arrayMax(xs) - x,
+				height: arrayMax(ys) - y
+			});
+			label.show();
+
+		} else if (label) { // move out of sight
+			label.hide();
+		}
+
+		// chainable
+		return plotLine;
+	},
+
+	/**
+	 * Remove the plot line or band
+	 */
+	destroy: function () {
+		// remove it from the lookup
+		erase(this.axis.plotLinesAndBands, this);
+		
+		delete this.axis;
+		destroyObjectProperties(this);
+	}
+};
+/**
+ * The class for stack items
+ */
+function StackItem(axis, options, isNegative, x, stackOption, stacking) {
+	
+	var inverted = axis.chart.inverted;
+
+	this.axis = axis;
+
+	// Tells if the stack is negative
+	this.isNegative = isNegative;
+
+	// Save the options to be able to style the label
+	this.options = options;
+
+	// Save the x value to be able to position the label later
+	this.x = x;
+
+	// Initialize total value
+	this.total = null;
+
+	// This will keep each points' extremes stored by series.index
+	this.points = {};
+
+	// Save the stack option on the series configuration object, and whether to treat it as percent
+	this.stack = stackOption;
+	this.percent = stacking === 'percent';
+
+	// The align options and text align varies on whether the stack is negative and
+	// if the chart is inverted or not.
+	// First test the user supplied value, then use the dynamic.
+	this.alignOptions = {
+		align: options.align || (inverted ? (isNegative ? 'left' : 'right') : 'center'),
+		verticalAlign: options.verticalAlign || (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),
+		y: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)),
+		x: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0)
+	};
+
+	this.textAlign = options.textAlign || (inverted ? (isNegative ? 'right' : 'left') : 'center');
+}
+
+StackItem.prototype = {
+	destroy: function () {
+		destroyObjectProperties(this, this.axis);
+	},
+
+	/**
+	 * Renders the stack total label and adds it to the stack label group.
+	 */
+	render: function (group) {
+		var options = this.options,
+			formatOption = options.format,
+			str = formatOption ?
+				format(formatOption, this) : 
+				options.formatter.call(this);  // format the text in the label
+
+		// Change the text to reflect the new total and set visibility to hidden in case the serie is hidden
+		if (this.label) {
+			this.label.attr({text: str, visibility: HIDDEN});
+		// Create new label
+		} else {
+			this.label =
+				this.axis.chart.renderer.text(str, 0, 0, options.useHTML)		// dummy positions, actual position updated with setOffset method in columnseries
+					.css(options.style)				// apply style
+					.attr({
+						align: this.textAlign,				// fix the text-anchor
+						rotation: options.rotation,	// rotation
+						visibility: HIDDEN					// hidden until setOffset is called
+					})				
+					.add(group);							// add to the labels-group
+		}
+	},
+
+	/**
+	 * Sets the offset that the stack has from the x value and repositions the label.
+	 */
+	setOffset: function (xOffset, xWidth) {
+		var stackItem = this,
+			axis = stackItem.axis,
+			chart = axis.chart,
+			inverted = chart.inverted,
+			neg = this.isNegative,							// special treatment is needed for negative stacks
+			y = axis.translate(this.percent ? 100 : this.total, 0, 0, 0, 1), // stack value translated mapped to chart coordinates
+			yZero = axis.translate(0),						// stack origin
+			h = mathAbs(y - yZero),							// stack height
+			x = chart.xAxis[0].translate(this.x) + xOffset,	// stack x position
+			plotHeight = chart.plotHeight,
+			stackBox = {	// this is the box for the complete stack
+				x: inverted ? (neg ? y : y - h) : x,
+				y: inverted ? plotHeight - x - xWidth : (neg ? (plotHeight - y - h) : plotHeight - y),
+				width: inverted ? h : xWidth,
+				height: inverted ? xWidth : h
+			},
+			label = this.label,
+			alignAttr;
+		
+		if (label) {
+			label.align(this.alignOptions, null, stackBox);	// align the label to the box
+				
+			// Set visibility (#678)
+			alignAttr = label.alignAttr;
+			label.attr({ 
+				visibility: this.options.crop === false || chart.isInsidePlot(alignAttr.x, alignAttr.y) ? 
+					(hasSVG ? 'inherit' : VISIBLE) : 
+					HIDDEN
+			});
+		}
+	}
+};
+/**
+ * Create a new axis object
+ * @param {Object} chart
+ * @param {Object} options
+ */
+function Axis() {
+	this.init.apply(this, arguments);
+}
+
+Axis.prototype = {
+	
+	/**
+	 * Default options for the X axis - the Y axis has extended defaults 
+	 */
+	defaultOptions: {
+		// allowDecimals: null,
+		// alternateGridColor: null,
+		// categories: [],
+		dateTimeLabelFormats: {
+			millisecond: '%H:%M:%S.%L',
+			second: '%H:%M:%S',
+			minute: '%H:%M',
+			hour: '%H:%M',
+			day: '%e. %b',
+			week: '%e. %b',
+			month: '%b \'%y',
+			year: '%Y'
+		},
+		endOnTick: false,
+		gridLineColor: '#C0C0C0',
+		// gridLineDashStyle: 'solid',
+		// gridLineWidth: 0,
+		// reversed: false,
+	
+		labels: defaultLabelOptions,
+			// { step: null },
+		lineColor: '#C0D0E0',
+		lineWidth: 1,
+		//linkedTo: null,
+		//max: undefined,
+		//min: undefined,
+		minPadding: 0.01,
+		maxPadding: 0.01,
+		//minRange: null,
+		minorGridLineColor: '#E0E0E0',
+		// minorGridLineDashStyle: null,
+		minorGridLineWidth: 1,
+		minorTickColor: '#A0A0A0',
+		//minorTickInterval: null,
+		minorTickLength: 2,
+		minorTickPosition: 'outside', // inside or outside
+		//minorTickWidth: 0,
+		//opposite: false,
+		//offset: 0,
+		//plotBands: [{
+		//	events: {},
+		//	zIndex: 1,
+		//	labels: { align, x, verticalAlign, y, style, rotation, textAlign }
+		//}],
+		//plotLines: [{
+		//	events: {}
+		//  dashStyle: {}
+		//	zIndex:
+		//	labels: { align, x, verticalAlign, y, style, rotation, textAlign }
+		//}],
+		//reversed: false,
+		// showFirstLabel: true,
+		// showLastLabel: true,
+		startOfWeek: 1,
+		startOnTick: false,
+		tickColor: '#C0D0E0',
+		//tickInterval: null,
+		tickLength: 5,
+		tickmarkPlacement: 'between', // on or between
+		tickPixelInterval: 100,
+		tickPosition: 'outside',
+		tickWidth: 1,
+		title: {
+			//text: null,
+			align: 'middle', // low, middle or high
+			//margin: 0 for horizontal, 10 for vertical axes,
+			//rotation: 0,
+			//side: 'outside',
+			style: {
+				color: '#4d759e',
+				//font: defaultFont.replace('normal', 'bold')
+				fontWeight: 'bold'
+			}
+			//x: 0,
+			//y: 0
+		},
+		type: 'linear' // linear, logarithmic or datetime
+	},
+	
+	/**
+	 * This options set extends the defaultOptions for Y axes
+	 */
+	defaultYAxisOptions: {
+		endOnTick: true,
+		gridLineWidth: 1,
+		tickPixelInterval: 72,
+		showLastLabel: true,
+		labels: {
+			x: -8,
+			y: 3
+		},
+		lineWidth: 0,
+		maxPadding: 0.05,
+		minPadding: 0.05,
+		startOnTick: true,
+		tickWidth: 0,
+		title: {
+			rotation: 270,
+			text: 'Values'
+		},
+		stackLabels: {
+			enabled: false,
+			//align: dynamic,
+			//y: dynamic,
+			//x: dynamic,
+			//verticalAlign: dynamic,
+			//textAlign: dynamic,
+			//rotation: 0,
+			formatter: function () {
+				return numberFormat(this.total, -1);
+			},
+			style: defaultLabelOptions.style
+		}
+	},
+	
+	/**
+	 * These options extend the defaultOptions for left axes
+	 */
+	defaultLeftAxisOptions: {
+		labels: {
+			x: -8,
+			y: null
+		},
+		title: {
+			rotation: 270
+		}
+	},
+	
+	/**
+	 * These options extend the defaultOptions for right axes
+	 */
+	defaultRightAxisOptions: {
+		labels: {
+			x: 8,
+			y: null
+		},
+		title: {
+			rotation: 90
+		}
+	},
+	
+	/**
+	 * These options extend the defaultOptions for bottom axes
+	 */
+	defaultBottomAxisOptions: {
+		labels: {
+			x: 0,
+			y: 14
+			// overflow: undefined,
+			// staggerLines: null
+		},
+		title: {
+			rotation: 0
+		}
+	},
+	/**
+	 * These options extend the defaultOptions for left axes
+	 */
+	defaultTopAxisOptions: {
+		labels: {
+			x: 0,
+			y: -5
+			// overflow: undefined
+			// staggerLines: null
+		},
+		title: {
+			rotation: 0
+		}
+	},
+	
+	/**
+	 * Initialize the axis
+	 */
+	init: function (chart, userOptions) {
+			
+		
+		var isXAxis = userOptions.isX,
+			axis = this;
+	
+		// Flag, is the axis horizontal
+		axis.horiz = chart.inverted ? !isXAxis : isXAxis;
+		
+		// Flag, isXAxis
+		axis.isXAxis = isXAxis;
+		axis.xOrY = isXAxis ? 'x' : 'y';
+	
+	
+		axis.opposite = userOptions.opposite; // needed in setOptions
+		axis.side = axis.horiz ?
+				(axis.opposite ? 0 : 2) : // top : bottom
+				(axis.opposite ? 1 : 3);  // right : left
+	
+		axis.setOptions(userOptions);
+		
+	
+		var options = this.options,
+			type = options.type,
+			isDatetimeAxis = type === 'datetime';
+	
+		axis.labelFormatter = options.labels.formatter || axis.defaultLabelFormatter; // can be overwritten by dynamic format
+	
+	
+		// Flag, stagger lines or not
+		axis.userOptions = userOptions;
+	
+		//axis.axisTitleMargin = UNDEFINED,// = options.title.margin,
+		axis.minPixelPadding = 0;
+		//axis.ignoreMinPadding = UNDEFINED; // can be set to true by a column or bar series
+		//axis.ignoreMaxPadding = UNDEFINED;
+	
+		axis.chart = chart;
+		axis.reversed = options.reversed;
+		axis.zoomEnabled = options.zoomEnabled !== false;
+	
+		// Initial categories
+		axis.categories = options.categories || type === 'category';
+	
+		// Elements
+		//axis.axisGroup = UNDEFINED;
+		//axis.gridGroup = UNDEFINED;
+		//axis.axisTitle = UNDEFINED;
+		//axis.axisLine = UNDEFINED;
+	
+		// Shorthand types
+		axis.isLog = type === 'logarithmic';
+		axis.isDatetimeAxis = isDatetimeAxis;
+	
+		// Flag, if axis is linked to another axis
+		axis.isLinked = defined(options.linkedTo);
+		// Linked axis.
+		//axis.linkedParent = UNDEFINED;	
+		
+		// Tick positions
+		//axis.tickPositions = UNDEFINED; // array containing predefined positions
+		// Tick intervals
+		//axis.tickInterval = UNDEFINED;
+		//axis.minorTickInterval = UNDEFINED;
+		
+		axis.tickmarkOffset = (axis.categories && options.tickmarkPlacement === 'between') ? 0.5 : 0;
+	
+		// Major ticks
+		axis.ticks = {};
+		// Minor ticks
+		axis.minorTicks = {};
+		//axis.tickAmount = UNDEFINED;
+	
+		// List of plotLines/Bands
+		axis.plotLinesAndBands = [];
+	
+		// Alternate bands
+		axis.alternateBands = {};
+	
+		// Axis metrics
+		//axis.left = UNDEFINED;
+		//axis.top = UNDEFINED;
+		//axis.width = UNDEFINED;
+		//axis.height = UNDEFINED;
+		//axis.bottom = UNDEFINED;
+		//axis.right = UNDEFINED;
+		//axis.transA = UNDEFINED;
+		//axis.transB = UNDEFINED;
+		//axis.oldTransA = UNDEFINED;
+		axis.len = 0;
+		//axis.oldMin = UNDEFINED;
+		//axis.oldMax = UNDEFINED;
+		//axis.oldUserMin = UNDEFINED;
+		//axis.oldUserMax = UNDEFINED;
+		//axis.oldAxisLength = UNDEFINED;
+		axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;
+		axis.range = options.range;
+		axis.offset = options.offset || 0;
+	
+	
+		// Dictionary for stacks
+		axis.stacks = {};
+		axis.oldStacks = {};
+
+		// Dictionary for stacks max values
+		axis.stackExtremes = {};
+
+		// Min and max in the data
+		//axis.dataMin = UNDEFINED,
+		//axis.dataMax = UNDEFINED,
+	
+		// The axis range
+		axis.max = null;
+		axis.min = null;
+	
+		// User set min and max
+		//axis.userMin = UNDEFINED,
+		//axis.userMax = UNDEFINED,
+
+		// Run Axis
+		
+		var eventType,
+			events = axis.options.events;
+
+		// Register
+		if (inArray(axis, chart.axes) === -1) { // don't add it again on Axis.update()
+			chart.axes.push(axis);
+			chart[isXAxis ? 'xAxis' : 'yAxis'].push(axis);
+		}
+
+		axis.series = axis.series || []; // populated by Series
+
+		// inverted charts have reversed xAxes as default
+		if (chart.inverted && isXAxis && axis.reversed === UNDEFINED) {
+			axis.reversed = true;
+		}
+
+		axis.removePlotBand = axis.removePlotBandOrLine;
+		axis.removePlotLine = axis.removePlotBandOrLine;
+
+
+		// register event listeners
+		for (eventType in events) {
+			addEvent(axis, eventType, events[eventType]);
+		}
+
+		// extend logarithmic axis
+		if (axis.isLog) {
+			axis.val2lin = log2lin;
+			axis.lin2val = lin2log;
+		}
+	},
+	
+	/**
+	 * Merge and set options
+	 */
+	setOptions: function (userOptions) {
+		this.options = merge(
+			this.defaultOptions,
+			this.isXAxis ? {} : this.defaultYAxisOptions,
+			[this.defaultTopAxisOptions, this.defaultRightAxisOptions,
+				this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side],
+			merge(
+				defaultOptions[this.isXAxis ? 'xAxis' : 'yAxis'], // if set in setOptions (#1053)
+				userOptions
+			)
+		);
+	},
+
+	/**
+	 * Update the axis with a new options structure
+	 */
+	update: function (newOptions, redraw) {
+		var chart = this.chart;
+
+		newOptions = chart.options[this.xOrY + 'Axis'][this.options.index] = merge(this.userOptions, newOptions);
+
+		this.destroy(true);
+		this._addedPlotLB = this.userMin = this.userMax = UNDEFINED; // #1611, #2306
+
+		this.init(chart, extend(newOptions, { events: UNDEFINED }));
+
+		chart.isDirtyBox = true;
+		if (pick(redraw, true)) {
+			chart.redraw();
+		}
+	},	
+	
+	/**
+     * Remove the axis from the chart
+     */
+	remove: function (redraw) {
+		var chart = this.chart,
+			key = this.xOrY + 'Axis'; // xAxis or yAxis
+
+		// Remove associated series
+		each(this.series, function (series) {
+			series.remove(false);
+		});
+
+		// Remove the axis
+		erase(chart.axes, this);
+		erase(chart[key], this);
+		chart.options[key].splice(this.options.index, 1);
+		each(chart[key], function (axis, i) { // Re-index, #1706
+			axis.options.index = i;
+		});
+		this.destroy();
+		chart.isDirtyBox = true;
+
+		if (pick(redraw, true)) {
+			chart.redraw();
+		}
+	},
+	
+	/** 
+	 * The default label formatter. The context is a special config object for the label.
+	 */
+	defaultLabelFormatter: function () {
+		var axis = this.axis,
+			value = this.value,
+			categories = axis.categories, 
+			dateTimeLabelFormat = this.dateTimeLabelFormat,
+			numericSymbols = defaultOptions.lang.numericSymbols,
+			i = numericSymbols && numericSymbols.length,
+			multi,
+			ret,
+			formatOption = axis.options.labels.format,
+			
+			// make sure the same symbol is added for all labels on a linear axis
+			numericSymbolDetector = axis.isLog ? value : axis.tickInterval;
+
+		if (formatOption) {
+			ret = format(formatOption, this);
+		
+		} else if (categories) {
+			ret = value;
+		
+		} else if (dateTimeLabelFormat) { // datetime axis
+			ret = dateFormat(dateTimeLabelFormat, value);
+		
+		} else if (i && numericSymbolDetector >= 1000) {
+			// Decide whether we should add a numeric symbol like k (thousands) or M (millions).
+			// If we are to enable this in tooltip or other places as well, we can move this
+			// logic to the numberFormatter and enable it by a parameter.
+			while (i-- && ret === UNDEFINED) {
+				multi = Math.pow(1000, i + 1);
+				if (numericSymbolDetector >= multi && numericSymbols[i] !== null) {
+					ret = numberFormat(value / multi, -1) + numericSymbols[i];
+				}
+			}
+		}
+		
+		if (ret === UNDEFINED) {
+			if (value >= 1000) { // add thousands separators
+				ret = numberFormat(value, 0);
+
+			} else { // small numbers
+				ret = numberFormat(value, -1);
+			}
+		}
+		
+		return ret;
+	},
+
+	/**
+	 * Get the minimum and maximum for the series of each axis
+	 */
+	getSeriesExtremes: function () {
+		var axis = this,
+			chart = axis.chart;
+
+		axis.hasVisibleSeries = false;
+
+		// reset dataMin and dataMax in case we're redrawing
+		axis.dataMin = axis.dataMax = null;
+
+		// reset cached stacking extremes
+		axis.stackExtremes = {};
+
+		axis.buildStacks();
+
+		// loop through this axis' series
+		each(axis.series, function (series) {
+
+			if (series.visible || !chart.options.chart.ignoreHiddenSeries) {
+
+				var seriesOptions = series.options,
+					xData,
+					threshold = seriesOptions.threshold,
+					seriesDataMin,
+					seriesDataMax;
+
+				axis.hasVisibleSeries = true;
+
+				// Validate threshold in logarithmic axes
+				if (axis.isLog && threshold <= 0) {
+					threshold = null;
+				}
+
+				// Get dataMin and dataMax for X axes
+				if (axis.isXAxis) {
+					xData = series.xData;
+					if (xData.length) {
+						axis.dataMin = mathMin(pick(axis.dataMin, xData[0]), arrayMin(xData));
+						axis.dataMax = mathMax(pick(axis.dataMax, xData[0]), arrayMax(xData));
+					}
+
+				// Get dataMin and dataMax for Y axes, as well as handle stacking and processed data
+				} else {
+
+					// Get this particular series extremes
+					series.getExtremes();
+					seriesDataMax = series.dataMax;
+					seriesDataMin = series.dataMin;
+
+					// Get the dataMin and dataMax so far. If percentage is used, the min and max are
+					// always 0 and 100. If seriesDataMin and seriesDataMax is null, then series
+					// doesn't have active y data, we continue with nulls
+					if (defined(seriesDataMin) && defined(seriesDataMax)) {
+						axis.dataMin = mathMin(pick(axis.dataMin, seriesDataMin), seriesDataMin);
+						axis.dataMax = mathMax(pick(axis.dataMax, seriesDataMax), seriesDataMax);
+					}
+
+					// Adjust to threshold
+					if (defined(threshold)) {
+						if (axis.dataMin >= threshold) {
+							axis.dataMin = threshold;
+							axis.ignoreMinPadding = true;
+						} else if (axis.dataMax < threshold) {
+							axis.dataMax = threshold;
+							axis.ignoreMaxPadding = true;
+						}
+					}
+				}
+			}
+		});
+	},
+
+	/**
+	 * Translate from axis value to pixel position on the chart, or back
+	 *
+	 */
+	translate: function (val, backwards, cvsCoord, old, handleLog, pointPlacement) {
+		var axis = this,
+			axisLength = axis.len,
+			sign = 1,
+			cvsOffset = 0,
+			localA = old ? axis.oldTransA : axis.transA,
+			localMin = old ? axis.oldMin : axis.min,
+			returnValue,
+			minPixelPadding = axis.minPixelPadding,
+			postTranslate = (axis.options.ordinal || (axis.isLog && handleLog)) && axis.lin2val;
+
+		if (!localA) {
+			localA = axis.transA;
+		}
+
+		// In vertical axes, the canvas coordinates start from 0 at the top like in 
+		// SVG. 
+		if (cvsCoord) {
+			sign *= -1; // canvas coordinates inverts the value
+			cvsOffset = axisLength;
+		}
+
+		// Handle reversed axis
+		if (axis.reversed) { 
+			sign *= -1;
+			cvsOffset -= sign * axisLength;
+		}
+
+		// From pixels to value
+		if (backwards) { // reverse translation
+			
+			val = val * sign + cvsOffset;
+			val -= minPixelPadding;
+			returnValue = val / localA + localMin; // from chart pixel to value
+			if (postTranslate) { // log and ordinal axes
+				returnValue = axis.lin2val(returnValue);
+			}
+
+		// From value to pixels
+		} else {
+			if (postTranslate) { // log and ordinal axes
+				val = axis.val2lin(val);
+			}
+			if (pointPlacement === 'between') {
+				pointPlacement = 0.5;
+			}
+			returnValue = sign * (val - localMin) * localA + cvsOffset + (sign * minPixelPadding) +
+				(isNumber(pointPlacement) ? localA * pointPlacement * axis.pointRange : 0);
+		}
+
+		return returnValue;
+	},
+
+	/**
+	 * Utility method to translate an axis value to pixel position. 
+	 * @param {Number} value A value in terms of axis units
+	 * @param {Boolean} paneCoordinates Whether to return the pixel coordinate relative to the chart
+	 *        or just the axis/pane itself.
+	 */
+	toPixels: function (value, paneCoordinates) {
+		return this.translate(value, false, !this.horiz, null, true) + (paneCoordinates ? 0 : this.pos);
+	},
+
+	/*
+	 * Utility method to translate a pixel position in to an axis value
+	 * @param {Number} pixel The pixel value coordinate
+	 * @param {Boolean} paneCoordiantes Whether the input pixel is relative to the chart or just the
+	 *        axis/pane itself.
+	 */
+	toValue: function (pixel, paneCoordinates) {
+		return this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, null, true);
+	},
+
+	/**
+	 * Create the path for a plot line that goes from the given value on
+	 * this axis, across the plot to the opposite side
+	 * @param {Number} value
+	 * @param {Number} lineWidth Used for calculation crisp line
+	 * @param {Number] old Use old coordinates (for resizing and rescaling)
+	 */
+	getPlotLinePath: function (value, lineWidth, old, force) {
+		var axis = this,
+			chart = axis.chart,
+			axisLeft = axis.left,
+			axisTop = axis.top,
+			x1,
+			y1,
+			x2,
+			y2,
+			translatedValue = axis.translate(value, null, null, old),
+			cHeight = (old && chart.oldChartHeight) || chart.chartHeight,
+			cWidth = (old && chart.oldChartWidth) || chart.chartWidth,
+			skip,
+			transB = axis.transB;
+
+		x1 = x2 = mathRound(translatedValue + transB);
+		y1 = y2 = mathRound(cHeight - translatedValue - transB);
+
+		if (isNaN(translatedValue)) { // no min or max
+			skip = true;
+
+		} else if (axis.horiz) {
+			y1 = axisTop;
+			y2 = cHeight - axis.bottom;
+			if (x1 < axisLeft || x1 > axisLeft + axis.width) {
+				skip = true;
+			}
+		} else {
+			x1 = axisLeft;
+			x2 = cWidth - axis.right;
+
+			if (y1 < axisTop || y1 > axisTop + axis.height) {
+				skip = true;
+			}
+		}
+		return skip && !force ?
+			null :
+			chart.renderer.crispLine([M, x1, y1, L, x2, y2], lineWidth || 0);
+	},
+	
+	/**
+	 * Create the path for a plot band
+	 */
+	getPlotBandPath: function (from, to) {
+
+		var toPath = this.getPlotLinePath(to),
+			path = this.getPlotLinePath(from);
+			
+		if (path && toPath) {
+			path.push(
+				toPath[4],
+				toPath[5],
+				toPath[1],
+				toPath[2]
+			);
+		} else { // outside the axis area
+			path = null;
+		}
+		
+		return path;
+	},
+	
+	/**
+	 * Set the tick positions of a linear axis to round values like whole tens or every five.
+	 */
+	getLinearTickPositions: function (tickInterval, min, max) {
+		var pos,
+			lastPos,
+			roundedMin = correctFloat(mathFloor(min / tickInterval) * tickInterval),
+			roundedMax = correctFloat(mathCeil(max / tickInterval) * tickInterval),
+			tickPositions = [];
+
+		// Populate the intermediate values
+		pos = roundedMin;
+		while (pos <= roundedMax) {
+
+			// Place the tick on the rounded value
+			tickPositions.push(pos);
+
+			// Always add the raw tickInterval, not the corrected one.
+			pos = correctFloat(pos + tickInterval);
+
+			// If the interval is not big enough in the current min - max range to actually increase
+			// the loop variable, we need to break out to prevent endless loop. Issue #619
+			if (pos === lastPos) {
+				break;
+			}
+
+			// Record the last value
+			lastPos = pos;
+		}
+		return tickPositions;
+	},
+	
+	/**
+	 * Set the tick positions of a logarithmic axis
+	 */
+	getLogTickPositions: function (interval, min, max, minor) {
+		var axis = this,
+			options = axis.options,
+			axisLength = axis.len,
+			// Since we use this method for both major and minor ticks,
+			// use a local variable and return the result
+			positions = []; 
+		
+		// Reset
+		if (!minor) {
+			axis._minorAutoInterval = null;
+		}
+		
+		// First case: All ticks fall on whole logarithms: 1, 10, 100 etc.
+		if (interval >= 0.5) {
+			interval = mathRound(interval);
+			positions = axis.getLinearTickPositions(interval, min, max);
+			
+		// Second case: We need intermediary ticks. For example 
+		// 1, 2, 4, 6, 8, 10, 20, 40 etc. 
+		} else if (interval >= 0.08) {
+			var roundedMin = mathFloor(min),
+				intermediate,
+				i,
+				j,
+				len,
+				pos,
+				lastPos,
+				break2;
+				
+			if (interval > 0.3) {
+				intermediate = [1, 2, 4];
+			} else if (interval > 0.15) { // 0.2 equals five minor ticks per 1, 10, 100 etc
+				intermediate = [1, 2, 4, 6, 8];
+			} else { // 0.1 equals ten minor ticks per 1, 10, 100 etc
+				intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];
+			}
+			
+			for (i = roundedMin; i < max + 1 && !break2; i++) {
+				len = intermediate.length;
+				for (j = 0; j < len && !break2; j++) {
+					pos = log2lin(lin2log(i) * intermediate[j]);
+					
+					if (pos > min && (!minor || lastPos <= max)) { // #1670
+						positions.push(lastPos);
+					}
+					
+					if (lastPos > max) {
+						break2 = true;
+					}
+					lastPos = pos;
+				}
+			}
+			
+		// Third case: We are so deep in between whole logarithmic values that
+		// we might as well handle the tick positions like a linear axis. For
+		// example 1.01, 1.02, 1.03, 1.04.
+		} else {
+			var realMin = lin2log(min),
+				realMax = lin2log(max),
+				tickIntervalOption = options[minor ? 'minorTickInterval' : 'tickInterval'],
+				filteredTickIntervalOption = tickIntervalOption === 'auto' ? null : tickIntervalOption,
+				tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),
+				totalPixelLength = minor ? axisLength / axis.tickPositions.length : axisLength;
+			
+			interval = pick(
+				filteredTickIntervalOption,
+				axis._minorAutoInterval,
+				(realMax - realMin) * tickPixelIntervalOption / (totalPixelLength || 1)
+			);
+			
+			interval = normalizeTickInterval(
+				interval, 
+				null, 
+				getMagnitude(interval)
+			);
+			
+			positions = map(axis.getLinearTickPositions(
+				interval, 
+				realMin,
+				realMax	
+			), log2lin);
+			
+			if (!minor) {
+				axis._minorAutoInterval = interval / 5;
+			}
+		}
+		
+		// Set the axis-level tickInterval variable 
+		if (!minor) {
+			axis.tickInterval = interval;
+		}
+		return positions;
+	},
+
+	/**
+	 * Return the minor tick positions. For logarithmic axes, reuse the same logic
+	 * as for major ticks.
+	 */
+	getMinorTickPositions: function () {
+		var axis = this,
+			options = axis.options,
+			tickPositions = axis.tickPositions,
+			minorTickInterval = axis.minorTickInterval,
+			minorTickPositions = [],
+			pos,
+			i,
+			len;
+		
+		if (axis.isLog) {
+			len = tickPositions.length;
+			for (i = 1; i < len; i++) {
+				minorTickPositions = minorTickPositions.concat(
+					axis.getLogTickPositions(minorTickInterval, tickPositions[i - 1], tickPositions[i], true)
+				);	
+			}
+		} else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314
+			minorTickPositions = minorTickPositions.concat(
+				getTimeTicks(
+					normalizeTimeTickInterval(minorTickInterval),
+					axis.min,
+					axis.max,
+					options.startOfWeek
+				)
+			);
+			if (minorTickPositions[0] < axis.min) {
+				minorTickPositions.shift();
+			}
+		} else {			
+			for (pos = axis.min + (tickPositions[0] - axis.min) % minorTickInterval; pos <= axis.max; pos += minorTickInterval) {
+				minorTickPositions.push(pos);
+			}
+		}
+		return minorTickPositions;
+	},
+
+	/**
+	 * Adjust the min and max for the minimum range. Keep in mind that the series data is 
+	 * not yet processed, so we don't have information on data cropping and grouping, or 
+	 * updated axis.pointRange or series.pointRange. The data can't be processed until
+	 * we have finally established min and max.
+	 */
+	adjustForMinRange: function () {
+		var axis = this,
+			options = axis.options,
+			min = axis.min,
+			max = axis.max,
+			zoomOffset,
+			spaceAvailable = axis.dataMax - axis.dataMin >= axis.minRange,
+			closestDataRange,
+			i,
+			distance,
+			xData,
+			loopLength,
+			minArgs,
+			maxArgs;
+
+		// Set the automatic minimum range based on the closest point distance
+		if (axis.isXAxis && axis.minRange === UNDEFINED && !axis.isLog) {
+
+			if (defined(options.min) || defined(options.max)) {
+				axis.minRange = null; // don't do this again
+
+			} else {
+
+				// Find the closest distance between raw data points, as opposed to
+				// closestPointRange that applies to processed points (cropped and grouped)
+				each(axis.series, function (series) {
+					xData = series.xData;
+					loopLength = series.xIncrement ? 1 : xData.length - 1;
+					for (i = loopLength; i > 0; i--) {
+						distance = xData[i] - xData[i - 1];
+						if (closestDataRange === UNDEFINED || distance < closestDataRange) {
+							closestDataRange = distance;
+						}
+					}
+				});
+				axis.minRange = mathMin(closestDataRange * 5, axis.dataMax - axis.dataMin);
+			}
+		}
+
+		// if minRange is exceeded, adjust
+		if (max - min < axis.minRange) {
+			var minRange = axis.minRange;
+			zoomOffset = (minRange - max + min) / 2;
+
+			// if min and max options have been set, don't go beyond it
+			minArgs = [min - zoomOffset, pick(options.min, min - zoomOffset)];
+			if (spaceAvailable) { // if space is available, stay within the data range
+				minArgs[2] = axis.dataMin;
+			}
+			min = arrayMax(minArgs);
+
+			maxArgs = [min + minRange, pick(options.max, min + minRange)];
+			if (spaceAvailable) { // if space is availabe, stay within the data range
+				maxArgs[2] = axis.dataMax;
+			}
+
+			max = arrayMin(maxArgs);
+
+			// now if the max is adjusted, adjust the min back
+			if (max - min < minRange) {
+				minArgs[0] = max - minRange;
+				minArgs[1] = pick(options.min, max - minRange);
+				min = arrayMax(minArgs);
+			}
+		}
+		
+		// Record modified extremes
+		axis.min = min;
+		axis.max = max;
+	},
+
+	/**
+	 * Update translation information
+	 */
+	setAxisTranslation: function (saveOld) {
+		var axis = this,
+			range = axis.max - axis.min,
+			pointRange = 0,
+			closestPointRange,
+			minPointOffset = 0,
+			pointRangePadding = 0,
+			linkedParent = axis.linkedParent,
+			ordinalCorrection,
+			transA = axis.transA;
+
+		// adjust translation for padding
+		if (axis.isXAxis) {
+			if (linkedParent) {
+				minPointOffset = linkedParent.minPointOffset;
+				pointRangePadding = linkedParent.pointRangePadding;
+				
+			} else {
+				each(axis.series, function (series) {
+					var seriesPointRange = series.pointRange,
+						pointPlacement = series.options.pointPlacement,
+						seriesClosestPointRange = series.closestPointRange;
+
+					if (seriesPointRange > range) { // #1446
+						seriesPointRange = 0;
+					}
+					pointRange = mathMax(pointRange, seriesPointRange);
+					
+					// minPointOffset is the value padding to the left of the axis in order to make
+					// room for points with a pointRange, typically columns. When the pointPlacement option
+					// is 'between' or 'on', this padding does not apply.
+					minPointOffset = mathMax(
+						minPointOffset, 
+						isString(pointPlacement) ? 0 : seriesPointRange / 2
+					);
+					
+					// Determine the total padding needed to the length of the axis to make room for the 
+					// pointRange. If the series' pointPlacement is 'on', no padding is added.
+					pointRangePadding = mathMax(
+						pointRangePadding,
+						pointPlacement === 'on' ? 0 : seriesPointRange
+					);
+
+					// Set the closestPointRange
+					if (!series.noSharedTooltip && defined(seriesClosestPointRange)) {
+						closestPointRange = defined(closestPointRange) ?
+							mathMin(closestPointRange, seriesClosestPointRange) :
+							seriesClosestPointRange;
+					}
+				});
+			}
+			
+			// Record minPointOffset and pointRangePadding
+			ordinalCorrection = axis.ordinalSlope && closestPointRange ? axis.ordinalSlope / closestPointRange : 1; // #988, #1853
+			axis.minPointOffset = minPointOffset = minPointOffset * ordinalCorrection;
+			axis.pointRangePadding = pointRangePadding = pointRangePadding * ordinalCorrection;
+
+			// pointRange means the width reserved for each point, like in a column chart
+			axis.pointRange = mathMin(pointRange, range);
+
+			// closestPointRange means the closest distance between points. In columns
+			// it is mostly equal to pointRange, but in lines pointRange is 0 while closestPointRange
+			// is some other value
+			axis.closestPointRange = closestPointRange;
+		}
+
+		// Secondary values
+		if (saveOld) {
+			axis.oldTransA = transA;
+		}
+		axis.translationSlope = axis.transA = transA = axis.len / ((range + pointRangePadding) || 1);
+		axis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend
+		axis.minPixelPadding = transA * minPointOffset;
+	},
+
+	/**
+	 * Set the tick positions to round values and optionally extend the extremes
+	 * to the nearest tick
+	 */
+	setTickPositions: function (secondPass) {
+		var axis = this,
+			chart = axis.chart,
+			options = axis.options,
+			isLog = axis.isLog,
+			isDatetimeAxis = axis.isDatetimeAxis,
+			isXAxis = axis.isXAxis,
+			isLinked = axis.isLinked,
+			tickPositioner = axis.options.tickPositioner,
+			maxPadding = options.maxPadding,
+			minPadding = options.minPadding,
+			length,
+			linkedParentExtremes,
+			tickIntervalOption = options.tickInterval,
+			minTickIntervalOption = options.minTickInterval,
+			tickPixelIntervalOption = options.tickPixelInterval,
+			tickPositions,
+			keepTwoTicksOnly,
+			categories = axis.categories;
+
+		// linked axis gets the extremes from the parent axis
+		if (isLinked) {
+			axis.linkedParent = chart[isXAxis ? 'xAxis' : 'yAxis'][options.linkedTo];
+			linkedParentExtremes = axis.linkedParent.getExtremes();
+			axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);
+			axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);
+			if (options.type !== axis.linkedParent.options.type) {
+				error(11, 1); // Can't link axes of different type
+			}
+		} else { // initial min and max from the extreme data values
+			axis.min = pick(axis.userMin, options.min, axis.dataMin);
+			axis.max = pick(axis.userMax, options.max, axis.dataMax);
+		}
+
+		if (isLog) {
+			if (!secondPass && mathMin(axis.min, pick(axis.dataMin, axis.min)) <= 0) { // #978
+				error(10, 1); // Can't plot negative values on log axis
+			}
+			axis.min = correctFloat(log2lin(axis.min)); // correctFloat cures #934
+			axis.max = correctFloat(log2lin(axis.max));
+		}
+
+		// handle zoomed range
+		if (axis.range) {
+			axis.userMin = axis.min = mathMax(axis.min, axis.max - axis.range); // #618
+			axis.userMax = axis.max;
+			if (secondPass) {
+				axis.range = null;  // don't use it when running setExtremes
+			}
+		}
+		
+		// Hook for adjusting this.min and this.max. Used by bubble series.
+		if (axis.beforePadding) {
+			axis.beforePadding();
+		}
+
+		// adjust min and max for the minimum range
+		axis.adjustForMinRange();
+		
+		// Pad the values to get clear of the chart's edges. To avoid tickInterval taking the padding
+		// into account, we do this after computing tick interval (#1337).
+		if (!categories && !axis.usePercentage && !isLinked && defined(axis.min) && defined(axis.max)) {
+			length = axis.max - axis.min;
+			if (length) {
+				if (!defined(options.min) && !defined(axis.userMin) && minPadding && (axis.dataMin < 0 || !axis.ignoreMinPadding)) {
+					axis.min -= length * minPadding;
+				}
+				if (!defined(options.max) && !defined(axis.userMax)  && maxPadding && (axis.dataMax > 0 || !axis.ignoreMaxPadding)) {
+					axis.max += length * maxPadding;
+				}
+			}
+		}
+
+		// get tickInterval
+		if (axis.min === axis.max || axis.min === undefined || axis.max === undefined) {
+			axis.tickInterval = 1;
+		} else if (isLinked && !tickIntervalOption &&
+				tickPixelIntervalOption === axis.linkedParent.options.tickPixelInterval) {
+			axis.tickInterval = axis.linkedParent.tickInterval;
+		} else {
+			axis.tickInterval = pick(
+				tickIntervalOption,
+				categories ? // for categoried axis, 1 is default, for linear axis use tickPix
+					1 :
+					// don't let it be more than the data range
+					(axis.max - axis.min) * tickPixelIntervalOption / mathMax(axis.len, tickPixelIntervalOption)
+			);
+			// For squished axes, set only two ticks
+			if (!defined(tickIntervalOption) && axis.len < tickPixelIntervalOption && !this.isRadial) {
+				keepTwoTicksOnly = true;
+				axis.tickInterval /= 4; // tick extremes closer to the real values
+			}
+		}
+
+		// Now we're finished detecting min and max, crop and group series data. This
+		// is in turn needed in order to find tick positions in ordinal axes. 
+		if (isXAxis && !secondPass) {
+			each(axis.series, function (series) {
+				series.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);
+			});
+		}
+
+		// set the translation factor used in translate function
+		axis.setAxisTranslation(true);
+
+		// hook for ordinal axes and radial axes
+		if (axis.beforeSetTickPositions) {
+			axis.beforeSetTickPositions();
+		}
+		
+		// hook for extensions, used in Highstock ordinal axes
+		if (axis.postProcessTickInterval) {
+			axis.tickInterval = axis.postProcessTickInterval(axis.tickInterval);
+		}
+
+		// In column-like charts, don't cramp in more ticks than there are points (#1943)
+		if (axis.pointRange) {
+			axis.tickInterval = mathMax(axis.pointRange, axis.tickInterval);
+		}
+		
+		// Before normalizing the tick interval, handle minimum tick interval. This applies only if tickInterval is not defined.
+		if (!tickIntervalOption && axis.tickInterval < minTickIntervalOption) {
+			axis.tickInterval = minTickIntervalOption;
+		}
+
+		// for linear axes, get magnitude and normalize the interval
+		if (!isDatetimeAxis && !isLog) { // linear
+			if (!tickIntervalOption) {
+				axis.tickInterval = normalizeTickInterval(axis.tickInterval, null, getMagnitude(axis.tickInterval), options);
+			}
+		}
+
+		// get minorTickInterval
+		axis.minorTickInterval = options.minorTickInterval === 'auto' && axis.tickInterval ?
+				axis.tickInterval / 5 : options.minorTickInterval;
+
+		// find the tick positions
+		axis.tickPositions = tickPositions = options.tickPositions ?
+			[].concat(options.tickPositions) : // Work on a copy (#1565)
+			(tickPositioner && tickPositioner.apply(axis, [axis.min, axis.max]));
+		if (!tickPositions) {
+			
+			// Too many ticks
+			if (!axis.ordinalPositions && (axis.max - axis.min) / axis.tickInterval > mathMax(2 * axis.len, 200)) {
+				error(19, true);
+			}
+			
+			if (isDatetimeAxis) {
+				tickPositions = (axis.getNonLinearTimeTicks || getTimeTicks)(
+					normalizeTimeTickInterval(axis.tickInterval, options.units),
+					axis.min,
+					axis.max,
+					options.startOfWeek,
+					axis.ordinalPositions,
+					axis.closestPointRange,
+					true
+				);
+			} else if (isLog) {
+				tickPositions = axis.getLogTickPositions(axis.tickInterval, axis.min, axis.max);
+			} else {
+				tickPositions = axis.getLinearTickPositions(axis.tickInterval, axis.min, axis.max);
+			}
+			if (keepTwoTicksOnly) {
+				tickPositions.splice(1, tickPositions.length - 2);
+			}
+
+			axis.tickPositions = tickPositions;
+		}
+
+		if (!isLinked) {
+
+			// reset min/max or remove extremes based on start/end on tick
+			var roundedMin = tickPositions[0],
+				roundedMax = tickPositions[tickPositions.length - 1],
+				minPointOffset = axis.minPointOffset || 0,
+				singlePad;
+
+			if (options.startOnTick) {
+				axis.min = roundedMin;
+			} else if (axis.min - minPointOffset > roundedMin) {
+				tickPositions.shift();
+			}
+
+			if (options.endOnTick) {
+				axis.max = roundedMax;
+			} else if (axis.max + minPointOffset < roundedMax) {
+				tickPositions.pop();
+			}
+			
+			// When there is only one point, or all points have the same value on this axis, then min
+			// and max are equal and tickPositions.length is 1. In this case, add some padding
+			// in order to center the point, but leave it with one tick. #1337.
+			if (tickPositions.length === 1) {
+				singlePad = 0.001; // The lowest possible number to avoid extra padding on columns
+				axis.min -= singlePad;
+				axis.max += singlePad;
+			}
+		}
+	},
+	
+	/**
+	 * Set the max ticks of either the x and y axis collection
+	 */
+	setMaxTicks: function () {
+		
+		var chart = this.chart,
+			maxTicks = chart.maxTicks || {},
+			tickPositions = this.tickPositions,
+			key = this._maxTicksKey = [this.xOrY, this.pos, this.len].join('-');
+		
+		if (!this.isLinked && !this.isDatetimeAxis && tickPositions && tickPositions.length > (maxTicks[key] || 0) && this.options.alignTicks !== false) {
+			maxTicks[key] = tickPositions.length;
+		}
+		chart.maxTicks = maxTicks;
+	},
+
+	/**
+	 * When using multiple axes, adjust the number of ticks to match the highest
+	 * number of ticks in that group
+	 */
+	adjustTickAmount: function () {
+		var axis = this,
+			chart = axis.chart,
+			key = axis._maxTicksKey,
+			tickPositions = axis.tickPositions,
+			maxTicks = chart.maxTicks;
+
+		if (maxTicks && maxTicks[key] && !axis.isDatetimeAxis && !axis.categories && !axis.isLinked && axis.options.alignTicks !== false) { // only apply to linear scale
+			var oldTickAmount = axis.tickAmount,
+				calculatedTickAmount = tickPositions.length,
+				tickAmount;
+
+			// set the axis-level tickAmount to use below
+			axis.tickAmount = tickAmount = maxTicks[key];
+
+			if (calculatedTickAmount < tickAmount) {
+				while (tickPositions.length < tickAmount) {
+					tickPositions.push(correctFloat(
+						tickPositions[tickPositions.length - 1] + axis.tickInterval
+					));
+				}
+				axis.transA *= (calculatedTickAmount - 1) / (tickAmount - 1);
+				axis.max = tickPositions[tickPositions.length - 1];
+
+			}
+			if (defined(oldTickAmount) && tickAmount !== oldTickAmount) {
+				axis.isDirty = true;
+			}
+		}
+	},
+
+	/**
+	 * Set the scale based on data min and max, user set min and max or options
+	 *
+	 */
+	setScale: function () {
+		var axis = this,
+			stacks = axis.stacks,
+			type,
+			i,
+			isDirtyData,
+			isDirtyAxisLength;
+
+		axis.oldMin = axis.min;
+		axis.oldMax = axis.max;
+		axis.oldAxisLength = axis.len;
+
+		// set the new axisLength
+		axis.setAxisSize();
+		//axisLength = horiz ? axisWidth : axisHeight;
+		isDirtyAxisLength = axis.len !== axis.oldAxisLength;
+
+		// is there new data?
+		each(axis.series, function (series) {
+			if (series.isDirtyData || series.isDirty ||
+					series.xAxis.isDirty) { // when x axis is dirty, we need new data extremes for y as well
+				isDirtyData = true;
+			}
+		});
+
+		// do we really need to go through all this?
+		if (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||
+			axis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax) {
+			
+			// reset stacks
+			if (!axis.isXAxis) {
+				for (type in stacks) {
+					delete stacks[type];
+				}
+			}
+
+			axis.forceRedraw = false;
+
+			// get data extremes if needed
+			axis.getSeriesExtremes();
+
+			// get fixed positions based on tickInterval
+			axis.setTickPositions();
+
+			// record old values to decide whether a rescale is necessary later on (#540)
+			axis.oldUserMin = axis.userMin;
+			axis.oldUserMax = axis.userMax;
+
+			// Mark as dirty if it is not already set to dirty and extremes have changed. #595.
+			if (!axis.isDirty) {
+				axis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;
+			}
+		} else if (!axis.isXAxis) {
+			if (axis.oldStacks) {
+				stacks = axis.stacks = axis.oldStacks;
+			}
+
+			// reset stacks
+			for (type in stacks) {
+				for (i in stacks[type]) {
+					stacks[type][i].cum = stacks[type][i].total;
+				}
+			}
+		}
+		
+		// Set the maximum tick amount
+		axis.setMaxTicks();
+	},
+
+	/**
+	 * Set the extremes and optionally redraw
+	 * @param {Number} newMin
+	 * @param {Number} newMax
+	 * @param {Boolean} redraw
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 * @param {Object} eventArguments 
+	 *
+	 */
+	setExtremes: function (newMin, newMax, redraw, animation, eventArguments) {
+		var axis = this,
+			chart = axis.chart;
+
+		redraw = pick(redraw, true); // defaults to true
+
+		// Extend the arguments with min and max
+		eventArguments = extend(eventArguments, {
+			min: newMin,
+			max: newMax
+		});
+
+		// Fire the event
+		fireEvent(axis, 'setExtremes', eventArguments, function () { // the default event handler
+
+			axis.userMin = newMin;
+			axis.userMax = newMax;
+			axis.eventArgs = eventArguments;
+
+			// Mark for running afterSetExtremes
+			axis.isDirtyExtremes = true;
+
+			// redraw
+			if (redraw) {
+				chart.redraw(animation);
+			}
+		});
+	},
+	
+	/**
+	 * Overridable method for zooming chart. Pulled out in a separate method to allow overriding
+	 * in stock charts.
+	 */
+	zoom: function (newMin, newMax) {
+
+		// Prevent pinch zooming out of range. Check for defined is for #1946.
+		if (!this.allowZoomOutside) {
+			if (defined(this.dataMin) && newMin <= this.dataMin) {
+				newMin = UNDEFINED;
+			}
+			if (defined(this.dataMax) && newMax >= this.dataMax) {
+				newMax = UNDEFINED;
+			}
+		}
+
+		// In full view, displaying the reset zoom button is not required
+		this.displayBtn = newMin !== UNDEFINED || newMax !== UNDEFINED;
+		
+		// Do it
+		this.setExtremes(
+			newMin,
+			newMax,
+			false, 
+			UNDEFINED, 
+			{ trigger: 'zoom' }
+		);
+		return true;
+	},
+	
+	/**
+	 * Update the axis metrics
+	 */
+	setAxisSize: function () {
+		var chart = this.chart,
+			options = this.options,
+			offsetLeft = options.offsetLeft || 0,
+			offsetRight = options.offsetRight || 0,
+			horiz = this.horiz,
+			width,
+			height,
+			top,
+			left;
+
+		// Expose basic values to use in Series object and navigator
+		this.left = left = pick(options.left, chart.plotLeft + offsetLeft);
+		this.top = top = pick(options.top, chart.plotTop);
+		this.width = width = pick(options.width, chart.plotWidth - offsetLeft + offsetRight);
+		this.height = height = pick(options.height, chart.plotHeight);
+		this.bottom = chart.chartHeight - height - top;
+		this.right = chart.chartWidth - width - left;
+
+		// Direction agnostic properties
+		this.len = mathMax(horiz ? width : height, 0); // mathMax fixes #905
+		this.pos = horiz ? left : top; // distance from SVG origin
+	},
+
+	/**
+	 * Get the actual axis extremes
+	 */
+	getExtremes: function () {
+		var axis = this,
+			isLog = axis.isLog;
+
+		return {
+			min: isLog ? correctFloat(lin2log(axis.min)) : axis.min,
+			max: isLog ? correctFloat(lin2log(axis.max)) : axis.max,
+			dataMin: axis.dataMin,
+			dataMax: axis.dataMax,
+			userMin: axis.userMin,
+			userMax: axis.userMax
+		};
+	},
+
+	/**
+	 * Get the zero plane either based on zero or on the min or max value.
+	 * Used in bar and area plots
+	 */
+	getThreshold: function (threshold) {
+		var axis = this,
+			isLog = axis.isLog;
+
+		var realMin = isLog ? lin2log(axis.min) : axis.min,
+			realMax = isLog ? lin2log(axis.max) : axis.max;
+		
+		if (realMin > threshold || threshold === null) {
+			threshold = realMin;
+		} else if (realMax < threshold) {
+			threshold = realMax;
+		}
+
+		return axis.translate(threshold, 0, 1, 0, 1);
+	},
+
+	addPlotBand: function (options) {
+		this.addPlotBandOrLine(options, 'plotBands');
+	},
+	
+	addPlotLine: function (options) {
+		this.addPlotBandOrLine(options, 'plotLines');
+	},
+
+	/**
+	 * Add a plot band or plot line after render time
+	 *
+	 * @param options {Object} The plotBand or plotLine configuration object
+	 */
+	addPlotBandOrLine: function (options, coll) {
+		var obj = new PlotLineOrBand(this, options).render(),
+			userOptions = this.userOptions;
+
+		if (obj) { // #2189
+			// Add it to the user options for exporting and Axis.update
+			if (coll) {
+				userOptions[coll] = userOptions[coll] || [];
+				userOptions[coll].push(options); 
+			}
+			this.plotLinesAndBands.push(obj); 
+		}
+		
+		return obj;
+	},
+
+	/**
+	 * Compute auto alignment for the axis label based on which side the axis is on 
+	 * and the given rotation for the label
+	 */
+	autoLabelAlign: function (rotation) {
+		var ret, 
+			angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360;
+
+		if (angle > 15 && angle < 165) {
+			ret = 'right';
+		} else if (angle > 195 && angle < 345) {
+			ret = 'left';
+		} else {
+			ret = 'center';
+		}
+		return ret;
+	},
+
+	/**
+	 * Render the tick labels to a preliminary position to get their sizes
+	 */
+	getOffset: function () {
+		var axis = this,
+			chart = axis.chart,
+			renderer = chart.renderer,
+			options = axis.options,
+			tickPositions = axis.tickPositions,
+			ticks = axis.ticks,
+			horiz = axis.horiz,
+			side = axis.side,
+			invertedSide = chart.inverted ? [1, 0, 3, 2][side] : side,
+			hasData,
+			showAxis,
+			titleOffset = 0,
+			titleOffsetOption,
+			titleMargin = 0,
+			axisTitleOptions = options.title,
+			labelOptions = options.labels,
+			labelOffset = 0, // reset
+			axisOffset = chart.axisOffset,
+			clipOffset = chart.clipOffset,
+			directionFactor = [-1, 1, 1, -1][side],
+			n,
+			i,
+			autoStaggerLines = 1,
+			maxStaggerLines = pick(labelOptions.maxStaggerLines, 5),
+			sortedPositions,
+			lastRight,
+			overlap,
+			pos,
+			bBox,
+			x,
+			w,
+			lineNo;
+			
+		// For reuse in Axis.render
+		axis.hasData = hasData = (axis.hasVisibleSeries || (defined(axis.min) && defined(axis.max) && !!tickPositions));
+		axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);
+
+		// Set/reset staggerLines
+		axis.staggerLines = axis.horiz && labelOptions.staggerLines;
+		
+		// Create the axisGroup and gridGroup elements on first iteration
+		if (!axis.axisGroup) {
+			axis.gridGroup = renderer.g('grid')
+				.attr({ zIndex: options.gridZIndex || 1 })
+				.add();
+			axis.axisGroup = renderer.g('axis')
+				.attr({ zIndex: options.zIndex || 2 })
+				.add();
+			axis.labelGroup = renderer.g('axis-labels')
+				.attr({ zIndex: labelOptions.zIndex || 7 })
+				.add();
+		}
+
+		if (hasData || axis.isLinked) {
+			
+			// Set the explicit or automatic label alignment
+			axis.labelAlign = pick(labelOptions.align || axis.autoLabelAlign(labelOptions.rotation));
+
+			each(tickPositions, function (pos) {
+				if (!ticks[pos]) {
+					ticks[pos] = new Tick(axis, pos);
+				} else {
+					ticks[pos].addLabel(); // update labels depending on tick interval
+				}
+			});
+
+			// Handle automatic stagger lines
+			if (axis.horiz && !axis.staggerLines && maxStaggerLines && !labelOptions.rotation) {
+				sortedPositions = axis.reversed ? [].concat(tickPositions).reverse() : tickPositions;
+				while (autoStaggerLines < maxStaggerLines) {
+					lastRight = [];
+					overlap = false;
+					
+					for (i = 0; i < sortedPositions.length; i++) {
+						pos = sortedPositions[i];
+						bBox = ticks[pos].label && ticks[pos].label.getBBox();
+						w = bBox ? bBox.width : 0;
+						lineNo = i % autoStaggerLines;
+						
+						if (w) {
+							x = axis.translate(pos); // don't handle log
+							if (lastRight[lineNo] !== UNDEFINED && x < lastRight[lineNo]) {
+								overlap = true;
+							}
+							lastRight[lineNo] = x + w;
+						}
+					}
+					if (overlap) {
+						autoStaggerLines++;
+					} else {
+						break;
+					}
+				}
+
+				if (autoStaggerLines > 1) {
+					axis.staggerLines = autoStaggerLines;
+				}
+			}
+
+
+			each(tickPositions, function (pos) {
+				// left side must be align: right and right side must have align: left for labels
+				if (side === 0 || side === 2 || { 1: 'left', 3: 'right' }[side] === axis.labelAlign) {
+
+					// get the highest offset
+					labelOffset = mathMax(
+						ticks[pos].getLabelSize(),
+						labelOffset
+					);
+				}
+
+			});
+			if (axis.staggerLines) {
+				labelOffset *= axis.staggerLines;
+				axis.labelOffset = labelOffset;
+			}
+			
+
+		} else { // doesn't have data
+			for (n in ticks) {
+				ticks[n].destroy();
+				delete ticks[n];
+			}
+		}
+
+		if (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) { 
+			if (!axis.axisTitle) {
+				axis.axisTitle = renderer.text(
+					axisTitleOptions.text,
+					0,
+					0,
+					axisTitleOptions.useHTML
+				)
+				.attr({
+					zIndex: 7,
+					rotation: axisTitleOptions.rotation || 0,
+					align:
+						axisTitleOptions.textAlign ||
+						{ low: 'left', middle: 'center', high: 'right' }[axisTitleOptions.align]
+				})
+				.css(axisTitleOptions.style)
+				.add(axis.axisGroup);
+				axis.axisTitle.isNew = true;
+			}
+
+			if (showAxis) {
+				titleOffset = axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];
+				titleMargin = pick(axisTitleOptions.margin, horiz ? 5 : 10);
+				titleOffsetOption = axisTitleOptions.offset;
+			}
+
+			// hide or show the title depending on whether showEmpty is set
+			axis.axisTitle[showAxis ? 'show' : 'hide']();
+		}
+		
+		// handle automatic or user set offset
+		axis.offset = directionFactor * pick(options.offset, axisOffset[side]);
+		
+		axis.axisTitleMargin =
+			pick(titleOffsetOption,
+				labelOffset + titleMargin +
+				(side !== 2 && labelOffset && directionFactor * options.labels[horiz ? 'y' : 'x'])
+			);
+
+		axisOffset[side] = mathMax(
+			axisOffset[side],
+			axis.axisTitleMargin + titleOffset + directionFactor * axis.offset
+		);
+		clipOffset[invertedSide] = mathMax(clipOffset[invertedSide], mathFloor(options.lineWidth / 2) * 2);
+	},
+	
+	/**
+	 * Get the path for the axis line
+	 */
+	getLinePath: function (lineWidth) {
+		var chart = this.chart,
+			opposite = this.opposite,
+			offset = this.offset,
+			horiz = this.horiz,
+			lineLeft = this.left + (opposite ? this.width : 0) + offset,
+			lineTop = chart.chartHeight - this.bottom - (opposite ? this.height : 0) + offset;
+			
+		if (opposite) {
+			lineWidth *= -1; // crispify the other way - #1480, #1687
+		}
+
+		return chart.renderer.crispLine([
+				M,
+				horiz ?
+					this.left :
+					lineLeft,
+				horiz ?
+					lineTop :
+					this.top,
+				L,
+				horiz ?
+					chart.chartWidth - this.right :
+					lineLeft,
+				horiz ?
+					lineTop :
+					chart.chartHeight - this.bottom
+			], lineWidth);
+	},
+	
+	/**
+	 * Position the title
+	 */
+	getTitlePosition: function () {
+		// compute anchor points for each of the title align options
+		var horiz = this.horiz,
+			axisLeft = this.left,
+			axisTop = this.top,
+			axisLength = this.len,
+			axisTitleOptions = this.options.title,			
+			margin = horiz ? axisLeft : axisTop,
+			opposite = this.opposite,
+			offset = this.offset,
+			fontSize = pInt(axisTitleOptions.style.fontSize || 12),
+			
+			// the position in the length direction of the axis
+			alongAxis = {
+				low: margin + (horiz ? 0 : axisLength),
+				middle: margin + axisLength / 2,
+				high: margin + (horiz ? axisLength : 0)
+			}[axisTitleOptions.align],
+	
+			// the position in the perpendicular direction of the axis
+			offAxis = (horiz ? axisTop + this.height : axisLeft) +
+				(horiz ? 1 : -1) * // horizontal axis reverses the margin
+				(opposite ? -1 : 1) * // so does opposite axes
+				this.axisTitleMargin +
+				(this.side === 2 ? fontSize : 0);
+
+		return {
+			x: horiz ?
+				alongAxis :
+				offAxis + (opposite ? this.width : 0) + offset +
+					(axisTitleOptions.x || 0), // x
+			y: horiz ?
+				offAxis - (opposite ? this.height : 0) + offset :
+				alongAxis + (axisTitleOptions.y || 0) // y
+		};
+	},
+	
+	/**
+	 * Render the axis
+	 */
+	render: function () {
+		var axis = this,
+			chart = axis.chart,
+			renderer = chart.renderer,
+			options = axis.options,
+			isLog = axis.isLog,
+			isLinked = axis.isLinked,
+			tickPositions = axis.tickPositions,
+			axisTitle = axis.axisTitle,
+			stacks = axis.stacks,
+			ticks = axis.ticks,
+			minorTicks = axis.minorTicks,
+			alternateBands = axis.alternateBands,
+			stackLabelOptions = options.stackLabels,
+			alternateGridColor = options.alternateGridColor,
+			tickmarkOffset = axis.tickmarkOffset,
+			lineWidth = options.lineWidth,
+			linePath,
+			hasRendered = chart.hasRendered,
+			slideInTicks = hasRendered && defined(axis.oldMin) && !isNaN(axis.oldMin),
+			hasData = axis.hasData,
+			showAxis = axis.showAxis,
+			from,
+			to;
+
+		// Mark all elements inActive before we go over and mark the active ones
+		each([ticks, minorTicks, alternateBands], function (coll) {
+			var pos;
+			for (pos in coll) {
+				coll[pos].isActive = false;
+			}
+		});
+
+		// If the series has data draw the ticks. Else only the line and title
+		if (hasData || isLinked) {
+
+			// minor ticks
+			if (axis.minorTickInterval && !axis.categories) {
+				each(axis.getMinorTickPositions(), function (pos) {
+					if (!minorTicks[pos]) {
+						minorTicks[pos] = new Tick(axis, pos, 'minor');
+					}
+
+					// render new ticks in old position
+					if (slideInTicks && minorTicks[pos].isNew) {
+						minorTicks[pos].render(null, true);
+					}
+
+					minorTicks[pos].render(null, false, 1);
+				});
+			}
+
+			// Major ticks. Pull out the first item and render it last so that
+			// we can get the position of the neighbour label. #808.
+			if (tickPositions.length) { // #1300
+				each(tickPositions.slice(1).concat([tickPositions[0]]), function (pos, i) {
+	
+					// Reorganize the indices
+					i = (i === tickPositions.length - 1) ? 0 : i + 1;
+	
+					// linked axes need an extra check to find out if
+					if (!isLinked || (pos >= axis.min && pos <= axis.max)) {
+	
+						if (!ticks[pos]) {
+							ticks[pos] = new Tick(axis, pos);
+						}
+	
+						// render new ticks in old position
+						if (slideInTicks && ticks[pos].isNew) {
+							ticks[pos].render(i, true);
+						}
+	
+						ticks[pos].render(i, false, 1);
+					}
+	
+				});
+				// In a categorized axis, the tick marks are displayed between labels. So
+				// we need to add a tick mark and grid line at the left edge of the X axis.
+				if (tickmarkOffset && axis.min === 0) {
+					if (!ticks[-1]) {
+						ticks[-1] = new Tick(axis, -1, null, true);
+					}
+					ticks[-1].render(-1);
+				}
+				
+			}
+
+			// alternate grid color
+			if (alternateGridColor) {
+				each(tickPositions, function (pos, i) {
+					if (i % 2 === 0 && pos < axis.max) {
+						if (!alternateBands[pos]) {
+							alternateBands[pos] = new PlotLineOrBand(axis);
+						}
+						from = pos + tickmarkOffset; // #949
+						to = tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] + tickmarkOffset : axis.max;
+						alternateBands[pos].options = {
+							from: isLog ? lin2log(from) : from,
+							to: isLog ? lin2log(to) : to,
+							color: alternateGridColor
+						};
+						alternateBands[pos].render();
+						alternateBands[pos].isActive = true;
+					}
+				});
+			}
+
+			// custom plot lines and bands
+			if (!axis._addedPlotLB) { // only first time
+				each((options.plotLines || []).concat(options.plotBands || []), function (plotLineOptions) {
+					axis.addPlotBandOrLine(plotLineOptions);
+				});
+				axis._addedPlotLB = true;
+			}
+
+		} // end if hasData
+
+		// Remove inactive ticks
+		each([ticks, minorTicks, alternateBands], function (coll) {
+			var pos, 
+				i,
+				forDestruction = [],
+				delay = globalAnimation ? globalAnimation.duration || 500 : 0,
+				destroyInactiveItems = function () {
+					i = forDestruction.length;
+					while (i--) {
+						// When resizing rapidly, the same items may be destroyed in different timeouts,
+						// or the may be reactivated
+						if (coll[forDestruction[i]] && !coll[forDestruction[i]].isActive) {
+							coll[forDestruction[i]].destroy();
+							delete coll[forDestruction[i]];
+						}
+					}
+					
+				};
+
+			for (pos in coll) {
+
+				if (!coll[pos].isActive) {
+					// Render to zero opacity
+					coll[pos].render(pos, false, 0);
+					coll[pos].isActive = false;
+					forDestruction.push(pos);
+				}
+			}
+
+			// When the objects are finished fading out, destroy them
+			if (coll === alternateBands || !chart.hasRendered || !delay) {
+				destroyInactiveItems();
+			} else if (delay) {
+				setTimeout(destroyInactiveItems, delay);
+			}
+		});
+
+		// Static items. As the axis group is cleared on subsequent calls
+		// to render, these items are added outside the group.
+		// axis line
+		if (lineWidth) {
+			linePath = axis.getLinePath(lineWidth);
+			if (!axis.axisLine) {
+				axis.axisLine = renderer.path(linePath)
+					.attr({
+						stroke: options.lineColor,
+						'stroke-width': lineWidth,
+						zIndex: 7
+					})
+					.add(axis.axisGroup);
+			} else {
+				axis.axisLine.animate({ d: linePath });
+			}
+
+			// show or hide the line depending on options.showEmpty
+			axis.axisLine[showAxis ? 'show' : 'hide']();
+		}
+
+		if (axisTitle && showAxis) {
+			
+			axisTitle[axisTitle.isNew ? 'attr' : 'animate'](
+				axis.getTitlePosition()
+			);
+			axisTitle.isNew = false;
+		}
+
+		// Stacked totals:
+		if (stackLabelOptions && stackLabelOptions.enabled) {
+			var stackKey, oneStack, stackCategory,
+				stackTotalGroup = axis.stackTotalGroup;
+
+			// Create a separate group for the stack total labels
+			if (!stackTotalGroup) {
+				axis.stackTotalGroup = stackTotalGroup =
+					renderer.g('stack-labels')
+						.attr({
+							visibility: VISIBLE,
+							zIndex: 6
+						})
+						.add();
+			}
+
+			// plotLeft/Top will change when y axis gets wider so we need to translate the
+			// stackTotalGroup at every render call. See bug #506 and #516
+			stackTotalGroup.translate(chart.plotLeft, chart.plotTop);
+
+			// Render each stack total
+			for (stackKey in stacks) {
+				oneStack = stacks[stackKey];
+				for (stackCategory in oneStack) {
+					oneStack[stackCategory].render(stackTotalGroup);
+				}
+			}
+		}
+		// End stacked totals
+
+		axis.isDirty = false;
+	},
+
+	/**
+	 * Remove a plot band or plot line from the chart by id
+	 * @param {Object} id
+	 */
+	removePlotBandOrLine: function (id) {
+		var plotLinesAndBands = this.plotLinesAndBands,
+			options = this.options,
+			userOptions = this.userOptions,
+			i = plotLinesAndBands.length;
+		while (i--) {
+			if (plotLinesAndBands[i].id === id) {
+				plotLinesAndBands[i].destroy();
+			}
+		}
+		each([options.plotLines || [], userOptions.plotLines || [], options.plotBands || [], userOptions.plotBands || []], function (arr) {
+			i = arr.length;
+			while (i--) {
+				if (arr[i].id === id) {
+					erase(arr, arr[i]);
+				}
+			}
+		});
+
+	},
+
+	/**
+	 * Update the axis title by options
+	 */
+	setTitle: function (newTitleOptions, redraw) {
+		this.update({ title: newTitleOptions }, redraw);
+	},
+
+	/**
+	 * Redraw the axis to reflect changes in the data or axis extremes
+	 */
+	redraw: function () {
+		var axis = this,
+			chart = axis.chart,
+			pointer = chart.pointer;
+
+		// hide tooltip and hover states
+		if (pointer.reset) {
+			pointer.reset(true);
+		}
+
+		// render the axis
+		axis.render();
+
+		// move plot lines and bands
+		each(axis.plotLinesAndBands, function (plotLine) {
+			plotLine.render();
+		});
+
+		// mark associated series as dirty and ready for redraw
+		each(axis.series, function (series) {
+			series.isDirty = true;
+		});
+
+	},
+
+	/**
+	 * Build the stacks from top down
+	 */
+	buildStacks: function () {
+		var series = this.series,
+			i = series.length;
+		if (!this.isXAxis) {
+			while (i--) {
+				series[i].setStackedPoints();
+			}
+			// Loop up again to compute percent stack
+			if (this.usePercentage) {
+				for (i = 0; i < series.length; i++) {
+					series[i].setPercentStacks();
+				}
+			}
+		}
+	},
+
+	/**
+	 * Set new axis categories and optionally redraw
+	 * @param {Array} categories
+	 * @param {Boolean} redraw
+	 */
+	setCategories: function (categories, redraw) {
+		this.update({ categories: categories }, redraw);
+	},
+
+	/**
+	 * Destroys an Axis instance.
+	 */
+	destroy: function (keepEvents) {
+		var axis = this,
+			stacks = axis.stacks,
+			stackKey,
+			plotLinesAndBands = axis.plotLinesAndBands,
+			i;
+
+		// Remove the events
+		if (!keepEvents) {
+			removeEvent(axis);
+		}
+
+		// Destroy each stack total
+		for (stackKey in stacks) {
+			destroyObjectProperties(stacks[stackKey]);
+
+			stacks[stackKey] = null;
+		}
+
+		// Destroy collections
+		each([axis.ticks, axis.minorTicks, axis.alternateBands], function (coll) {
+			destroyObjectProperties(coll);
+		});
+		i = plotLinesAndBands.length;
+		while (i--) { // #1975
+			plotLinesAndBands[i].destroy();
+		}
+
+		// Destroy local variables
+		each(['stackTotalGroup', 'axisLine', 'axisGroup', 'gridGroup', 'labelGroup', 'axisTitle'], function (prop) {
+			if (axis[prop]) {
+				axis[prop] = axis[prop].destroy();
+			}
+		});
+	}
+
+	
+}; // end Axis
+
+/**
+ * The tooltip object
+ * @param {Object} chart The chart instance
+ * @param {Object} options Tooltip options
+ */
+function Tooltip() {
+	this.init.apply(this, arguments);
+}
+
+Tooltip.prototype = {
+
+	init: function (chart, options) {
+
+		var borderWidth = options.borderWidth,
+			style = options.style,
+			padding = pInt(style.padding);
+
+		// Save the chart and options
+		this.chart = chart;
+		this.options = options;
+
+		// Keep track of the current series
+		//this.currentSeries = UNDEFINED;
+
+		// List of crosshairs
+		this.crosshairs = [];
+
+		// Current values of x and y when animating
+		this.now = { x: 0, y: 0 };
+
+		// The tooltip is initially hidden
+		this.isHidden = true;
+
+
+		// create the label
+		this.label = chart.renderer.label('', 0, 0, options.shape, null, null, options.useHTML, null, 'tooltip')
+			.attr({
+				padding: padding,
+				fill: options.backgroundColor,
+				'stroke-width': borderWidth,
+				r: options.borderRadius,
+				zIndex: 8
+			})
+			.css(style)
+			.css({ padding: 0 }) // Remove it from VML, the padding is applied as an attribute instead (#1117)
+			.add()
+			.attr({ y: -999 }); // #2301
+
+		// When using canVG the shadow shows up as a gray circle
+		// even if the tooltip is hidden.
+		if (!useCanVG) {
+			this.label.shadow(options.shadow);
+		}
+
+		// Public property for getting the shared state.
+		this.shared = options.shared;
+	},
+
+	/**
+	 * Destroy the tooltip and its elements.
+	 */
+	destroy: function () {
+		each(this.crosshairs, function (crosshair) {
+			if (crosshair) {
+				crosshair.destroy();
+			}
+		});
+
+		// Destroy and clear local variables
+		if (this.label) {
+			this.label = this.label.destroy();
+		}
+		clearTimeout(this.hideTimer);
+		clearTimeout(this.tooltipTimeout);
+	},
+
+	/**
+	 * Provide a soft movement for the tooltip
+	 *
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @private
+	 */
+	move: function (x, y, anchorX, anchorY) {
+		var tooltip = this,
+			now = tooltip.now,
+			animate = tooltip.options.animation !== false && !tooltip.isHidden;
+
+		// get intermediate values for animation
+		extend(now, {
+			x: animate ? (2 * now.x + x) / 3 : x,
+			y: animate ? (now.y + y) / 2 : y,
+			anchorX: animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,
+			anchorY: animate ? (now.anchorY + anchorY) / 2 : anchorY
+		});
+
+		// move to the intermediate value
+		tooltip.label.attr(now);
+
+		
+		// run on next tick of the mouse tracker
+		if (animate && (mathAbs(x - now.x) > 1 || mathAbs(y - now.y) > 1)) {
+		
+			// never allow two timeouts
+			clearTimeout(this.tooltipTimeout);
+			
+			// set the fixed interval ticking for the smooth tooltip
+			this.tooltipTimeout = setTimeout(function () {
+				// The interval function may still be running during destroy, so check that the chart is really there before calling.
+				if (tooltip) {
+					tooltip.move(x, y, anchorX, anchorY);
+				}
+			}, 32);
+			
+		}
+	},
+
+	/**
+	 * Hide the tooltip
+	 */
+	hide: function () {
+		var tooltip = this,
+			hoverPoints;
+		
+		clearTimeout(this.hideTimer); // disallow duplicate timers (#1728, #1766)
+		if (!this.isHidden) {
+			hoverPoints = this.chart.hoverPoints;
+
+			this.hideTimer = setTimeout(function () {
+				tooltip.label.fadeOut();
+				tooltip.isHidden = true;
+			}, pick(this.options.hideDelay, 500));
+
+			// hide previous hoverPoints and set new
+			if (hoverPoints) {
+				each(hoverPoints, function (point) {
+					point.setState();
+				});
+			}
+
+			this.chart.hoverPoints = null;
+		}
+	},
+
+	/**
+	 * Hide the crosshairs
+	 */
+	hideCrosshairs: function () {
+		each(this.crosshairs, function (crosshair) {
+			if (crosshair) {
+				crosshair.hide();
+			}
+		});
+	},
+	
+	/** 
+	 * Extendable method to get the anchor position of the tooltip
+	 * from a point or set of points
+	 */
+	getAnchor: function (points, mouseEvent) {
+		var ret,
+			chart = this.chart,
+			inverted = chart.inverted,
+			plotTop = chart.plotTop,
+			plotX = 0,
+			plotY = 0,
+			yAxis;
+		
+		points = splat(points);
+		
+		// Pie uses a special tooltipPos
+		ret = points[0].tooltipPos;
+		
+		// When tooltip follows mouse, relate the position to the mouse
+		if (this.followPointer && mouseEvent) {
+			if (mouseEvent.chartX === UNDEFINED) {
+				mouseEvent = chart.pointer.normalize(mouseEvent);
+			}
+			ret = [
+				mouseEvent.chartX - chart.plotLeft,
+				mouseEvent.chartY - plotTop
+			];
+		}
+		// When shared, use the average position
+		if (!ret) {
+			each(points, function (point) {
+				yAxis = point.series.yAxis;
+				plotX += point.plotX;
+				plotY += (point.plotLow ? (point.plotLow + point.plotHigh) / 2 : point.plotY) +
+					(!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151
+			});
+			
+			plotX /= points.length;
+			plotY /= points.length;
+			
+			ret = [
+				inverted ? chart.plotWidth - plotY : plotX,
+				this.shared && !inverted && points.length > 1 && mouseEvent ? 
+					mouseEvent.chartY - plotTop : // place shared tooltip next to the mouse (#424)
+					inverted ? chart.plotHeight - plotX : plotY
+			];
+		}
+
+		return map(ret, mathRound);
+	},
+	
+	/**
+	 * Place the tooltip in a chart without spilling over
+	 * and not covering the point it self.
+	 */
+	getPosition: function (boxWidth, boxHeight, point) {
+		
+		// Set up the variables
+		var chart = this.chart,
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop,
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			distance = pick(this.options.distance, 12),
+			pointX = point.plotX,
+			pointY = point.plotY,
+			x = pointX + plotLeft + (chart.inverted ? distance : -boxWidth - distance),
+			y = pointY - boxHeight + plotTop + 15, // 15 means the point is 15 pixels up from the bottom of the tooltip
+			alignedRight;
+	
+		// It is too far to the left, adjust it
+		if (x < 7) {
+			x = plotLeft + mathMax(pointX, 0) + distance;
+		}
+	
+		// Test to see if the tooltip is too far to the right,
+		// if it is, move it back to be inside and then up to not cover the point.
+		if ((x + boxWidth) > (plotLeft + plotWidth)) {
+			x -= (x + boxWidth) - (plotLeft + plotWidth);
+			y = pointY - boxHeight + plotTop - distance;
+			alignedRight = true;
+		}
+	
+		// If it is now above the plot area, align it to the top of the plot area
+		if (y < plotTop + 5) {
+			y = plotTop + 5;
+	
+			// If the tooltip is still covering the point, move it below instead
+			if (alignedRight && pointY >= y && pointY <= (y + boxHeight)) {
+				y = pointY + plotTop + distance; // below
+			}
+		} 
+	
+		// Now if the tooltip is below the chart, move it up. It's better to cover the
+		// point than to disappear outside the chart. #834.
+		if (y + boxHeight > plotTop + plotHeight) {
+			y = mathMax(plotTop, plotTop + plotHeight - boxHeight - distance); // below
+		}
+	
+		return {x: x, y: y};
+	},
+
+	/**
+	 * In case no user defined formatter is given, this will be used. Note that the context
+	 * here is an object holding point, series, x, y etc.
+	 */
+	defaultFormatter: function (tooltip) {
+		var items = this.points || splat(this),
+			series = items[0].series,
+			s;
+
+		// build the header
+		s = [series.tooltipHeaderFormatter(items[0])];
+
+		// build the values
+		each(items, function (item) {
+			series = item.series;
+			s.push((series.tooltipFormatter && series.tooltipFormatter(item)) ||
+				item.point.tooltipFormatter(series.tooltipOptions.pointFormat));
+		});
+
+		// footer
+		s.push(tooltip.options.footerFormat || '');
+
+		return s.join('');
+	},
+
+	/**
+	 * Refresh the tooltip's text and position.
+	 * @param {Object} point
+	 */
+	refresh: function (point, mouseEvent) {
+		var tooltip = this,
+			chart = tooltip.chart,
+			label = tooltip.label,
+			options = tooltip.options,
+			x,
+			y,
+			anchor,
+			textConfig = {},
+			text,
+			pointConfig = [],
+			formatter = options.formatter || tooltip.defaultFormatter,
+			hoverPoints = chart.hoverPoints,
+			borderColor,
+			crosshairsOptions = options.crosshairs,
+			shared = tooltip.shared,
+			currentSeries;
+			
+		clearTimeout(this.hideTimer);
+		
+		// get the reference point coordinates (pie charts use tooltipPos)
+		tooltip.followPointer = splat(point)[0].series.tooltipOptions.followPointer;
+		anchor = tooltip.getAnchor(point, mouseEvent);
+		x = anchor[0];
+		y = anchor[1];
+
+		// shared tooltip, array is sent over
+		if (shared && !(point.series && point.series.noSharedTooltip)) {
+			
+			// hide previous hoverPoints and set new
+			
+			chart.hoverPoints = point;
+			if (hoverPoints) {
+				each(hoverPoints, function (point) {
+					point.setState();
+				});
+			}
+
+			each(point, function (item) {
+				item.setState(HOVER_STATE);
+
+				pointConfig.push(item.getLabelConfig());
+			});
+
+			textConfig = {
+				x: point[0].category,
+				y: point[0].y
+			};
+			textConfig.points = pointConfig;
+			point = point[0];
+
+		// single point tooltip
+		} else {
+			textConfig = point.getLabelConfig();
+		}
+		text = formatter.call(textConfig, tooltip);
+
+		// register the current series
+		currentSeries = point.series;
+
+		// update the inner HTML
+		if (text === false) {
+			this.hide();
+		} else {
+
+			// show it
+			if (tooltip.isHidden) {
+				stop(label);
+				label.attr('opacity', 1).show();
+			}
+
+			// update text
+			label.attr({
+				text: text
+			});
+
+			// set the stroke color of the box
+			borderColor = options.borderColor || point.color || currentSeries.color || '#606060';
+			label.attr({
+				stroke: borderColor
+			});
+			
+			tooltip.updatePosition({ plotX: x, plotY: y });
+		
+			this.isHidden = false;
+		}
+
+		// crosshairs
+		if (crosshairsOptions) {
+			crosshairsOptions = splat(crosshairsOptions); // [x, y]
+
+			var path,
+				i = crosshairsOptions.length,
+				attribs,
+				axis,
+				val,
+				series;
+
+			while (i--) {
+				series = point.series;
+				axis = series[i ? 'yAxis' : 'xAxis'];
+				if (crosshairsOptions[i] && axis) {
+					val = i ? pick(point.stackY, point.y) : point.x; // #814
+					if (axis.isLog) { // #1671
+						val = log2lin(val);
+					}
+					if (i === 1 && series.modifyValue) { // #1205, #2316
+						val = series.modifyValue(val);
+					}
+
+					path = axis.getPlotLinePath(
+						val,
+						1
+					);
+
+					if (tooltip.crosshairs[i]) {
+						tooltip.crosshairs[i].attr({ d: path, visibility: VISIBLE });
+					} else {
+						attribs = {
+							'stroke-width': crosshairsOptions[i].width || 1,
+							stroke: crosshairsOptions[i].color || '#C0C0C0',
+							zIndex: crosshairsOptions[i].zIndex || 2
+						};
+						if (crosshairsOptions[i].dashStyle) {
+							attribs.dashstyle = crosshairsOptions[i].dashStyle;
+						}
+						tooltip.crosshairs[i] = chart.renderer.path(path)
+							.attr(attribs)
+							.add();
+					}
+				}
+			}
+		}
+		fireEvent(chart, 'tooltipRefresh', {
+				text: text,
+				x: x + chart.plotLeft,
+				y: y + chart.plotTop,
+				borderColor: borderColor
+			});
+	},
+	
+	/**
+	 * Find the new position and perform the move
+	 */
+	updatePosition: function (point) {
+		var chart = this.chart,
+			label = this.label, 
+			pos = (this.options.positioner || this.getPosition).call(
+				this,
+				label.width,
+				label.height,
+				point
+			);
+
+		// do the move
+		this.move(
+			mathRound(pos.x), 
+			mathRound(pos.y), 
+			point.plotX + chart.plotLeft, 
+			point.plotY + chart.plotTop
+		);
+	}
+};
+/**
+ * The mouse tracker object. All methods starting with "on" are primary DOM event handlers. 
+ * Subsequent methods should be named differently from what they are doing.
+ * @param {Object} chart The Chart instance
+ * @param {Object} options The root options object
+ */
+function Pointer(chart, options) {
+	this.init(chart, options);
+}
+
+Pointer.prototype = {
+	/**
+	 * Initialize Pointer
+	 */
+	init: function (chart, options) {
+		
+		var chartOptions = options.chart,
+			chartEvents = chartOptions.events,
+			zoomType = useCanVG ? '' : chartOptions.zoomType,
+			inverted = chart.inverted,
+			zoomX,
+			zoomY;
+
+		// Store references
+		this.options = options;
+		this.chart = chart;
+		
+		// Zoom status
+		this.zoomX = zoomX = /x/.test(zoomType);
+		this.zoomY = zoomY = /y/.test(zoomType);
+		this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);
+		this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);
+
+		// Do we need to handle click on a touch device?
+		this.runChartClick = chartEvents && !!chartEvents.click;
+
+		this.pinchDown = [];
+		this.lastValidTouch = {};
+
+		if (options.tooltip.enabled) {
+			chart.tooltip = new Tooltip(chart, options.tooltip);
+		}
+
+		this.setDOMEvents();
+	}, 
+
+	/**
+	 * Add crossbrowser support for chartX and chartY
+	 * @param {Object} e The event object in standard browsers
+	 */
+	normalize: function (e, chartPosition) {
+		var chartX,
+			chartY,
+			ePos;
+
+		// common IE normalizing
+		e = e || win.event;
+		if (!e.target) {
+			e.target = e.srcElement;
+		}
+
+		// Framework specific normalizing (#1165)
+		e = washMouseEvent(e);
+		
+		// iOS
+		ePos = e.touches ? e.touches.item(0) : e;
+
+		// Get mouse position
+		if (!chartPosition) {
+			this.chartPosition = chartPosition = offset(this.chart.container);
+		}
+
+		// chartX and chartY
+		if (ePos.pageX === UNDEFINED) { // IE < 9. #886.
+			chartX = mathMax(e.x, e.clientX - chartPosition.left); // #2005, #2129: the second case is 
+				// for IE10 quirks mode within framesets
+			chartY = e.y;
+		} else {
+			chartX = ePos.pageX - chartPosition.left;
+			chartY = ePos.pageY - chartPosition.top;
+		}
+
+		return extend(e, {
+			chartX: mathRound(chartX),
+			chartY: mathRound(chartY)
+		});
+	},
+
+	/**
+	 * Get the click position in terms of axis values.
+	 *
+	 * @param {Object} e A pointer event
+	 */
+	getCoordinates: function (e) {
+		var coordinates = {
+				xAxis: [],
+				yAxis: []
+			};
+
+		each(this.chart.axes, function (axis) {
+			coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({
+				axis: axis,
+				value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])
+			});
+		});
+		return coordinates;
+	},
+	
+	/**
+	 * Return the index in the tooltipPoints array, corresponding to pixel position in 
+	 * the plot area.
+	 */
+	getIndex: function (e) {
+		var chart = this.chart;
+		return chart.inverted ? 
+			chart.plotHeight + chart.plotTop - e.chartY : 
+			e.chartX - chart.plotLeft;
+	},
+
+	/**
+	 * With line type charts with a single tracker, get the point closest to the mouse.
+	 * Run Point.onMouseOver and display tooltip for the point or points.
+	 */
+	runPointActions: function (e) {
+		var pointer = this,
+			chart = pointer.chart,
+			series = chart.series,
+			tooltip = chart.tooltip,
+			point,
+			points,
+			hoverPoint = chart.hoverPoint,
+			hoverSeries = chart.hoverSeries,
+			i,
+			j,
+			distance = chart.chartWidth,
+			index = pointer.getIndex(e),
+			anchor;
+
+		// shared tooltip
+		if (tooltip && pointer.options.tooltip.shared && !(hoverSeries && hoverSeries.noSharedTooltip)) {
+			points = [];
+
+			// loop over all series and find the ones with points closest to the mouse
+			i = series.length;
+			for (j = 0; j < i; j++) {
+				if (series[j].visible &&
+						series[j].options.enableMouseTracking !== false &&
+						!series[j].noSharedTooltip && series[j].tooltipPoints.length) {
+					point = series[j].tooltipPoints[index];
+					if (point && point.series) { // not a dummy point, #1544
+						point._dist = mathAbs(index - point.clientX);
+						distance = mathMin(distance, point._dist);
+						points.push(point);
+					}
+				}
+			}
+			// remove furthest points
+			i = points.length;
+			while (i--) {
+				if (points[i]._dist > distance) {
+					points.splice(i, 1);
+				}
+			}
+			// refresh the tooltip if necessary
+			if (points.length && (points[0].clientX !== pointer.hoverX)) {
+				tooltip.refresh(points, e);
+				pointer.hoverX = points[0].clientX;
+			}
+		}
+
+		// separate tooltip and general mouse events
+		if (hoverSeries && hoverSeries.tracker) { // only use for line-type series with common tracker
+
+			// get the point
+			point = hoverSeries.tooltipPoints[index];
+
+			// a new point is hovered, refresh the tooltip
+			if (point && point !== hoverPoint) {
+
+				// trigger the events
+				point.onMouseOver(e);
+
+			}
+			
+		} else if (tooltip && tooltip.followPointer && !tooltip.isHidden) {
+			anchor = tooltip.getAnchor([{}], e);
+			tooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });
+		}
+	},
+
+
+
+	/**
+	 * Reset the tracking by hiding the tooltip, the hover series state and the hover point
+	 * 
+	 * @param allowMove {Boolean} Instead of destroying the tooltip altogether, allow moving it if possible
+	 */
+	reset: function (allowMove) {
+		var pointer = this,
+			chart = pointer.chart,
+			hoverSeries = chart.hoverSeries,
+			hoverPoint = chart.hoverPoint,
+			tooltip = chart.tooltip,
+			tooltipPoints = tooltip && tooltip.shared ? chart.hoverPoints : hoverPoint;
+			
+		// Narrow in allowMove
+		allowMove = allowMove && tooltip && tooltipPoints;
+			
+		// Check if the points have moved outside the plot area, #1003
+		if (allowMove && splat(tooltipPoints)[0].plotX === UNDEFINED) {
+			allowMove = false;
+		}	
+
+		// Just move the tooltip, #349
+		if (allowMove) {
+			tooltip.refresh(tooltipPoints);
+
+		// Full reset
+		} else {
+
+			if (hoverPoint) {
+				hoverPoint.onMouseOut();
+			}
+
+			if (hoverSeries) {
+				hoverSeries.onMouseOut();
+			}
+
+			if (tooltip) {
+				tooltip.hide();
+				tooltip.hideCrosshairs();
+			}
+
+			pointer.hoverX = null;
+
+		}
+	},
+
+	/**
+	 * Scale series groups to a certain scale and translation
+	 */
+	scaleGroups: function (attribs, clip) {
+
+		var chart = this.chart,
+			seriesAttribs;
+
+		// Scale each series
+		each(chart.series, function (series) {
+			seriesAttribs = attribs || series.getPlotBox(); // #1701
+			if (series.xAxis && series.xAxis.zoomEnabled) {
+				series.group.attr(seriesAttribs);
+				if (series.markerGroup) {
+					series.markerGroup.attr(seriesAttribs);
+					series.markerGroup.clip(clip ? chart.clipRect : null);
+				}
+				if (series.dataLabelsGroup) {
+					series.dataLabelsGroup.attr(seriesAttribs);
+				}
+			}
+		});
+		
+		// Clip
+		chart.clipRect.attr(clip || chart.clipBox);
+	},
+
+	/**
+	 * Run translation operations for each direction (horizontal and vertical) independently
+	 */
+	pinchTranslateDirection: function (horiz, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {
+		var chart = this.chart,
+			xy = horiz ? 'x' : 'y',
+			XY = horiz ? 'X' : 'Y',
+			sChartXY = 'chart' + XY,
+			wh = horiz ? 'width' : 'height',
+			plotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')],
+			selectionWH,
+			selectionXY,
+			clipXY,
+			scale = 1,
+			inverted = chart.inverted,
+			bounds = chart.bounds[horiz ? 'h' : 'v'],
+			singleTouch = pinchDown.length === 1,
+			touch0Start = pinchDown[0][sChartXY],
+			touch0Now = touches[0][sChartXY],
+			touch1Start = !singleTouch && pinchDown[1][sChartXY],
+			touch1Now = !singleTouch && touches[1][sChartXY],
+			outOfBounds,
+			transformScale,
+			scaleKey,
+			setScale = function () {
+				if (!singleTouch && mathAbs(touch0Start - touch1Start) > 20) { // Don't zoom if fingers are too close on this axis
+					scale = mathAbs(touch0Now - touch1Now) / mathAbs(touch0Start - touch1Start);	
+				}
+				
+				clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;
+				selectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;
+			};
+
+		// Set the scale, first pass
+		setScale();
+
+		selectionXY = clipXY; // the clip position (x or y) is altered if out of bounds, the selection position is not
+
+		// Out of bounds
+		if (selectionXY < bounds.min) {
+			selectionXY = bounds.min;
+			outOfBounds = true;
+		} else if (selectionXY + selectionWH > bounds.max) {
+			selectionXY = bounds.max - selectionWH;
+			outOfBounds = true;
+		}
+		
+		// Is the chart dragged off its bounds, determined by dataMin and dataMax?
+		if (outOfBounds) {
+
+			// Modify the touchNow position in order to create an elastic drag movement. This indicates
+			// to the user that the chart is responsive but can't be dragged further.
+			touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);
+			if (!singleTouch) {
+				touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);
+			}
+
+			// Set the scale, second pass to adapt to the modified touchNow positions
+			setScale();
+
+		} else {
+			lastValidTouch[xy] = [touch0Now, touch1Now];
+		}
+
+		
+		// Set geometry for clipping, selection and transformation
+		if (!inverted) { // TODO: implement clipping for inverted charts
+			clip[xy] = clipXY - plotLeftTop;
+			clip[wh] = selectionWH;
+		}
+		scaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;
+		transformScale = inverted ? 1 / scale : scale;
+
+		selectionMarker[wh] = selectionWH;
+		selectionMarker[xy] = selectionXY;
+		transform[scaleKey] = scale;
+		transform['translate' + XY] = (transformScale * plotLeftTop) + (touch0Now - (transformScale * touch0Start));
+	},
+	
+	/**
+	 * Handle touch events with two touches
+	 */
+	pinch: function (e) {
+
+		var self = this,
+			chart = self.chart,
+			pinchDown = self.pinchDown,
+			followTouchMove = chart.tooltip && chart.tooltip.options.followTouchMove,
+			touches = e.touches,
+			touchesLength = touches.length,
+			lastValidTouch = self.lastValidTouch,
+			zoomHor = self.zoomHor || self.pinchHor,
+			zoomVert = self.zoomVert || self.pinchVert,
+			hasZoom = zoomHor || zoomVert,
+			selectionMarker = self.selectionMarker,
+			transform = {},
+			fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, PREFIX + 'tracker') && 
+				chart.runTrackerClick) || chart.runChartClick),
+			clip = {};
+
+		// On touch devices, only proceed to trigger click if a handler is defined
+		if ((hasZoom || followTouchMove) && !fireClickEvent) {
+			e.preventDefault();
+		}
+		
+		// Normalize each touch
+		map(touches, function (e) {
+			return self.normalize(e);
+		});
+			
+		// Register the touch start position
+		if (e.type === 'touchstart') {
+			each(touches, function (e, i) {
+				pinchDown[i] = { chartX: e.chartX, chartY: e.chartY };
+			});
+			lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];
+			lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];
+
+			// Identify the data bounds in pixels
+			each(chart.axes, function (axis) {
+				if (axis.zoomEnabled) {
+					var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],
+						minPixelPadding = axis.minPixelPadding,
+						min = axis.toPixels(axis.dataMin),
+						max = axis.toPixels(axis.dataMax),
+						absMin = mathMin(min, max),
+						absMax = mathMax(min, max);
+
+					// Store the bounds for use in the touchmove handler
+					bounds.min = mathMin(axis.pos, absMin - minPixelPadding);
+					bounds.max = mathMax(axis.pos + axis.len, absMax + minPixelPadding);
+				}
+			});
+		
+		// Event type is touchmove, handle panning and pinching
+		} else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first
+			
+
+			// Set the marker
+			if (!selectionMarker) {
+				self.selectionMarker = selectionMarker = extend({
+					destroy: noop
+				}, chart.plotBox);
+			}
+
+			
+
+			if (zoomHor) {
+				self.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+			}
+			if (zoomVert) {
+				self.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+			}
+
+			self.hasPinched = hasZoom;
+
+			// Scale and translate the groups to provide visual feedback during pinching
+			self.scaleGroups(transform, clip);
+			
+			// Optionally move the tooltip on touchmove
+			if (!hasZoom && followTouchMove && touchesLength === 1) {
+				this.runPointActions(self.normalize(e));
+			}
+		}
+	},
+
+	/**
+	 * Start a drag operation
+	 */
+	dragStart: function (e) {
+		var chart = this.chart;
+
+		// Record the start position
+		chart.mouseIsDown = e.type;
+		chart.cancelClick = false;
+		chart.mouseDownX = this.mouseDownX = e.chartX;
+		chart.mouseDownY = this.mouseDownY = e.chartY;
+	},
+
+	/**
+	 * Perform a drag operation in response to a mousemove event while the mouse is down
+	 */
+	drag: function (e) {
+
+		var chart = this.chart,
+			chartOptions = chart.options.chart,
+			chartX = e.chartX,
+			chartY = e.chartY,
+			zoomHor = this.zoomHor,
+			zoomVert = this.zoomVert,
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop,
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			clickedInside,
+			size,
+			mouseDownX = this.mouseDownX,
+			mouseDownY = this.mouseDownY;
+
+		// If the mouse is outside the plot area, adjust to cooordinates
+		// inside to prevent the selection marker from going outside
+		if (chartX < plotLeft) {
+			chartX = plotLeft;
+		} else if (chartX > plotLeft + plotWidth) {
+			chartX = plotLeft + plotWidth;
+		}
+
+		if (chartY < plotTop) {
+			chartY = plotTop;
+		} else if (chartY > plotTop + plotHeight) {
+			chartY = plotTop + plotHeight;
+		}
+		
+		// determine if the mouse has moved more than 10px
+		this.hasDragged = Math.sqrt(
+			Math.pow(mouseDownX - chartX, 2) +
+			Math.pow(mouseDownY - chartY, 2)
+		);
+		if (this.hasDragged > 10) {
+			clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);
+
+			// make a selection
+			if (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside) {
+				if (!this.selectionMarker) {
+					this.selectionMarker = chart.renderer.rect(
+						plotLeft,
+						plotTop,
+						zoomHor ? 1 : plotWidth,
+						zoomVert ? 1 : plotHeight,
+						0
+					)
+					.attr({
+						fill: chartOptions.selectionMarkerFill || 'rgba(69,114,167,0.25)',
+						zIndex: 7
+					})
+					.add();
+				}
+			}
+
+			// adjust the width of the selection marker
+			if (this.selectionMarker && zoomHor) {
+				size = chartX - mouseDownX;
+				this.selectionMarker.attr({
+					width: mathAbs(size),
+					x: (size > 0 ? 0 : size) + mouseDownX
+				});
+			}
+			// adjust the height of the selection marker
+			if (this.selectionMarker && zoomVert) {
+				size = chartY - mouseDownY;
+				this.selectionMarker.attr({
+					height: mathAbs(size),
+					y: (size > 0 ? 0 : size) + mouseDownY
+				});
+			}
+
+			// panning
+			if (clickedInside && !this.selectionMarker && chartOptions.panning) {
+				chart.pan(e, chartOptions.panning);
+			}
+		}
+	},
+
+	/**
+	 * On mouse up or touch end across the entire document, drop the selection.
+	 */
+	drop: function (e) {
+		var chart = this.chart,
+			hasPinched = this.hasPinched;
+
+		if (this.selectionMarker) {
+			var selectionData = {
+					xAxis: [],
+					yAxis: [],
+					originalEvent: e.originalEvent || e
+				},
+				selectionBox = this.selectionMarker,
+				selectionLeft = selectionBox.x,
+				selectionTop = selectionBox.y,
+				runZoom;
+			// a selection has been made
+			if (this.hasDragged || hasPinched) {
+
+				// record each axis' min and max
+				each(chart.axes, function (axis) {
+					if (axis.zoomEnabled) {
+						var horiz = axis.horiz,
+							selectionMin = axis.toValue((horiz ? selectionLeft : selectionTop)),
+							selectionMax = axis.toValue((horiz ? selectionLeft + selectionBox.width : selectionTop + selectionBox.height));
+
+						if (!isNaN(selectionMin) && !isNaN(selectionMax)) { // #859
+							selectionData[axis.xOrY + 'Axis'].push({
+								axis: axis,
+								min: mathMin(selectionMin, selectionMax), // for reversed axes,
+								max: mathMax(selectionMin, selectionMax)
+							});
+							runZoom = true;
+						}
+					}
+				});
+				if (runZoom) {
+					fireEvent(chart, 'selection', selectionData, function (args) { 
+						chart.zoom(extend(args, hasPinched ? { animation: false } : null)); 
+					});
+				}
+
+			}
+			this.selectionMarker = this.selectionMarker.destroy();
+
+			// Reset scaling preview
+			if (hasPinched) {
+				this.scaleGroups();
+			}
+		}
+
+		// Reset all
+		if (chart) { // it may be destroyed on mouse up - #877
+			css(chart.container, { cursor: chart._cursor });
+			chart.cancelClick = this.hasDragged > 10; // #370
+			chart.mouseIsDown = this.hasDragged = this.hasPinched = false;
+			this.pinchDown = [];
+		}
+	},
+
+	onContainerMouseDown: function (e) {
+
+		e = this.normalize(e);
+
+		// issue #295, dragging not always working in Firefox
+		if (e.preventDefault) {
+			e.preventDefault();
+		}
+		
+		this.dragStart(e);
+	},
+
+	
+
+	onDocumentMouseUp: function (e) {
+		this.drop(e);
+	},
+
+	/**
+	 * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.
+	 * Issue #149 workaround. The mouseleave event does not always fire. 
+	 */
+	onDocumentMouseMove: function (e) {
+		var chart = this.chart,
+			chartPosition = this.chartPosition,
+			hoverSeries = chart.hoverSeries;
+
+		e = this.normalize(e, chartPosition);
+
+		// If we're outside, hide the tooltip
+		if (chartPosition && hoverSeries && !this.inClass(e.target, 'highcharts-tracker') &&
+				!chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+			this.reset();
+		}
+	},
+
+	/**
+	 * When mouse leaves the container, hide the tooltip.
+	 */
+	onContainerMouseLeave: function () {
+		this.reset();
+		this.chartPosition = null; // also reset the chart position, used in #149 fix
+	},
+
+	// The mousemove, touchmove and touchstart event handler
+	onContainerMouseMove: function (e) {
+
+		var chart = this.chart;
+
+		// normalize
+		e = this.normalize(e);
+
+		// #295
+		e.returnValue = false;
+		
+		
+		if (chart.mouseIsDown === 'mousedown') {
+			this.drag(e);
+		} 
+		
+		// Show the tooltip and run mouse over events (#977)
+		if ((this.inClass(e.target, 'highcharts-tracker') || 
+				chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) && !chart.openMenu) {
+			this.runPointActions(e);
+		}
+	},
+
+	/**
+	 * Utility to detect whether an element has, or has a parent with, a specific
+	 * class name. Used on detection of tracker objects and on deciding whether
+	 * hovering the tooltip should cause the active series to mouse out.
+	 */
+	inClass: function (element, className) {
+		var elemClassName;
+		while (element) {
+			elemClassName = attr(element, 'class');
+			if (elemClassName) {
+				if (elemClassName.indexOf(className) !== -1) {
+					return true;
+				} else if (elemClassName.indexOf(PREFIX + 'container') !== -1) {
+					return false;
+				}
+			}
+			element = element.parentNode;
+		}		
+	},
+
+	onTrackerMouseOut: function (e) {
+		var series = this.chart.hoverSeries;
+		if (series && !series.options.stickyTracking && !this.inClass(e.toElement || e.relatedTarget, PREFIX + 'tooltip')) {
+			series.onMouseOut();
+		}
+	},
+
+	onContainerClick: function (e) {
+		var chart = this.chart,
+			hoverPoint = chart.hoverPoint, 
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop,
+			inverted = chart.inverted,
+			chartPosition,
+			plotX,
+			plotY;
+		
+		e = this.normalize(e);
+		e.cancelBubble = true; // IE specific
+
+		if (!chart.cancelClick) {
+			
+			// On tracker click, fire the series and point events. #783, #1583
+			if (hoverPoint && this.inClass(e.target, PREFIX + 'tracker')) {
+				chartPosition = this.chartPosition;
+				plotX = hoverPoint.plotX;
+				plotY = hoverPoint.plotY;
+
+				// add page position info
+				extend(hoverPoint, {
+					pageX: chartPosition.left + plotLeft +
+						(inverted ? chart.plotWidth - plotY : plotX),
+					pageY: chartPosition.top + plotTop +
+						(inverted ? chart.plotHeight - plotX : plotY)
+				});
+			
+				// the series click event
+				fireEvent(hoverPoint.series, 'click', extend(e, {
+					point: hoverPoint
+				}));
+
+				// the point click event
+				if (chart.hoverPoint) { // it may be destroyed (#1844)
+					hoverPoint.firePointEvent('click', e);
+				}
+
+			// When clicking outside a tracker, fire a chart event
+			} else {
+				extend(e, this.getCoordinates(e));
+
+				// fire a click event in the chart
+				if (chart.isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) {
+					fireEvent(chart, 'click', e);
+				}
+			}
+
+
+		}
+	},
+
+	onContainerTouchStart: function (e) {
+		var chart = this.chart;
+
+		if (e.touches.length === 1) {
+
+			e = this.normalize(e);
+
+			if (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+
+				// Prevent the click pseudo event from firing unless it is set in the options
+				/*if (!chart.runChartClick) {
+					e.preventDefault();
+				}*/
+			
+				// Run mouse events and display tooltip etc
+				this.runPointActions(e);
+
+				this.pinch(e);
+
+			} else {
+				// Hide the tooltip on touching outside the plot area (#1203)
+				this.reset();
+			}
+
+		} else if (e.touches.length === 2) {
+			this.pinch(e);
+		}		
+	},
+
+	onContainerTouchMove: function (e) {
+		if (e.touches.length === 1 || e.touches.length === 2) {
+			this.pinch(e);
+		}
+	},
+
+	onDocumentTouchEnd: function (e) {
+		this.drop(e);
+	},
+
+	/**
+	 * Set the JS DOM events on the container and document. This method should contain
+	 * a one-to-one assignment between methods and their handlers. Any advanced logic should
+	 * be moved to the handler reflecting the event's name.
+	 */
+	setDOMEvents: function () {
+
+		var pointer = this,
+			container = pointer.chart.container,
+			events;
+
+		this._events = events = [
+			[container, 'onmousedown', 'onContainerMouseDown'],
+			[container, 'onmousemove', 'onContainerMouseMove'],
+			[container, 'onclick', 'onContainerClick'],
+			[container, 'mouseleave', 'onContainerMouseLeave'],
+			[doc, 'mousemove', 'onDocumentMouseMove'],
+			[doc, 'mouseup', 'onDocumentMouseUp']
+		];
+
+		if (hasTouch) {
+			events.push(
+				[container, 'ontouchstart', 'onContainerTouchStart'],
+				[container, 'ontouchmove', 'onContainerTouchMove'],
+				[doc, 'touchend', 'onDocumentTouchEnd']
+			);
+		}
+
+		each(events, function (eventConfig) {
+
+			// First, create the callback function that in turn calls the method on Pointer
+			pointer['_' + eventConfig[2]] = function (e) {
+				pointer[eventConfig[2]](e);
+			};
+
+			// Now attach the function, either as a direct property or through addEvent
+			if (eventConfig[1].indexOf('on') === 0) {
+				eventConfig[0][eventConfig[1]] = pointer['_' + eventConfig[2]];
+			} else {
+				addEvent(eventConfig[0], eventConfig[1], pointer['_' + eventConfig[2]]);
+			}
+		});
+
+		
+	},
+
+	/**
+	 * Destroys the Pointer object and disconnects DOM events.
+	 */
+	destroy: function () {
+		var pointer = this;
+
+		// Release all DOM events
+		each(pointer._events, function (eventConfig) {	
+			if (eventConfig[1].indexOf('on') === 0) {
+				eventConfig[0][eventConfig[1]] = null; // delete breaks oldIE
+			} else {		
+				removeEvent(eventConfig[0], eventConfig[1], pointer['_' + eventConfig[2]]);
+			}
+		});
+		delete pointer._events;
+
+		// memory and CPU leak
+		clearInterval(pointer.tooltipTimeout);
+	}
+};
+/**
+ * The overview of the chart's series
+ */
+function Legend(chart, options) {
+	this.init(chart, options);
+}
+
+Legend.prototype = {
+	
+	/**
+	 * Initialize the legend
+	 */
+	init: function (chart, options) {
+		
+		var legend = this,
+			itemStyle = options.itemStyle,
+			padding = pick(options.padding, 8),
+			itemMarginTop = options.itemMarginTop || 0;
+	
+		this.options = options;
+
+		if (!options.enabled) {
+			return;
+		}
+	
+		legend.baseline = pInt(itemStyle.fontSize) + 3 + itemMarginTop; // used in Series prototype
+		legend.itemStyle = itemStyle;
+		legend.itemHiddenStyle = merge(itemStyle, options.itemHiddenStyle);
+		legend.itemMarginTop = itemMarginTop;
+		legend.padding = padding;
+		legend.initialItemX = padding;
+		legend.initialItemY = padding - 5; // 5 is the number of pixels above the text
+		legend.maxItemWidth = 0;
+		legend.chart = chart;
+		legend.itemHeight = 0;
+		legend.lastLineHeight = 0;
+
+		// Render it
+		legend.render();
+
+		// move checkboxes
+		addEvent(legend.chart, 'endResize', function () { 
+			legend.positionCheckboxes();
+		});
+
+	},
+
+	/**
+	 * Set the colors for the legend item
+	 * @param {Object} item A Series or Point instance
+	 * @param {Object} visible Dimmed or colored
+	 */
+	colorizeItem: function (item, visible) {
+		var legend = this,
+			options = legend.options,
+			legendItem = item.legendItem,
+			legendLine = item.legendLine,
+			legendSymbol = item.legendSymbol,
+			hiddenColor = legend.itemHiddenStyle.color,
+			textColor = visible ? options.itemStyle.color : hiddenColor,
+			symbolColor = visible ? item.color : hiddenColor,
+			markerOptions = item.options && item.options.marker,
+			symbolAttr = {
+				stroke: symbolColor,
+				fill: symbolColor
+			},
+			key,
+			val;
+		
+		if (legendItem) {
+			legendItem.css({ fill: textColor, color: textColor }); // color for #1553, oldIE
+		}
+		if (legendLine) {
+			legendLine.attr({ stroke: symbolColor });
+		}
+		
+		if (legendSymbol) {
+			
+			// Apply marker options
+			if (markerOptions && legendSymbol.isMarker) { // #585
+				markerOptions = item.convertAttribs(markerOptions);
+				for (key in markerOptions) {
+					val = markerOptions[key];
+					if (val !== UNDEFINED) {
+						symbolAttr[key] = val;
+					}
+				}
+			}
+
+			legendSymbol.attr(symbolAttr);
+		}
+	},
+
+	/**
+	 * Position the legend item
+	 * @param {Object} item A Series or Point instance
+	 */
+	positionItem: function (item) {
+		var legend = this,
+			options = legend.options,
+			symbolPadding = options.symbolPadding,
+			ltr = !options.rtl,
+			legendItemPos = item._legendItemPos,
+			itemX = legendItemPos[0],
+			itemY = legendItemPos[1],
+			checkbox = item.checkbox;
+
+		if (item.legendGroup) {
+			item.legendGroup.translate(
+				ltr ? itemX : legend.legendWidth - itemX - 2 * symbolPadding - 4,
+				itemY
+			);
+		}
+
+		if (checkbox) {
+			checkbox.x = itemX;
+			checkbox.y = itemY;
+		}
+	},
+
+	/**
+	 * Destroy a single legend item
+	 * @param {Object} item The series or point
+	 */
+	destroyItem: function (item) {
+		var checkbox = item.checkbox;
+
+		// destroy SVG elements
+		each(['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'], function (key) {
+			if (item[key]) {
+				item[key] = item[key].destroy();
+			}
+		});
+
+		if (checkbox) {
+			discardElement(item.checkbox);
+		}
+	},
+
+	/**
+	 * Destroys the legend.
+	 */
+	destroy: function () {
+		var legend = this,
+			legendGroup = legend.group,
+			box = legend.box;
+
+		if (box) {
+			legend.box = box.destroy();
+		}
+
+		if (legendGroup) {
+			legend.group = legendGroup.destroy();
+		}
+	},
+
+	/**
+	 * Position the checkboxes after the width is determined
+	 */
+	positionCheckboxes: function (scrollOffset) {
+		var alignAttr = this.group.alignAttr,
+			translateY,
+			clipHeight = this.clipHeight || this.legendHeight;
+
+		if (alignAttr) {
+			translateY = alignAttr.translateY;
+			each(this.allItems, function (item) {
+				var checkbox = item.checkbox,
+					top;
+				
+				if (checkbox) {
+					top = (translateY + checkbox.y + (scrollOffset || 0) + 3);
+					css(checkbox, {
+						left: (alignAttr.translateX + item.legendItemWidth + checkbox.x - 20) + PX,
+						top: top + PX,
+						display: top > translateY - 6 && top < translateY + clipHeight - 6 ? '' : NONE
+					});
+				}
+			});
+		}
+	},
+	
+	/**
+	 * Render the legend title on top of the legend
+	 */
+	renderTitle: function () {
+		var options = this.options,
+			padding = this.padding,
+			titleOptions = options.title,
+			titleHeight = 0,
+			bBox;
+		
+		if (titleOptions.text) {
+			if (!this.title) {
+				this.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, null, null, null, null, null, 'legend-title')
+					.attr({ zIndex: 1 })
+					.css(titleOptions.style)
+					.add(this.group);
+			}
+			bBox = this.title.getBBox();
+			titleHeight = bBox.height;
+			this.offsetWidth = bBox.width; // #1717
+			this.contentGroup.attr({ translateY: titleHeight });
+		}
+		this.titleHeight = titleHeight;
+	},
+
+	/**
+	 * Render a single specific legend item
+	 * @param {Object} item A series or point
+	 */
+	renderItem: function (item) {
+		var legend = this,
+			chart = legend.chart,
+			renderer = chart.renderer,
+			options = legend.options,
+			horizontal = options.layout === 'horizontal',
+			symbolWidth = options.symbolWidth,
+			symbolPadding = options.symbolPadding,
+			itemStyle = legend.itemStyle,
+			itemHiddenStyle = legend.itemHiddenStyle,
+			padding = legend.padding,
+			itemDistance = horizontal ? pick(options.itemDistance, 8) : 0,
+			ltr = !options.rtl,
+			itemHeight,
+			widthOption = options.width,
+			itemMarginBottom = options.itemMarginBottom || 0,
+			itemMarginTop = legend.itemMarginTop,
+			initialItemX = legend.initialItemX,
+			bBox,
+			itemWidth,
+			li = item.legendItem,
+			series = item.series || item,
+			itemOptions = series.options,
+			showCheckbox = itemOptions.showCheckbox,
+			useHTML = options.useHTML;
+
+		if (!li) { // generate it once, later move it
+
+			// Generate the group box
+			// A group to hold the symbol and text. Text is to be appended in Legend class.
+			item.legendGroup = renderer.g('legend-item')
+				.attr({ zIndex: 1 })
+				.add(legend.scrollGroup);
+
+			// Draw the legend symbol inside the group box
+			series.drawLegendSymbol(legend, item);
+
+			// Generate the list item text and add it to the group
+			item.legendItem = li = renderer.text(
+					options.labelFormat ? format(options.labelFormat, item) : options.labelFormatter.call(item),
+					ltr ? symbolWidth + symbolPadding : -symbolPadding,
+					legend.baseline,
+					useHTML
+				)
+				.css(merge(item.visible ? itemStyle : itemHiddenStyle)) // merge to prevent modifying original (#1021)
+				.attr({
+					align: ltr ? 'left' : 'right',
+					zIndex: 2
+				})
+				.add(item.legendGroup);
+
+			// Set the events on the item group, or in case of useHTML, the item itself (#1249)
+			(useHTML ? li : item.legendGroup).on('mouseover', function () {
+					item.setState(HOVER_STATE);
+					li.css(legend.options.itemHoverStyle);
+				})
+				.on('mouseout', function () {
+					li.css(item.visible ? itemStyle : itemHiddenStyle);
+					item.setState();
+				})
+				.on('click', function (event) {
+					var strLegendItemClick = 'legendItemClick',
+						fnLegendItemClick = function () {
+							item.setVisible();
+						};
+						
+					// Pass over the click/touch event. #4.
+					event = {
+						browserEvent: event
+					};
+
+					// click the name or symbol
+					if (item.firePointEvent) { // point
+						item.firePointEvent(strLegendItemClick, event, fnLegendItemClick);
+					} else {
+						fireEvent(item, strLegendItemClick, event, fnLegendItemClick);
+					}
+				});
+
+			// Colorize the items
+			legend.colorizeItem(item, item.visible);
+
+			// add the HTML checkbox on top
+			if (itemOptions && showCheckbox) {
+				item.checkbox = createElement('input', {
+					type: 'checkbox',
+					checked: item.selected,
+					defaultChecked: item.selected // required by IE7
+				}, options.itemCheckboxStyle, chart.container);
+
+				addEvent(item.checkbox, 'click', function (event) {
+					var target = event.target;
+					fireEvent(item, 'checkboxClick', {
+							checked: target.checked
+						},
+						function () {
+							item.select();
+						}
+					);
+				});
+			}
+		}
+
+		// calculate the positions for the next line
+		bBox = li.getBBox();
+
+		itemWidth = item.legendItemWidth =
+			options.itemWidth || symbolWidth + symbolPadding + bBox.width + itemDistance +
+			(showCheckbox ? 20 : 0);
+		legend.itemHeight = itemHeight = bBox.height;
+
+		// if the item exceeds the width, start a new line
+		if (horizontal && legend.itemX - initialItemX + itemWidth >
+				(widthOption || (chart.chartWidth - 2 * padding - initialItemX))) {
+			legend.itemX = initialItemX;
+			legend.itemY += itemMarginTop + legend.lastLineHeight + itemMarginBottom;
+			legend.lastLineHeight = 0; // reset for next line
+		}
+
+		// If the item exceeds the height, start a new column
+		/*if (!horizontal && legend.itemY + options.y + itemHeight > chart.chartHeight - spacingTop - spacingBottom) {
+			legend.itemY = legend.initialItemY;
+			legend.itemX += legend.maxItemWidth;
+			legend.maxItemWidth = 0;
+		}*/
+
+		// Set the edge positions
+		legend.maxItemWidth = mathMax(legend.maxItemWidth, itemWidth);
+		legend.lastItemY = itemMarginTop + legend.itemY + itemMarginBottom;
+		legend.lastLineHeight = mathMax(itemHeight, legend.lastLineHeight); // #915
+
+		// cache the position of the newly generated or reordered items
+		item._legendItemPos = [legend.itemX, legend.itemY];
+
+		// advance
+		if (horizontal) {
+			legend.itemX += itemWidth;
+
+		} else {
+			legend.itemY += itemMarginTop + itemHeight + itemMarginBottom;
+			legend.lastLineHeight = itemHeight;
+		}
+
+		// the width of the widest item
+		legend.offsetWidth = widthOption || mathMax(
+			(horizontal ? legend.itemX - initialItemX - itemDistance : itemWidth) + padding,
+			legend.offsetWidth
+		);
+	},
+
+	/**
+	 * Render the legend. This method can be called both before and after
+	 * chart.render. If called after, it will only rearrange items instead
+	 * of creating new ones.
+	 */
+	render: function () {
+		var legend = this,
+			chart = legend.chart,
+			renderer = chart.renderer,
+			legendGroup = legend.group,
+			allItems,
+			display,
+			legendWidth,
+			legendHeight,
+			box = legend.box,
+			options = legend.options,
+			padding = legend.padding,
+			legendBorderWidth = options.borderWidth,
+			legendBackgroundColor = options.backgroundColor;
+
+		legend.itemX = legend.initialItemX;
+		legend.itemY = legend.initialItemY;
+		legend.offsetWidth = 0;
+		legend.lastItemY = 0;
+
+		if (!legendGroup) {
+			legend.group = legendGroup = renderer.g('legend')
+				.attr({ zIndex: 7 }) 
+				.add();
+			legend.contentGroup = renderer.g()
+				.attr({ zIndex: 1 }) // above background
+				.add(legendGroup);
+			legend.scrollGroup = renderer.g()
+				.add(legend.contentGroup);
+		}
+		
+		legend.renderTitle();
+
+		// add each series or point
+		allItems = [];
+		each(chart.series, function (serie) {
+			var seriesOptions = serie.options;
+
+			if (!seriesOptions.showInLegend || defined(seriesOptions.linkedTo)) {
+				return;
+			}
+
+			// use points or series for the legend item depending on legendType
+			allItems = allItems.concat(
+					serie.legendItems ||
+					(seriesOptions.legendType === 'point' ?
+							serie.data :
+							serie)
+			);
+		});
+
+		// sort by legendIndex
+		stableSort(allItems, function (a, b) {
+			return ((a.options && a.options.legendIndex) || 0) - ((b.options && b.options.legendIndex) || 0);
+		});
+
+		// reversed legend
+		if (options.reversed) {
+			allItems.reverse();
+		}
+
+		legend.allItems = allItems;
+		legend.display = display = !!allItems.length;
+
+		// render the items
+		each(allItems, function (item) {
+			legend.renderItem(item); 
+		});
+
+		// Draw the border
+		legendWidth = options.width || legend.offsetWidth;
+		legendHeight = legend.lastItemY + legend.lastLineHeight + legend.titleHeight;
+		
+		
+		legendHeight = legend.handleOverflow(legendHeight);
+
+		if (legendBorderWidth || legendBackgroundColor) {
+			legendWidth += padding;
+			legendHeight += padding;
+
+			if (!box) {
+				legend.box = box = renderer.rect(
+					0,
+					0,
+					legendWidth,
+					legendHeight,
+					options.borderRadius,
+					legendBorderWidth || 0
+				).attr({
+					stroke: options.borderColor,
+					'stroke-width': legendBorderWidth || 0,
+					fill: legendBackgroundColor || NONE
+				})
+				.add(legendGroup)
+				.shadow(options.shadow);
+				box.isNew = true;
+
+			} else if (legendWidth > 0 && legendHeight > 0) {
+				box[box.isNew ? 'attr' : 'animate'](
+					box.crisp(null, null, null, legendWidth, legendHeight)
+				);
+				box.isNew = false;
+			}
+
+			// hide the border if no items
+			box[display ? 'show' : 'hide']();
+		}
+		
+		legend.legendWidth = legendWidth;
+		legend.legendHeight = legendHeight;
+
+		// Now that the legend width and height are established, put the items in the 
+		// final position
+		each(allItems, function (item) {
+			legend.positionItem(item);
+		});
+
+		// 1.x compatibility: positioning based on style
+		/*var props = ['left', 'right', 'top', 'bottom'],
+			prop,
+			i = 4;
+		while (i--) {
+			prop = props[i];
+			if (options.style[prop] && options.style[prop] !== 'auto') {
+				options[i < 2 ? 'align' : 'verticalAlign'] = prop;
+				options[i < 2 ? 'x' : 'y'] = pInt(options.style[prop]) * (i % 2 ? -1 : 1);
+			}
+		}*/
+
+		if (display) {
+			legendGroup.align(extend({
+				width: legendWidth,
+				height: legendHeight
+			}, options), true, 'spacingBox');
+		}
+
+		if (!chart.isResizing) {
+			this.positionCheckboxes();
+		}
+	},
+	
+	/**
+	 * Set up the overflow handling by adding navigation with up and down arrows below the
+	 * legend.
+	 */
+	handleOverflow: function (legendHeight) {
+		var legend = this,
+			chart = this.chart,
+			renderer = chart.renderer,
+			pageCount,
+			options = this.options,
+			optionsY = options.y,
+			alignTop = options.verticalAlign === 'top',
+			spaceHeight = chart.spacingBox.height + (alignTop ? -optionsY : optionsY) - this.padding,
+			maxHeight = options.maxHeight,
+			clipHeight,
+			clipRect = this.clipRect,
+			navOptions = options.navigation,
+			animation = pick(navOptions.animation, true),
+			arrowSize = navOptions.arrowSize || 12,
+			nav = this.nav;
+			
+		// Adjust the height
+		if (options.layout === 'horizontal') {
+			spaceHeight /= 2;
+		}
+		if (maxHeight) {
+			spaceHeight = mathMin(spaceHeight, maxHeight);
+		}
+		
+		// Reset the legend height and adjust the clipping rectangle
+		if (legendHeight > spaceHeight && !options.useHTML) {
+
+			this.clipHeight = clipHeight = spaceHeight - 20 - this.titleHeight;
+			this.pageCount = pageCount = mathCeil(legendHeight / clipHeight);
+			this.currentPage = pick(this.currentPage, 1);
+			this.fullHeight = legendHeight;
+			
+			// Only apply clipping if needed. Clipping causes blurred legend in PDF export (#1787)
+			if (!clipRect) {
+				clipRect = legend.clipRect = renderer.clipRect(0, 0, 9999, 0);
+				legend.contentGroup.clip(clipRect);
+			}
+			clipRect.attr({
+				height: clipHeight
+			});
+			
+			// Add navigation elements
+			if (!nav) {
+				this.nav = nav = renderer.g().attr({ zIndex: 1 }).add(this.group);
+				this.up = renderer.symbol('triangle', 0, 0, arrowSize, arrowSize)
+					.on('click', function () {
+						legend.scroll(-1, animation);
+					})
+					.add(nav);
+				this.pager = renderer.text('', 15, 10)
+					.css(navOptions.style)
+					.add(nav);
+				this.down = renderer.symbol('triangle-down', 0, 0, arrowSize, arrowSize)
+					.on('click', function () {
+						legend.scroll(1, animation);
+					})
+					.add(nav);
+			}
+			
+			// Set initial position
+			legend.scroll(0);
+			
+			legendHeight = spaceHeight;
+			
+		} else if (nav) {
+			clipRect.attr({
+				height: chart.chartHeight
+			});
+			nav.hide();
+			this.scrollGroup.attr({
+				translateY: 1
+			});
+			this.clipHeight = 0; // #1379
+		}
+		
+		return legendHeight;
+	},
+	
+	/**
+	 * Scroll the legend by a number of pages
+	 * @param {Object} scrollBy
+	 * @param {Object} animation
+	 */
+	scroll: function (scrollBy, animation) {
+		var pageCount = this.pageCount,
+			currentPage = this.currentPage + scrollBy,
+			clipHeight = this.clipHeight,
+			navOptions = this.options.navigation,
+			activeColor = navOptions.activeColor,
+			inactiveColor = navOptions.inactiveColor,
+			pager = this.pager,
+			padding = this.padding,
+			scrollOffset;
+		
+		// When resizing while looking at the last page
+		if (currentPage > pageCount) {
+			currentPage = pageCount;
+		}
+		
+		if (currentPage > 0) {
+			
+			if (animation !== UNDEFINED) {
+				setAnimation(animation, this.chart);
+			}
+			
+			this.nav.attr({
+				translateX: padding,
+				translateY: clipHeight + 7 + this.titleHeight,
+				visibility: VISIBLE
+			});
+			this.up.attr({
+					fill: currentPage === 1 ? inactiveColor : activeColor
+				})
+				.css({
+					cursor: currentPage === 1 ? 'default' : 'pointer'
+				});
+			pager.attr({
+				text: currentPage + '/' + this.pageCount
+			});
+			this.down.attr({
+					x: 18 + this.pager.getBBox().width, // adjust to text width
+					fill: currentPage === pageCount ? inactiveColor : activeColor
+				})
+				.css({
+					cursor: currentPage === pageCount ? 'default' : 'pointer'
+				});
+			
+			scrollOffset = -mathMin(clipHeight * (currentPage - 1), this.fullHeight - clipHeight + padding) + 1;
+			this.scrollGroup.animate({
+				translateY: scrollOffset
+			});
+			pager.attr({
+				text: currentPage + '/' + pageCount
+			});
+			
+			
+			this.currentPage = currentPage;
+			this.positionCheckboxes(scrollOffset);
+		}
+			
+	}
+	
+};
+
+// Workaround for #2030, horizontal legend items not displaying in IE11 Preview.
+// TODO: When IE11 is released, check again for this bug, and remove the fix
+// or make a better one.
+if (/Trident.*?11\.0/.test(userAgent)) {
+	wrap(Legend.prototype, 'positionItem', function (proceed, item) {
+		var legend = this;
+		setTimeout(function () {
+			proceed.call(legend, item);
+		});
+	});
+}
+
+/**
+ * The chart class
+ * @param {Object} options
+ * @param {Function} callback Function to run when the chart has loaded
+ */
+function Chart() {
+	this.init.apply(this, arguments);
+}
+
+Chart.prototype = {
+
+	/**
+	 * Initialize the chart
+	 */
+	init: function (userOptions, callback) {
+
+		// Handle regular options
+		var options,
+			seriesOptions = userOptions.series; // skip merging data points to increase performance
+
+		userOptions.series = null;
+		options = merge(defaultOptions, userOptions); // do the merge
+		options.series = userOptions.series = seriesOptions; // set back the series data
+
+		var optionsChart = options.chart;
+		
+		// Create margin & spacing array
+		this.margin = this.splashArray('margin', optionsChart);
+		this.spacing = this.splashArray('spacing', optionsChart);
+
+		var chartEvents = optionsChart.events;
+
+		//this.runChartClick = chartEvents && !!chartEvents.click;
+		this.bounds = { h: {}, v: {} }; // Pixel data bounds for touch zoom
+
+		this.callback = callback;
+		this.isResizing = 0;
+		this.options = options;
+		//chartTitleOptions = UNDEFINED;
+		//chartSubtitleOptions = UNDEFINED;
+
+		this.axes = [];
+		this.series = [];
+		this.hasCartesianSeries = optionsChart.showAxes;
+		//this.axisOffset = UNDEFINED;
+		//this.maxTicks = UNDEFINED; // handle the greatest amount of ticks on grouped axes
+		//this.inverted = UNDEFINED;
+		//this.loadingShown = UNDEFINED;
+		//this.container = UNDEFINED;
+		//this.chartWidth = UNDEFINED;
+		//this.chartHeight = UNDEFINED;
+		//this.marginRight = UNDEFINED;
+		//this.marginBottom = UNDEFINED;
+		//this.containerWidth = UNDEFINED;
+		//this.containerHeight = UNDEFINED;
+		//this.oldChartWidth = UNDEFINED;
+		//this.oldChartHeight = UNDEFINED;
+
+		//this.renderTo = UNDEFINED;
+		//this.renderToClone = UNDEFINED;
+
+		//this.spacingBox = UNDEFINED
+
+		//this.legend = UNDEFINED;
+
+		// Elements
+		//this.chartBackground = UNDEFINED;
+		//this.plotBackground = UNDEFINED;
+		//this.plotBGImage = UNDEFINED;
+		//this.plotBorder = UNDEFINED;
+		//this.loadingDiv = UNDEFINED;
+		//this.loadingSpan = UNDEFINED;
+
+		var chart = this,
+			eventType;
+
+		// Add the chart to the global lookup
+		chart.index = charts.length;
+		charts.push(chart);
+
+		// Set up auto resize
+		if (optionsChart.reflow !== false) {
+			addEvent(chart, 'load', function () {
+				chart.initReflow();
+			});
+		}
+
+		// Chart event handlers
+		if (chartEvents) {
+			for (eventType in chartEvents) {
+				addEvent(chart, eventType, chartEvents[eventType]);
+			}
+		}
+
+		chart.xAxis = [];
+		chart.yAxis = [];
+
+		// Expose methods and variables
+		chart.animation = useCanVG ? false : pick(optionsChart.animation, true);
+		chart.pointCount = 0;
+		chart.counters = new ChartCounters();
+
+		chart.firstRender();
+	},
+
+	/**
+	 * Initialize an individual series, called internally before render time
+	 */
+	initSeries: function (options) {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			type = options.type || optionsChart.type || optionsChart.defaultSeriesType,
+			series,
+			constr = seriesTypes[type];
+
+		// No such series type
+		if (!constr) {
+			error(17, true);
+		}
+
+		series = new constr();
+		series.init(this, options);
+		return series;
+	},
+
+	/**
+	 * Add a series dynamically after  time
+	 *
+	 * @param {Object} options The config options
+	 * @param {Boolean} redraw Whether to redraw the chart after adding. Defaults to true.
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 *
+	 * @return {Object} series The newly created series object
+	 */
+	addSeries: function (options, redraw, animation) {
+		var series,
+			chart = this;
+
+		if (options) {
+			redraw = pick(redraw, true); // defaults to true
+
+			fireEvent(chart, 'addSeries', { options: options }, function () {
+				series = chart.initSeries(options);
+				
+				chart.isDirtyLegend = true; // the series array is out of sync with the display
+				chart.linkSeries();
+				if (redraw) {
+					chart.redraw(animation);
+				}
+			});
+		}
+
+		return series;
+	},
+
+	/**
+     * Add an axis to the chart
+     * @param {Object} options The axis option
+     * @param {Boolean} isX Whether it is an X axis or a value axis
+     */
+	addAxis: function (options, isX, redraw, animation) {
+		var key = isX ? 'xAxis' : 'yAxis',
+			chartOptions = this.options,
+			axis;
+
+		/*jslint unused: false*/
+		axis = new Axis(this, merge(options, {
+			index: this[key].length,
+			isX: isX
+		}));
+		/*jslint unused: true*/
+
+		// Push the new axis options to the chart options
+		chartOptions[key] = splat(chartOptions[key] || {});
+		chartOptions[key].push(options);
+
+		if (pick(redraw, true)) {
+			this.redraw(animation);
+		}
+	},
+
+	/**
+	 * Check whether a given point is within the plot area
+	 *
+	 * @param {Number} plotX Pixel x relative to the plot area
+	 * @param {Number} plotY Pixel y relative to the plot area
+	 * @param {Boolean} inverted Whether the chart is inverted
+	 */
+	isInsidePlot: function (plotX, plotY, inverted) {
+		var x = inverted ? plotY : plotX,
+			y = inverted ? plotX : plotY;
+			
+		return x >= 0 &&
+			x <= this.plotWidth &&
+			y >= 0 &&
+			y <= this.plotHeight;
+	},
+
+	/**
+	 * Adjust all axes tick amounts
+	 */
+	adjustTickAmounts: function () {
+		if (this.options.chart.alignTicks !== false) {
+			each(this.axes, function (axis) {
+				axis.adjustTickAmount();
+			});
+		}
+		this.maxTicks = null;
+	},
+
+	/**
+	 * Redraw legend, axes or series based on updated data
+	 *
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+	redraw: function (animation) {
+		var chart = this,
+			axes = chart.axes,
+			series = chart.series,
+			pointer = chart.pointer,
+			legend = chart.legend,
+			redrawLegend = chart.isDirtyLegend,
+			hasStackedSeries,
+			hasDirtyStacks,
+			isDirtyBox = chart.isDirtyBox, // todo: check if it has actually changed?
+			seriesLength = series.length,
+			i = seriesLength,
+			serie,
+			renderer = chart.renderer,
+			isHiddenChart = renderer.isHidden(),
+			afterRedraw = [];
+			
+		setAnimation(animation, chart);
+		
+		if (isHiddenChart) {
+			chart.cloneRenderTo();
+		}
+
+		// Adjust title layout (reflow multiline text)
+		chart.layOutTitles();
+
+		// link stacked series
+		while (i--) {
+			serie = series[i];
+
+			if (serie.options.stacking) {
+				hasStackedSeries = true;
+				
+				if (serie.isDirty) {
+					hasDirtyStacks = true;
+					break;
+				}
+			}
+		}
+		if (hasDirtyStacks) { // mark others as dirty
+			i = seriesLength;
+			while (i--) {
+				serie = series[i];
+				if (serie.options.stacking) {
+					serie.isDirty = true;
+				}
+			}
+		}
+
+		// handle updated data in the series
+		each(series, function (serie) {
+			if (serie.isDirty) { // prepare the data so axis can read it
+				if (serie.options.legendType === 'point') {
+					redrawLegend = true;
+				}
+			}
+		});
+
+		// handle added or removed series
+		if (redrawLegend && legend.options.enabled) { // series or pie points are added or removed
+			// draw legend graphics
+			legend.render();
+
+			chart.isDirtyLegend = false;
+		}
+
+		// reset stacks
+		if (hasStackedSeries) {
+			chart.getStacks();
+		}
+
+
+		if (chart.hasCartesianSeries) {
+			if (!chart.isResizing) {
+
+				// reset maxTicks
+				chart.maxTicks = null;
+
+				// set axes scales
+				each(axes, function (axis) {
+					axis.setScale();
+				});
+			}
+
+			chart.adjustTickAmounts();
+			chart.getMargins();
+
+			// If one axis is dirty, all axes must be redrawn (#792, #2169)
+			each(axes, function (axis) {
+				if (axis.isDirty) {
+					isDirtyBox = true;
+				}
+			});
+
+			// redraw axes
+			each(axes, function (axis) {
+				
+				// Fire 'afterSetExtremes' only if extremes are set
+				if (axis.isDirtyExtremes) { // #821
+					axis.isDirtyExtremes = false;
+					afterRedraw.push(function () { // prevent a recursive call to chart.redraw() (#1119)
+						fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751
+						delete axis.eventArgs;
+					});
+				}
+				
+				if (isDirtyBox || hasStackedSeries) {
+					axis.redraw();
+				}
+			});
+
+
+		}
+		// the plot areas size has changed
+		if (isDirtyBox) {
+			chart.drawChartBox();
+		}
+
+
+		// redraw affected series
+		each(series, function (serie) {
+			if (serie.isDirty && serie.visible &&
+					(!serie.isCartesian || serie.xAxis)) { // issue #153
+				serie.redraw();
+			}
+		});
+
+		// move tooltip or reset
+		if (pointer && pointer.reset) {
+			pointer.reset(true);
+		}
+
+		// redraw if canvas
+		renderer.draw();
+
+		// fire the event
+		fireEvent(chart, 'redraw'); // jQuery breaks this when calling it from addEvent. Overwrites chart.redraw
+		
+		if (isHiddenChart) {
+			chart.cloneRenderTo(true);
+		}
+		
+		// Fire callbacks that are put on hold until after the redraw
+		each(afterRedraw, function (callback) {
+			callback.call();
+		});
+	},
+
+
+
+	/**
+	 * Dim the chart and show a loading text or symbol
+	 * @param {String} str An optional text to show in the loading label instead of the default one
+	 */
+	showLoading: function (str) {
+		var chart = this,
+			options = chart.options,
+			loadingDiv = chart.loadingDiv;
+
+		var loadingOptions = options.loading;
+
+		// create the layer at the first call
+		if (!loadingDiv) {
+			chart.loadingDiv = loadingDiv = createElement(DIV, {
+				className: PREFIX + 'loading'
+			}, extend(loadingOptions.style, {
+				zIndex: 10,
+				display: NONE
+			}), chart.container);
+
+			chart.loadingSpan = createElement(
+				'span',
+				null,
+				loadingOptions.labelStyle,
+				loadingDiv
+			);
+
+		}
+
+		// update text
+		chart.loadingSpan.innerHTML = str || options.lang.loading;
+
+		// show it
+		if (!chart.loadingShown) {
+			css(loadingDiv, { 
+				opacity: 0, 
+				display: '',
+				left: chart.plotLeft + PX,
+				top: chart.plotTop + PX,
+				width: chart.plotWidth + PX,
+				height: chart.plotHeight + PX
+			});
+			animate(loadingDiv, {
+				opacity: loadingOptions.style.opacity
+			}, {
+				duration: loadingOptions.showDuration || 0
+			});
+			chart.loadingShown = true;
+		}
+	},
+
+	/**
+	 * Hide the loading layer
+	 */
+	hideLoading: function () {
+		var options = this.options,
+			loadingDiv = this.loadingDiv;
+
+		if (loadingDiv) {
+			animate(loadingDiv, {
+				opacity: 0
+			}, {
+				duration: options.loading.hideDuration || 100,
+				complete: function () {
+					css(loadingDiv, { display: NONE });
+				}
+			});
+		}
+		this.loadingShown = false;
+	},
+
+	/**
+	 * Get an axis, series or point object by id.
+	 * @param id {String} The id as given in the configuration options
+	 */
+	get: function (id) {
+		var chart = this,
+			axes = chart.axes,
+			series = chart.series;
+
+		var i,
+			j,
+			points;
+
+		// search axes
+		for (i = 0; i < axes.length; i++) {
+			if (axes[i].options.id === id) {
+				return axes[i];
+			}
+		}
+
+		// search series
+		for (i = 0; i < series.length; i++) {
+			if (series[i].options.id === id) {
+				return series[i];
+			}
+		}
+
+		// search points
+		for (i = 0; i < series.length; i++) {
+			points = series[i].points || [];
+			for (j = 0; j < points.length; j++) {
+				if (points[j].id === id) {
+					return points[j];
+				}
+			}
+		}
+		return null;
+	},
+
+	/**
+	 * Create the Axis instances based on the config options
+	 */
+	getAxes: function () {
+		var chart = this,
+			options = this.options,
+			xAxisOptions = options.xAxis = splat(options.xAxis || {}),
+			yAxisOptions = options.yAxis = splat(options.yAxis || {}),
+			optionsArray,
+			axis;
+
+		// make sure the options are arrays and add some members
+		each(xAxisOptions, function (axis, i) {
+			axis.index = i;
+			axis.isX = true;
+		});
+
+		each(yAxisOptions, function (axis, i) {
+			axis.index = i;
+		});
+
+		// concatenate all axis options into one array
+		optionsArray = xAxisOptions.concat(yAxisOptions);
+
+		each(optionsArray, function (axisOptions) {
+			axis = new Axis(chart, axisOptions);
+		});
+
+		chart.adjustTickAmounts();
+	},
+
+
+	/**
+	 * Get the currently selected points from all series
+	 */
+	getSelectedPoints: function () {
+		var points = [];
+		each(this.series, function (serie) {
+			points = points.concat(grep(serie.points || [], function (point) {
+				return point.selected;
+			}));
+		});
+		return points;
+	},
+
+	/**
+	 * Get the currently selected series
+	 */
+	getSelectedSeries: function () {
+		return grep(this.series, function (serie) {
+			return serie.selected;
+		});
+	},
+
+	/**
+	 * Generate stacks for each series and calculate stacks total values
+	 */
+	getStacks: function () {
+		var chart = this;
+
+		// reset stacks for each yAxis
+		each(chart.yAxis, function (axis) {
+			if (axis.stacks && axis.hasVisibleSeries) {
+				axis.oldStacks = axis.stacks;
+			}
+		});
+
+		each(chart.series, function (series) {
+			if (series.options.stacking && (series.visible === true || chart.options.chart.ignoreHiddenSeries === false)) {
+				series.stackKey = series.type + pick(series.options.stack, '');
+			}
+		});
+	},
+
+	/**
+	 * Display the zoom button
+	 */
+	showResetZoom: function () {
+		var chart = this,
+			lang = defaultOptions.lang,
+			btnOptions = chart.options.chart.resetZoomButton,
+			theme = btnOptions.theme,
+			states = theme.states,
+			alignTo = btnOptions.relativeTo === 'chart' ? null : 'plotBox';
+			
+		this.resetZoomButton = chart.renderer.button(lang.resetZoom, null, null, function () { chart.zoomOut(); }, theme, states && states.hover)
+			.attr({
+				align: btnOptions.position.align,
+				title: lang.resetZoomTitle
+			})
+			.add()
+			.align(btnOptions.position, false, alignTo);
+			
+	},
+
+	/**
+	 * Zoom out to 1:1
+	 */
+	zoomOut: function () {
+		var chart = this;
+		fireEvent(chart, 'selection', { resetSelection: true }, function () { 
+			chart.zoom();
+		});
+	},
+
+	/**
+	 * Zoom into a given portion of the chart given by axis coordinates
+	 * @param {Object} event
+	 */
+	zoom: function (event) {
+		var chart = this,
+			hasZoomed,
+			pointer = chart.pointer,
+			displayButton = false,
+			resetZoomButton;
+
+		// If zoom is called with no arguments, reset the axes
+		if (!event || event.resetSelection) {
+			each(chart.axes, function (axis) {
+				hasZoomed = axis.zoom();
+			});
+		} else { // else, zoom in on all axes
+			each(event.xAxis.concat(event.yAxis), function (axisData) {
+				var axis = axisData.axis,
+					isXAxis = axis.isXAxis;
+
+				// don't zoom more than minRange
+				if (pointer[isXAxis ? 'zoomX' : 'zoomY'] || pointer[isXAxis ? 'pinchX' : 'pinchY']) {
+					hasZoomed = axis.zoom(axisData.min, axisData.max);
+					if (axis.displayBtn) {
+						displayButton = true;
+					}
+				}
+			});
+		}
+		
+		// Show or hide the Reset zoom button
+		resetZoomButton = chart.resetZoomButton;
+		if (displayButton && !resetZoomButton) {
+			chart.showResetZoom();
+		} else if (!displayButton && isObject(resetZoomButton)) {
+			chart.resetZoomButton = resetZoomButton.destroy();
+		}
+		
+
+		// Redraw
+		if (hasZoomed) {
+			chart.redraw(
+				pick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100) // animation
+			);
+		}
+	},
+
+	/**
+	 * Pan the chart by dragging the mouse across the pane. This function is called
+	 * on mouse move, and the distance to pan is computed from chartX compared to
+	 * the first chartX position in the dragging operation.
+	 */
+	pan: function (e, panning) {
+
+		var chart = this,
+			hoverPoints = chart.hoverPoints,
+			doRedraw;
+
+		// remove active points for shared tooltip
+		if (hoverPoints) {
+			each(hoverPoints, function (point) {
+				point.setState();
+			});
+		}
+
+		each(panning === 'xy' ? [1, 0] : [1], function (isX) { // xy is used in maps
+			var mousePos = e[isX ? 'chartX' : 'chartY'],
+				axis = chart[isX ? 'xAxis' : 'yAxis'][0],
+				startPos = chart[isX ? 'mouseDownX' : 'mouseDownY'],
+				halfPointRange = (axis.pointRange || 0) / 2,
+				extremes = axis.getExtremes(),
+				newMin = axis.toValue(startPos - mousePos, true) + halfPointRange,
+				newMax = axis.toValue(startPos + chart[isX ? 'plotWidth' : 'plotHeight'] - mousePos, true) - halfPointRange;
+
+			if (axis.series.length && newMin > mathMin(extremes.dataMin, extremes.min) && newMax < mathMax(extremes.dataMax, extremes.max)) {
+				axis.setExtremes(newMin, newMax, false, false, { trigger: 'pan' });
+				doRedraw = true;
+			}
+
+			chart[isX ? 'mouseDownX' : 'mouseDownY'] = mousePos; // set new reference for next run
+		});
+
+		if (doRedraw) {
+			chart.redraw(false);
+		}
+		css(chart.container, { cursor: 'move' });
+	},
+
+	/**
+	 * Show the title and subtitle of the chart
+	 *
+	 * @param titleOptions {Object} New title options
+	 * @param subtitleOptions {Object} New subtitle options
+	 *
+	 */
+	setTitle: function (titleOptions, subtitleOptions) {
+		var chart = this,
+			options = chart.options,
+			chartTitleOptions,
+			chartSubtitleOptions;
+
+		chartTitleOptions = options.title = merge(options.title, titleOptions);
+		chartSubtitleOptions = options.subtitle = merge(options.subtitle, subtitleOptions);
+
+		// add title and subtitle
+		each([
+			['title', titleOptions, chartTitleOptions],
+			['subtitle', subtitleOptions, chartSubtitleOptions]
+		], function (arr) {
+			var name = arr[0],
+				title = chart[name],
+				titleOptions = arr[1],
+				chartTitleOptions = arr[2];
+
+			if (title && titleOptions) {
+				chart[name] = title = title.destroy(); // remove old
+			}
+			
+			if (chartTitleOptions && chartTitleOptions.text && !title) {
+				chart[name] = chart.renderer.text(
+					chartTitleOptions.text,
+					0,
+					0,
+					chartTitleOptions.useHTML
+				)
+				.attr({
+					align: chartTitleOptions.align,
+					'class': PREFIX + name,
+					zIndex: chartTitleOptions.zIndex || 4
+				})
+				.css(chartTitleOptions.style)
+				.add();
+			}	
+		});
+		chart.layOutTitles();
+	},
+
+	/**
+	 * Lay out the chart titles and cache the full offset height for use in getMargins
+	 */
+	layOutTitles: function () {
+		var titleOffset = 0,
+			title = this.title,
+			subtitle = this.subtitle,
+			options = this.options,
+			titleOptions = options.title,
+			subtitleOptions = options.subtitle,
+			autoWidth = this.spacingBox.width - 44; // 44 makes room for default context button
+
+		if (title) {
+			title
+				.css({ width: (titleOptions.width || autoWidth) + PX })
+				.align(extend({ y: 15 }, titleOptions), false, 'spacingBox');
+			
+			if (!titleOptions.floating && !titleOptions.verticalAlign) {
+				titleOffset = title.getBBox().height;
+
+				// Adjust for browser consistency + backwards compat after #776 fix
+				if (titleOffset >= 18 && titleOffset <= 25) {
+					titleOffset = 15; 
+				}
+			}
+		}
+		if (subtitle) {
+			subtitle
+				.css({ width: (subtitleOptions.width || autoWidth) + PX })
+				.align(extend({ y: titleOffset + titleOptions.margin }, subtitleOptions), false, 'spacingBox');
+			
+			if (!subtitleOptions.floating && !subtitleOptions.verticalAlign) {
+				titleOffset = mathCeil(titleOffset + subtitle.getBBox().height);
+			}
+		}
+
+		this.titleOffset = titleOffset; // used in getMargins
+	},
+
+	/**
+	 * Get chart width and height according to options and container size
+	 */
+	getChartSize: function () {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			renderTo = chart.renderToClone || chart.renderTo;
+
+		// get inner width and height from jQuery (#824)
+		chart.containerWidth = adapterRun(renderTo, 'width');
+		chart.containerHeight = adapterRun(renderTo, 'height');
+		
+		chart.chartWidth = mathMax(0, optionsChart.width || chart.containerWidth || 600); // #1393, 1460
+		chart.chartHeight = mathMax(0, pick(optionsChart.height,
+			// the offsetHeight of an empty container is 0 in standard browsers, but 19 in IE7:
+			chart.containerHeight > 19 ? chart.containerHeight : 400));
+	},
+
+	/**
+	 * Create a clone of the chart's renderTo div and place it outside the viewport to allow
+	 * size computation on chart.render and chart.redraw
+	 */
+	cloneRenderTo: function (revert) {
+		var clone = this.renderToClone,
+			container = this.container;
+		
+		// Destroy the clone and bring the container back to the real renderTo div
+		if (revert) {
+			if (clone) {
+				this.renderTo.appendChild(container);
+				discardElement(clone);
+				delete this.renderToClone;
+			}
+		
+		// Set up the clone
+		} else {
+			if (container && container.parentNode === this.renderTo) {
+				this.renderTo.removeChild(container); // do not clone this
+			}
+			this.renderToClone = clone = this.renderTo.cloneNode(0);
+			css(clone, {
+				position: ABSOLUTE,
+				top: '-9999px',
+				display: 'block' // #833
+			});
+			doc.body.appendChild(clone);
+			if (container) {
+				clone.appendChild(container);
+			}
+		}
+	},
+
+	/**
+	 * Get the containing element, determine the size and create the inner container
+	 * div to hold the chart
+	 */
+	getContainer: function () {
+		var chart = this,
+			container,
+			optionsChart = chart.options.chart,
+			chartWidth,
+			chartHeight,
+			renderTo,
+			indexAttrName = 'data-highcharts-chart',
+			oldChartIndex,
+			containerId;
+
+		chart.renderTo = renderTo = optionsChart.renderTo;
+		containerId = PREFIX + idCounter++;
+
+		if (isString(renderTo)) {
+			chart.renderTo = renderTo = doc.getElementById(renderTo);
+		}
+		
+		// Display an error if the renderTo is wrong
+		if (!renderTo) {
+			error(13, true);
+		}
+		
+		// If the container already holds a chart, destroy it
+		oldChartIndex = pInt(attr(renderTo, indexAttrName));
+		if (!isNaN(oldChartIndex) && charts[oldChartIndex]) {
+			charts[oldChartIndex].destroy();
+		}		
+		
+		// Make a reference to the chart from the div
+		attr(renderTo, indexAttrName, chart.index);
+
+		// remove previous chart
+		renderTo.innerHTML = '';
+
+		// If the container doesn't have an offsetWidth, it has or is a child of a node
+		// that has display:none. We need to temporarily move it out to a visible
+		// state to determine the size, else the legend and tooltips won't render
+		// properly
+		if (!renderTo.offsetWidth) {
+			chart.cloneRenderTo();
+		}
+
+		// get the width and height
+		chart.getChartSize();
+		chartWidth = chart.chartWidth;
+		chartHeight = chart.chartHeight;
+
+		// create the inner container
+		chart.container = container = createElement(DIV, {
+				className: PREFIX + 'container' +
+					(optionsChart.className ? ' ' + optionsChart.className : ''),
+				id: containerId
+			}, extend({
+				position: RELATIVE,
+				overflow: HIDDEN, // needed for context menu (avoid scrollbars) and
+					// content overflow in IE
+				width: chartWidth + PX,
+				height: chartHeight + PX,
+				textAlign: 'left',
+				lineHeight: 'normal', // #427
+				zIndex: 0, // #1072
+				'-webkit-tap-highlight-color': 'rgba(0,0,0,0)'
+			}, optionsChart.style),
+			chart.renderToClone || renderTo
+		);
+
+		// cache the cursor (#1650)
+		chart._cursor = container.style.cursor;
+
+		chart.renderer =
+			optionsChart.forExport ? // force SVG, used for SVG export
+				new SVGRenderer(container, chartWidth, chartHeight, true) :
+				new Renderer(container, chartWidth, chartHeight);
+
+		if (useCanVG) {
+			// If we need canvg library, extend and configure the renderer
+			// to get the tracker for translating mouse events
+			chart.renderer.create(chart, container, chartWidth, chartHeight);
+		}
+	},
+
+	/**
+	 * Calculate margins by rendering axis labels in a preliminary position. Title,
+	 * subtitle and legend have already been rendered at this stage, but will be
+	 * moved into their final positions
+	 */
+	getMargins: function () {
+		var chart = this,
+			spacing = chart.spacing,
+			axisOffset,
+			legend = chart.legend,
+			margin = chart.margin,
+			legendOptions = chart.options.legend,
+			legendMargin = pick(legendOptions.margin, 10),
+			legendX = legendOptions.x,
+			legendY = legendOptions.y,
+			align = legendOptions.align,
+			verticalAlign = legendOptions.verticalAlign,
+			titleOffset = chart.titleOffset;
+
+		chart.resetMargins();
+		axisOffset = chart.axisOffset;
+
+		// Adjust for title and subtitle
+		if (titleOffset && !defined(margin[0])) {
+			chart.plotTop = mathMax(chart.plotTop, titleOffset + chart.options.title.margin + spacing[0]);
+		}
+		
+		// Adjust for legend
+		if (legend.display && !legendOptions.floating) {
+			if (align === 'right') { // horizontal alignment handled first
+				if (!defined(margin[1])) {
+					chart.marginRight = mathMax(
+						chart.marginRight,
+						legend.legendWidth - legendX + legendMargin + spacing[1]
+					);
+				}
+			} else if (align === 'left') {
+				if (!defined(margin[3])) {
+					chart.plotLeft = mathMax(
+						chart.plotLeft,
+						legend.legendWidth + legendX + legendMargin + spacing[3]
+					);
+				}
+
+			} else if (verticalAlign === 'top') {
+				if (!defined(margin[0])) {
+					chart.plotTop = mathMax(
+						chart.plotTop,
+						legend.legendHeight + legendY + legendMargin + spacing[0]
+					);
+				}
+
+			} else if (verticalAlign === 'bottom') {
+				if (!defined(margin[2])) {
+					chart.marginBottom = mathMax(
+						chart.marginBottom,
+						legend.legendHeight - legendY + legendMargin + spacing[2]
+					);
+				}
+			}
+		}
+
+		// adjust for scroller
+		if (chart.extraBottomMargin) {
+			chart.marginBottom += chart.extraBottomMargin;
+		}
+		if (chart.extraTopMargin) {
+			chart.plotTop += chart.extraTopMargin;
+		}
+
+		// pre-render axes to get labels offset width
+		if (chart.hasCartesianSeries) {
+			each(chart.axes, function (axis) {
+				axis.getOffset();
+			});
+		}
+		
+		if (!defined(margin[3])) {
+			chart.plotLeft += axisOffset[3];
+		}
+		if (!defined(margin[0])) {
+			chart.plotTop += axisOffset[0];
+		}
+		if (!defined(margin[2])) {
+			chart.marginBottom += axisOffset[2];
+		}
+		if (!defined(margin[1])) {
+			chart.marginRight += axisOffset[1];
+		}
+
+		chart.setChartSize();
+
+	},
+
+	/**
+	 * Add the event handlers necessary for auto resizing
+	 *
+	 */
+	initReflow: function () {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			renderTo = chart.renderTo,
+			reflowTimeout;
+			
+		function reflow(e) {
+			var width = optionsChart.width || adapterRun(renderTo, 'width'),
+				height = optionsChart.height || adapterRun(renderTo, 'height'),
+				target = e ? e.target : win; // #805 - MooTools doesn't supply e
+				
+			// Width and height checks for display:none. Target is doc in IE8 and Opera,
+			// win in Firefox, Chrome and IE9.
+			if (!chart.hasUserSize && width && height && (target === win || target === doc)) {
+				
+				if (width !== chart.containerWidth || height !== chart.containerHeight) {
+					clearTimeout(reflowTimeout);
+					chart.reflowTimeout = reflowTimeout = setTimeout(function () {
+						if (chart.container) { // It may have been destroyed in the meantime (#1257)
+							chart.setSize(width, height, false);
+							chart.hasUserSize = null;
+						}
+					}, 100);
+				}
+				chart.containerWidth = width;
+				chart.containerHeight = height;
+			}
+		}
+		chart.reflow = reflow;
+		addEvent(win, 'resize', reflow);
+		addEvent(chart, 'destroy', function () {
+			removeEvent(win, 'resize', reflow);
+		});
+	},
+
+	/**
+	 * Resize the chart to a given width and height
+	 * @param {Number} width
+	 * @param {Number} height
+	 * @param {Object|Boolean} animation
+	 */
+	setSize: function (width, height, animation) {
+		var chart = this,
+			chartWidth,
+			chartHeight,
+			fireEndResize;
+
+		// Handle the isResizing counter
+		chart.isResizing += 1;
+		fireEndResize = function () {
+			if (chart) {
+				fireEvent(chart, 'endResize', null, function () {
+					chart.isResizing -= 1;
+				});
+			}
+		};
+
+		// set the animation for the current process
+		setAnimation(animation, chart);
+
+		chart.oldChartHeight = chart.chartHeight;
+		chart.oldChartWidth = chart.chartWidth;
+		if (defined(width)) {
+			chart.chartWidth = chartWidth = mathMax(0, mathRound(width));
+			chart.hasUserSize = !!chartWidth;
+		}
+		if (defined(height)) {
+			chart.chartHeight = chartHeight = mathMax(0, mathRound(height));
+		}
+
+		css(chart.container, {
+			width: chartWidth + PX,
+			height: chartHeight + PX
+		});
+		chart.setChartSize(true);
+		chart.renderer.setSize(chartWidth, chartHeight, animation);
+
+		// handle axes
+		chart.maxTicks = null;
+		each(chart.axes, function (axis) {
+			axis.isDirty = true;
+			axis.setScale();
+		});
+
+		// make sure non-cartesian series are also handled
+		each(chart.series, function (serie) {
+			serie.isDirty = true;
+		});
+
+		chart.isDirtyLegend = true; // force legend redraw
+		chart.isDirtyBox = true; // force redraw of plot and chart border
+
+		chart.getMargins();
+
+		chart.redraw(animation);
+
+
+		chart.oldChartHeight = null;
+		fireEvent(chart, 'resize');
+
+		// fire endResize and set isResizing back
+		// If animation is disabled, fire without delay
+		if (globalAnimation === false) {
+			fireEndResize();
+		} else { // else set a timeout with the animation duration
+			setTimeout(fireEndResize, (globalAnimation && globalAnimation.duration) || 500);
+		}
+	},
+
+	/**
+	 * Set the public chart properties. This is done before and after the pre-render
+	 * to determine margin sizes
+	 */
+	setChartSize: function (skipAxes) {
+		var chart = this,
+			inverted = chart.inverted,
+			renderer = chart.renderer,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			optionsChart = chart.options.chart,
+			spacing = chart.spacing,
+			clipOffset = chart.clipOffset,
+			clipX,
+			clipY,
+			plotLeft,
+			plotTop,
+			plotWidth,
+			plotHeight,
+			plotBorderWidth;
+
+		chart.plotLeft = plotLeft = mathRound(chart.plotLeft);
+		chart.plotTop = plotTop = mathRound(chart.plotTop);
+		chart.plotWidth = plotWidth = mathMax(0, mathRound(chartWidth - plotLeft - chart.marginRight));
+		chart.plotHeight = plotHeight = mathMax(0, mathRound(chartHeight - plotTop - chart.marginBottom));
+
+		chart.plotSizeX = inverted ? plotHeight : plotWidth;
+		chart.plotSizeY = inverted ? plotWidth : plotHeight;
+		
+		chart.plotBorderWidth = optionsChart.plotBorderWidth || 0;
+
+		// Set boxes used for alignment
+		chart.spacingBox = renderer.spacingBox = {
+			x: spacing[3],
+			y: spacing[0],
+			width: chartWidth - spacing[3] - spacing[1],
+			height: chartHeight - spacing[0] - spacing[2]
+		};
+		chart.plotBox = renderer.plotBox = {
+			x: plotLeft,
+			y: plotTop,
+			width: plotWidth,
+			height: plotHeight
+		};
+
+		plotBorderWidth = 2 * mathFloor(chart.plotBorderWidth / 2);
+		clipX = mathCeil(mathMax(plotBorderWidth, clipOffset[3]) / 2);
+		clipY = mathCeil(mathMax(plotBorderWidth, clipOffset[0]) / 2);
+		chart.clipBox = {
+			x: clipX, 
+			y: clipY, 
+			width: mathFloor(chart.plotSizeX - mathMax(plotBorderWidth, clipOffset[1]) / 2 - clipX), 
+			height: mathFloor(chart.plotSizeY - mathMax(plotBorderWidth, clipOffset[2]) / 2 - clipY)
+		};
+
+		if (!skipAxes) {
+			each(chart.axes, function (axis) {
+				axis.setAxisSize();
+				axis.setAxisTranslation();
+			});
+		}
+	},
+
+	/**
+	 * Initial margins before auto size margins are applied
+	 */
+	resetMargins: function () {
+		var chart = this,
+			spacing = chart.spacing,
+			margin = chart.margin;
+
+		chart.plotTop = pick(margin[0], spacing[0]);
+		chart.marginRight = pick(margin[1], spacing[1]);
+		chart.marginBottom = pick(margin[2], spacing[2]);
+		chart.plotLeft = pick(margin[3], spacing[3]);
+		chart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left
+		chart.clipOffset = [0, 0, 0, 0];
+	},
+
+	/**
+	 * Draw the borders and backgrounds for chart and plot area
+	 */
+	drawChartBox: function () {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			renderer = chart.renderer,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			chartBackground = chart.chartBackground,
+			plotBackground = chart.plotBackground,
+			plotBorder = chart.plotBorder,
+			plotBGImage = chart.plotBGImage,
+			chartBorderWidth = optionsChart.borderWidth || 0,
+			chartBackgroundColor = optionsChart.backgroundColor,
+			plotBackgroundColor = optionsChart.plotBackgroundColor,
+			plotBackgroundImage = optionsChart.plotBackgroundImage,
+			plotBorderWidth = optionsChart.plotBorderWidth || 0,
+			mgn,
+			bgAttr,
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop,
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			plotBox = chart.plotBox,
+			clipRect = chart.clipRect,
+			clipBox = chart.clipBox;
+
+		// Chart area
+		mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);
+
+		if (chartBorderWidth || chartBackgroundColor) {
+			if (!chartBackground) {
+				
+				bgAttr = {
+					fill: chartBackgroundColor || NONE
+				};
+				if (chartBorderWidth) { // #980
+					bgAttr.stroke = optionsChart.borderColor;
+					bgAttr['stroke-width'] = chartBorderWidth;
+				}
+				chart.chartBackground = renderer.rect(mgn / 2, mgn / 2, chartWidth - mgn, chartHeight - mgn,
+						optionsChart.borderRadius, chartBorderWidth)
+					.attr(bgAttr)
+					.add()
+					.shadow(optionsChart.shadow);
+
+			} else { // resize
+				chartBackground.animate(
+					chartBackground.crisp(null, null, null, chartWidth - mgn, chartHeight - mgn)
+				);
+			}
+		}
+
+
+		// Plot background
+		if (plotBackgroundColor) {
+			if (!plotBackground) {
+				chart.plotBackground = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0)
+					.attr({
+						fill: plotBackgroundColor
+					})
+					.add()
+					.shadow(optionsChart.plotShadow);
+			} else {
+				plotBackground.animate(plotBox);
+			}
+		}
+		if (plotBackgroundImage) {
+			if (!plotBGImage) {
+				chart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight)
+					.add();
+			} else {
+				plotBGImage.animate(plotBox);
+			}
+		}
+		
+		// Plot clip
+		if (!clipRect) {
+			chart.clipRect = renderer.clipRect(clipBox);
+		} else {
+			clipRect.animate({
+				width: clipBox.width,
+				height: clipBox.height
+			});
+		}
+
+		// Plot area border
+		if (plotBorderWidth) {
+			if (!plotBorder) {
+				chart.plotBorder = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0, -plotBorderWidth)
+					.attr({
+						stroke: optionsChart.plotBorderColor,
+						'stroke-width': plotBorderWidth,
+						zIndex: 1
+					})
+					.add();
+			} else {
+				plotBorder.animate(
+					plotBorder.crisp(null, plotLeft, plotTop, plotWidth, plotHeight)
+				);
+			}
+		}
+
+		// reset
+		chart.isDirtyBox = false;
+	},
+
+	/**
+	 * Detect whether a certain chart property is needed based on inspecting its options
+	 * and series. This mainly applies to the chart.invert property, and in extensions to 
+	 * the chart.angular and chart.polar properties.
+	 */
+	propFromSeries: function () {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			klass,
+			seriesOptions = chart.options.series,
+			i,
+			value;
+			
+			
+		each(['inverted', 'angular', 'polar'], function (key) {
+			
+			// The default series type's class
+			klass = seriesTypes[optionsChart.type || optionsChart.defaultSeriesType];
+			
+			// Get the value from available chart-wide properties
+			value = (
+				chart[key] || // 1. it is set before
+				optionsChart[key] || // 2. it is set in the options
+				(klass && klass.prototype[key]) // 3. it's default series class requires it
+			);
+	
+			// 4. Check if any the chart's series require it
+			i = seriesOptions && seriesOptions.length;
+			while (!value && i--) {
+				klass = seriesTypes[seriesOptions[i].type];
+				if (klass && klass.prototype[key]) {
+					value = true;
+				}
+			}
+	
+			// Set the chart property
+			chart[key] = value;	
+		});
+		
+	},
+
+	/**
+	 * Link two or more series together. This is done initially from Chart.render,
+	 * and after Chart.addSeries and Series.remove.
+	 */
+	linkSeries: function () {
+		var chart = this,
+			chartSeries = chart.series;
+
+		// Reset links
+		each(chartSeries, function (series) {
+			series.linkedSeries.length = 0;
+		});
+
+		// Apply new links
+		each(chartSeries, function (series) {
+			var linkedTo = series.options.linkedTo;
+			if (isString(linkedTo)) {
+				if (linkedTo === ':previous') {
+					linkedTo = chart.series[series.index - 1];
+				} else {
+					linkedTo = chart.get(linkedTo);
+				}
+				if (linkedTo) {
+					linkedTo.linkedSeries.push(series);
+					series.linkedParent = linkedTo;
+				}
+			}
+		});
+	},
+
+	/**
+	 * Render all graphics for the chart
+	 */
+	render: function () {
+		var chart = this,
+			axes = chart.axes,
+			renderer = chart.renderer,
+			options = chart.options;
+
+		var labels = options.labels,
+			credits = options.credits,
+			creditsHref;
+
+		// Title
+		chart.setTitle();
+
+
+		// Legend
+		chart.legend = new Legend(chart, options.legend);
+
+		chart.getStacks(); // render stacks
+
+		// Get margins by pre-rendering axes
+		// set axes scales
+		each(axes, function (axis) {
+			axis.setScale();
+		});
+
+		chart.getMargins();
+
+		chart.maxTicks = null; // reset for second pass
+		each(axes, function (axis) {
+			axis.setTickPositions(true); // update to reflect the new margins
+			axis.setMaxTicks();
+		});
+		chart.adjustTickAmounts();
+		chart.getMargins(); // second pass to check for new labels
+
+
+		// Draw the borders and backgrounds
+		chart.drawChartBox();		
+
+
+		// Axes
+		if (chart.hasCartesianSeries) {
+			each(axes, function (axis) {
+				axis.render();
+			});
+		}
+
+		// The series
+		if (!chart.seriesGroup) {
+			chart.seriesGroup = renderer.g('series-group')
+				.attr({ zIndex: 3 })
+				.add();
+		}
+		each(chart.series, function (serie) {
+			serie.translate();
+			serie.setTooltipPoints();
+			serie.render();
+		});
+
+		// Labels
+		if (labels.items) {
+			each(labels.items, function (label) {
+				var style = extend(labels.style, label.style),
+					x = pInt(style.left) + chart.plotLeft,
+					y = pInt(style.top) + chart.plotTop + 12;
+
+				// delete to prevent rewriting in IE
+				delete style.left;
+				delete style.top;
+
+				renderer.text(
+					label.html,
+					x,
+					y
+				)
+				.attr({ zIndex: 2 })
+				.css(style)
+				.add();
+
+			});
+		}
+
+		// Credits
+		if (credits.enabled && !chart.credits) {
+			creditsHref = credits.href;
+			chart.credits = renderer.text(
+				credits.text,
+				0,
+				0
+			)
+			.on('click', function () {
+				if (creditsHref) {
+					location.href = creditsHref;
+				}
+			})
+			.attr({
+				align: credits.position.align,
+				zIndex: 8
+			})
+			.css(credits.style)
+			.add()
+			.align(credits.position);
+		}
+
+		// Set flag
+		chart.hasRendered = true;
+
+	},
+
+	/**
+	 * Clean up memory usage
+	 */
+	destroy: function () {
+		var chart = this,
+			axes = chart.axes,
+			series = chart.series,
+			container = chart.container,
+			i,
+			parentNode = container && container.parentNode;
+			
+		// fire the chart.destoy event
+		fireEvent(chart, 'destroy');
+		
+		// Delete the chart from charts lookup array
+		charts[chart.index] = UNDEFINED;
+		chart.renderTo.removeAttribute('data-highcharts-chart');
+
+		// remove events
+		removeEvent(chart);
+
+		// ==== Destroy collections:
+		// Destroy axes
+		i = axes.length;
+		while (i--) {
+			axes[i] = axes[i].destroy();
+		}
+
+		// Destroy each series
+		i = series.length;
+		while (i--) {
+			series[i] = series[i].destroy();
+		}
+
+		// ==== Destroy chart properties:
+		each(['title', 'subtitle', 'chartBackground', 'plotBackground', 'plotBGImage', 
+				'plotBorder', 'seriesGroup', 'clipRect', 'credits', 'pointer', 'scroller', 
+				'rangeSelector', 'legend', 'resetZoomButton', 'tooltip', 'renderer'], function (name) {
+			var prop = chart[name];
+
+			if (prop && prop.destroy) {
+				chart[name] = prop.destroy();
+			}
+		});
+
+		// remove container and all SVG
+		if (container) { // can break in IE when destroyed before finished loading
+			container.innerHTML = '';
+			removeEvent(container);
+			if (parentNode) {
+				discardElement(container);
+			}
+
+		}
+
+		// clean it all up
+		for (i in chart) {
+			delete chart[i];
+		}
+
+	},
+
+
+	/**
+	 * VML namespaces can't be added until after complete. Listening
+	 * for Perini's doScroll hack is not enough.
+	 */
+	isReadyToRender: function () {
+		var chart = this;
+
+		// Note: in spite of JSLint's complaints, win == win.top is required
+		/*jslint eqeq: true*/
+		if ((!hasSVG && (win == win.top && doc.readyState !== 'complete')) || (useCanVG && !win.canvg)) {
+		/*jslint eqeq: false*/
+			if (useCanVG) {
+				// Delay rendering until canvg library is downloaded and ready
+				CanVGController.push(function () { chart.firstRender(); }, chart.options.global.canvasToolsURL);
+			} else {
+				doc.attachEvent('onreadystatechange', function () {
+					doc.detachEvent('onreadystatechange', chart.firstRender);
+					if (doc.readyState === 'complete') {
+						chart.firstRender();
+					}
+				});
+			}
+			return false;
+		}
+		return true;
+	},
+
+	/**
+	 * Prepare for first rendering after all data are loaded
+	 */
+	firstRender: function () {
+		var chart = this,
+			options = chart.options,
+			callback = chart.callback;
+
+		// Check whether the chart is ready to render
+		if (!chart.isReadyToRender()) {
+			return;
+		}
+
+		// Create the container
+		chart.getContainer();
+
+		// Run an early event after the container and renderer are established
+		fireEvent(chart, 'init');
+
+		
+		chart.resetMargins();
+		chart.setChartSize();
+
+		// Set the common chart properties (mainly invert) from the given series
+		chart.propFromSeries();
+
+		// get axes
+		chart.getAxes();
+
+		// Initialize the series
+		each(options.series || [], function (serieOptions) {
+			chart.initSeries(serieOptions);
+		});
+
+		chart.linkSeries();
+
+		// Run an event after axes and series are initialized, but before render. At this stage,
+		// the series data is indexed and cached in the xData and yData arrays, so we can access
+		// those before rendering. Used in Highstock. 
+		fireEvent(chart, 'beforeRender'); 
+
+		// depends on inverted and on margins being set
+		chart.pointer = new Pointer(chart, options);
+
+		chart.render();
+
+		// add canvas
+		chart.renderer.draw();
+		// run callbacks
+		if (callback) {
+			callback.apply(chart, [chart]);
+		}
+		each(chart.callbacks, function (fn) {
+			fn.apply(chart, [chart]);
+		});
+		
+		
+		// If the chart was rendered outside the top container, put it back in
+		chart.cloneRenderTo(true);
+
+		fireEvent(chart, 'load');
+
+	},
+
+	/**
+	* Creates arrays for spacing and margin from given options.
+	*/
+	splashArray: function (target, options) {
+		var oVar = options[target],
+			tArray = isObject(oVar) ? oVar : [oVar, oVar, oVar, oVar];
+
+		return [pick(options[target + 'Top'], tArray[0]),
+				pick(options[target + 'Right'], tArray[1]),
+				pick(options[target + 'Bottom'], tArray[2]),
+				pick(options[target + 'Left'], tArray[3])];
+	}
+}; // end Chart
+
+// Hook for exporting module
+Chart.prototype.callbacks = [];
+/**
+ * The Point object and prototype. Inheritable and used as base for PiePoint
+ */
+var Point = function () {};
+Point.prototype = {
+
+	/**
+	 * Initialize the point
+	 * @param {Object} series The series object containing this point
+	 * @param {Object} options The data in either number, array or object format
+	 */
+	init: function (series, options, x) {
+
+		var point = this,
+			colors;
+		point.series = series;
+		point.applyOptions(options, x);
+		point.pointAttr = {};
+
+		if (series.options.colorByPoint) {
+			colors = series.options.colors || series.chart.options.colors;
+			point.color = point.color || colors[series.colorCounter++];
+			// loop back to zero
+			if (series.colorCounter === colors.length) {
+				series.colorCounter = 0;
+			}
+		}
+
+		series.chart.pointCount++;
+		return point;
+	},
+	/**
+	 * Apply the options containing the x and y data and possible some extra properties.
+	 * This is called on point init or from point.update.
+	 *
+	 * @param {Object} options
+	 */
+	applyOptions: function (options, x) {
+		var point = this,
+			series = point.series,
+			pointValKey = series.pointValKey;
+
+		options = Point.prototype.optionsToObject.call(this, options);
+
+		// copy options directly to point
+		extend(point, options);
+		point.options = point.options ? extend(point.options, options) : options;
+			
+		// For higher dimension series types. For instance, for ranges, point.y is mapped to point.low.
+		if (pointValKey) {
+			point.y = point[pointValKey];
+		}
+		
+		// If no x is set by now, get auto incremented value. All points must have an
+		// x value, however the y value can be null to create a gap in the series
+		if (point.x === UNDEFINED && series) {
+			point.x = x === UNDEFINED ? series.autoIncrement() : x;
+		}
+		
+		return point;
+	},
+
+	/**
+	 * Transform number or array configs into objects
+	 */
+	optionsToObject: function (options) {
+		var ret,
+			series = this.series,
+			pointArrayMap = series.pointArrayMap || ['y'],
+			valueCount = pointArrayMap.length,
+			firstItemType,
+			i = 0,
+			j = 0;
+
+		if (typeof options === 'number' || options === null) {
+			ret = { y: options };
+
+		} else if (isArray(options)) {
+			ret = {};
+			// with leading x value
+			if (options.length > valueCount) {
+				firstItemType = typeof options[0];
+				if (firstItemType === 'string') {
+					ret.name = options[0];
+				} else if (firstItemType === 'number') {
+					ret.x = options[0];
+				}
+				i++;
+			}
+			while (j < valueCount) {
+				ret[pointArrayMap[j++]] = options[i++];
+			}			
+		} else if (typeof options === 'object') {
+			ret = options;
+
+			// This is the fastest way to detect if there are individual point dataLabels that need 
+			// to be considered in drawDataLabels. These can only occur in object configs.
+			if (options.dataLabels) {
+				series._hasPointLabels = true;
+			}
+
+			// Same approach as above for markers
+			if (options.marker) {
+				series._hasPointMarkers = true;
+			}
+		}
+		return ret;
+	},
+
+	/**
+	 * Destroy a point to clear memory. Its reference still stays in series.data.
+	 */
+	destroy: function () {
+		var point = this,
+			series = point.series,
+			chart = series.chart,
+			hoverPoints = chart.hoverPoints,
+			prop;
+
+		chart.pointCount--;
+
+		if (hoverPoints) {
+			point.setState();
+			erase(hoverPoints, point);
+			if (!hoverPoints.length) {
+				chart.hoverPoints = null;
+			}
+
+		}
+		if (point === chart.hoverPoint) {
+			point.onMouseOut();
+		}
+		
+		// remove all events
+		if (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive
+			removeEvent(point);
+			point.destroyElements();
+		}
+
+		if (point.legendItem) { // pies have legend items
+			chart.legend.destroyItem(point);
+		}
+
+		for (prop in point) {
+			point[prop] = null;
+		}
+
+
+	},
+
+	/**
+	 * Destroy SVG elements associated with the point
+	 */
+	destroyElements: function () {
+		var point = this,
+			props = ['graphic', 'dataLabel', 'dataLabelUpper', 'group', 'connector', 'shadowGroup'],
+			prop,
+			i = 6;
+		while (i--) {
+			prop = props[i];
+			if (point[prop]) {
+				point[prop] = point[prop].destroy();
+			}
+		}
+	},
+
+	/**
+	 * Return the configuration hash needed for the data label and tooltip formatters
+	 */
+	getLabelConfig: function () {
+		var point = this;
+		return {
+			x: point.category,
+			y: point.y,
+			key: point.name || point.category,
+			series: point.series,
+			point: point,
+			percentage: point.percentage,
+			total: point.total || point.stackTotal
+		};
+	},
+
+	/**
+	 * Toggle the selection status of a point
+	 * @param {Boolean} selected Whether to select or unselect the point.
+	 * @param {Boolean} accumulate Whether to add to the previous selection. By default,
+	 *     this happens if the control key (Cmd on Mac) was pressed during clicking.
+	 */
+	select: function (selected, accumulate) {
+		var point = this,
+			series = point.series,
+			chart = series.chart;
+
+		selected = pick(selected, !point.selected);
+
+		// fire the event with the defalut handler
+		point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {
+			point.selected = point.options.selected = selected;
+			series.options.data[inArray(point, series.data)] = point.options;
+			
+			point.setState(selected && SELECT_STATE);
+
+			// unselect all other points unless Ctrl or Cmd + click
+			if (!accumulate) {
+				each(chart.getSelectedPoints(), function (loopPoint) {
+					if (loopPoint.selected && loopPoint !== point) {
+						loopPoint.selected = loopPoint.options.selected = false;
+						series.options.data[inArray(loopPoint, series.data)] = loopPoint.options;
+						loopPoint.setState(NORMAL_STATE);
+						loopPoint.firePointEvent('unselect');
+					}
+				});
+			}
+		});
+	},
+
+	/**
+	 * Runs on mouse over the point
+	 */
+	onMouseOver: function (e) {
+		var point = this,
+			series = point.series,
+			chart = series.chart,
+			tooltip = chart.tooltip,
+			hoverPoint = chart.hoverPoint;
+
+		// set normal state to previous series
+		if (hoverPoint && hoverPoint !== point) {
+			hoverPoint.onMouseOut();
+		}
+
+		// trigger the event
+		point.firePointEvent('mouseOver');
+
+		// update the tooltip
+		if (tooltip && (!tooltip.shared || series.noSharedTooltip)) {
+			tooltip.refresh(point, e);
+		}
+
+		// hover this
+		point.setState(HOVER_STATE);
+		chart.hoverPoint = point;
+	},
+	
+	/**
+	 * Runs on mouse out from the point
+	 */
+	onMouseOut: function () {
+		var chart = this.series.chart,
+			hoverPoints = chart.hoverPoints;
+		
+		if (!hoverPoints || inArray(this, hoverPoints) === -1) { // #887
+			this.firePointEvent('mouseOut');
+	
+			this.setState();
+			chart.hoverPoint = null;
+		}
+	},
+
+	/**
+	 * Extendable method for formatting each point's tooltip line
+	 *
+	 * @return {String} A string to be concatenated in to the common tooltip text
+	 */
+	tooltipFormatter: function (pointFormat) {
+		
+		// Insert options for valueDecimals, valuePrefix, and valueSuffix
+		var series = this.series,
+			seriesTooltipOptions = series.tooltipOptions,
+			valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''),
+			valuePrefix = seriesTooltipOptions.valuePrefix || '',
+			valueSuffix = seriesTooltipOptions.valueSuffix || '';
+			
+		// Loop over the point array map and replace unformatted values with sprintf formatting markup
+		each(series.pointArrayMap || ['y'], function (key) {
+			key = '{point.' + key; // without the closing bracket
+			if (valuePrefix || valueSuffix) {
+				pointFormat = pointFormat.replace(key + '}', valuePrefix + key + '}' + valueSuffix);
+			}
+			pointFormat = pointFormat.replace(key + '}', key + ':,.' + valueDecimals + 'f}');
+		});
+		
+		return format(pointFormat, {
+			point: this,
+			series: this.series
+		});
+	},
+
+	/**
+	 * Update the point with new options (typically x/y data) and optionally redraw the series.
+	 *
+	 * @param {Object} options Point options as defined in the series.data array
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 *
+	 */
+	update: function (options, redraw, animation) {
+		var point = this,
+			series = point.series,
+			graphic = point.graphic,
+			i,
+			data = series.data,
+			chart = series.chart,
+			seriesOptions = series.options;
+
+		redraw = pick(redraw, true);
+
+		// fire the event with a default handler of doing the update
+		point.firePointEvent('update', { options: options }, function () {
+
+			point.applyOptions(options);
+
+			// update visuals
+			if (isObject(options)) {
+				series.getAttribs();
+				if (graphic) {
+					if (options.marker && options.marker.symbol) {
+						point.graphic = graphic.destroy();
+					} else {
+						graphic.attr(point.pointAttr[point.state || '']);
+					}
+				}
+			}
+
+			// record changes in the parallel arrays
+			i = inArray(point, data);
+			series.xData[i] = point.x;
+			series.yData[i] = series.toYData ? series.toYData(point) : point.y;
+			series.zData[i] = point.z;
+			seriesOptions.data[i] = point.options;
+
+			// redraw
+			series.isDirty = series.isDirtyData = true;
+			if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320
+				chart.isDirtyBox = true;
+			}
+			
+			if (seriesOptions.legendType === 'point') { // #1831, #1885
+				chart.legend.destroyItem(point);
+			}
+			if (redraw) {
+				chart.redraw(animation);
+			}
+		});
+	},
+
+	/**
+	 * Remove a point and optionally redraw the series and if necessary the axes
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+	remove: function (redraw, animation) {
+		var point = this,
+			series = point.series,
+			points = series.points,
+			chart = series.chart,
+			i,
+			data = series.data;
+
+		setAnimation(animation, chart);
+		redraw = pick(redraw, true);
+
+		// fire the event with a default handler of removing the point
+		point.firePointEvent('remove', null, function () {
+
+			// splice all the parallel arrays
+			i = inArray(point, data);
+			if (data.length === points.length) {
+				points.splice(i, 1);			
+			}
+			data.splice(i, 1);
+			series.options.data.splice(i, 1);
+			series.xData.splice(i, 1);
+			series.yData.splice(i, 1);
+			series.zData.splice(i, 1);
+
+			point.destroy();
+
+
+			// redraw
+			series.isDirty = true;
+			series.isDirtyData = true;
+			if (redraw) {
+				chart.redraw();
+			}
+		});
+
+
+	},
+
+	/**
+	 * Fire an event on the Point object. Must not be renamed to fireEvent, as this
+	 * causes a name clash in MooTools
+	 * @param {String} eventType
+	 * @param {Object} eventArgs Additional event arguments
+	 * @param {Function} defaultFunction Default event handler
+	 */
+	firePointEvent: function (eventType, eventArgs, defaultFunction) {
+		var point = this,
+			series = this.series,
+			seriesOptions = series.options;
+
+		// load event handlers on demand to save time on mouseover/out
+		if (seriesOptions.point.events[eventType] || (point.options && point.options.events && point.options.events[eventType])) {
+			this.importEvents();
+		}
+
+		// add default handler if in selection mode
+		if (eventType === 'click' && seriesOptions.allowPointSelect) {
+			defaultFunction = function (event) {
+				// Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera
+				point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);
+			};
+		}
+
+		fireEvent(this, eventType, eventArgs, defaultFunction);
+	},
+	/**
+	 * Import events from the series' and point's options. Only do it on
+	 * demand, to save processing time on hovering.
+	 */
+	importEvents: function () {
+		if (!this.hasImportedEvents) {
+			var point = this,
+				options = merge(point.series.options.point, point.options),
+				events = options.events,
+				eventType;
+
+			point.events = events;
+
+			for (eventType in events) {
+				addEvent(point, eventType, events[eventType]);
+			}
+			this.hasImportedEvents = true;
+
+		}
+	},
+
+	/**
+	 * Set the point's state
+	 * @param {String} state
+	 */
+	setState: function (state) {
+		var point = this,
+			plotX = point.plotX,
+			plotY = point.plotY,
+			series = point.series,
+			stateOptions = series.options.states,
+			markerOptions = defaultPlotOptions[series.type].marker && series.options.marker,
+			normalDisabled = markerOptions && !markerOptions.enabled,
+			markerStateOptions = markerOptions && markerOptions.states[state],
+			stateDisabled = markerStateOptions && markerStateOptions.enabled === false,
+			stateMarkerGraphic = series.stateMarkerGraphic,
+			pointMarker = point.marker || {},
+			chart = series.chart,
+			radius,
+			newSymbol,
+			pointAttr = point.pointAttr;
+
+		state = state || NORMAL_STATE; // empty string
+
+		if (
+				// already has this state
+				state === point.state ||
+				// selected points don't respond to hover
+				(point.selected && state !== SELECT_STATE) ||
+				// series' state options is disabled
+				(stateOptions[state] && stateOptions[state].enabled === false) ||
+				// point marker's state options is disabled
+				(state && (stateDisabled || (normalDisabled && !markerStateOptions.enabled)))
+
+			) {
+			return;
+		}
+
+		// apply hover styles to the existing point
+		if (point.graphic) {
+			radius = markerOptions && point.graphic.symbolName && pointAttr[state].r;
+			point.graphic.attr(merge(
+				pointAttr[state],
+				radius ? { // new symbol attributes (#507, #612)
+					x: plotX - radius,
+					y: plotY - radius,
+					width: 2 * radius,
+					height: 2 * radius
+				} : {}
+			));
+		} else {
+			// if a graphic is not applied to each point in the normal state, create a shared
+			// graphic for the hover state
+			if (state && markerStateOptions) {
+				radius = markerStateOptions.radius;
+				newSymbol = pointMarker.symbol || series.symbol;
+
+				// If the point has another symbol than the previous one, throw away the 
+				// state marker graphic and force a new one (#1459)
+				if (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {				
+					stateMarkerGraphic = stateMarkerGraphic.destroy();
+				}
+
+				// Add a new state marker graphic
+				if (!stateMarkerGraphic) {
+					series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(
+						newSymbol,
+						plotX - radius,
+						plotY - radius,
+						2 * radius,
+						2 * radius
+					)
+					.attr(pointAttr[state])
+					.add(series.markerGroup);
+					stateMarkerGraphic.currentSymbol = newSymbol;
+				
+				// Move the existing graphic
+				} else {
+					stateMarkerGraphic.attr({ // #1054
+						x: plotX - radius,
+						y: plotY - radius
+					});
+				}
+			}
+
+			if (stateMarkerGraphic) {
+				stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY) ? 'show' : 'hide']();
+			}
+		}
+
+		point.state = state;
+	}
+};
+
+/**
+ * @classDescription The base function which all other series types inherit from. The data in the series is stored
+ * in various arrays.
+ *
+ * - First, series.options.data contains all the original config options for
+ * each point whether added by options or methods like series.addPoint.
+ * - Next, series.data contains those values converted to points, but in case the series data length
+ * exceeds the cropThreshold, or if the data is grouped, series.data doesn't contain all the points. It
+ * only contains the points that have been created on demand.
+ * - Then there's series.points that contains all currently visible point objects. In case of cropping,
+ * the cropped-away points are not part of this array. The series.points array starts at series.cropStart
+ * compared to series.data and series.options.data. If however the series data is grouped, these can't
+ * be correlated one to one.
+ * - series.xData and series.processedXData contain clean x values, equivalent to series.data and series.points.
+ * - series.yData and series.processedYData contain clean x values, equivalent to series.data and series.points.
+ *
+ * @param {Object} chart
+ * @param {Object} options
+ */
+var Series = function () {};
+
+Series.prototype = {
+
+	isCartesian: true,
+	type: 'line',
+	pointClass: Point,
+	sorted: true, // requires the data to be sorted
+	requireSorting: true,
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		stroke: 'lineColor',
+		'stroke-width': 'lineWidth',
+		fill: 'fillColor',
+		r: 'radius'
+	},
+	colorCounter: 0,
+	init: function (chart, options) {
+		var series = this,
+			eventType,
+			events,
+			chartSeries = chart.series;
+
+		series.chart = chart;
+		series.options = options = series.setOptions(options); // merge with plotOptions
+		series.linkedSeries = [];
+
+		// bind the axes
+		series.bindAxes();
+
+		// set some variables
+		extend(series, {
+			name: options.name,
+			state: NORMAL_STATE,
+			pointAttr: {},
+			visible: options.visible !== false, // true by default
+			selected: options.selected === true // false by default
+		});
+		
+		// special
+		if (useCanVG) {
+			options.animation = false;
+		}
+
+		// register event listeners
+		events = options.events;
+		for (eventType in events) {
+			addEvent(series, eventType, events[eventType]);
+		}
+		if (
+			(events && events.click) ||
+			(options.point && options.point.events && options.point.events.click) ||
+			options.allowPointSelect
+		) {
+			chart.runTrackerClick = true;
+		}
+
+		series.getColor();
+		series.getSymbol();
+
+		// set the data
+		series.setData(options.data, false);
+		
+		// Mark cartesian
+		if (series.isCartesian) {
+			chart.hasCartesianSeries = true;
+		}
+
+		// Register it in the chart
+		chartSeries.push(series);
+		series._i = chartSeries.length - 1;
+		
+		// Sort series according to index option (#248, #1123)
+		stableSort(chartSeries, function (a, b) {
+			return pick(a.options.index, a._i) - pick(b.options.index, a._i);
+		});
+		each(chartSeries, function (series, i) {
+			series.index = i;
+			series.name = series.name || 'Series ' + (i + 1);
+		});
+
+	},
+	
+	/**
+	 * Set the xAxis and yAxis properties of cartesian series, and register the series
+	 * in the axis.series array
+	 */
+	bindAxes: function () {
+		var series = this,
+			seriesOptions = series.options,
+			chart = series.chart,
+			axisOptions;
+			
+		if (series.isCartesian) {
+			
+			each(['xAxis', 'yAxis'], function (AXIS) { // repeat for xAxis and yAxis
+				
+				each(chart[AXIS], function (axis) { // loop through the chart's axis objects
+					
+					axisOptions = axis.options;
+					
+					// apply if the series xAxis or yAxis option mathches the number of the 
+					// axis, or if undefined, use the first axis
+					if ((seriesOptions[AXIS] === axisOptions.index) ||
+							(seriesOptions[AXIS] !== UNDEFINED && seriesOptions[AXIS] === axisOptions.id) ||
+							(seriesOptions[AXIS] === UNDEFINED && axisOptions.index === 0)) {
+						
+						// register this series in the axis.series lookup
+						axis.series.push(series);
+						
+						// set this series.xAxis or series.yAxis reference
+						series[AXIS] = axis;
+						
+						// mark dirty for redraw
+						axis.isDirty = true;
+					}
+				});
+
+				// The series needs an X and an Y axis
+				if (!series[AXIS]) {
+					error(18, true);
+				}
+
+			});
+		}
+	},
+
+
+	/**
+	 * Return an auto incremented x value based on the pointStart and pointInterval options.
+	 * This is only used if an x value is not given for the point that calls autoIncrement.
+	 */
+	autoIncrement: function () {
+		var series = this,
+			options = series.options,
+			xIncrement = series.xIncrement;
+
+		xIncrement = pick(xIncrement, options.pointStart, 0);
+
+		series.pointInterval = pick(series.pointInterval, options.pointInterval, 1);
+
+		series.xIncrement = xIncrement + series.pointInterval;
+		return xIncrement;
+	},
+
+	/**
+	 * Divide the series data into segments divided by null values.
+	 */
+	getSegments: function () {
+		var series = this,
+			lastNull = -1,
+			segments = [],
+			i,
+			points = series.points,
+			pointsLength = points.length;
+
+		if (pointsLength) { // no action required for []
+			
+			// if connect nulls, just remove null points
+			if (series.options.connectNulls) {
+				i = pointsLength;
+				while (i--) {
+					if (points[i].y === null) {
+						points.splice(i, 1);
+					}
+				}
+				if (points.length) {
+					segments = [points];
+				}
+				
+			// else, split on null points
+			} else {
+				each(points, function (point, i) {
+					if (point.y === null) {
+						if (i > lastNull + 1) {
+							segments.push(points.slice(lastNull + 1, i));
+						}
+						lastNull = i;
+					} else if (i === pointsLength - 1) { // last value
+						segments.push(points.slice(lastNull + 1, i + 1));
+					}
+				});
+			}
+		}
+		
+		// register it
+		series.segments = segments;
+	},
+	
+	/**
+	 * Set the series options by merging from the options tree
+	 * @param {Object} itemOptions
+	 */
+	setOptions: function (itemOptions) {
+		var chart = this.chart,
+			chartOptions = chart.options,
+			plotOptions = chartOptions.plotOptions,
+			typeOptions = plotOptions[this.type],
+			options;
+
+		this.userOptions = itemOptions;
+
+		options = merge(
+			typeOptions,
+			plotOptions.series,
+			itemOptions
+		);
+		
+		// the tooltip options are merged between global and series specific options
+		this.tooltipOptions = merge(chartOptions.tooltip, options.tooltip);
+		
+		// Delte marker object if not allowed (#1125)
+		if (typeOptions.marker === null) {
+			delete options.marker;
+		}
+		
+		return options;
+
+	},
+	/**
+	 * Get the series' color
+	 */
+	getColor: function () {
+		var options = this.options,
+			userOptions = this.userOptions,
+			defaultColors = this.chart.options.colors,
+			counters = this.chart.counters,
+			color,
+			colorIndex;
+
+		color = options.color || defaultPlotOptions[this.type].color;
+
+		if (!color && !options.colorByPoint) {
+			if (defined(userOptions._colorIndex)) { // after Series.update()
+				colorIndex = userOptions._colorIndex;
+			} else {
+				userOptions._colorIndex = counters.color;
+				colorIndex = counters.color++;
+			}
+			color = defaultColors[colorIndex];
+		}
+		
+		this.color = color;
+		counters.wrapColor(defaultColors.length);
+	},
+	/**
+	 * Get the series' symbol
+	 */
+	getSymbol: function () {
+		var series = this,
+			userOptions = series.userOptions,
+			seriesMarkerOption = series.options.marker,
+			chart = series.chart,
+			defaultSymbols = chart.options.symbols,
+			counters = chart.counters,
+			symbolIndex;
+
+		series.symbol = seriesMarkerOption.symbol;
+		if (!series.symbol) {
+			if (defined(userOptions._symbolIndex)) { // after Series.update()
+				symbolIndex = userOptions._symbolIndex;
+			} else {
+				userOptions._symbolIndex = counters.symbol;
+				symbolIndex = counters.symbol++;
+			}
+			series.symbol = defaultSymbols[symbolIndex];
+		}
+
+		// don't substract radius in image symbols (#604)
+		if (/^url/.test(series.symbol)) {
+			seriesMarkerOption.radius = 0;
+		}
+		counters.wrapSymbol(defaultSymbols.length);
+	},
+
+	/**
+	 * Get the series' symbol in the legend. This method should be overridable to create custom 
+	 * symbols through Highcharts.seriesTypes[type].prototype.drawLegendSymbols.
+	 * 
+	 * @param {Object} legend The legend object
+	 */
+	drawLegendSymbol: function (legend) {
+		
+		var options = this.options,
+			markerOptions = options.marker,
+			radius,
+			legendOptions = legend.options,
+			legendSymbol,
+			symbolWidth = legendOptions.symbolWidth,
+			renderer = this.chart.renderer,
+			legendItemGroup = this.legendGroup,
+			verticalCenter = legend.baseline - mathRound(renderer.fontMetrics(legendOptions.itemStyle.fontSize).b * 0.3),
+			attr;
+			
+		// Draw the line
+		if (options.lineWidth) {
+			attr = {
+				'stroke-width': options.lineWidth
+			};
+			if (options.dashStyle) {
+				attr.dashstyle = options.dashStyle;
+			}
+			this.legendLine = renderer.path([
+				M,
+				0,
+				verticalCenter,
+				L,
+				symbolWidth,
+				verticalCenter
+			])
+			.attr(attr)
+			.add(legendItemGroup);
+		}
+		
+		// Draw the marker
+		if (markerOptions && markerOptions.enabled) {
+			radius = markerOptions.radius;
+			this.legendSymbol = legendSymbol = renderer.symbol(
+				this.symbol,
+				(symbolWidth / 2) - radius,
+				verticalCenter - radius,
+				2 * radius,
+				2 * radius
+			)
+			.add(legendItemGroup);
+			legendSymbol.isMarker = true;
+		}
+	},
+
+	/**
+	 * Add a point dynamically after chart load time
+	 * @param {Object} options Point options as given in series.data
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean} shift If shift is true, a point is shifted off the start
+	 *    of the series as one is appended to the end.
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+	addPoint: function (options, redraw, shift, animation) {
+		var series = this,
+			seriesOptions = series.options,
+			data = series.data,
+			graph = series.graph,
+			area = series.area,
+			chart = series.chart,
+			xData = series.xData,
+			yData = series.yData,
+			zData = series.zData,
+			names = series.names,
+			currentShift = (graph && graph.shift) || 0,
+			dataOptions = seriesOptions.data,
+			point,
+			isInTheMiddle,
+			x,
+			i;
+
+		setAnimation(animation, chart);
+
+		// Make graph animate sideways
+		if (shift) {
+			each([graph, area, series.graphNeg, series.areaNeg], function (shape) {
+				if (shape) {
+					shape.shift = currentShift + 1;
+				}
+			});
+		}
+		if (area) {
+			area.isArea = true; // needed in animation, both with and without shift
+		}
+		
+		// Optional redraw, defaults to true
+		redraw = pick(redraw, true);
+
+		// Get options and push the point to xData, yData and series.options. In series.generatePoints
+		// the Point instance will be created on demand and pushed to the series.data array.
+		point = { series: series };
+		series.pointClass.prototype.applyOptions.apply(point, [options]);
+		x = point.x;
+
+		// Get the insertion point
+		i = xData.length;
+		if (series.requireSorting && x < xData[i - 1]) {
+			isInTheMiddle = true;
+			while (i && xData[i - 1] > x) {
+				i--;
+			}
+		}
+		
+		xData.splice(i, 0, x);
+		yData.splice(i, 0, series.toYData ? series.toYData(point) : point.y);
+		zData.splice(i, 0, point.z);
+		if (names) {
+			names[x] = point.name;
+		}
+		dataOptions.splice(i, 0, options);
+
+		if (isInTheMiddle) {
+			series.data.splice(i, 0, null);
+			series.processData();
+		}
+		
+		// Generate points to be added to the legend (#1329) 
+		if (seriesOptions.legendType === 'point') {
+			series.generatePoints();
+		}
+
+		// Shift the first point off the parallel arrays
+		// todo: consider series.removePoint(i) method
+		if (shift) {
+			if (data[0] && data[0].remove) {
+				data[0].remove(false);
+			} else {
+				data.shift();
+				xData.shift();
+				yData.shift();
+				zData.shift();
+				dataOptions.shift();
+			}
+		}
+
+		// redraw
+		series.isDirty = true;
+		series.isDirtyData = true;
+		if (redraw) {
+			series.getAttribs(); // #1937
+			chart.redraw();
+		}
+	},
+
+	/**
+	 * Replace the series data with a new set of data
+	 * @param {Object} data
+	 * @param {Object} redraw
+	 */
+	setData: function (data, redraw) {
+		var series = this,
+			oldData = series.points,
+			options = series.options,
+			chart = series.chart,
+			firstPoint = null,
+			xAxis = series.xAxis,
+			names = xAxis && xAxis.categories && !xAxis.categories.length ? [] : null,
+			i;
+
+		// reset properties
+		series.xIncrement = null;
+		series.pointRange = xAxis && xAxis.categories ? 1 : options.pointRange;
+
+		series.colorCounter = 0; // for series with colorByPoint (#1547)
+		
+		// parallel arrays
+		var xData = [],
+			yData = [],
+			zData = [],
+			dataLength = data ? data.length : [],
+			turboThreshold = pick(options.turboThreshold, 1000),
+			pt,
+			pointArrayMap = series.pointArrayMap,
+			valueCount = pointArrayMap && pointArrayMap.length,
+			hasToYData = !!series.toYData;
+
+		// In turbo mode, only one- or twodimensional arrays of numbers are allowed. The
+		// first value is tested, and we assume that all the rest are defined the same
+		// way. Although the 'for' loops are similar, they are repeated inside each
+		// if-else conditional for max performance.
+		if (turboThreshold && dataLength > turboThreshold) { 
+			
+			// find the first non-null point
+			i = 0;
+			while (firstPoint === null && i < dataLength) {
+				firstPoint = data[i];
+				i++;
+			}
+		
+		
+			if (isNumber(firstPoint)) { // assume all points are numbers
+				var x = pick(options.pointStart, 0),
+					pointInterval = pick(options.pointInterval, 1);
+
+				for (i = 0; i < dataLength; i++) {
+					xData[i] = x;
+					yData[i] = data[i];
+					x += pointInterval;
+				}
+				series.xIncrement = x;
+			} else if (isArray(firstPoint)) { // assume all points are arrays
+				if (valueCount) { // [x, low, high] or [x, o, h, l, c]
+					for (i = 0; i < dataLength; i++) {
+						pt = data[i];
+						xData[i] = pt[0];
+						yData[i] = pt.slice(1, valueCount + 1);
+					}
+				} else { // [x, y]
+					for (i = 0; i < dataLength; i++) {
+						pt = data[i];
+						xData[i] = pt[0];
+						yData[i] = pt[1];
+					}
+				}
+			} else {
+				error(12); // Highcharts expects configs to be numbers or arrays in turbo mode
+			}
+		} else {
+			for (i = 0; i < dataLength; i++) {
+				if (data[i] !== UNDEFINED) { // stray commas in oldIE
+					pt = { series: series };
+					series.pointClass.prototype.applyOptions.apply(pt, [data[i]]);
+					xData[i] = pt.x;
+					yData[i] = hasToYData ? series.toYData(pt) : pt.y;
+					zData[i] = pt.z;
+					if (names && pt.name) {
+						names[pt.x] = pt.name; // #2046
+					}
+				}
+			}
+		}
+		
+		// Forgetting to cast strings to numbers is a common caveat when handling CSV or JSON		
+		if (isString(yData[0])) {
+			error(14, true);
+		} 
+
+		series.data = [];
+		series.options.data = data;
+		series.xData = xData;
+		series.yData = yData;
+		series.zData = zData;
+		series.names = names;
+
+		// destroy old points
+		i = (oldData && oldData.length) || 0;
+		while (i--) {
+			if (oldData[i] && oldData[i].destroy) {
+				oldData[i].destroy();
+			}
+		}
+
+		// reset minRange (#878)
+		if (xAxis) {
+			xAxis.minRange = xAxis.userMinRange;
+		}
+
+		// redraw
+		series.isDirty = series.isDirtyData = chart.isDirtyBox = true;
+		if (pick(redraw, true)) {
+			chart.redraw(false);
+		}
+	},
+
+	/**
+	 * Remove a series and optionally redraw the chart
+	 *
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+
+	remove: function (redraw, animation) {
+		var series = this,
+			chart = series.chart;
+		redraw = pick(redraw, true);
+
+		if (!series.isRemoving) {  /* prevent triggering native event in jQuery
+				(calling the remove function from the remove event) */
+			series.isRemoving = true;
+
+			// fire the event with a default handler of removing the point
+			fireEvent(series, 'remove', null, function () {
+
+
+				// destroy elements
+				series.destroy();
+
+
+				// redraw
+				chart.isDirtyLegend = chart.isDirtyBox = true;
+				chart.linkSeries();
+				
+				if (redraw) {
+					chart.redraw(animation);
+				}
+			});
+
+		}
+		series.isRemoving = false;
+	},
+
+	/**
+	 * Process the data by cropping away unused data points if the series is longer
+	 * than the crop threshold. This saves computing time for lage series.
+	 */
+	processData: function (force) {
+		var series = this,
+			processedXData = series.xData, // copied during slice operation below
+			processedYData = series.yData,
+			dataLength = processedXData.length,
+			croppedData,
+			cropStart = 0,
+			cropped,
+			distance,
+			closestPointRange,
+			xAxis = series.xAxis,
+			i, // loop variable
+			options = series.options,
+			cropThreshold = options.cropThreshold,
+			isCartesian = series.isCartesian;
+
+		// If the series data or axes haven't changed, don't go through this. Return false to pass
+		// the message on to override methods like in data grouping. 
+		if (isCartesian && !series.isDirty && !xAxis.isDirty && !series.yAxis.isDirty && !force) {
+			return false;
+		}
+		
+
+		// optionally filter out points outside the plot area
+		if (isCartesian && series.sorted && (!cropThreshold || dataLength > cropThreshold || series.forceCrop)) {
+			var min = xAxis.min,
+				max = xAxis.max;
+
+			// it's outside current extremes
+			if (processedXData[dataLength - 1] < min || processedXData[0] > max) {
+				processedXData = [];
+				processedYData = [];
+			
+			// only crop if it's actually spilling out
+			} else if (processedXData[0] < min || processedXData[dataLength - 1] > max) {
+				croppedData = this.cropData(series.xData, series.yData, min, max);
+				processedXData = croppedData.xData;
+				processedYData = croppedData.yData;
+				cropStart = croppedData.start;
+				cropped = true;
+			}
+		}
+		
+		
+		// Find the closest distance between processed points
+		for (i = processedXData.length - 1; i >= 0; i--) {
+			distance = processedXData[i] - processedXData[i - 1];
+			if (distance > 0 && (closestPointRange === UNDEFINED || distance < closestPointRange)) {
+				closestPointRange = distance;
+
+			// Unsorted data is not supported by the line tooltip, as well as data grouping and 
+			// navigation in Stock charts (#725) and width calculation of columns (#1900)
+			} else if (distance < 0 && series.requireSorting) {
+				error(15);
+			}
+		}
+
+		// Record the properties
+		series.cropped = cropped; // undefined or true
+		series.cropStart = cropStart;
+		series.processedXData = processedXData;
+		series.processedYData = processedYData;
+
+		if (options.pointRange === null) { // null means auto, as for columns, candlesticks and OHLC
+			series.pointRange = closestPointRange || 1;
+		}
+		series.closestPointRange = closestPointRange;
+		
+	},
+
+	/**
+	 * Iterate over xData and crop values between min and max. Returns object containing crop start/end
+	 * cropped xData with corresponding part of yData, dataMin and dataMax within the cropped range
+	 */
+	cropData: function (xData, yData, min, max) {
+		var dataLength = xData.length,
+			cropStart = 0,
+			cropEnd = dataLength,
+			cropShoulder = pick(this.cropShoulder, 1), // line-type series need one point outside
+			i;
+
+		// iterate up to find slice start
+		for (i = 0; i < dataLength; i++) {
+			if (xData[i] >= min) {
+				cropStart = mathMax(0, i - cropShoulder);
+				break;
+			}
+		}
+
+		// proceed to find slice end
+		for (; i < dataLength; i++) {
+			if (xData[i] > max) {
+				cropEnd = i + cropShoulder;
+				break;
+			}
+		}
+
+		return {
+			xData: xData.slice(cropStart, cropEnd),
+			yData: yData.slice(cropStart, cropEnd),
+			start: cropStart,
+			end: cropEnd
+		};
+	},
+
+
+	/**
+	 * Generate the data point after the data has been processed by cropping away
+	 * unused points and optionally grouped in Highcharts Stock.
+	 */
+	generatePoints: function () {
+		var series = this,
+			options = series.options,
+			dataOptions = options.data,
+			data = series.data,
+			dataLength,
+			processedXData = series.processedXData,
+			processedYData = series.processedYData,
+			pointClass = series.pointClass,
+			processedDataLength = processedXData.length,
+			cropStart = series.cropStart || 0,
+			cursor,
+			hasGroupedData = series.hasGroupedData,
+			point,
+			points = [],
+			i;
+
+		if (!data && !hasGroupedData) {
+			var arr = [];
+			arr.length = dataOptions.length;
+			data = series.data = arr;
+		}
+
+		for (i = 0; i < processedDataLength; i++) {
+			cursor = cropStart + i;
+			if (!hasGroupedData) {
+				if (data[cursor]) {
+					point = data[cursor];
+				} else if (dataOptions[cursor] !== UNDEFINED) { // #970
+					data[cursor] = point = (new pointClass()).init(series, dataOptions[cursor], processedXData[i]);
+				}
+				points[i] = point;
+			} else {
+				// splat the y data in case of ohlc data array
+				points[i] = (new pointClass()).init(series, [processedXData[i]].concat(splat(processedYData[i])));
+			}
+		}
+
+		// Hide cropped-away points - this only runs when the number of points is above cropThreshold, or when
+		// swithching view from non-grouped data to grouped data (#637)	
+		if (data && (processedDataLength !== (dataLength = data.length) || hasGroupedData)) {
+			for (i = 0; i < dataLength; i++) {
+				if (i === cropStart && !hasGroupedData) { // when has grouped data, clear all points
+					i += processedDataLength;
+				}
+				if (data[i]) {
+					data[i].destroyElements();
+					data[i].plotX = UNDEFINED; // #1003
+				}
+			}
+		}
+
+		series.data = data;
+		series.points = points;
+	},
+
+	/**
+	 * Adds series' points value to corresponding stack
+	 */
+	setStackedPoints: function () {
+		if (!this.options.stacking || (this.visible !== true && this.chart.options.chart.ignoreHiddenSeries !== false)) {
+			return;
+		}
+
+		var series = this,
+			xData = series.processedXData,
+			yData = series.processedYData,
+			stackedYData = [],
+			yDataLength = yData.length,
+			seriesOptions = series.options,
+			threshold = seriesOptions.threshold,
+			stackOption = seriesOptions.stack,
+			stacking = seriesOptions.stacking,
+			stackKey = series.stackKey,
+			negKey = '-' + stackKey,
+			negStacks = series.negStacks,
+			yAxis = series.yAxis,
+			stacks = yAxis.stacks,
+			oldStacks = yAxis.oldStacks,
+			isNegative,
+			stack,
+			other,
+			key,
+			i,
+			x,
+			y;
+
+		// loop over the non-null y values and read them into a local array
+		for (i = 0; i < yDataLength; i++) {
+			x = xData[i];
+			y = yData[i];
+
+			// Read stacked values into a stack based on the x value,
+			// the sign of y and the stack key. Stacking is also handled for null values (#739)
+			isNegative = negStacks && y < threshold;
+			key = isNegative ? negKey : stackKey;
+
+			// Create empty object for this stack if it doesn't exist yet
+			if (!stacks[key]) {
+				stacks[key] = {};
+			}
+
+			// Initialize StackItem for this x
+			if (!stacks[key][x]) {
+				if (oldStacks[key] && oldStacks[key][x]) {
+					stacks[key][x] = oldStacks[key][x];
+					stacks[key][x].total = null;
+				} else {
+					stacks[key][x] = new StackItem(yAxis, yAxis.options.stackLabels, isNegative, x, stackOption, stacking);
+				}
+			}
+
+			// If the StackItem doesn't exist, create it first
+			stack = stacks[key][x];
+			stack.points[series.index] = [stack.cum || 0];
+
+			// Add value to the stack total
+			if (stacking === 'percent') {
+				
+				// Percent stacked column, totals are the same for the positive and negative stacks
+				other = isNegative ? stackKey : negKey;
+				if (negStacks && stacks[other] && stacks[other][x]) {
+					other = stacks[other][x];
+					stack.total = other.total = mathMax(other.total, stack.total) + mathAbs(y) || 0;
+
+				// Percent stacked areas					
+				} else {
+					stack.total += mathAbs(y) || 0;
+				}
+			} else {
+				stack.total += y || 0;
+			}
+
+			stack.cum = (stack.cum || 0) + (y || 0);
+
+			stack.points[series.index].push(stack.cum);
+			stackedYData[i] = stack.cum;
+
+		}
+
+		if (stacking === 'percent') {
+			yAxis.usePercentage = true;
+		}
+
+		this.stackedYData = stackedYData; // To be used in getExtremes
+		
+		// Reset old stacks
+		yAxis.oldStacks = {};
+	},
+
+	/**
+	 * Iterate over all stacks and compute the absolute values to percent
+	 */
+	setPercentStacks: function () {
+		var series = this,
+			stackKey = series.stackKey,
+			stacks = series.yAxis.stacks;
+		
+		each([stackKey, '-' + stackKey], function (key) {
+			var i = series.xData.length,
+				x,
+				stack,
+				pointExtremes,
+				totalFactor;
+
+			while (i--) {
+				x = series.xData[i];
+				stack = stacks[key] && stacks[key][x];
+				pointExtremes = stack && stack.points[series.index];
+				if (pointExtremes) {
+					totalFactor = stack.total ? 100 / stack.total : 0;
+					pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor); // Y bottom value
+					pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor); // Y value
+					series.stackedYData[i] = pointExtremes[1];
+				}
+			}
+		});
+	},
+
+	/**
+	 * Calculate Y extremes for visible data
+	 */
+	getExtremes: function () {
+		var xAxis = this.xAxis,
+			yAxis = this.yAxis,
+			xData = this.processedXData,
+			yData = this.stackedYData || this.processedYData,
+			yDataLength = yData.length,
+			activeYData = [],
+			activeCounter = 0,
+			xExtremes = xAxis.getExtremes(), // #2117, need to compensate for log X axis
+			xMin = xExtremes.min,
+			xMax = xExtremes.max,
+			validValue,
+			withinRange,
+			dataMin,
+			dataMax,
+			x,
+			y,
+			i,
+			j;
+
+		for (i = 0; i < yDataLength; i++) {
+			
+			x = xData[i];
+			y = yData[i];
+
+			// For points within the visible range, including the first point outside the
+			// visible range, consider y extremes
+			validValue = y !== null && y !== UNDEFINED && (!yAxis.isLog || (y.length || y > 0));
+			withinRange = this.getExtremesFromAll || this.cropped || ((xData[i + 1] || x) >= xMin && 
+				(xData[i - 1] || x) <= xMax);
+
+			if (validValue && withinRange) {
+
+				j = y.length;
+				if (j) { // array, like ohlc or range data
+					while (j--) {
+						if (y[j] !== null) {
+							activeYData[activeCounter++] = y[j];
+						}
+					}
+				} else {
+					activeYData[activeCounter++] = y;
+				}
+			}
+		}
+		this.dataMin = pick(dataMin, arrayMin(activeYData));
+		this.dataMax = pick(dataMax, arrayMax(activeYData));
+	},
+
+	/**
+	 * Translate data points from raw data values to chart specific positioning data
+	 * needed later in drawPoints, drawGraph and drawTracker.
+	 */
+	translate: function () {
+		if (!this.processedXData) { // hidden series
+			this.processData();
+		}
+		this.generatePoints();
+		var series = this,
+			options = series.options,
+			stacking = options.stacking,
+			xAxis = series.xAxis,
+			categories = xAxis.categories,
+			yAxis = series.yAxis,
+			points = series.points,
+			dataLength = points.length,
+			hasModifyValue = !!series.modifyValue,
+			i,
+			pointPlacement = options.pointPlacement,
+			dynamicallyPlaced = pointPlacement === 'between' || isNumber(pointPlacement),
+			threshold = options.threshold;
+
+		
+		// Translate each point
+		for (i = 0; i < dataLength; i++) {
+			var point = points[i],
+				xValue = point.x,
+				yValue = point.y,
+				yBottom = point.low,
+				stack = yAxis.stacks[(series.negStacks && yValue < threshold ? '-' : '') + series.stackKey],
+				pointStack,
+				stackValues;
+
+			// Discard disallowed y values for log axes
+			if (yAxis.isLog && yValue <= 0) {
+				point.y = yValue = null;
+			}
+			
+			// Get the plotX translation
+			point.plotX = xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement, this.type === 'flags'); // Math.round fixes #591
+			
+
+			// Calculate the bottom y value for stacked series
+			if (stacking && series.visible && stack && stack[xValue]) {
+
+				pointStack = stack[xValue];
+				stackValues = pointStack.points[series.index];
+				yBottom = stackValues[0];
+				yValue = stackValues[1];
+
+				if (yBottom === 0) {
+					yBottom = pick(threshold, yAxis.min);
+				}
+				if (yAxis.isLog && yBottom <= 0) { // #1200, #1232
+					yBottom = null;
+				}
+
+				point.percentage = stacking === 'percent' && yValue;
+				point.total = point.stackTotal = pointStack.total;
+				point.stackY = yValue;
+
+				// Place the stack label
+				pointStack.setOffset(series.pointXOffset || 0, series.barW || 0);
+				
+			}
+
+			// Set translated yBottom or remove it
+			point.yBottom = defined(yBottom) ? 
+				yAxis.translate(yBottom, 0, 1, 0, 1) :
+				null;
+				
+			// general hook, used for Highstock compare mode
+			if (hasModifyValue) {
+				yValue = series.modifyValue(yValue, point);
+			}
+
+			// Set the the plotY value, reset it for redraws
+			point.plotY = (typeof yValue === 'number' && yValue !== Infinity) ? 
+				//mathRound(yAxis.translate(yValue, 0, 1, 0, 1) * 10) / 10 : // Math.round fixes #591
+				yAxis.translate(yValue, 0, 1, 0, 1) : 
+				UNDEFINED;
+			
+			// Set client related positions for mouse tracking
+			point.clientX = dynamicallyPlaced ? xAxis.translate(xValue, 0, 0, 0, 1) : point.plotX; // #1514
+				
+			point.negative = point.y < (threshold || 0);
+
+			// some API data
+			point.category = categories && categories[point.x] !== UNDEFINED ?
+				categories[point.x] : point.x;
+
+
+		}
+
+		// now that we have the cropped data, build the segments
+		series.getSegments();
+	},
+	/**
+	 * Memoize tooltip texts and positions
+	 */
+	setTooltipPoints: function (renew) {
+		var series = this,
+			points = [],
+			pointsLength,
+			low,
+			high,
+			xAxis = series.xAxis,
+			xExtremes = xAxis && xAxis.getExtremes(),
+			axisLength = xAxis ? (xAxis.tooltipLen || xAxis.len) : series.chart.plotSizeX, // tooltipLen and tooltipPosName used in polar
+			point,
+			pointX,
+			nextPoint,
+			i,
+			tooltipPoints = []; // a lookup array for each pixel in the x dimension
+
+		// don't waste resources if tracker is disabled
+		if (series.options.enableMouseTracking === false) {
+			return;
+		}
+
+		// renew
+		if (renew) {
+			series.tooltipPoints = null;
+		}
+
+		// concat segments to overcome null values
+		each(series.segments || series.points, function (segment) {
+			points = points.concat(segment);
+		});
+
+		// Reverse the points in case the X axis is reversed
+		if (xAxis && xAxis.reversed) {
+			points = points.reverse();
+		}
+
+		// Polar needs additional shaping
+		if (series.orderTooltipPoints) {
+			series.orderTooltipPoints(points);
+		}
+
+		// Assign each pixel position to the nearest point
+		pointsLength = points.length;
+		for (i = 0; i < pointsLength; i++) {
+			point = points[i];
+			pointX = point.x;
+			if (pointX >= xExtremes.min && pointX <= xExtremes.max) { // #1149
+				nextPoint = points[i + 1];
+				
+				// Set this range's low to the last range's high plus one
+				low = high === UNDEFINED ? 0 : high + 1;
+				// Now find the new high
+				high = points[i + 1] ?
+					mathMin(mathMax(0, mathFloor( // #2070
+						(point.clientX + (nextPoint ? (nextPoint.wrappedClientX || nextPoint.clientX) : axisLength)) / 2
+					)), axisLength) :
+					axisLength;
+
+				while (low >= 0 && low <= high) {
+					tooltipPoints[low++] = point;
+				}
+			}
+		}
+		series.tooltipPoints = tooltipPoints;
+	},
+
+	/**
+	 * Format the header of the tooltip
+	 */
+	tooltipHeaderFormatter: function (point) {
+		var series = this,
+			tooltipOptions = series.tooltipOptions,
+			xDateFormat = tooltipOptions.xDateFormat,
+			dateTimeLabelFormats = tooltipOptions.dateTimeLabelFormats,
+			xAxis = series.xAxis,
+			isDateTime = xAxis && xAxis.options.type === 'datetime',
+			headerFormat = tooltipOptions.headerFormat,
+			closestPointRange = xAxis && xAxis.closestPointRange,
+			n;
+			
+		// Guess the best date format based on the closest point distance (#568)
+		if (isDateTime && !xDateFormat) {
+			if (closestPointRange) {
+				for (n in timeUnits) {
+					if (timeUnits[n] >= closestPointRange) {
+						xDateFormat = dateTimeLabelFormats[n];
+						break;
+					}
+				}
+			} else {
+				xDateFormat = dateTimeLabelFormats.day;
+			}
+		}
+		
+		// Insert the header date format if any
+		if (isDateTime && xDateFormat && isNumber(point.key)) {
+			headerFormat = headerFormat.replace('{point.key}', '{point.key:' + xDateFormat + '}');
+		}
+		
+		return format(headerFormat, {
+			point: point,
+			series: series
+		});
+	},
+
+	/**
+	 * Series mouse over handler
+	 */
+	onMouseOver: function () {
+		var series = this,
+			chart = series.chart,
+			hoverSeries = chart.hoverSeries;
+
+		// set normal state to previous series
+		if (hoverSeries && hoverSeries !== series) {
+			hoverSeries.onMouseOut();
+		}
+
+		// trigger the event, but to save processing time,
+		// only if defined
+		if (series.options.events.mouseOver) {
+			fireEvent(series, 'mouseOver');
+		}
+
+		// hover this
+		series.setState(HOVER_STATE);
+		chart.hoverSeries = series;
+	},
+
+	/**
+	 * Series mouse out handler
+	 */
+	onMouseOut: function () {
+		// trigger the event only if listeners exist
+		var series = this,
+			options = series.options,
+			chart = series.chart,
+			tooltip = chart.tooltip,
+			hoverPoint = chart.hoverPoint;
+
+		// trigger mouse out on the point, which must be in this series
+		if (hoverPoint) {
+			hoverPoint.onMouseOut();
+		}
+
+		// fire the mouse out event
+		if (series && options.events.mouseOut) {
+			fireEvent(series, 'mouseOut');
+		}
+
+
+		// hide the tooltip
+		if (tooltip && !options.stickyTracking && (!tooltip.shared || series.noSharedTooltip)) {
+			tooltip.hide();
+		}
+
+		// set normal state
+		series.setState();
+		chart.hoverSeries = null;
+	},
+
+	/**
+	 * Animate in the series
+	 */
+	animate: function (init) {
+		var series = this,
+			chart = series.chart,
+			renderer = chart.renderer,
+			clipRect,
+			markerClipRect,
+			animation = series.options.animation,
+			clipBox = chart.clipBox,
+			inverted = chart.inverted,
+			sharedClipKey;
+
+		// Animation option is set to true
+		if (animation && !isObject(animation)) {
+			animation = defaultPlotOptions[series.type].animation;
+		}
+		sharedClipKey = '_sharedClip' + animation.duration + animation.easing;
+
+		// Initialize the animation. Set up the clipping rectangle.
+		if (init) { 
+			
+			// If a clipping rectangle with the same properties is currently present in the chart, use that. 
+			clipRect = chart[sharedClipKey];
+			markerClipRect = chart[sharedClipKey + 'm'];
+			if (!clipRect) {
+				chart[sharedClipKey] = clipRect = renderer.clipRect(
+					extend(clipBox, { width: 0 })
+				);
+				
+				chart[sharedClipKey + 'm'] = markerClipRect = renderer.clipRect(
+					-99, // include the width of the first marker
+					inverted ? -chart.plotLeft : -chart.plotTop, 
+					99,
+					inverted ? chart.chartWidth : chart.chartHeight
+				);
+			}
+			series.group.clip(clipRect);
+			series.markerGroup.clip(markerClipRect);
+			series.sharedClipKey = sharedClipKey;
+
+		// Run the animation
+		} else { 
+			clipRect = chart[sharedClipKey];
+			if (clipRect) {
+				clipRect.animate({
+					width: chart.plotSizeX
+				}, animation);
+				chart[sharedClipKey + 'm'].animate({
+					width: chart.plotSizeX + 99
+				}, animation);
+			}
+
+			// Delete this function to allow it only once
+			series.animate = null;
+			
+			// Call the afterAnimate function on animation complete (but don't overwrite the animation.complete option
+			// which should be available to the user).
+			series.animationTimeout = setTimeout(function () {
+				series.afterAnimate();
+			}, animation.duration);
+		}
+	},
+	
+	/**
+	 * This runs after animation to land on the final plot clipping
+	 */
+	afterAnimate: function () {
+		var chart = this.chart,
+			sharedClipKey = this.sharedClipKey,
+			group = this.group;
+			
+		if (group && this.options.clip !== false) {
+			group.clip(chart.clipRect);
+			this.markerGroup.clip(); // no clip
+		}
+		
+		// Remove the shared clipping rectancgle when all series are shown		
+		setTimeout(function () {
+			if (sharedClipKey && chart[sharedClipKey]) {
+				chart[sharedClipKey] = chart[sharedClipKey].destroy();
+				chart[sharedClipKey + 'm'] = chart[sharedClipKey + 'm'].destroy();
+			}
+		}, 100);
+	},
+
+	/**
+	 * Draw the markers
+	 */
+	drawPoints: function () {
+		var series = this,
+			pointAttr,
+			points = series.points,
+			chart = series.chart,
+			plotX,
+			plotY,
+			i,
+			point,
+			radius,
+			symbol,
+			isImage,
+			graphic,
+			options = series.options,
+			seriesMarkerOptions = options.marker,
+			pointMarkerOptions,
+			enabled,
+			isInside,
+			markerGroup = series.markerGroup;
+
+		if (seriesMarkerOptions.enabled || series._hasPointMarkers) {
+			
+			i = points.length;
+			while (i--) {
+				point = points[i];
+				plotX = mathFloor(point.plotX); // #1843
+				plotY = point.plotY;
+				graphic = point.graphic;
+				pointMarkerOptions = point.marker || {};
+				enabled = (seriesMarkerOptions.enabled && pointMarkerOptions.enabled === UNDEFINED) || pointMarkerOptions.enabled;
+				isInside = chart.isInsidePlot(mathRound(plotX), plotY, chart.inverted); // #1858
+				
+				// only draw the point if y is defined
+				if (enabled && plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {
+
+					// shortcuts
+					pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE];
+					radius = pointAttr.r;
+					symbol = pick(pointMarkerOptions.symbol, series.symbol);
+					isImage = symbol.indexOf('url') === 0;
+
+					if (graphic) { // update
+						graphic
+							.attr({ // Since the marker group isn't clipped, each individual marker must be toggled
+								visibility: isInside ? (hasSVG ? 'inherit' : VISIBLE) : HIDDEN
+							})
+							.animate(extend({
+								x: plotX - radius,
+								y: plotY - radius
+							}, graphic.symbolName ? { // don't apply to image symbols #507
+								width: 2 * radius,
+								height: 2 * radius
+							} : {}));
+					} else if (isInside && (radius > 0 || isImage)) {
+						point.graphic = graphic = chart.renderer.symbol(
+							symbol,
+							plotX - radius,
+							plotY - radius,
+							2 * radius,
+							2 * radius
+						)
+						.attr(pointAttr)
+						.add(markerGroup);
+					}
+					
+				} else if (graphic) {
+					point.graphic = graphic.destroy(); // #1269
+				}
+			}
+		}
+
+	},
+
+	/**
+	 * Convert state properties from API naming conventions to SVG attributes
+	 *
+	 * @param {Object} options API options object
+	 * @param {Object} base1 SVG attribute object to inherit from
+	 * @param {Object} base2 Second level SVG attribute object to inherit from
+	 */
+	convertAttribs: function (options, base1, base2, base3) {
+		var conversion = this.pointAttrToOptions,
+			attr,
+			option,
+			obj = {};
+
+		options = options || {};
+		base1 = base1 || {};
+		base2 = base2 || {};
+		base3 = base3 || {};
+
+		for (attr in conversion) {
+			option = conversion[attr];
+			obj[attr] = pick(options[option], base1[attr], base2[attr], base3[attr]);
+		}
+		return obj;
+	},
+
+	/**
+	 * Get the state attributes. Each series type has its own set of attributes
+	 * that are allowed to change on a point's state change. Series wide attributes are stored for
+	 * all series, and additionally point specific attributes are stored for all
+	 * points with individual marker options. If such options are not defined for the point,
+	 * a reference to the series wide attributes is stored in point.pointAttr.
+	 */
+	getAttribs: function () {
+		var series = this,
+			seriesOptions = series.options,
+			normalOptions = defaultPlotOptions[series.type].marker ? seriesOptions.marker : seriesOptions,
+			stateOptions = normalOptions.states,
+			stateOptionsHover = stateOptions[HOVER_STATE],
+			pointStateOptionsHover,
+			seriesColor = series.color,
+			normalDefaults = {
+				stroke: seriesColor,
+				fill: seriesColor
+			},
+			points = series.points || [], // #927
+			i,
+			point,
+			seriesPointAttr = [],
+			pointAttr,
+			pointAttrToOptions = series.pointAttrToOptions,
+			hasPointSpecificOptions,
+			negativeColor = seriesOptions.negativeColor,
+			defaultLineColor = normalOptions.lineColor,
+			key;
+
+		// series type specific modifications
+		if (seriesOptions.marker) { // line, spline, area, areaspline, scatter
+
+			// if no hover radius is given, default to normal radius + 2
+			stateOptionsHover.radius = stateOptionsHover.radius || normalOptions.radius + 2;
+			stateOptionsHover.lineWidth = stateOptionsHover.lineWidth || normalOptions.lineWidth + 1;
+			
+		} else { // column, bar, pie
+
+			// if no hover color is given, brighten the normal color
+			stateOptionsHover.color = stateOptionsHover.color ||
+				Color(stateOptionsHover.color || seriesColor)
+					.brighten(stateOptionsHover.brightness).get();
+		}
+
+		// general point attributes for the series normal state
+		seriesPointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, normalDefaults);
+
+		// HOVER_STATE and SELECT_STATE states inherit from normal state except the default radius
+		each([HOVER_STATE, SELECT_STATE], function (state) {
+			seriesPointAttr[state] =
+					series.convertAttribs(stateOptions[state], seriesPointAttr[NORMAL_STATE]);
+		});
+
+		// set it
+		series.pointAttr = seriesPointAttr;
+
+
+		// Generate the point-specific attribute collections if specific point
+		// options are given. If not, create a referance to the series wide point
+		// attributes
+		i = points.length;
+		while (i--) {
+			point = points[i];
+			normalOptions = (point.options && point.options.marker) || point.options;
+			if (normalOptions && normalOptions.enabled === false) {
+				normalOptions.radius = 0;
+			}
+			
+			if (point.negative && negativeColor) {
+				point.color = point.fillColor = negativeColor;
+			}
+			
+			hasPointSpecificOptions = seriesOptions.colorByPoint || point.color; // #868
+
+			// check if the point has specific visual options
+			if (point.options) {
+				for (key in pointAttrToOptions) {
+					if (defined(normalOptions[pointAttrToOptions[key]])) {
+						hasPointSpecificOptions = true;
+					}
+				}
+			}
+
+			// a specific marker config object is defined for the individual point:
+			// create it's own attribute collection
+			if (hasPointSpecificOptions) {
+				normalOptions = normalOptions || {};
+				pointAttr = [];
+				stateOptions = normalOptions.states || {}; // reassign for individual point
+				pointStateOptionsHover = stateOptions[HOVER_STATE] = stateOptions[HOVER_STATE] || {};
+
+				// Handle colors for column and pies
+				if (!seriesOptions.marker) { // column, bar, point
+					// if no hover color is given, brighten the normal color
+					pointStateOptionsHover.color =
+						Color(pointStateOptionsHover.color || point.color)
+							.brighten(pointStateOptionsHover.brightness ||
+								stateOptionsHover.brightness).get();
+
+				}
+
+				// normal point state inherits series wide normal state
+				pointAttr[NORMAL_STATE] = series.convertAttribs(extend({
+					color: point.color, // #868
+					fillColor: point.color, // Individual point color or negative color markers (#2219)
+					lineColor: defaultLineColor === null ? point.color : UNDEFINED // Bubbles take point color, line markers use white
+				}, normalOptions), seriesPointAttr[NORMAL_STATE]);
+
+				// inherit from point normal and series hover
+				pointAttr[HOVER_STATE] = series.convertAttribs(
+					stateOptions[HOVER_STATE],
+					seriesPointAttr[HOVER_STATE],
+					pointAttr[NORMAL_STATE]
+				);
+				
+				// inherit from point normal and series hover
+				pointAttr[SELECT_STATE] = series.convertAttribs(
+					stateOptions[SELECT_STATE],
+					seriesPointAttr[SELECT_STATE],
+					pointAttr[NORMAL_STATE]
+				);
+
+
+			// no marker config object is created: copy a reference to the series-wide
+			// attribute collection
+			} else {
+				pointAttr = seriesPointAttr;
+			}
+
+			point.pointAttr = pointAttr;
+
+		}
+
+	},
+	/**
+	 * Update the series with a new set of options
+	 */
+	update: function (newOptions, redraw) {
+		var chart = this.chart,
+			// must use user options when changing type because this.options is merged
+			// in with type specific plotOptions
+			oldOptions = this.userOptions,
+			oldType = this.type,
+			proto = seriesTypes[oldType].prototype,
+			n;
+
+		// Do the merge, with some forced options
+		newOptions = merge(oldOptions, {
+			animation: false,
+			index: this.index,
+			pointStart: this.xData[0] // when updating after addPoint
+		}, { data: this.options.data }, newOptions);
+
+		// Destroy the series and reinsert methods from the type prototype
+		this.remove(false);
+		for (n in proto) { // Overwrite series-type specific methods (#2270)
+			if (proto.hasOwnProperty(n)) {
+				this[n] = UNDEFINED;
+			}
+		}
+		extend(this, seriesTypes[newOptions.type || oldType].prototype);
+		
+
+		this.init(chart, newOptions);
+		if (pick(redraw, true)) {
+			chart.redraw(false);
+		}
+	},
+
+	/**
+	 * Clear DOM objects and free up memory
+	 */
+	destroy: function () {
+		var series = this,
+			chart = series.chart,
+			issue134 = /AppleWebKit\/533/.test(userAgent),
+			destroy,
+			i,
+			data = series.data || [],
+			point,
+			prop,
+			axis;
+
+		// add event hook
+		fireEvent(series, 'destroy');
+
+		// remove all events
+		removeEvent(series);
+		
+		// erase from axes
+		each(['xAxis', 'yAxis'], function (AXIS) {
+			axis = series[AXIS];
+			if (axis) {
+				erase(axis.series, series);
+				axis.isDirty = axis.forceRedraw = true;
+				axis.stacks = {}; // Rebuild stacks when updating (#2229)
+			}
+		});
+
+		// remove legend items
+		if (series.legendItem) {
+			series.chart.legend.destroyItem(series);
+		}
+
+		// destroy all points with their elements
+		i = data.length;
+		while (i--) {
+			point = data[i];
+			if (point && point.destroy) {
+				point.destroy();
+			}
+		}
+		series.points = null;
+
+		// Clear the animation timeout if we are destroying the series during initial animation
+		clearTimeout(series.animationTimeout);
+
+		// destroy all SVGElements associated to the series
+		each(['area', 'graph', 'dataLabelsGroup', 'group', 'markerGroup', 'tracker',
+				'graphNeg', 'areaNeg', 'posClip', 'negClip'], function (prop) {
+			if (series[prop]) {
+
+				// issue 134 workaround
+				destroy = issue134 && prop === 'group' ?
+					'hide' :
+					'destroy';
+
+				series[prop][destroy]();
+			}
+		});
+
+		// remove from hoverSeries
+		if (chart.hoverSeries === series) {
+			chart.hoverSeries = null;
+		}
+		erase(chart.series, series);
+
+		// clear all members
+		for (prop in series) {
+			delete series[prop];
+		}
+	},
+
+	/**
+	 * Draw the data labels
+	 */
+	drawDataLabels: function () {
+		
+		var series = this,
+			seriesOptions = series.options,
+			options = seriesOptions.dataLabels,
+			points = series.points,
+			pointOptions,
+			generalOptions,
+			str,
+			dataLabelsGroup;
+		
+		if (options.enabled || series._hasPointLabels) {
+						
+			// Process default alignment of data labels for columns
+			if (series.dlProcessOptions) {
+				series.dlProcessOptions(options);
+			}
+
+			// Create a separate group for the data labels to avoid rotation
+			dataLabelsGroup = series.plotGroup(
+				'dataLabelsGroup', 
+				'data-labels', 
+				series.visible ? VISIBLE : HIDDEN, 
+				options.zIndex || 6
+			);
+			
+			// Make the labels for each point
+			generalOptions = options;
+			each(points, function (point) {
+				
+				var enabled,
+					dataLabel = point.dataLabel,
+					labelConfig,
+					attr,
+					name,
+					rotation,
+					connector = point.connector,
+					isNew = true;
+				
+				// Determine if each data label is enabled
+				pointOptions = point.options && point.options.dataLabels;
+				enabled = pick(pointOptions && pointOptions.enabled, generalOptions.enabled); // #2282
+				
+				
+				// If the point is outside the plot area, destroy it. #678, #820
+				if (dataLabel && !enabled) {
+					point.dataLabel = dataLabel.destroy();
+				
+				// Individual labels are disabled if the are explicitly disabled 
+				// in the point options, or if they fall outside the plot area.
+				} else if (enabled) {
+					
+					// Create individual options structure that can be extended without 
+					// affecting others
+					options = merge(generalOptions, pointOptions);
+
+					rotation = options.rotation;
+					
+					// Get the string
+					labelConfig = point.getLabelConfig();
+					str = options.format ?
+						format(options.format, labelConfig) : 
+						options.formatter.call(labelConfig, options);
+					
+					// Determine the color
+					options.style.color = pick(options.color, options.style.color, series.color, 'black');
+	
+					
+					// update existing label
+					if (dataLabel) {
+						
+						if (defined(str)) {
+							dataLabel
+								.attr({
+									text: str
+								});
+							isNew = false;
+						
+						} else { // #1437 - the label is shown conditionally
+							point.dataLabel = dataLabel = dataLabel.destroy();
+							if (connector) {
+								point.connector = connector.destroy();
+							}
+						}
+						
+					// create new label
+					} else if (defined(str)) {
+						attr = {
+							//align: align,
+							fill: options.backgroundColor,
+							stroke: options.borderColor,
+							'stroke-width': options.borderWidth,
+							r: options.borderRadius || 0,
+							rotation: rotation,
+							padding: options.padding,
+							zIndex: 1
+						};
+						// Remove unused attributes (#947)
+						for (name in attr) {
+							if (attr[name] === UNDEFINED) {
+								delete attr[name];
+							}
+						}
+						
+						dataLabel = point.dataLabel = series.chart.renderer[rotation ? 'text' : 'label']( // labels don't support rotation
+							str,
+							0,
+							-999,
+							null,
+							null,
+							null,
+							options.useHTML
+						)
+						.attr(attr)
+						.css(options.style)
+						.add(dataLabelsGroup)
+						.shadow(options.shadow);
+						
+					}
+					
+					if (dataLabel) {
+						// Now the data label is created and placed at 0,0, so we need to align it
+						series.alignDataLabel(point, dataLabel, options, null, isNew);
+					}
+				}
+			});
+		}
+	},
+	
+	/**
+	 * Align each individual data label
+	 */
+	alignDataLabel: function (point, dataLabel, options, alignTo, isNew) {
+		var chart = this.chart,
+			inverted = chart.inverted,
+			plotX = pick(point.plotX, -999),
+			plotY = pick(point.plotY, -999),
+			bBox = dataLabel.getBBox(),
+			visible = this.visible && chart.isInsidePlot(point.plotX, point.plotY, inverted),
+			alignAttr; // the final position;
+				
+		if (visible) {
+
+			// The alignment box is a singular point
+			alignTo = extend({
+				x: inverted ? chart.plotWidth - plotY : plotX,
+				y: mathRound(inverted ? chart.plotHeight - plotX : plotY),
+				width: 0,
+				height: 0
+			}, alignTo);
+			
+			// Add the text size for alignment calculation
+			extend(options, {
+				width: bBox.width,
+				height: bBox.height
+			});
+
+			// Allow a hook for changing alignment in the last moment, then do the alignment
+			if (options.rotation) { // Fancy box alignment isn't supported for rotated text
+				alignAttr = {
+					align: options.align,
+					x: alignTo.x + options.x + alignTo.width / 2,
+					y: alignTo.y + options.y + alignTo.height / 2
+				};
+				dataLabel[isNew ? 'attr' : 'animate'](alignAttr);
+			} else {
+				dataLabel.align(options, null, alignTo);
+				alignAttr = dataLabel.alignAttr;
+
+				// Handle justify or crop
+				if (pick(options.overflow, 'justify') === 'justify') { // docs: overflow: justify, also crop only applies when not justify
+					this.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);
+				
+				} else if (pick(options.crop, true)) {
+					// Now check that the data label is within the plot area
+					visible = chart.isInsidePlot(alignAttr.x, alignAttr.y) && chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);
+				
+				}
+			}		
+		}
+
+		// Show or hide based on the final aligned position
+		if (!visible) {
+			dataLabel.attr({ y: -999 });
+		}
+				
+	},
+	
+	/**
+	 * If data labels fall partly outside the plot area, align them back in, in a way that
+	 * doesn't hide the point.
+	 */
+	justifyDataLabel: function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {
+		var chart = this.chart,
+			align = options.align,
+			verticalAlign = options.verticalAlign,
+			off,
+			justified;
+
+		// Off left
+		off = alignAttr.x;
+		if (off < 0) {
+			if (align === 'right') {
+				options.align = 'left';
+			} else {
+				options.x = -off;
+			}
+			justified = true;
+		}
+
+		// Off right
+		off = alignAttr.x + bBox.width;
+		if (off > chart.plotWidth) {
+			if (align === 'left') {
+				options.align = 'right';
+			} else {
+				options.x = chart.plotWidth - off;
+			}
+			justified = true;
+		}
+
+		// Off top
+		off = alignAttr.y;
+		if (off < 0) {
+			if (verticalAlign === 'bottom') {
+				options.verticalAlign = 'top';
+			} else {
+				options.y = -off;
+			}
+			justified = true;
+		}
+
+		// Off bottom
+		off = alignAttr.y + bBox.height;
+		if (off > chart.plotHeight) {
+			if (verticalAlign === 'top') {
+				options.verticalAlign = 'bottom';
+			} else {
+				options.y = chart.plotHeight - off;
+			}
+			justified = true;
+		}
+		
+		if (justified) {
+			dataLabel.placed = !isNew;
+			dataLabel.align(options, null, alignTo);
+		}
+	},
+	
+	/**
+	 * Return the graph path of a segment
+	 */
+	getSegmentPath: function (segment) {		
+		var series = this,
+			segmentPath = [],
+			step = series.options.step;
+			
+		// build the segment line
+		each(segment, function (point, i) {
+			
+			var plotX = point.plotX,
+				plotY = point.plotY,
+				lastPoint;
+
+			if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object
+				segmentPath.push.apply(segmentPath, series.getPointSpline(segment, point, i));
+
+			} else {
+
+				// moveTo or lineTo
+				segmentPath.push(i ? L : M);
+
+				// step line?
+				if (step && i) {
+					lastPoint = segment[i - 1];
+					if (step === 'right') {
+						segmentPath.push(
+							lastPoint.plotX,
+							plotY
+						);
+						
+					} else if (step === 'center') {
+						segmentPath.push(
+							(lastPoint.plotX + plotX) / 2,
+							lastPoint.plotY,
+							(lastPoint.plotX + plotX) / 2,
+							plotY
+						);
+						
+					} else {
+						segmentPath.push(
+							plotX,
+							lastPoint.plotY
+						);
+					}
+				}
+
+				// normal line to next point
+				segmentPath.push(
+					point.plotX,
+					point.plotY
+				);
+			}
+		});
+		
+		return segmentPath;
+	},
+
+	/**
+	 * Get the graph path
+	 */
+	getGraphPath: function () {
+		var series = this,
+			graphPath = [],
+			segmentPath,
+			singlePoints = []; // used in drawTracker
+
+		// Divide into segments and build graph and area paths
+		each(series.segments, function (segment) {
+			
+			segmentPath = series.getSegmentPath(segment);
+			
+			// add the segment to the graph, or a single point for tracking
+			if (segment.length > 1) {
+				graphPath = graphPath.concat(segmentPath);
+			} else {
+				singlePoints.push(segment[0]);
+			}
+		});
+
+		// Record it for use in drawGraph and drawTracker, and return graphPath
+		series.singlePoints = singlePoints;
+		series.graphPath = graphPath;
+		
+		return graphPath;
+		
+	},
+	
+	/**
+	 * Draw the actual graph
+	 */
+	drawGraph: function () {
+		var series = this,
+			options = this.options,
+			props = [['graph', options.lineColor || this.color]],
+			lineWidth = options.lineWidth,
+			dashStyle =  options.dashStyle,
+			graphPath = this.getGraphPath(),
+			negativeColor = options.negativeColor;
+			
+		if (negativeColor) {
+			props.push(['graphNeg', negativeColor]);
+		}
+		
+		// draw the graph
+		each(props, function (prop, i) {
+			var graphKey = prop[0],
+				graph = series[graphKey],
+				attribs;
+			
+			if (graph) {
+				stop(graph); // cancel running animations, #459
+				graph.animate({ d: graphPath });
+	
+			} else if (lineWidth && graphPath.length) { // #1487
+				attribs = {
+					stroke: prop[1],
+					'stroke-width': lineWidth,
+					zIndex: 1 // #1069
+				};
+				if (dashStyle) {
+					attribs.dashstyle = dashStyle;
+				} else {
+					attribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';
+				}
+
+				series[graphKey] = series.chart.renderer.path(graphPath)
+					.attr(attribs)
+					.add(series.group)
+					.shadow(!i && options.shadow);
+			}
+		});
+	},
+	
+	/**
+	 * Clip the graphs into the positive and negative coloured graphs
+	 */
+	clipNeg: function () {
+		var options = this.options,
+			chart = this.chart,
+			renderer = chart.renderer,
+			negativeColor = options.negativeColor || options.negativeFillColor,
+			translatedThreshold,
+			posAttr,
+			negAttr,
+			graph = this.graph,
+			area = this.area,
+			posClip = this.posClip,
+			negClip = this.negClip,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			chartSizeMax = mathMax(chartWidth, chartHeight),
+			yAxis = this.yAxis,
+			above,
+			below;
+		
+		if (negativeColor && (graph || area)) {
+			translatedThreshold = mathRound(yAxis.toPixels(options.threshold || 0, true));
+			above = {
+				x: 0,
+				y: 0,
+				width: chartSizeMax,
+				height: translatedThreshold
+			};
+			below = {
+				x: 0,
+				y: translatedThreshold,
+				width: chartSizeMax,
+				height: chartSizeMax
+			};
+			
+			if (chart.inverted) {
+
+				above.height = below.y = chart.plotWidth - translatedThreshold;
+				if (renderer.isVML) {
+					above = {
+						x: chart.plotWidth - translatedThreshold - chart.plotLeft,
+						y: 0,
+						width: chartWidth,
+						height: chartHeight
+					};
+					below = {
+						x: translatedThreshold + chart.plotLeft - chartWidth,
+						y: 0,
+						width: chart.plotLeft + translatedThreshold,
+						height: chartWidth
+					};
+				}
+			}
+			
+			if (yAxis.reversed) {
+				posAttr = below;
+				negAttr = above;
+			} else {
+				posAttr = above;
+				negAttr = below;
+			}
+		
+			if (posClip) { // update
+				posClip.animate(posAttr);
+				negClip.animate(negAttr);
+			} else {
+				
+				this.posClip = posClip = renderer.clipRect(posAttr);
+				this.negClip = negClip = renderer.clipRect(negAttr);
+				
+				if (graph && this.graphNeg) {
+					graph.clip(posClip);
+					this.graphNeg.clip(negClip);	
+				}
+				
+				if (area) {
+					area.clip(posClip);
+					this.areaNeg.clip(negClip);
+				} 
+			} 
+		}	
+	},
+
+	/**
+	 * Initialize and perform group inversion on series.group and series.markerGroup
+	 */
+	invertGroups: function () {
+		var series = this,
+			chart = series.chart;
+
+		// Pie, go away (#1736)
+		if (!series.xAxis) {
+			return;
+		}
+		
+		// A fixed size is needed for inversion to work
+		function setInvert() {			
+			var size = {
+				width: series.yAxis.len,
+				height: series.xAxis.len
+			};
+			
+			each(['group', 'markerGroup'], function (groupName) {
+				if (series[groupName]) {
+					series[groupName].attr(size).invert();
+				}
+			});
+		}
+
+		addEvent(chart, 'resize', setInvert); // do it on resize
+		addEvent(series, 'destroy', function () {
+			removeEvent(chart, 'resize', setInvert);
+		});
+
+		// Do it now
+		setInvert(); // do it now
+		
+		// On subsequent render and redraw, just do setInvert without setting up events again
+		series.invertGroups = setInvert;
+	},
+	
+	/**
+	 * General abstraction for creating plot groups like series.group, series.dataLabelsGroup and 
+	 * series.markerGroup. On subsequent calls, the group will only be adjusted to the updated plot size.
+	 */
+	plotGroup: function (prop, name, visibility, zIndex, parent) {
+		var group = this[prop],
+			isNew = !group;
+		
+		// Generate it on first call
+		if (isNew) {	
+			this[prop] = group = this.chart.renderer.g(name)
+				.attr({
+					visibility: visibility,
+					zIndex: zIndex || 0.1 // IE8 needs this
+				})
+				.add(parent);
+		}
+		// Place it on first and subsequent (redraw) calls
+		group[isNew ? 'attr' : 'animate'](this.getPlotBox());
+		return group;		
+	},
+
+	/**
+	 * Get the translation and scale for the plot area of this series
+	 */
+	getPlotBox: function () {
+		return {
+			translateX: this.xAxis ? this.xAxis.left : this.chart.plotLeft, 
+			translateY: this.yAxis ? this.yAxis.top : this.chart.plotTop,
+			scaleX: 1, // #1623
+			scaleY: 1
+		};
+	},
+	
+	/**
+	 * Render the graph and markers
+	 */
+	render: function () {
+		var series = this,
+			chart = series.chart,
+			group,
+			options = series.options,
+			animation = options.animation,
+			doAnimation = animation && !!series.animate && 
+				chart.renderer.isSVG, // this animation doesn't work in IE8 quirks when the group div is hidden,
+				// and looks bad in other oldIE
+			visibility = series.visible ? VISIBLE : HIDDEN,
+			zIndex = options.zIndex,
+			hasRendered = series.hasRendered,
+			chartSeriesGroup = chart.seriesGroup;
+		
+		// the group
+		group = series.plotGroup(
+			'group', 
+			'series', 
+			visibility, 
+			zIndex, 
+			chartSeriesGroup
+		);
+		
+		series.markerGroup = series.plotGroup(
+			'markerGroup', 
+			'markers', 
+			visibility, 
+			zIndex, 
+			chartSeriesGroup
+		);
+		
+		// initiate the animation
+		if (doAnimation) {
+			series.animate(true);
+		}
+
+		// cache attributes for shapes
+		series.getAttribs();
+
+		// SVGRenderer needs to know this before drawing elements (#1089, #1795)
+		group.inverted = series.isCartesian ? chart.inverted : false;
+		
+		// draw the graph if any
+		if (series.drawGraph) {
+			series.drawGraph();
+			series.clipNeg();
+		}
+
+		// draw the data labels (inn pies they go before the points)
+		series.drawDataLabels();
+		
+		// draw the points
+		series.drawPoints();
+
+
+		// draw the mouse tracking area
+		if (series.options.enableMouseTracking !== false) {
+			series.drawTracker();
+		}
+		
+		// Handle inverted series and tracker groups
+		if (chart.inverted) {
+			series.invertGroups();
+		}
+		
+		// Initial clipping, must be defined after inverting groups for VML
+		if (options.clip !== false && !series.sharedClipKey && !hasRendered) {
+			group.clip(chart.clipRect);
+		}
+
+		// Run the animation
+		if (doAnimation) {
+			series.animate();
+		} else if (!hasRendered) {
+			series.afterAnimate();
+		}
+
+		series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see
+		// (See #322) series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see
+		series.hasRendered = true;
+	},
+	
+	/**
+	 * Redraw the series after an update in the axes.
+	 */
+	redraw: function () {
+		var series = this,
+			chart = series.chart,
+			wasDirtyData = series.isDirtyData, // cache it here as it is set to false in render, but used after
+			group = series.group,
+			xAxis = series.xAxis,
+			yAxis = series.yAxis;
+
+		// reposition on resize
+		if (group) {
+			if (chart.inverted) {
+				group.attr({
+					width: chart.plotWidth,
+					height: chart.plotHeight
+				});
+			}
+
+			group.animate({
+				translateX: pick(xAxis && xAxis.left, chart.plotLeft),
+				translateY: pick(yAxis && yAxis.top, chart.plotTop)
+			});
+		}
+
+		series.translate();
+		series.setTooltipPoints(true);
+
+		series.render();
+		if (wasDirtyData) {
+			fireEvent(series, 'updatedData');
+		}
+	},
+
+	/**
+	 * Set the state of the graph
+	 */
+	setState: function (state) {
+		var series = this,
+			options = series.options,
+			graph = series.graph,
+			graphNeg = series.graphNeg,
+			stateOptions = options.states,
+			lineWidth = options.lineWidth,
+			attribs;
+
+		state = state || NORMAL_STATE;
+
+		if (series.state !== state) {
+			series.state = state;
+
+			if (stateOptions[state] && stateOptions[state].enabled === false) {
+				return;
+			}
+
+			if (state) {
+				lineWidth = stateOptions[state].lineWidth || lineWidth + 1;
+			}
+
+			if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML
+				attribs = {
+					'stroke-width': lineWidth
+				};
+				// use attr because animate will cause any other animation on the graph to stop
+				graph.attr(attribs);
+				if (graphNeg) {
+					graphNeg.attr(attribs);
+				}
+			}
+		}
+	},
+
+	/**
+	 * Set the visibility of the graph
+	 *
+	 * @param vis {Boolean} True to show the series, false to hide. If UNDEFINED,
+	 *        the visibility is toggled.
+	 */
+	setVisible: function (vis, redraw) {
+		var series = this,
+			chart = series.chart,
+			legendItem = series.legendItem,
+			showOrHide,
+			ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,
+			oldVisibility = series.visible;
+
+		// if called without an argument, toggle visibility
+		series.visible = vis = series.userOptions.visible = vis === UNDEFINED ? !oldVisibility : vis;
+		showOrHide = vis ? 'show' : 'hide';
+
+		// show or hide elements
+		each(['group', 'dataLabelsGroup', 'markerGroup', 'tracker'], function (key) {
+			if (series[key]) {
+				series[key][showOrHide]();
+			}
+		});
+
+		
+		// hide tooltip (#1361)
+		if (chart.hoverSeries === series) {
+			series.onMouseOut();
+		}
+
+
+		if (legendItem) {
+			chart.legend.colorizeItem(series, vis);
+		}
+
+
+		// rescale or adapt to resized chart
+		series.isDirty = true;
+		// in a stack, all other series are affected
+		if (series.options.stacking) {
+			each(chart.series, function (otherSeries) {
+				if (otherSeries.options.stacking && otherSeries.visible) {
+					otherSeries.isDirty = true;
+				}
+			});
+		}
+
+		// show or hide linked series
+		each(series.linkedSeries, function (otherSeries) {
+			otherSeries.setVisible(vis, false);
+		});
+
+		if (ignoreHiddenSeries) {
+			chart.isDirtyBox = true;
+		}
+		if (redraw !== false) {
+			chart.redraw();
+		}
+
+		fireEvent(series, showOrHide);
+	},
+
+	/**
+	 * Show the graph
+	 */
+	show: function () {
+		this.setVisible(true);
+	},
+
+	/**
+	 * Hide the graph
+	 */
+	hide: function () {
+		this.setVisible(false);
+	},
+
+
+	/**
+	 * Set the selected state of the graph
+	 *
+	 * @param selected {Boolean} True to select the series, false to unselect. If
+	 *        UNDEFINED, the selection state is toggled.
+	 */
+	select: function (selected) {
+		var series = this;
+		// if called without an argument, toggle
+		series.selected = selected = (selected === UNDEFINED) ? !series.selected : selected;
+
+		if (series.checkbox) {
+			series.checkbox.checked = selected;
+		}
+
+		fireEvent(series, selected ? 'select' : 'unselect');
+	},
+
+	/**
+	 * Draw the tracker object that sits above all data labels and markers to
+	 * track mouse events on the graph or points. For the line type charts
+	 * the tracker uses the same graphPath, but with a greater stroke width
+	 * for better control.
+	 */
+	drawTracker: function () {
+		var series = this,
+			options = series.options,
+			trackByArea = options.trackByArea,
+			trackerPath = [].concat(trackByArea ? series.areaPath : series.graphPath),
+			trackerPathLength = trackerPath.length,
+			chart = series.chart,
+			pointer = chart.pointer,
+			renderer = chart.renderer,
+			snap = chart.options.tooltip.snap,
+			tracker = series.tracker,
+			cursor = options.cursor,
+			css = cursor && { cursor: cursor },
+			singlePoints = series.singlePoints,
+			singlePoint,
+			i,
+			onMouseOver = function () {
+				if (chart.hoverSeries !== series) {
+					series.onMouseOver();
+				}
+			};
+
+		// Extend end points. A better way would be to use round linecaps,
+		// but those are not clickable in VML.
+		if (trackerPathLength && !trackByArea) {
+			i = trackerPathLength + 1;
+			while (i--) {
+				if (trackerPath[i] === M) { // extend left side
+					trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L);
+				}
+				if ((i && trackerPath[i] === M) || i === trackerPathLength) { // extend right side
+					trackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]);
+				}
+			}
+		}
+
+		// handle single points
+		for (i = 0; i < singlePoints.length; i++) {
+			singlePoint = singlePoints[i];
+			trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,
+				L, singlePoint.plotX + snap, singlePoint.plotY);
+		}
+		
+		
+
+		// draw the tracker
+		if (tracker) {
+			tracker.attr({ d: trackerPath });
+
+		} else { // create
+				
+			series.tracker = renderer.path(trackerPath)
+				.attr({
+					'stroke-linejoin': 'round', // #1225
+					visibility: series.visible ? VISIBLE : HIDDEN,
+					stroke: TRACKER_FILL,
+					fill: trackByArea ? TRACKER_FILL : NONE,
+					'stroke-width' : options.lineWidth + (trackByArea ? 0 : 2 * snap),
+					zIndex: 2
+				})
+				.add(series.group);
+				
+			// The tracker is added to the series group, which is clipped, but is covered 
+			// by the marker group. So the marker group also needs to capture events.
+			each([series.tracker, series.markerGroup], function (tracker) {
+				tracker.addClass(PREFIX + 'tracker')
+					.on('mouseover', onMouseOver)
+					.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })
+					.css(css);
+
+				if (hasTouch) {
+					tracker.on('touchstart', onMouseOver);
+				} 
+			});
+		}
+
+	}
+
+}; // end Series prototype
+
+
+/**
+ * LineSeries object
+ */
+var LineSeries = extendClass(Series);
+seriesTypes.line = LineSeries;
+
+/**
+ * Set the default options for area
+ */
+defaultPlotOptions.area = merge(defaultSeriesOptions, {
+	threshold: 0
+	// trackByArea: false,
+	// lineColor: null, // overrides color, but lets fillColor be unaltered
+	// fillOpacity: 0.75,
+	// fillColor: null
+});
+
+/**
+ * AreaSeries object
+ */
+var AreaSeries = extendClass(Series, {
+	type: 'area',
+	
+	/**
+	 * For stacks, don't split segments on null values. Instead, draw null values with 
+	 * no marker. Also insert dummy points for any X position that exists in other series
+	 * in the stack.
+	 */ 
+	getSegments: function () {
+		var segments = [],
+			segment = [],
+			keys = [],
+			xAxis = this.xAxis,
+			yAxis = this.yAxis,
+			stack = yAxis.stacks[this.stackKey],
+			pointMap = {},
+			plotX,
+			plotY,
+			points = this.points,
+			connectNulls = this.options.connectNulls,
+			val,
+			i,
+			x;
+
+		if (this.options.stacking && !this.cropped) { // cropped causes artefacts in Stock, and perf issue
+			// Create a map where we can quickly look up the points by their X value.
+			for (i = 0; i < points.length; i++) {
+				pointMap[points[i].x] = points[i];
+			}
+
+			// Sort the keys (#1651)
+			for (x in stack) {
+				keys.push(+x);
+			}
+			keys.sort(function (a, b) {
+				return a - b;
+			});
+
+			each(keys, function (x) {
+				if (connectNulls && (!pointMap[x] || pointMap[x].y === null)) { // #1836
+					return;
+
+				// The point exists, push it to the segment
+				} else if (pointMap[x]) {
+					segment.push(pointMap[x]);
+
+				// There is no point for this X value in this series, so we 
+				// insert a dummy point in order for the areas to be drawn
+				// correctly.
+				} else {
+					plotX = xAxis.translate(x);
+					val = stack[x].percent ? (stack[x].total ? stack[x].cum * 100 / stack[x].total : 0) : stack[x].cum; // #1991
+					plotY = yAxis.toPixels(val, true);
+					segment.push({ 
+						y: null, 
+						plotX: plotX,
+						clientX: plotX, 
+						plotY: plotY, 
+						yBottom: plotY,
+						onMouseOver: noop
+					});
+				}
+			});
+
+			if (segment.length) {
+				segments.push(segment);
+			}
+
+		} else {
+			Series.prototype.getSegments.call(this);
+			segments = this.segments;
+		}
+
+		this.segments = segments;
+	},
+	
+	/**
+	 * Extend the base Series getSegmentPath method by adding the path for the area.
+	 * This path is pushed to the series.areaPath property.
+	 */
+	getSegmentPath: function (segment) {
+		
+		var segmentPath = Series.prototype.getSegmentPath.call(this, segment), // call base method
+			areaSegmentPath = [].concat(segmentPath), // work on a copy for the area path
+			i,
+			options = this.options,
+			segLength = segmentPath.length,
+			translatedThreshold = this.yAxis.getThreshold(options.threshold), // #2181
+			yBottom;
+		
+		if (segLength === 3) { // for animation from 1 to two points
+			areaSegmentPath.push(L, segmentPath[1], segmentPath[2]);
+		}
+		if (options.stacking && !this.closedStacks) {
+			
+			// Follow stack back. Todo: implement areaspline. A general solution could be to 
+			// reverse the entire graphPath of the previous series, though may be hard with
+			// splines and with series with different extremes
+			for (i = segment.length - 1; i >= 0; i--) {
+
+				yBottom = pick(segment[i].yBottom, translatedThreshold);
+			
+				// step line?
+				if (i < segment.length - 1 && options.step) {
+					areaSegmentPath.push(segment[i + 1].plotX, yBottom);
+				}
+				
+				areaSegmentPath.push(segment[i].plotX, yBottom);
+			}
+
+		} else { // follow zero line back
+			this.closeSegment(areaSegmentPath, segment, translatedThreshold);
+		}
+		this.areaPath = this.areaPath.concat(areaSegmentPath);
+		return segmentPath;
+	},
+	
+	/**
+	 * Extendable method to close the segment path of an area. This is overridden in polar 
+	 * charts.
+	 */
+	closeSegment: function (path, segment, translatedThreshold) {
+		path.push(
+			L,
+			segment[segment.length - 1].plotX,
+			translatedThreshold,
+			L,
+			segment[0].plotX,
+			translatedThreshold
+		);
+	},
+	
+	/**
+	 * Draw the graph and the underlying area. This method calls the Series base
+	 * function and adds the area. The areaPath is calculated in the getSegmentPath
+	 * method called from Series.prototype.drawGraph.
+	 */
+	drawGraph: function () {
+		
+		// Define or reset areaPath
+		this.areaPath = [];
+		
+		// Call the base method
+		Series.prototype.drawGraph.apply(this);
+		
+		// Define local variables
+		var series = this,
+			areaPath = this.areaPath,
+			options = this.options,
+			negativeColor = options.negativeColor,
+			negativeFillColor = options.negativeFillColor,
+			props = [['area', this.color, options.fillColor]]; // area name, main color, fill color
+		
+		if (negativeColor || negativeFillColor) {
+			props.push(['areaNeg', negativeColor, negativeFillColor]);
+		}
+		
+		each(props, function (prop) {
+			var areaKey = prop[0],
+				area = series[areaKey];
+				
+			// Create or update the area
+			if (area) { // update
+				area.animate({ d: areaPath });
+	
+			} else { // create
+				series[areaKey] = series.chart.renderer.path(areaPath)
+					.attr({
+						fill: pick(
+							prop[2],
+							Color(prop[1]).setOpacity(pick(options.fillOpacity, 0.75)).get()
+						),
+						zIndex: 0 // #1069
+					}).add(series.group);
+			}
+		});
+	},
+	
+	/**
+	 * Get the series' symbol in the legend
+	 * 
+	 * @param {Object} legend The legend object
+	 * @param {Object} item The series (this) or point
+	 */
+	drawLegendSymbol: function (legend, item) {
+		
+		item.legendSymbol = this.chart.renderer.rect(
+			0,
+			legend.baseline - 11,
+			legend.options.symbolWidth,
+			12,
+			2
+		).attr({
+			zIndex: 3
+		}).add(item.legendGroup);		
+		
+	}
+});
+
+seriesTypes.area = AreaSeries;/**
+ * Set the default options for spline
+ */
+defaultPlotOptions.spline = merge(defaultSeriesOptions);
+
+/**
+ * SplineSeries object
+ */
+var SplineSeries = extendClass(Series, {
+	type: 'spline',
+
+	/**
+	 * Get the spline segment from a given point's previous neighbour to the given point
+	 */
+	getPointSpline: function (segment, point, i) {
+		var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc
+			denom = smoothing + 1,
+			plotX = point.plotX,
+			plotY = point.plotY,
+			lastPoint = segment[i - 1],
+			nextPoint = segment[i + 1],
+			leftContX,
+			leftContY,
+			rightContX,
+			rightContY,
+			ret;
+
+		// find control points
+		if (lastPoint && nextPoint) {
+		
+			var lastX = lastPoint.plotX,
+				lastY = lastPoint.plotY,
+				nextX = nextPoint.plotX,
+				nextY = nextPoint.plotY,
+				correction;
+
+			leftContX = (smoothing * plotX + lastX) / denom;
+			leftContY = (smoothing * plotY + lastY) / denom;
+			rightContX = (smoothing * plotX + nextX) / denom;
+			rightContY = (smoothing * plotY + nextY) / denom;
+
+			// have the two control points make a straight line through main point
+			correction = ((rightContY - leftContY) * (rightContX - plotX)) /
+				(rightContX - leftContX) + plotY - rightContY;
+
+			leftContY += correction;
+			rightContY += correction;
+
+			// to prevent false extremes, check that control points are between
+			// neighbouring points' y values
+			if (leftContY > lastY && leftContY > plotY) {
+				leftContY = mathMax(lastY, plotY);
+				rightContY = 2 * plotY - leftContY; // mirror of left control point
+			} else if (leftContY < lastY && leftContY < plotY) {
+				leftContY = mathMin(lastY, plotY);
+				rightContY = 2 * plotY - leftContY;
+			}
+			if (rightContY > nextY && rightContY > plotY) {
+				rightContY = mathMax(nextY, plotY);
+				leftContY = 2 * plotY - rightContY;
+			} else if (rightContY < nextY && rightContY < plotY) {
+				rightContY = mathMin(nextY, plotY);
+				leftContY = 2 * plotY - rightContY;
+			}
+
+			// record for drawing in next point
+			point.rightContX = rightContX;
+			point.rightContY = rightContY;
+
+		}
+		
+		// Visualize control points for debugging
+		/*
+		if (leftContX) {
+			this.chart.renderer.circle(leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop, 2)
+				.attr({
+					stroke: 'red',
+					'stroke-width': 1,
+					fill: 'none'
+				})
+				.add();
+			this.chart.renderer.path(['M', leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop,
+				'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])
+				.attr({
+					stroke: 'red',
+					'stroke-width': 1
+				})
+				.add();
+			this.chart.renderer.circle(rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop, 2)
+				.attr({
+					stroke: 'green',
+					'stroke-width': 1,
+					fill: 'none'
+				})
+				.add();
+			this.chart.renderer.path(['M', rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop,
+				'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])
+				.attr({
+					stroke: 'green',
+					'stroke-width': 1
+				})
+				.add();
+		}
+		*/
+
+		// moveTo or lineTo
+		if (!i) {
+			ret = [M, plotX, plotY];
+		} else { // curve from last point to this
+			ret = [
+				'C',
+				lastPoint.rightContX || lastPoint.plotX,
+				lastPoint.rightContY || lastPoint.plotY,
+				leftContX || plotX,
+				leftContY || plotY,
+				plotX,
+				plotY
+			];
+			lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later
+		}
+		return ret;
+	}
+});
+seriesTypes.spline = SplineSeries;
+
+/**
+ * Set the default options for areaspline
+ */
+defaultPlotOptions.areaspline = merge(defaultPlotOptions.area);
+
+/**
+ * AreaSplineSeries object
+ */
+var areaProto = AreaSeries.prototype,
+	AreaSplineSeries = extendClass(SplineSeries, {
+		type: 'areaspline',
+		closedStacks: true, // instead of following the previous graph back, follow the threshold back
+		
+		// Mix in methods from the area series
+		getSegmentPath: areaProto.getSegmentPath,
+		closeSegment: areaProto.closeSegment,
+		drawGraph: areaProto.drawGraph,
+		drawLegendSymbol: areaProto.drawLegendSymbol
+	});
+seriesTypes.areaspline = AreaSplineSeries;
+
+/**
+ * Set the default options for column
+ */
+defaultPlotOptions.column = merge(defaultSeriesOptions, {
+	borderColor: '#FFFFFF',
+	borderWidth: 1,
+	borderRadius: 0,
+	//colorByPoint: undefined,
+	groupPadding: 0.2,
+	//grouping: true,
+	marker: null, // point options are specified in the base options
+	pointPadding: 0.1,
+	//pointWidth: null,
+	minPointLength: 0,
+	cropThreshold: 50, // when there are more points, they will not animate out of the chart on xAxis.setExtremes
+	pointRange: null, // null means auto, meaning 1 in a categorized axis and least distance between points if not categories
+	states: {
+		hover: {
+			brightness: 0.1,
+			shadow: false
+		},
+		select: {
+			color: '#C0C0C0',
+			borderColor: '#000000',
+			shadow: false
+		}
+	},
+	dataLabels: {
+		align: null, // auto
+		verticalAlign: null, // auto
+		y: null
+	},
+	stickyTracking: false,
+	threshold: 0
+});
+
+/**
+ * ColumnSeries object
+ */
+var ColumnSeries = extendClass(Series, {
+	type: 'column',
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		stroke: 'borderColor',
+		'stroke-width': 'borderWidth',
+		fill: 'color',
+		r: 'borderRadius'
+	},
+	cropShoulder: 0,
+	trackerGroups: ['group', 'dataLabelsGroup'],
+	negStacks: true, // use separate negative stacks, unlike area stacks where a negative 
+		// point is substracted from previous (#1910)
+	
+	/**
+	 * Initialize the series
+	 */
+	init: function () {
+		Series.prototype.init.apply(this, arguments);
+
+		var series = this,
+			chart = series.chart;
+
+		// if the series is added dynamically, force redraw of other
+		// series affected by a new column
+		if (chart.hasRendered) {
+			each(chart.series, function (otherSeries) {
+				if (otherSeries.type === series.type) {
+					otherSeries.isDirty = true;
+				}
+			});
+		}
+	},
+
+	/**
+	 * Return the width and x offset of the columns adjusted for grouping, groupPadding, pointPadding,
+	 * pointWidth etc. 
+	 */
+	getColumnMetrics: function () {
+
+		var series = this,
+			options = series.options,
+			xAxis = series.xAxis,
+			yAxis = series.yAxis,
+			reversedXAxis = xAxis.reversed,
+			stackKey,
+			stackGroups = {},
+			columnIndex,
+			columnCount = 0;
+
+		// Get the total number of column type series.
+		// This is called on every series. Consider moving this logic to a
+		// chart.orderStacks() function and call it on init, addSeries and removeSeries
+		if (options.grouping === false) {
+			columnCount = 1;
+		} else {
+			each(series.chart.series, function (otherSeries) {
+				var otherOptions = otherSeries.options,
+					otherYAxis = otherSeries.yAxis;
+				if (otherSeries.type === series.type && otherSeries.visible &&
+						yAxis.len === otherYAxis.len && yAxis.pos === otherYAxis.pos) {  // #642, #2086
+					if (otherOptions.stacking) {
+						stackKey = otherSeries.stackKey;
+						if (stackGroups[stackKey] === UNDEFINED) {
+							stackGroups[stackKey] = columnCount++;
+						}
+						columnIndex = stackGroups[stackKey];
+					} else if (otherOptions.grouping !== false) { // #1162
+						columnIndex = columnCount++;
+					}
+					otherSeries.columnIndex = columnIndex;
+				}
+			});
+		}
+
+		var categoryWidth = mathMin(
+				mathAbs(xAxis.transA) * (xAxis.ordinalSlope || options.pointRange || xAxis.closestPointRange || 1), 
+				xAxis.len // #1535
+			),
+			groupPadding = categoryWidth * options.groupPadding,
+			groupWidth = categoryWidth - 2 * groupPadding,
+			pointOffsetWidth = groupWidth / columnCount,
+			optionPointWidth = options.pointWidth,
+			pointPadding = defined(optionPointWidth) ? (pointOffsetWidth - optionPointWidth) / 2 :
+				pointOffsetWidth * options.pointPadding,
+			pointWidth = pick(optionPointWidth, pointOffsetWidth - 2 * pointPadding), // exact point width, used in polar charts
+			colIndex = (reversedXAxis ? 
+				columnCount - (series.columnIndex || 0) : // #1251
+				series.columnIndex) || 0,
+			pointXOffset = pointPadding + (groupPadding + colIndex *
+				pointOffsetWidth - (categoryWidth / 2)) *
+				(reversedXAxis ? -1 : 1);
+
+		// Save it for reading in linked series (Error bars particularly)
+		return (series.columnMetrics = { 
+			width: pointWidth, 
+			offset: pointXOffset 
+		});
+			
+	},
+
+	/**
+	 * Translate each point to the plot area coordinate system and find shape positions
+	 */
+	translate: function () {
+		var series = this,
+			chart = series.chart,
+			options = series.options,
+			borderWidth = options.borderWidth,
+			yAxis = series.yAxis,
+			threshold = options.threshold,
+			translatedThreshold = series.translatedThreshold = yAxis.getThreshold(threshold),
+			minPointLength = pick(options.minPointLength, 5),
+			metrics = series.getColumnMetrics(),
+			pointWidth = metrics.width,
+			seriesBarW = series.barW = mathCeil(mathMax(pointWidth, 1 + 2 * borderWidth)), // rounded and postprocessed for border width
+			pointXOffset = series.pointXOffset = metrics.offset,
+			xCrisp = -(borderWidth % 2 ? 0.5 : 0),
+			yCrisp = borderWidth % 2 ? 0.5 : 1;
+
+		if (chart.renderer.isVML && chart.inverted) {
+			yCrisp += 1;
+		}
+
+		Series.prototype.translate.apply(series);
+
+		// record the new values
+		each(series.points, function (point) {
+			var yBottom = pick(point.yBottom, translatedThreshold),
+				plotY = mathMin(mathMax(-999 - yBottom, point.plotY), yAxis.len + 999 + yBottom), // Don't draw too far outside plot area (#1303, #2241)
+				barX = point.plotX + pointXOffset,
+				barW = seriesBarW,
+				barY = mathMin(plotY, yBottom),
+				right,
+				bottom,
+				fromTop,
+				fromLeft,
+				barH = mathMax(plotY, yBottom) - barY;
+
+			// Handle options.minPointLength
+			if (mathAbs(barH) < minPointLength) {
+				if (minPointLength) {
+					barH = minPointLength;
+					barY =
+						mathRound(mathAbs(barY - translatedThreshold) > minPointLength ? // stacked
+							yBottom - minPointLength : // keep position
+							translatedThreshold - (yAxis.translate(point.y, 0, 1, 0, 1) <= translatedThreshold ? minPointLength : 0)); // use exact yAxis.translation (#1485)
+				}
+			}
+
+			// Cache for access in polar
+			point.barX = barX;
+			point.pointWidth = pointWidth;
+
+
+			// Round off to obtain crisp edges
+			fromLeft = mathAbs(barX) < 0.5;
+			right = mathRound(barX + barW) + xCrisp;
+			barX = mathRound(barX) + xCrisp;
+			barW = right - barX;
+
+			fromTop = mathAbs(barY) < 0.5;
+			bottom = mathRound(barY + barH) + yCrisp;
+			barY = mathRound(barY) + yCrisp;
+			barH = bottom - barY;
+
+			// Top and left edges are exceptions
+			if (fromLeft) {
+				barX += 1;
+				barW -= 1;
+			}
+			if (fromTop) {
+				barY -= 1;
+				barH += 1;
+			}
+
+			// Register shape type and arguments to be used in drawPoints
+			point.shapeType = 'rect';
+			point.shapeArgs = {
+				x: barX,
+				y: barY,
+				width: barW,
+				height: barH
+			};
+		});
+
+	},
+
+	getSymbol: noop,
+	
+	/**
+	 * Use a solid rectangle like the area series types
+	 */
+	drawLegendSymbol: AreaSeries.prototype.drawLegendSymbol,
+	
+	
+	/**
+	 * Columns have no graph
+	 */
+	drawGraph: noop,
+
+	/**
+	 * Draw the columns. For bars, the series.group is rotated, so the same coordinates
+	 * apply for columns and bars. This method is inherited by scatter series.
+	 *
+	 */
+	drawPoints: function () {
+		var series = this,
+			options = series.options,
+			renderer = series.chart.renderer,
+			shapeArgs;
+
+
+		// draw the columns
+		each(series.points, function (point) {
+			var plotY = point.plotY,
+				graphic = point.graphic;
+
+			if (plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {
+				shapeArgs = point.shapeArgs;
+				
+				if (graphic) { // update
+					stop(graphic);
+					graphic.animate(merge(shapeArgs));
+
+				} else {
+					point.graphic = graphic = renderer[point.shapeType](shapeArgs)
+						.attr(point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE])
+						.add(series.group)
+						.shadow(options.shadow, null, options.stacking && !options.borderRadius);
+				}
+
+			} else if (graphic) {
+				point.graphic = graphic.destroy(); // #1269
+			}
+		});
+	},
+
+	/**
+	 * Add tracking event listener to the series group, so the point graphics
+	 * themselves act as trackers
+	 */
+	drawTracker: function () {
+		var series = this,
+			chart = series.chart,
+			pointer = chart.pointer,
+			cursor = series.options.cursor,
+			css = cursor && { cursor: cursor },
+			onMouseOver = function (e) {
+				var target = e.target,
+					point;
+
+				if (chart.hoverSeries !== series) {
+					series.onMouseOver();
+				}
+				while (target && !point) {
+					point = target.point;
+					target = target.parentNode;
+				}
+				if (point !== UNDEFINED && point !== chart.hoverPoint) { // undefined on graph in scatterchart
+					point.onMouseOver(e);
+				}
+			};
+
+		// Add reference to the point
+		each(series.points, function (point) {
+			if (point.graphic) {
+				point.graphic.element.point = point;
+			}
+			if (point.dataLabel) {
+				point.dataLabel.element.point = point;
+			}
+		});
+
+		// Add the event listeners, we need to do this only once
+		if (!series._hasTracking) {
+			each(series.trackerGroups, function (key) {
+				if (series[key]) { // we don't always have dataLabelsGroup
+					series[key]
+						.addClass(PREFIX + 'tracker')
+						.on('mouseover', onMouseOver)
+						.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })
+						.css(css);
+					if (hasTouch) {
+						series[key].on('touchstart', onMouseOver);
+					}
+				}
+			});
+			series._hasTracking = true;
+		}
+	},
+	
+	/** 
+	 * Override the basic data label alignment by adjusting for the position of the column
+	 */
+	alignDataLabel: function (point, dataLabel, options,  alignTo, isNew) {
+		var chart = this.chart,
+			inverted = chart.inverted,
+			dlBox = point.dlBox || point.shapeArgs, // data label box for alignment
+			below = point.below || (point.plotY > pick(this.translatedThreshold, chart.plotSizeY)),
+			inside = pick(options.inside, !!this.options.stacking); // draw it inside the box?
+		
+		// Align to the column itself, or the top of it
+		if (dlBox) { // Area range uses this method but not alignTo
+			alignTo = merge(dlBox);
+			if (inverted) {
+				alignTo = {
+					x: chart.plotWidth - alignTo.y - alignTo.height,
+					y: chart.plotHeight - alignTo.x - alignTo.width,
+					width: alignTo.height,
+					height: alignTo.width
+				};
+			}
+				
+			// Compute the alignment box
+			if (!inside) {
+				if (inverted) {
+					alignTo.x += below ? 0 : alignTo.width;
+					alignTo.width = 0;
+				} else {
+					alignTo.y += below ? alignTo.height : 0;
+					alignTo.height = 0;
+				}
+			}
+		}
+		
+		// When alignment is undefined (typically columns and bars), display the individual 
+		// point below or above the point depending on the threshold
+		options.align = pick(
+			options.align, 
+			!inverted || inside ? 'center' : below ? 'right' : 'left'
+		);
+		options.verticalAlign = pick(
+			options.verticalAlign, 
+			inverted || inside ? 'middle' : below ? 'top' : 'bottom'
+		);
+		
+		// Call the parent method
+		Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);
+	},
+
+
+	/**
+	 * Animate the column heights one by one from zero
+	 * @param {Boolean} init Whether to initialize the animation or run it
+	 */
+	animate: function (init) {
+		var series = this,
+			yAxis = this.yAxis,
+			options = series.options,
+			inverted = this.chart.inverted,
+			attr = {},
+			translatedThreshold;
+
+		if (hasSVG) { // VML is too slow anyway
+			if (init) {
+				attr.scaleY = 0.001;
+				translatedThreshold = mathMin(yAxis.pos + yAxis.len, mathMax(yAxis.pos, yAxis.toPixels(options.threshold)));
+				if (inverted) {
+					attr.translateX = translatedThreshold - yAxis.len;
+				} else {
+					attr.translateY = translatedThreshold;
+				}
+				series.group.attr(attr);
+
+			} else { // run the animation
+				
+				attr.scaleY = 1;
+				attr[inverted ? 'translateX' : 'translateY'] = yAxis.pos;
+				series.group.animate(attr, series.options.animation);
+
+				// delete this function to allow it only once
+				series.animate = null;
+			}
+		}
+	},
+	
+	/**
+	 * Remove this series from the chart
+	 */
+	remove: function () {
+		var series = this,
+			chart = series.chart;
+
+		// column and bar series affects other series of the same type
+		// as they are either stacked or grouped
+		if (chart.hasRendered) {
+			each(chart.series, function (otherSeries) {
+				if (otherSeries.type === series.type) {
+					otherSeries.isDirty = true;
+				}
+			});
+		}
+
+		Series.prototype.remove.apply(series, arguments);
+	}
+});
+seriesTypes.column = ColumnSeries;
+/**
+ * Set the default options for bar
+ */
+defaultPlotOptions.bar = merge(defaultPlotOptions.column);
+/**
+ * The Bar series class
+ */
+var BarSeries = extendClass(ColumnSeries, {
+	type: 'bar',
+	inverted: true
+});
+seriesTypes.bar = BarSeries;
+
+/**
+ * Set the default options for scatter
+ */
+defaultPlotOptions.scatter = merge(defaultSeriesOptions, {
+	lineWidth: 0,
+	tooltip: {
+		headerFormat: '<span style="font-size: 10px; color:{series.color}">{series.name}</span><br/>',
+		pointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>',
+		followPointer: true
+	},
+	stickyTracking: false
+});
+
+/**
+ * The scatter series class
+ */
+var ScatterSeries = extendClass(Series, {
+	type: 'scatter',
+	sorted: false,
+	requireSorting: false,
+	noSharedTooltip: true,
+	trackerGroups: ['markerGroup'],
+
+	drawTracker: ColumnSeries.prototype.drawTracker,
+	
+	setTooltipPoints: noop
+});
+seriesTypes.scatter = ScatterSeries;
+
+/**
+ * Set the default options for pie
+ */
+defaultPlotOptions.pie = merge(defaultSeriesOptions, {
+	borderColor: '#FFFFFF',
+	borderWidth: 1,
+	center: [null, null],
+	clip: false,
+	colorByPoint: true, // always true for pies
+	dataLabels: {
+		// align: null,
+		// connectorWidth: 1,
+		// connectorColor: point.color,
+		// connectorPadding: 5,
+		distance: 30,
+		enabled: true,
+		formatter: function () {
+			return this.point.name;
+		}
+		// softConnector: true,
+		//y: 0
+	},
+	ignoreHiddenPoint: true,
+	//innerSize: 0,
+	legendType: 'point',
+	marker: null, // point options are specified in the base options
+	size: null,
+	showInLegend: false,
+	slicedOffset: 10,
+	states: {
+		hover: {
+			brightness: 0.1,
+			shadow: false
+		}
+	},
+	stickyTracking: false,
+	tooltip: {
+		followPointer: true
+	}
+});
+
+/**
+ * Extended point object for pies
+ */
+var PiePoint = extendClass(Point, {
+	/**
+	 * Initiate the pie slice
+	 */
+	init: function () {
+
+		Point.prototype.init.apply(this, arguments);
+
+		var point = this,
+			toggleSlice;
+
+		// Disallow negative values (#1530)
+		if (point.y < 0) {
+			point.y = null;
+		}
+
+		//visible: options.visible !== false,
+		extend(point, {
+			visible: point.visible !== false,
+			name: pick(point.name, 'Slice')
+		});
+
+		// add event listener for select
+		toggleSlice = function (e) {
+			point.slice(e.type === 'select');
+		};
+		addEvent(point, 'select', toggleSlice);
+		addEvent(point, 'unselect', toggleSlice);
+
+		return point;
+	},
+
+	/**
+	 * Toggle the visibility of the pie slice
+	 * @param {Boolean} vis Whether to show the slice or not. If undefined, the
+	 *    visibility is toggled
+	 */
+	setVisible: function (vis) {
+		var point = this,
+			series = point.series,
+			chart = series.chart,
+			method;
+
+		// if called without an argument, toggle visibility
+		point.visible = point.options.visible = vis = vis === UNDEFINED ? !point.visible : vis;
+		series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data
+		
+		method = vis ? 'show' : 'hide';
+
+		// Show and hide associated elements
+		each(['graphic', 'dataLabel', 'connector', 'shadowGroup'], function (key) {
+			if (point[key]) {
+				point[key][method]();
+			}
+		});
+
+		if (point.legendItem) {
+			chart.legend.colorizeItem(point, vis);
+		}
+		
+		// Handle ignore hidden slices
+		if (!series.isDirty && series.options.ignoreHiddenPoint) {
+			series.isDirty = true;
+			chart.redraw();
+		}
+	},
+
+	/**
+	 * Set or toggle whether the slice is cut out from the pie
+	 * @param {Boolean} sliced When undefined, the slice state is toggled
+	 * @param {Boolean} redraw Whether to redraw the chart. True by default.
+	 */
+	slice: function (sliced, redraw, animation) {
+		var point = this,
+			series = point.series,
+			chart = series.chart,
+			translation;
+
+		setAnimation(animation, chart);
+
+		// redraw is true by default
+		redraw = pick(redraw, true);
+
+		// if called without an argument, toggle
+		point.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;
+		series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data
+
+		translation = sliced ? point.slicedTranslation : {
+			translateX: 0,
+			translateY: 0
+		};
+
+		point.graphic.animate(translation);
+		
+		if (point.shadowGroup) {
+			point.shadowGroup.animate(translation);
+		}
+
+	}
+});
+
+/**
+ * The Pie series class
+ */
+var PieSeries = {
+	type: 'pie',
+	isCartesian: false,
+	pointClass: PiePoint,
+	requireSorting: false,
+	noSharedTooltip: true,
+	trackerGroups: ['group', 'dataLabelsGroup'],
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		stroke: 'borderColor',
+		'stroke-width': 'borderWidth',
+		fill: 'color'
+	},
+
+	/**
+	 * Pies have one color each point
+	 */
+	getColor: noop,
+
+	/**
+	 * Animate the pies in
+	 */
+	animate: function (init) {
+		var series = this,
+			points = series.points,
+			startAngleRad = series.startAngleRad;
+
+		if (!init) {
+			each(points, function (point) {
+				var graphic = point.graphic,
+					args = point.shapeArgs;
+
+				if (graphic) {
+					// start values
+					graphic.attr({
+						r: series.center[3] / 2, // animate from inner radius (#779)
+						start: startAngleRad,
+						end: startAngleRad
+					});
+
+					// animate
+					graphic.animate({
+						r: args.r,
+						start: args.start,
+						end: args.end
+					}, series.options.animation);
+				}
+			});
+
+			// delete this function to allow it only once
+			series.animate = null;
+		}
+	},
+
+	/**
+	 * Extend the basic setData method by running processData and generatePoints immediately,
+	 * in order to access the points from the legend.
+	 */
+	setData: function (data, redraw) {
+		Series.prototype.setData.call(this, data, false);
+		this.processData();
+		this.generatePoints();
+		if (pick(redraw, true)) {
+			this.chart.redraw();
+		} 
+	},
+
+	/**
+	 * Extend the generatePoints method by adding total and percentage properties to each point
+	 */
+	generatePoints: function () {
+		var i,
+			total = 0,
+			points,
+			len,
+			point,
+			ignoreHiddenPoint = this.options.ignoreHiddenPoint;
+
+		Series.prototype.generatePoints.call(this);
+
+		// Populate local vars
+		points = this.points;
+		len = points.length;
+		
+		// Get the total sum
+		for (i = 0; i < len; i++) {
+			point = points[i];
+			total += (ignoreHiddenPoint && !point.visible) ? 0 : point.y;
+		}
+		this.total = total;
+
+		// Set each point's properties
+		for (i = 0; i < len; i++) {
+			point = points[i];
+			point.percentage = total > 0 ? (point.y / total) * 100 : 0;
+			point.total = total;
+		}
+		
+	},
+	
+	/**
+	 * Get the center of the pie based on the size and center options relative to the  
+	 * plot area. Borrowed by the polar and gauge series types.
+	 */
+	getCenter: function () {
+		
+		var options = this.options,
+			chart = this.chart,
+			slicingRoom = 2 * (options.slicedOffset || 0),
+			handleSlicingRoom,
+			plotWidth = chart.plotWidth - 2 * slicingRoom,
+			plotHeight = chart.plotHeight - 2 * slicingRoom,
+			centerOption = options.center,
+			positions = [pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0],
+			smallestSize = mathMin(plotWidth, plotHeight),
+			isPercent;
+		
+		return map(positions, function (length, i) {
+			isPercent = /%$/.test(length);
+			handleSlicingRoom = i < 2 || (i === 2 && isPercent);
+			return (isPercent ?
+				// i == 0: centerX, relative to width
+				// i == 1: centerY, relative to height
+				// i == 2: size, relative to smallestSize
+				// i == 4: innerSize, relative to smallestSize
+				[plotWidth, plotHeight, smallestSize, smallestSize][i] *
+					pInt(length) / 100 :
+				length) + (handleSlicingRoom ? slicingRoom : 0);
+		});
+	},
+	
+	/**
+	 * Do translation for pie slices
+	 */
+	translate: function (positions) {
+		this.generatePoints();
+		
+		var series = this,
+			cumulative = 0,
+			precision = 1000, // issue #172
+			options = series.options,
+			slicedOffset = options.slicedOffset,
+			connectorOffset = slicedOffset + options.borderWidth,
+			start,
+			end,
+			angle,
+			startAngle = options.startAngle || 0,
+			startAngleRad = series.startAngleRad = mathPI / 180 * (startAngle - 90),
+			endAngleRad = series.endAngleRad = mathPI / 180 * ((options.endAngle || (startAngle + 360)) - 90), // docs
+			circ = endAngleRad - startAngleRad, //2 * mathPI,
+			points = series.points,
+			radiusX, // the x component of the radius vector for a given point
+			radiusY,
+			labelDistance = options.dataLabels.distance,
+			ignoreHiddenPoint = options.ignoreHiddenPoint,
+			i,
+			len = points.length,
+			point;
+
+		// Get positions - either an integer or a percentage string must be given.
+		// If positions are passed as a parameter, we're in a recursive loop for adjusting
+		// space for data labels.
+		if (!positions) {
+			series.center = positions = series.getCenter();
+		}
+
+		// utility for getting the x value from a given y, used for anticollision logic in data labels
+		series.getX = function (y, left) {
+
+			angle = math.asin((y - positions[1]) / (positions[2] / 2 + labelDistance));
+
+			return positions[0] +
+				(left ? -1 : 1) *
+				(mathCos(angle) * (positions[2] / 2 + labelDistance));
+		};
+
+		// Calculate the geometry for each point
+		for (i = 0; i < len; i++) {
+			
+			point = points[i];
+			
+			// set start and end angle
+			start = startAngleRad + (cumulative * circ);
+			if (!ignoreHiddenPoint || point.visible) {
+				cumulative += point.percentage / 100;
+			}
+			end = startAngleRad + (cumulative * circ);
+
+			// set the shape
+			point.shapeType = 'arc';
+			point.shapeArgs = {
+				x: positions[0],
+				y: positions[1],
+				r: positions[2] / 2,
+				innerR: positions[3] / 2,
+				start: mathRound(start * precision) / precision,
+				end: mathRound(end * precision) / precision
+			};
+
+			// center for the sliced out slice
+			angle = (end + start) / 2;
+			if (angle > 0.75 * circ) {
+				angle -= 2 * mathPI;
+			}
+			point.slicedTranslation = {
+				translateX: mathRound(mathCos(angle) * slicedOffset),
+				translateY: mathRound(mathSin(angle) * slicedOffset)
+			};
+
+			// set the anchor point for tooltips
+			radiusX = mathCos(angle) * positions[2] / 2;
+			radiusY = mathSin(angle) * positions[2] / 2;
+			point.tooltipPos = [
+				positions[0] + radiusX * 0.7,
+				positions[1] + radiusY * 0.7
+			];
+			
+			point.half = angle < -mathPI / 2 || angle > mathPI / 2 ? 1 : 0;
+			point.angle = angle;
+
+			// set the anchor point for data labels
+			connectorOffset = mathMin(connectorOffset, labelDistance / 2); // #1678
+			point.labelPos = [
+				positions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector
+				positions[1] + radiusY + mathSin(angle) * labelDistance, // a/a
+				positions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie
+				positions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a
+				positions[0] + radiusX, // landing point for connector
+				positions[1] + radiusY, // a/a
+				labelDistance < 0 ? // alignment
+					'center' :
+					point.half ? 'right' : 'left', // alignment
+				angle // center angle
+			];
+
+		}
+	},
+
+	setTooltipPoints: noop,
+	drawGraph: null,
+
+	/**
+	 * Draw the data points
+	 */
+	drawPoints: function () {
+		var series = this,
+			chart = series.chart,
+			renderer = chart.renderer,
+			groupTranslation,
+			//center,
+			graphic,
+			//group,
+			shadow = series.options.shadow,
+			shadowGroup,
+			shapeArgs;
+
+		if (shadow && !series.shadowGroup) {
+			series.shadowGroup = renderer.g('shadow')
+				.add(series.group);
+		}
+
+		// draw the slices
+		each(series.points, function (point) {
+			graphic = point.graphic;
+			shapeArgs = point.shapeArgs;
+			shadowGroup = point.shadowGroup;
+
+			// put the shadow behind all points
+			if (shadow && !shadowGroup) {
+				shadowGroup = point.shadowGroup = renderer.g('shadow')
+					.add(series.shadowGroup);
+			}
+
+			// if the point is sliced, use special translation, else use plot area traslation
+			groupTranslation = point.sliced ? point.slicedTranslation : {
+				translateX: 0,
+				translateY: 0
+			};
+
+			//group.translate(groupTranslation[0], groupTranslation[1]);
+			if (shadowGroup) {
+				shadowGroup.attr(groupTranslation);
+			}
+
+			// draw the slice
+			if (graphic) {
+				graphic.animate(extend(shapeArgs, groupTranslation));
+			} else {
+				point.graphic = graphic = renderer.arc(shapeArgs)
+					.setRadialReference(series.center)
+					.attr(
+						point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]
+					)
+					.attr({ 'stroke-linejoin': 'round' })
+					.attr(groupTranslation)
+					.add(series.group)
+					.shadow(shadow, shadowGroup);	
+			}
+
+			// detect point specific visibility
+			if (point.visible === false) {
+				point.setVisible(false);
+			}
+
+		});
+
+	},
+
+	/**
+	 * Utility for sorting data labels
+	 */
+	sortByAngle: function (points, sign) {
+		points.sort(function (a, b) {
+			return a.angle !== undefined && (b.angle - a.angle) * sign;
+		});
+	},
+
+	/**
+	 * Override the base drawDataLabels method by pie specific functionality
+	 */
+	drawDataLabels: function () {
+		var series = this,
+			data = series.data,
+			point,
+			chart = series.chart,
+			options = series.options.dataLabels,
+			connectorPadding = pick(options.connectorPadding, 10),
+			connectorWidth = pick(options.connectorWidth, 1),
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			connector,
+			connectorPath,
+			softConnector = pick(options.softConnector, true),
+			distanceOption = options.distance,
+			seriesCenter = series.center,
+			radius = seriesCenter[2] / 2,
+			centerY = seriesCenter[1],
+			outside = distanceOption > 0,
+			dataLabel,
+			dataLabelWidth,
+			labelPos,
+			labelHeight,
+			halves = [// divide the points into right and left halves for anti collision
+				[], // right
+				[]  // left
+			],
+			x,
+			y,
+			visibility,
+			rankArr,
+			i,
+			j,
+			overflow = [0, 0, 0, 0], // top, right, bottom, left
+			sort = function (a, b) {
+				return b.y - a.y;
+			};
+
+		// get out if not enabled
+		if (!series.visible || (!options.enabled && !series._hasPointLabels)) {
+			return;
+		}
+
+		// run parent method
+		Series.prototype.drawDataLabels.apply(series);
+
+		// arrange points for detection collision
+		each(data, function (point) {
+			if (point.dataLabel) { // it may have been cancelled in the base method (#407)
+				halves[point.half].push(point);
+			}
+		});
+
+		// assume equal label heights
+		i = 0;
+		while (!labelHeight && data[i]) { // #1569
+			labelHeight = data[i] && data[i].dataLabel && (data[i].dataLabel.getBBox().height || 21); // 21 is for #968
+			i++;
+		}
+
+		/* Loop over the points in each half, starting from the top and bottom
+		 * of the pie to detect overlapping labels.
+		 */
+		i = 2;
+		while (i--) {
+
+			var slots = [],
+				slotsLength,
+				usedSlots = [],
+				points = halves[i],
+				pos,
+				length = points.length,
+				slotIndex;
+				
+			// Sort by angle
+			series.sortByAngle(points, i - 0.5);
+
+			// Only do anti-collision when we are outside the pie and have connectors (#856)
+			if (distanceOption > 0) {
+				
+				// build the slots
+				for (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) {
+					slots.push(pos);
+					
+					// visualize the slot
+					/*
+					var slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0),
+						slotY = pos + chart.plotTop;
+					if (!isNaN(slotX)) {
+						chart.renderer.rect(slotX, slotY - 7, 100, labelHeight, 1)
+							.attr({
+								'stroke-width': 1,
+								stroke: 'silver'
+							})
+							.add();
+						chart.renderer.text('Slot '+ (slots.length - 1), slotX, slotY + 4)
+							.attr({
+								fill: 'silver'
+							}).add();
+					}
+					*/
+				}
+				slotsLength = slots.length;
+	
+				// if there are more values than available slots, remove lowest values
+				if (length > slotsLength) {
+					// create an array for sorting and ranking the points within each quarter
+					rankArr = [].concat(points);
+					rankArr.sort(sort);
+					j = length;
+					while (j--) {
+						rankArr[j].rank = j;
+					}
+					j = length;
+					while (j--) {
+						if (points[j].rank >= slotsLength) {
+							points.splice(j, 1);
+						}
+					}
+					length = points.length;
+				}
+	
+				// The label goes to the nearest open slot, but not closer to the edge than
+				// the label's index.
+				for (j = 0; j < length; j++) {
+	
+					point = points[j];
+					labelPos = point.labelPos;
+	
+					var closest = 9999,
+						distance,
+						slotI;
+	
+					// find the closest slot index
+					for (slotI = 0; slotI < slotsLength; slotI++) {
+						distance = mathAbs(slots[slotI] - labelPos[1]);
+						if (distance < closest) {
+							closest = distance;
+							slotIndex = slotI;
+						}
+					}
+	
+					// if that slot index is closer to the edges of the slots, move it
+					// to the closest appropriate slot
+					if (slotIndex < j && slots[j] !== null) { // cluster at the top
+						slotIndex = j;
+					} else if (slotsLength  < length - j + slotIndex && slots[j] !== null) { // cluster at the bottom
+						slotIndex = slotsLength - length + j;
+						while (slots[slotIndex] === null) { // make sure it is not taken
+							slotIndex++;
+						}
+					} else {
+						// Slot is taken, find next free slot below. In the next run, the next slice will find the
+						// slot above these, because it is the closest one
+						while (slots[slotIndex] === null) { // make sure it is not taken
+							slotIndex++;
+						}
+					}
+	
+					usedSlots.push({ i: slotIndex, y: slots[slotIndex] });
+					slots[slotIndex] = null; // mark as taken
+				}
+				// sort them in order to fill in from the top
+				usedSlots.sort(sort);
+			}
+
+			// now the used slots are sorted, fill them up sequentially
+			for (j = 0; j < length; j++) {
+				
+				var slot, naturalY;
+
+				point = points[j];
+				labelPos = point.labelPos;
+				dataLabel = point.dataLabel;
+				visibility = point.visible === false ? HIDDEN : VISIBLE;
+				naturalY = labelPos[1];
+				
+				if (distanceOption > 0) {
+					slot = usedSlots.pop();
+					slotIndex = slot.i;
+
+					// if the slot next to currrent slot is free, the y value is allowed
+					// to fall back to the natural position
+					y = slot.y;
+					if ((naturalY > y && slots[slotIndex + 1] !== null) ||
+							(naturalY < y &&  slots[slotIndex - 1] !== null)) {
+						y = naturalY;
+					}
+					
+				} else {
+					y = naturalY;
+				}
+
+				// get the x - use the natural x position for first and last slot, to prevent the top
+				// and botton slice connectors from touching each other on either side
+				x = options.justify ? 
+					seriesCenter[0] + (i ? -1 : 1) * (radius + distanceOption) :
+					series.getX(slotIndex === 0 || slotIndex === slots.length - 1 ? naturalY : y, i);
+				
+			
+				// Record the placement and visibility
+				dataLabel._attr = {
+					visibility: visibility,
+					align: labelPos[6]
+				};
+				dataLabel._pos = {
+					x: x + options.x +
+						({ left: connectorPadding, right: -connectorPadding }[labelPos[6]] || 0),
+					y: y + options.y - 10 // 10 is for the baseline (label vs text)
+				};
+				dataLabel.connX = x;
+				dataLabel.connY = y;
+				
+						
+				// Detect overflowing data labels
+				if (this.options.size === null) {
+					dataLabelWidth = dataLabel.width;
+					// Overflow left
+					if (x - dataLabelWidth < connectorPadding) {
+						overflow[3] = mathMax(mathRound(dataLabelWidth - x + connectorPadding), overflow[3]);
+						
+					// Overflow right
+					} else if (x + dataLabelWidth > plotWidth - connectorPadding) {
+						overflow[1] = mathMax(mathRound(x + dataLabelWidth - plotWidth + connectorPadding), overflow[1]);
+					}
+					
+					// Overflow top
+					if (y - labelHeight / 2 < 0) {
+						overflow[0] = mathMax(mathRound(-y + labelHeight / 2), overflow[0]);
+						
+					// Overflow left
+					} else if (y + labelHeight / 2 > plotHeight) {
+						overflow[2] = mathMax(mathRound(y + labelHeight / 2 - plotHeight), overflow[2]);
+					}
+				}
+			} // for each point
+		} // for each half
+		
+		// Do not apply the final placement and draw the connectors until we have verified
+		// that labels are not spilling over. 
+		if (arrayMax(overflow) === 0 || this.verifyDataLabelOverflow(overflow)) {
+			
+			// Place the labels in the final position
+			this.placeDataLabels();
+			
+			// Draw the connectors
+			if (outside && connectorWidth) {
+				each(this.points, function (point) {
+					connector = point.connector;
+					labelPos = point.labelPos;
+					dataLabel = point.dataLabel;
+					
+					if (dataLabel && dataLabel._pos) {
+						visibility = dataLabel._attr.visibility;
+						x = dataLabel.connX;
+						y = dataLabel.connY;
+						connectorPath = softConnector ? [
+							M,
+							x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label
+							'C',
+							x, y, // first break, next to the label
+							2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],
+							labelPos[2], labelPos[3], // second break
+							L,
+							labelPos[4], labelPos[5] // base
+						] : [
+							M,
+							x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label
+							L,
+							labelPos[2], labelPos[3], // second break
+							L,
+							labelPos[4], labelPos[5] // base
+						];
+		
+						if (connector) {
+							connector.animate({ d: connectorPath });
+							connector.attr('visibility', visibility);
+		
+						} else {
+							point.connector = connector = series.chart.renderer.path(connectorPath).attr({
+								'stroke-width': connectorWidth,
+								stroke: options.connectorColor || point.color || '#606060',
+								visibility: visibility
+							})
+							.add(series.group);
+						}
+					} else if (connector) {
+						point.connector = connector.destroy();
+					}
+				});
+			}			
+		}
+	},
+	
+	/**
+	 * Verify whether the data labels are allowed to draw, or we should run more translation and data
+	 * label positioning to keep them inside the plot area. Returns true when data labels are ready 
+	 * to draw.
+	 */
+	verifyDataLabelOverflow: function (overflow) {
+		
+		var center = this.center,
+			options = this.options,
+			centerOption = options.center,
+			minSize = options.minSize || 80,
+			newSize = minSize,
+			ret;
+			
+		// Handle horizontal size and center
+		if (centerOption[0] !== null) { // Fixed center
+			newSize = mathMax(center[2] - mathMax(overflow[1], overflow[3]), minSize);
+			
+		} else { // Auto center
+			newSize = mathMax(
+				center[2] - overflow[1] - overflow[3], // horizontal overflow					
+				minSize
+			);
+			center[0] += (overflow[3] - overflow[1]) / 2; // horizontal center
+		}
+		
+		// Handle vertical size and center
+		if (centerOption[1] !== null) { // Fixed center
+			newSize = mathMax(mathMin(newSize, center[2] - mathMax(overflow[0], overflow[2])), minSize);
+			
+		} else { // Auto center
+			newSize = mathMax(
+				mathMin(
+					newSize,		
+					center[2] - overflow[0] - overflow[2] // vertical overflow
+				),
+				minSize
+			);
+			center[1] += (overflow[0] - overflow[2]) / 2; // vertical center
+		}
+		
+		// If the size must be decreased, we need to run translate and drawDataLabels again
+		if (newSize < center[2]) {
+			center[2] = newSize;
+			this.translate(center);
+			each(this.points, function (point) {
+				if (point.dataLabel) {
+					point.dataLabel._pos = null; // reset
+				}
+			});
+			this.drawDataLabels();
+			
+		// Else, return true to indicate that the pie and its labels is within the plot area
+		} else {
+			ret = true;
+		}
+		return ret;
+	},
+	
+	/**
+	 * Perform the final placement of the data labels after we have verified that they
+	 * fall within the plot area.
+	 */
+	placeDataLabels: function () {
+		each(this.points, function (point) {
+			var dataLabel = point.dataLabel,
+				_pos;
+			
+			if (dataLabel) {
+				_pos = dataLabel._pos;
+				if (_pos) {
+					dataLabel.attr(dataLabel._attr);			
+					dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);
+					dataLabel.moved = true;
+				} else if (dataLabel) {
+					dataLabel.attr({ y: -999 });
+				}
+			}
+		});
+	},
+	
+	alignDataLabel: noop,
+
+	/**
+	 * Draw point specific tracker objects. Inherit directly from column series.
+	 */
+	drawTracker: ColumnSeries.prototype.drawTracker,
+
+	/**
+	 * Use a simple symbol from column prototype
+	 */
+	drawLegendSymbol: AreaSeries.prototype.drawLegendSymbol,
+
+	/**
+	 * Pies don't have point marker symbols
+	 */
+	getSymbol: noop
+
+};
+PieSeries = extendClass(Series, PieSeries);
+seriesTypes.pie = PieSeries;
+
+
+// global variables
+extend(Highcharts, {
+	
+	// Constructors
+	Axis: Axis,
+	Chart: Chart,
+	Color: Color,
+	Legend: Legend,
+	Pointer: Pointer,
+	Point: Point,
+	Tick: Tick,
+	Tooltip: Tooltip,
+	Renderer: Renderer,
+	Series: Series,
+	SVGElement: SVGElement,
+	SVGRenderer: SVGRenderer,
+	
+	// Various
+	arrayMin: arrayMin,
+	arrayMax: arrayMax,
+	charts: charts,
+	dateFormat: dateFormat,
+	format: format,
+	pathAnim: pathAnim,
+	getOptions: getOptions,
+	hasBidiBug: hasBidiBug,
+	isTouchDevice: isTouchDevice,
+	numberFormat: numberFormat,
+	seriesTypes: seriesTypes,
+	setOptions: setOptions,
+	addEvent: addEvent,
+	removeEvent: removeEvent,
+	createElement: createElement,
+	discardElement: discardElement,
+	css: css,
+	each: each,
+	extend: extend,
+	map: map,
+	merge: merge,
+	pick: pick,
+	splat: splat,
+	extendClass: extendClass,
+	pInt: pInt,
+	wrap: wrap,
+	svg: hasSVG,
+	canvas: useCanVG,
+	vml: !hasSVG && !useCanVG,
+	product: PRODUCT,
+	version: VERSION
+});
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/annotations.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/annotations.js
new file mode 100644
index 0000000..53958c1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/annotations.js
@@ -0,0 +1,7 @@
+(function(i,C){function m(a){return typeof a==="number"}function n(a){return a!==D&&a!==null}var D,p,r,s=i.Chart,t=i.extend,z=i.each;r=["path","rect","circle"];p={top:0,left:0,center:0.5,middle:0.5,bottom:1,right:1};var u=C.inArray,A=i.merge,B=function(){this.init.apply(this,arguments)};B.prototype={init:function(a,d){var c=d.shape&&d.shape.type;this.chart=a;var b,f;f={xAxis:0,yAxis:0,title:{style:{},text:"",x:0,y:0},shape:{params:{stroke:"#000000",fill:"transparent",strokeWidth:2}}};b={circle:{params:{x:0,
+y:0}}};if(b[c])f.shape=A(f.shape,b[c]);this.options=A({},f,d)},render:function(a){var d=this.chart,c=this.chart.renderer,b=this.group,f=this.title,e=this.shape,h=this.options,i=h.title,l=h.shape;if(!b)b=this.group=c.g();if(!e&&l&&u(l.type,r)!==-1)e=this.shape=c[h.shape.type](l.params),e.add(b);if(!f&&i)f=this.title=c.label(i),f.add(b);b.add(d.annotations.group);this.linkObjects();a!==!1&&this.redraw()},redraw:function(){var a=this.options,d=this.chart,c=this.group,b=this.title,f=this.shape,e=this.linkedObject,
+h=d.xAxis[a.xAxis],v=d.yAxis[a.yAxis],l=a.width,w=a.height,x=p[a.anchorY],y=p[a.anchorX],j,o,g,q;if(e)j=e instanceof i.Point?"point":e instanceof i.Series?"series":null,j==="point"?(a.xValue=e.x,a.yValue=e.y,o=e.series):j==="series"&&(o=e),c.visibility!==o.group.visibility&&c.attr({visibility:o.group.visibility});e=n(a.xValue)?h.toPixels(a.xValue+h.minPointOffset)-h.minPixelPadding:a.x;j=n(a.yValue)?v.toPixels(a.yValue):a.y;if(!isNaN(e)&&!isNaN(j)&&m(e)&&m(j)){b&&(b.attr(a.title),b.css(a.title.style));
+if(f){b=t({},a.shape.params);if(a.units==="values"){for(g in b)u(g,["width","x"])>-1?b[g]=h.translate(b[g]):u(g,["height","y"])>-1&&(b[g]=v.translate(b[g]));b.width&&(b.width-=h.toPixels(0)-h.left);b.x&&(b.x+=h.minPixelPadding);if(a.shape.type==="path"){g=b.d;o=e;for(var r=j,s=g.length,k=0;k<s;)typeof g[k]==="number"&&typeof g[k+1]==="number"?(g[k]=h.toPixels(g[k])-o,g[k+1]=v.toPixels(g[k+1])-r,k+=2):k+=1}}a.shape.type==="circle"&&(b.x+=b.r,b.y+=b.r);f.attr(b)}c.bBox=null;if(!m(l))q=c.getBBox(),l=
+q.width;if(!m(w))q||(q=c.getBBox()),w=q.height;if(!m(y))y=p.center;if(!m(x))x=p.center;e-=l*y;j-=w*x;d.animation&&n(c.translateX)&&n(c.translateY)?c.animate({translateX:e,translateY:j}):c.translate(e,j)}},destroy:function(){var a=this,d=this.chart.annotations.allItems,c=d.indexOf(a);c>-1&&d.splice(c,1);z(["title","shape","group"],function(b){a[b]&&(a[b].destroy(),a[b]=null)});a.group=a.title=a.shape=a.chart=a.options=null},update:function(a,d){t(this.options,a);this.linkObjects();this.render(d)},
+linkObjects:function(){var a=this.chart,d=this.linkedObject,c=d&&(d.id||d.options.id),b=this.options.linkedTo;if(n(b)){if(!n(d)||b!==c)this.linkedObject=a.get(b)}else this.linkedObject=null}};t(s.prototype,{annotations:{add:function(a,d){var c=this.allItems,b=this.chart,f,e;Object.prototype.toString.call(a)==="[object Array]"||(a=[a]);for(e=a.length;e--;)f=new B(b,a[e]),c.push(f),f.render(d)},redraw:function(){z(this.allItems,function(a){a.redraw()})}}});s.prototype.callbacks.push(function(a){var d=
+a.options.annotations,c;c=a.renderer.g("annotations");c.attr({zIndex:7});c.add();a.annotations.allItems=[];a.annotations.chart=a;a.annotations.group=c;Object.prototype.toString.call(d)==="[object Array]"&&d.length>0&&a.annotations.add(a.options.annotations);i.addEvent(a,"redraw",function(){a.annotations.redraw()})})})(Highcharts,HighchartsAdapter);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/annotations.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/annotations.src.js
new file mode 100644
index 0000000..40ce8df
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/annotations.src.js
@@ -0,0 +1,401 @@
+(function (Highcharts, HighchartsAdapter) {
+
+var UNDEFINED,
+	ALIGN_FACTOR,
+	ALLOWED_SHAPES,
+	Chart = Highcharts.Chart,
+	extend = Highcharts.extend,
+	each = Highcharts.each;
+
+ALLOWED_SHAPES = ["path", "rect", "circle"];
+
+ALIGN_FACTOR = {
+	top: 0,
+	left: 0,
+	center: 0.5,
+	middle: 0.5,
+	bottom: 1,
+	right: 1
+};
+
+
+// Highcharts helper methods
+var inArray = HighchartsAdapter.inArray,
+	merge = Highcharts.merge;
+
+function defaultOptions(shapeType) {
+	var shapeOptions,
+		options;
+
+	options = {
+		xAxis: 0,
+		yAxis: 0,
+		title: {
+			style: {},
+			text: "",
+			x: 0,
+			y: 0
+		},
+		shape: {
+			params: {
+				stroke: "#000000",
+				fill: "transparent",
+				strokeWidth: 2
+			}
+		}
+	};
+
+	shapeOptions = {
+		circle: {
+			params: {
+				x: 0,
+				y: 0
+			}
+		}
+	};
+
+	if (shapeOptions[shapeType]) {
+		options.shape = merge(options.shape, shapeOptions[shapeType]);
+	}
+
+	return options;
+}
+
+function isArray(obj) {
+	return Object.prototype.toString.call(obj) === '[object Array]';
+}
+
+function isNumber(n) {
+	return typeof n === 'number';
+}
+
+function defined(obj) {
+	return obj !== UNDEFINED && obj !== null;
+}
+
+function translatePath(d, xAxis, yAxis, xOffset, yOffset) {
+	var len = d.length,
+		i = 0;
+
+	while (i < len) {
+		if (typeof d[i] === 'number' && typeof d[i + 1] === 'number') {
+			d[i] = xAxis.toPixels(d[i]) - xOffset;
+			d[i + 1] = yAxis.toPixels(d[i + 1]) - yOffset;
+			i += 2;
+		} else {
+			i += 1;
+		}
+	}
+
+	return d;
+}
+
+
+// Define annotation prototype
+var Annotation = function () {
+	this.init.apply(this, arguments);
+};
+Annotation.prototype = {
+	/* 
+	 * Initialize the annotation
+	 */
+	init: function (chart, options) {
+		var shapeType = options.shape && options.shape.type;
+
+		this.chart = chart;
+		this.options = merge({}, defaultOptions(shapeType), options);
+	},
+
+	/*
+	 * Render the annotation
+	 */
+	render: function (redraw) {
+		var annotation = this,
+			chart = this.chart,
+			renderer = annotation.chart.renderer,
+			group = annotation.group,
+			title = annotation.title,
+			shape = annotation.shape,
+			options = annotation.options,
+			titleOptions = options.title,
+			shapeOptions = options.shape;
+
+		if (!group) {
+			group = annotation.group = renderer.g();
+		}
+
+
+		if (!shape && shapeOptions && inArray(shapeOptions.type, ALLOWED_SHAPES) !== -1) {
+			shape = annotation.shape = renderer[options.shape.type](shapeOptions.params);
+			shape.add(group);
+		}
+
+		if (!title && titleOptions) {
+			title = annotation.title = renderer.label(titleOptions);
+			title.add(group);
+		}
+
+		group.add(chart.annotations.group);
+
+		// link annotations to point or series
+		annotation.linkObjects();
+
+		if (redraw !== false) {
+			annotation.redraw();
+		}
+	},
+
+	/*
+	 * Redraw the annotation title or shape after options update
+	 */
+	redraw: function () {
+		var options = this.options,
+			chart = this.chart,
+			group = this.group,
+			title = this.title,
+			shape = this.shape,
+			linkedTo = this.linkedObject,
+			xAxis = chart.xAxis[options.xAxis],
+			yAxis = chart.yAxis[options.yAxis],
+			width = options.width,
+			height = options.height,
+			anchorY = ALIGN_FACTOR[options.anchorY],
+			anchorX = ALIGN_FACTOR[options.anchorX],
+			resetBBox = false,
+			shapeParams,
+			linkType,
+			series,
+			param,
+			bbox,
+			x,
+			y;
+
+		if (linkedTo) {
+			linkType = (linkedTo instanceof Highcharts.Point) ? 'point' :
+						(linkedTo instanceof Highcharts.Series) ? 'series' : null;
+
+			if (linkType === 'point') {
+				options.xValue = linkedTo.x;
+				options.yValue = linkedTo.y;
+				series = linkedTo.series;
+			} else if (linkType === 'series') {
+				series = linkedTo;
+			}
+
+			if (group.visibility !== series.group.visibility) {
+				group.attr({
+					visibility: series.group.visibility
+				});
+			}
+		}
+
+
+		// Based on given options find annotation pixel position
+		x = (defined(options.xValue) ? xAxis.toPixels(options.xValue + xAxis.minPointOffset) - xAxis.minPixelPadding : options.x);
+		y = defined(options.yValue) ? yAxis.toPixels(options.yValue) : options.y;
+
+		if (isNaN(x) || isNaN(y) || !isNumber(x) || !isNumber(y)) {
+			return;
+		}
+
+
+		if (title) {
+			title.attr(options.title);
+			title.css(options.title.style);
+			resetBBox = true;
+		}
+
+		if (shape) {
+			shapeParams = extend({}, options.shape.params);
+
+			if (options.units === 'values') {
+				for (param in shapeParams) {
+					if (inArray(param, ['width', 'x']) > -1) {
+						shapeParams[param] = xAxis.translate(shapeParams[param]);
+					} else if (inArray(param, ['height', 'y']) > -1) {
+						shapeParams[param] = yAxis.translate(shapeParams[param]);
+					}
+				}
+
+				if (shapeParams.width) {
+					shapeParams.width -= xAxis.toPixels(0) - xAxis.left;
+				}
+
+				if (shapeParams.x) {
+					shapeParams.x += xAxis.minPixelPadding;
+				}
+
+				if (options.shape.type === 'path') {
+					translatePath(shapeParams.d, xAxis, yAxis, x, y);
+				}
+			}
+
+			// move the center of the circle to shape x/y
+			if (options.shape.type === 'circle') {
+				shapeParams.x += shapeParams.r;
+				shapeParams.y += shapeParams.r;
+			}
+
+			resetBBox = true;
+			shape.attr(shapeParams);
+		}
+
+		group.bBox = null;
+
+		// If annotation width or height is not defined in options use bounding box size
+		if (!isNumber(width)) {
+			bbox = group.getBBox();
+			width = bbox.width;
+		}
+
+		if (!isNumber(height)) {
+			// get bbox only if it wasn't set before
+			if (!bbox) {
+				bbox = group.getBBox();
+			}
+
+			height = bbox.height;
+		}
+
+		// Calculate anchor point
+		if (!isNumber(anchorX)) {
+			anchorX = ALIGN_FACTOR.center;
+		}
+
+		if (!isNumber(anchorY)) {
+			anchorY = ALIGN_FACTOR.center;
+		}
+
+		// Translate group according to its dimension and anchor point
+		x = x - width * anchorX;
+		y = y - height * anchorY;
+
+		if (chart.animation && defined(group.translateX) && defined(group.translateY)) {
+			group.animate({
+				translateX: x,
+				translateY: y
+			});
+		} else {
+			group.translate(x, y);
+		}
+	},
+
+	/*
+	 * Destroy the annotation
+	 */
+	destroy: function () {
+		var annotation = this,
+			chart = this.chart,
+			allItems = chart.annotations.allItems,
+			index = allItems.indexOf(annotation);
+
+		if (index > -1) {
+			allItems.splice(index, 1);
+		}
+
+		each(['title', 'shape', 'group'], function (element) {
+			if (annotation[element]) {
+				annotation[element].destroy();
+				annotation[element] = null;
+			}
+		});
+
+		annotation.group = annotation.title = annotation.shape = annotation.chart = annotation.options = null;
+	},
+
+	/*
+	 * Update the annotation with a given options
+	 */
+	update: function (options, redraw) {
+		extend(this.options, options);
+
+		// update link to point or series
+		this.linkObjects();
+
+		this.render(redraw);
+	},
+
+	linkObjects: function () {
+		var annotation = this,
+			chart = annotation.chart,
+			linkedTo = annotation.linkedObject,
+			linkedId = linkedTo && (linkedTo.id || linkedTo.options.id),
+			options = annotation.options,
+			id = options.linkedTo;
+
+		if (!defined(id)) {
+			annotation.linkedObject = null;
+		} else if (!defined(linkedTo) || id !== linkedId) {
+			annotation.linkedObject = chart.get(id);
+		}
+	}
+};
+
+
+// Add annotations methods to chart prototype
+extend(Chart.prototype, {
+	annotations: {
+		/*
+		 * Unified method for adding annotations to the chart
+		 */
+		add: function (options, redraw) {
+			var annotations = this.allItems,
+				chart = this.chart,
+				item,
+				len;
+
+			if (!isArray(options)) {
+				options = [options];
+			}
+
+			len = options.length;
+
+			while (len--) {
+				item = new Annotation(chart, options[len]);
+				annotations.push(item);
+				item.render(redraw);
+			}
+		},
+
+		/**
+		 * Redraw all annotations, method used in chart events
+		 */
+		redraw: function () {
+			each(this.allItems, function (annotation) {
+				annotation.redraw();
+			});
+		}
+	}
+});
+
+
+// Initialize on chart load
+Chart.prototype.callbacks.push(function (chart) {
+	var options = chart.options.annotations,
+		group;
+
+	group = chart.renderer.g("annotations");
+	group.attr({
+		zIndex: 7
+	});
+	group.add();
+
+	// initialize empty array for annotations
+	chart.annotations.allItems = [];
+
+	// link chart object to annotations
+	chart.annotations.chart = chart;
+
+	// link annotations group element to the chart
+	chart.annotations.group = group;
+
+	if (isArray(options) && options.length > 0) {
+		chart.annotations.add(chart.options.annotations);
+	}
+
+	// update annotations after chart redraw
+	Highcharts.addEvent(chart, 'redraw', function () {
+		chart.annotations.redraw();
+	});
+});
+}(Highcharts, HighchartsAdapter));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/canvas-tools.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/canvas-tools.js
new file mode 100644
index 0000000..0ddf77a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/canvas-tools.js
@@ -0,0 +1,133 @@
+/*
+ A class to parse color values
+ @author Stoyan Stefanov <sstoo@gmail.com>
+ @link   http://www.phpied.com/rgb-color-parser-in-javascript/
+ Use it if you like it
+
+ canvg.js - Javascript SVG parser and renderer on Canvas
+ MIT Licensed 
+ Gabe Lerner (gabelerner@gmail.com)
+ http://code.google.com/p/canvg/
+
+ Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/
+
+ Highcharts JS v3.0.6 (2013-10-04)
+ CanVGRenderer Extension module
+
+ (c) 2011-2012 Torstein Hønsi, Erik Olsson
+
+ License: www.highcharts.com/license
+*/
+function RGBColor(m){this.ok=!1;m.charAt(0)=="#"&&(m=m.substr(1,6));var m=m.replace(/ /g,""),m=m.toLowerCase(),a={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",
+darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",
+gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",
+lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",
+oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",
+slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"},c;for(c in a)m==c&&(m=a[c]);var d=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(b){return[parseInt(b[1]),parseInt(b[2]),parseInt(b[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,
+example:["#00ff00","336699"],process:function(b){return[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(b){return[parseInt(b[1]+b[1],16),parseInt(b[2]+b[2],16),parseInt(b[3]+b[3],16)]}}];for(c=0;c<d.length;c++){var b=d[c].process,k=d[c].re.exec(m);if(k)channels=b(k),this.r=channels[0],this.g=channels[1],this.b=channels[2],this.ok=!0}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r;this.g=this.g<0||isNaN(this.g)?0:
+this.g>255?255:this.g;this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b;this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"};this.toHex=function(){var b=this.r.toString(16),a=this.g.toString(16),d=this.b.toString(16);b.length==1&&(b="0"+b);a.length==1&&(a="0"+a);d.length==1&&(d="0"+d);return"#"+b+a+d};this.getHelpXML=function(){for(var b=[],k=0;k<d.length;k++)for(var c=d[k].example,j=0;j<c.length;j++)b[b.length]=c[j];for(var h in a)b[b.length]=h;c=document.createElement("ul");
+c.setAttribute("id","rgbcolor-examples");for(k=0;k<b.length;k++)try{var l=document.createElement("li"),o=new RGBColor(b[k]),n=document.createElement("div");n.style.cssText="margin: 3px; border: 1px solid black; background:"+o.toHex()+"; color:"+o.toHex();n.appendChild(document.createTextNode("test"));var q=document.createTextNode(" "+b[k]+" -> "+o.toRGB()+" -> "+o.toHex());l.appendChild(n);l.appendChild(q);c.appendChild(l)}catch(p){}return c}}
+if(!window.console)window.console={},window.console.log=function(){},window.console.dir=function(){};if(!Array.prototype.indexOf)Array.prototype.indexOf=function(m){for(var a=0;a<this.length;a++)if(this[a]==m)return a;return-1};
+(function(){function m(){var a={FRAMERATE:30,MAX_VIRTUAL_PIXELS:3E4};a.init=function(c){a.Definitions={};a.Styles={};a.Animations=[];a.Images=[];a.ctx=c;a.ViewPort=new function(){this.viewPorts=[];this.Clear=function(){this.viewPorts=[]};this.SetCurrent=function(a,b){this.viewPorts.push({width:a,height:b})};this.RemoveCurrent=function(){this.viewPorts.pop()};this.Current=function(){return this.viewPorts[this.viewPorts.length-1]};this.width=function(){return this.Current().width};this.height=function(){return this.Current().height};
+this.ComputeSize=function(a){return a!=null&&typeof a=="number"?a:a=="x"?this.width():a=="y"?this.height():Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}};a.init();a.ImagesLoaded=function(){for(var c=0;c<a.Images.length;c++)if(!a.Images[c].loaded)return!1;return!0};a.trim=function(a){return a.replace(/^\s+|\s+$/g,"")};a.compressSpaces=function(a){return a.replace(/[\s\r\t\n]+/gm," ")};a.ajax=function(a){var d;return(d=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"))?
+(d.open("GET",a,!1),d.send(null),d.responseText):null};a.parseXml=function(a){if(window.DOMParser)return(new DOMParser).parseFromString(a,"text/xml");else{var a=a.replace(/<!DOCTYPE svg[^>]*>/,""),d=new ActiveXObject("Microsoft.XMLDOM");d.async="false";d.loadXML(a);return d}};a.Property=function(c,d){this.name=c;this.value=d;this.hasValue=function(){return this.value!=null&&this.value!==""};this.numValue=function(){if(!this.hasValue())return 0;var b=parseFloat(this.value);(this.value+"").match(/%$/)&&
+(b/=100);return b};this.valueOrDefault=function(b){return this.hasValue()?this.value:b};this.numValueOrDefault=function(b){return this.hasValue()?this.numValue():b};var b=this;this.Color={addOpacity:function(d){var c=b.value;if(d!=null&&d!=""){var f=new RGBColor(b.value);f.ok&&(c="rgba("+f.r+", "+f.g+", "+f.b+", "+d+")")}return new a.Property(b.name,c)}};this.Definition={getDefinition:function(){var d=b.value.replace(/^(url\()?#([^\)]+)\)?$/,"$2");return a.Definitions[d]},isUrl:function(){return b.value.indexOf("url(")==
+0},getFillStyle:function(b){var d=this.getDefinition();return d!=null&&d.createGradient?d.createGradient(a.ctx,b):d!=null&&d.createPattern?d.createPattern(a.ctx,b):null}};this.Length={DPI:function(){return 96},EM:function(b){var d=12,c=new a.Property("fontSize",a.Font.Parse(a.ctx.font).fontSize);c.hasValue()&&(d=c.Length.toPixels(b));return d},toPixels:function(d){if(!b.hasValue())return 0;var c=b.value+"";return c.match(/em$/)?b.numValue()*this.EM(d):c.match(/ex$/)?b.numValue()*this.EM(d)/2:c.match(/px$/)?
+b.numValue():c.match(/pt$/)?b.numValue()*1.25:c.match(/pc$/)?b.numValue()*15:c.match(/cm$/)?b.numValue()*this.DPI(d)/2.54:c.match(/mm$/)?b.numValue()*this.DPI(d)/25.4:c.match(/in$/)?b.numValue()*this.DPI(d):c.match(/%$/)?b.numValue()*a.ViewPort.ComputeSize(d):b.numValue()}};this.Time={toMilliseconds:function(){if(!b.hasValue())return 0;var a=b.value+"";if(a.match(/s$/))return b.numValue()*1E3;a.match(/ms$/);return b.numValue()}};this.Angle={toRadians:function(){if(!b.hasValue())return 0;var a=b.value+
+"";return a.match(/deg$/)?b.numValue()*(Math.PI/180):a.match(/grad$/)?b.numValue()*(Math.PI/200):a.match(/rad$/)?b.numValue():b.numValue()*(Math.PI/180)}}};a.Font=new function(){this.Styles=["normal","italic","oblique","inherit"];this.Variants=["normal","small-caps","inherit"];this.Weights="normal,bold,bolder,lighter,100,200,300,400,500,600,700,800,900,inherit".split(",");this.CreateFont=function(d,b,c,e,f,g){g=g!=null?this.Parse(g):this.CreateFont("","","","","",a.ctx.font);return{fontFamily:f||
+g.fontFamily,fontSize:e||g.fontSize,fontStyle:d||g.fontStyle,fontWeight:c||g.fontWeight,fontVariant:b||g.fontVariant,toString:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var c=this;this.Parse=function(d){for(var b={},d=a.trim(a.compressSpaces(d||"")).split(" "),k=!1,e=!1,f=!1,g=!1,j="",h=0;h<d.length;h++)if(!e&&c.Styles.indexOf(d[h])!=-1){if(d[h]!="inherit")b.fontStyle=d[h];e=!0}else if(!g&&c.Variants.indexOf(d[h])!=-1){if(d[h]!="inherit")b.fontVariant=
+d[h];e=g=!0}else if(!f&&c.Weights.indexOf(d[h])!=-1){if(d[h]!="inherit")b.fontWeight=d[h];e=g=f=!0}else if(k)d[h]!="inherit"&&(j+=d[h]);else{if(d[h]!="inherit")b.fontSize=d[h].split("/")[0];e=g=f=k=!0}if(j!="")b.fontFamily=j;return b}};a.ToNumberArray=function(c){for(var c=a.trim(a.compressSpaces((c||"").replace(/,/g," "))).split(" "),d=0;d<c.length;d++)c[d]=parseFloat(c[d]);return c};a.Point=function(a,d){this.x=a;this.y=d;this.angleTo=function(b){return Math.atan2(b.y-this.y,b.x-this.x)};this.applyTransform=
+function(b){var a=this.x*b[1]+this.y*b[3]+b[5];this.x=this.x*b[0]+this.y*b[2]+b[4];this.y=a}};a.CreatePoint=function(c){c=a.ToNumberArray(c);return new a.Point(c[0],c[1])};a.CreatePath=function(c){for(var c=a.ToNumberArray(c),d=[],b=0;b<c.length;b+=2)d.push(new a.Point(c[b],c[b+1]));return d};a.BoundingBox=function(a,d,b,k){this.y2=this.x2=this.y1=this.x1=Number.NaN;this.x=function(){return this.x1};this.y=function(){return this.y1};this.width=function(){return this.x2-this.x1};this.height=function(){return this.y2-
+this.y1};this.addPoint=function(b,a){if(b!=null){if(isNaN(this.x1)||isNaN(this.x2))this.x2=this.x1=b;if(b<this.x1)this.x1=b;if(b>this.x2)this.x2=b}if(a!=null){if(isNaN(this.y1)||isNaN(this.y2))this.y2=this.y1=a;if(a<this.y1)this.y1=a;if(a>this.y2)this.y2=a}};this.addX=function(b){this.addPoint(b,null)};this.addY=function(b){this.addPoint(null,b)};this.addBoundingBox=function(b){this.addPoint(b.x1,b.y1);this.addPoint(b.x2,b.y2)};this.addQuadraticCurve=function(b,a,d,c,k,l){d=b+2/3*(d-b);c=a+2/3*(c-
+a);this.addBezierCurve(b,a,d,d+1/3*(k-b),c,c+1/3*(l-a),k,l)};this.addBezierCurve=function(b,a,d,c,k,l,o,n){var q=[b,a],p=[d,c],t=[k,l],m=[o,n];this.addPoint(q[0],q[1]);this.addPoint(m[0],m[1]);for(i=0;i<=1;i++)b=function(b){return Math.pow(1-b,3)*q[i]+3*Math.pow(1-b,2)*b*p[i]+3*(1-b)*Math.pow(b,2)*t[i]+Math.pow(b,3)*m[i]},a=6*q[i]-12*p[i]+6*t[i],d=-3*q[i]+9*p[i]-9*t[i]+3*m[i],c=3*p[i]-3*q[i],d==0?a!=0&&(a=-c/a,0<a&&a<1&&(i==0&&this.addX(b(a)),i==1&&this.addY(b(a)))):(c=Math.pow(a,2)-4*c*d,c<0||(k=
+(-a+Math.sqrt(c))/(2*d),0<k&&k<1&&(i==0&&this.addX(b(k)),i==1&&this.addY(b(k))),a=(-a-Math.sqrt(c))/(2*d),0<a&&a<1&&(i==0&&this.addX(b(a)),i==1&&this.addY(b(a)))))};this.isPointInBox=function(b,a){return this.x1<=b&&b<=this.x2&&this.y1<=a&&a<=this.y2};this.addPoint(a,d);this.addPoint(b,k)};a.Transform=function(c){var d=this;this.Type={};this.Type.translate=function(b){this.p=a.CreatePoint(b);this.apply=function(b){b.translate(this.p.x||0,this.p.y||0)};this.applyToPoint=function(b){b.applyTransform([1,
+0,0,1,this.p.x||0,this.p.y||0])}};this.Type.rotate=function(b){b=a.ToNumberArray(b);this.angle=new a.Property("angle",b[0]);this.cx=b[1]||0;this.cy=b[2]||0;this.apply=function(b){b.translate(this.cx,this.cy);b.rotate(this.angle.Angle.toRadians());b.translate(-this.cx,-this.cy)};this.applyToPoint=function(b){var a=this.angle.Angle.toRadians();b.applyTransform([1,0,0,1,this.p.x||0,this.p.y||0]);b.applyTransform([Math.cos(a),Math.sin(a),-Math.sin(a),Math.cos(a),0,0]);b.applyTransform([1,0,0,1,-this.p.x||
+0,-this.p.y||0])}};this.Type.scale=function(b){this.p=a.CreatePoint(b);this.apply=function(b){b.scale(this.p.x||1,this.p.y||this.p.x||1)};this.applyToPoint=function(b){b.applyTransform([this.p.x||0,0,0,this.p.y||0,0,0])}};this.Type.matrix=function(b){this.m=a.ToNumberArray(b);this.apply=function(b){b.transform(this.m[0],this.m[1],this.m[2],this.m[3],this.m[4],this.m[5])};this.applyToPoint=function(b){b.applyTransform(this.m)}};this.Type.SkewBase=function(b){this.base=d.Type.matrix;this.base(b);this.angle=
+new a.Property("angle",b)};this.Type.SkewBase.prototype=new this.Type.matrix;this.Type.skewX=function(b){this.base=d.Type.SkewBase;this.base(b);this.m=[1,0,Math.tan(this.angle.Angle.toRadians()),1,0,0]};this.Type.skewX.prototype=new this.Type.SkewBase;this.Type.skewY=function(b){this.base=d.Type.SkewBase;this.base(b);this.m=[1,Math.tan(this.angle.Angle.toRadians()),0,1,0,0]};this.Type.skewY.prototype=new this.Type.SkewBase;this.transforms=[];this.apply=function(b){for(var a=0;a<this.transforms.length;a++)this.transforms[a].apply(b)};
+this.applyToPoint=function(b){for(var a=0;a<this.transforms.length;a++)this.transforms[a].applyToPoint(b)};for(var c=a.trim(a.compressSpaces(c)).split(/\s(?=[a-z])/),b=0;b<c.length;b++){var k=c[b].split("(")[0],e=c[b].split("(")[1].replace(")","");this.transforms.push(new this.Type[k](e))}};a.AspectRatio=function(c,d,b,k,e,f,g,j,h,l){var d=a.compressSpaces(d),d=d.replace(/^defer\s/,""),o=d.split(" ")[0]||"xMidYMid",d=d.split(" ")[1]||"meet",n=b/k,q=e/f,p=Math.min(n,q),m=Math.max(n,q);d=="meet"&&(k*=
+p,f*=p);d=="slice"&&(k*=m,f*=m);h=new a.Property("refX",h);l=new a.Property("refY",l);h.hasValue()&&l.hasValue()?c.translate(-p*h.Length.toPixels("x"),-p*l.Length.toPixels("y")):(o.match(/^xMid/)&&(d=="meet"&&p==q||d=="slice"&&m==q)&&c.translate(b/2-k/2,0),o.match(/YMid$/)&&(d=="meet"&&p==n||d=="slice"&&m==n)&&c.translate(0,e/2-f/2),o.match(/^xMax/)&&(d=="meet"&&p==q||d=="slice"&&m==q)&&c.translate(b-k,0),o.match(/YMax$/)&&(d=="meet"&&p==n||d=="slice"&&m==n)&&c.translate(0,e-f));o=="none"?c.scale(n,
+q):d=="meet"?c.scale(p,p):d=="slice"&&c.scale(m,m);c.translate(g==null?0:-g,j==null?0:-j)};a.Element={};a.Element.ElementBase=function(c){this.attributes={};this.styles={};this.children=[];this.attribute=function(b,d){var c=this.attributes[b];if(c!=null)return c;c=new a.Property(b,"");d==!0&&(this.attributes[b]=c);return c};this.style=function(b,d){var c=this.styles[b];if(c!=null)return c;c=this.attribute(b);if(c!=null&&c.hasValue())return c;c=this.parent;if(c!=null&&(c=c.style(b),c!=null&&c.hasValue()))return c;
+c=new a.Property(b,"");d==!0&&(this.styles[b]=c);return c};this.render=function(b){if(this.style("display").value!="none"&&this.attribute("visibility").value!="hidden"){b.save();this.setContext(b);if(this.attribute("mask").hasValue()){var a=this.attribute("mask").Definition.getDefinition();a!=null&&a.apply(b,this)}else this.style("filter").hasValue()?(a=this.style("filter").Definition.getDefinition(),a!=null&&a.apply(b,this)):this.renderChildren(b);this.clearContext(b);b.restore()}};this.setContext=
+function(){};this.clearContext=function(){};this.renderChildren=function(b){for(var a=0;a<this.children.length;a++)this.children[a].render(b)};this.addChild=function(b,d){var c=b;d&&(c=a.CreateElement(b));c.parent=this;this.children.push(c)};if(c!=null&&c.nodeType==1){for(var d=0;d<c.childNodes.length;d++){var b=c.childNodes[d];b.nodeType==1&&this.addChild(b,!0)}for(d=0;d<c.attributes.length;d++)b=c.attributes[d],this.attributes[b.nodeName]=new a.Property(b.nodeName,b.nodeValue);b=a.Styles[c.nodeName];
+if(b!=null)for(var k in b)this.styles[k]=b[k];if(this.attribute("class").hasValue())for(var d=a.compressSpaces(this.attribute("class").value).split(" "),e=0;e<d.length;e++){b=a.Styles["."+d[e]];if(b!=null)for(k in b)this.styles[k]=b[k];b=a.Styles[c.nodeName+"."+d[e]];if(b!=null)for(k in b)this.styles[k]=b[k]}if(this.attribute("style").hasValue()){b=this.attribute("style").value.split(";");for(d=0;d<b.length;d++)a.trim(b[d])!=""&&(c=b[d].split(":"),k=a.trim(c[0]),c=a.trim(c[1]),this.styles[k]=new a.Property(k,
+c))}this.attribute("id").hasValue()&&a.Definitions[this.attribute("id").value]==null&&(a.Definitions[this.attribute("id").value]=this)}};a.Element.RenderedElementBase=function(c){this.base=a.Element.ElementBase;this.base(c);this.setContext=function(d){if(this.style("fill").Definition.isUrl()){var b=this.style("fill").Definition.getFillStyle(this);if(b!=null)d.fillStyle=b}else if(this.style("fill").hasValue())b=this.style("fill"),this.style("fill-opacity").hasValue()&&(b=b.Color.addOpacity(this.style("fill-opacity").value)),
+d.fillStyle=b.value=="none"?"rgba(0,0,0,0)":b.value;if(this.style("stroke").Definition.isUrl()){if(b=this.style("stroke").Definition.getFillStyle(this),b!=null)d.strokeStyle=b}else if(this.style("stroke").hasValue())b=this.style("stroke"),this.style("stroke-opacity").hasValue()&&(b=b.Color.addOpacity(this.style("stroke-opacity").value)),d.strokeStyle=b.value=="none"?"rgba(0,0,0,0)":b.value;if(this.style("stroke-width").hasValue())d.lineWidth=this.style("stroke-width").Length.toPixels();if(this.style("stroke-linecap").hasValue())d.lineCap=
+this.style("stroke-linecap").value;if(this.style("stroke-linejoin").hasValue())d.lineJoin=this.style("stroke-linejoin").value;if(this.style("stroke-miterlimit").hasValue())d.miterLimit=this.style("stroke-miterlimit").value;if(typeof d.font!="undefined")d.font=a.Font.CreateFont(this.style("font-style").value,this.style("font-variant").value,this.style("font-weight").value,this.style("font-size").hasValue()?this.style("font-size").Length.toPixels()+"px":"",this.style("font-family").value).toString();
+this.attribute("transform").hasValue()&&(new a.Transform(this.attribute("transform").value)).apply(d);this.attribute("clip-path").hasValue()&&(b=this.attribute("clip-path").Definition.getDefinition(),b!=null&&b.apply(d));if(this.style("opacity").hasValue())d.globalAlpha=this.style("opacity").numValue()}};a.Element.RenderedElementBase.prototype=new a.Element.ElementBase;a.Element.PathElementBase=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.path=function(d){d!=null&&d.beginPath();
+return new a.BoundingBox};this.renderChildren=function(d){this.path(d);a.Mouse.checkPath(this,d);d.fillStyle!=""&&d.fill();d.strokeStyle!=""&&d.stroke();var b=this.getMarkers();if(b!=null){if(this.style("marker-start").Definition.isUrl()){var c=this.style("marker-start").Definition.getDefinition();c.render(d,b[0][0],b[0][1])}if(this.style("marker-mid").Definition.isUrl())for(var c=this.style("marker-mid").Definition.getDefinition(),e=1;e<b.length-1;e++)c.render(d,b[e][0],b[e][1]);this.style("marker-end").Definition.isUrl()&&
+(c=this.style("marker-end").Definition.getDefinition(),c.render(d,b[b.length-1][0],b[b.length-1][1]))}};this.getBoundingBox=function(){return this.path()};this.getMarkers=function(){return null}};a.Element.PathElementBase.prototype=new a.Element.RenderedElementBase;a.Element.svg=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseClearContext=this.clearContext;this.clearContext=function(d){this.baseClearContext(d);a.ViewPort.RemoveCurrent()};this.baseSetContext=this.setContext;
+this.setContext=function(d){d.strokeStyle="rgba(0,0,0,0)";d.lineCap="butt";d.lineJoin="miter";d.miterLimit=4;this.baseSetContext(d);this.attribute("x").hasValue()&&this.attribute("y").hasValue()&&d.translate(this.attribute("x").Length.toPixels("x"),this.attribute("y").Length.toPixels("y"));var b=a.ViewPort.width(),c=a.ViewPort.height();if(typeof this.root=="undefined"&&this.attribute("width").hasValue()&&this.attribute("height").hasValue()){var b=this.attribute("width").Length.toPixels("x"),c=this.attribute("height").Length.toPixels("y"),
+e=0,f=0;this.attribute("refX").hasValue()&&this.attribute("refY").hasValue()&&(e=-this.attribute("refX").Length.toPixels("x"),f=-this.attribute("refY").Length.toPixels("y"));d.beginPath();d.moveTo(e,f);d.lineTo(b,f);d.lineTo(b,c);d.lineTo(e,c);d.closePath();d.clip()}a.ViewPort.SetCurrent(b,c);if(this.attribute("viewBox").hasValue()){var e=a.ToNumberArray(this.attribute("viewBox").value),f=e[0],g=e[1],b=e[2],c=e[3];a.AspectRatio(d,this.attribute("preserveAspectRatio").value,a.ViewPort.width(),b,a.ViewPort.height(),
+c,f,g,this.attribute("refX").value,this.attribute("refY").value);a.ViewPort.RemoveCurrent();a.ViewPort.SetCurrent(e[2],e[3])}}};a.Element.svg.prototype=new a.Element.RenderedElementBase;a.Element.rect=function(c){this.base=a.Element.PathElementBase;this.base(c);this.path=function(d){var b=this.attribute("x").Length.toPixels("x"),c=this.attribute("y").Length.toPixels("y"),e=this.attribute("width").Length.toPixels("x"),f=this.attribute("height").Length.toPixels("y"),g=this.attribute("rx").Length.toPixels("x"),
+j=this.attribute("ry").Length.toPixels("y");this.attribute("rx").hasValue()&&!this.attribute("ry").hasValue()&&(j=g);this.attribute("ry").hasValue()&&!this.attribute("rx").hasValue()&&(g=j);d!=null&&(d.beginPath(),d.moveTo(b+g,c),d.lineTo(b+e-g,c),d.quadraticCurveTo(b+e,c,b+e,c+j),d.lineTo(b+e,c+f-j),d.quadraticCurveTo(b+e,c+f,b+e-g,c+f),d.lineTo(b+g,c+f),d.quadraticCurveTo(b,c+f,b,c+f-j),d.lineTo(b,c+j),d.quadraticCurveTo(b,c,b+g,c),d.closePath());return new a.BoundingBox(b,c,b+e,c+f)}};a.Element.rect.prototype=
+new a.Element.PathElementBase;a.Element.circle=function(c){this.base=a.Element.PathElementBase;this.base(c);this.path=function(d){var b=this.attribute("cx").Length.toPixels("x"),c=this.attribute("cy").Length.toPixels("y"),e=this.attribute("r").Length.toPixels();d!=null&&(d.beginPath(),d.arc(b,c,e,0,Math.PI*2,!0),d.closePath());return new a.BoundingBox(b-e,c-e,b+e,c+e)}};a.Element.circle.prototype=new a.Element.PathElementBase;a.Element.ellipse=function(c){this.base=a.Element.PathElementBase;this.base(c);
+this.path=function(d){var b=4*((Math.sqrt(2)-1)/3),c=this.attribute("rx").Length.toPixels("x"),e=this.attribute("ry").Length.toPixels("y"),f=this.attribute("cx").Length.toPixels("x"),g=this.attribute("cy").Length.toPixels("y");d!=null&&(d.beginPath(),d.moveTo(f,g-e),d.bezierCurveTo(f+b*c,g-e,f+c,g-b*e,f+c,g),d.bezierCurveTo(f+c,g+b*e,f+b*c,g+e,f,g+e),d.bezierCurveTo(f-b*c,g+e,f-c,g+b*e,f-c,g),d.bezierCurveTo(f-c,g-b*e,f-b*c,g-e,f,g-e),d.closePath());return new a.BoundingBox(f-c,g-e,f+c,g+e)}};a.Element.ellipse.prototype=
+new a.Element.PathElementBase;a.Element.line=function(c){this.base=a.Element.PathElementBase;this.base(c);this.getPoints=function(){return[new a.Point(this.attribute("x1").Length.toPixels("x"),this.attribute("y1").Length.toPixels("y")),new a.Point(this.attribute("x2").Length.toPixels("x"),this.attribute("y2").Length.toPixels("y"))]};this.path=function(d){var b=this.getPoints();d!=null&&(d.beginPath(),d.moveTo(b[0].x,b[0].y),d.lineTo(b[1].x,b[1].y));return new a.BoundingBox(b[0].x,b[0].y,b[1].x,b[1].y)};
+this.getMarkers=function(){var a=this.getPoints(),b=a[0].angleTo(a[1]);return[[a[0],b],[a[1],b]]}};a.Element.line.prototype=new a.Element.PathElementBase;a.Element.polyline=function(c){this.base=a.Element.PathElementBase;this.base(c);this.points=a.CreatePath(this.attribute("points").value);this.path=function(d){var b=new a.BoundingBox(this.points[0].x,this.points[0].y);d!=null&&(d.beginPath(),d.moveTo(this.points[0].x,this.points[0].y));for(var c=1;c<this.points.length;c++)b.addPoint(this.points[c].x,
+this.points[c].y),d!=null&&d.lineTo(this.points[c].x,this.points[c].y);return b};this.getMarkers=function(){for(var a=[],b=0;b<this.points.length-1;b++)a.push([this.points[b],this.points[b].angleTo(this.points[b+1])]);a.push([this.points[this.points.length-1],a[a.length-1][1]]);return a}};a.Element.polyline.prototype=new a.Element.PathElementBase;a.Element.polygon=function(c){this.base=a.Element.polyline;this.base(c);this.basePath=this.path;this.path=function(a){var b=this.basePath(a);a!=null&&(a.lineTo(this.points[0].x,
+this.points[0].y),a.closePath());return b}};a.Element.polygon.prototype=new a.Element.polyline;a.Element.path=function(c){this.base=a.Element.PathElementBase;this.base(c);c=this.attribute("d").value;c=c.replace(/,/gm," ");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,"$1 $2");c=c.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");c=c.replace(/([0-9])([+\-])/gm,
+"$1 $2");c=c.replace(/(\.[0-9]*)(\.)/gm,"$1 $2");c=c.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");c=a.compressSpaces(c);c=a.trim(c);this.PathParser=new function(d){this.tokens=d.split(" ");this.reset=function(){this.i=-1;this.previousCommand=this.command="";this.start=new a.Point(0,0);this.control=new a.Point(0,0);this.current=new a.Point(0,0);this.points=[];this.angles=[]};this.isEnd=function(){return this.i>=this.tokens.length-1};this.isCommandOrEnd=function(){return this.isEnd()?
+!0:this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null};this.isRelativeCommand=function(){return this.command==this.command.toLowerCase()};this.getToken=function(){this.i+=1;return this.tokens[this.i]};this.getScalar=function(){return parseFloat(this.getToken())};this.nextCommand=function(){this.previousCommand=this.command;this.command=this.getToken()};this.getPoint=function(){return this.makeAbsolute(new a.Point(this.getScalar(),this.getScalar()))};this.getAsControlPoint=function(){var b=this.getPoint();
+return this.control=b};this.getAsCurrentPoint=function(){var b=this.getPoint();return this.current=b};this.getReflectedControlPoint=function(){return this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s"?this.current:new a.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y)};this.makeAbsolute=function(b){if(this.isRelativeCommand())b.x=this.current.x+b.x,b.y=this.current.y+b.y;return b};this.addMarker=function(b,a,d){d!=null&&this.angles.length>0&&this.angles[this.angles.length-
+1]==null&&(this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(d));this.addMarkerAngle(b,a==null?null:a.angleTo(b))};this.addMarkerAngle=function(b,a){this.points.push(b);this.angles.push(a)};this.getMarkerPoints=function(){return this.points};this.getMarkerAngles=function(){for(var b=0;b<this.angles.length;b++)if(this.angles[b]==null)for(var a=b+1;a<this.angles.length;a++)if(this.angles[a]!=null){this.angles[b]=this.angles[a];break}return this.angles}}(c);this.path=function(d){var b=
+this.PathParser;b.reset();var c=new a.BoundingBox;for(d!=null&&d.beginPath();!b.isEnd();)switch(b.nextCommand(),b.command.toUpperCase()){case "M":var e=b.getAsCurrentPoint();b.addMarker(e);c.addPoint(e.x,e.y);d!=null&&d.moveTo(e.x,e.y);for(b.start=b.current;!b.isCommandOrEnd();)e=b.getAsCurrentPoint(),b.addMarker(e,b.start),c.addPoint(e.x,e.y),d!=null&&d.lineTo(e.x,e.y);break;case "L":for(;!b.isCommandOrEnd();){var f=b.current,e=b.getAsCurrentPoint();b.addMarker(e,f);c.addPoint(e.x,e.y);d!=null&&
+d.lineTo(e.x,e.y)}break;case "H":for(;!b.isCommandOrEnd();)e=new a.Point((b.isRelativeCommand()?b.current.x:0)+b.getScalar(),b.current.y),b.addMarker(e,b.current),b.current=e,c.addPoint(b.current.x,b.current.y),d!=null&&d.lineTo(b.current.x,b.current.y);break;case "V":for(;!b.isCommandOrEnd();)e=new a.Point(b.current.x,(b.isRelativeCommand()?b.current.y:0)+b.getScalar()),b.addMarker(e,b.current),b.current=e,c.addPoint(b.current.x,b.current.y),d!=null&&d.lineTo(b.current.x,b.current.y);break;case "C":for(;!b.isCommandOrEnd();){var g=
+b.current,f=b.getPoint(),j=b.getAsControlPoint(),e=b.getAsCurrentPoint();b.addMarker(e,j,f);c.addBezierCurve(g.x,g.y,f.x,f.y,j.x,j.y,e.x,e.y);d!=null&&d.bezierCurveTo(f.x,f.y,j.x,j.y,e.x,e.y)}break;case "S":for(;!b.isCommandOrEnd();)g=b.current,f=b.getReflectedControlPoint(),j=b.getAsControlPoint(),e=b.getAsCurrentPoint(),b.addMarker(e,j,f),c.addBezierCurve(g.x,g.y,f.x,f.y,j.x,j.y,e.x,e.y),d!=null&&d.bezierCurveTo(f.x,f.y,j.x,j.y,e.x,e.y);break;case "Q":for(;!b.isCommandOrEnd();)g=b.current,j=b.getAsControlPoint(),
+e=b.getAsCurrentPoint(),b.addMarker(e,j,j),c.addQuadraticCurve(g.x,g.y,j.x,j.y,e.x,e.y),d!=null&&d.quadraticCurveTo(j.x,j.y,e.x,e.y);break;case "T":for(;!b.isCommandOrEnd();)g=b.current,j=b.getReflectedControlPoint(),b.control=j,e=b.getAsCurrentPoint(),b.addMarker(e,j,j),c.addQuadraticCurve(g.x,g.y,j.x,j.y,e.x,e.y),d!=null&&d.quadraticCurveTo(j.x,j.y,e.x,e.y);break;case "A":for(;!b.isCommandOrEnd();){var g=b.current,h=b.getScalar(),l=b.getScalar(),f=b.getScalar()*(Math.PI/180),o=b.getScalar(),j=b.getScalar(),
+e=b.getAsCurrentPoint(),n=new a.Point(Math.cos(f)*(g.x-e.x)/2+Math.sin(f)*(g.y-e.y)/2,-Math.sin(f)*(g.x-e.x)/2+Math.cos(f)*(g.y-e.y)/2),q=Math.pow(n.x,2)/Math.pow(h,2)+Math.pow(n.y,2)/Math.pow(l,2);q>1&&(h*=Math.sqrt(q),l*=Math.sqrt(q));o=(o==j?-1:1)*Math.sqrt((Math.pow(h,2)*Math.pow(l,2)-Math.pow(h,2)*Math.pow(n.y,2)-Math.pow(l,2)*Math.pow(n.x,2))/(Math.pow(h,2)*Math.pow(n.y,2)+Math.pow(l,2)*Math.pow(n.x,2)));isNaN(o)&&(o=0);var p=new a.Point(o*h*n.y/l,o*-l*n.x/h),g=new a.Point((g.x+e.x)/2+Math.cos(f)*
+p.x-Math.sin(f)*p.y,(g.y+e.y)/2+Math.sin(f)*p.x+Math.cos(f)*p.y),m=function(b,a){return(b[0]*a[0]+b[1]*a[1])/(Math.sqrt(Math.pow(b[0],2)+Math.pow(b[1],2))*Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2)))},s=function(b,a){return(b[0]*a[1]<b[1]*a[0]?-1:1)*Math.acos(m(b,a))},o=s([1,0],[(n.x-p.x)/h,(n.y-p.y)/l]),q=[(n.x-p.x)/h,(n.y-p.y)/l],p=[(-n.x-p.x)/h,(-n.y-p.y)/l],n=s(q,p);if(m(q,p)<=-1)n=Math.PI;m(q,p)>=1&&(n=0);j==0&&n>0&&(n-=2*Math.PI);j==1&&n<0&&(n+=2*Math.PI);q=new a.Point(g.x-h*Math.cos((o+n)/
+2),g.y-l*Math.sin((o+n)/2));b.addMarkerAngle(q,(o+n)/2+(j==0?1:-1)*Math.PI/2);b.addMarkerAngle(e,n+(j==0?1:-1)*Math.PI/2);c.addPoint(e.x,e.y);d!=null&&(m=h>l?h:l,e=h>l?1:h/l,h=h>l?l/h:1,d.translate(g.x,g.y),d.rotate(f),d.scale(e,h),d.arc(0,0,m,o,o+n,1-j),d.scale(1/e,1/h),d.rotate(-f),d.translate(-g.x,-g.y))}break;case "Z":d!=null&&d.closePath(),b.current=b.start}return c};this.getMarkers=function(){for(var a=this.PathParser.getMarkerPoints(),b=this.PathParser.getMarkerAngles(),c=[],e=0;e<a.length;e++)c.push([a[e],
+b[e]]);return c}};a.Element.path.prototype=new a.Element.PathElementBase;a.Element.pattern=function(c){this.base=a.Element.ElementBase;this.base(c);this.createPattern=function(d){var b=new a.Element.svg;b.attributes.viewBox=new a.Property("viewBox",this.attribute("viewBox").value);b.attributes.x=new a.Property("x",this.attribute("x").value);b.attributes.y=new a.Property("y",this.attribute("y").value);b.attributes.width=new a.Property("width",this.attribute("width").value);b.attributes.height=new a.Property("height",
+this.attribute("height").value);b.children=this.children;var c=document.createElement("canvas");c.width=this.attribute("width").Length.toPixels("x");c.height=this.attribute("height").Length.toPixels("y");b.render(c.getContext("2d"));return d.createPattern(c,"repeat")}};a.Element.pattern.prototype=new a.Element.ElementBase;a.Element.marker=function(c){this.base=a.Element.ElementBase;this.base(c);this.baseRender=this.render;this.render=function(d,b,c){d.translate(b.x,b.y);this.attribute("orient").valueOrDefault("auto")==
+"auto"&&d.rotate(c);this.attribute("markerUnits").valueOrDefault("strokeWidth")=="strokeWidth"&&d.scale(d.lineWidth,d.lineWidth);d.save();var e=new a.Element.svg;e.attributes.viewBox=new a.Property("viewBox",this.attribute("viewBox").value);e.attributes.refX=new a.Property("refX",this.attribute("refX").value);e.attributes.refY=new a.Property("refY",this.attribute("refY").value);e.attributes.width=new a.Property("width",this.attribute("markerWidth").value);e.attributes.height=new a.Property("height",
+this.attribute("markerHeight").value);e.attributes.fill=new a.Property("fill",this.attribute("fill").valueOrDefault("black"));e.attributes.stroke=new a.Property("stroke",this.attribute("stroke").valueOrDefault("none"));e.children=this.children;e.render(d);d.restore();this.attribute("markerUnits").valueOrDefault("strokeWidth")=="strokeWidth"&&d.scale(1/d.lineWidth,1/d.lineWidth);this.attribute("orient").valueOrDefault("auto")=="auto"&&d.rotate(-c);d.translate(-b.x,-b.y)}};a.Element.marker.prototype=
+new a.Element.ElementBase;a.Element.defs=function(c){this.base=a.Element.ElementBase;this.base(c);this.render=function(){}};a.Element.defs.prototype=new a.Element.ElementBase;a.Element.GradientBase=function(c){this.base=a.Element.ElementBase;this.base(c);this.gradientUnits=this.attribute("gradientUnits").valueOrDefault("objectBoundingBox");this.stops=[];for(c=0;c<this.children.length;c++)this.stops.push(this.children[c]);this.getGradient=function(){};this.createGradient=function(d,b){var c=this;this.attribute("xlink:href").hasValue()&&
+(c=this.attribute("xlink:href").Definition.getDefinition());for(var e=this.getGradient(d,b),f=0;f<c.stops.length;f++)e.addColorStop(c.stops[f].offset,c.stops[f].color);if(this.attribute("gradientTransform").hasValue()){c=a.ViewPort.viewPorts[0];f=new a.Element.rect;f.attributes.x=new a.Property("x",-a.MAX_VIRTUAL_PIXELS/3);f.attributes.y=new a.Property("y",-a.MAX_VIRTUAL_PIXELS/3);f.attributes.width=new a.Property("width",a.MAX_VIRTUAL_PIXELS);f.attributes.height=new a.Property("height",a.MAX_VIRTUAL_PIXELS);
+var g=new a.Element.g;g.attributes.transform=new a.Property("transform",this.attribute("gradientTransform").value);g.children=[f];f=new a.Element.svg;f.attributes.x=new a.Property("x",0);f.attributes.y=new a.Property("y",0);f.attributes.width=new a.Property("width",c.width);f.attributes.height=new a.Property("height",c.height);f.children=[g];g=document.createElement("canvas");g.width=c.width;g.height=c.height;c=g.getContext("2d");c.fillStyle=e;f.render(c);return c.createPattern(g,"no-repeat")}return e}};
+a.Element.GradientBase.prototype=new a.Element.ElementBase;a.Element.linearGradient=function(c){this.base=a.Element.GradientBase;this.base(c);this.getGradient=function(a,b){var c=b.getBoundingBox(),e=this.gradientUnits=="objectBoundingBox"?c.x()+c.width()*this.attribute("x1").numValue():this.attribute("x1").Length.toPixels("x"),f=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("y1").numValue():this.attribute("y1").Length.toPixels("y"),g=this.gradientUnits=="objectBoundingBox"?
+c.x()+c.width()*this.attribute("x2").numValue():this.attribute("x2").Length.toPixels("x"),c=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("y2").numValue():this.attribute("y2").Length.toPixels("y");return a.createLinearGradient(e,f,g,c)}};a.Element.linearGradient.prototype=new a.Element.GradientBase;a.Element.radialGradient=function(c){this.base=a.Element.GradientBase;this.base(c);this.getGradient=function(a,b){var c=b.getBoundingBox(),e=this.gradientUnits=="objectBoundingBox"?
+c.x()+c.width()*this.attribute("cx").numValue():this.attribute("cx").Length.toPixels("x"),f=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("cy").numValue():this.attribute("cy").Length.toPixels("y"),g=e,j=f;this.attribute("fx").hasValue()&&(g=this.gradientUnits=="objectBoundingBox"?c.x()+c.width()*this.attribute("fx").numValue():this.attribute("fx").Length.toPixels("x"));this.attribute("fy").hasValue()&&(j=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("fy").numValue():
+this.attribute("fy").Length.toPixels("y"));c=this.gradientUnits=="objectBoundingBox"?(c.width()+c.height())/2*this.attribute("r").numValue():this.attribute("r").Length.toPixels();return a.createRadialGradient(g,j,0,e,f,c)}};a.Element.radialGradient.prototype=new a.Element.GradientBase;a.Element.stop=function(c){this.base=a.Element.ElementBase;this.base(c);this.offset=this.attribute("offset").numValue();c=this.style("stop-color");this.style("stop-opacity").hasValue()&&(c=c.Color.addOpacity(this.style("stop-opacity").value));
+this.color=c.value};a.Element.stop.prototype=new a.Element.ElementBase;a.Element.AnimateBase=function(c){this.base=a.Element.ElementBase;this.base(c);a.Animations.push(this);this.duration=0;this.begin=this.attribute("begin").Time.toMilliseconds();this.maxDuration=this.begin+this.attribute("dur").Time.toMilliseconds();this.getProperty=function(){var a=this.attribute("attributeType").value,b=this.attribute("attributeName").value;return a=="CSS"?this.parent.style(b,!0):this.parent.attribute(b,!0)};this.initialValue=
+null;this.removed=!1;this.calcValue=function(){return""};this.update=function(a){if(this.initialValue==null)this.initialValue=this.getProperty().value;if(this.duration>this.maxDuration)if(this.attribute("repeatCount").value=="indefinite")this.duration=0;else return this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed?(this.removed=!0,this.getProperty().value=this.initialValue,!0):!1;this.duration+=a;a=!1;if(this.begin<this.duration)a=this.calcValue(),this.attribute("type").hasValue()&&
+(a=this.attribute("type").value+"("+a+")"),this.getProperty().value=a,a=!0;return a};this.progress=function(){return(this.duration-this.begin)/(this.maxDuration-this.begin)}};a.Element.AnimateBase.prototype=new a.Element.ElementBase;a.Element.animate=function(c){this.base=a.Element.AnimateBase;this.base(c);this.calcValue=function(){var a=this.attribute("from").numValue(),b=this.attribute("to").numValue();return a+(b-a)*this.progress()}};a.Element.animate.prototype=new a.Element.AnimateBase;a.Element.animateColor=
+function(c){this.base=a.Element.AnimateBase;this.base(c);this.calcValue=function(){var a=new RGBColor(this.attribute("from").value),b=new RGBColor(this.attribute("to").value);if(a.ok&&b.ok){var c=a.r+(b.r-a.r)*this.progress(),e=a.g+(b.g-a.g)*this.progress(),a=a.b+(b.b-a.b)*this.progress();return"rgb("+parseInt(c,10)+","+parseInt(e,10)+","+parseInt(a,10)+")"}return this.attribute("from").value}};a.Element.animateColor.prototype=new a.Element.AnimateBase;a.Element.animateTransform=function(c){this.base=
+a.Element.animate;this.base(c)};a.Element.animateTransform.prototype=new a.Element.animate;a.Element.font=function(c){this.base=a.Element.ElementBase;this.base(c);this.horizAdvX=this.attribute("horiz-adv-x").numValue();this.isArabic=this.isRTL=!1;this.missingGlyph=this.fontFace=null;this.glyphs=[];for(c=0;c<this.children.length;c++){var d=this.children[c];if(d.type=="font-face")this.fontFace=d,d.style("font-family").hasValue()&&(a.Definitions[d.style("font-family").value]=this);else if(d.type=="missing-glyph")this.missingGlyph=
+d;else if(d.type=="glyph")d.arabicForm!=""?(this.isArabic=this.isRTL=!0,typeof this.glyphs[d.unicode]=="undefined"&&(this.glyphs[d.unicode]=[]),this.glyphs[d.unicode][d.arabicForm]=d):this.glyphs[d.unicode]=d}};a.Element.font.prototype=new a.Element.ElementBase;a.Element.fontface=function(c){this.base=a.Element.ElementBase;this.base(c);this.ascent=this.attribute("ascent").value;this.descent=this.attribute("descent").value;this.unitsPerEm=this.attribute("units-per-em").numValue()};a.Element.fontface.prototype=
+new a.Element.ElementBase;a.Element.missingglyph=function(c){this.base=a.Element.path;this.base(c);this.horizAdvX=0};a.Element.missingglyph.prototype=new a.Element.path;a.Element.glyph=function(c){this.base=a.Element.path;this.base(c);this.horizAdvX=this.attribute("horiz-adv-x").numValue();this.unicode=this.attribute("unicode").value;this.arabicForm=this.attribute("arabic-form").value};a.Element.glyph.prototype=new a.Element.path;a.Element.text=function(c){this.base=a.Element.RenderedElementBase;
+this.base(c);if(c!=null){this.children=[];for(var d=0;d<c.childNodes.length;d++){var b=c.childNodes[d];b.nodeType==1?this.addChild(b,!0):b.nodeType==3&&this.addChild(new a.Element.tspan(b),!1)}}this.baseSetContext=this.setContext;this.setContext=function(b){this.baseSetContext(b);if(this.style("dominant-baseline").hasValue())b.textBaseline=this.style("dominant-baseline").value;if(this.style("alignment-baseline").hasValue())b.textBaseline=this.style("alignment-baseline").value};this.renderChildren=
+function(b){for(var a=this.style("text-anchor").valueOrDefault("start"),c=this.attribute("x").Length.toPixels("x"),d=this.attribute("y").Length.toPixels("y"),j=0;j<this.children.length;j++){var h=this.children[j];h.attribute("x").hasValue()?h.x=h.attribute("x").Length.toPixels("x"):(h.attribute("dx").hasValue()&&(c+=h.attribute("dx").Length.toPixels("x")),h.x=c);c=h.measureText(b);if(a!="start"&&(j==0||h.attribute("x").hasValue())){for(var l=c,o=j+1;o<this.children.length;o++){var n=this.children[o];
+if(n.attribute("x").hasValue())break;l+=n.measureText(b)}h.x-=a=="end"?l:l/2}c=h.x+c;h.attribute("y").hasValue()?h.y=h.attribute("y").Length.toPixels("y"):(h.attribute("dy").hasValue()&&(d+=h.attribute("dy").Length.toPixels("y")),h.y=d);d=h.y;h.render(b)}}};a.Element.text.prototype=new a.Element.RenderedElementBase;a.Element.TextElementBase=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.getGlyph=function(a,b,c){var e=b[c],f=null;if(a.isArabic){var g="isolated";if((c==0||b[c-
+1]==" ")&&c<b.length-2&&b[c+1]!=" ")g="terminal";c>0&&b[c-1]!=" "&&c<b.length-2&&b[c+1]!=" "&&(g="medial");if(c>0&&b[c-1]!=" "&&(c==b.length-1||b[c+1]==" "))g="initial";typeof a.glyphs[e]!="undefined"&&(f=a.glyphs[e][g],f==null&&a.glyphs[e].type=="glyph"&&(f=a.glyphs[e]))}else f=a.glyphs[e];if(f==null)f=a.missingGlyph;return f};this.renderChildren=function(c){var b=this.parent.style("font-family").Definition.getDefinition();if(b!=null){var k=this.parent.style("font-size").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize),
+e=this.parent.style("font-style").valueOrDefault(a.Font.Parse(a.ctx.font).fontStyle),f=this.getText();b.isRTL&&(f=f.split("").reverse().join(""));for(var g=a.ToNumberArray(this.parent.attribute("dx").value),j=0;j<f.length;j++){var h=this.getGlyph(b,f,j),l=k/b.fontFace.unitsPerEm;c.translate(this.x,this.y);c.scale(l,-l);var o=c.lineWidth;c.lineWidth=c.lineWidth*b.fontFace.unitsPerEm/k;e=="italic"&&c.transform(1,0,0.4,1,0,0);h.render(c);e=="italic"&&c.transform(1,0,-0.4,1,0,0);c.lineWidth=o;c.scale(1/
+l,-1/l);c.translate(-this.x,-this.y);this.x+=k*(h.horizAdvX||b.horizAdvX)/b.fontFace.unitsPerEm;typeof g[j]!="undefined"&&!isNaN(g[j])&&(this.x+=g[j])}}else c.strokeStyle!=""&&c.strokeText(a.compressSpaces(this.getText()),this.x,this.y),c.fillStyle!=""&&c.fillText(a.compressSpaces(this.getText()),this.x,this.y)};this.getText=function(){};this.measureText=function(c){var b=this.parent.style("font-family").Definition.getDefinition();if(b!=null){var c=this.parent.style("font-size").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize),
+k=0,e=this.getText();b.isRTL&&(e=e.split("").reverse().join(""));for(var f=a.ToNumberArray(this.parent.attribute("dx").value),g=0;g<e.length;g++){var j=this.getGlyph(b,e,g);k+=(j.horizAdvX||b.horizAdvX)*c/b.fontFace.unitsPerEm;typeof f[g]!="undefined"&&!isNaN(f[g])&&(k+=f[g])}return k}b=a.compressSpaces(this.getText());if(!c.measureText)return b.length*10;c.save();this.setContext(c);b=c.measureText(b).width;c.restore();return b}};a.Element.TextElementBase.prototype=new a.Element.RenderedElementBase;
+a.Element.tspan=function(c){this.base=a.Element.TextElementBase;this.base(c);this.text=c.nodeType==3?c.nodeValue:c.childNodes.length>0?c.childNodes[0].nodeValue:c.text;this.getText=function(){return this.text}};a.Element.tspan.prototype=new a.Element.TextElementBase;a.Element.tref=function(c){this.base=a.Element.TextElementBase;this.base(c);this.getText=function(){var a=this.attribute("xlink:href").Definition.getDefinition();if(a!=null)return a.children[0].getText()}};a.Element.tref.prototype=new a.Element.TextElementBase;
+a.Element.a=function(c){this.base=a.Element.TextElementBase;this.base(c);this.hasText=!0;for(var d=0;d<c.childNodes.length;d++)if(c.childNodes[d].nodeType!=3)this.hasText=!1;this.text=this.hasText?c.childNodes[0].nodeValue:"";this.getText=function(){return this.text};this.baseRenderChildren=this.renderChildren;this.renderChildren=function(b){if(this.hasText){this.baseRenderChildren(b);var c=new a.Property("fontSize",a.Font.Parse(a.ctx.font).fontSize);a.Mouse.checkBoundingBox(this,new a.BoundingBox(this.x,
+this.y-c.Length.toPixels("y"),this.x+this.measureText(b),this.y))}else c=new a.Element.g,c.children=this.children,c.parent=this,c.render(b)};this.onclick=function(){window.open(this.attribute("xlink:href").value)};this.onmousemove=function(){a.ctx.canvas.style.cursor="pointer"}};a.Element.a.prototype=new a.Element.TextElementBase;a.Element.image=function(c){this.base=a.Element.RenderedElementBase;this.base(c);a.Images.push(this);this.img=document.createElement("img");this.loaded=!1;var d=this;this.img.onload=
+function(){d.loaded=!0};this.img.src=this.attribute("xlink:href").value;this.renderChildren=function(b){var c=this.attribute("x").Length.toPixels("x"),d=this.attribute("y").Length.toPixels("y"),f=this.attribute("width").Length.toPixels("x"),g=this.attribute("height").Length.toPixels("y");f==0||g==0||(b.save(),b.translate(c,d),a.AspectRatio(b,this.attribute("preserveAspectRatio").value,f,this.img.width,g,this.img.height,0,0),b.drawImage(this.img,0,0),b.restore())}};a.Element.image.prototype=new a.Element.RenderedElementBase;
+a.Element.g=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.getBoundingBox=function(){for(var c=new a.BoundingBox,b=0;b<this.children.length;b++)c.addBoundingBox(this.children[b].getBoundingBox());return c}};a.Element.g.prototype=new a.Element.RenderedElementBase;a.Element.symbol=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseSetContext=this.setContext;this.setContext=function(c){this.baseSetContext(c);if(this.attribute("viewBox").hasValue()){var b=
+a.ToNumberArray(this.attribute("viewBox").value),k=b[0],e=b[1];width=b[2];height=b[3];a.AspectRatio(c,this.attribute("preserveAspectRatio").value,this.attribute("width").Length.toPixels("x"),width,this.attribute("height").Length.toPixels("y"),height,k,e);a.ViewPort.SetCurrent(b[2],b[3])}}};a.Element.symbol.prototype=new a.Element.RenderedElementBase;a.Element.style=function(c){this.base=a.Element.ElementBase;this.base(c);for(var c=c.childNodes[0].nodeValue+(c.childNodes.length>1?c.childNodes[1].nodeValue:
+""),c=c.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm,""),c=a.compressSpaces(c),c=c.split("}"),d=0;d<c.length;d++)if(a.trim(c[d])!="")for(var b=c[d].split("{"),k=b[0].split(","),b=b[1].split(";"),e=0;e<k.length;e++){var f=a.trim(k[e]);if(f!=""){for(var g={},j=0;j<b.length;j++){var h=b[j].indexOf(":"),l=b[j].substr(0,h),h=b[j].substr(h+1,b[j].length-h);l!=null&&h!=null&&(g[a.trim(l)]=new a.Property(a.trim(l),a.trim(h)))}a.Styles[f]=g;if(f=="@font-face"){f=g["font-family"].value.replace(/"/g,
+"");g=g.src.value.split(",");for(j=0;j<g.length;j++)if(g[j].indexOf('format("svg")')>0){l=g[j].indexOf("url");h=g[j].indexOf(")",l);l=g[j].substr(l+5,h-l-6);l=a.parseXml(a.ajax(l)).getElementsByTagName("font");for(h=0;h<l.length;h++){var o=a.CreateElement(l[h]);a.Definitions[f]=o}}}}}};a.Element.style.prototype=new a.Element.ElementBase;a.Element.use=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseSetContext=this.setContext;this.setContext=function(a){this.baseSetContext(a);
+this.attribute("x").hasValue()&&a.translate(this.attribute("x").Length.toPixels("x"),0);this.attribute("y").hasValue()&&a.translate(0,this.attribute("y").Length.toPixels("y"))};this.getDefinition=function(){var a=this.attribute("xlink:href").Definition.getDefinition();if(this.attribute("width").hasValue())a.attribute("width",!0).value=this.attribute("width").value;if(this.attribute("height").hasValue())a.attribute("height",!0).value=this.attribute("height").value;return a};this.path=function(a){var b=
+this.getDefinition();b!=null&&b.path(a)};this.renderChildren=function(a){var b=this.getDefinition();b!=null&&b.render(a)}};a.Element.use.prototype=new a.Element.RenderedElementBase;a.Element.mask=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,b){var c=this.attribute("x").Length.toPixels("x"),e=this.attribute("y").Length.toPixels("y"),f=this.attribute("width").Length.toPixels("x"),g=this.attribute("height").Length.toPixels("y"),j=b.attribute("mask").value;b.attribute("mask").value=
+"";var h=document.createElement("canvas");h.width=c+f;h.height=e+g;var l=h.getContext("2d");this.renderChildren(l);var o=document.createElement("canvas");o.width=c+f;o.height=e+g;var n=o.getContext("2d");b.render(n);n.globalCompositeOperation="destination-in";n.fillStyle=l.createPattern(h,"no-repeat");n.fillRect(0,0,c+f,e+g);a.fillStyle=n.createPattern(o,"no-repeat");a.fillRect(0,0,c+f,e+g);b.attribute("mask").value=j};this.render=function(){}};a.Element.mask.prototype=new a.Element.ElementBase;a.Element.clipPath=
+function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a){for(var b=0;b<this.children.length;b++)this.children[b].path&&(this.children[b].path(a),a.clip())};this.render=function(){}};a.Element.clipPath.prototype=new a.Element.ElementBase;a.Element.filter=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,b){var c=b.getBoundingBox(),e=this.attribute("x").Length.toPixels("x"),f=this.attribute("y").Length.toPixels("y");if(e==0||f==0)e=c.x1,f=c.y1;var g=
+this.attribute("width").Length.toPixels("x"),j=this.attribute("height").Length.toPixels("y");if(g==0||j==0)g=c.width(),j=c.height();c=b.style("filter").value;b.style("filter").value="";var h=0.2*g,l=0.2*j,o=document.createElement("canvas");o.width=g+2*h;o.height=j+2*l;var n=o.getContext("2d");n.translate(-e+h,-f+l);b.render(n);for(var q=0;q<this.children.length;q++)this.children[q].apply(n,0,0,g+2*h,j+2*l);a.drawImage(o,0,0,g+2*h,j+2*l,e-h,f-l,g+2*h,j+2*l);b.style("filter",!0).value=c};this.render=
+function(){}};a.Element.filter.prototype=new a.Element.ElementBase;a.Element.feGaussianBlur=function(c){function d(a,c,d,f,g){for(var j=0;j<g;j++)for(var h=0;h<f;h++)for(var l=a[j*f*4+h*4+3]/255,o=0;o<4;o++){for(var n=d[0]*(l==0?255:a[j*f*4+h*4+o])*(l==0||o==3?1:l),q=1;q<d.length;q++){var p=Math.max(h-q,0),m=a[j*f*4+p*4+3]/255,p=Math.min(h+q,f-1),p=a[j*f*4+p*4+3]/255,s=d[q],r;m==0?r=255:(r=Math.max(h-q,0),r=a[j*f*4+r*4+o]);m=r*(m==0||o==3?1:m);p==0?r=255:(r=Math.min(h+q,f-1),r=a[j*f*4+r*4+o]);n+=
+s*(m+r*(p==0||o==3?1:p))}c[h*g*4+j*4+o]=n}}this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,c,e,f,g){var e=this.attribute("stdDeviation").numValue(),c=a.getImageData(0,0,f,g),e=Math.max(e,0.01),j=Math.ceil(e*4)+1;mask=[];for(var h=0;h<j;h++)mask[h]=Math.exp(-0.5*(h/e)*(h/e));e=mask;j=0;for(h=1;h<e.length;h++)j+=Math.abs(e[h]);j=2*j+Math.abs(e[0]);for(h=0;h<e.length;h++)e[h]/=j;tmp=[];d(c.data,tmp,e,f,g);d(tmp,c.data,e,g,f);a.clearRect(0,0,f,g);a.putImageData(c,0,0)}};a.Element.filter.prototype=
+new a.Element.feGaussianBlur;a.Element.title=function(){};a.Element.title.prototype=new a.Element.ElementBase;a.Element.desc=function(){};a.Element.desc.prototype=new a.Element.ElementBase;a.Element.MISSING=function(a){console.log("ERROR: Element '"+a.nodeName+"' not yet implemented.")};a.Element.MISSING.prototype=new a.Element.ElementBase;a.CreateElement=function(c){var d=c.nodeName.replace(/^[^:]+:/,""),d=d.replace(/\-/g,""),b=null,b=typeof a.Element[d]!="undefined"?new a.Element[d](c):new a.Element.MISSING(c);
+b.type=c.nodeName;return b};a.load=function(c,d){a.loadXml(c,a.ajax(d))};a.loadXml=function(c,d){a.loadXmlDoc(c,a.parseXml(d))};a.loadXmlDoc=function(c,d){a.init(c);var b=function(a){for(var b=c.canvas;b;)a.x-=b.offsetLeft,a.y-=b.offsetTop,b=b.offsetParent;window.scrollX&&(a.x+=window.scrollX);window.scrollY&&(a.y+=window.scrollY);return a};if(a.opts.ignoreMouse!=!0)c.canvas.onclick=function(c){c=b(new a.Point(c!=null?c.clientX:event.clientX,c!=null?c.clientY:event.clientY));a.Mouse.onclick(c.x,c.y)},
+c.canvas.onmousemove=function(c){c=b(new a.Point(c!=null?c.clientX:event.clientX,c!=null?c.clientY:event.clientY));a.Mouse.onmousemove(c.x,c.y)};var k=a.CreateElement(d.documentElement),e=k.root=!0,f=function(){a.ViewPort.Clear();c.canvas.parentNode&&a.ViewPort.SetCurrent(c.canvas.parentNode.clientWidth,c.canvas.parentNode.clientHeight);if(a.opts.ignoreDimensions!=!0){if(k.style("width").hasValue())c.canvas.width=k.style("width").Length.toPixels("x"),c.canvas.style.width=c.canvas.width+"px";if(k.style("height").hasValue())c.canvas.height=
+k.style("height").Length.toPixels("y"),c.canvas.style.height=c.canvas.height+"px"}var b=c.canvas.clientWidth||c.canvas.width,d=c.canvas.clientHeight||c.canvas.height;a.ViewPort.SetCurrent(b,d);if(a.opts!=null&&a.opts.offsetX!=null)k.attribute("x",!0).value=a.opts.offsetX;if(a.opts!=null&&a.opts.offsetY!=null)k.attribute("y",!0).value=a.opts.offsetY;if(a.opts!=null&&a.opts.scaleWidth!=null&&a.opts.scaleHeight!=null){var f=1,g=1;k.attribute("width").hasValue()&&(f=k.attribute("width").Length.toPixels("x")/
+a.opts.scaleWidth);k.attribute("height").hasValue()&&(g=k.attribute("height").Length.toPixels("y")/a.opts.scaleHeight);k.attribute("width",!0).value=a.opts.scaleWidth;k.attribute("height",!0).value=a.opts.scaleHeight;k.attribute("viewBox",!0).value="0 0 "+b*f+" "+d*g;k.attribute("preserveAspectRatio",!0).value="none"}a.opts.ignoreClear!=!0&&c.clearRect(0,0,b,d);k.render(c);e&&(e=!1,a.opts!=null&&typeof a.opts.renderCallback=="function"&&a.opts.renderCallback())},g=!0;a.ImagesLoaded()&&(g=!1,f());
+a.intervalID=setInterval(function(){var b=!1;g&&a.ImagesLoaded()&&(g=!1,b=!0);a.opts.ignoreMouse!=!0&&(b|=a.Mouse.hasEvents());if(a.opts.ignoreAnimation!=!0)for(var c=0;c<a.Animations.length;c++)b|=a.Animations[c].update(1E3/a.FRAMERATE);a.opts!=null&&typeof a.opts.forceRedraw=="function"&&a.opts.forceRedraw()==!0&&(b=!0);b&&(f(),a.Mouse.runEvents())},1E3/a.FRAMERATE)};a.stop=function(){a.intervalID&&clearInterval(a.intervalID)};a.Mouse=new function(){this.events=[];this.hasEvents=function(){return this.events.length!=
+0};this.onclick=function(a,d){this.events.push({type:"onclick",x:a,y:d,run:function(a){if(a.onclick)a.onclick()}})};this.onmousemove=function(a,d){this.events.push({type:"onmousemove",x:a,y:d,run:function(a){if(a.onmousemove)a.onmousemove()}})};this.eventElements=[];this.checkPath=function(a,d){for(var b=0;b<this.events.length;b++){var k=this.events[b];d.isPointInPath&&d.isPointInPath(k.x,k.y)&&(this.eventElements[b]=a)}};this.checkBoundingBox=function(a,d){for(var b=0;b<this.events.length;b++){var k=
+this.events[b];d.isPointInBox(k.x,k.y)&&(this.eventElements[b]=a)}};this.runEvents=function(){a.ctx.canvas.style.cursor="";for(var c=0;c<this.events.length;c++)for(var d=this.events[c],b=this.eventElements[c];b;)d.run(b),b=b.parent;this.events=[];this.eventElements=[]}};return a}this.canvg=function(a,c,d){if(a==null&&c==null&&d==null)for(var c=document.getElementsByTagName("svg"),b=0;b<c.length;b++){a=c[b];d=document.createElement("canvas");d.width=a.clientWidth;d.height=a.clientHeight;a.parentNode.insertBefore(d,
+a);a.parentNode.removeChild(a);var k=document.createElement("div");k.appendChild(a);canvg(d,k.innerHTML)}else d=d||{},typeof a=="string"&&(a=document.getElementById(a)),a.svg==null?(b=m(),a.svg=b):(b=a.svg,b.stop()),b.opts=d,a=a.getContext("2d"),typeof c.documentElement!="undefined"?b.loadXmlDoc(a,c):c.substr(0,1)=="<"?b.loadXml(a,c):b.load(a,c)}})();
+if(CanvasRenderingContext2D)CanvasRenderingContext2D.prototype.drawSvg=function(m,a,c,d,b){canvg(this.canvas,m,{ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0,ignoreClear:!0,offsetX:a,offsetY:c,scaleWidth:d,scaleHeight:b})};
+(function(m){var a=m.css,c=m.CanVGRenderer,d=m.SVGRenderer,b=m.extend,k=m.merge,e=m.addEvent,f=m.createElement,g=m.discardElement;b(c.prototype,d.prototype);b(c.prototype,{create:function(a,b,c,d){this.setContainer(b,c,d);this.configure(a)},setContainer:function(a,b,c){var d=a.style,e=a.parentNode,g=d.left,d=d.top,k=a.offsetWidth,m=a.offsetHeight,s={visibility:"hidden",position:"absolute"};this.init.apply(this,[a,b,c]);this.canvas=f("canvas",{width:k,height:m},{position:"relative",left:g,top:d},a);
+this.ttLine=f("div",null,s,e);this.ttDiv=f("div",null,s,e);this.ttTimer=void 0;this.hiddenSvg=a=f("div",{width:k,height:m},{visibility:"hidden",left:g,top:d},e);a.appendChild(this.box)},configure:function(b){var c=this,d=b.options.tooltip,f=d.borderWidth,g=c.ttDiv,m=d.style,p=c.ttLine,t=parseInt(m.padding,10),m=k(m,{padding:t+"px","background-color":d.backgroundColor,"border-style":"solid","border-width":f+"px","border-radius":d.borderRadius+"px"});d.shadow&&(m=k(m,{"box-shadow":"1px 1px 3px gray",
+"-webkit-box-shadow":"1px 1px 3px gray"}));a(g,m);a(p,{"border-left":"1px solid darkgray"});e(b,"tooltipRefresh",function(d){var e=b.container,f=e.offsetLeft,e=e.offsetTop,k;g.innerHTML=d.text;k=b.tooltip.getPosition(g.offsetWidth,g.offsetHeight,{plotX:d.x,plotY:d.y});a(g,{visibility:"visible",left:k.x+"px",top:k.y+"px","border-color":d.borderColor});a(p,{visibility:"visible",left:f+d.x+"px",top:e+b.plotTop+"px",height:b.plotHeight+"px"});c.ttTimer!==void 0&&clearTimeout(c.ttTimer);c.ttTimer=setTimeout(function(){a(g,
+{visibility:"hidden"});a(p,{visibility:"hidden"})},3E3)})},destroy:function(){g(this.canvas);this.ttTimer!==void 0&&clearTimeout(this.ttTimer);g(this.ttLine);g(this.ttDiv);g(this.hiddenSvg);return d.prototype.destroy.apply(this)},color:function(a,b,c){a&&a.linearGradient&&(a=a.stops[a.stops.length-1][1]);return d.prototype.color.call(this,a,b,c)},draw:function(){window.canvg(this.canvas,this.hiddenSvg.innerHTML)}})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/canvas-tools.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/canvas-tools.src.js
new file mode 100644
index 0000000..3ebbdcf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/canvas-tools.src.js
@@ -0,0 +1,3113 @@
+/**
+ * @license A class to parse color values
+ * @author Stoyan Stefanov <sstoo@gmail.com>
+ * @link   http://www.phpied.com/rgb-color-parser-in-javascript/
+ * Use it if you like it
+ *
+ */
+function RGBColor(color_string)
+{
+    this.ok = false;
+
+    // strip any leading #
+    if (color_string.charAt(0) == '#') { // remove # if any
+        color_string = color_string.substr(1,6);
+    }
+
+    color_string = color_string.replace(/ /g,'');
+    color_string = color_string.toLowerCase();
+
+    // before getting into regexps, try simple matches
+    // and overwrite the input
+    var simple_colors = {
+        aliceblue: 'f0f8ff',
+        antiquewhite: 'faebd7',
+        aqua: '00ffff',
+        aquamarine: '7fffd4',
+        azure: 'f0ffff',
+        beige: 'f5f5dc',
+        bisque: 'ffe4c4',
+        black: '000000',
+        blanchedalmond: 'ffebcd',
+        blue: '0000ff',
+        blueviolet: '8a2be2',
+        brown: 'a52a2a',
+        burlywood: 'deb887',
+        cadetblue: '5f9ea0',
+        chartreuse: '7fff00',
+        chocolate: 'd2691e',
+        coral: 'ff7f50',
+        cornflowerblue: '6495ed',
+        cornsilk: 'fff8dc',
+        crimson: 'dc143c',
+        cyan: '00ffff',
+        darkblue: '00008b',
+        darkcyan: '008b8b',
+        darkgoldenrod: 'b8860b',
+        darkgray: 'a9a9a9',
+        darkgreen: '006400',
+        darkkhaki: 'bdb76b',
+        darkmagenta: '8b008b',
+        darkolivegreen: '556b2f',
+        darkorange: 'ff8c00',
+        darkorchid: '9932cc',
+        darkred: '8b0000',
+        darksalmon: 'e9967a',
+        darkseagreen: '8fbc8f',
+        darkslateblue: '483d8b',
+        darkslategray: '2f4f4f',
+        darkturquoise: '00ced1',
+        darkviolet: '9400d3',
+        deeppink: 'ff1493',
+        deepskyblue: '00bfff',
+        dimgray: '696969',
+        dodgerblue: '1e90ff',
+        feldspar: 'd19275',
+        firebrick: 'b22222',
+        floralwhite: 'fffaf0',
+        forestgreen: '228b22',
+        fuchsia: 'ff00ff',
+        gainsboro: 'dcdcdc',
+        ghostwhite: 'f8f8ff',
+        gold: 'ffd700',
+        goldenrod: 'daa520',
+        gray: '808080',
+        green: '008000',
+        greenyellow: 'adff2f',
+        honeydew: 'f0fff0',
+        hotpink: 'ff69b4',
+        indianred : 'cd5c5c',
+        indigo : '4b0082',
+        ivory: 'fffff0',
+        khaki: 'f0e68c',
+        lavender: 'e6e6fa',
+        lavenderblush: 'fff0f5',
+        lawngreen: '7cfc00',
+        lemonchiffon: 'fffacd',
+        lightblue: 'add8e6',
+        lightcoral: 'f08080',
+        lightcyan: 'e0ffff',
+        lightgoldenrodyellow: 'fafad2',
+        lightgrey: 'd3d3d3',
+        lightgreen: '90ee90',
+        lightpink: 'ffb6c1',
+        lightsalmon: 'ffa07a',
+        lightseagreen: '20b2aa',
+        lightskyblue: '87cefa',
+        lightslateblue: '8470ff',
+        lightslategray: '778899',
+        lightsteelblue: 'b0c4de',
+        lightyellow: 'ffffe0',
+        lime: '00ff00',
+        limegreen: '32cd32',
+        linen: 'faf0e6',
+        magenta: 'ff00ff',
+        maroon: '800000',
+        mediumaquamarine: '66cdaa',
+        mediumblue: '0000cd',
+        mediumorchid: 'ba55d3',
+        mediumpurple: '9370d8',
+        mediumseagreen: '3cb371',
+        mediumslateblue: '7b68ee',
+        mediumspringgreen: '00fa9a',
+        mediumturquoise: '48d1cc',
+        mediumvioletred: 'c71585',
+        midnightblue: '191970',
+        mintcream: 'f5fffa',
+        mistyrose: 'ffe4e1',
+        moccasin: 'ffe4b5',
+        navajowhite: 'ffdead',
+        navy: '000080',
+        oldlace: 'fdf5e6',
+        olive: '808000',
+        olivedrab: '6b8e23',
+        orange: 'ffa500',
+        orangered: 'ff4500',
+        orchid: 'da70d6',
+        palegoldenrod: 'eee8aa',
+        palegreen: '98fb98',
+        paleturquoise: 'afeeee',
+        palevioletred: 'd87093',
+        papayawhip: 'ffefd5',
+        peachpuff: 'ffdab9',
+        peru: 'cd853f',
+        pink: 'ffc0cb',
+        plum: 'dda0dd',
+        powderblue: 'b0e0e6',
+        purple: '800080',
+        red: 'ff0000',
+        rosybrown: 'bc8f8f',
+        royalblue: '4169e1',
+        saddlebrown: '8b4513',
+        salmon: 'fa8072',
+        sandybrown: 'f4a460',
+        seagreen: '2e8b57',
+        seashell: 'fff5ee',
+        sienna: 'a0522d',
+        silver: 'c0c0c0',
+        skyblue: '87ceeb',
+        slateblue: '6a5acd',
+        slategray: '708090',
+        snow: 'fffafa',
+        springgreen: '00ff7f',
+        steelblue: '4682b4',
+        tan: 'd2b48c',
+        teal: '008080',
+        thistle: 'd8bfd8',
+        tomato: 'ff6347',
+        turquoise: '40e0d0',
+        violet: 'ee82ee',
+        violetred: 'd02090',
+        wheat: 'f5deb3',
+        white: 'ffffff',
+        whitesmoke: 'f5f5f5',
+        yellow: 'ffff00',
+        yellowgreen: '9acd32'
+    };
+    for (var key in simple_colors) {
+        if (color_string == key) {
+            color_string = simple_colors[key];
+        }
+    }
+    // emd of simple type-in colors
+
+    // array of color definition objects
+    var color_defs = [
+        {
+            re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
+            example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],
+            process: function (bits){
+                return [
+                    parseInt(bits[1]),
+                    parseInt(bits[2]),
+                    parseInt(bits[3])
+                ];
+            }
+        },
+        {
+            re: /^(\w{2})(\w{2})(\w{2})$/,
+            example: ['#00ff00', '336699'],
+            process: function (bits){
+                return [
+                    parseInt(bits[1], 16),
+                    parseInt(bits[2], 16),
+                    parseInt(bits[3], 16)
+                ];
+            }
+        },
+        {
+            re: /^(\w{1})(\w{1})(\w{1})$/,
+            example: ['#fb0', 'f0f'],
+            process: function (bits){
+                return [
+                    parseInt(bits[1] + bits[1], 16),
+                    parseInt(bits[2] + bits[2], 16),
+                    parseInt(bits[3] + bits[3], 16)
+                ];
+            }
+        }
+    ];
+
+    // search through the definitions to find a match
+    for (var i = 0; i < color_defs.length; i++) {
+        var re = color_defs[i].re;
+        var processor = color_defs[i].process;
+        var bits = re.exec(color_string);
+        if (bits) {
+            channels = processor(bits);
+            this.r = channels[0];
+            this.g = channels[1];
+            this.b = channels[2];
+            this.ok = true;
+        }
+
+    }
+
+    // validate/cleanup values
+    this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);
+    this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);
+    this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);
+
+    // some getters
+    this.toRGB = function () {
+        return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';
+    }
+    this.toHex = function () {
+        var r = this.r.toString(16);
+        var g = this.g.toString(16);
+        var b = this.b.toString(16);
+        if (r.length == 1) r = '0' + r;
+        if (g.length == 1) g = '0' + g;
+        if (b.length == 1) b = '0' + b;
+        return '#' + r + g + b;
+    }
+
+    // help
+    this.getHelpXML = function () {
+
+        var examples = new Array();
+        // add regexps
+        for (var i = 0; i < color_defs.length; i++) {
+            var example = color_defs[i].example;
+            for (var j = 0; j < example.length; j++) {
+                examples[examples.length] = example[j];
+            }
+        }
+        // add type-in colors
+        for (var sc in simple_colors) {
+            examples[examples.length] = sc;
+        }
+
+        var xml = document.createElement('ul');
+        xml.setAttribute('id', 'rgbcolor-examples');
+        for (var i = 0; i < examples.length; i++) {
+            try {
+                var list_item = document.createElement('li');
+                var list_color = new RGBColor(examples[i]);
+                var example_div = document.createElement('div');
+                example_div.style.cssText =
+                        'margin: 3px; '
+                        + 'border: 1px solid black; '
+                        + 'background:' + list_color.toHex() + '; '
+                        + 'color:' + list_color.toHex()
+                ;
+                example_div.appendChild(document.createTextNode('test'));
+                var list_item_value = document.createTextNode(
+                    ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()
+                );
+                list_item.appendChild(example_div);
+                list_item.appendChild(list_item_value);
+                xml.appendChild(list_item);
+
+            } catch(e){}
+        }
+        return xml;
+
+    }
+
+}
+
+/**
+ * @license canvg.js - Javascript SVG parser and renderer on Canvas
+ * MIT Licensed 
+ * Gabe Lerner (gabelerner@gmail.com)
+ * http://code.google.com/p/canvg/
+ *
+ * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/
+ *
+ */
+if(!window.console) {
+	window.console = {};
+	window.console.log = function(str) {};
+	window.console.dir = function(str) {};
+}
+
+if(!Array.prototype.indexOf){
+	Array.prototype.indexOf = function(obj){
+		for(var i=0; i<this.length; i++){
+			if(this[i]==obj){
+				return i;
+			}
+		}
+		return -1;
+	}
+}
+
+(function(){
+	// canvg(target, s)
+	// empty parameters: replace all 'svg' elements on page with 'canvas' elements
+	// target: canvas element or the id of a canvas element
+	// s: svg string, url to svg file, or xml document
+	// opts: optional hash of options
+	//		 ignoreMouse: true => ignore mouse events
+	//		 ignoreAnimation: true => ignore animations
+	//		 ignoreDimensions: true => does not try to resize canvas
+	//		 ignoreClear: true => does not clear canvas
+	//		 offsetX: int => draws at a x offset
+	//		 offsetY: int => draws at a y offset
+	//		 scaleWidth: int => scales horizontally to width
+	//		 scaleHeight: int => scales vertically to height
+	//		 renderCallback: function => will call the function after the first render is completed
+	//		 forceRedraw: function => will call the function on every frame, if it returns true, will redraw
+	this.canvg = function (target, s, opts) {
+		// no parameters
+		if (target == null && s == null && opts == null) {
+			var svgTags = document.getElementsByTagName('svg');
+			for (var i=0; i<svgTags.length; i++) {
+				var svgTag = svgTags[i];
+				var c = document.createElement('canvas');
+				c.width = svgTag.clientWidth;
+				c.height = svgTag.clientHeight;
+				svgTag.parentNode.insertBefore(c, svgTag);
+				svgTag.parentNode.removeChild(svgTag);
+				var div = document.createElement('div');
+				div.appendChild(svgTag);
+				canvg(c, div.innerHTML);
+			}
+			return;
+		}	
+		opts = opts || {};
+	
+		if (typeof target == 'string') {
+			target = document.getElementById(target);
+		}
+		
+		// reuse class per canvas
+		var svg;
+		if (target.svg == null) {
+			svg = build();
+			target.svg = svg;
+		}
+		else {
+			svg = target.svg;
+			svg.stop();
+		}
+		svg.opts = opts;
+		
+		var ctx = target.getContext('2d');
+		if (typeof(s.documentElement) != 'undefined') {
+			// load from xml doc
+			svg.loadXmlDoc(ctx, s);
+		}
+		else if (s.substr(0,1) == '<') {
+			// load from xml string
+			svg.loadXml(ctx, s);
+		}
+		else {
+			// load from url
+			svg.load(ctx, s);
+		}
+	}
+
+	function build() {
+		var svg = { };
+		
+		svg.FRAMERATE = 30;
+		svg.MAX_VIRTUAL_PIXELS = 30000;
+		
+		// globals
+		svg.init = function(ctx) {
+			svg.Definitions = {};
+			svg.Styles = {};
+			svg.Animations = [];
+			svg.Images = [];
+			svg.ctx = ctx;
+			svg.ViewPort = new (function () {
+				this.viewPorts = [];
+				this.Clear = function() { this.viewPorts = []; }
+				this.SetCurrent = function(width, height) { this.viewPorts.push({ width: width, height: height }); }
+				this.RemoveCurrent = function() { this.viewPorts.pop(); }
+				this.Current = function() { return this.viewPorts[this.viewPorts.length - 1]; }
+				this.width = function() { return this.Current().width; }
+				this.height = function() { return this.Current().height; }
+				this.ComputeSize = function(d) {
+					if (d != null && typeof(d) == 'number') return d;
+					if (d == 'x') return this.width();
+					if (d == 'y') return this.height();
+					return Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2);			
+				}
+			});
+		}
+		svg.init();
+		
+		// images loaded
+		svg.ImagesLoaded = function() { 
+			for (var i=0; i<svg.Images.length; i++) {
+				if (!svg.Images[i].loaded) return false;
+			}
+			return true;
+		}
+
+		// trim
+		svg.trim = function(s) { return s.replace(/^\s+|\s+$/g, ''); }
+		
+		// compress spaces
+		svg.compressSpaces = function(s) { return s.replace(/[\s\r\t\n]+/gm,' '); }
+		
+		// ajax
+		svg.ajax = function(url) {
+			var AJAX;
+			if(window.XMLHttpRequest){AJAX=new XMLHttpRequest();}
+			else{AJAX=new ActiveXObject('Microsoft.XMLHTTP');}
+			if(AJAX){
+			   AJAX.open('GET',url,false);
+			   AJAX.send(null);
+			   return AJAX.responseText;
+			}
+			return null;
+		} 
+		
+		// parse xml
+		svg.parseXml = function(xml) {
+			if (window.DOMParser)
+			{
+				var parser = new DOMParser();
+				return parser.parseFromString(xml, 'text/xml');
+			}
+			else 
+			{
+				xml = xml.replace(/<!DOCTYPE svg[^>]*>/, '');
+				var xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
+				xmlDoc.async = 'false';
+				xmlDoc.loadXML(xml); 
+				return xmlDoc;
+			}		
+		}
+		
+		svg.Property = function(name, value) {
+			this.name = name;
+			this.value = value;
+			
+			this.hasValue = function() {
+				return (this.value != null && this.value !== '');
+			}
+							
+			// return the numerical value of the property
+			this.numValue = function() {
+				if (!this.hasValue()) return 0;
+				
+				var n = parseFloat(this.value);
+				if ((this.value + '').match(/%$/)) {
+					n = n / 100.0;
+				}
+				return n;
+			}
+			
+			this.valueOrDefault = function(def) {
+				if (this.hasValue()) return this.value;
+				return def;
+			}
+			
+			this.numValueOrDefault = function(def) {
+				if (this.hasValue()) return this.numValue();
+				return def;
+			}
+			
+			/* EXTENSIONS */
+			var that = this;
+			
+			// color extensions
+			this.Color = {
+				// augment the current color value with the opacity
+				addOpacity: function(opacity) {
+					var newValue = that.value;
+					if (opacity != null && opacity != '') {
+						var color = new RGBColor(that.value);
+						if (color.ok) {
+							newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacity + ')';
+						}
+					}
+					return new svg.Property(that.name, newValue);
+				}
+			}
+			
+			// definition extensions
+			this.Definition = {
+				// get the definition from the definitions table
+				getDefinition: function() {
+					var name = that.value.replace(/^(url\()?#([^\)]+)\)?$/, '$2');
+					return svg.Definitions[name];
+				},
+				
+				isUrl: function() {
+					return that.value.indexOf('url(') == 0
+				},
+				
+				getFillStyle: function(e) {
+					var def = this.getDefinition();
+					
+					// gradient
+					if (def != null && def.createGradient) {
+						return def.createGradient(svg.ctx, e);
+					}
+					
+					// pattern
+					if (def != null && def.createPattern) {
+						return def.createPattern(svg.ctx, e);
+					}
+					
+					return null;
+				}
+			}
+			
+			// length extensions
+			this.Length = {
+				DPI: function(viewPort) {
+					return 96.0; // TODO: compute?
+				},
+				
+				EM: function(viewPort) {
+					var em = 12;
+					
+					var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);
+					if (fontSize.hasValue()) em = fontSize.Length.toPixels(viewPort);
+					
+					return em;
+				},
+			
+				// get the length as pixels
+				toPixels: function(viewPort) {
+					if (!that.hasValue()) return 0;
+					var s = that.value+'';
+					if (s.match(/em$/)) return that.numValue() * this.EM(viewPort);
+					if (s.match(/ex$/)) return that.numValue() * this.EM(viewPort) / 2.0;
+					if (s.match(/px$/)) return that.numValue();
+					if (s.match(/pt$/)) return that.numValue() * 1.25;
+					if (s.match(/pc$/)) return that.numValue() * 15;
+					if (s.match(/cm$/)) return that.numValue() * this.DPI(viewPort) / 2.54;
+					if (s.match(/mm$/)) return that.numValue() * this.DPI(viewPort) / 25.4;
+					if (s.match(/in$/)) return that.numValue() * this.DPI(viewPort);
+					if (s.match(/%$/)) return that.numValue() * svg.ViewPort.ComputeSize(viewPort);
+					return that.numValue();
+				}
+			}
+			
+			// time extensions
+			this.Time = {
+				// get the time as milliseconds
+				toMilliseconds: function() {
+					if (!that.hasValue()) return 0;
+					var s = that.value+'';
+					if (s.match(/s$/)) return that.numValue() * 1000;
+					if (s.match(/ms$/)) return that.numValue();
+					return that.numValue();
+				}
+			}
+			
+			// angle extensions
+			this.Angle = {
+				// get the angle as radians
+				toRadians: function() {
+					if (!that.hasValue()) return 0;
+					var s = that.value+'';
+					if (s.match(/deg$/)) return that.numValue() * (Math.PI / 180.0);
+					if (s.match(/grad$/)) return that.numValue() * (Math.PI / 200.0);
+					if (s.match(/rad$/)) return that.numValue();
+					return that.numValue() * (Math.PI / 180.0);
+				}
+			}
+		}
+		
+		// fonts
+		svg.Font = new (function() {
+			this.Styles = ['normal','italic','oblique','inherit'];
+			this.Variants = ['normal','small-caps','inherit'];
+			this.Weights = ['normal','bold','bolder','lighter','100','200','300','400','500','600','700','800','900','inherit'];
+			
+			this.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) { 
+				var f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font);
+				return { 
+					fontFamily: fontFamily || f.fontFamily, 
+					fontSize: fontSize || f.fontSize, 
+					fontStyle: fontStyle || f.fontStyle, 
+					fontWeight: fontWeight || f.fontWeight, 
+					fontVariant: fontVariant || f.fontVariant,
+					toString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') } 
+				} 
+			}
+			
+			var that = this;
+			this.Parse = function(s) {
+				var f = {};
+				var d = svg.trim(svg.compressSpaces(s || '')).split(' ');
+				var set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false }
+				var ff = '';
+				for (var i=0; i<d.length; i++) {
+					if (!set.fontStyle && that.Styles.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontStyle = d[i]; set.fontStyle = true; }
+					else if (!set.fontVariant && that.Variants.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontVariant = d[i]; set.fontStyle = set.fontVariant = true;	}
+					else if (!set.fontWeight && that.Weights.indexOf(d[i]) != -1) {	if (d[i] != 'inherit') f.fontWeight = d[i]; set.fontStyle = set.fontVariant = set.fontWeight = true; }
+					else if (!set.fontSize) { if (d[i] != 'inherit') f.fontSize = d[i].split('/')[0]; set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; }
+					else { if (d[i] != 'inherit') ff += d[i]; }
+				} if (ff != '') f.fontFamily = ff;
+				return f;
+			}
+		});
+		
+		// points and paths
+		svg.ToNumberArray = function(s) {
+			var a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' ');
+			for (var i=0; i<a.length; i++) {
+				a[i] = parseFloat(a[i]);
+			}
+			return a;
+		}		
+		svg.Point = function(x, y) {
+			this.x = x;
+			this.y = y;
+			
+			this.angleTo = function(p) {
+				return Math.atan2(p.y - this.y, p.x - this.x);
+			}
+			
+			this.applyTransform = function(v) {
+				var xp = this.x * v[0] + this.y * v[2] + v[4];
+				var yp = this.x * v[1] + this.y * v[3] + v[5];
+				this.x = xp;
+				this.y = yp;
+			}
+		}
+		svg.CreatePoint = function(s) {
+			var a = svg.ToNumberArray(s);
+			return new svg.Point(a[0], a[1]);
+		}
+		svg.CreatePath = function(s) {
+			var a = svg.ToNumberArray(s);
+			var path = [];
+			for (var i=0; i<a.length; i+=2) {
+				path.push(new svg.Point(a[i], a[i+1]));
+			}
+			return path;
+		}
+		
+		// bounding box
+		svg.BoundingBox = function(x1, y1, x2, y2) { // pass in initial points if you want
+			this.x1 = Number.NaN;
+			this.y1 = Number.NaN;
+			this.x2 = Number.NaN;
+			this.y2 = Number.NaN;
+			
+			this.x = function() { return this.x1; }
+			this.y = function() { return this.y1; }
+			this.width = function() { return this.x2 - this.x1; }
+			this.height = function() { return this.y2 - this.y1; }
+			
+			this.addPoint = function(x, y) {	
+				if (x != null) {
+					if (isNaN(this.x1) || isNaN(this.x2)) {
+						this.x1 = x;
+						this.x2 = x;
+					}
+					if (x < this.x1) this.x1 = x;
+					if (x > this.x2) this.x2 = x;
+				}
+			
+				if (y != null) {
+					if (isNaN(this.y1) || isNaN(this.y2)) {
+						this.y1 = y;
+						this.y2 = y;
+					}
+					if (y < this.y1) this.y1 = y;
+					if (y > this.y2) this.y2 = y;
+				}
+			}			
+			this.addX = function(x) { this.addPoint(x, null); }
+			this.addY = function(y) { this.addPoint(null, y); }
+			
+			this.addBoundingBox = function(bb) {
+				this.addPoint(bb.x1, bb.y1);
+				this.addPoint(bb.x2, bb.y2);
+			}
+			
+			this.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) {
+				var cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)
+				var cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)
+				var cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)
+				var cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)
+				this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y,	cp2y, p2x, p2y);
+			}
+			
+			this.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {
+				// from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html
+				var p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y];
+				this.addPoint(p0[0], p0[1]);
+				this.addPoint(p3[0], p3[1]);
+				
+				for (i=0; i<=1; i++) {
+					var f = function(t) { 
+						return Math.pow(1-t, 3) * p0[i]
+						+ 3 * Math.pow(1-t, 2) * t * p1[i]
+						+ 3 * (1-t) * Math.pow(t, 2) * p2[i]
+						+ Math.pow(t, 3) * p3[i];
+					}
+					
+					var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];
+					var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];
+					var c = 3 * p1[i] - 3 * p0[i];
+					
+					if (a == 0) {
+						if (b == 0) continue;
+						var t = -c / b;
+						if (0 < t && t < 1) {
+							if (i == 0) this.addX(f(t));
+							if (i == 1) this.addY(f(t));
+						}
+						continue;
+					}
+					
+					var b2ac = Math.pow(b, 2) - 4 * c * a;
+					if (b2ac < 0) continue;
+					var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);
+					if (0 < t1 && t1 < 1) {
+						if (i == 0) this.addX(f(t1));
+						if (i == 1) this.addY(f(t1));
+					}
+					var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);
+					if (0 < t2 && t2 < 1) {
+						if (i == 0) this.addX(f(t2));
+						if (i == 1) this.addY(f(t2));
+					}
+				}
+			}
+			
+			this.isPointInBox = function(x, y) {
+				return (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2);
+			}
+			
+			this.addPoint(x1, y1);
+			this.addPoint(x2, y2);
+		}
+		
+		// transforms
+		svg.Transform = function(v) {	
+			var that = this;
+			this.Type = {}
+		
+			// translate
+			this.Type.translate = function(s) {
+				this.p = svg.CreatePoint(s);			
+				this.apply = function(ctx) {
+					ctx.translate(this.p.x || 0.0, this.p.y || 0.0);
+				}
+				this.applyToPoint = function(p) {
+					p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);
+				}
+			}
+			
+			// rotate
+			this.Type.rotate = function(s) {
+				var a = svg.ToNumberArray(s);
+				this.angle = new svg.Property('angle', a[0]);
+				this.cx = a[1] || 0;
+				this.cy = a[2] || 0;
+				this.apply = function(ctx) {
+					ctx.translate(this.cx, this.cy);
+					ctx.rotate(this.angle.Angle.toRadians());
+					ctx.translate(-this.cx, -this.cy);
+				}
+				this.applyToPoint = function(p) {
+					var a = this.angle.Angle.toRadians();
+					p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);
+					p.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);
+					p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]);
+				}			
+			}
+			
+			this.Type.scale = function(s) {
+				this.p = svg.CreatePoint(s);
+				this.apply = function(ctx) {
+					ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0);
+				}
+				this.applyToPoint = function(p) {
+					p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]);
+				}				
+			}
+			
+			this.Type.matrix = function(s) {
+				this.m = svg.ToNumberArray(s);
+				this.apply = function(ctx) {
+					ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]);
+				}
+				this.applyToPoint = function(p) {
+					p.applyTransform(this.m);
+				}					
+			}
+			
+			this.Type.SkewBase = function(s) {
+				this.base = that.Type.matrix;
+				this.base(s);
+				this.angle = new svg.Property('angle', s);
+			}
+			this.Type.SkewBase.prototype = new this.Type.matrix;
+			
+			this.Type.skewX = function(s) {
+				this.base = that.Type.SkewBase;
+				this.base(s);
+				this.m = [1, 0, Math.tan(this.angle.Angle.toRadians()), 1, 0, 0];
+			}
+			this.Type.skewX.prototype = new this.Type.SkewBase;
+			
+			this.Type.skewY = function(s) {
+				this.base = that.Type.SkewBase;
+				this.base(s);
+				this.m = [1, Math.tan(this.angle.Angle.toRadians()), 0, 1, 0, 0];
+			}
+			this.Type.skewY.prototype = new this.Type.SkewBase;
+		
+			this.transforms = [];
+			
+			this.apply = function(ctx) {
+				for (var i=0; i<this.transforms.length; i++) {
+					this.transforms[i].apply(ctx);
+				}
+			}
+			
+			this.applyToPoint = function(p) {
+				for (var i=0; i<this.transforms.length; i++) {
+					this.transforms[i].applyToPoint(p);
+				}
+			}
+			
+			var data = svg.trim(svg.compressSpaces(v)).split(/\s(?=[a-z])/);
+			for (var i=0; i<data.length; i++) {
+				var type = data[i].split('(')[0];
+				var s = data[i].split('(')[1].replace(')','');
+				var transform = new this.Type[type](s);
+				this.transforms.push(transform);
+			}
+		}
+		
+		// aspect ratio
+		svg.AspectRatio = function(ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) {
+			// aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute
+			aspectRatio = svg.compressSpaces(aspectRatio);
+			aspectRatio = aspectRatio.replace(/^defer\s/,''); // ignore defer
+			var align = aspectRatio.split(' ')[0] || 'xMidYMid';
+			var meetOrSlice = aspectRatio.split(' ')[1] || 'meet';					
+	
+			// calculate scale
+			var scaleX = width / desiredWidth;
+			var scaleY = height / desiredHeight;
+			var scaleMin = Math.min(scaleX, scaleY);
+			var scaleMax = Math.max(scaleX, scaleY);
+			if (meetOrSlice == 'meet') { desiredWidth *= scaleMin; desiredHeight *= scaleMin; }
+			if (meetOrSlice == 'slice') { desiredWidth *= scaleMax; desiredHeight *= scaleMax; }	
+			
+			refX = new svg.Property('refX', refX);
+			refY = new svg.Property('refY', refY);
+			if (refX.hasValue() && refY.hasValue()) {				
+				ctx.translate(-scaleMin * refX.Length.toPixels('x'), -scaleMin * refY.Length.toPixels('y'));
+			} 
+			else {					
+				// align
+				if (align.match(/^xMid/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width / 2.0 - desiredWidth / 2.0, 0); 
+				if (align.match(/YMid$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height / 2.0 - desiredHeight / 2.0); 
+				if (align.match(/^xMax/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width - desiredWidth, 0); 
+				if (align.match(/YMax$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height - desiredHeight); 
+			}
+			
+			// scale
+			if (align == 'none') ctx.scale(scaleX, scaleY);
+			else if (meetOrSlice == 'meet') ctx.scale(scaleMin, scaleMin); 
+			else if (meetOrSlice == 'slice') ctx.scale(scaleMax, scaleMax); 	
+			
+			// translate
+			ctx.translate(minX == null ? 0 : -minX, minY == null ? 0 : -minY);			
+		}
+		
+		// elements
+		svg.Element = {}
+		
+		svg.Element.ElementBase = function(node) {	
+			this.attributes = {};
+			this.styles = {};
+			this.children = [];
+			
+			// get or create attribute
+			this.attribute = function(name, createIfNotExists) {
+				var a = this.attributes[name];
+				if (a != null) return a;
+							
+				a = new svg.Property(name, '');
+				if (createIfNotExists == true) this.attributes[name] = a;
+				return a;
+			}
+			
+			// get or create style, crawls up node tree
+			this.style = function(name, createIfNotExists) {
+				var s = this.styles[name];
+				if (s != null) return s;
+				
+				var a = this.attribute(name);
+				if (a != null && a.hasValue()) {
+					return a;
+				}
+				
+				var p = this.parent;
+				if (p != null) {
+					var ps = p.style(name);
+					if (ps != null && ps.hasValue()) {
+						return ps;
+					}
+				}
+					
+				s = new svg.Property(name, '');
+				if (createIfNotExists == true) this.styles[name] = s;
+				return s;
+			}
+			
+			// base render
+			this.render = function(ctx) {
+				// don't render display=none
+				if (this.style('display').value == 'none') return;
+				
+				// don't render visibility=hidden
+				if (this.attribute('visibility').value == 'hidden') return;
+			
+				ctx.save();
+					this.setContext(ctx);
+						// mask
+						if (this.attribute('mask').hasValue()) {
+							var mask = this.attribute('mask').Definition.getDefinition();
+							if (mask != null) mask.apply(ctx, this);
+						}
+						else if (this.style('filter').hasValue()) {
+							var filter = this.style('filter').Definition.getDefinition();
+							if (filter != null) filter.apply(ctx, this);
+						}
+						else this.renderChildren(ctx);				
+					this.clearContext(ctx);
+				ctx.restore();
+			}
+			
+			// base set context
+			this.setContext = function(ctx) {
+				// OVERRIDE ME!
+			}
+			
+			// base clear context
+			this.clearContext = function(ctx) {
+				// OVERRIDE ME!
+			}			
+			
+			// base render children
+			this.renderChildren = function(ctx) {
+				for (var i=0; i<this.children.length; i++) {
+					this.children[i].render(ctx);
+				}
+			}
+			
+			this.addChild = function(childNode, create) {
+				var child = childNode;
+				if (create) child = svg.CreateElement(childNode);
+				child.parent = this;
+				this.children.push(child);			
+			}
+				
+			if (node != null && node.nodeType == 1) { //ELEMENT_NODE
+				// add children
+				for (var i=0; i<node.childNodes.length; i++) {
+					var childNode = node.childNodes[i];
+					if (childNode.nodeType == 1) this.addChild(childNode, true); //ELEMENT_NODE
+				}
+				
+				// add attributes
+				for (var i=0; i<node.attributes.length; i++) {
+					var attribute = node.attributes[i];
+					this.attributes[attribute.nodeName] = new svg.Property(attribute.nodeName, attribute.nodeValue);
+				}
+										
+				// add tag styles
+				var styles = svg.Styles[node.nodeName];
+				if (styles != null) {
+					for (var name in styles) {
+						this.styles[name] = styles[name];
+					}
+				}					
+				
+				// add class styles
+				if (this.attribute('class').hasValue()) {
+					var classes = svg.compressSpaces(this.attribute('class').value).split(' ');
+					for (var j=0; j<classes.length; j++) {
+						styles = svg.Styles['.'+classes[j]];
+						if (styles != null) {
+							for (var name in styles) {
+								this.styles[name] = styles[name];
+							}
+						}
+						styles = svg.Styles[node.nodeName+'.'+classes[j]];
+						if (styles != null) {
+							for (var name in styles) {
+								this.styles[name] = styles[name];
+							}
+						}
+					}
+				}
+				
+				// add inline styles
+				if (this.attribute('style').hasValue()) {
+					var styles = this.attribute('style').value.split(';');
+					for (var i=0; i<styles.length; i++) {
+						if (svg.trim(styles[i]) != '') {
+							var style = styles[i].split(':');
+							var name = svg.trim(style[0]);
+							var value = svg.trim(style[1]);
+							this.styles[name] = new svg.Property(name, value);
+						}
+					}
+				}	
+
+				// add id
+				if (this.attribute('id').hasValue()) {
+					if (svg.Definitions[this.attribute('id').value] == null) {
+						svg.Definitions[this.attribute('id').value] = this;
+					}
+				}
+			}
+		}
+		
+		svg.Element.RenderedElementBase = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.setContext = function(ctx) {
+				// fill
+				if (this.style('fill').Definition.isUrl()) {
+					var fs = this.style('fill').Definition.getFillStyle(this);
+					if (fs != null) ctx.fillStyle = fs;
+				}
+				else if (this.style('fill').hasValue()) {
+					var fillStyle = this.style('fill');
+					if (this.style('fill-opacity').hasValue()) fillStyle = fillStyle.Color.addOpacity(this.style('fill-opacity').value);
+					ctx.fillStyle = (fillStyle.value == 'none' ? 'rgba(0,0,0,0)' : fillStyle.value);
+				}
+									
+				// stroke
+				if (this.style('stroke').Definition.isUrl()) {
+					var fs = this.style('stroke').Definition.getFillStyle(this);
+					if (fs != null) ctx.strokeStyle = fs;
+				}
+				else if (this.style('stroke').hasValue()) {
+					var strokeStyle = this.style('stroke');
+					if (this.style('stroke-opacity').hasValue()) strokeStyle = strokeStyle.Color.addOpacity(this.style('stroke-opacity').value);
+					ctx.strokeStyle = (strokeStyle.value == 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value);
+				}
+				if (this.style('stroke-width').hasValue()) ctx.lineWidth = this.style('stroke-width').Length.toPixels();
+				if (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value;
+				if (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value;
+				if (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value;
+
+				// font
+				if (typeof(ctx.font) != 'undefined') {
+					ctx.font = svg.Font.CreateFont( 
+						this.style('font-style').value, 
+						this.style('font-variant').value, 
+						this.style('font-weight').value, 
+						this.style('font-size').hasValue() ? this.style('font-size').Length.toPixels() + 'px' : '', 
+						this.style('font-family').value).toString();
+				}
+				
+				// transform
+				if (this.attribute('transform').hasValue()) { 
+					var transform = new svg.Transform(this.attribute('transform').value);
+					transform.apply(ctx);
+				}
+				
+				// clip
+				if (this.attribute('clip-path').hasValue()) {
+					var clip = this.attribute('clip-path').Definition.getDefinition();
+					if (clip != null) clip.apply(ctx);
+				}
+				
+				// opacity
+				if (this.style('opacity').hasValue()) {
+					ctx.globalAlpha = this.style('opacity').numValue();
+				}
+			}		
+		}
+		svg.Element.RenderedElementBase.prototype = new svg.Element.ElementBase;
+		
+		svg.Element.PathElementBase = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				if (ctx != null) ctx.beginPath();
+				return new svg.BoundingBox();
+			}
+			
+			this.renderChildren = function(ctx) {
+				this.path(ctx);
+				svg.Mouse.checkPath(this, ctx);
+				if (ctx.fillStyle != '') ctx.fill();
+				if (ctx.strokeStyle != '') ctx.stroke();
+				
+				var markers = this.getMarkers();
+				if (markers != null) {
+					if (this.style('marker-start').Definition.isUrl()) {
+						var marker = this.style('marker-start').Definition.getDefinition();
+						marker.render(ctx, markers[0][0], markers[0][1]);
+					}
+					if (this.style('marker-mid').Definition.isUrl()) {
+						var marker = this.style('marker-mid').Definition.getDefinition();
+						for (var i=1;i<markers.length-1;i++) {
+							marker.render(ctx, markers[i][0], markers[i][1]);
+						}
+					}
+					if (this.style('marker-end').Definition.isUrl()) {
+						var marker = this.style('marker-end').Definition.getDefinition();
+						marker.render(ctx, markers[markers.length-1][0], markers[markers.length-1][1]);
+					}
+				}					
+			}
+			
+			this.getBoundingBox = function() {
+				return this.path();
+			}
+			
+			this.getMarkers = function() {
+				return null;
+			}
+		}
+		svg.Element.PathElementBase.prototype = new svg.Element.RenderedElementBase;
+		
+		// svg element
+		svg.Element.svg = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.baseClearContext = this.clearContext;
+			this.clearContext = function(ctx) {
+				this.baseClearContext(ctx);
+				svg.ViewPort.RemoveCurrent();
+			}
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {
+				// initial values
+				ctx.strokeStyle = 'rgba(0,0,0,0)';
+				ctx.lineCap = 'butt';
+				ctx.lineJoin = 'miter';
+				ctx.miterLimit = 4;			
+			
+				this.baseSetContext(ctx);
+				
+				// create new view port
+				if (this.attribute('x').hasValue() && this.attribute('y').hasValue()) {
+					ctx.translate(this.attribute('x').Length.toPixels('x'), this.attribute('y').Length.toPixels('y'));
+				}
+				
+				var width = svg.ViewPort.width();
+				var height = svg.ViewPort.height();
+				if (typeof(this.root) == 'undefined' && this.attribute('width').hasValue() && this.attribute('height').hasValue()) {
+					width = this.attribute('width').Length.toPixels('x');
+					height = this.attribute('height').Length.toPixels('y');
+					
+					var x = 0;
+					var y = 0;
+					if (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) {
+						x = -this.attribute('refX').Length.toPixels('x');
+						y = -this.attribute('refY').Length.toPixels('y');
+					}
+					
+					ctx.beginPath();
+					ctx.moveTo(x, y);
+					ctx.lineTo(width, y);
+					ctx.lineTo(width, height);
+					ctx.lineTo(x, height);
+					ctx.closePath();
+					ctx.clip();
+				}
+				svg.ViewPort.SetCurrent(width, height);	
+						
+				// viewbox
+				if (this.attribute('viewBox').hasValue()) {				
+					var viewBox = svg.ToNumberArray(this.attribute('viewBox').value);
+					var minX = viewBox[0];
+					var minY = viewBox[1];
+					width = viewBox[2];
+					height = viewBox[3];
+					
+					svg.AspectRatio(ctx,
+									this.attribute('preserveAspectRatio').value, 
+									svg.ViewPort.width(), 
+									width,
+									svg.ViewPort.height(),
+									height,
+									minX,
+									minY,
+									this.attribute('refX').value,
+									this.attribute('refY').value);
+										
+					svg.ViewPort.RemoveCurrent();	
+					svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);						
+				}				
+			}
+		}
+		svg.Element.svg.prototype = new svg.Element.RenderedElementBase;
+
+		// rect element
+		svg.Element.rect = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');
+				var rx = this.attribute('rx').Length.toPixels('x');
+				var ry = this.attribute('ry').Length.toPixels('y');
+				if (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx;
+				if (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry;
+				
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(x + rx, y);
+					ctx.lineTo(x + width - rx, y);
+					ctx.quadraticCurveTo(x + width, y, x + width, y + ry)
+					ctx.lineTo(x + width, y + height - ry);
+					ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height)
+					ctx.lineTo(x + rx, y + height);
+					ctx.quadraticCurveTo(x, y + height, x, y + height - ry)
+					ctx.lineTo(x, y + ry);
+					ctx.quadraticCurveTo(x, y, x + rx, y)
+					ctx.closePath();
+				}
+				
+				return new svg.BoundingBox(x, y, x + width, y + height);
+			}
+		}
+		svg.Element.rect.prototype = new svg.Element.PathElementBase;
+		
+		// circle element
+		svg.Element.circle = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				var cx = this.attribute('cx').Length.toPixels('x');
+				var cy = this.attribute('cy').Length.toPixels('y');
+				var r = this.attribute('r').Length.toPixels();
+			
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.arc(cx, cy, r, 0, Math.PI * 2, true); 
+					ctx.closePath();
+				}
+				
+				return new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r);
+			}
+		}
+		svg.Element.circle.prototype = new svg.Element.PathElementBase;	
+
+		// ellipse element
+		svg.Element.ellipse = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);
+				var rx = this.attribute('rx').Length.toPixels('x');
+				var ry = this.attribute('ry').Length.toPixels('y');
+				var cx = this.attribute('cx').Length.toPixels('x');
+				var cy = this.attribute('cy').Length.toPixels('y');
+				
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(cx, cy - ry);
+					ctx.bezierCurveTo(cx + (KAPPA * rx), cy - ry,  cx + rx, cy - (KAPPA * ry), cx + rx, cy);
+					ctx.bezierCurveTo(cx + rx, cy + (KAPPA * ry), cx + (KAPPA * rx), cy + ry, cx, cy + ry);
+					ctx.bezierCurveTo(cx - (KAPPA * rx), cy + ry, cx - rx, cy + (KAPPA * ry), cx - rx, cy);
+					ctx.bezierCurveTo(cx - rx, cy - (KAPPA * ry), cx - (KAPPA * rx), cy - ry, cx, cy - ry);
+					ctx.closePath();
+				}
+				
+				return new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);
+			}
+		}
+		svg.Element.ellipse.prototype = new svg.Element.PathElementBase;			
+		
+		// line element
+		svg.Element.line = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.getPoints = function() {
+				return [
+					new svg.Point(this.attribute('x1').Length.toPixels('x'), this.attribute('y1').Length.toPixels('y')),
+					new svg.Point(this.attribute('x2').Length.toPixels('x'), this.attribute('y2').Length.toPixels('y'))];
+			}
+								
+			this.path = function(ctx) {
+				var points = this.getPoints();
+				
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(points[0].x, points[0].y);
+					ctx.lineTo(points[1].x, points[1].y);
+				}
+				
+				return new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y);
+			}
+			
+			this.getMarkers = function() {
+				var points = this.getPoints();	
+				var a = points[0].angleTo(points[1]);
+				return [[points[0], a], [points[1], a]];
+			}
+		}
+		svg.Element.line.prototype = new svg.Element.PathElementBase;		
+				
+		// polyline element
+		svg.Element.polyline = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.points = svg.CreatePath(this.attribute('points').value);
+			this.path = function(ctx) {
+				var bb = new svg.BoundingBox(this.points[0].x, this.points[0].y);
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(this.points[0].x, this.points[0].y);
+				}
+				for (var i=1; i<this.points.length; i++) {
+					bb.addPoint(this.points[i].x, this.points[i].y);
+					if (ctx != null) ctx.lineTo(this.points[i].x, this.points[i].y);
+				}
+				return bb;
+			}
+			
+			this.getMarkers = function() {
+				var markers = [];
+				for (var i=0; i<this.points.length - 1; i++) {
+					markers.push([this.points[i], this.points[i].angleTo(this.points[i+1])]);
+				}
+				markers.push([this.points[this.points.length-1], markers[markers.length-1][1]]);
+				return markers;
+			}			
+		}
+		svg.Element.polyline.prototype = new svg.Element.PathElementBase;				
+				
+		// polygon element
+		svg.Element.polygon = function(node) {
+			this.base = svg.Element.polyline;
+			this.base(node);
+			
+			this.basePath = this.path;
+			this.path = function(ctx) {
+				var bb = this.basePath(ctx);
+				if (ctx != null) {
+					ctx.lineTo(this.points[0].x, this.points[0].y);
+					ctx.closePath();
+				}
+				return bb;
+			}
+		}
+		svg.Element.polygon.prototype = new svg.Element.polyline;
+
+		// path element
+		svg.Element.path = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+					
+			var d = this.attribute('d').value;
+			// TODO: convert to real lexer based on http://www.w3.org/TR/SVG11/paths.html#PathDataBNF
+			d = d.replace(/,/gm,' '); // get rid of all commas
+			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from commands
+			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from commands
+			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,'$1 $2'); // separate commands from points
+			d = d.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from points
+			d = d.replace(/([0-9])([+\-])/gm,'$1 $2'); // separate digits when no comma
+			d = d.replace(/(\.[0-9]*)(\.)/gm,'$1 $2'); // separate digits when no comma
+			d = d.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,'$1 $3 $4 '); // shorthand elliptical arc path syntax
+			d = svg.compressSpaces(d); // compress multiple spaces
+			d = svg.trim(d);
+			this.PathParser = new (function(d) {
+				this.tokens = d.split(' ');
+				
+				this.reset = function() {
+					this.i = -1;
+					this.command = '';
+					this.previousCommand = '';
+					this.start = new svg.Point(0, 0);
+					this.control = new svg.Point(0, 0);
+					this.current = new svg.Point(0, 0);
+					this.points = [];
+					this.angles = [];
+				}
+								
+				this.isEnd = function() {
+					return this.i >= this.tokens.length - 1;
+				}
+				
+				this.isCommandOrEnd = function() {
+					if (this.isEnd()) return true;
+					return this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null;
+				}
+				
+				this.isRelativeCommand = function() {
+					return this.command == this.command.toLowerCase();
+				}
+							
+				this.getToken = function() {
+					this.i = this.i + 1;
+					return this.tokens[this.i];
+				}
+				
+				this.getScalar = function() {
+					return parseFloat(this.getToken());
+				}
+				
+				this.nextCommand = function() {
+					this.previousCommand = this.command;
+					this.command = this.getToken();
+				}				
+				
+				this.getPoint = function() {
+					var p = new svg.Point(this.getScalar(), this.getScalar());
+					return this.makeAbsolute(p);
+				}
+				
+				this.getAsControlPoint = function() {
+					var p = this.getPoint();
+					this.control = p;
+					return p;
+				}
+				
+				this.getAsCurrentPoint = function() {
+					var p = this.getPoint();
+					this.current = p;
+					return p;	
+				}
+				
+				this.getReflectedControlPoint = function() {
+					if (this.previousCommand.toLowerCase() != 'c' && this.previousCommand.toLowerCase() != 's') {
+						return this.current;
+					}
+					
+					// reflect point
+					var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y);					
+					return p;
+				}
+				
+				this.makeAbsolute = function(p) {
+					if (this.isRelativeCommand()) {
+						p.x = this.current.x + p.x;
+						p.y = this.current.y + p.y;
+					}
+					return p;
+				}
+				
+				this.addMarker = function(p, from, priorTo) {
+					// if the last angle isn't filled in because we didn't have this point yet ...
+					if (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) {
+						this.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo);
+					}
+					this.addMarkerAngle(p, from == null ? null : from.angleTo(p));
+				}
+				
+				this.addMarkerAngle = function(p, a) {
+					this.points.push(p);
+					this.angles.push(a);
+				}				
+				
+				this.getMarkerPoints = function() { return this.points; }
+				this.getMarkerAngles = function() {
+					for (var i=0; i<this.angles.length; i++) {
+						if (this.angles[i] == null) {
+							for (var j=i+1; j<this.angles.length; j++) {
+								if (this.angles[j] != null) {
+									this.angles[i] = this.angles[j];
+									break;
+								}
+							}
+						}
+					}
+					return this.angles;
+				}
+			})(d);
+
+			this.path = function(ctx) {
+				var pp = this.PathParser;
+				pp.reset();
+
+				var bb = new svg.BoundingBox();
+				if (ctx != null) ctx.beginPath();
+				while (!pp.isEnd()) {
+					pp.nextCommand();
+					switch (pp.command.toUpperCase()) {
+					case 'M':
+						var p = pp.getAsCurrentPoint();
+						pp.addMarker(p);
+						bb.addPoint(p.x, p.y);
+						if (ctx != null) ctx.moveTo(p.x, p.y);
+						pp.start = pp.current;
+						while (!pp.isCommandOrEnd()) {
+							var p = pp.getAsCurrentPoint();
+							pp.addMarker(p, pp.start);
+							bb.addPoint(p.x, p.y);
+							if (ctx != null) ctx.lineTo(p.x, p.y);
+						}
+						break;
+					case 'L':
+						while (!pp.isCommandOrEnd()) {
+							var c = pp.current;
+							var p = pp.getAsCurrentPoint();
+							pp.addMarker(p, c);
+							bb.addPoint(p.x, p.y);
+							if (ctx != null) ctx.lineTo(p.x, p.y);
+						}
+						break;
+					case 'H':
+						while (!pp.isCommandOrEnd()) {
+							var newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y);
+							pp.addMarker(newP, pp.current);
+							pp.current = newP;
+							bb.addPoint(pp.current.x, pp.current.y);
+							if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);
+						}
+						break;
+					case 'V':
+						while (!pp.isCommandOrEnd()) {
+							var newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar());
+							pp.addMarker(newP, pp.current);
+							pp.current = newP;
+							bb.addPoint(pp.current.x, pp.current.y);
+							if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);
+						}
+						break;
+					case 'C':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var p1 = pp.getPoint();
+							var cntrl = pp.getAsControlPoint();
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, p1);
+							bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'S':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var p1 = pp.getReflectedControlPoint();
+							var cntrl = pp.getAsControlPoint();
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, p1);
+							bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'Q':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var cntrl = pp.getAsControlPoint();
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, cntrl);
+							bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'T':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var cntrl = pp.getReflectedControlPoint();
+							pp.control = cntrl;
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, cntrl);
+							bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'A':
+						while (!pp.isCommandOrEnd()) {
+						    var curr = pp.current;
+							var rx = pp.getScalar();
+							var ry = pp.getScalar();
+							var xAxisRotation = pp.getScalar() * (Math.PI / 180.0);
+							var largeArcFlag = pp.getScalar();
+							var sweepFlag = pp.getScalar();
+							var cp = pp.getAsCurrentPoint();
+
+							// Conversion from endpoint to center parameterization
+							// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
+							// x1', y1'
+							var currp = new svg.Point(
+								Math.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0,
+								-Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0
+							);
+							// adjust radii
+							var l = Math.pow(currp.x,2)/Math.pow(rx,2)+Math.pow(currp.y,2)/Math.pow(ry,2);
+							if (l > 1) {
+								rx *= Math.sqrt(l);
+								ry *= Math.sqrt(l);
+							}
+							// cx', cy'
+							var s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt(
+								((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) /
+								(Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2))
+							);
+							if (isNaN(s)) s = 0;
+							var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);
+							// cx, cy
+							var centp = new svg.Point(
+								(curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y,
+								(curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y
+							);
+							// vector magnitude
+							var m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); }
+							// ratio between two vectors
+							var r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) }
+							// angle between two vectors
+							var a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); }
+							// initial angle
+							var a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]);
+							// angle delta
+							var u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry];
+							var v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry];
+							var ad = a(u, v);
+							if (r(u,v) <= -1) ad = Math.PI;
+							if (r(u,v) >= 1) ad = 0;
+
+							if (sweepFlag == 0 && ad > 0) ad = ad - 2 * Math.PI;
+							if (sweepFlag == 1 && ad < 0) ad = ad + 2 * Math.PI;
+
+							// for markers
+							var halfWay = new svg.Point(
+								centp.x - rx * Math.cos((a1 + ad) / 2),
+								centp.y - ry * Math.sin((a1 + ad) / 2)
+							);
+							pp.addMarkerAngle(halfWay, (a1 + ad) / 2 + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2);
+							pp.addMarkerAngle(cp, ad + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2);
+
+							bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better
+							if (ctx != null) {
+								var r = rx > ry ? rx : ry;
+								var sx = rx > ry ? 1 : rx / ry;
+								var sy = rx > ry ? ry / rx : 1;
+
+								ctx.translate(centp.x, centp.y);
+								ctx.rotate(xAxisRotation);
+								ctx.scale(sx, sy);
+								ctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag);
+								ctx.scale(1/sx, 1/sy);
+								ctx.rotate(-xAxisRotation);
+								ctx.translate(-centp.x, -centp.y);
+							}
+						}
+						break;
+					case 'Z':
+						if (ctx != null) ctx.closePath();
+						pp.current = pp.start;
+					}
+				}
+
+				return bb;
+			}
+
+			this.getMarkers = function() {
+				var points = this.PathParser.getMarkerPoints();
+				var angles = this.PathParser.getMarkerAngles();
+				
+				var markers = [];
+				for (var i=0; i<points.length; i++) {
+					markers.push([points[i], angles[i]]);
+				}
+				return markers;
+			}
+		}
+		svg.Element.path.prototype = new svg.Element.PathElementBase;
+		
+		// pattern element
+		svg.Element.pattern = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.createPattern = function(ctx, element) {
+				// render me using a temporary svg element
+				var tempSvg = new svg.Element.svg();
+				tempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);
+				tempSvg.attributes['x'] = new svg.Property('x', this.attribute('x').value);
+				tempSvg.attributes['y'] = new svg.Property('y', this.attribute('y').value);
+				tempSvg.attributes['width'] = new svg.Property('width', this.attribute('width').value);
+				tempSvg.attributes['height'] = new svg.Property('height', this.attribute('height').value);
+				tempSvg.children = this.children;
+				
+				var c = document.createElement('canvas');
+				c.width = this.attribute('width').Length.toPixels('x');
+				c.height = this.attribute('height').Length.toPixels('y');
+				tempSvg.render(c.getContext('2d'));		
+				return ctx.createPattern(c, 'repeat');
+			}
+		}
+		svg.Element.pattern.prototype = new svg.Element.ElementBase;
+		
+		// marker element
+		svg.Element.marker = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.baseRender = this.render;
+			this.render = function(ctx, point, angle) {
+				ctx.translate(point.x, point.y);
+				if (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(angle);
+				if (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth);
+				ctx.save();
+							
+				// render me using a temporary svg element
+				var tempSvg = new svg.Element.svg();
+				tempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);
+				tempSvg.attributes['refX'] = new svg.Property('refX', this.attribute('refX').value);
+				tempSvg.attributes['refY'] = new svg.Property('refY', this.attribute('refY').value);
+				tempSvg.attributes['width'] = new svg.Property('width', this.attribute('markerWidth').value);
+				tempSvg.attributes['height'] = new svg.Property('height', this.attribute('markerHeight').value);
+				tempSvg.attributes['fill'] = new svg.Property('fill', this.attribute('fill').valueOrDefault('black'));
+				tempSvg.attributes['stroke'] = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none'));
+				tempSvg.children = this.children;
+				tempSvg.render(ctx);
+				
+				ctx.restore();
+				if (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(1/ctx.lineWidth, 1/ctx.lineWidth);
+				if (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(-angle);
+				ctx.translate(-point.x, -point.y);
+			}
+		}
+		svg.Element.marker.prototype = new svg.Element.ElementBase;
+		
+		// definitions element
+		svg.Element.defs = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);	
+			
+			this.render = function(ctx) {
+				// NOOP
+			}
+		}
+		svg.Element.defs.prototype = new svg.Element.ElementBase;
+		
+		// base for gradients
+		svg.Element.GradientBase = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.gradientUnits = this.attribute('gradientUnits').valueOrDefault('objectBoundingBox');
+			
+			this.stops = [];			
+			for (var i=0; i<this.children.length; i++) {
+				var child = this.children[i];
+				this.stops.push(child);
+			}	
+			
+			this.getGradient = function() {
+				// OVERRIDE ME!
+			}			
+
+			this.createGradient = function(ctx, element) {
+				var stopsContainer = this;
+				if (this.attribute('xlink:href').hasValue()) {
+					stopsContainer = this.attribute('xlink:href').Definition.getDefinition();
+				}
+			
+				var g = this.getGradient(ctx, element);
+				for (var i=0; i<stopsContainer.stops.length; i++) {
+					g.addColorStop(stopsContainer.stops[i].offset, stopsContainer.stops[i].color);
+				}
+				
+				if (this.attribute('gradientTransform').hasValue()) {
+					// render as transformed pattern on temporary canvas
+					var rootView = svg.ViewPort.viewPorts[0];
+					
+					var rect = new svg.Element.rect();
+					rect.attributes['x'] = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS/3.0);
+					rect.attributes['y'] = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS/3.0);
+					rect.attributes['width'] = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS);
+					rect.attributes['height'] = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS);
+					
+					var group = new svg.Element.g();
+					group.attributes['transform'] = new svg.Property('transform', this.attribute('gradientTransform').value);
+					group.children = [ rect ];
+					
+					var tempSvg = new svg.Element.svg();
+					tempSvg.attributes['x'] = new svg.Property('x', 0);
+					tempSvg.attributes['y'] = new svg.Property('y', 0);
+					tempSvg.attributes['width'] = new svg.Property('width', rootView.width);
+					tempSvg.attributes['height'] = new svg.Property('height', rootView.height);
+					tempSvg.children = [ group ];
+					
+					var c = document.createElement('canvas');
+					c.width = rootView.width;
+					c.height = rootView.height;
+					var tempCtx = c.getContext('2d');
+					tempCtx.fillStyle = g;
+					tempSvg.render(tempCtx);		
+					return tempCtx.createPattern(c, 'no-repeat');
+				}
+				
+				return g;				
+			}
+		}
+		svg.Element.GradientBase.prototype = new svg.Element.ElementBase;
+		
+		// linear gradient element
+		svg.Element.linearGradient = function(node) {
+			this.base = svg.Element.GradientBase;
+			this.base(node);
+			
+			this.getGradient = function(ctx, element) {
+				var bb = element.getBoundingBox();
+				
+				var x1 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('x1').numValue() 
+					: this.attribute('x1').Length.toPixels('x'));
+				var y1 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('y1').numValue()
+					: this.attribute('y1').Length.toPixels('y'));
+				var x2 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('x2').numValue()
+					: this.attribute('x2').Length.toPixels('x'));
+				var y2 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('y2').numValue()
+					: this.attribute('y2').Length.toPixels('y'));
+
+				return ctx.createLinearGradient(x1, y1, x2, y2);
+			}
+		}
+		svg.Element.linearGradient.prototype = new svg.Element.GradientBase;
+		
+		// radial gradient element
+		svg.Element.radialGradient = function(node) {
+			this.base = svg.Element.GradientBase;
+			this.base(node);
+			
+			this.getGradient = function(ctx, element) {
+				var bb = element.getBoundingBox();
+				
+				var cx = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('cx').numValue() 
+					: this.attribute('cx').Length.toPixels('x'));
+				var cy = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('cy').numValue() 
+					: this.attribute('cy').Length.toPixels('y'));
+				
+				var fx = cx;
+				var fy = cy;
+				if (this.attribute('fx').hasValue()) {
+					fx = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('fx').numValue() 
+					: this.attribute('fx').Length.toPixels('x'));
+				}
+				if (this.attribute('fy').hasValue()) {
+					fy = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('fy').numValue() 
+					: this.attribute('fy').Length.toPixels('y'));
+				}
+				
+				var r = (this.gradientUnits == 'objectBoundingBox' 
+					? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue()
+					: this.attribute('r').Length.toPixels());
+				
+				return ctx.createRadialGradient(fx, fy, 0, cx, cy, r);
+			}
+		}
+		svg.Element.radialGradient.prototype = new svg.Element.GradientBase;
+		
+		// gradient stop element
+		svg.Element.stop = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.offset = this.attribute('offset').numValue();
+			
+			var stopColor = this.style('stop-color');
+			if (this.style('stop-opacity').hasValue()) stopColor = stopColor.Color.addOpacity(this.style('stop-opacity').value);
+			this.color = stopColor.value;
+		}
+		svg.Element.stop.prototype = new svg.Element.ElementBase;
+		
+		// animation base element
+		svg.Element.AnimateBase = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			svg.Animations.push(this);
+			
+			this.duration = 0.0;
+			this.begin = this.attribute('begin').Time.toMilliseconds();
+			this.maxDuration = this.begin + this.attribute('dur').Time.toMilliseconds();
+			
+			this.getProperty = function() {
+				var attributeType = this.attribute('attributeType').value;
+				var attributeName = this.attribute('attributeName').value;
+				
+				if (attributeType == 'CSS') {
+					return this.parent.style(attributeName, true);
+				}
+				return this.parent.attribute(attributeName, true);			
+			};
+			
+			this.initialValue = null;
+			this.removed = false;			
+
+			this.calcValue = function() {
+				// OVERRIDE ME!
+				return '';
+			}
+			
+			this.update = function(delta) {	
+				// set initial value
+				if (this.initialValue == null) {
+					this.initialValue = this.getProperty().value;
+				}
+			
+				// if we're past the end time
+				if (this.duration > this.maxDuration) {
+					// loop for indefinitely repeating animations
+					if (this.attribute('repeatCount').value == 'indefinite') {
+						this.duration = 0.0
+					}
+					else if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) {
+						this.removed = true;
+						this.getProperty().value = this.initialValue;
+						return true;
+					}
+					else {
+						return false; // no updates made
+					}
+				}			
+				this.duration = this.duration + delta;
+			
+				// if we're past the begin time
+				var updated = false;
+				if (this.begin < this.duration) {
+					var newValue = this.calcValue(); // tween
+					
+					if (this.attribute('type').hasValue()) {
+						// for transform, etc.
+						var type = this.attribute('type').value;
+						newValue = type + '(' + newValue + ')';
+					}
+					
+					this.getProperty().value = newValue;
+					updated = true;
+				}
+				
+				return updated;
+			}
+			
+			// fraction of duration we've covered
+			this.progress = function() {
+				return ((this.duration - this.begin) / (this.maxDuration - this.begin));
+			}			
+		}
+		svg.Element.AnimateBase.prototype = new svg.Element.ElementBase;
+		
+		// animate element
+		svg.Element.animate = function(node) {
+			this.base = svg.Element.AnimateBase;
+			this.base(node);
+			
+			this.calcValue = function() {
+				var from = this.attribute('from').numValue();
+				var to = this.attribute('to').numValue();
+				
+				// tween value linearly
+				return from + (to - from) * this.progress(); 
+			};
+		}
+		svg.Element.animate.prototype = new svg.Element.AnimateBase;
+			
+		// animate color element
+		svg.Element.animateColor = function(node) {
+			this.base = svg.Element.AnimateBase;
+			this.base(node);
+
+			this.calcValue = function() {
+				var from = new RGBColor(this.attribute('from').value);
+				var to = new RGBColor(this.attribute('to').value);
+				
+				if (from.ok && to.ok) {
+					// tween color linearly
+					var r = from.r + (to.r - from.r) * this.progress();
+					var g = from.g + (to.g - from.g) * this.progress();
+					var b = from.b + (to.b - from.b) * this.progress();
+					return 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')';
+				}
+				return this.attribute('from').value;
+			};
+		}
+		svg.Element.animateColor.prototype = new svg.Element.AnimateBase;
+		
+		// animate transform element
+		svg.Element.animateTransform = function(node) {
+			this.base = svg.Element.animate;
+			this.base(node);
+		}
+		svg.Element.animateTransform.prototype = new svg.Element.animate;
+		
+		// font element
+		svg.Element.font = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+
+			this.horizAdvX = this.attribute('horiz-adv-x').numValue();			
+			
+			this.isRTL = false;
+			this.isArabic = false;
+			this.fontFace = null;
+			this.missingGlyph = null;
+			this.glyphs = [];			
+			for (var i=0; i<this.children.length; i++) {
+				var child = this.children[i];
+				if (child.type == 'font-face') {
+					this.fontFace = child;
+					if (child.style('font-family').hasValue()) {
+						svg.Definitions[child.style('font-family').value] = this;
+					}
+				}
+				else if (child.type == 'missing-glyph') this.missingGlyph = child;
+				else if (child.type == 'glyph') {
+					if (child.arabicForm != '') {
+						this.isRTL = true;
+						this.isArabic = true;
+						if (typeof(this.glyphs[child.unicode]) == 'undefined') this.glyphs[child.unicode] = [];
+						this.glyphs[child.unicode][child.arabicForm] = child;
+					}
+					else {
+						this.glyphs[child.unicode] = child;
+					}
+				}
+			}	
+		}
+		svg.Element.font.prototype = new svg.Element.ElementBase;
+		
+		// font-face element
+		svg.Element.fontface = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);	
+			
+			this.ascent = this.attribute('ascent').value;
+			this.descent = this.attribute('descent').value;
+			this.unitsPerEm = this.attribute('units-per-em').numValue();				
+		}
+		svg.Element.fontface.prototype = new svg.Element.ElementBase;
+		
+		// missing-glyph element
+		svg.Element.missingglyph = function(node) {
+			this.base = svg.Element.path;
+			this.base(node);	
+			
+			this.horizAdvX = 0;
+		}
+		svg.Element.missingglyph.prototype = new svg.Element.path;
+		
+		// glyph element
+		svg.Element.glyph = function(node) {
+			this.base = svg.Element.path;
+			this.base(node);	
+			
+			this.horizAdvX = this.attribute('horiz-adv-x').numValue();
+			this.unicode = this.attribute('unicode').value;
+			this.arabicForm = this.attribute('arabic-form').value;
+		}
+		svg.Element.glyph.prototype = new svg.Element.path;
+		
+		// text element
+		svg.Element.text = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			if (node != null) {
+				// add children
+				this.children = [];
+				for (var i=0; i<node.childNodes.length; i++) {
+					var childNode = node.childNodes[i];
+					if (childNode.nodeType == 1) { // capture tspan and tref nodes
+						this.addChild(childNode, true);
+					}
+					else if (childNode.nodeType == 3) { // capture text
+						this.addChild(new svg.Element.tspan(childNode), false);
+					}
+				}
+			}
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {
+				this.baseSetContext(ctx);
+				if (this.style('dominant-baseline').hasValue()) ctx.textBaseline = this.style('dominant-baseline').value;
+				if (this.style('alignment-baseline').hasValue()) ctx.textBaseline = this.style('alignment-baseline').value;
+			}
+			
+			this.renderChildren = function(ctx) {
+				var textAnchor = this.style('text-anchor').valueOrDefault('start');
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				for (var i=0; i<this.children.length; i++) {
+					var child = this.children[i];
+				
+					if (child.attribute('x').hasValue()) {
+						child.x = child.attribute('x').Length.toPixels('x');
+					}
+					else {
+						if (child.attribute('dx').hasValue()) x += child.attribute('dx').Length.toPixels('x');
+						child.x = x;
+					}
+					
+					var childLength = child.measureText(ctx);
+					if (textAnchor != 'start' && (i==0 || child.attribute('x').hasValue())) { // new group?
+						// loop through rest of children
+						var groupLength = childLength;
+						for (var j=i+1; j<this.children.length; j++) {
+							var childInGroup = this.children[j];
+							if (childInGroup.attribute('x').hasValue()) break; // new group
+							groupLength += childInGroup.measureText(ctx);
+						}
+						child.x -= (textAnchor == 'end' ? groupLength : groupLength / 2.0);
+					}
+					x = child.x + childLength;
+					
+					if (child.attribute('y').hasValue()) {
+						child.y = child.attribute('y').Length.toPixels('y');
+					}
+					else {
+						if (child.attribute('dy').hasValue()) y += child.attribute('dy').Length.toPixels('y');
+						child.y = y;
+					}	
+					y = child.y;
+					
+					child.render(ctx);
+				}
+			}
+		}
+		svg.Element.text.prototype = new svg.Element.RenderedElementBase;
+		
+		// text base
+		svg.Element.TextElementBase = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.getGlyph = function(font, text, i) {
+				var c = text[i];
+				var glyph = null;
+				if (font.isArabic) {
+					var arabicForm = 'isolated';
+					if ((i==0 || text[i-1]==' ') && i<text.length-2 && text[i+1]!=' ') arabicForm = 'terminal'; 
+					if (i>0 && text[i-1]!=' ' && i<text.length-2 && text[i+1]!=' ') arabicForm = 'medial';
+					if (i>0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial';
+					if (typeof(font.glyphs[c]) != 'undefined') {
+						glyph = font.glyphs[c][arabicForm];
+						if (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c];
+					}
+				}
+				else {
+					glyph = font.glyphs[c];
+				}
+				if (glyph == null) glyph = font.missingGlyph;
+				return glyph;
+			}
+			
+			this.renderChildren = function(ctx) {
+				var customFont = this.parent.style('font-family').Definition.getDefinition();
+				if (customFont != null) {
+					var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);
+					var fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle);
+					var text = this.getText();
+					if (customFont.isRTL) text = text.split("").reverse().join("");
+					
+					var dx = svg.ToNumberArray(this.parent.attribute('dx').value);
+					for (var i=0; i<text.length; i++) {
+						var glyph = this.getGlyph(customFont, text, i);
+						var scale = fontSize / customFont.fontFace.unitsPerEm;
+						ctx.translate(this.x, this.y);
+						ctx.scale(scale, -scale);
+						var lw = ctx.lineWidth;
+						ctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize;
+						if (fontStyle == 'italic') ctx.transform(1, 0, .4, 1, 0, 0);
+						glyph.render(ctx);
+						if (fontStyle == 'italic') ctx.transform(1, 0, -.4, 1, 0, 0);
+						ctx.lineWidth = lw;
+						ctx.scale(1/scale, -1/scale);
+						ctx.translate(-this.x, -this.y);	
+						
+						this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm;
+						if (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {
+							this.x += dx[i];
+						}
+					}
+					return;
+				}
+			
+				if (ctx.strokeStyle != '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);
+				if (ctx.fillStyle != '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);
+			}
+			
+			this.getText = function() {
+				// OVERRIDE ME
+			}
+			
+			this.measureText = function(ctx) {
+				var customFont = this.parent.style('font-family').Definition.getDefinition();
+				if (customFont != null) {
+					var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);
+					var measure = 0;
+					var text = this.getText();
+					if (customFont.isRTL) text = text.split("").reverse().join("");
+					var dx = svg.ToNumberArray(this.parent.attribute('dx').value);
+					for (var i=0; i<text.length; i++) {
+						var glyph = this.getGlyph(customFont, text, i);
+						measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;
+						if (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {
+							measure += dx[i];
+						}
+					}
+					return measure;
+				}
+			
+				var textToMeasure = svg.compressSpaces(this.getText());
+				if (!ctx.measureText) return textToMeasure.length * 10;
+				
+				ctx.save();
+				this.setContext(ctx);
+				var width = ctx.measureText(textToMeasure).width;
+				ctx.restore();
+				return width;
+			}
+		}
+		svg.Element.TextElementBase.prototype = new svg.Element.RenderedElementBase;
+		
+		// tspan 
+		svg.Element.tspan = function(node) {
+			this.base = svg.Element.TextElementBase;
+			this.base(node);
+			
+			this.text = node.nodeType == 3 ? node.nodeValue : // text
+						node.childNodes.length > 0 ? node.childNodes[0].nodeValue : // element
+						node.text;
+			this.getText = function() {
+				return this.text;
+			}
+		}
+		svg.Element.tspan.prototype = new svg.Element.TextElementBase;
+		
+		// tref
+		svg.Element.tref = function(node) {
+			this.base = svg.Element.TextElementBase;
+			this.base(node);
+			
+			this.getText = function() {
+				var element = this.attribute('xlink:href').Definition.getDefinition();
+				if (element != null) return element.children[0].getText();
+			}
+		}
+		svg.Element.tref.prototype = new svg.Element.TextElementBase;		
+		
+		// a element
+		svg.Element.a = function(node) {
+			this.base = svg.Element.TextElementBase;
+			this.base(node);
+			
+			this.hasText = true;
+			for (var i=0; i<node.childNodes.length; i++) {
+				if (node.childNodes[i].nodeType != 3) this.hasText = false;
+			}
+			
+			// this might contain text
+			this.text = this.hasText ? node.childNodes[0].nodeValue : '';
+			this.getText = function() {
+				return this.text;
+			}		
+
+			this.baseRenderChildren = this.renderChildren;
+			this.renderChildren = function(ctx) {
+				if (this.hasText) {
+					// render as text element
+					this.baseRenderChildren(ctx);
+					var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);
+					svg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.Length.toPixels('y'), this.x + this.measureText(ctx), this.y));					
+				}
+				else {
+					// render as temporary group
+					var g = new svg.Element.g();
+					g.children = this.children;
+					g.parent = this;
+					g.render(ctx);
+				}
+			}
+			
+			this.onclick = function() {
+				window.open(this.attribute('xlink:href').value);
+			}
+			
+			this.onmousemove = function() {
+				svg.ctx.canvas.style.cursor = 'pointer';
+			}
+		}
+		svg.Element.a.prototype = new svg.Element.TextElementBase;		
+		
+		// image element
+		svg.Element.image = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			svg.Images.push(this);
+			this.img = document.createElement('img');
+			this.loaded = false;
+			var that = this;
+			this.img.onload = function() { that.loaded = true; }
+			this.img.src = this.attribute('xlink:href').value;
+			
+			this.renderChildren = function(ctx) {
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');			
+				if (width == 0 || height == 0) return;
+			
+				ctx.save();
+				ctx.translate(x, y);
+				svg.AspectRatio(ctx,
+								this.attribute('preserveAspectRatio').value,
+								width,
+								this.img.width,
+								height,
+								this.img.height,
+								0,
+								0);	
+				ctx.drawImage(this.img, 0, 0);			
+				ctx.restore();
+			}
+		}
+		svg.Element.image.prototype = new svg.Element.RenderedElementBase;
+		
+		// group element
+		svg.Element.g = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.getBoundingBox = function() {
+				var bb = new svg.BoundingBox();
+				for (var i=0; i<this.children.length; i++) {
+					bb.addBoundingBox(this.children[i].getBoundingBox());
+				}
+				return bb;
+			};
+		}
+		svg.Element.g.prototype = new svg.Element.RenderedElementBase;
+
+		// symbol element
+		svg.Element.symbol = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {		
+				this.baseSetContext(ctx);
+				
+				// viewbox
+				if (this.attribute('viewBox').hasValue()) {				
+					var viewBox = svg.ToNumberArray(this.attribute('viewBox').value);
+					var minX = viewBox[0];
+					var minY = viewBox[1];
+					width = viewBox[2];
+					height = viewBox[3];
+					
+					svg.AspectRatio(ctx,
+									this.attribute('preserveAspectRatio').value, 
+									this.attribute('width').Length.toPixels('x'),
+									width,
+									this.attribute('height').Length.toPixels('y'),
+									height,
+									minX,
+									minY);
+
+					svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);						
+				}
+			}			
+		}
+		svg.Element.symbol.prototype = new svg.Element.RenderedElementBase;		
+			
+		// style element
+		svg.Element.style = function(node) { 
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			// text, or spaces then CDATA
+			var css = node.childNodes[0].nodeValue + (node.childNodes.length > 1 ? node.childNodes[1].nodeValue : '');
+			css = css.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm, ''); // remove comments
+			css = svg.compressSpaces(css); // replace whitespace
+			var cssDefs = css.split('}');
+			for (var i=0; i<cssDefs.length; i++) {
+				if (svg.trim(cssDefs[i]) != '') {
+					var cssDef = cssDefs[i].split('{');
+					var cssClasses = cssDef[0].split(',');
+					var cssProps = cssDef[1].split(';');
+					for (var j=0; j<cssClasses.length; j++) {
+						var cssClass = svg.trim(cssClasses[j]);
+						if (cssClass != '') {
+							var props = {};
+							for (var k=0; k<cssProps.length; k++) {
+								var prop = cssProps[k].indexOf(':');
+								var name = cssProps[k].substr(0, prop);
+								var value = cssProps[k].substr(prop + 1, cssProps[k].length - prop);
+								if (name != null && value != null) {
+									props[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value));
+								}
+							}
+							svg.Styles[cssClass] = props;
+							if (cssClass == '@font-face') {
+								var fontFamily = props['font-family'].value.replace(/"/g,'');
+								var srcs = props['src'].value.split(',');
+								for (var s=0; s<srcs.length; s++) {
+									if (srcs[s].indexOf('format("svg")') > 0) {
+										var urlStart = srcs[s].indexOf('url');
+										var urlEnd = srcs[s].indexOf(')', urlStart);
+										var url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6);
+										var doc = svg.parseXml(svg.ajax(url));
+										var fonts = doc.getElementsByTagName('font');
+										for (var f=0; f<fonts.length; f++) {
+											var font = svg.CreateElement(fonts[f]);
+											svg.Definitions[fontFamily] = font;
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		svg.Element.style.prototype = new svg.Element.ElementBase;
+		
+		// use element 
+		svg.Element.use = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {
+				this.baseSetContext(ctx);
+				if (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').Length.toPixels('x'), 0);
+				if (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').Length.toPixels('y'));
+			}
+			
+			this.getDefinition = function() {
+				var element = this.attribute('xlink:href').Definition.getDefinition();
+				if (this.attribute('width').hasValue()) element.attribute('width', true).value = this.attribute('width').value;
+				if (this.attribute('height').hasValue()) element.attribute('height', true).value = this.attribute('height').value;
+				return element;
+			}
+			
+			this.path = function(ctx) {
+				var element = this.getDefinition();
+				if (element != null) element.path(ctx);
+			}
+			
+			this.renderChildren = function(ctx) {
+				var element = this.getDefinition();
+				if (element != null) element.render(ctx);
+			}
+		}
+		svg.Element.use.prototype = new svg.Element.RenderedElementBase;
+		
+		// mask element
+		svg.Element.mask = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+						
+			this.apply = function(ctx, element) {
+				// render as temp svg	
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');
+				
+				// temporarily remove mask to avoid recursion
+				var mask = element.attribute('mask').value;
+				element.attribute('mask').value = '';
+				
+					var cMask = document.createElement('canvas');
+					cMask.width = x + width;
+					cMask.height = y + height;
+					var maskCtx = cMask.getContext('2d');
+					this.renderChildren(maskCtx);
+				
+					var c = document.createElement('canvas');
+					c.width = x + width;
+					c.height = y + height;
+					var tempCtx = c.getContext('2d');
+					element.render(tempCtx);
+					tempCtx.globalCompositeOperation = 'destination-in';
+					tempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');
+					tempCtx.fillRect(0, 0, x + width, y + height);
+					
+					ctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');
+					ctx.fillRect(0, 0, x + width, y + height);
+					
+				// reassign mask
+				element.attribute('mask').value = mask;	
+			}
+			
+			this.render = function(ctx) {
+				// NO RENDER
+			}
+		}
+		svg.Element.mask.prototype = new svg.Element.ElementBase;
+		
+		// clip element
+		svg.Element.clipPath = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.apply = function(ctx) {
+				for (var i=0; i<this.children.length; i++) {
+					if (this.children[i].path) {
+						this.children[i].path(ctx);
+						ctx.clip();
+					}
+				}
+			}
+			
+			this.render = function(ctx) {
+				// NO RENDER
+			}
+		}
+		svg.Element.clipPath.prototype = new svg.Element.ElementBase;
+
+		// filters
+		svg.Element.filter = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+						
+			this.apply = function(ctx, element) {
+				// render as temp svg	
+				var bb = element.getBoundingBox();
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				if (x == 0 || y == 0) {
+					x = bb.x1;
+					y = bb.y1;
+				}
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');
+				if (width == 0 || height == 0) {
+					width = bb.width();
+					height = bb.height();
+				}
+				
+				// temporarily remove filter to avoid recursion
+				var filter = element.style('filter').value;
+				element.style('filter').value = '';
+				
+				// max filter distance
+				var extraPercent = .20;
+				var px = extraPercent * width;
+				var py = extraPercent * height;
+				
+				var c = document.createElement('canvas');
+				c.width = width + 2*px;
+				c.height = height + 2*py;
+				var tempCtx = c.getContext('2d');
+				tempCtx.translate(-x + px, -y + py);
+				element.render(tempCtx);
+			
+				// apply filters
+				for (var i=0; i<this.children.length; i++) {
+					this.children[i].apply(tempCtx, 0, 0, width + 2*px, height + 2*py);
+				}
+				
+				// render on me
+				ctx.drawImage(c, 0, 0, width + 2*px, height + 2*py, x - px, y - py, width + 2*px, height + 2*py);
+				
+				// reassign filter
+				element.style('filter', true).value = filter;	
+			}
+			
+			this.render = function(ctx) {
+				// NO RENDER
+			}		
+		}
+		svg.Element.filter.prototype = new svg.Element.ElementBase;
+		
+		svg.Element.feGaussianBlur = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);	
+			
+			function make_fgauss(sigma) {
+				sigma = Math.max(sigma, 0.01);			      
+				var len = Math.ceil(sigma * 4.0) + 1;                     
+				mask = [];                               
+				for (var i = 0; i < len; i++) {                             
+					mask[i] = Math.exp(-0.5 * (i / sigma) * (i / sigma));                                           
+				}                                                           
+				return mask; 
+			}
+			
+			function normalize(mask) {
+				var sum = 0;
+				for (var i = 1; i < mask.length; i++) {
+					sum += Math.abs(mask[i]);
+				}
+				sum = 2 * sum + Math.abs(mask[0]);
+				for (var i = 0; i < mask.length; i++) {
+					mask[i] /= sum;
+				}
+				return mask;
+			}
+			
+			function convolve_even(src, dst, mask, width, height) {
+			  for (var y = 0; y < height; y++) {
+				for (var x = 0; x < width; x++) {
+				  var a = imGet(src, x, y, width, height, 3)/255;
+				  for (var rgba = 0; rgba < 4; rgba++) {					  
+					  var sum = mask[0] * (a==0?255:imGet(src, x, y, width, height, rgba)) * (a==0||rgba==3?1:a);
+					  for (var i = 1; i < mask.length; i++) {
+						var a1 = imGet(src, Math.max(x-i,0), y, width, height, 3)/255;
+					    var a2 = imGet(src, Math.min(x+i, width-1), y, width, height, 3)/255;
+						sum += mask[i] * 
+						  ((a1==0?255:imGet(src, Math.max(x-i,0), y, width, height, rgba)) * (a1==0||rgba==3?1:a1) + 
+						   (a2==0?255:imGet(src, Math.min(x+i, width-1), y, width, height, rgba)) * (a2==0||rgba==3?1:a2));
+					  }
+					  imSet(dst, y, x, height, width, rgba, sum);
+				  }			  
+				}
+			  }
+			}		
+
+			function imGet(img, x, y, width, height, rgba) {
+				return img[y*width*4 + x*4 + rgba];
+			}
+			
+			function imSet(img, x, y, width, height, rgba, val) {
+				img[y*width*4 + x*4 + rgba] = val;
+			}
+						
+			function blur(ctx, width, height, sigma)
+			{
+				var srcData = ctx.getImageData(0, 0, width, height);
+				var mask = make_fgauss(sigma);
+				mask = normalize(mask);
+				tmp = [];
+				convolve_even(srcData.data, tmp, mask, width, height);
+				convolve_even(tmp, srcData.data, mask, height, width);
+				ctx.clearRect(0, 0, width, height);
+				ctx.putImageData(srcData, 0, 0);
+			}			
+		
+			this.apply = function(ctx, x, y, width, height) {
+				// assuming x==0 && y==0 for now
+				blur(ctx, width, height, this.attribute('stdDeviation').numValue());
+			}
+		}
+		svg.Element.filter.prototype = new svg.Element.feGaussianBlur;
+		
+		// title element, do nothing
+		svg.Element.title = function(node) {
+		}
+		svg.Element.title.prototype = new svg.Element.ElementBase;
+
+		// desc element, do nothing
+		svg.Element.desc = function(node) {
+		}
+		svg.Element.desc.prototype = new svg.Element.ElementBase;		
+		
+		svg.Element.MISSING = function(node) {
+			console.log('ERROR: Element \'' + node.nodeName + '\' not yet implemented.');
+		}
+		svg.Element.MISSING.prototype = new svg.Element.ElementBase;
+		
+		// element factory
+		svg.CreateElement = function(node) {	
+			var className = node.nodeName.replace(/^[^:]+:/,''); // remove namespace
+			className = className.replace(/\-/g,''); // remove dashes
+			var e = null;
+			if (typeof(svg.Element[className]) != 'undefined') {
+				e = new svg.Element[className](node);
+			}
+			else {
+				e = new svg.Element.MISSING(node);
+			}
+
+			e.type = node.nodeName;
+			return e;
+		}
+				
+		// load from url
+		svg.load = function(ctx, url) {
+			svg.loadXml(ctx, svg.ajax(url));
+		}
+		
+		// load from xml
+		svg.loadXml = function(ctx, xml) {
+			svg.loadXmlDoc(ctx, svg.parseXml(xml));
+		}
+		
+		svg.loadXmlDoc = function(ctx, dom) {
+			svg.init(ctx);
+			
+			var mapXY = function(p) {
+				var e = ctx.canvas;
+				while (e) {
+					p.x -= e.offsetLeft;
+					p.y -= e.offsetTop;
+					e = e.offsetParent;
+				}
+				if (window.scrollX) p.x += window.scrollX;
+				if (window.scrollY) p.y += window.scrollY;
+				return p;
+			}
+			
+			// bind mouse
+			if (svg.opts['ignoreMouse'] != true) {
+				ctx.canvas.onclick = function(e) {
+					var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));
+					svg.Mouse.onclick(p.x, p.y);
+				};
+				ctx.canvas.onmousemove = function(e) {
+					var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));
+					svg.Mouse.onmousemove(p.x, p.y);
+				};
+			}
+		
+			var e = svg.CreateElement(dom.documentElement);
+			e.root = true;
+					
+			// render loop
+			var isFirstRender = true;
+			var draw = function() {
+				svg.ViewPort.Clear();
+				if (ctx.canvas.parentNode) svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight);
+			
+				if (svg.opts['ignoreDimensions'] != true) {
+					// set canvas size
+					if (e.style('width').hasValue()) {
+						ctx.canvas.width = e.style('width').Length.toPixels('x');
+						ctx.canvas.style.width = ctx.canvas.width + 'px';
+					}
+					if (e.style('height').hasValue()) {
+						ctx.canvas.height = e.style('height').Length.toPixels('y');
+						ctx.canvas.style.height = ctx.canvas.height + 'px';
+					}
+				}
+				var cWidth = ctx.canvas.clientWidth || ctx.canvas.width;
+				var cHeight = ctx.canvas.clientHeight || ctx.canvas.height;
+				svg.ViewPort.SetCurrent(cWidth, cHeight);		
+				
+				if (svg.opts != null && svg.opts['offsetX'] != null) e.attribute('x', true).value = svg.opts['offsetX'];
+				if (svg.opts != null && svg.opts['offsetY'] != null) e.attribute('y', true).value = svg.opts['offsetY'];
+				if (svg.opts != null && svg.opts['scaleWidth'] != null && svg.opts['scaleHeight'] != null) {
+					var xRatio = 1, yRatio = 1;
+					if (e.attribute('width').hasValue()) xRatio = e.attribute('width').Length.toPixels('x') / svg.opts['scaleWidth'];
+					if (e.attribute('height').hasValue()) yRatio = e.attribute('height').Length.toPixels('y') / svg.opts['scaleHeight'];
+				
+					e.attribute('width', true).value = svg.opts['scaleWidth'];
+					e.attribute('height', true).value = svg.opts['scaleHeight'];			
+					e.attribute('viewBox', true).value = '0 0 ' + (cWidth * xRatio) + ' ' + (cHeight * yRatio);
+					e.attribute('preserveAspectRatio', true).value = 'none';
+				}
+			
+				// clear and render
+				if (svg.opts['ignoreClear'] != true) {
+					ctx.clearRect(0, 0, cWidth, cHeight);
+				}
+				e.render(ctx);
+				if (isFirstRender) {
+					isFirstRender = false;
+					if (svg.opts != null && typeof(svg.opts['renderCallback']) == 'function') svg.opts['renderCallback']();
+				}			
+			}
+			
+			var waitingForImages = true;
+			if (svg.ImagesLoaded()) {
+				waitingForImages = false;
+				draw();
+			}
+			svg.intervalID = setInterval(function() { 
+				var needUpdate = false;
+				
+				if (waitingForImages && svg.ImagesLoaded()) {
+					waitingForImages = false;
+					needUpdate = true;
+				}
+			
+				// need update from mouse events?
+				if (svg.opts['ignoreMouse'] != true) {
+					needUpdate = needUpdate | svg.Mouse.hasEvents();
+				}
+			
+				// need update from animations?
+				if (svg.opts['ignoreAnimation'] != true) {
+					for (var i=0; i<svg.Animations.length; i++) {
+						needUpdate = needUpdate | svg.Animations[i].update(1000 / svg.FRAMERATE);
+					}
+				}
+				
+				// need update from redraw?
+				if (svg.opts != null && typeof(svg.opts['forceRedraw']) == 'function') {
+					if (svg.opts['forceRedraw']() == true) needUpdate = true;
+				}
+				
+				// render if needed
+				if (needUpdate) {
+					draw();				
+					svg.Mouse.runEvents(); // run and clear our events
+				}
+			}, 1000 / svg.FRAMERATE);
+		}
+		
+		svg.stop = function() {
+			if (svg.intervalID) {
+				clearInterval(svg.intervalID);
+			}
+		}
+		
+		svg.Mouse = new (function() {
+			this.events = [];
+			this.hasEvents = function() { return this.events.length != 0; }
+		
+			this.onclick = function(x, y) {
+				this.events.push({ type: 'onclick', x: x, y: y, 
+					run: function(e) { if (e.onclick) e.onclick(); }
+				});
+			}
+			
+			this.onmousemove = function(x, y) {
+				this.events.push({ type: 'onmousemove', x: x, y: y,
+					run: function(e) { if (e.onmousemove) e.onmousemove(); }
+				});
+			}			
+			
+			this.eventElements = [];
+			
+			this.checkPath = function(element, ctx) {
+				for (var i=0; i<this.events.length; i++) {
+					var e = this.events[i];
+					if (ctx.isPointInPath && ctx.isPointInPath(e.x, e.y)) this.eventElements[i] = element;
+				}
+			}
+			
+			this.checkBoundingBox = function(element, bb) {
+				for (var i=0; i<this.events.length; i++) {
+					var e = this.events[i];
+					if (bb.isPointInBox(e.x, e.y)) this.eventElements[i] = element;
+				}			
+			}
+			
+			this.runEvents = function() {
+				svg.ctx.canvas.style.cursor = '';
+				
+				for (var i=0; i<this.events.length; i++) {
+					var e = this.events[i];
+					var element = this.eventElements[i];
+					while (element) {
+						e.run(element);
+						element = element.parent;
+					}
+				}		
+			
+				// done running, clear
+				this.events = []; 
+				this.eventElements = [];
+			}
+		});
+		
+		return svg;
+	}
+})();
+
+if (CanvasRenderingContext2D) {
+	CanvasRenderingContext2D.prototype.drawSvg = function(s, dx, dy, dw, dh) {
+		canvg(this.canvas, s, { 
+			ignoreMouse: true, 
+			ignoreAnimation: true, 
+			ignoreDimensions: true, 
+			ignoreClear: true, 
+			offsetX: dx, 
+			offsetY: dy, 
+			scaleWidth: dw, 
+			scaleHeight: dh
+		});
+	}
+}/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ * CanVGRenderer Extension module
+ *
+ * (c) 2011-2012 Torstein Hønsi, Erik Olsson
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts */
+
+(function (Highcharts) { // encapsulate
+	var UNDEFINED,
+		DIV = 'div',
+		ABSOLUTE = 'absolute',
+		RELATIVE = 'relative',
+		HIDDEN = 'hidden',
+		VISIBLE = 'visible',
+		PX = 'px',
+		css = Highcharts.css,
+		CanVGRenderer = Highcharts.CanVGRenderer,
+		SVGRenderer = Highcharts.SVGRenderer,
+		extend = Highcharts.extend,
+		merge = Highcharts.merge,
+		addEvent = Highcharts.addEvent,
+		createElement = Highcharts.createElement,
+		discardElement = Highcharts.discardElement;
+
+	// Extend CanVG renderer on demand, inherit from SVGRenderer
+	extend(CanVGRenderer.prototype, SVGRenderer.prototype);
+
+	// Add additional functionality:
+	extend(CanVGRenderer.prototype, {
+		create: function (chart, container, chartWidth, chartHeight) {
+			this.setContainer(container, chartWidth, chartHeight);
+			this.configure(chart);
+		},
+		setContainer: function (container, chartWidth, chartHeight) {
+			var containerStyle = container.style,
+				containerParent = container.parentNode,
+				containerLeft = containerStyle.left,
+				containerTop = containerStyle.top,
+				containerOffsetWidth = container.offsetWidth,
+				containerOffsetHeight = container.offsetHeight,
+				canvas,
+				initialHiddenStyle = { visibility: HIDDEN, position: ABSOLUTE };
+
+			this.init.apply(this, [container, chartWidth, chartHeight]);
+
+			// add the canvas above it
+			canvas = createElement('canvas', {
+				width: containerOffsetWidth,
+				height: containerOffsetHeight
+			}, {
+				position: RELATIVE,
+				left: containerLeft,
+				top: containerTop
+			}, container);
+			this.canvas = canvas;
+
+			// Create the tooltip line and div, they are placed as siblings to
+			// the container (and as direct childs to the div specified in the html page)
+			this.ttLine = createElement(DIV, null, initialHiddenStyle, containerParent);
+			this.ttDiv = createElement(DIV, null, initialHiddenStyle, containerParent);
+			this.ttTimer = UNDEFINED;
+
+			// Move away the svg node to a new div inside the container's parent so we can hide it.
+			var hiddenSvg = createElement(DIV, {
+				width: containerOffsetWidth,
+				height: containerOffsetHeight
+			}, {
+				visibility: HIDDEN,
+				left: containerLeft,
+				top: containerTop
+			}, containerParent);
+			this.hiddenSvg = hiddenSvg;
+			hiddenSvg.appendChild(this.box);
+		},
+
+		/**
+		 * Configures the renderer with the chart. Attach a listener to the event tooltipRefresh.
+		 **/
+		configure: function (chart) {
+			var renderer = this,
+				options = chart.options.tooltip,
+				borderWidth = options.borderWidth,
+				tooltipDiv = renderer.ttDiv,
+				tooltipDivStyle = options.style,
+				tooltipLine = renderer.ttLine,
+				padding = parseInt(tooltipDivStyle.padding, 10);
+
+			// Add border styling from options to the style
+			tooltipDivStyle = merge(tooltipDivStyle, {
+				padding: padding + PX,
+				'background-color': options.backgroundColor,
+				'border-style': 'solid',
+				'border-width': borderWidth + PX,
+				'border-radius': options.borderRadius + PX
+			});
+
+			// Optionally add shadow
+			if (options.shadow) {
+				tooltipDivStyle = merge(tooltipDivStyle, {
+					'box-shadow': '1px 1px 3px gray', // w3c
+					'-webkit-box-shadow': '1px 1px 3px gray' // webkit
+				});
+			}
+			css(tooltipDiv, tooltipDivStyle);
+
+			// Set simple style on the line
+			css(tooltipLine, {
+				'border-left': '1px solid darkgray'
+			});
+
+			// This event is triggered when a new tooltip should be shown
+			addEvent(chart, 'tooltipRefresh', function (args) {
+				var chartContainer = chart.container,
+					offsetLeft = chartContainer.offsetLeft,
+					offsetTop = chartContainer.offsetTop,
+					position;
+
+				// Set the content of the tooltip
+				tooltipDiv.innerHTML = args.text;
+
+				// Compute the best position for the tooltip based on the divs size and container size.
+				position = chart.tooltip.getPosition(tooltipDiv.offsetWidth, tooltipDiv.offsetHeight, {plotX: args.x, plotY: args.y});
+
+				css(tooltipDiv, {
+					visibility: VISIBLE,
+					left: position.x + PX,
+					top: position.y + PX,
+					'border-color': args.borderColor
+				});
+
+				// Position the tooltip line
+				css(tooltipLine, {
+					visibility: VISIBLE,
+					left: offsetLeft + args.x + PX,
+					top: offsetTop + chart.plotTop + PX,
+					height: chart.plotHeight  + PX
+				});
+
+				// This timeout hides the tooltip after 3 seconds
+				// First clear any existing timer
+				if (renderer.ttTimer !== UNDEFINED) {
+					clearTimeout(renderer.ttTimer);
+				}
+
+				// Start a new timer that hides tooltip and line
+				renderer.ttTimer = setTimeout(function () {
+					css(tooltipDiv, { visibility: HIDDEN });
+					css(tooltipLine, { visibility: HIDDEN });
+				}, 3000);
+			});
+		},
+
+		/**
+		 * Extend SVGRenderer.destroy to also destroy the elements added by CanVGRenderer.
+		 */
+		destroy: function () {
+			var renderer = this;
+
+			// Remove the canvas
+			discardElement(renderer.canvas);
+
+			// Kill the timer
+			if (renderer.ttTimer !== UNDEFINED) {
+				clearTimeout(renderer.ttTimer);
+			}
+
+			// Remove the divs for tooltip and line
+			discardElement(renderer.ttLine);
+			discardElement(renderer.ttDiv);
+			discardElement(renderer.hiddenSvg);
+
+			// Continue with base class
+			return SVGRenderer.prototype.destroy.apply(renderer);
+		},
+
+		/**
+		 * Take a color and return it if it's a string, do not make it a gradient even if it is a
+		 * gradient. Currently canvg cannot render gradients (turns out black),
+		 * see: http://code.google.com/p/canvg/issues/detail?id=104
+		 *
+		 * @param {Object} color The color or config object
+		 */
+		color: function (color, elem, prop) {
+			if (color && color.linearGradient) {
+				// Pick the end color and forward to base implementation
+				color = color.stops[color.stops.length - 1][1];
+			}
+			return SVGRenderer.prototype.color.call(this, color, elem, prop);
+		},
+
+		/**
+		 * Draws the SVG on the canvas or adds a draw invokation to the deferred list.
+		 */
+		draw: function () {
+			var renderer = this;
+			window.canvg(renderer.canvas, renderer.hiddenSvg.innerHTML);
+		}
+	});
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/data.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/data.js
new file mode 100644
index 0000000..e309b39
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/data.js
@@ -0,0 +1,17 @@
+/*
+ Data plugin for Highcharts
+
+ (c) 2012-2013 Torstein Hønsi
+ Last revision 2013-06-07
+
+ License: www.highcharts.com/license
+*/
+(function(h){var k=h.each,m=function(b,a){this.init(b,a)};h.extend(m.prototype,{init:function(b,a){this.options=b;this.chartOptions=a;this.columns=b.columns||this.rowsToColumns(b.rows)||[];this.columns.length?this.dataFound():(this.parseCSV(),this.parseTable(),this.parseGoogleSpreadsheet())},getColumnDistribution:function(){var b=this.chartOptions,a=b&&b.chart&&b.chart.type,c=[];k(b&&b.series||[],function(b){c.push((h.seriesTypes[b.type||a||"line"].prototype.pointArrayMap||[0]).length)});this.valueCount=
+{global:(h.seriesTypes[a||"line"].prototype.pointArrayMap||[0]).length,individual:c}},dataFound:function(){this.parseTypes();this.findHeaderRow();this.parsed();this.complete()},parseCSV:function(){var b=this,a=this.options,c=a.csv,d=this.columns,f=a.startRow||0,i=a.endRow||Number.MAX_VALUE,j=a.startColumn||0,e=a.endColumn||Number.MAX_VALUE,g=0;c&&(c=c.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split(a.lineDelimiter||"\n"),k(c,function(c,h){var n=b.trim(c),p=n.indexOf("#")===0;h>=f&&h<=i&&!p&&n!==""&&
+(n=c.split(a.itemDelimiter||","),k(n,function(b,a){a>=j&&a<=e&&(d[a-j]||(d[a-j]=[]),d[a-j][g]=b)}),g+=1)}),this.dataFound())},parseTable:function(){var b=this.options,a=b.table,c=this.columns,d=b.startRow||0,f=b.endRow||Number.MAX_VALUE,i=b.startColumn||0,j=b.endColumn||Number.MAX_VALUE,e;a&&(typeof a==="string"&&(a=document.getElementById(a)),k(a.getElementsByTagName("tr"),function(a,b){e=0;b>=d&&b<=f&&k(a.childNodes,function(a){if((a.tagName==="TD"||a.tagName==="TH")&&e>=i&&e<=j)c[e]||(c[e]=[]),
+c[e][b-d]=a.innerHTML,e+=1})}),this.dataFound())},parseGoogleSpreadsheet:function(){var b=this,a=this.options,c=a.googleSpreadsheetKey,d=this.columns,f=a.startRow||0,i=a.endRow||Number.MAX_VALUE,j=a.startColumn||0,e=a.endColumn||Number.MAX_VALUE,g,h;c&&jQuery.getJSON("https://spreadsheets.google.com/feeds/cells/"+c+"/"+(a.googleSpreadsheetWorksheet||"od6")+"/public/values?alt=json-in-script&callback=?",function(a){var a=a.feed.entry,c,k=a.length,m=0,o=0,l;for(l=0;l<k;l++)c=a[l],m=Math.max(m,c.gs$cell.col),
+o=Math.max(o,c.gs$cell.row);for(l=0;l<m;l++)if(l>=j&&l<=e)d[l-j]=[],d[l-j].length=Math.min(o,i-f);for(l=0;l<k;l++)if(c=a[l],g=c.gs$cell.row-1,h=c.gs$cell.col-1,h>=j&&h<=e&&g>=f&&g<=i)d[h-j][g-f]=c.content.$t;b.dataFound()})},findHeaderRow:function(){k(this.columns,function(){});this.headerRow=0},trim:function(b){return typeof b==="string"?b.replace(/^\s+|\s+$/g,""):b},parseTypes:function(){for(var b=this.columns,a=b.length,c,d,f,i;a--;)for(c=b[a].length;c--;)d=b[a][c],f=parseFloat(d),i=this.trim(d),
+i==f?(b[a][c]=f,f>31536E6?b[a].isDatetime=!0:b[a].isNumeric=!0):(d=this.parseDate(d),a===0&&typeof d==="number"&&!isNaN(d)?(b[a][c]=d,b[a].isDatetime=!0):b[a][c]=i===""?null:i)},dateFormats:{"YYYY-mm-dd":{regex:"^([0-9]{4})-([0-9]{2})-([0-9]{2})$",parser:function(b){return Date.UTC(+b[1],b[2]-1,+b[3])}}},parseDate:function(b){var a=this.options.parseDate,c,d,f;a&&(c=a(b));if(typeof b==="string")for(d in this.dateFormats)a=this.dateFormats[d],(f=b.match(a.regex))&&(c=a.parser(f));return c},rowsToColumns:function(b){var a,
+c,d,f,i;if(b){i=[];c=b.length;for(a=0;a<c;a++){f=b[a].length;for(d=0;d<f;d++)i[d]||(i[d]=[]),i[d][a]=b[a][d]}}return i},parsed:function(){this.options.parsed&&this.options.parsed.call(this,this.columns)},complete:function(){var b=this.columns,a,c,d=this.options,f,i,j,e,g,k;if(d.complete){this.getColumnDistribution();b.length>1&&(a=b.shift(),this.headerRow===0&&a.shift(),a.isDatetime?c="datetime":a.isNumeric||(c="category"));for(e=0;e<b.length;e++)if(this.headerRow===0)b[e].name=b[e].shift();i=[];
+for(e=0,k=0;e<b.length;k++){f=h.pick(this.valueCount.individual[k],this.valueCount.global);j=[];for(g=0;g<b[e].length;g++)j[g]=[a[g],b[e][g]!==void 0?b[e][g]:null],f>1&&j[g].push(b[e+1][g]!==void 0?b[e+1][g]:null),f>2&&j[g].push(b[e+2][g]!==void 0?b[e+2][g]:null),f>3&&j[g].push(b[e+3][g]!==void 0?b[e+3][g]:null),f>4&&j[g].push(b[e+4][g]!==void 0?b[e+4][g]:null);i[k]={name:b[e].name,data:j};e+=f}d.complete({xAxis:{type:c},series:i})}}});h.Data=m;h.data=function(b,a){return new m(b,a)};h.wrap(h.Chart.prototype,
+"init",function(b,a,c){var d=this;a&&a.data?h.data(h.extend(a.data,{complete:function(f){a.series&&k(a.series,function(b,c){a.series[c]=h.merge(b,f.series[c])});a=h.merge(f,a);b.call(d,a,c)}}),a):b.call(d,a,c)})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/data.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/data.src.js
new file mode 100644
index 0000000..d344799
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/data.src.js
@@ -0,0 +1,582 @@
+/**
+ * @license Data plugin for Highcharts
+ *
+ * (c) 2012-2013 Torstein Hønsi
+ * Last revision 2013-06-07
+ *
+ * License: www.highcharts.com/license
+ */
+
+/*
+ * The Highcharts Data plugin is a utility to ease parsing of input sources like
+ * CSV, HTML tables or grid views into basic configuration options for use 
+ * directly in the Highcharts constructor.
+ *
+ * Demo: http://jsfiddle.net/highcharts/SnLFj/
+ *
+ * --- OPTIONS ---
+ *
+ * - columns : Array<Array<Mixed>>
+ * A two-dimensional array representing the input data on tabular form. This input can
+ * be used when the data is already parsed, for example from a grid view component.
+ * Each cell can be a string or number. If not switchRowsAndColumns is set, the columns
+ * are interpreted as series. See also the rows option.
+ *
+ * - complete : Function(chartOptions)
+ * The callback that is evaluated when the data is finished loading, optionally from an 
+ * external source, and parsed. The first argument passed is a finished chart options
+ * object, containing series and an xAxis with categories if applicable. Thise options
+ * can be extended with additional options and passed directly to the chart constructor.
+ *
+ * - csv : String
+ * A comma delimited string to be parsed. Related options are startRow, endRow, startColumn
+ * and endColumn to delimit what part of the table is used. The lineDelimiter and 
+ * itemDelimiter options define the CSV delimiter formats.
+ * 
+ * - endColumn : Integer
+ * In tabular input data, the first row (indexed by 0) to use. Defaults to the last 
+ * column containing data.
+ *
+ * - endRow : Integer
+ * In tabular input data, the last row (indexed by 0) to use. Defaults to the last row
+ * containing data.
+ *
+ * - googleSpreadsheetKey : String 
+ * A Google Spreadsheet key. See https://developers.google.com/gdata/samples/spreadsheet_sample
+ * for general information on GS.
+ *
+ * - googleSpreadsheetWorksheet : String 
+ * The Google Spreadsheet worksheet. The available id's can be read from 
+ * https://spreadsheets.google.com/feeds/worksheets/{key}/public/basic
+ *
+ * - itemDelimiter : String
+ * Item or cell delimiter for parsing CSV. Defaults to ",".
+ *
+ * - lineDelimiter : String
+ * Line delimiter for parsing CSV. Defaults to "\n".
+ *
+ * - parsed : Function
+ * A callback function to access the parsed columns, the two-dimentional input data
+ * array directly, before they are interpreted into series data and categories.
+ *
+ * - parseDate : Function
+ * A callback function to parse string representations of dates into JavaScript timestamps.
+ * Return an integer on success.
+ *
+ * - rows : Array<Array<Mixed>>
+ * The same as the columns input option, but defining rows intead of columns.
+ *
+ * - startColumn : Integer
+ * In tabular input data, the first column (indexed by 0) to use. 
+ *
+ * - startRow : Integer
+ * In tabular input data, the first row (indexed by 0) to use.
+ *
+ * - table : String|HTMLElement
+ * A HTML table or the id of such to be parsed as input data. Related options ara startRow,
+ * endRow, startColumn and endColumn to delimit what part of the table is used.
+ */
+
+// JSLint options:
+/*global jQuery */
+
+(function (Highcharts) {	
+	
+	// Utilities
+	var each = Highcharts.each;
+	
+	
+	// The Data constructor
+	var Data = function (dataOptions, chartOptions) {
+		this.init(dataOptions, chartOptions);
+	};
+	
+	// Set the prototype properties
+	Highcharts.extend(Data.prototype, {
+		
+	/**
+	 * Initialize the Data object with the given options
+	 */
+	init: function (options, chartOptions) {
+		this.options = options;
+		this.chartOptions = chartOptions;
+		this.columns = options.columns || this.rowsToColumns(options.rows) || [];
+
+		// No need to parse or interpret anything
+		if (this.columns.length) {
+			this.dataFound();
+
+		// Parse and interpret
+		} else {
+
+			// Parse a CSV string if options.csv is given
+			this.parseCSV();
+			
+			// Parse a HTML table if options.table is given
+			this.parseTable();
+
+			// Parse a Google Spreadsheet 
+			this.parseGoogleSpreadsheet();	
+		}
+
+	},
+
+	/**
+	 * Get the column distribution. For example, a line series takes a single column for 
+	 * Y values. A range series takes two columns for low and high values respectively,
+	 * and an OHLC series takes four columns.
+	 */
+	getColumnDistribution: function () {
+		var chartOptions = this.chartOptions,
+			getValueCount = function (type) {
+				return (Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap || [0]).length;
+			},
+			globalType = chartOptions && chartOptions.chart && chartOptions.chart.type,
+			individualCounts = [];
+
+		each((chartOptions && chartOptions.series) || [], function (series) {
+			individualCounts.push(getValueCount(series.type || globalType));
+		});
+
+		this.valueCount = {
+			global: getValueCount(globalType),
+			individual: individualCounts
+		};
+	},
+
+
+	dataFound: function () {
+		// Interpret the values into right types
+		this.parseTypes();
+		
+		// Use first row for series names?
+		this.findHeaderRow();
+		
+		// Handle columns if a handleColumns callback is given
+		this.parsed();
+		
+		// Complete if a complete callback is given
+		this.complete();
+		
+	},
+	
+	/**
+	 * Parse a CSV input string
+	 */
+	parseCSV: function () {
+		var self = this,
+			options = this.options,
+			csv = options.csv,
+			columns = this.columns,
+			startRow = options.startRow || 0,
+			endRow = options.endRow || Number.MAX_VALUE,
+			startColumn = options.startColumn || 0,
+			endColumn = options.endColumn || Number.MAX_VALUE,
+			lines,
+			activeRowNo = 0;
+			
+		if (csv) {
+			
+			lines = csv
+				.replace(/\r\n/g, "\n") // Unix
+				.replace(/\r/g, "\n") // Mac
+				.split(options.lineDelimiter || "\n");
+			
+			each(lines, function (line, rowNo) {
+				var trimmed = self.trim(line),
+					isComment = trimmed.indexOf('#') === 0,
+					isBlank = trimmed === '',
+					items;
+				
+				if (rowNo >= startRow && rowNo <= endRow && !isComment && !isBlank) {
+					items = line.split(options.itemDelimiter || ',');
+					each(items, function (item, colNo) {
+						if (colNo >= startColumn && colNo <= endColumn) {
+							if (!columns[colNo - startColumn]) {
+								columns[colNo - startColumn] = [];					
+							}
+							
+							columns[colNo - startColumn][activeRowNo] = item;
+						}
+					});
+					activeRowNo += 1;
+				}
+			});
+
+			this.dataFound();
+		}
+	},
+	
+	/**
+	 * Parse a HTML table
+	 */
+	parseTable: function () {
+		var options = this.options,
+			table = options.table,
+			columns = this.columns,
+			startRow = options.startRow || 0,
+			endRow = options.endRow || Number.MAX_VALUE,
+			startColumn = options.startColumn || 0,
+			endColumn = options.endColumn || Number.MAX_VALUE,
+			colNo;
+			
+		if (table) {
+			
+			if (typeof table === 'string') {
+				table = document.getElementById(table);
+			}
+			
+			each(table.getElementsByTagName('tr'), function (tr, rowNo) {
+				colNo = 0; 
+				if (rowNo >= startRow && rowNo <= endRow) {
+					each(tr.childNodes, function (item) {
+						if ((item.tagName === 'TD' || item.tagName === 'TH') && colNo >= startColumn && colNo <= endColumn) {
+							if (!columns[colNo]) {
+								columns[colNo] = [];					
+							}
+							columns[colNo][rowNo - startRow] = item.innerHTML;
+							
+							colNo += 1;
+						}
+					});
+				}
+			});
+
+			this.dataFound(); // continue
+		}
+	},
+
+	/**
+	 * TODO: 
+	 * - switchRowsAndColumns
+	 */
+	parseGoogleSpreadsheet: function () {
+		var self = this,
+			options = this.options,
+			googleSpreadsheetKey = options.googleSpreadsheetKey,
+			columns = this.columns,
+			startRow = options.startRow || 0,
+			endRow = options.endRow || Number.MAX_VALUE,
+			startColumn = options.startColumn || 0,
+			endColumn = options.endColumn || Number.MAX_VALUE,
+			gr, // google row
+			gc; // google column
+
+		if (googleSpreadsheetKey) {
+			jQuery.getJSON('https://spreadsheets.google.com/feeds/cells/' + 
+				  googleSpreadsheetKey + '/' + (options.googleSpreadsheetWorksheet || 'od6') +
+					  '/public/values?alt=json-in-script&callback=?',
+					  function (json) {
+					
+				// Prepare the data from the spreadsheat
+				var cells = json.feed.entry,
+					cell,
+					cellCount = cells.length,
+					colCount = 0,
+					rowCount = 0,
+					i;
+			
+				// First, find the total number of columns and rows that 
+				// are actually filled with data
+				for (i = 0; i < cellCount; i++) {
+					cell = cells[i];
+					colCount = Math.max(colCount, cell.gs$cell.col);
+					rowCount = Math.max(rowCount, cell.gs$cell.row);			
+				}
+			
+				// Set up arrays containing the column data
+				for (i = 0; i < colCount; i++) {
+					if (i >= startColumn && i <= endColumn) {
+						// Create new columns with the length of either end-start or rowCount
+						columns[i - startColumn] = [];
+
+						// Setting the length to avoid jslint warning
+						columns[i - startColumn].length = Math.min(rowCount, endRow - startRow);
+					}
+				}
+				
+				// Loop over the cells and assign the value to the right
+				// place in the column arrays
+				for (i = 0; i < cellCount; i++) {
+					cell = cells[i];
+					gr = cell.gs$cell.row - 1; // rows start at 1
+					gc = cell.gs$cell.col - 1; // columns start at 1
+
+					// If both row and col falls inside start and end
+					// set the transposed cell value in the newly created columns
+					if (gc >= startColumn && gc <= endColumn &&
+						gr >= startRow && gr <= endRow) {
+						columns[gc - startColumn][gr - startRow] = cell.content.$t;
+					}
+				}
+				self.dataFound();
+			});
+		}
+	},
+	
+	/**
+	 * Find the header row. For now, we just check whether the first row contains
+	 * numbers or strings. Later we could loop down and find the first row with 
+	 * numbers.
+	 */
+	findHeaderRow: function () {
+		var headerRow = 0;
+		each(this.columns, function (column) {
+			if (typeof column[0] !== 'string') {
+				headerRow = null;
+			}
+		});
+		this.headerRow = 0;			
+	},
+	
+	/**
+	 * Trim a string from whitespace
+	 */
+	trim: function (str) {
+		return typeof str === 'string' ? str.replace(/^\s+|\s+$/g, '') : str;
+	},
+	
+	/**
+	 * Parse numeric cells in to number types and date types in to true dates.
+	 * @param {Object} columns
+	 */
+	parseTypes: function () {
+		var columns = this.columns,
+			col = columns.length, 
+			row,
+			val,
+			floatVal,
+			trimVal,
+			dateVal;
+			
+		while (col--) {
+			row = columns[col].length;
+			while (row--) {
+				val = columns[col][row];
+				floatVal = parseFloat(val);
+				trimVal = this.trim(val);
+
+				/*jslint eqeq: true*/
+				if (trimVal == floatVal) { // is numeric
+				/*jslint eqeq: false*/
+					columns[col][row] = floatVal;
+					
+					// If the number is greater than milliseconds in a year, assume datetime
+					if (floatVal > 365 * 24 * 3600 * 1000) {
+						columns[col].isDatetime = true;
+					} else {
+						columns[col].isNumeric = true;
+					}					
+				
+				} else { // string, continue to determine if it is a date string or really a string
+					dateVal = this.parseDate(val);
+					
+					if (col === 0 && typeof dateVal === 'number' && !isNaN(dateVal)) { // is date
+						columns[col][row] = dateVal;
+						columns[col].isDatetime = true;
+					
+					} else { // string
+						columns[col][row] = trimVal === '' ? null : trimVal;
+					}
+				}
+				
+			}
+		}
+	},
+	//*
+	dateFormats: {
+		'YYYY-mm-dd': {
+			regex: '^([0-9]{4})-([0-9]{2})-([0-9]{2})$',
+			parser: function (match) {
+				return Date.UTC(+match[1], match[2] - 1, +match[3]);
+			}
+		}
+	},
+	// */
+	/**
+	 * Parse a date and return it as a number. Overridable through options.parseDate.
+	 */
+	parseDate: function (val) {
+		var parseDate = this.options.parseDate,
+			ret,
+			key,
+			format,
+			match;
+
+		if (parseDate) {
+			ret = parseDate(val);
+		}
+			
+		if (typeof val === 'string') {
+			for (key in this.dateFormats) {
+				format = this.dateFormats[key];
+				match = val.match(format.regex);
+				if (match) {
+					ret = format.parser(match);
+				}
+			}
+		}
+		return ret;
+	},
+	
+	/**
+	 * Reorganize rows into columns
+	 */
+	rowsToColumns: function (rows) {
+		var row,
+			rowsLength,
+			col,
+			colsLength,
+			columns;
+
+		if (rows) {
+			columns = [];
+			rowsLength = rows.length;
+			for (row = 0; row < rowsLength; row++) {
+				colsLength = rows[row].length;
+				for (col = 0; col < colsLength; col++) {
+					if (!columns[col]) {
+						columns[col] = [];
+					}
+					columns[col][row] = rows[row][col];
+				}
+			}
+		}
+		return columns;
+	},
+	
+	/**
+	 * A hook for working directly on the parsed columns
+	 */
+	parsed: function () {
+		if (this.options.parsed) {
+			this.options.parsed.call(this, this.columns);
+		}
+	},
+	
+	/**
+	 * If a complete callback function is provided in the options, interpret the 
+	 * columns into a Highcharts options object.
+	 */
+	complete: function () {
+		
+		var columns = this.columns,
+			firstCol,
+			type,
+			options = this.options,
+			valueCount,
+			series,
+			data,
+			i,
+			j,
+			seriesIndex;
+			
+		
+		if (options.complete) {
+
+			this.getColumnDistribution();
+			
+			// Use first column for X data or categories?
+			if (columns.length > 1) {
+				firstCol = columns.shift();
+				if (this.headerRow === 0) {
+					firstCol.shift(); // remove the first cell
+				}
+				
+				
+				if (firstCol.isDatetime) {
+					type = 'datetime';
+				} else if (!firstCol.isNumeric) {
+					type = 'category';
+				}
+			}
+
+			// Get the names and shift the top row
+			for (i = 0; i < columns.length; i++) {
+				if (this.headerRow === 0) {
+					columns[i].name = columns[i].shift();
+				}
+			}
+			
+			// Use the next columns for series
+			series = [];
+			for (i = 0, seriesIndex = 0; i < columns.length; seriesIndex++) {
+
+				// This series' value count
+				valueCount = Highcharts.pick(this.valueCount.individual[seriesIndex], this.valueCount.global);
+				
+				// Iterate down the cells of each column and add data to the series
+				data = [];
+				for (j = 0; j < columns[i].length; j++) {
+					data[j] = [
+						firstCol[j], 
+						columns[i][j] !== undefined ? columns[i][j] : null
+					];
+					if (valueCount > 1) {
+						data[j].push(columns[i + 1][j] !== undefined ? columns[i + 1][j] : null);
+					}
+					if (valueCount > 2) {
+						data[j].push(columns[i + 2][j] !== undefined ? columns[i + 2][j] : null);
+					}
+					if (valueCount > 3) {
+						data[j].push(columns[i + 3][j] !== undefined ? columns[i + 3][j] : null);
+					}
+					if (valueCount > 4) {
+						data[j].push(columns[i + 4][j] !== undefined ? columns[i + 4][j] : null);
+					}
+				}
+
+				// Add the series
+				series[seriesIndex] = {
+					name: columns[i].name,
+					data: data
+				};
+
+				i += valueCount;
+			}
+			
+			// Do the callback
+			options.complete({
+				xAxis: {
+					type: type
+				},
+				series: series
+			});
+		}
+	}
+	});
+	
+	// Register the Data prototype and data function on Highcharts
+	Highcharts.Data = Data;
+	Highcharts.data = function (options, chartOptions) {
+		return new Data(options, chartOptions);
+	};
+
+	// Extend Chart.init so that the Chart constructor accepts a new configuration
+	// option group, data.
+	Highcharts.wrap(Highcharts.Chart.prototype, 'init', function (proceed, userOptions, callback) {
+		var chart = this;
+
+		if (userOptions && userOptions.data) {
+			Highcharts.data(Highcharts.extend(userOptions.data, {
+				complete: function (dataOptions) {
+					
+					// Merge series configs
+					if (userOptions.series) {
+						each(userOptions.series, function (series, i) {
+							userOptions.series[i] = Highcharts.merge(series, dataOptions.series[i]);
+						});
+					}
+
+					// Do the merge
+					userOptions = Highcharts.merge(dataOptions, userOptions);
+
+					proceed.call(chart, userOptions, callback);
+				}
+			}), userOptions);
+		} else {
+			proceed.call(chart, userOptions, callback);
+		}
+	});
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/drilldown.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/drilldown.js
new file mode 100644
index 0000000..1df1acc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/drilldown.js
@@ -0,0 +1,11 @@
+(function(e){function q(b,a,c){return"rgba("+[Math.round(b[0]+(a[0]-b[0])*c),Math.round(b[1]+(a[1]-b[1])*c),Math.round(b[2]+(a[2]-b[2])*c),b[3]+(a[3]-b[3])*c].join(",")+")"}var m=function(){},j=e.getOptions(),g=e.each,n=e.extend,o=e.wrap,h=e.Chart,i=e.seriesTypes,k=i.pie,l=i.column,r=HighchartsAdapter.fireEvent;n(j.lang,{drillUpText:"◁ Back to {series.name}"});j.drilldown={activeAxisLabelStyle:{cursor:"pointer",color:"#039",fontWeight:"bold",textDecoration:"underline"},activeDataLabelStyle:{cursor:"pointer",
+color:"#039",fontWeight:"bold",textDecoration:"underline"},animation:{duration:500},drillUpButton:{position:{align:"right",x:-10,y:10}}};e.SVGRenderer.prototype.Element.prototype.fadeIn=function(){this.attr({opacity:0.1,visibility:"visible"}).animate({opacity:1},{duration:250})};h.prototype.drilldownLevels=[];h.prototype.addSeriesAsDrilldown=function(b,a){var c=b.series,d=c.xAxis,f=c.yAxis,e;e=b.color||c.color;var g,a=n({color:e},a);g=HighchartsAdapter.inArray(this,c.points);this.drilldownLevels.push({seriesOptions:c.userOptions,
+shapeArgs:b.shapeArgs,bBox:b.graphic.getBBox(),color:e,newSeries:a,pointOptions:c.options.data[g],pointIndex:g,oldExtremes:{xMin:d&&d.userMin,xMax:d&&d.userMax,yMin:f&&f.userMin,yMax:f&&f.userMax}});e=this.addSeries(a,!1);if(d)d.oldPos=d.pos,d.userMin=d.userMax=null,f.userMin=f.userMax=null;if(c.type===e.type)e.animate=e.animateDrilldown||m,e.options.animation=!0;c.remove(!1);this.redraw();this.showDrillUpButton()};h.prototype.getDrilldownBackText=function(){return this.options.lang.drillUpText.replace("{series.name}",
+this.drilldownLevels[this.drilldownLevels.length-1].seriesOptions.name)};h.prototype.showDrillUpButton=function(){var b=this,a=this.getDrilldownBackText(),c=b.options.drilldown.drillUpButton;this.drillUpButton?this.drillUpButton.attr({text:a}).align():this.drillUpButton=this.renderer.button(a,null,null,function(){b.drillUp()}).attr(n({align:c.position.align,zIndex:9},c.theme)).add().align(c.position,!1,c.relativeTo||"plotBox")};h.prototype.drillUp=function(){var b=this.drilldownLevels.pop(),a=this.series[0],
+c=b.oldExtremes,d=this.addSeries(b.seriesOptions,!1);r(this,"drillup",{seriesOptions:b.seriesOptions});if(d.type===a.type)d.drilldownLevel=b,d.animate=d.animateDrillupTo||m,d.options.animation=!0,a.animateDrillupFrom&&a.animateDrillupFrom(b);a.remove(!1);d.xAxis&&(d.xAxis.setExtremes(c.xMin,c.xMax,!1),d.yAxis.setExtremes(c.yMin,c.yMax,!1));this.redraw();this.drilldownLevels.length===0?this.drillUpButton=this.drillUpButton.destroy():this.drillUpButton.attr({text:this.getDrilldownBackText()}).align()};
+k.prototype.animateDrilldown=function(b){var a=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],c=this.chart.options.drilldown.animation,d=a.shapeArgs,f=d.start,s=(d.end-f)/this.points.length,h=e.Color(a.color).rgba;b||g(this.points,function(a,b){var g=e.Color(a.color).rgba;a.graphic.attr(e.merge(d,{start:f+b*s,end:f+(b+1)*s})).animate(a.shapeArgs,e.merge(c,{step:function(a,d){d.prop==="start"&&this.attr({fill:q(h,g,d.pos)})}}))})};k.prototype.animateDrillupTo=l.prototype.animateDrillupTo=
+function(b){if(!b){var a=this,c=a.drilldownLevel;g(this.points,function(a){a.graphic.hide();a.dataLabel&&a.dataLabel.hide();a.connector&&a.connector.hide()});setTimeout(function(){g(a.points,function(a,b){var e=b===c.pointIndex?"show":"fadeIn";a.graphic[e]();if(a.dataLabel)a.dataLabel[e]();if(a.connector)a.connector[e]()})},Math.max(this.chart.options.drilldown.animation.duration-50,0));this.animate=m}};l.prototype.animateDrilldown=function(b){var a=this.chart.drilldownLevels[this.chart.drilldownLevels.length-
+1].shapeArgs,c=this.chart.options.drilldown.animation;b||(a.x+=this.xAxis.oldPos-this.xAxis.pos,g(this.points,function(b){b.graphic.attr(a).animate(b.shapeArgs,c)}))};l.prototype.animateDrillupFrom=k.prototype.animateDrillupFrom=function(b){var a=this.chart.options.drilldown.animation,c=this.group;delete this.group;g(this.points,function(d){var f=d.graphic,g=e.Color(d.color).rgba;delete d.graphic;f.animate(b.shapeArgs,e.merge(a,{step:function(a,c){c.prop==="start"&&this.attr({fill:q(g,e.Color(b.color).rgba,
+c.pos)})},complete:function(){f.destroy();c&&(c=c.destroy())}}))})};e.Point.prototype.doDrilldown=function(){for(var b=this.series.chart,a=b.options.drilldown,c=a.series.length,d;c--&&!d;)a.series[c].id===this.drilldown&&(d=a.series[c]);r(b,"drilldown",{point:this,seriesOptions:d});d&&b.addSeriesAsDrilldown(this,d)};o(e.Point.prototype,"init",function(b,a,c,d){var f=b.call(this,a,c,d),b=a.chart,a=(a=a.xAxis&&a.xAxis.ticks[d])&&a.label;if(f.drilldown){if(e.addEvent(f,"click",function(){f.doDrilldown()}),
+a){if(!a._basicStyle)a._basicStyle=a.element.getAttribute("style");a.addClass("highcharts-drilldown-axis-label").css(b.options.drilldown.activeAxisLabelStyle).on("click",function(){f.doDrilldown&&f.doDrilldown()})}}else a&&a._basicStyle&&a.element.setAttribute("style",a._basicStyle);return f});o(e.Series.prototype,"drawDataLabels",function(b){var a=this.chart.options.drilldown.activeDataLabelStyle;b.call(this);g(this.points,function(b){if(b.drilldown&&b.dataLabel)b.dataLabel.attr({"class":"highcharts-drilldown-data-label"}).css(a).on("click",
+function(){b.doDrilldown()})})});l.prototype.supportsDrilldown=!0;k.prototype.supportsDrilldown=!0;var p,j=function(b){b.call(this);g(this.points,function(a){a.drilldown&&a.graphic&&a.graphic.attr({"class":"highcharts-drilldown-point"}).css({cursor:"pointer"})})};for(p in i)i[p].prototype.supportsDrilldown&&o(i[p].prototype,"drawTracker",j)})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/drilldown.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/drilldown.src.js
new file mode 100644
index 0000000..558aed4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/drilldown.src.js
@@ -0,0 +1,447 @@
+/**
+ * Highcharts Drilldown plugin
+ * 
+ * Author: Torstein Honsi
+ * Last revision: 2013-02-18
+ * License: MIT License
+ *
+ * Demo: http://jsfiddle.net/highcharts/Vf3yT/
+ */
+
+/*global HighchartsAdapter*/
+(function (H) {
+
+	"use strict";
+
+	var noop = function () {},
+		defaultOptions = H.getOptions(),
+		each = H.each,
+		extend = H.extend,
+		wrap = H.wrap,
+		Chart = H.Chart,
+		seriesTypes = H.seriesTypes,
+		PieSeries = seriesTypes.pie,
+		ColumnSeries = seriesTypes.column,
+		fireEvent = HighchartsAdapter.fireEvent;
+
+	// Utilities
+	function tweenColors(startColor, endColor, pos) {
+		var rgba = [
+				Math.round(startColor[0] + (endColor[0] - startColor[0]) * pos),
+				Math.round(startColor[1] + (endColor[1] - startColor[1]) * pos),
+				Math.round(startColor[2] + (endColor[2] - startColor[2]) * pos),
+				startColor[3] + (endColor[3] - startColor[3]) * pos
+			];
+		return 'rgba(' + rgba.join(',') + ')';
+	}
+
+	// Add language
+	extend(defaultOptions.lang, {
+		drillUpText: '◁ Back to {series.name}'
+	});
+	defaultOptions.drilldown = {
+		activeAxisLabelStyle: {
+			cursor: 'pointer',
+			color: '#039',
+			fontWeight: 'bold',
+			textDecoration: 'underline'			
+		},
+		activeDataLabelStyle: {
+			cursor: 'pointer',
+			color: '#039',
+			fontWeight: 'bold',
+			textDecoration: 'underline'			
+		},
+		animation: {
+			duration: 500
+		},
+		drillUpButton: {
+			position: { 
+				align: 'right',
+				x: -10,
+				y: 10
+			}
+			// relativeTo: 'plotBox'
+			// theme
+		}
+	};	
+
+	/**
+	 * A general fadeIn method
+	 */
+	H.SVGRenderer.prototype.Element.prototype.fadeIn = function () {
+		this
+		.attr({
+			opacity: 0.1,
+			visibility: 'visible'
+		})
+		.animate({
+			opacity: 1
+		}, {
+			duration: 250
+		});
+	};
+
+	// Extend the Chart prototype
+	Chart.prototype.drilldownLevels = [];
+
+	Chart.prototype.addSeriesAsDrilldown = function (point, ddOptions) {
+		var oldSeries = point.series,
+			xAxis = oldSeries.xAxis,
+			yAxis = oldSeries.yAxis,
+			newSeries,
+			color = point.color || oldSeries.color,
+			pointIndex,
+			level;
+			
+		ddOptions = extend({
+			color: color
+		}, ddOptions);
+		pointIndex = HighchartsAdapter.inArray(this, oldSeries.points);
+		level = {
+			seriesOptions: oldSeries.userOptions,
+			shapeArgs: point.shapeArgs,
+			bBox: point.graphic.getBBox(),
+			color: color,
+			newSeries: ddOptions,
+			pointOptions: oldSeries.options.data[pointIndex],
+			pointIndex: pointIndex,
+			oldExtremes: {
+				xMin: xAxis && xAxis.userMin,
+				xMax: xAxis && xAxis.userMax,
+				yMin: yAxis && yAxis.userMin,
+				yMax: yAxis && yAxis.userMax
+			}
+		};
+
+		this.drilldownLevels.push(level);
+
+		newSeries = this.addSeries(ddOptions, false);
+		if (xAxis) {
+			xAxis.oldPos = xAxis.pos;
+			xAxis.userMin = xAxis.userMax = null;
+			yAxis.userMin = yAxis.userMax = null;
+		}
+
+		// Run fancy cross-animation on supported and equal types
+		if (oldSeries.type === newSeries.type) {
+			newSeries.animate = newSeries.animateDrilldown || noop;
+			newSeries.options.animation = true;
+		}
+		
+		oldSeries.remove(false);
+		
+		this.redraw();
+		this.showDrillUpButton();
+	};
+
+	Chart.prototype.getDrilldownBackText = function () {
+		var lastLevel = this.drilldownLevels[this.drilldownLevels.length - 1];
+
+		return this.options.lang.drillUpText.replace('{series.name}', lastLevel.seriesOptions.name);
+
+	};
+
+	Chart.prototype.showDrillUpButton = function () {
+		var chart = this,
+			backText = this.getDrilldownBackText(),
+			buttonOptions = chart.options.drilldown.drillUpButton;
+			
+
+		if (!this.drillUpButton) {
+			this.drillUpButton = this.renderer.button(
+				backText,
+				null,
+				null,
+				function () {
+					chart.drillUp(); 
+				}
+			)
+			.attr(extend({
+				align: buttonOptions.position.align,
+				zIndex: 9
+			}, buttonOptions.theme))
+			.add()
+			.align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');
+		} else {
+			this.drillUpButton.attr({
+				text: backText
+			})
+			.align();
+		}
+	};
+
+	Chart.prototype.drillUp = function () {
+		var chart = this,
+			level = chart.drilldownLevels.pop(),
+			oldSeries = chart.series[0],
+			oldExtremes = level.oldExtremes,
+			newSeries = chart.addSeries(level.seriesOptions, false);
+		
+		fireEvent(chart, 'drillup', { seriesOptions: level.seriesOptions });
+
+		if (newSeries.type === oldSeries.type) {
+			newSeries.drilldownLevel = level;
+			newSeries.animate = newSeries.animateDrillupTo || noop;
+			newSeries.options.animation = true;
+
+			if (oldSeries.animateDrillupFrom) {
+				oldSeries.animateDrillupFrom(level);
+			}
+		}
+
+		oldSeries.remove(false);
+
+		// Reset the zoom level of the upper series
+		if (newSeries.xAxis) {
+			newSeries.xAxis.setExtremes(oldExtremes.xMin, oldExtremes.xMax, false);
+			newSeries.yAxis.setExtremes(oldExtremes.yMin, oldExtremes.yMax, false);
+		}
+
+
+		this.redraw();
+
+		if (this.drilldownLevels.length === 0) {
+			this.drillUpButton = this.drillUpButton.destroy();
+		} else {
+			this.drillUpButton.attr({
+				text: this.getDrilldownBackText()
+			})
+			.align();
+		}
+	};
+
+	PieSeries.prototype.animateDrilldown = function (init) {
+		var level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],
+			animationOptions = this.chart.options.drilldown.animation,
+			animateFrom = level.shapeArgs,
+			start = animateFrom.start,
+			angle = animateFrom.end - start,
+			startAngle = angle / this.points.length,
+			startColor = H.Color(level.color).rgba;
+
+		if (!init) {
+			each(this.points, function (point, i) {
+				var endColor = H.Color(point.color).rgba;
+
+				/*jslint unparam: true*/
+				point.graphic
+					.attr(H.merge(animateFrom, {
+						start: start + i * startAngle,
+						end: start + (i + 1) * startAngle
+					}))
+					.animate(point.shapeArgs, H.merge(animationOptions, {
+						step: function (val, fx) {
+							if (fx.prop === 'start') {
+								this.attr({
+									fill: tweenColors(startColor, endColor, fx.pos)
+								});
+							}
+						}
+					}));
+				/*jslint unparam: false*/
+			});
+		}
+	};
+
+
+	/**
+	 * When drilling up, keep the upper series invisible until the lower series has
+	 * moved into place
+	 */
+	PieSeries.prototype.animateDrillupTo = 
+			ColumnSeries.prototype.animateDrillupTo = function (init) {
+		if (!init) {
+			var newSeries = this,
+				level = newSeries.drilldownLevel;
+
+			each(this.points, function (point) {
+				point.graphic.hide();
+				if (point.dataLabel) {
+					point.dataLabel.hide();
+				}
+				if (point.connector) {
+					point.connector.hide();
+				}
+			});
+
+
+			// Do dummy animation on first point to get to complete
+			setTimeout(function () {
+				each(newSeries.points, function (point, i) {  
+					// Fade in other points			  
+					var verb = i === level.pointIndex ? 'show' : 'fadeIn';
+					point.graphic[verb]();
+					if (point.dataLabel) {
+						point.dataLabel[verb]();
+					}
+					if (point.connector) {
+						point.connector[verb]();
+					}
+				});
+			}, Math.max(this.chart.options.drilldown.animation.duration - 50, 0));
+
+			// Reset
+			this.animate = noop;
+		}
+
+	};
+	
+	ColumnSeries.prototype.animateDrilldown = function (init) {
+		var animateFrom = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1].shapeArgs,
+			animationOptions = this.chart.options.drilldown.animation;
+			
+		if (!init) {
+
+			animateFrom.x += (this.xAxis.oldPos - this.xAxis.pos);
+	
+			each(this.points, function (point) {
+				point.graphic
+					.attr(animateFrom)
+					.animate(point.shapeArgs, animationOptions);
+			});
+		}
+		
+	};
+
+	/**
+	 * When drilling up, pull out the individual point graphics from the lower series
+	 * and animate them into the origin point in the upper series.
+	 */
+	ColumnSeries.prototype.animateDrillupFrom = 
+		PieSeries.prototype.animateDrillupFrom =
+	function (level) {
+		var animationOptions = this.chart.options.drilldown.animation,
+			group = this.group;
+
+		delete this.group;
+		each(this.points, function (point) {
+			var graphic = point.graphic,
+				startColor = H.Color(point.color).rgba;
+
+			delete point.graphic;
+
+			/*jslint unparam: true*/
+			graphic.animate(level.shapeArgs, H.merge(animationOptions, {
+
+				step: function (val, fx) {
+					if (fx.prop === 'start') {
+						this.attr({
+							fill: tweenColors(startColor, H.Color(level.color).rgba, fx.pos)
+						});
+					}
+				},
+				complete: function () {
+					graphic.destroy();
+					if (group) {
+						group = group.destroy();
+					}
+				}
+			}));
+			/*jslint unparam: false*/
+		});
+	};
+	
+	H.Point.prototype.doDrilldown = function () {
+		var series = this.series,
+			chart = series.chart,
+			drilldown = chart.options.drilldown,
+			i = drilldown.series.length,
+			seriesOptions;
+		
+		while (i-- && !seriesOptions) {
+			if (drilldown.series[i].id === this.drilldown) {
+				seriesOptions = drilldown.series[i];
+			}
+		}
+
+		// Fire the event. If seriesOptions is undefined, the implementer can check for 
+		// seriesOptions, and call addSeriesAsDrilldown async if necessary.
+		fireEvent(chart, 'drilldown', { 
+			point: this,
+			seriesOptions: seriesOptions
+		});
+		
+		if (seriesOptions) {
+			chart.addSeriesAsDrilldown(this, seriesOptions);
+		}
+
+	};
+	
+	wrap(H.Point.prototype, 'init', function (proceed, series, options, x) {
+		var point = proceed.call(this, series, options, x),
+			chart = series.chart,
+			tick = series.xAxis && series.xAxis.ticks[x],
+			tickLabel = tick && tick.label;
+		
+		if (point.drilldown) {
+			
+			// Add the click event to the point label
+			H.addEvent(point, 'click', function () {
+				point.doDrilldown();
+			});
+			
+			// Make axis labels clickable
+			if (tickLabel) {
+				if (!tickLabel._basicStyle) {
+					tickLabel._basicStyle = tickLabel.element.getAttribute('style');
+				}
+				tickLabel
+					.addClass('highcharts-drilldown-axis-label')
+					.css(chart.options.drilldown.activeAxisLabelStyle)
+					.on('click', function () {
+						if (point.doDrilldown) {
+							point.doDrilldown();
+						}
+					});
+					
+			}
+		} else if (tickLabel && tickLabel._basicStyle) {
+			tickLabel.element.setAttribute('style', tickLabel._basicStyle);
+		}
+		
+		return point;
+	});
+
+	wrap(H.Series.prototype, 'drawDataLabels', function (proceed) {
+		var css = this.chart.options.drilldown.activeDataLabelStyle;
+
+		proceed.call(this);
+
+		each(this.points, function (point) {
+			if (point.drilldown && point.dataLabel) {
+				point.dataLabel
+					.attr({
+						'class': 'highcharts-drilldown-data-label'
+					})
+					.css(css)
+					.on('click', function () {
+						point.doDrilldown();
+					});
+			}
+		});
+	});
+
+	// Mark the trackers with a pointer 
+	ColumnSeries.prototype.supportsDrilldown = true;
+	PieSeries.prototype.supportsDrilldown = true;
+	var type, 
+		drawTrackerWrapper = function (proceed) {
+			proceed.call(this);
+			each(this.points, function (point) {
+				if (point.drilldown && point.graphic) {
+					point.graphic
+						.attr({
+							'class': 'highcharts-drilldown-point'
+						})
+						.css({ cursor: 'pointer' });
+				}
+			});
+		};
+	for (type in seriesTypes) {
+		if (seriesTypes[type].prototype.supportsDrilldown) {
+			wrap(seriesTypes[type].prototype, 'drawTracker', drawTrackerWrapper);
+		}
+	}
+		
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/exporting.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/exporting.js
new file mode 100644
index 0000000..8ec202c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/exporting.js
@@ -0,0 +1,22 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+ Exporting module
+
+ (c) 2010-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(f){var A=f.Chart,t=f.addEvent,C=f.removeEvent,k=f.createElement,n=f.discardElement,u=f.css,o=f.merge,r=f.each,p=f.extend,D=Math.max,j=document,B=window,E=f.isTouchDevice,F=f.Renderer.prototype.symbols,x=f.getOptions(),y;p(x.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"});x.navigation={menuStyle:{border:"1px solid #A0A0A0",
+background:"#FFFFFF",padding:"5px 0"},menuItemStyle:{padding:"0 10px",background:"none",color:"#303030",fontSize:E?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{symbolFill:"#E0E0E0",symbolSize:14,symbolStroke:"#666",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,theme:{fill:"white",stroke:"none"},verticalAlign:"top",width:24}};x.exporting={type:"image/png",url:"http://export.highcharts.com/",buttons:{contextButton:{menuClassName:"highcharts-contextmenu",
+symbol:"menu",_titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}};f.post=function(c,a){var d,b;b=k("form",{method:"post",
+action:c,enctype:"multipart/form-data"},{display:"none"},j.body);for(d in a)k("input",{type:"hidden",name:d,value:a[d]},null,b);b.submit();n(b)};p(A.prototype,{getSVG:function(c){var a=this,d,b,z,h,g=o(a.options,c);if(!j.createElementNS)j.createElementNS=function(a,b){return j.createElement(b)};c=k("div",null,{position:"absolute",top:"-9999em",width:a.chartWidth+"px",height:a.chartHeight+"px"},j.body);b=a.renderTo.style.width;h=a.renderTo.style.height;b=g.exporting.sourceWidth||g.chart.width||/px$/.test(b)&&
+parseInt(b,10)||600;h=g.exporting.sourceHeight||g.chart.height||/px$/.test(h)&&parseInt(h,10)||400;p(g.chart,{animation:!1,renderTo:c,forExport:!0,width:b,height:h});g.exporting.enabled=!1;g.series=[];r(a.series,function(a){z=o(a.options,{animation:!1,showCheckbox:!1,visible:a.visible});z.isInternal||g.series.push(z)});d=new f.Chart(g,a.callback);r(["xAxis","yAxis"],function(b){r(a[b],function(a,c){var g=d[b][c],f=a.getExtremes(),h=f.userMin,f=f.userMax;g&&(h!==void 0||f!==void 0)&&g.setExtremes(h,
+f,!0,!1)})});b=d.container.innerHTML;g=null;d.destroy();n(c);b=b.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ href=/g," xlink:href=").replace(/\n/," ").replace(/<\/svg>.*?$/,"</svg>").replace(/&nbsp;/g," ").replace(/&shy;/g,"­").replace(/<IMG /g,"<image ").replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g,
+'width="$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href="$1"/>').replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" >]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()});return b=b.replace(/(url\(#highcharts-[0-9]+)&quot;/g,"$1").replace(/&quot;/g,"'")},exportChart:function(c,a){var c=c||{},d=this.options.exporting,d=this.getSVG(o({chart:{borderRadius:0}},d.chartOptions,a,{exporting:{sourceWidth:c.sourceWidth||
+d.sourceWidth,sourceHeight:c.sourceHeight||d.sourceHeight}})),c=o(this.options.exporting,c);f.post(c.url,{filename:c.filename||"chart",type:c.type,width:c.width||0,scale:c.scale||2,svg:d})},print:function(){var c=this,a=c.container,d=[],b=a.parentNode,f=j.body,h=f.childNodes;if(!c.isPrinting)c.isPrinting=!0,r(h,function(a,b){if(a.nodeType===1)d[b]=a.style.display,a.style.display="none"}),f.appendChild(a),B.focus(),B.print(),setTimeout(function(){b.appendChild(a);r(h,function(a,b){if(a.nodeType===
+1)a.style.display=d[b]});c.isPrinting=!1},1E3)},contextMenu:function(c,a,d,b,f,h,g){var e=this,j=e.options.navigation,q=j.menuItemStyle,l=e.chartWidth,m=e.chartHeight,o="cache-"+c,i=e[o],s=D(f,h),v,w,n;if(!i)e[o]=i=k("div",{className:c},{position:"absolute",zIndex:1E3,padding:s+"px"},e.container),v=k("div",null,p({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},j.menuStyle),i),w=function(){u(i,{display:"none"});g&&g.setState(0);e.openMenu=!1},t(i,
+"mouseleave",function(){n=setTimeout(w,500)}),t(i,"mouseenter",function(){clearTimeout(n)}),t(document,"mousedown",function(a){e.pointer.inClass(a.target,c)||w()}),r(a,function(a){if(a){var b=a.separator?k("hr",null,null,v):k("div",{onmouseover:function(){u(this,j.menuItemHoverStyle)},onmouseout:function(){u(this,q)},onclick:function(){w();a.onclick.apply(e,arguments)},innerHTML:a.text||e.options.lang[a.textKey]},p({cursor:"pointer"},q),v);e.exportDivElements.push(b)}}),e.exportDivElements.push(v,
+i),e.exportMenuWidth=i.offsetWidth,e.exportMenuHeight=i.offsetHeight;a={display:"block"};d+e.exportMenuWidth>l?a.right=l-d-f-s+"px":a.left=d-s+"px";b+h+e.exportMenuHeight>m&&g.alignOptions.verticalAlign!=="top"?a.bottom=m-b-s+"px":a.top=b+h-s+"px";u(i,a);e.openMenu=!0},addButton:function(c){var a=this,d=a.renderer,b=o(a.options.navigation.buttonOptions,c),j=b.onclick,h=b.menuItems,g,e,k={stroke:b.symbolStroke,fill:b.symbolFill},q=b.symbolSize||12;if(!a.btnCount)a.btnCount=0;if(!a.exportDivElements)a.exportDivElements=
+[],a.exportSVGElements=[];if(b.enabled!==!1){var l=b.theme,m=l.states,n=m&&m.hover,m=m&&m.select,i;delete l.states;j?i=function(){j.apply(a,arguments)}:h&&(i=function(){a.contextMenu(e.menuClassName,h,e.translateX,e.translateY,e.width,e.height,e);e.setState(2)});b.text&&b.symbol?l.paddingLeft=f.pick(l.paddingLeft,25):b.text||p(l,{width:b.width,height:b.height,padding:0});e=d.button(b.text,0,0,i,l,n,m).attr({title:a.options.lang[b._titleKey],"stroke-linecap":"round"});e.menuClassName=c.menuClassName||
+"highcharts-menu-"+a.btnCount++;b.symbol&&(g=d.symbol(b.symbol,b.symbolX-q/2,b.symbolY-q/2,q,q).attr(p(k,{"stroke-width":b.symbolStrokeWidth||1,zIndex:1})).add(e));e.add().align(p(b,{width:e.width,x:f.pick(b.x,y)}),!0,"spacingBox");y+=(e.width+b.buttonSpacing)*(b.align==="right"?-1:1);a.exportSVGElements.push(e,g)}},destroyExport:function(c){var c=c.target,a,d;for(a=0;a<c.exportSVGElements.length;a++)if(d=c.exportSVGElements[a])d.onclick=d.ontouchstart=null,c.exportSVGElements[a]=d.destroy();for(a=
+0;a<c.exportDivElements.length;a++)d=c.exportDivElements[a],C(d,"mouseleave"),c.exportDivElements[a]=d.onmouseout=d.onmouseover=d.ontouchstart=d.onclick=null,n(d)}});F.menu=function(c,a,d,b){return["M",c,a+2.5,"L",c+d,a+2.5,"M",c,a+b/2+0.5,"L",c+d,a+b/2+0.5,"M",c,a+b-1.5,"L",c+d,a+b-1.5]};A.prototype.callbacks.push(function(c){var a,d=c.options.exporting,b=d.buttons;y=0;if(d.enabled!==!1){for(a in b)c.addButton(b[a]);t(c,"destroy",c.destroyExport)}})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/exporting.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/exporting.src.js
new file mode 100644
index 0000000..dfc825c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/exporting.src.js
@@ -0,0 +1,709 @@
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ * Exporting module
+ *
+ * (c) 2010-2013 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts, document, window, Math, setTimeout */
+
+(function (Highcharts) { // encapsulate
+
+// create shortcuts
+var Chart = Highcharts.Chart,
+	addEvent = Highcharts.addEvent,
+	removeEvent = Highcharts.removeEvent,
+	createElement = Highcharts.createElement,
+	discardElement = Highcharts.discardElement,
+	css = Highcharts.css,
+	merge = Highcharts.merge,
+	each = Highcharts.each,
+	extend = Highcharts.extend,
+	math = Math,
+	mathMax = math.max,
+	doc = document,
+	win = window,
+	isTouchDevice = Highcharts.isTouchDevice,
+	M = 'M',
+	L = 'L',
+	DIV = 'div',
+	HIDDEN = 'hidden',
+	NONE = 'none',
+	PREFIX = 'highcharts-',
+	ABSOLUTE = 'absolute',
+	PX = 'px',
+	UNDEFINED,
+	symbols = Highcharts.Renderer.prototype.symbols,
+	defaultOptions = Highcharts.getOptions(),
+	buttonOffset;
+
+	// Add language
+	extend(defaultOptions.lang, {
+		printChart: 'Print chart',
+		downloadPNG: 'Download PNG image',
+		downloadJPEG: 'Download JPEG image',
+		downloadPDF: 'Download PDF document',
+		downloadSVG: 'Download SVG vector image',
+		contextButtonTitle: 'Chart context menu'
+	});
+
+// Buttons and menus are collected in a separate config option set called 'navigation'.
+// This can be extended later to add control buttons like zoom and pan right click menus.
+defaultOptions.navigation = {
+	menuStyle: {
+		border: '1px solid #A0A0A0',
+		background: '#FFFFFF',
+		padding: '5px 0'
+	},
+	menuItemStyle: {
+		padding: '0 10px',
+		background: NONE,
+		color: '#303030',
+		fontSize: isTouchDevice ? '14px' : '11px'
+	},
+	menuItemHoverStyle: {
+		background: '#4572A5',
+		color: '#FFFFFF'
+	},
+
+	buttonOptions: {
+		symbolFill: '#E0E0E0',
+		symbolSize: 14,
+		symbolStroke: '#666',
+		symbolStrokeWidth: 3,
+		symbolX: 12.5,
+		symbolY: 10.5,
+		align: 'right',
+		buttonSpacing: 3, 
+		height: 22,
+		// text: null,
+		theme: {
+			fill: 'white', // capture hover
+			stroke: 'none'
+		},
+		verticalAlign: 'top',
+		width: 24
+	}
+};
+
+
+
+// Add the export related options
+defaultOptions.exporting = {
+	//enabled: true,
+	//filename: 'chart',
+	type: 'image/png',
+	url: 'http://export.highcharts.com/',
+	//width: undefined,
+	//scale: 2
+	buttons: {
+		contextButton: {
+			menuClassName: PREFIX + 'contextmenu',
+			//x: -10,
+			symbol: 'menu',
+			_titleKey: 'contextButtonTitle',
+			menuItems: [{
+				textKey: 'printChart',
+				onclick: function () {
+					this.print();
+				}
+			}, {
+				separator: true
+			}, {
+				textKey: 'downloadPNG',
+				onclick: function () {
+					this.exportChart();
+				}
+			}, {
+				textKey: 'downloadJPEG',
+				onclick: function () {
+					this.exportChart({
+						type: 'image/jpeg'
+					});
+				}
+			}, {
+				textKey: 'downloadPDF',
+				onclick: function () {
+					this.exportChart({
+						type: 'application/pdf'
+					});
+				}
+			}, {
+				textKey: 'downloadSVG',
+				onclick: function () {
+					this.exportChart({
+						type: 'image/svg+xml'
+					});
+				}
+			}
+			// Enable this block to add "View SVG" to the dropdown menu
+			/*
+			,{
+
+				text: 'View SVG',
+				onclick: function () {
+					var svg = this.getSVG()
+						.replace(/</g, '\n&lt;')
+						.replace(/>/g, '&gt;');
+
+					doc.body.innerHTML = '<pre>' + svg + '</pre>';
+				}
+			} // */
+			]
+		}
+	}
+};
+
+// Add the Highcharts.post utility
+Highcharts.post = function (url, data) {
+	var name,
+		form;
+	
+	// create the form
+	form = createElement('form', {
+		method: 'post',
+		action: url,
+		enctype: 'multipart/form-data'
+	}, {
+		display: NONE
+	}, doc.body);
+
+	// add the data
+	for (name in data) {
+		createElement('input', {
+			type: HIDDEN,
+			name: name,
+			value: data[name]
+		}, null, form);
+	}
+
+	// submit
+	form.submit();
+
+	// clean up
+	discardElement(form);
+};
+
+extend(Chart.prototype, {
+
+	/**
+	 * Return an SVG representation of the chart
+	 *
+	 * @param additionalOptions {Object} Additional chart options for the generated SVG representation
+	 */
+	getSVG: function (additionalOptions) {
+		var chart = this,
+			chartCopy,
+			sandbox,
+			svg,
+			seriesOptions,
+			sourceWidth,
+			sourceHeight,
+			cssWidth,
+			cssHeight,
+			options = merge(chart.options, additionalOptions); // copy the options and add extra options
+
+		// IE compatibility hack for generating SVG content that it doesn't really understand
+		if (!doc.createElementNS) {
+			/*jslint unparam: true*//* allow unused parameter ns in function below */
+			doc.createElementNS = function (ns, tagName) {
+				return doc.createElement(tagName);
+			};
+			/*jslint unparam: false*/
+		}
+
+		// create a sandbox where a new chart will be generated
+		sandbox = createElement(DIV, null, {
+			position: ABSOLUTE,
+			top: '-9999em',
+			width: chart.chartWidth + PX,
+			height: chart.chartHeight + PX
+		}, doc.body);
+		
+		// get the source size
+		cssWidth = chart.renderTo.style.width;
+		cssHeight = chart.renderTo.style.height;
+		sourceWidth = options.exporting.sourceWidth ||
+			options.chart.width ||
+			(/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||
+			600;
+		sourceHeight = options.exporting.sourceHeight ||
+			options.chart.height ||
+			(/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||
+			400;
+
+		// override some options
+		extend(options.chart, {
+			animation: false,
+			renderTo: sandbox,
+			forExport: true,
+			width: sourceWidth,
+			height: sourceHeight
+		});
+		options.exporting.enabled = false; // hide buttons in print
+		
+		// prepare for replicating the chart
+		options.series = [];
+		each(chart.series, function (serie) {
+			seriesOptions = merge(serie.options, {
+				animation: false, // turn off animation
+				showCheckbox: false,
+				visible: serie.visible
+			});
+
+			if (!seriesOptions.isInternal) { // used for the navigator series that has its own option set
+				options.series.push(seriesOptions);
+			}
+		});
+
+		// generate the chart copy
+		chartCopy = new Highcharts.Chart(options, chart.callback);
+
+		// reflect axis extremes in the export
+		each(['xAxis', 'yAxis'], function (axisType) {
+			each(chart[axisType], function (axis, i) {
+				var axisCopy = chartCopy[axisType][i],
+					extremes = axis.getExtremes(),
+					userMin = extremes.userMin,
+					userMax = extremes.userMax;
+
+				if (axisCopy && (userMin !== UNDEFINED || userMax !== UNDEFINED)) {
+					axisCopy.setExtremes(userMin, userMax, true, false);
+				}
+			});
+		});
+
+		// get the SVG from the container's innerHTML
+		svg = chartCopy.container.innerHTML;
+
+		// free up memory
+		options = null;
+		chartCopy.destroy();
+		discardElement(sandbox);
+
+		// sanitize
+		svg = svg
+			.replace(/zIndex="[^"]+"/g, '')
+			.replace(/isShadow="[^"]+"/g, '')
+			.replace(/symbolName="[^"]+"/g, '')
+			.replace(/jQuery[0-9]+="[^"]+"/g, '')
+			.replace(/url\([^#]+#/g, 'url(#')
+			.replace(/<svg /, '<svg xmlns:xlink="http://www.w3.org/1999/xlink" ')
+			.replace(/ href=/g, ' xlink:href=')
+			.replace(/\n/, ' ')
+			.replace(/<\/svg>.*?$/, '</svg>') // any HTML added to the container after the SVG (#894)
+			/* This fails in IE < 8
+			.replace(/([0-9]+)\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight
+				return s2 +'.'+ s3[0];
+			})*/
+
+			// Replace HTML entities, issue #347
+			.replace(/&nbsp;/g, '\u00A0') // no-break space
+			.replace(/&shy;/g,  '\u00AD') // soft hyphen
+
+			// IE specific
+			.replace(/<IMG /g, '<image ')
+			.replace(/height=([^" ]+)/g, 'height="$1"')
+			.replace(/width=([^" ]+)/g, 'width="$1"')
+			.replace(/hc-svg-href="([^"]+)">/g, 'xlink:href="$1"/>')
+			.replace(/id=([^" >]+)/g, 'id="$1"')
+			.replace(/class=([^" >]+)/g, 'class="$1"')
+			.replace(/ transform /g, ' ')
+			.replace(/:(path|rect)/g, '$1')
+			.replace(/style="([^"]+)"/g, function (s) {
+				return s.toLowerCase();
+			});
+
+		// IE9 beta bugs with innerHTML. Test again with final IE9.
+		svg = svg.replace(/(url\(#highcharts-[0-9]+)&quot;/g, '$1')
+			.replace(/&quot;/g, "'");
+
+		return svg;
+	},
+
+	/**
+	 * Submit the SVG representation of the chart to the server
+	 * @param {Object} options Exporting options. Possible members are url, type and width.
+	 * @param {Object} chartOptions Additional chart options for the SVG representation of the chart
+	 */
+	exportChart: function (options, chartOptions) {
+		options = options || {};
+		
+		var chart = this,
+			chartExportingOptions = chart.options.exporting,
+			svg = chart.getSVG(merge(
+				{ chart: { borderRadius: 0 } },
+				chartExportingOptions.chartOptions,
+				chartOptions, 
+				{
+					exporting: {
+						sourceWidth: options.sourceWidth || chartExportingOptions.sourceWidth,
+						sourceHeight: options.sourceHeight || chartExportingOptions.sourceHeight
+					}
+				}
+			));
+
+		// merge the options
+		options = merge(chart.options.exporting, options);
+		
+		// do the post
+		Highcharts.post(options.url, {
+			filename: options.filename || 'chart',
+			type: options.type,
+			width: options.width || 0, // IE8 fails to post undefined correctly, so use 0
+			scale: options.scale || 2,
+			svg: svg
+		});
+
+	},
+	
+	/**
+	 * Print the chart
+	 */
+	print: function () {
+
+		var chart = this,
+			container = chart.container,
+			origDisplay = [],
+			origParent = container.parentNode,
+			body = doc.body,
+			childNodes = body.childNodes;
+
+		if (chart.isPrinting) { // block the button while in printing mode
+			return;
+		}
+
+		chart.isPrinting = true;
+
+		// hide all body content
+		each(childNodes, function (node, i) {
+			if (node.nodeType === 1) {
+				origDisplay[i] = node.style.display;
+				node.style.display = NONE;
+			}
+		});
+
+		// pull out the chart
+		body.appendChild(container);
+
+		// print
+		win.focus(); // #1510
+		win.print();
+
+		// allow the browser to prepare before reverting
+		setTimeout(function () {
+
+			// put the chart back in
+			origParent.appendChild(container);
+
+			// restore all body content
+			each(childNodes, function (node, i) {
+				if (node.nodeType === 1) {
+					node.style.display = origDisplay[i];
+				}
+			});
+
+			chart.isPrinting = false;
+
+		}, 1000);
+
+	},
+
+	/**
+	 * Display a popup menu for choosing the export type
+	 *
+	 * @param {String} className An identifier for the menu
+	 * @param {Array} items A collection with text and onclicks for the items
+	 * @param {Number} x The x position of the opener button
+	 * @param {Number} y The y position of the opener button
+	 * @param {Number} width The width of the opener button
+	 * @param {Number} height The height of the opener button
+	 */
+	contextMenu: function (className, items, x, y, width, height, button) {
+		var chart = this,
+			navOptions = chart.options.navigation,
+			menuItemStyle = navOptions.menuItemStyle,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			cacheName = 'cache-' + className,
+			menu = chart[cacheName],
+			menuPadding = mathMax(width, height), // for mouse leave detection
+			boxShadow = '3px 3px 10px #888',
+			innerMenu,
+			hide,
+			hideTimer,
+			menuStyle;
+
+		// create the menu only the first time
+		if (!menu) {
+
+			// create a HTML element above the SVG
+			chart[cacheName] = menu = createElement(DIV, {
+				className: className
+			}, {
+				position: ABSOLUTE,
+				zIndex: 1000,
+				padding: menuPadding + PX
+			}, chart.container);
+
+			innerMenu = createElement(DIV, null,
+				extend({
+					MozBoxShadow: boxShadow,
+					WebkitBoxShadow: boxShadow,
+					boxShadow: boxShadow
+				}, navOptions.menuStyle), menu);
+
+			// hide on mouse out
+			hide = function () {
+				css(menu, { display: NONE });
+				if (button) {
+					button.setState(0);
+				}
+				chart.openMenu = false;
+			};
+
+			// Hide the menu some time after mouse leave (#1357)
+			addEvent(menu, 'mouseleave', function () {
+				hideTimer = setTimeout(hide, 500);
+			});
+			addEvent(menu, 'mouseenter', function () {
+				clearTimeout(hideTimer);
+			});
+			// Hide it on clicking or touching outside the menu (#2258)
+			addEvent(document, 'mousedown', function (e) {
+				if (!chart.pointer.inClass(e.target, className)) {
+					hide();
+				}
+			});
+
+
+			// create the items
+			each(items, function (item) {
+				if (item) {
+					var element = item.separator ? 
+						createElement('hr', null, null, innerMenu) :
+						createElement(DIV, {
+							onmouseover: function () {
+								css(this, navOptions.menuItemHoverStyle);
+							},
+							onmouseout: function () {
+								css(this, menuItemStyle);
+							},
+							onclick: function () {
+								hide();
+								item.onclick.apply(chart, arguments);
+							},
+							innerHTML: item.text || chart.options.lang[item.textKey]
+						}, extend({
+							cursor: 'pointer'
+						}, menuItemStyle), innerMenu);
+
+
+					// Keep references to menu divs to be able to destroy them
+					chart.exportDivElements.push(element);
+				}
+			});
+
+			// Keep references to menu and innerMenu div to be able to destroy them
+			chart.exportDivElements.push(innerMenu, menu);
+
+			chart.exportMenuWidth = menu.offsetWidth;
+			chart.exportMenuHeight = menu.offsetHeight;
+		}
+
+		menuStyle = { display: 'block' };
+
+		// if outside right, right align it
+		if (x + chart.exportMenuWidth > chartWidth) {
+			menuStyle.right = (chartWidth - x - width - menuPadding) + PX;
+		} else {
+			menuStyle.left = (x - menuPadding) + PX;
+		}
+		// if outside bottom, bottom align it
+		if (y + height + chart.exportMenuHeight > chartHeight && button.alignOptions.verticalAlign !== 'top') {
+			menuStyle.bottom = (chartHeight - y - menuPadding)  + PX;
+		} else {
+			menuStyle.top = (y + height - menuPadding) + PX;
+		}
+
+		css(menu, menuStyle);
+		chart.openMenu = true;
+	},
+
+	/**
+	 * Add the export button to the chart
+	 */
+	addButton: function (options) {
+		var chart = this,
+			renderer = chart.renderer,
+			btnOptions = merge(chart.options.navigation.buttonOptions, options),
+			onclick = btnOptions.onclick,
+			menuItems = btnOptions.menuItems,
+			symbol,
+			button,
+			symbolAttr = {
+				stroke: btnOptions.symbolStroke,
+				fill: btnOptions.symbolFill
+			},
+			symbolSize = btnOptions.symbolSize || 12;
+		if (!chart.btnCount) {
+			chart.btnCount = 0;
+		}
+
+		// Keeps references to the button elements
+		if (!chart.exportDivElements) {
+			chart.exportDivElements = [];
+			chart.exportSVGElements = [];
+		}
+
+		if (btnOptions.enabled === false) {
+			return;
+		}
+
+
+		var attr = btnOptions.theme,
+			states = attr.states,
+			hover = states && states.hover,
+			select = states && states.select,
+			callback;
+
+		delete attr.states;
+
+		if (onclick) {
+			callback = function () {
+				onclick.apply(chart, arguments);
+			};
+
+		} else if (menuItems) {
+			callback = function () {
+				chart.contextMenu(
+					button.menuClassName, 
+					menuItems, 
+					button.translateX, 
+					button.translateY, 
+					button.width, 
+					button.height,
+					button
+				);
+				button.setState(2);
+			};
+		}
+
+
+		if (btnOptions.text && btnOptions.symbol) {
+			attr.paddingLeft = Highcharts.pick(attr.paddingLeft, 25);
+		
+		} else if (!btnOptions.text) {
+			extend(attr, {
+				width: btnOptions.width,
+				height: btnOptions.height,
+				padding: 0
+			});
+		}
+
+		button = renderer.button(btnOptions.text, 0, 0, callback, attr, hover, select)
+			.attr({
+				title: chart.options.lang[btnOptions._titleKey],
+				'stroke-linecap': 'round'
+			});
+		button.menuClassName = options.menuClassName || PREFIX + 'menu-' + chart.btnCount++;
+
+		if (btnOptions.symbol) {
+			symbol = renderer.symbol(
+					btnOptions.symbol,
+					btnOptions.symbolX - (symbolSize / 2),
+					btnOptions.symbolY - (symbolSize / 2),
+					symbolSize,				
+					symbolSize
+				)
+				.attr(extend(symbolAttr, {
+					'stroke-width': btnOptions.symbolStrokeWidth || 1,
+					zIndex: 1
+				})).add(button);
+		}
+
+		button.add()
+			.align(extend(btnOptions, {
+				width: button.width,
+				x: Highcharts.pick(btnOptions.x, buttonOffset) // #1654
+			}), true, 'spacingBox');
+
+		buttonOffset += (button.width + btnOptions.buttonSpacing) * (btnOptions.align === 'right' ? -1 : 1);
+
+		chart.exportSVGElements.push(button, symbol);
+
+	},
+
+	/**
+	 * Destroy the buttons.
+	 */
+	destroyExport: function (e) {
+		var chart = e.target,
+			i,
+			elem;
+
+		// Destroy the extra buttons added
+		for (i = 0; i < chart.exportSVGElements.length; i++) {
+			elem = chart.exportSVGElements[i];
+			
+			// Destroy and null the svg/vml elements
+			if (elem) { // #1822
+				elem.onclick = elem.ontouchstart = null;
+				chart.exportSVGElements[i] = elem.destroy();
+			}
+		}
+
+		// Destroy the divs for the menu
+		for (i = 0; i < chart.exportDivElements.length; i++) {
+			elem = chart.exportDivElements[i];
+
+			// Remove the event handler
+			removeEvent(elem, 'mouseleave');
+
+			// Remove inline events
+			chart.exportDivElements[i] = elem.onmouseout = elem.onmouseover = elem.ontouchstart = elem.onclick = null;
+
+			// Destroy the div by moving to garbage bin
+			discardElement(elem);
+		}
+	}
+});
+
+
+symbols.menu = function (x, y, width, height) {
+	var arr = [
+		M, x, y + 2.5,
+		L, x + width, y + 2.5,
+		M, x, y + height / 2 + 0.5,
+		L, x + width, y + height / 2 + 0.5,
+		M, x, y + height - 1.5,
+		L, x + width, y + height - 1.5
+	];
+	return arr;
+};
+
+// Add the buttons on chart load
+Chart.prototype.callbacks.push(function (chart) {
+	var n,
+		exportingOptions = chart.options.exporting,
+		buttons = exportingOptions.buttons;
+
+	buttonOffset = 0;
+
+	if (exportingOptions.enabled !== false) {
+
+		for (n in buttons) {
+			chart.addButton(buttons[n]);
+		}
+
+		// Destroy the export elements at chart destroy
+		addEvent(chart, 'destroy', chart.destroyExport);
+	}
+
+});
+
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/funnel.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/funnel.js
new file mode 100644
index 0000000..d33b042
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/funnel.js
@@ -0,0 +1,12 @@
+/*
+ 
+ Highcharts funnel module, Beta
+
+ (c) 2010-2012 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(d){var u=d.getOptions().plotOptions,p=d.seriesTypes,D=d.merge,z=function(){},A=d.each;u.funnel=D(u.pie,{center:["50%","50%"],width:"90%",neckWidth:"30%",height:"100%",neckHeight:"25%",dataLabels:{connectorWidth:1,connectorColor:"#606060"},size:!0,states:{select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}}});p.funnel=d.extendClass(p.pie,{type:"funnel",animate:z,translate:function(){var a=function(k,a){return/%$/.test(k)?a*parseInt(k,10)/100:parseInt(k,10)},g=0,e=this.chart,f=e.plotWidth,
+e=e.plotHeight,h=0,c=this.options,C=c.center,b=a(C[0],f),d=a(C[0],e),p=a(c.width,f),i,q,j=a(c.height,e),r=a(c.neckWidth,f),s=a(c.neckHeight,e),v=j-s,a=this.data,w,x,u=c.dataLabels.position==="left"?1:0,y,m,B,n,l,t,o;this.getWidthAt=q=function(k){return k>j-s||j===s?r:r+(p-r)*((j-s-k)/(j-s))};this.getX=function(k,a){return b+(a?-1:1)*(q(k)/2+c.dataLabels.distance)};this.center=[b,d,j];this.centerX=b;A(a,function(a){g+=a.y});A(a,function(a){o=null;x=g?a.y/g:0;m=d-j/2+h*j;l=m+x*j;i=q(m);y=b-i/2;B=y+
+i;i=q(l);n=b-i/2;t=n+i;m>v?(y=n=b-r/2,B=t=b+r/2):l>v&&(o=l,i=q(v),n=b-i/2,t=n+i,l=v);w=["M",y,m,"L",B,m,t,l];o&&w.push(t,o,n,o);w.push(n,l,"Z");a.shapeType="path";a.shapeArgs={d:w};a.percentage=x*100;a.plotX=b;a.plotY=(m+(o||l))/2;a.tooltipPos=[b,a.plotY];a.slice=z;a.half=u;h+=x});this.setTooltipPoints()},drawPoints:function(){var a=this,g=a.options,e=a.chart.renderer;A(a.data,function(f){var h=f.graphic,c=f.shapeArgs;h?h.animate(c):f.graphic=e.path(c).attr({fill:f.color,stroke:g.borderColor,"stroke-width":g.borderWidth}).add(a.group)})},
+sortByAngle:z,drawDataLabels:function(){var a=this.data,g=this.options.dataLabels.distance,e,f,h,c=a.length,d,b;for(this.center[2]-=2*g;c--;)h=a[c],f=(e=h.half)?1:-1,b=h.plotY,d=this.getX(b,e),h.labelPos=[0,b,d+(g-5)*f,b,d+g*f,b,e?"right":"left",0];p.pie.prototype.drawDataLabels.call(this)}})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/funnel.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/funnel.src.js
new file mode 100644
index 0000000..f9f5c08
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/funnel.src.js
@@ -0,0 +1,289 @@
+/**
+ * @license 
+ * Highcharts funnel module, Beta
+ *
+ * (c) 2010-2012 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+/*global Highcharts */
+(function (Highcharts) {
+	
+'use strict';
+
+// create shortcuts
+var defaultOptions = Highcharts.getOptions(),
+	defaultPlotOptions = defaultOptions.plotOptions,
+	seriesTypes = Highcharts.seriesTypes,
+	merge = Highcharts.merge,
+	noop = function () {},
+	each = Highcharts.each;
+
+// set default options
+defaultPlotOptions.funnel = merge(defaultPlotOptions.pie, {
+	center: ['50%', '50%'],
+	width: '90%',
+	neckWidth: '30%',
+	height: '100%',
+	neckHeight: '25%',
+
+	dataLabels: {
+		//position: 'right',
+		connectorWidth: 1,
+		connectorColor: '#606060'
+	},
+	size: true, // to avoid adapting to data label size in Pie.drawDataLabels
+	states: {
+		select: {
+			color: '#C0C0C0',
+			borderColor: '#000000',
+			shadow: false
+		}
+	}	
+});
+
+
+seriesTypes.funnel = Highcharts.extendClass(seriesTypes.pie, {
+	
+	type: 'funnel',
+	animate: noop,
+
+	/**
+	 * Overrides the pie translate method
+	 */
+	translate: function () {
+		
+		var 
+			// Get positions - either an integer or a percentage string must be given
+			getLength = function (length, relativeTo) {
+				return (/%$/).test(length) ?
+					relativeTo * parseInt(length, 10) / 100 :
+					parseInt(length, 10);
+			},
+			
+			sum = 0,
+			series = this,
+			chart = series.chart,
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			cumulative = 0, // start at top
+			options = series.options,
+			center = options.center,
+			centerX = getLength(center[0], plotWidth),
+			centerY = getLength(center[0], plotHeight),
+			width = getLength(options.width, plotWidth),
+			tempWidth,
+			getWidthAt,
+			height = getLength(options.height, plotHeight),
+			neckWidth = getLength(options.neckWidth, plotWidth),
+			neckHeight = getLength(options.neckHeight, plotHeight),
+			neckY = height - neckHeight,
+			data = series.data,
+			path,
+			fraction,
+			half = options.dataLabels.position === 'left' ? 1 : 0,
+
+			x1, 
+			y1, 
+			x2, 
+			x3, 
+			y3, 
+			x4, 
+			y5;
+
+		// Return the width at a specific y coordinate
+		series.getWidthAt = getWidthAt = function (y) {
+			return y > height - neckHeight || height === neckHeight ?
+				neckWidth :
+				neckWidth + (width - neckWidth) * ((height - neckHeight - y) / (height - neckHeight));
+		};
+		series.getX = function (y, half) {
+			return centerX + (half ? -1 : 1) * ((getWidthAt(y) / 2) + options.dataLabels.distance);
+		};
+
+		// Expose
+		series.center = [centerX, centerY, height];
+		series.centerX = centerX;
+
+		/*
+		 * Individual point coordinate naming:
+		 *
+		 * x1,y1 _________________ x2,y1
+		 *  \                         /
+		 *   \                       /
+		 *    \                     /
+		 *     \                   /
+		 *      \                 /
+		 *     x3,y3 _________ x4,y3
+		 *
+		 * Additional for the base of the neck:
+		 *
+		 *       |               |
+		 *       |               |
+		 *       |               |
+		 *     x3,y5 _________ x4,y5
+		 */
+
+
+
+
+		// get the total sum
+		each(data, function (point) {
+			sum += point.y;
+		});
+
+		each(data, function (point) {
+			// set start and end positions
+			y5 = null;
+			fraction = sum ? point.y / sum : 0;
+			y1 = centerY - height / 2 + cumulative * height;
+			y3 = y1 + fraction * height;
+			//tempWidth = neckWidth + (width - neckWidth) * ((height - neckHeight - y1) / (height - neckHeight));
+			tempWidth = getWidthAt(y1);
+			x1 = centerX - tempWidth / 2;
+			x2 = x1 + tempWidth;
+			tempWidth = getWidthAt(y3);
+			x3 = centerX - tempWidth / 2;
+			x4 = x3 + tempWidth;
+
+			// the entire point is within the neck
+			if (y1 > neckY) {
+				x1 = x3 = centerX - neckWidth / 2;
+				x2 = x4 = centerX + neckWidth / 2;
+			
+			// the base of the neck
+			} else if (y3 > neckY) {
+				y5 = y3;
+
+				tempWidth = getWidthAt(neckY);
+				x3 = centerX - tempWidth / 2;
+				x4 = x3 + tempWidth;
+
+				y3 = neckY;
+			}
+
+			// save the path
+			path = [
+				'M',
+				x1, y1,
+				'L',
+				x2, y1,
+				x4, y3
+			];
+			if (y5) {
+				path.push(x4, y5, x3, y5);
+			}
+			path.push(x3, y3, 'Z');
+
+			// prepare for using shared dr
+			point.shapeType = 'path';
+			point.shapeArgs = { d: path };
+
+
+			// for tooltips and data labels
+			point.percentage = fraction * 100;
+			point.plotX = centerX;
+			point.plotY = (y1 + (y5 || y3)) / 2;
+
+			// Placement of tooltips and data labels
+			point.tooltipPos = [
+				centerX,
+				point.plotY
+			];
+
+			// Slice is a noop on funnel points
+			point.slice = noop;
+			
+			// Mimicking pie data label placement logic
+			point.half = half;
+
+			cumulative += fraction;
+		});
+
+
+		series.setTooltipPoints();
+	},
+	/**
+	 * Draw a single point (wedge)
+	 * @param {Object} point The point object
+	 * @param {Object} color The color of the point
+	 * @param {Number} brightness The brightness relative to the color
+	 */
+	drawPoints: function () {
+		var series = this,
+			options = series.options,
+			chart = series.chart,
+			renderer = chart.renderer;
+
+		each(series.data, function (point) {
+			
+			var graphic = point.graphic,
+				shapeArgs = point.shapeArgs;
+
+			if (!graphic) { // Create the shapes
+				point.graphic = renderer.path(shapeArgs).
+					attr({
+						fill: point.color,
+						stroke: options.borderColor,
+						'stroke-width': options.borderWidth
+					}).
+					add(series.group);
+					
+			} else { // Update the shapes
+				graphic.animate(shapeArgs);
+			}
+		});
+	},
+
+	/**
+	 * Funnel items don't have angles (#2289)
+	 */
+	sortByAngle: noop,
+	
+	/**
+	 * Extend the pie data label method
+	 */
+	drawDataLabels: function () {
+		var data = this.data,
+			labelDistance = this.options.dataLabels.distance,
+			leftSide,
+			sign,
+			point,
+			i = data.length,
+			x,
+			y;
+		
+		// In the original pie label anticollision logic, the slots are distributed
+		// from one labelDistance above to one labelDistance below the pie. In funnels
+		// we don't want this.
+		this.center[2] -= 2 * labelDistance;
+		
+		// Set the label position array for each point.
+		while (i--) {
+			point = data[i];
+			leftSide = point.half;
+			sign = leftSide ? 1 : -1;
+			y = point.plotY;
+			x = this.getX(y, leftSide);
+				
+			// set the anchor point for data labels
+			point.labelPos = [
+				0, // first break of connector
+				y, // a/a
+				x + (labelDistance - 5) * sign, // second break, right outside point shape
+				y, // a/a
+				x + labelDistance * sign, // landing point for connector
+				y, // a/a
+				leftSide ? 'right' : 'left', // alignment
+				0 // center angle
+			];
+		}
+		
+		seriesTypes.pie.prototype.drawDataLabels.call(this);
+	}
+
+});
+
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/heatmap.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/heatmap.js
new file mode 100644
index 0000000..32f9a3f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/heatmap.js
@@ -0,0 +1 @@
+(function(b){var k=b.seriesTypes,l=b.each;k.heatmap=b.extendClass(k.map,{colorKey:"z",useMapGeometry:!1,pointArrayMap:["y","z"],translate:function(){var c=this,b=c.options,i=Number.MAX_VALUE,j=Number.MIN_VALUE;c.generatePoints();l(c.data,function(a){var e=a.x,f=a.y,d=a.z,g=(b.colsize||1)/2,h=(b.rowsize||1)/2;a.path=["M",e-g,f-h,"L",e+g,f-h,"L",e+g,f+h,"L",e-g,f+h,"Z"];a.shapeType="path";a.shapeArgs={d:c.translatePath(a.path)};typeof d==="number"&&(d>j?j=d:d<i&&(i=d))});c.translateColors(i,j)},getBox:function(){}})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/heatmap.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/heatmap.src.js
new file mode 100644
index 0000000..b7e356a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/heatmap.src.js
@@ -0,0 +1,53 @@
+(function (Highcharts) {
+	var seriesTypes = Highcharts.seriesTypes,
+		each = Highcharts.each;
+	
+	seriesTypes.heatmap = Highcharts.extendClass(seriesTypes.map, {
+		colorKey: 'z',
+		useMapGeometry: false,
+		pointArrayMap: ['y', 'z'],
+		translate: function () {
+			var series = this,
+				options = series.options,
+				dataMin = Number.MAX_VALUE,
+				dataMax = Number.MIN_VALUE;
+
+			series.generatePoints();
+	
+			each(series.data, function (point) {
+				var x = point.x,
+					y = point.y,
+					value = point.z,
+					xPad = (options.colsize || 1) / 2,
+					yPad = (options.rowsize || 1) / 2;
+
+				point.path = [
+					'M', x - xPad, y - yPad,
+					'L', x + xPad, y - yPad,
+					'L', x + xPad, y + yPad,
+					'L', x - xPad, y + yPad,
+					'Z'
+				];
+				
+				point.shapeType = 'path';
+				point.shapeArgs = {
+					d: series.translatePath(point.path)
+				};
+				
+				if (typeof value === 'number') {
+					if (value > dataMax) {
+						dataMax = value;
+					} else if (value < dataMin) {
+						dataMin = value;
+					}
+				}
+			});
+			
+			series.translateColors(dataMin, dataMax);
+		},
+		
+		getBox: function () {}
+			
+	});
+	
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/map.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/map.js
new file mode 100644
index 0000000..9b8a632
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/map.js
@@ -0,0 +1,27 @@
+/*
+ Map plugin v0.1 for Highcharts
+
+ (c) 2011-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(g){function x(a,b,c){for(var d=4,e=[];d--;)e[d]=Math.round(b.rgba[d]+(a.rgba[d]-b.rgba[d])*(1-c));return"rgba("+e.join(",")+")"}var r=g.Axis,y=g.Chart,s=g.Point,z=g.Pointer,l=g.each,v=g.extend,p=g.merge,n=g.pick,A=g.numberFormat,B=g.getOptions(),k=g.seriesTypes,q=B.plotOptions,t=g.wrap,u=g.Color,w=function(){};B.mapNavigation={buttonOptions:{align:"right",verticalAlign:"bottom",x:0,width:18,height:18,style:{fontSize:"15px",fontWeight:"bold",textAlign:"center"}},buttons:{zoomIn:{onclick:function(){this.mapZoom(0.5)},
+text:"+",y:-32},zoomOut:{onclick:function(){this.mapZoom(2)},text:"-",y:0}}};g.splitPath=function(a){var b,a=a.replace(/([A-Za-z])/g," $1 "),a=a.replace(/^\s*/,"").replace(/\s*$/,""),a=a.split(/[ ,]+/);for(b=0;b<a.length;b++)/[a-zA-Z]/.test(a[b])||(a[b]=parseFloat(a[b]));return a};g.maps={};t(r.prototype,"getSeriesExtremes",function(a){var b=this.isXAxis,c,d,e=[];l(this.series,function(a,b){if(a.useMapGeometry)e[b]=a.xData,a.xData=[]});a.call(this);c=n(this.dataMin,Number.MAX_VALUE);d=n(this.dataMax,
+Number.MIN_VALUE);l(this.series,function(a,i){if(a.useMapGeometry)c=Math.min(c,a[b?"minX":"minY"]),d=Math.max(d,a[b?"maxX":"maxY"]),a.xData=e[i]});this.dataMin=c;this.dataMax=d});t(r.prototype,"setAxisTranslation",function(a){var b=this.chart,c=b.plotWidth/b.plotHeight,d=this.isXAxis,e=b.xAxis[0];a.call(this);if(b.options.chart.type==="map"&&!d&&e.transA!==void 0)this.transA=e.transA=Math.min(this.transA,e.transA),a=(e.max-e.min)/(this.max-this.min),e=a>c?this:e,c=(e.max-e.min)*e.transA,e.minPixelPadding=
+(e.len-c)/2});t(y.prototype,"render",function(a){var b=this,c=b.options.mapNavigation;a.call(b);b.renderMapNavigation();c.zoomOnDoubleClick&&g.addEvent(b.container,"dblclick",function(a){b.pointer.onContainerDblClick(a)});c.zoomOnMouseWheel&&g.addEvent(b.container,document.onmousewheel===void 0?"DOMMouseScroll":"mousewheel",function(a){b.pointer.onContainerMouseWheel(a)})});v(z.prototype,{onContainerDblClick:function(a){var b=this.chart,a=this.normalize(a);b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-
+b.plotTop)&&b.mapZoom(0.5,b.xAxis[0].toValue(a.chartX),b.yAxis[0].toValue(a.chartY))},onContainerMouseWheel:function(a){var b=this.chart,c,a=this.normalize(a);c=a.detail||-(a.wheelDelta/120);b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&b.mapZoom(c>0?2:0.5,b.xAxis[0].toValue(a.chartX),b.yAxis[0].toValue(a.chartY))}});t(z.prototype,"init",function(a,b,c){a.call(this,b,c);if(c.mapNavigation.enableTouchZoom)this.pinchX=this.pinchHor=this.pinchY=this.pinchVert=!0});v(y.prototype,{renderMapNavigation:function(){var a=
+this,b=this.options.mapNavigation,c=b.buttons,d,e,f,i=function(){this.handler.call(a)};if(b.enableButtons)for(d in c)if(c.hasOwnProperty(d))f=p(b.buttonOptions,c[d]),e=a.renderer.button(f.text,0,0,i).attr({width:f.width,height:f.height}).css(f.style).add(),e.handler=f.onclick,e.align(v(f,{width:e.width,height:e.height}),null,"spacingBox")},fitToBox:function(a,b){l([["x","width"],["y","height"]],function(c){var d=c[0],c=c[1];a[d]+a[c]>b[d]+b[c]&&(a[c]>b[c]?(a[c]=b[c],a[d]=b[d]):a[d]=b[d]+b[c]-a[c]);
+a[c]>b[c]&&(a[c]=b[c]);a[d]<b[d]&&(a[d]=b[d])});return a},mapZoom:function(a,b,c){if(!this.isMapZooming){var d=this,e=d.xAxis[0],f=e.max-e.min,i=n(b,e.min+f/2),b=f*a,f=d.yAxis[0],h=f.max-f.min,c=n(c,f.min+h/2);a*=h;i-=b/2;h=c-a/2;c=n(d.options.chart.animation,!0);b=d.fitToBox({x:i,y:h,width:b,height:a},{x:e.dataMin,y:f.dataMin,width:e.dataMax-e.dataMin,height:f.dataMax-f.dataMin});e.setExtremes(b.x,b.x+b.width,!1);f.setExtremes(b.y,b.y+b.height,!1);if(e=c?c.duration||500:0)d.isMapZooming=!0,setTimeout(function(){d.isMapZooming=
+!1},e);d.redraw()}}});q.map=p(q.scatter,{animation:!1,nullColor:"#F8F8F8",borderColor:"silver",borderWidth:1,marker:null,stickyTracking:!1,dataLabels:{verticalAlign:"middle"},turboThreshold:0,tooltip:{followPointer:!0,pointFormat:"{point.name}: {point.y}<br/>"},states:{normal:{animation:!0}}});r=g.extendClass(s,{applyOptions:function(a,b){var c=s.prototype.applyOptions.call(this,a,b);if(c.path&&typeof c.path==="string")c.path=c.options.path=g.splitPath(c.path);return c},onMouseOver:function(){clearTimeout(this.colorInterval);
+s.prototype.onMouseOver.call(this)},onMouseOut:function(){var a=this,b=+new Date,c=u(a.options.color),d=u(a.pointAttr.hover.fill),e=a.series.options.states.normal.animation,f=e&&(e.duration||500);if(f&&c.rgba.length===4&&d.rgba.length===4)delete a.pointAttr[""].fill,clearTimeout(a.colorInterval),a.colorInterval=setInterval(function(){var e=(new Date-b)/f,h=a.graphic;e>1&&(e=1);h&&h.attr("fill",x(d,c,e));e>=1&&clearTimeout(a.colorInterval)},13);s.prototype.onMouseOut.call(a)}});k.map=g.extendClass(k.scatter,
+{type:"map",pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},colorKey:"y",pointClass:r,trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:w,supportsDrilldown:!0,getExtremesFromAll:!0,useMapGeometry:!0,init:function(a){var b=this,c=a.options.legend.valueDecimals,d=[],e,f,i,h,j,o,m;o=a.options.legend.layout==="horizontal";g.Series.prototype.init.apply(this,arguments);j=b.options.colorRange;if(h=b.options.valueRanges)l(h,function(a){f=a.from;i=a.to;e=
+"";f===void 0?e="< ":i===void 0&&(e="> ");f!==void 0&&(e+=A(f,c));f!==void 0&&i!==void 0&&(e+=" - ");i!==void 0&&(e+=A(i,c));d.push(g.extend({chart:b.chart,name:e,options:{},drawLegendSymbol:k.area.prototype.drawLegendSymbol,visible:!0,setState:function(){},setVisible:function(){}},a))}),b.legendItems=d;else if(j)f=j.from,i=j.to,h=j.fromLabel,j=j.toLabel,m=o?[0,0,1,0]:[0,1,0,0],o||(o=h,h=j,j=o),o={linearGradient:{x1:m[0],y1:m[1],x2:m[2],y2:m[3]},stops:[[0,f],[1,i]]},d=[{chart:b.chart,options:{},fromLabel:h,
+toLabel:j,color:o,drawLegendSymbol:this.drawLegendSymbolGradient,visible:!0,setState:function(){},setVisible:function(){}}],b.legendItems=d},drawLegendSymbol:k.area.prototype.drawLegendSymbol,drawLegendSymbolGradient:function(a,b){var c=a.options.symbolPadding,d=n(a.options.padding,8),e,f,i=this.chart.renderer.fontMetrics(a.options.itemStyle.fontSize).h,h=a.options.layout==="horizontal",j;j=n(a.options.rectangleLength,200);h?(e=-(c/2),f=0):(e=-j+a.baseline-c/2,f=d+i);b.fromText=this.chart.renderer.text(b.fromLabel,
+f,e).attr({zIndex:2}).add(b.legendGroup);f=b.fromText.getBBox();b.legendSymbol=this.chart.renderer.rect(h?f.x+f.width+c:f.x-i-c,f.y,h?j:i,h?i:j,2).attr({zIndex:1}).add(b.legendGroup);j=b.legendSymbol.getBBox();b.toText=this.chart.renderer.text(b.toLabel,j.x+j.width+c,h?e:j.y+j.height-c).attr({zIndex:2}).add(b.legendGroup);e=b.toText.getBBox();h?(a.offsetWidth=f.width+j.width+e.width+c*2+d,a.itemY=i+d):(a.offsetWidth=Math.max(f.width,e.width)+c+j.width+d,a.itemY=j.height+d,a.itemX=c)},getBox:function(a){var b=
+Number.MIN_VALUE,c=Number.MAX_VALUE,d=Number.MIN_VALUE,e=Number.MAX_VALUE;l(a||this.options.data,function(a){for(var i=a.path,h=i.length,j=!1,g=Number.MIN_VALUE,m=Number.MAX_VALUE,k=Number.MIN_VALUE,l=Number.MAX_VALUE;h--;)typeof i[h]==="number"&&!isNaN(i[h])&&(j?(g=Math.max(g,i[h]),m=Math.min(m,i[h])):(k=Math.max(k,i[h]),l=Math.min(l,i[h])),j=!j);a._maxX=g;a._minX=m;a._maxY=k;a._minY=l;b=Math.max(b,g);c=Math.min(c,m);d=Math.max(d,k);e=Math.min(e,l)});this.minY=e;this.maxY=d;this.minX=c;this.maxX=
+b},translatePath:function(a){var b=!1,c=this.xAxis,d=this.yAxis,e,a=[].concat(a);for(e=a.length;e--;)typeof a[e]==="number"&&(a[e]=b?Math.round(c.translate(a[e])):Math.round(d.len-d.translate(a[e])),b=!b);return a},setData:function(){g.Series.prototype.setData.apply(this,arguments);this.getBox()},translate:function(){var a=this,b=Number.MAX_VALUE,c=Number.MIN_VALUE;a.generatePoints();l(a.data,function(d){d.shapeType="path";d.shapeArgs={d:a.translatePath(d.path)};if(typeof d.y==="number")if(d.y>c)c=
+d.y;else if(d.y<b)b=d.y});a.translateColors(b,c)},translateColors:function(a,b){var c=this.options,d=c.valueRanges,e=c.colorRange,f=this.colorKey,i,h;e&&(i=u(e.from),h=u(e.to));l(this.data,function(g){var k=g[f],m,l,n;if(d)for(n=d.length;n--;){if(m=d[n],i=m.from,h=m.to,(i===void 0||k>=i)&&(h===void 0||k<=h)){l=m.color;break}}else e&&k!==void 0&&(m=1-(b-k)/(b-a),l=k===null?c.nullColor:x(i,h,m));if(l)g.color=null,g.options.color=l})},drawGraph:w,drawDataLabels:w,drawPoints:function(){var a=this.xAxis,
+b=this.yAxis,c=this.colorKey;l(this.data,function(a){a.plotY=1;if(a[c]===null)a[c]=0,a.isNull=!0});k.column.prototype.drawPoints.apply(this);l(this.data,function(d){var e=d.dataLabels,f=a.toPixels(d._minX,!0),g=a.toPixels(d._maxX,!0),h=b.toPixels(d._minY,!0),j=b.toPixels(d._maxY,!0);d.plotX=Math.round(f+(g-f)*n(e&&e.anchorX,0.5));d.plotY=Math.round(h+(j-h)*n(e&&e.anchorY,0.5));d.isNull&&(d[c]=null)});g.Series.prototype.drawDataLabels.call(this)},animateDrilldown:function(a){var b=this.chart.plotBox,
+c=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],d=c.bBox,e=this.chart.options.drilldown.animation;if(!a)a=Math.min(d.width/b.width,d.height/b.height),c.shapeArgs={scaleX:a,scaleY:a,translateX:d.x,translateY:d.y},l(this.points,function(a){a.graphic.attr(c.shapeArgs).animate({scaleX:1,scaleY:1,translateX:0,translateY:0},e)}),delete this.animate},animateDrillupFrom:function(a){k.column.prototype.animateDrillupFrom.call(this,a)},animateDrillupTo:function(a){k.column.prototype.animateDrillupTo.call(this,
+a)}});q.mapline=p(q.map,{lineWidth:1,backgroundColor:"none"});k.mapline=g.extendClass(k.map,{type:"mapline",pointAttrToOptions:{stroke:"color","stroke-width":"lineWidth",fill:"backgroundColor"},drawLegendSymbol:k.line.prototype.drawLegendSymbol});q.mappoint=p(q.scatter,{dataLabels:{enabled:!0,format:"{point.name}",color:"black",style:{textShadow:"0 0 5px white"}}});k.mappoint=g.extendClass(k.scatter,{type:"mappoint"});g.Map=function(a,b){var c={endOnTick:!1,gridLineWidth:0,labels:{enabled:!1},lineWidth:0,
+minPadding:0,maxPadding:0,startOnTick:!1,tickWidth:0,title:null},d;d=a.series;a.series=null;a=p({chart:{type:"map",panning:"xy"},xAxis:c,yAxis:p(c,{reversed:!0})},a,{chart:{inverted:!1}});a.series=d;return new g.Chart(a,b)}})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/map.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/map.src.js
new file mode 100644
index 0000000..6af8e21
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/map.src.js
@@ -0,0 +1,1002 @@
+/**
+ * @license Map plugin v0.1 for Highcharts
+ *
+ * (c) 2011-2013 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+/* 
+ * See www.highcharts.com/studies/world-map.htm for use case.
+ *
+ * To do:
+ * - Optimize long variable names and alias adapter methods and Highcharts namespace variables
+ * - Zoom and pan GUI
+ */
+(function (Highcharts) {
+	var UNDEFINED,
+		Axis = Highcharts.Axis,
+		Chart = Highcharts.Chart,
+		Point = Highcharts.Point,
+		Pointer = Highcharts.Pointer,
+		each = Highcharts.each,
+		extend = Highcharts.extend,
+		merge = Highcharts.merge,
+		pick = Highcharts.pick,
+		numberFormat = Highcharts.numberFormat,
+		defaultOptions = Highcharts.getOptions(),
+		seriesTypes = Highcharts.seriesTypes,
+		plotOptions = defaultOptions.plotOptions,
+		wrap = Highcharts.wrap,
+		Color = Highcharts.Color,
+		noop = function () {};
+
+	
+
+	/*
+	 * Return an intermediate color between two colors, according to pos where 0
+	 * is the from color and 1 is the to color
+	 */
+	function tweenColors(from, to, pos) {
+		var i = 4,
+			rgba = [];
+
+		while (i--) {
+			rgba[i] = Math.round(
+				to.rgba[i] + (from.rgba[i] - to.rgba[i]) * (1 - pos)
+			);
+		}
+		return 'rgba(' + rgba.join(',') + ')';
+	}
+
+	// Set the default map navigation options
+	defaultOptions.mapNavigation = {
+		buttonOptions: {
+			align: 'right',
+			verticalAlign: 'bottom',
+			x: 0,
+			width: 18,
+			height: 18,
+			style: {
+				fontSize: '15px',
+				fontWeight: 'bold',
+				textAlign: 'center'
+			}
+		},
+		buttons: {
+			zoomIn: {
+				onclick: function () {
+					this.mapZoom(0.5);
+				},
+				text: '+',
+				y: -32
+			},
+			zoomOut: {
+				onclick: function () {
+					this.mapZoom(2);
+				},
+				text: '-',
+				y: 0
+			}
+		}
+		// enableButtons: false,
+		// enableTouchZoom: false,
+		// zoomOnDoubleClick: false,
+		// zoomOnMouseWheel: false
+
+	};
+	
+	/**
+	 * Utility for reading SVG paths directly.
+	 */
+	Highcharts.splitPath = function (path) {
+		var i;
+
+		// Move letters apart
+		path = path.replace(/([A-Za-z])/g, ' $1 ');
+		// Trim
+		path = path.replace(/^\s*/, "").replace(/\s*$/, "");
+		
+		// Split on spaces and commas
+		path = path.split(/[ ,]+/);
+		
+		// Parse numbers
+		for (i = 0; i < path.length; i++) {
+			if (!/[a-zA-Z]/.test(path[i])) {
+				path[i] = parseFloat(path[i]);
+			}
+		}
+		return path;
+	};
+
+	// A placeholder for map definitions
+	Highcharts.maps = {};
+	
+	/**
+	 * Override to use the extreme coordinates from the SVG shape, not the
+	 * data values
+	 */
+	wrap(Axis.prototype, 'getSeriesExtremes', function (proceed) {
+		var isXAxis = this.isXAxis,
+			dataMin,
+			dataMax,
+			xData = [];
+
+		// Remove the xData array and cache it locally so that the proceed method doesn't use it
+		each(this.series, function (series, i) {
+			if (series.useMapGeometry) {
+				xData[i] = series.xData;
+				series.xData = [];
+			}
+		});
+
+		// Call base to reach normal cartesian series (like mappoint)
+		proceed.call(this);
+
+		// Run extremes logic for map and mapline
+		dataMin = pick(this.dataMin, Number.MAX_VALUE);
+		dataMax = pick(this.dataMax, Number.MIN_VALUE);
+		each(this.series, function (series, i) {
+			if (series.useMapGeometry) {
+				dataMin = Math.min(dataMin, series[isXAxis ? 'minX' : 'minY']);
+				dataMax = Math.max(dataMax, series[isXAxis ? 'maxX' : 'maxY']);
+				series.xData = xData[i]; // Reset xData array
+			}
+		});
+		
+		this.dataMin = dataMin;
+		this.dataMax = dataMax;
+	});
+	
+	/**
+	 * Override axis translation to make sure the aspect ratio is always kept
+	 */
+	wrap(Axis.prototype, 'setAxisTranslation', function (proceed) {
+		var chart = this.chart,
+			mapRatio,
+			plotRatio = chart.plotWidth / chart.plotHeight,
+			isXAxis = this.isXAxis,
+			adjustedAxisLength,
+			xAxis = chart.xAxis[0],
+			padAxis;
+		
+		// Run the parent method
+		proceed.call(this);
+		
+		// On Y axis, handle both
+		if (chart.options.chart.type === 'map' && !isXAxis && xAxis.transA !== UNDEFINED) {
+			
+			// Use the same translation for both axes
+			this.transA = xAxis.transA = Math.min(this.transA, xAxis.transA);
+			
+			mapRatio = (xAxis.max - xAxis.min) / (this.max - this.min);
+			
+			// What axis to pad to put the map in the middle
+			padAxis = mapRatio > plotRatio ? this : xAxis;
+			
+			// Pad it
+			adjustedAxisLength = (padAxis.max - padAxis.min) * padAxis.transA;
+			padAxis.minPixelPadding = (padAxis.len - adjustedAxisLength) / 2;
+		}
+	});
+
+
+	//--- Start zooming and panning features
+
+	wrap(Chart.prototype, 'render', function (proceed) {
+		var chart = this,
+			mapNavigation = chart.options.mapNavigation;
+
+		proceed.call(chart);
+
+		// Render the plus and minus buttons
+		chart.renderMapNavigation();
+
+		// Add the double click event
+		if (mapNavigation.zoomOnDoubleClick) {
+			Highcharts.addEvent(chart.container, 'dblclick', function (e) {
+				chart.pointer.onContainerDblClick(e);
+			});
+		}
+
+		// Add the mousewheel event
+		if (mapNavigation.zoomOnMouseWheel) {
+			Highcharts.addEvent(chart.container, document.onmousewheel === undefined ? 'DOMMouseScroll' : 'mousewheel', function (e) {
+				chart.pointer.onContainerMouseWheel(e);
+			});
+		}
+	});
+
+	// Extend the Pointer
+	extend(Pointer.prototype, {
+
+		/**
+		 * The event handler for the doubleclick event
+		 */
+		onContainerDblClick: function (e) {
+			var chart = this.chart;
+
+			e = this.normalize(e);
+
+			if (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+				chart.mapZoom(
+					0.5,
+					chart.xAxis[0].toValue(e.chartX),
+					chart.yAxis[0].toValue(e.chartY)
+				);
+			}
+		},
+
+		/**
+		 * The event handler for the mouse scroll event
+		 */
+		onContainerMouseWheel: function (e) {
+			var chart = this.chart,
+				delta;
+
+			e = this.normalize(e);
+
+			// Firefox uses e.detail, WebKit and IE uses wheelDelta
+			delta = e.detail || -(e.wheelDelta / 120);
+			if (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+				chart.mapZoom(
+					delta > 0 ? 2 : 0.5,
+					chart.xAxis[0].toValue(e.chartX),
+					chart.yAxis[0].toValue(e.chartY)
+				);
+			}
+		}
+	});
+	// Implement the pinchType option
+	wrap(Pointer.prototype, 'init', function (proceed, chart, options) {
+
+		proceed.call(this, chart, options);
+
+		// Pinch status
+		if (options.mapNavigation.enableTouchZoom) {
+			this.pinchX = this.pinchHor = 
+				this.pinchY = this.pinchVert = true;
+		}
+	});
+
+	// Add events to the Chart object itself
+	extend(Chart.prototype, {
+		renderMapNavigation: function () {
+			var chart = this,
+				options = this.options.mapNavigation,
+				buttons = options.buttons,
+				n,
+				button,
+				buttonOptions,
+				outerHandler = function () { 
+					this.handler.call(chart); 
+				};
+
+			if (options.enableButtons) {
+				for (n in buttons) {
+					if (buttons.hasOwnProperty(n)) {
+						buttonOptions = merge(options.buttonOptions, buttons[n]);
+
+						button = chart.renderer.button(buttonOptions.text, 0, 0, outerHandler)
+							.attr({
+								width: buttonOptions.width,
+								height: buttonOptions.height
+							})
+							.css(buttonOptions.style)
+							.add();
+						button.handler = buttonOptions.onclick;
+						button.align(extend(buttonOptions, { width: button.width, height: button.height }), null, 'spacingBox');
+					}
+				}
+			}
+		},
+
+		/**
+		 * Fit an inner box to an outer. If the inner box overflows left or right, align it to the sides of the
+		 * outer. If it overflows both sides, fit it within the outer. This is a pattern that occurs more places
+		 * in Highcharts, perhaps it should be elevated to a common utility function.
+		 */
+		fitToBox: function (inner, outer) {
+			each([['x', 'width'], ['y', 'height']], function (dim) {
+				var pos = dim[0],
+					size = dim[1];
+				if (inner[pos] + inner[size] > outer[pos] + outer[size]) { // right overflow
+					if (inner[size] > outer[size]) { // the general size is greater, fit fully to outer
+						inner[size] = outer[size];
+						inner[pos] = outer[pos];
+					} else { // align right
+						inner[pos] = outer[pos] + outer[size] - inner[size];
+					}
+				}
+				if (inner[size] > outer[size]) {
+					inner[size] = outer[size];
+				}
+				if (inner[pos] < outer[pos]) {
+					inner[pos] = outer[pos];
+				}
+				
+			});
+
+			return inner;
+		},
+
+		/**
+		 * Zoom the map in or out by a certain amount. Less than 1 zooms in, greater than 1 zooms out.
+		 */
+		mapZoom: function (howMuch, centerXArg, centerYArg) {
+
+			if (this.isMapZooming) {
+				return;
+			}
+
+			var chart = this,
+				xAxis = chart.xAxis[0],
+				xRange = xAxis.max - xAxis.min,
+				centerX = pick(centerXArg, xAxis.min + xRange / 2),
+				newXRange = xRange * howMuch,
+				yAxis = chart.yAxis[0],
+				yRange = yAxis.max - yAxis.min,
+				centerY = pick(centerYArg, yAxis.min + yRange / 2),
+				newYRange = yRange * howMuch,
+				newXMin = centerX - newXRange / 2,
+				newYMin = centerY - newYRange / 2,
+				animation = pick(chart.options.chart.animation, true),
+				delay,
+				newExt = chart.fitToBox({
+					x: newXMin,
+					y: newYMin,
+					width: newXRange,
+					height: newYRange
+				}, {
+					x: xAxis.dataMin,
+					y: yAxis.dataMin,
+					width: xAxis.dataMax - xAxis.dataMin,
+					height: yAxis.dataMax - yAxis.dataMin
+				});
+
+			xAxis.setExtremes(newExt.x, newExt.x + newExt.width, false);
+			yAxis.setExtremes(newExt.y, newExt.y + newExt.height, false);
+
+			// Prevent zooming until this one is finished animating
+			delay = animation ? animation.duration || 500 : 0;
+			if (delay) {
+				chart.isMapZooming = true;
+				setTimeout(function () {
+					chart.isMapZooming = false;
+				}, delay);
+			}
+
+			chart.redraw();
+		}
+	});
+	
+	/**
+	 * Extend the default options with map options
+	 */
+	plotOptions.map = merge(plotOptions.scatter, {
+		animation: false, // makes the complex shapes slow
+		nullColor: '#F8F8F8',
+		borderColor: 'silver',
+		borderWidth: 1,
+		marker: null,
+		stickyTracking: false,
+		dataLabels: {
+			verticalAlign: 'middle'
+		},
+		turboThreshold: 0,
+		tooltip: {
+			followPointer: true,
+			pointFormat: '{point.name}: {point.y}<br/>'
+		},
+		states: {
+			normal: {
+				animation: true
+			}
+		}
+	});
+
+	var MapAreaPoint = Highcharts.extendClass(Point, {
+		/**
+		 * Extend the Point object to split paths
+		 */
+		applyOptions: function (options, x) {
+
+			var point = Point.prototype.applyOptions.call(this, options, x);
+
+			if (point.path && typeof point.path === 'string') {
+				point.path = point.options.path = Highcharts.splitPath(point.path);
+			}
+
+			return point;
+		},
+		/**
+		 * Stop the fade-out 
+		 */
+		onMouseOver: function () {
+			clearTimeout(this.colorInterval);
+			Point.prototype.onMouseOver.call(this);
+		},
+		/**
+		 * Custom animation for tweening out the colors. Animation reduces blinking when hovering
+		 * over islands and coast lines. We run a custom implementation of animation becuase we
+		 * need to be able to run this independently from other animations like zoom redraw. Also,
+		 * adding color animation to the adapters would introduce almost the same amount of code.
+		 */
+		onMouseOut: function () {
+			var point = this,
+				start = +new Date(),
+				normalColor = Color(point.options.color),
+				hoverColor = Color(point.pointAttr.hover.fill),
+				animation = point.series.options.states.normal.animation,
+				duration = animation && (animation.duration || 500);
+
+			if (duration && normalColor.rgba.length === 4 && hoverColor.rgba.length === 4) {
+				delete point.pointAttr[''].fill; // avoid resetting it in Point.setState
+
+				clearTimeout(point.colorInterval);
+				point.colorInterval = setInterval(function () {
+					var pos = (new Date() - start) / duration,
+						graphic = point.graphic;
+					if (pos > 1) {
+						pos = 1;
+					}
+					if (graphic) {
+						graphic.attr('fill', tweenColors(hoverColor, normalColor, pos));
+					}
+					if (pos >= 1) {
+						clearTimeout(point.colorInterval);
+					}
+				}, 13);
+			}
+			Point.prototype.onMouseOut.call(point);
+		}
+	});
+
+	/**
+	 * Add the series type
+	 */
+	seriesTypes.map = Highcharts.extendClass(seriesTypes.scatter, {
+		type: 'map',
+		pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+			stroke: 'borderColor',
+			'stroke-width': 'borderWidth',
+			fill: 'color'
+		},
+		colorKey: 'y',
+		pointClass: MapAreaPoint,
+		trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],
+		getSymbol: noop,
+		supportsDrilldown: true,
+		getExtremesFromAll: true,
+		useMapGeometry: true, // get axis extremes from paths, not values
+		init: function (chart) {
+			var series = this,
+				valueDecimals = chart.options.legend.valueDecimals,
+				legendItems = [],
+				name,
+				from,
+				to,
+				fromLabel,
+				toLabel,
+				colorRange,
+				valueRanges,
+				gradientColor,
+				grad,
+				tmpLabel,
+				horizontal = chart.options.legend.layout === 'horizontal';
+
+			
+			Highcharts.Series.prototype.init.apply(this, arguments);
+			colorRange = series.options.colorRange;
+			valueRanges = series.options.valueRanges;
+
+			if (valueRanges) {
+				each(valueRanges, function (range) {
+					from = range.from;
+					to = range.to;
+					
+					// Assemble the default name. This can be overridden by legend.options.labelFormatter
+					name = '';
+					if (from === UNDEFINED) {
+						name = '< ';
+					} else if (to === UNDEFINED) {
+						name = '> ';
+					}
+					if (from !== UNDEFINED) {
+						name += numberFormat(from, valueDecimals);
+					}
+					if (from !== UNDEFINED && to !== UNDEFINED) {
+						name += ' - ';
+					}
+					if (to !== UNDEFINED) {
+						name += numberFormat(to, valueDecimals);
+					}
+					
+					// Add a mock object to the legend items
+					legendItems.push(Highcharts.extend({
+						chart: series.chart,
+						name: name,
+						options: {},
+						drawLegendSymbol: seriesTypes.area.prototype.drawLegendSymbol,
+						visible: true,
+						setState: function () {},
+						setVisible: function () {}
+					}, range));
+				});
+				series.legendItems = legendItems;
+
+			} else if (colorRange) {
+
+				from = colorRange.from;
+				to = colorRange.to;
+				fromLabel = colorRange.fromLabel;
+				toLabel = colorRange.toLabel;
+
+				// Flips linearGradient variables and label text.
+				grad = horizontal ? [0, 0, 1, 0] : [0, 1, 0, 0]; 
+				if (!horizontal) {
+					tmpLabel = fromLabel;
+					fromLabel = toLabel;
+					toLabel = tmpLabel;
+				} 
+
+				// Creates color gradient.
+				gradientColor = {
+					linearGradient: { x1: grad[0], y1: grad[1], x2: grad[2], y2: grad[3] },
+					stops: 
+					[
+						[0, from],
+						[1, to]
+					]
+				};
+
+				// Add a mock object to the legend items.
+				legendItems = [{
+					chart: series.chart,
+					options: {},
+					fromLabel: fromLabel,
+					toLabel: toLabel,
+					color: gradientColor,
+					drawLegendSymbol: this.drawLegendSymbolGradient,
+					visible: true,
+					setState: function () {},
+					setVisible: function () {}
+				}];
+
+				series.legendItems = legendItems;
+			}
+		},
+
+		/**
+		 * If neither valueRanges nor colorRanges are defined, use basic area symbol.
+		 */
+		drawLegendSymbol: seriesTypes.area.prototype.drawLegendSymbol,
+
+		/**
+		 * Gets the series' symbol in the legend and extended legend with more information.
+		 * 
+		 * @param {Object} legend The legend object
+		 * @param {Object} item The series (this) or point
+		 */
+		drawLegendSymbolGradient: function (legend, item) {
+			var spacing = legend.options.symbolPadding,
+				padding = pick(legend.options.padding, 8),
+				positionY,
+				positionX,
+				gradientSize = this.chart.renderer.fontMetrics(legend.options.itemStyle.fontSize).h,
+				horizontal = legend.options.layout === 'horizontal',
+				box1,
+				box2,
+				box3,
+				rectangleLength = pick(legend.options.rectangleLength, 200);
+
+			// Set local variables based on option.
+			if (horizontal) {
+				positionY = -(spacing / 2);
+				positionX = 0;
+			} else {
+				positionY = -rectangleLength + legend.baseline - (spacing / 2);
+				positionX = padding + gradientSize;
+			}
+
+			// Creates the from text.
+			item.fromText = this.chart.renderer.text(
+					item.fromLabel,	// Text.
+					positionX,		// Lower left x.
+					positionY		// Lower left y.
+				).attr({
+					zIndex: 2
+				}).add(item.legendGroup);
+			box1 = item.fromText.getBBox();
+
+			// Creates legend symbol.
+			// Ternary changes variables based on option.
+			item.legendSymbol = this.chart.renderer.rect(
+				horizontal ? box1.x + box1.width + spacing : box1.x - gradientSize - spacing,		// Upper left x.
+				box1.y,																				// Upper left y.
+				horizontal ? rectangleLength : gradientSize,											// Width.
+				horizontal ? gradientSize : rectangleLength,										// Height.
+				2																					// Corner radius.
+			).attr({
+				zIndex: 1
+			}).add(item.legendGroup);
+			box2 = item.legendSymbol.getBBox();
+
+			// Creates the to text.
+			// Vertical coordinate changed based on option.
+			item.toText = this.chart.renderer.text(
+					item.toLabel,
+					box2.x + box2.width + spacing,
+					horizontal ? positionY : box2.y + box2.height - spacing
+				).attr({
+					zIndex: 2
+				}).add(item.legendGroup);
+			box3 = item.toText.getBBox();
+
+			// Changes legend box settings based on option.
+			if (horizontal) {
+				legend.offsetWidth = box1.width + box2.width + box3.width + (spacing * 2) + padding;
+				legend.itemY = gradientSize + padding;
+			} else {
+				legend.offsetWidth = Math.max(box1.width, box3.width) + (spacing) + box2.width + padding;
+				legend.itemY = box2.height + padding;
+				legend.itemX = spacing;
+			}
+		},
+
+		/**
+		 * Get the bounding box of all paths in the map combined.
+		 */
+		getBox: function (paths) {
+			var maxX = Number.MIN_VALUE, 
+				minX =  Number.MAX_VALUE, 
+				maxY = Number.MIN_VALUE, 
+				minY =  Number.MAX_VALUE;
+			
+			
+			// Find the bounding box
+			each(paths || this.options.data, function (point) {
+				var path = point.path,
+					i = path.length,
+					even = false, // while loop reads from the end
+					pointMaxX = Number.MIN_VALUE, 
+					pointMinX =  Number.MAX_VALUE, 
+					pointMaxY = Number.MIN_VALUE, 
+					pointMinY =  Number.MAX_VALUE;
+					
+				while (i--) {
+					if (typeof path[i] === 'number' && !isNaN(path[i])) {
+						if (even) { // even = x
+							pointMaxX = Math.max(pointMaxX, path[i]);
+							pointMinX = Math.min(pointMinX, path[i]);
+						} else { // odd = Y
+							pointMaxY = Math.max(pointMaxY, path[i]);
+							pointMinY = Math.min(pointMinY, path[i]);
+						}
+						even = !even;
+					}
+				}
+				// Cache point bounding box for use to position data labels
+				point._maxX = pointMaxX;
+				point._minX = pointMinX;
+				point._maxY = pointMaxY;
+				point._minY = pointMinY;
+
+				maxX = Math.max(maxX, pointMaxX);
+				minX = Math.min(minX, pointMinX);
+				maxY = Math.max(maxY, pointMaxY);
+				minY = Math.min(minY, pointMinY);
+			});
+			this.minY = minY;
+			this.maxY = maxY;
+			this.minX = minX;
+			this.maxX = maxX;
+			
+		},
+		
+		
+		
+		/**
+		 * Translate the path so that it automatically fits into the plot area box
+		 * @param {Object} path
+		 */
+		translatePath: function (path) {
+			
+			var series = this,
+				even = false, // while loop reads from the end
+				xAxis = series.xAxis,
+				yAxis = series.yAxis,
+				i;
+				
+			// Preserve the original
+			path = [].concat(path);
+				
+			// Do the translation
+			i = path.length;
+			while (i--) {
+				if (typeof path[i] === 'number') {
+					if (even) { // even = x
+						path[i] = Math.round(xAxis.translate(path[i]));
+					} else { // odd = Y
+						path[i] = Math.round(yAxis.len - yAxis.translate(path[i]));
+					}
+					even = !even;
+				}
+			}
+			return path;
+		},
+		
+		setData: function () {
+			Highcharts.Series.prototype.setData.apply(this, arguments);
+			this.getBox();
+		},
+		
+		/**
+		 * Add the path option for data points. Find the max value for color calculation.
+		 */
+		translate: function () {
+			var series = this,
+				dataMin = Number.MAX_VALUE,
+				dataMax = Number.MIN_VALUE;
+	
+			series.generatePoints();
+	
+			each(series.data, function (point) {
+				
+				point.shapeType = 'path';
+				point.shapeArgs = {
+					d: series.translatePath(point.path)
+				};
+				
+				// TODO: do point colors in drawPoints instead of point.init
+				if (typeof point.y === 'number') {
+					if (point.y > dataMax) {
+						dataMax = point.y;
+					} else if (point.y < dataMin) {
+						dataMin = point.y;
+					}
+				}
+			});
+			
+			series.translateColors(dataMin, dataMax);
+		},
+		
+		/**
+		 * In choropleth maps, the color is a result of the value, so this needs translation too
+		 */
+		translateColors: function (dataMin, dataMax) {
+			
+			var seriesOptions = this.options,
+				valueRanges = seriesOptions.valueRanges,
+				colorRange = seriesOptions.colorRange,
+				colorKey = this.colorKey,
+				from,
+				to;
+
+			if (colorRange) {
+				from = Color(colorRange.from);
+				to = Color(colorRange.to);
+			}
+			
+			each(this.data, function (point) {
+				var value = point[colorKey],
+					range,
+					color,
+					i,
+					pos;
+
+				if (valueRanges) {
+					i = valueRanges.length;
+					while (i--) {
+						range = valueRanges[i];
+						from = range.from;
+						to = range.to;
+						if ((from === UNDEFINED || value >= from) && (to === UNDEFINED || value <= to)) {
+							color = range.color;
+							break;
+						}
+							
+					}
+				} else if (colorRange && value !== undefined) {
+
+					pos = 1 - ((dataMax - value) / (dataMax - dataMin));
+					color = value === null ? seriesOptions.nullColor : tweenColors(from, to, pos);
+				}
+
+				if (color) {
+					point.color = null; // reset from previous drilldowns, use of the same data options
+					point.options.color = color;
+				}
+			});
+		},
+		
+		drawGraph: noop,
+		
+		/**
+		 * We need the points' bounding boxes in order to draw the data labels, so 
+		 * we skip it now and call if from drawPoints instead.
+		 */
+		drawDataLabels: noop,
+		
+		/** 
+		 * Use the drawPoints method of column, that is able to handle simple shapeArgs.
+		 * Extend it by assigning the tooltip position.
+		 */
+		drawPoints: function () {
+			var series = this,
+				xAxis = series.xAxis,
+				yAxis = series.yAxis,
+				colorKey = series.colorKey;
+			
+			// Make points pass test in drawing
+			each(series.data, function (point) {
+				point.plotY = 1; // pass null test in column.drawPoints
+				if (point[colorKey] === null) {
+					point[colorKey] = 0;
+					point.isNull = true;
+				}
+			});
+			
+			// Draw them
+			seriesTypes.column.prototype.drawPoints.apply(series);
+			
+			each(series.data, function (point) {
+
+				var dataLabels = point.dataLabels,
+					minX = xAxis.toPixels(point._minX, true),
+					maxX = xAxis.toPixels(point._maxX, true),
+					minY = yAxis.toPixels(point._minY, true),
+					maxY = yAxis.toPixels(point._maxY, true);
+
+				point.plotX = Math.round(minX + (maxX - minX) * pick(dataLabels && dataLabels.anchorX, 0.5));
+				point.plotY = Math.round(minY + (maxY - minY) * pick(dataLabels && dataLabels.anchorY, 0.5)); 
+				
+				
+				// Reset escaped null points
+				if (point.isNull) {
+					point[colorKey] = null;
+				}
+			});
+
+			// Now draw the data labels
+			Highcharts.Series.prototype.drawDataLabels.call(series);
+			
+		},
+
+		/**
+		 * Animate in the new series from the clicked point in the old series.
+		 * Depends on the drilldown.js module
+		 */
+		animateDrilldown: function (init) {
+			var toBox = this.chart.plotBox,
+				level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],
+				fromBox = level.bBox,
+				animationOptions = this.chart.options.drilldown.animation,
+				scale;
+				
+			if (!init) {
+
+				scale = Math.min(fromBox.width / toBox.width, fromBox.height / toBox.height);
+				level.shapeArgs = {
+					scaleX: scale,
+					scaleY: scale,
+					translateX: fromBox.x,
+					translateY: fromBox.y
+				};
+				
+				// TODO: Animate this.group instead
+				each(this.points, function (point) {
+
+					point.graphic
+						.attr(level.shapeArgs)
+						.animate({
+							scaleX: 1,
+							scaleY: 1,
+							translateX: 0,
+							translateY: 0
+						}, animationOptions);
+
+				});
+
+				delete this.animate;
+			}
+			
+		},
+
+		/**
+		 * When drilling up, pull out the individual point graphics from the lower series
+		 * and animate them into the origin point in the upper series.
+		 */
+		animateDrillupFrom: function (level) {
+			seriesTypes.column.prototype.animateDrillupFrom.call(this, level);
+		},
+
+
+		/**
+		 * When drilling up, keep the upper series invisible until the lower series has
+		 * moved into place
+		 */
+		animateDrillupTo: function (init) {
+			seriesTypes.column.prototype.animateDrillupTo.call(this, init);
+		}
+	});
+
+
+	// The mapline series type
+	plotOptions.mapline = merge(plotOptions.map, {
+		lineWidth: 1,
+		backgroundColor: 'none'
+	});
+	seriesTypes.mapline = Highcharts.extendClass(seriesTypes.map, {
+		type: 'mapline',
+		pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+			stroke: 'color',
+			'stroke-width': 'lineWidth',
+			fill: 'backgroundColor'
+		},
+		drawLegendSymbol: seriesTypes.line.prototype.drawLegendSymbol
+	});
+
+	// The mappoint series type
+	plotOptions.mappoint = merge(plotOptions.scatter, {
+		dataLabels: {
+			enabled: true,
+			format: '{point.name}',
+			color: 'black',
+			style: {
+				textShadow: '0 0 5px white'
+			}
+		}
+	});
+	seriesTypes.mappoint = Highcharts.extendClass(seriesTypes.scatter, {
+		type: 'mappoint'
+	});
+	
+
+	
+	/**
+	 * A wrapper for Chart with all the default values for a Map
+	 */
+	Highcharts.Map = function (options, callback) {
+		
+		var hiddenAxis = {
+				endOnTick: false,
+				gridLineWidth: 0,
+				labels: {
+					enabled: false
+				},
+				lineWidth: 0,
+				minPadding: 0,
+				maxPadding: 0,
+				startOnTick: false,
+				tickWidth: 0,
+				title: null
+			},
+			seriesOptions;
+		
+		// Don't merge the data
+		seriesOptions = options.series;
+		options.series = null;
+		
+		options = merge({
+			chart: {
+				type: 'map',
+				panning: 'xy'
+			},
+			xAxis: hiddenAxis,
+			yAxis: merge(hiddenAxis, { reversed: true })	
+		},
+		options, // user's options
+	
+		{ // forced options
+			chart: {
+				inverted: false
+			}
+		});
+	
+		options.series = seriesOptions;
+	
+	
+		return new Highcharts.Chart(options, callback);
+	};
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/no-data-to-display.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/no-data-to-display.js
new file mode 100644
index 0000000..c9ff9ca
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/no-data-to-display.js
@@ -0,0 +1,12 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+ Plugin for displaying a message when there is no data visible in chart.
+
+ (c) 2010-2013 Highsoft AS
+ Author: Øystein Moseng
+
+ License: www.highcharts.com/license
+*/
+(function(c){function f(){return!!this.points.length}function g(){this.hasData()?this.hideNoData():this.showNoData()}var d=c.seriesTypes,e=c.Chart.prototype,h=c.getOptions(),i=c.extend;i(h.lang,{noData:"No data to display"});h.noData={position:{x:0,y:0,align:"center",verticalAlign:"middle"},attr:{},style:{fontWeight:"bold",fontSize:"12px",color:"#60606a"}};d.pie.prototype.hasData=f;if(d.gauge)d.gauge.prototype.hasData=f;if(d.waterfall)d.waterfall.prototype.hasData=f;c.Series.prototype.hasData=function(){return this.dataMax!==
+void 0&&this.dataMin!==void 0};e.showNoData=function(a){var b=this.options,a=a||b.lang.noData,b=b.noData;if(!this.noDataLabel)this.noDataLabel=this.renderer.label(a,0,0,null,null,null,null,null,"no-data").attr(b.attr).css(b.style).add(),this.noDataLabel.align(i(this.noDataLabel.getBBox(),b.position),!1,"plotBox")};e.hideNoData=function(){if(this.noDataLabel)this.noDataLabel=this.noDataLabel.destroy()};e.hasData=function(){for(var a=this.series,b=a.length;b--;)if(a[b].hasData()&&!a[b].options.isInternal)return!0;
+return!1};e.callbacks.push(function(a){c.addEvent(a,"load",g);c.addEvent(a,"redraw",g)})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/no-data-to-display.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/no-data-to-display.src.js
new file mode 100644
index 0000000..bc278a8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/modules/no-data-to-display.src.js
@@ -0,0 +1,128 @@
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ * Plugin for displaying a message when there is no data visible in chart.
+ *
+ * (c) 2010-2013 Highsoft AS
+ * Author: Øystein Moseng
+ *
+ * License: www.highcharts.com/license
+ */
+
+(function (H) { // docs
+	
+	var seriesTypes = H.seriesTypes,
+		chartPrototype = H.Chart.prototype,
+		defaultOptions = H.getOptions(),
+		extend = H.extend;
+
+	// Add language option
+	extend(defaultOptions.lang, {
+		noData: 'No data to display'
+	});
+	
+	// Add default display options for message
+	defaultOptions.noData = {
+		position: {
+			x: 0,
+			y: 0,			
+			align: 'center',
+			verticalAlign: 'middle'
+		},
+		attr: {						
+		},
+		style: {	
+			fontWeight: 'bold',		
+			fontSize: '12px',
+			color: '#60606a'		
+		}
+	};
+
+	/**
+	 * Define hasData functions for series. These return true if there are data points on this series within the plot area
+	 */	
+	function hasDataPie() {
+		return !!this.points.length; /* != 0 */
+	}
+
+	seriesTypes.pie.prototype.hasData = hasDataPie;
+
+	if (seriesTypes.gauge) {
+		seriesTypes.gauge.prototype.hasData = hasDataPie;
+	}
+
+	if (seriesTypes.waterfall) {
+		seriesTypes.waterfall.prototype.hasData = hasDataPie;
+	}
+
+	H.Series.prototype.hasData = function () {
+		return this.dataMax !== undefined && this.dataMin !== undefined;
+	};
+	
+	/**
+	 * Display a no-data message.
+	 *
+	 * @param {String} str An optional message to show in place of the default one 
+	 */
+	chartPrototype.showNoData = function (str) {
+		var chart = this,
+			options = chart.options,
+			text = str || options.lang.noData,
+			noDataOptions = options.noData;
+
+		if (!chart.noDataLabel) {
+			chart.noDataLabel = chart.renderer.label(text, 0, 0, null, null, null, null, null, 'no-data')
+				.attr(noDataOptions.attr)
+				.css(noDataOptions.style)
+				.add();
+			chart.noDataLabel.align(extend(chart.noDataLabel.getBBox(), noDataOptions.position), false, 'plotBox');
+		}
+	};
+
+	/**
+	 * Hide no-data message	
+	 */	
+	chartPrototype.hideNoData = function () {
+		var chart = this;
+		if (chart.noDataLabel) {
+			chart.noDataLabel = chart.noDataLabel.destroy();
+		}
+	};
+
+	/**
+	 * Returns true if there are data points within the plot area now
+	 */	
+	chartPrototype.hasData = function () {
+		var chart = this,
+			series = chart.series,
+			i = series.length;
+
+		while (i--) {
+			if (series[i].hasData() && !series[i].options.isInternal) { 
+				return true;
+			}	
+		}
+
+		return false;
+	};
+
+	/**
+	 * Show no-data message if there is no data in sight. Otherwise, hide it.
+	 */
+	function handleNoData() {
+		var chart = this;
+		if (chart.hasData()) {
+			chart.hideNoData();
+		} else {
+			chart.showNoData();
+		}
+	}
+
+	/**
+	 * Add event listener to handle automatic display of no-data message
+	 */
+	chartPrototype.callbacks.push(function (chart) {
+		H.addEvent(chart, 'load', handleNoData);
+		H.addEvent(chart, 'redraw', handleNoData);
+	});
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/dark-blue.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/dark-blue.js
new file mode 100644
index 0000000..47e53e0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/dark-blue.js
@@ -0,0 +1,254 @@
+/**
+ * Dark blue theme for Highcharts JS
+ * @author Torstein Hønsi
+ */
+
+Highcharts.theme = {
+	colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 1, y2: 1 },
+			stops: [
+				[0, 'rgb(48, 48, 96)'],
+				[1, 'rgb(0, 0, 0)']
+			]
+		},
+		borderColor: '#000000',
+		borderWidth: 2,
+		className: 'dark-container',
+		plotBackgroundColor: 'rgba(255, 255, 255, .1)',
+		plotBorderColor: '#CCCCCC',
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#C0C0C0',
+			font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#666666',
+			font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineColor: '#333333',
+		gridLineWidth: 1,
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		tickColor: '#A0A0A0',
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+			}
+		}
+	},
+	yAxis: {
+		gridLineColor: '#333333',
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		minorTickInterval: null,
+		tickColor: '#A0A0A0',
+		tickWidth: 1,
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+			}
+		}
+	},
+	tooltip: {
+		backgroundColor: 'rgba(0, 0, 0, 0.75)',
+		style: {
+			color: '#F0F0F0'
+		}
+	},
+	toolbar: {
+		itemStyle: {
+			color: 'silver'
+		}
+	},
+	plotOptions: {
+		line: {
+			dataLabels: {
+				color: '#CCC'
+			},
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		spline: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		scatter: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		candlestick: {
+			lineColor: 'white'
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: '#A0A0A0'
+		},
+		itemHoverStyle: {
+			color: '#FFF'
+		},
+		itemHiddenStyle: {
+			color: '#444'
+		}
+	},
+	credits: {
+		style: {
+			color: '#666'
+		}
+	},
+	labels: {
+		style: {
+			color: '#CCC'
+		}
+	},
+
+	navigation: {
+		buttonOptions: {
+			symbolStroke: '#DDDDDD',
+			hoverSymbolStroke: '#FFFFFF',
+			theme: {
+				fill: {
+					linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+					stops: [
+						[0.4, '#606060'],
+						[0.6, '#333333']
+					]
+				},
+				stroke: '#000000'
+			}
+		}
+	},
+
+	// scroll charts
+	rangeSelector: {
+		buttonTheme: {
+			fill: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+			stroke: '#000000',
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold'
+			},
+			states: {
+				hover: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.4, '#BBB'],
+							[0.6, '#888']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'white'
+					}
+				},
+				select: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.1, '#000'],
+							[0.3, '#333']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'yellow'
+					}
+				}
+			}
+		},
+		inputStyle: {
+			backgroundColor: '#333',
+			color: 'silver'
+		},
+		labelStyle: {
+			color: 'silver'
+		}
+	},
+
+	navigator: {
+		handles: {
+			backgroundColor: '#666',
+			borderColor: '#AAA'
+		},
+		outlineColor: '#CCC',
+		maskFill: 'rgba(16, 16, 16, 0.5)',
+		series: {
+			color: '#7798BF',
+			lineColor: '#A6C7ED'
+		}
+	},
+
+	scrollbar: {
+		barBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		barBorderColor: '#CCC',
+		buttonArrowColor: '#CCC',
+		buttonBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		buttonBorderColor: '#CCC',
+		rifleColor: '#FFF',
+		trackBackgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#000'],
+				[1, '#333']
+			]
+		},
+		trackBorderColor: '#666'
+	},
+
+	// special colors for some of the
+	legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',
+	legendBackgroundColorSolid: 'rgb(35, 35, 70)',
+	dataLabelsColor: '#444',
+	textColor: '#C0C0C0',
+	maskColor: 'rgba(255,255,255,0.3)'
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/dark-green.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/dark-green.js
new file mode 100644
index 0000000..5edddf9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/dark-green.js
@@ -0,0 +1,255 @@
+/**
+ * Dark blue theme for Highcharts JS
+ * @author Torstein Hønsi
+ */
+
+Highcharts.theme = {
+	colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: {
+			linearGradient: [0, 0, 250, 500],
+			stops: [
+				[0, 'rgb(48, 96, 48)'],
+				[1, 'rgb(0, 0, 0)']
+			]
+		},
+		borderColor: '#000000',
+		borderWidth: 2,
+		className: 'dark-container',
+		plotBackgroundColor: 'rgba(255, 255, 255, .1)',
+		plotBorderColor: '#CCCCCC',
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#C0C0C0',
+			font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#666666',
+			font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineColor: '#333333',
+		gridLineWidth: 1,
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		tickColor: '#A0A0A0',
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+			}
+		}
+	},
+	yAxis: {
+		gridLineColor: '#333333',
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		minorTickInterval: null,
+		tickColor: '#A0A0A0',
+		tickWidth: 1,
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+			}
+		}
+	},
+	tooltip: {
+		backgroundColor: 'rgba(0, 0, 0, 0.75)',
+		style: {
+			color: '#F0F0F0'
+		}
+	},
+	toolbar: {
+		itemStyle: {
+			color: 'silver'
+		}
+	},
+	plotOptions: {
+		line: {
+			dataLabels: {
+				color: '#CCC'
+			},
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		spline: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		scatter: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		candlestick: {
+			lineColor: 'white'
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: '#A0A0A0'
+		},
+		itemHoverStyle: {
+			color: '#FFF'
+		},
+		itemHiddenStyle: {
+			color: '#444'
+		}
+	},
+	credits: {
+		style: {
+			color: '#666'
+		}
+	},
+	labels: {
+		style: {
+			color: '#CCC'
+		}
+	},
+
+
+	navigation: {
+		buttonOptions: {
+			symbolStroke: '#DDDDDD',
+			hoverSymbolStroke: '#FFFFFF',
+			theme: {
+				fill: {
+					linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+					stops: [
+						[0.4, '#606060'],
+						[0.6, '#333333']
+					]
+				},
+				stroke: '#000000'
+			}
+		}
+	},
+
+	// scroll charts
+	rangeSelector: {
+		buttonTheme: {
+			fill: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+			stroke: '#000000',
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold'
+			},
+			states: {
+				hover: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.4, '#BBB'],
+							[0.6, '#888']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'white'
+					}
+				},
+				select: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.1, '#000'],
+							[0.3, '#333']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'yellow'
+					}
+				}
+			}
+		},
+		inputStyle: {
+			backgroundColor: '#333',
+			color: 'silver'
+		},
+		labelStyle: {
+			color: 'silver'
+		}
+	},
+
+	navigator: {
+		handles: {
+			backgroundColor: '#666',
+			borderColor: '#AAA'
+		},
+		outlineColor: '#CCC',
+		maskFill: 'rgba(16, 16, 16, 0.5)',
+		series: {
+			color: '#7798BF',
+			lineColor: '#A6C7ED'
+		}
+	},
+
+	scrollbar: {
+		barBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		barBorderColor: '#CCC',
+		buttonArrowColor: '#CCC',
+		buttonBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		buttonBorderColor: '#CCC',
+		rifleColor: '#FFF',
+		trackBackgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#000'],
+				[1, '#333']
+			]
+		},
+		trackBorderColor: '#666'
+	},
+
+	// special colors for some of the
+	legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',
+	legendBackgroundColorSolid: 'rgb(35, 35, 70)',
+	dataLabelsColor: '#444',
+	textColor: '#C0C0C0',
+	maskColor: 'rgba(255,255,255,0.3)'
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/gray.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/gray.js
new file mode 100644
index 0000000..4e8f82a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/gray.js
@@ -0,0 +1,257 @@
+/**
+ * Gray theme for Highcharts JS
+ * @author Torstein Hønsi
+ */
+
+Highcharts.theme = {
+	colors: ["#DDDF0D", "#7798BF", "#55BF3B", "#DF5353", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, 'rgb(96, 96, 96)'],
+				[1, 'rgb(16, 16, 16)']
+			]
+		},
+		borderWidth: 0,
+		borderRadius: 15,
+		plotBackgroundColor: null,
+		plotShadow: false,
+		plotBorderWidth: 0
+	},
+	title: {
+		style: {
+			color: '#FFF',
+			font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#DDD',
+			font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineWidth: 0,
+		lineColor: '#999',
+		tickColor: '#999',
+		labels: {
+			style: {
+				color: '#999',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#AAA',
+				font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	yAxis: {
+		alternateGridColor: null,
+		minorTickInterval: null,
+		gridLineColor: 'rgba(255, 255, 255, .1)',
+		minorGridLineColor: 'rgba(255,255,255,0.07)',
+		lineWidth: 0,
+		tickWidth: 0,
+		labels: {
+			style: {
+				color: '#999',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#AAA',
+				font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	legend: {
+		itemStyle: {
+			color: '#CCC'
+		},
+		itemHoverStyle: {
+			color: '#FFF'
+		},
+		itemHiddenStyle: {
+			color: '#333'
+		}
+	},
+	labels: {
+		style: {
+			color: '#CCC'
+		}
+	},
+	tooltip: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, 'rgba(96, 96, 96, .8)'],
+				[1, 'rgba(16, 16, 16, .8)']
+			]
+		},
+		borderWidth: 0,
+		style: {
+			color: '#FFF'
+		}
+	},
+
+
+	plotOptions: {
+		series: {
+			shadow: true
+		},
+		line: {
+			dataLabels: {
+				color: '#CCC'
+			},
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		spline: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		scatter: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		candlestick: {
+			lineColor: 'white'
+		}
+	},
+
+	toolbar: {
+		itemStyle: {
+			color: '#CCC'
+		}
+	},
+
+	navigation: {
+		buttonOptions: {
+			symbolStroke: '#DDDDDD',
+			hoverSymbolStroke: '#FFFFFF',
+			theme: {
+				fill: {
+					linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+					stops: [
+						[0.4, '#606060'],
+						[0.6, '#333333']
+					]
+				},
+				stroke: '#000000'
+			}
+		}
+	},
+
+	// scroll charts
+	rangeSelector: {
+		buttonTheme: {
+			fill: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+			stroke: '#000000',
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold'
+			},
+			states: {
+				hover: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.4, '#BBB'],
+							[0.6, '#888']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'white'
+					}
+				},
+				select: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.1, '#000'],
+							[0.3, '#333']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'yellow'
+					}
+				}
+			}
+		},
+		inputStyle: {
+			backgroundColor: '#333',
+			color: 'silver'
+		},
+		labelStyle: {
+			color: 'silver'
+		}
+	},
+
+	navigator: {
+		handles: {
+			backgroundColor: '#666',
+			borderColor: '#AAA'
+		},
+		outlineColor: '#CCC',
+		maskFill: 'rgba(16, 16, 16, 0.5)',
+		series: {
+			color: '#7798BF',
+			lineColor: '#A6C7ED'
+		}
+	},
+
+	scrollbar: {
+		barBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		barBorderColor: '#CCC',
+		buttonArrowColor: '#CCC',
+		buttonBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		buttonBorderColor: '#CCC',
+		rifleColor: '#FFF',
+		trackBackgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#000'],
+				[1, '#333']
+			]
+		},
+		trackBorderColor: '#666'
+	},
+
+	// special colors for some of the demo examples
+	legendBackgroundColor: 'rgba(48, 48, 48, 0.8)',
+	legendBackgroundColorSolid: 'rgb(70, 70, 70)',
+	dataLabelsColor: '#444',
+	textColor: '#E0E0E0',
+	maskColor: 'rgba(255,255,255,0.3)'
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/grid.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/grid.js
new file mode 100644
index 0000000..cee0657
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/grid.js
@@ -0,0 +1,103 @@
+/**
+ * Grid theme for Highcharts JS
+ * @author Torstein Hønsi
+ */
+
+Highcharts.theme = {
+	colors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'],
+	chart: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 1, y2: 1 },
+			stops: [
+				[0, 'rgb(255, 255, 255)'],
+				[1, 'rgb(240, 240, 255)']
+			]
+		},
+		borderWidth: 2,
+		plotBackgroundColor: 'rgba(255, 255, 255, .9)',
+		plotShadow: true,
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#000',
+			font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#666666',
+			font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineWidth: 1,
+		lineColor: '#000',
+		tickColor: '#000',
+		labels: {
+			style: {
+				color: '#000',
+				font: '11px Trebuchet MS, Verdana, sans-serif'
+			}
+		},
+		title: {
+			style: {
+				color: '#333',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+			}
+		}
+	},
+	yAxis: {
+		minorTickInterval: 'auto',
+		lineColor: '#000',
+		lineWidth: 1,
+		tickWidth: 1,
+		tickColor: '#000',
+		labels: {
+			style: {
+				color: '#000',
+				font: '11px Trebuchet MS, Verdana, sans-serif'
+			}
+		},
+		title: {
+			style: {
+				color: '#333',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+			}
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: 'black'
+
+		},
+		itemHoverStyle: {
+			color: '#039'
+		},
+		itemHiddenStyle: {
+			color: 'gray'
+		}
+	},
+	labels: {
+		style: {
+			color: '#99b'
+		}
+	},
+
+	navigation: {
+		buttonOptions: {
+			theme: {
+				stroke: '#CCCCCC'
+			}
+		}
+	}
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/skies.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/skies.js
new file mode 100644
index 0000000..e942648
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/highcharts/themes/skies.js
@@ -0,0 +1,89 @@
+/**
+ * Skies theme for Highcharts JS
+ * @author Torstein Hønsi
+ */
+
+Highcharts.theme = {
+	colors: ["#514F78", "#42A07B", "#9B5E4A", "#72727F", "#1F949A", "#82914E", "#86777F", "#42A07B"],
+	chart: {
+		className: 'skies',
+		borderWidth: 0,
+		plotShadow: true,
+		plotBackgroundImage: 'http://www.highcharts.com/demo/gfx/skies.jpg',
+		plotBackgroundColor: {
+			linearGradient: [0, 0, 250, 500],
+			stops: [
+				[0, 'rgba(255, 255, 255, 1)'],
+				[1, 'rgba(255, 255, 255, 0)']
+			]
+		},
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#3E576F',
+			font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#6D869F',
+			font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineWidth: 0,
+		lineColor: '#C0D0E0',
+		tickColor: '#C0D0E0',
+		labels: {
+			style: {
+				color: '#666',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#666',
+				font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	yAxis: {
+		alternateGridColor: 'rgba(255, 255, 255, .5)',
+		lineColor: '#C0D0E0',
+		tickColor: '#C0D0E0',
+		tickWidth: 1,
+		labels: {
+			style: {
+				color: '#666',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#666',
+				font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: '#3E576F'
+		},
+		itemHoverStyle: {
+			color: 'black'
+		},
+		itemHiddenStyle: {
+			color: 'silver'
+		}
+	},
+	labels: {
+		style: {
+			color: '#3E576F'
+		}
+	}
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.js
new file mode 100644
index 0000000..c5c6482
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.js
@@ -0,0 +1,9789 @@
+/*!
+ * jQuery JavaScript Library v1.10.2
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03T13:48Z
+ */
+(function( window, undefined ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//"use strict";
+var
+	// The deferred used on DOM ready
+	readyList,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// Support: IE<10
+	// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
+	core_strundefined = typeof undefined,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	location = window.location,
+	document = window.document,
+	docElem = document.documentElement,
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// [[Class]] -> type pairs
+	class2type = {},
+
+	// List of deleted data cache ids, so we can reuse them
+	core_deletedIds = [],
+
+	core_version = "1.10.2",
+
+	// Save a reference to some core methods
+	core_concat = core_deletedIds.concat,
+	core_push = core_deletedIds.push,
+	core_slice = core_deletedIds.slice,
+	core_indexOf = core_deletedIds.indexOf,
+	core_toString = class2type.toString,
+	core_hasOwn = class2type.hasOwnProperty,
+	core_trim = core_version.trim,
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Used for matching numbers
+	core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+	// Used for splitting on whitespace
+	core_rnotwhite = /\S+/g,
+
+	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	},
+
+	// The ready event handler
+	completed = function( event ) {
+
+		// readyState === "complete" is good enough for us to call the dom ready in oldIE
+		if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+			detach();
+			jQuery.ready();
+		}
+	},
+	// Clean-up method for dom ready events
+	detach = function() {
+		if ( document.addEventListener ) {
+			document.removeEventListener( "DOMContentLoaded", completed, false );
+			window.removeEventListener( "load", completed, false );
+
+		} else {
+			document.detachEvent( "onreadystatechange", completed );
+			window.detachEvent( "onload", completed );
+		}
+	};
+
+jQuery.fn = jQuery.prototype = {
+	// The current version of jQuery being used
+	jquery: core_version,
+
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector.charAt(0) === "<" && selector.charAt( 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;
+
+					// scripts is true for back-compat
+					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 ( jQuery.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] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).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.context = this[0] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return core_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 num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : 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;
+		ret.context = this.context;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Add the callback
+		jQuery.ready.promise().done( fn );
+
+		return this;
+	},
+
+	slice: function() {
+		return this.pushStack( core_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] ] : [] );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: core_push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var src, copyIsArray, copy, name, options, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		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 = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.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
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// 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,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// 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;
+		}
+
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( !document.body ) {
+			return setTimeout( jQuery.ready );
+		}
+
+		// 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 ] );
+
+		// Trigger any bound ready events
+		if ( jQuery.fn.trigger ) {
+			jQuery( document ).trigger("ready").off("ready");
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	isWindow: function( obj ) {
+		/* jshint eqeqeq: false */
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		if ( obj == null ) {
+			return String( obj );
+		}
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ core_toString.call(obj) ] || "object" :
+			typeof obj;
+	},
+
+	isPlainObject: function( obj ) {
+		var key;
+
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!core_hasOwn.call(obj, "constructor") &&
+				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Support: IE<9
+		// Handle iteration over inherited properties before own properties.
+		if ( jQuery.support.ownLast ) {
+			for ( key in obj ) {
+				return core_hasOwn.call( obj, key );
+			}
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+		for ( key in obj ) {}
+
+		return key === undefined || core_hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	// data: string of html
+	// context (optional): If specified, the fragment will be created in this context, defaults to document
+	// keepScripts (optional): If true, will include scripts passed in the html string
+	parseHTML: function( data, context, keepScripts ) {
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		if ( typeof context === "boolean" ) {
+			keepScripts = context;
+			context = false;
+		}
+		context = context || document;
+
+		var parsed = rsingleTag.exec( data ),
+			scripts = !keepScripts && [];
+
+		// Single tag
+		if ( parsed ) {
+			return [ context.createElement( parsed[1] ) ];
+		}
+
+		parsed = jQuery.buildFragment( [ data ], context, scripts );
+		if ( scripts ) {
+			jQuery( scripts ).remove();
+		}
+		return jQuery.merge( [], parsed.childNodes );
+	},
+
+	parseJSON: function( data ) {
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		if ( data === null ) {
+			return data;
+		}
+
+		if ( typeof data === "string" ) {
+
+			// Make sure leading/trailing whitespace is removed (IE can't handle it)
+			data = jQuery.trim( data );
+
+			if ( data ) {
+				// Make sure the incoming data is actual JSON
+				// Logic borrowed from http://json.org/json2.js
+				if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+					.replace( rvalidtokens, "]" )
+					.replace( rvalidbraces, "")) ) {
+
+					return ( new Function( "return " + data ) )();
+				}
+			}
+		}
+
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && jQuery.trim( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	},
+
+	// args is for internal usage only
+	each: function( obj, callback, args ) {
+		var value,
+			i = 0,
+			length = obj.length,
+			isArray = isArraylike( obj );
+
+		if ( args ) {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+		function( text ) {
+			return text == null ?
+				"" :
+				core_trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		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 {
+				core_push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( core_indexOf ) {
+				return core_indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var l = second.length,
+			i = first.length,
+			j = 0;
+
+		if ( typeof l === "number" ) {
+			for ( ; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var retVal,
+			ret = [],
+			i = 0,
+			length = elems.length;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value,
+			i = 0,
+			length = elems.length,
+			isArray = isArraylike( elems ),
+			ret = [];
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return core_concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var args, proxy, tmp;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = core_slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Multifunctional method to get and set values of a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+		var i = 0,
+			length = elems.length,
+			bulk = key == null;
+
+		// Sets many values
+		if ( jQuery.type( key ) === "object" ) {
+			chainable = true;
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+			}
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			chainable = true;
+
+			if ( !jQuery.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 < length; i++ ) {
+					fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+				}
+			}
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations.
+	// Note: this method belongs to the css module but it's needed here for the support module.
+	// If support gets modularized, this method should be moved back to the css module.
+	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;
+	}
+});
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called after the browser event has already occurred.
+		// we once tried to use readyState "interactive" here, but it caused issues like the one
+		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			setTimeout( jQuery.ready );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", completed, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", completed, false );
+
+		// If IE event model is used
+		} else {
+			// Ensure firing before onload, maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", completed );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", completed );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch(e) {}
+
+			if ( top && top.doScroll ) {
+				(function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll("left");
+						} catch(e) {
+							return setTimeout( doScrollCheck, 50 );
+						}
+
+						// detach all dom ready events
+						detach();
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				})();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+	var length = obj.length,
+		type = jQuery.type( obj );
+
+	if ( jQuery.isWindow( obj ) ) {
+		return false;
+	}
+
+	if ( obj.nodeType === 1 && length ) {
+		return true;
+	}
+
+	return type === "array" || type !== "function" &&
+		( length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+/*!
+ * Sizzle CSS Selector Engine v1.10.2
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03
+ */
+(function( window, undefined ) {
+
+var i,
+	support,
+	cachedruns,
+	Expr,
+	getText,
+	isXML,
+	compile,
+	outermostContext,
+	sortInput,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + -(new Date()),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	hasDuplicate = false,
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+		return 0;
+	},
+
+	// General-purpose constants
+	strundefined = typeof undefined,
+	MAX_NEGATIVE = 1 << 31,
+
+	// Instance methods
+	hasOwn = ({}).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	push_native = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+	// Use a stripped-down indexOf if we can't use a native one
+	indexOf = arr.indexOf || function( elem ) {
+		var i = 0,
+			len = this.length;
+		for ( ; i < len; i++ ) {
+			if ( this[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
+
+	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+	// http://www.w3.org/TR/css3-syntax/#characters
+	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+	// Loosely modeled on CSS identifier characters
+	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = characterEncoding.replace( "w", "w#" ),
+
+	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+		"*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+	// Prefer arguments quoted,
+	//   then not containing pseudos/brackets,
+	//   then attribute selectors/non-parenthetical expressions,
+	//   then anything else
+	// These preferences are here to reduce the number of selectors
+	//   needing tokenize in the PSEUDO preFilter
+	pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+	rsibling = new RegExp( whitespace + "*[+~]" ),
+	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+		"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" )
+	},
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rescape = /'|\\/g,
+
+	// 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
+		// Workaround erroneous numeric interpretation of +"0x"
+		return high !== high || escapedWhitespace ?
+			escaped :
+			// BMP codepoint
+			high < 0 ?
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	};
+
+// 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 match, elem, m, nodeType,
+		// QSA vars
+		i, groups, old, nid, newContext, newSelector;
+
+	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+		setDocument( context );
+	}
+
+	context = context || document;
+	results = results || [];
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( documentIsHTML && !seed ) {
+
+		// Shortcuts
+		if ( (match = rquickExpr.exec( selector )) ) {
+			// Speed-up: Sizzle("#ID")
+			if ( (m = match[1]) ) {
+				if ( nodeType === 9 ) {
+					elem = context.getElementById( m );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE, Opera, and Webkit return items
+						// by name instead of ID
+						if ( elem.id === m ) {
+							results.push( elem );
+							return results;
+						}
+					} else {
+						return results;
+					}
+				} else {
+					// Context is not a document
+					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+						contains( context, elem ) && elem.id === m ) {
+						results.push( elem );
+						return results;
+					}
+				}
+
+			// Speed-up: Sizzle("TAG")
+			} else if ( match[2] ) {
+				push.apply( results, context.getElementsByTagName( selector ) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+				push.apply( results, context.getElementsByClassName( m ) );
+				return results;
+			}
+		}
+
+		// QSA path
+		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+			nid = old = expando;
+			newContext = context;
+			newSelector = nodeType === 9 && selector;
+
+			// qSA works strangely on Element-rooted queries
+			// We can work around this by specifying an extra ID on the root
+			// and working up from there (Thanks to Andrew Dupont for the technique)
+			// IE 8 doesn't work on object elements
+			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+				groups = tokenize( selector );
+
+				if ( (old = context.getAttribute("id")) ) {
+					nid = old.replace( rescape, "\\$&" );
+				} else {
+					context.setAttribute( "id", nid );
+				}
+				nid = "[id='" + nid + "'] ";
+
+				i = groups.length;
+				while ( i-- ) {
+					groups[i] = nid + toSelector( groups[i] );
+				}
+				newContext = rsibling.test( selector ) && context.parentNode || context;
+				newSelector = groups.join(",");
+			}
+
+			if ( newSelector ) {
+				try {
+					push.apply( results,
+						newContext.querySelectorAll( newSelector )
+					);
+					return results;
+				} catch(qsaError) {
+				} finally {
+					if ( !old ) {
+						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 div and expects a boolean result
+ */
+function assert( fn ) {
+	var div = document.createElement("div");
+
+	try {
+		return !!fn( div );
+	} catch (e) {
+		return false;
+	} finally {
+		// Remove from its parent by default
+		if ( div.parentNode ) {
+			div.parentNode.removeChild( div );
+		}
+		// release memory in IE
+		div = 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 = attrs.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 &&
+			( ~b.sourceIndex || MAX_NEGATIVE ) -
+			( ~a.sourceIndex || MAX_NEGATIVE );
+
+	// 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 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]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+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;
+};
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * 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 doc = node ? node.ownerDocument || node : preferredDoc,
+		parent = doc.defaultView;
+
+	// If no document and documentElement is available, return
+	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Set our document
+	document = doc;
+	docElem = doc.documentElement;
+
+	// Support tests
+	documentIsHTML = !isXML( doc );
+
+	// Support: IE>8
+	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
+	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+	// IE6-8 do not support the defaultView property so parent will be undefined
+	if ( parent && parent.attachEvent && parent !== parent.top ) {
+		parent.attachEvent( "onbeforeunload", function() {
+			setDocument();
+		});
+	}
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+	support.attributes = assert(function( div ) {
+		div.className = "i";
+		return !div.getAttribute("className");
+	});
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert(function( div ) {
+		div.appendChild( doc.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	});
+
+	// Check if getElementsByClassName can be trusted
+	support.getElementsByClassName = assert(function( div ) {
+		div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+		// Support: Safari<4
+		// Catch class over-caching
+		div.firstChild.className = "i";
+		// Support: Opera<10
+		// Catch gEBCN failure to find non-leading classes
+		return div.getElementsByClassName("i").length === 2;
+	});
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert(function( div ) {
+		docElem.appendChild( div ).id = expando;
+		return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+	});
+
+	// ID find and filter
+	if ( support.getById ) {
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+				var m = context.getElementById( id );
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		};
+		Expr.filter["ID"] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute("id") === attrId;
+			};
+		};
+	} else {
+		// Support: IE6/7
+		// getElementById is not reliable as a find shortcut
+		delete Expr.find["ID"];
+
+		Expr.filter["ID"] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+				return node && node.value === attrId;
+			};
+		};
+	}
+
+	// Tag
+	Expr.find["TAG"] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== strundefined ) {
+				return context.getElementsByTagName( tag );
+			}
+		} :
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+				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 !== strundefined && 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 http://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// 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
+			// http://bugs.jquery.com/ticket/12359
+			div.innerHTML = "<select><option selected=''></option></select>";
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// 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 ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+		});
+
+		assert(function( div ) {
+
+			// Support: Opera 10-12/IE8
+			// ^= $= *= and empty values
+			// Should not select anything
+			// Support: Windows 8 Native Apps
+			// The type attribute is restricted during .innerHTML assignment
+			var input = doc.createElement("input");
+			input.setAttribute( "type", "hidden" );
+			div.appendChild( input ).setAttribute( "t", "" );
+
+			if ( div.querySelectorAll("[t^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + 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 ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			div.querySelectorAll("*,:x");
+			rbuggyQSA.push(",.*:");
+		});
+	}
+
+	if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector) )) ) {
+
+		assert(function( div ) {
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( div, "div" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( div, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		});
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+
+	// Element contains another
+	// Purposefully does not implement inclusive descendent
+	// As in, an element does not contain itself
+	contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
+		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 = docElem.compareDocumentPosition ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
+
+		if ( compare ) {
+			// Disconnected nodes
+			if ( compare & 1 ||
+				(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+				// Choose the first element that is related to our preferred document
+				if ( a === doc || contains(preferredDoc, a) ) {
+					return -1;
+				}
+				if ( b === doc || contains(preferredDoc, b) ) {
+					return 1;
+				}
+
+				// Maintain original order
+				return sortInput ?
+					( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+					0;
+			}
+
+			return compare & 4 ? -1 : 1;
+		}
+
+		// Not directly comparable, sort on existence of method
+		return a.compareDocumentPosition ? -1 : 1;
+	} :
+	function( a, b ) {
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Parentless nodes are either documents or disconnected
+		} else if ( !aup || !bup ) {
+			return a === doc ? -1 :
+				b === doc ? 1 :
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf.call( sortInput, a ) - indexOf.call( 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 doc;
+};
+
+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 &&
+		( !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 ?
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			(val = elem.getAttributeNode(name)) && val.specified ?
+				val.value :
+				null :
+		val;
+};
+
+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 );
+		}
+	}
+
+	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
+		for ( ; (node = elem[i]); 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 (see #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[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[5] && match[2];
+
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[3] && match[4] !== undefined ) {
+				match[2] = match[4];
+
+			// 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 !== strundefined && 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 + " " ).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, outerCache, node, diff, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType;
+
+					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
+							outerCache = parent[ expando ] || (parent[ expando ] = {});
+							cache = outerCache[ type ] || [];
+							nodeIndex = cache[0] === dirruns && cache[1];
+							diff = cache[0] === dirruns && 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 ) {
+									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						// Use previously-cached element index if available
+						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+							diff = cache[1];
+
+						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+						} else {
+							// 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 ) {
+										(node[ expando ] || (node[ expando ] = {}))[ 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.call( 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 );
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			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": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === 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 only affected by element nodes and content nodes(including text(3), cdata(4)),
+			//   not comment, processing instructions, or others
+			// Thanks to Diego Perini for the nodeName shortcut
+			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
+					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;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
+		},
+
+		// 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();
+
+function tokenize( 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,
+		checkNonElements = base && dir === "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 );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var data, cache, outerCache,
+				dirkey = dirruns + " " + doneName;
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from dir 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 ] = {});
+						if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
+							if ( (data = cache[1]) === true || data === cachedruns ) {
+								return data === true;
+							}
+						} else {
+							cache = outerCache[ dir ] = [ dirkey ];
+							cache[1] = matcher( elem, context, xml ) || cachedruns;
+							if ( cache[1] === true ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+		};
+}
+
+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 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.call( 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.call( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+		} ];
+
+	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 ) {
+	// A counter to specify which element is currently being matched
+	var matcherCachedRuns = 0,
+		bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, expandContext ) {
+			var elem, j, matcher,
+				setMatched = [],
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				outermost = expandContext != null,
+				contextBackup = outermostContext,
+				// We must always have either seed elements or context
+				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
+
+			if ( outermost ) {
+				outermostContext = context !== document && context;
+				cachedruns = matcherCachedRuns;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+			for ( ; (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+					while ( (matcher = elementMatchers[j++]) ) {
+						if ( matcher( elem, context, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+						cachedruns = ++matcherCachedRuns;
+					}
+				}
+
+				// 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 );
+					}
+				}
+			}
+
+			// Apply set filters to unmatched elements
+			matchedCount += i;
+			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, group /* 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 ( !group ) {
+			group = tokenize( selector );
+		}
+		i = group.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( group[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+	}
+	return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function select( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		match = tokenize( selector );
+
+	if ( !seed ) {
+		// Try to minimize operations if there is only one group
+		if ( match.length === 1 ) {
+
+			// Take a shortcut and set the context if the root selector is an ID
+			tokens = match[0] = match[0].slice( 0 );
+			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+					support.getById && 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;
+				}
+				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 ) && 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
+	// Provide `match` to avoid retokenization if we modified the selector above
+	compile( selector, match )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		rsibling.test( selector )
+	);
+	return results;
+}
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// 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( div1 ) {
+	// Should return 1, but returns 4 (following)
+	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+	div.innerHTML = "<a href='#'></a>";
+	return div.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( div ) {
+	div.innerHTML = "<input/>";
+	div.firstChild.setAttribute( "value", "" );
+	return div.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( div ) {
+	return div.getAttribute("disabled") == null;
+}) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return (val = elem.getAttributeNode( name )) && val.specified ?
+				val.value :
+				elem[ name ] === true ? name.toLowerCase() : null;
+		}
+	});
+}
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+	var object = optionsCache[ options ] = {};
+	jQuery.each( options.match( core_rnotwhite ) || [], 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" ?
+		( optionsCache[ options ] || 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,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = !options.once && [],
+		// Fire callbacks
+		fire = function( data ) {
+			memory = options.memory && data;
+			fired = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			firing = true;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+					memory = false; // To prevent further calls using add
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( stack ) {
+					if ( stack.length ) {
+						fire( stack.shift() );
+					}
+				} else if ( memory ) {
+					list = [];
+				} else {
+					self.disable();
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					// First, we save the current length
+					var start = list.length;
+					(function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							var type = jQuery.type( arg );
+							if ( type === "function" ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && type !== "string" ) {
+								// Inspect recursively
+								add( arg );
+							}
+						});
+					})( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away
+					} else if ( memory ) {
+						firingStart = start;
+						fire( memory );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					jQuery.each( arguments, function( _, arg ) {
+						var index;
+						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+							list.splice( index, 1 );
+							// Handle firing indexes
+							if ( firing ) {
+								if ( index <= firingLength ) {
+									firingLength--;
+								}
+								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 && list.length );
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				firingLength = 0;
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( list && ( !fired || stack ) ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					if ( firing ) {
+						stack.push( args );
+					} else {
+						fire( args );
+					}
+				}
+				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;
+};
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var tuples = [
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks("memory") ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var action = tuple[ 0 ],
+								fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[1] ](function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise()
+										.done( newDefer.resolve )
+										.fail( newDefer.reject )
+										.progress( newDefer.notify );
+								} else {
+									newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+								}
+							});
+						});
+						fns = null;
+					}).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 = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[1] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(function() {
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ]
+			deferred[ tuple[0] ] = function() {
+				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+				return this;
+			};
+			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( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = core_slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+					if( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+					} else if ( !( --remaining ) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject )
+						.progress( updateFunc( i, progressContexts, progressValues ) );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+});
+jQuery.support = (function( support ) {
+
+	var all, a, input, select, fragment, opt, eventName, isSupported, i,
+		div = document.createElement("div");
+
+	// Setup
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	// Finish early in limited (non-browser) environments
+	all = div.getElementsByTagName("*") || [];
+	a = div.getElementsByTagName("a")[ 0 ];
+	if ( !a || !a.style || !all.length ) {
+		return support;
+	}
+
+	// First batch of tests
+	select = document.createElement("select");
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName("input")[ 0 ];
+
+	a.style.cssText = "top:1px;float:left;opacity:.5";
+
+	// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+	support.getSetAttribute = div.className !== "t";
+
+	// IE strips leading whitespace when .innerHTML is used
+	support.leadingWhitespace = div.firstChild.nodeType === 3;
+
+	// Make sure that tbody elements aren't automatically inserted
+	// IE will insert them into empty tables
+	support.tbody = !div.getElementsByTagName("tbody").length;
+
+	// Make sure that link elements get serialized correctly by innerHTML
+	// This requires a wrapper element in IE
+	support.htmlSerialize = !!div.getElementsByTagName("link").length;
+
+	// Get the style information from getAttribute
+	// (IE uses .cssText instead)
+	support.style = /top/.test( a.getAttribute("style") );
+
+	// Make sure that URLs aren't manipulated
+	// (IE normalizes it by default)
+	support.hrefNormalized = a.getAttribute("href") === "/a";
+
+	// Make sure that element opacity exists
+	// (IE uses filter instead)
+	// Use a regex to work around a WebKit issue. See #5145
+	support.opacity = /^0.5/.test( a.style.opacity );
+
+	// Verify style float existence
+	// (IE uses styleFloat instead of cssFloat)
+	support.cssFloat = !!a.style.cssFloat;
+
+	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+	support.checkOn = !!input.value;
+
+	// Make sure that a selected-by-default option has a working selected property.
+	// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+	support.optSelected = opt.selected;
+
+	// Tests for enctype support on a form (#6743)
+	support.enctype = !!document.createElement("form").enctype;
+
+	// Makes sure cloning an html5 element does not cause problems
+	// Where outerHTML is undefined, this still works
+	support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>";
+
+	// Will be defined later
+	support.inlineBlockNeedsLayout = false;
+	support.shrinkWrapBlocks = false;
+	support.pixelPosition = false;
+	support.deleteExpando = true;
+	support.noCloneEvent = true;
+	support.reliableMarginRight = true;
+	support.boxSizingReliable = true;
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Support: IE<9
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	// Check if we can trust getAttribute("value")
+	input = document.createElement("input");
+	input.setAttribute( "value", "" );
+	support.input = input.getAttribute( "value" ) === "";
+
+	// Check if an input maintains its value after becoming a radio
+	input.value = "t";
+	input.setAttribute( "type", "radio" );
+	support.radioValue = input.value === "t";
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "checked", "t" );
+	input.setAttribute( "name", "t" );
+
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( input );
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE<9
+	// Opera does not clone events (and typeof div.attachEvent === undefined).
+	// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+	if ( div.attachEvent ) {
+		div.attachEvent( "onclick", function() {
+			support.noCloneEvent = false;
+		});
+
+		div.cloneNode( true ).click();
+	}
+
+	// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
+	// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+	for ( i in { submit: true, change: true, focusin: true }) {
+		div.setAttribute( eventName = "on" + i, "t" );
+
+		support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
+	}
+
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	// Support: IE<9
+	// Iteration over object's inherited properties before its own.
+	for ( i in jQuery( support ) ) {
+		break;
+	}
+	support.ownLast = i !== "0";
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, marginDiv, tds,
+			divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		container = document.createElement("div");
+		container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+
+		body.appendChild( container ).appendChild( div );
+
+		// Support: IE8
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName("td");
+		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Support: IE8
+		// Check if empty table cells still have offsetWidth/Height
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check box-sizing and margin behavior.
+		div.innerHTML = "";
+		div.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%;";
+
+		// Workaround failing boxSizing test due to offsetWidth returning wrong value
+		// with some non-1 values of body zoom, ticket #13543
+		jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
+			support.boxSizing = div.offsetWidth === 4;
+		});
+
+		// Use window.getComputedStyle because jsdom on node.js will break without it.
+		if ( window.getComputedStyle ) {
+			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+			// Check if div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container. (#3333)
+			// Fails in WebKit before Feb 2011 nightlies
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			marginDiv = div.appendChild( document.createElement("div") );
+			marginDiv.style.cssText = div.style.cssText = divReset;
+			marginDiv.style.marginRight = marginDiv.style.width = "0";
+			div.style.width = "1px";
+
+			support.reliableMarginRight =
+				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+		}
+
+		if ( typeof div.style.zoom !== core_strundefined ) {
+			// Support: IE<8
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			div.innerHTML = "";
+			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Support: IE6
+			// Check if elements with layout shrink-wrap their children
+			div.style.display = "block";
+			div.innerHTML = "<div></div>";
+			div.firstChild.style.width = "5px";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+			if ( support.inlineBlockNeedsLayout ) {
+				// Prevent IE 6 from affecting layout for positioned elements #11048
+				// Prevent IE from shrinking the body in IE 7 mode #12869
+				// Support: IE<8
+				body.style.zoom = 1;
+			}
+		}
+
+		body.removeChild( container );
+
+		// Null elements to avoid leaks in IE
+		container = div = tds = marginDiv = null;
+	});
+
+	// Null elements to avoid leaks in IE
+	all = select = fragment = opt = a = input = null;
+
+	return support;
+})({});
+
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ){
+	if ( !jQuery.acceptData( elem ) ) {
+		return;
+	}
+
+	var ret, thisCache,
+		internalKey = jQuery.expando,
+
+		// We have to handle DOM nodes and JS objects differently because IE6-7
+		// can't GC object references properly across the DOM-JS boundary
+		isNode = elem.nodeType,
+
+		// Only DOM nodes need the global jQuery cache; JS object data is
+		// attached directly to the object so GC can occur automatically
+		cache = isNode ? jQuery.cache : elem,
+
+		// Only defining an ID for JS objects if its cache already exists allows
+		// the code to shortcut on the same path as a DOM node with no cache
+		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+	// Avoid doing any more work than we need to when trying to get data on an
+	// object that has no data at all
+	if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
+		return;
+	}
+
+	if ( !id ) {
+		// Only DOM nodes need a new unique ID for each element since their data
+		// ends up in the global cache
+		if ( isNode ) {
+			id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;
+		} else {
+			id = internalKey;
+		}
+	}
+
+	if ( !cache[ id ] ) {
+		// Avoid exposing jQuery metadata on plain JS objects when the object
+		// is serialized using JSON.stringify
+		cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
+	}
+
+	// An object can be passed to jQuery.data instead of a key/value pair; this gets
+	// shallow copied over onto the existing cache
+	if ( typeof name === "object" || typeof name === "function" ) {
+		if ( pvt ) {
+			cache[ id ] = jQuery.extend( cache[ id ], name );
+		} else {
+			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+		}
+	}
+
+	thisCache = cache[ id ];
+
+	// jQuery data() is stored in a separate object inside the object's internal data
+	// cache in order to avoid key collisions between internal data and user-defined
+	// data.
+	if ( !pvt ) {
+		if ( !thisCache.data ) {
+			thisCache.data = {};
+		}
+
+		thisCache = thisCache.data;
+	}
+
+	if ( data !== undefined ) {
+		thisCache[ jQuery.camelCase( name ) ] = data;
+	}
+
+	// Check for both converted-to-camel and non-converted data property names
+	// If a data property was specified
+	if ( typeof name === "string" ) {
+
+		// First Try to find as-is property data
+		ret = thisCache[ name ];
+
+		// Test for null|undefined property data
+		if ( ret == null ) {
+
+			// Try to find the camelCased property
+			ret = thisCache[ jQuery.camelCase( name ) ];
+		}
+	} else {
+		ret = thisCache;
+	}
+
+	return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+	if ( !jQuery.acceptData( elem ) ) {
+		return;
+	}
+
+	var thisCache, i,
+		isNode = elem.nodeType,
+
+		// See jQuery.data for more information
+		cache = isNode ? jQuery.cache : elem,
+		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+	// If there is already no cache entry for this object, there is no
+	// purpose in continuing
+	if ( !cache[ id ] ) {
+		return;
+	}
+
+	if ( name ) {
+
+		thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+		if ( thisCache ) {
+
+			// Support array or space separated string names for data keys
+			if ( !jQuery.isArray( name ) ) {
+
+				// try the string as a key before any manipulation
+				if ( name in thisCache ) {
+					name = [ name ];
+				} else {
+
+					// split the camel cased version by spaces unless a key with the spaces exists
+					name = jQuery.camelCase( name );
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+						name = name.split(" ");
+					}
+				}
+			} else {
+				// If "name" is an array of keys...
+				// When data is initially created, via ("key", "val") signature,
+				// keys will be converted to camelCase.
+				// Since there is no way to tell _how_ a key was added, remove
+				// both plain key and camelCase key. #12786
+				// This will only penalize the array argument path.
+				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+			}
+
+			i = name.length;
+			while ( i-- ) {
+				delete thisCache[ name[i] ];
+			}
+
+			// If there is no data left in the cache, we want to continue
+			// and let the cache object itself get destroyed
+			if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
+				return;
+			}
+		}
+	}
+
+	// See jQuery.data for more information
+	if ( !pvt ) {
+		delete cache[ id ].data;
+
+		// Don't destroy the parent cache unless the internal data object
+		// had been the only thing left in it
+		if ( !isEmptyDataObject( cache[ id ] ) ) {
+			return;
+		}
+	}
+
+	// Destroy the cache
+	if ( isNode ) {
+		jQuery.cleanData( [ elem ], true );
+
+	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+	/* jshint eqeqeq: false */
+	} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+		/* jshint eqeqeq: true */
+		delete cache[ id ];
+
+	// When all else fails, null
+	} else {
+		cache[ id ] = null;
+	}
+}
+
+jQuery.extend({
+	cache: {},
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"applet": true,
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return internalData( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		return internalRemoveData( elem, name );
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return internalData( elem, name, data, true );
+	},
+
+	_removeData: function( elem, name ) {
+		return internalRemoveData( elem, name, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		// Do not set data on non-element because it will not be cleared (#8335).
+		if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
+			return false;
+		}
+
+		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+		// nodes accept data unless otherwise specified; rejection can be conditional
+		return !noData || noData !== true && elem.getAttribute("classid") === noData;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var attrs, name,
+			data = null,
+			i = 0,
+			elem = this[0];
+
+		// Special expections of .data basically thwart jQuery.access,
+		// so implement the relevant behavior ourselves
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attrs = elem.attributes;
+					for ( ; i < attrs.length; i++ ) {
+						name = attrs[i].name;
+
+						if ( name.indexOf("data-") === 0 ) {
+							name = jQuery.camelCase( name.slice(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		return arguments.length > 1 ?
+
+			// Sets one value
+			this.each(function() {
+				jQuery.data( this, key, value );
+			}) :
+
+			// Gets one value
+			// Try to fetch any internally stored data first
+			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+					data === "false" ? false :
+					data === "null" ? null :
+					// Only convert to a number if it doesn't change the string
+					+data + "" === data ? +data :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+						data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray(data) ) {
+					queue = jQuery._data( 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 intended for public consumption - generates a queueHooks object, or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks("once memory").add(function() {
+				jQuery._removeData( elem, type + "queue" );
+				jQuery._removeData( elem, 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 );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	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 = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	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 = jQuery._data( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+});
+var nodeHook, boolHook,
+	rclass = /[\t\r\n\f]/g,
+	rreturn = /\r/g,
+	rfocusable = /^(?:input|select|textarea|button|object)$/i,
+	rclickable = /^(?:a|area)$/i,
+	ruseDefault = /^(?:checked|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	getSetInput = jQuery.support.input;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classes, elem, cur, clazz, j,
+			i = 0,
+			len = this.length,
+			proceed = typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call( this, j, this.className ) );
+			});
+		}
+
+		if ( proceed ) {
+			// The disjunction here is for better compressibility (see removeClass)
+			classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					" "
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+					elem.className = jQuery.trim( cur );
+
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, clazz, j,
+			i = 0,
+			len = this.length,
+			proceed = arguments.length === 0 || typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, this.className ) );
+			});
+		}
+		if ( proceed ) {
+			classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					""
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+					elem.className = value ? jQuery.trim( cur ) : "";
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value;
+
+		if ( typeof stateVal === "boolean" && type === "string" ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					classNames = value.match( core_rnotwhite ) || [];
+
+				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 ( type === core_strundefined || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.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.
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var ret, hooks, isFunction,
+			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;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				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 ( jQuery.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 ) {
+				// Use proper attribute retrieval(#6932, #12072)
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+					elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one" || index < 0,
+					values = one ? null : [],
+					max = one ? index + 1 : options.length,
+					i = index < 0 ?
+						max :
+						one ? index : 0;
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// oldIE 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
+							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+							( !option.parentNode.disabled || !jQuery.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 ];
+					if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
+						optionSet = true;
+					}
+				}
+
+				// force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attr: function( elem, name, value ) {
+		var hooks, ret,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === core_strundefined ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+
+			} else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, value + "" );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+			ret = jQuery.find.attr( elem, name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret == null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name, propName,
+			i = 0,
+			attrNames = value && value.match( core_rnotwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( (name = attrNames[i++]) ) {
+				propName = jQuery.propFix[ name ] || name;
+
+				// Boolean attributes get special treatment (#10870)
+				if ( jQuery.expr.match.bool.test( name ) ) {
+					// Set corresponding property to false
+					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+						elem[ propName ] = false;
+					// Support: IE<9
+					// Also clear defaultChecked/defaultSelected (if appropriate)
+					} else {
+						elem[ jQuery.camelCase( "default-" + name ) ] =
+							elem[ propName ] = false;
+					}
+
+				// See #9699 for explanation of this approach (setting first, then removal)
+				} else {
+					jQuery.attr( elem, name, "" );
+				}
+
+				elem.removeAttribute( getSetAttribute ? name : propName );
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to default in case type is set after value during creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+				ret :
+				( elem[ name ] = value );
+
+		} else {
+			return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+				ret :
+				elem[ name ];
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// 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" );
+
+				return tabindex ?
+					parseInt( tabindex, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						-1;
+			}
+		}
+	}
+});
+
+// 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 if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+			// IE<8 needs the *property* name
+			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+		// Use defaultChecked and defaultSelected for oldIE
+		} else {
+			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+		}
+
+		return name;
+	}
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+	var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
+
+	jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
+		function( elem, name, isXML ) {
+			var fn = jQuery.expr.attrHandle[ name ],
+				ret = isXML ?
+					undefined :
+					/* jshint eqeqeq: false */
+					(jQuery.expr.attrHandle[ name ] = undefined) !=
+						getter( elem, name, isXML ) ?
+
+						name.toLowerCase() :
+						null;
+			jQuery.expr.attrHandle[ name ] = fn;
+			return ret;
+		} :
+		function( elem, name, isXML ) {
+			return isXML ?
+				undefined :
+				elem[ jQuery.camelCase( "default-" + name ) ] ?
+					name.toLowerCase() :
+					null;
+		};
+});
+
+// fix oldIE attroperties
+if ( !getSetInput || !getSetAttribute ) {
+	jQuery.attrHooks.value = {
+		set: function( elem, value, name ) {
+			if ( jQuery.nodeName( elem, "input" ) ) {
+				// Does not return so that setAttribute is also used
+				elem.defaultValue = value;
+			} else {
+				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
+				return nodeHook && nodeHook.set( elem, value, name );
+			}
+		}
+	};
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = {
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				elem.setAttributeNode(
+					(ret = elem.ownerDocument.createAttribute( name ))
+				);
+			}
+
+			ret.value = value += "";
+
+			// Break association with cloned elements by also using setAttribute (#9646)
+			return name === "value" || value === elem.getAttribute( name ) ?
+				value :
+				undefined;
+		}
+	};
+	jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
+		// Some attributes are constructed with empty-string values when not defined
+		function( elem, name, isXML ) {
+			var ret;
+			return isXML ?
+				undefined :
+				(ret = elem.getAttributeNode( name )) && ret.value !== "" ?
+					ret.value :
+					null;
+		};
+	jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret = elem.getAttributeNode( name );
+			return ret && ret.specified ?
+				ret.value :
+				undefined;
+		},
+		set: nodeHook.set
+	};
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		set: function( elem, value, name ) {
+			nodeHook.set( elem, value === "" ? false : value, name );
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		};
+	});
+}
+
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !jQuery.support.hrefNormalized ) {
+	// href/src property should get the full normalized URL (#10299/#12915)
+	jQuery.each([ "href", "src" ], function( i, name ) {
+		jQuery.propHooks[ name ] = {
+			get: function( elem ) {
+				return elem.getAttribute( name, 4 );
+			}
+		};
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Note: IE uppercases css property names, but if we were to .toLowerCase()
+			// .cssText, that would destroy case senstitivity in URL's, like in "background"
+			return elem.style.cssText || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = value + "" );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	};
+}
+
+jQuery.each([
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	};
+	if ( !jQuery.support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			// Support: Webkit
+			// "" is returned instead of "on" if a value isn't specified
+			return elem.getAttribute("value") === null ? "on" : elem.value;
+		};
+	}
+});
+var rformElems = /^(?:input|select|textarea)$/i,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+/*
+ * 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 tmp, events, t, handleObjIn,
+			special, eventHandle, handleObj,
+			handlers, type, namespaces, origType,
+			elemData = jQuery._data( 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;
+		}
+
+		// 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 !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( core_rnotwhite ) || [""];
+		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/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + 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;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+		var j, handleObj, tmp,
+			origCount, t, events,
+			special, handlers, type,
+			namespaces, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( core_rnotwhite ) || [""];
+		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 the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery._removeData( elem, "events" );
+		}
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		var handle, ontype, cur,
+			bubbleType, special, tmp, i,
+			eventPath = [ elem || document ],
+			type = core_hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+		cur = 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(".") >= 0 ) {
+			// 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.namespace_re = 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 && !jQuery.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() ) {
+
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === 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) &&
+				jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && elem[ type ] && !jQuery.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;
+					try {
+						elem[ type ]();
+					} catch ( e ) {
+						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
+						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
+					}
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event );
+
+		var i, ret, handleObj, matched, j,
+			handlerQueue = [],
+			args = core_slice.call( arguments ),
+			handlers = ( jQuery._data( 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;
+		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.namespace_re || event.namespace_re.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 sel, handleObj, matches, i,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		// Black-hole SVG <use> instance trees (#13180)
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+			/* jshint eqeqeq: false */
+			for ( ; cur != this; cur = cur.parentNode || this ) {
+				/* jshint eqeqeq: true */
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matches[ sel ] === undefined ) {
+							matches[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) >= 0 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matches[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, handlers: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+		}
+
+		return handlerQueue;
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop, copy,
+			type = event.type,
+			originalEvent = event,
+			fixHook = this.fixHooks[ type ];
+
+		if ( !fixHook ) {
+			this.fixHooks[ type ] = fixHook =
+				rmouseEvent.test( type ) ? this.mouseHooks :
+				rkeyEvent.test( type ) ? this.keyHooks :
+				{};
+		}
+		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = new jQuery.Event( originalEvent );
+
+		i = copy.length;
+		while ( i-- ) {
+			prop = copy[ i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Support: IE<9
+		// Fix target property (#1925)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Support: Chrome 23+, Safari?
+		// Target should not be a text node (#504, #13143)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Support: IE<9
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	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( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var body, eventDoc, doc,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	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 ) {
+					try {
+						this.focus();
+						return false;
+					} catch ( e ) {
+						// Support: IE<9
+						// If we error on focus to hidden element (#1486, #12518),
+						// let .trigger() run the handlers
+					}
+				}
+			},
+			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 ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+					this.click();
+					return false;
+				}
+			},
+
+			// For cross-browser consistency, don't fire native .click() on links
+			_default: function( event ) {
+				return jQuery.nodeName( event.target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Even when returnValue equals to undefined Firefox will still show alert
+				if ( event.result !== undefined ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8
+			// detachEvent needed property on element, by name of that event, to properly expose it to GC
+			if ( typeof elem[ name ] === core_strundefined ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, 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.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// 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 || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+		if ( !e ) {
+			return;
+		}
+
+		// If preventDefault exists, run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// Support: IE
+		// Otherwise set the returnValue property of the original event to false
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+		if ( !e ) {
+			return;
+		}
+		// If stopPropagation exists, run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+
+		// Support: IE
+		// Set the cancelBubble property of the original event to true
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	}
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, 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 mousenter/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;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !jQuery._data( form, "submitBubbles" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					jQuery._data( form, "submitBubbles", true );
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+						}
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event, true );
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					jQuery._data( elem, "changeBubbles", true );
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var type, origFn;
+
+		// 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 ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		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 this;
+		}
+
+		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 this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( 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 );
+		});
+	},
+
+	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 );
+		}
+	}
+});
+var isSimple = /^.[^:#\[\.,]*$/,
+	rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	rneedsContext = jQuery.expr.match.needsContext,
+	// 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({
+	find: function( selector ) {
+		var i,
+			ret = [],
+			self = this,
+			len = self.length;
+
+		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;
+					}
+				}
+			}) );
+		}
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		// Needed because $( selector, context ) becomes $( context ).find( selector )
+		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+		ret.selector = this.selector ? this.selector + " " + selector : selector;
+		return ret;
+	},
+
+	has: function( target ) {
+		var i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter(function() {
+			for ( i = 0; i < len; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector || [], true) );
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector || [], false) );
+	},
+
+	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;
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			ret = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+				// Always skip document fragments
+				if ( cur.nodeType < 11 && (pos ?
+					pos.index(cur) > -1 :
+
+					// Don't pass non-elements to Sizzle
+					cur.nodeType === 1 &&
+						jQuery.find.matchesSelector(cur, selectors)) ) {
+
+					cur = ret.push( cur );
+					break;
+				}
+			}
+		}
+
+		return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	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 jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( jQuery.unique(all) );
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter(selector)
+		);
+	}
+});
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && 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 jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		if ( this.length > 1 ) {
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				ret = jQuery.unique( ret );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				ret = ret.reverse();
+			}
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		var elem = elems[ 0 ];
+
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 && elem.nodeType === 1 ?
+			jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+			jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+				return elem.nodeType === 1;
+			}));
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			/* jshint -W018 */
+			return !!qualifier.call( elem, i, elem ) !== not;
+		});
+
+	}
+
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		});
+
+	}
+
+	if ( typeof qualifier === "string" ) {
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter( qualifier, elements, not );
+		}
+
+		qualifier = jQuery.filter( qualifier, elements );
+	}
+
+	return jQuery.grep( elements, function( elem ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
+	});
+}
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+		safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style|link)/i,
+	manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /^$|\/(?:java|ecma)script/i,
+	rscriptTypeMasked = /^true\/(.*)/,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+	// We have to close these tags to support XHTML (#13200)
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		area: [ 1, "<map>", "</map>" ],
+		param: [ 1, "<object>", "</object>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+		// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+		// unless wrapped in a div with non-breaking characters in front of it.
+		_default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
+	},
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip( 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 this.domManip( arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		});
+	},
+
+	after: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		});
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		var elem,
+			elems = selector ? jQuery.filter( selector, this ) : this,
+			i = 0;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( !keepData && elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem ) );
+			}
+
+			if ( elem.parentNode ) {
+				if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+					setGlobalEval( getAll( elem, "script" ) );
+				}
+				elem.parentNode.removeChild( elem );
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem, false ) );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+
+			// If this is a select, ensure that it displays empty (#12336)
+			// Support: IE<9
+			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+				elem.options.length = 0;
+			}
+		}
+
+		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 jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						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
+			// Snapshot the DOM in case .domManip sweeps something relevant into its fragment
+			args = jQuery.map( this, function( elem ) {
+				return [ elem.nextSibling, elem.parentNode ];
+			}),
+			i = 0;
+
+		// Make the changes, replacing each context element with the new content
+		this.domManip( arguments, function( elem ) {
+			var next = args[ i++ ],
+				parent = args[ i++ ];
+
+			if ( parent ) {
+				// Don't use the snapshot next if it has moved (#13810)
+				if ( next && next.parentNode !== parent ) {
+					next = this.nextSibling;
+				}
+				jQuery( this ).remove();
+				parent.insertBefore( elem, next );
+			}
+		// Allow new content to include elements from the context set
+		}, true );
+
+		// Force removal if there was no new content (e.g., from empty arguments)
+		return i ? this : this.remove();
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, callback, allowIntersection ) {
+
+		// Flatten any nested arrays
+		args = core_concat.apply( [], args );
+
+		var first, node, hasScripts,
+			scripts, doc, fragment,
+			i = 0,
+			l = this.length,
+			set = this,
+			iNoClone = l - 1,
+			value = args[0],
+			isFunction = jQuery.isFunction( value );
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
+			return this.each(function( index ) {
+				var self = set.eq( index );
+				if ( isFunction ) {
+					args[0] = value.call( this, index, self.html() );
+				}
+				self.domManip( args, callback, allowIntersection );
+			});
+		}
+
+		if ( l ) {
+			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				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 ) {
+							jQuery.merge( scripts, getAll( node, "script" ) );
+						}
+					}
+
+					callback.call( this[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 || "" ) &&
+							!jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+							if ( node.src ) {
+								// Hope ajax is available...
+								jQuery._evalUrl( node.src );
+							} else {
+								jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+							}
+						}
+					}
+				}
+
+				// Fix #11809: Avoid leaking memory
+				fragment = first = null;
+			}
+		}
+
+		return this;
+	}
+});
+
+// Support: IE<8
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+	return jQuery.nodeName( elem, "table" ) &&
+		jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
+
+		elem.getElementsByTagName("tbody")[0] ||
+			elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+		elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	var match = rscriptTypeMasked.exec( elem.type );
+	if ( match ) {
+		elem.type = match[1];
+	} else {
+		elem.removeAttribute("type");
+	}
+	return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var elem,
+		i = 0;
+	for ( ; (elem = elems[i]) != null; i++ ) {
+		jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+	}
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function fixCloneNodeIssues( src, dest ) {
+	var nodeName, e, data;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 copies events bound via attachEvent when using cloneNode.
+	if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
+		data = jQuery._data( dest );
+
+		for ( e in data.events ) {
+			jQuery.removeEvent( dest, e, data.handle );
+		}
+
+		// Event data gets referenced instead of copied if the expando gets copied too
+		dest.removeAttribute( jQuery.expando );
+	}
+
+	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+	if ( nodeName === "script" && dest.text !== src.text ) {
+		disableScript( dest ).text = src.text;
+		restoreScript( dest );
+
+	// IE6-10 improperly clones children of object elements using classid.
+	// IE10 throws NoModificationAllowedError if parent is null, #12132.
+	} else if ( nodeName === "object" ) {
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+
+		dest.defaultChecked = dest.checked = src.checked;
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.defaultSelected = dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone(true);
+			jQuery( insert[i] )[ original ]( elems );
+
+			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+			core_push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+function getAll( context, tag ) {
+	var elems, elem,
+		i = 0,
+		found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
+			typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
+			undefined;
+
+	if ( !found ) {
+		for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
+			if ( !tag || jQuery.nodeName( elem, tag ) ) {
+				found.push( elem );
+			} else {
+				jQuery.merge( found, getAll( elem, tag ) );
+			}
+		}
+	}
+
+	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+		jQuery.merge( [ context ], found ) :
+		found;
+}
+
+// Used in buildFragment, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( manipulation_rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var destElements, node, clone, i, srcElements,
+			inPage = jQuery.contains( elem.ownerDocument, elem );
+
+		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+
+			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			// Fix all IE cloning issues
+			for ( i = 0; (node = srcElements[i]) != null; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					fixCloneNodeIssues( node, 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; (node = srcElements[i]) != null; i++ ) {
+					cloneCopyEvent( node, destElements[i] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		destElements = srcElements = node = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	buildFragment: function( elems, context, scripts, selection ) {
+		var j, elem, contains,
+			tmp, tag, tbody, wrap,
+			l = elems.length,
+
+			// Ensure a safe fragment
+			safe = createSafeFragment( context ),
+
+			nodes = [],
+			i = 0;
+
+		for ( ; i < l; i++ ) {
+			elem = elems[ i ];
+
+			if ( elem || elem === 0 ) {
+
+				// Add nodes directly
+				if ( jQuery.type( elem ) === "object" ) {
+					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 || safe.appendChild( context.createElement("div") );
+
+					// Deserialize a standard representation
+					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+					wrap = wrapMap[ tag ] || wrapMap._default;
+
+					tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
+
+					// Descend through wrappers to the right content
+					j = wrap[0];
+					while ( j-- ) {
+						tmp = tmp.lastChild;
+					}
+
+					// Manually add leading whitespace removed by IE
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						elem = tag === "table" && !rtbody.test( elem ) ?
+							tmp.firstChild :
+
+							// String was a bare <thead> or <tfoot>
+							wrap[1] === "<table>" && !rtbody.test( elem ) ?
+								tmp :
+								0;
+
+						j = elem && elem.childNodes.length;
+						while ( j-- ) {
+							if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
+								elem.removeChild( tbody );
+							}
+						}
+					}
+
+					jQuery.merge( nodes, tmp.childNodes );
+
+					// Fix #12392 for WebKit and IE > 9
+					tmp.textContent = "";
+
+					// Fix #12392 for oldIE
+					while ( tmp.firstChild ) {
+						tmp.removeChild( tmp.firstChild );
+					}
+
+					// Remember the top-level container for proper cleanup
+					tmp = safe.lastChild;
+				}
+			}
+		}
+
+		// Fix #11356: Clear elements from fragment
+		if ( tmp ) {
+			safe.removeChild( tmp );
+		}
+
+		// Reset defaultChecked for any radios and checkboxes
+		// about to be appended to the DOM in IE 6/7 (#8060)
+		if ( !jQuery.support.appendChecked ) {
+			jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+		}
+
+		i = 0;
+		while ( (elem = nodes[ i++ ]) ) {
+
+			// #4087 - If origin and destination elements are the same, and this is
+			// that element, do not do anything
+			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+				continue;
+			}
+
+			contains = jQuery.contains( elem.ownerDocument, elem );
+
+			// Append to fragment
+			tmp = getAll( safe.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 );
+					}
+				}
+			}
+		}
+
+		tmp = null;
+
+		return safe;
+	},
+
+	cleanData: function( elems, /* internal */ acceptData ) {
+		var elem, type, id, data,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			deleteExpando = jQuery.support.deleteExpando,
+			special = jQuery.event.special;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( acceptData || jQuery.acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					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 );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// IE does not allow us to delete expando properties from nodes,
+						// nor does it have a removeAttribute function on Document nodes;
+						// we must handle all of these cases
+						if ( deleteExpando ) {
+							delete elem[ internalKey ];
+
+						} else if ( typeof elem.removeAttribute !== core_strundefined ) {
+							elem.removeAttribute( internalKey );
+
+						} else {
+							elem[ internalKey ] = null;
+						}
+
+						core_deletedIds.push( id );
+					}
+				}
+			}
+		}
+	},
+
+	_evalUrl: function( url ) {
+		return jQuery.ajax({
+			url: url,
+			type: "GET",
+			dataType: "script",
+			async: false,
+			global: false,
+			"throws": true
+		});
+	}
+});
+jQuery.fn.extend({
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var 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.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.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 isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	}
+});
+var iframe, getStyles, curCSS,
+	ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity\s*=\s*([^)]*)/,
+	rposition = /^(top|right|bottom|left)$/,
+	// 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]).+)/,
+	rmargin = /^margin/,
+	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+	rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
+	elemdisplay = { BODY: "block" },
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: 0,
+		fontWeight: 400
+	},
+
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in style ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt(0).toUpperCase() + name.slice(1),
+		origName = name,
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in style ) {
+			return name;
+		}
+	}
+
+	return origName;
+}
+
+function isHidden( elem, el ) {
+	// isHidden might be called from jQuery#filter function;
+	// in that case, element will be second argument
+	elem = el || elem;
+	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+	var display, elem, hidden,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		values[ index ] = jQuery._data( elem, "olddisplay" );
+		display = elem.style.display;
+		if ( show ) {
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && display === "none" ) {
+				elem.style.display = "";
+			}
+
+			// Set elements which have been overridden with display: none
+			// in a stylesheet to whatever the default browser style is
+			// for such an element
+			if ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+			}
+		} else {
+
+			if ( !values[ index ] ) {
+				hidden = isHidden( elem );
+
+				if ( display && display !== "none" || !hidden ) {
+					jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+				}
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend({
+	css: function( name, value ) {
+		return jQuery.access( this, function( elem, name, value ) {
+			var len, styles,
+				map = {},
+				i = 0;
+
+			if ( jQuery.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 );
+	},
+	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 ( isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		});
+	}
+});
+
+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: {
+		"columnCount": true,
+		"fillOpacity": 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: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// 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 = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+			// but it would mean to define eight (for every problematic property) identical functions
+			if ( !jQuery.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 ) {
+
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} 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 num, val, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		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 ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+		}
+		return val;
+	}
+});
+
+// NOTE: we've included the "window" in window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+	getStyles = function( elem ) {
+		return window.getComputedStyle( elem, null );
+	};
+
+	curCSS = function( elem, name, _computed ) {
+		var width, minWidth, maxWidth,
+			computed = _computed || getStyles( elem ),
+
+			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
+			ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
+			style = elem.style;
+
+		if ( computed ) {
+
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+			if ( rnumnonpx.test( ret ) && rmargin.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;
+	};
+} else if ( document.documentElement.currentStyle ) {
+	getStyles = function( elem ) {
+		return elem.currentStyle;
+	};
+
+	curCSS = function( elem, name, _computed ) {
+		var left, rs, rsLeft,
+			computed = _computed || getStyles( elem ),
+			ret = computed ? computed[ name ] : undefined,
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		// but not position css attributes, as those are proportional to the parent element instead
+		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rs = elem.runtimeStyle;
+			rsLeft = rs && rs.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				rs.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				rs.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+		value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+		// If we already have the right measurement, avoid augmentation
+		4 :
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+		}
+
+		if ( isBorderBox ) {
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		} else {
+			// at this point, extra isn't content, so add padding
+			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var valueIsBorderBox = true,
+		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		styles = getStyles( elem ),
+		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name, styles );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test(val) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles
+		)
+	) + "px";
+}
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+	var doc = document,
+		display = elemdisplay[ nodeName ];
+
+	if ( !display ) {
+		display = actualDisplay( nodeName, doc );
+
+		// If the simple way fails, read from inside an iframe
+		if ( display === "none" || !display ) {
+			// Use the already-created iframe if possible
+			iframe = ( iframe ||
+				jQuery("<iframe frameborder='0' width='0' height='0'/>")
+				.css( "cssText", "display:block !important" )
+			).appendTo( doc.documentElement );
+
+			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+			doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
+			doc.write("<!doctype html><html><body>");
+			doc.close();
+
+			display = actualDisplay( nodeName, doc );
+			iframe.detach();
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return display;
+}
+
+// Called ONLY from within css_defaultDisplay
+function actualDisplay( name, doc ) {
+	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+		display = jQuery.css( elem[0], "display" );
+	elem.remove();
+	return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+					jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					}) :
+					getWidthOrHeight( elem, name, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var styles = extra && getStyles( elem );
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+					styles
+				) : 0
+			);
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			// if value === "", then remove inline opacity #12685
+			if ( ( value >= 1 || value === "" ) &&
+					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+					style.removeAttribute ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there is no filter style applied in a css rule or unset inline opacity, we are done
+				if ( value === "" || currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+					// Work around by temporarily setting element display to inline-block
+					return jQuery.swap( elem, { "display": "inline-block" },
+						curCSS, [ elem, "marginRight" ] );
+				}
+			}
+		};
+	}
+
+	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+	// getComputedStyle returns percent when specified for top/left/bottom/right
+	// rather than make the css module depend on the offset module, we just check for it here
+	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+		jQuery.each( [ "top", "left" ], function( i, prop ) {
+			jQuery.cssHooks[ prop ] = {
+				get: function( elem, computed ) {
+					if ( computed ) {
+						computed = curCSS( elem, prop );
+						// if curCSS returns percentage, fallback to offset
+						return rnumnonpx.test( computed ) ?
+							jQuery( elem ).position()[ prop ] + "px" :
+							computed;
+					}
+				}
+			};
+		});
+	}
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		// Support: Opera <= 12.12
+		// Opera reports offsetWidths and offsetHeights less than zero on some elements
+		return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
+			(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// 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 ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+});
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+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 || !manipulation_rcheckableType.test( type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+//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, value ) {
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( jQuery.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( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( jQuery.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" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+jQuery.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( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+});
+
+jQuery.fn.extend({
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+	}
+});
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+	ajax_nonce = jQuery.now(),
+
+	ajax_rquery = /\?/,
+	rhash = /#.*$/,
+	rts = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* 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("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// 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( core_rnotwhite ) || [];
+
+		if ( jQuery.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 deep, key,
+		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;
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+	if ( typeof url !== "string" && _load ) {
+		return _load.apply( this, arguments );
+	}
+
+	var selector, response, type,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = url.slice( off, url.length );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( jQuery.isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax({
+			url: url,
+
+			// if "type" variable is undefined, then "GET" method will be used
+			type: type,
+			dataType: "html",
+			data: params
+		}).done(function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		}).complete( callback && function( jqXHR, status ) {
+			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+		});
+	}
+
+	return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
+	jQuery.fn[ type ] = function( fn ){
+		return this.on( type, fn );
+	};
+});
+
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		type: "GET",
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		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: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		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": jQuery.parseJSON,
+
+			// 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 // Cross-domain detection vars
+			parts,
+			// Loop variable
+			i,
+			// URL without anti-cache param
+			cacheURL,
+			// Response headers as string
+			responseHeadersString,
+			// timeout handle
+			timeoutTimer,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			transport,
+			// Response headers
+			responseHeaders,
+			// 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 = {},
+			// The jqXHR state
+			state = 0,
+			// Default abort message
+			strAbort = "canceled",
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						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 state === 2 ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					var lname = name.toLowerCase();
+					if ( !state ) {
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( state < 2 ) {
+							for ( code in map ) {
+								// Lazy-add the new callback in a way that preserves old ones
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						} else {
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						}
+					}
+					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 ).complete = completeDeferred.add;
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// 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 || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+			);
+		}
+
+		// 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 ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = 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
+		cacheURL = s.url;
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+				s.url = rts.test( cacheURL ) ?
+
+					// If there is already a '_' parameter, set its value
+					cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
+
+					// Otherwise add one to the end
+					cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
+			}
+		}
+
+		// 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 || state === 2 ) ) {
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// 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 ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout(function() {
+					jqXHR.abort("timeout");
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				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 {
+				// We extract error from statusText
+				// then normalize statusText and status 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 ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		});
+	};
+});
+
+/* 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 firstDataType, ct, finalDataType, type,
+		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 };
+}
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /(?:java|ecma)script/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || jQuery("head")[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement("script");
+
+				script.async = true;
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( script.parentNode ) {
+							script.parentNode.removeChild( script );
+						}
+
+						// Dereference the script
+						script = null;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+
+				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( undefined, true );
+				}
+			}
+		};
+	}
+});
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always(function() {
+			// Restore preexisting value
+			window[ callbackName ] = overwritten;
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		});
+
+		// Delegate to script
+		return "script";
+	}
+});
+var xhrCallbacks, xhrSupported,
+	xhrId = 0,
+	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject && function() {
+		// Abort all pending requests
+		var key;
+		for ( key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( undefined, true );
+		}
+	};
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject("Microsoft.XMLHTTP");
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+xhrSupported = jQuery.ajaxSettings.xhr();
+jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = jQuery.support.ajax = !!xhrSupported;
+
+// Create transport if the browser can provide an xhr
+if ( xhrSupported ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var handle, i,
+						xhr = s.xhr();
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.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 ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers["X-Requested-With"] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( err ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+						var status, responseHeaders, statusText, responses;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occurred
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									responses = {};
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									if ( typeof xhr.responseText === "string" ) {
+										responses.text = xhr.responseText;
+									}
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					if ( !s.async ) {
+						// if we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						setTimeout( callback );
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback( undefined, true );
+					}
+				}
+			};
+		}
+	});
+}
+var fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [function( prop, value ) {
+			var tween = this.createTween( prop, value ),
+				target = tween.cur(),
+				parts = rfxnum.exec( value ),
+				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+				// Starting value computation is required for potential unit mismatches
+				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+				scale = 1,
+				maxIterations = 20;
+
+			if ( start && start[ 3 ] !== unit ) {
+				// Trust units reported by jQuery.css
+				unit = unit || start[ 3 ];
+
+				// Make sure we update the tween properties later on
+				parts = parts || [];
+
+				// Iteratively approximate from a nonzero starting point
+				start = +target || 1;
+
+				do {
+					// If previous iteration zeroed out, double until we get *something*
+					// Use a string for doubling factor so we don't accidentally see scale as unchanged below
+					scale = scale || ".5";
+
+					// Adjust and apply
+					start = start / scale;
+					jQuery.style( tween.elem, prop, start + unit );
+
+				// Update scale, tolerating zero or NaN from tween.cur()
+				// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+			}
+
+			// Update tween properties
+			if ( parts ) {
+				start = tween.start = +start || +target || 0;
+				tween.unit = unit;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[ 1 ] ?
+					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+					+parts[ 2 ];
+			}
+
+			return tween;
+		}]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	});
+	return ( fxNow = jQuery.now() );
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( tweeners[ prop ] || [] ).concat( 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 Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = animationPrefilters.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 ),
+				// 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 ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise({
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, { specialEasing: {} }, 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.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 = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			return result;
+		}
+	}
+
+	jQuery.map( props, createTween, animation );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		})
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.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 wont overwrite keys already present.
+			// also - reusing 'index' from above 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;
+		}
+	}
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.split(" ");
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			tweeners[ prop ] = tweeners[ prop ] || [];
+			tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			animationPrefilters.unshift( callback );
+		} else {
+			animationPrefilters.push( callback );
+		}
+	}
+});
+
+function defaultPrefilter( elem, props, opts ) {
+	/* jshint validthis: true */
+	var prop, value, toggle, tween, hooks, oldfire,
+		anim = this,
+		orig = {},
+		style = elem.style,
+		hidden = elem.nodeType && isHidden( elem ),
+		dataShow = jQuery._data( elem, "fxshow" );
+
+	// handle queue: false promises
+	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() {
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always(function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			});
+		});
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+		// Make sure that nothing sneaks out
+		// Record all 3 overflow attributes because IE does not
+		// change the overflow attribute when overflowX and
+		// overflowY are set to the same value
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		if ( jQuery.css( elem, "display" ) === "inline" &&
+				jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !jQuery.support.shrinkWrapBlocks ) {
+			anim.always(function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			});
+		}
+	}
+
+
+	// show/hide pass
+	for ( prop in props ) {
+		value = props[ prop ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ prop ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+				continue;
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+		}
+	}
+
+	if ( !jQuery.isEmptyObject( orig ) ) {
+		if ( dataShow ) {
+			if ( "hidden" in dataShow ) {
+				hidden = dataShow.hidden;
+			}
+		} else {
+			dataShow = jQuery._data( elem, "fxshow", {} );
+		}
+
+		// store state if its toggle - enables .stop().toggle() to "reverse"
+		if ( toggle ) {
+			dataShow.hidden = !hidden;
+		}
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done(function() {
+				jQuery( elem ).hide();
+			});
+		}
+		anim.done(function() {
+			var prop;
+			jQuery._removeData( elem, "fxshow" );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		});
+		for ( prop in orig ) {
+			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+	}
+}
+
+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 || "swing";
+		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;
+
+			if ( tween.elem[ tween.prop ] != null &&
+				(!tween.elem.style || 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
+			// so, 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 its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.style && ( 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
+// 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.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 );
+	};
+});
+
+jQuery.fn.extend({
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).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 || jQuery._data( 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 = jQuery._data( 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 = jQuery._data( 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;
+		});
+	}
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, 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;
+}
+
+// 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.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			jQuery.isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+	};
+
+	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ 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 ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p*Math.PI ) / 2;
+	}
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	fxNow = jQuery.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	if ( timer() && jQuery.timers.push( timer ) ) {
+		jQuery.fx.start();
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+	if ( !timerId ) {
+		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.stop = function() {
+	clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+	// Default speed
+	_default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var docElem, win,
+		box = { top: 0, left: 0 },
+		elem = this[ 0 ],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return;
+	}
+
+	docElem = doc.documentElement;
+
+	// Make sure it's not a disconnected DOM node
+	if ( !jQuery.contains( docElem, elem ) ) {
+		return box;
+	}
+
+	// If we don't have gBCR, just use 0,0 rather than error
+	// BlackBerry 5, iOS 3 (original iPhone)
+	if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
+		box = elem.getBoundingClientRect();
+	}
+	win = getWindow( doc );
+	return {
+		top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
+		left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+	};
+};
+
+jQuery.offset = {
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset,
+			parentOffset = { top: 0, left: 0 },
+			elem = this[ 0 ];
+
+		// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+			// we assume that getBoundingClientRect is available when computed position is fixed
+			offset = elem.getBoundingClientRect();
+		} else {
+			// Get *real* offsetParent
+			offsetParent = this.offsetParent();
+
+			// Get correct offsets
+			offset = this.offset();
+			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+				parentOffset = offsetParent.offset();
+			}
+
+			// Add offsetParent borders
+			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+		}
+
+		// Subtract parent offsets and element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		return {
+			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || docElem;
+			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent || docElem;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return jQuery.access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	});
+});
+// Limit scope pollution from any deprecated API
+// (function() {
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+	return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// })();
+if ( typeof module === "object" && module && typeof module.exports === "object" ) {
+	// Expose jQuery as module.exports in loaders that implement the Node
+	// module pattern (including browserify). Do not create the global, since
+	// the user will be storing it themselves locally, and globals are frowned
+	// upon in the Node module world.
+	module.exports = jQuery;
+} else {
+	// Otherwise expose jQuery to the global object as usual
+	window.jQuery = window.$ = jQuery;
+
+	// Register as a named AMD module, since jQuery can be concatenated with other
+	// files that may use define, but not via a proper concatenation script that
+	// understands anonymous AMD modules. A named AMD is safest and most robust
+	// way to register. Lowercase jquery is used because AMD module names are
+	// derived from file names, and jQuery is normally delivered in a lowercase
+	// file name. Do this after creating the global so that if an AMD module wants
+	// to call noConflict to hide this version of jQuery, it will work.
+	if ( typeof define === "function" && define.amd ) {
+		define( "jquery", [], function () { return jQuery; } );
+	}
+}
+
+})( window );
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.min.js
new file mode 100644
index 0000000..da41706
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.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="<div class='a'></div><div class='a i'></div>",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="<select><option selected=''></option></select>",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="<a href='#'></a>","#"===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="<input/>",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="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",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></: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="<table><tr><td></td><td>t</td></tr></table>",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="<div></div>",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=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},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></$2>");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></$2>")+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)?"<table>"!==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("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.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=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.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){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},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)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):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):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.min.map b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.min.map
new file mode 100644
index 0000000..4dc4920
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/jquery-1.10.2.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"jquery-1.10.2.min.js","sources":["jquery-1.10.2.js"],"names":["window","undefined","readyList","rootjQuery","core_strundefined","location","document","docElem","documentElement","_jQuery","jQuery","_$","$","class2type","core_deletedIds","core_version","core_concat","concat","core_push","push","core_slice","slice","core_indexOf","indexOf","core_toString","toString","core_hasOwn","hasOwnProperty","core_trim","trim","selector","context","fn","init","core_pnum","source","core_rnotwhite","rtrim","rquickExpr","rsingleTag","rvalidchars","rvalidbraces","rvalidescape","rvalidtokens","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","completed","event","addEventListener","type","readyState","detach","ready","removeEventListener","detachEvent","prototype","jquery","constructor","match","elem","this","charAt","length","exec","find","merge","parseHTML","nodeType","ownerDocument","test","isPlainObject","isFunction","attr","getElementById","parentNode","id","makeArray","toArray","call","get","num","pushStack","elems","ret","prevObject","each","callback","args","promise","done","apply","arguments","first","eq","last","i","len","j","map","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isArray","expando","Math","random","replace","noConflict","isReady","readyWait","holdReady","hold","wait","body","setTimeout","resolveWith","trigger","off","obj","Array","isWindow","isNumeric","isNaN","parseFloat","isFinite","String","key","e","support","ownLast","isEmptyObject","error","msg","Error","data","keepScripts","parsed","scripts","createElement","buildFragment","remove","childNodes","parseJSON","JSON","parse","Function","parseXML","xml","tmp","DOMParser","parseFromString","ActiveXObject","async","loadXML","getElementsByTagName","noop","globalEval","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","arr","results","Object","inArray","max","second","l","grep","inv","retVal","arg","guid","proxy","access","chainable","emptyGet","raw","bulk","now","Date","getTime","swap","old","style","Deferred","attachEvent","top","frameElement","doScroll","doScrollCheck","split","cachedruns","Expr","getText","isXML","compile","outermostContext","sortInput","setDocument","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","hasDuplicate","sortOrder","a","b","strundefined","MAX_NEGATIVE","hasOwn","pop","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","RegExp","rcomma","rcombinators","rsibling","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rnative","rinputs","rheader","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","fromCharCode","els","Sizzle","seed","m","groups","nid","newContext","newSelector","getElementsByClassName","qsa","tokenize","getAttribute","setAttribute","toSelector","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","cacheLength","shift","markFunction","assert","div","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","node","doc","parent","defaultView","className","appendChild","createComment","innerHTML","firstChild","getById","getElementsByName","filter","attrId","getAttributeNode","tag","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","dirkey","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","dirrunsUnique","group","contexts","token","div1","defaultValue","unique","isXMLDoc","optionsCache","createOptions","object","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","list","stack","once","fire","stopOnFalse","self","disable","add","index","lock","locked","fireWith","func","tuples","state","always","deferred","fail","then","fns","newDefer","tuple","action","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","progressContexts","resolveContexts","fragment","opt","eventName","isSupported","cssText","getSetAttribute","leadingWhitespace","tbody","htmlSerialize","hrefNormalized","opacity","cssFloat","checkOn","optSelected","enctype","html5Clone","cloneNode","outerHTML","inlineBlockNeedsLayout","shrinkWrapBlocks","pixelPosition","deleteExpando","noCloneEvent","reliableMarginRight","boxSizingReliable","noCloneChecked","optDisabled","radioValue","createDocumentFragment","appendChecked","checkClone","click","change","focusin","backgroundClip","clearCloneStyle","container","marginDiv","tds","divReset","offsetHeight","display","reliableHiddenOffsets","zoom","boxSizing","offsetWidth","getComputedStyle","width","marginRight","rbrace","rmultiDash","internalData","pvt","acceptData","thisCache","internalKey","isNode","toJSON","internalRemoveData","isEmptyDataObject","cleanData","noData","applet","embed","hasData","removeData","_data","_removeData","dataAttr","queue","dequeue","startLength","hooks","_queueHooks","next","stop","setter","delay","time","fx","speeds","timeout","clearTimeout","clearQueue","count","defer","nodeHook","boolHook","rclass","rreturn","rfocusable","rclickable","ruseDefault","getSetInput","removeAttr","prop","removeProp","propFix","addClass","classes","clazz","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","valHooks","set","option","one","optionSet","nType","attrHooks","propName","attrNames","for","class","notxml","propHooks","tabindex","parseInt","getter","setAttributeNode","createAttribute","coords","contenteditable","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","global","types","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","original","which","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","orig","related","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","origFn","triggerHandler","isSimple","rparentsprev","rneedsContext","guaranteedUnique","children","contents","prev","targets","winnow","is","closest","pos","prevAll","addBack","sibling","parents","parentsUntil","until","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","n","r","qualifier","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","manipulation_rcheckableType","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","append","createTextNode","domManip","manipulationTarget","prepend","insertBefore","before","after","keepData","getAll","setGlobalEval","dataAndEvents","deepDataAndEvents","html","replaceWith","allowIntersection","hasScripts","iNoClone","disableScript","restoreScript","_evalUrl","content","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultChecked","defaultSelected","appendTo","prependTo","insertAfter","replaceAll","insert","found","fixDefaultChecked","destElements","srcElements","inPage","selection","wrap","safe","nodes","url","ajax","dataType","throws","wrapAll","wrapInner","unwrap","iframe","getStyles","curCSS","ralpha","ropacity","rposition","rdisplayswap","rmargin","rnumsplit","rnumnonpx","rrelNum","elemdisplay","BODY","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssExpand","cssPrefixes","vendorPropName","capName","origName","isHidden","el","css","showHide","show","hidden","css_defaultDisplay","styles","hide","toggle","cssHooks","computed","cssNumber","columnCount","fillOpacity","lineHeight","order","orphans","widows","zIndex","cssProps","float","extra","_computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","setPositiveNumber","subtract","augmentWidthOrHeight","isBorderBox","getWidthOrHeight","valueIsBorderBox","actualDisplay","write","close","$1","visible","margin","padding","border","prefix","suffix","expand","expanded","parts","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","serialize","serializeArray","traditional","s","encodeURIComponent","ajaxSettings","buildParams","v","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","ajaxLocParts","ajaxLocation","ajax_nonce","ajax_rquery","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","_load","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","originalOptions","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","params","response","responseText","complete","status","active","lastModified","etag","isLocal","processData","contentType","accepts","*","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","mimeType","code","abort","statusText","finalText","success","method","crossDomain","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","responses","isSuccess","modified","ajaxHandleResponses","ajaxConvert","rejectWith","getJSON","getScript","firstDataType","ct","finalDataType","conv2","current","conv","dataFilter","script","text script","head","scriptCharset","charset","onload","onreadystatechange","isAbort","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","xhrCallbacks","xhrSupported","xhrId","xhrOnUnloadAbort","createStandardXHR","XMLHttpRequest","createActiveXHR","xhr","cors","username","open","xhrFields","firefoxAccessException","unload","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","tween","createTween","unit","scale","maxIterations","createFxNow","animation","collection","Animation","properties","stopped","tick","currentTime","startTime","duration","percent","tweens","run","opts","specialEasing","originalProperties","Tween","easing","gotoEnd","propFilter","timer","anim","tweener","prefilter","oldfire","dataShow","unqueued","overflow","overflowX","overflowY","eased","step","cssFn","speed","animate","genFx","fadeTo","to","optall","doAnimation","finish","stopQueue","timers","includeWidth","height","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","linear","p","swing","cos","PI","interval","setInterval","clearInterval","slow","fast","animated","offset","setOffset","win","box","getBoundingClientRect","getWindow","pageYOffset","pageXOffset","curElem","curOffset","curCSSTop","curCSSLeft","calculatePosition","curPosition","curTop","curLeft","using","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","module","exports","define","amd"],"mappings":";;;CAaA,SAAWA,EAAQC,GAOnB,GAECC,GAGAC,EAIAC,QAA2BH,GAG3BI,EAAWL,EAAOK,SAClBC,EAAWN,EAAOM,SAClBC,EAAUD,EAASE,gBAGnBC,EAAUT,EAAOU,OAGjBC,EAAKX,EAAOY,EAGZC,KAGAC,KAEAC,EAAe,SAGfC,EAAcF,EAAgBG,OAC9BC,EAAYJ,EAAgBK,KAC5BC,EAAaN,EAAgBO,MAC7BC,EAAeR,EAAgBS,QAC/BC,EAAgBX,EAAWY,SAC3BC,EAAcb,EAAWc,eACzBC,EAAYb,EAAac,KAGzBnB,EAAS,SAAUoB,EAAUC,GAE5B,MAAO,IAAIrB,GAAOsB,GAAGC,KAAMH,EAAUC,EAAS5B,IAI/C+B,EAAY,sCAAsCC,OAGlDC,EAAiB,OAGjBC,EAAQ,qCAKRC,EAAa,sCAGbC,EAAa,6BAGbC,EAAc,gBACdC,EAAe,uBACfC,EAAe,qCACfC,EAAe,kEAGfC,EAAY,QACZC,EAAa,eAGbC,EAAa,SAAUC,EAAKC,GAC3B,MAAOA,GAAOC,eAIfC,EAAY,SAAUC,IAGhB7C,EAAS8C,kBAAmC,SAAfD,EAAME,MAA2C,aAAxB/C,EAASgD,cACnEC,IACA7C,EAAO8C,UAITD,EAAS,WACHjD,EAAS8C,kBACb9C,EAASmD,oBAAqB,mBAAoBP,GAAW,GAC7DlD,EAAOyD,oBAAqB,OAAQP,GAAW,KAG/C5C,EAASoD,YAAa,qBAAsBR,GAC5ClD,EAAO0D,YAAa,SAAUR,IAIjCxC,GAAOsB,GAAKtB,EAAOiD,WAElBC,OAAQ7C,EAER8C,YAAanD,EACbuB,KAAM,SAAUH,EAAUC,EAAS5B,GAClC,GAAI2D,GAAOC,CAGX,KAAMjC,EACL,MAAOkC,KAIR,IAAyB,gBAAblC,GAAwB,CAUnC,GAPCgC,EAF2B,MAAvBhC,EAASmC,OAAO,IAAyD,MAA3CnC,EAASmC,OAAQnC,EAASoC,OAAS,IAAepC,EAASoC,QAAU,GAE7F,KAAMpC,EAAU,MAGlBQ,EAAW6B,KAAMrC,IAIrBgC,IAAUA,EAAM,IAAO/B,EAqDrB,OAAMA,GAAWA,EAAQ6B,QACtB7B,GAAW5B,GAAaiE,KAAMtC,GAKhCkC,KAAKH,YAAa9B,GAAUqC,KAAMtC,EAxDzC,IAAKgC,EAAM,GAAK,CAWf,GAVA/B,EAAUA,YAAmBrB,GAASqB,EAAQ,GAAKA,EAGnDrB,EAAO2D,MAAOL,KAAMtD,EAAO4D,UAC1BR,EAAM,GACN/B,GAAWA,EAAQwC,SAAWxC,EAAQyC,eAAiBzC,EAAUzB,GACjE,IAIIiC,EAAWkC,KAAMX,EAAM,KAAQpD,EAAOgE,cAAe3C,GACzD,IAAM+B,IAAS/B,GAETrB,EAAOiE,WAAYX,KAAMF,IAC7BE,KAAMF,GAAS/B,EAAS+B,IAIxBE,KAAKY,KAAMd,EAAO/B,EAAS+B,GAK9B,OAAOE,MAQP,GAJAD,EAAOzD,EAASuE,eAAgBf,EAAM,IAIjCC,GAAQA,EAAKe,WAAa,CAG9B,GAAKf,EAAKgB,KAAOjB,EAAM,GACtB,MAAO3D,GAAWiE,KAAMtC,EAIzBkC,MAAKE,OAAS,EACdF,KAAK,GAAKD,EAKX,MAFAC,MAAKjC,QAAUzB,EACf0D,KAAKlC,SAAWA,EACTkC,KAcH,MAAKlC,GAASyC,UACpBP,KAAKjC,QAAUiC,KAAK,GAAKlC,EACzBkC,KAAKE,OAAS,EACPF,MAIItD,EAAOiE,WAAY7C,GACvB3B,EAAWqD,MAAO1B,IAGrBA,EAASA,WAAa7B,IAC1B+D,KAAKlC,SAAWA,EAASA,SACzBkC,KAAKjC,QAAUD,EAASC,SAGlBrB,EAAOsE,UAAWlD,EAAUkC,QAIpClC,SAAU,GAGVoC,OAAQ,EAERe,QAAS,WACR,MAAO7D,GAAW8D,KAAMlB,OAKzBmB,IAAK,SAAUC,GACd,MAAc,OAAPA,EAGNpB,KAAKiB,UAGG,EAANG,EAAUpB,KAAMA,KAAKE,OAASkB,GAAQpB,KAAMoB,IAKhDC,UAAW,SAAUC,GAGpB,GAAIC,GAAM7E,EAAO2D,MAAOL,KAAKH,cAAeyB,EAO5C,OAJAC,GAAIC,WAAaxB,KACjBuB,EAAIxD,QAAUiC,KAAKjC,QAGZwD,GAMRE,KAAM,SAAUC,EAAUC,GACzB,MAAOjF,GAAO+E,KAAMzB,KAAM0B,EAAUC,IAGrCnC,MAAO,SAAUxB,GAIhB,MAFAtB,GAAO8C,MAAMoC,UAAUC,KAAM7D,GAEtBgC,MAGR3C,MAAO,WACN,MAAO2C,MAAKqB,UAAWjE,EAAW0E,MAAO9B,KAAM+B,aAGhDC,MAAO,WACN,MAAOhC,MAAKiC,GAAI,IAGjBC,KAAM,WACL,MAAOlC,MAAKiC,GAAI,KAGjBA,GAAI,SAAUE,GACb,GAAIC,GAAMpC,KAAKE,OACdmC,GAAKF,GAAU,EAAJA,EAAQC,EAAM,EAC1B,OAAOpC,MAAKqB,UAAWgB,GAAK,GAASD,EAAJC,GAAYrC,KAAKqC,SAGnDC,IAAK,SAAUZ,GACd,MAAO1B,MAAKqB,UAAW3E,EAAO4F,IAAItC,KAAM,SAAUD,EAAMoC,GACvD,MAAOT,GAASR,KAAMnB,EAAMoC,EAAGpC,OAIjCwC,IAAK,WACJ,MAAOvC,MAAKwB,YAAcxB,KAAKH,YAAY,OAK5C1C,KAAMD,EACNsF,QAASA,KACTC,UAAWA,QAIZ/F,EAAOsB,GAAGC,KAAK0B,UAAYjD,EAAOsB,GAElCtB,EAAOgG,OAAShG,EAAOsB,GAAG0E,OAAS,WAClC,GAAIC,GAAKC,EAAaC,EAAMC,EAAMC,EAASC,EAC1CC,EAASlB,UAAU,OACnBI,EAAI,EACJjC,EAAS6B,UAAU7B,OACnBgD,GAAO,CAqBR,KAlBuB,iBAAXD,KACXC,EAAOD,EACPA,EAASlB,UAAU,OAEnBI,EAAI,GAIkB,gBAAXc,IAAwBvG,EAAOiE,WAAWsC,KACrDA,MAII/C,IAAWiC,IACfc,EAASjD,OACPmC,GAGSjC,EAAJiC,EAAYA,IAEnB,GAAmC,OAA7BY,EAAUhB,UAAWI,IAE1B,IAAMW,IAAQC,GACbJ,EAAMM,EAAQH,GACdD,EAAOE,EAASD,GAGXG,IAAWJ,IAKXK,GAAQL,IAAUnG,EAAOgE,cAAcmC,KAAUD,EAAclG,EAAOyG,QAAQN,MAC7ED,GACJA,GAAc,EACdI,EAAQL,GAAOjG,EAAOyG,QAAQR,GAAOA,MAGrCK,EAAQL,GAAOjG,EAAOgE,cAAciC,GAAOA,KAI5CM,EAAQH,GAASpG,EAAOgG,OAAQQ,EAAMF,EAAOH,IAGlCA,IAAS5G,IACpBgH,EAAQH,GAASD,GAOrB,OAAOI,IAGRvG,EAAOgG,QAGNU,QAAS,UAAarG,EAAesG,KAAKC,UAAWC,QAAS,MAAO,IAErEC,WAAY,SAAUN,GASrB,MARKlH,GAAOY,IAAMF,IACjBV,EAAOY,EAAID,GAGPuG,GAAQlH,EAAOU,SAAWA,IAC9BV,EAAOU,OAASD,GAGVC,GAIR+G,SAAS,EAITC,UAAW,EAGXC,UAAW,SAAUC,GACfA,EACJlH,EAAOgH,YAEPhH,EAAO8C,OAAO,IAKhBA,MAAO,SAAUqE,GAGhB,GAAKA,KAAS,KAASnH,EAAOgH,WAAYhH,EAAO+G,QAAjD,CAKA,IAAMnH,EAASwH,KACd,MAAOC,YAAYrH,EAAO8C,MAI3B9C,GAAO+G,SAAU,EAGZI,KAAS,KAAUnH,EAAOgH,UAAY,IAK3CxH,EAAU8H,YAAa1H,GAAYI,IAG9BA,EAAOsB,GAAGiG,SACdvH,EAAQJ,GAAW2H,QAAQ,SAASC,IAAI,YAO1CvD,WAAY,SAAUwD,GACrB,MAA4B,aAArBzH,EAAO2C,KAAK8E,IAGpBhB,QAASiB,MAAMjB,SAAW,SAAUgB,GACnC,MAA4B,UAArBzH,EAAO2C,KAAK8E,IAGpBE,SAAU,SAAUF,GAEnB,MAAc,OAAPA,GAAeA,GAAOA,EAAInI,QAGlCsI,UAAW,SAAUH,GACpB,OAAQI,MAAOC,WAAWL,KAAUM,SAAUN,IAG/C9E,KAAM,SAAU8E,GACf,MAAY,OAAPA,EACWA,EAARO,GAEc,gBAARP,IAAmC,kBAARA,GACxCtH,EAAYW,EAAc0D,KAAKiD,KAAU,eAClCA,IAGTzD,cAAe,SAAUyD,GACxB,GAAIQ,EAKJ,KAAMR,GAA4B,WAArBzH,EAAO2C,KAAK8E,IAAqBA,EAAI5D,UAAY7D,EAAO2H,SAAUF,GAC9E,OAAO,CAGR,KAEC,GAAKA,EAAItE,cACPnC,EAAYwD,KAAKiD,EAAK,iBACtBzG,EAAYwD,KAAKiD,EAAItE,YAAYF,UAAW,iBAC7C,OAAO,EAEP,MAAQiF,GAET,OAAO,EAKR,GAAKlI,EAAOmI,QAAQC,QACnB,IAAMH,IAAOR,GACZ,MAAOzG,GAAYwD,KAAMiD,EAAKQ,EAMhC,KAAMA,IAAOR,IAEb,MAAOQ,KAAQ1I,GAAayB,EAAYwD,KAAMiD,EAAKQ,IAGpDI,cAAe,SAAUZ,GACxB,GAAIrB,EACJ,KAAMA,IAAQqB,GACb,OAAO,CAER,QAAO,GAGRa,MAAO,SAAUC,GAChB,KAAUC,OAAOD,IAMlB3E,UAAW,SAAU6E,EAAMpH,EAASqH,GACnC,IAAMD,GAAwB,gBAATA,GACpB,MAAO,KAEgB,kBAAZpH,KACXqH,EAAcrH,EACdA,GAAU,GAEXA,EAAUA,GAAWzB,CAErB,IAAI+I,GAAS9G,EAAW4B,KAAMgF,GAC7BG,GAAWF,KAGZ,OAAKC,IACKtH,EAAQwH,cAAeF,EAAO,MAGxCA,EAAS3I,EAAO8I,eAAiBL,GAAQpH,EAASuH,GAC7CA,GACJ5I,EAAQ4I,GAAUG,SAEZ/I,EAAO2D,SAAWgF,EAAOK,cAGjCC,UAAW,SAAUR,GAEpB,MAAKnJ,GAAO4J,MAAQ5J,EAAO4J,KAAKC,MACxB7J,EAAO4J,KAAKC,MAAOV,GAGb,OAATA,EACGA,EAGa,gBAATA,KAGXA,EAAOzI,EAAOmB,KAAMsH,GAEfA,GAGC3G,EAAYiC,KAAM0E,EAAK5B,QAAS7E,EAAc,KACjD6E,QAAS5E,EAAc,KACvB4E,QAAS9E,EAAc,MAEXqH,SAAU,UAAYX,MAKtCzI,EAAOsI,MAAO,iBAAmBG,GAAjCzI,IAIDqJ,SAAU,SAAUZ,GACnB,GAAIa,GAAKC,CACT,KAAMd,GAAwB,gBAATA,GACpB,MAAO,KAER,KACMnJ,EAAOkK,WACXD,EAAM,GAAIC,WACVF,EAAMC,EAAIE,gBAAiBhB,EAAO,cAElCa,EAAM,GAAII,eAAe,oBACzBJ,EAAIK,MAAQ,QACZL,EAAIM,QAASnB,IAEb,MAAOP,GACRoB,EAAM/J,EAKP,MAHM+J,IAAQA,EAAIxJ,kBAAmBwJ,EAAIO,qBAAsB,eAAgBrG,QAC9ExD,EAAOsI,MAAO,gBAAkBG,GAE1Ba,GAGRQ,KAAM,aAKNC,WAAY,SAAUtB,GAChBA,GAAQzI,EAAOmB,KAAMsH,KAIvBnJ,EAAO0K,YAAc,SAAUvB,GAChCnJ,EAAe,KAAEkF,KAAMlF,EAAQmJ,KAC3BA,IAMPwB,UAAW,SAAUC,GACpB,MAAOA,GAAOrD,QAAS3E,EAAW,OAAQ2E,QAAS1E,EAAYC,IAGhE+H,SAAU,SAAU9G,EAAM+C,GACzB,MAAO/C,GAAK8G,UAAY9G,EAAK8G,SAASC,gBAAkBhE,EAAKgE,eAI9DrF,KAAM,SAAU0C,EAAKzC,EAAUC,GAC9B,GAAIoF,GACH5E,EAAI,EACJjC,EAASiE,EAAIjE,OACbiD,EAAU6D,EAAa7C,EAExB,IAAKxC,GACJ,GAAKwB,GACJ,KAAYjD,EAAJiC,EAAYA,IAGnB,GAFA4E,EAAQrF,EAASI,MAAOqC,EAAKhC,GAAKR,GAE7BoF,KAAU,EACd,UAIF,KAAM5E,IAAKgC,GAGV,GAFA4C,EAAQrF,EAASI,MAAOqC,EAAKhC,GAAKR,GAE7BoF,KAAU,EACd,UAOH,IAAK5D,GACJ,KAAYjD,EAAJiC,EAAYA,IAGnB,GAFA4E,EAAQrF,EAASR,KAAMiD,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpC4E,KAAU,EACd,UAIF,KAAM5E,IAAKgC,GAGV,GAFA4C,EAAQrF,EAASR,KAAMiD,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpC4E,KAAU,EACd,KAMJ,OAAO5C,IAIRtG,KAAMD,IAAcA,EAAUsD,KAAK,gBAClC,SAAU+F,GACT,MAAe,OAARA,EACN,GACArJ,EAAUsD,KAAM+F,IAIlB,SAAUA,GACT,MAAe,OAARA,EACN,IACEA,EAAO,IAAK1D,QAASlF,EAAO,KAIjC2C,UAAW,SAAUkG,EAAKC,GACzB,GAAI5F,GAAM4F,KAaV,OAXY,OAAPD,IACCF,EAAaI,OAAOF,IACxBxK,EAAO2D,MAAOkB,EACE,gBAAR2F,IACLA,GAAQA,GAGXhK,EAAUgE,KAAMK,EAAK2F,IAIhB3F,GAGR8F,QAAS,SAAUtH,EAAMmH,EAAK/E,GAC7B,GAAIC,EAEJ,IAAK8E,EAAM,CACV,GAAK5J,EACJ,MAAOA,GAAa4D,KAAMgG,EAAKnH,EAAMoC,EAMtC,KAHAC,EAAM8E,EAAIhH,OACViC,EAAIA,EAAQ,EAAJA,EAAQkB,KAAKiE,IAAK,EAAGlF,EAAMD,GAAMA,EAAI,EAEjCC,EAAJD,EAASA,IAEhB,GAAKA,IAAK+E,IAAOA,EAAK/E,KAAQpC,EAC7B,MAAOoC,GAKV,MAAO,IAGR9B,MAAO,SAAU2B,EAAOuF,GACvB,GAAIC,GAAID,EAAOrH,OACdiC,EAAIH,EAAM9B,OACVmC,EAAI,CAEL,IAAkB,gBAANmF,GACX,KAAYA,EAAJnF,EAAOA,IACdL,EAAOG,KAAQoF,EAAQlF,OAGxB,OAAQkF,EAAOlF,KAAOpG,EACrB+F,EAAOG,KAAQoF,EAAQlF,IAMzB,OAFAL,GAAM9B,OAASiC,EAERH,GAGRyF,KAAM,SAAUnG,EAAOI,EAAUgG,GAChC,GAAIC,GACHpG,KACAY,EAAI,EACJjC,EAASoB,EAAMpB,MAKhB,KAJAwH,IAAQA,EAIIxH,EAAJiC,EAAYA,IACnBwF,IAAWjG,EAAUJ,EAAOa,GAAKA,GAC5BuF,IAAQC,GACZpG,EAAIpE,KAAMmE,EAAOa,GAInB,OAAOZ,IAIRe,IAAK,SAAUhB,EAAOI,EAAUkG,GAC/B,GAAIb,GACH5E,EAAI,EACJjC,EAASoB,EAAMpB,OACfiD,EAAU6D,EAAa1F,GACvBC,IAGD,IAAK4B,EACJ,KAAYjD,EAAJiC,EAAYA,IACnB4E,EAAQrF,EAAUJ,EAAOa,GAAKA,EAAGyF,GAEnB,MAATb,IACJxF,EAAKA,EAAIrB,QAAW6G,OAMtB,KAAM5E,IAAKb,GACVyF,EAAQrF,EAAUJ,EAAOa,GAAKA,EAAGyF,GAEnB,MAATb,IACJxF,EAAKA,EAAIrB,QAAW6G,EAMvB,OAAO/J,GAAY8E,SAAWP,IAI/BsG,KAAM,EAINC,MAAO,SAAU9J,EAAID,GACpB,GAAI4D,GAAMmG,EAAO7B,CAUjB,OARwB,gBAAZlI,KACXkI,EAAMjI,EAAID,GACVA,EAAUC,EACVA,EAAKiI,GAKAvJ,EAAOiE,WAAY3C,IAKzB2D,EAAOvE,EAAW8D,KAAMa,UAAW,GACnC+F,EAAQ,WACP,MAAO9J,GAAG8D,MAAO/D,GAAWiC,KAAM2B,EAAK1E,OAAQG,EAAW8D,KAAMa,cAIjE+F,EAAMD,KAAO7J,EAAG6J,KAAO7J,EAAG6J,MAAQnL,EAAOmL,OAElCC,GAZC7L,GAiBT8L,OAAQ,SAAUzG,EAAOtD,EAAI2G,EAAKoC,EAAOiB,EAAWC,EAAUC,GAC7D,GAAI/F,GAAI,EACPjC,EAASoB,EAAMpB,OACfiI,EAAc,MAAPxD,CAGR,IAA4B,WAAvBjI,EAAO2C,KAAMsF,GAAqB,CACtCqD,GAAY,CACZ,KAAM7F,IAAKwC,GACVjI,EAAOqL,OAAQzG,EAAOtD,EAAImE,EAAGwC,EAAIxC,IAAI,EAAM8F,EAAUC,OAIhD,IAAKnB,IAAU9K,IACrB+L,GAAY,EAENtL,EAAOiE,WAAYoG,KACxBmB,GAAM,GAGFC,IAECD,GACJlK,EAAGkD,KAAMI,EAAOyF,GAChB/I,EAAK,OAILmK,EAAOnK,EACPA,EAAK,SAAU+B,EAAM4E,EAAKoC,GACzB,MAAOoB,GAAKjH,KAAMxE,EAAQqD,GAAQgH,MAKhC/I,GACJ,KAAYkC,EAAJiC,EAAYA,IACnBnE,EAAIsD,EAAMa,GAAIwC,EAAKuD,EAAMnB,EAAQA,EAAM7F,KAAMI,EAAMa,GAAIA,EAAGnE,EAAIsD,EAAMa,GAAIwC,IAK3E,OAAOqD,GACN1G,EAGA6G,EACCnK,EAAGkD,KAAMI,GACTpB,EAASlC,EAAIsD,EAAM,GAAIqD,GAAQsD,GAGlCG,IAAK,WACJ,OAAO,GAAMC,OAASC,WAMvBC,KAAM,SAAUxI,EAAMgD,EAASrB,EAAUC,GACxC,GAAIJ,GAAKuB,EACR0F,IAGD,KAAM1F,IAAQC,GACbyF,EAAK1F,GAAS/C,EAAK0I,MAAO3F,GAC1B/C,EAAK0I,MAAO3F,GAASC,EAASD,EAG/BvB,GAAMG,EAASI,MAAO/B,EAAM4B,MAG5B,KAAMmB,IAAQC,GACbhD,EAAK0I,MAAO3F,GAAS0F,EAAK1F,EAG3B,OAAOvB,MAIT7E,EAAO8C,MAAMoC,QAAU,SAAUuC,GAChC,IAAMjI,EAOL,GALAA,EAAYQ,EAAOgM,WAKU,aAAxBpM,EAASgD,WAEbyE,WAAYrH,EAAO8C,WAGb,IAAKlD,EAAS8C,iBAEpB9C,EAAS8C,iBAAkB,mBAAoBF,GAAW,GAG1DlD,EAAOoD,iBAAkB,OAAQF,GAAW,OAGtC,CAEN5C,EAASqM,YAAa,qBAAsBzJ,GAG5ClD,EAAO2M,YAAa,SAAUzJ,EAI9B,IAAI0J,IAAM,CAEV,KACCA,EAA6B,MAAvB5M,EAAO6M,cAAwBvM,EAASE,gBAC7C,MAAMoI,IAEHgE,GAAOA,EAAIE,UACf,QAAUC,KACT,IAAMrM,EAAO+G,QAAU,CAEtB,IAGCmF,EAAIE,SAAS,QACZ,MAAMlE,GACP,MAAOb,YAAYgF,EAAe,IAInCxJ,IAGA7C,EAAO8C,YAMZ,MAAOtD,GAAU0F,QAASuC,IAI3BzH,EAAO+E,KAAK,gEAAgEuH,MAAM,KAAM,SAAS7G,EAAGW,GACnGjG,EAAY,WAAaiG,EAAO,KAAQA,EAAKgE,eAG9C,SAASE,GAAa7C,GACrB,GAAIjE,GAASiE,EAAIjE,OAChBb,EAAO3C,EAAO2C,KAAM8E,EAErB,OAAKzH,GAAO2H,SAAUF,IACd,EAGc,IAAjBA,EAAI5D,UAAkBL,GACnB,EAGQ,UAATb,GAA6B,aAATA,IACb,IAAXa,GACgB,gBAAXA,IAAuBA,EAAS,GAAOA,EAAS,IAAOiE,IAIhEhI,EAAaO,EAAOJ,GAWpB,SAAWN,EAAQC,GAEnB,GAAIkG,GACH0C,EACAoE,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAlN,EACAC,EACAkN,EACAC,EACAC,EACAC,EACAC,EAGAzG,EAAU,UAAY,GAAKiF,MAC3ByB,EAAe9N,EAAOM,SACtByN,EAAU,EACVlI,EAAO,EACPmI,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,GAAe,EACfC,EAAY,SAAUC,EAAGC,GACxB,MAAKD,KAAMC,GACVH,GAAe,EACR,GAED,GAIRI,QAAsBvO,GACtBwO,EAAe,GAAK,GAGpBC,KAAc/M,eACduJ,KACAyD,EAAMzD,EAAIyD,IACVC,EAAc1D,EAAI/J,KAClBA,EAAO+J,EAAI/J,KACXE,EAAQ6J,EAAI7J,MAEZE,EAAU2J,EAAI3J,SAAW,SAAUwC,GAClC,GAAIoC,GAAI,EACPC,EAAMpC,KAAKE,MACZ,MAAYkC,EAAJD,EAASA,IAChB,GAAKnC,KAAKmC,KAAOpC,EAChB,MAAOoC,EAGT,OAAO,IAGR0I,EAAW,6HAKXC,EAAa,sBAEbC,EAAoB,mCAKpBC,EAAaD,EAAkBxH,QAAS,IAAK,MAG7C0H,EAAa,MAAQH,EAAa,KAAOC,EAAoB,IAAMD,EAClE,mBAAqBA,EAAa,wCAA0CE,EAAa,QAAUF,EAAa,OAQjHI,EAAU,KAAOH,EAAoB,mEAAqEE,EAAW1H,QAAS,EAAG,GAAM,eAGvIlF,EAAY8M,OAAQ,IAAML,EAAa,8BAAgCA,EAAa,KAAM,KAE1FM,EAAaD,OAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DO,EAAmBF,OAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAAa,KAE3FQ,EAAeH,OAAQL,EAAa,SACpCS,EAAuBJ,OAAQ,IAAML,EAAa,gBAAkBA,EAAa,OAAQ,KAEzFU,EAAcL,OAAQD,GACtBO,EAAkBN,OAAQ,IAAMH,EAAa,KAE7CU,GACCC,GAAUR,OAAQ,MAAQJ,EAAoB,KAC9Ca,MAAaT,OAAQ,QAAUJ,EAAoB,KACnDc,IAAWV,OAAQ,KAAOJ,EAAkBxH,QAAS,IAAK,MAAS,KACnEuI,KAAYX,OAAQ,IAAMF,GAC1Bc,OAAcZ,OAAQ,IAAMD,GAC5Bc,MAAab,OAAQ,yDAA2DL,EAC/E,+BAAiCA,EAAa,cAAgBA,EAC9D,aAAeA,EAAa,SAAU,KACvCmB,KAAYd,OAAQ,OAASN,EAAW,KAAM,KAG9CqB,aAAoBf,OAAQ,IAAML,EAAa,mDAC9CA,EAAa,mBAAqBA,EAAa,mBAAoB,MAGrEqB,EAAU,yBAGV7N,EAAa,mCAEb8N,GAAU,sCACVC,GAAU,SAEVC,GAAU,QAGVC,GAAgBpB,OAAQ,qBAAuBL,EAAa,MAAQA,EAAa,OAAQ,MACzF0B,GAAY,SAAUC,EAAGC,EAASC,GACjC,GAAIC,GAAO,KAAOF,EAAU,KAI5B,OAAOE,KAASA,GAAQD,EACvBD,EAEO,EAAPE,EACClI,OAAOmI,aAAcD,EAAO,OAE5BlI,OAAOmI,aAA2B,MAAbD,GAAQ,GAA4B,MAAR,KAAPA,GAI9C,KACCzP,EAAK2E,MACHoF,EAAM7J,EAAM6D,KAAM4I,EAAapE,YAChCoE,EAAapE,YAIdwB,EAAK4C,EAAapE,WAAWxF,QAASK,SACrC,MAAQqE,IACTzH,GAAS2E,MAAOoF,EAAIhH,OAGnB,SAAU+C,EAAQ6J,GACjBlC,EAAY9I,MAAOmB,EAAQ5F,EAAM6D,KAAK4L,KAKvC,SAAU7J,EAAQ6J,GACjB,GAAIzK,GAAIY,EAAO/C,OACdiC,EAAI,CAEL,OAASc,EAAOZ,KAAOyK,EAAI3K,MAC3Bc,EAAO/C,OAASmC,EAAI,IAKvB,QAAS0K,IAAQjP,EAAUC,EAASoJ,EAAS6F,GAC5C,GAAIlN,GAAOC,EAAMkN,EAAG1M,EAEnB4B,EAAG+K,EAAQ1E,EAAK2E,EAAKC,EAAYC,CASlC,KAPOtP,EAAUA,EAAQyC,eAAiBzC,EAAU+L,KAAmBxN,GACtEkN,EAAazL,GAGdA,EAAUA,GAAWzB,EACrB6K,EAAUA,OAEJrJ,GAAgC,gBAAbA,GACxB,MAAOqJ,EAGR,IAAuC,KAAjC5G,EAAWxC,EAAQwC,WAAgC,IAAbA,EAC3C,QAGD,IAAKkJ,IAAmBuD,EAAO,CAG9B,GAAMlN,EAAQxB,EAAW6B,KAAMrC,GAE9B,GAAMmP,EAAInN,EAAM,IACf,GAAkB,IAAbS,EAAiB,CAIrB,GAHAR,EAAOhC,EAAQ8C,eAAgBoM,IAG1BlN,IAAQA,EAAKe,WAQjB,MAAOqG,EALP,IAAKpH,EAAKgB,KAAOkM,EAEhB,MADA9F,GAAQhK,KAAM4C,GACPoH,MAOT,IAAKpJ,EAAQyC,gBAAkBT,EAAOhC,EAAQyC,cAAcK,eAAgBoM,KAC3EpD,EAAU9L,EAASgC,IAAUA,EAAKgB,KAAOkM,EAEzC,MADA9F,GAAQhK,KAAM4C,GACPoH,MAKH,CAAA,GAAKrH,EAAM,GAEjB,MADA3C,GAAK2E,MAAOqF,EAASpJ,EAAQwI,qBAAsBzI,IAC5CqJ,CAGD,KAAM8F,EAAInN,EAAM,KAAO+E,EAAQyI,wBAA0BvP,EAAQuP,uBAEvE,MADAnQ,GAAK2E,MAAOqF,EAASpJ,EAAQuP,uBAAwBL,IAC9C9F,EAKT,GAAKtC,EAAQ0I,OAAS7D,IAAcA,EAAUjJ,KAAM3C,IAAc,CASjE,GARAqP,EAAM3E,EAAMpF,EACZgK,EAAarP,EACbsP,EAA2B,IAAb9M,GAAkBzC,EAMd,IAAbyC,GAAqD,WAAnCxC,EAAQ8I,SAASC,cAA6B,CACpEoG,EAASM,GAAU1P,IAEb0K,EAAMzK,EAAQ0P,aAAa,OAChCN,EAAM3E,EAAIjF,QAAS+I,GAAS,QAE5BvO,EAAQ2P,aAAc,KAAMP,GAE7BA,EAAM,QAAUA,EAAM,MAEtBhL,EAAI+K,EAAOhN,MACX,OAAQiC,IACP+K,EAAO/K,GAAKgL,EAAMQ,GAAYT,EAAO/K,GAEtCiL,GAAa9B,EAAS7K,KAAM3C,IAAcC,EAAQ+C,YAAc/C,EAChEsP,EAAcH,EAAOU,KAAK,KAG3B,GAAKP,EACJ,IAIC,MAHAlQ,GAAK2E,MAAOqF,EACXiG,EAAWS,iBAAkBR,IAEvBlG,EACN,MAAM2G,IACN,QACKtF,GACLzK,EAAQgQ,gBAAgB,QAQ7B,MAAOC,IAAQlQ,EAASyF,QAASlF,EAAO,MAAQN,EAASoJ,EAAS6F,GASnE,QAAS/C,MACR,GAAIgE,KAEJ,SAASC,GAAOvJ,EAAKoC,GAMpB,MAJKkH,GAAK9Q,KAAMwH,GAAO,KAAQuE,EAAKiF,mBAE5BD,GAAOD,EAAKG,SAEZF,EAAOvJ,GAAQoC,EAExB,MAAOmH,GAOR,QAASG,IAAcrQ,GAEtB,MADAA,GAAIoF,IAAY,EACTpF,EAOR,QAASsQ,IAAQtQ,GAChB,GAAIuQ,GAAMjS,EAASiJ,cAAc,MAEjC,KACC,QAASvH,EAAIuQ,GACZ,MAAO3J,GACR,OAAO,EACN,QAEI2J,EAAIzN,YACRyN,EAAIzN,WAAW0N,YAAaD,GAG7BA,EAAM,MASR,QAASE,IAAWC,EAAOC,GAC1B,GAAIzH,GAAMwH,EAAM1F,MAAM,KACrB7G,EAAIuM,EAAMxO,MAEX,OAAQiC,IACP+G,EAAK0F,WAAY1H,EAAI/E,IAAOwM,EAU9B,QAASE,IAAcvE,EAAGC,GACzB,GAAIuE,GAAMvE,GAAKD,EACdyE,EAAOD,GAAsB,IAAfxE,EAAE/J,UAAiC,IAAfgK,EAAEhK,YAChCgK,EAAEyE,aAAevE,KACjBH,EAAE0E,aAAevE,EAGtB,IAAKsE,EACJ,MAAOA,EAIR,IAAKD,EACJ,MAASA,EAAMA,EAAIG,YAClB,GAAKH,IAAQvE,EACZ,MAAO,EAKV,OAAOD,GAAI,EAAI,GAOhB,QAAS4E,IAAmB7P,GAC3B,MAAO,UAAUU,GAChB,GAAI+C,GAAO/C,EAAK8G,SAASC,aACzB,OAAgB,UAAThE,GAAoB/C,EAAKV,OAASA,GAQ3C,QAAS8P,IAAoB9P,GAC5B,MAAO,UAAUU,GAChB,GAAI+C,GAAO/C,EAAK8G,SAASC,aACzB,QAAiB,UAAThE,GAA6B,WAATA,IAAsB/C,EAAKV,OAASA,GAQlE,QAAS+P,IAAwBpR,GAChC,MAAOqQ,IAAa,SAAUgB,GAE7B,MADAA,IAAYA,EACLhB,GAAa,SAAUrB,EAAMpD,GACnC,GAAIvH,GACHiN,EAAetR,KAAQgP,EAAK9M,OAAQmP,GACpClN,EAAImN,EAAapP,MAGlB,OAAQiC,IACF6K,EAAO3K,EAAIiN,EAAanN,MAC5B6K,EAAK3K,KAAOuH,EAAQvH,GAAK2K,EAAK3K,SAWnC+G,EAAQ2D,GAAO3D,MAAQ,SAAUrJ,GAGhC,GAAIvD,GAAkBuD,IAASA,EAAKS,eAAiBT,GAAMvD,eAC3D,OAAOA,GAA+C,SAA7BA,EAAgBqK,UAAsB,GAIhEhC,EAAUkI,GAAOlI,WAOjB2E,EAAcuD,GAAOvD,YAAc,SAAU+F,GAC5C,GAAIC,GAAMD,EAAOA,EAAK/O,eAAiB+O,EAAOzF,EAC7C2F,EAASD,EAAIE,WAGd,OAAKF,KAAQlT,GAA6B,IAAjBkT,EAAIjP,UAAmBiP,EAAIhT,iBAKpDF,EAAWkT,EACXjT,EAAUiT,EAAIhT,gBAGdiN,GAAkBL,EAAOoG,GAMpBC,GAAUA,EAAO9G,aAAe8G,IAAWA,EAAO7G,KACtD6G,EAAO9G,YAAa,iBAAkB,WACrCa,MASF3E,EAAQoG,WAAaqD,GAAO,SAAUC,GAErC,MADAA,GAAIoB,UAAY,KACRpB,EAAId,aAAa,eAO1B5I,EAAQ0B,qBAAuB+H,GAAO,SAAUC,GAE/C,MADAA,GAAIqB,YAAaJ,EAAIK,cAAc,MAC3BtB,EAAIhI,qBAAqB,KAAKrG,SAIvC2E,EAAQyI,uBAAyBgB,GAAO,SAAUC,GAQjD,MAPAA,GAAIuB,UAAY,+CAIhBvB,EAAIwB,WAAWJ,UAAY,IAGuB,IAA3CpB,EAAIjB,uBAAuB,KAAKpN,SAOxC2E,EAAQmL,QAAU1B,GAAO,SAAUC,GAElC,MADAhS,GAAQqT,YAAarB,GAAMxN,GAAKqC,GACxBoM,EAAIS,oBAAsBT,EAAIS,kBAAmB7M,GAAUlD,SAI/D2E,EAAQmL,SACZ9G,EAAK9I,KAAS,GAAI,SAAUW,EAAIhD,GAC/B,SAAYA,GAAQ8C,iBAAmB2J,GAAgBf,EAAiB,CACvE,GAAIwD,GAAIlP,EAAQ8C,eAAgBE,EAGhC,OAAOkM,IAAKA,EAAEnM,YAAcmM,QAG9B/D,EAAKgH,OAAW,GAAI,SAAUnP,GAC7B,GAAIoP,GAASpP,EAAGwC,QAASgJ,GAAWC,GACpC,OAAO,UAAUzM,GAChB,MAAOA,GAAK0N,aAAa,QAAU0C,YAM9BjH,GAAK9I,KAAS,GAErB8I,EAAKgH,OAAW,GAAK,SAAUnP,GAC9B,GAAIoP,GAASpP,EAAGwC,QAASgJ,GAAWC,GACpC,OAAO,UAAUzM,GAChB,GAAIwP,SAAcxP,GAAKqQ,mBAAqB5F,GAAgBzK,EAAKqQ,iBAAiB,KAClF,OAAOb,IAAQA,EAAKxI,QAAUoJ,KAMjCjH,EAAK9I,KAAU,IAAIyE,EAAQ0B,qBAC1B,SAAU8J,EAAKtS,GACd,aAAYA,GAAQwI,uBAAyBiE,EACrCzM,EAAQwI,qBAAsB8J,GADtC,GAID,SAAUA,EAAKtS,GACd,GAAIgC,GACHkG,KACA9D,EAAI,EACJgF,EAAUpJ,EAAQwI,qBAAsB8J,EAGzC,IAAa,MAARA,EAAc,CAClB,MAAStQ,EAAOoH,EAAQhF,KACA,IAAlBpC,EAAKQ,UACT0F,EAAI9I,KAAM4C,EAIZ,OAAOkG,GAER,MAAOkB,IAIT+B,EAAK9I,KAAY,MAAIyE,EAAQyI,wBAA0B,SAAUqC,EAAW5R,GAC3E,aAAYA,GAAQuP,yBAA2B9C,GAAgBf,EACvD1L,EAAQuP,uBAAwBqC,GADxC,GAWDhG,KAOAD,MAEM7E,EAAQ0I,IAAMpB,EAAQ1L,KAAM+O,EAAI3B,qBAGrCS,GAAO,SAAUC,GAMhBA,EAAIuB,UAAY,iDAIVvB,EAAIV,iBAAiB,cAAc3N,QACxCwJ,EAAUvM,KAAM,MAAQ2N,EAAa,aAAeD,EAAW,KAM1D0D,EAAIV,iBAAiB,YAAY3N,QACtCwJ,EAAUvM,KAAK,cAIjBmR,GAAO,SAAUC,GAOhB,GAAI+B,GAAQd,EAAIjK,cAAc,QAC9B+K,GAAM5C,aAAc,OAAQ,UAC5Ba,EAAIqB,YAAaU,GAAQ5C,aAAc,IAAK,IAEvCa,EAAIV,iBAAiB,WAAW3N,QACpCwJ,EAAUvM,KAAM,SAAW2N,EAAa,gBAKnCyD,EAAIV,iBAAiB,YAAY3N,QACtCwJ,EAAUvM,KAAM,WAAY,aAI7BoR,EAAIV,iBAAiB,QACrBnE,EAAUvM,KAAK,YAIX0H,EAAQ0L,gBAAkBpE,EAAQ1L,KAAOmJ,EAAUrN,EAAQiU,uBAChEjU,EAAQkU,oBACRlU,EAAQmU,kBACRnU,EAAQoU,qBAERrC,GAAO,SAAUC,GAGhB1J,EAAQ+L,kBAAoBhH,EAAQ1I,KAAMqN,EAAK,OAI/C3E,EAAQ1I,KAAMqN,EAAK,aACnB5E,EAAcxM,KAAM,KAAM+N,KAI5BxB,EAAYA,EAAUxJ,QAAciL,OAAQzB,EAAUkE,KAAK,MAC3DjE,EAAgBA,EAAczJ,QAAciL,OAAQxB,EAAciE,KAAK,MAQvE/D,EAAWsC,EAAQ1L,KAAMlE,EAAQsN,WAActN,EAAQsU,wBACtD,SAAUvG,EAAGC,GACZ,GAAIuG,GAAuB,IAAfxG,EAAE/J,SAAiB+J,EAAE9N,gBAAkB8N,EAClDyG,EAAMxG,GAAKA,EAAEzJ,UACd,OAAOwJ,KAAMyG,MAAWA,GAAwB,IAAjBA,EAAIxQ,YAClCuQ,EAAMjH,SACLiH,EAAMjH,SAAUkH,GAChBzG,EAAEuG,yBAA8D,GAAnCvG,EAAEuG,wBAAyBE,MAG3D,SAAUzG,EAAGC,GACZ,GAAKA,EACJ,MAASA,EAAIA,EAAEzJ,WACd,GAAKyJ,IAAMD,EACV,OAAO,CAIV,QAAO,GAOTD,EAAY9N,EAAQsU,wBACpB,SAAUvG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,MADAH,IAAe,EACR,CAGR,IAAI4G,GAAUzG,EAAEsG,yBAA2BvG,EAAEuG,yBAA2BvG,EAAEuG,wBAAyBtG,EAEnG,OAAKyG,GAEW,EAAVA,IACFnM,EAAQoM,cAAgB1G,EAAEsG,wBAAyBvG,KAAQ0G,EAGxD1G,IAAMkF,GAAO3F,EAASC,EAAcQ,GACjC,GAEHC,IAAMiF,GAAO3F,EAASC,EAAcS,GACjC,EAIDhB,EACJhM,EAAQ2D,KAAMqI,EAAWe,GAAM/M,EAAQ2D,KAAMqI,EAAWgB,GAC1D,EAGe,EAAVyG,EAAc,GAAK,EAIpB1G,EAAEuG,wBAA0B,GAAK,GAEzC,SAAUvG,EAAGC,GACZ,GAAIuE,GACH3M,EAAI,EACJ+O,EAAM5G,EAAExJ,WACRiQ,EAAMxG,EAAEzJ,WACRqQ,GAAO7G,GACP8G,GAAO7G,EAGR,IAAKD,IAAMC,EAEV,MADAH,IAAe,EACR,CAGD,KAAM8G,IAAQH,EACpB,MAAOzG,KAAMkF,EAAM,GAClBjF,IAAMiF,EAAM,EACZ0B,EAAM,GACNH,EAAM,EACNxH,EACEhM,EAAQ2D,KAAMqI,EAAWe,GAAM/M,EAAQ2D,KAAMqI,EAAWgB,GAC1D,CAGK,IAAK2G,IAAQH,EACnB,MAAOlC,IAAcvE,EAAGC,EAIzBuE,GAAMxE,CACN,OAASwE,EAAMA,EAAIhO,WAClBqQ,EAAGE,QAASvC,EAEbA,GAAMvE,CACN,OAASuE,EAAMA,EAAIhO,WAClBsQ,EAAGC,QAASvC,EAIb,OAAQqC,EAAGhP,KAAOiP,EAAGjP,GACpBA,GAGD,OAAOA,GAEN0M,GAAcsC,EAAGhP,GAAIiP,EAAGjP,IAGxBgP,EAAGhP,KAAO2H,EAAe,GACzBsH,EAAGjP,KAAO2H,EAAe,EACzB,GAGK0F,GA1UClT,GA6UTyQ,GAAOnD,QAAU,SAAU0H,EAAMC,GAChC,MAAOxE,IAAQuE,EAAM,KAAM,KAAMC,IAGlCxE,GAAOwD,gBAAkB,SAAUxQ,EAAMuR,GASxC,IAPOvR,EAAKS,eAAiBT,KAAWzD,GACvCkN,EAAazJ,GAIduR,EAAOA,EAAK/N,QAASgI,EAAkB,aAElC1G,EAAQ0L,kBAAmB9G,GAC5BE,GAAkBA,EAAclJ,KAAM6Q,IACtC5H,GAAkBA,EAAUjJ,KAAM6Q,IAErC,IACC,GAAI/P,GAAMqI,EAAQ1I,KAAMnB,EAAMuR,EAG9B,IAAK/P,GAAOsD,EAAQ+L,mBAGlB7Q,EAAKzD,UAAuC,KAA3ByD,EAAKzD,SAASiE,SAChC,MAAOgB,GAEP,MAAMqD,IAGT,MAAOmI,IAAQuE,EAAMhV,EAAU,MAAOyD,IAAQG,OAAS,GAGxD6M,GAAOlD,SAAW,SAAU9L,EAASgC,GAKpC,OAHOhC,EAAQyC,eAAiBzC,KAAczB,GAC7CkN,EAAazL,GAEP8L,EAAU9L,EAASgC,IAG3BgN,GAAOnM,KAAO,SAAUb,EAAM+C,IAEtB/C,EAAKS,eAAiBT,KAAWzD,GACvCkN,EAAazJ,EAGd,IAAI/B,GAAKkL,EAAK0F,WAAY9L,EAAKgE,eAE9B0K,EAAMxT,GAAM0M,EAAOxJ,KAAMgI,EAAK0F,WAAY9L,EAAKgE,eAC9C9I,EAAI+B,EAAM+C,GAAO2G,GACjBxN,CAEF,OAAOuV,KAAQvV,EACd4I,EAAQoG,aAAexB,EACtB1J,EAAK0N,aAAc3K,IAClB0O,EAAMzR,EAAKqQ,iBAAiBtN,KAAU0O,EAAIC,UAC1CD,EAAIzK,MACJ,KACFyK,GAGFzE,GAAO/H,MAAQ,SAAUC,GACxB,KAAUC,OAAO,0CAA4CD,IAO9D8H,GAAO2E,WAAa,SAAUvK,GAC7B,GAAIpH,GACH4R,KACAtP,EAAI,EACJF,EAAI,CAOL,IAJAiI,GAAgBvF,EAAQ+M,iBACxBrI,GAAa1E,EAAQgN,YAAc1K,EAAQ9J,MAAO,GAClD8J,EAAQ3E,KAAM6H,GAETD,EAAe,CACnB,MAASrK,EAAOoH,EAAQhF,KAClBpC,IAASoH,EAAShF,KACtBE,EAAIsP,EAAWxU,KAAMgF,GAGvB,OAAQE,IACP8E,EAAQ1E,OAAQkP,EAAYtP,GAAK,GAInC,MAAO8E,IAORgC,EAAU4D,GAAO5D,QAAU,SAAUpJ,GACpC,GAAIwP,GACHhO,EAAM,GACNY,EAAI,EACJ5B,EAAWR,EAAKQ,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArBR,GAAK+R,YAChB,MAAO/R,GAAK+R,WAGZ,KAAM/R,EAAOA,EAAKgQ,WAAYhQ,EAAMA,EAAOA,EAAKkP,YAC/C1N,GAAO4H,EAASpJ,OAGZ,IAAkB,IAAbQ,GAA+B,IAAbA,EAC7B,MAAOR,GAAKgS,cAhBZ,MAASxC,EAAOxP,EAAKoC,GAAKA,IAEzBZ,GAAO4H,EAASoG,EAkBlB,OAAOhO,IAGR2H,EAAO6D,GAAOiF,WAGb7D,YAAa,GAEb8D,aAAc5D,GAEdvO,MAAO4L,EAEPkD,cAEAxO,QAEA8R,UACCC,KAAOC,IAAK,aAAcpQ,OAAO,GACjCqQ,KAAOD,IAAK,cACZE,KAAOF,IAAK,kBAAmBpQ,OAAO,GACtCuQ,KAAOH,IAAK,oBAGbI,WACC1G,KAAQ,SAAUhM,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAGyD,QAASgJ,GAAWC,IAGxC1M,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAM,IAAKyD,QAASgJ,GAAWC,IAE5C,OAAb1M,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAMzC,MAAO,EAAG,IAGxB2O,MAAS,SAAUlM,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAGgH,cAEY,QAA3BhH,EAAM,GAAGzC,MAAO,EAAG,IAEjByC,EAAM,IACXiN,GAAO/H,MAAOlF,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjBiN,GAAO/H,MAAOlF,EAAM,IAGdA,GAGRiM,OAAU,SAAUjM,GACnB,GAAI2S,GACHC,GAAY5S,EAAM,IAAMA,EAAM,EAE/B,OAAK4L,GAAiB,MAAEjL,KAAMX,EAAM,IAC5B,MAIHA,EAAM,IAAMA,EAAM,KAAO7D,EAC7B6D,EAAM,GAAKA,EAAM,GAGN4S,GAAYlH,EAAQ/K,KAAMiS,KAEpCD,EAASjF,GAAUkF,GAAU,MAE7BD,EAASC,EAASnV,QAAS,IAAKmV,EAASxS,OAASuS,GAAWC,EAASxS,UAGvEJ,EAAM,GAAKA,EAAM,GAAGzC,MAAO,EAAGoV,GAC9B3S,EAAM,GAAK4S,EAASrV,MAAO,EAAGoV,IAIxB3S,EAAMzC,MAAO,EAAG,MAIzB6S,QAECrE,IAAO,SAAU8G,GAChB,GAAI9L,GAAW8L,EAAiBpP,QAASgJ,GAAWC,IAAY1F,aAChE,OAA4B,MAArB6L,EACN,WAAa,OAAO,GACpB,SAAU5S,GACT,MAAOA,GAAK8G,UAAY9G,EAAK8G,SAASC,gBAAkBD,IAI3D+E,MAAS,SAAU+D,GAClB,GAAIiD,GAAU5I,EAAY2F,EAAY,IAEtC,OAAOiD,KACLA,EAAczH,OAAQ,MAAQL,EAAa,IAAM6E,EAAY,IAAM7E,EAAa,SACjFd,EAAY2F,EAAW,SAAU5P,GAChC,MAAO6S,GAAQnS,KAAgC,gBAAnBV,GAAK4P,WAA0B5P,EAAK4P,iBAAoB5P,GAAK0N,eAAiBjD,GAAgBzK,EAAK0N,aAAa,UAAY,OAI3J3B,KAAQ,SAAUhJ,EAAM+P,EAAUC,GACjC,MAAO,UAAU/S,GAChB,GAAIgT,GAAShG,GAAOnM,KAAMb,EAAM+C,EAEhC,OAAe,OAAViQ,EACgB,OAAbF,EAEFA,GAINE,GAAU,GAEU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOxV,QAASuV,GAChC,OAAbD,EAAoBC,GAASC,EAAOxV,QAASuV,GAAU,GAC1C,OAAbD,EAAoBC,GAASC,EAAO1V,OAAQyV,EAAM5S,UAAa4S,EAClD,OAAbD,GAAsB,IAAME,EAAS,KAAMxV,QAASuV,GAAU,GACjD,OAAbD,EAAoBE,IAAWD,GAASC,EAAO1V,MAAO,EAAGyV,EAAM5S,OAAS,KAAQ4S,EAAQ,KACxF,IAZO,IAgBV9G,MAAS,SAAU3M,EAAM2T,EAAM3D,EAAUrN,EAAOE,GAC/C,GAAI+Q,GAAgC,QAAvB5T,EAAKhC,MAAO,EAAG,GAC3B6V,EAA+B,SAArB7T,EAAKhC,MAAO,IACtB8V,EAAkB,YAATH,CAEV,OAAiB,KAAVhR,GAAwB,IAATE,EAGrB,SAAUnC,GACT,QAASA,EAAKe,YAGf,SAAUf,EAAMhC,EAASiI,GACxB,GAAIkI,GAAOkF,EAAY7D,EAAMR,EAAMsE,EAAWC,EAC7ClB,EAAMa,IAAWC,EAAU,cAAgB,kBAC3CzD,EAAS1P,EAAKe,WACdgC,EAAOqQ,GAAUpT,EAAK8G,SAASC,cAC/ByM,GAAYvN,IAAQmN,CAErB,IAAK1D,EAAS,CAGb,GAAKwD,EAAS,CACb,MAAQb,EAAM,CACb7C,EAAOxP,CACP,OAASwP,EAAOA,EAAM6C,GACrB,GAAKe,EAAS5D,EAAK1I,SAASC,gBAAkBhE,EAAyB,IAAlByM,EAAKhP,SACzD,OAAO,CAIT+S,GAAQlB,EAAe,SAAT/S,IAAoBiU,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAUJ,EAAUzD,EAAOM,WAAaN,EAAO+D,WAG1CN,GAAWK,EAAW,CAE1BH,EAAa3D,EAAQrM,KAAcqM,EAAQrM,OAC3C8K,EAAQkF,EAAY/T,OACpBgU,EAAYnF,EAAM,KAAOnE,GAAWmE,EAAM,GAC1Ca,EAAOb,EAAM,KAAOnE,GAAWmE,EAAM,GACrCqB,EAAO8D,GAAa5D,EAAO/J,WAAY2N,EAEvC,OAAS9D,IAAS8D,GAAa9D,GAAQA,EAAM6C,KAG3CrD,EAAOsE,EAAY,IAAMC,EAAM3I,MAGhC,GAAuB,IAAlB4E,EAAKhP,YAAoBwO,GAAQQ,IAASxP,EAAO,CACrDqT,EAAY/T,IAAW0K,EAASsJ,EAAWtE,EAC3C,YAKI,IAAKwE,IAAarF,GAASnO,EAAMqD,KAAcrD,EAAMqD,QAAkB/D,KAAW6O,EAAM,KAAOnE,EACrGgF,EAAOb,EAAM,OAKb,OAASqB,IAAS8D,GAAa9D,GAAQA,EAAM6C,KAC3CrD,EAAOsE,EAAY,IAAMC,EAAM3I,MAEhC,IAAOwI,EAAS5D,EAAK1I,SAASC,gBAAkBhE,EAAyB,IAAlByM,EAAKhP,aAAsBwO,IAE5EwE,KACHhE,EAAMnM,KAAcmM,EAAMnM,QAAkB/D,IAAW0K,EAASgF,IAG7DQ,IAASxP,GACb,KAQJ,OADAgP,IAAQ7M,EACD6M,IAAS/M,GAA4B,IAAjB+M,EAAO/M,GAAe+M,EAAO/M,GAAS,KAKrE+J,OAAU,SAAU0H,EAAQpE,GAK3B,GAAI1N,GACH3D,EAAKkL,EAAKgC,QAASuI,IAAYvK,EAAKwK,WAAYD,EAAO3M,gBACtDiG,GAAO/H,MAAO,uBAAyByO,EAKzC,OAAKzV,GAAIoF,GACDpF,EAAIqR,GAIPrR,EAAGkC,OAAS,GAChByB,GAAS8R,EAAQA,EAAQ,GAAIpE,GACtBnG,EAAKwK,WAAW/V,eAAgB8V,EAAO3M,eAC7CuH,GAAa,SAAUrB,EAAMpD,GAC5B,GAAI+J,GACHC,EAAU5V,EAAIgP,EAAMqC,GACpBlN,EAAIyR,EAAQ1T,MACb,OAAQiC,IACPwR,EAAMpW,EAAQ2D,KAAM8L,EAAM4G,EAAQzR,IAClC6K,EAAM2G,KAAW/J,EAAS+J,GAAQC,EAAQzR,MAG5C,SAAUpC,GACT,MAAO/B,GAAI+B,EAAM,EAAG4B,KAIhB3D,IAITkN,SAEC2I,IAAOxF,GAAa,SAAUvQ,GAI7B,GAAIwS,MACHnJ,KACA2M,EAAUzK,EAASvL,EAASyF,QAASlF,EAAO,MAE7C,OAAOyV,GAAS1Q,GACfiL,GAAa,SAAUrB,EAAMpD,EAAS7L,EAASiI,GAC9C,GAAIjG,GACHgU,EAAYD,EAAS9G,EAAM,KAAMhH,MACjC7D,EAAI6K,EAAK9M,MAGV,OAAQiC,KACDpC,EAAOgU,EAAU5R,MACtB6K,EAAK7K,KAAOyH,EAAQzH,GAAKpC,MAI5B,SAAUA,EAAMhC,EAASiI,GAGxB,MAFAsK,GAAM,GAAKvQ,EACX+T,EAASxD,EAAO,KAAMtK,EAAKmB,IACnBA,EAAQwD,SAInBqJ,IAAO3F,GAAa,SAAUvQ,GAC7B,MAAO,UAAUiC,GAChB,MAAOgN,IAAQjP,EAAUiC,GAAOG,OAAS,KAI3C2J,SAAYwE,GAAa,SAAUpH,GAClC,MAAO,UAAUlH,GAChB,OAASA,EAAK+R,aAAe/R,EAAKkU,WAAa9K,EAASpJ,IAASxC,QAAS0J,GAAS,MAWrFiN,KAAQ7F,GAAc,SAAU6F,GAM/B,MAJMzI,GAAYhL,KAAKyT,GAAQ,KAC9BnH,GAAO/H,MAAO,qBAAuBkP,GAEtCA,EAAOA,EAAK3Q,QAASgJ,GAAWC,IAAY1F,cACrC,SAAU/G,GAChB,GAAIoU,EACJ,GACC,IAAMA,EAAW1K,EAChB1J,EAAKmU,KACLnU,EAAK0N,aAAa,aAAe1N,EAAK0N,aAAa,QAGnD,MADA0G,GAAWA,EAASrN,cACbqN,IAAaD,GAA2C,IAAnCC,EAAS5W,QAAS2W,EAAO,YAE5CnU,EAAOA,EAAKe,aAAiC,IAAlBf,EAAKQ,SAC3C,QAAO,KAKT0C,OAAU,SAAUlD,GACnB,GAAIqU,GAAOpY,EAAOK,UAAYL,EAAOK,SAAS+X,IAC9C,OAAOA,IAAQA,EAAK/W,MAAO,KAAQ0C,EAAKgB,IAGzCsT,KAAQ,SAAUtU,GACjB,MAAOA,KAASxD,GAGjB+X,MAAS,SAAUvU,GAClB,MAAOA,KAASzD,EAASiY,iBAAmBjY,EAASkY,UAAYlY,EAASkY,gBAAkBzU,EAAKV,MAAQU,EAAK0U,OAAS1U,EAAK2U,WAI7HC,QAAW,SAAU5U,GACpB,MAAOA,GAAK6U,YAAa,GAG1BA,SAAY,SAAU7U,GACrB,MAAOA,GAAK6U,YAAa,GAG1BC,QAAW,SAAU9U,GAGpB,GAAI8G,GAAW9G,EAAK8G,SAASC,aAC7B,OAAqB,UAAbD,KAA0B9G,EAAK8U,SAA0B,WAAbhO,KAA2B9G,EAAK+U,UAGrFA,SAAY,SAAU/U,GAOrB,MAJKA,GAAKe,YACTf,EAAKe,WAAWiU,cAGVhV,EAAK+U,YAAa,GAI1BE,MAAS,SAAUjV,GAMlB,IAAMA,EAAOA,EAAKgQ,WAAYhQ,EAAMA,EAAOA,EAAKkP,YAC/C,GAAKlP,EAAK8G,SAAW,KAAyB,IAAlB9G,EAAKQ,UAAoC,IAAlBR,EAAKQ,SACvD,OAAO,CAGT,QAAO,GAGRkP,OAAU,SAAU1P,GACnB,OAAQmJ,EAAKgC,QAAe,MAAGnL,IAIhCkV,OAAU,SAAUlV,GACnB,MAAOsM,IAAQ5L,KAAMV,EAAK8G,WAG3ByJ,MAAS,SAAUvQ,GAClB,MAAOqM,IAAQ3L,KAAMV,EAAK8G,WAG3BqO,OAAU,SAAUnV,GACnB,GAAI+C,GAAO/C,EAAK8G,SAASC,aACzB,OAAgB,UAAThE,GAAkC,WAAd/C,EAAKV,MAA8B,WAATyD,GAGtDmE,KAAQ,SAAUlH,GACjB,GAAIa,EAGJ,OAAuC,UAAhCb,EAAK8G,SAASC,eACN,SAAd/G,EAAKV,OACmC,OAArCuB,EAAOb,EAAK0N,aAAa,UAAoB7M,EAAKkG,gBAAkB/G,EAAKV,OAI9E2C,MAASoN,GAAuB,WAC/B,OAAS,KAGVlN,KAAQkN,GAAuB,SAAUE,EAAcpP,GACtD,OAASA,EAAS,KAGnB+B,GAAMmN,GAAuB,SAAUE,EAAcpP,EAAQmP,GAC5D,OAAoB,EAAXA,EAAeA,EAAWnP,EAASmP,KAG7C8F,KAAQ/F,GAAuB,SAAUE,EAAcpP,GACtD,GAAIiC,GAAI,CACR,MAAYjC,EAAJiC,EAAYA,GAAK,EACxBmN,EAAanS,KAAMgF,EAEpB,OAAOmN,KAGR8F,IAAOhG,GAAuB,SAAUE,EAAcpP,GACrD,GAAIiC,GAAI,CACR,MAAYjC,EAAJiC,EAAYA,GAAK,EACxBmN,EAAanS,KAAMgF,EAEpB,OAAOmN,KAGR+F,GAAMjG,GAAuB,SAAUE,EAAcpP,EAAQmP,GAC5D,GAAIlN,GAAe,EAAXkN,EAAeA,EAAWnP,EAASmP,CAC3C,QAAUlN,GAAK,GACdmN,EAAanS,KAAMgF,EAEpB,OAAOmN,KAGRgG,GAAMlG,GAAuB,SAAUE,EAAcpP,EAAQmP,GAC5D,GAAIlN,GAAe,EAAXkN,EAAeA,EAAWnP,EAASmP,CAC3C,MAAcnP,IAAJiC,GACTmN,EAAanS,KAAMgF,EAEpB,OAAOmN,OAKVpG,EAAKgC,QAAa,IAAIhC,EAAKgC,QAAY,EAGvC,KAAM/I,KAAOoT,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5EzM,EAAKgC,QAAS/I,GAAM+M,GAAmB/M,EAExC,KAAMA,KAAOyT,QAAQ,EAAMC,OAAO,GACjC3M,EAAKgC,QAAS/I,GAAMgN,GAAoBhN,EAIzC,SAASuR,OACTA,GAAW/T,UAAYuJ,EAAK4M,QAAU5M,EAAKgC,QAC3ChC,EAAKwK,WAAa,GAAIA,GAEtB,SAASlG,IAAU1P,EAAUiY,GAC5B,GAAInC,GAAS9T,EAAOkW,EAAQ3W,EAC3B4W,EAAO/I,EAAQgJ,EACfC,EAASjM,EAAYpM,EAAW,IAEjC,IAAKqY,EACJ,MAAOJ,GAAY,EAAII,EAAO9Y,MAAO,EAGtC4Y,GAAQnY,EACRoP,KACAgJ,EAAahN,EAAKsJ,SAElB,OAAQyD,EAAQ,GAGTrC,IAAY9T,EAAQsL,EAAOjL,KAAM8V,OACjCnW,IAEJmW,EAAQA,EAAM5Y,MAAOyC,EAAM,GAAGI,SAAY+V,GAE3C/I,EAAO/P,KAAM6Y,OAGdpC,GAAU,GAGJ9T,EAAQuL,EAAalL,KAAM8V,MAChCrC,EAAU9T,EAAMsO,QAChB4H,EAAO7Y,MACN4J,MAAO6M,EAEPvU,KAAMS,EAAM,GAAGyD,QAASlF,EAAO,OAEhC4X,EAAQA,EAAM5Y,MAAOuW,EAAQ1T,QAI9B,KAAMb,IAAQ6J,GAAKgH,SACZpQ,EAAQ4L,EAAWrM,GAAOc,KAAM8V,KAAcC,EAAY7W,MAC9DS,EAAQoW,EAAY7W,GAAQS,MAC7B8T,EAAU9T,EAAMsO,QAChB4H,EAAO7Y,MACN4J,MAAO6M,EACPvU,KAAMA,EACNuK,QAAS9J,IAEVmW,EAAQA,EAAM5Y,MAAOuW,EAAQ1T,QAI/B,KAAM0T,EACL,MAOF,MAAOmC,GACNE,EAAM/V,OACN+V,EACClJ,GAAO/H,MAAOlH,GAEdoM,EAAYpM,EAAUoP,GAAS7P,MAAO,GAGzC,QAASsQ,IAAYqI,GACpB,GAAI7T,GAAI,EACPC,EAAM4T,EAAO9V,OACbpC,EAAW,EACZ,MAAYsE,EAAJD,EAASA,IAChBrE,GAAYkY,EAAO7T,GAAG4E,KAEvB,OAAOjJ,GAGR,QAASsY,IAAetC,EAASuC,EAAYC,GAC5C,GAAIlE,GAAMiE,EAAWjE,IACpBmE,EAAmBD,GAAgB,eAARlE,EAC3BoE,EAAW3U,GAEZ,OAAOwU,GAAWrU,MAEjB,SAAUjC,EAAMhC,EAASiI,GACxB,MAASjG,EAAOA,EAAMqS,GACrB,GAAuB,IAAlBrS,EAAKQ,UAAkBgW,EAC3B,MAAOzC,GAAS/T,EAAMhC,EAASiI,IAMlC,SAAUjG,EAAMhC,EAASiI,GACxB,GAAIb,GAAM+I,EAAOkF,EAChBqD,EAAS1M,EAAU,IAAMyM,CAG1B,IAAKxQ,GACJ,MAASjG,EAAOA,EAAMqS,GACrB,IAAuB,IAAlBrS,EAAKQ,UAAkBgW,IACtBzC,EAAS/T,EAAMhC,EAASiI,GAC5B,OAAO,MAKV,OAASjG,EAAOA,EAAMqS,GACrB,GAAuB,IAAlBrS,EAAKQ,UAAkBgW,EAE3B,GADAnD,EAAarT,EAAMqD,KAAcrD,EAAMqD,QACjC8K,EAAQkF,EAAYhB,KAAUlE,EAAM,KAAOuI,GAChD,IAAMtR,EAAO+I,EAAM,OAAQ,GAAQ/I,IAAS8D,EAC3C,MAAO9D,MAAS,MAKjB,IAFA+I,EAAQkF,EAAYhB,IAAUqE,GAC9BvI,EAAM,GAAK4F,EAAS/T,EAAMhC,EAASiI,IAASiD,EACvCiF,EAAM,MAAO,EACjB,OAAO,GASf,QAASwI,IAAgBC,GACxB,MAAOA,GAASzW,OAAS,EACxB,SAAUH,EAAMhC,EAASiI,GACxB,GAAI7D,GAAIwU,EAASzW,MACjB,OAAQiC,IACP,IAAMwU,EAASxU,GAAIpC,EAAMhC,EAASiI,GACjC,OAAO,CAGT,QAAO,GAER2Q,EAAS,GAGX,QAASC,IAAU7C,EAAWzR,EAAK4N,EAAQnS,EAASiI,GACnD,GAAIjG,GACH8W,KACA1U,EAAI,EACJC,EAAM2R,EAAU7T,OAChB4W,EAAgB,MAAPxU,CAEV,MAAYF,EAAJD,EAASA,KACVpC,EAAOgU,EAAU5R,OAChB+N,GAAUA,EAAQnQ,EAAMhC,EAASiI,MACtC6Q,EAAa1Z,KAAM4C,GACd+W,GACJxU,EAAInF,KAAMgF,GAMd,OAAO0U,GAGR,QAASE,IAAYvE,EAAW1U,EAAUgW,EAASkD,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAY5T,KAC/B4T,EAAaD,GAAYC,IAErBC,IAAeA,EAAY7T,KAC/B6T,EAAaF,GAAYE,EAAYC,IAE/B7I,GAAa,SAAUrB,EAAM7F,EAASpJ,EAASiI,GACrD,GAAImR,GAAMhV,EAAGpC,EACZqX,KACAC,KACAC,EAAcnQ,EAAQjH,OAGtBoB,EAAQ0L,GAAQuK,GAAkBzZ,GAAY,IAAKC,EAAQwC,UAAaxC,GAAYA,MAGpFyZ,GAAYhF,IAAexF,GAASlP,EAEnCwD,EADAsV,GAAUtV,EAAO8V,EAAQ5E,EAAWzU,EAASiI,GAG9CyR,EAAa3D,EAEZmD,IAAgBjK,EAAOwF,EAAY8E,GAAeN,MAMjD7P,EACDqQ,CAQF,IALK1D,GACJA,EAAS0D,EAAWC,EAAY1Z,EAASiI,GAIrCgR,EAAa,CACjBG,EAAOP,GAAUa,EAAYJ,GAC7BL,EAAYG,KAAUpZ,EAASiI,GAG/B7D,EAAIgV,EAAKjX,MACT,OAAQiC,KACDpC,EAAOoX,EAAKhV,MACjBsV,EAAYJ,EAAQlV,MAASqV,EAAWH,EAAQlV,IAAOpC,IAK1D,GAAKiN,GACJ,GAAKiK,GAAczE,EAAY,CAC9B,GAAKyE,EAAa,CAEjBE,KACAhV,EAAIsV,EAAWvX,MACf,OAAQiC,KACDpC,EAAO0X,EAAWtV,KAEvBgV,EAAKha,KAAOqa,EAAUrV,GAAKpC,EAG7BkX,GAAY,KAAOQ,KAAkBN,EAAMnR,GAI5C7D,EAAIsV,EAAWvX,MACf,OAAQiC,KACDpC,EAAO0X,EAAWtV,MACtBgV,EAAOF,EAAa1Z,EAAQ2D,KAAM8L,EAAMjN,GAASqX,EAAOjV,IAAM,KAE/D6K,EAAKmK,KAAUhQ,EAAQgQ,GAAQpX,SAOlC0X,GAAab,GACZa,IAAetQ,EACdsQ,EAAWhV,OAAQ6U,EAAaG,EAAWvX,QAC3CuX,GAEGR,EACJA,EAAY,KAAM9P,EAASsQ,EAAYzR,GAEvC7I,EAAK2E,MAAOqF,EAASsQ,KAMzB,QAASC,IAAmB1B,GAC3B,GAAI2B,GAAc7D,EAASzR,EAC1BD,EAAM4T,EAAO9V,OACb0X,EAAkB1O,EAAKgJ,SAAU8D,EAAO,GAAG3W,MAC3CwY,EAAmBD,GAAmB1O,EAAKgJ,SAAS,KACpD/P,EAAIyV,EAAkB,EAAI,EAG1BE,EAAe1B,GAAe,SAAUrW,GACvC,MAAOA,KAAS4X,GACdE,GAAkB,GACrBE,EAAkB3B,GAAe,SAAUrW,GAC1C,MAAOxC,GAAQ2D,KAAMyW,EAAc5X,GAAS,IAC1C8X,GAAkB,GACrBlB,GAAa,SAAU5W,EAAMhC,EAASiI,GACrC,OAAU4R,IAAqB5R,GAAOjI,IAAYuL,MAChDqO,EAAe5Z,GAASwC,SACxBuX,EAAc/X,EAAMhC,EAASiI,GAC7B+R,EAAiBhY,EAAMhC,EAASiI,KAGpC,MAAY5D,EAAJD,EAASA,IAChB,GAAM2R,EAAU5K,EAAKgJ,SAAU8D,EAAO7T,GAAG9C,MACxCsX,GAAaP,GAAcM,GAAgBC,GAAY7C,QACjD,CAIN,GAHAA,EAAU5K,EAAKgH,OAAQ8F,EAAO7T,GAAG9C,MAAOyC,MAAO,KAAMkU,EAAO7T,GAAGyH,SAG1DkK,EAAS1Q,GAAY,CAGzB,IADAf,IAAMF,EACMC,EAAJC,EAASA,IAChB,GAAK6G,EAAKgJ,SAAU8D,EAAO3T,GAAGhD,MAC7B,KAGF,OAAO0X,IACN5U,EAAI,GAAKuU,GAAgBC,GACzBxU,EAAI,GAAKwL,GAERqI,EAAO3Y,MAAO,EAAG8E,EAAI,GAAIlF,QAAS8J,MAAgC,MAAzBiP,EAAQ7T,EAAI,GAAI9C,KAAe,IAAM,MAC7EkE,QAASlF,EAAO,MAClByV,EACIzR,EAAJF,GAASuV,GAAmB1B,EAAO3Y,MAAO8E,EAAGE,IACzCD,EAAJC,GAAWqV,GAAoB1B,EAASA,EAAO3Y,MAAOgF,IAClDD,EAAJC,GAAWsL,GAAYqI,IAGzBW,EAASxZ,KAAM2W,GAIjB,MAAO4C,IAAgBC,GAGxB,QAASqB,IAA0BC,EAAiBC,GAEnD,GAAIC,GAAoB,EACvBC,EAAQF,EAAYhY,OAAS,EAC7BmY,EAAYJ,EAAgB/X,OAAS,EACrCoY,EAAe,SAAUtL,EAAMjP,EAASiI,EAAKmB,EAASoR,GACrD,GAAIxY,GAAMsC,EAAGyR,EACZ0E,KACAC,EAAe,EACftW,EAAI,IACJ4R,EAAY/G,MACZ0L,EAA6B,MAAjBH,EACZI,EAAgBrP,EAEhBhI,EAAQ0L,GAAQqL,GAAanP,EAAK9I,KAAU,IAAG,IAAKmY,GAAiBxa,EAAQ+C,YAAc/C,GAE3F6a,EAAiB7O,GAA4B,MAAjB4O,EAAwB,EAAItV,KAAKC,UAAY,EAS1E,KAPKoV,IACJpP,EAAmBvL,IAAYzB,GAAYyB,EAC3CkL,EAAakP,GAKe,OAApBpY,EAAOuB,EAAMa,IAAaA,IAAM,CACxC,GAAKkW,GAAatY,EAAO,CACxBsC,EAAI,CACJ,OAASyR,EAAUmE,EAAgB5V,KAClC,GAAKyR,EAAS/T,EAAMhC,EAASiI,GAAQ,CACpCmB,EAAQhK,KAAM4C,EACd,OAGG2Y,IACJ3O,EAAU6O,EACV3P,IAAekP,GAKZC,KAEErY,GAAQ+T,GAAW/T,IACxB0Y,IAIIzL,GACJ+G,EAAU5W,KAAM4C,IAOnB,GADA0Y,GAAgBtW,EACXiW,GAASjW,IAAMsW,EAAe,CAClCpW,EAAI,CACJ,OAASyR,EAAUoE,EAAY7V,KAC9ByR,EAASC,EAAWyE,EAAYza,EAASiI,EAG1C,IAAKgH,EAAO,CAEX,GAAKyL,EAAe,EACnB,MAAQtW,IACA4R,EAAU5R,IAAMqW,EAAWrW,KACjCqW,EAAWrW,GAAKwI,EAAIzJ,KAAMiG,GAM7BqR,GAAa5B,GAAU4B,GAIxBrb,EAAK2E,MAAOqF,EAASqR,GAGhBE,IAAc1L,GAAQwL,EAAWtY,OAAS,GAC5CuY,EAAeP,EAAYhY,OAAW,GAExC6M,GAAO2E,WAAYvK,GAUrB,MALKuR,KACJ3O,EAAU6O,EACVtP,EAAmBqP,GAGb5E,EAGT,OAAOqE,GACN/J,GAAciK,GACdA,EAGFjP,EAAU0D,GAAO1D,QAAU,SAAUvL,EAAU+a,GAC9C,GAAI1W,GACH+V,KACAD,KACA9B,EAAShM,EAAerM,EAAW,IAEpC,KAAMqY,EAAS,CAER0C,IACLA,EAAQrL,GAAU1P,IAEnBqE,EAAI0W,EAAM3Y,MACV,OAAQiC,IACPgU,EAASuB,GAAmBmB,EAAM1W,IAC7BgU,EAAQ/S,GACZ8U,EAAY/a,KAAMgZ,GAElB8B,EAAgB9a,KAAMgZ,EAKxBA,GAAShM,EAAerM,EAAUka,GAA0BC,EAAiBC,IAE9E,MAAO/B,GAGR,SAASoB,IAAkBzZ,EAAUgb,EAAU3R,GAC9C,GAAIhF,GAAI,EACPC,EAAM0W,EAAS5Y,MAChB,MAAYkC,EAAJD,EAASA,IAChB4K,GAAQjP,EAAUgb,EAAS3W,GAAIgF,EAEhC,OAAOA,GAGR,QAAS6G,IAAQlQ,EAAUC,EAASoJ,EAAS6F,GAC5C,GAAI7K,GAAG6T,EAAQ+C,EAAO1Z,EAAMe,EAC3BN,EAAQ0N,GAAU1P,EAEnB,KAAMkP,GAEiB,IAAjBlN,EAAMI,OAAe,CAIzB,GADA8V,EAASlW,EAAM,GAAKA,EAAM,GAAGzC,MAAO,GAC/B2Y,EAAO9V,OAAS,GAAkC,QAA5B6Y,EAAQ/C,EAAO,IAAI3W,MAC5CwF,EAAQmL,SAAgC,IAArBjS,EAAQwC,UAAkBkJ,GAC7CP,EAAKgJ,SAAU8D,EAAO,GAAG3W,MAAS,CAGnC,GADAtB,GAAYmL,EAAK9I,KAAS,GAAG2Y,EAAMnP,QAAQ,GAAGrG,QAAQgJ,GAAWC,IAAYzO,QAAkB,IACzFA,EACL,MAAOoJ,EAERrJ,GAAWA,EAAST,MAAO2Y,EAAO5H,QAAQrH,MAAM7G,QAIjDiC,EAAIuJ,EAAwB,aAAEjL,KAAM3C,GAAa,EAAIkY,EAAO9V,MAC5D,OAAQiC,IAAM,CAIb,GAHA4W,EAAQ/C,EAAO7T,GAGV+G,EAAKgJ,SAAW7S,EAAO0Z,EAAM1Z,MACjC,KAED,KAAMe,EAAO8I,EAAK9I,KAAMf,MAEjB2N,EAAO5M,EACZ2Y,EAAMnP,QAAQ,GAAGrG,QAASgJ,GAAWC,IACrClB,EAAS7K,KAAMuV,EAAO,GAAG3W,OAAUtB,EAAQ+C,YAAc/C,IACrD,CAKJ,GAFAiY,EAAOvT,OAAQN,EAAG,GAClBrE,EAAWkP,EAAK9M,QAAUyN,GAAYqI,IAChClY,EAEL,MADAX,GAAK2E,MAAOqF,EAAS6F,GACd7F,CAGR,SAgBL,MAPAkC,GAASvL,EAAUgC,GAClBkN,EACAjP,GACC0L,EACDtC,EACAmE,EAAS7K,KAAM3C,IAETqJ,EAMRtC,EAAQgN,WAAazO,EAAQ4F,MAAM,IAAIxG,KAAM6H,GAAYuD,KAAK,MAAQxK,EAItEyB,EAAQ+M,iBAAmBxH,EAG3BZ,IAIA3E,EAAQoM,aAAe3C,GAAO,SAAU0K,GAEvC,MAAuE,GAAhEA,EAAKnI,wBAAyBvU,EAASiJ,cAAc,UAMvD+I,GAAO,SAAUC,GAEtB,MADAA,GAAIuB,UAAY,mBAC+B,MAAxCvB,EAAIwB,WAAWtC,aAAa,WAEnCgB,GAAW,yBAA0B,SAAU1O,EAAM+C,EAAMsG,GAC1D,MAAMA,GAAN,EACQrJ,EAAK0N,aAAc3K,EAA6B,SAAvBA,EAAKgE,cAA2B,EAAI,KAOjEjC,EAAQoG,YAAeqD,GAAO,SAAUC,GAG7C,MAFAA,GAAIuB,UAAY,WAChBvB,EAAIwB,WAAWrC,aAAc,QAAS,IACY,KAA3Ca,EAAIwB,WAAWtC,aAAc,YAEpCgB,GAAW,QAAS,SAAU1O,EAAM+C,EAAMsG,GACzC,MAAMA,IAAyC,UAAhCrJ,EAAK8G,SAASC,cAA7B,EACQ/G,EAAKkZ,eAOT3K,GAAO,SAAUC,GACtB,MAAuC,OAAhCA,EAAId,aAAa,eAExBgB,GAAW5D,EAAU,SAAU9K,EAAM+C,EAAMsG,GAC1C,GAAIoI,EACJ,OAAMpI,GAAN,GACSoI,EAAMzR,EAAKqQ,iBAAkBtN,KAAW0O,EAAIC,UACnDD,EAAIzK,MACJhH,EAAM+C,MAAW,EAAOA,EAAKgE,cAAgB,OAKjDpK,EAAO0D,KAAO2M,GACdrQ,EAAO4U,KAAOvE,GAAOiF,UACrBtV,EAAO4U,KAAK,KAAO5U,EAAO4U,KAAKpG,QAC/BxO,EAAOwc,OAASnM,GAAO2E,WACvBhV,EAAOuK,KAAO8F,GAAO5D,QACrBzM,EAAOyc,SAAWpM,GAAO3D,MACzB1M,EAAOmN,SAAWkD,GAAOlD,UAGrB7N,EAEJ,IAAIod,KAGJ,SAASC,GAAetW,GACvB,GAAIuW,GAASF,EAAcrW,KAI3B,OAHArG,GAAO+E,KAAMsB,EAAQjD,MAAO1B,OAAwB,SAAUqO,EAAG8M,GAChED,EAAQC,IAAS,IAEXD,EAyBR5c,EAAO8c,UAAY,SAAUzW,GAI5BA,EAA6B,gBAAZA,GACdqW,EAAcrW,IAAasW,EAAetW,GAC5CrG,EAAOgG,UAAYK,EAEpB,IACC0W,GAEAC,EAEAC,EAEAC,EAEAC,EAEAC,EAEAC,KAEAC,GAASjX,EAAQkX,SAEjBC,EAAO,SAAU/U,GAOhB,IANAuU,EAAS3W,EAAQ2W,QAAUvU,EAC3BwU,GAAQ,EACRE,EAAcC,GAAe,EAC7BA,EAAc,EACdF,EAAeG,EAAK7Z,OACpBuZ,GAAS,EACDM,GAAsBH,EAAdC,EAA4BA,IAC3C,GAAKE,EAAMF,GAAc/X,MAAOqD,EAAM,GAAKA,EAAM,OAAU,GAASpC,EAAQoX,YAAc,CACzFT,GAAS,CACT,OAGFD,GAAS,EACJM,IACCC,EACCA,EAAM9Z,QACVga,EAAMF,EAAM5L,SAEFsL,EACXK,KAEAK,EAAKC,YAKRD,GAECE,IAAK,WACJ,GAAKP,EAAO,CAEX,GAAIzG,GAAQyG,EAAK7Z,QACjB,QAAUoa,GAAK3Y,GACdjF,EAAO+E,KAAME,EAAM,SAAU8K,EAAG7E,GAC/B,GAAIvI,GAAO3C,EAAO2C,KAAMuI,EACV,cAATvI,EACE0D,EAAQmW,QAAWkB,EAAKpG,IAAKpM,IAClCmS,EAAK5c,KAAMyK,GAEDA,GAAOA,EAAI1H,QAAmB,WAATb,GAEhCib,EAAK1S,OAGJ7F,WAGC0X,EACJG,EAAeG,EAAK7Z,OAGTwZ,IACXI,EAAcxG,EACd4G,EAAMR,IAGR,MAAO1Z,OAGRyF,OAAQ,WAkBP,MAjBKsU,IACJrd,EAAO+E,KAAMM,UAAW,SAAU0K,EAAG7E,GACpC,GAAI2S,EACJ,QAASA,EAAQ7d,EAAO2K,QAASO,EAAKmS,EAAMQ,IAAY,GACvDR,EAAKtX,OAAQ8X,EAAO,GAEfd,IACUG,GAATW,GACJX,IAEaC,GAATU,GACJV,OAME7Z,MAIRgU,IAAK,SAAUhW,GACd,MAAOA,GAAKtB,EAAO2K,QAASrJ,EAAI+b,GAAS,MAASA,IAAQA,EAAK7Z,SAGhE8U,MAAO,WAGN,MAFA+E,MACAH,EAAe,EACR5Z,MAGRqa,QAAS,WAER,MADAN,GAAOC,EAAQN,EAASzd,EACjB+D,MAGR4U,SAAU,WACT,OAAQmF,GAGTS,KAAM,WAKL,MAJAR,GAAQ/d,EACFyd,GACLU,EAAKC,UAECra,MAGRya,OAAQ,WACP,OAAQT,GAGTU,SAAU,SAAU3c,EAAS4D,GAU5B,OATKoY,GAAWJ,IAASK,IACxBrY,EAAOA,MACPA,GAAS5D,EAAS4D,EAAKtE,MAAQsE,EAAKtE,QAAUsE,GACzC8X,EACJO,EAAM7c,KAAMwE,GAEZuY,EAAMvY,IAGD3B,MAGRka,KAAM,WAEL,MADAE,GAAKM,SAAU1a,KAAM+B,WACd/B,MAGR2Z,MAAO,WACN,QAASA,GAIZ,OAAOS,IAER1d,EAAOgG,QAENgG,SAAU,SAAUiS,GACnB,GAAIC,KAEA,UAAW,OAAQle,EAAO8c,UAAU,eAAgB,aACpD,SAAU,OAAQ9c,EAAO8c,UAAU,eAAgB,aACnD,SAAU,WAAY9c,EAAO8c,UAAU,YAE1CqB,EAAQ,UACRjZ,GACCiZ,MAAO,WACN,MAAOA,IAERC,OAAQ,WAEP,MADAC,GAASlZ,KAAME,WAAYiZ,KAAMjZ,WAC1B/B,MAERib,KAAM,WACL,GAAIC,GAAMnZ,SACV,OAAOrF,GAAOgM,SAAS,SAAUyS,GAChCze,EAAO+E,KAAMmZ,EAAQ,SAAUzY,EAAGiZ,GACjC,GAAIC,GAASD,EAAO,GACnBpd,EAAKtB,EAAOiE,WAAYua,EAAK/Y,KAAS+Y,EAAK/Y,EAE5C4Y,GAAUK,EAAM,IAAK,WACpB,GAAIE,GAAWtd,GAAMA,EAAG8D,MAAO9B,KAAM+B,UAChCuZ,IAAY5e,EAAOiE,WAAY2a,EAAS1Z,SAC5C0Z,EAAS1Z,UACPC,KAAMsZ,EAASI,SACfP,KAAMG,EAASK,QACfC,SAAUN,EAASO,QAErBP,EAAUE,EAAS,QAAUrb,OAAS4B,EAAUuZ,EAASvZ,UAAY5B,KAAMhC,GAAOsd,GAAavZ,eAIlGmZ,EAAM,OACJtZ,WAIJA,QAAS,SAAUuC,GAClB,MAAc,OAAPA,EAAczH,EAAOgG,OAAQyB,EAAKvC,GAAYA,IAGvDmZ,IAwCD,OArCAnZ,GAAQ+Z,KAAO/Z,EAAQqZ,KAGvBve,EAAO+E,KAAMmZ,EAAQ,SAAUzY,EAAGiZ,GACjC,GAAIrB,GAAOqB,EAAO,GACjBQ,EAAcR,EAAO,EAGtBxZ,GAASwZ,EAAM,IAAOrB,EAAKO,IAGtBsB,GACJ7B,EAAKO,IAAI,WAERO,EAAQe,GAGNhB,EAAY,EAAJzY,GAAS,GAAIkY,QAASO,EAAQ,GAAK,GAAIJ,MAInDO,EAAUK,EAAM,IAAO,WAEtB,MADAL,GAAUK,EAAM,GAAK,QAAUpb,OAAS+a,EAAWnZ,EAAU5B,KAAM+B,WAC5D/B,MAER+a,EAAUK,EAAM,GAAK,QAAWrB,EAAKW,WAItC9Y,EAAQA,QAASmZ,GAGZJ,GACJA,EAAKzZ,KAAM6Z,EAAUA,GAIfA,GAIRc,KAAM,SAAUC,GACf,GAAI3Z,GAAI,EACP4Z,EAAgB3e,EAAW8D,KAAMa,WACjC7B,EAAS6b,EAAc7b,OAGvB8b,EAAuB,IAAX9b,GAAkB4b,GAAepf,EAAOiE,WAAYmb,EAAYla,SAAc1B,EAAS,EAGnG6a,EAAyB,IAAdiB,EAAkBF,EAAcpf,EAAOgM,WAGlDuT,EAAa,SAAU9Z,EAAG2W,EAAUoD,GACnC,MAAO,UAAUnV,GAChB+R,EAAU3W,GAAMnC,KAChBkc,EAAQ/Z,GAAMJ,UAAU7B,OAAS,EAAI9C,EAAW8D,KAAMa,WAAcgF,EAChEmV,IAAWC,EACdpB,EAASqB,WAAYtD,EAAUoD,KACfF,GAChBjB,EAAS/W,YAAa8U,EAAUoD,KAKnCC,EAAgBE,EAAkBC,CAGnC,IAAKpc,EAAS,EAIb,IAHAic,EAAqB/X,MAAOlE,GAC5Bmc,EAAuBjY,MAAOlE,GAC9Boc,EAAsBlY,MAAOlE,GACjBA,EAAJiC,EAAYA,IACd4Z,EAAe5Z,IAAOzF,EAAOiE,WAAYob,EAAe5Z,GAAIP,SAChEma,EAAe5Z,GAAIP,UACjBC,KAAMoa,EAAY9Z,EAAGma,EAAiBP,IACtCf,KAAMD,EAASS,QACfC,SAAUQ,EAAY9Z,EAAGka,EAAkBF,MAE3CH,CAUL,OAJMA,IACLjB,EAAS/W,YAAasY,EAAiBP,GAGjChB,EAASnZ,aAGlBlF,EAAOmI,QAAU,SAAWA,GAE3B,GAAI9F,GAAKuL,EAAGgG,EAAOtC,EAAQuO,EAAUC,EAAKC,EAAWC,EAAava,EACjEoM,EAAMjS,EAASiJ,cAAc,MAS9B,IANAgJ,EAAIb,aAAc,YAAa,KAC/Ba,EAAIuB,UAAY,qEAGhB/Q,EAAMwP,EAAIhI,qBAAqB,SAC/B+D,EAAIiE,EAAIhI,qBAAqB,KAAM,IAC7B+D,IAAMA,EAAE7B,QAAU1J,EAAImB,OAC3B,MAAO2E,EAIRmJ,GAAS1R,EAASiJ,cAAc,UAChCiX,EAAMxO,EAAO4B,YAAatT,EAASiJ,cAAc,WACjD+K,EAAQ/B,EAAIhI,qBAAqB,SAAU,GAE3C+D,EAAE7B,MAAMkU,QAAU,gCAGlB9X,EAAQ+X,gBAAoC,MAAlBrO,EAAIoB,UAG9B9K,EAAQgY,kBAAgD,IAA5BtO,EAAIwB,WAAWxP,SAI3CsE,EAAQiY,OAASvO,EAAIhI,qBAAqB,SAASrG,OAInD2E,EAAQkY,gBAAkBxO,EAAIhI,qBAAqB,QAAQrG,OAI3D2E,EAAQ4D,MAAQ,MAAMhI,KAAM6J,EAAEmD,aAAa,UAI3C5I,EAAQmY,eAA4C,OAA3B1S,EAAEmD,aAAa,QAKxC5I,EAAQoY,QAAU,OAAOxc,KAAM6J,EAAE7B,MAAMwU,SAIvCpY,EAAQqY,WAAa5S,EAAE7B,MAAMyU,SAG7BrY,EAAQsY,UAAY7M,EAAMvJ,MAI1BlC,EAAQuY,YAAcZ,EAAI1H,SAG1BjQ,EAAQwY,UAAY/gB,EAASiJ,cAAc,QAAQ8X,QAInDxY,EAAQyY,WAA2E,kBAA9DhhB,EAASiJ,cAAc,OAAOgY,WAAW,GAAOC,UAGrE3Y,EAAQ4Y,wBAAyB,EACjC5Y,EAAQ6Y,kBAAmB,EAC3B7Y,EAAQ8Y,eAAgB,EACxB9Y,EAAQ+Y,eAAgB,EACxB/Y,EAAQgZ,cAAe,EACvBhZ,EAAQiZ,qBAAsB,EAC9BjZ,EAAQkZ,mBAAoB,EAG5BzN,EAAMuE,SAAU,EAChBhQ,EAAQmZ,eAAiB1N,EAAMiN,WAAW,GAAO1I,QAIjD7G,EAAO4G,UAAW,EAClB/P,EAAQoZ,aAAezB,EAAI5H,QAG3B,WACQrG,GAAI9N,KACV,MAAOmE,GACRC,EAAQ+Y,eAAgB,EAIzBtN,EAAQhU,EAASiJ,cAAc,SAC/B+K,EAAM5C,aAAc,QAAS,IAC7B7I,EAAQyL,MAA0C,KAAlCA,EAAM7C,aAAc,SAGpC6C,EAAMvJ,MAAQ,IACduJ,EAAM5C,aAAc,OAAQ,SAC5B7I,EAAQqZ,WAA6B,MAAhB5N,EAAMvJ,MAG3BuJ,EAAM5C,aAAc,UAAW,KAC/B4C,EAAM5C,aAAc,OAAQ,KAE5B6O,EAAWjgB,EAAS6hB,yBACpB5B,EAAS3M,YAAaU,GAItBzL,EAAQuZ,cAAgB9N,EAAMuE,QAG9BhQ,EAAQwZ,WAAa9B,EAASgB,WAAW,GAAOA,WAAW,GAAO/J,UAAUqB,QAKvEtG,EAAI5F,cACR4F,EAAI5F,YAAa,UAAW,WAC3B9D,EAAQgZ,cAAe,IAGxBtP,EAAIgP,WAAW,GAAOe,QAKvB,KAAMnc,KAAOyT,QAAQ,EAAM2I,QAAQ,EAAMC,SAAS,GACjDjQ,EAAIb,aAAc+O,EAAY,KAAOta,EAAG,KAExC0C,EAAS1C,EAAI,WAAcsa,IAAazgB,IAAUuS,EAAItD,WAAYwR,GAAYrZ,WAAY,CAG3FmL,GAAI9F,MAAMgW,eAAiB,cAC3BlQ,EAAIgP,WAAW,GAAO9U,MAAMgW,eAAiB,GAC7C5Z,EAAQ6Z,gBAA+C,gBAA7BnQ,EAAI9F,MAAMgW,cAIpC,KAAMtc,IAAKzF,GAAQmI,GAClB,KAoGD,OAlGAA,GAAQC,QAAgB,MAAN3C,EAGlBzF,EAAO,WACN,GAAIiiB,GAAWC,EAAWC,EACzBC,EAAW,+HACXhb,EAAOxH,EAASiK,qBAAqB,QAAQ,EAExCzC,KAKN6a,EAAYriB,EAASiJ,cAAc,OACnCoZ,EAAUlW,MAAMkU,QAAU,gFAE1B7Y,EAAK8L,YAAa+O,GAAY/O,YAAarB,GAS3CA,EAAIuB,UAAY,8CAChB+O,EAAMtQ,EAAIhI,qBAAqB,MAC/BsY,EAAK,GAAIpW,MAAMkU,QAAU,2CACzBD,EAA0C,IAA1BmC,EAAK,GAAIE,aAEzBF,EAAK,GAAIpW,MAAMuW,QAAU,GACzBH,EAAK,GAAIpW,MAAMuW,QAAU,OAIzBna,EAAQoa,sBAAwBvC,GAA2C,IAA1BmC,EAAK,GAAIE,aAG1DxQ,EAAIuB,UAAY,GAChBvB,EAAI9F,MAAMkU,QAAU,wKAIpBjgB,EAAO6L,KAAMzE,EAAyB,MAAnBA,EAAK2E,MAAMyW,MAAiBA,KAAM,MAAU,WAC9Dra,EAAQsa,UAAgC,IAApB5Q,EAAI6Q,cAIpBpjB,EAAOqjB,mBACXxa,EAAQ8Y,cAAuE,QAArD3hB,EAAOqjB,iBAAkB9Q,EAAK,WAAe3F,IACvE/D,EAAQkZ,kBAA2F,SAArE/hB,EAAOqjB,iBAAkB9Q,EAAK,QAAY+Q,MAAO,QAAUA,MAMzFV,EAAYrQ,EAAIqB,YAAatT,EAASiJ,cAAc,QACpDqZ,EAAUnW,MAAMkU,QAAUpO,EAAI9F,MAAMkU,QAAUmC,EAC9CF,EAAUnW,MAAM8W,YAAcX,EAAUnW,MAAM6W,MAAQ,IACtD/Q,EAAI9F,MAAM6W,MAAQ,MAElBza,EAAQiZ,qBACNtZ,YAAcxI,EAAOqjB,iBAAkBT,EAAW,WAAeW,oBAGxDhR,GAAI9F,MAAMyW,OAAS9iB,IAK9BmS,EAAIuB,UAAY,GAChBvB,EAAI9F,MAAMkU,QAAUmC,EAAW,8CAC/Bja,EAAQ4Y,uBAA+C,IAApBlP,EAAI6Q,YAIvC7Q,EAAI9F,MAAMuW,QAAU,QACpBzQ,EAAIuB,UAAY,cAChBvB,EAAIwB,WAAWtH,MAAM6W,MAAQ,MAC7Bza,EAAQ6Y,iBAAyC,IAApBnP,EAAI6Q,YAE5Bva,EAAQ4Y,yBAIZ3Z,EAAK2E,MAAMyW,KAAO,IAIpBpb,EAAK0K,YAAamQ,GAGlBA,EAAYpQ,EAAMsQ,EAAMD,EAAY,QAIrC7f,EAAMiP,EAASuO,EAAWC,EAAMlS,EAAIgG,EAAQ,KAErCzL;KAGR,IAAI2a,GAAS,+BACZC,EAAa,UAEd,SAASC,GAAc3f,EAAM+C,EAAMqC,EAAMwa,GACxC,GAAMjjB,EAAOkjB,WAAY7f,GAAzB,CAIA,GAAIwB,GAAKse,EACRC,EAAcpjB,EAAO0G,QAIrB2c,EAAShgB,EAAKQ,SAId2N,EAAQ6R,EAASrjB,EAAOwR,MAAQnO,EAIhCgB,EAAKgf,EAAShgB,EAAM+f,GAAgB/f,EAAM+f,IAAiBA,CAI5D,IAAO/e,GAAOmN,EAAMnN,KAAS4e,GAAQzR,EAAMnN,GAAIoE,OAAUA,IAASlJ,GAA6B,gBAAT6G,GAgEtF,MA5DM/B,KAIJA,EADIgf,EACChgB,EAAM+f,GAAgBhjB,EAAgB6N,OAASjO,EAAOmL,OAEtDiY,GAID5R,EAAOnN,KAGZmN,EAAOnN,GAAOgf,MAAgBC,OAAQtjB,EAAO8J,QAKzB,gBAAT1D,IAAqC,kBAATA,MAClC6c,EACJzR,EAAOnN,GAAOrE,EAAOgG,OAAQwL,EAAOnN,GAAM+B,GAE1CoL,EAAOnN,GAAKoE,KAAOzI,EAAOgG,OAAQwL,EAAOnN,GAAKoE,KAAMrC,IAItD+c,EAAY3R,EAAOnN,GAKb4e,IACCE,EAAU1a,OACf0a,EAAU1a,SAGX0a,EAAYA,EAAU1a,MAGlBA,IAASlJ,IACb4jB,EAAWnjB,EAAOiK,UAAW7D,IAAWqC,GAKpB,gBAATrC,IAGXvB,EAAMse,EAAW/c,GAGL,MAAPvB,IAGJA,EAAMse,EAAWnjB,EAAOiK,UAAW7D,MAGpCvB,EAAMse,EAGAte,GAGR,QAAS0e,GAAoBlgB,EAAM+C,EAAM6c,GACxC,GAAMjjB,EAAOkjB,WAAY7f,GAAzB,CAIA,GAAI8f,GAAW1d,EACd4d,EAAShgB,EAAKQ,SAGd2N,EAAQ6R,EAASrjB,EAAOwR,MAAQnO,EAChCgB,EAAKgf,EAAShgB,EAAMrD,EAAO0G,SAAY1G,EAAO0G,OAI/C,IAAM8K,EAAOnN,GAAb,CAIA,GAAK+B,IAEJ+c,EAAYF,EAAMzR,EAAOnN,GAAOmN,EAAOnN,GAAKoE,MAE3B,CAGVzI,EAAOyG,QAASL,GAsBrBA,EAAOA,EAAK7F,OAAQP,EAAO4F,IAAKQ,EAAMpG,EAAOiK,YAnBxC7D,IAAQ+c,GACZ/c,GAASA,IAITA,EAAOpG,EAAOiK,UAAW7D,GAExBA,EADIA,IAAQ+c,IACH/c,GAEFA,EAAKkG,MAAM,MAarB7G,EAAIW,EAAK5C,MACT,OAAQiC,UACA0d,GAAW/c,EAAKX,GAKxB,IAAKwd,GAAOO,EAAkBL,IAAcnjB,EAAOqI,cAAc8a,GAChE,QAMGF,UACEzR,GAAOnN,GAAKoE,KAIb+a,EAAmBhS,EAAOnN,QAM5Bgf,EACJrjB,EAAOyjB,WAAapgB,IAAQ,GAIjBrD,EAAOmI,QAAQ+Y,eAAiB1P,GAASA,EAAMlS,aAEnDkS,GAAOnN,GAIdmN,EAAOnN,GAAO,QAIhBrE,EAAOgG,QACNwL,SAIAkS,QACCC,QAAU,EACVC,OAAS,EAEThH,OAAU,8CAGXiH,QAAS,SAAUxgB,GAElB,MADAA,GAAOA,EAAKQ,SAAW7D,EAAOwR,MAAOnO,EAAKrD,EAAO0G,UAAarD,EAAMrD,EAAO0G,WAClErD,IAASmgB,EAAmBngB,IAGtCoF,KAAM,SAAUpF,EAAM+C,EAAMqC,GAC3B,MAAOua,GAAc3f,EAAM+C,EAAMqC,IAGlCqb,WAAY,SAAUzgB,EAAM+C,GAC3B,MAAOmd,GAAoBlgB,EAAM+C,IAIlC2d,MAAO,SAAU1gB,EAAM+C,EAAMqC,GAC5B,MAAOua,GAAc3f,EAAM+C,EAAMqC,GAAM,IAGxCub,YAAa,SAAU3gB,EAAM+C,GAC5B,MAAOmd,GAAoBlgB,EAAM+C,GAAM,IAIxC8c,WAAY,SAAU7f,GAErB,GAAKA,EAAKQ,UAA8B,IAAlBR,EAAKQ,UAAoC,IAAlBR,EAAKQ,SACjD,OAAO,CAGR,IAAI6f,GAASrgB,EAAK8G,UAAYnK,EAAO0jB,OAAQrgB,EAAK8G,SAASC,cAG3D,QAAQsZ,GAAUA,KAAW,GAAQrgB,EAAK0N,aAAa,aAAe2S,KAIxE1jB,EAAOsB,GAAG0E,QACTyC,KAAM,SAAUR,EAAKoC,GACpB,GAAI2H,GAAO5L,EACVqC,EAAO,KACPhD,EAAI,EACJpC,EAAOC,KAAK,EAMb,IAAK2E,IAAQ1I,EAAY,CACxB,GAAK+D,KAAKE,SACTiF,EAAOzI,EAAOyI,KAAMpF,GAEG,IAAlBA,EAAKQ,WAAmB7D,EAAO+jB,MAAO1gB,EAAM,gBAAkB,CAElE,IADA2O,EAAQ3O,EAAKkL,WACDyD,EAAMxO,OAAViC,EAAkBA,IACzBW,EAAO4L,EAAMvM,GAAGW,KAEe,IAA1BA,EAAKvF,QAAQ,WACjBuF,EAAOpG,EAAOiK,UAAW7D,EAAKzF,MAAM,IAEpCsjB,EAAU5gB,EAAM+C,EAAMqC,EAAMrC,IAG9BpG,GAAO+jB,MAAO1gB,EAAM,eAAe,GAIrC,MAAOoF,GAIR,MAAoB,gBAARR,GACJ3E,KAAKyB,KAAK,WAChB/E,EAAOyI,KAAMnF,KAAM2E,KAId5C,UAAU7B,OAAS,EAGzBF,KAAKyB,KAAK,WACT/E,EAAOyI,KAAMnF,KAAM2E,EAAKoC,KAKzBhH,EAAO4gB,EAAU5gB,EAAM4E,EAAKjI,EAAOyI,KAAMpF,EAAM4E,IAAU,MAG3D6b,WAAY,SAAU7b,GACrB,MAAO3E,MAAKyB,KAAK,WAChB/E,EAAO8jB,WAAYxgB,KAAM2E,OAK5B,SAASgc,GAAU5gB,EAAM4E,EAAKQ,GAG7B,GAAKA,IAASlJ,GAA+B,IAAlB8D,EAAKQ,SAAiB,CAEhD,GAAIuC,GAAO,QAAU6B,EAAIpB,QAASkc,EAAY,OAAQ3Y,aAItD,IAFA3B,EAAOpF,EAAK0N,aAAc3K,GAEL,gBAATqC,GAAoB,CAC/B,IACCA,EAAgB,SAATA,GAAkB,EACf,UAATA,GAAmB,EACV,SAATA,EAAkB,MAEjBA,EAAO,KAAOA,GAAQA,EACvBqa,EAAO/e,KAAM0E,GAASzI,EAAOiJ,UAAWR,GACvCA,EACD,MAAOP,IAGTlI,EAAOyI,KAAMpF,EAAM4E,EAAKQ,OAGxBA,GAAOlJ,EAIT,MAAOkJ,GAIR,QAAS+a,GAAmB/b,GAC3B,GAAIrB,EACJ,KAAMA,IAAQqB,GAGb,IAAc,SAATrB,IAAmBpG,EAAOqI,cAAeZ,EAAIrB,MAGpC,WAATA,EACJ,OAAO,CAIT,QAAO,EAERpG,EAAOgG,QACNke,MAAO,SAAU7gB,EAAMV,EAAM8F,GAC5B,GAAIyb,EAEJ,OAAK7gB,IACJV,GAASA,GAAQ,MAAS,QAC1BuhB,EAAQlkB,EAAO+jB,MAAO1gB,EAAMV,GAGvB8F,KACEyb,GAASlkB,EAAOyG,QAAQgC,GAC7Byb,EAAQlkB,EAAO+jB,MAAO1gB,EAAMV,EAAM3C,EAAOsE,UAAUmE,IAEnDyb,EAAMzjB,KAAMgI,IAGPyb,OAZR,GAgBDC,QAAS,SAAU9gB,EAAMV,GACxBA,EAAOA,GAAQ,IAEf,IAAIuhB,GAAQlkB,EAAOkkB,MAAO7gB,EAAMV,GAC/ByhB,EAAcF,EAAM1gB,OACpBlC,EAAK4iB,EAAMxS,QACX2S,EAAQrkB,EAAOskB,YAAajhB,EAAMV,GAClC4hB,EAAO,WACNvkB,EAAOmkB,QAAS9gB,EAAMV,GAIZ,gBAAPrB,IACJA,EAAK4iB,EAAMxS,QACX0S,KAGI9iB,IAIU,OAATqB,GACJuhB,EAAMvP,QAAS,oBAIT0P,GAAMG,KACbljB,EAAGkD,KAAMnB,EAAMkhB,EAAMF,KAGhBD,GAAeC,GACpBA,EAAM/L,MAAMkF,QAKd8G,YAAa,SAAUjhB,EAAMV,GAC5B,GAAIsF,GAAMtF,EAAO,YACjB,OAAO3C,GAAO+jB,MAAO1gB,EAAM4E,IAASjI,EAAO+jB,MAAO1gB,EAAM4E,GACvDqQ,MAAOtY,EAAO8c,UAAU,eAAec,IAAI,WAC1C5d,EAAOgkB,YAAa3gB,EAAMV,EAAO,SACjC3C,EAAOgkB,YAAa3gB,EAAM4E,UAM9BjI,EAAOsB,GAAG0E,QACTke,MAAO,SAAUvhB,EAAM8F,GACtB,GAAIgc,GAAS,CAQb,OANqB,gBAAT9hB,KACX8F,EAAO9F,EACPA,EAAO,KACP8hB,KAGuBA,EAAnBpf,UAAU7B,OACPxD,EAAOkkB,MAAO5gB,KAAK,GAAIX,GAGxB8F,IAASlJ,EACf+D,KACAA,KAAKyB,KAAK,WACT,GAAImf,GAAQlkB,EAAOkkB,MAAO5gB,KAAMX,EAAM8F,EAGtCzI,GAAOskB,YAAahhB,KAAMX,GAEZ,OAATA,GAA8B,eAAbuhB,EAAM,IAC3BlkB,EAAOmkB,QAAS7gB,KAAMX,MAI1BwhB,QAAS,SAAUxhB,GAClB,MAAOW,MAAKyB,KAAK,WAChB/E,EAAOmkB,QAAS7gB,KAAMX,MAKxB+hB,MAAO,SAAUC,EAAMhiB,GAItB,MAHAgiB,GAAO3kB,EAAO4kB,GAAK5kB,EAAO4kB,GAAGC,OAAQF,IAAUA,EAAOA,EACtDhiB,EAAOA,GAAQ,KAERW,KAAK4gB,MAAOvhB,EAAM,SAAU4hB,EAAMF,GACxC,GAAIS,GAAUzd,WAAYkd,EAAMI,EAChCN,GAAMG,KAAO,WACZO,aAAcD,OAIjBE,WAAY,SAAUriB,GACrB,MAAOW,MAAK4gB,MAAOvhB,GAAQ,UAI5BuC,QAAS,SAAUvC,EAAM8E,GACxB,GAAI8B,GACH0b,EAAQ,EACRC,EAAQllB,EAAOgM,WACf6I,EAAWvR,KACXmC,EAAInC,KAAKE,OACTqb,EAAU,aACCoG,GACTC,EAAM5d,YAAauN,GAAYA,IAIb,iBAATlS,KACX8E,EAAM9E,EACNA,EAAOpD,GAERoD,EAAOA,GAAQ,IAEf,OAAO8C,IACN8D,EAAMvJ,EAAO+jB,MAAOlP,EAAUpP,GAAK9C,EAAO,cACrC4G,GAAOA,EAAI+O,QACf2M,IACA1b,EAAI+O,MAAMsF,IAAKiB,GAIjB,OADAA,KACOqG,EAAMhgB,QAASuC,KAGxB,IAAI0d,GAAUC,EACbC,EAAS,cACTC,EAAU,MACVC,EAAa,6CACbC,EAAa,gBACbC,EAAc,0BACdvF,EAAkBlgB,EAAOmI,QAAQ+X,gBACjCwF,EAAc1lB,EAAOmI,QAAQyL,KAE9B5T,GAAOsB,GAAG0E,QACT9B,KAAM,SAAUkC,EAAMiE,GACrB,MAAOrK,GAAOqL,OAAQ/H,KAAMtD,EAAOkE,KAAMkC,EAAMiE,EAAOhF,UAAU7B,OAAS,IAG1EmiB,WAAY,SAAUvf,GACrB,MAAO9C,MAAKyB,KAAK,WAChB/E,EAAO2lB,WAAYriB,KAAM8C,MAI3Bwf,KAAM,SAAUxf,EAAMiE,GACrB,MAAOrK,GAAOqL,OAAQ/H,KAAMtD,EAAO4lB,KAAMxf,EAAMiE,EAAOhF,UAAU7B,OAAS,IAG1EqiB,WAAY,SAAUzf,GAErB,MADAA,GAAOpG,EAAO8lB,QAAS1f,IAAUA,EAC1B9C,KAAKyB,KAAK,WAEhB,IACCzB,KAAM8C,GAAS7G,QACR+D,MAAM8C,GACZ,MAAO8B,QAIX6d,SAAU,SAAU1b,GACnB,GAAI2b,GAAS3iB,EAAM+O,EAAK6T,EAAOtgB,EAC9BF,EAAI,EACJC,EAAMpC,KAAKE,OACX0iB,EAA2B,gBAAV7b,IAAsBA,CAExC,IAAKrK,EAAOiE,WAAYoG,GACvB,MAAO/G,MAAKyB,KAAK,SAAUY,GAC1B3F,EAAQsD,MAAOyiB,SAAU1b,EAAM7F,KAAMlB,KAAMqC,EAAGrC,KAAK2P,aAIrD,IAAKiT,EAIJ,IAFAF,GAAY3b,GAAS,IAAKjH,MAAO1B,OAErBgE,EAAJD,EAASA,IAOhB,GANApC,EAAOC,KAAMmC,GACb2M,EAAwB,IAAlB/O,EAAKQ,WAAoBR,EAAK4P,WACjC,IAAM5P,EAAK4P,UAAY,KAAMpM,QAASwe,EAAQ,KAChD,KAGU,CACV1f,EAAI,CACJ,OAASsgB,EAAQD,EAAQrgB,KACgB,EAAnCyM,EAAIvR,QAAS,IAAMolB,EAAQ,OAC/B7T,GAAO6T,EAAQ,IAGjB5iB,GAAK4P,UAAYjT,EAAOmB,KAAMiR,GAMjC,MAAO9O,OAGR6iB,YAAa,SAAU9b,GACtB,GAAI2b,GAAS3iB,EAAM+O,EAAK6T,EAAOtgB,EAC9BF,EAAI,EACJC,EAAMpC,KAAKE,OACX0iB,EAA+B,IAArB7gB,UAAU7B,QAAiC,gBAAV6G,IAAsBA,CAElE,IAAKrK,EAAOiE,WAAYoG,GACvB,MAAO/G,MAAKyB,KAAK,SAAUY,GAC1B3F,EAAQsD,MAAO6iB,YAAa9b,EAAM7F,KAAMlB,KAAMqC,EAAGrC,KAAK2P,aAGxD,IAAKiT,EAGJ,IAFAF,GAAY3b,GAAS,IAAKjH,MAAO1B,OAErBgE,EAAJD,EAASA,IAQhB,GAPApC,EAAOC,KAAMmC,GAEb2M,EAAwB,IAAlB/O,EAAKQ,WAAoBR,EAAK4P,WACjC,IAAM5P,EAAK4P,UAAY,KAAMpM,QAASwe,EAAQ,KAChD,IAGU,CACV1f,EAAI,CACJ,OAASsgB,EAAQD,EAAQrgB,KAExB,MAAQyM,EAAIvR,QAAS,IAAMolB,EAAQ,MAAS,EAC3C7T,EAAMA,EAAIvL,QAAS,IAAMof,EAAQ,IAAK,IAGxC5iB,GAAK4P,UAAY5I,EAAQrK,EAAOmB,KAAMiR,GAAQ,GAKjD,MAAO9O,OAGR8iB,YAAa,SAAU/b,EAAOgc,GAC7B,GAAI1jB,SAAc0H,EAElB,OAAyB,iBAAbgc,IAAmC,WAAT1jB,EAC9B0jB,EAAW/iB,KAAKyiB,SAAU1b,GAAU/G,KAAK6iB,YAAa9b,GAGzDrK,EAAOiE,WAAYoG,GAChB/G,KAAKyB,KAAK,SAAUU,GAC1BzF,EAAQsD,MAAO8iB,YAAa/b,EAAM7F,KAAKlB,KAAMmC,EAAGnC,KAAK2P,UAAWoT,GAAWA,KAItE/iB,KAAKyB,KAAK,WAChB,GAAc,WAATpC,EAAoB,CAExB,GAAIsQ,GACHxN,EAAI,EACJiY,EAAO1d,EAAQsD,MACfgjB,EAAajc,EAAMjH,MAAO1B,MAE3B,OAASuR,EAAYqT,EAAY7gB,KAE3BiY,EAAK6I,SAAUtT,GACnByK,EAAKyI,YAAalT,GAElByK,EAAKqI,SAAU9S,QAKNtQ,IAASjD,GAA8B,YAATiD,KACpCW,KAAK2P,WAETjT,EAAO+jB,MAAOzgB,KAAM,gBAAiBA,KAAK2P,WAO3C3P,KAAK2P,UAAY3P,KAAK2P,WAAa5I,KAAU,EAAQ,GAAKrK,EAAO+jB,MAAOzgB,KAAM,kBAAqB,OAKtGijB,SAAU,SAAUnlB,GACnB,GAAI6R,GAAY,IAAM7R,EAAW,IAChCqE,EAAI,EACJqF,EAAIxH,KAAKE,MACV,MAAYsH,EAAJrF,EAAOA,IACd,GAA0B,IAArBnC,KAAKmC,GAAG5B,WAAmB,IAAMP,KAAKmC,GAAGwN,UAAY,KAAKpM,QAAQwe,EAAQ,KAAKxkB,QAASoS,IAAe,EAC3G,OAAO,CAIT,QAAO,GAGR6B,IAAK,SAAUzK,GACd,GAAIxF,GAAKwf,EAAOpgB,EACfZ,EAAOC,KAAK,EAEb,EAAA,GAAM+B,UAAU7B,OAsBhB,MAFAS,GAAajE,EAAOiE,WAAYoG,GAEzB/G,KAAKyB,KAAK,SAAUU,GAC1B,GAAIqP,EAEmB,KAAlBxR,KAAKO,WAKTiR,EADI7Q,EACEoG,EAAM7F,KAAMlB,KAAMmC,EAAGzF,EAAQsD,MAAOwR,OAEpCzK,EAIK,MAAPyK,EACJA,EAAM,GACoB,gBAARA,GAClBA,GAAO,GACI9U,EAAOyG,QAASqO,KAC3BA,EAAM9U,EAAO4F,IAAIkP,EAAK,SAAWzK,GAChC,MAAgB,OAATA,EAAgB,GAAKA,EAAQ,MAItCga,EAAQrkB,EAAOwmB,SAAUljB,KAAKX,OAAU3C,EAAOwmB,SAAUljB,KAAK6G,SAASC,eAGjEia,GAAW,OAASA,IAAUA,EAAMoC,IAAKnjB,KAAMwR,EAAK,WAAcvV,IACvE+D,KAAK+G,MAAQyK,KAjDd,IAAKzR,EAGJ,MAFAghB,GAAQrkB,EAAOwmB,SAAUnjB,EAAKV,OAAU3C,EAAOwmB,SAAUnjB,EAAK8G,SAASC,eAElEia,GAAS,OAASA,KAAUxf,EAAMwf,EAAM5f,IAAKpB,EAAM,YAAe9D,EAC/DsF,GAGRA,EAAMxB,EAAKgH,MAEW,gBAARxF,GAEbA,EAAIgC,QAAQye,EAAS,IAEd,MAAPzgB,EAAc,GAAKA,OA0CxB7E,EAAOgG,QACNwgB,UACCE,QACCjiB,IAAK,SAAUpB,GAEd,GAAIyR,GAAM9U,EAAO0D,KAAKQ,KAAMb,EAAM,QAClC,OAAc,OAAPyR,EACNA,EACAzR,EAAKkH,OAGR+G,QACC7M,IAAK,SAAUpB,GACd,GAAIgH,GAAOqc,EACVrgB,EAAUhD,EAAKgD,QACfwX,EAAQxa,EAAKgV,cACbsO,EAAoB,eAAdtjB,EAAKV,MAAiC,EAARkb,EACpC2B,EAASmH,EAAM,QACf/b,EAAM+b,EAAM9I,EAAQ,EAAIxX,EAAQ7C,OAChCiC,EAAY,EAARoY,EACHjT,EACA+b,EAAM9I,EAAQ,CAGhB,MAAYjT,EAAJnF,EAASA,IAIhB,GAHAihB,EAASrgB,EAASZ,MAGXihB,EAAOtO,UAAY3S,IAAMoY,IAE5B7d,EAAOmI,QAAQoZ,YAAemF,EAAOxO,SAA+C,OAApCwO,EAAO3V,aAAa,cACnE2V,EAAOtiB,WAAW8T,UAAalY,EAAOmK,SAAUuc,EAAOtiB,WAAY,aAAiB,CAMxF,GAHAiG,EAAQrK,EAAQ0mB,GAAS5R,MAGpB6R,EACJ,MAAOtc,EAIRmV,GAAO/e,KAAM4J,GAIf,MAAOmV,IAGRiH,IAAK,SAAUpjB,EAAMgH,GACpB,GAAIuc,GAAWF,EACdrgB,EAAUhD,EAAKgD,QACfmZ,EAASxf,EAAOsE,UAAW+F,GAC3B5E,EAAIY,EAAQ7C,MAEb,OAAQiC,IACPihB,EAASrgB,EAASZ,IACZihB,EAAOtO,SAAWpY,EAAO2K,QAAS3K,EAAO0mB,GAAQ5R,MAAO0K,IAAY,KACzEoH,GAAY,EAQd,OAHMA,KACLvjB,EAAKgV,cAAgB,IAEfmH,KAKVtb,KAAM,SAAUb,EAAM+C,EAAMiE,GAC3B,GAAIga,GAAOxf,EACVgiB,EAAQxjB,EAAKQ,QAGd,IAAMR,GAAkB,IAAVwjB,GAAyB,IAAVA,GAAyB,IAAVA,EAK5C,aAAYxjB,GAAK0N,eAAiBrR,EAC1BM,EAAO4lB,KAAMviB,EAAM+C,EAAMiE,IAKlB,IAAVwc,GAAgB7mB,EAAOyc,SAAUpZ,KACrC+C,EAAOA,EAAKgE,cACZia,EAAQrkB,EAAO8mB,UAAW1gB,KACvBpG,EAAO4U,KAAKxR,MAAMmM,KAAKxL,KAAMqC,GAASgf,EAAWD,IAGhD9a,IAAU9K,EAaH8kB,GAAS,OAASA,IAA6C,QAAnCxf,EAAMwf,EAAM5f,IAAKpB,EAAM+C,IACvDvB,GAGPA,EAAM7E,EAAO0D,KAAKQ,KAAMb,EAAM+C,GAGhB,MAAPvB,EACNtF,EACAsF,GApBc,OAAVwF,EAGOga,GAAS,OAASA,KAAUxf,EAAMwf,EAAMoC,IAAKpjB,EAAMgH,EAAOjE,MAAY7G,EAC1EsF,GAGPxB,EAAK2N,aAAc5K,EAAMiE,EAAQ,IAC1BA,IAPPrK,EAAO2lB,WAAYtiB,EAAM+C,GAAzBpG,KAuBH2lB,WAAY,SAAUtiB,EAAMgH,GAC3B,GAAIjE,GAAM2gB,EACTthB,EAAI,EACJuhB,EAAY3c,GAASA,EAAMjH,MAAO1B,EAEnC,IAAKslB,GAA+B,IAAlB3jB,EAAKQ,SACtB,MAASuC,EAAO4gB,EAAUvhB,KACzBshB,EAAW/mB,EAAO8lB,QAAS1f,IAAUA,EAGhCpG,EAAO4U,KAAKxR,MAAMmM,KAAKxL,KAAMqC,GAE5Bsf,GAAexF,IAAoBuF,EAAY1hB,KAAMqC,GACzD/C,EAAM0jB,IAAa,EAInB1jB,EAAMrD,EAAOiK,UAAW,WAAa7D,IACpC/C,EAAM0jB,IAAa,EAKrB/mB,EAAOkE,KAAMb,EAAM+C,EAAM,IAG1B/C,EAAKgO,gBAAiB6O,EAAkB9Z,EAAO2gB,IAKlDD,WACCnkB,MACC8jB,IAAK,SAAUpjB,EAAMgH,GACpB,IAAMrK,EAAOmI,QAAQqZ,YAAwB,UAAVnX,GAAqBrK,EAAOmK,SAAS9G,EAAM,SAAW,CAGxF,GAAIyR,GAAMzR,EAAKgH,KAKf,OAJAhH,GAAK2N,aAAc,OAAQ3G,GACtByK,IACJzR,EAAKgH,MAAQyK,GAEPzK,MAMXyb,SACCmB,MAAO,UACPC,QAAS,aAGVtB,KAAM,SAAUviB,EAAM+C,EAAMiE,GAC3B,GAAIxF,GAAKwf,EAAO8C,EACfN,EAAQxjB,EAAKQ,QAGd,IAAMR,GAAkB,IAAVwjB,GAAyB,IAAVA,GAAyB,IAAVA,EAY5C,MARAM,GAAmB,IAAVN,IAAgB7mB,EAAOyc,SAAUpZ,GAErC8jB,IAEJ/gB,EAAOpG,EAAO8lB,QAAS1f,IAAUA,EACjCie,EAAQrkB,EAAOonB,UAAWhhB,IAGtBiE,IAAU9K,EACP8kB,GAAS,OAASA,KAAUxf,EAAMwf,EAAMoC,IAAKpjB,EAAMgH,EAAOjE,MAAY7G,EAC5EsF,EACExB,EAAM+C,GAASiE,EAGXga,GAAS,OAASA,IAA6C,QAAnCxf,EAAMwf,EAAM5f,IAAKpB,EAAM+C,IACzDvB,EACAxB,EAAM+C,IAITghB,WACCpP,UACCvT,IAAK,SAAUpB,GAId,GAAIgkB,GAAWrnB,EAAO0D,KAAKQ,KAAMb,EAAM,WAEvC,OAAOgkB,GACNC,SAAUD,EAAU,IACpB9B,EAAWxhB,KAAMV,EAAK8G,WAAcqb,EAAWzhB,KAAMV,EAAK8G,WAAc9G,EAAK0U,KAC5E,EACA,QAONqN,GACCqB,IAAK,SAAUpjB,EAAMgH,EAAOjE,GAa3B,MAZKiE,MAAU,EAEdrK,EAAO2lB,WAAYtiB,EAAM+C,GACdsf,GAAexF,IAAoBuF,EAAY1hB,KAAMqC,GAEhE/C,EAAK2N,cAAekP,GAAmBlgB,EAAO8lB,QAAS1f,IAAUA,EAAMA,GAIvE/C,EAAMrD,EAAOiK,UAAW,WAAa7D,IAAW/C,EAAM+C,IAAS,EAGzDA,IAGTpG,EAAO+E,KAAM/E,EAAO4U,KAAKxR,MAAMmM,KAAK9N,OAAO2B,MAAO,QAAU,SAAUqC,EAAGW,GACxE,GAAImhB,GAASvnB,EAAO4U,KAAK1C,WAAY9L,IAAUpG,EAAO0D,KAAKQ,IAE3DlE,GAAO4U,KAAK1C,WAAY9L,GAASsf,GAAexF,IAAoBuF,EAAY1hB,KAAMqC,GACrF,SAAU/C,EAAM+C,EAAMsG,GACrB,GAAIpL,GAAKtB,EAAO4U,KAAK1C,WAAY9L,GAChCvB,EAAM6H,EACLnN,GAECS,EAAO4U,KAAK1C,WAAY9L,GAAS7G,IACjCgoB,EAAQlkB,EAAM+C,EAAMsG,GAEpBtG,EAAKgE,cACL,IAEH,OADApK,GAAO4U,KAAK1C,WAAY9L,GAAS9E,EAC1BuD,GAER,SAAUxB,EAAM+C,EAAMsG,GACrB,MAAOA,GACNnN,EACA8D,EAAMrD,EAAOiK,UAAW,WAAa7D,IACpCA,EAAKgE,cACL,QAKCsb,GAAgBxF,IACrBlgB,EAAO8mB,UAAUzc,OAChBoc,IAAK,SAAUpjB,EAAMgH,EAAOjE,GAC3B,MAAKpG,GAAOmK,SAAU9G,EAAM,UAE3BA,EAAKkZ,aAAelS,EAApBhH,GAGO8hB,GAAYA,EAASsB,IAAKpjB,EAAMgH,EAAOjE,MAO5C8Z,IAILiF,GACCsB,IAAK,SAAUpjB,EAAMgH,EAAOjE,GAE3B,GAAIvB,GAAMxB,EAAKqQ,iBAAkBtN,EAUjC,OATMvB,IACLxB,EAAKmkB,iBACH3iB,EAAMxB,EAAKS,cAAc2jB,gBAAiBrhB,IAI7CvB,EAAIwF,MAAQA,GAAS,GAGL,UAATjE,GAAoBiE,IAAUhH,EAAK0N,aAAc3K,GACvDiE,EACA9K,IAGHS,EAAO4U,KAAK1C,WAAW7N,GAAKrE,EAAO4U,KAAK1C,WAAW9L,KAAOpG,EAAO4U,KAAK1C,WAAWwV,OAEhF,SAAUrkB,EAAM+C,EAAMsG,GACrB,GAAI7H,EACJ,OAAO6H,GACNnN,GACCsF,EAAMxB,EAAKqQ,iBAAkBtN,KAAyB,KAAdvB,EAAIwF,MAC5CxF,EAAIwF,MACJ,MAEJrK,EAAOwmB,SAAShO,QACf/T,IAAK,SAAUpB,EAAM+C,GACpB,GAAIvB,GAAMxB,EAAKqQ,iBAAkBtN,EACjC,OAAOvB,IAAOA,EAAIkQ,UACjBlQ,EAAIwF,MACJ9K,GAEFknB,IAAKtB,EAASsB,KAKfzmB,EAAO8mB,UAAUa,iBAChBlB,IAAK,SAAUpjB,EAAMgH,EAAOjE,GAC3B+e,EAASsB,IAAKpjB,EAAgB,KAAVgH,GAAe,EAAQA,EAAOjE,KAMpDpG,EAAO+E,MAAO,QAAS,UAAY,SAAUU,EAAGW,GAC/CpG,EAAO8mB,UAAW1gB,IACjBqgB,IAAK,SAAUpjB,EAAMgH,GACpB,MAAe,KAAVA,GACJhH,EAAK2N,aAAc5K,EAAM,QAClBiE,GAFR,OAYErK,EAAOmI,QAAQmY,gBAEpBtgB,EAAO+E,MAAO,OAAQ,OAAS,SAAUU,EAAGW,GAC3CpG,EAAOonB,UAAWhhB,IACjB3B,IAAK,SAAUpB,GACd,MAAOA,GAAK0N,aAAc3K,EAAM,OAM9BpG,EAAOmI,QAAQ4D,QACpB/L,EAAO8mB,UAAU/a,OAChBtH,IAAK,SAAUpB,GAId,MAAOA,GAAK0I,MAAMkU,SAAW1gB,GAE9BknB,IAAK,SAAUpjB,EAAMgH,GACpB,MAAShH,GAAK0I,MAAMkU,QAAU5V,EAAQ,MAOnCrK,EAAOmI,QAAQuY,cACpB1gB,EAAOonB,UAAUhP,UAChB3T,IAAK,SAAUpB,GACd,GAAI0P,GAAS1P,EAAKe,UAUlB,OARK2O,KACJA,EAAOsF,cAGFtF,EAAO3O,YACX2O,EAAO3O,WAAWiU,eAGb,QAKVrY,EAAO+E,MACN,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACF/E,EAAO8lB,QAASxiB,KAAK8G,eAAkB9G,OAIlCtD,EAAOmI,QAAQwY,UACpB3gB,EAAO8lB,QAAQnF,QAAU,YAI1B3gB,EAAO+E,MAAO,QAAS,YAAc,WACpC/E,EAAOwmB,SAAUljB,OAChBmjB,IAAK,SAAUpjB,EAAMgH,GACpB,MAAKrK,GAAOyG,QAAS4D,GACXhH,EAAK8U,QAAUnY,EAAO2K,QAAS3K,EAAOqD,GAAMyR,MAAOzK,IAAW,EADxE,IAKIrK,EAAOmI,QAAQsY,UACpBzgB,EAAOwmB,SAAUljB,MAAOmB,IAAM,SAAUpB,GAGvC,MAAsC,QAA/BA,EAAK0N,aAAa,SAAoB,KAAO1N,EAAKgH,SAI5D,IAAIud,GAAa,+BAChBC,GAAY,OACZC,GAAc,+BACdC,GAAc,kCACdC,GAAiB,sBAElB,SAASC,MACR,OAAO,EAGR,QAASC,MACR,OAAO,EAGR,QAASC,MACR,IACC,MAAOvoB,GAASiY,cACf,MAAQuQ,KAOXpoB,EAAOyC,OAEN4lB,UAEAzK,IAAK,SAAUva,EAAMilB,EAAOrW,EAASxJ,EAAMrH,GAC1C,GAAImI,GAAKgf,EAAQC,EAAGC,EACnBC,EAASC,EAAaC,EACtBC,EAAUlmB,EAAMmmB,EAAYC,EAC5BC,EAAWhpB,EAAO+jB,MAAO1gB,EAG1B,IAAM2lB,EAAN,CAKK/W,EAAQA,UACZwW,EAAcxW,EACdA,EAAUwW,EAAYxW,QACtB7Q,EAAWqnB,EAAYrnB,UAIlB6Q,EAAQ9G,OACb8G,EAAQ9G,KAAOnL,EAAOmL,SAIhBod,EAASS,EAAST,UACxBA,EAASS,EAAST,YAEZI,EAAcK,EAASC,UAC7BN,EAAcK,EAASC,OAAS,SAAU/gB,GAGzC,aAAclI,KAAWN,GAAuBwI,GAAKlI,EAAOyC,MAAMymB,YAAchhB,EAAEvF,KAEjFpD,EADAS,EAAOyC,MAAM0mB,SAAS/jB,MAAOujB,EAAYtlB,KAAMgC,YAIjDsjB,EAAYtlB,KAAOA,GAIpBilB,GAAUA,GAAS,IAAKllB,MAAO1B,KAAqB,IACpD8mB,EAAIF,EAAM9kB,MACV,OAAQglB,IACPjf,EAAMye,GAAevkB,KAAM6kB,EAAME,QACjC7lB,EAAOomB,EAAWxf,EAAI,GACtBuf,GAAevf,EAAI,IAAM,IAAK+C,MAAO,KAAMxG,OAGrCnD,IAKN+lB,EAAU1oB,EAAOyC,MAAMimB,QAAS/lB,OAGhCA,GAASvB,EAAWsnB,EAAQU,aAAeV,EAAQW,WAAc1mB,EAGjE+lB,EAAU1oB,EAAOyC,MAAMimB,QAAS/lB,OAGhCimB,EAAY5oB,EAAOgG,QAClBrD,KAAMA,EACNomB,SAAUA,EACVtgB,KAAMA,EACNwJ,QAASA,EACT9G,KAAM8G,EAAQ9G,KACd/J,SAAUA,EACVoO,aAAcpO,GAAYpB,EAAO4U,KAAKxR,MAAMoM,aAAazL,KAAM3C,GAC/DkoB,UAAWR,EAAW5X,KAAK,MACzBuX,IAGII,EAAWN,EAAQ5lB,MACzBkmB,EAAWN,EAAQ5lB,MACnBkmB,EAASU,cAAgB,EAGnBb,EAAQc,OAASd,EAAQc,MAAMhlB,KAAMnB,EAAMoF,EAAMqgB,EAAYH,MAAkB,IAE/EtlB,EAAKX,iBACTW,EAAKX,iBAAkBC,EAAMgmB,GAAa,GAE/BtlB,EAAK4I,aAChB5I,EAAK4I,YAAa,KAAOtJ,EAAMgmB,KAK7BD,EAAQ9K,MACZ8K,EAAQ9K,IAAIpZ,KAAMnB,EAAMulB,GAElBA,EAAU3W,QAAQ9G,OACvByd,EAAU3W,QAAQ9G,KAAO8G,EAAQ9G,OAK9B/J,EACJynB,EAAS9iB,OAAQ8iB,EAASU,gBAAiB,EAAGX,GAE9CC,EAASpoB,KAAMmoB,GAIhB5oB,EAAOyC,MAAM4lB,OAAQ1lB,IAAS,EAI/BU,GAAO,OAIR0F,OAAQ,SAAU1F,EAAMilB,EAAOrW,EAAS7Q,EAAUqoB,GACjD,GAAI9jB,GAAGijB,EAAWrf,EACjBmgB,EAAWlB,EAAGD,EACdG,EAASG,EAAUlmB,EACnBmmB,EAAYC,EACZC,EAAWhpB,EAAO6jB,QAASxgB,IAAUrD,EAAO+jB,MAAO1gB,EAEpD,IAAM2lB,IAAcT,EAASS,EAAST,QAAtC,CAKAD,GAAUA,GAAS,IAAKllB,MAAO1B,KAAqB,IACpD8mB,EAAIF,EAAM9kB,MACV,OAAQglB,IAMP,GALAjf,EAAMye,GAAevkB,KAAM6kB,EAAME,QACjC7lB,EAAOomB,EAAWxf,EAAI,GACtBuf,GAAevf,EAAI,IAAM,IAAK+C,MAAO,KAAMxG,OAGrCnD,EAAN,CAOA+lB,EAAU1oB,EAAOyC,MAAMimB,QAAS/lB,OAChCA,GAASvB,EAAWsnB,EAAQU,aAAeV,EAAQW,WAAc1mB,EACjEkmB,EAAWN,EAAQ5lB,OACnB4G,EAAMA,EAAI,IAAUkF,OAAQ,UAAYqa,EAAW5X,KAAK,iBAAmB,WAG3EwY,EAAY/jB,EAAIkjB,EAASrlB,MACzB,OAAQmC,IACPijB,EAAYC,EAAUljB,IAEf8jB,GAAeV,IAAaH,EAAUG,UACzC9W,GAAWA,EAAQ9G,OAASyd,EAAUzd,MACtC5B,IAAOA,EAAIxF,KAAM6kB,EAAUU,YAC3BloB,GAAYA,IAAawnB,EAAUxnB,WAAyB,OAAbA,IAAqBwnB,EAAUxnB,YACjFynB,EAAS9iB,OAAQJ,EAAG,GAEfijB,EAAUxnB,UACdynB,EAASU,gBAELb,EAAQ3f,QACZ2f,EAAQ3f,OAAOvE,KAAMnB,EAAMulB,GAOzBc,KAAcb,EAASrlB,SACrBklB,EAAQiB,UAAYjB,EAAQiB,SAASnlB,KAAMnB,EAAMylB,EAAYE,EAASC,WAAa,GACxFjpB,EAAO4pB,YAAavmB,EAAMV,EAAMqmB,EAASC,cAGnCV,GAAQ5lB,QAtCf,KAAMA,IAAQ4lB,GACbvoB,EAAOyC,MAAMsG,OAAQ1F,EAAMV,EAAO2lB,EAAOE,GAAKvW,EAAS7Q,GAAU,EA0C/DpB,GAAOqI,cAAekgB,WACnBS,GAASC,OAIhBjpB,EAAOgkB,YAAa3gB,EAAM,aAI5BkE,QAAS,SAAU9E,EAAOgG,EAAMpF,EAAMwmB,GACrC,GAAIZ,GAAQa,EAAQ1X,EACnB2X,EAAYrB,EAASnf,EAAK9D,EAC1BukB,GAAc3mB,GAAQzD,GACtB+C,EAAO3B,EAAYwD,KAAM/B,EAAO,QAAWA,EAAME,KAAOF,EACxDqmB,EAAa9nB,EAAYwD,KAAM/B,EAAO,aAAgBA,EAAM6mB,UAAUhd,MAAM,OAK7E,IAHA8F,EAAM7I,EAAMlG,EAAOA,GAAQzD,EAGJ,IAAlByD,EAAKQ,UAAoC,IAAlBR,EAAKQ,WAK5BkkB,GAAYhkB,KAAMpB,EAAO3C,EAAOyC,MAAMymB,aAItCvmB,EAAK9B,QAAQ,MAAQ,IAEzBioB,EAAanmB,EAAK2J,MAAM,KACxB3J,EAAOmmB,EAAWpX,QAClBoX,EAAWhjB,QAEZgkB,EAA6B,EAApBnnB,EAAK9B,QAAQ,MAAY,KAAO8B,EAGzCF,EAAQA,EAAOzC,EAAO0G,SACrBjE,EACA,GAAIzC,GAAOiqB,MAAOtnB,EAAuB,gBAAVF,IAAsBA,GAGtDA,EAAMynB,UAAYL,EAAe,EAAI,EACrCpnB,EAAM6mB,UAAYR,EAAW5X,KAAK,KAClCzO,EAAM0nB,aAAe1nB,EAAM6mB,UACtB7a,OAAQ,UAAYqa,EAAW5X,KAAK,iBAAmB,WAC3D,KAGDzO,EAAM4T,OAAS9W,EACTkD,EAAM8D,SACX9D,EAAM8D,OAASlD,GAIhBoF,EAAe,MAARA,GACJhG,GACFzC,EAAOsE,UAAWmE,GAAQhG,IAG3BimB,EAAU1oB,EAAOyC,MAAMimB,QAAS/lB,OAC1BknB,IAAgBnB,EAAQnhB,SAAWmhB,EAAQnhB,QAAQnC,MAAO/B,EAAMoF,MAAW,GAAjF,CAMA,IAAMohB,IAAiBnB,EAAQ0B,WAAapqB,EAAO2H,SAAUtE,GAAS,CAMrE,IAJA0mB,EAAarB,EAAQU,cAAgBzmB,EAC/BolB,GAAYhkB,KAAMgmB,EAAapnB,KACpCyP,EAAMA,EAAIhO,YAEHgO,EAAKA,EAAMA,EAAIhO,WACtB4lB,EAAUvpB,KAAM2R,GAChB7I,EAAM6I,CAIF7I,MAASlG,EAAKS,eAAiBlE,IACnCoqB,EAAUvpB,KAAM8I,EAAIyJ,aAAezJ,EAAI8gB,cAAgB/qB,GAKzDmG,EAAI,CACJ,QAAS2M,EAAM4X,EAAUvkB,QAAUhD,EAAM6nB,uBAExC7nB,EAAME,KAAO8C,EAAI,EAChBskB,EACArB,EAAQW,UAAY1mB,EAGrBsmB,GAAWjpB,EAAO+jB,MAAO3R,EAAK,eAAoB3P,EAAME,OAAU3C,EAAO+jB,MAAO3R,EAAK,UAChF6W,GACJA,EAAO7jB,MAAOgN,EAAK3J,GAIpBwgB,EAASa,GAAU1X,EAAK0X,GACnBb,GAAUjpB,EAAOkjB,WAAY9Q,IAAS6W,EAAO7jB,OAAS6jB,EAAO7jB,MAAOgN,EAAK3J,MAAW,GACxFhG,EAAM8nB,gBAMR,IAHA9nB,EAAME,KAAOA,GAGPknB,IAAiBpnB,EAAM+nB,wBAErB9B,EAAQ+B,UAAY/B,EAAQ+B,SAASrlB,MAAO4kB,EAAU/b,MAAOxF,MAAW,IAC9EzI,EAAOkjB,WAAY7f,IAKdymB,GAAUzmB,EAAMV,KAAW3C,EAAO2H,SAAUtE,GAAS,CAGzDkG,EAAMlG,EAAMymB,GAEPvgB,IACJlG,EAAMymB,GAAW,MAIlB9pB,EAAOyC,MAAMymB,UAAYvmB,CACzB,KACCU,EAAMV,KACL,MAAQuF,IAIVlI,EAAOyC,MAAMymB,UAAY3pB,EAEpBgK,IACJlG,EAAMymB,GAAWvgB,GAMrB,MAAO9G,GAAM4T,SAGd8S,SAAU,SAAU1mB,GAGnBA,EAAQzC,EAAOyC,MAAMioB,IAAKjoB,EAE1B,IAAIgD,GAAGZ,EAAK+jB,EAAW1R,EAASvR,EAC/BglB,KACA1lB,EAAOvE,EAAW8D,KAAMa,WACxBwjB,GAAa7oB,EAAO+jB,MAAOzgB,KAAM,eAAoBb,EAAME,UAC3D+lB,EAAU1oB,EAAOyC,MAAMimB,QAASjmB,EAAME,SAOvC,IAJAsC,EAAK,GAAKxC,EACVA,EAAMmoB,eAAiBtnB,MAGlBolB,EAAQmC,aAAenC,EAAQmC,YAAYrmB,KAAMlB,KAAMb,MAAY,EAAxE,CAKAkoB,EAAe3qB,EAAOyC,MAAMomB,SAASrkB,KAAMlB,KAAMb,EAAOomB,GAGxDpjB,EAAI,CACJ,QAASyR,EAAUyT,EAAcllB,QAAWhD,EAAM6nB,uBAAyB,CAC1E7nB,EAAMqoB,cAAgB5T,EAAQ7T,KAE9BsC,EAAI,CACJ,QAASijB,EAAY1R,EAAQ2R,SAAUljB,QAAWlD,EAAMsoB,kCAIjDtoB,EAAM0nB,cAAgB1nB,EAAM0nB,aAAapmB,KAAM6kB,EAAUU,cAE9D7mB,EAAMmmB,UAAYA,EAClBnmB,EAAMgG,KAAOmgB,EAAUngB,KAEvB5D,IAAS7E,EAAOyC,MAAMimB,QAASE,EAAUG,eAAkBE,QAAUL,EAAU3W,SAC5E7M,MAAO8R,EAAQ7T,KAAM4B,GAEnBJ,IAAQtF,IACNkD,EAAM4T,OAASxR,MAAS,IAC7BpC,EAAM8nB,iBACN9nB,EAAMuoB,oBAYX,MAJKtC,GAAQuC,cACZvC,EAAQuC,aAAazmB,KAAMlB,KAAMb,GAG3BA,EAAM4T,SAGdwS,SAAU,SAAUpmB,EAAOomB,GAC1B,GAAIqC,GAAKtC,EAAW1b,EAASzH,EAC5BklB,KACApB,EAAgBV,EAASU,cACzBnX,EAAM3P,EAAM8D,MAKb,IAAKgjB,GAAiBnX,EAAIvO,YAAcpB,EAAM+V,QAAyB,UAAf/V,EAAME,MAG7D,KAAQyP,GAAO9O,KAAM8O,EAAMA,EAAIhO,YAAcd,KAK5C,GAAsB,IAAjB8O,EAAIvO,WAAmBuO,EAAI8F,YAAa,GAAuB,UAAfzV,EAAME,MAAoB,CAE9E,IADAuK,KACMzH,EAAI,EAAO8jB,EAAJ9jB,EAAmBA,IAC/BmjB,EAAYC,EAAUpjB,GAGtBylB,EAAMtC,EAAUxnB,SAAW,IAEtB8L,EAASge,KAAU3rB,IACvB2N,EAASge,GAAQtC,EAAUpZ,aAC1BxP,EAAQkrB,EAAK5nB,MAAOua,MAAOzL,IAAS,EACpCpS,EAAO0D,KAAMwnB,EAAK5nB,KAAM,MAAQ8O,IAAQ5O,QAErC0J,EAASge,IACbhe,EAAQzM,KAAMmoB,EAGX1b,GAAQ1J,QACZmnB,EAAalqB,MAAO4C,KAAM+O,EAAKyW,SAAU3b,IAW7C,MAJqB2b,GAASrlB,OAAzB+lB,GACJoB,EAAalqB,MAAO4C,KAAMC,KAAMulB,SAAUA,EAASloB,MAAO4oB,KAGpDoB,GAGRD,IAAK,SAAUjoB,GACd,GAAKA,EAAOzC,EAAO0G,SAClB,MAAOjE,EAIR,IAAIgD,GAAGmgB,EAAMzf,EACZxD,EAAOF,EAAME,KACbwoB,EAAgB1oB,EAChB2oB,EAAU9nB,KAAK+nB,SAAU1oB,EAEpByoB,KACL9nB,KAAK+nB,SAAU1oB,GAASyoB,EACvBtD,GAAY/jB,KAAMpB,GAASW,KAAKgoB,WAChCzD,GAAU9jB,KAAMpB,GAASW,KAAKioB,aAGhCplB,EAAOilB,EAAQI,MAAQloB,KAAKkoB,MAAMjrB,OAAQ6qB,EAAQI,OAAUloB,KAAKkoB,MAEjE/oB,EAAQ,GAAIzC,GAAOiqB,MAAOkB,GAE1B1lB,EAAIU,EAAK3C,MACT,OAAQiC,IACPmgB,EAAOzf,EAAMV,GACbhD,EAAOmjB,GAASuF,EAAevF,EAmBhC,OAdMnjB,GAAM8D,SACX9D,EAAM8D,OAAS4kB,EAAcM,YAAc7rB,GAKb,IAA1B6C,EAAM8D,OAAO1C,WACjBpB,EAAM8D,OAAS9D,EAAM8D,OAAOnC,YAK7B3B,EAAMipB,UAAYjpB,EAAMipB,QAEjBN,EAAQ5X,OAAS4X,EAAQ5X,OAAQ/Q,EAAO0oB,GAAkB1oB,GAIlE+oB,MAAO,wHAAwHlf,MAAM,KAErI+e,YAEAE,UACCC,MAAO,4BAA4Blf,MAAM,KACzCkH,OAAQ,SAAU/Q,EAAOkpB,GAOxB,MAJoB,OAAflpB,EAAMmpB,QACVnpB,EAAMmpB,MAA6B,MAArBD,EAASE,SAAmBF,EAASE,SAAWF,EAASG,SAGjErpB,IAIT6oB,YACCE,MAAO,mGAAmGlf,MAAM,KAChHkH,OAAQ,SAAU/Q,EAAOkpB,GACxB,GAAIvkB,GAAM2kB,EAAUjZ,EACnB0F,EAASmT,EAASnT,OAClBwT,EAAcL,EAASK,WAuBxB,OApBoB,OAAfvpB,EAAMwpB,OAAqC,MAApBN,EAASO,UACpCH,EAAWtpB,EAAM8D,OAAOzC,eAAiBlE,EACzCkT,EAAMiZ,EAASjsB,gBACfsH,EAAO2kB,EAAS3kB,KAEhB3E,EAAMwpB,MAAQN,EAASO,SAAYpZ,GAAOA,EAAIqZ,YAAc/kB,GAAQA,EAAK+kB,YAAc,IAAQrZ,GAAOA,EAAIsZ,YAAchlB,GAAQA,EAAKglB,YAAc,GACnJ3pB,EAAM4pB,MAAQV,EAASW,SAAYxZ,GAAOA,EAAIyZ,WAAcnlB,GAAQA,EAAKmlB,WAAc,IAAQzZ,GAAOA,EAAI0Z,WAAcplB,GAAQA,EAAKolB,WAAc,KAI9I/pB,EAAMgqB,eAAiBT,IAC5BvpB,EAAMgqB,cAAgBT,IAAgBvpB,EAAM8D,OAASolB,EAASe,UAAYV,GAKrEvpB,EAAMmpB,OAASpT,IAAWjZ,IAC/BkD,EAAMmpB,MAAmB,EAATpT,EAAa,EAAe,EAATA,EAAa,EAAe,EAATA,EAAa,EAAI,GAGjE/V,IAITimB,SACCiE,MAECvC,UAAU,GAEXxS,OAECrQ,QAAS,WACR,GAAKjE,OAAS6kB,MAAuB7kB,KAAKsU,MACzC,IAEC,MADAtU,MAAKsU,SACE,EACN,MAAQ1P,MAOZkhB,aAAc,WAEfwD,MACCrlB,QAAS,WACR,MAAKjE,QAAS6kB,MAAuB7kB,KAAKspB,MACzCtpB,KAAKspB,QACE,GAFR,GAKDxD,aAAc,YAEfxH,OAECra,QAAS,WACR,MAAKvH,GAAOmK,SAAU7G,KAAM,UAA2B,aAAdA,KAAKX,MAAuBW,KAAKse,OACzEte,KAAKse,SACE,GAFR,GAOD6I,SAAU,SAAUhoB,GACnB,MAAOzC,GAAOmK,SAAU1H,EAAM8D,OAAQ,OAIxCsmB,cACC5B,aAAc,SAAUxoB,GAGlBA,EAAM4T,SAAW9W,IACrBkD,EAAM0oB,cAAc2B,YAAcrqB,EAAM4T,WAM5C0W,SAAU,SAAUpqB,EAAMU,EAAMZ,EAAOuqB,GAItC,GAAI9kB,GAAIlI,EAAOgG,OACd,GAAIhG,GAAOiqB,MACXxnB,GAECE,KAAMA,EACNsqB,aAAa,EACb9B,kBAGG6B,GACJhtB,EAAOyC,MAAM8E,QAASW,EAAG,KAAM7E,GAE/BrD,EAAOyC,MAAM0mB,SAAS3kB,KAAMnB,EAAM6E,GAE9BA,EAAEsiB,sBACN/nB,EAAM8nB,mBAKTvqB,EAAO4pB,YAAchqB,EAASmD,oBAC7B,SAAUM,EAAMV,EAAMsmB,GAChB5lB,EAAKN,qBACTM,EAAKN,oBAAqBJ,EAAMsmB,GAAQ,IAG1C,SAAU5lB,EAAMV,EAAMsmB,GACrB,GAAI7iB,GAAO,KAAOzD,CAEbU,GAAKL,oBAIGK,GAAM+C,KAAW1G,IAC5B2D,EAAM+C,GAAS,MAGhB/C,EAAKL,YAAaoD,EAAM6iB,KAI3BjpB,EAAOiqB,MAAQ,SAAUhkB,EAAKulB,GAE7B,MAAOloB,gBAAgBtD,GAAOiqB,OAKzBhkB,GAAOA,EAAItD,MACfW,KAAK6nB,cAAgBllB,EACrB3C,KAAKX,KAAOsD,EAAItD,KAIhBW,KAAKknB,mBAAuBvkB,EAAIinB,kBAAoBjnB,EAAI6mB,eAAgB,GACvE7mB,EAAIknB,mBAAqBlnB,EAAIknB,oBAAwBlF,GAAaC,IAInE5kB,KAAKX,KAAOsD,EAIRulB,GACJxrB,EAAOgG,OAAQ1C,KAAMkoB,GAItBloB,KAAK8pB,UAAYnnB,GAAOA,EAAImnB,WAAaptB,EAAO0L,MAGhDpI,KAAMtD,EAAO0G,UAAY,EAvBzB,GAJQ,GAAI1G,GAAOiqB,MAAOhkB,EAAKulB,IAgChCxrB,EAAOiqB,MAAMhnB,WACZunB,mBAAoBtC,GACpBoC,qBAAsBpC,GACtB6C,8BAA+B7C,GAE/BqC,eAAgB,WACf,GAAIriB,GAAI5E,KAAK6nB,aAEb7nB,MAAKknB,mBAAqBvC,GACpB/f,IAKDA,EAAEqiB,eACNriB,EAAEqiB,iBAKFriB,EAAE4kB,aAAc,IAGlB9B,gBAAiB,WAChB,GAAI9iB,GAAI5E,KAAK6nB,aAEb7nB,MAAKgnB,qBAAuBrC,GACtB/f,IAIDA,EAAE8iB,iBACN9iB,EAAE8iB,kBAKH9iB,EAAEmlB,cAAe,IAElBC,yBAA0B,WACzBhqB,KAAKynB,8BAAgC9C,GACrC3kB,KAAK0nB,oBAKPhrB,EAAO+E,MACNwoB,WAAY,YACZC,WAAY,YACV,SAAUC,EAAM/C,GAClB1qB,EAAOyC,MAAMimB,QAAS+E,IACrBrE,aAAcsB,EACdrB,SAAUqB,EAEVzB,OAAQ,SAAUxmB,GACjB,GAAIoC,GACH0B,EAASjD,KACToqB,EAAUjrB,EAAMgqB,cAChB7D,EAAYnmB,EAAMmmB,SASnB,SALM8E,GAAYA,IAAYnnB,IAAWvG,EAAOmN,SAAU5G,EAAQmnB,MACjEjrB,EAAME,KAAOimB,EAAUG,SACvBlkB,EAAM+jB,EAAU3W,QAAQ7M,MAAO9B,KAAM+B,WACrC5C,EAAME,KAAO+nB,GAEP7lB,MAMJ7E,EAAOmI,QAAQwlB,gBAEpB3tB,EAAOyC,MAAMimB,QAAQxP,QACpBsQ,MAAO,WAEN,MAAKxpB,GAAOmK,SAAU7G,KAAM,SACpB,GAIRtD,EAAOyC,MAAMmb,IAAKta,KAAM,iCAAkC,SAAU4E,GAEnE,GAAI7E,GAAO6E,EAAE3B,OACZqnB,EAAO5tB,EAAOmK,SAAU9G,EAAM,UAAarD,EAAOmK,SAAU9G,EAAM,UAAaA,EAAKuqB,KAAOruB,CACvFquB,KAAS5tB,EAAO+jB,MAAO6J,EAAM,mBACjC5tB,EAAOyC,MAAMmb,IAAKgQ,EAAM,iBAAkB,SAAUnrB,GACnDA,EAAMorB,gBAAiB,IAExB7tB,EAAO+jB,MAAO6J,EAAM,iBAAiB,MARvC5tB,IAcDirB,aAAc,SAAUxoB,GAElBA,EAAMorB,uBACHprB,GAAMorB,eACRvqB,KAAKc,aAAe3B,EAAMynB,WAC9BlqB,EAAOyC,MAAMsqB,SAAU,SAAUzpB,KAAKc,WAAY3B,GAAO,KAK5DknB,SAAU,WAET,MAAK3pB,GAAOmK,SAAU7G,KAAM,SACpB,GAIRtD,EAAOyC,MAAMsG,OAAQzF,KAAM,YAA3BtD,MAMGA,EAAOmI,QAAQ2lB,gBAEpB9tB,EAAOyC,MAAMimB,QAAQ7G,QAEpB2H,MAAO,WAEN,MAAK5B,GAAW7jB,KAAMT,KAAK6G,YAIP,aAAd7G,KAAKX,MAAqC,UAAdW,KAAKX,QACrC3C,EAAOyC,MAAMmb,IAAKta,KAAM,yBAA0B,SAAUb,GACjB,YAArCA,EAAM0oB,cAAc4C,eACxBzqB,KAAK0qB,eAAgB,KAGvBhuB,EAAOyC,MAAMmb,IAAKta,KAAM,gBAAiB,SAAUb,GAC7Ca,KAAK0qB,gBAAkBvrB,EAAMynB,YACjC5mB,KAAK0qB,eAAgB,GAGtBhuB,EAAOyC,MAAMsqB,SAAU,SAAUzpB,KAAMb,GAAO,OAGzC,IAGRzC,EAAOyC,MAAMmb,IAAKta,KAAM,yBAA0B,SAAU4E,GAC3D,GAAI7E,GAAO6E,EAAE3B,MAERqhB,GAAW7jB,KAAMV,EAAK8G,YAAenK,EAAO+jB,MAAO1gB,EAAM,mBAC7DrD,EAAOyC,MAAMmb,IAAKva,EAAM,iBAAkB,SAAUZ,IAC9Ca,KAAKc,YAAe3B,EAAMwqB,aAAgBxqB,EAAMynB,WACpDlqB,EAAOyC,MAAMsqB,SAAU,SAAUzpB,KAAKc,WAAY3B,GAAO,KAG3DzC,EAAO+jB,MAAO1gB,EAAM,iBAAiB,MATvCrD,IAcDipB,OAAQ,SAAUxmB,GACjB,GAAIY,GAAOZ,EAAM8D,MAGjB,OAAKjD,QAASD,GAAQZ,EAAMwqB,aAAexqB,EAAMynB,WAA4B,UAAd7mB,EAAKV,MAAkC,aAAdU,EAAKV,KACrFF,EAAMmmB,UAAU3W,QAAQ7M,MAAO9B,KAAM+B,WAD7C,GAKDskB,SAAU,WAGT,MAFA3pB,GAAOyC,MAAMsG,OAAQzF,KAAM,aAEnBskB,EAAW7jB,KAAMT,KAAK6G,aAM3BnK,EAAOmI,QAAQ8lB,gBACpBjuB,EAAO+E,MAAO6S,MAAO,UAAWgV,KAAM,YAAc,SAAUa,EAAM/C,GAGnE,GAAIwD,GAAW,EACdjc,EAAU,SAAUxP,GACnBzC,EAAOyC,MAAMsqB,SAAUrC,EAAKjoB,EAAM8D,OAAQvG,EAAOyC,MAAMioB,IAAKjoB,IAAS,GAGvEzC,GAAOyC,MAAMimB,QAASgC,IACrBlB,MAAO,WACc,IAAf0E,KACJtuB,EAAS8C,iBAAkB+qB,EAAMxb,GAAS,IAG5C0X,SAAU,WACW,MAAbuE,GACNtuB,EAASmD,oBAAqB0qB,EAAMxb,GAAS,OAOlDjS,EAAOsB,GAAG0E,QAETmoB,GAAI,SAAU7F,EAAOlnB,EAAUqH,EAAMnH,EAAiBqlB,GACrD,GAAIhkB,GAAMyrB,CAGV,IAAsB,gBAAV9F,GAAqB,CAEP,gBAAblnB,KAEXqH,EAAOA,GAAQrH,EACfA,EAAW7B,EAEZ,KAAMoD,IAAQ2lB,GACbhlB,KAAK6qB,GAAIxrB,EAAMvB,EAAUqH,EAAM6f,EAAO3lB,GAAQgkB,EAE/C,OAAOrjB,MAmBR,GAhBa,MAARmF,GAAsB,MAANnH,GAEpBA,EAAKF,EACLqH,EAAOrH,EAAW7B,GACD,MAAN+B,IACc,gBAAbF,IAEXE,EAAKmH,EACLA,EAAOlJ,IAGP+B,EAAKmH,EACLA,EAAOrH,EACPA,EAAW7B,IAGR+B,KAAO,EACXA,EAAK4mB,OACC,KAAM5mB,EACZ,MAAOgC,KAaR,OAVa,KAARqjB,IACJyH,EAAS9sB,EACTA,EAAK,SAAUmB,GAGd,MADAzC,KAASwH,IAAK/E,GACP2rB,EAAOhpB,MAAO9B,KAAM+B,YAG5B/D,EAAG6J,KAAOijB,EAAOjjB,OAAUijB,EAAOjjB,KAAOnL,EAAOmL,SAE1C7H,KAAKyB,KAAM,WACjB/E,EAAOyC,MAAMmb,IAAKta,KAAMglB,EAAOhnB,EAAImH,EAAMrH,MAG3CulB,IAAK,SAAU2B,EAAOlnB,EAAUqH,EAAMnH,GACrC,MAAOgC,MAAK6qB,GAAI7F,EAAOlnB,EAAUqH,EAAMnH,EAAI,IAE5CkG,IAAK,SAAU8gB,EAAOlnB,EAAUE,GAC/B,GAAIsnB,GAAWjmB,CACf,IAAK2lB,GAASA,EAAMiC,gBAAkBjC,EAAMM,UAQ3C,MANAA,GAAYN,EAAMM,UAClB5oB,EAAQsoB,EAAMsC,gBAAiBpjB,IAC9BohB,EAAUU,UAAYV,EAAUG,SAAW,IAAMH,EAAUU,UAAYV,EAAUG,SACjFH,EAAUxnB,SACVwnB,EAAU3W,SAEJ3O,IAER,IAAsB,gBAAVglB,GAAqB,CAEhC,IAAM3lB,IAAQ2lB,GACbhlB,KAAKkE,IAAK7E,EAAMvB,EAAUknB,EAAO3lB,GAElC,OAAOW,MAUR,OARKlC,KAAa,GAA6B,kBAAbA,MAEjCE,EAAKF,EACLA,EAAW7B,GAEP+B,KAAO,IACXA,EAAK4mB,IAEC5kB,KAAKyB,KAAK,WAChB/E,EAAOyC,MAAMsG,OAAQzF,KAAMglB,EAAOhnB,EAAIF,MAIxCmG,QAAS,SAAU5E,EAAM8F,GACxB,MAAOnF,MAAKyB,KAAK,WAChB/E,EAAOyC,MAAM8E,QAAS5E,EAAM8F,EAAMnF,SAGpC+qB,eAAgB,SAAU1rB,EAAM8F,GAC/B,GAAIpF,GAAOC,KAAK,EAChB,OAAKD,GACGrD,EAAOyC,MAAM8E,QAAS5E,EAAM8F,EAAMpF,GAAM,GADhD,IAKF,IAAIirB,IAAW,iBACdC,GAAe,iCACfC,GAAgBxuB,EAAO4U,KAAKxR,MAAMoM,aAElCif,IACCC,UAAU,EACVC,UAAU,EACVpK,MAAM,EACNqK,MAAM,EAGR5uB,GAAOsB,GAAG0E,QACTtC,KAAM,SAAUtC,GACf,GAAIqE,GACHZ,KACA6Y,EAAOpa,KACPoC,EAAMgY,EAAKla,MAEZ,IAAyB,gBAAbpC,GACX,MAAOkC,MAAKqB,UAAW3E,EAAQoB,GAAWoS,OAAO,WAChD,IAAM/N,EAAI,EAAOC,EAAJD,EAASA,IACrB,GAAKzF,EAAOmN,SAAUuQ,EAAMjY,GAAKnC,MAChC,OAAO,IAMX,KAAMmC,EAAI,EAAOC,EAAJD,EAASA,IACrBzF,EAAO0D,KAAMtC,EAAUsc,EAAMjY,GAAKZ,EAMnC,OAFAA,GAAMvB,KAAKqB,UAAWe,EAAM,EAAI1F,EAAOwc,OAAQ3X,GAAQA,GACvDA,EAAIzD,SAAWkC,KAAKlC,SAAWkC,KAAKlC,SAAW,IAAMA,EAAWA,EACzDyD,GAGRyS,IAAK,SAAU/Q,GACd,GAAId,GACHopB,EAAU7uB,EAAQuG,EAAQjD,MAC1BoC,EAAMmpB,EAAQrrB,MAEf,OAAOF,MAAKkQ,OAAO,WAClB,IAAM/N,EAAI,EAAOC,EAAJD,EAASA,IACrB,GAAKzF,EAAOmN,SAAU7J,KAAMurB,EAAQppB,IACnC,OAAO,KAMX0R,IAAK,SAAU/V,GACd,MAAOkC,MAAKqB,UAAWmqB,GAAOxrB,KAAMlC,OAAgB,KAGrDoS,OAAQ,SAAUpS,GACjB,MAAOkC,MAAKqB,UAAWmqB,GAAOxrB,KAAMlC,OAAgB,KAGrD2tB,GAAI,SAAU3tB,GACb,QAAS0tB,GACRxrB,KAIoB,gBAAblC,IAAyBotB,GAAczqB,KAAM3C,GACnDpB,EAAQoB,GACRA,OACD,GACCoC,QAGHwrB,QAAS,SAAU1Z,EAAWjU,GAC7B,GAAI+Q,GACH3M,EAAI,EACJqF,EAAIxH,KAAKE,OACTqB,KACAoqB,EAAMT,GAAczqB,KAAMuR,IAAoC,gBAAdA,GAC/CtV,EAAQsV,EAAWjU,GAAWiC,KAAKjC,SACnC,CAEF,MAAYyJ,EAAJrF,EAAOA,IACd,IAAM2M,EAAM9O,KAAKmC,GAAI2M,GAAOA,IAAQ/Q,EAAS+Q,EAAMA,EAAIhO,WAEtD,GAAoB,GAAfgO,EAAIvO,WAAkBorB,EAC1BA,EAAIpR,MAAMzL,GAAO,GAGA,IAAjBA,EAAIvO,UACH7D,EAAO0D,KAAKmQ,gBAAgBzB,EAAKkD,IAAc,CAEhDlD,EAAMvN,EAAIpE,KAAM2R,EAChB,OAKH,MAAO9O,MAAKqB,UAAWE,EAAIrB,OAAS,EAAIxD,EAAOwc,OAAQ3X,GAAQA,IAKhEgZ,MAAO,SAAUxa,GAGhB,MAAMA,GAKe,gBAATA,GACJrD,EAAO2K,QAASrH,KAAK,GAAItD,EAAQqD,IAIlCrD,EAAO2K,QAEbtH,EAAKH,OAASG,EAAK,GAAKA,EAAMC,MAXrBA,KAAK,IAAMA,KAAK,GAAGc,WAAed,KAAKgC,QAAQ4pB,UAAU1rB,OAAS,IAc7Eoa,IAAK,SAAUxc,EAAUC,GACxB,GAAIolB,GAA0B,gBAAbrlB,GACfpB,EAAQoB,EAAUC,GAClBrB,EAAOsE,UAAWlD,GAAYA,EAASyC,UAAazC,GAAaA,GAClEiB,EAAMrC,EAAO2D,MAAOL,KAAKmB,MAAOgiB,EAEjC,OAAOnjB,MAAKqB,UAAW3E,EAAOwc,OAAOna,KAGtC8sB,QAAS,SAAU/tB,GAClB,MAAOkC,MAAKsa,IAAiB,MAAZxc,EAChBkC,KAAKwB,WAAaxB,KAAKwB,WAAW0O,OAAOpS,MAK5C,SAASguB,IAAShd,EAAKsD,GACtB,EACCtD,GAAMA,EAAKsD,SACFtD,GAAwB,IAAjBA,EAAIvO,SAErB,OAAOuO,GAGRpS,EAAO+E,MACNgO,OAAQ,SAAU1P,GACjB,GAAI0P,GAAS1P,EAAKe,UAClB,OAAO2O,IAA8B,KAApBA,EAAOlP,SAAkBkP,EAAS,MAEpDsc,QAAS,SAAUhsB,GAClB,MAAOrD,GAAO0V,IAAKrS,EAAM,eAE1BisB,aAAc,SAAUjsB,EAAMoC,EAAG8pB,GAChC,MAAOvvB,GAAO0V,IAAKrS,EAAM,aAAcksB,IAExChL,KAAM,SAAUlhB,GACf,MAAO+rB,IAAS/rB,EAAM,gBAEvBurB,KAAM,SAAUvrB,GACf,MAAO+rB,IAAS/rB,EAAM,oBAEvBmsB,QAAS,SAAUnsB,GAClB,MAAOrD,GAAO0V,IAAKrS,EAAM,gBAE1B6rB,QAAS,SAAU7rB,GAClB,MAAOrD,GAAO0V,IAAKrS,EAAM,oBAE1BosB,UAAW,SAAUpsB,EAAMoC,EAAG8pB,GAC7B,MAAOvvB,GAAO0V,IAAKrS,EAAM,cAAeksB,IAEzCG,UAAW,SAAUrsB,EAAMoC,EAAG8pB,GAC7B,MAAOvvB,GAAO0V,IAAKrS,EAAM,kBAAmBksB,IAE7CI,SAAU,SAAUtsB,GACnB,MAAOrD,GAAOovB,SAAW/rB,EAAKe,gBAAmBiP,WAAYhQ,IAE9DqrB,SAAU,SAAUrrB,GACnB,MAAOrD,GAAOovB,QAAS/rB,EAAKgQ,aAE7Bsb,SAAU,SAAUtrB,GACnB,MAAOrD,GAAOmK,SAAU9G,EAAM,UAC7BA,EAAKusB,iBAAmBvsB,EAAKwsB,cAAcjwB,SAC3CI,EAAO2D,SAAWN,EAAK2F,cAEvB,SAAU5C,EAAM9E,GAClBtB,EAAOsB,GAAI8E,GAAS,SAAUmpB,EAAOnuB,GACpC,GAAIyD,GAAM7E,EAAO4F,IAAKtC,KAAMhC,EAAIiuB,EAsBhC,OApB0B,UAArBnpB,EAAKzF,MAAO,MAChBS,EAAWmuB,GAGPnuB,GAAgC,gBAAbA,KACvByD,EAAM7E,EAAOwT,OAAQpS,EAAUyD,IAG3BvB,KAAKE,OAAS,IAEZirB,GAAkBroB,KACvBvB,EAAM7E,EAAOwc,OAAQ3X,IAIjB0pB,GAAaxqB,KAAMqC,KACvBvB,EAAMA,EAAIirB,YAILxsB,KAAKqB,UAAWE,MAIzB7E,EAAOgG,QACNwN,OAAQ,SAAUoB,EAAMhQ,EAAOuS,GAC9B,GAAI9T,GAAOuB,EAAO,EAMlB,OAJKuS,KACJvC,EAAO,QAAUA,EAAO,KAGD,IAAjBhQ,EAAMpB,QAAkC,IAAlBH,EAAKQ,SACjC7D,EAAO0D,KAAKmQ,gBAAiBxQ,EAAMuR,IAAWvR,MAC9CrD,EAAO0D,KAAKwJ,QAAS0H,EAAM5U,EAAO+K,KAAMnG,EAAO,SAAUvB,GACxD,MAAyB,KAAlBA,EAAKQ,aAIf6R,IAAK,SAAUrS,EAAMqS,EAAK6Z,GACzB,GAAIrY,MACH9E,EAAM/O,EAAMqS,EAEb,OAAQtD,GAAwB,IAAjBA,EAAIvO,WAAmB0rB,IAAUhwB,GAA8B,IAAjB6S,EAAIvO,WAAmB7D,EAAQoS,GAAM2c,GAAIQ,IAC/E,IAAjBnd,EAAIvO,UACRqT,EAAQzW,KAAM2R,GAEfA,EAAMA,EAAIsD,EAEX,OAAOwB,IAGRkY,QAAS,SAAUW,EAAG1sB,GACrB,GAAI2sB,KAEJ,MAAQD,EAAGA,EAAIA,EAAExd,YACI,IAAfwd,EAAElsB,UAAkBksB,IAAM1sB,GAC9B2sB,EAAEvvB,KAAMsvB,EAIV,OAAOC,KAKT,SAASlB,IAAQja,EAAUob,EAAW9Y,GACrC,GAAKnX,EAAOiE,WAAYgsB,GACvB,MAAOjwB,GAAO+K,KAAM8J,EAAU,SAAUxR,EAAMoC,GAE7C,QAASwqB,EAAUzrB,KAAMnB,EAAMoC,EAAGpC,KAAW8T,GAK/C,IAAK8Y,EAAUpsB,SACd,MAAO7D,GAAO+K,KAAM8J,EAAU,SAAUxR,GACvC,MAASA,KAAS4sB,IAAgB9Y,GAKpC,IAA0B,gBAAd8Y,GAAyB,CACpC,GAAK3B,GAASvqB,KAAMksB,GACnB,MAAOjwB,GAAOwT,OAAQyc,EAAWpb,EAAUsC,EAG5C8Y,GAAYjwB,EAAOwT,OAAQyc,EAAWpb,GAGvC,MAAO7U,GAAO+K,KAAM8J,EAAU,SAAUxR,GACvC,MAASrD,GAAO2K,QAAStH,EAAM4sB,IAAe,IAAQ9Y,IAGxD,QAAS+Y,IAAoBtwB,GAC5B,GAAIyd,GAAO8S,GAAU7jB,MAAO,KAC3B8jB,EAAWxwB,EAAS6hB,wBAErB,IAAK2O,EAASvnB,cACb,MAAQwU,EAAK7Z,OACZ4sB,EAASvnB,cACRwU,EAAKpP,MAIR,OAAOmiB,GAGR,GAAID,IAAY,6JAEfE,GAAgB,6BAChBC,GAAmB7hB,OAAO,OAAS0hB,GAAY,WAAY,KAC3DI,GAAqB,OACrBC,GAAY,0EACZC,GAAW,YACXC,GAAS,UACTC,GAAQ,YACRC,GAAe,0BACfC,GAA8B,wBAE9BC,GAAW,oCACXC,GAAc,4BACdC,GAAoB,cACpBC,GAAe,2CAGfC,IACCxK,QAAU,EAAG,+BAAgC,aAC7CyK,QAAU,EAAG,aAAc,eAC3BC,MAAQ,EAAG,QAAS,UACpBC,OAAS,EAAG,WAAY,aACxBC,OAAS,EAAG,UAAW,YACvBC,IAAM,EAAG,iBAAkB,oBAC3BC,KAAO,EAAG,mCAAoC,uBAC9CC,IAAM,EAAG,qBAAsB,yBAI/BhH,SAAUzqB,EAAOmI,QAAQkY,eAAkB,EAAG,GAAI,KAAS,EAAG,SAAU,WAEzEqR,GAAexB,GAAoBtwB,GACnC+xB,GAAcD,GAAaxe,YAAatT,EAASiJ,cAAc,OAEhEqoB,IAAQU,SAAWV,GAAQxK,OAC3BwK,GAAQ9Q,MAAQ8Q,GAAQW,MAAQX,GAAQY,SAAWZ,GAAQa,QAAUb,GAAQI,MAC7EJ,GAAQc,GAAKd,GAAQO,GAErBzxB,EAAOsB,GAAG0E,QACTuE,KAAM,SAAUF,GACf,MAAOrK,GAAOqL,OAAQ/H,KAAM,SAAU+G,GACrC,MAAOA,KAAU9K,EAChBS,EAAOuK,KAAMjH,MACbA,KAAKgV,QAAQ2Z,QAAU3uB,KAAK,IAAMA,KAAK,GAAGQ,eAAiBlE,GAAWsyB,eAAgB7nB,KACrF,KAAMA,EAAOhF,UAAU7B,SAG3ByuB,OAAQ,WACP,MAAO3uB,MAAK6uB,SAAU9sB,UAAW,SAAUhC,GAC1C,GAAuB,IAAlBC,KAAKO,UAAoC,KAAlBP,KAAKO,UAAqC,IAAlBP,KAAKO,SAAiB,CACzE,GAAI0C,GAAS6rB,GAAoB9uB,KAAMD,EACvCkD,GAAO2M,YAAa7P,OAKvBgvB,QAAS,WACR,MAAO/uB,MAAK6uB,SAAU9sB,UAAW,SAAUhC,GAC1C,GAAuB,IAAlBC,KAAKO,UAAoC,KAAlBP,KAAKO,UAAqC,IAAlBP,KAAKO,SAAiB,CACzE,GAAI0C,GAAS6rB,GAAoB9uB,KAAMD,EACvCkD,GAAO+rB,aAAcjvB,EAAMkD,EAAO8M,gBAKrCkf,OAAQ,WACP,MAAOjvB,MAAK6uB,SAAU9sB,UAAW,SAAUhC,GACrCC,KAAKc,YACTd,KAAKc,WAAWkuB,aAAcjvB,EAAMC,SAKvCkvB,MAAO,WACN,MAAOlvB,MAAK6uB,SAAU9sB,UAAW,SAAUhC,GACrCC,KAAKc,YACTd,KAAKc,WAAWkuB,aAAcjvB,EAAMC,KAAKiP,gBAM5CxJ,OAAQ,SAAU3H,EAAUqxB,GAC3B,GAAIpvB,GACHuB,EAAQxD,EAAWpB,EAAOwT,OAAQpS,EAAUkC,MAASA,KACrDmC,EAAI,CAEL,MAA6B,OAApBpC,EAAOuB,EAAMa,IAAaA,IAE5BgtB,GAA8B,IAAlBpvB,EAAKQ,UACtB7D,EAAOyjB,UAAWiP,GAAQrvB,IAGtBA,EAAKe,aACJquB,GAAYzyB,EAAOmN,SAAU9J,EAAKS,cAAeT,IACrDsvB,GAAeD,GAAQrvB,EAAM,WAE9BA,EAAKe,WAAW0N,YAAazO,GAI/B,OAAOC,OAGRgV,MAAO,WACN,GAAIjV,GACHoC,EAAI,CAEL,MAA4B,OAAnBpC,EAAOC,KAAKmC,IAAaA,IAAM,CAEhB,IAAlBpC,EAAKQ,UACT7D,EAAOyjB,UAAWiP,GAAQrvB,GAAM,GAIjC,OAAQA,EAAKgQ,WACZhQ,EAAKyO,YAAazO,EAAKgQ,WAKnBhQ,GAAKgD,SAAWrG,EAAOmK,SAAU9G,EAAM,YAC3CA,EAAKgD,QAAQ7C,OAAS,GAIxB,MAAOF,OAGRgD,MAAO,SAAUssB,EAAeC,GAI/B,MAHAD,GAAiC,MAAjBA,GAAwB,EAAQA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzDvvB,KAAKsC,IAAK,WAChB,MAAO5F,GAAOsG,MAAOhD,KAAMsvB,EAAeC,MAI5CC,KAAM,SAAUzoB,GACf,MAAOrK,GAAOqL,OAAQ/H,KAAM,SAAU+G,GACrC,GAAIhH,GAAOC,KAAK,OACfmC,EAAI,EACJqF,EAAIxH,KAAKE,MAEV,IAAK6G,IAAU9K,EACd,MAAyB,KAAlB8D,EAAKQ,SACXR,EAAK+P,UAAUvM,QAASwpB,GAAe,IACvC9wB,CAIF,MAAsB,gBAAV8K,IAAuBumB,GAAa7sB,KAAMsG,KACnDrK,EAAOmI,QAAQkY,eAAkBiQ,GAAavsB,KAAMsG,KACpDrK,EAAOmI,QAAQgY,mBAAsBoQ,GAAmBxsB,KAAMsG,IAC/D6mB,IAAWT,GAAShtB,KAAM4G,KAAY,GAAI,KAAM,GAAGD,gBAAkB,CAEtEC,EAAQA,EAAMxD,QAAS2pB,GAAW,YAElC,KACC,KAAW1lB,EAAJrF,EAAOA,IAEbpC,EAAOC,KAAKmC,OACW,IAAlBpC,EAAKQ,WACT7D,EAAOyjB,UAAWiP,GAAQrvB,GAAM,IAChCA,EAAK+P,UAAY/I,EAInBhH,GAAO,EAGN,MAAM6E,KAGJ7E,GACJC,KAAKgV,QAAQ2Z,OAAQ5nB,IAEpB,KAAMA,EAAOhF,UAAU7B,SAG3BuvB,YAAa,WACZ,GAEC9tB,GAAOjF,EAAO4F,IAAKtC,KAAM,SAAUD,GAClC,OAASA,EAAKkP,YAAalP,EAAKe,cAEjCqB,EAAI,CAmBL,OAhBAnC,MAAK6uB,SAAU9sB,UAAW,SAAUhC,GACnC,GAAIkhB,GAAOtf,EAAMQ,KAChBsN,EAAS9N,EAAMQ,IAEXsN,KAECwR,GAAQA,EAAKngB,aAAe2O,IAChCwR,EAAOjhB,KAAKiP,aAEbvS,EAAQsD,MAAOyF,SACfgK,EAAOuf,aAAcjvB,EAAMkhB,MAG1B,GAGI9e,EAAInC,KAAOA,KAAKyF,UAGxBlG,OAAQ,SAAUzB,GACjB,MAAOkC,MAAKyF,OAAQ3H,GAAU,IAG/B+wB,SAAU,SAAUltB,EAAMD,EAAUguB,GAGnC/tB,EAAO3E,EAAY8E,SAAWH,EAE9B,IAAIK,GAAOuN,EAAMogB,EAChBrqB,EAASkK,EAAK+M,EACdpa,EAAI,EACJqF,EAAIxH,KAAKE,OACTijB,EAAMnjB,KACN4vB,EAAWpoB,EAAI,EACfT,EAAQpF,EAAK,GACbhB,EAAajE,EAAOiE,WAAYoG,EAGjC,IAAKpG,KAAsB,GAAL6G,GAA2B,gBAAVT,IAAsBrK,EAAOmI,QAAQwZ,aAAemP,GAAS/sB,KAAMsG,GACzG,MAAO/G,MAAKyB,KAAK,SAAU8Y,GAC1B,GAAIH,GAAO+I,EAAIlhB,GAAIsY,EACd5Z,KACJgB,EAAK,GAAKoF,EAAM7F,KAAMlB,KAAMua,EAAOH,EAAKoV,SAEzCpV,EAAKyU,SAAUltB,EAAMD,EAAUguB,IAIjC,IAAKloB,IACJ+U,EAAW7f,EAAO8I,cAAe7D,EAAM3B,KAAM,GAAIQ,eAAe,GAAQkvB,GAAqB1vB,MAC7FgC,EAAQua,EAASxM,WAEmB,IAA/BwM,EAAS7W,WAAWxF,SACxBqc,EAAWva,GAGPA,GAAQ,CAMZ,IALAsD,EAAU5I,EAAO4F,IAAK8sB,GAAQ7S,EAAU,UAAYsT,IACpDF,EAAarqB,EAAQpF,OAITsH,EAAJrF,EAAOA,IACdoN,EAAOgN,EAEFpa,IAAMytB,IACVrgB,EAAO7S,EAAOsG,MAAOuM,GAAM,GAAM,GAG5BogB,GACJjzB,EAAO2D,MAAOiF,EAAS8pB,GAAQ7f,EAAM,YAIvC7N,EAASR,KAAMlB,KAAKmC,GAAIoN,EAAMpN,EAG/B,IAAKwtB,EAOJ,IANAngB,EAAMlK,EAASA,EAAQpF,OAAS,GAAIM,cAGpC9D,EAAO4F,IAAKgD,EAASwqB,IAGf3tB,EAAI,EAAOwtB,EAAJxtB,EAAgBA,IAC5BoN,EAAOjK,EAASnD,GACXsrB,GAAYhtB,KAAM8O,EAAKlQ,MAAQ,MAClC3C,EAAO+jB,MAAOlR,EAAM,eAAkB7S,EAAOmN,SAAU2F,EAAKD,KAExDA,EAAK5M,IAETjG,EAAOqzB,SAAUxgB,EAAK5M,KAEtBjG,EAAO+J,YAAc8I,EAAKtI,MAAQsI,EAAKuC,aAAevC,EAAKO,WAAa,IAAKvM,QAASoqB,GAAc,KAOxGpR,GAAWva,EAAQ,KAIrB,MAAOhC,QAMT,SAAS8uB,IAAoB/uB,EAAMiwB,GAClC,MAAOtzB,GAAOmK,SAAU9G,EAAM,UAC7BrD,EAAOmK,SAA+B,IAArBmpB,EAAQzvB,SAAiByvB,EAAUA,EAAQjgB,WAAY,MAExEhQ,EAAKwG,qBAAqB,SAAS,IAClCxG,EAAK6P,YAAa7P,EAAKS,cAAc+E,cAAc,UACpDxF,EAIF,QAAS8vB,IAAe9vB,GAEvB,MADAA,GAAKV,MAA6C,OAArC3C,EAAO0D,KAAKQ,KAAMb,EAAM,SAAqB,IAAMA,EAAKV,KAC9DU,EAER,QAAS+vB,IAAe/vB,GACvB,GAAID,GAAQ4tB,GAAkBvtB,KAAMJ,EAAKV,KAMzC,OALKS,GACJC,EAAKV,KAAOS,EAAM,GAElBC,EAAKgO,gBAAgB,QAEfhO,EAIR,QAASsvB,IAAe/tB,EAAO2uB,GAC9B,GAAIlwB,GACHoC,EAAI,CACL,MAA6B,OAApBpC,EAAOuB,EAAMa,IAAaA,IAClCzF,EAAO+jB,MAAO1gB,EAAM,cAAekwB,GAAevzB,EAAO+jB,MAAOwP,EAAY9tB,GAAI,eAIlF,QAAS+tB,IAAgBvtB,EAAKwtB,GAE7B,GAAuB,IAAlBA,EAAK5vB,UAAmB7D,EAAO6jB,QAAS5d,GAA7C,CAIA,GAAItD,GAAM8C,EAAGqF,EACZ4oB,EAAU1zB,EAAO+jB,MAAO9d,GACxB0tB,EAAU3zB,EAAO+jB,MAAO0P,EAAMC,GAC9BnL,EAASmL,EAAQnL,MAElB,IAAKA,EAAS,OACNoL,GAAQ1K,OACf0K,EAAQpL,SAER,KAAM5lB,IAAQ4lB,GACb,IAAM9iB,EAAI,EAAGqF,EAAIyd,EAAQ5lB,GAAOa,OAAYsH,EAAJrF,EAAOA,IAC9CzF,EAAOyC,MAAMmb,IAAK6V,EAAM9wB,EAAM4lB,EAAQ5lB,GAAQ8C,IAM5CkuB,EAAQlrB,OACZkrB,EAAQlrB,KAAOzI,EAAOgG,UAAY2tB,EAAQlrB,QAI5C,QAASmrB,IAAoB3tB,EAAKwtB,GACjC,GAAItpB,GAAUjC,EAAGO,CAGjB,IAAuB,IAAlBgrB,EAAK5vB,SAAV,CAOA,GAHAsG,EAAWspB,EAAKtpB,SAASC,eAGnBpK,EAAOmI,QAAQgZ,cAAgBsS,EAAMzzB,EAAO0G,SAAY,CAC7D+B,EAAOzI,EAAO+jB,MAAO0P,EAErB,KAAMvrB,IAAKO,GAAK8f,OACfvoB,EAAO4pB,YAAa6J,EAAMvrB,EAAGO,EAAKwgB,OAInCwK,GAAKpiB,gBAAiBrR,EAAO0G,SAIZ,WAAbyD,GAAyBspB,EAAKlpB,OAAStE,EAAIsE,MAC/C4oB,GAAeM,GAAOlpB,KAAOtE,EAAIsE,KACjC6oB,GAAeK,IAIS,WAAbtpB,GACNspB,EAAKrvB,aACTqvB,EAAK3S,UAAY7a,EAAI6a,WAOjB9gB,EAAOmI,QAAQyY,YAAgB3a,EAAImN,YAAcpT,EAAOmB,KAAKsyB,EAAKrgB,aACtEqgB,EAAKrgB,UAAYnN,EAAImN,YAGE,UAAbjJ,GAAwB0mB,GAA4B9sB,KAAMkC,EAAItD,OAKzE8wB,EAAKI,eAAiBJ,EAAKtb,QAAUlS,EAAIkS,QAIpCsb,EAAKppB,QAAUpE,EAAIoE,QACvBopB,EAAKppB,MAAQpE,EAAIoE,QAKM,WAAbF,EACXspB,EAAKK,gBAAkBL,EAAKrb,SAAWnS,EAAI6tB,iBAInB,UAAb3pB,GAAqC,aAAbA,KACnCspB,EAAKlX,aAAetW,EAAIsW,eAI1Bvc,EAAO+E,MACNgvB,SAAU,SACVC,UAAW,UACX1B,aAAc,SACd2B,YAAa,QACbC,WAAY,eACV,SAAU9tB,EAAMulB,GAClB3rB,EAAOsB,GAAI8E,GAAS,SAAUhF,GAC7B,GAAIwD,GACHa,EAAI,EACJZ,KACAsvB,EAASn0B,EAAQoB,GACjBoE,EAAO2uB,EAAO3wB,OAAS,CAExB,MAAagC,GAALC,EAAWA,IAClBb,EAAQa,IAAMD,EAAOlC,KAAOA,KAAKgD,OAAM,GACvCtG,EAAQm0B,EAAO1uB,IAAMkmB,GAAY/mB,GAGjCpE,EAAU4E,MAAOP,EAAKD,EAAMH,MAG7B,OAAOnB,MAAKqB,UAAWE,KAIzB,SAAS6tB,IAAQrxB,EAASsS,GACzB,GAAI/O,GAAOvB,EACVoC,EAAI,EACJ2uB,QAAe/yB,GAAQwI,uBAAyBnK,EAAoB2B,EAAQwI,qBAAsB8J,GAAO,WACjGtS,GAAQ8P,mBAAqBzR,EAAoB2B,EAAQ8P,iBAAkBwC,GAAO,KACzFpU,CAEF,KAAM60B,EACL,IAAMA,KAAYxvB,EAAQvD,EAAQ2H,YAAc3H,EAA8B,OAApBgC,EAAOuB,EAAMa,IAAaA,KAC7EkO,GAAO3T,EAAOmK,SAAU9G,EAAMsQ,GACnCygB,EAAM3zB,KAAM4C,GAEZrD,EAAO2D,MAAOywB,EAAO1B,GAAQrvB,EAAMsQ,GAKtC,OAAOA,KAAQpU,GAAaoU,GAAO3T,EAAOmK,SAAU9I,EAASsS,GAC5D3T,EAAO2D,OAAStC,GAAW+yB,GAC3BA,EAIF,QAASC,IAAmBhxB,GACtBwtB,GAA4B9sB,KAAMV,EAAKV,QAC3CU,EAAKwwB,eAAiBxwB,EAAK8U,SAI7BnY,EAAOgG,QACNM,MAAO,SAAUjD,EAAMuvB,EAAeC,GACrC,GAAIyB,GAAczhB,EAAMvM,EAAOb,EAAG8uB,EACjCC,EAASx0B,EAAOmN,SAAU9J,EAAKS,cAAeT,EAW/C,IATKrD,EAAOmI,QAAQyY,YAAc5gB,EAAOyc,SAASpZ,KAAUitB,GAAavsB,KAAM,IAAMV,EAAK8G,SAAW,KACpG7D,EAAQjD,EAAKwd,WAAW,IAIxB8Q,GAAYve,UAAY/P,EAAKyd,UAC7B6Q,GAAY7f,YAAaxL,EAAQqrB,GAAYte,eAGvCrT,EAAOmI,QAAQgZ,cAAiBnhB,EAAOmI,QAAQmZ,gBACjC,IAAlBje,EAAKQ,UAAoC,KAAlBR,EAAKQ,UAAqB7D,EAAOyc,SAASpZ,IAOnE,IAJAixB,EAAe5B,GAAQpsB,GACvBiuB,EAAc7B,GAAQrvB,GAGhBoC,EAAI,EAA8B,OAA1BoN,EAAO0hB,EAAY9uB,MAAeA,EAE1C6uB,EAAa7uB,IACjBmuB,GAAoB/gB,EAAMyhB,EAAa7uB,GAM1C,IAAKmtB,EACJ,GAAKC,EAIJ,IAHA0B,EAAcA,GAAe7B,GAAQrvB,GACrCixB,EAAeA,GAAgB5B,GAAQpsB,GAEjCb,EAAI,EAA8B,OAA1BoN,EAAO0hB,EAAY9uB,IAAaA,IAC7C+tB,GAAgB3gB,EAAMyhB,EAAa7uB,QAGpC+tB,IAAgBnwB,EAAMiD,EAaxB,OARAguB,GAAe5B,GAAQpsB,EAAO,UACzBguB,EAAa9wB,OAAS,GAC1BmvB,GAAe2B,GAAeE,GAAU9B,GAAQrvB,EAAM,WAGvDixB,EAAeC,EAAc1hB,EAAO,KAG7BvM,GAGRwC,cAAe,SAAUlE,EAAOvD,EAASuH,EAAS6rB,GACjD,GAAI9uB,GAAGtC,EAAM8J,EACZ5D,EAAKoK,EAAKyM,EAAOsU,EACjB5pB,EAAIlG,EAAMpB,OAGVmxB,EAAOzE,GAAoB7uB,GAE3BuzB,KACAnvB,EAAI,CAEL,MAAYqF,EAAJrF,EAAOA,IAGd,GAFApC,EAAOuB,EAAOa,GAETpC,GAAiB,IAATA,EAGZ,GAA6B,WAAxBrD,EAAO2C,KAAMU,GACjBrD,EAAO2D,MAAOixB,EAAOvxB,EAAKQ,UAAaR,GAASA,OAG1C,IAAMstB,GAAM5sB,KAAMV,GAIlB,CACNkG,EAAMA,GAAOorB,EAAKzhB,YAAa7R,EAAQwH,cAAc,QAGrD8K,GAAQ8c,GAAShtB,KAAMJ,KAAW,GAAI,KAAM,GAAG+G,cAC/CsqB,EAAOxD,GAASvd,IAASud,GAAQzG,SAEjClhB,EAAI6J,UAAYshB,EAAK,GAAKrxB,EAAKwD,QAAS2pB,GAAW,aAAgBkE,EAAK,GAGxE/uB,EAAI+uB,EAAK,EACT,OAAQ/uB,IACP4D,EAAMA,EAAIuN,SASX,KALM9W,EAAOmI,QAAQgY,mBAAqBoQ,GAAmBxsB,KAAMV,IAClEuxB,EAAMn0B,KAAMY,EAAQ6wB,eAAgB3B,GAAmB9sB,KAAMJ,GAAO,MAI/DrD,EAAOmI,QAAQiY,MAAQ,CAG5B/c,EAAe,UAARsQ,GAAoB+c,GAAO3sB,KAAMV,GAI3B,YAAZqxB,EAAK,IAAqBhE,GAAO3sB,KAAMV,GAEtC,EADAkG,EAJDA,EAAI8J,WAOL1N,EAAItC,GAAQA,EAAK2F,WAAWxF,MAC5B,OAAQmC,IACF3F,EAAOmK,SAAWiW,EAAQ/c,EAAK2F,WAAWrD,GAAK,WAAcya,EAAMpX,WAAWxF,QAClFH,EAAKyO,YAAasO,GAKrBpgB,EAAO2D,MAAOixB,EAAOrrB,EAAIP,YAGzBO,EAAI6L,YAAc,EAGlB,OAAQ7L,EAAI8J,WACX9J,EAAIuI,YAAavI,EAAI8J,WAItB9J,GAAMorB,EAAK7d,cAtDX8d,GAAMn0B,KAAMY,EAAQ6wB,eAAgB7uB,GA4DlCkG,IACJorB,EAAK7iB,YAAavI,GAKbvJ,EAAOmI,QAAQuZ,eACpB1hB,EAAO+K,KAAM2nB,GAAQkC,EAAO,SAAWP,IAGxC5uB,EAAI,CACJ,OAASpC,EAAOuxB,EAAOnvB,KAItB,KAAKgvB,GAAmD,KAAtCz0B,EAAO2K,QAAStH,EAAMoxB,MAIxCtnB,EAAWnN,EAAOmN,SAAU9J,EAAKS,cAAeT,GAGhDkG,EAAMmpB,GAAQiC,EAAKzhB,YAAa7P,GAAQ,UAGnC8J,GACJwlB,GAAeppB,GAIXX,GAAU,CACdjD,EAAI,CACJ,OAAStC,EAAOkG,EAAK5D,KACforB,GAAYhtB,KAAMV,EAAKV,MAAQ,KACnCiG,EAAQnI,KAAM4C,GAQlB,MAFAkG,GAAM,KAECorB,GAGRlR,UAAW,SAAU7e,EAAsBse,GAC1C,GAAI7f,GAAMV,EAAM0B,EAAIoE,EACnBhD,EAAI,EACJ2d,EAAcpjB,EAAO0G,QACrB8K,EAAQxR,EAAOwR,MACf0P,EAAgBlhB,EAAOmI,QAAQ+Y,cAC/BwH,EAAU1oB,EAAOyC,MAAMimB,OAExB,MAA6B,OAApBrlB,EAAOuB,EAAMa,IAAaA,IAElC,IAAKyd,GAAcljB,EAAOkjB,WAAY7f,MAErCgB,EAAKhB,EAAM+f,GACX3a,EAAOpE,GAAMmN,EAAOnN,IAER,CACX,GAAKoE,EAAK8f,OACT,IAAM5lB,IAAQ8F,GAAK8f,OACbG,EAAS/lB,GACb3C,EAAOyC,MAAMsG,OAAQ1F,EAAMV,GAI3B3C,EAAO4pB,YAAavmB,EAAMV,EAAM8F,EAAKwgB,OAMnCzX;EAAOnN,WAEJmN,GAAOnN,GAKT6c,QACG7d,GAAM+f,SAEK/f,GAAKgO,kBAAoB3R,EAC3C2D,EAAKgO,gBAAiB+R,GAGtB/f,EAAM+f,GAAgB,KAGvBhjB,EAAgBK,KAAM4D,MAO3BgvB,SAAU,SAAUwB,GACnB,MAAO70B,GAAO80B,MACbD,IAAKA,EACLlyB,KAAM,MACNoyB,SAAU,SACVprB,OAAO,EACP0e,QAAQ,EACR2M,UAAU,OAIbh1B,EAAOsB,GAAG0E,QACTivB,QAAS,SAAUnC,GAClB,GAAK9yB,EAAOiE,WAAY6uB,GACvB,MAAOxvB,MAAKyB,KAAK,SAASU,GACzBzF,EAAOsD,MAAM2xB,QAASnC,EAAKtuB,KAAKlB,KAAMmC,KAIxC,IAAKnC,KAAK,GAAK,CAEd,GAAIoxB,GAAO10B,EAAQ8yB,EAAMxvB,KAAK,GAAGQ,eAAgByB,GAAG,GAAGe,OAAM,EAExDhD,MAAK,GAAGc,YACZswB,EAAKpC,aAAchvB,KAAK,IAGzBoxB,EAAK9uB,IAAI,WACR,GAAIvC,GAAOC,IAEX,OAAQD,EAAKgQ,YAA2C,IAA7BhQ,EAAKgQ,WAAWxP,SAC1CR,EAAOA,EAAKgQ,UAGb,OAAOhQ,KACL4uB,OAAQ3uB,MAGZ,MAAOA,OAGR4xB,UAAW,SAAUpC,GACpB,MAAK9yB,GAAOiE,WAAY6uB,GAChBxvB,KAAKyB,KAAK,SAASU,GACzBzF,EAAOsD,MAAM4xB,UAAWpC,EAAKtuB,KAAKlB,KAAMmC,MAInCnC,KAAKyB,KAAK,WAChB,GAAI2Y,GAAO1d,EAAQsD,MAClBqrB,EAAWjR,EAAKiR,UAEZA,GAASnrB,OACbmrB,EAASsG,QAASnC,GAGlBpV,EAAKuU,OAAQa,MAKhB4B,KAAM,SAAU5B,GACf,GAAI7uB,GAAajE,EAAOiE,WAAY6uB,EAEpC,OAAOxvB,MAAKyB,KAAK,SAASU,GACzBzF,EAAQsD,MAAO2xB,QAAShxB,EAAa6uB,EAAKtuB,KAAKlB,KAAMmC,GAAKqtB,MAI5DqC,OAAQ,WACP,MAAO7xB,MAAKyP,SAAShO,KAAK,WACnB/E,EAAOmK,SAAU7G,KAAM,SAC5BtD,EAAQsD,MAAOyvB,YAAazvB,KAAK0F,cAEhCnD,QAGL,IAAIuvB,IAAQC,GAAWC,GACtBC,GAAS,kBACTC,GAAW,wBACXC,GAAY,4BAGZC,GAAe,4BACfC,GAAU,UACVC,GAAgBnnB,OAAQ,KAAOjN,EAAY,SAAU,KACrDq0B,GAAgBpnB,OAAQ,KAAOjN,EAAY,kBAAmB,KAC9Ds0B,GAAcrnB,OAAQ,YAAcjN,EAAY,IAAK,KACrDu0B,IAAgBC,KAAM,SAEtBC,IAAYC,SAAU,WAAYC,WAAY,SAAU7T,QAAS,SACjE8T,IACCC,cAAe,EACfC,WAAY,KAGbC,IAAc,MAAO,QAAS,SAAU,QACxCC,IAAgB,SAAU,IAAK,MAAO,KAGvC,SAASC,IAAgB1qB,EAAO3F,GAG/B,GAAKA,IAAQ2F,GACZ,MAAO3F,EAIR,IAAIswB,GAAUtwB,EAAK7C,OAAO,GAAGhB,cAAgB6D,EAAKzF,MAAM,GACvDg2B,EAAWvwB,EACXX,EAAI+wB,GAAYhzB,MAEjB,OAAQiC,IAEP,GADAW,EAAOowB,GAAa/wB,GAAMixB,EACrBtwB,IAAQ2F,GACZ,MAAO3F,EAIT,OAAOuwB,GAGR,QAASC,IAAUvzB,EAAMwzB,GAIxB,MADAxzB,GAAOwzB,GAAMxzB,EAC4B,SAAlCrD,EAAO82B,IAAKzzB,EAAM,aAA2BrD,EAAOmN,SAAU9J,EAAKS,cAAeT,GAG1F,QAAS0zB,IAAUliB,EAAUmiB,GAC5B,GAAI1U,GAASjf,EAAM4zB,EAClBzX,KACA3B,EAAQ,EACRra,EAASqR,EAASrR,MAEnB,MAAgBA,EAARqa,EAAgBA,IACvBxa,EAAOwR,EAAUgJ,GACXxa,EAAK0I,QAIXyT,EAAQ3B,GAAU7d,EAAO+jB,MAAO1gB,EAAM,cACtCif,EAAUjf,EAAK0I,MAAMuW,QAChB0U,GAGExX,EAAQ3B,IAAuB,SAAZyE,IACxBjf,EAAK0I,MAAMuW,QAAU,IAMM,KAAvBjf,EAAK0I,MAAMuW,SAAkBsU,GAAUvzB,KAC3Cmc,EAAQ3B,GAAU7d,EAAO+jB,MAAO1gB,EAAM,aAAc6zB,GAAmB7zB,EAAK8G,aAIvEqV,EAAQ3B,KACboZ,EAASL,GAAUvzB,IAEdif,GAAuB,SAAZA,IAAuB2U,IACtCj3B,EAAO+jB,MAAO1gB,EAAM,aAAc4zB,EAAS3U,EAAUtiB,EAAO82B,IAAKzzB,EAAM,aAQ3E,KAAMwa,EAAQ,EAAWra,EAARqa,EAAgBA,IAChCxa,EAAOwR,EAAUgJ,GACXxa,EAAK0I,QAGLirB,GAA+B,SAAvB3zB,EAAK0I,MAAMuW,SAA6C,KAAvBjf,EAAK0I,MAAMuW,UACzDjf,EAAK0I,MAAMuW,QAAU0U,EAAOxX,EAAQ3B,IAAW,GAAK,QAItD,OAAOhJ,GAGR7U,EAAOsB,GAAG0E,QACT8wB,IAAK,SAAU1wB,EAAMiE,GACpB,MAAOrK,GAAOqL,OAAQ/H,KAAM,SAAUD,EAAM+C,EAAMiE,GACjD,GAAI3E,GAAKyxB,EACRvxB,KACAH,EAAI,CAEL,IAAKzF,EAAOyG,QAASL,GAAS,CAI7B,IAHA+wB,EAAS9B,GAAWhyB,GACpBqC,EAAMU,EAAK5C,OAECkC,EAAJD,EAASA,IAChBG,EAAKQ,EAAMX,IAAQzF,EAAO82B,IAAKzzB,EAAM+C,EAAMX,IAAK,EAAO0xB,EAGxD,OAAOvxB,GAGR,MAAOyE,KAAU9K,EAChBS,EAAO+L,MAAO1I,EAAM+C,EAAMiE,GAC1BrK,EAAO82B,IAAKzzB,EAAM+C,IACjBA,EAAMiE,EAAOhF,UAAU7B,OAAS,IAEpCwzB,KAAM,WACL,MAAOD,IAAUzzB,MAAM,IAExB8zB,KAAM,WACL,MAAOL,IAAUzzB,OAElB+zB,OAAQ,SAAUlZ,GACjB,MAAsB,iBAAVA,GACJA,EAAQ7a,KAAK0zB,OAAS1zB,KAAK8zB,OAG5B9zB,KAAKyB,KAAK,WACX6xB,GAAUtzB,MACdtD,EAAQsD,MAAO0zB,OAEfh3B,EAAQsD,MAAO8zB,YAMnBp3B,EAAOgG,QAGNsxB,UACC/W,SACC9b,IAAK,SAAUpB,EAAMk0B,GACpB,GAAKA,EAAW,CAEf,GAAI1yB,GAAMywB,GAAQjyB,EAAM,UACxB,OAAe,KAARwB,EAAa,IAAMA,MAO9B2yB,WACCC,aAAe,EACfC,aAAe,EACfpB,YAAc,EACdqB,YAAc,EACdpX,SAAW,EACXqX,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVvV,MAAQ,GAKTwV,UAECC,QAASj4B,EAAOmI,QAAQqY,SAAW,WAAa,cAIjDzU,MAAO,SAAU1I,EAAM+C,EAAMiE,EAAO6tB,GAEnC,GAAM70B,GAA0B,IAAlBA,EAAKQ,UAAoC,IAAlBR,EAAKQ,UAAmBR,EAAK0I,MAAlE,CAKA,GAAIlH,GAAKlC,EAAM0hB,EACdsS,EAAW32B,EAAOiK,UAAW7D,GAC7B2F,EAAQ1I,EAAK0I,KASd,IAPA3F,EAAOpG,EAAOg4B,SAAUrB,KAAgB32B,EAAOg4B,SAAUrB,GAAaF,GAAgB1qB,EAAO4qB,IAI7FtS,EAAQrkB,EAAOs3B,SAAUlxB,IAAUpG,EAAOs3B,SAAUX,GAG/CtsB,IAAU9K,EAsCd,MAAK8kB,IAAS,OAASA,KAAUxf,EAAMwf,EAAM5f,IAAKpB,GAAM,EAAO60B,MAAa34B,EACpEsF,EAIDkH,EAAO3F,EAhCd,IAVAzD,QAAc0H,GAGA,WAAT1H,IAAsBkC,EAAMixB,GAAQryB,KAAM4G,MAC9CA,GAAUxF,EAAI,GAAK,GAAMA,EAAI,GAAKiD,WAAY9H,EAAO82B,IAAKzzB,EAAM+C,IAEhEzD,EAAO,YAIM,MAAT0H,GAA0B,WAAT1H,GAAqBkF,MAAOwC,KAKpC,WAAT1H,GAAsB3C,EAAOw3B,UAAWb,KAC5CtsB,GAAS,MAKJrK,EAAOmI,QAAQ6Z,iBAA6B,KAAV3X,GAA+C,IAA/BjE,EAAKvF,QAAQ,gBACpEkL,EAAO3F,GAAS,WAIXie,GAAW,OAASA,KAAWha,EAAQga,EAAMoC,IAAKpjB,EAAMgH,EAAO6tB,MAAa34B,IAIjF,IACCwM,EAAO3F,GAASiE,EACf,MAAMnC,OAcX4uB,IAAK,SAAUzzB,EAAM+C,EAAM8xB,EAAOf,GACjC,GAAIzyB,GAAKoQ,EAAKuP,EACbsS,EAAW32B,EAAOiK,UAAW7D,EAyB9B,OAtBAA,GAAOpG,EAAOg4B,SAAUrB,KAAgB32B,EAAOg4B,SAAUrB,GAAaF,GAAgBpzB,EAAK0I,MAAO4qB,IAIlGtS,EAAQrkB,EAAOs3B,SAAUlxB,IAAUpG,EAAOs3B,SAAUX,GAG/CtS,GAAS,OAASA,KACtBvP,EAAMuP,EAAM5f,IAAKpB,GAAM,EAAM60B,IAIzBpjB,IAAQvV,IACZuV,EAAMwgB,GAAQjyB,EAAM+C,EAAM+wB,IAId,WAARriB,GAAoB1O,IAAQgwB,MAChCthB,EAAMshB,GAAoBhwB,IAIZ,KAAV8xB,GAAgBA,GACpBxzB,EAAMoD,WAAYgN,GACXojB,KAAU,GAAQl4B,EAAO4H,UAAWlD,GAAQA,GAAO,EAAIoQ,GAExDA,KAMJxV,EAAOqjB,kBACX0S,GAAY,SAAUhyB,GACrB,MAAO/D,GAAOqjB,iBAAkBtf,EAAM,OAGvCiyB,GAAS,SAAUjyB,EAAM+C,EAAM+xB,GAC9B,GAAIvV,GAAOwV,EAAUC,EACpBd,EAAWY,GAAa9C,GAAWhyB,GAGnCwB,EAAM0yB,EAAWA,EAASe,iBAAkBlyB,IAAUmxB,EAAUnxB,GAAS7G,EACzEwM,EAAQ1I,EAAK0I,KA8Bd,OA5BKwrB,KAES,KAAR1yB,GAAe7E,EAAOmN,SAAU9J,EAAKS,cAAeT,KACxDwB,EAAM7E,EAAO+L,MAAO1I,EAAM+C,IAOtByvB,GAAU9xB,KAAMc,IAAS8wB,GAAQ5xB,KAAMqC,KAG3Cwc,EAAQ7W,EAAM6W,MACdwV,EAAWrsB,EAAMqsB,SACjBC,EAAWtsB,EAAMssB,SAGjBtsB,EAAMqsB,SAAWrsB,EAAMssB,SAAWtsB,EAAM6W,MAAQ/d,EAChDA,EAAM0yB,EAAS3U,MAGf7W,EAAM6W,MAAQA,EACd7W,EAAMqsB,SAAWA,EACjBrsB,EAAMssB,SAAWA,IAIZxzB,IAEGjF,EAASE,gBAAgBy4B,eACpClD,GAAY,SAAUhyB,GACrB,MAAOA,GAAKk1B,cAGbjD,GAAS,SAAUjyB,EAAM+C,EAAM+xB,GAC9B,GAAIK,GAAMC,EAAIC,EACbnB,EAAWY,GAAa9C,GAAWhyB,GACnCwB,EAAM0yB,EAAWA,EAAUnxB,GAAS7G,EACpCwM,EAAQ1I,EAAK0I,KAoCd,OAhCY,OAAPlH,GAAekH,GAASA,EAAO3F,KACnCvB,EAAMkH,EAAO3F,IAUTyvB,GAAU9xB,KAAMc,KAAU4wB,GAAU1xB,KAAMqC,KAG9CoyB,EAAOzsB,EAAMysB,KACbC,EAAKp1B,EAAKs1B,aACVD,EAASD,GAAMA,EAAGD,KAGbE,IACJD,EAAGD,KAAOn1B,EAAKk1B,aAAaC,MAE7BzsB,EAAMysB,KAAgB,aAATpyB,EAAsB,MAAQvB,EAC3CA,EAAMkH,EAAM6sB,UAAY,KAGxB7sB,EAAMysB,KAAOA,EACRE,IACJD,EAAGD,KAAOE,IAIG,KAAR7zB,EAAa,OAASA,GAI/B,SAASg0B,IAAmBx1B,EAAMgH,EAAOyuB,GACxC,GAAI5rB,GAAU0oB,GAAUnyB,KAAM4G,EAC9B,OAAO6C,GAENvG,KAAKiE,IAAK,EAAGsC,EAAS,IAAQ4rB,GAAY,KAAU5rB,EAAS,IAAO,MACpE7C,EAGF,QAAS0uB,IAAsB11B,EAAM+C,EAAM8xB,EAAOc,EAAa7B,GAC9D,GAAI1xB,GAAIyyB,KAAYc,EAAc,SAAW,WAE5C,EAES,UAAT5yB,EAAmB,EAAI,EAEvB0O,EAAM,CAEP,MAAY,EAAJrP,EAAOA,GAAK,EAEJ,WAAVyyB,IACJpjB,GAAO9U,EAAO82B,IAAKzzB,EAAM60B,EAAQ3B,GAAW9wB,IAAK,EAAM0xB,IAGnD6B,GAEW,YAAVd,IACJpjB,GAAO9U,EAAO82B,IAAKzzB,EAAM,UAAYkzB,GAAW9wB,IAAK,EAAM0xB,IAI7C,WAAVe,IACJpjB,GAAO9U,EAAO82B,IAAKzzB,EAAM,SAAWkzB,GAAW9wB,GAAM,SAAS,EAAM0xB,MAIrEriB,GAAO9U,EAAO82B,IAAKzzB,EAAM,UAAYkzB,GAAW9wB,IAAK,EAAM0xB,GAG5C,YAAVe,IACJpjB,GAAO9U,EAAO82B,IAAKzzB,EAAM,SAAWkzB,GAAW9wB,GAAM,SAAS,EAAM0xB,IAKvE,OAAOriB,GAGR,QAASmkB,IAAkB51B,EAAM+C,EAAM8xB,GAGtC,GAAIgB,IAAmB,EACtBpkB,EAAe,UAAT1O,EAAmB/C,EAAKqf,YAAcrf,EAAKgf,aACjD8U,EAAS9B,GAAWhyB,GACpB21B,EAAch5B,EAAOmI,QAAQsa,WAAgE,eAAnDziB,EAAO82B,IAAKzzB,EAAM,aAAa,EAAO8zB,EAKjF,IAAY,GAAPriB,GAAmB,MAAPA,EAAc,CAQ9B,GANAA,EAAMwgB,GAAQjyB,EAAM+C,EAAM+wB,IACf,EAANriB,GAAkB,MAAPA,KACfA,EAAMzR,EAAK0I,MAAO3F,IAIdyvB,GAAU9xB,KAAK+Q,GACnB,MAAOA,EAKRokB,GAAmBF,IAAiBh5B,EAAOmI,QAAQkZ,mBAAqBvM,IAAQzR,EAAK0I,MAAO3F,IAG5F0O,EAAMhN,WAAYgN,IAAS,EAI5B,MAASA,GACRikB,GACC11B,EACA+C,EACA8xB,IAAWc,EAAc,SAAW,WACpCE,EACA/B,GAEE,KAIL,QAASD,IAAoB/sB,GAC5B,GAAI2I,GAAMlT,EACT0iB,EAAUyT,GAAa5rB,EA0BxB,OAxBMmY,KACLA,EAAU6W,GAAehvB,EAAU2I,GAGlB,SAAZwP,GAAuBA,IAE3B8S,IAAWA,IACVp1B,EAAO,kDACN82B,IAAK,UAAW,6BAChB/C,SAAUjhB,EAAIhT,iBAGhBgT,GAAQsiB,GAAO,GAAGvF,eAAiBuF,GAAO,GAAGxF,iBAAkBhwB,SAC/DkT,EAAIsmB,MAAM,+BACVtmB,EAAIumB,QAEJ/W,EAAU6W,GAAehvB,EAAU2I,GACnCsiB,GAAOvyB,UAIRkzB,GAAa5rB,GAAamY,GAGpBA,EAIR,QAAS6W,IAAe/yB,EAAM0M,GAC7B,GAAIzP,GAAOrD,EAAQ8S,EAAIjK,cAAezC,IAAS2tB,SAAUjhB,EAAI1L,MAC5Dkb,EAAUtiB,EAAO82B,IAAKzzB,EAAK,GAAI,UAEhC,OADAA,GAAK0F,SACEuZ,EAGRtiB,EAAO+E,MAAO,SAAU,SAAW,SAAUU,EAAGW,GAC/CpG,EAAOs3B,SAAUlxB,IAChB3B,IAAK,SAAUpB,EAAMk0B,EAAUW,GAC9B,MAAKX,GAGwB,IAArBl0B,EAAKqf,aAAqBgT,GAAa3xB,KAAM/D,EAAO82B,IAAKzzB,EAAM,YACrErD,EAAO6L,KAAMxI,EAAM4yB,GAAS,WAC3B,MAAOgD,IAAkB51B,EAAM+C,EAAM8xB,KAEtCe,GAAkB51B,EAAM+C,EAAM8xB,GAPhC,GAWDzR,IAAK,SAAUpjB,EAAMgH,EAAO6tB,GAC3B,GAAIf,GAASe,GAAS7C,GAAWhyB,EACjC,OAAOw1B,IAAmBx1B,EAAMgH,EAAO6tB,EACtCa,GACC11B,EACA+C,EACA8xB,EACAl4B,EAAOmI,QAAQsa,WAAgE,eAAnDziB,EAAO82B,IAAKzzB,EAAM,aAAa,EAAO8zB,GAClEA,GACG,OAMFn3B,EAAOmI,QAAQoY,UACpBvgB,EAAOs3B,SAAS/W,SACf9b,IAAK,SAAUpB,EAAMk0B,GAEpB,MAAO/B,IAASzxB,MAAOwzB,GAAYl0B,EAAKk1B,aAAel1B,EAAKk1B,aAAa/kB,OAASnQ,EAAK0I,MAAMyH,SAAW,IACrG,IAAO1L,WAAY2G,OAAO6qB,IAAS,GACrC/B,EAAW,IAAM,IAGnB9Q,IAAK,SAAUpjB,EAAMgH,GACpB,GAAI0B,GAAQ1I,EAAK0I,MAChBwsB,EAAel1B,EAAKk1B,aACpBhY,EAAUvgB,EAAO4H,UAAWyC,GAAU,iBAA2B,IAARA,EAAc,IAAM,GAC7EmJ,EAAS+kB,GAAgBA,EAAa/kB,QAAUzH,EAAMyH,QAAU,EAIjEzH,GAAMyW,KAAO,GAINnY,GAAS,GAAe,KAAVA,IAC6B,KAAhDrK,EAAOmB,KAAMqS,EAAO3M,QAAS0uB,GAAQ,MACrCxpB,EAAMsF,kBAKPtF,EAAMsF,gBAAiB,UAGR,KAAVhH,GAAgBkuB,IAAiBA,EAAa/kB,UAMpDzH,EAAMyH,OAAS+hB,GAAOxxB,KAAMyP,GAC3BA,EAAO3M,QAAS0uB,GAAQhV,GACxB/M,EAAS,IAAM+M,MAOnBvgB,EAAO,WACAA,EAAOmI,QAAQiZ,sBACpBphB,EAAOs3B,SAASzU,aACfpe,IAAK,SAAUpB,EAAMk0B,GACpB,MAAKA,GAGGv3B,EAAO6L,KAAMxI,GAAQif,QAAW,gBACtCgT,IAAUjyB,EAAM,gBAJlB,MAaGrD,EAAOmI,QAAQ8Y,eAAiBjhB,EAAOsB,GAAG40B,UAC/Cl2B,EAAO+E,MAAQ,MAAO,QAAU,SAAUU,EAAGmgB,GAC5C5lB,EAAOs3B,SAAU1R,IAChBnhB,IAAK,SAAUpB,EAAMk0B,GACpB,MAAKA,IACJA,EAAWjC,GAAQjyB,EAAMuiB,GAElBiQ,GAAU9xB,KAAMwzB,GACtBv3B,EAAQqD,GAAO6yB,WAAYtQ,GAAS,KACpC2R,GALF,QAcAv3B,EAAO4U,MAAQ5U,EAAO4U,KAAKwE,UAC/BpZ,EAAO4U,KAAKwE,QAAQ6d,OAAS,SAAU5zB,GAGtC,MAA2B,IAApBA,EAAKqf,aAAyC,GAArBrf,EAAKgf,eAClCriB,EAAOmI,QAAQoa,uBAAmG,UAAxElf,EAAK0I,OAAS1I,EAAK0I,MAAMuW,SAAYtiB,EAAO82B,IAAKzzB,EAAM,aAGrGrD,EAAO4U,KAAKwE,QAAQmgB,QAAU,SAAUl2B,GACvC,OAAQrD,EAAO4U,KAAKwE,QAAQ6d,OAAQ5zB,KAKtCrD,EAAO+E,MACNy0B,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpB55B,EAAOs3B,SAAUqC,EAASC,IACzBC,OAAQ,SAAUxvB,GACjB,GAAI5E,GAAI,EACPq0B,KAGAC,EAAyB,gBAAV1vB,GAAqBA,EAAMiC,MAAM,MAASjC,EAE1D,MAAY,EAAJ5E,EAAOA,IACdq0B,EAAUH,EAASpD,GAAW9wB,GAAMm0B,GACnCG,EAAOt0B,IAAOs0B,EAAOt0B,EAAI,IAAOs0B,EAAO,EAGzC,OAAOD,KAIHnE,GAAQ5xB,KAAM41B,KACnB35B,EAAOs3B,SAAUqC,EAASC,GAASnT,IAAMoS,KAG3C,IAAImB,IAAM,OACTC,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,oCAEhBp6B,GAAOsB,GAAG0E,QACTq0B,UAAW,WACV,MAAOr6B,GAAOqxB,MAAO/tB,KAAKg3B,mBAE3BA,eAAgB,WACf,MAAOh3B,MAAKsC,IAAI,WAEf,GAAIiP,GAAW7U,EAAO4lB,KAAMtiB,KAAM,WAClC,OAAOuR,GAAW7U,EAAOsE,UAAWuQ,GAAavR,OAEjDkQ,OAAO,WACP,GAAI7Q,GAAOW,KAAKX,IAEhB,OAAOW,MAAK8C,OAASpG,EAAQsD,MAAOyrB,GAAI,cACvCqL,GAAar2B,KAAMT,KAAK6G,YAAegwB,GAAgBp2B,KAAMpB,KAC3DW,KAAK6U,UAAY0Y,GAA4B9sB,KAAMpB,MAEtDiD,IAAI,SAAUH,EAAGpC,GACjB,GAAIyR,GAAM9U,EAAQsD,MAAOwR,KAEzB,OAAc,OAAPA,EACN,KACA9U,EAAOyG,QAASqO,GACf9U,EAAO4F,IAAKkP,EAAK,SAAUA,GAC1B,OAAS1O,KAAM/C,EAAK+C,KAAMiE,MAAOyK,EAAIjO,QAASqzB,GAAO,YAEpD9zB,KAAM/C,EAAK+C,KAAMiE,MAAOyK,EAAIjO,QAASqzB,GAAO,WAC9Cz1B,SAMLzE,EAAOqxB,MAAQ,SAAUzjB,EAAG2sB,GAC3B,GAAIZ,GACHa,KACA5c,EAAM,SAAU3V,EAAKoC,GAEpBA,EAAQrK,EAAOiE,WAAYoG,GAAUA,IAAqB,MAATA,EAAgB,GAAKA,EACtEmwB,EAAGA,EAAEh3B,QAAWi3B,mBAAoBxyB,GAAQ,IAAMwyB,mBAAoBpwB,GASxE,IALKkwB,IAAgBh7B,IACpBg7B,EAAcv6B,EAAO06B,cAAgB16B,EAAO06B,aAAaH,aAIrDv6B,EAAOyG,QAASmH,IAASA,EAAE1K,SAAWlD,EAAOgE,cAAe4J,GAEhE5N,EAAO+E,KAAM6I,EAAG,WACfgQ,EAAKta,KAAK8C,KAAM9C,KAAK+G,aAMtB,KAAMsvB,IAAU/rB,GACf+sB,GAAahB,EAAQ/rB,EAAG+rB,GAAUY,EAAa3c,EAKjD,OAAO4c,GAAEtpB,KAAM,KAAMrK,QAASmzB,GAAK,KAGpC,SAASW,IAAahB,EAAQlyB,EAAK8yB,EAAa3c,GAC/C,GAAIxX,EAEJ,IAAKpG,EAAOyG,QAASgB,GAEpBzH,EAAO+E,KAAM0C,EAAK,SAAUhC,EAAGm1B,GACzBL,GAAeN,GAASl2B,KAAM41B,GAElC/b,EAAK+b,EAAQiB,GAIbD,GAAahB,EAAS,KAAqB,gBAANiB,GAAiBn1B,EAAI,IAAO,IAAKm1B,EAAGL,EAAa3c,SAIlF,IAAM2c,GAAsC,WAAvBv6B,EAAO2C,KAAM8E,GAQxCmW,EAAK+b,EAAQlyB,OANb,KAAMrB,IAAQqB,GACbkzB,GAAahB,EAAS,IAAMvzB,EAAO,IAAKqB,EAAKrB,GAAQm0B,EAAa3c,GAQrE5d,EAAO+E,KAAM,0MAEqDuH,MAAM,KAAM,SAAU7G,EAAGW,GAG1FpG,EAAOsB,GAAI8E,GAAS,SAAUqC,EAAMnH,GACnC,MAAO+D,WAAU7B,OAAS,EACzBF,KAAK6qB,GAAI/nB,EAAM,KAAMqC,EAAMnH,GAC3BgC,KAAKiE,QAASnB,MAIjBpG,EAAOsB,GAAG0E,QACT60B,MAAO,SAAUC,EAAQC,GACxB,MAAOz3B,MAAKiqB,WAAYuN,GAAStN,WAAYuN,GAASD,IAGvDE,KAAM,SAAU1S,EAAO7f,EAAMnH,GAC5B,MAAOgC,MAAK6qB,GAAI7F,EAAO,KAAM7f,EAAMnH,IAEpC25B,OAAQ,SAAU3S,EAAOhnB,GACxB,MAAOgC,MAAKkE,IAAK8gB,EAAO,KAAMhnB,IAG/B45B,SAAU,SAAU95B,EAAUknB,EAAO7f,EAAMnH,GAC1C,MAAOgC,MAAK6qB,GAAI7F,EAAOlnB,EAAUqH,EAAMnH,IAExC65B,WAAY,SAAU/5B,EAAUknB,EAAOhnB,GAEtC,MAA4B,KAArB+D,UAAU7B,OAAeF,KAAKkE,IAAKpG,EAAU,MAASkC,KAAKkE,IAAK8gB,EAAOlnB,GAAY,KAAME,KAGlG,IAEC85B,IACAC,GACAC,GAAat7B,EAAO0L,MAEpB6vB,GAAc,KACdC,GAAQ,OACRC,GAAM,gBACNC,GAAW,gCAEXC,GAAiB,4DACjBC,GAAa,iBACbC,GAAY,QACZC,GAAO,8CAGPC,GAAQ/7B,EAAOsB,GAAGqrB,KAWlBqP,MAOAC,MAGAC,GAAW,KAAK37B,OAAO,IAIxB,KACC86B,GAAe17B,EAASoY,KACvB,MAAO7P,IAGRmzB,GAAez7B,EAASiJ,cAAe,KACvCwyB,GAAatjB,KAAO,GACpBsjB,GAAeA,GAAatjB,KAI7BqjB,GAAeU,GAAKr4B,KAAM43B,GAAajxB,kBAGvC,SAAS+xB,IAA6BC,GAGrC,MAAO,UAAUC,EAAoBpe,GAED,gBAAvBoe,KACXpe,EAAOoe,EACPA,EAAqB,IAGtB,IAAItH,GACHtvB,EAAI,EACJ62B,EAAYD,EAAmBjyB,cAAchH,MAAO1B,MAErD,IAAK1B,EAAOiE,WAAYga,GAEvB,MAAS8W,EAAWuH,EAAU72B,KAER,MAAhBsvB,EAAS,IACbA,EAAWA,EAASp0B,MAAO,IAAO,KACjCy7B,EAAWrH,GAAaqH,EAAWrH,QAAkBpgB,QAASsJ,KAI9Dme,EAAWrH,GAAaqH,EAAWrH,QAAkBt0B,KAAMwd,IAQjE,QAASse,IAA+BH,EAAW/1B,EAASm2B,EAAiBC,GAE5E,GAAIC,MACHC,EAAqBP,IAAcH,EAEpC,SAASW,GAAS7H,GACjB,GAAI3c,EAYJ,OAXAskB,GAAW3H,IAAa,EACxB/0B,EAAO+E,KAAMq3B,EAAWrH,OAAkB,SAAUhlB,EAAG8sB,GACtD,GAAIC,GAAsBD,EAAoBx2B,EAASm2B,EAAiBC,EACxE,OAAmC,gBAAxBK,IAAqCH,GAAqBD,EAAWI,GAIpEH,IACDvkB,EAAW0kB,GADf,GAHNz2B,EAAQi2B,UAAU3nB,QAASmoB,GAC3BF,EAASE,IACF,KAKF1kB,EAGR,MAAOwkB,GAASv2B,EAAQi2B,UAAW,MAAUI,EAAW,MAASE,EAAS,KAM3E,QAASG,IAAYx2B,EAAQN,GAC5B,GAAIO,GAAMyB,EACT+0B,EAAch9B,EAAO06B,aAAasC,eAEnC,KAAM/0B,IAAOhC,GACPA,EAAKgC,KAAU1I,KACjBy9B,EAAa/0B,GAAQ1B,EAAWC,IAASA,OAAgByB,GAAQhC,EAAKgC,GAO1E,OAJKzB,IACJxG,EAAOgG,QAAQ,EAAMO,EAAQC,GAGvBD,EAGRvG,EAAOsB,GAAGqrB,KAAO,SAAUkI,EAAKoI,EAAQj4B,GACvC,GAAoB,gBAAR6vB,IAAoBkH,GAC/B,MAAOA,IAAM32B,MAAO9B,KAAM+B,UAG3B,IAAIjE,GAAU87B,EAAUv6B,EACvB+a,EAAOpa,KACPkE,EAAMqtB,EAAIh0B,QAAQ,IA+CnB,OA7CK2G,IAAO,IACXpG,EAAWyzB,EAAIl0B,MAAO6G,EAAKqtB,EAAIrxB,QAC/BqxB,EAAMA,EAAIl0B,MAAO,EAAG6G,IAIhBxH,EAAOiE,WAAYg5B,IAGvBj4B,EAAWi4B,EACXA,EAAS19B,GAGE09B,GAA4B,gBAAXA,KAC5Bt6B,EAAO,QAIH+a,EAAKla,OAAS,GAClBxD,EAAO80B,MACND,IAAKA,EAGLlyB,KAAMA,EACNoyB,SAAU,OACVtsB,KAAMw0B,IACJ93B,KAAK,SAAUg4B,GAGjBD,EAAW73B,UAEXqY,EAAKoV,KAAM1xB,EAIVpB,EAAO,SAASiyB,OAAQjyB,EAAO4D,UAAWu5B,IAAiBz5B,KAAMtC,GAGjE+7B,KAECC,SAAUp4B,GAAY,SAAUy3B,EAAOY,GACzC3f,EAAK3Y,KAAMC,EAAUk4B,IAAcT,EAAMU,aAAcE,EAAQZ,MAI1Dn5B,MAIRtD,EAAO+E,MAAQ,YAAa,WAAY,eAAgB,YAAa,cAAe,YAAc,SAAUU,EAAG9C,GAC9G3C,EAAOsB,GAAIqB,GAAS,SAAUrB,GAC7B,MAAOgC,MAAK6qB,GAAIxrB,EAAMrB,MAIxBtB,EAAOgG,QAGNs3B,OAAQ,EAGRC,gBACAC,QAEA9C,cACC7F,IAAKwG,GACL14B,KAAM,MACN86B,QAAS9B,GAAe53B,KAAMq3B,GAAc,IAC5C/S,QAAQ,EACRqV,aAAa,EACb/zB,OAAO,EACPg0B,YAAa,mDAabC,SACCC,IAAK3B,GACL3xB,KAAM,aACNuoB,KAAM,YACNxpB,IAAK,4BACLw0B,KAAM,qCAGPnP,UACCrlB,IAAK,MACLwpB,KAAM,OACNgL,KAAM,QAGPC,gBACCz0B,IAAK,cACLiB,KAAM,eACNuzB,KAAM,gBAKPE,YAGCC,SAAUj2B,OAGVk2B,aAAa,EAGbC,YAAan+B,EAAOiJ,UAGpBm1B,WAAYp+B,EAAOqJ,UAOpB2zB,aACCnI,KAAK,EACLxzB,SAAS,IAOXg9B,UAAW,SAAU93B,EAAQ+3B,GAC5B,MAAOA,GAGNvB,GAAYA,GAAYx2B,EAAQvG,EAAO06B,cAAgB4D,GAGvDvB,GAAY/8B,EAAO06B,aAAcn0B,IAGnCg4B,cAAepC,GAA6BH,IAC5CwC,cAAerC,GAA6BF,IAG5CnH,KAAM,SAAUD,EAAKxuB,GAGA,gBAARwuB,KACXxuB,EAAUwuB,EACVA,EAAMt1B,GAIP8G,EAAUA,KAEV,IACC0zB,GAEAt0B,EAEAg5B,EAEAC,EAEAC,EAGAC,EAEAC,EAEAC,EAEAtE,EAAIx6B,EAAOq+B,aAAeh4B,GAE1B04B,EAAkBvE,EAAEn5B,SAAWm5B,EAE/BwE,EAAqBxE,EAAEn5B,UAAa09B,EAAgBl7B,UAAYk7B,EAAgB77B,QAC/ElD,EAAQ++B,GACR/+B,EAAOyC,MAER4b,EAAWre,EAAOgM,WAClBizB,EAAmBj/B,EAAO8c,UAAU,eAEpCoiB,EAAa1E,EAAE0E,eAEfC,KACAC,KAEAjhB,EAAQ,EAERkhB,EAAW,WAEX5C,GACC75B,WAAY,EAGZ08B,kBAAmB,SAAUr3B,GAC5B,GAAI7E,EACJ,IAAe,IAAV+a,EAAc,CAClB,IAAM2gB,EAAkB,CACvBA,IACA,OAAS17B,EAAQs4B,GAASj4B,KAAMi7B,GAC/BI,EAAiB17B,EAAM,GAAGgH,eAAkBhH,EAAO,GAGrDA,EAAQ07B,EAAiB72B,EAAImC,eAE9B,MAAgB,OAAThH,EAAgB,KAAOA,GAI/Bm8B,sBAAuB,WACtB,MAAiB,KAAVphB,EAAcugB,EAAwB,MAI9Cc,iBAAkB,SAAUp5B,EAAMiE,GACjC,GAAIo1B,GAAQr5B,EAAKgE,aAKjB,OAJM+T,KACL/X,EAAOg5B,EAAqBK,GAAUL,EAAqBK,IAAWr5B,EACtE+4B,EAAgB/4B,GAASiE,GAEnB/G,MAIRo8B,iBAAkB,SAAU/8B,GAI3B,MAHMwb,KACLqc,EAAEmF,SAAWh9B,GAEPW,MAIR47B,WAAY,SAAUt5B,GACrB,GAAIg6B,EACJ,IAAKh6B,EACJ,GAAa,EAARuY,EACJ,IAAMyhB,IAAQh6B,GAEbs5B,EAAYU,IAAWV,EAAYU,GAAQh6B,EAAKg6B,QAIjDnD,GAAMre,OAAQxY,EAAK62B,EAAMY,QAG3B,OAAO/5B,OAIRu8B,MAAO,SAAUC,GAChB,GAAIC,GAAYD,GAAcT,CAK9B,OAJKR,IACJA,EAAUgB,MAAOE,GAElB56B,EAAM,EAAG46B,GACFz8B,MAwCV,IAnCA+a,EAASnZ,QAASu3B,GAAQW,SAAW6B,EAAiBrhB,IACtD6e,EAAMuD,QAAUvD,EAAMt3B,KACtBs3B,EAAMn0B,MAAQm0B,EAAMne,KAMpBkc,EAAE3F,MAAUA,GAAO2F,EAAE3F,KAAOwG,IAAiB,IAAKx0B,QAAS20B,GAAO,IAAK30B,QAASg1B,GAAWT,GAAc,GAAM,MAG/GZ,EAAE73B,KAAO0D,EAAQ45B,QAAU55B,EAAQ1D,MAAQ63B,EAAEyF,QAAUzF,EAAE73B,KAGzD63B,EAAE8B,UAAYt8B,EAAOmB,KAAMq5B,EAAEzF,UAAY,KAAM3qB,cAAchH,MAAO1B,KAAqB,IAGnE,MAAjB84B,EAAE0F,cACNnG,EAAQ+B,GAAKr4B,KAAM+2B,EAAE3F,IAAIzqB,eACzBowB,EAAE0F,eAAkBnG,GACjBA,EAAO,KAAQqB,GAAc,IAAOrB,EAAO,KAAQqB,GAAc,KAChErB,EAAO,KAAwB,UAAfA,EAAO,GAAkB,KAAO,WAC/CqB,GAAc,KAA+B,UAAtBA,GAAc,GAAkB,KAAO,UAK/DZ,EAAE/xB,MAAQ+xB,EAAEkD,aAAiC,gBAAXlD,GAAE/xB,OACxC+xB,EAAE/xB,KAAOzI,EAAOqxB,MAAOmJ,EAAE/xB,KAAM+xB,EAAED,cAIlCgC,GAA+BP,GAAYxB,EAAGn0B,EAASo2B,GAGxC,IAAVte,EACJ,MAAOse,EAIRmC,GAAcpE,EAAEnS,OAGXuW,GAAmC,IAApB5+B,EAAOs9B,UAC1Bt9B,EAAOyC,MAAM8E,QAAQ,aAItBizB,EAAE73B,KAAO63B,EAAE73B,KAAKJ,cAGhBi4B,EAAE2F,YAAcvE,GAAW73B,KAAMy2B,EAAE73B,MAInC87B,EAAWjE,EAAE3F,IAGP2F,EAAE2F,aAGF3F,EAAE/xB,OACNg2B,EAAajE,EAAE3F,MAAS0G,GAAYx3B,KAAM06B,GAAa,IAAM,KAAQjE,EAAE/xB,WAEhE+xB,GAAE/xB,MAIL+xB,EAAEhpB,SAAU,IAChBgpB,EAAE3F,IAAM4G,GAAI13B,KAAM06B,GAGjBA,EAAS53B,QAAS40B,GAAK,OAASH,MAGhCmD,GAAalD,GAAYx3B,KAAM06B,GAAa,IAAM,KAAQ,KAAOnD,OAK/Dd,EAAE4F,aACDpgC,EAAOu9B,aAAckB,IACzBhC,EAAM+C,iBAAkB,oBAAqBx/B,EAAOu9B,aAAckB,IAE9Dz+B,EAAOw9B,KAAMiB,IACjBhC,EAAM+C,iBAAkB,gBAAiBx/B,EAAOw9B,KAAMiB,MAKnDjE,EAAE/xB,MAAQ+xB,EAAE2F,YAAc3F,EAAEmD,eAAgB,GAASt3B,EAAQs3B,cACjElB,EAAM+C,iBAAkB,eAAgBhF,EAAEmD,aAI3ClB,EAAM+C,iBACL,SACAhF,EAAE8B,UAAW,IAAO9B,EAAEoD,QAASpD,EAAE8B,UAAU,IAC1C9B,EAAEoD,QAASpD,EAAE8B,UAAU,KAA8B,MAArB9B,EAAE8B,UAAW,GAAc,KAAOJ,GAAW,WAAa,IAC1F1B,EAAEoD,QAAS,KAIb,KAAMn4B,IAAK+0B,GAAE6F,QACZ5D,EAAM+C,iBAAkB/5B,EAAG+0B,EAAE6F,QAAS56B,GAIvC,IAAK+0B,EAAE8F,aAAgB9F,EAAE8F,WAAW97B,KAAMu6B,EAAiBtC,EAAOjC,MAAQ,GAAmB,IAAVrc,GAElF,MAAOse,GAAMoD,OAIdR,GAAW,OAGX,KAAM55B,KAAOu6B,QAAS,EAAG13B,MAAO,EAAG80B,SAAU,GAC5CX,EAAOh3B,GAAK+0B,EAAG/0B,GAOhB,IAHAo5B,EAAYtC,GAA+BN,GAAYzB,EAAGn0B,EAASo2B,GAK5D,CACNA,EAAM75B,WAAa,EAGdg8B,GACJI,EAAmBz3B,QAAS,YAAck1B,EAAOjC,IAG7CA,EAAE7wB,OAAS6wB,EAAE1V,QAAU,IAC3B6Z,EAAet3B,WAAW,WACzBo1B,EAAMoD,MAAM,YACVrF,EAAE1V,SAGN,KACC3G,EAAQ,EACR0gB,EAAU0B,KAAMpB,EAAgBh6B,GAC/B,MAAQ+C,GAET,KAAa,EAARiW,GAIJ,KAAMjW,EAHN/C,GAAM,GAAI+C,QArBZ/C,GAAM,GAAI,eA8BX,SAASA,GAAMk4B,EAAQmD,EAAkBC,EAAWJ,GACnD,GAAIK,GAAWV,EAAS13B,EAAO40B,EAAUyD,EACxCb,EAAaU,CAGC,KAAVriB,IAKLA,EAAQ,EAGHwgB,GACJ5Z,aAAc4Z,GAKfE,EAAYt/B,EAGZm/B,EAAwB2B,GAAW,GAGnC5D,EAAM75B,WAAay6B,EAAS,EAAI,EAAI,EAGpCqD,EAAYrD,GAAU,KAAgB,IAATA,GAA2B,MAAXA,EAGxCoD,IACJvD,EAAW0D,GAAqBpG,EAAGiC,EAAOgE,IAI3CvD,EAAW2D,GAAarG,EAAG0C,EAAUT,EAAOiE,GAGvCA,GAGClG,EAAE4F,aACNO,EAAWlE,EAAM6C,kBAAkB,iBAC9BqB,IACJ3gC,EAAOu9B,aAAckB,GAAakC,GAEnCA,EAAWlE,EAAM6C,kBAAkB,QAC9BqB,IACJ3gC,EAAOw9B,KAAMiB,GAAakC,IAKZ,MAAXtD,GAA6B,SAAX7C,EAAE73B,KACxBm9B,EAAa,YAGS,MAAXzC,EACXyC,EAAa,eAIbA,EAAa5C,EAAS/e,MACtB6hB,EAAU9C,EAASz0B,KACnBH,EAAQ40B,EAAS50B,MACjBo4B,GAAap4B,KAKdA,EAAQw3B,GACHzC,IAAWyC,KACfA,EAAa,QACC,EAATzC,IACJA,EAAS,KAMZZ,EAAMY,OAASA,EACfZ,EAAMqD,YAAeU,GAAoBV,GAAe,GAGnDY,EACJriB,EAAS/W,YAAay3B,GAAmBiB,EAASF,EAAYrD,IAE9Dpe,EAASyiB,WAAY/B,GAAmBtC,EAAOqD,EAAYx3B,IAI5Dm0B,EAAMyC,WAAYA,GAClBA,EAAa3/B,EAERq/B,GACJI,EAAmBz3B,QAASm5B,EAAY,cAAgB,aACrDjE,EAAOjC,EAAGkG,EAAYV,EAAU13B,IAIpC22B,EAAiBjhB,SAAU+gB,GAAmBtC,EAAOqD,IAEhDlB,IACJI,EAAmBz3B,QAAS,gBAAkBk1B,EAAOjC,MAE3Cx6B,EAAOs9B,QAChBt9B,EAAOyC,MAAM8E,QAAQ,cAKxB,MAAOk1B,IAGRsE,QAAS,SAAUlM,EAAKpsB,EAAMzD,GAC7B,MAAOhF,GAAOyE,IAAKowB,EAAKpsB,EAAMzD,EAAU,SAGzCg8B,UAAW,SAAUnM,EAAK7vB,GACzB,MAAOhF,GAAOyE,IAAKowB,EAAKt1B,EAAWyF,EAAU,aAI/ChF,EAAO+E,MAAQ,MAAO,QAAU,SAAUU,EAAGw6B,GAC5CjgC,EAAQigC,GAAW,SAAUpL,EAAKpsB,EAAMzD,EAAUrC,GAQjD,MANK3C,GAAOiE,WAAYwE,KACvB9F,EAAOA,GAAQqC,EACfA,EAAWyD,EACXA,EAAOlJ,GAGDS,EAAO80B,MACbD,IAAKA,EACLlyB,KAAMs9B,EACNlL,SAAUpyB,EACV8F,KAAMA,EACNu3B,QAASh7B,MASZ,SAAS47B,IAAqBpG,EAAGiC,EAAOgE,GACvC,GAAIQ,GAAeC,EAAIC,EAAex+B,EACrCgsB,EAAW6L,EAAE7L,SACb2N,EAAY9B,EAAE8B,SAGf,OAA0B,MAAnBA,EAAW,GACjBA,EAAU5qB,QACLwvB,IAAO3hC,IACX2hC,EAAK1G,EAAEmF,UAAYlD,EAAM6C,kBAAkB,gBAK7C,IAAK4B,EACJ,IAAMv+B,IAAQgsB,GACb,GAAKA,EAAUhsB,IAAUgsB,EAAUhsB,GAAOoB,KAAMm9B,GAAO,CACtD5E,EAAU3nB,QAAShS,EACnB,OAMH,GAAK25B,EAAW,IAAOmE,GACtBU,EAAgB7E,EAAW,OACrB,CAEN,IAAM35B,IAAQ89B,GAAY,CACzB,IAAMnE,EAAW,IAAO9B,EAAEwD,WAAYr7B,EAAO,IAAM25B,EAAU,IAAO,CACnE6E,EAAgBx+B,CAChB,OAEKs+B,IACLA,EAAgBt+B,GAIlBw+B,EAAgBA,GAAiBF,EAMlC,MAAKE,IACCA,IAAkB7E,EAAW,IACjCA,EAAU3nB,QAASwsB,GAEbV,EAAWU,IAJnB,EAWD,QAASN,IAAarG,EAAG0C,EAAUT,EAAOiE,GACzC,GAAIU,GAAOC,EAASC,EAAM/3B,EAAKqlB,EAC9BoP,KAEA1B,EAAY9B,EAAE8B,UAAU37B,OAGzB,IAAK27B,EAAW,GACf,IAAMgF,IAAQ9G,GAAEwD,WACfA,EAAYsD,EAAKl3B,eAAkBowB,EAAEwD,WAAYsD,EAInDD,GAAU/E,EAAU5qB,OAGpB,OAAQ2vB,EAcP,GAZK7G,EAAEuD,eAAgBsD,KACtB5E,EAAOjC,EAAEuD,eAAgBsD,IAAcnE,IAIlCtO,GAAQ8R,GAAalG,EAAE+G,aAC5BrE,EAAW1C,EAAE+G,WAAYrE,EAAU1C,EAAEzF,WAGtCnG,EAAOyS,EACPA,EAAU/E,EAAU5qB,QAKnB,GAAiB,MAAZ2vB,EAEJA,EAAUzS,MAGJ,IAAc,MAATA,GAAgBA,IAASyS,EAAU,CAM9C,GAHAC,EAAOtD,EAAYpP,EAAO,IAAMyS,IAAarD,EAAY,KAAOqD,IAG1DC,EACL,IAAMF,IAASpD,GAId,GADAz0B,EAAM63B,EAAM90B,MAAO,KACd/C,EAAK,KAAQ83B,IAGjBC,EAAOtD,EAAYpP,EAAO,IAAMrlB,EAAK,KACpCy0B,EAAY,KAAOz0B,EAAK,KACb,CAEN+3B,KAAS,EACbA,EAAOtD,EAAYoD,GAGRpD,EAAYoD,MAAY,IACnCC,EAAU93B,EAAK,GACf+yB,EAAU3nB,QAASpL,EAAK,IAEzB,OAOJ,GAAK+3B,KAAS,EAGb,GAAKA,GAAQ9G,EAAG,UACf0C,EAAWoE,EAAMpE,OAEjB,KACCA,EAAWoE,EAAMpE,GAChB,MAAQh1B,GACT,OAASiW,MAAO,cAAe7V,MAAOg5B,EAAOp5B,EAAI,sBAAwB0mB,EAAO,OAASyS,IAQ/F,OAASljB,MAAO,UAAW1V,KAAMy0B,GAGlCl9B,EAAOq+B,WACNT,SACC4D,OAAQ,6FAET7S,UACC6S,OAAQ,uBAETxD,YACCyD,cAAe,SAAUl3B,GAExB,MADAvK,GAAO+J,WAAYQ,GACZA,MAMVvK,EAAOu+B,cAAe,SAAU,SAAU/D,GACpCA,EAAEhpB,QAAUjS,IAChBi7B,EAAEhpB,OAAQ,GAENgpB,EAAE0F,cACN1F,EAAE73B,KAAO,MACT63B,EAAEnS,QAAS,KAKbroB,EAAOw+B,cAAe,SAAU,SAAShE,GAGxC,GAAKA,EAAE0F,YAAc,CAEpB,GAAIsB,GACHE,EAAO9hC,EAAS8hC,MAAQ1hC,EAAO,QAAQ,IAAMJ,EAASE,eAEvD,QAECygC,KAAM,SAAUxwB,EAAG/K,GAElBw8B,EAAS5hC,EAASiJ,cAAc,UAEhC24B,EAAO73B,OAAQ,EAEV6wB,EAAEmH,gBACNH,EAAOI,QAAUpH,EAAEmH,eAGpBH,EAAOv7B,IAAMu0B,EAAE3F,IAGf2M,EAAOK,OAASL,EAAOM,mBAAqB,SAAU/xB,EAAGgyB,IAEnDA,IAAYP,EAAO5+B,YAAc,kBAAkBmB,KAAMy9B,EAAO5+B,eAGpE4+B,EAAOK,OAASL,EAAOM,mBAAqB,KAGvCN,EAAOp9B,YACXo9B,EAAOp9B,WAAW0N,YAAa0vB,GAIhCA,EAAS,KAGHO,GACL/8B,EAAU,IAAK,aAOlB08B,EAAKpP,aAAckP,EAAQE,EAAKruB,aAGjCwsB,MAAO,WACD2B,GACJA,EAAOK,OAAQtiC,GAAW,OAM/B,IAAIyiC,OACHC,GAAS,mBAGVjiC,GAAOq+B,WACN6D,MAAO,WACPC,cAAe,WACd,GAAIn9B,GAAWg9B,GAAa/zB,OAAWjO,EAAO0G,QAAU,IAAQ40B,IAEhE,OADAh4B,MAAM0B,IAAa,EACZA,KAKThF,EAAOu+B,cAAe,aAAc,SAAU/D,EAAG4H,EAAkB3F,GAElE,GAAI4F,GAAcC,EAAaC,EAC9BC,EAAWhI,EAAE0H,SAAU,IAAWD,GAAOl+B,KAAMy2B,EAAE3F,KAChD,MACkB,gBAAX2F,GAAE/xB,QAAwB+xB,EAAEmD,aAAe,IAAK98B,QAAQ,sCAAwCohC,GAAOl+B,KAAMy2B,EAAE/xB,OAAU,OAIlI,OAAK+5B,IAAiC,UAArBhI,EAAE8B,UAAW,IAG7B+F,EAAe7H,EAAE2H,cAAgBniC,EAAOiE,WAAYu2B,EAAE2H,eACrD3H,EAAE2H,gBACF3H,EAAE2H,cAGEK,EACJhI,EAAGgI,GAAahI,EAAGgI,GAAW37B,QAASo7B,GAAQ,KAAOI,GAC3C7H,EAAE0H,SAAU,IACvB1H,EAAE3F,MAAS0G,GAAYx3B,KAAMy2B,EAAE3F,KAAQ,IAAM,KAAQ2F,EAAE0H,MAAQ,IAAMG,GAItE7H,EAAEwD,WAAW,eAAiB,WAI7B,MAHMuE,IACLviC,EAAOsI,MAAO+5B,EAAe,mBAEvBE,EAAmB,IAI3B/H,EAAE8B,UAAW,GAAM,OAGnBgG,EAAchjC,EAAQ+iC,GACtB/iC,EAAQ+iC,GAAiB,WACxBE,EAAoBl9B,WAIrBo3B,EAAMre,OAAO,WAEZ9e,EAAQ+iC,GAAiBC,EAGpB9H,EAAG6H,KAEP7H,EAAE2H,cAAgBC,EAAiBD,cAGnCH,GAAavhC,KAAM4hC,IAIfE,GAAqBviC,EAAOiE,WAAYq+B,IAC5CA,EAAaC,EAAmB,IAGjCA,EAAoBD,EAAc/iC,IAI5B,UAtDR,GAyDD,IAAIkjC,IAAcC,GACjBC,GAAQ,EAERC,GAAmBtjC,EAAOoK,eAAiB,WAE1C,GAAIzB,EACJ,KAAMA,IAAOw6B,IACZA,GAAcx6B,GAAO1I,GAAW,GAKnC,SAASsjC,MACR,IACC,MAAO,IAAIvjC,GAAOwjC,eACjB,MAAO56B,KAGV,QAAS66B,MACR,IACC,MAAO,IAAIzjC,GAAOoK,cAAc,qBAC/B,MAAOxB,KAKVlI,EAAO06B,aAAasI,IAAM1jC,EAAOoK,cAOhC,WACC,OAAQpG,KAAKm6B,SAAWoF,MAAuBE,MAGhDF,GAGDH,GAAe1iC,EAAO06B,aAAasI,MACnChjC,EAAOmI,QAAQ86B,OAASP,IAAkB,mBAAqBA,IAC/DA,GAAe1iC,EAAOmI,QAAQ2sB,OAAS4N,GAGlCA,IAEJ1iC,EAAOw+B,cAAc,SAAUhE,GAE9B,IAAMA,EAAE0F,aAAelgC,EAAOmI,QAAQ86B,KAAO,CAE5C,GAAIj+B,EAEJ,QACCu7B,KAAM,SAAUF,EAASjD,GAGxB,GAAInU,GAAQxjB,EACXu9B,EAAMxI,EAAEwI,KAWT,IAPKxI,EAAE0I,SACNF,EAAIG,KAAM3I,EAAE73B,KAAM63B,EAAE3F,IAAK2F,EAAE7wB,MAAO6wB,EAAE0I,SAAU1I,EAAExhB,UAEhDgqB,EAAIG,KAAM3I,EAAE73B,KAAM63B,EAAE3F,IAAK2F,EAAE7wB,OAIvB6wB,EAAE4I,UACN,IAAM39B,IAAK+0B,GAAE4I,UACZJ,EAAKv9B,GAAM+0B,EAAE4I,UAAW39B,EAKrB+0B,GAAEmF,UAAYqD,EAAItD,kBACtBsD,EAAItD,iBAAkBlF,EAAEmF,UAQnBnF,EAAE0F,aAAgBG,EAAQ,sBAC/BA,EAAQ,oBAAsB,iBAI/B,KACC,IAAM56B,IAAK46B,GACV2C,EAAIxD,iBAAkB/5B,EAAG46B,EAAS56B,IAElC,MAAO2iB,IAKT4a,EAAIzC,KAAQ/F,EAAE2F,YAAc3F,EAAE/xB,MAAU,MAGxCzD,EAAW,SAAU+K,EAAGgyB,GACvB,GAAI1E,GAAQyB,EAAiBgB,EAAYW,CAKzC,KAGC,GAAKz7B,IAAc+8B,GAA8B,IAAnBiB,EAAIpgC,YAcjC,GAXAoC,EAAWzF,EAGN0pB,IACJ+Z,EAAIlB,mBAAqB9hC,EAAO8J,KAC3B84B,UACGH,IAAcxZ,IAKlB8Y,EAEoB,IAAnBiB,EAAIpgC,YACRogC,EAAInD,YAEC,CACNY,KACApD,EAAS2F,EAAI3F,OACbyB,EAAkBkE,EAAIzD,wBAIW,gBAArByD,GAAI7F,eACfsD,EAAUl2B,KAAOy4B,EAAI7F,aAKtB,KACC2C,EAAakD,EAAIlD,WAChB,MAAO53B,GAER43B,EAAa,GAQRzC,IAAU7C,EAAEiD,SAAYjD,EAAE0F,YAGT,OAAX7C,IACXA,EAAS,KAHTA,EAASoD,EAAUl2B,KAAO,IAAM,KAOlC,MAAO84B,GACFtB,GACL3E,EAAU,GAAIiG,GAKX5C,GACJrD,EAAUC,EAAQyC,EAAYW,EAAW3B,IAIrCtE,EAAE7wB,MAGuB,IAAnBq5B,EAAIpgC,WAGfyE,WAAYrC,IAEZikB,IAAW0Z,GACNC,KAGEH,KACLA,MACAziC,EAAQV,GAASgkC,OAAQV,KAG1BH,GAAcxZ,GAAWjkB,GAE1Bg+B,EAAIlB,mBAAqB98B,GAjBzBA,KAqBF66B,MAAO,WACD76B,GACJA,EAAUzF,GAAW,OAO3B,IAAIgkC,IAAOC,GACVC,GAAW,yBACXC,GAAaj1B,OAAQ,iBAAmBjN,EAAY,cAAe,KACnEmiC,GAAO,cACPC,IAAwBC,IACxBC,IACCjG,KAAM,SAAUjY,EAAMvb,GACrB,GAAI05B,GAAQzgC,KAAK0gC,YAAape,EAAMvb,GACnC9D,EAASw9B,EAAM3xB,MACf2nB,EAAQ2J,GAAOjgC,KAAM4G,GACrB45B,EAAOlK,GAASA,EAAO,KAAS/5B,EAAOw3B,UAAW5R,GAAS,GAAK,MAGhEhP,GAAU5W,EAAOw3B,UAAW5R,IAAmB,OAATqe,IAAkB19B,IACvDm9B,GAAOjgC,KAAMzD,EAAO82B,IAAKiN,EAAM1gC,KAAMuiB,IACtCse,EAAQ,EACRC,EAAgB,EAEjB,IAAKvtB,GAASA,EAAO,KAAQqtB,EAAO,CAEnCA,EAAOA,GAAQrtB,EAAO,GAGtBmjB,EAAQA,MAGRnjB,GAASrQ,GAAU,CAEnB,GAGC29B,GAAQA,GAAS,KAGjBttB,GAAgBstB,EAChBlkC,EAAO+L,MAAOg4B,EAAM1gC,KAAMuiB,EAAMhP,EAAQqtB,SAI/BC,KAAWA,EAAQH,EAAM3xB,MAAQ7L,IAAqB,IAAV29B,KAAiBC,GAaxE,MATKpK,KACJnjB,EAAQmtB,EAAMntB,OAASA,IAAUrQ,GAAU,EAC3Cw9B,EAAME,KAAOA,EAEbF,EAAMl+B,IAAMk0B,EAAO,GAClBnjB,GAAUmjB,EAAO,GAAM,GAAMA,EAAO,IACnCA,EAAO,IAGHgK,IAKV,SAASK,MAIR,MAHA/8B,YAAW,WACVk8B,GAAQhkC,IAEAgkC,GAAQvjC,EAAO0L,MAGzB,QAASs4B,IAAa35B,EAAOub,EAAMye,GAClC,GAAIN,GACHO,GAAeR,GAAUle,QAAerlB,OAAQujC,GAAU,MAC1DjmB,EAAQ,EACRra,EAAS8gC,EAAW9gC,MACrB,MAAgBA,EAARqa,EAAgBA,IACvB,GAAMkmB,EAAQO,EAAYzmB,GAAQrZ,KAAM6/B,EAAWze,EAAMvb,GAGxD,MAAO05B,GAKV,QAASQ,IAAWlhC,EAAMmhC,EAAYn+B,GACrC,GAAIgQ,GACHouB,EACA5mB,EAAQ,EACRra,EAASogC,GAAoBpgC,OAC7B6a,EAAWre,EAAOgM,WAAWoS,OAAQ,iBAE7BsmB,GAAKrhC,OAEbqhC,EAAO,WACN,GAAKD,EACJ,OAAO,CAER,IAAIE,GAAcpB,IAASa,KAC1B9kB,EAAY3Y,KAAKiE,IAAK,EAAGy5B,EAAUO,UAAYP,EAAUQ,SAAWF,GAEpElqB,EAAO6E,EAAY+kB,EAAUQ,UAAY,EACzCC,EAAU,EAAIrqB,EACdoD,EAAQ,EACRra,EAAS6gC,EAAUU,OAAOvhC,MAE3B,MAAgBA,EAARqa,EAAiBA,IACxBwmB,EAAUU,OAAQlnB,GAAQmnB,IAAKF,EAKhC,OAFAzmB,GAASqB,WAAYrc,GAAQghC,EAAWS,EAASxlB,IAElC,EAAVwlB,GAAethC,EACZ8b,GAEPjB,EAAS/W,YAAajE,GAAQghC,KACvB,IAGTA,EAAYhmB,EAASnZ,SACpB7B,KAAMA,EACNmoB,MAAOxrB,EAAOgG,UAAYw+B,GAC1BS,KAAMjlC,EAAOgG,QAAQ,GAAQk/B,kBAAqB7+B,GAClD8+B,mBAAoBX,EACpBhI,gBAAiBn2B,EACjBu+B,UAAWrB,IAASa,KACpBS,SAAUx+B,EAAQw+B,SAClBE,UACAf,YAAa,SAAUpe,EAAM/f,GAC5B,GAAIk+B,GAAQ/jC,EAAOolC,MAAO/hC,EAAMghC,EAAUY,KAAMrf,EAAM/f,EACpDw+B,EAAUY,KAAKC,cAAetf,IAAUye,EAAUY,KAAKI,OAEzD,OADAhB,GAAUU,OAAOtkC,KAAMsjC,GAChBA,GAERvf,KAAM,SAAU8gB,GACf,GAAIznB,GAAQ,EAGXra,EAAS8hC,EAAUjB,EAAUU,OAAOvhC,OAAS,CAC9C,IAAKihC,EACJ,MAAOnhC,KAGR,KADAmhC,GAAU,EACMjhC,EAARqa,EAAiBA,IACxBwmB,EAAUU,OAAQlnB,GAAQmnB,IAAK,EAUhC,OALKM,GACJjnB,EAAS/W,YAAajE,GAAQghC,EAAWiB,IAEzCjnB,EAASyiB,WAAYz9B,GAAQghC,EAAWiB,IAElChiC,QAGTkoB,EAAQ6Y,EAAU7Y,KAInB,KAFA+Z,GAAY/Z,EAAO6Y,EAAUY,KAAKC,eAElB1hC,EAARqa,EAAiBA,IAExB,GADAxH,EAASutB,GAAqB/lB,GAAQrZ,KAAM6/B,EAAWhhC,EAAMmoB,EAAO6Y,EAAUY,MAE7E,MAAO5uB,EAmBT,OAfArW,GAAO4F,IAAK4lB,EAAOwY,GAAaK,GAE3BrkC,EAAOiE,WAAYogC,EAAUY,KAAKruB,QACtCytB,EAAUY,KAAKruB,MAAMpS,KAAMnB,EAAMghC,GAGlCrkC,EAAO4kB,GAAG4gB,MACTxlC,EAAOgG,OAAQ0+B,GACdrhC,KAAMA,EACNoiC,KAAMpB,EACNngB,MAAOmgB,EAAUY,KAAK/gB,SAKjBmgB,EAAUtlB,SAAUslB,EAAUY,KAAKlmB,UACxC5Z,KAAMk/B,EAAUY,KAAK9/B,KAAMk/B,EAAUY,KAAK7H,UAC1C9e,KAAM+lB,EAAUY,KAAK3mB,MACrBF,OAAQimB,EAAUY,KAAK7mB,QAG1B,QAASmnB,IAAY/Z,EAAO0Z,GAC3B,GAAIrnB,GAAOzX,EAAMi/B,EAAQh7B,EAAOga,CAGhC,KAAMxG,IAAS2N,GAed,GAdAplB,EAAOpG,EAAOiK,UAAW4T,GACzBwnB,EAASH,EAAe9+B,GACxBiE,EAAQmhB,EAAO3N,GACV7d,EAAOyG,QAAS4D,KACpBg7B,EAASh7B,EAAO,GAChBA,EAAQmhB,EAAO3N,GAAUxT,EAAO,IAG5BwT,IAAUzX,IACdolB,EAAOplB,GAASiE,QACTmhB,GAAO3N,IAGfwG,EAAQrkB,EAAOs3B,SAAUlxB,GACpBie,GAAS,UAAYA,GAAQ,CACjCha,EAAQga,EAAMwV,OAAQxvB,SACfmhB,GAAOplB,EAId,KAAMyX,IAASxT,GACNwT,IAAS2N,KAChBA,EAAO3N,GAAUxT,EAAOwT,GACxBqnB,EAAernB,GAAUwnB,OAI3BH,GAAe9+B,GAASi/B,EAK3BrlC,EAAOukC,UAAYvkC,EAAOgG,OAAQu+B,IAEjCmB,QAAS,SAAUla,EAAOxmB,GACpBhF,EAAOiE,WAAYunB,IACvBxmB,EAAWwmB,EACXA,GAAU,MAEVA,EAAQA,EAAMlf,MAAM,IAGrB,IAAIsZ,GACH/H,EAAQ,EACRra,EAASgoB,EAAMhoB,MAEhB,MAAgBA,EAARqa,EAAiBA,IACxB+H,EAAO4F,EAAO3N,GACdimB,GAAUle,GAASke,GAAUle,OAC7Bke,GAAUle,GAAOjR,QAAS3P,IAI5B2gC,UAAW,SAAU3gC,EAAUqtB,GACzBA,EACJuR,GAAoBjvB,QAAS3P,GAE7B4+B,GAAoBnjC,KAAMuE,KAK7B,SAAS6+B,IAAkBxgC,EAAMmoB,EAAOyZ,GAEvC,GAAIrf,GAAMvb,EAAOgtB,EAAQ0M,EAAO1f,EAAOuhB,EACtCH,EAAOniC,KACPmqB,KACA1hB,EAAQ1I,EAAK0I,MACbkrB,EAAS5zB,EAAKQ,UAAY+yB,GAAUvzB,GACpCwiC,EAAW7lC,EAAO+jB,MAAO1gB,EAAM,SAG1B4hC,GAAK/gB,QACVG,EAAQrkB,EAAOskB,YAAajhB,EAAM,MACX,MAAlBghB,EAAMyhB,WACVzhB,EAAMyhB,SAAW,EACjBF,EAAUvhB,EAAM/L,MAAMkF,KACtB6G,EAAM/L,MAAMkF,KAAO,WACZ6G,EAAMyhB,UACXF,MAIHvhB,EAAMyhB,WAENL,EAAKrnB,OAAO,WAGXqnB,EAAKrnB,OAAO,WACXiG,EAAMyhB,WACA9lC,EAAOkkB,MAAO7gB,EAAM,MAAOG,QAChC6gB,EAAM/L,MAAMkF,YAOO,IAAlBna,EAAKQ,WAAoB,UAAY2nB,IAAS,SAAWA,MAK7DyZ,EAAKc,UAAah6B,EAAMg6B,SAAUh6B,EAAMi6B,UAAWj6B,EAAMk6B,WAIlB,WAAlCjmC,EAAO82B,IAAKzzB,EAAM,YACW,SAAhCrD,EAAO82B,IAAKzzB,EAAM,WAIbrD,EAAOmI,QAAQ4Y,wBAAkE,WAAxCmW,GAAoB7zB,EAAK8G,UAIvE4B,EAAMyW,KAAO,EAHbzW,EAAMuW,QAAU,iBAQd2iB,EAAKc,WACTh6B,EAAMg6B,SAAW,SACX/lC,EAAOmI,QAAQ6Y,kBACpBykB,EAAKrnB,OAAO,WACXrS,EAAMg6B,SAAWd,EAAKc,SAAU,GAChCh6B,EAAMi6B,UAAYf,EAAKc,SAAU,GACjCh6B,EAAMk6B,UAAYhB,EAAKc,SAAU,KAOpC,KAAMngB,IAAQ4F,GAEb,GADAnhB,EAAQmhB,EAAO5F,GACV6d,GAAShgC,KAAM4G,GAAU,CAG7B,SAFOmhB,GAAO5F,GACdyR,EAASA,GAAoB,WAAVhtB,EACdA,KAAY4sB,EAAS,OAAS,QAClC,QAEDxJ,GAAM7H,GAASigB,GAAYA,EAAUjgB,IAAU5lB,EAAO+L,MAAO1I,EAAMuiB,GAIrE,IAAM5lB,EAAOqI,cAAeolB,GAAS,CAC/BoY,EACC,UAAYA,KAChB5O,EAAS4O,EAAS5O,QAGnB4O,EAAW7lC,EAAO+jB,MAAO1gB,EAAM,aAI3Bg0B,IACJwO,EAAS5O,QAAUA,GAEfA,EACJj3B,EAAQqD,GAAO2zB,OAEfyO,EAAKtgC,KAAK,WACTnF,EAAQqD,GAAO+zB,SAGjBqO,EAAKtgC,KAAK,WACT,GAAIygB,EACJ5lB,GAAOgkB,YAAa3gB,EAAM,SAC1B,KAAMuiB,IAAQ6H,GACbztB,EAAO+L,MAAO1I,EAAMuiB,EAAM6H,EAAM7H,KAGlC,KAAMA,IAAQ6H,GACbsW,EAAQC,GAAa/M,EAAS4O,EAAUjgB,GAAS,EAAGA,EAAM6f,GAElD7f,IAAQigB,KACfA,EAAUjgB,GAASme,EAAMntB,MACpBqgB,IACJ8M,EAAMl+B,IAAMk+B,EAAMntB,MAClBmtB,EAAMntB,MAAiB,UAATgP,GAA6B,WAATA,EAAoB,EAAI,KAO/D,QAASwf,IAAO/hC,EAAMgD,EAASuf,EAAM/f,EAAKw/B,GACzC,MAAO,IAAID,IAAMniC,UAAU1B,KAAM8B,EAAMgD,EAASuf,EAAM/f,EAAKw/B,GAE5DrlC,EAAOolC,MAAQA,GAEfA,GAAMniC,WACLE,YAAaiiC,GACb7jC,KAAM,SAAU8B,EAAMgD,EAASuf,EAAM/f,EAAKw/B,EAAQpB,GACjD3gC,KAAKD,KAAOA,EACZC,KAAKsiB,KAAOA,EACZtiB,KAAK+hC,OAASA,GAAU,QACxB/hC,KAAK+C,QAAUA,EACf/C,KAAKsT,MAAQtT,KAAKoI,IAAMpI,KAAK8O,MAC7B9O,KAAKuC,IAAMA,EACXvC,KAAK2gC,KAAOA,IAAUjkC,EAAOw3B,UAAW5R,GAAS,GAAK,OAEvDxT,IAAK,WACJ,GAAIiS,GAAQ+gB,GAAMhe,UAAW9jB,KAAKsiB,KAElC,OAAOvB,IAASA,EAAM5f,IACrB4f,EAAM5f,IAAKnB,MACX8hC,GAAMhe,UAAUqD,SAAShmB,IAAKnB,OAEhC0hC,IAAK,SAAUF,GACd,GAAIoB,GACH7hB,EAAQ+gB,GAAMhe,UAAW9jB,KAAKsiB,KAoB/B,OAjBCtiB,MAAK2rB,IAAMiX,EADP5iC,KAAK+C,QAAQw+B,SACE7kC,EAAOqlC,OAAQ/hC,KAAK+hC,QACtCP,EAASxhC,KAAK+C,QAAQw+B,SAAWC,EAAS,EAAG,EAAGxhC,KAAK+C,QAAQw+B,UAG3CC,EAEpBxhC,KAAKoI,KAAQpI,KAAKuC,IAAMvC,KAAKsT,OAAUsvB,EAAQ5iC,KAAKsT,MAE/CtT,KAAK+C,QAAQ8/B,MACjB7iC,KAAK+C,QAAQ8/B,KAAK3hC,KAAMlB,KAAKD,KAAMC,KAAKoI,IAAKpI,MAGzC+gB,GAASA,EAAMoC,IACnBpC,EAAMoC,IAAKnjB,MAEX8hC,GAAMhe,UAAUqD,SAAShE,IAAKnjB,MAExBA,OAIT8hC,GAAMniC,UAAU1B,KAAK0B,UAAYmiC,GAAMniC,UAEvCmiC,GAAMhe,WACLqD,UACChmB,IAAK,SAAUs/B,GACd,GAAI1tB,EAEJ,OAAiC,OAA5B0tB,EAAM1gC,KAAM0gC,EAAMne,OACpBme,EAAM1gC,KAAK0I,OAA2C,MAAlCg4B,EAAM1gC,KAAK0I,MAAOg4B,EAAMne,OAQ/CvP,EAASrW,EAAO82B,IAAKiN,EAAM1gC,KAAM0gC,EAAMne,KAAM,IAErCvP,GAAqB,SAAXA,EAAwBA,EAAJ,GAT9B0tB,EAAM1gC,KAAM0gC,EAAMne,OAW3Ba,IAAK,SAAUsd,GAGT/jC,EAAO4kB,GAAGuhB,KAAMpC,EAAMne,MAC1B5lB,EAAO4kB,GAAGuhB,KAAMpC,EAAMne,MAAQme,GACnBA,EAAM1gC,KAAK0I,QAAgE,MAArDg4B,EAAM1gC,KAAK0I,MAAO/L,EAAOg4B,SAAU+L,EAAMne,QAAoB5lB,EAAOs3B,SAAUyM,EAAMne,OACrH5lB,EAAO+L,MAAOg4B,EAAM1gC,KAAM0gC,EAAMne,KAAMme,EAAMr4B,IAAMq4B,EAAME,MAExDF,EAAM1gC,KAAM0gC,EAAMne,MAASme,EAAMr4B,OASrC05B,GAAMhe,UAAUmF,UAAY6Y,GAAMhe,UAAU+E,YAC3C1F,IAAK,SAAUsd,GACTA,EAAM1gC,KAAKQ,UAAYkgC,EAAM1gC,KAAKe,aACtC2/B,EAAM1gC,KAAM0gC,EAAMne,MAASme,EAAMr4B,OAKpC1L,EAAO+E,MAAO,SAAU,OAAQ,QAAU,SAAUU,EAAGW,GACtD,GAAIggC,GAAQpmC,EAAOsB,GAAI8E,EACvBpG,GAAOsB,GAAI8E,GAAS,SAAUigC,EAAOhB,EAAQrgC,GAC5C,MAAgB,OAATqhC,GAAkC,iBAAVA,GAC9BD,EAAMhhC,MAAO9B,KAAM+B,WACnB/B,KAAKgjC,QAASC,GAAOngC,GAAM,GAAQigC,EAAOhB,EAAQrgC,MAIrDhF,EAAOsB,GAAG0E,QACTwgC,OAAQ,SAAUH,EAAOI,EAAIpB,EAAQrgC,GAGpC,MAAO1B,MAAKkQ,OAAQojB,IAAWE,IAAK,UAAW,GAAIE,OAGjDnxB,MAAMygC,SAAU/lB,QAASkmB,GAAMJ,EAAOhB,EAAQrgC,IAEjDshC,QAAS,SAAU1gB,EAAMygB,EAAOhB,EAAQrgC,GACvC,GAAIsT,GAAQtY,EAAOqI,cAAeud,GACjC8gB,EAAS1mC,EAAOqmC,MAAOA,EAAOhB,EAAQrgC,GACtC2hC,EAAc,WAEb,GAAIlB,GAAOlB,GAAWjhC,KAAMtD,EAAOgG,UAAY4f,GAAQ8gB,IAGlDpuB,GAAStY,EAAO+jB,MAAOzgB,KAAM,YACjCmiC,EAAKjhB,MAAM,GAKd,OAFCmiB,GAAYC,OAASD,EAEfruB,GAASouB,EAAOxiB,SAAU,EAChC5gB,KAAKyB,KAAM4hC,GACXrjC,KAAK4gB,MAAOwiB,EAAOxiB,MAAOyiB,IAE5BniB,KAAM,SAAU7hB,EAAMqiB,EAAYsgB,GACjC,GAAIuB,GAAY,SAAUxiB,GACzB,GAAIG,GAAOH,EAAMG,WACVH,GAAMG,KACbA,EAAM8gB,GAYP,OATqB,gBAAT3iC,KACX2iC,EAAUtgB,EACVA,EAAariB,EACbA,EAAOpD,GAEHylB,GAAcriB,KAAS,GAC3BW,KAAK4gB,MAAOvhB,GAAQ,SAGdW,KAAKyB,KAAK,WAChB,GAAIof,IAAU,EACbtG,EAAgB,MAARlb,GAAgBA,EAAO,aAC/BmkC,EAAS9mC,EAAO8mC,OAChBr+B,EAAOzI,EAAO+jB,MAAOzgB,KAEtB,IAAKua,EACCpV,EAAMoV,IAAWpV,EAAMoV,GAAQ2G,MACnCqiB,EAAWp+B,EAAMoV,QAGlB,KAAMA,IAASpV,GACTA,EAAMoV,IAAWpV,EAAMoV,GAAQ2G,MAAQmf,GAAK5/B,KAAM8Z,IACtDgpB,EAAWp+B,EAAMoV,GAKpB,KAAMA,EAAQipB,EAAOtjC,OAAQqa,KACvBipB,EAAQjpB,GAAQxa,OAASC,MAAiB,MAARX,GAAgBmkC,EAAQjpB,GAAQqG,QAAUvhB,IAChFmkC,EAAQjpB,GAAQ4nB,KAAKjhB,KAAM8gB,GAC3BnhB,GAAU,EACV2iB,EAAO/gC,OAAQ8X,EAAO,KAOnBsG,IAAYmhB,IAChBtlC,EAAOmkB,QAAS7gB,KAAMX,MAIzBikC,OAAQ,SAAUjkC,GAIjB,MAHKA,MAAS,IACbA,EAAOA,GAAQ,MAETW,KAAKyB,KAAK,WAChB,GAAI8Y,GACHpV,EAAOzI,EAAO+jB,MAAOzgB,MACrB4gB,EAAQzb,EAAM9F,EAAO,SACrB0hB,EAAQ5b,EAAM9F,EAAO,cACrBmkC,EAAS9mC,EAAO8mC,OAChBtjC,EAAS0gB,EAAQA,EAAM1gB,OAAS,CAajC,KAVAiF,EAAKm+B,QAAS,EAGd5mC,EAAOkkB,MAAO5gB,KAAMX,MAEf0hB,GAASA,EAAMG,MACnBH,EAAMG,KAAKhgB,KAAMlB,MAAM,GAIlBua,EAAQipB,EAAOtjC,OAAQqa,KACvBipB,EAAQjpB,GAAQxa,OAASC,MAAQwjC,EAAQjpB,GAAQqG,QAAUvhB,IAC/DmkC,EAAQjpB,GAAQ4nB,KAAKjhB,MAAM,GAC3BsiB,EAAO/gC,OAAQ8X,EAAO,GAKxB,KAAMA,EAAQ,EAAWra,EAARqa,EAAgBA,IAC3BqG,EAAOrG,IAAWqG,EAAOrG,GAAQ+oB,QACrC1iB,EAAOrG,GAAQ+oB,OAAOpiC,KAAMlB,YAKvBmF,GAAKm+B,WAMf,SAASL,IAAO5jC,EAAMokC,GACrB,GAAInb,GACH5Z,GAAUg1B,OAAQrkC,GAClB8C,EAAI,CAKL,KADAshC,EAAeA,EAAc,EAAI,EACtB,EAAJthC,EAAQA,GAAK,EAAIshC,EACvBnb,EAAQ2K,GAAW9wB,GACnBuM,EAAO,SAAW4Z,GAAU5Z,EAAO,UAAY4Z,GAAUjpB,CAO1D,OAJKokC,KACJ/0B,EAAMuO,QAAUvO,EAAM4Q,MAAQjgB,GAGxBqP,EAIRhS,EAAO+E,MACNkiC,UAAWV,GAAM,QACjBW,QAASX,GAAM,QACfY,YAAaZ,GAAM,UACnBa,QAAU7mB,QAAS,QACnB8mB,SAAW9mB,QAAS,QACpB+mB,YAAc/mB,QAAS,WACrB,SAAUna,EAAMolB,GAClBxrB,EAAOsB,GAAI8E,GAAS,SAAUigC,EAAOhB,EAAQrgC,GAC5C,MAAO1B,MAAKgjC,QAAS9a,EAAO6a,EAAOhB,EAAQrgC,MAI7ChF,EAAOqmC,MAAQ,SAAUA,EAAOhB,EAAQ/jC,GACvC,GAAIwe,GAAMumB,GAA0B,gBAAVA,GAAqBrmC,EAAOgG,UAAYqgC,IACjEjJ,SAAU97B,IAAOA,GAAM+jC,GACtBrlC,EAAOiE,WAAYoiC,IAAWA,EAC/BxB,SAAUwB,EACVhB,OAAQ/jC,GAAM+jC,GAAUA,IAAWrlC,EAAOiE,WAAYohC,IAAYA,EAwBnE,OArBAvlB,GAAI+kB,SAAW7kC,EAAO4kB,GAAGpd,IAAM,EAA4B,gBAAjBsY,GAAI+kB,SAAwB/kB,EAAI+kB,SACzE/kB,EAAI+kB,WAAY7kC,GAAO4kB,GAAGC,OAAS7kB,EAAO4kB,GAAGC,OAAQ/E,EAAI+kB,UAAa7kC,EAAO4kB,GAAGC,OAAO4F,UAGtE,MAAb3K,EAAIoE,OAAiBpE,EAAIoE,SAAU,KACvCpE,EAAIoE,MAAQ,MAIbpE,EAAIhU,IAAMgU,EAAIsd,SAEdtd,EAAIsd,SAAW,WACTp9B,EAAOiE,WAAY6b,EAAIhU,MAC3BgU,EAAIhU,IAAItH,KAAMlB,MAGVwc,EAAIoE,OACRlkB,EAAOmkB,QAAS7gB,KAAMwc,EAAIoE,QAIrBpE,GAGR9f,EAAOqlC,QACNkC,OAAQ,SAAUC,GACjB,MAAOA,IAERC,MAAO,SAAUD,GAChB,MAAO,GAAM7gC,KAAK+gC,IAAKF,EAAE7gC,KAAKghC,IAAO,IAIvC3nC,EAAO8mC,UACP9mC,EAAO4kB,GAAKwgB,GAAMniC,UAAU1B,KAC5BvB,EAAO4kB,GAAG8f,KAAO,WAChB,GAAIc,GACHsB,EAAS9mC,EAAO8mC,OAChBrhC,EAAI,CAIL,KAFA89B,GAAQvjC,EAAO0L,MAEHo7B,EAAOtjC,OAAXiC,EAAmBA,IAC1B+/B,EAAQsB,EAAQrhC,GAEV+/B,KAAWsB,EAAQrhC,KAAQ+/B,GAChCsB,EAAO/gC,OAAQN,IAAK,EAIhBqhC,GAAOtjC,QACZxD,EAAO4kB,GAAGJ,OAEX+e,GAAQhkC,GAGTS,EAAO4kB,GAAG4gB,MAAQ,SAAUA,GACtBA,KAAWxlC,EAAO8mC,OAAOrmC,KAAM+kC,IACnCxlC,EAAO4kB,GAAGhO,SAIZ5W,EAAO4kB,GAAGgjB,SAAW,GAErB5nC,EAAO4kB,GAAGhO,MAAQ,WACX4sB,KACLA,GAAUqE,YAAa7nC,EAAO4kB,GAAG8f,KAAM1kC,EAAO4kB,GAAGgjB,YAInD5nC,EAAO4kB,GAAGJ,KAAO,WAChBsjB,cAAetE,IACfA,GAAU,MAGXxjC,EAAO4kB,GAAGC,QACTkjB,KAAM,IACNC,KAAM,IAENvd,SAAU,KAIXzqB,EAAO4kB,GAAGuhB,QAELnmC,EAAO4U,MAAQ5U,EAAO4U,KAAKwE,UAC/BpZ,EAAO4U,KAAKwE,QAAQ6uB,SAAW,SAAU5kC,GACxC,MAAOrD,GAAO+K,KAAK/K,EAAO8mC,OAAQ,SAAUxlC,GAC3C,MAAO+B,KAAS/B,EAAG+B,OACjBG,SAGLxD,EAAOsB,GAAG4mC,OAAS,SAAU7hC,GAC5B,GAAKhB,UAAU7B,OACd,MAAO6C,KAAY9G,EAClB+D,KACAA,KAAKyB,KAAK,SAAUU,GACnBzF,EAAOkoC,OAAOC,UAAW7kC,KAAM+C,EAASZ,IAI3C,IAAI5F,GAASuoC,EACZC,GAAQn8B,IAAK,EAAGssB,KAAM,GACtBn1B,EAAOC,KAAM,GACbwP,EAAMzP,GAAQA,EAAKS,aAEpB,IAAMgP,EAON,MAHAjT,GAAUiT,EAAIhT,gBAGRE,EAAOmN,SAAUtN,EAASwD,UAMpBA,GAAKilC,wBAA0B5oC,IAC1C2oC,EAAMhlC,EAAKilC,yBAEZF,EAAMG,GAAWz1B,IAEhB5G,IAAKm8B,EAAIn8B,KAASk8B,EAAII,aAAe3oC,EAAQ0sB,YAAiB1sB,EAAQ2sB,WAAc,GACpFgM,KAAM6P,EAAI7P,MAAS4P,EAAIK,aAAe5oC,EAAQssB,aAAiBtsB,EAAQusB,YAAc,KAX9Eic,GAeTroC,EAAOkoC,QAENC,UAAW,SAAU9kC,EAAMgD,EAASZ,GACnC,GAAIywB,GAAWl2B,EAAO82B,IAAKzzB,EAAM,WAGf,YAAb6yB,IACJ7yB,EAAK0I,MAAMmqB,SAAW,WAGvB,IAAIwS,GAAU1oC,EAAQqD,GACrBslC,EAAYD,EAAQR,SACpBU,EAAY5oC,EAAO82B,IAAKzzB,EAAM,OAC9BwlC,EAAa7oC,EAAO82B,IAAKzzB,EAAM,QAC/BylC,GAAmC,aAAb5S,GAAwC,UAAbA,IAA0Bl2B,EAAO2K,QAAQ,QAASi+B,EAAWC,IAAe,GAC7Hrd,KAAYud,KAAkBC,EAAQC,CAGlCH,IACJC,EAAcL,EAAQxS,WACtB8S,EAASD,EAAY78B,IACrB+8B,EAAUF,EAAYvQ,OAEtBwQ,EAASlhC,WAAY8gC,IAAe,EACpCK,EAAUnhC,WAAY+gC,IAAgB,GAGlC7oC,EAAOiE,WAAYoC,KACvBA,EAAUA,EAAQ7B,KAAMnB,EAAMoC,EAAGkjC,IAGd,MAAftiC,EAAQ6F,MACZsf,EAAMtf,IAAQ7F,EAAQ6F,IAAMy8B,EAAUz8B,IAAQ88B,GAE1B,MAAhB3iC,EAAQmyB,OACZhN,EAAMgN,KAASnyB,EAAQmyB,KAAOmQ,EAAUnQ,KAASyQ,GAG7C,SAAW5iC,GACfA,EAAQ6iC,MAAM1kC,KAAMnB,EAAMmoB,GAE1Bkd,EAAQ5R,IAAKtL,KAMhBxrB,EAAOsB,GAAG0E,QAETkwB,SAAU,WACT,GAAM5yB,KAAM,GAAZ,CAIA,GAAI6lC,GAAcjB,EACjBkB,GAAiBl9B,IAAK,EAAGssB,KAAM,GAC/Bn1B,EAAOC,KAAM,EAwBd,OArBwC,UAAnCtD,EAAO82B,IAAKzzB,EAAM,YAEtB6kC,EAAS7kC,EAAKilC,yBAGda,EAAe7lC,KAAK6lC,eAGpBjB,EAAS5kC,KAAK4kC,SACRloC,EAAOmK,SAAUg/B,EAAc,GAAK,UACzCC,EAAeD,EAAajB,UAI7BkB,EAAal9B,KAAQlM,EAAO82B,IAAKqS,EAAc,GAAK,kBAAkB,GACtEC,EAAa5Q,MAAQx4B,EAAO82B,IAAKqS,EAAc,GAAK,mBAAmB,KAOvEj9B,IAAMg8B,EAAOh8B,IAAOk9B,EAAal9B,IAAMlM,EAAO82B,IAAKzzB,EAAM,aAAa,GACtEm1B,KAAM0P,EAAO1P,KAAO4Q,EAAa5Q,KAAOx4B,EAAO82B,IAAKzzB,EAAM,cAAc,MAI1E8lC,aAAc,WACb,MAAO7lC,MAAKsC,IAAI,WACf,GAAIujC,GAAe7lC,KAAK6lC,cAAgBtpC,CACxC,OAAQspC,IAAmBnpC,EAAOmK,SAAUg/B,EAAc,SAAsD,WAA1CnpC,EAAO82B,IAAKqS,EAAc,YAC/FA,EAAeA,EAAaA,YAE7B,OAAOA,IAAgBtpC,OAO1BG,EAAO+E,MAAOonB,WAAY,cAAeI,UAAW,eAAgB,SAAU0T,EAAQra,GACrF,GAAI1Z,GAAM,IAAInI,KAAM6hB,EAEpB5lB,GAAOsB,GAAI2+B,GAAW,SAAUnrB,GAC/B,MAAO9U,GAAOqL,OAAQ/H,KAAM,SAAUD,EAAM48B,EAAQnrB,GACnD,GAAIszB,GAAMG,GAAWllC,EAErB,OAAKyR,KAAQvV,EACL6oC,EAAOxiB,IAAQwiB,GAAOA,EAAKxiB,GACjCwiB,EAAIxoC,SAASE,gBAAiBmgC,GAC9B58B,EAAM48B,IAGHmI,EACJA,EAAIiB,SACFn9B,EAAYlM,EAAQooC,GAAMjc,aAApBrX,EACP5I,EAAM4I,EAAM9U,EAAQooC,GAAM7b,aAI3BlpB,EAAM48B,GAAWnrB,EAPlB,IASEmrB,EAAQnrB,EAAKzP,UAAU7B,OAAQ,QAIpC,SAAS+kC,IAAWllC,GACnB,MAAOrD,GAAO2H,SAAUtE,GACvBA,EACkB,IAAlBA,EAAKQ,SACJR,EAAK2P,aAAe3P,EAAKgnB,cACzB,EAGHrqB,EAAO+E,MAAQukC,OAAQ,SAAUC,MAAO,SAAW,SAAUnjC,EAAMzD,GAClE3C,EAAO+E,MAAQ00B,QAAS,QAAUrzB,EAAMktB,QAAS3wB,EAAM,GAAI,QAAUyD,GAAQ,SAAUojC,EAAcC,GAEpGzpC,EAAOsB,GAAImoC,GAAa,SAAUjQ,EAAQnvB,GACzC,GAAIiB,GAAYjG,UAAU7B,SAAYgmC,GAAkC,iBAAXhQ,IAC5DtB,EAAQsR,IAAkBhQ,KAAW,GAAQnvB,KAAU,EAAO,SAAW,SAE1E,OAAOrK,GAAOqL,OAAQ/H,KAAM,SAAUD,EAAMV,EAAM0H,GACjD,GAAIyI,EAEJ,OAAK9S,GAAO2H,SAAUtE,GAIdA,EAAKzD,SAASE,gBAAiB,SAAWsG,GAI3B,IAAlB/C,EAAKQ,UACTiP,EAAMzP,EAAKvD,gBAIJ6G,KAAKiE,IACXvH,EAAK+D,KAAM,SAAWhB,GAAQ0M,EAAK,SAAW1M,GAC9C/C,EAAK+D,KAAM,SAAWhB,GAAQ0M,EAAK,SAAW1M,GAC9C0M,EAAK,SAAW1M,KAIXiE,IAAU9K,EAEhBS,EAAO82B,IAAKzzB,EAAMV,EAAMu1B,GAGxBl4B,EAAO+L,MAAO1I,EAAMV,EAAM0H,EAAO6tB,IAChCv1B,EAAM2I,EAAYkuB,EAASj6B,EAAW+L,EAAW,WAQvDtL,EAAOsB,GAAGooC,KAAO,WAChB,MAAOpmC,MAAKE,QAGbxD,EAAOsB,GAAGqoC,QAAU3pC,EAAOsB,GAAG6tB,QAGP,gBAAXya,SAAuBA,QAAoC,gBAAnBA,QAAOC,QAK1DD,OAAOC,QAAU7pC,GAGjBV,EAAOU,OAASV,EAAOY,EAAIF,EASJ,kBAAX8pC,SAAyBA,OAAOC,KAC3CD,OAAQ,YAAc,WAAc,MAAO9pC,QAIzCV"}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/snapscreen/UEditorSnapscreen.exe b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/snapscreen/UEditorSnapscreen.exe
new file mode 100644
index 0000000..db68508
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/snapscreen/UEditorSnapscreen.exe
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.eot b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.eot
new file mode 100644
index 0000000..a075c19
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.eot
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.svg b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.svg
new file mode 100644
index 0000000..f1af0e5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.svg
@@ -0,0 +1,65 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG font generated by IcoMoon.
+<iconset grid="16"></iconset>
+</metadata>
+<defs>
+<font id="VideoJS" horiz-adv-x="512" >
+<font-face units-per-em="512" ascent="480" descent="-32" />
+<missing-glyph horiz-adv-x="512" />
+<glyph class="hidden" unicode="&#xf000;" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" />
+<glyph unicode="&#xe002;" d="M 64,416L 224,416L 224,32L 64,32zM 288,416L 448,416L 448,32L 288,32z"  />
+<glyph unicode="&#xe003;" d="M 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z"  />
+<glyph unicode="&#xe004;" d="M 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+		c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+		c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z"  />
+<glyph unicode="&#xe005;" d="M 359.765,64.235c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0,33.941
+		c 65.503,65.503, 65.503,172.085,0,237.588c-9.372,9.373-9.372,24.569,0,33.941c 9.372,9.371, 24.569,9.372, 33.941,0
+		C 417.532,335.938, 440,281.696, 440,224c0-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+		c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+		c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z"  />
+<glyph unicode="&#xe006;" d="M 445.020,18.98c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.373-9.372,24.568,0,33.941
+		C 471.868,103.771, 496.001,162.030, 496.001,224c0,61.969-24.133,120.229-67.952,164.049c-9.372,9.373-9.372,24.569,0,33.941
+		c 9.372,9.372, 24.569,9.372, 33.941,0c 52.885-52.886, 82.011-123.2, 82.011-197.99c0-74.791-29.126-145.104-82.011-197.99
+		C 457.304,21.323, 451.162,18.98, 445.020,18.98zM 359.765,64.235c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0,33.941
+		c 65.503,65.503, 65.503,172.085,0,237.588c-9.372,9.373-9.372,24.569,0,33.941c 9.372,9.371, 24.569,9.372, 33.941,0
+		C 417.532,335.938, 440,281.696, 440,224c0-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+		c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+		c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" horiz-adv-x="544"  />
+<glyph unicode="&#xe007;" d="M 256,480L 96,224L 256-32L 416,224 z"  />
+<glyph unicode="&#xe008;" d="M 0,480 L 687.158,480 L 687.158-35.207 L 0-35.207 L 0,480 z M 622.731,224.638 C 621.878,314.664 618.46,353.922 597.131,381.656 C 593.291,387.629 586.038,391.042 580.065,395.304 C 559.158,410.669 460.593,416.211 346.247,416.211 C 231.896,416.211 128.642,410.669 108.162,395.304 C 101.762,391.042 94.504,387.629 90.242,381.656 C 69.331,353.922 66.349,314.664 65.069,224.638 C 66.349,134.607 69.331,95.353 90.242,67.62 C 94.504,61.22 101.762,58.233 108.162,53.967 C 128.642,38.18 231.896,33.060 346.247,32.207 C 460.593,33.060 559.158,38.18 580.065,53.967 C 586.038,58.233 593.291,61.22 597.131,67.62 C 618.46,95.353 621.878,134.607 622.731,224.638 z M 331.179,247.952 C 325.389,318.401 287.924,359.905 220.901,359.905 C 159.672,359.905 111.54,304.689 111.54,215.965 C 111.54,126.859 155.405,71.267 227.907,71.267 C 285.79,71.267 326.306,113.916 332.701,184.742 L 263.55,184.742 C 260.81,158.468 249.843,138.285 226.69,138.285 C 190.136,138.285 183.435,174.462 183.435,212.92 C 183.435,265.854 198.665,292.886 223.951,292.886 C 246.492,292.886 260.81,276.511 262.939,247.952 L 331.179,247.952 z M 570.013,247.952 C 564.228,318.401 526.758,359.905 459.74,359.905 C 398.507,359.905 350.379,304.689 350.379,215.965 C 350.379,126.859 394.244,71.267 466.746,71.267 C 524.625,71.267 565.14,113.916 571.536,184.742 L 502.384,184.742 C 499.649,158.468 488.682,138.285 465.529,138.285 C 428.971,138.285 422.27,174.462 422.27,212.92 C 422.27,265.854 437.504,292.886 462.785,292.886 C 485.327,292.886 499.649,276.511 501.778,247.952 L 570.013,247.952 z " horiz-adv-x="687.158"  />
+<glyph unicode="&#xe009;" d="M 64,416L 448,416L 448,32L 64,32z"  />
+<glyph unicode="&#xe00a;" d="M 192,416A64,64 12780 1 1 320,416A64,64 12780 1 1 192,416zM 327.765,359.765A64,64 12780 1 1 455.765,359.765A64,64 12780 1 1 327.765,359.765zM 416,224A32,32 12780 1 1 480,224A32,32 12780 1 1 416,224zM 359.765,88.235A32,32 12780 1 1 423.765,88.23500000000001A32,32 12780 1 1 359.765,88.23500000000001zM 224.001,32A32,32 12780 1 1 288.001,32A32,32 12780 1 1 224.001,32zM 88.236,88.235A32,32 12780 1 1 152.236,88.23500000000001A32,32 12780 1 1 88.236,88.23500000000001zM 72.236,359.765A48,48 12780 1 1 168.236,359.765A48,48 12780 1 1 72.236,359.765zM 28,224A36,36 12780 1 1 100,224A36,36 12780 1 1 28,224z"  />
+<glyph unicode="&#xe00b;" d="M 224,192 L 224-16 L 144,64 L 48-32 L 0,16 L 96,112 L 16,192 ZM 512,432 L 416,336 L 496,256 L 288,256 L 288,464 L 368,384 L 464,480 Z"  />
+<glyph unicode="&#xe00c;" d="M 256,448 C 397.385,448 512,354.875 512,240 C 512,125.124 397.385,32 256,32 C 242.422,32 229.095,32.867 216.088,34.522 C 161.099-20.467 95.463-30.328 32-31.776 L 32-18.318 C 66.268-1.529 96,29.052 96,64 C 96,68.877 95.621,73.665 94.918,78.348 C 37.020,116.48 0,174.725 0,240 C 0,354.875 114.615,448 256,448 Z"  />
+<glyph unicode="&#xe00d;" d="M 256,480C 114.615,480,0,365.385,0,224s 114.615-256, 256-256s 256,114.615, 256,256S 397.385,480, 256,480z M 256,352
+	c 70.692,0, 128-57.308, 128-128s-57.308-128-128-128s-128,57.308-128,128S 185.308,352, 256,352z M 408.735,71.265
+	C 367.938,30.468, 313.695,8, 256,8c-57.696,0-111.938,22.468-152.735,63.265C 62.468,112.062, 40,166.304, 40,224
+	c0,57.695, 22.468,111.938, 63.265,152.735l 33.941-33.941c0,0,0,0,0,0c-65.503-65.503-65.503-172.085,0-237.588
+	C 168.937,73.475, 211.125,56, 256,56c 44.874,0, 87.062,17.475, 118.794,49.206c 65.503,65.503, 65.503,172.084,0,237.588l 33.941,33.941
+	C 449.532,335.938, 472,281.695, 472,224C 472,166.304, 449.532,112.062, 408.735,71.265z"  />
+<glyph unicode="&#xe01e;" d="M 512,224c-0.639,33.431-7.892,66.758-21.288,97.231c-13.352,30.5-32.731,58.129-56.521,80.96
+	c-23.776,22.848-51.972,40.91-82.492,52.826C 321.197,466.979, 288.401,472.693, 256,472c-32.405-0.641-64.666-7.687-94.167-20.678
+	c-29.524-12.948-56.271-31.735-78.367-54.788c-22.112-23.041-39.58-50.354-51.093-79.899C 20.816,287.104, 15.309,255.375, 16,224
+	c 0.643-31.38, 7.482-62.574, 20.067-91.103c 12.544-28.55, 30.738-54.414, 53.055-75.774c 22.305-21.377, 48.736-38.252, 77.307-49.36
+	C 194.988-3.389, 225.652-8.688, 256-8c 30.354,0.645, 60.481,7.277, 88.038,19.457c 27.575,12.141, 52.558,29.74, 73.183,51.322
+	c 20.641,21.57, 36.922,47.118, 47.627,74.715c 6.517,16.729, 10.94,34.2, 13.271,51.899c 0.623-0.036, 1.249-0.060, 1.881-0.060
+	c 17.673,0, 32,14.326, 32,32c0,0.898-0.047,1.786-0.119,2.666L 512,223.999 z M 461.153,139.026c-11.736-26.601-28.742-50.7-49.589-70.59
+	c-20.835-19.905-45.5-35.593-72.122-45.895C 312.828,12.202, 284.297,7.315, 256,8c-28.302,0.649-56.298,6.868-81.91,18.237
+	c-25.625,11.333-48.842,27.745-67.997,47.856c-19.169,20.099-34.264,43.882-44.161,69.529C 51.997,169.264, 47.318,196.729, 48,224
+	c 0.651,27.276, 6.664,54.206, 17.627,78.845c 10.929,24.65, 26.749,46.985, 46.123,65.405c 19.365,18.434, 42.265,32.935, 66.937,42.428
+	C 203.356,420.208, 229.755,424.681, 256,424c 26.25-0.653, 52.114-6.459, 75.781-17.017c 23.676-10.525, 45.128-25.751, 62.812-44.391
+	c 17.698-18.629, 31.605-40.647, 40.695-64.344C 444.412,274.552, 448.679,249.219, 448,224l 0.119,0 c-0.072-0.88-0.119-1.768-0.119-2.666
+	c0-16.506, 12.496-30.087, 28.543-31.812C 473.431,172.111, 468.278,155.113, 461.153,139.026z"  />
+<glyph unicode="&#xe01f;" d="M 256,480 C 116.626,480 3.271,368.619 0.076,230.013 C 3.036,350.945 94.992,448 208,448 C 322.875,448 416,347.712 416,224 C 416,197.49 437.49,176 464,176 C 490.51,176 512,197.49 512,224 C 512,365.385 397.385,480 256,480 ZM 256-32 C 395.374-32 508.729,79.381 511.924,217.987 C 508.964,97.055 417.008,0 304,0 C 189.125,0 96,100.288 96,224 C 96,250.51 74.51,272 48,272 C 21.49,272 0,250.51 0,224 C 0,82.615 114.615-32 256-32 Z"  />
+<glyph unicode="&#xe00e;" d="M 432,128c-22.58,0-42.96-9.369-57.506-24.415L 158.992,211.336C 159.649,215.462, 160,219.689, 160,224
+	s-0.351,8.538-1.008,12.663l 215.502,107.751C 389.040,329.369, 409.42,320, 432,320c 44.183,0, 80,35.817, 80,80S 476.183,480, 432,480
+	s-80-35.817-80-80c0-4.311, 0.352-8.538, 1.008-12.663L 137.506,279.585C 122.96,294.63, 102.58,304, 80,304c-44.183,0-80-35.818-80-80
+	c0-44.184, 35.817-80, 80-80c 22.58,0, 42.96,9.369, 57.506,24.414l 215.502-107.751C 352.352,56.538, 352,52.311, 352,48
+	c0-44.184, 35.817-80, 80-80s 80,35.816, 80,80C 512,92.182, 476.183,128, 432,128z"  />
+<glyph unicode="&#xe001;" d="M 96,416L 416,224L 96,32 z"  />
+<glyph unicode="&#xe000;" d="M 512,480 L 512,272 L 432,352 L 336,256 L 288,304 L 384,400 L 304,480 ZM 224,144 L 128,48 L 208-32 L 0-32 L 0,176 L 80,96 L 176,192 Z"  />
+<glyph unicode="&#x20;" horiz-adv-x="256" />
+</font></defs></svg>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.ttf b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.ttf
new file mode 100644
index 0000000..eb24637
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.ttf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.woff b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.woff
new file mode 100644
index 0000000..c3f0f1d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/font/vjs.woff
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.css
new file mode 100644
index 0000000..2e8c332
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.css
@@ -0,0 +1,766 @@
+/*!
+Video.js Default Styles (http://videojs.com)
+Version 4.3.0
+Create your own skin at http://designer.videojs.com
+*/
+/* SKIN
+================================================================================
+The main class name for all skin-specific styles. To make your own skin,
+replace all occurances of 'vjs-default-skin' with a new name. Then add your new
+skin name to your video tag instead of the default skin.
+e.g. <video class="video-js my-skin-name">
+*/
+.vjs-default-skin {
+  color: #cccccc;
+}
+/* Custom Icon Font
+--------------------------------------------------------------------------------
+The control icons are from a custom font. Each icon corresponds to a character
+(e.g. "\e001"). Font icons allow for easy scaling and coloring of icons.
+*/
+@font-face {
+  font-family: 'VideoJS';
+  src: url('font/vjs.eot');
+  src: url('font/vjs.eot?#iefix') format('embedded-opentype'), url('font/vjs.woff') format('woff'), url('font/vjs.ttf') format('truetype');
+  font-weight: normal;
+  font-style: normal;
+}
+/* Base UI Component Classes
+--------------------------------------------------------------------------------
+*/
+/* Slider - used for Volume bar and Seek bar */
+.vjs-default-skin .vjs-slider {
+  /* Replace browser focus hightlight with handle highlight */
+  outline: 0;
+  position: relative;
+  cursor: pointer;
+  padding: 0;
+  /* background-color-with-alpha */
+  background-color: #333333;
+  background-color: rgba(51, 51, 51, 0.9);
+}
+.vjs-default-skin .vjs-slider:focus {
+  /* box-shadow */
+  -webkit-box-shadow: 0 0 2em #ffffff;
+  -moz-box-shadow: 0 0 2em #ffffff;
+  box-shadow: 0 0 2em #ffffff;
+}
+.vjs-default-skin .vjs-slider-handle {
+  position: absolute;
+  /* Needed for IE6 */
+  left: 0;
+  top: 0;
+}
+.vjs-default-skin .vjs-slider-handle:before {
+  content: "\e009";
+  font-family: VideoJS;
+  font-size: 1em;
+  line-height: 1;
+  text-align: center;
+  text-shadow: 0em 0em 1em #fff;
+  position: absolute;
+  top: 0;
+  left: 0;
+  /* Rotate the square icon to make a diamond */
+  /* transform */
+  -webkit-transform: rotate(-45deg);
+  -moz-transform: rotate(-45deg);
+  -ms-transform: rotate(-45deg);
+  -o-transform: rotate(-45deg);
+  transform: rotate(-45deg);
+}
+/* Control Bar
+--------------------------------------------------------------------------------
+The default control bar that is a container for most of the controls.
+*/
+.vjs-default-skin .vjs-control-bar {
+  /* Start hidden */
+  display: none;
+  position: absolute;
+  /* Place control bar at the bottom of the player box/video.
+     If you want more margin below the control bar, add more height. */
+  bottom: 0;
+  /* Use left/right to stretch to 100% width of player div */
+  left: 0;
+  right: 0;
+  /* Height includes any margin you want above or below control items */
+  height: 3.0em;
+  /* background-color-with-alpha */
+  background-color: #07141e;
+  background-color: rgba(7, 20, 30, 0.7);
+}
+/* Show the control bar only once the video has started playing */
+.vjs-default-skin.vjs-has-started .vjs-control-bar {
+  display: block;
+  /* Visibility needed to make sure things hide in older browsers too. */
+
+  visibility: visible;
+  opacity: 1;
+  /* transition */
+  -webkit-transition: visibility 0.1s, opacity 0.1s;
+  -moz-transition: visibility 0.1s, opacity 0.1s;
+  -o-transition: visibility 0.1s, opacity 0.1s;
+  transition: visibility 0.1s, opacity 0.1s;
+}
+/* Hide the control bar when the video is playing and the user is inactive  */
+.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
+  display: block;
+  visibility: hidden;
+  opacity: 0;
+  /* transition */
+  -webkit-transition: visibility 1s, opacity 1s;
+  -moz-transition: visibility 1s, opacity 1s;
+  -o-transition: visibility 1s, opacity 1s;
+  transition: visibility 1s, opacity 1s;
+}
+.vjs-default-skin.vjs-controls-disabled .vjs-control-bar {
+  display: none;
+}
+.vjs-default-skin.vjs-using-native-controls .vjs-control-bar {
+  display: none;
+}
+/* IE8 is flakey with fonts, and you have to change the actual content to force
+fonts to show/hide properly.
+  - "\9" IE8 hack didn't work for this
+  - Found in XP IE8 from http://modern.ie. Does not show up in "IE8 mode" in IE9
+*/
+@media \0screen {
+  .vjs-default-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before {
+    content: "";
+  }
+}
+/* General styles for individual controls. */
+.vjs-default-skin .vjs-control {
+  outline: none;
+  position: relative;
+  float: left;
+  text-align: center;
+  margin: 0;
+  padding: 0;
+  height: 3.0em;
+  width: 4em;
+}
+/* FontAwsome button icons */
+.vjs-default-skin .vjs-control:before {
+  font-family: VideoJS;
+  font-size: 1.5em;
+  line-height: 2;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  text-align: center;
+  text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
+}
+/* Replacement for focus outline */
+.vjs-default-skin .vjs-control:focus:before,
+.vjs-default-skin .vjs-control:hover:before {
+  text-shadow: 0em 0em 1em #ffffff;
+}
+.vjs-default-skin .vjs-control:focus {
+  /*  outline: 0; */
+  /* keyboard-only users cannot see the focus on several of the UI elements when
+  this is set to 0 */
+
+}
+/* Hide control text visually, but have it available for screenreaders */
+.vjs-default-skin .vjs-control-text {
+  /* hide-visually */
+  border: 0;
+  clip: rect(0 0 0 0);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px;
+}
+/* Play/Pause
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-play-control {
+  width: 5em;
+  cursor: pointer;
+}
+.vjs-default-skin .vjs-play-control:before {
+  content: "\e001";
+}
+.vjs-default-skin.vjs-playing .vjs-play-control:before {
+  content: "\e002";
+}
+/* Volume/Mute
+-------------------------------------------------------------------------------- */
+.vjs-default-skin .vjs-mute-control,
+.vjs-default-skin .vjs-volume-menu-button {
+  cursor: pointer;
+  float: right;
+}
+.vjs-default-skin .vjs-mute-control:before,
+.vjs-default-skin .vjs-volume-menu-button:before {
+  content: "\e006";
+}
+.vjs-default-skin .vjs-mute-control.vjs-vol-0:before,
+.vjs-default-skin .vjs-volume-menu-button.vjs-vol-0:before {
+  content: "\e003";
+}
+.vjs-default-skin .vjs-mute-control.vjs-vol-1:before,
+.vjs-default-skin .vjs-volume-menu-button.vjs-vol-1:before {
+  content: "\e004";
+}
+.vjs-default-skin .vjs-mute-control.vjs-vol-2:before,
+.vjs-default-skin .vjs-volume-menu-button.vjs-vol-2:before {
+  content: "\e005";
+}
+.vjs-default-skin .vjs-volume-control {
+  width: 5em;
+  float: right;
+}
+.vjs-default-skin .vjs-volume-bar {
+  width: 5em;
+  height: 0.6em;
+  margin: 1.1em auto 0;
+}
+.vjs-default-skin .vjs-volume-menu-button .vjs-menu-content {
+  height: 2.9em;
+}
+.vjs-default-skin .vjs-volume-level {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 0.5em;
+  background: #66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat;
+}
+.vjs-default-skin .vjs-volume-bar .vjs-volume-handle {
+  width: 0.5em;
+  height: 0.5em;
+}
+.vjs-default-skin .vjs-volume-handle:before {
+  font-size: 0.9em;
+  top: -0.2em;
+  left: -0.2em;
+  width: 1em;
+  height: 1em;
+}
+.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content {
+  width: 6em;
+  left: -4em;
+}
+/* Progress
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-progress-control {
+  position: absolute;
+  left: 0;
+  right: 0;
+  width: auto;
+  font-size: 0.3em;
+  height: 1em;
+  /* Set above the rest of the controls. */
+  top: -1em;
+  /* Shrink the bar slower than it grows. */
+  /* transition */
+  -webkit-transition: all 0.4s;
+  -moz-transition: all 0.4s;
+  -o-transition: all 0.4s;
+  transition: all 0.4s;
+}
+/* On hover, make the progress bar grow to something that's more clickable.
+    This simply changes the overall font for the progress bar, and this
+    updates both the em-based widths and heights, as wells as the icon font */
+.vjs-default-skin:hover .vjs-progress-control {
+  font-size: .9em;
+  /* Even though we're not changing the top/height, we need to include them in
+      the transition so they're handled correctly. */
+
+  /* transition */
+  -webkit-transition: all 0.2s;
+  -moz-transition: all 0.2s;
+  -o-transition: all 0.2s;
+  transition: all 0.2s;
+}
+/* Box containing play and load progresses. Also acts as seek scrubber. */
+.vjs-default-skin .vjs-progress-holder {
+  height: 100%;
+}
+/* Progress Bars */
+.vjs-default-skin .vjs-progress-holder .vjs-play-progress,
+.vjs-default-skin .vjs-progress-holder .vjs-load-progress {
+  position: absolute;
+  display: block;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  /* Needed for IE6 */
+  left: 0;
+  top: 0;
+}
+.vjs-default-skin .vjs-play-progress {
+  /*
+    Using a data URI to create the white diagonal lines with a transparent
+      background. Surprisingly works in IE8.
+      Created using http://www.patternify.com
+    Changing the first color value will change the bar color.
+    Also using a paralax effect to make the lines move backwards.
+      The -50% left position makes that happen.
+  */
+
+  background: #66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat;
+}
+.vjs-default-skin .vjs-load-progress {
+  background: #646464 /* IE8- Fallback */;
+  background: rgba(255, 255, 255, 0.4);
+}
+.vjs-default-skin .vjs-seek-handle {
+  width: 1.5em;
+  height: 100%;
+}
+.vjs-default-skin .vjs-seek-handle:before {
+  padding-top: 0.1em /* Minor adjustment */;
+}
+/* Time Display
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-time-controls {
+  font-size: 1em;
+  /* Align vertically by making the line height the same as the control bar */
+  line-height: 3em;
+}
+.vjs-default-skin .vjs-current-time {
+  float: left;
+}
+.vjs-default-skin .vjs-duration {
+  float: left;
+}
+/* Remaining time is in the HTML, but not included in default design */
+.vjs-default-skin .vjs-remaining-time {
+  display: none;
+  float: left;
+}
+.vjs-time-divider {
+  float: left;
+  line-height: 3em;
+}
+/* Fullscreen
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-fullscreen-control {
+  width: 3.8em;
+  cursor: pointer;
+  float: right;
+}
+.vjs-default-skin .vjs-fullscreen-control:before {
+  content: "\e000";
+}
+/* Switch to the exit icon when the player is in fullscreen */
+.vjs-default-skin.vjs-fullscreen .vjs-fullscreen-control:before {
+  content: "\e00b";
+}
+/* Big Play Button (play button at start)
+--------------------------------------------------------------------------------
+Positioning of the play button in the center or other corners can be done more
+easily in the skin designer. http://designer.videojs.com/
+*/
+.vjs-default-skin .vjs-big-play-button {
+  left: 0.5em;
+  top: 0.5em;
+  font-size: 3em;
+  display: block;
+  z-index: 2;
+  position: absolute;
+  width: 4em;
+  height: 2.6em;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  opacity: 1;
+  /* Need a slightly gray bg so it can be seen on black backgrounds */
+  /* background-color-with-alpha */
+  background-color: #07141e;
+  background-color: rgba(7, 20, 30, 0.7);
+  border: 0.1em solid #3b4249;
+  /* border-radius */
+  -webkit-border-radius: 0.8em;
+  -moz-border-radius: 0.8em;
+  border-radius: 0.8em;
+  /* box-shadow */
+  -webkit-box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
+  -moz-box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
+  box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
+  /* transition */
+  -webkit-transition: all 0.4s;
+  -moz-transition: all 0.4s;
+  -o-transition: all 0.4s;
+  transition: all 0.4s;
+}
+/* Optionally center */
+.vjs-default-skin.vjs-big-play-centered .vjs-big-play-button {
+  /* Center it horizontally */
+  left: 50%;
+  margin-left: -2.1em;
+  /* Center it vertically */
+  top: 50%;
+  margin-top: -1.4000000000000001em;
+}
+/* Hide if controls are disabled */
+.vjs-default-skin.vjs-controls-disabled .vjs-big-play-button {
+  display: none;
+}
+/* Hide when video starts playing */
+.vjs-default-skin.vjs-has-started .vjs-big-play-button {
+  display: none;
+}
+/* Hide on mobile devices. Remove when we stop using native controls
+    by default on mobile  */
+.vjs-default-skin.vjs-using-native-controls .vjs-big-play-button {
+  display: none;
+}
+.vjs-default-skin:hover .vjs-big-play-button,
+.vjs-default-skin .vjs-big-play-button:focus {
+  outline: 0;
+  border-color: #fff;
+  /* IE8 needs a non-glow hover state */
+  background-color: #505050;
+  background-color: rgba(50, 50, 50, 0.75);
+  /* box-shadow */
+  -webkit-box-shadow: 0 0 3em #ffffff;
+  -moz-box-shadow: 0 0 3em #ffffff;
+  box-shadow: 0 0 3em #ffffff;
+  /* transition */
+  -webkit-transition: all 0s;
+  -moz-transition: all 0s;
+  -o-transition: all 0s;
+  transition: all 0s;
+}
+.vjs-default-skin .vjs-big-play-button:before {
+  content: "\e001";
+  font-family: VideoJS;
+  /* In order to center the play icon vertically we need to set the line height
+     to the same as the button height */
+
+  line-height: 2.6em;
+  text-shadow: 0.05em 0.05em 0.1em #000;
+  text-align: center /* Needed for IE8 */;
+  position: absolute;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+/* Loading Spinner
+--------------------------------------------------------------------------------
+*/
+.vjs-loading-spinner {
+  display: none;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  font-size: 4em;
+  line-height: 1;
+  width: 1em;
+  height: 1em;
+  margin-left: -0.5em;
+  margin-top: -0.5em;
+  opacity: 0.75;
+  /* animation */
+  -webkit-animation: spin 1.5s infinite linear;
+  -moz-animation: spin 1.5s infinite linear;
+  -o-animation: spin 1.5s infinite linear;
+  animation: spin 1.5s infinite linear;
+}
+.vjs-default-skin .vjs-loading-spinner:before {
+  content: "\e01e";
+  font-family: VideoJS;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 1em;
+  height: 1em;
+  text-align: center;
+  text-shadow: 0em 0em 0.1em #000;
+}
+@-moz-keyframes spin {
+  0% {
+    -moz-transform: rotate(0deg);
+  }
+  100% {
+    -moz-transform: rotate(359deg);
+  }
+}
+@-webkit-keyframes spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+  }
+}
+@-o-keyframes spin {
+  0% {
+    -o-transform: rotate(0deg);
+  }
+  100% {
+    -o-transform: rotate(359deg);
+  }
+}
+@keyframes spin {
+  0% {
+    transform: rotate(0deg);
+  }
+  100% {
+    transform: rotate(359deg);
+  }
+}
+/* Menu Buttons (Captions/Subtitles/etc.)
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-menu-button {
+  float: right;
+  cursor: pointer;
+}
+.vjs-default-skin .vjs-menu {
+  display: none;
+  position: absolute;
+  bottom: 0;
+  left: 0em;
+  /* (Width of vjs-menu - width of button) / 2 */
+
+  width: 0em;
+  height: 0em;
+  margin-bottom: 3em;
+  border-left: 2em solid transparent;
+  border-right: 2em solid transparent;
+  border-top: 1.55em solid #000000;
+  /* Same width top as ul bottom */
+
+  border-top-color: rgba(7, 40, 50, 0.5);
+  /* Same as ul background */
+
+}
+/* Button Pop-up Menu */
+.vjs-default-skin .vjs-menu-button .vjs-menu .vjs-menu-content {
+  display: block;
+  padding: 0;
+  margin: 0;
+  position: absolute;
+  width: 10em;
+  bottom: 1.5em;
+  /* Same bottom as vjs-menu border-top */
+
+  max-height: 15em;
+  overflow: auto;
+  left: -5em;
+  /* Width of menu - width of button / 2 */
+
+  /* background-color-with-alpha */
+  background-color: #07141e;
+  background-color: rgba(7, 20, 30, 0.7);
+  /* box-shadow */
+  -webkit-box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
+  -moz-box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
+  box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
+}
+.vjs-default-skin .vjs-menu-button:hover .vjs-menu {
+  display: block;
+}
+.vjs-default-skin .vjs-menu-button ul li {
+  list-style: none;
+  margin: 0;
+  padding: 0.3em 0 0.3em 0;
+  line-height: 1.4em;
+  font-size: 1.2em;
+  text-align: center;
+  text-transform: lowercase;
+}
+.vjs-default-skin .vjs-menu-button ul li.vjs-selected {
+  background-color: #000;
+}
+.vjs-default-skin .vjs-menu-button ul li:focus,
+.vjs-default-skin .vjs-menu-button ul li:hover,
+.vjs-default-skin .vjs-menu-button ul li.vjs-selected:focus,
+.vjs-default-skin .vjs-menu-button ul li.vjs-selected:hover {
+  outline: 0;
+  color: #111;
+  /* background-color-with-alpha */
+  background-color: #ffffff;
+  background-color: rgba(255, 255, 255, 0.75);
+  /* box-shadow */
+  -webkit-box-shadow: 0 0 1em #ffffff;
+  -moz-box-shadow: 0 0 1em #ffffff;
+  box-shadow: 0 0 1em #ffffff;
+}
+.vjs-default-skin .vjs-menu-button ul li.vjs-menu-title {
+  text-align: center;
+  text-transform: uppercase;
+  font-size: 1em;
+  line-height: 2em;
+  padding: 0;
+  margin: 0 0 0.3em 0;
+  font-weight: bold;
+  cursor: default;
+}
+/* Subtitles Button */
+.vjs-default-skin .vjs-subtitles-button:before {
+  content: "\e00c";
+}
+/* Captions Button */
+.vjs-default-skin .vjs-captions-button:before {
+  content: "\e008";
+}
+/* Replacement for focus outline */
+.vjs-default-skin .vjs-captions-button:focus .vjs-control-content:before,
+.vjs-default-skin .vjs-captions-button:hover .vjs-control-content:before {
+  /* box-shadow */
+  -webkit-box-shadow: 0 0 1em #ffffff;
+  -moz-box-shadow: 0 0 1em #ffffff;
+  box-shadow: 0 0 1em #ffffff;
+}
+/*
+REQUIRED STYLES (be careful overriding)
+================================================================================
+When loading the player, the video tag is replaced with a DIV,
+that will hold the video tag or object tag for other playback methods.
+The div contains the video playback element (Flash or HTML5) and controls,
+and sets the width and height of the video.
+
+** If you want to add some kind of border/padding (e.g. a frame), or special
+positioning, use another containing element. Otherwise you risk messing up
+control positioning and full window mode. **
+*/
+.video-js {
+  background-color: #000;
+  position: relative;
+  padding: 0;
+  /* Start with 10px for base font size so other dimensions can be em based and
+     easily calculable. */
+
+  font-size: 10px;
+  /* Allow poster to be vertially aligned. */
+
+  vertical-align: middle;
+  /*  display: table-cell; */
+  /*This works in Safari but not Firefox.*/
+
+  /* Provide some basic defaults for fonts */
+
+  font-weight: normal;
+  font-style: normal;
+  /* Avoiding helvetica: issue #376 */
+
+  font-family: Arial, sans-serif;
+  /* Turn off user selection (text highlighting) by default.
+     The majority of player components will not be text blocks.
+     Text areas will need to turn user selection back on. */
+
+  /* user-select */
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+/* Playback technology elements expand to the width/height of the containing div
+    <video> or <object> */
+.video-js .vjs-tech {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+/* Fix for Firefox 9 fullscreen (only if it is enabled). Not needed when
+   checking fullScreenEnabled. */
+.video-js:-moz-full-screen {
+  position: absolute;
+}
+/* Fullscreen Styles */
+body.vjs-full-window {
+  padding: 0;
+  margin: 0;
+  height: 100%;
+  /* Fix for IE6 full-window. http://www.cssplay.co.uk/layouts/fixed.html */
+  overflow-y: auto;
+}
+.video-js.vjs-fullscreen {
+  position: fixed;
+  overflow: hidden;
+  z-index: 1000;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+  width: 100% !important;
+  height: 100% !important;
+  /* IE6 full-window (underscore hack) */
+  _position: absolute;
+}
+.video-js:-webkit-full-screen {
+  width: 100% !important;
+  height: 100% !important;
+}
+.video-js.vjs-fullscreen.vjs-user-inactive {
+  cursor: none;
+}
+/* Poster Styles */
+.vjs-poster {
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+  background-size: contain;
+  cursor: pointer;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  position: relative;
+  width: 100%;
+}
+.vjs-poster img {
+  display: block;
+  margin: 0 auto;
+  max-height: 100%;
+  padding: 0;
+  width: 100%;
+}
+/* Hide the poster when native controls are used otherwise it covers them */
+.video-js.vjs-using-native-controls .vjs-poster {
+  display: none;
+}
+/* Text Track Styles */
+/* Overall track holder for both captions and subtitles */
+.video-js .vjs-text-track-display {
+  text-align: center;
+  position: absolute;
+  bottom: 4em;
+  /* Leave padding on left and right */
+  left: 1em;
+  right: 1em;
+}
+/* Individual tracks */
+.video-js .vjs-text-track {
+  display: none;
+  font-size: 1.4em;
+  text-align: center;
+  margin-bottom: 0.1em;
+  /* Transparent black background, or fallback to all black (oldIE) */
+  /* background-color-with-alpha */
+  background-color: #000000;
+  background-color: rgba(0, 0, 0, 0.5);
+}
+.video-js .vjs-subtitles {
+  color: #ffffff /* Subtitles are white */;
+}
+.video-js .vjs-captions {
+  color: #ffcc66 /* Captions are yellow */;
+}
+.vjs-tt-cue {
+  display: block;
+}
+/* Hide disabled or unsupported controls */
+.vjs-default-skin .vjs-hidden {
+  display: none;
+}
+.vjs-lock-showing {
+  display: block !important;
+  opacity: 1;
+  visibility: visible;
+}
+/* -----------------------------------------------------------------------------
+The original source of this file lives at
+https://github.com/videojs/video.js/blob/master/src/css/video-js.less */
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.min.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.min.css
new file mode 100644
index 0000000..d3a1d60
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.min.css
@@ -0,0 +1,5 @@
+/*!
+Video.js Default Styles (http://videojs.com)
+Version 4.3.0
+Create your own skin at http://designer.videojs.com
+*/.vjs-default-skin{color:#ccc}@font-face{font-family:VideoJS;src:url(font/vjs.eot);src:url(font/vjs.eot?#iefix) format('embedded-opentype'),url(font/vjs.woff) format('woff'),url(font/vjs.ttf) format('truetype');font-weight:400;font-style:normal}.vjs-default-skin .vjs-slider{outline:0;position:relative;cursor:pointer;padding:0;background-color:#333;background-color:rgba(51,51,51,.9)}.vjs-default-skin .vjs-slider:focus{-webkit-box-shadow:0 0 2em #fff;-moz-box-shadow:0 0 2em #fff;box-shadow:0 0 2em #fff}.vjs-default-skin .vjs-slider-handle{position:absolute;left:0;top:0}.vjs-default-skin .vjs-slider-handle:before{content:"\e009";font-family:VideoJS;font-size:1em;line-height:1;text-align:center;text-shadow:0 0 1em #fff;position:absolute;top:0;left:0;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.vjs-default-skin .vjs-control-bar{display:none;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#07141e;background-color:rgba(7,20,30,.7)}.vjs-default-skin.vjs-has-started .vjs-control-bar{display:block;visibility:visible;opacity:1;-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s;transition:visibility .1s,opacity .1s}.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{display:block;visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-default-skin.vjs-controls-disabled .vjs-control-bar{display:none}.vjs-default-skin.vjs-using-native-controls .vjs-control-bar{display:none}@media \0screen{.vjs-default-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:""}}.vjs-default-skin .vjs-control{outline:0;position:relative;float:left;text-align:center;margin:0;padding:0;height:3em;width:4em}.vjs-default-skin .vjs-control:before{font-family:VideoJS;font-size:1.5em;line-height:2;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.5)}.vjs-default-skin .vjs-control:focus:before,.vjs-default-skin .vjs-control:hover:before{text-shadow:0 0 1em #fff}.vjs-default-skin .vjs-control:focus{}.vjs-default-skin .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-default-skin .vjs-play-control{width:5em;cursor:pointer}.vjs-default-skin .vjs-play-control:before{content:"\e001"}.vjs-default-skin.vjs-playing .vjs-play-control:before{content:"\e002"}.vjs-default-skin .vjs-mute-control,.vjs-default-skin .vjs-volume-menu-button{cursor:pointer;float:right}.vjs-default-skin .vjs-mute-control:before,.vjs-default-skin .vjs-volume-menu-button:before{content:"\e006"}.vjs-default-skin .vjs-mute-control.vjs-vol-0:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-0:before{content:"\e003"}.vjs-default-skin .vjs-mute-control.vjs-vol-1:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-1:before{content:"\e004"}.vjs-default-skin .vjs-mute-control.vjs-vol-2:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-2:before{content:"\e005"}.vjs-default-skin .vjs-volume-control{width:5em;float:right}.vjs-default-skin .vjs-volume-bar{width:5em;height:.6em;margin:1.1em auto 0}.vjs-default-skin .vjs-volume-menu-button .vjs-menu-content{height:2.9em}.vjs-default-skin .vjs-volume-level{position:absolute;top:0;left:0;height:.5em;background:#66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat}.vjs-default-skin .vjs-volume-bar .vjs-volume-handle{width:.5em;height:.5em}.vjs-default-skin .vjs-volume-handle:before{font-size:.9em;top:-.2em;left:-.2em;width:1em;height:1em}.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content{width:6em;left:-4em}.vjs-default-skin .vjs-progress-control{position:absolute;left:0;right:0;width:auto;font-size:.3em;height:1em;top:-1em;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-default-skin:hover .vjs-progress-control{font-size:.9em;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-default-skin .vjs-progress-holder{height:100%}.vjs-default-skin .vjs-progress-holder .vjs-play-progress,.vjs-default-skin .vjs-progress-holder .vjs-load-progress{position:absolute;display:block;height:100%;margin:0;padding:0;left:0;top:0}.vjs-default-skin .vjs-play-progress{background:#66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat}.vjs-default-skin .vjs-load-progress{background:#646464;background:rgba(255,255,255,.4)}.vjs-default-skin .vjs-seek-handle{width:1.5em;height:100%}.vjs-default-skin .vjs-seek-handle:before{padding-top:.1em}.vjs-default-skin .vjs-time-controls{font-size:1em;line-height:3em}.vjs-default-skin .vjs-current-time{float:left}.vjs-default-skin .vjs-duration{float:left}.vjs-default-skin .vjs-remaining-time{display:none;float:left}.vjs-time-divider{float:left;line-height:3em}.vjs-default-skin .vjs-fullscreen-control{width:3.8em;cursor:pointer;float:right}.vjs-default-skin .vjs-fullscreen-control:before{content:"\e000"}.vjs-default-skin.vjs-fullscreen .vjs-fullscreen-control:before{content:"\e00b"}.vjs-default-skin .vjs-big-play-button{left:.5em;top:.5em;font-size:3em;display:block;z-index:2;position:absolute;width:4em;height:2.6em;text-align:center;vertical-align:middle;cursor:pointer;opacity:1;background-color:#07141e;background-color:rgba(7,20,30,.7);border:.1em solid #3b4249;-webkit-border-radius:.8em;-moz-border-radius:.8em;border-radius:.8em;-webkit-box-shadow:0 0 1em rgba(255,255,255,.25);-moz-box-shadow:0 0 1em rgba(255,255,255,.25);box-shadow:0 0 1em rgba(255,255,255,.25);-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-default-skin.vjs-big-play-centered .vjs-big-play-button{left:50%;margin-left:-2.1em;top:50%;margin-top:-1.4000000000000001em}.vjs-default-skin.vjs-controls-disabled .vjs-big-play-button{display:none}.vjs-default-skin.vjs-has-started .vjs-big-play-button{display:none}.vjs-default-skin.vjs-using-native-controls .vjs-big-play-button{display:none}.vjs-default-skin:hover .vjs-big-play-button,.vjs-default-skin .vjs-big-play-button:focus{outline:0;border-color:#fff;background-color:#505050;background-color:rgba(50,50,50,.75);-webkit-box-shadow:0 0 3em #fff;-moz-box-shadow:0 0 3em #fff;box-shadow:0 0 3em #fff;-webkit-transition:all 0s;-moz-transition:all 0s;-o-transition:all 0s;transition:all 0s}.vjs-default-skin .vjs-big-play-button:before{content:"\e001";font-family:VideoJS;line-height:2.6em;text-shadow:.05em .05em .1em #000;text-align:center;position:absolute;left:0;width:100%;height:100%}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;font-size:4em;line-height:1;width:1em;height:1em;margin-left:-.5em;margin-top:-.5em;opacity:.75;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}.vjs-default-skin .vjs-loading-spinner:before{content:"\e01e";font-family:VideoJS;position:absolute;top:0;left:0;width:1em;height:1em;text-align:center;text-shadow:0 0 .1em #000}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.vjs-default-skin .vjs-menu-button{float:right;cursor:pointer}.vjs-default-skin .vjs-menu{display:none;position:absolute;bottom:0;left:0;width:0;height:0;margin-bottom:3em;border-left:2em solid transparent;border-right:2em solid transparent;border-top:1.55em solid #000;border-top-color:rgba(7,40,50,.5)}.vjs-default-skin .vjs-menu-button .vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;position:absolute;width:10em;bottom:1.5em;max-height:15em;overflow:auto;left:-5em;background-color:#07141e;background-color:rgba(7,20,30,.7);-webkit-box-shadow:-.2em -.2em .3em rgba(255,255,255,.2);-moz-box-shadow:-.2em -.2em .3em rgba(255,255,255,.2);box-shadow:-.2em -.2em .3em rgba(255,255,255,.2)}.vjs-default-skin .vjs-menu-button:hover .vjs-menu{display:block}.vjs-default-skin .vjs-menu-button ul li{list-style:none;margin:0;padding:.3em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.vjs-default-skin .vjs-menu-button ul li.vjs-selected{background-color:#000}.vjs-default-skin .vjs-menu-button ul li:focus,.vjs-default-skin .vjs-menu-button ul li:hover,.vjs-default-skin .vjs-menu-button ul li.vjs-selected:focus,.vjs-default-skin .vjs-menu-button ul li.vjs-selected:hover{outline:0;color:#111;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.vjs-default-skin .vjs-menu-button ul li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:default}.vjs-default-skin .vjs-subtitles-button:before{content:"\e00c"}.vjs-default-skin .vjs-captions-button:before{content:"\e008"}.vjs-default-skin .vjs-captions-button:focus .vjs-control-content:before,.vjs-default-skin .vjs-captions-button:hover .vjs-control-content:before{-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.video-js{background-color:#000;position:relative;padding:0;font-size:10px;vertical-align:middle;font-weight:400;font-style:normal;font-family:Arial,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}.video-js:-moz-full-screen{position:absolute}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0;width:100%!important;height:100%!important;_position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-poster{background-repeat:no-repeat;background-position:50% 50%;background-size:contain;cursor:pointer;height:100%;margin:0;padding:0;position:relative;width:100%}.vjs-poster img{display:block;margin:0 auto;max-height:100%;padding:0;width:100%}.video-js.vjs-using-native-controls .vjs-poster{display:none}.video-js .vjs-text-track-display{text-align:center;position:absolute;bottom:4em;left:1em;right:1em}.video-js .vjs-text-track{display:none;font-size:1.4em;text-align:center;margin-bottom:.1em;background-color:#000;background-color:rgba(0,0,0,.5)}.video-js .vjs-subtitles{color:#fff}.video-js .vjs-captions{color:#fc6}.vjs-tt-cue{display:block}.vjs-default-skin .vjs-hidden{display:none}.vjs-lock-showing{display:block!important;opacity:1;visibility:visible}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.swf b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.swf
new file mode 100644
index 0000000..eef460a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video-js.swf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video.dev.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video.dev.js
new file mode 100644
index 0000000..d01ea60
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video.dev.js
@@ -0,0 +1,7108 @@
+/**
+ * @fileoverview Main function src.
+ */
+
+// HTML5 Shiv. Must be in <head> to support older browsers.
+document.createElement('video');
+document.createElement('audio');
+document.createElement('track');
+
+/**
+ * Doubles as the main function for users to create a player instance and also
+ * the main library object.
+ *
+ * **ALIASES** videojs, _V_ (deprecated)
+ *
+ * The `vjs` function can be used to initialize or retrieve a player.
+ *
+ *     var myPlayer = vjs('my_video_id');
+ *
+ * @param  {String|Element} id      Video element or video element ID
+ * @param  {Object=} options        Optional options object for config/settings
+ * @param  {Function=} ready        Optional ready callback
+ * @return {vjs.Player}             A player instance
+ * @namespace
+ */
+var vjs = function(id, options, ready){
+  var tag; // Element of ID
+
+  // Allow for element or ID to be passed in
+  // String ID
+  if (typeof id === 'string') {
+
+    // Adjust for jQuery ID syntax
+    if (id.indexOf('#') === 0) {
+      id = id.slice(1);
+    }
+
+    // If a player instance has already been created for this ID return it.
+    if (vjs.players[id]) {
+      return vjs.players[id];
+
+    // Otherwise get element for ID
+    } else {
+      tag = vjs.el(id);
+    }
+
+  // ID is a media element
+  } else {
+    tag = id;
+  }
+
+  // Check for a useable element
+  if (!tag || !tag.nodeName) { // re: nodeName, could be a box div also
+    throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns
+  }
+
+  // Element may have a player attr referring to an already created player instance.
+  // If not, set up a new player and return the instance.
+  return tag['player'] || new vjs.Player(tag, options, ready);
+};
+
+// Extended name, also available externally, window.videojs
+var videojs = vjs;
+window.videojs = window.vjs = vjs;
+
+// CDN Version. Used to target right flash swf.
+vjs.CDN_VERSION = '4.3';
+vjs.ACCESS_PROTOCOL = ('https:' == document.location.protocol ? 'https://' : 'http://');
+
+/**
+ * Global Player instance options, surfaced from vjs.Player.prototype.options_
+ * vjs.options = vjs.Player.prototype.options_
+ * All options should use string keys so they avoid
+ * renaming by closure compiler
+ * @type {Object}
+ */
+vjs.options = {
+  // Default order of fallback technology
+  'techOrder': ['html5','flash'],
+  // techOrder: ['flash','html5'],
+
+  'html5': {},
+  'flash': {},
+
+  // Default of web browser is 300x150. Should rely on source width/height.
+  'width': 300,
+  'height': 150,
+  // defaultVolume: 0.85,
+  'defaultVolume': 0.00, // The freakin seaguls are driving me crazy!
+
+  // Included control sets
+  'children': {
+    'mediaLoader': {},
+    'posterImage': {},
+    'textTrackDisplay': {},
+    'loadingSpinner': {},
+    'bigPlayButton': {},
+    'controlBar': {}
+  },
+
+  // Default message to show when a video cannot be played.
+  'notSupportedMessage': 'Sorry, no compatible source and playback ' +
+      'technology were found for this video. Try using another browser ' +
+      'like <a href="http://bit.ly/ccMUEC">Chrome</a> or download the ' +
+      'latest <a href="http://adobe.ly/mwfN1">Adobe Flash Player</a>.'
+};
+
+// Set CDN Version of swf
+// The added (+) blocks the replace from changing this 4.3 string
+if (vjs.CDN_VERSION !== 'GENERATED'+'_CDN_VSN') {
+  videojs.options['flash']['swf'] = vjs.ACCESS_PROTOCOL + 'vjs.zencdn.net/'+vjs.CDN_VERSION+'/video-js.swf';
+}
+
+/**
+ * Global player list
+ * @type {Object}
+ */
+vjs.players = {};
+/**
+ * Core Object/Class for objects that use inheritance + contstructors
+ *
+ * To create a class that can be subclassed itself, extend the CoreObject class.
+ *
+ *     var Animal = CoreObject.extend();
+ *     var Horse = Animal.extend();
+ *
+ * The constructor can be defined through the init property of an object argument.
+ *
+ *     var Animal = CoreObject.extend({
+ *       init: function(name, sound){
+ *         this.name = name;
+ *       }
+ *     });
+ *
+ * Other methods and properties can be added the same way, or directly to the
+ * prototype.
+ *
+ *    var Animal = CoreObject.extend({
+ *       init: function(name){
+ *         this.name = name;
+ *       },
+ *       getName: function(){
+ *         return this.name;
+ *       },
+ *       sound: '...'
+ *    });
+ *
+ *    Animal.prototype.makeSound = function(){
+ *      alert(this.sound);
+ *    };
+ *
+ * To create an instance of a class, use the create method.
+ *
+ *    var fluffy = Animal.create('Fluffy');
+ *    fluffy.getName(); // -> Fluffy
+ *
+ * Methods and properties can be overridden in subclasses.
+ *
+ *     var Horse = Animal.extend({
+ *       sound: 'Neighhhhh!'
+ *     });
+ *
+ *     var horsey = Horse.create('Horsey');
+ *     horsey.getName(); // -> Horsey
+ *     horsey.makeSound(); // -> Alert: Neighhhhh!
+ *
+ * @class
+ * @constructor
+ */
+vjs.CoreObject = vjs['CoreObject'] = function(){};
+// Manually exporting vjs['CoreObject'] here for Closure Compiler
+// because of the use of the extend/create class methods
+// If we didn't do this, those functions would get flattend to something like
+// `a = ...` and `this.prototype` would refer to the global object instead of
+// CoreObject
+
+/**
+ * Create a new object that inherits from this Object
+ *
+ *     var Animal = CoreObject.extend();
+ *     var Horse = Animal.extend();
+ *
+ * @param {Object} props Functions and properties to be applied to the
+ *                       new object's prototype
+ * @return {vjs.CoreObject} An object that inherits from CoreObject
+ * @this {*}
+ */
+vjs.CoreObject.extend = function(props){
+  var init, subObj;
+
+  props = props || {};
+  // Set up the constructor using the supplied init method
+  // or using the init of the parent object
+  // Make sure to check the unobfuscated version for external libs
+  init = props['init'] || props.init || this.prototype['init'] || this.prototype.init || function(){};
+  // In Resig's simple class inheritance (previously used) the constructor
+  //  is a function that calls `this.init.apply(arguments)`
+  // However that would prevent us from using `ParentObject.call(this);`
+  //  in a Child constuctor because the `this` in `this.init`
+  //  would still refer to the Child and cause an inifinite loop.
+  // We would instead have to do
+  //    `ParentObject.prototype.init.apply(this, argumnents);`
+  //  Bleh. We're not creating a _super() function, so it's good to keep
+  //  the parent constructor reference simple.
+  subObj = function(){
+    init.apply(this, arguments);
+  };
+
+  // Inherit from this object's prototype
+  subObj.prototype = vjs.obj.create(this.prototype);
+  // Reset the constructor property for subObj otherwise
+  // instances of subObj would have the constructor of the parent Object
+  subObj.prototype.constructor = subObj;
+
+  // Make the class extendable
+  subObj.extend = vjs.CoreObject.extend;
+  // Make a function for creating instances
+  subObj.create = vjs.CoreObject.create;
+
+  // Extend subObj's prototype with functions and other properties from props
+  for (var name in props) {
+    if (props.hasOwnProperty(name)) {
+      subObj.prototype[name] = props[name];
+    }
+  }
+
+  return subObj;
+};
+
+/**
+ * Create a new instace of this Object class
+ *
+ *     var myAnimal = Animal.create();
+ *
+ * @return {vjs.CoreObject} An instance of a CoreObject subclass
+ * @this {*}
+ */
+vjs.CoreObject.create = function(){
+  // Create a new object that inherits from this object's prototype
+  var inst = vjs.obj.create(this.prototype);
+
+  // Apply this constructor function to the new object
+  this.apply(inst, arguments);
+
+  // Return the new object
+  return inst;
+};
+/**
+ * @fileoverview Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)
+ * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)
+ * This should work very similarly to jQuery's events, however it's based off the book version which isn't as
+ * robust as jquery's, so there's probably some differences.
+ */
+
+/**
+ * Add an event listener to element
+ * It stores the handler function in a separate cache object
+ * and adds a generic handler to the element's event,
+ * along with a unique id (guid) to the element.
+ * @param  {Element|Object}   elem Element or object to bind listeners to
+ * @param  {String}   type Type of event to bind to.
+ * @param  {Function} fn   Event listener.
+ * @private
+ */
+vjs.on = function(elem, type, fn){
+  var data = vjs.getData(elem);
+
+  // We need a place to store all our handler data
+  if (!data.handlers) data.handlers = {};
+
+  if (!data.handlers[type]) data.handlers[type] = [];
+
+  if (!fn.guid) fn.guid = vjs.guid++;
+
+  data.handlers[type].push(fn);
+
+  if (!data.dispatcher) {
+    data.disabled = false;
+
+    data.dispatcher = function (event){
+
+      if (data.disabled) return;
+      event = vjs.fixEvent(event);
+
+      var handlers = data.handlers[event.type];
+
+      if (handlers) {
+        // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.
+        var handlersCopy = handlers.slice(0);
+
+        for (var m = 0, n = handlersCopy.length; m < n; m++) {
+          if (event.isImmediatePropagationStopped()) {
+            break;
+          } else {
+            handlersCopy[m].call(elem, event);
+          }
+        }
+      }
+    };
+  }
+
+  if (data.handlers[type].length == 1) {
+    if (document.addEventListener) {
+      elem.addEventListener(type, data.dispatcher, false);
+    } else if (document.attachEvent) {
+      elem.attachEvent('on' + type, data.dispatcher);
+    }
+  }
+};
+
+/**
+ * Removes event listeners from an element
+ * @param  {Element|Object}   elem Object to remove listeners from
+ * @param  {String=}   type Type of listener to remove. Don't include to remove all events from element.
+ * @param  {Function} fn   Specific listener to remove. Don't incldue to remove listeners for an event type.
+ * @private
+ */
+vjs.off = function(elem, type, fn) {
+  // Don't want to add a cache object through getData if not needed
+  if (!vjs.hasData(elem)) return;
+
+  var data = vjs.getData(elem);
+
+  // If no events exist, nothing to unbind
+  if (!data.handlers) { return; }
+
+  // Utility function
+  var removeType = function(t){
+     data.handlers[t] = [];
+     vjs.cleanUpEvents(elem,t);
+  };
+
+  // Are we removing all bound events?
+  if (!type) {
+    for (var t in data.handlers) removeType(t);
+    return;
+  }
+
+  var handlers = data.handlers[type];
+
+  // If no handlers exist, nothing to unbind
+  if (!handlers) return;
+
+  // If no listener was provided, remove all listeners for type
+  if (!fn) {
+    removeType(type);
+    return;
+  }
+
+  // We're only removing a single handler
+  if (fn.guid) {
+    for (var n = 0; n < handlers.length; n++) {
+      if (handlers[n].guid === fn.guid) {
+        handlers.splice(n--, 1);
+      }
+    }
+  }
+
+  vjs.cleanUpEvents(elem, type);
+};
+
+/**
+ * Clean up the listener cache and dispatchers
+ * @param  {Element|Object} elem Element to clean up
+ * @param  {String} type Type of event to clean up
+ * @private
+ */
+vjs.cleanUpEvents = function(elem, type) {
+  var data = vjs.getData(elem);
+
+  // Remove the events of a particular type if there are none left
+  if (data.handlers[type].length === 0) {
+    delete data.handlers[type];
+    // data.handlers[type] = null;
+    // Setting to null was causing an error with data.handlers
+
+    // Remove the meta-handler from the element
+    if (document.removeEventListener) {
+      elem.removeEventListener(type, data.dispatcher, false);
+    } else if (document.detachEvent) {
+      elem.detachEvent('on' + type, data.dispatcher);
+    }
+  }
+
+  // Remove the events object if there are no types left
+  if (vjs.isEmpty(data.handlers)) {
+    delete data.handlers;
+    delete data.dispatcher;
+    delete data.disabled;
+
+    // data.handlers = null;
+    // data.dispatcher = null;
+    // data.disabled = null;
+  }
+
+  // Finally remove the expando if there is no data left
+  if (vjs.isEmpty(data)) {
+    vjs.removeData(elem);
+  }
+};
+
+/**
+ * Fix a native event to have standard property values
+ * @param  {Object} event Event object to fix
+ * @return {Object}
+ * @private
+ */
+vjs.fixEvent = function(event) {
+
+  function returnTrue() { return true; }
+  function returnFalse() { return false; }
+
+  // Test if fixing up is needed
+  // Used to check if !event.stopPropagation instead of isPropagationStopped
+  // But native events return true for stopPropagation, but don't have
+  // other expected methods like isPropagationStopped. Seems to be a problem
+  // with the Javascript Ninja code. So we're just overriding all events now.
+  if (!event || !event.isPropagationStopped) {
+    var old = event || window.event;
+
+    event = {};
+    // Clone the old object so that we can modify the values event = {};
+    // IE8 Doesn't like when you mess with native event properties
+    // Firefox returns false for event.hasOwnProperty('type') and other props
+    //  which makes copying more difficult.
+    // TODO: Probably best to create a whitelist of event props
+    for (var key in old) {
+      // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y
+      if (key !== 'layerX' && key !== 'layerY') {
+        event[key] = old[key];
+      }
+    }
+
+    // The event occurred on this element
+    if (!event.target) {
+      event.target = event.srcElement || document;
+    }
+
+    // Handle which other element the event is related to
+    event.relatedTarget = event.fromElement === event.target ?
+      event.toElement :
+      event.fromElement;
+
+    // Stop the default browser action
+    event.preventDefault = function () {
+      if (old.preventDefault) {
+        old.preventDefault();
+      }
+      event.returnValue = false;
+      event.isDefaultPrevented = returnTrue;
+    };
+
+    event.isDefaultPrevented = returnFalse;
+
+    // Stop the event from bubbling
+    event.stopPropagation = function () {
+      if (old.stopPropagation) {
+        old.stopPropagation();
+      }
+      event.cancelBubble = true;
+      event.isPropagationStopped = returnTrue;
+    };
+
+    event.isPropagationStopped = returnFalse;
+
+    // Stop the event from bubbling and executing other handlers
+    event.stopImmediatePropagation = function () {
+      if (old.stopImmediatePropagation) {
+        old.stopImmediatePropagation();
+      }
+      event.isImmediatePropagationStopped = returnTrue;
+      event.stopPropagation();
+    };
+
+    event.isImmediatePropagationStopped = returnFalse;
+
+    // Handle mouse position
+    if (event.clientX != null) {
+      var doc = document.documentElement, body = document.body;
+
+      event.pageX = event.clientX +
+        (doc && doc.scrollLeft || body && body.scrollLeft || 0) -
+        (doc && doc.clientLeft || body && body.clientLeft || 0);
+      event.pageY = event.clientY +
+        (doc && doc.scrollTop || body && body.scrollTop || 0) -
+        (doc && doc.clientTop || body && body.clientTop || 0);
+    }
+
+    // Handle key presses
+    event.which = event.charCode || event.keyCode;
+
+    // Fix button for mouse clicks:
+    // 0 == left; 1 == middle; 2 == right
+    if (event.button != null) {
+      event.button = (event.button & 1 ? 0 :
+        (event.button & 4 ? 1 :
+          (event.button & 2 ? 2 : 0)));
+    }
+  }
+
+  // Returns fixed-up instance
+  return event;
+};
+
+/**
+ * Trigger an event for an element
+ * @param  {Element|Object} elem  Element to trigger an event on
+ * @param  {String} event Type of event to trigger
+ * @private
+ */
+vjs.trigger = function(elem, event) {
+  // Fetches element data and a reference to the parent (for bubbling).
+  // Don't want to add a data object to cache for every parent,
+  // so checking hasData first.
+  var elemData = (vjs.hasData(elem)) ? vjs.getData(elem) : {};
+  var parent = elem.parentNode || elem.ownerDocument;
+      // type = event.type || event,
+      // handler;
+
+  // If an event name was passed as a string, creates an event out of it
+  if (typeof event === 'string') {
+    event = { type:event, target:elem };
+  }
+  // Normalizes the event properties.
+  event = vjs.fixEvent(event);
+
+  // If the passed element has a dispatcher, executes the established handlers.
+  if (elemData.dispatcher) {
+    elemData.dispatcher.call(elem, event);
+  }
+
+  // Unless explicitly stopped or the event does not bubble (e.g. media events)
+    // recursively calls this function to bubble the event up the DOM.
+    if (parent && !event.isPropagationStopped() && event.bubbles !== false) {
+    vjs.trigger(parent, event);
+
+  // If at the top of the DOM, triggers the default action unless disabled.
+  } else if (!parent && !event.isDefaultPrevented()) {
+    var targetData = vjs.getData(event.target);
+
+    // Checks if the target has a default action for this event.
+    if (event.target[event.type]) {
+      // Temporarily disables event dispatching on the target as we have already executed the handler.
+      targetData.disabled = true;
+      // Executes the default action.
+      if (typeof event.target[event.type] === 'function') {
+        event.target[event.type]();
+      }
+      // Re-enables event dispatching.
+      targetData.disabled = false;
+    }
+  }
+
+  // Inform the triggerer if the default was prevented by returning false
+  return !event.isDefaultPrevented();
+  /* Original version of js ninja events wasn't complete.
+   * We've since updated to the latest version, but keeping this around
+   * for now just in case.
+   */
+  // // Added in attion to book. Book code was broke.
+  // event = typeof event === 'object' ?
+  //   event[vjs.expando] ?
+  //     event :
+  //     new vjs.Event(type, event) :
+  //   new vjs.Event(type);
+
+  // event.type = type;
+  // if (handler) {
+  //   handler.call(elem, event);
+  // }
+
+  // // Clean up the event in case it is being reused
+  // event.result = undefined;
+  // event.target = elem;
+};
+
+/**
+ * Trigger a listener only once for an event
+ * @param  {Element|Object}   elem Element or object to
+ * @param  {String}   type
+ * @param  {Function} fn
+ * @private
+ */
+vjs.one = function(elem, type, fn) {
+  var func = function(){
+    vjs.off(elem, type, func);
+    fn.apply(this, arguments);
+  };
+  func.guid = fn.guid = fn.guid || vjs.guid++;
+  vjs.on(elem, type, func);
+};
+var hasOwnProp = Object.prototype.hasOwnProperty;
+
+/**
+ * Creates an element and applies properties.
+ * @param  {String=} tagName    Name of tag to be created.
+ * @param  {Object=} properties Element properties to be applied.
+ * @return {Element}
+ * @private
+ */
+vjs.createEl = function(tagName, properties){
+  var el, propName;
+
+  el = document.createElement(tagName || 'div');
+
+  for (propName in properties){
+    if (hasOwnProp.call(properties, propName)) {
+      //el[propName] = properties[propName];
+      // Not remembering why we were checking for dash
+      // but using setAttribute means you have to use getAttribute
+
+      // The check for dash checks for the aria-* attributes, like aria-label, aria-valuemin.
+      // The additional check for "role" is because the default method for adding attributes does not
+      // add the attribute "role". My guess is because it's not a valid attribute in some namespaces, although
+      // browsers handle the attribute just fine. The W3C allows for aria-* attributes to be used in pre-HTML5 docs.
+      // http://www.w3.org/TR/wai-aria-primer/#ariahtml. Using setAttribute gets around this problem.
+
+       if (propName.indexOf('aria-') !== -1 || propName=='role') {
+         el.setAttribute(propName, properties[propName]);
+       } else {
+         el[propName] = properties[propName];
+       }
+    }
+  }
+  return el;
+};
+
+/**
+ * Uppercase the first letter of a string
+ * @param  {String} string String to be uppercased
+ * @return {String}
+ * @private
+ */
+vjs.capitalize = function(string){
+  return string.charAt(0).toUpperCase() + string.slice(1);
+};
+
+/**
+ * Object functions container
+ * @type {Object}
+ * @private
+ */
+vjs.obj = {};
+
+/**
+ * Object.create shim for prototypal inheritance
+ *
+ * https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create
+ *
+ * @function
+ * @param  {Object}   obj Object to use as prototype
+ * @private
+ */
+ vjs.obj.create = Object.create || function(obj){
+  //Create a new function called 'F' which is just an empty object.
+  function F() {}
+
+  //the prototype of the 'F' function should point to the
+  //parameter of the anonymous function.
+  F.prototype = obj;
+
+  //create a new constructor function based off of the 'F' function.
+  return new F();
+};
+
+/**
+ * Loop through each property in an object and call a function
+ * whose arguments are (key,value)
+ * @param  {Object}   obj Object of properties
+ * @param  {Function} fn  Function to be called on each property.
+ * @this {*}
+ * @private
+ */
+vjs.obj.each = function(obj, fn, context){
+  for (var key in obj) {
+    if (hasOwnProp.call(obj, key)) {
+      fn.call(context || this, key, obj[key]);
+    }
+  }
+};
+
+/**
+ * Merge two objects together and return the original.
+ * @param  {Object} obj1
+ * @param  {Object} obj2
+ * @return {Object}
+ * @private
+ */
+vjs.obj.merge = function(obj1, obj2){
+  if (!obj2) { return obj1; }
+  for (var key in obj2){
+    if (hasOwnProp.call(obj2, key)) {
+      obj1[key] = obj2[key];
+    }
+  }
+  return obj1;
+};
+
+/**
+ * Merge two objects, and merge any properties that are objects
+ * instead of just overwriting one. Uses to merge options hashes
+ * where deeper default settings are important.
+ * @param  {Object} obj1 Object to override
+ * @param  {Object} obj2 Overriding object
+ * @return {Object}      New object. Obj1 and Obj2 will be untouched.
+ * @private
+ */
+vjs.obj.deepMerge = function(obj1, obj2){
+  var key, val1, val2;
+
+  // make a copy of obj1 so we're not ovewriting original values.
+  // like prototype.options_ and all sub options objects
+  obj1 = vjs.obj.copy(obj1);
+
+  for (key in obj2){
+    if (hasOwnProp.call(obj2, key)) {
+      val1 = obj1[key];
+      val2 = obj2[key];
+
+      // Check if both properties are pure objects and do a deep merge if so
+      if (vjs.obj.isPlain(val1) && vjs.obj.isPlain(val2)) {
+        obj1[key] = vjs.obj.deepMerge(val1, val2);
+      } else {
+        obj1[key] = obj2[key];
+      }
+    }
+  }
+  return obj1;
+};
+
+/**
+ * Make a copy of the supplied object
+ * @param  {Object} obj Object to copy
+ * @return {Object}     Copy of object
+ * @private
+ */
+vjs.obj.copy = function(obj){
+  return vjs.obj.merge({}, obj);
+};
+
+/**
+ * Check if an object is plain, and not a dom node or any object sub-instance
+ * @param  {Object} obj Object to check
+ * @return {Boolean}     True if plain, false otherwise
+ * @private
+ */
+vjs.obj.isPlain = function(obj){
+  return !!obj
+    && typeof obj === 'object'
+    && obj.toString() === '[object Object]'
+    && obj.constructor === Object;
+};
+
+/**
+ * Bind (a.k.a proxy or Context). A simple method for changing the context of a function
+   It also stores a unique id on the function so it can be easily removed from events
+ * @param  {*}   context The object to bind as scope
+ * @param  {Function} fn      The function to be bound to a scope
+ * @param  {Number=}   uid     An optional unique ID for the function to be set
+ * @return {Function}
+ * @private
+ */
+vjs.bind = function(context, fn, uid) {
+  // Make sure the function has a unique ID
+  if (!fn.guid) { fn.guid = vjs.guid++; }
+
+  // Create the new function that changes the context
+  var ret = function() {
+    return fn.apply(context, arguments);
+  };
+
+  // Allow for the ability to individualize this function
+  // Needed in the case where multiple objects might share the same prototype
+  // IF both items add an event listener with the same function, then you try to remove just one
+  // it will remove both because they both have the same guid.
+  // when using this, you need to use the bind method when you remove the listener as well.
+  // currently used in text tracks
+  ret.guid = (uid) ? uid + '_' + fn.guid : fn.guid;
+
+  return ret;
+};
+
+/**
+ * Element Data Store. Allows for binding data to an element without putting it directly on the element.
+ * Ex. Event listneres are stored here.
+ * (also from jsninja.com, slightly modified and updated for closure compiler)
+ * @type {Object}
+ * @private
+ */
+vjs.cache = {};
+
+/**
+ * Unique ID for an element or function
+ * @type {Number}
+ * @private
+ */
+vjs.guid = 1;
+
+/**
+ * Unique attribute name to store an element's guid in
+ * @type {String}
+ * @constant
+ * @private
+ */
+vjs.expando = 'vdata' + (new Date()).getTime();
+
+/**
+ * Returns the cache object where data for an element is stored
+ * @param  {Element} el Element to store data for.
+ * @return {Object}
+ * @private
+ */
+vjs.getData = function(el){
+  var id = el[vjs.expando];
+  if (!id) {
+    id = el[vjs.expando] = vjs.guid++;
+    vjs.cache[id] = {};
+  }
+  return vjs.cache[id];
+};
+
+/**
+ * Returns the cache object where data for an element is stored
+ * @param  {Element} el Element to store data for.
+ * @return {Object}
+ * @private
+ */
+vjs.hasData = function(el){
+  var id = el[vjs.expando];
+  return !(!id || vjs.isEmpty(vjs.cache[id]));
+};
+
+/**
+ * Delete data for the element from the cache and the guid attr from getElementById
+ * @param  {Element} el Remove data for an element
+ * @private
+ */
+vjs.removeData = function(el){
+  var id = el[vjs.expando];
+  if (!id) { return; }
+  // Remove all stored data
+  // Changed to = null
+  // http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/
+  // vjs.cache[id] = null;
+  delete vjs.cache[id];
+
+  // Remove the expando property from the DOM node
+  try {
+    delete el[vjs.expando];
+  } catch(e) {
+    if (el.removeAttribute) {
+      el.removeAttribute(vjs.expando);
+    } else {
+      // IE doesn't appear to support removeAttribute on the document element
+      el[vjs.expando] = null;
+    }
+  }
+};
+
+/**
+ * Check if an object is empty
+ * @param  {Object}  obj The object to check for emptiness
+ * @return {Boolean}
+ * @private
+ */
+vjs.isEmpty = function(obj) {
+  for (var prop in obj) {
+    // Inlude null properties as empty.
+    if (obj[prop] !== null) {
+      return false;
+    }
+  }
+  return true;
+};
+
+/**
+ * Add a CSS class name to an element
+ * @param {Element} element    Element to add class name to
+ * @param {String} classToAdd Classname to add
+ * @private
+ */
+vjs.addClass = function(element, classToAdd){
+  if ((' '+element.className+' ').indexOf(' '+classToAdd+' ') == -1) {
+    element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;
+  }
+};
+
+/**
+ * Remove a CSS class name from an element
+ * @param {Element} element    Element to remove from class name
+ * @param {String} classToAdd Classname to remove
+ * @private
+ */
+vjs.removeClass = function(element, classToRemove){
+  var classNames, i;
+
+  if (element.className.indexOf(classToRemove) == -1) { return; }
+
+  classNames = element.className.split(' ');
+
+  // no arr.indexOf in ie8, and we don't want to add a big shim
+  for (i = classNames.length - 1; i >= 0; i--) {
+    if (classNames[i] === classToRemove) {
+      classNames.splice(i,1);
+    }
+  }
+
+  element.className = classNames.join(' ');
+};
+
+/**
+ * Element for testing browser HTML5 video capabilities
+ * @type {Element}
+ * @constant
+ * @private
+ */
+vjs.TEST_VID = vjs.createEl('video');
+
+/**
+ * Useragent for browser testing.
+ * @type {String}
+ * @constant
+ * @private
+ */
+vjs.USER_AGENT = navigator.userAgent;
+
+/**
+ * Device is an iPhone
+ * @type {Boolean}
+ * @constant
+ * @private
+ */
+vjs.IS_IPHONE = (/iPhone/i).test(vjs.USER_AGENT);
+vjs.IS_IPAD = (/iPad/i).test(vjs.USER_AGENT);
+vjs.IS_IPOD = (/iPod/i).test(vjs.USER_AGENT);
+vjs.IS_IOS = vjs.IS_IPHONE || vjs.IS_IPAD || vjs.IS_IPOD;
+
+vjs.IOS_VERSION = (function(){
+  var match = vjs.USER_AGENT.match(/OS (\d+)_/i);
+  if (match && match[1]) { return match[1]; }
+})();
+
+vjs.IS_ANDROID = (/Android/i).test(vjs.USER_AGENT);
+vjs.ANDROID_VERSION = (function() {
+  // This matches Android Major.Minor.Patch versions
+  // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned
+  var match = vjs.USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),
+    major,
+    minor;
+
+  if (!match) {
+    return null;
+  }
+
+  major = match[1] && parseFloat(match[1]);
+  minor = match[2] && parseFloat(match[2]);
+
+  if (major && minor) {
+    return parseFloat(match[1] + '.' + match[2]);
+  } else if (major) {
+    return major;
+  } else {
+    return null;
+  }
+})();
+// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser
+vjs.IS_OLD_ANDROID = vjs.IS_ANDROID && (/webkit/i).test(vjs.USER_AGENT) && vjs.ANDROID_VERSION < 2.3;
+
+vjs.IS_FIREFOX = (/Firefox/i).test(vjs.USER_AGENT);
+vjs.IS_CHROME = (/Chrome/i).test(vjs.USER_AGENT);
+
+vjs.TOUCH_ENABLED = !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch);
+
+/**
+ * Get an element's attribute values, as defined on the HTML tag
+ * Attributs are not the same as properties. They're defined on the tag
+ * or with setAttribute (which shouldn't be used with HTML)
+ * This will return true or false for boolean attributes.
+ * @param  {Element} tag Element from which to get tag attributes
+ * @return {Object}
+ * @private
+ */
+vjs.getAttributeValues = function(tag){
+  var obj, knownBooleans, attrs, attrName, attrVal;
+
+  obj = {};
+
+  // known boolean attributes
+  // we can check for matching boolean properties, but older browsers
+  // won't know about HTML5 boolean attributes that we still read from
+  knownBooleans = ','+'autoplay,controls,loop,muted,default'+',';
+
+  if (tag && tag.attributes && tag.attributes.length > 0) {
+    attrs = tag.attributes;
+
+    for (var i = attrs.length - 1; i >= 0; i--) {
+      attrName = attrs[i].name;
+      attrVal = attrs[i].value;
+
+      // check for known booleans
+      // the matching element property will return a value for typeof
+      if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(','+attrName+',') !== -1) {
+        // the value of an included boolean attribute is typically an empty
+        // string ('') which would equal false if we just check for a false value.
+        // we also don't want support bad code like autoplay='false'
+        attrVal = (attrVal !== null) ? true : false;
+      }
+
+      obj[attrName] = attrVal;
+    }
+  }
+
+  return obj;
+};
+
+/**
+ * Get the computed style value for an element
+ * From http://robertnyman.com/2006/04/24/get-the-rendered-style-of-an-element/
+ * @param  {Element} el        Element to get style value for
+ * @param  {String} strCssRule Style name
+ * @return {String}            Style value
+ * @private
+ */
+vjs.getComputedDimension = function(el, strCssRule){
+  var strValue = '';
+  if(document.defaultView && document.defaultView.getComputedStyle){
+    strValue = document.defaultView.getComputedStyle(el, '').getPropertyValue(strCssRule);
+
+  } else if(el.currentStyle){
+    // IE8 Width/Height support
+    strValue = el['client'+strCssRule.substr(0,1).toUpperCase() + strCssRule.substr(1)] + 'px';
+  }
+  return strValue;
+};
+
+/**
+ * Insert an element as the first child node of another
+ * @param  {Element} child   Element to insert
+ * @param  {[type]} parent Element to insert child into
+ * @private
+ */
+vjs.insertFirst = function(child, parent){
+  if (parent.firstChild) {
+    parent.insertBefore(child, parent.firstChild);
+  } else {
+    parent.appendChild(child);
+  }
+};
+
+/**
+ * Object to hold browser support information
+ * @type {Object}
+ * @private
+ */
+vjs.support = {};
+
+/**
+ * Shorthand for document.getElementById()
+ * Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.
+ * @param  {String} id  Element ID
+ * @return {Element}    Element with supplied ID
+ * @private
+ */
+vjs.el = function(id){
+  if (id.indexOf('#') === 0) {
+    id = id.slice(1);
+  }
+
+  return document.getElementById(id);
+};
+
+/**
+ * Format seconds as a time string, H:MM:SS or M:SS
+ * Supplying a guide (in seconds) will force a number of leading zeros
+ * to cover the length of the guide
+ * @param  {Number} seconds Number of seconds to be turned into a string
+ * @param  {Number} guide   Number (in seconds) to model the string after
+ * @return {String}         Time formatted as H:MM:SS or M:SS
+ * @private
+ */
+vjs.formatTime = function(seconds, guide) {
+  // Default to using seconds as guide
+  guide = guide || seconds;
+  var s = Math.floor(seconds % 60),
+      m = Math.floor(seconds / 60 % 60),
+      h = Math.floor(seconds / 3600),
+      gm = Math.floor(guide / 60 % 60),
+      gh = Math.floor(guide / 3600);
+
+  // handle invalid times
+  if (isNaN(seconds) || seconds === Infinity) {
+    // '-' is false for all relational operators (e.g. <, >=) so this setting
+    // will add the minimum number of fields specified by the guide
+    h = m = s = '-';
+  }
+
+  // Check if we need to show hours
+  h = (h > 0 || gh > 0) ? h + ':' : '';
+
+  // If hours are showing, we may need to add a leading zero.
+  // Always show at least one digit of minutes.
+  m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';
+
+  // Check if leading zero is need for seconds
+  s = (s < 10) ? '0' + s : s;
+
+  return h + m + s;
+};
+
+// Attempt to block the ability to select text while dragging controls
+vjs.blockTextSelection = function(){
+  document.body.focus();
+  document.onselectstart = function () { return false; };
+};
+// Turn off text selection blocking
+vjs.unblockTextSelection = function(){ document.onselectstart = function () { return true; }; };
+
+/**
+ * Trim whitespace from the ends of a string.
+ * @param  {String} string String to trim
+ * @return {String}        Trimmed string
+ * @private
+ */
+vjs.trim = function(str){
+  return (str+'').replace(/^\s+|\s+$/g, '');
+};
+
+/**
+ * Should round off a number to a decimal place
+ * @param  {Number} num Number to round
+ * @param  {Number} dec Number of decimal places to round to
+ * @return {Number}     Rounded number
+ * @private
+ */
+vjs.round = function(num, dec) {
+  if (!dec) { dec = 0; }
+  return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
+};
+
+/**
+ * Should create a fake TimeRange object
+ * Mimics an HTML5 time range instance, which has functions that
+ * return the start and end times for a range
+ * TimeRanges are returned by the buffered() method
+ * @param  {Number} start Start time in seconds
+ * @param  {Number} end   End time in seconds
+ * @return {Object}       Fake TimeRange object
+ * @private
+ */
+vjs.createTimeRange = function(start, end){
+  return {
+    length: 1,
+    start: function() { return start; },
+    end: function() { return end; }
+  };
+};
+
+/**
+ * Simple http request for retrieving external files (e.g. text tracks)
+ * @param  {String} url           URL of resource
+ * @param  {Function=} onSuccess  Success callback
+ * @param  {Function=} onError    Error callback
+ * @private
+ */
+vjs.get = function(url, onSuccess, onError){
+  var local, request;
+
+  if (typeof XMLHttpRequest === 'undefined') {
+    window.XMLHttpRequest = function () {
+      try { return new window.ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch (e) {}
+      try { return new window.ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch (f) {}
+      try { return new window.ActiveXObject('Msxml2.XMLHTTP'); } catch (g) {}
+      throw new Error('This browser does not support XMLHttpRequest.');
+    };
+  }
+
+  request = new XMLHttpRequest();
+  try {
+    request.open('GET', url);
+  } catch(e) {
+    onError(e);
+  }
+
+  local = (url.indexOf('file:') === 0 || (window.location.href.indexOf('file:') === 0 && url.indexOf('http') === -1));
+
+  request.onreadystatechange = function() {
+    if (request.readyState === 4) {
+      if (request.status === 200 || local && request.status === 0) {
+        onSuccess(request.responseText);
+      } else {
+        if (onError) {
+          onError();
+        }
+      }
+    }
+  };
+
+  try {
+    request.send();
+  } catch(e) {
+    if (onError) {
+      onError(e);
+    }
+  }
+};
+
+/**
+ * Add to local storage (may removeable)
+ * @private
+ */
+vjs.setLocalStorage = function(key, value){
+  try {
+    // IE was throwing errors referencing the var anywhere without this
+    var localStorage = window.localStorage || false;
+    if (!localStorage) { return; }
+    localStorage[key] = value;
+  } catch(e) {
+    if (e.code == 22 || e.code == 1014) { // Webkit == 22 / Firefox == 1014
+      vjs.log('LocalStorage Full (VideoJS)', e);
+    } else {
+      if (e.code == 18) {
+        vjs.log('LocalStorage not allowed (VideoJS)', e);
+      } else {
+        vjs.log('LocalStorage Error (VideoJS)', e);
+      }
+    }
+  }
+};
+
+/**
+ * Get abosolute version of relative URL. Used to tell flash correct URL.
+ * http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
+ * @param  {String} url URL to make absolute
+ * @return {String}     Absolute URL
+ * @private
+ */
+vjs.getAbsoluteURL = function(url){
+
+  // Check if absolute URL
+  if (!url.match(/^https?:\/\//)) {
+    // Convert to absolute URL. Flash hosted off-site needs an absolute URL.
+    url = vjs.createEl('div', {
+      innerHTML: '<a href="'+url+'">x</a>'
+    }).firstChild.href;
+  }
+
+  return url;
+};
+
+// usage: log('inside coolFunc',this,arguments);
+// http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
+vjs.log = function(){
+  vjs.log.history = vjs.log.history || [];   // store logs to an array for reference
+  vjs.log.history.push(arguments);
+  if(window.console){
+    window.console.log(Array.prototype.slice.call(arguments));
+  }
+};
+
+// Offset Left
+// getBoundingClientRect technique from John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/
+vjs.findPosition = function(el) {
+    var box, docEl, body, clientLeft, scrollLeft, left, clientTop, scrollTop, top;
+
+    if (el.getBoundingClientRect && el.parentNode) {
+      box = el.getBoundingClientRect();
+    }
+
+    if (!box) {
+      return {
+        left: 0,
+        top: 0
+      };
+    }
+
+    docEl = document.documentElement;
+    body = document.body;
+
+    clientLeft = docEl.clientLeft || body.clientLeft || 0;
+    scrollLeft = window.pageXOffset || body.scrollLeft;
+    left = box.left + scrollLeft - clientLeft;
+
+    clientTop = docEl.clientTop || body.clientTop || 0;
+    scrollTop = window.pageYOffset || body.scrollTop;
+    top = box.top + scrollTop - clientTop;
+
+    return {
+      left: left,
+      top: top
+    };
+};
+/**
+ * @fileoverview Player Component - Base class for all UI objects
+ *
+ */
+
+/**
+ * Base UI Component class
+ *
+ * Components are embeddable UI objects that are represented by both a
+ * javascript object and an element in the DOM. They can be children of other
+ * components, and can have many children themselves.
+ *
+ *     // adding a button to the player
+ *     var button = player.addChild('button');
+ *     button.el(); // -> button element
+ *
+ *     <div class="video-js">
+ *       <div class="vjs-button">Button</div>
+ *     </div>
+ *
+ * Components are also event emitters.
+ *
+ *     button.on('click', function(){
+ *       console.log('Button Clicked!');
+ *     });
+ *
+ *     button.trigger('customevent');
+ *
+ * @param {Object} player  Main Player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ * @extends vjs.CoreObject
+ */
+vjs.Component = vjs.CoreObject.extend({
+  /**
+   * the constructor funciton for the class
+   *
+   * @constructor
+   */
+  init: function(player, options, ready){
+    this.player_ = player;
+
+    // Make a copy of prototype.options_ to protect against overriding global defaults
+    this.options_ = vjs.obj.copy(this.options_);
+
+    // Updated options with supplied options
+    options = this.options(options);
+
+    // Get ID from options, element, or create using player ID and unique ID
+    this.id_ = options['id'] || ((options['el'] && options['el']['id']) ? options['el']['id'] : player.id() + '_component_' + vjs.guid++ );
+
+    this.name_ = options['name'] || null;
+
+    // Create element if one wasn't provided in options
+    this.el_ = options['el'] || this.createEl();
+
+    this.children_ = [];
+    this.childIndex_ = {};
+    this.childNameIndex_ = {};
+
+    // Add any child components in options
+    this.initChildren();
+
+    this.ready(ready);
+    // Don't want to trigger ready here or it will before init is actually
+    // finished for all children that run this constructor
+  }
+});
+
+/**
+ * Dispose of the component and all child components
+ */
+vjs.Component.prototype.dispose = function(){
+  this.trigger('dispose');
+
+  // Dispose all children.
+  if (this.children_) {
+    for (var i = this.children_.length - 1; i >= 0; i--) {
+      if (this.children_[i].dispose) {
+        this.children_[i].dispose();
+      }
+    }
+  }
+
+  // Delete child references
+  this.children_ = null;
+  this.childIndex_ = null;
+  this.childNameIndex_ = null;
+
+  // Remove all event listeners.
+  this.off();
+
+  // Remove element from DOM
+  if (this.el_.parentNode) {
+    this.el_.parentNode.removeChild(this.el_);
+  }
+
+  vjs.removeData(this.el_);
+  this.el_ = null;
+};
+
+/**
+ * Reference to main player instance
+ *
+ * @type {vjs.Player}
+ * @private
+ */
+vjs.Component.prototype.player_ = true;
+
+/**
+ * Return the component's player
+ *
+ * @return {vjs.Player}
+ */
+vjs.Component.prototype.player = function(){
+  return this.player_;
+};
+
+/**
+ * The component's options object
+ *
+ * @type {Object}
+ * @private
+ */
+vjs.Component.prototype.options_;
+
+/**
+ * Deep merge of options objects
+ *
+ * Whenever a property is an object on both options objects
+ * the two properties will be merged using vjs.obj.deepMerge.
+ *
+ * This is used for merging options for child components. We
+ * want it to be easy to override individual options on a child
+ * component without having to rewrite all the other default options.
+ *
+ *     Parent.prototype.options_ = {
+ *       children: {
+ *         'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },
+ *         'childTwo': {},
+ *         'childThree': {}
+ *       }
+ *     }
+ *     newOptions = {
+ *       children: {
+ *         'childOne': { 'foo': 'baz', 'abc': '123' }
+ *         'childTwo': null,
+ *         'childFour': {}
+ *       }
+ *     }
+ *
+ *     this.options(newOptions);
+ *
+ * RESULT
+ *
+ *     {
+ *       children: {
+ *         'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },
+ *         'childTwo': null, // Disabled. Won't be initialized.
+ *         'childThree': {},
+ *         'childFour': {}
+ *       }
+ *     }
+ *
+ * @param  {Object} obj Object whose values will be overwritten
+ * @return {Object}     NEW merged object. Does not return obj1.
+ */
+vjs.Component.prototype.options = function(obj){
+  if (obj === undefined) return this.options_;
+
+  return this.options_ = vjs.obj.deepMerge(this.options_, obj);
+};
+
+/**
+ * The DOM element for the component
+ *
+ * @type {Element}
+ * @private
+ */
+vjs.Component.prototype.el_;
+
+/**
+ * Create the component's DOM element
+ *
+ * @param  {String=} tagName  Element's node type. e.g. 'div'
+ * @param  {Object=} attributes An object of element attributes that should be set on the element
+ * @return {Element}
+ */
+vjs.Component.prototype.createEl = function(tagName, attributes){
+  return vjs.createEl(tagName, attributes);
+};
+
+/**
+ * Get the component's DOM element
+ *
+ *     var domEl = myComponent.el();
+ *
+ * @return {Element}
+ */
+vjs.Component.prototype.el = function(){
+  return this.el_;
+};
+
+/**
+ * An optional element where, if defined, children will be inserted instead of
+ * directly in `el_`
+ *
+ * @type {Element}
+ * @private
+ */
+vjs.Component.prototype.contentEl_;
+
+/**
+ * Return the component's DOM element for embedding content.
+ * Will either be el_ or a new element defined in createEl.
+ *
+ * @return {Element}
+ */
+vjs.Component.prototype.contentEl = function(){
+  return this.contentEl_ || this.el_;
+};
+
+/**
+ * The ID for the component
+ *
+ * @type {String}
+ * @private
+ */
+vjs.Component.prototype.id_;
+
+/**
+ * Get the component's ID
+ *
+ *     var id = myComponent.id();
+ *
+ * @return {String}
+ */
+vjs.Component.prototype.id = function(){
+  return this.id_;
+};
+
+/**
+ * The name for the component. Often used to reference the component.
+ *
+ * @type {String}
+ * @private
+ */
+vjs.Component.prototype.name_;
+
+/**
+ * Get the component's name. The name is often used to reference the component.
+ *
+ *     var name = myComponent.name();
+ *
+ * @return {String}
+ */
+vjs.Component.prototype.name = function(){
+  return this.name_;
+};
+
+/**
+ * Array of child components
+ *
+ * @type {Array}
+ * @private
+ */
+vjs.Component.prototype.children_;
+
+/**
+ * Get an array of all child components
+ *
+ *     var kids = myComponent.children();
+ *
+ * @return {Array} The children
+ */
+vjs.Component.prototype.children = function(){
+  return this.children_;
+};
+
+/**
+ * Object of child components by ID
+ *
+ * @type {Object}
+ * @private
+ */
+vjs.Component.prototype.childIndex_;
+
+/**
+ * Returns a child component with the provided ID
+ *
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.getChildById = function(id){
+  return this.childIndex_[id];
+};
+
+/**
+ * Object of child components by name
+ *
+ * @type {Object}
+ * @private
+ */
+vjs.Component.prototype.childNameIndex_;
+
+/**
+ * Returns a child component with the provided ID
+ *
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.getChild = function(name){
+  return this.childNameIndex_[name];
+};
+
+/**
+ * Adds a child component inside this component
+ *
+ *     myComponent.el();
+ *     // -> <div class='my-component'></div>
+ *     myComonent.children();
+ *     // [empty array]
+ *
+ *     var myButton = myComponent.addChild('MyButton');
+ *     // -> <div class='my-component'><div class="my-button">myButton<div></div>
+ *     // -> myButton === myComonent.children()[0];
+ *
+ * Pass in options for child constructors and options for children of the child
+ *
+ *    var myButton = myComponent.addChild('MyButton', {
+ *      text: 'Press Me',
+ *      children: {
+ *        buttonChildExample: {
+ *          buttonChildOption: true
+ *        }
+ *      }
+ *    });
+ *
+ * @param {String|vjs.Component} child The class name or instance of a child to add
+ * @param {Object=} options Options, including options to be passed to children of the child.
+ * @return {vjs.Component} The child component (created by this process if a string was used)
+ * @suppress {accessControls|checkRegExp|checkTypes|checkVars|const|constantProperty|deprecated|duplicate|es5Strict|fileoverviewTags|globalThis|invalidCasts|missingProperties|nonStandardJsDocs|strictModuleDepCheck|undefinedNames|undefinedVars|unknownDefines|uselessCode|visibility}
+ */
+vjs.Component.prototype.addChild = function(child, options){
+  var component, componentClass, componentName, componentId;
+
+  // If string, create new component with options
+  if (typeof child === 'string') {
+
+    componentName = child;
+
+    // Make sure options is at least an empty object to protect against errors
+    options = options || {};
+
+    // Assume name of set is a lowercased name of the UI Class (PlayButton, etc.)
+    componentClass = options['componentClass'] || vjs.capitalize(componentName);
+
+    // Set name through options
+    options['name'] = componentName;
+
+    // Create a new object & element for this controls set
+    // If there's no .player_, this is a player
+    // Closure Compiler throws an 'incomplete alias' warning if we use the vjs variable directly.
+    // Every class should be exported, so this should never be a problem here.
+    component = new window['videojs'][componentClass](this.player_ || this, options);
+
+  // child is a component instance
+  } else {
+    component = child;
+  }
+
+  this.children_.push(component);
+
+  if (typeof component.id === 'function') {
+    this.childIndex_[component.id()] = component;
+  }
+
+  // If a name wasn't used to create the component, check if we can use the
+  // name function of the component
+  componentName = componentName || (component.name && component.name());
+
+  if (componentName) {
+    this.childNameIndex_[componentName] = component;
+  }
+
+  // Add the UI object's element to the container div (box)
+  // Having an element is not required
+  if (typeof component['el'] === 'function' && component['el']()) {
+    this.contentEl().appendChild(component['el']());
+  }
+
+  // Return so it can stored on parent object if desired.
+  return component;
+};
+
+/**
+ * Remove a child component from this component's list of children, and the
+ * child component's element from this component's element
+ *
+ * @param  {vjs.Component} component Component to remove
+ */
+vjs.Component.prototype.removeChild = function(component){
+  if (typeof component === 'string') {
+    component = this.getChild(component);
+  }
+
+  if (!component || !this.children_) return;
+
+  var childFound = false;
+  for (var i = this.children_.length - 1; i >= 0; i--) {
+    if (this.children_[i] === component) {
+      childFound = true;
+      this.children_.splice(i,1);
+      break;
+    }
+  }
+
+  if (!childFound) return;
+
+  this.childIndex_[component.id] = null;
+  this.childNameIndex_[component.name] = null;
+
+  var compEl = component.el();
+  if (compEl && compEl.parentNode === this.contentEl()) {
+    this.contentEl().removeChild(component.el());
+  }
+};
+
+/**
+ * Add and initialize default child components from options
+ *
+ *     // when an instance of MyComponent is created, all children in options
+ *     // will be added to the instance by their name strings and options
+ *     MyComponent.prototype.options_.children = {
+ *       myChildComponent: {
+ *         myChildOption: true
+ *       }
+ *     }
+ */
+vjs.Component.prototype.initChildren = function(){
+  var options = this.options_;
+
+  if (options && options['children']) {
+    var self = this;
+
+    // Loop through components and add them to the player
+    vjs.obj.each(options['children'], function(name, opts){
+      // Allow for disabling default components
+      // e.g. vjs.options['children']['posterImage'] = false
+      if (opts === false) return;
+
+      // Allow waiting to add components until a specific event is called
+      var tempAdd = function(){
+        // Set property name on player. Could cause conflicts with other prop names, but it's worth making refs easy.
+        self[name] = self.addChild(name, opts);
+      };
+
+      if (opts['loadEvent']) {
+        // this.one(opts.loadEvent, tempAdd)
+      } else {
+        tempAdd();
+      }
+    });
+  }
+};
+
+/**
+ * Allows sub components to stack CSS class names
+ *
+ * @return {String} The constructed class name
+ */
+vjs.Component.prototype.buildCSSClass = function(){
+    // Child classes can include a function that does:
+    // return 'CLASS NAME' + this._super();
+    return '';
+};
+
+/* Events
+============================================================================= */
+
+/**
+ * Add an event listener to this component's element
+ *
+ *     var myFunc = function(){
+ *       var myPlayer = this;
+ *       // Do something when the event is fired
+ *     };
+ *
+ *     myPlayer.on("eventName", myFunc);
+ *
+ * The context will be the component.
+ *
+ * @param  {String}   type The event type e.g. 'click'
+ * @param  {Function} fn   The event listener
+ * @return {vjs.Component} self
+ */
+vjs.Component.prototype.on = function(type, fn){
+  vjs.on(this.el_, type, vjs.bind(this, fn));
+  return this;
+};
+
+/**
+ * Remove an event listener from the component's element
+ *
+ *     myComponent.off("eventName", myFunc);
+ *
+ * @param  {String=}   type Event type. Without type it will remove all listeners.
+ * @param  {Function=} fn   Event listener. Without fn it will remove all listeners for a type.
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.off = function(type, fn){
+  vjs.off(this.el_, type, fn);
+  return this;
+};
+
+/**
+ * Add an event listener to be triggered only once and then removed
+ *
+ * @param  {String}   type Event type
+ * @param  {Function} fn   Event listener
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.one = function(type, fn) {
+  vjs.one(this.el_, type, vjs.bind(this, fn));
+  return this;
+};
+
+/**
+ * Trigger an event on an element
+ *
+ *     myComponent.trigger('eventName');
+ *
+ * @param  {String}       type  The event type to trigger, e.g. 'click'
+ * @param  {Event|Object} event The event object to be passed to the listener
+ * @return {vjs.Component}      self
+ */
+vjs.Component.prototype.trigger = function(type, event){
+  vjs.trigger(this.el_, type, event);
+  return this;
+};
+
+/* Ready
+================================================================================ */
+/**
+ * Is the component loaded
+ * This can mean different things depending on the component.
+ *
+ * @private
+ * @type {Boolean}
+ */
+vjs.Component.prototype.isReady_;
+
+/**
+ * Trigger ready as soon as initialization is finished
+ *
+ * Allows for delaying ready. Override on a sub class prototype.
+ * If you set this.isReadyOnInitFinish_ it will affect all components.
+ * Specially used when waiting for the Flash player to asynchrnously load.
+ *
+ * @type {Boolean}
+ * @private
+ */
+vjs.Component.prototype.isReadyOnInitFinish_ = true;
+
+/**
+ * List of ready listeners
+ *
+ * @type {Array}
+ * @private
+ */
+vjs.Component.prototype.readyQueue_;
+
+/**
+ * Bind a listener to the component's ready state
+ *
+ * Different from event listeners in that if the ready event has already happend
+ * it will trigger the function immediately.
+ *
+ * @param  {Function} fn Ready listener
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.ready = function(fn){
+  if (fn) {
+    if (this.isReady_) {
+      fn.call(this);
+    } else {
+      if (this.readyQueue_ === undefined) {
+        this.readyQueue_ = [];
+      }
+      this.readyQueue_.push(fn);
+    }
+  }
+  return this;
+};
+
+/**
+ * Trigger the ready listeners
+ *
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.triggerReady = function(){
+  this.isReady_ = true;
+
+  var readyQueue = this.readyQueue_;
+
+  if (readyQueue && readyQueue.length > 0) {
+
+    for (var i = 0, j = readyQueue.length; i < j; i++) {
+      readyQueue[i].call(this);
+    }
+
+    // Reset Ready Queue
+    this.readyQueue_ = [];
+
+    // Allow for using event listeners also, in case you want to do something everytime a source is ready.
+    this.trigger('ready');
+  }
+};
+
+/* Display
+============================================================================= */
+
+/**
+ * Add a CSS class name to the component's element
+ *
+ * @param {String} classToAdd Classname to add
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.addClass = function(classToAdd){
+  vjs.addClass(this.el_, classToAdd);
+  return this;
+};
+
+/**
+ * Remove a CSS class name from the component's element
+ *
+ * @param {String} classToRemove Classname to remove
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.removeClass = function(classToRemove){
+  vjs.removeClass(this.el_, classToRemove);
+  return this;
+};
+
+/**
+ * Show the component element if hidden
+ *
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.show = function(){
+  this.el_.style.display = 'block';
+  return this;
+};
+
+/**
+ * Hide the component element if hidden
+ *
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.hide = function(){
+  this.el_.style.display = 'none';
+  return this;
+};
+
+/**
+ * Lock an item in its visible state
+ * To be used with fadeIn/fadeOut.
+ *
+ * @return {vjs.Component}
+ * @private
+ */
+vjs.Component.prototype.lockShowing = function(){
+  this.addClass('vjs-lock-showing');
+  return this;
+};
+
+/**
+ * Unlock an item to be hidden
+ * To be used with fadeIn/fadeOut.
+ *
+ * @return {vjs.Component}
+ * @private
+ */
+vjs.Component.prototype.unlockShowing = function(){
+  this.removeClass('vjs-lock-showing');
+  return this;
+};
+
+/**
+ * Disable component by making it unshowable
+ */
+vjs.Component.prototype.disable = function(){
+  this.hide();
+  this.show = function(){};
+};
+
+/**
+ * Set or get the width of the component (CSS values)
+ *
+ * Video tag width/height only work in pixels. No percents.
+ * But allowing limited percents use. e.g. width() will return number+%, not computed width
+ *
+ * @param  {Number|String=} num   Optional width number
+ * @param  {Boolean} skipListeners Skip the 'resize' event trigger
+ * @return {vjs.Component} Returns 'this' if width was set
+ * @return {Number|String} Returns the width if nothing was set
+ */
+vjs.Component.prototype.width = function(num, skipListeners){
+  return this.dimension('width', num, skipListeners);
+};
+
+/**
+ * Get or set the height of the component (CSS values)
+ *
+ * @param  {Number|String=} num     New component height
+ * @param  {Boolean=} skipListeners Skip the resize event trigger
+ * @return {vjs.Component} The component if the height was set
+ * @return {Number|String} The height if it wasn't set
+ */
+vjs.Component.prototype.height = function(num, skipListeners){
+  return this.dimension('height', num, skipListeners);
+};
+
+/**
+ * Set both width and height at the same time
+ *
+ * @param  {Number|String} width
+ * @param  {Number|String} height
+ * @return {vjs.Component} The component
+ */
+vjs.Component.prototype.dimensions = function(width, height){
+  // Skip resize listeners on width for optimization
+  return this.width(width, true).height(height);
+};
+
+/**
+ * Get or set width or height
+ *
+ * This is the shared code for the width() and height() methods.
+ * All for an integer, integer + 'px' or integer + '%';
+ *
+ * Known issue: Hidden elements officially have a width of 0. We're defaulting
+ * to the style.width value and falling back to computedStyle which has the
+ * hidden element issue. Info, but probably not an efficient fix:
+ * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/
+ *
+ * @param  {String} widthOrHeight  'width' or 'height'
+ * @param  {Number|String=} num     New dimension
+ * @param  {Boolean=} skipListeners Skip resize event trigger
+ * @return {vjs.Component} The component if a dimension was set
+ * @return {Number|String} The dimension if nothing was set
+ * @private
+ */
+vjs.Component.prototype.dimension = function(widthOrHeight, num, skipListeners){
+  if (num !== undefined) {
+
+    // Check if using css width/height (% or px) and adjust
+    if ((''+num).indexOf('%') !== -1 || (''+num).indexOf('px') !== -1) {
+      this.el_.style[widthOrHeight] = num;
+    } else if (num === 'auto') {
+      this.el_.style[widthOrHeight] = '';
+    } else {
+      this.el_.style[widthOrHeight] = num+'px';
+    }
+
+    // skipListeners allows us to avoid triggering the resize event when setting both width and height
+    if (!skipListeners) { this.trigger('resize'); }
+
+    // Return component
+    return this;
+  }
+
+  // Not setting a value, so getting it
+  // Make sure element exists
+  if (!this.el_) return 0;
+
+  // Get dimension value from style
+  var val = this.el_.style[widthOrHeight];
+  var pxIndex = val.indexOf('px');
+  if (pxIndex !== -1) {
+    // Return the pixel value with no 'px'
+    return parseInt(val.slice(0,pxIndex), 10);
+
+  // No px so using % or no style was set, so falling back to offsetWidth/height
+  // If component has display:none, offset will return 0
+  // TODO: handle display:none and no dimension style using px
+  } else {
+
+    return parseInt(this.el_['offset'+vjs.capitalize(widthOrHeight)], 10);
+
+    // ComputedStyle version.
+    // Only difference is if the element is hidden it will return
+    // the percent value (e.g. '100%'')
+    // instead of zero like offsetWidth returns.
+    // var val = vjs.getComputedStyleValue(this.el_, widthOrHeight);
+    // var pxIndex = val.indexOf('px');
+
+    // if (pxIndex !== -1) {
+    //   return val.slice(0, pxIndex);
+    // } else {
+    //   return val;
+    // }
+  }
+};
+
+/**
+ * Fired when the width and/or height of the component changes
+ * @event resize
+ */
+vjs.Component.prototype.onResize;
+
+/**
+ * Emit 'tap' events when touch events are supported
+ *
+ * This is used to support toggling the controls through a tap on the video.
+ *
+ * We're requireing them to be enabled because otherwise every component would
+ * have this extra overhead unnecessarily, on mobile devices where extra
+ * overhead is especially bad.
+ * @private
+ */
+vjs.Component.prototype.emitTapEvents = function(){
+  var touchStart, touchTime, couldBeTap, noTap;
+
+  // Track the start time so we can determine how long the touch lasted
+  touchStart = 0;
+
+  this.on('touchstart', function(event) {
+    // Record start time so we can detect a tap vs. "touch and hold"
+    touchStart = new Date().getTime();
+    // Reset couldBeTap tracking
+    couldBeTap = true;
+  });
+
+  noTap = function(){
+    couldBeTap = false;
+  };
+  // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s
+  this.on('touchmove', noTap);
+  this.on('touchleave', noTap);
+  this.on('touchcancel', noTap);
+
+  // When the touch ends, measure how long it took and trigger the appropriate
+  // event
+  this.on('touchend', function() {
+    // Proceed only if the touchmove/leave/cancel event didn't happen
+    if (couldBeTap === true) {
+      // Measure how long the touch lasted
+      touchTime = new Date().getTime() - touchStart;
+      // The touch needs to be quick in order to consider it a tap
+      if (touchTime < 250) {
+        this.trigger('tap');
+        // It may be good to copy the touchend event object and change the
+        // type to tap, if the other event properties aren't exact after
+        // vjs.fixEvent runs (e.g. event.target)
+      }
+    }
+  });
+};
+/* Button - Base class for all buttons
+================================================================================ */
+/**
+ * Base class for all buttons
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.Button = vjs.Component.extend({
+  /**
+   * @constructor
+   * @inheritDoc
+   */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    var touchstart = false;
+    this.on('touchstart', function(event) {
+      // Stop click and other mouse events from triggering also
+      event.preventDefault();
+      touchstart = true;
+    });
+    this.on('touchmove', function() {
+      touchstart = false;
+    });
+    var self = this;
+    this.on('touchend', function(event) {
+      if (touchstart) {
+        self.onClick(event);
+      }
+      event.preventDefault();
+    });
+
+    this.on('click', this.onClick);
+    this.on('focus', this.onFocus);
+    this.on('blur', this.onBlur);
+  }
+});
+
+vjs.Button.prototype.createEl = function(type, props){
+  // Add standard Aria and Tabindex info
+  props = vjs.obj.merge({
+    className: this.buildCSSClass(),
+    innerHTML: '<div class="vjs-control-content"><span class="vjs-control-text">' + (this.buttonText || 'Need Text') + '</span></div>',
+    role: 'button',
+    'aria-live': 'polite', // let the screen reader user know that the text of the button may change
+    tabIndex: 0
+  }, props);
+
+  return vjs.Component.prototype.createEl.call(this, type, props);
+};
+
+vjs.Button.prototype.buildCSSClass = function(){
+  // TODO: Change vjs-control to vjs-button?
+  return 'vjs-control ' + vjs.Component.prototype.buildCSSClass.call(this);
+};
+
+  // Click - Override with specific functionality for button
+vjs.Button.prototype.onClick = function(){};
+
+  // Focus - Add keyboard functionality to element
+vjs.Button.prototype.onFocus = function(){
+  vjs.on(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+
+  // KeyPress (document level) - Trigger click when keys are pressed
+vjs.Button.prototype.onKeyPress = function(event){
+  // Check for space bar (32) or enter (13) keys
+  if (event.which == 32 || event.which == 13) {
+    event.preventDefault();
+    this.onClick();
+  }
+};
+
+// Blur - Remove keyboard triggers
+vjs.Button.prototype.onBlur = function(){
+  vjs.off(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+/* Slider
+================================================================================ */
+/**
+ * The base functionality for sliders like the volume bar and seek bar
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.Slider = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    // Set property names to bar and handle to match with the child Slider class is looking for
+    this.bar = this.getChild(this.options_['barName']);
+    this.handle = this.getChild(this.options_['handleName']);
+
+    player.on(this.playerEvent, vjs.bind(this, this.update));
+
+    this.on('mousedown', this.onMouseDown);
+    this.on('touchstart', this.onMouseDown);
+    this.on('focus', this.onFocus);
+    this.on('blur', this.onBlur);
+    this.on('click', this.onClick);
+
+    this.player_.on('controlsvisible', vjs.bind(this, this.update));
+
+    // This is actually to fix the volume handle position. http://twitter.com/#!/gerritvanaaken/status/159046254519787520
+    // this.player_.one('timeupdate', vjs.bind(this, this.update));
+
+    player.ready(vjs.bind(this, this.update));
+
+    this.boundEvents = {};
+  }
+});
+
+vjs.Slider.prototype.createEl = function(type, props) {
+  props = props || {};
+  // Add the slider element class to all sub classes
+  props.className = props.className + ' vjs-slider';
+  props = vjs.obj.merge({
+    role: 'slider',
+    'aria-valuenow': 0,
+    'aria-valuemin': 0,
+    'aria-valuemax': 100,
+    tabIndex: 0
+  }, props);
+
+  return vjs.Component.prototype.createEl.call(this, type, props);
+};
+
+vjs.Slider.prototype.onMouseDown = function(event){
+  event.preventDefault();
+  vjs.blockTextSelection();
+
+  this.boundEvents.move = vjs.bind(this, this.onMouseMove);
+  this.boundEvents.end = vjs.bind(this, this.onMouseUp);
+
+  vjs.on(document, 'mousemove', this.boundEvents.move);
+  vjs.on(document, 'mouseup', this.boundEvents.end);
+  vjs.on(document, 'touchmove', this.boundEvents.move);
+  vjs.on(document, 'touchend', this.boundEvents.end);
+
+  this.onMouseMove(event);
+};
+
+vjs.Slider.prototype.onMouseUp = function() {
+  vjs.unblockTextSelection();
+  vjs.off(document, 'mousemove', this.boundEvents.move, false);
+  vjs.off(document, 'mouseup', this.boundEvents.end, false);
+  vjs.off(document, 'touchmove', this.boundEvents.move, false);
+  vjs.off(document, 'touchend', this.boundEvents.end, false);
+
+  this.update();
+};
+
+vjs.Slider.prototype.update = function(){
+  // In VolumeBar init we have a setTimeout for update that pops and update to the end of the
+  // execution stack. The player is destroyed before then update will cause an error
+  if (!this.el_) return;
+
+  // If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.
+  // On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.
+  // var progress =  (this.player_.scrubbing) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();
+
+  var barProgress,
+      progress = this.getPercent(),
+      handle = this.handle,
+      bar = this.bar;
+
+  // Protect against no duration and other division issues
+  if (isNaN(progress)) { progress = 0; }
+
+  barProgress = progress;
+
+  // If there is a handle, we need to account for the handle in our calculation for progress bar
+  // so that it doesn't fall short of or extend past the handle.
+  if (handle) {
+
+    var box = this.el_,
+        boxWidth = box.offsetWidth,
+
+        handleWidth = handle.el().offsetWidth,
+
+        // The width of the handle in percent of the containing box
+        // In IE, widths may not be ready yet causing NaN
+        handlePercent = (handleWidth) ? handleWidth / boxWidth : 0,
+
+        // Get the adjusted size of the box, considering that the handle's center never touches the left or right side.
+        // There is a margin of half the handle's width on both sides.
+        boxAdjustedPercent = 1 - handlePercent,
+
+        // Adjust the progress that we'll use to set widths to the new adjusted box width
+        adjustedProgress = progress * boxAdjustedPercent;
+
+    // The bar does reach the left side, so we need to account for this in the bar's width
+    barProgress = adjustedProgress + (handlePercent / 2);
+
+    // Move the handle from the left based on the adjected progress
+    handle.el().style.left = vjs.round(adjustedProgress * 100, 2) + '%';
+  }
+
+  // Set the new bar width
+  bar.el().style.width = vjs.round(barProgress * 100, 2) + '%';
+};
+
+vjs.Slider.prototype.calculateDistance = function(event){
+  var el, box, boxX, boxY, boxW, boxH, handle, pageX, pageY;
+
+  el = this.el_;
+  box = vjs.findPosition(el);
+  boxW = boxH = el.offsetWidth;
+  handle = this.handle;
+
+  if (this.options_.vertical) {
+    boxY = box.top;
+
+    if (event.changedTouches) {
+      pageY = event.changedTouches[0].pageY;
+    } else {
+      pageY = event.pageY;
+    }
+
+    if (handle) {
+      var handleH = handle.el().offsetHeight;
+      // Adjusted X and Width, so handle doesn't go outside the bar
+      boxY = boxY + (handleH / 2);
+      boxH = boxH - handleH;
+    }
+
+    // Percent that the click is through the adjusted area
+    return Math.max(0, Math.min(1, ((boxY - pageY) + boxH) / boxH));
+
+  } else {
+    boxX = box.left;
+
+    if (event.changedTouches) {
+      pageX = event.changedTouches[0].pageX;
+    } else {
+      pageX = event.pageX;
+    }
+
+    if (handle) {
+      var handleW = handle.el().offsetWidth;
+
+      // Adjusted X and Width, so handle doesn't go outside the bar
+      boxX = boxX + (handleW / 2);
+      boxW = boxW - handleW;
+    }
+
+    // Percent that the click is through the adjusted area
+    return Math.max(0, Math.min(1, (pageX - boxX) / boxW));
+  }
+};
+
+vjs.Slider.prototype.onFocus = function(){
+  vjs.on(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+
+vjs.Slider.prototype.onKeyPress = function(event){
+  if (event.which == 37) { // Left Arrow
+    event.preventDefault();
+    this.stepBack();
+  } else if (event.which == 39) { // Right Arrow
+    event.preventDefault();
+    this.stepForward();
+  }
+};
+
+vjs.Slider.prototype.onBlur = function(){
+  vjs.off(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+
+/**
+ * Listener for click events on slider, used to prevent clicks
+ *   from bubbling up to parent elements like button menus.
+ * @param  {Object} event Event object
+ */
+vjs.Slider.prototype.onClick = function(event){
+  event.stopImmediatePropagation();
+  event.preventDefault();
+};
+
+/**
+ * SeekBar Behavior includes play progress bar, and seek handle
+ * Needed so it can determine seek position based on handle position/size
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.SliderHandle = vjs.Component.extend();
+
+/**
+ * Default value of the slider
+ *
+ * @type {Number}
+ * @private
+ */
+vjs.SliderHandle.prototype.defaultValue = 0;
+
+/** @inheritDoc */
+vjs.SliderHandle.prototype.createEl = function(type, props) {
+  props = props || {};
+  // Add the slider element class to all sub classes
+  props.className = props.className + ' vjs-slider-handle';
+  props = vjs.obj.merge({
+    innerHTML: '<span class="vjs-control-text">'+this.defaultValue+'</span>'
+  }, props);
+
+  return vjs.Component.prototype.createEl.call(this, 'div', props);
+};
+/* Menu
+================================================================================ */
+/**
+ * The Menu component is used to build pop up menus, including subtitle and
+ * captions selection menus.
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.Menu = vjs.Component.extend();
+
+/**
+ * Add a menu item to the menu
+ * @param {Object|String} component Component or component type to add
+ */
+vjs.Menu.prototype.addItem = function(component){
+  this.addChild(component);
+  component.on('click', vjs.bind(this, function(){
+    this.unlockShowing();
+  }));
+};
+
+/** @inheritDoc */
+vjs.Menu.prototype.createEl = function(){
+  var contentElType = this.options().contentElType || 'ul';
+  this.contentEl_ = vjs.createEl(contentElType, {
+    className: 'vjs-menu-content'
+  });
+  var el = vjs.Component.prototype.createEl.call(this, 'div', {
+    append: this.contentEl_,
+    className: 'vjs-menu'
+  });
+  el.appendChild(this.contentEl_);
+
+  // Prevent clicks from bubbling up. Needed for Menu Buttons,
+  // where a click on the parent is significant
+  vjs.on(el, 'click', function(event){
+    event.preventDefault();
+    event.stopImmediatePropagation();
+  });
+
+  return el;
+};
+
+/**
+ * The component for a menu item. `<li>`
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.MenuItem = vjs.Button.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+    this.selected(options['selected']);
+  }
+});
+
+/** @inheritDoc */
+vjs.MenuItem.prototype.createEl = function(type, props){
+  return vjs.Button.prototype.createEl.call(this, 'li', vjs.obj.merge({
+    className: 'vjs-menu-item',
+    innerHTML: this.options_['label']
+  }, props));
+};
+
+/**
+ * Handle a click on the menu item, and set it to selected
+ */
+vjs.MenuItem.prototype.onClick = function(){
+  this.selected(true);
+};
+
+/**
+ * Set this menu item as selected or not
+ * @param  {Boolean} selected
+ */
+vjs.MenuItem.prototype.selected = function(selected){
+  if (selected) {
+    this.addClass('vjs-selected');
+    this.el_.setAttribute('aria-selected',true);
+  } else {
+    this.removeClass('vjs-selected');
+    this.el_.setAttribute('aria-selected',false);
+  }
+};
+
+
+/**
+ * A button class with a popup menu
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.MenuButton = vjs.Button.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+
+    this.menu = this.createMenu();
+
+    // Add list to element
+    this.addChild(this.menu);
+
+    // Automatically hide empty menu buttons
+    if (this.items && this.items.length === 0) {
+      this.hide();
+    }
+
+    this.on('keyup', this.onKeyPress);
+    this.el_.setAttribute('aria-haspopup', true);
+    this.el_.setAttribute('role', 'button');
+  }
+});
+
+/**
+ * Track the state of the menu button
+ * @type {Boolean}
+ * @private
+ */
+vjs.MenuButton.prototype.buttonPressed_ = false;
+
+vjs.MenuButton.prototype.createMenu = function(){
+  var menu = new vjs.Menu(this.player_);
+
+  // Add a title list item to the top
+  if (this.options().title) {
+    menu.el().appendChild(vjs.createEl('li', {
+      className: 'vjs-menu-title',
+      innerHTML: vjs.capitalize(this.kind_),
+      tabindex: -1
+    }));
+  }
+
+  this.items = this['createItems']();
+
+  if (this.items) {
+    // Add menu items to the menu
+    for (var i = 0; i < this.items.length; i++) {
+      menu.addItem(this.items[i]);
+    }
+  }
+
+  return menu;
+};
+
+/**
+ * Create the list of menu items. Specific to each subclass.
+ */
+vjs.MenuButton.prototype.createItems = function(){};
+
+/** @inheritDoc */
+vjs.MenuButton.prototype.buildCSSClass = function(){
+  return this.className + ' vjs-menu-button ' + vjs.Button.prototype.buildCSSClass.call(this);
+};
+
+// Focus - Add keyboard functionality to element
+// This function is not needed anymore. Instead, the keyboard functionality is handled by
+// treating the button as triggering a submenu. When the button is pressed, the submenu
+// appears. Pressing the button again makes the submenu disappear.
+vjs.MenuButton.prototype.onFocus = function(){};
+// Can't turn off list display that we turned on with focus, because list would go away.
+vjs.MenuButton.prototype.onBlur = function(){};
+
+vjs.MenuButton.prototype.onClick = function(){
+  // When you click the button it adds focus, which will show the menu indefinitely.
+  // So we'll remove focus when the mouse leaves the button.
+  // Focus is needed for tab navigation.
+  this.one('mouseout', vjs.bind(this, function(){
+    this.menu.unlockShowing();
+    this.el_.blur();
+  }));
+  if (this.buttonPressed_){
+    this.unpressButton();
+  } else {
+    this.pressButton();
+  }
+};
+
+vjs.MenuButton.prototype.onKeyPress = function(event){
+  event.preventDefault();
+
+  // Check for space bar (32) or enter (13) keys
+  if (event.which == 32 || event.which == 13) {
+    if (this.buttonPressed_){
+      this.unpressButton();
+    } else {
+      this.pressButton();
+    }
+  // Check for escape (27) key
+  } else if (event.which == 27){
+    if (this.buttonPressed_){
+      this.unpressButton();
+    }
+  }
+};
+
+vjs.MenuButton.prototype.pressButton = function(){
+  this.buttonPressed_ = true;
+  this.menu.lockShowing();
+  this.el_.setAttribute('aria-pressed', true);
+  if (this.items && this.items.length > 0) {
+    this.items[0].el().focus(); // set the focus to the title of the submenu
+  }
+};
+
+vjs.MenuButton.prototype.unpressButton = function(){
+  this.buttonPressed_ = false;
+  this.menu.unlockShowing();
+  this.el_.setAttribute('aria-pressed', false);
+};
+
+/**
+ * An instance of the `vjs.Player` class is created when any of the Video.js setup methods are used to initialize a video.
+ *
+ * ```js
+ * var myPlayer = videojs('example_video_1');
+ * ```
+ *
+ * In the follwing example, the `data-setup` attribute tells the Video.js library to create a player instance when the library is ready.
+ *
+ * ```html
+ * <video id="example_video_1" data-setup='{}' controls>
+ *   <source src="my-source.mp4" type="video/mp4">
+ * </video>
+ * ```
+ *
+ * After an instance has been created it can be accessed globally using `Video('example_video_1')`.
+ *
+ * @class
+ * @extends vjs.Component
+ */
+vjs.Player = vjs.Component.extend({
+
+  /**
+   * player's constructor function
+   *
+   * @constructs
+   * @method init
+   * @param {Element} tag        The original video tag used for configuring options
+   * @param {Object=} options    Player options
+   * @param {Function=} ready    Ready callback function
+   */
+  init: function(tag, options, ready){
+    this.tag = tag; // Store the original tag used to set options
+
+    // Set Options
+    // The options argument overrides options set in the video tag
+    // which overrides globally set options.
+    // This latter part coincides with the load order
+    // (tag must exist before Player)
+    options = vjs.obj.merge(this.getTagSettings(tag), options);
+
+    // Cache for video property values.
+    this.cache_ = {};
+
+    // Set poster
+    this.poster_ = options['poster'];
+    // Set controls
+    this.controls_ = options['controls'];
+    // Original tag settings stored in options
+    // now remove immediately so native controls don't flash.
+    // May be turned back on by HTML5 tech if nativeControlsForTouch is true
+    tag.controls = false;
+
+    // Run base component initializing with new options.
+    // Builds the element through createEl()
+    // Inits and embeds any child components in opts
+    vjs.Component.call(this, this, options, ready);
+
+    // Update controls className. Can't do this when the controls are initially
+    // set because the element doesn't exist yet.
+    if (this.controls()) {
+      this.addClass('vjs-controls-enabled');
+    } else {
+      this.addClass('vjs-controls-disabled');
+    }
+
+    // TODO: Make this smarter. Toggle user state between touching/mousing
+    // using events, since devices can have both touch and mouse events.
+    // if (vjs.TOUCH_ENABLED) {
+    //   this.addClass('vjs-touch-enabled');
+    // }
+
+    // Firstplay event implimentation. Not sold on the event yet.
+    // Could probably just check currentTime==0?
+    this.one('play', function(e){
+      var fpEvent = { type: 'firstplay', target: this.el_ };
+      // Using vjs.trigger so we can check if default was prevented
+      var keepGoing = vjs.trigger(this.el_, fpEvent);
+
+      if (!keepGoing) {
+        e.preventDefault();
+        e.stopPropagation();
+        e.stopImmediatePropagation();
+      }
+    });
+
+    this.on('ended', this.onEnded);
+    this.on('play', this.onPlay);
+    this.on('firstplay', this.onFirstPlay);
+    this.on('pause', this.onPause);
+    this.on('progress', this.onProgress);
+    this.on('durationchange', this.onDurationChange);
+    this.on('error', this.onError);
+    this.on('fullscreenchange', this.onFullscreenChange);
+
+    // Make player easily findable by ID
+    vjs.players[this.id_] = this;
+
+    if (options['plugins']) {
+      vjs.obj.each(options['plugins'], function(key, val){
+        this[key](val);
+      }, this);
+    }
+
+    this.listenForUserActivity();
+  }
+});
+
+/**
+ * Player instance options, surfaced using vjs.options
+ * vjs.options = vjs.Player.prototype.options_
+ * Make changes in vjs.options, not here.
+ * All options should use string keys so they avoid
+ * renaming by closure compiler
+ * @type {Object}
+ * @private
+ */
+vjs.Player.prototype.options_ = vjs.options;
+
+/**
+ * Destroys the video player and does any necessary cleanup
+ *
+ *     myPlayer.dispose();
+ *
+ * This is especially helpful if you are dynamically adding and removing videos
+ * to/from the DOM.
+ */
+vjs.Player.prototype.dispose = function(){
+  this.trigger('dispose');
+  // prevent dispose from being called twice
+  this.off('dispose');
+
+  // Kill reference to this player
+  vjs.players[this.id_] = null;
+  if (this.tag && this.tag['player']) { this.tag['player'] = null; }
+  if (this.el_ && this.el_['player']) { this.el_['player'] = null; }
+
+  // Ensure that tracking progress and time progress will stop and plater deleted
+  this.stopTrackingProgress();
+  this.stopTrackingCurrentTime();
+
+  if (this.tech) { this.tech.dispose(); }
+
+  // Component dispose
+  vjs.Component.prototype.dispose.call(this);
+};
+
+vjs.Player.prototype.getTagSettings = function(tag){
+  var options = {
+    'sources': [],
+    'tracks': []
+  };
+
+  vjs.obj.merge(options, vjs.getAttributeValues(tag));
+
+  // Get tag children settings
+  if (tag.hasChildNodes()) {
+    var children, child, childName, i, j;
+
+    children = tag.childNodes;
+
+    for (i=0,j=children.length; i<j; i++) {
+      child = children[i];
+      // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/
+      childName = child.nodeName.toLowerCase();
+      if (childName === 'source') {
+        options['sources'].push(vjs.getAttributeValues(child));
+      } else if (childName === 'track') {
+        options['tracks'].push(vjs.getAttributeValues(child));
+      }
+    }
+  }
+
+  return options;
+};
+
+vjs.Player.prototype.createEl = function(){
+  var el = this.el_ = vjs.Component.prototype.createEl.call(this, 'div');
+  var tag = this.tag;
+
+  // Remove width/height attrs from tag so CSS can make it 100% width/height
+  tag.removeAttribute('width');
+  tag.removeAttribute('height');
+  // Empty video tag tracks so the built-in player doesn't use them also.
+  // This may not be fast enough to stop HTML5 browsers from reading the tags
+  // so we'll need to turn off any default tracks if we're manually doing
+  // captions and subtitles. videoElement.textTracks
+  if (tag.hasChildNodes()) {
+    var nodes, nodesLength, i, node, nodeName, removeNodes;
+
+    nodes = tag.childNodes;
+    nodesLength = nodes.length;
+    removeNodes = [];
+
+    while (nodesLength--) {
+      node = nodes[nodesLength];
+      nodeName = node.nodeName.toLowerCase();
+      if (nodeName === 'track') {
+        removeNodes.push(node);
+      }
+    }
+
+    for (i=0; i<removeNodes.length; i++) {
+      tag.removeChild(removeNodes[i]);
+    }
+  }
+
+  // Make sure tag ID exists
+  tag.id = tag.id || 'vjs_video_' + vjs.guid++;
+
+  // Give video tag ID and class to player div
+  // ID will now reference player box, not the video tag
+  el.id = tag.id;
+  el.className = tag.className;
+
+  // Update tag id/class for use as HTML5 playback tech
+  // Might think we should do this after embedding in container so .vjs-tech class
+  // doesn't flash 100% width/height, but class only applies with .video-js parent
+  tag.id += '_html5_api';
+  tag.className = 'vjs-tech';
+
+  // Make player findable on elements
+  tag['player'] = el['player'] = this;
+  // Default state of video is paused
+  this.addClass('vjs-paused');
+
+  // Make box use width/height of tag, or rely on default implementation
+  // Enforce with CSS since width/height attrs don't work on divs
+  this.width(this.options_['width'], true); // (true) Skip resize listener on load
+  this.height(this.options_['height'], true);
+
+  // Wrap video tag in div (el/box) container
+  if (tag.parentNode) {
+    tag.parentNode.insertBefore(el, tag);
+  }
+  vjs.insertFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.
+
+  return el;
+};
+
+// /* Media Technology (tech)
+// ================================================================================ */
+// Load/Create an instance of playback technlogy including element and API methods
+// And append playback element in player div.
+vjs.Player.prototype.loadTech = function(techName, source){
+
+  // Pause and remove current playback technology
+  if (this.tech) {
+    this.unloadTech();
+
+  // if this is the first time loading, HTML5 tag will exist but won't be initialized
+  // so we need to remove it if we're not loading HTML5
+  } else if (techName !== 'Html5' && this.tag) {
+    vjs.Html5.disposeMediaElement(this.tag);
+    this.tag = null;
+  }
+
+  this.techName = techName;
+
+  // Turn off API access because we're loading a new tech that might load asynchronously
+  this.isReady_ = false;
+
+  var techReady = function(){
+    this.player_.triggerReady();
+
+    // Manually track progress in cases where the browser/flash player doesn't report it.
+    if (!this.features['progressEvents']) {
+      this.player_.manualProgressOn();
+    }
+
+    // Manually track timeudpates in cases where the browser/flash player doesn't report it.
+    if (!this.features['timeupdateEvents']) {
+      this.player_.manualTimeUpdatesOn();
+    }
+  };
+
+  // Grab tech-specific options from player options and add source and parent element to use.
+  var techOptions = vjs.obj.merge({ 'source': source, 'parentEl': this.el_ }, this.options_[techName.toLowerCase()]);
+
+  if (source) {
+    if (source.src == this.cache_.src && this.cache_.currentTime > 0) {
+      techOptions['startTime'] = this.cache_.currentTime;
+    }
+
+    this.cache_.src = source.src;
+  }
+
+  // Initialize tech instance
+  this.tech = new window['videojs'][techName](this, techOptions);
+
+  this.tech.ready(techReady);
+};
+
+vjs.Player.prototype.unloadTech = function(){
+  this.isReady_ = false;
+  this.tech.dispose();
+
+  // Turn off any manual progress or timeupdate tracking
+  if (this.manualProgress) { this.manualProgressOff(); }
+
+  if (this.manualTimeUpdates) { this.manualTimeUpdatesOff(); }
+
+  this.tech = false;
+};
+
+// There's many issues around changing the size of a Flash (or other plugin) object.
+// First is a plugin reload issue in Firefox that has been around for 11 years: https://bugzilla.mozilla.org/show_bug.cgi?id=90268
+// Then with the new fullscreen API, Mozilla and webkit browsers will reload the flash object after going to fullscreen.
+// To get around this, we're unloading the tech, caching source and currentTime values, and reloading the tech once the plugin is resized.
+// reloadTech: function(betweenFn){
+//   vjs.log('unloadingTech')
+//   this.unloadTech();
+//   vjs.log('unloadedTech')
+//   if (betweenFn) { betweenFn.call(); }
+//   vjs.log('LoadingTech')
+//   this.loadTech(this.techName, { src: this.cache_.src })
+//   vjs.log('loadedTech')
+// },
+
+/* Fallbacks for unsupported event types
+================================================================================ */
+// Manually trigger progress events based on changes to the buffered amount
+// Many flash players and older HTML5 browsers don't send progress or progress-like events
+vjs.Player.prototype.manualProgressOn = function(){
+  this.manualProgress = true;
+
+  // Trigger progress watching when a source begins loading
+  this.trackProgress();
+
+  // Watch for a native progress event call on the tech element
+  // In HTML5, some older versions don't support the progress event
+  // So we're assuming they don't, and turning off manual progress if they do.
+  // As opposed to doing user agent detection
+  this.tech.one('progress', function(){
+
+    // Update known progress support for this playback technology
+    this.features['progressEvents'] = true;
+
+    // Turn off manual progress tracking
+    this.player_.manualProgressOff();
+  });
+};
+
+vjs.Player.prototype.manualProgressOff = function(){
+  this.manualProgress = false;
+  this.stopTrackingProgress();
+};
+
+vjs.Player.prototype.trackProgress = function(){
+
+  this.progressInterval = setInterval(vjs.bind(this, function(){
+    // Don't trigger unless buffered amount is greater than last time
+    // log(this.cache_.bufferEnd, this.buffered().end(0), this.duration())
+    /* TODO: update for multiple buffered regions */
+    if (this.cache_.bufferEnd < this.buffered().end(0)) {
+      this.trigger('progress');
+    } else if (this.bufferedPercent() == 1) {
+      this.stopTrackingProgress();
+      this.trigger('progress'); // Last update
+    }
+  }), 500);
+};
+vjs.Player.prototype.stopTrackingProgress = function(){ clearInterval(this.progressInterval); };
+
+/*! Time Tracking -------------------------------------------------------------- */
+vjs.Player.prototype.manualTimeUpdatesOn = function(){
+  this.manualTimeUpdates = true;
+
+  this.on('play', this.trackCurrentTime);
+  this.on('pause', this.stopTrackingCurrentTime);
+  // timeupdate is also called by .currentTime whenever current time is set
+
+  // Watch for native timeupdate event
+  this.tech.one('timeupdate', function(){
+    // Update known progress support for this playback technology
+    this.features['timeupdateEvents'] = true;
+    // Turn off manual progress tracking
+    this.player_.manualTimeUpdatesOff();
+  });
+};
+
+vjs.Player.prototype.manualTimeUpdatesOff = function(){
+  this.manualTimeUpdates = false;
+  this.stopTrackingCurrentTime();
+  this.off('play', this.trackCurrentTime);
+  this.off('pause', this.stopTrackingCurrentTime);
+};
+
+vjs.Player.prototype.trackCurrentTime = function(){
+  if (this.currentTimeInterval) { this.stopTrackingCurrentTime(); }
+  this.currentTimeInterval = setInterval(vjs.bind(this, function(){
+    this.trigger('timeupdate');
+  }), 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15
+};
+
+// Turn off play progress tracking (when paused or dragging)
+vjs.Player.prototype.stopTrackingCurrentTime = function(){ clearInterval(this.currentTimeInterval); };
+
+// /* Player event handlers (how the player reacts to certain events)
+// ================================================================================ */
+
+/**
+ * Fired when the user agent begins looking for media data
+ * @event loadstart
+ */
+vjs.Player.prototype.onLoadStart;
+
+/**
+ * Fired when the player has initial duration and dimension information
+ * @event loadedmetadata
+ */
+vjs.Player.prototype.onLoadedMetaData;
+
+/**
+ * Fired when the player has downloaded data at the current playback position
+ * @event loadeddata
+ */
+vjs.Player.prototype.onLoadedData;
+
+/**
+ * Fired when the player has finished downloading the source data
+ * @event loadedalldata
+ */
+vjs.Player.prototype.onLoadedAllData;
+
+/**
+ * Fired whenever the media begins or resumes playback
+ * @event play
+ */
+vjs.Player.prototype.onPlay = function(){
+  vjs.removeClass(this.el_, 'vjs-paused');
+  vjs.addClass(this.el_, 'vjs-playing');
+};
+
+/**
+ * Fired the first time a video is played
+ *
+ * Not part of the HLS spec, and we're not sure if this is the best
+ * implementation yet, so use sparingly. If you don't have a reason to
+ * prevent playback, use `myPlayer.one('play');` instead.
+ *
+ * @event firstplay
+ */
+vjs.Player.prototype.onFirstPlay = function(){
+    //If the first starttime attribute is specified
+    //then we will start at the given offset in seconds
+    if(this.options_['starttime']){
+      this.currentTime(this.options_['starttime']);
+    }
+
+    this.addClass('vjs-has-started');
+};
+
+/**
+ * Fired whenever the media has been paused
+ * @event pause
+ */
+vjs.Player.prototype.onPause = function(){
+  vjs.removeClass(this.el_, 'vjs-playing');
+  vjs.addClass(this.el_, 'vjs-paused');
+};
+
+/**
+ * Fired when the current playback position has changed
+ *
+ * During playback this is fired every 15-250 milliseconds, depnding on the
+ * playback technology in use.
+ * @event timeupdate
+ */
+vjs.Player.prototype.onTimeUpdate;
+
+/**
+ * Fired while the user agent is downloading media data
+ * @event progress
+ */
+vjs.Player.prototype.onProgress = function(){
+  // Add custom event for when source is finished downloading.
+  if (this.bufferedPercent() == 1) {
+    this.trigger('loadedalldata');
+  }
+};
+
+/**
+ * Fired when the end of the media resource is reached (currentTime == duration)
+ * @event ended
+ */
+vjs.Player.prototype.onEnded = function(){
+  if (this.options_['loop']) {
+    this.currentTime(0);
+    this.play();
+  }
+};
+
+/**
+ * Fired when the duration of the media resource is first known or changed
+ * @event durationchange
+ */
+vjs.Player.prototype.onDurationChange = function(){
+  // Allows for cacheing value instead of asking player each time.
+  this.duration(this.techGet('duration'));
+};
+
+/**
+ * Fired when the volume changes
+ * @event volumechange
+ */
+vjs.Player.prototype.onVolumeChange;
+
+/**
+ * Fired when the player switches in or out of fullscreen mode
+ * @event fullscreenchange
+ */
+vjs.Player.prototype.onFullscreenChange = function() {
+  if (this.isFullScreen) {
+    this.addClass('vjs-fullscreen');
+  } else {
+    this.removeClass('vjs-fullscreen');
+  }
+};
+
+/**
+ * Fired when there is an error in playback
+ * @event error
+ */
+vjs.Player.prototype.onError = function(e) {
+  vjs.log('Video Error', e);
+};
+
+// /* Player API
+// ================================================================================ */
+
+/**
+ * Object for cached values.
+ * @private
+ */
+vjs.Player.prototype.cache_;
+
+vjs.Player.prototype.getCache = function(){
+  return this.cache_;
+};
+
+// Pass values to the playback tech
+vjs.Player.prototype.techCall = function(method, arg){
+  // If it's not ready yet, call method when it is
+  if (this.tech && !this.tech.isReady_) {
+    this.tech.ready(function(){
+      this[method](arg);
+    });
+
+  // Otherwise call method now
+  } else {
+    try {
+      this.tech[method](arg);
+    } catch(e) {
+      vjs.log(e);
+      throw e;
+    }
+  }
+};
+
+// Get calls can't wait for the tech, and sometimes don't need to.
+vjs.Player.prototype.techGet = function(method){
+
+  if (this.tech && this.tech.isReady_) {
+
+    // Flash likes to die and reload when you hide or reposition it.
+    // In these cases the object methods go away and we get errors.
+    // When that happens we'll catch the errors and inform tech that it's not ready any more.
+    try {
+      return this.tech[method]();
+    } catch(e) {
+      // When building additional tech libs, an expected method may not be defined yet
+      if (this.tech[method] === undefined) {
+        vjs.log('Video.js: ' + method + ' method not defined for '+this.techName+' playback technology.', e);
+      } else {
+        // When a method isn't available on the object it throws a TypeError
+        if (e.name == 'TypeError') {
+          vjs.log('Video.js: ' + method + ' unavailable on '+this.techName+' playback technology element.', e);
+          this.tech.isReady_ = false;
+        } else {
+          vjs.log(e);
+        }
+      }
+      throw e;
+    }
+  }
+
+  return;
+};
+
+/**
+ * start media playback
+ *
+ *     myPlayer.play();
+ *
+ * @return {vjs.Player} self
+ */
+vjs.Player.prototype.play = function(){
+  this.techCall('play');
+  return this;
+};
+
+/**
+ * Pause the video playback
+ *
+ *     myPlayer.pause();
+ *
+ * @return {vjs.Player} self
+ */
+vjs.Player.prototype.pause = function(){
+  this.techCall('pause');
+  return this;
+};
+
+/**
+ * Check if the player is paused
+ *
+ *     var isPaused = myPlayer.paused();
+ *     var isPlaying = !myPlayer.paused();
+ *
+ * @return {Boolean} false if the media is currently playing, or true otherwise
+ */
+vjs.Player.prototype.paused = function(){
+  // The initial state of paused should be true (in Safari it's actually false)
+  return (this.techGet('paused') === false) ? false : true;
+};
+
+/**
+ * Get or set the current time (in seconds)
+ *
+ *     // get
+ *     var whereYouAt = myPlayer.currentTime();
+ *
+ *     // set
+ *     myPlayer.currentTime(120); // 2 minutes into the video
+ *
+ * @param  {Number|String=} seconds The time to seek to
+ * @return {Number}        The time in seconds, when not setting
+ * @return {vjs.Player}    self, when the current time is set
+ */
+vjs.Player.prototype.currentTime = function(seconds){
+  if (seconds !== undefined) {
+
+    // cache the last set value for smoother scrubbing
+    this.cache_.lastSetCurrentTime = seconds;
+
+    this.techCall('setCurrentTime', seconds);
+
+    // improve the accuracy of manual timeupdates
+    if (this.manualTimeUpdates) { this.trigger('timeupdate'); }
+
+    return this;
+  }
+
+  // cache last currentTime and return
+  // default to 0 seconds
+  return this.cache_.currentTime = (this.techGet('currentTime') || 0);
+};
+
+/**
+ * Get the length in time of the video in seconds
+ *
+ *     var lengthOfVideo = myPlayer.duration();
+ *
+ * **NOTE**: The video must have started loading before the duration can be
+ * known, and in the case of Flash, may not be known until the video starts
+ * playing.
+ *
+ * @return {Number} The duration of the video in seconds
+ */
+vjs.Player.prototype.duration = function(seconds){
+  if (seconds !== undefined) {
+
+    // cache the last set value for optimiized scrubbing (esp. Flash)
+    this.cache_.duration = parseFloat(seconds);
+
+    return this;
+  }
+
+  if (this.cache_.duration === undefined) {
+    this.onDurationChange();
+  }
+
+  return this.cache_.duration;
+};
+
+// Calculates how much time is left. Not in spec, but useful.
+vjs.Player.prototype.remainingTime = function(){
+  return this.duration() - this.currentTime();
+};
+
+// http://dev.w3.org/html5/spec/video.html#dom-media-buffered
+// Buffered returns a timerange object.
+// Kind of like an array of portions of the video that have been downloaded.
+// So far no browsers return more than one range (portion)
+
+/**
+ * Get a TimeRange object with the times of the video that have been downloaded
+ *
+ * If you just want the percent of the video that's been downloaded,
+ * use bufferedPercent.
+ *
+ *     // Number of different ranges of time have been buffered. Usually 1.
+ *     numberOfRanges = bufferedTimeRange.length,
+ *
+ *     // Time in seconds when the first range starts. Usually 0.
+ *     firstRangeStart = bufferedTimeRange.start(0),
+ *
+ *     // Time in seconds when the first range ends
+ *     firstRangeEnd = bufferedTimeRange.end(0),
+ *
+ *     // Length in seconds of the first time range
+ *     firstRangeLength = firstRangeEnd - firstRangeStart;
+ *
+ * @return {Object} A mock TimeRange object (following HTML spec)
+ */
+vjs.Player.prototype.buffered = function(){
+  var buffered = this.techGet('buffered'),
+      start = 0,
+      buflast = buffered.length - 1,
+      // Default end to 0 and store in values
+      end = this.cache_.bufferEnd = this.cache_.bufferEnd || 0;
+
+  if (buffered && buflast >= 0 && buffered.end(buflast) !== end) {
+    end = buffered.end(buflast);
+    // Storing values allows them be overridden by setBufferedFromProgress
+    this.cache_.bufferEnd = end;
+  }
+
+  return vjs.createTimeRange(start, end);
+};
+
+/**
+ * Get the percent (as a decimal) of the video that's been downloaded
+ *
+ *     var howMuchIsDownloaded = myPlayer.bufferedPercent();
+ *
+ * 0 means none, 1 means all.
+ * (This method isn't in the HTML5 spec, but it's very convenient)
+ *
+ * @return {Number} A decimal between 0 and 1 representing the percent
+ */
+vjs.Player.prototype.bufferedPercent = function(){
+  return (this.duration()) ? this.buffered().end(0) / this.duration() : 0;
+};
+
+/**
+ * Get or set the current volume of the media
+ *
+ *     // get
+ *     var howLoudIsIt = myPlayer.volume();
+ *
+ *     // set
+ *     myPlayer.volume(0.5); // Set volume to half
+ *
+ * 0 is off (muted), 1.0 is all the way up, 0.5 is half way.
+ *
+ * @param  {Number} percentAsDecimal The new volume as a decimal percent
+ * @return {Number}                  The current volume, when getting
+ * @return {vjs.Player}              self, when setting
+ */
+vjs.Player.prototype.volume = function(percentAsDecimal){
+  var vol;
+
+  if (percentAsDecimal !== undefined) {
+    vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1
+    this.cache_.volume = vol;
+    this.techCall('setVolume', vol);
+    vjs.setLocalStorage('volume', vol);
+    return this;
+  }
+
+  // Default to 1 when returning current volume.
+  vol = parseFloat(this.techGet('volume'));
+  return (isNaN(vol)) ? 1 : vol;
+};
+
+
+/**
+ * Get the current muted state, or turn mute on or off
+ *
+ *     // get
+ *     var isVolumeMuted = myPlayer.muted();
+ *
+ *     // set
+ *     myPlayer.muted(true); // mute the volume
+ *
+ * @param  {Boolean=} muted True to mute, false to unmute
+ * @return {Boolean} True if mute is on, false if not, when getting
+ * @return {vjs.Player} self, when setting mute
+ */
+vjs.Player.prototype.muted = function(muted){
+  if (muted !== undefined) {
+    this.techCall('setMuted', muted);
+    return this;
+  }
+  return this.techGet('muted') || false; // Default to false
+};
+
+// Check if current tech can support native fullscreen (e.g. with built in controls lik iOS, so not our flash swf)
+vjs.Player.prototype.supportsFullScreen = function(){ return this.techGet('supportsFullScreen') || false; };
+
+/**
+ * Increase the size of the video to full screen
+ *
+ *     myPlayer.requestFullScreen();
+ *
+ * In some browsers, full screen is not supported natively, so it enters
+ * "full window mode", where the video fills the browser window.
+ * In browsers and devices that support native full screen, sometimes the
+ * browser's default controls will be shown, and not the Video.js custom skin.
+ * This includes most mobile devices (iOS, Android) and older versions of
+ * Safari.
+ *
+ * @return {vjs.Player} self
+ */
+vjs.Player.prototype.requestFullScreen = function(){
+  var requestFullScreen = vjs.support.requestFullScreen;
+  this.isFullScreen = true;
+
+  if (requestFullScreen) {
+    // the browser supports going fullscreen at the element level so we can
+    // take the controls fullscreen as well as the video
+
+    // Trigger fullscreenchange event after change
+    // We have to specifically add this each time, and remove
+    // when cancelling fullscreen. Otherwise if there's multiple
+    // players on a page, they would all be reacting to the same fullscreen
+    // events
+    vjs.on(document, requestFullScreen.eventName, vjs.bind(this, function(e){
+      this.isFullScreen = document[requestFullScreen.isFullScreen];
+
+      // If cancelling fullscreen, remove event listener.
+      if (this.isFullScreen === false) {
+        vjs.off(document, requestFullScreen.eventName, arguments.callee);
+      }
+
+      this.trigger('fullscreenchange');
+    }));
+
+    this.el_[requestFullScreen.requestFn]();
+
+  } else if (this.tech.supportsFullScreen()) {
+    // we can't take the video.js controls fullscreen but we can go fullscreen
+    // with native controls
+    this.techCall('enterFullScreen');
+  } else {
+    // fullscreen isn't supported so we'll just stretch the video element to
+    // fill the viewport
+    this.enterFullWindow();
+    this.trigger('fullscreenchange');
+  }
+
+  return this;
+};
+
+/**
+ * Return the video to its normal size after having been in full screen mode
+ *
+ *     myPlayer.cancelFullScreen();
+ *
+ * @return {vjs.Player} self
+ */
+vjs.Player.prototype.cancelFullScreen = function(){
+  var requestFullScreen = vjs.support.requestFullScreen;
+  this.isFullScreen = false;
+
+  // Check for browser element fullscreen support
+  if (requestFullScreen) {
+    document[requestFullScreen.cancelFn]();
+  } else if (this.tech.supportsFullScreen()) {
+   this.techCall('exitFullScreen');
+  } else {
+   this.exitFullWindow();
+   this.trigger('fullscreenchange');
+  }
+
+  return this;
+};
+
+// When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.
+vjs.Player.prototype.enterFullWindow = function(){
+  this.isFullWindow = true;
+
+  // Storing original doc overflow value to return to when fullscreen is off
+  this.docOrigOverflow = document.documentElement.style.overflow;
+
+  // Add listener for esc key to exit fullscreen
+  vjs.on(document, 'keydown', vjs.bind(this, this.fullWindowOnEscKey));
+
+  // Hide any scroll bars
+  document.documentElement.style.overflow = 'hidden';
+
+  // Apply fullscreen styles
+  vjs.addClass(document.body, 'vjs-full-window');
+
+  this.trigger('enterFullWindow');
+};
+vjs.Player.prototype.fullWindowOnEscKey = function(event){
+  if (event.keyCode === 27) {
+    if (this.isFullScreen === true) {
+      this.cancelFullScreen();
+    } else {
+      this.exitFullWindow();
+    }
+  }
+};
+
+vjs.Player.prototype.exitFullWindow = function(){
+  this.isFullWindow = false;
+  vjs.off(document, 'keydown', this.fullWindowOnEscKey);
+
+  // Unhide scroll bars.
+  document.documentElement.style.overflow = this.docOrigOverflow;
+
+  // Remove fullscreen styles
+  vjs.removeClass(document.body, 'vjs-full-window');
+
+  // Resize the box, controller, and poster to original sizes
+  // this.positionAll();
+  this.trigger('exitFullWindow');
+};
+
+vjs.Player.prototype.selectSource = function(sources){
+
+  // Loop through each playback technology in the options order
+  for (var i=0,j=this.options_['techOrder'];i<j.length;i++) {
+    var techName = vjs.capitalize(j[i]),
+        tech = window['videojs'][techName];
+
+    // Check if the browser supports this technology
+    if (tech.isSupported()) {
+      // Loop through each source object
+      for (var a=0,b=sources;a<b.length;a++) {
+        var source = b[a];
+
+        // Check if source can be played with this technology
+        if (tech['canPlaySource'](source)) {
+          return { source: source, tech: techName };
+        }
+      }
+    }
+  }
+
+  return false;
+};
+
+/**
+ * The source function updates the video source
+ *
+ * There are three types of variables you can pass as the argument.
+ *
+ * **URL String**: A URL to the the video file. Use this method if you are sure
+ * the current playback technology (HTML5/Flash) can support the source you
+ * provide. Currently only MP4 files can be used in both HTML5 and Flash.
+ *
+ *     myPlayer.src("http://www.example.com/path/to/video.mp4");
+ *
+ * **Source Object (or element):** A javascript object containing information
+ * about the source file. Use this method if you want the player to determine if
+ * it can support the file using the type information.
+ *
+ *     myPlayer.src({ type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" });
+ *
+ * **Array of Source Objects:** To provide multiple versions of the source so
+ * that it can be played using HTML5 across browsers you can use an array of
+ * source objects. Video.js will detect which version is supported and load that
+ * file.
+ *
+ *     myPlayer.src([
+ *       { type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" },
+ *       { type: "video/webm", src: "http://www.example.com/path/to/video.webm" },
+ *       { type: "video/ogg", src: "http://www.example.com/path/to/video.ogv" }
+ *     ]);
+ *
+ * @param  {String|Object|Array=} source The source URL, object, or array of sources
+ * @return {vjs.Player} self
+ */
+vjs.Player.prototype.src = function(source){
+  // Case: Array of source objects to choose from and pick the best to play
+  if (source instanceof Array) {
+
+    var sourceTech = this.selectSource(source),
+        techName;
+
+    if (sourceTech) {
+        source = sourceTech.source;
+        techName = sourceTech.tech;
+
+      // If this technology is already loaded, set source
+      if (techName == this.techName) {
+        this.src(source); // Passing the source object
+      // Otherwise load this technology with chosen source
+      } else {
+        this.loadTech(techName, source);
+      }
+    } else {
+      this.el_.appendChild(vjs.createEl('p', {
+        innerHTML: this.options()['notSupportedMessage']
+      }));
+    }
+
+  // Case: Source object { src: '', type: '' ... }
+  } else if (source instanceof Object) {
+
+    if (window['videojs'][this.techName]['canPlaySource'](source)) {
+      this.src(source.src);
+    } else {
+      // Send through tech loop to check for a compatible technology.
+      this.src([source]);
+    }
+
+  // Case: URL String (http://myvideo...)
+  } else {
+    // Cache for getting last set source
+    this.cache_.src = source;
+
+    if (!this.isReady_) {
+      this.ready(function(){
+        this.src(source);
+      });
+    } else {
+      this.techCall('src', source);
+      if (this.options_['preload'] == 'auto') {
+        this.load();
+      }
+      if (this.options_['autoplay']) {
+        this.play();
+      }
+    }
+  }
+  return this;
+};
+
+// Begin loading the src data
+// http://dev.w3.org/html5/spec/video.html#dom-media-load
+vjs.Player.prototype.load = function(){
+  this.techCall('load');
+  return this;
+};
+
+// http://dev.w3.org/html5/spec/video.html#dom-media-currentsrc
+vjs.Player.prototype.currentSrc = function(){
+  return this.techGet('currentSrc') || this.cache_.src || '';
+};
+
+// Attributes/Options
+vjs.Player.prototype.preload = function(value){
+  if (value !== undefined) {
+    this.techCall('setPreload', value);
+    this.options_['preload'] = value;
+    return this;
+  }
+  return this.techGet('preload');
+};
+vjs.Player.prototype.autoplay = function(value){
+  if (value !== undefined) {
+    this.techCall('setAutoplay', value);
+    this.options_['autoplay'] = value;
+    return this;
+  }
+  return this.techGet('autoplay', value);
+};
+vjs.Player.prototype.loop = function(value){
+  if (value !== undefined) {
+    this.techCall('setLoop', value);
+    this.options_['loop'] = value;
+    return this;
+  }
+  return this.techGet('loop');
+};
+
+/**
+ * the url of the poster image source
+ * @type {String}
+ * @private
+ */
+vjs.Player.prototype.poster_;
+
+/**
+ * get or set the poster image source url
+ *
+ * ##### EXAMPLE:
+ *
+ *     // getting
+ *     var currentPoster = myPlayer.poster();
+ *
+ *     // setting
+ *     myPlayer.poster('http://example.com/myImage.jpg');
+ *
+ * @param  {String=} [src] Poster image source URL
+ * @return {String} poster URL when getting
+ * @return {vjs.Player} self when setting
+ */
+vjs.Player.prototype.poster = function(src){
+  if (src !== undefined) {
+    this.poster_ = src;
+    return this;
+  }
+  return this.poster_;
+};
+
+/**
+ * Whether or not the controls are showing
+ * @type {Boolean}
+ * @private
+ */
+vjs.Player.prototype.controls_;
+
+/**
+ * Get or set whether or not the controls are showing.
+ * @param  {Boolean} controls Set controls to showing or not
+ * @return {Boolean}    Controls are showing
+ */
+vjs.Player.prototype.controls = function(bool){
+  if (bool !== undefined) {
+    bool = !!bool; // force boolean
+    // Don't trigger a change event unless it actually changed
+    if (this.controls_ !== bool) {
+      this.controls_ = bool;
+      if (bool) {
+        this.removeClass('vjs-controls-disabled');
+        this.addClass('vjs-controls-enabled');
+        this.trigger('controlsenabled');
+      } else {
+        this.removeClass('vjs-controls-enabled');
+        this.addClass('vjs-controls-disabled');
+        this.trigger('controlsdisabled');
+      }
+    }
+    return this;
+  }
+  return this.controls_;
+};
+
+vjs.Player.prototype.usingNativeControls_;
+
+/**
+ * Toggle native controls on/off. Native controls are the controls built into
+ * devices (e.g. default iPhone controls), Flash, or other techs
+ * (e.g. Vimeo Controls)
+ *
+ * **This should only be set by the current tech, because only the tech knows
+ * if it can support native controls**
+ *
+ * @param  {Boolean} bool    True signals that native controls are on
+ * @return {vjs.Player}      Returns the player
+ * @private
+ */
+vjs.Player.prototype.usingNativeControls = function(bool){
+  if (bool !== undefined) {
+    bool = !!bool; // force boolean
+    // Don't trigger a change event unless it actually changed
+    if (this.usingNativeControls_ !== bool) {
+      this.usingNativeControls_ = bool;
+      if (bool) {
+        this.addClass('vjs-using-native-controls');
+
+        /**
+         * player is using the native device controls
+         *
+         * @event usingnativecontrols
+         * @memberof vjs.Player
+         * @instance
+         * @private
+         */
+        this.trigger('usingnativecontrols');
+      } else {
+        this.removeClass('vjs-using-native-controls');
+
+        /**
+         * player is using the custom HTML controls
+         *
+         * @event usingcustomcontrols
+         * @memberof vjs.Player
+         * @instance
+         * @private
+         */
+        this.trigger('usingcustomcontrols');
+      }
+    }
+    return this;
+  }
+  return this.usingNativeControls_;
+};
+
+vjs.Player.prototype.error = function(){ return this.techGet('error'); };
+vjs.Player.prototype.ended = function(){ return this.techGet('ended'); };
+vjs.Player.prototype.seeking = function(){ return this.techGet('seeking'); };
+
+// When the player is first initialized, trigger activity so components
+// like the control bar show themselves if needed
+vjs.Player.prototype.userActivity_ = true;
+vjs.Player.prototype.reportUserActivity = function(event){
+  this.userActivity_ = true;
+};
+
+vjs.Player.prototype.userActive_ = true;
+vjs.Player.prototype.userActive = function(bool){
+  if (bool !== undefined) {
+    bool = !!bool;
+    if (bool !== this.userActive_) {
+      this.userActive_ = bool;
+      if (bool) {
+        // If the user was inactive and is now active we want to reset the
+        // inactivity timer
+        this.userActivity_ = true;
+        this.removeClass('vjs-user-inactive');
+        this.addClass('vjs-user-active');
+        this.trigger('useractive');
+      } else {
+        // We're switching the state to inactive manually, so erase any other
+        // activity
+        this.userActivity_ = false;
+
+        // Chrome/Safari/IE have bugs where when you change the cursor it can
+        // trigger a mousemove event. This causes an issue when you're hiding
+        // the cursor when the user is inactive, and a mousemove signals user
+        // activity. Making it impossible to go into inactive mode. Specifically
+        // this happens in fullscreen when we really need to hide the cursor.
+        //
+        // When this gets resolved in ALL browsers it can be removed
+        // https://code.google.com/p/chromium/issues/detail?id=103041
+        this.tech.one('mousemove', function(e){
+          e.stopPropagation();
+          e.preventDefault();
+        });
+        this.removeClass('vjs-user-active');
+        this.addClass('vjs-user-inactive');
+        this.trigger('userinactive');
+      }
+    }
+    return this;
+  }
+  return this.userActive_;
+};
+
+vjs.Player.prototype.listenForUserActivity = function(){
+  var onMouseActivity, onMouseDown, mouseInProgress, onMouseUp,
+      activityCheck, inactivityTimeout;
+
+  onMouseActivity = this.reportUserActivity;
+
+  onMouseDown = function() {
+    onMouseActivity();
+    // For as long as the they are touching the device or have their mouse down,
+    // we consider them active even if they're not moving their finger or mouse.
+    // So we want to continue to update that they are active
+    clearInterval(mouseInProgress);
+    // Setting userActivity=true now and setting the interval to the same time
+    // as the activityCheck interval (250) should ensure we never miss the
+    // next activityCheck
+    mouseInProgress = setInterval(vjs.bind(this, onMouseActivity), 250);
+  };
+
+  onMouseUp = function(event) {
+    onMouseActivity();
+    // Stop the interval that maintains activity if the mouse/touch is down
+    clearInterval(mouseInProgress);
+  };
+
+  // Any mouse movement will be considered user activity
+  this.on('mousedown', onMouseDown);
+  this.on('mousemove', onMouseActivity);
+  this.on('mouseup', onMouseUp);
+
+  // Listen for keyboard navigation
+  // Shouldn't need to use inProgress interval because of key repeat
+  this.on('keydown', onMouseActivity);
+  this.on('keyup', onMouseActivity);
+
+  // Consider any touch events that bubble up to be activity
+  // Certain touches on the tech will be blocked from bubbling because they
+  // toggle controls
+  this.on('touchstart', onMouseDown);
+  this.on('touchmove', onMouseActivity);
+  this.on('touchend', onMouseUp);
+  this.on('touchcancel', onMouseUp);
+
+  // Run an interval every 250 milliseconds instead of stuffing everything into
+  // the mousemove/touchmove function itself, to prevent performance degradation.
+  // `this.reportUserActivity` simply sets this.userActivity_ to true, which
+  // then gets picked up by this loop
+  // http://ejohn.org/blog/learning-from-twitter/
+  activityCheck = setInterval(vjs.bind(this, function() {
+    // Check to see if mouse/touch activity has happened
+    if (this.userActivity_) {
+      // Reset the activity tracker
+      this.userActivity_ = false;
+
+      // If the user state was inactive, set the state to active
+      this.userActive(true);
+
+      // Clear any existing inactivity timeout to start the timer over
+      clearTimeout(inactivityTimeout);
+
+      // In X seconds, if no more activity has occurred the user will be
+      // considered inactive
+      inactivityTimeout = setTimeout(vjs.bind(this, function() {
+        // Protect against the case where the inactivityTimeout can trigger just
+        // before the next user activity is picked up by the activityCheck loop
+        // causing a flicker
+        if (!this.userActivity_) {
+          this.userActive(false);
+        }
+      }), 2000);
+    }
+  }), 250);
+
+  // Clean up the intervals when we kill the player
+  this.on('dispose', function(){
+    clearInterval(activityCheck);
+    clearTimeout(inactivityTimeout);
+  });
+};
+
+// Methods to add support for
+// networkState: function(){ return this.techCall('networkState'); },
+// readyState: function(){ return this.techCall('readyState'); },
+// seeking: function(){ return this.techCall('seeking'); },
+// initialTime: function(){ return this.techCall('initialTime'); },
+// startOffsetTime: function(){ return this.techCall('startOffsetTime'); },
+// played: function(){ return this.techCall('played'); },
+// seekable: function(){ return this.techCall('seekable'); },
+// videoTracks: function(){ return this.techCall('videoTracks'); },
+// audioTracks: function(){ return this.techCall('audioTracks'); },
+// videoWidth: function(){ return this.techCall('videoWidth'); },
+// videoHeight: function(){ return this.techCall('videoHeight'); },
+// defaultPlaybackRate: function(){ return this.techCall('defaultPlaybackRate'); },
+// playbackRate: function(){ return this.techCall('playbackRate'); },
+// mediaGroup: function(){ return this.techCall('mediaGroup'); },
+// controller: function(){ return this.techCall('controller'); },
+// defaultMuted: function(){ return this.techCall('defaultMuted'); }
+
+// TODO
+// currentSrcList: the array of sources including other formats and bitrates
+// playList: array of source lists in order of playback
+
+// RequestFullscreen API
+(function(){
+  var prefix, requestFS, div;
+
+  div = document.createElement('div');
+
+  requestFS = {};
+
+  // Current W3C Spec
+  // http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#api
+  // Mozilla Draft: https://wiki.mozilla.org/Gecko:FullScreenAPI#fullscreenchange_event
+  // New: https://dvcs.w3.org/hg/fullscreen/raw-file/529a67b8d9f3/Overview.html
+  if (div.cancelFullscreen !== undefined) {
+    requestFS.requestFn = 'requestFullscreen';
+    requestFS.cancelFn = 'exitFullscreen';
+    requestFS.eventName = 'fullscreenchange';
+    requestFS.isFullScreen = 'fullScreen';
+
+  // Webkit (Chrome/Safari) and Mozilla (Firefox) have working implementations
+  // that use prefixes and vary slightly from the new W3C spec. Specifically,
+  // using 'exit' instead of 'cancel', and lowercasing the 'S' in Fullscreen.
+  // Other browsers don't have any hints of which version they might follow yet,
+  // so not going to try to predict by looping through all prefixes.
+  } else {
+
+    if (document.mozCancelFullScreen) {
+      prefix = 'moz';
+      requestFS.isFullScreen = prefix + 'FullScreen';
+    } else {
+      prefix = 'webkit';
+      requestFS.isFullScreen = prefix + 'IsFullScreen';
+    }
+
+    if (div[prefix + 'RequestFullScreen']) {
+      requestFS.requestFn = prefix + 'RequestFullScreen';
+      requestFS.cancelFn = prefix + 'CancelFullScreen';
+    }
+    requestFS.eventName = prefix + 'fullscreenchange';
+  }
+
+  if (document[requestFS.cancelFn]) {
+    vjs.support.requestFullScreen = requestFS;
+  }
+
+})();
+
+
+/**
+ * Container of main controls
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ * @extends vjs.Component
+ */
+vjs.ControlBar = vjs.Component.extend();
+
+vjs.ControlBar.prototype.options_ = {
+  loadEvent: 'play',
+  children: {
+    'playToggle': {},
+    'currentTimeDisplay': {},
+    'timeDivider': {},
+    'durationDisplay': {},
+    'remainingTimeDisplay': {},
+    'progressControl': {},
+    'fullscreenToggle': {},
+    'volumeControl': {},
+    'muteToggle': {}
+    // 'volumeMenuButton': {}
+  }
+};
+
+vjs.ControlBar.prototype.createEl = function(){
+  return vjs.createEl('div', {
+    className: 'vjs-control-bar'
+  });
+};
+/**
+ * Button to toggle between play and pause
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.PlayToggle = vjs.Button.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+
+    player.on('play', vjs.bind(this, this.onPlay));
+    player.on('pause', vjs.bind(this, this.onPause));
+  }
+});
+
+vjs.PlayToggle.prototype.buttonText = 'Play';
+
+vjs.PlayToggle.prototype.buildCSSClass = function(){
+  return 'vjs-play-control ' + vjs.Button.prototype.buildCSSClass.call(this);
+};
+
+// OnClick - Toggle between play and pause
+vjs.PlayToggle.prototype.onClick = function(){
+  if (this.player_.paused()) {
+    this.player_.play();
+  } else {
+    this.player_.pause();
+  }
+};
+
+  // OnPlay - Add the vjs-playing class to the element so it can change appearance
+vjs.PlayToggle.prototype.onPlay = function(){
+  vjs.removeClass(this.el_, 'vjs-paused');
+  vjs.addClass(this.el_, 'vjs-playing');
+  this.el_.children[0].children[0].innerHTML = 'Pause'; // change the button text to "Pause"
+};
+
+  // OnPause - Add the vjs-paused class to the element so it can change appearance
+vjs.PlayToggle.prototype.onPause = function(){
+  vjs.removeClass(this.el_, 'vjs-playing');
+  vjs.addClass(this.el_, 'vjs-paused');
+  this.el_.children[0].children[0].innerHTML = 'Play'; // change the button text to "Play"
+};
+/**
+ * Displays the current time
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.CurrentTimeDisplay = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    player.on('timeupdate', vjs.bind(this, this.updateContent));
+  }
+});
+
+vjs.CurrentTimeDisplay.prototype.createEl = function(){
+  var el = vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-current-time vjs-time-controls vjs-control'
+  });
+
+  this.content = vjs.createEl('div', {
+    className: 'vjs-current-time-display',
+    innerHTML: '<span class="vjs-control-text">Current Time </span>' + '0:00', // label the current time for screen reader users
+    'aria-live': 'off' // tell screen readers not to automatically read the time as it changes
+  });
+
+  el.appendChild(vjs.createEl('div').appendChild(this.content));
+  return el;
+};
+
+vjs.CurrentTimeDisplay.prototype.updateContent = function(){
+  // Allows for smooth scrubbing, when player can't keep up.
+  var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();
+  this.content.innerHTML = '<span class="vjs-control-text">Current Time </span>' + vjs.formatTime(time, this.player_.duration());
+};
+
+/**
+ * Displays the duration
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.DurationDisplay = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    player.on('timeupdate', vjs.bind(this, this.updateContent)); // this might need to be changes to 'durationchange' instead of 'timeupdate' eventually, however the durationchange event fires before this.player_.duration() is set, so the value cannot be written out using this method. Once the order of durationchange and this.player_.duration() being set is figured out, this can be updated.
+  }
+});
+
+vjs.DurationDisplay.prototype.createEl = function(){
+  var el = vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-duration vjs-time-controls vjs-control'
+  });
+
+  this.content = vjs.createEl('div', {
+    className: 'vjs-duration-display',
+    innerHTML: '<span class="vjs-control-text">Duration Time </span>' + '0:00', // label the duration time for screen reader users
+    'aria-live': 'off' // tell screen readers not to automatically read the time as it changes
+  });
+
+  el.appendChild(vjs.createEl('div').appendChild(this.content));
+  return el;
+};
+
+vjs.DurationDisplay.prototype.updateContent = function(){
+  var duration = this.player_.duration();
+  if (duration) {
+      this.content.innerHTML = '<span class="vjs-control-text">Duration Time </span>' + vjs.formatTime(duration); // label the duration time for screen reader users
+  }
+};
+
+/**
+ * The separator between the current time and duration
+ *
+ * Can be hidden if it's not needed in the design.
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.TimeDivider = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+  }
+});
+
+vjs.TimeDivider.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-time-divider',
+    innerHTML: '<div><span>/</span></div>'
+  });
+};
+
+/**
+ * Displays the time left in the video
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.RemainingTimeDisplay = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    player.on('timeupdate', vjs.bind(this, this.updateContent));
+  }
+});
+
+vjs.RemainingTimeDisplay.prototype.createEl = function(){
+  var el = vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-remaining-time vjs-time-controls vjs-control'
+  });
+
+  this.content = vjs.createEl('div', {
+    className: 'vjs-remaining-time-display',
+    innerHTML: '<span class="vjs-control-text">Remaining Time </span>' + '-0:00', // label the remaining time for screen reader users
+    'aria-live': 'off' // tell screen readers not to automatically read the time as it changes
+  });
+
+  el.appendChild(vjs.createEl('div').appendChild(this.content));
+  return el;
+};
+
+vjs.RemainingTimeDisplay.prototype.updateContent = function(){
+  if (this.player_.duration()) {
+    this.content.innerHTML = '<span class="vjs-control-text">Remaining Time </span>' + '-'+ vjs.formatTime(this.player_.remainingTime());
+  }
+
+  // Allows for smooth scrubbing, when player can't keep up.
+  // var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();
+  // this.content.innerHTML = vjs.formatTime(time, this.player_.duration());
+};
+/**
+ * Toggle fullscreen video
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @extends vjs.Button
+ */
+vjs.FullscreenToggle = vjs.Button.extend({
+  /**
+   * @constructor
+   * @memberof vjs.FullscreenToggle
+   * @instance
+   */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+  }
+});
+
+vjs.FullscreenToggle.prototype.buttonText = 'Fullscreen';
+
+vjs.FullscreenToggle.prototype.buildCSSClass = function(){
+  return 'vjs-fullscreen-control ' + vjs.Button.prototype.buildCSSClass.call(this);
+};
+
+vjs.FullscreenToggle.prototype.onClick = function(){
+  if (!this.player_.isFullScreen) {
+    this.player_.requestFullScreen();
+    this.el_.children[0].children[0].innerHTML = 'Non-Fullscreen'; // change the button text to "Non-Fullscreen"
+  } else {
+    this.player_.cancelFullScreen();
+    this.el_.children[0].children[0].innerHTML = 'Fullscreen'; // change the button to "Fullscreen"
+  }
+};
+/**
+ * The Progress Control component contains the seek bar, load progress,
+ * and play progress
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.ProgressControl = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+  }
+});
+
+vjs.ProgressControl.prototype.options_ = {
+  children: {
+    'seekBar': {}
+  }
+};
+
+vjs.ProgressControl.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-progress-control vjs-control'
+  });
+};
+
+/**
+ * Seek Bar and holder for the progress bars
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.SeekBar = vjs.Slider.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Slider.call(this, player, options);
+    player.on('timeupdate', vjs.bind(this, this.updateARIAAttributes));
+    player.ready(vjs.bind(this, this.updateARIAAttributes));
+  }
+});
+
+vjs.SeekBar.prototype.options_ = {
+  children: {
+    'loadProgressBar': {},
+    'playProgressBar': {},
+    'seekHandle': {}
+  },
+  'barName': 'playProgressBar',
+  'handleName': 'seekHandle'
+};
+
+vjs.SeekBar.prototype.playerEvent = 'timeupdate';
+
+vjs.SeekBar.prototype.createEl = function(){
+  return vjs.Slider.prototype.createEl.call(this, 'div', {
+    className: 'vjs-progress-holder',
+    'aria-label': 'video progress bar'
+  });
+};
+
+vjs.SeekBar.prototype.updateARIAAttributes = function(){
+    // Allows for smooth scrubbing, when player can't keep up.
+    var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();
+    this.el_.setAttribute('aria-valuenow',vjs.round(this.getPercent()*100, 2)); // machine readable value of progress bar (percentage complete)
+    this.el_.setAttribute('aria-valuetext',vjs.formatTime(time, this.player_.duration())); // human readable value of progress bar (time complete)
+};
+
+vjs.SeekBar.prototype.getPercent = function(){
+  var currentTime;
+  // Flash RTMP provider will not report the correct time
+  // immediately after a seek. This isn't noticeable if you're
+  // seeking while the video is playing, but it is if you seek
+  // while the video is paused.
+  if (this.player_.techName === 'Flash' && this.player_.seeking()) {
+    var cache = this.player_.getCache();
+    if (cache.lastSetCurrentTime) {
+      currentTime = cache.lastSetCurrentTime;
+    }
+    else {
+      currentTime = this.player_.currentTime();
+    }
+  }
+  else {
+    currentTime = this.player_.currentTime();
+  }
+
+  return currentTime / this.player_.duration();
+};
+
+vjs.SeekBar.prototype.onMouseDown = function(event){
+  vjs.Slider.prototype.onMouseDown.call(this, event);
+
+  this.player_.scrubbing = true;
+
+  this.videoWasPlaying = !this.player_.paused();
+  this.player_.pause();
+};
+
+vjs.SeekBar.prototype.onMouseMove = function(event){
+  var newTime = this.calculateDistance(event) * this.player_.duration();
+
+  // Don't let video end while scrubbing.
+  if (newTime == this.player_.duration()) { newTime = newTime - 0.1; }
+
+  // Set new time (tell player to seek to new time)
+  this.player_.currentTime(newTime);
+};
+
+vjs.SeekBar.prototype.onMouseUp = function(event){
+    debugger
+  vjs.Slider.prototype.onMouseUp.call(this, event);
+
+  this.player_.scrubbing = false;
+  if (this.videoWasPlaying) {
+      debugger
+    this.player_.play();
+  }
+};
+
+vjs.SeekBar.prototype.stepForward = function(){
+  this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users
+};
+
+vjs.SeekBar.prototype.stepBack = function(){
+  this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users
+};
+
+
+/**
+ * Shows load progress
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.LoadProgressBar = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+    player.on('progress', vjs.bind(this, this.update));
+  }
+});
+
+vjs.LoadProgressBar.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-load-progress',
+    innerHTML: '<span class="vjs-control-text">Loaded: 0%</span>'
+  });
+};
+
+vjs.LoadProgressBar.prototype.update = function(){
+  if (this.el_.style) { this.el_.style.width = vjs.round(this.player_.bufferedPercent() * 100, 2) + '%'; }
+};
+
+
+/**
+ * Shows play progress
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.PlayProgressBar = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+  }
+});
+
+vjs.PlayProgressBar.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-play-progress',
+    innerHTML: '<span class="vjs-control-text">Progress: 0%</span>'
+  });
+};
+
+/**
+ * The Seek Handle shows the current position of the playhead during playback,
+ * and can be dragged to adjust the playhead.
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.SeekHandle = vjs.SliderHandle.extend();
+
+/**
+ * The default value for the handle content, which may be read by screen readers
+ *
+ * @type {String}
+ * @private
+ */
+vjs.SeekHandle.prototype.defaultValue = '00:00';
+
+/** @inheritDoc */
+vjs.SeekHandle.prototype.createEl = function(){
+  return vjs.SliderHandle.prototype.createEl.call(this, 'div', {
+    className: 'vjs-seek-handle'
+  });
+};
+/**
+ * The component for controlling the volume level
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.VolumeControl = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    // hide volume controls when they're not supported by the current tech
+    if (player.tech && player.tech.features && player.tech.features['volumeControl'] === false) {
+      this.addClass('vjs-hidden');
+    }
+    player.on('loadstart', vjs.bind(this, function(){
+      if (player.tech.features && player.tech.features['volumeControl'] === false) {
+        this.addClass('vjs-hidden');
+      } else {
+        this.removeClass('vjs-hidden');
+      }
+    }));
+  }
+});
+
+vjs.VolumeControl.prototype.options_ = {
+  children: {
+    'volumeBar': {}
+  }
+};
+
+vjs.VolumeControl.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-volume-control vjs-control'
+  });
+};
+
+/**
+ * The bar that contains the volume level and can be clicked on to adjust the level
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.VolumeBar = vjs.Slider.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Slider.call(this, player, options);
+    player.on('volumechange', vjs.bind(this, this.updateARIAAttributes));
+    player.ready(vjs.bind(this, this.updateARIAAttributes));
+    setTimeout(vjs.bind(this, this.update), 0); // update when elements is in DOM
+  }
+});
+
+vjs.VolumeBar.prototype.updateARIAAttributes = function(){
+  // Current value of volume bar as a percentage
+  this.el_.setAttribute('aria-valuenow',vjs.round(this.player_.volume()*100, 2));
+  this.el_.setAttribute('aria-valuetext',vjs.round(this.player_.volume()*100, 2)+'%');
+};
+
+vjs.VolumeBar.prototype.options_ = {
+  children: {
+    'volumeLevel': {},
+    'volumeHandle': {}
+  },
+  'barName': 'volumeLevel',
+  'handleName': 'volumeHandle'
+};
+
+vjs.VolumeBar.prototype.playerEvent = 'volumechange';
+
+vjs.VolumeBar.prototype.createEl = function(){
+  return vjs.Slider.prototype.createEl.call(this, 'div', {
+    className: 'vjs-volume-bar',
+    'aria-label': 'volume level'
+  });
+};
+
+vjs.VolumeBar.prototype.onMouseMove = function(event) {
+  if (this.player_.muted()) {
+    this.player_.muted(false);
+  }
+
+  this.player_.volume(this.calculateDistance(event));
+};
+
+vjs.VolumeBar.prototype.getPercent = function(){
+  if (this.player_.muted()) {
+    return 0;
+  } else {
+    return this.player_.volume();
+  }
+};
+
+vjs.VolumeBar.prototype.stepForward = function(){
+  this.player_.volume(this.player_.volume() + 0.1);
+};
+
+vjs.VolumeBar.prototype.stepBack = function(){
+  this.player_.volume(this.player_.volume() - 0.1);
+};
+
+/**
+ * Shows volume level
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.VolumeLevel = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+  }
+});
+
+vjs.VolumeLevel.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-volume-level',
+    innerHTML: '<span class="vjs-control-text"></span>'
+  });
+};
+
+/**
+ * The volume handle can be dragged to adjust the volume level
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+ vjs.VolumeHandle = vjs.SliderHandle.extend();
+
+ vjs.VolumeHandle.prototype.defaultValue = '00:00';
+
+ /** @inheritDoc */
+ vjs.VolumeHandle.prototype.createEl = function(){
+   return vjs.SliderHandle.prototype.createEl.call(this, 'div', {
+     className: 'vjs-volume-handle'
+   });
+ };
+/**
+ * A button component for muting the audio
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.MuteToggle = vjs.Button.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+
+    player.on('volumechange', vjs.bind(this, this.update));
+
+    // hide mute toggle if the current tech doesn't support volume control
+    if (player.tech && player.tech.features && player.tech.features['volumeControl'] === false) {
+      this.addClass('vjs-hidden');
+    }
+    player.on('loadstart', vjs.bind(this, function(){
+      if (player.tech.features && player.tech.features['volumeControl'] === false) {
+        this.addClass('vjs-hidden');
+      } else {
+        this.removeClass('vjs-hidden');
+      }
+    }));
+  }
+});
+
+vjs.MuteToggle.prototype.createEl = function(){
+  return vjs.Button.prototype.createEl.call(this, 'div', {
+    className: 'vjs-mute-control vjs-control',
+    innerHTML: '<div><span class="vjs-control-text">Mute</span></div>'
+  });
+};
+
+vjs.MuteToggle.prototype.onClick = function(){
+  this.player_.muted( this.player_.muted() ? false : true );
+};
+
+vjs.MuteToggle.prototype.update = function(){
+  var vol = this.player_.volume(),
+      level = 3;
+
+  if (vol === 0 || this.player_.muted()) {
+    level = 0;
+  } else if (vol < 0.33) {
+    level = 1;
+  } else if (vol < 0.67) {
+    level = 2;
+  }
+
+  // Don't rewrite the button text if the actual text doesn't change.
+  // This causes unnecessary and confusing information for screen reader users.
+  // This check is needed because this function gets called every time the volume level is changed.
+  if(this.player_.muted()){
+      if(this.el_.children[0].children[0].innerHTML!='Unmute'){
+          this.el_.children[0].children[0].innerHTML = 'Unmute'; // change the button text to "Unmute"
+      }
+  } else {
+      if(this.el_.children[0].children[0].innerHTML!='Mute'){
+          this.el_.children[0].children[0].innerHTML = 'Mute'; // change the button text to "Mute"
+      }
+  }
+
+  /* TODO improve muted icon classes */
+  for (var i = 0; i < 4; i++) {
+    vjs.removeClass(this.el_, 'vjs-vol-'+i);
+  }
+  vjs.addClass(this.el_, 'vjs-vol-'+level);
+};
+/**
+ * Menu button with a popup for showing the volume slider.
+ * @constructor
+ */
+vjs.VolumeMenuButton = vjs.MenuButton.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.MenuButton.call(this, player, options);
+
+    // Same listeners as MuteToggle
+    player.on('volumechange', vjs.bind(this, this.update));
+
+    // hide mute toggle if the current tech doesn't support volume control
+    if (player.tech && player.tech.features && player.tech.features.volumeControl === false) {
+      this.addClass('vjs-hidden');
+    }
+    player.on('loadstart', vjs.bind(this, function(){
+      if (player.tech.features && player.tech.features.volumeControl === false) {
+        this.addClass('vjs-hidden');
+      } else {
+        this.removeClass('vjs-hidden');
+      }
+    }));
+    this.addClass('vjs-menu-button');
+  }
+});
+
+vjs.VolumeMenuButton.prototype.createMenu = function(){
+  var menu = new vjs.Menu(this.player_, {
+    contentElType: 'div'
+  });
+  var vc = new vjs.VolumeBar(this.player_, vjs.obj.merge({vertical: true}, this.options_.volumeBar));
+  menu.addChild(vc);
+  return menu;
+};
+
+vjs.VolumeMenuButton.prototype.onClick = function(){
+  vjs.MuteToggle.prototype.onClick.call(this);
+  vjs.MenuButton.prototype.onClick.call(this);
+};
+
+vjs.VolumeMenuButton.prototype.createEl = function(){
+  return vjs.Button.prototype.createEl.call(this, 'div', {
+    className: 'vjs-volume-menu-button vjs-menu-button vjs-control',
+    innerHTML: '<div><span class="vjs-control-text">Mute</span></div>'
+  });
+};
+vjs.VolumeMenuButton.prototype.update = vjs.MuteToggle.prototype.update;
+/* Poster Image
+================================================================================ */
+/**
+ * The component that handles showing the poster image.
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.PosterImage = vjs.Button.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+
+    if (!player.poster() || !player.controls()) {
+      this.hide();
+    }
+
+    player.on('play', vjs.bind(this, this.hide));
+  }
+});
+
+vjs.PosterImage.prototype.createEl = function(){
+  var el = vjs.createEl('div', {
+        className: 'vjs-poster',
+
+        // Don't want poster to be tabbable.
+        tabIndex: -1
+      }),
+      poster = this.player_.poster();
+
+  if (poster) {
+    if ('backgroundSize' in el.style) {
+      el.style.backgroundImage = 'url("' + poster + '")';
+    } else {
+      el.appendChild(vjs.createEl('img', { src: poster }));
+    }
+  }
+
+  return el;
+};
+
+vjs.PosterImage.prototype.onClick = function(){
+  // Only accept clicks when controls are enabled
+  if (this.player().controls()) {
+    this.player_.play();
+  }
+};
+/* Loading Spinner
+================================================================================ */
+/**
+ * Loading spinner for waiting events
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.LoadingSpinner = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    player.on('canplay', vjs.bind(this, this.hide));
+    player.on('canplaythrough', vjs.bind(this, this.hide));
+    player.on('playing', vjs.bind(this, this.hide));
+    player.on('seeked', vjs.bind(this, this.hide));
+
+    player.on('seeking', vjs.bind(this, this.show));
+
+    // in some browsers seeking does not trigger the 'playing' event,
+    // so we also need to trap 'seeked' if we are going to set a
+    // 'seeking' event
+    player.on('seeked', vjs.bind(this, this.hide));
+
+    player.on('error', vjs.bind(this, this.show));
+
+    // Not showing spinner on stalled any more. Browsers may stall and then not trigger any events that would remove the spinner.
+    // Checked in Chrome 16 and Safari 5.1.2. http://help.videojs.com/discussions/problems/883-why-is-the-download-progress-showing
+    // player.on('stalled', vjs.bind(this, this.show));
+
+    player.on('waiting', vjs.bind(this, this.show));
+  }
+});
+
+vjs.LoadingSpinner.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-loading-spinner'
+  });
+};
+/* Big Play Button
+================================================================================ */
+/**
+ * Initial play button. Shows before the video has played. The hiding of the
+ * big play button is done via CSS and player states.
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.BigPlayButton = vjs.Button.extend();
+
+vjs.BigPlayButton.prototype.createEl = function(){
+  return vjs.Button.prototype.createEl.call(this, 'div', {
+    className: 'vjs-big-play-button',
+    innerHTML: '<span aria-hidden="true"></span>',
+    'aria-label': 'play video'
+  });
+};
+
+vjs.BigPlayButton.prototype.onClick = function(){
+  this.player_.play();
+};
+/**
+ * @fileoverview Media Technology Controller - Base class for media playback
+ * technology controllers like Flash and HTML5
+ */
+
+/**
+ * Base class for media (HTML5 Video, Flash) controllers
+ * @param {vjs.Player|Object} player  Central player instance
+ * @param {Object=} options Options object
+ * @constructor
+ */
+vjs.MediaTechController = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.Component.call(this, player, options, ready);
+
+    this.initControlsListeners();
+  }
+});
+
+/**
+ * Set up click and touch listeners for the playback element
+ * On desktops, a click on the video itself will toggle playback,
+ * on a mobile device a click on the video toggles controls.
+ * (toggling controls is done by toggling the user state between active and
+ * inactive)
+ *
+ * A tap can signal that a user has become active, or has become inactive
+ * e.g. a quick tap on an iPhone movie should reveal the controls. Another
+ * quick tap should hide them again (signaling the user is in an inactive
+ * viewing state)
+ *
+ * In addition to this, we still want the user to be considered inactive after
+ * a few seconds of inactivity.
+ *
+ * Note: the only part of iOS interaction we can't mimic with this setup
+ * is a touch and hold on the video element counting as activity in order to
+ * keep the controls showing, but that shouldn't be an issue. A touch and hold on
+ * any controls will still keep the user active
+ */
+vjs.MediaTechController.prototype.initControlsListeners = function(){
+  var player, tech, activateControls, deactivateControls;
+
+  tech = this;
+  player = this.player();
+
+  var activateControls = function(){
+    if (player.controls() && !player.usingNativeControls()) {
+      tech.addControlsListeners();
+    }
+  };
+
+  deactivateControls = vjs.bind(tech, tech.removeControlsListeners);
+
+  // Set up event listeners once the tech is ready and has an element to apply
+  // listeners to
+  this.ready(activateControls);
+  player.on('controlsenabled', activateControls);
+  player.on('controlsdisabled', deactivateControls);
+};
+
+vjs.MediaTechController.prototype.addControlsListeners = function(){
+  var preventBubble, userWasActive;
+
+  // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do
+  // trigger mousedown/up.
+  // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object
+  // Any touch events are set to block the mousedown event from happening
+  this.on('mousedown', this.onClick);
+
+  // We need to block touch events on the video element from bubbling up,
+  // otherwise they'll signal activity prematurely. The specific use case is
+  // when the video is playing and the controls have faded out. In this case
+  // only a tap (fast touch) should toggle the user active state and turn the
+  // controls back on. A touch and move or touch and hold should not trigger
+  // the controls (per iOS as an example at least)
+  //
+  // We always want to stop propagation on touchstart because touchstart
+  // at the player level starts the touchInProgress interval. We can still
+  // report activity on the other events, but won't let them bubble for
+  // consistency. We don't want to bubble a touchend without a touchstart.
+  this.on('touchstart', function(event) {
+    // Stop the mouse events from also happening
+    event.preventDefault();
+    event.stopPropagation();
+    // Record if the user was active now so we don't have to keep polling it
+    userWasActive = this.player_.userActive();
+  });
+
+  preventBubble = function(event){
+    event.stopPropagation();
+    if (userWasActive) {
+      this.player_.reportUserActivity();
+    }
+  };
+
+  // Treat all touch events the same for consistency
+  this.on('touchmove', preventBubble);
+  this.on('touchleave', preventBubble);
+  this.on('touchcancel', preventBubble);
+  this.on('touchend', preventBubble);
+
+  // Turn on component tap events
+  this.emitTapEvents();
+
+  // The tap listener needs to come after the touchend listener because the tap
+  // listener cancels out any reportedUserActivity when setting userActive(false)
+  this.on('tap', this.onTap);
+};
+
+/**
+ * Remove the listeners used for click and tap controls. This is needed for
+ * toggling to controls disabled, where a tap/touch should do nothing.
+ */
+vjs.MediaTechController.prototype.removeControlsListeners = function(){
+  // We don't want to just use `this.off()` because there might be other needed
+  // listeners added by techs that extend this.
+  this.off('tap');
+  this.off('touchstart');
+  this.off('touchmove');
+  this.off('touchleave');
+  this.off('touchcancel');
+  this.off('touchend');
+  this.off('click');
+  this.off('mousedown');
+};
+
+/**
+ * Handle a click on the media element. By default will play/pause the media.
+ */
+vjs.MediaTechController.prototype.onClick = function(event){
+  // We're using mousedown to detect clicks thanks to Flash, but mousedown
+  // will also be triggered with right-clicks, so we need to prevent that
+  if (event.button !== 0) return;
+
+  // When controls are disabled a click should not toggle playback because
+  // the click is considered a control
+  if (this.player().controls()) {
+    if (this.player().paused()) {
+      this.player().play();
+    } else {
+      this.player().pause();
+    }
+  }
+};
+
+/**
+ * Handle a tap on the media element. By default it will toggle the user
+ * activity state, which hides and shows the controls.
+ */
+
+vjs.MediaTechController.prototype.onTap = function(){
+  this.player().userActive(!this.player().userActive());
+};
+
+vjs.MediaTechController.prototype.features = {
+  'volumeControl': true,
+
+  // Resizing plugins using request fullscreen reloads the plugin
+  'fullscreenResize': false,
+
+  // Optional events that we can manually mimic with timers
+  // currently not triggered by video-js-swf
+  'progressEvents': false,
+  'timeupdateEvents': false
+};
+
+vjs.media = {};
+
+/**
+ * List of default API methods for any MediaTechController
+ * @type {String}
+ */
+vjs.media.ApiMethods = 'play,pause,paused,currentTime,setCurrentTime,duration,buffered,volume,setVolume,muted,setMuted,width,height,supportsFullScreen,enterFullScreen,src,load,currentSrc,preload,setPreload,autoplay,setAutoplay,loop,setLoop,error,networkState,readyState,seeking,initialTime,startOffsetTime,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks,defaultPlaybackRate,playbackRate,mediaGroup,controller,controls,defaultMuted'.split(',');
+// Create placeholder methods for each that warn when a method isn't supported by the current playback technology
+
+function createMethod(methodName){
+  return function(){
+    throw new Error('The "'+methodName+'" method is not available on the playback technology\'s API');
+  };
+}
+
+for (var i = vjs.media.ApiMethods.length - 1; i >= 0; i--) {
+  var methodName = vjs.media.ApiMethods[i];
+  vjs.MediaTechController.prototype[vjs.media.ApiMethods[i]] = createMethod(methodName);
+}
+/**
+ * @fileoverview HTML5 Media Controller - Wrapper for HTML5 Media API
+ */
+
+/**
+ * HTML5 Media Controller - Wrapper for HTML5 Media API
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @param {Function=} ready
+ * @constructor
+ */
+vjs.Html5 = vjs.MediaTechController.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    // volume cannot be changed from 1 on iOS
+    this.features['volumeControl'] = vjs.Html5.canControlVolume();
+
+    // In iOS, if you move a video element in the DOM, it breaks video playback.
+    this.features['movingMediaElementInDOM'] = !vjs.IS_IOS;
+
+    // HTML video is able to automatically resize when going to fullscreen
+    this.features['fullscreenResize'] = true;
+
+    vjs.MediaTechController.call(this, player, options, ready);
+
+    var source = options['source'];
+
+    // If the element source is already set, we may have missed the loadstart event, and want to trigger it.
+    // We don't want to set the source again and interrupt playback.
+    if (source && this.el_.currentSrc === source.src && this.el_.networkState > 0) {
+      player.trigger('loadstart');
+
+    // Otherwise set the source if one was provided.
+    } else if (source) {
+      this.el_.src = source.src;
+    }
+
+    // Determine if native controls should be used
+    // Our goal should be to get the custom controls on mobile solid everywhere
+    // so we can remove this all together. Right now this will block custom
+    // controls on touch enabled laptops like the Chrome Pixel
+    if (vjs.TOUCH_ENABLED && player.options()['nativeControlsForTouch'] !== false) {
+      this.useNativeControls();
+    }
+
+    // Chrome and Safari both have issues with autoplay.
+    // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.
+    // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)
+    // This fixes both issues. Need to wait for API, so it updates displays correctly
+    player.ready(function(){
+      if (this.tag && this.options_['autoplay'] && this.paused()) {
+        delete this.tag['poster']; // Chrome Fix. Fixed in Chrome v16.
+        this.play();
+      }
+    });
+
+    this.setupTriggers();
+    this.triggerReady();
+  }
+});
+
+vjs.Html5.prototype.dispose = function(){
+  vjs.MediaTechController.prototype.dispose.call(this);
+};
+
+vjs.Html5.prototype.createEl = function(){
+  var player = this.player_,
+      // If possible, reuse original tag for HTML5 playback technology element
+      el = player.tag,
+      newEl,
+      clone;
+
+  // Check if this browser supports moving the element into the box.
+  // On the iPhone video will break if you move the element,
+  // So we have to create a brand new element.
+  if (!el || this.features['movingMediaElementInDOM'] === false) {
+
+    // If the original tag is still there, clone and remove it.
+    if (el) {
+      clone = el.cloneNode(false);
+      vjs.Html5.disposeMediaElement(el);
+      el = clone;
+      player.tag = null;
+    } else {
+      el = vjs.createEl('video', {
+        id:player.id() + '_html5_api',
+        className:'vjs-tech'
+      });
+    }
+    // associate the player with the new tag
+    el['player'] = player;
+
+    vjs.insertFirst(el, player.el());
+  }
+
+  // Update specific tag settings, in case they were overridden
+  var attrs = ['autoplay','preload','loop','muted'];
+  for (var i = attrs.length - 1; i >= 0; i--) {
+    var attr = attrs[i];
+    if (player.options_[attr] !== null) {
+      el[attr] = player.options_[attr];
+    }
+  }
+
+  return el;
+  // jenniisawesome = true;
+};
+
+// Make video events trigger player events
+// May seem verbose here, but makes other APIs possible.
+vjs.Html5.prototype.setupTriggers = function(){
+  for (var i = vjs.Html5.Events.length - 1; i >= 0; i--) {
+    vjs.on(this.el_, vjs.Html5.Events[i], vjs.bind(this.player_, this.eventHandler));
+  }
+};
+// Triggers removed using this.off when disposed
+
+vjs.Html5.prototype.eventHandler = function(e){
+  this.trigger(e);
+
+  // No need for media events to bubble up.
+  e.stopPropagation();
+};
+
+vjs.Html5.prototype.useNativeControls = function(){
+  var tech, player, controlsOn, controlsOff, cleanUp;
+
+  tech = this;
+  player = this.player();
+
+  // If the player controls are enabled turn on the native controls
+  tech.setControls(player.controls());
+
+  // Update the native controls when player controls state is updated
+  controlsOn = function(){
+    tech.setControls(true);
+  };
+  controlsOff = function(){
+    tech.setControls(false);
+  };
+  player.on('controlsenabled', controlsOn);
+  player.on('controlsdisabled', controlsOff);
+
+  // Clean up when not using native controls anymore
+  cleanUp = function(){
+    player.off('controlsenabled', controlsOn);
+    player.off('controlsdisabled', controlsOff);
+  };
+  tech.on('dispose', cleanUp);
+  player.on('usingcustomcontrols', cleanUp);
+
+  // Update the state of the player to using native controls
+  player.usingNativeControls(true);
+};
+
+
+vjs.Html5.prototype.play = function(){ this.el_.play(); };
+vjs.Html5.prototype.pause = function(){ this.el_.pause(); };
+vjs.Html5.prototype.paused = function(){ return this.el_.paused; };
+
+vjs.Html5.prototype.currentTime = function(){ return this.el_.currentTime; };
+vjs.Html5.prototype.setCurrentTime = function(seconds){
+  try {
+    this.el_.currentTime = seconds;
+  } catch(e) {
+    vjs.log(e, 'Video is not ready. (Video.js)');
+    // this.warning(VideoJS.warnings.videoNotReady);
+  }
+};
+
+vjs.Html5.prototype.duration = function(){ return this.el_.duration || 0; };
+vjs.Html5.prototype.buffered = function(){ return this.el_.buffered; };
+
+vjs.Html5.prototype.volume = function(){ return this.el_.volume; };
+vjs.Html5.prototype.setVolume = function(percentAsDecimal){ this.el_.volume = percentAsDecimal; };
+vjs.Html5.prototype.muted = function(){ return this.el_.muted; };
+vjs.Html5.prototype.setMuted = function(muted){ this.el_.muted = muted; };
+
+vjs.Html5.prototype.width = function(){ return this.el_.offsetWidth; };
+vjs.Html5.prototype.height = function(){ return this.el_.offsetHeight; };
+
+vjs.Html5.prototype.supportsFullScreen = function(){
+  if (typeof this.el_.webkitEnterFullScreen == 'function') {
+
+    // Seems to be broken in Chromium/Chrome && Safari in Leopard
+    if (/Android/.test(vjs.USER_AGENT) || !/Chrome|Mac OS X 10.5/.test(vjs.USER_AGENT)) {
+      return true;
+    }
+  }
+  return false;
+};
+
+vjs.Html5.prototype.enterFullScreen = function(){
+  var video = this.el_;
+  if (video.paused && video.networkState <= video.HAVE_METADATA) {
+    // attempt to prime the video element for programmatic access
+    // this isn't necessary on the desktop but shouldn't hurt
+    this.el_.play();
+
+    // playing and pausing synchronously during the transition to fullscreen
+    // can get iOS ~6.1 devices into a play/pause loop
+    setTimeout(function(){
+      video.pause();
+      video.webkitEnterFullScreen();
+    }, 0);
+  } else {
+    video.webkitEnterFullScreen();
+  }
+};
+vjs.Html5.prototype.exitFullScreen = function(){
+  this.el_.webkitExitFullScreen();
+};
+vjs.Html5.prototype.src = function(src){ this.el_.src = src; };
+vjs.Html5.prototype.load = function(){ this.el_.load(); };
+vjs.Html5.prototype.currentSrc = function(){ return this.el_.currentSrc; };
+
+vjs.Html5.prototype.preload = function(){ return this.el_.preload; };
+vjs.Html5.prototype.setPreload = function(val){ this.el_.preload = val; };
+
+vjs.Html5.prototype.autoplay = function(){ return this.el_.autoplay; };
+vjs.Html5.prototype.setAutoplay = function(val){ this.el_.autoplay = val; };
+
+vjs.Html5.prototype.controls = function(){ return this.el_.controls; }
+vjs.Html5.prototype.setControls = function(val){ this.el_.controls = !!val; }
+
+vjs.Html5.prototype.loop = function(){ return this.el_.loop; };
+vjs.Html5.prototype.setLoop = function(val){ this.el_.loop = val; };
+
+vjs.Html5.prototype.error = function(){ return this.el_.error; };
+vjs.Html5.prototype.seeking = function(){ return this.el_.seeking; };
+vjs.Html5.prototype.ended = function(){ return this.el_.ended; };
+vjs.Html5.prototype.defaultMuted = function(){ return this.el_.defaultMuted; };
+
+/* HTML5 Support Testing ---------------------------------------------------- */
+
+vjs.Html5.isSupported = function(){
+  return !!vjs.TEST_VID.canPlayType;
+};
+
+vjs.Html5.canPlaySource = function(srcObj){
+  // IE9 on Windows 7 without MediaPlayer throws an error here
+  // https://github.com/videojs/video.js/issues/519
+  try {
+    return !!vjs.TEST_VID.canPlayType(srcObj.type);
+  } catch(e) {
+    return '';
+  }
+  // TODO: Check Type
+  // If no Type, check ext
+  // Check Media Type
+};
+
+vjs.Html5.canControlVolume = function(){
+  var volume =  vjs.TEST_VID.volume;
+  vjs.TEST_VID.volume = (volume / 2) + 0.1;
+  return volume !== vjs.TEST_VID.volume;
+};
+
+// List of all HTML5 events (various uses).
+vjs.Html5.Events = 'loadstart,suspend,abort,error,emptied,stalled,loadedmetadata,loadeddata,canplay,canplaythrough,playing,waiting,seeking,seeked,ended,durationchange,timeupdate,progress,play,pause,ratechange,volumechange'.split(',');
+
+vjs.Html5.disposeMediaElement = function(el){
+  if (!el) { return; }
+
+  el['player'] = null;
+
+  if (el.parentNode) {
+    el.parentNode.removeChild(el);
+  }
+
+  // remove any child track or source nodes to prevent their loading
+  while(el.hasChildNodes()) {
+    el.removeChild(el.firstChild);
+  }
+
+  // remove any src reference. not setting `src=''` because that causes a warning
+  // in firefox
+  el.removeAttribute('src');
+
+  // force the media element to update its loading state by calling load()
+  if (typeof el.load === 'function') {
+    el.load();
+  }
+};
+
+// HTML5 Feature detection and Device Fixes --------------------------------- //
+
+  // Override Android 2.2 and less canPlayType method which is broken
+if (vjs.IS_OLD_ANDROID) {
+  document.createElement('video').constructor.prototype.canPlayType = function(type){
+    return (type && type.toLowerCase().indexOf('video/mp4') != -1) ? 'maybe' : '';
+  };
+}
+/**
+ * @fileoverview VideoJS-SWF - Custom Flash Player with HTML5-ish API
+ * https://github.com/zencoder/video-js-swf
+ * Not using setupTriggers. Using global onEvent func to distribute events
+ */
+
+/**
+ * Flash Media Controller - Wrapper for fallback SWF API
+ *
+ * @param {vjs.Player} player
+ * @param {Object=} options
+ * @param {Function=} ready
+ * @constructor
+ */
+vjs.Flash = vjs.MediaTechController.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.MediaTechController.call(this, player, options, ready);
+
+    var source = options['source'],
+
+        // Which element to embed in
+        parentEl = options['parentEl'],
+
+        // Create a temporary element to be replaced by swf object
+        placeHolder = this.el_ = vjs.createEl('div', { id: player.id() + '_temp_flash' }),
+
+        // Generate ID for swf object
+        objId = player.id()+'_flash_api',
+
+        // Store player options in local var for optimization
+        // TODO: switch to using player methods instead of options
+        // e.g. player.autoplay();
+        playerOptions = player.options_,
+
+        // Merge default flashvars with ones passed in to init
+        flashVars = vjs.obj.merge({
+
+          // SWF Callback Functions
+          'readyFunction': 'videojs.Flash.onReady',
+          'eventProxyFunction': 'videojs.Flash.onEvent',
+          'errorEventProxyFunction': 'videojs.Flash.onError',
+
+          // Player Settings
+          'autoplay': playerOptions.autoplay,
+          'preload': playerOptions.preload,
+          'loop': playerOptions.loop,
+          'muted': playerOptions.muted
+
+        }, options['flashVars']),
+
+        // Merge default parames with ones passed in
+        params = vjs.obj.merge({
+          'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance
+          'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading
+        }, options['params']),
+
+        // Merge default attributes with ones passed in
+        attributes = vjs.obj.merge({
+          'id': objId,
+          'name': objId, // Both ID and Name needed or swf to identifty itself
+          'class': 'vjs-tech'
+        }, options['attributes'])
+    ;
+
+    // If source was supplied pass as a flash var.
+    if (source) {
+      if (source.type && vjs.Flash.isStreamingType(source.type)) {
+        var parts = vjs.Flash.streamToParts(source.src);
+        flashVars['rtmpConnection'] = encodeURIComponent(parts.connection);
+        flashVars['rtmpStream'] = encodeURIComponent(parts.stream);
+      }
+      else {
+        flashVars['src'] = encodeURIComponent(vjs.getAbsoluteURL(source.src));
+      }
+    }
+
+    // Add placeholder to player div
+    vjs.insertFirst(placeHolder, parentEl);
+
+    // Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers
+    // This allows resetting the playhead when we catch the reload
+    if (options['startTime']) {
+      this.ready(function(){
+        this.load();
+        this.play();
+        this.currentTime(options['startTime']);
+      });
+    }
+
+    // Flash iFrame Mode
+    // In web browsers there are multiple instances where changing the parent element or visibility of a plugin causes the plugin to reload.
+    // - Firefox just about always. https://bugzilla.mozilla.org/show_bug.cgi?id=90268 (might be fixed by version 13)
+    // - Webkit when hiding the plugin
+    // - Webkit and Firefox when using requestFullScreen on a parent element
+    // Loading the flash plugin into a dynamically generated iFrame gets around most of these issues.
+    // Issues that remain include hiding the element and requestFullScreen in Firefox specifically
+
+    // There's on particularly annoying issue with this method which is that Firefox throws a security error on an offsite Flash object loaded into a dynamically created iFrame.
+    // Even though the iframe was inserted into a page on the web, Firefox + Flash considers it a local app trying to access an internet file.
+    // I tried mulitple ways of setting the iframe src attribute but couldn't find a src that worked well. Tried a real/fake source, in/out of domain.
+    // Also tried a method from stackoverflow that caused a security error in all browsers. http://stackoverflow.com/questions/2486901/how-to-set-document-domain-for-a-dynamically-generated-iframe
+    // In the end the solution I found to work was setting the iframe window.location.href right before doing a document.write of the Flash object.
+    // The only downside of this it seems to trigger another http request to the original page (no matter what's put in the href). Not sure why that is.
+
+    // NOTE (2012-01-29): Cannot get Firefox to load the remote hosted SWF into a dynamically created iFrame
+    // Firefox 9 throws a security error, unleess you call location.href right before doc.write.
+    //    Not sure why that even works, but it causes the browser to look like it's continuously trying to load the page.
+    // Firefox 3.6 keeps calling the iframe onload function anytime I write to it, causing an endless loop.
+
+    if (options['iFrameMode'] === true && !vjs.IS_FIREFOX) {
+
+      // Create iFrame with vjs-tech class so it's 100% width/height
+      var iFrm = vjs.createEl('iframe', {
+        'id': objId + '_iframe',
+        'name': objId + '_iframe',
+        'className': 'vjs-tech',
+        'scrolling': 'no',
+        'marginWidth': 0,
+        'marginHeight': 0,
+        'frameBorder': 0
+      });
+
+      // Update ready function names in flash vars for iframe window
+      flashVars['readyFunction'] = 'ready';
+      flashVars['eventProxyFunction'] = 'events';
+      flashVars['errorEventProxyFunction'] = 'errors';
+
+      // Tried multiple methods to get this to work in all browsers
+
+      // Tried embedding the flash object in the page first, and then adding a place holder to the iframe, then replacing the placeholder with the page object.
+      // The goal here was to try to load the swf URL in the parent page first and hope that got around the firefox security error
+      // var newObj = vjs.Flash.embed(options['swf'], placeHolder, flashVars, params, attributes);
+      // (in onload)
+      //  var temp = vjs.createEl('a', { id:'asdf', innerHTML: 'asdf' } );
+      //  iDoc.body.appendChild(temp);
+
+      // Tried embedding the flash object through javascript in the iframe source.
+      // This works in webkit but still triggers the firefox security error
+      // iFrm.src = 'javascript: document.write('"+vjs.Flash.getEmbedCode(options['swf'], flashVars, params, attributes)+"');";
+
+      // Tried an actual local iframe just to make sure that works, but it kills the easiness of the CDN version if you require the user to host an iframe
+      // We should add an option to host the iframe locally though, because it could help a lot of issues.
+      // iFrm.src = "iframe.html";
+
+      // Wait until iFrame has loaded to write into it.
+      vjs.on(iFrm, 'load', vjs.bind(this, function(){
+
+        var iDoc,
+            iWin = iFrm.contentWindow;
+
+        // The one working method I found was to use the iframe's document.write() to create the swf object
+        // This got around the security issue in all browsers except firefox.
+        // I did find a hack where if I call the iframe's window.location.href='', it would get around the security error
+        // However, the main page would look like it was loading indefinitely (URL bar loading spinner would never stop)
+        // Plus Firefox 3.6 didn't work no matter what I tried.
+        // if (vjs.USER_AGENT.match('Firefox')) {
+        //   iWin.location.href = '';
+        // }
+
+        // Get the iFrame's document depending on what the browser supports
+        iDoc = iFrm.contentDocument ? iFrm.contentDocument : iFrm.contentWindow.document;
+
+        // Tried ensuring both document domains were the same, but they already were, so that wasn't the issue.
+        // Even tried adding /. that was mentioned in a browser security writeup
+        // document.domain = document.domain+'/.';
+        // iDoc.domain = document.domain+'/.';
+
+        // Tried adding the object to the iframe doc's innerHTML. Security error in all browsers.
+        // iDoc.body.innerHTML = swfObjectHTML;
+
+        // Tried appending the object to the iframe doc's body. Security error in all browsers.
+        // iDoc.body.appendChild(swfObject);
+
+        // Using document.write actually got around the security error that browsers were throwing.
+        // Again, it's a dynamically generated (same domain) iframe, loading an external Flash swf.
+        // Not sure why that's a security issue, but apparently it is.
+        iDoc.write(vjs.Flash.getEmbedCode(options['swf'], flashVars, params, attributes));
+
+        // Setting variables on the window needs to come after the doc write because otherwise they can get reset in some browsers
+        // So far no issues with swf ready event being called before it's set on the window.
+        iWin['player'] = this.player_;
+
+        // Create swf ready function for iFrame window
+        iWin['ready'] = vjs.bind(this.player_, function(currSwf){
+          var el = iDoc.getElementById(currSwf),
+              player = this,
+              tech = player.tech;
+
+          // Update reference to playback technology element
+          tech.el_ = el;
+
+          // Make sure swf is actually ready. Sometimes the API isn't actually yet.
+          vjs.Flash.checkReady(tech);
+        });
+
+        // Create event listener for all swf events
+        iWin['events'] = vjs.bind(this.player_, function(swfID, eventName){
+          var player = this;
+          if (player && player.techName === 'flash') {
+            player.trigger(eventName);
+          }
+        });
+
+        // Create error listener for all swf errors
+        iWin['errors'] = vjs.bind(this.player_, function(swfID, eventName){
+          vjs.log('Flash Error', eventName);
+        });
+
+      }));
+
+      // Replace placeholder with iFrame (it will load now)
+      placeHolder.parentNode.replaceChild(iFrm, placeHolder);
+
+    // If not using iFrame mode, embed as normal object
+    } else {
+      vjs.Flash.embed(options['swf'], placeHolder, flashVars, params, attributes);
+    }
+  }
+});
+
+vjs.Flash.prototype.dispose = function(){
+  vjs.MediaTechController.prototype.dispose.call(this);
+};
+
+vjs.Flash.prototype.play = function(){
+  this.el_.vjs_play();
+};
+
+vjs.Flash.prototype.pause = function(){
+  this.el_.vjs_pause();
+};
+
+vjs.Flash.prototype.src = function(src){
+  if (vjs.Flash.isStreamingSrc(src)) {
+    src = vjs.Flash.streamToParts(src);
+    this.setRtmpConnection(src.connection);
+    this.setRtmpStream(src.stream);
+  }
+  else {
+    // Make sure source URL is abosolute.
+    src = vjs.getAbsoluteURL(src);
+    this.el_.vjs_src(src);
+  }
+
+  // Currently the SWF doesn't autoplay if you load a source later.
+  // e.g. Load player w/ no source, wait 2s, set src.
+  if (this.player_.autoplay()) {
+    var tech = this;
+    setTimeout(function(){ tech.play(); }, 0);
+  }
+};
+
+vjs.Flash.prototype.currentSrc = function(){
+  var src = this.el_.vjs_getProperty('currentSrc');
+  // no src, check and see if RTMP
+  if (src == null) {
+    var connection = this.rtmpConnection(),
+        stream = this.rtmpStream();
+
+    if (connection && stream) {
+      src = vjs.Flash.streamFromParts(connection, stream);
+    }
+  }
+  return src;
+};
+
+vjs.Flash.prototype.load = function(){
+  this.el_.vjs_load();
+};
+
+vjs.Flash.prototype.poster = function(){
+  this.el_.vjs_getProperty('poster');
+};
+
+vjs.Flash.prototype.buffered = function(){
+  return vjs.createTimeRange(0, this.el_.vjs_getProperty('buffered'));
+};
+
+vjs.Flash.prototype.supportsFullScreen = function(){
+  return false; // Flash does not allow fullscreen through javascript
+};
+
+vjs.Flash.prototype.enterFullScreen = function(){
+  return false;
+};
+
+
+// Create setters and getters for attributes
+var api = vjs.Flash.prototype,
+    readWrite = 'rtmpConnection,rtmpStream,preload,currentTime,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(','),
+    readOnly = 'error,currentSrc,networkState,readyState,seeking,initialTime,duration,startOffsetTime,paused,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks'.split(',');
+    // Overridden: buffered
+
+/**
+ * @this {*}
+ * @private
+ */
+var createSetter = function(attr){
+  var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);
+  api['set'+attrUpper] = function(val){ return this.el_.vjs_setProperty(attr, val); };
+};
+
+/**
+ * @this {*}
+ * @private
+ */
+var createGetter = function(attr){
+  api[attr] = function(){ return this.el_.vjs_getProperty(attr); };
+};
+
+(function(){
+  var i;
+  // Create getter and setters for all read/write attributes
+  for (i = 0; i < readWrite.length; i++) {
+    createGetter(readWrite[i]);
+    createSetter(readWrite[i]);
+  }
+
+  // Create getters for read-only attributes
+  for (i = 0; i < readOnly.length; i++) {
+    createGetter(readOnly[i]);
+  }
+})();
+
+/* Flash Support Testing -------------------------------------------------------- */
+
+vjs.Flash.isSupported = function(){
+  return vjs.Flash.version()[0] >= 10;
+  // return swfobject.hasFlashPlayerVersion('10');
+};
+
+vjs.Flash.canPlaySource = function(srcObj){
+  var type;
+
+  if (!srcObj.type) {
+    return '';
+  }
+
+  type = srcObj.type.replace(/;.*/,'').toLowerCase();
+  if (type in vjs.Flash.formats || type in vjs.Flash.streamingFormats) {
+    return 'maybe';
+  }
+};
+
+vjs.Flash.formats = {
+  'video/flv': 'FLV',
+  'video/x-flv': 'FLV',
+  'video/mp4': 'MP4',
+  'video/m4v': 'MP4'
+};
+
+vjs.Flash.streamingFormats = {
+  'rtmp/mp4': 'MP4',
+  'rtmp/flv': 'FLV'
+};
+
+vjs.Flash['onReady'] = function(currSwf){
+  var el = vjs.el(currSwf);
+
+  // Get player from box
+  // On firefox reloads, el might already have a player
+  var player = el['player'] || el.parentNode['player'],
+      tech = player.tech;
+
+  // Reference player on tech element
+  el['player'] = player;
+
+  // Update reference to playback technology element
+  tech.el_ = el;
+
+  vjs.Flash.checkReady(tech);
+};
+
+// The SWF isn't alwasy ready when it says it is. Sometimes the API functions still need to be added to the object.
+// If it's not ready, we set a timeout to check again shortly.
+vjs.Flash.checkReady = function(tech){
+
+  // Check if API property exists
+  if (tech.el().vjs_getProperty) {
+
+    // If so, tell tech it's ready
+    tech.triggerReady();
+
+  // Otherwise wait longer.
+  } else {
+
+    setTimeout(function(){
+      vjs.Flash.checkReady(tech);
+    }, 50);
+
+  }
+};
+
+// Trigger events from the swf on the player
+vjs.Flash['onEvent'] = function(swfID, eventName){
+  var player = vjs.el(swfID)['player'];
+  player.trigger(eventName);
+};
+
+// Log errors from the swf
+vjs.Flash['onError'] = function(swfID, err){
+  var player = vjs.el(swfID)['player'];
+  player.trigger('error');
+  vjs.log('Flash Error', err, swfID);
+};
+
+// Flash Version Check
+vjs.Flash.version = function(){
+  var version = '0,0,0';
+
+  // IE
+  try {
+    version = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
+
+  // other browsers
+  } catch(e) {
+    try {
+      if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin){
+        version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
+      }
+    } catch(err) {}
+  }
+  return version.split(',');
+};
+
+// Flash embedding method. Only used in non-iframe mode
+vjs.Flash.embed = function(swf, placeHolder, flashVars, params, attributes){
+  var code = vjs.Flash.getEmbedCode(swf, flashVars, params, attributes),
+
+      // Get element by embedding code and retrieving created element
+      obj = vjs.createEl('div', { innerHTML: code }).childNodes[0],
+
+      par = placeHolder.parentNode
+  ;
+
+  placeHolder.parentNode.replaceChild(obj, placeHolder);
+
+  // IE6 seems to have an issue where it won't initialize the swf object after injecting it.
+  // This is a dumb fix
+  var newObj = par.childNodes[0];
+  setTimeout(function(){
+    newObj.style.display = 'block';
+  }, 1000);
+
+  return obj;
+
+};
+
+vjs.Flash.getEmbedCode = function(swf, flashVars, params, attributes){
+
+  var objTag = '<object type="application/x-shockwave-flash"',
+      flashVarsString = '',
+      paramsString = '',
+      attrsString = '';
+
+  // Convert flash vars to string
+  if (flashVars) {
+    vjs.obj.each(flashVars, function(key, val){
+      flashVarsString += (key + '=' + val + '&amp;');
+    });
+  }
+
+  // Add swf, flashVars, and other default params
+  params = vjs.obj.merge({
+    'movie': swf,
+    'flashvars': flashVarsString,
+    'allowScriptAccess': 'always', // Required to talk to swf
+    'allowNetworking': 'all' // All should be default, but having security issues.
+  }, params);
+
+  // Create param tags string
+  vjs.obj.each(params, function(key, val){
+    paramsString += '<param name="'+key+'" value="'+val+'" />';
+  });
+
+  attributes = vjs.obj.merge({
+    // Add swf to attributes (need both for IE and Others to work)
+    'data': swf,
+
+    // Default to 100% width/height
+    'width': '100%',
+    'height': '100%'
+
+  }, attributes);
+
+  // Create Attributes string
+  vjs.obj.each(attributes, function(key, val){
+    attrsString += (key + '="' + val + '" ');
+  });
+
+  return objTag + attrsString + '>' + paramsString + '</object>';
+};
+
+vjs.Flash.streamFromParts = function(connection, stream) {
+  return connection + '&' + stream;
+};
+
+vjs.Flash.streamToParts = function(src) {
+  var parts = {
+    connection: '',
+    stream: ''
+  };
+
+  if (! src) {
+    return parts;
+  }
+
+  // Look for the normal URL separator we expect, '&'.
+  // If found, we split the URL into two pieces around the
+  // first '&'.
+  var connEnd = src.indexOf('&');
+  var streamBegin;
+  if (connEnd !== -1) {
+    streamBegin = connEnd + 1;
+  }
+  else {
+    // If there's not a '&', we use the last '/' as the delimiter.
+    connEnd = streamBegin = src.lastIndexOf('/') + 1;
+    if (connEnd === 0) {
+      // really, there's not a '/'?
+      connEnd = streamBegin = src.length;
+    }
+  }
+  parts.connection = src.substring(0, connEnd);
+  parts.stream = src.substring(streamBegin, src.length);
+
+  return parts;
+};
+
+vjs.Flash.isStreamingType = function(srcType) {
+  return srcType in vjs.Flash.streamingFormats;
+};
+
+// RTMP has four variations, any string starting
+// with one of these protocols should be valid
+vjs.Flash.RTMP_RE = /^rtmp[set]?:\/\//i;
+
+vjs.Flash.isStreamingSrc = function(src) {
+  return vjs.Flash.RTMP_RE.test(src);
+};
+/**
+ * The Media Loader is the component that decides which playback technology to load
+ * when the player is initialized.
+ *
+ * @constructor
+ */
+vjs.MediaLoader = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.Component.call(this, player, options, ready);
+
+    // If there are no sources when the player is initialized,
+    // load the first supported playback technology.
+    if (!player.options_['sources'] || player.options_['sources'].length === 0) {
+      for (var i=0,j=player.options_['techOrder']; i<j.length; i++) {
+        var techName = vjs.capitalize(j[i]),
+            tech = window['videojs'][techName];
+
+        // Check if the browser supports this technology
+        if (tech && tech.isSupported()) {
+          player.loadTech(techName);
+          break;
+        }
+      }
+    } else {
+      // // Loop through playback technologies (HTML5, Flash) and check for support.
+      // // Then load the best source.
+      // // A few assumptions here:
+      // //   All playback technologies respect preload false.
+      player.src(player.options_['sources']);
+    }
+  }
+});
+/**
+ * @fileoverview Text Tracks
+ * Text tracks are tracks of timed text events.
+ * Captions - text displayed over the video for the hearing impared
+ * Subtitles - text displayed over the video for those who don't understand langauge in the video
+ * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video
+ * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device
+ */
+
+// Player Additions - Functions add to the player object for easier access to tracks
+
+/**
+ * List of associated text tracks
+ * @type {Array}
+ * @private
+ */
+vjs.Player.prototype.textTracks_;
+
+/**
+ * Get an array of associated text tracks. captions, subtitles, chapters, descriptions
+ * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks
+ * @return {Array}           Array of track objects
+ * @private
+ */
+vjs.Player.prototype.textTracks = function(){
+  this.textTracks_ = this.textTracks_ || [];
+  return this.textTracks_;
+};
+
+/**
+ * Add a text track
+ * In addition to the W3C settings we allow adding additional info through options.
+ * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack
+ * @param {String}  kind        Captions, subtitles, chapters, descriptions, or metadata
+ * @param {String=} label       Optional label
+ * @param {String=} language    Optional language
+ * @param {Object=} options     Additional track options, like src
+ * @private
+ */
+vjs.Player.prototype.addTextTrack = function(kind, label, language, options){
+  var tracks = this.textTracks_ = this.textTracks_ || [];
+  options = options || {};
+
+  options['kind'] = kind;
+  options['label'] = label;
+  options['language'] = language;
+
+  // HTML5 Spec says default to subtitles.
+  // Uppercase first letter to match class names
+  var Kind = vjs.capitalize(kind || 'subtitles');
+
+  // Create correct texttrack class. CaptionsTrack, etc.
+  var track = new window['videojs'][Kind + 'Track'](this, options);
+
+  tracks.push(track);
+
+  // If track.dflt() is set, start showing immediately
+  // TODO: Add a process to deterime the best track to show for the specific kind
+  // Incase there are mulitple defaulted tracks of the same kind
+  // Or the user has a set preference of a specific language that should override the default
+  // if (track.dflt()) {
+  //   this.ready(vjs.bind(track, track.show));
+  // }
+
+  return track;
+};
+
+/**
+ * Add an array of text tracks. captions, subtitles, chapters, descriptions
+ * Track objects will be stored in the player.textTracks() array
+ * @param {Array} trackList Array of track elements or objects (fake track elements)
+ * @private
+ */
+vjs.Player.prototype.addTextTracks = function(trackList){
+  var trackObj;
+
+  for (var i = 0; i < trackList.length; i++) {
+    trackObj = trackList[i];
+    this.addTextTrack(trackObj['kind'], trackObj['label'], trackObj['language'], trackObj);
+  }
+
+  return this;
+};
+
+// Show a text track
+// disableSameKind: disable all other tracks of the same kind. Value should be a track kind (captions, etc.)
+vjs.Player.prototype.showTextTrack = function(id, disableSameKind){
+  var tracks = this.textTracks_,
+      i = 0,
+      j = tracks.length,
+      track, showTrack, kind;
+
+  // Find Track with same ID
+  for (;i<j;i++) {
+    track = tracks[i];
+    if (track.id() === id) {
+      track.show();
+      showTrack = track;
+
+    // Disable tracks of the same kind
+    } else if (disableSameKind && track.kind() == disableSameKind && track.mode() > 0) {
+      track.disable();
+    }
+  }
+
+  // Get track kind from shown track or disableSameKind
+  kind = (showTrack) ? showTrack.kind() : ((disableSameKind) ? disableSameKind : false);
+
+  // Trigger trackchange event, captionstrackchange, subtitlestrackchange, etc.
+  if (kind) {
+    this.trigger(kind+'trackchange');
+  }
+
+  return this;
+};
+
+/**
+ * The base class for all text tracks
+ *
+ * Handles the parsing, hiding, and showing of text track cues
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.TextTrack = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    // Apply track info to track object
+    // Options will often be a track element
+
+    // Build ID if one doesn't exist
+    this.id_ = options['id'] || ('vjs_' + options['kind'] + '_' + options['language'] + '_' + vjs.guid++);
+    this.src_ = options['src'];
+    // 'default' is a reserved keyword in js so we use an abbreviated version
+    this.dflt_ = options['default'] || options['dflt'];
+    this.title_ = options['title'];
+    this.language_ = options['srclang'];
+    this.label_ = options['label'];
+    this.cues_ = [];
+    this.activeCues_ = [];
+    this.readyState_ = 0;
+    this.mode_ = 0;
+
+    this.player_.on('fullscreenchange', vjs.bind(this, this.adjustFontSize));
+  }
+});
+
+/**
+ * Track kind value. Captions, subtitles, etc.
+ * @private
+ */
+vjs.TextTrack.prototype.kind_;
+
+/**
+ * Get the track kind value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.kind = function(){
+  return this.kind_;
+};
+
+/**
+ * Track src value
+ * @private
+ */
+vjs.TextTrack.prototype.src_;
+
+/**
+ * Get the track src value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.src = function(){
+  return this.src_;
+};
+
+/**
+ * Track default value
+ * If default is used, subtitles/captions to start showing
+ * @private
+ */
+vjs.TextTrack.prototype.dflt_;
+
+/**
+ * Get the track default value. ('default' is a reserved keyword)
+ * @return {Boolean}
+ */
+vjs.TextTrack.prototype.dflt = function(){
+  return this.dflt_;
+};
+
+/**
+ * Track title value
+ * @private
+ */
+vjs.TextTrack.prototype.title_;
+
+/**
+ * Get the track title value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.title = function(){
+  return this.title_;
+};
+
+/**
+ * Language - two letter string to represent track language, e.g. 'en' for English
+ * Spec def: readonly attribute DOMString language;
+ * @private
+ */
+vjs.TextTrack.prototype.language_;
+
+/**
+ * Get the track language value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.language = function(){
+  return this.language_;
+};
+
+/**
+ * Track label e.g. 'English'
+ * Spec def: readonly attribute DOMString label;
+ * @private
+ */
+vjs.TextTrack.prototype.label_;
+
+/**
+ * Get the track label value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.label = function(){
+  return this.label_;
+};
+
+/**
+ * All cues of the track. Cues have a startTime, endTime, text, and other properties.
+ * Spec def: readonly attribute TextTrackCueList cues;
+ * @private
+ */
+vjs.TextTrack.prototype.cues_;
+
+/**
+ * Get the track cues
+ * @return {Array}
+ */
+vjs.TextTrack.prototype.cues = function(){
+  return this.cues_;
+};
+
+/**
+ * ActiveCues is all cues that are currently showing
+ * Spec def: readonly attribute TextTrackCueList activeCues;
+ * @private
+ */
+vjs.TextTrack.prototype.activeCues_;
+
+/**
+ * Get the track active cues
+ * @return {Array}
+ */
+vjs.TextTrack.prototype.activeCues = function(){
+  return this.activeCues_;
+};
+
+/**
+ * ReadyState describes if the text file has been loaded
+ * const unsigned short NONE = 0;
+ * const unsigned short LOADING = 1;
+ * const unsigned short LOADED = 2;
+ * const unsigned short ERROR = 3;
+ * readonly attribute unsigned short readyState;
+ * @private
+ */
+vjs.TextTrack.prototype.readyState_;
+
+/**
+ * Get the track readyState
+ * @return {Number}
+ */
+vjs.TextTrack.prototype.readyState = function(){
+  return this.readyState_;
+};
+
+/**
+ * Mode describes if the track is showing, hidden, or disabled
+ * const unsigned short OFF = 0;
+ * const unsigned short HIDDEN = 1; (still triggering cuechange events, but not visible)
+ * const unsigned short SHOWING = 2;
+ * attribute unsigned short mode;
+ * @private
+ */
+vjs.TextTrack.prototype.mode_;
+
+/**
+ * Get the track mode
+ * @return {Number}
+ */
+vjs.TextTrack.prototype.mode = function(){
+  return this.mode_;
+};
+
+/**
+ * Change the font size of the text track to make it larger when playing in fullscreen mode
+ * and restore it to its normal size when not in fullscreen mode.
+ */
+vjs.TextTrack.prototype.adjustFontSize = function(){
+    if (this.player_.isFullScreen) {
+        // Scale the font by the same factor as increasing the video width to the full screen window width.
+        // Additionally, multiply that factor by 1.4, which is the default font size for
+        // the caption track (from the CSS)
+        this.el_.style.fontSize = screen.width / this.player_.width() * 1.4 * 100 + '%';
+    } else {
+        // Change the font size of the text track back to its original non-fullscreen size
+        this.el_.style.fontSize = '';
+    }
+};
+
+/**
+ * Create basic div to hold cue text
+ * @return {Element}
+ */
+vjs.TextTrack.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-' + this.kind_ + ' vjs-text-track'
+  });
+};
+
+/**
+ * Show: Mode Showing (2)
+ * Indicates that the text track is active. If no attempt has yet been made to obtain the track's cues, the user agent will perform such an attempt momentarily.
+ * The user agent is maintaining a list of which cues are active, and events are being fired accordingly.
+ * In addition, for text tracks whose kind is subtitles or captions, the cues are being displayed over the video as appropriate;
+ * for text tracks whose kind is descriptions, the user agent is making the cues available to the user in a non-visual fashion;
+ * and for text tracks whose kind is chapters, the user agent is making available to the user a mechanism by which the user can navigate to any point in the media resource by selecting a cue.
+ * The showing by default state is used in conjunction with the default attribute on track elements to indicate that the text track was enabled due to that attribute.
+ * This allows the user agent to override the state if a later track is discovered that is more appropriate per the user's preferences.
+ */
+vjs.TextTrack.prototype.show = function(){
+  this.activate();
+
+  this.mode_ = 2;
+
+  // Show element.
+  vjs.Component.prototype.show.call(this);
+};
+
+/**
+ * Hide: Mode Hidden (1)
+ * Indicates that the text track is active, but that the user agent is not actively displaying the cues.
+ * If no attempt has yet been made to obtain the track's cues, the user agent will perform such an attempt momentarily.
+ * The user agent is maintaining a list of which cues are active, and events are being fired accordingly.
+ */
+vjs.TextTrack.prototype.hide = function(){
+  // When hidden, cues are still triggered. Disable to stop triggering.
+  this.activate();
+
+  this.mode_ = 1;
+
+  // Hide element.
+  vjs.Component.prototype.hide.call(this);
+};
+
+/**
+ * Disable: Mode Off/Disable (0)
+ * Indicates that the text track is not active. Other than for the purposes of exposing the track in the DOM, the user agent is ignoring the text track.
+ * No cues are active, no events are fired, and the user agent will not attempt to obtain the track's cues.
+ */
+vjs.TextTrack.prototype.disable = function(){
+  // If showing, hide.
+  if (this.mode_ == 2) { this.hide(); }
+
+  // Stop triggering cues
+  this.deactivate();
+
+  // Switch Mode to Off
+  this.mode_ = 0;
+};
+
+/**
+ * Turn on cue tracking. Tracks that are showing OR hidden are active.
+ */
+vjs.TextTrack.prototype.activate = function(){
+  // Load text file if it hasn't been yet.
+  if (this.readyState_ === 0) { this.load(); }
+
+  // Only activate if not already active.
+  if (this.mode_ === 0) {
+    // Update current cue on timeupdate
+    // Using unique ID for bind function so other tracks don't remove listener
+    this.player_.on('timeupdate', vjs.bind(this, this.update, this.id_));
+
+    // Reset cue time on media end
+    this.player_.on('ended', vjs.bind(this, this.reset, this.id_));
+
+    // Add to display
+    if (this.kind_ === 'captions' || this.kind_ === 'subtitles') {
+      this.player_.getChild('textTrackDisplay').addChild(this);
+    }
+  }
+};
+
+/**
+ * Turn off cue tracking.
+ */
+vjs.TextTrack.prototype.deactivate = function(){
+  // Using unique ID for bind function so other tracks don't remove listener
+  this.player_.off('timeupdate', vjs.bind(this, this.update, this.id_));
+  this.player_.off('ended', vjs.bind(this, this.reset, this.id_));
+  this.reset(); // Reset
+
+  // Remove from display
+  this.player_.getChild('textTrackDisplay').removeChild(this);
+};
+
+// A readiness state
+// One of the following:
+//
+// Not loaded
+// Indicates that the text track is known to exist (e.g. it has been declared with a track element), but its cues have not been obtained.
+//
+// Loading
+// Indicates that the text track is loading and there have been no fatal errors encountered so far. Further cues might still be added to the track.
+//
+// Loaded
+// Indicates that the text track has been loaded with no fatal errors. No new cues will be added to the track except if the text track corresponds to a MutableTextTrack object.
+//
+// Failed to load
+// Indicates that the text track was enabled, but when the user agent attempted to obtain it, this failed in some way (e.g. URL could not be resolved, network error, unknown text track format). Some or all of the cues are likely missing and will not be obtained.
+vjs.TextTrack.prototype.load = function(){
+
+  // Only load if not loaded yet.
+  if (this.readyState_ === 0) {
+    this.readyState_ = 1;
+    vjs.get(this.src_, vjs.bind(this, this.parseCues), vjs.bind(this, this.onError));
+  }
+
+};
+
+vjs.TextTrack.prototype.onError = function(err){
+  this.error = err;
+  this.readyState_ = 3;
+  this.trigger('error');
+};
+
+// Parse the WebVTT text format for cue times.
+// TODO: Separate parser into own class so alternative timed text formats can be used. (TTML, DFXP)
+vjs.TextTrack.prototype.parseCues = function(srcContent) {
+  var cue, time, text,
+      lines = srcContent.split('\n'),
+      line = '', id;
+
+  for (var i=1, j=lines.length; i<j; i++) {
+    // Line 0 should be 'WEBVTT', so skipping i=0
+
+    line = vjs.trim(lines[i]); // Trim whitespace and linebreaks
+
+    if (line) { // Loop until a line with content
+
+      // First line could be an optional cue ID
+      // Check if line has the time separator
+      if (line.indexOf('-->') == -1) {
+        id = line;
+        // Advance to next line for timing.
+        line = vjs.trim(lines[++i]);
+      } else {
+        id = this.cues_.length;
+      }
+
+      // First line - Number
+      cue = {
+        id: id, // Cue Number
+        index: this.cues_.length // Position in Array
+      };
+
+      // Timing line
+      time = line.split(' --> ');
+      cue.startTime = this.parseCueTime(time[0]);
+      cue.endTime = this.parseCueTime(time[1]);
+
+      // Additional lines - Cue Text
+      text = [];
+
+      // Loop until a blank line or end of lines
+      // Assumeing trim('') returns false for blank lines
+      while (lines[++i] && (line = vjs.trim(lines[i]))) {
+        text.push(line);
+      }
+
+      cue.text = text.join('<br/>');
+
+      // Add this cue
+      this.cues_.push(cue);
+    }
+  }
+
+  this.readyState_ = 2;
+  this.trigger('loaded');
+};
+
+
+vjs.TextTrack.prototype.parseCueTime = function(timeText) {
+  var parts = timeText.split(':'),
+      time = 0,
+      hours, minutes, other, seconds, ms;
+
+  // Check if optional hours place is included
+  // 00:00:00.000 vs. 00:00.000
+  if (parts.length == 3) {
+    hours = parts[0];
+    minutes = parts[1];
+    other = parts[2];
+  } else {
+    hours = 0;
+    minutes = parts[0];
+    other = parts[1];
+  }
+
+  // Break other (seconds, milliseconds, and flags) by spaces
+  // TODO: Make additional cue layout settings work with flags
+  other = other.split(/\s+/);
+  // Remove seconds. Seconds is the first part before any spaces.
+  seconds = other.splice(0,1)[0];
+  // Could use either . or , for decimal
+  seconds = seconds.split(/\.|,/);
+  // Get milliseconds
+  ms = parseFloat(seconds[1]);
+  seconds = seconds[0];
+
+  // hours => seconds
+  time += parseFloat(hours) * 3600;
+  // minutes => seconds
+  time += parseFloat(minutes) * 60;
+  // Add seconds
+  time += parseFloat(seconds);
+  // Add milliseconds
+  if (ms) { time += ms/1000; }
+
+  return time;
+};
+
+// Update active cues whenever timeupdate events are triggered on the player.
+vjs.TextTrack.prototype.update = function(){
+  if (this.cues_.length > 0) {
+
+    // Get curent player time
+    var time = this.player_.currentTime();
+
+    // Check if the new time is outside the time box created by the the last update.
+    if (this.prevChange === undefined || time < this.prevChange || this.nextChange <= time) {
+      var cues = this.cues_,
+
+          // Create a new time box for this state.
+          newNextChange = this.player_.duration(), // Start at beginning of the timeline
+          newPrevChange = 0, // Start at end
+
+          reverse = false, // Set the direction of the loop through the cues. Optimized the cue check.
+          newCues = [], // Store new active cues.
+
+          // Store where in the loop the current active cues are, to provide a smart starting point for the next loop.
+          firstActiveIndex, lastActiveIndex,
+          cue, i; // Loop vars
+
+      // Check if time is going forwards or backwards (scrubbing/rewinding)
+      // If we know the direction we can optimize the starting position and direction of the loop through the cues array.
+      if (time >= this.nextChange || this.nextChange === undefined) { // NextChange should happen
+        // Forwards, so start at the index of the first active cue and loop forward
+        i = (this.firstActiveIndex !== undefined) ? this.firstActiveIndex : 0;
+      } else {
+        // Backwards, so start at the index of the last active cue and loop backward
+        reverse = true;
+        i = (this.lastActiveIndex !== undefined) ? this.lastActiveIndex : cues.length - 1;
+      }
+
+      while (true) { // Loop until broken
+        cue = cues[i];
+
+        // Cue ended at this point
+        if (cue.endTime <= time) {
+          newPrevChange = Math.max(newPrevChange, cue.endTime);
+
+          if (cue.active) {
+            cue.active = false;
+          }
+
+          // No earlier cues should have an active start time.
+          // Nevermind. Assume first cue could have a duration the same as the video.
+          // In that case we need to loop all the way back to the beginning.
+          // if (reverse && cue.startTime) { break; }
+
+        // Cue hasn't started
+        } else if (time < cue.startTime) {
+          newNextChange = Math.min(newNextChange, cue.startTime);
+
+          if (cue.active) {
+            cue.active = false;
+          }
+
+          // No later cues should have an active start time.
+          if (!reverse) { break; }
+
+        // Cue is current
+        } else {
+
+          if (reverse) {
+            // Add cue to front of array to keep in time order
+            newCues.splice(0,0,cue);
+
+            // If in reverse, the first current cue is our lastActiveCue
+            if (lastActiveIndex === undefined) { lastActiveIndex = i; }
+            firstActiveIndex = i;
+          } else {
+            // Add cue to end of array
+            newCues.push(cue);
+
+            // If forward, the first current cue is our firstActiveIndex
+            if (firstActiveIndex === undefined) { firstActiveIndex = i; }
+            lastActiveIndex = i;
+          }
+
+          newNextChange = Math.min(newNextChange, cue.endTime);
+          newPrevChange = Math.max(newPrevChange, cue.startTime);
+
+          cue.active = true;
+        }
+
+        if (reverse) {
+          // Reverse down the array of cues, break if at first
+          if (i === 0) { break; } else { i--; }
+        } else {
+          // Walk up the array fo cues, break if at last
+          if (i === cues.length - 1) { break; } else { i++; }
+        }
+
+      }
+
+      this.activeCues_ = newCues;
+      this.nextChange = newNextChange;
+      this.prevChange = newPrevChange;
+      this.firstActiveIndex = firstActiveIndex;
+      this.lastActiveIndex = lastActiveIndex;
+
+      this.updateDisplay();
+
+      this.trigger('cuechange');
+    }
+  }
+};
+
+// Add cue HTML to display
+vjs.TextTrack.prototype.updateDisplay = function(){
+  var cues = this.activeCues_,
+      html = '',
+      i=0,j=cues.length;
+
+  for (;i<j;i++) {
+    html += '<span class="vjs-tt-cue">'+cues[i].text+'</span>';
+  }
+
+  this.el_.innerHTML = html;
+};
+
+// Set all loop helper values back
+vjs.TextTrack.prototype.reset = function(){
+  this.nextChange = 0;
+  this.prevChange = this.player_.duration();
+  this.firstActiveIndex = 0;
+  this.lastActiveIndex = 0;
+};
+
+// Create specific track types
+/**
+ * The track component for managing the hiding and showing of captions
+ *
+ * @constructor
+ */
+vjs.CaptionsTrack = vjs.TextTrack.extend();
+vjs.CaptionsTrack.prototype.kind_ = 'captions';
+// Exporting here because Track creation requires the track kind
+// to be available on global object. e.g. new window['videojs'][Kind + 'Track']
+
+/**
+ * The track component for managing the hiding and showing of subtitles
+ *
+ * @constructor
+ */
+vjs.SubtitlesTrack = vjs.TextTrack.extend();
+vjs.SubtitlesTrack.prototype.kind_ = 'subtitles';
+
+/**
+ * The track component for managing the hiding and showing of chapters
+ *
+ * @constructor
+ */
+vjs.ChaptersTrack = vjs.TextTrack.extend();
+vjs.ChaptersTrack.prototype.kind_ = 'chapters';
+
+
+/* Text Track Display
+============================================================================= */
+// Global container for both subtitle and captions text. Simple div container.
+
+/**
+ * The component for displaying text track cues
+ *
+ * @constructor
+ */
+vjs.TextTrackDisplay = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.Component.call(this, player, options, ready);
+
+    // This used to be called during player init, but was causing an error
+    // if a track should show by default and the display hadn't loaded yet.
+    // Should probably be moved to an external track loader when we support
+    // tracks that don't need a display.
+    if (player.options_['tracks'] && player.options_['tracks'].length > 0) {
+      this.player_.addTextTracks(player.options_['tracks']);
+    }
+  }
+});
+
+vjs.TextTrackDisplay.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-text-track-display'
+  });
+};
+
+
+/**
+ * The specific menu item type for selecting a language within a text track kind
+ *
+ * @constructor
+ */
+vjs.TextTrackMenuItem = vjs.MenuItem.extend({
+  /** @constructor */
+  init: function(player, options){
+    var track = this.track = options['track'];
+
+    // Modify options for parent MenuItem class's init.
+    options['label'] = track.label();
+    options['selected'] = track.dflt();
+    vjs.MenuItem.call(this, player, options);
+
+    this.player_.on(track.kind() + 'trackchange', vjs.bind(this, this.update));
+  }
+});
+
+vjs.TextTrackMenuItem.prototype.onClick = function(){
+  vjs.MenuItem.prototype.onClick.call(this);
+  this.player_.showTextTrack(this.track.id_, this.track.kind());
+};
+
+vjs.TextTrackMenuItem.prototype.update = function(){
+  this.selected(this.track.mode() == 2);
+};
+
+/**
+ * A special menu item for turning of a specific type of text track
+ *
+ * @constructor
+ */
+vjs.OffTextTrackMenuItem = vjs.TextTrackMenuItem.extend({
+  /** @constructor */
+  init: function(player, options){
+    // Create pseudo track info
+    // Requires options['kind']
+    options['track'] = {
+      kind: function() { return options['kind']; },
+      player: player,
+      label: function(){ return options['kind'] + ' off'; },
+      dflt: function(){ return false; },
+      mode: function(){ return false; }
+    };
+    vjs.TextTrackMenuItem.call(this, player, options);
+    this.selected(true);
+  }
+});
+
+vjs.OffTextTrackMenuItem.prototype.onClick = function(){
+  vjs.TextTrackMenuItem.prototype.onClick.call(this);
+  this.player_.showTextTrack(this.track.id_, this.track.kind());
+};
+
+vjs.OffTextTrackMenuItem.prototype.update = function(){
+  var tracks = this.player_.textTracks(),
+      i=0, j=tracks.length, track,
+      off = true;
+
+  for (;i<j;i++) {
+    track = tracks[i];
+    if (track.kind() == this.track.kind() && track.mode() == 2) {
+      off = false;
+    }
+  }
+
+  this.selected(off);
+};
+
+/**
+ * The base class for buttons that toggle specific text track types (e.g. subtitles)
+ *
+ * @constructor
+ */
+vjs.TextTrackButton = vjs.MenuButton.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.MenuButton.call(this, player, options);
+
+    if (this.items.length <= 1) {
+      this.hide();
+    }
+  }
+});
+
+// vjs.TextTrackButton.prototype.buttonPressed = false;
+
+// vjs.TextTrackButton.prototype.createMenu = function(){
+//   var menu = new vjs.Menu(this.player_);
+
+//   // Add a title list item to the top
+//   // menu.el().appendChild(vjs.createEl('li', {
+//   //   className: 'vjs-menu-title',
+//   //   innerHTML: vjs.capitalize(this.kind_),
+//   //   tabindex: -1
+//   // }));
+
+//   this.items = this.createItems();
+
+//   // Add menu items to the menu
+//   for (var i = 0; i < this.items.length; i++) {
+//     menu.addItem(this.items[i]);
+//   }
+
+//   // Add list to element
+//   this.addChild(menu);
+
+//   return menu;
+// };
+
+// Create a menu item for each text track
+vjs.TextTrackButton.prototype.createItems = function(){
+  var items = [], track;
+
+  // Add an OFF menu item to turn all tracks off
+  items.push(new vjs.OffTextTrackMenuItem(this.player_, { 'kind': this.kind_ }));
+
+  for (var i = 0; i < this.player_.textTracks().length; i++) {
+    track = this.player_.textTracks()[i];
+    if (track.kind() === this.kind_) {
+      items.push(new vjs.TextTrackMenuItem(this.player_, {
+        'track': track
+      }));
+    }
+  }
+
+  return items;
+};
+
+/**
+ * The button component for toggling and selecting captions
+ *
+ * @constructor
+ */
+vjs.CaptionsButton = vjs.TextTrackButton.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.TextTrackButton.call(this, player, options, ready);
+    this.el_.setAttribute('aria-label','Captions Menu');
+  }
+});
+vjs.CaptionsButton.prototype.kind_ = 'captions';
+vjs.CaptionsButton.prototype.buttonText = 'Captions';
+vjs.CaptionsButton.prototype.className = 'vjs-captions-button';
+
+/**
+ * The button component for toggling and selecting subtitles
+ *
+ * @constructor
+ */
+vjs.SubtitlesButton = vjs.TextTrackButton.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.TextTrackButton.call(this, player, options, ready);
+    this.el_.setAttribute('aria-label','Subtitles Menu');
+  }
+});
+vjs.SubtitlesButton.prototype.kind_ = 'subtitles';
+vjs.SubtitlesButton.prototype.buttonText = 'Subtitles';
+vjs.SubtitlesButton.prototype.className = 'vjs-subtitles-button';
+
+// Chapters act much differently than other text tracks
+// Cues are navigation vs. other tracks of alternative languages
+/**
+ * The button component for toggling and selecting chapters
+ *
+ * @constructor
+ */
+vjs.ChaptersButton = vjs.TextTrackButton.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.TextTrackButton.call(this, player, options, ready);
+    this.el_.setAttribute('aria-label','Chapters Menu');
+  }
+});
+vjs.ChaptersButton.prototype.kind_ = 'chapters';
+vjs.ChaptersButton.prototype.buttonText = 'Chapters';
+vjs.ChaptersButton.prototype.className = 'vjs-chapters-button';
+
+// Create a menu item for each text track
+vjs.ChaptersButton.prototype.createItems = function(){
+  var items = [], track;
+
+  for (var i = 0; i < this.player_.textTracks().length; i++) {
+    track = this.player_.textTracks()[i];
+    if (track.kind() === this.kind_) {
+      items.push(new vjs.TextTrackMenuItem(this.player_, {
+        'track': track
+      }));
+    }
+  }
+
+  return items;
+};
+
+vjs.ChaptersButton.prototype.createMenu = function(){
+  var tracks = this.player_.textTracks(),
+      i = 0,
+      j = tracks.length,
+      track, chaptersTrack,
+      items = this.items = [];
+
+  for (;i<j;i++) {
+    track = tracks[i];
+    if (track.kind() == this.kind_ && track.dflt()) {
+      if (track.readyState() < 2) {
+        this.chaptersTrack = track;
+        track.on('loaded', vjs.bind(this, this.createMenu));
+        return;
+      } else {
+        chaptersTrack = track;
+        break;
+      }
+    }
+  }
+
+  var menu = this.menu = new vjs.Menu(this.player_);
+
+  menu.el_.appendChild(vjs.createEl('li', {
+    className: 'vjs-menu-title',
+    innerHTML: vjs.capitalize(this.kind_),
+    tabindex: -1
+  }));
+
+  if (chaptersTrack) {
+    var cues = chaptersTrack.cues_, cue, mi;
+    i = 0;
+    j = cues.length;
+
+    for (;i<j;i++) {
+      cue = cues[i];
+
+      mi = new vjs.ChaptersTrackMenuItem(this.player_, {
+        'track': chaptersTrack,
+        'cue': cue
+      });
+
+      items.push(mi);
+
+      menu.addChild(mi);
+    }
+  }
+
+  if (this.items.length > 0) {
+    this.show();
+  }
+
+  return menu;
+};
+
+
+/**
+ * @constructor
+ */
+vjs.ChaptersTrackMenuItem = vjs.MenuItem.extend({
+  /** @constructor */
+  init: function(player, options){
+    var track = this.track = options['track'],
+        cue = this.cue = options['cue'],
+        currentTime = player.currentTime();
+
+    // Modify options for parent MenuItem class's init.
+    options['label'] = cue.text;
+    options['selected'] = (cue.startTime <= currentTime && currentTime < cue.endTime);
+    vjs.MenuItem.call(this, player, options);
+
+    track.on('cuechange', vjs.bind(this, this.update));
+  }
+});
+
+vjs.ChaptersTrackMenuItem.prototype.onClick = function(){
+  vjs.MenuItem.prototype.onClick.call(this);
+  this.player_.currentTime(this.cue.startTime);
+  this.update(this.cue.startTime);
+};
+
+vjs.ChaptersTrackMenuItem.prototype.update = function(){
+  var cue = this.cue,
+      currentTime = this.player_.currentTime();
+
+  // vjs.log(currentTime, cue.startTime);
+  this.selected(cue.startTime <= currentTime && currentTime < cue.endTime);
+};
+
+// Add Buttons to controlBar
+vjs.obj.merge(vjs.ControlBar.prototype.options_['children'], {
+  'subtitlesButton': {},
+  'captionsButton': {},
+  'chaptersButton': {}
+});
+
+// vjs.Cue = vjs.Component.extend({
+//   /** @constructor */
+//   init: function(player, options){
+//     vjs.Component.call(this, player, options);
+//   }
+// });
+/**
+ * @fileoverview Add JSON support
+ * @suppress {undefinedVars}
+ * (Compiler doesn't like JSON not being declared)
+ */
+
+/**
+ * Javascript JSON implementation
+ * (Parse Method Only)
+ * https://github.com/douglascrockford/JSON-js/blob/master/json2.js
+ * Only using for parse method when parsing data-setup attribute JSON.
+ * @suppress {undefinedVars}
+ * @namespace
+ * @private
+ */
+vjs.JSON;
+
+if (typeof window.JSON !== 'undefined' && window.JSON.parse === 'function') {
+  vjs.JSON = window.JSON;
+
+} else {
+  vjs.JSON = {};
+
+  var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+
+  /**
+   * parse the json
+   *
+   * @memberof vjs.JSON
+   * @return {Object|Array} The parsed JSON
+   */
+  vjs.JSON.parse = function (text, reviver) {
+      var j;
+
+      function walk(holder, key) {
+          var k, v, value = holder[key];
+          if (value && typeof value === 'object') {
+              for (k in value) {
+                  if (Object.prototype.hasOwnProperty.call(value, k)) {
+                      v = walk(value, k);
+                      if (v !== undefined) {
+                          value[k] = v;
+                      } else {
+                          delete value[k];
+                      }
+                  }
+              }
+          }
+          return reviver.call(holder, key, value);
+      }
+      text = String(text);
+      cx.lastIndex = 0;
+      if (cx.test(text)) {
+          text = text.replace(cx, function (a) {
+              return '\\u' +
+                  ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+          });
+      }
+
+      if (/^[\],:{}\s]*$/
+              .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
+                  .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
+                  .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+
+          j = eval('(' + text + ')');
+
+          return typeof reviver === 'function' ?
+              walk({'': j}, '') : j;
+      }
+
+      throw new SyntaxError('JSON.parse(): invalid or malformed JSON data');
+  };
+}
+/**
+ * @fileoverview Functions for automatically setting up a player
+ * based on the data-setup attribute of the video tag
+ */
+
+// Automatically set up any tags that have a data-setup attribute
+vjs.autoSetup = function(){
+  var options, vid, player,
+      vids = document.getElementsByTagName('video');
+
+  // Check if any media elements exist
+  if (vids && vids.length > 0) {
+
+    for (var i=0,j=vids.length; i<j; i++) {
+      vid = vids[i];
+
+      // Check if element exists, has getAttribute func.
+      // IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.
+      if (vid && vid.getAttribute) {
+
+        // Make sure this player hasn't already been set up.
+        if (vid['player'] === undefined) {
+          options = vid.getAttribute('data-setup');
+
+          // Check if data-setup attr exists.
+          // We only auto-setup if they've added the data-setup attr.
+          if (options !== null) {
+
+            // Parse options JSON
+            // If empty string, make it a parsable json object.
+            options = vjs.JSON.parse(options || '{}');
+
+            // Create new video.js instance.
+            player = videojs(vid, options);
+          }
+        }
+
+      // If getAttribute isn't defined, we need to wait for the DOM.
+      } else {
+        vjs.autoSetupTimeout(1);
+        break;
+      }
+    }
+
+  // No videos were found, so keep looping unless page is finisehd loading.
+  } else if (!vjs.windowLoaded) {
+    vjs.autoSetupTimeout(1);
+  }
+};
+
+// Pause to let the DOM keep processing
+vjs.autoSetupTimeout = function(wait){
+  setTimeout(vjs.autoSetup, wait);
+};
+
+if (document.readyState === 'complete') {
+  vjs.windowLoaded = true;
+} else {
+  vjs.one(window, 'load', function(){
+    vjs.windowLoaded = true;
+  });
+}
+
+// Run Auto-load players
+// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)
+vjs.autoSetupTimeout(1);
+/**
+ * the method for registering a video.js plugin
+ *
+ * @param  {String} name The name of the plugin
+ * @param  {Function} init The function that is run when the player inits
+ */
+vjs.plugin = function(name, init){
+  vjs.Player.prototype[name] = init;
+};
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video.js
new file mode 100644
index 0000000..01e5bc8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/video-js/video.js
@@ -0,0 +1,129 @@
+/*! Video.js v4.3.0 Copyright 2013 Brightcove, Inc. https://github.com/videojs/video.js/blob/master/LICENSE */ (function() {var b=void 0,f=!0,h=null,l=!1;function m(){return function(){}}function p(a){return function(){return this[a]}}function s(a){return function(){return a}}var t;document.createElement("video");document.createElement("audio");document.createElement("track");function u(a,c,d){if("string"===typeof a){0===a.indexOf("#")&&(a=a.slice(1));if(u.xa[a])return u.xa[a];a=u.w(a)}if(!a||!a.nodeName)throw new TypeError("The element or ID supplied is not valid. (videojs)");return a.player||new u.s(a,c,d)}var v=u;
+window.Td=window.Ud=u;u.Tb="4.3";u.Fc="https:"==document.location.protocol?"https://":"http://";u.options={techOrder:["html5","flash"],html5:{},flash:{},width:300,height:150,defaultVolume:0,children:{mediaLoader:{},posterImage:{},textTrackDisplay:{},loadingSpinner:{},bigPlayButton:{},controlBar:{}},notSupportedMessage:'Sorry, no compatible source and playback technology were found for this video. Try using another browser like <a href="http://bit.ly/ccMUEC">Chrome</a> or download the latest <a href="http://adobe.ly/mwfN1">Adobe Flash Player</a>.'};
+"GENERATED_CDN_VSN"!==u.Tb&&(v.options.flash.swf=u.Fc+"vjs.zencdn.net/"+u.Tb+"/video-js.swf");u.xa={};u.la=u.CoreObject=m();u.la.extend=function(a){var c,d;a=a||{};c=a.init||a.i||this.prototype.init||this.prototype.i||m();d=function(){c.apply(this,arguments)};d.prototype=u.k.create(this.prototype);d.prototype.constructor=d;d.extend=u.la.extend;d.create=u.la.create;for(var e in a)a.hasOwnProperty(e)&&(d.prototype[e]=a[e]);return d};
+u.la.create=function(){var a=u.k.create(this.prototype);this.apply(a,arguments);return a};u.d=function(a,c,d){var e=u.getData(a);e.z||(e.z={});e.z[c]||(e.z[c]=[]);d.t||(d.t=u.t++);e.z[c].push(d);e.W||(e.disabled=l,e.W=function(c){if(!e.disabled){c=u.kc(c);var d=e.z[c.type];if(d)for(var d=d.slice(0),k=0,q=d.length;k<q&&!c.pc();k++)d[k].call(a,c)}});1==e.z[c].length&&(document.addEventListener?a.addEventListener(c,e.W,l):document.attachEvent&&a.attachEvent("on"+c,e.W))};
+u.o=function(a,c,d){if(u.oc(a)){var e=u.getData(a);if(e.z)if(c){var g=e.z[c];if(g){if(d){if(d.t)for(e=0;e<g.length;e++)g[e].t===d.t&&g.splice(e--,1)}else e.z[c]=[];u.gc(a,c)}}else for(g in e.z)c=g,e.z[c]=[],u.gc(a,c)}};u.gc=function(a,c){var d=u.getData(a);0===d.z[c].length&&(delete d.z[c],document.removeEventListener?a.removeEventListener(c,d.W,l):document.detachEvent&&a.detachEvent("on"+c,d.W));u.Bb(d.z)&&(delete d.z,delete d.W,delete d.disabled);u.Bb(d)&&u.vc(a)};
+u.kc=function(a){function c(){return f}function d(){return l}if(!a||!a.Cb){var e=a||window.event;a={};for(var g in e)"layerX"!==g&&"layerY"!==g&&(a[g]=e[g]);a.target||(a.target=a.srcElement||document);a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;a.preventDefault=function(){e.preventDefault&&e.preventDefault();a.returnValue=l;a.Ab=c};a.Ab=d;a.stopPropagation=function(){e.stopPropagation&&e.stopPropagation();a.cancelBubble=f;a.Cb=c};a.Cb=d;a.stopImmediatePropagation=function(){e.stopImmediatePropagation&&
+e.stopImmediatePropagation();a.pc=c;a.stopPropagation()};a.pc=d;if(a.clientX!=h){g=document.documentElement;var j=document.body;a.pageX=a.clientX+(g&&g.scrollLeft||j&&j.scrollLeft||0)-(g&&g.clientLeft||j&&j.clientLeft||0);a.pageY=a.clientY+(g&&g.scrollTop||j&&j.scrollTop||0)-(g&&g.clientTop||j&&j.clientTop||0)}a.which=a.charCode||a.keyCode;a.button!=h&&(a.button=a.button&1?0:a.button&4?1:a.button&2?2:0)}return a};
+u.j=function(a,c){var d=u.oc(a)?u.getData(a):{},e=a.parentNode||a.ownerDocument;"string"===typeof c&&(c={type:c,target:a});c=u.kc(c);d.W&&d.W.call(a,c);if(e&&!c.Cb()&&c.bubbles!==l)u.j(e,c);else if(!e&&!c.Ab()&&(d=u.getData(c.target),c.target[c.type])){d.disabled=f;if("function"===typeof c.target[c.type])c.target[c.type]();d.disabled=l}return!c.Ab()};u.U=function(a,c,d){function e(){u.o(a,c,e);d.apply(this,arguments)}e.t=d.t=d.t||u.t++;u.d(a,c,e)};var w=Object.prototype.hasOwnProperty;
+u.e=function(a,c){var d,e;d=document.createElement(a||"div");for(e in c)w.call(c,e)&&(-1!==e.indexOf("aria-")||"role"==e?d.setAttribute(e,c[e]):d[e]=c[e]);return d};u.$=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};u.k={};u.k.create=Object.create||function(a){function c(){}c.prototype=a;return new c};u.k.ua=function(a,c,d){for(var e in a)w.call(a,e)&&c.call(d||this,e,a[e])};u.k.B=function(a,c){if(!c)return a;for(var d in c)w.call(c,d)&&(a[d]=c[d]);return a};
+u.k.ic=function(a,c){var d,e,g;a=u.k.copy(a);for(d in c)w.call(c,d)&&(e=a[d],g=c[d],a[d]=u.k.qc(e)&&u.k.qc(g)?u.k.ic(e,g):c[d]);return a};u.k.copy=function(a){return u.k.B({},a)};u.k.qc=function(a){return!!a&&"object"===typeof a&&"[object Object]"===a.toString()&&a.constructor===Object};u.bind=function(a,c,d){function e(){return c.apply(a,arguments)}c.t||(c.t=u.t++);e.t=d?d+"_"+c.t:c.t;return e};u.ra={};u.t=1;u.expando="vdata"+(new Date).getTime();
+u.getData=function(a){var c=a[u.expando];c||(c=a[u.expando]=u.t++,u.ra[c]={});return u.ra[c]};u.oc=function(a){a=a[u.expando];return!(!a||u.Bb(u.ra[a]))};u.vc=function(a){var c=a[u.expando];if(c){delete u.ra[c];try{delete a[u.expando]}catch(d){a.removeAttribute?a.removeAttribute(u.expando):a[u.expando]=h}}};u.Bb=function(a){for(var c in a)if(a[c]!==h)return l;return f};u.n=function(a,c){-1==(" "+a.className+" ").indexOf(" "+c+" ")&&(a.className=""===a.className?c:a.className+" "+c)};
+u.u=function(a,c){var d,e;if(-1!=a.className.indexOf(c)){d=a.className.split(" ");for(e=d.length-1;0<=e;e--)d[e]===c&&d.splice(e,1);a.className=d.join(" ")}};u.na=u.e("video");u.F=navigator.userAgent;u.Mc=/iPhone/i.test(u.F);u.Lc=/iPad/i.test(u.F);u.Nc=/iPod/i.test(u.F);u.Kc=u.Mc||u.Lc||u.Nc;var aa=u,x;var y=u.F.match(/OS (\d+)_/i);x=y&&y[1]?y[1]:b;aa.Fd=x;u.Ic=/Android/i.test(u.F);var ba=u,z;var A=u.F.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),B,C;
+A?(B=A[1]&&parseFloat(A[1]),C=A[2]&&parseFloat(A[2]),z=B&&C?parseFloat(A[1]+"."+A[2]):B?B:h):z=h;ba.Gc=z;u.Oc=u.Ic&&/webkit/i.test(u.F)&&2.3>u.Gc;u.Jc=/Firefox/i.test(u.F);u.Gd=/Chrome/i.test(u.F);u.ac=!!("ontouchstart"in window||window.Hc&&document instanceof window.Hc);
+u.xb=function(a){var c,d,e,g;c={};if(a&&a.attributes&&0<a.attributes.length){d=a.attributes;for(var j=d.length-1;0<=j;j--){e=d[j].name;g=d[j].value;if("boolean"===typeof a[e]||-1!==",autoplay,controls,loop,muted,default,".indexOf(","+e+","))g=g!==h?f:l;c[e]=g}}return c};
+u.Kd=function(a,c){var d="";document.defaultView&&document.defaultView.getComputedStyle?d=document.defaultView.getComputedStyle(a,"").getPropertyValue(c):a.currentStyle&&(d=a["client"+c.substr(0,1).toUpperCase()+c.substr(1)]+"px");return d};u.zb=function(a,c){c.firstChild?c.insertBefore(a,c.firstChild):c.appendChild(a)};u.Pb={};u.w=function(a){0===a.indexOf("#")&&(a=a.slice(1));return document.getElementById(a)};
+u.La=function(a,c){c=c||a;var d=Math.floor(a%60),e=Math.floor(a/60%60),g=Math.floor(a/3600),j=Math.floor(c/60%60),k=Math.floor(c/3600);if(isNaN(a)||Infinity===a)g=e=d="-";g=0<g||0<k?g+":":"";return g+(((g||10<=j)&&10>e?"0"+e:e)+":")+(10>d?"0"+d:d)};u.Tc=function(){document.body.focus();document.onselectstart=s(l)};u.Bd=function(){document.onselectstart=s(f)};u.trim=function(a){return(a+"").replace(/^\s+|\s+$/g,"")};u.round=function(a,c){c||(c=0);return Math.round(a*Math.pow(10,c))/Math.pow(10,c)};
+u.tb=function(a,c){return{length:1,start:function(){return a},end:function(){return c}}};
+u.get=function(a,c,d){var e,g;"undefined"===typeof XMLHttpRequest&&(window.XMLHttpRequest=function(){try{return new window.ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(a){}try{return new window.ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(c){}try{return new window.ActiveXObject("Msxml2.XMLHTTP")}catch(d){}throw Error("This browser does not support XMLHttpRequest.");});g=new XMLHttpRequest;try{g.open("GET",a)}catch(j){d(j)}e=0===a.indexOf("file:")||0===window.location.href.indexOf("file:")&&-1===a.indexOf("http");
+g.onreadystatechange=function(){4===g.readyState&&(200===g.status||e&&0===g.status?c(g.responseText):d&&d())};try{g.send()}catch(k){d&&d(k)}};u.td=function(a){try{var c=window.localStorage||l;c&&(c.volume=a)}catch(d){22==d.code||1014==d.code?u.log("LocalStorage Full (VideoJS)",d):18==d.code?u.log("LocalStorage not allowed (VideoJS)",d):u.log("LocalStorage Error (VideoJS)",d)}};u.mc=function(a){a.match(/^https?:\/\//)||(a=u.e("div",{innerHTML:'<a href="'+a+'">x</a>'}).firstChild.href);return a};
+u.log=function(){u.log.history=u.log.history||[];u.log.history.push(arguments);window.console&&window.console.log(Array.prototype.slice.call(arguments))};u.ad=function(a){var c,d;a.getBoundingClientRect&&a.parentNode&&(c=a.getBoundingClientRect());if(!c)return{left:0,top:0};a=document.documentElement;d=document.body;return{left:c.left+(window.pageXOffset||d.scrollLeft)-(a.clientLeft||d.clientLeft||0),top:c.top+(window.pageYOffset||d.scrollTop)-(a.clientTop||d.clientTop||0)}};
+u.c=u.la.extend({i:function(a,c,d){this.b=a;this.g=u.k.copy(this.g);c=this.options(c);this.Q=c.id||(c.el&&c.el.id?c.el.id:a.id()+"_component_"+u.t++);this.gd=c.name||h;this.a=c.el||this.e();this.G=[];this.qb={};this.V={};if((a=this.g)&&a.children){var e=this;u.k.ua(a.children,function(a,c){c!==l&&!c.loadEvent&&(e[a]=e.Z(a,c))})}this.L(d)}});t=u.c.prototype;
+t.D=function(){this.j("dispose");if(this.G)for(var a=this.G.length-1;0<=a;a--)this.G[a].D&&this.G[a].D();this.V=this.qb=this.G=h;this.o();this.a.parentNode&&this.a.parentNode.removeChild(this.a);u.vc(this.a);this.a=h};t.b=f;t.K=p("b");t.options=function(a){return a===b?this.g:this.g=u.k.ic(this.g,a)};t.e=function(a,c){return u.e(a,c)};t.w=p("a");t.id=p("Q");t.name=p("gd");t.children=p("G");
+t.Z=function(a,c){var d,e;"string"===typeof a?(e=a,c=c||{},d=c.componentClass||u.$(e),c.name=e,d=new window.videojs[d](this.b||this,c)):d=a;this.G.push(d);"function"===typeof d.id&&(this.qb[d.id()]=d);(e=e||d.name&&d.name())&&(this.V[e]=d);"function"===typeof d.el&&d.el()&&(this.sa||this.a).appendChild(d.el());return d};
+t.removeChild=function(a){"string"===typeof a&&(a=this.V[a]);if(a&&this.G){for(var c=l,d=this.G.length-1;0<=d;d--)if(this.G[d]===a){c=f;this.G.splice(d,1);break}c&&(this.qb[a.id]=h,this.V[a.name]=h,(c=a.w())&&c.parentNode===(this.sa||this.a)&&(this.sa||this.a).removeChild(a.w()))}};t.T=s("");t.d=function(a,c){u.d(this.a,a,u.bind(this,c));return this};t.o=function(a,c){u.o(this.a,a,c);return this};t.U=function(a,c){u.U(this.a,a,u.bind(this,c));return this};t.j=function(a,c){u.j(this.a,a,c);return this};
+t.L=function(a){a&&(this.aa?a.call(this):(this.Sa===b&&(this.Sa=[]),this.Sa.push(a)));return this};t.Ua=function(){this.aa=f;var a=this.Sa;if(a&&0<a.length){for(var c=0,d=a.length;c<d;c++)a[c].call(this);this.Sa=[];this.j("ready")}};t.n=function(a){u.n(this.a,a);return this};t.u=function(a){u.u(this.a,a);return this};t.show=function(){this.a.style.display="block";return this};t.C=function(){this.a.style.display="none";return this};function D(a){a.u("vjs-lock-showing")}
+t.disable=function(){this.C();this.show=m()};t.width=function(a,c){return E(this,"width",a,c)};t.height=function(a,c){return E(this,"height",a,c)};t.Xc=function(a,c){return this.width(a,f).height(c)};function E(a,c,d,e){if(d!==b)return a.a.style[c]=-1!==(""+d).indexOf("%")||-1!==(""+d).indexOf("px")?d:"auto"===d?"":d+"px",e||a.j("resize"),a;if(!a.a)return 0;d=a.a.style[c];e=d.indexOf("px");return-1!==e?parseInt(d.slice(0,e),10):parseInt(a.a["offset"+u.$(c)],10)}
+u.q=u.c.extend({i:function(a,c){u.c.call(this,a,c);var d=l;this.d("touchstart",function(a){a.preventDefault();d=f});this.d("touchmove",function(){d=l});var e=this;this.d("touchend",function(a){d&&e.p(a);a.preventDefault()});this.d("click",this.p);this.d("focus",this.Oa);this.d("blur",this.Na)}});t=u.q.prototype;
+t.e=function(a,c){c=u.k.B({className:this.T(),innerHTML:'<div class="vjs-control-content"><span class="vjs-control-text">'+(this.qa||"Need Text")+"</span></div>",qd:"button","aria-live":"polite",tabIndex:0},c);return u.c.prototype.e.call(this,a,c)};t.T=function(){return"vjs-control "+u.c.prototype.T.call(this)};t.p=m();t.Oa=function(){u.d(document,"keyup",u.bind(this,this.ba))};t.ba=function(a){if(32==a.which||13==a.which)a.preventDefault(),this.p()};
+t.Na=function(){u.o(document,"keyup",u.bind(this,this.ba))};u.O=u.c.extend({i:function(a,c){u.c.call(this,a,c);this.Sc=this.V[this.g.barName];this.handle=this.V[this.g.handleName];a.d(this.tc,u.bind(this,this.update));this.d("mousedown",this.Pa);this.d("touchstart",this.Pa);this.d("focus",this.Oa);this.d("blur",this.Na);this.d("click",this.p);this.b.d("controlsvisible",u.bind(this,this.update));a.L(u.bind(this,this.update));this.P={}}});t=u.O.prototype;
+t.e=function(a,c){c=c||{};c.className+=" vjs-slider";c=u.k.B({qd:"slider","aria-valuenow":0,"aria-valuemin":0,"aria-valuemax":100,tabIndex:0},c);return u.c.prototype.e.call(this,a,c)};t.Pa=function(a){a.preventDefault();u.Tc();this.P.move=u.bind(this,this.Hb);this.P.end=u.bind(this,this.Ib);u.d(document,"mousemove",this.P.move);u.d(document,"mouseup",this.P.end);u.d(document,"touchmove",this.P.move);u.d(document,"touchend",this.P.end);this.Hb(a)};
+t.Ib=function(){u.Bd();u.o(document,"mousemove",this.P.move,l);u.o(document,"mouseup",this.P.end,l);u.o(document,"touchmove",this.P.move,l);u.o(document,"touchend",this.P.end,l);this.update()};t.update=function(){if(this.a){var a,c=this.yb(),d=this.handle,e=this.Sc;isNaN(c)&&(c=0);a=c;if(d){a=this.a.offsetWidth;var g=d.w().offsetWidth;a=g?g/a:0;c*=1-a;a=c+a/2;d.w().style.left=u.round(100*c,2)+"%"}e.w().style.width=u.round(100*a,2)+"%"}};
+function F(a,c){var d,e,g,j;d=a.a;e=u.ad(d);j=g=d.offsetWidth;d=a.handle;if(a.g.Cd)return j=e.top,e=c.changedTouches?c.changedTouches[0].pageY:c.pageY,d&&(d=d.w().offsetHeight,j+=d/2,g-=d),Math.max(0,Math.min(1,(j-e+g)/g));g=e.left;e=c.changedTouches?c.changedTouches[0].pageX:c.pageX;d&&(d=d.w().offsetWidth,g+=d/2,j-=d);return Math.max(0,Math.min(1,(e-g)/j))}t.Oa=function(){u.d(document,"keyup",u.bind(this,this.ba))};
+t.ba=function(a){37==a.which?(a.preventDefault(),this.yc()):39==a.which&&(a.preventDefault(),this.zc())};t.Na=function(){u.o(document,"keyup",u.bind(this,this.ba))};t.p=function(a){a.stopImmediatePropagation();a.preventDefault()};u.ea=u.c.extend();u.ea.prototype.defaultValue=0;u.ea.prototype.e=function(a,c){c=c||{};c.className+=" vjs-slider-handle";c=u.k.B({innerHTML:'<span class="vjs-control-text">'+this.defaultValue+"</span>"},c);return u.c.prototype.e.call(this,"div",c)};u.ma=u.c.extend();
+function ca(a,c){a.Z(c);c.d("click",u.bind(a,function(){D(this)}))}u.ma.prototype.e=function(){var a=this.options().Vc||"ul";this.sa=u.e(a,{className:"vjs-menu-content"});a=u.c.prototype.e.call(this,"div",{append:this.sa,className:"vjs-menu"});a.appendChild(this.sa);u.d(a,"click",function(a){a.preventDefault();a.stopImmediatePropagation()});return a};u.N=u.q.extend({i:function(a,c){u.q.call(this,a,c);this.selected(c.selected)}});
+u.N.prototype.e=function(a,c){return u.q.prototype.e.call(this,"li",u.k.B({className:"vjs-menu-item",innerHTML:this.g.label},c))};u.N.prototype.p=function(){this.selected(f)};u.N.prototype.selected=function(a){a?(this.n("vjs-selected"),this.a.setAttribute("aria-selected",f)):(this.u("vjs-selected"),this.a.setAttribute("aria-selected",l))};
+u.R=u.q.extend({i:function(a,c){u.q.call(this,a,c);this.wa=this.Ka();this.Z(this.wa);this.I&&0===this.I.length&&this.C();this.d("keyup",this.ba);this.a.setAttribute("aria-haspopup",f);this.a.setAttribute("role","button")}});t=u.R.prototype;t.pa=l;t.Ka=function(){var a=new u.ma(this.b);this.options().title&&a.w().appendChild(u.e("li",{className:"vjs-menu-title",innerHTML:u.$(this.A),zd:-1}));if(this.I=this.createItems())for(var c=0;c<this.I.length;c++)ca(a,this.I[c]);return a};t.ta=m();
+t.T=function(){return this.className+" vjs-menu-button "+u.q.prototype.T.call(this)};t.Oa=m();t.Na=m();t.p=function(){this.U("mouseout",u.bind(this,function(){D(this.wa);this.a.blur()}));this.pa?G(this):H(this)};t.ba=function(a){a.preventDefault();32==a.which||13==a.which?this.pa?G(this):H(this):27==a.which&&this.pa&&G(this)};function H(a){a.pa=f;a.wa.n("vjs-lock-showing");a.a.setAttribute("aria-pressed",f);a.I&&0<a.I.length&&a.I[0].w().focus()}
+function G(a){a.pa=l;D(a.wa);a.a.setAttribute("aria-pressed",l)}
+u.s=u.c.extend({i:function(a,c,d){this.M=a;c=u.k.B(da(a),c);this.v={};this.uc=c.poster;this.sb=c.controls;a.controls=l;u.c.call(this,this,c,d);this.controls()?this.n("vjs-controls-enabled"):this.n("vjs-controls-disabled");this.U("play",function(a){u.j(this.a,{type:"firstplay",target:this.a})||(a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation())});this.d("ended",this.hd);this.d("play",this.Kb);this.d("firstplay",this.jd);this.d("pause",this.Jb);this.d("progress",this.ld);this.d("durationchange",
+this.sc);this.d("error",this.Gb);this.d("fullscreenchange",this.kd);u.xa[this.Q]=this;c.plugins&&u.k.ua(c.plugins,function(a,c){this[a](c)},this);var e,g,j,k;e=this.Mb;a=function(){e();clearInterval(g);g=setInterval(u.bind(this,e),250)};c=function(){e();clearInterval(g)};this.d("mousedown",a);this.d("mousemove",e);this.d("mouseup",c);this.d("keydown",e);this.d("keyup",e);this.d("touchstart",a);this.d("touchmove",e);this.d("touchend",c);this.d("touchcancel",c);j=setInterval(u.bind(this,function(){this.ka&&
+(this.ka=l,this.ja(f),clearTimeout(k),k=setTimeout(u.bind(this,function(){this.ka||this.ja(l)}),2E3))}),250);this.d("dispose",function(){clearInterval(j);clearTimeout(k)})}});t=u.s.prototype;t.g=u.options;t.D=function(){this.j("dispose");this.o("dispose");u.xa[this.Q]=h;this.M&&this.M.player&&(this.M.player=h);this.a&&this.a.player&&(this.a.player=h);clearInterval(this.Ra);this.za();this.h&&this.h.D();u.c.prototype.D.call(this)};
+function da(a){var c={sources:[],tracks:[]};u.k.B(c,u.xb(a));if(a.hasChildNodes()){var d,e,g,j;a=a.childNodes;g=0;for(j=a.length;g<j;g++)d=a[g],e=d.nodeName.toLowerCase(),"source"===e?c.sources.push(u.xb(d)):"track"===e&&c.tracks.push(u.xb(d))}return c}
+t.e=function(){var a=this.a=u.c.prototype.e.call(this,"div"),c=this.M;c.removeAttribute("width");c.removeAttribute("height");if(c.hasChildNodes()){var d,e,g,j,k;d=c.childNodes;e=d.length;for(k=[];e--;)g=d[e],j=g.nodeName.toLowerCase(),"track"===j&&k.push(g);for(d=0;d<k.length;d++)c.removeChild(k[d])}c.id=c.id||"vjs_video_"+u.t++;a.id=c.id;a.className=c.className;c.id+="_html5_api";c.className="vjs-tech";c.player=a.player=this;this.n("vjs-paused");this.width(this.g.width,f);this.height(this.g.height,
+f);c.parentNode&&c.parentNode.insertBefore(a,c);u.zb(c,a);return a};
+function I(a,c,d){a.h?(a.aa=l,a.h.D(),a.Eb&&(a.Eb=l,clearInterval(a.Ra)),a.Fb&&J(a),a.h=l):"Html5"!==c&&a.M&&(u.l.jc(a.M),a.M=h);a.ia=c;a.aa=l;var e=u.k.B({source:d,parentEl:a.a},a.g[c.toLowerCase()]);d&&(d.src==a.v.src&&0<a.v.currentTime&&(e.startTime=a.v.currentTime),a.v.src=d.src);a.h=new window.videojs[c](a,e);a.h.L(function(){this.b.Ua();if(!this.m.progressEvents){var a=this.b;a.Eb=f;a.Ra=setInterval(u.bind(a,function(){this.v.lb<this.buffered().end(0)?this.j("progress"):1==this.Ja()&&(clearInterval(this.Ra),
+this.j("progress"))}),500);a.h.U("progress",function(){this.m.progressEvents=f;var a=this.b;a.Eb=l;clearInterval(a.Ra)})}this.m.timeupdateEvents||(a=this.b,a.Fb=f,a.d("play",a.Cc),a.d("pause",a.za),a.h.U("timeupdate",function(){this.m.timeupdateEvents=f;J(this.b)}))})}function J(a){a.Fb=l;a.za();a.o("play",a.Cc);a.o("pause",a.za)}t.Cc=function(){this.hc&&this.za();this.hc=setInterval(u.bind(this,function(){this.j("timeupdate")}),250)};t.za=function(){clearInterval(this.hc)};
+t.Kb=function(){u.u(this.a,"vjs-paused");u.n(this.a,"vjs-playing")};t.jd=function(){this.g.starttime&&this.currentTime(this.g.starttime);this.n("vjs-has-started")};t.Jb=function(){u.u(this.a,"vjs-playing");u.n(this.a,"vjs-paused")};t.ld=function(){1==this.Ja()&&this.j("loadedalldata")};t.hd=function(){this.g.loop&&(this.currentTime(0),this.play())};t.sc=function(){this.duration(K(this,"duration"))};t.kd=function(){this.H?this.n("vjs-fullscreen"):this.u("vjs-fullscreen")};
+t.Gb=function(a){u.log("Video Error",a)};function L(a,c,d){if(a.h&&!a.h.aa)a.h.L(function(){this[c](d)});else try{a.h[c](d)}catch(e){throw u.log(e),e;}}function K(a,c){if(a.h&&a.h.aa)try{return a.h[c]()}catch(d){throw a.h[c]===b?u.log("Video.js: "+c+" method not defined for "+a.ia+" playback technology.",d):"TypeError"==d.name?(u.log("Video.js: "+c+" unavailable on "+a.ia+" playback technology element.",d),a.h.aa=l):u.log(d),d;}}t.play=function(){L(this,"play");return this};
+t.pause=function(){L(this,"pause");return this};t.paused=function(){return K(this,"paused")===l?l:f};t.currentTime=function(a){return a!==b?(this.v.rc=a,L(this,"setCurrentTime",a),this.Fb&&this.j("timeupdate"),this):this.v.currentTime=K(this,"currentTime")||0};t.duration=function(a){if(a!==b)return this.v.duration=parseFloat(a),this;this.v.duration===b&&this.sc();return this.v.duration};
+t.buffered=function(){var a=K(this,"buffered"),c=a.length-1,d=this.v.lb=this.v.lb||0;a&&(0<=c&&a.end(c)!==d)&&(d=a.end(c),this.v.lb=d);return u.tb(0,d)};t.Ja=function(){return this.duration()?this.buffered().end(0)/this.duration():0};t.volume=function(a){if(a!==b)return a=Math.max(0,Math.min(1,parseFloat(a))),this.v.volume=a,L(this,"setVolume",a),u.td(a),this;a=parseFloat(K(this,"volume"));return isNaN(a)?1:a};t.muted=function(a){return a!==b?(L(this,"setMuted",a),this):K(this,"muted")||l};
+t.Ta=function(){return K(this,"supportsFullScreen")||l};
+t.ya=function(){var a=u.Pb.ya;this.H=f;a?(u.d(document,a.vb,u.bind(this,function(c){this.H=document[a.H];this.H===l&&u.o(document,a.vb,arguments.callee);this.j("fullscreenchange")})),this.a[a.wc]()):this.h.Ta()?L(this,"enterFullScreen"):(this.cd=f,this.Yc=document.documentElement.style.overflow,u.d(document,"keydown",u.bind(this,this.lc)),document.documentElement.style.overflow="hidden",u.n(document.body,"vjs-full-window"),this.j("enterFullWindow"),this.j("fullscreenchange"));return this};
+t.ob=function(){var a=u.Pb.ya;this.H=l;if(a)document[a.nb]();else this.h.Ta()?L(this,"exitFullScreen"):(M(this),this.j("fullscreenchange"));return this};t.lc=function(a){27===a.keyCode&&(this.H===f?this.ob():M(this))};function M(a){a.cd=l;u.o(document,"keydown",a.lc);document.documentElement.style.overflow=a.Yc;u.u(document.body,"vjs-full-window");a.j("exitFullWindow")}
+t.src=function(a){if(a instanceof Array){var c;a:{c=a;for(var d=0,e=this.g.techOrder;d<e.length;d++){var g=u.$(e[d]),j=window.videojs[g];if(j.isSupported())for(var k=0,q=c;k<q.length;k++){var n=q[k];if(j.canPlaySource(n)){c={source:n,h:g};break a}}}c=l}c?(a=c.source,c=c.h,c==this.ia?this.src(a):I(this,c,a)):this.a.appendChild(u.e("p",{innerHTML:this.options().notSupportedMessage}))}else a instanceof Object?window.videojs[this.ia].canPlaySource(a)?this.src(a.src):this.src([a]):(this.v.src=a,this.aa?
+(L(this,"src",a),"auto"==this.g.preload&&this.load(),this.g.autoplay&&this.play()):this.L(function(){this.src(a)}));return this};t.load=function(){L(this,"load");return this};t.currentSrc=function(){return K(this,"currentSrc")||this.v.src||""};t.Qa=function(a){return a!==b?(L(this,"setPreload",a),this.g.preload=a,this):K(this,"preload")};t.autoplay=function(a){return a!==b?(L(this,"setAutoplay",a),this.g.autoplay=a,this):K(this,"autoplay")};
+t.loop=function(a){return a!==b?(L(this,"setLoop",a),this.g.loop=a,this):K(this,"loop")};t.poster=function(a){return a!==b?(this.uc=a,this):this.uc};t.controls=function(a){return a!==b?(a=!!a,this.sb!==a&&((this.sb=a)?(this.u("vjs-controls-disabled"),this.n("vjs-controls-enabled"),this.j("controlsenabled")):(this.u("vjs-controls-enabled"),this.n("vjs-controls-disabled"),this.j("controlsdisabled"))),this):this.sb};u.s.prototype.Sb;t=u.s.prototype;
+t.Rb=function(a){return a!==b?(a=!!a,this.Sb!==a&&((this.Sb=a)?(this.n("vjs-using-native-controls"),this.j("usingnativecontrols")):(this.u("vjs-using-native-controls"),this.j("usingcustomcontrols"))),this):this.Sb};t.error=function(){return K(this,"error")};t.seeking=function(){return K(this,"seeking")};t.ka=f;t.Mb=function(){this.ka=f};t.Qb=f;
+t.ja=function(a){return a!==b?(a=!!a,a!==this.Qb&&((this.Qb=a)?(this.ka=f,this.u("vjs-user-inactive"),this.n("vjs-user-active"),this.j("useractive")):(this.ka=l,this.h.U("mousemove",function(a){a.stopPropagation();a.preventDefault()}),this.u("vjs-user-active"),this.n("vjs-user-inactive"),this.j("userinactive"))),this):this.Qb};var N,O,P;P=document.createElement("div");O={};
+P.Hd!==b?(O.wc="requestFullscreen",O.nb="exitFullscreen",O.vb="fullscreenchange",O.H="fullScreen"):(document.mozCancelFullScreen?(N="moz",O.H=N+"FullScreen"):(N="webkit",O.H=N+"IsFullScreen"),P[N+"RequestFullScreen"]&&(O.wc=N+"RequestFullScreen",O.nb=N+"CancelFullScreen"),O.vb=N+"fullscreenchange");document[O.nb]&&(u.Pb.ya=O);u.Fa=u.c.extend();
+u.Fa.prototype.g={Md:"play",children:{playToggle:{},currentTimeDisplay:{},timeDivider:{},durationDisplay:{},remainingTimeDisplay:{},progressControl:{},fullscreenToggle:{},volumeControl:{},muteToggle:{}}};u.Fa.prototype.e=function(){return u.e("div",{className:"vjs-control-bar"})};u.Yb=u.q.extend({i:function(a,c){u.q.call(this,a,c);a.d("play",u.bind(this,this.Kb));a.d("pause",u.bind(this,this.Jb))}});t=u.Yb.prototype;t.qa="Play";t.T=function(){return"vjs-play-control "+u.q.prototype.T.call(this)};
+t.p=function(){this.b.paused()?this.b.play():this.b.pause()};t.Kb=function(){u.u(this.a,"vjs-paused");u.n(this.a,"vjs-playing");this.a.children[0].children[0].innerHTML="Pause"};t.Jb=function(){u.u(this.a,"vjs-playing");u.n(this.a,"vjs-paused");this.a.children[0].children[0].innerHTML="Play"};u.Ya=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("timeupdate",u.bind(this,this.Ca))}});
+u.Ya.prototype.e=function(){var a=u.c.prototype.e.call(this,"div",{className:"vjs-current-time vjs-time-controls vjs-control"});this.content=u.e("div",{className:"vjs-current-time-display",innerHTML:'<span class="vjs-control-text">Current Time </span>0:00',"aria-live":"off"});a.appendChild(u.e("div").appendChild(this.content));return a};
+u.Ya.prototype.Ca=function(){var a=this.b.Nb?this.b.v.currentTime:this.b.currentTime();this.content.innerHTML='<span class="vjs-control-text">Current Time </span>'+u.La(a,this.b.duration())};u.Za=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("timeupdate",u.bind(this,this.Ca))}});
+u.Za.prototype.e=function(){var a=u.c.prototype.e.call(this,"div",{className:"vjs-duration vjs-time-controls vjs-control"});this.content=u.e("div",{className:"vjs-duration-display",innerHTML:'<span class="vjs-control-text">Duration Time </span>0:00',"aria-live":"off"});a.appendChild(u.e("div").appendChild(this.content));return a};u.Za.prototype.Ca=function(){var a=this.b.duration();a&&(this.content.innerHTML='<span class="vjs-control-text">Duration Time </span>'+u.La(a))};
+u.cc=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.cc.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-time-divider",innerHTML:"<div><span>/</span></div>"})};u.fb=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("timeupdate",u.bind(this,this.Ca))}});
+u.fb.prototype.e=function(){var a=u.c.prototype.e.call(this,"div",{className:"vjs-remaining-time vjs-time-controls vjs-control"});this.content=u.e("div",{className:"vjs-remaining-time-display",innerHTML:'<span class="vjs-control-text">Remaining Time </span>-0:00',"aria-live":"off"});a.appendChild(u.e("div").appendChild(this.content));return a};u.fb.prototype.Ca=function(){this.b.duration()&&(this.content.innerHTML='<span class="vjs-control-text">Remaining Time </span>-'+u.La(this.b.duration()-this.b.currentTime()))};
+u.Ga=u.q.extend({i:function(a,c){u.q.call(this,a,c)}});u.Ga.prototype.qa="Fullscreen";u.Ga.prototype.T=function(){return"vjs-fullscreen-control "+u.q.prototype.T.call(this)};u.Ga.prototype.p=function(){this.b.H?(this.b.ob(),this.a.children[0].children[0].innerHTML="Fullscreen"):(this.b.ya(),this.a.children[0].children[0].innerHTML="Non-Fullscreen")};u.eb=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.eb.prototype.g={children:{seekBar:{}}};
+u.eb.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-progress-control vjs-control"})};u.Zb=u.O.extend({i:function(a,c){u.O.call(this,a,c);a.d("timeupdate",u.bind(this,this.Ba));a.L(u.bind(this,this.Ba))}});t=u.Zb.prototype;t.g={children:{loadProgressBar:{},playProgressBar:{},seekHandle:{}},barName:"playProgressBar",handleName:"seekHandle"};t.tc="timeupdate";t.e=function(){return u.O.prototype.e.call(this,"div",{className:"vjs-progress-holder","aria-label":"video progress bar"})};
+t.Ba=function(){var a=this.b.Nb?this.b.v.currentTime:this.b.currentTime();this.a.setAttribute("aria-valuenow",u.round(100*this.yb(),2));this.a.setAttribute("aria-valuetext",u.La(a,this.b.duration()))};t.yb=function(){var a;"Flash"===this.b.ia&&this.b.seeking()?(a=this.b.v,a=a.rc?a.rc:this.b.currentTime()):a=this.b.currentTime();return a/this.b.duration()};t.Pa=function(a){u.O.prototype.Pa.call(this,a);this.b.Nb=f;this.Dd=!this.b.paused();this.b.pause()};
+t.Hb=function(a){a=F(this,a)*this.b.duration();a==this.b.duration()&&(a-=0.1);this.b.currentTime(a)};t.Ib=function(a){u.O.prototype.Ib.call(this,a);this.b.Nb=l;this.Dd&&this.b.play()};t.zc=function(){this.b.currentTime(this.b.currentTime()+5)};t.yc=function(){this.b.currentTime(this.b.currentTime()-5)};u.ab=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("progress",u.bind(this,this.update))}});u.ab.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-load-progress",innerHTML:'<span class="vjs-control-text">Loaded: 0%</span>'})};
+u.ab.prototype.update=function(){this.a.style&&(this.a.style.width=u.round(100*this.b.Ja(),2)+"%")};u.Xb=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.Xb.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-play-progress",innerHTML:'<span class="vjs-control-text">Progress: 0%</span>'})};u.gb=u.ea.extend();u.gb.prototype.defaultValue="00:00";u.gb.prototype.e=function(){return u.ea.prototype.e.call(this,"div",{className:"vjs-seek-handle"})};
+u.ib=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.h&&(a.h.m&&a.h.m.volumeControl===l)&&this.n("vjs-hidden");a.d("loadstart",u.bind(this,function(){a.h.m&&a.h.m.volumeControl===l?this.n("vjs-hidden"):this.u("vjs-hidden")}))}});u.ib.prototype.g={children:{volumeBar:{}}};u.ib.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-volume-control vjs-control"})};
+u.hb=u.O.extend({i:function(a,c){u.O.call(this,a,c);a.d("volumechange",u.bind(this,this.Ba));a.L(u.bind(this,this.Ba));setTimeout(u.bind(this,this.update),0)}});t=u.hb.prototype;t.Ba=function(){this.a.setAttribute("aria-valuenow",u.round(100*this.b.volume(),2));this.a.setAttribute("aria-valuetext",u.round(100*this.b.volume(),2)+"%")};t.g={children:{volumeLevel:{},volumeHandle:{}},barName:"volumeLevel",handleName:"volumeHandle"};t.tc="volumechange";
+t.e=function(){return u.O.prototype.e.call(this,"div",{className:"vjs-volume-bar","aria-label":"volume level"})};t.Hb=function(a){this.b.muted()&&this.b.muted(l);this.b.volume(F(this,a))};t.yb=function(){return this.b.muted()?0:this.b.volume()};t.zc=function(){this.b.volume(this.b.volume()+0.1)};t.yc=function(){this.b.volume(this.b.volume()-0.1)};u.dc=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});
+u.dc.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-volume-level",innerHTML:'<span class="vjs-control-text"></span>'})};u.jb=u.ea.extend();u.jb.prototype.defaultValue="00:00";u.jb.prototype.e=function(){return u.ea.prototype.e.call(this,"div",{className:"vjs-volume-handle"})};
+u.da=u.q.extend({i:function(a,c){u.q.call(this,a,c);a.d("volumechange",u.bind(this,this.update));a.h&&(a.h.m&&a.h.m.volumeControl===l)&&this.n("vjs-hidden");a.d("loadstart",u.bind(this,function(){a.h.m&&a.h.m.volumeControl===l?this.n("vjs-hidden"):this.u("vjs-hidden")}))}});u.da.prototype.e=function(){return u.q.prototype.e.call(this,"div",{className:"vjs-mute-control vjs-control",innerHTML:'<div><span class="vjs-control-text">Mute</span></div>'})};
+u.da.prototype.p=function(){this.b.muted(this.b.muted()?l:f)};u.da.prototype.update=function(){var a=this.b.volume(),c=3;0===a||this.b.muted()?c=0:0.33>a?c=1:0.67>a&&(c=2);this.b.muted()?"Unmute"!=this.a.children[0].children[0].innerHTML&&(this.a.children[0].children[0].innerHTML="Unmute"):"Mute"!=this.a.children[0].children[0].innerHTML&&(this.a.children[0].children[0].innerHTML="Mute");for(a=0;4>a;a++)u.u(this.a,"vjs-vol-"+a);u.n(this.a,"vjs-vol-"+c)};
+u.oa=u.R.extend({i:function(a,c){u.R.call(this,a,c);a.d("volumechange",u.bind(this,this.update));a.h&&(a.h.m&&a.h.m.Dc===l)&&this.n("vjs-hidden");a.d("loadstart",u.bind(this,function(){a.h.m&&a.h.m.Dc===l?this.n("vjs-hidden"):this.u("vjs-hidden")}));this.n("vjs-menu-button")}});u.oa.prototype.Ka=function(){var a=new u.ma(this.b,{Vc:"div"}),c=new u.hb(this.b,u.k.B({Cd:f},this.g.Vd));a.Z(c);return a};u.oa.prototype.p=function(){u.da.prototype.p.call(this);u.R.prototype.p.call(this)};
+u.oa.prototype.e=function(){return u.q.prototype.e.call(this,"div",{className:"vjs-volume-menu-button vjs-menu-button vjs-control",innerHTML:'<div><span class="vjs-control-text">Mute</span></div>'})};u.oa.prototype.update=u.da.prototype.update;u.cb=u.q.extend({i:function(a,c){u.q.call(this,a,c);(!a.poster()||!a.controls())&&this.C();a.d("play",u.bind(this,this.C))}});
+u.cb.prototype.e=function(){var a=u.e("div",{className:"vjs-poster",tabIndex:-1}),c=this.b.poster();c&&("backgroundSize"in a.style?a.style.backgroundImage='url("'+c+'")':a.appendChild(u.e("img",{src:c})));return a};u.cb.prototype.p=function(){this.K().controls()&&this.b.play()};
+u.Wb=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("canplay",u.bind(this,this.C));a.d("canplaythrough",u.bind(this,this.C));a.d("playing",u.bind(this,this.C));a.d("seeked",u.bind(this,this.C));a.d("seeking",u.bind(this,this.show));a.d("seeked",u.bind(this,this.C));a.d("error",u.bind(this,this.show));a.d("waiting",u.bind(this,this.show))}});u.Wb.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-loading-spinner"})};u.Wa=u.q.extend();
+u.Wa.prototype.e=function(){return u.q.prototype.e.call(this,"div",{className:"vjs-big-play-button",innerHTML:'<span aria-hidden="true"></span>',"aria-label":"play video"})};u.Wa.prototype.p=function(){this.b.play()};
+u.r=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);var e,g;g=this;e=this.K();a=function(){if(e.controls()&&!e.Rb()){var a,c;g.d("mousedown",g.p);g.d("touchstart",function(a){a.preventDefault();a.stopPropagation();c=this.b.ja()});a=function(a){a.stopPropagation();c&&this.b.Mb()};g.d("touchmove",a);g.d("touchleave",a);g.d("touchcancel",a);g.d("touchend",a);var d,n,r;d=0;g.d("touchstart",function(){d=(new Date).getTime();r=f});a=function(){r=l};g.d("touchmove",a);g.d("touchleave",a);g.d("touchcancel",
+a);g.d("touchend",function(){r===f&&(n=(new Date).getTime()-d,250>n&&this.j("tap"))});g.d("tap",g.md)}};c=u.bind(g,g.pd);this.L(a);e.d("controlsenabled",a);e.d("controlsdisabled",c)}});u.r.prototype.pd=function(){this.o("tap");this.o("touchstart");this.o("touchmove");this.o("touchleave");this.o("touchcancel");this.o("touchend");this.o("click");this.o("mousedown")};u.r.prototype.p=function(a){0===a.button&&this.K().controls()&&(this.K().paused()?this.K().play():this.K().pause())};
+u.r.prototype.md=function(){this.K().ja(!this.K().ja())};u.r.prototype.m={volumeControl:f,fullscreenResize:l,progressEvents:l,timeupdateEvents:l};u.media={};u.media.Va="play pause paused currentTime setCurrentTime duration buffered volume setVolume muted setMuted width height supportsFullScreen enterFullScreen src load currentSrc preload setPreload autoplay setAutoplay loop setLoop error networkState readyState seeking initialTime startOffsetTime played seekable ended videoTracks audioTracks videoWidth videoHeight textTracks defaultPlaybackRate playbackRate mediaGroup controller controls defaultMuted".split(" ");
+function ea(){var a=u.media.Va[i];return function(){throw Error('The "'+a+"\" method is not available on the playback technology's API");}}for(var i=u.media.Va.length-1;0<=i;i--)u.r.prototype[u.media.Va[i]]=ea();
+u.l=u.r.extend({i:function(a,c,d){this.m.volumeControl=u.l.Uc();this.m.movingMediaElementInDOM=!u.Kc;this.m.fullscreenResize=f;u.r.call(this,a,c,d);(c=c.source)&&this.a.currentSrc===c.src&&0<this.a.networkState?a.j("loadstart"):c&&(this.a.src=c.src);if(u.ac&&a.options().nativeControlsForTouch!==l){var e,g,j,k;e=this;g=this.K();c=g.controls();e.a.controls=!!c;j=function(){e.a.controls=f};k=function(){e.a.controls=l};g.d("controlsenabled",j);g.d("controlsdisabled",k);c=function(){g.o("controlsenabled",
+j);g.o("controlsdisabled",k)};e.d("dispose",c);g.d("usingcustomcontrols",c);g.Rb(f)}a.L(function(){this.M&&(this.g.autoplay&&this.paused())&&(delete this.M.poster,this.play())});for(a=u.l.$a.length-1;0<=a;a--)u.d(this.a,u.l.$a[a],u.bind(this.b,this.$c));this.Ua()}});t=u.l.prototype;t.D=function(){u.r.prototype.D.call(this)};
+t.e=function(){var a=this.b,c=a.M,d;if(!c||this.m.movingMediaElementInDOM===l)c?(d=c.cloneNode(l),u.l.jc(c),c=d,a.M=h):c=u.e("video",{id:a.id()+"_html5_api",className:"vjs-tech"}),c.player=a,u.zb(c,a.w());d=["autoplay","preload","loop","muted"];for(var e=d.length-1;0<=e;e--){var g=d[e];a.g[g]!==h&&(c[g]=a.g[g])}return c};t.$c=function(a){this.j(a);a.stopPropagation()};t.play=function(){this.a.play()};t.pause=function(){this.a.pause()};t.paused=function(){return this.a.paused};t.currentTime=function(){return this.a.currentTime};
+t.sd=function(a){try{this.a.currentTime=a}catch(c){u.log(c,"Video is not ready. (Video.js)")}};t.duration=function(){return this.a.duration||0};t.buffered=function(){return this.a.buffered};t.volume=function(){return this.a.volume};t.xd=function(a){this.a.volume=a};t.muted=function(){return this.a.muted};t.vd=function(a){this.a.muted=a};t.width=function(){return this.a.offsetWidth};t.height=function(){return this.a.offsetHeight};
+t.Ta=function(){return"function"==typeof this.a.webkitEnterFullScreen&&(/Android/.test(u.F)||!/Chrome|Mac OS X 10.5/.test(u.F))?f:l};t.src=function(a){this.a.src=a};t.load=function(){this.a.load()};t.currentSrc=function(){return this.a.currentSrc};t.Qa=function(){return this.a.Qa};t.wd=function(a){this.a.Qa=a};t.autoplay=function(){return this.a.autoplay};t.rd=function(a){this.a.autoplay=a};t.controls=function(){return this.a.controls};t.loop=function(){return this.a.loop};
+t.ud=function(a){this.a.loop=a};t.error=function(){return this.a.error};t.seeking=function(){return this.a.seeking};u.l.isSupported=function(){return!!u.na.canPlayType};u.l.mb=function(a){try{return!!u.na.canPlayType(a.type)}catch(c){return""}};u.l.Uc=function(){var a=u.na.volume;u.na.volume=a/2+0.1;return a!==u.na.volume};u.l.$a="loadstart suspend abort error emptied stalled loadedmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate progress play pause ratechange volumechange".split(" ");
+u.l.jc=function(a){if(a){a.player=h;for(a.parentNode&&a.parentNode.removeChild(a);a.hasChildNodes();)a.removeChild(a.firstChild);a.removeAttribute("src");"function"===typeof a.load&&a.load()}};u.Oc&&(document.createElement("video").constructor.prototype.canPlayType=function(a){return a&&-1!=a.toLowerCase().indexOf("video/mp4")?"maybe":""});
+u.f=u.r.extend({i:function(a,c,d){u.r.call(this,a,c,d);var e=c.source;d=c.parentEl;var g=this.a=u.e("div",{id:a.id()+"_temp_flash"}),j=a.id()+"_flash_api";a=a.g;var k=u.k.B({readyFunction:"videojs.Flash.onReady",eventProxyFunction:"videojs.Flash.onEvent",errorEventProxyFunction:"videojs.Flash.onError",autoplay:a.autoplay,preload:a.Qa,loop:a.loop,muted:a.muted},c.flashVars),q=u.k.B({wmode:"opaque",bgcolor:"#000000"},c.params),n=u.k.B({id:j,name:j,"class":"vjs-tech"},c.attributes);e&&(e.type&&u.f.ed(e.type)?
+(a=u.f.Ac(e.src),k.rtmpConnection=encodeURIComponent(a.rb),k.rtmpStream=encodeURIComponent(a.Ob)):k.src=encodeURIComponent(u.mc(e.src)));u.zb(g,d);c.startTime&&this.L(function(){this.load();this.play();this.currentTime(c.startTime)});if(c.iFrameMode===f&&!u.Jc){var r=u.e("iframe",{id:j+"_iframe",name:j+"_iframe",className:"vjs-tech",scrolling:"no",marginWidth:0,marginHeight:0,frameBorder:0});k.readyFunction="ready";k.eventProxyFunction="events";k.errorEventProxyFunction="errors";u.d(r,"load",u.bind(this,
+function(){var a,d=r.contentWindow;a=r.contentDocument?r.contentDocument:r.contentWindow.document;a.write(u.f.nc(c.swf,k,q,n));d.player=this.b;d.ready=u.bind(this.b,function(c){var d=this.h;d.a=a.getElementById(c);u.f.pb(d)});d.events=u.bind(this.b,function(a,c){this&&"flash"===this.ia&&this.j(c)});d.errors=u.bind(this.b,function(a,c){u.log("Flash Error",c)})}));g.parentNode.replaceChild(r,g)}else u.f.Zc(c.swf,g,k,q,n)}});t=u.f.prototype;t.D=function(){u.r.prototype.D.call(this)};t.play=function(){this.a.vjs_play()};
+t.pause=function(){this.a.vjs_pause()};t.src=function(a){u.f.dd(a)?(a=u.f.Ac(a),this.Qd(a.rb),this.Rd(a.Ob)):(a=u.mc(a),this.a.vjs_src(a));if(this.b.autoplay()){var c=this;setTimeout(function(){c.play()},0)}};t.currentSrc=function(){var a=this.a.vjs_getProperty("currentSrc");if(a==h){var c=this.Od(),d=this.Pd();c&&d&&(a=u.f.yd(c,d))}return a};t.load=function(){this.a.vjs_load()};t.poster=function(){this.a.vjs_getProperty("poster")};t.buffered=function(){return u.tb(0,this.a.vjs_getProperty("buffered"))};
+t.Ta=s(l);var Q=u.f.prototype,R="rtmpConnection rtmpStream preload currentTime defaultPlaybackRate playbackRate autoplay loop mediaGroup controller controls volume muted defaultMuted".split(" "),S="error currentSrc networkState readyState seeking initialTime duration startOffsetTime paused played seekable ended videoTracks audioTracks videoWidth videoHeight textTracks".split(" ");
+function fa(){var a=R[T],c=a.charAt(0).toUpperCase()+a.slice(1);Q["set"+c]=function(c){return this.a.vjs_setProperty(a,c)}}function U(a){Q[a]=function(){return this.a.vjs_getProperty(a)}}var T;for(T=0;T<R.length;T++)U(R[T]),fa();for(T=0;T<S.length;T++)U(S[T]);u.f.isSupported=function(){return 10<=u.f.version()[0]};u.f.mb=function(a){if(!a.type)return"";a=a.type.replace(/;.*/,"").toLowerCase();if(a in u.f.bd||a in u.f.Bc)return"maybe"};
+u.f.bd={"video/flv":"FLV","video/x-flv":"FLV","video/mp4":"MP4","video/m4v":"MP4"};u.f.Bc={"rtmp/mp4":"MP4","rtmp/flv":"FLV"};u.f.onReady=function(a){a=u.w(a);var c=a.player||a.parentNode.player,d=c.h;a.player=c;d.a=a;u.f.pb(d)};u.f.pb=function(a){a.w().vjs_getProperty?a.Ua():setTimeout(function(){u.f.pb(a)},50)};u.f.onEvent=function(a,c){u.w(a).player.j(c)};u.f.onError=function(a,c){u.w(a).player.j("error");u.log("Flash Error",c,a)};
+u.f.version=function(){var a="0,0,0";try{a=(new window.ActiveXObject("ShockwaveFlash.ShockwaveFlash")).GetVariable("$version").replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}catch(c){try{navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin&&(a=(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g,",").match(/^,?(.+),?$/)[1])}catch(d){}}return a.split(",")};
+u.f.Zc=function(a,c,d,e,g){a=u.f.nc(a,d,e,g);a=u.e("div",{innerHTML:a}).childNodes[0];d=c.parentNode;c.parentNode.replaceChild(a,c);var j=d.childNodes[0];setTimeout(function(){j.style.display="block"},1E3)};
+u.f.nc=function(a,c,d,e){var g="",j="",k="";c&&u.k.ua(c,function(a,c){g+=a+"="+c+"&amp;"});d=u.k.B({movie:a,flashvars:g,allowScriptAccess:"always",allowNetworking:"all"},d);u.k.ua(d,function(a,c){j+='<param name="'+a+'" value="'+c+'" />'});e=u.k.B({data:a,width:"100%",height:"100%"},e);u.k.ua(e,function(a,c){k+=a+'="'+c+'" '});return'<object type="application/x-shockwave-flash"'+k+">"+j+"</object>"};u.f.yd=function(a,c){return a+"&"+c};
+u.f.Ac=function(a){var c={rb:"",Ob:""};if(!a)return c;var d=a.indexOf("&"),e;-1!==d?e=d+1:(d=e=a.lastIndexOf("/")+1,0===d&&(d=e=a.length));c.rb=a.substring(0,d);c.Ob=a.substring(e,a.length);return c};u.f.ed=function(a){return a in u.f.Bc};u.f.Qc=/^rtmp[set]?:\/\//i;u.f.dd=function(a){return u.f.Qc.test(a)};
+u.Pc=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);if(!a.g.sources||0===a.g.sources.length){c=0;for(d=a.g.techOrder;c<d.length;c++){var e=u.$(d[c]),g=window.videojs[e];if(g&&g.isSupported()){I(a,e);break}}}else a.src(a.g.sources)}});function V(a){a.Aa=a.Aa||[];return a.Aa}function W(a,c,d){for(var e=a.Aa,g=0,j=e.length,k,q;g<j;g++)k=e[g],k.id()===c?(k.show(),q=k):d&&(k.J()==d&&0<k.mode())&&k.disable();(c=q?q.J():d?d:l)&&a.j(c+"trackchange")}
+u.X=u.c.extend({i:function(a,c){u.c.call(this,a,c);this.Q=c.id||"vjs_"+c.kind+"_"+c.language+"_"+u.t++;this.xc=c.src;this.Wc=c["default"]||c.dflt;this.Ad=c.title;this.Ld=c.srclang;this.fd=c.label;this.fa=[];this.ec=[];this.ga=this.ha=0;this.b.d("fullscreenchange",u.bind(this,this.Rc))}});t=u.X.prototype;t.J=p("A");t.src=p("xc");t.ub=p("Wc");t.title=p("Ad");t.label=p("fd");t.readyState=p("ha");t.mode=p("ga");t.Rc=function(){this.a.style.fontSize=this.b.H?140*(screen.width/this.b.width())+"%":""};
+t.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-"+this.A+" vjs-text-track"})};t.show=function(){X(this);this.ga=2;u.c.prototype.show.call(this)};t.C=function(){X(this);this.ga=1;u.c.prototype.C.call(this)};t.disable=function(){2==this.ga&&this.C();this.b.o("timeupdate",u.bind(this,this.update,this.Q));this.b.o("ended",u.bind(this,this.reset,this.Q));this.reset();this.b.V.textTrackDisplay.removeChild(this);this.ga=0};
+function X(a){0===a.ha&&a.load();0===a.ga&&(a.b.d("timeupdate",u.bind(a,a.update,a.Q)),a.b.d("ended",u.bind(a,a.reset,a.Q)),("captions"===a.A||"subtitles"===a.A)&&a.b.V.textTrackDisplay.Z(a))}t.load=function(){0===this.ha&&(this.ha=1,u.get(this.xc,u.bind(this,this.nd),u.bind(this,this.Gb)))};t.Gb=function(a){this.error=a;this.ha=3;this.j("error")};
+t.nd=function(a){var c,d;a=a.split("\n");for(var e="",g=1,j=a.length;g<j;g++)if(e=u.trim(a[g])){-1==e.indexOf("--\x3e")?(c=e,e=u.trim(a[++g])):c=this.fa.length;c={id:c,index:this.fa.length};d=e.split(" --\x3e ");c.startTime=Y(d[0]);c.va=Y(d[1]);for(d=[];a[++g]&&(e=u.trim(a[g]));)d.push(e);c.text=d.join("<br/>");this.fa.push(c)}this.ha=2;this.j("loaded")};
+function Y(a){var c=a.split(":");a=0;var d,e,g;3==c.length?(d=c[0],e=c[1],c=c[2]):(d=0,e=c[0],c=c[1]);c=c.split(/\s+/);c=c.splice(0,1)[0];c=c.split(/\.|,/);g=parseFloat(c[1]);c=c[0];a+=3600*parseFloat(d);a+=60*parseFloat(e);a+=parseFloat(c);g&&(a+=g/1E3);return a}
+t.update=function(){if(0<this.fa.length){var a=this.b.currentTime();if(this.Lb===b||a<this.Lb||this.Ma<=a){var c=this.fa,d=this.b.duration(),e=0,g=l,j=[],k,q,n,r;a>=this.Ma||this.Ma===b?r=this.wb!==b?this.wb:0:(g=f,r=this.Db!==b?this.Db:c.length-1);for(;;){n=c[r];if(n.va<=a)e=Math.max(e,n.va),n.Ia&&(n.Ia=l);else if(a<n.startTime){if(d=Math.min(d,n.startTime),n.Ia&&(n.Ia=l),!g)break}else g?(j.splice(0,0,n),q===b&&(q=r),k=r):(j.push(n),k===b&&(k=r),q=r),d=Math.min(d,n.va),e=Math.max(e,n.startTime),
+n.Ia=f;if(g)if(0===r)break;else r--;else if(r===c.length-1)break;else r++}this.ec=j;this.Ma=d;this.Lb=e;this.wb=k;this.Db=q;a=this.ec;c="";d=0;for(e=a.length;d<e;d++)c+='<span class="vjs-tt-cue">'+a[d].text+"</span>";this.a.innerHTML=c;this.j("cuechange")}}};t.reset=function(){this.Ma=0;this.Lb=this.b.duration();this.Db=this.wb=0};u.Ub=u.X.extend();u.Ub.prototype.A="captions";u.$b=u.X.extend();u.$b.prototype.A="subtitles";u.Vb=u.X.extend();u.Vb.prototype.A="chapters";
+u.bc=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);if(a.g.tracks&&0<a.g.tracks.length){c=this.b;a=a.g.tracks;var e;for(d=0;d<a.length;d++){e=a[d];var g=c,j=e.kind,k=e.label,q=e.language,n=e;e=g.Aa=g.Aa||[];n=n||{};n.kind=j;n.label=k;n.language=q;j=u.$(j||"subtitles");g=new window.videojs[j+"Track"](g,n);e.push(g)}}}});u.bc.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-text-track-display"})};
+u.Y=u.N.extend({i:function(a,c){var d=this.ca=c.track;c.label=d.label();c.selected=d.ub();u.N.call(this,a,c);this.b.d(d.J()+"trackchange",u.bind(this,this.update))}});u.Y.prototype.p=function(){u.N.prototype.p.call(this);W(this.b,this.ca.Q,this.ca.J())};u.Y.prototype.update=function(){this.selected(2==this.ca.mode())};u.bb=u.Y.extend({i:function(a,c){c.track={J:function(){return c.kind},K:a,label:function(){return c.kind+" off"},ub:s(l),mode:s(l)};u.Y.call(this,a,c);this.selected(f)}});
+u.bb.prototype.p=function(){u.Y.prototype.p.call(this);W(this.b,this.ca.Q,this.ca.J())};u.bb.prototype.update=function(){for(var a=V(this.b),c=0,d=a.length,e,g=f;c<d;c++)e=a[c],e.J()==this.ca.J()&&2==e.mode()&&(g=l);this.selected(g)};u.S=u.R.extend({i:function(a,c){u.R.call(this,a,c);1>=this.I.length&&this.C()}});u.S.prototype.ta=function(){var a=[],c;a.push(new u.bb(this.b,{kind:this.A}));for(var d=0;d<V(this.b).length;d++)c=V(this.b)[d],c.J()===this.A&&a.push(new u.Y(this.b,{track:c}));return a};
+u.Da=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute("aria-label","Captions Menu")}});u.Da.prototype.A="captions";u.Da.prototype.qa="Captions";u.Da.prototype.className="vjs-captions-button";u.Ha=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute("aria-label","Subtitles Menu")}});u.Ha.prototype.A="subtitles";u.Ha.prototype.qa="Subtitles";u.Ha.prototype.className="vjs-subtitles-button";
+u.Ea=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute("aria-label","Chapters Menu")}});t=u.Ea.prototype;t.A="chapters";t.qa="Chapters";t.className="vjs-chapters-button";t.ta=function(){for(var a=[],c,d=0;d<V(this.b).length;d++)c=V(this.b)[d],c.J()===this.A&&a.push(new u.Y(this.b,{track:c}));return a};
+t.Ka=function(){for(var a=V(this.b),c=0,d=a.length,e,g,j=this.I=[];c<d;c++)if(e=a[c],e.J()==this.A&&e.ub()){if(2>e.readyState()){this.Id=e;e.d("loaded",u.bind(this,this.Ka));return}g=e;break}a=this.wa=new u.ma(this.b);a.a.appendChild(u.e("li",{className:"vjs-menu-title",innerHTML:u.$(this.A),zd:-1}));if(g){e=g.fa;for(var k,c=0,d=e.length;c<d;c++)k=e[c],k=new u.Xa(this.b,{track:g,cue:k}),j.push(k),a.Z(k)}0<this.I.length&&this.show();return a};
+u.Xa=u.N.extend({i:function(a,c){var d=this.ca=c.track,e=this.cue=c.cue,g=a.currentTime();c.label=e.text;c.selected=e.startTime<=g&&g<e.va;u.N.call(this,a,c);d.d("cuechange",u.bind(this,this.update))}});u.Xa.prototype.p=function(){u.N.prototype.p.call(this);this.b.currentTime(this.cue.startTime);this.update(this.cue.startTime)};u.Xa.prototype.update=function(){var a=this.cue,c=this.b.currentTime();this.selected(a.startTime<=c&&c<a.va)};
+u.k.B(u.Fa.prototype.g.children,{subtitlesButton:{},captionsButton:{},chaptersButton:{}});
+if("undefined"!==typeof window.JSON&&"function"===window.JSON.parse)u.JSON=window.JSON;else{u.JSON={};var Z=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;u.JSON.parse=function(a,c){function d(a,e){var k,q,n=a[e];if(n&&"object"===typeof n)for(k in n)Object.prototype.hasOwnProperty.call(n,k)&&(q=d(n,k),q!==b?n[k]=q:delete n[k]);return c.call(a,e,n)}var e;a=String(a);Z.lastIndex=0;Z.test(a)&&(a=a.replace(Z,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));
+if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return e=eval("("+a+")"),"function"===typeof c?d({"":e},""):e;throw new SyntaxError("JSON.parse(): invalid or malformed JSON data");}}
+u.fc=function(){var a,c,d=document.getElementsByTagName("video");if(d&&0<d.length)for(var e=0,g=d.length;e<g;e++)if((c=d[e])&&c.getAttribute)c.player===b&&(a=c.getAttribute("data-setup"),a!==h&&(a=u.JSON.parse(a||"{}"),v(c,a)));else{u.kb();break}else u.Ec||u.kb()};u.kb=function(){setTimeout(u.fc,1)};"complete"===document.readyState?u.Ec=f:u.U(window,"load",function(){u.Ec=f});u.kb();u.od=function(a,c){u.s.prototype[a]=c};var ga=this;ga.Ed=f;function $(a,c){var d=a.split("."),e=ga;!(d[0]in e)&&e.execScript&&e.execScript("var "+d[0]);for(var g;d.length&&(g=d.shift());)!d.length&&c!==b?e[g]=c:e=e[g]?e[g]:e[g]={}};$("videojs",u);$("_V_",u);$("videojs.options",u.options);$("videojs.players",u.xa);$("videojs.TOUCH_ENABLED",u.ac);$("videojs.cache",u.ra);$("videojs.Component",u.c);u.c.prototype.player=u.c.prototype.K;u.c.prototype.dispose=u.c.prototype.D;u.c.prototype.createEl=u.c.prototype.e;u.c.prototype.el=u.c.prototype.w;u.c.prototype.addChild=u.c.prototype.Z;u.c.prototype.children=u.c.prototype.children;u.c.prototype.on=u.c.prototype.d;u.c.prototype.off=u.c.prototype.o;u.c.prototype.one=u.c.prototype.U;
+u.c.prototype.trigger=u.c.prototype.j;u.c.prototype.triggerReady=u.c.prototype.Ua;u.c.prototype.show=u.c.prototype.show;u.c.prototype.hide=u.c.prototype.C;u.c.prototype.width=u.c.prototype.width;u.c.prototype.height=u.c.prototype.height;u.c.prototype.dimensions=u.c.prototype.Xc;u.c.prototype.ready=u.c.prototype.L;u.c.prototype.addClass=u.c.prototype.n;u.c.prototype.removeClass=u.c.prototype.u;$("videojs.Player",u.s);u.s.prototype.dispose=u.s.prototype.D;u.s.prototype.requestFullScreen=u.s.prototype.ya;
+u.s.prototype.cancelFullScreen=u.s.prototype.ob;u.s.prototype.bufferedPercent=u.s.prototype.Ja;u.s.prototype.usingNativeControls=u.s.prototype.Rb;u.s.prototype.reportUserActivity=u.s.prototype.Mb;u.s.prototype.userActive=u.s.prototype.ja;$("videojs.MediaLoader",u.Pc);$("videojs.TextTrackDisplay",u.bc);$("videojs.ControlBar",u.Fa);$("videojs.Button",u.q);$("videojs.PlayToggle",u.Yb);$("videojs.FullscreenToggle",u.Ga);$("videojs.BigPlayButton",u.Wa);$("videojs.LoadingSpinner",u.Wb);
+$("videojs.CurrentTimeDisplay",u.Ya);$("videojs.DurationDisplay",u.Za);$("videojs.TimeDivider",u.cc);$("videojs.RemainingTimeDisplay",u.fb);$("videojs.Slider",u.O);$("videojs.ProgressControl",u.eb);$("videojs.SeekBar",u.Zb);$("videojs.LoadProgressBar",u.ab);$("videojs.PlayProgressBar",u.Xb);$("videojs.SeekHandle",u.gb);$("videojs.VolumeControl",u.ib);$("videojs.VolumeBar",u.hb);$("videojs.VolumeLevel",u.dc);$("videojs.VolumeMenuButton",u.oa);$("videojs.VolumeHandle",u.jb);$("videojs.MuteToggle",u.da);
+$("videojs.PosterImage",u.cb);$("videojs.Menu",u.ma);$("videojs.MenuItem",u.N);$("videojs.MenuButton",u.R);u.R.prototype.createItems=u.R.prototype.ta;u.S.prototype.createItems=u.S.prototype.ta;u.Ea.prototype.createItems=u.Ea.prototype.ta;$("videojs.SubtitlesButton",u.Ha);$("videojs.CaptionsButton",u.Da);$("videojs.ChaptersButton",u.Ea);$("videojs.MediaTechController",u.r);u.r.prototype.features=u.r.prototype.m;u.r.prototype.m.volumeControl=u.r.prototype.m.Dc;u.r.prototype.m.fullscreenResize=u.r.prototype.m.Jd;
+u.r.prototype.m.progressEvents=u.r.prototype.m.Nd;u.r.prototype.m.timeupdateEvents=u.r.prototype.m.Sd;$("videojs.Html5",u.l);u.l.Events=u.l.$a;u.l.isSupported=u.l.isSupported;u.l.canPlaySource=u.l.mb;u.l.prototype.setCurrentTime=u.l.prototype.sd;u.l.prototype.setVolume=u.l.prototype.xd;u.l.prototype.setMuted=u.l.prototype.vd;u.l.prototype.setPreload=u.l.prototype.wd;u.l.prototype.setAutoplay=u.l.prototype.rd;u.l.prototype.setLoop=u.l.prototype.ud;$("videojs.Flash",u.f);u.f.isSupported=u.f.isSupported;
+u.f.canPlaySource=u.f.mb;u.f.onReady=u.f.onReady;$("videojs.TextTrack",u.X);u.X.prototype.label=u.X.prototype.label;$("videojs.CaptionsTrack",u.Ub);$("videojs.SubtitlesTrack",u.$b);$("videojs.ChaptersTrack",u.Vb);$("videojs.autoSetup",u.fc);$("videojs.plugin",u.od);$("videojs.createTimeRange",u.tb);})();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/Uploader.swf b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/Uploader.swf
new file mode 100644
index 0000000..7c37835
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/Uploader.swf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.css b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.css
new file mode 100644
index 0000000..12f451f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.css
@@ -0,0 +1,28 @@
+.webuploader-container {
+	position: relative;
+}
+.webuploader-element-invisible {
+	position: absolute !important;
+	clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
+    clip: rect(1px,1px,1px,1px);
+}
+.webuploader-pick {
+	position: relative;
+	display: inline-block;
+	cursor: pointer;
+	background: #00b7ee;
+	padding: 10px 15px;
+	color: #fff;
+	text-align: center;
+	border-radius: 3px;
+	overflow: hidden;
+}
+.webuploader-pick-hover {
+	background: #00a2d4;
+}
+
+.webuploader-pick-disable {
+	opacity: 0.6;
+	pointer-events:none;
+}
+
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.custom.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.custom.js
new file mode 100644
index 0000000..583a0b8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.custom.js
@@ -0,0 +1,5670 @@
+/*! WebUploader 0.1.2 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+        },
+
+        exports = factory( root, _define, _require ),
+        origin;
+
+    // exports every module.
+    exportsTo( exports );
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = exports;
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([], exports );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = exports;
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( this, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        return window.jQuery || window.Zepto;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+    
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+    
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档将可能省略`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+    
+        var noop = function() {},
+            call = Function.call;
+    
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+    
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+    
+        function createObject( proto ) {
+            var f;
+    
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+    
+    
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+    
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.2',
+    
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+    
+            Deferred: promise.Deferred,
+    
+            isPromise: promise.isPromise,
+    
+            when: promise.when,
+    
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+    
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+    
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+    
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+    
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+    
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+    
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+    
+                /* jshint camelcase: false */
+    
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+    
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+    
+                return child;
+            },
+    
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+    
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+    
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+    
+            nextTick: (function() {
+    
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+    
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+    
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+    
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+    
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+    
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+    
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+    
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+    
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+    
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+    
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+    
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+    
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+    
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+    
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+    
+            while ( ++i < len ) {
+                handler = events[ i ];
+    
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+    
+            return !stoped;
+        }
+    
+        protos = {
+    
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+    
+                if ( !callback ) {
+                    return this;
+                }
+    
+                set = this._events || (this._events = []);
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+    
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+    
+                    set.push( handler );
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+    
+                if ( !callback ) {
+                    return me;
+                }
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+    
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+    
+                return me;
+            },
+    
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+    
+                if ( !events ) {
+                    return this;
+                }
+    
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+    
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+    
+                if ( !this._events || !type ) {
+                    return this;
+                }
+    
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+    
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+    
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+    
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+    
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$;
+    
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+    
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+    
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            getRuntimeType: 'get-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+    
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+    
+            _init: function( opts ) {
+                var me = this;
+    
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+    
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     resize: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.options( 'resize', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+    
+                // setter
+                if ( arguments.length > 1 ) {
+    
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+    
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+    
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `queueNum` 还在队列中的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+    
+                return {
+                    successNum: stats.numOfSuccess,
+    
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue
+                };
+            },
+    
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+    
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+    
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+    
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+    
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+    
+                    return false;
+                }
+    
+                return true;
+            },
+    
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+    
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+    
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+    
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            factories = {},
+    
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+    
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+    
+        $.extend( Runtime.prototype, {
+    
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+    
+                if ( this._container ) {
+                    return this._container;
+                }
+    
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+    
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+    
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                return container;
+            },
+    
+            init: Base.noop,
+            exec: Base.noop,
+    
+            destroy: function() {
+                if ( this._container ) {
+                    this._container.parentNode.removeChild( this.__container );
+                }
+    
+                this.off();
+            }
+        });
+    
+        Runtime.orders = 'html5,flash';
+    
+    
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+    
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+    
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+    
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+    
+            type = type || getFirstKey( factories );
+    
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+    
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+    
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+    
+        var cache;
+    
+        cache = (function() {
+            var obj = {};
+    
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+    
+                get: function( ruid, standalone ) {
+                    var i;
+    
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+    
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+    
+                        return obj[ i ];
+                    }
+    
+                    return null;
+                },
+    
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+    
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+    
+            this.uid = Base.guid('client_');
+    
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+    
+            this.connectRuntime = function( opts, cb ) {
+    
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+    
+                deferred.done( cb );
+    
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+    
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+    
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+    
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                runtime.__client--;
+    
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+    
+                runtime = null;
+            };
+    
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+    
+                return runtime.exec.apply( this, args );
+            };
+    
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+    
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+    
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+    
+        function Blob( ruid, source ) {
+            var me = this;
+    
+            me.source = source;
+            me.ruid = ruid;
+    
+            RuntimeClient.call( me, 'Blob' );
+    
+            this.uid = source.uid || this.uid;
+            this.type = source.type || '';
+            this.size = source.size || 0;
+    
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+    
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+    
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+    
+            getSource: function() {
+                return this.source;
+            }
+        });
+    
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+    
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+    
+        function File( ruid, file ) {
+            var ext;
+    
+            Blob.apply( this, arguments );
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+    
+            // todo 支持其他类型文件的转换。
+    
+            // 如果有mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && this.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+    
+            // 如果没有指定mimetype, 但是知道文件后缀。
+            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
+                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
+            }
+    
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+        }
+    
+        return Base.inherits( Blob, File );
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+    
+        var $ = Base.$;
+    
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+    
+            opts.container = $( opts.id );
+    
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+    
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+    
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+    
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+    
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+    
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+    
+                button.addClass('webuploader-pick');
+    
+                me.on( 'all', function( type ) {
+                    var files;
+    
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+    
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+    
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+    
+                $( window ).on( 'resize', function() {
+                    me.refresh();
+                });
+            },
+    
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+    
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+    
+                    pos = button.offset();
+    
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+    
+            enable: function() {
+                var btn = this.options.button;
+    
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+    
+            disable: function() {
+                var btn = this.options.button;
+    
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+    
+                btn.addClass('webuploader-pick-disable');
+            },
+    
+            destroy: function() {
+                if ( this.runtime ) {
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                }
+            }
+        });
+    
+        return FilePicker;
+    });
+    
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+    
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            IGNORE = {},
+            widgetClass = [];
+    
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+    
+            var length = obj.length,
+                type = $.type( obj );
+    
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+    
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+    
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+    
+        $.extend( Widget.prototype, {
+    
+            init: Base.noop,
+    
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+    
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+    
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+    
+                    return IGNORE;
+                }
+    
+                return this[ map[ apiName ] ].apply( this, args );
+    
+            },
+    
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+    
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+    
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [];
+    
+                $.each( widgetClass, function( _, klass ) {
+                    widgets.push( new klass( me ) );
+                });
+    
+                return _init.apply( me, arguments );
+            },
+    
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+    
+                args = isArrayLike( args ) ? args : [ args ];
+    
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+    
+                    if ( rlt !== IGNORE ) {
+    
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+    
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+    
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个tick中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+    
+                                setTimeout(function() {
+                                    deferred.resolve.apply( deferred, args );
+                                }, 1 );
+    
+                                return deferred.promise();
+                            })[ key ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            }
+        });
+    
+        /**
+         * 添加组件
+         * @param  {object} widgetProto 组件原型,构造函数通过constructor属性定义
+         * @param  {object} responseMap API名称与函数实现的映射
+         * @example
+         *     Uploader.register( {
+         *         init: function( options ) {},
+         *         makeThumb: function() {}
+         *     }, {
+         *         'make-thumb': 'makeThumb'
+         *     } );
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init' },
+                klass;
+    
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+                widgetProto.responseMap = map;
+            } else {
+                widgetProto.responseMap = $.extend( map, responseMap );
+            }
+    
+            klass = Base.inherits( Widget, widgetProto );
+            widgetClass.push( klass );
+    
+            return klass;
+        };
+    
+        return Widget;
+    });
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+    
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+    
+        return Uploader.register({
+            'add-btn': 'addButton',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable'
+        }, {
+    
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addButton( opts.pick );
+            },
+    
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+    
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addButton: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    options, picker, deferred;
+    
+                if ( !pick ) {
+                    return;
+                }
+    
+                deferred = Base.Deferred();
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+    
+                options = $.extend({}, pick, {
+                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                    swf: opts.swf,
+                    runtimeOrder: opts.runtimeOrder
+                });
+    
+                picker = new FilePicker( options );
+    
+                picker.once( 'ready', deferred.resolve );
+                picker.on( 'select', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                picker.init();
+    
+                this.pickers.push( picker );
+    
+                return deferred.promise();
+            },
+    
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+    
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+    
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+    
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+    
+        // 默认选项。
+        Image.options = {
+    
+            // 默认的图片处理质量
+            quality: 90,
+    
+            // 是否裁剪
+            crop: false,
+    
+            // 是否保留头部信息
+            preserveHeaders: true,
+    
+            // 是否允许放大。
+            allowMagnify: true
+        };
+    
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+    
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+    
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+    
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+    
+        var $ = Base.$,
+            throttle;
+    
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+    
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+    
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: false,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+    
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+    
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+    
+        return Uploader.register({
+            'make-thumb': 'makeThumb',
+            'before-send-file': 'compressImage'
+        }, {
+    
+    
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             *
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+    
+                opts = $.extend({}, this.options.thumb );
+    
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+    
+                width = width || opts.width;
+                height = height || opts.height;
+    
+                image = new Image( opts );
+    
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( width, height );
+                });
+    
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+    
+                image.once( 'error', function() {
+                    cb( true );
+                    image.destroy();
+                });
+    
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+    
+            compressImage: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 300 * 1024,
+                    image, deferred;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+    
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+    
+                image = new Image( opts );
+    
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( opts.width, opts.height );
+                });
+    
+                image.once( 'complete', function() {
+                    var blob, size;
+    
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+    
+                        size = file.size;
+    
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+    
+                            file.trigger( 'resize', blob.size, size );
+                        }
+    
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+    
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+    
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+    
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+    
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+    
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+    
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+    
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application'
+             */
+            this.type = source.type || 'application';
+    
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+    
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+    
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+    
+    
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+    
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+    
+            this.source = source;
+            this.loaded = 0;
+    
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+    
+        $.extend( WUFile.prototype, {
+    
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+    
+                var prevStatus = statusMap[ this.id ];
+    
+                typeof text !== 'undefined' && (this.statusText = text);
+    
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+    
+            },
+    
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+    
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+    
+            destory: function() {
+                delete statusMap[ this.id ];
+            }
+        });
+    
+        Mediator.installTo( WUFile.prototype );
+    
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+    
+        return WUFile;
+    });
+    
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+    
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+    
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+    
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被移除的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0
+            };
+    
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+    
+            // 存储所有文件
+            this._map = {};
+        }
+    
+        $.extend( Queue.prototype, {
+    
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+    
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+    
+                status = status || STATUS.QUEUED;
+    
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+    
+                return null;
+            },
+    
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+    
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+    
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+    
+                    ret.push( file );
+                }
+    
+                return ret;
+            },
+    
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+    
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+    
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+    
+                file.setStatus( STATUS.QUEUED );
+            },
+    
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+    
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+    
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+                }
+    
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+    
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+    
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+    
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+                }
+            }
+    
+        });
+    
+        Mediator.installTo( Queue.prototype );
+    
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+    
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+    
+        return Uploader.register({
+            'sort-files': 'sortFiles',
+            'add-file': 'addFiles',
+            'get-file': 'getFile',
+            'fetch-file': 'fetchFile',
+            'get-stats': 'getStats',
+            'get-files': 'getFiles',
+            'remove-file': 'removeFile',
+            'retry': 'retry',
+            'reset': 'reset',
+            'accept-file': 'acceptFile'
+        }, {
+    
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+    
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+    
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+    
+                    me.accept = new RegExp( accept, 'i' );
+                }
+    
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+    
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+    
+    
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+    
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+    
+                    file = new WUFile( file );
+                }
+    
+                return file;
+            },
+    
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || file.size < 6 || this.accept &&
+    
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+    
+                return !invalid;
+            },
+    
+    
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+    
+            _addFile: function( file ) {
+                var me = this;
+    
+                file = me._wrapFile( file );
+    
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+    
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+    
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+    
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+    
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFiles: function( files ) {
+                var me = this;
+    
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+    
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+    
+                me.owner.trigger( 'filesQueued', files );
+    
+                if ( me.options.auto ) {
+                    me.request('start-upload');
+                }
+            },
+    
+            getStats: function() {
+                return this.stats;
+            },
+    
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file ) {
+                var me = this;
+    
+                file = file.id ? file : me.queue.getFile( file );
+    
+                file.setStatus( Status.CANCELLED );
+                me.owner.trigger( 'fileDequeued', file );
+            },
+    
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+    
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+    
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+    
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+    
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+    
+                me.request('start-upload');
+            },
+    
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            }
+        });
+    
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+    
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+    
+        return Uploader.register({
+            'predict-runtime-type': 'predictRuntmeType'
+        }, {
+    
+            init: function() {
+                if ( !this.predictRuntmeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+    
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntmeType() => String
+             * @method predictRuntmeType
+             * @for  Uploader
+             */
+            predictRuntmeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+    
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+    
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+    
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+    
+        var $ = Base.$;
+    
+        function Transport( opts ) {
+            var me = this;
+    
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+    
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+    
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+    
+        Transport.options = {
+            server: '',
+            method: 'POST',
+    
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+    
+        $.extend( Transport.prototype, {
+    
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+    
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+    
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+    
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+    
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+    
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+    
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+    
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+    
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+    
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+    
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+    
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+    
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+    
+                if ( !duration ) {
+                    return;
+                }
+    
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+    
+        });
+    
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+    
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+    
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+    
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+    
+    
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+    
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+    
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+    
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+    
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+    
+    
+            /**
+             * @property {Object} [formData]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: null
+    
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+    
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+    
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+    
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len;
+    
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+    
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++
+                });
+                start += len;
+            }
+    
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+    
+            return {
+                file: file,
+    
+                has: function() {
+                    return !!pending.length;
+                },
+    
+                fetch: function() {
+                    return pending.shift();
+                }
+            };
+        }
+    
+        Uploader.register({
+            'start-upload': 'start',
+            'stop-upload': 'stop',
+            'skip-file': 'skipFile',
+            'is-in-progress': 'isInProgress'
+        }, {
+    
+            init: function() {
+                var owner = this.owner;
+    
+                this.runing = false;
+    
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+    
+                // 缓存即将上传的文件。
+                this.pending = [];
+    
+                // 跟踪还有多少分片没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+    
+                owner.on( 'uploadComplete', function( file ) {
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+    
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+    
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             * @grammar upload() => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            start: function() {
+                var me = this;
+    
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+    
+                if ( me.runing ) {
+                    return;
+                }
+    
+                me.runing = true;
+    
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+    
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        file.setStatus( Status.PROGRESS );
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+    
+                me._trigged = false;
+                me.owner.trigger('startUpload');
+                Base.nextTick( me.__tick );
+            },
+    
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stop: function( interrupt ) {
+                var me = this;
+    
+                if ( me.runing === false ) {
+                    return;
+                }
+    
+                me.runing = false;
+    
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+    
+                me.owner.trigger('stopUpload');
+            },
+    
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.runing;
+            },
+    
+            getStats: function() {
+                return this.request('get-stats');
+            },
+    
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = this.request( 'get-file', file );
+    
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+    
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+    
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+    
+                this.owner.trigger( 'uploadSkip', file );
+            },
+    
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+    
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+    
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+    
+                    fn = function( val ) {
+                        me._promise = null;
+    
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+    
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+    
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me.getStats().numOfQueue ) {
+                    me.runing = false;
+    
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+    
+            _nextBlock: function() {
+                var me = this,
+                    act = me._act,
+                    opts = me.options,
+                    next, done;
+    
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( act && act.has() &&
+                        act.file.getStatus() === Status.PROGRESS ) {
+    
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+    
+                    return act.fetch();
+    
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+    
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me.getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+    
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+    
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me._act = act;
+                        return act.fetch();
+                    };
+    
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    return isPromise( next ) ?
+                            next[ next.pipe ? 'pipe' : 'then']( done ) :
+                            done( next );
+                }
+            },
+    
+    
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+    
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+    
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.QUEUED ) {
+                            me.owner.trigger( 'uploadStart', file );
+                            file.setStatus( Status.PROGRESS );
+                            return file;
+                        }
+    
+                        return me._finishFile( file );
+                    });
+    
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+    
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+    
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+    
+                    pending.push( promise );
+                }
+            },
+    
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+    
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+    
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+    
+                me.pool.push( block );
+                me.remaning++;
+    
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+    
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+    
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+    
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+    
+    
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+    
+    
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+    
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+    
+                block.transport = tr;
+    
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+    
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    var totalPercent = 0,
+                        uploaded = 0;
+    
+                    // 可能没有abort掉,progress还是执行进来了。
+                    // if ( !file.blocks ) {
+                    //     return;
+                    // }
+    
+                    totalPercent = block.percentage = percentage;
+    
+                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。
+                        $.each( file.blocks, function( _, v ) {
+                            uploaded += (v.percentage || 0) * (v.end - v.start);
+                        });
+    
+                        totalPercent = uploaded / file.size;
+                    }
+    
+                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+                });
+    
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+    
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+    
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+    
+                    return reject;
+                };
+    
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+    
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+    
+                        block.retried++;
+                        tr.send();
+    
+                    } else {
+    
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+    
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+    
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+    
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+    
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+    
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+    
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+    
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+    
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+    
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+    
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+    
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+    
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            }
+    
+        });
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+    
+        function CompBase( owner, runtime ) {
+    
+            this.owner = owner;
+            this.options = owner.options;
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+    
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+    
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var type = 'html5',
+            components = {};
+    
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destory = this.destory;
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+    
+            me.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+    
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+    
+        });
+    
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+    
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+    
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+    
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+    
+                blob = slice.call( blob, start, end );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var $ = Base.$;
+    
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    lable = $( document.createElement('label') ),
+                    input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+    
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+    
+                lable.on( 'click', function() {
+                    input.trigger('click');
+                });
+    
+                lable.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+    
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+    
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+    
+                    input.attr( 'accept', arr.join(',') );
+                }
+    
+                container.append( input );
+                container.append( lable );
+    
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+    
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+    
+                    me.files = e.target.files;
+    
+                    // reset input
+                    clone = this.cloneNode( true );
+                    this.parentNode.replaceChild( clone, this );
+    
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+    
+                    owner.trigger('change');
+                });
+    
+                lable.on( 'mouseenter mouseleave', mouseHandler );
+    
+            },
+    
+    
+            getFiles: function() {
+                return this.files;
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/util',[
+        'base'
+    ], function( Base ) {
+    
+        var urlAPI = window.createObjectURL && window ||
+                window.URL && URL.revokeObjectURL && URL ||
+                window.webkitURL,
+            createObjectURL = Base.noop,
+            revokeObjectURL = createObjectURL;
+    
+        if ( urlAPI ) {
+    
+            // 更安全的方式调用,比如android里面就能把context改成其他的对象。
+            createObjectURL = function() {
+                return urlAPI.createObjectURL.apply( urlAPI, arguments );
+            };
+    
+            revokeObjectURL = function() {
+                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
+            };
+        }
+    
+        return {
+            createObjectURL: createObjectURL,
+            revokeObjectURL: revokeObjectURL,
+    
+            dataURL2Blob: function( dataURI ) {
+                var byteStr, intArray, ab, i, mimetype, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                ab = new ArrayBuffer( byteStr.length );
+                intArray = new Uint8Array( ab );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
+    
+                return this.arrayBufferToBlob( ab, mimetype );
+            },
+    
+            dataURL2ArrayBuffer: function( dataURI ) {
+                var byteStr, intArray, i, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                intArray = new Uint8Array( byteStr.length );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                return intArray.buffer;
+            },
+    
+            arrayBufferToBlob: function( buffer, type ) {
+                var builder = window.BlobBuilder || window.WebKitBlobBuilder,
+                    bb;
+    
+                // android不支持直接new Blob, 只能借助blobbuilder.
+                if ( builder ) {
+                    bb = new builder();
+                    bb.append( buffer );
+                    return bb.getBlob( type );
+                }
+    
+                return new Blob([ buffer ], type ? { type: type } : {} );
+            },
+    
+            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
+            // 你得到的结果是png.
+            canvasToDataUrl: function( canvas, type, quality ) {
+                return canvas.toDataURL( type, quality / 100 );
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            parseMeta: function( blob, callback ) {
+                callback( false, {});
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            updateImageHead: function( data ) {
+                return data;
+            }
+        };
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/imagemeta',[
+        'runtime/html5/util'
+    ], function( Util ) {
+    
+        var api;
+    
+        api = {
+            parsers: {
+                0xffe1: []
+            },
+    
+            maxMetaDataSize: 262144,
+    
+            parse: function( blob, cb ) {
+                var me = this,
+                    fr = new FileReader();
+    
+                fr.onload = function() {
+                    cb( false, me._parse( this.result ) );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                fr.onerror = function( e ) {
+                    cb( e.message );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                blob = blob.slice( 0, me.maxMetaDataSize );
+                fr.readAsArrayBuffer( blob.getSource() );
+            },
+    
+            _parse: function( buffer, noParse ) {
+                if ( buffer.byteLength < 6 ) {
+                    return;
+                }
+    
+                var dataview = new DataView( buffer ),
+                    offset = 2,
+                    maxOffset = dataview.byteLength - 4,
+                    headLength = offset,
+                    ret = {},
+                    markerBytes, markerLength, parsers, i;
+    
+                if ( dataview.getUint16( 0 ) === 0xffd8 ) {
+    
+                    while ( offset < maxOffset ) {
+                        markerBytes = dataview.getUint16( offset );
+    
+                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
+                                markerBytes === 0xfffe ) {
+    
+                            markerLength = dataview.getUint16( offset + 2 ) + 2;
+    
+                            if ( offset + markerLength > dataview.byteLength ) {
+                                break;
+                            }
+    
+                            parsers = api.parsers[ markerBytes ];
+    
+                            if ( !noParse && parsers ) {
+                                for ( i = 0; i < parsers.length; i += 1 ) {
+                                    parsers[ i ].call( api, dataview, offset,
+                                            markerLength, ret );
+                                }
+                            }
+    
+                            offset += markerLength;
+                            headLength = offset;
+                        } else {
+                            break;
+                        }
+                    }
+    
+                    if ( headLength > 6 ) {
+                        if ( buffer.slice ) {
+                            ret.imageHead = buffer.slice( 2, headLength );
+                        } else {
+                            // Workaround for IE10, which does not yet
+                            // support ArrayBuffer.slice:
+                            ret.imageHead = new Uint8Array( buffer )
+                                    .subarray( 2, headLength );
+                        }
+                    }
+                }
+    
+                return ret;
+            },
+    
+            updateImageHead: function( buffer, head ) {
+                var data = this._parse( buffer, true ),
+                    buf1, buf2, bodyoffset;
+    
+    
+                bodyoffset = 2;
+                if ( data.imageHead ) {
+                    bodyoffset = 2 + data.imageHead.byteLength;
+                }
+    
+                if ( buffer.slice ) {
+                    buf2 = buffer.slice( bodyoffset );
+                } else {
+                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
+                }
+    
+                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
+    
+                buf1[ 0 ] = 0xFF;
+                buf1[ 1 ] = 0xD8;
+                buf1.set( new Uint8Array( head ), 2 );
+                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
+    
+                return buf1.buffer;
+            }
+        };
+    
+        Util.parseMeta = function() {
+            return api.parse.apply( api, arguments );
+        };
+    
+        Util.updateImageHead = function() {
+            return api.updateImageHead.apply( api, arguments );
+        };
+    
+        return api;
+    });
+    /**
+     * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
+     * 暂时项目中只用了orientation.
+     *
+     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
+     * @fileOverview EXIF解析
+     */
+    
+    // Sample
+    // ====================================
+    // Make : Apple
+    // Model : iPhone 4S
+    // Orientation : 1
+    // XResolution : 72 [72/1]
+    // YResolution : 72 [72/1]
+    // ResolutionUnit : 2
+    // Software : QuickTime 7.7.1
+    // DateTime : 2013:09:01 22:53:55
+    // ExifIFDPointer : 190
+    // ExposureTime : 0.058823529411764705 [1/17]
+    // FNumber : 2.4 [12/5]
+    // ExposureProgram : Normal program
+    // ISOSpeedRatings : 800
+    // ExifVersion : 0220
+    // DateTimeOriginal : 2013:09:01 22:52:51
+    // DateTimeDigitized : 2013:09:01 22:52:51
+    // ComponentsConfiguration : YCbCr
+    // ShutterSpeedValue : 4.058893515764426
+    // ApertureValue : 2.5260688216892597 [4845/1918]
+    // BrightnessValue : -0.3126686601998395
+    // MeteringMode : Pattern
+    // Flash : Flash did not fire, compulsory flash mode
+    // FocalLength : 4.28 [107/25]
+    // SubjectArea : [4 values]
+    // FlashpixVersion : 0100
+    // ColorSpace : 1
+    // PixelXDimension : 2448
+    // PixelYDimension : 3264
+    // SensingMethod : One-chip color area sensor
+    // ExposureMode : 0
+    // WhiteBalance : Auto white balance
+    // FocalLengthIn35mmFilm : 35
+    // SceneCaptureType : Standard
+    define('runtime/html5/imagemeta/exif',[
+        'base',
+        'runtime/html5/imagemeta'
+    ], function( Base, ImageMeta ) {
+    
+        var EXIF = {};
+    
+        EXIF.ExifMap = function() {
+            return this;
+        };
+    
+        EXIF.ExifMap.prototype.map = {
+            'Orientation': 0x0112
+        };
+    
+        EXIF.ExifMap.prototype.get = function( id ) {
+            return this[ id ] || this[ this.map[ id ] ];
+        };
+    
+        EXIF.exifTagTypes = {
+            // byte, 8-bit unsigned int:
+            1: {
+                getValue: function( dataView, dataOffset ) {
+                    return dataView.getUint8( dataOffset );
+                },
+                size: 1
+            },
+    
+            // ascii, 8-bit byte:
+            2: {
+                getValue: function( dataView, dataOffset ) {
+                    return String.fromCharCode( dataView.getUint8( dataOffset ) );
+                },
+                size: 1,
+                ascii: true
+            },
+    
+            // short, 16 bit int:
+            3: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint16( dataOffset, littleEndian );
+                },
+                size: 2
+            },
+    
+            // long, 32 bit int:
+            4: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // rational = two long values,
+            // first is numerator, second is denominator:
+            5: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian ) /
+                        dataView.getUint32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            },
+    
+            // slong, 32 bit signed int:
+            9: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // srational, two slongs, first is numerator, second is denominator:
+            10: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian ) /
+                        dataView.getInt32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            }
+        };
+    
+        // undefined, 8-bit byte, value depending on field:
+        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
+    
+        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
+                littleEndian ) {
+    
+            var tagType = EXIF.exifTagTypes[ type ],
+                tagSize, dataOffset, values, i, str, c;
+    
+            if ( !tagType ) {
+                Base.log('Invalid Exif data: Invalid tag type.');
+                return;
+            }
+    
+            tagSize = tagType.size * length;
+    
+            // Determine if the value is contained in the dataOffset bytes,
+            // or if the value at the dataOffset is a pointer to the actual data:
+            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
+                    littleEndian ) : (offset + 8);
+    
+            if ( dataOffset + tagSize > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid data offset.');
+                return;
+            }
+    
+            if ( length === 1 ) {
+                return tagType.getValue( dataView, dataOffset, littleEndian );
+            }
+    
+            values = [];
+    
+            for ( i = 0; i < length; i += 1 ) {
+                values[ i ] = tagType.getValue( dataView,
+                        dataOffset + i * tagType.size, littleEndian );
+            }
+    
+            if ( tagType.ascii ) {
+                str = '';
+    
+                // Concatenate the chars:
+                for ( i = 0; i < values.length; i += 1 ) {
+                    c = values[ i ];
+    
+                    // Ignore the terminating NULL byte(s):
+                    if ( c === '\u0000' ) {
+                        break;
+                    }
+                    str += c;
+                }
+    
+                return str;
+            }
+            return values;
+        };
+    
+        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
+                data ) {
+    
+            var tag = dataView.getUint16( offset, littleEndian );
+            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
+                    dataView.getUint16( offset + 2, littleEndian ),    // tag type
+                    dataView.getUint32( offset + 4, littleEndian ),    // tag length
+                    littleEndian );
+        };
+    
+        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
+                littleEndian, data ) {
+    
+            var tagsNumber, dirEndOffset, i;
+    
+            if ( dirOffset + 6 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory offset.');
+                return;
+            }
+    
+            tagsNumber = dataView.getUint16( dirOffset, littleEndian );
+            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
+    
+            if ( dirEndOffset + 4 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory size.');
+                return;
+            }
+    
+            for ( i = 0; i < tagsNumber; i += 1 ) {
+                this.parseExifTag( dataView, tiffOffset,
+                        dirOffset + 2 + 12 * i,    // tag offset
+                        littleEndian, data );
+            }
+    
+            // Return the offset to the next directory:
+            return dataView.getUint32( dirEndOffset, littleEndian );
+        };
+    
+        // EXIF.getExifThumbnail = function(dataView, offset, length) {
+        //     var hexData,
+        //         i,
+        //         b;
+        //     if (!length || offset + length > dataView.byteLength) {
+        //         Base.log('Invalid Exif data: Invalid thumbnail data.');
+        //         return;
+        //     }
+        //     hexData = [];
+        //     for (i = 0; i < length; i += 1) {
+        //         b = dataView.getUint8(offset + i);
+        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));
+        //     }
+        //     return 'data:image/jpeg,%' + hexData.join('%');
+        // };
+    
+        EXIF.parseExifData = function( dataView, offset, length, data ) {
+    
+            var tiffOffset = offset + 10,
+                littleEndian, dirOffset;
+    
+            // Check for the ASCII code for "Exif" (0x45786966):
+            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
+                // No Exif data, might be XMP data instead
+                return;
+            }
+            if ( tiffOffset + 8 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid segment size.');
+                return;
+            }
+    
+            // Check for the two null bytes:
+            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
+                Base.log('Invalid Exif data: Missing byte alignment offset.');
+                return;
+            }
+    
+            // Check the byte alignment:
+            switch ( dataView.getUint16( tiffOffset ) ) {
+                case 0x4949:
+                    littleEndian = true;
+                    break;
+    
+                case 0x4D4D:
+                    littleEndian = false;
+                    break;
+    
+                default:
+                    Base.log('Invalid Exif data: Invalid byte alignment marker.');
+                    return;
+            }
+    
+            // Check for the TIFF tag marker (0x002A):
+            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
+                Base.log('Invalid Exif data: Missing TIFF marker.');
+                return;
+            }
+    
+            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
+            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
+            // Create the exif object to store the tags:
+            data.exif = new EXIF.ExifMap();
+            // Parse the tags of the main image directory and retrieve the
+            // offset to the next directory, usually the thumbnail directory:
+            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
+                    tiffOffset + dirOffset, littleEndian, data );
+    
+            // 尝试读取缩略图
+            // if ( dirOffset ) {
+            //     thumbnailData = {exif: {}};
+            //     dirOffset = EXIF.parseExifTags(
+            //         dataView,
+            //         tiffOffset,
+            //         tiffOffset + dirOffset,
+            //         littleEndian,
+            //         thumbnailData
+            //     );
+    
+            //     // Check for JPEG Thumbnail offset:
+            //     if (thumbnailData.exif[0x0201]) {
+            //         data.exif.Thumbnail = EXIF.getExifThumbnail(
+            //             dataView,
+            //             tiffOffset + thumbnailData.exif[0x0201],
+            //             thumbnailData.exif[0x0202] // Thumbnail data length
+            //         );
+            //     }
+            // }
+        };
+    
+        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
+        return EXIF;
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('runtime/html5/image',[
+        'base',
+        'runtime/html5/runtime',
+        'runtime/html5/util'
+    ], function( Base, Html5Runtime, Util ) {
+    
+        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
+    
+        return Html5Runtime.register( 'Image', {
+    
+            // flag: 标记是否被修改过。
+            modified: false,
+    
+            init: function() {
+                var me = this,
+                    img = new Image();
+    
+                img.onload = function() {
+    
+                    me._info = {
+                        type: me.type,
+                        width: this.width,
+                        height: this.height
+                    };
+    
+                    // 读取meta信息。
+                    if ( !me._metas && 'image/jpeg' === me.type ) {
+                        Util.parseMeta( me._blob, function( error, ret ) {
+                            me._metas = ret;
+                            me.owner.trigger('load');
+                        });
+                    } else {
+                        me.owner.trigger('load');
+                    }
+                };
+    
+                img.onerror = function() {
+                    me.owner.trigger('error');
+                };
+    
+                me._img = img;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    img = me._img;
+    
+                me._blob = blob;
+                me.type = blob.type;
+                img.src = Util.createObjectURL( blob.getSource() );
+                me.owner.once( 'load', function() {
+                    Util.revokeObjectURL( img.src );
+                });
+            },
+    
+            resize: function( width, height ) {
+                var canvas = this._canvas ||
+                        (this._canvas = document.createElement('canvas'));
+    
+                this._resize( this._img, canvas, width, height );
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger('complete');
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this._blob,
+                    opts = this.options,
+                    canvas;
+    
+                type = type || this.type;
+    
+                // blob需要重新生成。
+                if ( this.modified || this.type !== type ) {
+                    canvas = this._canvas;
+    
+                    if ( type === 'image/jpeg' ) {
+    
+                        blob = Util.canvasToDataUrl( canvas, 'image/jpeg',
+                                opts.quality );
+    
+                        if ( opts.preserveHeaders && this._metas &&
+                                this._metas.imageHead ) {
+    
+                            blob = Util.dataURL2ArrayBuffer( blob );
+                            blob = Util.updateImageHead( blob,
+                                    this._metas.imageHead );
+                            blob = Util.arrayBufferToBlob( blob, type );
+                            return blob;
+                        }
+                    } else {
+                        blob = Util.canvasToDataUrl( canvas, type );
+                    }
+    
+                    blob = Util.dataURL2Blob( blob );
+                }
+    
+                return blob;
+            },
+    
+            getAsDataUrl: function( type ) {
+                var opts = this.options;
+    
+                type = type || this.type;
+    
+                if ( type === 'image/jpeg' ) {
+                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );
+                } else {
+                    return this._canvas.toDataURL( type );
+                }
+            },
+    
+            getOrientation: function() {
+                return this._metas && this._metas.exif &&
+                        this._metas.exif.get('Orientation') || 1;
+            },
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            destroy: function() {
+                var canvas = this._canvas;
+                this._img.onload = null;
+    
+                if ( canvas ) {
+                    canvas.getContext('2d')
+                            .clearRect( 0, 0, canvas.width, canvas.height );
+                    canvas.width = canvas.height = 0;
+                    this._canvas = null;
+                }
+    
+                // 释放内存。非常重要,否则释放不了image的内存。
+                this._img.src = BLANK;
+                this._img = this._blob = null;
+            },
+    
+            _resize: function( img, cvs, width, height ) {
+                var opts = this.options,
+                    naturalWidth = img.width,
+                    naturalHeight = img.height,
+                    orientation = this.getOrientation(),
+                    scale, w, h, x, y;
+    
+                // values that require 90 degree rotation
+                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+    
+                    // 交换width, height的值。
+                    width ^= height;
+                    height ^= width;
+                    width ^= height;
+                }
+    
+                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
+                        height / naturalHeight );
+    
+                // 不允许放大。
+                opts.allowMagnify || (scale = Math.min( 1, scale ));
+    
+                w = naturalWidth * scale;
+                h = naturalHeight * scale;
+    
+                if ( opts.crop ) {
+                    cvs.width = width;
+                    cvs.height = height;
+                } else {
+                    cvs.width = w;
+                    cvs.height = h;
+                }
+    
+                x = (cvs.width - w) / 2;
+                y = (cvs.height - h) / 2;
+    
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+    
+                this._renderImageToCanvas( cvs, img, x, y, w, h );
+            },
+    
+            _rotate2Orientaion: function( canvas, orientation ) {
+                var width = canvas.width,
+                    height = canvas.height,
+                    ctx = canvas.getContext('2d');
+    
+                switch ( orientation ) {
+                    case 5:
+                    case 6:
+                    case 7:
+                    case 8:
+                        canvas.width = height;
+                        canvas.height = width;
+                        break;
+                }
+    
+                switch ( orientation ) {
+                    case 2:    // horizontal flip
+                        ctx.translate( width, 0 );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 3:    // 180 rotate left
+                        ctx.translate( width, height );
+                        ctx.rotate( Math.PI );
+                        break;
+    
+                    case 4:    // vertical flip
+                        ctx.translate( 0, height );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 5:    // vertical flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 6:    // 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( 0, -height );
+                        break;
+    
+                    case 7:    // horizontal flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( width, -height );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 8:    // 90 rotate left
+                        ctx.rotate( -0.5 * Math.PI );
+                        ctx.translate( -width, 0 );
+                        break;
+                }
+            },
+    
+            // https://github.com/stomita/ios-imagefile-megapixel/
+            // blob/master/src/megapix-image.js
+            _renderImageToCanvas: (function() {
+    
+                // 如果不是ios, 不需要这么复杂!
+                if ( !Base.os.ios ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        canvas.getContext('2d').drawImage( img, x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detecting vertical squash in loaded image.
+                 * Fixes a bug which squash image vertically while drawing into
+                 * canvas for some images.
+                 */
+                function detectVerticalSquash( img, iw, ih ) {
+                    var canvas = document.createElement('canvas'),
+                        ctx = canvas.getContext('2d'),
+                        sy = 0,
+                        ey = ih,
+                        py = ih,
+                        data, alpha, ratio;
+    
+    
+                    canvas.width = 1;
+                    canvas.height = ih;
+                    ctx.drawImage( img, 0, 0 );
+                    data = ctx.getImageData( 0, 0, 1, ih ).data;
+    
+                    // search image edge pixel position in case
+                    // it is squashed vertically.
+                    while ( py > sy ) {
+                        alpha = data[ (py - 1) * 4 + 3 ];
+    
+                        if ( alpha === 0 ) {
+                            ey = py;
+                        } else {
+                            sy = py;
+                        }
+    
+                        py = (ey + sy) >> 1;
+                    }
+    
+                    ratio = (py / ih);
+                    return (ratio === 0) ? 1 : ratio;
+                }
+    
+                // fix ie7 bug
+                // http://stackoverflow.com/questions/11929099/
+                // html5-canvas-drawimage-ratio-bug-ios
+                if ( Base.os.ios >= 7 ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        var iw = img.naturalWidth,
+                            ih = img.naturalHeight,
+                            vertSquashRatio = detectVerticalSquash( img, iw, ih );
+    
+                        return canvas.getContext('2d').drawImage( img, 0, 0,
+                            iw * vertSquashRatio, ih * vertSquashRatio,
+                            x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detect subsampling in loaded image.
+                 * In iOS, larger images than 2M pixels may be
+                 * subsampled in rendering.
+                 */
+                function detectSubsampling( img ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        canvas, ctx;
+    
+                    // subsampling may happen overmegapixel image
+                    if ( iw * ih > 1024 * 1024 ) {
+                        canvas = document.createElement('canvas');
+                        canvas.width = canvas.height = 1;
+                        ctx = canvas.getContext('2d');
+                        ctx.drawImage( img, -iw + 1, 0 );
+    
+                        // subsampled image becomes half smaller in rendering size.
+                        // check alpha channel value to confirm image is covering
+                        // edge pixel or not. if alpha value is 0
+                        // image is not covering, hence subsampled.
+                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
+                    } else {
+                        return false;
+                    }
+                }
+    
+    
+                return function( canvas, img, x, y, width, height ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        ctx = canvas.getContext('2d'),
+                        subsampled = detectSubsampling( img ),
+                        doSquash = this.type === 'image/jpeg',
+                        d = 1024,
+                        sy = 0,
+                        dy = 0,
+                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
+    
+                    if ( subsampled ) {
+                        iw /= 2;
+                        ih /= 2;
+                    }
+    
+                    ctx.save();
+                    tmpCanvas = document.createElement('canvas');
+                    tmpCanvas.width = tmpCanvas.height = d;
+    
+                    tmpCtx = tmpCanvas.getContext('2d');
+                    vertSquashRatio = doSquash ?
+                            detectVerticalSquash( img, iw, ih ) : 1;
+    
+                    dw = Math.ceil( d * width / iw );
+                    dh = Math.ceil( d * height / ih / vertSquashRatio );
+    
+                    while ( sy < ih ) {
+                        sx = 0;
+                        dx = 0;
+                        while ( sx < iw ) {
+                            tmpCtx.clearRect( 0, 0, d, d );
+                            tmpCtx.drawImage( img, -sx, -sy );
+                            ctx.drawImage( tmpCanvas, 0, 0, d, d,
+                                    x + dx, y + dy, dw, dh );
+                            sx += d;
+                            dx += dw;
+                        }
+                        sy += d;
+                        dy += dh;
+                    }
+                    ctx.restore();
+                    tmpCanvas = tmpCtx = null;
+                };
+            })()
+        });
+    });
+    /**
+     * 这个方式性能不行,但是可以解决android里面的toDataUrl的bug
+     * android里面toDataUrl('image/jpege')得到的结果却是png.
+     *
+     * 所以这里没辙,只能借助这个工具
+     * @fileOverview jpeg encoder
+     */
+    define('runtime/html5/jpegencoder',[], function( require, exports, module ) {
+    
+        /*
+          Copyright (c) 2008, Adobe Systems Incorporated
+          All rights reserved.
+    
+          Redistribution and use in source and binary forms, with or without
+          modification, are permitted provided that the following conditions are
+          met:
+    
+          * Redistributions of source code must retain the above copyright notice,
+            this list of conditions and the following disclaimer.
+    
+          * Redistributions in binary form must reproduce the above copyright
+            notice, this list of conditions and the following disclaimer in the
+            documentation and/or other materials provided with the distribution.
+    
+          * Neither the name of Adobe Systems Incorporated nor the names of its
+            contributors may be used to endorse or promote products derived from
+            this software without specific prior written permission.
+    
+          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+          IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+          PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+          CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+          EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+          PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+          PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+          NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+          SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+        */
+        /*
+        JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009
+    
+        Basic GUI blocking jpeg encoder
+        */
+    
+        function JPEGEncoder(quality) {
+          var self = this;
+            var fround = Math.round;
+            var ffloor = Math.floor;
+            var YTable = new Array(64);
+            var UVTable = new Array(64);
+            var fdtbl_Y = new Array(64);
+            var fdtbl_UV = new Array(64);
+            var YDC_HT;
+            var UVDC_HT;
+            var YAC_HT;
+            var UVAC_HT;
+    
+            var bitcode = new Array(65535);
+            var category = new Array(65535);
+            var outputfDCTQuant = new Array(64);
+            var DU = new Array(64);
+            var byteout = [];
+            var bytenew = 0;
+            var bytepos = 7;
+    
+            var YDU = new Array(64);
+            var UDU = new Array(64);
+            var VDU = new Array(64);
+            var clt = new Array(256);
+            var RGB_YUV_TABLE = new Array(2048);
+            var currentQuality;
+    
+            var ZigZag = [
+                     0, 1, 5, 6,14,15,27,28,
+                     2, 4, 7,13,16,26,29,42,
+                     3, 8,12,17,25,30,41,43,
+                     9,11,18,24,31,40,44,53,
+                    10,19,23,32,39,45,52,54,
+                    20,22,33,38,46,51,55,60,
+                    21,34,37,47,50,56,59,61,
+                    35,36,48,49,57,58,62,63
+                ];
+    
+            var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
+            var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
+            var std_ac_luminance_values = [
+                    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
+                    0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
+                    0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
+                    0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
+                    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
+                    0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
+                    0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
+                    0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
+                    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
+                    0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
+                    0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
+                    0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
+                    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
+                    0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
+                    0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
+                    0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
+                    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
+                    0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
+                    0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
+                    0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+    
+            var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
+            var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
+            var std_ac_chrominance_values = [
+                    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
+                    0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
+                    0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
+                    0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
+                    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
+                    0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
+                    0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
+                    0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
+                    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
+                    0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
+                    0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
+                    0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
+                    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
+                    0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
+                    0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
+                    0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
+                    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
+                    0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
+                    0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
+                    0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+    
+            function initQuantTables(sf){
+                    var YQT = [
+                        16, 11, 10, 16, 24, 40, 51, 61,
+                        12, 12, 14, 19, 26, 58, 60, 55,
+                        14, 13, 16, 24, 40, 57, 69, 56,
+                        14, 17, 22, 29, 51, 87, 80, 62,
+                        18, 22, 37, 56, 68,109,103, 77,
+                        24, 35, 55, 64, 81,104,113, 92,
+                        49, 64, 78, 87,103,121,120,101,
+                        72, 92, 95, 98,112,100,103, 99
+                    ];
+    
+                    for (var i = 0; i < 64; i++) {
+                        var t = ffloor((YQT[i]*sf+50)/100);
+                        if (t < 1) {
+                            t = 1;
+                        } else if (t > 255) {
+                            t = 255;
+                        }
+                        YTable[ZigZag[i]] = t;
+                    }
+                    var UVQT = [
+                        17, 18, 24, 47, 99, 99, 99, 99,
+                        18, 21, 26, 66, 99, 99, 99, 99,
+                        24, 26, 56, 99, 99, 99, 99, 99,
+                        47, 66, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99
+                    ];
+                    for (var j = 0; j < 64; j++) {
+                        var u = ffloor((UVQT[j]*sf+50)/100);
+                        if (u < 1) {
+                            u = 1;
+                        } else if (u > 255) {
+                            u = 255;
+                        }
+                        UVTable[ZigZag[j]] = u;
+                    }
+                    var aasf = [
+                        1.0, 1.387039845, 1.306562965, 1.175875602,
+                        1.0, 0.785694958, 0.541196100, 0.275899379
+                    ];
+                    var k = 0;
+                    for (var row = 0; row < 8; row++)
+                    {
+                        for (var col = 0; col < 8; col++)
+                        {
+                            fdtbl_Y[k]  = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            k++;
+                        }
+                    }
+                }
+    
+                function computeHuffmanTbl(nrcodes, std_table){
+                    var codevalue = 0;
+                    var pos_in_table = 0;
+                    var HT = new Array();
+                    for (var k = 1; k <= 16; k++) {
+                        for (var j = 1; j <= nrcodes[k]; j++) {
+                            HT[std_table[pos_in_table]] = [];
+                            HT[std_table[pos_in_table]][0] = codevalue;
+                            HT[std_table[pos_in_table]][1] = k;
+                            pos_in_table++;
+                            codevalue++;
+                        }
+                        codevalue*=2;
+                    }
+                    return HT;
+                }
+    
+                function initHuffmanTbl()
+                {
+                    YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
+                    UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
+                    YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
+                    UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
+                }
+    
+                function initCategoryNumber()
+                {
+                    var nrlower = 1;
+                    var nrupper = 2;
+                    for (var cat = 1; cat <= 15; cat++) {
+                        //Positive numbers
+                        for (var nr = nrlower; nr<nrupper; nr++) {
+                            category[32767+nr] = cat;
+                            bitcode[32767+nr] = [];
+                            bitcode[32767+nr][1] = cat;
+                            bitcode[32767+nr][0] = nr;
+                        }
+                        //Negative numbers
+                        for (var nrneg =-(nrupper-1); nrneg<=-nrlower; nrneg++) {
+                            category[32767+nrneg] = cat;
+                            bitcode[32767+nrneg] = [];
+                            bitcode[32767+nrneg][1] = cat;
+                            bitcode[32767+nrneg][0] = nrupper-1+nrneg;
+                        }
+                        nrlower <<= 1;
+                        nrupper <<= 1;
+                    }
+                }
+    
+                function initRGBYUVTable() {
+                    for(var i = 0; i < 256;i++) {
+                        RGB_YUV_TABLE[i]            =  19595 * i;
+                        RGB_YUV_TABLE[(i+ 256)>>0]  =  38470 * i;
+                        RGB_YUV_TABLE[(i+ 512)>>0]  =   7471 * i + 0x8000;
+                        RGB_YUV_TABLE[(i+ 768)>>0]  = -11059 * i;
+                        RGB_YUV_TABLE[(i+1024)>>0]  = -21709 * i;
+                        RGB_YUV_TABLE[(i+1280)>>0]  =  32768 * i + 0x807FFF;
+                        RGB_YUV_TABLE[(i+1536)>>0]  = -27439 * i;
+                        RGB_YUV_TABLE[(i+1792)>>0]  = - 5329 * i;
+                    }
+                }
+    
+                // IO functions
+                function writeBits(bs)
+                {
+                    var value = bs[0];
+                    var posval = bs[1]-1;
+                    while ( posval >= 0 ) {
+                        if (value & (1 << posval) ) {
+                            bytenew |= (1 << bytepos);
+                        }
+                        posval--;
+                        bytepos--;
+                        if (bytepos < 0) {
+                            if (bytenew == 0xFF) {
+                                writeByte(0xFF);
+                                writeByte(0);
+                            }
+                            else {
+                                writeByte(bytenew);
+                            }
+                            bytepos=7;
+                            bytenew=0;
+                        }
+                    }
+                }
+    
+                function writeByte(value)
+                {
+                    byteout.push(clt[value]); // write char directly instead of converting later
+                }
+    
+                function writeWord(value)
+                {
+                    writeByte((value>>8)&0xFF);
+                    writeByte((value   )&0xFF);
+                }
+    
+                // DCT & quantization core
+                function fDCTQuant(data, fdtbl)
+                {
+                    var d0, d1, d2, d3, d4, d5, d6, d7;
+                    /* Pass 1: process rows. */
+                    var dataOff=0;
+                    var i;
+                    var I8 = 8;
+                    var I64 = 64;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff+1];
+                        d2 = data[dataOff+2];
+                        d3 = data[dataOff+3];
+                        d4 = data[dataOff+4];
+                        d5 = data[dataOff+5];
+                        d6 = data[dataOff+6];
+                        d7 = data[dataOff+7];
+    
+                        var tmp0 = d0 + d7;
+                        var tmp7 = d0 - d7;
+                        var tmp1 = d1 + d6;
+                        var tmp6 = d1 - d6;
+                        var tmp2 = d2 + d5;
+                        var tmp5 = d2 - d5;
+                        var tmp3 = d3 + d4;
+                        var tmp4 = d3 - d4;
+    
+                        /* Even part */
+                        var tmp10 = tmp0 + tmp3;    /* phase 2 */
+                        var tmp13 = tmp0 - tmp3;
+                        var tmp11 = tmp1 + tmp2;
+                        var tmp12 = tmp1 - tmp2;
+    
+                        data[dataOff] = tmp10 + tmp11; /* phase 3 */
+                        data[dataOff+4] = tmp10 - tmp11;
+    
+                        var z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */
+                        data[dataOff+2] = tmp13 + z1; /* phase 5 */
+                        data[dataOff+6] = tmp13 - z1;
+    
+                        /* Odd part */
+                        tmp10 = tmp4 + tmp5; /* phase 2 */
+                        tmp11 = tmp5 + tmp6;
+                        tmp12 = tmp6 + tmp7;
+    
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */
+                        var z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */
+                        var z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */
+                        var z3 = tmp11 * 0.707106781; /* c4 */
+    
+                        var z11 = tmp7 + z3;    /* phase 5 */
+                        var z13 = tmp7 - z3;
+    
+                        data[dataOff+5] = z13 + z2; /* phase 6 */
+                        data[dataOff+3] = z13 - z2;
+                        data[dataOff+1] = z11 + z4;
+                        data[dataOff+7] = z11 - z4;
+    
+                        dataOff += 8; /* advance pointer to next row */
+                    }
+    
+                    /* Pass 2: process columns. */
+                    dataOff = 0;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff + 8];
+                        d2 = data[dataOff + 16];
+                        d3 = data[dataOff + 24];
+                        d4 = data[dataOff + 32];
+                        d5 = data[dataOff + 40];
+                        d6 = data[dataOff + 48];
+                        d7 = data[dataOff + 56];
+    
+                        var tmp0p2 = d0 + d7;
+                        var tmp7p2 = d0 - d7;
+                        var tmp1p2 = d1 + d6;
+                        var tmp6p2 = d1 - d6;
+                        var tmp2p2 = d2 + d5;
+                        var tmp5p2 = d2 - d5;
+                        var tmp3p2 = d3 + d4;
+                        var tmp4p2 = d3 - d4;
+    
+                        /* Even part */
+                        var tmp10p2 = tmp0p2 + tmp3p2;  /* phase 2 */
+                        var tmp13p2 = tmp0p2 - tmp3p2;
+                        var tmp11p2 = tmp1p2 + tmp2p2;
+                        var tmp12p2 = tmp1p2 - tmp2p2;
+    
+                        data[dataOff] = tmp10p2 + tmp11p2; /* phase 3 */
+                        data[dataOff+32] = tmp10p2 - tmp11p2;
+    
+                        var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781; /* c4 */
+                        data[dataOff+16] = tmp13p2 + z1p2; /* phase 5 */
+                        data[dataOff+48] = tmp13p2 - z1p2;
+    
+                        /* Odd part */
+                        tmp10p2 = tmp4p2 + tmp5p2; /* phase 2 */
+                        tmp11p2 = tmp5p2 + tmp6p2;
+                        tmp12p2 = tmp6p2 + tmp7p2;
+    
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433; /* c6 */
+                        var z2p2 = 0.541196100 * tmp10p2 + z5p2; /* c2-c6 */
+                        var z4p2 = 1.306562965 * tmp12p2 + z5p2; /* c2+c6 */
+                        var z3p2 = tmp11p2 * 0.707106781; /* c4 */
+    
+                        var z11p2 = tmp7p2 + z3p2;  /* phase 5 */
+                        var z13p2 = tmp7p2 - z3p2;
+    
+                        data[dataOff+40] = z13p2 + z2p2; /* phase 6 */
+                        data[dataOff+24] = z13p2 - z2p2;
+                        data[dataOff+ 8] = z11p2 + z4p2;
+                        data[dataOff+56] = z11p2 - z4p2;
+    
+                        dataOff++; /* advance pointer to next column */
+                    }
+    
+                    // Quantize/descale the coefficients
+                    var fDCTQuant;
+                    for (i=0; i<I64; ++i)
+                    {
+                        // Apply the quantization and scaling factor & Round to nearest integer
+                        fDCTQuant = data[i]*fdtbl[i];
+                        outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);
+                        //outputfDCTQuant[i] = fround(fDCTQuant);
+    
+                    }
+                    return outputfDCTQuant;
+                }
+    
+                function writeAPP0()
+                {
+                    writeWord(0xFFE0); // marker
+                    writeWord(16); // length
+                    writeByte(0x4A); // J
+                    writeByte(0x46); // F
+                    writeByte(0x49); // I
+                    writeByte(0x46); // F
+                    writeByte(0); // = "JFIF",'\0'
+                    writeByte(1); // versionhi
+                    writeByte(1); // versionlo
+                    writeByte(0); // xyunits
+                    writeWord(1); // xdensity
+                    writeWord(1); // ydensity
+                    writeByte(0); // thumbnwidth
+                    writeByte(0); // thumbnheight
+                }
+    
+                function writeSOF0(width, height)
+                {
+                    writeWord(0xFFC0); // marker
+                    writeWord(17);   // length, truecolor YUV JPG
+                    writeByte(8);    // precision
+                    writeWord(height);
+                    writeWord(width);
+                    writeByte(3);    // nrofcomponents
+                    writeByte(1);    // IdY
+                    writeByte(0x11); // HVY
+                    writeByte(0);    // QTY
+                    writeByte(2);    // IdU
+                    writeByte(0x11); // HVU
+                    writeByte(1);    // QTU
+                    writeByte(3);    // IdV
+                    writeByte(0x11); // HVV
+                    writeByte(1);    // QTV
+                }
+    
+                function writeDQT()
+                {
+                    writeWord(0xFFDB); // marker
+                    writeWord(132);    // length
+                    writeByte(0);
+                    for (var i=0; i<64; i++) {
+                        writeByte(YTable[i]);
+                    }
+                    writeByte(1);
+                    for (var j=0; j<64; j++) {
+                        writeByte(UVTable[j]);
+                    }
+                }
+    
+                function writeDHT()
+                {
+                    writeWord(0xFFC4); // marker
+                    writeWord(0x01A2); // length
+    
+                    writeByte(0); // HTYDCinfo
+                    for (var i=0; i<16; i++) {
+                        writeByte(std_dc_luminance_nrcodes[i+1]);
+                    }
+                    for (var j=0; j<=11; j++) {
+                        writeByte(std_dc_luminance_values[j]);
+                    }
+    
+                    writeByte(0x10); // HTYACinfo
+                    for (var k=0; k<16; k++) {
+                        writeByte(std_ac_luminance_nrcodes[k+1]);
+                    }
+                    for (var l=0; l<=161; l++) {
+                        writeByte(std_ac_luminance_values[l]);
+                    }
+    
+                    writeByte(1); // HTUDCinfo
+                    for (var m=0; m<16; m++) {
+                        writeByte(std_dc_chrominance_nrcodes[m+1]);
+                    }
+                    for (var n=0; n<=11; n++) {
+                        writeByte(std_dc_chrominance_values[n]);
+                    }
+    
+                    writeByte(0x11); // HTUACinfo
+                    for (var o=0; o<16; o++) {
+                        writeByte(std_ac_chrominance_nrcodes[o+1]);
+                    }
+                    for (var p=0; p<=161; p++) {
+                        writeByte(std_ac_chrominance_values[p]);
+                    }
+                }
+    
+                function writeSOS()
+                {
+                    writeWord(0xFFDA); // marker
+                    writeWord(12); // length
+                    writeByte(3); // nrofcomponents
+                    writeByte(1); // IdY
+                    writeByte(0); // HTY
+                    writeByte(2); // IdU
+                    writeByte(0x11); // HTU
+                    writeByte(3); // IdV
+                    writeByte(0x11); // HTV
+                    writeByte(0); // Ss
+                    writeByte(0x3f); // Se
+                    writeByte(0); // Bf
+                }
+    
+                function processDU(CDU, fdtbl, DC, HTDC, HTAC){
+                    var EOB = HTAC[0x00];
+                    var M16zeroes = HTAC[0xF0];
+                    var pos;
+                    var I16 = 16;
+                    var I63 = 63;
+                    var I64 = 64;
+                    var DU_DCT = fDCTQuant(CDU, fdtbl);
+                    //ZigZag reorder
+                    for (var j=0;j<I64;++j) {
+                        DU[ZigZag[j]]=DU_DCT[j];
+                    }
+                    var Diff = DU[0] - DC; DC = DU[0];
+                    //Encode DC
+                    if (Diff==0) {
+                        writeBits(HTDC[0]); // Diff might be 0
+                    } else {
+                        pos = 32767+Diff;
+                        writeBits(HTDC[category[pos]]);
+                        writeBits(bitcode[pos]);
+                    }
+                    //Encode ACs
+                    var end0pos = 63; // was const... which is crazy
+                    for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {};
+                    //end0pos = first element in reverse order !=0
+                    if ( end0pos == 0) {
+                        writeBits(EOB);
+                        return DC;
+                    }
+                    var i = 1;
+                    var lng;
+                    while ( i <= end0pos ) {
+                        var startpos = i;
+                        for (; (DU[i]==0) && (i<=end0pos); ++i) {}
+                        var nrzeroes = i-startpos;
+                        if ( nrzeroes >= I16 ) {
+                            lng = nrzeroes>>4;
+                            for (var nrmarker=1; nrmarker <= lng; ++nrmarker)
+                                writeBits(M16zeroes);
+                            nrzeroes = nrzeroes&0xF;
+                        }
+                        pos = 32767+DU[i];
+                        writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
+                        writeBits(bitcode[pos]);
+                        i++;
+                    }
+                    if ( end0pos != I63 ) {
+                        writeBits(EOB);
+                    }
+                    return DC;
+                }
+    
+                function initCharLookupTable(){
+                    var sfcc = String.fromCharCode;
+                    for(var i=0; i < 256; i++){ ///// ACHTUNG // 255
+                        clt[i] = sfcc(i);
+                    }
+                }
+    
+                this.encode = function(image,quality) // image data object
+                {
+                    // var time_start = new Date().getTime();
+    
+                    if(quality) setQuality(quality);
+    
+                    // Initialize bit writer
+                    byteout = new Array();
+                    bytenew=0;
+                    bytepos=7;
+    
+                    // Add JPEG headers
+                    writeWord(0xFFD8); // SOI
+                    writeAPP0();
+                    writeDQT();
+                    writeSOF0(image.width,image.height);
+                    writeDHT();
+                    writeSOS();
+    
+    
+                    // Encode 8x8 macroblocks
+                    var DCY=0;
+                    var DCU=0;
+                    var DCV=0;
+    
+                    bytenew=0;
+                    bytepos=7;
+    
+    
+                    this.encode.displayName = "_encode_";
+    
+                    var imageData = image.data;
+                    var width = image.width;
+                    var height = image.height;
+    
+                    var quadWidth = width*4;
+                    var tripleWidth = width*3;
+    
+                    var x, y = 0;
+                    var r, g, b;
+                    var start,p, col,row,pos;
+                    while(y < height){
+                        x = 0;
+                        while(x < quadWidth){
+                        start = quadWidth * y + x;
+                        p = start;
+                        col = -1;
+                        row = 0;
+    
+                        for(pos=0; pos < 64; pos++){
+                            row = pos >> 3;// /8
+                            col = ( pos & 7 ) * 4; // %8
+                            p = start + ( row * quadWidth ) + col;
+    
+                            if(y+row >= height){ // padding bottom
+                                p-= (quadWidth*(y+1+row-height));
+                            }
+    
+                            if(x+col >= quadWidth){ // padding right
+                                p-= ((x+col) - quadWidth +4)
+                            }
+    
+                            r = imageData[ p++ ];
+                            g = imageData[ p++ ];
+                            b = imageData[ p++ ];
+    
+    
+                            /* // calculate YUV values dynamically
+                            YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
+                            UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
+                            VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
+                            */
+    
+                            // use lookup table (slightly faster)
+                            YDU[pos] = ((RGB_YUV_TABLE[r]             + RGB_YUV_TABLE[(g +  256)>>0] + RGB_YUV_TABLE[(b +  512)>>0]) >> 16)-128;
+                            UDU[pos] = ((RGB_YUV_TABLE[(r +  768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;
+                            VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;
+    
+                        }
+    
+                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
+                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
+                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
+                        x+=32;
+                        }
+                        y+=8;
+                    }
+    
+    
+                    ////////////////////////////////////////////////////////////////
+    
+                    // Do the bit alignment of the EOI marker
+                    if ( bytepos >= 0 ) {
+                        var fillbits = [];
+                        fillbits[1] = bytepos+1;
+                        fillbits[0] = (1<<(bytepos+1))-1;
+                        writeBits(fillbits);
+                    }
+    
+                    writeWord(0xFFD9); //EOI
+    
+                    var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
+    
+                    byteout = [];
+    
+                    // benchmarking
+                    // var duration = new Date().getTime() - time_start;
+                    // console.log('Encoding time: '+ currentQuality + 'ms');
+                    //
+    
+                    return jpegDataUri
+            }
+    
+            function setQuality(quality){
+                if (quality <= 0) {
+                    quality = 1;
+                }
+                if (quality > 100) {
+                    quality = 100;
+                }
+    
+                if(currentQuality == quality) return // don't recalc if unchanged
+    
+                var sf = 0;
+                if (quality < 50) {
+                    sf = Math.floor(5000 / quality);
+                } else {
+                    sf = Math.floor(200 - quality*2);
+                }
+    
+                initQuantTables(sf);
+                currentQuality = quality;
+                // console.log('Quality set to: '+quality +'%');
+            }
+    
+            function init(){
+                // var time_start = new Date().getTime();
+                if(!quality) quality = 50;
+                // Create tables
+                initCharLookupTable()
+                initHuffmanTbl();
+                initCategoryNumber();
+                initRGBYUVTable();
+    
+                setQuality(quality);
+                // var duration = new Date().getTime() - time_start;
+                // console.log('Initialization '+ duration + 'ms');
+            }
+    
+            init();
+    
+        };
+    
+        JPEGEncoder.encode = function( data, quality ) {
+            var encoder = new JPEGEncoder( quality );
+    
+            return encoder.encode( data );
+        }
+    
+        return JPEGEncoder;
+    });
+    /**
+     * @fileOverview Fix android canvas.toDataUrl bug.
+     */
+    define('runtime/html5/androidpatch',[
+        'runtime/html5/util',
+        'runtime/html5/jpegencoder',
+        'base'
+    ], function( Util, encoder, Base ) {
+        var origin = Util.canvasToDataUrl,
+            supportJpeg;
+    
+        Util.canvasToDataUrl = function( canvas, type, quality ) {
+            var ctx, w, h, fragement, parts;
+    
+            // 非android手机直接跳过。
+            if ( !Base.os.android ) {
+                return origin.apply( null, arguments );
+            }
+    
+            // 检测是否canvas支持jpeg导出,根据数据格式来判断。
+            // JPEG 前两位分别是:255, 216
+            if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {
+                fragement = origin.apply( null, arguments );
+    
+                parts = fragement.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    fragement = atob( parts[ 1 ] );
+                } else {
+                    fragement = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                fragement = fragement.substring( 0, 2 );
+    
+                supportJpeg = fragement.charCodeAt( 0 ) === 255 &&
+                        fragement.charCodeAt( 1 ) === 216;
+            }
+    
+            // 只有在android环境下才修复
+            if ( type === 'image/jpeg' && !supportJpeg ) {
+                w = canvas.width;
+                h = canvas.height;
+                ctx = canvas.getContext('2d');
+    
+                return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );
+            }
+    
+            return origin.apply( null, arguments );
+        };
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var noop = Base.noop,
+            $ = Base.$;
+    
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+    
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+    
+                if ( binary ) {
+                    xhr.overrideMimeType('application/octet-stream');
+    
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+    
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+    
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+    
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+    
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+    
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+    
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+    
+                    return me.trigger( 'progress', percentage );
+                };
+    
+                xhr.onreadystatechange = function() {
+    
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+    
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+    
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+    
+    
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+    
+            _parseJson: function( str ) {
+                var json;
+    
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+    
+                return json;
+            }
+        });
+    });
+    define('webuploader',[
+        'base',
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'runtime/html5/blob',
+        'runtime/html5/filepicker',
+        'runtime/html5/imagemeta/exif',
+        'runtime/html5/image',
+        'runtime/html5/androidpatch',
+        'runtime/html5/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.custom.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.custom.min.js
new file mode 100644
index 0000000..5c256b4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.custom.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",getDimension:"get-dimension",addButton:"add-btn",getRuntimeType:"get-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){b._info=b._info||d.info(),b._meta=b._meta||d.meta(),d.resize(g.width,g.height)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,a.size<c&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destory:function(){delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d.getStats().numOfQueue||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_nextBlock:function(){var a,b,c=this,d=c._act,f=c.options;return d&&d.has()&&d.file.getStatus()===h.PROGRESS?(f.prepareNextFile&&!c.pending.length&&c._prepareNextFile(),d.fetch()):c.runing?(!c.pending.length&&c.getStats().numOfQueue&&c._prepareNextFile(),a=c.pending.shift(),b=function(a){return a?(d=e(a,f.chunked?f.chunkSize:0),c._act=d,d.fetch()):null},g(a)?a[a.pipe?"pipe":"then"](b):b(a)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.QUEUED?(b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),c):b._finishFile(c)}),a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d._popBlock(b),a.nextTick(d.__tick))})},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){var c=0,d=0;c=b.percentage=a,b.chunks>1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;e<b.length;e++)c[e]=b.charCodeAt(e);return f=g[0].split(":")[1].split(";")[0],this.arrayBufferToBlob(d,f)},dataURL2ArrayBuffer:function(a){var b,c,d,e;for(e=a.split(","),b=~e[0].indexOf("base64")?atob(e[1]):decodeURIComponent(e[1]),c=new Uint8Array(b.length),d=0;d<b.length;d++)c[d]=b.charCodeAt(d);return c.buffer},arrayBufferToBlob:function(b,c){var d,e=a.BlobBuilder||a.WebKitBlobBuilder;return e?(d=new e,d.append(b),d.getBlob(c)):new Blob([b],c?{type:c}:{})},canvasToDataUrl:function(a,b,c){return a.toDataURL(b,c/100)},parseMeta:function(a,b){b(!1,{})},updateImageHead:function(a){return a}}}),b("runtime/html5/imagemeta",["runtime/html5/util"],function(a){var b;return b={parsers:{65505:[]},maxMetaDataSize:262144,parse:function(a,b){var c=this,d=new FileReader;d.onload=function(){b(!1,c._parse(this.result)),d=d.onload=d.onerror=null},d.onerror=function(a){b(a.message),d=d.onload=d.onerror=null},a=a.slice(0,c.maxMetaDataSize),d.readAsArrayBuffer(a.getSource())},_parse:function(a,c){if(!(a.byteLength<6)){var d,e,f,g,h=new DataView(a),i=2,j=h.byteLength-4,k=i,l={};if(65496===h.getUint16(0)){for(;j>i&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g<f.length;g+=1)f[g].call(b,h,i,e,l);i+=e,k=i}k>6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)
+},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;l<k.length&&(n=k[l],"\x00"!==n);l+=1)m+=n;return m}return k},c.parseExifTag=function(a,b,d,e,f){var g=a.getUint16(d,e);f.exif[g]=c.getExifValue(a,b,d,a.getUint16(d+2,e),a.getUint32(d+4,e),e)},c.parseExifTags=function(b,c,d,e,f){var g,h,i;if(d+6>b.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,"image/jpeg",e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(a,b,c,d,e,f){a.getContext("2d").drawImage(b,c,d,e,f)}}()})}),b("runtime/html5/jpegencoder",[],function(){function a(a){function b(a){for(var b=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],c=0;64>c;c++){var d=y((b[c]*a+50)/100);1>d?d=1:d>255&&(d=255),z[P[c]]=d}for(var e=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],f=0;64>f;f++){var g=y((e[f]*a+50)/100);1>g?g=1:g>255&&(g=255),A[P[f]]=g}for(var h=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],i=0,j=0;8>j;j++)for(var k=0;8>k;k++)B[i]=1/(z[P[i]]*h[j]*h[k]*8),C[i]=1/(A[P[i]]*h[j]*h[k]*8),i++}function c(a,b){for(var c=0,d=0,e=new Array,f=1;16>=f;f++){for(var g=1;g<=a[f];g++)e[b[d]]=[],e[b[d]][0]=c,e[b[d]][1]=f,d++,c++;c*=2}return e}function d(){t=c(Q,R),u=c(U,V),v=c(S,T),w=c(W,X)}function e(){for(var a=1,b=2,c=1;15>=c;c++){for(var d=a;b>d;d++)E[32767+d]=c,D[32767+d]=[],D[32767+d][1]=c,D[32767+d][0]=d;for(var e=-(b-1);-a>=e;e++)E[32767+e]=c,D[32767+e]=[],D[32767+e][1]=c,D[32767+e][0]=b-1+e;a<<=1,b<<=1}}function f(){for(var a=0;256>a;a++)O[a]=19595*a,O[a+256>>0]=38470*a,O[a+512>>0]=7471*a+32768,O[a+768>>0]=-11059*a,O[a+1024>>0]=-21709*a,O[a+1280>>0]=32768*a+8421375,O[a+1536>>0]=-27439*a,O[a+1792>>0]=-5329*a}function g(a){for(var b=a[0],c=a[1]-1;c>=0;)b&1<<c&&(I|=1<<J),c--,J--,0>J&&(255==I?(h(255),h(0)):h(I),J=7,I=0)}function h(a){H.push(N[a])}function i(a){h(a>>8&255),h(255&a)}function j(a,b){var c,d,e,f,g,h,i,j,k,l=0,m=8,n=64;for(k=0;m>k;++k){c=a[l],d=a[l+1],e=a[l+2],f=a[l+3],g=a[l+4],h=a[l+5],i=a[l+6],j=a[l+7];var o=c+j,p=c-j,q=d+i,r=d-i,s=e+h,t=e-h,u=f+g,v=f-g,w=o+u,x=o-u,y=q+s,z=q-s;a[l]=w+y,a[l+4]=w-y;var A=.707106781*(z+x);a[l+2]=x+A,a[l+6]=x-A,w=v+t,y=t+r,z=r+p;var B=.382683433*(w-z),C=.5411961*w+B,D=1.306562965*z+B,E=.707106781*y,G=p+E,H=p-E;a[l+5]=H+C,a[l+3]=H-C,a[l+1]=G+D,a[l+7]=G-D,l+=8}for(l=0,k=0;m>k;++k){c=a[l],d=a[l+8],e=a[l+16],f=a[l+24],g=a[l+32],h=a[l+40],i=a[l+48],j=a[l+56];var I=c+j,J=c-j,K=d+i,L=d-i,M=e+h,N=e-h,O=f+g,P=f-g,Q=I+O,R=I-O,S=K+M,T=K-M;a[l]=Q+S,a[l+32]=Q-S;var U=.707106781*(T+R);a[l+16]=R+U,a[l+48]=R-U,Q=P+N,S=N+L,T=L+J;var V=.382683433*(Q-T),W=.5411961*Q+V,X=1.306562965*T+V,Y=.707106781*S,Z=J+Y,$=J-Y;a[l+40]=$+W,a[l+24]=$-W,a[l+8]=Z+X,a[l+56]=Z-X,l++}var _;for(k=0;n>k;++k)_=a[k]*b[k],F[k]=_>0?_+.5|0:_-.5|0;return F}function k(){i(65504),i(16),h(74),h(70),h(73),h(70),h(0),h(1),h(1),h(0),i(1),i(1),h(0),h(0)}function l(a,b){i(65472),i(17),h(8),i(b),i(a),h(3),h(1),h(17),h(0),h(2),h(17),h(1),h(3),h(17),h(1)}function m(){i(65499),i(132),h(0);for(var a=0;64>a;a++)h(z[a]);h(1);for(var b=0;64>b;b++)h(A[b])}function n(){i(65476),i(418),h(0);for(var a=0;16>a;a++)h(Q[a+1]);for(var b=0;11>=b;b++)h(R[b]);h(16);for(var c=0;16>c;c++)h(S[c+1]);for(var d=0;161>=d;d++)h(T[d]);h(1);for(var e=0;16>e;e++)h(U[e+1]);for(var f=0;11>=f;f++)h(V[f]);h(17);for(var g=0;16>g;g++)h(W[g+1]);for(var j=0;161>=j;j++)h(X[j])}function o(){i(65498),i(12),h(3),h(1),h(0),h(2),h(17),h(3),h(17),h(0),h(63),h(0)}function p(a,b,c,d,e){for(var f,h=e[0],i=e[240],k=16,l=63,m=64,n=j(a,b),o=0;m>o;++o)G[P[o]]=n[o];var p=G[0]-c;c=G[0],0==p?g(d[0]):(f=32767+p,g(d[E[f]]),g(D[f]));for(var q=63;q>0&&0==G[q];q--);if(0==q)return g(h),c;for(var r,s=1;q>=s;){for(var t=s;0==G[s]&&q>=s;++s);var u=s-t;if(u>=k){r=u>>4;for(var v=1;r>=v;++v)g(i);u=15&u}f=32767+G[s],g(e[(u<<4)+E[f]]),g(D[f]),s++}return q!=l&&g(h),c}function q(){for(var a=String.fromCharCode,b=0;256>b;b++)N[b]=a(b)}function r(a){if(0>=a&&(a=1),a>100&&(a=100),x!=a){var c=0;c=Math.floor(50>a?5e3/a:200-2*a),b(c),x=a}}function s(){a||(a=50),q(),d(),e(),f(),r(a)}var t,u,v,w,x,y=(Math.round,Math.floor),z=new Array(64),A=new Array(64),B=new Array(64),C=new Array(64),D=new Array(65535),E=new Array(65535),F=new Array(64),G=new Array(64),H=[],I=0,J=7,K=new Array(64),L=new Array(64),M=new Array(64),N=new Array(256),O=new Array(2048),P=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],Q=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],R=[0,1,2,3,4,5,6,7,8,9,10,11],S=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],T=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],U=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],V=[0,1,2,3,4,5,6,7,8,9,10,11],W=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],X=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];this.encode=function(a,b){b&&r(b),H=new Array,I=0,J=7,i(65496),k(),m(),l(a.width,a.height),n(),o();var c=0,d=0,e=0;I=0,J=7,this.encode.displayName="_encode_";for(var f,h,j,q,s,x,y,z,A,D=a.data,E=a.width,F=a.height,G=4*E,N=0;F>N;){for(f=0;G>f;){for(s=G*N+f,x=s,y=-1,z=0,A=0;64>A;A++)z=A>>3,y=4*(7&A),x=s+z*G+y,N+z>=F&&(x-=G*(N+1+z-F)),f+y>=G&&(x-=f+y-G+4),h=D[x++],j=D[x++],q=D[x++],K[A]=(O[h]+O[j+256>>0]+O[q+512>>0]>>16)-128,L[A]=(O[h+768>>0]+O[j+1024>>0]+O[q+1280>>0]>>16)-128,M[A]=(O[h+1280>>0]+O[j+1536>>0]+O[q+1792>>0]>>16)-128;c=p(K,B,c,t,v),d=p(L,C,d,u,w),e=p(M,C,e,u,w),f+=32}N+=8}if(J>=0){var P=[];P[1]=J+1,P[0]=(1<<J+1)-1,g(P)}i(65497);var Q="data:image/jpeg;base64,"+btoa(H.join(""));return H=[],Q},s()}return a.encode=function(b,c){var d=new a(c);return d.encode(b)},a}),b("runtime/html5/androidpatch",["runtime/html5/util","runtime/html5/jpegencoder","base"],function(a,b,c){var d,e=a.canvasToDataUrl;a.canvasToDataUrl=function(a,f,g){var h,i,j,k,l;return c.os.android?("image/jpeg"===f&&"undefined"==typeof d&&(k=e.apply(null,arguments),l=k.split(","),k=~l[0].indexOf("base64")?atob(l[1]):decodeURIComponent(l[1]),k=k.substring(0,2),d=255===k.charCodeAt(0)&&216===k.charCodeAt(1)),"image/jpeg"!==f||d?e.apply(null,arguments):(i=a.width,j=a.height,h=a.getContext("2d"),b.encode(h.getImageData(0,0,i,j),g))):e.apply(null,arguments)}}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("webuploader",["base","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","runtime/html5/blob","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/image","runtime/html5/androidpatch","runtime/html5/transport"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.flashonly.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.flashonly.js
new file mode 100644
index 0000000..10f4496
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.flashonly.js
@@ -0,0 +1,4176 @@
+/*! WebUploader 0.1.2 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+        },
+
+        exports = factory( root, _define, _require ),
+        origin;
+
+    // exports every module.
+    exportsTo( exports );
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = exports;
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([], exports );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = exports;
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( this, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        return window.jQuery || window.Zepto;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+    
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+    
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档将可能省略`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+    
+        var noop = function() {},
+            call = Function.call;
+    
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+    
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+    
+        function createObject( proto ) {
+            var f;
+    
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+    
+    
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+    
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.2',
+    
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+    
+            Deferred: promise.Deferred,
+    
+            isPromise: promise.isPromise,
+    
+            when: promise.when,
+    
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+    
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+    
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+    
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+    
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+    
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+    
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+    
+                /* jshint camelcase: false */
+    
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+    
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+    
+                return child;
+            },
+    
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+    
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+    
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+    
+            nextTick: (function() {
+    
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+    
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+    
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+    
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+    
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+    
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+    
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+    
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+    
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+    
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+    
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+    
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+    
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+    
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+    
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+    
+            while ( ++i < len ) {
+                handler = events[ i ];
+    
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+    
+            return !stoped;
+        }
+    
+        protos = {
+    
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+    
+                if ( !callback ) {
+                    return this;
+                }
+    
+                set = this._events || (this._events = []);
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+    
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+    
+                    set.push( handler );
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+    
+                if ( !callback ) {
+                    return me;
+                }
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+    
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+    
+                return me;
+            },
+    
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+    
+                if ( !events ) {
+                    return this;
+                }
+    
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+    
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+    
+                if ( !this._events || !type ) {
+                    return this;
+                }
+    
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+    
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+    
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+    
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+    
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$;
+    
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+    
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+    
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            getRuntimeType: 'get-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+    
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+    
+            _init: function( opts ) {
+                var me = this;
+    
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+    
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     resize: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.options( 'resize', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+    
+                // setter
+                if ( arguments.length > 1 ) {
+    
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+    
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+    
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `queueNum` 还在队列中的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+    
+                return {
+                    successNum: stats.numOfSuccess,
+    
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue
+                };
+            },
+    
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+    
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+    
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+    
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+    
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+    
+                    return false;
+                }
+    
+                return true;
+            },
+    
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+    
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+    
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+    
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            factories = {},
+    
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+    
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+    
+        $.extend( Runtime.prototype, {
+    
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+    
+                if ( this._container ) {
+                    return this._container;
+                }
+    
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+    
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+    
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                return container;
+            },
+    
+            init: Base.noop,
+            exec: Base.noop,
+    
+            destroy: function() {
+                if ( this._container ) {
+                    this._container.parentNode.removeChild( this.__container );
+                }
+    
+                this.off();
+            }
+        });
+    
+        Runtime.orders = 'html5,flash';
+    
+    
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+    
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+    
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+    
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+    
+            type = type || getFirstKey( factories );
+    
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+    
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+    
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+    
+        var cache;
+    
+        cache = (function() {
+            var obj = {};
+    
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+    
+                get: function( ruid, standalone ) {
+                    var i;
+    
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+    
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+    
+                        return obj[ i ];
+                    }
+    
+                    return null;
+                },
+    
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+    
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+    
+            this.uid = Base.guid('client_');
+    
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+    
+            this.connectRuntime = function( opts, cb ) {
+    
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+    
+                deferred.done( cb );
+    
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+    
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+    
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+    
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                runtime.__client--;
+    
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+    
+                runtime = null;
+            };
+    
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+    
+                return runtime.exec.apply( this, args );
+            };
+    
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+    
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+    
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+    
+        function Blob( ruid, source ) {
+            var me = this;
+    
+            me.source = source;
+            me.ruid = ruid;
+    
+            RuntimeClient.call( me, 'Blob' );
+    
+            this.uid = source.uid || this.uid;
+            this.type = source.type || '';
+            this.size = source.size || 0;
+    
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+    
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+    
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+    
+            getSource: function() {
+                return this.source;
+            }
+        });
+    
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+    
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+    
+        function File( ruid, file ) {
+            var ext;
+    
+            Blob.apply( this, arguments );
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+    
+            // todo 支持其他类型文件的转换。
+    
+            // 如果有mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && this.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+    
+            // 如果没有指定mimetype, 但是知道文件后缀。
+            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
+                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
+            }
+    
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+        }
+    
+        return Base.inherits( Blob, File );
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+    
+        var $ = Base.$;
+    
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+    
+            opts.container = $( opts.id );
+    
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+    
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+    
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+    
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+    
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+    
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+    
+                button.addClass('webuploader-pick');
+    
+                me.on( 'all', function( type ) {
+                    var files;
+    
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+    
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+    
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+    
+                $( window ).on( 'resize', function() {
+                    me.refresh();
+                });
+            },
+    
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+    
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+    
+                    pos = button.offset();
+    
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+    
+            enable: function() {
+                var btn = this.options.button;
+    
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+    
+            disable: function() {
+                var btn = this.options.button;
+    
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+    
+                btn.addClass('webuploader-pick-disable');
+            },
+    
+            destroy: function() {
+                if ( this.runtime ) {
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                }
+            }
+        });
+    
+        return FilePicker;
+    });
+    
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+    
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            IGNORE = {},
+            widgetClass = [];
+    
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+    
+            var length = obj.length,
+                type = $.type( obj );
+    
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+    
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+    
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+    
+        $.extend( Widget.prototype, {
+    
+            init: Base.noop,
+    
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+    
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+    
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+    
+                    return IGNORE;
+                }
+    
+                return this[ map[ apiName ] ].apply( this, args );
+    
+            },
+    
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+    
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+    
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [];
+    
+                $.each( widgetClass, function( _, klass ) {
+                    widgets.push( new klass( me ) );
+                });
+    
+                return _init.apply( me, arguments );
+            },
+    
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+    
+                args = isArrayLike( args ) ? args : [ args ];
+    
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+    
+                    if ( rlt !== IGNORE ) {
+    
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+    
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+    
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个tick中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+    
+                                setTimeout(function() {
+                                    deferred.resolve.apply( deferred, args );
+                                }, 1 );
+    
+                                return deferred.promise();
+                            })[ key ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            }
+        });
+    
+        /**
+         * 添加组件
+         * @param  {object} widgetProto 组件原型,构造函数通过constructor属性定义
+         * @param  {object} responseMap API名称与函数实现的映射
+         * @example
+         *     Uploader.register( {
+         *         init: function( options ) {},
+         *         makeThumb: function() {}
+         *     }, {
+         *         'make-thumb': 'makeThumb'
+         *     } );
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init' },
+                klass;
+    
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+                widgetProto.responseMap = map;
+            } else {
+                widgetProto.responseMap = $.extend( map, responseMap );
+            }
+    
+            klass = Base.inherits( Widget, widgetProto );
+            widgetClass.push( klass );
+    
+            return klass;
+        };
+    
+        return Widget;
+    });
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+    
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+    
+        return Uploader.register({
+            'add-btn': 'addButton',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable'
+        }, {
+    
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addButton( opts.pick );
+            },
+    
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+    
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addButton: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    options, picker, deferred;
+    
+                if ( !pick ) {
+                    return;
+                }
+    
+                deferred = Base.Deferred();
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+    
+                options = $.extend({}, pick, {
+                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                    swf: opts.swf,
+                    runtimeOrder: opts.runtimeOrder
+                });
+    
+                picker = new FilePicker( options );
+    
+                picker.once( 'ready', deferred.resolve );
+                picker.on( 'select', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                picker.init();
+    
+                this.pickers.push( picker );
+    
+                return deferred.promise();
+            },
+    
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+    
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+    
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+    
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+    
+        // 默认选项。
+        Image.options = {
+    
+            // 默认的图片处理质量
+            quality: 90,
+    
+            // 是否裁剪
+            crop: false,
+    
+            // 是否保留头部信息
+            preserveHeaders: true,
+    
+            // 是否允许放大。
+            allowMagnify: true
+        };
+    
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+    
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+    
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+    
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+    
+        var $ = Base.$,
+            throttle;
+    
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+    
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+    
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: false,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+    
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+    
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+    
+        return Uploader.register({
+            'make-thumb': 'makeThumb',
+            'before-send-file': 'compressImage'
+        }, {
+    
+    
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             *
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+    
+                opts = $.extend({}, this.options.thumb );
+    
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+    
+                width = width || opts.width;
+                height = height || opts.height;
+    
+                image = new Image( opts );
+    
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( width, height );
+                });
+    
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+    
+                image.once( 'error', function() {
+                    cb( true );
+                    image.destroy();
+                });
+    
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+    
+            compressImage: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 300 * 1024,
+                    image, deferred;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+    
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+    
+                image = new Image( opts );
+    
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( opts.width, opts.height );
+                });
+    
+                image.once( 'complete', function() {
+                    var blob, size;
+    
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+    
+                        size = file.size;
+    
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+    
+                            file.trigger( 'resize', blob.size, size );
+                        }
+    
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+    
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+    
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+    
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+    
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+    
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+    
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+    
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application'
+             */
+            this.type = source.type || 'application';
+    
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+    
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+    
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+    
+    
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+    
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+    
+            this.source = source;
+            this.loaded = 0;
+    
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+    
+        $.extend( WUFile.prototype, {
+    
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+    
+                var prevStatus = statusMap[ this.id ];
+    
+                typeof text !== 'undefined' && (this.statusText = text);
+    
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+    
+            },
+    
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+    
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+    
+            destory: function() {
+                delete statusMap[ this.id ];
+            }
+        });
+    
+        Mediator.installTo( WUFile.prototype );
+    
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+    
+        return WUFile;
+    });
+    
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+    
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+    
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+    
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被移除的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0
+            };
+    
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+    
+            // 存储所有文件
+            this._map = {};
+        }
+    
+        $.extend( Queue.prototype, {
+    
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+    
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+    
+                status = status || STATUS.QUEUED;
+    
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+    
+                return null;
+            },
+    
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+    
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+    
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+    
+                    ret.push( file );
+                }
+    
+                return ret;
+            },
+    
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+    
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+    
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+    
+                file.setStatus( STATUS.QUEUED );
+            },
+    
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+    
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+    
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+                }
+    
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+    
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+    
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+    
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+                }
+            }
+    
+        });
+    
+        Mediator.installTo( Queue.prototype );
+    
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+    
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+    
+        return Uploader.register({
+            'sort-files': 'sortFiles',
+            'add-file': 'addFiles',
+            'get-file': 'getFile',
+            'fetch-file': 'fetchFile',
+            'get-stats': 'getStats',
+            'get-files': 'getFiles',
+            'remove-file': 'removeFile',
+            'retry': 'retry',
+            'reset': 'reset',
+            'accept-file': 'acceptFile'
+        }, {
+    
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+    
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+    
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+    
+                    me.accept = new RegExp( accept, 'i' );
+                }
+    
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+    
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+    
+    
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+    
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+    
+                    file = new WUFile( file );
+                }
+    
+                return file;
+            },
+    
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || file.size < 6 || this.accept &&
+    
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+    
+                return !invalid;
+            },
+    
+    
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+    
+            _addFile: function( file ) {
+                var me = this;
+    
+                file = me._wrapFile( file );
+    
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+    
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+    
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+    
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+    
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFiles: function( files ) {
+                var me = this;
+    
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+    
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+    
+                me.owner.trigger( 'filesQueued', files );
+    
+                if ( me.options.auto ) {
+                    me.request('start-upload');
+                }
+            },
+    
+            getStats: function() {
+                return this.stats;
+            },
+    
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file ) {
+                var me = this;
+    
+                file = file.id ? file : me.queue.getFile( file );
+    
+                file.setStatus( Status.CANCELLED );
+                me.owner.trigger( 'fileDequeued', file );
+            },
+    
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+    
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+    
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+    
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+    
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+    
+                me.request('start-upload');
+            },
+    
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            }
+        });
+    
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+    
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+    
+        return Uploader.register({
+            'predict-runtime-type': 'predictRuntmeType'
+        }, {
+    
+            init: function() {
+                if ( !this.predictRuntmeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+    
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntmeType() => String
+             * @method predictRuntmeType
+             * @for  Uploader
+             */
+            predictRuntmeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+    
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+    
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+    
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+    
+        var $ = Base.$;
+    
+        function Transport( opts ) {
+            var me = this;
+    
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+    
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+    
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+    
+        Transport.options = {
+            server: '',
+            method: 'POST',
+    
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+    
+        $.extend( Transport.prototype, {
+    
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+    
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+    
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+    
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+    
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+    
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+    
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+    
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+    
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+    
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+    
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+    
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+    
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+    
+                if ( !duration ) {
+                    return;
+                }
+    
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+    
+        });
+    
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+    
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+    
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+    
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+    
+    
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+    
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+    
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+    
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+    
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+    
+    
+            /**
+             * @property {Object} [formData]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: null
+    
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+    
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+    
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+    
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len;
+    
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+    
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++
+                });
+                start += len;
+            }
+    
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+    
+            return {
+                file: file,
+    
+                has: function() {
+                    return !!pending.length;
+                },
+    
+                fetch: function() {
+                    return pending.shift();
+                }
+            };
+        }
+    
+        Uploader.register({
+            'start-upload': 'start',
+            'stop-upload': 'stop',
+            'skip-file': 'skipFile',
+            'is-in-progress': 'isInProgress'
+        }, {
+    
+            init: function() {
+                var owner = this.owner;
+    
+                this.runing = false;
+    
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+    
+                // 缓存即将上传的文件。
+                this.pending = [];
+    
+                // 跟踪还有多少分片没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+    
+                owner.on( 'uploadComplete', function( file ) {
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+    
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+    
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             * @grammar upload() => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            start: function() {
+                var me = this;
+    
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+    
+                if ( me.runing ) {
+                    return;
+                }
+    
+                me.runing = true;
+    
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+    
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        file.setStatus( Status.PROGRESS );
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+    
+                me._trigged = false;
+                me.owner.trigger('startUpload');
+                Base.nextTick( me.__tick );
+            },
+    
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stop: function( interrupt ) {
+                var me = this;
+    
+                if ( me.runing === false ) {
+                    return;
+                }
+    
+                me.runing = false;
+    
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+    
+                me.owner.trigger('stopUpload');
+            },
+    
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.runing;
+            },
+    
+            getStats: function() {
+                return this.request('get-stats');
+            },
+    
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = this.request( 'get-file', file );
+    
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+    
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+    
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+    
+                this.owner.trigger( 'uploadSkip', file );
+            },
+    
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+    
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+    
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+    
+                    fn = function( val ) {
+                        me._promise = null;
+    
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+    
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+    
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me.getStats().numOfQueue ) {
+                    me.runing = false;
+    
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+    
+            _nextBlock: function() {
+                var me = this,
+                    act = me._act,
+                    opts = me.options,
+                    next, done;
+    
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( act && act.has() &&
+                        act.file.getStatus() === Status.PROGRESS ) {
+    
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+    
+                    return act.fetch();
+    
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+    
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me.getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+    
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+    
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me._act = act;
+                        return act.fetch();
+                    };
+    
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    return isPromise( next ) ?
+                            next[ next.pipe ? 'pipe' : 'then']( done ) :
+                            done( next );
+                }
+            },
+    
+    
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+    
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+    
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.QUEUED ) {
+                            me.owner.trigger( 'uploadStart', file );
+                            file.setStatus( Status.PROGRESS );
+                            return file;
+                        }
+    
+                        return me._finishFile( file );
+                    });
+    
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+    
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+    
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+    
+                    pending.push( promise );
+                }
+            },
+    
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+    
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+    
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+    
+                me.pool.push( block );
+                me.remaning++;
+    
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+    
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+    
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+    
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+    
+    
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+    
+    
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+    
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+    
+                block.transport = tr;
+    
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+    
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    var totalPercent = 0,
+                        uploaded = 0;
+    
+                    // 可能没有abort掉,progress还是执行进来了。
+                    // if ( !file.blocks ) {
+                    //     return;
+                    // }
+    
+                    totalPercent = block.percentage = percentage;
+    
+                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。
+                        $.each( file.blocks, function( _, v ) {
+                            uploaded += (v.percentage || 0) * (v.end - v.start);
+                        });
+    
+                        totalPercent = uploaded / file.size;
+                    }
+    
+                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+                });
+    
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+    
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+    
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+    
+                    return reject;
+                };
+    
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+    
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+    
+                        block.retried++;
+                        tr.send();
+    
+                    } else {
+    
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+    
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+    
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+    
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+    
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+    
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+    
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+    
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+    
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+    
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+    
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+    
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+    
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            }
+    
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+    
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+    
+        var $ = Base.$,
+            validators = {},
+            api;
+    
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * @for  Uploader
+         */
+    
+        // 暴露给外面的api
+        api = {
+    
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+    
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+    
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            init: function() {
+                var me = this;
+                $.each( validators, function() {
+                    this.call( me.owner );
+                });
+            }
+        });
+    
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileNumLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return count >= max ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+    
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+    
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileSizeLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+    
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return invalid ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', file );
+                    return false;
+                }
+    
+            });
+    
+        });
+    
+        /**
+         * @property {int} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+    
+            if ( opts.duplicate ) {
+                return;
+            }
+    
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+    
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+    
+                return hash;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+    
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (mapping[ hash ] = true);
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (delete mapping[ hash ]);
+            });
+        });
+    
+        return api;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+    
+        function CompBase( owner, runtime ) {
+    
+            this.owner = owner;
+            this.options = owner.options;
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+    
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+    
+        return CompBase;
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+    
+    
+        function getFlashVersion() {
+            var version;
+    
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+    
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destory = this.destory,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                clients[ uid ] = client;
+    
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+    
+                    instance = pool[ uid ];
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+    
+                return me.flashExec.apply( client, arguments );
+            };
+    
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+    
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+    
+                // console.log.apply( console, arguments );
+    
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+    
+                // Base.log( evt, obj );
+            }
+    
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+    
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+    
+            this.jsreciver = jsreciver;
+    
+            this.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+    
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+    
+                return flash.exec( this.uid, comp, fn, args );
+            };
+    
+            // @todo
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+    
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+    
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+    
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+    
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+    
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+    
+                container.html( html );
+            },
+    
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+    
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+    
+        });
+    
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+    
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+    
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+    
+            return component;
+        };
+    
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+    
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+    
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+    
+                delete copy.button;
+                delete copy.container;
+    
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * @fileOverview 图片压缩
+     */
+    define('runtime/flash/image',[
+        'runtime/flash/runtime'
+    ], function( FlashRuntime ) {
+    
+        return FlashRuntime.register( 'Image', {
+            // init: function( options ) {
+            //     var owner = this.owner;
+    
+            //     this.flashExec( 'Image', 'init', options );
+            //     owner.on( 'load', function() {
+            //         debugger;
+            //     });
+            // },
+    
+            loadFromBlob: function( blob ) {
+                var owner = this.owner;
+    
+                owner.info() && this.flashExec( 'Image', 'info', owner.info() );
+                owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );
+    
+                this.flashExec( 'Image', 'loadFromBlob', blob.uid );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+    
+                xhr.connectRuntime( blob.ruid );
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+    
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server
+                }, binary );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+    
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    return me.trigger( 'progress', e.loaded / e.total );
+                });
+    
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        err = '';
+    
+                    xhr.off();
+                    me._xhr = null;
+    
+                    if ( status >= 200 && status < 300 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                    } else if ( status >= 500 && status < 600 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+    
+                    xhr.destroy();
+                    xhr = null;
+    
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+    
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview 只有flash实现的文件版本。
+     */
+    define('preset/flashonly',[
+        'base',
+    
+        // widgets
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+    
+        // runtimes
+    
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/image',
+        'runtime/flash/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/flashonly'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.flashonly.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.flashonly.min.js
new file mode 100644
index 0000000..49c6b50
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.flashonly.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",getDimension:"get-dimension",addButton:"add-btn",getRuntimeType:"get-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){b._info=b._info||d.info(),b._meta=b._meta||d.meta(),d.resize(g.width,g.height)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,a.size<c&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destory:function(){delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d.getStats().numOfQueue||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_nextBlock:function(){var a,b,c=this,d=c._act,f=c.options;return d&&d.has()&&d.file.getStatus()===h.PROGRESS?(f.prepareNextFile&&!c.pending.length&&c._prepareNextFile(),d.fetch()):c.runing?(!c.pending.length&&c.getStats().numOfQueue&&c._prepareNextFile(),a=c.pending.shift(),b=function(a){return a?(d=e(a,f.chunked?f.chunkSize:0),c._act=d,d.fetch()):null},g(a)?a[a.pipe?"pipe":"then"](b):b(a)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.QUEUED?(b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),c):b._finishFile(c)}),a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d._popBlock(b),a.nextTick(d.__tick))})},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){var c=0,d=0;c=b.percentage=a,b.chunks>1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destory,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destory=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){}})}),b("runtime/flash/image",["runtime/flash/runtime"],function(a){return a.register("Image",{loadFromBlob:function(a){var b=this.owner;b.info()&&this.flashExec("Image","info",b.info()),b.meta()&&this.flashExec("Image","meta",b.meta()),this.flashExec("Image","loadFromBlob",a.uid)}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(a,b,c){var d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,e=this._initAjax(),f=b._blob,g=c.server;e.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+d.param(b._formData),a=f.uid):(d.each(b._formData,function(a,b){e.exec("append",a,b)
+}),e.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(e,c.headers),e.exec("send",{method:c.method,url:g},a)},getStatus:function(){return this._status},getResponse:function(){return this._response},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new c("XMLHttpRequest");return b.on("uploadprogress progress",function(b){return a.trigger("progress",b.loaded/b.total)}),b.on("load",function(){var c=b.exec("getStatus"),d="";return b.off(),a._xhr=null,c>=200&&300>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson")):c>=500&&600>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson"),d="server"):d="http",b.destroy(),b=null,d?a.trigger("error",d):a.trigger("load")}),b.on("error",function(){b.off(),a._xhr=null,a.trigger("error","http")}),a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("preset/flashonly",["base","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/flash/filepicker","runtime/flash/image","runtime/flash/transport"],function(a){return a}),b("webuploader",["preset/flashonly"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.html5only.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.html5only.js
new file mode 100644
index 0000000..5dd4813
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.html5only.js
@@ -0,0 +1,5559 @@
+/*! WebUploader 0.1.2 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+        },
+
+        exports = factory( root, _define, _require ),
+        origin;
+
+    // exports every module.
+    exportsTo( exports );
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = exports;
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([], exports );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = exports;
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( this, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        return window.jQuery || window.Zepto;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+    
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+    
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档将可能省略`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+    
+        var noop = function() {},
+            call = Function.call;
+    
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+    
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+    
+        function createObject( proto ) {
+            var f;
+    
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+    
+    
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+    
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.2',
+    
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+    
+            Deferred: promise.Deferred,
+    
+            isPromise: promise.isPromise,
+    
+            when: promise.when,
+    
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+    
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+    
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+    
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+    
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+    
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+    
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+    
+                /* jshint camelcase: false */
+    
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+    
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+    
+                return child;
+            },
+    
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+    
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+    
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+    
+            nextTick: (function() {
+    
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+    
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+    
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+    
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+    
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+    
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+    
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+    
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+    
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+    
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+    
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+    
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+    
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+    
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+    
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+    
+            while ( ++i < len ) {
+                handler = events[ i ];
+    
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+    
+            return !stoped;
+        }
+    
+        protos = {
+    
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+    
+                if ( !callback ) {
+                    return this;
+                }
+    
+                set = this._events || (this._events = []);
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+    
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+    
+                    set.push( handler );
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+    
+                if ( !callback ) {
+                    return me;
+                }
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+    
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+    
+                return me;
+            },
+    
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+    
+                if ( !events ) {
+                    return this;
+                }
+    
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+    
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+    
+                if ( !this._events || !type ) {
+                    return this;
+                }
+    
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+    
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+    
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+    
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+    
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$;
+    
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+    
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+    
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            getRuntimeType: 'get-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+    
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+    
+            _init: function( opts ) {
+                var me = this;
+    
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+    
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     resize: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.options( 'resize', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+    
+                // setter
+                if ( arguments.length > 1 ) {
+    
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+    
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+    
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `queueNum` 还在队列中的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+    
+                return {
+                    successNum: stats.numOfSuccess,
+    
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue
+                };
+            },
+    
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+    
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+    
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+    
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+    
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+    
+                    return false;
+                }
+    
+                return true;
+            },
+    
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+    
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+    
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+    
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            factories = {},
+    
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+    
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+    
+        $.extend( Runtime.prototype, {
+    
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+    
+                if ( this._container ) {
+                    return this._container;
+                }
+    
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+    
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+    
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                return container;
+            },
+    
+            init: Base.noop,
+            exec: Base.noop,
+    
+            destroy: function() {
+                if ( this._container ) {
+                    this._container.parentNode.removeChild( this.__container );
+                }
+    
+                this.off();
+            }
+        });
+    
+        Runtime.orders = 'html5,flash';
+    
+    
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+    
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+    
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+    
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+    
+            type = type || getFirstKey( factories );
+    
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+    
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+    
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+    
+        var cache;
+    
+        cache = (function() {
+            var obj = {};
+    
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+    
+                get: function( ruid, standalone ) {
+                    var i;
+    
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+    
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+    
+                        return obj[ i ];
+                    }
+    
+                    return null;
+                },
+    
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+    
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+    
+            this.uid = Base.guid('client_');
+    
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+    
+            this.connectRuntime = function( opts, cb ) {
+    
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+    
+                deferred.done( cb );
+    
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+    
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+    
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+    
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                runtime.__client--;
+    
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+    
+                runtime = null;
+            };
+    
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+    
+                return runtime.exec.apply( this, args );
+            };
+    
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+    
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+    
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+    
+            opts.container = $( opts.container );
+    
+            if ( !opts.container.length ) {
+                return;
+            }
+    
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+    
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.disconnectRuntime();
+            }
+        });
+    
+        Mediator.installTo( DragAndDrop.prototype );
+    
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+    
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            IGNORE = {},
+            widgetClass = [];
+    
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+    
+            var length = obj.length,
+                type = $.type( obj );
+    
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+    
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+    
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+    
+        $.extend( Widget.prototype, {
+    
+            init: Base.noop,
+    
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+    
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+    
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+    
+                    return IGNORE;
+                }
+    
+                return this[ map[ apiName ] ].apply( this, args );
+    
+            },
+    
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+    
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+    
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [];
+    
+                $.each( widgetClass, function( _, klass ) {
+                    widgets.push( new klass( me ) );
+                });
+    
+                return _init.apply( me, arguments );
+            },
+    
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+    
+                args = isArrayLike( args ) ? args : [ args ];
+    
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+    
+                    if ( rlt !== IGNORE ) {
+    
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+    
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+    
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个tick中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+    
+                                setTimeout(function() {
+                                    deferred.resolve.apply( deferred, args );
+                                }, 1 );
+    
+                                return deferred.promise();
+                            })[ key ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            }
+        });
+    
+        /**
+         * 添加组件
+         * @param  {object} widgetProto 组件原型,构造函数通过constructor属性定义
+         * @param  {object} responseMap API名称与函数实现的映射
+         * @example
+         *     Uploader.register( {
+         *         init: function( options ) {},
+         *         makeThumb: function() {}
+         *     }, {
+         *         'make-thumb': 'makeThumb'
+         *     } );
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init' },
+                klass;
+    
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+                widgetProto.responseMap = map;
+            } else {
+                widgetProto.responseMap = $.extend( map, responseMap );
+            }
+    
+            klass = Base.inherits( Widget, widgetProto );
+            widgetClass.push( klass );
+    
+            return klass;
+        };
+    
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+    
+        Uploader.options.dnd = '';
+    
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+    
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+    
+                dnd = new Dnd( options );
+    
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+    
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+    
+                dnd.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.exec('destroy');
+                this.disconnectRuntime();
+                this.off();
+            }
+        });
+    
+        Mediator.installTo( FilePaste.prototype );
+    
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+    
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+    
+                paste = new FilePaste( options );
+    
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+    
+        function Blob( ruid, source ) {
+            var me = this;
+    
+            me.source = source;
+            me.ruid = ruid;
+    
+            RuntimeClient.call( me, 'Blob' );
+    
+            this.uid = source.uid || this.uid;
+            this.type = source.type || '';
+            this.size = source.size || 0;
+    
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+    
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+    
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+    
+            getSource: function() {
+                return this.source;
+            }
+        });
+    
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+    
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+    
+        function File( ruid, file ) {
+            var ext;
+    
+            Blob.apply( this, arguments );
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+    
+            // todo 支持其他类型文件的转换。
+    
+            // 如果有mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && this.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+    
+            // 如果没有指定mimetype, 但是知道文件后缀。
+            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
+                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
+            }
+    
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+        }
+    
+        return Base.inherits( Blob, File );
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+    
+        var $ = Base.$;
+    
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+    
+            opts.container = $( opts.id );
+    
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+    
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+    
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+    
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+    
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+    
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+    
+                button.addClass('webuploader-pick');
+    
+                me.on( 'all', function( type ) {
+                    var files;
+    
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+    
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+    
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+    
+                $( window ).on( 'resize', function() {
+                    me.refresh();
+                });
+            },
+    
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+    
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+    
+                    pos = button.offset();
+    
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+    
+            enable: function() {
+                var btn = this.options.button;
+    
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+    
+            disable: function() {
+                var btn = this.options.button;
+    
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+    
+                btn.addClass('webuploader-pick-disable');
+            },
+    
+            destroy: function() {
+                if ( this.runtime ) {
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                }
+            }
+        });
+    
+        return FilePicker;
+    });
+    
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+    
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+    
+        return Uploader.register({
+            'add-btn': 'addButton',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable'
+        }, {
+    
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addButton( opts.pick );
+            },
+    
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+    
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addButton: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    options, picker, deferred;
+    
+                if ( !pick ) {
+                    return;
+                }
+    
+                deferred = Base.Deferred();
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+    
+                options = $.extend({}, pick, {
+                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                    swf: opts.swf,
+                    runtimeOrder: opts.runtimeOrder
+                });
+    
+                picker = new FilePicker( options );
+    
+                picker.once( 'ready', deferred.resolve );
+                picker.on( 'select', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                picker.init();
+    
+                this.pickers.push( picker );
+    
+                return deferred.promise();
+            },
+    
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+    
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+    
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+    
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+    
+        // 默认选项。
+        Image.options = {
+    
+            // 默认的图片处理质量
+            quality: 90,
+    
+            // 是否裁剪
+            crop: false,
+    
+            // 是否保留头部信息
+            preserveHeaders: true,
+    
+            // 是否允许放大。
+            allowMagnify: true
+        };
+    
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+    
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+    
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+    
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+    
+        var $ = Base.$,
+            throttle;
+    
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+    
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+    
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: false,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+    
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+    
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+    
+        return Uploader.register({
+            'make-thumb': 'makeThumb',
+            'before-send-file': 'compressImage'
+        }, {
+    
+    
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             *
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+    
+                opts = $.extend({}, this.options.thumb );
+    
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+    
+                width = width || opts.width;
+                height = height || opts.height;
+    
+                image = new Image( opts );
+    
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( width, height );
+                });
+    
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+    
+                image.once( 'error', function() {
+                    cb( true );
+                    image.destroy();
+                });
+    
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+    
+            compressImage: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 300 * 1024,
+                    image, deferred;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+    
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+    
+                image = new Image( opts );
+    
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( opts.width, opts.height );
+                });
+    
+                image.once( 'complete', function() {
+                    var blob, size;
+    
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+    
+                        size = file.size;
+    
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+    
+                            file.trigger( 'resize', blob.size, size );
+                        }
+    
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+    
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+    
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+    
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+    
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+    
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+    
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+    
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application'
+             */
+            this.type = source.type || 'application';
+    
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+    
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+    
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+    
+    
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+    
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+    
+            this.source = source;
+            this.loaded = 0;
+    
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+    
+        $.extend( WUFile.prototype, {
+    
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+    
+                var prevStatus = statusMap[ this.id ];
+    
+                typeof text !== 'undefined' && (this.statusText = text);
+    
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+    
+            },
+    
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+    
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+    
+            destory: function() {
+                delete statusMap[ this.id ];
+            }
+        });
+    
+        Mediator.installTo( WUFile.prototype );
+    
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+    
+        return WUFile;
+    });
+    
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+    
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+    
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+    
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被移除的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0
+            };
+    
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+    
+            // 存储所有文件
+            this._map = {};
+        }
+    
+        $.extend( Queue.prototype, {
+    
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+    
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+    
+                status = status || STATUS.QUEUED;
+    
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+    
+                return null;
+            },
+    
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+    
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+    
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+    
+                    ret.push( file );
+                }
+    
+                return ret;
+            },
+    
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+    
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+    
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+    
+                file.setStatus( STATUS.QUEUED );
+            },
+    
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+    
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+    
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+                }
+    
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+    
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+    
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+    
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+                }
+            }
+    
+        });
+    
+        Mediator.installTo( Queue.prototype );
+    
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+    
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+    
+        return Uploader.register({
+            'sort-files': 'sortFiles',
+            'add-file': 'addFiles',
+            'get-file': 'getFile',
+            'fetch-file': 'fetchFile',
+            'get-stats': 'getStats',
+            'get-files': 'getFiles',
+            'remove-file': 'removeFile',
+            'retry': 'retry',
+            'reset': 'reset',
+            'accept-file': 'acceptFile'
+        }, {
+    
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+    
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+    
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+    
+                    me.accept = new RegExp( accept, 'i' );
+                }
+    
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+    
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+    
+    
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+    
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+    
+                    file = new WUFile( file );
+                }
+    
+                return file;
+            },
+    
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || file.size < 6 || this.accept &&
+    
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+    
+                return !invalid;
+            },
+    
+    
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+    
+            _addFile: function( file ) {
+                var me = this;
+    
+                file = me._wrapFile( file );
+    
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+    
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+    
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+    
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+    
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFiles: function( files ) {
+                var me = this;
+    
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+    
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+    
+                me.owner.trigger( 'filesQueued', files );
+    
+                if ( me.options.auto ) {
+                    me.request('start-upload');
+                }
+            },
+    
+            getStats: function() {
+                return this.stats;
+            },
+    
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file ) {
+                var me = this;
+    
+                file = file.id ? file : me.queue.getFile( file );
+    
+                file.setStatus( Status.CANCELLED );
+                me.owner.trigger( 'fileDequeued', file );
+            },
+    
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+    
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+    
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+    
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+    
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+    
+                me.request('start-upload');
+            },
+    
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            }
+        });
+    
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+    
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+    
+        return Uploader.register({
+            'predict-runtime-type': 'predictRuntmeType'
+        }, {
+    
+            init: function() {
+                if ( !this.predictRuntmeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+    
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntmeType() => String
+             * @method predictRuntmeType
+             * @for  Uploader
+             */
+            predictRuntmeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+    
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+    
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+    
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+    
+        var $ = Base.$;
+    
+        function Transport( opts ) {
+            var me = this;
+    
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+    
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+    
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+    
+        Transport.options = {
+            server: '',
+            method: 'POST',
+    
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+    
+        $.extend( Transport.prototype, {
+    
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+    
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+    
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+    
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+    
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+    
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+    
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+    
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+    
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+    
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+    
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+    
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+    
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+    
+                if ( !duration ) {
+                    return;
+                }
+    
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+    
+        });
+    
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+    
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+    
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+    
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+    
+    
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+    
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+    
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+    
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+    
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+    
+    
+            /**
+             * @property {Object} [formData]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: null
+    
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+    
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+    
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+    
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len;
+    
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+    
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++
+                });
+                start += len;
+            }
+    
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+    
+            return {
+                file: file,
+    
+                has: function() {
+                    return !!pending.length;
+                },
+    
+                fetch: function() {
+                    return pending.shift();
+                }
+            };
+        }
+    
+        Uploader.register({
+            'start-upload': 'start',
+            'stop-upload': 'stop',
+            'skip-file': 'skipFile',
+            'is-in-progress': 'isInProgress'
+        }, {
+    
+            init: function() {
+                var owner = this.owner;
+    
+                this.runing = false;
+    
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+    
+                // 缓存即将上传的文件。
+                this.pending = [];
+    
+                // 跟踪还有多少分片没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+    
+                owner.on( 'uploadComplete', function( file ) {
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+    
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+    
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             * @grammar upload() => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            start: function() {
+                var me = this;
+    
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+    
+                if ( me.runing ) {
+                    return;
+                }
+    
+                me.runing = true;
+    
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+    
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        file.setStatus( Status.PROGRESS );
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+    
+                me._trigged = false;
+                me.owner.trigger('startUpload');
+                Base.nextTick( me.__tick );
+            },
+    
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stop: function( interrupt ) {
+                var me = this;
+    
+                if ( me.runing === false ) {
+                    return;
+                }
+    
+                me.runing = false;
+    
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+    
+                me.owner.trigger('stopUpload');
+            },
+    
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.runing;
+            },
+    
+            getStats: function() {
+                return this.request('get-stats');
+            },
+    
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = this.request( 'get-file', file );
+    
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+    
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+    
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+    
+                this.owner.trigger( 'uploadSkip', file );
+            },
+    
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+    
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+    
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+    
+                    fn = function( val ) {
+                        me._promise = null;
+    
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+    
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+    
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me.getStats().numOfQueue ) {
+                    me.runing = false;
+    
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+    
+            _nextBlock: function() {
+                var me = this,
+                    act = me._act,
+                    opts = me.options,
+                    next, done;
+    
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( act && act.has() &&
+                        act.file.getStatus() === Status.PROGRESS ) {
+    
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+    
+                    return act.fetch();
+    
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+    
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me.getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+    
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+    
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me._act = act;
+                        return act.fetch();
+                    };
+    
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    return isPromise( next ) ?
+                            next[ next.pipe ? 'pipe' : 'then']( done ) :
+                            done( next );
+                }
+            },
+    
+    
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+    
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+    
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.QUEUED ) {
+                            me.owner.trigger( 'uploadStart', file );
+                            file.setStatus( Status.PROGRESS );
+                            return file;
+                        }
+    
+                        return me._finishFile( file );
+                    });
+    
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+    
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+    
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+    
+                    pending.push( promise );
+                }
+            },
+    
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+    
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+    
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+    
+                me.pool.push( block );
+                me.remaning++;
+    
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+    
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+    
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+    
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+    
+    
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+    
+    
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+    
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+    
+                block.transport = tr;
+    
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+    
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    var totalPercent = 0,
+                        uploaded = 0;
+    
+                    // 可能没有abort掉,progress还是执行进来了。
+                    // if ( !file.blocks ) {
+                    //     return;
+                    // }
+    
+                    totalPercent = block.percentage = percentage;
+    
+                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。
+                        $.each( file.blocks, function( _, v ) {
+                            uploaded += (v.percentage || 0) * (v.end - v.start);
+                        });
+    
+                        totalPercent = uploaded / file.size;
+                    }
+    
+                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+                });
+    
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+    
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+    
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+    
+                    return reject;
+                };
+    
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+    
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+    
+                        block.retried++;
+                        tr.send();
+    
+                    } else {
+    
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+    
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+    
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+    
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+    
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+    
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+    
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+    
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+    
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+    
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+    
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+    
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+    
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            }
+    
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+    
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+    
+        var $ = Base.$,
+            validators = {},
+            api;
+    
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * @for  Uploader
+         */
+    
+        // 暴露给外面的api
+        api = {
+    
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+    
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+    
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            init: function() {
+                var me = this;
+                $.each( validators, function() {
+                    this.call( me.owner );
+                });
+            }
+        });
+    
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileNumLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return count >= max ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+    
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+    
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileSizeLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+    
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return invalid ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', file );
+                    return false;
+                }
+    
+            });
+    
+        });
+    
+        /**
+         * @property {int} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+    
+            if ( opts.duplicate ) {
+                return;
+            }
+    
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+    
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+    
+                return hash;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+    
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (mapping[ hash ] = true);
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (delete mapping[ hash ]);
+            });
+        });
+    
+        return api;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+    
+        function CompBase( owner, runtime ) {
+    
+            this.owner = owner;
+            this.options = owner.options;
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+    
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+    
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var type = 'html5',
+            components = {};
+    
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destory = this.destory;
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+    
+            me.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+    
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+    
+        });
+    
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+    
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+    
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+    
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+    
+                blob = slice.call( blob, start, end );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+    
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+    
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+    
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+    
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+    
+                e = e.originalEvent || e;
+    
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+    
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+    
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+    
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+    
+    
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+    
+                return false;
+            },
+    
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+    
+                return false;
+            },
+    
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+    
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+    
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+    
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 );
+    
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                me._getTansferFiles( e, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+    
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+    
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( e, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, dataTransfer, file, item, i, len, canAccessFolder;
+    
+                e = e.originalEvent || e;
+    
+                dataTransfer = e.dataTransfer;
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+    
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+    
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+    
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+    
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+    
+                Base.when.apply( Base, promises ).done(function() {
+    
+                    if ( !results.length ) {
+                        return;
+                    }
+    
+                    callback( results );
+                });
+            },
+    
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+    
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+    
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+    
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+    
+                return deferred.promise();
+            },
+    
+            destroy: function() {
+                var elem = this.elem;
+    
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragEnterHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+    
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+    
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+    
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+    
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+    
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+    
+                    allowed.push( new File( ruid, blob ) );
+                }
+    
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+    
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var $ = Base.$;
+    
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    lable = $( document.createElement('label') ),
+                    input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+    
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+    
+                lable.on( 'click', function() {
+                    input.trigger('click');
+                });
+    
+                lable.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+    
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+    
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+    
+                    input.attr( 'accept', arr.join(',') );
+                }
+    
+                container.append( input );
+                container.append( lable );
+    
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+    
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+    
+                    me.files = e.target.files;
+    
+                    // reset input
+                    clone = this.cloneNode( true );
+                    this.parentNode.replaceChild( clone, this );
+    
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+    
+                    owner.trigger('change');
+                });
+    
+                lable.on( 'mouseenter mouseleave', mouseHandler );
+    
+            },
+    
+    
+            getFiles: function() {
+                return this.files;
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/util',[
+        'base'
+    ], function( Base ) {
+    
+        var urlAPI = window.createObjectURL && window ||
+                window.URL && URL.revokeObjectURL && URL ||
+                window.webkitURL,
+            createObjectURL = Base.noop,
+            revokeObjectURL = createObjectURL;
+    
+        if ( urlAPI ) {
+    
+            // 更安全的方式调用,比如android里面就能把context改成其他的对象。
+            createObjectURL = function() {
+                return urlAPI.createObjectURL.apply( urlAPI, arguments );
+            };
+    
+            revokeObjectURL = function() {
+                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
+            };
+        }
+    
+        return {
+            createObjectURL: createObjectURL,
+            revokeObjectURL: revokeObjectURL,
+    
+            dataURL2Blob: function( dataURI ) {
+                var byteStr, intArray, ab, i, mimetype, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                ab = new ArrayBuffer( byteStr.length );
+                intArray = new Uint8Array( ab );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
+    
+                return this.arrayBufferToBlob( ab, mimetype );
+            },
+    
+            dataURL2ArrayBuffer: function( dataURI ) {
+                var byteStr, intArray, i, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                intArray = new Uint8Array( byteStr.length );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                return intArray.buffer;
+            },
+    
+            arrayBufferToBlob: function( buffer, type ) {
+                var builder = window.BlobBuilder || window.WebKitBlobBuilder,
+                    bb;
+    
+                // android不支持直接new Blob, 只能借助blobbuilder.
+                if ( builder ) {
+                    bb = new builder();
+                    bb.append( buffer );
+                    return bb.getBlob( type );
+                }
+    
+                return new Blob([ buffer ], type ? { type: type } : {} );
+            },
+    
+            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
+            // 你得到的结果是png.
+            canvasToDataUrl: function( canvas, type, quality ) {
+                return canvas.toDataURL( type, quality / 100 );
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            parseMeta: function( blob, callback ) {
+                callback( false, {});
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            updateImageHead: function( data ) {
+                return data;
+            }
+        };
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/imagemeta',[
+        'runtime/html5/util'
+    ], function( Util ) {
+    
+        var api;
+    
+        api = {
+            parsers: {
+                0xffe1: []
+            },
+    
+            maxMetaDataSize: 262144,
+    
+            parse: function( blob, cb ) {
+                var me = this,
+                    fr = new FileReader();
+    
+                fr.onload = function() {
+                    cb( false, me._parse( this.result ) );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                fr.onerror = function( e ) {
+                    cb( e.message );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                blob = blob.slice( 0, me.maxMetaDataSize );
+                fr.readAsArrayBuffer( blob.getSource() );
+            },
+    
+            _parse: function( buffer, noParse ) {
+                if ( buffer.byteLength < 6 ) {
+                    return;
+                }
+    
+                var dataview = new DataView( buffer ),
+                    offset = 2,
+                    maxOffset = dataview.byteLength - 4,
+                    headLength = offset,
+                    ret = {},
+                    markerBytes, markerLength, parsers, i;
+    
+                if ( dataview.getUint16( 0 ) === 0xffd8 ) {
+    
+                    while ( offset < maxOffset ) {
+                        markerBytes = dataview.getUint16( offset );
+    
+                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
+                                markerBytes === 0xfffe ) {
+    
+                            markerLength = dataview.getUint16( offset + 2 ) + 2;
+    
+                            if ( offset + markerLength > dataview.byteLength ) {
+                                break;
+                            }
+    
+                            parsers = api.parsers[ markerBytes ];
+    
+                            if ( !noParse && parsers ) {
+                                for ( i = 0; i < parsers.length; i += 1 ) {
+                                    parsers[ i ].call( api, dataview, offset,
+                                            markerLength, ret );
+                                }
+                            }
+    
+                            offset += markerLength;
+                            headLength = offset;
+                        } else {
+                            break;
+                        }
+                    }
+    
+                    if ( headLength > 6 ) {
+                        if ( buffer.slice ) {
+                            ret.imageHead = buffer.slice( 2, headLength );
+                        } else {
+                            // Workaround for IE10, which does not yet
+                            // support ArrayBuffer.slice:
+                            ret.imageHead = new Uint8Array( buffer )
+                                    .subarray( 2, headLength );
+                        }
+                    }
+                }
+    
+                return ret;
+            },
+    
+            updateImageHead: function( buffer, head ) {
+                var data = this._parse( buffer, true ),
+                    buf1, buf2, bodyoffset;
+    
+    
+                bodyoffset = 2;
+                if ( data.imageHead ) {
+                    bodyoffset = 2 + data.imageHead.byteLength;
+                }
+    
+                if ( buffer.slice ) {
+                    buf2 = buffer.slice( bodyoffset );
+                } else {
+                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
+                }
+    
+                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
+    
+                buf1[ 0 ] = 0xFF;
+                buf1[ 1 ] = 0xD8;
+                buf1.set( new Uint8Array( head ), 2 );
+                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
+    
+                return buf1.buffer;
+            }
+        };
+    
+        Util.parseMeta = function() {
+            return api.parse.apply( api, arguments );
+        };
+    
+        Util.updateImageHead = function() {
+            return api.updateImageHead.apply( api, arguments );
+        };
+    
+        return api;
+    });
+    /**
+     * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
+     * 暂时项目中只用了orientation.
+     *
+     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
+     * @fileOverview EXIF解析
+     */
+    
+    // Sample
+    // ====================================
+    // Make : Apple
+    // Model : iPhone 4S
+    // Orientation : 1
+    // XResolution : 72 [72/1]
+    // YResolution : 72 [72/1]
+    // ResolutionUnit : 2
+    // Software : QuickTime 7.7.1
+    // DateTime : 2013:09:01 22:53:55
+    // ExifIFDPointer : 190
+    // ExposureTime : 0.058823529411764705 [1/17]
+    // FNumber : 2.4 [12/5]
+    // ExposureProgram : Normal program
+    // ISOSpeedRatings : 800
+    // ExifVersion : 0220
+    // DateTimeOriginal : 2013:09:01 22:52:51
+    // DateTimeDigitized : 2013:09:01 22:52:51
+    // ComponentsConfiguration : YCbCr
+    // ShutterSpeedValue : 4.058893515764426
+    // ApertureValue : 2.5260688216892597 [4845/1918]
+    // BrightnessValue : -0.3126686601998395
+    // MeteringMode : Pattern
+    // Flash : Flash did not fire, compulsory flash mode
+    // FocalLength : 4.28 [107/25]
+    // SubjectArea : [4 values]
+    // FlashpixVersion : 0100
+    // ColorSpace : 1
+    // PixelXDimension : 2448
+    // PixelYDimension : 3264
+    // SensingMethod : One-chip color area sensor
+    // ExposureMode : 0
+    // WhiteBalance : Auto white balance
+    // FocalLengthIn35mmFilm : 35
+    // SceneCaptureType : Standard
+    define('runtime/html5/imagemeta/exif',[
+        'base',
+        'runtime/html5/imagemeta'
+    ], function( Base, ImageMeta ) {
+    
+        var EXIF = {};
+    
+        EXIF.ExifMap = function() {
+            return this;
+        };
+    
+        EXIF.ExifMap.prototype.map = {
+            'Orientation': 0x0112
+        };
+    
+        EXIF.ExifMap.prototype.get = function( id ) {
+            return this[ id ] || this[ this.map[ id ] ];
+        };
+    
+        EXIF.exifTagTypes = {
+            // byte, 8-bit unsigned int:
+            1: {
+                getValue: function( dataView, dataOffset ) {
+                    return dataView.getUint8( dataOffset );
+                },
+                size: 1
+            },
+    
+            // ascii, 8-bit byte:
+            2: {
+                getValue: function( dataView, dataOffset ) {
+                    return String.fromCharCode( dataView.getUint8( dataOffset ) );
+                },
+                size: 1,
+                ascii: true
+            },
+    
+            // short, 16 bit int:
+            3: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint16( dataOffset, littleEndian );
+                },
+                size: 2
+            },
+    
+            // long, 32 bit int:
+            4: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // rational = two long values,
+            // first is numerator, second is denominator:
+            5: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian ) /
+                        dataView.getUint32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            },
+    
+            // slong, 32 bit signed int:
+            9: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // srational, two slongs, first is numerator, second is denominator:
+            10: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian ) /
+                        dataView.getInt32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            }
+        };
+    
+        // undefined, 8-bit byte, value depending on field:
+        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
+    
+        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
+                littleEndian ) {
+    
+            var tagType = EXIF.exifTagTypes[ type ],
+                tagSize, dataOffset, values, i, str, c;
+    
+            if ( !tagType ) {
+                Base.log('Invalid Exif data: Invalid tag type.');
+                return;
+            }
+    
+            tagSize = tagType.size * length;
+    
+            // Determine if the value is contained in the dataOffset bytes,
+            // or if the value at the dataOffset is a pointer to the actual data:
+            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
+                    littleEndian ) : (offset + 8);
+    
+            if ( dataOffset + tagSize > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid data offset.');
+                return;
+            }
+    
+            if ( length === 1 ) {
+                return tagType.getValue( dataView, dataOffset, littleEndian );
+            }
+    
+            values = [];
+    
+            for ( i = 0; i < length; i += 1 ) {
+                values[ i ] = tagType.getValue( dataView,
+                        dataOffset + i * tagType.size, littleEndian );
+            }
+    
+            if ( tagType.ascii ) {
+                str = '';
+    
+                // Concatenate the chars:
+                for ( i = 0; i < values.length; i += 1 ) {
+                    c = values[ i ];
+    
+                    // Ignore the terminating NULL byte(s):
+                    if ( c === '\u0000' ) {
+                        break;
+                    }
+                    str += c;
+                }
+    
+                return str;
+            }
+            return values;
+        };
+    
+        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
+                data ) {
+    
+            var tag = dataView.getUint16( offset, littleEndian );
+            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
+                    dataView.getUint16( offset + 2, littleEndian ),    // tag type
+                    dataView.getUint32( offset + 4, littleEndian ),    // tag length
+                    littleEndian );
+        };
+    
+        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
+                littleEndian, data ) {
+    
+            var tagsNumber, dirEndOffset, i;
+    
+            if ( dirOffset + 6 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory offset.');
+                return;
+            }
+    
+            tagsNumber = dataView.getUint16( dirOffset, littleEndian );
+            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
+    
+            if ( dirEndOffset + 4 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory size.');
+                return;
+            }
+    
+            for ( i = 0; i < tagsNumber; i += 1 ) {
+                this.parseExifTag( dataView, tiffOffset,
+                        dirOffset + 2 + 12 * i,    // tag offset
+                        littleEndian, data );
+            }
+    
+            // Return the offset to the next directory:
+            return dataView.getUint32( dirEndOffset, littleEndian );
+        };
+    
+        // EXIF.getExifThumbnail = function(dataView, offset, length) {
+        //     var hexData,
+        //         i,
+        //         b;
+        //     if (!length || offset + length > dataView.byteLength) {
+        //         Base.log('Invalid Exif data: Invalid thumbnail data.');
+        //         return;
+        //     }
+        //     hexData = [];
+        //     for (i = 0; i < length; i += 1) {
+        //         b = dataView.getUint8(offset + i);
+        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));
+        //     }
+        //     return 'data:image/jpeg,%' + hexData.join('%');
+        // };
+    
+        EXIF.parseExifData = function( dataView, offset, length, data ) {
+    
+            var tiffOffset = offset + 10,
+                littleEndian, dirOffset;
+    
+            // Check for the ASCII code for "Exif" (0x45786966):
+            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
+                // No Exif data, might be XMP data instead
+                return;
+            }
+            if ( tiffOffset + 8 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid segment size.');
+                return;
+            }
+    
+            // Check for the two null bytes:
+            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
+                Base.log('Invalid Exif data: Missing byte alignment offset.');
+                return;
+            }
+    
+            // Check the byte alignment:
+            switch ( dataView.getUint16( tiffOffset ) ) {
+                case 0x4949:
+                    littleEndian = true;
+                    break;
+    
+                case 0x4D4D:
+                    littleEndian = false;
+                    break;
+    
+                default:
+                    Base.log('Invalid Exif data: Invalid byte alignment marker.');
+                    return;
+            }
+    
+            // Check for the TIFF tag marker (0x002A):
+            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
+                Base.log('Invalid Exif data: Missing TIFF marker.');
+                return;
+            }
+    
+            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
+            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
+            // Create the exif object to store the tags:
+            data.exif = new EXIF.ExifMap();
+            // Parse the tags of the main image directory and retrieve the
+            // offset to the next directory, usually the thumbnail directory:
+            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
+                    tiffOffset + dirOffset, littleEndian, data );
+    
+            // 尝试读取缩略图
+            // if ( dirOffset ) {
+            //     thumbnailData = {exif: {}};
+            //     dirOffset = EXIF.parseExifTags(
+            //         dataView,
+            //         tiffOffset,
+            //         tiffOffset + dirOffset,
+            //         littleEndian,
+            //         thumbnailData
+            //     );
+    
+            //     // Check for JPEG Thumbnail offset:
+            //     if (thumbnailData.exif[0x0201]) {
+            //         data.exif.Thumbnail = EXIF.getExifThumbnail(
+            //             dataView,
+            //             tiffOffset + thumbnailData.exif[0x0201],
+            //             thumbnailData.exif[0x0202] // Thumbnail data length
+            //         );
+            //     }
+            // }
+        };
+    
+        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
+        return EXIF;
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('runtime/html5/image',[
+        'base',
+        'runtime/html5/runtime',
+        'runtime/html5/util'
+    ], function( Base, Html5Runtime, Util ) {
+    
+        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
+    
+        return Html5Runtime.register( 'Image', {
+    
+            // flag: 标记是否被修改过。
+            modified: false,
+    
+            init: function() {
+                var me = this,
+                    img = new Image();
+    
+                img.onload = function() {
+    
+                    me._info = {
+                        type: me.type,
+                        width: this.width,
+                        height: this.height
+                    };
+    
+                    // 读取meta信息。
+                    if ( !me._metas && 'image/jpeg' === me.type ) {
+                        Util.parseMeta( me._blob, function( error, ret ) {
+                            me._metas = ret;
+                            me.owner.trigger('load');
+                        });
+                    } else {
+                        me.owner.trigger('load');
+                    }
+                };
+    
+                img.onerror = function() {
+                    me.owner.trigger('error');
+                };
+    
+                me._img = img;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    img = me._img;
+    
+                me._blob = blob;
+                me.type = blob.type;
+                img.src = Util.createObjectURL( blob.getSource() );
+                me.owner.once( 'load', function() {
+                    Util.revokeObjectURL( img.src );
+                });
+            },
+    
+            resize: function( width, height ) {
+                var canvas = this._canvas ||
+                        (this._canvas = document.createElement('canvas'));
+    
+                this._resize( this._img, canvas, width, height );
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger('complete');
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this._blob,
+                    opts = this.options,
+                    canvas;
+    
+                type = type || this.type;
+    
+                // blob需要重新生成。
+                if ( this.modified || this.type !== type ) {
+                    canvas = this._canvas;
+    
+                    if ( type === 'image/jpeg' ) {
+    
+                        blob = Util.canvasToDataUrl( canvas, 'image/jpeg',
+                                opts.quality );
+    
+                        if ( opts.preserveHeaders && this._metas &&
+                                this._metas.imageHead ) {
+    
+                            blob = Util.dataURL2ArrayBuffer( blob );
+                            blob = Util.updateImageHead( blob,
+                                    this._metas.imageHead );
+                            blob = Util.arrayBufferToBlob( blob, type );
+                            return blob;
+                        }
+                    } else {
+                        blob = Util.canvasToDataUrl( canvas, type );
+                    }
+    
+                    blob = Util.dataURL2Blob( blob );
+                }
+    
+                return blob;
+            },
+    
+            getAsDataUrl: function( type ) {
+                var opts = this.options;
+    
+                type = type || this.type;
+    
+                if ( type === 'image/jpeg' ) {
+                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );
+                } else {
+                    return this._canvas.toDataURL( type );
+                }
+            },
+    
+            getOrientation: function() {
+                return this._metas && this._metas.exif &&
+                        this._metas.exif.get('Orientation') || 1;
+            },
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            destroy: function() {
+                var canvas = this._canvas;
+                this._img.onload = null;
+    
+                if ( canvas ) {
+                    canvas.getContext('2d')
+                            .clearRect( 0, 0, canvas.width, canvas.height );
+                    canvas.width = canvas.height = 0;
+                    this._canvas = null;
+                }
+    
+                // 释放内存。非常重要,否则释放不了image的内存。
+                this._img.src = BLANK;
+                this._img = this._blob = null;
+            },
+    
+            _resize: function( img, cvs, width, height ) {
+                var opts = this.options,
+                    naturalWidth = img.width,
+                    naturalHeight = img.height,
+                    orientation = this.getOrientation(),
+                    scale, w, h, x, y;
+    
+                // values that require 90 degree rotation
+                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+    
+                    // 交换width, height的值。
+                    width ^= height;
+                    height ^= width;
+                    width ^= height;
+                }
+    
+                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
+                        height / naturalHeight );
+    
+                // 不允许放大。
+                opts.allowMagnify || (scale = Math.min( 1, scale ));
+    
+                w = naturalWidth * scale;
+                h = naturalHeight * scale;
+    
+                if ( opts.crop ) {
+                    cvs.width = width;
+                    cvs.height = height;
+                } else {
+                    cvs.width = w;
+                    cvs.height = h;
+                }
+    
+                x = (cvs.width - w) / 2;
+                y = (cvs.height - h) / 2;
+    
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+    
+                this._renderImageToCanvas( cvs, img, x, y, w, h );
+            },
+    
+            _rotate2Orientaion: function( canvas, orientation ) {
+                var width = canvas.width,
+                    height = canvas.height,
+                    ctx = canvas.getContext('2d');
+    
+                switch ( orientation ) {
+                    case 5:
+                    case 6:
+                    case 7:
+                    case 8:
+                        canvas.width = height;
+                        canvas.height = width;
+                        break;
+                }
+    
+                switch ( orientation ) {
+                    case 2:    // horizontal flip
+                        ctx.translate( width, 0 );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 3:    // 180 rotate left
+                        ctx.translate( width, height );
+                        ctx.rotate( Math.PI );
+                        break;
+    
+                    case 4:    // vertical flip
+                        ctx.translate( 0, height );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 5:    // vertical flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 6:    // 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( 0, -height );
+                        break;
+    
+                    case 7:    // horizontal flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( width, -height );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 8:    // 90 rotate left
+                        ctx.rotate( -0.5 * Math.PI );
+                        ctx.translate( -width, 0 );
+                        break;
+                }
+            },
+    
+            // https://github.com/stomita/ios-imagefile-megapixel/
+            // blob/master/src/megapix-image.js
+            _renderImageToCanvas: (function() {
+    
+                // 如果不是ios, 不需要这么复杂!
+                if ( !Base.os.ios ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        canvas.getContext('2d').drawImage( img, x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detecting vertical squash in loaded image.
+                 * Fixes a bug which squash image vertically while drawing into
+                 * canvas for some images.
+                 */
+                function detectVerticalSquash( img, iw, ih ) {
+                    var canvas = document.createElement('canvas'),
+                        ctx = canvas.getContext('2d'),
+                        sy = 0,
+                        ey = ih,
+                        py = ih,
+                        data, alpha, ratio;
+    
+    
+                    canvas.width = 1;
+                    canvas.height = ih;
+                    ctx.drawImage( img, 0, 0 );
+                    data = ctx.getImageData( 0, 0, 1, ih ).data;
+    
+                    // search image edge pixel position in case
+                    // it is squashed vertically.
+                    while ( py > sy ) {
+                        alpha = data[ (py - 1) * 4 + 3 ];
+    
+                        if ( alpha === 0 ) {
+                            ey = py;
+                        } else {
+                            sy = py;
+                        }
+    
+                        py = (ey + sy) >> 1;
+                    }
+    
+                    ratio = (py / ih);
+                    return (ratio === 0) ? 1 : ratio;
+                }
+    
+                // fix ie7 bug
+                // http://stackoverflow.com/questions/11929099/
+                // html5-canvas-drawimage-ratio-bug-ios
+                if ( Base.os.ios >= 7 ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        var iw = img.naturalWidth,
+                            ih = img.naturalHeight,
+                            vertSquashRatio = detectVerticalSquash( img, iw, ih );
+    
+                        return canvas.getContext('2d').drawImage( img, 0, 0,
+                            iw * vertSquashRatio, ih * vertSquashRatio,
+                            x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detect subsampling in loaded image.
+                 * In iOS, larger images than 2M pixels may be
+                 * subsampled in rendering.
+                 */
+                function detectSubsampling( img ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        canvas, ctx;
+    
+                    // subsampling may happen overmegapixel image
+                    if ( iw * ih > 1024 * 1024 ) {
+                        canvas = document.createElement('canvas');
+                        canvas.width = canvas.height = 1;
+                        ctx = canvas.getContext('2d');
+                        ctx.drawImage( img, -iw + 1, 0 );
+    
+                        // subsampled image becomes half smaller in rendering size.
+                        // check alpha channel value to confirm image is covering
+                        // edge pixel or not. if alpha value is 0
+                        // image is not covering, hence subsampled.
+                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
+                    } else {
+                        return false;
+                    }
+                }
+    
+    
+                return function( canvas, img, x, y, width, height ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        ctx = canvas.getContext('2d'),
+                        subsampled = detectSubsampling( img ),
+                        doSquash = this.type === 'image/jpeg',
+                        d = 1024,
+                        sy = 0,
+                        dy = 0,
+                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
+    
+                    if ( subsampled ) {
+                        iw /= 2;
+                        ih /= 2;
+                    }
+    
+                    ctx.save();
+                    tmpCanvas = document.createElement('canvas');
+                    tmpCanvas.width = tmpCanvas.height = d;
+    
+                    tmpCtx = tmpCanvas.getContext('2d');
+                    vertSquashRatio = doSquash ?
+                            detectVerticalSquash( img, iw, ih ) : 1;
+    
+                    dw = Math.ceil( d * width / iw );
+                    dh = Math.ceil( d * height / ih / vertSquashRatio );
+    
+                    while ( sy < ih ) {
+                        sx = 0;
+                        dx = 0;
+                        while ( sx < iw ) {
+                            tmpCtx.clearRect( 0, 0, d, d );
+                            tmpCtx.drawImage( img, -sx, -sy );
+                            ctx.drawImage( tmpCanvas, 0, 0, d, d,
+                                    x + dx, y + dy, dw, dh );
+                            sx += d;
+                            dx += dw;
+                        }
+                        sy += d;
+                        dy += dh;
+                    }
+                    ctx.restore();
+                    tmpCanvas = tmpCtx = null;
+                };
+            })()
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var noop = Base.noop,
+            $ = Base.$;
+    
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+    
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+    
+                if ( binary ) {
+                    xhr.overrideMimeType('application/octet-stream');
+    
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+    
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+    
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+    
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+    
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+    
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+    
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+    
+                    return me.trigger( 'progress', percentage );
+                };
+    
+                xhr.onreadystatechange = function() {
+    
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+    
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+    
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+    
+    
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+    
+            _parseJson: function( str ) {
+                var json;
+    
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+    
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview 只有html5实现的文件版本。
+     */
+    define('preset/html5only',[
+        'base',
+    
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+    
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/imagemeta/exif',
+        'runtime/html5/image',
+        'runtime/html5/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/html5only'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.html5only.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.html5only.min.js
new file mode 100644
index 0000000..866dcde
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.html5only.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",getDimension:"get-dimension",addButton:"add-btn",getRuntimeType:"get-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.disconnectRuntime()}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.exec("destroy"),this.disconnectRuntime(),this.off()}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){b._info=b._info||d.info(),b._meta=b._meta||d.meta(),d.resize(g.width,g.height)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,a.size<c&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destory:function(){delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d.getStats().numOfQueue||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_nextBlock:function(){var a,b,c=this,d=c._act,f=c.options;return d&&d.has()&&d.file.getStatus()===h.PROGRESS?(f.prepareNextFile&&!c.pending.length&&c._prepareNextFile(),d.fetch()):c.runing?(!c.pending.length&&c.getStats().numOfQueue&&c._prepareNextFile(),a=c.pending.shift(),b=function(a){return a?(d=e(a,f.chunked?f.chunkSize:0),c._act=d,d.fetch()):null},g(a)?a[a.pipe?"pipe":"then"](b):b(a)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.QUEUED?(b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),c):b._finishFile(c)}),a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d._popBlock(b),a.nextTick(d.__tick))})},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){var c=0,d=0;c=b.percentage=a,b.chunks>1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))
+},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b=this,f=b.getRuid(),g=b.elem.parent().get(0);return g&&!d.contains(g,a.currentTarget)?!1:(b._getTansferFiles(a,function(a){b.trigger("drop",d.map(a,function(a){return new c(f,a)}))}),b.dndOver=!1,b.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k,l=[],m=[];for(b=b.originalEvent||b,f=b.dataTransfer,d=f.items,e=f.files,k=!(!d||!d[0].webkitGetAsEntry),i=0,j=e.length;j>i;i++)g=e[i],h=d&&d[i],k&&h.webkitGetAsEntry().isDirectory?m.push(this._traverseDirectoryTree(h.webkitGetAsEntry(),l)):l.push(g);a.when.apply(a,m).done(function(){l.length&&c(l)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragEnterHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;e<b.length;e++)c[e]=b.charCodeAt(e);return f=g[0].split(":")[1].split(";")[0],this.arrayBufferToBlob(d,f)},dataURL2ArrayBuffer:function(a){var b,c,d,e;for(e=a.split(","),b=~e[0].indexOf("base64")?atob(e[1]):decodeURIComponent(e[1]),c=new Uint8Array(b.length),d=0;d<b.length;d++)c[d]=b.charCodeAt(d);return c.buffer},arrayBufferToBlob:function(b,c){var d,e=a.BlobBuilder||a.WebKitBlobBuilder;return e?(d=new e,d.append(b),d.getBlob(c)):new Blob([b],c?{type:c}:{})},canvasToDataUrl:function(a,b,c){return a.toDataURL(b,c/100)},parseMeta:function(a,b){b(!1,{})},updateImageHead:function(a){return a}}}),b("runtime/html5/imagemeta",["runtime/html5/util"],function(a){var b;return b={parsers:{65505:[]},maxMetaDataSize:262144,parse:function(a,b){var c=this,d=new FileReader;d.onload=function(){b(!1,c._parse(this.result)),d=d.onload=d.onerror=null},d.onerror=function(a){b(a.message),d=d.onload=d.onerror=null},a=a.slice(0,c.maxMetaDataSize),d.readAsArrayBuffer(a.getSource())},_parse:function(a,c){if(!(a.byteLength<6)){var d,e,f,g,h=new DataView(a),i=2,j=h.byteLength-4,k=i,l={};if(65496===h.getUint16(0)){for(;j>i&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g<f.length;g+=1)f[g].call(b,h,i,e,l);i+=e,k=i}k>6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;l<k.length&&(n=k[l],"\x00"!==n);l+=1)m+=n;return m}return k},c.parseExifTag=function(a,b,d,e,f){var g=a.getUint16(d,e);f.exif[g]=c.getExifValue(a,b,d,a.getUint16(d+2,e),a.getUint32(d+4,e),e)},c.parseExifTags=function(b,c,d,e,f){var g,h,i;if(d+6>b.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,"image/jpeg",e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(a,b,c,d,e,f){a.getContext("2d").drawImage(b,c,d,e,f)}}()})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("preset/html5only",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/image","runtime/html5/transport"],function(a){return a}),b("webuploader",["preset/html5only"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.js
new file mode 100644
index 0000000..39d9351
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.js
@@ -0,0 +1,6733 @@
+/*! WebUploader 0.1.2 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+        },
+
+        exports = factory( root, _define, _require ),
+        origin;
+
+    // exports every module.
+    exportsTo( exports );
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = exports;
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([], exports );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = exports;
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( this, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        return window.jQuery || window.Zepto;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+    
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+    
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档将可能省略`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+    
+        var noop = function() {},
+            call = Function.call;
+    
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+    
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+    
+        function createObject( proto ) {
+            var f;
+    
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+    
+    
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+    
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.2',
+    
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+    
+            Deferred: promise.Deferred,
+    
+            isPromise: promise.isPromise,
+    
+            when: promise.when,
+    
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+    
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+    
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+    
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+    
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+    
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+    
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+    
+                /* jshint camelcase: false */
+    
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+    
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+    
+                return child;
+            },
+    
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+    
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+    
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+    
+            nextTick: (function() {
+    
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+    
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+    
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+    
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+    
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+    
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+    
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+    
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+    
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+    
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+    
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+    
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+    
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+    
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+    
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+    
+            while ( ++i < len ) {
+                handler = events[ i ];
+    
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+    
+            return !stoped;
+        }
+    
+        protos = {
+    
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+    
+                if ( !callback ) {
+                    return this;
+                }
+    
+                set = this._events || (this._events = []);
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+    
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+    
+                    set.push( handler );
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+    
+                if ( !callback ) {
+                    return me;
+                }
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+    
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+    
+                return me;
+            },
+    
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+    
+                if ( !events ) {
+                    return this;
+                }
+    
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+    
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+    
+                if ( !this._events || !type ) {
+                    return this;
+                }
+    
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+    
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+    
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+    
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+    
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$;
+    
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+    
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+    
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            getRuntimeType: 'get-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+    
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+    
+            _init: function( opts ) {
+                var me = this;
+    
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+    
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     resize: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.options( 'resize', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+    
+                // setter
+                if ( arguments.length > 1 ) {
+    
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+    
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+    
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `queueNum` 还在队列中的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+    
+                return {
+                    successNum: stats.numOfSuccess,
+    
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue
+                };
+            },
+    
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+    
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+    
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+    
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+    
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+    
+                    return false;
+                }
+    
+                return true;
+            },
+    
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+    
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+    
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+    
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            factories = {},
+    
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+    
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+    
+        $.extend( Runtime.prototype, {
+    
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+    
+                if ( this._container ) {
+                    return this._container;
+                }
+    
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+    
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+    
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                return container;
+            },
+    
+            init: Base.noop,
+            exec: Base.noop,
+    
+            destroy: function() {
+                if ( this._container ) {
+                    this._container.parentNode.removeChild( this.__container );
+                }
+    
+                this.off();
+            }
+        });
+    
+        Runtime.orders = 'html5,flash';
+    
+    
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+    
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+    
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+    
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+    
+            type = type || getFirstKey( factories );
+    
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+    
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+    
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+    
+        var cache;
+    
+        cache = (function() {
+            var obj = {};
+    
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+    
+                get: function( ruid, standalone ) {
+                    var i;
+    
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+    
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+    
+                        return obj[ i ];
+                    }
+    
+                    return null;
+                },
+    
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+    
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+    
+            this.uid = Base.guid('client_');
+    
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+    
+            this.connectRuntime = function( opts, cb ) {
+    
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+    
+                deferred.done( cb );
+    
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+    
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+    
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+    
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                runtime.__client--;
+    
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+    
+                runtime = null;
+            };
+    
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+    
+                return runtime.exec.apply( this, args );
+            };
+    
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+    
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+    
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+    
+            opts.container = $( opts.container );
+    
+            if ( !opts.container.length ) {
+                return;
+            }
+    
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+    
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.disconnectRuntime();
+            }
+        });
+    
+        Mediator.installTo( DragAndDrop.prototype );
+    
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+    
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            IGNORE = {},
+            widgetClass = [];
+    
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+    
+            var length = obj.length,
+                type = $.type( obj );
+    
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+    
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+    
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+    
+        $.extend( Widget.prototype, {
+    
+            init: Base.noop,
+    
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+    
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+    
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+    
+                    return IGNORE;
+                }
+    
+                return this[ map[ apiName ] ].apply( this, args );
+    
+            },
+    
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+    
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+    
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [];
+    
+                $.each( widgetClass, function( _, klass ) {
+                    widgets.push( new klass( me ) );
+                });
+    
+                return _init.apply( me, arguments );
+            },
+    
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+    
+                args = isArrayLike( args ) ? args : [ args ];
+    
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+    
+                    if ( rlt !== IGNORE ) {
+    
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+    
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+    
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个tick中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+    
+                                setTimeout(function() {
+                                    deferred.resolve.apply( deferred, args );
+                                }, 1 );
+    
+                                return deferred.promise();
+                            })[ key ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            }
+        });
+    
+        /**
+         * 添加组件
+         * @param  {object} widgetProto 组件原型,构造函数通过constructor属性定义
+         * @param  {object} responseMap API名称与函数实现的映射
+         * @example
+         *     Uploader.register( {
+         *         init: function( options ) {},
+         *         makeThumb: function() {}
+         *     }, {
+         *         'make-thumb': 'makeThumb'
+         *     } );
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init' },
+                klass;
+    
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+                widgetProto.responseMap = map;
+            } else {
+                widgetProto.responseMap = $.extend( map, responseMap );
+            }
+    
+            klass = Base.inherits( Widget, widgetProto );
+            widgetClass.push( klass );
+    
+            return klass;
+        };
+    
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+    
+        Uploader.options.dnd = '';
+    
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+    
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+    
+                dnd = new Dnd( options );
+    
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+    
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+    
+                dnd.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.exec('destroy');
+                this.disconnectRuntime();
+                this.off();
+            }
+        });
+    
+        Mediator.installTo( FilePaste.prototype );
+    
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+    
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+    
+                paste = new FilePaste( options );
+    
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+    
+        function Blob( ruid, source ) {
+            var me = this;
+    
+            me.source = source;
+            me.ruid = ruid;
+    
+            RuntimeClient.call( me, 'Blob' );
+    
+            this.uid = source.uid || this.uid;
+            this.type = source.type || '';
+            this.size = source.size || 0;
+    
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+    
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+    
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+    
+            getSource: function() {
+                return this.source;
+            }
+        });
+    
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+    
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+    
+        function File( ruid, file ) {
+            var ext;
+    
+            Blob.apply( this, arguments );
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+    
+            // todo 支持其他类型文件的转换。
+    
+            // 如果有mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && this.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+    
+            // 如果没有指定mimetype, 但是知道文件后缀。
+            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
+                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
+            }
+    
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+        }
+    
+        return Base.inherits( Blob, File );
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+    
+        var $ = Base.$;
+    
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+    
+            opts.container = $( opts.id );
+    
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+    
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+    
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+    
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+    
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+    
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+    
+                button.addClass('webuploader-pick');
+    
+                me.on( 'all', function( type ) {
+                    var files;
+    
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+    
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+    
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+    
+                $( window ).on( 'resize', function() {
+                    me.refresh();
+                });
+            },
+    
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+    
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+    
+                    pos = button.offset();
+    
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+    
+            enable: function() {
+                var btn = this.options.button;
+    
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+    
+            disable: function() {
+                var btn = this.options.button;
+    
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+    
+                btn.addClass('webuploader-pick-disable');
+            },
+    
+            destroy: function() {
+                if ( this.runtime ) {
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                }
+            }
+        });
+    
+        return FilePicker;
+    });
+    
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+    
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+    
+        return Uploader.register({
+            'add-btn': 'addButton',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable'
+        }, {
+    
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addButton( opts.pick );
+            },
+    
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+    
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addButton: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    options, picker, deferred;
+    
+                if ( !pick ) {
+                    return;
+                }
+    
+                deferred = Base.Deferred();
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+    
+                options = $.extend({}, pick, {
+                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                    swf: opts.swf,
+                    runtimeOrder: opts.runtimeOrder
+                });
+    
+                picker = new FilePicker( options );
+    
+                picker.once( 'ready', deferred.resolve );
+                picker.on( 'select', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                picker.init();
+    
+                this.pickers.push( picker );
+    
+                return deferred.promise();
+            },
+    
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+    
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+    
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+    
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+    
+        // 默认选项。
+        Image.options = {
+    
+            // 默认的图片处理质量
+            quality: 90,
+    
+            // 是否裁剪
+            crop: false,
+    
+            // 是否保留头部信息
+            preserveHeaders: true,
+    
+            // 是否允许放大。
+            allowMagnify: true
+        };
+    
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+    
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+    
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+    
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+    
+        var $ = Base.$,
+            throttle;
+    
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+    
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+    
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: false,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+    
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+    
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+    
+        return Uploader.register({
+            'make-thumb': 'makeThumb',
+            'before-send-file': 'compressImage'
+        }, {
+    
+    
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             *
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+    
+                opts = $.extend({}, this.options.thumb );
+    
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+    
+                width = width || opts.width;
+                height = height || opts.height;
+    
+                image = new Image( opts );
+    
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( width, height );
+                });
+    
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+    
+                image.once( 'error', function() {
+                    cb( true );
+                    image.destroy();
+                });
+    
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+    
+            compressImage: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 300 * 1024,
+                    image, deferred;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+    
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+    
+                image = new Image( opts );
+    
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( opts.width, opts.height );
+                });
+    
+                image.once( 'complete', function() {
+                    var blob, size;
+    
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+    
+                        size = file.size;
+    
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+    
+                            file.trigger( 'resize', blob.size, size );
+                        }
+    
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+    
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+    
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+    
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+    
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+    
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+    
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+    
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application'
+             */
+            this.type = source.type || 'application';
+    
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+    
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+    
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+    
+    
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+    
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+    
+            this.source = source;
+            this.loaded = 0;
+    
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+    
+        $.extend( WUFile.prototype, {
+    
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+    
+                var prevStatus = statusMap[ this.id ];
+    
+                typeof text !== 'undefined' && (this.statusText = text);
+    
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+    
+            },
+    
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+    
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+    
+            destory: function() {
+                delete statusMap[ this.id ];
+            }
+        });
+    
+        Mediator.installTo( WUFile.prototype );
+    
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+    
+        return WUFile;
+    });
+    
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+    
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+    
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+    
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被移除的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0
+            };
+    
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+    
+            // 存储所有文件
+            this._map = {};
+        }
+    
+        $.extend( Queue.prototype, {
+    
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+    
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+    
+                status = status || STATUS.QUEUED;
+    
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+    
+                return null;
+            },
+    
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+    
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+    
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+    
+                    ret.push( file );
+                }
+    
+                return ret;
+            },
+    
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+    
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+    
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+    
+                file.setStatus( STATUS.QUEUED );
+            },
+    
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+    
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+    
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+                }
+    
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+    
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+    
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+    
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+                }
+            }
+    
+        });
+    
+        Mediator.installTo( Queue.prototype );
+    
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+    
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+    
+        return Uploader.register({
+            'sort-files': 'sortFiles',
+            'add-file': 'addFiles',
+            'get-file': 'getFile',
+            'fetch-file': 'fetchFile',
+            'get-stats': 'getStats',
+            'get-files': 'getFiles',
+            'remove-file': 'removeFile',
+            'retry': 'retry',
+            'reset': 'reset',
+            'accept-file': 'acceptFile'
+        }, {
+    
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+    
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+    
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+    
+                    me.accept = new RegExp( accept, 'i' );
+                }
+    
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+    
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+    
+    
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+    
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+    
+                    file = new WUFile( file );
+                }
+    
+                return file;
+            },
+    
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || file.size < 6 || this.accept &&
+    
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+    
+                return !invalid;
+            },
+    
+    
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+    
+            _addFile: function( file ) {
+                var me = this;
+    
+                file = me._wrapFile( file );
+    
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+    
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+    
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+    
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+    
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFiles: function( files ) {
+                var me = this;
+    
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+    
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+    
+                me.owner.trigger( 'filesQueued', files );
+    
+                if ( me.options.auto ) {
+                    me.request('start-upload');
+                }
+            },
+    
+            getStats: function() {
+                return this.stats;
+            },
+    
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file ) {
+                var me = this;
+    
+                file = file.id ? file : me.queue.getFile( file );
+    
+                file.setStatus( Status.CANCELLED );
+                me.owner.trigger( 'fileDequeued', file );
+            },
+    
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+    
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+    
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+    
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+    
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+    
+                me.request('start-upload');
+            },
+    
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            }
+        });
+    
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+    
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+    
+        return Uploader.register({
+            'predict-runtime-type': 'predictRuntmeType'
+        }, {
+    
+            init: function() {
+                if ( !this.predictRuntmeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+    
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntmeType() => String
+             * @method predictRuntmeType
+             * @for  Uploader
+             */
+            predictRuntmeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+    
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+    
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+    
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+    
+        var $ = Base.$;
+    
+        function Transport( opts ) {
+            var me = this;
+    
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+    
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+    
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+    
+        Transport.options = {
+            server: '',
+            method: 'POST',
+    
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+    
+        $.extend( Transport.prototype, {
+    
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+    
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+    
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+    
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+    
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+    
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+    
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+    
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+    
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+    
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+    
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+    
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+    
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+    
+                if ( !duration ) {
+                    return;
+                }
+    
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+    
+        });
+    
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+    
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+    
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+    
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+    
+    
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+    
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+    
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+    
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+    
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+    
+    
+            /**
+             * @property {Object} [formData]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: null
+    
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+    
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+    
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+    
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len;
+    
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+    
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++
+                });
+                start += len;
+            }
+    
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+    
+            return {
+                file: file,
+    
+                has: function() {
+                    return !!pending.length;
+                },
+    
+                fetch: function() {
+                    return pending.shift();
+                }
+            };
+        }
+    
+        Uploader.register({
+            'start-upload': 'start',
+            'stop-upload': 'stop',
+            'skip-file': 'skipFile',
+            'is-in-progress': 'isInProgress'
+        }, {
+    
+            init: function() {
+                var owner = this.owner;
+    
+                this.runing = false;
+    
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+    
+                // 缓存即将上传的文件。
+                this.pending = [];
+    
+                // 跟踪还有多少分片没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+    
+                owner.on( 'uploadComplete', function( file ) {
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+    
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+    
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             * @grammar upload() => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            start: function() {
+                var me = this;
+    
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+    
+                if ( me.runing ) {
+                    return;
+                }
+    
+                me.runing = true;
+    
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+    
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        file.setStatus( Status.PROGRESS );
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+    
+                me._trigged = false;
+                me.owner.trigger('startUpload');
+                Base.nextTick( me.__tick );
+            },
+    
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stop: function( interrupt ) {
+                var me = this;
+    
+                if ( me.runing === false ) {
+                    return;
+                }
+    
+                me.runing = false;
+    
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+    
+                me.owner.trigger('stopUpload');
+            },
+    
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.runing;
+            },
+    
+            getStats: function() {
+                return this.request('get-stats');
+            },
+    
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = this.request( 'get-file', file );
+    
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+    
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+    
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+    
+                this.owner.trigger( 'uploadSkip', file );
+            },
+    
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+    
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+    
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+    
+                    fn = function( val ) {
+                        me._promise = null;
+    
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+    
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+    
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me.getStats().numOfQueue ) {
+                    me.runing = false;
+    
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+    
+            _nextBlock: function() {
+                var me = this,
+                    act = me._act,
+                    opts = me.options,
+                    next, done;
+    
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( act && act.has() &&
+                        act.file.getStatus() === Status.PROGRESS ) {
+    
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+    
+                    return act.fetch();
+    
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+    
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me.getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+    
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+    
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me._act = act;
+                        return act.fetch();
+                    };
+    
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    return isPromise( next ) ?
+                            next[ next.pipe ? 'pipe' : 'then']( done ) :
+                            done( next );
+                }
+            },
+    
+    
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+    
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+    
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.QUEUED ) {
+                            me.owner.trigger( 'uploadStart', file );
+                            file.setStatus( Status.PROGRESS );
+                            return file;
+                        }
+    
+                        return me._finishFile( file );
+                    });
+    
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+    
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+    
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+    
+                    pending.push( promise );
+                }
+            },
+    
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+    
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+    
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+    
+                me.pool.push( block );
+                me.remaning++;
+    
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+    
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+    
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+    
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+    
+    
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+    
+    
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+    
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+    
+                block.transport = tr;
+    
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+    
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    var totalPercent = 0,
+                        uploaded = 0;
+    
+                    // 可能没有abort掉,progress还是执行进来了。
+                    // if ( !file.blocks ) {
+                    //     return;
+                    // }
+    
+                    totalPercent = block.percentage = percentage;
+    
+                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。
+                        $.each( file.blocks, function( _, v ) {
+                            uploaded += (v.percentage || 0) * (v.end - v.start);
+                        });
+    
+                        totalPercent = uploaded / file.size;
+                    }
+    
+                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+                });
+    
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+    
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+    
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+    
+                    return reject;
+                };
+    
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+    
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+    
+                        block.retried++;
+                        tr.send();
+    
+                    } else {
+    
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+    
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+    
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+    
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+    
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+    
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+    
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+    
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+    
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+    
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+    
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+    
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+    
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            }
+    
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+    
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+    
+        var $ = Base.$,
+            validators = {},
+            api;
+    
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * @for  Uploader
+         */
+    
+        // 暴露给外面的api
+        api = {
+    
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+    
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+    
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            init: function() {
+                var me = this;
+                $.each( validators, function() {
+                    this.call( me.owner );
+                });
+            }
+        });
+    
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileNumLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return count >= max ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+    
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+    
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileSizeLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+    
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return invalid ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', file );
+                    return false;
+                }
+    
+            });
+    
+        });
+    
+        /**
+         * @property {int} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+    
+            if ( opts.duplicate ) {
+                return;
+            }
+    
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+    
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+    
+                return hash;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+    
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (mapping[ hash ] = true);
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (delete mapping[ hash ]);
+            });
+        });
+    
+        return api;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+    
+        function CompBase( owner, runtime ) {
+    
+            this.owner = owner;
+            this.options = owner.options;
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+    
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+    
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var type = 'html5',
+            components = {};
+    
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destory = this.destory;
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+    
+            me.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+    
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+    
+        });
+    
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+    
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+    
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+    
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+    
+                blob = slice.call( blob, start, end );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+    
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+    
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+    
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+    
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+    
+                e = e.originalEvent || e;
+    
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+    
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+    
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+    
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+    
+    
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+    
+                return false;
+            },
+    
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+    
+                return false;
+            },
+    
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+    
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+    
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+    
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 );
+    
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                me._getTansferFiles( e, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+    
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+    
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( e, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, dataTransfer, file, item, i, len, canAccessFolder;
+    
+                e = e.originalEvent || e;
+    
+                dataTransfer = e.dataTransfer;
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+    
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+    
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+    
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+    
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+    
+                Base.when.apply( Base, promises ).done(function() {
+    
+                    if ( !results.length ) {
+                        return;
+                    }
+    
+                    callback( results );
+                });
+            },
+    
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+    
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+    
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+    
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+    
+                return deferred.promise();
+            },
+    
+            destroy: function() {
+                var elem = this.elem;
+    
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragEnterHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+    
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+    
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+    
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+    
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+    
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+    
+                    allowed.push( new File( ruid, blob ) );
+                }
+    
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+    
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var $ = Base.$;
+    
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    lable = $( document.createElement('label') ),
+                    input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+    
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+    
+                lable.on( 'click', function() {
+                    input.trigger('click');
+                });
+    
+                lable.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+    
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+    
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+    
+                    input.attr( 'accept', arr.join(',') );
+                }
+    
+                container.append( input );
+                container.append( lable );
+    
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+    
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+    
+                    me.files = e.target.files;
+    
+                    // reset input
+                    clone = this.cloneNode( true );
+                    this.parentNode.replaceChild( clone, this );
+    
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+    
+                    owner.trigger('change');
+                });
+    
+                lable.on( 'mouseenter mouseleave', mouseHandler );
+    
+            },
+    
+    
+            getFiles: function() {
+                return this.files;
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/util',[
+        'base'
+    ], function( Base ) {
+    
+        var urlAPI = window.createObjectURL && window ||
+                window.URL && URL.revokeObjectURL && URL ||
+                window.webkitURL,
+            createObjectURL = Base.noop,
+            revokeObjectURL = createObjectURL;
+    
+        if ( urlAPI ) {
+    
+            // 更安全的方式调用,比如android里面就能把context改成其他的对象。
+            createObjectURL = function() {
+                return urlAPI.createObjectURL.apply( urlAPI, arguments );
+            };
+    
+            revokeObjectURL = function() {
+                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
+            };
+        }
+    
+        return {
+            createObjectURL: createObjectURL,
+            revokeObjectURL: revokeObjectURL,
+    
+            dataURL2Blob: function( dataURI ) {
+                var byteStr, intArray, ab, i, mimetype, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                ab = new ArrayBuffer( byteStr.length );
+                intArray = new Uint8Array( ab );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
+    
+                return this.arrayBufferToBlob( ab, mimetype );
+            },
+    
+            dataURL2ArrayBuffer: function( dataURI ) {
+                var byteStr, intArray, i, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                intArray = new Uint8Array( byteStr.length );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                return intArray.buffer;
+            },
+    
+            arrayBufferToBlob: function( buffer, type ) {
+                var builder = window.BlobBuilder || window.WebKitBlobBuilder,
+                    bb;
+    
+                // android不支持直接new Blob, 只能借助blobbuilder.
+                if ( builder ) {
+                    bb = new builder();
+                    bb.append( buffer );
+                    return bb.getBlob( type );
+                }
+    
+                return new Blob([ buffer ], type ? { type: type } : {} );
+            },
+    
+            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
+            // 你得到的结果是png.
+            canvasToDataUrl: function( canvas, type, quality ) {
+                return canvas.toDataURL( type, quality / 100 );
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            parseMeta: function( blob, callback ) {
+                callback( false, {});
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            updateImageHead: function( data ) {
+                return data;
+            }
+        };
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/imagemeta',[
+        'runtime/html5/util'
+    ], function( Util ) {
+    
+        var api;
+    
+        api = {
+            parsers: {
+                0xffe1: []
+            },
+    
+            maxMetaDataSize: 262144,
+    
+            parse: function( blob, cb ) {
+                var me = this,
+                    fr = new FileReader();
+    
+                fr.onload = function() {
+                    cb( false, me._parse( this.result ) );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                fr.onerror = function( e ) {
+                    cb( e.message );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                blob = blob.slice( 0, me.maxMetaDataSize );
+                fr.readAsArrayBuffer( blob.getSource() );
+            },
+    
+            _parse: function( buffer, noParse ) {
+                if ( buffer.byteLength < 6 ) {
+                    return;
+                }
+    
+                var dataview = new DataView( buffer ),
+                    offset = 2,
+                    maxOffset = dataview.byteLength - 4,
+                    headLength = offset,
+                    ret = {},
+                    markerBytes, markerLength, parsers, i;
+    
+                if ( dataview.getUint16( 0 ) === 0xffd8 ) {
+    
+                    while ( offset < maxOffset ) {
+                        markerBytes = dataview.getUint16( offset );
+    
+                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
+                                markerBytes === 0xfffe ) {
+    
+                            markerLength = dataview.getUint16( offset + 2 ) + 2;
+    
+                            if ( offset + markerLength > dataview.byteLength ) {
+                                break;
+                            }
+    
+                            parsers = api.parsers[ markerBytes ];
+    
+                            if ( !noParse && parsers ) {
+                                for ( i = 0; i < parsers.length; i += 1 ) {
+                                    parsers[ i ].call( api, dataview, offset,
+                                            markerLength, ret );
+                                }
+                            }
+    
+                            offset += markerLength;
+                            headLength = offset;
+                        } else {
+                            break;
+                        }
+                    }
+    
+                    if ( headLength > 6 ) {
+                        if ( buffer.slice ) {
+                            ret.imageHead = buffer.slice( 2, headLength );
+                        } else {
+                            // Workaround for IE10, which does not yet
+                            // support ArrayBuffer.slice:
+                            ret.imageHead = new Uint8Array( buffer )
+                                    .subarray( 2, headLength );
+                        }
+                    }
+                }
+    
+                return ret;
+            },
+    
+            updateImageHead: function( buffer, head ) {
+                var data = this._parse( buffer, true ),
+                    buf1, buf2, bodyoffset;
+    
+    
+                bodyoffset = 2;
+                if ( data.imageHead ) {
+                    bodyoffset = 2 + data.imageHead.byteLength;
+                }
+    
+                if ( buffer.slice ) {
+                    buf2 = buffer.slice( bodyoffset );
+                } else {
+                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
+                }
+    
+                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
+    
+                buf1[ 0 ] = 0xFF;
+                buf1[ 1 ] = 0xD8;
+                buf1.set( new Uint8Array( head ), 2 );
+                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
+    
+                return buf1.buffer;
+            }
+        };
+    
+        Util.parseMeta = function() {
+            return api.parse.apply( api, arguments );
+        };
+    
+        Util.updateImageHead = function() {
+            return api.updateImageHead.apply( api, arguments );
+        };
+    
+        return api;
+    });
+    /**
+     * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
+     * 暂时项目中只用了orientation.
+     *
+     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
+     * @fileOverview EXIF解析
+     */
+    
+    // Sample
+    // ====================================
+    // Make : Apple
+    // Model : iPhone 4S
+    // Orientation : 1
+    // XResolution : 72 [72/1]
+    // YResolution : 72 [72/1]
+    // ResolutionUnit : 2
+    // Software : QuickTime 7.7.1
+    // DateTime : 2013:09:01 22:53:55
+    // ExifIFDPointer : 190
+    // ExposureTime : 0.058823529411764705 [1/17]
+    // FNumber : 2.4 [12/5]
+    // ExposureProgram : Normal program
+    // ISOSpeedRatings : 800
+    // ExifVersion : 0220
+    // DateTimeOriginal : 2013:09:01 22:52:51
+    // DateTimeDigitized : 2013:09:01 22:52:51
+    // ComponentsConfiguration : YCbCr
+    // ShutterSpeedValue : 4.058893515764426
+    // ApertureValue : 2.5260688216892597 [4845/1918]
+    // BrightnessValue : -0.3126686601998395
+    // MeteringMode : Pattern
+    // Flash : Flash did not fire, compulsory flash mode
+    // FocalLength : 4.28 [107/25]
+    // SubjectArea : [4 values]
+    // FlashpixVersion : 0100
+    // ColorSpace : 1
+    // PixelXDimension : 2448
+    // PixelYDimension : 3264
+    // SensingMethod : One-chip color area sensor
+    // ExposureMode : 0
+    // WhiteBalance : Auto white balance
+    // FocalLengthIn35mmFilm : 35
+    // SceneCaptureType : Standard
+    define('runtime/html5/imagemeta/exif',[
+        'base',
+        'runtime/html5/imagemeta'
+    ], function( Base, ImageMeta ) {
+    
+        var EXIF = {};
+    
+        EXIF.ExifMap = function() {
+            return this;
+        };
+    
+        EXIF.ExifMap.prototype.map = {
+            'Orientation': 0x0112
+        };
+    
+        EXIF.ExifMap.prototype.get = function( id ) {
+            return this[ id ] || this[ this.map[ id ] ];
+        };
+    
+        EXIF.exifTagTypes = {
+            // byte, 8-bit unsigned int:
+            1: {
+                getValue: function( dataView, dataOffset ) {
+                    return dataView.getUint8( dataOffset );
+                },
+                size: 1
+            },
+    
+            // ascii, 8-bit byte:
+            2: {
+                getValue: function( dataView, dataOffset ) {
+                    return String.fromCharCode( dataView.getUint8( dataOffset ) );
+                },
+                size: 1,
+                ascii: true
+            },
+    
+            // short, 16 bit int:
+            3: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint16( dataOffset, littleEndian );
+                },
+                size: 2
+            },
+    
+            // long, 32 bit int:
+            4: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // rational = two long values,
+            // first is numerator, second is denominator:
+            5: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian ) /
+                        dataView.getUint32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            },
+    
+            // slong, 32 bit signed int:
+            9: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // srational, two slongs, first is numerator, second is denominator:
+            10: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian ) /
+                        dataView.getInt32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            }
+        };
+    
+        // undefined, 8-bit byte, value depending on field:
+        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
+    
+        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
+                littleEndian ) {
+    
+            var tagType = EXIF.exifTagTypes[ type ],
+                tagSize, dataOffset, values, i, str, c;
+    
+            if ( !tagType ) {
+                Base.log('Invalid Exif data: Invalid tag type.');
+                return;
+            }
+    
+            tagSize = tagType.size * length;
+    
+            // Determine if the value is contained in the dataOffset bytes,
+            // or if the value at the dataOffset is a pointer to the actual data:
+            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
+                    littleEndian ) : (offset + 8);
+    
+            if ( dataOffset + tagSize > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid data offset.');
+                return;
+            }
+    
+            if ( length === 1 ) {
+                return tagType.getValue( dataView, dataOffset, littleEndian );
+            }
+    
+            values = [];
+    
+            for ( i = 0; i < length; i += 1 ) {
+                values[ i ] = tagType.getValue( dataView,
+                        dataOffset + i * tagType.size, littleEndian );
+            }
+    
+            if ( tagType.ascii ) {
+                str = '';
+    
+                // Concatenate the chars:
+                for ( i = 0; i < values.length; i += 1 ) {
+                    c = values[ i ];
+    
+                    // Ignore the terminating NULL byte(s):
+                    if ( c === '\u0000' ) {
+                        break;
+                    }
+                    str += c;
+                }
+    
+                return str;
+            }
+            return values;
+        };
+    
+        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
+                data ) {
+    
+            var tag = dataView.getUint16( offset, littleEndian );
+            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
+                    dataView.getUint16( offset + 2, littleEndian ),    // tag type
+                    dataView.getUint32( offset + 4, littleEndian ),    // tag length
+                    littleEndian );
+        };
+    
+        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
+                littleEndian, data ) {
+    
+            var tagsNumber, dirEndOffset, i;
+    
+            if ( dirOffset + 6 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory offset.');
+                return;
+            }
+    
+            tagsNumber = dataView.getUint16( dirOffset, littleEndian );
+            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
+    
+            if ( dirEndOffset + 4 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory size.');
+                return;
+            }
+    
+            for ( i = 0; i < tagsNumber; i += 1 ) {
+                this.parseExifTag( dataView, tiffOffset,
+                        dirOffset + 2 + 12 * i,    // tag offset
+                        littleEndian, data );
+            }
+    
+            // Return the offset to the next directory:
+            return dataView.getUint32( dirEndOffset, littleEndian );
+        };
+    
+        // EXIF.getExifThumbnail = function(dataView, offset, length) {
+        //     var hexData,
+        //         i,
+        //         b;
+        //     if (!length || offset + length > dataView.byteLength) {
+        //         Base.log('Invalid Exif data: Invalid thumbnail data.');
+        //         return;
+        //     }
+        //     hexData = [];
+        //     for (i = 0; i < length; i += 1) {
+        //         b = dataView.getUint8(offset + i);
+        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));
+        //     }
+        //     return 'data:image/jpeg,%' + hexData.join('%');
+        // };
+    
+        EXIF.parseExifData = function( dataView, offset, length, data ) {
+    
+            var tiffOffset = offset + 10,
+                littleEndian, dirOffset;
+    
+            // Check for the ASCII code for "Exif" (0x45786966):
+            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
+                // No Exif data, might be XMP data instead
+                return;
+            }
+            if ( tiffOffset + 8 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid segment size.');
+                return;
+            }
+    
+            // Check for the two null bytes:
+            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
+                Base.log('Invalid Exif data: Missing byte alignment offset.');
+                return;
+            }
+    
+            // Check the byte alignment:
+            switch ( dataView.getUint16( tiffOffset ) ) {
+                case 0x4949:
+                    littleEndian = true;
+                    break;
+    
+                case 0x4D4D:
+                    littleEndian = false;
+                    break;
+    
+                default:
+                    Base.log('Invalid Exif data: Invalid byte alignment marker.');
+                    return;
+            }
+    
+            // Check for the TIFF tag marker (0x002A):
+            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
+                Base.log('Invalid Exif data: Missing TIFF marker.');
+                return;
+            }
+    
+            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
+            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
+            // Create the exif object to store the tags:
+            data.exif = new EXIF.ExifMap();
+            // Parse the tags of the main image directory and retrieve the
+            // offset to the next directory, usually the thumbnail directory:
+            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
+                    tiffOffset + dirOffset, littleEndian, data );
+    
+            // 尝试读取缩略图
+            // if ( dirOffset ) {
+            //     thumbnailData = {exif: {}};
+            //     dirOffset = EXIF.parseExifTags(
+            //         dataView,
+            //         tiffOffset,
+            //         tiffOffset + dirOffset,
+            //         littleEndian,
+            //         thumbnailData
+            //     );
+    
+            //     // Check for JPEG Thumbnail offset:
+            //     if (thumbnailData.exif[0x0201]) {
+            //         data.exif.Thumbnail = EXIF.getExifThumbnail(
+            //             dataView,
+            //             tiffOffset + thumbnailData.exif[0x0201],
+            //             thumbnailData.exif[0x0202] // Thumbnail data length
+            //         );
+            //     }
+            // }
+        };
+    
+        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
+        return EXIF;
+    });
+    /**
+     * 这个方式性能不行,但是可以解决android里面的toDataUrl的bug
+     * android里面toDataUrl('image/jpege')得到的结果却是png.
+     *
+     * 所以这里没辙,只能借助这个工具
+     * @fileOverview jpeg encoder
+     */
+    define('runtime/html5/jpegencoder',[], function( require, exports, module ) {
+    
+        /*
+          Copyright (c) 2008, Adobe Systems Incorporated
+          All rights reserved.
+    
+          Redistribution and use in source and binary forms, with or without
+          modification, are permitted provided that the following conditions are
+          met:
+    
+          * Redistributions of source code must retain the above copyright notice,
+            this list of conditions and the following disclaimer.
+    
+          * Redistributions in binary form must reproduce the above copyright
+            notice, this list of conditions and the following disclaimer in the
+            documentation and/or other materials provided with the distribution.
+    
+          * Neither the name of Adobe Systems Incorporated nor the names of its
+            contributors may be used to endorse or promote products derived from
+            this software without specific prior written permission.
+    
+          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+          IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+          PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+          CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+          EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+          PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+          PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+          NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+          SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+        */
+        /*
+        JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009
+    
+        Basic GUI blocking jpeg encoder
+        */
+    
+        function JPEGEncoder(quality) {
+          var self = this;
+            var fround = Math.round;
+            var ffloor = Math.floor;
+            var YTable = new Array(64);
+            var UVTable = new Array(64);
+            var fdtbl_Y = new Array(64);
+            var fdtbl_UV = new Array(64);
+            var YDC_HT;
+            var UVDC_HT;
+            var YAC_HT;
+            var UVAC_HT;
+    
+            var bitcode = new Array(65535);
+            var category = new Array(65535);
+            var outputfDCTQuant = new Array(64);
+            var DU = new Array(64);
+            var byteout = [];
+            var bytenew = 0;
+            var bytepos = 7;
+    
+            var YDU = new Array(64);
+            var UDU = new Array(64);
+            var VDU = new Array(64);
+            var clt = new Array(256);
+            var RGB_YUV_TABLE = new Array(2048);
+            var currentQuality;
+    
+            var ZigZag = [
+                     0, 1, 5, 6,14,15,27,28,
+                     2, 4, 7,13,16,26,29,42,
+                     3, 8,12,17,25,30,41,43,
+                     9,11,18,24,31,40,44,53,
+                    10,19,23,32,39,45,52,54,
+                    20,22,33,38,46,51,55,60,
+                    21,34,37,47,50,56,59,61,
+                    35,36,48,49,57,58,62,63
+                ];
+    
+            var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
+            var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
+            var std_ac_luminance_values = [
+                    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
+                    0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
+                    0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
+                    0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
+                    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
+                    0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
+                    0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
+                    0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
+                    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
+                    0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
+                    0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
+                    0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
+                    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
+                    0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
+                    0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
+                    0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
+                    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
+                    0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
+                    0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
+                    0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+    
+            var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
+            var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
+            var std_ac_chrominance_values = [
+                    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
+                    0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
+                    0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
+                    0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
+                    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
+                    0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
+                    0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
+                    0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
+                    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
+                    0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
+                    0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
+                    0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
+                    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
+                    0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
+                    0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
+                    0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
+                    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
+                    0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
+                    0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
+                    0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+    
+            function initQuantTables(sf){
+                    var YQT = [
+                        16, 11, 10, 16, 24, 40, 51, 61,
+                        12, 12, 14, 19, 26, 58, 60, 55,
+                        14, 13, 16, 24, 40, 57, 69, 56,
+                        14, 17, 22, 29, 51, 87, 80, 62,
+                        18, 22, 37, 56, 68,109,103, 77,
+                        24, 35, 55, 64, 81,104,113, 92,
+                        49, 64, 78, 87,103,121,120,101,
+                        72, 92, 95, 98,112,100,103, 99
+                    ];
+    
+                    for (var i = 0; i < 64; i++) {
+                        var t = ffloor((YQT[i]*sf+50)/100);
+                        if (t < 1) {
+                            t = 1;
+                        } else if (t > 255) {
+                            t = 255;
+                        }
+                        YTable[ZigZag[i]] = t;
+                    }
+                    var UVQT = [
+                        17, 18, 24, 47, 99, 99, 99, 99,
+                        18, 21, 26, 66, 99, 99, 99, 99,
+                        24, 26, 56, 99, 99, 99, 99, 99,
+                        47, 66, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99
+                    ];
+                    for (var j = 0; j < 64; j++) {
+                        var u = ffloor((UVQT[j]*sf+50)/100);
+                        if (u < 1) {
+                            u = 1;
+                        } else if (u > 255) {
+                            u = 255;
+                        }
+                        UVTable[ZigZag[j]] = u;
+                    }
+                    var aasf = [
+                        1.0, 1.387039845, 1.306562965, 1.175875602,
+                        1.0, 0.785694958, 0.541196100, 0.275899379
+                    ];
+                    var k = 0;
+                    for (var row = 0; row < 8; row++)
+                    {
+                        for (var col = 0; col < 8; col++)
+                        {
+                            fdtbl_Y[k]  = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            k++;
+                        }
+                    }
+                }
+    
+                function computeHuffmanTbl(nrcodes, std_table){
+                    var codevalue = 0;
+                    var pos_in_table = 0;
+                    var HT = new Array();
+                    for (var k = 1; k <= 16; k++) {
+                        for (var j = 1; j <= nrcodes[k]; j++) {
+                            HT[std_table[pos_in_table]] = [];
+                            HT[std_table[pos_in_table]][0] = codevalue;
+                            HT[std_table[pos_in_table]][1] = k;
+                            pos_in_table++;
+                            codevalue++;
+                        }
+                        codevalue*=2;
+                    }
+                    return HT;
+                }
+    
+                function initHuffmanTbl()
+                {
+                    YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
+                    UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
+                    YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
+                    UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
+                }
+    
+                function initCategoryNumber()
+                {
+                    var nrlower = 1;
+                    var nrupper = 2;
+                    for (var cat = 1; cat <= 15; cat++) {
+                        //Positive numbers
+                        for (var nr = nrlower; nr<nrupper; nr++) {
+                            category[32767+nr] = cat;
+                            bitcode[32767+nr] = [];
+                            bitcode[32767+nr][1] = cat;
+                            bitcode[32767+nr][0] = nr;
+                        }
+                        //Negative numbers
+                        for (var nrneg =-(nrupper-1); nrneg<=-nrlower; nrneg++) {
+                            category[32767+nrneg] = cat;
+                            bitcode[32767+nrneg] = [];
+                            bitcode[32767+nrneg][1] = cat;
+                            bitcode[32767+nrneg][0] = nrupper-1+nrneg;
+                        }
+                        nrlower <<= 1;
+                        nrupper <<= 1;
+                    }
+                }
+    
+                function initRGBYUVTable() {
+                    for(var i = 0; i < 256;i++) {
+                        RGB_YUV_TABLE[i]            =  19595 * i;
+                        RGB_YUV_TABLE[(i+ 256)>>0]  =  38470 * i;
+                        RGB_YUV_TABLE[(i+ 512)>>0]  =   7471 * i + 0x8000;
+                        RGB_YUV_TABLE[(i+ 768)>>0]  = -11059 * i;
+                        RGB_YUV_TABLE[(i+1024)>>0]  = -21709 * i;
+                        RGB_YUV_TABLE[(i+1280)>>0]  =  32768 * i + 0x807FFF;
+                        RGB_YUV_TABLE[(i+1536)>>0]  = -27439 * i;
+                        RGB_YUV_TABLE[(i+1792)>>0]  = - 5329 * i;
+                    }
+                }
+    
+                // IO functions
+                function writeBits(bs)
+                {
+                    var value = bs[0];
+                    var posval = bs[1]-1;
+                    while ( posval >= 0 ) {
+                        if (value & (1 << posval) ) {
+                            bytenew |= (1 << bytepos);
+                        }
+                        posval--;
+                        bytepos--;
+                        if (bytepos < 0) {
+                            if (bytenew == 0xFF) {
+                                writeByte(0xFF);
+                                writeByte(0);
+                            }
+                            else {
+                                writeByte(bytenew);
+                            }
+                            bytepos=7;
+                            bytenew=0;
+                        }
+                    }
+                }
+    
+                function writeByte(value)
+                {
+                    byteout.push(clt[value]); // write char directly instead of converting later
+                }
+    
+                function writeWord(value)
+                {
+                    writeByte((value>>8)&0xFF);
+                    writeByte((value   )&0xFF);
+                }
+    
+                // DCT & quantization core
+                function fDCTQuant(data, fdtbl)
+                {
+                    var d0, d1, d2, d3, d4, d5, d6, d7;
+                    /* Pass 1: process rows. */
+                    var dataOff=0;
+                    var i;
+                    var I8 = 8;
+                    var I64 = 64;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff+1];
+                        d2 = data[dataOff+2];
+                        d3 = data[dataOff+3];
+                        d4 = data[dataOff+4];
+                        d5 = data[dataOff+5];
+                        d6 = data[dataOff+6];
+                        d7 = data[dataOff+7];
+    
+                        var tmp0 = d0 + d7;
+                        var tmp7 = d0 - d7;
+                        var tmp1 = d1 + d6;
+                        var tmp6 = d1 - d6;
+                        var tmp2 = d2 + d5;
+                        var tmp5 = d2 - d5;
+                        var tmp3 = d3 + d4;
+                        var tmp4 = d3 - d4;
+    
+                        /* Even part */
+                        var tmp10 = tmp0 + tmp3;    /* phase 2 */
+                        var tmp13 = tmp0 - tmp3;
+                        var tmp11 = tmp1 + tmp2;
+                        var tmp12 = tmp1 - tmp2;
+    
+                        data[dataOff] = tmp10 + tmp11; /* phase 3 */
+                        data[dataOff+4] = tmp10 - tmp11;
+    
+                        var z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */
+                        data[dataOff+2] = tmp13 + z1; /* phase 5 */
+                        data[dataOff+6] = tmp13 - z1;
+    
+                        /* Odd part */
+                        tmp10 = tmp4 + tmp5; /* phase 2 */
+                        tmp11 = tmp5 + tmp6;
+                        tmp12 = tmp6 + tmp7;
+    
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */
+                        var z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */
+                        var z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */
+                        var z3 = tmp11 * 0.707106781; /* c4 */
+    
+                        var z11 = tmp7 + z3;    /* phase 5 */
+                        var z13 = tmp7 - z3;
+    
+                        data[dataOff+5] = z13 + z2; /* phase 6 */
+                        data[dataOff+3] = z13 - z2;
+                        data[dataOff+1] = z11 + z4;
+                        data[dataOff+7] = z11 - z4;
+    
+                        dataOff += 8; /* advance pointer to next row */
+                    }
+    
+                    /* Pass 2: process columns. */
+                    dataOff = 0;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff + 8];
+                        d2 = data[dataOff + 16];
+                        d3 = data[dataOff + 24];
+                        d4 = data[dataOff + 32];
+                        d5 = data[dataOff + 40];
+                        d6 = data[dataOff + 48];
+                        d7 = data[dataOff + 56];
+    
+                        var tmp0p2 = d0 + d7;
+                        var tmp7p2 = d0 - d7;
+                        var tmp1p2 = d1 + d6;
+                        var tmp6p2 = d1 - d6;
+                        var tmp2p2 = d2 + d5;
+                        var tmp5p2 = d2 - d5;
+                        var tmp3p2 = d3 + d4;
+                        var tmp4p2 = d3 - d4;
+    
+                        /* Even part */
+                        var tmp10p2 = tmp0p2 + tmp3p2;  /* phase 2 */
+                        var tmp13p2 = tmp0p2 - tmp3p2;
+                        var tmp11p2 = tmp1p2 + tmp2p2;
+                        var tmp12p2 = tmp1p2 - tmp2p2;
+    
+                        data[dataOff] = tmp10p2 + tmp11p2; /* phase 3 */
+                        data[dataOff+32] = tmp10p2 - tmp11p2;
+    
+                        var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781; /* c4 */
+                        data[dataOff+16] = tmp13p2 + z1p2; /* phase 5 */
+                        data[dataOff+48] = tmp13p2 - z1p2;
+    
+                        /* Odd part */
+                        tmp10p2 = tmp4p2 + tmp5p2; /* phase 2 */
+                        tmp11p2 = tmp5p2 + tmp6p2;
+                        tmp12p2 = tmp6p2 + tmp7p2;
+    
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433; /* c6 */
+                        var z2p2 = 0.541196100 * tmp10p2 + z5p2; /* c2-c6 */
+                        var z4p2 = 1.306562965 * tmp12p2 + z5p2; /* c2+c6 */
+                        var z3p2 = tmp11p2 * 0.707106781; /* c4 */
+    
+                        var z11p2 = tmp7p2 + z3p2;  /* phase 5 */
+                        var z13p2 = tmp7p2 - z3p2;
+    
+                        data[dataOff+40] = z13p2 + z2p2; /* phase 6 */
+                        data[dataOff+24] = z13p2 - z2p2;
+                        data[dataOff+ 8] = z11p2 + z4p2;
+                        data[dataOff+56] = z11p2 - z4p2;
+    
+                        dataOff++; /* advance pointer to next column */
+                    }
+    
+                    // Quantize/descale the coefficients
+                    var fDCTQuant;
+                    for (i=0; i<I64; ++i)
+                    {
+                        // Apply the quantization and scaling factor & Round to nearest integer
+                        fDCTQuant = data[i]*fdtbl[i];
+                        outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);
+                        //outputfDCTQuant[i] = fround(fDCTQuant);
+    
+                    }
+                    return outputfDCTQuant;
+                }
+    
+                function writeAPP0()
+                {
+                    writeWord(0xFFE0); // marker
+                    writeWord(16); // length
+                    writeByte(0x4A); // J
+                    writeByte(0x46); // F
+                    writeByte(0x49); // I
+                    writeByte(0x46); // F
+                    writeByte(0); // = "JFIF",'\0'
+                    writeByte(1); // versionhi
+                    writeByte(1); // versionlo
+                    writeByte(0); // xyunits
+                    writeWord(1); // xdensity
+                    writeWord(1); // ydensity
+                    writeByte(0); // thumbnwidth
+                    writeByte(0); // thumbnheight
+                }
+    
+                function writeSOF0(width, height)
+                {
+                    writeWord(0xFFC0); // marker
+                    writeWord(17);   // length, truecolor YUV JPG
+                    writeByte(8);    // precision
+                    writeWord(height);
+                    writeWord(width);
+                    writeByte(3);    // nrofcomponents
+                    writeByte(1);    // IdY
+                    writeByte(0x11); // HVY
+                    writeByte(0);    // QTY
+                    writeByte(2);    // IdU
+                    writeByte(0x11); // HVU
+                    writeByte(1);    // QTU
+                    writeByte(3);    // IdV
+                    writeByte(0x11); // HVV
+                    writeByte(1);    // QTV
+                }
+    
+                function writeDQT()
+                {
+                    writeWord(0xFFDB); // marker
+                    writeWord(132);    // length
+                    writeByte(0);
+                    for (var i=0; i<64; i++) {
+                        writeByte(YTable[i]);
+                    }
+                    writeByte(1);
+                    for (var j=0; j<64; j++) {
+                        writeByte(UVTable[j]);
+                    }
+                }
+    
+                function writeDHT()
+                {
+                    writeWord(0xFFC4); // marker
+                    writeWord(0x01A2); // length
+    
+                    writeByte(0); // HTYDCinfo
+                    for (var i=0; i<16; i++) {
+                        writeByte(std_dc_luminance_nrcodes[i+1]);
+                    }
+                    for (var j=0; j<=11; j++) {
+                        writeByte(std_dc_luminance_values[j]);
+                    }
+    
+                    writeByte(0x10); // HTYACinfo
+                    for (var k=0; k<16; k++) {
+                        writeByte(std_ac_luminance_nrcodes[k+1]);
+                    }
+                    for (var l=0; l<=161; l++) {
+                        writeByte(std_ac_luminance_values[l]);
+                    }
+    
+                    writeByte(1); // HTUDCinfo
+                    for (var m=0; m<16; m++) {
+                        writeByte(std_dc_chrominance_nrcodes[m+1]);
+                    }
+                    for (var n=0; n<=11; n++) {
+                        writeByte(std_dc_chrominance_values[n]);
+                    }
+    
+                    writeByte(0x11); // HTUACinfo
+                    for (var o=0; o<16; o++) {
+                        writeByte(std_ac_chrominance_nrcodes[o+1]);
+                    }
+                    for (var p=0; p<=161; p++) {
+                        writeByte(std_ac_chrominance_values[p]);
+                    }
+                }
+    
+                function writeSOS()
+                {
+                    writeWord(0xFFDA); // marker
+                    writeWord(12); // length
+                    writeByte(3); // nrofcomponents
+                    writeByte(1); // IdY
+                    writeByte(0); // HTY
+                    writeByte(2); // IdU
+                    writeByte(0x11); // HTU
+                    writeByte(3); // IdV
+                    writeByte(0x11); // HTV
+                    writeByte(0); // Ss
+                    writeByte(0x3f); // Se
+                    writeByte(0); // Bf
+                }
+    
+                function processDU(CDU, fdtbl, DC, HTDC, HTAC){
+                    var EOB = HTAC[0x00];
+                    var M16zeroes = HTAC[0xF0];
+                    var pos;
+                    var I16 = 16;
+                    var I63 = 63;
+                    var I64 = 64;
+                    var DU_DCT = fDCTQuant(CDU, fdtbl);
+                    //ZigZag reorder
+                    for (var j=0;j<I64;++j) {
+                        DU[ZigZag[j]]=DU_DCT[j];
+                    }
+                    var Diff = DU[0] - DC; DC = DU[0];
+                    //Encode DC
+                    if (Diff==0) {
+                        writeBits(HTDC[0]); // Diff might be 0
+                    } else {
+                        pos = 32767+Diff;
+                        writeBits(HTDC[category[pos]]);
+                        writeBits(bitcode[pos]);
+                    }
+                    //Encode ACs
+                    var end0pos = 63; // was const... which is crazy
+                    for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {};
+                    //end0pos = first element in reverse order !=0
+                    if ( end0pos == 0) {
+                        writeBits(EOB);
+                        return DC;
+                    }
+                    var i = 1;
+                    var lng;
+                    while ( i <= end0pos ) {
+                        var startpos = i;
+                        for (; (DU[i]==0) && (i<=end0pos); ++i) {}
+                        var nrzeroes = i-startpos;
+                        if ( nrzeroes >= I16 ) {
+                            lng = nrzeroes>>4;
+                            for (var nrmarker=1; nrmarker <= lng; ++nrmarker)
+                                writeBits(M16zeroes);
+                            nrzeroes = nrzeroes&0xF;
+                        }
+                        pos = 32767+DU[i];
+                        writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
+                        writeBits(bitcode[pos]);
+                        i++;
+                    }
+                    if ( end0pos != I63 ) {
+                        writeBits(EOB);
+                    }
+                    return DC;
+                }
+    
+                function initCharLookupTable(){
+                    var sfcc = String.fromCharCode;
+                    for(var i=0; i < 256; i++){ ///// ACHTUNG // 255
+                        clt[i] = sfcc(i);
+                    }
+                }
+    
+                this.encode = function(image,quality) // image data object
+                {
+                    // var time_start = new Date().getTime();
+    
+                    if(quality) setQuality(quality);
+    
+                    // Initialize bit writer
+                    byteout = new Array();
+                    bytenew=0;
+                    bytepos=7;
+    
+                    // Add JPEG headers
+                    writeWord(0xFFD8); // SOI
+                    writeAPP0();
+                    writeDQT();
+                    writeSOF0(image.width,image.height);
+                    writeDHT();
+                    writeSOS();
+    
+    
+                    // Encode 8x8 macroblocks
+                    var DCY=0;
+                    var DCU=0;
+                    var DCV=0;
+    
+                    bytenew=0;
+                    bytepos=7;
+    
+    
+                    this.encode.displayName = "_encode_";
+    
+                    var imageData = image.data;
+                    var width = image.width;
+                    var height = image.height;
+    
+                    var quadWidth = width*4;
+                    var tripleWidth = width*3;
+    
+                    var x, y = 0;
+                    var r, g, b;
+                    var start,p, col,row,pos;
+                    while(y < height){
+                        x = 0;
+                        while(x < quadWidth){
+                        start = quadWidth * y + x;
+                        p = start;
+                        col = -1;
+                        row = 0;
+    
+                        for(pos=0; pos < 64; pos++){
+                            row = pos >> 3;// /8
+                            col = ( pos & 7 ) * 4; // %8
+                            p = start + ( row * quadWidth ) + col;
+    
+                            if(y+row >= height){ // padding bottom
+                                p-= (quadWidth*(y+1+row-height));
+                            }
+    
+                            if(x+col >= quadWidth){ // padding right
+                                p-= ((x+col) - quadWidth +4)
+                            }
+    
+                            r = imageData[ p++ ];
+                            g = imageData[ p++ ];
+                            b = imageData[ p++ ];
+    
+    
+                            /* // calculate YUV values dynamically
+                            YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
+                            UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
+                            VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
+                            */
+    
+                            // use lookup table (slightly faster)
+                            YDU[pos] = ((RGB_YUV_TABLE[r]             + RGB_YUV_TABLE[(g +  256)>>0] + RGB_YUV_TABLE[(b +  512)>>0]) >> 16)-128;
+                            UDU[pos] = ((RGB_YUV_TABLE[(r +  768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;
+                            VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;
+    
+                        }
+    
+                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
+                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
+                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
+                        x+=32;
+                        }
+                        y+=8;
+                    }
+    
+    
+                    ////////////////////////////////////////////////////////////////
+    
+                    // Do the bit alignment of the EOI marker
+                    if ( bytepos >= 0 ) {
+                        var fillbits = [];
+                        fillbits[1] = bytepos+1;
+                        fillbits[0] = (1<<(bytepos+1))-1;
+                        writeBits(fillbits);
+                    }
+    
+                    writeWord(0xFFD9); //EOI
+    
+                    var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
+    
+                    byteout = [];
+    
+                    // benchmarking
+                    // var duration = new Date().getTime() - time_start;
+                    // console.log('Encoding time: '+ currentQuality + 'ms');
+                    //
+    
+                    return jpegDataUri
+            }
+    
+            function setQuality(quality){
+                if (quality <= 0) {
+                    quality = 1;
+                }
+                if (quality > 100) {
+                    quality = 100;
+                }
+    
+                if(currentQuality == quality) return // don't recalc if unchanged
+    
+                var sf = 0;
+                if (quality < 50) {
+                    sf = Math.floor(5000 / quality);
+                } else {
+                    sf = Math.floor(200 - quality*2);
+                }
+    
+                initQuantTables(sf);
+                currentQuality = quality;
+                // console.log('Quality set to: '+quality +'%');
+            }
+    
+            function init(){
+                // var time_start = new Date().getTime();
+                if(!quality) quality = 50;
+                // Create tables
+                initCharLookupTable()
+                initHuffmanTbl();
+                initCategoryNumber();
+                initRGBYUVTable();
+    
+                setQuality(quality);
+                // var duration = new Date().getTime() - time_start;
+                // console.log('Initialization '+ duration + 'ms');
+            }
+    
+            init();
+    
+        };
+    
+        JPEGEncoder.encode = function( data, quality ) {
+            var encoder = new JPEGEncoder( quality );
+    
+            return encoder.encode( data );
+        }
+    
+        return JPEGEncoder;
+    });
+    /**
+     * @fileOverview Fix android canvas.toDataUrl bug.
+     */
+    define('runtime/html5/androidpatch',[
+        'runtime/html5/util',
+        'runtime/html5/jpegencoder',
+        'base'
+    ], function( Util, encoder, Base ) {
+        var origin = Util.canvasToDataUrl,
+            supportJpeg;
+    
+        Util.canvasToDataUrl = function( canvas, type, quality ) {
+            var ctx, w, h, fragement, parts;
+    
+            // 非android手机直接跳过。
+            if ( !Base.os.android ) {
+                return origin.apply( null, arguments );
+            }
+    
+            // 检测是否canvas支持jpeg导出,根据数据格式来判断。
+            // JPEG 前两位分别是:255, 216
+            if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {
+                fragement = origin.apply( null, arguments );
+    
+                parts = fragement.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    fragement = atob( parts[ 1 ] );
+                } else {
+                    fragement = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                fragement = fragement.substring( 0, 2 );
+    
+                supportJpeg = fragement.charCodeAt( 0 ) === 255 &&
+                        fragement.charCodeAt( 1 ) === 216;
+            }
+    
+            // 只有在android环境下才修复
+            if ( type === 'image/jpeg' && !supportJpeg ) {
+                w = canvas.width;
+                h = canvas.height;
+                ctx = canvas.getContext('2d');
+    
+                return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );
+            }
+    
+            return origin.apply( null, arguments );
+        };
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('runtime/html5/image',[
+        'base',
+        'runtime/html5/runtime',
+        'runtime/html5/util'
+    ], function( Base, Html5Runtime, Util ) {
+    
+        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
+    
+        return Html5Runtime.register( 'Image', {
+    
+            // flag: 标记是否被修改过。
+            modified: false,
+    
+            init: function() {
+                var me = this,
+                    img = new Image();
+    
+                img.onload = function() {
+    
+                    me._info = {
+                        type: me.type,
+                        width: this.width,
+                        height: this.height
+                    };
+    
+                    // 读取meta信息。
+                    if ( !me._metas && 'image/jpeg' === me.type ) {
+                        Util.parseMeta( me._blob, function( error, ret ) {
+                            me._metas = ret;
+                            me.owner.trigger('load');
+                        });
+                    } else {
+                        me.owner.trigger('load');
+                    }
+                };
+    
+                img.onerror = function() {
+                    me.owner.trigger('error');
+                };
+    
+                me._img = img;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    img = me._img;
+    
+                me._blob = blob;
+                me.type = blob.type;
+                img.src = Util.createObjectURL( blob.getSource() );
+                me.owner.once( 'load', function() {
+                    Util.revokeObjectURL( img.src );
+                });
+            },
+    
+            resize: function( width, height ) {
+                var canvas = this._canvas ||
+                        (this._canvas = document.createElement('canvas'));
+    
+                this._resize( this._img, canvas, width, height );
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger('complete');
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this._blob,
+                    opts = this.options,
+                    canvas;
+    
+                type = type || this.type;
+    
+                // blob需要重新生成。
+                if ( this.modified || this.type !== type ) {
+                    canvas = this._canvas;
+    
+                    if ( type === 'image/jpeg' ) {
+    
+                        blob = Util.canvasToDataUrl( canvas, 'image/jpeg',
+                                opts.quality );
+    
+                        if ( opts.preserveHeaders && this._metas &&
+                                this._metas.imageHead ) {
+    
+                            blob = Util.dataURL2ArrayBuffer( blob );
+                            blob = Util.updateImageHead( blob,
+                                    this._metas.imageHead );
+                            blob = Util.arrayBufferToBlob( blob, type );
+                            return blob;
+                        }
+                    } else {
+                        blob = Util.canvasToDataUrl( canvas, type );
+                    }
+    
+                    blob = Util.dataURL2Blob( blob );
+                }
+    
+                return blob;
+            },
+    
+            getAsDataUrl: function( type ) {
+                var opts = this.options;
+    
+                type = type || this.type;
+    
+                if ( type === 'image/jpeg' ) {
+                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );
+                } else {
+                    return this._canvas.toDataURL( type );
+                }
+            },
+    
+            getOrientation: function() {
+                return this._metas && this._metas.exif &&
+                        this._metas.exif.get('Orientation') || 1;
+            },
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            destroy: function() {
+                var canvas = this._canvas;
+                this._img.onload = null;
+    
+                if ( canvas ) {
+                    canvas.getContext('2d')
+                            .clearRect( 0, 0, canvas.width, canvas.height );
+                    canvas.width = canvas.height = 0;
+                    this._canvas = null;
+                }
+    
+                // 释放内存。非常重要,否则释放不了image的内存。
+                this._img.src = BLANK;
+                this._img = this._blob = null;
+            },
+    
+            _resize: function( img, cvs, width, height ) {
+                var opts = this.options,
+                    naturalWidth = img.width,
+                    naturalHeight = img.height,
+                    orientation = this.getOrientation(),
+                    scale, w, h, x, y;
+    
+                // values that require 90 degree rotation
+                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+    
+                    // 交换width, height的值。
+                    width ^= height;
+                    height ^= width;
+                    width ^= height;
+                }
+    
+                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
+                        height / naturalHeight );
+    
+                // 不允许放大。
+                opts.allowMagnify || (scale = Math.min( 1, scale ));
+    
+                w = naturalWidth * scale;
+                h = naturalHeight * scale;
+    
+                if ( opts.crop ) {
+                    cvs.width = width;
+                    cvs.height = height;
+                } else {
+                    cvs.width = w;
+                    cvs.height = h;
+                }
+    
+                x = (cvs.width - w) / 2;
+                y = (cvs.height - h) / 2;
+    
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+    
+                this._renderImageToCanvas( cvs, img, x, y, w, h );
+            },
+    
+            _rotate2Orientaion: function( canvas, orientation ) {
+                var width = canvas.width,
+                    height = canvas.height,
+                    ctx = canvas.getContext('2d');
+    
+                switch ( orientation ) {
+                    case 5:
+                    case 6:
+                    case 7:
+                    case 8:
+                        canvas.width = height;
+                        canvas.height = width;
+                        break;
+                }
+    
+                switch ( orientation ) {
+                    case 2:    // horizontal flip
+                        ctx.translate( width, 0 );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 3:    // 180 rotate left
+                        ctx.translate( width, height );
+                        ctx.rotate( Math.PI );
+                        break;
+    
+                    case 4:    // vertical flip
+                        ctx.translate( 0, height );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 5:    // vertical flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 6:    // 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( 0, -height );
+                        break;
+    
+                    case 7:    // horizontal flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( width, -height );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 8:    // 90 rotate left
+                        ctx.rotate( -0.5 * Math.PI );
+                        ctx.translate( -width, 0 );
+                        break;
+                }
+            },
+    
+            // https://github.com/stomita/ios-imagefile-megapixel/
+            // blob/master/src/megapix-image.js
+            _renderImageToCanvas: (function() {
+    
+                // 如果不是ios, 不需要这么复杂!
+                if ( !Base.os.ios ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        canvas.getContext('2d').drawImage( img, x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detecting vertical squash in loaded image.
+                 * Fixes a bug which squash image vertically while drawing into
+                 * canvas for some images.
+                 */
+                function detectVerticalSquash( img, iw, ih ) {
+                    var canvas = document.createElement('canvas'),
+                        ctx = canvas.getContext('2d'),
+                        sy = 0,
+                        ey = ih,
+                        py = ih,
+                        data, alpha, ratio;
+    
+    
+                    canvas.width = 1;
+                    canvas.height = ih;
+                    ctx.drawImage( img, 0, 0 );
+                    data = ctx.getImageData( 0, 0, 1, ih ).data;
+    
+                    // search image edge pixel position in case
+                    // it is squashed vertically.
+                    while ( py > sy ) {
+                        alpha = data[ (py - 1) * 4 + 3 ];
+    
+                        if ( alpha === 0 ) {
+                            ey = py;
+                        } else {
+                            sy = py;
+                        }
+    
+                        py = (ey + sy) >> 1;
+                    }
+    
+                    ratio = (py / ih);
+                    return (ratio === 0) ? 1 : ratio;
+                }
+    
+                // fix ie7 bug
+                // http://stackoverflow.com/questions/11929099/
+                // html5-canvas-drawimage-ratio-bug-ios
+                if ( Base.os.ios >= 7 ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        var iw = img.naturalWidth,
+                            ih = img.naturalHeight,
+                            vertSquashRatio = detectVerticalSquash( img, iw, ih );
+    
+                        return canvas.getContext('2d').drawImage( img, 0, 0,
+                            iw * vertSquashRatio, ih * vertSquashRatio,
+                            x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detect subsampling in loaded image.
+                 * In iOS, larger images than 2M pixels may be
+                 * subsampled in rendering.
+                 */
+                function detectSubsampling( img ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        canvas, ctx;
+    
+                    // subsampling may happen overmegapixel image
+                    if ( iw * ih > 1024 * 1024 ) {
+                        canvas = document.createElement('canvas');
+                        canvas.width = canvas.height = 1;
+                        ctx = canvas.getContext('2d');
+                        ctx.drawImage( img, -iw + 1, 0 );
+    
+                        // subsampled image becomes half smaller in rendering size.
+                        // check alpha channel value to confirm image is covering
+                        // edge pixel or not. if alpha value is 0
+                        // image is not covering, hence subsampled.
+                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
+                    } else {
+                        return false;
+                    }
+                }
+    
+    
+                return function( canvas, img, x, y, width, height ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        ctx = canvas.getContext('2d'),
+                        subsampled = detectSubsampling( img ),
+                        doSquash = this.type === 'image/jpeg',
+                        d = 1024,
+                        sy = 0,
+                        dy = 0,
+                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
+    
+                    if ( subsampled ) {
+                        iw /= 2;
+                        ih /= 2;
+                    }
+    
+                    ctx.save();
+                    tmpCanvas = document.createElement('canvas');
+                    tmpCanvas.width = tmpCanvas.height = d;
+    
+                    tmpCtx = tmpCanvas.getContext('2d');
+                    vertSquashRatio = doSquash ?
+                            detectVerticalSquash( img, iw, ih ) : 1;
+    
+                    dw = Math.ceil( d * width / iw );
+                    dh = Math.ceil( d * height / ih / vertSquashRatio );
+    
+                    while ( sy < ih ) {
+                        sx = 0;
+                        dx = 0;
+                        while ( sx < iw ) {
+                            tmpCtx.clearRect( 0, 0, d, d );
+                            tmpCtx.drawImage( img, -sx, -sy );
+                            ctx.drawImage( tmpCanvas, 0, 0, d, d,
+                                    x + dx, y + dy, dw, dh );
+                            sx += d;
+                            dx += dw;
+                        }
+                        sy += d;
+                        dy += dh;
+                    }
+                    ctx.restore();
+                    tmpCanvas = tmpCtx = null;
+                };
+            })()
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var noop = Base.noop,
+            $ = Base.$;
+    
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+    
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+    
+                if ( binary ) {
+                    xhr.overrideMimeType('application/octet-stream');
+    
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+    
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+    
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+    
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+    
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+    
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+    
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+    
+                    return me.trigger( 'progress', percentage );
+                };
+    
+                xhr.onreadystatechange = function() {
+    
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+    
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+    
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+    
+    
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+    
+            _parseJson: function( str ) {
+                var json;
+    
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+    
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+    
+    
+        function getFlashVersion() {
+            var version;
+    
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+    
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destory = this.destory,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                clients[ uid ] = client;
+    
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+    
+                    instance = pool[ uid ];
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+    
+                return me.flashExec.apply( client, arguments );
+            };
+    
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+    
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+    
+                // console.log.apply( console, arguments );
+    
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+    
+                // Base.log( evt, obj );
+            }
+    
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+    
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+    
+            this.jsreciver = jsreciver;
+    
+            this.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+    
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+    
+                return flash.exec( this.uid, comp, fn, args );
+            };
+    
+            // @todo
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+    
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+    
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+    
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+    
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+    
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+    
+                container.html( html );
+            },
+    
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+    
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+    
+        });
+    
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+    
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+    
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+    
+            return component;
+        };
+    
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+    
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+    
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+    
+                delete copy.button;
+                delete copy.container;
+    
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * @fileOverview 图片压缩
+     */
+    define('runtime/flash/image',[
+        'runtime/flash/runtime'
+    ], function( FlashRuntime ) {
+    
+        return FlashRuntime.register( 'Image', {
+            // init: function( options ) {
+            //     var owner = this.owner;
+    
+            //     this.flashExec( 'Image', 'init', options );
+            //     owner.on( 'load', function() {
+            //         debugger;
+            //     });
+            // },
+    
+            loadFromBlob: function( blob ) {
+                var owner = this.owner;
+    
+                owner.info() && this.flashExec( 'Image', 'info', owner.info() );
+                owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );
+    
+                this.flashExec( 'Image', 'loadFromBlob', blob.uid );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+    
+                xhr.connectRuntime( blob.ruid );
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+    
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server
+                }, binary );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+    
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    return me.trigger( 'progress', e.loaded / e.total );
+                });
+    
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        err = '';
+    
+                    xhr.off();
+                    me._xhr = null;
+    
+                    if ( status >= 200 && status < 300 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                    } else if ( status >= 500 && status < 600 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+    
+                    xhr.destroy();
+                    xhr = null;
+    
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+    
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview 完全版本。
+     */
+    define('preset/all',[
+        'base',
+    
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+    
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/imagemeta/exif',
+        'runtime/html5/androidpatch',
+        'runtime/html5/image',
+        'runtime/html5/transport',
+    
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/image',
+        'runtime/flash/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/all'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.min.js
new file mode 100644
index 0000000..8807780
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",getDimension:"get-dimension",addButton:"add-btn",getRuntimeType:"get-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.disconnectRuntime()}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.exec("destroy"),this.disconnectRuntime(),this.off()}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){b._info=b._info||d.info(),b._meta=b._meta||d.meta(),d.resize(g.width,g.height)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,a.size<c&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destory:function(){delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d.getStats().numOfQueue||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_nextBlock:function(){var a,b,c=this,d=c._act,f=c.options;return d&&d.has()&&d.file.getStatus()===h.PROGRESS?(f.prepareNextFile&&!c.pending.length&&c._prepareNextFile(),d.fetch()):c.runing?(!c.pending.length&&c.getStats().numOfQueue&&c._prepareNextFile(),a=c.pending.shift(),b=function(a){return a?(d=e(a,f.chunked?f.chunkSize:0),c._act=d,d.fetch()):null},g(a)?a[a.pipe?"pipe":"then"](b):b(a)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.QUEUED?(b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),c):b._finishFile(c)}),a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d._popBlock(b),a.nextTick(d.__tick))})},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){var c=0,d=0;c=b.percentage=a,b.chunks>1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))
+},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b=this,f=b.getRuid(),g=b.elem.parent().get(0);return g&&!d.contains(g,a.currentTarget)?!1:(b._getTansferFiles(a,function(a){b.trigger("drop",d.map(a,function(a){return new c(f,a)}))}),b.dndOver=!1,b.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k,l=[],m=[];for(b=b.originalEvent||b,f=b.dataTransfer,d=f.items,e=f.files,k=!(!d||!d[0].webkitGetAsEntry),i=0,j=e.length;j>i;i++)g=e[i],h=d&&d[i],k&&h.webkitGetAsEntry().isDirectory?m.push(this._traverseDirectoryTree(h.webkitGetAsEntry(),l)):l.push(g);a.when.apply(a,m).done(function(){l.length&&c(l)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragEnterHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;e<b.length;e++)c[e]=b.charCodeAt(e);return f=g[0].split(":")[1].split(";")[0],this.arrayBufferToBlob(d,f)},dataURL2ArrayBuffer:function(a){var b,c,d,e;for(e=a.split(","),b=~e[0].indexOf("base64")?atob(e[1]):decodeURIComponent(e[1]),c=new Uint8Array(b.length),d=0;d<b.length;d++)c[d]=b.charCodeAt(d);return c.buffer},arrayBufferToBlob:function(b,c){var d,e=a.BlobBuilder||a.WebKitBlobBuilder;return e?(d=new e,d.append(b),d.getBlob(c)):new Blob([b],c?{type:c}:{})},canvasToDataUrl:function(a,b,c){return a.toDataURL(b,c/100)},parseMeta:function(a,b){b(!1,{})},updateImageHead:function(a){return a}}}),b("runtime/html5/imagemeta",["runtime/html5/util"],function(a){var b;return b={parsers:{65505:[]},maxMetaDataSize:262144,parse:function(a,b){var c=this,d=new FileReader;d.onload=function(){b(!1,c._parse(this.result)),d=d.onload=d.onerror=null},d.onerror=function(a){b(a.message),d=d.onload=d.onerror=null},a=a.slice(0,c.maxMetaDataSize),d.readAsArrayBuffer(a.getSource())},_parse:function(a,c){if(!(a.byteLength<6)){var d,e,f,g,h=new DataView(a),i=2,j=h.byteLength-4,k=i,l={};if(65496===h.getUint16(0)){for(;j>i&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g<f.length;g+=1)f[g].call(b,h,i,e,l);i+=e,k=i}k>6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;l<k.length&&(n=k[l],"\x00"!==n);l+=1)m+=n;return m}return k},c.parseExifTag=function(a,b,d,e,f){var g=a.getUint16(d,e);f.exif[g]=c.getExifValue(a,b,d,a.getUint16(d+2,e),a.getUint32(d+4,e),e)},c.parseExifTags=function(b,c,d,e,f){var g,h,i;if(d+6>b.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/jpegencoder",[],function(){function a(a){function b(a){for(var b=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],c=0;64>c;c++){var d=y((b[c]*a+50)/100);1>d?d=1:d>255&&(d=255),z[P[c]]=d}for(var e=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],f=0;64>f;f++){var g=y((e[f]*a+50)/100);1>g?g=1:g>255&&(g=255),A[P[f]]=g}for(var h=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],i=0,j=0;8>j;j++)for(var k=0;8>k;k++)B[i]=1/(z[P[i]]*h[j]*h[k]*8),C[i]=1/(A[P[i]]*h[j]*h[k]*8),i++}function c(a,b){for(var c=0,d=0,e=new Array,f=1;16>=f;f++){for(var g=1;g<=a[f];g++)e[b[d]]=[],e[b[d]][0]=c,e[b[d]][1]=f,d++,c++;c*=2}return e}function d(){t=c(Q,R),u=c(U,V),v=c(S,T),w=c(W,X)}function e(){for(var a=1,b=2,c=1;15>=c;c++){for(var d=a;b>d;d++)E[32767+d]=c,D[32767+d]=[],D[32767+d][1]=c,D[32767+d][0]=d;for(var e=-(b-1);-a>=e;e++)E[32767+e]=c,D[32767+e]=[],D[32767+e][1]=c,D[32767+e][0]=b-1+e;a<<=1,b<<=1}}function f(){for(var a=0;256>a;a++)O[a]=19595*a,O[a+256>>0]=38470*a,O[a+512>>0]=7471*a+32768,O[a+768>>0]=-11059*a,O[a+1024>>0]=-21709*a,O[a+1280>>0]=32768*a+8421375,O[a+1536>>0]=-27439*a,O[a+1792>>0]=-5329*a}function g(a){for(var b=a[0],c=a[1]-1;c>=0;)b&1<<c&&(I|=1<<J),c--,J--,0>J&&(255==I?(h(255),h(0)):h(I),J=7,I=0)}function h(a){H.push(N[a])}function i(a){h(a>>8&255),h(255&a)}function j(a,b){var c,d,e,f,g,h,i,j,k,l=0,m=8,n=64;for(k=0;m>k;++k){c=a[l],d=a[l+1],e=a[l+2],f=a[l+3],g=a[l+4],h=a[l+5],i=a[l+6],j=a[l+7];var o=c+j,p=c-j,q=d+i,r=d-i,s=e+h,t=e-h,u=f+g,v=f-g,w=o+u,x=o-u,y=q+s,z=q-s;a[l]=w+y,a[l+4]=w-y;var A=.707106781*(z+x);a[l+2]=x+A,a[l+6]=x-A,w=v+t,y=t+r,z=r+p;var B=.382683433*(w-z),C=.5411961*w+B,D=1.306562965*z+B,E=.707106781*y,G=p+E,H=p-E;a[l+5]=H+C,a[l+3]=H-C,a[l+1]=G+D,a[l+7]=G-D,l+=8}for(l=0,k=0;m>k;++k){c=a[l],d=a[l+8],e=a[l+16],f=a[l+24],g=a[l+32],h=a[l+40],i=a[l+48],j=a[l+56];var I=c+j,J=c-j,K=d+i,L=d-i,M=e+h,N=e-h,O=f+g,P=f-g,Q=I+O,R=I-O,S=K+M,T=K-M;a[l]=Q+S,a[l+32]=Q-S;var U=.707106781*(T+R);a[l+16]=R+U,a[l+48]=R-U,Q=P+N,S=N+L,T=L+J;var V=.382683433*(Q-T),W=.5411961*Q+V,X=1.306562965*T+V,Y=.707106781*S,Z=J+Y,$=J-Y;a[l+40]=$+W,a[l+24]=$-W,a[l+8]=Z+X,a[l+56]=Z-X,l++}var _;for(k=0;n>k;++k)_=a[k]*b[k],F[k]=_>0?_+.5|0:_-.5|0;return F}function k(){i(65504),i(16),h(74),h(70),h(73),h(70),h(0),h(1),h(1),h(0),i(1),i(1),h(0),h(0)}function l(a,b){i(65472),i(17),h(8),i(b),i(a),h(3),h(1),h(17),h(0),h(2),h(17),h(1),h(3),h(17),h(1)}function m(){i(65499),i(132),h(0);for(var a=0;64>a;a++)h(z[a]);h(1);for(var b=0;64>b;b++)h(A[b])}function n(){i(65476),i(418),h(0);for(var a=0;16>a;a++)h(Q[a+1]);for(var b=0;11>=b;b++)h(R[b]);h(16);for(var c=0;16>c;c++)h(S[c+1]);for(var d=0;161>=d;d++)h(T[d]);h(1);for(var e=0;16>e;e++)h(U[e+1]);for(var f=0;11>=f;f++)h(V[f]);h(17);for(var g=0;16>g;g++)h(W[g+1]);for(var j=0;161>=j;j++)h(X[j])}function o(){i(65498),i(12),h(3),h(1),h(0),h(2),h(17),h(3),h(17),h(0),h(63),h(0)}function p(a,b,c,d,e){for(var f,h=e[0],i=e[240],k=16,l=63,m=64,n=j(a,b),o=0;m>o;++o)G[P[o]]=n[o];var p=G[0]-c;c=G[0],0==p?g(d[0]):(f=32767+p,g(d[E[f]]),g(D[f]));for(var q=63;q>0&&0==G[q];q--);if(0==q)return g(h),c;for(var r,s=1;q>=s;){for(var t=s;0==G[s]&&q>=s;++s);var u=s-t;if(u>=k){r=u>>4;for(var v=1;r>=v;++v)g(i);u=15&u}f=32767+G[s],g(e[(u<<4)+E[f]]),g(D[f]),s++}return q!=l&&g(h),c}function q(){for(var a=String.fromCharCode,b=0;256>b;b++)N[b]=a(b)}function r(a){if(0>=a&&(a=1),a>100&&(a=100),x!=a){var c=0;c=Math.floor(50>a?5e3/a:200-2*a),b(c),x=a}}function s(){a||(a=50),q(),d(),e(),f(),r(a)}var t,u,v,w,x,y=(Math.round,Math.floor),z=new Array(64),A=new Array(64),B=new Array(64),C=new Array(64),D=new Array(65535),E=new Array(65535),F=new Array(64),G=new Array(64),H=[],I=0,J=7,K=new Array(64),L=new Array(64),M=new Array(64),N=new Array(256),O=new Array(2048),P=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],Q=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],R=[0,1,2,3,4,5,6,7,8,9,10,11],S=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],T=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],U=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],V=[0,1,2,3,4,5,6,7,8,9,10,11],W=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],X=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];this.encode=function(a,b){b&&r(b),H=new Array,I=0,J=7,i(65496),k(),m(),l(a.width,a.height),n(),o();var c=0,d=0,e=0;I=0,J=7,this.encode.displayName="_encode_";for(var f,h,j,q,s,x,y,z,A,D=a.data,E=a.width,F=a.height,G=4*E,N=0;F>N;){for(f=0;G>f;){for(s=G*N+f,x=s,y=-1,z=0,A=0;64>A;A++)z=A>>3,y=4*(7&A),x=s+z*G+y,N+z>=F&&(x-=G*(N+1+z-F)),f+y>=G&&(x-=f+y-G+4),h=D[x++],j=D[x++],q=D[x++],K[A]=(O[h]+O[j+256>>0]+O[q+512>>0]>>16)-128,L[A]=(O[h+768>>0]+O[j+1024>>0]+O[q+1280>>0]>>16)-128,M[A]=(O[h+1280>>0]+O[j+1536>>0]+O[q+1792>>0]>>16)-128;c=p(K,B,c,t,v),d=p(L,C,d,u,w),e=p(M,C,e,u,w),f+=32}N+=8}if(J>=0){var P=[];P[1]=J+1,P[0]=(1<<J+1)-1,g(P)}i(65497);var Q="data:image/jpeg;base64,"+btoa(H.join(""));return H=[],Q},s()}return a.encode=function(b,c){var d=new a(c);return d.encode(b)},a}),b("runtime/html5/androidpatch",["runtime/html5/util","runtime/html5/jpegencoder","base"],function(a,b,c){var d,e=a.canvasToDataUrl;a.canvasToDataUrl=function(a,f,g){var h,i,j,k,l;return c.os.android?("image/jpeg"===f&&"undefined"==typeof d&&(k=e.apply(null,arguments),l=k.split(","),k=~l[0].indexOf("base64")?atob(l[1]):decodeURIComponent(l[1]),k=k.substring(0,2),d=255===k.charCodeAt(0)&&216===k.charCodeAt(1)),"image/jpeg"!==f||d?e.apply(null,arguments):(i=a.width,j=a.height,h=a.getContext("2d"),b.encode(h.getImageData(0,0,i,j),g))):e.apply(null,arguments)}}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,"image/jpeg",e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(a,b,c,d,e,f){a.getContext("2d").drawImage(b,c,d,e,f)}}()})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destory,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destory=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){}})}),b("runtime/flash/image",["runtime/flash/runtime"],function(a){return a.register("Image",{loadFromBlob:function(a){var b=this.owner;b.info()&&this.flashExec("Image","info",b.info()),b.meta()&&this.flashExec("Image","meta",b.meta()),this.flashExec("Image","loadFromBlob",a.uid)}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(a,b,c){var d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,e=this._initAjax(),f=b._blob,g=c.server;e.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+d.param(b._formData),a=f.uid):(d.each(b._formData,function(a,b){e.exec("append",a,b)}),e.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(e,c.headers),e.exec("send",{method:c.method,url:g},a)},getStatus:function(){return this._status},getResponse:function(){return this._response},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new c("XMLHttpRequest");return b.on("uploadprogress progress",function(b){return a.trigger("progress",b.loaded/b.total)}),b.on("load",function(){var c=b.exec("getStatus"),d="";return b.off(),a._xhr=null,c>=200&&300>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson")):c>=500&&600>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson"),d="server"):d="http",b.destroy(),b=null,d?a.trigger("error",d):a.trigger("load")}),b.on("error",function(){b.off(),a._xhr=null,a.trigger("error","http")}),a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("preset/all",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/androidpatch","runtime/html5/image","runtime/html5/transport","runtime/flash/filepicker","runtime/flash/image","runtime/flash/transport"],function(a){return a}),b("webuploader",["preset/all"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.withoutimage.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.withoutimage.js
new file mode 100644
index 0000000..1b921c3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.withoutimage.js
@@ -0,0 +1,4593 @@
+/*! WebUploader 0.1.2 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+        },
+
+        exports = factory( root, _define, _require ),
+        origin;
+
+    // exports every module.
+    exportsTo( exports );
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = exports;
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([], exports );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = exports;
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( this, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        return window.jQuery || window.Zepto;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+    
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+    
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档将可能省略`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+    
+        var noop = function() {},
+            call = Function.call;
+    
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+    
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+    
+        function createObject( proto ) {
+            var f;
+    
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+    
+    
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+    
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.2',
+    
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+    
+            Deferred: promise.Deferred,
+    
+            isPromise: promise.isPromise,
+    
+            when: promise.when,
+    
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+    
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+    
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+    
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+    
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+    
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+    
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+    
+                /* jshint camelcase: false */
+    
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+    
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+    
+                return child;
+            },
+    
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+    
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+    
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+    
+            nextTick: (function() {
+    
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+    
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+    
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+    
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+    
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+    
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+    
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+    
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+    
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+    
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+    
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+    
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+    
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+    
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+    
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+    
+            while ( ++i < len ) {
+                handler = events[ i ];
+    
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+    
+            return !stoped;
+        }
+    
+        protos = {
+    
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+    
+                if ( !callback ) {
+                    return this;
+                }
+    
+                set = this._events || (this._events = []);
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+    
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+    
+                    set.push( handler );
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+    
+                if ( !callback ) {
+                    return me;
+                }
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+    
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+    
+                return me;
+            },
+    
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+    
+                if ( !events ) {
+                    return this;
+                }
+    
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+    
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+    
+                if ( !this._events || !type ) {
+                    return this;
+                }
+    
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+    
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+    
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+    
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+    
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$;
+    
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+    
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+    
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            getRuntimeType: 'get-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+    
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+    
+            _init: function( opts ) {
+                var me = this;
+    
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+    
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     resize: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.options( 'resize', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+    
+                // setter
+                if ( arguments.length > 1 ) {
+    
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+    
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+    
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `queueNum` 还在队列中的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+    
+                return {
+                    successNum: stats.numOfSuccess,
+    
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue
+                };
+            },
+    
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+    
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+    
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+    
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+    
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+    
+                    return false;
+                }
+    
+                return true;
+            },
+    
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+    
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+    
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+    
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            factories = {},
+    
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+    
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+    
+        $.extend( Runtime.prototype, {
+    
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+    
+                if ( this._container ) {
+                    return this._container;
+                }
+    
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+    
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+    
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                return container;
+            },
+    
+            init: Base.noop,
+            exec: Base.noop,
+    
+            destroy: function() {
+                if ( this._container ) {
+                    this._container.parentNode.removeChild( this.__container );
+                }
+    
+                this.off();
+            }
+        });
+    
+        Runtime.orders = 'html5,flash';
+    
+    
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+    
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+    
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+    
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+    
+            type = type || getFirstKey( factories );
+    
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+    
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+    
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+    
+        var cache;
+    
+        cache = (function() {
+            var obj = {};
+    
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+    
+                get: function( ruid, standalone ) {
+                    var i;
+    
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+    
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+    
+                        return obj[ i ];
+                    }
+    
+                    return null;
+                },
+    
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+    
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+    
+            this.uid = Base.guid('client_');
+    
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+    
+            this.connectRuntime = function( opts, cb ) {
+    
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+    
+                deferred.done( cb );
+    
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+    
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+    
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+    
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                runtime.__client--;
+    
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+    
+                runtime = null;
+            };
+    
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+    
+                return runtime.exec.apply( this, args );
+            };
+    
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+    
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+    
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+    
+            opts.container = $( opts.container );
+    
+            if ( !opts.container.length ) {
+                return;
+            }
+    
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+    
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.disconnectRuntime();
+            }
+        });
+    
+        Mediator.installTo( DragAndDrop.prototype );
+    
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+    
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            IGNORE = {},
+            widgetClass = [];
+    
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+    
+            var length = obj.length,
+                type = $.type( obj );
+    
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+    
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+    
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+    
+        $.extend( Widget.prototype, {
+    
+            init: Base.noop,
+    
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+    
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+    
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+    
+                    return IGNORE;
+                }
+    
+                return this[ map[ apiName ] ].apply( this, args );
+    
+            },
+    
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+    
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+    
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [];
+    
+                $.each( widgetClass, function( _, klass ) {
+                    widgets.push( new klass( me ) );
+                });
+    
+                return _init.apply( me, arguments );
+            },
+    
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+    
+                args = isArrayLike( args ) ? args : [ args ];
+    
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+    
+                    if ( rlt !== IGNORE ) {
+    
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+    
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+    
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个tick中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+    
+                                setTimeout(function() {
+                                    deferred.resolve.apply( deferred, args );
+                                }, 1 );
+    
+                                return deferred.promise();
+                            })[ key ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            }
+        });
+    
+        /**
+         * 添加组件
+         * @param  {object} widgetProto 组件原型,构造函数通过constructor属性定义
+         * @param  {object} responseMap API名称与函数实现的映射
+         * @example
+         *     Uploader.register( {
+         *         init: function( options ) {},
+         *         makeThumb: function() {}
+         *     }, {
+         *         'make-thumb': 'makeThumb'
+         *     } );
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init' },
+                klass;
+    
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+                widgetProto.responseMap = map;
+            } else {
+                widgetProto.responseMap = $.extend( map, responseMap );
+            }
+    
+            klass = Base.inherits( Widget, widgetProto );
+            widgetClass.push( klass );
+    
+            return klass;
+        };
+    
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+    
+        Uploader.options.dnd = '';
+    
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+    
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+    
+                dnd = new Dnd( options );
+    
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+    
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+    
+                dnd.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.exec('destroy');
+                this.disconnectRuntime();
+                this.off();
+            }
+        });
+    
+        Mediator.installTo( FilePaste.prototype );
+    
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+    
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+    
+                paste = new FilePaste( options );
+    
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+    
+        function Blob( ruid, source ) {
+            var me = this;
+    
+            me.source = source;
+            me.ruid = ruid;
+    
+            RuntimeClient.call( me, 'Blob' );
+    
+            this.uid = source.uid || this.uid;
+            this.type = source.type || '';
+            this.size = source.size || 0;
+    
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+    
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+    
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+    
+            getSource: function() {
+                return this.source;
+            }
+        });
+    
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+    
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+    
+        function File( ruid, file ) {
+            var ext;
+    
+            Blob.apply( this, arguments );
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+    
+            // todo 支持其他类型文件的转换。
+    
+            // 如果有mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && this.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+    
+            // 如果没有指定mimetype, 但是知道文件后缀。
+            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
+                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
+            }
+    
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+        }
+    
+        return Base.inherits( Blob, File );
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+    
+        var $ = Base.$;
+    
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+    
+            opts.container = $( opts.id );
+    
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+    
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+    
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+    
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+    
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+    
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+    
+                button.addClass('webuploader-pick');
+    
+                me.on( 'all', function( type ) {
+                    var files;
+    
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+    
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+    
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+    
+                $( window ).on( 'resize', function() {
+                    me.refresh();
+                });
+            },
+    
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+    
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+    
+                    pos = button.offset();
+    
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+    
+            enable: function() {
+                var btn = this.options.button;
+    
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+    
+            disable: function() {
+                var btn = this.options.button;
+    
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+    
+                btn.addClass('webuploader-pick-disable');
+            },
+    
+            destroy: function() {
+                if ( this.runtime ) {
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                }
+            }
+        });
+    
+        return FilePicker;
+    });
+    
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+    
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+    
+        return Uploader.register({
+            'add-btn': 'addButton',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable'
+        }, {
+    
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addButton( opts.pick );
+            },
+    
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+    
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addButton: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    options, picker, deferred;
+    
+                if ( !pick ) {
+                    return;
+                }
+    
+                deferred = Base.Deferred();
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+    
+                options = $.extend({}, pick, {
+                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                    swf: opts.swf,
+                    runtimeOrder: opts.runtimeOrder
+                });
+    
+                picker = new FilePicker( options );
+    
+                picker.once( 'ready', deferred.resolve );
+                picker.on( 'select', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                picker.init();
+    
+                this.pickers.push( picker );
+    
+                return deferred.promise();
+            },
+    
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+    
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+    
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+    
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+    
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+    
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+    
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application'
+             */
+            this.type = source.type || 'application';
+    
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+    
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+    
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+    
+    
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+    
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+    
+            this.source = source;
+            this.loaded = 0;
+    
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+    
+        $.extend( WUFile.prototype, {
+    
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+    
+                var prevStatus = statusMap[ this.id ];
+    
+                typeof text !== 'undefined' && (this.statusText = text);
+    
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+    
+            },
+    
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+    
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+    
+            destory: function() {
+                delete statusMap[ this.id ];
+            }
+        });
+    
+        Mediator.installTo( WUFile.prototype );
+    
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+    
+        return WUFile;
+    });
+    
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+    
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+    
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+    
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被移除的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0
+            };
+    
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+    
+            // 存储所有文件
+            this._map = {};
+        }
+    
+        $.extend( Queue.prototype, {
+    
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+    
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+    
+                status = status || STATUS.QUEUED;
+    
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+    
+                return null;
+            },
+    
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+    
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+    
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+    
+                    ret.push( file );
+                }
+    
+                return ret;
+            },
+    
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+    
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+    
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+    
+                file.setStatus( STATUS.QUEUED );
+            },
+    
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+    
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+    
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+                }
+    
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+    
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+    
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+    
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+                }
+            }
+    
+        });
+    
+        Mediator.installTo( Queue.prototype );
+    
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+    
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+    
+        return Uploader.register({
+            'sort-files': 'sortFiles',
+            'add-file': 'addFiles',
+            'get-file': 'getFile',
+            'fetch-file': 'fetchFile',
+            'get-stats': 'getStats',
+            'get-files': 'getFiles',
+            'remove-file': 'removeFile',
+            'retry': 'retry',
+            'reset': 'reset',
+            'accept-file': 'acceptFile'
+        }, {
+    
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+    
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+    
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+    
+                    me.accept = new RegExp( accept, 'i' );
+                }
+    
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+    
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+    
+    
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+    
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+    
+                    file = new WUFile( file );
+                }
+    
+                return file;
+            },
+    
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || file.size < 6 || this.accept &&
+    
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+    
+                return !invalid;
+            },
+    
+    
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+    
+            _addFile: function( file ) {
+                var me = this;
+    
+                file = me._wrapFile( file );
+    
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+    
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+    
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+    
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+    
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFiles: function( files ) {
+                var me = this;
+    
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+    
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+    
+                me.owner.trigger( 'filesQueued', files );
+    
+                if ( me.options.auto ) {
+                    me.request('start-upload');
+                }
+            },
+    
+            getStats: function() {
+                return this.stats;
+            },
+    
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file ) {
+                var me = this;
+    
+                file = file.id ? file : me.queue.getFile( file );
+    
+                file.setStatus( Status.CANCELLED );
+                me.owner.trigger( 'fileDequeued', file );
+            },
+    
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+    
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+    
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+    
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+    
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+    
+                me.request('start-upload');
+            },
+    
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            }
+        });
+    
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+    
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+    
+        return Uploader.register({
+            'predict-runtime-type': 'predictRuntmeType'
+        }, {
+    
+            init: function() {
+                if ( !this.predictRuntmeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+    
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntmeType() => String
+             * @method predictRuntmeType
+             * @for  Uploader
+             */
+            predictRuntmeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+    
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+    
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+    
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+    
+        var $ = Base.$;
+    
+        function Transport( opts ) {
+            var me = this;
+    
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+    
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+    
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+    
+        Transport.options = {
+            server: '',
+            method: 'POST',
+    
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+    
+        $.extend( Transport.prototype, {
+    
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+    
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+    
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+    
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+    
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+    
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+    
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+    
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+    
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+    
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+    
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+    
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+    
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+    
+                if ( !duration ) {
+                    return;
+                }
+    
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+    
+        });
+    
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+    
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+    
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+    
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+    
+    
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+    
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+    
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+    
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+    
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+    
+    
+            /**
+             * @property {Object} [formData]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: null
+    
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+    
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+    
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+    
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len;
+    
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+    
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++
+                });
+                start += len;
+            }
+    
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+    
+            return {
+                file: file,
+    
+                has: function() {
+                    return !!pending.length;
+                },
+    
+                fetch: function() {
+                    return pending.shift();
+                }
+            };
+        }
+    
+        Uploader.register({
+            'start-upload': 'start',
+            'stop-upload': 'stop',
+            'skip-file': 'skipFile',
+            'is-in-progress': 'isInProgress'
+        }, {
+    
+            init: function() {
+                var owner = this.owner;
+    
+                this.runing = false;
+    
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+    
+                // 缓存即将上传的文件。
+                this.pending = [];
+    
+                // 跟踪还有多少分片没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+    
+                owner.on( 'uploadComplete', function( file ) {
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+    
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+    
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             * @grammar upload() => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            start: function() {
+                var me = this;
+    
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+    
+                if ( me.runing ) {
+                    return;
+                }
+    
+                me.runing = true;
+    
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+    
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        file.setStatus( Status.PROGRESS );
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+    
+                me._trigged = false;
+                me.owner.trigger('startUpload');
+                Base.nextTick( me.__tick );
+            },
+    
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stop: function( interrupt ) {
+                var me = this;
+    
+                if ( me.runing === false ) {
+                    return;
+                }
+    
+                me.runing = false;
+    
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+    
+                me.owner.trigger('stopUpload');
+            },
+    
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.runing;
+            },
+    
+            getStats: function() {
+                return this.request('get-stats');
+            },
+    
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = this.request( 'get-file', file );
+    
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+    
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+    
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+    
+                this.owner.trigger( 'uploadSkip', file );
+            },
+    
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+    
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+    
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+    
+                    fn = function( val ) {
+                        me._promise = null;
+    
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+    
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+    
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me.getStats().numOfQueue ) {
+                    me.runing = false;
+    
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+    
+            _nextBlock: function() {
+                var me = this,
+                    act = me._act,
+                    opts = me.options,
+                    next, done;
+    
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( act && act.has() &&
+                        act.file.getStatus() === Status.PROGRESS ) {
+    
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+    
+                    return act.fetch();
+    
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+    
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me.getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+    
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+    
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me._act = act;
+                        return act.fetch();
+                    };
+    
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    return isPromise( next ) ?
+                            next[ next.pipe ? 'pipe' : 'then']( done ) :
+                            done( next );
+                }
+            },
+    
+    
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+    
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+    
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.QUEUED ) {
+                            me.owner.trigger( 'uploadStart', file );
+                            file.setStatus( Status.PROGRESS );
+                            return file;
+                        }
+    
+                        return me._finishFile( file );
+                    });
+    
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+    
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+    
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+    
+                    pending.push( promise );
+                }
+            },
+    
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+    
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+    
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+    
+                me.pool.push( block );
+                me.remaning++;
+    
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+    
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+    
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+    
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+    
+    
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+    
+    
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+    
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+    
+                block.transport = tr;
+    
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+    
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    var totalPercent = 0,
+                        uploaded = 0;
+    
+                    // 可能没有abort掉,progress还是执行进来了。
+                    // if ( !file.blocks ) {
+                    //     return;
+                    // }
+    
+                    totalPercent = block.percentage = percentage;
+    
+                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。
+                        $.each( file.blocks, function( _, v ) {
+                            uploaded += (v.percentage || 0) * (v.end - v.start);
+                        });
+    
+                        totalPercent = uploaded / file.size;
+                    }
+    
+                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+                });
+    
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+    
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+    
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+    
+                    return reject;
+                };
+    
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+    
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+    
+                        block.retried++;
+                        tr.send();
+    
+                    } else {
+    
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+    
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+    
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+    
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+    
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+    
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+    
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+    
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+    
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+    
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+    
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+    
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+    
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            }
+    
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+    
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+    
+        var $ = Base.$,
+            validators = {},
+            api;
+    
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * @for  Uploader
+         */
+    
+        // 暴露给外面的api
+        api = {
+    
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+    
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+    
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            init: function() {
+                var me = this;
+                $.each( validators, function() {
+                    this.call( me.owner );
+                });
+            }
+        });
+    
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileNumLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return count >= max ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+    
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+    
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileSizeLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+    
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return invalid ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', file );
+                    return false;
+                }
+    
+            });
+    
+        });
+    
+        /**
+         * @property {int} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+    
+            if ( opts.duplicate ) {
+                return;
+            }
+    
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+    
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+    
+                return hash;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+    
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (mapping[ hash ] = true);
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (delete mapping[ hash ]);
+            });
+        });
+    
+        return api;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+    
+        function CompBase( owner, runtime ) {
+    
+            this.owner = owner;
+            this.options = owner.options;
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+    
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+    
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var type = 'html5',
+            components = {};
+    
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destory = this.destory;
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+    
+            me.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+    
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+    
+        });
+    
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+    
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+    
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+    
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+    
+                blob = slice.call( blob, start, end );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+    
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+    
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+    
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+    
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+    
+                e = e.originalEvent || e;
+    
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+    
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+    
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+    
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+    
+    
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+    
+                return false;
+            },
+    
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+    
+                return false;
+            },
+    
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+    
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+    
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+    
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 );
+    
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                me._getTansferFiles( e, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+    
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+    
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( e, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, dataTransfer, file, item, i, len, canAccessFolder;
+    
+                e = e.originalEvent || e;
+    
+                dataTransfer = e.dataTransfer;
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+    
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+    
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+    
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+    
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+    
+                Base.when.apply( Base, promises ).done(function() {
+    
+                    if ( !results.length ) {
+                        return;
+                    }
+    
+                    callback( results );
+                });
+            },
+    
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+    
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+    
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+    
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+    
+                return deferred.promise();
+            },
+    
+            destroy: function() {
+                var elem = this.elem;
+    
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragEnterHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+    
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+    
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+    
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+    
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+    
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+    
+                    allowed.push( new File( ruid, blob ) );
+                }
+    
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+    
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var $ = Base.$;
+    
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    lable = $( document.createElement('label') ),
+                    input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+    
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+    
+                lable.on( 'click', function() {
+                    input.trigger('click');
+                });
+    
+                lable.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+    
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+    
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+    
+                    input.attr( 'accept', arr.join(',') );
+                }
+    
+                container.append( input );
+                container.append( lable );
+    
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+    
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+    
+                    me.files = e.target.files;
+    
+                    // reset input
+                    clone = this.cloneNode( true );
+                    this.parentNode.replaceChild( clone, this );
+    
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+    
+                    owner.trigger('change');
+                });
+    
+                lable.on( 'mouseenter mouseleave', mouseHandler );
+    
+            },
+    
+    
+            getFiles: function() {
+                return this.files;
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var noop = Base.noop,
+            $ = Base.$;
+    
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+    
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+    
+                if ( binary ) {
+                    xhr.overrideMimeType('application/octet-stream');
+    
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+    
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+    
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+    
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+    
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+    
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+    
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+    
+                    return me.trigger( 'progress', percentage );
+                };
+    
+                xhr.onreadystatechange = function() {
+    
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+    
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+    
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+    
+    
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+    
+            _parseJson: function( str ) {
+                var json;
+    
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+    
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+    
+    
+        function getFlashVersion() {
+            var version;
+    
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+    
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destory = this.destory,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                clients[ uid ] = client;
+    
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+    
+                    instance = pool[ uid ];
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+    
+                return me.flashExec.apply( client, arguments );
+            };
+    
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+    
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+    
+                // console.log.apply( console, arguments );
+    
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+    
+                // Base.log( evt, obj );
+            }
+    
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+    
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+    
+            this.jsreciver = jsreciver;
+    
+            this.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+    
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+    
+                return flash.exec( this.uid, comp, fn, args );
+            };
+    
+            // @todo
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+    
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+    
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+    
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+    
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+    
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+    
+                container.html( html );
+            },
+    
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+    
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+    
+        });
+    
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+    
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+    
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+    
+            return component;
+        };
+    
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+    
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+    
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+    
+                delete copy.button;
+                delete copy.container;
+    
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+    
+                xhr.connectRuntime( blob.ruid );
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+    
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server
+                }, binary );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+    
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    return me.trigger( 'progress', e.loaded / e.total );
+                });
+    
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        err = '';
+    
+                    xhr.off();
+                    me._xhr = null;
+    
+                    if ( status >= 200 && status < 300 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                    } else if ( status >= 500 && status < 600 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+    
+                    xhr.destroy();
+                    xhr = null;
+    
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+    
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview 没有图像处理的版本。
+     */
+    define('preset/withoutimage',[
+        'base',
+    
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+    
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/transport',
+    
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/withoutimage'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.withoutimage.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.withoutimage.min.js
new file mode 100644
index 0000000..70a7d48
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/webuploader/webuploader.withoutimage.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",getDimension:"get-dimension",addButton:"add-btn",getRuntimeType:"get-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.disconnectRuntime()}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.exec("destroy"),this.disconnectRuntime(),this.off()}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destory:function(){delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d.getStats().numOfQueue||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_nextBlock:function(){var a,b,c=this,d=c._act,f=c.options;return d&&d.has()&&d.file.getStatus()===h.PROGRESS?(f.prepareNextFile&&!c.pending.length&&c._prepareNextFile(),d.fetch()):c.runing?(!c.pending.length&&c.getStats().numOfQueue&&c._prepareNextFile(),a=c.pending.shift(),b=function(a){return a?(d=e(a,f.chunked?f.chunkSize:0),c._act=d,d.fetch()):null},g(a)?a[a.pipe?"pipe":"then"](b):b(a)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.QUEUED?(b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),c):b._finishFile(c)}),a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d._popBlock(b),a.nextTick(d.__tick))})},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){var c=0,d=0;c=b.percentage=a,b.chunks>1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b=this,f=b.getRuid(),g=b.elem.parent().get(0);return g&&!d.contains(g,a.currentTarget)?!1:(b._getTansferFiles(a,function(a){b.trigger("drop",d.map(a,function(a){return new c(f,a)}))}),b.dndOver=!1,b.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k,l=[],m=[];for(b=b.originalEvent||b,f=b.dataTransfer,d=f.items,e=f.files,k=!(!d||!d[0].webkitGetAsEntry),i=0,j=e.length;j>i;i++)g=e[i],h=d&&d[i],k&&h.webkitGetAsEntry().isDirectory?m.push(this._traverseDirectoryTree(h.webkitGetAsEntry(),l)):l.push(g);a.when.apply(a,m).done(function(){l.length&&c(l)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragEnterHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))
+}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destory,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destory=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(a,b,c){var d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,e=this._initAjax(),f=b._blob,g=c.server;e.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+d.param(b._formData),a=f.uid):(d.each(b._formData,function(a,b){e.exec("append",a,b)}),e.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(e,c.headers),e.exec("send",{method:c.method,url:g},a)},getStatus:function(){return this._status},getResponse:function(){return this._response},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new c("XMLHttpRequest");return b.on("uploadprogress progress",function(b){return a.trigger("progress",b.loaded/b.total)}),b.on("load",function(){var c=b.exec("getStatus"),d="";return b.off(),a._xhr=null,c>=200&&300>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson")):c>=500&&600>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson"),d="server"):d="http",b.destroy(),b=null,d?a.trigger("error",d):a.trigger("load")}),b.on("error",function(){b.off(),a._xhr=null,a.trigger("error","http")}),a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("preset/withoutimage",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/transport","runtime/flash/filepicker","runtime/flash/transport"],function(a){return a}),b("webuploader",["preset/withoutimage"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.js
new file mode 100644
index 0000000..1d5d868
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.js
@@ -0,0 +1,1256 @@
+/*!
+* ZeroClipboard
+* The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.
+* Copyright (c) 2014 Jon Rohan, James M. Greene
+* Licensed MIT
+* http://zeroclipboard.org/
+* v2.0.0-beta.5
+*/
+(function(window) {
+  "use strict";
+  var _currentElement;
+  var _flashState = {
+    bridge: null,
+    version: "0.0.0",
+    pluginType: "unknown",
+    disabled: null,
+    outdated: null,
+    unavailable: null,
+    deactivated: null,
+    overdue: null,
+    ready: null
+  };
+  var _clipData = {};
+  var _clipDataFormatMap = null;
+  var _clientIdCounter = 0;
+  var _clientMeta = {};
+  var _elementIdCounter = 0;
+  var _elementMeta = {};
+  var _swfPath = function() {
+    var i, jsDir, tmpJsPath, jsPath, swfPath = "ZeroClipboard.swf";
+    if (!(document.currentScript && (jsPath = document.currentScript.src))) {
+      var scripts = document.getElementsByTagName("script");
+      if ("readyState" in scripts[0]) {
+        for (i = scripts.length; i--; ) {
+          if (scripts[i].readyState === "interactive" && (jsPath = scripts[i].src)) {
+            break;
+          }
+        }
+      } else if (document.readyState === "loading") {
+        jsPath = scripts[scripts.length - 1].src;
+      } else {
+        for (i = scripts.length; i--; ) {
+          tmpJsPath = scripts[i].src;
+          if (!tmpJsPath) {
+            jsDir = null;
+            break;
+          }
+          tmpJsPath = tmpJsPath.split("#")[0].split("?")[0];
+          tmpJsPath = tmpJsPath.slice(0, tmpJsPath.lastIndexOf("/") + 1);
+          if (jsDir == null) {
+            jsDir = tmpJsPath;
+          } else if (jsDir !== tmpJsPath) {
+            jsDir = null;
+            break;
+          }
+        }
+        if (jsDir !== null) {
+          jsPath = jsDir;
+        }
+      }
+    }
+    if (jsPath) {
+      jsPath = jsPath.split("#")[0].split("?")[0];
+      swfPath = jsPath.slice(0, jsPath.lastIndexOf("/") + 1) + swfPath;
+    }
+    return swfPath;
+  }();
+  var _camelizeCssPropName = function() {
+    var matcherRegex = /\-([a-z])/g, replacerFn = function(match, group) {
+      return group.toUpperCase();
+    };
+    return function(prop) {
+      return prop.replace(matcherRegex, replacerFn);
+    };
+  }();
+  var _getStyle = function(el, prop) {
+    var value, camelProp, tagName;
+    if (window.getComputedStyle) {
+      value = window.getComputedStyle(el, null).getPropertyValue(prop);
+    } else {
+      camelProp = _camelizeCssPropName(prop);
+      if (el.currentStyle) {
+        value = el.currentStyle[camelProp];
+      } else {
+        value = el.style[camelProp];
+      }
+    }
+    if (prop === "cursor") {
+      if (!value || value === "auto") {
+        tagName = el.tagName.toLowerCase();
+        if (tagName === "a") {
+          return "pointer";
+        }
+      }
+    }
+    return value;
+  };
+  var _elementMouseOver = function(event) {
+    if (!event) {
+      event = window.event;
+    }
+    var target;
+    if (this !== window) {
+      target = this;
+    } else if (event.target) {
+      target = event.target;
+    } else if (event.srcElement) {
+      target = event.srcElement;
+    }
+    ZeroClipboard.activate(target);
+  };
+  var _addEventHandler = function(element, method, func) {
+    if (!element || element.nodeType !== 1) {
+      return;
+    }
+    if (element.addEventListener) {
+      element.addEventListener(method, func, false);
+    } else if (element.attachEvent) {
+      element.attachEvent("on" + method, func);
+    }
+  };
+  var _removeEventHandler = function(element, method, func) {
+    if (!element || element.nodeType !== 1) {
+      return;
+    }
+    if (element.removeEventListener) {
+      element.removeEventListener(method, func, false);
+    } else if (element.detachEvent) {
+      element.detachEvent("on" + method, func);
+    }
+  };
+  var _addClass = function(element, value) {
+    if (!element || element.nodeType !== 1) {
+      return element;
+    }
+    if (element.classList) {
+      if (!element.classList.contains(value)) {
+        element.classList.add(value);
+      }
+      return element;
+    }
+    if (value && typeof value === "string") {
+      var classNames = (value || "").split(/\s+/);
+      if (element.nodeType === 1) {
+        if (!element.className) {
+          element.className = value;
+        } else {
+          var className = " " + element.className + " ", setClass = element.className;
+          for (var c = 0, cl = classNames.length; c < cl; c++) {
+            if (className.indexOf(" " + classNames[c] + " ") < 0) {
+              setClass += " " + classNames[c];
+            }
+          }
+          element.className = setClass.replace(/^\s+|\s+$/g, "");
+        }
+      }
+    }
+    return element;
+  };
+  var _removeClass = function(element, value) {
+    if (!element || element.nodeType !== 1) {
+      return element;
+    }
+    if (element.classList) {
+      if (element.classList.contains(value)) {
+        element.classList.remove(value);
+      }
+      return element;
+    }
+    if (value && typeof value === "string" || value === undefined) {
+      var classNames = (value || "").split(/\s+/);
+      if (element.nodeType === 1 && element.className) {
+        if (value) {
+          var className = (" " + element.className + " ").replace(/[\n\t]/g, " ");
+          for (var c = 0, cl = classNames.length; c < cl; c++) {
+            className = className.replace(" " + classNames[c] + " ", " ");
+          }
+          element.className = className.replace(/^\s+|\s+$/g, "");
+        } else {
+          element.className = "";
+        }
+      }
+    }
+    return element;
+  };
+  var _getZoomFactor = function() {
+    var rect, physicalWidth, logicalWidth, zoomFactor = 1;
+    if (typeof document.body.getBoundingClientRect === "function") {
+      rect = document.body.getBoundingClientRect();
+      physicalWidth = rect.right - rect.left;
+      logicalWidth = document.body.offsetWidth;
+      zoomFactor = Math.round(physicalWidth / logicalWidth * 100) / 100;
+    }
+    return zoomFactor;
+  };
+  var _getDOMObjectPosition = function(obj, defaultZIndex) {
+    var info = {
+      left: 0,
+      top: 0,
+      width: 0,
+      height: 0,
+      zIndex: _getSafeZIndex(defaultZIndex) - 1
+    };
+    if (obj.getBoundingClientRect) {
+      var rect = obj.getBoundingClientRect();
+      var pageXOffset, pageYOffset, zoomFactor;
+      if ("pageXOffset" in window && "pageYOffset" in window) {
+        pageXOffset = window.pageXOffset;
+        pageYOffset = window.pageYOffset;
+      } else {
+        zoomFactor = _getZoomFactor();
+        pageXOffset = Math.round(document.documentElement.scrollLeft / zoomFactor);
+        pageYOffset = Math.round(document.documentElement.scrollTop / zoomFactor);
+      }
+      var leftBorderWidth = document.documentElement.clientLeft || 0;
+      var topBorderWidth = document.documentElement.clientTop || 0;
+      info.left = rect.left + pageXOffset - leftBorderWidth;
+      info.top = rect.top + pageYOffset - topBorderWidth;
+      info.width = "width" in rect ? rect.width : rect.right - rect.left;
+      info.height = "height" in rect ? rect.height : rect.bottom - rect.top;
+    }
+    return info;
+  };
+  var _cacheBust = function(path, options) {
+    var cacheBust = options == null || options && options.cacheBust === true;
+    if (cacheBust) {
+      return (path.indexOf("?") === -1 ? "?" : "&") + "noCache=" + new Date().getTime();
+    } else {
+      return "";
+    }
+  };
+  var _vars = function(options) {
+    var i, len, domain, domains, str = "", trustedOriginsExpanded = [];
+    if (options.trustedDomains) {
+      if (typeof options.trustedDomains === "string") {
+        domains = [ options.trustedDomains ];
+      } else if (typeof options.trustedDomains === "object" && "length" in options.trustedDomains) {
+        domains = options.trustedDomains;
+      }
+    }
+    if (domains && domains.length) {
+      for (i = 0, len = domains.length; i < len; i++) {
+        if (domains.hasOwnProperty(i) && domains[i] && typeof domains[i] === "string") {
+          domain = _extractDomain(domains[i]);
+          if (!domain) {
+            continue;
+          }
+          if (domain === "*") {
+            trustedOriginsExpanded = [ domain ];
+            break;
+          }
+          trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [ domain, "//" + domain, window.location.protocol + "//" + domain ]);
+        }
+      }
+    }
+    if (trustedOriginsExpanded.length) {
+      str += "trustedOrigins=" + encodeURIComponent(trustedOriginsExpanded.join(","));
+    }
+    if (options.forceEnhancedClipboard === true) {
+      str += (str ? "&" : "") + "forceEnhancedClipboard=true";
+    }
+    return str;
+  };
+  var _inArray = function(elem, array, fromIndex) {
+    if (typeof array.indexOf === "function") {
+      return array.indexOf(elem, fromIndex);
+    }
+    var i, len = array.length;
+    if (typeof fromIndex === "undefined") {
+      fromIndex = 0;
+    } else if (fromIndex < 0) {
+      fromIndex = len + fromIndex;
+    }
+    for (i = fromIndex; i < len; i++) {
+      if (array.hasOwnProperty(i) && array[i] === elem) {
+        return i;
+      }
+    }
+    return -1;
+  };
+  var _prepClip = function(elements) {
+    if (typeof elements === "string") {
+      throw new TypeError("ZeroClipboard doesn't accept query strings.");
+    }
+    return typeof elements.length !== "number" ? [ elements ] : elements;
+  };
+  var _dispatchCallback = function(func, context, args, async) {
+    if (async) {
+      window.setTimeout(function() {
+        func.apply(context, args);
+      }, 0);
+    } else {
+      func.apply(context, args);
+    }
+  };
+  var _getSafeZIndex = function(val) {
+    var zIndex, tmp;
+    if (val) {
+      if (typeof val === "number" && val > 0) {
+        zIndex = val;
+      } else if (typeof val === "string" && (tmp = parseInt(val, 10)) && !isNaN(tmp) && tmp > 0) {
+        zIndex = tmp;
+      }
+    }
+    if (!zIndex) {
+      if (typeof _globalConfig.zIndex === "number" && _globalConfig.zIndex > 0) {
+        zIndex = _globalConfig.zIndex;
+      } else if (typeof _globalConfig.zIndex === "string" && (tmp = parseInt(_globalConfig.zIndex, 10)) && !isNaN(tmp) && tmp > 0) {
+        zIndex = tmp;
+      }
+    }
+    return zIndex || 0;
+  };
+  var _extend = function() {
+    var i, len, arg, prop, src, copy, target = arguments[0] || {};
+    for (i = 1, len = arguments.length; i < len; i++) {
+      if ((arg = arguments[i]) != null) {
+        for (prop in arg) {
+          if (arg.hasOwnProperty(prop)) {
+            src = target[prop];
+            copy = arg[prop];
+            if (target === copy) {
+              continue;
+            }
+            if (copy !== undefined) {
+              target[prop] = copy;
+            }
+          }
+        }
+      }
+    }
+    return target;
+  };
+  var _extractDomain = function(originOrUrl) {
+    if (originOrUrl == null || originOrUrl === "") {
+      return null;
+    }
+    originOrUrl = originOrUrl.replace(/^\s+|\s+$/g, "");
+    if (originOrUrl === "") {
+      return null;
+    }
+    var protocolIndex = originOrUrl.indexOf("//");
+    originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2);
+    var pathIndex = originOrUrl.indexOf("/");
+    originOrUrl = pathIndex === -1 ? originOrUrl : protocolIndex === -1 || pathIndex === 0 ? null : originOrUrl.slice(0, pathIndex);
+    if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === ".swf") {
+      return null;
+    }
+    return originOrUrl || null;
+  };
+  var _determineScriptAccess = function() {
+    var _extractAllDomains = function(origins, resultsArray) {
+      var i, len, tmp;
+      if (origins == null || resultsArray[0] === "*") {
+        return;
+      }
+      if (typeof origins === "string") {
+        origins = [ origins ];
+      }
+      if (!(typeof origins === "object" && typeof origins.length === "number")) {
+        return;
+      }
+      for (i = 0, len = origins.length; i < len; i++) {
+        if (origins.hasOwnProperty(i) && (tmp = _extractDomain(origins[i]))) {
+          if (tmp === "*") {
+            resultsArray.length = 0;
+            resultsArray.push("*");
+            break;
+          }
+          if (_inArray(tmp, resultsArray) === -1) {
+            resultsArray.push(tmp);
+          }
+        }
+      }
+    };
+    return function(currentDomain, configOptions) {
+      var swfDomain = _extractDomain(configOptions.swfPath);
+      if (swfDomain === null) {
+        swfDomain = currentDomain;
+      }
+      var trustedDomains = [];
+      _extractAllDomains(configOptions.trustedOrigins, trustedDomains);
+      _extractAllDomains(configOptions.trustedDomains, trustedDomains);
+      var len = trustedDomains.length;
+      if (len > 0) {
+        if (len === 1 && trustedDomains[0] === "*") {
+          return "always";
+        }
+        if (_inArray(currentDomain, trustedDomains) !== -1) {
+          if (len === 1 && currentDomain === swfDomain) {
+            return "sameDomain";
+          }
+          return "always";
+        }
+      }
+      return "never";
+    };
+  }();
+  var _objectKeys = function(obj) {
+    if (obj == null) {
+      return [];
+    }
+    if (Object.keys) {
+      return Object.keys(obj);
+    }
+    var keys = [];
+    for (var prop in obj) {
+      if (obj.hasOwnProperty(prop)) {
+        keys.push(prop);
+      }
+    }
+    return keys;
+  };
+  var _deleteOwnProperties = function(obj) {
+    if (obj) {
+      for (var prop in obj) {
+        if (obj.hasOwnProperty(prop)) {
+          delete obj[prop];
+        }
+      }
+    }
+    return obj;
+  };
+  var _safeActiveElement = function() {
+    try {
+      return document.activeElement;
+    } catch (err) {}
+    return null;
+  };
+  var _pick = function(obj, keys) {
+    var newObj = {};
+    for (var i = 0, len = keys.length; i < len; i++) {
+      if (keys[i] in obj) {
+        newObj[keys[i]] = obj[keys[i]];
+      }
+    }
+    return newObj;
+  };
+  var _omit = function(obj, keys) {
+    var newObj = {};
+    for (var prop in obj) {
+      if (_inArray(prop, keys) === -1) {
+        newObj[prop] = obj[prop];
+      }
+    }
+    return newObj;
+  };
+  var _mapClipDataToFlash = function(clipData) {
+    var newClipData = {}, formatMap = {};
+    if (!(typeof clipData === "object" && clipData)) {
+      return;
+    }
+    for (var dataFormat in clipData) {
+      if (dataFormat && clipData.hasOwnProperty(dataFormat) && typeof clipData[dataFormat] === "string" && clipData[dataFormat]) {
+        switch (dataFormat.toLowerCase()) {
+         case "text/plain":
+         case "text":
+         case "air:text":
+         case "flash:text":
+          newClipData.text = clipData[dataFormat];
+          formatMap.text = dataFormat;
+          break;
+
+         case "text/html":
+         case "html":
+         case "air:html":
+         case "flash:html":
+          newClipData.html = clipData[dataFormat];
+          formatMap.html = dataFormat;
+          break;
+
+         case "application/rtf":
+         case "text/rtf":
+         case "rtf":
+         case "richtext":
+         case "air:rtf":
+         case "flash:rtf":
+          newClipData.rtf = clipData[dataFormat];
+          formatMap.rtf = dataFormat;
+          break;
+
+         default:
+          break;
+        }
+      }
+    }
+    return {
+      data: newClipData,
+      formatMap: formatMap
+    };
+  };
+  var _mapClipResultsFromFlash = function(clipResults, formatMap) {
+    if (!(typeof clipResults === "object" && clipResults && typeof formatMap === "object" && formatMap)) {
+      return clipResults;
+    }
+    var newResults = {};
+    for (var prop in clipResults) {
+      if (clipResults.hasOwnProperty(prop)) {
+        if (prop !== "success" && prop !== "data") {
+          newResults[prop] = clipResults[prop];
+          continue;
+        }
+        newResults[prop] = {};
+        var tmpHash = clipResults[prop];
+        for (var dataFormat in tmpHash) {
+          if (dataFormat && tmpHash.hasOwnProperty(dataFormat) && formatMap.hasOwnProperty(dataFormat)) {
+            newResults[prop][formatMap[dataFormat]] = tmpHash[dataFormat];
+          }
+        }
+      }
+    }
+    return newResults;
+  };
+  var _args = function(arraySlice) {
+    return function(args) {
+      return arraySlice.call(args, 0);
+    };
+  }(window.Array.prototype.slice);
+  var _detectFlashSupport = function() {
+    var plugin, ax, mimeType, hasFlash = false, isActiveX = false, isPPAPI = false, flashVersion = "";
+    function parseFlashVersion(desc) {
+      var matches = desc.match(/[\d]+/g);
+      matches.length = 3;
+      return matches.join(".");
+    }
+    function isPepperFlash(flashPlayerFileName) {
+      return !!flashPlayerFileName && (flashPlayerFileName = flashPlayerFileName.toLowerCase()) && (/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(flashPlayerFileName) || flashPlayerFileName.slice(-13) === "chrome.plugin");
+    }
+    function inspectPlugin(plugin) {
+      if (plugin) {
+        hasFlash = true;
+        if (plugin.version) {
+          flashVersion = parseFlashVersion(plugin.version);
+        }
+        if (!flashVersion && plugin.description) {
+          flashVersion = parseFlashVersion(plugin.description);
+        }
+        if (plugin.filename) {
+          isPPAPI = isPepperFlash(plugin.filename);
+        }
+      }
+    }
+    if (navigator.plugins && navigator.plugins.length) {
+      plugin = navigator.plugins["Shockwave Flash"];
+      inspectPlugin(plugin);
+      if (navigator.plugins["Shockwave Flash 2.0"]) {
+        hasFlash = true;
+        flashVersion = "2.0.0.11";
+      }
+    } else if (navigator.mimeTypes && navigator.mimeTypes.length) {
+      mimeType = navigator.mimeTypes["application/x-shockwave-flash"];
+      plugin = mimeType && mimeType.enabledPlugin;
+      inspectPlugin(plugin);
+    } else if (typeof ActiveXObject !== "undefined") {
+      isActiveX = true;
+      try {
+        ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
+        hasFlash = true;
+        flashVersion = parseFlashVersion(ax.GetVariable("$version"));
+      } catch (e1) {
+        try {
+          ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
+          hasFlash = true;
+          flashVersion = "6.0.21";
+        } catch (e2) {
+          try {
+            ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
+            hasFlash = true;
+            flashVersion = parseFlashVersion(ax.GetVariable("$version"));
+          } catch (e3) {
+            isActiveX = false;
+          }
+        }
+      }
+    }
+    _flashState.disabled = hasFlash !== true;
+    _flashState.outdated = flashVersion && parseFloat(flashVersion) < 11;
+    _flashState.version = flashVersion || "0.0.0";
+    _flashState.pluginType = isPPAPI ? "pepper" : isActiveX ? "activex" : hasFlash ? "netscape" : "unknown";
+  };
+  _detectFlashSupport();
+  var ZeroClipboard = function(elements) {
+    if (!(this instanceof ZeroClipboard)) {
+      return new ZeroClipboard(elements);
+    }
+    this.id = "" + _clientIdCounter++;
+    _clientMeta[this.id] = {
+      instance: this,
+      elements: [],
+      handlers: {}
+    };
+    if (elements) {
+      this.clip(elements);
+    }
+    if (typeof _flashState.ready !== "boolean") {
+      _flashState.ready = false;
+    }
+    if (!ZeroClipboard.isFlashUnusable() && _flashState.bridge === null) {
+      var _client = this;
+      var maxWait = _globalConfig.flashLoadTimeout;
+      if (typeof maxWait === "number" && maxWait >= 0) {
+        setTimeout(function() {
+          if (typeof _flashState.deactivated !== "boolean") {
+            _flashState.deactivated = true;
+          }
+          if (_flashState.deactivated === true) {
+            ZeroClipboard.emit({
+              type: "error",
+              name: "flash-deactivated",
+              client: _client
+            });
+          }
+        }, maxWait);
+      }
+      _flashState.overdue = false;
+      _bridge();
+    }
+  };
+  ZeroClipboard.prototype.setText = function(text) {
+    ZeroClipboard.setData("text/plain", text);
+    return this;
+  };
+  ZeroClipboard.prototype.setHtml = function(html) {
+    ZeroClipboard.setData("text/html", html);
+    return this;
+  };
+  ZeroClipboard.prototype.setRichText = function(richText) {
+    ZeroClipboard.setData("application/rtf", richText);
+    return this;
+  };
+  ZeroClipboard.prototype.setData = function() {
+    ZeroClipboard.setData.apply(ZeroClipboard, _args(arguments));
+    return this;
+  };
+  ZeroClipboard.prototype.clearData = function() {
+    ZeroClipboard.clearData.apply(ZeroClipboard, _args(arguments));
+    return this;
+  };
+  ZeroClipboard.prototype.setSize = function(width, height) {
+    _setSize(width, height);
+    return this;
+  };
+  var _setHandCursor = function(enabled) {
+    if (_flashState.ready === true && _flashState.bridge && typeof _flashState.bridge.setHandCursor === "function") {
+      _flashState.bridge.setHandCursor(enabled);
+    } else {
+      _flashState.ready = false;
+    }
+  };
+  ZeroClipboard.prototype.destroy = function() {
+    this.unclip();
+    this.off();
+    delete _clientMeta[this.id];
+  };
+  var _getAllClients = function() {
+    var i, len, client, clients = [], clientIds = _objectKeys(_clientMeta);
+    for (i = 0, len = clientIds.length; i < len; i++) {
+      client = _clientMeta[clientIds[i]].instance;
+      if (client && client instanceof ZeroClipboard) {
+        clients.push(client);
+      }
+    }
+    return clients;
+  };
+  ZeroClipboard.version = "2.0.0-beta.5";
+  var _globalConfig = {
+    swfPath: _swfPath,
+    trustedDomains: window.location.host ? [ window.location.host ] : [],
+    cacheBust: true,
+    forceHandCursor: false,
+    forceEnhancedClipboard: false,
+    zIndex: 999999999,
+    debug: false,
+    title: null,
+    autoActivate: true,
+    flashLoadTimeout: 3e4
+  };
+  ZeroClipboard.isFlashUnusable = function() {
+    return !!(_flashState.disabled || _flashState.outdated || _flashState.unavailable || _flashState.deactivated);
+  };
+  ZeroClipboard.config = function(options) {
+    if (typeof options === "object" && options !== null) {
+      _extend(_globalConfig, options);
+    }
+    if (typeof options === "string" && options) {
+      if (_globalConfig.hasOwnProperty(options)) {
+        return _globalConfig[options];
+      }
+      return;
+    }
+    var copy = {};
+    for (var prop in _globalConfig) {
+      if (_globalConfig.hasOwnProperty(prop)) {
+        if (typeof _globalConfig[prop] === "object" && _globalConfig[prop] !== null) {
+          if ("length" in _globalConfig[prop]) {
+            copy[prop] = _globalConfig[prop].slice(0);
+          } else {
+            copy[prop] = _extend({}, _globalConfig[prop]);
+          }
+        } else {
+          copy[prop] = _globalConfig[prop];
+        }
+      }
+    }
+    return copy;
+  };
+  ZeroClipboard.destroy = function() {
+    ZeroClipboard.deactivate();
+    for (var clientId in _clientMeta) {
+      if (_clientMeta.hasOwnProperty(clientId) && _clientMeta[clientId]) {
+        var client = _clientMeta[clientId].instance;
+        if (client && typeof client.destroy === "function") {
+          client.destroy();
+        }
+      }
+    }
+    var flashBridge = _flashState.bridge;
+    if (flashBridge) {
+      var htmlBridge = _getHtmlBridge(flashBridge);
+      if (htmlBridge) {
+        if (_flashState.pluginType === "activex" && "readyState" in flashBridge) {
+          flashBridge.style.display = "none";
+          (function removeSwfFromIE() {
+            if (flashBridge.readyState === 4) {
+              for (var prop in flashBridge) {
+                if (typeof flashBridge[prop] === "function") {
+                  flashBridge[prop] = null;
+                }
+              }
+              flashBridge.parentNode.removeChild(flashBridge);
+              if (htmlBridge.parentNode) {
+                htmlBridge.parentNode.removeChild(htmlBridge);
+              }
+            } else {
+              setTimeout(removeSwfFromIE, 10);
+            }
+          })();
+        } else {
+          flashBridge.parentNode.removeChild(flashBridge);
+          if (htmlBridge.parentNode) {
+            htmlBridge.parentNode.removeChild(htmlBridge);
+          }
+        }
+      }
+      _flashState.ready = null;
+      _flashState.bridge = null;
+      _flashState.deactivated = null;
+    }
+    ZeroClipboard.clearData();
+  };
+  ZeroClipboard.activate = function(element) {
+    if (_currentElement) {
+      _removeClass(_currentElement, _globalConfig.hoverClass);
+      _removeClass(_currentElement, _globalConfig.activeClass);
+    }
+    _currentElement = element;
+    _addClass(element, _globalConfig.hoverClass);
+    _reposition();
+    var newTitle = _globalConfig.title || element.getAttribute("title");
+    if (newTitle) {
+      var htmlBridge = _getHtmlBridge(_flashState.bridge);
+      if (htmlBridge) {
+        htmlBridge.setAttribute("title", newTitle);
+      }
+    }
+    var useHandCursor = _globalConfig.forceHandCursor === true || _getStyle(element, "cursor") === "pointer";
+    _setHandCursor(useHandCursor);
+  };
+  ZeroClipboard.deactivate = function() {
+    var htmlBridge = _getHtmlBridge(_flashState.bridge);
+    if (htmlBridge) {
+      htmlBridge.removeAttribute("title");
+      htmlBridge.style.left = "0px";
+      htmlBridge.style.top = "-9999px";
+      _setSize(1, 1);
+    }
+    if (_currentElement) {
+      _removeClass(_currentElement, _globalConfig.hoverClass);
+      _removeClass(_currentElement, _globalConfig.activeClass);
+      _currentElement = null;
+    }
+  };
+  ZeroClipboard.state = function() {
+    return {
+      browser: _pick(window.navigator, [ "userAgent", "platform", "appName" ]),
+      flash: _omit(_flashState, [ "bridge" ]),
+      zeroclipboard: {
+        version: ZeroClipboard.version,
+        config: ZeroClipboard.config()
+      }
+    };
+  };
+  ZeroClipboard.setData = function(format, data) {
+    var dataObj;
+    if (typeof format === "object" && format && typeof data === "undefined") {
+      dataObj = format;
+      ZeroClipboard.clearData();
+    } else if (typeof format === "string" && format) {
+      dataObj = {};
+      dataObj[format] = data;
+    } else {
+      return;
+    }
+    for (var dataFormat in dataObj) {
+      if (dataFormat && dataObj.hasOwnProperty(dataFormat) && typeof dataObj[dataFormat] === "string" && dataObj[dataFormat]) {
+        _clipData[dataFormat] = dataObj[dataFormat];
+      }
+    }
+  };
+  ZeroClipboard.clearData = function(format) {
+    if (typeof format === "undefined") {
+      _deleteOwnProperties(_clipData);
+      _clipDataFormatMap = null;
+    } else if (typeof format === "string" && _clipData.hasOwnProperty(format)) {
+      delete _clipData[format];
+    }
+  };
+  var _bridge = function() {
+    var flashBridge, len;
+    var container = document.getElementById("global-zeroclipboard-html-bridge");
+    if (!container) {
+      var allowScriptAccess = _determineScriptAccess(window.location.host, _globalConfig);
+      var allowNetworking = allowScriptAccess === "never" ? "none" : "all";
+      var flashvars = _vars(_globalConfig);
+      var swfUrl = _globalConfig.swfPath + _cacheBust(_globalConfig.swfPath, _globalConfig);
+      container = _createHtmlBridge();
+      var divToBeReplaced = document.createElement("div");
+      container.appendChild(divToBeReplaced);
+      document.body.appendChild(container);
+      var tmpDiv = document.createElement("div");
+      var oldIE = _flashState.pluginType === "activex";
+      tmpDiv.innerHTML = '<object id="global-zeroclipboard-flash-bridge" name="global-zeroclipboard-flash-bridge" ' + 'width="100%" height="100%" ' + (oldIE ? 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"' : 'type="application/x-shockwave-flash" data="' + swfUrl + '"') + ">" + (oldIE ? '<param name="movie" value="' + swfUrl + '"/>' : "") + '<param name="allowScriptAccess" value="' + allowScriptAccess + '"/>' + '<param name="allowNetworking" value="' + allowNetworking + '"/>' + '<param name="menu" value="false"/>' + '<param name="wmode" value="transparent"/>' + '<param name="flashvars" value="' + flashvars + '"/>' + "</object>";
+      flashBridge = tmpDiv.firstChild;
+      tmpDiv = null;
+      flashBridge.ZeroClipboard = ZeroClipboard;
+      container.replaceChild(flashBridge, divToBeReplaced);
+    }
+    if (!flashBridge) {
+      flashBridge = document["global-zeroclipboard-flash-bridge"];
+      if (flashBridge && (len = flashBridge.length)) {
+        flashBridge = flashBridge[len - 1];
+      }
+      if (!flashBridge) {
+        flashBridge = container.firstChild;
+      }
+    }
+    _flashState.bridge = flashBridge || null;
+  };
+  var _createHtmlBridge = function() {
+    var container = document.createElement("div");
+    container.id = "global-zeroclipboard-html-bridge";
+    container.className = "global-zeroclipboard-container";
+    container.style.position = "absolute";
+    container.style.left = "0px";
+    container.style.top = "-9999px";
+    container.style.width = "1px";
+    container.style.height = "1px";
+    container.style.zIndex = "" + _getSafeZIndex(_globalConfig.zIndex);
+    return container;
+  };
+  var _getHtmlBridge = function(flashBridge) {
+    var htmlBridge = flashBridge && flashBridge.parentNode;
+    while (htmlBridge && htmlBridge.nodeName === "OBJECT" && htmlBridge.parentNode) {
+      htmlBridge = htmlBridge.parentNode;
+    }
+    return htmlBridge || null;
+  };
+  var _reposition = function() {
+    if (_currentElement) {
+      var pos = _getDOMObjectPosition(_currentElement, _globalConfig.zIndex);
+      var htmlBridge = _getHtmlBridge(_flashState.bridge);
+      if (htmlBridge) {
+        htmlBridge.style.top = pos.top + "px";
+        htmlBridge.style.left = pos.left + "px";
+        htmlBridge.style.width = pos.width + "px";
+        htmlBridge.style.height = pos.height + "px";
+        htmlBridge.style.zIndex = pos.zIndex + 1;
+      }
+      _setSize(pos.width, pos.height);
+    }
+  };
+  var _setSize = function(width, height) {
+    var htmlBridge = _getHtmlBridge(_flashState.bridge);
+    if (htmlBridge) {
+      htmlBridge.style.width = width + "px";
+      htmlBridge.style.height = height + "px";
+    }
+  };
+  ZeroClipboard.emit = function(event) {
+    var eventType, eventObj, performCallbackAsync, clients, i, len, eventCopy, returnVal, tmp;
+    if (typeof event === "string" && event) {
+      eventType = event;
+    }
+    if (typeof event === "object" && event && typeof event.type === "string" && event.type) {
+      eventType = event.type;
+      eventObj = event;
+    }
+    if (!eventType) {
+      return;
+    }
+    event = _createEvent(eventType, eventObj);
+    _preprocessEvent(event);
+    if (event.type === "ready" && _flashState.overdue === true) {
+      return ZeroClipboard.emit({
+        type: "error",
+        name: "flash-overdue"
+      });
+    }
+    performCallbackAsync = !/^(before)?copy$/.test(event.type);
+    if (event.client) {
+      _dispatchClientCallbacks.call(event.client, event, performCallbackAsync);
+    } else {
+      clients = event.target && event.target !== window && _globalConfig.autoActivate === true ? _getAllClientsClippedToElement(event.target) : _getAllClients();
+      for (i = 0, len = clients.length; i < len; i++) {
+        eventCopy = _extend({}, event, {
+          client: clients[i]
+        });
+        _dispatchClientCallbacks.call(clients[i], eventCopy, performCallbackAsync);
+      }
+    }
+    if (event.type === "copy") {
+      tmp = _mapClipDataToFlash(_clipData);
+      returnVal = tmp.data;
+      _clipDataFormatMap = tmp.formatMap;
+    }
+    return returnVal;
+  };
+  var _dispatchClientCallbacks = function(event, async) {
+    var handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers[event.type];
+    if (handlers && handlers.length) {
+      var i, len, func, context, originalContext = this;
+      for (i = 0, len = handlers.length; i < len; i++) {
+        func = handlers[i];
+        context = originalContext;
+        if (typeof func === "string" && typeof window[func] === "function") {
+          func = window[func];
+        }
+        if (typeof func === "object" && func && typeof func.handleEvent === "function") {
+          context = func;
+          func = func.handleEvent;
+        }
+        if (typeof func === "function") {
+          _dispatchCallback(func, context, [ event ], async);
+        }
+      }
+    }
+    return this;
+  };
+  var _eventMessages = {
+    ready: "Flash communication is established",
+    error: {
+      "flash-disabled": "Flash is disabled or not installed",
+      "flash-outdated": "Flash is too outdated to support ZeroClipboard",
+      "flash-unavailable": "Flash is unable to communicate bidirectionally with JavaScript",
+      "flash-deactivated": "Flash is too outdated for your browser and/or is configured as click-to-activate",
+      "flash-overdue": "Flash communication was established but NOT within the acceptable time limit"
+    }
+  };
+  var _createEvent = function(eventType, event) {
+    if (!(eventType || event && event.type)) {
+      return;
+    }
+    event = event || {};
+    eventType = (eventType || event.type).toLowerCase();
+    _extend(event, {
+      type: eventType,
+      target: event.target || _currentElement || null,
+      relatedTarget: event.relatedTarget || null,
+      currentTarget: _flashState && _flashState.bridge || null
+    });
+    var msg = _eventMessages[event.type];
+    if (event.type === "error" && event.name && msg) {
+      msg = msg[event.name];
+    }
+    if (msg) {
+      event.message = msg;
+    }
+    if (event.type === "ready") {
+      _extend(event, {
+        target: null,
+        version: _flashState.version
+      });
+    }
+    if (event.type === "error") {
+      event.target = null;
+      if (/^flash-(outdated|unavailable|deactivated|overdue)$/.test(event.name)) {
+        _extend(event, {
+          version: _flashState.version,
+          minimumVersion: "11.0.0"
+        });
+      }
+    }
+    if (event.type === "copy") {
+      event.clipboardData = {
+        setData: ZeroClipboard.setData,
+        clearData: ZeroClipboard.clearData
+      };
+    }
+    if (event.type === "aftercopy") {
+      event = _mapClipResultsFromFlash(event, _clipDataFormatMap);
+    }
+    if (event.target && !event.relatedTarget) {
+      event.relatedTarget = _getRelatedTarget(event.target);
+    }
+    return event;
+  };
+  var _getRelatedTarget = function(targetEl) {
+    var relatedTargetId = targetEl && targetEl.getAttribute && targetEl.getAttribute("data-clipboard-target");
+    return relatedTargetId ? document.getElementById(relatedTargetId) : null;
+  };
+  var _preprocessEvent = function(event) {
+    var element = event.target || _currentElement;
+    switch (event.type) {
+     case "error":
+      if (_inArray(event.name, [ "flash-disabled", "flash-outdated", "flash-deactivated", "flash-overdue" ])) {
+        _extend(_flashState, {
+          disabled: event.name === "flash-disabled",
+          outdated: event.name === "flash-outdated",
+          unavailable: event.name === "flash-unavailable",
+          deactivated: event.name === "flash-deactivated",
+          overdue: event.name === "flash-overdue",
+          ready: false
+        });
+      }
+      break;
+
+     case "ready":
+      var wasDeactivated = _flashState.deactivated === true;
+      _extend(_flashState, {
+        disabled: false,
+        outdated: false,
+        unavailable: false,
+        deactivated: false,
+        overdue: wasDeactivated,
+        ready: !wasDeactivated
+      });
+      break;
+
+     case "copy":
+      var textContent, htmlContent, targetEl = event.relatedTarget;
+      if (!(_clipData["text/html"] || _clipData["text/plain"]) && targetEl && (htmlContent = targetEl.value || targetEl.outerHTML || targetEl.innerHTML) && (textContent = targetEl.value || targetEl.textContent || targetEl.innerText)) {
+        event.clipboardData.clearData();
+        event.clipboardData.setData("text/plain", textContent);
+        if (htmlContent !== textContent) {
+          event.clipboardData.setData("text/html", htmlContent);
+        }
+      } else if (!_clipData["text/plain"] && event.target && (textContent = event.target.getAttribute("data-clipboard-text"))) {
+        event.clipboardData.clearData();
+        event.clipboardData.setData("text/plain", textContent);
+      }
+      break;
+
+     case "aftercopy":
+      ZeroClipboard.clearData();
+      if (element && element !== _safeActiveElement() && element.focus) {
+        element.focus();
+      }
+      break;
+
+     case "mouseover":
+      _addClass(element, _globalConfig.hoverClass);
+      break;
+
+     case "mouseout":
+      if (_globalConfig.autoActivate === true) {
+        ZeroClipboard.deactivate();
+      }
+      break;
+
+     case "mousedown":
+      _addClass(element, _globalConfig.activeClass);
+      break;
+
+     case "mouseup":
+      _removeClass(element, _globalConfig.activeClass);
+      break;
+    }
+  };
+  ZeroClipboard.prototype.on = function(eventName, func) {
+    var i, len, events, added = {}, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
+    if (typeof eventName === "string" && eventName) {
+      events = eventName.toLowerCase().split(/\s+/);
+    } else if (typeof eventName === "object" && eventName && typeof func === "undefined") {
+      for (i in eventName) {
+        if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") {
+          this.on(i, eventName[i]);
+        }
+      }
+    }
+    if (events && events.length) {
+      for (i = 0, len = events.length; i < len; i++) {
+        eventName = events[i].replace(/^on/, "");
+        added[eventName] = true;
+        if (!handlers[eventName]) {
+          handlers[eventName] = [];
+        }
+        handlers[eventName].push(func);
+      }
+      if (added.ready && _flashState.ready) {
+        ZeroClipboard.emit({
+          type: "ready",
+          client: this
+        });
+      }
+      if (added.error) {
+        var errorTypes = [ "disabled", "outdated", "unavailable", "deactivated", "overdue" ];
+        for (i = 0, len = errorTypes.length; i < len; i++) {
+          if (_flashState[errorTypes[i]]) {
+            ZeroClipboard.emit({
+              type: "error",
+              name: "flash-" + errorTypes[i],
+              client: this
+            });
+            break;
+          }
+        }
+      }
+    }
+    return this;
+  };
+  ZeroClipboard.prototype.off = function(eventName, func) {
+    var i, len, foundIndex, events, perEventHandlers, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
+    if (arguments.length === 0) {
+      events = _objectKeys(handlers);
+    } else if (typeof eventName === "string" && eventName) {
+      events = eventName.split(/\s+/);
+    } else if (typeof eventName === "object" && eventName && typeof func === "undefined") {
+      for (i in eventName) {
+        if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") {
+          this.off(i, eventName[i]);
+        }
+      }
+    }
+    if (events && events.length) {
+      for (i = 0, len = events.length; i < len; i++) {
+        eventName = events[i].toLowerCase().replace(/^on/, "");
+        perEventHandlers = handlers[eventName];
+        if (perEventHandlers && perEventHandlers.length) {
+          if (func) {
+            foundIndex = _inArray(func, perEventHandlers);
+            while (foundIndex !== -1) {
+              perEventHandlers.splice(foundIndex, 1);
+              foundIndex = _inArray(func, perEventHandlers, foundIndex);
+            }
+          } else {
+            handlers[eventName].length = 0;
+          }
+        }
+      }
+    }
+    return this;
+  };
+  ZeroClipboard.prototype.handlers = function(eventName) {
+    var prop, copy = null, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
+    if (handlers) {
+      if (typeof eventName === "string" && eventName) {
+        return handlers[eventName] ? handlers[eventName].slice(0) : null;
+      }
+      copy = {};
+      for (prop in handlers) {
+        if (handlers.hasOwnProperty(prop) && handlers[prop]) {
+          copy[prop] = handlers[prop].slice(0);
+        }
+      }
+    }
+    return copy;
+  };
+  ZeroClipboard.prototype.clip = function(elements) {
+    elements = _prepClip(elements);
+    for (var i = 0; i < elements.length; i++) {
+      if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {
+        if (!elements[i].zcClippingId) {
+          elements[i].zcClippingId = "zcClippingId_" + _elementIdCounter++;
+          _elementMeta[elements[i].zcClippingId] = [ this.id ];
+          if (_globalConfig.autoActivate === true) {
+            _addEventHandler(elements[i], "mouseover", _elementMouseOver);
+          }
+        } else if (_inArray(this.id, _elementMeta[elements[i].zcClippingId]) === -1) {
+          _elementMeta[elements[i].zcClippingId].push(this.id);
+        }
+        var clippedElements = _clientMeta[this.id].elements;
+        if (_inArray(elements[i], clippedElements) === -1) {
+          clippedElements.push(elements[i]);
+        }
+      }
+    }
+    return this;
+  };
+  ZeroClipboard.prototype.unclip = function(elements) {
+    var meta = _clientMeta[this.id];
+    if (!meta) {
+      return this;
+    }
+    var clippedElements = meta.elements;
+    var arrayIndex;
+    if (typeof elements === "undefined") {
+      elements = clippedElements.slice(0);
+    } else {
+      elements = _prepClip(elements);
+    }
+    for (var i = elements.length; i--; ) {
+      if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {
+        arrayIndex = 0;
+        while ((arrayIndex = _inArray(elements[i], clippedElements, arrayIndex)) !== -1) {
+          clippedElements.splice(arrayIndex, 1);
+        }
+        var clientIds = _elementMeta[elements[i].zcClippingId];
+        if (clientIds) {
+          arrayIndex = 0;
+          while ((arrayIndex = _inArray(this.id, clientIds, arrayIndex)) !== -1) {
+            clientIds.splice(arrayIndex, 1);
+          }
+          if (clientIds.length === 0) {
+            if (_globalConfig.autoActivate === true) {
+              _removeEventHandler(elements[i], "mouseover", _elementMouseOver);
+            }
+            delete elements[i].zcClippingId;
+          }
+        }
+      }
+    }
+    return this;
+  };
+  ZeroClipboard.prototype.elements = function() {
+    var meta = _clientMeta[this.id];
+    return meta && meta.elements ? meta.elements.slice(0) : [];
+  };
+  var _getAllClientsClippedToElement = function(element) {
+    var elementMetaId, clientIds, i, len, client, clients = [];
+    if (element && element.nodeType === 1 && (elementMetaId = element.zcClippingId) && _elementMeta.hasOwnProperty(elementMetaId)) {
+      clientIds = _elementMeta[elementMetaId];
+      if (clientIds && clientIds.length) {
+        for (i = 0, len = clientIds.length; i < len; i++) {
+          client = _clientMeta[clientIds[i]].instance;
+          if (client && client instanceof ZeroClipboard) {
+            clients.push(client);
+          }
+        }
+      }
+    }
+    return clients;
+  };
+  _globalConfig.hoverClass = "zeroclipboard-is-hover";
+  _globalConfig.activeClass = "zeroclipboard-is-active";
+  if (typeof define === "function" && define.amd) {
+    define(function() {
+      return ZeroClipboard;
+    });
+  } else if (typeof module === "object" && module && typeof module.exports === "object" && module.exports) {
+    module.exports = ZeroClipboard;
+  } else {
+    window.ZeroClipboard = ZeroClipboard;
+  }
+})(function() {
+  return this;
+}());
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.min.js
new file mode 100644
index 0000000..c500f23
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.min.js
@@ -0,0 +1,9 @@
+/*!
+* ZeroClipboard
+* The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.
+* Copyright (c) 2014 Jon Rohan, James M. Greene
+* Licensed MIT
+* http://zeroclipboard.org/
+* v2.0.0-beta.5
+*/
+!function(a){"use strict";var b,c={bridge:null,version:"0.0.0",pluginType:"unknown",disabled:null,outdated:null,unavailable:null,deactivated:null,overdue:null,ready:null},d={},e=null,f=0,g={},h=0,i={},j=function(){var a,b,c,d,e="ZeroClipboard.swf";if(!document.currentScript||!(d=document.currentScript.src)){var f=document.getElementsByTagName("script");if("readyState"in f[0])for(a=f.length;a--&&("interactive"!==f[a].readyState||!(d=f[a].src)););else if("loading"===document.readyState)d=f[f.length-1].src;else{for(a=f.length;a--;){if(c=f[a].src,!c){b=null;break}if(c=c.split("#")[0].split("?")[0],c=c.slice(0,c.lastIndexOf("/")+1),null==b)b=c;else if(b!==c){b=null;break}}null!==b&&(d=b)}}return d&&(d=d.split("#")[0].split("?")[0],e=d.slice(0,d.lastIndexOf("/")+1)+e),e}(),k=function(){var a=/\-([a-z])/g,b=function(a,b){return b.toUpperCase()};return function(c){return c.replace(a,b)}}(),l=function(b,c){var d,e,f;return a.getComputedStyle?d=a.getComputedStyle(b,null).getPropertyValue(c):(e=k(c),d=b.currentStyle?b.currentStyle[e]:b.style[e]),"cursor"!==c||d&&"auto"!==d||(f=b.tagName.toLowerCase(),"a"!==f)?d:"pointer"},m=function(b){b||(b=a.event);var c;this!==a?c=this:b.target?c=b.target:b.srcElement&&(c=b.srcElement),L.activate(c)},n=function(a,b,c){a&&1===a.nodeType&&(a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c))},o=function(a,b,c){a&&1===a.nodeType&&(a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent&&a.detachEvent("on"+b,c))},p=function(a,b){if(!a||1!==a.nodeType)return a;if(a.classList)return a.classList.contains(b)||a.classList.add(b),a;if(b&&"string"==typeof b){var c=(b||"").split(/\s+/);if(1===a.nodeType)if(a.className){for(var d=" "+a.className+" ",e=a.className,f=0,g=c.length;g>f;f++)d.indexOf(" "+c[f]+" ")<0&&(e+=" "+c[f]);a.className=e.replace(/^\s+|\s+$/g,"")}else a.className=b}return a},q=function(a,b){if(!a||1!==a.nodeType)return a;if(a.classList)return a.classList.contains(b)&&a.classList.remove(b),a;if(b&&"string"==typeof b||void 0===b){var c=(b||"").split(/\s+/);if(1===a.nodeType&&a.className)if(b){for(var d=(" "+a.className+" ").replace(/[\n\t]/g," "),e=0,f=c.length;f>e;e++)d=d.replace(" "+c[e]+" "," ");a.className=d.replace(/^\s+|\s+$/g,"")}else a.className=""}return a},r=function(){var a,b,c,d=1;return"function"==typeof document.body.getBoundingClientRect&&(a=document.body.getBoundingClientRect(),b=a.right-a.left,c=document.body.offsetWidth,d=Math.round(b/c*100)/100),d},s=function(b,c){var d={left:0,top:0,width:0,height:0,zIndex:y(c)-1};if(b.getBoundingClientRect){var e,f,g,h=b.getBoundingClientRect();"pageXOffset"in a&&"pageYOffset"in a?(e=a.pageXOffset,f=a.pageYOffset):(g=r(),e=Math.round(document.documentElement.scrollLeft/g),f=Math.round(document.documentElement.scrollTop/g));var i=document.documentElement.clientLeft||0,j=document.documentElement.clientTop||0;d.left=h.left+e-i,d.top=h.top+f-j,d.width="width"in h?h.width:h.right-h.left,d.height="height"in h?h.height:h.bottom-h.top}return d},t=function(a,b){var c=null==b||b&&b.cacheBust===!0;return c?(-1===a.indexOf("?")?"?":"&")+"noCache="+(new Date).getTime():""},u=function(b){var c,d,e,f,g="",h=[];if(b.trustedDomains&&("string"==typeof b.trustedDomains?f=[b.trustedDomains]:"object"==typeof b.trustedDomains&&"length"in b.trustedDomains&&(f=b.trustedDomains)),f&&f.length)for(c=0,d=f.length;d>c;c++)if(f.hasOwnProperty(c)&&f[c]&&"string"==typeof f[c]){if(e=A(f[c]),!e)continue;if("*"===e){h=[e];break}h.push.apply(h,[e,"//"+e,a.location.protocol+"//"+e])}return h.length&&(g+="trustedOrigins="+encodeURIComponent(h.join(","))),b.forceEnhancedClipboard===!0&&(g+=(g?"&":"")+"forceEnhancedClipboard=true"),g},v=function(a,b,c){if("function"==typeof b.indexOf)return b.indexOf(a,c);var d,e=b.length;for("undefined"==typeof c?c=0:0>c&&(c=e+c),d=c;e>d;d++)if(b.hasOwnProperty(d)&&b[d]===a)return d;return-1},w=function(a){if("string"==typeof a)throw new TypeError("ZeroClipboard doesn't accept query strings.");return"number"!=typeof a.length?[a]:a},x=function(b,c,d,e){e?a.setTimeout(function(){b.apply(c,d)},0):b.apply(c,d)},y=function(a){var b,c;return a&&("number"==typeof a&&a>0?b=a:"string"==typeof a&&(c=parseInt(a,10))&&!isNaN(c)&&c>0&&(b=c)),b||("number"==typeof O.zIndex&&O.zIndex>0?b=O.zIndex:"string"==typeof O.zIndex&&(c=parseInt(O.zIndex,10))&&!isNaN(c)&&c>0&&(b=c)),b||0},z=function(){var a,b,c,d,e,f,g=arguments[0]||{};for(a=1,b=arguments.length;b>a;a++)if(null!=(c=arguments[a]))for(d in c)if(c.hasOwnProperty(d)){if(e=g[d],f=c[d],g===f)continue;void 0!==f&&(g[d]=f)}return g},A=function(a){if(null==a||""===a)return null;if(a=a.replace(/^\s+|\s+$/g,""),""===a)return null;var b=a.indexOf("//");a=-1===b?a:a.slice(b+2);var c=a.indexOf("/");return a=-1===c?a:-1===b||0===c?null:a.slice(0,c),a&&".swf"===a.slice(-4).toLowerCase()?null:a||null},B=function(){var a=function(a,b){var c,d,e;if(null!=a&&"*"!==b[0]&&("string"==typeof a&&(a=[a]),"object"==typeof a&&"number"==typeof a.length))for(c=0,d=a.length;d>c;c++)if(a.hasOwnProperty(c)&&(e=A(a[c]))){if("*"===e){b.length=0,b.push("*");break}-1===v(e,b)&&b.push(e)}};return function(b,c){var d=A(c.swfPath);null===d&&(d=b);var e=[];a(c.trustedOrigins,e),a(c.trustedDomains,e);var f=e.length;if(f>0){if(1===f&&"*"===e[0])return"always";if(-1!==v(b,e))return 1===f&&b===d?"sameDomain":"always"}return"never"}}(),C=function(a){if(null==a)return[];if(Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},D=function(a){if(a)for(var b in a)a.hasOwnProperty(b)&&delete a[b];return a},E=function(){try{return document.activeElement}catch(a){}return null},F=function(a,b){for(var c={},d=0,e=b.length;e>d;d++)b[d]in a&&(c[b[d]]=a[b[d]]);return c},G=function(a,b){var c={};for(var d in a)-1===v(d,b)&&(c[d]=a[d]);return c},H=function(a){var b={},c={};if("object"==typeof a&&a){for(var d in a)if(d&&a.hasOwnProperty(d)&&"string"==typeof a[d]&&a[d])switch(d.toLowerCase()){case"text/plain":case"text":case"air:text":case"flash:text":b.text=a[d],c.text=d;break;case"text/html":case"html":case"air:html":case"flash:html":b.html=a[d],c.html=d;break;case"application/rtf":case"text/rtf":case"rtf":case"richtext":case"air:rtf":case"flash:rtf":b.rtf=a[d],c.rtf=d}return{data:b,formatMap:c}}},I=function(a,b){if("object"!=typeof a||!a||"object"!=typeof b||!b)return a;var c={};for(var d in a)if(a.hasOwnProperty(d)){if("success"!==d&&"data"!==d){c[d]=a[d];continue}c[d]={};var e=a[d];for(var f in e)f&&e.hasOwnProperty(f)&&b.hasOwnProperty(f)&&(c[d][b[f]]=e[f])}return c},J=function(a){return function(b){return a.call(b,0)}}(a.Array.prototype.slice),K=function(){function a(a){var b=a.match(/[\d]+/g);return b.length=3,b.join(".")}function b(a){return!!a&&(a=a.toLowerCase())&&(/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(a)||"chrome.plugin"===a.slice(-13))}function d(c){c&&(h=!0,c.version&&(k=a(c.version)),!k&&c.description&&(k=a(c.description)),c.filename&&(j=b(c.filename)))}var e,f,g,h=!1,i=!1,j=!1,k="";if(navigator.plugins&&navigator.plugins.length)e=navigator.plugins["Shockwave Flash"],d(e),navigator.plugins["Shockwave Flash 2.0"]&&(h=!0,k="2.0.0.11");else if(navigator.mimeTypes&&navigator.mimeTypes.length)g=navigator.mimeTypes["application/x-shockwave-flash"],e=g&&g.enabledPlugin,d(e);else if("undefined"!=typeof ActiveXObject){i=!0;try{f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"),h=!0,k=a(f.GetVariable("$version"))}catch(l){try{f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),h=!0,k="6.0.21"}catch(m){try{f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),h=!0,k=a(f.GetVariable("$version"))}catch(n){i=!1}}}}c.disabled=h!==!0,c.outdated=k&&parseFloat(k)<11,c.version=k||"0.0.0",c.pluginType=j?"pepper":i?"activex":h?"netscape":"unknown"};K();var L=function(a){if(!(this instanceof L))return new L(a);if(this.id=""+f++,g[this.id]={instance:this,elements:[],handlers:{}},a&&this.clip(a),"boolean"!=typeof c.ready&&(c.ready=!1),!L.isFlashUnusable()&&null===c.bridge){var b=this,d=O.flashLoadTimeout;"number"==typeof d&&d>=0&&setTimeout(function(){"boolean"!=typeof c.deactivated&&(c.deactivated=!0),c.deactivated===!0&&L.emit({type:"error",name:"flash-deactivated",client:b})},d),c.overdue=!1,P()}};L.prototype.setText=function(a){return L.setData("text/plain",a),this},L.prototype.setHtml=function(a){return L.setData("text/html",a),this},L.prototype.setRichText=function(a){return L.setData("application/rtf",a),this},L.prototype.setData=function(){return L.setData.apply(L,J(arguments)),this},L.prototype.clearData=function(){return L.clearData.apply(L,J(arguments)),this},L.prototype.setSize=function(a,b){return T(a,b),this};var M=function(a){c.ready===!0&&c.bridge&&"function"==typeof c.bridge.setHandCursor?c.bridge.setHandCursor(a):c.ready=!1};L.prototype.destroy=function(){this.unclip(),this.off(),delete g[this.id]};var N=function(){var a,b,c,d=[],e=C(g);for(a=0,b=e.length;b>a;a++)c=g[e[a]].instance,c&&c instanceof L&&d.push(c);return d};L.version="2.0.0-beta.5";var O={swfPath:j,trustedDomains:a.location.host?[a.location.host]:[],cacheBust:!0,forceHandCursor:!1,forceEnhancedClipboard:!1,zIndex:999999999,debug:!1,title:null,autoActivate:!0,flashLoadTimeout:3e4};L.isFlashUnusable=function(){return!!(c.disabled||c.outdated||c.unavailable||c.deactivated)},L.config=function(a){"object"==typeof a&&null!==a&&z(O,a);{if("string"!=typeof a||!a){var b={};for(var c in O)O.hasOwnProperty(c)&&(b[c]="object"==typeof O[c]&&null!==O[c]?"length"in O[c]?O[c].slice(0):z({},O[c]):O[c]);return b}if(O.hasOwnProperty(a))return O[a]}},L.destroy=function(){L.deactivate();for(var a in g)if(g.hasOwnProperty(a)&&g[a]){var b=g[a].instance;b&&"function"==typeof b.destroy&&b.destroy()}var d=c.bridge;if(d){var e=R(d);e&&("activex"===c.pluginType&&"readyState"in d?(d.style.display="none",function f(){if(4===d.readyState){for(var a in d)"function"==typeof d[a]&&(d[a]=null);d.parentNode.removeChild(d),e.parentNode&&e.parentNode.removeChild(e)}else setTimeout(f,10)}()):(d.parentNode.removeChild(d),e.parentNode&&e.parentNode.removeChild(e))),c.ready=null,c.bridge=null,c.deactivated=null}L.clearData()},L.activate=function(a){b&&(q(b,O.hoverClass),q(b,O.activeClass)),b=a,p(a,O.hoverClass),S();var d=O.title||a.getAttribute("title");if(d){var e=R(c.bridge);e&&e.setAttribute("title",d)}var f=O.forceHandCursor===!0||"pointer"===l(a,"cursor");M(f)},L.deactivate=function(){var a=R(c.bridge);a&&(a.removeAttribute("title"),a.style.left="0px",a.style.top="-9999px",T(1,1)),b&&(q(b,O.hoverClass),q(b,O.activeClass),b=null)},L.state=function(){return{browser:F(a.navigator,["userAgent","platform","appName"]),flash:G(c,["bridge"]),zeroclipboard:{version:L.version,config:L.config()}}},L.setData=function(a,b){var c;if("object"==typeof a&&a&&"undefined"==typeof b)c=a,L.clearData();else{if("string"!=typeof a||!a)return;c={},c[a]=b}for(var e in c)e&&c.hasOwnProperty(e)&&"string"==typeof c[e]&&c[e]&&(d[e]=c[e])},L.clearData=function(a){"undefined"==typeof a?(D(d),e=null):"string"==typeof a&&d.hasOwnProperty(a)&&delete d[a]};var P=function(){var b,d,e=document.getElementById("global-zeroclipboard-html-bridge");if(!e){var f=B(a.location.host,O),g="never"===f?"none":"all",h=u(O),i=O.swfPath+t(O.swfPath,O);e=Q();var j=document.createElement("div");e.appendChild(j),document.body.appendChild(e);var k=document.createElement("div"),l="activex"===c.pluginType;k.innerHTML='<object id="global-zeroclipboard-flash-bridge" name="global-zeroclipboard-flash-bridge" width="100%" height="100%" '+(l?'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"':'type="application/x-shockwave-flash" data="'+i+'"')+">"+(l?'<param name="movie" value="'+i+'"/>':"")+'<param name="allowScriptAccess" value="'+f+'"/><param name="allowNetworking" value="'+g+'"/><param name="menu" value="false"/><param name="wmode" value="transparent"/><param name="flashvars" value="'+h+'"/></object>',b=k.firstChild,k=null,b.ZeroClipboard=L,e.replaceChild(b,j)}b||(b=document["global-zeroclipboard-flash-bridge"],b&&(d=b.length)&&(b=b[d-1]),b||(b=e.firstChild)),c.bridge=b||null},Q=function(){var a=document.createElement("div");return a.id="global-zeroclipboard-html-bridge",a.className="global-zeroclipboard-container",a.style.position="absolute",a.style.left="0px",a.style.top="-9999px",a.style.width="1px",a.style.height="1px",a.style.zIndex=""+y(O.zIndex),a},R=function(a){for(var b=a&&a.parentNode;b&&"OBJECT"===b.nodeName&&b.parentNode;)b=b.parentNode;return b||null},S=function(){if(b){var a=s(b,O.zIndex),d=R(c.bridge);d&&(d.style.top=a.top+"px",d.style.left=a.left+"px",d.style.width=a.width+"px",d.style.height=a.height+"px",d.style.zIndex=a.zIndex+1),T(a.width,a.height)}},T=function(a,b){var d=R(c.bridge);d&&(d.style.width=a+"px",d.style.height=b+"px")};L.emit=function(b){var f,g,h,i,j,k,l,m,n;if("string"==typeof b&&b&&(f=b),"object"==typeof b&&b&&"string"==typeof b.type&&b.type&&(f=b.type,g=b),f){if(b=W(f,g),Y(b),"ready"===b.type&&c.overdue===!0)return L.emit({type:"error",name:"flash-overdue"});if(h=!/^(before)?copy$/.test(b.type),b.client)U.call(b.client,b,h);else for(i=b.target&&b.target!==a&&O.autoActivate===!0?Z(b.target):N(),j=0,k=i.length;k>j;j++)l=z({},b,{client:i[j]}),U.call(i[j],l,h);return"copy"===b.type&&(n=H(d),m=n.data,e=n.formatMap),m}};var U=function(b,c){var d=g[this.id]&&g[this.id].handlers[b.type];if(d&&d.length){var e,f,h,i,j=this;for(e=0,f=d.length;f>e;e++)h=d[e],i=j,"string"==typeof h&&"function"==typeof a[h]&&(h=a[h]),"object"==typeof h&&h&&"function"==typeof h.handleEvent&&(i=h,h=h.handleEvent),"function"==typeof h&&x(h,i,[b],c)}return this},V={ready:"Flash communication is established",error:{"flash-disabled":"Flash is disabled or not installed","flash-outdated":"Flash is too outdated to support ZeroClipboard","flash-unavailable":"Flash is unable to communicate bidirectionally with JavaScript","flash-deactivated":"Flash is too outdated for your browser and/or is configured as click-to-activate","flash-overdue":"Flash communication was established but NOT within the acceptable time limit"}},W=function(a,d){if(a||d&&d.type){d=d||{},a=(a||d.type).toLowerCase(),z(d,{type:a,target:d.target||b||null,relatedTarget:d.relatedTarget||null,currentTarget:c&&c.bridge||null});var f=V[d.type];return"error"===d.type&&d.name&&f&&(f=f[d.name]),f&&(d.message=f),"ready"===d.type&&z(d,{target:null,version:c.version}),"error"===d.type&&(d.target=null,/^flash-(outdated|unavailable|deactivated|overdue)$/.test(d.name)&&z(d,{version:c.version,minimumVersion:"11.0.0"})),"copy"===d.type&&(d.clipboardData={setData:L.setData,clearData:L.clearData}),"aftercopy"===d.type&&(d=I(d,e)),d.target&&!d.relatedTarget&&(d.relatedTarget=X(d.target)),d}},X=function(a){var b=a&&a.getAttribute&&a.getAttribute("data-clipboard-target");return b?document.getElementById(b):null},Y=function(a){var e=a.target||b;switch(a.type){case"error":v(a.name,["flash-disabled","flash-outdated","flash-deactivated","flash-overdue"])&&z(c,{disabled:"flash-disabled"===a.name,outdated:"flash-outdated"===a.name,unavailable:"flash-unavailable"===a.name,deactivated:"flash-deactivated"===a.name,overdue:"flash-overdue"===a.name,ready:!1});break;case"ready":var f=c.deactivated===!0;z(c,{disabled:!1,outdated:!1,unavailable:!1,deactivated:!1,overdue:f,ready:!f});break;case"copy":var g,h,i=a.relatedTarget;!d["text/html"]&&!d["text/plain"]&&i&&(h=i.value||i.outerHTML||i.innerHTML)&&(g=i.value||i.textContent||i.innerText)?(a.clipboardData.clearData(),a.clipboardData.setData("text/plain",g),h!==g&&a.clipboardData.setData("text/html",h)):!d["text/plain"]&&a.target&&(g=a.target.getAttribute("data-clipboard-text"))&&(a.clipboardData.clearData(),a.clipboardData.setData("text/plain",g));break;case"aftercopy":L.clearData(),e&&e!==E()&&e.focus&&e.focus();break;case"mouseover":p(e,O.hoverClass);break;case"mouseout":O.autoActivate===!0&&L.deactivate();break;case"mousedown":p(e,O.activeClass);break;case"mouseup":q(e,O.activeClass)}};L.prototype.on=function(a,b){var d,e,f,h={},i=g[this.id]&&g[this.id].handlers;if("string"==typeof a&&a)f=a.toLowerCase().split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(d in a)a.hasOwnProperty(d)&&"string"==typeof d&&d&&"function"==typeof a[d]&&this.on(d,a[d]);if(f&&f.length){for(d=0,e=f.length;e>d;d++)a=f[d].replace(/^on/,""),h[a]=!0,i[a]||(i[a]=[]),i[a].push(b);if(h.ready&&c.ready&&L.emit({type:"ready",client:this}),h.error){var j=["disabled","outdated","unavailable","deactivated","overdue"];for(d=0,e=j.length;e>d;d++)if(c[j[d]]){L.emit({type:"error",name:"flash-"+j[d],client:this});break}}}return this},L.prototype.off=function(a,b){var c,d,e,f,h,i=g[this.id]&&g[this.id].handlers;if(0===arguments.length)f=C(i);else if("string"==typeof a&&a)f=a.split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(c in a)a.hasOwnProperty(c)&&"string"==typeof c&&c&&"function"==typeof a[c]&&this.off(c,a[c]);if(f&&f.length)for(c=0,d=f.length;d>c;c++)if(a=f[c].toLowerCase().replace(/^on/,""),h=i[a],h&&h.length)if(b)for(e=v(b,h);-1!==e;)h.splice(e,1),e=v(b,h,e);else i[a].length=0;return this},L.prototype.handlers=function(a){var b,c=null,d=g[this.id]&&g[this.id].handlers;if(d){if("string"==typeof a&&a)return d[a]?d[a].slice(0):null;c={};for(b in d)d.hasOwnProperty(b)&&d[b]&&(c[b]=d[b].slice(0))}return c},L.prototype.clip=function(a){a=w(a);for(var b=0;b<a.length;b++)if(a.hasOwnProperty(b)&&a[b]&&1===a[b].nodeType){a[b].zcClippingId?-1===v(this.id,i[a[b].zcClippingId])&&i[a[b].zcClippingId].push(this.id):(a[b].zcClippingId="zcClippingId_"+h++,i[a[b].zcClippingId]=[this.id],O.autoActivate===!0&&n(a[b],"mouseover",m));var c=g[this.id].elements;-1===v(a[b],c)&&c.push(a[b])}return this},L.prototype.unclip=function(a){var b=g[this.id];if(!b)return this;var c,d=b.elements;a="undefined"==typeof a?d.slice(0):w(a);for(var e=a.length;e--;)if(a.hasOwnProperty(e)&&a[e]&&1===a[e].nodeType){for(c=0;-1!==(c=v(a[e],d,c));)d.splice(c,1);var f=i[a[e].zcClippingId];if(f){for(c=0;-1!==(c=v(this.id,f,c));)f.splice(c,1);0===f.length&&(O.autoActivate===!0&&o(a[e],"mouseover",m),delete a[e].zcClippingId)}}return this},L.prototype.elements=function(){var a=g[this.id];return a&&a.elements?a.elements.slice(0):[]};var Z=function(a){var b,c,d,e,f,h=[];if(a&&1===a.nodeType&&(b=a.zcClippingId)&&i.hasOwnProperty(b)&&(c=i[b],c&&c.length))for(d=0,e=c.length;e>d;d++)f=g[c[d]].instance,f&&f instanceof L&&h.push(f);return h};O.hoverClass="zeroclipboard-is-hover",O.activeClass="zeroclipboard-is-active","function"==typeof define&&define.amd?define(function(){return L}):"object"==typeof module&&module&&"object"==typeof module.exports&&module.exports?module.exports=L:a.ZeroClipboard=L}(function(){return this}());
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.swf b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.swf
new file mode 100644
index 0000000..ed1c9d2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/third-party/zeroclipboard/ZeroClipboard.swf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.all.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.all.js
new file mode 100644
index 0000000..038d963
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.all.js
@@ -0,0 +1,29429 @@
+/*!
+ * UEditor
+ * version: ueditor
+ * build: Thu May 29 2014 16:47:49 GMT+0800 (中国标准时间)
+ */
+
+(function(){
+
+// editor.js
+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 = {};
+
+// core/browser.js
+/**
+ * 浏览器判断模块
+ * @file
+ * @module UE.browser
+ * @since 1.2.6.1
+ */
+
+/**
+ * 提供浏览器检测的模块
+ * @unfile
+ * @module UE.browser
+ */
+var browser = UE.browser = function(){
+    var agent = navigator.userAgent.toLowerCase(),
+        opera = window.opera,
+        browser = {
+        /**
+         * @property {boolean} ie 检测当前浏览器是否为IE
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie ) {
+         *     console.log( '当前浏览器是IE' );
+         * }
+         * ```
+         */
+        ie		:  /(msie\s|trident.*rv:)([\w.]+)/.test(agent),
+
+        /**
+         * @property {boolean} opera 检测当前浏览器是否为Opera
+         * @example
+         * ```javascript
+         * if ( UE.browser.opera ) {
+         *     console.log( '当前浏览器是Opera' );
+         * }
+         * ```
+         */
+        opera	: ( !!opera && opera.version ),
+
+        /**
+         * @property {boolean} webkit 检测当前浏览器是否是webkit内核的浏览器
+         * @example
+         * ```javascript
+         * if ( UE.browser.webkit ) {
+         *     console.log( '当前浏览器是webkit内核浏览器' );
+         * }
+         * ```
+         */
+        webkit	: ( agent.indexOf( ' applewebkit/' ) > -1 ),
+
+        /**
+         * @property {boolean} mac 检测当前浏览器是否是运行在mac平台下
+         * @example
+         * ```javascript
+         * if ( UE.browser.mac ) {
+         *     console.log( '当前浏览器运行在mac平台下' );
+         * }
+         * ```
+         */
+        mac	: ( agent.indexOf( 'macintosh' ) > -1 ),
+
+        /**
+         * @property {boolean} quirks 检测当前浏览器是否处于“怪异模式”下
+         * @example
+         * ```javascript
+         * if ( UE.browser.quirks ) {
+         *     console.log( '当前浏览器运行处于“怪异模式”' );
+         * }
+         * ```
+         */
+        quirks : ( document.compatMode == 'BackCompat' )
+    };
+
+    /**
+    * @property {boolean} gecko 检测当前浏览器内核是否是gecko内核
+    * @example
+    * ```javascript
+    * if ( UE.browser.gecko ) {
+    *     console.log( '当前浏览器内核是gecko内核' );
+    * }
+    * ```
+    */
+    browser.gecko =( navigator.product == 'Gecko' && !browser.webkit && !browser.opera && !browser.ie);
+
+    var version = 0;
+
+    // Internet Explorer 6.0+
+    if ( browser.ie ){
+
+        var v1 =  agent.match(/(?:msie\s([\w.]+))/);
+        var v2 = agent.match(/(?:trident.*rv:([\w.]+))/);
+        if(v1 && v2 && v1[1] && v2[1]){
+            version = Math.max(v1[1]*1,v2[1]*1);
+        }else if(v1 && v1[1]){
+            version = v1[1]*1;
+        }else if(v2 && v2[1]){
+            version = v2[1]*1;
+        }else{
+            version = 0;
+        }
+
+        browser.ie11Compat = document.documentMode == 11;
+        /**
+         * @property { boolean } ie9Compat 检测浏览器模式是否为 IE9 兼容模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie9Compat ) {
+         *     console.log( '当前浏览器运行在IE9兼容模式下' );
+         * }
+         * ```
+         */
+        browser.ie9Compat = document.documentMode == 9;
+
+        /**
+         * @property { boolean } ie8 检测浏览器是否是IE8浏览器
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie8 ) {
+         *     console.log( '当前浏览器是IE8浏览器' );
+         * }
+         * ```
+         */
+        browser.ie8 = !!document.documentMode;
+
+        /**
+         * @property { boolean } ie8Compat 检测浏览器模式是否为 IE8 兼容模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie8Compat ) {
+         *     console.log( '当前浏览器运行在IE8兼容模式下' );
+         * }
+         * ```
+         */
+        browser.ie8Compat = document.documentMode == 8;
+
+        /**
+         * @property { boolean } ie7Compat 检测浏览器模式是否为 IE7 兼容模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie7Compat ) {
+         *     console.log( '当前浏览器运行在IE7兼容模式下' );
+         * }
+         * ```
+         */
+        browser.ie7Compat = ( ( version == 7 && !document.documentMode )
+                || document.documentMode == 7 );
+
+        /**
+         * @property { boolean } ie6Compat 检测浏览器模式是否为 IE6 模式 或者怪异模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie6Compat ) {
+         *     console.log( '当前浏览器运行在IE6模式或者怪异模式下' );
+         * }
+         * ```
+         */
+        browser.ie6Compat = ( version < 7 || browser.quirks );
+
+        browser.ie9above = version > 8;
+
+        browser.ie9below = version < 9;
+
+        browser.ie11above = version > 10;
+
+        browser.ie11below = version < 11;
+
+    }
+
+    // Gecko.
+    if ( browser.gecko ){
+        var geckoRelease = agent.match( /rv:([\d\.]+)/ );
+        if ( geckoRelease )
+        {
+            geckoRelease = geckoRelease[1].split( '.' );
+            version = geckoRelease[0] * 10000 + ( geckoRelease[1] || 0 ) * 100 + ( geckoRelease[2] || 0 ) * 1;
+        }
+    }
+
+    /**
+     * @property { Number } chrome 检测当前浏览器是否为Chrome, 如果是,则返回Chrome的大版本号
+     * @warning 如果浏览器不是chrome, 则该值为undefined
+     * @example
+     * ```javascript
+     * if ( UE.browser.chrome ) {
+     *     console.log( '当前浏览器是Chrome' );
+     * }
+     * ```
+     */
+    if (/chrome\/(\d+\.\d)/i.test(agent)) {
+        browser.chrome = + RegExp['\x241'];
+    }
+
+    /**
+     * @property { Number } safari 检测当前浏览器是否为Safari, 如果是,则返回Safari的大版本号
+     * @warning 如果浏览器不是safari, 则该值为undefined
+     * @example
+     * ```javascript
+     * if ( UE.browser.safari ) {
+     *     console.log( '当前浏览器是Safari' );
+     * }
+     * ```
+     */
+    if(/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) && !/chrome/i.test(agent)){
+    	browser.safari = + (RegExp['\x241'] || RegExp['\x242']);
+    }
+
+
+    // Opera 9.50+
+    if ( browser.opera )
+        version = parseFloat( opera.version() );
+
+    // WebKit 522+ (Safari 3+)
+    if ( browser.webkit )
+        version = parseFloat( agent.match( / applewebkit\/(\d+)/ )[1] );
+
+    /**
+     * @property { Number } version 检测当前浏览器版本号
+     * @remind
+     * <ul>
+     *     <li>IE系列返回值为5,6,7,8,9,10等</li>
+     *     <li>gecko系列会返回10900,158900等</li>
+     *     <li>webkit系列会返回其build号 (如 522等)</li>
+     * </ul>
+     * @example
+     * ```javascript
+     * console.log( '当前浏览器版本号是: ' + UE.browser.version );
+     * ```
+     */
+    browser.version = version;
+
+    /**
+     * @property { boolean } isCompatible 检测当前浏览器是否能够与UEditor良好兼容
+     * @example
+     * ```javascript
+     * if ( UE.browser.isCompatible ) {
+     *     console.log( '浏览器与UEditor能够良好兼容' );
+     * }
+     * ```
+     */
+    browser.isCompatible =
+        !browser.mobile && (
+        ( browser.ie && version >= 6 ) ||
+        ( browser.gecko && version >= 10801 ) ||
+        ( browser.opera && version >= 9.5 ) ||
+        ( browser.air && version >= 1 ) ||
+        ( browser.webkit && version >= 522 ) ||
+        false );
+    return browser;
+}();
+//快捷方式
+var ie = browser.ie,
+    webkit = browser.webkit,
+    gecko = browser.gecko,
+    opera = browser.opera;
+
+// core/utils.js
+/**
+ * 工具函数包
+ * @file
+ * @module UE.utils
+ * @since 1.2.6.1
+ */
+
+/**
+ * UEditor封装使用的静态工具函数
+ * @module UE.utils
+ * @unfile
+ */
+
+var utils = UE.utils = {
+
+    /**
+     * 用给定的迭代器遍历对象
+     * @method each
+     * @param { Object } obj 需要遍历的对象
+     * @param { Function } iterator 迭代器, 该方法接受两个参数, 第一个参数是当前所处理的value, 第二个参数是当前遍历对象的key
+     * @example
+     * ```javascript
+     * var demoObj = {
+     *     key1: 1,
+     *     key2: 2
+     * };
+     *
+     * //output: key1: 1, key2: 2
+     * UE.utils.each( demoObj, funciton ( value, key ) {
+     *
+     *     console.log( key + ":" + value );
+     *
+     * } );
+     * ```
+     */
+
+    /**
+     * 用给定的迭代器遍历数组或类数组对象
+     * @method each
+     * @param { Array } array 需要遍历的数组或者类数组
+     * @param { Function } iterator 迭代器, 该方法接受两个参数, 第一个参数是当前所处理的value, 第二个参数是当前遍历对象的key
+     * @example
+     * ```javascript
+     * var divs = document.getElmentByTagNames( "div" );
+     *
+     * //output: 0: DIV, 1: DIV ...
+     * UE.utils.each( divs, funciton ( value, key ) {
+     *
+     *     console.log( key + ":" + value.tagName );
+     *
+     * } );
+     * ```
+     */
+    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;
+                }
+            }
+        }
+    },
+
+    /**
+     * 以给定对象作为原型创建一个新对象
+     * @method makeInstance
+     * @param { Object } protoObject 该对象将作为新创建对象的原型
+     * @return { Object } 新的对象, 该对象的原型是给定的protoObject对象
+     * @example
+     * ```javascript
+     *
+     * var protoObject = { sayHello: function () { console.log('Hello UEditor!'); } };
+     *
+     * var newObject = UE.utils.makeInstance( protoObject );
+     * //output: Hello UEditor!
+     * newObject.sayHello();
+     * ```
+     */
+    makeInstance:function (obj) {
+        var noop = new Function();
+        noop.prototype = obj;
+        obj = new noop;
+        noop.prototype = null;
+        return obj;
+    },
+
+    /**
+     * 将source对象中的属性扩展到target对象上
+     * @method extend
+     * @remind 该方法将强制把source对象上的属性复制到target对象上
+     * @see UE.utils.extend(Object,Object,Boolean)
+     * @param { Object } target 目标对象, 新的属性将附加到该对象上
+     * @param { Object } source 源对象, 该对象的属性会被附加到target对象上
+     * @return { Object } 返回target对象
+     * @example
+     * ```javascript
+     *
+     * var target = { name: 'target', sex: 1 },
+     *      source = { name: 'source', age: 17 };
+     *
+     * UE.utils.extend( target, source );
+     *
+     * //output: { name: 'source', sex: 1, age: 17 }
+     * console.log( target );
+     *
+     * ```
+     */
+
+    /**
+     * 将source对象中的属性扩展到target对象上, 根据指定的isKeepTarget值决定是否保留目标对象中与
+     * 源对象属性名相同的属性值。
+     * @method extend
+     * @param { Object } target 目标对象, 新的属性将附加到该对象上
+     * @param { Object } source 源对象, 该对象的属性会被附加到target对象上
+     * @param { Boolean } isKeepTarget 是否保留目标对象中与源对象中属性名相同的属性
+     * @return { Object } 返回target对象
+     * @example
+     * ```javascript
+     *
+     * var target = { name: 'target', sex: 1 },
+     *      source = { name: 'source', age: 17 };
+     *
+     * UE.utils.extend( target, source, true );
+     *
+     * //output: { name: 'target', sex: 1, age: 17 }
+     * console.log( target );
+     *
+     * ```
+     */
+    extend:function (t, s, b) {
+        if (s) {
+            for (var k in s) {
+                if (!b || !t.hasOwnProperty(k)) {
+                    t[k] = s[k];
+                }
+            }
+        }
+        return t;
+    },
+
+    /**
+     * 将给定的多个对象的属性复制到目标对象target上
+     * @method extend2
+     * @remind 该方法将强制把源对象上的属性复制到target对象上
+     * @remind 该方法支持两个及以上的参数, 从第二个参数开始, 其属性都会被复制到第一个参数上。 如果遇到同名的属性,
+     *          将会覆盖掉之前的值。
+     * @param { Object } target 目标对象, 新的属性将附加到该对象上
+     * @param { Object... } source 源对象, 支持多个对象, 该对象的属性会被附加到target对象上
+     * @return { Object } 返回target对象
+     * @example
+     * ```javascript
+     *
+     * var target = {},
+     *     source1 = { name: 'source', age: 17 },
+     *     source2 = { title: 'dev' };
+     *
+     * UE.utils.extend2( target, source1, source2 );
+     *
+     * //output: { name: 'source', age: 17, title: 'dev' }
+     * console.log( target );
+     *
+     * ```
+     */
+    extend2:function (t) {
+        var a = arguments;
+        for (var i = 1; i < a.length; i++) {
+            var x = a[i];
+            for (var k in x) {
+                if (!t.hasOwnProperty(k)) {
+                    t[k] = x[k];
+                }
+            }
+        }
+        return t;
+    },
+
+    /**
+     * 模拟继承机制, 使得subClass继承自superClass
+     * @method inherits
+     * @param { Object } subClass 子类对象
+     * @param { Object } superClass 超类对象
+     * @warning 该方法只能让subClass继承超类的原型, subClass对象自身的属性和方法不会被继承
+     * @return { Object } 继承superClass后的子类对象
+     * @example
+     * ```javascript
+     * function SuperClass(){
+     *     this.name = "小李";
+     * }
+     *
+     * SuperClass.prototype = {
+     *     hello:function(str){
+     *         console.log(this.name + str);
+     *     }
+     * }
+     *
+     * function SubClass(){
+     *     this.name = "小张";
+     * }
+     *
+     * UE.utils.inherits(SubClass,SuperClass);
+     *
+     * var sub = new SubClass();
+     * //output: '小张早上好!
+     * sub.hello("早上好!");
+     * ```
+     */
+    inherits:function (subClass, superClass) {
+        var oldP = subClass.prototype,
+            newP = utils.makeInstance(superClass.prototype);
+        utils.extend(newP, oldP, true);
+        subClass.prototype = newP;
+        return (newP.constructor = subClass);
+    },
+
+    /**
+     * 用指定的context对象作为函数fn的上下文
+     * @method bind
+     * @param { Function } fn 需要绑定上下文的函数对象
+     * @param { Object } content 函数fn新的上下文对象
+     * @return { Function } 一个新的函数, 该函数作为原始函数fn的代理, 将完成fn的上下文调换工作。
+     * @example
+     * ```javascript
+     *
+     * var name = 'window',
+     *     newTest = null;
+     *
+     * function test () {
+     *     console.log( this.name );
+     * }
+     *
+     * newTest = UE.utils.bind( test, { name: 'object' } );
+     *
+     * //output: object
+     * newTest();
+     *
+     * //output: window
+     * test();
+     *
+     * ```
+     */
+    bind:function (fn, context) {
+        return function () {
+            return fn.apply(context, arguments);
+        };
+    },
+
+    /**
+     * 创建延迟指定时间后执行的函数fn
+     * @method defer
+     * @param { Function } fn 需要延迟执行的函数对象
+     * @param { int } delay 延迟的时间, 单位是毫秒
+     * @warning 该方法的时间控制是不精确的,仅仅只能保证函数的执行是在给定的时间之后,
+     *           而不能保证刚好到达延迟时间时执行。
+     * @return { Function } 目标函数fn的代理函数, 只有执行该函数才能起到延时效果
+     * @example
+     * ```javascript
+     * var start = 0;
+     *
+     * function test(){
+     *     console.log( new Date() - start );
+     * }
+     *
+     * var testDefer = UE.utils.defer( test, 1000 );
+     * //
+     * start = new Date();
+     * //output: (大约在1000毫秒之后输出) 1000
+     * testDefer();
+     * ```
+     */
+
+    /**
+     * 创建延迟指定时间后执行的函数fn, 如果在延迟时间内再次执行该方法, 将会根据指定的exclusion的值,
+     * 决定是否取消前一次函数的执行, 如果exclusion的值为true, 则取消执行,反之,将继续执行前一个方法。
+     * @method defer
+     * @param { Function } fn 需要延迟执行的函数对象
+     * @param { int } delay 延迟的时间, 单位是毫秒
+     * @param { Boolean } exclusion 如果在延迟时间内再次执行该函数,该值将决定是否取消执行前一次函数的执行,
+     *                     值为true表示取消执行, 反之则将在执行前一次函数之后才执行本次函数调用。
+     * @warning 该方法的时间控制是不精确的,仅仅只能保证函数的执行是在给定的时间之后,
+     *           而不能保证刚好到达延迟时间时执行。
+     * @return { Function } 目标函数fn的代理函数, 只有执行该函数才能起到延时效果
+     * @example
+     * ```javascript
+     *
+     * function test(){
+     *     console.log(1);
+     * }
+     *
+     * var testDefer = UE.utils.defer( test, 1000, true );
+     *
+     * //output: (两次调用仅有一次输出) 1
+     * testDefer();
+     * testDefer();
+     * ```
+     */
+    defer:function (fn, delay, exclusion) {
+        var timerID;
+        return function () {
+            if (exclusion) {
+                clearTimeout(timerID);
+            }
+            timerID = setTimeout(fn, delay);
+        };
+    },
+
+    /**
+     * 获取元素item在数组array中首次出现的位置, 如果未找到item, 则返回-1
+     * @method indexOf
+     * @remind 该方法的匹配过程使用的是恒等“===”
+     * @param { Array } array 需要查找的数组对象
+     * @param { * } item 需要在目标数组中查找的值
+     * @return { int } 返回item在目标数组array中首次出现的位置, 如果在数组中未找到item, 则返回-1
+     * @example
+     * ```javascript
+     * var item = 1,
+     *     arr = [ 3, 4, 6, 8, 1, 1, 2 ];
+     *
+     * //output: 4
+     * console.log( UE.utils.indexOf( arr, item ) );
+     * ```
+     */
+
+    /**
+     * 获取元素item数组array中首次出现的位置, 如果未找到item, 则返回-1。通过start的值可以指定搜索的起始位置。
+     * @method indexOf
+     * @remind 该方法的匹配过程使用的是恒等“===”
+     * @param { Array } array 需要查找的数组对象
+     * @param { * } item 需要在目标数组中查找的值
+     * @param { int } start 搜索的起始位置
+     * @return { int } 返回item在目标数组array中的start位置之后首次出现的位置, 如果在数组中未找到item, 则返回-1
+     * @example
+     * ```javascript
+     * var item = 1,
+     *     arr = [ 3, 4, 6, 8, 1, 2, 8, 3, 2, 1, 1, 4 ];
+     *
+     * //output: 9
+     * console.log( UE.utils.indexOf( arr, item, 5 ) );
+     * ```
+     */
+    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;
+    },
+
+    /**
+     * 移除数组array中所有的元素item
+     * @method removeItem
+     * @param { Array } array 要移除元素的目标数组
+     * @param { * } item 将要被移除的元素
+     * @remind 该方法的匹配过程使用的是恒等“===”
+     * @example
+     * ```javascript
+     * var arr = [ 4, 5, 7, 1, 3, 4, 6 ];
+     *
+     * UE.utils.removeItem( arr, 4 );
+     * //output: [ 5, 7, 1, 3, 6 ]
+     * console.log( arr );
+     *
+     * ```
+     */
+    removeItem:function (array, item) {
+        for (var i = 0, l = array.length; i < l; i++) {
+            if (array[i] === item) {
+                array.splice(i, 1);
+                i--;
+            }
+        }
+    },
+
+    /**
+     * 删除字符串str的首尾空格
+     * @method trim
+     * @param { String } str 需要删除首尾空格的字符串
+     * @return { String } 删除了首尾的空格后的字符串
+     * @example
+     * ```javascript
+     *
+     * var str = " UEdtior ";
+     *
+     * //output: 9
+     * console.log( str.length );
+     *
+     * //output: 7
+     * console.log( UE.utils.trim( " UEdtior " ).length );
+     *
+     * //output: 9
+     * console.log( str.length );
+     *
+     *  ```
+     */
+    trim:function (str) {
+        return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, '');
+    },
+
+    /**
+     * 将字符串str以','分隔成数组后,将该数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1
+     * @method listToMap
+     * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。
+     * @param { String } str 该字符串将被以','分割为数组, 然后进行转化
+     * @return { Object } 转化之后的hash对象
+     * @example
+     * ```javascript
+     *
+     * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1}
+     * console.log( UE.utils.listToMap( 'UEdtior,Hello' ) );
+     *
+     * ```
+     */
+
+    /**
+     * 将字符串数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1
+     * @method listToMap
+     * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。
+     * @param { Array } arr 字符串数组
+     * @return { Object } 转化之后的hash对象
+     * @example
+     * ```javascript
+     *
+     * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1}
+     * console.log( UE.utils.listToMap( [ 'UEdtior', 'Hello' ] ) );
+     *
+     * ```
+     */
+    listToMap:function (list) {
+        if (!list)return {};
+        list = utils.isArray(list) ? list : list.split(',');
+        for (var i = 0, ci, obj = {}; ci = list[i++];) {
+            obj[ci.toUpperCase()] = obj[ci] = 1;
+        }
+        return obj;
+    },
+
+    /**
+     * 将str中的html符号转义,将转义“',&,<,",>”五个字符
+     * @method unhtml
+     * @param { String } str 需要转义的字符串
+     * @return { String } 转义后的字符串
+     * @example
+     * ```javascript
+     * var html = '<body>&</body>';
+     *
+     * //output: &lt;body&gt;&amp;&lt;/body&gt;
+     * console.log( UE.utils.unhtml( html ) );
+     *
+     * ```
+     */
+    unhtml:function (str, reg) {
+        return str ? str.replace(reg || /[&<">'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g, function (a, b) {
+            if (b) {
+                return a;
+            } else {
+                return {
+                    '<':'&lt;',
+                    '&':'&amp;',
+                    '"':'&quot;',
+                    '>':'&gt;',
+                    "'":'&#39;'
+                }[a]
+            }
+
+        }) : '';
+    },
+
+    /**
+     * 将str中的转义字符还原成html字符
+     * @see UE.utils.unhtml(String);
+     * @method html
+     * @param { String } str 需要逆转义的字符串
+     * @return { String } 逆转义后的字符串
+     * @example
+     * ```javascript
+     *
+     * var str = '&lt;body&gt;&amp;&lt;/body&gt;';
+     *
+     * //output: <body>&</body>
+     * console.log( UE.utils.html( str ) );
+     *
+     * ```
+     */
+    html:function (str) {
+        return str ? str.replace(/&((g|l|quo)t|amp|#39|nbsp);/g, function (m) {
+            return {
+                '&lt;':'<',
+                '&amp;':'&',
+                '&quot;':'"',
+                '&gt;':'>',
+                '&#39;':"'",
+                '&nbsp;':' '
+            }[m]
+        }) : '';
+    },
+
+    /**
+     * 将css样式转换为驼峰的形式
+     * @method cssStyleToDomStyle
+     * @param { String } cssName 需要转换的css样式名
+     * @return { String } 转换成驼峰形式后的css样式名
+     * @example
+     * ```javascript
+     *
+     * var str = 'border-top';
+     *
+     * //output: borderTop
+     * console.log( UE.utils.cssStyleToDomStyle( str ) );
+     *
+     * ```
+     */
+    cssStyleToDomStyle:function () {
+        var test = document.createElement('div').style,
+            cache = {
+                'float':test.cssFloat != undefined ? 'cssFloat' : test.styleFloat != undefined ? 'styleFloat' : 'float'
+            };
+
+        return function (cssName) {
+            return cache[cssName] || (cache[cssName] = cssName.toLowerCase().replace(/-./g, function (match) {
+                return match.charAt(1).toUpperCase();
+            }));
+        };
+    }(),
+
+    /**
+     * 动态加载文件到doc中
+     * @method loadFile
+     * @param { DomDocument } document 需要加载资源文件的文档对象
+     * @param { Object } options 加载资源文件的属性集合, 取值请参考代码示例
+     * @example
+     * ```javascript
+     *
+     * UE.utils.loadFile( document, {
+     *     src:"test.js",
+     *     tag:"script",
+     *     type:"text/javascript",
+     *     defer:"defer"
+     * } );
+     *
+     * ```
+     */
+
+    /**
+     * 动态加载文件到doc中,加载成功后执行的回调函数fn
+     * @method loadFile
+     * @param { DomDocument } document 需要加载资源文件的文档对象
+     * @param { Object } options 加载资源文件的属性集合, 该集合支持的值是script标签和style标签支持的所有属性。
+     * @param { Function } fn 资源文件加载成功之后执行的回调
+     * @warning 对于在同一个文档中多次加载同一URL的文件, 该方法会在第一次加载之后缓存该请求,
+     *           在此之后的所有同一URL的请求, 将会直接触发回调。
+     * @example
+     * ```javascript
+     *
+     * UE.utils.loadFile( document, {
+     *     src:"test.js",
+     *     tag:"script",
+     *     type:"text/javascript",
+     *     defer:"defer"
+     * }, function () {
+     *     console.log('加载成功');
+     * } );
+     *
+     * ```
+     */
+    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(' ') + ' ></' + obj.tag + '>');
+                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 settings of file ueditor.config.js ')
+            };
+            doc.getElementsByTagName("head")[0].appendChild(element);
+        }
+    }(),
+
+    /**
+     * 判断obj对象是否为空
+     * @method isEmptyObject
+     * @param { * } obj 需要判断的对象
+     * @remind 如果判断的对象是NULL, 将直接返回true, 如果是数组且为空, 返回true, 如果是字符串, 且字符串为空,
+     *          返回true, 如果是普通对象, 且该对象没有任何实例属性, 返回true
+     * @return { Boolean } 对象是否为空
+     * @example
+     * ```javascript
+     *
+     * //output: true
+     * console.log( UE.utils.isEmptyObject( {} ) );
+     *
+     * //output: true
+     * console.log( UE.utils.isEmptyObject( [] ) );
+     *
+     * //output: true
+     * console.log( UE.utils.isEmptyObject( "" ) );
+     *
+     * //output: false
+     * console.log( UE.utils.isEmptyObject( { key: 1 } ) );
+     *
+     * //output: false
+     * console.log( UE.utils.isEmptyObject( [1] ) );
+     *
+     * //output: false
+     * console.log( UE.utils.isEmptyObject( "1" ) );
+     *
+     * ```
+     */
+    isEmptyObject:function (obj) {
+        if (obj == null) return true;
+        if (this.isArray(obj) || this.isString(obj)) return obj.length === 0;
+        for (var key in obj) if (obj.hasOwnProperty(key)) return false;
+        return true;
+    },
+
+    /**
+     * 把rgb格式的颜色值转换成16进制格式
+     * @method fixColor
+     * @param { String } rgb格式的颜色值
+     * @param { String }
+     * @example
+     * rgb(255,255,255)  => "#ffffff"
+     */
+    fixColor:function (name, value) {
+        if (/color/i.test(name) && /rgba?/.test(value)) {
+            var array = value.split(",");
+            if (array.length > 3)
+                return "";
+            value = "#";
+            for (var i = 0, color; color = array[i++];) {
+                color = parseInt(color.replace(/[^\d]/gi, ''), 10).toString(16);
+                value += color.length == 1 ? "0" + color : color;
+            }
+            value = value.toUpperCase();
+        }
+        return  value;
+    },
+    /**
+     * 只针对border,padding,margin做了处理,因为性能问题
+     * @public
+     * @function
+     * @param {String}    val style字符串
+     */
+    optCss:function (val) {
+        var padding, margin, border;
+        val = val.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi, function (str, key, name, val) {
+            if (val.split(' ').length == 1) {
+                switch (key) {
+                    case 'padding':
+                        !padding && (padding = {});
+                        padding[name] = val;
+                        return '';
+                    case 'margin':
+                        !margin && (margin = {});
+                        margin[name] = val;
+                        return '';
+                    case 'border':
+                        return val == 'initial' ? '' : str;
+                }
+            }
+            return str;
+        });
+
+        function opt(obj, name) {
+            if (!obj) {
+                return '';
+            }
+            var t = obj.top , b = obj.bottom, l = obj.left, r = obj.right, val = '';
+            if (!t || !l || !b || !r) {
+                for (var p in obj) {
+                    val += ';' + name + '-' + p + ':' + obj[p] + ';';
+                }
+            } else {
+                val += ';' + name + ':' +
+                    (t == b && b == l && l == r ? t :
+                        t == b && l == r ? (t + ' ' + l) :
+                            l == r ? (t + ' ' + l + ' ' + b) : (t + ' ' + r + ' ' + b + ' ' + l)) + ';'
+            }
+            return val;
+        }
+
+        val += opt(padding, 'padding') + opt(margin, 'margin');
+        return val.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 + ";;" : ';'
+            });
+    },
+
+    /**
+     * 克隆对象
+     * @method clone
+     * @param { Object } source 源对象
+     * @return { Object } source的一个副本
+     */
+
+    /**
+     * 深度克隆对象,将source的属性克隆到target对象, 会覆盖target重名的属性。
+     * @method clone
+     * @param { Object } source 源对象
+     * @param { Object } target 目标对象
+     * @return { Object } 附加了source对象所有属性的target对象
+     */
+    clone:function (source, target) {
+        var tmp;
+        target = target || {};
+        for (var i in source) {
+            if (source.hasOwnProperty(i)) {
+                tmp = source[i];
+                if (typeof tmp == 'object') {
+                    target[i] = utils.isArray(tmp) ? [] : {};
+                    utils.clone(source[i], target[i])
+                } else {
+                    target[i] = tmp;
+                }
+            }
+        }
+        return target;
+    },
+
+    /**
+     * 把cm/pt为单位的值转换为px为单位的值
+     * @method transUnitToPx
+     * @param { String } 待转换的带单位的字符串
+     * @return { String } 转换为px为计量单位的值的字符串
+     * @example
+     * ```javascript
+     *
+     * //output: 500px
+     * console.log( UE.utils.transUnitToPx( '20cm' ) );
+     *
+     * //output: 27px
+     * console.log( UE.utils.transUnitToPx( '20pt' ) );
+     *
+     * ```
+     */
+    transUnitToPx:function (val) {
+        if (!/(pt|cm)/.test(val)) {
+            return val
+        }
+        var unit;
+        val.replace(/([\d.]+)(\w+)/, function (str, v, u) {
+            val = v;
+            unit = u;
+        });
+        switch (unit) {
+            case 'cm':
+                val = parseFloat(val) * 25;
+                break;
+            case 'pt':
+                val = Math.round(parseFloat(val) * 96 / 72);
+        }
+        return val + (val ? 'px' : '');
+    },
+
+    /**
+     * 在dom树ready之后执行给定的回调函数
+     * @method domReady
+     * @remind 如果在执行该方法的时候, dom树已经ready, 那么回调函数将立刻执行
+     * @param { Function } fn dom树ready之后的回调函数
+     * @example
+     * ```javascript
+     *
+     * UE.utils.domReady( function () {
+     *
+     *     console.log('123');
+     *
+     * } );
+     *
+     * ```
+     */
+    domReady:function () {
+
+        var fnArr = [];
+
+        function doReady(doc) {
+            //确保onready只执行一次
+            doc.isReady = true;
+            for (var ci; ci = fnArr.pop(); ci()) {
+            }
+        }
+
+        return function (onready, win) {
+            win = win || window;
+            var doc = win.document;
+            onready && fnArr.push(onready);
+            if (doc.readyState === "complete") {
+                doReady(doc);
+            } else {
+                doc.isReady && doReady(doc);
+                if (browser.ie && browser.version != 11) {
+                    (function () {
+                        if (doc.isReady) return;
+                        try {
+                            doc.documentElement.doScroll("left");
+                        } catch (error) {
+                            setTimeout(arguments.callee, 0);
+                            return;
+                        }
+                        doReady(doc);
+                    })();
+                    win.attachEvent('onload', function () {
+                        doReady(doc)
+                    });
+                } else {
+                    doc.addEventListener("DOMContentLoaded", function () {
+                        doc.removeEventListener("DOMContentLoaded", arguments.callee, false);
+                        doReady(doc);
+                    }, false);
+                    win.addEventListener('load', function () {
+                        doReady(doc)
+                    }, false);
+                }
+            }
+
+        }
+    }(),
+
+    /**
+     * 动态添加css样式
+     * @method cssRule
+     * @param { String } 节点名称
+     * @grammar UE.utils.cssRule('添加的样式的节点名称',['样式','放到哪个document上'])
+     * @grammar UE.utils.cssRule('body','body{background:#ccc}') => null  //给body添加背景颜色
+     * @grammar UE.utils.cssRule('body') =>样式的字符串  //取得key值为body的样式的内容,如果没有找到key值先关的样式将返回空,例如刚才那个背景颜色,将返回 body{background:#ccc}
+     * @grammar UE.utils.cssRule('body',document) => 返回指定key的样式,并且指定是哪个document
+     * @grammar UE.utils.cssRule('body','') =>null //清空给定的key值的背景颜色
+     */
+    cssRule:browser.ie && browser.version != 11 ? function (key, style, doc) {
+        var indexList, index;
+        if(style === undefined || style && style.nodeType && style.nodeType == 9){
+            //获取样式
+            doc = style && style.nodeType && style.nodeType == 9 ? style : (doc || document);
+            indexList = doc.indexList || (doc.indexList = {});
+            index = indexList[key];
+            if(index !==  undefined){
+                return doc.styleSheets[index].cssText
+            }
+            return undefined;
+        }
+        doc = doc || document;
+        indexList = doc.indexList || (doc.indexList = {});
+        index = indexList[key];
+        //清除样式
+        if(style === ''){
+            if(index!== undefined){
+                doc.styleSheets[index].cssText = '';
+                delete indexList[key];
+                return true
+            }
+            return false;
+        }
+
+        //添加样式
+        if(index!== undefined){
+            sheetStyle =  doc.styleSheets[index];
+        }else{
+            sheetStyle = doc.createStyleSheet('', index = doc.styleSheets.length);
+            indexList[key] = index;
+        }
+        sheetStyle.cssText = style;
+    }: function (key, style, doc) {
+        var head, node;
+        if(style === undefined || style && style.nodeType && style.nodeType == 9){
+            //获取样式
+            doc = style && style.nodeType && style.nodeType == 9 ? style : (doc || document);
+            node = doc.getElementById(key);
+            return node ? node.innerHTML : undefined;
+        }
+        doc = doc || document;
+        node = doc.getElementById(key);
+
+        //清除样式
+        if(style === ''){
+            if(node){
+                node.parentNode.removeChild(node);
+                return true
+            }
+            return false;
+        }
+
+        //添加样式
+        if(node){
+            node.innerHTML = style;
+        }else{
+            node = doc.createElement('style');
+            node.id = key;
+            node.innerHTML = style;
+            doc.getElementsByTagName('head')[0].appendChild(node);
+        }
+    },
+    sort:function(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;
+    },
+    serializeParam:function (json) {
+        var strArr = [];
+        for (var i in json) {
+            //忽略默认的几个参数
+            if(i=="method" || i=="timeout" || i=="async") 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("&");
+    },
+    formatUrl:function (url) {
+        var u = url.replace(/&&/g, '&');
+        u = u.replace(/\?&/g, '?');
+        u = u.replace(/&$/g, '');
+        u = u.replace(/&#/g, '#');
+        u = u.replace(/&+/g, '&');
+        return u;
+    },
+    isCrossDomainUrl:function (url) {
+        var a = document.createElement('a');
+        a.href = url;
+        if (browser.ie) {
+            a.href = a.href;
+        }
+        return !(a.protocol == location.protocol && a.hostname == location.hostname &&
+        (a.port == location.port || (a.port == '80' && location.port == '') || (a.port == '' && location.port == '80')));
+    },
+    clearEmptyAttrs : function(obj){
+        for(var p in obj){
+            if(obj[p] === ''){
+                delete obj[p]
+            }
+        }
+        return obj;
+    },
+    str2json : function(s){
+
+        if (!utils.isString(s)) return null;
+        if (window.JSON) {
+            return JSON.parse(s);
+        } else {
+            return (new Function("return " + utils.trim(s || '')))();
+        }
+
+    },
+    json2str : (function(){
+
+        if (window.JSON) {
+
+            return JSON.stringify;
+
+        } else {
+
+            var escapeMap = {
+                "\b": '\\b',
+                "\t": '\\t',
+                "\n": '\\n',
+                "\f": '\\f',
+                "\r": '\\r',
+                '"' : '\\"',
+                "\\": '\\\\'
+            };
+
+            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 + '"';
+            }
+
+            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(utils.json2str(item));
+                            preComma = 1;
+                    }
+                }
+                result.push("]");
+                return result.join("");
+            }
+
+            function pad(source) {
+                return source < 10 ? '0' + source : source;
+            }
+
+            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 (utils.isArray(value)) {
+                            return encodeArray(value);
+                        } else if (utils.isDate(value)) {
+                            return encodeDate(value);
+                        } else {
+                            var result = ['{'],
+                                encode = utils.json2str,
+                                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('');
+                        }
+                }
+            };
+        }
+
+    })()
+
+};
+/**
+ * 判断给定的对象是否是字符串
+ * @method isString
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是字符串
+ */
+
+/**
+ * 判断给定的对象是否是数组
+ * @method isArray
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是数组
+ */
+
+/**
+ * 判断给定的对象是否是一个Function
+ * @method isFunction
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是Function
+ */
+
+/**
+ * 判断给定的对象是否是Number
+ * @method isNumber
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是Number
+ */
+
+/**
+ * 判断给定的对象是否是一个正则表达式
+ * @method isRegExp
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是正则表达式
+ */
+
+/**
+ * 判断给定的对象是否是一个普通对象
+ * @method isObject
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是普通对象
+ */
+utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object', 'Date'], function (v) {
+    UE.utils['is' + v] = function (obj) {
+        return Object.prototype.toString.apply(obj) == '[object ' + v + ']';
+    }
+});
+
+// core/EventBase.js
+/**
+ * UE采用的事件基类
+ * @file
+ * @module UE
+ * @class EventBase
+ * @since 1.2.6.1
+ */
+
+/**
+ * UEditor公用空间,UEditor所有的功能都挂载在该空间下
+ * @unfile
+ * @module UE
+ */
+
+/**
+ * UE采用的事件基类,继承此类的对应类将获取addListener,removeListener,fireEvent方法。
+ * 在UE中,Editor以及所有ui实例都继承了该类,故可以在对应的ui对象以及editor对象上使用上述方法。
+ * @unfile
+ * @module UE
+ * @class EventBase
+ */
+
+/**
+ * 通过此构造器,子类可以继承EventBase获取事件监听的方法
+ * @constructor
+ * @example
+ * ```javascript
+ * UE.EventBase.call(editor);
+ * ```
+ */
+var EventBase = UE.EventBase = function () {};
+
+EventBase.prototype = {
+
+    /**
+     * 注册事件监听器
+     * @method addListener
+     * @param { String } types 监听的事件名称,同时监听多个事件使用空格分隔
+     * @param { Function } fn 监听的事件被触发时,会执行该回调函数
+     * @waining 事件被触发时,监听的函数假如返回的值恒等于true,回调函数的队列中后面的函数将不执行
+     * @example
+     * ```javascript
+     * editor.addListener('selectionchange',function(){
+     *      console.log("选区已经变化!");
+     * })
+     * editor.addListener('beforegetcontent aftergetcontent',function(type){
+     *         if(type == 'beforegetcontent'){
+     *             //do something
+     *         }else{
+     *             //do something
+     *         }
+     *         console.log(this.getContent) // this是注册的事件的编辑器实例
+     * })
+     * ```
+     * @see UE.EventBase:fireEvent(String)
+     */
+    addListener:function (types, listener) {
+        types = utils.trim(types).split(/\s+/);
+        for (var i = 0, ti; ti = types[i++];) {
+            getListener(this, ti, true).push(listener);
+        }
+    },
+
+    on : function(types, listener){
+      return this.addListener(types,listener);
+    },
+    off : function(types, listener){
+        return this.removeListener(types, listener)
+    },
+    trigger:function(){
+        return this.fireEvent.apply(this,arguments);
+    },
+    /**
+     * 移除事件监听器
+     * @method removeListener
+     * @param { String } types 移除的事件名称,同时移除多个事件使用空格分隔
+     * @param { Function } fn 移除监听事件的函数引用
+     * @example
+     * ```javascript
+     * //changeCallback为方法体
+     * editor.removeListener("selectionchange",changeCallback);
+     * ```
+     */
+    removeListener:function (types, listener) {
+        types = utils.trim(types).split(/\s+/);
+        for (var i = 0, ti; ti = types[i++];) {
+            utils.removeItem(getListener(this, ti) || [], listener);
+        }
+    },
+
+    /**
+     * 触发事件
+     * @method fireEvent
+     * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔
+     * @remind 该方法会触发addListener
+     * @return { * } 返回触发事件的队列中,最后执行的回调函数的返回值
+     * @example
+     * ```javascript
+     * editor.fireEvent("selectionchange");
+     * ```
+     */
+
+    /**
+     * 触发事件
+     * @method fireEvent
+     * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔
+     * @param { *... } options 可选参数,可以传入一个或多个参数,会传给事件触发的回调函数
+     * @return { * } 返回触发事件的队列中,最后执行的回调函数的返回值
+     * @example
+     * ```javascript
+     *
+     * editor.addListener( "selectionchange", function ( type, arg1, arg2 ) {
+     *
+     *     console.log( arg1 + " " + arg2 );
+     *
+     * } );
+     *
+     * //触发selectionchange事件, 会执行上面的事件监听器
+     * //output: Hello World
+     * editor.fireEvent("selectionchange", "Hello", "World");
+     * ```
+     */
+    fireEvent:function () {
+        var types = arguments[0];
+        types = utils.trim(types).split(' ');
+        for (var i = 0, ti; ti = types[i++];) {
+            var listeners = getListener(this, ti),
+                r, t, k;
+            if (listeners) {
+                k = listeners.length;
+                while (k--) {
+                    if(!listeners[k])continue;
+                    t = listeners[k].apply(this, arguments);
+                    if(t === true){
+                        return t;
+                    }
+                    if (t !== undefined) {
+                        r = t;
+                    }
+                }
+            }
+            if (t = this['on' + ti.toLowerCase()]) {
+                r = t.apply(this, arguments);
+            }
+        }
+        return r;
+    }
+};
+/**
+ * 获得对象所拥有监听类型的所有监听器
+ * @unfile
+ * @module UE
+ * @since 1.2.6.1
+ * @method getListener
+ * @public
+ * @param { Object } obj  查询监听器的对象
+ * @param { String } type 事件类型
+ * @param { Boolean } force  为true且当前所有type类型的侦听器不存在时,创建一个空监听器数组
+ * @return { Array } 监听器数组
+ */
+function getListener(obj, type, force) {
+    var allListeners;
+    type = type.toLowerCase();
+    return ( ( allListeners = ( obj.__allListeners || force && ( obj.__allListeners = {} ) ) )
+        && ( allListeners[type] || force && ( allListeners[type] = [] ) ) );
+}
+
+
+
+// core/dtd.js
+///import editor.js
+///import core/dom/dom.js
+///import core/utils.js
+/**
+ * dtd html语义化的体现类
+ * @constructor
+ * @namespace dtd
+ */
+var dtd = dom.dtd = (function() {
+    function _( s ) {
+        for (var k in s) {
+            s[k.toUpperCase()] = s[k];
+        }
+        return s;
+    }
+    var X = utils.extend2;
+    var A = _({isindex:1,fieldset:1}),
+        B = _({input:1,button:1,select:1,textarea:1,label:1}),
+        C = X( _({a:1}), B ),
+        D = X( {iframe:1}, C ),
+        E = _({hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1}),
+        F = _({ins:1,del:1,script:1,style:1}),
+        G = X( _({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1}), F ),
+        H = X( _({sub:1,img:1,embed:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1}), G ),
+        I = X( _({p:1}), H ),
+        J = X( _({iframe:1}), H, B ),
+        K = _({img:1,embed:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1}),
+
+        L = X( _({a:0}), J ),//a不能被切开,所以把他
+        M = _({tr:1}),
+        N = _({'#':1}),
+        O = X( _({param:1}), K ),
+        P = X( _({form:1}), A, D, E, I ),
+        Q = _({li:1,ol:1,ul:1}),
+        R = _({style:1,script:1}),
+        S = _({base:1,link:1,meta:1,title:1}),
+        T = X( S, R ),
+        U = _({head:1,body:1}),
+        V = _({html:1});
+
+    var block = _({address:1,blockquote:1,center:1,dir:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,menu:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1}),
+
+        empty =  _({area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1});
+
+    return  _({
+
+        // $ 表示自定的属性
+
+        // body外的元素列表.
+        $nonBodyContent: X( V, U, S ),
+
+        //块结构元素列表
+        $block : block,
+
+        //内联元素列表
+        $inline : L,
+
+        $inlineWithA : X(_({a:1}),L),
+
+        $body : X( _({script:1,style:1}), block ),
+
+        $cdata : _({script:1,style:1}),
+
+        //自闭和元素
+        $empty : empty,
+
+        //不是自闭合,但不能让range选中里边
+        $nonChild : _({iframe:1,textarea:1}),
+        //列表元素列表
+        $listItem : _({dd:1,dt:1,li:1}),
+
+        //列表根元素列表
+        $list: _({ul:1,ol:1,dl:1}),
+
+        //不能认为是空的元素
+        $isNotEmpty : _({table:1,ul:1,ol:1,dl:1,iframe:1,area:1,base:1,col:1,hr:1,img:1,embed:1,input:1,link:1,meta:1,param:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1}),
+
+        //如果没有子节点就可以删除的元素列表,像span,a
+        $removeEmpty : _({a:1,abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1}),
+
+        $removeEmptyBlock : _({'p':1,'div':1}),
+
+        //在table元素里的元素列表
+        $tableContent : _({caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1,table:1}),
+        //不转换的标签
+        $notTransContent : _({pre:1,script:1,style:1,textarea:1}),
+        html: U,
+        head: T,
+        style: N,
+        script: N,
+        body: P,
+        base: {},
+        link: {},
+        meta: {},
+        title: N,
+        col : {},
+        tr : _({td:1,th:1}),
+        img : {},
+        embed: {},
+        colgroup : _({thead:1,col:1,tbody:1,tr:1,tfoot:1}),
+        noscript : P,
+        td : P,
+        br : {},
+        th : P,
+        center : P,
+        kbd : L,
+        button : X( I, E ),
+        basefont : {},
+        h5 : L,
+        h4 : L,
+        samp : L,
+        h6 : L,
+        ol : Q,
+        h1 : L,
+        h3 : L,
+        option : N,
+        h2 : L,
+        form : X( A, D, E, I ),
+        select : _({optgroup:1,option:1}),
+        font : L,
+        ins : L,
+        menu : Q,
+        abbr : L,
+        label : L,
+        table : _({thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1}),
+        code : L,
+        tfoot : M,
+        cite : L,
+        li : P,
+        input : {},
+        iframe : P,
+        strong : L,
+        textarea : N,
+        noframes : P,
+        big : L,
+        small : L,
+        //trace:
+        span :_({'#':1,br:1,b:1,strong:1,u:1,i:1,em:1,sub:1,sup:1,strike:1,span:1}),
+        hr : L,
+        dt : L,
+        sub : L,
+        optgroup : _({option:1}),
+        param : {},
+        bdo : L,
+        'var' : L,
+        div : P,
+        object : O,
+        sup : L,
+        dd : P,
+        strike : L,
+        area : {},
+        dir : Q,
+        map : X( _({area:1,form:1,p:1}), A, F, E ),
+        applet : O,
+        dl : _({dt:1,dd:1}),
+        del : L,
+        isindex : {},
+        fieldset : X( _({legend:1}), K ),
+        thead : M,
+        ul : Q,
+        acronym : L,
+        b : L,
+        a : X( _({a:1}), J ),
+        blockquote :X(_({td:1,tr:1,tbody:1,li:1}),P),
+        caption : L,
+        i : L,
+        u : L,
+        tbody : M,
+        s : L,
+        address : X( D, I ),
+        tt : L,
+        legend : L,
+        q : L,
+        pre : X( G, C ),
+        p : X(_({'a':1}),L),
+        em :L,
+        dfn : L
+    });
+})();
+
+
+// core/domUtils.js
+/**
+ * Dom操作工具包
+ * @file
+ * @module UE.dom.domUtils
+ * @since 1.2.6.1
+ */
+
+/**
+ * Dom操作工具包
+ * @unfile
+ * @module UE.dom.domUtils
+ */
+function getDomNode(node, start, ltr, startFromChild, fn, guard) {
+    var tmpNode = startFromChild && node[start],
+        parent;
+    !tmpNode && (tmpNode = node[ltr]);
+    while (!tmpNode && (parent = (parent || node).parentNode)) {
+        if (parent.tagName == 'BODY' || guard && !guard(parent)) {
+            return null;
+        }
+        tmpNode = parent[ltr];
+    }
+    if (tmpNode && fn && !fn(tmpNode)) {
+        return  getDomNode(tmpNode, start, ltr, false, fn);
+    }
+    return tmpNode;
+}
+var attrFix = ie && browser.version < 9 ? {
+        tabindex:"tabIndex",
+        readonly:"readOnly",
+        "for":"htmlFor",
+        "class":"className",
+        maxlength:"maxLength",
+        cellspacing:"cellSpacing",
+        cellpadding:"cellPadding",
+        rowspan:"rowSpan",
+        colspan:"colSpan",
+        usemap:"useMap",
+        frameborder:"frameBorder"
+    } : {
+        tabindex:"tabIndex",
+        readonly:"readOnly"
+    },
+    styleBlock = utils.listToMap([
+        '-webkit-box', '-moz-box', 'block' ,
+        'list-item' , 'table' , 'table-row-group' ,
+        'table-header-group', 'table-footer-group' ,
+        'table-row' , 'table-column-group' , 'table-column' ,
+        'table-cell' , 'table-caption'
+    ]);
+var domUtils = dom.domUtils = {
+    //节点常量
+    NODE_ELEMENT:1,
+    NODE_DOCUMENT:9,
+    NODE_TEXT:3,
+    NODE_COMMENT:8,
+    NODE_DOCUMENT_FRAGMENT:11,
+
+    //位置关系
+    POSITION_IDENTICAL:0,
+    POSITION_DISCONNECTED:1,
+    POSITION_FOLLOWING:2,
+    POSITION_PRECEDING:4,
+    POSITION_IS_CONTAINED:8,
+    POSITION_CONTAINS:16,
+    //ie6使用其他的会有一段空白出现
+    fillChar:ie && browser.version == '6' ? '\ufeff' : '\u200B',
+    //-------------------------Node部分--------------------------------
+    keys:{
+        /*Backspace*/ 8:1, /*Delete*/ 46:1,
+        /*Shift*/ 16:1, /*Ctrl*/ 17:1, /*Alt*/ 18:1,
+        37:1, 38:1, 39:1, 40:1,
+        13:1 /*enter*/
+    },
+    /**
+     * 获取节点A相对于节点B的位置关系
+     * @method getPosition
+     * @param { Node } nodeA 需要查询位置关系的节点A
+     * @param { Node } nodeB 需要查询位置关系的节点B
+     * @return { Number } 节点A与节点B的关系
+     * @example
+     * ```javascript
+     * //output: 20
+     * var position = UE.dom.domUtils.getPosition( document.documentElement, document.body );
+     *
+     * switch ( position ) {
+     *
+     *      //0
+     *      case UE.dom.domUtils.POSITION_IDENTICAL:
+     *          console.log('元素相同');
+     *          break;
+     *      //1
+     *      case UE.dom.domUtils.POSITION_DISCONNECTED:
+     *          console.log('两个节点在不同的文档中');
+     *          break;
+     *      //2
+     *      case UE.dom.domUtils.POSITION_FOLLOWING:
+     *          console.log('节点A在节点B之后');
+     *          break;
+     *      //4
+     *      case UE.dom.domUtils.POSITION_PRECEDING;
+     *          console.log('节点A在节点B之前');
+     *          break;
+     *      //8
+     *      case UE.dom.domUtils.POSITION_IS_CONTAINED:
+     *          console.log('节点A被节点B包含');
+     *          break;
+     *      case 10:
+     *          console.log('节点A被节点B包含且节点A在节点B之后');
+     *          break;
+     *      //16
+     *      case UE.dom.domUtils.POSITION_CONTAINS:
+     *          console.log('节点A包含节点B');
+     *          break;
+     *      case 20:
+     *          console.log('节点A包含节点B且节点A在节点B之前');
+     *          break;
+     *
+     * }
+     * ```
+     */
+    getPosition:function (nodeA, nodeB) {
+        // 如果两个节点是同一个节点
+        if (nodeA === nodeB) {
+            // domUtils.POSITION_IDENTICAL
+            return 0;
+        }
+        var node,
+            parentsA = [nodeA],
+            parentsB = [nodeB];
+        node = nodeA;
+        while (node = node.parentNode) {
+            // 如果nodeB是nodeA的祖先节点
+            if (node === nodeB) {
+                // domUtils.POSITION_IS_CONTAINED + domUtils.POSITION_FOLLOWING
+                return 10;
+            }
+            parentsA.push(node);
+        }
+        node = nodeB;
+        while (node = node.parentNode) {
+            // 如果nodeA是nodeB的祖先节点
+            if (node === nodeA) {
+                // domUtils.POSITION_CONTAINS + domUtils.POSITION_PRECEDING
+                return 20;
+            }
+            parentsB.push(node);
+        }
+        parentsA.reverse();
+        parentsB.reverse();
+        if (parentsA[0] !== parentsB[0]) {
+            // domUtils.POSITION_DISCONNECTED
+            return 1;
+        }
+        var i = -1;
+        while (i++, parentsA[i] === parentsB[i]) {
+        }
+        nodeA = parentsA[i];
+        nodeB = parentsB[i];
+        while (nodeA = nodeA.nextSibling) {
+            if (nodeA === nodeB) {
+                // domUtils.POSITION_PRECEDING
+                return 4
+            }
+        }
+        // domUtils.POSITION_FOLLOWING
+        return  2;
+    },
+
+    /**
+     * 检测节点node在父节点中的索引位置
+     * @method getNodeIndex
+     * @param { Node } node 需要检测的节点对象
+     * @return { Number } 该节点在父节点中的位置
+     * @see UE.dom.domUtils.getNodeIndex(Node,Boolean)
+     */
+
+    /**
+     * 检测节点node在父节点中的索引位置, 根据给定的mergeTextNode参数决定是否要合并多个连续的文本节点为一个节点
+     * @method getNodeIndex
+     * @param { Node } node 需要检测的节点对象
+     * @param { Boolean } mergeTextNode 是否合并多个连续的文本节点为一个节点
+     * @return { Number } 该节点在父节点中的位置
+     * @example
+     * ```javascript
+     *
+     *      var node = document.createElement("div");
+     *
+     *      node.appendChild( document.createTextNode( "hello" ) );
+     *      node.appendChild( document.createTextNode( "world" ) );
+     *      node.appendChild( node = document.createElement( "div" ) );
+     *
+     *      //output: 2
+     *      console.log( UE.dom.domUtils.getNodeIndex( node ) );
+     *
+     *      //output: 1
+     *      console.log( UE.dom.domUtils.getNodeIndex( node, true ) );
+     *
+     * ```
+     */
+    getNodeIndex:function (node, ignoreTextNode) {
+        var preNode = node,
+            i = 0;
+        while (preNode = preNode.previousSibling) {
+            if (ignoreTextNode && preNode.nodeType == 3) {
+                if(preNode.nodeType != preNode.nextSibling.nodeType ){
+                    i++;
+                }
+                continue;
+            }
+            i++;
+        }
+        return i;
+    },
+
+    /**
+     * 检测节点node是否在给定的document对象上
+     * @method inDoc
+     * @param { Node } node 需要检测的节点对象
+     * @param { DomDocument } doc 需要检测的document对象
+     * @return { Boolean } 该节点node是否在给定的document的dom树上
+     * @example
+     * ```javascript
+     *
+     * var node = document.createElement("div");
+     *
+     * //output: false
+     * console.log( UE.do.domUtils.inDoc( node, document ) );
+     *
+     * document.body.appendChild( node );
+     *
+     * //output: true
+     * console.log( UE.do.domUtils.inDoc( node, document ) );
+     *
+     * ```
+     */
+    inDoc:function (node, doc) {
+        return domUtils.getPosition(node, doc) == 10;
+    },
+    /**
+     * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点,
+     * 查找的起点是给定node节点的父节点。
+     * @method findParent
+     * @param { Node } node 需要查找的节点
+     * @param { Function } filterFn 自定义的过滤方法。
+     * @warning 查找的终点是到body节点为止
+     * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数, 该对象代表当前执行检测的祖先节点。 如果该
+     *          节点满足过滤条件, 则要求返回true, 这时将直接返回该节点作为findParent()的结果, 否则, 请返回false。
+     * @return { Node | Null } 如果找到符合过滤条件的节点, 就返回该节点, 否则返回NULL
+     * @example
+     * ```javascript
+     * var filterNode = UE.dom.domUtils.findParent( document.body.firstChild, function ( node ) {
+     *
+     *     //由于查找的终点是body节点, 所以永远也不会匹配当前过滤器的条件, 即这里永远会返回false
+     *     return node.tagName === "HTML";
+     *
+     * } );
+     *
+     * //output: true
+     * console.log( filterNode === null );
+     * ```
+     */
+
+    /**
+     * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点,
+     * 如果includeSelf的值为true,则查找的起点是给定的节点node, 否则, 起点是node的父节点
+     * @method findParent
+     * @param { Node } node 需要查找的节点
+     * @param { Function } filterFn 自定义的过滤方法。
+     * @param { Boolean } includeSelf 查找过程是否包含自身
+     * @warning 查找的终点是到body节点为止
+     * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数, 该对象代表当前执行检测的祖先节点。 如果该
+     *          节点满足过滤条件, 则要求返回true, 这时将直接返回该节点作为findParent()的结果, 否则, 请返回false。
+     * @remind 如果includeSelf为true, 则过滤器第一次执行时的参数会是节点本身。
+     *          反之, 过滤器第一次执行时的参数将是该节点的父节点。
+     * @return { Node | Null } 如果找到符合过滤条件的节点, 就返回该节点, 否则返回NULL
+     * @example
+     * ```html
+     * <body>
+     *
+     *      <div id="test">
+     *      </div>
+     *
+     *      <script type="text/javascript">
+     *
+     *          //output: DIV, BODY
+     *          var filterNode = UE.dom.domUtils.findParent( document.getElementById( "test" ), function ( node ) {
+     *
+     *              console.log( node.tagName );
+     *              return false;
+     *
+     *          }, true );
+     *
+     *      </script>
+     * </body>
+     * ```
+     */
+    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
+     * <div id="test">
+     *     <div id="child">你好</div>
+     * </div>
+     * <script>
+     *     UE.dom.domUtils.remove( document.body, false );
+     *     //output: false
+     *     console.log( document.getElementById( "child" ) !== null );
+     * </script>
+     * ```
+     */
+
+    /**
+     * 删除节点node,并根据keepChildren的值决定是否保留子节点
+     * @method remove
+     * @param { Node } node 需要删除的节点对象
+     * @param { Boolean } keepChildren 是否需要保留子节点
+     * @return { Node } 返回刚删除的节点对象
+     * @example
+     * ```html
+     * <div id="test">
+     *     <div id="child">你好</div>
+     * </div>
+     * <script>
+     *     UE.dom.domUtils.remove( document.body, true );
+     *     //output: true
+     *     console.log( document.getElementById( "child" ) !== null );
+     * </script>
+     * ```
+     */
+    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
+     *     <body>
+     *      <div id="test">
+     *          <span></span>
+     *      </div>
+     *      <i>xxx</i>
+     * </body>
+     * <script>
+     *
+     *     //output: i节点
+     *     console.log( UE.dom.domUtils.getNextDomNode( document.getElementById( "test" ) ) );
+     *
+     * </script>
+     * ```
+     * @example
+     * ```html
+     * <body>
+     *      <div>
+     *          <span></span>
+     *          <i id="test">xxx</i>
+     *      </div>
+     *      <b>xxx</b>
+     * </body>
+     * <script>
+     *
+     *     //由于id为test的i节点之后没有兄弟节点, 则查找其父节点(div)后面的兄弟节点
+     *     //output: b节点
+     *     console.log( UE.dom.domUtils.getNextDomNode( document.getElementById( "test" ) ) );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点,
+     * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false,
+     * 则执行<a href="#UE.dom.domUtils.getNextDomNode(Node)">getNextDomNode(Node node)</a>的查找过程。
+     * @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
+     * <span id="_baidu_bookmark_1"></span>
+     * <script>
+     *      var bookmarkNode = document.getElementById("_baidu_bookmark_1");
+     *      //output: true
+     *      console.log( UE.dom.domUtils.isBookmarkNode( bookmarkNode ) );
+     * </script>
+     * ```
+     */
+    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
+     * <body>
+     *     <div></div>
+     *     <span id="test"></span>
+     *     <i></i>
+     *     <b></b>
+     *     <em>xxx</em>
+     *     <span></span>
+     * </body>
+     * <script>
+     *
+     *      UE.dom.domUtils.clearEmptySibling( document.getElementById( "test" ) );
+     *
+     *      //output: <div></div><span id="test"></span><em>xxx</em><span></span>
+     *      console.log( document.body.innerHTML );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 清除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
+     * <div id="test">abcdef</div>
+     * <script>
+     *      var newNode = UE.dom.domUtils.split( document.getElementById( "test" ).firstChild, 3 );
+     *      //output: def
+     *      console.log( newNode.nodeValue );
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test">
+     *
+     * </div>
+     * <script>
+     *      //output: true
+     *      console.log( UE.dom.domUtils.isWhitespace( document.getElementById("test").firstChild ) );
+     * </script>
+     * ```
+     */
+    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
+     * <span style="font-size:12px">ssss</span>
+     * <span style="font-size:12px">bbbbb</span>
+     * <span style="font-size:13px">ssss</span>
+     * <span style="font-size:14px">bbbbb</span>
+     *
+     * <script>
+     *
+     *     var nodes = document.getElementsByTagName( "span" );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isSameElement( nodes[0], nodes[1] ) );
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.isSameElement( nodes[2], nodes[3] ) );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <span style="font-size:12px">ssss</span>
+     * <span style="font-size:12px">bbbbb</span>
+     * <span style="font-size:13px">ssss</span>
+     * <span style="font-size:14px">bbbbb</span>
+     *
+     * <script>
+     *
+     *     var nodes = document.getElementsByTagName( "span" );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isSameStyle( nodes[0], nodes[1] ) );
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.isSameStyle( nodes[2], nodes[3] ) );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <span id="test1" style="display: block"></span>
+     * <span id="test2"></span>
+     * <div id="test3" style="display: inline"></div>
+     *
+     * <script>
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isBlockElm( document.getElementById("test1") ) );
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.isBlockElm( document.getElementById("test2") ) );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isBlockElm( document.getElementById("test3") ) );
+     *
+     * </script>
+     * ```
+     */
+    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: <p><span></span></p>
+     *      console.log( wrapNode.innerHTML );
+     *
+     *
+     *      UE.dom.domUtils.breakParent( node, parent );
+     *      //拆分后
+     *      //output: <p></p><span></span><p></p>
+     *      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
+     * <b><i></i></b> => 1
+     * <b><i></i><u></u></b> => 1
+     * <b></b> => 1
+     * <b>xx<i></i></b> => 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
+     * <p><span style="font-size:12px;">xx<span style="font-size:12px;">aa</span>xx</span></p>
+     * ==> UE.dom.domUtils.mergeChild(node,'span')
+     * <p><span style="font-size:12px;">xxaaxx</span></p>
+     */
+    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
+     * <div id="parent">
+     *     <div id="sub">
+     *         <span id="child"></span>
+     *     </div>
+     * </div>
+     *
+     * <script>
+     *
+     *     var child = document.getElementById( "child" );
+     *
+     *     //output: sub
+     *     console.log( child.parentNode.id );
+     *
+     *     UE.dom.domUtils.mergeToParent( child );
+     *
+     *     //output: parent
+     *     console.log( child.parentNode.id );
+     *
+     * </script>
+     * ```
+     */
+    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需要特殊处理  不处理这样的情况 <span stlye="color:#fff">xxx<span style="color:#ccc">xxx</span>xxx</span>
+                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
+     * <b>xxxx</b><b id="test">ooo</b><b>xxxx</b>
+     *
+     * <script>
+     *     var demoNode = document.getElementById("test");
+     *     UE.dom.domUtils.mergeSibling( demoNode );
+     *     //output: xxxxoooxxxx
+     *     console.log( demoNode.innerHTML );
+     * </script>
+     * ```
+     */
+
+    /**
+     * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。
+     * @method mergeSibling
+     * @param { Element } node 需要合并的目标节点
+     * @param { Boolean } ignorePre 是否忽略合并左节点
+     * @example
+     * ```html
+     * <b>xxxx</b><b id="test">ooo</b><b>xxxx</b>
+     *
+     * <script>
+     *     var demoNode = document.getElementById("test");
+     *     UE.dom.domUtils.mergeSibling( demoNode, true );
+     *     //output: oooxxxx
+     *     console.log( demoNode.innerHTML );
+     * </script>
+     * ```
+     */
+
+    /**
+     * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。
+     * @method mergeSibling
+     * @param { Element } node 需要合并的目标节点
+     * @param { Boolean } ignorePre 是否忽略合并左节点
+     * @param { Boolean } ignoreNext 是否忽略合并右节点
+     * @remind 如果同时忽略左右节点, 则该操作什么也不会做
+     * @example
+     * ```html
+     * <b>xxxx</b><b id="test">ooo</b><b>xxxx</b>
+     *
+     * <script>
+     *     var demoNode = document.getElementById("test");
+     *     UE.dom.domUtils.mergeSibling( demoNode, false, true );
+     *     //output: xxxxooo
+     *     console.log( demoNode.innerHTML );
+     * </script>
+     * ```
+     */
+    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
+     * <div id="wrap">
+     *      <span style="font-size:14px;" id="test" name="followMe">xxxxx</span>
+     * </div>
+     *
+     * <script>
+     *
+     *     UE.dom.domUtils.removeAttributes( document.getElementById( "test" ), "id name" );
+     *
+     *     //output: <span style="font-size:14px;">xxxxx</span>
+     *     console.log( document.getElementById("wrap").innerHTML );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 删除节点node上的指定属性名称的属性
+     * @method  removeAttributes
+     * @param { Node } node 需要删除属性的节点对象
+     * @param { Array } attrNames 需要删除的属性名数组
+     * @example
+     * ```html
+     * <div id="wrap">
+     *      <span style="font-size:14px;" id="test" name="followMe">xxxxx</span>
+     * </div>
+     *
+     * <script>
+     *
+     *     UE.dom.domUtils.removeAttributes( document.getElementById( "test" ), ["id", "name"] );
+     *
+     *     //output: <span style="font-size:14px;">xxxxx</span>
+     *     console.log( document.getElementById("wrap").innerHTML );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <span id="test"></span>
+     *
+     * <script>
+     *
+     *     var testNode = UE.dom.domUtils.setAttributes( document.getElementById( "test" ), {
+     *         id: 'demo'
+     *     } );
+     *
+     *     //output: demo
+     *     console.log( testNode.id );
+     *
+     * </script>
+     *
+     */
+    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
+     * <style type="text/css">
+     *      #test {
+     *          font-size: 15px;
+     *      }
+     * </style>
+     *
+     * <span id="test"></span>
+     *
+     * <script>
+     *     //output: 15px
+     *     console.log( UE.dom.domUtils.getComputedStyle( document.getElementById( "test" ), 'font-size' ) );
+     * </script>
+     * ```
+     */
+    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
+     * <span id="test" class="test1 test2 test3">xxx</span>
+     *
+     * <script>
+     *
+     *     var testNode = document.getElementById( "test" );
+     *     UE.dom.domUtils.removeClasses( testNode, "test1 test2" );
+     *
+     *     //output: test3
+     *     console.log( testNode.className );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 删除元素element指定的className
+     * @method removeClasses
+     * @param { Element } ele 需要删除class的元素节点
+     * @param { Array } classNames 需要删除的className数组
+     * @example
+     * ```html
+     * <span id="test" class="test1 test2 test3">xxx</span>
+     *
+     * <script>
+     *
+     *     var testNode = document.getElementById( "test" );
+     *     UE.dom.domUtils.removeClasses( testNode, ["test1", "test2"] );
+     *
+     *     //output: test3
+     *     console.log( testNode.className );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <span id="test" class="cls1 cls2"></span>
+     *
+     * <script>
+     *     var testNode = document.getElementById("test");
+     *
+     *     UE.dom.domUtils.addClass( testNode, "cls2 cls3 cls4" );
+     *
+     *     //output: cl1 cls2 cls3 cls4
+     *     console.log( testNode.className );
+     *
+     * <script>
+     * ```
+     */
+
+    /**
+     * 给元素element添加className
+     * @method addClass
+     * @param { Node } ele 需要增加className的元素
+     * @param { Array } classNames 需要添加的className的数组
+     * @remind 相同的类名不会被重复添加
+     * @example
+     * ```html
+     * <span id="test" class="cls1 cls2"></span>
+     *
+     * <script>
+     *     var testNode = document.getElementById("test");
+     *
+     *     UE.dom.domUtils.addClass( testNode, ["cls2", "cls3", "cls4"] );
+     *
+     *     //output: cl1 cls2 cls3 cls4
+     *     console.log( testNode.className );
+     *
+     * <script>
+     * ```
+     */
+    addClass:function (elm, classNames) {
+        if(!elm)return;
+        classNames = utils.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);
+    },
+    /**
+     * 判断元素element是否包含给定的样式类名className
+     * @method hasClass
+     * @param { Node } ele 需要检测的元素
+     * @param { String } classNames 需要检测的className, 多个className之间用空格分割
+     * @return { Boolean } 元素是否包含所有给定的className
+     * @example
+     * ```html
+     * <span id="test1" class="cls1 cls2"></span>
+     *
+     * <script>
+     *     var test1 = document.getElementById("test1");
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.hasClass( test1, "cls2 cls1 cls3" ) );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.hasClass( test1, "cls2 cls1" ) );
+     * </script>
+     * ```
+     */
+
+    /**
+     * 判断元素element是否包含给定的样式类名className
+     * @method hasClass
+     * @param { Node } ele 需要检测的元素
+     * @param { Array } classNames 需要检测的className数组
+     * @return { Boolean } 元素是否包含所有给定的className
+     * @example
+     * ```html
+     * <span id="test1" class="cls1 cls2"></span>
+     *
+     * <script>
+     *     var test1 = document.getElementById("test1");
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.hasClass( test1, [ "cls2", "cls1", "cls3" ] ) );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.hasClass( test1, [ "cls2", "cls1" ]) );
+     * </script>
+     * ```
+     */
+    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
+     * <span id="test" style="color: red; background: blue;"></span>
+     *
+     * <script>
+     *
+     *     var testNode = document.getElementById("test");
+     *
+     *     UE.dom.domUtils.removeStyle( testNode, 'color' );
+     *
+     *     //output: background: blue;
+     *     console.log( testNode.style.cssText );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test" style="color: red;"></div>
+     *
+     * <script>
+     *
+     *      var testNode = document.getElementById( "test" );
+     *
+     *      //output: red
+     *      console.log( UE.dom.domUtils.getStyle( testNode, "color" ) );
+     *
+     *      //output: ""
+     *      console.log( UE.dom.domUtils.getStyle( testNode, "background" ) );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"></div>
+     *
+     * <script>
+     *
+     *      var testNode = document.getElementById( "test" );
+     *
+     *      //output: ""
+     *      console.log( testNode.style.color );
+     *
+     *      UE.dom.domUtils.setStyle( testNode, 'color', 'red' );
+     *      //output: "red"
+     *      console.log( testNode.style.color );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"></div>
+     *
+     * <script>
+     *
+     *      var testNode = document.getElementById( "test" );
+     *
+     *      //output: ""
+     *      console.log( testNode.style.color );
+     *
+     *      UE.dom.domUtils.setStyles( testNode, {
+     *          'color': 'red'
+     *      } );
+     *      //output: "red"
+     *      console.log( testNode.style.color );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test">
+     *      <span></span>
+     * </div>
+     *
+     * <script>
+     *
+     *     //output: 3
+     *     console.log( UE.dom.domUtils.getChildCount( document.getElementById("test") ) );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 根据给定的过滤规则, 获取符合条件的子节点的数量
+     * @method getChildCount
+     * @param { Element } node 需要检测的元素
+     * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false
+     * @return { Number } 符合过滤条件的node元素的子节点数量
+     * @example
+     * ```html
+     * <div id="test">
+     *      <span></span>
+     * </div>
+     *
+     * <script>
+     *
+     *     //output: 1
+     *     console.log( UE.dom.domUtils.getChildCount( document.getElementById("test"), function ( node ) {
+     *
+     *         return node.nodeType === 1;
+     *
+     *     } ) );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"></div>
+     *
+     * <script>
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isEmptyBlock( document.getElementById("test") ) );
+     * </script>
+     * ```
+     */
+
+    /**
+     * 根据指定的判断规则判断给定的元素是否是一个空元素
+     * @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
+     * <div id="test" style="top: 100px; left: 50px; position: absolute;"></div>
+     *
+     * <script>
+     *
+     *     var testNode = document.getElementById("test");
+     *
+     *     UE.dom.domUtils.setViewportOffset( testNode, {
+     *         left: 200,
+     *         top: 50
+     *     } );
+     *
+     *     //output: top: 300px; left: 100px; position: absolute;
+     *     console.log( testNode.style.cssText );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"></div>
+     *
+     * <script>
+     *     var testNode = document.getElementById("test");
+     *
+     *     //output: 0
+     *     console.log( testNode.childNodes.length );
+     *
+     *     UE.dom.domUtils.fillNode( document, testNode );
+     *
+     *     //output: 1
+     *     console.log( testNode.childNodes.length );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test1">
+     *      <span></span>
+     * </div>
+     * <div id="test2">
+     *     <div></div>
+     * </div>
+     *
+     * <script>
+     *
+     *     var test1 = document.getElementById("test1"),
+     *         test2 = document.getElementById("test2");
+     *
+     *     UE.dom.domUtils.moveChild( test1, test2 );
+     *
+     *     //output: ""(空字符串)
+     *     console.log( test1.innerHTML );
+     *
+     *     //output: "<div></div><span></span>"
+     *     console.log( test2.innerHTML );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部”
+     * @method moveChild
+     * @param { Node } src 源节点, 该节点下的所有子节点将被移除
+     * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下
+     * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾
+     * @example
+     * ```html
+     * <div id="test1">
+     *      <span></span>
+     * </div>
+     * <div id="test2">
+     *     <div></div>
+     * </div>
+     *
+     * <script>
+     *
+     *     var test1 = document.getElementById("test1"),
+     *         test2 = document.getElementById("test2");
+     *
+     *     UE.dom.domUtils.moveChild( test1, test2, true );
+     *
+     *     //output: ""(空字符串)
+     *     console.log( test1.innerHTML );
+     *
+     *     //output: "<span></span><div></div>"
+     *     console.log( test2.innerHTML );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"><span>xxxx</span></div>
+     *
+     * <script>
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.hasNoAttributes( document.getElementById("test") ) );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.hasNoAttributes( document.getElementById("test").firstChild ) );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"></div>
+     *
+     * <script>
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isTagNode( document.getElementById("test"), "div" ) );
+     *
+     * </script>
+     * ```
+     */
+    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 ? '&nbsp;' : '<br/>'
+};
+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
+         * <body>
+         *      <!-- 中括号表示选区 -->
+         *      <b>x<i>x[x</i>xx]x</b>
+         *
+         *      <script>
+         *          //range是已选中的选区
+         *          var fragment = range.cloneContents(),
+         *              node = document.createElement("div");
+         *
+         *          node.appendChild( fragment );
+         *
+         *          //output: <i>x</i>xx
+         *          console.log( node.innerHTML );
+         *
+         *      </script>
+         * </body>
+         * ```
+         */
+        cloneContents:function () {
+            return this.collapsed ? null : execContentsAction(this, 0);
+        },
+
+        /**
+         * 删除当前选区范围中的所有内容
+         * @method deleteContents
+         * @remind 执行完该操作后, 当前Range对象变成了闭合状态
+         * @return { UE.dom.Range } 当前操作的Range对象
+         * @example
+         * ```html
+         * <body>
+         *      <!-- 中括号表示选区 -->
+         *      <b>x<i>x[x</i>xx]x</b>
+         *
+         *      <script>
+         *          //range是已选中的选区
+         *          range.deleteContents();
+         *
+         *          //竖线表示闭合后的选区位置
+         *          //output: <b>x<i>x</i>|x</b>
+         *          console.log( document.body.innerHTML );
+         *
+         *          //此时, range的各项属性为
+         *          //output: B
+         *          console.log( range.startContainer.tagName );
+         *          //output: 2
+         *          console.log( range.startOffset );
+         *          //output: B
+         *          console.log( range.endContainer.tagName );
+         *          //output: 2
+         *          console.log( range.endOffset );
+         *          //output: true
+         *          console.log( range.collapsed );
+         *
+         *      </script>
+         * </body>
+         * ```
+         */
+        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
+         * <body>
+         *      <!-- 中括号表示选区 -->
+         *      <b>x<i>x[x</i>xx]x</b>
+         *
+         *      <script>
+         *          //range是已选中的选区
+         *          var fragment = range.extractContents(),
+         *              node = document.createElement( "div" );
+         *
+         *          node.appendChild( fragment );
+         *
+         *          //竖线表示闭合后的选区位置
+         *
+         *          //output: <b>x<i>x</i>|x</b>
+         *          console.log( document.body.innerHTML );
+         *          //output: <i>x</i>xx
+         *          console.log( node.innerHTML );
+         *
+         *          //此时, range的各项属性为
+         *          //output: B
+         *          console.log( range.startContainer.tagName );
+         *          //output: 2
+         *          console.log( range.startOffset );
+         *          //output: B
+         *          console.log( range.endContainer.tagName );
+         *          //output: 2
+         *          console.log( range.endOffset );
+         *          //output: true
+         *          console.log( range.collapsed );
+         *
+         *      </script>
+         * </body>
+         */
+        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
+         * <!-- 选区 -->
+         * <b>xxx<i>x<span>xx</span>xx<em>xx</em>xxx</i>[xxx]</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.setStart( document.getElementsByTagName("i")[0], 1 );
+         *
+         *     //此时, 选区变成了
+         *     //<b>xxx<i>x[<span>xx</span>xx<em>xx</em>xxx</i>xxx]</b>
+         *
+         * </script>
+         * ```
+         * @example
+         * ```html
+         * <!-- 选区 -->
+         * <b>xxx<img>[xx]x</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.setStart( document.getElementsByTagName("img")[0], 3 );
+         *
+         *     //此时, 选区变成了
+         *     //<b>xxx[<img>xx]x</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>xx[x</span>xxx]</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.setStartAfter( document.getElementsByTagName("i")[0] );
+         *
+         *     //结果选区
+         *     //<b>xx<i>xxx</i>[<span>xxx</span>xxx]</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>[xx<i>xxx</i><span>xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.setStartAfter( document.getElementsByTagName("span")[0] );
+         *
+         *     //结果选区
+         *     //<b>[xx<i>xxx</i><span>xxx</span>]xxx</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.setStartAtFirst( document.getElementsByTagName("i")[0] );
+         *
+         *     //结果选区
+         *     //<b>xx<i>[xxx</i><span>xx]x</span>xxx</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.selectNode( document.getElementsByTagName("i")[0] );
+         *
+         *     //结果选区
+         *     //<b>xx[<i>xxx</i>]<span>xxx</span>xxx</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.selectNode( document.getElementsByTagName("b")[0] );
+         *
+         *     //结果选区
+         *     //<b>[xx<i>xxx</i><span>xxx</span>xxx]</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.collapse();
+         *
+         *     //结果选区
+         *     //“|”表示选区已闭合
+         *     //<b>xx<i>xxx</i><span>xx|x</span>xxx</b>
+         *
+         * </script>
+         * ```
+         */
+
+        /**
+         * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合,
+         * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。
+         * @method  collapse
+         * @param { Boolean } toStart 是否向选区开始处闭合
+         * @return { UE.dom.Range } 当前range对象,此时range对象处于闭合状态
+         * @see UE.dom.Range:collapse()
+         * @example
+         * ```html
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.collapse( true );
+         *
+         *     //结果选区
+         *     //“|”表示选区已闭合
+         *     //<b>xx<i>xxx</i><span>|xxx</span>xxx</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <span>xx<b>xx[</b>xxxxx]</span> => <span>xx<b>xx</b>[xxxxx]</span>
+         * ```
+         *
+         * @example
+         * ```html
+         * <!-- 选区示例 -->
+         * <b>x[xx</b><i>]xxx</i>
+         *
+         * <script>
+         *
+         *     //执行收缩
+         *     range.shrinkBoundary();
+         *
+         *     //结果选区
+         *     //<b>x[xx]</b><i>xxx</i>
+         * </script>
+         * ```
+         *
+         * @example
+         * ```html
+         * [<b><i>xxxx</i>xxxxxxx</b>] => <b><i>[xxxx</i>xxxxxxx]</b>
+         * ```
+         */
+
+        /**
+         * 调整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
+         * //选区示例
+         * <span>xxx<b>x[x<em>xx]x</em>xxx</b>xx</span>
+         * <script>
+         *
+         *     var node = range.getCommonAncestor();
+         *
+         *     //公共祖先节点是: b节点
+         *     //输出: B
+         *     console.log(node.tagName);
+         *
+         * </script>
+         * ```
+         */
+
+        /**
+         * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到
+         * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf
+         * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点
+         * @method  getCommonAncestor
+         * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点
+         * @return { Node } 当前range对象内所有节点的公共祖先节点
+         * @see UE.dom.Range:getCommonAncestor()
+         * @example
+         * ```html
+         * <body>
+         *
+         *     <!-- 选区示例 -->
+         *     <b>xxx<i>xxxx<span>xx[x</span>xx]x</i>xxxxxxx</b>
+         *
+         *     <script>
+         *
+         *         var node = range.getCommonAncestor( false );
+         *
+         *         //这里的公共祖先节点是B而不是I, 是因为参数限制了获取到的节点不能是容器节点
+         *         //output: B
+         *         console.log( node.tagName );
+         *
+         *     </script>
+         *
+         * </body>
+         * ```
+         */
+
+        /**
+         * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 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
+         * <body>
+         *
+         *     <!-- 选区示例 -->
+         *     <b>xxx<i>xxxx<span>x[x]x</span>xxx</i>xxxxxxx</b>
+         *
+         *     <script>
+         *
+         *         var node = range.getCommonAncestor( true, false );
+         *
+         *         //output: SPAN
+         *         console.log( node.tagName );
+         *
+         *     </script>
+         *
+         * </body>
+         * ```
+         */
+        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
+         *
+         * //选区示例
+         * <b>xxx<i>[xxxxx]</i>xxx</b>
+         *
+         * <script>
+         *     //未调整前, 选区的开始容器和结束都是文本节点
+         *     //执行调整
+         *     range.trimBoundary();
+         *
+         *     //调整之后, 容器节点变成了i节点
+         *     //<b>xxx[<i>xxxxx</i>]xxx</b>
+         * </script>
+         * ```
+         */
+
+        /**
+         * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上,
+         * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整
+         * @method trimBoundary
+         * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整
+         * @return { UE.dom.Range } 当前range对象
+         * @example
+         * ```html
+         *
+         * //选区示例
+         * <b>xxx<i>[xxxxx]</i>xxx</b>
+         *
+         * <script>
+         *     //未调整前, 选区的开始容器和结束都是文本节点
+         *     //执行调整
+         *     range.trimBoundary( true );
+         *
+         *     //调整之后, 开始容器节点变成了i节点
+         *     //但是, 结束容器没有发生变化
+         *     //<b>xxx[<i>xxxxx]</i>xxx</b>
+         * </script>
+         * ```
+         */
+        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
+         * <p>xxxx[xxxx]x</p>  ==>  range.applyInlineStyle("strong")  ==>  <p>xxxx[<strong>xxxx</strong>]x</p>
+         * ```
+         */
+
+        /**
+         * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。
+         * @method applyInlineStyle
+         * @param { String } tagName 需要添加的标签名
+         * @param { Object } attrs 跟随新添加的标签的属性
+         * @return { UE.dom.Range } 当前选区
+         * @example
+         * ```html
+         * <p>xxxx[xxxx]x</p>
+         *
+         * ==>
+         *
+         * <!-- 执行操作 -->
+         * range.applyInlineStyle("strong",{"style":"font-size:12px"})
+         *
+         * ==>
+         *
+         * <p>xxxx[<strong style="font-size:12px">xxxx</strong>]x</p>
+         * ```
+         */
+        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[x<span>xxx<em>yyy</em>zz]z</span>  => range.removeInlineStyle(["em"])  => xx[x<span>xxxyyyzz]z</span>
+         * ```
+         */
+
+        /**
+         * 移除当前选区内指定的一组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) {
+                    //使用<span>|x<span>固定住光标
+                    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);
+//                    }
+//
+                    //处理光标落在文本节点的情况
+                    //处理以下的情况
+                    //<b>|xxxx</b>
+                    //<b>xxxx</b>|xxxx
+                    //xxxx<b>|</b>
+                    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 = '&nbsp;';
+            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
+         * <body>
+         *     <p>
+         *         aaaa
+         *         <em>
+         *             <!-- 选区开始 -->
+         *             bbbb
+         *             <!-- 选区结束 -->
+         *         </em>
+         *     </p>
+         *
+         *     <script>
+         *         //output: {startAddress:[0,1,0,0],endAddress:[0,1,0,4]}
+         *         console.log( range.createAddress() );
+         *     </script>
+         * </body>
+         * ```
+         */
+        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
+         * <body>
+         *     <p>
+         *         aaaa
+         *         <em>
+         *             <!-- 选区开始 -->
+         *             bbbb
+         *             <!-- 选区结束 -->
+         *         </em>
+         *     </p>
+         *
+         *     <script>
+         *         var range = editor.selection.getRange();
+         *         range.moveToAddress({startAddress:[0,1,0,0],endAddress:[0,1,0,4]});
+         *         range.select();
+         *         //output: 'bbbb'
+         *         console.log(editor.selection.getText());
+         *     </script>
+         * </body>
+         * ```
+         */
+        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
+         *
+         * <body>
+         *
+         *     <!-- 选区开始 -->
+         *     <span></span>
+         *     <a></a>
+         *     <!-- 选区结束 -->
+         * </body>
+         *
+         * <script>
+         *
+         *     //output: <span></span><a></a>
+         *     console.log( range.cloneContents() );
+         *
+         *     range.traversal( function ( node ) {
+         *
+         *         if ( node.nodeType === 1 ) {
+         *             node.className = "test";
+         *         }
+         *
+         *     } );
+         *
+         *     //output: <span class="test"></span><a class="test"></a>
+         *     console.log( range.cloneContents() );
+         *
+         * </script>
+         * ```
+         */
+
+        /**
+         * 遍历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
+         *
+         * <body>
+         *
+         *     <!-- 选区开始 -->
+         *     <span></span>
+         *     <a></a>
+         *     <!-- 选区结束 -->
+         * </body>
+         *
+         * <script>
+         *
+         *     //output: <span></span><a></a>
+         *     console.log( range.cloneContents() );
+         *
+         *     range.traversal( function ( node ) {
+         *
+         *         node.className = "test";
+         *
+         *     }, function ( node ) {
+         *          return node.nodeType === 1;
+         *     } );
+         *
+         *     //output: <span class="test"></span><a class="test"></a>
+         *     console.log( range.cloneContents() );
+         *
+         * </script>
+         * ```
+         */
+        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下<b>x</b>[xx] 闭合后 <b>x|</b>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  ? '' : '<!DOCTYPE html>') +
+                    '<html xmlns=\'http://www.w3.org/1999/xhtml\' class=\'view\' ><head>' +
+                    '<style type=\'text/css\'>' +
+                    //设置四周的留边
+                    '.view{padding:0;word-wrap:break-word;cursor:text;height:90%;}\n' +
+                    //设置默认字体和字号
+                    //font-family不能呢随便改,在safari下fillchar会有解析问题
+                    'body{margin:8px;font-family:sans-serif;font-size:16px;}' +
+                    //设置段落间距
+                    'p{margin:5px 0;}</style>' +
+                    ( options.iframeCssUrl ? '<link rel=\'stylesheet\' type=\'text/css\' href=\'' + utils.unhtml(options.iframeCssUrl) + '\'/>' : '' ) +
+                    (options.initialStyle ? '<style>' + options.initialStyle + '</style>' : '') +
+                    '</head><body class=\'view\' ></body>' +
+                    '<script type=\'text/javascript\' ' + (ie ? 'defer=\'defer\'' : '' ) +' id=\'_initialScript\'>' +
+                    'setTimeout(function(){editor = window.parent.UE.instants[\'ueditorInstant' + me.uid + '\'];editor._setup(document);},0);' +
+                    'var _tmpScript = document.getElementById(\'_initialScript\');_tmpScript.parentNode.removeChild(_tmpScript);</script></html>';
+                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 = '<p>' + (browser.ie ? '' : '<br/>') + '</p>';
+            }
+            //如果要求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 } 编辑器的内容字符串, 如果编辑器的内容为空,或者是空的标签内容(如:”&lt;p&gt;&lt;br/&gt;&lt;/p&gt;“), 则返回空字符串
+         * @example
+         * ```javascript
+         * //编辑器html内容:<p>1<strong>2<em>34</em>5</strong>6</p>
+         * var content = editor.getContent(); //返回值:<p>1<strong>2<em>34</em>5</strong>6</p>
+         * ```
+         */
+
+        /**
+         * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则
+         * @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(); //返回格式大致是: <html><head>...</head><body>...</body></html>
+         * ```
+         */
+        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 ? '<link rel="stylesheet" type="text/css" href="' + si.href + '" />' : '<style>' + si.cssText + '</style>');
+                });
+                utils.each(me.document.getElementsByTagName('script'), function (si) {
+                    headHtmlForIE9 += si.outerHTML;
+                });
+
+            }
+            return '<html><head>' + (me.options.charset ? '<meta http-equiv="Content-Type" content="text/html; charset=' + me.options.charset + '"/>' : '')
+                + (headHtmlForIE9 || me.document.getElementsByTagName('head')[0].innerHTML) + headHtml.join('\n') + '</head>'
+                + '<body ' + (ie && browser.version < 9 ? 'class="view"' : '') + '>' + me.getContent(null, null, true) + '</body></html>';
+        },
+
+        /**
+         * 得到编辑器的纯文本内容,但会保留段落格式
+         * @method getPlainTxt
+         * @return { String } 编辑器带段落格式的纯文本内容字符串
+         * @example
+         * ```javascript
+         * //编辑器html内容:<p><strong>1</strong></p><p><strong>2</strong></p>
+         * 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)[^>]*>(<br\/?>|&nbsp;)<\/\1>/gi, '\n')
+                .replace(/<br\/?>/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(/&nbsp;/g, ' ');
+        },
+
+        /**
+         * 获取编辑器中的纯文本内容,没有段落格式
+         * @method getContentTxt
+         * @return { String } 编辑器不带段落格式的纯文本内容字符串
+         * @example
+         * ```javascript
+         * //编辑器html内容:<p><strong>1</strong></p><p><strong>2</strong></p>
+         * 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('<p>test</p>');
+         * ```
+         */
+
+        /**
+         * 设置编辑器的内容,可修改编辑器当前的html内容
+         * @method setContent
+         * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容
+         * @warning 该方法会触发selectionchange事件
+         * @param { String } html 要插入的html内容
+         * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入
+         * @example
+         * ```javascript
+         * //假设设置前的编辑器内容是 <p>old text</p>
+         * editor.setContent('<p>new text</p>', true); //插入的结果是<p>old text</p><p>new text</p>
+         * ```
+         */
+        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 = '<p>' + (browser.ie ? '&nbsp;' : '<br/>') + '</p>' + 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 具体命令的使用请参考<a href="#COMMAND.LIST">命令列表</a>
+         * @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 具体命令的使用请参考<a href="#COMMAND.LIST">命令列表</a>
+         * @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 具体命令的使用请参考<a href="#COMMAND.LIST">命令列表</a>
+         * @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 = '<p>' + (ie ? '' : '<br/>') + '</p>';
+                    me.removeListener('firstBeforeExecCommand focus', clear);
+                    setTimeout(function () {
+                        me.focus();
+                        me._selectionChange();
+                    }, 0)
+                }
+            }
+
+            return function (cont) {
+                var me = this;
+                me.body.innerHTML = '<p id="initContent">' + cont + '</p>';
+
+                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内容<p><strong>132</strong></p>
+         * editor.getContentLength() //返回27
+         * ```
+         */
+        /**
+         * 计算编辑器当前纯文本内容的长度
+         * @method  getContentLength
+         * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算
+         * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1
+         * @example
+         * ```javascript
+         * //编辑器html内容<p><strong>132</strong></p>
+         * 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( /<!--[\s\S]*?-->/ig, "" )
+                //转换图片
+                .replace(/<v:shape [^>]*>[\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 '<img width="'+ transUnit(width) +'" height="'+transUnit(height) +'" src="' + src + '" />';
+                    } 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( /<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>" )
+                //去掉多余的属性
+                .replace( /\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/ig, function(str,name,marks,val){
+                    //保留list的标示
+                    return name == 'class' && val == 'MsoListParagraph' ? str : ''
+                })
+                //清除多余的font/span不能匹配&nbsp;有可能是空格
+                .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(/&#39;/g,'\'')
+                            .replace( /&quot;/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(!/<table/.test(tag))
+                                        n[i] = name.replace( /^mso-|-alt$/g, "" ) + ":" + transUnit( value );
+                                    continue;
+                                case "horiz-align":
+                                    n[i] = "text-align:" + value;
+                                    continue;
+
+                                case "vert-align":
+                                    n[i] = "vertical-align:" + value;
+                                    continue;
+
+                                case "font-color":
+                                case "mso-foreground":
+                                    n[i] = "color:" + value;
+                                    continue;
+
+                                case "mso-background":
+                                case "mso-highlight":
+                                    n[i] = "background:" + value;
+                                    continue;
+
+                                case "mso-default-height":
+                                    n[i] = "min-height:" + transUnit( value );
+                                    continue;
+
+                                case "mso-default-width":
+                                    n[i] = "min-width:" + transUnit( value );
+                                    continue;
+
+                                case "mso-padding-between-alt":
+                                    n[i] = "border-collapse:separate;border-spacing:" + transUnit( value );
+                                    continue;
+
+                                case "text-line-through":
+                                    if ( (value == "single") || (value == "double") ) {
+                                        n[i] = "text-decoration:line-through";
+                                    }
+                                    continue;
+                                case "mso-zero-height":
+                                    if ( value == "yes" ) {
+                                        n[i] = "display:none";
+                                    }
+                                    continue;
+//                                case 'background':
+//                                    break;
+                                case 'margin':
+                                    if ( !/[1-9]/.test( value ) ) {
+                                        continue;
+                                    }
+
+                            }
+
+                            if ( /^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test( name )
+                                ||
+                                /text\-indent|padding|margin/.test(name) && /\-[\d.]+/.test(value)
+                            ) {
+                                continue;
+                            }
+
+                            n[i] = name + ":" + parts[1];
+                        }
+                    }
+                    return tag + (n.length ? ' style="' + n.join( ';').replace(/;{2,}/g,';') + '"' : '');
+                })
+
+
+    }
+
+    return function ( html ) {
+        return (isWordDocument( html ) ? filterPasteWord( html ) : html);
+    };
+}();
+
+// core/node.js
+/**
+ * 编辑器模拟的节点类
+ * @file
+ * @module UE
+ * @class uNode
+ * @since 1.2.6.1
+ */
+
+/**
+ * UEditor公用空间,UEditor所有的功能都挂载在该空间下
+ * @unfile
+ * @module UE
+ */
+
+(function () {
+
+    /**
+     * 编辑器模拟的节点类
+     * @unfile
+     * @module UE
+     * @class uNode
+     */
+
+    /**
+     * 通过一个键值对,创建一个uNode对象
+     * @constructor
+     * @param { Object } attr 传入要创建的uNode的初始属性
+     * @example
+     * ```javascript
+     * var node = new uNode({
+     *     type:'element',
+     *     tagName:'span',
+     *     attrs:{style:'font-size:14px;'}
+     * }
+     * ```
+     */
+    var uNode = UE.uNode = function (obj) {
+        this.type = obj.type;
+        this.data = obj.data;
+        this.tagName = obj.tagName;
+        this.parentNode = obj.parentNode;
+        this.attrs = obj.attrs || {};
+        this.children = obj.children;
+    };
+
+    var notTransAttrs = {
+        'href':1,
+        'src':1,
+        '_src':1,
+        '_href':1,
+        'cdata_data':1
+    };
+
+    var notTransTagName = {
+        style:1,
+        script:1
+    };
+
+    var indentChar = '    ',
+        breakChar = '\n';
+
+    function insertLine(arr, current, begin) {
+        arr.push(breakChar);
+        return current + (begin ? 1 : -1);
+    }
+
+    function insertIndent(arr, current) {
+        //插入缩进
+        for (var i = 0; i < current; i++) {
+            arr.push(indentChar);
+        }
+    }
+
+    //创建uNode的静态方法
+    //支持标签和html
+    uNode.createElement = function (html) {
+        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,' &nbsp;'))
+        }
+
+    }
+
+    function isElement(node, arr, formatter, current) {
+        var attrhtml = '';
+        if (node.attrs) {
+            attrhtml = [];
+            var attrs = node.attrs;
+            for (var a in attrs) {
+                //这里就针对
+                //<p>'<img src='http://nsclick.baidu.com/u.gif?&asdf=\"sdf&asdfasdfs;asdf'></p>
+                //这里边的\"做转换,要不用innerHTML直接被截断了,属性src
+                //有可能做的不够
+                attrhtml.push(a + (attrs[a] !== undefined ? '="' + (notTransAttrs[a] ? utils.html(attrs[a]).replace(/["]/g, function (a) {
+                   return '&quot;'
+                }) : 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('<!--' + node.data + '-->');
+    }
+
+    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('<span>text</span>');
+         * ```
+         */
+        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('<span>text</span>');
+         * ```
+         */
+        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('<p><b>htmlparser</b></p>', true);
+ * ```
+ */
+
+var htmlparser = UE.htmlparser = function (htmlstr,ignoreBlank) {
+    //todo 原来的方式  [^"'<>\/] 有\/就不能配对上 <TD vAlign=top background=../AAA.JPG> 这样的标签了
+    //先去掉了,加上的原因忘了,这里先记录
+    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;
+
+    }
+    //如果结束是文本,就有可能丢掉,所以这里手动判断一下
+    //例如 <li>sdfsdfsdf<li>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 ? '&nbsp;' : '<br/>')
+                        }
+                        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这两个文本
+ * //执行命令,插入<b>CC</b>
+ * //插入后的效果 xxx<b>CC</b>xxx
+ * //<p>xx|xxx</p> 当前选区为闭合状态
+ * //插入<p>CC</p>
+ * //结果 <p>xx</p><p>CC</p><p>xxx</p>
+ * //<p>xxxx</p>|</p>xxx</p> 当前选区在两个p标签之间
+ * //插入 xxxx
+ * //结果 <p>xxxx</p><p>xxxx</p></p>xxx</p>
+ * ```
+ */
+
+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]<br/>
+            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 = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';
+                        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>|<[p> ==> <p></p><div></div><p>|</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 : '<br/>';
+                    }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 = '<style type="text/css">body{';
+                var bgObj = {
+                    "background-color": domUtils.getComputedStyle(body, "background-color") || "#ffffff",
+                    'background-image': url ? 'url(' + url + ')' : '',
+                    'background-repeat': domUtils.getComputedStyle(body, "background-repeat") || "",
+                    'background-position': browser.ie ? (domUtils.getComputedStyle(body, "background-position-x") + " " + domUtils.getComputedStyle(body, "background-position-y")) : domUtils.getComputedStyle(body, "background-position"),
+                    'height': domUtils.getComputedStyle(body, "height")
+                };
+                for (var name in bgObj) {
+                    if (bgObj.hasOwnProperty(name)) {
+                        html += name + ":" + bgObj[name] + "; ";
+                    }
+                }
+                html += '}</style> ';
+                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('<p style="display:none;" data-background="' + utils.trim(styles[1].replace(/"/g, '').replace(/[\s]+/g, ' ')) + '"><br/></p>'));
+            }
+        },
+        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', '<p id="_img_parent_tmp" style="text-align:center">' + pN.innerHTML + '</p>');
+
+                            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;
+        }
+
+        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) {
+                str = '<img src="' + ci.src + '" ' + (ci._src ? ' _src="' + ci._src + '" ' : '') +
+                    (ci.width ? 'width="' + ci.width + '" ' : '') +
+                    (ci.height ? ' height="' + ci.height + '" ' : '') +
+                    (ci['floatStyle'] == 'left' || ci['floatStyle'] == 'right' ? ' style="float:' + ci['floatStyle'] + ';"' : '') +
+                    (ci.title && ci.title != "" ? ' title="' + ci.title + '"' : '') +
+                    (ci.border && ci.border != "0" ? ' border="' + ci.border + '"' : '') +
+                    (ci.alt && ci.alt != "" ? ' alt="' + ci.alt + '"' : '') +
+                    (ci.hspace && ci.hspace != "0" ? ' hspace = "' + ci.hspace + '"' : '') +
+                    (ci.vspace && ci.vspace != "0" ? ' vspace = "' + ci.vspace + '"' : '') + '/>';
+                if (ci['floatStyle'] == 'center') {
+                    str = '<p style="text-align: center">' + str + '</p>';
+                }
+                html.push(str);
+
+            } else {
+                for (var i = 0; ci = opt[i++];) {
+                    str = '<p ' + (ci['floatStyle'] == 'center' ? 'style="text-align: center" ' : '') + '><img src="' + ci.src + '" ' +
+                        (ci.width ? 'width="' + ci.width + '" ' : '') + (ci._src ? ' _src="' + ci._src + '" ' : '') +
+                        (ci.height ? ' height="' + ci.height + '" ' : '') +
+                        ' style="' + (ci['floatStyle'] && ci['floatStyle'] != 'center' ? 'float:' + ci['floatStyle'] + ';' : '') +
+                        (ci.border || '') + '" ' +
+                        (ci.title ? ' title="' + ci.title + '"' : '') + ' /></p>';
+                    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  如果是<p><a>xx</a></p> 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);
+                //清除冗余的代码 <b><bookmark></b>
+                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('<!DOCTYPE html><html><head><meta charset="utf-8"/><script src="'+this.options.UEDITOR_HOME_URL+'ueditor.parse.js"></script><script>' +
+            "setTimeout(function(){uParse('div',{rootPath: '"+ this.options.UEDITOR_HOME_URL +"'})},300)" +
+            '</script></head><body><div>'+this.getContent(null,null,true)+'</div></body></html>');
+        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','<hr>');
+                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 ? '&nbsp;':''):'<br/>';
+                }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 += '<br>'
+                                    }else if(!dtd.$empty[node.tagName]){
+                                        utils.each(node.children,function(cn){
+                                            if(cn.type =='element'){
+                                                if(cn.tagName == 'br'){
+                                                    code += '<br>'
+                                                }else if(!dtd.$empty[node.tagName]){
+                                                    code += cn.innerText();
+                                                }
+                                            }else{
+                                                code += cn.data
+                                            }
+                                        });
+                                        if(!/br>$/.test(code)){
+                                            code += '<br>';
+                                        }
+                                    }
+                                }else{
+                                    code += node.data + '<br>'
+                                }
+                                if(!node.nextSibling() && /<br>$/.test(code)){
+                                    code = code.replace(/<br>$/,'');
+                                }
+
+                            }else{
+                                code += (node.type == 'element' ? (dtd.$empty[node.tagName] ?  '' : node.innerText()) : node.data);
+                                if(!/br\/?\s*>$/.test(code)){
+                                    if(!node.nextSibling())
+                                        return;
+                                    code += '<br>'
+                                }
+                            }
+
+                        }
+
+                    });
+                }
+                me.execCommand('inserthtml','<pre id="coder"class="brush:'+lang+';toolbar:false">'+code+'</pre>',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,'&nbsp;').replace(/\n$/,'');
+               }else{
+                   if(n.tagName == 'br'){
+                       code  += '\n'
+                   }else{
+                       code += (!dtd.$empty[n.tagName] ? '' : n.innerText());
+                   }
+
+               }
+
+            });
+
+            pre.innerText(code.replace(/(&nbsp;|\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(/&nbsp;/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(/&nbsp;/g,' '))));
+
+                                    }
+                                }else{
+                                    frag.appendChild(me.document.createTextNode(utils.html( cn.data.replace(/&nbsp;/g,' '))));
+
+                                }
+                            })
+                            if(frag.lastChild.nodeName != 'BR'){
+                                frag.appendChild(me.document.createElement('br'))
+                            }
+                        }
+                    }else{
+                        frag.appendChild(me.document.createTextNode(utils.html( node.data.replace(/&nbsp;/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 = "<br/>";
+            range.setStart(me.body,0).setCursor();
+        }else{
+            me.body.innerHTML = "<p>"+(ie ? "" : "<br/>")+"</p>";
+            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('<hr class="pagebreak" noshade="noshade" size="5" style="-webkit-user-select: none;">');
+                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会产生多余的</hr>
+    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(/>&nbsp;</g, '><').replace(/\s*</g, '<').replace(/>\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 = '&nbsp;';
+        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 = '<p><br/></p>';
+                        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字符,也会产生&nbsp;这里过滤掉
+            html = div.innerHTML;//.replace(/>(?:(\s|&nbsp;)*?)</g,'><');
+
+            //过滤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(' &nbsp; &nbsp;'),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 ? '&nbsp;' : '<br/>')
+            }
+            //去掉末尾的空白
+            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*(&nbsp;)+\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 = '<p></p>';
+                            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><br/></p>类型的空节点,干掉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(/&nbsp;/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() || '<p>' + (browser.ie ? '' : '<br/>')+'</p>';
+                    };
+                } else {
+                    me.iframe.style.cssText = bakCssText;
+                    var cont = sourceEditor.getContent() || '<p>' + (browser.ie ? '' : '<br/>')+'</p>';
+                    //处理掉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 = '<p>'+(browser.ie?'':'<br/>')+'</p>';
+                        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, '<p>');
+                            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, '<p>');
+
+                        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]<br/>
+            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 = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';
+                        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 || '&nbsp;'; 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 : '<br/>'
+                    });
+                    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('<span class="edui-editor-imagescale-hand' + i + '"></span>');
+                }
+                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){
+        var str;
+        switch (type){
+            case 'image':
+                str = '<img ' + (id ? 'id="' + id+'"' : '') + ' width="'+ width +'" height="' + height + '" _url="'+url+'" class="' + classname.replace(/\bvideo-js\b/, '') + '"'  +
+                    ' src="' + me.options.UEDITOR_HOME_URL+'themes/default/images/spacer.gif" style="background:url('+me.options.UEDITOR_HOME_URL+'themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;'+(align ? 'float:' + align + ';': '')+'" />'
+                break;
+            case 'embed':
+                str = '<embed type="application/x-shockwave-flash" class="' + classname + '" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
+                    ' src="' +  utils.html(url) + '" width="' + width  + '" height="' + height  + '"'  + (align ? ' style="float:' + align + '"': '') +
+                    ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >';
+                break;
+            case 'video':
+                var ext = url.substr(url.lastIndexOf('.') + 1);
+                if(ext == 'ogv') ext = 'ogg';
+                str = '<video' + (id ? ' id="' + id + '"' : '') + ' class="' + classname + ' video-js" ' + (align ? ' style="float:' + align + '"': '') +
+                    ' controls preload="none" width="' + width + '" height="' + height + '" src="' + url + '" data-setup="{}">' +
+                    '<source src="' + url + '" type="video/' + ext + '" /></video>';
+                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 : "<br />");
+        },
+        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('<tr' + (r == 0 ? ' class="firstRow"':'') + '>');
+                    for (var c = 0; c < colsNum; c++) {
+                        html.push('<td width="' + tdWidth + '"  vAlign="' + opt.tdvalign + '" >' + (browser.ie && browser.version < 11 ? domUtils.fillChar : '<br/>') + '</td>')
+                    }
+                    html.push('</tr>')
+                }
+                //禁止指定table-width
+                return '<table><tbody>' + html.join('') + '</tbody></table>'
+            }
+
+            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 ? '&nbsp;' : '<br />';
+                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 : '<br/>'
+                    });
+                    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 : '<br/>';
+                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  ' +
+                        ( isFullCol && isFullRow ? 'width="' + width + '"' : '') +
+                        '>' + table.innerHTML.replace(/>\s*</g, '><').replace(/\bth\b/gi, "td") + '</table>')
+                }
+                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 = '&nbsp;'
+//                        }
+//                    }
+//                });
+//                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 = '&nbsp;'
+//                        }
+//                    }
+//                });
+                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 = '&nbsp;'
+                }
+            });
+        });
+        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 百度应用主页: <a href="http://app.baidu.com/" target="_blank">http://app.baidu.com/</a>
+ * @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 ? '<p>' : '') + '<img title="'+obj.title+'" width="' + obj.width + '" height="' + obj.height + '"' +
+//                        ' src="' + me.options.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif" style="background:url(' + obj.logo+') no-repeat center center; border:1px solid gray;" class="edui-faked-webapp" _url="' + obj.url + '" />' +
+//                        (addParagraph ? '</p>' : '')
+//                :
+//                '<iframe class="edui-faked-webapp" title="'+obj.title+'" width="' + obj.width + '" height="' + obj.height + '"  scrolling="no" frameborder="0" src="' + obj.url + '" logo_url = '+obj.logo+'></iframe>';
+//    }
+//
+//    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 ?
+            '<img title="'+obj.title+'" width="' + obj.width + '" height="' + obj.height + '"' +
+                ' src="' + me.options.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif" _logo_url="'+obj.logo+'" style="background:url(' + obj.logo
+                +') no-repeat center center; border:1px solid gray;" class="edui-faked-webapp" _url="' + obj.url + '" ' +
+                (obj.align && !obj.cssfloat? 'align="' + obj.align + '"' : '') +
+                (obj.cssfloat ? 'style="float:' + obj.cssfloat + '"' : '') +
+                '/>'
+            :
+            '<iframe class="edui-faked-webapp" title="'+obj.title+'" ' +
+                (obj.align && !obj.cssfloat? 'align="' + obj.align + '"' : '') +
+                (obj.cssfloat ? 'style="float:' + obj.cssfloat + '"' : '') +
+                'width="' + obj.width + '" height="' + obj.height + '"  scrolling="no" frameborder="0" src="' + obj.url + '" logo_url = "'+obj.logo+'"></iframe>'
+
+    }
+    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 百度应用主页: <a href="http://app.baidu.com/" target="_blank">http://app.baidu.com/</a>
+             * @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 ?
+                '<img ' +
+                    (align && !cssfloat? 'align="' + align + '"' : '') +
+                    (cssfloat ? 'style="float:' + cssfloat + '"' : '') +
+                    ' width="'+ width +'" height="' + height + '" _url="'+url+'" class="edui-faked-music"' +
+                    ' src="'+me.options.langPath+me.options.lang+'/images/music.png" />'
+            :
+            '<embed type="application/x-shockwave-flash" class="edui-faked-music" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
+                ' src="' + url + '" width="' + width  + '" height="' + height  + '" '+ (align && !cssfloat? 'align="' + align + '"' : '') +
+                (cssfloat ? 'style="float:' + cssfloat + '"' : '') +
+                ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >';
+    }
+    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 = '<img class="loadingclass" id="' + loadingId + '" src="' +
+                me.options.themePath + me.options.theme +
+                '/images/spacer.gif" title="' + (me.getLang('autoupload.loading') || '') + '" >';
+            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 = '<p>' +
+                '<img class="loadingclass" id="' + loadingId + '" src="' +
+                me.options.themePath + me.options.theme +
+                '/images/spacer.gif" title="' + (me.getLang('autoupload.loading') || '') + '" >' +
+                '</p>';
+            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 ) || '<p>'+domUtils.fillHtml+'</p>';
+                        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 = '<form id="edui_form_' + timestrap + '" target="edui_iframe_' + timestrap + '" method="POST" enctype="multipart/form-data" action="' + me.getOpt('serverUrl') + '" ' +
+            'style="' + btnStyle + '">' +
+            '<input id="edui_input_' + timestrap + '" type="file" accept="image/*" name="' + me.options.imageFieldName + '" ' +
+            'style="' + btnStyle + '">' +
+            '</form>' +
+            '<iframe id="edui_iframe_' + timestrap + '" name="edui_iframe_' + timestrap + '" style="display:none;width:0;height:0;border:0;margin:0;padding:0;position:absolute;"></iframe>';
+
+            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', '<img class="loadingclass" id="' + loadingId + '" src="' + me.options.themePath + me.options.theme +'/images/spacer.gif" title="' + (me.getLang('simpleupload.loading') || '') + '" >');
+
+                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 += '<p style="line-height: 16px;">' +
+                            '<img style="vertical-align: middle; margin-right: 2px;" src="'+ icon + '" _src="' + icon + '" />' +
+                            '<a style="font-size:12px; color:#0066cc;" href="' + item.url +'" title="' + title + '">' + title + '</a>' +
+                            '</p>';
+                    }
+                    me.execCommand('insertHtml', html);
+                }
+            }
+        }
+    }
+});
+
+
+
+
+// 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 '<div id="##" class="edui-box %%"></div>';
+        }
+    };
+    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 '<div id="##" class="edui-mask %%" onclick="return $$._onClick(event, this);" onmousedown="return $$._onMouseDown(event, this);"></div>';
+        },
+        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 '<div id="##" class="edui-popup %%" onmousedown="return false;">' +
+                ' <div id="##_body" class="edui-popup-body">' +
+                ' <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe>' +
+                ' <div class="edui-shadow"></div>' +
+                ' <div id="##_content" class="edui-popup-content">' +
+                this.getContentHtmlTpl() +
+                '  </div>' +
+                ' </div>' +
+                '</div>';
+        },
+        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 = '<div id="##" class="edui-colorpicker %%">' +
+            '<div class="edui-colorpicker-topbar edui-clearfix">' +
+            '<div unselectable="on" id="##_preview" class="edui-colorpicker-preview"></div>' +
+            '<div unselectable="on" class="edui-colorpicker-nocolor" onclick="$$._onPickNoColor(event, this);">'+ noColorText +'</div>' +
+            '</div>' +
+            '<table  class="edui-box" style="border-collapse: collapse;" onmouseover="$$._onTableOver(event, this);" onmouseout="$$._onTableOut(event, this);" onclick="return $$._onTableClick(event, this);" cellspacing="0" cellpadding="0">' +
+            '<tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;padding-top: 2px"><td colspan="10">'+editor.getLang("themeColor")+'</td> </tr>'+
+            '<tr class="edui-colorpicker-tablefirstrow" >';
+        for (var i=0; i<COLORS.length; i++) {
+            if (i && i%10 === 0) {
+                html += '</tr>'+(i==60?'<tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;"><td colspan="10">'+editor.getLang("standardColor")+'</td></tr>':'')+'<tr'+(i==60?' class="edui-colorpicker-tablefirstrow"':'')+'>';
+            }
+            html += i<70 ? '<td style="padding: 0 2px;"><a hidefocus title="'+COLORS[i]+'" onclick="return false;" href="javascript:" unselectable="on" class="edui-box edui-colorpicker-colorcell"' +
+                ' data-color="#'+ COLORS[i] +'"'+
+                ' style="background-color:#'+ COLORS[i] +';border:solid #ccc;'+
+                (i<10 || i>=60?'border-width:1px;':
+                    i>=10&&i<20?'border-width:1px 1px 0 1px;':
+
+                        'border-width:0 1px 0 1px;')+
+                '"' +
+                '></a></td>':'';
+        }
+        html += '</tr></table></div>';
+        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 '<div id="##" class="edui-tablepicker %%">' +
+                 '<div class="edui-tablepicker-body">' +
+                  '<div class="edui-infoarea">' +
+                   '<span id="##_label" class="edui-label"></span>' +
+                  '</div>' +
+                  '<div class="edui-pickarea"' +
+                   ' onmousemove="$$._onMouseMove(event, this);"' +
+                   ' onmouseover="$$._onMouseOver(event, this);"' +
+                   ' onmouseout="$$._onMouseOut(event, this);"' +
+                   ' onclick="$$._onClick(event, this);"' +
+                  '>' +
+                    '<div id="##_overlay" class="edui-overlay"></div>' +
+                  '</div>' +
+                 '</div>' +
+                '</div>';
+        },
+        _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 '<div id="##" class="edui-box %%">' +
+                '<div id="##_state" stateful>' +
+                 '<div class="%%-wrap"><div id="##_body" unselectable="on" ' + (this.title ? 'title="' + this.title + '"' : '') +
+                 ' class="%%-body" onmousedown="return $$._onMouseDown(event, this);" onclick="return $$._onClick(event, this);">' +
+                  (this.showIcon ? '<div class="edui-box edui-icon"></div>' : '') +
+                  (this.showText ? '<div class="edui-box edui-label">' + this.label + '</div>' : '') +
+                 '</div>' +
+                '</div>' +
+                '</div></div>';
+        },
+        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('<div id="' +
+                        this.popup.id + '_bordereraser" class="edui-bordereraser edui-background" style="width:' +
+                        (uiUtils.getClientRect(this.getDom()).width + 20) + 'px"></div>')
+                    );
+                popup.getDom().className += ' ' + this.className;
+            }, this));
+            this.popup = popup;
+        },
+        _onPopupShow: function (){
+            this.addState('opened');
+        },
+        _onPopupHide: function (){
+            this.removeState('opened');
+        },
+        getHtmlTpl: function (){
+            return '<div id="##" class="edui-box %%">' +
+                '<div '+ (this.title ? 'title="' + this.title + '"' : '') +' id="##_state" stateful><div class="%%-body">' +
+                '<div id="##_button_body" class="edui-box edui-button-body" onclick="$$._onButtonClick(event, this);">' +
+                '<div class="edui-box edui-icon"></div>' +
+                '</div>' +
+                '<div class="edui-box edui-splitborder"></div>' +
+                '<div class="edui-box edui-arrow" onclick="$$._onArrowClick();"></div>' +
+                '</div></div></div>';
+        },
+        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('<div id="' + this.id + '_colorlump" class="edui-colorlump"></div>')
+            );
+            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 '<div id="##" class="edui-autotypesetpicker %%">' +
+                '<div class="edui-autotypesetpicker-body">' +
+                '<table >' +
+                '<tr><td nowrap><input type="checkbox" name="mergeEmptyline" ' + (opt["mergeEmptyline"] ? "checked" : "" ) + '>' + lang.mergeLine + '</td><td colspan="2"><input type="checkbox" name="removeEmptyline" ' + (opt["removeEmptyline"] ? "checked" : "" ) + '>' + lang.delLine + '</td></tr>' +
+                '<tr><td nowrap><input type="checkbox" name="removeClass" ' + (opt["removeClass"] ? "checked" : "" ) + '>' + lang.removeFormat + '</td><td colspan="2"><input type="checkbox" name="indent" ' + (opt["indent"] ? "checked" : "" ) + '>' + lang.indent + '</td></tr>' +
+                '<tr>' +
+                '<td nowrap><input type="checkbox" name="textAlign" ' + (opt["textAlign"] ? "checked" : "" ) + '>' + lang.alignment + '</td>' +
+                '<td colspan="2" id="' + textAlignInputName + '">' +
+                '<input type="radio" name="'+ textAlignInputName +'" value="left" ' + ((opt["textAlign"] && opt["textAlign"] == "left") ? "checked" : "") + '>' + me.getLang("justifyleft") +
+                '<input type="radio" name="'+ textAlignInputName +'" value="center" ' + ((opt["textAlign"] && opt["textAlign"] == "center") ? "checked" : "") + '>' + me.getLang("justifycenter") +
+                '<input type="radio" name="'+ textAlignInputName +'" value="right" ' + ((opt["textAlign"] && opt["textAlign"] == "right") ? "checked" : "") + '>' + me.getLang("justifyright") +
+                '</td>' +
+                '</tr>' +
+                '<tr>' +
+                '<td nowrap><input type="checkbox" name="imageBlockLine" ' + (opt["imageBlockLine"] ? "checked" : "" ) + '>' + lang.imageFloat + '</td>' +
+                '<td nowrap id="'+ imageBlockInputName +'">' +
+                '<input type="radio" name="'+ imageBlockInputName +'" value="none" ' + ((opt["imageBlockLine"] && opt["imageBlockLine"] == "none") ? "checked" : "") + '>' + me.getLang("default") +
+                '<input type="radio" name="'+ imageBlockInputName +'" value="left" ' + ((opt["imageBlockLine"] && opt["imageBlockLine"] == "left") ? "checked" : "") + '>' + me.getLang("justifyleft") +
+                '<input type="radio" name="'+ imageBlockInputName +'" value="center" ' + ((opt["imageBlockLine"] && opt["imageBlockLine"] == "center") ? "checked" : "") + '>' + me.getLang("justifycenter") +
+                '<input type="radio" name="'+ imageBlockInputName +'" value="right" ' + ((opt["imageBlockLine"] && opt["imageBlockLine"] == "right") ? "checked" : "") + '>' + me.getLang("justifyright") +
+                '</td>' +
+                '</tr>' +
+                '<tr><td nowrap><input type="checkbox" name="clearFontSize" ' + (opt["clearFontSize"] ? "checked" : "" ) + '>' + lang.removeFontsize + '</td><td colspan="2"><input type="checkbox" name="clearFontFamily" ' + (opt["clearFontFamily"] ? "checked" : "" ) + '>' + lang.removeFontFamily + '</td></tr>' +
+                '<tr><td nowrap colspan="3"><input type="checkbox" name="removeEmptyNode" ' + (opt["removeEmptyNode"] ? "checked" : "" ) + '>' + lang.removeHtml + '</td></tr>' +
+                '<tr><td nowrap colspan="3"><input type="checkbox" name="pasteFilter" ' + (opt["pasteFilter"] ? "checked" : "" ) + '>' + lang.pasteFilter + '</td></tr>' +
+                '<tr>' +
+                '<td nowrap><input type="checkbox" name="symbolConver" ' + (opt["bdc2sb"] || opt["tobdc"] ? "checked" : "" ) + '>' + lang.symbol + '</td>' +
+                '<td id="' + symbolConverInputName + '">' +
+                '<input type="radio" name="bdc" value="bdc2sb" ' + (opt["bdc2sb"] ? "checked" : "" ) + '>' + lang.bdc2sb +
+                '<input type="radio" name="bdc" value="tobdc" ' + (opt["tobdc"] ? "checked" : "" ) + '>' + lang.tobdc + '' +
+                '</td>' +
+                '<td nowrap align="right"><button >' + lang.run + '</button></td>' +
+                '</tr>' +
+                '</table>' +
+                '</div>' +
+                '</div>';
+
+
+        },
+        _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('<tr>');
+
+                tmpl.push( '<td index="'+ i +'" ' + tempClassName + ' stateful><div class="edui-icon edui-'+ alignType[ tempIndex ] +'"></div></td>' );
+
+                tempIndex === 2 && tmpl.push('</tr>');
+
+            }
+
+            return '<div id="##" class="edui-cellalignpicker %%">' +
+                '<div class="edui-cellalignpicker-body">' +
+                '<table onclick="$$._onClick(event);">' +
+                tmpl.join('') +
+                '</table>' +
+                '</div>' +
+                '</div>';
+        },
+        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 '<div class="edui-pasteicon" onclick="$$._onClick(this)"></div>' +
+                '<div class="edui-pastecontainer">' +
+                '<div class="edui-title">' + this.editor.getLang("pasteOpt") + '</div>' +
+                '<div class="edui-button">' +
+                '<div title="' + this.editor.getLang("pasteSourceFormat") + '" onclick="$$.format(false)" stateful>' +
+                '<div class="edui-richtxticon"></div></div>' +
+                '<div title="' + this.editor.getLang("tagFormat") + '" onclick="$$.format(2)" stateful>' +
+                '<div class="edui-tagicon"></div></div>' +
+                '<div title="' + this.editor.getLang("pasteTextFormat") + '" onclick="$$.format(true)" stateful>' +
+                '<div class="edui-plaintxticon"></div></div>' +
+                '</div>' +
+                '</div>' +
+                '</div>'
+        },
+        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 '<div id="##" class="edui-toolbar %%" onselectstart="return false;" onmousedown="return $$._onMouseDown(event, this);">' +
+                buff.join('') +
+                '</div>'
+        },
+        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 '<div class="edui-menuitem edui-menuseparator"><div class="edui-menuseparator-inner"></div></div>';
+        },
+        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 ('<div class="%%-body">' + buff.join('') + '</div>');
+        },
+        _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 '<div id="##" class="%%" stateful onclick="$$._onClick(event, this);">' +
+                '<div class="%%-body">' +
+                this.renderLabelHtml() +
+                '</div>' +
+                '</div>';
+        },
+        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 '<div class="edui-arrow"></div>' +
+                '<div class="edui-box edui-icon"></div>' +
+                '<div class="edui-box edui-label %%-label">' + (this.label || '') + '</div>';
+        },
+        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 = '<span id="'+ this.id +'_contmask" class="dialogcontmask"></span><iframe id="'+ this.id +
+                    '_iframe" class="%%-iframe" height="100%" width="100%" frameborder="0" src="'+ this.iframeUrl +'"></iframe>';
+            }
+            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 = '<div class="%%-foot">' +
+                     '<div id="##_buttons" class="%%-buttons">' + buff.join('') + '</div>' +
+                    '</div>';
+            }
+
+            return '<div id="##" class="%%"><div '+ ( !this.fullscreen ? 'class="%%"' : 'class="%%-wrap edui-dialog-fullscreen-flag"' ) +'><div id="##_body" class="%%-body">' +
+                '<div class="%%-shadow"></div>' +
+                '<div id="##_titlebar" class="%%-titlebar">' +
+                '<div class="%%-draghandle" onmousedown="$$._onTitlebarMouseDown(event, this);">' +
+                 '<span class="%%-caption">' + (this.title || '') + '</span>' +
+                '</div>' +
+                this.closeButton.renderHtml() +
+                '</div>' +
+                '<div id="##_content" class="%%-content">'+ ( this.autoReset ? '' : this.getContentHtml()) +'</div>' +
+                footHtml +
+                '</div></div></div>';
+        },
+        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 = '<iframe id="'+me.id+'_iframe" src="'+ me.iframeUrl +'" frameborder="0"></iframe>';
+                        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 '<div id="##" class="%% edui-toolbar" data-src="shortcutmenu" onmousedown="return false;" onselectstart="return false;" >' +
+                buff +
+                '</div>';
+        }
+    };
+
+    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 '<br/>';
+        }
+    };
+    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 '<div id="##" class="edui-message %%">' +
+            ' <div id="##_closer" class="edui-message-closer">×</div>' +
+            ' <div id="##_body" class="edui-message-body edui-message-type-info">' +
+            ' <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe>' +
+            ' <div class="edui-shadow"></div>' +
+            ' <div id="##_content" class="edui-message-content">' +
+            '  </div>' +
+            ' </div>' +
+            '</div>';
+        },
+        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 '<div class="edui-label %%-label" >' + (this.label || '') + '</div>';
+                }
+            });
+        });
+
+        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 '<div class="edui-label %%-label" style="font-family:' +
+                            utils.unhtml(this.value) + '">' + (this.label || '') + '</div>';
+                    }
+                });
+            })(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 '<div class="edui-label %%-label" style="line-height:1;font-size:' +
+                        this.value + '">' + (this.label || '') + '</div>';
+                }
+            });
+        }
+        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 '<div class="edui-label %%-label"><span class="edui-for-' + this.value + '">' + (this.label || '') + '</span></div>';
+                }
+            })
+        }
+        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 '<div class="edui-label %%-label">' + '<' + ck.tag + ' ' + (ck.className ? ' class="' + ck.className + '"' : "")
+                            + (ck.style ? ' style="' + ck.style + '"' : "") + '>' + ck.label + "<\/" + ck.tag + ">"
+                            + '</div>';
+                    }
+                });
+            })(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 = '<div class="edui-editor-breadcrumb">' + editor.getLang("elementPathTip") + ':</div>';
+                }
+                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(
+                            '<nobr>' + editor.getLang("property") + ': <span onclick=$$._setIframeAlign(-2) class="edui-clickable">' + editor.getLang("default") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(-1) class="edui-clickable">' + editor.getLang("justifyleft") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(1) class="edui-clickable">' + editor.getLang("justifyright") + '</span>&nbsp;&nbsp;' +
+                                ' <span onclick="$$._updateIframe( this);" class="edui-clickable">' + editor.getLang("modify") + '</span></nobr>');
+                        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(
+                                '<nobr>' + editor.getLang("property") + ': <span onclick=$$._onImgEditButtonClick("anchorDialog") class="edui-clickable">' + editor.getLang("modify") + '</span>&nbsp;&nbsp;' +
+                                    '<span onclick=$$._onRemoveButtonClick(\'anchor\') class="edui-clickable">' + editor.getLang("delete") + '</span></nobr>');
+                        }
+                        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 = '<nobr>' + editor.getLang("property") + ': '+
+                            '<span onclick=$$._onImgSetFloat("none") class="edui-clickable">' + editor.getLang("default") + '</span>&nbsp;&nbsp;' +
+                            '<span onclick=$$._onImgSetFloat("left") class="edui-clickable">' + editor.getLang("justifyleft") + '</span>&nbsp;&nbsp;' +
+                            '<span onclick=$$._onImgSetFloat("right") class="edui-clickable">' + editor.getLang("justifyright") + '</span>&nbsp;&nbsp;' +
+                            '<span onclick=$$._onImgSetFloat("center") class="edui-clickable">' + editor.getLang("justifycenter") + '</span>&nbsp;&nbsp;'+
+                            '<span onclick="$$._onImgEditButtonClick(\'' + dialogName + '\');" class="edui-clickable">' + editor.getLang("modify") + '</span></nobr>';
+
+                        !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 += '<div style="height:5px;"></div>'
+                            }
+                            html += popup.formatHtml(
+                                '<nobr>' + editor.getLang("anthorMsg") + ': <a target="_blank" href="' + url + '" title="' + url + '" >' + txt + '</a>' +
+                                    ' <span class="edui-clickable" onclick="$$._onEditButtonClick();">' + editor.getLang("modify") + '</span>' +
+                                    ' <span class="edui-clickable" onclick="$$._onRemoveButtonClick(\'unlink\');"> ' + editor.getLang("clear") + '</span></nobr>');
+                            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 '<div id="##" class="%%">' +
+                '<div id="##_toolbarbox" class="%%-toolbarbox">' +
+                (this.toolbars.length ?
+                    '<div id="##_toolbarboxouter" class="%%-toolbarboxouter"><div class="%%-toolbarboxinner">' +
+                        this.renderToolbarBoxHtml() +
+                        '</div></div>' : '') +
+                '<div id="##_toolbarmsg" class="%%-toolbarmsg" style="display:none;">' +
+                '<div id = "##_upload_dialog" class="%%-toolbarmsg-upload" onclick="$$.showWordImageDialog();">' + this.editor.getLang("clickToUpload") + '</div>' +
+                '<div class="%%-toolbarmsg-close" onclick="$$.hideToolbarMsg();">x</div>' +
+                '<div id="##_toolbarmsg_label" class="%%-toolbarmsg-label"></div>' +
+                '<div style="height:0;overflow:hidden;clear:both;"></div>' +
+                '</div>' +
+                '<div id="##_message_holder" class="%%-messageholder"></div>' +
+                '</div>' +
+                '<div id="##_iframeholder" class="%%-iframeholder">' +
+                '</div>' +
+                //modify wdcount by matao
+                '<div id="##_bottombar" class="%%-bottomContainer"><table><tr>' +
+                '<td id="##_elementpath" class="%%-bottombar"></td>' +
+                '<td id="##_wordcount" class="%%-wordcount"></td>' +
+                '<td id="##_scale" class="%%-scale"><div class="%%-icon"></div></td>' +
+                '</tr></table></div>' +
+                '<div id="##_scalelayer"></div>' +
+                '</div>';
+        },
+        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('<span unselectable="on" onclick="$$.editor.execCommand(&quot;elementpath&quot;, &quot;' + i + '&quot;);">' + ci + '</span>');
+                }
+                bottom.innerHTML = '<div class="edui-editor-breadcrumb" onmousedown="return false;">' + this.editor.getLang("elementPathTip") + ': ' + buff.join(' &gt; ') + '</div>';
+
+            } 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})+</g, '<')
+                                    .replace(/>[\n\r\t]+</g, '><');
+                            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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.all.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.all.min.js
new file mode 100644
index 0000000..c89aa8c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.all.min.js
@@ -0,0 +1,709 @@
+(function(){function W(d,c,b){var a;c=c.toLowerCase();return(a=d.__allListeners||b&&(d.__allListeners={}))&&(a[c]||b&&(a[c]=[]))}function X(d,c,b,a,e,h){a=a&&d[c];var g;for(!a&&(a=d[b]);!a&&(g=(g||d).parentNode);){if("BODY"==g.tagName||h&&!h(g))return null;a=g[b]}return a&&e&&!e(a)?X(a,c,b,!1,e):a}UEDITOR_CONFIG=window.UEDITOR_CONFIG||{};var s=window.baidu||{};window.baidu=s;window.UE=s.editor=window.UE||{};UE.plugins={};UE.commands={};UE.instants={};UE.I18N={};UE._customizeUI={};UE.version="1.4.3";
+var L=UE.dom={},r=UE.browser=function(){var d=navigator.userAgent.toLowerCase(),c=window.opera,b={ie:/(msie\s|trident.*rv:)([\w.]+)/.test(d),opera:!!c&&c.version,webkit:-1<d.indexOf(" applewebkit/"),mac:-1<d.indexOf("macintosh"),quirks:"BackCompat"==document.compatMode};b.gecko="Gecko"==navigator.product&&!b.webkit&&!b.opera&&!b.ie;var a=0;if(b.ie){var a=d.match(/(?:msie\s([\w.]+))/),e=d.match(/(?:trident.*rv:([\w.]+))/),a=a&&e&&a[1]&&e[1]?Math.max(1*a[1],1*e[1]):a&&a[1]?1*a[1]:e&&e[1]?1*e[1]:0;b.ie11Compat=
+11==document.documentMode;b.ie9Compat=9==document.documentMode;b.ie8=!!document.documentMode;b.ie8Compat=8==document.documentMode;b.ie7Compat=7==a&&!document.documentMode||7==document.documentMode;b.ie6Compat=7>a||b.quirks;b.ie9above=8<a;b.ie9below=9>a;b.ie11above=10<a;b.ie11below=11>a}b.gecko&&(e=d.match(/rv:([\d\.]+)/))&&(e=e[1].split("."),a=1E4*e[0]+100*(e[1]||0)+1*(e[2]||0));/chrome\/(\d+\.\d)/i.test(d)&&(b.chrome=+RegExp.$1);/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(d)&&!/chrome/i.test(d)&&
+(b.safari=+(RegExp.$1||RegExp.$2));b.opera&&(a=parseFloat(c.version()));b.webkit&&(a=parseFloat(d.match(/ applewebkit\/(\d+)/)[1]));b.version=a;b.isCompatible=!b.mobile&&(b.ie&&6<=a||b.gecko&&10801<=a||b.opera&&9.5<=a||b.air&&1<=a||b.webkit&&522<=a||!1);return b}(),I=r.ie,ma=r.opera,p=UE.utils={each:function(d,c,b){if(null!=d)if(d.length===+d.length)for(var a=0,e=d.length;a<e;a++){if(!1===c.call(b,d[a],a,d))return!1}else for(a in d)if(d.hasOwnProperty(a)&&!1===c.call(b,d[a],a,d))return!1},makeInstance:function(d){var c=
+new Function;c.prototype=d;d=new c;c.prototype=null;return d},extend:function(d,c,b){if(c)for(var a in c)b&&d.hasOwnProperty(a)||(d[a]=c[a]);return d},extend2:function(d){for(var c=arguments,b=1;b<c.length;b++){var a=c[b],e;for(e in a)d.hasOwnProperty(e)||(d[e]=a[e])}return d},inherits:function(d,c){var b=d.prototype,a=p.makeInstance(c.prototype);p.extend(a,b,!0);d.prototype=a;return a.constructor=d},bind:function(d,c){return function(){return d.apply(c,arguments)}},defer:function(d,c,b){var a;return function(){b&&
+clearTimeout(a);a=setTimeout(d,c)}},indexOf:function(d,c,b){var a=-1;b=this.isNumber(b)?b:0;this.each(d,function(e,h){if(h>=b&&e===c)return a=h,!1});return a},removeItem:function(d,c){for(var b=0,a=d.length;b<a;b++)d[b]===c&&(d.splice(b,1),b--)},trim:function(d){return d.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g,"")},listToMap:function(d){if(!d)return{};d=p.isArray(d)?d:d.split(",");for(var c=0,b,a={};b=d[c++];)a[b.toUpperCase()]=a[b]=1;return a},unhtml:function(d,c){return d?d.replace(c||/[&<">'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g,
+function(b,a){return a?b:{"<":"&lt;","&":"&amp;",'"':"&quot;",">":"&gt;","'":"&#39;"}[b]}):""},html:function(d){return d?d.replace(/&((g|l|quo)t|amp|#39|nbsp);/g,function(c){return{"&lt;":"<","&amp;":"&","&quot;":'"',"&gt;":">","&#39;":"'","&nbsp;":" "}[c]}):""},cssStyleToDomStyle:function(){var d=document.createElement("div").style,c={"float":void 0!=d.cssFloat?"cssFloat":void 0!=d.styleFloat?"styleFloat":"float"};return function(b){return c[b]||(c[b]=b.toLowerCase().replace(/-./g,function(a){return a.charAt(1).toUpperCase()}))}}(),
+loadFile:function(){function d(b,a){try{for(var e=0,h;h=c[e++];)if(h.doc===b&&h.url==(a.src||a.href))return h}catch(g){return null}}var c=[];return function(b,a,e){var h=d(b,a);if(h)h.ready?e&&e():h.funs.push(e);else if(c.push({doc:b,url:a.src||a.href,funs:[e]}),!b.body){e=[];for(var g in a)"tag"!=g&&e.push(g+'="'+a[g]+'"');b.write("<"+a.tag+" "+e.join(" ")+" ></"+a.tag+">")}else if(!a.id||!b.getElementById(a.id)){var l=b.createElement(a.tag);delete a.tag;for(g in a)l.setAttribute(g,a[g]);l.onload=
+l.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){h=d(b,a);if(0<h.funs.length){h.ready=1;for(var e;e=h.funs.pop();)e()}l.onload=l.onreadystatechange=null}};l.onerror=function(){throw Error("The load "+(a.href||a.src)+" fails,check the url settings of file ueditor.config.js ");};b.getElementsByTagName("head")[0].appendChild(l)}}}(),isEmptyObject:function(d){if(null==d)return!0;if(this.isArray(d)||this.isString(d))return 0===d.length;for(var c in d)if(d.hasOwnProperty(c))return!1;
+return!0},fixColor:function(d,c){if(/color/i.test(d)&&/rgba?/.test(c)){var b=c.split(",");if(3<b.length)return"";c="#";for(var a=0,e;e=b[a++];)e=parseInt(e.replace(/[^\d]/gi,""),10).toString(16),c+=1==e.length?"0"+e:e;c=c.toUpperCase()}return c},optCss:function(d){function c(a,b){if(!a)return"";var g=a.top,c=a.bottom,k=a.left,d=a.right,n="";if(g&&k&&c&&d)n+=";"+b+":"+(g==c&&c==k&&k==d?g:g==c&&k==d?g+" "+k:k==d?g+" "+k+" "+c:g+" "+d+" "+c+" "+k)+";";else for(var f in a)n+=";"+b+"-"+f+":"+a[f]+";";
+return n}var b,a;d=d.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi,function(e,c,g,l){if(1==l.split(" ").length)switch(c){case "padding":return!b&&(b={}),b[g]=l,"";case "margin":return!a&&(a={}),a[g]=l,"";case "border":return"initial"==l?"":e}return e});d+=c(b,"padding")+c(a,"margin");return d.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(d,c){var b;c=c||{};for(var a in d)d.hasOwnProperty(a)&&
+(b=d[a],"object"==typeof b?(c[a]=p.isArray(b)?[]:{},p.clone(d[a],c[a])):c[a]=b);return c},transUnitToPx:function(d){if(!/(pt|cm)/.test(d))return d;var c;d.replace(/([\d.]+)(\w+)/,function(b,a,e){d=a;c=e});switch(c){case "cm":d=25*parseFloat(d);break;case "pt":d=Math.round(96*parseFloat(d)/72)}return d+(d?"px":"")},domReady:function(){function d(b){for(b.isReady=!0;b=c.pop();b());}var c=[];return function(b,a){a=a||window;var e=a.document;b&&c.push(b);"complete"===e.readyState?d(e):(e.isReady&&d(e),
+r.ie&&11!=r.version?(function(){if(!e.isReady){try{e.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,0);return}d(e)}}(),a.attachEvent("onload",function(){d(e)})):(e.addEventListener("DOMContentLoaded",function(){e.removeEventListener("DOMContentLoaded",arguments.callee,!1);d(e)},!1),a.addEventListener("load",function(){d(e)},!1)))}}(),cssRule:r.ie&&11!=r.version?function(d,c,b){var a,e;if(void 0===c||c&&c.nodeType&&9==c.nodeType){if(b=c&&c.nodeType&&9==c.nodeType?c:b||document,
+a=b.indexList||(b.indexList={}),e=a[d],void 0!==e)return b.styleSheets[e].cssText}else{b=b||document;a=b.indexList||(b.indexList={});e=a[d];if(""===c)return void 0!==e?(b.styleSheets[e].cssText="",delete a[d],!0):!1;void 0!==e?sheetStyle=b.styleSheets[e]:(sheetStyle=b.createStyleSheet("",e=b.styleSheets.length),a[d]=e);sheetStyle.cssText=c}}:function(d,c,b){var a;if(void 0===c||c&&c.nodeType&&9==c.nodeType)return b=c&&c.nodeType&&9==c.nodeType?c:b||document,(a=b.getElementById(d))?a.innerHTML:void 0;
+b=b||document;a=b.getElementById(d);if(""===c)return a?(a.parentNode.removeChild(a),!0):!1;a?a.innerHTML=c:(a=b.createElement("style"),a.id=d,a.innerHTML=c,b.getElementsByTagName("head")[0].appendChild(a))},sort:function(d,c){c=c||function(a,e){return a.localeCompare(e)};for(var b=0,a=d.length;b<a;b++)for(var e=b,h=d.length;e<h;e++)if(0<c(d[b],d[e])){var g=d[b];d[b]=d[e];d[e]=g}return d},serializeParam:function(d){var c=[],b;for(b in d)if("method"!=b&&"timeout"!=b&&"async"!=b)if("function"!=(typeof d[b]).toLowerCase()&&
+"object"!=(typeof d[b]).toLowerCase())c.push(encodeURIComponent(b)+"="+encodeURIComponent(d[b]));else if(p.isArray(d[b]))for(var a=0;a<d[b].length;a++)c.push(encodeURIComponent(b)+"[]="+encodeURIComponent(d[b][a]));return c.join("&")},formatUrl:function(d){d=d.replace(/&&/g,"&");d=d.replace(/\?&/g,"?");d=d.replace(/&$/g,"");d=d.replace(/&#/g,"#");return d=d.replace(/&+/g,"&")},isCrossDomainUrl:function(d){var c=document.createElement("a");c.href=d;r.ie&&(c.href=c.href);return!(c.protocol==location.protocol&&
+c.hostname==location.hostname&&(c.port==location.port||"80"==c.port&&""==location.port||""==c.port&&"80"==location.port))},clearEmptyAttrs:function(d){for(var c in d)""===d[c]&&delete d[c];return d},str2json:function(d){return p.isString(d)?window.JSON?JSON.parse(d):(new Function("return "+p.trim(d||"")))():null},json2str:function(){if(window.JSON)return JSON.stringify;var d={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},c=function(a){/["\\\x00-\x1f]/.test(a)&&(a=a.replace(/["\\\x00-\x1f]/g,
+function(a){var b=d[a];if(b)return b;b=a.charCodeAt();return"\\u00"+Math.floor(b/16).toString(16)+(b%16).toString(16)}));return'"'+a+'"'},b=function(a){return 10>a?"0"+a:a};return function(a){switch(typeof a){case "undefined":return"undefined";case "number":return isFinite(a)?String(a):"null";case "string":return c(a);case "boolean":return String(a);default:if(null===a)return"null";if(p.isArray(a)){var e=["["],h=a.length,g,l,k;for(l=0;l<h;l++)switch(k=a[l],typeof k){case "undefined":case "function":case "unknown":break;
+default:g&&e.push(","),e.push(p.json2str(k)),g=1}e.push("]");return e.join("")}if(p.isDate(a))return'"'+a.getFullYear()+"-"+b(a.getMonth()+1)+"-"+b(a.getDate())+"T"+b(a.getHours())+":"+b(a.getMinutes())+":"+b(a.getSeconds())+'"';g=["{"];l=p.json2str;for(h in a)if(Object.prototype.hasOwnProperty.call(a,h))switch(k=a[h],typeof k){case "undefined":case "unknown":case "function":break;default:e&&g.push(","),e=1,g.push(l(h)+":"+l(k))}g.push("}");return g.join("")}}}()};p.each("String Function Array Number RegExp Object Date".split(" "),
+function(d){UE.utils["is"+d]=function(c){return Object.prototype.toString.apply(c)=="[object "+d+"]"}});var Z=UE.EventBase=function(){};Z.prototype={addListener:function(d,c){d=p.trim(d).split(/\s+/);for(var b=0,a;a=d[b++];)W(this,a,!0).push(c)},on:function(d,c){return this.addListener(d,c)},off:function(d,c){return this.removeListener(d,c)},trigger:function(){return this.fireEvent.apply(this,arguments)},removeListener:function(d,c){d=p.trim(d).split(/\s+/);for(var b=0,a;a=d[b++];)p.removeItem(W(this,
+a)||[],c)},fireEvent:function(){for(var d=arguments[0],d=p.trim(d).split(" "),c=0,b;b=d[c++];){var a=W(this,b),e,h,g;if(a)for(g=a.length;g--;)if(a[g]){h=a[g].apply(this,arguments);if(!0===h)return h;void 0!==h&&(e=h)}if(h=this["on"+b.toLowerCase()])e=h.apply(this,arguments)}return e}};var v=L.dtd=function(){function d(a){for(var e in a)a[e.toUpperCase()]=a[e];return a}var c=p.extend2,b=d({isindex:1,fieldset:1}),a=d({input:1,button:1,select:1,textarea:1,label:1}),e=c(d({a:1}),a),h=c({iframe:1},e),
+g=d({hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1}),l=d({ins:1,del:1,script:1,style:1}),k=c(d({b:1,acronym:1,bdo:1,"var":1,"#":1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1}),l),m=c(d({sub:1,img:1,embed:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1}),k),n=c(d({p:1}),m),a=c(d({iframe:1}),m,a),m=d({img:1,embed:1,noscript:1,br:1,kbd:1,center:1,
+button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,"#":1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,"var":1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1}),f=c(d({a:0}),a),t=d({tr:1}),w=d({"#":1}),y=c(d({param:1}),m),u=c(d({form:1}),b,h,g,n),
+C=d({li:1,ol:1,ul:1}),E=d({style:1,script:1}),G=d({base:1,link:1,meta:1,title:1}),E=c(G,E),A=d({head:1,body:1}),N=d({html:1}),r=d({address:1,blockquote:1,center:1,dir:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,menu:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1}),s=d({area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1});return d({$nonBodyContent:c(N,A,G),$block:r,$inline:f,$inlineWithA:c(d({a:1}),
+f),$body:c(d({script:1,style:1}),r),$cdata:d({script:1,style:1}),$empty:s,$nonChild:d({iframe:1,textarea:1}),$listItem:d({dd:1,dt:1,li:1}),$list:d({ul:1,ol:1,dl:1}),$isNotEmpty:d({table:1,ul:1,ol:1,dl:1,iframe:1,area:1,base:1,col:1,hr:1,img:1,embed:1,input:1,link:1,meta:1,param:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1}),$removeEmpty:d({a:1,abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,
+u:1,"var":1}),$removeEmptyBlock:d({p:1,div:1}),$tableContent:d({caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1,table:1}),$notTransContent:d({pre:1,script:1,style:1,textarea:1}),html:A,head:E,style:w,script:w,body:u,base:{},link:{},meta:{},title:w,col:{},tr:d({td:1,th:1}),img:{},embed:{},colgroup:d({thead:1,col:1,tbody:1,tr:1,tfoot:1}),noscript:u,td:u,br:{},th:u,center:u,kbd:f,button:c(n,g),basefont:{},h5:f,h4:f,samp:f,h6:f,ol:C,h1:f,h3:f,option:w,h2:f,form:c(b,h,g,n),select:d({optgroup:1,
+option:1}),font:f,ins:f,menu:C,abbr:f,label:f,table:d({thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1}),code:f,tfoot:t,cite:f,li:u,input:{},iframe:u,strong:f,textarea:w,noframes:u,big:f,small:f,span:d({"#":1,br:1,b:1,strong:1,u:1,i:1,em:1,sub:1,sup:1,strike:1,span:1}),hr:f,dt:f,sub:f,optgroup:d({option:1}),param:{},bdo:f,"var":f,div:u,object:y,sup:f,dd:u,strike:f,area:{},dir:C,map:c(d({area:1,form:1,p:1}),b,l,g),applet:y,dl:d({dt:1,dd:1}),del:f,isindex:{},fieldset:c(d({legend:1}),m),thead:t,
+ul:C,acronym:f,b:f,a:c(d({a:1}),a),blockquote:c(d({td:1,tr:1,tbody:1,li:1}),u),caption:f,i:f,u:f,tbody:t,s:f,address:c(h,n),tt:f,legend:f,q:f,pre:c(k,e),p:c(d({a:1}),f),em:f,dfn:f})}(),ea=I&&9>r.version?{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder"}:{tabindex:"tabIndex",readonly:"readOnly"},oa=p.listToMap("-webkit-box -moz-box block list-item table table-row-group table-header-group table-footer-group table-row table-column-group table-column table-cell table-caption".split(" ")),
+f=L.domUtils={NODE_ELEMENT:1,NODE_DOCUMENT:9,NODE_TEXT:3,NODE_COMMENT:8,NODE_DOCUMENT_FRAGMENT:11,POSITION_IDENTICAL:0,POSITION_DISCONNECTED:1,POSITION_FOLLOWING:2,POSITION_PRECEDING:4,POSITION_IS_CONTAINED:8,POSITION_CONTAINS:16,fillChar:I&&"6"==r.version?"\ufeff":"\u200b",keys:{8:1,46:1,16:1,17:1,18:1,37:1,38:1,39:1,40:1,13:1},getPosition:function(d,c){if(d===c)return 0;var b,a=[d],e=[c];for(b=d;b=b.parentNode;){if(b===c)return 10;a.push(b)}for(b=c;b=b.parentNode;){if(b===d)return 20;e.push(b)}a.reverse();
+e.reverse();if(a[0]!==e[0])return 1;for(b=-1;b++,a[b]===e[b];);d=a[b];for(c=e[b];d=d.nextSibling;)if(d===c)return 4;return 2},getNodeIndex:function(d,c){for(var b=d,a=0;b=b.previousSibling;)c&&3==b.nodeType?b.nodeType!=b.nextSibling.nodeType&&a++:a++;return a},inDoc:function(d,c){return 10==f.getPosition(d,c)},findParent:function(d,c,b){if(d&&!f.isBody(d))for(d=b?d:d.parentNode;d;){if(!c||c(d)||f.isBody(d))return c&&!c(d)&&f.isBody(d)?null:d;d=d.parentNode}return null},findParentByTagName:function(d,
+c,b,a){c=p.listToMap(p.isArray(c)?c:[c]);return f.findParent(d,function(e){return c[e.tagName]&&!(a&&a(e))},b)},findParents:function(d,c,b,a){for(c=c&&(b&&b(d)||!b)?[d]:[];d=f.findParent(d,b);)c.push(d);return a?c:c.reverse()},insertAfter:function(d,c){return d.nextSibling?d.parentNode.insertBefore(c,d.nextSibling):d.parentNode.appendChild(c)},remove:function(d,c){var b=d.parentNode,a;if(b){if(c&&d.hasChildNodes())for(;a=d.firstChild;)b.insertBefore(a,d);b.removeChild(d)}return d},getNextDomNode:function(d,
+c,b,a){return X(d,"firstChild","nextSibling",c,b,a)},getPreDomNode:function(d,c,b,a){return X(d,"lastChild","previousSibling",c,b,a)},isBookmarkNode:function(d){return 1==d.nodeType&&d.id&&/^_baidu_bookmark_/i.test(d.id)},getWindow:function(d){d=d.ownerDocument||d;return d.defaultView||d.parentWindow},getCommonAncestor:function(d,c){if(d===c)return d;for(var b=[d],a=[c],e=d,h=-1;e=e.parentNode;){if(e===c)return e;b.push(e)}for(e=c;e=e.parentNode;){if(e===d)return e;a.push(e)}b.reverse();for(a.reverse();h++,
+b[h]===a[h];);return 0==h?null:b[h-1]},clearEmptySibling:function(d,c,b){function a(a,b){for(var g;a&&!f.isBookmarkNode(a)&&(f.isEmptyInlineElement(a)||!RegExp("[^\t\n\r"+f.fillChar+"]").test(a.nodeValue));)g=a[b],f.remove(a),a=g}!c&&a(d.nextSibling,"nextSibling");!b&&a(d.previousSibling,"previousSibling")},split:function(d,c){var b=d.ownerDocument;if(r.ie&&c==d.nodeValue.length){var a=b.createTextNode("");return f.insertAfter(d,a)}a=d.splitText(c);r.ie8&&(b=b.createTextNode(""),f.insertAfter(a,b),
+f.remove(b));return a},isWhitespace:function(d){return!RegExp("[^ \t\n\r"+f.fillChar+"]").test(d.nodeValue)},getXY:function(d){for(var c=0,b=0;d.offsetParent;)b+=d.offsetTop,c+=d.offsetLeft,d=d.offsetParent;return{x:c,y:b}},on:function(d,c,b){var a=p.isArray(c)?c:p.trim(c).split(/\s+/),e=a.length;if(e)for(;e--;)if(c=a[e],d.addEventListener)d.addEventListener(c,b,!1);else{b._d||(b._d={els:[]});var h=c+b.toString(),g=p.indexOf(b._d.els,d);b._d[h]&&-1!=g||(-1==g&&b._d.els.push(d),b._d[h]||(b._d[h]=function(a){return b.call(a.srcElement,
+a||window.event)}),d.attachEvent("on"+c,b._d[h]))}d=null},un:function(d,c,b){var a=p.isArray(c)?c:p.trim(c).split(/\s+/),e=a.length;if(e)for(;e--;)if(c=a[e],d.removeEventListener)d.removeEventListener(c,b,!1);else{var h=c+b.toString();try{d.detachEvent("on"+c,b._d?b._d[h]:b)}catch(g){}b._d&&b._d[h]&&(c=p.indexOf(b._d.els,d),-1!=c&&b._d.els.splice(c,1),0==b._d.els.length&&delete b._d[h])}},isSameElement:function(d,c){if(d.tagName!=c.tagName)return!1;var b=d.attributes,a=c.attributes;if(!I&&b.length!=
+a.length)return!1;for(var e,h,g=0,l=0,k=0;e=b[k++];){if("style"==e.nodeName)if(e.specified&&g++,f.isSameStyle(d,c))continue;else return!1;if(I)if(e.specified)g++,h=a.getNamedItem(e.nodeName);else continue;else h=c.attributes[e.nodeName];if(!h.specified||e.nodeValue!=h.nodeValue)return!1}if(I){for(k=0;h=a[k++];)h.specified&&l++;if(g!=l)return!1}return!0},isSameStyle:function(d,c){var b=d.style.cssText.replace(/( ?; ?)/g,";").replace(/( ?: ?)/g,":"),a=c.style.cssText.replace(/( ?; ?)/g,";").replace(/( ?: ?)/g,
+":");if(r.opera){b=d.style;a=c.style;if(b.length!=a.length)return!1;for(var e in b)if(!/^(\d+|csstext)$/i.test(e)&&b[e]!=a[e])return!1;return!0}if(!b||!a)return b==a;b=b.split(";");a=a.split(";");if(b.length!=a.length)return!1;e=0;for(var h;h=b[e++];)if(-1==p.indexOf(a,h))return!1;return!0},isBlockElm:function(d){return 1==d.nodeType&&(v.$block[d.tagName]||oa[f.getComputedStyle(d,"display")])&&!v.$nonChild[d.tagName]},isBody:function(d){return d&&1==d.nodeType&&"body"==d.tagName.toLowerCase()},breakParent:function(d,
+c){var b,a=d,e=d,h,g;do{a=a.parentNode;h?(b=a.cloneNode(!1),b.appendChild(h),h=b,b=a.cloneNode(!1),b.appendChild(g),g=b):(h=a.cloneNode(!1),g=h.cloneNode(!1));for(;b=e.previousSibling;)h.insertBefore(b,h.firstChild);for(;b=e.nextSibling;)g.appendChild(b);e=a}while(c!==a);b=c.parentNode;b.insertBefore(h,c);b.insertBefore(g,c);b.insertBefore(d,g);f.remove(c);return d},isEmptyInlineElement:function(d){if(1!=d.nodeType||!v.$removeEmpty[d.tagName])return 0;for(d=d.firstChild;d;){if(f.isBookmarkNode(d)||
+1==d.nodeType&&!f.isEmptyInlineElement(d)||3==d.nodeType&&!f.isWhitespace(d))return 0;d=d.nextSibling}return 1},trimWhiteTextNode:function(d){function c(b){for(var a;(a=d[b])&&3==a.nodeType&&f.isWhitespace(a);)d.removeChild(a)}c("firstChild");c("lastChild")},mergeChild:function(d,c,b){c=f.getElementsByTagName(d,d.tagName.toLowerCase());for(var a=0,e;e=c[a++];)if(e.parentNode&&!f.isBookmarkNode(e))if("span"==e.tagName.toLowerCase()){if(d===e.parentNode&&(f.trimWhiteTextNode(d),1==d.childNodes.length)){d.style.cssText=
+e.style.cssText+";"+d.style.cssText;f.remove(e,!0);continue}e.style.cssText=d.style.cssText+";"+e.style.cssText;if(b){var h=b.style;if(h)for(var h=h.split(";"),g=0,l;l=h[g++];)e.style[p.cssStyleToDomStyle(l.split(":")[0])]=l.split(":")[1]}f.isSameStyle(e,d)&&f.remove(e,!0)}else f.isSameElement(d,e)&&f.remove(e,!0)},getElementsByTagName:function(d,c,b){if(b&&p.isString(b)){var a=b;b=function(e){return f.hasClass(e,a)}}c=p.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var e=[],h=0,g;g=c[h++];){g=d.getElementsByTagName(g);
+for(var l=0,k;k=g[l++];)b&&!b(k)||e.push(k)}return e},mergeToParent:function(d){for(var c=d.parentNode;c&&v.$removeEmpty[c.tagName];){if(c.tagName==d.tagName||"A"==c.tagName){f.trimWhiteTextNode(c);if("SPAN"==c.tagName&&!f.isSameStyle(c,d)||"A"==c.tagName&&"SPAN"==d.tagName)if(1<c.childNodes.length||c!==d.parentNode){d.style.cssText=c.style.cssText+";"+d.style.cssText;c=c.parentNode;continue}else c.style.cssText+=";"+d.style.cssText,"A"==c.tagName&&(c.style.textDecoration="underline");if("A"!=c.tagName){c===
+d.parentNode&&f.remove(d,!0);break}}c=c.parentNode}},mergeSibling:function(d,c,b){function a(a,b,g){var c;if((c=g[a])&&!f.isBookmarkNode(c)&&1==c.nodeType&&f.isSameElement(g,c)){for(;c.firstChild;)"firstChild"==b?g.insertBefore(c.lastChild,g.firstChild):g.appendChild(c.firstChild);f.remove(c)}}!c&&a("previousSibling","firstChild",d);!b&&a("nextSibling","lastChild",d)},unSelectable:I&&r.ie9below||r.opera?function(d){d.onselectstart=function(){return!1};d.onclick=d.onkeyup=d.onkeydown=function(){return!1};
+d.unselectable="on";d.setAttribute("unselectable","on");for(var c=0,b;b=d.all[c++];)switch(b.tagName.toLowerCase()){case "iframe":case "textarea":case "input":case "select":break;default:b.unselectable="on",d.setAttribute("unselectable","on")}}:function(d){d.style.MozUserSelect=d.style.webkitUserSelect=d.style.msUserSelect=d.style.KhtmlUserSelect="none"},removeAttributes:function(d,c){c=p.isArray(c)?c:p.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var b=0,a;a=c[b++];){a=ea[a]||a;switch(a){case "className":d[a]=
+"";break;case "style":d.style.cssText="";var e=d.getAttributeNode("style");!r.ie&&e&&d.removeAttributeNode(e)}d.removeAttribute(a)}},createElement:function(d,c,b){return f.setAttributes(d.createElement(c),b)},setAttributes:function(d,c){for(var b in c)if(c.hasOwnProperty(b)){var a=c[b];switch(b){case "class":d.className=a;break;case "style":d.style.cssText=d.style.cssText+";"+a;break;case "innerHTML":d[b]=a;break;case "value":d.value=a;break;default:d.setAttribute(ea[b]||b,a)}}return d},getComputedStyle:function(d,
+c){if(-1<"width height top left".indexOf(c))return d["offset"+c.replace(/^\w/,function(a){return a.toUpperCase()})]+"px";3==d.nodeType&&(d=d.parentNode);if(r.ie&&9>r.version&&"font-size"==c&&!d.style.fontSize&&!v.$empty[d.tagName]&&!v.$nonChild[d.tagName]){var b=d.ownerDocument.createElement("span");b.style.cssText="padding:0;border:0;font-family:simsun;";b.innerHTML=".";d.appendChild(b);var a=b.offsetHeight;d.removeChild(b);b=null;return a+"px"}try{b=f.getStyle(d,c)||(window.getComputedStyle?f.getWindow(d).getComputedStyle(d,
+"").getPropertyValue(c):(d.currentStyle||d.style)[p.cssStyleToDomStyle(c)])}catch(e){return""}return p.transUnitToPx(p.fixColor(c,b))},removeClasses:function(d,c){c=p.isArray(c)?c:p.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var b=0,a,e=d.className;a=c[b++];)e=e.replace(RegExp("\\b"+a+"\\b"),"");(e=p.trim(e).replace(/[ ]{2,}/g," "))?d.className=e:f.removeAttributes(d,["class"])},addClass:function(d,c){if(d){c=p.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var b=0,a,e=d.className;a=c[b++];)RegExp("\\b"+
+a+"\\b").test(e)||(e+=" "+a);d.className=p.trim(e)}},hasClass:function(d,c){if(p.isRegExp(c))return c.test(d.className);c=p.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var b=0,a,e=d.className;a=c[b++];)if(!RegExp("\\b"+a+"\\b","i").test(e))return!1;return b-1==c.length},preventDefault:function(d){d.preventDefault?d.preventDefault():d.returnValue=!1},removeStyle:function(d,c){r.ie?("color"==c&&(c="(^|;)"+c),d.style.cssText=d.style.cssText.replace(RegExp(c+"[^:]*:[^;]+;?","ig"),"")):d.style.removeProperty?
+d.style.removeProperty(c):d.style.removeAttribute(p.cssStyleToDomStyle(c));d.style.cssText||f.removeAttributes(d,["style"])},getStyle:function(d,c){var b=d.style[p.cssStyleToDomStyle(c)];return p.fixColor(c,b)},setStyle:function(d,c,b){d.style[p.cssStyleToDomStyle(c)]=b;p.trim(d.style.cssText)||this.removeAttributes(d,"style")},setStyles:function(d,c){for(var b in c)c.hasOwnProperty(b)&&f.setStyle(d,b,c[b])},removeDirtyAttr:function(d){for(var c=0,b,a=d.getElementsByTagName("*");b=a[c++];)b.removeAttribute("_moz_dirty");
+d.removeAttribute("_moz_dirty")},getChildCount:function(d,c){var b=0,a=d.firstChild;for(c=c||function(){return 1};a;)c(a)&&b++,a=a.nextSibling;return b},isEmptyNode:function(d){return!d.firstChild||0==f.getChildCount(d,function(c){return!f.isBr(c)&&!f.isBookmarkNode(c)&&!f.isWhitespace(c)})},clearSelectedArr:function(d){for(var c;c=d.pop();)f.removeAttributes(c,["class"])},scrollToView:function(d,c,b){var a=function(){var a=c.document,b="CSS1Compat"==a.compatMode;return{width:(b?a.documentElement.clientWidth:
+a.body.clientWidth)||0,height:(b?a.documentElement.clientHeight:a.body.clientHeight)||0}}().height;b=-1*a+b+(d.offsetHeight||0);d=f.getXY(d);b+=d.y;d=function(a){if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};a=a.document;return{x:a.documentElement.scrollLeft||a.body.scrollLeft||0,y:a.documentElement.scrollTop||a.body.scrollTop||0}}(c).y;(b>d||b<d-a)&&c.scrollTo(0,b+(0>b?-20:20))},isBr:function(d){return 1==d.nodeType&&"BR"==d.tagName},isFillChar:function(d,c){if(3!=d.nodeType)return!1;
+var b=d.nodeValue;return c?RegExp("^"+f.fillChar).test(b):!b.replace(RegExp(f.fillChar,"g"),"").length},isStartInblock:function(d){d=d.cloneRange();var c=0,b=d.startContainer,a;if(1==b.nodeType&&b.childNodes[d.startOffset])for(var b=b.childNodes[d.startOffset],e=b.previousSibling;e&&f.isFillChar(e);)b=e,e=e.previousSibling;this.isFillChar(b,!0)&&1==d.startOffset&&(d.setStartBefore(b),b=d.startContainer);for(;b&&f.isFillChar(b);)a=b,b=b.previousSibling;a&&(d.setStartBefore(a),b=d.startContainer);for(1==
+b.nodeType&&f.isEmptyNode(b)&&1==d.startOffset&&d.setStart(b,0).collapse(!0);!d.startOffset;){b=d.startContainer;if(f.isBlockElm(b)||f.isBody(b)){c=1;break}var e=d.startContainer.previousSibling,h;if(e){for(;e&&f.isFillChar(e);)h=e,e=e.previousSibling;h?d.setStartBefore(h):d.setStartBefore(d.startContainer)}else d.setStartBefore(d.startContainer)}return c&&!f.isBody(d.startContainer)?1:0},isEmptyBlock:function(d,c){if(1!=d.nodeType)return 0;c=c||RegExp("[ \u00a0\t\r\n"+f.fillChar+"]","g");if(0<d[r.ie?
+"innerText":"textContent"].replace(c,"").length)return 0;for(var b in v.$isNotEmpty)if(d.getElementsByTagName(b).length)return 0;return 1},setViewportOffset:function(d,c){var b=parseInt(d.style.left)|0,a=parseInt(d.style.top)|0,e=d.getBoundingClientRect(),h=c.left-e.left,e=c.top-e.top;h&&(d.style.left=b+h+"px");e&&(d.style.top=a+e+"px")},fillNode:function(d,c){var b=r.ie?d.createTextNode(f.fillChar):d.createElement("br");c.innerHTML="";c.appendChild(b)},moveChild:function(d,c,b){for(;d.firstChild;)b&&
+c.firstChild?c.insertBefore(d.lastChild,c.firstChild):c.appendChild(d.firstChild)},hasNoAttributes:function(d){return r.ie?/^<\w+\s*?>/.test(d.outerHTML):0==d.attributes.length},isCustomeNode:function(d){return 1==d.nodeType&&d.getAttribute("_ue_custom_node_")},isTagNode:function(d,c){return 1==d.nodeType&&RegExp("\\b"+d.tagName+"\\b","i").test(c)},filterNodeList:function(d,c,b){var a=[];if(!p.isFunction(c)){var e=c;c=function(a){return-1!=p.indexOf(p.isArray(e)?e:e.split(" "),a.tagName.toLowerCase())}}p.each(d,
+function(e){c(e)&&a.push(e)});return 0==a.length?null:1!=a.length&&b?a:a[0]},isInNodeEndBoundary:function(d,c){var b=d.startContainer;if(3==b.nodeType&&d.startOffset!=b.nodeValue.length||1==b.nodeType&&d.startOffset!=b.childNodes.length)return 0;for(;b!==c;){if(b.nextSibling)return 0;b=b.parentNode}return 1},isBoundaryNode:function(d,c){for(var b;!f.isBody(d);)if(b=d,d=d.parentNode,b!==d[c])return!1;return!0},fillHtml:r.ie11below?"&nbsp;":"<br/>"},P=RegExp(f.fillChar,"g");(function(){function d(a){return!a.collapsed&&
+1==a.startContainer.nodeType&&a.startContainer===a.endContainer&&1==a.endOffset-a.startOffset}function c(a,e,g,b){1==e.nodeType&&(v.$empty[e.tagName]||v.$nonChild[e.tagName])&&(g=f.getNodeIndex(e)+(a?0:1),e=e.parentNode);a?(b.startContainer=e,b.startOffset=g,b.endContainer||b.collapse(!0)):(b.endContainer=e,b.endOffset=g,b.startContainer||b.collapse(!1));b.collapsed=b.startContainer&&b.endContainer&&b.startContainer===b.endContainer&&b.startOffset==b.endOffset;return b}function b(a,e){var g=a.startContainer,
+b=a.endContainer,c=a.startOffset,l=a.endOffset,k=a.document,h=k.createDocumentFragment(),d,p;1==g.nodeType&&(g=g.childNodes[c]||(d=g.appendChild(k.createTextNode(""))));1==b.nodeType&&(b=b.childNodes[l]||(p=b.appendChild(k.createTextNode(""))));if(g===b&&3==g.nodeType)return h.appendChild(k.createTextNode(g.substringData(c,l-c))),e&&(g.deleteData(c,l-c),a.collapse(!0)),h;for(var A,N,r=h,s=f.findParents(g,!0),v=f.findParents(b,!0),z=0;s[z]==v[z];)z++;for(var H=z,D;D=s[H];H++){A=D.nextSibling;D==g?
+d||(3==a.startContainer.nodeType?(r.appendChild(k.createTextNode(g.nodeValue.slice(c))),e&&g.deleteData(c,g.nodeValue.length-c)):r.appendChild(e?g:g.cloneNode(!0))):(N=D.cloneNode(!1),r.appendChild(N));for(;A&&A!==b&&A!==v[H];)D=A.nextSibling,r.appendChild(e?A:A.cloneNode(!0)),A=D;r=N}r=h;s[z]||(r.appendChild(s[z-1].cloneNode(!1)),r=r.firstChild);for(H=z;c=v[H];H++){A=c.previousSibling;c==b?p||3!=a.endContainer.nodeType||(r.appendChild(k.createTextNode(b.substringData(0,l))),e&&b.deleteData(0,l)):
+(N=c.cloneNode(!1),r.appendChild(N));if(H!=z||!s[z])for(;A&&A!==g;)c=A.previousSibling,r.insertBefore(e?A:A.cloneNode(!0),r.firstChild),A=c;r=N}e&&a.setStartBefore(v[z]?s[z]?v[z]:s[z-1]:v[z-1]).collapse(!0);d&&f.remove(d);p&&f.remove(p);return h}function a(a,g){try{if(l&&f.inDoc(l,a))if(l.nodeValue.replace(P,"").length)l.nodeValue=l.nodeValue.replace(P,"");else{var e=l.parentNode;for(f.remove(l);e&&f.isEmptyInlineElement(e)&&(r.safari?!(f.getPosition(e,g)&f.POSITION_CONTAINS):!e.contains(g));)l=e.parentNode,
+f.remove(e),e=l}}catch(b){}}function e(a,e){var g;for(a=a[e];a&&f.isFillChar(a);)g=a[e],f.remove(a),a=g}var h=0,g=f.fillChar,l,k=L.Range=function(a){this.startContainer=this.startOffset=this.endContainer=this.endOffset=null;this.document=a;this.collapsed=!0};k.prototype={cloneContents:function(){return this.collapsed?null:b(this,0)},deleteContents:function(){var a;this.collapsed||b(this,1);r.webkit&&(a=this.startContainer,3!=a.nodeType||a.nodeValue.length||(this.setStartBefore(a).collapse(!0),f.remove(a)));
+return this},extractContents:function(){return this.collapsed?null:b(this,2)},setStart:function(a,e){return c(!0,a,e,this)},setEnd:function(a,e){return c(!1,a,e,this)},setStartAfter:function(a){return this.setStart(a.parentNode,f.getNodeIndex(a)+1)},setStartBefore:function(a){return this.setStart(a.parentNode,f.getNodeIndex(a))},setEndAfter:function(a){return this.setEnd(a.parentNode,f.getNodeIndex(a)+1)},setEndBefore:function(a){return this.setEnd(a.parentNode,f.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(){return(new k(this.document)).setStart(this.startContainer,this.startOffset).setEnd(this.endContainer,
+this.endOffset)},collapse:function(a){a?(this.endContainer=this.startContainer,this.endOffset=this.startOffset):(this.startContainer=this.endContainer,this.startOffset=this.endOffset);this.collapsed=!0;return this},shrinkBoundary:function(a){function e(a){return 1==a.nodeType&&!f.isBookmarkNode(a)&&!v.$empty[a.tagName]&&!v.$nonChild[a.tagName]}for(var g,b=this.collapsed;1==this.startContainer.nodeType&&(g=this.startContainer.childNodes[this.startOffset])&&e(g);)this.setStart(g,0);if(b)return this.collapse(!0);
+if(!a)for(;1==this.endContainer.nodeType&&0<this.endOffset&&(g=this.endContainer.childNodes[this.endOffset-1])&&e(g);)this.setEnd(g,g.childNodes.length);return this},getCommonAncestor:function(a,e){var g=this.startContainer,b=this.endContainer;return g===b?a&&d(this)&&(g=g.childNodes[this.startOffset],1==g.nodeType)?g:e&&3==g.nodeType?g.parentNode:g:f.getCommonAncestor(g,b)},trimBoundary:function(a){this.txtToElmBoundary();var g=this.startContainer,e=this.startOffset,b=this.collapsed,c=this.endContainer;
+if(3==g.nodeType){if(0==e)this.setStartBefore(g);else if(e>=g.nodeValue.length)this.setStartAfter(g);else{var l=f.split(g,e);g===c?this.setEnd(l,this.endOffset-e):g.parentNode===c&&(this.endOffset+=1);this.setStartBefore(l)}if(b)return this.collapse(!0)}a||(e=this.endOffset,c=this.endContainer,3==c.nodeType&&(0==e?this.setEndBefore(c):(e<c.nodeValue.length&&f.split(c,e),this.setEndAfter(c))));return this},txtToElmBoundary:function(a){function g(a,e){var b=a[e+"Container"],c=a[e+"Offset"];if(3==b.nodeType)if(!c)a["set"+
+e.replace(/(\w)/,function(a){return a.toUpperCase()})+"Before"](b);else if(c>=b.nodeValue.length)a["set"+e.replace(/(\w)/,function(a){return a.toUpperCase()})+"After"](b)}if(a||!this.collapsed)g(this,"start"),g(this,"end");return this},insertNode:function(a){var g=a,e=1;11==a.nodeType&&(g=a.firstChild,e=a.childNodes.length);this.trimBoundary(!0);var b=this.startContainer,c=b.childNodes[this.startOffset];c?b.insertBefore(a,c):b.appendChild(a);g.parentNode===this.endContainer&&(this.endOffset+=e);return this.setStartBefore(g)},
+setCursor:function(a,g){return this.collapse(!a).select(g)},createBookmark:function(a,g){var e,b=this.document.createElement("span");b.style.cssText="display:none;line-height:0px;";b.appendChild(this.document.createTextNode("\u200d"));b.id="_baidu_bookmark_start_"+(g?"":h++);this.collapsed||(e=b.cloneNode(!0),e.id="_baidu_bookmark_end_"+(g?"":h++));this.insertNode(b);e&&this.collapse().insertNode(e).setEndBefore(e);this.setStartAfter(b);return{start:a?b.id:b,end:e?a?e.id:e:null,id:a}},moveToBookmark:function(a){var e=
+a.id?this.document.getElementById(a.start):a.start;a=a.end&&a.id?this.document.getElementById(a.end):a.end;this.setStartBefore(e);f.remove(e);a?(this.setEndBefore(a),f.remove(a)):this.collapse(!0);return this},enlarge:function(a,e){var g=f.isBody,b,c,l=this.document.createTextNode("");if(a){c=this.startContainer;1==c.nodeType?c.childNodes[this.startOffset]?b=c=c.childNodes[this.startOffset]:(c.appendChild(l),b=c=l):b=c;for(;;){if(f.isBlockElm(c)){for(c=b;(b=c.previousSibling)&&!f.isBlockElm(b);)c=
+b;this.setStartBefore(c);break}b=c;c=c.parentNode}c=this.endContainer;1==c.nodeType?((b=c.childNodes[this.endOffset])?c.insertBefore(l,b):c.appendChild(l),b=c=l):b=c;for(;;){if(f.isBlockElm(c)){for(c=b;(b=c.nextSibling)&&!f.isBlockElm(b);)c=b;this.setEndAfter(c);break}b=c;c=c.parentNode}l.parentNode===this.endContainer&&this.endOffset--;f.remove(l)}if(!this.collapsed){for(;!(0!=this.startOffset||e&&e(this.startContainer)||g(this.startContainer));)this.setStartBefore(this.startContainer);for(;!(this.endOffset!=
+(1==this.endContainer.nodeType?this.endContainer.childNodes.length:this.endContainer.nodeValue.length)||e&&e(this.endContainer)||g(this.endContainer));)this.setEndAfter(this.endContainer)}return this},enlargeToBlockElm:function(a){for(;!f.isBlockElm(this.startContainer);)this.setStartBefore(this.startContainer);if(!a)for(;!f.isBlockElm(this.endContainer);)this.setEndAfter(this.endContainer);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!f.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(;!f.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},applyInlineStyle:function(a,e,g){if(this.collapsed)return this;this.trimBoundary().enlarge(!1,function(a){return 1==
+a.nodeType&&f.isBlockElm(a)}).adjustmentBoundary();for(var b=this.createBookmark(),c=b.end,l=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!f.isWhitespace(a)},k=f.getNextDomNode(b.start,!1,l),h,d,p=this.cloneRange();k&&f.getPosition(k,c)&f.POSITION_PRECEDING;)if(3==k.nodeType||v[a][k.tagName]){p.setStartBefore(k);for(h=k;h&&(3==h.nodeType||v[a][h.tagName])&&h!==c;)d=h,h=f.getNextDomNode(h,1==h.nodeType,null,function(e){return v[a][e.tagName]});var k=p.setEndAfter(d).extractContents(),
+A;if(g&&0<g.length){var N;N=A=g[0].cloneNode(!1);for(var r=1,s;s=g[r++];)A.appendChild(s.cloneNode(!1)),A=A.firstChild}else A=p.document.createElement(a);e&&f.setAttributes(A,e);A.appendChild(k);p.insertNode(g?N:A);var T;"span"==a&&e.style&&/text\-decoration/.test(e.style)&&(T=f.findParentByTagName(A,"a",!0))?(f.setAttributes(T,e),f.remove(A,!0),A=T):(f.mergeSibling(A),f.clearEmptySibling(A));f.mergeChild(A,e);k=f.getNextDomNode(A,!1,l);f.mergeToParent(A);if(h===c)break}else k=f.getNextDomNode(k,
+!0,l);return this.moveToBookmark(b)},removeInlineStyle:function(a){if(this.collapsed)return this;a=p.isArray(a)?a:[a];this.shrinkBoundary().adjustmentBoundary();for(var e=this.startContainer,g=this.endContainer;;){if(1==e.nodeType){if(-1<p.indexOf(a,e.tagName.toLowerCase()))break;if("body"==e.tagName.toLowerCase()){e=null;break}}e=e.parentNode}for(;;){if(1==g.nodeType){if(-1<p.indexOf(a,g.tagName.toLowerCase()))break;if("body"==g.tagName.toLowerCase()){g=null;break}}g=g.parentNode}var b=this.createBookmark(),
+c,l;e&&(l=this.cloneRange().setEndBefore(b.start).setStartBefore(e),c=l.extractContents(),l.insertNode(c),f.clearEmptySibling(e,!0),e.parentNode.insertBefore(b.start,e));g&&(l=this.cloneRange().setStartAfter(b.end).setEndAfter(g),c=l.extractContents(),l.insertNode(c),f.clearEmptySibling(g,!1,!0),g.parentNode.insertBefore(b.end,g.nextSibling));for(e=f.getNextDomNode(b.start,!1,function(a){return 1==a.nodeType});e&&e!==b.end;)g=f.getNextDomNode(e,!0,function(a){return 1==a.nodeType}),-1<p.indexOf(a,
+e.tagName.toLowerCase())&&f.remove(e,!0),e=g;return this.moveToBookmark(b)},getClosedNode:function(){var a;if(!this.collapsed){var e=this.cloneRange().adjustmentBoundary().shrinkBoundary();d(e)&&(e=e.startContainer.childNodes[e.startOffset])&&1==e.nodeType&&(v.$empty[e.tagName]||v.$nonChild[e.tagName])&&(a=e)}return a},select:r.ie?function(b,c){var k;this.collapsed||this.shrinkBoundary();var h=this.getClosedNode();if(h&&!c){try{k=this.document.body.createControlRange(),k.addElement(h),k.select()}catch(d){}return this}var h=
+this.createBookmark(),y=h.start;k=this.document.body.createTextRange();k.moveToElementText(y);k.moveStart("character",1);if(!this.collapsed){var u=this.document.body.createTextRange(),y=h.end;u.moveToElementText(y);k.setEndPoint("EndToEnd",u)}else if(!b&&3!=this.startContainer.nodeType){var u=this.document.createTextNode(g),C=this.document.createElement("span");C.appendChild(this.document.createTextNode(g));y.parentNode.insertBefore(C,y);y.parentNode.insertBefore(u,y);a(this.document,u);l=u;e(C,"previousSibling");
+e(y,"nextSibling");k.moveStart("character",-1);k.collapse(!0)}this.moveToBookmark(h);C&&f.remove(C);try{k.select()}catch(E){}return this}:function(b){function c(a){function e(b,g,c){3==b.nodeType&&b.nodeValue.length<g&&(a[c+"Offset"]=b.nodeValue.length)}e(a.startContainer,a.startOffset,"start");e(a.endContainer,a.endOffset,"end")}var k=f.getWindow(this.document),h=k.getSelection();r.gecko?this.document.body.focus():k.focus();if(h){h.removeAllRanges();this.collapsed&&!b&&(b=k=this.startContainer,1==
+k.nodeType&&(b=k.childNodes[this.startOffset]),3==k.nodeType&&this.startOffset||(b?b.previousSibling&&3==b.previousSibling.nodeType:k.lastChild&&3==k.lastChild.nodeType)||(b=this.document.createTextNode(g),this.insertNode(b),a(this.document,b),e(b,"previousSibling"),e(b,"nextSibling"),l=b,this.setStart(b,r.webkit?1:0).collapse(!0)));k=this.document.createRange();if(this.collapsed&&r.opera&&1==this.startContainer.nodeType)if(b=this.startContainer.childNodes[this.startOffset]){for(;b&&f.isBlockElm(b);)if(1==
+b.nodeType&&b.childNodes[0])b=b.childNodes[0];else break;b&&this.setStartBefore(b).collapse(!0)}else(b=this.startContainer.lastChild)&&f.isBr(b)&&this.setStartBefore(b).collapse(!0);c(this);k.setStart(this.startContainer,this.startOffset);k.setEnd(this.endContainer,this.endOffset);h.addRange(k)}return this},scrollToView:function(a,e){a=a?window:f.getWindow(this.document);var b=this.document.createElement("span");b.innerHTML="&nbsp;";this.cloneRange().insertNode(b);f.scrollToView(b,a,e);f.remove(b);
+return this},inFillChar:function(){var a=this.startContainer;return this.collapsed&&3==a.nodeType&&a.nodeValue.replace(RegExp("^"+f.fillChar),"").length+1==a.nodeValue.length?!0:!1},createAddress:function(a,e){function b(a){for(var g=a?c.startContainer:c.endContainer,l=f.findParents(g,!0,function(a){return!f.isBody(a)}),k=[],h=0,d;d=l[h++];)k.push(f.getNodeIndex(d,e));l=0;if(e)if(3==g.nodeType){for(g=g.previousSibling;g&&3==g.nodeType;)l+=g.nodeValue.replace(P,"").length,g=g.previousSibling;l+=a?
+c.startOffset:c.endOffset}else if(g=g.childNodes[a?c.startOffset:c.endOffset])l=f.getNodeIndex(g,e);else for(g=a?c.startContainer:c.endContainer,a=g.firstChild;a;)if(f.isFillChar(a))a=a.nextSibling;else if(l++,3==a.nodeType)for(;a&&3==a.nodeType;)a=a.nextSibling;else a=a.nextSibling;else l=a?f.isFillChar(g)?0:c.startOffset:c.endOffset;0>l&&(l=0);k.push(l);return k}var g={},c=this;g.startAddress=b(!0);a||(g.endAddress=c.collapsed?[].concat(g.startAddress):b());return g},moveToAddress:function(a,e){function g(a,
+e){for(var c=b.document.body,l,k,h=0,d,f=a.length;h<f;h++)if(d=a[h],l=c,c=c.childNodes[d],!c){k=d;break}e?c?b.setStartBefore(c):b.setStart(l,k):c?b.setEndBefore(c):b.setEnd(l,k)}var b=this;g(a.startAddress,!0);!e&&a.endAddress&&g(a.endAddress);return b},equals:function(a){for(var e in this)if(this.hasOwnProperty(e)&&this[e]!==a[e])return!1;return!0},traversal:function(a,e){if(this.collapsed)return this;for(var b=this.createBookmark(),g=b.end,c=f.getNextDomNode(b.start,!1,e);c&&c!==g&&f.getPosition(c,
+g)&f.POSITION_PRECEDING;){var l=f.getNextDomNode(c,!1,e);a(c);c=l}return this.moveToBookmark(b)}}})();(function(){function d(a,e){var b=f.getNodeIndex;a=a.duplicate();a.collapse(e);var g=a.parentElement();if(!g.hasChildNodes())return{container:g,offset:0};for(var c=g.children,k,d=a.duplicate(),n=0,q=c.length-1,t=-1;n<=q;){t=Math.floor((n+q)/2);k=c[t];d.moveToElementText(k);var w=d.compareEndPoints("StartToStart",a);if(0<w)q=t-1;else if(0>w)n=t+1;else return{container:g,offset:b(k)}}if(-1==t){d.moveToElementText(g);
+d.setEndPoint("StartToStart",a);d=d.text.replace(/(\r\n|\r)/g,"\n").length;c=g.childNodes;if(!d)return k=c[c.length-1],{container:k,offset:k.nodeValue.length};for(b=c.length;0<d;)d-=c[--b].nodeValue.length;return{container:c[b],offset:-d}}d.collapse(0<w);d.setEndPoint(0<w?"StartToStart":"EndToStart",a);d=d.text.replace(/(\r\n|\r)/g,"\n").length;if(!d)return v.$empty[k.tagName]||v.$nonChild[k.tagName]?{container:g,offset:b(k)+(0<w?0:1)}:{container:k,offset:0<w?0:k.childNodes.length};for(;0<d;)try{c=
+k,k=k[0<w?"previousSibling":"nextSibling"],d-=k.nodeValue.length}catch(y){return{container:g,offset:b(c)}}return{container:k,offset:0<w?-d:k.nodeValue.length+d}}function c(a,e){if(a.item)e.selectNode(a.item(0));else{var b=d(a,!0);e.setStart(b.container,b.offset);0!=a.compareEndPoints("StartToEnd",a)&&(b=d(a,!1),e.setEnd(b.container,b.offset))}return e}function b(a){var b;try{b=a.getNative().createRange()}catch(c){return null}var g=b.item?b.item(0):b.parentElement();return(g.ownerDocument||g)===a.document?
+b:null}(L.Selection=function(a){var e=this;e.document=a;r.ie9below&&(a=f.getWindow(a).frameElement,f.on(a,"beforedeactivate",function(){e._bakIERange=e.getIERange()}),f.on(a,"activate",function(){try{!b(e)&&e._bakIERange&&e._bakIERange.select()}catch(a){}e._bakIERange=null}));a=a=null}).prototype={rangeInBody:function(a,b){var c=r.ie9below||b?a.item?a.item():a.parentElement():a.startContainer;return c===this.document.body||f.inDoc(c,this.document)},getNative:function(){var a=this.document;try{return a?
+r.ie9below?a.selection:f.getWindow(a).getSelection():null}catch(b){return null}},getIERange:function(){var a=b(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?f.findParents(a,!0,null,!0):[]},clear:function(){this._cachedStartElementPath=
+this._cachedRange=this._cachedStartElement=null},isFocus:function(){try{if(r.ie9below){var a=b(this);return!(!a||!this.rangeInBody(a))}return!!this.getNative().rangeCount}catch(e){return!1}},getRange:function(){function a(a){for(var g=b.document.body.firstChild,c=a.collapsed;g&&g.firstChild;)a.setStart(g,0),g=g.firstChild;a.startContainer||a.setStart(b.document.body,0);c&&a.collapse(!0)}var b=this;if(null!=b._cachedRange)return this._cachedRange;var h=new s.editor.dom.Range(b.document);if(r.ie9below){var g=
+b.getIERange();if(g)try{c(g,h)}catch(l){a(h)}else a(h)}else{var k=b.getNative();if(k&&k.rangeCount)g=k.getRangeAt(0),k=k.getRangeAt(k.rangeCount-1),h.setStart(g.startContainer,g.startOffset).setEnd(k.endContainer,k.endOffset),h.collapsed&&f.isBody(h.startContainer)&&!h.startOffset&&a(h);else{if(this._bakRange&&f.inDoc(this._bakRange.startContainer,this.document))return this._bakRange;a(h)}}return this._bakRange=h},getStart:function(){if(this._cachedStartElement)return this._cachedStartElement;var a=
+r.ie9below?this.getIERange():this.getRange(),b,c;if(r.ie9below){if(!a)return this.document.body.firstChild;if(a.item)return a.item(0);b=a.duplicate();0<b.text.length&&b.moveStart("character",1);b.collapse(1);b=b.parentElement();for(c=a=a.parentElement();a=a.parentNode;)if(a==b){b=c;break}}else if(a.shrinkBoundary(),b=a.startContainer,1==b.nodeType&&b.hasChildNodes()&&(b=b.childNodes[Math.min(b.childNodes.length-1,a.startOffset)]),3==b.nodeType)return b.parentNode;return b},getText:function(){var a;
+return this.isFocus()&&(a=this.getNative())?(a=r.ie9below?a.createRange():a.getRangeAt(0),r.ie9below?a.text:a.toString()):""},clearRange:function(){this.getNative()[r.ie9below?"empty":"removeAllRanges"]()}}})();(function(){function d(a,b){var c;if(b.textarea)if(p.isString(b.textarea))for(var e=0,h,d=f.getElementsByTagName(a,"textarea");h=d[e++];){if(h.id=="ueditor_textarea_"+b.options.textarea){c=h;break}}else c=b.textarea;c||(a.appendChild(c=f.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 c(a){for(var b in a)return b}function b(a){a.langIsReady=!0;a.fireEvent("langReady")}var a=0,e,h=UE.Editor=function(g){var e=this;e.uid=a++;Z.call(e);e.commands={};e.options=p.extend(p.clone(g||{}),UEDITOR_CONFIG,!0);e.shortcutkeys={};e.inputRules=[];
+e.outputRules=[];e.setOpt(h.defaultOptions(e));e.loadServerConfig();p.isEmptyObject(UE.I18N)?p.loadFile(document,{src:e.options.langPath+e.options.lang+"/"+e.options.lang+".js",tag:"script",type:"text/javascript",defer:"defer"},function(){UE.plugin.load(e);b(e)}):(e.options.lang=c(UE.I18N),UE.plugin.load(e),b(e));UE.instants["ueditorInstant"+e.uid]=e};h.prototype={registerCommand:function(a,b){this.commands[a]=b},ready:function(a){a&&(this.isReady?a.apply(this):this.addListener("ready",a))},setOpt:function(a,
+b){var e={};p.isString(a)?e[a]=b:e=a;p.extend(this.options,e,!0)},getOpt:function(a){return this.options[a]},destroy:function(){this.fireEvent("destroy");var a=this.container.parentNode,b=this.textarea;b?b.style.display="":(b=document.createElement("textarea"),a.parentNode.insertBefore(b,a));b.style.width=this.iframe.offsetWidth+"px";b.style.height=this.iframe.offsetHeight+"px";b.value=this.getContent();b.id=this.key;a.innerHTML="";f.remove(a);var a=this.key,e;for(e in this)this.hasOwnProperty(e)&&
+delete this[e];UE.delEditor(a)},render:function(a){var b=this.options;p.isString(a)&&(a=document.getElementById(a));if(a){b.minFrameWidth=b.initialFrameWidth?b.initialFrameWidth:b.initialFrameWidth=a.offsetWidth;b.initialFrameHeight?b.minFrameHeight=b.initialFrameHeight:b.initialFrameHeight=b.minFrameHeight=a.offsetHeight;a.style.width=/%$/.test(b.initialFrameWidth)?"100%":b.initialFrameWidth-parseInt(f.getComputedStyle(a,"padding-left"))-parseInt(f.getComputedStyle(a,"padding-right"))+"px";a.style.height=
+/%$/.test(b.initialFrameHeight)?"100%":b.initialFrameHeight-parseInt(f.getComputedStyle(a,"padding-top"))-parseInt(f.getComputedStyle(a,"padding-bottom"))+"px";a.style.zIndex=b.zIndex;var e=(I&&9>r.version?"":"<!DOCTYPE html>")+"<html xmlns='http://www.w3.org/1999/xhtml' class='view' ><head><style type='text/css'>.view{padding:0;word-wrap:break-word;cursor:text;height:90%;}\nbody{margin:8px;font-family:sans-serif;font-size:16px;}p{margin:5px 0;}</style>"+(b.iframeCssUrl?"<link rel='stylesheet' type='text/css' href='"+
+p.unhtml(b.iframeCssUrl)+"'/>":"")+(b.initialStyle?"<style>"+b.initialStyle+"</style>":"")+"</head><body class='view' ></body><script type='text/javascript' "+(I?"defer='defer'":"")+" id='_initialScript'>setTimeout(function(){editor = window.parent.UE.instants['ueditorInstant"+this.uid+"'];editor._setup(document);},0);var _tmpScript = document.getElementById('_initialScript');_tmpScript.parentNode.removeChild(_tmpScript);\x3c/script></html>";a.appendChild(f.createElement(document,"iframe",{id:"ueditor_"+
+this.uid,width:"100%",height:"100%",frameborder:"0",src:"javascript:void(function(){document.open();"+(b.customDomain&&document.domain!=location.hostname?'document.domain="'+document.domain+'";':"")+'document.write("'+e+'");document.close();}())'}));a.style.overflow="hidden";setTimeout(function(){/%$/.test(b.initialFrameWidth)&&(b.minFrameWidth=b.initialFrameWidth=a.offsetWidth);/%$/.test(b.initialFrameHeight)&&(b.minFrameHeight=b.initialFrameHeight=a.offsetHeight,a.style.height=b.initialFrameHeight+
+"px")})}},_setup:function(a){var b=this,e=b.options;I?(a.body.disabled=!0,a.body.contentEditable=!0,a.body.disabled=!1):a.body.contentEditable=!0;a.body.spellcheck=!1;b.document=a;b.window=a.defaultView||a.parentWindow;b.iframe=b.window.frameElement;b.body=a.body;b.selection=new L.Selection(a);var c;r.gecko&&(c=this.selection.getNative())&&c.removeAllRanges();this._initEvents();for(var h=this.iframe.parentNode;!f.isBody(h);h=h.parentNode)if("FORM"==h.tagName){b.form=h;if(b.options.autoSyncData)f.on(b.window,
+"blur",function(){d(h,b)});else f.on(h,"submit",function(){d(this,b)});break}if(e.initialContent)if(e.autoClearinitialContent){var q=b.execCommand;b.execCommand=function(){b.fireEvent("firstBeforeExecCommand");return q.apply(b,arguments)};this._setDefaultContent(e.initialContent)}else this.setContent(e.initialContent,!1,!0);f.isEmptyNode(b.body)&&(b.body.innerHTML="<p>"+(r.ie?"":"<br/>")+"</p>");e.focus&&setTimeout(function(){b.focus(b.options.focusInEnd);!b.options.autoClearinitialContent&&b._selectionChange()},
+0);b.container||(b.container=this.iframe.parentNode);e.fullscreen&&b.ui&&b.ui.setFullScreen(!0);try{b.document.execCommand("2D-position",!1,!1)}catch(t){}try{b.document.execCommand("enableInlineTableEditing",!1,!1)}catch(w){}try{b.document.execCommand("enableObjectResizing",!1,!1)}catch(y){}b._bindshortcutKeys();b.isReady=1;b.fireEvent("ready");e.onready&&e.onready.call(b);if(!r.ie9below)f.on(b.window,["blur","focus"],function(a){if("blur"==a.type){b._bakRange=b.selection.getRange();try{b._bakNativeRange=
+b.selection.getNative().getRangeAt(0),b.selection.getNative().removeAllRanges()}catch(e){b._bakNativeRange=null}}else try{b._bakRange&&b._bakRange.select()}catch(c){}});r.gecko&&10902>=r.version&&(b.body.contentEditable=!1,setTimeout(function(){b.body.contentEditable=!0},100),setInterval(function(){b.body.style.height=b.iframe.offsetHeight-20+"px"},100));!e.isShow&&b.setHide();e.readonly&&b.setDisabled()},sync:function(a){(a=a?document.getElementById(a):f.findParent(this.iframe.parentNode,function(a){return"FORM"==
+a.tagName},!0))&&d(a,this)},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 e={};b?e[a]=b:e=a;p.extend(this.shortcutkeys,e)},_bindshortcutKeys:function(){var a=this,b=this.shortcutkeys;a.addListener("keydown",function(e,c){var h=c.keyCode||c.which,d;for(d in b)for(var t=
+b[d].split(","),w=0,y;y=t[w++];){y=y.split(":");var u=y[0];y=y[1];if(/^(ctrl)(\+shift)?\+(\d+)$/.test(u.toLowerCase())||/^(\d+)$/.test(u))if("ctrl"==RegExp.$1&&(c.ctrlKey||c.metaKey)&&(""!=RegExp.$2?c[RegExp.$2.slice(1)+"Key"]:1)&&h==RegExp.$3||h==RegExp.$1)-1!=a.queryCommandState(d,y)&&a.execCommand(d,y),f.preventDefault(c)}})},getContent:function(a,b,e,c,h){a&&p.isFunction(a)&&(b=a,a="");if(b?!b():!this.hasContents())return"";this.fireEvent("beforegetcontent");b=UE.htmlparser(this.body.innerHTML,
+c);this.filterOutputRule(b);this.fireEvent("aftergetcontent",a,b);return b.toHtml(h)},getAllHtml:function(){var a=[];this.fireEvent("getAllHtml",a);if(r.ie&&8<r.version){var b="";p.each(this.document.styleSheets,function(a){b+=a.href?'<link rel="stylesheet" type="text/css" href="'+a.href+'" />':"<style>"+a.cssText+"</style>"});p.each(this.document.getElementsByTagName("script"),function(a){b+=a.outerHTML})}return"<html><head>"+(this.options.charset?'<meta http-equiv="Content-Type" content="text/html; charset='+
+this.options.charset+'"/>':"")+(b||this.document.getElementsByTagName("head")[0].innerHTML)+a.join("\n")+"</head><body "+(I&&9>r.version?'class="view"':"")+">"+this.getContent(null,null,!0)+"</body></html>"},getPlainTxt:function(){var a=RegExp(f.fillChar,"g"),b=this.body.innerHTML.replace(/[\n\r]/g,""),b=b.replace(/<(p|div)[^>]*>(<br\/?>|&nbsp;)<\/\1>/gi,"\n").replace(/<br\/?>/gi,"\n").replace(/<[^>/]+>/g,"").replace(/(\n)?<\/([^>]+)>/g,function(a,b,e){return v.$block[e]?"\n":b?b:""});return b.replace(a,
+"").replace(/\u00a0/g," ").replace(/&nbsp;/g," ")},getContentTxt:function(){return this.body[r.ie?"innerText":"textContent"].replace(RegExp(f.fillChar,"g"),"").replace(/\u00a0/g," ")},setContent:function(a,b,e){this.fireEvent("beforesetcontent",a);a=UE.htmlparser(a);this.filterInputRule(a);a=a.toHtml();this.body.innerHTML=(b?this.body.innerHTML:"")+a;if("p"==this.options.enterTag)if(b=this.body.firstChild,!b||1==b.nodeType&&(v.$cdata[b.tagName]||"DIV"==b.tagName&&b.getAttribute("cdata_tag")||f.isCustomeNode(b))&&
+b===this.body.lastChild)this.body.innerHTML="<p>"+(r.ie?"&nbsp;":"<br/>")+"</p>"+this.body.innerHTML;else for(var c=this.document.createElement("p");b;){for(;b&&(3==b.nodeType||1==b.nodeType&&v.p[b.tagName]&&!v.$cdata[b.tagName]);)a=b.nextSibling,c.appendChild(b),b=a;if(c.firstChild)if(b)b.parentNode.insertBefore(c,b),c=this.document.createElement("p");else{this.body.appendChild(c);break}b=b.nextSibling}this.fireEvent("aftersetcontent");this.fireEvent("contentchange");!e&&this._selectionChange();
+this._bakRange=this._bakIERange=this._bakNativeRange=null;var h;r.gecko&&(h=this.selection.getNative())&&h.removeAllRanges();this.options.autoSyncData&&this.form&&d(this.form,this)},focus:function(a){try{var b=this.selection.getRange();if(a){var e=this.body.lastChild;e&&1==e.nodeType&&!v.$empty[e.tagName]&&(f.isEmptyBlock(e)?b.setStartAtFirst(e):b.setStartAtLast(e),b.collapse(!0));b.setCursor(!0)}else!b.collapsed&&f.isBody(b.startContainer)&&0==b.startOffset&&(e=this.body.firstChild)&&1==e.nodeType&&
+!v.$empty[e.tagName]&&b.setStartAtFirst(e).collapse(!0),b.select(!0);this.fireEvent("focus selectionchange")}catch(c){}},isFocus:function(){return this.selection.isFocus()},blur:function(){var a=this.selection.getNative();if(a.empty&&r.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,e=a.window;a._proxyDomEvent=p.bind(a._proxyDomEvent,a);f.on(b,"click contextmenu mousedown keydown keyup keypress mouseup mouseover mouseout selectstart".split(" "),
+a._proxyDomEvent);f.on(e,["focus","blur"],a._proxyDomEvent);f.on(a.body,"drop",function(b){r.gecko&&b.stopPropagation&&b.stopPropagation();a.fireEvent("contentchange")});f.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!1===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=this,h=!1,d,f;r.ie&&9>r.version&&b&&"mouseup"==b.type&&!this.selection.getRange().collapsed&&(h=!0,d=b.clientX,f=b.clientY);clearTimeout(e);e=setTimeout(function(){if(c.selection&&c.selection.getNative()){var a;if(h&&"None"==c.selection.getNative().type){a=c.document.body.createTextRange();try{a.moveToPoint(d,f)}catch(e){a=null}}var g;a&&(g=c.selection.getIERange,c.selection.getIERange=function(){return a});c.selection.cache();g&&(c.selection.getIERange=
+g);c.selection._cachedRange&&c.selection._cachedStartElement&&(c.fireEvent("beforeselectionchange"),c.fireEvent("selectionchange",!!b),c.fireEvent("afterselectionchange"),c.selection.clear())}},a||50)},_callCmdFn:function(a,b){var e=b[0].toLowerCase(),c;c=(e=this.commands[e]||UE.commands[e])&&e[a];if(!(e&&c||"queryCommandState"!=a))return 0;if(c)return c.apply(this,b)},execCommand:function(a){a=a.toLowerCase();var b,e=this.commands[a]||UE.commands[a];if(!e||!e.execCommand)return null;e.notNeedUndo||
+this.__hasEnterExecCommand?(b=this._callCmdFn("execCommand",arguments),this.__hasEnterExecCommand||e.ignoreContentChange||this._ignoreContentChange||this.fireEvent("contentchange")):(this.__hasEnterExecCommand=!0,-1!=this.queryCommandState.apply(this,arguments)&&(this.fireEvent("saveScene"),this.fireEvent.apply(this,["beforeexeccommand",a].concat(arguments)),b=this._callCmdFn("execCommand",arguments),this.fireEvent.apply(this,["afterexeccommand",a].concat(arguments)),this.fireEvent("saveScene")),
+this.__hasEnterExecCommand=!1);this.__hasEnterExecCommand||e.ignoreContentChange||this._ignoreContentChange||this._selectionChange();return b},queryCommandState:function(a){return this._callCmdFn("queryCommandState",arguments)},queryCommandValue:function(a){return this._callCmdFn("queryCommandValue",arguments)},hasContents:function(a){if(a)for(var b=0,e;e=a[b++];)if(0<this.document.getElementsByTagName(e).length)return!0;if(!f.isEmptyBlock(this.body))return!0;a=["div"];for(b=0;e=a[b++];){e=f.getElementsByTagName(this.document,
+e);for(var c=0,h;h=e[c++];)if(f.isCustomeNode(h))return!0}return!1},reset:function(){this.fireEvent("reset")},setEnabled:function(){var a;if("false"==this.body.contentEditable){this.body.contentEditable=!0;a=this.selection.getRange();try{a.moveToBookmark(this.lastBk),delete this.lastBk}catch(b){a.setStartAtFirst(this.body).collapse(!0)}a.select(!0);this.bkqueryCommandState&&(this.queryCommandState=this.bkqueryCommandState,delete this.bkqueryCommandState);this.bkqueryCommandValue&&(this.queryCommandValue=
+this.bkqueryCommandValue,delete this.bkqueryCommandValue);this.fireEvent("selectionchange")}},enable:function(){return this.setEnabled()},setDisabled:function(a){var b=this;a=a?p.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(e){return-1!=p.indexOf(a,e)?b.bkqueryCommandState.apply(b,arguments):
+-1},b.queryCommandValue=function(e){return-1!=p.indexOf(a,e)?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="<p>"+(I?"":"<br/>")+"</p>",b.removeListener("firstBeforeExecCommand focus",a),setTimeout(function(){b.focus();b._selectionChange()},0))}return function(b){this.body.innerHTML='<p id="initContent">'+
+b+"</p>";this.addListener("firstBeforeExecCommand focus",a)}}(),setShow:function(){var a=this.selection.getRange();if("none"==this.container.style.display){try{a.moveToBookmark(this.lastBk),delete this.lastBk}catch(b){a.setStartAtFirst(this.body).collapse(!0)}setTimeout(function(){a.select(!0)},100);this.container.style.display=""}},show:function(){return this.setShow()},setHide:function(){this.lastBk||(this.lastBk=this.selection.getRange().createBookmark(!0));this.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 e=0,c;(c=a[e++])&&(b=b[c],b););return b},getContentLength:function(a,b){var e=this.getContent(!1,!1,!0).length;if(a){b=(b||[]).concat(["hr","img","iframe"]);for(var e=this.getContentTxt().replace(/[\t\r\n]+/g,"").length,c=0,h;h=b[c++];)e+=this.document.getElementsByTagName(h).length}return e},addInputRule:function(a){this.inputRules.push(a)},
+filterInputRule:function(a){for(var b=0,e;e=this.inputRules[b++];)e.call(this,a)},addOutputRule:function(a){this.outputRules.push(a)},filterOutputRule:function(a){for(var b=0,e;e=this.outputRules[b++];)e.call(this,a)},getActionUrl:function(a){a=this.getOpt(a)||a;var b=this.getOpt("imageUrl"),e=this.getOpt("serverUrl");!e&&b&&(e=b.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2"));return e?(e=e+(-1==e.indexOf("?")?"?":"&")+"action="+(a||""),p.formatUrl(e)):""}};p.inherits(h,Z)})();UE.Editor.defaultOptions=
+function(d){d=d.options.UEDITOR_HOME_URL;return{isShow:!0,initialContent:"",initialStyle:"",autoClearinitialContent:!1,iframeCssUrl:d+"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:d+"lang/",theme:"default",themePath:d+"themes/",allHtmlEnabled:!1,scaleEnabled:!1,tableNativeEditInFF:!1,autoSyncData:!0,fileNameFormat:"{time}{rand:6}"}};(function(){UE.Editor.prototype.loadServerConfig=
+function(){function d(b){console&&console.error(b)}var c=this;setTimeout(function(){try{c.options.imageUrl&&c.setOpt("serverUrl",c.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2"));var b=c.getActionUrl("config"),a=p.isCrossDomainUrl(b);c._serverConfigLoaded=!1;b&&UE.ajax.request(b,{method:"GET",dataType:a?"jsonp":"",onsuccess:function(b){try{var e=a?b:eval("("+b.responseText+")");p.extend(c.options,e);c.fireEvent("serverConfigLoaded");c._serverConfigLoaded=!0}catch(l){d(c.getLang("loadconfigFormatError"))}},
+onerror:function(){d(c.getLang("loadconfigHttpError"))}})}catch(e){d(c.getLang("loadconfigError"))}})};UE.Editor.prototype.isServerConfigLoaded=function(){return this._serverConfigLoaded||!1};UE.Editor.prototype.afterConfigReady=function(d){if(d&&p.isFunction(d)){var c=this,b=function(){d.apply(c,arguments);c.removeListener("serverConfigLoaded",b)};c.isServerConfigLoaded()?d.call(c,"serverConfigLoaded"):c.addListener("serverConfigLoaded",b)}}})();UE.ajax=function(){function d(a){var b=[],e;for(e in a)if("method"!=
+e&&"timeout"!=e&&"async"!=e&&"dataType"!=e&&"callback"!=e&&void 0!=a[e]&&null!=a[e])if("function"!=(typeof a[e]).toLowerCase()&&"object"!=(typeof a[e]).toLowerCase())b.push(encodeURIComponent(e)+"="+encodeURIComponent(a[e]));else if(p.isArray(a[e]))for(var c=0;c<a[e].length;c++)b.push(encodeURIComponent(e)+"[]="+encodeURIComponent(a[e][c]));return b.join("&")}function c(a,b){var e=g(),c=!1,h={method:"POST",timeout:5E3,async:!0,data:{},onsuccess:function(){},onerror:function(){}};"object"===typeof a&&
+(b=a,a=b.url);if(e&&a){var f=b?p.extend(h,b):h,h=d(f);p.isEmptyObject(f.data)||(h+=(h?"&":"")+d(f.data));var w=setTimeout(function(){4!=e.readyState&&(c=!0,e.abort(),clearTimeout(w))},f.timeout),y=f.method.toUpperCase(),u=a+(-1==a.indexOf("?")?"?":"&")+("POST"==y?"":h+"&noCache="+ +new Date);e.open(y,u,f.async);e.onreadystatechange=function(){if(4==e.readyState)if(c||200!=e.status)f.onerror(e);else f.onsuccess(e)};"POST"==y?(e.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),e.send(h)):
+e.send(null)}}function b(a,b){function e(a){return function(){try{if(a)h.onerror&&h.onerror();else try{clearTimeout(E),c.apply(window,arguments)}catch(b){}}catch(e){h.onerror&&h.onerror.call(window,e)}finally{h.oncomplete&&h.oncomplete.apply(window,arguments);g.parentNode&&g.parentNode.removeChild(g);window[u]=null;try{delete window[u]}catch(k){}}}}var c=b.onsuccess||function(){},g=document.createElement("SCRIPT"),h=b||{},f=h.charset,y=h.jsonp||"callback",u,C=h.timeOut||0,E,G=RegExp("(\\?|&)"+y+"=([^&]*)"),
+A;if(p.isFunction(c))u="bd__editor__"+Math.floor(2147483648*Math.random()).toString(36),window[u]=e(0);else if(p.isString(c))u=c;else if(A=G.exec(a))u=A[2];a=a.replace(G,"$1"+y+"="+u);0>a.search(G)&&(a+=(0>a.indexOf("?")?"?":"&")+y+"="+u);y=d(b);p.isEmptyObject(b.data)||(y+=(y?"&":"")+d(b.data));y&&(a=a.replace(/\?/,"?"+y+"&"));g.onerror=e(1);C&&(E=setTimeout(e(1),C));(function(a,b,e){a.setAttribute("type","text/javascript");a.setAttribute("defer","defer");e&&a.setAttribute("charset",e);a.setAttribute("src",
+b);document.getElementsByTagName("head")[0].appendChild(a)})(g,a,f)}var a="XMLHttpRequest()";try{new ActiveXObject("Msxml2.XMLHTTP"),a="ActiveXObject('Msxml2.XMLHTTP')"}catch(e){try{new ActiveXObject("Microsoft.XMLHTTP"),a="ActiveXObject('Microsoft.XMLHTTP')"}catch(h){}}var g=new Function("return new "+a);return{request:function(a,e){e&&"jsonp"==e.dataType?b(a,e):c(a,e)},getJSONP:function(a,e,c){b(a,{data:e,oncomplete:c})}}}();UE.filterWord=function(){function d(b){return b=b.replace(/[\d.]+\w+/g,
+function(a){return p.transUnitToPx(a)})}function c(b){return b.replace(/[\t\r\n]+/g," ").replace(/\x3c!--[\s\S]*?--\x3e/ig,"").replace(/<v:shape [^>]*>[\s\S]*?.<\/v:shape>/gi,function(a){if(r.opera)return"";try{if(/Bitmap/i.test(a))return"";var b=a.match(/width:([ \d.]*p[tx])/i)[1],c=a.match(/height:([ \d.]*p[tx])/i)[1],g=a.match(/src=\s*"([^"]*)"/i)[1];return'<img width="'+d(b)+'" height="'+d(c)+'" src="'+g+'" />'}catch(l){return""}}).replace(/<\/?div[^>]*>/g,"").replace(/v:\w+=(["']?)[^'"]+\1/g,
+"").replace(/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi,"").replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>").replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/ig,function(a,b,c,g){return"class"==b&&"MsoListParagraph"==g?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,b,c,g){a=[];
+g=g.replace(/^\s+|\s+$/,"").replace(/&#39;/g,"'").replace(/&quot;/gi,"'").replace(/[\d.]+(cm|pt)/g,function(a){return p.transUnitToPx(a)}).split(/;\s*/g);c=0;for(var l;l=g[c];c++){var k,f=l.split(":");if(2==f.length&&(l=f[0].toLowerCase(),k=f[1].toLowerCase(),!(/^(background)\w*/.test(l)&&0==k.replace(/(initial|\s)/g,"").length||/^(margin)\w*/.test(l)&&/^0\w+$/.test(k)))){switch(l){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":/<table/.test(b)||
+(a[c]=l.replace(/^mso-|-alt$/g,"")+":"+d(k));continue;case "horiz-align":a[c]="text-align:"+k;continue;case "vert-align":a[c]="vertical-align:"+k;continue;case "font-color":case "mso-foreground":a[c]="color:"+k;continue;case "mso-background":case "mso-highlight":a[c]="background:"+k;continue;case "mso-default-height":a[c]="min-height:"+d(k);continue;case "mso-default-width":a[c]="min-width:"+d(k);continue;case "mso-padding-between-alt":a[c]="border-collapse:separate;border-spacing:"+d(k);continue;
+case "text-line-through":if("single"==k||"double"==k)a[c]="text-decoration:line-through";continue;case "mso-zero-height":"yes"==k&&(a[c]="display:none");continue;case "margin":if(!/[1-9]/.test(k))continue}/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test(l)||/text\-indent|padding|margin/.test(l)&&/\-[\d.]+/.test(k)||(a[c]=l+":"+f[1])}}return b+(a.length?' style="'+a.join(";").replace(/;{2,}/g,
+";")+'"':"")})}return function(b){return/(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/ig.test(b)?c(b):b}}();(function(){function d(a,b,e){a.push(q);return b+(e?1:-1)}function c(a,b){for(var e=0;e<b;e++)a.push(n)}function b(e,g,h,k){switch(e.type){case "root":for(var l=0,n;n=e.children[l++];)h&&"element"==n.type&&!v.$inlineWithA[n.tagName]&&1<l&&(d(g,k,!0),c(g,k)),b(n,g,h,k);break;case "text":"pre"==e.parentNode.tagName?g.push(e.data):g.push(f[e.parentNode.tagName]?p.html(e.data):
+e.data.replace(/[ ]{2}/g," &nbsp;"));break;case "element":a(e,g,h,k);break;case "comment":g.push("\x3c!--"+e.data+"--\x3e")}return g}function a(a,e,g,h){var l="";if(a.attrs){var l=[],f=a.attrs,n;for(n in f)l.push(n+(void 0!==f[n]?'="'+(k[n]?p.html(f[n]).replace(/["]/g,function(a){return"&quot;"}):p.unhtml(f[n]))+'"':""));l=l.join(" ")}e.push("<"+a.tagName+(l?" "+l:"")+(v.$empty[a.tagName]?"/":"")+">");g&&!v.$inlineWithA[a.tagName]&&"pre"!=a.tagName&&a.children&&a.children.length&&(h=d(e,h,!0),c(e,
+h));if(a.children&&a.children.length)for(l=0;f=a.children[l++];)g&&"element"==f.type&&!v.$inlineWithA[f.tagName]&&1<l&&(d(e,h),c(e,h)),b(f,e,g,h);v.$empty[a.tagName]||(g&&!v.$inlineWithA[a.tagName]&&"pre"!=a.tagName&&a.children&&a.children.length&&(h=d(e,h),c(e,h)),e.push("</"+a.tagName+">"))}function e(a,b){var c;if("element"==a.type&&a.getAttr("id")==b)return a;if(a.children&&a.children.length)for(var g=0;c=a.children[g++];)if(c=e(c,b))return c}function h(a,b,e){"element"==a.type&&a.tagName==b&&
+e.push(a);if(a.children&&a.children.length)for(var c=0,g;g=a.children[c++];)h(g,b,e)}function g(a,b){if(a.children&&a.children.length)for(var e=0,c;c=a.children[e];)g(c,b),c.parentNode&&(c.children&&c.children.length&&b(c),c.parentNode&&e++);else b(a)}var l=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},f={style:1,script:1},n="    ",q="\n";l.createElement=
+function(a){return/[<>]/.test(a)?UE.htmlparser(a).children[0]:new l({type:"element",children:[],tagName:a})};l.createText=function(a,b){return new UE.uNode({type:"text",data:b?a:p.unhtml(a||"")})};l.prototype={toHtml:function(a){var e=[];b(this,e,a,0);return e.join("")},innerHTML:function(a){if("element"!=this.type||v.$empty[this.tagName])return this;if(p.isString(a)){if(this.children)for(var b=0,e;e=this.children[b++];)e.parentNode=null;this.children=[];a=UE.htmlparser(a);for(b=0;e=a.children[b++];)this.children.push(e),
+e.parentNode=this;return this}a=new UE.uNode({type:"root",children:this.children});return a.toHtml()},innerText:function(a,b){if("element"!=this.type||v.$empty[this.tagName])return this;if(a){if(this.children)for(var e=0,c;c=this.children[e++];)c.parentNode=null;this.children=[];this.appendChild(l.createText(a,b));return 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=this.parentNode,b=0,e;e=a.children[b];b++)if(e===this)return 0==b?null:a.children[b-1]},nextSibling:function(){for(var a=this.parentNode,b=0,e;e=a.children[b++];)if(e===this)return a.children[b]},replaceChild:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var e=0,c;c=this.children[e];e++)if(c===b)return this.children.splice(e,1,a),b.parentNode=null,a.parentNode=this,a}},appendChild:function(a){if("root"==
+this.type||"element"==this.type&&!v.$empty[this.tagName]){this.children||(this.children=[]);a.parentNode&&a.parentNode.removeChild(a);for(var b=0,e;e=this.children[b];b++)if(e===a){this.children.splice(b,1);break}this.children.push(a);a.parentNode=this;return a}},insertBefore:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var e=0,c;c=this.children[e];e++)if(c===b)return this.children.splice(e,0,a),a.parentNode=this,a}},insertAfter:function(a,b){if(this.children){a.parentNode&&
+a.parentNode.removeChild(a);for(var e=0,c;c=this.children[e];e++)if(c===b)return this.children.splice(e+1,0,a),a.parentNode=this,a}},removeChild:function(a,b){if(this.children)for(var e=0,c;c=this.children[e];e++)if(c===a){this.children.splice(e,1);c.parentNode=null;if(b&&c.children&&c.children.length)for(var g=0,h;h=c.children[g];g++)this.children.splice(e+g,0,h),h.parentNode=this;return c}},getAttr:function(a){return this.attrs&&this.attrs[a.toLowerCase()]},setAttr:function(a,b){if(a)if(this.attrs||
+(this.attrs={}),p.isObject(a))for(var e in a)a[e]?this.attrs[e.toLowerCase()]=a[e]:delete this.attrs[e];else b?this.attrs[a.toLowerCase()]=b:delete this.attrs[a];else delete this.attrs},getIndex:function(){for(var a=this.parentNode,b=0,e;e=a.children[b];b++)if(e===this)return b;return-1},getNodeById:function(a){var b;if(this.children&&this.children.length)for(var c=0;b=this.children[c++];)if(b=e(b,a))return b},getNodesByTagName:function(a){a=p.trim(a).replace(/[ ]{2,}/g," ").split(" ");var b=[],e=
+this;p.each(a,function(a){if(e.children&&e.children.length)for(var c=0,g;g=e.children[c++];)h(g,a,b)});return b},getStyle:function(a){var b=this.getAttr("style");return b?(a=b.match(RegExp("(^|;)\\s*"+a+":([^;]+)","i")))&&a[0]?a[2]:"":""},setStyle:function(a,b){function e(a,b){c=c.replace(RegExp("(^|;)\\s*"+a+":([^;]+;?)","gi"),"$1");b&&(c=a+":"+p.unhtml(b)+";"+c)}var c=this.getAttr("style");c||(c="");if(p.isObject(a))for(var g in a)e(g,a[g]);else e(a,b);this.setAttr("style",p.trim(c))},traversal:function(a){this.children&&
+this.children.length&&g(this,a);return this}}})();UE.htmlparser=function(d,c){function b(a,b){if(n[a.tagName]){var e=k.createElement(n[a.tagName]);a.appendChild(e);e.appendChild(k.createText(b))}else a.appendChild(k.createText(b))}function a(b,e,c){var g;if(g=m[e]){for(var d=b,f;"root"!=d.type;){if(p.isArray(g)?-1!=p.indexOf(g,d.tagName):g==d.tagName){b=d;f=!0;break}d=d.parentNode}f||(b=a(b,p.isArray(g)?g[0]:g))}g=new k({parentNode:b,type:"element",tagName:e.toLowerCase(),children:v.$empty[e]?null:
+[]});if(c){for(d={};f=h.exec(c);)d[f[1].toLowerCase()]=l[f[1].toLowerCase()]?f[2]||f[3]||f[4]:p.unhtml(f[2]||f[3]||f[4]);g.attrs=d}b.children.push(g);return v.$empty[e]?b:g}var e=/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)--\x3e)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,h=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,g={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};
+d=d.replace(RegExp(f.fillChar,"g"),"");c||(d=d.replace(RegExp("[\\r\\t\\n"+(c?"":" ")+"]*</?(\\w+)\\s*(?:[^>]*)>[\\r\\t\\n"+(c?"":" ")+"]*","g"),function(a,b){return b&&g[b.toLowerCase()]?a.replace(/(^[\n\r]+)|([\n\r]+$)/g,""):a.replace(RegExp("^[\\r\\n"+(c?"":" ")+"]+"),"").replace(RegExp("[\\r\\n"+(c?"":" ")+"]+$"),"")}));for(var l={href:1,src:1},k=UE.uNode,m={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"},
+n={ol:"li",ul:"li"},q,t=0,w=0,y=new k({type:"root",children:[]}),u=y;q=e.exec(d);){t=q.index;try{if(t>w&&b(u,d.slice(w,t)),q[3])v.$cdata[u.tagName]?b(u,q[0]):u=a(u,q[3].toLowerCase(),q[4]);else if(q[1]){if("root"!=u.type)if(v.$cdata[u.tagName]&&!v.$cdata[q[1]])b(u,q[0]);else{for(t=u;"element"==u.type&&u.tagName!=q[1].toLowerCase();)if(u=u.parentNode,"root"==u.type)throw u=t,"break";u=u.parentNode}}else q[2]&&u.children.push(new k({type:"comment",data:q[2],parentNode:u}))}catch(C){}w=e.lastIndex}w<
+d.length&&b(u,d.slice(w));return y};UE.filterNode=function(){function d(c,b){switch(c.type){case "element":var a;if(a=b[c.tagName])if("-"===a)c.parentNode.removeChild(c);else if(p.isFunction(a)){var e=c.parentNode,h=c.getIndex();a(c);if(c.parentNode){if(c.children)for(a=0;h=c.children[a];)d(h,b),h.parentNode&&a++}else for(a=h;h=e.children[a];)d(h,b),h.parentNode&&a++}else{if((a=a.$)&&c.attrs){var h={},g;for(e in a){g=c.getAttr(e);if("style"==e&&p.isArray(a[e])){var l=[];p.each(a[e],function(a){var b;
+(b=c.getStyle(a))&&l.push(a+":"+b)});g=l.join(";")}g&&(h[e]=g)}c.attrs=h}if(c.children)for(a=0;h=c.children[a];)d(h,b),h.parentNode&&a++}else if(v.$cdata[c.tagName])c.parentNode.removeChild(c);else for(e=c.parentNode,h=c.getIndex(),c.parentNode.removeChild(c,!0),a=h;h=e.children[a];)d(h,b),h.parentNode&&a++;break;case "comment":c.parentNode.removeChild(c)}}return function(c,b){if(p.isEmptyObject(b))return c;var a;(a=b["-"])&&p.each(a.split(" "),function(a){b[a]="-"});a=0;for(var e;e=c.children[a];)d(e,
+b),e.parentNode&&a++;return c}}();UE.plugin=function(){var d={};return{register:function(c,b,a,e){a&&p.isFunction(a)&&(e=a,a=null);d[c]={optionName:a||c,execFn:b,afterDisabled:e}},load:function(c){p.each(d,function(b){var a=b.execFn.call(c);!1!==c.options[b.optionName]?a&&p.each(a,function(a,b){switch(b.toLowerCase()){case "shortcutkey":c.addshortcutkey(a);break;case "bindevents":p.each(a,function(a,b){c.addListener(b,a)});break;case "bindmultievents":p.each(p.isArray(a)?a:[a],function(a){var b=p.trim(a.type).split(/\s+/);
+p.each(b,function(b){c.addListener(b,a.handler)})});break;case "commands":p.each(a,function(a,b){c.commands[b]=a});break;case "outputrule":c.addOutputRule(a);break;case "inputrule":c.addInputRule(a);break;case "defaultoptions":c.setOpt(a)}}):b.afterDisabled&&b.afterDisabled.call(c)});p.each(UE.plugins,function(b){b.call(c)})},run:function(c,b){var a=d[c];a&&a.exeFn.call(b)}}}();var $=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},Y=UE.LocalStorage=function(){function d(){var a=document.createElement("div");a.style.display="none";if(!a.addBehavior)return null;a.addBehavior("#default#userdata");return{getItem:function(e){var c=null;try{document.body.appendChild(a),a.load(b),c=a.getAttribute(e),document.body.removeChild(a)}catch(g){}return c},setItem:function(e,c){document.body.appendChild(a);
+a.setAttribute(e,c);a.save(b);document.body.removeChild(a)},removeItem:function(e){document.body.appendChild(a);a.removeAttribute(e);a.save(b);document.body.removeChild(a)}}}var c=window.localStorage||d()||null,b="localStorage";return{saveLocalData:function(a,b){return c&&b?(c.setItem(a,b),!0):!1},getLocalData:function(a){return c?c.getItem(a):null},removeItem:function(a){c&&c.removeItem(a)}}}();(function(){UE.Editor.prototype.setPreferences=function(d,c){var b={};p.isString(d)?b[d]=c:b=d;var a=Y.getLocalData("ueditor_preference");
+a&&(a=p.str2json(a))?p.extend(a,b):a=b;a&&Y.saveLocalData("ueditor_preference",p.json2str(a))};UE.Editor.prototype.getPreferences=function(d){var c=Y.getLocalData("ueditor_preference");return c&&(c=p.str2json(c))?d?c[d]:c:null};UE.Editor.prototype.removePreferences=function(d){var c=Y.getLocalData("ueditor_preference");c&&(c=p.str2json(c))&&(c[d]=void 0,delete c[d]);c&&Y.saveLocalData("ueditor_preference",p.json2str(c))}})();UE.plugins.defaultfilter=function(){var d=this;d.setOpt({allowDivTransToP:!0,
+disabledTableInTable:!0});d.addInputRule(function(c){function b(a){for(;a&&"element"==a.type;){if("td"==a.tagName)return!0;a=a.parentNode}return!1}var a=this.options.allowDivTransToP,e;c.traversal(function(c){if("element"==c.type)if(v.$cdata[c.tagName]||!d.options.autoClearEmptyNode||!v.$inline[c.tagName]||v.$empty[c.tagName]||c.attrs&&!p.isEmptyObject(c.attrs))switch(c.tagName){case "style":case "script":c.setAttr({cdata_tag:c.tagName,cdata_data:c.innerHTML()||"",_ue_custom_node_:"true"});c.tagName=
+"div";c.innerHTML("");break;case "a":(e=c.getAttr("href"))&&c.setAttr("_href",e);break;case "img":if((e=c.getAttr("src"))&&/^data:/.test(e)){c.parentNode.removeChild(c);break}c.setAttr("_src",c.getAttr("src"));break;case "span":r.webkit&&(e=c.getStyle("white-space"))&&/nowrap|normal/.test(e)&&(c.setStyle("white-space",""),d.options.autoClearEmptyNode&&p.isEmptyObject(c.attrs)&&c.parentNode.removeChild(c,!0));(e=c.getAttr("id"))&&/^_baidu_bookmark_/i.test(e)&&c.parentNode.removeChild(c);break;case "p":if(e=
+c.getAttr("align"))c.setAttr("align"),c.setStyle("text-align",e);p.each(c.children,function(a){if("element"==a.type&&"p"==a.tagName){var b=a.nextSibling();for(c.parentNode.insertAfter(a,c);b;){var e=b.nextSibling();c.parentNode.insertAfter(b,a);a=b;b=e}return!1}});c.firstChild()||c.innerHTML(r.ie?"&nbsp;":"<br/>");break;case "div":if(c.getAttr("cdata_tag"))break;if((e=c.getAttr("class"))&&/^line number\d+/.test(e))break;if(!a)break;for(var g,l=UE.uNode.createElement("p");g=c.firstChild();)"text"!=
+g.type&&UE.dom.dtd.$block[g.tagName]?l.firstChild()?(c.parentNode.insertBefore(l,c),l=UE.uNode.createElement("p")):c.parentNode.insertBefore(g,c):l.appendChild(g);l.firstChild()&&c.parentNode.insertBefore(l,c);c.parentNode.removeChild(c);break;case "dl":c.tagName="ul";break;case "dt":case "dd":c.tagName="li";break;case "li":(g=c.getAttr("class"))&&/list\-/.test(g)||c.setAttr();g=c.getNodesByTagName("ol ul");UE.utils.each(g,function(a){c.parentNode.insertAfter(a,c)});break;case "td":case "th":case "caption":c.children&&
+c.children.length||c.appendChild(r.ie11below?UE.uNode.createText(" "):UE.uNode.createElement("br"));break;case "table":d.options.disabledTableInTable&&b(c)&&(c.parentNode.insertBefore(UE.uNode.createText(c.innerText()),c),c.parentNode.removeChild(c))}else c.firstChild()?"span"!=c.tagName||c.attrs&&!p.isEmptyObject(c.attrs)||c.parentNode.removeChild(c,!0):c.parentNode.removeChild(c)})});d.addOutputRule(function(c){var b;c.traversal(function(a){if("element"==a.type)if(!d.options.autoClearEmptyNode||
+!v.$inline[a.tagName]||v.$empty[a.tagName]||a.attrs&&!p.isEmptyObject(a.attrs))switch(a.tagName){case "div":if(b=a.getAttr("cdata_tag"))a.tagName=b,a.appendChild(UE.uNode.createText(a.getAttr("cdata_data"))),a.setAttr({cdata_tag:"",cdata_data:"",_ue_custom_node_:""});break;case "a":(b=a.getAttr("_href"))&&a.setAttr({href:p.html(b),_href:""});break;case "span":(b=a.getAttr("id"))&&/^_baidu_bookmark_/i.test(b)&&a.parentNode.removeChild(a);break;case "img":(b=a.getAttr("_src"))&&a.setAttr({src:a.getAttr("_src"),
+_src:""})}else a.firstChild()?"span"!=a.tagName||a.attrs&&!p.isEmptyObject(a.attrs)||a.parentNode.removeChild(a,!0):a.parentNode.removeChild(a)})})};UE.commands.inserthtml={execCommand:function(d,c,b){var a=this,e;if(c&&!0!==a.fireEvent("beforeinserthtml",c)){e=a.selection.getRange();d=e.document.createElement("div");d.style.display="inline";b||(b=UE.htmlparser(c),a.options.filterRules&&UE.filterNode(b,a.options.filterRules),a.filterInputRule(b),c=b.toHtml());d.innerHTML=p.trim(c);if(!e.collapsed&&
+(b=e.startContainer,f.isFillChar(b)&&e.setStartBefore(b),b=e.endContainer,f.isFillChar(b)&&e.setEndAfter(b),e.txtToElmBoundary(),e.endContainer&&1==e.endContainer.nodeType&&(b=e.endContainer.childNodes[e.endOffset])&&f.isBr(b)&&e.setEndAfter(b),0==e.startOffset&&(b=e.startContainer,f.isBoundaryNode(b,"firstChild")&&(b=e.endContainer,e.endOffset==(3==b.nodeType?b.nodeValue.length:b.childNodes.length)&&f.isBoundaryNode(b,"lastChild")&&(a.body.innerHTML="<p>"+(r.ie?"":"<br/>")+"</p>",e.setStart(a.body.firstChild,
+0).collapse(!0)))),!e.collapsed&&e.deleteContents(),1==e.startContainer.nodeType)){b=e.startContainer.childNodes[e.startOffset];var h;if(b&&f.isBlockElm(b)&&(h=b.previousSibling)&&f.isBlockElm(h)){for(e.setEnd(h,h.childNodes.length).collapse();b.firstChild;)h.appendChild(b.firstChild);f.remove(b)}}var g,l,k=0,m;e.inFillChar()&&(b=e.startContainer,f.isFillChar(b)?(e.setStartBefore(b).collapse(!0),f.remove(b)):f.isFillChar(b,!0)&&(b.nodeValue=b.nodeValue.replace(P,""),e.startOffset--,e.collapsed&&e.collapse(!0)));
+var n=f.findParentByTagName(e.startContainer,"li",!0);if(n){for(var q;b=d.firstChild;){for(;b&&(3==b.nodeType||!f.isBlockElm(b)||"HR"==b.tagName);)q=b.nextSibling,e.insertNode(b).collapse(),g=b,b=q;if(b)if(/^(ol|ul)$/i.test(b.tagName)){for(;b.firstChild;)g=b.firstChild,f.insertAfter(n,b.firstChild),n=n.nextSibling;f.remove(b)}else q=b.nextSibling,h=a.document.createElement("li"),f.insertAfter(n,h),h.appendChild(b),g=b,b=q,n=h}n=f.findParentByTagName(e.startContainer,"li",!0);f.isEmptyBlock(n)&&f.remove(n);
+g&&e.setStartAfter(g).collapse(!0).select(!0)}else{for(;b=d.firstChild;){if(k){for(g=a.document.createElement("p");b&&(3==b.nodeType||!v.$block[b.tagName]);)m=b.nextSibling,g.appendChild(b),b=m;g.firstChild&&(b=g)}e.insertNode(b);m=b.nextSibling;if(!k&&b.nodeType==f.NODE_ELEMENT&&f.isBlockElm(b)&&(g=f.findParent(b,function(a){return f.isBlockElm(a)}))&&"body"!=g.tagName.toLowerCase()&&(!v[g.tagName][b.nodeName]||b.parentNode!==g)){if(v[g.tagName][b.nodeName])for(l=b.parentNode;l!==g;)h=l,l=l.parentNode;
+else h=g;f.breakParent(b,h||l);h=b.previousSibling;f.trimWhiteTextNode(h);h.childNodes.length||f.remove(h);!r.ie&&(q=b.nextSibling)&&f.isBlockElm(q)&&q.lastChild&&!f.isBr(q.lastChild)&&q.appendChild(a.document.createElement("br"));k=1}q=b.nextSibling;if(!d.firstChild&&q&&f.isBlockElm(q)){e.setStart(q,0).collapse(!0);break}e.setEndAfter(b).collapse()}b=e.startContainer;m&&f.isBr(m)&&f.remove(m);if(f.isBlockElm(b)&&f.isEmptyNode(b))if(m=b.nextSibling)f.remove(b),1==m.nodeType&&v.$block[m.tagName]&&
+e.setStart(m,0).collapse(!0).shrinkBoundary();else try{b.innerHTML=r.ie?f.fillChar:"<br/>"}catch(t){e.setStartBefore(b),f.remove(b)}try{e.select(!0)}catch(w){}}setTimeout(function(){e=a.selection.getRange();e.scrollToView(a.autoHeightEnabled,a.autoHeightEnabled?f.getXY(a.iframe).y:0);a.fireEvent("afterinserthtml",c)},200)}}};UE.plugins.autotypeset=function(){function d(a,b){if(!a||3==a.nodeType)return 0;if(f.isBr(a))return 1;if(a&&a.parentNode&&k[a.tagName.toLowerCase()])return m&&m.contains(a)||
+a.getAttribute("pagebreak")?0:b?!f.isEmptyBlock(a):f.isEmptyBlock(a,RegExp("[\\s"+f.fillChar+"]","g"))}function c(a){a.style.cssText||(f.removeAttributes(a,["style"]),"span"==a.tagName.toLowerCase()&&f.hasNoAttributes(a)&&f.remove(a,!0))}function b(a,b){var e;if(b){if(!h.pasteFilter)return;e=this.document.createElement("div");e.innerHTML=b.html}else e=this.document.body;for(var k=f.getElementsByTagName(e,"*"),y=0,u;u=k[y++];)if(!0!==this.fireEvent("excludeNodeinautotype",u)){h.clearFontSize&&u.style.fontSize&&
+(f.removeStyle(u,"font-size"),c(u));h.clearFontFamily&&u.style.fontFamily&&(f.removeStyle(u,"font-family"),c(u));if(d(u)){if(h.mergeEmptyline)for(var C=u.nextSibling,E,G=f.isBr(u);d(C);){E=C;C=E.nextSibling;if(G&&(!C||C&&!f.isBr(C)))break;f.remove(E)}if(h.removeEmptyline&&f.inDoc(u,e)&&!l[u.parentNode.tagName.toLowerCase()]){if(f.isBr(u)&&(C=u.nextSibling)&&!f.isBr(C))continue;f.remove(u);continue}}d(u,!0)&&"SPAN"!=u.tagName&&(h.indent&&(u.style.textIndent=h.indentValue),h.textAlign&&(u.style.textAlign=
+h.textAlign));if(h.removeClass&&u.className&&!g[u.className.toLowerCase()]){if(m&&m.contains(u))continue;f.removeAttributes(u,["class"])}if(h.imageBlockLine&&"img"==u.tagName.toLowerCase()&&!u.getAttribute("emotion"))if(b)switch(G=u,h.imageBlockLine){case "left":case "right":case "none":for(var C=G.parentNode,r;v.$inline[C.tagName]||"A"==C.tagName;)C=C.parentNode;E=C;if("P"==E.tagName&&"center"==f.getStyle(E,"text-align")&&!f.isBody(E)&&1==f.getChildCount(E,function(a){return!f.isBr(a)&&!f.isWhitespace(a)}))if(r=
+E.previousSibling,C=E.nextSibling,r&&C&&1==r.nodeType&&1==C.nodeType&&r.tagName==C.tagName&&f.isBlockElm(r)){for(r.appendChild(E.firstChild);C.firstChild;)r.appendChild(C.firstChild);f.remove(E);f.remove(C)}else f.setStyle(E,"text-align","");f.setStyle(G,"float",h.imageBlockLine);break;case "center":if("center"!=this.queryCommandValue("imagefloat")){C=G.parentNode;f.setStyle(G,"float","none");for(E=G;C&&1==f.getChildCount(C,function(a){return!f.isBr(a)&&!f.isWhitespace(a)})&&(v.$inline[C.tagName]||
+"A"==C.tagName);)E=C,C=C.parentNode;C=this.document.createElement("p");f.setAttributes(C,{style:"text-align:center"});E.parentNode.insertBefore(C,E);C.appendChild(E);f.setStyle(E,"float","")}}else this.selection.getRange().selectNode(u).select(),this.execCommand("imagefloat",h.imageBlockLine);h.removeEmptyNode&&h.removeTagNames[u.tagName.toLowerCase()]&&f.hasNoAttributes(u)&&f.isEmptyBlock(u)&&f.remove(u)}h.tobdc&&(k=UE.htmlparser(e.innerHTML),k.traversal(function(a){if("text"==a.type){for(var b=
+a.data,b=p.html(b),e="",c=0;c<b.length;c++)e=32==b.charCodeAt(c)?e+String.fromCharCode(12288):127>b.charCodeAt(c)?e+String.fromCharCode(b.charCodeAt(c)+65248):e+b.charAt(c);a.data=e}}),e.innerHTML=k.toHtml());h.bdc2sb&&(k=UE.htmlparser(e.innerHTML),k.traversal(function(a){if("text"==a.type){for(var b=a.data,e="",c=0;c<b.length;c++)var g=b.charCodeAt(c),e=65281<=g&&65373>=g?e+String.fromCharCode(b.charCodeAt(c)-65248):12288==g?e+String.fromCharCode(b.charCodeAt(c)-12288+32):e+b.charAt(c);a.data=e}}),
+e.innerHTML=k.toHtml());b&&(b.html=e.innerHTML)}function a(){var a=e.getPreferences("autotypeset");p.extend(e.options.autotypeset,a)}this.setOpt({autotypeset:{mergeEmptyline:!0,removeClass:!0,removeEmptyline:!1,textAlign:"left",imageBlockLine:"center",pasteFilter:!1,clearFontSize:!1,clearFontFamily:!1,removeEmptyNode:!1,removeTagNames:p.extend({div:1},v.$removeEmpty),indent:!1,indentValue:"2em",bdc2sb:!1,tobdc:!1}});var e=this,h=e.options.autotypeset,g={selectTdClass:1,pagebreak:1,anchorclass:1},
+l={li:1},k={div:1,p:1,blockquote:1,center:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,span:1},m;h&&(a(),h.pasteFilter&&e.addListener("beforepaste",b),e.commands.autotypeset={execCommand:function(){e.removeListener("beforepaste",b);h.pasteFilter&&e.addListener("beforepaste",b);b.call(e)}})};UE.plugin.register("autosubmit",function(){return{shortcutkey:{autosubmit:"ctrl+13"},commands:{autosubmit:{execCommand:function(){var d=f.findParentByTagName(this.iframe,"form",!1);d&&!1!==this.fireEvent("beforesubmit")&&(this.sync(),
+d.submit())}}}}});UE.plugin.register("background",function(){function d(a){var b={};a=a.split(";");p.each(a,function(a){var e=a.indexOf(":"),c=p.trim(a.substr(0,e)).toLowerCase();c&&(b[c]=p.trim(a.substr(e+1)||""))});return b}function c(e){if(e){var c=[],g;for(g in e)e.hasOwnProperty(g)&&c.push(g+":"+e[g]+"; ");p.cssRule(a,c.length?"body{"+c.join("")+"}":"",b.document)}else p.cssRule(a,"",b.document)}var b=this,a="editor_background",e,h=/body[\s]*\{(.+)\}/i,g=b.hasContents;b.hasContents=function(){return b.queryCommandValue("background")?
+!0:g.apply(b,arguments)};return{bindEvents:{getAllHtml:function(a,e){var c=this.body,g=f.getComputedStyle(c,"background-image"),h="",h=0<g.indexOf(b.options.imagePath)?g.substring(g.indexOf(b.options.imagePath),g.length-1).replace(/"|\(|\)/ig,""):"none"!=g?g.replace(/url\("?|"?\)/ig,""):"",g='<style type="text/css">body{',c={"background-color":f.getComputedStyle(c,"background-color")||"#ffffff","background-image":h?"url("+h+")":"","background-repeat":f.getComputedStyle(c,"background-repeat")||"",
+"background-position":r.ie?f.getComputedStyle(c,"background-position-x")+" "+f.getComputedStyle(c,"background-position-y"):f.getComputedStyle(c,"background-position"),height:f.getComputedStyle(c,"height")},d;for(d in c)c.hasOwnProperty(d)&&(g+=d+":"+c[d]+"; ");e.push(g+"}</style> ")},aftersetcontent:function(){!1==e&&c()}},inputRule:function(a){e=!1;p.each(a.getNodesByTagName("p"),function(a){var b=a.getAttr("data-background");b&&(e=!0,c(d(b)),a.parentNode.removeChild(a))})},outputRule:function(b){var e=
+(p.cssRule(a,this.document)||"").replace(/[\n\r]+/g,"").match(h);e&&b.appendChild(UE.uNode.createElement('<p style="display:none;" data-background="'+p.trim(e[1].replace(/"/g,"").replace(/[\s]+/g," "))+'"><br/></p>'))},commands:{background:{execCommand:function(a,b){c(b)},queryCommandValue:function(){var b=(p.cssRule(a,this.document)||"").replace(/[\n\r]+/g,"").match(h);return b?d(b[1]):null},notNeedUndo:!0}}}});UE.commands.imagefloat={execCommand:function(d,c){var b=this.selection.getRange();if(!b.collapsed){var a=
+b.getClosedNode();if(a&&"IMG"==a.tagName)switch(c){case "left":case "right":case "none":for(var e=a.parentNode,h,g;v.$inline[e.tagName]||"A"==e.tagName;)e=e.parentNode;h=e;if("P"==h.tagName&&"center"==f.getStyle(h,"text-align")){if(!f.isBody(h)&&1==f.getChildCount(h,function(a){return!f.isBr(a)&&!f.isWhitespace(a)}))if(e=h.previousSibling,g=h.nextSibling,e&&g&&1==e.nodeType&&1==g.nodeType&&e.tagName==g.tagName&&f.isBlockElm(e)){for(e.appendChild(h.firstChild);g.firstChild;)e.appendChild(g.firstChild);
+f.remove(h);f.remove(g)}else f.setStyle(h,"text-align","");b.selectNode(a).select()}f.setStyle(a,"float","none"==c?"":c);"none"==c&&f.removeAttributes(a,"align");break;case "center":if("center"!=this.queryCommandValue("imagefloat")){e=a.parentNode;f.setStyle(a,"float","");f.removeAttributes(a,"align");for(h=a;e&&1==f.getChildCount(e,function(a){return!f.isBr(a)&&!f.isWhitespace(a)})&&(v.$inline[e.tagName]||"A"==e.tagName);)h=e,e=e.parentNode;b.setStartBefore(h).setCursor(!1);e=this.document.createElement("div");
+e.appendChild(h);f.setStyle(h,"float","");this.execCommand("insertHtml",'<p id="_img_parent_tmp" style="text-align:center">'+e.innerHTML+"</p>");h=this.document.getElementById("_img_parent_tmp");h.removeAttribute("id");h=h.firstChild;b.selectNode(h).select();(g=h.parentNode.nextSibling)&&f.isEmptyNode(g)&&f.remove(g)}}}},queryCommandValue:function(){var d=this.selection.getRange(),c;return d.collapsed?"none":(d=d.getClosedNode())&&1==d.nodeType&&"IMG"==d.tagName?(c=f.getComputedStyle(d,"float")||
+d.getAttribute("align"),"none"==c&&(c="center"==f.getComputedStyle(d.parentNode,"text-align")?"center":c),{left:1,right:1,center:1}[c]?c:"none"):"none"},queryCommandState:function(){var d=this.selection.getRange();return d.collapsed?-1:(d=d.getClosedNode())&&1==d.nodeType&&"IMG"==d.tagName?0:-1}};UE.commands.insertimage={execCommand:function(d,c){c=p.isArray(c)?c:[c];if(c.length){var b=this.selection.getRange(),a=b.getClosedNode();if(!0!==this.fireEvent("beforeinsertimage",c)){if(!a||!/img/i.test(a.tagName)||
+"edui-faked-video"==a.className&&-1==a.className.indexOf("edui-upload-video")||a.getAttribute("word_img")){var b=[],a="",e;e=c[0];if(1==c.length)a='<img src="'+e.src+'" '+(e._src?' _src="'+e._src+'" ':"")+(e.width?'width="'+e.width+'" ':"")+(e.height?' height="'+e.height+'" ':"")+("left"==e.floatStyle||"right"==e.floatStyle?' style="float:'+e.floatStyle+';"':"")+(e.title&&""!=e.title?' title="'+e.title+'"':"")+(e.border&&"0"!=e.border?' border="'+e.border+'"':"")+(e.alt&&""!=e.alt?' alt="'+e.alt+
+'"':"")+(e.hspace&&"0"!=e.hspace?' hspace = "'+e.hspace+'"':"")+(e.vspace&&"0"!=e.vspace?' vspace = "'+e.vspace+'"':"")+"/>","center"==e.floatStyle&&(a='<p style="text-align: center">'+a+"</p>"),b.push(a);else for(var h=0;e=c[h++];)a="<p "+("center"==e.floatStyle?'style="text-align: center" ':"")+'><img src="'+e.src+'" '+(e.width?'width="'+e.width+'" ':"")+(e._src?' _src="'+e._src+'" ':"")+(e.height?' height="'+e.height+'" ':"")+' style="'+(e.floatStyle&&"center"!=e.floatStyle?"float:"+e.floatStyle+
+";":"")+(e.border||"")+'" '+(e.title?' title="'+e.title+'"':"")+" /></p>",b.push(a);this.execCommand("insertHtml",b.join(""))}else e=c.shift(),h=e.floatStyle,delete e.floatStyle,f.setAttributes(a,e),this.execCommand("imagefloat",h),0<c.length&&(b.setStartAfter(a).setCursor(!1,!0),this.execCommand("insertimage",c));this.fireEvent("afterinsertimage",c)}}}};UE.plugins.justify=function(){var d=f.isBlockElm,c={left:1,right:1,center:1,justify:1},b=function(a,b){var c=a.createBookmark(),g=function(a){return 1==
+a.nodeType?"br"!=a.tagName.toLowerCase()&&!f.isBookmarkNode(a):!f.isWhitespace(a)};a.enlarge(!0);for(var l=a.createBookmark(),k=f.getNextDomNode(l.start,!1,g),m=a.cloneRange(),n;k&&!(f.getPosition(k,l.end)&f.POSITION_FOLLOWING);)if(3!=k.nodeType&&d(k))k=f.getNextDomNode(k,!0,g);else{for(m.setStartBefore(k);k&&k!==l.end&&!d(k);)n=k,k=f.getNextDomNode(k,!1,null,function(a){return!d(a)});m.setEndAfter(n);k=m.getCommonAncestor();if(!f.isBody(k)&&d(k))f.setStyles(k,p.isString(b)?{"text-align":b}:b);else{k=
+a.document.createElement("p");f.setStyles(k,p.isString(b)?{"text-align":b}:b);var q=m.extractContents();k.appendChild(q);m.insertNode(k)}k=f.getNextDomNode(k,!1,g)}return a.moveToBookmark(l).moveToBookmark(c)};UE.commands.justify={execCommand:function(a,e){var c=this.selection.getRange(),g;c.collapsed&&(g=this.document.createTextNode("p"),c.insertNode(g));b(c,e);g&&(c.setStartBefore(g).collapse(!0),f.remove(g));c.select();return!0},queryCommandValue:function(){var a=this.selection.getStart(),a=f.getComputedStyle(a,
+"text-align");return c[a]?a:"left"},queryCommandState:function(){var a=this.selection.getStart();return a&&f.findParentByTagName(a,["td","th","caption"],!0)?-1:0}}};UE.plugins.font=function(){function d(a){for(var b;b=a.parentNode;)if("SPAN"==b.tagName&&1==f.getChildCount(b,function(a){return!f.isBookmarkNode(a)&&!f.isBr(a)}))b.style.cssText+=a.style.cssText,f.remove(a,!0),a=b;else break}function c(a,b,c){if(h[b]&&(a.adjustmentBoundary(),!a.collapsed&&1==a.startContainer.nodeType)){var e=a.startContainer.childNodes[a.startOffset];
+if(e&&f.isTagNode(e,"span")){var g=a.createBookmark();p.each(f.getElementsByTagName(e,"span"),function(a){!a.parentNode||f.isBookmarkNode(a)||"backcolor"==b&&f.getComputedStyle(a,"background-color").toLowerCase()===c||(f.removeStyle(a,h[b]),0==a.style.cssText.replace(/^\s+$/,"").length&&f.remove(a,!0))});a.moveToBookmark(g)}}}function b(a,b,e){var g=a.collapsed,h=a.createBookmark();if(g)for(g=h.start.parentNode;v.$inline[g.tagName];)g=g.parentNode;else g=f.getCommonAncestor(h.start,h.end);p.each(f.getElementsByTagName(g,
+"span"),function(a){if(a.parentNode&&!f.isBookmarkNode(a))if(/\s*border\s*:\s*none;?\s*/i.test(a.style.cssText))/^\s*border\s*:\s*none;?\s*$/.test(a.style.cssText)?f.remove(a,!0):f.removeStyle(a,"border");else{/border/i.test(a.style.cssText)&&"SPAN"==a.parentNode.tagName&&/border/i.test(a.parentNode.style.cssText)&&(a.style.cssText=a.style.cssText.replace(/border[^:]*:[^;]+;?/gi,""));if("fontborder"!=b||"none"!=e)for(var c=a.nextSibling;c&&1==c.nodeType&&"SPAN"==c.tagName;){if(f.isBookmarkNode(c)&&
+"fontborder"==b)a.appendChild(c);else if(c.style.cssText==a.style.cssText&&(f.moveChild(c,a),f.remove(c)),a.nextSibling===c)break;c=a.nextSibling}d(a);r.ie&&8<r.version&&(c=f.findParent(a,function(a){return"SPAN"==a.tagName&&/background-color/.test(a.style.cssText)}))&&!/background-color/.test(a.style.cssText)&&(a.style.backgroundColor=c.style.backgroundColor)}});a.moveToBookmark(h);c(a,b,e)}var a={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family",underline:"text-decoration",
+strikethrough:"text-decoration",fontborder:"border"},e={underline:1,strikethrough:1,fontborder:1},h={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family"};this.setOpt({fontfamily:[{name:"songti",val:"\u5b8b\u4f53,SimSun"},{name:"yahei",val:"\u5fae\u8f6f\u96c5\u9ed1,Microsoft YaHei"},{name:"kaiti",val:"\u6977\u4f53,\u6977\u4f53_GB2312, SimKai"},{name:"heiti",val:"\u9ed1\u4f53, SimHei"},{name:"lishu",val:"\u96b6\u4e66, 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]});this.addInputRule(function(a){p.each(a.getNodesByTagName("u s del font strike"),function(a){if("font"==a.tagName){var b=[],c;for(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 b="u"==a.tagName?"underline":"line-through",a.attrs={style:(a.getAttr("style")||"")+"text-decoration:"+b+";"};a.tagName="span"})});for(var g in a)(function(a,c){UE.commands[a]={execCommand:function(g,h){h=h||(this.queryCommandState(g)?"none":"underline"==g?"underline":"fontborder"==g?"1px solid #000":"line-through");
+var d=this.selection.getRange(),t;if("default"==h)d.collapsed&&(t=this.document.createTextNode("font"),d.insertNode(t).select()),this.execCommand("removeFormat","span,a",c),t&&(d.setStartBefore(t).collapse(!0),f.remove(t)),b(d,g,h),d.select();else if(d.collapsed){var w=f.findParentByTagName(d.startContainer,"span",!0);t=this.document.createTextNode("font");if(!w||w.children.length||w[r.ie?"innerText":"textContent"].replace(P,"").length){d.insertNode(t);d.selectNode(t).select();w=d.document.createElement("span");
+if(e[a]){if(f.findParentByTagName(t,"a",!0)){d.setStartBefore(t).setCursor();f.remove(t);return}this.execCommand("removeFormat","span,a",c)}w.style.cssText=c+":"+h;t.parentNode.insertBefore(w,t);if(!r.ie||r.ie&&9==r.version)for(var y=w.parentNode;!f.isBlockElm(y);)"SPAN"==y.tagName&&(w.style.cssText=y.style.cssText+";"+w.style.cssText),y=y.parentNode;ma?setTimeout(function(){d.setStart(w,0).collapse(!0);b(d,g,h);d.select()}):(d.setStart(w,0).collapse(!0),b(d,g,h),d.select())}else d.insertNode(t),
+e[a]&&(d.selectNode(t).select(),this.execCommand("removeFormat","span,a",c,null),w=f.findParentByTagName(t,"span",!0),d.setStartBefore(t)),w&&(w.style.cssText+=";"+c+":"+h),d.collapse(!0).select();f.remove(t)}else e[a]&&this.queryCommandValue(a)&&this.execCommand("removeFormat","span,a",c),d=this.selection.getRange(),d.applyInlineStyle("span",{style:c+":"+h}),b(d,g,h),d.select();return!0},queryCommandValue:function(a){var b=this.selection.getStart();if("underline"==a||"strikethrough"==a){for(var e=
+b;e&&!f.isBlockElm(e)&&!f.isBody(e);){if(1==e.nodeType&&(a=f.getComputedStyle(e,c),"none"!=a))return a;e=e.parentNode}return"none"}if("fontborder"==a){for(a=b;a&&v.$inline[a.tagName];){if((e=f.getComputedStyle(a,"border"))&&/1px/.test(e)&&/solid/.test(e))return e;a=a.parentNode}return""}return"FontSize"==a?(e=f.getComputedStyle(b,c),(a=/^([\d\.]+)(\w+)$/.exec(e))?Math.floor(a[1])+a[2]:e):f.getComputedStyle(b,c)},queryCommandState:function(a){if(!e[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)}}})(g,a[g])};UE.plugins.link=function(){function d(c){var b=c.startContainer,a=c.endContainer;(b=f.findParentByTagName(b,"a",!0))&&c.setStartBefore(b);(a=f.findParentByTagName(a,"a",!0))&&c.setEndAfter(a)}UE.commands.unlink={execCommand:function(){var c=this.selection.getRange(),b;if(!c.collapsed||f.findParentByTagName(c.startContainer,"a",!0))b=c.createBookmark(),d(c),c.removeInlineStyle("a").moveToBookmark(b).select()},
+queryCommandState:function(){return!this.highlight&&this.queryCommandValue("link")?0:-1}};UE.commands.link={execCommand:function(c,b){var a;b._href&&(b._href=p.unhtml(b._href,/[<">]/g));b.href&&(b.href=p.unhtml(b.href,/[<">]/g));b.textValue&&(b.textValue=p.unhtml(b.textValue,/[<">]/g));var e=a=this.selection.getRange(),h=e.cloneRange(),g=this.queryCommandValue("link");d(e=e.adjustmentBoundary());var l=e.startContainer;1==l.nodeType&&g&&(l=l.childNodes[e.startOffset])&&1==l.nodeType&&"A"==l.tagName&&
+/^(?:https?|ftp|file)\s*:\s*\/\//.test(l[r.ie?"innerText":"textContent"])&&(l[r.ie?"innerText":"textContent"]=p.html(b.textValue||b.href));if(!h.collapsed||g)e.removeInlineStyle("a"),h=e.cloneRange();if(h.collapsed){var g=e.document.createElement("a"),k="";b.textValue?(k=p.html(b.textValue),delete b.textValue):k=p.html(b.href);f.setAttributes(g,b);(l=f.findParentByTagName(h.startContainer,"a",!0))&&f.isInNodeEndBoundary(h,l)&&e.setStartAfter(l).collapse(!0);g[r.ie?"innerText":"textContent"]=k;e.insertNode(g).selectNode(g)}else e.applyInlineStyle("a",
+b);a.collapse().select(!0)},queryCommandValue:function(){var c=this.selection.getRange(),b;if(c.collapsed){if(b=c.startContainer,(b=1==b.nodeType?b:b.parentNode)&&(b=f.findParentByTagName(b,"a",!0))&&!f.isInNodeEndBoundary(c,b))return b}else{c.shrinkBoundary();var a=3!=c.startContainer.nodeType&&c.startContainer.childNodes[c.startOffset]?c.startContainer.childNodes[c.startOffset]:c.startContainer,e=3==c.endContainer.nodeType||0==c.endOffset?c.endContainer:c.endContainer.childNodes[c.endOffset-1],
+c=c.getCommonAncestor();b=f.findParentByTagName(c,"a",!0);if(!b&&1==c.nodeType)for(var c=c.getElementsByTagName("a"),h,g,d=0,k;k=c[d++];)if(h=f.getPosition(k,a),g=f.getPosition(k,e),(h&f.POSITION_FOLLOWING||h&f.POSITION_CONTAINS)&&(g&f.POSITION_PRECEDING||g&f.POSITION_CONTAINS)){b=k;break}return b}},queryCommandState:function(){var c=this.selection.getRange().getClosedNode();return!c||"edui-faked-video"!=c.className&&-1==c.className.indexOf("edui-upload-video")?0:-1}}};UE.plugins.insertframe=function(){var d=
+this;d.addListener("selectionchange",function(){d._iframe&&delete d._iframe})};UE.commands.scrawl={queryCommandState:function(){return r.ie&&8>=r.version?-1:0}};UE.plugins.removeformat=function(){this.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"});this.commands.removeformat={execCommand:function(d,c,b,a,e){function h(a){if(3==a.nodeType||"span"!=a.tagName.toLowerCase())return 0;
+if(r.ie){var b=a.attributes;if(b.length){a=0;for(var c=b.length;a<c;a++)if(b[a].specified)return 0;return 1}}return!a.attributes.length}var g=RegExp("^(?:"+(c||this.options.removeFormatTags).replace(/,/g,"|")+")$","i"),l=b?[]:(a||this.options.removeFormatAttributes).split(",");d=new L.Range(this.document);var k,m,n=function(a){return 1==a.nodeType};d=this.selection.getRange();(function(a){var c=a.createBookmark();a.collapsed&&a.enlarge(!0);if(!e){var d=f.findParentByTagName(a.startContainer,"a",!0);
+d&&a.setStartBefore(d);(d=f.findParentByTagName(a.endContainer,"a",!0))&&a.setEndAfter(d)}k=a.createBookmark();for(d=k.start;(m=d.parentNode)&&!f.isBlockElm(m);)f.breakParent(d,m),f.clearEmptySibling(d);if(k.end){for(d=k.end;(m=d.parentNode)&&!f.isBlockElm(m);)f.breakParent(d,m),f.clearEmptySibling(d);for(var d=f.getNextDomNode(k.start,!1,n),y;d&&d!=k.end;)y=f.getNextDomNode(d,!0,n),v.$empty[d.tagName.toLowerCase()]||f.isBookmarkNode(d)||(g.test(d.tagName)?b?(f.removeStyle(d,b),h(d)&&"text-decoration"!=
+b&&f.remove(d,!0)):f.remove(d,!0):v.$tableContent[d.tagName]||v.$list[d.tagName]||(f.removeAttributes(d,l),h(d)&&f.remove(d,!0))),d=y}d=k.start.parentNode;!f.isBlockElm(d)||v.$tableContent[d.tagName]||v.$list[d.tagName]||f.removeAttributes(d,l);d=k.end.parentNode;k.end&&f.isBlockElm(d)&&!v.$tableContent[d.tagName]&&!v.$list[d.tagName]&&f.removeAttributes(d,l);a.moveToBookmark(k).moveToBookmark(c);d=a.startContainer;for(y=a.collapsed;1==d.nodeType&&f.isEmptyNode(d)&&v.$removeEmpty[d.tagName];)c=d.parentNode,
+a.setStartBefore(d),a.startContainer===a.endContainer&&a.endOffset--,f.remove(d),d=c;if(!y)for(d=a.endContainer;1==d.nodeType&&f.isEmptyNode(d)&&v.$removeEmpty[d.tagName];)c=d.parentNode,a.setEndBefore(d),f.remove(d),d=c})(d);d.select()}}};UE.plugins.blockquote=function(){this.commands.blockquote={execCommand:function(d,c){var b=this.selection.getRange(),a=f.filterNodeList(this.selection.getStartElementPath(),"blockquote"),e=v.blockquote,h=b.createBookmark();if(a){var e=b.startContainer,e=f.isBlockElm(e)?
+e:f.findParent(e,function(a){return f.isBlockElm(a)}),g=b.endContainer,g=f.isBlockElm(g)?g:f.findParent(g,function(a){return f.isBlockElm(a)}),e=f.findParentByTagName(e,"li",!0)||e,g=f.findParentByTagName(g,"li",!0)||g;"LI"==e.tagName||"TD"==e.tagName||e===a||f.isBody(e)?f.remove(a,!0):f.breakParent(e,a);e!==g&&(a=f.findParentByTagName(g,"blockquote"))&&("LI"==g.tagName||"TD"==g.tagName||f.isBody(g)?a.parentNode&&f.remove(a,!0):f.breakParent(g,a));for(var l=f.getElementsByTagName(this.document,"blockquote"),
+a=0,k;k=l[a++];)k.childNodes.length?f.getPosition(k,e)&f.POSITION_FOLLOWING&&f.getPosition(k,g)&f.POSITION_PRECEDING&&f.remove(k,!0):f.remove(k)}else{a=b.cloneRange();l=g=1==a.startContainer.nodeType?a.startContainer:a.startContainer.parentNode;for(k=1;;){if(f.isBody(g)){l!==g?b.collapsed?(a.selectNode(l),k=0):a.setStartBefore(l):a.setStart(g,0);break}if(!e[g.tagName]){b.collapsed?a.selectNode(l):a.setStartBefore(l);break}l=g;g=g.parentNode}if(k)for(l=g=g=1==a.endContainer.nodeType?a.endContainer:
+a.endContainer.parentNode;;){if(f.isBody(g)){l!==g?a.setEndAfter(l):a.setEnd(g,g.childNodes.length);break}if(!e[g.tagName]){a.setEndAfter(l);break}l=g;g=g.parentNode}g=b.document.createElement("blockquote");f.setAttributes(g,c);g.appendChild(a.extractContents());a.insertNode(g);e=f.getElementsByTagName(g,"blockquote");for(a=0;g=e[a++];)g.parentNode&&f.remove(g,!0)}b.moveToBookmark(h).select()},queryCommandState:function(){return f.filterNodeList(this.selection.getStartElementPath(),"blockquote")?
+1:0}}};UE.commands.touppercase=UE.commands.tolowercase={execCommand:function(d){var c=this.selection.getRange();if(c.collapsed)return c;for(var b=c.createBookmark(),a=b.end,e=function(a){return!f.isBr(a)&&!f.isWhitespace(a)},h=f.getNextDomNode(b.start,!1,e);h&&f.getPosition(h,a)&f.POSITION_PRECEDING&&(3==h.nodeType&&(h.nodeValue=h.nodeValue["touppercase"==d?"toUpperCase":"toLowerCase"]()),h=f.getNextDomNode(h,!0,e),h!==a););c.moveToBookmark(b).select()}};UE.commands.indent={execCommand:function(){var d=
+this.queryCommandState("indent")?"0em":this.options.indentValue||"2em";this.execCommand("Paragraph","p",{style:"text-indent:"+d})},queryCommandState:function(){var d=f.filterNodeList(this.selection.getStartElementPath(),"p h1 h2 h3 h4 h5 h6");return d&&d.style.textIndent&&parseInt(d.style.textIndent)?1:0}};UE.commands.print={execCommand:function(){this.window.print()},notNeedUndo:1};UE.commands.preview={execCommand:function(){var d=window.open("","_blank","").document;d.open();d.write('<!DOCTYPE html><html><head><meta charset="utf-8"/><script src="'+
+this.options.UEDITOR_HOME_URL+"ueditor.parse.js\">\x3c/script><script>setTimeout(function(){uParse('div',{rootPath: '"+this.options.UEDITOR_HOME_URL+"'})},300)\x3c/script></head><body><div>"+this.getContent(null,null,!0)+"</div></body></html>");d.close()},notNeedUndo:1};UE.plugins.selectall=function(){this.commands.selectall={execCommand:function(){var d=this.body,c=this.selection.getRange();c.selectNodeContents(d);f.isEmptyBlock(d)&&(r.opera&&d.firstChild&&1==d.firstChild.nodeType&&c.setStartAtFirst(d.firstChild),
+c.collapse(!0));c.select(!0)},notNeedUndo:1};this.addshortcutkey({selectAll:"ctrl+65"})};UE.plugins.paragraph=function(){var d=f.isBlockElm,c=["TD","LI","PRE"],b=function(a,b,h,g){var l=a.createBookmark(),k=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!f.isBookmarkNode(a):!f.isWhitespace(a)},m;a.enlarge(!0);var n=a.createBookmark();m=f.getNextDomNode(n.start,!1,k);for(var q=a.cloneRange(),t;m&&!(f.getPosition(m,n.end)&f.POSITION_FOLLOWING);)if(3!=m.nodeType&&d(m))m=f.getNextDomNode(m,
+!0,k);else{for(q.setStartBefore(m);m&&m!==n.end&&!d(m);)t=m,m=f.getNextDomNode(m,!1,null,function(a){return!d(a)});q.setEndAfter(t);m=a.document.createElement(b);h&&(f.setAttributes(m,h),g&&"customstyle"==g&&h.style&&(m.style.cssText=h.style));m.appendChild(q.extractContents());f.isEmptyNode(m)&&f.fillChar(a.document,m);q.insertNode(m);var w=m.parentNode;d(w)&&!f.isBody(m.parentNode)&&-1==p.indexOf(c,w.tagName)&&(g&&"customstyle"==g||(w.getAttribute("dir")&&m.setAttribute("dir",w.getAttribute("dir")),
+w.style.cssText&&(m.style.cssText=w.style.cssText+";"+m.style.cssText),w.style.textAlign&&!m.style.textAlign&&(m.style.textAlign=w.style.textAlign),w.style.textIndent&&!m.style.textIndent&&(m.style.textIndent=w.style.textIndent),w.style.padding&&!m.style.padding&&(m.style.padding=w.style.padding)),h&&/h\d/i.test(w.tagName)&&!/h\d/i.test(m.tagName)?(f.setAttributes(w,h),g&&"customstyle"==g&&h.style&&(w.style.cssText=h.style),f.remove(m,!0),m=w):f.remove(m.parentNode,!0));m=-1!=p.indexOf(c,w.tagName)?
+w:m;m=f.getNextDomNode(m,!1,k)}return a.moveToBookmark(n).moveToBookmark(l)};this.setOpt("paragraph",{p:"",h1:"",h2:"",h3:"",h4:"",h5:"",h6:""});this.commands.paragraph={execCommand:function(a,c,h,g){a=this.selection.getRange();if(a.collapsed){var d=this.document.createTextNode("p");a.insertNode(d);if(r.ie){var k=d.previousSibling;k&&f.isWhitespace(k)&&f.remove(k);(k=d.nextSibling)&&f.isWhitespace(k)&&f.remove(k)}}a=b(a,c,h,g);d&&(a.setStartBefore(d).collapse(!0),pN=d.parentNode,f.remove(d),f.isBlockElm(pN)&&
+f.isEmptyNode(pN)&&f.fillNode(this.document,pN));r.gecko&&a.collapsed&&1==a.startContainer.nodeType&&(h=a.startContainer.childNodes[a.startOffset])&&1==h.nodeType&&h.tagName.toLowerCase()==c&&a.setStart(h,0).collapse(!0);a.select();return!0},queryCommandValue:function(){var a=f.filterNodeList(this.selection.getStartElementPath(),"p h1 h2 h3 h4 h5 h6");return a?a.tagName.toLowerCase():""}}};(function(){var d=f.isBlockElm,c=function(a){return f.filterNodeList(a.selection.getStartElementPath(),function(a){return a&&
+1==a.nodeType&&a.getAttribute("dir")})},b=function(a,b,h){var g=function(a){return 1==a.nodeType?!f.isBookmarkNode(a):!f.isWhitespace(a)};if((b=c(b))&&a.collapsed)return b.setAttribute("dir",h),a;b=a.createBookmark();a.enlarge(!0);for(var l=a.createBookmark(),k=f.getNextDomNode(l.start,!1,g),m=a.cloneRange(),n;k&&!(f.getPosition(k,l.end)&f.POSITION_FOLLOWING);)if(3!=k.nodeType&&d(k))k=f.getNextDomNode(k,!0,g);else{for(m.setStartBefore(k);k&&k!==l.end&&!d(k);)n=k,k=f.getNextDomNode(k,!1,null,function(a){return!d(a)});
+m.setEndAfter(n);k=m.getCommonAncestor();if(!f.isBody(k)&&d(k))k.setAttribute("dir",h);else{k=a.document.createElement("p");k.setAttribute("dir",h);var q=m.extractContents();k.appendChild(q);m.insertNode(k)}k=f.getNextDomNode(k,!1,g)}return a.moveToBookmark(l).moveToBookmark(b)};UE.commands.directionality={execCommand:function(a,c){var h=this.selection.getRange();if(h.collapsed){var g=this.document.createTextNode("d");h.insertNode(g)}b(h,this,c);g&&(h.setStartBefore(g).collapse(!0),f.remove(g));h.select();
+return!0},queryCommandValue:function(){var a=c(this);return a?a.getAttribute("dir"):"ltr"}}})();UE.plugins.horizontal=function(){this.commands.horizontal={execCommand:function(d){if(-1!==this.queryCommandState(d)){this.execCommand("insertHtml","<hr>");d=this.selection.getRange();var c=d.startContainer;if(1==c.nodeType&&!c.childNodes[d.startOffset]){var b;(b=c.childNodes[d.startOffset-1])&&1==b.nodeType&&"HR"==b.tagName&&("p"==this.options.enterTag?(b=this.document.createElement("p"),d.insertNode(b),
+d.setStart(b,0).setCursor()):(b=this.document.createElement("br"),d.insertNode(b),d.setStartBefore(b).setCursor()))}return!0}},queryCommandState:function(){return f.filterNodeList(this.selection.getStartElementPath(),"table")?-1:0}};this.addListener("delkeydown",function(d,c){var b=this.selection.getRange();b.txtToElmBoundary(!0);if(f.isStartInblock(b)){var a=b.startContainer.previousSibling;if(a&&f.isTagNode(a,"hr"))return f.remove(a),b.select(),f.preventDefault(c),!0}})};UE.commands.time=UE.commands.date=
+{execCommand:function(d,c){function b(a,b){var c=("0"+a.getHours()).slice(-2),e=("0"+a.getMinutes()).slice(-2),d=("0"+a.getSeconds()).slice(-2);return(b||"hh:ii:ss").replace(/hh/ig,c).replace(/ii/ig,e).replace(/ss/ig,d)}function a(a,b){var c=("000"+a.getFullYear()).slice(-4),e=c.slice(-2),d=("0"+(a.getMonth()+1)).slice(-2),f=("0"+a.getDate()).slice(-2);return(b||"yyyy-mm-dd").replace(/yyyy/ig,c).replace(/yy/ig,e).replace(/mm/ig,d).replace(/dd/ig,f)}var e=new Date;this.execCommand("insertHtml","time"==
+d?b(e,c):a(e,c))}};UE.plugins.rowspacing=function(){this.setOpt({rowspacingtop:["5","10","15","20","25"],rowspacingbottom:["5","10","15","20","25"]});this.commands.rowspacing={execCommand:function(d,c,b){this.execCommand("paragraph","p",{style:"margin-"+b+":"+c+"px"});return!0},queryCommandValue:function(d,c){var b=f.filterNodeList(this.selection.getStartElementPath(),function(a){return f.isBlockElm(a)});return b?(b=f.getComputedStyle(b,"margin-"+c).replace(/[^\d]/g,""))?b:0:0}}};UE.plugins.lineheight=
+function(){this.setOpt({lineheight:"1 1.5 1.75 2 3 4 5".split(" ")});this.commands.lineheight={execCommand:function(d,c){this.execCommand("paragraph","p",{style:"line-height:"+("1"==c?"normal":c+"em")});return!0},queryCommandValue:function(){var d=f.filterNodeList(this.selection.getStartElementPath(),function(c){return f.isBlockElm(c)});if(d)return d=f.getComputedStyle(d,"line-height"),"normal"==d?1:d.replace(/[^\d.]*/ig,"")}}};UE.plugins.insertcode=function(){var d=this;d.ready(function(){p.cssRule("pre",
+"pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}",d.document)});d.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"});d.commands.insertcode={execCommand:function(c,b){var a=this.selection.getRange(),
+e=f.findParentByTagName(a.startContainer,"pre",!0);if(e)e.className="brush:"+b+";toolbar:false;";else{var h="";a.collapsed?h=r.ie&&r.ie11below?8>=r.version?"&nbsp;":"":"<br/>":(e=a.extractContents(),a=this.document.createElement("div"),a.appendChild(e),p.each(UE.filterNode(UE.htmlparser(a.innerHTML.replace(/[\r\t]/g,"")),this.options.filterTxtRules).children,function(a){r.ie&&r.ie11below&&8<r.version?("element"==a.type?"br"==a.tagName?h+="\n":v.$empty[a.tagName]||(p.each(a.children,function(b){"element"==
+b.type?"br"==b.tagName?h+="\n":v.$empty[a.tagName]||(h+=b.innerText()):h+=b.data}),/\n$/.test(h)||(h+="\n")):h+=a.data+"\n",!a.nextSibling()&&/\n$/.test(h)&&(h=h.replace(/\n$/,""))):r.ie&&r.ie11below?("element"==a.type?"br"==a.tagName?h+="<br>":v.$empty[a.tagName]||(p.each(a.children,function(b){"element"==b.type?"br"==b.tagName?h+="<br>":v.$empty[a.tagName]||(h+=b.innerText()):h+=b.data}),/br>$/.test(h)||(h+="<br>")):h+=a.data+"<br>",!a.nextSibling()&&/<br>$/.test(h)&&(h=h.replace(/<br>$/,""))):
+(h+="element"==a.type?v.$empty[a.tagName]?"":a.innerText():a.data,!/br\/?\s*>$/.test(h)&&a.nextSibling()&&(h+="<br>"))}));this.execCommand("inserthtml",'<pre id="coder"class="brush:'+b+';toolbar:false">'+h+"</pre>",!0);e=this.document.getElementById("coder");f.removeAttributes(e,"id");(a=e.previousSibling)&&(3==a.nodeType&&1==a.nodeValue.length&&r.ie&&6==r.version||f.isEmptyBlock(a))&&f.remove(a);a=this.selection.getRange();f.isEmptyBlock(e)?a.setStart(e,0).setCursor(!1,!0):a.selectNodeContents(e).select()}},
+queryCommandValue:function(){var c=this.selection.getStartElementPath(),b="";p.each(c,function(a){if("PRE"==a.nodeName)return b=(a=a.className.match(/brush:([^;]+)/))&&a[1]?a[1]:"",!1});return b}};d.addInputRule(function(c){p.each(c.getNodesByTagName("pre"),function(b){var a=b.getNodesByTagName("br");a.length?r.ie&&r.ie11below&&8<r.version&&p.each(a,function(a){var b=UE.uNode.createText("\n");a.parentNode.insertBefore(b,a);a.parentNode.removeChild(a)}):r.ie&&r.ie11below&&8<r.version||(a=b.innerText().split(/\n/),
+b.innerHTML(""),p.each(a,function(a){a.length&&b.appendChild(UE.uNode.createText(a));b.appendChild(UE.uNode.createElement("br"))}))})});d.addOutputRule(function(c){p.each(c.getNodesByTagName("pre"),function(b){var a="";p.each(b.children,function(b){a="text"==b.type?a+b.data.replace(/[ ]/g,"&nbsp;").replace(/\n$/,""):"br"==b.tagName?a+"\n":a+(v.$empty[b.tagName]?b.innerText():"")});b.innerText(a.replace(/(&nbsp;|\n)+$/,""))})});d.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};d.queryCommandState=function(c){return!this.notNeedCodeQuery[c.toLowerCase()]&&this.selection&&this.queryCommandValue("insertcode")?-1:UE.Editor.prototype.queryCommandState.apply(this,arguments)};d.addListener("beforeenterkeydown",function(){var c=d.selection.getRange(),b=f.findParentByTagName(c.startContainer,"pre",!0);if(b){d.fireEvent("saveScene");c.collapsed||c.deleteContents();if(!r.ie||r.ie9above){b=
+d.document.createElement("br");c.insertNode(b).setStartAfter(b).collapse(!0);b.nextSibling||r.ie&&!(10<r.version)?c.setStartAfter(b):c.insertNode(b.cloneNode(!1));for(var b=b.previousSibling,a;b;)if(a=b,b=b.previousSibling,!b||"BR"==b.nodeName){b=a;break}if(b){for(a="";b&&"BR"!=b.nodeName&&RegExp("^[\\s"+f.fillChar+"]*$").test(b.nodeValue);)a+=b.nodeValue,b=b.nextSibling;"BR"!=b.nodeName&&(b=b.nodeValue.match(RegExp("^([\\s"+f.fillChar+"]+)")))&&b[1]&&(a+=b[1]);a&&(a=d.document.createTextNode(a),
+c.insertNode(a).setStartAfter(a))}c.collapse(!0).select(!0)}else if(8<r.version)if(b=d.document.createTextNode("\n"),a=c.startContainer,0==c.startOffset){if(a.previousSibling){c.insertNode(b);var e=d.document.createTextNode(" ");c.setStartAfter(b).insertNode(e).setStart(e,0).collapse(!0).select(!0)}}else c.insertNode(b).setStartAfter(b),e=d.document.createTextNode(" "),(a=c.startContainer.childNodes[c.startOffset])&&!/^\n/.test(a.nodeValue)&&c.setStartBefore(b),c.insertNode(e).setStart(e,0).collapse(!0).select(!0);
+else{b=d.document.createElement("br");c.insertNode(b);c.insertNode(d.document.createTextNode(f.fillChar));c.setStartAfter(b);for(b=b.previousSibling;b;)if(a=b,b=b.previousSibling,!b||"BR"==b.nodeName){b=a;break}if(b){for(a="";b&&"BR"!=b.nodeName&&RegExp("^[ "+f.fillChar+"]*$").test(b.nodeValue);)a+=b.nodeValue,b=b.nextSibling;"BR"!=b.nodeName&&(b=b.nodeValue.match(RegExp("^([ "+f.fillChar+"]+)")))&&b[1]&&(a+=b[1]);a=d.document.createTextNode(a);c.insertNode(a).setStartAfter(a)}c.collapse(!0).select()}d.fireEvent("saveScene");
+return!0}});d.addListener("tabkeydown",function(c,b){var a=d.selection.getRange(),e=f.findParentByTagName(a.startContainer,"pre",!0);if(e){d.fireEvent("saveScene");if(!b.shiftKey)if(a.collapsed)e=d.document.createTextNode("    "),a.insertNode(e).setStartAfter(e).collapse(!0).select(!0);else{for(var h=a.createBookmark(),g=h.start.previousSibling;g;){if(e.firstChild===g&&!f.isBr(g)){e.insertBefore(d.document.createTextNode("    "),g);break}if(f.isBr(g)){e.insertBefore(d.document.createTextNode("    "),
+g.nextSibling);break}g=g.previousSibling}var l=h.end,g=h.start.nextSibling;for(e.firstChild===h.start&&e.insertBefore(d.document.createTextNode("    "),g.nextSibling);g&&g!==l;){if(f.isBr(g)&&g.nextSibling){if(g.nextSibling===l)break;e.insertBefore(d.document.createTextNode("    "),g.nextSibling)}g=g.nextSibling}a.moveToBookmark(h).select()}d.fireEvent("saveScene");return!0}});d.addListener("beforeinserthtml",function(c,b){var a=this,e=a.selection.getRange();if(f.findParentByTagName(e.startContainer,
+"pre",!0)){e.collapsed||e.deleteContents();var h="";if(r.ie&&8<r.version){p.each(UE.filterNode(UE.htmlparser(b),a.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?h+="\n":v.$empty[a.tagName]||(p.each(a.children,function(b){"element"==b.type?"br"==b.tagName?h+="\n":v.$empty[a.tagName]||(h+=b.innerText()):h+=b.data}),/\n$/.test(h)||(h+="\n")):h+=a.data+"\n";!a.nextSibling()&&/\n$/.test(h)&&(h=h.replace(/\n$/,""))});var g=a.document.createTextNode(p.html(h.replace(/&nbsp;/g,
+" ")));e.insertNode(g).selectNode(g).select()}else{var d=a.document.createDocumentFragment();p.each(UE.filterNode(UE.htmlparser(b),a.options.filterTxtRules).children,function(b){"element"==b.type?"br"==b.tagName?d.appendChild(a.document.createElement("br")):v.$empty[b.tagName]||(p.each(b.children,function(c){"element"==c.type?"br"==c.tagName?d.appendChild(a.document.createElement("br")):v.$empty[b.tagName]||d.appendChild(a.document.createTextNode(p.html(c.innerText().replace(/&nbsp;/g," ")))):d.appendChild(a.document.createTextNode(p.html(c.data.replace(/&nbsp;/g,
+" "))))}),"BR"!=d.lastChild.nodeName&&d.appendChild(a.document.createElement("br"))):d.appendChild(a.document.createTextNode(p.html(b.data.replace(/&nbsp;/g," "))));b.nextSibling()||"BR"!=d.lastChild.nodeName||d.removeChild(d.lastChild)});e.insertNode(d).select()}return!0}});d.addListener("keydown",function(c,b){if(40==(b.keyCode||b.which)){var a=this.selection.getRange(),e,h=a.startContainer;if(a.collapsed&&(e=f.findParentByTagName(a.startContainer,"pre",!0))&&!e.nextSibling){for(var g=e.lastChild;g&&
+"BR"==g.nodeName;)g=g.previousSibling;if(g===h||a.startContainer===e&&a.startOffset==e.childNodes.length)this.execCommand("insertparagraph"),f.preventDefault(b)}}});d.addListener("delkeydown",function(c,b){var a=this.selection.getRange();a.txtToElmBoundary(!0);var e=a.startContainer;if(f.isTagNode(e,"pre")&&a.collapsed&&f.isStartInblock(a)){var h=d.document.createElement("p");f.fillNode(d.document,h);e.parentNode.insertBefore(h,e);f.remove(e);a.setStart(h,0).setCursor(!1,!0);f.preventDefault(b);return!0}})};
+UE.commands.cleardoc={execCommand:function(d){var c=this;d=c.options.enterTag;var b=c.selection.getRange();"br"==d?(c.body.innerHTML="<br/>",b.setStart(c.body,0).setCursor()):(c.body.innerHTML="<p>"+(I?"":"<br/>")+"</p>",b.setStart(c.body.firstChild,0).setCursor(!1,!0));setTimeout(function(){c.fireEvent("clearDoc")},0)}};UE.plugin.register("anchor",function(){return{bindEvents:{ready:function(){p.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(d){p.each(d.getNodesByTagName("img"),function(c){var b;if(b=c.getAttr("anchorname"))c.tagName="a",c.setAttr({anchorname:"",name:b,"class":""})})},inputRule:function(d){p.each(d.getNodesByTagName("a"),function(c){c.getAttr("name")&&!c.getAttr("href")&&(c.tagName="img",c.setAttr({anchorname:c.getAttr("name"),"class":"anchorclass"}),c.setAttr("name"))})},commands:{anchor:{execCommand:function(d,c){var b=this.selection.getRange(),a=b.getClosedNode();a&&a.getAttribute("anchorname")?
+c?a.setAttribute("anchorname",c):(b.setStartBefore(a).setCursor(),f.remove(a)):c&&(a=this.document.createElement("img"),b.collapse(!0),f.setAttributes(a,{anchorname:c,"class":"anchorclass"}),b.insertNode(a).setStartAfter(a).setCursor(!1,!0))}}}}});UE.plugins.wordcount=function(){var d=this;d.setOpt("wordCount",!0);d.addListener("contentchange",function(){d.fireEvent("wordcount")});var c;d.addListener("ready",function(){var b=this;f.on(b.body,"keyup",function(a){(a.keyCode||a.which)in{16:1,18:1,20:1,
+37:1,38:1,39:1,40:1}||(clearTimeout(c),c=setTimeout(function(){b.fireEvent("wordcount")},200))})})};UE.plugins.pagebreak=function(){function d(a){if(f.isEmptyBlock(a)){for(var c=a.firstChild,g;c&&1==c.nodeType&&f.isEmptyBlock(c);)g=c,c=c.firstChild;!g&&(g=a);f.fillNode(b.document,g)}}function c(a){return a&&1==a.nodeType&&"HR"==a.tagName&&"pagebreak"==a.className}var b=this,a=["td"];b.setOpt("pageBreakTag","_ueditor_page_break_tag_");b.ready(function(){p.cssRule("pagebreak",".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}",
+b.document)});b.addInputRule(function(a){a.traversal(function(a){if("text"==a.type&&a.data==b.options.pageBreakTag){var c=UE.uNode.createElement('<hr class="pagebreak" noshade="noshade" size="5" style="-webkit-user-select: none;">');a.parentNode.insertBefore(c,a);a.parentNode.removeChild(a)}})});b.addOutputRule(function(a){p.each(a.getNodesByTagName("hr"),function(a){if("pagebreak"==a.getAttr("class")){var c=UE.uNode.createText(b.options.pageBreakTag);a.parentNode.insertBefore(c,a);a.parentNode.removeChild(a)}})});
+b.commands.pagebreak={execCommand:function(){var e=b.selection.getRange(),h=b.document.createElement("hr");f.setAttributes(h,{"class":"pagebreak",noshade:"noshade",size:"5"});f.unSelectable(h);var g=f.findParentByTagName(e.startContainer,a,!0),l=[];if(g)switch(g.tagName){case "TD":g=g.parentNode,g.previousSibling?(g.parentNode.insertBefore(h,g),l=f.findParents(h)):(e=f.findParentByTagName(g,"table"),e.parentNode.insertBefore(h,e),l=f.findParents(h,!0)),g=l[1],h!==g&&f.breakParent(h,g),b.fireEvent("afteradjusttable",
+b.document)}else{if(!e.collapsed)for(e.deleteContents(),g=e.startContainer;!f.isBody(g)&&f.isBlockElm(g)&&f.isEmptyNode(g);)e.setStartBefore(g).collapse(!0),f.remove(g),g=e.startContainer;e.insertNode(h);for(g=h.parentNode;!f.isBody(g);)f.breakParent(h,g),(g=h.nextSibling)&&f.isEmptyBlock(g)&&f.remove(g),g=h.parentNode;g=h.nextSibling;l=h.previousSibling;c(l)?f.remove(l):l&&d(l);g?(c(g)?f.remove(g):d(g),e.setEndAfter(h).collapse(!1)):(g=b.document.createElement("p"),h.parentNode.appendChild(g),f.fillNode(b.document,
+g),e.setStart(g,0).collapse(!0));e.select(!0)}}}};UE.plugin.register("wordimage",function(){var d=this,c=[];return{commands:{wordimage:{execCommand:function(){for(var b=f.getElementsByTagName(d.body,"img"),a=[],c=0,h;h=b[c++];)(h=h.getAttribute("word_img"))&&a.push(h);return a},queryCommandState:function(){c=f.getElementsByTagName(d.body,"img");for(var b=0,a;a=c[b++];)if(a.getAttribute("word_img"))return 1;return-1},notNeedUndo:!0}},inputRule:function(b){p.each(b.getNodesByTagName("img"),function(a){var b=
+a.attrs,c=128>parseInt(b.width)||43>parseInt(b.height),g=d.options,f=g.UEDITOR_HOME_URL+"themes/default/images/spacer.gif";b.src&&/^(?:(file:\/+))/.test(b.src)&&a.setAttr({width:b.width,height:b.height,alt:b.alt,word_img:b.src,src:f,style:"background:url("+(c?g.themePath+g.theme+"/images/word.gif":g.langPath+g.lang+"/images/localimage.png")+") no-repeat center center;border:1px solid #ddd"})})}}});UE.plugins.dragdrop=function(){var d=this;d.ready(function(){f.on(this.body,"dragend",function(){var c=
+d.selection.getRange(),b=c.getClosedNode()||d.selection.getStart();if(b&&"IMG"==b.tagName){for(var a=b.previousSibling,e;(e=b.nextSibling)&&1==e.nodeType&&"SPAN"==e.tagName&&!e.firstChild;)f.remove(e);(!a||1!=a.nodeType||f.isEmptyBlock(a))&&a||e&&(!e||f.isEmptyBlock(e))||(a&&"P"==a.tagName&&!f.isEmptyBlock(a)?(a.appendChild(b),f.moveChild(e,a),f.remove(e)):e&&"P"==e.tagName&&!f.isEmptyBlock(e)&&e.insertBefore(b,e.firstChild),a&&"P"==a.tagName&&f.isEmptyBlock(a)&&f.remove(a),e&&"P"==e.tagName&&f.isEmptyBlock(e)&&
+f.remove(e),c.selectNode(b).select(),d.fireEvent("saveScene"))}})});d.addListener("keyup",function(c,b){if(13==(b.keyCode||b.which)){var a=d.selection.getRange(),e;(e=f.findParentByTagName(a.startContainer,"p",!0))&&"center"==f.getComputedStyle(e,"text-align")&&f.removeStyle(e,"text-align")}})};UE.plugins.undo=function(){function d(a,b){if(a.length!=b.length)return 0;for(var c=0,e=a.length;c<e;c++)if(a[c]!=b[c])return 0;return 1}var c,b=this,a=b.options.maxUndoCount||20,e=b.options.maxInputCount||
+20,h=RegExp(f.fillChar+"|</hr>","gi"),g={ol:1,ul:1,table:1,tbody:1,tr:1,body:1},l=b.options.autoClearEmptyNode;b.undoManger=new function(){this.list=[];this.index=0;this.hasRedo=this.hasUndo=!1;this.undo=function(){if(this.hasUndo)if(this.list[this.index-1]||1!=this.list.length){for(;this.list[this.index].content==this.list[this.index-1].content;)if(this.index--,0==this.index)return this.restore(0);this.restore(--this.index)}else this.reset()};this.redo=function(){if(this.hasRedo){for(;this.list[this.index].content==
+this.list[this.index+1].content;)if(this.index++,this.index==this.list.length-1)return this.restore(this.index);this.restore(++this.index)}};this.restore=function(){var a=this.editor,b=this.list[this.index],c=UE.htmlparser(b.content.replace(h,""));a.options.autoClearEmptyNode=!1;a.filterInputRule(c);a.options.autoClearEmptyNode=l;a.document.body.innerHTML=c.toHtml();a.fireEvent("afterscencerestore");r.ie&&p.each(f.getElementsByTagName(a.document,"td th caption p"),function(b){f.isEmptyNode(b)&&f.fillNode(a.document,
+b)});try{var e=(new L.Range(a.document)).moveToAddress(b.address);e.select(g[e.startContainer.nodeName.toLowerCase()])}catch(d){}this.update();this.clearKey();a.fireEvent("reset",!0)};this.getScene=function(){var a=this.editor,b=a.selection.getRange().createAddress(!1,!0);a.fireEvent("beforegetscene");var c=UE.htmlparser(a.body.innerHTML);a.options.autoClearEmptyNode=!1;a.filterOutputRule(c);a.options.autoClearEmptyNode=l;c=c.toHtml();a.fireEvent("aftergetscene");return{address:b,content:c}};this.save=
+function(e,g){clearTimeout(c);var h=this.getScene(g),k=this.list[this.index];k&&k.content!=h.content&&b.trigger("contentchange");var f;if(f=k)if(f=k.content==h.content)e?k=1:(k=k.address,f=h.address,k=k.collapsed!=f.collapsed?0:d(k.startAddress,f.startAddress)&&d(k.endAddress,f.endAddress)?1:0),f=k;f||(this.list=this.list.slice(0,this.index+1),this.list.push(h),this.list.length>a&&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.hasRedo=this.hasUndo=!1;this.clearKey()};this.clearKey=function(){m=0}};b.undoManger.editor=b;b.addListener("saveScene",function(){var a=Array.prototype.splice.call(arguments,1);this.undoManger.save.apply(this.undoManger,a)});b.addListener("reset",function(a,b){b||this.undoManger.reset()});b.commands.redo=b.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={16:1,17:1,18:1,37:1,38:1,39:1,40:1},m=0,n=!1;b.addListener("ready",function(){f.on(this.body,"compositionstart",function(){n=!0});f.on(this.body,"compositionend",function(){n=!1})});b.addshortcutkey({Undo:"ctrl+90",Redo:"ctrl+89"});var q=!0;b.addListener("keydown",function(a,b){var g=this;if(!(k[b.keyCode||b.which]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey||n))if(g.selection.getRange().collapsed){0==g.undoManger.list.length&&g.undoManger.save(!0);
+clearTimeout(c);var d=function(a){a.undoManger.save(!1,!0);a.fireEvent("selectionchange")};c=setTimeout(function(){if(n)var a=setInterval(function(){n||(d(g),clearInterval(a))},300);else d(g)},200);m++;m>=e&&d(g)}else g.undoManger.save(!1,!0),q=!1});b.addListener("keyup",function(a,b){k[b.keyCode||b.which]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey||n||q||(this.undoManger.save(!1,!0),q=!0)});b.stopCmdUndo=function(){b.__hasEnterExecCommand=!0};b.startCmdUndo=function(){b.__hasEnterExecCommand=!1}};
+UE.plugin.register("copy",function(){function d(){ZeroClipboard.config({debug:!1,swfPath:c.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.swf"});var b=c.zeroclipboard=new ZeroClipboard;b.on("copy",function(a){a=a.client;var b=c.selection.getRange(),d=document.createElement("div");d.appendChild(b.cloneContents());a.setText(d.innerText||d.textContent);a.setHtml(d.innerHTML);b.select()});b.on("mouseover mouseout",function(a){var b=a.target;"mouseover"==a.type?f.addClass(b,"edui-state-hover"):
+"mouseout"==a.type&&f.removeClasses(b,"edui-state-hover")});b.on("wrongflash noflash",function(){ZeroClipboard.destroy()})}var c=this;return{bindEvents:{ready:function(){r.ie||(window.ZeroClipboard?d():p.loadFile(document,{src:c.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.js",tag:"script",type:"text/javascript",defer:"defer"},function(){d()}))}},commands:{copy:{execCommand:function(b){c.document.execCommand("copy")||alert(c.getLang("copymsg"))}}}}});UE.plugins.paste=function(){function d(a){var b=
+this.document;if(!b.getElementById("baidu_pastebin")){var c=this.selection.getRange(),e=c.createBookmark(),g=b.createElement("div");g.id="baidu_pastebin";r.webkit&&g.appendChild(b.createTextNode(f.fillChar+f.fillChar));b.body.appendChild(g);e.start.style.display="";g.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:"+f.getXY(e.start).y+"px";c.selectNodeContents(g).select(!0);setTimeout(function(){if(r.webkit)for(var d=0,h=b.querySelectorAll("#baidu_pastebin"),
+y;y=h[d++];)if(f.isEmptyNode(y))f.remove(y);else{g=y;break}try{g.parentNode.removeChild(g)}catch(u){}c.moveToBookmark(e).select(!0);a(g)},0)}}function c(a){return a.replace(/<(\/?)([\w\-]+)([^>]*)>/gi,function(a,b,c,e){c=c.toLowerCase();if({img:1}[c])return a;e=e.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi,function(a,b,c){return{src:1,href:1,name:1}[b.toLowerCase()]?b+"="+c+" ":""});return{span:1,div:1}[c]?"":"<"+b+c+" "+p.trim(e)+">"})}function b(b){var d;if(b.firstChild){var m=
+f.getElementsByTagName(b,"span");d=0;for(var n;n=m[d++];)"_baidu_cut_start"!=n.id&&"_baidu_cut_end"!=n.id||f.remove(n);if(r.webkit){n=b.querySelectorAll("div br");for(d=0;m=n[d++];)m=m.parentNode,"DIV"==m.tagName&&1==m.childNodes.length&&(m.innerHTML="<p><br/></p>",f.remove(m));m=b.querySelectorAll("#baidu_pastebin");for(d=0;n=m[d++];){var q=a.document.createElement("p");for(n.parentNode.insertBefore(q,n);n.firstChild;)q.appendChild(n.firstChild);f.remove(n)}n=b.querySelectorAll("meta");for(d=0;m=
+n[d++];)f.remove(m);n=b.querySelectorAll("br");for(d=0;m=n[d++];)/^apple-/i.test(m.className)&&f.remove(m)}if(r.gecko)for(n=b.querySelectorAll("[_moz_dirty]"),d=0;m=n[d++];)m.removeAttribute("_moz_dirty");if(!r.ie)for(n=b.querySelectorAll("span.Apple-style-span"),d=0;m=n[d++];)f.remove(m,!0);d=b.innerHTML;d=UE.filterWord(d);b=UE.htmlparser(d);a.options.filterRules&&UE.filterNode(b,a.options.filterRules);a.filterInputRule(b);r.webkit&&((d=b.lastChild())&&"element"==d.type&&"br"==d.tagName&&b.removeChild(d),
+p.each(a.body.querySelectorAll("div"),function(a){f.isEmptyBlock(a)&&f.remove(a,!0)}));d={html:b.toHtml()};a.fireEvent("beforepaste",d,b);d.html&&(b=UE.htmlparser(d.html,!0),1===a.queryCommandState("pasteplain")?a.execCommand("insertHtml",UE.filterNode(b,a.options.filterTxtRules).toHtml(),!0):(UE.filterNode(b,a.options.filterTxtRules),e=b.toHtml(),h=d.html,g=a.selection.getRange().createAddress(!0),a.execCommand("insertHtml",!0===a.getOpt("retainOnlyLabelPasted")?c(h):h,!0)),a.fireEvent("afterpaste",
+d))}}var a=this;a.setOpt({retainOnlyLabelPasted:!1});var e,h,g;a.addListener("pasteTransfer",function(b,d){if(g&&e&&h&&e!=h){var m=a.selection.getRange();m.moveToAddress(g,!0);if(!m.collapsed){for(;!f.isBody(m.startContainer);){var n=m.startContainer;if(1==n.nodeType){n=n.childNodes[m.startOffset];if(!n){m.setStartBefore(m.startContainer);continue}(n=n.previousSibling)&&3==n.nodeType&&RegExp("^[\n\r\t "+f.fillChar+"]*$").test(n.nodeValue)&&m.setStartBefore(n)}if(0==m.startOffset)m.setStartBefore(m.startContainer);
+else break}for(;!f.isBody(m.endContainer);){n=m.endContainer;if(1==n.nodeType){n=n.childNodes[m.endOffset];if(!n){m.setEndAfter(m.endContainer);continue}(n=n.nextSibling)&&3==n.nodeType&&RegExp("^[\n\r\t"+f.fillChar+"]*$").test(n.nodeValue)&&m.setEndAfter(n)}if(m.endOffset==m.endContainer[3==m.endContainer.nodeType?"nodeValue":"childNodes"].length)m.setEndAfter(m.endContainer);else break}}m.deleteContents();m.select(!0);a.__hasEnterExecCommand=!0;m=h;2===d?m=c(m):d&&(m=e);a.execCommand("inserthtml",
+m,!0);a.__hasEnterExecCommand=!1;for(m=a.selection.getRange();!f.isBody(m.startContainer)&&!m.startOffset&&m.startContainer[3==m.startContainer.nodeType?"nodeValue":"childNodes"].length;)m.setStartBefore(m.startContainer);m=m.createAddress(!0);g.endAddress=m.startAddress}});a.addListener("ready",function(){f.on(a.body,"cut",function(){!a.selection.getRange().collapsed&&a.undoManger&&a.undoManger.save()});f.on(a.body,r.ie||r.opera?"keydown":"paste",function(c){(!r.ie&&!r.opera||(c.ctrlKey||c.metaKey)&&
+"86"==c.keyCode)&&d.call(a,function(a){b(a)})})});a.commands.paste={execCommand:function(c){r.ie?(d.call(a,function(a){b(a)}),a.document.execCommand("paste")):alert(a.getLang("pastemsg"))}}};UE.plugins.pasteplain=function(){this.setOpt({pasteplain:!1,filterTxtRules:function(){function c(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:c,th:c,tr:c,h1:c,h2:c,h3:c,h4:c,h5:c,h6:c,td:function(a){a.innerText()&&a.parentNode.insertAfter(UE.uNode.createText(" &nbsp; &nbsp;"),a);a.parentNode.removeChild(a,a.innerText())}}}()});var d=this.options.pasteplain;this.commands.pasteplain=
+{queryCommandState:function(){return d?1:0},execCommand:function(){d=!d|0},notNeedUndo:1}};UE.plugins.list=function(){function d(a){var b=[],c;for(c in a)b.push(c);return b}function c(a){var b=a.className;return f.hasClass(a,/custom_/)?b.match(/custom_(\w+)/)[1]:f.getStyle(a,"list-style-type")}function b(b,g){p.each(f.getElementsByTagName(b,"ol ul"),function(d){if(f.inDoc(d,b)){var h=d.parentNode;if(h.tagName==d.tagName){var k=c(d)||("OL"==d.tagName?"decimal":"disc"),l=c(h)||("OL"==h.tagName?"decimal":
+"disc");k==l&&(k=p.indexOf(n[d.tagName],k),k=k+1==n[d.tagName].length?0:k+1,e(d,n[d.tagName][k]))}var q=0,k=2;f.hasClass(d,/custom_/)?/[ou]l/i.test(h.tagName)&&f.hasClass(h,/custom_/)||(k=1):/[ou]l/i.test(h.tagName)&&f.hasClass(h,/custom_/)&&(k=3);(h=f.getStyle(d,"list-style-type"))&&(d.style.cssText="list-style-type:"+h);d.className=p.trim(d.className.replace(/list-paddingleft-\w+/,""))+" list-paddingleft-"+k;p.each(f.getElementsByTagName(d,"li"),function(a){a.style.cssText&&(a.style.cssText="");
+if(!a.firstChild)f.remove(a);else if(a.parentNode===d){q++;if(f.hasClass(d,/custom_/)){var b=1,e=c(d);if("OL"==d.tagName){if(e)switch(e){case "cn":case "cn1":case "cn2":10<q&&(0==q%10||10<q&&20>q)?b=2:20<q&&(b=3);break;case "num2":9<q&&(b=2)}a.className="list-"+m[e]+q+" list-"+e+"-paddingleft-"+b}else a.className="list-"+m[e]+" list-"+e+"-paddingleft"}else a.className=a.className.replace(/list-[\w\-]+/gi,"");b=a.getAttribute("class");null===b||b.replace(/\s/g,"")||f.removeAttributes(a,"class")}});
+!g&&a(d,d.tagName.toLowerCase(),c(d)||f.getStyle(d,"list-style-type"),!0)}})}function a(a,e,g,d){var h=a.nextSibling;h&&1==h.nodeType&&h.tagName.toLowerCase()==e&&(c(h)||f.getStyle(h,"list-style-type")||("ol"==e?"decimal":"disc"))==g&&(f.moveChild(h,a),0==h.childNodes.length&&f.remove(h));h&&f.isFillChar(h)&&f.remove(h);(h=a.previousSibling)&&1==h.nodeType&&h.tagName.toLowerCase()==e&&(c(h)||f.getStyle(h,"list-style-type")||("ol"==e?"decimal":"disc"))==g&&f.moveChild(a,h);h&&f.isFillChar(h)&&f.remove(h);
+!d&&f.isEmptyBlock(a)&&f.remove(a);c(a)&&b(a.ownerDocument,!0)}function e(a,b){m[b]&&(a.className="custom_"+b);try{f.setStyle(a,"list-style-type",b)}catch(c){}}function h(a){var b=a.previousSibling;b&&f.isEmptyBlock(b)&&f.remove(b);(b=a.nextSibling)&&f.isEmptyBlock(b)&&f.remove(b)}function g(a){for(;a&&!f.isBody(a);){if("TABLE"==a.nodeName)return null;if("LI"==a.nodeName)return a;a=a.parentNode}}var l=this,k={TD:1,PRE:1,BLOCKQUOTE:1},m={cn:"cn-1-",cn1:"cn-2-",cn2:"cn-3-",num:"num-1-",num1:"num-2-",
+num2:"num-3-",dash:"dash",dot:"dot"};l.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 n={OL:d(l.options.insertorderedlist),UL:d(l.options.insertunorderedlist)},q=l.options.listiconpath,t;for(t in m)l.options.insertorderedlist.hasOwnProperty(t)||
+l.options.insertunorderedlist.hasOwnProperty(t)||delete m[t];l.ready(function(){var a=[],b;for(b in m){if("dash"==b||"dot"==b)a.push("li.list-"+m[b]+"{background-image:url("+q+m[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;99>c;c++)a.push("li.list-"+m[b]+c+"{background-image:url("+q+"list-"+m[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:"+l.options.listDefaultPaddingLeft+"px}");a.push(".list-paddingleft-3{padding-left:"+
+2*l.options.listDefaultPaddingLeft+"px}");p.cssRule("list","ol,ul{margin:0;pading:0;"+(r.ie?"":"width:95%")+"}li{clear:both;}"+a.join("\n"),l.document)});l.ready(function(){f.on(l.body,"cut",function(){setTimeout(function(){var a=l.selection.getRange(),b;if(!a.collapsed&&(b=f.findParentByTagName(a.startContainer,"li",!0))&&!b.nextSibling&&f.isEmptyBlock(b)){b=b.parentNode;var c;(c=b.previousSibling)?(f.remove(b),a.setStartAtLast(c).collapse(!0)):(c=b.nextSibling)?(f.remove(b),a.setStartAtFirst(c).collapse(!0)):
+(c=l.document.createElement("p"),f.fillNode(l.document,c),b.parentNode.insertBefore(c,b),f.remove(b),a.setStart(c,0).collapse(!0));a.select(!0)}})})});l.addListener("beforepaste",function(a,b){var e=this.selection.getRange(),g=UE.htmlparser(b.html,!0);if(e=f.findParentByTagName(e.startContainer,"li",!0)){var d=e.parentNode;p.each(g.getNodesByTagName("OL"==d.tagName?"ul":"ol"),function(b){b.tagName=d.tagName;b.setAttr();if(b.parentNode===g)a=c(d)||("OL"==d.tagName?"decimal":"disc");else{var e=b.parentNode.getAttr("class");
+(a=e&&/custom_/.test(e)?e.match(/custom_(\w+)/)[1]:b.parentNode.getStyle("list-style-type"))||(a="OL"==d.tagName?"decimal":"disc")}e=p.indexOf(n[d.tagName],a);b.parentNode!==g&&(e=e+1==n[d.tagName].length?0:e+1);e=n[d.tagName][e];m[e]?b.setAttr("class","custom_"+e):b.setStyle("list-style-type",e)})}b.html=g.toHtml()});!0===l.getOpt("disablePInList")&&l.addOutputRule(function(a){p.each(a.getNodesByTagName("li"),function(a){var b=[],c=0;p.each(a.children,function(e){if("p"==e.tagName){for(var g;g=e.children.pop();)b.splice(c,
+0,g),g.parentNode=a,lastNode=g;g=b[b.length-1];g&&"element"==g.type&&"br"==g.tagName||(e=UE.uNode.createElement("br"),e.parentNode=a,b.push(e));c=b.length}});b.length&&(a.children=b)})});l.addInputRule(function(a){p.each(a.getNodesByTagName("li"),function(a){for(var b=UE.uNode.createElement("p"),c=0,e;e=a.children[c];)"text"==e.type||v.p[e.tagName]?b.appendChild(e):b.firstChild()?(a.insertBefore(b,e),b=UE.uNode.createElement("p"),c+=2):c++;(b.firstChild()&&!b.parentNode||!a.firstChild())&&a.appendChild(b);
+b.firstChild()||b.innerHTML(r.ie?"&nbsp;":"<br/>");a=a.firstChild();(b=a.lastChild())&&"text"==b.type&&/^\s*$/.test(b.data)&&a.removeChild(b)});if(l.options.autoTransWordToList){var b={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]+\)/},c={square:"n"},e=function(a,e){var g=e.firstChild();if(g&&"element"==g.type&&"span"==g.tagName&&
+/Wingdings|Symbol/.test(g.getStyle("font-family"))){for(var d in c)if(c[d]==g.data)return d;return"disc"}for(d in b)if(b[d].test(a))return d};p.each(a.getNodesByTagName("p"),function(a){if("MsoListParagraph"==a.getAttr("class")){a.setStyle("margin","");a.setStyle("margin-left","");a.setAttr("class","");var c=a,g,d=a;if("li"!=a.parentNode.tagName&&(g=e(a.innerText(),a))){var h=UE.uNode.createElement(l.options.insertorderedlist.hasOwnProperty(g)?"ol":"ul");for(m[g]?h.setAttr("class","custom_"+g):h.setStyle("list-style-type",
+g);a&&"li"!=a.parentNode.tagName&&e(a.innerText(),a);){(c=a.nextSibling())||a.parentNode.insertBefore(h,a);var k=h,f=g;if("ol"==k.tagName)if(r.ie){var n=a.firstChild();"element"==n.type&&"span"==n.tagName&&b[f].test(n.innerText())&&a.removeChild(n)}else a.innerHTML(a.innerHTML().replace(b[f],""));else a.removeChild(a.firstChild());f=UE.uNode.createElement("li");f.appendChild(a);k.appendChild(f);a=c}!h.parentNode&&a&&a.parentNode&&a.parentNode.insertBefore(h,a)}(c=d.firstChild())&&"element"==c.type&&
+"span"==c.tagName&&/^\s*(&nbsp;)+\s*$/.test(c.innerText())&&c.parentNode.removeChild(c)}})}});l.addListener("contentchange",function(){b(l.document)});l.addListener("keydown",function(a,b){function c(){b.preventDefault?b.preventDefault():b.returnValue=!1;l.fireEvent("contentchange");l.undoManger&&l.undoManger.save()}function e(a,b){for(;a&&!f.isBody(a)&&!b(a);){if(1==a.nodeType&&/[ou]l/i.test(a.tagName))return a;a=a.parentNode}return null}var g=b.keyCode||b.which;if(13==g&&!b.shiftKey){var d=l.selection.getRange(),
+k=f.findParent(d.startContainer,function(a){return f.isBlockElm(a)},!0),n=f.findParentByTagName(d.startContainer,"li",!0);k&&"PRE"!=k.tagName&&!n&&(n=k.innerHTML.replace(RegExp(f.fillChar,"g"),""),/^\s*1\s*\.[^\d]/.test(n)&&(k.innerHTML=n.replace(/^\s*1\s*\./,""),d.setStartAtLast(k).collapse(!0).select(),l.__hasEnterExecCommand=!0,l.execCommand("insertorderedlist"),l.__hasEnterExecCommand=!1));d=l.selection.getRange();k=e(d.startContainer,function(a){return"TABLE"==a.tagName});n=d.collapsed?k:e(d.endContainer,
+function(a){return"TABLE"==a.tagName});if(k&&n&&k===n){if(!d.collapsed)if(k=f.findParentByTagName(d.startContainer,"li",!0),n=f.findParentByTagName(d.endContainer,"li",!0),k&&n&&k===n){if(d.deleteContents(),(n=f.findParentByTagName(d.startContainer,"li",!0))&&f.isEmptyBlock(n)){t=n.previousSibling;next=n.nextSibling;k=l.document.createElement("p");f.fillNode(l.document,k);q=n.parentNode;t&&next?(d.setStart(next,0).collapse(!0).select(!0),f.remove(n)):((t||next)&&t?n.parentNode.parentNode.insertBefore(k,
+q.nextSibling):q.parentNode.insertBefore(k,q),f.remove(n),q.firstChild||f.remove(q),d.setStart(k,0).setCursor());c();return}}else{var k=d.cloneRange(),m=k.collapse(!1).createBookmark();d.deleteContents();k.moveToBookmark(m);n=f.findParentByTagName(k.startContainer,"li",!0);h(n);k.select();c();return}if(n=f.findParentByTagName(d.startContainer,"li",!0)){if(f.isEmptyBlock(n)){var m=d.createBookmark(),q=n.parentNode;n!==q.lastChild?(f.breakParent(n,q),h(n)):(q.parentNode.insertBefore(n,q.nextSibling),
+f.isEmptyNode(q)&&f.remove(q));if(!v.$list[n.parentNode.tagName])if(f.isBlockElm(n.firstChild))f.remove(n,!0);else{k=l.document.createElement("p");for(n.parentNode.insertBefore(k,n);n.firstChild;)k.appendChild(n.firstChild);f.remove(n)}d.moveToBookmark(m).select()}else{k=n.firstChild;if(!k||!f.isBlockElm(k)){k=l.document.createElement("p");for(!n.firstChild&&f.fillNode(l.document,k);n.firstChild;)k.appendChild(n.firstChild);n.appendChild(k)}m=l.document.createElement("span");d.insertNode(m);f.breakParent(m,
+n);t=m.nextSibling;k=t.firstChild;k||(k=l.document.createElement("p"),f.fillNode(l.document,k),t.appendChild(k));f.isEmptyNode(k)&&(k.innerHTML="",f.fillNode(l.document,k));d.setStart(k,0).collapse(!0).shrinkBoundary().select();f.remove(m);var t=t.previousSibling;t&&f.isEmptyBlock(t)&&(t.innerHTML="<p></p>",f.fillNode(l.document,t.firstChild))}c()}}}if(8==g&&(d=l.selection.getRange(),d.collapsed&&f.isStartInblock(d)&&(k=d.cloneRange().trimBoundary(),(n=f.findParentByTagName(d.startContainer,"li",
+!0))&&f.isStartInblock(k))))if((k=f.findParentByTagName(d.startContainer,"p",!0))&&k!==n.firstChild)q=f.findParentByTagName(k,["ol","ul"]),f.breakParent(k,q),h(k),l.fireEvent("contentchange"),d.setStart(k,0).setCursor(!1,!0),l.fireEvent("saveScene"),f.preventDefault(b);else if(n&&(t=n.previousSibling)){if(46!=g||!n.childNodes.length){v.$list[t.tagName]&&(t=t.lastChild);l.undoManger&&l.undoManger.save();k=n.firstChild;if(f.isBlockElm(k))if(f.isEmptyNode(k))for(t.appendChild(k),d.setStart(k,0).setCursor(!1,
+!0);n.firstChild;)t.appendChild(n.firstChild);else m=l.document.createElement("span"),d.insertNode(m),f.isEmptyBlock(t)&&(t.innerHTML=""),f.moveChild(n,t),d.setStartBefore(m).collapse(!0).select(!0),f.remove(m);else if(f.isEmptyNode(n))k=l.document.createElement("p"),t.appendChild(k),d.setStart(k,0).setCursor();else for(d.setEnd(t,t.childNodes.length).collapse().select(!0);n.firstChild;)t.appendChild(n.firstChild);f.remove(n);l.fireEvent("contentchange");l.fireEvent("saveScene");f.preventDefault(b)}}else if(n&&
+!n.previousSibling){q=n.parentNode;m=d.createBookmark();if(f.isTagNode(q.parentNode,"ol ul"))q.parentNode.insertBefore(n,q);else{for(;n.firstChild;)q.parentNode.insertBefore(n.firstChild,q);f.remove(n)}f.isEmptyNode(q)&&f.remove(q);d.moveToBookmark(m).setCursor(!1,!0);l.fireEvent("contentchange");l.fireEvent("saveScene");f.preventDefault(b)}});l.addListener("keyup",function(b,e){if(8==(e.keyCode||e.which)){var g=l.selection.getRange(),d;(d=f.findParentByTagName(g.startContainer,["ol","ul"],!0))&&
+a(d,d.tagName.toLowerCase(),c(d)||f.getComputedStyle(d,"list-style-type"),!0)}});l.addListener("tabkeydown",function(){function b(a){if(-1!=l.options.maxListLevel){a=a.parentNode;for(var c=0;/[ou]l/i.test(a.tagName);)c++,a=a.parentNode;if(c>=l.options.maxListLevel)return!0}}var g=l.selection.getRange(),d=f.findParentByTagName(g.startContainer,"li",!0);if(d){var h;if(g.collapsed){if(b(d))return!0;var k=d.parentNode,m=l.document.createElement(k.tagName),q=p.indexOf(n[m.tagName],c(k)||f.getComputedStyle(k,
+"list-style-type")),q=q+1==n[m.tagName].length?0:q+1,q=n[m.tagName][q];e(m,q);if(f.isStartInblock(g))return l.fireEvent("saveScene"),h=g.createBookmark(),k.insertBefore(m,d),m.appendChild(d),a(m,m.tagName.toLowerCase(),q),l.fireEvent("contentchange"),g.moveToBookmark(h).select(!0),!0}else{l.fireEvent("saveScene");h=g.createBookmark();for(var k=0,t,m=f.findParents(d),r;r=m[k++];)if(f.isTagNode(r,"ol ul")){t=r;break}r=d;if(h.end)for(;r&&!(f.getPosition(r,h.end)&f.POSITION_FOLLOWING);)if(b(r))r=f.getNextDomNode(r,
+!1,null,function(a){return a!==t});else{k=r.parentNode;m=l.document.createElement(k.tagName);q=p.indexOf(n[m.tagName],c(k)||f.getComputedStyle(k,"list-style-type"));q=n[m.tagName][q+1==n[m.tagName].length?0:q+1];e(m,q);for(k.insertBefore(m,r);r&&!(f.getPosition(r,h.end)&f.POSITION_FOLLOWING);){d=r.nextSibling;m.appendChild(r);if(!d||f.isTagNode(d,"ol ul")){if(d)for(;(d=d.firstChild)&&"LI"!=d.tagName;);else d=f.getNextDomNode(r,!1,null,function(a){return a!==t});break}r=d}a(m,m.tagName.toLowerCase(),
+q);r=d}l.fireEvent("contentchange");g.moveToBookmark(h).select();return!0}}});l.commands.insertorderedlist=l.commands.insertunorderedlist={execCommand:function(b,d){d||(d="insertorderedlist"==b.toLowerCase()?"decimal":"disc");var h=this.selection.getRange(),l=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!f.isWhitespace(a)},n="insertorderedlist"==b.toLowerCase()?"ol":"ul",m=this.document.createDocumentFragment();h.adjustmentBoundary().shrinkBoundary();var q=h.createBookmark(!0),t=
+g(this.document.getElementById(q.start)),p=0,r=g(this.document.getElementById(q.end)),s=0,z,H,D,B;if(t||r){t&&(z=t.parentNode);q.end||(r=t);r&&(H=r.parentNode);if(z===H){for(;t!==r;){B=t;t=t.nextSibling;if(!f.isBlockElm(B.firstChild)){for(l=this.document.createElement("p");B.firstChild;)l.appendChild(B.firstChild);B.appendChild(l)}m.appendChild(B)}B=this.document.createElement("span");z.insertBefore(B,r);if(!f.isBlockElm(r.firstChild)){for(l=this.document.createElement("p");r.firstChild;)l.appendChild(r.firstChild);
+r.appendChild(l)}m.appendChild(r);f.breakParent(B,z);f.isEmptyNode(B.previousSibling)&&f.remove(B.previousSibling);f.isEmptyNode(B.nextSibling)&&f.remove(B.nextSibling);l=c(z)||f.getComputedStyle(z,"list-style-type")||("insertorderedlist"==b.toLowerCase()?"decimal":"disc");if(z.tagName.toLowerCase()==n&&l==d){r=0;for(r=this.document.createDocumentFragment();l=m.firstChild;)if(f.isTagNode(l,"ol ul"))r.appendChild(l);else for(;l.firstChild;)r.appendChild(l.firstChild),f.remove(l);B.parentNode.insertBefore(r,
+B)}else D=this.document.createElement(n),e(D,d),D.appendChild(m),B.parentNode.insertBefore(D,B);f.remove(B);D&&a(D,n,d);h.moveToBookmark(q).select();return}if(t){for(;t;){B=t.nextSibling;if(f.isTagNode(t,"ol ul"))m.appendChild(t);else{D=this.document.createDocumentFragment();for(var O=0;t.firstChild;)f.isBlockElm(t.firstChild)&&(O=1),D.appendChild(t.firstChild);O?m.appendChild(D):(O=this.document.createElement("p"),O.appendChild(D),m.appendChild(O));f.remove(t)}t=B}z.parentNode.insertBefore(m,z.nextSibling);
+f.isEmptyNode(z)?(h.setStartBefore(z),f.remove(z)):h.setStartAfter(z);p=1}if(r&&f.inDoc(H,this.document)){for(t=H.firstChild;t&&t!==r;){B=t.nextSibling;if(f.isTagNode(t,"ol ul"))m.appendChild(t);else{D=this.document.createDocumentFragment();for(O=0;t.firstChild;)f.isBlockElm(t.firstChild)&&(O=1),D.appendChild(t.firstChild);O?m.appendChild(D):(O=this.document.createElement("p"),O.appendChild(D),m.appendChild(O));f.remove(t)}t=B}B=f.createElement(this.document,"div",{tmpDiv:1});f.moveChild(r,B);m.appendChild(B);
+f.remove(r);H.parentNode.insertBefore(m,H);h.setEndBefore(H);f.isEmptyNode(H)&&f.remove(H);s=1}}p||h.setStartBefore(this.document.getElementById(q.start));q.end&&!s&&h.setEndAfter(this.document.getElementById(q.end));h.enlarge(!0,function(a){return k[a.tagName]});m=this.document.createDocumentFragment();r=h.createBookmark();z=f.getNextDomNode(r.start,!1,l);D=h.cloneRange();for(p=f.isBlockElm;z&&z!==r.end&&f.getPosition(z,r.end)&f.POSITION_PRECEDING;)if(3==z.nodeType||v.li[z.tagName])if(1==z.nodeType&&
+v.$list[z.tagName]){for(;z.firstChild;)m.appendChild(z.firstChild);t=f.getNextDomNode(z,!1,l);f.remove(z);z=t}else{t=z;for(D.setStartBefore(z);z&&z!==r.end&&(!p(z)||f.isBookmarkNode(z));)t=z,z=f.getNextDomNode(z,!1,null,function(a){return!k[a.tagName]});z&&p(z)&&(B=f.getNextDomNode(t,!1,l))&&f.isBookmarkNode(B)&&(z=f.getNextDomNode(B,!1,l),t=B);D.setEndAfter(t);z=f.getNextDomNode(t,!1,l);B=h.document.createElement("li");B.appendChild(D.extractContents());if(f.isEmptyNode(B)){for(t=h.document.createElement("p");B.firstChild;)t.appendChild(B.firstChild);
+B.appendChild(t)}m.appendChild(B)}else z=f.getNextDomNode(z,!0,l);h.moveToBookmark(r).collapse(!0);D=this.document.createElement(n);e(D,d);D.appendChild(m);h.insertNode(D);a(D,n,d);r=0;for(n=f.getElementsByTagName(D,"div");l=n[r++];)l.getAttribute("tmpDiv")&&f.remove(l,!0);h.moveToBookmark(q).select()},queryCommandState:function(a){a="insertorderedlist"==a.toLowerCase()?"ol":"ul";for(var b=this.selection.getStartElementPath(),c=0,e;(e=b[c++])&&"TABLE"!=e.nodeName;)if(a==e.nodeName.toLowerCase())return 1;
+return 0},queryCommandValue:function(a){a="insertorderedlist"==a.toLowerCase()?"ol":"ul";for(var b=this.selection.getStartElementPath(),e,g=0,d;d=b[g++];){if("TABLE"==d.nodeName){e=null;break}if(a==d.nodeName.toLowerCase()){e=d;break}}return e?c(e)||f.getComputedStyle(e,"list-style-type"):null}}};(function(){var d={textarea:function(c,b){var a=b.ownerDocument.createElement("textarea");a.style.cssText="position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;";
+r.ie&&8>r.version&&(a.style.width=b.offsetWidth+"px",a.style.height=b.offsetHeight+"px",b.onresize=function(){a.style.width=b.offsetWidth+"px";a.style.height=b.offsetHeight+"px"});b.appendChild(a);return{setContent:function(b){a.value=b},getContent:function(){return a.value},select:function(){var b;r.ie?(b=a.createTextRange(),b.collapse(!0),b.select()):(a.setSelectionRange(0,0),a.focus())},dispose:function(){b.removeChild(a);b=a=b.onresize=null}}},codemirror:function(c,b){var a=window.CodeMirror(b,
+{mode:"text/html",tabMode:"indent",lineNumbers:!0,lineWrapping:!0}),e=a.getWrapperElement();e.style.cssText='position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;';a.getScrollerElement().style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;";a.refresh();return{getCodeMirror:function(){return a},setContent:function(b){a.setValue(b)},getContent:function(){return a.getValue()},select:function(){a.focus()},dispose:function(){b.removeChild(e);
+a=e=null}}}};UE.plugins.source=function(){var c=this,b=this.options,a=!1,e,h;b.sourceEditor=r.ie?"textarea":b.sourceEditor||"codemirror";c.setOpt({sourceEditorFirst:!1});var g,l,k;c.commands.source={execCommand:function(){if(a=!a){k=c.selection.getRange().createAddress(!1,!0);c.undoManger&&c.undoManger.save(!0);r.gecko&&(c.body.contentEditable=!1);g=c.iframe.style.cssText;c.iframe.style.cssText+="position:absolute;left:-32768px;top:-32768px;";c.fireEvent("beforegetcontent");var n=UE.htmlparser(c.body.innerHTML);
+c.filterOutputRule(n);n.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(/&nbsp;/g," "))}});c.fireEvent("aftergetcontent");n=n.toHtml(!0);e=d["codemirror"==b.sourceEditor&&window.CodeMirror?"codemirror":"textarea"](c,c.iframe.parentNode);e.setContent(n);h=c.setContent;c.setContent=function(a){a=UE.htmlparser(a);
+c.filterInputRule(a);a=a.toHtml();e.setContent(a)};setTimeout(function(){e.select();c.addListener("fullscreenchanged",function(){try{e.getCodeMirror().refresh()}catch(a){}})});l=c.getContent;c.getContent=function(){return e.getContent()||"<p>"+(r.ie?"":"<br/>")+"</p>"}}else if(c.iframe.style.cssText=g,n=e.getContent()||"<p>"+(r.ie?"":"<br/>")+"</p>",n=n.replace(RegExp("[\\r\\t\\n ]*</?(\\w+)\\s*(?:[^>]*)>","g"),function(a,b){return b&&!v.$inlineWithA[b.toLowerCase()]?a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,
+""):a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,"")}),c.setContent=h,c.setContent(n),e.dispose(),e=null,c.getContent=l,n=c.body.firstChild,n||(c.body.innerHTML="<p>"+(r.ie?"":"<br/>")+"</p>",n=c.body.firstChild),c.undoManger&&c.undoManger.save(!0),r.gecko){var m=document.createElement("input");m.style.cssText="position:absolute;left:0;top:-32768px";document.body.appendChild(m);c.body.contentEditable=!1;setTimeout(function(){f.setViewportOffset(m,{left:-32768,top:0});m.focus();setTimeout(function(){c.body.contentEditable=
+!0;c.selection.getRange().moveToAddress(k).select(!0);f.remove(m)})})}else try{c.selection.getRange().moveToAddress(k).select(!0)}catch(t){}this.fireEvent("sourcemodechanged",a)},queryCommandState:function(){return a|0},notNeedUndo:1};var m=c.queryCommandState;c.queryCommandState=function(b){b=b.toLowerCase();return a?b in{source:1,fullscreen:1}?1:-1:m.apply(this,arguments)};"codemirror"==b.sourceEditor&&c.addListener("ready",function(){p.loadFile(document,{src:b.codeMirrorJsUrl||b.UEDITOR_HOME_URL+
+"third-party/codemirror/codemirror.js",tag:"script",type:"text/javascript",defer:"defer"},function(){b.sourceEditorFirst&&setTimeout(function(){c.execCommand("source")},0)});p.loadFile(document,{tag:"link",rel:"stylesheet",type:"text/css",href:b.codeMirrorCssUrl||b.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.css"})})}})();UE.plugins.enterkey=function(){var d,c=this,b=c.options.enterTag;c.addListener("keyup",function(a,b){if(13==(b.keyCode||b.which)){var h=c.selection.getRange(),g=h.startContainer,
+l;if(r.ie)c.fireEvent("saveScene",!0,!0);else{if(/h\d/i.test(d)){if(r.gecko)f.findParentByTagName(g,"h1 h2 h3 h4 h5 h6 blockquote caption table".split(" "),!0)||(c.document.execCommand("formatBlock",!1,"<p>"),l=1);else if(1==g.nodeType){var g=c.document.createTextNode(""),k;h.insertNode(g);if(k=f.findParentByTagName(g,"div",!0)){for(l=c.document.createElement("p");k.firstChild;)l.appendChild(k.firstChild);k.parentNode.insertBefore(l,k);f.remove(k);h.setStartBefore(g).setCursor();l=1}f.remove(g)}c.undoManger&&
+l&&c.undoManger.save()}r.opera&&h.select()}}});c.addListener("keydown",function(a,e){if(13==(e.keyCode||e.which))if(c.fireEvent("beforeenterkeydown"))f.preventDefault(e);else{c.fireEvent("saveScene",!0,!0);d="";var h=c.selection.getRange();if(!h.collapsed){var g=h.startContainer,l=h.endContainer,g=f.findParentByTagName(g,"td",!0),l=f.findParentByTagName(l,"td",!0);if(g&&l&&g!==l||!g&&l||g&&!l){e.preventDefault?e.preventDefault():e.returnValue=!1;return}}if("p"==b)r.ie||((g=f.findParentByTagName(h.startContainer,
+"ol ul p h1 h2 h3 h4 h5 h6 blockquote caption".split(" "),!0))||r.opera?(d=g.tagName,"p"==g.tagName.toLowerCase()&&r.gecko&&f.removeDirtyAttr(g)):(c.document.execCommand("formatBlock",!1,"<p>"),r.gecko&&(h=c.selection.getRange(),(g=f.findParentByTagName(h.startContainer,"p",!0))&&f.removeDirtyAttr(g))));else if(e.preventDefault?e.preventDefault():e.returnValue=!1,h.collapsed)l=h.document.createElement("br"),h.insertNode(l),l.parentNode.lastChild===l?(l.parentNode.insertBefore(l.cloneNode(!0),l),h.setStartBefore(l)):
+h.setStartAfter(l),h.setCursor();else if(h.deleteContents(),g=h.startContainer,1==g.nodeType&&(g=g.childNodes[h.startOffset])){for(;1==g.nodeType;){if(v.$empty[g.tagName])return h.setStartBefore(g).setCursor(),c.undoManger&&c.undoManger.save(),!1;if(!g.firstChild)return l=h.document.createElement("br"),g.appendChild(l),h.setStart(g,0).setCursor(),c.undoManger&&c.undoManger.save(),!1;g=g.firstChild}g===h.startContainer.childNodes[h.startOffset]?(l=h.document.createElement("br"),h.insertNode(l).setCursor()):
+h.setStart(g,0).setCursor()}else l=h.document.createElement("br"),h.insertNode(l).setStartAfter(l).setCursor()}})};UE.plugins.keystrokes=function(){var d=this,c=!0;d.addListener("keydown",function(b,a){var e=a.keyCode||a.which,h=d.selection.getRange();if(!(h.collapsed||a.ctrlKey||a.shiftKey||a.altKey||a.metaKey)&&(65<=e&&90>=e||48<=e&&57>=e||96<=e&&111>=e||{13:1,8:1,46:1}[e])){var g=h.startContainer;f.isFillChar(g)&&h.setStartBefore(g);g=h.endContainer;f.isFillChar(g)&&h.setEndAfter(g);h.txtToElmBoundary();
+h.endContainer&&1==h.endContainer.nodeType&&(g=h.endContainer.childNodes[h.endOffset])&&f.isBr(g)&&h.setEndAfter(g);if(0==h.startOffset&&(g=h.startContainer,f.isBoundaryNode(g,"firstChild")&&(g=h.endContainer,h.endOffset==(3==g.nodeType?g.nodeValue.length:g.childNodes.length)&&f.isBoundaryNode(g,"lastChild")))){d.fireEvent("saveScene");d.body.innerHTML="<p>"+(r.ie?"":"<br/>")+"</p>";h.setStart(d.body.firstChild,0).setCursor(!1,!0);d._selectionChange();return}}if(e==$.Backspace){h=d.selection.getRange();
+c=h.collapsed;if(d.fireEvent("delkeydown",a))return;var l,k;h.collapsed&&h.inFillChar()&&(l=h.startContainer,f.isFillChar(l)?(h.setStartBefore(l).shrinkBoundary(!0).collapse(!0),f.remove(l)):(l.nodeValue=l.nodeValue.replace(RegExp("^"+f.fillChar),""),h.startOffset--,h.collapse(!0).select(!0)));if(l=h.getClosedNode()){d.fireEvent("saveScene");h.setStartBefore(l);f.remove(l);h.setCursor();d.fireEvent("saveScene");f.preventDefault(a);return}if(!r.ie&&(l=f.findParentByTagName(h.startContainer,"table",
+!0),k=f.findParentByTagName(h.endContainer,"table",!0),l&&!k||!l&&k||l!==k)){a.preventDefault();return}}if(e==$.Tab){var m={ol:1,ul:1,table:1};if(d.fireEvent("tabkeydown",a)){f.preventDefault(a);return}h=d.selection.getRange();d.fireEvent("saveScene");var g=0,n="";l=d.options.tabSize||4;for(k=d.options.tabNode||"&nbsp;";g<l;g++)n+=k;g=d.document.createElement("span");g.innerHTML=n+f.fillChar;if(h.collapsed)h.insertNode(g.cloneNode(!0).firstChild).setCursor(!0);else if(n=function(a){return f.isBlockElm(a)&&
+!m[a.tagName.toLowerCase()]},l=f.findParent(h.startContainer,n,!0),k=f.findParent(h.endContainer,n,!0),l&&k&&l===k)h.deleteContents(),h.insertNode(g.cloneNode(!0).firstChild).setCursor(!0);else{l=h.createBookmark();h.enlarge(!0);k=h.createBookmark();for(var q=f.getNextDomNode(k.start,!1,n);q&&!(f.getPosition(q,k.end)&f.POSITION_FOLLOWING);)q.insertBefore(g.cloneNode(!0).firstChild,q.firstChild),q=f.getNextDomNode(q,!1,n);h.moveToBookmark(k).moveToBookmark(l).select()}f.preventDefault(a)}if(r.gecko&&
+46==e&&(h=d.selection.getRange(),h.collapsed&&(l=h.startContainer,f.isEmptyBlock(l)))){for(e=l.parentNode;1==f.getChildCount(e)&&!f.isBody(e);)l=e,e=e.parentNode;l===e.lastChild&&a.preventDefault()}});d.addListener("keyup",function(b,a){var e;if((a.keyCode||a.which)==$.Backspace&&!this.fireEvent("delkeyup")){e=this.selection.getRange();if(e.collapsed){var d;if((d=f.findParentByTagName(e.startContainer,"h1 h2 h3 h4 h5 h6".split(" "),!0))&&f.isEmptyBlock(d)){var g=d.previousSibling;if(g&&"TABLE"!=g.nodeName){f.remove(d);
+e.setStartAtLast(g).setCursor(!1,!0);return}if((g=d.nextSibling)&&"TABLE"!=g.nodeName){f.remove(d);e.setStartAtFirst(g).setCursor(!1,!0);return}}f.isBody(e.startContainer)&&(d=f.createElement(this.document,"p",{innerHTML:r.ie?f.fillChar:"<br/>"}),e.insertNode(d).setStart(d,0).setCursor(!1,!0))}!c&&(3==e.startContainer.nodeType||1==e.startContainer.nodeType&&f.isEmptyBlock(e.startContainer))&&(r.ie?(d=e.document.createElement("span"),e.insertNode(d).setStartBefore(d).collapse(!0),e.select(),f.remove(d)):
+e.select())}})};UE.plugins.fiximgclick=function(){function d(){this.cover=this.resizer=this.editor=null;this.doc=document;this.prePos={x:0,y:0};this.startPos={x:0,y:0}}var c=!1;(function(){var b=[[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]];d.prototype={init:function(a){var b=this;b.editor=a;b.startPos=this.prePos={x:0,y:0};b.dragId=-1;a=[];var c=b.cover=document.createElement("div"),g=b.resizer=document.createElement("div");c.id=b.editor.ui.id+"_imagescale_cover";
+c.style.cssText="position:absolute;display:none;z-index:"+b.editor.options.zIndex+";filter:alpha(opacity=0); opacity:0;background:#CCC;";f.on(c,"mousedown click",function(){b.hide()});for(i=0;8>i;i++)a.push('<span class="edui-editor-imagescale-hand'+i+'"></span>');g.id=b.editor.ui.id+"_imagescale";g.className="edui-editor-imagescale";g.innerHTML=a.join("");g.style.cssText+=";display:none;border:1px solid #3b77ff;z-index:"+b.editor.options.zIndex+";";b.editor.ui.getDom().appendChild(c);b.editor.ui.getDom().appendChild(g);
+b.initStyle();b.initEvents()},initStyle:function(){p.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(){this.startPos.x=this.startPos.y=0;this.isDraging=!1},_eventHandler:function(a){switch(a.type){case "mousedown":var b=a.target||a.srcElement;-1!=b.className.indexOf("edui-editor-imagescale-hand")&&-1==this.dragId&&(this.dragId=b.className.slice(-1),this.startPos.x=this.prePos.x=a.clientX,this.startPos.y=this.prePos.y=a.clientY,f.on(this.doc,"mousemove",this.proxy(this._eventHandler,this)));break;case "mousemove":-1!=this.dragId&&(this.updateContainerStyle(this.dragId,{x:a.clientX-
+this.prePos.x,y:a.clientY-this.prePos.y}),this.prePos.x=a.clientX,this.prePos.y=a.clientY,c=!0,this.updateTargetElement());break;case "mouseup":-1!=this.dragId&&(this.updateContainerStyle(this.dragId,{x:a.clientX-this.prePos.x,y:a.clientY-this.prePos.y}),this.updateTargetElement(),this.target.parentNode&&this.attachTo(this.target),this.dragId=-1),f.un(this.doc,"mousemove",this.proxy(this._eventHandler,this)),c&&(c=!1,this.editor.fireEvent("contentchange"))}},updateTargetElement:function(){f.setStyles(this.target,
+{width:this.resizer.style.width,height:this.resizer.style.height});this.target.width=parseInt(this.resizer.style.width);this.target.height=parseInt(this.resizer.style.height);this.attachTo(this.target)},updateContainerStyle:function(a,c){var d=this.resizer,g;0!=b[a][0]&&(g=parseInt(d.style.left)+c.x,d.style.left=this._validScaledProp("left",g)+"px");0!=b[a][1]&&(g=parseInt(d.style.top)+c.y,d.style.top=this._validScaledProp("top",g)+"px");0!=b[a][2]&&(g=d.clientWidth+b[a][2]*c.x,d.style.width=this._validScaledProp("width",
+g)+"px");0!=b[a][3]&&(g=d.clientHeight+b[a][3]*c.y,d.style.height=this._validScaledProp("height",g)+"px")},_validScaledProp:function(a,b){var c=this.resizer,g=document;b=isNaN(b)?0:b;switch(a){case "left":return 0>b?0:b+c.clientWidth>g.clientWidth?g.clientWidth-c.clientWidth:b;case "top":return 0>b?0:b+c.clientHeight>g.clientHeight?g.clientHeight-c.clientHeight:b;case "width":return 0>=b?1:b+c.offsetLeft>g.clientWidth?g.clientWidth-c.offsetLeft:b;case "height":return 0>=b?1:b+c.offsetTop>g.clientHeight?
+g.clientHeight-c.offsetTop:b}},hideCover:function(){this.cover.style.display="none"},showCover:function(){var a=f.getXY(this.editor.ui.getDom()),b=f.getXY(this.editor.iframe);f.setStyles(this.cover,{width:this.editor.iframe.offsetWidth+"px",height:this.editor.iframe.offsetHeight+"px",top:b.y-a.y+"px",left:b.x-a.x+"px",position:"absolute",display:""})},show:function(a){this.resizer.style.display="block";a&&this.attachTo(a);f.on(this.resizer,"mousedown",this.proxy(this._eventHandler,this));f.on(this.doc,
+"mouseup",this.proxy(this._eventHandler,this));this.showCover();this.editor.fireEvent("afterscaleshow",this);this.editor.fireEvent("saveScene")},hide:function(){this.hideCover();this.resizer.style.display="none";f.un(this.resizer,"mousedown",this.proxy(this._eventHandler,this));f.un(this.doc,"mouseup",this.proxy(this._eventHandler,this));this.editor.fireEvent("afterscalehide",this)},proxy:function(a,b){return function(c){return a.apply(b||this,arguments)}},attachTo:function(a){a=this.target=a;var b=
+this.resizer,c=f.getXY(a),g=f.getXY(this.editor.iframe),d=f.getXY(b.parentNode);f.setStyles(b,{width:a.width+"px",height:a.height+"px",left:g.x+c.x-this.editor.document.body.scrollLeft-d.x-parseInt(b.style.borderLeftWidth)+"px",top:g.y+c.y-this.editor.document.body.scrollTop-d.y-parseInt(b.style.borderTopWidth)+"px"})}}})();return function(){var b=this,a;b.setOpt("imageScaleEnabled",!0);!r.ie&&b.options.imageScaleEnabled&&b.addListener("click",function(c,h){var g=b.selection.getRange().getClosedNode();
+if(g&&"IMG"==g.tagName&&"false"!=b.body.contentEditable){if(!(-1!=g.className.indexOf("edui-faked-music")||g.getAttribute("anchorname")||f.hasClass(g,"loadingclass")||f.hasClass(g,"loaderrorclass"))){if(!a){a=new d;a.init(b);b.ui.getDom().appendChild(a.resizer);var l=function(c){a.hide();a.target&&b.selection.getRange().selectNode(a.target).select()},k=function(a){var b=a.target||a.srcElement;!b||void 0!==b.className&&-1!=b.className.indexOf("edui-editor-imagescale")||l(a)},m;b.addListener("afterscaleshow",
+function(a){b.addListener("beforekeydown",l);b.addListener("beforemousedown",k);f.on(document,"keydown",l);f.on(document,"mousedown",k);b.selection.getNative().removeAllRanges()});b.addListener("afterscalehide",function(c){b.removeListener("beforekeydown",l);b.removeListener("beforemousedown",k);f.un(document,"keydown",l);f.un(document,"mousedown",k);c=a.target;c.parentNode&&b.selection.getRange().selectNode(c).select()});f.on(a.resizer,"mousedown",function(c){b.selection.getNative().removeAllRanges();
+var e=c.target||c.srcElement;e&&-1==e.className.indexOf("edui-editor-imagescale-hand")&&(m=setTimeout(function(){a.hide();a.target&&b.selection.getRange().selectNode(e).select()},200))});f.on(a.resizer,"mouseup",function(a){(a=a.target||a.srcElement)&&-1==a.className.indexOf("edui-editor-imagescale-hand")&&clearTimeout(m)})}a.show(g)}}else a&&"none"!=a.resizer.style.display&&a.hide()});r.webkit&&b.addListener("click",function(a,c){"IMG"==c.target.tagName&&"false"!=b.body.contentEditable&&(new L.Range(b.document)).selectNode(c.target).select()})}}();
+UE.plugin.register("autolink",function(){return r.ie?{}:{bindEvents:{reset:function(){},keydown:function(d,c){var b=c.keyCode||c.which;if(32==b||13==b){for(var b=this.selection.getNative(),a=b.getRangeAt(0).cloneRange(),e,h=a.startContainer;1==h.nodeType&&0<a.startOffset;){h=a.startContainer.childNodes[a.startOffset-1];if(!h)break;a.setStart(h,1==h.nodeType?h.childNodes.length:h.nodeValue.length);a.collapse(!0);h=a.startContainer}do{if(0==a.startOffset){for(h=a.startContainer.previousSibling;h&&1==
+h.nodeType;)h=h.lastChild;if(!h||f.isFillChar(h))break;e=h.nodeValue.length}else h=a.startContainer,e=a.startOffset;a.setStart(h,e-1);e=a.toString().charCodeAt(0)}while(160!=e&&32!=e);if(a.toString().replace(RegExp(f.fillChar,"g"),"").match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)){for(;a.toString().length&&!/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(a.toString());)try{a.setStart(a.startContainer,a.startOffset+1)}catch(g){for(h=a.startContainer;!(next=h.nextSibling);){if(f.isBody(h))return;
+h=h.parentNode}a.setStart(next,0)}if(!f.findParentByTagName(a.startContainer,"a",!0)){e=this.document.createElement("a");var h=this.document.createTextNode(" "),l;this.undoManger&&this.undoManger.save();e.appendChild(a.extractContents());e.href=e.innerHTML=e.innerHTML.replace(/<[^>]+>/g,"");l=e.getAttribute("href").replace(RegExp(f.fillChar,"g"),"");l=/^(?:https?:\/\/)/ig.test(l)?l:"http://"+l;e.setAttribute("_src",p.html(l));e.href=p.html(l);a.insertNode(e);e.parentNode.insertBefore(h,e.nextSibling);
+a.setStart(h,0);a.collapse(!0);b.removeAllRanges();b.addRange(a);this.undoManger&&this.undoManger.save()}}}}}}},function(){function d(b){if(3==b.nodeType)return null;if("A"==b.nodeName)return b;for(b=b.lastChild;b;){if("A"==b.nodeName)return b;if(3==b.nodeType){if(f.isWhitespace(b)){b=b.previousSibling;continue}return null}b=b.lastChild}}var c={37:1,38:1,39:1,40:1,13:1,32:1};r.ie&&this.addListener("keyup",function(b,a){var e=a.keyCode;if(c[e]){var h=this.selection.getRange(),g=h.startContainer;if(13==
+e){for(;g&&!f.isBody(g)&&!f.isBlockElm(g);)g=g.parentNode;g&&!f.isBody(g)&&"P"==g.nodeName&&(h=g.previousSibling)&&1==h.nodeType&&(h=d(h))&&!h.getAttribute("_href")&&f.remove(h,!0)}else 32==e?3==g.nodeType&&/^\s$/.test(g.nodeValue)&&(g=g.previousSibling)&&"A"==g.nodeName&&!g.getAttribute("_href")&&f.remove(g,!0):(g=f.findParentByTagName(g,"a",!0))&&!g.getAttribute("_href")&&(e=h.createBookmark(),f.remove(g,!0),h.moveToBookmark(e).select(!0))}})});UE.plugins.autoheight=function(){function d(){var b=
+this;clearTimeout(g);l||b.queryCommandState&&(!b.queryCommandState||1==b.queryCommandState("source"))||(g=setTimeout(function(){for(var c=b.body.lastChild;c&&1!=c.nodeType;)c=c.previousSibling;c&&1==c.nodeType&&(c.style.clear="both",h=Math.max(f.getXY(c).y+c.offsetHeight+25,Math.max(e.minFrameHeight,e.initialFrameHeight)),h!=a&&(h!==parseInt(b.iframe.parentNode.style.height)&&(b.iframe.parentNode.style.height=h+"px"),b.body.style.height=h+"px",a=h),f.removeStyle(c,"clear"))},50))}var c=this;c.autoHeightEnabled=
+!1!==c.options.autoHeightEnabled;if(c.autoHeightEnabled){var b,a=0,e=c.options,h,g,l;c.addListener("fullscreenchanged",function(a,b){l=b});c.addListener("destroy",function(){c.removeListener("contentchange afterinserthtml keyup mouseup",d)});c.enableAutoHeight=function(){var a=this;if(a.autoHeightEnabled){var c=a.document;a.autoHeightEnabled=!0;b=c.body.style.overflowY;c.body.style.overflowY="hidden";a.addListener("contentchange afterinserthtml keyup mouseup",d);setTimeout(function(){d.call(a)},r.gecko?
+100:0);a.fireEvent("autoheightchanged",a.autoHeightEnabled)}};c.disableAutoHeight=function(){c.body.style.overflowY=b||"";c.removeListener("contentchange",d);c.removeListener("keyup",d);c.removeListener("mouseup",d);c.autoHeightEnabled=!1;c.fireEvent("autoheightchanged",c.autoHeightEnabled)};c.on("setHeight",function(){c.disableAutoHeight()});c.addListener("ready",function(){c.enableAutoHeight();var a;f.on(r.ie?c.body:c.document,r.webkit?"dragover":"drop",function(){clearTimeout(a);a=setTimeout(function(){d.call(c)},
+100)});var b;window.onscroll=function(){null===b?b=this.scrollY:0==this.scrollY&&0!=b&&(c.window.scrollTo(0,0),b=null)}})}};UE.plugins.autofloat=function(){function d(){var a=document.body.style;a.backgroundImage='url("about:blank")';a.backgroundAttachment="fixed"}function c(){y=!0;n.parentNode&&n.parentNode.removeChild(n);q.style.cssText=m}function b(){var b=w(a.container),e=a.options.toolbarTopOffset||0;if(0>b.top&&b.bottom-q.offsetHeight>e){var b=f.getXY(q),e=f.getComputedStyle(q,"position"),g=
+f.getComputedStyle(q,"left");q.style.width=q.offsetWidth+"px";q.style.zIndex=1*a.options.zIndex+1;q.parentNode.insertBefore(n,q);l||k&&r.ie?("absolute"!=q.style.position&&(q.style.position="absolute"),q.style.top=(document.body.scrollTop||document.documentElement.scrollTop)-t+h+"px"):(r.ie7Compat&&y&&(y=!1,q.style.left=f.getXY(q).x-document.documentElement.getBoundingClientRect().left+2+"px"),"fixed"!=q.style.position&&(q.style.position="fixed",q.style.top=h+"px",("absolute"==e||"relative"==e)&&parseFloat(g)&&
+(q.style.left=b.x+"px")))}else c()}var a=this,e=a.getLang();a.setOpt({topOffset:0});var h=a.options.topOffset;if(!1!==a.options.autoFloatEnabled){var g=UE.ui.uiUtils,l=r.ie&&6>=r.version,k=r.quirks,m,n=document.createElement("div"),q,t,w,y=!0,u=p.defer(function(){b()},r.ie?200:100,!0);a.addListener("destroy",function(){f.un(window,["scroll","resize"],b);a.removeListener("keydown",u)});a.addListener("ready",function(){var h;UE.ui?h=1:(alert(e.autofloatMsg),h=0);h&&a.ui&&(w=g.getClientRect,q=a.ui.getDom("toolbarbox"),
+t=w(q).top,m=q.style.cssText,n.style.height=q.offsetHeight+"px",l&&d(),f.on(window,["scroll","resize"],b),a.addListener("keydown",u),a.addListener("beforefullscreenchange",function(a,b){b&&c()}),a.addListener("fullscreenchanged",function(a,c){c||b()}),a.addListener("sourcemodechanged",function(a,c){setTimeout(function(){b()},0)}),a.addListener("clearDoc",function(){setTimeout(function(){b()},0)}))})}};UE.plugins.video=function(){function d(a,c,d,g,f,k,m){var n;switch(m){case "image":n="<img "+(g?
+'id="'+g+'"':"")+' width="'+c+'" height="'+d+'" _url="'+a+'" class="'+k.replace(/\bvideo-js\b/,"")+'" src="'+b.options.UEDITOR_HOME_URL+'themes/default/images/spacer.gif" style="background:url('+b.options.UEDITOR_HOME_URL+"themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;"+(f?"float:"+f+";":"")+'" />';break;case "embed":n='<embed type="application/x-shockwave-flash" class="'+k+'" pluginspage="http://www.macromedia.com/go/getflashplayer" src="'+p.html(a)+'" width="'+
+c+'" height="'+d+'"'+(f?' style="float:'+f+'"':"")+' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >';break;case "video":m=a.substr(a.lastIndexOf(".")+1),"ogv"==m&&(m="ogg"),n="<video"+(g?' id="'+g+'"':"")+' class="'+k+' video-js" '+(f?' style="float:'+f+'"':"")+' controls preload="none" width="'+c+'" height="'+d+'" src="'+a+'" data-setup="{}"><source src="'+a+'" type="video/'+m+'" /></video>'}return n}function c(a,b){p.each(a.getNodesByTagName(b?
+"img":"embed video"),function(a){var c=a.getAttr("class");if(c&&-1!=c.indexOf("edui-faked-video")){var f=d(b?a.getAttr("_url"):a.getAttr("src"),a.getAttr("width"),a.getAttr("height"),null,a.getStyle("float")||"",c,b?"embed":"image");a.parentNode.replaceChild(UE.uNode.createElement(f),a)}c&&-1!=c.indexOf("edui-upload-video")&&(f=d(b?a.getAttr("_url"):a.getAttr("src"),a.getAttr("width"),a.getAttr("height"),null,a.getStyle("float")||"",c,b?"video":"image"),a.parentNode.replaceChild(UE.uNode.createElement(f),
+a))})}var b=this;b.addOutputRule(function(a){c(a,!0)});b.addInputRule(function(a){c(a)});b.commands.insertvideo={execCommand:function(a,c,h){c=p.isArray(c)?c:[c];var g=[],l;a=0;for(var k,m=c.length;a<m;a++)k=c[a],l="upload"==h?"edui-upload-video video-js vjs-default-skin":"edui-faked-video",g.push(d(k.url,k.width||420,k.height||280,"tmpVedio"+a,null,l,"image"));b.execCommand("inserthtml",g.join(""),!0);h=this.selection.getRange();a=0;for(m=c.length;a<m;a++)g=this.document.getElementById("tmpVedio"+
+a),f.removeAttributes(g,"id"),h.selectNode(g).select(),b.execCommand("imagefloat",c[a].align)},queryCommandState:function(){var a=b.selection.getRange().getClosedNode();return!a||"edui-faked-video"!=a.className&&-1==a.className.indexOf("edui-upload-video")?0:1}}};(function(){var d=UE.UETable=function(c){this.table=c;this.indexTable=[];this.selectedTds=[];this.cellsRange={};this.update(c)};d.removeSelectedClass=function(c){p.each(c,function(b){f.removeClasses(b,"selectTdClass")})};d.addSelectedClass=
+function(c){p.each(c,function(b){f.addClass(b,"selectTdClass")})};d.isEmptyBlock=function(c){var b=RegExp(f.fillChar,"g");if(0<c[r.ie?"innerText":"textContent"].replace(/^\s*$/,"").replace(b,"").length)return 0;for(var a in v.$isNotEmpty)if(v.$isNotEmpty.hasOwnProperty(a)&&c.getElementsByTagName(a).length)return 0;return 1};d.getWidth=function(c){return c?parseInt(f.getComputedStyle(c,"width"),10):0};d.getTableCellAlignState=function(c){!p.isArray(c)&&(c=[c]);var b={},a=["align","valign"],e=null,
+d=!0;p.each(c,function(c){p.each(a,function(a){e=c.getAttribute(a);if(!b[a]&&e)b[a]=e;else if(!b[a]||e!==b[a])return d=!1});return d});return d?b:null};d.getTableItemsByRange=function(c){var b=c.selection.getStart();b&&b.id&&0===b.id.indexOf("_baidu_bookmark_start_")&&b.nextSibling&&(b=b.nextSibling);var a=(c=b&&f.findParentByTagName(b,["td","th"],!0))&&c.parentNode,b=b&&f.findParentByTagName(b,"caption",!0);return{cell:c,tr:a,table:b?b.parentNode:a&&a.parentNode.parentNode,caption:b}};d.getUETableBySelected=
+function(c){return(c=d.getTableItemsByRange(c).table)&&c.ueTable&&c.ueTable.selectedTds.length?c.ueTable:null};d.getDefaultValue=function(c,b){var a={thin:"0px",medium:"1px",thick:"2px"},e,d,g;if(b)l=b.getElementsByTagName("td")[0],g=f.getComputedStyle(b,"border-left-width"),e=parseInt(a[g]||g,10),g=f.getComputedStyle(l,"padding-left"),d=parseInt(a[g]||g,10),g=f.getComputedStyle(l,"border-left-width"),a=parseInt(a[g]||g,10);else{b=c.document.createElement("table");b.insertRow(0).insertCell(0).innerHTML=
+"xxx";c.body.appendChild(b);var l=b.getElementsByTagName("td")[0];g=f.getComputedStyle(b,"border-left-width");e=parseInt(a[g]||g,10);g=f.getComputedStyle(l,"padding-left");d=parseInt(a[g]||g,10);g=f.getComputedStyle(l,"border-left-width");a=parseInt(a[g]||g,10);f.remove(b)}return{tableBorder:e,tdPadding:d,tdBorder:a}};d.getUETable=function(c){var b=c.tagName.toLowerCase();c="td"==b||"th"==b||"caption"==b?f.findParentByTagName(c,"table",!0):c;c.ueTable||(c.ueTable=new d(c));return c.ueTable};d.cloneCell=
+function(c,b,a){if(!c||p.isString(c))return this.table.ownerDocument.createElement(c||"td");var e=f.hasClass(c,"selectTdClass");e&&f.removeClasses(c,"selectTdClass");var d=c.cloneNode(!0);b&&(d.rowSpan=d.colSpan=1);!a&&f.removeAttributes(d,"width height");!a&&f.removeAttributes(d,"style");d.style.borderLeftStyle="";d.style.borderTopStyle="";d.style.borderLeftColor=c.style.borderRightColor;d.style.borderLeftWidth=c.style.borderRightWidth;d.style.borderTopColor=c.style.borderBottomColor;d.style.borderTopWidth=
+c.style.borderBottomWidth;e&&f.addClass(c,"selectTdClass");return d};d.prototype={getMaxRows:function(){for(var c=this.table.rows,b=1,a=0,e;e=c[a];a++){for(var d=1,g=0,f;f=e.cells[g++];)d=Math.max(f.rowSpan||1,d);b=Math.max(d+a,b)}return b},getMaxCols:function(){for(var c=this.table.rows,b=0,a={},e=0,d;d=c[e];e++){for(var g=0,f=0,k;k=d.cells[f++];)if(g+=k.colSpan||1,k.rowSpan&&1<k.rowSpan)for(var m=1;m<k.rowSpan;m++)a["row_"+(e+m)]?a["row_"+(e+m)]++:a["row_"+(e+m)]=k.colSpan||1;g+=a["row_"+e]||0;
+b=Math.max(g,b)}return b},getCellColIndex:function(c){},getHSideCell:function(c,b){try{var a=this.getCellInfo(c),e,d,g=this.selectedTds.length,f=this.cellsRange;if(!b&&(g?!f.beginColIndex:!a.colIndex)||b&&(g?f.endColIndex==this.colsNum-1:a.colIndex==this.colsNum-1))return null;e=g?f.beginRowIndex:a.rowIndex;d=b?g?f.endColIndex+1:a.colIndex+1:g?f.beginColIndex-1:1>a.colIndex?0:a.colIndex-1;return this.getCell(this.indexTable[e][d].rowIndex,this.indexTable[e][d].cellIndex)}catch(k){}},getTabNextCell:function(c,
+b){var a=this.getCellInfo(c),e=b||a.rowIndex,a=a.colIndex+1+(a.colSpan-1),d;try{d=this.getCell(this.indexTable[e][a].rowIndex,this.indexTable[e][a].cellIndex)}catch(g){try{e=1*e+1,a=0,d=this.getCell(this.indexTable[e][a].rowIndex,this.indexTable[e][a].cellIndex)}catch(f){}}return d},getVSideCell:function(c,b,a){try{var e=this.getCellInfo(c),d,g,f=this.selectedTds.length&&!a,k=this.cellsRange;if(!b&&0==e.rowIndex||b&&(f?k.endRowIndex==this.rowsNum-1:e.rowIndex+e.rowSpan>this.rowsNum-1))return null;
+d=b?f?k.endRowIndex+1:e.rowIndex+e.rowSpan:f?k.beginRowIndex-1:e.rowIndex-1;g=f?k.beginColIndex:e.colIndex;return this.getCell(this.indexTable[d][g].rowIndex,this.indexTable[d][g].cellIndex)}catch(m){}},getSameEndPosCells:function(c,b){try{for(var a="x"===b.toLowerCase(),e=f.getXY(c)[a?"x":"y"]+c["offset"+(a?"Width":"Height")],d=this.table.rows,g=null,l=[],k=0;k<this.rowsNum;k++)for(var g=d[k].cells,m=0,n;n=g[m++];){var q=f.getXY(n)[a?"x":"y"]+n["offset"+(a?"Width":"Height")];if(q>e&&a)break;if(c==
+n||e==q)if(1==n[a?"colSpan":"rowSpan"]&&l.push(n),a)break}return l}catch(t){}},setCellContent:function(c,b){c.innerHTML=b||(r.ie?f.fillChar:"<br />")},cloneCell:d.cloneCell,getSameStartPosXCells:function(c){try{var b=f.getXY(c).x+c.offsetWidth,a=this.table.rows,e;c=[];for(var d=0;d<this.rowsNum;d++){e=a[d].cells;for(var g=0,l;l=e[g++];){var k=f.getXY(l).x;if(k>b)break;if(k==b&&1==l.colSpan){c.push(l);break}}}return c}catch(m){}},update:function(c){this.table=c||this.table;this.selectedTds=[];this.cellsRange=
+{};this.indexTable=[];c=this.table.rows;for(var b=this.getMaxRows(),a=b-c.length,e=this.getMaxCols();a--;)this.table.insertRow(c.length);this.rowsNum=b;this.colsNum=e;for(var a=0,d=c.length;a<d;a++)this.indexTable[a]=Array(e);for(var a=0,g;g=c[a];a++){var d=0,l;for(g=g.cells;l=g[d];d++){l.rowSpan>b&&(l.rowSpan=b);var k=d,m=l.rowSpan||1;for(l=l.colSpan||1;this.indexTable[a][k];)k++;for(var n=0;n<m;n++)for(var q=0;q<l;q++)this.indexTable[a+n][k+q]={rowIndex:a,cellIndex:d,colIndex:k,rowSpan:m,colSpan:l}}}for(n=
+0;n<b;n++)for(q=0;q<e;q++)void 0===this.indexTable[n][q]&&(g=c[n],l=(l=g.cells[g.cells.length-1])?l.cloneNode(!0):this.table.ownerDocument.createElement("td"),this.setCellContent(l),1!==l.colSpan&&(l.colSpan=1),1!==l.rowSpan&&(l.rowSpan=1),g.appendChild(l),this.indexTable[n][q]={rowIndex:n,cellIndex:l.cellIndex,colIndex:q,rowSpan:1,colSpan:1});c=f.getElementsByTagName(this.table,"td");var t=[];p.each(c,function(a){f.hasClass(a,"selectTdClass")&&t.push(a)});t.length&&(b=t[t.length-1],c=this.getCellInfo(t[0]),
+b=this.getCellInfo(b),this.selectedTds=t,this.cellsRange={beginRowIndex:c.rowIndex,beginColIndex:c.colIndex,endRowIndex:b.rowIndex+b.rowSpan-1,endColIndex:b.colIndex+b.colSpan-1});if(!f.hasClass(this.table.rows[0],"firstRow"))for(f.addClass(this.table.rows[0],"firstRow"),a=1;a<this.table.rows.length;a++)f.removeClasses(this.table.rows[a],"firstRow")},getCellInfo:function(c){if(c){var b=c.cellIndex;c=c.parentNode.rowIndex;for(var a=this.indexTable[c],e=this.colsNum,d=b;d<e;d++){var g=a[d];if(g.rowIndex===
+c&&g.cellIndex===b)return g}}},getCell:function(c,b){return c<this.rowsNum&&this.table.rows[c].cells[b]||null},deleteCell:function(c,b){b="number"==typeof b?b:c.parentNode.rowIndex;this.table.rows[b].deleteCell(c.cellIndex)},getCellsRange:function(c,b){function a(b,c,g,d){var k=b,h=c,f=g,l=d,n,m,q;if(0<b)for(m=c;m<d;m++)n=e.indexTable[b][m],q=n.rowIndex,q<b&&(k=Math.min(q,k));if(d<e.colsNum)for(q=b;q<g;q++)n=e.indexTable[q][d],m=n.colIndex+n.colSpan-1,m>d&&(l=Math.max(m,l));if(g<e.rowsNum)for(m=c;m<
+d;m++)n=e.indexTable[g][m],q=n.rowIndex+n.rowSpan-1,q>g&&(f=Math.max(q,f));if(0<c)for(q=b;q<g;q++)n=e.indexTable[q][c],m=n.colIndex,m<c&&(h=Math.min(n.colIndex,h));return k!=b||h!=c||f!=g||l!=d?a(k,h,f,l):{beginRowIndex:b,beginColIndex:c,endRowIndex:g,endColIndex:d}}try{var e=this,d=e.getCellInfo(c);if(c===b)return{beginRowIndex:d.rowIndex,beginColIndex:d.colIndex,endRowIndex:d.rowIndex+d.rowSpan-1,endColIndex:d.colIndex+d.colSpan-1};var g=e.getCellInfo(b),f=Math.min(d.rowIndex,g.rowIndex),k=Math.min(d.colIndex,
+g.colIndex),m=Math.max(d.rowIndex+d.rowSpan-1,g.rowIndex+g.rowSpan-1),n=Math.max(d.colIndex+d.colSpan-1,g.colIndex+g.colSpan-1);return a(f,k,m,n)}catch(q){}},getCells:function(c){this.clearSelected();for(var b=c.beginColIndex,a=c.endRowIndex,e=c.endColIndex,d,g,f={},k=[],m=c.beginRowIndex;m<=a;m++)for(var n=b;n<=e;n++){c=this.indexTable[m][n];d=c.rowIndex;g=c.colIndex;var q=d+"|"+g;if(!f[q]){f[q]=1;if(d<m||g<n||d+c.rowSpan-1>a||g+c.colSpan-1>e)return null;k.push(this.getCell(d,c.cellIndex))}}return k},
+clearSelected:function(){d.removeSelectedClass(this.selectedTds);this.selectedTds=[];this.cellsRange={}},setSelected:function(c){var b=this.getCells(c);d.addSelectedClass(b);this.selectedTds=b;this.cellsRange=c},isFullRow:function(){var c=this.cellsRange;return c.endColIndex-c.beginColIndex+1==this.colsNum},isFullCol:function(){var c=this.cellsRange,b=this.table.getElementsByTagName("th"),c=c.endRowIndex-c.beginRowIndex+1;return b.length?c==this.rowsNum||c==this.rowsNum-1:c==this.rowsNum},getNextCell:function(c,
+b,a){try{var e=this.getCellInfo(c),d,g,f=this.selectedTds.length&&!a,k=this.cellsRange;if(!b&&0==e.rowIndex||b&&(f?k.endRowIndex==this.rowsNum-1:e.rowIndex+e.rowSpan>this.rowsNum-1))return null;d=b?f?k.endRowIndex+1:e.rowIndex+e.rowSpan:f?k.beginRowIndex-1:e.rowIndex-1;g=f?k.beginColIndex:e.colIndex;return this.getCell(this.indexTable[d][g].rowIndex,this.indexTable[d][g].cellIndex)}catch(m){}},getPreviewCell:function(c,b){try{var a=this.getCellInfo(c),e,d,g=this.selectedTds.length,f=this.cellsRange;
+if(!b&&(g?!f.beginColIndex:!a.colIndex)||b&&(g?f.endColIndex==this.colsNum-1:a.rowIndex>this.colsNum-1))return null;e=b?g?f.beginRowIndex:1>a.rowIndex?0:a.rowIndex-1:g?f.beginRowIndex:a.rowIndex;d=b?g?f.endColIndex+1:a.colIndex:g?f.beginColIndex-1:1>a.colIndex?0:a.colIndex-1;return this.getCell(this.indexTable[e][d].rowIndex,this.indexTable[e][d].cellIndex)}catch(k){}},moveContent:function(c,b){if(!d.isEmptyBlock(b))if(d.isEmptyBlock(c))c.innerHTML=b.innerHTML;else{var a=c.lastChild;for(3!=a.nodeType&&
+v.$block[a.tagName]||c.appendChild(c.ownerDocument.createElement("br"));a=b.firstChild;)c.appendChild(a)}},mergeRight:function(c){var b=this.getCellInfo(c),a=this.indexTable[b.rowIndex][b.colIndex+b.colSpan],e=this.getCell(a.rowIndex,a.cellIndex);c.colSpan=b.colSpan+a.colSpan;c.removeAttribute("width");this.moveContent(c,e);this.deleteCell(e,a.rowIndex);this.update()},mergeDown:function(c){var b=this.getCellInfo(c),a=this.indexTable[b.rowIndex+b.rowSpan][b.colIndex],e=this.getCell(a.rowIndex,a.cellIndex);
+c.rowSpan=b.rowSpan+a.rowSpan;c.removeAttribute("height");this.moveContent(c,e);this.deleteCell(e,a.rowIndex);this.update()},mergeRange:function(){var c=this.cellsRange,b=this.getCell(c.beginRowIndex,this.indexTable[c.beginRowIndex][c.beginColIndex].cellIndex);if("TH"==b.tagName&&c.endRowIndex!==c.beginRowIndex)var a=this.indexTable,c=this.getCellInfo(b),b=this.getCell(1,a[1][c.colIndex].cellIndex),c=this.getCellsRange(b,this.getCell(a[this.rowsNum-1][c.colIndex].rowIndex,a[this.rowsNum-1][c.colIndex].cellIndex));
+for(var e=this.getCells(c),a=0,d;d=e[a++];)d!==b&&(this.moveContent(b,d),this.deleteCell(d));b.rowSpan=c.endRowIndex-c.beginRowIndex+1;1<b.rowSpan&&b.removeAttribute("height");b.colSpan=c.endColIndex-c.beginColIndex+1;1<b.colSpan&&b.removeAttribute("width");b.rowSpan==this.rowsNum&&1!=b.colSpan&&(b.colSpan=1);if(b.colSpan==this.colsNum&&1!=b.rowSpan){e=b.parentNode.rowIndex;if(this.table.deleteRow)for(a=e+1,e+=1,c=b.rowSpan;a<c;a++)this.table.deleteRow(e);else for(a=0,c=b.rowSpan-1;a<c;a++)d=this.table.rows[e+
+1],d.parentNode.removeChild(d);b.rowSpan=1}this.update()},insertRow:function(c,b){function a(a,b,c){0==a?(a=(c.nextSibling||c.previousSibling).cells[a],"TH"==a.tagName&&(a=b.ownerDocument.createElement("th"),a.appendChild(b.firstChild),c.insertBefore(a,b),f.remove(b))):"TH"==b.tagName&&(a=b.ownerDocument.createElement("td"),a.appendChild(b.firstChild),c.insertBefore(a,b),f.remove(b))}var e=this.colsNum,d=this.table.insertRow(c),g,l="string"==typeof b&&"TH"==b.toUpperCase();if(0==c||c==this.rowsNum)for(var k=
+0;k<e;k++)g=this.cloneCell(b,!0),this.setCellContent(g),g.getAttribute("vAlign")&&g.setAttribute("vAlign",g.getAttribute("vAlign")),d.appendChild(g),l||a(k,g,d);else for(var m=this.indexTable[c],k=0;k<e;k++){var n=m[k];n.rowIndex<c?(g=this.getCell(n.rowIndex,n.cellIndex),g.rowSpan=n.rowSpan+1):(g=this.cloneCell(b,!0),this.setCellContent(g),d.appendChild(g));l||a(k,g,d)}this.update();return d},deleteRow:function(c){for(var b=this.table.rows[c],a=this.indexTable[c],e=this.colsNum,d=0,g=0;g<e;){var l=
+a[g],k=this.getCell(l.rowIndex,l.cellIndex);if(1<k.rowSpan&&l.rowIndex==c){l=k.cloneNode(!0);l.rowSpan=k.rowSpan-1;l.innerHTML="";k.rowSpan=1;var m=c+1,n=this.table.rows[m],m=this.getPreviewMergedCellsNum(m,g)-d;m<g?(m=g-m-1,f.insertAfter(n.cells[m],l)):n.cells.length&&n.insertBefore(l,n.cells[0]);d+=1}g+=k.colSpan||1}c=[];d={};for(g=0;g<e;g++)k=a[g].rowIndex,l=a[g].cellIndex,n=k+"_"+l,d[n]||(d[n]=1,k=this.getCell(k,l),c.push(k));var q=[];p.each(c,function(a){1==a.rowSpan?a.parentNode.removeChild(a):
+q.push(a)});p.each(q,function(a){a.rowSpan--});b.parentNode.removeChild(b);this.update()},insertCol:function(c,b,a){function e(a,b,c){0==a?(a=b.nextSibling||b.previousSibling,"TH"==a.tagName&&(a=b.ownerDocument.createElement("th"),a.appendChild(b.firstChild),c.insertBefore(a,b),f.remove(b))):"TH"==b.tagName&&(a=b.ownerDocument.createElement("td"),a.appendChild(b.firstChild),c.insertBefore(a,b),f.remove(b))}var d=this.rowsNum,g=0,l,k,m=parseInt((this.table.offsetWidth-20*(this.colsNum+1)-(this.colsNum+
+1))/(this.colsNum+1),10),n="string"==typeof b&&"TH"==b.toUpperCase(),q;if(0==c||c==this.colsNum)for(;g<d;g++)l=this.table.rows[g],q=l.cells[0==c?c:l.cells.length],k=this.cloneCell(b,!0),this.setCellContent(k),k.setAttribute("vAlign",k.getAttribute("vAlign")),q&&k.setAttribute("width",q.getAttribute("width")),c?f.insertAfter(l.cells[l.cells.length-1],k):l.insertBefore(k,l.cells[0]),n||e(g,k,l);else for(;g<d;g++)q=this.indexTable[g][c],q.colIndex<c?(k=this.getCell(q.rowIndex,q.cellIndex),k.colSpan=
+q.colSpan+1):(l=this.table.rows[g],q=l.cells[q.cellIndex],k=this.cloneCell(b,!0),this.setCellContent(k),k.setAttribute("vAlign",k.getAttribute("vAlign")),q&&k.setAttribute("width",q.getAttribute("width")),q?l.insertBefore(k,q):l.appendChild(k)),n||e(g,k,l);this.update();this.updateWidth(m,a||{tdPadding:10,tdBorder:1})},updateWidth:function(c,b){var a=this.table,e=d.getWidth(a)-2*b.tdPadding-b.tdBorder+c;e<a.ownerDocument.body.offsetWidth?a.setAttribute("width",e):(a=f.getElementsByTagName(this.table,
+"td th"),p.each(a,function(a){a.setAttribute("width",c)}))},deleteCol:function(c){for(var b=this.indexTable,a=this.table.rows,e=this.table.getAttribute("width"),d=0,g=this.rowsNum,f={},k=0;k<g;){var m=b[k][c],n=m.rowIndex+"_"+m.colIndex;f[n]||(f[n]=1,n=this.getCell(m.rowIndex,m.cellIndex),d||(d=n&&parseInt(n.offsetWidth/n.colSpan,10).toFixed(0)),1<n.colSpan?n.colSpan--:a[k].deleteCell(m.cellIndex),k+=m.rowSpan||1)}this.table.setAttribute("width",e-d);this.update()},splitToCells:function(c){var b=
+this;c=this.splitToRows(c);p.each(c,function(a){b.splitToCols(a)})},splitToRows:function(c){var b=this.getCellInfo(c),a=b.rowIndex,e=b.colIndex,d=[];c.rowSpan=1;d.push(c);for(var g=a,f=a+b.rowSpan;g<f;g++)if(g!=a){var k=this.table.rows[g].insertCell(e-this.getPreviewMergedCellsNum(g,e));k.colSpan=b.colSpan;this.setCellContent(k);k.setAttribute("vAlign",c.getAttribute("vAlign"));k.setAttribute("align",c.getAttribute("align"));c.style.cssText&&(k.style.cssText=c.style.cssText);d.push(k)}this.update();
+return d},getPreviewMergedCellsNum:function(c,b){for(var a=this.indexTable[c],e=0,d=0;d<b;)var g=a[d].colSpan,e=e+(g-(a[d].rowIndex==c?1:0)),d=d+g;return e},splitToCols:function(c){var b=(c.offsetWidth/c.colSpan-22).toFixed(0),a=this.getCellInfo(c),e=a.rowIndex,d=a.colIndex,g=[];c.colSpan=1;c.setAttribute("width",b);g.push(c);for(var l=d,k=d+a.colSpan;l<k;l++)if(l!=d){var m=this.table.rows[e],n=m.insertCell(this.indexTable[e][l].cellIndex+1);n.rowSpan=a.rowSpan;this.setCellContent(n);n.setAttribute("vAlign",
+c.getAttribute("vAlign"));n.setAttribute("align",c.getAttribute("align"));n.setAttribute("width",b);c.style.cssText&&(n.style.cssText=c.style.cssText);if("TH"==c.tagName){var q=c.ownerDocument.createElement("th");q.appendChild(n.firstChild);q.setAttribute("vAlign",c.getAttribute("vAlign"));q.rowSpan=n.rowSpan;m.insertBefore(q,n);f.remove(n)}g.push(n)}this.update();return g},isLastCell:function(c,b,a){b=b||this.rowsNum;a=a||this.colsNum;c=this.getCellInfo(c);return c.rowIndex+c.rowSpan==b&&c.colIndex+
+c.colSpan==a},getLastCell:function(c){c=c||this.table.getElementsByTagName("td");this.getCellInfo(c[0]);var b=this,a=c[0],e=a.parentNode,d=0,g=0,f;p.each(c,function(a){a.parentNode==e&&(g+=a.colSpan||1);d+=a.rowSpan*a.colSpan||1});f=d/g;p.each(c,function(c){if(b.isLastCell(c,f,g))return a=c,!1});return a},selectRow:function(c){var b=this.indexTable[c];c=this.getCell(b[0].rowIndex,b[0].cellIndex);b=this.getCell(b[this.colsNum-1].rowIndex,b[this.colsNum-1].cellIndex);c=this.getCellsRange(c,b);this.setSelected(c)},
+selectTable:function(){var c=this.table.getElementsByTagName("td"),c=this.getCellsRange(c[0],c[c.length-1]);this.setSelected(c)},setBackground:function(c,b){if("string"===typeof b)p.each(c,function(a){a.style.backgroundColor=b});else if("object"===typeof b){b=p.extend({repeat:!0,colorList:["#ddd","#fff"]},b);for(var a=this.getCellInfo(c[0]).rowIndex,e=0,d=b.colorList,g=function(a,b,c){return a[b]?a[b]:c?a[b%a.length]:""},f=0,k;k=c[f++];){var m=this.getCellInfo(k);k.style.backgroundColor=g(d,a+e==
+m.rowIndex?e:++e,b.repeat)}}},removeBackground:function(c){p.each(c,function(b){b.style.backgroundColor=""})}}})();(function(){function d(b,e){var d=f.getElementsByTagName(b,"td th");p.each(d,function(a){a.removeAttribute("width")});b.setAttribute("width",c(e,!0,a.getDefaultValue(e,b)));var h=[];setTimeout(function(){p.each(d,function(a){1==a.colSpan&&h.push(a.offsetWidth)});p.each(d,function(a,b){1==a.colSpan&&a.setAttribute("width",h[b]+"")})},0)}function c(a,b,c){var e=a.body;return e.offsetWidth-
+(b?2*parseInt(f.getComputedStyle(e,"margin-left"),10):0)-2*c.tableBorder-(a.options.offsetWidth||0)}function b(a){if(a=e(a).cell){var b=h(a);return b.selectedTds.length?b.selectedTds:[a]}return[]}var a=UE.UETable,e=function(b){return a.getTableItemsByRange(b)},h=function(b){return a.getUETable(b)};UE.commands.inserttable={queryCommandState:function(){return e(this).table?-1:0},execCommand:function(b,c){c||(c=p.extend({},{numCols:this.options.defaultCols,numRows:this.options.defaultRows,tdvalign:this.options.tdvalign}));
+var e=this.selection.getRange().startContainer,e=f.findParent(e,function(a){return f.isBlockElm(a)},!0)||this.body,d=a.getDefaultValue(this,void 0),e=Math.floor(e.offsetWidth/c.numCols-2*d.tdPadding-d.tdBorder);!c.tdvalign&&(c.tdvalign=this.options.tdvalign);this.execCommand("inserthtml",function(a,b){for(var c=[],e=a.numRows,d=a.numCols,g=0;g<e;g++){c.push("<tr"+(0==g?' class="firstRow"':"")+">");for(var k=0;k<d;k++)c.push('<td width="'+b+'"  vAlign="'+a.tdvalign+'" >'+(r.ie&&11>r.version?f.fillChar:
+"<br/>")+"</td>");c.push("</tr>")}return"<table><tbody>"+c.join("")+"</tbody></table>"}(c,e))}};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=r.ie?"&nbsp;":"<br />";a.parentNode.insertBefore(b,a);this.selection.getRange().setStart(b,0).setCursor()}}};UE.commands.deletetable={queryCommandState:function(){var a=this.selection.getRange();return f.findParentByTagName(a.startContainer,
+"table",!0)?0:-1},execCommand:function(a,b){var c=this.selection.getRange();if(b=b||f.findParentByTagName(c.startContainer,"table",!0)){var e=b.nextSibling;e||(e=f.createElement(this.document,"p",{innerHTML:r.ie?f.fillChar:"<br/>"}),b.parentNode.insertBefore(e,b));f.remove(b);c=this.selection.getRange();3==e.nodeType?c.setStartBefore(e):c.setStart(e,0);c.setCursor(!1,!0);this.fireEvent("tablehasdeleted")}}};UE.commands.cellalign={queryCommandState:function(){return b(this).length?0:-1},execCommand:function(a,
+c){var e=b(this);if(e.length)for(var d=0,f;f=e[d++];)f.setAttribute("align",c)}};UE.commands.cellvalign={queryCommandState:function(){return b(this).length?0:-1},execCommand:function(a,c){var e=b(this);if(e.length)for(var d=0,f;f=e[d++];)f.setAttribute("vAlign",c)}};UE.commands.insertcaption={queryCommandState:function(){var a=e(this).table;return a?0==a.getElementsByTagName("caption").length?1:-1:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("caption");b.innerHTML=
+r.ie?f.fillChar:"<br/>";a.insertBefore(b,a.firstChild);this.selection.getRange().setStart(b,0).setCursor()}}};UE.commands.deletecaption={queryCommandState:function(){var a=this.selection.getRange();return(a=f.findParentByTagName(a.startContainer,"table"))?0==a.getElementsByTagName("caption").length?-1:1:-1},execCommand:function(){var a=this.selection.getRange();if(a=f.findParentByTagName(a.startContainer,"table"))f.remove(a.getElementsByTagName("caption")[0]),this.selection.getRange().setStart(a.rows[0].cells[0],
+0).setCursor()}};UE.commands.inserttitle={queryCommandState:function(){var a=e(this).table;return a?(a=a.rows[0],"th"!=a.cells[a.cells.length-1].tagName.toLowerCase()?0:-1):-1},execCommand:function(){var a=e(this).table;a&&h(a).insertRow(0,"th");a=a.getElementsByTagName("th")[0];this.selection.getRange().setStart(a,0).setCursor(!1,!0)}};UE.commands.deletetitle={queryCommandState:function(){var a=e(this).table;return a?(a=a.rows[0],"th"==a.cells[a.cells.length-1].tagName.toLowerCase()?0:-1):-1},execCommand:function(){var a=
+e(this).table;a&&f.remove(a.rows[0]);a=a.getElementsByTagName("td")[0];this.selection.getRange().setStart(a,0).setCursor(!1,!0)}};UE.commands.inserttitlecol={queryCommandState:function(){var a=e(this).table;return a?a.rows[a.rows.length-1].getElementsByTagName("th").length?-1:0:-1},execCommand:function(a){(a=e(this).table)&&h(a).insertCol(0,"th");d(a,this);a=a.getElementsByTagName("th")[0];this.selection.getRange().setStart(a,0).setCursor(!1,!0)}};UE.commands.deletetitlecol={queryCommandState:function(){var a=
+e(this).table;return a?a.rows[a.rows.length-1].getElementsByTagName("th").length?0:-1:-1},execCommand:function(){var a=e(this).table;if(a)for(var b=0;b<a.rows.length;b++)f.remove(a.rows[b].children[0]);d(a,this);a=a.getElementsByTagName("td")[0];this.selection.getRange().setStart(a,0).setCursor(!1,!0)}};UE.commands.mergeright={queryCommandState:function(a){var b=e(this);a=b.table;b=b.cell;if(!a||!b)return-1;var c=h(a);if(c.selectedTds.length)return-1;var d=c.getCellInfo(b),f=d.colIndex+d.colSpan;
+if(f>=c.colsNum)return-1;c=c.indexTable[d.rowIndex][f];return(a=a.rows[c.rowIndex].cells[c.cellIndex])&&b.tagName==a.tagName?c.rowIndex==d.rowIndex&&c.rowSpan==d.rowSpan?0:-1:-1},execCommand:function(a){a=this.selection.getRange();var b=a.createBookmark(!0),c=e(this).cell;h(c).mergeRight(c);a.moveToBookmark(b).select()}};UE.commands.mergedown={queryCommandState:function(a){var b=e(this);a=b.table;b=b.cell;if(!a||!b)return-1;var c=h(a);if(c.selectedTds.length)return-1;var d=c.getCellInfo(b),f=d.rowIndex+
+d.rowSpan;if(f>=c.rowsNum)return-1;c=c.indexTable[f][d.colIndex];return(a=a.rows[c.rowIndex].cells[c.cellIndex])&&b.tagName==a.tagName?c.colIndex==d.colIndex&&c.colSpan==d.colSpan?0:-1:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell;h(c).mergeDown(c);a.moveToBookmark(b).select()}};UE.commands.mergecells={queryCommandState:function(){return a.getUETableBySelected(this)?0:-1},execCommand:function(){var b=a.getUETableBySelected(this);if(b&&b.selectedTds.length){var c=
+b.selectedTds[0];b.mergeRange();b=this.selection.getRange();f.isEmptyBlock(c)?b.setStart(c,0).collapse(!0):b.selectNodeContents(c);b.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).rowsNum<this.options.maxRowNum?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this),d=c.cell,c=c.table,f=h(c),q=f.getCellInfo(d);if(f.selectedTds.length)for(var q=
+f.cellsRange,t=0,w=q.endRowIndex-q.beginRowIndex+1;t<w;t++)f.insertRow(q.beginRowIndex,d);else f.insertRow(q.rowIndex,d);a.moveToBookmark(b).select();"enabled"===c.getAttribute("interlaced")&&this.fireEvent("interlacetable",c)}};UE.commands.insertrownext={queryCommandState:function(){var a=e(this),b=a.cell;return b&&"TD"==b.tagName&&h(a.table).rowsNum<this.options.maxRowNum?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this),d=c.cell,c=c.table,f=h(c),q=f.getCellInfo(d);
+if(f.selectedTds.length)for(var q=f.cellsRange,t=0,w=q.endRowIndex-q.beginRowIndex+1;t<w;t++)f.insertRow(q.endRowIndex+1,d);else f.insertRow(q.rowIndex+q.rowSpan,d);a.moveToBookmark(b).select();"enabled"===c.getAttribute("interlaced")&&this.fireEvent("interlacetable",c)}};UE.commands.deleterow={queryCommandState:function(){return e(this).cell?0:-1},execCommand:function(){var a=e(this).cell,b=h(a),c=b.cellsRange,d=b.getCellInfo(a),n=b.getVSideCell(a),q=b.getVSideCell(a,!0),a=this.selection.getRange();
+if(p.isEmptyObject(c))b.deleteRow(d.rowIndex);else for(var t=c.beginRowIndex;t<c.endRowIndex+1;t++)b.deleteRow(c.beginRowIndex);t=b.table;t.getElementsByTagName("td").length?1==d.rowSpan||d.rowSpan==c.endRowIndex-c.beginRowIndex+1?(q||n)&&a.selectNodeContents(q||n).setCursor(!1,!0):(b=b.getCell(d.rowIndex,b.indexTable[d.rowIndex][d.colIndex].cellIndex))&&a.selectNodeContents(b).setCursor(!1,!0):(b=t.nextSibling,f.remove(t),b&&a.setStart(b,0).setCursor(!1,!0));"enabled"===t.getAttribute("interlaced")&&
+this.fireEvent("interlacetable",t)}};UE.commands.insertcol={queryCommandState:function(a){a=e(this);var b=a.cell;return b&&("TD"==b.tagName||"TH"==b.tagName&&b!==a.tr.cells[0])&&h(a.table).colsNum<this.options.maxColNum?0:-1},execCommand:function(a){var b=this.selection.getRange(),c=b.createBookmark(!0);if(-1!=this.queryCommandState(a)){a=e(this).cell;var d=h(a),f=d.getCellInfo(a);if(d.selectedTds.length)for(var f=d.cellsRange,q=0,t=f.endColIndex-f.beginColIndex+1;q<t;q++)d.insertCol(f.beginColIndex,
+a);else d.insertCol(f.colIndex,a);b.moveToBookmark(c).select(!0)}}};UE.commands.insertcolnext={queryCommandState:function(){var a=e(this);return a.cell&&h(a.table).colsNum<this.options.maxColNum?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c),f=d.getCellInfo(c);if(d.selectedTds.length)for(var f=d.cellsRange,q=0,t=f.endColIndex-f.beginColIndex+1;q<t;q++)d.insertCol(f.endColIndex+1,c);else d.insertCol(f.colIndex+f.colSpan,c);a.moveToBookmark(b).select()}};
+UE.commands.deletecol={queryCommandState:function(){return e(this).cell?0:-1},execCommand:function(){var a=e(this).cell,b=h(a),c=b.cellsRange,d=b.getCellInfo(a),n=b.getHSideCell(a),q=b.getHSideCell(a,!0);if(p.isEmptyObject(c))b.deleteCol(d.colIndex);else for(d=c.beginColIndex;d<c.endColIndex+1;d++)b.deleteCol(c.beginColIndex);b=b.table;c=this.selection.getRange();b.getElementsByTagName("td").length?f.inDoc(a,this.document)?c.setStart(a,0).setCursor(!1,!0):q&&f.inDoc(q,this.document)?c.selectNodeContents(q).setCursor(!1,
+!0):n&&f.inDoc(n,this.document)&&c.selectNodeContents(n).setCursor(!0,!0):(a=b.nextSibling,f.remove(b),a&&c.setStart(a,0).setCursor(!1,!0))}};UE.commands.splittocells={queryCommandState:function(){var a=e(this),b=a.cell;return!b||0<h(a.table).selectedTds.length?-1:b&&(1<b.colSpan||1<b.rowSpan)?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell;h(c).splitToCells(c);a.moveToBookmark(b).select()}};UE.commands.splittorows={queryCommandState:function(){var a=
+e(this),b=a.cell;return!b||0<h(a.table).selectedTds.length?-1:b&&1<b.rowSpan?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell;h(c).splitToRows(c);a.moveToBookmark(b).select()}};UE.commands.splittocols={queryCommandState:function(){var a=e(this),b=a.cell;return!b||0<h(a.table).selectedTds.length?-1:b&&1<b.colSpan?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell;h(c).splitToCols(c);a.moveToBookmark(b).select()}};
+UE.commands.adaptbytext=UE.commands.adaptbywindow={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a){var b=e(this).table;b&&("adaptbywindow"==a?d(b,this):(a=f.getElementsByTagName(b,"td th"),p.each(a,function(a){a.removeAttribute("width")}),b.removeAttribute("width")))}};UE.commands.averagedistributecol={queryCommandState:function(){var b=a.getUETableBySelected(this);return b?b.isFullRow()||b.isFullCol()?0:-1:-1},execCommand:function(b){function c(){var b=h.table,e=0,
+g=0,f=a.getDefaultValue(d,b);if(h.isFullRow())e=b.offsetWidth,g=h.colsNum;else for(var b=h.cellsRange.endColIndex,k,l=h.cellsRange.beginColIndex;l<=b;)k=h.selectedTds[l],e+=k.offsetWidth,l+=k.colSpan,g+=1;return Math.ceil(e/g)-2*f.tdBorder-2*f.tdPadding}function e(a){p.each(f.getElementsByTagName(h.table,"th"),function(a){a.setAttribute("width","")});var b=h.isFullRow()?f.getElementsByTagName(h.table,"td"):h.selectedTds;p.each(b,function(b){1==b.colSpan&&b.setAttribute("width",a)})}var d=this,h=a.getUETableBySelected(d);
+h&&h.selectedTds.length&&e(c())}};UE.commands.averagedistributerow={queryCommandState:function(){var b=a.getUETableBySelected(this);return!b||b.selectedTds&&/th/ig.test(b.selectedTds[0].tagName)?-1:b.isFullRow()||b.isFullCol()?0:-1},execCommand:function(b){function c(){var b,e=0;b=h.table;var g=a.getDefaultValue(d,b),k=parseInt(f.getComputedStyle(b.getElementsByTagName("td")[0],"padding-top"));if(h.isFullCol()){var e=f.getElementsByTagName(b,"caption"),l=f.getElementsByTagName(b,"th"),p,s;0<e.length&&
+(p=e[0].offsetHeight);0<l.length&&(s=l[0].offsetHeight);e=b.offsetHeight-(p||0)-(s||0);b=0==l.length?h.rowsNum:h.rowsNum-1}else{s=h.cellsRange.beginRowIndex;l=h.cellsRange.endRowIndex;p=0;for(b=f.getElementsByTagName(b,"tr");s<=l;s++)e+=b[s].offsetHeight,p+=1;b=p}return r.ie&&9>r.version?Math.ceil(e/b):Math.ceil(e/b)-2*g.tdBorder-2*k}function e(a){var b=h.isFullCol()?f.getElementsByTagName(h.table,"td"):h.selectedTds;p.each(b,function(b){1==b.rowSpan&&b.setAttribute("height",a)})}var d=this,h=a.getUETableBySelected(d);
+h&&h.selectedTds.length&&e(c())}};UE.commands.cellalignment={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(b,c){var e=a.getUETableBySelected(this);e?p.each(e.selectedTds,function(a){f.setAttributes(a,c)}):(e=(e=this.selection.getStart())&&f.findParentByTagName(e,["td","th","caption"],!0),/caption/ig.test(e.tagName)?(e.style.textAlign=c.align,e.style.verticalAlign=c.vAlign):f.setAttributes(e,c),this.selection.getRange().setCursor(!0))},queryCommandValue:function(a){(a=
+e(this).cell)||(a=b(this)[0]);if(a){var c=UE.UETable.getUETable(a).selectedTds;!c.length&&(c=a);return UE.UETable.getTableCellAlignState(c)}return null}};UE.commands.tablealignment={queryCommandState:function(){return r.ie&&8>r.version?-1:e(this).table?0:-1},execCommand:function(a,b){var c=this.selection.getStart();(c=c&&f.findParentByTagName(c,["table"],!0))&&c.setAttribute("align",b)}};UE.commands.edittable={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=
+this.selection.getRange();if(c=f.findParentByTagName(c.startContainer,"table"))c=f.getElementsByTagName(c,"td").concat(f.getElementsByTagName(c,"th"),f.getElementsByTagName(c,"caption")),p.each(c,function(a){a.style.borderColor=b})}};UE.commands.edittd={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(b,c){var e=a.getUETableBySelected(this);if(e)p.each(e.selectedTds,function(a){a.style.backgroundColor=c});else if(e=(e=this.selection.getStart())&&f.findParentByTagName(e,
+["td","th","caption"],!0))e.style.backgroundColor=c}};UE.commands.settablebackground={queryCommandState:function(){return 1<b(this).length?0:-1},execCommand:function(a,c){var e;e=b(this);h(e[0]).setBackground(e,c)}};UE.commands.cleartablebackground={queryCommandState:function(){var a=b(this);if(!a.length)return-1;for(var c=0,e;e=a[c++];)if(""!==e.style.backgroundColor)return 0;return-1},execCommand:function(){var a=b(this);h(a[0]).removeBackground(a)}};UE.commands.interlacetable=UE.commands.uninterlacetable=
+{queryCommandState:function(a){var b=e(this).table;if(!b)return-1;b=b.getAttribute("interlaced");return"interlacetable"==a?"enabled"===b?-1:0:b&&"disabled"!==b?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){return e(this).table?0:-1},execCommand:function(){var a=
+e(this).table;p.each(f.getElementsByTagName(a,"td"),function(a){a.style.borderWidth="1px";a.style.borderStyle="solid"})}}})();UE.plugins.table=function(){function d(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 b(a){if("TD"==a.tagName||"TH"==a.tagName)return a;var b;return(b=f.findParentByTagName(a,"td",!0)||f.findParentByTagName(a,"th",!0))?b:null}function a(a){var b=RegExp(f.fillChar,"g");if(0<a[r.ie?"innerText":
+"textContent"].replace(/^\s*$/,"").replace(b,"").length)return 0;for(var c in v.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1}function e(a){return a.pageX||a.pageY?{x:a.pageX,y:a.pageY}:{x:a.clientX+x.document.body.scrollLeft-x.document.body.clientLeft,y:a.clientY+x.document.body.scrollTop-x.document.body.clientTop}}function h(a){if(!da())try{var c=b(a.target||a.srcElement),d;ba&&(x.body.style.webkitUserSelect="none",Math.abs(fa.x-a.clientX)>Z||Math.abs(fa.y-a.clientY)>Z)&&(s(),
+ba=!1,Q=0,G(a));if(U&&R)if(Q=0,x.body.style.webkitUserSelect="none",x.selection.getNative()[r.ie9below?"empty":"removeAllRanges"](),d=e(a),m(x,!0,U,d,c),"h"==U){var h=S.style,l;var c=R,q=M(c);if(q){var t=q.getSameEndPosCells(c,"x")[0],p=q.getSameStartPosXCells(c)[0],y=e(a).x,w=(t?f.getXY(t).x:f.getXY(q.table).x)+20,u=p?f.getXY(p).x+p.offsetWidth-20:x.body.offsetWidth+5||parseInt(f.getComputedStyle(x.body,"width"),10),w=w+W,u=u-W;l=y<w?w:y>u?u:y}else l=void 0;h.left=l+"px"}else{if("v"==U){var E=S.style,
+v;a:{try{var z=f.getXY(R).y,A=e(a).y;v=A<z?z:A;break a}catch(B){}v=void 0}E.top=v+"px"}}else if(c){if(!0!==x.fireEvent("excludetable",c)){d=e(a);var D=n(c,d),ca=f.findParentByTagName(c,"table",!0);k(ca,c,a,!0)?!0!==x.fireEvent("excludetable",ca)&&(x.body.style.cursor="url("+x.options.cursorpath+"h.png),pointer"):k(ca,c,a)?!0!==x.fireEvent("excludetable",ca)&&(x.body.style.cursor="url("+x.options.cursorpath+"v.png),pointer"):(x.body.style.cursor="text",/\d/.test(D)&&(D=D.replace(/\d/,""),c=M(c).getPreviewCell(c,
+"v"==D)),m(x,c?!!D:!1,c?D:"",d,c))}}else g(!1,ca,x)}catch(H){}}function g(a,b,c){a?l(b,c):ga||setTimeout(function(){!ga&&J&&J.parentNode&&J.parentNode.removeChild(J)},2E3)}function l(a,b){function c(e,d){clearTimeout(g);g=setTimeout(function(){b.fireEvent("tableClicked",a,d)},300)}var e=f.getXY(a),d=a.ownerDocument;if(J&&J.parentNode)return J;J=d.createElement("div");J.contentEditable=!1;J.innerHTML="";J.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;";f.unSelectable(J);J.onmouseover=function(a){ga=!0};J.onmouseout=function(a){ga=!1};f.on(J,"click",function(a,b){c(b,this)});f.on(J,"dblclick",function(c,e){clearTimeout(g);var d=M(a),f=a.rows[0].cells[0],h=d.getLastCell(),h=d.getCellsRange(f,h);b.selection.getRange().setStart(f,0).setCursor(!1,!0);d.setSelected(h)});f.on(J,"dragstart",function(a,b){f.preventDefault(b)});var g;d.body.appendChild(J)}function k(a,b,c,d){c=e(c);b=n(b,c);return d?(d=(d=a.getElementsByTagName("caption")[0])?
+d.offsetHeight:0,"v1"==b&&8>c.y-f.getXY(a).y-d):"h1"==b&&8>c.x-f.getXY(a).x}function m(a,b,c,e,d){try{a.body.style.cursor="h"==c?"col-resize":"v"==c?"row-resize":"text",r.ie&&(!c||aa||F.getUETableBySelected(a)?I(a):(O(a,a.document),la(c,d))),ka=b}catch(g){}}function n(a,b){var c=f.getXY(a);return c?c.x+a.offsetWidth-b.x<ha?"h":b.x-c.x<ha?"h1":c.y+a.offsetHeight-b.y<ha?"v":b.y-c.y<ha?"v1":"":""}function q(a,b){if(!da())if(fa={x:b.clientX,y:b.clientY},2==b.button){var c=F.getUETableBySelected(x),e=
+!1;if(c){var d=X(x,b);p.each(c.selectedTds,function(a){a===d&&(e=!0)});e?(d=c.selectedTds[0],setTimeout(function(){x.selection.getRange().setStart(d,0).setCursor(!1,!0)},0)):(ia(f.getElementsByTagName(x.body,"th td")),c.clearSelected())}}else w(b)}function t(a){Q=0;a=a||x.window.event;var c=b(a.target||a.srcElement);if(c){var d;if(d=n(c,e(a)))if(I(x),"h1"==d&&(d="h",k(f.findParentByTagName(c,"table"),c,a)?x.execCommand("adaptbywindow"):(c=M(c).getPreviewCell(c))&&x.selection.getRange().selectNodeContents(c).setCursor(!0,
+!0)),"h"==d){a=M(c);var g=z(c,a.table,!0),g=u(g,"left");a.width=a.offsetWidth;var h=[],l=[];p.each(g,function(a){h.push(a.offsetWidth)});p.each(g,function(a){a.removeAttribute("width")});window.setTimeout(function(){var a=!0;p.each(g,function(b,c){var e=b.offsetWidth;if(e>h[c])return a=!1;l.push(e)});var b=a?l:h;p.each(g,function(a,c){a.width=b[c]-B()})},0)}}}function w(a){ia(f.getElementsByTagName(x.body,"td th"));p.each(x.document.getElementsByTagName("table"),function(a){a.ueTable=null});if(K=
+X(x,a)){var b=f.findParentByTagName(K,"table",!0);(ut=M(b))&&ut.clearSelected();ka?y(a):(x.document.body.style.webkitUserSelect="",aa=!0,x.addListener("mouseover",N))}}function y(a){r.ie&&(a=E(a));s();ba=!0;ja=setTimeout(function(){G(a)},$)}function u(a,b){for(var c=[],e=null,d=0,g=a.length;d<g;d++)(e=a[d][b])&&c.push(e);return c}function s(){ja&&clearTimeout(ja);ja=null}function E(a){var b="pageX pageY clientX clientY srcElement target".split(" "),c={};if(a)for(var e=0,d,g;d=b[e];e++)(g=a[d])&&(c[d]=
+g);return c}function G(a){ba=!1;if(K=a.target||a.srcElement)a=n(K,e(a)),/\d/.test(a)&&(a=a.replace(/\d/,""),K=M(K).getPreviewCell(K,"v"==a)),I(x),O(x,x.document),x.fireEvent("saveScene"),la(a,K),aa=!0,U=a,R=K}function A(a,b){if(!da()){s();ba=!1;if(ka&&(Q=++Q%3,fa={x:b.clientX,y:b.clientY},setTimeout(function(){0<Q&&Q--},$),2===Q)){Q=0;t(b);return}if(2!=b.button){var c=this.selection.getRange(),e=f.findParentByTagName(c.startContainer,"table",!0),d=f.findParentByTagName(c.endContainer,"table",!0);
+if(e||d)e===d?(e=f.findParentByTagName(c.startContainer,["td","th","caption"],!0),d=f.findParentByTagName(c.endContainer,["td","th","caption"],!0),e!==d&&this.selection.clearRange()):this.selection.clearRange();aa=!1;this.document.body.style.webkitUserSelect="";if(U&&R&&(this.selection.getNative()[r.ie9below?"empty":"removeAllRanges"](),Q=0,S=this.document.getElementById("ue_tableDragLine"))){c=f.getXY(R);e=f.getXY(S);switch(U){case "h":na(R,e.x-c.x);break;case "v":T(R,e.y-c.y-R.offsetHeight)}U="";
+R=null;I(this);this.fireEvent("saveScene");return}if(K)(e=(c=M(K))?c.selectedTds[0]:null)?(c=new L.Range(this.document),f.isEmptyBlock(e)?c.setStart(e,0).setCursor(!1,!0):c.selectNodeContents(e).shrinkBoundary().setCursor(!1,!0)):(c=this.selection.getRange().shrinkBoundary(),c.collapsed||(e=f.findParentByTagName(c.startContainer,["td","th"],!0),d=f.findParentByTagName(c.endContainer,["td","th"],!0),(e&&!d||!e&&d||e&&d&&e!==d)&&c.setCursor(!1,!0))),K=null,this.removeListener("mouseover",N);else if((e=
+f.findParentByTagName(b.target||b.srcElement,"td",!0))||(e=f.findParentByTagName(b.target||b.srcElement,"th",!0)),e&&("TD"==e.tagName||"TH"==e.tagName)){if(!0===this.fireEvent("excludetable",e))return;c=new L.Range(this.document);c.setStart(e,0).setCursor(!1,!0)}this._selectionChange(250,b)}}}function N(a,b){if(!da()){var c=b.target||b.srcElement;V=f.findParentByTagName(c,"td",!0)||f.findParentByTagName(c,"th",!0);if(K&&V&&("TD"==K.tagName&&"TD"==V.tagName||"TH"==K.tagName&&"TH"==V.tagName)&&f.findParentByTagName(K,
+"table")==f.findParentByTagName(V,"table"))if(c=M(V),K!=V){this.document.body.style.webkitUserSelect="none";this.selection.getNative()[r.ie9below?"empty":"removeAllRanges"]();var e=c.getCellsRange(K,V);c.setSelected(e)}else this.document.body.style.webkitUserSelect="",c.clearSelected();b.preventDefault?b.preventDefault():b.returnValue=!1}}function na(a,b){var c=M(a);if(c){var c=c.table,e=z(a,c);c.style.width="";c.removeAttribute("width");b=H(b,a,e);a.nextSibling?p.each(e,function(a){a.left.width=
++a.left.width+b;a.right&&(a.right.width=+a.right.width-b)}):p.each(e,function(a){a.left.width-=-b})}}function da(){return"false"===x.body.contentEditable}function T(a,b){if(!(10>Math.abs(b))){var c=M(a);if(c)for(var c=c.getSameEndPosCells(a,"y"),e=c[0]?c[0].offsetHeight:0,d=0,g;g=c[d++];){var h=b,k=e,l=parseInt(f.getComputedStyle(g,"line-height"),10),h=k+h,h=h<l?l:h;g.style.height&&(g.style.height="");1==g.rowSpan?g.setAttribute("height",h):g.removeAttribute&&g.removeAttribute("height")}}}function z(a,
+b,c){b||(b=f.findParentByTagName(a,"table"));if(!b)return null;f.getNodeIndex(a);b=b.rows;for(var e=0;a;)1===a.nodeType&&(e+=a.colSpan||1),a=a.previousSibling;a=null;var d=[];p.each(b,function(a){var b=0;p.each(a.cells,function(a){b+=a.colSpan||1;if(b===e)return d.push({left:a,right:a.nextSibling||null}),!1;if(b>e)return c&&d.push({left:a}),!1})});return d}function H(a,b,c){a-=B();if(0>a)return 0;a-=D(b);var e=0>a?"left":"right";a=Math.abs(a);p.each(c,function(b){(b=b[e])&&(a=Math.min(a,D(b)-W))});
+a=0>a?0:a;return"left"===e?-a:a}function D(a){var b=0,b=a.offsetWidth-B();if(!a.nextSibling){tab=f.findParentByTagName(a,"table",!1);if(void 0===tab.offsetVal){var c=a.previousSibling;tab.offsetVal=c?a.offsetWidth-c.offsetWidth===F.borderWidth?F.borderWidth:0:0}b-=tab.offsetVal}b=0>b?0:b;try{a.width=b}catch(e){}return b}function B(){if(void 0===F.tabcellSpace){var a=x.document.createElement("table"),b=x.document.createElement("tbody"),c=x.document.createElement("tr"),e=x.document.createElement("td"),
+d=null;e.style.cssText="border: 0;";e.width=1;c.appendChild(e);c.appendChild(d=e.cloneNode(!1));b.appendChild(c);a.appendChild(b);a.style.cssText="visibility: hidden;";x.body.appendChild(a);F.paddingSpace=e.offsetWidth-1;b=a.offsetWidth;e.style.cssText="";d.style.cssText="";F.borderWidth=(a.offsetWidth-b)/3;F.tabcellSpace=F.paddingSpace+F.borderWidth;x.body.removeChild(a)}B=function(){return F.tabcellSpace};return F.tabcellSpace}function O(a,b){aa||(S=a.document.createElement("div"),f.setAttributes(S,
+{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(S))}function I(a){if(!aa)for(var b;b=a.document.getElementById("ue_tableDragLine");)f.remove(b)}function la(a,b){if(b){var c=f.findParentByTagName(b,"table"),e=c.getElementsByTagName("caption"),d=
+c.offsetWidth,g=c.offsetHeight-(0<e.length?e[0].offsetHeight:0),c=f.getXY(c),h=f.getXY(b);switch(a){case "h":e="height:"+g+"px;top:"+(c.y+(0<e.length?e[0].offsetHeight:0))+"px;left:"+(h.x+b.offsetWidth);S.style.cssText=e+"px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)";break;case "v":e="width:"+d+"px;left:"+c.x+"px;top:"+(h.y+b.offsetHeight),S.style.cssText=e+"px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"}}}
+function P(a,b){for(var c=f.getElementsByTagName(a.body,"table"),e,d=0,g;g=c[d++];)e=f.getElementsByTagName(g,"td"),e[0]&&(b?(e=e[0].style.borderColor.replace(/\s/g,""),/(#ffffff)|(rgb\(255,255,255\))/ig.test(e)&&f.addClass(g,"noBorderTable")):f.removeClasses(g,"noBorderTable"))}function Y(a,b,c){var e=a.body;return e.offsetWidth-(b?2*parseInt(f.getComputedStyle(e,"margin-left"),10):0)-2*c.tableBorder-(a.options.offsetWidth||0)}function X(a,b){var c=f.findParentByTagName(b.target||b.srcElement,["td",
+"th"],!0),d=null;if(!c)return null;d=n(c,e(b));if(!c)return null;if("h1"===d&&c.previousSibling){var d=f.getXY(c),g=c.offsetWidth;Math.abs(d.x+g-b.clientX)>g/3&&(c=c.previousSibling)}else"v1"===d&&c.parentNode.previousSibling&&(d=f.getXY(c),g=c.offsetHeight,Math.abs(d.y+g-b.clientY)>g/3&&(c=c.parentNode.previousSibling.firstChild));return c&&!0!==a.fireEvent("excludetable",c)?c:null}var x=this,ja=null,W=5,ba=!1,ha=5,Z=10,Q=0,fa=null,$=360,F=UE.UETable,M=function(a){return F.getUETable(a)},ia=function(a){return F.removeSelectedClass(a)};
+x.ready(function(){var a=this,b=a.selection.getText;a.selection.getText=function(){var c=F.getUETableBySelected(a);if(c){var e="";p.each(c.selectedTds,function(a){e+=a[r.ie?"innerText":"textContent"]});return e}return b.call(a.selection)}});var K=null,V=null,U="",ka=!1,J=null,ga=!1,S=null,R=null,aa=!1;x.setOpt({maxColNum:20,maxRowNum:100,defaultCols:5,defaultRows:5,tdvalign:"top",cursorpath:x.options.UEDITOR_HOME_URL+"themes/default/images/cursor_",tableDragable:!1,classList:["ue-table-interlace-color-single",
+"ue-table-interlace-color-double"]});x.getUETable=M;var ea={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};x.ready(function(){p.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;}",
+x.document);var c,e,l;x.addListener("keydown",function(b,d){var g=d.keyCode||d.which;if(8==g){var h=F.getUETableBySelected(this);h&&h.selectedTds.length&&(h.isFullCol()?this.execCommand("deletecol"):h.isFullRow()?this.execCommand("deleterow"):this.fireEvent("delcells"),f.preventDefault(d));var k=f.findParentByTagName(this.selection.getStart(),"caption",!0),n=this.selection.getRange();n.collapsed&&k&&a(k)&&(this.fireEvent("saveScene"),h=k.parentNode,f.remove(k),h&&n.setStart(h.rows[0].cells[0],0).setCursor(!1,
+!0),this.fireEvent("saveScene"))}if(46==g&&(h=F.getUETableBySelected(this))){this.fireEvent("saveScene");for(k=0;n=h.selectedTds[k++];)f.fillNode(this.document,n);this.fireEvent("saveScene");f.preventDefault(d)}if(13==g){g=this.selection.getRange();if(k=f.findParentByTagName(g.startContainer,"caption",!0)){h=f.findParentByTagName(k,"table");g.collapsed?k&&g.setStart(h.rows[0].cells[0],0).setCursor(!1,!0):(g.deleteContents(),this.fireEvent("saveScene"));f.preventDefault(d);return}g.collapsed&&(h=f.findParentByTagName(g.startContainer,
+"table"))&&(n=h.rows[0].cells[0],k=f.findParentByTagName(this.selection.getStart(),["td","th"],!0),h=h.previousSibling,n===k&&(!h||1==h.nodeType&&"TABLE"==h.tagName)&&f.isStartInblock(g)&&(g=f.findParent(this.selection.getStart(),function(a){return f.isBlockElm(a)},!0))&&(/t(h|d)/i.test(g.tagName)||g===k.firstChild)&&(this.execCommand("insertparagraphbeforetable"),f.preventDefault(d)))}if((d.ctrlKey||d.metaKey)&&"67"==d.keyCode&&(c=null,h=F.getUETableBySelected(this)))for(g=h.selectedTds,e=h.isFullCol(),
+l=h.isFullRow(),c=[[h.cloneCell(g[0],null,!0)]],k=1;n=g[k];k++)n.parentNode!==g[k-1].parentNode?c.push([h.cloneCell(n,null,!0)]):c[c.length-1].push(h.cloneCell(n,null,!0))});x.addListener("tablehasdeleted",function(){m(this,!1,"",null);J&&f.remove(J)});x.addListener("beforepaste",function(b,g){var h=this,k=h.selection.getRange();if(f.findParentByTagName(k.startContainer,"caption",!0))k=h.document.createElement("div"),k.innerHTML=g.html,g.html=k[r.ie9below?"innerText":"textContent"];else{var n=F.getUETableBySelected(h);
+if(c){h.fireEvent("saveScene");var k=h.selection.getRange(),m=f.findParentByTagName(k.startContainer,["td","th"],!0),q,t;if(m){n=M(m);if(l){var y=n.getCellInfo(m).rowIndex;"TH"==m.tagName&&y++;for(var k=0,w;w=c[k++];){t=n.insertRow(y++,"td");for(var u=0,s;s=w[u];u++)(m=t.cells[u])||(m=t.insertCell(u)),m.innerHTML=s.innerHTML,s.getAttribute("width")&&m.setAttribute("width",s.getAttribute("width")),s.getAttribute("vAlign")&&m.setAttribute("vAlign",s.getAttribute("vAlign")),s.getAttribute("align")&&
+m.setAttribute("align",s.getAttribute("align")),s.style.cssText&&(m.style.cssText=s.style.cssText);for(u=0;(s=t.cells[u])&&w[u];u++)s.innerHTML=w[u].innerHTML,w[u].getAttribute("width")&&s.setAttribute("width",w[u].getAttribute("width")),w[u].getAttribute("vAlign")&&s.setAttribute("vAlign",w[u].getAttribute("vAlign")),w[u].getAttribute("align")&&s.setAttribute("align",w[u].getAttribute("align")),w[u].style.cssText&&(s.style.cssText=w[u].style.cssText)}}else{if(e){y=n.getCellInfo(m);u=m=0;for(w=c[0];s=
+w[u++];)m+=s.colSpan||1;h.__hasEnterExecCommand=!0;for(k=0;k<m;k++)h.execCommand("insertcol");h.__hasEnterExecCommand=!1;m=n.table.rows[0].cells[y.cellIndex];"TH"==m.tagName&&(m=n.table.rows[1].cells[y.cellIndex])}for(k=0;w=c[k++];){q=m;for(u=0;s=w[u++];)m?(m.innerHTML=s.innerHTML,s.getAttribute("width")&&m.setAttribute("width",s.getAttribute("width")),s.getAttribute("vAlign")&&m.setAttribute("vAlign",s.getAttribute("vAlign")),s.getAttribute("align")&&m.setAttribute("align",s.getAttribute("align")),
+s.style.cssText&&(m.style.cssText=s.style.cssText),t=m,m=m.nextSibling):(y=s.cloneNode(!0),f.removeAttributes(y,["class","rowSpan","colSpan"]),t.parentNode.appendChild(y));m=n.getNextCell(q,!0,!0);if(!c[k])break;m||(y=n.getCellInfo(q),n.table.insertRow(n.table.rows.length),n.update(),m=n.getVSideCell(q,!0))}}n.update()}else{n=h.document.createElement("table");for(k=0;w=c[k++];){t=n.insertRow(n.rows.length);for(u=0;s=w[u++];)y=F.cloneCell(s,null,!0),f.removeAttributes(y,["class"]),t.appendChild(y);
+2==u&&1<y.rowSpan&&(y.rowSpan=1)}k=F.getDefaultValue(h,void 0);k=h.body.offsetWidth-2*parseInt(f.getComputedStyle(h.body,"margin-left"),10)-2*k.tableBorder-(h.options.offsetWidth||0);h.execCommand("insertHTML","<table  "+(e&&l?'width="'+k+'"':"")+">"+n.innerHTML.replace(/>\s*</g,"><").replace(/\bth\b/gi,"td")+"</table>")}h.fireEvent("contentchange");h.fireEvent("saveScene");g.html="";return!0}k=h.document.createElement("div");k.innerHTML=g.html;w=k.getElementsByTagName("table");f.findParentByTagName(h.selection.getStart(),
+"table")?(p.each(w,function(a){f.remove(a)}),f.findParentByTagName(h.selection.getStart(),"caption",!0)&&(k.innerHTML=k[r.ie?"innerText":"textContent"])):p.each(w,function(b){d(b,!0);f.removeAttributes(b,["style","border"]);p.each(f.getElementsByTagName(b,"td"),function(b){a(b)&&f.fillNode(h.document,b);d(b,!0)})});g.html=k.innerHTML}});x.addListener("afterpaste",function(){p.each(f.getElementsByTagName(x.body,"table"),function(a){if(a.offsetWidth>x.body.offsetWidth){var b=F.getDefaultValue(x,a);
+a.style.width=x.body.offsetWidth-2*parseInt(f.getComputedStyle(x.body,"margin-left"),10)-2*b.tableBorder-(x.options.offsetWidth||0)+"px"}})});x.addListener("blur",function(){c=null});var n;x.addListener("keydown",function(){clearTimeout(n);n=setTimeout(function(){var a=x.selection.getRange();if(a=f.findParentByTagName(a.startContainer,["th","td"],!0)){var b=a.parentNode.parentNode.parentNode;b.offsetWidth>b.getAttribute("width")&&(a.style.wordBreak="break-all")}},100)});x.addListener("selectionchange",
+function(){m(x,!1,"",null)});x.addListener("contentchange",function(){var a=this;I(a);if(!F.getUETableBySelected(a)){var c=a.selection.getRange().startContainer,c=f.findParentByTagName(c,["td","th"],!0);p.each(f.getElementsByTagName(a.document,"table"),function(c){!0!==a.fireEvent("excludetable",c)&&(c.ueTable=new F(c),c.onmouseover=function(){a.fireEvent("tablemouseover",c)},c.onmousemove=function(){a.fireEvent("tablemousemove",c);a.options.tableDragable&&g(!0,this,a);p.defer(function(){a.fireEvent("contentchange",
+50)},!0)},c.onmouseout=function(){a.fireEvent("tablemouseout",c);m(a,!1,"",null);I(a)},c.onclick=function(c){c=a.window.event||c;var e=b(c.target||c.srcElement);if(e){var d=M(e),g=d.table,f=d.getCellInfo(e),h=a.selection.getRange();k(g,e,c,!0)?(g=d.getCell(d.indexTable[d.rowsNum-1][f.colIndex].rowIndex,d.indexTable[d.rowsNum-1][f.colIndex].cellIndex),c.shiftKey&&d.selectedTds.length?d.selectedTds[0]!==g?(c=d.getCellsRange(d.selectedTds[0],g),d.setSelected(c)):h&&h.selectNodeContents(g).select():e!==
+g?(c=d.getCellsRange(e,g),d.setSelected(c)):h&&h.selectNodeContents(g).select()):k(g,e,c)&&(g=d.getCell(d.indexTable[f.rowIndex][d.colsNum-1].rowIndex,d.indexTable[f.rowIndex][d.colsNum-1].cellIndex),c.shiftKey&&d.selectedTds.length?d.selectedTds[0]!==g?(c=d.getCellsRange(d.selectedTds[0],g),d.setSelected(c)):h&&h.selectNodeContents(g).select():e!==g?(c=d.getCellsRange(e,g),d.setSelected(c)):h&&h.selectNodeContents(g).select())}})});P(a,!0)}});f.on(x.document,"mousemove",h);f.on(x.document,"mouseout",
+function(a){"TABLE"==(a.target||a.srcElement).tagName&&m(x,!1,"",null)});x.addListener("interlacetable",function(a,b,c){if(b){a=b.rows;b=a.length;for(var e=0;e<b;e++){var d=c||this.options.classList;a[e].className=d[e]?d[e]:d[e%d.length]}}});x.addListener("uninterlacetable",function(a,b){if(b)for(var c=b.rows,e=this.options.classList,d=c.length,g=0;g<d;g++)f.removeClasses(c[g],e)});x.addListener("mousedown",q);x.addListener("mouseup",A);f.on(x.body,"dragstart",function(a){A.call(x,"dragstart",a)});
+x.addOutputRule(function(a){p.each(a.getNodesByTagName("div"),function(a){"ue_tableDragLine"==a.getAttr("id")&&a.parentNode.removeChild(a)})});var t=0;x.addListener("mousedown",function(){t=0});x.addListener("tabkeydown",function(){var b=this.selection.getRange(),c=b.getCommonAncestor(!0,!0),e=f.findParentByTagName(c,"table");if(e){if(f.findParentByTagName(c,"caption",!0))(c=f.getElementsByTagName(e,"th td"))&&c.length&&b.setStart(c[0],0).setCursor(!1,!0);else{var c=f.findParentByTagName(c,["td",
+"th"],!0),d=M(c);t=1<c.rowSpan?t:d.getCellInfo(c).rowIndex;(c=d.getTabNextCell(c,t))?a(c)?b.setStart(c,0).setCursor(!1,!0):b.selectNodeContents(c).select():(x.fireEvent("saveScene"),x.__hasEnterExecCommand=!0,this.execCommand("insertrownext"),x.__hasEnterExecCommand=!1,b=this.selection.getRange(),b.setStart(e.rows[e.rows.length-1].cells[0],0).setCursor(),x.fireEvent("saveScene"))}return!0}});r.ie&&x.addListener("selectionchange",function(){m(this,!1,"",null)});x.addListener("keydown",function(a,b){var c=
+b.keyCode||b.which;if(8!=c&&46!=c){(c=!b.ctrlKey&&!b.metaKey&&!b.shiftKey&&!b.altKey)&&ia(f.getElementsByTagName(this.body,"td"));var e=F.getUETableBySelected(this);e&&c&&e.clearSelected()}});x.addListener("beforegetcontent",function(){P(this,!1);r.ie&&p.each(this.document.getElementsByTagName("caption"),function(a){f.isEmptyNode(a)&&(a.innerHTML="&nbsp;")})});x.addListener("aftergetcontent",function(){P(this,!0)});x.addListener("getAllHtml",function(){ia(x.document.getElementsByTagName("td"))});
+x.addListener("fullscreenchanged",function(a,b){if(!b){var c=this.body.offsetWidth/document.body.offsetWidth,e=f.getElementsByTagName(this.body,"table");p.each(e,function(a){if(a.offsetWidth<x.body.offsetWidth)return!1;var b=f.getElementsByTagName(a,"td"),e=[];p.each(b,function(a){e.push(a.offsetWidth)});for(var d=0,g;g=b[d];d++)g.setAttribute("width",Math.floor(e[d]*c));a.setAttribute("width",Math.floor(Y(x,!0,F.getDefaultValue(x,void 0))))})}});var y=x.execCommand;x.execCommand=function(b,c){b=
+b.toLowerCase();var e=F.getUETableBySelected(this),d=new L.Range(this.document),g=this.commands[b]||UE.commands[b],h;if(g){if(!e||ea[b]||g.notNeedUndo||this.__hasEnterExecCommand)h=y.apply(this,arguments);else{this.__hasEnterExecCommand=!0;this.fireEvent("beforeexeccommand",b);for(var e=e.selectedTds,k=g=-2,l,n,m=0,q;q=e[m];m++)if(a(q)?d.setStart(q,0).setCursor(!1,!0):d.selectNode(q).select(!0),n=this.queryCommandState(b),l=this.queryCommandValue(b),-1!=n){if(g!==n||k!==l)this._ignoreContentChange=
+!0,h=y.apply(this,arguments),this._ignoreContentChange=!1;g=this.queryCommandState(b);k=this.queryCommandValue(b);f.isEmptyBlock(q)&&f.fillNode(this.document,q)}d.setStart(e[0],0).shrinkBoundary(!0).setCursor(!1,!0);this.fireEvent("contentchange");this.fireEvent("afterexeccommand",b);this.__hasEnterExecCommand=!1;this._selectionChange()}return h}}})};UE.UETable.prototype.sortTable=function(d,c){var b=this.table,a=b.rows,e=[],f="TH"===a[0].cells[0].tagName,g=0;if(this.selectedTds.length){for(var l=
+this.cellsRange,k=l.endRowIndex+1,m=l.beginRowIndex;m<k;m++)e[m]=a[m];e.splice(0,l.beginRowIndex);g=l.endRowIndex+1===this.rowsNum?0:l.endRowIndex+1}else for(m=0,k=a.length;m<k;m++)e[m]=a[m];var n={reversecurrent:function(a,b){return 1},orderbyasc:function(a,b){return(a.innerText||a.textContent).localeCompare(b.innerText||b.textContent)},reversebyasc:function(a,b){return b.innerHTML.localeCompare(a.innerHTML)},orderbynum:function(a,b){var c=a[r.ie?"innerText":"textContent"].match(/\d+/),e=b[r.ie?
+"innerText":"textContent"].match(/\d+/);c&&(c=+c[0]);e&&(e=+e[0]);return(c||0)-(e||0)},reversebynum:function(a,b){var c=a[r.ie?"innerText":"textContent"].match(/\d+/),e=b[r.ie?"innerText":"textContent"].match(/\d+/);c&&(c=+c[0]);e&&(e=+e[0]);return(e||0)-(c||0)}};b.setAttribute("data-sort-type",c&&"string"===typeof c&&n[c]?c:"");f&&e.splice(0,1);e=p.sort(e,function(a,b){return c&&"function"===typeof c?c.call(this,a.cells[d],b.cells[d]):c&&"number"===typeof c?1:c&&"string"===typeof c&&n[c]?n[c].call(this,
+a.cells[d],b.cells[d]):n.orderbyasc.call(this,a.cells[d],b.cells[d])});f=b.ownerDocument.createDocumentFragment();m=0;for(k=e.length;m<k;m++)f.appendChild(e[m]);b=b.getElementsByTagName("tbody")[0];g?b.insertBefore(f,a[g-l.endRowIndex+l.beginRowIndex-1]):b.appendChild(f)};UE.plugins.tablesort=function(){var d=this,c=UE.UETable;d.ready(function(){p.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("+
+d.options.themePath+d.options.theme+"/images/sortable.png);}",d.document);d.addListener("afterexeccommand",function(b,a){"mergeright"!=a&&"mergedown"!=a&&"mergecells"!=a||this.execCommand("disablesort")})});UE.commands.sorttable={queryCommandState:function(){var b=c.getTableItemsByRange(this);if(!b.cell)return-1;for(var b=b.table.getElementsByTagName("td"),a=0,e;e=b[a++];)if(1!=e.rowSpan||1!=e.colSpan)return-1;return 0},execCommand:function(b,a){var e=this.selection.getRange(),d=e.createBookmark(!0),
+g=c.getTableItemsByRange(this),f=g.cell,g=c.getUETable(g.table),f=g.getCellInfo(f);g.sortTable(f.cellIndex,a);e.moveToBookmark(d);try{e.select()}catch(k){}}};UE.commands.enablesort=UE.commands.disablesort={queryCommandState:function(b){var a=c.getTableItemsByRange(this).table;if(a&&"enablesort"==b)for(var e=f.getElementsByTagName(a,"th td"),d=0;d<e.length;d++)if(1<e[d].getAttribute("colspan")||1<e[d].getAttribute("rowspan"))return-1;return a?"enablesort"==b^"sortEnabled"!=a.getAttribute("data-sort")?
+-1:0:-1},execCommand:function(b){var a=c.getTableItemsByRange(this).table;a.setAttribute("data-sort","enablesort"==b?"sortEnabled":"sortDisabled");"enablesort"==b?f.addClass(a,"sortEnabled"):f.removeClasses(a,"sortEnabled")}}};UE.plugins.contextmenu=function(){var d=this;d.setOpt("enableContextMenu",!0);if(!1!==d.getOpt("enableContextMenu")){var c=d.getLang("contextMenu"),b,a=d.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(a.length){var e=
+UE.ui.uiUtils;d.addListener("contextmenu",function(h,g){var l=e.getViewportOffsetByEvent(g);d.fireEvent("beforeselectionchange");b&&b.destroy();for(var k=0,m,n=[];m=a[k];k++){var q;(function(a){if("-"==a)(q=n[n.length-1])&&"-"!==q&&n.push("-");else if(a.hasOwnProperty("group")){for(var b=0,e,g=[];e=a.subMenu[b];b++)(function(a){"-"==a?(q=g[g.length-1])&&"-"!==q?g.push("-"):g.splice(g.length-1):(d.commands[a.cmdName]||UE.commands[a.cmdName]||a.query)&&-1<(a.query?a.query():d.queryCommandState(a.cmdName))&&
+g.push({label:a.label||d.getLang("contextMenu."+a.cmdName+(a.value||""))||"",className:"edui-for-"+a.cmdName+(a.className?" edui-for-"+a.cmdName+"-"+a.className:""),onclick:a.exec?function(){a.exec.call(d)}:function(){d.execCommand(a.cmdName,a.value)}})})(e);g.length&&n.push({label:function(){switch(a.icon){case "table":return d.getLang("contextMenu.table");case "justifyjustify":return d.getLang("contextMenu.paragraph");case "aligntd":return d.getLang("contextMenu.aligntd");case "aligntable":return d.getLang("contextMenu.aligntable");
+case "tablesort":return c.tablesort;case "borderBack":return c.borderbk;default:return""}}(),className:"edui-for-"+a.icon,subMenu:{items:g,editor:d}})}else(d.commands[a.cmdName]||UE.commands[a.cmdName]||a.query)&&-1<(a.query?a.query.call(d):d.queryCommandState(a.cmdName))&&n.push({label:a.label||d.getLang("contextMenu."+a.cmdName),className:"edui-for-"+(a.icon?a.icon:a.cmdName+(a.value||"")),onclick:a.exec?function(){a.exec.call(d)}:function(){d.execCommand(a.cmdName,a.value)}})})(m)}"-"==n[n.length-
+1]&&n.pop();b=new UE.ui.Menu({items:n,className:"edui-contextmenu",editor:d});b.render();b.showAt(l);d.fireEvent("aftershowcontextmenu",b);f.preventDefault(g);if(r.ie){var t;try{t=d.selection.getNative().createRange()}catch(p){return}t.item&&(new L.Range(d.document)).selectNode(t.item(0)).select(!0,!0)}});d.addListener("aftershowcontextmenu",function(a,b){if(d.zeroclipboard){var c=b.items,e;for(e in c)"edui-for-copy"==c[e].className&&d.zeroclipboard.clip(c[e].getDom())}})}}};UE.plugins.shortcutmenu=
+function(){var d,c=this.options.shortcutMenu||[];c.length&&(this.addListener("contextmenu mouseup",function(b,a){var e=this,h={type:b,target:a.target||a.srcElement,screenX:a.screenX,screenY:a.screenY,clientX:a.clientX,clientY:a.clientY};setTimeout(function(){if(!1===e.selection.getRange().collapsed||"contextmenu"==b)d||(d=new s.editor.ui.ShortCutMenu({editor:e,items:c,theme:e.options.theme,className:"edui-shortcutmenu"}),d.render(),e.fireEvent("afterrendershortcutmenu",d)),d.show(h,!!UE.plugins.contextmenu)});
+if("contextmenu"==b&&(f.preventDefault(a),r.ie9below)){var g;try{g=e.selection.getNative().createRange()}catch(l){return}g.item&&(new L.Range(e.document)).selectNode(g.item(0)).select(!0,!0)}}),this.addListener("keydown",function(b){"keydown"==b&&d&&!d.isHidden&&d.hide()}))};UE.plugins.basestyle=function(){var d={bold:["strong","b"],italic:["em","i"],subscript:["sub"],superscript:["sup"]},c=function(a,b){return f.filterNodeList(a.selection.getStartElementPath(),b)},b=this;b.addshortcutkey({Bold:"ctrl+66",
+Italic:"ctrl+73",Underline:"ctrl+85"});b.addInputRule(function(a){p.each(a.getNodesByTagName("b i"),function(a){switch(a.tagName){case "b":a.tagName="strong";break;case "i":a.tagName="em"}})});for(var a in d)(function(a,d){b.commands[a]={execCommand:function(a){var e=b.selection.getRange(),k=c(this,d);if(e.collapsed){if(k)a=b.document.createTextNode(""),e.insertNode(a).removeInlineStyle(d),e.setStartBefore(a),f.remove(a);else{k=e.document.createElement(d[0]);if("superscript"==a||"subscript"==a)a=
+b.document.createTextNode(""),e.insertNode(a).removeInlineStyle(["sub","sup"]).setStartBefore(a).collapse(!0);e.insertNode(k).setStart(k,0)}e.collapse(!0)}else{if("superscript"==a||"subscript"==a)k&&k.tagName.toLowerCase()==a||e.removeInlineStyle(["sub","sup"]);k?e.removeInlineStyle(d):e.applyInlineStyle(d[0])}e.select()},queryCommandState:function(){return c(this,d)?1:0}}})(a,d[a])};UE.plugins.elementpath=function(){var d,c,b=this;b.setOpt("elementPathEnabled",!0);b.options.elementPathEnabled&&(b.commands.elementpath=
+{execCommand:function(a,e){var f=c[e],g=b.selection.getRange();d=1*e;g.selectNode(f).select()},queryCommandValue:function(){var a=[].concat(this.selection.getStartElementPath()).reverse(),b=[];c=a;for(var f=0,g;g=a[f];f++)if(3!=g.nodeType){var l=g.tagName.toLowerCase();"img"==l&&g.getAttribute("anchorname")&&(l="anchor");b[f]=l;if(d==f){d=-1;break}}return b}})};UE.plugins.formatmatch=function(){function d(h,g){if(r.webkit)var l="IMG"==g.target.tagName?g.target:null;c.undoManger&&c.undoManger.save();
+var k=c.selection.getRange(),l=l||k.getClosedNode();if(a&&l&&"IMG"==l.tagName)l.style.cssText+=";float:"+(a.style.cssFloat||a.style.styleFloat||"none")+";display:"+(a.style.display||"inline"),a=null;else if(!a){if(k.collapsed){var m=c.document.createTextNode("match");k.insertNode(m).select()}c.__hasEnterExecCommand=!0;k=c.options.removeFormatAttributes;c.options.removeFormatAttributes="";c.execCommand("removeformat");c.options.removeFormatAttributes=k;c.__hasEnterExecCommand=!1;k=c.selection.getRange();
+b.length&&(l=k,m&&l.selectNode(m),l.applyInlineStyle(b[b.length-1].tagName,null,b));m&&k.setStartBefore(m).collapse(!0);k.select();m&&f.remove(m)}c.undoManger&&c.undoManger.save();c.removeListener("mouseup",d);e=0}var c=this,b=[],a,e=0;c.addListener("reset",function(){b=[];e=0});c.commands.formatmatch={execCommand:function(h){if(e)e=0,b=[],c.removeListener("mouseup",d);else{h=c.selection.getRange();a=h.getClosedNode();if(!a||"IMG"!=a.tagName){h.collapse(!0).shrinkBoundary();b=f.findParents(h.startContainer,
+!0,function(a){return!f.isBlockElm(a)&&1==a.nodeType});h=0;for(var g;g=b[h];h++)if("A"==g.tagName){b.splice(h,1);break}}c.addListener("mouseup",d);e=1}},queryCommandState:function(){return e},notNeedUndo:1}};UE.plugin.register("searchreplace",function(){function d(a,b,c){var l=0;a=a.firstChild;for(var k=0;a;){if(3==a.nodeType){if(k=a.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,l+=k,l>=b)return{node:a,index:k-(l-b)}}else if(!v.$empty[a.tagName]&&(k=a[r.ie?"innerText":"textContent"].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,
+"").length,l+=k,l>=b&&(k=d(a,k-(l-b),c))))return k;a=f.getNextDomNode(a)}}function c(c,h){var g=c.selection.getRange(),l,k=h.searchStr,m=c.document.createElement("span");m.innerHTML="$$ueditor_searchreplace_key$$";g.shrinkBoundary(!0);if(!g.collapsed){g.select();var n=c.selection.getText();if(RegExp("^"+h.searchStr+"$",h.casesensitive?"":"i").test(n)){if(void 0!=h.replaceStr)return k=h.replaceStr,k=b.document.createTextNode(k),g.deleteContents().insertNode(k),g.select(),!0;g.collapse(-1==h.dir)}}g.insertNode(m);
+g.enlargeToBlockElm(!0);l=g.startContainer;n=l[r.ie?"innerText":"textContent"].indexOf("$$ueditor_searchreplace_key$$");g.setStartBefore(m);f.remove(m);a:{var m=l,q;l=h.all||1==h.dir?"getNextDomNode":"getPreDomNode";f.isBody(m)&&(m=m.firstChild);for(;m;){q=3==m.nodeType?m.nodeValue:m[r.ie?"innerText":"textContent"];b:{var t=h,p=n,y=t.searchStr;-1==t.dir&&(q=q.split("").reverse().join(""),y=y.split("").reverse().join(""),p=q.length-p);for(var y=RegExp(y,"g"+(t.casesensitive?"":"i")),u=void 0;u=y.exec(q);)if(u.index>=
+p){q=-1==t.dir?q.length-u.index-t.searchStr.length:u.index;break b}q=-1}if(-1!=q){n={node:m,index:q};break a}for(m=f[l](m);m&&a[m.nodeName.toLowerCase()];)m=f[l](m,!0);m&&(n=-1==h.dir?(3==m.nodeType?m.nodeValue:m[r.ie?"innerText":"textContent"]).length:0)}n=void 0}if(n)return m=d(n.node,n.index,k),k=d(n.node,n.index+k.length,k),g.setStart(m.node,m.index).setEnd(k.node,k.index),void 0!==h.replaceStr&&(k=h.replaceStr,k=b.document.createTextNode(k),g.deleteContents().insertNode(k)),g.select(),!0;g.setCursor()}
+var b=this,a={table:1,tbody:1,tr:1,ol:1,ul:1};return{commands:{searchreplace:{execCommand:function(a,d){p.extend(d,{all:!1,casesensitive:!1,dir:1},!0);var g=0;if(d.all){var f=b.selection.getRange(),k=b.body.firstChild;k&&1==k.nodeType?(f.setStart(k,0),f.shrinkBoundary(!0)):3==k.nodeType&&f.setStartBefore(k);f.collapse(!0).select(!0);for(void 0!==d.replaceStr&&b.fireEvent("saveScene");c(this,d);)g++}else void 0!==d.replaceStr&&b.fireEvent("saveScene"),c(this,d)&&g++;g&&b.fireEvent("saveScene");return g},
+notNeedUndo:1}}}});UE.plugins.customstyle=function(){var d=this;d.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;"}]});
+d.commands.customstyle={execCommand:function(c,b){var a=b.tag,e=f.findParent(this.selection.getStart(),function(a){return a.getAttribute("label")},!0),d,g,l={};for(d in b)void 0!==b[d]&&(l[d]=b[d]);delete l.tag;if(e&&e.getAttribute("label")==b.label){d=this.selection.getRange();g=d.createBookmark();if(d.collapsed)if(v.$block[e.tagName]){var k=this.document.createElement("p");f.moveChild(e,k);e.parentNode.insertBefore(k,e);f.remove(e)}else f.remove(e,!0);else{e=f.getCommonAncestor(g.start,g.end);l=
+f.getElementsByTagName(e,a);RegExp(a,"i").test(e.tagName)&&l.push(e);for(var m=0,n;n=l[m++];)if(n.getAttribute("label")==b.label){var k=f.getPosition(n,g.start),q=f.getPosition(n,g.end);(k&f.POSITION_FOLLOWING||k&f.POSITION_CONTAINS)&&(q&f.POSITION_PRECEDING||q&f.POSITION_CONTAINS)&&v.$block[a]&&(k=this.document.createElement("p"),f.moveChild(n,k),n.parentNode.insertBefore(k,n));f.remove(n,!0)}(e=f.findParent(e,function(a){return a.getAttribute("label")==b.label},!0))&&f.remove(e,!0)}d.moveToBookmark(g).select()}else v.$block[a]?
+(this.execCommand("paragraph",a,l,"customstyle"),d=this.selection.getRange(),d.collapsed||(d.collapse(),e=f.findParent(this.selection.getStart(),function(a){return a.getAttribute("label")==b.label},!0),a=this.document.createElement("p"),f.insertAfter(e,a),f.fillNode(this.document,a),d.setStart(a,0).setCursor())):(d=this.selection.getRange(),d.collapsed?(e=this.document.createElement(a),f.setAttributes(e,l),d.insertNode(e).setStart(e,0).setCursor()):(g=d.createBookmark(),d.applyInlineStyle(a,l).moveToBookmark(g).select()))},
+queryCommandValue:function(){var c=f.filterNodeList(this.selection.getStartElementPath(),function(b){return b.getAttribute("label")});return c?c.getAttribute("label"):""}};d.addListener("keyup",function(c,b){var a=b.keyCode||b.which;if(32==a||13==a)if(a=d.selection.getRange(),a.collapsed){var e=f.findParent(d.selection.getStart(),function(a){return a.getAttribute("label")},!0);if(e&&v.$block[e.tagName]&&f.isEmptyNode(e)){var h=d.document.createElement("p");f.insertAfter(e,h);f.fillNode(d.document,
+h);f.remove(e);a.setStart(h,0).setCursor()}}})};UE.plugins.catchremoteimage=function(){var d=this,c=UE.ajax;!1!==d.options.catchRemoteImageEnable&&(d.setOpt({catchRemoteImageEnable:!1}),d.addListener("afterpaste",function(){d.fireEvent("catchRemoteImage")}),d.addListener("catchRemoteImage",function(){function b(a,b){var f=p.serializeParam(d.queryCommandValue("serverparam"))||"",f=p.formatUrl(e+(-1==e.indexOf("?")?"?":"&")+f),h={method:"POST",dataType:p.isCrossDomainUrl(f)?"jsonp":"",timeout:6E4,onsuccess:b.success,
+onerror:b.error};h[g]=a;c.request(f,h)}for(var a=d.getOpt("catcherLocalDomain"),e=d.getActionUrl(d.getOpt("catcherActionName")),h=d.getOpt("catcherUrlPrefix"),g=d.getOpt("catcherFieldName"),l=[],k=f.getElementsByTagName(d.document,"img"),m=function(a,b){if(-1!=a.indexOf(location.host)||/(^\.)|(^\/)/.test(a))return!0;if(b)for(var c=0,e;e=b[c++];)if(-1!==a.indexOf(e))return!0;return!1},n=0,q;q=k[n++];)q.getAttribute("word_img")||(q=q.getAttribute("_src")||q.src||"",/^(https?|ftp):/i.test(q)&&!m(q,a)&&
+l.push(q));l.length&&b(l,{success:function(a){try{var b=void 0!==a.state?a:eval("("+a.responseText+")")}catch(c){return}var e,g,n,l=b.list;for(a=0;b=k[a++];)for(n=b.getAttribute("_src")||b.src||"",e=0;g=l[e++];)if(n==g.source&&"SUCCESS"==g.state){e=h+g.url;f.setAttributes(b,{src:e,_src:e});break}d.fireEvent("catchremotesuccess")},error:function(){d.fireEvent("catchremoteerror")}})}))};UE.plugin.register("snapscreen",function(){function d(a){var b=document.createElement("a"),d=p.serializeParam(c.queryCommandValue("serverparam"))||
+"";b.href=a;r.ie&&(b.href=b.href);a=b.search;d&&(a=a+(-1==a.indexOf("?")?"?":"&")+d,a=a.replace(/[&]+/ig,"&"));return{port:b.port,hostname:b.hostname,path:b.pathname+a||+b.hash}}var c=this,b;return{commands:{snapscreen:{execCommand:function(a){function e(a){try{if(a=eval("("+a+")"),"SUCCESS"==a.state){var b=c.options;c.execCommand("insertimage",{src:b.snapscreenUrlPrefix+a.url,_src:b.snapscreenUrlPrefix+a.url,alt:a.title||"",floatStyle:b.snapscreenImgAlign})}else alert(a.state)}catch(e){alert(l.callBackErrorMsg)}}
+var f,g,l=c.getLang("snapScreen_plugin");if(!b){a=c.container;b=(c.container.ownerDocument||c.container.document).createElement("object");try{b.type="application/x-pluginbaidusnap"}catch(k){return}b.style.cssText="position:absolute;left:-9999px;width:0;height:0;";b.setAttribute("width","0");b.setAttribute("height","0");a.appendChild(b)}a=c.getActionUrl(c.getOpt("snapscreenActionName"));f=d(a);setTimeout(function(){try{g=b.saveSnapshot(f.hostname,f.path,f.port)}catch(a){c.ui._dialogs.snapscreenDialog.open();
+return}e(g)},50)},queryCommandState:function(){return-1!=navigator.userAgent.indexOf("Windows",0)?0:-1}}}}});UE.commands.insertparagraph={execCommand:function(d,c){for(var b=this.selection.getRange(),a=b.startContainer,e;a&&!f.isBody(a);)e=a,a=a.parentNode;e&&(a=this.document.createElement("p"),c?e.parentNode.insertBefore(a,e):e.parentNode.insertBefore(a,e.nextSibling),f.fillNode(this.document,a),b.setStart(a,0).setCursor(!1,!0))}};UE.plugin.register("webapp",function(){function d(b,a){return a?'<iframe class="edui-faked-webapp" title="'+
+b.title+'" '+(b.align&&!b.cssfloat?'align="'+b.align+'"':"")+(b.cssfloat?'style="float:'+b.cssfloat+'"':"")+'width="'+b.width+'" height="'+b.height+'"  scrolling="no" frameborder="0" src="'+b.url+'" logo_url = "'+b.logo+'"></iframe>':'<img title="'+b.title+'" width="'+b.width+'" height="'+b.height+'" src="'+c.options.UEDITOR_HOME_URL+'themes/default/images/spacer.gif" _logo_url="'+b.logo+'" style="background:url('+b.logo+') no-repeat center center; border:1px solid gray;" class="edui-faked-webapp" _url="'+
+b.url+'" '+(b.align&&!b.cssfloat?'align="'+b.align+'"':"")+(b.cssfloat?'style="float:'+b.cssfloat+'"':"")+"/>"}var c=this;return{outputRule:function(b){p.each(b.getNodesByTagName("img"),function(a){var b;"edui-faked-webapp"==a.getAttr("class")&&(b=d({title:a.getAttr("title"),width:a.getAttr("width"),height:a.getAttr("height"),align:a.getAttr("align"),cssfloat:a.getStyle("float"),url:a.getAttr("_url"),logo:a.getAttr("_logo_url")},!0),b=UE.uNode.createElement(b),a.parentNode.replaceChild(b,a))})},inputRule:function(b){p.each(b.getNodesByTagName("iframe"),
+function(a){if("edui-faked-webapp"==a.getAttr("class")){var b=UE.uNode.createElement(d({title:a.getAttr("title"),width:a.getAttr("width"),height:a.getAttr("height"),align:a.getAttr("align"),cssfloat:a.getStyle("float"),url:a.getAttr("src"),logo:a.getAttr("logo_url")}));a.parentNode.replaceChild(b,a)}})},commands:{webapp:{execCommand:function(b,a){var c=d(p.extend(a,{align:"none"}),!1);this.execCommand("inserthtml",c)},queryCommandState:function(){var b=this.selection.getRange().getClosedNode();return b&&
+"edui-faked-webapp"==b.className?1:0}}}}});UE.plugins.template=function(){UE.commands.template={execCommand:function(d,c){c.html&&this.execCommand("inserthtml",c.html)}};this.addListener("click",function(d,c){var b=c.target||c.srcElement,a=this.selection.getRange();(b=f.findParent(b,function(a){if(a.className&&f.hasClass(a,"ue_t"))return a},!0))&&a.selectNode(b).shrinkBoundary().select()});this.addListener("keydown",function(d,c){var b=this.selection.getRange();b.collapsed||c.ctrlKey||c.metaKey||
+c.shiftKey||c.altKey||(b=f.findParent(b.startContainer,function(a){if(a.className&&f.hasClass(a,"ue_t"))return a},!0))&&f.removeClasses(b,["ue_t"])})};UE.plugin.register("music",function(){function d(b,a,e,d,g,f){return f?'<embed type="application/x-shockwave-flash" class="edui-faked-music" pluginspage="http://www.macromedia.com/go/getflashplayer" src="'+b+'" width="'+a+'" height="'+e+'" '+(d&&!g?'align="'+d+'"':"")+(g?'style="float:'+g+'"':"")+' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >':
+"<img "+(d&&!g?'align="'+d+'"':"")+(g?'style="float:'+g+'"':"")+' width="'+a+'" height="'+e+'" _url="'+b+'" class="edui-faked-music" src="'+c.options.langPath+c.options.lang+'/images/music.png" />'}var c=this;return{outputRule:function(b){p.each(b.getNodesByTagName("img"),function(a){var b;if("edui-faked-music"==a.getAttr("class")){b=a.getStyle("float");var c=a.getAttr("align");b=d(a.getAttr("_url"),a.getAttr("width"),a.getAttr("height"),c,b,!0);b=UE.uNode.createElement(b);a.parentNode.replaceChild(b,
+a)}})},inputRule:function(b){p.each(b.getNodesByTagName("embed"),function(a){if("edui-faked-music"==a.getAttr("class")){var b=a.getStyle("float"),c=a.getAttr("align");html=d(a.getAttr("src"),a.getAttr("width"),a.getAttr("height"),c,b,!1);b=UE.uNode.createElement(html);a.parentNode.replaceChild(b,a)}})},commands:{music:{execCommand:function(b,a){var c=d(a.url,a.width||400,a.height||95,"none",!1);this.execCommand("inserthtml",c)},queryCommandState:function(){var b=this.selection.getRange().getClosedNode();
+return b&&"edui-faked-music"==b.className?1:0}}}}});UE.plugin.register("autoupload",function(){function d(c,b){var a,e,d,g,l,k,m,n,q=/image\/\w+/i.test(c.type)?"image":"file",t="loading_"+(+new Date).toString(36);a=b.getOpt(q+"FieldName");e=b.getOpt(q+"UrlPrefix");d=b.getOpt(q+"MaxSize");g=b.getOpt(q+"AllowFiles");l=b.getActionUrl(b.getOpt(q+"ActionName"));m=function(a){var c=b.document.getElementById(t);c&&f.remove(c);b.fireEvent("showmessage",{id:t,content:a,type:"error",timeout:4E3})};"image"==
+q?(k='<img class="loadingclass" id="'+t+'" src="'+b.options.themePath+b.options.theme+'/images/spacer.gif" title="'+(b.getLang("autoupload.loading")||"")+'" >',n=function(a){var c=e+a.url,d=b.document.getElementById(t);d&&(d.setAttribute("src",c),d.setAttribute("_src",c),d.setAttribute("title",a.title||""),d.setAttribute("alt",a.original||""),d.removeAttribute("id"),f.removeClasses(d,"loadingclass"))}):(k='<p><img class="loadingclass" id="'+t+'" src="'+b.options.themePath+b.options.theme+'/images/spacer.gif" title="'+
+(b.getLang("autoupload.loading")||"")+'" ></p>',n=function(a){a=e+a.url;var c=b.document.getElementById(t),d=b.selection.getRange(),g=d.createBookmark();d.selectNode(c).select();b.execCommand("insertfile",{url:a});d.moveToBookmark(g).select()});b.execCommand("inserthtml",k);b.getOpt(q+"ActionName")?c.size>d?m(b.getLang("autoupload.exceedSizeError")):(d=c.name?c.name.substr(c.name.lastIndexOf(".")):"")&&"image"!=q||g&&-1==(g.join("")+".").indexOf(d.toLowerCase()+".")?m(b.getLang("autoupload.exceedTypeError")):
+(g=new XMLHttpRequest,q=new FormData,d=p.serializeParam(b.queryCommandValue("serverparam"))||"",l=p.formatUrl(l+(-1==l.indexOf("?")?"?":"&")+d),q.append(a,c,c.name||"blob."+c.type.substr(6)),q.append("type","ajax"),g.open("post",l,!0),g.setRequestHeader("X-Requested-With","XMLHttpRequest"),g.addEventListener("load",function(a){try{var c=(new Function("return "+p.trim(a.target.response)))();"SUCCESS"==c.state&&c.url?n(c):m(c.state)}catch(e){m(b.getLang("autoupload.loadError"))}}),g.send(q)):m(b.getLang("autoupload.errorLoadConfig"))}
+return{outputRule:function(c){p.each(c.getNodesByTagName("img"),function(b){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(b.getAttr("class"))&&b.parentNode.removeChild(b)});p.each(c.getNodesByTagName("p"),function(b){/\bloadpara\b/.test(b.getAttr("class"))&&b.parentNode.removeChild(b)})},bindEvents:{ready:function(c){var b=this;window.FormData&&window.FileReader&&(f.on(b.body,"paste drop",function(a){var c=!1,f;if(f="paste"==a.type?a.clipboardData&&a.clipboardData.items&&1==a.clipboardData.items.length&&
+/^image\//.test(a.clipboardData.items[0].type)?a.clipboardData.items:null:a.dataTransfer&&a.dataTransfer.files?a.dataTransfer.files:null){for(var g=f.length,l;g--;)l=f[g],l.getAsFile&&(l=l.getAsFile()),l&&0<l.size&&(d(l,b),c=!0);c&&a.preventDefault()}}),f.on(b.body,"dragover",function(a){"Files"==a.dataTransfer.types[0]&&a.preventDefault()}),p.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 d(d){var g;new Date-b<a||(d.hasContents()?(b=new Date,d._saveFlag=null,g=c.body.innerHTML,!1!==d.fireEvent("beforeautosave",{content:g})&&(c.setPreferences(e,g),d.fireEvent("afterautosave",{content:g}))):e&&c.removePreferences(e))}var c=this,b=new Date,a=20,
+e=null;return{defaultOptions:{saveInterval:500},bindEvents:{ready:function(){var a=null,a=c.key?c.key+"-drafts-data":(c.container.parentNode.id||"ue-common")+"-drafts-data";e=(location.protocol+location.host+location.pathname).replace(/[.:\/]/g,"_")+a},contentchange:function(){e&&(c._saveFlag&&window.clearTimeout(c._saveFlag),0<c.options.saveInterval?c._saveFlag=window.setTimeout(function(){d(c)},c.options.saveInterval):d(c))}},commands:{clearlocaldata:{execCommand:function(a,b){e&&c.getPreferences(e)&&
+c.removePreferences(e)},notNeedUndo:!0,ignoreContentChange:!0},getlocaldata:{execCommand:function(a,b){return e?c.getPreferences(e)||"":""},notNeedUndo:!0,ignoreContentChange:!0},drafts:{execCommand:function(a,b){e&&(c.body.innerHTML=c.getPreferences(e)||"<p>"+f.fillHtml+"</p>",c.focus(!0))},queryCommandState:function(){return e?null===c.getPreferences(e)?-1:0:-1},notNeedUndo:!0,ignoreContentChange:!0}}}});UE.plugin.register("charts",function(){function d(b){var a=null,c=0;if(2>b.rows.length||2>b.rows[0].cells.length)return!1;
+for(var a=b.rows[0].cells,c=a.length,d=0,g;g=a[d];d++)if("th"!==g.tagName.toLowerCase())return!1;for(d=1;a=b.rows[d];d++){if(a.cells.length!=c||"th"!==a.cells[0].tagName.toLowerCase())return!1;for(var f=1;g=a.cells[f];f++)if(g=p.trim(g.innerText||g.textContent||""),g=g.replace(RegExp(UE.dom.domUtils.fillChar,"g"),"").replace(/^\s+|\s+$/g,""),!/^\d*\.?\d+$/.test(g))return!1}return!0}var c=this;return{bindEvents:{chartserror:function(){}},commands:{charts:{execCommand:function(b,a){var e=f.findParentByTagName(this.selection.getRange().startContainer,
+"table",!0),h=[],g={};if(!e)return!1;if(!d(e))return c.fireEvent("chartserror"),!1;g.title=a.title||"";g.subTitle=a.subTitle||"";g.xTitle=a.xTitle||"";g.yTitle=a.yTitle||"";g.suffix=a.suffix||"";g.tip=a.tip||"";g.dataFormat=a.tableDataFormat||"";g.chartType=a.chartType||0;for(var l in g)g.hasOwnProperty(l)&&h.push(l+":"+g[l]);e.setAttribute("data-chart",h.join(";"));f.addClass(e,"edui-charts-table")},queryCommandState:function(b,a){var c=f.findParentByTagName(this.selection.getRange().startContainer,
+"table",!0);return c&&d(c)?0:-1}}},inputRule:function(b){p.each(b.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style")})},outputRule:function(b){p.each(b.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style","display: none;")})}}});UE.plugin.register("section",function(){function d(a){this.tag="";this.level=-1;this.parentSection=this.previousSection=this.nextSection=this.dom=null;this.startAddress=[];this.endAddress=[];this.children=
+[]}function c(a){var b=new d;return p.extend(b,a)}function b(a,b){for(var c=b,d=0;d<a.length;d++){if(!c.childNodes)return null;c=c.childNodes[a[d]]}return c}var a=this;return{bindMultiEvents:{type:"aftersetcontent afterscencerestore",handler:function(){a.fireEvent("updateSections")}},bindEvents:{ready:function(){a.fireEvent("updateSections");f.on(a.body,"drop paste",function(){a.fireEvent("updateSections")})},afterexeccommand:function(b,c){"paragraph"==c&&a.fireEvent("updateSections")},keyup:function(a,
+b){if(!0!=this.selection.getRange().collapsed)this.fireEvent("updateSections");else{var c=b.keyCode||b.which;13!=c&&8!=c&&46!=c||this.fireEvent("updateSections")}}},commands:{getsections:{execCommand:function(a,b){function d(a,b){for(var e,k=null,h,r=a.childNodes,s=0,v=r.length;s<v;s++){h=r[s];a:{e=h;for(var A=0;A<f.length;A++)if(f[A](e)){e=A;break a}e=-1}if(0<=e){k=m.selection.getRange().selectNode(h).createAddress(!0).startAddress;k=c({tag:h.tagName,title:h.innerText||h.textContent||"",level:e,
+dom:h,startAddress:p.clone(k,[]),endAddress:p.clone(k,[]),children:[]});n.nextSection=k;for(h=k.previousSection=n;e<=h.level;)h=h.parentSection;k.parentSection=h;h.children.push(k);k=n=k}else 1===h.nodeType&&d(h,b),k&&k.endAddress[k.endAddress.length-1]++}}for(var f=b||"h1 h2 h3 h4 h5 h6".split(" "),k=0;k<f.length;k++)"string"==typeof f[k]?f[k]=function(a){return function(b){return b.tagName==a.toUpperCase()}}(f[k]):"function"!=typeof f[k]&&(f[k]=function(a){return null});var m=this,n=k=c({level:-1,
+title:"root"});d(m.body,k);return k},notNeedUndo:!0},movesection:{execCommand:function(a,c,d,l){if(c&&d&&-1!=d.level){d=l?d.endAddress:d.startAddress;a=b(d,this.body);var k;if(!(k=!d)&&!(k=!a)){k=c.startAddress;for(var m=!1,n=!1,q=0;q<k.length&&!(q>=d.length);q++)if(d[q]>k[q]){m=!0;break}else if(d[q]<k[q])break;for(q=0;q<c.endAddress.length&&!(q>=d.length);q++)if(d[q]<k[q]){n=!0;break}else if(d[q]>k[q])break;k=m&&n}if(!k){d=b(c.startAddress,this.body);c=b(c.endAddress,this.body);if(l)for(l=c;l&&!(f.getPosition(d,
+l)&f.POSITION_FOLLOWING);){k=l.previousSibling;f.insertAfter(a,l);if(l==d)break;l=k}else for(l=d;l&&!(f.getPosition(l,c)&f.POSITION_FOLLOWING);){k=l.nextSibling;a.parentNode.insertBefore(l,a);if(l==c)break;l=k}this.fireEvent("updateSections")}}}},deletesection:{execCommand:function(a,b,c){function d(a){for(var b=k.body,c=0;c<a.length;c++){if(!b.childNodes)return null;b=b.childNodes[a[c]]}return b}var k=this;if(b){a=d(b.startAddress);b=d(b.endAddress);if(c)f.remove(a);else for(;a&&f.inDoc(b,k.document)&&
+!(f.getPosition(a,b)&f.POSITION_FOLLOWING);)c=a.nextSibling,f.remove(a),a=c;k.fireEvent("updateSections")}}},selectsection:{execCommand:function(a,b){if(!b&&!b.dom)return!1;var c=this.selection.getRange(),d={startAddress:p.clone(b.startAddress,[]),endAddress:p.clone(b.endAddress,[])};d.endAddress[d.endAddress.length-1]++;c.moveToAddress(d).select().scrollToView();return!0},notNeedUndo:!0},scrolltosection:{execCommand:function(a,b){if(!b&&!b.dom)return!1;var c=this.selection.getRange(),d={startAddress:b.startAddress,
+endAddress:b.endAddress};d.endAddress[d.endAddress.length-1]++;c.moveToAddress(d).scrollToView();return!0},notNeedUndo:!0}}}});UE.plugin.register("simpleupload",function(){function d(){var e=a.offsetWidth||20,d=a.offsetHeight||20,g=document.createElement("iframe"),l="display:block;width:"+e+"px;height:"+d+"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;";f.on(g,"load",function(){var a=
+(+new Date).toString(36),m,n,q;n=g.contentDocument||g.contentWindow.document;q=n.body;m=n.createElement("div");m.innerHTML='<form id="edui_form_'+a+'" target="edui_iframe_'+a+'" method="POST" enctype="multipart/form-data" action="'+c.getOpt("serverUrl")+'" style="'+l+'"><input id="edui_input_'+a+'" type="file" accept="image/*" name="'+c.options.imageFieldName+'" style="'+l+'"></form><iframe id="edui_iframe_'+a+'" name="edui_iframe_'+a+'" style="display:none;width:0;height:0;border:0;margin:0;padding:0;position:absolute;"></iframe>';
+m.className="edui-"+c.options.theme;m.id=c.ui.id+"_iframeupload";q.style.cssText=l;q.style.width=e+"px";q.style.height=d+"px";q.appendChild(m);q.parentNode&&(q.parentNode.style.width=e+"px",q.parentNode.style.height=e+"px");var t=n.getElementById("edui_form_"+a),w=n.getElementById("edui_input_"+a),r=n.getElementById("edui_iframe_"+a);f.on(w,"change",function(){function a(){try{var d,g,k,h=(r.contentDocument||r.contentWindow.document).body;g=(new Function("return "+(h.innerText||h.textContent||"")))();
+d=c.options.imageUrlPrefix+g.url;"SUCCESS"==g.state&&g.url?(k=c.document.getElementById(e),k.setAttribute("src",d),k.setAttribute("_src",d),k.setAttribute("title",g.title||""),k.setAttribute("alt",g.original||""),k.removeAttribute("id"),f.removeClasses(k,"loadingclass")):b&&b(g.state)}catch(n){b&&b(c.getLang("simpleupload.loadError"))}t.reset();f.un(r,"load",a)}function b(a){if(e){var d=c.document.getElementById(e);d&&f.remove(d);c.fireEvent("showmessage",{id:e,content:a,type:"error",timeout:4E3})}}
+if(w.value){var e="loading_"+(+new Date).toString(36),d=p.serializeParam(c.queryCommandValue("serverparam"))||"",g=c.getActionUrl(c.getOpt("imageActionName")),k=c.getOpt("imageAllowFiles");c.focus();c.execCommand("inserthtml",'<img class="loadingclass" id="'+e+'" src="'+c.options.themePath+c.options.theme+'/images/spacer.gif" title="'+(c.getLang("simpleupload.loading")||"")+'" >');if(c.getOpt("imageActionName")){var h=w.value,h=h?h.substr(h.lastIndexOf(".")):"";!h||k&&-1==(k.join("")+".").indexOf(h.toLowerCase()+
+".")?b(c.getLang("simpleupload.exceedTypeError")):(f.on(r,"load",a),t.action=p.formatUrl(g+(-1==g.indexOf("?")?"?":"&")+d),t.submit())}else errorHandler(c.getLang("autoupload.errorLoadConfig"))}});var u;c.addListener("selectionchange",function(){clearTimeout(u);u=setTimeout(function(){-1==c.queryCommandState("simpleupload")?w.disabled="disabled":w.disabled=!1},400)});b=!0});g.style.cssText=l;a.appendChild(g)}var c=this,b=!1,a;return{bindEvents:{ready:function(){p.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(b,f){a=f;c.afterConfigReady(d)}},outputRule:function(a){p.each(a.getNodesByTagName("img"),
+function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},commands:{simpleupload:{queryCommandState:function(){return b?0:-1}}}}});UE.plugin.register("serverparam",function(){var d={};return{commands:{serverparam:{execCommand:function(c,b,a){void 0===b||null===b?d={}:p.isString(b)?void 0===a||null===a?delete d[b]:d[b]=a:p.isObject(b)?p.extend(d,b,!0):p.isFunction(b)&&p.extend(d,b(),!0)},queryCommandValue:function(){return d||{}}}}}});UE.plugin.register("insertfile",
+function(){var d=this;return{commands:{insertfile:{execCommand:function(c,b){b=p.isArray(b)?b:[b];var a,e,f,g,l="";a=d.getOpt("UEDITOR_HOME_URL");var k=a+("/"==a.substr(a.length-1)?"":"/")+"dialogs/attachment/fileTypeImages/";for(a=0;a<b.length;a++){e=b[a];f=k;g=e.url;g=g.substr(g.lastIndexOf(".")+1).toLowerCase();var m={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"};f+=m[g]?m[g]:m.txt;g=e.title||e.url.substr(e.url.lastIndexOf("/")+1);l+='<p style="line-height: 16px;"><img style="vertical-align: middle; margin-right: 2px;" src="'+
+f+'" _src="'+f+'" /><a style="font-size:12px; color:#0066cc;" href="'+e.url+'" title="'+g+'">'+g+"</a></p>"}d.execCommand("insertHtml",l)}}}}});s=s||{};s.editor=s.editor||{};UE.ui=s.editor.ui={};(function(){function d(){var a=document.getElementById("edui_fixedlayer");f.setViewportOffset(a,{left:0,top:0})}var c=s.editor.browser,b=s.editor.dom.domUtils,a=window.$EDITORUI={},e=0,f=s.editor.ui.uiUtils={uid:function(a){return a?a.ID$EDITORUI||(a.ID$EDITORUI=++e):++e},hook:function(a,b){var c;a&&a._callbacks?
+c=a:(c=function(){var b;a&&(b=a.apply(this,arguments));for(var e=c._callbacks,d=e.length;d--;){var f=e[d].apply(this,arguments);void 0===b&&(b=f)}return b},c._callbacks=[]);c._callbacks.push(b);return c},createElementByHtml:function(a){var b=document.createElement("div");b.innerHTML=a;b=b.firstChild;b.parentNode.removeChild(b);return b},getViewportElement:function(){return c.ie&&c.quirks?document.body:document.documentElement},getClientRect:function(a){var c;try{c=a.getBoundingClientRect()}catch(e){c=
+{left:0,top:0,height:0,width:0}}for(var d={left:Math.round(c.left),top:Math.round(c.top),height:Math.round(c.bottom-c.top),width:Math.round(c.right-c.left)},f;(f=a.ownerDocument)!==document&&(a=b.getWindow(f).frameElement);)c=a.getBoundingClientRect(),d.left+=c.left,d.top+=c.top;d.bottom=d.top+d.height;d.right=d.left+d.width;return d},getViewportRect:function(){var a=f.getViewportElement(),b=(window.innerWidth||a.clientWidth)|0,a=(window.innerHeight||a.clientHeight)|0;return{left:0,top:0,height:a,
+width:b,bottom:a,right:b}},setViewportOffset:function(a,c){var e=f.getFixedLayer();a.parentNode===e?(a.style.left=c.left+"px",a.style.top=c.top+"px"):b.setViewportOffset(a,c)},getEventOffset:function(a){var b=f.getClientRect(a.target||a.srcElement);a=f.getViewportOffsetByEvent(a);return{left:a.left-b.left,top:a.top-b.top}},getViewportOffsetByEvent:function(a){var c=a.target||a.srcElement,e=b.getWindow(c).frameElement;a={left:a.clientX,top:a.clientY};e&&c.ownerDocument!==document&&(c=f.getClientRect(e),
+a.left+=c.left,a.top+=c.top);return a},setGlobal:function(b,c){a[b]=c;return'$EDITORUI["'+b+'"]'},unsetGlobal:function(b){delete a[b]},copyAttributes:function(a,e){for(var d=e.attributes,f=d.length;f--;){var h=d[f];"style"==h.nodeName||"class"==h.nodeName||c.ie&&!h.specified||a.setAttribute(h.nodeName,h.nodeValue)}e.className&&b.addClass(a,e.className);e.style.cssText&&(a.style.cssText+=";"+e.style.cssText)},removeStyle:function(a,b){if(a.style.removeProperty)a.style.removeProperty(b);else if(a.style.removeAttribute)a.style.removeAttribute(b);
+else throw"";},contains:function(a,b){return a&&b&&(a===b?!1:a.contains?a.contains(b):a.compareDocumentPosition(b)&16)},startDrag:function(a,b,c){function e(a){b.ondragmove(a.clientX-d,a.clientY-f,a);a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}c=c||document;var d=a.clientX,f=a.clientY;if(c.addEventListener){var h=function(a){c.removeEventListener("mousemove",e,!0);c.removeEventListener("mouseup",h,!0);window.removeEventListener("mouseup",h,!0);b.ondragstop()};c.addEventListener("mousemove",
+e,!0);c.addEventListener("mouseup",h,!0);window.addEventListener("mouseup",h,!0);a.preventDefault()}else{var p=a.srcElement;p.setCapture();var r=function(){p.releaseCapture();p.detachEvent("onmousemove",e);p.detachEvent("onmouseup",r);p.detachEvent("onlosecaptrue",r);b.ondragstop()};p.attachEvent("onmousemove",e);p.attachEvent("onmouseup",r);p.attachEvent("onlosecaptrue",r);a.returnValue=!1}b.ondragstart()},getFixedLayer:function(){var a=document.getElementById("edui_fixedlayer");null==a&&(a=document.createElement("div"),
+a.id="edui_fixedlayer",document.body.appendChild(a),c.ie&&8>=c.version?(a.style.position="absolute",b.on(window,"scroll",d),b.on(window,"resize",s.editor.utils.defer(d,0,!0)),setTimeout(d)):a.style.position="fixed",a.style.left="0",a.style.top="0",a.style.width="0",a.style.height="0");return a},makeUnselectable:function(a){if(c.opera||c.ie&&9>c.version){if(a.unselectable="on",a.hasChildNodes())for(var b=0;b<a.childNodes.length;b++)1==a.childNodes[b].nodeType&&f.makeUnselectable(a.childNodes[b])}else void 0!==
+a.style.MozUserSelect?a.style.MozUserSelect="none":void 0!==a.style.WebkitUserSelect?a.style.WebkitUserSelect="none":void 0!==a.style.KhtmlUserSelect&&(a.style.KhtmlUserSelect="none")}}})();(function(){var d=s.editor.utils,c=s.editor.ui.uiUtils,b=s.editor.EventBase,a=s.editor.ui.UIBase=function(){};a.prototype={className:"",uiName:"",initOptions:function(a){for(var b in a)this[b]=a[b];this.id=this.id||"edui"+c.uid()},initUIBase:function(){this._globalKey=d.unhtml(c.setGlobal(this.id,this))},render:function(a){for(var b=
+this.renderHtml(),b=c.createElementByHtml(b),d=f.getElementsByTagName(b,"*"),l="edui-"+(this.theme||this.editor.options.theme),k=document.getElementById("edui_fixedlayer"),m=0,n;n=d[m++];)f.addClass(n,l);f.addClass(b,l);k&&(k.className="",f.addClass(k,l));d=this.getDom();null!=d?(d.parentNode.replaceChild(b,d),c.copyAttributes(b,d)):("string"==typeof a&&(a=document.getElementById(a)),a=a||c.getFixedLayer(),f.addClass(a,l),a.appendChild(b));this.postRender()},getDom:function(a){return a?document.getElementById(this.id+
+"_"+a):document.getElementById(this.id)},postRender:function(){this.fireEvent("postrender")},getHtmlTpl:function(){return""},formatHtml:function(a){var b="edui-"+this.uiName;return a.replace(/##/g,this.id).replace(/%%-/g,this.uiName?b+"-":"").replace(/%%/g,(this.uiName?b:"")+" "+this.className).replace(/\$\$/g,this._globalKey)},renderHtml:function(){return this.formatHtml(this.getHtmlTpl())},dispose:function(){var a=this.getDom();a&&s.editor.dom.domUtils.remove(a);c.unsetGlobal(this.id)}};d.inherits(a,
+b)})();(function(){var d=s.editor.utils,c=s.editor.ui.UIBase,b=s.editor.ui.Separator=function(a){this.initOptions(a);this.initSeparator()};b.prototype={uiName:"separator",initSeparator:function(){this.initUIBase()},getHtmlTpl:function(){return'<div id="##" class="edui-box %%"></div>'}};d.inherits(b,c)})();(function(){var d=s.editor.utils,c=s.editor.dom.domUtils,b=s.editor.ui.UIBase,a=s.editor.ui.uiUtils,e=s.editor.ui.Mask=function(a){this.initOptions(a);this.initUIBase()};e.prototype={getHtmlTpl:function(){return'<div id="##" class="edui-mask %%" onclick="return $$._onClick(event, this);" onmousedown="return $$._onMouseDown(event, this);"></div>'},
+postRender:function(){var a=this;c.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 b=this.getDom(),c=a.getViewportRect();b.style.width=
+c.width+"px";b.style.height=c.height+"px"}};d.inherits(e,b)})();(function(){function d(a,b){for(var c=0;c<g.length;c++){var e=g[c];if(!e.isHidden()&&!1!==e.queryAutoHide(b)){if(a&&/scroll/ig.test(a.type)&&"edui-wordpastepop"==e.className)return;e.hide()}}g.length&&e.editor.fireEvent("afterhidepop")}var c=s.editor.utils,b=s.editor.ui.uiUtils,a=s.editor.dom.domUtils,e=s.editor.ui.UIBase,f=s.editor.ui.Popup=function(a){this.initOptions(a);this.initPopup()},g=[];f.postHide=d;var l=["edui-anchor-topleft",
+"edui-anchor-topright","edui-anchor-bottomleft","edui-anchor-bottomright"];f.prototype={SHADOW_RADIUS:5,content:null,_hidden:!1,autoRender:!0,canSideLeft:!0,canSideUp:!0,initPopup:function(){this.initUIBase();g.push(this)},getHtmlTpl:function(){return'<div id="##" class="edui-popup %%" onmousedown="return false;"> <div id="##_body" class="edui-popup-body"> <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe> <div class="edui-shadow"></div> <div id="##_content" class="edui-popup-content">'+
+this.getContentHtmlTpl()+"  </div> </div></div>"},getContentHtmlTpl:function(){return this.content?"string"==typeof this.content?this.content:this.content.renderHtml():""},_UIBase_postRender:e.prototype.postRender,postRender:function(){this.content instanceof e&&this.content.postRender();if(this.captureWheel&&!this.captured){this.captured=!0;var c=(document.documentElement.clientHeight||document.body.clientHeight)-80,d=this.getDom().offsetHeight,f=b.getClientRect(this.combox.getDom()).top,g=this.getDom("content"),
+h=this.getDom("body").getElementsByTagName("iframe"),l=this;for(h.length&&(h=h[0]);f+d>c;)d-=30;g.style.height=d+"px";h&&(h.style.height=d+"px");if(window.XMLHttpRequest)a.on(g,"onmousewheel"in document.body?"mousewheel":"DOMMouseScroll",function(a){a.preventDefault?a.preventDefault():a.returnValue=!1;g.scrollTop=a.wheelDelta?g.scrollTop-a.wheelDelta/120*60:g.scrollTop-a.detail/-3*60});else a.on(this.getDom(),"mousewheel",function(a){a.returnValue=!1;l.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 b.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";a.style.height=b.height+"px";this.__size=b;this.captureWheel&&(this.getDom("content").style.overflow="auto");return b},showAnchor:function(a,c){this.showAnchorRect(b.getClientRect(a),c)},showAnchorRect:function(c,e,d){this._doAutoRender();var f=b.getViewportRect();this.getDom().style.visibility="hidden";this._show();d=this.fitSize();var g;e?(e=this.canSideLeft&&c.right+d.width>f.right&&c.left>d.width,f=this.canSideUp&&c.top+d.height>
+f.bottom&&c.bottom>d.height,g=e?c.left-d.width:c.right,c=f?c.bottom-d.height:c.top):(e=this.canSideLeft&&c.right+d.width>f.right&&c.left>d.width,f=this.canSideUp&&c.top+d.height>f.bottom&&c.bottom>d.height,g=e?c.right-d.width:c.left,c=f?c.top-d.height:c.bottom);d=this.getDom();b.setViewportOffset(d,{left:g,top:c});a.removeClasses(d,l);d.className+=" "+l[2*(f?1:0)+(e?1:0)];this.editor&&(d.style.zIndex=1*this.editor.container.style.zIndex+10,s.editor.ui.uiUtils.getFixedLayer().style.zIndex=d.style.zIndex-
+1);this.getDom().style.visibility="visible"},showAt:function(a){var b=a.left;a=a.top;this.showAnchorRect({left:b,top:a,right:b,bottom:a,height:0,width:0},!1,!0)},_show:function(){this._hidden&&(this.getDom().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||
+!b.contains(this.getDom(),a)}};c.inherits(f,e);a.on(document,"mousedown",function(a){d(a,a.target||a.srcElement)});a.on(window,"scroll",function(a,b){d(a,b)})})();(function(){var d=s.editor.utils,c=s.editor.ui.UIBase,b=s.editor.ui.ColorPicker=function(a){this.initOptions(a);this.noColorText=this.noColorText||this.editor.getLang("clearColor");this.initUIBase()};b.prototype={getHtmlTpl:function(){for(var b=this.editor,c='<div id="##" class="edui-colorpicker %%"><div class="edui-colorpicker-topbar edui-clearfix"><div unselectable="on" id="##_preview" class="edui-colorpicker-preview"></div><div unselectable="on" class="edui-colorpicker-nocolor" onclick="$$._onPickNoColor(event, this);">'+
+this.noColorText+'</div></div><table  class="edui-box" style="border-collapse: collapse;" onmouseover="$$._onTableOver(event, this);" onmouseout="$$._onTableOut(event, this);" onclick="return $$._onTableClick(event, this);" cellspacing="0" cellpadding="0"><tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;padding-top: 2px"><td colspan="10">'+b.getLang("themeColor")+'</td> </tr><tr class="edui-colorpicker-tablefirstrow" >',d=0;d<a.length;d++)d&&0===d%10&&(c+="</tr>"+
+(60==d?'<tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;"><td colspan="10">'+b.getLang("standardColor")+"</td></tr>":"")+"<tr"+(60==d?' class="edui-colorpicker-tablefirstrow"':"")+">"),c+=70>d?'<td style="padding: 0 2px;"><a hidefocus title="'+a[d]+'" onclick="return false;" href="javascript:" unselectable="on" class="edui-box edui-colorpicker-colorcell" data-color="#'+a[d]+'" style="background-color:#'+a[d]+";border:solid #ccc;"+(10>d||60<=d?"border-width:1px;":
+10<=d&&20>d?"border-width:1px 1px 0 1px;":"border-width:0 1px 0 1px;")+'"></a></td>':"";return c+"</tr></table></div>"},_onTableClick:function(a){(a=(a.target||a.srcElement).getAttribute("data-color"))&&this.fireEvent("pickcolor",a)},_onTableOver:function(a){if(a=(a.target||a.srcElement).getAttribute("data-color"))this.getDom("preview").style.backgroundColor=a},_onTableOut:function(){this.getDom("preview").style.backgroundColor=""},_onPickNoColor:function(){this.fireEvent("picknocolor")}};d.inherits(b,
+c);var a="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 d=s.editor.utils,c=s.editor.ui.uiUtils,b=s.editor.ui.UIBase,a=s.editor.ui.TablePicker=function(a){this.initOptions(a);this.initTablePicker()};a.prototype={defaultNumRows:10,defaultNumCols:10,maxNumRows:20,maxNumCols:20,numRows:10,numCols:10,lengthOfCellSide:22,initTablePicker:function(){this.initUIBase()},getHtmlTpl:function(){return'<div id="##" class="edui-tablepicker %%"><div class="edui-tablepicker-body"><div class="edui-infoarea"><span id="##_label" class="edui-label"></span></div><div class="edui-pickarea" onmousemove="$$._onMouseMove(event, this);" onmouseover="$$._onMouseOver(event, this);" onmouseout="$$._onMouseOut(event, this);" onclick="$$._onClick(event, this);"><div id="##_overlay" class="edui-overlay"></div></div></div></div>'},
+_UIBase_render:b.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";this.getDom("label").innerHTML=a+this.editor.getLang("t_col")+" x "+b+this.editor.getLang("t_row");this.numCols=a;this.numRows=b},_onMouseOver:function(a,b){var d=a.relatedTarget||a.fromElement;c.contains(b,d)||
+b===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,b){var d=a.relatedTarget||a.toElement;c.contains(b,d)||b===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,b){this.getDom("overlay");var d=c.getEventOffset(a),f=this.lengthOfCellSide,k=Math.ceil(d.left/
+f),d=Math.ceil(d.top/f);this._track(k,d)},_onClick:function(){this.fireEvent("picktable",this.numCols,this.numRows)}};d.inherits(a,b)})();(function(){var d=s.editor.dom.domUtils,c=s.editor.ui.uiUtils,b='onmousedown="$$.Stateful_onMouseDown(event, this);" onmouseup="$$.Stateful_onMouseUp(event, this);"'+(s.editor.browser.ie?' onmouseenter="$$.Stateful_onMouseEnter(event, this);" onmouseleave="$$.Stateful_onMouseLeave(event, this);"':' onmouseover="$$.Stateful_onMouseOver(event, this);" onmouseout="$$.Stateful_onMouseOut(event, this);"');
+s.editor.ui.Stateful={alwalysHoverable:!1,target:null,Stateful_init:function(){this._Stateful_dGetHtmlTpl=this.getHtmlTpl;this.getHtmlTpl=this.Stateful_getHtmlTpl},Stateful_getHtmlTpl:function(){return this._Stateful_dGetHtmlTpl().replace(/stateful/g,function(){return b})},Stateful_onMouseEnter:function(a,b){this.target=b;if(!this.isDisabled()||this.alwalysHoverable)this.addState("hover"),this.fireEvent("over")},Stateful_onMouseLeave:function(a,b){if(!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 d.hasClass(this.getStateDom(),"edui-state-"+a)},addState:function(a){this.hasState(a)||(this.getStateDom().className+=" edui-state-"+a)},removeState:function(a){this.hasState(a)&&d.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 d=s.editor.utils,c=s.editor.ui.UIBase,b=s.editor.ui.Stateful,a=s.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()};a.prototype={uiName:"button",label:"",title:"",
+showIcon:!0,showText:!0,cssRules:"",initButton:function(){this.initUIBase();this.Stateful_init();this.cssRules&&d.cssRule("edui-customize-"+this.name+"-style",this.cssRules)},getHtmlTpl:function(){return'<div id="##" class="edui-box %%"><div id="##_state" stateful><div class="%%-wrap"><div id="##_body" unselectable="on" '+(this.title?'title="'+this.title+'"':"")+' class="%%-body" onmousedown="return $$._onMouseDown(event, this);" onclick="return $$._onClick(event, this);">'+(this.showIcon?'<div class="edui-box edui-icon"></div>':
+"")+(this.showText?'<div class="edui-box edui-label">'+this.label+"</div>":"")+"</div></div></div></div>"},postRender:function(){this.Stateful_postRender();this.setDisabled(this.disabled)},_onMouseDown:function(a){a=(a=a.target||a.srcElement)&&a.tagName&&a.tagName.toLowerCase();if("input"==a||"object"==a||"object"==a)return!1},_onClick:function(){this.isDisabled()||this.fireEvent("click")},setTitle:function(a){this.getDom("label").innerHTML=a}};d.inherits(a,c);d.extend(a.prototype,b)})();(function(){var d=
+s.editor.utils,c=s.editor.ui.uiUtils,b=s.editor.ui.UIBase,a=s.editor.ui.Stateful,e=s.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:b.prototype.postRender,postRender:function(){this.Stateful_postRender();this._UIBase_postRender()},setPopup:function(a){this.popup!==
+a&&(null!=this.popup&&this.popup.dispose(),a.addListener("show",d.bind(this._onPopupShow,this)),a.addListener("hide",d.bind(this._onPopupHide,this)),a.addListener("postrender",d.bind(function(){a.getDom("body").appendChild(c.createElementByHtml('<div id="'+this.popup.id+'_bordereraser" class="edui-bordereraser edui-background" style="width:'+(c.getClientRect(this.getDom()).width+20)+'px"></div>'));a.getDom().className+=" "+this.className},this)),this.popup=a)},_onPopupShow:function(){this.addState("opened")},
+_onPopupHide:function(){this.removeState("opened")},getHtmlTpl:function(){return'<div id="##" class="edui-box %%"><div '+(this.title?'title="'+this.title+'"':"")+' id="##_state" stateful><div class="%%-body"><div id="##_button_body" class="edui-box edui-button-body" onclick="$$._onButtonClick(event, this);"><div class="edui-box edui-icon"></div></div><div class="edui-box edui-splitborder"></div><div class="edui-box edui-arrow" onclick="$$._onArrowClick();"></div></div></div></div>'},showPopup:function(){var a=
+c.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")}};d.inherits(e,b);d.extend(e.prototype,a,!0)})();(function(){var d=s.editor.utils,c=s.editor.ui.uiUtils,b=s.editor.ui.ColorPicker,a=s.editor.ui.Popup,e=s.editor.ui.SplitButton,f=s.editor.ui.ColorButton=function(a){this.initOptions(a);
+this.initColorButton()};f.prototype={initColorButton:function(){var c=this;this.popup=new a({content:new b({noColorText:c.editor.getLang("clearColor"),editor:c.editor,onpickcolor:function(a,b){c._onPickColor(b)},onpicknocolor:function(a,b){c._onPickNoColor(b)}}),editor:c.editor});this.initSplitButton()},_SplitButton_postRender:e.prototype.postRender,postRender:function(){this._SplitButton_postRender();this.getDom("button_body").appendChild(c.createElementByHtml('<div id="'+this.id+'_colorlump" class="edui-colorlump"></div>'));
+this.getDom().className+=" edui-colorbutton"},setColor:function(a){this.color=this.getDom("colorlump").style.backgroundColor=a},_onPickColor:function(a){!1!==this.fireEvent("pickcolor",a)&&(this.setColor(a),this.popup.hide())},_onPickNoColor:function(a){!1!==this.fireEvent("picknocolor")&&this.popup.hide()}};d.inherits(f,e)})();(function(){var d=s.editor.utils,c=s.editor.ui.Popup,b=s.editor.ui.TablePicker,a=s.editor.ui.SplitButton,e=s.editor.ui.TableButton=function(a){this.initOptions(a);this.initTableButton()};
+e.prototype={initTableButton:function(){var a=this;this.popup=new c({content:new b({editor:a.editor,onpicktable:function(b,c,d){a._onPickTable(c,d)}}),editor:a.editor});this.initSplitButton()},_onPickTable:function(a,b){!1!==this.fireEvent("picktable",a,b)&&this.popup.hide()}};d.inherits(e,a)})();(function(){var d=s.editor.utils,c=s.editor.ui.UIBase,b=s.editor.ui.AutoTypeSetPicker=function(a){this.initOptions(a);this.initAutoTypeSetPicker()};b.prototype={initAutoTypeSetPicker:function(){this.initUIBase()},
+getHtmlTpl:function(){var a=this.editor,b=a.options.autotypeset,c=a.getLang("autoTypeSet"),d="textAlignValue"+a.uid,f="imageBlockLineValue"+a.uid,k="symbolConverValue"+a.uid;return'<div id="##" class="edui-autotypesetpicker %%"><div class="edui-autotypesetpicker-body"><table ><tr><td nowrap><input type="checkbox" name="mergeEmptyline" '+(b.mergeEmptyline?"checked":"")+">"+c.mergeLine+'</td><td colspan="2"><input type="checkbox" name="removeEmptyline" '+(b.removeEmptyline?"checked":"")+">"+c.delLine+
+'</td></tr><tr><td nowrap><input type="checkbox" name="removeClass" '+(b.removeClass?"checked":"")+">"+c.removeFormat+'</td><td colspan="2"><input type="checkbox" name="indent" '+(b.indent?"checked":"")+">"+c.indent+'</td></tr><tr><td nowrap><input type="checkbox" name="textAlign" '+(b.textAlign?"checked":"")+">"+c.alignment+'</td><td colspan="2" id="'+d+'"><input type="radio" name="'+d+'" value="left" '+(b.textAlign&&"left"==b.textAlign?"checked":"")+">"+a.getLang("justifyleft")+'<input type="radio" name="'+
+d+'" value="center" '+(b.textAlign&&"center"==b.textAlign?"checked":"")+">"+a.getLang("justifycenter")+'<input type="radio" name="'+d+'" value="right" '+(b.textAlign&&"right"==b.textAlign?"checked":"")+">"+a.getLang("justifyright")+'</td></tr><tr><td nowrap><input type="checkbox" name="imageBlockLine" '+(b.imageBlockLine?"checked":"")+">"+c.imageFloat+'</td><td nowrap id="'+f+'"><input type="radio" name="'+f+'" value="none" '+(b.imageBlockLine&&"none"==b.imageBlockLine?"checked":"")+">"+a.getLang("default")+
+'<input type="radio" name="'+f+'" value="left" '+(b.imageBlockLine&&"left"==b.imageBlockLine?"checked":"")+">"+a.getLang("justifyleft")+'<input type="radio" name="'+f+'" value="center" '+(b.imageBlockLine&&"center"==b.imageBlockLine?"checked":"")+">"+a.getLang("justifycenter")+'<input type="radio" name="'+f+'" value="right" '+(b.imageBlockLine&&"right"==b.imageBlockLine?"checked":"")+">"+a.getLang("justifyright")+'</td></tr><tr><td nowrap><input type="checkbox" name="clearFontSize" '+(b.clearFontSize?
+"checked":"")+">"+c.removeFontsize+'</td><td colspan="2"><input type="checkbox" name="clearFontFamily" '+(b.clearFontFamily?"checked":"")+">"+c.removeFontFamily+'</td></tr><tr><td nowrap colspan="3"><input type="checkbox" name="removeEmptyNode" '+(b.removeEmptyNode?"checked":"")+">"+c.removeHtml+'</td></tr><tr><td nowrap colspan="3"><input type="checkbox" name="pasteFilter" '+(b.pasteFilter?"checked":"")+">"+c.pasteFilter+'</td></tr><tr><td nowrap><input type="checkbox" name="symbolConver" '+(b.bdc2sb||
+b.tobdc?"checked":"")+">"+c.symbol+'</td><td id="'+k+'"><input type="radio" name="bdc" value="bdc2sb" '+(b.bdc2sb?"checked":"")+">"+c.bdc2sb+'<input type="radio" name="bdc" value="tobdc" '+(b.tobdc?"checked":"")+">"+c.tobdc+'</td><td nowrap align="right"><button >'+c.run+"</button></td></tr></table></div></div>"},_UIBase_render:c.prototype.render};d.inherits(b,c)})();(function(){function d(a){for(var b={},d=a.getDom(),e=a.editor.uid,h=null,h=null,q=f.getElementsByTagName(d,"input"),t=q.length-1,p;p=
+q[t--];)if(h=p.getAttribute("type"),"checkbox"==h)if(h=p.getAttribute("name"),b[h]&&delete b[h],p.checked)if(p=document.getElementById(h+"Value"+e))if(/input/ig.test(p.tagName))b[h]=p.value;else{p=p.getElementsByTagName("input");for(var r=p.length-1,u;u=p[r--];)if(u.checked){b[h]=u.value;break}}else b[h]=!0;else b[h]=!1;else b[p.getAttribute("value")]=p.checked;d=f.getElementsByTagName(d,"select");for(t=0;e=d[t++];)q=e.getAttribute("name"),b[q]=b[q]?e.value:"";c.extend(a.editor.options.autotypeset,
+b);a.editor.setPreferences("autotypeset",b)}var c=s.editor.utils,b=s.editor.ui.Popup,a=s.editor.ui.AutoTypeSetPicker,e=s.editor.ui.SplitButton,h=s.editor.ui.AutoTypeSetButton=function(a){this.initOptions(a);this.initAutoTypeSetButton()};h.prototype={initAutoTypeSetButton:function(){var c=this;this.popup=new b({content:new a({editor:c.editor}),editor:c.editor,hide:function(){!this._hidden&&this.getDom()&&(d(this),this.getDom().style.display="none",this._hidden=!0,this.fireEvent("hide"))}});var e=0;
+this.popup.addListener("postRenderAfter",function(){var a=this;if(!e){var b=this.getDom();b.getElementsByTagName("button")[0].onclick=function(){d(a);c.editor.execCommand("autotypeset");a.hide()};f.on(b,"click",function(b){b=b.target||b.srcElement;var e=c.editor.uid;if(b&&"INPUT"==b.tagName){if("imageBlockLine"==b.name||"textAlign"==b.name||"symbolConver"==b.name)for(var f=b.checked,h=document.getElementById(b.name+"Value"+e).getElementsByTagName("input"),l={imageBlockLine:"none",textAlign:"left",
+symbolConver:"tobdc"},m=0;m<h.length;m++)f?h[m].value==l[b.name]&&(h[m].checked="checked"):h[m].checked=!1;(b.name=="imageBlockLineValue"+e||b.name=="textAlignValue"+e||"bdc"==b.name)&&(b=b.parentNode.previousSibling.getElementsByTagName("input"))&&(b[0].checked=!0);d(a)}});e=1}});this.initSplitButton()}};c.inherits(h,e)})();(function(){var d=s.editor.utils,c=s.editor.ui.Popup,b=s.editor.ui.Stateful,a=s.editor.ui.UIBase,e=s.editor.ui.CellAlignPicker=function(a){this.initOptions(a);this.initSelected();
+this.initCellAlignPicker()};e.prototype={initSelected:function(){var a={top:0,middle:1,bottom:2},b={left:0,center:1,right:2};this.selected&&(this.selectedIndex=3*a[this.selected.valign]+b[this.selected.align])},initCellAlignPicker:function(){this.initUIBase();this.Stateful_init()},getHtmlTpl:function(){for(var a=["left","center","right"],b=null,c=-1,d=[],e=0;9>e;e++)b=this.selectedIndex===e?' class="edui-cellalign-selected" ':"",c=e%3,0===c&&d.push("<tr>"),d.push('<td index="'+e+'" '+b+' stateful><div class="edui-icon edui-'+
+a[c]+'"></div></td>'),2===c&&d.push("</tr>");return'<div id="##" class="edui-cellalignpicker %%"><div class="edui-cellalignpicker-body"><table onclick="$$._onClick(event);">'+d.join("")+"</table></div></div>"},getStateDom:function(){return this.target},_onClick:function(a){var b=a.target||a.srcElement;/icon/.test(b.className)&&(this.items[b.parentNode.getAttribute("index")].onclick(),c.postHide(a))},_UIBase_render:a.prototype.render};d.inherits(e,a);d.extend(e.prototype,b,!0)})();(function(){var d=
+s.editor.utils,c=s.editor.ui.Stateful,b=s.editor.ui.uiUtils,a=s.editor.ui.UIBase,e=s.editor.ui.PastePicker=function(a){this.initOptions(a);this.initPastePicker()};e.prototype={initPastePicker:function(){this.initUIBase();this.Stateful_init()},getHtmlTpl:function(){return'<div class="edui-pasteicon" onclick="$$._onClick(this)"></div><div class="edui-pastecontainer"><div class="edui-title">'+this.editor.getLang("pasteOpt")+'</div><div class="edui-button"><div title="'+this.editor.getLang("pasteSourceFormat")+
+'" onclick="$$.format(false)" stateful><div class="edui-richtxticon"></div></div><div title="'+this.editor.getLang("tagFormat")+'" onclick="$$.format(2)" stateful><div class="edui-tagicon"></div></div><div title="'+this.editor.getLang("pasteTextFormat")+'" onclick="$$.format(true)" stateful><div class="edui-plaintxticon"></div></div></div></div></div>'},getStateDom:function(){return this.target},format:function(a){this.editor.ui._isTransfer=!0;this.editor.fireEvent("pasteTransfer",a)},_onClick:function(a){var c=
+f.getNextDomNode(a),d=b.getViewportRect().height,e=b.getClientRect(c);c.style.top=e.top+e.height>d?-e.height-a.offsetHeight+"px":"";/hidden/ig.test(f.getComputedStyle(c,"visibility"))?(c.style.visibility="visible",f.addClass(a,"edui-state-opened")):(c.style.visibility="hidden",f.removeClasses(a,"edui-state-opened"))},_UIBase_render:a.prototype.render};d.inherits(e,a);d.extend(e.prototype,c,!0)})();(function(){var d=s.editor.utils,c=s.editor.ui.uiUtils,b=s.editor.ui.UIBase,a=s.editor.ui.Toolbar=function(a){this.initOptions(a);
+this.initToolbar()};a.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<this.items.length;b++)a[b]=this.items[b].renderHtml();return'<div id="##" class="edui-toolbar %%" onselectstart="return false;" onmousedown="return $$._onMouseDown(event, this);">'+a.join("")+"</div>"},postRender:function(){for(var a=this.getDom(),b=0;b<this.items.length;b++)this.items[b].postRender();
+c.makeUnselectable(a)},_onMouseDown:function(a){a=(a=a.target||a.srcElement)&&a.tagName&&a.tagName.toLowerCase();if("input"==a||"object"==a||"object"==a)return!1}};d.inherits(a,b)})();(function(){var d=s.editor.utils,c=s.editor.dom.domUtils,b=s.editor.ui.uiUtils,a=s.editor.ui.UIBase,e=s.editor.ui.Popup,f=s.editor.ui.Stateful,g=s.editor.ui.CellAlignPicker,l=s.editor.ui.Menu=function(a){this.initOptions(a);this.initMenu()},k={renderHtml:function(){return'<div class="edui-menuitem edui-menuseparator"><div class="edui-menuseparator-inner"></div></div>'},
+postRender:function(){},queryAutoHide:function(){return!0}};l.prototype={items:null,uiName:"menu",initMenu:function(){this.items=this.items||[];this.initPopup();this.initItems()},initItems:function(){for(var a=0;a<this.items.length;a++){var b=this.items[a];"-"==b?this.items[a]=this.getSeparator():b instanceof m||(b.editor=this.editor,b.theme=this.editor.options.theme,this.items[a]=this.createItem(b))}},getSeparator:function(){return k},createItem:function(a){a.menu=this;return new m(a)},_Popup_getContentHtmlTpl:e.prototype.getContentHtmlTpl,
+getContentHtmlTpl:function(){if(0==this.items.length)return this._Popup_getContentHtmlTpl();for(var a=[],b=0;b<this.items.length;b++)a[b]=this.items[b].renderHtml();return'<div class="%%-body">'+a.join("")+"</div>"},_Popup_postRender:e.prototype.postRender,postRender:function(){for(var a=this,d=0;d<this.items.length;d++){var e=this.items[d];e.ownerMenu=this;e.postRender()}c.on(this.getDom(),"mouseover",function(c){c=c||event;c=c.relatedTarget||c.fromElement;var d=a.getDom();b.contains(d,c)||d===c||
+a.fireEvent("over")});this._Popup_postRender()},queryAutoHide:function(a){if(a){if(b.contains(this.getDom(),a))return!1;for(var c=0;c<this.items.length;c++)if(!1===this.items[c].queryAutoHide(a))return!1}},clearItems:function(){for(var a=0;a<this.items.length;a++){var b=this.items[a];clearTimeout(b._showingTimer);clearTimeout(b._closingTimer);b.subMenu&&b.subMenu.destroy()}this.items=[]},destroy:function(){this.getDom()&&c.remove(this.getDom());this.clearItems()},dispose:function(){this.destroy()}};
+d.inherits(l,e);var m=s.editor.ui.MenuItem=function(a){this.initOptions(a);this.initUIBase();this.Stateful_init();if(this.subMenu&&!(this.subMenu instanceof l))if(a.className&&-1!=a.className.indexOf("aligntd")){var b=this;this.subMenu.selected=this.editor.queryCommandValue("cellalignment");this.subMenu=new e({content:new g(this.subMenu),parentMenu:b,editor:b.editor,destroy:function(){this.getDom()&&c.remove(this.getDom())}});this.subMenu.addListener("postRenderAfter",function(){c.on(this.getDom(),
+"mouseover",function(){b.addState("opened")})})}else this.subMenu=new l(this.subMenu)};m.prototype={label:"",subMenu:null,ownerMenu:null,uiName:"menuitem",alwalysHoverable:!0,getHtmlTpl:function(){return'<div id="##" class="%%" stateful onclick="$$._onClick(event, this);"><div class="%%-body">'+this.renderLabelHtml()+"</div></div>"},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(c){return c&&b.contains(a.getDom(),c)?!1:this._bakQueryAutoHide(c)});
+this.getDom().style.tabIndex="-1";b.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'<div class="edui-arrow"></div><div class="edui-box edui-icon"></div><div class="edui-box edui-label %%-label">'+(this.label||"")+"</div>"},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")||!1!==this.fireEvent("click",a,b)&&(this.subMenu?this.showSubMenu():e.postHide(a))},
+showSubMenu:function(){var a=b.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()}};d.inherits(m,a);d.extend(m.prototype,f,!0)})();(function(){var d=s.editor.utils,c=s.editor.ui.uiUtils,b=s.editor.ui.Menu,a=s.editor.ui.SplitButton,e=s.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 c=0;c<this.items.length;c++){var d=this.items[c];d.uiName="listitem";d.index=c;d.onclick=function(){a.selectByIndex(this.index)}}this.popup=new b({items:this.items,uiName:"list",editor:this.editor,captureWheel:!0,combox:this});this.initSplitButton()},_SplitButton_postRender:a.prototype.postRender,postRender:function(){this._SplitButton_postRender();this.setLabel(this.label||"");this.setValue(this.initValue||"")},showPopup:function(){var a=c.getClientRect(this.getDom());
+a.top+=1;a.bottom-=1;a.height-=2;this.popup.showAnchorRect(a)},getValue:function(){return this.value},setValue:function(a){var b=this.indexByValue(a);-1!=b?(this.selectedIndex=b,this.setLabel(this.items[b].label),this.value=this.items[b].value):(this.selectedIndex=-1,this.setLabel(this.getLabelForUnknowValue(a)),this.value=a)},setLabel:function(a){this.label=this.getDom("button_body").innerHTML=a},getLabelForUnknowValue:function(a){return a},indexByValue:function(a){for(var b=0;b<this.items.length;b++)if(a==
+this.items[b].value)return b;return-1},getItem:function(a){return this.items[a]},selectByIndex:function(a){a<this.items.length&&!1!==this.fireEvent("select",a)&&(this.selectedIndex=a,this.value=this.items[a].value,this.setLabel(this.items[a].label))}};d.inherits(e,a)})();(function(){var d=s.editor.utils,c=s.editor.dom.domUtils,b=s.editor.ui.uiUtils,a=s.editor.ui.Mask,e=s.editor.ui.UIBase,f=s.editor.ui.Button,g=s.editor.ui.Dialog=function(a){if(a.name){var b=a.name,c=a.cssRules;a.className||(a.className=
+"edui-for-"+b);c&&(a.cssRules=".edui-default .edui-for-"+b+" .edui-dialog-content  {"+c+"}")}this.initOptions(d.extend({autoReset:!0,draggable:!0,onok:function(){},oncancel:function(){},onclose:function(a,b){return b?this.onok():this.oncancel()},holdScroll:!1},a));this.initDialog()},l,k,m;g.prototype={draggable:!1,uiName:"dialog",initDialog:function(){var b=this,c=this.editor.options.theme;this.cssRules&&d.cssRule("edui-customize-"+this.name+"-style",this.cssRules);this.initUIBase();this.modalMask=
+l||(l=new a({className:"edui-dialog-modalmask",theme:c,onclick:function(){m&&m.close(!1)}}));this.dragMask=k||(k=new a({className:"edui-dialog-dragmask",theme:c}));this.closeButton=new f({className:"edui-dialog-closebutton",title:b.closeDialog,theme:c,onclick:function(){b.close(!1)}});this.fullscreen&&this.initResizeEvent();if(this.buttons)for(c=0;c<this.buttons.length;c++)this.buttons[c]instanceof f||(this.buttons[c]=new f(d.extend(this.buttons[c],{editor:this.editor},!0)))},initResizeEvent:function(){var a=
+this;c.on(window,"resize",function(){a._hidden||void 0===a._hidden||(a.__resizeTimer&&window.clearTimeout(a.__resizeTimer),a.__resizeTimer=window.setTimeout(function(){a.__resizeTimer=null;var c=a.getDom(),d=a.getDom("content"),e=UE.ui.uiUtils.getClientRect(c),f=UE.ui.uiUtils.getClientRect(d),g=b.getViewportRect();d.style.width=g.width-e.width+f.width+"px";d.style.height=g.height-e.height+f.height+"px";c.style.width=g.width+"px";c.style.height=g.height+"px";a.fireEvent("resize")},100))})},fitSize:function(){var a=
+this.getDom("body"),b=this.mesureSize();a.style.width=b.width+"px";a.style.height=b.height+"px";return b},safeSetOffset:function(a){var c=this.getDom(),d=b.getViewportRect(),e=b.getClientRect(c),f=a.left;f+e.width>d.right&&(f=d.right-e.width);a=a.top;a+e.height>d.bottom&&(a=d.bottom-e.height);c.style.left=Math.max(f,0)+"px";c.style.top=Math.max(a,0)+"px"},showAtCenter:function(){var a=b.getViewportRect();if(this.fullscreen){var d=this.getDom(),e=this.getDom("content");d.style.display="block";var f=
+UE.ui.uiUtils.getClientRect(d),g=UE.ui.uiUtils.getClientRect(e);d.style.left="-100000px";e.style.width=a.width-f.width+g.width+"px";e.style.height=a.height-f.height+g.height+"px";d.style.width=a.width+"px";d.style.height=a.height+"px";d.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="",e=this.fitSize(),f=this.getDom("titlebar").offsetHeight|0,d=a.width/2-e.width/2,a=a.height/2-(e.height-f)/2-f,e=this.getDom(),this.safeSetOffset({left:Math.max(d|0,0),top:Math.max(a|0,0)}),c.hasClass(e,"edui-state-centered")||(e.className+=" edui-state-centered");this._show()},getContentHtml:function(){var a="";"string"==typeof this.content?
+a=this.content:this.iframeUrl&&(a='<span id="'+this.id+'_contmask" class="dialogcontmask"></span><iframe id="'+this.id+'_iframe" class="%%-iframe" height="100%" width="100%" frameborder="0" src="'+this.iframeUrl+'"></iframe>');return a},getHtmlTpl:function(){var a="";if(this.buttons){for(var a=[],b=0;b<this.buttons.length;b++)a[b]=this.buttons[b].renderHtml();a='<div class="%%-foot"><div id="##_buttons" class="%%-buttons">'+a.join("")+"</div></div>"}return'<div id="##" class="%%"><div '+(this.fullscreen?
+'class="%%-wrap edui-dialog-fullscreen-flag"':'class="%%"')+'><div id="##_body" class="%%-body"><div class="%%-shadow"></div><div id="##_titlebar" class="%%-titlebar"><div class="%%-draghandle" onmousedown="$$._onTitlebarMouseDown(event, this);"><span class="%%-caption">'+(this.title||"")+"</span></div>"+this.closeButton.renderHtml()+'</div><div id="##_content" class="%%-content">'+(this.autoReset?"":this.getContentHtml())+"</div>"+a+"</div></div></div>"},postRender:function(){this.modalMask.getDom()||
+(this.modalMask.render(),this.modalMask.hide());this.dragMask.getDom()||(this.dragMask.render(),this.dragMask.hide());var a=this;this.addListener("show",function(){a.modalMask.show(this.getDom().style.zIndex-2)});this.addListener("hide",function(){a.modalMask.hide()});if(this.buttons)for(var d=0;d<this.buttons.length;d++)this.buttons[d].postRender();c.on(window,"resize",function(){setTimeout(function(){a.isHidden()||a.safeSetOffset(b.getClientRect(a.getDom()))})});this._hide()},mesureSize:function(){var a=
+this.getDom("body"),c=b.getClientRect(this.getDom("content")).width;a.style.width=c;return b.getClientRect(a)},_onTitlebarMouseDown:function(a,d){if(this.draggable){var e;b.getViewportRect();var f=this;b.startDrag(a,{ondragstart:function(){e=b.getClientRect(f.getDom());f.getDom("contmask").style.visibility="visible";f.dragMask.show(f.getDom().style.zIndex-1)},ondragmove:function(a,b){f.safeSetOffset({left:e.left+a,top:e.top+b})},ondragstop:function(){f.getDom("contmask").style.visibility="hidden";
+c.removeClasses(f.getDom(),["edui-state-centered"]);f.dragMask.hide()}})}},reset:function(){this.getDom("content").innerHTML=this.getContentHtml();this.fireEvent("dialogafterreset")},_show:function(){this._hidden&&(this.getDom().style.display="",this.editor.container.style.zIndex&&(this.getDom().style.zIndex=1*this.editor.container.style.zIndex+10),this._hidden=!1,this.fireEvent("show"),s.editor.ui.uiUtils.getFixedLayer().style.zIndex=this.getDom().style.zIndex-4)},isHidden:function(){return this._hidden},
+_hide:function(){if(!this._hidden){var a=this.getDom();a.style.display="none";a.style.zIndex="";a.style.width="";a.style.height="";this._hidden=!0;this.fireEvent("hide")}},open:function(){if(this.autoReset)try{this.reset()}catch(a){this.render(),this.open()}this.showAtCenter();if(this.iframeUrl)try{this.getDom("iframe").focus()}catch(b){}m=this},_onCloseButtonClick:function(a,b){this.close(!1)},close:function(a){if(!1!==this.fireEvent("close",a)){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();a=this.getDom("content");var b=this.getDom("iframe");a&&b&&((b=b.contentDocument||b.contentWindow.document)&&(b.body.innerHTML=""),c.remove(a))}}};d.inherits(g,e)})();(function(){var d=s.editor.utils,c=s.editor.ui.Menu,
+b=s.editor.ui.SplitButton,a=s.editor.ui.MenuButton=function(a){this.initOptions(a);this.initMenuButton()};a.prototype={initMenuButton:function(){var a=this;this.uiName="menubutton";this.popup=new c({items:a.items,className:a.className,editor:a.editor});this.popup.addListener("show",function(){for(var b=0;b<this.items.length;b++)this.items[b].removeState("checked"),this.items[b].value==a._value&&(this.items[b].addState("checked"),this.value=a._value)});this.initSplitButton()},setValue:function(a){this._value=
+a}};d.inherits(a,b)})();(function(){var d=s.editor.utils,c=s.editor.ui.Popup,b=s.editor.ui.SplitButton,a=s.editor.ui.MultiMenuPop=function(a){this.initOptions(a);this.initMultiMenu()};a.prototype={initMultiMenu:function(){var a=this;this.popup=new c({content:"",editor:a.editor,iframe_rendered:!1,onshow:function(){this.iframe_rendered||(this.iframe_rendered=!0,this.getDom("content").innerHTML='<iframe id="'+a.id+'_iframe" src="'+a.iframeUrl+'" frameborder="0"></iframe>',a.editor.container.style.zIndex&&
+(this.getDom().style.zIndex=1*a.editor.container.style.zIndex+1))}});this.onbuttonclick=function(){this.showPopup()};this.initSplitButton()}};d.inherits(a,b)})();(function(){function d(a){if(!f.findParent(a.target||a.srcElement,function(a){return f.hasClass(a,"edui-shortcutmenu")||f.hasClass(a,"edui-popup")},!0)){a=0;for(var b;b=g[a++];)b.hide()}}var c=s.editor.ui,b=c.UIBase,a=c.uiUtils,e=s.editor.utils,f=s.editor.dom.domUtils,g=[],l,k=!1,m=c.ShortCutMenu=function(a){this.initOptions(a);this.initShortCutMenu()};
+m.postHide=d;m.prototype={isHidden:!0,SPACE:5,initShortCutMenu:function(){this.items=this.items||[];this.initUIBase();this.initItems();this.initEvent();g.push(this)},initEvent:function(){var a=this,b=a.editor.document;f.on(b,"mousemove",function(b){if(!1===a.isHidden&&!a.getSubMenuMark()&&"contextmenu"!=a.eventType){var c=!0,d=a.getDom(),e=d.offsetWidth/2+a.SPACE,f=d.offsetHeight/2,g=Math.abs(b.screenX-a.left),k=Math.abs(b.screenY-a.top);clearTimeout(l);l=setTimeout(function(){0<k&&k<f?a.setOpacity(d,
+"1"):k>f&&k<f+70?(a.setOpacity(d,"0.5"),c=!1):k>f+70&&k<f+140&&a.hide();c&&0<g&&g<e?a.setOpacity(d,"1"):g>e&&g<e+70?a.setOpacity(d,"0.5"):g>e+70&&g<e+140&&a.hide()})}});if(r.chrome)f.on(b,"mouseout",function(b){b=b.relatedTarget||b.toElement;null!=b&&"HTML"!=b.tagName||a.hide()});a.editor.addListener("afterhidepop",function(){a.isHidden||(k=!0)})},initItems:function(){if(e.isArray(this.items))for(var a=0,b=this.items.length;a<b;a++){var d=this.items[a].toLowerCase();c[d]&&(this.items[a]=new c[d](this.editor),
+this.items[a].className+=" edui-shortcutsubmenu ")}},setOpacity:function(a,b){r.ie&&9>r.version?a.style.filter="alpha(opacity = "+100*parseFloat(b)+");":a.style.opacity=b},getSubMenuMark:function(){k=!1;for(var b=a.getFixedLayer(),b=f.getElementsByTagName(b,"div",function(a){return f.hasClass(a,"edui-shortcutsubmenu edui-popup")}),c=0,d;d=b[c++];)"none"!=d.style.display&&(k=!0);return k},show:function(b,c){function d(a){0>a.left&&(a.left=0);0>a.top&&(a.top=0);k.style.cssText="position:absolute;left:"+
+a.left+"px;top:"+a.top+"px;"}function e(a){a.tagName||(a=a.getDom());g.left=parseInt(a.style.left);g.top=parseInt(a.style.top);g.top-=k.offsetHeight+15;d(g)}var g={},k=this.getDom(),l=a.getFixedLayer();this.eventType=b.type;k.style.cssText="display:block;left:-9999px";if("contextmenu"==b.type&&c){var m=f.getElementsByTagName(l,"div","edui-contextmenu")[0];m?e(m):this.editor.addListener("aftershowcontextmenu",function(a,b){e(b)})}else g=a.getViewportOffsetByEvent(b),g.top-=k.offsetHeight+this.SPACE,
+g.left+=this.SPACE+20,d(g),this.setOpacity(k,0.2);this.isHidden=!1;this.left=b.screenX+k.offsetWidth/2-this.SPACE;this.top=b.screenY-k.offsetHeight/2-this.SPACE;this.editor&&(k.style.zIndex=1*this.editor.container.style.zIndex+10,l.style.zIndex=k.style.zIndex-1)},hide:function(){this.getDom()&&(this.getDom().style.display="none");this.isHidden=!0},postRender:function(){if(e.isArray(this.items))for(var a=0,b;b=this.items[a++];)b.postRender()},getHtmlTpl:function(){var a;if(e.isArray(this.items)){a=
+[];for(var b=0;b<this.items.length;b++)a[b]=this.items[b].renderHtml();a=a.join("")}else a=this.items;return'<div id="##" class="%% edui-toolbar" data-src="shortcutmenu" onmousedown="return false;" onselectstart="return false;" >'+a+"</div>"}};e.inherits(m,b);f.on(document,"mousedown",function(a){d(a)});f.on(window,"scroll",function(a){d(a)})})();(function(){var d=s.editor.utils,c=s.editor.ui.UIBase,b=s.editor.ui.Breakline=function(a){this.initOptions(a);this.initSeparator()};b.prototype={uiName:"Breakline",
+initSeparator:function(){this.initUIBase()},getHtmlTpl:function(){return"<br/>"}};d.inherits(b,c)})();(function(){var d=s.editor.utils,c=s.editor.dom.domUtils,b=s.editor.ui.UIBase,a=s.editor.ui.Message=function(a){this.initOptions(a);this.initMessage()};a.prototype={initMessage:function(){this.initUIBase()},getHtmlTpl:function(){return'<div id="##" class="edui-message %%"> <div id="##_closer" class="edui-message-closer">\u00d7</div> <div id="##_body" class="edui-message-body edui-message-type-info"> <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe> <div class="edui-shadow"></div> <div id="##_content" class="edui-message-content">  </div> </div></div>'},
+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,b=this.getDom("closer");b&&c.on(b,"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))}};d.inherits(a,b)})();(function(){var d=s.editor.utils,c=s.editor.ui,b=c.Dialog;c.buttons={};c.Dialog=function(a){var c=new b(a);c.addListener("hide",function(){if(c.editor){var a=
+c.editor;try{if(r.gecko){var b=a.window.scrollY,d=a.window.scrollX;a.body.focus();a.window.scrollTo(d,b)}else a.focus()}catch(e){}}});return c};for(var a={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"},e="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".split(" "),
+f=0,g;g=e[f++];)g=g.toLowerCase(),c[g]=function(a){return function(b){var d=new c.Button({className:"edui-for-"+a,title:b.options.labelMap[a]||b.getLang("labelMap."+a)||"",onclick:function(){b.execCommand(a)},theme:b.options.theme,showText:!1});c.buttons[a]=d;b.addListener("selectionchange",function(c,e,f){c=b.queryCommandState(a);-1==c?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(c))});return d}}(g);c.cleardoc=function(a){var b=new c.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")}});c.buttons.cleardoc=b;a.addListener("selectionchange",function(){b.setDisabled(-1==a.queryCommandState("cleardoc"))});return b};var e={justify:["left","right","center","justify"],imagefloat:["none","left","center","right"],directionality:["ltr","rtl"]},l;for(l in e)(function(a,b){for(var d=0,e;e=b[d++];)(function(b){c[a.replace("float",
+"")+b]=function(d){var e=new c.Button({className:"edui-for-"+a.replace("float","")+b,title:d.options.labelMap[a.replace("float","")+b]||d.getLang("labelMap."+a.replace("float","")+b)||"",theme:d.options.theme,onclick:function(){d.execCommand(a,b)}});c.buttons[a]=e;d.addListener("selectionchange",function(c,f,g){e.setDisabled(-1==d.queryCommandState(a));e.setChecked(d.queryCommandValue(a)==b&&!g)});return e}})(e)})(l,e[l]);for(f=0;g=["backcolor","forecolor"][f++];)c[g]=function(a){return function(b){var d=
+new c.ColorButton({className:"edui-for-"+a,color:"default",title:b.options.labelMap[a]||b.getLang("labelMap."+a)||"",editor:b,onpickcolor:function(c,d){b.execCommand(a,d)},onpicknocolor:function(){b.execCommand(a,"default");this.setColor("transparent");this.color="default"},onbuttonclick:function(){b.execCommand(a,this.color)}});c.buttons[a]=d;b.addListener("selectionchange",function(){d.setDisabled(-1==b.queryCommandState(a))});return d}}(g);e={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".split(" ")};for(l in e)(function(b,e){for(var f=0,g;g=e[f++];)r.opera&&"searchreplace"===g||function(e){c[e]=function(f,g,h){g=g||(f.options.iframeUrlMap||{})[e]||a[e];h=f.options.labelMap[e]||f.getLang("labelMap."+e)||"";var l;g&&(l=new c.Dialog(d.extend({iframeUrl:f.ui.mapUrl(g),editor:f,className:"edui-for-"+e,title:h,holdScroll:"insertimage"===
+e,fullscreen:/charts|preview/.test(e),closeDialog:f.getLang("closeDialog")},"ok"==b?{buttons:[{className:"edui-okbutton",label:f.getLang("ok"),editor:f,onclick:function(){l.close(!0)}},{className:"edui-cancelbutton",label:f.getLang("cancel"),editor:f,onclick:function(){l.close(!1)}}]}:{})),f.ui._dialogs[e+"Dialog"]=l);var m=new c.Button({className:"edui-for-"+e,title:h,onclick:function(){if(l)switch(e){case "wordimage":var a=f.execCommand("wordimage");a&&a.length&&(l.render(),l.open());break;case "scrawl":-1!=
+f.queryCommandState("scrawl")&&(l.render(),l.open());break;default:l.render(),l.open()}},theme:f.options.theme,disabled:"scrawl"==e&&-1==f.queryCommandState("scrawl")||"charts"==e});c.buttons[e]=m;f.addListener("selectionchange",function(){if(!(e in{edittable:1})){var a=f.queryCommandState(e);m.getDom()&&(m.setDisabled(-1==a),m.setChecked(a))}});return m}}(g.toLowerCase())})(l,e[l]);c.snapscreen=function(b,d,e){e=b.options.labelMap.snapscreen||b.getLang("labelMap.snapscreen")||"";var f=new c.Button({className:"edui-for-snapscreen",
+title:e,onclick:function(){b.execCommand("snapscreen")},theme:b.options.theme});c.buttons.snapscreen=f;if(d=d||(b.options.iframeUrlMap||{}).snapscreen||a.snapscreen){var g=new c.Dialog({iframeUrl:b.ui.mapUrl(d),editor:b,className:"edui-for-snapscreen",title:e,buttons:[{className:"edui-okbutton",label:b.getLang("ok"),editor:b,onclick:function(){g.close(!0)}},{className:"edui-cancelbutton",label:b.getLang("cancel"),editor:b,onclick:function(){g.close(!1)}}]});g.render();b.ui._dialogs.snapscreenDialog=
+g}b.addListener("selectionchange",function(){f.setDisabled(-1==b.queryCommandState("snapscreen"))});return f};c.insertcode=function(a,b,e){b=a.options.insertcode||[];e=a.options.labelMap.insertcode||a.getLang("labelMap.insertcode")||"";var f=[];d.each(b,function(b,c){f.push({label:b,value:c,theme:a.options.theme,renderLabelHtml:function(){return'<div class="edui-label %%-label" >'+(this.label||"")+"</div>"}})});var g=new c.Combox({editor:a,items:f,onselect:function(b,c){a.execCommand("insertcode",
+this.items[c].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-insertcode",indexByValue:function(a){if(a)for(var b=0,c;c=this.items[b];b++)if(-1!=c.value.indexOf(a))return b;return-1}});c.buttons.insertcode=g;a.addListener("selectionchange",function(b,c,d){d||(-1==a.queryCommandState("insertcode")?g.setDisabled(!0):(g.setDisabled(!1),(b=a.queryCommandValue("insertcode"))?(b&&(b=b.replace(/['"]/g,"").split(",")[0]),g.setValue(b)):g.setValue(e)))});return g};
+c.fontfamily=function(a,b,e){b=a.options.fontfamily||[];e=a.options.labelMap.fontfamily||a.getLang("labelMap.fontfamily")||"";if(b.length){for(var f=0,g,h=[];g=b[f];f++){var l=a.getLang("fontfamily")[g.name]||"";(function(b,c){h.push({label:b,value:c,theme:a.options.theme,renderLabelHtml:function(){return'<div class="edui-label %%-label" style="font-family:'+d.unhtml(this.value)+'">'+(this.label||"")+"</div>"}})})(g.label||l,g.val)}var p=new c.Combox({editor:a,items:h,onselect:function(b,c){a.execCommand("FontFamily",
+this.items[c].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-fontfamily",indexByValue:function(a){if(a)for(var b=0,c;c=this.items[b];b++)if(-1!=c.value.indexOf(a))return b;return-1}});c.buttons.fontfamily=p;a.addListener("selectionchange",function(b,c,d){d||(-1==a.queryCommandState("FontFamily")?p.setDisabled(!0):(p.setDisabled(!1),(b=a.queryCommandValue("FontFamily"))&&(b=b.replace(/['"]/g,"").split(",")[0]),p.setValue(b)))});return p}};c.fontsize=function(a,
+b,d){d=a.options.labelMap.fontsize||a.getLang("labelMap.fontsize")||"";b=b||a.options.fontsize||[];if(b.length){for(var e=[],f=0;f<b.length;f++){var g=b[f]+"px";e.push({label:g,value:g,theme:a.options.theme,renderLabelHtml:function(){return'<div class="edui-label %%-label" style="line-height:1;font-size:'+this.value+'">'+(this.label||"")+"</div>"}})}var h=new c.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"});c.buttons.fontsize=h;a.addListener("selectionchange",function(b,c,d){d||(-1==a.queryCommandState("FontSize")?h.setDisabled(!0):(h.setDisabled(!1),h.setValue(a.queryCommandValue("FontSize"))))});return h}};c.paragraph=function(a,b,e){e=a.options.labelMap.paragraph||a.getLang("labelMap.paragraph")||"";b=a.options.paragraph||[];if(!d.isEmptyObject(b)){var f=[],g;for(g in b)f.push({value:g,label:b[g]||a.getLang("paragraph")[g],theme:a.options.theme,renderLabelHtml:function(){return'<div class="edui-label %%-label"><span class="edui-for-'+
+this.value+'">'+(this.label||"")+"</span></div>"}});var h=new c.Combox({editor:a,items:f,title:e,initValue:e,className:"edui-for-paragraph",onselect:function(b,c){a.execCommand("Paragraph",this.items[c].value)},onbuttonclick:function(){this.showPopup()}});c.buttons.paragraph=h;a.addListener("selectionchange",function(b,c,d){d||(-1==a.queryCommandState("Paragraph")?h.setDisabled(!0):(h.setDisabled(!1),b=a.queryCommandValue("Paragraph"),-1!=h.indexByValue(b)?h.setValue(b):h.setValue(h.initValue)))});
+return h}};c.customstyle=function(a){var b=a.options.customstyle||[],d=a.options.labelMap.customstyle||a.getLang("labelMap.customstyle")||"";if(b.length){for(var e=a.getLang("customstyle"),f=0,g=[],h;h=b[f++];)(function(b){var c={};c.label=b.label?b.label:e[b.name];c.style=b.style;c.className=b.className;c.tag=b.tag;g.push({label:c.label,value:c,theme:a.options.theme,renderLabelHtml:function(){return'<div class="edui-label %%-label"><'+c.tag+" "+(c.className?' class="'+c.className+'"':"")+(c.style?
+' style="'+c.style+'"':"")+">"+c.label+"</"+c.tag+"></div>"}})})(h);var l=new c.Combox({editor:a,items:g,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=0,c;c=this.items[b++];)if(c.label==a)return b-1;return-1}});c.buttons.customstyle=l;a.addListener("selectionchange",function(b,c,d){d||(-1==a.queryCommandState("customstyle")?l.setDisabled(!0):
+(l.setDisabled(!1),b=a.queryCommandValue("customstyle"),-1!=l.indexByValue(b)?l.setValue(b):l.setValue(l.initValue)))});return l}};c.inserttable=function(a,b,d){d=a.options.labelMap.inserttable||a.getLang("labelMap.inserttable")||"";var e=new c.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()}});c.buttons.inserttable=e;a.addListener("selectionchange",function(){e.setDisabled(-1==
+a.queryCommandState("inserttable"))});return e};c.lineheight=function(a){var b=a.options.lineheight||[];if(b.length){for(var d=0,e,f=[];e=b[d++];)f.push({label:e,value:e,theme:a.options.theme,onclick:function(){a.execCommand("lineheight",this.value)}});var g=new c.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)}});c.buttons.lineheight=g;a.addListener("selectionchange",function(){var b=a.queryCommandState("LineHeight");if(-1==b)g.setDisabled(!0);else{g.setDisabled(!1);var c=a.queryCommandValue("LineHeight");c&&g.setValue((c+"").replace(/cm/,""));g.setChecked(b)}});return g}};l=["top","bottom"];for(e=0;f=l[e++];)(function(a){c["rowspacing"+a]=function(b){var d=b.options["rowspacing"+a]||[];if(!d.length)return null;for(var e=0,f,g=[];f=d[e++];)g.push({label:f,value:f,theme:b.options.theme,onclick:function(){b.execCommand("rowspacing",
+this.value,a)}});var h=new c.MenuButton({editor:b,className:"edui-for-rowspacing"+a,title:b.options.labelMap["rowspacing"+a]||b.getLang("labelMap.rowspacing"+a)||"",items:g,onbuttonclick:function(){var c=b.queryCommandValue("rowspacing",a)||this.value;b.execCommand("rowspacing",c,a)}});c.buttons[a]=h;b.addListener("selectionchange",function(){var c=b.queryCommandState("rowspacing",a);if(-1==c)h.setDisabled(!0);else{h.setDisabled(!1);var d=b.queryCommandValue("rowspacing",a);d&&h.setValue((d+"").replace(/%/,
+""));h.setChecked(c)}});return h}})(f);l=["insertorderedlist","insertunorderedlist"];for(e=0;f=l[e++];)(function(a){c[a]=function(b){var d=b.options[a],e=function(){b.execCommand(a,this.value)},f=[],g;for(g in d)f.push({label:d[g]||b.getLang()[a][g]||"",value:g,theme:b.options.theme,onclick:e});var h=new c.MenuButton({editor:b,className:"edui-for-"+a,title:b.getLang("labelMap."+a)||"",items:f,onbuttonclick:function(){var c=b.queryCommandValue(a)||this.value;b.execCommand(a,c)}});c.buttons[a]=h;b.addListener("selectionchange",
+function(){var c=b.queryCommandState(a);if(-1==c)h.setDisabled(!0);else{h.setDisabled(!1);var d=b.queryCommandValue(a);h.setValue(d);h.setChecked(c)}});return h}})(f);c.fullscreen=function(a,b){b=a.options.labelMap.fullscreen||a.getLang("labelMap.fullscreen")||"";var d=new c.Button({className:"edui-for-fullscreen",title:b,theme:a.options.theme,onclick:function(){a.ui&&a.ui.setFullScreen(!a.ui.isFullScreen());this.setChecked(a.ui.isFullScreen())}});c.buttons.fullscreen=d;a.addListener("selectionchange",
+function(){var b=a.queryCommandState("fullscreen");d.setDisabled(-1==b);d.setChecked(a.ui.isFullScreen())});return d};c.emotion=function(b,d){var e=new c.MultiMenuPop({title:b.options.labelMap.emotion||b.getLang("labelMap.emotion")||"",editor:b,className:"edui-for-emotion",iframeUrl:b.ui.mapUrl(d||(b.options.iframeUrlMap||{}).emotion||a.emotion)});c.buttons.emotion=e;b.addListener("selectionchange",function(){e.setDisabled(-1==b.queryCommandState("emotion"))});return e};c.autotypeset=function(a){var b=
+new c.AutoTypeSetButton({editor:a,title:a.options.labelMap.autotypeset||a.getLang("labelMap.autotypeset")||"",className:"edui-for-autotypeset",onbuttonclick:function(){a.execCommand("autotypeset")}});c.buttons.autotypeset=b;a.addListener("selectionchange",function(){b.setDisabled(-1==a.queryCommandState("autotypeset"))});return b};c.simpleupload=function(a){var b=new c.Button({className:"edui-for-simpleupload",title:a.options.labelMap.simpleupload||a.getLang("labelMap.simpleupload")||"",onclick:function(){},
+theme:a.options.theme,showText:!1});c.buttons.simpleupload=b;a.addListener("ready",function(){var c=b.getDom("body").children[0];a.fireEvent("simpleuploadbtnready",c)});a.addListener("selectionchange",function(c,d,e){c=a.queryCommandState("simpleupload");-1==c?(b.setDisabled(!0),b.setChecked(!1)):e||(b.setDisabled(!1),b.setChecked(c))});return b}})();(function(){function d(a){this.initOptions(a);this.initEditorUI()}var c=s.editor.utils,b=s.editor.ui.uiUtils,a=s.editor.ui.UIBase,e=s.editor.dom.domUtils,
+f=[];d.prototype={uiName:"editor",initEditorUI:function(){function a(b,c){b.setOpt({wordCount:!0,maximumWords:1E4,wordCountMsg:b.options.wordCountMsg||b.getLang("wordCountMsg"),wordOverFlowMsg:b.options.wordOverFlowMsg||b.getLang("wordOverFlowMsg")});var d=b.options,e=d.maximumWords,f=d.wordCountMsg,g=d.wordOverFlowMsg,h=c.getDom("wordcount");d.wordCount&&(d=b.getContentLength(!0),d>e?(h.innerHTML=g,b.fireEvent("wordcountoverflow")):h.innerHTML=f.replace("{#leave}",e-d).replace("{#count}",d))}this.editor.ui=
+this;this._dialogs={};this.initUIBase();this._initToolbars();var b=this.editor,c=this;b.addListener("ready",function(){b.getDialog=function(a){return b.ui._dialogs[a+"Dialog"]};e.on(b.window,"scroll",function(a){s.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='<div class="edui-editor-breadcrumb">'+
+b.getLang("elementPathTip")+":</div>");b.options.wordCount&&(e.on(b.document,"click",function(){a(b,c);e.un(b.document,"click",arguments.callee)}),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){s.editor.ui.Popup.postHide(b,b.target||b.srcElement);s.editor.ui.ShortCutMenu.postHide(b)});b.addListener("delcells",function(){UE.ui.edittip&&new UE.ui.edittip(b);b.getDialog("edittip").open()});var d,f=!1,g;b.addListener("afterpaste",function(){b.queryCommandState("pasteplain")||(s.editor.ui.PastePicker&&(d=new s.editor.ui.Popup({content:new s.editor.ui.PastePicker({editor:b}),editor:b,
+className:"edui-wordpastepop"}),d.render()),f=!0)});b.addListener("afterinserthtml",function(){clearTimeout(g);g=setTimeout(function(){if(d&&(f||b.ui._isTransfer)){if(d.isHidden()){var a=e.createElement(b.document,"span",{style:"line-height:0px;",innerHTML:"\ufeff"});b.selection.getRange().insertNode(a);var c=X(a,"firstChild","previousSibling");c&&d.showAnchor(3==c.nodeType?c.parentNode:c);e.remove(a)}else d.show();delete b.ui._isTransfer;f=!1}},200)});b.addListener("contextmenu",function(a,b){s.editor.ui.Popup.postHide(b)});
+b.addListener("keydown",function(a,b){d&&d.dispose(b);var c=b.keyCode||b.which;if(b.altKey&&90==c)UE.ui.buttons.fullscreen.onclick()});b.addListener("wordcount",function(b){a(this,c)});b.addListener("selectionchange",function(){if(b.options.elementPathEnabled)c[(-1==b.queryCommandState("elementpath")?"dis":"en")+"ableElementPath"]();if(b.options.scaleEnabled)c[(-1==b.queryCommandState("scale")?"dis":"en")+"ableScale"]()});var h=new s.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()):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:s.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/ig.test(d.tagName)){var e=h.formatHtml("<nobr>"+b.getLang("property")+': <span onclick=$$._setIframeAlign(-2) class="edui-clickable">'+b.getLang("default")+'</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(-1) class="edui-clickable">'+b.getLang("justifyleft")+'</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(1) class="edui-clickable">'+b.getLang("justifyright")+'</span>&nbsp;&nbsp; <span onclick="$$._updateIframe( this);" class="edui-clickable">'+
+b.getLang("modify")+"</span></nobr>");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(),f=b.ui._dialogs;if(g&&"IMG"==g.tagName){var l="insertimageDialog";if(-1!=g.className.indexOf("edui-faked-video")||-1!=g.className.indexOf("edui-upload-video"))l="insertvideoDialog";-1!=g.className.indexOf("edui-faked-webapp")&&(l="webappDialog");-1!=g.src.indexOf("http://api.map.baidu.com")&&
+(l="mapDialog");-1!=g.className.indexOf("edui-faked-music")&&(l="musicDialog");-1!=g.src.indexOf("http://maps.google.com/maps/api/staticmap")&&(l="gmapDialog");g.getAttribute("anchorname")&&(l="anchorDialog",d=h.formatHtml("<nobr>"+b.getLang("property")+': <span onclick=$$._onImgEditButtonClick("anchorDialog") class="edui-clickable">'+b.getLang("modify")+"</span>&nbsp;&nbsp;<span onclick=$$._onRemoveButtonClick('anchor') class=\"edui-clickable\">"+b.getLang("delete")+"</span></nobr>"));g.getAttribute("word_img")&&
+(b.word_img=[g.getAttribute("word_img")],l="wordimageDialog");if(e.hasClass(g,"loadingclass")||e.hasClass(g,"loaderrorclass"))l="";if(!f[l])return;f="<nobr>"+b.getLang("property")+': <span onclick=$$._onImgSetFloat("none") class="edui-clickable">'+b.getLang("default")+'</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("left") class="edui-clickable">'+b.getLang("justifyleft")+'</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("right") class="edui-clickable">'+b.getLang("justifyright")+'</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("center") class="edui-clickable">'+
+b.getLang("justifycenter")+"</span>&nbsp;&nbsp;<span onclick=\"$$._onImgEditButtonClick('"+l+'\');" class="edui-clickable">'+b.getLang("modify")+"</span></nobr>";!d&&(d=h.formatHtml(f))}if(b.ui._dialogs.linkDialog){var m=b.queryCommandValue("link"),n;m&&(n=m.getAttribute("_href")||m.getAttribute("href",2))&&(f=n,30<n.length&&(f=n.substring(0,20)+"..."),d&&(d+='<div style="height:5px;"></div>'),d+=h.formatHtml("<nobr>"+b.getLang("anthorMsg")+': <a target="_blank" href="'+n+'" title="'+n+'" >'+f+'</a> <span class="edui-clickable" onclick="$$._onEditButtonClick();">'+
+b.getLang("modify")+'</span> <span class="edui-clickable" onclick="$$._onRemoveButtonClick(\'unlink\');"> '+b.getLang("clear")+"</span></nobr>"),h.showAnchor(m))}d?(h.getDom("content").innerHTML=d,h.anchorEl=g||m,h.showAnchor(h.anchorEl)):h.hide()}}))},_initToolbars:function(){for(var a=this.editor,b=this.toolbars||[],d=[],e=0;e<b.length;e++){for(var f=b[e],g=new s.editor.ui.Toolbar({theme:a.options.theme}),h=0;h<f.length;h++){var p=f[h],r=null;if("string"==typeof p){if(p=p.toLowerCase(),"|"==p&&
+(p="Separator"),"||"==p&&(p="Breakline"),s.editor.ui[p]&&(r=new s.editor.ui[p](a)),"fullscreen"==p){d&&d[0]?d[0].items.splice(0,0,r):r&&g.items.splice(0,0,r);continue}}else r=p;r&&r.id&&g.add(r)}d[e]=g}c.each(UE._customizeUI,function(b,c){var d,e;if(b.id&&b.id!=a.key)return!1;if(d=b.execFn.call(a,a,c))e=b.index,void 0===e&&(e=g.items.length),g.add(d,e)});this.toolbars=d},getHtmlTpl:function(){return'<div id="##" class="%%"><div id="##_toolbarbox" class="%%-toolbarbox">'+(this.toolbars.length?'<div id="##_toolbarboxouter" class="%%-toolbarboxouter"><div class="%%-toolbarboxinner">'+
+this.renderToolbarBoxHtml()+"</div></div>":"")+'<div id="##_toolbarmsg" class="%%-toolbarmsg" style="display:none;"><div id = "##_upload_dialog" class="%%-toolbarmsg-upload" onclick="$$.showWordImageDialog();">'+this.editor.getLang("clickToUpload")+'</div><div class="%%-toolbarmsg-close" onclick="$$.hideToolbarMsg();">x</div><div id="##_toolbarmsg_label" class="%%-toolbarmsg-label"></div><div style="height:0;overflow:hidden;clear:both;"></div></div><div id="##_message_holder" class="%%-messageholder"></div></div><div id="##_iframeholder" class="%%-iframeholder"></div><div id="##_bottombar" class="%%-bottomContainer"><table><tr><td id="##_elementpath" class="%%-bottombar"></td><td id="##_wordcount" class="%%-wordcount"></td><td id="##_scale" class="%%-scale"><div class="%%-icon"></div></td></tr></table></div><div id="##_scalelayer"></div></div>'},
+showWordImageDialog:function(){this._dialogs.wordimageDialog.open()},renderToolbarBoxHtml:function(){for(var a=[],b=0;b<this.toolbars.length;b++)a.push(this.toolbars[b].renderHtml());return a.join("")},setFullScreen:function(a){var b=this.editor,c=b.container.parentNode.parentNode;if(this._fullscreen!=a){this._fullscreen=a;this.editor.fireEvent("beforefullscreenchange",a);if(s.editor.browser.gecko)var d=b.selection.getRange().createBookmark();if(a){for(;"BODY"!=c.tagName;){var e=s.editor.dom.domUtils.getComputedStyle(c,
+"position");f.push(e);c.style.position="static";c=c.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=b.iframe.parentNode.offsetWidth;this._bakAutoHeight&&(b.autoHeightEnabled=!1,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;b.iframe.parentNode.style.width="";this._updateFullScreen()}else{for(;"BODY"!=c.tagName;)c.style.position=f.shift(),c=c.parentNode;this.getDom().style.cssText=this._bakCssText;this.getDom("iframeholder").style.cssText=this._bakCssText1;this._bakAutoHeight&&(b.autoHeightEnabled=!0,this.editor.enableAutoHeight());document.documentElement.style.overflow=this._bakHtmlOverflow;
+document.body.style.overflow=this._bakBodyOverflow;b.iframe.parentNode.style.width=this._bakEditorContaninerWidth+"px";window.scrollTo(0,this._bakScrollTop)}if(r.gecko&&"true"===b.body.contentEditable){var g=document.createElement("input");document.body.appendChild(g);b.body.contentEditable=!1;setTimeout(function(){g.focus();setTimeout(function(){b.body.contentEditable=!0;b.fireEvent("fullscreenchanged",a);b.selection.getRange().moveToBookmark(d).select(!0);s.editor.dom.domUtils.remove(g);a&&window.scroll(0,
+0)},0)},0)}"true"===b.body.contentEditable&&(this.editor.fireEvent("fullscreenchanged",a),this.triggerLayout())}},_updateFullScreen:function(){if(this._fullscreen){var a=b.getViewportRect();this.getDom().style.cssText="border:0;position:absolute;left:0;top:"+(this.editor.options.topOffset||0)+"px;width:"+a.width+"px;height:"+a.height+"px;z-index:"+(1*this.getDom().style.zIndex+100);b.setViewportOffset(this.getDom(),{left:0,top:this.editor.options.topOffset||0});this.editor.setHeight(a.height-this.getDom("toolbarbox").offsetHeight-
+this.getDom("bottombar").offsetHeight-(this.editor.options.topOffset||0),!0);if(r.gecko)try{window.onresize()}catch(c){}}},_updateElementPath:function(){var a=this.getDom("elementpath"),b;if(this.elementPathEnabled&&(b=this.editor.queryCommandValue("elementpath"))){for(var c=[],d=0,e;e=b[d];d++)c[d]=this.formatHtml('<span unselectable="on" onclick="$$.editor.execCommand(&quot;elementpath&quot;, &quot;'+d+'&quot;);">'+e+"</span>");a.innerHTML='<div class="edui-editor-breadcrumb" onmousedown="return false;">'+
+this.editor.getLang("elementPathTip")+": "+c.join(" &gt; ")+"</div>"}else a.style.display="none"},disableElementPath:function(){var a=this.getDom("elementpath");a.innerHTML="";a.style.display="none";this.elementPathEnabled=!1},enableElementPath:function(){this.getDom("elementpath").style.display="";this.elementPathEnabled=!0;this._updateElementPath()},_scale:function(){function a(){I=e.getXY(h);L||(L=g.options.minFrameHeight+s.offsetHeight+v.offsetHeight);G.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(p,"mouseup",c);e.on(f,"mouseup",c)}function b(a){d();a=a||window.event;T=a.pageX||f.documentElement.scrollLeft+a.clientX;z=a.pageY||f.documentElement.scrollTop+a.clientY;H=T-I.x;D=z-I.y;H>=P&&(A=!0,G.style.width=H+"px");D>=L&&(A=!0,G.style.height=D+"px")}function c(){A&&(A=!1,g.ui._actualFrameWidth=G.offsetWidth-2,h.style.width=g.ui._actualFrameWidth+"px",g.setHeight(G.offsetHeight-v.offsetHeight-
+s.offsetHeight-2,!0));G&&(G.style.display="none");d();e.un(f,"mousemove",b);e.un(p,"mouseup",c);e.un(f,"mouseup",c)}function d(){r.ie?f.selection.clear():window.getSelection().removeAllRanges()}var f=document,g=this.editor,h=g.container,p=g.document,s=this.getDom("toolbarbox"),v=this.getDom("bottombar"),E=this.getDom("scale"),G=this.getDom("scalelayer"),A=!1,I=null,L=0,P=g.options.minFrameWidth,T=0,z=0,H=0,D=0,B=this;this.editor.addListener("fullscreenchanged",function(a,b){if(b)B.disableScale();
+else if(B.editor.options.scaleEnabled){B.enableScale();var c=B.editor.document.createElement("span");B.editor.body.appendChild(c);B.editor.body.style.height=Math.max(e.getXY(c).y,B.editor.iframe.offsetHeight-20)+"px";e.remove(c)}});this.enableScale=function(){1!=g.queryCommandState("source")&&(E.style.display="",this.scaleEnabled=!0,e.on(E,"mousedown",a))};this.disableScale=function(){E.style.display="none";this.scaleEnabled=!1;e.un(E,"mousedown",a)}},isFullScreen:function(){return this._fullscreen},
+postRender:function(){a.prototype.postRender.call(this);for(var b=0;b<this.toolbars.length;b++)this.toolbars[b].postRender();var c=this,d,e=s.editor.dom.domUtils,f=function(){clearTimeout(d);d=setTimeout(function(){c._updateFullScreen()})};e.on(window,"resize",f);c.addListener("destroy",function(){e.un(window,"resize",f);clearTimeout(d)})},showToolbarMsg:function(a,b){this.getDom("toolbarmsg_label").innerHTML=a;this.getDom("toolbarmsg").style.display="";b||(this.getDom("upload_dialog").style.display=
+"none")},hideToolbarMsg:function(){this.getDom("toolbarmsg").style.display="none"},mapUrl:function(a){return a?a.replace("~/",this.editor.options.UEDITOR_HOME_URL||""):""},triggerLayout:function(){var a=this.getDom();a.style.zoom="1"==a.style.zoom?"100%":"1"}};c.inherits(d,s.editor.ui.UIBase);var g={};UE.ui.Editor=function(a){var b=new UE.Editor(a);b.options.editor=b;c.loadFile(document,{href:b.options.themePath+b.options.theme+"/css/ueditor.css",tag:"link",type:"text/css",rel:"stylesheet"});var f=
+b.render;b.render=function(a){a.constructor===String&&(b.key=a,g[a]=b);c.domReady(function(){function c(){b.setOpt({labelMap:b.options.labelMap||b.getLang("labelMap")});new d(b.options);if(a&&(a.constructor===String&&(a=document.getElementById(a)),a&&a.getAttribute("name")&&(b.options.textarea=a.getAttribute("name")),a&&/script|textarea/ig.test(a.tagName))){var g=document.createElement("div");a.parentNode.insertBefore(g,a);var h=a.value||a.innerHTML;b.options.initialContent=/^[\t\r\n ]*$/.test(h)?
+b.options.initialContent:h.replace(/>[\n\r\t]+([ ]{4})+/g,">").replace(/[\n\r\t]+([ ]{4})+</g,"<").replace(/>[\n\r\t]+</g,"><");a.className&&(g.className=a.className);a.style.cssText&&(g.style.cssText=a.style.cssText);/textarea/i.test(a.tagName)?(b.textarea=a,b.textarea.style.display="none"):a.parentNode.removeChild(a);a.id&&(g.id=a.id,e.removeAttributes(a,"id"));a=g;a.innerHTML=""}e.addClass(a,"edui-"+b.options.theme);b.ui.render(a);g=b.options;b.container=b.ui.getDom();for(var h=e.findParents(a,
+!0),l=[],p=0,q;q=h[p];p++)l[p]=q.style.display,q.style.display="block";g.initialFrameWidth?g.minFrameWidth=g.initialFrameWidth:(g.minFrameWidth=g.initialFrameWidth=a.offsetWidth,p=a.style.width,/%$/.test(p)&&(g.initialFrameWidth=p));g.initialFrameHeight?g.minFrameHeight=g.initialFrameHeight:g.initialFrameHeight=g.minFrameHeight=a.offsetHeight;for(p=0;q=h[p];p++)q.style.display=l[p];a.style.height&&(a.style.height="");b.container.style.width=g.initialFrameWidth+(/%$/.test(g.initialFrameWidth)?"":"px");
+b.container.style.zIndex=g.zIndex;f.call(b,b.ui.getDom("iframeholder"));b.fireEvent("afteruiready")}b.langIsReady?c():b.addListener("langReady",c)})};return b};UE.getEditor=function(a,b){var c=g[a];c||(c=g[a]=new UE.ui.Editor(b),c.render(a));return c};UE.delEditor=function(a){var b;if(b=g[a])b.key&&b.destroy(),delete g[a]};UE.registerUI=function(a,b,d,e){c.each(a.split(/\s+/),function(a){UE._customizeUI[a]={id:e,execFn:b,index:d}})}})();UE.registerUI("message",function(d){function c(){var b=f.ui.getDom("toolbarbox");
+b&&(a.style.top=b.offsetHeight+3+"px");a.style.zIndex=Math.max(f.options.zIndex,f.iframe.style.zIndex)+1}var b=s.editor.ui.Message,a,e=[],f=d;f.addListener("ready",function(){a=document.getElementById(f.ui.id+"_message_holder");c();setTimeout(function(){c()},500)});f.addListener("showmessage",function(d,l){l=p.isString(l)?{content:l}:l;var k=new b({timeout:l.timeout,type:l.type,content:l.content,keepshow:l.keepshow,editor:f}),m=l.id||"msg_"+(+new Date).toString(36);k.render(a);e[m]=k;k.reset(l);c();
+return m});f.addListener("updatemessage",function(b,c,d){d=p.isString(d)?{content:d}:d;b=e[c];b.render(a);b&&b.reset(d)});f.addListener("hidemessage",function(a,b){var c=e[b];c&&c.hide()})});UE.registerUI("autosave",function(d){var c=null,b=null;d.on("afterautosave",function(){clearTimeout(c);c=setTimeout(function(){b&&d.trigger("hidemessage",b);b=d.trigger("showmessage",{content:d.getLang("autosave.success"),timeout:2E3})},2E3)})})})();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.config.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.config.js
new file mode 100644
index 0000000..be8aab7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.config.js
@@ -0,0 +1,413 @@
+/**
+ * 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', 'help', 'drafts'
+        ]]
+        //当鼠标放在工具栏上时显示的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' //给编辑器内部引入一个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(' &nbsp; &nbsp;'),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 : true
+
+        //wordCount
+        //,wordCount:true          //是否开启字数统计
+        //,maximumWords:10000       //允许的最大字符数
+        //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数,留空支持多语言自动切换,否则按此配置显示
+        //,wordCountMsg:''   //当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符
+        //超出字数限制提示  留空支持多语言自动切换,否则按此配置显示
+        //,wordOverFlowMsg:''    //<span style="color:red;">你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存!</span>
+
+        //tab
+        //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位
+        //,tabSize:4
+        //,tabNode:'&nbsp;'
+
+        //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
+
+        //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
+
+        //,disabledTableInTable: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',
+        //}
+
+        //webAppKey 百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能,注册介绍,http://app.baidu.com/static/cms/getapikey.html
+        //, webAppKey: ""
+    };
+
+    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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.parse.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.parse.js
new file mode 100644
index 0000000..09393ab
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.parse.js
@@ -0,0 +1,1022 @@
+/*!
+ * UEditor
+ * version: ueditor
+ * build: Thu May 29 2014 16:47:49 GMT+0800 (中国标准时间)
+ */
+
+(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(' ') + ' ></'+obj.tag+'>');
+                        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 = '&nbsp;';
+
+                }
+            })
+        });
+
+        //表格可排序
+        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/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.parse.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.parse.min.js
new file mode 100644
index 0000000..1888454
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/1.4.3/ueditor.parse.min.js
@@ -0,0 +1,28 @@
+(function(){(function(){UE=window.UE||{};var f=!!window.ActiveXObject,h={removeLastbs:function(a){return a.replace(/\/$/,"")},extend:function(a,d){for(var b=arguments,c=this.isBoolean(b[b.length-1])?b[b.length-1]:!1,e=this.isBoolean(b[b.length-1])?b.length-1:b.length,k=1;k<e;k++){var n=b[k],l;for(l in n)c&&a.hasOwnProperty(l)||(a[l]=n[l])}return a},isIE:f,cssRule:f?function(a,d,b){var c;b=b||document;c=b.indexList?b.indexList:b.indexList={};var e;if(c[a])e=b.styleSheets[c[a]];else{if(void 0===d)return"";
+e=b.createStyleSheet("",b=b.styleSheets.length);c[a]=b}if(void 0===d)return e.cssText;e.cssText=e.cssText+"\n"+(d||"")}:function(a,d,b){b=b||document;var c=b.getElementsByTagName("head")[0],e;if(!(e=b.getElementById(a))){if(void 0===d)return"";e=b.createElement("style");e.id=a;c.appendChild(e)}if(void 0===d)return e.innerHTML;""!==d?e.innerHTML=e.innerHTML+"\n"+d:c.removeChild(e)},domReady:function(a){var d=window.document;"complete"===d.readyState?a():f?(function(){if(!d.isReady){try{d.documentElement.doScroll("left")}catch(b){setTimeout(arguments.callee,
+0);return}a()}}(),window.attachEvent("onload",function(){a()})):(d.addEventListener("DOMContentLoaded",function(){d.removeEventListener("DOMContentLoaded",arguments.callee,!1);a()},!1),window.addEventListener("load",function(){a()},!1))},each:function(a,d,b){if(null!=a)if(a.length===+a.length)for(var c=0,e=a.length;c<e;c++){if(!1===d.call(b,a[c],c,a))return!1}else for(c in a)if(a.hasOwnProperty(c)&&!1===d.call(b,a[c],c,a))return!1},inArray:function(a,d){var b=-1;this.each(a,function(a,e){if(a===d)return b=
+e,!1});return b},pushItem:function(a,d){-1==this.inArray(a,d)&&a.push(d)},trim:function(a){return a.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g,"")},indexOf:function(a,d,b){var c=-1;b=this.isNumber(b)?b:0;this.each(a,function(a,k){if(k>=b&&a===d)return c=k,!1});return c},hasClass:function(a,d){d=d.replace(/(^[ ]+)|([ ]+$)/g,"").replace(/[ ]{2,}/g," ").split(" ");for(var b=0,c,e=a.className;c=d[b++];)if(!RegExp("\\b"+c+"\\b","i").test(e))return!1;return b-1==d.length},addClass:function(a,d){if(a){d=this.trim(d).replace(/[ ]{2,}/g,
+" ").split(" ");for(var b=0,c,e=a.className;c=d[b++];)RegExp("\\b"+c+"\\b").test(e)||(e+=" "+c);a.className=h.trim(e)}},removeClass:function(a,d){d=this.isArray(d)?d:this.trim(d).replace(/[ ]{2,}/g," ").split(" ");for(var b=0,c,e=a.className;c=d[b++];)e=e.replace(RegExp("\\b"+c+"\\b"),"");e=this.trim(e).replace(/[ ]{2,}/g," ");a.className=e;!e&&a.removeAttribute("className")},on:function(a,d,b){var c=this.isArray(d)?d:d.split(/\s+/),e=c.length;if(e)for(;e--;)if(d=c[e],a.addEventListener)a.addEventListener(d,
+b,!1);else{b._d||(b._d={els:[]});var k=d+b.toString(),n=h.indexOf(b._d.els,a);b._d[k]&&-1!=n||(-1==n&&b._d.els.push(a),b._d[k]||(b._d[k]=function(a){return b.call(a.srcElement,a||window.event)}),a.attachEvent("on"+d,b._d[k]))}a=null},off:function(a,d,b){var c=this.isArray(d)?d:d.split(/\s+/),e=c.length;if(e)for(;e--;)if(d=c[e],a.removeEventListener)a.removeEventListener(d,b,!1);else{var k=d+b.toString();try{a.detachEvent("on"+d,b._d?b._d[k]:b)}catch(n){}b._d&&b._d[k]&&(d=h.indexOf(b._d.els,a),-1!=
+d&&b._d.els.splice(d,1),0==b._d.els.length&&delete b._d[k])}},loadFile:function(){function a(a,c){try{for(var e=0,k;k=d[e++];)if(k.doc===a&&k.url==(c.src||c.href))return k}catch(n){return null}}var d=[];return function(b,c,e){var k=a(b,c);if(k)k.ready?e&&e():k.funs.push(e);else if(d.push({doc:b,url:c.src||c.href,funs:[e]}),!b.body){e=[];for(var n in c)"tag"!=n&&e.push(n+'="'+c[n]+'"');b.write("<"+c.tag+" "+e.join(" ")+" ></"+c.tag+">")}else if(!c.id||!b.getElementById(c.id)){var l=b.createElement(c.tag);
+delete c.tag;for(n in c)l.setAttribute(n,c[n]);l.onload=l.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){k=a(b,c);if(0<k.funs.length){k.ready=1;for(var d;d=k.funs.pop();)d()}l.onload=l.onreadystatechange=null}};l.onerror=function(){throw Error("The load "+(c.href||c.src)+" fails,check the url");};b.getElementsByTagName("head")[0].appendChild(l)}}}()};h.each("String Function Array Number RegExp Object Boolean".split(" "),function(a){h["is"+a]=function(d){return Object.prototype.toString.apply(d)==
+"[object "+a+"]"}});var g={};UE.parse={register:function(a,d){g[a]=d},load:function(a){h.each(g,function(d){d.call(a,h)})}};uParse=function(a,d){h.domReady(function(){var b;document.querySelectorAll?b=document.querySelectorAll(a):/^#/.test(a)?b=[document.getElementById(a.replace(/^#/,""))]:/^\./.test(a)?(b=[],h.each(document.getElementsByTagName("*"),function(d){d.className&&RegExp("\\b"+a.replace(/^\./,"")+"\\b","i").test(d.className)&&b.push(d)})):b=document.getElementsByTagName(a);h.each(b,function(b){UE.parse.load(h.extend({root:b,
+selector:a},d))})})}})();UE.parse.register("insertcode",function(f){var h=this.root.getElementsByTagName("pre");if(h.length)if("undefined"==typeof XRegExp){var g,a;void 0!==this.rootPath?(g=f.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCore.js",a=f.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCoreDefault.css"):(g=this.highlightJsUrl,a=this.highlightCssUrl);f.loadFile(document,{id:"syntaxhighlighter_css",tag:"link",rel:"stylesheet",type:"text/css",href:a});f.loadFile(document,
+{id:"syntaxhighlighter_js",src:g,tag:"script",type:"text/javascript",defer:"defer"},function(){f.each(h,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})})}else f.each(h,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})});UE.parse.register("table",function(f){var h=this,g=this.root,a=g.getElementsByTagName("table");if(a.length){a=this.selector;f.cssRule("table",a+" table.noBorderTable td,"+a+" table.noBorderTable th,"+a+" table.noBorderTable caption{border:1px dashed #ddd !important}"+
+a+" table.sortEnabled tr.firstRow th,"+a+" 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);}"+a+" table.sortEnabled tr.firstRow th:hover,"+a+" table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}"+a+" table{margin-bottom:10px;border-collapse:collapse;display:table;}"+a+" td,"+a+" th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}"+
+a+" caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}"+a+" th{border-top:1px solid #BBB;background:#F7F7F7;}"+a+" table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}"+a+" tr.ue-table-interlace-color-single td{ background: #fcfcfc; }"+a+" tr.ue-table-interlace-color-double td{ background: #f7faff; }"+a+" td p{margin:0;padding:0;}",document);f.each(["td","th","caption"],function(a){a=g.getElementsByTagName(a);a.length&&f.each(a,function(a){a.firstChild||
+(a.innerHTML="&nbsp;")})});a=g.getElementsByTagName("table");f.each(a,function(a){if(/\bsortEnabled\b/.test(a.className))f.on(a,"click",function(a){a=a.target||a.srcElement;var c=d(a,["td","th"]);a=d(a,"table");var c=f.indexOf(a.rows[0].cells,c),l=a.getAttribute("data-sort-type");if(-1!=c&&(b(a,c,h.tableSortCompareFn||l),!f.hasClass(a.rows[0],"firstRow"))){for(c=1;c<a.rows.length;c++)f.removeClass(a.rows[c],"firstRow");f.addClass(a.rows[0],"firstRow")}})});var d=function(a,c){var d,b=a;for(c=f.isArray(c)?
+c:[c];b;){for(d=0;d<c.length;d++)if(b.tagName==c[d].toUpperCase())return b;b=b.parentNode}return null},b=function(a,d,b){for(var l=a.rows,q=[],g="TH"===l[0].cells[0].tagName,h=0,s=l.length;h<s;h++)q[h]=l[h];var r={reversecurrent:function(a,b){return 1},orderbyasc:function(a,b){return(a.innerText||a.textContent).localeCompare(b.innerText||b.textContent)},reversebyasc:function(a,b){return b.innerHTML.localeCompare(a.innerHTML)},orderbynum:function(a,b){var d=a[f.isIE?"innerText":"textContent"].match(/\d+/),
+c=b[f.isIE?"innerText":"textContent"].match(/\d+/);d&&(d=+d[0]);c&&(c=+c[0]);return(d||0)-(c||0)},reversebynum:function(a,b){var d=a[f.isIE?"innerText":"textContent"].match(/\d+/),c=b[f.isIE?"innerText":"textContent"].match(/\d+/);d&&(d=+d[0]);c&&(c=+c[0]);return(c||0)-(d||0)}};a.setAttribute("data-sort-type",b&&"string"===typeof b&&r[b]?b:"");g&&q.splice(0,1);q=c(q,function(a,c){return b&&"function"===typeof b?b.call(this,a.cells[d],c.cells[d]):b&&"number"===typeof b?1:b&&"string"===typeof b&&r[b]?
+r[b].call(this,a.cells[d],c.cells[d]):r.orderbyasc.call(this,a.cells[d],c.cells[d])});l=a.ownerDocument.createDocumentFragment();g=0;for(s=q.length;g<s;g++)l.appendChild(q[g]);a.getElementsByTagName("tbody")[0].appendChild(l)},c=function(a,b){b=b||function(a,b){return a.localeCompare(b)};for(var c=0,d=a.length;c<d;c++)for(var f=c,g=a.length;f<g;f++)if(0<b(a[c],a[f])){var h=a[c];a[c]=a[f];a[f]=h}return a}}});UE.parse.register("charts",function(f){function h(a){var b=[];a=a.getElementsByTagName("table");
+for(var c=0,d;d=a[c];c++)null!==d.getAttribute("data-chart")&&b.push(g(d));return b.length?b:null}function g(a){for(var b=a.getAttribute("data-chart"),c={},d=[],f=0,e;e=a.rows[f];f++){for(var g=[],h=0,k;k=e.cells[h];h++){var m=k.innerText||k.textContent||"";g.push("TH"==k.tagName?m:m|0)}d.push(g)}b=b.split(";");for(f=0;e=b[f];f++)e=e.split(":"),c[e[0]]=e[1];return{table:a,meta:c,data:d}}function a(){window.jQuery?d():f.loadFile(document,{src:c+"/third-party/jquery-1.10.2.min.js",tag:"script",type:"text/javascript",
+defer:"defer"},function(){d()})}function d(){window.Highcharts?b():f.loadFile(document,{src:c+"/third-party/highcharts/highcharts.js",tag:"script",type:"text/javascript",defer:"defer"},function(){b()})}function b(){f.loadFile(document,{src:c+"/dialogs/charts/chart.config.js",tag:"script",type:"text/javascript",defer:"defer"},function(){for(var a=null,b=null,c=null,d=0,f=k.length;d<f;d++){var a=k[d],b=[],e=[],c=[],g=a.data,h=a.meta;if("1"!=h.dataFormat){for(var p=0,e=g.length;p<e;p++)for(var m=0,t=
+g[p].length;m<t;m++)c[m]||(c[m]=[]),c[m][p]=g[p][m];g=c}c={};if(h.chartType!=typeConfig.length-1){e=g[0].slice(1);p=1;for(m=void 0;m=g[p];p++)b.push({name:m[0],data:m.slice(1)});c.series=b;c.categories=e;c.title=h.title;c.subTitle=h.subTitle;c.xTitle=h.xTitle;c.yTitle=h.yTitle}else{m=[];p=1;for(e=g[0].length;p<e;p++)m.push([g[0][p],g[1][p]|0]);b[0]={type:"pie",name:h.tip,data:m};c.series=b;c.title=h.title}c.suffix=h.suffix;b=c;c=a.table;g=document.createElement("div");g.className="edui-chart-container";
+c.parentNode.replaceChild(g,c);c=g;a=typeConfig[a.meta.chartType];$(c).highcharts($.extend({},a,{credits:{enabled:!1},exporting:{enabled:!1},title:{text:b.title,x:-20},subtitle:{text:b.subTitle,x:-20},xAxis:{title:{text:b.xTitle},categories:b.categories},yAxis:{title:{text:b.yTitle},plotLines:[{value:0,width:1,color:"#808080"}]},tooltip:{enabled:!0,valueSuffix:b.suffix},legend:{layout:"vertical",align:"right",verticalAlign:"middle",borderWidth:1},series:b.series}))}})}f.cssRule("chartsContainerHeight",
+".edui-chart-container { height:"+(this.chartContainerHeight||300)+"px}");var c=this.rootPath,e=this.root,k=null;c&&(e=e?h(e):null,(k=e)&&a())});UE.parse.register("background",function(f){for(var h=this.root.getElementsByTagName("p"),g,a=0,d;d=h[a++];)(g=d.getAttribute("data-background"))&&d.parentNode.removeChild(d);g&&f.cssRule("ueditor_background",this.selector+"{"+g+"}",document)});UE.parse.register("list",function(f){function h(b){var d=this;f.each(b,function(b){if(b.className&&/custom_/i.test(b.className)){var e=
+b.className.match(/custom_(\w+)/)[1];if("dash"==e||"dot"==e)f.pushItem(g,c+" li.list-"+a[e]+"{background-image:url("+d.liiconpath+a[e]+".gif)}"),f.pushItem(g,c+" ul.custom_"+e+"{list-style:none;} "+c+" ul.custom_"+e+" li{background-position:0 3px;background-repeat:no-repeat}");else{var h=1;f.each(b.childNodes,function(b){"LI"==b.tagName&&(f.pushItem(g,c+" li.list-"+a[e]+h+"{background-image:url("+d.liiconpath+"list-"+a[e]+h+".gif)}"),h++)});f.pushItem(g,c+" ol.custom_"+e+"{list-style:none;}"+c+" ol.custom_"+
+e+" li{background-position:0 3px;background-repeat:no-repeat}")}switch(e){case "cn":f.pushItem(g,c+" li.list-"+e+"-paddingleft-1{padding-left:25px}");f.pushItem(g,c+" li.list-"+e+"-paddingleft-2{padding-left:40px}");f.pushItem(g,c+" li.list-"+e+"-paddingleft-3{padding-left:55px}");break;case "cn1":f.pushItem(g,c+" li.list-"+e+"-paddingleft-1{padding-left:30px}");f.pushItem(g,c+" li.list-"+e+"-paddingleft-2{padding-left:40px}");f.pushItem(g,c+" li.list-"+e+"-paddingleft-3{padding-left:55px}");break;
+case "cn2":f.pushItem(g,c+" li.list-"+e+"-paddingleft-1{padding-left:40px}");f.pushItem(g,c+" li.list-"+e+"-paddingleft-2{padding-left:55px}");f.pushItem(g,c+" li.list-"+e+"-paddingleft-3{padding-left:68px}");break;case "num":case "num1":f.pushItem(g,c+" li.list-"+e+"-paddingleft-1{padding-left:25px}");break;case "num2":f.pushItem(g,c+" li.list-"+e+"-paddingleft-1{padding-left:35px}");f.pushItem(g,c+" li.list-"+e+"-paddingleft-2{padding-left:40px}");break;case "dash":f.pushItem(g,c+" li.list-"+e+
+"-paddingleft{padding-left:35px}");break;case "dot":f.pushItem(g,c+" li.list-"+e+"-paddingleft{padding-left:20px}")}}})}var g=[],a={cn:"cn-1-",cn1:"cn-2-",cn2:"cn-3-",num:"num-1-",num1:"num-2-",num2:"num-3-",dash:"dash",dot:"dot"};f.extend(this,{liiconpath:"http://bs.baidu.com/listicon/",listDefaultPaddingLeft:"20"});var d=this.root,b=d.getElementsByTagName("ol"),d=d.getElementsByTagName("ul"),c=this.selector;b.length&&h.call(this,b);d.length&&h.call(this,d);if(b.length||d.length)g.push(c+" .list-paddingleft-1{padding-left:0}"),
+g.push(c+" .list-paddingleft-2{padding-left:"+this.listDefaultPaddingLeft+"px}"),g.push(c+" .list-paddingleft-3{padding-left:"+2*this.listDefaultPaddingLeft+"px}"),f.cssRule("list",c+" ol,"+c+" ul{margin:0;padding:0;}li{clear:both;}"+g.join("\n"),document)});UE.parse.register("vedio",function(f){var h=this.root.getElementsByTagName("video"),g=this.root.getElementsByTagName("audio");document.createElement("video");document.createElement("audio");if(h.length||g.length){var h=f.removeLastbs(this.rootPath),
+g=h+"/third-party/video-js/video.js",a=h+"/third-party/video-js/video-js.min.css",d=h+"/third-party/video-js/video-js.swf";window.videojs?videojs.autoSetup():(f.loadFile(document,{id:"video_css",tag:"link",rel:"stylesheet",type:"text/css",href:a}),f.loadFile(document,{id:"video_js",src:g,tag:"script",type:"text/javascript"},function(){videojs.options.flash.swf=d;videojs.autoSetup()}))}})})();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/anchor/anchor.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/anchor/anchor.html
new file mode 100644
index 0000000..f277847
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/anchor/anchor.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+    "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+        <title></title>
+        <style type="text/css">
+            *{color: #838383;margin: 0;padding: 0}
+            html,body {font-size: 12px;overflow: hidden; }
+            .content{padding:5px 0 0 15px;}
+            input{width:210px;height:21px;line-height:21px;margin-left: 4px;}
+        </style>
+    </head>
+    <body>
+        <div class="content">
+            <span><var id="lang_input_anchorName"></var></span><input id="anchorName"  value="" />
+        </div>
+        <script type="text/javascript" src="../internal.js"></script>
+        <script type="text/javascript">
+            var anchorInput = $G('anchorName'),
+                node = editor.selection.getRange().getClosedNode();
+            if(node && node.tagName == 'IMG' && (node = node.getAttribute('anchorname'))){
+                anchorInput.value = node;
+            }
+            anchorInput.onkeydown = function(evt){
+                evt = evt || window.event;
+                if(evt.keyCode == 13){
+                    editor.execCommand('anchor', anchorInput.value);
+                    dialog.close();
+                    domUtils.preventDefault(evt)
+                }
+            };
+            dialog.onok = function (){
+                editor.execCommand('anchor', anchorInput.value);
+                dialog.close();
+            };
+            $focus(anchorInput);
+        </script>
+    </body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.css
new file mode 100644
index 0000000..548b428
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.css
@@ -0,0 +1,681 @@
+@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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.html
new file mode 100644
index 0000000..2ae9282
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>ueditor图片对话框</title>
+    <script type="text/javascript" src="../internal.js"></script>
+
+    <!-- jquery -->
+    <script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
+
+    <!-- webuploader -->
+    <script src="../../third-party/webuploader/webuploader.min.js"></script>
+    <link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
+
+    <!-- attachment dialog -->
+    <link rel="stylesheet" href="attachment.css" type="text/css" />
+</head>
+<body>
+
+    <div class="wrapper">
+        <div id="tabhead" class="tabhead">
+            <span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
+            <span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
+        </div>
+        <div id="tabbody" class="tabbody">
+            <!-- 上传图片 -->
+            <div id="upload" class="panel focus">
+                <div id="queueList" class="queueList">
+                    <div class="statusBar element-invisible">
+                        <div class="progress">
+                            <span class="text">0%</span>
+                            <span class="percentage"></span>
+                        </div><div class="info"></div>
+                        <div class="btns">
+                            <div id="filePickerBtn"></div>
+                            <div class="uploadBtn"><var id="lang_start_upload"></var></div>
+                        </div>
+                    </div>
+                    <div id="dndArea" class="placeholder">
+                        <div class="filePickerContainer">
+                            <div id="filePickerReady"></div>
+                        </div>
+                    </div>
+                    <ul class="filelist element-invisible">
+                        <li id="filePickerBlock" class="filePickerBlock"></li>
+                    </ul>
+                </div>
+            </div>
+
+            <!-- 在线图片 -->
+            <div id="online" class="panel">
+                <div id="fileList"><var id="lang_imgLoading"></var></div>
+            </div>
+
+        </div>
+    </div>
+    <script type="text/javascript" src="attachment.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.js
new file mode 100644
index 0000000..ce3be63
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/attachment.js
@@ -0,0 +1,754 @@
+/**
+ * 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('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
+                        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($('<div>').html(lang.errorNotSupport)).hide();
+                return;
+            } else if (!editor.getOpt('fileActionName')) {
+                $('#filePickerReady').after($('<div>').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 = $('<li id="' + file.id + '">' +
+                        '<p class="title">' + file.name + '</p>' +
+                        '<p class="imgWrap"></p>' +
+                        '<p class="progress"><span></span></p>' +
+                        '</li>'),
+
+                    $btns = $('<div class="file-panel">' +
+                        '<span class="cancel">' + lang.uploadDelete + '</span>' +
+                        '<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
+                        '<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
+                    $prgress = $li.find('p.progress span'),
+                    $wrap = $li.find('p.imgWrap'),
+                    $info = $('<p class="error"></p>').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('<i class="file-preview file-type-' + file.ext.toLowerCase() + '"></i>' +
+                        '<span class="file-title" title="' + file.name + '">' + file.name + '</span>');
+                    } 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 = $('<img src="' + src + '">');
+                                    $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('<span class="success"></span>');
+                    } 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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_chm.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_chm.gif
new file mode 100644
index 0000000..9ca4fb6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_chm.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_default.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_default.png
new file mode 100644
index 0000000..50ac1cb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_default.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_doc.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_doc.gif
new file mode 100644
index 0000000..206fede
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_doc.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_exe.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_exe.gif
new file mode 100644
index 0000000..2e3b7a2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_exe.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_jpg.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_jpg.gif
new file mode 100644
index 0000000..5d5dec0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_jpg.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_mp3.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_mp3.gif
new file mode 100644
index 0000000..b351a1f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_mp3.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_mv.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_mv.gif
new file mode 100644
index 0000000..26019b0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_mv.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_pdf.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_pdf.gif
new file mode 100644
index 0000000..bbb65c8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_pdf.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_ppt.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_ppt.gif
new file mode 100644
index 0000000..ccb26fb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_ppt.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_psd.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_psd.gif
new file mode 100644
index 0000000..2e8743a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_psd.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_rar.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_rar.gif
new file mode 100644
index 0000000..5359e46
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_rar.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_txt.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_txt.gif
new file mode 100644
index 0000000..e7b8dd2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_txt.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_xls.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_xls.gif
new file mode 100644
index 0000000..e86c1c6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/fileTypeImages/icon_xls.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/alignicon.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/alignicon.gif
new file mode 100644
index 0000000..005a5ac
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/alignicon.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/alignicon.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/alignicon.png
new file mode 100644
index 0000000..4b6c444
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/alignicon.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/bg.png
new file mode 100644
index 0000000..580be0a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/file-icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/file-icons.gif
new file mode 100644
index 0000000..d8c02c2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/file-icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/file-icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/file-icons.png
new file mode 100644
index 0000000..3ff82c8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/file-icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/icons.gif
new file mode 100644
index 0000000..78459de
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/icons.png
new file mode 100644
index 0000000..12e4700
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/image.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/image.png
new file mode 100644
index 0000000..19699f6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/image.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/progress.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/progress.png
new file mode 100644
index 0000000..717c486
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/progress.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/success.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/success.gif
new file mode 100644
index 0000000..8d4f311
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/success.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/success.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/success.png
new file mode 100644
index 0000000..94f968d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/attachment/images/success.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.css
new file mode 100644
index 0000000..5c41fe9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.css
@@ -0,0 +1,94 @@
+.wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative}
+.tabbody{height:225px;}
+.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;}
+.tabbody .focus { display: block;}
+
+body{font-size: 12px;color: #888;overflow: hidden;}
+input,label{vertical-align:middle}
+.clear{clear: both;}
+.pl{padding-left: 18px;padding-left: 23px\9;}
+
+#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;}
+#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;}
+#imageList img {cursor: pointer;border: 2px solid white;}
+
+.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;}
+.content div{margin: 10px 0 10px 5px;}
+.content .iptradio{margin: 0px 5px 5px 0px;}
+.txt{width:280px;}
+
+.wrapcolor{height: 19px;}
+div.color{float: left;margin: 0;}
+#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;}
+div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;}
+#custom input{height: 15px;min-height: 15px;width:20px;}
+#repeatType{width:100px;}
+
+
+/* 图片管理样式 */
+#imgManager {
+    width: 100%;
+    height: 225px;
+}
+#imgManager #imageList{
+    width: 100%;
+    overflow-x: hidden;
+    overflow-y: auto;
+}
+#imgManager ul {
+    display: block;
+    list-style: none;
+    margin: 0;
+    padding: 0;
+}
+#imgManager li {
+    float: left;
+    display: block;
+    list-style: none;
+    padding: 0;
+    width: 113px;
+    height: 113px;
+    margin: 9px 0 0 19px;
+    background-color: #eee;
+    overflow: hidden;
+    cursor: pointer;
+    position: relative;
+}
+#imgManager li.clearFloat {
+    float: none;
+    clear: both;
+    display: block;
+    width:0;
+    height:0;
+    margin: 0;
+    padding: 0;
+}
+#imgManager li img {
+    cursor: pointer;
+}
+#imgManager li .icon {
+    cursor: pointer;
+    width: 113px;
+    height: 113px;
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 2;
+    border: 0;
+    background-repeat: no-repeat;
+}
+#imgManager li .icon:hover {
+    width: 107px;
+    height: 107px;
+    border: 3px solid #1094fa;
+}
+#imgManager li.selected .icon {
+    background-image: url(images/success.png);
+    background-position: 75px 75px;
+}
+#imgManager li.selected .icon:hover {
+    width: 107px;
+    height: 107px;
+    border: 3px solid #1094fa;
+    background-position: 72px 72px;
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.html
new file mode 100644
index 0000000..3cc2ac1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="background.css">
+</head>
+<body>
+    <div id="bg_container" class="wrapper">
+        <div id="tabHeads" class="tabhead">
+            <span class="focus" data-content-id="normal"><var id="lang_background_normal"></var></span>
+            <span class="" data-content-id="imgManager"><var id="lang_background_local"></var></span>
+        </div>
+        <div id="tabBodys" class="tabbody">
+            <div id="normal" class="panel focus">
+                <fieldset class="bgarea">
+                    <legend><var id="lang_background_set"></var></legend>
+                    <div class="content">
+                        <div>
+                            <label><input id="nocolorRadio" class="iptradio" type="radio" name="t" value="none" checked="checked"><var id="lang_background_none"></var></label>
+                            <label><input id="coloredRadio" class="iptradio" type="radio" name="t" value="color"><var id="lang_background_colored"></var></label>
+                        </div>
+                        <div class="wrapcolor pl">
+                            <div class="color">
+                                <var id="lang_background_color"></var>:
+                            </div>
+                            <div id="colorPicker"></div>
+                            <div class="clear"></div>
+                        </div>
+                        <div class="wrapcolor pl">
+                            <label><var id="lang_background_netimg"></var>:</label><input class="txt" type="text" id="url">
+                        </div>
+                        <div id="alignment" class="alignment">
+                            <var id="lang_background_align"></var>:<select id="repeatType">
+                                <option value="center"></option>
+                                <option value="repeat-x"></option>
+                                <option value="repeat-y"></option>
+                                <option value="repeat"></option>
+                                <option value="self"></option>
+                            </select>
+                        </div>
+                        <div id="custom" >
+                            <var id="lang_background_position"></var>:x:<input type="text" size="1" id="x" maxlength="4" value="0">px&nbsp;&nbsp;y:<input type="text" size="1" id="y" maxlength="4" value="0">px
+                        </div>
+                    </div>
+                </fieldset>
+
+            </div>
+            <div id="imgManager" class="panel">
+                <div id="imageList" style=""></div>
+            </div>
+        </div>
+    </div>
+    <script type="text/javascript" src="background.js"></script>
+</body>
+</html>
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.js
new file mode 100644
index 0000000..9a4a131
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/background.js
@@ -0,0 +1,376 @@
+(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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/images/bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/images/bg.png
new file mode 100644
index 0000000..580be0a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/images/bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/images/success.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/images/success.png
new file mode 100644
index 0000000..94f968d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/background/images/success.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/chart.config.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/chart.config.js
new file mode 100644
index 0000000..678b00d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/chart.config.js
@@ -0,0 +1,65 @@
+/*
+ * 图表配置文件
+ * */
+
+
+//不同类型的配置
+var typeConfig = [
+    {
+        chart: {
+            type: 'line'
+        },
+        plotOptions: {
+            line: {
+                dataLabels: {
+                    enabled: false
+                },
+                enableMouseTracking: true
+            }
+        }
+    }, {
+        chart: {
+            type: 'line'
+        },
+        plotOptions: {
+            line: {
+                dataLabels: {
+                    enabled: true
+                },
+                enableMouseTracking: false
+            }
+        }
+    }, {
+        chart: {
+            type: 'area'
+        }
+    }, {
+        chart: {
+            type: 'bar'
+        }
+    }, {
+        chart: {
+            type: 'column'
+        }
+    }, {
+        chart: {
+            plotBackgroundColor: null,
+            plotBorderWidth: null,
+            plotShadow: false
+        },
+        plotOptions: {
+            pie: {
+                allowPointSelect: true,
+                cursor: 'pointer',
+                dataLabels: {
+                    enabled: true,
+                    color: '#000000',
+                    connectorColor: '#000000',
+                    formatter: function() {
+                        return '<b>'+ this.point.name +'</b>: '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %';
+                    }
+                }
+            }
+        }
+    }
+];
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/charts.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/charts.css
new file mode 100644
index 0000000..ac3c764
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/charts.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/charts.html
new file mode 100644
index 0000000..70e2314
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/charts.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>chart</title>
+        <meta chartset="utf-8">
+        <link rel="stylesheet" type="text/css" href="charts.css">
+        <script type="text/javascript" src="../internal.js"></script>
+    </head>
+    <body>
+        <div class="main">
+            <div class="table-view">
+                <h3><var id="lang_data_source"></var></h3>
+                <div id="tableContainer" class="table-container"></div>
+                <h3><var id="lang_chart_format"></var></h3>
+                <form name="data-form">
+                    <div class="charts-format">
+                        <fieldset>
+                            <legend><var id="lang_data_align"></var></legend>
+                            <div class="format-item-container">
+                                <label>
+                                    <input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="1" checked="checked">
+                                    <var id="lang_chart_align_same"></var>
+                                </label>
+                                <label>
+                                    <input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="-1">
+                                    <var id="lang_chart_align_reverse"></var>
+                                </label>
+                                <br>
+                            </div>
+                        </fieldset>
+                        <fieldset>
+                            <legend><var id="lang_chart_title"></var></legend>
+                            <div class="format-item-container">
+                                <label>
+                                    <var id="lang_chart_main_title"></var><input type="text" name="title" class="data-item">
+                                </label>
+                                <label>
+                                    <var id="lang_chart_sub_title"></var><input type="text" name="sub-title" class="data-item not-pie-item">
+                                </label>
+                                <label>
+                                    <var id="lang_chart_x_title"></var><input type="text" name="x-title" class="data-item not-pie-item">
+                                </label>
+                                <label>
+                                    <var id="lang_chart_y_title"></var><input type="text" name="y-title" class="data-item not-pie-item">
+                                </label>
+                            </div>
+                        </fieldset>
+                        <fieldset>
+                            <legend><var id="lang_chart_tip"></var></legend>
+                            <div class="format-item-container">
+                                <label>
+                                    <var id="lang_cahrt_tip_prefix"></var>
+                                    <input type="text" id="tipInput" name="tip" class="data-item" disabled="disabled">
+                                </label>
+                                <p><var id="lang_cahrt_tip_description"></var></p>
+                            </div>
+                        </fieldset>
+                        <fieldset>
+                            <legend><var id="lang_chart_data_unit"></var></legend>
+                            <div class="format-item-container">
+                                <label><var id="lang_chart_data_unit_title"></var><input type="text" name="unit" class="data-item"></label>
+                                <p><var id="lang_chart_data_unit_description"></var></p>
+                            </div>
+                        </fieldset>
+                    </div>
+                </form>
+            </div>
+            <div class="charts-view">
+                <div id="chartsContainer" class="charts-container"></div>
+                <div id="chartsType" class="charts-type">
+                    <h3><var id="lang_chart_type"></var></h3>
+                    <div class="scroll-view">
+                        <div class="scroll-container">
+                            <div id="scrollBed" class="scroll-bed"></div>
+                        </div>
+                        <div id="buttonContainer" class="button-container">
+                            <a href="#" data-title="prev"><var id="lang_prev_btn"></var></a>
+                            <a href="#" data-title="next"><var id="lang_next_btn"></var></a>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <script src="../../third-party/jquery-1.10.2.min.js"></script>
+        <script src="../../third-party/highcharts/highcharts.js"></script>
+        <script src="chart.config.js"></script>
+        <script src="charts.js"></script>
+    </body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/charts.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/charts.js
new file mode 100644
index 0000000..37344fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/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 = "<div class='edui-charts-not-data'>未找到数据</div>";
+        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( '<div class="view-box" data-chart-type="'+ i +'"><img width="300" src="images/charts'+ i +'.png"></div>' );
+
+    }
+
+    $( "#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( '<th>'+ value +'</th>' );
+            } else {
+                tableHtml[ i ].push( '<td><input type="text" class="data-item" value="'+ value +'"></td>' );
+            }
+
+            tableData[ i ][ j ] = value;
+
+        }
+
+        tableHtml[ i ] = tableHtml[ i ].join( "" );
+
+    }
+
+    //draw 表格
+    $( "#tableContainer" ).html( '<table id="showTable" border="1"><tbody><tr>'+ tableHtml.join( "</tr><tr>" ) +'</tr></tbody></table>' );
+
+}
+
+/*
+ * 根据表格已有的图表属性初始化当前图表属性
+ */
+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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts0.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts0.png
new file mode 100644
index 0000000..9485e5e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts0.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts1.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts1.png
new file mode 100644
index 0000000..b5a0039
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts1.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts2.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts2.png
new file mode 100644
index 0000000..7c91a39
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts2.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts3.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts3.png
new file mode 100644
index 0000000..a6bc29b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts3.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts4.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts4.png
new file mode 100644
index 0000000..742006a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts4.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts5.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts5.png
new file mode 100644
index 0000000..c49a296
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/charts/images/charts5.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/emotion.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/emotion.css
new file mode 100644
index 0000000..f801105
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/emotion.css
@@ -0,0 +1,43 @@
+.jd img{
+    background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+.pp img{
+    background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:25px;height:25px;display:block;
+}
+.ldw img{
+    background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+.tsj img{
+    background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+.cat img{
+    background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+.bb img{
+    background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+.youa img{
+    background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
+    cursor:pointer;width:35px;height:35px;display:block;
+}
+
+.smileytable td {height: 37px;}
+#tabPanel{margin-left:5px;overflow: hidden;}
+#tabContent {float:left;background:#FFFFFF;}
+#tabContent div{display: none;width:480px;overflow:hidden;}
+#tabIconReview.show{left:17px;display:block;}
+.menuFocus{background:#ACCD3C;}
+.menuDefault{background:#FFFFFF;}
+#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;}
+img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;}
+
+.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;}
+.tabbody table{width: 100%;}
+.tabbody td{border:1px solid #BAC498;}
+.tabbody td span{display: block;zoom:1;padding:0 4px;}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/emotion.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/emotion.html
new file mode 100644
index 0000000..fca0850
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/emotion.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="robots" content="noindex, nofollow"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="emotion.css">
+</head>
+<body>
+<div id="tabPanel" class="wrapper">
+    <div id="tabHeads" class="tabhead">
+        <span><var id="lang_input_choice"></var></span>
+        <span><var id="lang_input_Tuzki"></var></span>
+        <span><var id="lang_input_lvdouwa"></var></span>
+        <span><var id="lang_input_BOBO"></var></span>
+        <span><var id="lang_input_babyCat"></var></span>
+        <span><var id="lang_input_bubble"></var></span>
+        <span><var id="lang_input_youa"></var></span>
+    </div>
+    <div id="tabBodys" class="tabbody">
+        <div id="tab0"></div>
+        <div id="tab1"></div>
+        <div id="tab2"></div>
+        <div id="tab3"></div>
+        <div id="tab4"></div>
+        <div id="tab5"></div>
+        <div id="tab6"></div>
+    </div>
+</div>
+<div id="tabIconReview">
+    <img id='faceReview' class='review' src="../../themes/default/images/spacer.gif"/>
+</div>
+<script type="text/javascript" src="emotion.js"></script>
+<script type="text/javascript">
+    var emotion = {
+        tabNum:7, //切换面板数量
+        SmilmgName:{ tab0:['j_00', 84], tab1:['t_00', 40], tab2:['w_00', 52], tab3:['B_00', 63], tab4:['C_00', 20], tab5:['i_f', 50], tab6:['y_00', 40] }, //图片前缀名
+        imageFolders:{ tab0:'jx2/', tab1:'tsj/', tab2:'ldw/', tab3:'bobo/', tab4:'babycat/', tab5:'face/', tab6:'youa/'}, //图片对应文件夹路径
+        imageCss:{tab0:'jd', tab1:'tsj', tab2:'ldw', tab3:'bb', tab4:'cat', tab5:'pp', tab6:'youa'}, //图片css类名
+        imageCssOffset:{tab0:35, tab1:35, tab2:35, tab3:35, tab4:35, tab5:25, tab6:35}, //图片偏移
+        SmileyInfor:{
+            tab0:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'],
+            tab1:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'],
+            tab2:['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'],
+            tab3:['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'],
+            tab4:['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'],
+            tab5:['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'],
+            tab6:['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上']
+        }
+    };
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/emotion.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/emotion.js
new file mode 100644
index 0000000..6e158a9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/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 = ['<table class="smileytable">'],
+            i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,
+            sUrl, realUrl, posflag, offset, infor;
+
+    for ( ; i < imgNum; ) {
+        textHTML.push( '<tr>' );
+        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( '<td  class="' + tableCss + '"   border="1" width="' + iColWidth + '%" style="border-collapse:collapse;" align="center"  bgcolor="transparent" onclick="InsertSmiley(\'' + realUrl.replace( /'/g, "\\'" ) + '\',event)" onmouseover="over(this,\'' + sUrl + '\',\'' + posflag + '\')" onmouseout="out(this)">' );
+                textHTML.push( '<span>' );
+                textHTML.push( '<img  style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>' );
+                textHTML.push( '</span>' );
+            } else {
+                textHTML.push( '<td width="' + iColWidth + '%"   bgcolor="#FFFFFF">' );
+            }
+            textHTML.push( '</td>' );
+        }
+        textHTML.push( '</tr>' );
+    }
+    textHTML.push( '</table>' );
+    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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/0.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/0.gif
new file mode 100644
index 0000000..6964168
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/0.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/bface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/bface.gif
new file mode 100644
index 0000000..14fe618
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/bface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/cface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/cface.gif
new file mode 100644
index 0000000..bff947f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/cface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/fface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/fface.gif
new file mode 100644
index 0000000..0d8a6af
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/fface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/jxface2.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/jxface2.gif
new file mode 100644
index 0000000..a959c90
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/jxface2.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/neweditor-tab-bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/neweditor-tab-bg.png
new file mode 100644
index 0000000..8f398b0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/neweditor-tab-bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/tface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/tface.gif
new file mode 100644
index 0000000..1354f54
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/tface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/wface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/wface.gif
new file mode 100644
index 0000000..5667160
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/wface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/yface.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/yface.gif
new file mode 100644
index 0000000..51608be
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/emotion/images/yface.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/gmap/gmap.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/gmap/gmap.html
new file mode 100644
index 0000000..c4cbfe6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/gmap/gmap.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .content{width:530px; height: 350px;margin: 10px auto;}
+        .content table{width: 100%}
+        .content table td{vertical-align: middle;}
+        #address{width:220px;height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}
+    </style>
+    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
+</head>
+<body>
+<div class="content">
+    <table>
+        <tr>
+            <td><label for="address"><var id="lang_input_address"></var></label></td>
+            <td><input id="address" type="text" /></td>
+            <td><a id="doSearch" href="javascript:void(0)" class="button"><var id="lang_input_search"></var></a></td>
+        </tr>
+    </table>
+    <div id="container" style="width: 100%; height: 340px;margin: 5px auto; border: 1px solid gray;"></div>
+</div>
+<script type="text/javascript">
+    domUtils.on(window,"load",function(){
+        var map = new google.maps.Map(document.getElementById('container'), {
+                zoom: 3,
+                streetViewControl: false,
+                scaleControl: true,
+                mapTypeId: google.maps.MapTypeId.ROADMAP
+            });
+            var imgcss;
+            var marker = new google.maps.Marker({
+                map: map,
+                draggable: true
+            });
+            function doSearch(){
+                var address = document.getElementById('address').value;
+                var geocoder = new google.maps.Geocoder();
+                geocoder.geocode( { 'address': address}, function (results, status) {
+                    if (status == google.maps.GeocoderStatus.OK) {
+                        var bounds = results[0].geometry.viewport;
+                        map.fitBounds(bounds);
+                        marker.setPosition(results[0].geometry.location);
+                        marker.setTitle(address);
+                    } else alert(lang.searchError);
+                });
+            }
+            $G('address').onkeydown = function (evt){
+                evt = evt || event;
+                if (evt.keyCode == 13) {
+                    doSearch();
+                }
+            };
+            $G("doSearch").onclick = doSearch;
+            dialog.onok = function (){
+                var center = map.getCenter();
+                var point = marker.getPosition();
+                var url = "http://maps.googleapis.com/maps/api/staticmap?center=" + center.lat() + ',' + center.lng() + "&zoom=" + map.zoom + "&size=520x340&maptype=" + map.getMapTypeId() + "&markers=" + point.lat() + ',' + point.lng() + "&sensor=false";
+                editor.execCommand('inserthtml', '<img width="520" height="340" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>');
+            };
+
+            function getPars(str,par){
+                var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
+                return reg.exec(str)[1];
+            }
+            var img = editor.selection.getRange().getClosedNode();
+            if(img && img.src.indexOf("http://maps.googleapis.com/maps/api/staticmap")!=-1){
+                var url = img.getAttribute("src");
+                var centers = getPars(url,"center").split(",");
+                point = new google.maps.LatLng(Number(centers[0]),Number(centers[1]));
+                map.setCenter(point);
+                map.setZoom(Number(getPars(url,"zoom")));
+                centers = getPars(url,"markers").split(",");
+                marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1])));
+                imgcss = img.style.cssText;
+            }else{
+                setTimeout(function(){
+                    doSearch();
+                },30)
+            }
+    });
+
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.css
new file mode 100644
index 0000000..4478475
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.css
@@ -0,0 +1,7 @@
+.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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.html
new file mode 100644
index 0000000..9e50060
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title>帮助</title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="help.css">
+</head>
+<body>
+<div class="wrapper" id="helptab">
+    <div id="tabHeads" class="tabhead">
+        <span class="focus" tabsrc="about"><var id="lang_input_about"></var></span>
+        <span tabsrc="shortcuts"><var id="lang_input_shortcuts"></var></span>
+    </div>
+    <div id="tabBodys" class="tabbody">
+        <div id="about" class="panel">
+            <h1>UEditor</h1>
+            <p id="version"></p>
+            <p><var id="lang_input_introduction"></var></p>
+        </div>
+        <div id="shortcuts" class="panel">
+            <table>
+                <thead>
+                <tr>
+                    <td><var id="lang_Txt_shortcuts"></var></td>
+                    <td><var id="lang_Txt_func"></var></td>
+                </tr>
+                </thead>
+                <tbody>
+                <tr>
+                    <td>ctrl+b</td>
+                    <td><var id="lang_Txt_bold"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+c</td>
+                    <td><var id="lang_Txt_copy"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+x</td>
+                    <td><var id="lang_Txt_cut"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+v</td>
+                    <td><var id="lang_Txt_Paste"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+y</td>
+                    <td><var id="lang_Txt_undo"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+z</td>
+                    <td><var id="lang_Txt_redo"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+i</td>
+                    <td><var id="lang_Txt_italic"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+u</td>
+                    <td><var id="lang_Txt_underline"></var></td>
+                </tr>
+                <tr>
+                    <td>ctrl+a</td>
+                    <td><var id="lang_Txt_selectAll"></var></td>
+                </tr>
+                <tr>
+                    <td>shift+enter</td>
+                    <td><var id="lang_Txt_visualEnter"></var></td>
+                </tr>
+                <tr>
+                    <td>alt+z</td>
+                    <td><var id="lang_Txt_fullscreen"></var></td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="help.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.js
new file mode 100644
index 0000000..9a2272e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/help/help.js
@@ -0,0 +1,56 @@
+/**
+ * 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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.css
new file mode 100644
index 0000000..52c2295
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.css
@@ -0,0 +1,894 @@
+@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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.html
new file mode 100644
index 0000000..08ca022
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.html
@@ -0,0 +1,120 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>ueditor图片对话框</title>
+    <script type="text/javascript" src="../internal.js"></script>
+
+    <!-- jquery -->
+    <script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
+
+    <!-- webuploader -->
+    <script src="../../third-party/webuploader/webuploader.min.js"></script>
+    <link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
+
+    <!-- image dialog -->
+    <link rel="stylesheet" href="image.css" type="text/css" />
+</head>
+<body>
+
+    <div class="wrapper">
+        <div id="tabhead" class="tabhead">
+            <span class="tab" data-content-id="remote"><var id="lang_tab_remote"></var></span>
+            <span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
+            <span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
+            <span class="tab" data-content-id="search"><var id="lang_tab_search"></var></span>
+        </div>
+        <div class="alignBar">
+            <label class="algnLabel"><var id="lang_input_align"></var></label>
+                    <span id="alignIcon">
+                        <span id="noneAlign" class="none-align focus" data-align="none"></span>
+                        <span id="leftAlign" class="left-align" data-align="left"></span>
+                        <span id="rightAlign" class="right-align" data-align="right"></span>
+                        <span id="centerAlign" class="center-align" data-align="center"></span>
+                    </span>
+            <input id="align" name="align" type="hidden" value="none"/>
+        </div>
+        <div id="tabbody" class="tabbody">
+
+            <!-- 远程图片 -->
+            <div id="remote" class="panel">
+                <div class="top">
+                    <div class="row">
+                        <label for="url"><var id="lang_input_url"></var></label>
+                        <span><input class="text" id="url" type="text"/></span>
+                    </div>
+                </div>
+                <div class="left">
+                    <div class="row">
+                        <label><var id="lang_input_size"></var></label>
+                        <span><var id="lang_input_width">&nbsp;&nbsp;</var><input class="text" type="text" id="width"/>px </span>
+                        <span><var id="lang_input_height">&nbsp;&nbsp;</var><input class="text" type="text" id="height"/>px </span>
+                        <span><input id="lock" type="checkbox" disabled="disabled"><span id="lockicon"></span></span>
+                    </div>
+                    <div class="row">
+                        <label><var id="lang_input_border"></var></label>
+                        <span><input class="text" type="text" id="border"/>px </span>
+                    </div>
+                    <div class="row">
+                        <label><var id="lang_input_vhspace"></var></label>
+                        <span><input class="text" type="text" id="vhSpace"/>px </span>
+                    </div>
+                    <div class="row">
+                        <label><var id="lang_input_title"></var></label>
+                        <span><input class="text" type="text" id="title"/></span>
+                    </div>
+                </div>
+                <div class="right"><div id="preview"></div></div>
+            </div>
+
+            <!-- 上传图片 -->
+            <div id="upload" class="panel focus">
+                <div id="queueList" class="queueList">
+                    <div class="statusBar element-invisible">
+                        <div class="progress">
+                            <span class="text">0%</span>
+                            <span class="percentage"></span>
+                        </div><div class="info"></div>
+                        <div class="btns">
+                            <div id="filePickerBtn"></div>
+                            <div class="uploadBtn"><var id="lang_start_upload"></var></div>
+                        </div>
+                    </div>
+                    <div id="dndArea" class="placeholder">
+                        <div class="filePickerContainer">
+                            <div id="filePickerReady"></div>
+                        </div>
+                    </div>
+                    <ul class="filelist element-invisible">
+                        <li id="filePickerBlock" class="filePickerBlock"></li>
+                    </ul>
+                </div>
+            </div>
+
+            <!-- 在线图片 -->
+            <div id="online" class="panel">
+                <div id="imageList"><var id="lang_imgLoading"></var></div>
+            </div>
+
+            <!-- 搜索图片 -->
+            <div id="search" class="panel">
+                <div class="searchBar">
+                    <input id="searchTxt" class="searchTxt text" type="text" />
+                    <select id="searchType" class="searchType">
+                        <option value="&s=4&z=0"></option>
+                        <option value="&s=1&z=19"></option>
+                        <option value="&s=2&z=0"></option>
+                        <option value="&s=3&z=0"></option>
+                    </select>
+                    <input id="searchReset" type="button"  />
+                    <input id="searchBtn" type="button"  />
+                </div>
+                <div id="searchList" class="searchList"><ul id="searchListUl"></ul></div>
+            </div>
+
+        </div>
+    </div>
+    <script type="text/javascript" src="image.js"></script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.js
new file mode 100644
index 0000000..e9f9188
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/image.js
@@ -0,0 +1,1143 @@
+/**
+ * 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('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
+                        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("&amp;", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&amp;", "&")),
+                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 = '<img src="' + url + '" width="' + width + '" height="' + height + '" border="' + border + 'px solid #000" title="' + title + '" />';
+            }
+        },
+        getInsertList: function () {
+            var data = this.getData();
+            if(data['url']) {
+            	alert(data['width']);
+                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($('<div>').html(lang.errorNotSupport)).hide();
+                return;
+            } else if (!editor.getOpt('imageActionName')) {
+                $('#filePickerReady').after($('<div>').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 = $('<li id="' + file.id + '">' +
+                        '<p class="title">' + file.name + '</p>' +
+                        '<p class="imgWrap"></p>' +
+                        '<p class="progress"><span></span></p>' +
+                        '</li>'),
+
+                    $btns = $('<div class="file-panel">' +
+                        '<span class="cancel">' + lang.uploadDelete + '</span>' +
+                        '<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
+                        '<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
+                    $prgress = $li.find('p.progress span'),
+                    $wrap = $li.find('p.imgWrap'),
+                    $info = $('<p class="error"></p>').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 = $('<img src="' + src + '">');
+                                $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('<span class="success"></span>');
+                    } 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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/alignicon.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/alignicon.jpg
new file mode 100644
index 0000000..754755b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/alignicon.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/bg.png
new file mode 100644
index 0000000..580be0a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/icons.gif
new file mode 100644
index 0000000..78459de
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/icons.png
new file mode 100644
index 0000000..12e4700
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/image.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/image.png
new file mode 100644
index 0000000..19699f6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/image.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/progress.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/progress.png
new file mode 100644
index 0000000..717c486
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/progress.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/success.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/success.gif
new file mode 100644
index 0000000..8d4f311
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/success.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/success.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/success.png
new file mode 100644
index 0000000..94f968d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/image/images/success.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/insertframe/insertframe.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/insertframe/insertframe.html
new file mode 100644
index 0000000..7f1f3e9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/insertframe/insertframe.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .warp {width: 320px;height: 153px;margin-left:5px;padding: 20px 0 0 15px;position: relative;}
+        #url {width: 290px; margin-bottom: 2px; margin-left: -6px; margin-left: -2px\9;*margin-left:0;_margin-left:0; }
+        .format span{display: inline-block; width: 58px;text-align: center; zoom:1;}
+        table td{padding:5px 0;}
+        #align{width: 65px;height: 23px;line-height: 22px;}
+    </style>
+</head>
+<body>
+<div class="warp">
+        <table width="300" cellpadding="0" cellspacing="0">
+            <tr>
+                <td colspan="2" class="format">
+                    <span><var id="lang_input_address"></var></span>
+                    <input style="width:200px" id="url" type="text" value=""/>
+                </td>
+            </tr>
+            <tr>
+                <td colspan="2" class="format"><span><var id="lang_input_width"></var></span><input style="width:200px" type="text" id="width"/> px</td>
+
+            </tr>
+            <tr>
+                <td colspan="2" class="format"><span><var id="lang_input_height"></var></span><input style="width:200px" type="text" id="height"/> px</td>
+            </tr>
+            <tr>
+                <td><span><var id="lang_input_isScroll"></var></span><input type="checkbox" id="scroll"/> </td>
+                <td><span><var id="lang_input_frameborder"></var></span><input type="checkbox" id="frameborder"/> </td>
+            </tr>
+
+            <tr>
+                <td colspan="2"><span><var id="lang_input_alignMode"></var></span>
+                    <select id="align">
+                        <option value=""></option>
+                        <option value="left"></option>
+                        <option value="right"></option>
+                    </select>
+                </td>
+            </tr>
+        </table>
+</div>
+<script type="text/javascript">
+    var iframe = editor._iframe;
+    if(iframe){
+        $G("url").value = iframe.getAttribute("src")||"";
+        $G("width").value = iframe.getAttribute("width")||iframe.style.width.replace("px","")||"";
+        $G("height").value = iframe.getAttribute("height") || iframe.style.height.replace("px","") ||"";
+        $G("scroll").checked = (iframe.getAttribute("scrolling") == "yes") ? true : false;
+        $G("frameborder").checked = (iframe.getAttribute("frameborder") == "1") ? true : false;
+        $G("align").value = iframe.align ? iframe.align : "";
+    }
+    function queding(){
+        var  url = $G("url").value.replace(/^\s*|\s*$/ig,""),
+                width = $G("width").value,
+                height = $G("height").value,
+                scroll = $G("scroll"),
+                frameborder = $G("frameborder"),
+                float = $G("align").value,
+                newIframe = editor.document.createElement("iframe"),
+                div;
+        if(!url){
+            alert(lang.enterAddress);
+            return false;
+        }
+        newIframe.setAttribute("src",/http:\/\/|https:\/\//ig.test(url) ? url : "http://"+url);
+        /^[1-9]+[.]?\d*$/g.test( width ) ? newIframe.setAttribute("width",width) : "";
+        /^[1-9]+[.]?\d*$/g.test( height ) ? newIframe.setAttribute("height",height) : "";
+        scroll.checked ?  newIframe.setAttribute("scrolling","yes") : newIframe.setAttribute("scrolling","no");
+        frameborder.checked ?  newIframe.setAttribute("frameborder","1",0) : newIframe.setAttribute("frameborder","0",0);
+        float ? newIframe.setAttribute("align",float) :  newIframe.setAttribute("align","");
+        if(iframe){
+            iframe.parentNode.insertBefore(newIframe,iframe);
+            domUtils.remove(iframe);
+        }else{
+            div = editor.document.createElement("div");
+            div.appendChild(newIframe);
+            editor.execCommand("inserthtml",div.innerHTML);
+        }
+        editor._iframe = null;
+        dialog.close();
+    }
+    dialog.onok = queding;
+    $G("url").onkeydown = function(evt){
+        evt = evt || event;
+        if(evt.keyCode == 13){
+            queding();
+        }
+    };
+    $focus($G( "url" ));
+
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/internal.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/internal.js
new file mode 100644
index 0000000..44dc17f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/link/link.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/link/link.html
new file mode 100644
index 0000000..55ab4d1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/link/link.html
@@ -0,0 +1,126 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        *{margin:0;padding:0;color: #838383;}
+        table{font-size: 12px;margin: 10px;line-height: 30px}
+        .txt{width:300px;height:21px;line-height:21px;border:1px solid #d7d7d7;}
+    </style>
+</head>
+<body>
+    <table>
+        <tr>
+            <td><label for="text"> <var id="lang_input_text"></var></label></td>
+            <td><input class="txt" id="text" type="text" disabled="true"/></td>
+        </tr>
+        <tr>
+            <td><label for="href"> <var id="lang_input_url"></var></label></td>
+            <td><input class="txt" id="href" type="text" /></td>
+        </tr>
+        <tr>
+            <td><label for="title"> <var id="lang_input_title"></var></label></td>
+            <td><input class="txt" id="title" type="text"/></td>
+        </tr>
+        <tr>
+             <td colspan="2">
+                 <label for="target"><var id="lang_input_target"></var></label>
+                 <input id="target" type="checkbox"/>
+             </td>
+        </tr>
+        <tr>
+            <td colspan="2" id="msg"></td>
+        </tr>
+    </table>
+<script type="text/javascript">
+    var range = editor.selection.getRange(),
+        link = range.collapsed ? editor.queryCommandValue( "link" ) : editor.selection.getStart(),
+        url,
+        text = $G('text'),
+        rangeLink = domUtils.findParentByTagName(range.getCommonAncestor(),'a',true),
+        orgText;
+    link = domUtils.findParentByTagName( link, "a", true );
+    if(link){
+        url = utils.html(link.getAttribute( '_href' ) || link.getAttribute( 'href', 2 ));
+
+        if(rangeLink === link && !link.getElementsByTagName('img').length){
+            text.removeAttribute('disabled');
+            orgText = text.value = link[browser.ie ? 'innerText':'textContent'];
+        }else{
+            text.setAttribute('disabled','true');
+            text.value = lang.validLink;
+        }
+
+    }else{
+        if(range.collapsed){
+            text.removeAttribute('disabled');
+            text.value = '';
+        }else{
+            text.setAttribute('disabled','true');
+            text.value = lang.validLink;
+        }
+
+    }
+    $G("title").value = url ? link.title : "";
+    $G("href").value = url ? url: '';
+    $G("target").checked = url && link.target == "_blank" ? true :  false;
+    $focus($G("href"));
+
+    function handleDialogOk(){
+        var href =$G('href').value.replace(/^\s+|\s+$/g, '');
+        if(href){
+            if(!hrefStartWith(href,["http","/","ftp://",'#'])) {
+                href  = "http://" + href;
+            }
+            var obj = {
+                'href' : href,
+                'target' : $G("target").checked ? "_blank" : '_self',
+                'title' : $G("title").value.replace(/^\s+|\s+$/g, ''),
+                '_href':href
+            };
+            //修改链接内容的情况太特殊了,所以先做到这里了
+            //todo:情况多的时候,做到command里
+            if(orgText && text.value != orgText){
+                link[browser.ie ? 'innerText' : 'textContent'] =  obj.textValue = text.value;
+                range.selectNode(link).select()
+            }
+            if(range.collapsed){
+                obj.textValue = text.value;
+            }
+            editor.execCommand('link',utils.clearEmptyAttrs(obj) );
+            dialog.close();
+        }
+    }
+    dialog.onok = handleDialogOk;
+    $G('href').onkeydown = $G('title').onkeydown = function(evt){
+        evt = evt || window.event;
+        if (evt.keyCode == 13) {
+            handleDialogOk();
+            return false;
+        }
+    };
+    $G('href').onblur = function(){
+        if(!hrefStartWith(this.value,["http","/","ftp://",'#'])){
+            $G("msg").innerHTML = "<span style='color: red'>"+lang.httpPrompt+"</span>";
+        }else{
+            $G("msg").innerHTML = "";
+        }
+    };
+
+    function hrefStartWith(href,arr){
+        href = href.replace(/^\s+|\s+$/g, '');
+        for(var i=0,ai;ai=arr[i++];){
+            if(href.indexOf(ai)==0){
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+</script>
+</body>
+</html>
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/map/map.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/map/map.html
new file mode 100644
index 0000000..e763b8e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/map/map.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.1&services=true"></script>
+    <style type="text/css">
+        .content{width:530px; height: 350px;margin: 10px auto;}
+        .content table{width: 100%}
+        .content table td{vertical-align: middle;}
+        #city,#address{height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}
+        #city{width:60px}
+        #address{width:130px}
+        #is_dynamic_label span{vertical-align:middle;margin: 3px 0px 3px 3px;}
+        #is_dynamic_label input{vertical-align:middle;margin: 3px 3px 3px 50px;}
+    </style>
+</head>
+<body>
+<div class="content">
+    <table>
+        <tr>
+            <td><var id="lang_city"></var>:</td>
+            <td><input id="city" type="text" /></td>
+            <td><var id="lang_address"></var>:</td>
+            <td><input id="address" type="text" value="" /></td>
+            <td><a href="javascript:doSearch()" class="button"><var id="lang_search"></var></a></td>
+            <td><label id="is_dynamic_label" for="is_dynamic"><input id="is_dynamic" type="checkbox" name="is_dynamic" /><span><var id="lang_dynamicmap"></var></span></label></td>
+        </tr>
+    </table>
+    <div style="width:100%;height:340px;margin:5px auto;border:1px solid gray" id="container"></div>
+
+</div>
+<script type="text/javascript">
+    var map = new BMap.Map("container"),marker,point,styleStr;
+    map.enableScrollWheelZoom();
+    map.enableContinuousZoom();
+    function doSearch(){
+        if (!document.getElementById('city').value) {
+            alert(lang.cityMsg);
+            return;
+        }
+        var search = new BMap.LocalSearch(document.getElementById('city').value, {
+            onSearchComplete: function (results){
+                if (results && results.getNumPois()) {
+                    var points = [];
+                    for (var i=0; i<results.getCurrentNumPois(); i++) {
+                        points.push(results.getPoi(i).point);
+                    }
+                    if (points.length > 1) {
+                        map.setViewport(points);
+                    } else {
+                        map.centerAndZoom(points[0], 13);
+                    }
+                    point = map.getCenter();
+                    marker.setPoint(point);
+                } else {
+                    alert(lang.errorMsg);
+                }
+            }
+        });
+        search.search(document.getElementById('address').value || document.getElementById('city').value);
+    }
+    //获得参数
+    function getPars(str,par){
+        var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
+        return reg.exec(str)[1];
+    }
+    function init(){
+        var mapNode = editor.selection.getRange().getClosedNode(),
+            isMapImg = mapNode && /api[.]map[.]baidu[.]com/ig.test(mapNode.getAttribute("src")),
+            isMapIframe = mapNode && domUtils.hasClass(mapNode, 'ueditor_baidumap');
+        if(isMapImg || isMapIframe){
+            var url, centerPos, markerPos;
+            if(isMapIframe) {
+                url = decodeURIComponent(mapNode.getAttribute("src"));
+                $G('is_dynamic').checked = true;
+                styleStr = mapNode.style.cssText;
+            } else {
+                url = mapNode.getAttribute("src");
+                styleStr = mapNode.style.cssText;
+            }
+
+            centerPos = getPars(url,"center").split(",");
+            markerPos = getPars(url, "markers").split(",");
+            point = new BMap.Point(Number(centerPos[0]),Number(centerPos[1]));
+            marker = new BMap.Marker(new BMap.Point(Number(markerPos[0]), Number(markerPos[1])));
+            map.addControl(new BMap.NavigationControl());
+            map.centerAndZoom(point, Number(getPars(url,"zoom")));
+        }else{
+            point = new BMap.Point(116.404, 39.915);    // 创建点坐标
+            marker = new BMap.Marker(point);
+            map.addControl(new BMap.NavigationControl());
+            map.centerAndZoom(point, 10);                     // 初始化地图,设置中心点坐标和地图级别。
+        }
+        marker.enableDragging();
+        map.addOverlay(marker);
+    }
+    init();
+    document.getElementById('address').onkeydown = function (evt){
+        evt = evt || event;
+        if (evt.keyCode == 13) {
+            doSearch();
+        }
+    };
+    dialog.onok = function (){
+        var center = map.getCenter();
+        var zoom = map.zoomLevel;
+        var size = map.getSize();
+        var mapWidth = size.width;
+        var mapHeight = size.height;
+        var point = marker.getPoint();
+
+        if($G('is_dynamic').checked) {
+            var URL = editor.options.UEDITOR_HOME_URL,
+                url = [URL + (/\/$/.test(URL) ? '':'/') + "dialogs/map/show.html" +
+                    '#center=' + center.lng + ',' + center.lat,
+                    '&zoom=' + zoom,
+                    '&width=' + mapWidth,
+                    '&height=' + mapHeight,
+                    '&markers=' + point.lng + ',' + point.lat,
+                    '&markerStyles=' + 'l,A'].join('');
+            editor.execCommand('inserthtml', '<iframe class="ueditor_baidumap" src="' + url + '"' + (styleStr ? ' style="' + styleStr + '"' :'') + ' frameborder="0" width="' + (mapWidth+4) + '" height="' + (mapHeight+4) + '"></iframe>');
+        } else {
+            var url = "http://api.map.baidu.com/staticimage?center=" + center.lng + ',' + center.lat +
+                    "&zoom=" + zoom + "&width=" + size.width + '&height=' + size.height + "&markers=" + point.lng + ',' + point.lat;
+            editor.execCommand('inserthtml', '<img width="'+ size.width +'"height="'+ size.height +'" src="' + url + '"' + (styleStr ? ' style="' + styleStr + '"' :'') + '/>');
+        }
+    };
+    document.getElementById("address").focus();
+</script>
+
+
+</body>
+</html>
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/map/show.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/map/show.html
new file mode 100644
index 0000000..329cfeb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/map/show.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8"/>
+    <meta name="keywords" content="百度地图,百度地图API,百度地图自定义工具,百度地图所见即所得工具"/>
+    <meta name="description" content="百度地图API自定义地图,帮助用户在可视化操作下生成百度地图"/>
+    <title>百度地图API自定义地图</title>
+    <!--引用百度地图API-->
+    <style type="text/css">
+        html, body {
+            margin: 0;
+            padding: 0;
+            overflow: hidden;
+        }
+    </style>
+    <script type="text/javascript" src="http://api.map.baidu.com/api?key=&v=1.1&services=true"></script>
+</head>
+
+<body onload="initMap();">
+<!--百度地图容器-->
+<div style="width:697px;height:550px;border:#ccc solid 1px;" id="dituContent"></div>
+</body>
+<script type="text/javascript">
+    function getParam(name) {
+        return location.href.match(new RegExp('[?#&]' + name + '=([^?#&]+)', 'i')) ? RegExp.$1 : '';
+    }
+    var map, marker;
+    var centerParam = getParam('center');
+    var zoomParam = getParam('zoom');
+    var widthParam = getParam('width');
+    var heightParam = getParam('height');
+    var markersParam = getParam('markers');
+    var markerStylesParam = getParam('markerStyles');
+
+    //创建和初始化地图函数:
+    function initMap() {
+        // [FF]切换模式后报错
+        if (!window.BMap) {
+            return;
+        }
+        var dituContent = document.getElementById('dituContent');
+        dituContent.style.width = widthParam + 'px';
+        dituContent.style.height = heightParam + 'px';
+
+        createMap();//创建地图
+        setMapEvent();//设置地图事件
+        addMapControl();//向地图添加控件
+
+        // 创建标注
+        var markersArr = markersParam.split(',');
+        var point = new BMap.Point(markersArr[0], markersArr[1]);
+        marker = new BMap.Marker(point);
+        marker.enableDragging();
+        map.addOverlay(marker); // 将标注添加到地图中
+
+        if(parent.editor && parent.document.body.contentEditable=="true") { //在编辑状态下
+            setMapListener();//地图改变修改外层的iframe标签src属性
+        }
+    }
+
+    //创建地图函数:
+    function createMap() {
+        map = new BMap.Map("dituContent");//在百度地图容器中创建一个地图
+        var centerArr = centerParam.split(',');
+        var point = new BMap.Point(parseFloat(centerArr[0]), parseFloat(centerArr[1]));//定义一个中心点坐标
+        map.centerAndZoom(point, parseInt(zoomParam));//设定地图的中心点和坐标并将地图显示在地图容器中
+    }
+
+    //地图事件设置函数:
+    function setMapEvent() {
+        map.enableDragging();//启用地图拖拽事件,默认启用(可不写)
+        map.enableScrollWheelZoom();//启用地图滚轮放大缩小
+        map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写)
+        map.enableKeyboard();//启用键盘上下左右键移动地图
+    }
+
+    //地图控件添加函数:
+    function addMapControl() {
+        //向地图中添加缩放控件
+        var ctrl_nav = new BMap.NavigationControl({anchor: BMAP_ANCHOR_TOP_LEFT, type: BMAP_NAVIGATION_CONTROL_LARGE});
+        map.addControl(ctrl_nav);
+        //向地图中添加缩略图控件
+        var ctrl_ove = new BMap.OverviewMapControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, isOpen: 1});
+        map.addControl(ctrl_ove);
+        //向地图中添加比例尺控件
+        var ctrl_sca = new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT});
+        map.addControl(ctrl_sca);
+    }
+
+    function setMapListener() {
+        var editor = parent.editor, containerIframe,
+            iframes = parent.document.getElementsByTagName('iframe');
+        for (var key in iframes) {
+            if (iframes[key].contentWindow == window) {
+                containerIframe = iframes[key];
+                break;
+            }
+        }
+        if (containerIframe) {
+            map.addEventListener('moveend', mapListenerHandler);
+            map.addEventListener('zoomend', mapListenerHandler);
+            marker.addEventListener('dragend', mapListenerHandler);
+        }
+
+        function mapListenerHandler() {
+            var zoom = map.getZoom(),
+                center = map.getCenter(),
+                marker = window.marker.getPoint();
+            containerIframe.src = containerIframe.src.
+                replace(new RegExp('([?#&])center=([^?#&]+)', 'i'), '$1center=' + center.lng + ',' + center.lat).
+                replace(new RegExp('([?#&])markers=([^?#&]+)', 'i'), '$1markers=' + marker.lng + ',' + marker.lat).
+                replace(new RegExp('([?#&])zoom=([^?#&]+)', 'i'), '$1zoom=' + zoom);
+            editor.fireEvent('saveScene');
+        }
+    }
+</script>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.css
new file mode 100644
index 0000000..8fb7a94
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.css
@@ -0,0 +1,30 @@
+.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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.html
new file mode 100644
index 0000000..e7ef04f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <title>插入音乐</title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="music.css">
+</head>
+<body>
+<div class="wrapper">
+    <div class="searchBar">
+        <input id="J_searchName" type="text"/>
+        <input type="button" class="searchBtn" id="J_searchBtn">
+    </div>
+    <div class="resultBar" id="J_resultBar">
+        <div class="loading" style="display:none"></div>
+        <div class="empty"><var id="lang_input_tips"></var></div>
+    </div>
+    <div id="J_preview"></div>
+</div>
+<script type="text/javascript" src="music.js"></script>
+<script type="text/javascript">
+    var music = new Music;
+    dialog.onok = function () {
+        music.exec();
+    };
+    dialog.oncancel = function () {
+        $G('J_preview').innerHTML = "";
+    };
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.js
new file mode 100644
index 0000000..1c538bf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/music/music.js
@@ -0,0 +1,192 @@
+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 = '<div class="loading"></div>';
+
+            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 = '<embed class="BDE_try_Music" allowfullscreen="false" pluginspage="http://www.macromedia.com/go/getflashplayer"';
+            html += ' src="' + playerUrl + '"';
+            html += ' width="1" height="1" style="position:absolute;left:-2000px;"';
+            html += ' type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false"';
+            html += ' menu="false" allowscriptaccess="never" scale="noborder">';
+            return html;
+        },
+        _byteLength:function (str) {
+            return str.replace(/[^\u0000-\u007f]/g, "\u0061\u0061").length;
+        },
+        _getMaxText:function (s) {
+            var me = this;
+            s = me._removeHtml(s);
+            if (me._byteLength(s) > 12)
+                return s.substring(0, 5) + '...';
+            if (!s) s = "&nbsp;";
+            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 '<div class="empty">' + lang.emptyTxt + '</div>';
+            data = me._rebuildData(data);
+            var s = [], p = [], t = [];
+            s.push('<div id="J_listPanel" class="listPanel">');
+            p.push('<div class="page">');
+            for (var i = 0, tmpList; tmpList = data[i++];) {
+                panels.push('panel' + i);
+                pages.push('page' + i);
+                if (i == 1) {
+                    s.push('<div id="panel' + i + '" class="panelon">');
+                    if (data.length != 1) {
+                        t.push('<div id="page' + i + '" onclick="music.onpageclick(' + i + ')" class="pageon">' + (i ) + '</div>');
+                    }
+                } else {
+                    s.push('<div id="panel' + i + '" class="paneloff">');
+                    t.push('<div id="page' + i + '" onclick="music.onpageclick(' + i + ')" class="pageoff">' + (i ) + '</div>');
+                }
+                s.push('<div class="m-box">');
+                s.push('<div class="m-h"><span class="m-t">' + lang.chapter + '</span><span class="m-s">' + lang.singer
+                    + '</span><span class="m-z">' + lang.special + '</span><span class="m-try-t">' + lang.listenTest + '</span></div>');
+                for (var j = 0, tmpObj; tmpObj = tmpList[j++];) {
+                    s.push('<label for="radio-' + i + '-' + j + '" class="m-m">');
+                    s.push('<input type="radio" id="radio-' + i + '-' + j + '" name="musicId" class="m-l" onclick="music.doselect(' + (me.pageSize * (i-1) + (j-1)) + ')"/>');
+                    s.push('<span class="m-t">' + me._getMaxText(tmpObj.title) + '</span>');
+                    s.push('<span class="m-s">' + me._getMaxText(tmpObj.author) + '</span>');
+                    s.push('<span class="m-z">' + me._getMaxText(tmpObj.album_title) + '</span>');
+                    s.push('<span class="m-try" onclick="music.doselect(' + (me.pageSize * (i-1) + (j-1)) + ');music.listenTest(this)"></span>');
+                    s.push('</label>');
+                }
+                s.push('</div>');
+                s.push('</div>');
+            }
+            t.reverse();
+            p.push(t.join(''));
+            s.push('</div>');
+            p.push('</div>');
+            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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/preview/preview.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/preview/preview.html
new file mode 100644
index 0000000..f6b433b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/preview/preview.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+    "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+        <style>
+            html,body{
+                height:100%;
+                width:100%;
+                padding:0;
+                margin:0;
+            }
+            #preview{
+                width:100%;
+                height:100%;
+                padding:0;
+                margin:0;
+            }
+            #preview *{font-family:sans-serif;font-size:16px;}
+        </style>
+        <script type="text/javascript" src="../internal.js"></script>
+        <script src="../../ueditor.parse.js"></script>
+        <title></title>
+    </head>
+    <body class="view">
+        <div id="preview" style="margin:8px">
+
+        </div>
+    </body>
+    <script>
+        document.getElementById('preview').innerHTML = editor.getContent();
+        uParse('#preview',{
+            rootPath : '../../',
+            chartContainerHeight:500
+        })
+        dialog.oncancel = function(){
+            document.getElementById('preview').innerHTML = '';
+        }
+    </script>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/addimg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/addimg.png
new file mode 100644
index 0000000..03a8713
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/addimg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/brush.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/brush.png
new file mode 100644
index 0000000..efa6fdb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/brush.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/delimg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/delimg.png
new file mode 100644
index 0000000..5a892e4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/delimg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/delimgH.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/delimgH.png
new file mode 100644
index 0000000..2f0c5c9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/delimgH.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/empty.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/empty.png
new file mode 100644
index 0000000..0375196
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/empty.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/emptyH.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/emptyH.png
new file mode 100644
index 0000000..838ca72
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/emptyH.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/eraser.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/eraser.png
new file mode 100644
index 0000000..63e87ce
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/eraser.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/redo.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/redo.png
new file mode 100644
index 0000000..12cd9bb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/redo.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/redoH.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/redoH.png
new file mode 100644
index 0000000..d9f33d3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/redoH.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/scale.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/scale.png
new file mode 100644
index 0000000..935a3f3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/scale.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/scaleH.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/scaleH.png
new file mode 100644
index 0000000..72e64a9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/scaleH.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/size.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/size.png
new file mode 100644
index 0000000..8366845
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/size.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/undo.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/undo.png
new file mode 100644
index 0000000..084c7cc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/undo.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/undoH.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/undoH.png
new file mode 100644
index 0000000..fde7eb3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/images/undoH.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.css
new file mode 100644
index 0000000..b18430d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.css
@@ -0,0 +1,72 @@
+/*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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.html
new file mode 100644
index 0000000..9371abd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="robots" content="noindex, nofollow"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="scrawl.css">
+</head>
+<body>
+<div class="main" id="J_wrap">
+    <div class="hot">
+        <div class="drawBoard border_style1">
+            <canvas id="J_brushBoard" class="brushBorad" width="360" height="300"></canvas>
+            <div id="J_picBoard" class="picBoard" style="width: 360px;height: 300px"></div>
+        </div>
+        <div id="J_operateBar" class="operateBar">
+            <span id="J_previousStep" class="previousStep">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_previousStep"></var></em>
+            </span>
+            <span id="J_nextStep" class="nextStep">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_nextsStep"></var></em>
+            </span>
+            <span id="J_clearBoard" class="clearBoard">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_clear"></var></em>
+            </span>
+            <span id="J_sacleBoard" class="scaleBoard">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_ScalePic"></var></em>
+            </span>
+        </div>
+    </div>
+    <div class="drawToolbar border_style1">
+        <div id="J_colorBar" class="colorBar"></div>
+        <div id="J_brushBar" class="sectionBar">
+            <em class="brushIcon"></em>
+            <a href="javascript:void(0)" class="size1">1</a>
+            <a href="javascript:void(0)" class="size2">3</a>
+            <a href="javascript:void(0)" class="size3">5</a>
+            <a href="javascript:void(0)" class="size4">7</a>
+        </div>
+        <div id="J_eraserBar" class="sectionBar">
+            <em class="eraserIcon"></em>
+            <a href="javascript:void(0)" class="size1">1</a>
+            <a href="javascript:void(0)" class="size2">3</a>
+            <a href="javascript:void(0)" class="size3">5</a>
+            <a href="javascript:void(0)" class="size4">7</a>
+        </div>
+        <div class="sectionBar">
+            <div id="J_addImg" class="addImgH">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_addPic"></var></em>
+                <form method="post" id="fileForm" enctype="multipart/form-data" class="addImgH_form" target="up">
+                    <input type="file" name="upfile" id="J_imgTxt"
+                           accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>
+                </form>
+                <iframe name="up" style="display: none"></iframe>
+            </div>
+        </div>
+        <div class="sectionBar">
+            <span id="J_removeImg" class="removeImg">
+                <em class="icon"></em>
+                <em class="text"><var id="lang_input_removePic"></var></em>
+            </span>
+        </div>
+    </div>
+</div>
+<div id="J_maskLayer" class="maskLayerNull"></div>
+
+<script type="text/javascript" src="scrawl.js"></script>
+<script type="text/javascript">
+    var settings = {
+        drawBrushSize:3, //画笔初始大小
+        drawBrushColor:"#4bacc6", //画笔初始颜色
+        colorList:['c00000', 'ff0000', 'ffc000', 'ffff00', '92d050', '00b050', '00b0f0', '0070c0', '002060', '7030a0', 'ffffff',
+            '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646'], //画笔选择颜色
+        saveNum:10  //撤销次数
+    };
+
+    var scrawlObj = new scrawl( settings );
+    scrawlObj.isCancelScrawl = false;
+
+    dialog.onok = function () {
+        exec( scrawlObj );
+        return false;
+    };
+    dialog.oncancel = function () {
+        scrawlObj.isCancelScrawl = true;
+    };
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.js
new file mode 100644
index 0000000..e0c005e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/scrawl/scrawl.js
@@ -0,0 +1,671 @@
+/**
+ * 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("<table id='J_colorList'>");
+            for (var i = 0, color; color = colorList[i++];) {
+                if ((i - 1) % 5 == 0) {
+                    if (i != 1) {
+                        arr.push("</tr>");
+                    }
+                    arr.push("<tr>");
+                }
+                tmp = '#' + color;
+                arr.push("<td><a title='" + tmp + "' href='javascript:void(0)' style='background-color:" + tmp + "'></a></td>");
+            }
+            arr.push("</tr></table>");
+            $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("<span class='hand" + i + "'></span>");
+        }
+        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 + "&nbsp;&nbsp;&nbsp;<input type='button' value='" + lang.continueBtn + "'  onclick='removeMaskLayer()'/>");
+    }
+}
+
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/searchreplace/searchreplace.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/searchreplace/searchreplace.html
new file mode 100644
index 0000000..b91f190
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/searchreplace/searchreplace.html
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .warpper{ position:relative;width: 380px; height: 100%; margin: 10px auto;}
+        .tabbody{height: 160px;}
+        .tabbody table{width:100%;border-collapse: separate;border-spacing: 3px;}
+        .tabbody .panel{width:373px;height:100%;padding-left: 5px;position: absolute;background-color: #fff;}
+        .tabbody input.int{ width:190px;height:21px;border:1px solid #d7d7d7;line-height:21px;}
+        .tabbody input.btn{padding: 0 5px; text-align:center;line-height:24px; text-decoration: none;height:24px;background:url("../../themes/default/images/dialog-title-bg.png") repeat-x;border:1px solid #ccc; }
+    </style>
+</head>
+<body>
+<div class="warpper" id="searchtab">
+    <div id="head" class="tabhead">
+        <span  tabsrc="find" class="focus"><var id="lang_tab_search"></var></span>
+        <span  tabsrc="replace" ><var id="lang_tab_replace"></var></span>
+    </div>
+    <div class="tabbody">
+        <div class="panel" id="find">
+            <table>
+                <tr>
+                    <td width="80"><var id="lang_search1"></var>: </td>
+                    <td><input id="findtxt" type="text" class="int" /></td>
+                </tr>
+                <!--<tr>-->
+
+                    <!--<td colspan="2"><span style="color:red"><var id="lang_searchReg"></var></span></td>-->
+                <!--</tr>-->
+                <tr>
+                    <td><var id="lang_case_sensitive1"></var></td>
+                    <td>
+                        <input id="matchCase" type="checkbox" />
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        <input id="nextFindBtn" type="button" class="btn" />
+                        <input id="preFindBtn" type="button" class="btn" />
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        &nbsp;
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        <span id="search-msg" style="color:red"></span>
+                    </td>
+                </tr>
+            </table>
+        </div>
+        <div class="panel" id="replace">
+            <table>
+                <tr>
+                    <td width="80"><var id="lang_search2"></var>: </td>
+                    <td><input id="findtxt1" type="text" class="int"  /></td>
+                </tr>
+                <!--<tr>-->
+
+                    <!--<td colspan="2"><span style="color:red"><var id="lang_searchReg1"></var></span></td>-->
+                <!--</tr>-->
+                <tr>
+                    <td><var id="lang_replace"></var>: </td>
+                    <td><input id="replacetxt" type="text" class="int" /></td>
+                </tr>
+                <tr>
+                    <td><var id="lang_case_sensitive2"></var></td>
+                    <td>
+                        <input id="matchCase1" type="checkbox" />
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        <input id="nextReplaceBtn" type="button" class="btn" />
+                        <input id="preReplaceBtn" type="button" class="btn" />
+                        <input id="repalceBtn" type="button" class="btn" />
+                        <input id="repalceAllBtn" type="button" class="btn" />
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        &nbsp;
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="2">
+                        <span id="replace-msg" style="color:red"></span>
+                    </td>
+                </tr>
+            </table>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="searchreplace.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/searchreplace/searchreplace.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/searchreplace/searchreplace.js
new file mode 100644
index 0000000..1b52857
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/searchreplace/searchreplace.js
@@ -0,0 +1,164 @@
+/**
+ * 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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/snapscreen/snapscreen.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/snapscreen/snapscreen.html
new file mode 100644
index 0000000..cf8209e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/snapscreen/snapscreen.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+        <title></title>
+        <script type="text/javascript" src="../internal.js"></script>
+        <style type="text/css">
+            *{color: #838383}
+            html,body {
+                font-size: 12px;
+                width:100%;
+                height:100%;
+                overflow: hidden;
+                margin:0px;
+                padding:0px;
+            }
+            h2 { font-size: 16px; margin: 20px auto;}
+            .content{
+                padding:5px 15px 0 15px;
+                height:100%;
+            }
+            dt,dd { margin-left: 0; padding-left: 0;}
+            dt a { display: block;
+                    height: 30px;
+                    line-height: 30px;
+                    width: 55px;
+                    background: #EFEFEF;
+                    border: 1px solid #CCC;
+                    padding: 0 10px;
+                    text-decoration: none;
+            }
+            dt a:hover{
+                background: #e0e0e0;
+                border-color: #999
+            }
+            dt a:active{
+                background: #ccc;
+                border-color: #999;
+                color: #666;
+            }
+            dd { line-height:20px;margin-top: 10px;}
+            span{ padding-right:4px;}
+            input{width:210px;height:21px;background: #FFF;border:1px solid #d7d7d7;padding: 0px; margin: 0px; }
+
+
+        </style>
+    </head>
+    <body>
+        <div class="content">
+            <h2><var id="lang_showMsg"></var></h2>
+            <dl>
+                <dt><a href="../../third-party/snapscreen/UEditorSnapscreen.exe" target="_blank" id="downlink"><var id="lang_download"></var></a></dt>
+                <dd><var id="lang_step1"></var></dd>
+                <dd><var id="lang_step2"></var></dd>
+            </dl>
+        </div>
+    </body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/spechars/spechars.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/spechars/spechars.html
new file mode 100644
index 0000000..0b5c416
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/spechars/spechars.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        html,body{overflow:hidden;}
+        #specharsTab{width: 97%;margin: 10px auto; zoom:1;position: relative}
+        .tabbody {height:447px;}
+        .tabbody span{ margin: 5px 3px;text-align: center;display:inline-block;width: 40px;height:16px;line-height: 16px;cursor: pointer; }
+    </style>
+</head>
+<body>
+    <div id="specharsTab">
+        <div id="tabHeads" class="tabhead"></div><div id="tabBodys" class="tabbody"></div>
+    </div>
+<script type="text/javascript" src="spechars.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/spechars/spechars.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/spechars/spechars.js
new file mode 100644
index 0000000..f4c155e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/spechars/spechars.js
@@ -0,0 +1,57 @@
+/**
+ * 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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/dragicon.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/dragicon.png
new file mode 100644
index 0000000..f26203b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/dragicon.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.css
new file mode 100644
index 0000000..c6f9396
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.css
@@ -0,0 +1,84 @@
+body{
+    overflow: hidden;
+    width: 540px;
+}
+.wrapper {
+    margin: 10px auto 0;
+    font-size: 12px;
+    overflow: hidden;
+    width: 520px;
+    height: 315px;
+}
+
+.clear {
+    clear: both;
+}
+
+.wrapper .left {
+    float: left;
+    margin-left: 10px;;
+}
+
+.wrapper .right {
+    float: right;
+    border-left: 2px dotted #EDEDED;
+    padding-left: 15px;
+}
+
+.section {
+    margin-bottom: 15px;
+    width: 240px;
+    overflow: hidden;
+}
+
+.section h3 {
+    font-weight: bold;
+    padding: 5px 0;
+    margin-bottom: 10px;
+    border-bottom: 1px solid #EDEDED;
+    font-size: 12px;
+}
+
+.section ul {
+    list-style: none;
+    overflow: hidden;
+    clear: both;
+
+}
+
+.section li {
+    float: left;
+    width: 120px;;
+}
+
+.section .tone {
+    width: 80px;;
+}
+
+.section .preview {
+    width: 220px;
+}
+
+.section .preview table {
+    text-align: center;
+    vertical-align: middle;
+    color: #666;
+}
+
+.section .preview caption {
+    font-weight: bold;
+}
+
+.section .preview td {
+    border-width: 1px;
+    border-style: solid;
+    height: 22px;
+}
+
+.section .preview th {
+    border-style: solid;
+    border-color: #DDD;
+    border-width: 2px 1px 1px 1px;
+    height: 22px;
+    background-color: #F7F7F7;
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.html
new file mode 100644
index 0000000..3c412fb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="edittable.css">
+</head>
+<body>
+<div class="wrapper">
+    <div class="left">
+        <div class="section">
+            <h3><var id="lang_tableStyle"></var></h3>
+            <ul>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_title" name="style"/><var id="lang_insertTitle"></var></label>
+                </li>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_titleCol" name="style"/><var id="lang_insertTitleCol"></var></label>
+                </li>
+            </ul>
+            <ul>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_caption" name="style"/><var id="lang_insertCaption"></var></label>
+                </li>
+                <li>
+                    <label onselectstart="return false"><input type="checkbox" id="J_sorttable" name="style"/><var id="lang_orderbycontent"></var></label>
+                </li>
+            </ul>
+            <div class="clear"></div>
+        </div>
+        <div class="section">
+            <h3><var id="lang_tableSize"></var></h3>
+            <ul>
+                <li>
+                    <label><input type="radio" id="J_autoSizeContent" name="size"/><var id="lang_autoSizeContent"></var></label>
+                </li>
+                <li>
+                    <label><input type="radio" id="J_autoSizePage" name="size"/><var id="lang_autoSizePage"></var></label>
+                </li>
+            </ul>
+            <div class="clear"></div>
+        </div>
+        <div class="section">
+            <h3><var id="lang_borderStyle"></var></h3>
+            <ul>
+                <li>
+                    <span><var id="lang_color"></var></span>
+                    <input type="text" class="tone" id="J_tone" readonly='readonly' />
+                </li>
+            </ul>
+            <div class="clear"></div>
+        </div>
+    </div>
+    <div class="right">
+        <div class="section">
+            <h3><var id="lang_example"></var></h3>
+            <div class="preview" id="J_preview">
+            </div>
+        </div>
+    </div>
+</div>
+<script type="text/javascript" src="edittable.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.js
new file mode 100644
index 0000000..11dbee7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittable.js
@@ -0,0 +1,237 @@
+/**
+ * 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 = '<span>^</span>';
+            arr.push("<table id='J_example'>");
+            if (hasCaption) {
+                arr.push("<caption>" + lang.captionName + "</caption>")
+            }
+            if (hasTitle) {
+                arr.push("<tr>");
+                if(hasTitleCol) { arr.push("<th>" + lang.titleName + "</th>"); }
+                for (var j = 0; j < 5; j++) {
+                    arr.push("<th>" + lang.titleName + "</th>");
+                }
+                arr.push("</tr>");
+            }
+            for (var i = 0; i < 6; i++) {
+                arr.push("<tr>");
+                if(hasTitleCol) { arr.push("<th>" + lang.titleName + "</th>") }
+                for (var k = 0; k < 5; k++) {
+                    arr.push("<td>" + lang.cellsName + "</td>")
+                }
+                arr.push("</tr>");
+            }
+            arr.push("</table>");
+            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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittd.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittd.html
new file mode 100644
index 0000000..49a52f7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittd.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .section {
+            text-align: center;
+            margin-top: 10px;
+        }
+        .section input {
+            margin-left: 5px;
+            width: 70px;
+        }
+    </style>
+</head>
+<body>
+<div class="section">
+    <span><var id="lang_tdBkColor"></var></span>
+    <input type="text" id="J_tone"/>
+</div>
+<script type="text/javascript">
+    var tone = $G("J_tone"),
+            colorPiker = new UE.ui.ColorPicker({
+                editor:editor
+            }),
+            colorPop = new UE.ui.Popup({
+                editor:editor,
+                content:colorPiker
+            });
+    domUtils.on(tone, "click", function () {
+        colorPop.showAnchor(tone);
+    });
+    domUtils.on(document, 'mousedown', function () {
+        colorPop.hide();
+    });
+    colorPiker.addListener("pickcolor", function () {
+        tone.value = arguments[1];
+        colorPop.hide();
+    });
+    colorPiker.addListener("picknocolor", function () {
+        tone.value="";
+        colorPop.hide();
+    });
+    dialog.onok=function(){
+        editor.execCommand("edittd",tone.value);
+    };
+
+    var start = editor.selection.getStart(),
+        cell = start && domUtils.findParentByTagName(start, ["td", "th"], true);
+    if(cell){
+        var color = domUtils.getComputedStyle(cell,'background-color');
+        if(/^#/.test(color)){
+            tone.value = color
+        }
+
+    }
+
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittip.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittip.html
new file mode 100644
index 0000000..954f7bb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/table/edittip.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>表格删除提示</title>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .section {
+            width: 200px;
+            margin: 10px auto 0;
+            font-size: 14px;
+        }
+
+        .item {
+            text-align: center;
+        }
+    </style>
+</head>
+<body>
+<div class="section">
+    <div class="item">
+        <label><input type="radio" id="J_delRow" name="cmd" checked/><var id="lang_delRow"></var></label>
+    </div>
+    <div class="item">
+        <label><input type="radio" id="J_delCol" name="cmd"/><var id="lang_delCol"></var></label>
+    </div>
+</div>
+<script type="text/javascript">
+    dialog.onok = function () {
+        $G("J_delRow").checked ? editor.execCommand("deleterow") : editor.execCommand("deletecol");
+    };
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/config.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/config.js
new file mode 100644
index 0000000..417b8f7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/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':'<p class="ue_t">&nbsp;欢迎使用UEditor!</p>',
+        "html":'<p class="ue_t">欢迎使用UEditor!</p>'
+
+    },
+    {
+        "pre":"pre1.png",
+        'title':lang.blog,
+        'preHtml':'<h1 label="Title center" name="tc" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;"><span style="color:#c0504d;">深入理解Range</span></h1><p style="text-align:center;"><strong class=" ">UEditor二次开发</strong></p><h3><span class=" " style="font-family:幼圆">什么是Range</span></h3><p style="text-indent:2em;">对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 </p><br /><h3><span class=" " style="font-family:幼圆">Range能干什么</span></h3><p style="text-indent:2em;">在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。</p>',
+        "html":'<h1 class="ue_t" label="Title center" name="tc" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;"><span style="color:#c0504d;">[键入文档标题]</span></h1><p style="text-align:center;"><strong class="ue_t">[键入文档副标题]</strong></p><h3><span class="ue_t" style="font-family:幼圆">[标题 1]</span></h3><p class="ue_t"  style="text-indent:2em;">对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。</p><h3><span class="ue_t" style="font-family:幼圆">[标题 2]</span></h3><p class="ue_t"  style="text-indent:2em;">在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。 您还可以使用“开始”选项卡上的其他控件来直接设置文本格式。大多数控件都允许您选择是使用当前主题外观,还是使用某种直接指定的格式。 </p><h3><span class="ue_t" style="font-family:幼圆">[标题 3]</span></h3><p class="ue_t">对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。</p><p class="ue_t"><br /></p>'
+
+    },
+    {
+        "pre":"pre2.png",
+        'title':lang.resume,
+        'preHtml':'<h1 label="Title left" name="tl" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;"><span style="color:#e36c09;" class=" ">WEB前端开发简历</span></h1><table width="100%" border="1" bordercolor="#95B3D7" style="border-collapse:collapse;"><tbody><tr><td width="100" style="text-align:center;"><p><span style="background-color:transparent;">插</span><br /></p><p>入</p><p>照</p><p>片</p></td><td><p><span style="background-color:transparent;"> 联系电话:</span><span class="ue_t" style="background-color:transparent;">[键入您的电话]</span><br /></p><p><span style="background-color:transparent;"> 电子邮件:</span><span class="ue_t" style="background-color:transparent;">[键入您的电子邮件地址]</span><br /></p><p><span style="background-color:transparent;"> 家庭住址:</span><span class="ue_t" style="background-color:transparent;">[键入您的地址]</span><br /></p></td></tr></tbody></table><h3><span style="color:#E36C09;font-size:20px;">目标职位</span></h3><p style="text-indent:2em;" class=" ">WEB前端研发工程师</p><h3><span style="color:#e36c09;font-size:20px;">学历</span></h3><p><span style="display:none;line-height:0px;" id="_baidu_bookmark_start_26"></span></p><ol style="list-style-type:decimal;"><li><p><span class="ue_t">[起止时间]</span> <span class="ue_t">[学校名称] </span> <span class="ue_t">[所学专业]</span> <span class="ue_t">[所获学位]</span></p></li></ol><h3><span style="color:#e36c09;font-size:20px;" class="ue_t">工作经验</span></h3><p><br /></p>',
+        "html":'<h1 label="Title left" name="tl" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;"><span style="color:#e36c09;" class="ue_t">[此处键入简历标题]</span></h1><p><span style="color:#e36c09;"><br /></span></p><table width="100%" border="1" bordercolor="#95B3D7" style="border-collapse:collapse;"><tbody><tr><td width="200" style="text-align:center;" class="ue_t">【此处插入照片】</td><td><p><br /></p><p> 联系电话:<span class="ue_t">[键入您的电话]</span></p><p><br /></p><p> 电子邮件:<span class="ue_t">[键入您的电子邮件地址]</span></p><p><br /></p><p> 家庭住址:<span class="ue_t">[键入您的地址]</span></p><p><br /></p></td></tr></tbody></table><h3><span style="color:#e36c09;font-size:20px;">目标职位</span></h3><p style="text-indent:2em;" class="ue_t">[此处键入您的期望职位]</p><h3><span style="color:#e36c09;font-size:20px;">学历</span></h3><p><span style="display:none;line-height:0px;" id="_baidu_bookmark_start_26"></span></p><ol style="list-style-type:decimal;"><li><p><span class="ue_t">[键入起止时间]</span> <span class="ue_t">[键入学校名称] </span> <span class="ue_t">[键入所学专业]</span> <span class="ue_t">[键入所获学位]</span></p></li><li><p><span class="ue_t">[键入起止时间]</span> <span class="ue_t">[键入学校名称]</span> <span class="ue_t">[键入所学专业]</span> <span class="ue_t">[键入所获学位]</span></p></li></ol><h3><span style="color:#e36c09;font-size:20px;" class="ue_t">工作经验</span></h3><ol style="list-style-type:decimal;"><li><p><span class="ue_t">[键入起止时间]</span> <span class="ue_t">[键入公司名称]</span> <span class="ue_t">[键入职位名称]</span> </p></li><ol style="list-style-type:lower-alpha;"><li><p><span class="ue_t">[键入负责项目]</span> <span class="ue_t">[键入项目简介]</span></p></li><li><p><span class="ue_t">[键入负责项目]</span> <span class="ue_t">[键入项目简介]</span></p></li></ol><li><p><span class="ue_t">[键入起止时间]</span> <span class="ue_t">[键入公司名称]</span> <span class="ue_t">[键入职位名称]</span> </p></li><ol style="list-style-type:lower-alpha;"><li><p><span class="ue_t">[键入负责项目]</span> <span class="ue_t">[键入项目简介]</span></p></li></ol></ol><p><span style="color:#e36c09;font-size:20px;">掌握技能</span></p><p style="text-indent:2em;"> &nbsp;<span class="ue_t">[这里可以键入您所掌握的技能]</span><br /></p>'
+
+    },
+    {
+        "pre":"pre3.png",
+        'title':lang.richText,
+        'preHtml':'<h1 label="Title center" name="tc" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;" class="ue_t">[此处键入文章标题]</h1><p><img src="http://img.baidu.com/hi/youa/y_0034.gif" width="150" height="100" border="0" hspace="0" vspace="0" style="width:150px;height:100px;float:left;" />图文混排方法</p><p>图片居左,文字围绕图片排版</p><p>方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文</p><p><br /></p><p><img src="http://img.baidu.com/hi/youa/y_0040.gif" width="100" height="100" border="0" hspace="0" vspace="0" style="width:100px;height:100px;float:right;" /></p><p>还有没有什么其他的环绕方式呢?这里是居右环绕</p><p><br /></p><p>欢迎大家多多尝试,为UEditor提供更多高质量模板!</p>',
+        "html":'<p><br /></p><h1 label="Title center" name="tc" style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;text-align:center;margin:0px 0px 20px;" class="ue_t">[此处键入文章标题]</h1><p><img src="http://img.baidu.com/hi/youa/y_0034.gif" width="300" height="200" border="0" hspace="0" vspace="0" style="width:300px;height:200px;float:left;" />图文混排方法</p><p>1. 图片居左,文字围绕图片排版</p><p>方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文本</p><p><br /></p><p>2. 图片居右,文字围绕图片排版</p><p>方法:在文字前面插入图片,设置居右对齐,然后即可在左边输入多行文本</p><p><br /></p><p>3. 图片居中环绕排版</p><p>方法:亲,这个真心没有办法。。。</p><p><br /></p><p><br /></p><p><img src="http://img.baidu.com/hi/youa/y_0040.gif" width="300" height="300" border="0" hspace="0" vspace="0" style="width:300px;height:300px;float:right;" /></p><p>还有没有什么其他的环绕方式呢?这里是居右环绕</p><p><br /></p><p>欢迎大家多多尝试,为UEditor提供更多高质量模板!</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p>占位</p><p><br /></p><p><br /></p>'
+    },
+    {
+        "pre":"pre4.png",
+        'title':lang.sciPapers,
+        'preHtml':'<h2 style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;text-align:center;" class="ue_t">[键入文章标题]</h2><p><strong><span style="font-size:12px;">摘要</span></strong><span style="font-size:12px;" class="ue_t">:这里可以输入很长很长很长很长很长很长很长很长很差的摘要</span></p><p style="line-height:1.5em;"><strong>标题 1</strong></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">这里可以输入很多内容,可以图文混排,可以有列表等。</span></p><p style="line-height:1.5em;"><strong>标题 2</strong></p><ol style="list-style-type:lower-alpha;"><li><p class="ue_t">列表 1</p></li><li><p class="ue_t">列表 2</p></li><ol style="list-style-type:lower-roman;"><li><p class="ue_t">多级列表 1</p></li><li><p class="ue_t">多级列表 2</p></li></ol><li><p class="ue_t">列表 3<br /></p></li></ol><p style="line-height:1.5em;"><strong>标题 3</strong></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">来个文字图文混排的</span></p><p style="text-indent:2em;"><br /></p>',
+        'html':'<h2 style="border-bottom-color:#cccccc;border-bottom-width:2px;border-bottom-style:solid;padding:0px 4px 0px 0px;margin:0px 0px 10px;text-align:center;" class="ue_t">[键入文章标题]</h2><p><strong><span style="font-size:12px;">摘要</span></strong><span style="font-size:12px;" class="ue_t">:这里可以输入很长很长很长很长很长很长很长很长很差的摘要</span></p><p style="line-height:1.5em;"><strong>标题 1</strong></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">这里可以输入很多内容,可以图文混排,可以有列表等。</span></p><p style="line-height:1.5em;"><strong>标题 2</strong></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">来个列表瞅瞅:</span></p><ol style="list-style-type:lower-alpha;"><li><p class="ue_t">列表 1</p></li><li><p class="ue_t">列表 2</p></li><ol style="list-style-type:lower-roman;"><li><p class="ue_t">多级列表 1</p></li><li><p class="ue_t">多级列表 2</p></li></ol><li><p class="ue_t">列表 3<br /></p></li></ol><p style="line-height:1.5em;"><strong>标题 3</strong></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">来个文字图文混排的</span></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">这里可以多行</span></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">右边是图片</span></p><p style="text-indent:2em;"><span style="font-size:14px;" class="ue_t">绝对没有问题的,不信你也可以试试看</span></p><p><br /></p>'
+    }
+];
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/bg.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/bg.gif
new file mode 100644
index 0000000..8c1d10a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/bg.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre0.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre0.png
new file mode 100644
index 0000000..8f3c16a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre0.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre1.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre1.png
new file mode 100644
index 0000000..5a03f96
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre1.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre2.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre2.png
new file mode 100644
index 0000000..5a55672
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre2.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre3.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre3.png
new file mode 100644
index 0000000..d852d29
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre3.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre4.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre4.png
new file mode 100644
index 0000000..0d7bc72
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/images/pre4.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/template.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/template.css
new file mode 100644
index 0000000..6c1608d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/template.css
@@ -0,0 +1,18 @@
+.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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/template.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/template.html
new file mode 100644
index 0000000..d9903a4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/template.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="template.css">
+</head>
+<body>
+    <div class="wrap">
+        <div class="left">
+            <div class="top">
+                <label><var id="lang_template_clear"></var>:<input id="issave" type="checkbox"></label>
+            </div>
+            <div class="bottom border_style1" id="preview"></div>
+        </div>
+        <fieldset  class="right border_style1">
+            <legend><var id="lang_template_select"></var></legend>
+            <div class="pre" id="preitem"></div>
+        </fieldset>
+        <div class="clear"></div>
+    </div>
+    <script type="text/javascript" src="config.js"></script>
+    <script type="text/javascript" src="template.js"></script>
+</body>
+</html>
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/template.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/template/template.js
new file mode 100644
index 0000000..80a334b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/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 += '<div class="preitem" onclick="pre(' + i + ')"><img src="' + "images/" + tmp.pre + '" ' + (tmp.title ? "alt=" + tmp.title + " title=" + tmp.title + "" : "") + '></div>';
+        }
+        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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/bg.png
new file mode 100644
index 0000000..580be0a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/center_focus.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/center_focus.jpg
new file mode 100644
index 0000000..262b029
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/center_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/file-icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/file-icons.gif
new file mode 100644
index 0000000..d8c02c2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/file-icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/file-icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/file-icons.png
new file mode 100644
index 0000000..3ff82c8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/file-icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/icons.gif
new file mode 100644
index 0000000..78459de
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/icons.png
new file mode 100644
index 0000000..12e4700
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/image.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/image.png
new file mode 100644
index 0000000..19699f6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/image.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/left_focus.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/left_focus.jpg
new file mode 100644
index 0000000..7886d27
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/left_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/none_focus.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/none_focus.jpg
new file mode 100644
index 0000000..7c768dc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/none_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/progress.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/progress.png
new file mode 100644
index 0000000..717c486
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/progress.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/right_focus.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/right_focus.jpg
new file mode 100644
index 0000000..173e10d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/right_focus.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/success.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/success.gif
new file mode 100644
index 0000000..8d4f311
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/success.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/success.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/success.png
new file mode 100644
index 0000000..94f968d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/images/success.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.css
new file mode 100644
index 0000000..5870e7a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.css
@@ -0,0 +1,635 @@
+@charset "utf-8";
+.wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative}
+.tabbody{height: 335px;}
+.tabbody .panel {
+    position: absolute;
+    width: 0;
+    height: 0;
+    background: #fff;
+    overflow: hidden;
+    display: none;
+}
+.tabbody .panel.focus {
+    width: 100%;
+    height: 335px;
+    display: block;
+}
+
+.tabbody .panel table td{vertical-align: middle;}
+#videoUrl {
+    width: 490px;
+    height: 21px;
+    line-height: 21px;
+    margin: 8px 5px;
+    background: #FFF;
+    border: 1px solid #d7d7d7;
+}
+#videoSearchTxt{margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;}
+#searchList{width: 570px;overflow: auto;zoom:1;height: 270px;}
+#searchList div{float: left;width: 120px;height: 135px;margin: 5px 15px;}
+#searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*不用缩略图*/
+#searchList p{margin-left: 10px;}
+#videoType{
+    width: 65px;
+    height: 23px;
+    line-height: 22px;
+    border: 1px solid #d7d7d7;
+}
+#videoSearchBtn,#videoSearchReset{
+    /*width: 80px;*/
+    height: 25px;
+    line-height: 25px;
+    background: #eee;
+    border: 1px solid #d7d7d7;
+    cursor: pointer;
+    padding: 0 5px;
+}
+
+
+
+#preview{position: relative;width: 420px;padding:0;overflow: hidden; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left}
+#preview .previewMsg {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;background-color: #666;}
+#preview .previewMsg span{display:block;margin: 125px auto 0 auto;text-align:center;font-size:18px;color:#fff;}
+#preview .previewVideo {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;}
+.edui-video-wrapper fieldset{
+    border: 1px solid #ddd;
+    padding-left: 5px;
+    margin-bottom: 20px;
+    padding-bottom: 5px;
+    width: 115px;
+}
+
+#videoInfo {width: 120px;float: left;margin-left: 10px;_margin-left:7px;}
+fieldset{
+    border: 1px solid #ddd;
+    padding-left: 5px;
+    margin-bottom: 20px;
+    padding-bottom: 5px;
+    width: 115px;
+}
+fieldset legend{font-weight: bold;}
+fieldset p{line-height: 30px;}
+fieldset input.txt{
+    width: 65px;
+    height: 21px;
+    line-height: 21px;
+    margin: 8px 5px;
+    background: #FFF;
+    border: 1px solid #d7d7d7;
+}
+label.url{font-weight: bold;margin-left: 5px;color: #06c;}
+#videoFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;}
+#videoFloat .focus{opacity: 1;filter: alpha(opacity = 100)}
+span.view{display: inline-block;width: 30px;float: right;cursor: pointer;color: blue}
+
+
+
+
+/* upload video */
+.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: 335px;
+    display: block;
+    clip: auto;
+}
+#upload_alignment div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;}
+#upload_alignment .focus{opacity: 1;filter: alpha(opacity = 100)}
+#upload_left { width:427px; float:left; }
+#upload_left .controller { height: 30px; clear: both; }
+#uploadVideoInfo{margin-top:10px;float:right;padding-right:8px;}
+
+#upload .queueList {
+    margin: 0;
+}
+
+#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;
+    margin-right:0;
+    border: 2px dashed #e6e6e6;
+    *border: 0px dashed #e6e6e6;
+    height: 161px;
+    padding-top: 150px;
+    text-align: center;
+    width: 97%;
+    float: left;
+    background: url(./images/image.png) center 70px no-repeat;
+    color: #cccccc;
+    font-size: 18px;
+    position: relative;
+    top:0;
+    *margin-left: 0;
+    *left: 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: 285px;
+}
+
+#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: 15px 0 0 20px;
+    *margin: 15px 0 0 15px;
+    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;
+}
+
+
+/* 在线文件的文件预览图标 */
+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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.html
new file mode 100644
index 0000000..5007882
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <link rel="stylesheet" type="text/css" href="video.css" />
+</head>
+<body>
+<div class="wrapper">
+    <div id="videoTab">
+        <div id="tabHeads" class="tabhead">
+            <span tabSrc="video" class="focus" data-content-id="video"><var id="lang_tab_insertV"></var></span>
+            <span tabSrc="upload" data-content-id="upload"><var id="lang_tab_uploadV"></var></span>
+        </div>
+        <div id="tabBodys" class="tabbody">
+            <div id="video" class="panel focus">
+               <table><tr><td><label for="videoUrl" class="url"><var id="lang_video_url"></var></label></td><td><input id="videoUrl" type="text"></td></tr></table>
+               <div id="preview"></div>
+               <div id="videoInfo">
+                   <fieldset>
+                       <legend><var id="lang_video_size"></var></legend>
+                       <table>
+                           <tr><td><label for="videoWidth"><var id="lang_videoW"></var></label></td><td><input class="txt" id="videoWidth" type="text"/></td></tr>
+                           <tr><td><label for="videoHeight"><var id="lang_videoH"></var></label></td><td><input class="txt" id="videoHeight" type="text"/></td></tr>
+                       </table>
+                   </fieldset>
+                   <fieldset>
+                      <legend><var id="lang_alignment"></var></legend>
+                      <div id="videoFloat"></div>
+                  </fieldset>
+               </div>
+            </div>
+            <div id="upload" class="panel">
+                <div id="upload_left">
+                    <div id="queueList" class="queueList">
+                        <div class="statusBar element-invisible">
+                            <div class="progress">
+                                <span class="text">0%</span>
+                                <span class="percentage"></span>
+                            </div><div class="info"></div>
+                            <div class="btns">
+                                <div id="filePickerBtn"></div>
+                                <div class="uploadBtn"><var id="lang_start_upload"></var></div>
+                            </div>
+                        </div>
+                        <div id="dndArea" class="placeholder">
+                            <div class="filePickerContainer">
+                                <div id="filePickerReady"></div>
+                            </div>
+                        </div>
+                        <ul class="filelist element-invisible">
+                            <li id="filePickerBlock" class="filePickerBlock"></li>
+                        </ul>
+                    </div>
+                </div>
+                <div id="uploadVideoInfo">
+                    <fieldset>
+                        <legend><var id="lang_upload_size"></var></legend>
+                        <table>
+                            <tr><td><label><var id="lang_upload_width"></var></label></td><td><input class="txt" id="upload_width" type="text"/></td></tr>
+                            <tr><td><label><var id="lang_upload_height"></var></label></td><td><input class="txt" id="upload_height" type="text"/></td></tr>
+                        </table>
+                    </fieldset>
+                    <fieldset>
+                        <legend><var id="lang_upload_alignment"></var></legend>
+                        <div id="upload_alignment"></div>
+                    </fieldset>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<!-- jquery -->
+<script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
+
+<!-- webuploader -->
+<script type="text/javascript" src="../../third-party/webuploader/webuploader.min.js"></script>
+<link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
+
+<!-- video -->
+<script type="text/javascript" src="video.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.js
new file mode 100644
index 0000000..a8c34d9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/video/video.js
@@ -0,0 +1,791 @@
+/**
+ * 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 = '<div class="previewMsg"><span>'+lang.urlError+'</span></div>'+
+        '<embed class="previewVideo" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
+            ' src="' + conUrl + '"' +
+            ' width="' + 420  + '"' +
+            ' height="' + 280  + '"' +
+            ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >' +
+        '</embed>';
+    }
+
+
+    /* 插入上传视频 */
+    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('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
+            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($('<div>').html(lang.errorNotSupport)).hide();
+                return;
+            } else if (!editor.getOpt('videoActionName')) {
+                $('#filePickerReady').after($('<div>').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 = $('<li id="' + file.id + '">' +
+                        '<p class="title">' + file.name + '</p>' +
+                        '<p class="imgWrap"></p>' +
+                        '<p class="progress"><span></span></p>' +
+                        '</li>'),
+
+                    $btns = $('<div class="file-panel">' +
+                        '<span class="cancel">' + lang.uploadDelete + '</span>' +
+                        '<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
+                        '<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
+                    $prgress = $li.find('p.progress span'),
+                    $wrap = $li.find('p.imgWrap'),
+                    $info = $('<p class="error"></p>').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('<i class="file-preview file-type-' + file.ext.toLowerCase() + '"></i>' +
+                            '<span class="file-title">' + file.name + '</span>');
+                    } 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 = $('<img src="' + src + '">');
+                                    $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('<span class="success"></span>');
+                    } 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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/webapp/webapp.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/webapp/webapp.html
new file mode 100644
index 0000000..1614377
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/webapp/webapp.html
@@ -0,0 +1,53 @@
+<!DOCTYPE>
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .wrapper{width: 540px; margin: 10px auto;}
+        #appShow {border: 1px solid #ddd;}
+        .errorMsg{font-size: 13px;margin: 10px;color: #dd0000}
+    </style>
+</head>
+<body>
+    <div class="wrapper">
+        <div id="appShow"></div>
+    </div>
+    <script type="text/javascript">
+        //此处配置您在百度上申请到的appkey。
+        var apikey = editor.options.webAppKey;
+        if ( apikey && apikey.length == 24 ) {
+            var searchConfig = {
+                container:'appShow', //容器ID
+                tips:"", //该值用于自动清空
+                search:1, //是否显示搜索框
+                ps:12, //每页显示的条数
+                suggest:1, //是否开启搜索自动完成
+                limit:0, //搜索结果显示条数,0表示无限制
+                searchNow:0, //是否在初始化完成时立即搜索
+                apikey:apikey, //每人得
+                pager:1,
+                cid:7134562,
+                outputHTML:1
+            },baiduApp;
+
+            function clickCallback() {
+                baiduApp.addEventListener( 'getAppHTML', function ( e, data ) {
+                    var url = 'http://app.baidu.com/app/enter?appid='+data.data['app_id'] +'&tn=app_canvas&app_spce_id=1&apikey='+apikey+'&api_key=' + apikey;
+                    editor.execCommand( "webapp", {url:url,width:data.uniWidth,height:data.uniHeight+60,logo:data.data['app_logo'],title:data.data['app_name']});
+                    dialog.close();
+                } );
+            }
+
+            var script = document.createElement( "script" );
+            script.type = "text/javascript";
+            script.src = "http://app.baidu.com/appweb/api/search?auto=yes&container=container&apikey=" + apikey + "&instanceName=baiduApp&callback=clickCallback&config=searchConfig";
+            document.body.appendChild( script );
+        } else {
+            $G( "appShow" ).innerHTML = "<p class='errorMsg'>"+lang.tip1+"<a title='"+lang.anthorApi+"' href='http://app.baidu.com/static/cms/getapikey.html' target='_blank'>"+lang.applyFor+"</a></p><p class='errorMsg'>"+lang.tip2+"</p>" ;
+        }
+
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/fClipboard_ueditor.swf b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/fClipboard_ueditor.swf
new file mode 100644
index 0000000..ac5d27f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/fClipboard_ueditor.swf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/imageUploader.swf b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/imageUploader.swf
new file mode 100644
index 0000000..2a554ca
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/imageUploader.swf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/tangram.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/tangram.js
new file mode 100644
index 0000000..2ebd8fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/tangram.js
@@ -0,0 +1,1495 @@
+// Copyright (c) 2009, Baidu Inc. All rights reserved.
+// 
+// Licensed under the BSD License
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// 
+//      http:// tangram.baidu.com/license.html
+// 
+// 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.
+ /**
+ * @namespace T Tangram七巧板
+ * @name T
+ * @version 1.6.0
+*/
+
+/**
+ * 声明baidu包
+ * @author: allstar, erik, meizz, berg
+ */
+var T,
+    baidu = T = baidu || {version: "1.5.0"};
+baidu.guid = "$BAIDU$";
+baidu.$$ = window[baidu.guid] = window[baidu.guid] || {global:{}};
+
+/**
+ * 使用flash资源封装的一些功能
+ * @namespace baidu.flash
+ */
+baidu.flash = baidu.flash || {};
+
+/**
+ * 操作dom的方法
+ * @namespace baidu.dom 
+ */
+baidu.dom = baidu.dom || {};
+
+
+/**
+ * 从文档中获取指定的DOM元素
+ * @name baidu.dom.g
+ * @function
+ * @grammar baidu.dom.g(id)
+ * @param {string|HTMLElement} id 元素的id或DOM元素.
+ * @shortcut g,T.G
+ * @meta standard
+ * @see baidu.dom.q
+ *
+ * @return {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数.
+ */
+baidu.dom.g = function(id) {
+    if (!id) return null;
+    if ('string' == typeof id || id instanceof String) {
+        return document.getElementById(id);
+    } else if (id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) {
+        return id;
+    }
+    return null;
+};
+baidu.g = baidu.G = baidu.dom.g;
+
+
+/**
+ * 操作数组的方法
+ * @namespace baidu.array
+ */
+
+baidu.array = baidu.array || {};
+
+
+/**
+ * 遍历数组中所有元素
+ * @name baidu.array.each
+ * @function
+ * @grammar baidu.array.each(source, iterator[, thisObject])
+ * @param {Array} source 需要遍历的数组
+ * @param {Function} iterator 对每个数组元素进行调用的函数,该函数有两个参数,第一个为数组元素,第二个为数组索引值,function (item, index)。
+ * @param {Object} [thisObject] 函数调用时的this指针,如果没有此参数,默认是当前遍历的数组
+ * @remark
+ * each方法不支持对Object的遍历,对Object的遍历使用baidu.object.each 。
+ * @shortcut each
+ * @meta standard
+ *             
+ * @returns {Array} 遍历的数组
+ */
+ 
+baidu.each = baidu.array.forEach = baidu.array.each = function (source, iterator, thisObject) {
+    var returnValue, item, i, len = source.length;
+    
+    if ('function' == typeof iterator) {
+        for (i = 0; i < len; i++) {
+            item = source[i];
+            returnValue = iterator.call(thisObject || source, item, i);
+    
+            if (returnValue === false) {
+                break;
+            }
+        }
+    }
+    return source;
+};
+
+/**
+ * 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。
+ * @namespace baidu.lang
+ */
+baidu.lang = baidu.lang || {};
+
+
+/**
+ * 判断目标参数是否为function或Function实例
+ * @name baidu.lang.isFunction
+ * @function
+ * @grammar baidu.lang.isFunction(source)
+ * @param {Any} source 目标参数
+ * @version 1.2
+ * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
+ * @meta standard
+ * @returns {boolean} 类型判断结果
+ */
+baidu.lang.isFunction = function (source) {
+    return '[object Function]' == Object.prototype.toString.call(source);
+};
+
+/**
+ * 判断目标参数是否string类型或String对象
+ * @name baidu.lang.isString
+ * @function
+ * @grammar baidu.lang.isString(source)
+ * @param {Any} source 目标参数
+ * @shortcut isString
+ * @meta standard
+ * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate
+ *             
+ * @returns {boolean} 类型判断结果
+ */
+baidu.lang.isString = function (source) {
+    return '[object String]' == Object.prototype.toString.call(source);
+};
+baidu.isString = baidu.lang.isString;
+
+
+/**
+ * 判断浏览器类型和特性的属性
+ * @namespace baidu.browser
+ */
+baidu.browser = baidu.browser || {};
+
+
+/**
+ * 判断是否为opera浏览器
+ * @property opera opera版本号
+ * @grammar baidu.browser.opera
+ * @meta standard
+ * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome
+ * @returns {Number} opera版本号
+ */
+
+/**
+ * opera 从10开始不是用opera后面的字符串进行版本的判断
+ * 在Browser identification最后添加Version + 数字进行版本标识
+ * opera后面的数字保持在9.80不变
+ */
+baidu.browser.opera = /opera(\/| )(\d+(\.\d+)?)(.+?(version\/(\d+(\.\d+)?)))?/i.test(navigator.userAgent) ?  + ( RegExp["\x246"] || RegExp["\x242"] ) : undefined;
+
+
+/**
+ * 在目标元素的指定位置插入HTML代码
+ * @name baidu.dom.insertHTML
+ * @function
+ * @grammar baidu.dom.insertHTML(element, position, html)
+ * @param {HTMLElement|string} element 目标元素或目标元素的id
+ * @param {string} position 插入html的位置信息,取值为beforeBegin,afterBegin,beforeEnd,afterEnd
+ * @param {string} html 要插入的html
+ * @remark
+ * 
+ * 对于position参数,大小写不敏感<br>
+ * 参数的意思:beforeBegin&lt;span&gt;afterBegin   this is span! beforeEnd&lt;/span&gt; afterEnd <br />
+ * 此外,如果使用本函数插入带有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,'&amp;')
+                .replace(/</g,'&lt;')
+                .replace(/>/g,'&gt;')
+                .replace(/"/g, "&quot;")
+                .replace(/'/g, "&#39;");
+};
+
+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 = ['<object '];
+    for (i = 0, len = objProperties.length; i < len; i++) {
+        item = objProperties[i];
+        str.push(' ', item, '="', encodeHTML(options[item]), '"');
+    }
+    str.push('>');
+    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('<param name="' + k + '" value="' + encodeHTML(item) + '" />');
+        }
+    }
+    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('<embed');
+    var salign;
+    for (k in options) {
+        item = options[k];
+        if (item || item === false || item === 0) {
+            if ((new RegExp("^salign\x24", "i")).test(k)) {
+                salign = item;
+                continue;
+            }
+            
+            str.push(' ', k, '="', encodeHTML(item), '"');
+        }
+    }
+    
+    if (salign) {
+        str.push(' salign="', encodeHTML(salign), '"');
+    }
+    str.push('></embed></object>');
+    
+    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相同的成员将会被覆盖。<br>
+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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/wordimage.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/wordimage.html
new file mode 100644
index 0000000..6cf6067
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/wordimage.html
@@ -0,0 +1,111 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title></title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" src="../internal.js"></script>
+    <style type="text/css">
+        .wrapper{width: 600px;padding: 10px;height: 352px;overflow: hidden;position: relative;border-bottom: 1px solid #d7d7d7}
+        .localPath input{float: left;width: 350px;line-height: 20px;height: 20px;}
+        #clipboard{float:left;width: 70px;height: 30px; }
+        .description{ color: #0066cc; margin-top: 2px; width: 450px; height: 45px;float: left;line-height: 22px}
+        #upload{width: 100px;height: 30px;float: right; margin:10px 2px 0 0;cursor: pointer;}
+        #msg{ width: 140px; height: 30px; line-height:25px;float: left;color: red}
+    </style>
+</head>
+<body>
+    <div class="wrapper">
+        <div class="localPath">
+            <input id="localPath" type="text" readonly />
+            <div id="clipboard"></div>
+            <div id="msg"></div>
+        </div>
+        <div id="flashContainer"></div>
+        <div>
+            <div id="upload" style="display: none" ><img id="uploadBtn"></div>
+            <div class="description">
+                <span style="color: red"><var id="lang_resave"></var>: </span><var id="lang_step"></var>
+            </div>
+          </div>
+    </div>
+    <script type="text/javascript" src="tangram.js"></script>
+    <script type="text/javascript" src="wordimage.js"></script>
+    <script type="text/javascript">
+        editor.setOpt({
+            wordImageFieldName:"upfile",
+            compressSide:0,
+            maxImageSideLength:900
+        });
+
+            //全局变量
+        var imageUrls = [],          //用于保存从服务器返回的图片信息数组
+            selectedImageCount = 0,  //当前已选择的但未上传的图片数量
+            optImageUrl = editor.getActionUrl(editor.getOpt('imageActionName')),
+            optImageFieldName = editor.getOpt('imageFieldName'),
+            optImageCompressBorder = editor.getOpt('imageCompressEnable') ? editor.getOpt('imageCompressBorder'):null,
+            maxSize = editor.getOpt('imageMaxSize') / 1024,
+            extension = editor.getOpt('imageAllowFiles').join(';').replace(/\./g, '*.');
+
+        /* 添加额外的GET参数 */
+        var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
+            urlWidthParams = optImageUrl + (optImageUrl.indexOf('?') == -1 ? '?':'&') + params;
+
+        utils.domReady(function(){
+            //创建Flash相关的参数集合
+            var flashOptions = {
+                container:"flashContainer",                                                    //flash容器id
+                url:urlWidthParams,                                           // 上传处理页面的url地址
+                ext:editor.queryCommandValue('serverParam') || {},                                 //可向服务器提交的自定义参数列表
+                fileType:'{"description":"'+lang.fileType+'", "extension":"' + extension + '"}',     //上传文件格式限制
+                flashUrl:'imageUploader.swf',                                                  //上传用的flash组件地址
+                width:600,          //flash的宽度
+                height:272,         //flash的高度
+                gridWidth:120,     // 每一个预览图片所占的宽度
+                gridHeight:120,    // 每一个预览图片所占的高度
+                picWidth:100,      // 单张预览图片的宽度
+                picHeight:100,     // 单张预览图片的高度
+                uploadDataFieldName: optImageFieldName,    // POST请求中图片数据的key
+                picDescFieldName:'pictitle',      // POST请求中图片描述的key
+                maxSize: maxSize,                         // 文件的最大体积,单位M
+                compressSize:1,                   // 上传前如果图片体积超过该值,会先压缩,单位M
+                maxNum:32,                         // 单次最大可上传多少个文件
+                compressSide: 0,                 //等比压缩的基准,0为按照最长边,1为按照宽度,2为按照高度
+                compressLength: optImageCompressBorder        //能接受的最大边长,超过该值Flash会自动等比压缩
+            };
+            //回调函数集合,支持传递函数名的字符串、函数句柄以及函数本身三种类型
+            var callbacks={
+                selectFileCallback: function(selectFiles){                // 选择文件的回调
+                    selectedImageCount += selectFiles.length;
+                    if(selectedImageCount) baidu.g("upload").style.display = "";
+                    dialog.buttons[0].setDisabled(true); //初始化时置灰确定按钮
+                },
+                deleteFileCallback: function(delFiles){                 // 删除文件的回调
+                    selectedImageCount -= delFiles.length;
+                    if (!selectedImageCount) {
+                        baidu.g("upload").style.display = "none";
+                        dialog.buttons[0].setDisabled(false);         //没有选择图片时重新点亮按钮
+                    }
+                },
+                uploadCompleteCallback: function(data){               // 单个文件上传完成的回调
+                    try{var info = eval("(" + data.info + ")");
+                    info && imageUrls.push(info);
+                    selectedImageCount--;
+                    }catch(e){}
+                },
+                uploadErrorCallback: function (data){         // 单个文件上传失败的回调,
+                    console && console.log(data);
+                },
+                allCompleteCallback: function(){              // 全部上传完成时的回调
+                    dialog.buttons[0].setDisabled(false);    //上传完毕后点亮按钮
+                }
+                //exceedFileCallback: 'exceedFileCallback',   // 文件超出限制的最大体积时的回调
+                //startUploadCallback: startUploadCallback    // 开始上传某个文件时的回调
+            };
+            wordImage.init(flashOptions,callbacks);
+        });
+
+    </script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/wordimage.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/wordimage.js
new file mode 100644
index 0000000..98f3a22
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/dialogs/wordimage/wordimage.js
@@ -0,0 +1,157 @@
+/**
+ * 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 + "</br>";
+	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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/index.html b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/index.html
new file mode 100644
index 0000000..a416418
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/index.html
@@ -0,0 +1,175 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <title>完整demo</title>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+    <script type="text/javascript" charset="utf-8" src="ueditor.config.js"></script>
+    <script type="text/javascript" charset="utf-8" src="ueditor.all.min.js"> </script>
+    <!--建议手动加在语言,避免在ie下有时因为加载语言失败导致编辑器加载失败-->
+    <!--这里加载的语言文件会覆盖你在配置项目里添加的语言类型,比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文-->
+    <script type="text/javascript" charset="utf-8" src="lang/zh-cn/zh-cn.js"></script>
+
+    <style type="text/css">
+        div{
+            width:100%;
+        }
+    </style>
+</head>
+<body>
+<div>
+    <h1>完整demo</h1>
+    <script id="editor" type="text/plain" style="width:1024px;height:500px;"></script>
+</div>
+<div id="btns">
+    <div>
+        <button onclick="getAllHtml()">获得整个html的内容</button>
+        <button onclick="getContent()">获得内容</button>
+        <button onclick="setContent()">写入内容</button>
+        <button onclick="setContent(true)">追加内容</button>
+        <button onclick="getContentTxt()">获得纯文本</button>
+        <button onclick="getPlainTxt()">获得带格式的纯文本</button>
+        <button onclick="hasContent()">判断是否有内容</button>
+        <button onclick="setFocus()">使编辑器获得焦点</button>
+        <button onmousedown="isFocus(event)">编辑器是否获得焦点</button>
+        <button onmousedown="setblur(event)" >编辑器失去焦点</button>
+
+    </div>
+    <div>
+        <button onclick="getText()">获得当前选中的文本</button>
+        <button onclick="insertHtml()">插入给定的内容</button>
+        <button id="enable" onclick="setEnabled()">可以编辑</button>
+        <button onclick="setDisabled()">不可编辑</button>
+        <button onclick=" UE.getEditor('editor').setHide()">隐藏编辑器</button>
+        <button onclick=" UE.getEditor('editor').setShow()">显示编辑器</button>
+        <button onclick=" UE.getEditor('editor').setHeight(300)">设置高度为300默认关闭了自动长高</button>
+    </div>
+
+    <div>
+        <button onclick="getLocalData()" >获取草稿箱内容</button>
+        <button onclick="clearLocalData()" >清空草稿箱</button>
+    </div>
+
+</div>
+<div>
+    <button onclick="createEditor()">
+    创建编辑器</button>
+    <button onclick="deleteEditor()">
+    删除编辑器</button>
+</div>
+
+<script type="text/javascript">
+
+    //实例化编辑器
+    //建议使用工厂方法getEditor创建和引用编辑器实例,如果在某个闭包下引用该编辑器,直接调用UE.getEditor('editor')就能拿到相关的实例
+    var ue = UE.getEditor('editor');
+
+
+    function isFocus(e){
+        alert(UE.getEditor('editor').isFocus());
+        UE.dom.domUtils.preventDefault(e)
+    }
+    function setblur(e){
+        UE.getEditor('editor').blur();
+        UE.dom.domUtils.preventDefault(e)
+    }
+    function insertHtml() {
+        var value = prompt('插入html代码', '');
+        UE.getEditor('editor').execCommand('insertHtml', value)
+    }
+    function createEditor() {
+        enableBtn();
+        UE.getEditor('editor');
+    }
+    function getAllHtml() {
+        alert(UE.getEditor('editor').getAllHtml())
+    }
+    function getContent() {
+        var arr = [];
+        arr.push("使用editor.getContent()方法可以获得编辑器的内容");
+        arr.push("内容为:");
+        arr.push(UE.getEditor('editor').getContent());
+        alert(arr.join("\n"));
+    }
+    function getPlainTxt() {
+        var arr = [];
+        arr.push("使用editor.getPlainTxt()方法可以获得编辑器的带格式的纯文本内容");
+        arr.push("内容为:");
+        arr.push(UE.getEditor('editor').getPlainTxt());
+        alert(arr.join('\n'))
+    }
+    function setContent(isAppendTo) {
+        var arr = [];
+        arr.push("使用editor.setContent('欢迎使用ueditor')方法可以设置编辑器的内容");
+        UE.getEditor('editor').setContent('欢迎使用ueditor', isAppendTo);
+        alert(arr.join("\n"));
+    }
+    function setDisabled() {
+        UE.getEditor('editor').setDisabled('fullscreen');
+        disableBtn("enable");
+    }
+
+    function setEnabled() {
+        UE.getEditor('editor').setEnabled();
+        enableBtn();
+    }
+
+    function getText() {
+        //当你点击按钮时编辑区域已经失去了焦点,如果直接用getText将不会得到内容,所以要在选回来,然后取得内容
+        var range = UE.getEditor('editor').selection.getRange();
+        range.select();
+        var txt = UE.getEditor('editor').selection.getText();
+        alert(txt)
+    }
+
+    function getContentTxt() {
+        var arr = [];
+        arr.push("使用editor.getContentTxt()方法可以获得编辑器的纯文本内容");
+        arr.push("编辑器的纯文本内容为:");
+        arr.push(UE.getEditor('editor').getContentTxt());
+        alert(arr.join("\n"));
+    }
+    function hasContent() {
+        var arr = [];
+        arr.push("使用editor.hasContents()方法判断编辑器里是否有内容");
+        arr.push("判断结果为:");
+        arr.push(UE.getEditor('editor').hasContents());
+        alert(arr.join("\n"));
+    }
+    function setFocus() {
+        UE.getEditor('editor').focus();
+    }
+    function deleteEditor() {
+        disableBtn();
+        UE.getEditor('editor').destroy();
+    }
+    function disableBtn(str) {
+        var div = document.getElementById('btns');
+        var btns = UE.dom.domUtils.getElementsByTagName(div, "button");
+        for (var i = 0, btn; btn = btns[i++];) {
+            if (btn.id == str) {
+                UE.dom.domUtils.removeAttributes(btn, ["disabled"]);
+            } else {
+                btn.setAttribute("disabled", "true");
+            }
+        }
+    }
+    function enableBtn() {
+        var div = document.getElementById('btns');
+        var btns = UE.dom.domUtils.getElementsByTagName(div, "button");
+        for (var i = 0, btn; btn = btns[i++];) {
+            UE.dom.domUtils.removeAttributes(btn, ["disabled"]);
+        }
+    }
+
+    function getLocalData () {
+        alert(UE.getEditor('editor').execCommand( "getlocaldata" ));
+    }
+
+    function clearLocalData () {
+        UE.getEditor('editor').execCommand( "clearlocaldata" );
+        alert("已清空草稿箱")
+    }
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/jsp/config.json b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/jsp/config.json
new file mode 100644
index 0000000..5c5ffc2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/jsp/config.json
@@ -0,0 +1,94 @@
+/* 前后端通信相关的配置,注释只允许使用多行方式 */
+{
+    /* 上传图片配置项 */
+    "imageActionName": "uploadimage", /* 执行上传图片的action名称 */
+    "imageFieldName": "upfile", /* 提交的图片表单名称 */
+    "imageMaxSize": 2048000, /* 上传大小限制,单位B */
+    "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */
+    "imageCompressEnable": true, /* 是否压缩图片,默认是true */
+    "imageCompressBorder": 1600, /* 图片压缩最长边限制 */
+    "imageInsertAlign": "none", /* 插入的图片浮动方式 */
+    "imageUrlPrefix": "http://127.0.0.1:8080/YunYou", /* 图片访问路径前缀 */
+    "imagePathFormat": "/ueditor/jsp/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": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */
+    "scrawlUrlPrefix": "http://127.0.0.1:8080/neighbor", /* 图片访问路径前缀 */
+    "scrawlInsertAlign": "none",
+
+    /* 截图工具上传 */
+    "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */
+    "snapscreenPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "snapscreenUrlPrefix": "http://127.0.0.1:8080/neighbor", /* 图片访问路径前缀 */
+    "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */
+
+    /* 抓取远程图片配置 */
+    "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"],
+    "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */
+    "catcherFieldName": "source", /* 提交的图片列表表单名称 */
+    "catcherPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "catcherUrlPrefix": "http://127.0.0.1:8080/neighbor", /* 图片访问路径前缀 */
+    "catcherMaxSize": 2048000, /* 上传大小限制,单位B */
+    "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */
+
+    /* 上传视频配置 */
+    "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */
+    "videoFieldName": "upfile", /* 提交的视频表单名称 */
+    "videoPathFormat": "/ueditor/jsp/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "videoUrlPrefix": "http://127.0.0.1:8080/neighbor", /* 视频访问路径前缀 */
+    "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": "/ueditor/jsp/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */
+    "fileUrlPrefix": "http://127.0.0.1:8080/neighbor", /* 文件访问路径前缀 */
+    "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"
+    ], /* 上传文件格式显示 */
+
+    /* 列出指定目录下的图片 */
+    "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */
+    "imageManagerListPath": "/ueditor/jsp/upload/image/", /* 指定要列出图片的目录 */
+    "imageManagerListSize": 20, /* 每次列出文件数量 */
+    "imageManagerUrlPrefix": "http://127.0.0.1:8080/neighbor", /* 图片访问路径前缀 */
+    "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */
+    "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */
+
+    /* 列出指定目录下的文件 */
+    "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */
+    "fileManagerListPath": "/ueditor/jsp/upload/file/", /* 指定要列出文件的目录 */
+    "fileManagerUrlPrefix": "http://127.0.0.1:8080/neighbor", /* 文件访问路径前缀 */
+    "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"
+    ] /* 列出的文件类型 */
+
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/jsp/controller.jsp b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/jsp/controller.jsp
new file mode 100644
index 0000000..6a3ef2f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/jsp/controller.jsp
@@ -0,0 +1,14 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+	import="com.baidu.ueditor.ActionEnter"
+    pageEncoding="UTF-8"%>
+<%@ page trimDirectiveWhitespaces="true" %>
+<%
+
+    request.setCharacterEncoding( "utf-8" );
+	response.setHeader("Content-Type" , "text/html");
+	
+	String rootPath = application.getRealPath( "/" );
+	
+	out.write( new ActionEnter( request, rootPath ).exec() );
+	
+%>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/en.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/en.js
new file mode 100644
index 0000000..c7e22f5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/en.js
@@ -0,0 +1,684 @@
+/**
+ * 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':'<span style="color:red;">The number of characters has exceeded allowable maximum values, the server may refuse to save!</span>',
+    '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':" &nbsp;The video is loading, please wait…",
+        'clickToSelect':"Click to select",
+        'goToSource':'Visit source video ',
+        'noVideo':" &nbsp; &nbsp;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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/addimage.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/addimage.png
new file mode 100644
index 0000000..3a2fd17
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/addimage.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/alldeletebtnhoverskin.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/alldeletebtnhoverskin.png
new file mode 100644
index 0000000..355eeab
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/alldeletebtnhoverskin.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/alldeletebtnupskin.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/alldeletebtnupskin.png
new file mode 100644
index 0000000..61658ce
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/alldeletebtnupskin.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/background.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/background.png
new file mode 100644
index 0000000..d5bf5fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/background.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/button.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/button.png
new file mode 100644
index 0000000..098874c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/button.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/copy.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/copy.png
new file mode 100644
index 0000000..f982e8b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/copy.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/deletedisable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/deletedisable.png
new file mode 100644
index 0000000..c8ee750
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/deletedisable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/deleteenable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/deleteenable.png
new file mode 100644
index 0000000..26acc88
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/deleteenable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/listbackground.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/listbackground.png
new file mode 100644
index 0000000..4f82ccd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/listbackground.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/localimage.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/localimage.png
new file mode 100644
index 0000000..12c8e6a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/localimage.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/music.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/music.png
new file mode 100644
index 0000000..2f495fe
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/music.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotateleftdisable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotateleftdisable.png
new file mode 100644
index 0000000..741526e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotateleftdisable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotateleftenable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotateleftenable.png
new file mode 100644
index 0000000..e164ddb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotateleftenable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotaterightdisable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotaterightdisable.png
new file mode 100644
index 0000000..5a78c26
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotaterightdisable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotaterightenable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotaterightenable.png
new file mode 100644
index 0000000..d768531
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/rotaterightenable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/upload.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/upload.png
new file mode 100644
index 0000000..7bb15b3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/en/images/upload.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/copy.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/copy.png
new file mode 100644
index 0000000..b2536aa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/copy.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/localimage.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/localimage.png
new file mode 100644
index 0000000..7303c36
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/localimage.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/music.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/music.png
new file mode 100644
index 0000000..354edeb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/music.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/upload.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/upload.png
new file mode 100644
index 0000000..08d4d92
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/images/upload.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/zh-cn.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/zh-cn.js
new file mode 100644
index 0000000..a26ea5b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/lang/zh-cn/zh-cn.js
@@ -0,0 +1,669 @@
+/**
+ * Created with JetBrains PhpStorm.
+ * User: taoqili
+ * Date: 12-6-12
+ * Time: 下午5:02
+ * To change this template use File | Settings | File Templates.
+ */
+UE.I18N['zh-cn'] = {
+    'labelMap':{
+        'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图',
+        'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框',
+        'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用',
+        'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览',
+        'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期',
+        'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格',
+        'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行',
+        'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题',
+        'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言',
+        'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'多图上传','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接',
+        'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图',
+        'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐',
+        'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表',
+        'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入',
+        'rowspacingtop':'段前距', 'rowspacingbottom':'段后距',  'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认',
+        'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存',
+        'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版',
+        'webapp':'百度应用','touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦',
+        'music':'音乐','inserttable':'插入表格','drafts': '从草稿箱加载', 'charts': '图表'
+    },
+    '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':'○ 大圆圈',
+        'disc':'● 小黑点',
+        'square':'■ 小方块 ',
+        'dash' :'— 破折号',
+        'dot':' 。 小圆圈'
+    },
+    'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'},
+    'fontfamily':{
+        'songti':'宋体',
+        'kaiti':'楷体',
+        'heiti':'黑体',
+        'lishu':'隶书',
+        'yahei':'微软雅黑',
+        'andaleMono':'andale mono',
+        'arial': 'arial',
+        'arialBlack':'arial black',
+        'comicSansMs':'comic sans ms',
+        'impact':'impact',
+        'timesNewRoman':'times new roman'
+    },
+    'customstyle':{
+        'tc':'标题居中',
+        'tl':'标题居左',
+        'im':'强调',
+        'hi':'明显强调'
+    },
+    'autoupload': {
+        'exceedSizeError': '文件大小超出限制',
+        'exceedTypeError': '文件格式不允许',
+        'jsonEncodeError': '服务器返回格式错误',
+        'loading':"正在上传...",
+        'loadError':"上传错误",
+        'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
+    },
+    'simpleupload':{
+        'exceedSizeError': '文件大小超出限制',
+        'exceedTypeError': '文件格式不允许',
+        'jsonEncodeError': '服务器返回格式错误',
+        'loading':"正在上传...",
+        'loadError':"上传错误",
+        'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!'
+    },
+    'elementPathTip':"元素路径",
+    'wordCountTip':"字数统计",
+    'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ',
+    'wordOverFlowMsg':'<span style="color:red;">字数超出最大允许值,服务器可能拒绝保存!</span>',
+    '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':" &nbsp;视频加载中,请等待……",
+        'clickToSelect':"点击选中",
+        'goToSource':'访问源视频',
+        'noVideo':" &nbsp; &nbsp;抱歉,找不到对应的视频,请重试!",
+
+        '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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/css/ueditor.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/css/ueditor.css
new file mode 100644
index 0000000..44ae805
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/css/ueditor.css
@@ -0,0 +1,1903 @@
+/*基础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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/css/ueditor.min.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/css/ueditor.min.css
new file mode 100644
index 0000000..eb2e7af
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/css/ueditor.min.css
@@ -0,0 +1,8 @@
+/*!
+ * UEditor
+ * version: ueditor
+ * build: Wed Aug 10 2016 11:06:16 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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/dialogbase.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/dialogbase.css
new file mode 100644
index 0000000..cd663d5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/anchor.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/anchor.gif
new file mode 100644
index 0000000..5aa797b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/anchor.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow.png
new file mode 100644
index 0000000..d900886
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow_down.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow_down.png
new file mode 100644
index 0000000..e9257e8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow_down.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow_up.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow_up.png
new file mode 100644
index 0000000..74277af
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/arrow_up.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/button-bg.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/button-bg.gif
new file mode 100644
index 0000000..ec7fa2e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/button-bg.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cancelbutton.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cancelbutton.gif
new file mode 100644
index 0000000..df4bc2c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cancelbutton.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/charts.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/charts.png
new file mode 100644
index 0000000..713965c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/charts.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_h.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_h.gif
new file mode 100644
index 0000000..d7c3e7e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_h.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_h.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_h.png
new file mode 100644
index 0000000..2088fc2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_h.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_v.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_v.gif
new file mode 100644
index 0000000..bb508db
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_v.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_v.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_v.png
new file mode 100644
index 0000000..6f39ca3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/cursor_v.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/dialog-title-bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/dialog-title-bg.png
new file mode 100644
index 0000000..f744f26
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/dialog-title-bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/filescan.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/filescan.png
new file mode 100644
index 0000000..1d27158
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/filescan.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/highlighted.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/highlighted.gif
new file mode 100644
index 0000000..9272b49
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/highlighted.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons-all.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons-all.gif
new file mode 100644
index 0000000..21915e5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons-all.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons.gif
new file mode 100644
index 0000000..7abd30a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons.png
new file mode 100644
index 0000000..c015e3a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/icons.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/loaderror.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/loaderror.png
new file mode 100644
index 0000000..35ff333
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/loaderror.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/loading.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/loading.gif
new file mode 100644
index 0000000..b713e27
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/loading.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/lock.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/lock.gif
new file mode 100644
index 0000000..b4e6d78
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/lock.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/neweditor-tab-bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/neweditor-tab-bg.png
new file mode 100644
index 0000000..8f398b0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/neweditor-tab-bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/pagebreak.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/pagebreak.gif
new file mode 100644
index 0000000..8d1cffd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/pagebreak.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/scale.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/scale.png
new file mode 100644
index 0000000..f45adb5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/scale.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/sortable.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/sortable.png
new file mode 100644
index 0000000..1bca649
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/sortable.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/spacer.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/spacer.gif
new file mode 100644
index 0000000..5bfd67a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/spacer.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/sparator_v.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/sparator_v.png
new file mode 100644
index 0000000..8cf5662
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/sparator_v.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/table-cell-align.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/table-cell-align.png
new file mode 100644
index 0000000..ddf4285
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/table-cell-align.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/tangram-colorpicker.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/tangram-colorpicker.png
new file mode 100644
index 0000000..738e500
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/tangram-colorpicker.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/toolbar_bg.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/toolbar_bg.png
new file mode 100644
index 0000000..7ab685f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/toolbar_bg.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/unhighlighted.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/unhighlighted.gif
new file mode 100644
index 0000000..7ad0b67
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/unhighlighted.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/upload.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/upload.png
new file mode 100644
index 0000000..08d4d92
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/upload.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/videologo.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/videologo.gif
new file mode 100644
index 0000000..555af74
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/videologo.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/word.gif b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/word.gif
new file mode 100644
index 0000000..9ef5d09
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/word.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/wordpaste.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/wordpaste.png
new file mode 100644
index 0000000..9367758
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/default/images/wordpaste.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/iframe.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/iframe.css
new file mode 100644
index 0000000..c7429fa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/themes/iframe.css
@@ -0,0 +1,19 @@
+/*可以在这里添加你自己的css*/
+img {
+max-width: 100%; /*ͼƬ����Ӧ���*/
+}
+body {
+overflow-y: scroll !important;
+}
+.view {
+word-break: break-all;
+}
+.vote_area {
+display: block;
+}
+.vote_iframe {
+background-color: transparent;
+border: 0 none;
+height: 100%;
+}
+#edui1_imagescale{display:none !important;} /*ȥ�����ͼƬ����ֵ�����߿�*/
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/SyntaxHighlighter/shCore.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/SyntaxHighlighter/shCore.js
new file mode 100644
index 0000000..3249184
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/SyntaxHighlighter/shCore.js
@@ -0,0 +1,3655 @@
+// XRegExp 1.5.1
+// (c) 2007-2012 Steven Levithan
+// MIT License
+// <http://xregexp.com>
+// 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: /<img\b([^>]+)>/i, backref: 1}, // <img> tag attributes
+    //     {regex: XRegExp('(?ix) \\s src=" (?<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): (?<name>
+    XRegExp.addToken(
+        /\(\?<([$\w]+)>/,
+        function (match) {
+            this.captureNames.push(match[1]);
+            this.hasNamedCapture = true;
+            return "(";
+        }
+    );
+
+    // Named backreference: \k<name>
+    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 : '&nbsp;',
+
+            /** Enables use of <SCRIPT type="syntaxhighlighter" /> tags. */
+            useScriptTags : true,
+
+            /** Blogger mode flag. */
+            bloggerMode : false,
+
+            stripBrs : false,
+
+            /** Name of the tag that SyntaxHighlighter will automatically look for. */
+            tagName : 'pre',
+
+            strings : {
+                expandSource : 'expand source',
+                help : '?',
+                alert: 'SyntaxHighlighter\n\n',
+                noBrush : 'Can\'t find brush for: ',
+                brushNotHtmlScript : 'Brush wasn\'t configured for html-script option: ',
+
+                // this is populated by the build script
+                aboutDialog : '@ABOUT@'
+            }
+        },
+
+        /** Internal 'global' variables. */
+        vars : {
+            discoveredBrushes : null,
+            highlighters : {}
+        },
+
+        /** This object is populated by user included external brush files. */
+        brushes : {},
+
+        /** Common regular expressions. */
+        regexLib : {
+            multiLineCComments			: /\/\*[\s\S]*?\*\//gm,
+            singleLineCComments			: /\/\/.*$/gm,
+            singleLinePerlComments		: /#.*$/gm,
+            doubleQuotedString			: /"([^\\"\n]|\\.)*"/g,
+            singleQuotedString			: /'([^\\'\n]|\\.)*'/g,
+            multiLineDoubleQuotedString	: new XRegExp('"([^\\\\"]|\\\\.)*"', 'gs'),
+            multiLineSingleQuotedString	: new XRegExp("'([^\\\\']|\\\\.)*'", 'gs'),
+            xmlComments					: /(&lt;|<)!--[\s\S]*?--(&gt;|>)/gm,
+            url							: /\w+:\/\/[\w-.\/?%&=:@;#]*/g,
+
+            /** <?= ?> tags. */
+            phpScriptTags 				: { left: /(&lt;|<)\?(?:=|php)?/g, right: /\?(&gt;|>)/g, 'eof' : true },
+
+            /** <%= %> tags. */
+            aspScriptTags				: { left: /(&lt;|<)%=?/g, right: /%(&gt;|>)/g },
+
+            /** <script> tags. */
+            scriptScriptTags			: { left: /(&lt;|<)\s*script.*?(&gt;|>)/gi, right: /(&lt;|<)\/\s*script\s*(&gt;|>)/gi }
+        },
+
+        toolbar: {
+            /**
+             * Generates HTML markup for the toolbar.
+             * @param {Highlighter} highlighter Highlighter instance.
+             * @return {String} Returns HTML markup.
+             */
+            getHtml: function(highlighter)
+            {
+                var html = '<div class="toolbar">',
+                    items = sh.toolbar.items,
+                    list = items.list
+                    ;
+
+                function defaultGetHtml(highlighter, name)
+                {
+                    return sh.toolbar.getButtonHtml(highlighter, name, sh.config.strings[name]);
+                };
+
+                for (var i = 0; i < list.length; i++)
+                    html += (items[list[i]].getHtml || defaultGetHtml)(highlighter, list[i]);
+
+                html += '</div>';
+
+                return html;
+            },
+
+            /**
+             * Generates HTML markup for a regular button in the toolbar.
+             * @param {Highlighter} highlighter Highlighter instance.
+             * @param {String} commandName		Command name that would be executed.
+             * @param {String} label			Label text to display.
+             * @return {String}					Returns HTML markup.
+             */
+            getButtonHtml: function(highlighter, commandName, label)
+            {
+                return '<span><a href="#" class="toolbar_item'
+                    + ' command_' + commandName
+                    + ' ' + commandName
+                    + '">' + label + '</a></span>'
+                    ;
+            },
+
+            /**
+             * Event handler for a toolbar anchor.
+             */
+            handler: function(e)
+            {
+                var target = e.target,
+                    className = target.className || ''
+                    ;
+
+                function getValue(name)
+                {
+                    var r = new RegExp(name + '_(\\w+)'),
+                        match = r.exec(className)
+                        ;
+
+                    return match ? match[1] : null;
+                };
+
+                var highlighter = getHighlighterById(findParentElement(target, '.syntaxhighlighter').id),
+                    commandName = getValue('command')
+                    ;
+
+                // execute the toolbar command
+                if (highlighter && commandName)
+                    sh.toolbar.items[commandName].execute(highlighter);
+
+                // disable default A click behaviour
+                e.preventDefault();
+            },
+
+            /** Collection of toolbar items. */
+            items : {
+                // Ordered lis of items in the toolbar. Can't expect `for (var n in items)` to be consistent.
+                list: ['expandSource', 'help'],
+
+                expandSource: {
+                    getHtml: function(highlighter)
+                    {
+                        if (highlighter.getParam('collapse') != true)
+                            return '';
+
+                        var title = highlighter.getParam('title');
+                        return sh.toolbar.getButtonHtml(highlighter, 'expandSource', title ? title : sh.config.strings.expandSource);
+                    },
+
+                    execute: function(highlighter)
+                    {
+                        var div = getHighlighterDivById(highlighter.id);
+                        removeClass(div, 'collapsed');
+                    }
+                },
+
+                /** Command to display the about dialog window. */
+                help: {
+                    execute: function(highlighter)
+                    {
+                        var wnd = popup('', '_blank', 500, 250, 'scrollbars=0'),
+                            doc = wnd.document
+                            ;
+
+                        doc.write(sh.config.strings.aboutDialog);
+                        doc.close();
+                        wnd.focus();
+                    }
+                }
+            }
+        },
+
+        /**
+         * Finds all elements on the page which should be processes by SyntaxHighlighter.
+         *
+         * @param {Object} globalParams		Optional parameters which override element's
+         * 									parameters. Only used if element is specified.
+         *
+         * @param {Object} element	Optional element to highlight. If none is
+         * 							provided, all elements in the current document
+         * 							are returned which qualify.
+         *
+         * @return {Array}	Returns list of <code>{ target: DOMElement, params: Object }</code> objects.
+         */
+        findElements: function(globalParams, element)
+        {
+            var elements = element ? [element] : toArray(document.getElementsByTagName(sh.config.tagName)),
+                conf = sh.config,
+                result = []
+                ;
+
+            // support for <SCRIPT TYPE="syntaxhighlighter" /> feature
+            if (conf.useScriptTags)
+                elements = elements.concat(getSyntaxHighlighterScriptTags());
+
+            if (elements.length === 0)
+                return result;
+
+            for (var i = 0; i < elements.length; i++)
+            {
+                var item = {
+                    target: elements[i],
+                    // local params take precedence over globals
+                    params: merge(globalParams, parseParams(elements[i].className))
+                };
+
+                if (item.params['brush'] == null)
+                    continue;
+
+                result.push(item);
+            }
+
+            return result;
+        },
+
+        /**
+         * Shorthand to highlight all elements on the page that are marked as
+         * SyntaxHighlighter source code.
+         *
+         * @param {Object} globalParams		Optional parameters which override element's
+         * 									parameters. Only used if element is specified.
+         *
+         * @param {Object} element	Optional element to highlight. If none is
+         * 							provided, all elements in the current document
+         * 							are highlighted.
+         */
+        highlight: function(globalParams, element)
+        {
+            var elements = this.findElements(globalParams, element),
+                propertyName = 'innerHTML',
+                highlighter = null,
+                conf = sh.config
+                ;
+
+            if (elements.length === 0)
+                return;
+
+            for (var i = 0; i < elements.length; i++)
+            {
+                var element = elements[i],
+                    target = element.target,
+                    params = element.params,
+                    brushName = params.brush,
+                    code
+                    ;
+
+                if (brushName == null)
+                    continue;
+
+                // Instantiate a brush
+                if (params['html-script'] == 'true' || sh.defaults['html-script'] == true)
+                {
+                    highlighter = new sh.HtmlScript(brushName);
+                    brushName = 'htmlscript';
+                }
+                else
+                {
+                    var brush = findBrush(brushName);
+
+                    if (brush)
+                        highlighter = new brush();
+                    else
+                        continue;
+                }
+
+                code = target[propertyName];
+
+                // remove CDATA from <SCRIPT/> tags if it's present
+                if (conf.useScriptTags)
+                    code = stripCData(code);
+
+                // Inject title if the attribute is present
+                if ((target.title || '') != '')
+                    params.title = target.title;
+
+                params['brush'] = brushName;
+                highlighter.init(params);
+                element = highlighter.getDiv(code);
+
+                // carry over ID
+                if ((target.id || '') != '')
+                    element.id = target.id;
+                //by zhanyi 去掉多余的外围div
+                var tmp = element.firstChild.firstChild;
+                tmp.className = element.firstChild.className;
+
+                target.parentNode.replaceChild(tmp, target);
+            }
+        },
+
+        /**
+         * Main entry point for the SyntaxHighlighter.
+         * @param {Object} params Optional params to apply to all highlighted elements.
+         */
+        all: function(params)
+        {
+            attachEvent(
+                window,
+                'load',
+                function() { sh.highlight(params); }
+            );
+        }
+    }; // end of sh
+
+    /**
+     * Checks if target DOM elements has specified CSS class.
+     * @param {DOMElement} target Target DOM element to check.
+     * @param {String} className Name of the CSS class to check for.
+     * @return {Boolean} Returns true if class name is present, false otherwise.
+     */
+    function hasClass(target, className)
+    {
+        return target.className.indexOf(className) != -1;
+    };
+
+    /**
+     * Adds CSS class name to the target DOM element.
+     * @param {DOMElement} target Target DOM element.
+     * @param {String} className New CSS class to add.
+     */
+    function addClass(target, className)
+    {
+        if (!hasClass(target, className))
+            target.className += ' ' + className;
+    };
+
+    /**
+     * Removes CSS class name from the target DOM element.
+     * @param {DOMElement} target Target DOM element.
+     * @param {String} className CSS class to remove.
+     */
+    function removeClass(target, className)
+    {
+        target.className = target.className.replace(className, '');
+    };
+
+    /**
+     * Converts the source to array object. Mostly used for function arguments and
+     * lists returned by getElementsByTagName() which aren't Array objects.
+     * @param {List} source Source list.
+     * @return {Array} Returns array.
+     */
+    function toArray(source)
+    {
+        var result = [];
+
+        for (var i = 0; i < source.length; i++)
+            result.push(source[i]);
+
+        return result;
+    };
+
+    /**
+     * Splits block of text into lines.
+     * @param {String} block Block of text.
+     * @return {Array} Returns array of lines.
+     */
+    function splitLines(block)
+    {
+        return block.split(/\r?\n/);
+    }
+
+    /**
+     * Generates HTML ID for the highlighter.
+     * @param {String} highlighterId Highlighter ID.
+     * @return {String} Returns HTML ID.
+     */
+    function getHighlighterId(id)
+    {
+        var prefix = 'highlighter_';
+        return id.indexOf(prefix) == 0 ? id : prefix + id;
+    };
+
+    /**
+     * Finds Highlighter instance by ID.
+     * @param {String} highlighterId Highlighter ID.
+     * @return {Highlighter} Returns instance of the highlighter.
+     */
+    function getHighlighterById(id)
+    {
+        return sh.vars.highlighters[getHighlighterId(id)];
+    };
+
+    /**
+     * Finds highlighter's DIV container.
+     * @param {String} highlighterId Highlighter ID.
+     * @return {Element} Returns highlighter's DIV element.
+     */
+    function getHighlighterDivById(id)
+    {
+        return document.getElementById(getHighlighterId(id));
+    };
+
+    /**
+     * Stores highlighter so that getHighlighterById() can do its thing. Each
+     * highlighter must call this method to preserve itself.
+     * @param {Highilghter} highlighter Highlighter instance.
+     */
+    function storeHighlighter(highlighter)
+    {
+        sh.vars.highlighters[getHighlighterId(highlighter.id)] = highlighter;
+    };
+
+    /**
+     * Looks for a child or parent node which has specified classname.
+     * Equivalent to jQuery's $(container).find(".className")
+     * @param {Element} target Target element.
+     * @param {String} search Class name or node name to look for.
+     * @param {Boolean} reverse If set to true, will go up the node tree instead of down.
+     * @return {Element} Returns found child or parent element on null.
+     */
+    function findElement(target, search, reverse /* optional */)
+    {
+        if (target == null)
+            return null;
+
+        var nodes			= reverse != true ? target.childNodes : [ target.parentNode ],
+            propertyToFind	= { '#' : 'id', '.' : 'className' }[search.substr(0, 1)] || 'nodeName',
+            expectedValue,
+            found
+            ;
+
+        expectedValue = propertyToFind != 'nodeName'
+            ? search.substr(1)
+            : search.toUpperCase()
+        ;
+
+        // main return of the found node
+        if ((target[propertyToFind] || '').indexOf(expectedValue) != -1)
+            return target;
+
+        for (var i = 0; nodes && i < nodes.length && found == null; i++)
+            found = findElement(nodes[i], search, reverse);
+
+        return found;
+    };
+
+    /**
+     * Looks for a parent node which has specified classname.
+     * This is an alias to <code>findElement(container, className, true)</code>.
+     * @param {Element} target Target element.
+     * @param {String} className Class name to look for.
+     * @return {Element} Returns found parent element on null.
+     */
+    function findParentElement(target, className)
+    {
+        return findElement(target, className, true);
+    };
+
+    /**
+     * Finds an index of element in the array.
+     * @ignore
+     * @param {Object} searchElement
+     * @param {Number} fromIndex
+     * @return {Number} Returns index of element if found; -1 otherwise.
+     */
+    function indexOf(array, searchElement, fromIndex)
+    {
+        fromIndex = Math.max(fromIndex || 0, 0);
+
+        for (var i = fromIndex; i < array.length; i++)
+            if(array[i] == searchElement)
+                return i;
+
+        return -1;
+    };
+
+    /**
+     * Generates a unique element ID.
+     */
+    function guid(prefix)
+    {
+        return (prefix || '') + Math.round(Math.random() * 1000000).toString();
+    };
+
+    /**
+     * Merges two objects. Values from obj2 override values in obj1.
+     * Function is NOT recursive and works only for one dimensional objects.
+     * @param {Object} obj1 First object.
+     * @param {Object} obj2 Second object.
+     * @return {Object} Returns combination of both objects.
+     */
+    function merge(obj1, obj2)
+    {
+        var result = {}, name;
+
+        for (name in obj1)
+            result[name] = obj1[name];
+
+        for (name in obj2)
+            result[name] = obj2[name];
+
+        return result;
+    };
+
+    /**
+     * Attempts to convert string to boolean.
+     * @param {String} value Input string.
+     * @return {Boolean} Returns true if input was "true", false if input was "false" and value otherwise.
+     */
+    function toBoolean(value)
+    {
+        var result = { "true" : true, "false" : false }[value];
+        return result == null ? value : result;
+    };
+
+    /**
+     * Opens up a centered popup window.
+     * @param {String} url		URL to open in the window.
+     * @param {String} name		Popup name.
+     * @param {int} width		Popup width.
+     * @param {int} height		Popup height.
+     * @param {String} options	window.open() options.
+     * @return {Window}			Returns window instance.
+     */
+    function popup(url, name, width, height, options)
+    {
+        var x = (screen.width - width) / 2,
+            y = (screen.height - height) / 2
+            ;
+
+        options +=	', left=' + x +
+            ', top=' + y +
+            ', width=' + width +
+            ', height=' + height
+        ;
+        options = options.replace(/^,/, '');
+
+        var win = window.open(url, name, options);
+        win.focus();
+        return win;
+    };
+
+    /**
+     * Adds event handler to the target object.
+     * @param {Object} obj		Target object.
+     * @param {String} type		Name of the event.
+     * @param {Function} func	Handling function.
+     */
+    function attachEvent(obj, type, func, scope)
+    {
+        function handler(e)
+        {
+            e = e || window.event;
+
+            if (!e.target)
+            {
+                e.target = e.srcElement;
+                e.preventDefault = function()
+                {
+                    this.returnValue = false;
+                };
+            }
+
+            func.call(scope || window, e);
+        };
+
+        if (obj.attachEvent)
+        {
+            obj.attachEvent('on' + type, handler);
+        }
+        else
+        {
+            obj.addEventListener(type, handler, false);
+        }
+    };
+
+    /**
+     * Displays an alert.
+     * @param {String} str String to display.
+     */
+    function alert(str)
+    {
+        window.alert(sh.config.strings.alert + str);
+    };
+
+    /**
+     * Finds a brush by its alias.
+     *
+     * @param {String} alias		Brush alias.
+     * @param {Boolean} showAlert	Suppresses the alert if false.
+     * @return {Brush}				Returns bursh constructor if found, null otherwise.
+     */
+    function findBrush(alias, showAlert)
+    {
+        var brushes = sh.vars.discoveredBrushes,
+            result = null
+            ;
+
+        if (brushes == null)
+        {
+            brushes = {};
+
+            // Find all brushes
+            for (var brush in sh.brushes)
+            {
+                var info = sh.brushes[brush],
+                    aliases = info.aliases
+                    ;
+
+                if (aliases == null)
+                    continue;
+
+                // keep the brush name
+                info.brushName = brush.toLowerCase();
+
+                for (var i = 0; i < aliases.length; i++)
+                    brushes[aliases[i]] = brush;
+            }
+
+            sh.vars.discoveredBrushes = brushes;
+        }
+
+        result = sh.brushes[brushes[alias]];
+
+        if (result == null && showAlert)
+            alert(sh.config.strings.noBrush + alias);
+
+        return result;
+    };
+
+    /**
+     * Executes a callback on each line and replaces each line with result from the callback.
+     * @param {Object} str			Input string.
+     * @param {Object} callback		Callback function taking one string argument and returning a string.
+     */
+    function eachLine(str, callback)
+    {
+        var lines = splitLines(str);
+
+        for (var i = 0; i < lines.length; i++)
+            lines[i] = callback(lines[i], i);
+
+        // include \r to enable copy-paste on windows (ie8) without getting everything on one line
+        return lines.join('\r\n');
+    };
+
+    /**
+     * This is a special trim which only removes first and last empty lines
+     * and doesn't affect valid leading space on the first line.
+     *
+     * @param {String} str   Input string
+     * @return {String}      Returns string without empty first and last lines.
+     */
+    function trimFirstAndLastLines(str)
+    {
+        return str.replace(/^[ ]*[\n]+|[\n]*[ ]*$/g, '');
+    };
+
+    /**
+     * Parses key/value pairs into hash object.
+     *
+     * Understands the following formats:
+     * - name: word;
+     * - name: [word, word];
+     * - name: "string";
+     * - name: 'string';
+     *
+     * For example:
+     *   name1: value; name2: [value, value]; name3: 'value'
+     *
+     * @param {String} str    Input string.
+     * @return {Object}       Returns deserialized object.
+     */
+    function parseParams(str)
+    {
+        var match,
+            result = {},
+            arrayRegex = new XRegExp("^\\[(?<values>(.*?))\\]$"),
+            regex = new XRegExp(
+                "(?<name>[\\w-]+)" +
+                    "\\s*:\\s*" +
+                    "(?<value>" +
+                    "[\\w-%#]+|" +		// word
+                    "\\[.*?\\]|" +		// [] array
+                    '".*?"|' +			// "" string
+                    "'.*?'" +			// '' string
+                    ")\\s*;?",
+                "g"
+            )
+            ;
+
+        while ((match = regex.exec(str)) != null)
+        {
+            var value = match.value
+                    .replace(/^['"]|['"]$/g, '') // strip quotes from end of strings
+                ;
+
+            // try to parse array value
+            if (value != null && arrayRegex.test(value))
+            {
+                var m = arrayRegex.exec(value);
+                value = m.values.length > 0 ? m.values.split(/\s*,\s*/) : [];
+            }
+
+            result[match.name] = value;
+        }
+
+        return result;
+    };
+
+    /**
+     * Wraps each line of the string into <code/> tag with given style applied to it.
+     *
+     * @param {String} str   Input string.
+     * @param {String} css   Style name to apply to the string.
+     * @return {String}      Returns input string with each line surrounded by <span/> tag.
+     */
+    function wrapLinesWithCode(str, css)
+    {
+        if (str == null || str.length == 0 || str == '\n')
+            return str;
+
+        str = str.replace(/</g, '&lt;');
+
+        // Replace two or more sequential spaces with &nbsp; leaving last space untouched.
+        str = str.replace(/ {2,}/g, function(m)
+        {
+            var spaces = '';
+
+            for (var i = 0; i < m.length - 1; i++)
+                spaces += sh.config.space;
+
+            return spaces + ' ';
+        });
+
+        // Split each line and apply <span class="...">...</span> to them so that
+        // leading spaces aren't included.
+        if (css != null)
+            str = eachLine(str, function(line)
+            {
+                if (line.length == 0)
+                    return '';
+
+                var spaces = '';
+
+                line = line.replace(/^(&nbsp;| )+/, function(s)
+                {
+                    spaces = s;
+                    return '';
+                });
+
+                if (line.length == 0)
+                    return spaces;
+
+                return spaces + '<code class="' + css + '">' + line + '</code>';
+            });
+
+        return str;
+    };
+
+    /**
+     * Pads number with zeros until it's length is the same as given length.
+     *
+     * @param {Number} number	Number to pad.
+     * @param {Number} length	Max string length with.
+     * @return {String}			Returns a string padded with proper amount of '0'.
+     */
+    function padNumber(number, length)
+    {
+        var result = number.toString();
+
+        while (result.length < length)
+            result = '0' + result;
+
+        return result;
+    };
+
+    /**
+     * Replaces tabs with spaces.
+     *
+     * @param {String} code		Source code.
+     * @param {Number} tabSize	Size of the tab.
+     * @return {String}			Returns code with all tabs replaces by spaces.
+     */
+    function processTabs(code, tabSize)
+    {
+        var tab = '';
+
+        for (var i = 0; i < tabSize; i++)
+            tab += ' ';
+
+        return code.replace(/\t/g, tab);
+    };
+
+    /**
+     * Replaces tabs with smart spaces.
+     *
+     * @param {String} code    Code to fix the tabs in.
+     * @param {Number} tabSize Number of spaces in a column.
+     * @return {String}        Returns code with all tabs replaces with roper amount of spaces.
+     */
+    function processSmartTabs(code, tabSize)
+    {
+        var lines = splitLines(code),
+            tab = '\t',
+            spaces = ''
+            ;
+
+        // Create a string with 1000 spaces to copy spaces from...
+        // It's assumed that there would be no indentation longer than that.
+        for (var i = 0; i < 50; i++)
+            spaces += '                    '; // 20 spaces * 50
+
+        // This function inserts specified amount of spaces in the string
+        // where a tab is while removing that given tab.
+        function insertSpaces(line, pos, count)
+        {
+            return line.substr(0, pos)
+                + spaces.substr(0, count)
+                + line.substr(pos + 1, line.length) // pos + 1 will get rid of the tab
+                ;
+        };
+
+        // Go through all the lines and do the 'smart tabs' magic.
+        code = eachLine(code, function(line)
+        {
+            if (line.indexOf(tab) == -1)
+                return line;
+
+            var pos = 0;
+
+            while ((pos = line.indexOf(tab)) != -1)
+            {
+                // This is pretty much all there is to the 'smart tabs' logic.
+                // Based on the position within the line and size of a tab,
+                // calculate the amount of spaces we need to insert.
+                var spaces = tabSize - pos % tabSize;
+                line = insertSpaces(line, pos, spaces);
+            }
+
+            return line;
+        });
+
+        return code;
+    };
+
+    /**
+     * Performs various string fixes based on configuration.
+     */
+    function fixInputString(str)
+    {
+        var br = /<br\s*\/?>|&lt;br\s*\/?&gt;/gi;
+
+        if (sh.config.bloggerMode == true)
+            str = str.replace(br, '\n');
+
+        if (sh.config.stripBrs == true)
+            str = str.replace(br, '');
+
+        return str;
+    };
+
+    /**
+     * Removes all white space at the begining and end of a string.
+     *
+     * @param {String} str   String to trim.
+     * @return {String}      Returns string without leading and following white space characters.
+     */
+    function trim(str)
+    {
+        return str.replace(/^\s+|\s+$/g, '');
+    };
+
+    /**
+     * Unindents a block of text by the lowest common indent amount.
+     * @param {String} str   Text to unindent.
+     * @return {String}      Returns unindented text block.
+     */
+    function unindent(str)
+    {
+        var lines = splitLines(fixInputString(str)),
+            indents = new Array(),
+            regex = /^\s*/,
+            min = 1000
+            ;
+
+        // go through every line and check for common number of indents
+        for (var i = 0; i < lines.length && min > 0; i++)
+        {
+            var line = lines[i];
+
+            if (trim(line).length == 0)
+                continue;
+
+            var matches = regex.exec(line);
+
+            // In the event that just one line doesn't have leading white space
+            // we can't unindent anything, so bail completely.
+            if (matches == null)
+                return str;
+
+            min = Math.min(matches[0].length, min);
+        }
+
+        // trim minimum common number of white space from the begining of every line
+        if (min > 0)
+            for (var i = 0; i < lines.length; i++)
+                lines[i] = lines[i].substr(min);
+
+        return lines.join('\n');
+    };
+
+    /**
+     * Callback method for Array.sort() which sorts matches by
+     * index position and then by length.
+     *
+     * @param {Match} m1	Left object.
+     * @param {Match} m2    Right object.
+     * @return {Number}     Returns -1, 0 or -1 as a comparison result.
+     */
+    function matchesSortCallback(m1, m2)
+    {
+        // sort matches by index first
+        if(m1.index < m2.index)
+            return -1;
+        else if(m1.index > m2.index)
+            return 1;
+        else
+        {
+            // if index is the same, sort by length
+            if(m1.length < m2.length)
+                return -1;
+            else if(m1.length > m2.length)
+                return 1;
+        }
+
+        return 0;
+    };
+
+    /**
+     * Executes given regular expression on provided code and returns all
+     * matches that are found.
+     *
+     * @param {String} code    Code to execute regular expression on.
+     * @param {Object} regex   Regular expression item info from <code>regexList</code> collection.
+     * @return {Array}         Returns a list of Match objects.
+     */
+    function getMatches(code, regexInfo)
+    {
+        function defaultAdd(match, regexInfo)
+        {
+            return match[0];
+        };
+
+        var index = 0,
+            match = null,
+            matches = [],
+            func = regexInfo.func ? regexInfo.func : defaultAdd
+            ;
+
+        while((match = regexInfo.regex.exec(code)) != null)
+        {
+            var resultMatch = func(match, regexInfo);
+
+            if (typeof(resultMatch) == 'string')
+                resultMatch = [new sh.Match(resultMatch, match.index, regexInfo.css)];
+
+            matches = matches.concat(resultMatch);
+        }
+
+        return matches;
+    };
+
+    /**
+     * Turns all URLs in the code into <a/> tags.
+     * @param {String} code Input code.
+     * @return {String} Returns code with </a> tags.
+     */
+    function processUrls(code)
+    {
+        var gt = /(.*)((&gt;|&lt;).*)/;
+
+        return code.replace(sh.regexLib.url, function(m)
+        {
+            var suffix = '',
+                match = null
+                ;
+
+            // We include &lt; and &gt; in the URL for the common cases like <http://google.com>
+            // The problem is that they get transformed into &lt;http://google.com&gt;
+            // Where as &gt; easily looks like part of the URL string.
+
+            if (match = gt.exec(m))
+            {
+                m = match[1];
+                suffix = match[2];
+            }
+
+            return '<a href="' + m + '">' + m + '</a>' + suffix;
+        });
+    };
+
+    /**
+     * Finds all <SCRIPT TYPE="syntaxhighlighter" /> elementss.
+     * @return {Array} Returns array of all found SyntaxHighlighter tags.
+     */
+    function getSyntaxHighlighterScriptTags()
+    {
+        var tags = document.getElementsByTagName('script'),
+            result = []
+            ;
+
+        for (var i = 0; i < tags.length; i++)
+            if (tags[i].type == 'syntaxhighlighter')
+                result.push(tags[i]);
+
+        return result;
+    };
+
+    /**
+     * Strips <![CDATA[]]> from <SCRIPT /> content because it should be used
+     * there in most cases for XHTML compliance.
+     * @param {String} original	Input code.
+     * @return {String} Returns code without leading <![CDATA[]]> tags.
+     */
+    function stripCData(original)
+    {
+        var left = '<![CDATA[',
+            right = ']]>',
+        // for some reason IE inserts some leading blanks here
+            copy = trim(original),
+            changed = false,
+            leftLength = left.length,
+            rightLength = right.length
+            ;
+
+        if (copy.indexOf(left) == 0)
+        {
+            copy = copy.substring(leftLength);
+            changed = true;
+        }
+
+        var copyLength = copy.length;
+
+        if (copy.indexOf(right) == copyLength - rightLength)
+        {
+            copy = copy.substring(0, copyLength - rightLength);
+            changed = true;
+        }
+
+        return changed ? copy : original;
+    };
+
+
+    /**
+     * Quick code mouse double click handler.
+     */
+    function quickCodeHandler(e)
+    {
+        var target = e.target,
+            highlighterDiv = findParentElement(target, '.syntaxhighlighter'),
+            container = findParentElement(target, '.container'),
+            textarea = document.createElement('textarea'),
+            highlighter
+            ;
+
+        if (!container || !highlighterDiv || findElement(container, 'textarea'))
+            return;
+
+        highlighter = getHighlighterById(highlighterDiv.id);
+
+        // add source class name
+        addClass(highlighterDiv, 'source');
+
+        // Have to go over each line and grab it's text, can't just do it on the
+        // container because Firefox loses all \n where as Webkit doesn't.
+        var lines = container.childNodes,
+            code = []
+            ;
+
+        for (var i = 0; i < lines.length; i++)
+            code.push(lines[i].innerText || lines[i].textContent);
+
+        // using \r instead of \r or \r\n makes this work equally well on IE, FF and Webkit
+        code = code.join('\r');
+
+        // For Webkit browsers, replace nbsp with a breaking space
+        code = code.replace(/\u00a0/g, " ");
+
+        // inject <textarea/> tag
+        textarea.appendChild(document.createTextNode(code));
+        container.appendChild(textarea);
+
+        // preselect all text
+        textarea.focus();
+        textarea.select();
+
+        // set up handler for lost focus
+        attachEvent(textarea, 'blur', function(e)
+        {
+            textarea.parentNode.removeChild(textarea);
+            removeClass(highlighterDiv, 'source');
+        });
+    };
+
+    /**
+     * Match object.
+     */
+    sh.Match = function(value, index, css)
+    {
+        this.value = value;
+        this.index = index;
+        this.length = value.length;
+        this.css = css;
+        this.brushName = null;
+    };
+
+    sh.Match.prototype.toString = function()
+    {
+        return this.value;
+    };
+
+    /**
+     * Simulates HTML code with a scripting language embedded.
+     *
+     * @param {String} scriptBrushName Brush name of the scripting language.
+     */
+    sh.HtmlScript = function(scriptBrushName)
+    {
+        var brushClass = findBrush(scriptBrushName),
+            scriptBrush,
+            xmlBrush = new sh.brushes.Xml(),
+            bracketsRegex = null,
+            ref = this,
+            methodsToExpose = 'getDiv getHtml init'.split(' ')
+            ;
+
+        if (brushClass == null)
+            return;
+
+        scriptBrush = new brushClass();
+
+        for(var i = 0; i < methodsToExpose.length; i++)
+            // make a closure so we don't lose the name after i changes
+            (function() {
+                var name = methodsToExpose[i];
+
+                ref[name] = function()
+                {
+                    return xmlBrush[name].apply(xmlBrush, arguments);
+                };
+            })();
+
+        if (scriptBrush.htmlScript == null)
+        {
+            alert(sh.config.strings.brushNotHtmlScript + scriptBrushName);
+            return;
+        }
+
+        xmlBrush.regexList.push(
+            { regex: scriptBrush.htmlScript.code, func: process }
+        );
+
+        function offsetMatches(matches, offset)
+        {
+            for (var j = 0; j < matches.length; j++)
+                matches[j].index += offset;
+        }
+
+        function process(match, info)
+        {
+            var code = match.code,
+                matches = [],
+                regexList = scriptBrush.regexList,
+                offset = match.index + match.left.length,
+                htmlScript = scriptBrush.htmlScript,
+                result
+                ;
+
+            // add all matches from the code
+            for (var i = 0; i < regexList.length; i++)
+            {
+                result = getMatches(code, regexList[i]);
+                offsetMatches(result, offset);
+                matches = matches.concat(result);
+            }
+
+            // add left script bracket
+            if (htmlScript.left != null && match.left != null)
+            {
+                result = getMatches(match.left, htmlScript.left);
+                offsetMatches(result, match.index);
+                matches = matches.concat(result);
+            }
+
+            // add right script bracket
+            if (htmlScript.right != null && match.right != null)
+            {
+                result = getMatches(match.right, htmlScript.right);
+                offsetMatches(result, match.index + match[0].lastIndexOf(match.right));
+                matches = matches.concat(result);
+            }
+
+            for (var j = 0; j < matches.length; j++)
+                matches[j].brushName = brushClass.brushName;
+
+            return matches;
+        }
+    };
+
+    /**
+     * Main Highlither class.
+     * @constructor
+     */
+    sh.Highlighter = function()
+    {
+        // not putting any code in here because of the prototype inheritance
+    };
+
+    sh.Highlighter.prototype = {
+        /**
+         * Returns value of the parameter passed to the highlighter.
+         * @param {String} name				Name of the parameter.
+         * @param {Object} defaultValue		Default value.
+         * @return {Object}					Returns found value or default value otherwise.
+         */
+        getParam: function(name, defaultValue)
+        {
+            var result = this.params[name];
+            return toBoolean(result == null ? defaultValue : result);
+        },
+
+        /**
+         * Shortcut to document.createElement().
+         * @param {String} name		Name of the element to create (DIV, A, etc).
+         * @return {HTMLElement}	Returns new HTML element.
+         */
+        create: function(name)
+        {
+            return document.createElement(name);
+        },
+
+        /**
+         * Applies all regular expression to the code and stores all found
+         * matches in the `this.matches` array.
+         * @param {Array} regexList		List of regular expressions.
+         * @param {String} code			Source code.
+         * @return {Array}				Returns list of matches.
+         */
+        findMatches: function(regexList, code)
+        {
+            var result = [];
+
+            if (regexList != null)
+                for (var i = 0; i < regexList.length; i++)
+                    // BUG: length returns len+1 for array if methods added to prototype chain (oising@gmail.com)
+                    if (typeof (regexList[i]) == "object")
+                        result = result.concat(getMatches(code, regexList[i]));
+
+            // sort and remove nested the matches
+            return this.removeNestedMatches(result.sort(matchesSortCallback));
+        },
+
+        /**
+         * Checks to see if any of the matches are inside of other matches.
+         * This process would get rid of highligted strings inside comments,
+         * keywords inside strings and so on.
+         */
+        removeNestedMatches: function(matches)
+        {
+            // Optimized by Jose Prado (http://joseprado.com)
+            for (var i = 0; i < matches.length; i++)
+            {
+                if (matches[i] === null)
+                    continue;
+
+                var itemI = matches[i],
+                    itemIEndPos = itemI.index + itemI.length
+                    ;
+
+                for (var j = i + 1; j < matches.length && matches[i] !== null; j++)
+                {
+                    var itemJ = matches[j];
+
+                    if (itemJ === null)
+                        continue;
+                    else if (itemJ.index > itemIEndPos)
+                        break;
+                    else if (itemJ.index == itemI.index && itemJ.length > itemI.length)
+                        matches[i] = null;
+                    else if (itemJ.index >= itemI.index && itemJ.index < itemIEndPos)
+                        matches[j] = null;
+                }
+            }
+
+            return matches;
+        },
+
+        /**
+         * Creates an array containing integer line numbers starting from the 'first-line' param.
+         * @return {Array} Returns array of integers.
+         */
+        figureOutLineNumbers: function(code)
+        {
+            var lines = [],
+                firstLine = parseInt(this.getParam('first-line'))
+                ;
+
+            eachLine(code, function(line, index)
+            {
+                lines.push(index + firstLine);
+            });
+
+            return lines;
+        },
+
+        /**
+         * Determines if specified line number is in the highlighted list.
+         */
+        isLineHighlighted: function(lineNumber)
+        {
+            var list = this.getParam('highlight', []);
+
+            if (typeof(list) != 'object' && list.push == null)
+                list = [ list ];
+
+            return indexOf(list, lineNumber.toString()) != -1;
+        },
+
+        /**
+         * Generates HTML markup for a single line of code while determining alternating line style.
+         * @param {Integer} lineNumber	Line number.
+         * @param {String} code Line	HTML markup.
+         * @return {String}				Returns HTML markup.
+         */
+        getLineHtml: function(lineIndex, lineNumber, code)
+        {
+            var classes = [
+                'line',
+                'number' + lineNumber,
+                'index' + lineIndex,
+                'alt' + (lineNumber % 2 == 0 ? 1 : 2).toString()
+            ];
+
+            if (this.isLineHighlighted(lineNumber))
+                classes.push('highlighted');
+
+            if (lineNumber == 0)
+                classes.push('break');
+
+            return '<div class="' + classes.join(' ') + '">' + code + '</div>';
+        },
+
+        /**
+         * Generates HTML markup for line number column.
+         * @param {String} code			Complete code HTML markup.
+         * @param {Array} lineNumbers	Calculated line numbers.
+         * @return {String}				Returns HTML markup.
+         */
+        getLineNumbersHtml: function(code, lineNumbers)
+        {
+            var html = '',
+                count = splitLines(code).length,
+                firstLine = parseInt(this.getParam('first-line')),
+                pad = this.getParam('pad-line-numbers')
+                ;
+
+            if (pad == true)
+                pad = (firstLine + count - 1).toString().length;
+            else if (isNaN(pad) == true)
+                pad = 0;
+
+            for (var i = 0; i < count; i++)
+            {
+                var lineNumber = lineNumbers ? lineNumbers[i] : firstLine + i,
+                    code = lineNumber == 0 ? sh.config.space : padNumber(lineNumber, pad)
+                    ;
+
+                html += this.getLineHtml(i, lineNumber, code);
+            }
+
+            return html;
+        },
+
+        /**
+         * Splits block of text into individual DIV lines.
+         * @param {String} code			Code to highlight.
+         * @param {Array} lineNumbers	Calculated line numbers.
+         * @return {String}				Returns highlighted code in HTML form.
+         */
+        getCodeLinesHtml: function(html, lineNumbers)
+        {
+            html = trim(html);
+
+            var lines = splitLines(html),
+                padLength = this.getParam('pad-line-numbers'),
+                firstLine = parseInt(this.getParam('first-line')),
+                html = '',
+                brushName = this.getParam('brush')
+                ;
+
+            for (var i = 0; i < lines.length; i++)
+            {
+                var line = lines[i],
+                    indent = /^(&nbsp;|\s)+/.exec(line),
+                    spaces = null,
+                    lineNumber = lineNumbers ? lineNumbers[i] : firstLine + i;
+                ;
+
+                if (indent != null)
+                {
+                    spaces = indent[0].toString();
+                    line = line.substr(spaces.length);
+                    spaces = spaces.replace(' ', sh.config.space);
+                }
+
+                line = trim(line);
+
+                if (line.length == 0)
+                    line = sh.config.space;
+
+                html += this.getLineHtml(
+                    i,
+                    lineNumber,
+                    (spaces != null ? '<code class="' + brushName + ' spaces">' + spaces + '</code>' : '') + line
+                );
+            }
+
+            return html;
+        },
+
+        /**
+         * Returns HTML for the table title or empty string if title is null.
+         */
+        getTitleHtml: function(title)
+        {
+            return title ? '<caption>' + title + '</caption>' : '';
+        },
+
+        /**
+         * Finds all matches in the source code.
+         * @param {String} code		Source code to process matches in.
+         * @param {Array} matches	Discovered regex matches.
+         * @return {String} Returns formatted HTML with processed mathes.
+         */
+        getMatchesHtml: function(code, matches)
+        {
+            var pos = 0,
+                result = '',
+                brushName = this.getParam('brush', '')
+                ;
+
+            function getBrushNameCss(match)
+            {
+                var result = match ? (match.brushName || brushName) : brushName;
+                return result ? result + ' ' : '';
+            };
+
+            // Finally, go through the final list of matches and pull the all
+            // together adding everything in between that isn't a match.
+            for (var i = 0; i < matches.length; i++)
+            {
+                var match = matches[i],
+                    matchBrushName
+                    ;
+
+                if (match === null || match.length === 0)
+                    continue;
+
+                matchBrushName = getBrushNameCss(match);
+
+                result += wrapLinesWithCode(code.substr(pos, match.index - pos), matchBrushName + 'plain')
+                    + wrapLinesWithCode(match.value, matchBrushName + match.css)
+                ;
+
+                pos = match.index + match.length + (match.offset || 0);
+            }
+
+            // don't forget to add whatever's remaining in the string
+            result += wrapLinesWithCode(code.substr(pos), getBrushNameCss() + 'plain');
+
+            return result;
+        },
+
+        /**
+         * Generates HTML markup for the whole syntax highlighter.
+         * @param {String} code Source code.
+         * @return {String} Returns HTML markup.
+         */
+        getHtml: function(code)
+        {
+            var html = '',
+                classes = [ 'syntaxhighlighter' ],
+                tabSize,
+                matches,
+                lineNumbers
+                ;
+
+            // process light mode
+            if (this.getParam('light') == true)
+                this.params.toolbar = this.params.gutter = false;
+
+            className = 'syntaxhighlighter';
+
+            if (this.getParam('collapse') == true)
+                classes.push('collapsed');
+
+            if ((gutter = this.getParam('gutter')) == false)
+                classes.push('nogutter');
+
+            // add custom user style name
+            classes.push(this.getParam('class-name'));
+
+            // add brush alias to the class name for custom CSS
+            classes.push(this.getParam('brush'));
+
+            code = trimFirstAndLastLines(code)
+                .replace(/\r/g, ' ') // IE lets these buggers through
+            ;
+
+            tabSize = this.getParam('tab-size');
+
+            // replace tabs with spaces
+            code = this.getParam('smart-tabs') == true
+                ? processSmartTabs(code, tabSize)
+                : processTabs(code, tabSize)
+            ;
+
+            // unindent code by the common indentation
+            if (this.getParam('unindent'))
+                code = unindent(code);
+
+            if (gutter)
+                lineNumbers = this.figureOutLineNumbers(code);
+
+            // find matches in the code using brushes regex list
+            matches = this.findMatches(this.regexList, code);
+            // processes found matches into the html
+            html = this.getMatchesHtml(code, matches);
+            // finally, split all lines so that they wrap well
+            html = this.getCodeLinesHtml(html, lineNumbers);
+
+            // finally, process the links
+            if (this.getParam('auto-links'))
+                html = processUrls(html);
+
+            if (typeof(navigator) != 'undefined' && navigator.userAgent && navigator.userAgent.match(/MSIE/))
+                classes.push('ie');
+
+            html =
+                '<div id="' + getHighlighterId(this.id) + '" class="' + classes.join(' ') + '">'
+                    + (this.getParam('toolbar') ? sh.toolbar.getHtml(this) : '')
+                    + '<table border="0" cellpadding="0" cellspacing="0">'
+                    + this.getTitleHtml(this.getParam('title'))
+                    + '<tbody>'
+                    + '<tr>'
+                    + (gutter ? '<td class="gutter">' + this.getLineNumbersHtml(code) + '</td>' : '')
+                    + '<td class="code">'
+                    + '<div class="container">'
+                    + html
+                    + '</div>'
+                    + '</td>'
+                    + '</tr>'
+                    + '</tbody>'
+                    + '</table>'
+                    + '</div>'
+            ;
+
+            return html;
+        },
+
+        /**
+         * Highlights the code and returns complete HTML.
+         * @param {String} code     Code to highlight.
+         * @return {Element}        Returns container DIV element with all markup.
+         */
+        getDiv: function(code)
+        {
+            if (code === null)
+                code = '';
+
+            this.code = code;
+
+            var div = this.create('div');
+
+            // create main HTML
+            div.innerHTML = this.getHtml(code);
+
+            // set up click handlers
+            if (this.getParam('toolbar'))
+                attachEvent(findElement(div, '.toolbar'), 'click', sh.toolbar.handler);
+
+            if (this.getParam('quick-code'))
+                attachEvent(findElement(div, '.code'), 'dblclick', quickCodeHandler);
+
+            return div;
+        },
+
+        /**
+         * Initializes the highlighter/brush.
+         *
+         * Constructor isn't used for initialization so that nothing executes during necessary
+         * `new SyntaxHighlighter.Highlighter()` call when setting up brush inheritence.
+         *
+         * @param {Hash} params Highlighter parameters.
+         */
+        init: function(params)
+        {
+            this.id = guid();
+
+            // register this instance in the highlighters list
+            storeHighlighter(this);
+
+            // local params take precedence over defaults
+            this.params = merge(sh.defaults, params || {})
+
+            // process light mode
+            if (this.getParam('light') == true)
+                this.params.toolbar = this.params.gutter = false;
+        },
+
+        /**
+         * Converts space separated list of keywords into a regular expression string.
+         * @param {String} str    Space separated keywords.
+         * @return {String}       Returns regular expression string.
+         */
+        getKeywords: function(str)
+        {
+            str = str
+                .replace(/^\s+|\s+$/g, '')
+                .replace(/\s+/g, '|')
+            ;
+
+            return '\\b(?:' + str + ')\\b';
+        },
+
+        /**
+         * Makes a brush compatible with the `html-script` functionality.
+         * @param {Object} regexGroup Object containing `left` and `right` regular expressions.
+         */
+        forHtmlScript: function(regexGroup)
+        {
+            var regex = { 'end' : regexGroup.right.source };
+
+            if(regexGroup.eof)
+                regex.end = "(?:(?:" + regex.end + ")|$)";
+
+            this.htmlScript = {
+                left : { regex: regexGroup.left, css: 'script' },
+                right : { regex: regexGroup.right, css: 'script' },
+                code : new XRegExp(
+                    "(?<left>" + regexGroup.left.source + ")" +
+                        "(?<code>.*?)" +
+                        "(?<right>" + regex.end + ")",
+                    "sgi"
+                )
+            };
+        }
+    }; // end of Highlighter
+
+    return sh;
+}(); // end of anonymous function
+
+// CommonJS
+typeof(exports) != 'undefined' ? exports.SyntaxHighlighter = SyntaxHighlighter : null;
+
+;(function()
+{
+    // CommonJS
+    SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+    function Brush()
+    {
+        // Created by Peter Atoria @ http://iAtoria.com
+
+        var inits 	 =  'class interface function package';
+
+        var keywords =	'-Infinity ...rest Array as AS3 Boolean break case catch const continue Date decodeURI ' +
+                'decodeURIComponent default delete do dynamic each else encodeURI encodeURIComponent escape ' +
+                'extends false final finally flash_proxy for get if implements import in include Infinity ' +
+                'instanceof int internal is isFinite isNaN isXMLName label namespace NaN native new null ' +
+                'Null Number Object object_proxy override parseFloat parseInt private protected public ' +
+                'return set static String super switch this throw true try typeof uint undefined unescape ' +
+                'use void while with'
+            ;
+
+        this.regexList = [
+            { regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },		// one line comments
+            { regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },		// multiline comments
+            { regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },		// double quoted strings
+            { regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },		// single quoted strings
+            { regex: /\b([\d]+(\.[\d]+)?|0x[a-f0-9]+)\b/gi,				css: 'value' },			// numbers
+            { regex: new RegExp(this.getKeywords(inits), 'gm'),			css: 'color3' },		// initializations
+            { regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' },		// keywords
+            { regex: new RegExp('var', 'gm'),							css: 'variable' },		// variable
+            { regex: new RegExp('trace', 'gm'),							css: 'color1' }			// trace
+        ];
+
+        this.forHtmlScript(SyntaxHighlighter.regexLib.scriptScriptTags);
+    };
+
+    Brush.prototype	= new SyntaxHighlighter.Highlighter();
+    Brush.aliases	= ['actionscript3', 'as3'];
+
+    SyntaxHighlighter.brushes.AS3 = Brush;
+
+    // CommonJS
+    typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+
+;(function()
+{
+    // CommonJS
+    SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+    function Brush()
+    {
+        // AppleScript brush by David Chambers
+        // http://davidchambersdesign.com/
+        var keywords   = 'after before beginning continue copy each end every from return get global in local named of set some that the then times to where whose with without';
+        var ordinals   = 'first second third fourth fifth sixth seventh eighth ninth tenth last front back middle';
+        var specials   = 'activate add alias AppleScript ask attachment boolean class constant delete duplicate empty exists false id integer list make message modal modified new no paragraph pi properties quit real record remove rest result reveal reverse run running save string true word yes';
+
+        this.regexList = [
+
+            { regex: /(--|#).*$/gm,
+                css: 'comments' },
+
+            { regex: /\(\*(?:[\s\S]*?\(\*[\s\S]*?\*\))*[\s\S]*?\*\)/gm, // support nested comments
+                css: 'comments' },
+
+            { regex: /"[\s\S]*?"/gm,
+                css: 'string' },
+
+            { regex: /(?:,|:|¬|'s\b|\(|\)|\{|\}|«|\b\w*»)/g,
+                css: 'color1' },
+
+            { regex: /(-)?(\d)+(\.(\d)?)?(E\+(\d)+)?/g, // numbers
+                css: 'color1' },
+
+            { regex: /(?:&(amp;|gt;|lt;)?|=|� |>|<|≥|>=|≤|<=|\*|\+|-|\/|÷|\^)/g,
+                css: 'color2' },
+
+            { regex: /\b(?:and|as|div|mod|not|or|return(?!\s&)(ing)?|equals|(is(n't| not)? )?equal( to)?|does(n't| not) equal|(is(n't| not)? )?(greater|less) than( or equal( to)?)?|(comes|does(n't| not) come) (after|before)|is(n't| not)?( in)? (back|front) of|is(n't| not)? behind|is(n't| not)?( (in|contained by))?|does(n't| not) contain|contain(s)?|(start|begin|end)(s)? with|((but|end) )?(consider|ignor)ing|prop(erty)?|(a )?ref(erence)?( to)?|repeat (until|while|with)|((end|exit) )?repeat|((else|end) )?if|else|(end )?(script|tell|try)|(on )?error|(put )?into|(of )?(it|me)|its|my|with (timeout( of)?|transaction)|end (timeout|transaction))\b/g,
+                css: 'keyword' },
+
+            { regex: /\b\d+(st|nd|rd|th)\b/g, // ordinals
+                css: 'keyword' },
+
+            { regex: /\b(?:about|above|against|around|at|below|beneath|beside|between|by|(apart|aside) from|(instead|out) of|into|on(to)?|over|since|thr(ough|u)|under)\b/g,
+                css: 'color3' },
+
+            { regex: /\b(?:adding folder items to|after receiving|choose( ((remote )?application|color|folder|from list|URL))?|clipboard info|set the clipboard to|(the )?clipboard|entire contents|display(ing| (alert|dialog|mode))?|document( (edited|file|nib name))?|file( (name|type))?|(info )?for|giving up after|(name )?extension|quoted form|return(ed)?|second(?! item)(s)?|list (disks|folder)|text item(s| delimiters)?|(Unicode )?text|(disk )?item(s)?|((current|list) )?view|((container|key) )?window|with (data|icon( (caution|note|stop))?|parameter(s)?|prompt|properties|seed|title)|case|diacriticals|hyphens|numeric strings|punctuation|white space|folder creation|application(s( folder)?| (processes|scripts position|support))?|((desktop )?(pictures )?|(documents|downloads|favorites|home|keychain|library|movies|music|public|scripts|sites|system|users|utilities|workflows) )folder|desktop|Folder Action scripts|font(s| panel)?|help|internet plugins|modem scripts|(system )?preferences|printer descriptions|scripting (additions|components)|shared (documents|libraries)|startup (disk|items)|temporary items|trash|on server|in AppleTalk zone|((as|long|short) )?user name|user (ID|locale)|(with )?password|in (bundle( with identifier)?|directory)|(close|open for) access|read|write( permission)?|(g|s)et eof|using( delimiters)?|starting at|default (answer|button|color|country code|entr(y|ies)|identifiers|items|name|location|script editor)|hidden( answer)?|open(ed| (location|untitled))?|error (handling|reporting)|(do( shell)?|load|run|store) script|administrator privileges|altering line endings|get volume settings|(alert|boot|input|mount|output|set) volume|output muted|(fax|random )?number|round(ing)?|up|down|toward zero|to nearest|as taught in school|system (attribute|info)|((AppleScript( Studio)?|system) )?version|(home )?directory|(IPv4|primary Ethernet) address|CPU (type|speed)|physical memory|time (stamp|to GMT)|replacing|ASCII (character|number)|localized string|from table|offset|summarize|beep|delay|say|(empty|multiple) selections allowed|(of|preferred) type|invisibles|showing( package contents)?|editable URL|(File|FTP|News|Media|Web) [Ss]ervers|Telnet hosts|Directory services|Remote applications|waiting until completion|saving( (in|to))?|path (for|to( (((current|frontmost) )?application|resource))?)|POSIX (file|path)|(background|RGB) color|(OK|cancel) button name|cancel button|button(s)?|cubic ((centi)?met(re|er)s|yards|feet|inches)|square ((kilo)?met(re|er)s|miles|yards|feet)|(centi|kilo)?met(re|er)s|miles|yards|feet|inches|lit(re|er)s|gallons|quarts|(kilo)?grams|ounces|pounds|degrees (Celsius|Fahrenheit|Kelvin)|print( (dialog|settings))?|clos(e(able)?|ing)|(de)?miniaturized|miniaturizable|zoom(ed|able)|attribute run|action (method|property|title)|phone|email|((start|end)ing|home) page|((birth|creation|current|custom|modification) )?date|((((phonetic )?(first|last|middle))|computer|host|maiden|related) |nick)?name|aim|icq|jabber|msn|yahoo|address(es)?|save addressbook|should enable action|city|country( code)?|formatte(r|d address)|(palette )?label|state|street|zip|AIM [Hh]andle(s)?|my card|select(ion| all)?|unsaved|(alpha )?value|entr(y|ies)|group|(ICQ|Jabber|MSN) handle|person|people|company|department|icon image|job title|note|organization|suffix|vcard|url|copies|collating|pages (across|down)|request print time|target( printer)?|((GUI Scripting|Script menu) )?enabled|show Computer scripts|(de)?activated|awake from nib|became (key|main)|call method|of (class|object)|center|clicked toolbar item|closed|for document|exposed|(can )?hide|idle|keyboard (down|up)|event( (number|type))?|launch(ed)?|load (image|movie|nib|sound)|owner|log|mouse (down|dragged|entered|exited|moved|up)|move|column|localization|resource|script|register|drag (info|types)|resigned (active|key|main)|resiz(e(d)?|able)|right mouse (down|dragged|up)|scroll wheel|(at )?index|should (close|open( untitled)?|quit( after last window closed)?|zoom)|((proposed|screen) )?bounds|show(n)?|behind|in front of|size (mode|to fit)|update(d| toolbar item)?|was (hidden|miniaturized)|will (become active|close|finish launching|hide|miniaturize|move|open|quit|(resign )?active|((maximum|minimum|proposed) )?size|show|zoom)|bundle|data source|movie|pasteboard|sound|tool(bar| tip)|(color|open|save) panel|coordinate system|frontmost|main( (bundle|menu|window))?|((services|(excluded from )?windows) )?menu|((executable|frameworks|resource|scripts|shared (frameworks|support)) )?path|(selected item )?identifier|data|content(s| view)?|character(s)?|click count|(command|control|option|shift) key down|context|delta (x|y|z)|key( code)?|location|pressure|unmodified characters|types|(first )?responder|playing|(allowed|selectable) identifiers|allows customization|(auto saves )?configuration|visible|image( name)?|menu form representation|tag|user(-| )defaults|associated file name|(auto|needs) display|current field editor|floating|has (resize indicator|shadow)|hides when deactivated|level|minimized (image|title)|opaque|position|release when closed|sheet|title(d)?)\b/g,
+                css: 'color3' },
+
+            { regex: new RegExp(this.getKeywords(specials), 'gm'), css: 'color3' },
+            { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' },
+            { regex: new RegExp(this.getKeywords(ordinals), 'gm'), css: 'keyword' }
+        ];
+    };
+
+    Brush.prototype = new SyntaxHighlighter.Highlighter();
+    Brush.aliases = ['applescript'];
+
+    SyntaxHighlighter.brushes.AppleScript = Brush;
+
+    // CommonJS
+    typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'if fi then elif else for do done until while break continue case esac function return in eq ne ge le';
+		var commands =  'alias apropos awk basename bash bc bg builtin bzip2 cal cat cd cfdisk chgrp chmod chown chroot' +
+						'cksum clear cmp comm command cp cron crontab csplit cut date dc dd ddrescue declare df ' +
+						'diff diff3 dig dir dircolors dirname dirs du echo egrep eject enable env ethtool eval ' +
+						'exec exit expand export expr false fdformat fdisk fg fgrep file find fmt fold format ' +
+						'free fsck ftp gawk getopts grep groups gzip hash head history hostname id ifconfig ' +
+						'import install join kill less let ln local locate logname logout look lpc lpr lprint ' +
+						'lprintd lprintq lprm ls lsof make man mkdir mkfifo mkisofs mknod more mount mtools ' +
+						'mv netstat nice nl nohup nslookup open op passwd paste pathchk ping popd pr printcap ' +
+						'printenv printf ps pushd pwd quota quotacheck quotactl ram rcp read readonly renice ' +
+						'remsync rm rmdir rsync screen scp sdiff sed select seq set sftp shift shopt shutdown ' +
+						'sleep sort source split ssh strace su sudo sum symlink sync tail tar tee test time ' +
+						'times touch top traceroute trap tr true tsort tty type ulimit umask umount unalias ' +
+						'uname unexpand uniq units unset unshar useradd usermod users uuencode uudecode v vdir ' +
+						'vi watch wc whereis which who whoami Wget xargs yes'
+						;
+
+		this.regexList = [
+			{ regex: /^#!.*$/gm,											css: 'preprocessor bold' },
+			{ regex: /\/[\w-\/]+/gm,										css: 'plain' },
+			{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments,		css: 'comments' },		// one line comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,			css: 'string' },		// double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,			css: 'string' },		// single quoted strings
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),			css: 'keyword' },		// keywords
+			{ regex: new RegExp(this.getKeywords(commands), 'gm'),			css: 'functions' }		// commands
+			];
+	}
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['bash', 'shell', 'sh'];
+
+	SyntaxHighlighter.brushes.Bash = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Jen
+		// http://www.jensbits.com/2009/05/14/coldfusion-brush-for-syntaxhighlighter-plus
+	
+		var funcs	=	'Abs ACos AddSOAPRequestHeader AddSOAPResponseHeader AjaxLink AjaxOnLoad ArrayAppend ArrayAvg ArrayClear ArrayDeleteAt ' + 
+						'ArrayInsertAt ArrayIsDefined ArrayIsEmpty ArrayLen ArrayMax ArrayMin ArraySet ArraySort ArraySum ArraySwap ArrayToList ' + 
+						'Asc ASin Atn BinaryDecode BinaryEncode BitAnd BitMaskClear BitMaskRead BitMaskSet BitNot BitOr BitSHLN BitSHRN BitXor ' + 
+						'Ceiling CharsetDecode CharsetEncode Chr CJustify Compare CompareNoCase Cos CreateDate CreateDateTime CreateObject ' + 
+						'CreateODBCDate CreateODBCDateTime CreateODBCTime CreateTime CreateTimeSpan CreateUUID DateAdd DateCompare DateConvert ' + 
+						'DateDiff DateFormat DatePart Day DayOfWeek DayOfWeekAsString DayOfYear DaysInMonth DaysInYear DE DecimalFormat DecrementValue ' + 
+						'Decrypt DecryptBinary DeleteClientVariable DeserializeJSON DirectoryExists DollarFormat DotNetToCFType Duplicate Encrypt ' + 
+						'EncryptBinary Evaluate Exp ExpandPath FileClose FileCopy FileDelete FileExists FileIsEOF FileMove FileOpen FileRead ' + 
+						'FileReadBinary FileReadLine FileSetAccessMode FileSetAttribute FileSetLastModified FileWrite Find FindNoCase FindOneOf ' + 
+						'FirstDayOfMonth Fix FormatBaseN GenerateSecretKey GetAuthUser GetBaseTagData GetBaseTagList GetBaseTemplatePath ' + 
+						'GetClientVariablesList GetComponentMetaData GetContextRoot GetCurrentTemplatePath GetDirectoryFromPath GetEncoding ' + 
+						'GetException GetFileFromPath GetFileInfo GetFunctionList GetGatewayHelper GetHttpRequestData GetHttpTimeString ' + 
+						'GetK2ServerDocCount GetK2ServerDocCountLimit GetLocale GetLocaleDisplayName GetLocalHostIP GetMetaData GetMetricData ' + 
+						'GetPageContext GetPrinterInfo GetProfileSections GetProfileString GetReadableImageFormats GetSOAPRequest GetSOAPRequestHeader ' + 
+						'GetSOAPResponse GetSOAPResponseHeader GetTempDirectory GetTempFile GetTemplatePath GetTickCount GetTimeZoneInfo GetToken ' + 
+						'GetUserRoles GetWriteableImageFormats Hash Hour HTMLCodeFormat HTMLEditFormat IIf ImageAddBorder ImageBlur ImageClearRect ' + 
+						'ImageCopy ImageCrop ImageDrawArc ImageDrawBeveledRect ImageDrawCubicCurve ImageDrawLine ImageDrawLines ImageDrawOval ' + 
+						'ImageDrawPoint ImageDrawQuadraticCurve ImageDrawRect ImageDrawRoundRect ImageDrawText ImageFlip ImageGetBlob ImageGetBufferedImage ' + 
+						'ImageGetEXIFTag ImageGetHeight ImageGetIPTCTag ImageGetWidth ImageGrayscale ImageInfo ImageNegative ImageNew ImageOverlay ImagePaste ' + 
+						'ImageRead ImageReadBase64 ImageResize ImageRotate ImageRotateDrawingAxis ImageScaleToFit ImageSetAntialiasing ImageSetBackgroundColor ' + 
+						'ImageSetDrawingColor ImageSetDrawingStroke ImageSetDrawingTransparency ImageSharpen ImageShear ImageShearDrawingAxis ImageTranslate ' + 
+						'ImageTranslateDrawingAxis ImageWrite ImageWriteBase64 ImageXORDrawingMode IncrementValue InputBaseN Insert Int IsArray IsBinary ' + 
+						'IsBoolean IsCustomFunction IsDate IsDDX IsDebugMode IsDefined IsImage IsImageFile IsInstanceOf IsJSON IsLeapYear IsLocalHost ' + 
+						'IsNumeric IsNumericDate IsObject IsPDFFile IsPDFObject IsQuery IsSimpleValue IsSOAPRequest IsStruct IsUserInAnyRole IsUserInRole ' + 
+						'IsUserLoggedIn IsValid IsWDDX IsXML IsXmlAttribute IsXmlDoc IsXmlElem IsXmlNode IsXmlRoot JavaCast JSStringFormat LCase Left Len ' + 
+						'ListAppend ListChangeDelims ListContains ListContainsNoCase ListDeleteAt ListFind ListFindNoCase ListFirst ListGetAt ListInsertAt ' + 
+						'ListLast ListLen ListPrepend ListQualify ListRest ListSetAt ListSort ListToArray ListValueCount ListValueCountNoCase LJustify Log ' + 
+						'Log10 LSCurrencyFormat LSDateFormat LSEuroCurrencyFormat LSIsCurrency LSIsDate LSIsNumeric LSNumberFormat LSParseCurrency LSParseDateTime ' + 
+						'LSParseEuroCurrency LSParseNumber LSTimeFormat LTrim Max Mid Min Minute Month MonthAsString Now NumberFormat ParagraphFormat ParseDateTime ' + 
+						'Pi PrecisionEvaluate PreserveSingleQuotes Quarter QueryAddColumn QueryAddRow QueryConvertForGrid QueryNew QuerySetCell QuotedValueList Rand ' + 
+						'Randomize RandRange REFind REFindNoCase ReleaseComObject REMatch REMatchNoCase RemoveChars RepeatString Replace ReplaceList ReplaceNoCase ' + 
+						'REReplace REReplaceNoCase Reverse Right RJustify Round RTrim Second SendGatewayMessage SerializeJSON SetEncoding SetLocale SetProfileString ' + 
+						'SetVariable Sgn Sin Sleep SpanExcluding SpanIncluding Sqr StripCR StructAppend StructClear StructCopy StructCount StructDelete StructFind ' + 
+						'StructFindKey StructFindValue StructGet StructInsert StructIsEmpty StructKeyArray StructKeyExists StructKeyList StructKeyList StructNew ' + 
+						'StructSort StructUpdate Tan TimeFormat ToBase64 ToBinary ToScript ToString Trim UCase URLDecode URLEncodedFormat URLSessionFormat Val ' + 
+						'ValueList VerifyClient Week Wrap Wrap WriteOutput XmlChildPos XmlElemNew XmlFormat XmlGetNodeType XmlNew XmlParse XmlSearch XmlTransform ' + 
+						'XmlValidate Year YesNoFormat';
+
+		var keywords =	'cfabort cfajaximport cfajaxproxy cfapplet cfapplication cfargument cfassociate cfbreak cfcache cfcalendar ' + 
+						'cfcase cfcatch cfchart cfchartdata cfchartseries cfcol cfcollection cfcomponent cfcontent cfcookie cfdbinfo ' + 
+						'cfdefaultcase cfdirectory cfdiv cfdocument cfdocumentitem cfdocumentsection cfdump cfelse cfelseif cferror ' + 
+						'cfexchangecalendar cfexchangeconnection cfexchangecontact cfexchangefilter cfexchangemail cfexchangetask ' + 
+						'cfexecute cfexit cffeed cffile cfflush cfform cfformgroup cfformitem cfftp cffunction cfgrid cfgridcolumn ' + 
+						'cfgridrow cfgridupdate cfheader cfhtmlhead cfhttp cfhttpparam cfif cfimage cfimport cfinclude cfindex ' + 
+						'cfinput cfinsert cfinterface cfinvoke cfinvokeargument cflayout cflayoutarea cfldap cflocation cflock cflog ' + 
+						'cflogin cfloginuser cflogout cfloop cfmail cfmailparam cfmailpart cfmenu cfmenuitem cfmodule cfNTauthenticate ' + 
+						'cfobject cfobjectcache cfoutput cfparam cfpdf cfpdfform cfpdfformparam cfpdfparam cfpdfsubform cfpod cfpop ' + 
+						'cfpresentation cfpresentationslide cfpresenter cfprint cfprocessingdirective cfprocparam cfprocresult ' + 
+						'cfproperty cfquery cfqueryparam cfregistry cfreport cfreportparam cfrethrow cfreturn cfsavecontent cfschedule ' + 
+						'cfscript cfsearch cfselect cfset cfsetting cfsilent cfslider cfsprydataset cfstoredproc cfswitch cftable ' + 
+						'cftextarea cfthread cfthrow cftimer cftooltip cftrace cftransaction cftree cftreeitem cftry cfupdate cfwddx ' + 
+						'cfwindow cfxml cfzip cfzipparam';
+
+		var operators =	'all and any between cross in join like not null or outer some';
+
+		this.regexList = [
+			{ regex: new RegExp('--(.*)$', 'gm'),						css: 'comments' },  // one line and multiline comments
+			{ regex: SyntaxHighlighter.regexLib.xmlComments,			css: 'comments' },    // single quoted strings
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },    // double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },    // single quoted strings
+			{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),		css: 'functions' }, // functions
+			{ regex: new RegExp(this.getKeywords(operators), 'gmi'),	css: 'color1' },    // operators and such
+			{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),		css: 'keyword' }    // keyword
+			];
+	}
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['coldfusion','cf'];
+	
+	SyntaxHighlighter.brushes.ColdFusion = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Copyright 2006 Shin, YoungJin
+	
+		var datatypes =	'ATOM BOOL BOOLEAN BYTE CHAR COLORREF DWORD DWORDLONG DWORD_PTR ' +
+						'DWORD32 DWORD64 FLOAT HACCEL HALF_PTR HANDLE HBITMAP HBRUSH ' +
+						'HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP ' +
+						'HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HINSTANCE HKEY ' +
+						'HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRESULT ' +
+						'HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 INT64 LANGID LCID LCTYPE ' +
+						'LGRPID LONG LONGLONG LONG_PTR LONG32 LONG64 LPARAM LPBOOL LPBYTE LPCOLORREF ' +
+						'LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR ' +
+						'LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWSTR ' +
+						'PDWORDLONG PDWORD_PTR PDWORD32 PDWORD64 PFLOAT PHALF_PTR PHANDLE PHKEY PINT ' +
+						'PINT_PTR PINT32 PINT64 PLCID PLONG PLONGLONG PLONG_PTR PLONG32 PLONG64 POINTER_32 ' +
+						'POINTER_64 PSHORT PSIZE_T PSSIZE_T PSTR PTBYTE PTCHAR PTSTR PUCHAR PUHALF_PTR ' +
+						'PUINT PUINT_PTR PUINT32 PUINT64 PULONG PULONGLONG PULONG_PTR PULONG32 PULONG64 ' +
+						'PUSHORT PVOID PWCHAR PWORD PWSTR SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SHORT ' +
+						'SIZE_T SSIZE_T TBYTE TCHAR UCHAR UHALF_PTR UINT UINT_PTR UINT32 UINT64 ULONG ' +
+						'ULONGLONG ULONG_PTR ULONG32 ULONG64 USHORT USN VOID WCHAR WORD WPARAM WPARAM WPARAM ' +
+						'char bool short int __int32 __int64 __int8 __int16 long float double __wchar_t ' +
+						'clock_t _complex _dev_t _diskfree_t div_t ldiv_t _exception _EXCEPTION_POINTERS ' +
+						'FILE _finddata_t _finddatai64_t _wfinddata_t _wfinddatai64_t __finddata64_t ' +
+						'__wfinddata64_t _FPIEEE_RECORD fpos_t _HEAPINFO _HFILE lconv intptr_t ' +
+						'jmp_buf mbstate_t _off_t _onexit_t _PNH ptrdiff_t _purecall_handler ' +
+						'sig_atomic_t size_t _stat __stat64 _stati64 terminate_function ' +
+						'time_t __time64_t _timeb __timeb64 tm uintptr_t _utimbuf ' +
+						'va_list wchar_t wctrans_t wctype_t wint_t signed';
+
+		var keywords =	'auto break case catch class const decltype __finally __exception __try ' +
+						'const_cast continue private public protected __declspec ' +
+						'default delete deprecated dllexport dllimport do dynamic_cast ' +
+						'else enum explicit extern if for friend goto inline ' +
+						'mutable naked namespace new noinline noreturn nothrow ' +
+						'register reinterpret_cast return selectany ' +
+						'sizeof static static_cast struct switch template this ' +
+						'thread throw true false try typedef typeid typename union ' +
+						'using uuid virtual void volatile whcar_t while';
+					
+		var functions =	'assert isalnum isalpha iscntrl isdigit isgraph islower isprint' +
+						'ispunct isspace isupper isxdigit tolower toupper errno localeconv ' +
+						'setlocale acos asin atan atan2 ceil cos cosh exp fabs floor fmod ' +
+						'frexp ldexp log log10 modf pow sin sinh sqrt tan tanh jmp_buf ' +
+						'longjmp setjmp raise signal sig_atomic_t va_arg va_end va_start ' +
+						'clearerr fclose feof ferror fflush fgetc fgetpos fgets fopen ' +
+						'fprintf fputc fputs fread freopen fscanf fseek fsetpos ftell ' +
+						'fwrite getc getchar gets perror printf putc putchar puts remove ' +
+						'rename rewind scanf setbuf setvbuf sprintf sscanf tmpfile tmpnam ' +
+						'ungetc vfprintf vprintf vsprintf abort abs atexit atof atoi atol ' +
+						'bsearch calloc div exit free getenv labs ldiv malloc mblen mbstowcs ' +
+						'mbtowc qsort rand realloc srand strtod strtol strtoul system ' +
+						'wcstombs wctomb memchr memcmp memcpy memmove memset strcat strchr ' +
+						'strcmp strcoll strcpy strcspn strerror strlen strncat strncmp ' +
+						'strncpy strpbrk strrchr strspn strstr strtok strxfrm asctime ' +
+						'clock ctime difftime gmtime localtime mktime strftime time';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },			// one line comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },			// multiline comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },			// strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },			// strings
+			{ regex: /^ *#.*/gm,										css: 'preprocessor' },
+			{ regex: new RegExp(this.getKeywords(datatypes), 'gm'),		css: 'color1 bold' },
+			{ regex: new RegExp(this.getKeywords(functions), 'gm'),		css: 'functions bold' },
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword bold' }
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['cpp', 'c'];
+
+	SyntaxHighlighter.brushes.Cpp = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'abstract as base bool break byte case catch char checked class const ' +
+						'continue decimal default delegate do double else enum event explicit volatile ' +
+						'extern false finally fixed float for foreach get goto if implicit in int ' +
+						'interface internal is lock long namespace new null object operator out ' +
+						'override params private protected public readonly ref return sbyte sealed set ' +
+						'short sizeof stackalloc static string struct switch this throw true try ' +
+						'typeof uint ulong unchecked unsafe ushort using virtual void while var ' +
+						'from group by into select let where orderby join on equals ascending descending';
+
+		function fixComments(match, regexInfo)
+		{
+			var css = (match[0].indexOf("///") == 0)
+				? 'color1'
+				: 'comments'
+				;
+			
+			return [new SyntaxHighlighter.Match(match[0], match.index, css)];
+		}
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	func : fixComments },		// one line comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },			// multiline comments
+			{ regex: /@"(?:[^"]|"")*"/g,								css: 'string' },			// @-quoted strings
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },			// strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },			// strings
+			{ regex: /^\s*#.*/gm,										css: 'preprocessor' },		// preprocessor tags like #region and #endregion
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' },			// c# keyword
+			{ regex: /\bpartial(?=\s+(?:class|interface|struct)\b)/g,	css: 'keyword' },			// contextual keyword: 'partial'
+			{ regex: /\byield(?=\s+(?:return|break)\b)/g,				css: 'keyword' }			// contextual keyword: 'yield'
+			];
+		
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['c#', 'c-sharp', 'csharp'];
+
+	SyntaxHighlighter.brushes.CSharp = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		function getKeywordsCSS(str)
+		{
+			return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b';
+		};
+	
+		function getValuesCSS(str)
+		{
+			return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b';
+		};
+
+		var keywords =	'ascent azimuth background-attachment background-color background-image background-position ' +
+						'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
+						'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
+						'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
+						'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
+						'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
+						'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
+						'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
+						'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
+						'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
+						'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
+						'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
+						'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
+						'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
+
+		var values =	'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
+						'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
+						'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double '+
+						'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
+						'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
+						'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
+						'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
+						'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
+						'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
+						'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
+						'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
+						'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
+						'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
+						'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
+
+		var fonts =		'[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';
+	
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },	// multiline comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },	// double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },	// single quoted strings
+			{ regex: /\#[a-fA-F0-9]{3,6}/g,								css: 'value' },		// html colors
+			{ regex: /(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)/g,				css: 'value' },		// sizes
+			{ regex: /!important/g,										css: 'color3' },	// !important
+			{ regex: new RegExp(getKeywordsCSS(keywords), 'gm'),		css: 'keyword' },	// keywords
+			{ regex: new RegExp(getValuesCSS(values), 'g'),				css: 'value' },		// values
+			{ regex: new RegExp(this.getKeywords(fonts), 'g'),			css: 'color1' }		// fonts
+			];
+
+		this.forHtmlScript({ 
+			left: /(&lt;|<)\s*style.*?(&gt;|>)/gi, 
+			right: /(&lt;|<)\/\s*style\s*(&gt;|>)/gi 
+			});
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['css'];
+
+	SyntaxHighlighter.brushes.CSS = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'abs addr and ansichar ansistring array as asm begin boolean byte cardinal ' +
+						'case char class comp const constructor currency destructor div do double ' +
+						'downto else end except exports extended false file finalization finally ' +
+						'for function goto if implementation in inherited int64 initialization ' +
+						'integer interface is label library longint longword mod nil not object ' +
+						'of on or packed pansichar pansistring pchar pcurrency pdatetime pextended ' +
+						'pint64 pointer private procedure program property pshortstring pstring ' +
+						'pvariant pwidechar pwidestring protected public published raise real real48 ' +
+						'record repeat set shl shortint shortstring shr single smallint string then ' +
+						'threadvar to true try type unit until uses val var varirnt while widechar ' +
+						'widestring with word write writeln xor';
+
+		this.regexList = [
+			{ regex: /\(\*[\s\S]*?\*\)/gm,								css: 'comments' },  	// multiline comments (* *)
+			{ regex: /{(?!\$)[\s\S]*?}/gm,								css: 'comments' },  	// multiline comments { }
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },  	// one line
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },		// strings
+			{ regex: /\{\$[a-zA-Z]+ .+\}/g,								css: 'color1' },		// compiler Directives and Region tags
+			{ regex: /\b[\d\.]+\b/g,									css: 'value' },			// numbers 12345
+			{ regex: /\$[a-zA-Z0-9]+\b/g,								css: 'value' },			// numbers $F5D3
+			{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),		css: 'keyword' }		// keyword
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['delphi', 'pascal', 'pas'];
+
+	SyntaxHighlighter.brushes.Delphi = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		this.regexList = [
+			{ regex: /^\+\+\+ .*$/gm,	css: 'color2' },	// new file
+			{ regex: /^\-\-\- .*$/gm,	css: 'color2' },	// old file
+			{ regex: /^\s.*$/gm,		css: 'color1' },	// unchanged
+			{ regex: /^@@.*@@.*$/gm,	css: 'variable' },	// location
+			{ regex: /^\+.*$/gm,		css: 'string' },	// additions
+			{ regex: /^\-.*$/gm,		css: 'color3' }		// deletions
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['diff', 'patch'];
+
+	SyntaxHighlighter.brushes.Diff = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Jean-Lou Dupont
+		// http://jldupont.blogspot.com/2009/06/erlang-syntax-highlighter.html  
+
+		// According to: http://erlang.org/doc/reference_manual/introduction.html#1.5
+		var keywords = 'after and andalso band begin bnot bor bsl bsr bxor '+
+			'case catch cond div end fun if let not of or orelse '+
+			'query receive rem try when xor'+
+			// additional
+			' module export import define';
+
+		this.regexList = [
+			{ regex: new RegExp("[A-Z][A-Za-z0-9_]+", 'g'), 			css: 'constants' },
+			{ regex: new RegExp("\\%.+", 'gm'), 						css: 'comments' },
+			{ regex: new RegExp("\\?[A-Za-z0-9_]+", 'g'), 				css: 'preprocessor' },
+			{ regex: new RegExp("[a-z0-9_]+:[a-z0-9_]+", 'g'), 			css: 'functions' },
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },
+			{ regex: new RegExp(this.getKeywords(keywords),	'gm'),		css: 'keyword' }
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['erl', 'erlang'];
+
+	SyntaxHighlighter.brushes.Erland = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Andres Almiray
+		// http://jroller.com/aalmiray/entry/nice_source_code_syntax_highlighter
+
+		var keywords =	'as assert break case catch class continue def default do else extends finally ' +
+						'if in implements import instanceof interface new package property return switch ' +
+						'throw throws try while public protected private static';
+		var types    =  'void boolean byte char short int long float double';
+		var constants = 'null';
+		var methods   = 'allProperties count get size '+
+						'collect each eachProperty eachPropertyName eachWithIndex find findAll ' +
+						'findIndexOf grep inject max min reverseEach sort ' +
+						'asImmutable asSynchronized flatten intersect join pop reverse subMap toList ' +
+						'padRight padLeft contains eachMatch toCharacter toLong toUrl tokenize ' +
+						'eachFile eachFileRecurse eachB yte eachLine readBytes readLine getText ' +
+						'splitEachLine withReader append encodeBase64 decodeBase64 filterLine ' +
+						'transformChar transformLine withOutputStream withPrintWriter withStream ' +
+						'withStreams withWriter withWriterAppend write writeLine '+
+						'dump inspect invokeMethod print println step times upto use waitForOrKill '+
+						'getText';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,				css: 'comments' },		// one line comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,					css: 'comments' },		// multiline comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,					css: 'string' },		// strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,					css: 'string' },		// strings
+			{ regex: /""".*"""/g,													css: 'string' },		// GStrings
+			{ regex: new RegExp('\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b', 'gi'),	css: 'value' },			// numbers
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),					css: 'keyword' },		// goovy keyword
+			{ regex: new RegExp(this.getKeywords(types), 'gm'),						css: 'color1' },		// goovy/java type
+			{ regex: new RegExp(this.getKeywords(constants), 'gm'),					css: 'constants' },		// constants
+			{ regex: new RegExp(this.getKeywords(methods), 'gm'),					css: 'functions' }		// methods
+			];
+
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	}
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['groovy'];
+
+	SyntaxHighlighter.brushes.Groovy = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'abstract assert boolean break byte case catch char class const ' +
+						'continue default do double else enum extends ' +
+						'false final finally float for goto if implements import ' +
+						'instanceof int interface long native new null ' +
+						'package private protected public return ' +
+						'short static strictfp super switch synchronized this throw throws true ' +
+						'transient try void volatile while';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },		// one line comments
+			{ regex: /\/\*([^\*][\s\S]*)?\*\//gm,						css: 'comments' },	 	// multiline comments
+			{ regex: /\/\*(?!\*\/)\*[\s\S]*?\*\//gm,					css: 'preprocessor' },	// documentation comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },		// strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },		// strings
+			{ regex: /\b([\d]+(\.[\d]+)?|0x[a-f0-9]+)\b/gi,				css: 'value' },			// numbers
+			{ regex: /(?!\@interface\b)\@[\$\w]+\b/g,					css: 'color1' },		// annotation @anno
+			{ regex: /\@interface\b/g,									css: 'color2' },		// @interface keyword
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' }		// java keyword
+			];
+
+		this.forHtmlScript({
+			left	: /(&lt;|<)%[@!=]?/g, 
+			right	: /%(&gt;|>)/g 
+		});
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['java'];
+
+	SyntaxHighlighter.brushes.Java = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Patrick Webster
+		// http://patrickwebster.blogspot.com/2009/04/javafx-brush-for-syntaxhighlighter.html
+		var datatypes =	'Boolean Byte Character Double Duration '
+						+ 'Float Integer Long Number Short String Void'
+						;
+
+		var keywords = 'abstract after and as assert at before bind bound break catch class '
+						+ 'continue def delete else exclusive extends false finally first for from '
+						+ 'function if import in indexof init insert instanceof into inverse last '
+						+ 'lazy mixin mod nativearray new not null on or override package postinit '
+						+ 'protected public public-init public-read replace return reverse sizeof '
+						+ 'step super then this throw true try tween typeof var where while with '
+						+ 'attribute let private readonly static trigger'
+						;
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },
+			{ regex: /(-?\.?)(\b(\d*\.?\d+|\d+\.?\d*)(e[+-]?\d+)?|0x[a-f\d]+)\b\.?/gi, css: 'color2' },	// numbers
+			{ regex: new RegExp(this.getKeywords(datatypes), 'gm'),		css: 'variable' },	// datatypes
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' }
+		];
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['jfx', 'javafx'];
+
+	SyntaxHighlighter.brushes.JavaFX = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'break case catch continue ' +
+						'default delete do else false  ' +
+						'for function if in instanceof ' +
+						'new null return super switch ' +
+						'this throw true try typeof var while with'
+						;
+
+		var r = SyntaxHighlighter.regexLib;
+		
+		this.regexList = [
+			{ regex: r.multiLineDoubleQuotedString,					css: 'string' },			// double quoted strings
+			{ regex: r.multiLineSingleQuotedString,					css: 'string' },			// single quoted strings
+			{ regex: r.singleLineCComments,							css: 'comments' },			// one line comments
+			{ regex: r.multiLineCComments,							css: 'comments' },			// multiline comments
+			{ regex: /\s*#.*/gm,									css: 'preprocessor' },		// preprocessor tags like #region and #endregion
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),	css: 'keyword' }			// keywords
+			];
+	
+		this.forHtmlScript(r.scriptScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['js', 'jscript', 'javascript'];
+
+	SyntaxHighlighter.brushes.JScript = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by David Simmons-Duffin and Marty Kube
+	
+		var funcs = 
+			'abs accept alarm atan2 bind binmode chdir chmod chomp chop chown chr ' + 
+			'chroot close closedir connect cos crypt defined delete each endgrent ' + 
+			'endhostent endnetent endprotoent endpwent endservent eof exec exists ' + 
+			'exp fcntl fileno flock fork format formline getc getgrent getgrgid ' + 
+			'getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr ' + 
+			'getnetbyname getnetent getpeername getpgrp getppid getpriority ' + 
+			'getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid ' + 
+			'getservbyname getservbyport getservent getsockname getsockopt glob ' + 
+			'gmtime grep hex index int ioctl join keys kill lc lcfirst length link ' + 
+			'listen localtime lock log lstat map mkdir msgctl msgget msgrcv msgsnd ' + 
+			'oct open opendir ord pack pipe pop pos print printf prototype push ' + 
+			'quotemeta rand read readdir readline readlink readpipe recv rename ' + 
+			'reset reverse rewinddir rindex rmdir scalar seek seekdir select semctl ' + 
+			'semget semop send setgrent sethostent setnetent setpgrp setpriority ' + 
+			'setprotoent setpwent setservent setsockopt shift shmctl shmget shmread ' + 
+			'shmwrite shutdown sin sleep socket socketpair sort splice split sprintf ' + 
+			'sqrt srand stat study substr symlink syscall sysopen sysread sysseek ' + 
+			'system syswrite tell telldir time times tr truncate uc ucfirst umask ' + 
+			'undef unlink unpack unshift utime values vec wait waitpid warn write ' +
+			// feature
+			'say';
+    
+		var keywords =  
+			'bless caller continue dbmclose dbmopen die do dump else elsif eval exit ' +
+			'for foreach goto if import last local my next no our package redo ref ' + 
+			'require return sub tie tied unless untie until use wantarray while ' +
+			// feature
+			'given when default ' +
+			// Try::Tiny
+			'try catch finally ' +
+			// Moose
+			'has extends with before after around override augment';
+    
+		this.regexList = [
+			{ regex: /(<<|&lt;&lt;)((\w+)|(['"])(.+?)\4)[\s\S]+?\n\3\5\n/g,	css: 'string' },	// here doc (maybe html encoded)
+			{ regex: /#.*$/gm,										css: 'comments' },
+			{ regex: /^#!.*\n/g,									css: 'preprocessor' },	// shebang
+			{ regex: /-?\w+(?=\s*=(>|&gt;))/g,	css: 'string' }, // fat comma
+
+			// is this too much?
+			{ regex: /\bq[qwxr]?\([\s\S]*?\)/g,	css: 'string' }, // quote-like operators ()
+			{ regex: /\bq[qwxr]?\{[\s\S]*?\}/g,	css: 'string' }, // quote-like operators {}
+			{ regex: /\bq[qwxr]?\[[\s\S]*?\]/g,	css: 'string' }, // quote-like operators []
+			{ regex: /\bq[qwxr]?(<|&lt;)[\s\S]*?(>|&gt;)/g,	css: 'string' }, // quote-like operators <>
+			{ regex: /\bq[qwxr]?([^\w({<[])[\s\S]*?\1/g,	css: 'string' }, // quote-like operators non-paired
+
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,	css: 'string' },
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,	css: 'string' },
+			// currently ignoring single quote package separator and utf8 names
+			{ regex: /(?:&amp;|[$@%*]|\$#)[a-zA-Z_](\w+|::)*/g,   		css: 'variable' },
+			{ regex: /\b__(?:END|DATA)__\b[\s\S]*$/g,				css: 'comments' },
+			{ regex: /(^|\n)=\w[\s\S]*?(\n=cut\s*\n|$)/g,				css: 'comments' },		// pod
+			{ regex: new RegExp(this.getKeywords(funcs), 'gm'),		css: 'functions' },
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),	css: 'keyword' }
+		];
+
+		this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags);
+	}
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases		= ['perl', 'Perl', 'pl'];
+
+	SyntaxHighlighter.brushes.Perl = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var funcs	=	'abs acos acosh addcslashes addslashes ' +
+						'array_change_key_case array_chunk array_combine array_count_values array_diff '+
+						'array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill '+
+						'array_filter array_flip array_intersect array_intersect_assoc array_intersect_key '+
+						'array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map '+
+						'array_merge array_merge_recursive array_multisort array_pad array_pop array_product '+
+						'array_push array_rand array_reduce array_reverse array_search array_shift '+
+						'array_slice array_splice array_sum array_udiff array_udiff_assoc '+
+						'array_udiff_uassoc array_uintersect array_uintersect_assoc '+
+						'array_uintersect_uassoc array_unique array_unshift array_values array_walk '+
+						'array_walk_recursive atan atan2 atanh base64_decode base64_encode base_convert '+
+						'basename bcadd bccomp bcdiv bcmod bcmul bindec bindtextdomain bzclose bzcompress '+
+						'bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite ceil chdir '+
+						'checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split class_exists '+
+						'closedir closelog copy cos cosh count count_chars date decbin dechex decoct '+
+						'deg2rad delete ebcdic2ascii echo empty end ereg ereg_replace eregi eregi_replace error_log '+
+						'error_reporting escapeshellarg escapeshellcmd eval exec exit exp explode extension_loaded '+
+						'feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents '+
+						'fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype '+
+						'floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread fscanf '+
+						'fseek fsockopen fstat ftell ftok getallheaders getcwd getdate getenv gethostbyaddr gethostbyname '+
+						'gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt '+
+						'getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext '+
+						'gettimeofday gettype glob gmdate gmmktime ini_alter ini_get ini_get_all ini_restore ini_set '+
+						'interface_exists intval ip2long is_a is_array is_bool is_callable is_dir is_double '+
+						'is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long '+
+						'is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault '+
+						'is_string is_subclass_of is_uploaded_file is_writable is_writeable mkdir mktime nl2br '+
+						'parse_ini_file parse_str parse_url passthru pathinfo print readlink realpath rewind rewinddir rmdir '+
+						'round str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split '+
+						'str_word_count strcasecmp strchr strcmp strcoll strcspn strftime strip_tags stripcslashes '+
+						'stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk '+
+						'strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime '+
+						'strtoupper strtr strval substr substr_compare';
+
+		var keywords =	'abstract and array as break case catch cfunction class clone const continue declare default die do ' +
+						'else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach ' +
+						'function global goto if implements include include_once interface instanceof insteadof namespace new ' +
+						'old_function or private protected public return require require_once static switch ' +
+						'trait throw try use var while xor ';
+		
+		var constants	= '__FILE__ __LINE__ __METHOD__ __FUNCTION__ __CLASS__';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,	css: 'comments' },			// one line comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,		css: 'comments' },			// multiline comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },			// double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },			// single quoted strings
+			{ regex: /\$\w+/g,											css: 'variable' },			// variables
+			{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),		css: 'functions' },			// common functions
+			{ regex: new RegExp(this.getKeywords(constants), 'gmi'),	css: 'constants' },			// constants
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' }			// keyword
+			];
+
+		this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['php'];
+
+	SyntaxHighlighter.brushes.Php = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['text', 'plain'];
+
+	SyntaxHighlighter.brushes.Plain = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Joel 'Jaykul' Bennett, http://PoshCode.org | http://HuddledMasses.org
+		var keywords =	'while validateset validaterange validatepattern validatelength validatecount ' +
+						'until trap switch return ref process param parameter in if global: '+
+						'function foreach for finally filter end elseif else dynamicparam do default ' +
+						'continue cmdletbinding break begin alias \\? % #script #private #local #global '+
+						'mandatory parametersetname position valuefrompipeline ' +
+						'valuefrompipelinebypropertyname valuefromremainingarguments helpmessage ';
+
+		var operators =	' and as band bnot bor bxor casesensitive ccontains ceq cge cgt cle ' +
+						'clike clt cmatch cne cnotcontains cnotlike cnotmatch contains ' +
+						'creplace eq exact f file ge gt icontains ieq ige igt ile ilike ilt ' +
+						'imatch ine inotcontains inotlike inotmatch ireplace is isnot le like ' +
+						'lt match ne not notcontains notlike notmatch or regex replace wildcard';
+						
+		var verbs =		'write where wait use update unregister undo trace test tee take suspend ' +
+						'stop start split sort skip show set send select scroll resume restore ' +
+						'restart resolve resize reset rename remove register receive read push ' +
+						'pop ping out new move measure limit join invoke import group get format ' +
+						'foreach export expand exit enter enable disconnect disable debug cxnew ' +
+						'copy convertto convertfrom convert connect complete compare clear ' +
+						'checkpoint aggregate add';
+
+		// I can't find a way to match the comment based help in multi-line comments, because SH won't highlight in highlights, and javascript doesn't support lookbehind
+		var commenthelp = ' component description example externalhelp forwardhelpcategory forwardhelptargetname forwardhelptargetname functionality inputs link notes outputs parameter remotehelprunspace role synopsis';
+
+		this.regexList = [
+			{ regex: new RegExp('^\\s*#[#\\s]*\\.('+this.getKeywords(commenthelp)+').*$', 'gim'),			css: 'preprocessor help bold' },		// comment-based help
+			{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments,										css: 'comments' },						// one line comments
+			{ regex: /(&lt;|<)#[\s\S]*?#(&gt;|>)/gm,														css: 'comments here' },					// multi-line comments
+			
+			{ regex: new RegExp('@"\\n[\\s\\S]*?\\n"@', 'gm'),												css: 'script string here' },			// double quoted here-strings
+			{ regex: new RegExp("@'\\n[\\s\\S]*?\\n'@", 'gm'),												css: 'script string single here' },		// single quoted here-strings
+			{ regex: new RegExp('"(?:\\$\\([^\\)]*\\)|[^"]|`"|"")*[^`]"','g'),								css: 'string' },						// double quoted strings
+			{ regex: new RegExp("'(?:[^']|'')*'", 'g'),														css: 'string single' },					// single quoted strings
+			
+			{ regex: new RegExp('[\\$|@|@@](?:(?:global|script|private|env):)?[A-Z0-9_]+', 'gi'),			css: 'variable' },						// $variables
+			{ regex: new RegExp('(?:\\b'+verbs.replace(/ /g, '\\b|\\b')+')-[a-zA-Z_][a-zA-Z0-9_]*', 'gmi'),	css: 'functions' },						// functions and cmdlets
+			{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),											css: 'keyword' },						// keywords
+			{ regex: new RegExp('-'+this.getKeywords(operators), 'gmi'),									css: 'operator value' },				// operators
+			{ regex: new RegExp('\\[[A-Z_\\[][A-Z0-9_. `,\\[\\]]*\\]', 'gi'),								css: 'constants' },						// .Net [Type]s
+			{ regex: new RegExp('\\s+-(?!'+this.getKeywords(operators)+')[a-zA-Z_][a-zA-Z0-9_]*', 'gmi'),	css: 'color1' },						// parameters	  
+		];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['powershell', 'ps', 'posh'];
+
+	SyntaxHighlighter.brushes.PowerShell = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Gheorghe Milas and Ahmad Sherif
+	
+		var keywords =  'and assert break class continue def del elif else ' +
+						'except exec finally for from global if import in is ' +
+						'lambda not or pass print raise return try yield while';
+
+		var funcs = '__import__ abs all any apply basestring bin bool buffer callable ' +
+					'chr classmethod cmp coerce compile complex delattr dict dir ' +
+					'divmod enumerate eval execfile file filter float format frozenset ' +
+					'getattr globals hasattr hash help hex id input int intern ' +
+					'isinstance issubclass iter len list locals long map max min next ' +
+					'object oct open ord pow print property range raw_input reduce ' +
+					'reload repr reversed round set setattr slice sorted staticmethod ' +
+					'str sum super tuple type type unichr unicode vars xrange zip';
+
+		var special =  'None True False self cls class_';
+
+		this.regexList = [
+				{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' },
+				{ regex: /^\s*@\w+/gm, 										css: 'decorator' },
+				{ regex: /(['\"]{3})([^\1])*?\1/gm, 						css: 'comments' },
+				{ regex: /"(?!")(?:\.|\\\"|[^\""\n])*"/gm, 					css: 'string' },
+				{ regex: /'(?!')(?:\.|(\\\')|[^\''\n])*'/gm, 				css: 'string' },
+				{ regex: /\+|\-|\*|\/|\%|=|==/gm, 							css: 'keyword' },
+				{ regex: /\b\d+\.?\w*/g, 									css: 'value' },
+				{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),		css: 'functions' },
+				{ regex: new RegExp(this.getKeywords(keywords), 'gm'), 		css: 'keyword' },
+				{ regex: new RegExp(this.getKeywords(special), 'gm'), 		css: 'color1' }
+				];
+			
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['py', 'python'];
+
+	SyntaxHighlighter.brushes.Python = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Erik Peterson.
+	
+		var keywords =	'alias and BEGIN begin break case class def define_method defined do each else elsif ' +
+						'END end ensure false for if in module new next nil not or raise redo rescue retry return ' +
+						'self super then throw true undef unless until when while yield';
+
+		var builtins =	'Array Bignum Binding Class Continuation Dir Exception FalseClass File::Stat File Fixnum Fload ' +
+						'Hash Integer IO MatchData Method Module NilClass Numeric Object Proc Range Regexp String Struct::TMS Symbol ' +
+						'ThreadGroup Thread Time TrueClass';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLinePerlComments,	css: 'comments' },		// one line comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,		css: 'string' },		// double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,		css: 'string' },		// single quoted strings
+			{ regex: /\b[A-Z0-9_]+\b/g,									css: 'constants' },		// constants
+			{ regex: /:[a-z][A-Za-z0-9_]*/g,							css: 'color2' },		// symbols
+			{ regex: /(\$|@@|@)\w+/g,									css: 'variable bold' },	// $global, @instance, and @@class variables
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),		css: 'keyword' },		// keywords
+			{ regex: new RegExp(this.getKeywords(builtins), 'gm'),		css: 'color1' }			// builtins
+			];
+
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['ruby', 'rails', 'ror', 'rb'];
+
+	SyntaxHighlighter.brushes.Ruby = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		function getKeywordsCSS(str)
+		{
+			return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b';
+		};
+	
+		function getValuesCSS(str)
+		{
+			return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b';
+		};
+
+		var keywords =	'ascent azimuth background-attachment background-color background-image background-position ' +
+						'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
+						'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
+						'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
+						'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
+						'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
+						'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
+						'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
+						'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
+						'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
+						'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
+						'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
+						'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
+						'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
+		
+		var values =	'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
+						'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
+						'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero digits disc dotted double '+
+						'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
+						'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
+						'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
+						'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
+						'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
+						'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
+						'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
+						'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
+						'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
+						'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
+						'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
+		
+		var fonts =		'[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';
+		
+		var statements		= '!important !default';
+		var preprocessor	= '@import @extend @debug @warn @if @for @while @mixin @include';
+		
+		var r = SyntaxHighlighter.regexLib;
+		
+		this.regexList = [
+			{ regex: r.multiLineCComments,								css: 'comments' },		// multiline comments
+			{ regex: r.singleLineCComments,								css: 'comments' },		// singleline comments
+			{ regex: r.doubleQuotedString,								css: 'string' },		// double quoted strings
+			{ regex: r.singleQuotedString,								css: 'string' },		// single quoted strings
+			{ regex: /\#[a-fA-F0-9]{3,6}/g,								css: 'value' },			// html colors
+			{ regex: /\b(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)\b/g,			css: 'value' },			// sizes
+			{ regex: /\$\w+/g,											css: 'variable' },		// variables
+			{ regex: new RegExp(this.getKeywords(statements), 'g'),		css: 'color3' },		// statements
+			{ regex: new RegExp(this.getKeywords(preprocessor), 'g'),	css: 'preprocessor' },	// preprocessor
+			{ regex: new RegExp(getKeywordsCSS(keywords), 'gm'),		css: 'keyword' },		// keywords
+			{ regex: new RegExp(getValuesCSS(values), 'g'),				css: 'value' },			// values
+			{ regex: new RegExp(this.getKeywords(fonts), 'g'),			css: 'color1' }			// fonts
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['sass', 'scss'];
+
+	SyntaxHighlighter.brushes.Sass = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		// Contributed by Yegor Jbanov and David Bernard.
+	
+		var keywords =	'val sealed case def true trait implicit forSome import match object null finally super ' +
+						'override try lazy for var catch throw type extends class while with new final yield abstract ' +
+						'else do if return protected private this package false';
+
+		var keyops =	'[_:=><%#@]+';
+
+		this.regexList = [
+			{ regex: SyntaxHighlighter.regexLib.singleLineCComments,			css: 'comments' },	// one line comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineCComments,				css: 'comments' },	// multiline comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString,	css: 'string' },	// multi-line strings
+			{ regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString,    css: 'string' },	// double-quoted string
+			{ regex: SyntaxHighlighter.regexLib.singleQuotedString,				css: 'string' },	// strings
+			{ regex: /0x[a-f0-9]+|\d+(\.\d+)?/gi,								css: 'value' },		// numbers
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),				css: 'keyword' },	// keywords
+			{ regex: new RegExp(keyops, 'gm'),									css: 'keyword' }	// scala keyword
+			];
+	}
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['scala'];
+
+	SyntaxHighlighter.brushes.Scala = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var funcs	=	'abs avg case cast coalesce convert count current_timestamp ' +
+						'current_user day isnull left lower month nullif replace right ' +
+						'session_user space substring sum system_user upper user year';
+
+		var keywords =	'absolute action add after alter as asc at authorization begin bigint ' +
+						'binary bit by cascade char character check checkpoint close collate ' +
+						'column commit committed connect connection constraint contains continue ' +
+						'create cube current current_date current_time cursor database date ' +
+						'deallocate dec decimal declare default delete desc distinct double drop ' +
+						'dynamic else end end-exec escape except exec execute false fetch first ' +
+						'float for force foreign forward free from full function global goto grant ' +
+						'group grouping having hour ignore index inner insensitive insert instead ' +
+						'int integer intersect into is isolation key last level load local max min ' +
+						'minute modify move name national nchar next no numeric of off on only ' +
+						'open option order out output partial password precision prepare primary ' +
+						'prior privileges procedure public read real references relative repeatable ' +
+						'restrict return returns revoke rollback rollup rows rule schema scroll ' +
+						'second section select sequence serializable set size smallint static ' +
+						'statistics table temp temporary then time timestamp to top transaction ' +
+						'translation trigger true truncate uncommitted union unique update values ' +
+						'varchar varying view when where with work';
+
+		var operators =	'all and any between cross in join like not null or outer some';
+
+		this.regexList = [
+			{ regex: /--(.*)$/gm,												css: 'comments' },			// one line and multiline comments
+			{ regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString,	css: 'string' },			// double quoted strings
+			{ regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString,	css: 'string' },			// single quoted strings
+			{ regex: new RegExp(this.getKeywords(funcs), 'gmi'),				css: 'color2' },			// functions
+			{ regex: new RegExp(this.getKeywords(operators), 'gmi'),			css: 'color1' },			// operators and such
+			{ regex: new RegExp(this.getKeywords(keywords), 'gmi'),				css: 'keyword' }			// keyword
+			];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['sql'];
+
+	SyntaxHighlighter.brushes.Sql = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		var keywords =	'AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto ' +
+						'Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate ' +
+						'CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType ' +
+						'Date Decimal Declare Default Delegate Dim DirectCast Do Double Each ' +
+						'Else ElseIf End Enum Erase Error Event Exit False Finally For Friend ' +
+						'Function Get GetType GoSub GoTo Handles If Implements Imports In ' +
+						'Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module ' +
+						'MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing ' +
+						'NotInheritable NotOverridable Object On Option Optional Or OrElse ' +
+						'Overloads Overridable Overrides ParamArray Preserve Private Property ' +
+						'Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume ' +
+						'Return Select Set Shadows Shared Short Single Static Step Stop String ' +
+						'Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until ' +
+						'Variant When While With WithEvents WriteOnly Xor';
+
+		this.regexList = [
+			{ regex: /'.*$/gm,										css: 'comments' },			// one line comments
+			{ regex: SyntaxHighlighter.regexLib.doubleQuotedString,	css: 'string' },			// strings
+			{ regex: /^\s*#.*$/gm,									css: 'preprocessor' },		// preprocessor tags like #region and #endregion
+			{ regex: new RegExp(this.getKeywords(keywords), 'gm'),	css: 'keyword' }			// vb keyword
+			];
+
+		this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['vb', 'vbnet'];
+
+	SyntaxHighlighter.brushes.Vb = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+;(function()
+{
+	// CommonJS
+	SyntaxHighlighter = SyntaxHighlighter || (typeof require !== 'undefined'? require('shCore').SyntaxHighlighter : null);
+
+	function Brush()
+	{
+		function process(match, regexInfo)
+		{
+			var constructor = SyntaxHighlighter.Match,
+				code = match[0],
+				tag = new XRegExp('(&lt;|<)[\\s\\/\\?]*(?<name>[:\\w-\\.]+)', 'xg').exec(code),
+				result = []
+				;
+		
+			if (match.attributes != null) 
+			{
+				var attributes,
+					regex = new XRegExp('(?<name> [\\w:\\-\\.]+)' +
+										'\\s*=\\s*' +
+										'(?<value> ".*?"|\'.*?\'|\\w+)',
+										'xg');
+
+				while ((attributes = regex.exec(code)) != null) 
+				{
+					result.push(new constructor(attributes.name, match.index + attributes.index, 'color1'));
+					result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string'));
+				}
+			}
+
+			if (tag != null)
+				result.push(
+					new constructor(tag.name, match.index + tag[0].indexOf(tag.name), 'keyword')
+				);
+
+			return result;
+		}
+	
+		this.regexList = [
+			{ regex: new XRegExp('(\\&lt;|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\&gt;|>)', 'gm'),			css: 'color2' },	// <![ ... [ ... ]]>
+			{ regex: SyntaxHighlighter.regexLib.xmlComments,												css: 'comments' },	// <!-- ... -->
+			{ regex: new XRegExp('(&lt;|<)[\\s\\/\\?]*(\\w+)(?<attributes>.*?)[\\s\\/\\?]*(&gt;|>)', 'sg'), func: process }
+		];
+	};
+
+	Brush.prototype	= new SyntaxHighlighter.Highlighter();
+	Brush.aliases	= ['xml', 'xhtml', 'xslt', 'html'];
+
+	SyntaxHighlighter.brushes.Xml = Brush;
+
+	// CommonJS
+	typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/SyntaxHighlighter/shCoreDefault.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/SyntaxHighlighter/shCoreDefault.css
new file mode 100644
index 0000000..e156a6f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/SyntaxHighlighter/shCoreDefault.css
@@ -0,0 +1 @@
+.syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter,.syntaxhighlighter td,.syntaxhighlighter tr,.syntaxhighlighter tbody,.syntaxhighlighter thead,.syntaxhighlighter caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0!important;-webkit-border-radius:0 0 0 0!important;background:none!important;border:0!important;bottom:auto!important;float:none!important;left:auto!important;line-height:1.1em!important;margin:0!important;outline:0!important;overflow:visible!important;padding:0!important;position:static!important;right:auto!important;text-align:left!important;top:auto!important;vertical-align:baseline!important;width:auto!important;box-sizing:content-box!important;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-weight:normal!important;font-style:normal!important;min-height:inherit!important;min-height:auto!important;font-size:13px!important}.syntaxhighlighter{width:100%!important;margin:.3em 0 .3em 0!important;position:relative!important;overflow:auto!important;background-color:#f5f5f5!important;border:1px solid #ccc!important;border-radius:4px!important;border-collapse:separate!important}.syntaxhighlighter.source{overflow:hidden!important}.syntaxhighlighter .bold{font-weight:bold!important}.syntaxhighlighter .italic{font-style:italic!important}.syntaxhighlighter .gutter div{white-space:pre!important;word-wrap:normal}.syntaxhighlighter caption{text-align:left!important;padding:.5em 0 .5em 1em!important}.syntaxhighlighter td.code{width:100%!important}.syntaxhighlighter td.code .container{position:relative!important}.syntaxhighlighter td.code .container textarea{box-sizing:border-box!important;position:absolute!important;left:0!important;top:0!important;width:100%!important;border:none!important;background:white!important;padding-left:1em!important;overflow:hidden!important;white-space:pre!important}.syntaxhighlighter td.gutter .line{text-align:right!important;padding:0 .5em 0 1em!important}.syntaxhighlighter td.code .line{padding:0 1em!important}.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0!important}.syntaxhighlighter.show{display:block!important}.syntaxhighlighter.collapsed table{display:none!important}.syntaxhighlighter.collapsed .toolbar{padding:.1em .8em 0 .8em!important;font-size:1em!important;position:static!important;width:auto!important}.syntaxhighlighter.collapsed .toolbar span{display:inline!important;margin-right:1em!important}.syntaxhighlighter.collapsed .toolbar span a{padding:0!important;display:none!important}.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline!important}.syntaxhighlighter .toolbar{position:absolute!important;right:1px!important;top:1px!important;width:11px!important;height:11px!important;font-size:10px!important;z-index:10!important}.syntaxhighlighter .toolbar span.title{display:inline!important}.syntaxhighlighter .toolbar a{display:block!important;text-align:center!important;text-decoration:none!important;padding-top:1px!important}.syntaxhighlighter .toolbar a.expandSource{display:none!important}.syntaxhighlighter.ie{font-size:.9em!important;padding:1px 0 1px 0!important}.syntaxhighlighter.ie .toolbar{line-height:8px!important}.syntaxhighlighter.ie .toolbar a{padding-top:0!important}.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none!important}.syntaxhighlighter.printing .line .number{color:#bbb!important}.syntaxhighlighter.printing .line .content{color:black!important}.syntaxhighlighter.printing .toolbar{display:none!important}.syntaxhighlighter.printing a{text-decoration:none!important}.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black!important}.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200!important}.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue!important}.syntaxhighlighter.printing .keyword{color:#ff7800!important;font-weight:bold!important}.syntaxhighlighter.printing .preprocessor{color:gray!important}.syntaxhighlighter.printing .variable{color:#a70!important}.syntaxhighlighter.printing .value{color:#090!important}.syntaxhighlighter.printing .functions{color:#ff1493!important}.syntaxhighlighter.printing .constants{color:#06c!important}.syntaxhighlighter.printing .script{font-weight:bold!important}.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray!important}.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493!important}.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red!important}.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black!important}.syntaxhighlighter{background-color:#f5f5f5!important}.syntaxhighlighter .line.highlighted.number{color:black!important}.syntaxhighlighter caption{color:black!important}.syntaxhighlighter .gutter{color:#afafaf!important;background-color:#f7f7f9!important;border-right:1px solid #e1e1e8!important;padding:9.5px 0 9.5px 9.5px!important;border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;user-select:none!important;-moz-user-select:none!important;-webkit-user-select:none!important}.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c!important;color:white!important}.syntaxhighlighter.printing .line .content{border:none!important}.syntaxhighlighter.collapsed{overflow:visible!important}.syntaxhighlighter.collapsed .toolbar{color:blue!important;background:white!important;border:1px solid #6ce26c!important}.syntaxhighlighter.collapsed .toolbar a{color:blue!important}.syntaxhighlighter.collapsed .toolbar a:hover{color:red!important}.syntaxhighlighter .toolbar{color:white!important;background:#6ce26c!important;border:none!important}.syntaxhighlighter .toolbar a{color:white!important}.syntaxhighlighter .toolbar a:hover{color:black!important}.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black!important}.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200!important}.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue!important}.syntaxhighlighter .keyword{color:#ff7800!important}.syntaxhighlighter .preprocessor{color:gray!important}.syntaxhighlighter .variable{color:#a70!important}.syntaxhighlighter .value{color:#090!important}.syntaxhighlighter .functions{color:#ff1493!important}.syntaxhighlighter .constants{color:#06c!important}.syntaxhighlighter .script{font-weight:bold!important;color:#ff7800!important;background-color:none!important}.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray!important}.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493!important}.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red!important}.syntaxhighlighter .keyword{font-weight:bold!important}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/codemirror/codemirror.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/codemirror/codemirror.css
new file mode 100644
index 0000000..461ae19
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/codemirror/codemirror.css
@@ -0,0 +1,104 @@
+.CodeMirror {
+    line-height: 1em;
+    font-family: monospace;
+}
+
+.CodeMirror-scroll {
+    overflow: auto;
+    height: 300px;
+    /* This is needed to prevent an IE[67] bug where the scrolled content
+       is visible outside of the scrolling box. */
+    position: relative;
+}
+
+.CodeMirror-gutter {
+    position: absolute; left: 0; top: 0;
+    z-index: 10;
+    background-color: #f7f7f7;
+    border-right: 1px solid #eee;
+    min-width: 2em;
+    height: 100%;
+}
+.CodeMirror-gutter-text {
+    color: #aaa;
+    text-align: right;
+    padding: .4em .2em .4em .4em;
+    white-space: pre !important;
+}
+.CodeMirror-lines {
+    padding: .4em;
+}
+
+.CodeMirror pre {
+    -moz-border-radius: 0;
+    -webkit-border-radius: 0;
+    -o-border-radius: 0;
+    border-radius: 0;
+    border-width: 0; margin: 0; padding: 0; background: transparent;
+    font-family: inherit;
+    font-size: inherit;
+    padding: 0; margin: 0;
+    white-space: pre;
+    word-wrap: normal;
+}
+
+.CodeMirror-wrap pre {
+    word-wrap: break-word;
+    white-space: pre-wrap;
+}
+.CodeMirror-wrap .CodeMirror-scroll {
+    overflow-x: hidden;
+}
+
+.CodeMirror textarea {
+    outline: none !important;
+}
+
+.CodeMirror pre.CodeMirror-cursor {
+    z-index: 10;
+    position: absolute;
+    visibility: hidden;
+    border-left: 1px solid black;
+}
+.CodeMirror-focused pre.CodeMirror-cursor {
+    visibility: visible;
+}
+
+span.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused span.CodeMirror-selected { background: #d2dcf8; }
+
+.CodeMirror-searching {background: #ffa;}
+
+/* Default theme */
+
+.cm-s-default span.cm-keyword {color: #708;}
+.cm-s-default span.cm-atom {color: #219;}
+.cm-s-default span.cm-number {color: #164;}
+.cm-s-default span.cm-def {color: #00f;}
+.cm-s-default span.cm-variable {color: black;}
+.cm-s-default span.cm-variable-2 {color: #05a;}
+.cm-s-default span.cm-variable-3 {color: #085;}
+.cm-s-default span.cm-property {color: black;}
+.cm-s-default span.cm-operator {color: black;}
+.cm-s-default span.cm-comment {color: #a50;}
+.cm-s-default span.cm-string {color: #a11;}
+.cm-s-default span.cm-string-2 {color: #f50;}
+.cm-s-default span.cm-meta {color: #555;}
+.cm-s-default span.cm-error {color: #f00;}
+.cm-s-default span.cm-qualifier {color: #555;}
+.cm-s-default span.cm-builtin {color: #30a;}
+.cm-s-default span.cm-bracket {color: #cc7;}
+.cm-s-default span.cm-tag {color: #170;}
+.cm-s-default span.cm-attribute {color: #00c;}
+.cm-s-default span.cm-header {color: #a0a;}
+.cm-s-default span.cm-quote {color: #090;}
+.cm-s-default span.cm-hr {color: #999;}
+.cm-s-default span.cm-link {color: #00c;}
+
+span.cm-header, span.cm-strong {font-weight: bold;}
+span.cm-em {font-style: italic;}
+span.cm-emstrong {font-style: italic; font-weight: bold;}
+span.cm-link {text-decoration: underline;}
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/codemirror/codemirror.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/codemirror/codemirror.js
new file mode 100644
index 0000000..966c320
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/codemirror/codemirror.js
@@ -0,0 +1,3581 @@
+// CodeMirror version 2.2
+//
+// All functions that need access to the editor's state live inside
+// the CodeMirror function. Below that, at the bottom of the file,
+// some utilities are defined.
+
+// CodeMirror is the only global var we claim
+var CodeMirror = (function() {
+    // This is the function that produces an editor instance. It's
+    // closure is used to store the editor state.
+    function CodeMirror(place, givenOptions) {
+        // Determine effective options based on given values and defaults.
+        var options = {}, defaults = CodeMirror.defaults;
+        for (var opt in defaults)
+            if (defaults.hasOwnProperty(opt))
+                options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt];
+
+        var targetDocument = options["document"];
+        // The element in which the editor lives.
+        var wrapper = targetDocument.createElement("div");
+        wrapper.className = "CodeMirror" + (options.lineWrapping ? " CodeMirror-wrap" : "");
+        // This mess creates the base DOM structure for the editor.
+        wrapper.innerHTML =
+            '<div style="overflow: hidden; position: relative; width: 3px; height: 0px;">' + // Wraps and hides input textarea
+                '<textarea style="position: absolute; padding: 0; width: 1px;" wrap="off" ' +
+                'autocorrect="off" autocapitalize="off"></textarea></div>' +
+                '<div class="CodeMirror-scroll" tabindex="-1">' +
+                '<div style="position: relative">' + // Set to the height of the text, causes scrolling
+                '<div style="position: relative">' + // Moved around its parent to cover visible view
+                '<div class="CodeMirror-gutter"><div class="CodeMirror-gutter-text"></div></div>' +
+                // Provides positioning relative to (visible) text origin
+                '<div class="CodeMirror-lines"><div style="position: relative">' +
+                '<div style="position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden"></div>' +
+                '<pre class="CodeMirror-cursor">&#160;</pre>' + // Absolutely positioned blinky cursor
+                '<div></div>' + // This DIV contains the actual code
+                '</div></div></div></div></div>';
+        if (place.appendChild) place.appendChild(wrapper); else place(wrapper);
+        // I've never seen more elegant code in my life.
+        var inputDiv = wrapper.firstChild, input = inputDiv.firstChild,
+            scroller = wrapper.lastChild, code = scroller.firstChild,
+            mover = code.firstChild, gutter = mover.firstChild, gutterText = gutter.firstChild,
+            lineSpace = gutter.nextSibling.firstChild, measure = lineSpace.firstChild,
+            cursor = measure.nextSibling, lineDiv = cursor.nextSibling;
+        themeChanged();
+        // Needed to hide big blue blinking cursor on Mobile Safari
+        if (/AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent)) input.style.width = "0px";
+        if (!webkit) lineSpace.draggable = true;
+        if (options.tabindex != null) input.tabIndex = options.tabindex;
+        if (!options.gutter && !options.lineNumbers) gutter.style.display = "none";
+
+        // Check for problem with IE innerHTML not working when we have a
+        // P (or similar) parent node.
+        try { stringWidth("x"); }
+        catch (e) {
+            if (e.message.match(/runtime/i))
+                e = new Error("A CodeMirror inside a P-style element does not work in Internet Explorer. (innerHTML bug)");
+            throw e;
+        }
+
+        // Delayed object wrap timeouts, making sure only one is active. blinker holds an interval.
+        var poll = new Delayed(), highlight = new Delayed(), blinker;
+
+        // mode holds a mode API object. doc is the tree of Line objects,
+        // work an array of lines that should be parsed, and history the
+        // undo history (instance of History constructor).
+        var mode, doc = new BranchChunk([new LeafChunk([new Line("")])]), work, focused;
+        loadMode();
+        // The selection. These are always maintained to point at valid
+        // positions. Inverted is used to remember that the user is
+        // selecting bottom-to-top.
+        var sel = {from: {line: 0, ch: 0}, to: {line: 0, ch: 0}, inverted: false};
+        // Selection-related flags. shiftSelecting obviously tracks
+        // whether the user is holding shift.
+        var shiftSelecting, lastClick, lastDoubleClick, draggingText, overwrite = false;
+        // Variables used by startOperation/endOperation to track what
+        // happened during the operation.
+        var updateInput, userSelChange, changes, textChanged, selectionChanged, leaveInputAlone,
+            gutterDirty, callbacks;
+        // Current visible range (may be bigger than the view window).
+        var displayOffset = 0, showingFrom = 0, showingTo = 0, lastSizeC = 0;
+        // bracketHighlighted is used to remember that a backet has been
+        // marked.
+        var bracketHighlighted;
+        // Tracks the maximum line length so that the horizontal scrollbar
+        // can be kept static when scrolling.
+        var maxLine = "", maxWidth, tabText = computeTabText();
+
+        // Initialize the content.
+        operation(function(){setValue(options.value || ""); updateInput = false;})();
+        var history = new History();
+
+        // Register our event handlers.
+        connect(scroller, "mousedown", operation(onMouseDown));
+        connect(scroller, "dblclick", operation(onDoubleClick));
+        connect(lineSpace, "dragstart", onDragStart);
+        connect(lineSpace, "selectstart", e_preventDefault);
+        // Gecko browsers fire contextmenu *after* opening the menu, at
+        // which point we can't mess with it anymore. Context menu is
+        // handled in onMouseDown for Gecko.
+        if (!gecko) connect(scroller, "contextmenu", onContextMenu);
+        connect(scroller, "scroll", function() {
+            updateDisplay([]);
+            if (options.fixedGutter) gutter.style.left = scroller.scrollLeft + "px";
+            if (options.onScroll) options.onScroll(instance);
+        });
+        connect(window, "resize", function() {updateDisplay(true);});
+        connect(input, "keyup", operation(onKeyUp));
+        connect(input, "input", fastPoll);
+        connect(input, "keydown", operation(onKeyDown));
+        connect(input, "keypress", operation(onKeyPress));
+        connect(input, "focus", onFocus);
+        connect(input, "blur", onBlur);
+
+        connect(scroller, "dragenter", e_stop);
+        connect(scroller, "dragover", e_stop);
+        connect(scroller, "drop", operation(onDrop));
+        connect(scroller, "paste", function(){focusInput(); fastPoll();});
+        connect(input, "paste", fastPoll);
+        connect(input, "cut", operation(function(){replaceSelection("");}));
+
+        // IE throws unspecified error in certain cases, when
+        // trying to access activeElement before onload
+        var hasFocus; try { hasFocus = (targetDocument.activeElement == input); } catch(e) { }
+        if (hasFocus) setTimeout(onFocus, 20);
+        else onBlur();
+
+        function isLine(l) {return l >= 0 && l < doc.size;}
+        // The instance object that we'll return. Mostly calls out to
+        // local functions in the CodeMirror function. Some do some extra
+        // range checking and/or clipping. operation is used to wrap the
+        // call so that changes it makes are tracked, and the display is
+        // updated afterwards.
+        var instance = wrapper.CodeMirror = {
+            getValue: getValue,
+            setValue: operation(setValue),
+            getSelection: getSelection,
+            replaceSelection: operation(replaceSelection),
+            focus: function(){focusInput(); onFocus(); fastPoll();},
+            setOption: function(option, value) {
+                var oldVal = options[option];
+                options[option] = value;
+                if (option == "mode" || option == "indentUnit") loadMode();
+                else if (option == "readOnly" && value) {onBlur(); input.blur();}
+                else if (option == "theme") themeChanged();
+                else if (option == "lineWrapping" && oldVal != value) operation(wrappingChanged)();
+                else if (option == "tabSize") operation(tabsChanged)();
+                if (option == "lineNumbers" || option == "gutter" || option == "firstLineNumber" || option == "theme")
+                    operation(gutterChanged)();
+            },
+            getOption: function(option) {return options[option];},
+            undo: operation(undo),
+            redo: operation(redo),
+            indentLine: operation(function(n, dir) {
+                if (isLine(n)) indentLine(n, dir == null ? "smart" : dir ? "add" : "subtract");
+            }),
+            indentSelection: operation(indentSelected),
+            historySize: function() {return {undo: history.done.length, redo: history.undone.length};},
+            clearHistory: function() {history = new History();},
+            matchBrackets: operation(function(){matchBrackets(true);}),
+            getTokenAt: operation(function(pos) {
+                pos = clipPos(pos);
+                return getLine(pos.line).getTokenAt(mode, getStateBefore(pos.line), pos.ch);
+            }),
+            getStateAfter: function(line) {
+                line = clipLine(line == null ? doc.size - 1: line);
+                return getStateBefore(line + 1);
+            },
+            cursorCoords: function(start){
+                if (start == null) start = sel.inverted;
+                return pageCoords(start ? sel.from : sel.to);
+            },
+            charCoords: function(pos){return pageCoords(clipPos(pos));},
+            coordsChar: function(coords) {
+                var off = eltOffset(lineSpace);
+                return coordsChar(coords.x - off.left, coords.y - off.top);
+            },
+            markText: operation(markText),
+            setBookmark: setBookmark,
+            setMarker: operation(addGutterMarker),
+            clearMarker: operation(removeGutterMarker),
+            setLineClass: operation(setLineClass),
+            hideLine: operation(function(h) {return setLineHidden(h, true);}),
+            showLine: operation(function(h) {return setLineHidden(h, false);}),
+            onDeleteLine: function(line, f) {
+                if (typeof line == "number") {
+                    if (!isLine(line)) return null;
+                    line = getLine(line);
+                }
+                (line.handlers || (line.handlers = [])).push(f);
+                return line;
+            },
+            lineInfo: lineInfo,
+            addWidget: function(pos, node, scroll, vert, horiz) {
+                pos = localCoords(clipPos(pos));
+                var top = pos.yBot, left = pos.x;
+                node.style.position = "absolute";
+                code.appendChild(node);
+                if (vert == "over") top = pos.y;
+                else if (vert == "near") {
+                    var vspace = Math.max(scroller.offsetHeight, doc.height * textHeight()),
+                        hspace = Math.max(code.clientWidth, lineSpace.clientWidth) - paddingLeft();
+                    if (pos.yBot + node.offsetHeight > vspace && pos.y > node.offsetHeight)
+                        top = pos.y - node.offsetHeight;
+                    if (left + node.offsetWidth > hspace)
+                        left = hspace - node.offsetWidth;
+                }
+                node.style.top = (top + paddingTop()) + "px";
+                node.style.left = node.style.right = "";
+                if (horiz == "right") {
+                    left = code.clientWidth - node.offsetWidth;
+                    node.style.right = "0px";
+                } else {
+                    if (horiz == "left") left = 0;
+                    else if (horiz == "middle") left = (code.clientWidth - node.offsetWidth) / 2;
+                    node.style.left = (left + paddingLeft()) + "px";
+                }
+                if (scroll)
+                    scrollIntoView(left, top, left + node.offsetWidth, top + node.offsetHeight);
+            },
+
+            lineCount: function() {return doc.size;},
+            clipPos: clipPos,
+            getCursor: function(start) {
+                if (start == null) start = sel.inverted;
+                return copyPos(start ? sel.from : sel.to);
+            },
+            somethingSelected: function() {return !posEq(sel.from, sel.to);},
+            setCursor: operation(function(line, ch, user) {
+                if (ch == null && typeof line.line == "number") setCursor(line.line, line.ch, user);
+                else setCursor(line, ch, user);
+            }),
+            setSelection: operation(function(from, to, user) {
+                (user ? setSelectionUser : setSelection)(clipPos(from), clipPos(to || from));
+            }),
+            getLine: function(line) {if (isLine(line)) return getLine(line).text;},
+            getLineHandle: function(line) {if (isLine(line)) return getLine(line);},
+            setLine: operation(function(line, text) {
+                if (isLine(line)) replaceRange(text, {line: line, ch: 0}, {line: line, ch: getLine(line).text.length});
+            }),
+            removeLine: operation(function(line) {
+                if (isLine(line)) replaceRange("", {line: line, ch: 0}, clipPos({line: line+1, ch: 0}));
+            }),
+            replaceRange: operation(replaceRange),
+            getRange: function(from, to) {return getRange(clipPos(from), clipPos(to));},
+
+            execCommand: function(cmd) {return commands[cmd](instance);},
+            // Stuff used by commands, probably not much use to outside code.
+            moveH: operation(moveH),
+            deleteH: operation(deleteH),
+            moveV: operation(moveV),
+            toggleOverwrite: function() {overwrite = !overwrite;},
+
+            posFromIndex: function(off) {
+                var lineNo = 0, ch;
+                doc.iter(0, doc.size, function(line) {
+                    var sz = line.text.length + 1;
+                    if (sz > off) { ch = off; return true; }
+                    off -= sz;
+                    ++lineNo;
+                });
+                return clipPos({line: lineNo, ch: ch});
+            },
+            indexFromPos: function (coords) {
+                if (coords.line < 0 || coords.ch < 0) return 0;
+                var index = coords.ch;
+                doc.iter(0, coords.line, function (line) {
+                    index += line.text.length + 1;
+                });
+                return index;
+            },
+
+            operation: function(f){return operation(f)();},
+            refresh: function(){updateDisplay(true);},
+            getInputField: function(){return input;},
+            getWrapperElement: function(){return wrapper;},
+            getScrollerElement: function(){return scroller;},
+            getGutterElement: function(){return gutter;}
+        };
+
+        function getLine(n) { return getLineAt(doc, n); }
+        function updateLineHeight(line, height) {
+            gutterDirty = true;
+            var diff = height - line.height;
+            for (var n = line; n; n = n.parent) n.height += diff;
+        }
+
+        function setValue(code) {
+            var top = {line: 0, ch: 0};
+            updateLines(top, {line: doc.size - 1, ch: getLine(doc.size-1).text.length},
+                splitLines(code), top, top);
+            updateInput = true;
+        }
+        function getValue(code) {
+            var text = [];
+            doc.iter(0, doc.size, function(line) { text.push(line.text); });
+            return text.join("\n");
+        }
+
+        function onMouseDown(e) {
+            setShift(e.shiftKey);
+            // Check whether this is a click in a widget
+            for (var n = e_target(e); n != wrapper; n = n.parentNode)
+                if (n.parentNode == code && n != mover) return;
+
+            // See if this is a click in the gutter
+            for (var n = e_target(e); n != wrapper; n = n.parentNode)
+                if (n.parentNode == gutterText) {
+                    if (options.onGutterClick)
+                        options.onGutterClick(instance, indexOf(gutterText.childNodes, n) + showingFrom, e);
+                    return e_preventDefault(e);
+                }
+
+            var start = posFromMouse(e);
+
+            switch (e_button(e)) {
+                case 3:
+                    if (gecko && !mac) onContextMenu(e);
+                    return;
+                case 2:
+                    if (start) setCursor(start.line, start.ch, true);
+                    return;
+            }
+            // For button 1, if it was clicked inside the editor
+            // (posFromMouse returning non-null), we have to adjust the
+            // selection.
+            if (!start) {if (e_target(e) == scroller) e_preventDefault(e); return;}
+
+            if (!focused) onFocus();
+
+            var now = +new Date;
+            if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
+                e_preventDefault(e);
+                setTimeout(focusInput, 20);
+                return selectLine(start.line);
+            } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {
+                lastDoubleClick = {time: now, pos: start};
+                e_preventDefault(e);
+                return selectWordAt(start);
+            } else { lastClick = {time: now, pos: start}; }
+
+            var last = start, going;
+            if (dragAndDrop && !posEq(sel.from, sel.to) &&
+                !posLess(start, sel.from) && !posLess(sel.to, start)) {
+                // Let the drag handler handle this.
+                if (webkit) lineSpace.draggable = true;
+                var up = connect(targetDocument, "mouseup", operation(function(e2) {
+                    if (webkit) lineSpace.draggable = false;
+                    draggingText = false;
+                    up();
+                    if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
+                        e_preventDefault(e2);
+                        setCursor(start.line, start.ch, true);
+                        focusInput();
+                    }
+                }), true);
+                draggingText = true;
+                return;
+            }
+            e_preventDefault(e);
+            setCursor(start.line, start.ch, true);
+
+            function extend(e) {
+                var cur = posFromMouse(e, true);
+                if (cur && !posEq(cur, last)) {
+                    if (!focused) onFocus();
+                    last = cur;
+                    setSelectionUser(start, cur);
+                    updateInput = false;
+                    var visible = visibleLines();
+                    if (cur.line >= visible.to || cur.line < visible.from)
+                        going = setTimeout(operation(function(){extend(e);}), 150);
+                }
+            }
+
+            var move = connect(targetDocument, "mousemove", operation(function(e) {
+                clearTimeout(going);
+                e_preventDefault(e);
+                extend(e);
+            }), true);
+            var up = connect(targetDocument, "mouseup", operation(function(e) {
+                clearTimeout(going);
+                var cur = posFromMouse(e);
+                if (cur) setSelectionUser(start, cur);
+                e_preventDefault(e);
+                focusInput();
+                updateInput = true;
+                move(); up();
+            }), true);
+        }
+        function onDoubleClick(e) {
+            for (var n = e_target(e); n != wrapper; n = n.parentNode)
+                if (n.parentNode == gutterText) return e_preventDefault(e);
+            var start = posFromMouse(e);
+            if (!start) return;
+            lastDoubleClick = {time: +new Date, pos: start};
+            e_preventDefault(e);
+            selectWordAt(start);
+        }
+        function onDrop(e) {
+            e.preventDefault();
+            var pos = posFromMouse(e, true), files = e.dataTransfer.files;
+            if (!pos || options.readOnly) return;
+            if (files && files.length && window.FileReader && window.File) {
+                function loadFile(file, i) {
+                    var reader = new FileReader;
+                    reader.onload = function() {
+                        text[i] = reader.result;
+                        if (++read == n) {
+                            pos = clipPos(pos);
+                            operation(function() {
+                                var end = replaceRange(text.join(""), pos, pos);
+                                setSelectionUser(pos, end);
+                            })();
+                        }
+                    };
+                    reader.readAsText(file);
+                }
+                var n = files.length, text = Array(n), read = 0;
+                for (var i = 0; i < n; ++i) loadFile(files[i], i);
+            }
+            else {
+                try {
+                    var text = e.dataTransfer.getData("Text");
+                    if (text) {
+                        var end = replaceRange(text, pos, pos);
+                        var curFrom = sel.from, curTo = sel.to;
+                        setSelectionUser(pos, end);
+                        if (draggingText) replaceRange("", curFrom, curTo);
+                        focusInput();
+                    }
+                }
+                catch(e){}
+            }
+        }
+        function onDragStart(e) {
+            var txt = getSelection();
+            // This will reset escapeElement
+            htmlEscape(txt);
+            e.dataTransfer.setDragImage(escapeElement, 0, 0);
+            e.dataTransfer.setData("Text", txt);
+        }
+        function handleKeyBinding(e) {
+            var name = keyNames[e.keyCode], next = keyMap[options.keyMap].auto, bound, dropShift;
+            if (name == null || e.altGraphKey) {
+                if (next) options.keyMap = next;
+                return null;
+            }
+            if (e.altKey) name = "Alt-" + name;
+            if (e.ctrlKey) name = "Ctrl-" + name;
+            if (e.metaKey) name = "Cmd-" + name;
+            if (e.shiftKey && (bound = lookupKey("Shift-" + name, options.extraKeys, options.keyMap))) {
+                dropShift = true;
+            } else {
+                bound = lookupKey(name, options.extraKeys, options.keyMap);
+            }
+            if (typeof bound == "string") {
+                if (commands.propertyIsEnumerable(bound)) bound = commands[bound];
+                else bound = null;
+            }
+            if (next && (bound || !isModifierKey(e))) options.keyMap = next;
+            if (!bound) return false;
+            if (dropShift) {
+                var prevShift = shiftSelecting;
+                shiftSelecting = null;
+                bound(instance);
+                shiftSelecting = prevShift;
+            } else bound(instance);
+            e_preventDefault(e);
+            return true;
+        }
+        var lastStoppedKey = null;
+        function onKeyDown(e) {
+            if (!focused) onFocus();
+            var code = e.keyCode;
+            // IE does strange things with escape.
+            if (ie && code == 27) { e.returnValue = false; }
+            setShift(code == 16 || e.shiftKey);
+            // First give onKeyEvent option a chance to handle this.
+            if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
+            var handled = handleKeyBinding(e);
+            if (window.opera) {
+                lastStoppedKey = handled ? e.keyCode : null;
+                // Opera has no cut event... we try to at least catch the key combo
+                if (!handled && (mac ? e.metaKey : e.ctrlKey) && e.keyCode == 88)
+                    replaceSelection("");
+            }
+        }
+        function onKeyPress(e) {
+            if (window.opera && e.keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
+            if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
+            if (window.opera && !e.which && handleKeyBinding(e)) return;
+            if (options.electricChars && mode.electricChars) {
+                var ch = String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode);
+                if (mode.electricChars.indexOf(ch) > -1)
+                    setTimeout(operation(function() {indentLine(sel.to.line, "smart");}), 75);
+            }
+            fastPoll();
+        }
+        function onKeyUp(e) {
+            if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
+            if (e.keyCode == 16) shiftSelecting = null;
+        }
+
+        function onFocus() {
+            if (options.readOnly) return;
+            if (!focused) {
+                if (options.onFocus) options.onFocus(instance);
+                focused = true;
+                if (wrapper.className.search(/\bCodeMirror-focused\b/) == -1)
+                    wrapper.className += " CodeMirror-focused";
+                if (!leaveInputAlone) resetInput(true);
+            }
+            slowPoll();
+            restartBlink();
+        }
+        function onBlur() {
+            if (focused) {
+                if (options.onBlur) options.onBlur(instance);
+                focused = false;
+                wrapper.className = wrapper.className.replace(" CodeMirror-focused", "");
+            }
+            clearInterval(blinker);
+            setTimeout(function() {if (!focused) shiftSelecting = null;}, 150);
+        }
+
+        // Replace the range from from to to by the strings in newText.
+        // Afterwards, set the selection to selFrom, selTo.
+        function updateLines(from, to, newText, selFrom, selTo) {
+            if (history) {
+                var old = [];
+                doc.iter(from.line, to.line + 1, function(line) { old.push(line.text); });
+                history.addChange(from.line, newText.length, old);
+                while (history.done.length > options.undoDepth) history.done.shift();
+            }
+            updateLinesNoUndo(from, to, newText, selFrom, selTo);
+        }
+        function unredoHelper(from, to) {
+            var change = from.pop();
+            if (change) {
+                var replaced = [], end = change.start + change.added;
+                doc.iter(change.start, end, function(line) { replaced.push(line.text); });
+                to.push({start: change.start, added: change.old.length, old: replaced});
+                var pos = clipPos({line: change.start + change.old.length - 1,
+                    ch: editEnd(replaced[replaced.length-1], change.old[change.old.length-1])});
+                updateLinesNoUndo({line: change.start, ch: 0}, {line: end - 1, ch: getLine(end-1).text.length}, change.old, pos, pos);
+                updateInput = true;
+            }
+        }
+        function undo() {unredoHelper(history.done, history.undone);}
+        function redo() {unredoHelper(history.undone, history.done);}
+
+        function updateLinesNoUndo(from, to, newText, selFrom, selTo) {
+            var recomputeMaxLength = false, maxLineLength = maxLine.length;
+            if (!options.lineWrapping)
+                doc.iter(from.line, to.line, function(line) {
+                    if (line.text.length == maxLineLength) {recomputeMaxLength = true; return true;}
+                });
+            if (from.line != to.line || newText.length > 1) gutterDirty = true;
+
+            var nlines = to.line - from.line, firstLine = getLine(from.line), lastLine = getLine(to.line);
+            // First adjust the line structure, taking some care to leave highlighting intact.
+            if (from.ch == 0 && to.ch == 0 && newText[newText.length - 1] == "") {
+                // This is a whole-line replace. Treated specially to make
+                // sure line objects move the way they are supposed to.
+                var added = [], prevLine = null;
+                if (from.line) {
+                    prevLine = getLine(from.line - 1);
+                    prevLine.fixMarkEnds(lastLine);
+                } else lastLine.fixMarkStarts();
+                for (var i = 0, e = newText.length - 1; i < e; ++i)
+                    added.push(Line.inheritMarks(newText[i], prevLine));
+                if (nlines) doc.remove(from.line, nlines, callbacks);
+                if (added.length) doc.insert(from.line, added);
+            } else if (firstLine == lastLine) {
+                if (newText.length == 1)
+                    firstLine.replace(from.ch, to.ch, newText[0]);
+                else {
+                    lastLine = firstLine.split(to.ch, newText[newText.length-1]);
+                    firstLine.replace(from.ch, null, newText[0]);
+                    firstLine.fixMarkEnds(lastLine);
+                    var added = [];
+                    for (var i = 1, e = newText.length - 1; i < e; ++i)
+                        added.push(Line.inheritMarks(newText[i], firstLine));
+                    added.push(lastLine);
+                    doc.insert(from.line + 1, added);
+                }
+            } else if (newText.length == 1) {
+                firstLine.replace(from.ch, null, newText[0]);
+                lastLine.replace(null, to.ch, "");
+                firstLine.append(lastLine);
+                doc.remove(from.line + 1, nlines, callbacks);
+            } else {
+                var added = [];
+                firstLine.replace(from.ch, null, newText[0]);
+                lastLine.replace(null, to.ch, newText[newText.length-1]);
+                firstLine.fixMarkEnds(lastLine);
+                for (var i = 1, e = newText.length - 1; i < e; ++i)
+                    added.push(Line.inheritMarks(newText[i], firstLine));
+                if (nlines > 1) doc.remove(from.line + 1, nlines - 1, callbacks);
+                doc.insert(from.line + 1, added);
+            }
+            if (options.lineWrapping) {
+                var perLine = scroller.clientWidth / charWidth() - 3;
+                doc.iter(from.line, from.line + newText.length, function(line) {
+                    if (line.hidden) return;
+                    var guess = Math.ceil(line.text.length / perLine) || 1;
+                    if (guess != line.height) updateLineHeight(line, guess);
+                });
+            } else {
+                doc.iter(from.line, i + newText.length, function(line) {
+                    var l = line.text;
+                    if (l.length > maxLineLength) {
+                        maxLine = l; maxLineLength = l.length; maxWidth = null;
+                        recomputeMaxLength = false;
+                    }
+                });
+                if (recomputeMaxLength) {
+                    maxLineLength = 0; maxLine = ""; maxWidth = null;
+                    doc.iter(0, doc.size, function(line) {
+                        var l = line.text;
+                        if (l.length > maxLineLength) {
+                            maxLineLength = l.length; maxLine = l;
+                        }
+                    });
+                }
+            }
+
+            // Add these lines to the work array, so that they will be
+            // highlighted. Adjust work lines if lines were added/removed.
+            var newWork = [], lendiff = newText.length - nlines - 1;
+            for (var i = 0, l = work.length; i < l; ++i) {
+                var task = work[i];
+                if (task < from.line) newWork.push(task);
+                else if (task > to.line) newWork.push(task + lendiff);
+            }
+            var hlEnd = from.line + Math.min(newText.length, 500);
+            highlightLines(from.line, hlEnd);
+            newWork.push(hlEnd);
+            work = newWork;
+            startWorker(100);
+            // Remember that these lines changed, for updating the display
+            changes.push({from: from.line, to: to.line + 1, diff: lendiff});
+            var changeObj = {from: from, to: to, text: newText};
+            if (textChanged) {
+                for (var cur = textChanged; cur.next; cur = cur.next) {}
+                cur.next = changeObj;
+            } else textChanged = changeObj;
+
+            // Update the selection
+            function updateLine(n) {return n <= Math.min(to.line, to.line + lendiff) ? n : n + lendiff;}
+            setSelection(selFrom, selTo, updateLine(sel.from.line), updateLine(sel.to.line));
+
+            // Make sure the scroll-size div has the correct height.
+            code.style.height = (doc.height * textHeight() + 2 * paddingTop()) + "px";
+        }
+
+        function replaceRange(code, from, to) {
+            from = clipPos(from);
+            if (!to) to = from; else to = clipPos(to);
+            code = splitLines(code);
+            function adjustPos(pos) {
+                if (posLess(pos, from)) return pos;
+                if (!posLess(to, pos)) return end;
+                var line = pos.line + code.length - (to.line - from.line) - 1;
+                var ch = pos.ch;
+                if (pos.line == to.line)
+                    ch += code[code.length-1].length - (to.ch - (to.line == from.line ? from.ch : 0));
+                return {line: line, ch: ch};
+            }
+            var end;
+            replaceRange1(code, from, to, function(end1) {
+                end = end1;
+                return {from: adjustPos(sel.from), to: adjustPos(sel.to)};
+            });
+            return end;
+        }
+        function replaceSelection(code, collapse) {
+            replaceRange1(splitLines(code), sel.from, sel.to, function(end) {
+                if (collapse == "end") return {from: end, to: end};
+                else if (collapse == "start") return {from: sel.from, to: sel.from};
+                else return {from: sel.from, to: end};
+            });
+        }
+        function replaceRange1(code, from, to, computeSel) {
+            var endch = code.length == 1 ? code[0].length + from.ch : code[code.length-1].length;
+            var newSel = computeSel({line: from.line + code.length - 1, ch: endch});
+            updateLines(from, to, code, newSel.from, newSel.to);
+        }
+
+        function getRange(from, to) {
+            var l1 = from.line, l2 = to.line;
+            if (l1 == l2) return getLine(l1).text.slice(from.ch, to.ch);
+            var code = [getLine(l1).text.slice(from.ch)];
+            doc.iter(l1 + 1, l2, function(line) { code.push(line.text); });
+            code.push(getLine(l2).text.slice(0, to.ch));
+            return code.join("\n");
+        }
+        function getSelection() {
+            return getRange(sel.from, sel.to);
+        }
+
+        var pollingFast = false; // Ensures slowPoll doesn't cancel fastPoll
+        function slowPoll() {
+            if (pollingFast) return;
+            poll.set(options.pollInterval, function() {
+                startOperation();
+                readInput();
+                if (focused) slowPoll();
+                endOperation();
+            });
+        }
+        function fastPoll() {
+            var missed = false;
+            pollingFast = true;
+            function p() {
+                startOperation();
+                var changed = readInput();
+                if (!changed && !missed) {missed = true; poll.set(60, p);}
+                else {pollingFast = false; slowPoll();}
+                endOperation();
+            }
+            poll.set(20, p);
+        }
+
+        // Previnput is a hack to work with IME. If we reset the textarea
+        // on every change, that breaks IME. So we look for changes
+        // compared to the previous content instead. (Modern browsers have
+        // events that indicate IME taking place, but these are not widely
+        // supported or compatible enough yet to rely on.)
+        var prevInput = "";
+        function readInput() {
+            if (leaveInputAlone || !focused || hasSelection(input)) return false;
+            var text = input.value;
+            if (text == prevInput) return false;
+            shiftSelecting = null;
+            var same = 0, l = Math.min(prevInput.length, text.length);
+            while (same < l && prevInput[same] == text[same]) ++same;
+            if (same < prevInput.length)
+                sel.from = {line: sel.from.line, ch: sel.from.ch - (prevInput.length - same)};
+            else if (overwrite && posEq(sel.from, sel.to))
+                sel.to = {line: sel.to.line, ch: Math.min(getLine(sel.to.line).text.length, sel.to.ch + (text.length - same))};
+            replaceSelection(text.slice(same), "end");
+            prevInput = text;
+            return true;
+        }
+        function resetInput(user) {
+            if (!posEq(sel.from, sel.to)) {
+                prevInput = "";
+                input.value = getSelection();
+                input.select();
+            } else if (user) prevInput = input.value = "";
+        }
+
+        function focusInput() {
+            if (!options.readOnly) input.focus();
+        }
+
+        function scrollEditorIntoView() {
+            if (!cursor.getBoundingClientRect) return;
+            var rect = cursor.getBoundingClientRect();
+            // IE returns bogus coordinates when the instance sits inside of an iframe and the cursor is hidden
+            if (ie && rect.top == rect.bottom) return;
+            var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight);
+            if (rect.top < 0 || rect.bottom > winH) cursor.scrollIntoView();
+        }
+        function scrollCursorIntoView() {
+            var cursor = localCoords(sel.inverted ? sel.from : sel.to);
+            var x = options.lineWrapping ? Math.min(cursor.x, lineSpace.offsetWidth) : cursor.x;
+            return scrollIntoView(x, cursor.y, x, cursor.yBot);
+        }
+        function scrollIntoView(x1, y1, x2, y2) {
+            var pl = paddingLeft(), pt = paddingTop(), lh = textHeight();
+            y1 += pt; y2 += pt; x1 += pl; x2 += pl;
+            var screen = scroller.clientHeight, screentop = scroller.scrollTop, scrolled = false, result = true;
+            if (y1 < screentop) {scroller.scrollTop = Math.max(0, y1 - 2*lh); scrolled = true;}
+            else if (y2 > screentop + screen) {scroller.scrollTop = y2 + lh - screen; scrolled = true;}
+
+            var screenw = scroller.clientWidth, screenleft = scroller.scrollLeft;
+            var gutterw = options.fixedGutter ? gutter.clientWidth : 0;
+            if (x1 < screenleft + gutterw) {
+                if (x1 < 50) x1 = 0;
+                scroller.scrollLeft = Math.max(0, x1 - 10 - gutterw);
+                scrolled = true;
+            }
+            else if (x2 > screenw + screenleft - 3) {
+                scroller.scrollLeft = x2 + 10 - screenw;
+                scrolled = true;
+                if (x2 > code.clientWidth) result = false;
+            }
+            if (scrolled && options.onScroll) options.onScroll(instance);
+            return result;
+        }
+
+        function visibleLines() {
+            var lh = textHeight(), top = scroller.scrollTop - paddingTop();
+            var from_height = Math.max(0, Math.floor(top / lh));
+            var to_height = Math.ceil((top + scroller.clientHeight) / lh);
+            return {from: lineAtHeight(doc, from_height),
+                to: lineAtHeight(doc, to_height)};
+        }
+        // Uses a set of changes plus the current scroll position to
+        // determine which DOM updates have to be made, and makes the
+        // updates.
+        function updateDisplay(changes, suppressCallback) {
+            if (!scroller.clientWidth) {
+                showingFrom = showingTo = displayOffset = 0;
+                return;
+            }
+            // Compute the new visible window
+            var visible = visibleLines();
+            // Bail out if the visible area is already rendered and nothing changed.
+            if (changes !== true && changes.length == 0 && visible.from >= showingFrom && visible.to <= showingTo) return;
+            var from = Math.max(visible.from - 100, 0), to = Math.min(doc.size, visible.to + 100);
+            if (showingFrom < from && from - showingFrom < 20) from = showingFrom;
+            if (showingTo > to && showingTo - to < 20) to = Math.min(doc.size, showingTo);
+
+            // Create a range of theoretically intact lines, and punch holes
+            // in that using the change info.
+            var intact = changes === true ? [] :
+                computeIntact([{from: showingFrom, to: showingTo, domStart: 0}], changes);
+            // Clip off the parts that won't be visible
+            var intactLines = 0;
+            for (var i = 0; i < intact.length; ++i) {
+                var range = intact[i];
+                if (range.from < from) {range.domStart += (from - range.from); range.from = from;}
+                if (range.to > to) range.to = to;
+                if (range.from >= range.to) intact.splice(i--, 1);
+                else intactLines += range.to - range.from;
+            }
+            if (intactLines == to - from) return;
+            intact.sort(function(a, b) {return a.domStart - b.domStart;});
+
+            var th = textHeight(), gutterDisplay = gutter.style.display;
+            lineDiv.style.display = gutter.style.display = "none";
+            patchDisplay(from, to, intact);
+            lineDiv.style.display = "";
+
+            // Position the mover div to align with the lines it's supposed
+            // to be showing (which will cover the visible display)
+            var different = from != showingFrom || to != showingTo || lastSizeC != scroller.clientHeight + th;
+            // This is just a bogus formula that detects when the editor is
+            // resized or the font size changes.
+            if (different) lastSizeC = scroller.clientHeight + th;
+            showingFrom = from; showingTo = to;
+            displayOffset = heightAtLine(doc, from);
+            mover.style.top = (displayOffset * th) + "px";
+            code.style.height = (doc.height * th + 2 * paddingTop()) + "px";
+
+            // Since this is all rather error prone, it is honoured with the
+            // only assertion in the whole file.
+            if (lineDiv.childNodes.length != showingTo - showingFrom)
+                throw new Error("BAD PATCH! " + JSON.stringify(intact) + " size=" + (showingTo - showingFrom) +
+                    " nodes=" + lineDiv.childNodes.length);
+
+            if (options.lineWrapping) {
+                maxWidth = scroller.clientWidth;
+                var curNode = lineDiv.firstChild;
+                doc.iter(showingFrom, showingTo, function(line) {
+                    if (!line.hidden) {
+                        var height = Math.round(curNode.offsetHeight / th) || 1;
+                        if (line.height != height) {updateLineHeight(line, height); gutterDirty = true;}
+                    }
+                    curNode = curNode.nextSibling;
+                });
+            } else {
+                if (maxWidth == null) maxWidth = stringWidth(maxLine);
+                if (maxWidth > scroller.clientWidth) {
+                    lineSpace.style.width = maxWidth + "px";
+                    // Needed to prevent odd wrapping/hiding of widgets placed in here.
+                    code.style.width = "";
+                    code.style.width = scroller.scrollWidth + "px";
+                } else {
+                    lineSpace.style.width = code.style.width = "";
+                }
+            }
+            gutter.style.display = gutterDisplay;
+            if (different || gutterDirty) updateGutter();
+            updateCursor();
+            if (!suppressCallback && options.onUpdate) options.onUpdate(instance);
+            return true;
+        }
+
+        function computeIntact(intact, changes) {
+            for (var i = 0, l = changes.length || 0; i < l; ++i) {
+                var change = changes[i], intact2 = [], diff = change.diff || 0;
+                for (var j = 0, l2 = intact.length; j < l2; ++j) {
+                    var range = intact[j];
+                    if (change.to <= range.from && change.diff)
+                        intact2.push({from: range.from + diff, to: range.to + diff,
+                            domStart: range.domStart});
+                    else if (change.to <= range.from || change.from >= range.to)
+                        intact2.push(range);
+                    else {
+                        if (change.from > range.from)
+                            intact2.push({from: range.from, to: change.from, domStart: range.domStart});
+                        if (change.to < range.to)
+                            intact2.push({from: change.to + diff, to: range.to + diff,
+                                domStart: range.domStart + (change.to - range.from)});
+                    }
+                }
+                intact = intact2;
+            }
+            return intact;
+        }
+
+        function patchDisplay(from, to, intact) {
+            // The first pass removes the DOM nodes that aren't intact.
+            if (!intact.length) lineDiv.innerHTML = "";
+            else {
+                function killNode(node) {
+                    var tmp = node.nextSibling;
+                    node.parentNode.removeChild(node);
+                    return tmp;
+                }
+                var domPos = 0, curNode = lineDiv.firstChild, n;
+                for (var i = 0; i < intact.length; ++i) {
+                    var cur = intact[i];
+                    while (cur.domStart > domPos) {curNode = killNode(curNode); domPos++;}
+                    for (var j = 0, e = cur.to - cur.from; j < e; ++j) {curNode = curNode.nextSibling; domPos++;}
+                }
+                while (curNode) curNode = killNode(curNode);
+            }
+            // This pass fills in the lines that actually changed.
+            var nextIntact = intact.shift(), curNode = lineDiv.firstChild, j = from;
+            var sfrom = sel.from.line, sto = sel.to.line, inSel = sfrom < from && sto >= from;
+            var scratch = targetDocument.createElement("div"), newElt;
+            doc.iter(from, to, function(line) {
+                var ch1 = null, ch2 = null;
+                if (inSel) {
+                    ch1 = 0;
+                    if (sto == j) {inSel = false; ch2 = sel.to.ch;}
+                } else if (sfrom == j) {
+                    if (sto == j) {ch1 = sel.from.ch; ch2 = sel.to.ch;}
+                    else {inSel = true; ch1 = sel.from.ch;}
+                }
+                if (nextIntact && nextIntact.to == j) nextIntact = intact.shift();
+                if (!nextIntact || nextIntact.from > j) {
+                    if (line.hidden) scratch.innerHTML = "<pre></pre>";
+                    else scratch.innerHTML = line.getHTML(ch1, ch2, true, tabText);
+                    lineDiv.insertBefore(scratch.firstChild, curNode);
+                } else {
+                    curNode = curNode.nextSibling;
+                }
+                ++j;
+            });
+        }
+
+        function updateGutter() {
+            if (!options.gutter && !options.lineNumbers) return;
+            var hText = mover.offsetHeight, hEditor = scroller.clientHeight;
+            gutter.style.height = (hText - hEditor < 2 ? hEditor : hText) + "px";
+            var html = [], i = showingFrom;
+            doc.iter(showingFrom, Math.max(showingTo, showingFrom + 1), function(line) {
+                if (line.hidden) {
+                    html.push("<pre></pre>");
+                } else {
+                    var marker = line.gutterMarker;
+                    var text = options.lineNumbers ? i + options.firstLineNumber : null;
+                    if (marker && marker.text)
+                        text = marker.text.replace("%N%", text != null ? text : "");
+                    else if (text == null)
+                        text = "\u00a0";
+                    html.push((marker && marker.style ? '<pre class="' + marker.style + '">' : "<pre>"), text);
+                    for (var j = 1; j < line.height; ++j) html.push("<br/>&#160;");
+                    html.push("</pre>");
+                }
+                ++i;
+            });
+            gutter.style.display = "none";
+            gutterText.innerHTML = html.join("");
+            var minwidth = String(doc.size).length, firstNode = gutterText.firstChild, val = eltText(firstNode), pad = "";
+            while (val.length + pad.length < minwidth) pad += "\u00a0";
+            if (pad) firstNode.insertBefore(targetDocument.createTextNode(pad), firstNode.firstChild);
+            gutter.style.display = "";
+            lineSpace.style.marginLeft = gutter.offsetWidth + "px";
+            gutterDirty = false;
+        }
+        function updateCursor() {
+            var head = sel.inverted ? sel.from : sel.to, lh = textHeight();
+            var pos = localCoords(head, true);
+            var wrapOff = eltOffset(wrapper), lineOff = eltOffset(lineDiv);
+            inputDiv.style.top = (pos.y + lineOff.top - wrapOff.top) + "px";
+            inputDiv.style.left = (pos.x + lineOff.left - wrapOff.left) + "px";
+            if (posEq(sel.from, sel.to)) {
+                cursor.style.top = pos.y + "px";
+                cursor.style.left = (options.lineWrapping ? Math.min(pos.x, lineSpace.offsetWidth) : pos.x) + "px";
+                cursor.style.display = "";
+            }
+            else cursor.style.display = "none";
+        }
+
+        function setShift(val) {
+            if (val) shiftSelecting = shiftSelecting || (sel.inverted ? sel.to : sel.from);
+            else shiftSelecting = null;
+        }
+        function setSelectionUser(from, to) {
+            var sh = shiftSelecting && clipPos(shiftSelecting);
+            if (sh) {
+                if (posLess(sh, from)) from = sh;
+                else if (posLess(to, sh)) to = sh;
+            }
+            setSelection(from, to);
+            userSelChange = true;
+        }
+        // Update the selection. Last two args are only used by
+        // updateLines, since they have to be expressed in the line
+        // numbers before the update.
+        function setSelection(from, to, oldFrom, oldTo) {
+            goalColumn = null;
+            if (oldFrom == null) {oldFrom = sel.from.line; oldTo = sel.to.line;}
+            if (posEq(sel.from, from) && posEq(sel.to, to)) return;
+            if (posLess(to, from)) {var tmp = to; to = from; from = tmp;}
+
+            // Skip over hidden lines.
+            if (from.line != oldFrom) from = skipHidden(from, oldFrom, sel.from.ch);
+            if (to.line != oldTo) to = skipHidden(to, oldTo, sel.to.ch);
+
+            if (posEq(from, to)) sel.inverted = false;
+            else if (posEq(from, sel.to)) sel.inverted = false;
+            else if (posEq(to, sel.from)) sel.inverted = true;
+
+            // Some ugly logic used to only mark the lines that actually did
+            // see a change in selection as changed, rather than the whole
+            // selected range.
+            if (posEq(from, to)) {
+                if (!posEq(sel.from, sel.to))
+                    changes.push({from: oldFrom, to: oldTo + 1});
+            }
+            else if (posEq(sel.from, sel.to)) {
+                changes.push({from: from.line, to: to.line + 1});
+            }
+            else {
+                if (!posEq(from, sel.from)) {
+                    if (from.line < oldFrom)
+                        changes.push({from: from.line, to: Math.min(to.line, oldFrom) + 1});
+                    else
+                        changes.push({from: oldFrom, to: Math.min(oldTo, from.line) + 1});
+                }
+                if (!posEq(to, sel.to)) {
+                    if (to.line < oldTo)
+                        changes.push({from: Math.max(oldFrom, from.line), to: oldTo + 1});
+                    else
+                        changes.push({from: Math.max(from.line, oldTo), to: to.line + 1});
+                }
+            }
+            sel.from = from; sel.to = to;
+            selectionChanged = true;
+        }
+        function skipHidden(pos, oldLine, oldCh) {
+            function getNonHidden(dir) {
+                var lNo = pos.line + dir, end = dir == 1 ? doc.size : -1;
+                while (lNo != end) {
+                    var line = getLine(lNo);
+                    if (!line.hidden) {
+                        var ch = pos.ch;
+                        if (ch > oldCh || ch > line.text.length) ch = line.text.length;
+                        return {line: lNo, ch: ch};
+                    }
+                    lNo += dir;
+                }
+            }
+            var line = getLine(pos.line);
+            if (!line.hidden) return pos;
+            if (pos.line >= oldLine) return getNonHidden(1) || getNonHidden(-1);
+            else return getNonHidden(-1) || getNonHidden(1);
+        }
+        function setCursor(line, ch, user) {
+            var pos = clipPos({line: line, ch: ch || 0});
+            (user ? setSelectionUser : setSelection)(pos, pos);
+        }
+
+        function clipLine(n) {return Math.max(0, Math.min(n, doc.size-1));}
+        function clipPos(pos) {
+            if (pos.line < 0) return {line: 0, ch: 0};
+            if (pos.line >= doc.size) return {line: doc.size-1, ch: getLine(doc.size-1).text.length};
+            var ch = pos.ch, linelen = getLine(pos.line).text.length;
+            if (ch == null || ch > linelen) return {line: pos.line, ch: linelen};
+            else if (ch < 0) return {line: pos.line, ch: 0};
+            else return pos;
+        }
+
+        function findPosH(dir, unit) {
+            var end = sel.inverted ? sel.from : sel.to, line = end.line, ch = end.ch;
+            var lineObj = getLine(line);
+            function findNextLine() {
+                for (var l = line + dir, e = dir < 0 ? -1 : doc.size; l != e; l += dir) {
+                    var lo = getLine(l);
+                    if (!lo.hidden) { line = l; lineObj = lo; return true; }
+                }
+            }
+            function moveOnce(boundToLine) {
+                if (ch == (dir < 0 ? 0 : lineObj.text.length)) {
+                    if (!boundToLine && findNextLine()) ch = dir < 0 ? lineObj.text.length : 0;
+                    else return false;
+                } else ch += dir;
+                return true;
+            }
+            if (unit == "char") moveOnce();
+            else if (unit == "column") moveOnce(true);
+            else if (unit == "word") {
+                var sawWord = false;
+                for (;;) {
+                    if (dir < 0) if (!moveOnce()) break;
+                    if (isWordChar(lineObj.text.charAt(ch))) sawWord = true;
+                    else if (sawWord) {if (dir < 0) {dir = 1; moveOnce();} break;}
+                    if (dir > 0) if (!moveOnce()) break;
+                }
+            }
+            return {line: line, ch: ch};
+        }
+        function moveH(dir, unit) {
+            var pos = dir < 0 ? sel.from : sel.to;
+            if (shiftSelecting || posEq(sel.from, sel.to)) pos = findPosH(dir, unit);
+            setCursor(pos.line, pos.ch, true);
+        }
+        function deleteH(dir, unit) {
+            if (!posEq(sel.from, sel.to)) replaceRange("", sel.from, sel.to);
+            else if (dir < 0) replaceRange("", findPosH(dir, unit), sel.to);
+            else replaceRange("", sel.from, findPosH(dir, unit));
+            userSelChange = true;
+        }
+        var goalColumn = null;
+        function moveV(dir, unit) {
+            var dist = 0, pos = localCoords(sel.inverted ? sel.from : sel.to, true);
+            if (goalColumn != null) pos.x = goalColumn;
+            if (unit == "page") dist = scroller.clientHeight;
+            else if (unit == "line") dist = textHeight();
+            var target = coordsChar(pos.x, pos.y + dist * dir + 2);
+            setCursor(target.line, target.ch, true);
+            goalColumn = pos.x;
+        }
+
+        function selectWordAt(pos) {
+            var line = getLine(pos.line).text;
+            var start = pos.ch, end = pos.ch;
+            while (start > 0 && isWordChar(line.charAt(start - 1))) --start;
+            while (end < line.length && isWordChar(line.charAt(end))) ++end;
+            setSelectionUser({line: pos.line, ch: start}, {line: pos.line, ch: end});
+        }
+        function selectLine(line) {
+            setSelectionUser({line: line, ch: 0}, {line: line, ch: getLine(line).text.length});
+        }
+        function indentSelected(mode) {
+            if (posEq(sel.from, sel.to)) return indentLine(sel.from.line, mode);
+            var e = sel.to.line - (sel.to.ch ? 0 : 1);
+            for (var i = sel.from.line; i <= e; ++i) indentLine(i, mode);
+        }
+
+        function indentLine(n, how) {
+            if (!how) how = "add";
+            if (how == "smart") {
+                if (!mode.indent) how = "prev";
+                else var state = getStateBefore(n);
+            }
+
+            var line = getLine(n), curSpace = line.indentation(options.tabSize),
+                curSpaceString = line.text.match(/^\s*/)[0], indentation;
+            if (how == "prev") {
+                if (n) indentation = getLine(n-1).indentation(options.tabSize);
+                else indentation = 0;
+            }
+            else if (how == "smart") indentation = mode.indent(state, line.text.slice(curSpaceString.length), line.text);
+            else if (how == "add") indentation = curSpace + options.indentUnit;
+            else if (how == "subtract") indentation = curSpace - options.indentUnit;
+            indentation = Math.max(0, indentation);
+            var diff = indentation - curSpace;
+
+            if (!diff) {
+                if (sel.from.line != n && sel.to.line != n) return;
+                var indentString = curSpaceString;
+            }
+            else {
+                var indentString = "", pos = 0;
+                if (options.indentWithTabs)
+                    for (var i = Math.floor(indentation / options.tabSize); i; --i) {pos += options.tabSize; indentString += "\t";}
+                while (pos < indentation) {++pos; indentString += " ";}
+            }
+
+            replaceRange(indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length});
+        }
+
+        function loadMode() {
+            mode = CodeMirror.getMode(options, options.mode);
+            doc.iter(0, doc.size, function(line) { line.stateAfter = null; });
+            work = [0];
+            startWorker();
+        }
+        function gutterChanged() {
+            var visible = options.gutter || options.lineNumbers;
+            gutter.style.display = visible ? "" : "none";
+            if (visible) gutterDirty = true;
+            else lineDiv.parentNode.style.marginLeft = 0;
+        }
+        function wrappingChanged(from, to) {
+            if (options.lineWrapping) {
+                wrapper.className += " CodeMirror-wrap";
+                var perLine = scroller.clientWidth / charWidth() - 3;
+                doc.iter(0, doc.size, function(line) {
+                    if (line.hidden) return;
+                    var guess = Math.ceil(line.text.length / perLine) || 1;
+                    if (guess != 1) updateLineHeight(line, guess);
+                });
+                lineSpace.style.width = code.style.width = "";
+            } else {
+                wrapper.className = wrapper.className.replace(" CodeMirror-wrap", "");
+                maxWidth = null; maxLine = "";
+                doc.iter(0, doc.size, function(line) {
+                    if (line.height != 1 && !line.hidden) updateLineHeight(line, 1);
+                    if (line.text.length > maxLine.length) maxLine = line.text;
+                });
+            }
+            changes.push({from: 0, to: doc.size});
+        }
+        function computeTabText() {
+            for (var str = '<span class="cm-tab">', i = 0; i < options.tabSize; ++i) str += " ";
+            return str + "</span>";
+        }
+        function tabsChanged() {
+            tabText = computeTabText();
+            updateDisplay(true);
+        }
+        function themeChanged() {
+            scroller.className = scroller.className.replace(/\s*cm-s-\w+/g, "") +
+                options.theme.replace(/(^|\s)\s*/g, " cm-s-");
+        }
+
+        function TextMarker() { this.set = []; }
+        TextMarker.prototype.clear = operation(function() {
+            var min = Infinity, max = -Infinity;
+            for (var i = 0, e = this.set.length; i < e; ++i) {
+                var line = this.set[i], mk = line.marked;
+                if (!mk || !line.parent) continue;
+                var lineN = lineNo(line);
+                min = Math.min(min, lineN); max = Math.max(max, lineN);
+                for (var j = 0; j < mk.length; ++j)
+                    if (mk[j].set == this.set) mk.splice(j--, 1);
+            }
+            if (min != Infinity)
+                changes.push({from: min, to: max + 1});
+        });
+        TextMarker.prototype.find = function() {
+            var from, to;
+            for (var i = 0, e = this.set.length; i < e; ++i) {
+                var line = this.set[i], mk = line.marked;
+                for (var j = 0; j < mk.length; ++j) {
+                    var mark = mk[j];
+                    if (mark.set == this.set) {
+                        if (mark.from != null || mark.to != null) {
+                            var found = lineNo(line);
+                            if (found != null) {
+                                if (mark.from != null) from = {line: found, ch: mark.from};
+                                if (mark.to != null) to = {line: found, ch: mark.to};
+                            }
+                        }
+                    }
+                }
+            }
+            return {from: from, to: to};
+        };
+
+        function markText(from, to, className) {
+            from = clipPos(from); to = clipPos(to);
+            var tm = new TextMarker();
+            function add(line, from, to, className) {
+                getLine(line).addMark(new MarkedText(from, to, className, tm.set));
+            }
+            if (from.line == to.line) add(from.line, from.ch, to.ch, className);
+            else {
+                add(from.line, from.ch, null, className);
+                for (var i = from.line + 1, e = to.line; i < e; ++i)
+                    add(i, null, null, className);
+                add(to.line, null, to.ch, className);
+            }
+            changes.push({from: from.line, to: to.line + 1});
+            return tm;
+        }
+
+        function setBookmark(pos) {
+            pos = clipPos(pos);
+            var bm = new Bookmark(pos.ch);
+            getLine(pos.line).addMark(bm);
+            return bm;
+        }
+
+        function addGutterMarker(line, text, className) {
+            if (typeof line == "number") line = getLine(clipLine(line));
+            line.gutterMarker = {text: text, style: className};
+            gutterDirty = true;
+            return line;
+        }
+        function removeGutterMarker(line) {
+            if (typeof line == "number") line = getLine(clipLine(line));
+            line.gutterMarker = null;
+            gutterDirty = true;
+        }
+
+        function changeLine(handle, op) {
+            var no = handle, line = handle;
+            if (typeof handle == "number") line = getLine(clipLine(handle));
+            else no = lineNo(handle);
+            if (no == null) return null;
+            if (op(line, no)) changes.push({from: no, to: no + 1});
+            else return null;
+            return line;
+        }
+        function setLineClass(handle, className) {
+            return changeLine(handle, function(line) {
+                if (line.className != className) {
+                    line.className = className;
+                    return true;
+                }
+            });
+        }
+        function setLineHidden(handle, hidden) {
+            return changeLine(handle, function(line, no) {
+                if (line.hidden != hidden) {
+                    line.hidden = hidden;
+                    updateLineHeight(line, hidden ? 0 : 1);
+                    if (hidden && (sel.from.line == no || sel.to.line == no))
+                        setSelection(skipHidden(sel.from, sel.from.line, sel.from.ch),
+                            skipHidden(sel.to, sel.to.line, sel.to.ch));
+                    return (gutterDirty = true);
+                }
+            });
+        }
+
+        function lineInfo(line) {
+            if (typeof line == "number") {
+                if (!isLine(line)) return null;
+                var n = line;
+                line = getLine(line);
+                if (!line) return null;
+            }
+            else {
+                var n = lineNo(line);
+                if (n == null) return null;
+            }
+            var marker = line.gutterMarker;
+            return {line: n, handle: line, text: line.text, markerText: marker && marker.text,
+                markerClass: marker && marker.style, lineClass: line.className};
+        }
+
+        function stringWidth(str) {
+            measure.innerHTML = "<pre><span>x</span></pre>";
+            measure.firstChild.firstChild.firstChild.nodeValue = str;
+            return measure.firstChild.firstChild.offsetWidth || 10;
+        }
+        // These are used to go from pixel positions to character
+        // positions, taking varying character widths into account.
+        function charFromX(line, x) {
+            if (x <= 0) return 0;
+            var lineObj = getLine(line), text = lineObj.text;
+            function getX(len) {
+                measure.innerHTML = "<pre><span>" + lineObj.getHTML(null, null, false, tabText, len) + "</span></pre>";
+                return measure.firstChild.firstChild.offsetWidth;
+            }
+            var from = 0, fromX = 0, to = text.length, toX;
+            // Guess a suitable upper bound for our search.
+            var estimated = Math.min(to, Math.ceil(x / charWidth()));
+            for (;;) {
+                var estX = getX(estimated);
+                if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));
+                else {toX = estX; to = estimated; break;}
+            }
+            if (x > toX) return to;
+            // Try to guess a suitable lower bound as well.
+            estimated = Math.floor(to * 0.8); estX = getX(estimated);
+            if (estX < x) {from = estimated; fromX = estX;}
+            // Do a binary search between these bounds.
+            for (;;) {
+                if (to - from <= 1) return (toX - x > x - fromX) ? from : to;
+                var middle = Math.ceil((from + to) / 2), middleX = getX(middle);
+                if (middleX > x) {to = middle; toX = middleX;}
+                else {from = middle; fromX = middleX;}
+            }
+        }
+
+        var tempId = Math.floor(Math.random() * 0xffffff).toString(16);
+        function measureLine(line, ch) {
+            var extra = "";
+            // Include extra text at the end to make sure the measured line is wrapped in the right way.
+            if (options.lineWrapping) {
+                var end = line.text.indexOf(" ", ch + 2);
+                extra = htmlEscape(line.text.slice(ch + 1, end < 0 ? line.text.length : end + (ie ? 5 : 0)));
+            }
+            measure.innerHTML = "<pre>" + line.getHTML(null, null, false, tabText, ch) +
+                '<span id="CodeMirror-temp-' + tempId + '">' + htmlEscape(line.text.charAt(ch) || " ") + "</span>" +
+                extra + "</pre>";
+            var elt = document.getElementById("CodeMirror-temp-" + tempId);
+            var top = elt.offsetTop, left = elt.offsetLeft;
+            // Older IEs report zero offsets for spans directly after a wrap
+            if (ie && ch && top == 0 && left == 0) {
+                var backup = document.createElement("span");
+                backup.innerHTML = "x";
+                elt.parentNode.insertBefore(backup, elt.nextSibling);
+                top = backup.offsetTop;
+            }
+            return {top: top, left: left};
+        }
+        function localCoords(pos, inLineWrap) {
+            var x, lh = textHeight(), y = lh * (heightAtLine(doc, pos.line) - (inLineWrap ? displayOffset : 0));
+            if (pos.ch == 0) x = 0;
+            else {
+                var sp = measureLine(getLine(pos.line), pos.ch);
+                x = sp.left;
+                if (options.lineWrapping) y += Math.max(0, sp.top);
+            }
+            return {x: x, y: y, yBot: y + lh};
+        }
+        // Coords must be lineSpace-local
+        function coordsChar(x, y) {
+            if (y < 0) y = 0;
+            var th = textHeight(), cw = charWidth(), heightPos = displayOffset + Math.floor(y / th);
+            var lineNo = lineAtHeight(doc, heightPos);
+            if (lineNo >= doc.size) return {line: doc.size - 1, ch: getLine(doc.size - 1).text.length};
+            var lineObj = getLine(lineNo), text = lineObj.text;
+            var tw = options.lineWrapping, innerOff = tw ? heightPos - heightAtLine(doc, lineNo) : 0;
+            if (x <= 0 && innerOff == 0) return {line: lineNo, ch: 0};
+            function getX(len) {
+                var sp = measureLine(lineObj, len);
+                if (tw) {
+                    var off = Math.round(sp.top / th);
+                    return Math.max(0, sp.left + (off - innerOff) * scroller.clientWidth);
+                }
+                return sp.left;
+            }
+            var from = 0, fromX = 0, to = text.length, toX;
+            // Guess a suitable upper bound for our search.
+            var estimated = Math.min(to, Math.ceil((x + innerOff * scroller.clientWidth * .9) / cw));
+            for (;;) {
+                var estX = getX(estimated);
+                if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));
+                else {toX = estX; to = estimated; break;}
+            }
+            if (x > toX) return {line: lineNo, ch: to};
+            // Try to guess a suitable lower bound as well.
+            estimated = Math.floor(to * 0.8); estX = getX(estimated);
+            if (estX < x) {from = estimated; fromX = estX;}
+            // Do a binary search between these bounds.
+            for (;;) {
+                if (to - from <= 1) return {line: lineNo, ch: (toX - x > x - fromX) ? from : to};
+                var middle = Math.ceil((from + to) / 2), middleX = getX(middle);
+                if (middleX > x) {to = middle; toX = middleX;}
+                else {from = middle; fromX = middleX;}
+            }
+        }
+        function pageCoords(pos) {
+            var local = localCoords(pos, true), off = eltOffset(lineSpace);
+            return {x: off.left + local.x, y: off.top + local.y, yBot: off.top + local.yBot};
+        }
+
+        var cachedHeight, cachedHeightFor, measureText;
+        function textHeight() {
+            if (measureText == null) {
+                measureText = "<pre>";
+                for (var i = 0; i < 49; ++i) measureText += "x<br/>";
+                measureText += "x</pre>";
+            }
+            var offsetHeight = lineDiv.clientHeight;
+            if (offsetHeight == cachedHeightFor) return cachedHeight;
+            cachedHeightFor = offsetHeight;
+            measure.innerHTML = measureText;
+            cachedHeight = measure.firstChild.offsetHeight / 50 || 1;
+            measure.innerHTML = "";
+            return cachedHeight;
+        }
+        var cachedWidth, cachedWidthFor = 0;
+        function charWidth() {
+            if (scroller.clientWidth == cachedWidthFor) return cachedWidth;
+            cachedWidthFor = scroller.clientWidth;
+            return (cachedWidth = stringWidth("x"));
+        }
+        function paddingTop() {return lineSpace.offsetTop;}
+        function paddingLeft() {return lineSpace.offsetLeft;}
+
+        function posFromMouse(e, liberal) {
+            var offW = eltOffset(scroller, true), x, y;
+            // Fails unpredictably on IE[67] when mouse is dragged around quickly.
+            try { x = e.clientX; y = e.clientY; } catch (e) { return null; }
+            // This is a mess of a heuristic to try and determine whether a
+            // scroll-bar was clicked or not, and to return null if one was
+            // (and !liberal).
+            if (!liberal && (x - offW.left > scroller.clientWidth || y - offW.top > scroller.clientHeight))
+                return null;
+            var offL = eltOffset(lineSpace, true);
+            return coordsChar(x - offL.left, y - offL.top);
+        }
+        function onContextMenu(e) {
+            var pos = posFromMouse(e);
+            if (!pos || window.opera) return; // Opera is difficult.
+            if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))
+                operation(setCursor)(pos.line, pos.ch);
+
+            var oldCSS = input.style.cssText;
+            inputDiv.style.position = "absolute";
+            input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
+                "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; " +
+                "border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
+            leaveInputAlone = true;
+            var val = input.value = getSelection();
+            focusInput();
+            input.select();
+            function rehide() {
+                var newVal = splitLines(input.value).join("\n");
+                if (newVal != val) operation(replaceSelection)(newVal, "end");
+                inputDiv.style.position = "relative";
+                input.style.cssText = oldCSS;
+                leaveInputAlone = false;
+                resetInput(true);
+                slowPoll();
+            }
+
+            if (gecko) {
+                e_stop(e);
+                var mouseup = connect(window, "mouseup", function() {
+                    mouseup();
+                    setTimeout(rehide, 20);
+                }, true);
+            }
+            else {
+                setTimeout(rehide, 50);
+            }
+        }
+
+        // Cursor-blinking
+        function restartBlink() {
+            clearInterval(blinker);
+            var on = true;
+            cursor.style.visibility = "";
+            blinker = setInterval(function() {
+                cursor.style.visibility = (on = !on) ? "" : "hidden";
+            }, 650);
+        }
+
+        var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};
+        function matchBrackets(autoclear) {
+            var head = sel.inverted ? sel.from : sel.to, line = getLine(head.line), pos = head.ch - 1;
+            var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];
+            if (!match) return;
+            var ch = match.charAt(0), forward = match.charAt(1) == ">", d = forward ? 1 : -1, st = line.styles;
+            for (var off = pos + 1, i = 0, e = st.length; i < e; i+=2)
+                if ((off -= st[i].length) <= 0) {var style = st[i+1]; break;}
+
+            var stack = [line.text.charAt(pos)], re = /[(){}[\]]/;
+            function scan(line, from, to) {
+                if (!line.text) return;
+                var st = line.styles, pos = forward ? 0 : line.text.length - 1, cur;
+                for (var i = forward ? 0 : st.length - 2, e = forward ? st.length : -2; i != e; i += 2*d) {
+                    var text = st[i];
+                    if (st[i+1] != null && st[i+1] != style) {pos += d * text.length; continue;}
+                    for (var j = forward ? 0 : text.length - 1, te = forward ? text.length : -1; j != te; j += d, pos+=d) {
+                        if (pos >= from && pos < to && re.test(cur = text.charAt(j))) {
+                            var match = matching[cur];
+                            if (match.charAt(1) == ">" == forward) stack.push(cur);
+                            else if (stack.pop() != match.charAt(0)) return {pos: pos, match: false};
+                            else if (!stack.length) return {pos: pos, match: true};
+                        }
+                    }
+                }
+            }
+            for (var i = head.line, e = forward ? Math.min(i + 100, doc.size) : Math.max(-1, i - 100); i != e; i+=d) {
+                var line = getLine(i), first = i == head.line;
+                var found = scan(line, first && forward ? pos + 1 : 0, first && !forward ? pos : line.text.length);
+                if (found) break;
+            }
+            if (!found) found = {pos: null, match: false};
+            var style = found.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
+            var one = markText({line: head.line, ch: pos}, {line: head.line, ch: pos+1}, style),
+                two = found.pos != null && markText({line: i, ch: found.pos}, {line: i, ch: found.pos + 1}, style);
+            var clear = operation(function(){one.clear(); two && two.clear();});
+            if (autoclear) setTimeout(clear, 800);
+            else bracketHighlighted = clear;
+        }
+
+        // Finds the line to start with when starting a parse. Tries to
+        // find a line with a stateAfter, so that it can start with a
+        // valid state. If that fails, it returns the line with the
+        // smallest indentation, which tends to need the least context to
+        // parse correctly.
+        function findStartLine(n) {
+            var minindent, minline;
+            for (var search = n, lim = n - 40; search > lim; --search) {
+                if (search == 0) return 0;
+                var line = getLine(search-1);
+                if (line.stateAfter) return search;
+                var indented = line.indentation(options.tabSize);
+                if (minline == null || minindent > indented) {
+                    minline = search - 1;
+                    minindent = indented;
+                }
+            }
+            return minline;
+        }
+        function getStateBefore(n) {
+            var start = findStartLine(n), state = start && getLine(start-1).stateAfter;
+            if (!state) state = startState(mode);
+            else state = copyState(mode, state);
+            doc.iter(start, n, function(line) {
+                line.highlight(mode, state, options.tabSize);
+                line.stateAfter = copyState(mode, state);
+            });
+            if (start < n) changes.push({from: start, to: n});
+            if (n < doc.size && !getLine(n).stateAfter) work.push(n);
+            return state;
+        }
+        function highlightLines(start, end) {
+            var state = getStateBefore(start);
+            doc.iter(start, end, function(line) {
+                line.highlight(mode, state, options.tabSize);
+                line.stateAfter = copyState(mode, state);
+            });
+        }
+        function highlightWorker() {
+            var end = +new Date + options.workTime;
+            var foundWork = work.length;
+            while (work.length) {
+                if (!getLine(showingFrom).stateAfter) var task = showingFrom;
+                else var task = work.pop();
+                if (task >= doc.size) continue;
+                var start = findStartLine(task), state = start && getLine(start-1).stateAfter;
+                if (state) state = copyState(mode, state);
+                else state = startState(mode);
+
+                var unchanged = 0, compare = mode.compareStates, realChange = false,
+                    i = start, bail = false;
+                doc.iter(i, doc.size, function(line) {
+                    var hadState = line.stateAfter;
+                    if (+new Date > end) {
+                        work.push(i);
+                        startWorker(options.workDelay);
+                        if (realChange) changes.push({from: task, to: i + 1});
+                        return (bail = true);
+                    }
+                    var changed = line.highlight(mode, state, options.tabSize);
+                    if (changed) realChange = true;
+                    line.stateAfter = copyState(mode, state);
+                    if (compare) {
+                        if (hadState && compare(hadState, state)) return true;
+                    } else {
+                        if (changed !== false || !hadState) unchanged = 0;
+                        else if (++unchanged > 3 && (!mode.indent || mode.indent(hadState, "") == mode.indent(state, "")))
+                            return true;
+                    }
+                    ++i;
+                });
+                if (bail) return;
+                if (realChange) changes.push({from: task, to: i + 1});
+            }
+            if (foundWork && options.onHighlightComplete)
+                options.onHighlightComplete(instance);
+        }
+        function startWorker(time) {
+            if (!work.length) return;
+            highlight.set(time, operation(highlightWorker));
+        }
+
+        // Operations are used to wrap changes in such a way that each
+        // change won't have to update the cursor and display (which would
+        // be awkward, slow, and error-prone), but instead updates are
+        // batched and then all combined and executed at once.
+        function startOperation() {
+            updateInput = userSelChange = textChanged = null;
+            changes = []; selectionChanged = false; callbacks = [];
+        }
+        function endOperation() {
+            var reScroll = false, updated;
+            if (selectionChanged) reScroll = !scrollCursorIntoView();
+            if (changes.length) updated = updateDisplay(changes, true);
+            else {
+                if (selectionChanged) updateCursor();
+                if (gutterDirty) updateGutter();
+            }
+            if (reScroll) scrollCursorIntoView();
+            if (selectionChanged) {scrollEditorIntoView(); restartBlink();}
+
+            if (focused && !leaveInputAlone &&
+                (updateInput === true || (updateInput !== false && selectionChanged)))
+                resetInput(userSelChange);
+
+            if (selectionChanged && options.matchBrackets)
+                setTimeout(operation(function() {
+                    if (bracketHighlighted) {bracketHighlighted(); bracketHighlighted = null;}
+                    if (posEq(sel.from, sel.to)) matchBrackets(false);
+                }), 20);
+            var tc = textChanged, cbs = callbacks; // these can be reset by callbacks
+            if (selectionChanged && options.onCursorActivity)
+                options.onCursorActivity(instance);
+            if (tc && options.onChange && instance)
+                options.onChange(instance, tc);
+            for (var i = 0; i < cbs.length; ++i) cbs[i](instance);
+            if (updated && options.onUpdate) options.onUpdate(instance);
+        }
+        var nestedOperation = 0;
+        function operation(f) {
+            return function() {
+                if (!nestedOperation++) startOperation();
+                try {var result = f.apply(this, arguments);}
+                finally {if (!--nestedOperation) endOperation();}
+                return result;
+            };
+        }
+
+        for (var ext in extensions)
+            if (extensions.propertyIsEnumerable(ext) &&
+                !instance.propertyIsEnumerable(ext))
+                instance[ext] = extensions[ext];
+        return instance;
+    } // (end of function CodeMirror)
+
+    // The default configuration options.
+    CodeMirror.defaults = {
+        value: "",
+        mode: null,
+        theme: "default",
+        indentUnit: 2,
+        indentWithTabs: false,
+        tabSize: 4,
+        keyMap: "default",
+        extraKeys: null,
+        electricChars: true,
+        onKeyEvent: null,
+        lineWrapping: false,
+        lineNumbers: false,
+        gutter: false,
+        fixedGutter: false,
+        firstLineNumber: 1,
+        readOnly: false,
+        onChange: null,
+        onCursorActivity: null,
+        onGutterClick: null,
+        onHighlightComplete: null,
+        onUpdate: null,
+        onFocus: null, onBlur: null, onScroll: null,
+        matchBrackets: false,
+        workTime: 100,
+        workDelay: 200,
+        pollInterval: 100,
+        undoDepth: 40,
+        tabindex: null,
+        document: window.document
+    };
+
+    var mac = /Mac/.test(navigator.platform);
+    var win = /Win/.test(navigator.platform);
+
+    // Known modes, by name and by MIME
+    var modes = {}, mimeModes = {};
+    CodeMirror.defineMode = function(name, mode) {
+        if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
+        modes[name] = mode;
+    };
+    CodeMirror.defineMIME = function(mime, spec) {
+        mimeModes[mime] = spec;
+    };
+    CodeMirror.getMode = function(options, spec) {
+        if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
+            spec = mimeModes[spec];
+        if (typeof spec == "string")
+            var mname = spec, config = {};
+        else if (spec != null)
+            var mname = spec.name, config = spec;
+        var mfactory = modes[mname];
+        if (!mfactory) {
+            if (window.console) console.warn("No mode " + mname + " found, falling back to plain text.");
+            return CodeMirror.getMode(options, "text/plain");
+        }
+        return mfactory(options, config || {});
+    };
+    CodeMirror.listModes = function() {
+        var list = [];
+        for (var m in modes)
+            if (modes.propertyIsEnumerable(m)) list.push(m);
+        return list;
+    };
+    CodeMirror.listMIMEs = function() {
+        var list = [];
+        for (var m in mimeModes)
+            if (mimeModes.propertyIsEnumerable(m)) list.push({mime: m, mode: mimeModes[m]});
+        return list;
+    };
+
+    var extensions = CodeMirror.extensions = {};
+    CodeMirror.defineExtension = function(name, func) {
+        extensions[name] = func;
+    };
+
+    var commands = CodeMirror.commands = {
+        selectAll: function(cm) {cm.setSelection({line: 0, ch: 0}, {line: cm.lineCount() - 1});},
+        killLine: function(cm) {
+            var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);
+            if (!sel && cm.getLine(from.line).length == from.ch) cm.replaceRange("", from, {line: from.line + 1, ch: 0});
+            else cm.replaceRange("", from, sel ? to : {line: from.line});
+        },
+        deleteLine: function(cm) {var l = cm.getCursor().line; cm.replaceRange("", {line: l, ch: 0}, {line: l});},
+        undo: function(cm) {cm.undo();},
+        redo: function(cm) {cm.redo();},
+        goDocStart: function(cm) {cm.setCursor(0, 0, true);},
+        goDocEnd: function(cm) {cm.setSelection({line: cm.lineCount() - 1}, null, true);},
+        goLineStart: function(cm) {cm.setCursor(cm.getCursor().line, 0, true);},
+        goLineStartSmart: function(cm) {
+            var cur = cm.getCursor();
+            var text = cm.getLine(cur.line), firstNonWS = Math.max(0, text.search(/\S/));
+            cm.setCursor(cur.line, cur.ch <= firstNonWS && cur.ch ? 0 : firstNonWS, true);
+        },
+        goLineEnd: function(cm) {cm.setSelection({line: cm.getCursor().line}, null, true);},
+        goLineUp: function(cm) {cm.moveV(-1, "line");},
+        goLineDown: function(cm) {cm.moveV(1, "line");},
+        goPageUp: function(cm) {cm.moveV(-1, "page");},
+        goPageDown: function(cm) {cm.moveV(1, "page");},
+        goCharLeft: function(cm) {cm.moveH(-1, "char");},
+        goCharRight: function(cm) {cm.moveH(1, "char");},
+        goColumnLeft: function(cm) {cm.moveH(-1, "column");},
+        goColumnRight: function(cm) {cm.moveH(1, "column");},
+        goWordLeft: function(cm) {cm.moveH(-1, "word");},
+        goWordRight: function(cm) {cm.moveH(1, "word");},
+        delCharLeft: function(cm) {cm.deleteH(-1, "char");},
+        delCharRight: function(cm) {cm.deleteH(1, "char");},
+        delWordLeft: function(cm) {cm.deleteH(-1, "word");},
+        delWordRight: function(cm) {cm.deleteH(1, "word");},
+        indentAuto: function(cm) {cm.indentSelection("smart");},
+        indentMore: function(cm) {cm.indentSelection("add");},
+        indentLess: function(cm) {cm.indentSelection("subtract");},
+        insertTab: function(cm) {cm.replaceSelection("\t", "end");},
+        transposeChars: function(cm) {
+            var cur = cm.getCursor(), line = cm.getLine(cur.line);
+            if (cur.ch > 0 && cur.ch < line.length - 1)
+                cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1),
+                    {line: cur.line, ch: cur.ch - 1}, {line: cur.line, ch: cur.ch + 1});
+        },
+        newlineAndIndent: function(cm) {
+            cm.replaceSelection("\n", "end");
+            cm.indentLine(cm.getCursor().line);
+        },
+        toggleOverwrite: function(cm) {cm.toggleOverwrite();}
+    };
+
+    var keyMap = CodeMirror.keyMap = {};
+    keyMap.basic = {
+        "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
+        "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
+        "Delete": "delCharRight", "Backspace": "delCharLeft", "Tab": "indentMore", "Shift-Tab": "indentLess",
+        "Enter": "newlineAndIndent", "Insert": "toggleOverwrite"
+    };
+    // Note that the save and find-related commands aren't defined by
+    // default. Unknown commands are simply ignored.
+    keyMap.pcDefault = {
+        "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
+        "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
+        "Ctrl-Left": "goWordLeft", "Ctrl-Right": "goWordRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
+        "Ctrl-Backspace": "delWordLeft", "Ctrl-Delete": "delWordRight", "Ctrl-S": "save", "Ctrl-F": "find",
+        "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
+        fallthrough: "basic"
+    };
+    keyMap.macDefault = {
+        "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
+        "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goWordLeft",
+        "Alt-Right": "goWordRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delWordLeft",
+        "Ctrl-Alt-Backspace": "delWordRight", "Alt-Delete": "delWordRight", "Cmd-S": "save", "Cmd-F": "find",
+        "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
+        fallthrough: ["basic", "emacsy"]
+    };
+    keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
+    keyMap.emacsy = {
+        "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
+        "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
+        "Ctrl-V": "goPageUp", "Shift-Ctrl-V": "goPageDown", "Ctrl-D": "delCharRight", "Ctrl-H": "delCharLeft",
+        "Alt-D": "delWordRight", "Alt-Backspace": "delWordLeft", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
+    };
+
+    function lookupKey(name, extraMap, map) {
+        function lookup(name, map, ft) {
+            var found = map[name];
+            if (found != null) return found;
+            if (ft == null) ft = map.fallthrough;
+            if (ft == null) return map.catchall;
+            if (typeof ft == "string") return lookup(name, keyMap[ft]);
+            for (var i = 0, e = ft.length; i < e; ++i) {
+                found = lookup(name, keyMap[ft[i]]);
+                if (found != null) return found;
+            }
+            return null;
+        }
+        return extraMap ? lookup(name, extraMap, map) : lookup(name, keyMap[map]);
+    }
+    function isModifierKey(event) {
+        var name = keyNames[event.keyCode];
+        return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
+    }
+
+    CodeMirror.fromTextArea = function(textarea, options) {
+        if (!options) options = {};
+        options.value = textarea.value;
+        if (!options.tabindex && textarea.tabindex)
+            options.tabindex = textarea.tabindex;
+
+        function save() {textarea.value = instance.getValue();}
+        if (textarea.form) {
+            // Deplorable hack to make the submit method do the right thing.
+            var rmSubmit = connect(textarea.form, "submit", save, true);
+            if (typeof textarea.form.submit == "function") {
+                var realSubmit = textarea.form.submit;
+                function wrappedSubmit() {
+                    save();
+                    textarea.form.submit = realSubmit;
+                    textarea.form.submit();
+                    textarea.form.submit = wrappedSubmit;
+                }
+                textarea.form.submit = wrappedSubmit;
+            }
+        }
+
+        textarea.style.display = "none";
+        var instance = CodeMirror(function(node) {
+            textarea.parentNode.insertBefore(node, textarea.nextSibling);
+        }, options);
+        instance.save = save;
+        instance.getTextArea = function() { return textarea; };
+        instance.toTextArea = function() {
+            save();
+            textarea.parentNode.removeChild(instance.getWrapperElement());
+            textarea.style.display = "";
+            if (textarea.form) {
+                rmSubmit();
+                if (typeof textarea.form.submit == "function")
+                    textarea.form.submit = realSubmit;
+            }
+        };
+        return instance;
+    };
+
+    // Utility functions for working with state. Exported because modes
+    // sometimes need to do this.
+    function copyState(mode, state) {
+        if (state === true) return state;
+        if (mode.copyState) return mode.copyState(state);
+        var nstate = {};
+        for (var n in state) {
+            var val = state[n];
+            if (val instanceof Array) val = val.concat([]);
+            nstate[n] = val;
+        }
+        return nstate;
+    }
+    CodeMirror.copyState = copyState;
+    function startState(mode, a1, a2) {
+        return mode.startState ? mode.startState(a1, a2) : true;
+    }
+    CodeMirror.startState = startState;
+
+    // The character stream used by a mode's parser.
+    function StringStream(string, tabSize) {
+        this.pos = this.start = 0;
+        this.string = string;
+        this.tabSize = tabSize || 8;
+    }
+    StringStream.prototype = {
+        eol: function() {return this.pos >= this.string.length;},
+        sol: function() {return this.pos == 0;},
+        peek: function() {return this.string.charAt(this.pos);},
+        next: function() {
+            if (this.pos < this.string.length)
+                return this.string.charAt(this.pos++);
+        },
+        eat: function(match) {
+            var ch = this.string.charAt(this.pos);
+            if (typeof match == "string") var ok = ch == match;
+            else var ok = ch && (match.test ? match.test(ch) : match(ch));
+            if (ok) {++this.pos; return ch;}
+        },
+        eatWhile: function(match) {
+            var start = this.pos;
+            while (this.eat(match)){}
+            return this.pos > start;
+        },
+        eatSpace: function() {
+            var start = this.pos;
+            while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
+            return this.pos > start;
+        },
+        skipToEnd: function() {this.pos = this.string.length;},
+        skipTo: function(ch) {
+            var found = this.string.indexOf(ch, this.pos);
+            if (found > -1) {this.pos = found; return true;}
+        },
+        backUp: function(n) {this.pos -= n;},
+        column: function() {return countColumn(this.string, this.start, this.tabSize);},
+        indentation: function() {return countColumn(this.string, null, this.tabSize);},
+        match: function(pattern, consume, caseInsensitive) {
+            if (typeof pattern == "string") {
+                function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
+                if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
+                    if (consume !== false) this.pos += pattern.length;
+                    return true;
+                }
+            }
+            else {
+                var match = this.string.slice(this.pos).match(pattern);
+                if (match && consume !== false) this.pos += match[0].length;
+                return match;
+            }
+        },
+        current: function(){return this.string.slice(this.start, this.pos);}
+    };
+    CodeMirror.StringStream = StringStream;
+
+    function MarkedText(from, to, className, set) {
+        this.from = from; this.to = to; this.style = className; this.set = set;
+    }
+    MarkedText.prototype = {
+        attach: function(line) { this.set.push(line); },
+        detach: function(line) {
+            var ix = indexOf(this.set, line);
+            if (ix > -1) this.set.splice(ix, 1);
+        },
+        split: function(pos, lenBefore) {
+            if (this.to <= pos && this.to != null) return null;
+            var from = this.from < pos || this.from == null ? null : this.from - pos + lenBefore;
+            var to = this.to == null ? null : this.to - pos + lenBefore;
+            return new MarkedText(from, to, this.style, this.set);
+        },
+        dup: function() { return new MarkedText(null, null, this.style, this.set); },
+        clipTo: function(fromOpen, from, toOpen, to, diff) {
+            if (this.from != null && this.from >= from)
+                this.from = Math.max(to, this.from) + diff;
+            if (this.to != null && this.to > from)
+                this.to = to < this.to ? this.to + diff : from;
+            if (fromOpen && to > this.from && (to < this.to || this.to == null))
+                this.from = null;
+            if (toOpen && (from < this.to || this.to == null) && (from > this.from || this.from == null))
+                this.to = null;
+        },
+        isDead: function() { return this.from != null && this.to != null && this.from >= this.to; },
+        sameSet: function(x) { return this.set == x.set; }
+    };
+
+    function Bookmark(pos) {
+        this.from = pos; this.to = pos; this.line = null;
+    }
+    Bookmark.prototype = {
+        attach: function(line) { this.line = line; },
+        detach: function(line) { if (this.line == line) this.line = null; },
+        split: function(pos, lenBefore) {
+            if (pos < this.from) {
+                this.from = this.to = (this.from - pos) + lenBefore;
+                return this;
+            }
+        },
+        isDead: function() { return this.from > this.to; },
+        clipTo: function(fromOpen, from, toOpen, to, diff) {
+            if ((fromOpen || from < this.from) && (toOpen || to > this.to)) {
+                this.from = 0; this.to = -1;
+            } else if (this.from > from) {
+                this.from = this.to = Math.max(to, this.from) + diff;
+            }
+        },
+        sameSet: function(x) { return false; },
+        find: function() {
+            if (!this.line || !this.line.parent) return null;
+            return {line: lineNo(this.line), ch: this.from};
+        },
+        clear: function() {
+            if (this.line) {
+                var found = indexOf(this.line.marked, this);
+                if (found != -1) this.line.marked.splice(found, 1);
+                this.line = null;
+            }
+        }
+    };
+
+    // Line objects. These hold state related to a line, including
+    // highlighting info (the styles array).
+    function Line(text, styles) {
+        this.styles = styles || [text, null];
+        this.text = text;
+        this.height = 1;
+        this.marked = this.gutterMarker = this.className = this.handlers = null;
+        this.stateAfter = this.parent = this.hidden = null;
+    }
+    Line.inheritMarks = function(text, orig) {
+        var ln = new Line(text), mk = orig && orig.marked;
+        if (mk) {
+            for (var i = 0; i < mk.length; ++i) {
+                if (mk[i].to == null && mk[i].style) {
+                    var newmk = ln.marked || (ln.marked = []), mark = mk[i];
+                    var nmark = mark.dup(); newmk.push(nmark); nmark.attach(ln);
+                }
+            }
+        }
+        return ln;
+    }
+    Line.prototype = {
+        // Replace a piece of a line, keeping the styles around it intact.
+        replace: function(from, to_, text) {
+            var st = [], mk = this.marked, to = to_ == null ? this.text.length : to_;
+            copyStyles(0, from, this.styles, st);
+            if (text) st.push(text, null);
+            copyStyles(to, this.text.length, this.styles, st);
+            this.styles = st;
+            this.text = this.text.slice(0, from) + text + this.text.slice(to);
+            this.stateAfter = null;
+            if (mk) {
+                var diff = text.length - (to - from);
+                for (var i = 0, mark = mk[i]; i < mk.length; ++i) {
+                    mark.clipTo(from == null, from || 0, to_ == null, to, diff);
+                    if (mark.isDead()) {mark.detach(this); mk.splice(i--, 1);}
+                }
+            }
+        },
+        // Split a part off a line, keeping styles and markers intact.
+        split: function(pos, textBefore) {
+            var st = [textBefore, null], mk = this.marked;
+            copyStyles(pos, this.text.length, this.styles, st);
+            var taken = new Line(textBefore + this.text.slice(pos), st);
+            if (mk) {
+                for (var i = 0; i < mk.length; ++i) {
+                    var mark = mk[i];
+                    var newmark = mark.split(pos, textBefore.length);
+                    if (newmark) {
+                        if (!taken.marked) taken.marked = [];
+                        taken.marked.push(newmark); newmark.attach(taken);
+                    }
+                }
+            }
+            return taken;
+        },
+        append: function(line) {
+            var mylen = this.text.length, mk = line.marked, mymk = this.marked;
+            this.text += line.text;
+            copyStyles(0, line.text.length, line.styles, this.styles);
+            if (mymk) {
+                for (var i = 0; i < mymk.length; ++i)
+                    if (mymk[i].to == null) mymk[i].to = mylen;
+            }
+            if (mk && mk.length) {
+                if (!mymk) this.marked = mymk = [];
+                outer: for (var i = 0; i < mk.length; ++i) {
+                    var mark = mk[i];
+                    if (!mark.from) {
+                        for (var j = 0; j < mymk.length; ++j) {
+                            var mymark = mymk[j];
+                            if (mymark.to == mylen && mymark.sameSet(mark)) {
+                                mymark.to = mark.to == null ? null : mark.to + mylen;
+                                if (mymark.isDead()) {
+                                    mymark.detach(this);
+                                    mk.splice(i--, 1);
+                                }
+                                continue outer;
+                            }
+                        }
+                    }
+                    mymk.push(mark);
+                    mark.attach(this);
+                    mark.from += mylen;
+                    if (mark.to != null) mark.to += mylen;
+                }
+            }
+        },
+        fixMarkEnds: function(other) {
+            var mk = this.marked, omk = other.marked;
+            if (!mk) return;
+            for (var i = 0; i < mk.length; ++i) {
+                var mark = mk[i], close = mark.to == null;
+                if (close && omk) {
+                    for (var j = 0; j < omk.length; ++j)
+                        if (omk[j].sameSet(mark)) {close = false; break;}
+                }
+                if (close) mark.to = this.text.length;
+            }
+        },
+        fixMarkStarts: function() {
+            var mk = this.marked;
+            if (!mk) return;
+            for (var i = 0; i < mk.length; ++i)
+                if (mk[i].from == null) mk[i].from = 0;
+        },
+        addMark: function(mark) {
+            mark.attach(this);
+            if (this.marked == null) this.marked = [];
+            this.marked.push(mark);
+            this.marked.sort(function(a, b){return (a.from || 0) - (b.from || 0);});
+        },
+        // Run the given mode's parser over a line, update the styles
+        // array, which contains alternating fragments of text and CSS
+        // classes.
+        highlight: function(mode, state, tabSize) {
+            var stream = new StringStream(this.text, tabSize), st = this.styles, pos = 0;
+            var changed = false, curWord = st[0], prevWord;
+            if (this.text == "" && mode.blankLine) mode.blankLine(state);
+            while (!stream.eol()) {
+                var style = mode.token(stream, state);
+                var substr = this.text.slice(stream.start, stream.pos);
+                stream.start = stream.pos;
+                if (pos && st[pos-1] == style)
+                    st[pos-2] += substr;
+                else if (substr) {
+                    if (!changed && (st[pos+1] != style || (pos && st[pos-2] != prevWord))) changed = true;
+                    st[pos++] = substr; st[pos++] = style;
+                    prevWord = curWord; curWord = st[pos];
+                }
+                // Give up when line is ridiculously long
+                if (stream.pos > 5000) {
+                    st[pos++] = this.text.slice(stream.pos); st[pos++] = null;
+                    break;
+                }
+            }
+            if (st.length != pos) {st.length = pos; changed = true;}
+            if (pos && st[pos-2] != prevWord) changed = true;
+            // Short lines with simple highlights return null, and are
+            // counted as changed by the driver because they are likely to
+            // highlight the same way in various contexts.
+            return changed || (st.length < 5 && this.text.length < 10 ? null : false);
+        },
+        // Fetch the parser token for a given character. Useful for hacks
+        // that want to inspect the mode state (say, for completion).
+        getTokenAt: function(mode, state, ch) {
+            var txt = this.text, stream = new StringStream(txt);
+            while (stream.pos < ch && !stream.eol()) {
+                stream.start = stream.pos;
+                var style = mode.token(stream, state);
+            }
+            return {start: stream.start,
+                end: stream.pos,
+                string: stream.current(),
+                className: style || null,
+                state: state};
+        },
+        indentation: function(tabSize) {return countColumn(this.text, null, tabSize);},
+        // Produces an HTML fragment for the line, taking selection,
+        // marking, and highlighting into account.
+        getHTML: function(sfrom, sto, includePre, tabText, endAt) {
+            var html = [], first = true;
+            if (includePre)
+                html.push(this.className ? '<pre class="' + this.className + '">': "<pre>");
+            function span(text, style) {
+                if (!text) return;
+                // Work around a bug where, in some compat modes, IE ignores leading spaces
+                if (first && ie && text.charAt(0) == " ") text = "\u00a0" + text.slice(1);
+                first = false;
+                if (style) html.push('<span class="', style, '">', htmlEscape(text).replace(/\t/g, tabText), "</span>");
+                else html.push(htmlEscape(text).replace(/\t/g, tabText));
+            }
+            var st = this.styles, allText = this.text, marked = this.marked;
+            if (sfrom == sto) sfrom = null;
+            var len = allText.length;
+            if (endAt != null) len = Math.min(endAt, len);
+
+            if (!allText && endAt == null)
+                span(" ", sfrom != null && sto == null ? "CodeMirror-selected" : null);
+            else if (!marked && sfrom == null)
+                for (var i = 0, ch = 0; ch < len; i+=2) {
+                    var str = st[i], style = st[i+1], l = str.length;
+                    if (ch + l > len) str = str.slice(0, len - ch);
+                    ch += l;
+                    span(str, style && "cm-" + style);
+                }
+            else {
+                var pos = 0, i = 0, text = "", style, sg = 0;
+                var markpos = -1, mark = null;
+                function nextMark() {
+                    if (marked) {
+                        markpos += 1;
+                        mark = (markpos < marked.length) ? marked[markpos] : null;
+                    }
+                }
+                nextMark();
+                while (pos < len) {
+                    var upto = len;
+                    var extraStyle = "";
+                    if (sfrom != null) {
+                        if (sfrom > pos) upto = sfrom;
+                        else if (sto == null || sto > pos) {
+                            extraStyle = " CodeMirror-selected";
+                            if (sto != null) upto = Math.min(upto, sto);
+                        }
+                    }
+                    while (mark && mark.to != null && mark.to <= pos) nextMark();
+                    if (mark) {
+                        if (mark.from > pos) upto = Math.min(upto, mark.from);
+                        else {
+                            extraStyle += " " + mark.style;
+                            if (mark.to != null) upto = Math.min(upto, mark.to);
+                        }
+                    }
+                    for (;;) {
+                        var end = pos + text.length;
+                        var appliedStyle = style;
+                        if (extraStyle) appliedStyle = style ? style + extraStyle : extraStyle;
+                        span(end > upto ? text.slice(0, upto - pos) : text, appliedStyle);
+                        if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
+                        pos = end;
+                        text = st[i++]; style = "cm-" + st[i++];
+                    }
+                }
+                if (sfrom != null && sto == null) span(" ", "CodeMirror-selected");
+            }
+            if (includePre) html.push("</pre>");
+            return html.join("");
+        },
+        cleanUp: function() {
+            this.parent = null;
+            if (this.marked)
+                for (var i = 0, e = this.marked.length; i < e; ++i) this.marked[i].detach(this);
+        }
+    };
+    // Utility used by replace and split above
+    function copyStyles(from, to, source, dest) {
+        for (var i = 0, pos = 0, state = 0; pos < to; i+=2) {
+            var part = source[i], end = pos + part.length;
+            if (state == 0) {
+                if (end > from) dest.push(part.slice(from - pos, Math.min(part.length, to - pos)), source[i+1]);
+                if (end >= from) state = 1;
+            }
+            else if (state == 1) {
+                if (end > to) dest.push(part.slice(0, to - pos), source[i+1]);
+                else dest.push(part, source[i+1]);
+            }
+            pos = end;
+        }
+    }
+
+    // Data structure that holds the sequence of lines.
+    function LeafChunk(lines) {
+        this.lines = lines;
+        this.parent = null;
+        for (var i = 0, e = lines.length, height = 0; i < e; ++i) {
+            lines[i].parent = this;
+            height += lines[i].height;
+        }
+        this.height = height;
+    }
+    LeafChunk.prototype = {
+        chunkSize: function() { return this.lines.length; },
+        remove: function(at, n, callbacks) {
+            for (var i = at, e = at + n; i < e; ++i) {
+                var line = this.lines[i];
+                this.height -= line.height;
+                line.cleanUp();
+                if (line.handlers)
+                    for (var j = 0; j < line.handlers.length; ++j) callbacks.push(line.handlers[j]);
+            }
+            this.lines.splice(at, n);
+        },
+        collapse: function(lines) {
+            lines.splice.apply(lines, [lines.length, 0].concat(this.lines));
+        },
+        insertHeight: function(at, lines, height) {
+            this.height += height;
+            this.lines.splice.apply(this.lines, [at, 0].concat(lines));
+            for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this;
+        },
+        iterN: function(at, n, op) {
+            for (var e = at + n; at < e; ++at)
+                if (op(this.lines[at])) return true;
+        }
+    };
+    function BranchChunk(children) {
+        this.children = children;
+        var size = 0, height = 0;
+        for (var i = 0, e = children.length; i < e; ++i) {
+            var ch = children[i];
+            size += ch.chunkSize(); height += ch.height;
+            ch.parent = this;
+        }
+        this.size = size;
+        this.height = height;
+        this.parent = null;
+    }
+    BranchChunk.prototype = {
+        chunkSize: function() { return this.size; },
+        remove: function(at, n, callbacks) {
+            this.size -= n;
+            for (var i = 0; i < this.children.length; ++i) {
+                var child = this.children[i], sz = child.chunkSize();
+                if (at < sz) {
+                    var rm = Math.min(n, sz - at), oldHeight = child.height;
+                    child.remove(at, rm, callbacks);
+                    this.height -= oldHeight - child.height;
+                    if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
+                    if ((n -= rm) == 0) break;
+                    at = 0;
+                } else at -= sz;
+            }
+            if (this.size - n < 25) {
+                var lines = [];
+                this.collapse(lines);
+                this.children = [new LeafChunk(lines)];
+            }
+        },
+        collapse: function(lines) {
+            for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines);
+        },
+        insert: function(at, lines) {
+            var height = 0;
+            for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height;
+            this.insertHeight(at, lines, height);
+        },
+        insertHeight: function(at, lines, height) {
+            this.size += lines.length;
+            this.height += height;
+            for (var i = 0, e = this.children.length; i < e; ++i) {
+                var child = this.children[i], sz = child.chunkSize();
+                if (at <= sz) {
+                    child.insertHeight(at, lines, height);
+                    if (child.lines && child.lines.length > 50) {
+                        while (child.lines.length > 50) {
+                            var spilled = child.lines.splice(child.lines.length - 25, 25);
+                            var newleaf = new LeafChunk(spilled);
+                            child.height -= newleaf.height;
+                            this.children.splice(i + 1, 0, newleaf);
+                            newleaf.parent = this;
+                        }
+                        this.maybeSpill();
+                    }
+                    break;
+                }
+                at -= sz;
+            }
+        },
+        maybeSpill: function() {
+            if (this.children.length <= 10) return;
+            var me = this;
+            do {
+                var spilled = me.children.splice(me.children.length - 5, 5);
+                var sibling = new BranchChunk(spilled);
+                if (!me.parent) { // Become the parent node
+                    var copy = new BranchChunk(me.children);
+                    copy.parent = me;
+                    me.children = [copy, sibling];
+                    me = copy;
+                } else {
+                    me.size -= sibling.size;
+                    me.height -= sibling.height;
+                    var myIndex = indexOf(me.parent.children, me);
+                    me.parent.children.splice(myIndex + 1, 0, sibling);
+                }
+                sibling.parent = me.parent;
+            } while (me.children.length > 10);
+            me.parent.maybeSpill();
+        },
+        iter: function(from, to, op) { this.iterN(from, to - from, op); },
+        iterN: function(at, n, op) {
+            for (var i = 0, e = this.children.length; i < e; ++i) {
+                var child = this.children[i], sz = child.chunkSize();
+                if (at < sz) {
+                    var used = Math.min(n, sz - at);
+                    if (child.iterN(at, used, op)) return true;
+                    if ((n -= used) == 0) break;
+                    at = 0;
+                } else at -= sz;
+            }
+        }
+    };
+
+    function getLineAt(chunk, n) {
+        while (!chunk.lines) {
+            for (var i = 0;; ++i) {
+                var child = chunk.children[i], sz = child.chunkSize();
+                if (n < sz) { chunk = child; break; }
+                n -= sz;
+            }
+        }
+        return chunk.lines[n];
+    }
+    function lineNo(line) {
+        if (line.parent == null) return null;
+        var cur = line.parent, no = indexOf(cur.lines, line);
+        for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
+            for (var i = 0, e = chunk.children.length; ; ++i) {
+                if (chunk.children[i] == cur) break;
+                no += chunk.children[i].chunkSize();
+            }
+        }
+        return no;
+    }
+    function lineAtHeight(chunk, h) {
+        var n = 0;
+        outer: do {
+            for (var i = 0, e = chunk.children.length; i < e; ++i) {
+                var child = chunk.children[i], ch = child.height;
+                if (h < ch) { chunk = child; continue outer; }
+                h -= ch;
+                n += child.chunkSize();
+            }
+            return n;
+        } while (!chunk.lines);
+        for (var i = 0, e = chunk.lines.length; i < e; ++i) {
+            var line = chunk.lines[i], lh = line.height;
+            if (h < lh) break;
+            h -= lh;
+        }
+        return n + i;
+    }
+    function heightAtLine(chunk, n) {
+        var h = 0;
+        outer: do {
+            for (var i = 0, e = chunk.children.length; i < e; ++i) {
+                var child = chunk.children[i], sz = child.chunkSize();
+                if (n < sz) { chunk = child; continue outer; }
+                n -= sz;
+                h += child.height;
+            }
+            return h;
+        } while (!chunk.lines);
+        for (var i = 0; i < n; ++i) h += chunk.lines[i].height;
+        return h;
+    }
+
+    // The history object 'chunks' changes that are made close together
+    // and at almost the same time into bigger undoable units.
+    function History() {
+        this.time = 0;
+        this.done = []; this.undone = [];
+    }
+    History.prototype = {
+        addChange: function(start, added, old) {
+            this.undone.length = 0;
+            var time = +new Date, last = this.done[this.done.length - 1];
+            if (time - this.time > 400 || !last ||
+                last.start > start + added || last.start + last.added < start - last.added + last.old.length)
+                this.done.push({start: start, added: added, old: old});
+            else {
+                var oldoff = 0;
+                if (start < last.start) {
+                    for (var i = last.start - start - 1; i >= 0; --i)
+                        last.old.unshift(old[i]);
+                    last.added += last.start - start;
+                    last.start = start;
+                }
+                else if (last.start < start) {
+                    oldoff = start - last.start;
+                    added += oldoff;
+                }
+                for (var i = last.added - oldoff, e = old.length; i < e; ++i)
+                    last.old.push(old[i]);
+                if (last.added < added) last.added = added;
+            }
+            this.time = time;
+        }
+    };
+
+    function stopMethod() {e_stop(this);}
+    // Ensure an event has a stop method.
+    function addStop(event) {
+        if (!event.stop) event.stop = stopMethod;
+        return event;
+    }
+
+    function e_preventDefault(e) {
+        if (e.preventDefault) e.preventDefault();
+        else e.returnValue = false;
+    }
+    function e_stopPropagation(e) {
+        if (e.stopPropagation) e.stopPropagation();
+        else e.cancelBubble = true;
+    }
+    function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
+    CodeMirror.e_stop = e_stop;
+    CodeMirror.e_preventDefault = e_preventDefault;
+    CodeMirror.e_stopPropagation = e_stopPropagation;
+
+    function e_target(e) {return e.target || e.srcElement;}
+    function e_button(e) {
+        if (e.which) return e.which;
+        else if (e.button & 1) return 1;
+        else if (e.button & 2) return 3;
+        else if (e.button & 4) return 2;
+    }
+
+    // Event handler registration. If disconnect is true, it'll return a
+    // function that unregisters the handler.
+    function connect(node, type, handler, disconnect) {
+        if (typeof node.addEventListener == "function") {
+            node.addEventListener(type, handler, false);
+            if (disconnect) return function() {node.removeEventListener(type, handler, false);};
+        }
+        else {
+            var wrapHandler = function(event) {handler(event || window.event);};
+            node.attachEvent("on" + type, wrapHandler);
+            if (disconnect) return function() {node.detachEvent("on" + type, wrapHandler);};
+        }
+    }
+    CodeMirror.connect = connect;
+
+    function Delayed() {this.id = null;}
+    Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}};
+
+    // Detect drag-and-drop
+    var dragAndDrop = function() {
+        // IE8 has ondragstart and ondrop properties, but doesn't seem to
+        // actually support ondragstart the way it's supposed to work.
+        if (/MSIE [1-8]\b/.test(navigator.userAgent)) return false;
+        var div = document.createElement('div');
+        return "draggable" in div;
+    }();
+
+    var gecko = /gecko\/\d{7}/i.test(navigator.userAgent);
+    var ie = /MSIE \d/.test(navigator.userAgent);
+    var webkit = /WebKit\//.test(navigator.userAgent);
+
+    var lineSep = "\n";
+    // Feature-detect whether newlines in textareas are converted to \r\n
+    (function () {
+        var te = document.createElement("textarea");
+        te.value = "foo\nbar";
+        if (te.value.indexOf("\r") > -1) lineSep = "\r\n";
+    }());
+
+    // Counts the column offset in a string, taking tabs into account.
+    // Used mostly to find indentation.
+    function countColumn(string, end, tabSize) {
+        if (end == null) {
+            end = string.search(/[^\s\u00a0]/);
+            if (end == -1) end = string.length;
+        }
+        for (var i = 0, n = 0; i < end; ++i) {
+            if (string.charAt(i) == "\t") n += tabSize - (n % tabSize);
+            else ++n;
+        }
+        return n;
+    }
+
+    function computedStyle(elt) {
+        if (elt.currentStyle) return elt.currentStyle;
+        return window.getComputedStyle(elt, null);
+    }
+
+    // Find the position of an element by following the offsetParent chain.
+    // If screen==true, it returns screen (rather than page) coordinates.
+    function eltOffset(node, screen) {
+        var bod = node.ownerDocument.body;
+        var x = 0, y = 0, skipBody = false;
+        for (var n = node; n; n = n.offsetParent) {
+            var ol = n.offsetLeft, ot = n.offsetTop;
+            // Firefox reports weird inverted offsets when the body has a border.
+            if (n == bod) { x += Math.abs(ol); y += Math.abs(ot); }
+            else { x += ol, y += ot; }
+            if (screen && computedStyle(n).position == "fixed")
+                skipBody = true;
+        }
+        var e = screen && !skipBody ? null : bod;
+        for (var n = node.parentNode; n != e; n = n.parentNode)
+            if (n.scrollLeft != null) { x -= n.scrollLeft; y -= n.scrollTop;}
+        return {left: x, top: y};
+    }
+    // Use the faster and saner getBoundingClientRect method when possible.
+    if (document.documentElement.getBoundingClientRect != null) eltOffset = function(node, screen) {
+        // Take the parts of bounding client rect that we are interested in so we are able to edit if need be,
+        // since the returned value cannot be changed externally (they are kept in sync as the element moves within the page)
+        try { var box = node.getBoundingClientRect(); box = { top: box.top, left: box.left }; }
+        catch(e) { box = {top: 0, left: 0}; }
+        if (!screen) {
+            // Get the toplevel scroll, working around browser differences.
+            if (window.pageYOffset == null) {
+                var t = document.documentElement || document.body.parentNode;
+                if (t.scrollTop == null) t = document.body;
+                box.top += t.scrollTop; box.left += t.scrollLeft;
+            } else {
+                box.top += window.pageYOffset; box.left += window.pageXOffset;
+            }
+        }
+        return box;
+    };
+
+    // Get a node's text content.
+    function eltText(node) {
+        return node.textContent || node.innerText || node.nodeValue || "";
+    }
+
+    // Operations on {line, ch} objects.
+    function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
+    function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}
+    function copyPos(x) {return {line: x.line, ch: x.ch};}
+
+    var escapeElement = document.createElement("pre");
+    function htmlEscape(str) {
+        escapeElement.textContent = str;
+        return escapeElement.innerHTML;
+    }
+    // Recent (late 2011) Opera betas insert bogus newlines at the start
+    // of the textContent, so we strip those.
+    if (htmlEscape("a") == "\na")
+        htmlEscape = function(str) {
+            escapeElement.textContent = str;
+            return escapeElement.innerHTML.slice(1);
+        };
+    // Some IEs don't preserve tabs through innerHTML
+    else if (htmlEscape("\t") != "\t")
+        htmlEscape = function(str) {
+            escapeElement.innerHTML = "";
+            escapeElement.appendChild(document.createTextNode(str));
+            return escapeElement.innerHTML;
+        };
+    CodeMirror.htmlEscape = htmlEscape;
+
+    // Used to position the cursor after an undo/redo by finding the
+    // last edited character.
+    function editEnd(from, to) {
+        if (!to) return from ? from.length : 0;
+        if (!from) return to.length;
+        for (var i = from.length, j = to.length; i >= 0 && j >= 0; --i, --j)
+            if (from.charAt(i) != to.charAt(j)) break;
+        return j + 1;
+    }
+
+    function indexOf(collection, elt) {
+        if (collection.indexOf) return collection.indexOf(elt);
+        for (var i = 0, e = collection.length; i < e; ++i)
+            if (collection[i] == elt) return i;
+        return -1;
+    }
+    function isWordChar(ch) {
+        return /\w/.test(ch) || ch.toUpperCase() != ch.toLowerCase();
+    }
+
+    // See if "".split is the broken IE version, if so, provide an
+    // alternative way to split lines.
+    var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
+        var pos = 0, nl, result = [];
+        while ((nl = string.indexOf("\n", pos)) > -1) {
+            result.push(string.slice(pos, string.charAt(nl-1) == "\r" ? nl - 1 : nl));
+            pos = nl + 1;
+        }
+        result.push(string.slice(pos));
+        return result;
+    } : function(string){return string.split(/\r?\n/);};
+    CodeMirror.splitLines = splitLines;
+
+    var hasSelection = window.getSelection ? function(te) {
+        try { return te.selectionStart != te.selectionEnd; }
+        catch(e) { return false; }
+    } : function(te) {
+        try {var range = te.ownerDocument.selection.createRange();}
+        catch(e) {}
+        if (!range || range.parentElement() != te) return false;
+        return range.compareEndPoints("StartToEnd", range) != 0;
+    };
+
+    CodeMirror.defineMode("null", function() {
+        return {token: function(stream) {stream.skipToEnd();}};
+    });
+    CodeMirror.defineMIME("text/plain", "null");
+
+    var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
+        19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
+        36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
+        46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 186: ";", 187: "=", 188: ",",
+        189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 63276: "PageUp",
+        63277: "PageDown", 63275: "End", 63273: "Home", 63234: "Left", 63232: "Up", 63235: "Right",
+        63233: "Down", 63302: "Insert", 63272: "Delete"};
+    CodeMirror.keyNames = keyNames;
+    (function() {
+        // Number keys
+        for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i);
+        // Alphabetic keys
+        for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
+        // Function keys
+        for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
+    })();
+
+    return CodeMirror;
+})();
+CodeMirror.defineMode("xml", function(config, parserConfig) {
+    var indentUnit = config.indentUnit;
+    var Kludges = parserConfig.htmlMode ? {
+        autoSelfClosers: {"br": true, "img": true, "hr": true, "link": true, "input": true,
+            "meta": true, "col": true, "frame": true, "base": true, "area": true},
+        doNotIndent: {"pre": true},
+        allowUnquoted: true
+    } : {autoSelfClosers: {}, doNotIndent: {}, allowUnquoted: false};
+    var alignCDATA = parserConfig.alignCDATA;
+
+    // Return variables for tokenizers
+    var tagName, type;
+
+    function inText(stream, state) {
+        function chain(parser) {
+            state.tokenize = parser;
+            return parser(stream, state);
+        }
+
+        var ch = stream.next();
+        if (ch == "<") {
+            if (stream.eat("!")) {
+                if (stream.eat("[")) {
+                    if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>"));
+                    else return null;
+                }
+                else if (stream.match("--")) return chain(inBlock("comment", "-->"));
+                else if (stream.match("DOCTYPE", true, true)) {
+                    stream.eatWhile(/[\w\._\-]/);
+                    return chain(doctype(1));
+                }
+                else return null;
+            }
+            else if (stream.eat("?")) {
+                stream.eatWhile(/[\w\._\-]/);
+                state.tokenize = inBlock("meta", "?>");
+                return "meta";
+            }
+            else {
+                type = stream.eat("/") ? "closeTag" : "openTag";
+                stream.eatSpace();
+                tagName = "";
+                var c;
+                while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c;
+                state.tokenize = inTag;
+                return "tag";
+            }
+        }
+        else if (ch == "&") {
+            stream.eatWhile(/[^;]/);
+            stream.eat(";");
+            return "atom";
+        }
+        else {
+            stream.eatWhile(/[^&<]/);
+            return null;
+        }
+    }
+
+    function inTag(stream, state) {
+        var ch = stream.next();
+        if (ch == ">" || (ch == "/" && stream.eat(">"))) {
+            state.tokenize = inText;
+            type = ch == ">" ? "endTag" : "selfcloseTag";
+            return "tag";
+        }
+        else if (ch == "=") {
+            type = "equals";
+            return null;
+        }
+        else if (/[\'\"]/.test(ch)) {
+            state.tokenize = inAttribute(ch);
+            return state.tokenize(stream, state);
+        }
+        else {
+            stream.eatWhile(/[^\s\u00a0=<>\"\'\/?]/);
+            return "word";
+        }
+    }
+
+    function inAttribute(quote) {
+        return function(stream, state) {
+            while (!stream.eol()) {
+                if (stream.next() == quote) {
+                    state.tokenize = inTag;
+                    break;
+                }
+            }
+            return "string";
+        };
+    }
+
+    function inBlock(style, terminator) {
+        return function(stream, state) {
+            while (!stream.eol()) {
+                if (stream.match(terminator)) {
+                    state.tokenize = inText;
+                    break;
+                }
+                stream.next();
+            }
+            return style;
+        };
+    }
+    function doctype(depth) {
+        return function(stream, state) {
+            var ch;
+            while ((ch = stream.next()) != null) {
+                if (ch == "<") {
+                    state.tokenize = doctype(depth + 1);
+                    return state.tokenize(stream, state);
+                } else if (ch == ">") {
+                    if (depth == 1) {
+                        state.tokenize = inText;
+                        break;
+                    } else {
+                        state.tokenize = doctype(depth - 1);
+                        return state.tokenize(stream, state);
+                    }
+                }
+            }
+            return "meta";
+        };
+    }
+
+    var curState, setStyle;
+    function pass() {
+        for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);
+    }
+    function cont() {
+        pass.apply(null, arguments);
+        return true;
+    }
+
+    function pushContext(tagName, startOfLine) {
+        var noIndent = Kludges.doNotIndent.hasOwnProperty(tagName) || (curState.context && curState.context.noIndent);
+        curState.context = {
+            prev: curState.context,
+            tagName: tagName,
+            indent: curState.indented,
+            startOfLine: startOfLine,
+            noIndent: noIndent
+        };
+    }
+    function popContext() {
+        if (curState.context) curState.context = curState.context.prev;
+    }
+
+    function element(type) {
+        if (type == "openTag") {
+            curState.tagName = tagName;
+            return cont(attributes, endtag(curState.startOfLine));
+        } else if (type == "closeTag") {
+            var err = false;
+            if (curState.context) {
+                err = curState.context.tagName != tagName;
+            } else {
+                err = true;
+            }
+            if (err) setStyle = "error";
+            return cont(endclosetag(err));
+        }
+        return cont();
+    }
+    function endtag(startOfLine) {
+        return function(type) {
+            if (type == "selfcloseTag" ||
+                (type == "endTag" && Kludges.autoSelfClosers.hasOwnProperty(curState.tagName.toLowerCase())))
+                return cont();
+            if (type == "endTag") {pushContext(curState.tagName, startOfLine); return cont();}
+            return cont();
+        };
+    }
+    function endclosetag(err) {
+        return function(type) {
+            if (err) setStyle = "error";
+            if (type == "endTag") { popContext(); return cont(); }
+            setStyle = "error";
+            return cont(arguments.callee);
+        }
+    }
+
+    function attributes(type) {
+        if (type == "word") {setStyle = "attribute"; return cont(attributes);}
+        if (type == "equals") return cont(attvalue, attributes);
+        if (type == "string") {setStyle = "error"; return cont(attributes);}
+        return pass();
+    }
+    function attvalue(type) {
+        if (type == "word" && Kludges.allowUnquoted) {setStyle = "string"; return cont();}
+        if (type == "string") return cont(attvaluemaybe);
+        return pass();
+    }
+    function attvaluemaybe(type) {
+        if (type == "string") return cont(attvaluemaybe);
+        else return pass();
+    }
+
+    return {
+        startState: function() {
+            return {tokenize: inText, cc: [], indented: 0, startOfLine: true, tagName: null, context: null};
+        },
+
+        token: function(stream, state) {
+            if (stream.sol()) {
+                state.startOfLine = true;
+                state.indented = stream.indentation();
+            }
+            if (stream.eatSpace()) return null;
+
+            setStyle = type = tagName = null;
+            var style = state.tokenize(stream, state);
+            state.type = type;
+            if ((style || type) && style != "comment") {
+                curState = state;
+                while (true) {
+                    var comb = state.cc.pop() || element;
+                    if (comb(type || style)) break;
+                }
+            }
+            state.startOfLine = false;
+            return setStyle || style;
+        },
+
+        indent: function(state, textAfter, fullLine) {
+            var context = state.context;
+            if ((state.tokenize != inTag && state.tokenize != inText) ||
+                context && context.noIndent)
+                return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0;
+            if (alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0;
+            if (context && /^<\//.test(textAfter))
+                context = context.prev;
+            while (context && !context.startOfLine)
+                context = context.prev;
+            if (context) return context.indent + indentUnit;
+            else return 0;
+        },
+
+        compareStates: function(a, b) {
+            if (a.indented != b.indented || a.tokenize != b.tokenize) return false;
+            for (var ca = a.context, cb = b.context; ; ca = ca.prev, cb = cb.prev) {
+                if (!ca || !cb) return ca == cb;
+                if (ca.tagName != cb.tagName) return false;
+            }
+        },
+
+        electricChars: "/"
+    };
+});
+
+CodeMirror.defineMIME("application/xml", "xml");
+CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true});
+CodeMirror.defineMode("javascript", function(config, parserConfig) {
+    var indentUnit = config.indentUnit;
+    var jsonMode = parserConfig.json;
+
+    // Tokenizer
+
+    var keywords = function(){
+        function kw(type) {return {type: type, style: "keyword"};}
+        var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
+        var operator = kw("operator"), atom = {type: "atom", style: "atom"};
+        return {
+            "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
+            "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C,
+            "var": kw("var"), "const": kw("var"), "let": kw("var"),
+            "function": kw("function"), "catch": kw("catch"),
+            "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
+            "in": operator, "typeof": operator, "instanceof": operator,
+            "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom
+        };
+    }();
+
+    var isOperatorChar = /[+\-*&%=<>!?|]/;
+
+    function chain(stream, state, f) {
+        state.tokenize = f;
+        return f(stream, state);
+    }
+
+    function nextUntilUnescaped(stream, end) {
+        var escaped = false, next;
+        while ((next = stream.next()) != null) {
+            if (next == end && !escaped)
+                return false;
+            escaped = !escaped && next == "\\";
+        }
+        return escaped;
+    }
+
+    // Used as scratch variables to communicate multiple values without
+    // consing up tons of objects.
+    var type, content;
+    function ret(tp, style, cont) {
+        type = tp; content = cont;
+        return style;
+    }
+
+    function jsTokenBase(stream, state) {
+        var ch = stream.next();
+        if (ch == '"' || ch == "'")
+            return chain(stream, state, jsTokenString(ch));
+        else if (/[\[\]{}\(\),;\:\.]/.test(ch))
+            return ret(ch);
+        else if (ch == "0" && stream.eat(/x/i)) {
+            stream.eatWhile(/[\da-f]/i);
+            return ret("number", "number");
+        }
+        else if (/\d/.test(ch)) {
+            stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
+            return ret("number", "number");
+        }
+        else if (ch == "/") {
+            if (stream.eat("*")) {
+                return chain(stream, state, jsTokenComment);
+            }
+            else if (stream.eat("/")) {
+                stream.skipToEnd();
+                return ret("comment", "comment");
+            }
+            else if (state.reAllowed) {
+                nextUntilUnescaped(stream, "/");
+                stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
+                return ret("regexp", "string");
+            }
+            else {
+                stream.eatWhile(isOperatorChar);
+                return ret("operator", null, stream.current());
+            }
+        }
+        else if (ch == "#") {
+            stream.skipToEnd();
+            return ret("error", "error");
+        }
+        else if (isOperatorChar.test(ch)) {
+            stream.eatWhile(isOperatorChar);
+            return ret("operator", null, stream.current());
+        }
+        else {
+            stream.eatWhile(/[\w\$_]/);
+            var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
+            return (known && state.kwAllowed) ? ret(known.type, known.style, word) :
+                ret("variable", "variable", word);
+        }
+    }
+
+    function jsTokenString(quote) {
+        return function(stream, state) {
+            if (!nextUntilUnescaped(stream, quote))
+                state.tokenize = jsTokenBase;
+            return ret("string", "string");
+        };
+    }
+
+    function jsTokenComment(stream, state) {
+        var maybeEnd = false, ch;
+        while (ch = stream.next()) {
+            if (ch == "/" && maybeEnd) {
+                state.tokenize = jsTokenBase;
+                break;
+            }
+            maybeEnd = (ch == "*");
+        }
+        return ret("comment", "comment");
+    }
+
+    // Parser
+
+    var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true};
+
+    function JSLexical(indented, column, type, align, prev, info) {
+        this.indented = indented;
+        this.column = column;
+        this.type = type;
+        this.prev = prev;
+        this.info = info;
+        if (align != null) this.align = align;
+    }
+
+    function inScope(state, varname) {
+        for (var v = state.localVars; v; v = v.next)
+            if (v.name == varname) return true;
+    }
+
+    function parseJS(state, style, type, content, stream) {
+        var cc = state.cc;
+        // Communicate our context to the combinators.
+        // (Less wasteful than consing up a hundred closures on every call.)
+        cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
+
+        if (!state.lexical.hasOwnProperty("align"))
+            state.lexical.align = true;
+
+        while(true) {
+            var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
+            if (combinator(type, content)) {
+                while(cc.length && cc[cc.length - 1].lex)
+                    cc.pop()();
+                if (cx.marked) return cx.marked;
+                if (type == "variable" && inScope(state, content)) return "variable-2";
+                return style;
+            }
+        }
+    }
+
+    // Combinator utils
+
+    var cx = {state: null, column: null, marked: null, cc: null};
+    function pass() {
+        for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
+    }
+    function cont() {
+        pass.apply(null, arguments);
+        return true;
+    }
+    function register(varname) {
+        var state = cx.state;
+        if (state.context) {
+            cx.marked = "def";
+            for (var v = state.localVars; v; v = v.next)
+                if (v.name == varname) return;
+            state.localVars = {name: varname, next: state.localVars};
+        }
+    }
+
+    // Combinators
+
+    var defaultVars = {name: "this", next: {name: "arguments"}};
+    function pushcontext() {
+        if (!cx.state.context) cx.state.localVars = defaultVars;
+        cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
+    }
+    function popcontext() {
+        cx.state.localVars = cx.state.context.vars;
+        cx.state.context = cx.state.context.prev;
+    }
+    function pushlex(type, info) {
+        var result = function() {
+            var state = cx.state;
+            state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)
+        };
+        result.lex = true;
+        return result;
+    }
+    function poplex() {
+        var state = cx.state;
+        if (state.lexical.prev) {
+            if (state.lexical.type == ")")
+                state.indented = state.lexical.indented;
+            state.lexical = state.lexical.prev;
+        }
+    }
+    poplex.lex = true;
+
+    function expect(wanted) {
+        return function expecting(type) {
+            if (type == wanted) return cont();
+            else if (wanted == ";") return pass();
+            else return cont(arguments.callee);
+        };
+    }
+
+    function statement(type) {
+        if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
+        if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
+        if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
+        if (type == "{") return cont(pushlex("}"), block, poplex);
+        if (type == ";") return cont();
+        if (type == "function") return cont(functiondef);
+        if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
+            poplex, statement, poplex);
+        if (type == "variable") return cont(pushlex("stat"), maybelabel);
+        if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
+            block, poplex, poplex);
+        if (type == "case") return cont(expression, expect(":"));
+        if (type == "default") return cont(expect(":"));
+        if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
+            statement, poplex, popcontext);
+        return pass(pushlex("stat"), expression, expect(";"), poplex);
+    }
+    function expression(type) {
+        if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);
+        if (type == "function") return cont(functiondef);
+        if (type == "keyword c") return cont(maybeexpression);
+        if (type == "(") return cont(pushlex(")"), expression, expect(")"), poplex, maybeoperator);
+        if (type == "operator") return cont(expression);
+        if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator);
+        if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator);
+        return cont();
+    }
+    function maybeexpression(type) {
+        if (type.match(/[;\}\)\],]/)) return pass();
+        return pass(expression);
+    }
+
+    function maybeoperator(type, value) {
+        if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
+        if (type == "operator") return cont(expression);
+        if (type == ";") return;
+        if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
+        if (type == ".") return cont(property, maybeoperator);
+        if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator);
+    }
+    function maybelabel(type) {
+        if (type == ":") return cont(poplex, statement);
+        return pass(maybeoperator, expect(";"), poplex);
+    }
+    function property(type) {
+        if (type == "variable") {cx.marked = "property"; return cont();}
+    }
+    function objprop(type) {
+        if (type == "variable") cx.marked = "property";
+        if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression);
+    }
+    function commasep(what, end) {
+        function proceed(type) {
+            if (type == ",") return cont(what, proceed);
+            if (type == end) return cont();
+            return cont(expect(end));
+        }
+        return function commaSeparated(type) {
+            if (type == end) return cont();
+            else return pass(what, proceed);
+        };
+    }
+    function block(type) {
+        if (type == "}") return cont();
+        return pass(statement, block);
+    }
+    function vardef1(type, value) {
+        if (type == "variable"){register(value); return cont(vardef2);}
+        return cont();
+    }
+    function vardef2(type, value) {
+        if (value == "=") return cont(expression, vardef2);
+        if (type == ",") return cont(vardef1);
+    }
+    function forspec1(type) {
+        if (type == "var") return cont(vardef1, forspec2);
+        if (type == ";") return pass(forspec2);
+        if (type == "variable") return cont(formaybein);
+        return pass(forspec2);
+    }
+    function formaybein(type, value) {
+        if (value == "in") return cont(expression);
+        return cont(maybeoperator, forspec2);
+    }
+    function forspec2(type, value) {
+        if (type == ";") return cont(forspec3);
+        if (value == "in") return cont(expression);
+        return cont(expression, expect(";"), forspec3);
+    }
+    function forspec3(type) {
+        if (type != ")") cont(expression);
+    }
+    function functiondef(type, value) {
+        if (type == "variable") {register(value); return cont(functiondef);}
+        if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext);
+    }
+    function funarg(type, value) {
+        if (type == "variable") {register(value); return cont();}
+    }
+
+    // Interface
+
+    return {
+        startState: function(basecolumn) {
+            return {
+                tokenize: jsTokenBase,
+                reAllowed: true,
+                kwAllowed: true,
+                cc: [],
+                lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
+                localVars: null,
+                context: null,
+                indented: 0
+            };
+        },
+
+        token: function(stream, state) {
+            if (stream.sol()) {
+                if (!state.lexical.hasOwnProperty("align"))
+                    state.lexical.align = false;
+                state.indented = stream.indentation();
+            }
+            if (stream.eatSpace()) return null;
+            var style = state.tokenize(stream, state);
+            if (type == "comment") return style;
+            state.reAllowed = type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/);
+            state.kwAllowed = type != '.';
+            return parseJS(state, style, type, content, stream);
+        },
+
+        indent: function(state, textAfter) {
+            if (state.tokenize != jsTokenBase) return 0;
+            var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical,
+                type = lexical.type, closing = firstChar == type;
+            if (type == "vardef") return lexical.indented + 4;
+            else if (type == "form" && firstChar == "{") return lexical.indented;
+            else if (type == "stat" || type == "form") return lexical.indented + indentUnit;
+            else if (lexical.info == "switch" && !closing)
+                return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
+            else if (lexical.align) return lexical.column + (closing ? 0 : 1);
+            else return lexical.indented + (closing ? 0 : indentUnit);
+        },
+
+        electricChars: ":{}"
+    };
+});
+
+CodeMirror.defineMIME("text/javascript", "javascript");
+CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
+
+CodeMirror.defineMode("css", function(config) {
+    var indentUnit = config.indentUnit, type;
+    function ret(style, tp) {type = tp; return style;}
+
+    function tokenBase(stream, state) {
+        var ch = stream.next();
+        if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());}
+        else if (ch == "/" && stream.eat("*")) {
+            state.tokenize = tokenCComment;
+            return tokenCComment(stream, state);
+        }
+        else if (ch == "<" && stream.eat("!")) {
+            state.tokenize = tokenSGMLComment;
+            return tokenSGMLComment(stream, state);
+        }
+        else if (ch == "=") ret(null, "compare");
+        else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare");
+        else if (ch == "\"" || ch == "'") {
+            state.tokenize = tokenString(ch);
+            return state.tokenize(stream, state);
+        }
+        else if (ch == "#") {
+            stream.eatWhile(/[\w\\\-]/);
+            return ret("atom", "hash");
+        }
+        else if (ch == "!") {
+            stream.match(/^\s*\w*/);
+            return ret("keyword", "important");
+        }
+        else if (/\d/.test(ch)) {
+            stream.eatWhile(/[\w.%]/);
+            return ret("number", "unit");
+        }
+        else if (/[,.+>*\/]/.test(ch)) {
+            return ret(null, "select-op");
+        }
+        else if (/[;{}:\[\]]/.test(ch)) {
+            return ret(null, ch);
+        }
+        else {
+            stream.eatWhile(/[\w\\\-]/);
+            return ret("variable", "variable");
+        }
+    }
+
+    function tokenCComment(stream, state) {
+        var maybeEnd = false, ch;
+        while ((ch = stream.next()) != null) {
+            if (maybeEnd && ch == "/") {
+                state.tokenize = tokenBase;
+                break;
+            }
+            maybeEnd = (ch == "*");
+        }
+        return ret("comment", "comment");
+    }
+
+    function tokenSGMLComment(stream, state) {
+        var dashes = 0, ch;
+        while ((ch = stream.next()) != null) {
+            if (dashes >= 2 && ch == ">") {
+                state.tokenize = tokenBase;
+                break;
+            }
+            dashes = (ch == "-") ? dashes + 1 : 0;
+        }
+        return ret("comment", "comment");
+    }
+
+    function tokenString(quote) {
+        return function(stream, state) {
+            var escaped = false, ch;
+            while ((ch = stream.next()) != null) {
+                if (ch == quote && !escaped)
+                    break;
+                escaped = !escaped && ch == "\\";
+            }
+            if (!escaped) state.tokenize = tokenBase;
+            return ret("string", "string");
+        };
+    }
+
+    return {
+        startState: function(base) {
+            return {tokenize: tokenBase,
+                baseIndent: base || 0,
+                stack: []};
+        },
+
+        token: function(stream, state) {
+            if (stream.eatSpace()) return null;
+            var style = state.tokenize(stream, state);
+
+            var context = state.stack[state.stack.length-1];
+            if (type == "hash" && context == "rule") style = "atom";
+            else if (style == "variable") {
+                if (context == "rule") style = "number";
+                else if (!context || context == "@media{") style = "tag";
+            }
+
+            if (context == "rule" && /^[\{\};]$/.test(type))
+                state.stack.pop();
+            if (type == "{") {
+                if (context == "@media") state.stack[state.stack.length-1] = "@media{";
+                else state.stack.push("{");
+            }
+            else if (type == "}") state.stack.pop();
+            else if (type == "@media") state.stack.push("@media");
+            else if (context == "{" && type != "comment") state.stack.push("rule");
+            return style;
+        },
+
+        indent: function(state, textAfter) {
+            var n = state.stack.length;
+            if (/^\}/.test(textAfter))
+                n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
+            return state.baseIndent + n * indentUnit;
+        },
+
+        electricChars: "}"
+    };
+});
+
+CodeMirror.defineMIME("text/css", "css");
+CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
+    var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true});
+    var jsMode = CodeMirror.getMode(config, "javascript");
+    var cssMode = CodeMirror.getMode(config, "css");
+
+    function html(stream, state) {
+        var style = htmlMode.token(stream, state.htmlState);
+        if (style == "tag" && stream.current() == ">" && state.htmlState.context) {
+            if (/^script$/i.test(state.htmlState.context.tagName)) {
+                state.token = javascript;
+                state.localState = jsMode.startState(htmlMode.indent(state.htmlState, ""));
+                state.mode = "javascript";
+            }
+            else if (/^style$/i.test(state.htmlState.context.tagName)) {
+                state.token = css;
+                state.localState = cssMode.startState(htmlMode.indent(state.htmlState, ""));
+                state.mode = "css";
+            }
+        }
+        return style;
+    }
+    function maybeBackup(stream, pat, style) {
+        var cur = stream.current();
+        var close = cur.search(pat);
+        if (close > -1) stream.backUp(cur.length - close);
+        return style;
+    }
+    function javascript(stream, state) {
+        if (stream.match(/^<\/\s*script\s*>/i, false)) {
+            state.token = html;
+            state.curState = null;
+            state.mode = "html";
+            return html(stream, state);
+        }
+        return maybeBackup(stream, /<\/\s*script\s*>/,
+            jsMode.token(stream, state.localState));
+    }
+    function css(stream, state) {
+        if (stream.match(/^<\/\s*style\s*>/i, false)) {
+            state.token = html;
+            state.localState = null;
+            state.mode = "html";
+            return html(stream, state);
+        }
+        return maybeBackup(stream, /<\/\s*style\s*>/,
+            cssMode.token(stream, state.localState));
+    }
+
+    return {
+        startState: function() {
+            var state = htmlMode.startState();
+            return {token: html, localState: null, mode: "html", htmlState: state};
+        },
+
+        copyState: function(state) {
+            if (state.localState)
+                var local = CodeMirror.copyState(state.token == css ? cssMode : jsMode, state.localState);
+            return {token: state.token, localState: local, mode: state.mode,
+                htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};
+        },
+
+        token: function(stream, state) {
+            return state.token(stream, state);
+        },
+
+        indent: function(state, textAfter) {
+            if (state.token == html || /^\s*<\//.test(textAfter))
+                return htmlMode.indent(state.htmlState, textAfter);
+            else if (state.token == javascript)
+                return jsMode.indent(state.localState, textAfter);
+            else
+                return cssMode.indent(state.localState, textAfter);
+        },
+
+        compareStates: function(a, b) {
+            return htmlMode.compareStates(a.htmlState, b.htmlState);
+        },
+
+        electricChars: "/{}:"
+    }
+});
+
+CodeMirror.defineMIME("text/html", "htmlmixed");
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/mootools-adapter.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/mootools-adapter.js
new file mode 100644
index 0000000..50fb0f4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/mootools-adapter.js
@@ -0,0 +1,13 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+ MooTools adapter
+
+ (c) 2010-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(){var e=window,h=document,f=e.MooTools.version.substring(0,3),i=f==="1.2"||f==="1.1",j=i||f==="1.3",g=e.$extend||function(){return Object.append.apply(Object,arguments)};e.HighchartsAdapter={init:function(a){var b=Fx.prototype,c=b.start,d=Fx.Morph.prototype,e=d.compute;b.start=function(b,d){var e=this.element;if(b.d)this.paths=a.init(e,e.d,this.toD);c.apply(this,arguments);return this};d.compute=function(b,c,d){var f=this.paths;if(f)this.element.attr("d",a.step(f[0],f[1],d,this.toD));else return e.apply(this,
+arguments)}},adapterRun:function(a,b){if(b==="width"||b==="height")return parseInt($(a).getStyle(b),10)},getScript:function(a,b){var c=h.getElementsByTagName("head")[0],d=h.createElement("script");d.type="text/javascript";d.src=a;d.onload=b;c.appendChild(d)},animate:function(a,b,c){var d=a.attr,f=c&&c.complete;if(d&&!a.setStyle)a.getStyle=a.attr,a.setStyle=function(){var a=arguments;this.attr.call(this,a[0],a[1][0])},a.$family=function(){return!0};e.HighchartsAdapter.stop(a);c=new Fx.Morph(d?a:$(a),
+g({transition:Fx.Transitions.Quad.easeInOut},c));if(d)c.element=a;if(b.d)c.toD=b.d;f&&c.addEvent("complete",f);c.start(b);a.fx=c},each:function(a,b){return i?$each(a,b):Array.each(a,b)},map:function(a,b){return a.map(b)},grep:function(a,b){return a.filter(b)},inArray:function(a,b,c){return b?b.indexOf(a,c):-1},offset:function(a){a=a.getPosition();return{left:a.x,top:a.y}},extendWithEvents:function(a){a.addEvent||(a.nodeName?$(a):g(a,new Events))},addEvent:function(a,b,c){typeof b==="string"&&(b===
+"unload"&&(b="beforeunload"),e.HighchartsAdapter.extendWithEvents(a),a.addEvent(b,c))},removeEvent:function(a,b,c){typeof a!=="string"&&a.addEvent&&(b?(b==="unload"&&(b="beforeunload"),c?a.removeEvent(b,c):a.removeEvents&&a.removeEvents(b)):a.removeEvents())},fireEvent:function(a,b,c,d){b={type:b,target:a};b=j?new Event(b):new DOMEvent(b);b=g(b,c);if(!b.target&&b.event)b.target=b.event.target;b.preventDefault=function(){d=null};a.fireEvent&&a.fireEvent(b.type,b);d&&d(b)},washMouseEvent:function(a){if(a.page)a.pageX=
+a.page.x,a.pageY=a.page.y;return a},stop:function(a){a.fx&&a.fx.cancel()}}})();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/mootools-adapter.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/mootools-adapter.src.js
new file mode 100644
index 0000000..a310f0b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/mootools-adapter.src.js
@@ -0,0 +1,313 @@
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ * MooTools adapter
+ *
+ * (c) 2010-2013 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Fx, $, $extend, $each, $merge, Events, Event, DOMEvent */
+
+(function () {
+
+var win = window,
+	doc = document,
+	mooVersion = win.MooTools.version.substring(0, 3), // Get the first three characters of the version number
+	legacy = mooVersion === '1.2' || mooVersion === '1.1', // 1.1 && 1.2 considered legacy, 1.3 is not.
+	legacyEvent = legacy || mooVersion === '1.3', // In versions 1.1 - 1.3 the event class is named Event, in newer versions it is named DOMEvent.
+	$extend = win.$extend || function () {
+		return Object.append.apply(Object, arguments);
+	};
+
+win.HighchartsAdapter = {
+	/**
+	 * Initialize the adapter. This is run once as Highcharts is first run.
+	 * @param {Object} pathAnim The helper object to do animations across adapters.
+	 */
+	init: function (pathAnim) {
+		var fxProto = Fx.prototype,
+			fxStart = fxProto.start,
+			morphProto = Fx.Morph.prototype,
+			morphCompute = morphProto.compute;
+
+		// override Fx.start to allow animation of SVG element wrappers
+		/*jslint unparam: true*//* allow unused parameters in fx functions */
+		fxProto.start = function (from, to) {
+			var fx = this,
+				elem = fx.element;
+
+			// special for animating paths
+			if (from.d) {
+				//this.fromD = this.element.d.split(' ');
+				fx.paths = pathAnim.init(
+					elem,
+					elem.d,
+					fx.toD
+				);
+			}
+			fxStart.apply(fx, arguments);
+
+			return this; // chainable
+		};
+
+		// override Fx.step to allow animation of SVG element wrappers
+		morphProto.compute = function (from, to, delta) {
+			var fx = this,
+				paths = fx.paths;
+
+			if (paths) {
+				fx.element.attr(
+					'd',
+					pathAnim.step(paths[0], paths[1], delta, fx.toD)
+				);
+			} else {
+				return morphCompute.apply(fx, arguments);
+			}
+		};
+		/*jslint unparam: false*/
+	},
+	
+	/**
+	 * Run a general method on the framework, following jQuery syntax
+	 * @param {Object} el The HTML element
+	 * @param {String} method Which method to run on the wrapped element
+	 */
+	adapterRun: function (el, method) {
+		
+		// This currently works for getting inner width and height. If adding
+		// more methods later, we need a conditional implementation for each.
+		if (method === 'width' || method === 'height') {
+			return parseInt($(el).getStyle(method), 10);
+		}
+	},
+
+	/**
+	 * Downloads a script and executes a callback when done.
+	 * @param {String} scriptLocation
+	 * @param {Function} callback
+	 */
+	getScript: function (scriptLocation, callback) {
+		// We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script.
+		var head = doc.getElementsByTagName('head')[0];
+		var script = doc.createElement('script');
+
+		script.type = 'text/javascript';
+		script.src = scriptLocation;
+		script.onload = callback;
+
+		head.appendChild(script);
+	},
+
+	/**
+	 * Animate a HTML element or SVG element wrapper
+	 * @param {Object} el
+	 * @param {Object} params
+	 * @param {Object} options jQuery-like animation options: duration, easing, callback
+	 */
+	animate: function (el, params, options) {
+		var isSVGElement = el.attr,
+			effect,
+			complete = options && options.complete;
+
+		if (isSVGElement && !el.setStyle) {
+			// add setStyle and getStyle methods for internal use in Moo
+			el.getStyle = el.attr;
+			el.setStyle = function () { // property value is given as array in Moo - break it down
+				var args = arguments;
+				this.attr.call(this, args[0], args[1][0]);
+			};
+			// dirty hack to trick Moo into handling el as an element wrapper
+			el.$family = function () { return true; };
+		}
+
+		// stop running animations
+		win.HighchartsAdapter.stop(el);
+
+		// define and run the effect
+		effect = new Fx.Morph(
+			isSVGElement ? el : $(el),
+			$extend({
+				transition: Fx.Transitions.Quad.easeInOut
+			}, options)
+		);
+
+		// Make sure that the element reference is set when animating svg elements
+		if (isSVGElement) {
+			effect.element = el;
+		}
+
+		// special treatment for paths
+		if (params.d) {
+			effect.toD = params.d;
+		}
+
+		// jQuery-like events
+		if (complete) {
+			effect.addEvent('complete', complete);
+		}
+
+		// run
+		effect.start(params);
+
+		// record for use in stop method
+		el.fx = effect;
+	},
+
+	/**
+	 * MooTool's each function
+	 *
+	 */
+	each: function (arr, fn) {
+		return legacy ?
+			$each(arr, fn) :
+			Array.each(arr, fn);
+	},
+
+	/**
+	 * Map an array
+	 * @param {Array} arr
+	 * @param {Function} fn
+	 */
+	map: function (arr, fn) {
+		return arr.map(fn);
+	},
+
+	/**
+	 * Grep or filter an array
+	 * @param {Array} arr
+	 * @param {Function} fn
+	 */
+	grep: function (arr, fn) {
+		return arr.filter(fn);
+	},
+	
+	/**
+	 * Return the index of an item in an array, or -1 if not matched
+	 */
+	inArray: function (item, arr, from) {
+		return arr ? arr.indexOf(item, from) : -1;
+	},
+
+	/**
+	 * Get the offset of an element relative to the top left corner of the web page
+	 */
+	offset: function (el) {
+		var offsets = el.getPosition(); // #1496
+		return {
+			left: offsets.x,
+			top: offsets.y
+		};
+	},
+
+	/**
+	 * Extends an object with Events, if its not done
+	 */
+	extendWithEvents: function (el) {
+		// if the addEvent method is not defined, el is a custom Highcharts object
+		// like series or point
+		if (!el.addEvent) {
+			if (el.nodeName) {
+				el = $(el); // a dynamically generated node
+			} else {
+				$extend(el, new Events()); // a custom object
+			}
+		}
+	},
+
+	/**
+	 * Add an event listener
+	 * @param {Object} el HTML element or custom object
+	 * @param {String} type Event type
+	 * @param {Function} fn Event handler
+	 */
+	addEvent: function (el, type, fn) {
+		if (typeof type === 'string') { // chart broke due to el being string, type function
+
+			if (type === 'unload') { // Moo self destructs before custom unload events
+				type = 'beforeunload';
+			}
+
+			win.HighchartsAdapter.extendWithEvents(el);
+
+			el.addEvent(type, fn);
+		}
+	},
+
+	removeEvent: function (el, type, fn) {
+		if (typeof el === 'string') {
+			// el.removeEvents below apperantly calls this method again. Do not quite understand why, so for now just bail out.
+			return;
+		}
+		
+		if (el.addEvent) { // If el doesn't have an addEvent method, there are no events to remove
+			if (type) {
+				if (type === 'unload') { // Moo self destructs before custom unload events
+					type = 'beforeunload';
+				}
+	
+				if (fn) {
+					el.removeEvent(type, fn);
+				} else if (el.removeEvents) { // #958
+					el.removeEvents(type);
+				}
+			} else {
+				el.removeEvents();
+			}
+		}
+	},
+
+	fireEvent: function (el, event, eventArguments, defaultFunction) {
+		var eventArgs = {
+			type: event,
+			target: el
+		};
+		// create an event object that keeps all functions
+		event = legacyEvent ? new Event(eventArgs) : new DOMEvent(eventArgs);
+		event = $extend(event, eventArguments);
+
+		// When running an event on the Chart.prototype, MooTools nests the target in event.event
+		if (!event.target && event.event) {
+			event.target = event.event.target;
+		}
+
+		// override the preventDefault function to be able to use
+		// this for custom events
+		event.preventDefault = function () {
+			defaultFunction = null;
+		};
+		// if fireEvent is not available on the object, there hasn't been added
+		// any events to it above
+		if (el.fireEvent) {
+			el.fireEvent(event.type, event);
+		}
+
+		// fire the default if it is passed and it is not prevented above
+		if (defaultFunction) {
+			defaultFunction(event);
+		}
+	},
+	
+	/**
+	 * Set back e.pageX and e.pageY that MooTools has abstracted away. #1165, #1346.
+	 */
+	washMouseEvent: function (e) {
+		if (e.page) {
+			e.pageX = e.page.x;
+			e.pageY = e.page.y;
+		}
+		return e;
+	},
+
+	/**
+	 * Stop running animations on the object
+	 */
+	stop: function (el) {
+		if (el.fx) {
+			el.fx.cancel();
+		}
+	}
+};
+
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/prototype-adapter.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/prototype-adapter.js
new file mode 100644
index 0000000..8a57cca
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/prototype-adapter.js
@@ -0,0 +1,15 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+ Prototype adapter
+
+ @author Michael Nelson, Torstein Hønsi.
+
+ Feel free to use and modify this script.
+ Highcharts license: www.highcharts.com/license.
+*/
+var HighchartsAdapter=function(){var f=typeof Effect!=="undefined";return{init:function(a){if(f)Effect.HighchartsTransition=Class.create(Effect.Base,{initialize:function(b,c,d,g){var e;this.element=b;this.key=c;e=b.attr?b.attr(c):$(b).getStyle(c);if(c==="d")this.paths=a.init(b,b.d,d),this.toD=d,e=0,d=1;this.start(Object.extend(g||{},{from:e,to:d,attribute:c}))},setup:function(){HighchartsAdapter._extend(this.element);if(!this.element._highchart_animation)this.element._highchart_animation={};this.element._highchart_animation[this.key]=
+this},update:function(b){var c=this.paths,d=this.element;c&&(b=a.step(c[0],c[1],b,this.toD));d.attr?d.element&&d.attr(this.options.attribute,b):(c={},c[this.options.attribute]=b,$(d).setStyle(c))},finish:function(){this.element&&this.element._highchart_animation&&delete this.element._highchart_animation[this.key]}})},adapterRun:function(a,b){return parseInt($(a).getStyle(b),10)},getScript:function(a,b){var c=$$("head")[0];c&&c.appendChild((new Element("script",{type:"text/javascript",src:a})).observe("load",
+b))},addNS:function(a){var b=/^(?:click|mouse(?:down|up|over|move|out))$/;return/^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/.test(a)||b.test(a)?a:"h:"+a},addEvent:function(a,b,c){a.addEventListener||a.attachEvent?Event.observe($(a),HighchartsAdapter.addNS(b),c):(HighchartsAdapter._extend(a),a._highcharts_observe(b,c))},animate:function(a,b,c){var d,c=c||{};c.delay=0;c.duration=(c.duration||500)/1E3;c.afterFinish=c.complete;if(f)for(d in b)new Effect.HighchartsTransition($(a),
+d,b[d],c);else{if(a.attr)for(d in b)a.attr(d,b[d]);c.complete&&c.complete()}a.attr||$(a).setStyle(b)},stop:function(a){var b;if(a._highcharts_extended&&a._highchart_animation)for(b in a._highchart_animation)a._highchart_animation[b].cancel()},each:function(a,b){$A(a).each(b)},inArray:function(a,b,c){return b?b.indexOf(a,c):-1},offset:function(a){return $(a).cumulativeOffset()},fireEvent:function(a,b,c,d){a.fire?a.fire(HighchartsAdapter.addNS(b),c):a._highcharts_extended&&(c=c||{},a._highcharts_fire(b,
+c));c&&c.defaultPrevented&&(d=null);d&&d(c)},removeEvent:function(a,b,c){$(a).stopObserving&&(b&&(b=HighchartsAdapter.addNS(b)),$(a).stopObserving(b,c));window===a?Event.stopObserving(a,b,c):(HighchartsAdapter._extend(a),a._highcharts_stop_observing(b,c))},washMouseEvent:function(a){return a},grep:function(a,b){return a.findAll(b)},map:function(a,b){return a.map(b)},_extend:function(a){a._highcharts_extended||Object.extend(a,{_highchart_events:{},_highchart_animation:null,_highcharts_extended:!0,
+_highcharts_observe:function(b,a){this._highchart_events[b]=[this._highchart_events[b],a].compact().flatten()},_highcharts_stop_observing:function(b,a){b?a?this._highchart_events[b]=[this._highchart_events[b]].compact().flatten().without(a):delete this._highchart_events[b]:this._highchart_events={}},_highcharts_fire:function(a,c){var d=this;(this._highchart_events[a]||[]).each(function(a){if(!c.stopped)c.preventDefault=function(){c.defaultPrevented=!0},c.target=d,a.bind(this)(c)===!1&&c.preventDefault()}.bind(this))}})}}}();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/prototype-adapter.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/prototype-adapter.src.js
new file mode 100644
index 0000000..9c8529e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/prototype-adapter.src.js
@@ -0,0 +1,316 @@
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ * Prototype adapter
+ *
+ * @author Michael Nelson, Torstein Hønsi.
+ *
+ * Feel free to use and modify this script.
+ * Highcharts license: www.highcharts.com/license.
+ */
+
+// JSLint options:
+/*global Effect, Class, Event, Element, $, $$, $A */
+
+// Adapter interface between prototype and the Highcharts charting library
+var HighchartsAdapter = (function () {
+
+var hasEffect = typeof Effect !== 'undefined';
+
+return {
+
+	/**
+	 * Initialize the adapter. This is run once as Highcharts is first run.
+	 * @param {Object} pathAnim The helper object to do animations across adapters.
+	 */
+	init: function (pathAnim) {
+		if (hasEffect) {
+			/**
+			 * Animation for Highcharts SVG element wrappers only
+			 * @param {Object} element
+			 * @param {Object} attribute
+			 * @param {Object} to
+			 * @param {Object} options
+			 */
+			Effect.HighchartsTransition = Class.create(Effect.Base, {
+				initialize: function (element, attr, to, options) {
+					var from,
+						opts;
+
+					this.element = element;
+					this.key = attr;
+					from = element.attr ? element.attr(attr) : $(element).getStyle(attr);
+
+					// special treatment for paths
+					if (attr === 'd') {
+						this.paths = pathAnim.init(
+							element,
+							element.d,
+							to
+						);
+						this.toD = to;
+
+
+						// fake values in order to read relative position as a float in update
+						from = 0;
+						to = 1;
+					}
+
+					opts = Object.extend((options || {}), {
+						from: from,
+						to: to,
+						attribute: attr
+					});
+					this.start(opts);
+				},
+				setup: function () {
+					HighchartsAdapter._extend(this.element);
+					// If this is the first animation on this object, create the _highcharts_animation helper that
+					// contain pointers to the animation objects.
+					if (!this.element._highchart_animation) {
+						this.element._highchart_animation = {};
+					}
+
+					// Store a reference to this animation instance.
+					this.element._highchart_animation[this.key] = this;
+				},
+				update: function (position) {
+					var paths = this.paths,
+						element = this.element,
+						obj;
+
+					if (paths) {
+						position = pathAnim.step(paths[0], paths[1], position, this.toD);
+					}
+
+					if (element.attr) { // SVGElement
+						
+						if (element.element) { // If not, it has been destroyed (#1405)
+							element.attr(this.options.attribute, position);
+						}
+					
+					} else { // HTML, #409
+						obj = {};
+						obj[this.options.attribute] = position;
+						$(element).setStyle(obj);
+					}
+					
+				},
+				finish: function () {
+					// Delete the property that holds this animation now that it is finished.
+					// Both canceled animations and complete ones gets a 'finish' call.
+					if (this.element && this.element._highchart_animation) { // #1405
+						delete this.element._highchart_animation[this.key];
+					}
+				}
+			});
+		}
+	},
+	
+	/**
+	 * Run a general method on the framework, following jQuery syntax
+	 * @param {Object} el The HTML element
+	 * @param {String} method Which method to run on the wrapped element
+	 */
+	adapterRun: function (el, method) {
+		
+		// This currently works for getting inner width and height. If adding
+		// more methods later, we need a conditional implementation for each.
+		return parseInt($(el).getStyle(method), 10);
+		
+	},
+
+	/**
+	 * Downloads a script and executes a callback when done.
+	 * @param {String} scriptLocation
+	 * @param {Function} callback
+	 */
+	getScript: function (scriptLocation, callback) {
+		var head = $$('head')[0]; // Returns an array, so pick the first element.
+		if (head) {
+			// Append a new 'script' element, set its type and src attributes, add a 'load' handler that calls the callback
+			head.appendChild(new Element('script', { type: 'text/javascript', src: scriptLocation}).observe('load', callback));
+		}
+	},
+
+	/**
+	 * Custom events in prototype needs to be namespaced. This method adds a namespace 'h:' in front of
+	 * events that are not recognized as native.
+	 */
+	addNS: function (eventName) {
+		var HTMLEvents = /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,
+			MouseEvents = /^(?:click|mouse(?:down|up|over|move|out))$/;
+		return (HTMLEvents.test(eventName) || MouseEvents.test(eventName)) ?
+			eventName :
+			'h:' + eventName;
+	},
+
+	// el needs an event to be attached. el is not necessarily a dom element
+	addEvent: function (el, event, fn) {
+		if (el.addEventListener || el.attachEvent) {
+			Event.observe($(el), HighchartsAdapter.addNS(event), fn);
+
+		} else {
+			HighchartsAdapter._extend(el);
+			el._highcharts_observe(event, fn);
+		}
+	},
+
+	// motion makes things pretty. use it if effects is loaded, if not... still get to the end result.
+	animate: function (el, params, options) {
+		var key,
+			fx;
+
+		// default options
+		options = options || {};
+		options.delay = 0;
+		options.duration = (options.duration || 500) / 1000;
+		options.afterFinish = options.complete;
+
+		// animate wrappers and DOM elements
+		if (hasEffect) {
+			for (key in params) {
+				// The fx variable is seemingly thrown away here, but the Effect.setup will add itself to the _highcharts_animation object
+				// on the element itself so its not really lost.
+				fx = new Effect.HighchartsTransition($(el), key, params[key], options);
+			}
+		} else {
+			if (el.attr) { // #409 without effects
+				for (key in params) {
+					el.attr(key, params[key]);
+				}
+			}
+			if (options.complete) {
+				options.complete();
+			}
+		}
+
+		if (!el.attr) { // HTML element, #409
+			$(el).setStyle(params);
+		}
+	},
+
+	// this only occurs in higcharts 2.0+
+	stop: function (el) {
+		var key;
+		if (el._highcharts_extended && el._highchart_animation) {
+			for (key in el._highchart_animation) {
+				// Cancel the animation
+				// The 'finish' function in the Effect object will remove the reference
+				el._highchart_animation[key].cancel();
+			}
+		}
+	},
+
+	// um.. each
+	each: function (arr, fn) {
+		$A(arr).each(fn);
+	},
+	
+	inArray: function (item, arr, from) {
+		return arr ? arr.indexOf(item, from) : -1;
+	},
+
+	/**
+	 * Get the cumulative offset relative to the top left of the page. This method, unlike its
+	 * jQuery and MooTools counterpart, still suffers from issue #208 regarding the position
+	 * of a chart within a fixed container.
+	 */
+	offset: function (el) {
+		return $(el).cumulativeOffset();
+	},
+
+	// fire an event based on an event name (event) and an object (el).
+	// again, el may not be a dom element
+	fireEvent: function (el, event, eventArguments, defaultFunction) {
+		if (el.fire) {
+			el.fire(HighchartsAdapter.addNS(event), eventArguments);
+		} else if (el._highcharts_extended) {
+			eventArguments = eventArguments || {};
+			el._highcharts_fire(event, eventArguments);
+		}
+
+		if (eventArguments && eventArguments.defaultPrevented) {
+			defaultFunction = null;
+		}
+
+		if (defaultFunction) {
+			defaultFunction(eventArguments);
+		}
+	},
+
+	removeEvent: function (el, event, handler) {
+		if ($(el).stopObserving) {
+			if (event) {
+				event = HighchartsAdapter.addNS(event);
+			}
+			$(el).stopObserving(event, handler);
+		} if (window === el) {
+			Event.stopObserving(el, event, handler);
+		} else {
+			HighchartsAdapter._extend(el);
+			el._highcharts_stop_observing(event, handler);
+		}
+	},
+	
+	washMouseEvent: function (e) {
+		return e;
+	},
+
+	// um, grep
+	grep: function (arr, fn) {
+		return arr.findAll(fn);
+	},
+
+	// um, map
+	map: function (arr, fn) {
+		return arr.map(fn);
+	},
+
+	// extend an object to handle highchart events (highchart objects, not svg elements).
+	// this is a very simple way of handling events but whatever, it works (i think)
+	_extend: function (object) {
+		if (!object._highcharts_extended) {
+			Object.extend(object, {
+				_highchart_events: {},
+				_highchart_animation: null,
+				_highcharts_extended: true,
+				_highcharts_observe: function (name, fn) {
+					this._highchart_events[name] = [this._highchart_events[name], fn].compact().flatten();
+				},
+				_highcharts_stop_observing: function (name, fn) {
+					if (name) {
+						if (fn) {
+							this._highchart_events[name] = [this._highchart_events[name]].compact().flatten().without(fn);
+						} else {
+							delete this._highchart_events[name];
+						}
+					} else {
+						this._highchart_events = {};
+					}
+				},
+				_highcharts_fire: function (name, args) {
+					var target = this;
+					(this._highchart_events[name] || []).each(function (fn) {
+						// args is never null here
+						if (args.stopped) {
+							return; // "throw $break" wasn't working. i think because of the scope of 'this'.
+						}
+
+						// Attach a simple preventDefault function to skip default handler if called
+						args.preventDefault = function () {
+							args.defaultPrevented = true;
+						};
+						args.target = target;
+
+						// If the event handler return false, prevent the default handler from executing
+						if (fn.bind(this)(args) === false) {
+							args.preventDefault();
+						}
+					}
+.bind(this));
+				}
+			});
+		}
+	}
+};
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/standalone-framework.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/standalone-framework.js
new file mode 100644
index 0000000..70a92db
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/standalone-framework.js
@@ -0,0 +1,17 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+
+ Standalone Highcharts Framework
+
+ License: MIT License
+*/
+var HighchartsAdapter=function(){function o(c){function a(a,b,d){a.removeEventListener(b,d,!1)}function d(a,b,d){d=a.HCProxiedMethods[d.toString()];a.detachEvent("on"+b,d)}function b(b,c){var f=b.HCEvents,i,g,k,j;if(b.removeEventListener)i=a;else if(b.attachEvent)i=d;else return;c?(g={},g[c]=!0):g=f;for(j in g)if(f[j])for(k=f[j].length;k--;)i(b,j,f[j][k])}c.HCExtended||Highcharts.extend(c,{HCExtended:!0,HCEvents:{},bind:function(b,a){var d=this,c=this.HCEvents,g;if(d.addEventListener)d.addEventListener(b,
+a,!1);else if(d.attachEvent){g=function(b){a.call(d,b)};if(!d.HCProxiedMethods)d.HCProxiedMethods={};d.HCProxiedMethods[a.toString()]=g;d.attachEvent("on"+b,g)}c[b]===r&&(c[b]=[]);c[b].push(a)},unbind:function(c,h){var f,i;c?(f=this.HCEvents[c]||[],h?(i=HighchartsAdapter.inArray(h,f),i>-1&&(f.splice(i,1),this.HCEvents[c]=f),this.removeEventListener?a(this,c,h):this.attachEvent&&d(this,c,h)):(b(this,c),this.HCEvents[c]=[])):(b(this),this.HCEvents={})},trigger:function(b,a){var d=this.HCEvents[b]||
+[],c=d.length,g,k,j;k=function(){a.defaultPrevented=!0};for(g=0;g<c;g++){j=d[g];if(a.stopped)break;a.preventDefault=k;a.target=this;a.type=b;j.call(this,a)===!1&&a.preventDefault()}}});return c}var r,l=document,p=[],m=[],q,n;Math.easeInOutSine=function(c,a,d,b){return-d/2*(Math.cos(Math.PI*c/b)-1)+a};return{init:function(c){if(!l.defaultView)this._getStyle=function(a,d){var b;return a.style[d]?a.style[d]:(d==="opacity"&&(d="filter"),b=a.currentStyle[d.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()})],
+d==="filter"&&(b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(b,a){return a/100})),b===""?1:b)},this.adapterRun=function(a,d){var b={width:"clientWidth",height:"clientHeight"}[d];if(b)return a.style.zoom=1,a[b]-2*parseInt(HighchartsAdapter._getStyle(a,"padding"),10)};if(!Array.prototype.forEach)this.each=function(a,d){for(var b=0,c=a.length;b<c;b++)if(d.call(a[b],a[b],b,a)===!1)return b};if(!Array.prototype.indexOf)this.inArray=function(a,d){var b,c=0;if(d)for(b=d.length;c<b;c++)if(d[c]===a)return c;
+return-1};if(!Array.prototype.filter)this.grep=function(a,d){for(var b=[],c=0,h=a.length;c<h;c++)d(a[c],c)&&b.push(a[c]);return b};n=function(a,c,b){this.options=c;this.elem=a;this.prop=b};n.prototype={update:function(){var a;a=this.paths;var d=this.elem,b=d.element;a&&b?d.attr("d",c.step(a[0],a[1],this.now,this.toD)):d.attr?b&&d.attr(this.prop,this.now):(a={},a[d]=this.now+this.unit,Highcharts.css(d,a));this.options.step&&this.options.step.call(this.elem,this.now,this)},custom:function(a,c,b){var e=
+this,h=function(a){return e.step(a)},f;this.startTime=+new Date;this.start=a;this.end=c;this.unit=b;this.now=this.start;this.pos=this.state=0;h.elem=this.elem;h()&&m.push(h)===1&&(q=setInterval(function(){for(f=0;f<m.length;f++)m[f]()||m.splice(f--,1);m.length||clearInterval(q)},13))},step:function(a){var c=+new Date,b;b=this.options;var e;if(this.elem.stopAnimation)b=!1;else if(a||c>=b.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();a=this.options.curAnim[this.prop]=
+!0;for(e in b.curAnim)b.curAnim[e]!==!0&&(a=!1);a&&b.complete&&b.complete.call(this.elem);b=!1}else e=c-this.startTime,this.state=e/b.duration,this.pos=b.easing(e,0,1,b.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update(),b=!0;return b}};this.animate=function(a,d,b){var e,h="",f,i,g;a.stopAnimation=!1;if(typeof b!=="object"||b===null)e=arguments,b={duration:e[2],easing:e[3],complete:e[4]};if(typeof b.duration!=="number")b.duration=400;b.easing=Math[b.easing]||Math.easeInOutSine;
+b.curAnim=Highcharts.extend({},d);for(g in d)i=new n(a,b,g),f=null,g==="d"?(i.paths=c.init(a,a.d,d.d),i.toD=d.d,e=0,f=1):a.attr?e=a.attr(g):(e=parseFloat(HighchartsAdapter._getStyle(a,g))||0,g!=="opacity"&&(h="px")),f||(f=parseFloat(d[g])),i.custom(e,f,h)}},_getStyle:function(c,a){return window.getComputedStyle(c).getPropertyValue(a)},getScript:function(c,a){var d=l.getElementsByTagName("head")[0],b=l.createElement("script");b.type="text/javascript";b.src=c;b.onload=a;d.appendChild(b)},inArray:function(c,
+a){return a.indexOf?a.indexOf(c):p.indexOf.call(a,c)},adapterRun:function(c,a){return parseInt(HighchartsAdapter._getStyle(c,a),10)},grep:function(c,a){return p.filter.call(c,a)},map:function(c,a){for(var d=[],b=0,e=c.length;b<e;b++)d[b]=a.call(c[b],c[b],b,c);return d},offset:function(c){for(var a=0,d=0;c;)a+=c.offsetLeft,d+=c.offsetTop,c=c.offsetParent;return{left:a,top:d}},addEvent:function(c,a,d){o(c).bind(a,d)},removeEvent:function(c,a,d){o(c).unbind(a,d)},fireEvent:function(c,a,d,b){var e;l.createEvent&&
+(c.dispatchEvent||c.fireEvent)?(e=l.createEvent("Events"),e.initEvent(a,!0,!0),e.target=c,Highcharts.extend(e,d),c.dispatchEvent?c.dispatchEvent(e):c.fireEvent(a,e)):c.HCExtended===!0&&(d=d||{},c.trigger(a,d));d&&d.defaultPrevented&&(b=null);b&&b(d)},washMouseEvent:function(c){return c},stop:function(c){c.stopAnimation=!0},each:function(c,a){return Array.prototype.forEach.call(c,a)}}}();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/standalone-framework.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/standalone-framework.src.js
new file mode 100644
index 0000000..8e9831d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/adapters/standalone-framework.src.js
@@ -0,0 +1,583 @@
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ *
+ * Standalone Highcharts Framework
+ *
+ * License: MIT License
+ */
+
+
+/*global Highcharts */
+var HighchartsAdapter = (function () {
+
+var UNDEFINED,
+	doc = document,
+	emptyArray = [],
+	timers = [],
+	timerId,
+	Fx;
+
+Math.easeInOutSine = function (t, b, c, d) {
+	return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
+};
+
+
+
+/**
+ * Extend given object with custom events
+ */
+function augment(obj) {
+	function removeOneEvent(el, type, fn) {
+		el.removeEventListener(type, fn, false);
+	}
+
+	function IERemoveOneEvent(el, type, fn) {
+		fn = el.HCProxiedMethods[fn.toString()];
+		el.detachEvent('on' + type, fn);
+	}
+
+	function removeAllEvents(el, type) {
+		var events = el.HCEvents,
+			remove,
+			types,
+			len,
+			n;
+
+		if (el.removeEventListener) {
+			remove = removeOneEvent;
+		} else if (el.attachEvent) {
+			remove = IERemoveOneEvent;
+		} else {
+			return; // break on non-DOM events
+		}
+
+
+		if (type) {
+			types = {};
+			types[type] = true;
+		} else {
+			types = events;
+		}
+
+		for (n in types) {
+			if (events[n]) {
+				len = events[n].length;
+				while (len--) {
+					remove(el, n, events[n][len]);
+				}
+			}
+		}
+	}
+
+	if (!obj.HCExtended) {
+		Highcharts.extend(obj, {
+			HCExtended: true,
+
+			HCEvents: {},
+
+			bind: function (name, fn) {
+				var el = this,
+					events = this.HCEvents,
+					wrappedFn;
+
+				// handle DOM events in modern browsers
+				if (el.addEventListener) {
+					el.addEventListener(name, fn, false);
+
+				// handle old IE implementation
+				} else if (el.attachEvent) {
+					
+					wrappedFn = function (e) {
+						fn.call(el, e);
+					};
+
+					if (!el.HCProxiedMethods) {
+						el.HCProxiedMethods = {};
+					}
+
+					// link wrapped fn with original fn, so we can get this in removeEvent
+					el.HCProxiedMethods[fn.toString()] = wrappedFn;
+
+					el.attachEvent('on' + name, wrappedFn);
+				}
+
+
+				if (events[name] === UNDEFINED) {
+					events[name] = [];
+				}
+
+				events[name].push(fn);
+			},
+
+			unbind: function (name, fn) {
+				var events,
+					index;
+
+				if (name) {
+					events = this.HCEvents[name] || [];
+					if (fn) {
+						index = HighchartsAdapter.inArray(fn, events);
+						if (index > -1) {
+							events.splice(index, 1);
+							this.HCEvents[name] = events;
+						}
+						if (this.removeEventListener) {
+							removeOneEvent(this, name, fn);
+						} else if (this.attachEvent) {
+							IERemoveOneEvent(this, name, fn);
+						}
+					} else {
+						removeAllEvents(this, name);
+						this.HCEvents[name] = [];
+					}
+				} else {
+					removeAllEvents(this);
+					this.HCEvents = {};
+				}
+			},
+
+			trigger: function (name, args) {
+				var events = this.HCEvents[name] || [],
+					target = this,
+					len = events.length,
+					i,
+					preventDefault,
+					fn;
+
+				// Attach a simple preventDefault function to skip default handler if called
+				preventDefault = function () {
+					args.defaultPrevented = true;
+				};
+				
+				for (i = 0; i < len; i++) {
+					fn = events[i];
+
+					// args is never null here
+					if (args.stopped) {
+						return;
+					}
+
+					args.preventDefault = preventDefault;
+					args.target = target;
+					args.type = name; // #2297	
+					
+					// If the event handler return false, prevent the default handler from executing
+					if (fn.call(this, args) === false) {
+						args.preventDefault();
+					}
+				}
+			}
+		});
+	}
+
+	return obj;
+}
+
+
+return {
+	/**
+	 * Initialize the adapter. This is run once as Highcharts is first run.
+	 */
+	init: function (pathAnim) {
+
+		/**
+		 * Compatibility section to add support for legacy IE. This can be removed if old IE 
+		 * support is not needed.
+		 */
+		if (!doc.defaultView) {
+			this._getStyle = function (el, prop) {
+				var val;
+				if (el.style[prop]) {
+					return el.style[prop];
+				} else {
+					if (prop === 'opacity') {
+						prop = 'filter';
+					}
+					/*jslint unparam: true*/
+					val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b) { return b.toUpperCase(); })];
+					if (prop === 'filter') {
+						val = val.replace(
+							/alpha\(opacity=([0-9]+)\)/, 
+							function (a, b) { 
+								return b / 100; 
+							}
+						);
+					}
+					/*jslint unparam: false*/
+					return val === '' ? 1 : val;
+				} 
+			};
+			this.adapterRun = function (elem, method) {
+				var alias = { width: 'clientWidth', height: 'clientHeight' }[method];
+
+				if (alias) {
+					elem.style.zoom = 1;
+					return elem[alias] - 2 * parseInt(HighchartsAdapter._getStyle(elem, 'padding'), 10);
+				}
+			};
+		}
+
+		if (!Array.prototype.forEach) {
+			this.each = function (arr, fn) { // legacy
+				var i = 0, 
+					len = arr.length;
+				for (; i < len; i++) {
+					if (fn.call(arr[i], arr[i], i, arr) === false) {
+						return i;
+					}
+				}
+			};
+		}
+
+		if (!Array.prototype.indexOf) {
+			this.inArray = function (item, arr) {
+				var len, 
+					i = 0;
+
+				if (arr) {
+					len = arr.length;
+					
+					for (; i < len; i++) {
+						if (arr[i] === item) {
+							return i;
+						}
+					}
+				}
+
+				return -1;
+			};
+		}
+
+		if (!Array.prototype.filter) {
+			this.grep = function (elements, callback) {
+				var ret = [],
+					i = 0,
+					length = elements.length;
+
+				for (; i < length; i++) {
+					if (!!callback(elements[i], i)) {
+						ret.push(elements[i]);
+					}
+				}
+
+				return ret;
+			};
+		}
+
+		//--- End compatibility section ---
+
+
+		/**
+		 * Start of animation specific code
+		 */
+		Fx = function (elem, options, prop) {
+			this.options = options;
+			this.elem = elem;
+			this.prop = prop;
+		};
+		Fx.prototype = {
+			
+			update: function () {
+				var styles,
+					paths = this.paths,
+					elem = this.elem,
+					elemelem = elem.element; // if destroyed, it is null
+
+				// Animating a path definition on SVGElement
+				if (paths && elemelem) {
+					elem.attr('d', pathAnim.step(paths[0], paths[1], this.now, this.toD));
+				
+				// Other animations on SVGElement
+				} else if (elem.attr) {
+					if (elemelem) {
+						elem.attr(this.prop, this.now);
+					}
+
+				// HTML styles
+				} else {
+					styles = {};
+					styles[elem] = this.now + this.unit;
+					Highcharts.css(elem, styles);
+				}
+				
+				if (this.options.step) {
+					this.options.step.call(this.elem, this.now, this);
+				}
+
+			},
+			custom: function (from, to, unit) {
+				var self = this,
+					t = function (gotoEnd) {
+						return self.step(gotoEnd);
+					},
+					i;
+
+				this.startTime = +new Date();
+				this.start = from;
+				this.end = to;
+				this.unit = unit;
+				this.now = this.start;
+				this.pos = this.state = 0;
+
+				t.elem = this.elem;
+
+				if (t() && timers.push(t) === 1) {
+					timerId = setInterval(function () {
+						
+						for (i = 0; i < timers.length; i++) {
+							if (!timers[i]()) {
+								timers.splice(i--, 1);
+							}
+						}
+
+						if (!timers.length) {
+							clearInterval(timerId);
+						}
+					}, 13);
+				}
+			},
+			
+			step: function (gotoEnd) {
+				var t = +new Date(),
+					ret,
+					done,
+					options = this.options,
+					i;
+
+				if (this.elem.stopAnimation) {
+					ret = false;
+
+				} else if (gotoEnd || t >= options.duration + this.startTime) {
+					this.now = this.end;
+					this.pos = this.state = 1;
+					this.update();
+
+					this.options.curAnim[this.prop] = true;
+
+					done = true;
+					for (i in options.curAnim) {
+						if (options.curAnim[i] !== true) {
+							done = false;
+						}
+					}
+
+					if (done) {
+						if (options.complete) {
+							options.complete.call(this.elem);
+						}
+					}
+					ret = false;
+
+				} else {
+					var n = t - this.startTime;
+					this.state = n / options.duration;
+					this.pos = options.easing(n, 0, 1, options.duration);
+					this.now = this.start + ((this.end - this.start) * this.pos);
+					this.update();
+					ret = true;
+				}
+				return ret;
+			}
+		};
+
+		/**
+		 * The adapter animate method
+		 */
+		this.animate = function (el, prop, opt) {
+			var start,
+				unit = '',
+				end,
+				fx,
+				args,
+				name;
+
+			el.stopAnimation = false; // ready for new
+
+			if (typeof opt !== 'object' || opt === null) {
+				args = arguments;
+				opt = {
+					duration: args[2],
+					easing: args[3],
+					complete: args[4]
+				};
+			}
+			if (typeof opt.duration !== 'number') {
+				opt.duration = 400;
+			}
+			opt.easing = Math[opt.easing] || Math.easeInOutSine;
+			opt.curAnim = Highcharts.extend({}, prop);
+			
+			for (name in prop) {
+				fx = new Fx(el, opt, name);
+				end = null;
+				
+				if (name === 'd') {
+					fx.paths = pathAnim.init(
+						el,
+						el.d,
+						prop.d
+					);
+					fx.toD = prop.d;
+					start = 0;
+					end = 1;
+				} else if (el.attr) {
+					start = el.attr(name);
+				} else {
+					start = parseFloat(HighchartsAdapter._getStyle(el, name)) || 0;
+					if (name !== 'opacity') {
+						unit = 'px';
+					}
+				}
+	
+				if (!end) {
+					end = parseFloat(prop[name]);
+				}
+				fx.custom(start, end, unit);
+			}	
+		};
+	},
+
+	/**
+	 * Internal method to return CSS value for given element and property
+	 */
+	_getStyle: function (el, prop) {
+		return window.getComputedStyle(el).getPropertyValue(prop);
+	},
+
+	/**
+	 * Downloads a script and executes a callback when done.
+	 * @param {String} scriptLocation
+	 * @param {Function} callback
+	 */
+	getScript: function (scriptLocation, callback) {
+		// We cannot assume that Assets class from mootools-more is available so instead insert a script tag to download script.
+		var head = doc.getElementsByTagName('head')[0],
+			script = doc.createElement('script');
+
+		script.type = 'text/javascript';
+		script.src = scriptLocation;
+		script.onload = callback;
+
+		head.appendChild(script);
+	},
+
+	/**
+	 * Return the index of an item in an array, or -1 if not found
+	 */
+	inArray: function (item, arr) {
+		return arr.indexOf ? arr.indexOf(item) : emptyArray.indexOf.call(arr, item);
+	},
+
+
+	/**
+	 * A direct link to adapter methods
+	 */
+	adapterRun: function (elem, method) {
+		return parseInt(HighchartsAdapter._getStyle(elem, method), 10);
+	},
+
+	/**
+	 * Filter an array
+	 */
+	grep: function (elements, callback) {
+		return emptyArray.filter.call(elements, callback);
+	},
+
+	/**
+	 * Map an array
+	 */
+	map: function (arr, fn) {
+		var results = [], i = 0, len = arr.length;
+
+		for (; i < len; i++) {
+			results[i] = fn.call(arr[i], arr[i], i, arr);
+		}
+
+		return results;
+	},
+
+	offset: function (el) {
+		var left = 0,
+			top = 0;
+
+		while (el) {
+			left += el.offsetLeft;
+			top += el.offsetTop;
+			el = el.offsetParent;
+		}
+
+		return {
+			left: left,
+			top: top
+		};
+	},
+
+	/**
+	 * Add an event listener
+	 */
+	addEvent: function (el, type, fn) {
+		augment(el).bind(type, fn);
+	},
+
+	/**
+	 * Remove event added with addEvent
+	 */
+	removeEvent: function (el, type, fn) {
+		augment(el).unbind(type, fn);
+	},
+
+	/**
+	 * Fire an event on a custom object
+	 */
+	fireEvent: function (el, type, eventArguments, defaultFunction) {
+		var e;
+
+		if (doc.createEvent && (el.dispatchEvent || el.fireEvent)) {
+			e = doc.createEvent('Events');
+			e.initEvent(type, true, true);
+			e.target = el;
+
+			Highcharts.extend(e, eventArguments);
+
+			if (el.dispatchEvent) {
+				el.dispatchEvent(e);
+			} else {
+				el.fireEvent(type, e);
+			}
+
+		} else if (el.HCExtended === true) {
+			eventArguments = eventArguments || {};
+			el.trigger(type, eventArguments);
+		}
+
+		if (eventArguments && eventArguments.defaultPrevented) {
+			defaultFunction = null;
+		}
+
+		if (defaultFunction) {
+			defaultFunction(eventArguments);
+		}
+	},
+
+	washMouseEvent: function (e) {
+		return e;
+	},
+
+
+	/**
+	 * Stop running animation
+	 */
+	stop: function (el) {
+		el.stopAnimation = true;
+	},
+
+	/**
+	 * Utility for iterating over an array. Parameters are reversed compared to jQuery.
+	 * @param {Array} arr
+	 * @param {Function} fn
+	 */
+	each: function (arr, fn) { // modern browsers
+		return Array.prototype.forEach.call(arr, fn);
+	}
+};
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts-more.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts-more.js
new file mode 100644
index 0000000..85af9f5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts-more.js
@@ -0,0 +1,50 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+
+ (c) 2009-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(j,C){function J(a,b,c){this.init.call(this,a,b,c)}function K(a,b,c){a.call(this,b,c);if(this.chart.polar)this.closeSegment=function(a){var c=this.xAxis.center;a.push("L",c[0],c[1])},this.closedStacks=!0}function L(a,b){var c=this.chart,d=this.options.animation,g=this.group,f=this.markerGroup,e=this.xAxis.center,i=c.plotLeft,n=c.plotTop;if(c.polar){if(c.renderer.isSVG)if(d===!0&&(d={}),b){if(c={translateX:e[0]+i,translateY:e[1]+n,scaleX:0.001,scaleY:0.001},g.attr(c),f)f.attrSetters=g.attrSetters,
+f.attr(c)}else c={translateX:i,translateY:n,scaleX:1,scaleY:1},g.animate(c,d),f&&f.animate(c,d),this.animate=null}else a.call(this,b)}var P=j.arrayMin,Q=j.arrayMax,s=j.each,F=j.extend,p=j.merge,R=j.map,r=j.pick,v=j.pInt,m=j.getOptions().plotOptions,h=j.seriesTypes,x=j.extendClass,M=j.splat,o=j.wrap,N=j.Axis,u=j.Tick,z=j.Series,q=h.column.prototype,t=Math,D=t.round,A=t.floor,S=t.max,w=function(){};F(J.prototype,{init:function(a,b,c){var d=this,g=d.defaultOptions;d.chart=b;if(b.angular)g.background=
+{};d.options=a=p(g,a);(a=a.background)&&s([].concat(M(a)).reverse(),function(a){var b=a.backgroundColor,a=p(d.defaultBackgroundOptions,a);if(b)a.backgroundColor=b;a.color=a.backgroundColor;c.options.plotBands.unshift(a)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{shape:"circle",borderWidth:1,borderColor:"silver",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#FFF"],[1,"#DDD"]]},from:Number.MIN_VALUE,innerRadius:0,to:Number.MAX_VALUE,
+outerRadius:"105%"}});var G=N.prototype,u=u.prototype,T={getOffset:w,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:w,setCategories:w,setTitle:w},O={isRadial:!0,defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,plotBands:[],tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,
+distance:15,x:0,y:null},maxPadding:0,minPadding:0,plotBands:[],showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},plotBands:[],showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){this.options=p(this.defaultOptions,this.defaultRadialOptions,a)},getOffset:function(){G.getOffset.call(this);this.chart.axisOffset[this.side]=0},getLinePath:function(a,b){var c=this.center,b=r(b,c[2]/2-this.offset);return this.chart.renderer.symbols.arc(this.left+
+c[0],this.top+c[1],b,b,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0})},setAxisTranslation:function(){G.setAxisTranslation.call(this);if(this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.isXAxis))this.minPixelPadding=this.transA*this.minPointOffset+(this.reversed?(this.endAngleRad-this.startAngleRad)/4:0)},beforeSetTickPositions:function(){this.autoConnect&&(this.max+=this.categories&&
+1||this.pointRange||this.closestPointRange||0)},setAxisSize:function(){G.setAxisSize.call(this);if(this.isRadial)this.center=this.pane.center=h.pie.prototype.getCenter.call(this.pane),this.len=this.width=this.height=this.isCircular?this.center[2]*(this.endAngleRad-this.startAngleRad)/2:this.center[2]/2},getPosition:function(a,b){if(!this.isCircular)b=this.translate(a),a=this.min;return this.postTranslate(this.translate(a),r(b,this.center[2]/2)-this.offset)},postTranslate:function(a,b){var c=this.chart,
+d=this.center,a=this.startAngleRad+a;return{x:c.plotLeft+d[0]+Math.cos(a)*b,y:c.plotTop+d[1]+Math.sin(a)*b}},getPlotBandPath:function(a,b,c){var d=this.center,g=this.startAngleRad,f=d[2]/2,e=[r(c.outerRadius,"100%"),c.innerRadius,r(c.thickness,10)],i=/%$/,n,l=this.isCircular;this.options.gridLineInterpolation==="polygon"?d=this.getPlotLinePath(a).concat(this.getPlotLinePath(b,!0)):(l||(e[0]=this.translate(a),e[1]=this.translate(b)),e=R(e,function(a){i.test(a)&&(a=v(a,10)*f/100);return a}),c.shape===
+"circle"||!l?(a=-Math.PI/2,b=Math.PI*1.5,n=!0):(a=g+this.translate(a),b=g+this.translate(b)),d=this.chart.renderer.symbols.arc(this.left+d[0],this.top+d[1],e[0],e[0],{start:a,end:b,innerR:r(e[1],e[0]-e[2]),open:n}));return d},getPlotLinePath:function(a,b){var c=this.center,d=this.chart,g=this.getPosition(a),f,e,i;this.isCircular?i=["M",c[0]+d.plotLeft,c[1]+d.plotTop,"L",g.x,g.y]:this.options.gridLineInterpolation==="circle"?(a=this.translate(a))&&(i=this.getLinePath(0,a)):(f=d.xAxis[0],i=[],a=this.translate(a),
+c=f.tickPositions,f.autoConnect&&(c=c.concat([c[0]])),b&&(c=[].concat(c).reverse()),s(c,function(c,b){e=f.getPosition(c,a);i.push(b?"L":"M",e.x,e.y)}));return i},getTitlePosition:function(){var a=this.center,b=this.chart,c=this.options.title;return{x:b.plotLeft+a[0]+(c.x||0),y:b.plotTop+a[1]-{high:0.5,middle:0.25,low:0}[c.align]*a[2]+(c.y||0)}}};o(G,"init",function(a,b,c){var k;var d=b.angular,g=b.polar,f=c.isX,e=d&&f,i,n;n=b.options;var l=c.pane||0;if(d){if(F(this,e?T:O),i=!f)this.defaultRadialOptions=
+this.defaultRadialGaugeOptions}else if(g)F(this,O),this.defaultRadialOptions=(i=f)?this.defaultRadialXOptions:p(this.defaultYAxisOptions,this.defaultRadialYOptions);a.call(this,b,c);if(!e&&(d||g)){a=this.options;if(!b.panes)b.panes=[];this.pane=(k=b.panes[l]=b.panes[l]||new J(M(n.pane)[l],b,this),l=k);l=l.options;b.inverted=!1;n.chart.zoomType=null;this.startAngleRad=b=(l.startAngle-90)*Math.PI/180;this.endAngleRad=n=(r(l.endAngle,l.startAngle+360)-90)*Math.PI/180;this.offset=a.offset||0;if((this.isCircular=
+i)&&c.max===C&&n-b===2*Math.PI)this.autoConnect=!0}});o(u,"getPosition",function(a,b,c,d,g){var f=this.axis;return f.getPosition?f.getPosition(c):a.call(this,b,c,d,g)});o(u,"getLabelPosition",function(a,b,c,d,g,f,e,i,n){var l=this.axis,k=f.y,h=f.align,j=(l.translate(this.pos)+l.startAngleRad+Math.PI/2)/Math.PI*180%360;l.isRadial?(a=l.getPosition(this.pos,l.center[2]/2+r(f.distance,-25)),f.rotation==="auto"?d.attr({rotation:j}):k===null&&(k=v(d.styles.lineHeight)*0.9-d.getBBox().height/2),h===null&&
+(h=l.isCircular?j>20&&j<160?"left":j>200&&j<340?"right":"center":"center",d.attr({align:h})),a.x+=f.x,a.y+=k):a=a.call(this,b,c,d,g,f,e,i,n);return a});o(u,"getMarkPath",function(a,b,c,d,g,f,e){var i=this.axis;i.isRadial?(a=i.getPosition(this.pos,i.center[2]/2+d),b=["M",b,c,"L",a.x,a.y]):b=a.call(this,b,c,d,g,f,e);return b});m.arearange=p(m.area,{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'<span style="color:{series.color}">{series.name}</span>: <b>{point.low}</b> - <b>{point.high}</b><br/>'},
+trackByArea:!0,dataLabels:{verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0}});h.arearange=j.extendClass(h.area,{type:"arearange",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",getSegments:function(){var a=this;s(a.points,function(b){if(!a.options.connectNulls&&(b.low===null||b.high===null))b.y=null;else if(b.low===null&&b.high!==null)b.y=b.high});z.prototype.getSegments.call(this)},translate:function(){var a=this.yAxis;h.area.prototype.translate.apply(this);
+s(this.points,function(b){var c=b.low,d=b.high,g=b.plotY;d===null&&c===null?b.y=null:c===null?(b.plotLow=b.plotY=null,b.plotHigh=a.translate(d,0,1,0,1)):d===null?(b.plotLow=g,b.plotHigh=null):(b.plotLow=g,b.plotHigh=a.translate(d,0,1,0,1))})},getSegmentPath:function(a){var b,c=[],d=a.length,g=z.prototype.getSegmentPath,f,e;e=this.options;var i=e.step;for(b=HighchartsAdapter.grep(a,function(a){return a.plotLow!==null});d--;)f=a[d],f.plotHigh!==null&&c.push({plotX:f.plotX,plotY:f.plotHigh});a=g.call(this,
+b);if(i)i===!0&&(i="left"),e.step={left:"right",center:"center",right:"left"}[i];c=g.call(this,c);e.step=i;e=[].concat(a,c);c[0]="L";this.areaPath=this.areaPath.concat(a,c);return e},drawDataLabels:function(){var a=this.data,b=a.length,c,d=[],g=z.prototype,f=this.options.dataLabels,e,i=this.chart.inverted;if(f.enabled||this._hasPointLabels){for(c=b;c--;)e=a[c],e.y=e.high,e.plotY=e.plotHigh,d[c]=e.dataLabel,e.dataLabel=e.dataLabelUpper,e.below=!1,i?(f.align="left",f.x=f.xHigh):f.y=f.yHigh;g.drawDataLabels.apply(this,
+arguments);for(c=b;c--;)e=a[c],e.dataLabelUpper=e.dataLabel,e.dataLabel=d[c],e.y=e.low,e.plotY=e.plotLow,e.below=!0,i?(f.align="right",f.x=f.xLow):f.y=f.yLow;g.drawDataLabels.apply(this,arguments)}},alignDataLabel:h.column.prototype.alignDataLabel,getSymbol:h.column.prototype.getSymbol,drawPoints:w});m.areasplinerange=p(m.arearange);h.areasplinerange=x(h.arearange,{type:"areasplinerange",getPointSpline:h.spline.prototype.getPointSpline});m.columnrange=p(m.column,m.arearange,{lineWidth:1,pointRange:null});
+h.columnrange=x(h.arearange,{type:"columnrange",translate:function(){var a=this,b=a.yAxis,c;q.translate.apply(a);s(a.points,function(d){var g=d.shapeArgs,f=a.options.minPointLength,e;d.plotHigh=c=b.translate(d.high,0,1,0,1);d.plotLow=d.plotY;e=c;d=d.plotY-c;d<f&&(f-=d,d+=f,e-=f/2);g.height=d;g.y=e})},trackerGroups:["group","dataLabels"],drawGraph:w,pointAttrToOptions:q.pointAttrToOptions,drawPoints:q.drawPoints,drawTracker:q.drawTracker,animate:q.animate,getColumnMetrics:q.getColumnMetrics});m.gauge=
+p(m.line,{dataLabels:{enabled:!0,y:15,borderWidth:1,borderColor:"silver",borderRadius:3,style:{fontWeight:"bold"},verticalAlign:"top",zIndex:2},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1});u={type:"gauge",pointClass:j.extendClass(j.Point,{setState:function(a){this.state=a}}),angular:!0,drawGraph:w,fixedBox:!0,trackerGroups:["group","dataLabels"],translate:function(){var a=this.yAxis,b=this.options,c=a.center;this.generatePoints();s(this.points,function(d){var g=p(b.dial,d.dial),f=
+v(r(g.radius,80))*c[2]/200,e=v(r(g.baseLength,70))*f/100,i=v(r(g.rearLength,10))*f/100,n=g.baseWidth||3,l=g.topWidth||1,k=a.startAngleRad+a.translate(d.y,null,null,null,!0);b.wrap===!1&&(k=Math.max(a.startAngleRad,Math.min(a.endAngleRad,k)));k=k*180/Math.PI;d.shapeType="path";d.shapeArgs={d:g.path||["M",-i,-n/2,"L",e,-n/2,f,-l/2,f,l/2,e,n/2,-i,n/2,"z"],translateX:c[0],translateY:c[1],rotation:k};d.plotX=c[0];d.plotY=c[1]})},drawPoints:function(){var a=this,b=a.yAxis.center,c=a.pivot,d=a.options,g=
+d.pivot,f=a.chart.renderer;s(a.points,function(c){var b=c.graphic,g=c.shapeArgs,l=g.d,k=p(d.dial,c.dial);b?(b.animate(g),g.d=l):c.graphic=f[c.shapeType](g).attr({stroke:k.borderColor||"none","stroke-width":k.borderWidth||0,fill:k.backgroundColor||"black",rotation:g.rotation}).add(a.group)});c?c.animate({translateX:b[0],translateY:b[1]}):a.pivot=f.circle(0,0,r(g.radius,5)).attr({"stroke-width":g.borderWidth||0,stroke:g.borderColor||"silver",fill:g.backgroundColor||"black"}).translate(b[0],b[1]).add(a.group)},
+animate:function(a){var b=this;if(!a)s(b.points,function(a){var d=a.graphic;d&&(d.attr({rotation:b.yAxis.startAngleRad*180/Math.PI}),d.animate({rotation:a.shapeArgs.rotation},b.options.animation))}),b.animate=null},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);h.pie.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:h.pie.prototype.setData,drawTracker:h.column.prototype.drawTracker};h.gauge=
+j.extendClass(h.line,u);m.boxplot=p(m.column,{fillColor:"#FFFFFF",lineWidth:1,medianWidth:2,states:{hover:{brightness:-0.3}},threshold:null,tooltip:{pointFormat:'<span style="color:{series.color};font-weight:bold">{series.name}</span><br/>Maximum: {point.high}<br/>Upper quartile: {point.q3}<br/>Median: {point.median}<br/>Lower quartile: {point.q1}<br/>Minimum: {point.low}<br/>'},whiskerLength:"50%",whiskerWidth:2});h.boxplot=x(h.column,{type:"boxplot",pointArrayMap:["low","q1","median","q3","high"],
+toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:"high",pointAttrToOptions:{fill:"fillColor",stroke:"color","stroke-width":"lineWidth"},drawDataLabels:w,translate:function(){var a=this.yAxis,b=this.pointArrayMap;h.column.prototype.translate.apply(this);s(this.points,function(c){s(b,function(b){c[b]!==null&&(c[b+"Plot"]=a.translate(c[b],0,1,0,1))})})},drawPoints:function(){var a=this,b=a.points,c=a.options,d=a.chart.renderer,g,f,e,i,n,l,k,h,j,m,o,H,p,E,I,q,w,t,v,u,z,y,x=a.doQuartiles!==
+!1,B=parseInt(a.options.whiskerLength,10)/100;s(b,function(b){j=b.graphic;z=b.shapeArgs;o={};E={};q={};y=b.color||a.color;if(b.plotY!==C)if(g=b.pointAttr[b.selected?"selected":""],w=z.width,t=A(z.x),v=t+w,u=D(w/2),f=A(x?b.q1Plot:b.lowPlot),e=A(x?b.q3Plot:b.lowPlot),i=A(b.highPlot),n=A(b.lowPlot),o.stroke=b.stemColor||c.stemColor||y,o["stroke-width"]=r(b.stemWidth,c.stemWidth,c.lineWidth),o.dashstyle=b.stemDashStyle||c.stemDashStyle,E.stroke=b.whiskerColor||c.whiskerColor||y,E["stroke-width"]=r(b.whiskerWidth,
+c.whiskerWidth,c.lineWidth),q.stroke=b.medianColor||c.medianColor||y,q["stroke-width"]=r(b.medianWidth,c.medianWidth,c.lineWidth),k=o["stroke-width"]%2/2,h=t+u+k,m=["M",h,e,"L",h,i,"M",h,f,"L",h,n,"z"],x&&(k=g["stroke-width"]%2/2,h=A(h)+k,f=A(f)+k,e=A(e)+k,t+=k,v+=k,H=["M",t,e,"L",t,f,"L",v,f,"L",v,e,"L",t,e,"z"]),B&&(k=E["stroke-width"]%2/2,i+=k,n+=k,p=["M",h-u*B,i,"L",h+u*B,i,"M",h-u*B,n,"L",h+u*B,n]),k=q["stroke-width"]%2/2,l=D(b.medianPlot)+k,I=["M",t,l,"L",v,l,"z"],j)b.stem.animate({d:m}),B&&
+b.whiskers.animate({d:p}),x&&b.box.animate({d:H}),b.medianShape.animate({d:I});else{b.graphic=j=d.g().add(a.group);b.stem=d.path(m).attr(o).add(j);if(B)b.whiskers=d.path(p).attr(E).add(j);if(x)b.box=d.path(H).attr(g).add(j);b.medianShape=d.path(I).attr(q).add(j)}})}});m.errorbar=p(m.boxplot,{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:m.arearange.tooltip.pointFormat},whiskerWidth:null});h.errorbar=x(h.boxplot,{type:"errorbar",pointArrayMap:["low","high"],toYData:function(a){return[a.low,
+a.high]},pointValKey:"high",doQuartiles:!1,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||h.column.prototype.getColumnMetrics.call(this)}});m.waterfall=p(m.column,{lineWidth:1,lineColor:"#333",dashStyle:"dot",borderColor:"#333"});h.waterfall=x(h.column,{type:"waterfall",upColorProp:"fill",pointArrayMap:["low","y"],pointValKey:"y",init:function(a,b){b.stacking=!0;h.column.prototype.init.call(this,a,b)},translate:function(){var a=this.options,b=this.yAxis,c,d,
+g,f,e,i,n,l,k;c=a.threshold;a=a.borderWidth%2/2;h.column.prototype.translate.apply(this);l=c;g=this.points;for(d=0,c=g.length;d<c;d++){f=g[d];e=f.shapeArgs;i=this.getStack(d);k=i.points[this.index];if(isNaN(f.y))f.y=this.yData[d];n=S(l,l+f.y)+k[0];e.y=b.translate(n,0,1);f.isSum||f.isIntermediateSum?(e.y=b.translate(k[1],0,1),e.height=b.translate(k[0],0,1)-e.y):l+=i.total;e.height<0&&(e.y+=e.height,e.height*=-1);f.plotY=e.y=D(e.y)-a;e.height=D(e.height);f.yBottom=e.y+e.height}},processData:function(a){var b=
+this.yData,c=this.points,d,g=b.length,f=this.options.threshold||0,e,i,h,l,k,j;i=e=h=l=f;for(j=0;j<g;j++)k=b[j],d=c&&c[j]?c[j]:{},k==="sum"||d.isSum?b[j]=i:k==="intermediateSum"||d.isIntermediateSum?(b[j]=e,e=f):(i+=k,e+=k),h=Math.min(i,h),l=Math.max(i,l);z.prototype.processData.call(this,a);this.dataMin=h;this.dataMax=l},toYData:function(a){if(a.isSum)return"sum";else if(a.isIntermediateSum)return"intermediateSum";return a.y},getAttribs:function(){h.column.prototype.getAttribs.apply(this,arguments);
+var a=this.options,b=a.states,c=a.upColor||this.color,a=j.Color(c).brighten(0.1).get(),d=p(this.pointAttr),g=this.upColorProp;d[""][g]=c;d.hover[g]=b.hover.upColor||a;d.select[g]=b.select.upColor||c;s(this.points,function(a){if(a.y>0&&!a.color)a.pointAttr=d,a.color=c})},getGraphPath:function(){var a=this.data,b=a.length,c=D(this.options.lineWidth+this.options.borderWidth)%2/2,d=[],g,f,e;for(e=1;e<b;e++)f=a[e].shapeArgs,g=a[e-1].shapeArgs,f=["M",g.x+g.width,g.y+c,"L",f.x,g.y+c],a[e-1].y<0&&(f[2]+=
+g.height,f[5]+=g.height),d=d.concat(f);return d},getExtremes:w,getStack:function(a){var b=this.yAxis.stacks,c=this.stackKey;this.processedYData[a]<this.options.threshold&&(c="-"+c);return b[c][a]},drawGraph:z.prototype.drawGraph});m.bubble=p(m.scatter,{dataLabels:{inside:!0,style:{color:"white",textShadow:"0px 0px 3px black"},verticalAlign:"middle"},marker:{lineColor:null,lineWidth:1},minSize:8,maxSize:"20%",tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0});
+h.bubble=x(h.scatter,{type:"bubble",pointArrayMap:["y","z"],trackerGroups:["group","dataLabelsGroup"],pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor"},applyOpacity:function(a){var b=this.options.marker,c=r(b.fillOpacity,0.5),a=a||b.fillColor||this.color;c!==1&&(a=j.Color(a).setOpacity(c).get("rgba"));return a},convertAttribs:function(){var a=z.prototype.convertAttribs.apply(this,arguments);a.fill=this.applyOpacity(a.fill);return a},getRadii:function(a,b,c,d){var g,
+f,e,i=this.zData,h=[];for(f=0,g=i.length;f<g;f++)e=b-a,e=e>0?(i[f]-a)/(b-a):0.5,h.push(t.ceil(c+e*(d-c))/2);this.radii=h},animate:function(a){var b=this.options.animation;if(!a)s(this.points,function(a){var d=a.graphic,a=a.shapeArgs;d&&a&&(d.attr("r",1),d.animate({r:a.r},b))}),this.animate=null},translate:function(){var a,b=this.data,c,d,g=this.radii;h.scatter.prototype.translate.call(this);for(a=b.length;a--;)c=b[a],d=g?g[a]:0,c.negative=c.z<(this.options.zThreshold||0),d>=this.minPxSize/2?(c.shapeType=
+"circle",c.shapeArgs={x:c.plotX,y:c.plotY,r:d},c.dlBox={x:c.plotX-d,y:c.plotY-d,width:2*d,height:2*d}):c.shapeArgs=c.plotY=c.dlBox=C},drawLegendSymbol:function(a,b){var c=v(a.itemStyle.fontSize)/2;b.legendSymbol=this.chart.renderer.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker=!0},drawPoints:h.column.prototype.drawPoints,alignDataLabel:h.column.prototype.alignDataLabel});N.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,d=0,g=b,f=this.isXAxis,
+e=f?"xData":"yData",i=this.min,h={},j=t.min(c.plotWidth,c.plotHeight),k=Number.MAX_VALUE,m=-Number.MAX_VALUE,o=this.max-i,p=b/o,q=[];this.tickPositions&&(s(this.series,function(b){var c=b.options;if(b.type==="bubble"&&b.visible&&(a.allowZoomOutside=!0,q.push(b),f))s(["minSize","maxSize"],function(a){var b=c[a],d=/%$/.test(b),b=v(b);h[a]=d?j*b/100:b}),b.minPxSize=h.minSize,b=b.zData,b.length&&(k=t.min(k,t.max(P(b),c.displayNegative===!1?c.zThreshold:-Number.MAX_VALUE)),m=t.max(m,Q(b)))}),s(q,function(a){var b=
+a[e],c=b.length,j;f&&a.getRadii(k,m,h.minSize,h.maxSize);if(o>0)for(;c--;)j=a.radii[c],d=Math.min((b[c]-i)*p-j,d),g=Math.max((b[c]-i)*p+j,g)}),q.length&&o>0&&r(this.options.min,this.userMin)===C&&r(this.options.max,this.userMax)===C&&(g-=b,p*=(b+d-g)/b,this.min+=d/p,this.max+=g/p))};var y=z.prototype,m=j.Pointer.prototype;y.toXY=function(a){var b,c=this.chart;b=a.plotX;var d=a.plotY;a.rectPlotX=b;a.rectPlotY=d;a.clientX=(b/Math.PI*180+this.xAxis.pane.options.startAngle)%360;b=this.xAxis.postTranslate(a.plotX,
+this.yAxis.len-d);a.plotX=a.polarPlotX=b.x-c.plotLeft;a.plotY=a.polarPlotY=b.y-c.plotTop};y.orderTooltipPoints=function(a){if(this.chart.polar&&(a.sort(function(a,c){return a.clientX-c.clientX}),a[0]))a[0].wrappedClientX=a[0].clientX+360,a.push(a[0])};o(h.area.prototype,"init",K);o(h.areaspline.prototype,"init",K);o(h.spline.prototype,"getPointSpline",function(a,b,c,d){var g,f,e,i,h,j,k;if(this.chart.polar){g=c.plotX;f=c.plotY;a=b[d-1];e=b[d+1];this.connectEnds&&(a||(a=b[b.length-2]),e||(e=b[1]));
+if(a&&e)i=a.plotX,h=a.plotY,b=e.plotX,j=e.plotY,i=(1.5*g+i)/2.5,h=(1.5*f+h)/2.5,e=(1.5*g+b)/2.5,k=(1.5*f+j)/2.5,b=Math.sqrt(Math.pow(i-g,2)+Math.pow(h-f,2)),j=Math.sqrt(Math.pow(e-g,2)+Math.pow(k-f,2)),i=Math.atan2(h-f,i-g),h=Math.atan2(k-f,e-g),k=Math.PI/2+(i+h)/2,Math.abs(i-k)>Math.PI/2&&(k-=Math.PI),i=g+Math.cos(k)*b,h=f+Math.sin(k)*b,e=g+Math.cos(Math.PI+k)*j,k=f+Math.sin(Math.PI+k)*j,c.rightContX=e,c.rightContY=k;d?(c=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,i||g,h||f,g,f],a.rightContX=
+a.rightContY=null):c=["M",g,f]}else c=a.call(this,b,c,d);return c});o(y,"translate",function(a){a.call(this);if(this.chart.polar&&!this.preventPostTranslate)for(var a=this.points,b=a.length;b--;)this.toXY(a[b])});o(y,"getSegmentPath",function(a,b){var c=this.points;if(this.chart.polar&&this.options.connectEnds!==!1&&b[b.length-1]===c[c.length-1]&&c[0].y!==null)this.connectEnds=!0,b=[].concat(b,[c[0]]);return a.call(this,b)});o(y,"animate",L);o(q,"animate",L);o(y,"setTooltipPoints",function(a,b){this.chart.polar&&
+F(this.xAxis,{tooltipLen:360});return a.call(this,b)});o(q,"translate",function(a){var b=this.xAxis,c=this.yAxis.len,d=b.center,g=b.startAngleRad,f=this.chart.renderer,e,h;this.preventPostTranslate=!0;a.call(this);if(b.isRadial){b=this.points;for(h=b.length;h--;)e=b[h],a=e.barX+g,e.shapeType="path",e.shapeArgs={d:f.symbols.arc(d[0],d[1],c-e.plotY,null,{start:a,end:a+e.pointWidth,innerR:c-r(e.yBottom,c)})},this.toXY(e)}});o(q,"alignDataLabel",function(a,b,c,d,g,f){if(this.chart.polar){a=b.rectPlotX/
+Math.PI*180;if(d.align===null)d.align=a>20&&a<160?"left":a>200&&a<340?"right":"center";if(d.verticalAlign===null)d.verticalAlign=a<45||a>315?"bottom":a>135&&a<225?"top":"middle";y.alignDataLabel.call(this,b,c,d,g,f)}else a.call(this,b,c,d,g,f)});o(m,"getIndex",function(a,b){var c,d=this.chart,g;d.polar?(g=d.xAxis[0].center,c=b.chartX-g[0]-d.plotLeft,d=b.chartY-g[1]-d.plotTop,c=180-Math.round(Math.atan2(c,d)/Math.PI*180)):c=a.call(this,b);return c});o(m,"getCoordinates",function(a,b){var c=this.chart,
+d={xAxis:[],yAxis:[]};c.polar?s(c.axes,function(a){var f=a.isXAxis,e=a.center,h=b.chartX-e[0]-c.plotLeft,e=b.chartY-e[1]-c.plotTop;d[f?"xAxis":"yAxis"].push({axis:a,value:a.translate(f?Math.PI-Math.atan2(h,e):Math.sqrt(Math.pow(h,2)+Math.pow(e,2)),!0)})}):d=a.call(this,b);return d})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts-more.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts-more.src.js
new file mode 100644
index 0000000..39d4941
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts-more.src.js
@@ -0,0 +1,2430 @@
+// ==ClosureCompiler==
+// @compilation_level SIMPLE_OPTIMIZATIONS
+
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ *
+ * (c) 2009-2013 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts, HighchartsAdapter, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console */
+
+(function (Highcharts, UNDEFINED) {
+var arrayMin = Highcharts.arrayMin,
+	arrayMax = Highcharts.arrayMax,
+	each = Highcharts.each,
+	extend = Highcharts.extend,
+	merge = Highcharts.merge,
+	map = Highcharts.map,
+	pick = Highcharts.pick,
+	pInt = Highcharts.pInt,
+	defaultPlotOptions = Highcharts.getOptions().plotOptions,
+	seriesTypes = Highcharts.seriesTypes,
+	extendClass = Highcharts.extendClass,
+	splat = Highcharts.splat,
+	wrap = Highcharts.wrap,
+	Axis = Highcharts.Axis,
+	Tick = Highcharts.Tick,
+	Series = Highcharts.Series,
+	colProto = seriesTypes.column.prototype,
+	math = Math,
+	mathRound = math.round,
+	mathFloor = math.floor,
+	mathMax = math.max,
+	noop = function () {};/**
+ * The Pane object allows options that are common to a set of X and Y axes.
+ * 
+ * In the future, this can be extended to basic Highcharts and Highstock.
+ */
+function Pane(options, chart, firstAxis) {
+	this.init.call(this, options, chart, firstAxis);
+}
+
+// Extend the Pane prototype
+extend(Pane.prototype, {
+	
+	/**
+	 * Initiate the Pane object
+	 */
+	init: function (options, chart, firstAxis) {
+		var pane = this,
+			backgroundOption,
+			defaultOptions = pane.defaultOptions;
+		
+		pane.chart = chart;
+		
+		// Set options
+		if (chart.angular) { // gauges
+			defaultOptions.background = {}; // gets extended by this.defaultBackgroundOptions
+		}
+		pane.options = options = merge(defaultOptions, options);
+		
+		backgroundOption = options.background;
+		
+		// To avoid having weighty logic to place, update and remove the backgrounds,
+		// push them to the first axis' plot bands and borrow the existing logic there.
+		if (backgroundOption) {
+			each([].concat(splat(backgroundOption)).reverse(), function (config) {
+				var backgroundColor = config.backgroundColor; // if defined, replace the old one (specific for gradients)
+				config = merge(pane.defaultBackgroundOptions, config);
+				if (backgroundColor) {
+					config.backgroundColor = backgroundColor;
+				}
+				config.color = config.backgroundColor; // due to naming in plotBands
+				firstAxis.options.plotBands.unshift(config);
+			});
+		}
+	},
+	
+	/**
+	 * The default options object
+	 */
+	defaultOptions: {
+		// background: {conditional},
+		center: ['50%', '50%'],
+		size: '85%',
+		startAngle: 0
+		//endAngle: startAngle + 360
+	},	
+	
+	/**
+	 * The default background options
+	 */
+	defaultBackgroundOptions: {
+		shape: 'circle',
+		borderWidth: 1,
+		borderColor: 'silver',
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#FFF'],
+				[1, '#DDD']
+			]
+		},
+		from: Number.MIN_VALUE, // corrected to axis min
+		innerRadius: 0,
+		to: Number.MAX_VALUE, // corrected to axis max
+		outerRadius: '105%'
+	}
+	
+});
+var axisProto = Axis.prototype,
+	tickProto = Tick.prototype;
+	
+/**
+ * Augmented methods for the x axis in order to hide it completely, used for the X axis in gauges
+ */
+var hiddenAxisMixin = {
+	getOffset: noop,
+	redraw: function () {
+		this.isDirty = false; // prevent setting Y axis dirty
+	},
+	render: function () {
+		this.isDirty = false; // prevent setting Y axis dirty
+	},
+	setScale: noop,
+	setCategories: noop,
+	setTitle: noop
+};
+
+/**
+ * Augmented methods for the value axis
+ */
+/*jslint unparam: true*/
+var radialAxisMixin = {
+	isRadial: true,
+	
+	/**
+	 * The default options extend defaultYAxisOptions
+	 */
+	defaultRadialGaugeOptions: {
+		labels: {
+			align: 'center',
+			x: 0,
+			y: null // auto
+		},
+		minorGridLineWidth: 0,
+		minorTickInterval: 'auto',
+		minorTickLength: 10,
+		minorTickPosition: 'inside',
+		minorTickWidth: 1,
+		plotBands: [],
+		tickLength: 10,
+		tickPosition: 'inside',
+		tickWidth: 2,
+		title: {
+			rotation: 0
+		},
+		zIndex: 2 // behind dials, points in the series group
+	},
+	
+	// Circular axis around the perimeter of a polar chart
+	defaultRadialXOptions: {
+		gridLineWidth: 1, // spokes
+		labels: {
+			align: null, // auto
+			distance: 15,
+			x: 0,
+			y: null // auto
+		},
+		maxPadding: 0,
+		minPadding: 0,
+		plotBands: [],
+		showLastLabel: false, 
+		tickLength: 0
+	},
+	
+	// Radial axis, like a spoke in a polar chart
+	defaultRadialYOptions: {
+		gridLineInterpolation: 'circle',
+		labels: {
+			align: 'right',
+			x: -3,
+			y: -2
+		},
+		plotBands: [],
+		showLastLabel: false,
+		title: {
+			x: 4,
+			text: null,
+			rotation: 90
+		}
+	},
+	
+	/**
+	 * Merge and set options
+	 */
+	setOptions: function (userOptions) {
+		
+		this.options = merge(
+			this.defaultOptions,
+			this.defaultRadialOptions,
+			userOptions
+		);
+		
+	},
+	
+	/**
+	 * Wrap the getOffset method to return zero offset for title or labels in a radial 
+	 * axis
+	 */
+	getOffset: function () {
+		// Call the Axis prototype method (the method we're in now is on the instance)
+		axisProto.getOffset.call(this);
+		
+		// Title or label offsets are not counted
+		this.chart.axisOffset[this.side] = 0;
+	},
+
+
+	/**
+	 * Get the path for the axis line. This method is also referenced in the getPlotLinePath
+	 * method.
+	 */
+	getLinePath: function (lineWidth, radius) {
+		var center = this.center;
+		radius = pick(radius, center[2] / 2 - this.offset);
+		
+		return this.chart.renderer.symbols.arc(
+			this.left + center[0],
+			this.top + center[1],
+			radius,
+			radius, 
+			{
+				start: this.startAngleRad,
+				end: this.endAngleRad,
+				open: true,
+				innerR: 0
+			}
+		);
+	},
+
+	/**
+	 * Override setAxisTranslation by setting the translation to the difference
+	 * in rotation. This allows the translate method to return angle for 
+	 * any given value.
+	 */
+	setAxisTranslation: function () {
+		
+		// Call uber method		
+		axisProto.setAxisTranslation.call(this);
+			
+		// Set transA and minPixelPadding
+		if (this.center) { // it's not defined the first time
+			if (this.isCircular) {
+				
+				this.transA = (this.endAngleRad - this.startAngleRad) / 
+					((this.max - this.min) || 1);
+					
+				
+			} else { 
+				this.transA = (this.center[2] / 2) / ((this.max - this.min) || 1);
+			}
+			
+			if (this.isXAxis) {
+				this.minPixelPadding = this.transA * this.minPointOffset +
+					(this.reversed ? (this.endAngleRad - this.startAngleRad) / 4 : 0); // ???
+			}
+		}
+	},
+	
+	/**
+	 * In case of auto connect, add one closestPointRange to the max value right before
+	 * tickPositions are computed, so that ticks will extend passed the real max.
+	 */
+	beforeSetTickPositions: function () {
+		if (this.autoConnect) {
+			this.max += (this.categories && 1) || this.pointRange || this.closestPointRange || 0; // #1197, #2260
+		}
+	},
+	
+	/**
+	 * Override the setAxisSize method to use the arc's circumference as length. This
+	 * allows tickPixelInterval to apply to pixel lengths along the perimeter
+	 */
+	setAxisSize: function () {
+		
+		axisProto.setAxisSize.call(this);
+
+		if (this.isRadial) {
+
+			// Set the center array
+			this.center = this.pane.center = seriesTypes.pie.prototype.getCenter.call(this.pane);
+			
+			this.len = this.width = this.height = this.isCircular ?
+				this.center[2] * (this.endAngleRad - this.startAngleRad) / 2 :
+				this.center[2] / 2;
+		}
+	},
+	
+	/**
+	 * Returns the x, y coordinate of a point given by a value and a pixel distance
+	 * from center
+	 */
+	getPosition: function (value, length) {
+		if (!this.isCircular) {
+			length = this.translate(value);
+			value = this.min;	
+		}
+		
+		return this.postTranslate(
+			this.translate(value),
+			pick(length, this.center[2] / 2) - this.offset
+		);		
+	},
+	
+	/**
+	 * Translate from intermediate plotX (angle), plotY (axis.len - radius) to final chart coordinates. 
+	 */
+	postTranslate: function (angle, radius) {
+		
+		var chart = this.chart,
+			center = this.center;
+			
+		angle = this.startAngleRad + angle;
+		
+		return {
+			x: chart.plotLeft + center[0] + Math.cos(angle) * radius,
+			y: chart.plotTop + center[1] + Math.sin(angle) * radius
+		}; 
+		
+	},
+	
+	/**
+	 * Find the path for plot bands along the radial axis
+	 */
+	getPlotBandPath: function (from, to, options) {
+		var center = this.center,
+			startAngleRad = this.startAngleRad,
+			fullRadius = center[2] / 2,
+			radii = [
+				pick(options.outerRadius, '100%'),
+				options.innerRadius,
+				pick(options.thickness, 10)
+			],
+			percentRegex = /%$/,
+			start,
+			end,
+			open,
+			isCircular = this.isCircular, // X axis in a polar chart
+			ret;
+			
+		// Polygonal plot bands
+		if (this.options.gridLineInterpolation === 'polygon') {
+			ret = this.getPlotLinePath(from).concat(this.getPlotLinePath(to, true));
+		
+		// Circular grid bands
+		} else {
+			
+			// Plot bands on Y axis (radial axis) - inner and outer radius depend on to and from
+			if (!isCircular) {
+				radii[0] = this.translate(from);
+				radii[1] = this.translate(to);
+			}
+			
+			// Convert percentages to pixel values
+			radii = map(radii, function (radius) {
+				if (percentRegex.test(radius)) {
+					radius = (pInt(radius, 10) * fullRadius) / 100;
+				}
+				return radius;
+			});
+			
+			// Handle full circle
+			if (options.shape === 'circle' || !isCircular) {
+				start = -Math.PI / 2;
+				end = Math.PI * 1.5;
+				open = true;
+			} else {
+				start = startAngleRad + this.translate(from);
+				end = startAngleRad + this.translate(to);
+			}
+		
+		
+			ret = this.chart.renderer.symbols.arc(
+				this.left + center[0],
+				this.top + center[1],
+				radii[0],
+				radii[0],
+				{
+					start: start,
+					end: end,
+					innerR: pick(radii[1], radii[0] - radii[2]),
+					open: open
+				}
+			);
+		}
+		 
+		return ret;
+	},
+	
+	/**
+	 * Find the path for plot lines perpendicular to the radial axis.
+	 */
+	getPlotLinePath: function (value, reverse) {
+		var axis = this,
+			center = axis.center,
+			chart = axis.chart,
+			end = axis.getPosition(value),
+			xAxis,
+			xy,
+			tickPositions,
+			ret;
+		
+		// Spokes
+		if (axis.isCircular) {
+			ret = ['M', center[0] + chart.plotLeft, center[1] + chart.plotTop, 'L', end.x, end.y];
+		
+		// Concentric circles			
+		} else if (axis.options.gridLineInterpolation === 'circle') {
+			value = axis.translate(value);
+			if (value) { // a value of 0 is in the center
+				ret = axis.getLinePath(0, value);
+			}
+		// Concentric polygons 
+		} else {
+			xAxis = chart.xAxis[0];
+			ret = [];
+			value = axis.translate(value);
+			tickPositions = xAxis.tickPositions;
+			if (xAxis.autoConnect) {
+				tickPositions = tickPositions.concat([tickPositions[0]]);
+			}
+			// Reverse the positions for concatenation of polygonal plot bands
+			if (reverse) {
+				tickPositions = [].concat(tickPositions).reverse();
+			}
+				
+			each(tickPositions, function (pos, i) {
+				xy = xAxis.getPosition(pos, value);
+				ret.push(i ? 'L' : 'M', xy.x, xy.y);
+			});
+			
+		}
+		return ret;
+	},
+	
+	/**
+	 * Find the position for the axis title, by default inside the gauge
+	 */
+	getTitlePosition: function () {
+		var center = this.center,
+			chart = this.chart,
+			titleOptions = this.options.title;
+		
+		return { 
+			x: chart.plotLeft + center[0] + (titleOptions.x || 0), 
+			y: chart.plotTop + center[1] - ({ high: 0.5, middle: 0.25, low: 0 }[titleOptions.align] * 
+				center[2]) + (titleOptions.y || 0)  
+		};
+	}
+	
+};
+/*jslint unparam: false*/
+
+/**
+ * Override axisProto.init to mix in special axis instance functions and function overrides
+ */
+wrap(axisProto, 'init', function (proceed, chart, userOptions) {
+	var axis = this,
+		angular = chart.angular,
+		polar = chart.polar,
+		isX = userOptions.isX,
+		isHidden = angular && isX,
+		isCircular,
+		startAngleRad,
+		endAngleRad,
+		options,
+		chartOptions = chart.options,
+		paneIndex = userOptions.pane || 0,
+		pane,
+		paneOptions;
+		
+	// Before prototype.init
+	if (angular) {
+		extend(this, isHidden ? hiddenAxisMixin : radialAxisMixin);
+		isCircular =  !isX;
+		if (isCircular) {
+			this.defaultRadialOptions = this.defaultRadialGaugeOptions;
+		}
+		
+	} else if (polar) {
+		//extend(this, userOptions.isX ? radialAxisMixin : radialAxisMixin);
+		extend(this, radialAxisMixin);
+		isCircular = isX;
+		this.defaultRadialOptions = isX ? this.defaultRadialXOptions : merge(this.defaultYAxisOptions, this.defaultRadialYOptions);
+		
+	}
+	
+	// Run prototype.init
+	proceed.call(this, chart, userOptions);
+	
+	if (!isHidden && (angular || polar)) {
+		options = this.options;
+		
+		// Create the pane and set the pane options.
+		if (!chart.panes) {
+			chart.panes = [];
+		}
+		this.pane = pane = chart.panes[paneIndex] = chart.panes[paneIndex] || new Pane(
+			splat(chartOptions.pane)[paneIndex],
+			chart,
+			axis
+		);
+		paneOptions = pane.options;
+		
+			
+		// Disable certain features on angular and polar axes
+		chart.inverted = false;
+		chartOptions.chart.zoomType = null;
+		
+		// Start and end angle options are
+		// given in degrees relative to top, while internal computations are
+		// in radians relative to right (like SVG).
+		this.startAngleRad = startAngleRad = (paneOptions.startAngle - 90) * Math.PI / 180;
+		this.endAngleRad = endAngleRad = (pick(paneOptions.endAngle, paneOptions.startAngle + 360)  - 90) * Math.PI / 180;
+		this.offset = options.offset || 0;
+		
+		this.isCircular = isCircular;
+		
+		// Automatically connect grid lines?
+		if (isCircular && userOptions.max === UNDEFINED && endAngleRad - startAngleRad === 2 * Math.PI) {
+			this.autoConnect = true;
+		}
+	}
+	
+});
+
+/**
+ * Add special cases within the Tick class' methods for radial axes.
+ */	
+wrap(tickProto, 'getPosition', function (proceed, horiz, pos, tickmarkOffset, old) {
+	var axis = this.axis;
+	
+	return axis.getPosition ? 
+		axis.getPosition(pos) :
+		proceed.call(this, horiz, pos, tickmarkOffset, old);	
+});
+
+/**
+ * Wrap the getLabelPosition function to find the center position of the label
+ * based on the distance option
+ */	
+wrap(tickProto, 'getLabelPosition', function (proceed, x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {
+	var axis = this.axis,
+		optionsY = labelOptions.y,
+		ret,
+		align = labelOptions.align,
+		angle = ((axis.translate(this.pos) + axis.startAngleRad + Math.PI / 2) / Math.PI * 180) % 360;
+	
+	if (axis.isRadial) {
+		ret = axis.getPosition(this.pos, (axis.center[2] / 2) + pick(labelOptions.distance, -25));
+		
+		// Automatically rotated
+		if (labelOptions.rotation === 'auto') {
+			label.attr({ 
+				rotation: angle
+			});
+		
+		// Vertically centered
+		} else if (optionsY === null) {
+			optionsY = pInt(label.styles.lineHeight) * 0.9 - label.getBBox().height / 2;
+		
+		}
+		
+		// Automatic alignment
+		if (align === null) {
+			if (axis.isCircular) {
+				if (angle > 20 && angle < 160) {
+					align = 'left'; // right hemisphere
+				} else if (angle > 200 && angle < 340) {
+					align = 'right'; // left hemisphere
+				} else {
+					align = 'center'; // top or bottom
+				}
+			} else {
+				align = 'center';
+			}
+			label.attr({
+				align: align
+			});
+		}
+		
+		ret.x += labelOptions.x;
+		ret.y += optionsY;
+		
+	} else {
+		ret = proceed.call(this, x, y, label, horiz, labelOptions, tickmarkOffset, index, step);
+	}
+	return ret;
+});
+
+/**
+ * Wrap the getMarkPath function to return the path of the radial marker
+ */
+wrap(tickProto, 'getMarkPath', function (proceed, x, y, tickLength, tickWidth, horiz, renderer) {
+	var axis = this.axis,
+		endPoint,
+		ret;
+		
+	if (axis.isRadial) {
+		endPoint = axis.getPosition(this.pos, axis.center[2] / 2 + tickLength);
+		ret = [
+			'M',
+			x,
+			y,
+			'L',
+			endPoint.x,
+			endPoint.y
+		];
+	} else {
+		ret = proceed.call(this, x, y, tickLength, tickWidth, horiz, renderer);
+	}
+	return ret;
+});/* 
+ * The AreaRangeSeries class
+ * 
+ */
+
+/**
+ * Extend the default options with map options
+ */
+defaultPlotOptions.arearange = merge(defaultPlotOptions.area, {
+	lineWidth: 1,
+	marker: null,
+	threshold: null,
+	tooltip: {
+		pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.low}</b> - <b>{point.high}</b><br/>' 
+	},
+	trackByArea: true,
+	dataLabels: {
+		verticalAlign: null,
+		xLow: 0,
+		xHigh: 0,
+		yLow: 0,
+		yHigh: 0	
+	}
+});
+
+/**
+ * Add the series type
+ */
+seriesTypes.arearange = Highcharts.extendClass(seriesTypes.area, {
+	type: 'arearange',
+	pointArrayMap: ['low', 'high'],
+	toYData: function (point) {
+		return [point.low, point.high];
+	},
+	pointValKey: 'low',
+	
+	/**
+	 * Extend getSegments to force null points if the higher value is null. #1703.
+	 */
+	getSegments: function () {
+		var series = this;
+
+		each(series.points, function (point) {
+			if (!series.options.connectNulls && (point.low === null || point.high === null)) {
+				point.y = null;
+			} else if (point.low === null && point.high !== null) {
+				point.y = point.high;
+			}
+		});
+		Series.prototype.getSegments.call(this);
+	},
+	
+	/**
+	 * Translate data points from raw values x and y to plotX and plotY
+	 */
+	translate: function () {
+		var series = this,
+			yAxis = series.yAxis;
+
+		seriesTypes.area.prototype.translate.apply(series);
+
+		// Set plotLow and plotHigh
+		each(series.points, function (point) {
+
+			var low = point.low,
+				high = point.high,
+				plotY = point.plotY;
+
+			if (high === null && low === null) {
+				point.y = null;
+			} else if (low === null) {
+				point.plotLow = point.plotY = null;
+				point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
+			} else if (high === null) {
+				point.plotLow = plotY;
+				point.plotHigh = null;
+			} else {
+				point.plotLow = plotY;
+				point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
+			}
+		});
+	},
+	
+	/**
+	 * Extend the line series' getSegmentPath method by applying the segment
+	 * path to both lower and higher values of the range
+	 */
+	getSegmentPath: function (segment) {
+		
+		var lowSegment,
+			highSegment = [],
+			i = segment.length,
+			baseGetSegmentPath = Series.prototype.getSegmentPath,
+			point,
+			linePath,
+			lowerPath,
+			options = this.options,
+			step = options.step,
+			higherPath;
+			
+		// Remove nulls from low segment
+		lowSegment = HighchartsAdapter.grep(segment, function (point) {
+			return point.plotLow !== null;
+		});
+		
+		// Make a segment with plotX and plotY for the top values
+		while (i--) {
+			point = segment[i];
+			if (point.plotHigh !== null) {
+				highSegment.push({
+					plotX: point.plotX,
+					plotY: point.plotHigh
+				});
+			}
+		}
+		
+		// Get the paths
+		lowerPath = baseGetSegmentPath.call(this, lowSegment);
+		if (step) {
+			if (step === true) {
+				step = 'left';
+			}
+			options.step = { left: 'right', center: 'center', right: 'left' }[step]; // swap for reading in getSegmentPath
+		}
+		higherPath = baseGetSegmentPath.call(this, highSegment);
+		options.step = step;
+		
+		// Create a line on both top and bottom of the range
+		linePath = [].concat(lowerPath, higherPath);
+		
+		// For the area path, we need to change the 'move' statement into 'lineTo' or 'curveTo'
+		higherPath[0] = 'L'; // this probably doesn't work for spline			
+		this.areaPath = this.areaPath.concat(lowerPath, higherPath);
+		
+		return linePath;
+	},
+	
+	/**
+	 * Extend the basic drawDataLabels method by running it for both lower and higher
+	 * values.
+	 */
+	drawDataLabels: function () {
+		
+		var data = this.data,
+			length = data.length,
+			i,
+			originalDataLabels = [],
+			seriesProto = Series.prototype,
+			dataLabelOptions = this.options.dataLabels,
+			point,
+			inverted = this.chart.inverted;
+			
+		if (dataLabelOptions.enabled || this._hasPointLabels) {
+			
+			// Step 1: set preliminary values for plotY and dataLabel and draw the upper labels
+			i = length;
+			while (i--) {
+				point = data[i];
+				
+				// Set preliminary values
+				point.y = point.high;
+				point.plotY = point.plotHigh;
+				
+				// Store original data labels and set preliminary label objects to be picked up 
+				// in the uber method
+				originalDataLabels[i] = point.dataLabel;
+				point.dataLabel = point.dataLabelUpper;
+				
+				// Set the default offset
+				point.below = false;
+				if (inverted) {
+					dataLabelOptions.align = 'left';
+					dataLabelOptions.x = dataLabelOptions.xHigh;								
+				} else {
+					dataLabelOptions.y = dataLabelOptions.yHigh;
+				}
+			}
+			seriesProto.drawDataLabels.apply(this, arguments); // #1209
+			
+			// Step 2: reorganize and handle data labels for the lower values
+			i = length;
+			while (i--) {
+				point = data[i];
+				
+				// Move the generated labels from step 1, and reassign the original data labels
+				point.dataLabelUpper = point.dataLabel;
+				point.dataLabel = originalDataLabels[i];
+				
+				// Reset values
+				point.y = point.low;
+				point.plotY = point.plotLow;
+				
+				// Set the default offset
+				point.below = true;
+				if (inverted) {
+					dataLabelOptions.align = 'right';
+					dataLabelOptions.x = dataLabelOptions.xLow;
+				} else {
+					dataLabelOptions.y = dataLabelOptions.yLow;
+				}
+			}
+			seriesProto.drawDataLabels.apply(this, arguments);
+		}
+	
+	},
+	
+	alignDataLabel: seriesTypes.column.prototype.alignDataLabel,
+	
+	getSymbol: seriesTypes.column.prototype.getSymbol,
+	
+	drawPoints: noop
+});/**
+ * The AreaSplineRangeSeries class
+ */
+
+defaultPlotOptions.areasplinerange = merge(defaultPlotOptions.arearange);
+
+/**
+ * AreaSplineRangeSeries object
+ */
+seriesTypes.areasplinerange = extendClass(seriesTypes.arearange, {
+	type: 'areasplinerange',
+	getPointSpline: seriesTypes.spline.prototype.getPointSpline
+});/**
+ * The ColumnRangeSeries class
+ */
+defaultPlotOptions.columnrange = merge(defaultPlotOptions.column, defaultPlotOptions.arearange, {
+	lineWidth: 1,
+	pointRange: null
+});
+
+/**
+ * ColumnRangeSeries object
+ */
+seriesTypes.columnrange = extendClass(seriesTypes.arearange, {
+	type: 'columnrange',
+	/**
+	 * Translate data points from raw values x and y to plotX and plotY
+	 */
+	translate: function () {
+		var series = this,
+			yAxis = series.yAxis,
+			plotHigh;
+
+		colProto.translate.apply(series);
+
+		// Set plotLow and plotHigh
+		each(series.points, function (point) {
+			var shapeArgs = point.shapeArgs,
+				minPointLength = series.options.minPointLength,
+				heightDifference,
+				height,
+				y;
+
+			point.plotHigh = plotHigh = yAxis.translate(point.high, 0, 1, 0, 1);
+			point.plotLow = point.plotY;
+
+			// adjust shape
+			y = plotHigh;
+			height = point.plotY - plotHigh;
+
+			if (height < minPointLength) {
+				heightDifference = (minPointLength - height);
+				height += heightDifference;
+				y -= heightDifference / 2;
+			}
+			shapeArgs.height = height;
+			shapeArgs.y = y;
+		});
+	},
+	trackerGroups: ['group', 'dataLabels'],
+	drawGraph: noop,
+	pointAttrToOptions: colProto.pointAttrToOptions,
+	drawPoints: colProto.drawPoints,
+	drawTracker: colProto.drawTracker,
+	animate: colProto.animate,
+	getColumnMetrics: colProto.getColumnMetrics
+});
+/* 
+ * The GaugeSeries class
+ */
+
+
+
+/**
+ * Extend the default options
+ */
+defaultPlotOptions.gauge = merge(defaultPlotOptions.line, {
+	dataLabels: {
+		enabled: true,
+		y: 15,
+		borderWidth: 1,
+		borderColor: 'silver',
+		borderRadius: 3,
+		style: {
+			fontWeight: 'bold'
+		},
+		verticalAlign: 'top',
+		zIndex: 2
+	},
+	dial: {
+		// radius: '80%',
+		// backgroundColor: 'black',
+		// borderColor: 'silver',
+		// borderWidth: 0,
+		// baseWidth: 3,
+		// topWidth: 1,
+		// baseLength: '70%' // of radius
+		// rearLength: '10%'
+	},
+	pivot: {
+		//radius: 5,
+		//borderWidth: 0
+		//borderColor: 'silver',
+		//backgroundColor: 'black'
+	},
+	tooltip: {
+		headerFormat: ''
+	},
+	showInLegend: false
+});
+
+/**
+ * Extend the point object
+ */
+var GaugePoint = Highcharts.extendClass(Highcharts.Point, {
+	/**
+	 * Don't do any hover colors or anything
+	 */
+	setState: function (state) {
+		this.state = state;
+	}
+});
+
+
+/**
+ * Add the series type
+ */
+var GaugeSeries = {
+	type: 'gauge',
+	pointClass: GaugePoint,
+	
+	// chart.angular will be set to true when a gauge series is present, and this will
+	// be used on the axes
+	angular: true, 
+	drawGraph: noop,
+	fixedBox: true,
+	trackerGroups: ['group', 'dataLabels'],
+	
+	/**
+	 * Calculate paths etc
+	 */
+	translate: function () {
+		
+		var series = this,
+			yAxis = series.yAxis,
+			options = series.options,
+			center = yAxis.center;
+			
+		series.generatePoints();
+		
+		each(series.points, function (point) {
+			
+			var dialOptions = merge(options.dial, point.dial),
+				radius = (pInt(pick(dialOptions.radius, 80)) * center[2]) / 200,
+				baseLength = (pInt(pick(dialOptions.baseLength, 70)) * radius) / 100,
+				rearLength = (pInt(pick(dialOptions.rearLength, 10)) * radius) / 100,
+				baseWidth = dialOptions.baseWidth || 3,
+				topWidth = dialOptions.topWidth || 1,
+				rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true);
+
+			// Handle the wrap option
+			if (options.wrap === false) {
+				rotation = Math.max(yAxis.startAngleRad, Math.min(yAxis.endAngleRad, rotation));
+			}
+			rotation = rotation * 180 / Math.PI;
+				
+			point.shapeType = 'path';
+			point.shapeArgs = {
+				d: dialOptions.path || [
+					'M', 
+					-rearLength, -baseWidth / 2, 
+					'L', 
+					baseLength, -baseWidth / 2,
+					radius, -topWidth / 2,
+					radius, topWidth / 2,
+					baseLength, baseWidth / 2,
+					-rearLength, baseWidth / 2,
+					'z'
+				],
+				translateX: center[0],
+				translateY: center[1],
+				rotation: rotation
+			};
+			
+			// Positions for data label
+			point.plotX = center[0];
+			point.plotY = center[1];
+		});
+	},
+	
+	/**
+	 * Draw the points where each point is one needle
+	 */
+	drawPoints: function () {
+		
+		var series = this,
+			center = series.yAxis.center,
+			pivot = series.pivot,
+			options = series.options,
+			pivotOptions = options.pivot,
+			renderer = series.chart.renderer;
+		
+		each(series.points, function (point) {
+			
+			var graphic = point.graphic,
+				shapeArgs = point.shapeArgs,
+				d = shapeArgs.d,
+				dialOptions = merge(options.dial, point.dial); // #1233
+			
+			if (graphic) {
+				graphic.animate(shapeArgs);
+				shapeArgs.d = d; // animate alters it
+			} else {
+				point.graphic = renderer[point.shapeType](shapeArgs)
+					.attr({
+						stroke: dialOptions.borderColor || 'none',
+						'stroke-width': dialOptions.borderWidth || 0,
+						fill: dialOptions.backgroundColor || 'black',
+						rotation: shapeArgs.rotation // required by VML when animation is false
+					})
+					.add(series.group);
+			}
+		});
+		
+		// Add or move the pivot
+		if (pivot) {
+			pivot.animate({ // #1235
+				translateX: center[0],
+				translateY: center[1]
+			});
+		} else {
+			series.pivot = renderer.circle(0, 0, pick(pivotOptions.radius, 5))
+				.attr({
+					'stroke-width': pivotOptions.borderWidth || 0,
+					stroke: pivotOptions.borderColor || 'silver',
+					fill: pivotOptions.backgroundColor || 'black'
+				})
+				.translate(center[0], center[1])
+				.add(series.group);
+		}
+	},
+	
+	/**
+	 * Animate the arrow up from startAngle
+	 */
+	animate: function (init) {
+		var series = this;
+
+		if (!init) {
+			each(series.points, function (point) {
+				var graphic = point.graphic;
+
+				if (graphic) {
+					// start value
+					graphic.attr({
+						rotation: series.yAxis.startAngleRad * 180 / Math.PI
+					});
+
+					// animate
+					graphic.animate({
+						rotation: point.shapeArgs.rotation
+					}, series.options.animation);
+				}
+			});
+
+			// delete this function to allow it only once
+			series.animate = null;
+		}
+	},
+	
+	render: function () {
+		this.group = this.plotGroup(
+			'group', 
+			'series', 
+			this.visible ? 'visible' : 'hidden', 
+			this.options.zIndex, 
+			this.chart.seriesGroup
+		);
+		seriesTypes.pie.prototype.render.call(this);
+		this.group.clip(this.chart.clipRect);
+	},
+	
+	setData: seriesTypes.pie.prototype.setData,
+	drawTracker: seriesTypes.column.prototype.drawTracker
+};
+seriesTypes.gauge = Highcharts.extendClass(seriesTypes.line, GaugeSeries);/* ****************************************************************************
+ * Start Box plot series code											      *
+ *****************************************************************************/
+
+// Set default options
+defaultPlotOptions.boxplot = merge(defaultPlotOptions.column, {
+	fillColor: '#FFFFFF',
+	lineWidth: 1,
+	//medianColor: null,
+	medianWidth: 2,
+	states: {
+		hover: {
+			brightness: -0.3
+		}
+	},
+	//stemColor: null,
+	//stemDashStyle: 'solid'
+	//stemWidth: null,
+	threshold: null,
+	tooltip: {
+		pointFormat: '<span style="color:{series.color};font-weight:bold">{series.name}</span><br/>' +
+			'Maximum: {point.high}<br/>' +
+			'Upper quartile: {point.q3}<br/>' +
+			'Median: {point.median}<br/>' +
+			'Lower quartile: {point.q1}<br/>' +
+			'Minimum: {point.low}<br/>'
+			
+	},
+	//whiskerColor: null,
+	whiskerLength: '50%',
+	whiskerWidth: 2
+});
+
+// Create the series object
+seriesTypes.boxplot = extendClass(seriesTypes.column, {
+	type: 'boxplot',
+	pointArrayMap: ['low', 'q1', 'median', 'q3', 'high'], // array point configs are mapped to this
+	toYData: function (point) { // return a plain array for speedy calculation
+		return [point.low, point.q1, point.median, point.q3, point.high];
+	},
+	pointValKey: 'high', // defines the top of the tracker
+	
+	/**
+	 * One-to-one mapping from options to SVG attributes
+	 */
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		fill: 'fillColor',
+		stroke: 'color',
+		'stroke-width': 'lineWidth'
+	},
+	
+	/**
+	 * Disable data labels for box plot
+	 */
+	drawDataLabels: noop,
+
+	/**
+	 * Translate data points from raw values x and y to plotX and plotY
+	 */
+	translate: function () {
+		var series = this,
+			yAxis = series.yAxis,
+			pointArrayMap = series.pointArrayMap;
+
+		seriesTypes.column.prototype.translate.apply(series);
+
+		// do the translation on each point dimension
+		each(series.points, function (point) {
+			each(pointArrayMap, function (key) {
+				if (point[key] !== null) {
+					point[key + 'Plot'] = yAxis.translate(point[key], 0, 1, 0, 1);
+				}
+			});
+		});
+	},
+
+	/**
+	 * Draw the data points
+	 */
+	drawPoints: function () {
+		var series = this,  //state = series.state,
+			points = series.points,
+			options = series.options,
+			chart = series.chart,
+			renderer = chart.renderer,
+			pointAttr,
+			q1Plot,
+			q3Plot,
+			highPlot,
+			lowPlot,
+			medianPlot,
+			crispCorr,
+			crispX,
+			graphic,
+			stemPath,
+			stemAttr,
+			boxPath,
+			whiskersPath,
+			whiskersAttr,
+			medianPath,
+			medianAttr,
+			width,
+			left,
+			right,
+			halfWidth,
+			shapeArgs,
+			color,
+			doQuartiles = series.doQuartiles !== false, // error bar inherits this series type but doesn't do quartiles
+			whiskerLength = parseInt(series.options.whiskerLength, 10) / 100;
+
+
+		each(points, function (point) {
+
+			graphic = point.graphic;
+			shapeArgs = point.shapeArgs; // the box
+			stemAttr = {};
+			whiskersAttr = {};
+			medianAttr = {};
+			color = point.color || series.color;
+			
+			if (point.plotY !== UNDEFINED) {
+
+				pointAttr = point.pointAttr[point.selected ? 'selected' : ''];
+
+				// crisp vector coordinates
+				width = shapeArgs.width;
+				left = mathFloor(shapeArgs.x);
+				right = left + width;
+				halfWidth = mathRound(width / 2);
+				//crispX = mathRound(left + halfWidth) + crispCorr;
+				q1Plot = mathFloor(doQuartiles ? point.q1Plot : point.lowPlot);// + crispCorr;
+				q3Plot = mathFloor(doQuartiles ? point.q3Plot : point.lowPlot);// + crispCorr;
+				highPlot = mathFloor(point.highPlot);// + crispCorr;
+				lowPlot = mathFloor(point.lowPlot);// + crispCorr;
+				
+				// Stem attributes
+				stemAttr.stroke = point.stemColor || options.stemColor || color;
+				stemAttr['stroke-width'] = pick(point.stemWidth, options.stemWidth, options.lineWidth);
+				stemAttr.dashstyle = point.stemDashStyle || options.stemDashStyle;
+				
+				// Whiskers attributes
+				whiskersAttr.stroke = point.whiskerColor || options.whiskerColor || color;
+				whiskersAttr['stroke-width'] = pick(point.whiskerWidth, options.whiskerWidth, options.lineWidth);
+				
+				// Median attributes
+				medianAttr.stroke = point.medianColor || options.medianColor || color;
+				medianAttr['stroke-width'] = pick(point.medianWidth, options.medianWidth, options.lineWidth);
+				
+				
+				// The stem
+				crispCorr = (stemAttr['stroke-width'] % 2) / 2;
+				crispX = left + halfWidth + crispCorr;				
+				stemPath = [
+					// stem up
+					'M',
+					crispX, q3Plot,
+					'L',
+					crispX, highPlot,
+					
+					// stem down
+					'M',
+					crispX, q1Plot,
+					'L',
+					crispX, lowPlot,
+					'z'
+				];
+				
+				// The box
+				if (doQuartiles) {
+					crispCorr = (pointAttr['stroke-width'] % 2) / 2;
+					crispX = mathFloor(crispX) + crispCorr;
+					q1Plot = mathFloor(q1Plot) + crispCorr;
+					q3Plot = mathFloor(q3Plot) + crispCorr;
+					left += crispCorr;
+					right += crispCorr;
+					boxPath = [
+						'M',
+						left, q3Plot,
+						'L',
+						left, q1Plot,
+						'L',
+						right, q1Plot,
+						'L',
+						right, q3Plot,
+						'L',
+						left, q3Plot,
+						'z'
+					];
+				}
+				
+				// The whiskers
+				if (whiskerLength) {
+					crispCorr = (whiskersAttr['stroke-width'] % 2) / 2;
+					highPlot = highPlot + crispCorr;
+					lowPlot = lowPlot + crispCorr;
+					whiskersPath = [
+						// High whisker
+						'M',
+						crispX - halfWidth * whiskerLength, 
+						highPlot,
+						'L',
+						crispX + halfWidth * whiskerLength, 
+						highPlot,
+						
+						// Low whisker
+						'M',
+						crispX - halfWidth * whiskerLength, 
+						lowPlot,
+						'L',
+						crispX + halfWidth * whiskerLength, 
+						lowPlot
+					];
+				}
+				
+				// The median
+				crispCorr = (medianAttr['stroke-width'] % 2) / 2;				
+				medianPlot = mathRound(point.medianPlot) + crispCorr;
+				medianPath = [
+					'M',
+					left, 
+					medianPlot,
+					'L',
+					right, 
+					medianPlot,
+					'z'
+				];
+				
+				// Create or update the graphics
+				if (graphic) { // update
+					
+					point.stem.animate({ d: stemPath });
+					if (whiskerLength) {
+						point.whiskers.animate({ d: whiskersPath });
+					}
+					if (doQuartiles) {
+						point.box.animate({ d: boxPath });
+					}
+					point.medianShape.animate({ d: medianPath });
+					
+				} else { // create new
+					point.graphic = graphic = renderer.g()
+						.add(series.group);
+					
+					point.stem = renderer.path(stemPath)
+						.attr(stemAttr)
+						.add(graphic);
+						
+					if (whiskerLength) {
+						point.whiskers = renderer.path(whiskersPath) 
+							.attr(whiskersAttr)
+							.add(graphic);
+					}
+					if (doQuartiles) {
+						point.box = renderer.path(boxPath)
+							.attr(pointAttr)
+							.add(graphic);
+					}	
+					point.medianShape = renderer.path(medianPath)
+						.attr(medianAttr)
+						.add(graphic);
+				}
+			}
+		});
+
+	}
+
+
+});
+
+/* ****************************************************************************
+ * End Box plot series code												*
+ *****************************************************************************/
+/* ****************************************************************************
+ * Start error bar series code                                                *
+ *****************************************************************************/
+
+// 1 - set default options
+defaultPlotOptions.errorbar = merge(defaultPlotOptions.boxplot, {
+	color: '#000000',
+	grouping: false,
+	linkedTo: ':previous',
+	tooltip: {
+		pointFormat: defaultPlotOptions.arearange.tooltip.pointFormat
+	},
+	whiskerWidth: null
+});
+
+// 2 - Create the series object
+seriesTypes.errorbar = extendClass(seriesTypes.boxplot, {
+	type: 'errorbar',
+	pointArrayMap: ['low', 'high'], // array point configs are mapped to this
+	toYData: function (point) { // return a plain array for speedy calculation
+		return [point.low, point.high];
+	},
+	pointValKey: 'high', // defines the top of the tracker
+	doQuartiles: false,
+
+	/**
+	 * Get the width and X offset, either on top of the linked series column
+	 * or standalone
+	 */
+	getColumnMetrics: function () {
+		return (this.linkedParent && this.linkedParent.columnMetrics) || 
+			seriesTypes.column.prototype.getColumnMetrics.call(this);
+	}
+});
+
+/* ****************************************************************************
+ * End error bar series code                                                  *
+ *****************************************************************************/
+/* ****************************************************************************
+ * Start Waterfall series code                                                *
+ *****************************************************************************/
+
+// 1 - set default options
+defaultPlotOptions.waterfall = merge(defaultPlotOptions.column, {
+	lineWidth: 1,
+	lineColor: '#333',
+	dashStyle: 'dot',
+	borderColor: '#333'
+});
+
+
+// 2 - Create the series object
+seriesTypes.waterfall = extendClass(seriesTypes.column, {
+	type: 'waterfall',
+
+	upColorProp: 'fill',
+
+	pointArrayMap: ['low', 'y'],
+
+	pointValKey: 'y',
+
+	/**
+	 * Init waterfall series, force stacking
+	 */
+	init: function (chart, options) {
+		// force stacking
+		options.stacking = true;
+
+		seriesTypes.column.prototype.init.call(this, chart, options);
+	},
+
+
+	/**
+	 * Translate data points from raw values
+	 */
+	translate: function () {
+		var series = this,
+			options = series.options,
+			axis = series.yAxis,
+			len,
+			i,
+			points,
+			point,
+			shapeArgs,
+			stack,
+			y,
+			previousY,
+			stackPoint,
+			threshold = options.threshold,
+			crispCorr = (options.borderWidth % 2) / 2;
+
+		// run column series translate
+		seriesTypes.column.prototype.translate.apply(this);
+
+		previousY = threshold;
+		points = series.points;
+
+		for (i = 0, len = points.length; i < len; i++) {
+			// cache current point object
+			point = points[i];
+			shapeArgs = point.shapeArgs;
+
+			// get current stack
+			stack = series.getStack(i);
+			stackPoint = stack.points[series.index];
+
+			// override point value for sums
+			if (isNaN(point.y)) {
+				point.y = series.yData[i];
+			}
+
+			// up points
+			y = mathMax(previousY, previousY + point.y) + stackPoint[0];
+			shapeArgs.y = axis.translate(y, 0, 1);
+
+
+			// sum points
+			if (point.isSum || point.isIntermediateSum) {
+				shapeArgs.y = axis.translate(stackPoint[1], 0, 1);
+				shapeArgs.height = axis.translate(stackPoint[0], 0, 1) - shapeArgs.y;
+
+			// if it's not the sum point, update previous stack end position
+			} else {
+				previousY += stack.total;
+			}
+
+			// negative points
+			if (shapeArgs.height < 0) {
+				shapeArgs.y += shapeArgs.height;
+				shapeArgs.height *= -1;
+			}
+
+			point.plotY = shapeArgs.y = mathRound(shapeArgs.y) - crispCorr;
+			shapeArgs.height = mathRound(shapeArgs.height);
+			point.yBottom = shapeArgs.y + shapeArgs.height;
+		}
+	},
+
+	/**
+	 * Call default processData then override yData to reflect waterfall's extremes on yAxis
+	 */
+	processData: function (force) {
+		var series = this,
+			options = series.options,
+			yData = series.yData,
+			points = series.points,
+			point,
+			dataLength = yData.length,
+			threshold = options.threshold || 0,
+			subSum,
+			sum,
+			dataMin,
+			dataMax,
+			y,
+			i;
+
+		sum = subSum = dataMin = dataMax = threshold;
+
+		for (i = 0; i < dataLength; i++) {
+			y = yData[i];
+			point = points && points[i] ? points[i] : {};
+
+			if (y === "sum" || point.isSum) {
+				yData[i] = sum;
+			} else if (y === "intermediateSum" || point.isIntermediateSum) {
+				yData[i] = subSum;
+				subSum = threshold;
+			} else {
+				sum += y;
+				subSum += y;
+			}
+			dataMin = Math.min(sum, dataMin);
+			dataMax = Math.max(sum, dataMax);
+		}
+
+		Series.prototype.processData.call(this, force);
+
+		// Record extremes
+		series.dataMin = dataMin;
+		series.dataMax = dataMax;
+	},
+
+	/**
+	 * Return y value or string if point is sum
+	 */
+	toYData: function (pt) {
+		if (pt.isSum) {
+			return "sum";
+		} else if (pt.isIntermediateSum) {
+			return "intermediateSum";
+		}
+
+		return pt.y;
+	},
+
+	/**
+	 * Postprocess mapping between options and SVG attributes
+	 */
+	getAttribs: function () {
+		seriesTypes.column.prototype.getAttribs.apply(this, arguments);
+
+		var series = this,
+			options = series.options,
+			stateOptions = options.states,
+			upColor = options.upColor || series.color,
+			hoverColor = Highcharts.Color(upColor).brighten(0.1).get(),
+			seriesDownPointAttr = merge(series.pointAttr),
+			upColorProp = series.upColorProp;
+
+		seriesDownPointAttr[''][upColorProp] = upColor;
+		seriesDownPointAttr.hover[upColorProp] = stateOptions.hover.upColor || hoverColor;
+		seriesDownPointAttr.select[upColorProp] = stateOptions.select.upColor || upColor;
+
+		each(series.points, function (point) {
+			if (point.y > 0 && !point.color) {
+				point.pointAttr = seriesDownPointAttr;
+				point.color = upColor;
+			}
+		});
+	},
+
+	/**
+	 * Draw columns' connector lines
+	 */
+	getGraphPath: function () {
+
+		var data = this.data,
+			length = data.length,
+			lineWidth = this.options.lineWidth + this.options.borderWidth,
+			normalizer = mathRound(lineWidth) % 2 / 2,
+			path = [],
+			M = 'M',
+			L = 'L',
+			prevArgs,
+			pointArgs,
+			i,
+			d;
+
+		for (i = 1; i < length; i++) {
+			pointArgs = data[i].shapeArgs;
+			prevArgs = data[i - 1].shapeArgs;
+
+			d = [
+				M,
+				prevArgs.x + prevArgs.width, prevArgs.y + normalizer,
+				L,
+				pointArgs.x, prevArgs.y + normalizer
+			];
+
+			if (data[i - 1].y < 0) {
+				d[2] += prevArgs.height;
+				d[5] += prevArgs.height;
+			}
+
+			path = path.concat(d);
+		}
+
+		return path;
+	},
+
+	/**
+	 * Extremes are recorded in processData
+	 */
+	getExtremes: noop,
+
+	/**
+	 * Return stack for given index
+	 */
+	getStack: function (i) {
+		var axis = this.yAxis,
+			stacks = axis.stacks,
+			key = this.stackKey;
+
+		if (this.processedYData[i] < this.options.threshold) {
+			key = '-' + key;
+		}
+
+		return stacks[key][i];
+	},
+
+	drawGraph: Series.prototype.drawGraph
+});
+
+/* ****************************************************************************
+ * End Waterfall series code                                                  *
+ *****************************************************************************/
+/* ****************************************************************************
+ * Start Bubble series code											          *
+ *****************************************************************************/
+
+// 1 - set default options
+defaultPlotOptions.bubble = merge(defaultPlotOptions.scatter, {
+	dataLabels: {
+		inside: true,
+		style: {
+			color: 'white',
+			textShadow: '0px 0px 3px black'
+		},
+		verticalAlign: 'middle'
+	},
+	// displayNegative: true,
+	marker: {
+		// fillOpacity: 0.5,
+		lineColor: null, // inherit from series.color
+		lineWidth: 1
+	},
+	minSize: 8,
+	maxSize: '20%',
+	// negativeColor: null,
+	tooltip: {
+		pointFormat: '({point.x}, {point.y}), Size: {point.z}'
+	},
+	turboThreshold: 0,
+	zThreshold: 0
+});
+
+// 2 - Create the series object
+seriesTypes.bubble = extendClass(seriesTypes.scatter, {
+	type: 'bubble',
+	pointArrayMap: ['y', 'z'],
+	trackerGroups: ['group', 'dataLabelsGroup'],
+	
+	/**
+	 * Mapping between SVG attributes and the corresponding options
+	 */
+	pointAttrToOptions: { 
+		stroke: 'lineColor',
+		'stroke-width': 'lineWidth',
+		fill: 'fillColor'
+	},
+	
+	/**
+	 * Apply the fillOpacity to all fill positions
+	 */
+	applyOpacity: function (fill) {
+		var markerOptions = this.options.marker,
+			fillOpacity = pick(markerOptions.fillOpacity, 0.5);
+		
+		// When called from Legend.colorizeItem, the fill isn't predefined
+		fill = fill || markerOptions.fillColor || this.color; 
+		
+		if (fillOpacity !== 1) {
+			fill = Highcharts.Color(fill).setOpacity(fillOpacity).get('rgba');
+		}
+		return fill;
+	},
+	
+	/**
+	 * Extend the convertAttribs method by applying opacity to the fill
+	 */
+	convertAttribs: function () {
+		var obj = Series.prototype.convertAttribs.apply(this, arguments);
+		
+		obj.fill = this.applyOpacity(obj.fill);
+		
+		return obj;
+	},
+
+	/**
+	 * Get the radius for each point based on the minSize, maxSize and each point's Z value. This
+	 * must be done prior to Series.translate because the axis needs to add padding in 
+	 * accordance with the point sizes.
+	 */
+	getRadii: function (zMin, zMax, minSize, maxSize) {
+		var len,
+			i,
+			pos,
+			zData = this.zData,
+			radii = [],
+			zRange;
+		
+		// Set the shape type and arguments to be picked up in drawPoints
+		for (i = 0, len = zData.length; i < len; i++) {
+			zRange = zMax - zMin;
+			pos = zRange > 0 ? // relative size, a number between 0 and 1
+				(zData[i] - zMin) / (zMax - zMin) : 
+				0.5;
+			radii.push(math.ceil(minSize + pos * (maxSize - minSize)) / 2);
+		}
+		this.radii = radii;
+	},
+	
+	/**
+	 * Perform animation on the bubbles
+	 */
+	animate: function (init) {
+		var animation = this.options.animation;
+		
+		if (!init) { // run the animation
+			each(this.points, function (point) {
+				var graphic = point.graphic,
+					shapeArgs = point.shapeArgs;
+
+				if (graphic && shapeArgs) {
+					// start values
+					graphic.attr('r', 1);
+
+					// animate
+					graphic.animate({
+						r: shapeArgs.r
+					}, animation);
+				}
+			});
+
+			// delete this function to allow it only once
+			this.animate = null;
+		}
+	},
+	
+	/**
+	 * Extend the base translate method to handle bubble size
+	 */
+	translate: function () {
+		
+		var i,
+			data = this.data,
+			point,
+			radius,
+			radii = this.radii;
+		
+		// Run the parent method
+		seriesTypes.scatter.prototype.translate.call(this);
+		
+		// Set the shape type and arguments to be picked up in drawPoints
+		i = data.length;
+		
+		while (i--) {
+			point = data[i];
+			radius = radii ? radii[i] : 0; // #1737
+
+			// Flag for negativeColor to be applied in Series.js
+			point.negative = point.z < (this.options.zThreshold || 0);
+			
+			if (radius >= this.minPxSize / 2) {
+				// Shape arguments
+				point.shapeType = 'circle';
+				point.shapeArgs = {
+					x: point.plotX,
+					y: point.plotY,
+					r: radius
+				};
+				
+				// Alignment box for the data label
+				point.dlBox = {
+					x: point.plotX - radius,
+					y: point.plotY - radius,
+					width: 2 * radius,
+					height: 2 * radius
+				};
+			} else { // below zThreshold
+				point.shapeArgs = point.plotY = point.dlBox = UNDEFINED; // #1691
+			}
+		}
+	},
+	
+	/**
+	 * Get the series' symbol in the legend
+	 * 
+	 * @param {Object} legend The legend object
+	 * @param {Object} item The series (this) or point
+	 */
+	drawLegendSymbol: function (legend, item) {
+		var radius = pInt(legend.itemStyle.fontSize) / 2;
+		
+		item.legendSymbol = this.chart.renderer.circle(
+			radius,
+			legend.baseline - radius,
+			radius
+		).attr({
+			zIndex: 3
+		}).add(item.legendGroup);
+		item.legendSymbol.isMarker = true;	
+		
+	},
+	
+	drawPoints: seriesTypes.column.prototype.drawPoints,
+	alignDataLabel: seriesTypes.column.prototype.alignDataLabel
+});
+
+/**
+ * Add logic to pad each axis with the amount of pixels
+ * necessary to avoid the bubbles to overflow.
+ */
+Axis.prototype.beforePadding = function () {
+	var axis = this,
+		axisLength = this.len,
+		chart = this.chart,
+		pxMin = 0, 
+		pxMax = axisLength,
+		isXAxis = this.isXAxis,
+		dataKey = isXAxis ? 'xData' : 'yData',
+		min = this.min,
+		extremes = {},
+		smallestSize = math.min(chart.plotWidth, chart.plotHeight),
+		zMin = Number.MAX_VALUE,
+		zMax = -Number.MAX_VALUE,
+		range = this.max - min,
+		transA = axisLength / range,
+		activeSeries = [];
+
+	// Handle padding on the second pass, or on redraw
+	if (this.tickPositions) {
+		each(this.series, function (series) {
+
+			var seriesOptions = series.options,
+				zData;
+
+			if (series.type === 'bubble' && series.visible) {
+
+				// Correction for #1673
+				axis.allowZoomOutside = true;
+
+				// Cache it
+				activeSeries.push(series);
+
+				if (isXAxis) { // because X axis is evaluated first
+				
+					// For each series, translate the size extremes to pixel values
+					each(['minSize', 'maxSize'], function (prop) {
+						var length = seriesOptions[prop],
+							isPercent = /%$/.test(length);
+						
+						length = pInt(length);
+						extremes[prop] = isPercent ?
+							smallestSize * length / 100 :
+							length;
+						
+					});
+					series.minPxSize = extremes.minSize;
+					
+					// Find the min and max Z
+					zData = series.zData;
+					if (zData.length) { // #1735
+						zMin = math.min(
+							zMin,
+							math.max(
+								arrayMin(zData), 
+								seriesOptions.displayNegative === false ? seriesOptions.zThreshold : -Number.MAX_VALUE
+							)
+						);
+						zMax = math.max(zMax, arrayMax(zData));
+					}
+				}
+			}
+		});
+
+		each(activeSeries, function (series) {
+
+			var data = series[dataKey],
+				i = data.length,
+				radius;
+
+			if (isXAxis) {
+				series.getRadii(zMin, zMax, extremes.minSize, extremes.maxSize);
+			}
+			
+			if (range > 0) {
+				while (i--) {
+					radius = series.radii[i];
+					pxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);
+					pxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);
+				}
+			}
+		});
+		
+		if (activeSeries.length && range > 0 && pick(this.options.min, this.userMin) === UNDEFINED && pick(this.options.max, this.userMax) === UNDEFINED) {
+			pxMax -= axisLength;
+			transA *= (axisLength + pxMin - pxMax) / axisLength;
+			this.min += pxMin / transA;
+			this.max += pxMax / transA;
+		}
+	}
+};
+
+/* ****************************************************************************
+ * End Bubble series code                                                     *
+ *****************************************************************************/
+/**
+ * Extensions for polar charts. Additionally, much of the geometry required for polar charts is
+ * gathered in RadialAxes.js.
+ * 
+ */
+
+var seriesProto = Series.prototype,
+	pointerProto = Highcharts.Pointer.prototype;
+
+
+
+/**
+ * Translate a point's plotX and plotY from the internal angle and radius measures to 
+ * true plotX, plotY coordinates
+ */
+seriesProto.toXY = function (point) {
+	var xy,
+		chart = this.chart,
+		plotX = point.plotX,
+		plotY = point.plotY;
+	
+	// Save rectangular plotX, plotY for later computation
+	point.rectPlotX = plotX;
+	point.rectPlotY = plotY;
+	
+	// Record the angle in degrees for use in tooltip
+	point.clientX = ((plotX / Math.PI * 180) + this.xAxis.pane.options.startAngle) % 360;
+	
+	// Find the polar plotX and plotY
+	xy = this.xAxis.postTranslate(point.plotX, this.yAxis.len - plotY);
+	point.plotX = point.polarPlotX = xy.x - chart.plotLeft;
+	point.plotY = point.polarPlotY = xy.y - chart.plotTop;
+};
+
+/** 
+ * Order the tooltip points to get the mouse capture ranges correct. #1915. 
+ */
+seriesProto.orderTooltipPoints = function (points) {
+	if (this.chart.polar) {
+		points.sort(function (a, b) {
+			return a.clientX - b.clientX;
+		});
+
+		// Wrap mouse tracking around to capture movement on the segment to the left
+		// of the north point (#1469, #2093).
+		if (points[0]) {
+			points[0].wrappedClientX = points[0].clientX + 360;
+			points.push(points[0]);
+		}
+	}
+};
+
+
+/**
+ * Add some special init logic to areas and areasplines
+ */
+function initArea(proceed, chart, options) {
+	proceed.call(this, chart, options);
+	if (this.chart.polar) {
+		
+		/**
+		 * Overridden method to close a segment path. While in a cartesian plane the area 
+		 * goes down to the threshold, in the polar chart it goes to the center.
+		 */
+		this.closeSegment = function (path) {
+			var center = this.xAxis.center;
+			path.push(
+				'L',
+				center[0],
+				center[1]
+			);			
+		};
+		
+		// Instead of complicated logic to draw an area around the inner area in a stack,
+		// just draw it behind
+		this.closedStacks = true;
+	}
+}
+wrap(seriesTypes.area.prototype, 'init', initArea);
+wrap(seriesTypes.areaspline.prototype, 'init', initArea);
+		
+
+/**
+ * Overridden method for calculating a spline from one point to the next
+ */
+wrap(seriesTypes.spline.prototype, 'getPointSpline', function (proceed, segment, point, i) {
+	
+	var ret,
+		smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc;
+		denom = smoothing + 1,
+		plotX, 
+		plotY,
+		lastPoint,
+		nextPoint,
+		lastX,
+		lastY,
+		nextX,
+		nextY,
+		leftContX,
+		leftContY,
+		rightContX,
+		rightContY,
+		distanceLeftControlPoint,
+		distanceRightControlPoint,
+		leftContAngle,
+		rightContAngle,
+		jointAngle;
+		
+		
+	if (this.chart.polar) {
+		
+		plotX = point.plotX;
+		plotY = point.plotY;
+		lastPoint = segment[i - 1];
+		nextPoint = segment[i + 1];
+			
+		// Connect ends
+		if (this.connectEnds) {
+			if (!lastPoint) {
+				lastPoint = segment[segment.length - 2]; // not the last but the second last, because the segment is already connected
+			}
+			if (!nextPoint) {
+				nextPoint = segment[1];
+			}	
+		}
+
+		// find control points
+		if (lastPoint && nextPoint) {
+		
+			lastX = lastPoint.plotX;
+			lastY = lastPoint.plotY;
+			nextX = nextPoint.plotX;
+			nextY = nextPoint.plotY;
+			leftContX = (smoothing * plotX + lastX) / denom;
+			leftContY = (smoothing * plotY + lastY) / denom;
+			rightContX = (smoothing * plotX + nextX) / denom;
+			rightContY = (smoothing * plotY + nextY) / denom;
+			distanceLeftControlPoint = Math.sqrt(Math.pow(leftContX - plotX, 2) + Math.pow(leftContY - plotY, 2));
+			distanceRightControlPoint = Math.sqrt(Math.pow(rightContX - plotX, 2) + Math.pow(rightContY - plotY, 2));
+			leftContAngle = Math.atan2(leftContY - plotY, leftContX - plotX);
+			rightContAngle = Math.atan2(rightContY - plotY, rightContX - plotX);
+			jointAngle = (Math.PI / 2) + ((leftContAngle + rightContAngle) / 2);
+				
+				
+			// Ensure the right direction, jointAngle should be in the same quadrant as leftContAngle
+			if (Math.abs(leftContAngle - jointAngle) > Math.PI / 2) {
+				jointAngle -= Math.PI;
+			}
+			
+			// Find the corrected control points for a spline straight through the point
+			leftContX = plotX + Math.cos(jointAngle) * distanceLeftControlPoint;
+			leftContY = plotY + Math.sin(jointAngle) * distanceLeftControlPoint;
+			rightContX = plotX + Math.cos(Math.PI + jointAngle) * distanceRightControlPoint;
+			rightContY = plotY + Math.sin(Math.PI + jointAngle) * distanceRightControlPoint;
+			
+			// Record for drawing in next point
+			point.rightContX = rightContX;
+			point.rightContY = rightContY;
+
+		}
+		
+		
+		// moveTo or lineTo
+		if (!i) {
+			ret = ['M', plotX, plotY];
+		} else { // curve from last point to this
+			ret = [
+				'C',
+				lastPoint.rightContX || lastPoint.plotX,
+				lastPoint.rightContY || lastPoint.plotY,
+				leftContX || plotX,
+				leftContY || plotY,
+				plotX,
+				plotY
+			];
+			lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later
+		}
+		
+		
+	} else {
+		ret = proceed.call(this, segment, point, i);
+	}
+	return ret;
+});
+
+/**
+ * Extend translate. The plotX and plotY values are computed as if the polar chart were a
+ * cartesian plane, where plotX denotes the angle in radians and (yAxis.len - plotY) is the pixel distance from
+ * center. 
+ */
+wrap(seriesProto, 'translate', function (proceed) {
+		
+	// Run uber method
+	proceed.call(this);
+	
+	// Postprocess plot coordinates
+	if (this.chart.polar && !this.preventPostTranslate) {
+		var points = this.points,
+			i = points.length;
+		while (i--) {
+			// Translate plotX, plotY from angle and radius to true plot coordinates
+			this.toXY(points[i]);
+		}
+	}
+});
+
+/** 
+ * Extend getSegmentPath to allow connecting ends across 0 to provide a closed circle in 
+ * line-like series.
+ */
+wrap(seriesProto, 'getSegmentPath', function (proceed, segment) {
+		
+	var points = this.points;
+	
+	// Connect the path
+	if (this.chart.polar && this.options.connectEnds !== false && 
+			segment[segment.length - 1] === points[points.length - 1] && points[0].y !== null) {
+		this.connectEnds = true; // re-used in splines
+		segment = [].concat(segment, [points[0]]);
+	}
+	
+	// Run uber method
+	return proceed.call(this, segment);
+	
+});
+
+
+function polarAnimate(proceed, init) {
+	var chart = this.chart,
+		animation = this.options.animation,
+		group = this.group,
+		markerGroup = this.markerGroup,
+		center = this.xAxis.center,
+		plotLeft = chart.plotLeft,
+		plotTop = chart.plotTop,
+		attribs;
+
+	// Specific animation for polar charts
+	if (chart.polar) {
+		
+		// Enable animation on polar charts only in SVG. In VML, the scaling is different, plus animation
+		// would be so slow it would't matter.
+		if (chart.renderer.isSVG) {
+
+			if (animation === true) {
+				animation = {};
+			}
+	
+			// Initialize the animation
+			if (init) {
+				
+				// Scale down the group and place it in the center
+				attribs = {
+					translateX: center[0] + plotLeft,
+					translateY: center[1] + plotTop,
+					scaleX: 0.001, // #1499
+					scaleY: 0.001
+				};
+					
+				group.attr(attribs);
+				if (markerGroup) {
+					markerGroup.attrSetters = group.attrSetters;
+					markerGroup.attr(attribs);
+				}
+				
+			// Run the animation
+			} else {
+				attribs = {
+					translateX: plotLeft,
+					translateY: plotTop,
+					scaleX: 1,
+					scaleY: 1
+				};
+				group.animate(attribs, animation);
+				if (markerGroup) {
+					markerGroup.animate(attribs, animation);
+				}
+				
+				// Delete this function to allow it only once
+				this.animate = null;
+			}
+		}
+	
+	// For non-polar charts, revert to the basic animation
+	} else {
+		proceed.call(this, init);
+	} 
+}
+
+// Define the animate method for both regular series and column series and their derivatives
+wrap(seriesProto, 'animate', polarAnimate);
+wrap(colProto, 'animate', polarAnimate);
+
+
+/**
+ * Throw in a couple of properties to let setTooltipPoints know we're indexing the points
+ * in degrees (0-360), not plot pixel width.
+ */
+wrap(seriesProto, 'setTooltipPoints', function (proceed, renew) {
+		
+	if (this.chart.polar) {
+		extend(this.xAxis, {
+			tooltipLen: 360 // degrees are the resolution unit of the tooltipPoints array
+		});	
+	}
+	
+	// Run uber method
+	return proceed.call(this, renew);
+});
+
+
+/**
+ * Extend the column prototype's translate method
+ */
+wrap(colProto, 'translate', function (proceed) {
+		
+	var xAxis = this.xAxis,
+		len = this.yAxis.len,
+		center = xAxis.center,
+		startAngleRad = xAxis.startAngleRad,
+		renderer = this.chart.renderer,
+		start,
+		points,
+		point,
+		i;
+	
+	this.preventPostTranslate = true;
+	
+	// Run uber method
+	proceed.call(this);
+	
+	// Postprocess plot coordinates
+	if (xAxis.isRadial) {
+		points = this.points;
+		i = points.length;
+		while (i--) {
+			point = points[i];
+			start = point.barX + startAngleRad;
+			point.shapeType = 'path';
+			point.shapeArgs = {
+				d: renderer.symbols.arc(
+					center[0],
+					center[1],
+					len - point.plotY,
+					null, 
+					{
+						start: start,
+						end: start + point.pointWidth,
+						innerR: len - pick(point.yBottom, len)
+					}
+				)
+			};
+			this.toXY(point); // provide correct plotX, plotY for tooltip
+		}
+	}
+});
+
+
+/**
+ * Align column data labels outside the columns. #1199.
+ */
+wrap(colProto, 'alignDataLabel', function (proceed, point, dataLabel, options, alignTo, isNew) {
+	
+	if (this.chart.polar) {
+		var angle = point.rectPlotX / Math.PI * 180,
+			align,
+			verticalAlign;
+		
+		// Align nicely outside the perimeter of the columns
+		if (options.align === null) {
+			if (angle > 20 && angle < 160) {
+				align = 'left'; // right hemisphere
+			} else if (angle > 200 && angle < 340) {
+				align = 'right'; // left hemisphere
+			} else {
+				align = 'center'; // top or bottom
+			}
+			options.align = align;
+		}
+		if (options.verticalAlign === null) {
+			if (angle < 45 || angle > 315) {
+				verticalAlign = 'bottom'; // top part
+			} else if (angle > 135 && angle < 225) {
+				verticalAlign = 'top'; // bottom part
+			} else {
+				verticalAlign = 'middle'; // left or right
+			}
+			options.verticalAlign = verticalAlign;
+		}
+		
+		seriesProto.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);
+	} else {
+		proceed.call(this, point, dataLabel, options, alignTo, isNew);
+	}
+	
+});
+
+/**
+ * Extend the mouse tracker to return the tooltip position index in terms of
+ * degrees rather than pixels
+ */
+wrap(pointerProto, 'getIndex', function (proceed, e) {
+	var ret,
+		chart = this.chart,
+		center,
+		x,
+		y;
+	
+	if (chart.polar) {
+		center = chart.xAxis[0].center;
+		x = e.chartX - center[0] - chart.plotLeft;
+		y = e.chartY - center[1] - chart.plotTop;
+		
+		ret = 180 - Math.round(Math.atan2(x, y) / Math.PI * 180);
+	
+	} else {
+	
+		// Run uber method
+		ret = proceed.call(this, e);
+	}
+	return ret;
+});
+
+/**
+ * Extend getCoordinates to prepare for polar axis values
+ */
+wrap(pointerProto, 'getCoordinates', function (proceed, e) {
+	var chart = this.chart,
+		ret = {
+			xAxis: [],
+			yAxis: []
+		};
+	
+	if (chart.polar) {	
+
+		each(chart.axes, function (axis) {
+			var isXAxis = axis.isXAxis,
+				center = axis.center,
+				x = e.chartX - center[0] - chart.plotLeft,
+				y = e.chartY - center[1] - chart.plotTop;
+			
+			ret[isXAxis ? 'xAxis' : 'yAxis'].push({
+				axis: axis,
+				value: axis.translate(
+					isXAxis ?
+						Math.PI - Math.atan2(x, y) : // angle 
+						Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)), // distance from center
+					true
+				)
+			});
+		});
+		
+	} else {
+		ret = proceed.call(this, e);
+	}
+	
+	return ret;
+});
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts.js
new file mode 100644
index 0000000..f8edd5f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts.js
@@ -0,0 +1,283 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+
+ (c) 2009-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(){function r(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function x(){var a,b=arguments.length,c={},d=function(a,b){var c,h;typeof a!=="object"&&(a={});for(h in b)b.hasOwnProperty(h)&&(c=b[h],a[h]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&typeof c.nodeType!=="number"?d(a[h]||{},c):b[h]);return a};for(a=0;a<b;a++)c=d(c,arguments[a]);return c}function C(a,b){return parseInt(a,b||10)}function ea(a){return typeof a==="string"}function T(a){return typeof a===
+"object"}function Ia(a){return Object.prototype.toString.call(a)==="[object Array]"}function sa(a){return typeof a==="number"}function na(a){return R.log(a)/R.LN10}function fa(a){return R.pow(10,a)}function ga(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function u(a){return a!==w&&a!==null}function v(a,b,c){var d,e;if(ea(b))u(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(u(b)&&T(b))for(d in b)a.setAttribute(d,b[d]);return e}function ja(a){return Ia(a)?
+a:[a]}function o(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],typeof c!=="undefined"&&c!==null)return c}function K(a,b){if(ta&&b&&b.opacity!==w)b.filter="alpha(opacity="+b.opacity*100+")";r(a.style,b)}function U(a,b,c,d,e){a=y.createElement(a);b&&r(a,b);e&&K(a,{padding:0,border:S,margin:0});c&&K(a,c);d&&d.appendChild(a);return a}function ha(a,b){var c=function(){};c.prototype=new a;r(c.prototype,b);return c}function Aa(a,b,c,d){var e=M.lang,a=+a||0,f=b===-1?(a.toString().split(".")[1]||
+"").length:isNaN(b=N(b))?2:b,b=c===void 0?e.decimalPoint:c,d=d===void 0?e.thousandsSep:d,e=a<0?"-":"",c=String(C(a=N(a).toFixed(f))),g=c.length>3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+N(a-c).toFixed(f).slice(2):"")}function Ba(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function mb(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this,a)}}function Ca(a,b){for(var c="{",d=!1,
+e,f,g,h,i,j=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h<i;h++)e=e[g[h]];if(f.length)f=f.join(":"),g=/\.([0-9])/,h=M.lang,i=void 0,/f$/.test(f)?(i=(i=f.match(g))?i[1]:-1,e=Aa(e,i,h.decimalPoint,f.indexOf(",")>-1?h.thousandsSep:"")):e=Xa(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function nb(a){return R.pow(10,P(R.log(a)/R.LN10))}function ob(a,b,c,d){var e,c=o(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals===
+!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(a=b[d],e<=(b[d]+(b[d+1]||b[d]))/2)break;a*=c;return a}function Cb(a,b){var c=b||[[Db,[1,2,5,10,20,25,50,100,200,500]],[pb,[1,2,5,10,15,30]],[Ya,[1,2,5,10,15,30]],[Qa,[1,2,3,4,6,8,12]],[ua,[1,2]],[Za,[1,2]],[Ra,[1,2,3,4,6]],[Da,null]],d=c[c.length-1],e=D[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=D[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+D[c[g+1][0]])/2)break;e===D[Da]&&a<5*e&&(f=[1,2,5]);c=ob(a/e,f,d[0]===Da?nb(a/e):1);
+return{unitRange:e,count:c,unitName:d[0]}}function Eb(a,b,c,d){var e=[],f={},g=M.global.useUTC,h,i=new Date(b),j=a.unitRange,k=a.count;if(u(b)){j>=D[pb]&&(i.setMilliseconds(0),i.setSeconds(j>=D[Ya]?0:k*P(i.getSeconds()/k)));if(j>=D[Ya])i[Fb](j>=D[Qa]?0:k*P(i[qb]()/k));if(j>=D[Qa])i[Gb](j>=D[ua]?0:k*P(i[rb]()/k));if(j>=D[ua])i[sb](j>=D[Ra]?1:k*P(i[Sa]()/k));j>=D[Ra]&&(i[Hb](j>=D[Da]?0:k*P(i[$a]()/k)),h=i[ab]());j>=D[Da]&&(h-=h%k,i[Ib](h));if(j===D[Za])i[sb](i[Sa]()-i[tb]()+o(d,1));b=1;h=i[ab]();for(var d=
+i.getTime(),l=i[$a](),m=i[Sa](),p=g?0:(864E5+i.getTimezoneOffset()*6E4)%864E5;d<c;)e.push(d),j===D[Da]?d=bb(h+b*k,0):j===D[Ra]?d=bb(h,l+b*k):!g&&(j===D[ua]||j===D[Za])?d=bb(h,l,m+b*k*(j===D[ua]?1:7)):d+=j*k,b++;e.push(d);n(ub(e,function(a){return j<=D[Qa]&&a%D[ua]===p}),function(a){f[a]=ua})}e.info=r(a,{higherRanks:f,totalRange:j*k});return e}function Jb(){this.symbol=this.color=0}function Kb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].ss_i=e;a.sort(function(a,c){d=b(a,c);return d===0?a.ss_i-c.ss_i:
+d});for(e=0;e<c;e++)delete a[e].ss_i}function Ja(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function va(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);return c}function Ka(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Ta(a){cb||(cb=U(Ea));a&&cb.appendChild(a);cb.innerHTML=""}function ka(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;else O.console&&console.log(c)}function ia(a){return parseFloat(a.toPrecision(14))}
+function La(a,b){Fa=o(a,b.animation)}function Lb(){var a=M.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";bb=a?Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,o(c,1),o(g,0),o(h,0),o(i,0))).getTime()};qb=b+"Minutes";rb=b+"Hours";tb=b+"Day";Sa=b+"Date";$a=b+"Month";ab=b+"FullYear";Fb=c+"Minutes";Gb=c+"Hours";sb=c+"Date";Hb=c+"Month";Ib=c+"FullYear"}function wa(){}function Ma(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function vb(a,b){this.axis=a;if(b)this.options=
+b,this.id=b.id}function Mb(a,b,c,d,e,f){var g=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=null;this.points={};this.stack=e;this.percent=f==="percent";this.alignOptions={align:b.align||(g?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(g?"middle":c?"bottom":"top"),y:o(b.y,g?4:c?14:-6),x:o(b.x,g?c?-6:6:0)};this.textAlign=b.textAlign||(g?c?"right":"left":"center")}function db(){this.init.apply(this,arguments)}function wb(){this.init.apply(this,arguments)}
+function xb(a,b){this.init(a,b)}function eb(a,b){this.init(a,b)}function yb(){this.init.apply(this,arguments)}var w,y=document,O=window,R=Math,t=R.round,P=R.floor,xa=R.ceil,s=R.max,I=R.min,N=R.abs,V=R.cos,ca=R.sin,ya=R.PI,Ua=ya*2/360,oa=navigator.userAgent,Nb=O.opera,ta=/msie/i.test(oa)&&!Nb,fb=y.documentMode===8,gb=/AppleWebKit/.test(oa),hb=/Firefox/.test(oa),Ob=/(Mobile|Android|Windows Phone)/.test(oa),za="http://www.w3.org/2000/svg",Z=!!y.createElementNS&&!!y.createElementNS(za,"svg").createSVGRect,
+Ub=hb&&parseInt(oa.split("Firefox/")[1],10)<4,$=!Z&&!ta&&!!y.createElement("canvas").getContext,Va,ib=y.documentElement.ontouchstart!==w,Pb={},zb=0,cb,M,Xa,Fa,Ab,D,pa=function(){},Ga=[],Ea="div",S="none",Qb="rgba(192,192,192,"+(Z?1.0E-4:0.002)+")",Db="millisecond",pb="second",Ya="minute",Qa="hour",ua="day",Za="week",Ra="month",Da="year",Rb="stroke-width",bb,qb,rb,tb,Sa,$a,ab,Fb,Gb,sb,Hb,Ib,W={};O.Highcharts=O.Highcharts?ka(16,!0):{};Xa=function(a,b,c){if(!u(b)||isNaN(b))return"Invalid date";var a=
+o(a,"%Y-%m-%d %H:%M:%S"),d=new Date(b),e,f=d[rb](),g=d[tb](),h=d[Sa](),i=d[$a](),j=d[ab](),k=M.lang,l=k.weekdays,d=r({a:l[g].substr(0,3),A:l[g],d:Ba(h),e:h,b:k.shortMonths[i],B:k.months[i],m:Ba(i+1),y:j.toString().substr(2,2),Y:j,H:Ba(f),I:Ba(f%12||12),l:f%12||12,M:Ba(d[qb]()),p:f<12?"AM":"PM",P:f<12?"am":"pm",S:Ba(d.getSeconds()),L:Ba(t(b%1E3),3)},Highcharts.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+
+a.substr(1):a};Jb.prototype={wrapColor:function(a){if(this.color>=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};D=function(){for(var a=0,b=arguments,c=b.length,d={};a<c;a++)d[b[a++]]=b[a];return d}(Db,1,pb,1E3,Ya,6E4,Qa,36E5,ua,864E5,Za,6048E5,Ra,26784E5,Da,31556952E3);Ab={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&
+(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=[].concat(b).splice(b.length-f,f),e&&(d[f-6]=d[f-2],d[f-5]=d[f-1]),b=b.concat(d);h&&(b=b.concat(h),c=c.concat(i));return[b,c]},step:function(a,b,c,d){var e=[],f=a.length;if(c===1)e=d;else if(f===b.length&&c<1)for(;f--;)d=parseFloat(a[f]),e[f]=isNaN(d)?a[f]:c*parseFloat(b[f]-d)+d;else e=b;return e}};
+(function(a){O.HighchartsAdapter=O.HighchartsAdapter||a&&{init:function(b){var c=a.fx,d=c.step,e,f=a.Tween,g=f&&f.propHooks;e=a.cssHooks.opacity;a.extend(a.easing,{easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c}});a.each(["cur","_default","width","height","opacity"],function(a,b){var e=d,k,l;b==="cur"?e=c.prototype:b==="_default"&&f&&(e=g[b],b="set");(k=e[b])&&(e[b]=function(c){c=a?c:this;if(c.prop!=="align")return l=c.elem,l.attr?l.attr(c.prop,b==="cur"?w:c.now):k.apply(this,arguments)})});
+mb(e,"get",function(a,b,c){return b.attr?b.opacity||0:a.call(this,b,c)});e=function(a){var c=a.elem,d;if(!a.started)d=b.init(c,c.d,c.toD),a.start=d[0],a.end=d[1],a.started=!0;c.attr("d",b.step(a.start,a.end,a.pos,c.toD))};f?g.d={set:e}:d.d=e;this.each=Array.prototype.forEach?function(a,b){return Array.prototype.forEach.call(a,b)}:function(a,b){for(var c=0,d=a.length;c<d;c++)if(b.call(a[c],a[c],c,a)===!1)return c};a.fn.highcharts=function(){var a="Chart",b=arguments,c,d;ea(b[0])&&(a=b[0],b=Array.prototype.slice.call(b,
+1));c=b[0];if(c!==w)c.chart=c.chart||{},c.chart.renderTo=this[0],new Highcharts[a](c,b[1]),d=this;c===w&&(d=Ga[v(this[0],"data-highcharts-chart")]);return d}},getScript:a.getScript,inArray:a.inArray,adapterRun:function(b,c){return a(b)[c]()},grep:a.grep,map:function(a,c){for(var d=[],e=0,f=a.length;e<f;e++)d[e]=c.call(a[e],a[e],e,a);return d},offset:function(b){return a(b).offset()},addEvent:function(b,c,d){a(b).bind(c,d)},removeEvent:function(b,c,d){var e=y.removeEventListener?"removeEventListener":
+"detachEvent";y[e]&&b&&!b[e]&&(b[e]=function(){});a(b).unbind(c,d)},fireEvent:function(b,c,d,e){var f=a.Event(c),g="detached"+c,h;!ta&&d&&(delete d.layerX,delete d.layerY);r(f,d);b[c]&&(b[g]=b[c],b[c]=null);a.each(["preventDefault","stopPropagation"],function(a,b){var c=f[b];f[b]=function(){try{c.call(f)}catch(a){b==="preventDefault"&&(h=!0)}}});a(b).trigger(f);b[g]&&(b[c]=b[g],b[g]=null);e&&!f.isDefaultPrevented()&&!h&&e(f)},washMouseEvent:function(a){var c=a.originalEvent||a;if(c.pageX===w)c.pageX=
+a.pageX,c.pageY=a.pageY;return c},animate:function(b,c,d){var e=a(b);if(!b.style)b.style={};if(c.d)b.toD=c.d,c.d=1;e.stop();c.opacity!==w&&b.attr&&(c.opacity+="px");e.animate(c,d)},stop:function(b){a(b).stop()}}})(O.jQuery);var X=O.HighchartsAdapter,G=X||{};X&&X.init.call(X,Ab);var jb=G.adapterRun,Vb=G.getScript,qa=G.inArray,n=G.each,ub=G.grep,Wb=G.offset,Na=G.map,J=G.addEvent,aa=G.removeEvent,z=G.fireEvent,Xb=G.washMouseEvent,Bb=G.animate,Wa=G.stop,G={enabled:!0,x:0,y:15,style:{color:"#666",cursor:"default",
+fontSize:"11px",lineHeight:"14px"}};M={colors:"#2f7ed8,#0d233a,#8bbc21,#910000,#1aadce,#492970,#f28f43,#77a1e5,#c42525,#a6c96a".split(","),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",
+numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:","},global:{useUTC:!0,canvasToolsURL:"http://code.highcharts.com/3.0.6/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/3.0.6/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:5,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],style:{fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif',
+fontSize:"12px"},backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#274b6d",fontSize:"16px"}},subtitle:{text:"",align:"center",style:{color:"#4d759e"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,marker:{enabled:!0,lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0},select:{fillColor:"#FFFFFF",
+lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:x(G,{align:"center",enabled:!1,formatter:function(){return this.y===null?"":Aa(this.y,-1)},verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,showInLegend:!0,states:{hover:{marker:{}},select:{marker:{}}},stickyTracking:!0}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderWidth:1,borderColor:"#909090",borderRadius:5,navigation:{activeColor:"#274b6d",
+inactiveColor:"#CCC"},shadow:!1,itemStyle:{cursor:"pointer",color:"#274b6d",fontSize:"12px"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolWidth:16,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"1em"},style:{position:"absolute",backgroundColor:"white",opacity:0.5,textAlign:"center"}},tooltip:{enabled:!0,animation:Z,
+backgroundColor:"rgba(255, 255, 255, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',shadow:!0,snap:Ob?25:10,style:{color:"#333333",cursor:"default",
+fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",fontSize:"9px"}}};var Y=M.plotOptions,X=Y.line;Lb();var ra=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Na(a.stops,function(a){return ra(a[1])}):(c=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(a))?b=[C(c[1]),C(c[2]),
+C(c[3]),parseFloat(c[4],10)]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))?b=[C(c[1],16),C(c[2],16),C(c[3],16),1]:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(a))&&(b=[C(c[1]),C(c[2]),C(c[3]),1])})(a);return{get:function(c){var f;d?(f=x(a),f.stops=[].concat(f.stops),n(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)n(d,
+function(b){b.brighten(a)});else if(sa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=C(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this}}};wa.prototype={init:function(a,b){this.element=b==="span"?U(b):y.createElementNS(za,b);this.renderer=a;this.attrSetters={}},opacity:1,animate:function(a,b,c){b=o(b,Fa,!0);Wa(this);if(b){b=x(b);if(c)b.complete=c;Bb(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName.toLowerCase(),
+i=this.renderer,j,k=this.attrSetters,l=this.shadows,m,p,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,h==="circle"?c={x:"cx",y:"cy"}[c]||c:c==="strokeWidth"&&(c="stroke-width"),q=v(g,c)||this[c]||0,c!=="d"&&c!=="visibility"&&c!=="fill"&&(q=parseFloat(q));else{for(c in a)if(j=!1,d=a[c],e=k[c]&&k[c].call(this,d,c),e!==!1){e!==w&&(d=e);if(c==="d")d&&d.join&&(d=d.join(" ")),/(NaN| {2}|^$)/.test(d)&&(d="M 0 0");else if(c==="x"&&h==="text")for(e=0;e<g.childNodes.length;e++)f=g.childNodes[e],v(f,"x")===
+v(g,"x")&&v(f,"x",d);else if(this.rotation&&(c==="x"||c==="y"))p=!0;else if(c==="fill")d=i.color(d,g,c);else if(h==="circle"&&(c==="x"||c==="y"))c={x:"cx",y:"cy"}[c]||c;else if(h==="rect"&&c==="r")v(g,{rx:d,ry:d}),j=!0;else if(c==="translateX"||c==="translateY"||c==="rotation"||c==="verticalAlign"||c==="scaleX"||c==="scaleY")j=p=!0;else if(c==="stroke")d=i.color(d,g,c);else if(c==="dashstyle")if(c="stroke-dasharray",d=d&&d.toLowerCase(),d==="solid")d=S;else{if(d){d=d.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot",
+"3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(e=d.length;e--;)d[e]=C(d[e])*o(a["stroke-width"],this["stroke-width"]);d=d.join(",")}}else if(c==="width")d=C(d);else if(c==="align")c="text-anchor",d={left:"start",center:"middle",right:"end"}[d];else if(c==="title")e=g.getElementsByTagName("title")[0],e||(e=y.createElementNS(za,"title"),g.appendChild(e)),e.textContent=d;c==="strokeWidth"&&
+(c="stroke-width");if(c==="stroke-width"||c==="stroke"){this[c]=d;if(this.stroke&&this["stroke-width"])v(g,"stroke",this.stroke),v(g,"stroke-width",this["stroke-width"]),this.hasStroke=!0;else if(c==="stroke-width"&&d===0&&this.hasStroke)g.removeAttribute("stroke"),this.hasStroke=!1;j=!0}this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c)&&(m||(this.symbolAttr(a),m=!0),j=!0);if(l&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(c))for(e=l.length;e--;)v(l[e],
+c,c==="height"?s(d-(l[e].cutHeight||0),0):d);if((c==="width"||c==="height")&&h==="rect"&&d<0)d=0;this[c]=d;c==="text"?(d!==this.textStr&&delete this.bBox,this.textStr=d,this.added&&i.buildText(this)):j||v(g,c,d)}p&&this.updateTransform()}return q},addClass:function(a){var b=this.element,c=v(b,"class")||"";c.indexOf(a)===-1&&v(b,"class",c+" "+a);return this},symbolAttr:function(a){var b=this;n("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(c){b[c]=o(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x,
+b.y,b.width,b.height,b)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":S)},crisp:function(a,b,c,d,e){var f,g={},h={},i,a=a||this.strokeWidth||this.attr&&this.attr("stroke-width")||0;i=t(a)%2/2;h.x=P(b||this.x||0)+i;h.y=P(c||this.y||0)+i;h.width=P((d||this.width||0)-2*i);h.height=P((e||this.height||0)-2*i);h.strokeWidth=a;for(f in h)this[f]!==h[f]&&(this[f]=g[f]=h[f]);return g},css:function(a){var b=this.element,c=a&&a.width&&b.nodeName.toLowerCase()==="text",
+d,e="",f=function(a,b){return"-"+b.toLowerCase()};if(a&&a.color)a.fill=a.color;this.styles=a=r(this.styles,a);$&&c&&delete a.width;if(ta&&!Z)c&&delete a.width,K(this.element,a);else{for(d in a)e+=d.replace(/([A-Z])/g,f)+":"+a[d]+";";v(b,"style",e)}c&&this.added&&this.renderer.buildText(this);return this},on:function(a,b){var c=this,d=c.element;ib&&a==="click"?(d.ontouchstart=function(a){c.touchEventFired=Date.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(oa.indexOf("Android")===-1||
+Date.now()-(c.touchEventFired||0)>1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){this.element.radialReference=a;return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},htmlCss:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();this.styles=r(this.styles,a);K(this.element,a);return this},htmlGetBBox:function(){var a=
+this.element,b=this.bBox;if(!b){if(a.nodeName==="text")a.style.position="absolute";b=this.bBox={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}return b},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=g&&g!=="left",j=this.shadows;K(b,{marginLeft:c,marginTop:d});j&&n(j,function(a){K(a,{marginLeft:c+1,marginTop:d+1})});
+this.inverted&&n(b.childNodes,function(c){a.invertChild(c,b)});if(b.tagName==="SPAN"){var k,l,j=this.rotation,m;k=0;var p=1,q=0,ba;m=C(this.textWidth);var A=this.xCorr||0,L=this.yCorr||0,Sb=[j,g,b.innerHTML,this.textWidth].join(",");if(Sb!==this.cTT){u(j)&&(k=j*Ua,p=V(k),q=ca(k),this.setSpanRotation(j,q,p));k=o(this.elemWidth,b.offsetWidth);l=o(this.elemHeight,b.offsetHeight);if(k>m&&/[ \-]/.test(b.textContent||b.innerText))K(b,{width:m+"px",display:"block",whiteSpace:"normal"}),k=m;m=a.fontMetrics(b.style.fontSize).b;
+A=p<0&&-k;L=q<0&&-l;ba=p*q<0;A+=q*m*(ba?1-h:h);L-=p*m*(j?ba?h:1-h:1);i&&(A-=k*h*(p<0?-1:1),j&&(L-=l*h*(q<0?-1:1)),K(b,{textAlign:g}));this.xCorr=A;this.yCorr=L}K(b,{left:e+A+"px",top:f+L+"px"});if(gb)l=b.offsetHeight;this.cTT=Sb}}else this.alignOnAdd=!0},setSpanRotation:function(a){var b={};b[ta?"-ms-transform":gb?"-webkit-transform":hb?"MozTransform":Nb?"-o-transform":""]=b.transform="rotate("+a+"deg)";K(this.element,b)},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=
+this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(this.x||0)+" "+(this.y||0)+")");(u(c)||u(d))&&a.push("scale("+o(c,1)+" "+o(d,1)+")");a.length&&v(this.element,"transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions=
+a,this.alignByTranslate=b,!c||ea(c))this.alignTo=d=c||"renderer",ga(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=o(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=t(f);if(e==="bottom"||e==="middle")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=t(g);this[this.placed?"animate":"attr"](h);this.placed=
+!0;this.alignAttr=h;return this},getBBox:function(){var a=this.bBox,b=this.renderer,c,d=this.rotation;c=this.element;var e=this.styles,f=d*Ua;if(!a){if(c.namespaceURI===za||b.forExport){try{a=c.getBBox?r({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(g){}if(!a||a.width<0)a={width:0,height:0}}else a=this.htmlGetBBox();if(b.isSVG){b=a.width;c=a.height;if(ta&&e&&e.fontSize==="11px"&&c.toPrecision(3)==="22.7")a.height=c=14;if(d)a.width=N(c*ca(f))+N(b*V(f)),a.height=N(c*V(f))+N(b*ca(f))}this.bBox=
+a}return a},show:function(){return this.attr({visibility:"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.hide()}})},add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=d.childNodes,f=this.element,g=v(f,"zIndex"),h;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(g)c.handleZ=!0,g=C(g);if(c.handleZ)for(c=0;c<e.length;c++)if(a=
+e[c],b=v(a,"zIndex"),a!==f&&(C(b)>g||!u(g)&&u(b))){d.insertBefore(f,a);h=!0;break}h||d.appendChild(f);this.added=!0;z(this,"add");return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&b.parentNode,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;Wa(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f<a.stops.length;f++)a.stops[f]=a.stops[f].destroy();
+a.stops=null}a.safeRemoveChild(b);for(c&&n(c,function(b){a.safeRemoveChild(b)});d&&d.childNodes.length===0;)b=d.parentNode,a.safeRemoveChild(d),d=b;a.alignTo&&ga(a.renderer.alignedObjects,a);for(e in a)delete a[e];return null},shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,j,k;if(a){i=o(a.width,3);j=(a.opacity||0.15)/i;k=this.parentInverted?"(-1,-1)":"("+o(a.offsetX,1)+", "+o(a.offsetY,1)+")";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;v(f,{isShadow:"true",stroke:a.color||"black","stroke-opacity":j*
+e,"stroke-width":h,transform:"translate"+k,fill:S});if(c)v(f,"height",s(v(f,"height")-h,0)),f.cutHeight=h;b?b.element.appendChild(f):g.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this}};var Ha=function(){this.init.apply(this,arguments)};Ha.prototype={Element:wa,init:function(a,b,c,d){var e=location,f,g;f=this.createElement("svg").attr({version:"1.1"});g=f.element;a.appendChild(g);a.innerHTML.indexOf("xmlns")===-1&&v(g,"xmlns",za);this.isSVG=!0;this.box=g;this.boxWrapper=f;this.alignedObjects=
+[];this.url=(hb||gb)&&y.getElementsByTagName("base").length?e.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(y.createTextNode("Created with Highcharts 3.0.6"));this.defs=this.createElement("defs").add();this.forExport=d;this.gradients={};this.setSize(b,c,!1);var h;if(hb&&a.getBoundingClientRect)this.subPixelFix=b=function(){K(a,{left:0,top:0});h=a.getBoundingClientRect();K(a,{left:xa(h.left)-h.left+"px",top:xa(h.top)-
+h.top+"px"})},b(),J(O,"resize",b)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Ka(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&aa(O,"resize",this.subPixelFix);return this.alignedObjects=null},createElement:function(a){var b=new this.Element;b.init(this,a);return b},draw:function(){},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=o(a.textStr,
+"").toString().replace(/<(b|strong)>/g,'<span style="font-weight:bold">').replace(/<(i|em)>/g,'<span style="font-style:italic">').replace(/<a/g,"<span").replace(/<\/(b|strong|i|em|a)>/g,"</span>").split(/<br.*?>/g),f=b.childNodes,g=/style="([^"]+)"/,h=/href="(http[^"]+)"/,i=v(b,"x"),j=a.styles,k=j&&j.width&&C(j.width),l=j&&j.lineHeight,m=f.length;m--;)b.removeChild(f[m]);k&&!a.added&&this.box.appendChild(b);e[e.length-1]===""&&e.pop();n(e,function(e,f){var m,o=0,e=e.replace(/<span/g,"|||<span").replace(/<\/span>/g,
+"</span>|||");m=e.split("|||");n(m,function(e){if(e!==""||m.length===1){var p={},n=y.createElementNS(za,"tspan"),s;g.test(e)&&(s=e.match(g)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),v(n,"style",s));h.test(e)&&!d&&(v(n,"onclick",'location.href="'+e.match(h)[1]+'"'),K(n,{cursor:"pointer"}));e=(e.replace(/<(.|\n)*?>/g,"")||" ").replace(/&lt;/g,"<").replace(/&gt;/g,">");if(e!==" "&&(n.appendChild(y.createTextNode(e)),o?p.dx=0:p.x=i,v(n,p),!o&&f&&(!Z&&d&&K(n,{display:"block"}),v(n,"dy",l||c.fontMetrics(/px$/.test(n.style.fontSize)?
+n.style.fontSize:j.fontSize).h,gb&&n.offsetHeight)),b.appendChild(n),o++,k))for(var e=e.replace(/([^\^])-/g,"$1- ").split(" "),u,t,p=a._clipHeight,E=[],w=C(l||16),B=1;e.length||E.length;)delete a.bBox,u=a.getBBox(),t=u.width,u=t>k,!u||e.length===1?(e=E,E=[],e.length&&(B++,p&&B*w>p?(e=["..."],a.attr("title",a.textStr)):(n=y.createElementNS(za,"tspan"),v(n,{dy:w,x:i}),s&&v(n,"style",s),b.appendChild(n),t>k&&(k=t)))):(n.removeChild(n.firstChild),E.unshift(e.pop())),e.length&&n.appendChild(y.createTextNode(e.join(" ").replace(/- /g,
+"-")))}})})},button:function(a,b,c,d,e,f,g,h){var i=this.label(a,b,c,null,null,null,null,null,"button"),j=0,k,l,m,p,q,n,a={x1:0,y1:0,x2:0,y2:1},e=x({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);m=e.style;delete e.style;f=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);p=f.style;delete f.style;g=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);q=g.style;
+delete g.style;h=x(e,{style:{color:"#CCC"}},h);n=h.style;delete h.style;J(i.element,ta?"mouseover":"mouseenter",function(){j!==3&&i.attr(f).css(p)});J(i.element,ta?"mouseout":"mouseleave",function(){j!==3&&(k=[e,f,g][j],l=[m,p,q][j],i.attr(k).css(l))});i.setState=function(a){(i.state=j=a)?a===2?i.attr(g).css(q):a===3&&i.attr(h).css(n):i.attr(e).css(m)};return i.on("click",function(){j!==3&&d.call(i)}).attr(e).css(r({cursor:"default"},m))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=t(a[1])-b%
+2/2);a[2]===a[5]&&(a[2]=a[5]=t(a[2])+b%2/2);return a},path:function(a){var b={fill:S};Ia(a)?b.d=a:T(a)&&r(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=T(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(T(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a,b,c,d,e,f){e=T(a)?a.r:e;e=this.createElement("rect").attr({rx:e,ry:e,
+fill:S});return e.attr(T(a)?a:e.crisp(f,a,b,s(c,0),s(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[o(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return u(a)?b.attr({"class":"highcharts-"+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:S};arguments.length>1&&r(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink",
+"href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(t(b),t(c),d,e,f),i=/^url\((.*?)\)$/,j,k;if(h)g=this.path(h),r(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&r(g,f);else if(i.test(a))k=function(a,b){a.element&&(a.attr({width:b[0],height:b[1]}),a.alignByTranslate||a.translate(t((d-b[0])/2),t((e-b[1])/2)))},j=a.match(i)[1],a=Pb[j],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),U("img",{onload:function(){k(g,
+Pb[j]=[this.width,this.height])},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,
+e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=V(f),j=ca(f),k=V(g),g=ca(g),e=e.end-f<ya?0:1;return["M",a+c*i,b+c*j,"A",c,c,0,e,1,a+c*k,b+c*g,h?"M":"L",a+d*k,b+d*g,"A",d,d,0,e,0,a+d*i,b+d*j,h?"":"Z"]}},clipRect:function(a,b,c,d){var e="highcharts-"+zb++,f=this.createElement("clipPath").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;return a},color:function(a,b,c){var d=this,e,f=/^rgba/,g,h,i,j,k,l,m,p=[];a&&a.linearGradient?g="linearGradient":a&&a.radialGradient&&
+(g="radialGradient");if(g){c=a[g];h=d.gradients;j=a.stops;b=b.radialReference;Ia(c)&&(a[g]=c={x1:c[0],y1:c[1],x2:c[2],y2:c[3],gradientUnits:"userSpaceOnUse"});g==="radialGradient"&&b&&!u(c.gradientUnits)&&(c=x(c,{cx:b[0]-b[2]/2+c.cx*b[2],cy:b[1]-b[2]/2+c.cy*b[2],r:c.r*b[2],gradientUnits:"userSpaceOnUse"}));for(m in c)m!=="id"&&p.push(m,c[m]);for(m in j)p.push(j[m]);p=p.join(",");h[p]?a=h[p].id:(c.id=a="highcharts-"+zb++,h[p]=i=d.createElement(g).attr(c).add(d.defs),i.stops=[],n(j,function(a){f.test(a[1])?
+(e=ra(a[1]),k=e.get("rgb"),l=e.get("a")):(k=a[1],l=1);a=d.createElement("stop").attr({offset:a[0],"stop-color":k,"stop-opacity":l}).add(i);i.stops.push(a)}));return"url("+d.url+"#"+a+")"}else return f.test(a)?(e=ra(a),v(b,c+"-opacity",e.get("a")),e.get("rgb")):(b.removeAttribute(c+"-opacity"),a)},text:function(a,b,c,d){var e=M.chart.style,f=$||!Z&&this.forExport;if(d&&!this.forExport)return this.html(a,b,c);b=t(o(b,0));c=t(o(c,0));a=this.createElement("text").attr({x:b,y:c,text:a}).css({fontFamily:e.fontFamily,
+fontSize:e.fontSize});f&&a.css({position:"absolute"});a.x=b;a.y=c;return a},html:function(a,b,c){var d=M.chart.style,e=this.createElement("span"),f=e.attrSetters,g=e.element,h=e.renderer;f.text=function(a){a!==g.innerHTML&&delete this.bBox;g.innerHTML=a;return!1};f.x=f.y=f.align=function(a,b){b==="align"&&(b="textAlign");e[b]=a;e.htmlUpdateTransform();return!1};e.attr({text:a,x:t(b),y:t(c)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:d.fontFamily,fontSize:d.fontSize});e.css=e.htmlCss;
+if(h.isSVG)e.add=function(a){var b,c=h.box.parentNode,d=[];if(a){if(b=a.div,!b){for(;a;)d.push(a),a=a.parentGroup;n(d.reverse(),function(a){var d;b=a.div=a.div||U(Ea,{className:v(a.element,"class")},{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;r(a.attrSetters,{translateX:function(a){d.left=a+"px"},translateY:function(a){d.top=a+"px"},visibility:function(a,b){d[b]=a}})})}}else b=c;b.appendChild(g);e.added=!0;e.alignOnAdd&&e.htmlUpdateTransform();return e};
+return e},fontMetrics:function(a){var a=C(a||11),a=a<24?a+4:t(a*1.2),b=t(a*0.8);return{h:a,b:b}},label:function(a,b,c,d,e,f,g,h,i){function j(){var a,b;a=o.element.style;L=(Oa===void 0||la===void 0||q.styles.textAlign)&&o.getBBox();q.width=(Oa||L.width||0)+2*da+kb;q.height=(la||L.height||0)+2*da;v=da+p.fontMetrics(a&&a.fontSize).b;if(C){if(!A)a=t(-s*da),b=h?-v:0,q.box=A=d?p.symbol(d,a,b,q.width,q.height):p.rect(a,b,q.width,q.height,0,lb[Rb]),A.add(q);A.isImg||A.attr(x({width:q.width,height:q.height},
+lb));lb=null}}function k(){var a=q.styles,a=a&&a.textAlign,b=kb+da*(1-s),c;c=h?0:v;if(u(Oa)&&(a==="center"||a==="right"))b+={center:0.5,right:1}[a]*(Oa-L.width);(b!==o.x||c!==o.y)&&o.attr({x:b,y:c});o.x=b;o.y=c}function l(a,b){A?A.attr(a,b):lb[a]=b}function m(){o.add(q);q.attr({text:a,x:b,y:c});A&&u(e)&&q.attr({anchorX:e,anchorY:f})}var p=this,q=p.g(i),o=p.text("",0,0,g).attr({zIndex:1}),A,L,s=0,da=3,kb=0,Oa,la,E,H,B=0,lb={},v,g=q.attrSetters,C;J(q,"add",m);g.width=function(a){Oa=a;return!1};g.height=
+function(a){la=a;return!1};g.padding=function(a){u(a)&&a!==da&&(da=a,k());return!1};g.paddingLeft=function(a){u(a)&&a!==kb&&(kb=a,k());return!1};g.align=function(a){s={left:0,center:0.5,right:1}[a];return!1};g.text=function(a,b){o.attr(b,a);j();k();return!1};g[Rb]=function(a,b){C=!0;B=a%2/2;l(b,a);return!1};g.stroke=g.fill=g.r=function(a,b){b==="fill"&&(C=!0);l(b,a);return!1};g.anchorX=function(a,b){e=a;l(b,a+B-E);return!1};g.anchorY=function(a,b){f=a;l(b,a-H);return!1};g.x=function(a){q.x=a;a-=s*
+((Oa||L.width)+da);E=t(a);q.attr("translateX",E);return!1};g.y=function(a){H=q.y=t(a);q.attr("translateY",H);return!1};var y=q.css;return r(q,{css:function(a){if(a){var b={},a=x(a);n("fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration,textShadow".split(","),function(c){a[c]!==w&&(b[c]=a[c],delete a[c])});o.css(b)}return y.call(q,a)},getBBox:function(){return{width:L.width+2*da,height:L.height+2*da,x:L.x-da,y:L.y-da}},shadow:function(a){A&&A.shadow(a);return q},destroy:function(){aa(q,
+"add",m);aa(q.element,"mouseenter");aa(q.element,"mouseleave");o&&(o=o.destroy());A&&(A=A.destroy());wa.prototype.destroy.call(q);q=p=j=k=l=m=null}})}};Va=Ha;var F;if(!Z&&!$){Highcharts.VMLElement=F={init:function(a,b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ","absolute",";"],e=b===Ea;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=
+U(c);this.renderer=a;this.attrSetters={}},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();z(this,"add");return this},updateTransform:wa.prototype.htmlUpdateTransform,setSpanRotation:function(a,b,c){K(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",c,", M12=",-b,", M21=",b,", M22=",c,", sizingMethod='auto expand')"].join(""):
+S})},pathToVML:function(a){for(var b=a.length,c=[],d;b--;)if(sa(a[b]))c[b]=t(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))d=a[b]==="wa"?1:-1,c[b+5]===c[b+7]&&(c[b+7]-=d),c[b+6]===c[b+8]&&(c[b+8]-=d);return c.join(" ")||"x"},attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,i=this.renderer,j=this.symbolName,k,l=this.shadows,m,p=this.attrSetters,q=this;ea(a)&&u(b)&&(c=a,a={},a[c]=b);if(ea(a))c=a,q=c==="strokeWidth"||c==="stroke-width"?
+this.strokeweight:this[c];else for(c in a)if(d=a[c],m=!1,e=p[c]&&p[c].call(this,d,c),e!==!1&&d!==null){e!==w&&(d=e);if(j&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c))k||(this.symbolAttr(a),k=!0),m=!0;else if(c==="d"){d=d||[];this.d=d.join(" ");f.path=d=this.pathToVML(d);if(l)for(e=l.length;e--;)l[e].path=l[e].cutOff?this.cutOffPath(d,l[e].cutOff):d;m=!0}else if(c==="visibility"){if(l)for(e=l.length;e--;)l[e].style[c]=d;h==="DIV"&&(d=d==="hidden"?"-999em":0,fb||(g[c]=d?"visible":
+"hidden"),c="top");g[c]=d;m=!0}else if(c==="zIndex")d&&(g[c]=d),m=!0;else if(qa(c,["x","y","width","height"])!==-1)this[c]=d,c==="x"||c==="y"?c={x:"left",y:"top"}[c]:d=s(0,d),this.updateClipping?(this[c]=d,this.updateClipping()):g[c]=d,m=!0;else if(c==="class"&&h==="DIV")f.className=d;else if(c==="stroke")d=i.color(d,f,c),c="strokecolor";else if(c==="stroke-width"||c==="strokeWidth")f.stroked=d?!0:!1,c="strokeweight",this[c]=d,sa(d)&&(d+="px");else if(c==="dashstyle")(f.getElementsByTagName("stroke")[0]||
+U(i.prepVML(["<stroke/>"]),null,null,f))[c]=d||"solid",this.dashstyle=d,m=!0;else if(c==="fill")if(h==="SPAN")g.color=d;else{if(h!=="IMG")f.filled=d!==S?!0:!1,d=i.color(d,f,c,this),c="fillcolor"}else if(c==="opacity")m=!0;else if(h==="shape"&&c==="rotation")this[c]=f.style[c]=d,f.style.left=-t(ca(d*Ua)+1)+"px",f.style.top=t(V(d*Ua))+"px";else if(c==="translateX"||c==="translateY"||c==="rotation")this[c]=d,this.updateTransform(),m=!0;else if(c==="text")this.bBox=null,f.innerHTML=d,m=!0;m||(fb?f[c]=
+d:v(f,c,d))}return q},clip:function(a){var b=this,c;a?(c=a.members,ga(c,b),c.push(b),b.destroyClip=function(){ga(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:fb?"inherit":"rect(auto)"});return b.css(a)},css:wa.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Ta(a)},destroy:function(){this.destroyClip&&this.destroyClip();return wa.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=O.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,
+b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=C(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,p,q;k&&typeof k.value!=="string"&&(k="x");m=k;if(a){p=o(a.width,3);q=(a.opacity||0.15)/p;for(e=1;e<=3;e++){l=p*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=['<shape isShadow="true" strokeweight="',l,'" filled="false" path="',m,'" coordsize="10 10" style="',f.style.cssText,'" />'];h=U(g.prepVML(j),null,
+{left:C(i.left)+o(a.offsetX,1),top:C(i.top)+o(a.offsetY,1)});if(c)h.cutOff=l+1;j=['<stroke color="',a.color||"black",'" opacity="',q*e,'"/>'];U(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this}};F=ha(wa,F);var ma={Element:F,isIE8:oa.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d,e;this.alignedObjects=[];d=this.createElement(Ea);e=d.element;e.style.position="relative";a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=
+d;this.setSize(b,c,!1);y.namespaces.hcv||(y.namespaces.add("hcv","urn:schemas-microsoft-com:vml"),(y.styleSheets.length?y.styleSheets[0]:y.createStyleSheet()).cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } ")},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=T(a);return r(e,{members:[],left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=
+a.element,c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+t(a?e:d)+"px,"+t(a?f:b)+"px,"+t(a?b:f)+"px,"+t(a?d:e)+"px)"};!a&&fb&&c==="DIV"&&r(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){n(e.members,function(a){a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=S;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var k,l,m=a.linearGradient||a.radialGradient,
+p,q,o,A,L,s="",a=a.stops,u,t=[],w=function(){h=['<fill colors="'+t.join(",")+'" opacity="',o,'" o:opacity2="',q,'" type="',i,'" ',s,'focus="100%" method="any" />'];U(e.prepVML(h),null,null,b)};p=a[0];u=a[a.length-1];p[0]>0&&a.unshift([0,p[1]]);u[0]<1&&a.push([1,u[1]]);n(a,function(a,b){g.test(a[1])?(f=ra(a[1]),k=f.get("rgb"),l=f.get("a")):(k=a[1],l=1);t.push(a[0]*100+"% "+k);b?(o=l,A=k):(q=l,L=k)});if(c==="fill")if(i==="gradient")c=m.x1||m[0]||0,a=m.y1||m[1]||0,p=m.x2||m[2]||0,m=m.y2||m[3]||0,s='angle="'+
+(90-R.atan((m-a)/(p-c))*180/ya)+'"',w();else{var j=m.r,r=j*2,E=j*2,H=m.cx,B=m.cy,x=b.radialReference,v,j=function(){x&&(v=d.getBBox(),H+=(x[0]-v.x)/v.width-0.5,B+=(x[1]-v.y)/v.height-0.5,r*=x[2]/v.width,E*=x[2]/v.height);s='src="'+M.global.VMLRadialGradientURL+'" size="'+r+","+E+'" origin="0.5,0.5" position="'+H+","+B+'" color2="'+L+'" ';w()};d.added?j():J(d,"add",j);j=A}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=ra(a),h=["<",c,' opacity="',f.get("a"),'"/>'],U(this.prepVML(h),null,null,b),j=
+f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","<hcv:");return a},text:Ha.prototype.html,path:function(a){var b={coordsize:"10 10"};
+Ia(a)?b.d=a:T(a)&&r(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,c){var d=this.symbol("circle");if(T(a))c=a.r,b=a.y,a=a.x;d.isCircle=!0;d.r=c;return d.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement(Ea).attr(b)},image:function(a,b,c,d,e){var f=this.createElement("img").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){var g=this.symbol("rect");g.r=
+T(a)?a.r:e;return g.attr(T(a)?a:g.crisp(f,a,b,s(c,0),s(d,0)))},invertChild:function(a,b){var c=b.style;K(a,{flip:"x",left:C(c.width)-1,top:C(c.height)-1,rotation:-90})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=V(f),i=ca(f),j=V(g),k=ca(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);
+e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){var f=a+c,g=b+d,h;!u(e)||!e.r?f=Ha.prototype.symbols.square.apply(0,arguments):(h=I(e.r,c,d),f=["M",a+h,b,"L",f-h,b,"wa",f-2*h,b,f,b+2*h,f-h,b,f,b+h,"L",f,g-h,"wa",f-2*h,g-2*h,f,g,f,g-h,f-h,g,"L",a+h,g,"wa",a,g-2*h,a+2*h,g,a+h,g,a,g-h,"L",a,b+h,"wa",a,b,a+2*h,b+2*h,a,b+h,a+h,b,"x","e"]);return f}}};Highcharts.VMLRenderer=F=function(){this.init.apply(this,arguments)};F.prototype=x(Ha.prototype,
+ma);Va=F}var Tb;if($)Highcharts.CanVGRenderer=F=function(){za="http://www.w3.org/1999/xhtml"},F.prototype.symbols={},Tb=function(){function a(){var a=b.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,d){b.length===0&&Vb(d,a);b.push(c)}}}(),Va=F;Ma.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.horiz,e=a.categories,f=a.series[0]&&a.series[0].names,g=this.pos,h=b.labels,i=a.tickPositions,d=d&&e&&!h.step&&!h.staggerLines&&!h.rotation&&c.plotWidth/i.length||
+!d&&(c.margin[3]||c.chartWidth*0.33),j=g===i[0],k=g===i[i.length-1],l,f=e?o(e[g],f&&f[g],g):g,e=this.label,m=i.info;a.isDatetimeAxis&&m&&(l=b.dateTimeLabelFormats[m.higherRanks[g]||m.unitName]);this.isFirst=j;this.isLast=k;b=a.labelFormatter.call({axis:a,chart:c,isFirst:j,isLast:k,dateTimeLabelFormat:l,value:a.isLog?ia(fa(f)):f});g=d&&{width:s(1,t(d-2*(h.padding||10)))+"px"};g=r(g,h.style);if(u(e))e&&e.attr({text:b}).css(g);else{l={align:a.labelAlign};if(sa(h.rotation))l.rotation=h.rotation;if(d&&
+h.ellipsis)l._clipHeight=a.len/i.length;this.label=u(b)&&h.enabled?c.renderer.text(b,0,0,h.useHTML).attr(l).css(g).add(a.labelGroup):null}},getLabelSize:function(){var a=this.label,b=this.axis;return a?(this.labelBBox=a.getBBox())[b.horiz?"height":"width"]:0},getLabelSides:function(){var a=this.axis,b=this.labelBBox.width,a=b*{left:0,center:0.5,right:1}[a.labelAlign]-a.options.labels.x;return[-a,b-a]},handleOverflow:function(a,b){var c=!0,d=this.axis,e=d.chart,f=this.isFirst,g=this.isLast,h=b.x,i=
+d.reversed,j=d.tickPositions;if(f||g){var k=this.getLabelSides(),l=k[0],k=k[1],e=e.plotLeft,m=e+d.len,j=(d=d.ticks[j[a+(f?1:-1)]])&&d.label.xy&&d.label.xy.x+d.getLabelSides()[f?0:1];f&&!i||g&&i?h+l<e&&(h=e-l,d&&h+k>j&&(c=!1)):h+k>m&&(h=m-k,d&&h+l<j&&(c=!1));b.x=h}return c},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?
+g-e.bottom+e.offset-(e.opposite?e.height:0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,j=i.transA,k=i.reversed,l=i.staggerLines,m=i.chart.renderer.fontMetrics(e.style.fontSize).b,p=e.rotation,a=a+e.x-(f&&d?f*j*(k?-1:1):0),b=b+e.y-(f&&!d?f*j*(k?1:-1):0);p&&i.side===2&&(b-=m-m*V(p*Ua));!u(e.y)&&!p&&(b+=m-c.getBBox().height/2);l&&(b+=g/(h||1)%l*(i.labelOffset/l));return{x:a,y:b}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine(["M",a,b,"L",
+a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,j=this.pos,k=e.labels,l=this.gridLine,m=h?h+"Grid":"grid",p=h?h+"Tick":"tick",q=e[m+"LineWidth"],n=e[m+"LineColor"],A=e[m+"LineDashStyle"],s=e[p+"Length"],m=e[p+"Width"]||0,u=e[p+"Color"],t=e[p+"Position"],p=this.mark,r=k.step,v=!0,x=d.tickmarkOffset,E=this.getPosition(g,j,x,b),H=E.x,E=E.y,B=g&&H===d.pos+d.len||!g&&E===d.pos?-1:1,C=d.staggerLines;this.isActive=!0;if(q){j=
+d.getPlotLinePath(j+x,q*B,b,!0);if(l===w){l={stroke:n,"stroke-width":q};if(A)l.dashstyle=A;if(!h)l.zIndex=1;if(b)l.opacity=0;this.gridLine=l=q?f.path(j).attr(l).add(d.gridGroup):null}if(!b&&l&&j)l[this.isNew?"attr":"animate"]({d:j,opacity:c})}if(m&&s)t==="inside"&&(s=-s),d.opposite&&(s=-s),b=this.getMarkPath(H,E,s,m*B,g,f),p?p.animate({d:b,opacity:c}):this.mark=f.path(b).attr({stroke:u,"stroke-width":m,opacity:c}).add(d.axisGroup);if(i&&!isNaN(H))i.xy=E=this.getLabelPosition(H,E,i,g,k,x,a,r),this.isFirst&&
+!this.isLast&&!o(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!o(e.showLastLabel,1)?v=!1:!C&&g&&k.overflow==="justify"&&!this.handleOverflow(a,E)&&(v=!1),r&&a%r&&(v=!1),v&&!isNaN(E.y)?(E.opacity=c,i[this.isNew?"attr":"animate"](E),this.isNew=!1):i.attr("y",-9999)},destroy:function(){Ka(this,this.axis)}};vb.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=(b.pointRange||0)/2,e=a.options,f=e.label,g=a.label,h=e.width,i=e.to,j=e.from,k=u(j)&&u(i),l=e.value,m=e.dashStyle,p=a.svgElem,q=
+[],n,A=e.color,L=e.zIndex,t=e.events,w=b.chart.renderer;b.isLog&&(j=na(j),i=na(i),l=na(l));if(h){if(q=b.getPlotLinePath(l,h),d={stroke:A,"stroke-width":h},m)d.dashstyle=m}else if(k){if(j=s(j,b.min-d),i=I(i,b.max+d),q=b.getPlotBandPath(j,i,e),d={fill:A},e.borderWidth)d.stroke=e.borderColor,d["stroke-width"]=e.borderWidth}else return;if(u(L))d.zIndex=L;if(p)q?p.animate({d:q},null,p.onGetPath):(p.hide(),p.onGetPath=function(){p.show()});else if(q&&q.length&&(a.svgElem=p=w.path(q).attr(d).add(),t))for(n in e=
+function(b){p.on(b,function(c){t[b].apply(a,[c])})},t)e(n);if(f&&u(f.text)&&q&&q.length&&b.width>0&&b.height>0){f=x({align:c&&k&&"center",x:c?!k&&4:10,verticalAlign:!c&&k&&"middle",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},f);if(!g)a.label=g=w.text(f.text,0,0,f.useHTML).attr({align:f.textAlign||f.align,rotation:f.rotation,zIndex:L}).css(f.style).add();b=[q[1],q[4],o(q[6],q[1])];q=[q[2],q[5],o(q[7],q[2])];c=Ja(b);k=Ja(q);g.align(f,!1,{x:c,y:k,width:va(b)-c,height:va(q)-k});g.show()}else g&&g.hide();return a},
+destroy:function(){ga(this.axis.plotLinesAndBands,this);delete this.axis;Ka(this)}};Mb.prototype={destroy:function(){Ka(this,this.axis)},render:function(a){var b=this.options,c=b.format,c=c?Ca(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,0,0,b.useHTML).css(b.style).attr({align:this.textAlign,rotation:b.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=this.isNegative,
+g=c.translate(this.percent?100:this.total,0,0,0,1),c=c.translate(0),c=N(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e.attr({visibility:this.options.crop===!1||d.isInsidePlot(f.x,f.y)?Z?"inherit":"visible":"hidden"})}};db.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",
+month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:G,lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#4d759e",fontWeight:"bold"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,
+gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return Aa(this.total,-1)},style:G.style}},defaultLeftAxisOptions:{labels:{x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-5},
+title:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.xOrY=(this.isXAxis=c)?"x":"y";this.opposite=b.opposite;this.side=this.horiz?this.opposite?0:2:this.opposite?1:3;this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.isLog=e==="logarithmic";this.isDatetimeAxis=
+e==="datetime";this.isLinked=u(d.linkedTo);this.tickmarkOffset=this.categories&&d.tickmarkPlacement==="between"?0.5:0;this.ticks={};this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stackExtremes={};this.min=this.max=null;var f,d=this.options.events;qa(this,a.axes)===-1&&(a.axes.push(this),a[c?"xAxis":"yAxis"].push(this));this.series=this.series||
+[];if(a.inverted&&c&&this.reversed===w)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)J(this,f,d[f]);if(this.isLog)this.val2lin=na,this.lin2val=fa},setOptions:function(a){this.options=x(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],x(M[this.isXAxis?"xAxis":"yAxis"],a))},update:function(a,b){var c=this.chart,a=c.options[this.xOrY+
+"Axis"][this.options.index]=x(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.userMin=this.userMax=w;this.init(c,r(a,{events:w}));c.isDirtyBox=!0;o(b,!0)&&c.redraw()},remove:function(a){var b=this.chart,c=this.xOrY+"Axis";n(this.series,function(a){a.remove(!1)});ga(b.axes,this);ga(b[c],this);b.options[c].splice(this.options.index,1);n(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;o(a,!0)&&b.redraw()},defaultLabelFormatter:function(){var a=this.axis,b=this.value,
+c=a.categories,d=this.dateTimeLabelFormat,e=M.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ca(h,this);else if(c)g=b;else if(d)g=Xa(d,b);else if(f&&a>=1E3)for(;f--&&g===w;)c=Math.pow(1E3,f+1),a>=c&&e[f]!==null&&(g=Aa(b/c,-1)+e[f]);g===w&&(g=b>=1E3?Aa(b,0):Aa(b,-1));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=null;a.stackExtremes={};a.buildStacks();n(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d;
+d=c.options.threshold;var e;a.hasVisibleSeries=!0;a.isLog&&d<=0&&(d=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=I(o(a.dataMin,d[0]),Ja(d)),a.dataMax=s(o(a.dataMax,d[0]),va(d))}else{c.getExtremes();e=c.dataMax;c=c.dataMin;if(u(c)&&u(e))a.dataMin=I(o(a.dataMin,c),c),a.dataMax=s(o(a.dataMax,e),e);if(u(d))if(a.dataMin>=d)a.dataMin=d,a.ignoreMinPadding=!0;else if(a.dataMax<d)a.dataMax=d,a.ignoreMaxPadding=!0}}})},translate:function(a,b,c,d,e,f){var g=this.len,h=1,i=0,j=d?this.oldTransA:this.transA,
+d=d?this.oldMin:this.min,k=this.minPixelPadding,e=(this.options.ordinal||this.isLog&&e)&&this.lin2val;if(!j)j=this.transA;c&&(h*=-1,i=g);this.reversed&&(h*=-1,i-=h*g);b?(a=a*h+i,a-=k,a=a/j+d,e&&(a=this.lin2val(a))):(e&&(a=this.val2lin(a)),f==="between"&&(f=0.5),a=h*(a-d)*j+i+h*k+(sa(f)?j*f*this.pointRange:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a-(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,
+b,c,d){var e=this.chart,f=this.left,g=this.top,h,i,j,a=this.translate(a,null,null,c),k=c&&e.oldChartHeight||e.chartHeight,l=c&&e.oldChartWidth||e.chartWidth,m;h=this.transB;c=i=t(a+h);h=j=t(k-a-h);if(isNaN(a))m=!0;else if(this.horiz){if(h=g,j=k-this.bottom,c<f||c>f+this.width)m=!0}else if(c=f,i=l-this.right,h<g||h>g+this.height)m=!0;return m&&!d?null:e.renderer.crispLine(["M",c,h,"L",i,j],b||0)},getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b),d=this.getPlotLinePath(a);d&&c?d.push(c[4],
+c[5],c[1],c[2]):d=null;return d},getLinearTickPositions:function(a,b,c){for(var d,b=ia(P(b/a)*a),c=ia(xa(c/a)*a),e=[];b<=c;){e.push(b);b=ia(b+a);if(b===d)break;d=b}return e},getLogTickPositions:function(a,b,c,d){var e=this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=t(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=P(b),h,i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!l;f++){i=e.length;for(h=0;h<i&&!l;h++)j=na(fa(f)*e[h]),j>b&&(!d||
+k<=c)&&g.push(k),k>c&&(l=!0),k=j}else if(b=fa(b),c=fa(c),a=e[d?"minorTickInterval":"tickInterval"],a=o(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=ob(a,null,nb(a)),g=Na(this.getLinearTickPositions(a,b,c),na),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e;if(this.isLog){e=b.length;for(a=1;a<e;a++)d=d.concat(this.getLogTickPositions(c,
+b[a-1],b[a],!0))}else if(this.isDatetimeAxis&&a.minorTickInterval==="auto")d=d.concat(Eb(Cb(c),this.min,this.max,a.startOfWeek)),d[0]<this.min&&d.shift();else for(b=this.min+(b[0]-this.min)%c;b<=this.max;b+=c)d.push(b);return d},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-this.dataMin>=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===w&&!this.isLog)u(a.min)||u(a.max)?this.minRange=null:(n(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-
+1;g>0;g--)if(h=i[g]-i[g-1],f===w||h<f)f=h}),this.minRange=I(f*5,this.dataMax-this.dataMin));if(c-b<this.minRange){var k=this.minRange;d=(k-c+b)/2;d=[b-d,o(a.min,b-d)];if(e)d[2]=this.dataMin;b=va(d);c=[b+k,o(a.max,b+k)];if(e)c[2]=this.dataMax;c=Ja(c);c-b<k&&(d[0]=c-k,d[1]=o(a.min,c-k),b=va(d))}this.min=b;this.max=c},setAxisTranslation:function(a){var b=this.max-this.min,c=0,d,e=0,f=0,g=this.linkedParent,h=this.transA;if(this.isXAxis)g?(e=g.minPointOffset,f=g.pointRangePadding):n(this.series,function(a){var g=
+a.pointRange,h=a.options.pointPlacement,l=a.closestPointRange;g>b&&(g=0);c=s(c,g);e=s(e,ea(h)?0:g/2);f=s(f,h==="on"?0:g);!a.noSharedTooltip&&u(l)&&(d=u(d)?I(d,l):l)}),g=this.ordinalSlope&&d?this.ordinalSlope/d:1,this.minPointOffset=e*=g,this.pointRangePadding=f*=g,this.pointRange=I(c,b),this.closestPointRange=d;if(a)this.oldTransA=h;this.translationSlope=this.transA=h=this.len/(b+f||1);this.transB=this.horiz?this.left:this.bottom;this.minPixelPadding=h*e},setTickPositions:function(a){var b=this,c=
+b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=b.options.tickPositioner,j=d.maxPadding,k=d.minPadding,l=d.tickInterval,m=d.minTickInterval,p=d.tickPixelInterval,q,ba=b.categories;h?(b.linkedParent=c[g?"xAxis":"yAxis"][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=o(c.min,c.dataMin),b.max=o(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&ka(11,1)):(b.min=o(b.userMin,d.min,b.dataMin),b.max=o(b.userMax,d.max,b.dataMax));if(e)!a&&I(b.min,o(b.dataMin,b.min))<=0&&
+ka(10,1),b.min=ia(na(b.min)),b.max=ia(na(b.max));if(b.range&&(b.userMin=b.min=s(b.min,b.max-b.range),b.userMax=b.max,a))b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!ba&&!b.usePercentage&&!h&&u(b.min)&&u(b.max)&&(c=b.max-b.min)){if(!u(d.min)&&!u(b.userMin)&&k&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=c*k;if(!u(d.max)&&!u(b.userMax)&&j&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*j}b.min===b.max||b.min===void 0||b.max===void 0?b.tickInterval=1:h&&!l&&p===b.linkedParent.options.tickPixelInterval?
+b.tickInterval=b.linkedParent.tickInterval:(b.tickInterval=o(l,ba?1:(b.max-b.min)*p/s(b.len,p)),!u(l)&&b.len<p&&!this.isRadial&&(q=!0,b.tickInterval/=4));g&&!a&&n(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange)b.tickInterval=s(b.pointRange,b.tickInterval);if(!l&&b.tickInterval<m)b.tickInterval=
+m;if(!f&&!e&&!l)b.tickInterval=ob(b.tickInterval,null,nb(b.tickInterval),d);b.minorTickInterval=d.minorTickInterval==="auto"&&b.tickInterval?b.tickInterval/5:d.minorTickInterval;b.tickPositions=a=d.tickPositions?[].concat(d.tickPositions):i&&i.apply(b,[b.min,b.max]);if(!a)!b.ordinalPositions&&(b.max-b.min)/b.tickInterval>s(2*b.len,200)&&ka(19,!0),a=f?(b.getNonLinearTimeTicks||Eb)(Cb(b.tickInterval,d.units),b.min,b.max,d.startOfWeek,b.ordinalPositions,b.closestPointRange,!0):e?b.getLogTickPositions(b.tickInterval,
+b.min,b.max):b.getLinearTickPositions(b.tickInterval,b.min,b.max),q&&a.splice(1,a.length-2),b.tickPositions=a;if(!h)e=a[0],f=a[a.length-1],h=b.minPointOffset||0,d.startOnTick?b.min=e:b.min-h>e&&a.shift(),d.endOnTick?b.max=f:b.max+h<f&&a.pop(),a.length===1&&(b.min-=0.001,b.max+=0.001)},setMaxTicks:function(){var a=this.chart,b=a.maxTicks||{},c=this.tickPositions,d=this._maxTicksKey=[this.xOrY,this.pos,this.len].join("-");if(!this.isLinked&&!this.isDatetimeAxis&&c&&c.length>(b[d]||0)&&this.options.alignTicks!==
+!1)b[d]=c.length;a.maxTicks=b},adjustTickAmount:function(){var a=this._maxTicksKey,b=this.tickPositions,c=this.chart.maxTicks;if(c&&c[a]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1){var d=this.tickAmount,e=b.length;this.tickAmount=a=c[a];if(e<a){for(;b.length<a;)b.push(ia(b[b.length-1]+this.tickInterval));this.transA*=(e-1)/(a-1);this.max=b[b.length-1]}if(u(d)&&a!==d)this.isDirty=!0}},setScale:function(){var a=this.stacks,b,c,d,e;this.oldMin=this.min;this.oldMax=
+this.max;this.oldAxisLength=this.len;this.setAxisSize();e=this.len!==this.oldAxisLength;n(this.series,function(a){if(a.isDirtyData||a.isDirty||a.xAxis.isDirty)d=!0});if(e||d||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax){if(!this.isXAxis)for(b in a)delete a[b];this.forceRedraw=!1;this.getSeriesExtremes();this.setTickPositions();this.oldUserMin=this.userMin;this.oldUserMax=this.userMax;if(!this.isDirty)this.isDirty=e||this.min!==this.oldMin||this.max!==
+this.oldMax}else if(!this.isXAxis){if(this.oldStacks)a=this.stacks=this.oldStacks;for(b in a)for(c in a[b])a[b][c].cum=a[b][c].total}this.setMaxTicks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=o(c,!0),e=r(e,{min:a,max:b});z(f,"setExtremes",e,function(){f.userMin=a;f.userMax=b;f.eventArgs=e;f.isDirtyExtremes=!0;c&&g.redraw(d)})},zoom:function(a,b){this.allowZoomOutside||(u(this.dataMin)&&a<=this.dataMin&&(a=w),u(this.dataMax)&&b>=this.dataMax&&(b=w));this.displayBtn=a!==w||b!==w;this.setExtremes(a,
+b,!1,w,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=b.offsetRight||0,e=this.horiz,f,g;this.left=g=o(b.left,a.plotLeft+c);this.top=f=o(b.top,a.plotTop);this.width=c=o(b.width,a.plotWidth-c+d);this.height=b=o(b.height,a.plotHeight);this.bottom=a.chartHeight-b-f;this.right=a.chartWidth-c-g;this.len=s(e?c:b,0);this.pos=e?g:f},getExtremes:function(){var a=this.isLog;return{min:a?ia(fa(this.min)):this.min,max:a?ia(fa(this.max)):this.max,dataMin:this.dataMin,
+dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?fa(this.min):this.min,b=b?fa(this.max):this.max;c>a||a===null?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},addPlotBand:function(a){this.addPlotBandOrLine(a,"plotBands")},addPlotLine:function(a){this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(a,b){var c=(new vb(this,a)).render(),d=this.userOptions;c&&(b&&(d[b]=d[b]||[],d[b].push(a)),this.plotLinesAndBands.push(c));return c},
+autoLabelAlign:function(a){a=(o(a,0)-this.side*90+720)%360;return a>15&&a<165?"right":a>195&&a<345?"left":"center"},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k=0,l,m=0,p=d.title,q=d.labels,ba=0,A=b.axisOffset,L=b.clipOffset,t=[-1,1,1,-1][h],r,v=1,x=o(q.maxStaggerLines,5),la,E,H,B;a.hasData=j=a.hasVisibleSeries||u(a.min)&&u(a.max)&&!!e;a.showAxis=b=j||o(d.showEmpty,!0);a.staggerLines=a.horiz&&q.staggerLines;
+if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g("axis-labels").attr({zIndex:q.zIndex||7}).add();if(j||a.isLinked){a.labelAlign=o(q.align||a.autoLabelAlign(q.rotation));n(e,function(b){f[b]?f[b].addLabel():f[b]=new Ma(a,b)});if(a.horiz&&!a.staggerLines&&x&&!q.rotation){for(r=a.reversed?[].concat(e).reverse():e;v<x;){j=[];la=!1;for(q=0;q<r.length;q++)E=r[q],H=(H=f[E].label&&f[E].label.getBBox())?H.width:
+0,B=q%v,H&&(E=a.translate(E),j[B]!==w&&E<j[B]&&(la=!0),j[B]=E+H);if(la)v++;else break}if(v>1)a.staggerLines=v}n(e,function(b){if(h===0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)ba=s(f[b].getLabelSize(),ba)});if(a.staggerLines)ba*=a.staggerLines,a.labelOffset=ba}else for(r in f)f[r].destroy(),delete f[r];if(p&&p.text&&p.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(p.text,0,0,p.useHTML).attr({zIndex:7,rotation:p.rotation||0,align:p.textAlign||{low:"left",middle:"center",high:"right"}[p.align]}).css(p.style).add(a.axisGroup),
+a.axisTitle.isNew=!0;if(b)k=a.axisTitle.getBBox()[g?"height":"width"],m=o(p.margin,g?5:10),l=p.offset;a.axisTitle[b?"show":"hide"]()}a.offset=t*o(d.offset,A[h]);a.axisTitleMargin=o(l,ba+m+(h!==2&&ba&&t*d.labels[g?"y":"x"]));A[h]=s(A[h],a.axisTitleMargin+k+t*a.offset);L[i]=s(L[i],P(d.lineWidth/2)*2)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",
+e?this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=C(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this,
+b=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.stacks,j=a.ticks,k=a.minorTicks,l=a.alternateBands,m=d.stackLabels,p=d.alternateGridColor,q=a.tickmarkOffset,o=d.lineWidth,A,s=b.hasRendered&&u(a.oldMin)&&!isNaN(a.oldMin);A=a.hasData;var t=a.showAxis,r,v;n([j,k,l],function(a){for(var b in a)a[b].isActive=!1});if(A||f)if(a.minorTickInterval&&!a.categories&&n(a.getMinorTickPositions(),function(b){k[b]||(k[b]=new Ma(a,b,"minor"));s&&k[b].isNew&&k[b].render(null,
+!0);k[b].render(null,!1,1)}),g.length&&(n(g.slice(1).concat([g[0]]),function(b,c){c=c===g.length-1?0:c+1;if(!f||b>=a.min&&b<=a.max)j[b]||(j[b]=new Ma(a,b)),s&&j[b].isNew&&j[b].render(c,!0),j[b].render(c,!1,1)}),q&&a.min===0&&(j[-1]||(j[-1]=new Ma(a,-1,null,!0)),j[-1].render(-1))),p&&n(g,function(b,c){if(c%2===0&&b<a.max)l[b]||(l[b]=new vb(a)),r=b+q,v=g[c+1]!==w?g[c+1]+q:a.max,l[b].options={from:e?fa(r):r,to:e?fa(v):v,color:p},l[b].render(),l[b].isActive=!0}),!a._addedPlotLB)n((d.plotLines||[]).concat(d.plotBands||
+[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0;n([j,k,l],function(a){var c,d,e=[],f=Fa?Fa.duration||500:0,g=function(){for(d=e.length;d--;)a[e[d]]&&!a[e[d]].isActive&&(a[e[d]].destroy(),delete a[e[d]])};for(c in a)if(!a[c].isActive)a[c].render(c,!1,0),a[c].isActive=!1,e.push(c);a===l||!b.hasRendered||!f?g():f&&setTimeout(g,f)});if(o)A=a.getLinePath(o),a.axisLine?a.axisLine.animate({d:A}):a.axisLine=c.path(A).attr({stroke:d.lineColor,"stroke-width":o,zIndex:7}).add(a.axisGroup),a.axisLine[t?
+"show":"hide"]();if(h&&t)h[h.isNew?"attr":"animate"](a.getTitlePosition()),h.isNew=!1;if(m&&m.enabled){var x,la,d=a.stackTotalGroup;if(!d)a.stackTotalGroup=d=c.g("stack-labels").attr({visibility:"visible",zIndex:6}).add();d.translate(b.plotLeft,b.plotTop);for(x in i)for(la in c=i[x],c)c[la].render(d)}a.isDirty=!1},removePlotBandOrLine:function(a){for(var b=this.plotLinesAndBands,c=this.options,d=this.userOptions,e=b.length;e--;)b[e].id===a&&b[e].destroy();n([c.plotLines||[],d.plotLines||[],c.plotBands||
+[],d.plotBands||[]],function(b){for(e=b.length;e--;)b[e].id===a&&ga(b,b[e])})},setTitle:function(a,b){this.update({title:a},b)},redraw:function(){var a=this.chart.pointer;a.reset&&a.reset(!0);this.render();n(this.plotLinesAndBands,function(a){a.render()});n(this.series,function(a){a.isDirty=!0})},buildStacks:function(){var a=this.series,b=a.length;if(!this.isXAxis){for(;b--;)a[b].setStackedPoints();if(this.usePercentage)for(b=0;b<a.length;b++)a[b].setPercentStacks()}},setCategories:function(a,b){this.update({categories:a},
+b)},destroy:function(a){var b=this,c=b.stacks,d,e=b.plotLinesAndBands;a||aa(b);for(d in c)Ka(c[d]),c[d]=null;n([b.ticks,b.minorTicks,b.alternateBands],function(a){Ka(a)});for(a=e.length;a--;)e[a].destroy();n("stackTotalGroup,axisLine,axisGroup,gridGroup,labelGroup,axisTitle".split(","),function(a){b[a]&&(b[a]=b[a].destroy())})}};wb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=C(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.label=
+a.renderer.label("",0,0,b.shape,null,null,b.useHTML,null,"tooltip").attr({padding:e,fill:b.backgroundColor,"stroke-width":c,r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-999});$||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){n(this.crosshairs,function(a){a&&a.destroy()});if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden;
+r(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:g?(2*f.anchorX+c)/3:c,anchorY:g?(f.anchorY+d)/2:d});e.label.attr(f);if(g&&(N(a-f.x)>1||N(b-f.y)>1))clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(){var a=this,b;clearTimeout(this.hideTimer);if(!this.isHidden)b=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){a.label.fadeOut();a.isHidden=!0},o(this.options.hideDelay,500)),b&&n(b,function(a){a.setState()}),this.chart.hoverPoints=
+null},hideCrosshairs:function(){n(this.crosshairs,function(a){a&&a.hide()})},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=0,h=0,i,a=ja(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===w&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(n(a,function(a){i=a.series.yAxis;g+=a.plotX;h+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&i?i.top-f:0)}),g/=a.length,h/=a.length,c=[e?d.plotWidth-h:g,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-g:
+h]);return Na(c,t)},getPosition:function(a,b,c){var d=this.chart,e=d.plotLeft,f=d.plotTop,g=d.plotWidth,h=d.plotHeight,i=o(this.options.distance,12),j=c.plotX,c=c.plotY,d=j+e+(d.inverted?i:-a-i),k=c-b+f+15,l;d<7&&(d=e+s(j,0)+i);d+a>e+g&&(d-=d+a-(e+g),k=c-b+f-i,l=!0);k<f+5&&(k=f+5,l&&c>=k&&c<=k+b&&(k=c+f+i));k+b>f+h&&(k=s(f,f+h-b-i));return{x:d,y:k}},defaultFormatter:function(a){var b=this.points||ja(this),c=b[0].series,d;d=[c.tooltipHeaderFormatter(b[0])];n(b,function(a){c=a.series;d.push(c.tooltipFormatter&&
+c.tooltipFormatter(a)||a.point.tooltipFormatter(c.tooltipOptions.pointFormat))});d.push(a.options.footerFormat||"");return d.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h={},i,j=[];i=e.formatter||this.defaultFormatter;var h=c.hoverPoints,k,l=e.crosshairs,m=this.shared;clearTimeout(this.hideTimer);this.followPointer=ja(a)[0].series.tooltipOptions.followPointer;g=this.getAnchor(a,b);f=g[0];g=g[1];m&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,h&&n(h,
+function(a){a.setState()}),n(a,function(a){a.setState("hover");j.push(a.getLabelConfig())}),h={x:a[0].category,y:a[0].y},h.points=j,a=a[0]):h=a.getLabelConfig();i=i.call(h,this);h=a.series;i===!1?this.hide():(this.isHidden&&(Wa(d),d.attr("opacity",1).show()),d.attr({text:i}),k=e.borderColor||a.color||h.color||"#606060",d.attr({stroke:k}),this.updatePosition({plotX:f,plotY:g}),this.isHidden=!1);if(l){l=ja(l);for(d=l.length;d--;)if(m=a.series,e=m[d?"yAxis":"xAxis"],l[d]&&e)if(h=d?o(a.stackY,a.y):a.x,
+e.isLog&&(h=na(h)),d===1&&m.modifyValue&&(h=m.modifyValue(h)),e=e.getPlotLinePath(h,1),this.crosshairs[d])this.crosshairs[d].attr({d:e,visibility:"visible"});else{h={"stroke-width":l[d].width||1,stroke:l[d].color||"#C0C0C0",zIndex:l[d].zIndex||2};if(l[d].dashStyle)h.dashstyle=l[d].dashStyle;this.crosshairs[d]=c.renderer.path(e).attr(h).add()}}z(c,"tooltipRefresh",{text:i,x:f+c.plotLeft,y:g+c.plotTop,borderColor:k})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||
+this.getPosition).call(this,c.width,c.height,a);this.move(t(c.x),t(c.y),a.plotX+b.plotLeft,a.plotY+b.plotTop)}};xb.prototype={init:function(a,b){var c=b.chart,d=c.events,e=$?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(b.tooltip.enabled)a.tooltip=new wb(a,b.tooltip);this.setDOMEvents()},normalize:function(a,b){var c,
+d,a=a||O.event;if(!a.target)a.target=a.srcElement;a=Xb(a);d=a.touches?a.touches.item(0):a;if(!b)this.chartPosition=b=Wb(this.chart.container);d.pageX===w?(c=s(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,d=d.pageY-b.top);return r(a,{chartX:t(c),chartY:t(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};n(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},getIndex:function(a){var b=this.chart;return b.inverted?
+b.plotHeight+b.plotTop-a.chartY:a.chartX-b.plotLeft},runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e,f=b.hoverPoint,g=b.hoverSeries,h,i,j=b.chartWidth,k=this.getIndex(a);if(d&&this.options.tooltip.shared&&(!g||!g.noSharedTooltip)){e=[];h=c.length;for(i=0;i<h;i++)if(c[i].visible&&c[i].options.enableMouseTracking!==!1&&!c[i].noSharedTooltip&&c[i].tooltipPoints.length&&(b=c[i].tooltipPoints[k])&&b.series)b._dist=N(k-b.clientX),j=I(j,b._dist),e.push(b);for(h=e.length;h--;)e[h]._dist>
+j&&e.splice(h,1);if(e.length&&e[0].clientX!==this.hoverX)d.refresh(e,a),this.hoverX=e[0].clientX}if(g&&g.tracker){if((b=g.tooltipPoints[k])&&b!==f)b.onMouseOver(a)}else d&&d.followPointer&&!d.isHidden&&(a=d.getAnchor([{}],a),d.updatePosition({plotX:a[0],plotY:a[1]}))},reset:function(a){var b=this.chart,c=b.hoverSeries,d=b.hoverPoint,e=b.tooltip,b=e&&e.shared?b.hoverPoints:d;(a=a&&e&&b)&&ja(b)[0].plotX===w&&(a=!1);if(a)e.refresh(b);else{if(d)d.onMouseOut();if(c)c.onMouseOut();e&&(e.hide(),e.hideCrosshairs());
+this.hoverX=null}},scaleGroups:function(a,b){var c=this.chart,d;n(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},pinchTranslateDirection:function(a,b,c,d,e,f,g){var h=this.chart,i=a?"x":"y",j=a?"X":"Y",k="chart"+j,l=a?"width":"height",m=h["plot"+(a?"Left":"Top")],p,q,o=1,n=h.inverted,s=h.bounds[a?"h":"v"],
+t=b.length===1,u=b[0][k],r=c[0][k],w=!t&&b[1][k],v=!t&&c[1][k],x,c=function(){!t&&N(u-w)>20&&(o=N(r-v)/N(u-w));q=(m-r)/o+u;p=h["plot"+(a?"Width":"Height")]/o};c();b=q;b<s.min?(b=s.min,x=!0):b+p>s.max&&(b=s.max-p,x=!0);x?(r-=0.8*(r-g[i][0]),t||(v-=0.8*(v-g[i][1])),c()):g[i]=[r,v];n||(f[i]=q-m,f[l]=p);f=n?1/o:o;e[l]=p;e[i]=b;d[n?a?"scaleY":"scaleX":"scale"+j]=o;d["translate"+j]=f*m+(r-f*u)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=c.tooltip&&c.tooltip.options.followTouchMove,f=a.touches,
+g=f.length,h=b.lastValidTouch,i=b.zoomHor||b.pinchHor,j=b.zoomVert||b.pinchVert,k=i||j,l=b.selectionMarker,m={},p=g===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||c.runChartClick),q={};(k||e)&&!p&&a.preventDefault();Na(f,function(a){return b.normalize(a)});if(a.type==="touchstart")n(f,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),h.x=[d[0].chartX,d[1]&&d[1].chartX],h.y=[d[0].chartY,d[1]&&d[1].chartY],n(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],
+d=a.minPixelPadding,e=a.toPixels(a.dataMin),f=a.toPixels(a.dataMax),g=I(e,f),e=s(e,f);b.min=I(a.pos,g-d);b.max=s(a.pos+a.len,e+d)}});else if(d.length){if(!l)b.selectionMarker=l=r({destroy:pa},c.plotBox);i&&b.pinchTranslateDirection(!0,d,f,m,l,q,h);j&&b.pinchTranslateDirection(!1,d,f,m,l,q,h);b.hasPinched=k;b.scaleGroups(m,q);!k&&e&&g===1&&this.runPointActions(b.normalize(a))}},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=
+this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,j=b.plotWidth,k=b.plotHeight,l,m=this.mouseDownX,p=this.mouseDownY;d<h?d=h:d>h+j&&(d=h+j);e<i?e=i:e>i+k&&(e=i+k);this.hasDragged=Math.sqrt(Math.pow(m-d,2)+Math.pow(p-e,2));if(this.hasDragged>10){l=b.isInsidePlot(m-h,p-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!this.selectionMarker)this.selectionMarker=b.renderer.rect(h,i,f?1:j,g?
+1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();this.selectionMarker&&f&&(d-=m,this.selectionMarker.attr({width:N(d),x:(d>0?0:d)+m}));this.selectionMarker&&g&&(d=e-p,this.selectionMarker.attr({height:N(d),y:(d>0?0:d)+p}));l&&!this.selectionMarker&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this.chart,c=this.hasPinched;if(this.selectionMarker){var d={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},e=this.selectionMarker,f=e.x,g=e.y,h;if(this.hasDragged||
+c)n(b.axes,function(a){if(a.zoomEnabled){var b=a.horiz,c=a.toValue(b?f:g),b=a.toValue(b?f+e.width:g+e.height);!isNaN(c)&&!isNaN(b)&&(d[a.xOrY+"Axis"].push({axis:a,min:I(c,b),max:s(c,b)}),h=!0)}}),h&&z(b,"selection",d,function(a){b.zoom(r(a,c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();c&&this.scaleGroups()}if(b)K(b.container,{cursor:b._cursor}),b.cancelClick=this.hasDragged>10,b.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=
+this.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){this.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,d=b.hoverSeries,a=this.normalize(a,c);c&&d&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){this.reset();this.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart,a=this.normalize(a);a.returnValue=
+!1;b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=v(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries;if(b&&!b.options.stickyTracking&&!this.inClass(a.toElement||a.relatedTarget,"highcharts-tooltip"))b.onMouseOut()},
+onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,f=b.inverted,g,h,i,a=this.normalize(a);a.cancelBubble=!0;if(!b.cancelClick)c&&this.inClass(a.target,"highcharts-tracker")?(g=this.chartPosition,h=c.plotX,i=c.plotY,r(c,{pageX:g.left+d+(f?b.plotWidth-i:h),pageY:g.top+e+(f?b.plotHeight-h:i)}),z(c.series,"click",r(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(r(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&z(b,"click",a))},onContainerTouchStart:function(a){var b=
+this.chart;a.touches.length===1?(a=this.normalize(a),b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)?(this.runPointActions(a),this.pinch(a)):this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchMove:function(a){(a.touches.length===1||a.touches.length===2)&&this.pinch(a)},onDocumentTouchEnd:function(a){this.drop(a)},setDOMEvents:function(){var a=this,b=a.chart.container,c;this._events=c=[[b,"onmousedown","onContainerMouseDown"],[b,"onmousemove","onContainerMouseMove"],[b,"onclick",
+"onContainerClick"],[b,"mouseleave","onContainerMouseLeave"],[y,"mousemove","onDocumentMouseMove"],[y,"mouseup","onDocumentMouseUp"]];ib&&c.push([b,"ontouchstart","onContainerTouchStart"],[b,"ontouchmove","onContainerTouchMove"],[y,"touchend","onDocumentTouchEnd"]);n(c,function(b){a["_"+b[2]]=function(c){a[b[2]](c)};b[1].indexOf("on")===0?b[0][b[1]]=a["_"+b[2]]:J(b[0],b[1],a["_"+b[2]])})},destroy:function(){var a=this;n(a._events,function(b){b[1].indexOf("on")===0?b[0][b[1]]=null:aa(b[0],b[1],a["_"+
+b[2]])});delete a._events;clearInterval(a.tooltipTimeout)}};eb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=o(b.padding,8),f=b.itemMarginTop||0;this.options=b;if(b.enabled)c.baseline=C(d.fontSize)+3+f,c.itemStyle=d,c.itemHiddenStyle=x(d,b.itemHiddenStyle),c.itemMarginTop=f,c.padding=e,c.initialItemX=e,c.initialItemY=e-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.lastLineHeight=0,c.render(),J(c.chart,"endResize",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options,
+d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.color:g,g=a.options&&a.options.marker,i={stroke:h,fill:h},j;d&&d.css({fill:c,color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(j in g=a.convertAttribs(g),g)d=g[j],d!==w&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;a.legendGroup&&a.legendGroup.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=
+e,f.y=d},destroyItem:function(a){var b=a.checkbox;n(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Ta(a.checkbox)},destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight;if(b)c=b.translateY,n(this.allItems,function(e){var f=e.checkbox,g;f&&(g=c+f.y+(a||0)+3,K(f,{left:b.translateX+e.legendItemWidth+f.x-
+20+"px",top:g+"px",display:g>c-6&&g<c+d-6?"":S}))})},renderTitle:function(){var a=this.padding,b=this.options.title,c=0;if(b.text){if(!this.title)this.title=this.chart.renderer.label(b.text,a-3,a-4,null,null,null,null,null,"legend-title").attr({zIndex:1}).css(b.style).add(this.group);a=this.title.getBBox();c=a.height;this.offsetWidth=a.width;this.contentGroup.attr({translateY:c})}this.titleHeight=c},renderItem:function(a){var B;var b=this,c=b.chart,d=c.renderer,e=b.options,f=e.layout==="horizontal",
+g=e.symbolWidth,h=e.symbolPadding,i=b.itemStyle,j=b.itemHiddenStyle,k=b.padding,l=f?o(e.itemDistance,8):0,m=!e.rtl,p=e.width,q=e.itemMarginBottom||0,n=b.itemMarginTop,A=b.initialItemX,t=a.legendItem,u=a.series||a,r=u.options,w=r.showCheckbox,v=e.useHTML;if(!t&&(a.legendGroup=d.g("legend-item").attr({zIndex:1}).add(b.scrollGroup),u.drawLegendSymbol(b,a),a.legendItem=t=d.text(e.labelFormat?Ca(e.labelFormat,a):e.labelFormatter.call(a),m?g+h:-h,b.baseline,v).css(x(a.visible?i:j)).attr({align:m?"left":
+"right",zIndex:2}).add(a.legendGroup),(v?t:a.legendGroup).on("mouseover",function(){a.setState("hover");t.css(b.options.itemHoverStyle)}).on("mouseout",function(){t.css(a.visible?i:j);a.setState()}).on("click",function(b){var c=function(){a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):z(a,"legendItemClick",b,c)}),b.colorizeItem(a,a.visible),r&&w))a.checkbox=U("input",{type:"checkbox",checked:a.selected,defaultChecked:a.selected},e.itemCheckboxStyle,c.container),
+J(a.checkbox,"click",function(b){z(a,"checkboxClick",{checked:b.target.checked},function(){a.select()})});d=t.getBBox();B=a.legendItemWidth=e.itemWidth||g+h+d.width+l+(w?20:0),e=B;b.itemHeight=g=d.height;if(f&&b.itemX-A+e>(p||c.chartWidth-2*k-A))b.itemX=A,b.itemY+=n+b.lastLineHeight+q,b.lastLineHeight=0;b.maxItemWidth=s(b.maxItemWidth,e);b.lastItemY=n+b.itemY+q;b.lastLineHeight=s(g,b.lastLineHeight);a._legendItemPos=[b.itemX,b.itemY];f?b.itemX+=e:(b.itemY+=n+g+q,b.lastLineHeight=g);b.offsetWidth=
+p||s((f?b.itemX-A-l:e)+k,b.offsetWidth)},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=[];n(b.series,function(a){var b=a.options;b.showInLegend&&!u(b.linkedTo)&&(e=e.concat(a.legendItems||
+(b.legendType==="point"?a.data:a)))});Kb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;n(e,function(b){a.renderItem(b)});g=j.width||a.offsetWidth;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h);if(l||m){g+=k;h+=k;if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp(null,null,null,g,h)),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor,
+"stroke-width":l||0,fill:m||S}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;n(e,function(b){a.positionItem(b)});f&&d.align(r({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h=this.clipRect,i=e.navigation,j=o(i.animation,!0),k=i.arrowSize||12,l=this.nav;e.layout===
+"horizontal"&&(f/=2);g&&(f=I(f,g));if(a>f&&!e.useHTML){this.clipHeight=c=f-20-this.titleHeight;this.pageCount=xa(a/c);this.currentPage=o(this.currentPage,1);this.fullHeight=a;if(!h)h=b.clipRect=d.clipRect(0,0,9999,0),b.contentGroup.clip(h);h.attr({height:c});if(!l)this.nav=l=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,k,k).on("click",function(){b.scroll(-1,j)}).add(l),this.pager=d.text("",15,10).css(i.style).add(l),this.down=d.symbol("triangle-down",0,0,k,k).on("click",
+function(){b.scroll(1,j)}).add(l);b.scroll(0);a=f}else if(l)h.attr({height:c.chartHeight}),l.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pageCount,d=this.currentPage+a,e=this.clipHeight,f=this.options.navigation,g=f.activeColor,h=f.inactiveColor,f=this.pager,i=this.padding;d>c&&(d=c);if(d>0)b!==w&&La(b,this.chart),this.nav.attr({translateX:i,translateY:e+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:d===1?h:g}).css({cursor:d===
+1?"default":"pointer"}),f.attr({text:d+"/"+this.pageCount}),this.down.attr({x:18+this.pager.getBBox().width,fill:d===c?h:g}).css({cursor:d===c?"default":"pointer"}),e=-I(e*(d-1),this.fullHeight-e+i)+1,this.scrollGroup.animate({translateY:e}),f.attr({text:d+"/"+c}),this.currentPage=d,this.positionCheckboxes(e)}};/Trident.*?11\.0/.test(oa)&&mb(eb.prototype,"positionItem",function(a,b){var c=this;setTimeout(function(){a.call(c,b)})});yb.prototype={init:function(a,b){var c,d=a.series;a.series=null;c=
+x(M,a);c.series=a.series=d;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=Ga.length;Ga.push(f);d.reflow!==!1&&J(f,"load",function(){f.initReflow()});if(e)for(g in e)J(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=$?!1:o(d.animation,!0);f.pointCount=0;f.counters=new Jb;f.firstRender()},
+initSeries:function(a){var b=this.options.chart;(b=W[a.type||b.type||b.defaultSeriesType])||ka(17,!0);b=new b;b.init(this,a);return b},addSeries:function(a,b,c){var d,e=this;a&&(b=o(b,!0),z(e,"addSeries",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?"xAxis":"yAxis",f=this.options;new db(this,x(a,{index:this[e].length,isX:b}));f[e]=ja(f[e]||{});f[e].push(a);o(c,!0)&&this.redraw(d)},isInsidePlot:function(a,b,
+c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&n(this.axes,function(a){a.adjustTickAmount()});this.maxTicks=null},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.isDirtyBox,j=c.length,k=j,l=this.renderer,m=l.isHidden(),p=[];La(a,this);m&&this.cloneRenderTo();for(this.layOutTitles();k--;)if(a=c[k],a.options.stacking&&(g=!0,a.isDirty)){h=!0;
+break}if(h)for(k=j;k--;)if(a=c[k],a.options.stacking)a.isDirty=!0;n(c,function(a){a.isDirty&&a.options.legendType==="point"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(this.hasCartesianSeries){if(!this.isResizing)this.maxTicks=null,n(b,function(a){a.setScale()});this.adjustTickAmounts();this.getMargins();n(b,function(a){a.isDirty&&(i=!0)});n(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,p.push(function(){z(a,"afterSetExtremes",r(a.eventArgs,
+a.getExtremes()));delete a.eventArgs});(i||g)&&a.redraw()})}i&&this.drawChartBox();n(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset&&d.reset(!0);l.draw();z(this,"redraw");m&&this.cloneRenderTo(!0);n(p,function(a){a.call()})},showLoading:function(a){var b=this.options,c=this.loadingDiv,d=b.loading;if(!c)this.loadingDiv=c=U(Ea,{className:"highcharts-loading"},r(d.style,{zIndex:10,display:S}),this.container),this.loadingSpan=U("span",null,d.labelStyle,c);this.loadingSpan.innerHTML=
+a||b.lang.loading;if(!this.loadingShown)K(c,{opacity:0,display:"",left:this.plotLeft+"px",top:this.plotTop+"px",width:this.plotWidth+"px",height:this.plotHeight+"px"}),Bb(c,{opacity:d.style.opacity},{duration:d.showDuration||0}),this.loadingShown=!0},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&Bb(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){K(b,{display:S})}});this.loadingShown=!1},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id===
+a)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis=ja(b.xAxis||{}),b=b.yAxis=ja(b.yAxis||{});n(c,function(a,b){a.index=b;a.isX=!0});n(b,function(a,b){a.index=b});c=c.concat(b);n(c,function(b){new db(a,b)});a.adjustTickAmounts()},getSelectedPoints:function(){var a=[];n(this.series,function(b){a=a.concat(ub(b.points||[],
+function(a){return a.selected}))});return a},getSelectedSeries:function(){return ub(this.series,function(a){return a.selected})},getStacks:function(){var a=this;n(a.yAxis,function(a){if(a.stacks&&a.hasVisibleSeries)a.oldStacks=a.stacks});n(a.series,function(b){if(b.options.stacking&&(b.visible===!0||a.options.chart.ignoreHiddenSeries===!1))b.stackKey=b.type+o(b.options.stack,"")})},showResetZoom:function(){var a=this,b=M.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo===
+"chart"?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,f)},zoomOut:function(){var a=this;z(a,"selection",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var b,c=this.pointer,d=!1,e;!a||a.resetSelection?n(this.axes,function(a){b=a.zoom()}):n(a.xAxis.concat(a.yAxis),function(a){var e=a.axis,h=e.isXAxis;if(c[h?"zoomX":"zoomY"]||c[h?"pinchX":"pinchY"])b=
+e.zoom(a.min,a.max),e.displayBtn&&(d=!0)});e=this.resetZoomButton;if(d&&!e)this.showResetZoom();else if(!d&&T(e))this.resetZoomButton=e.destroy();b&&this.redraw(o(this.options.chart.animation,a&&a.animation,this.pointCount<100))},pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&n(d,function(a){a.setState()});n(b==="xy"?[1,0]:[1],function(b){var d=a[b?"chartX":"chartY"],h=c[b?"xAxis":"yAxis"][0],i=c[b?"mouseDownX":"mouseDownY"],j=(h.pointRange||0)/2,k=h.getExtremes(),l=h.toValue(i-d,!0)+j,i=h.toValue(i+
+c[b?"plotWidth":"plotHeight"]-d,!0)-j;h.series.length&&l>I(k.dataMin,k.min)&&i<s(k.dataMax,k.max)&&(h.setExtremes(l,i,!1,!1,{trigger:"pan"}),e=!0);c[b?"mouseDownX":"mouseDownY"]=d});e&&c.redraw(!1);K(c.container,{cursor:"move"})},setTitle:function(a,b){var f;var c=this,d=c.options,e;e=d.title=x(d.title,a);f=d.subtitle=x(d.subtitle,b),d=f;n([["title",a,e],["subtitle",b,d]],function(a){var b=a[0],d=c[b],e=a[1],a=a[2];d&&e&&(c[b]=d=d.destroy());a&&a.text&&!d&&(c[b]=c.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,
+"class":"highcharts-"+b,zIndex:a.zIndex||4}).css(a.style).add())});c.layOutTitles()},layOutTitles:function(){var a=0,b=this.title,c=this.subtitle,d=this.options,e=d.title,d=d.subtitle,f=this.spacingBox.width-44;if(b&&(b.css({width:(e.width||f)+"px"}).align(r({y:15},e),!1,"spacingBox"),!e.floating&&!e.verticalAlign))a=b.getBBox().height,a>=18&&a<=25&&(a=15);c&&(c.css({width:(d.width||f)+"px"}).align(r({y:a+e.margin},d),!1,"spacingBox"),!d.floating&&!d.verticalAlign&&(a=xa(a+c.getBBox().height)));this.titleOffset=
+a},getChartSize:function(){var a=this.options.chart,b=this.renderToClone||this.renderTo;this.containerWidth=jb(b,"width");this.containerHeight=jb(b,"height");this.chartWidth=s(0,a.width||this.containerWidth||600);this.chartHeight=s(0,o(a.height,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Ta(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=
+b=this.renderTo.cloneNode(0),K(b,{position:"absolute",top:"-9999px",display:"block"}),y.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,c,d,e;this.renderTo=a=b.renderTo;e="highcharts-"+zb++;if(ea(a))this.renderTo=a=y.getElementById(a);a||ka(13,!0);c=C(v(a,"data-highcharts-chart"));!isNaN(c)&&Ga[c]&&Ga[c].destroy();v(a,"data-highcharts-chart",this.index);a.innerHTML="";a.offsetWidth||this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight;
+this.container=a=U(Ea,{className:"highcharts-container"+(b.className?" "+b.className:""),id:e},r({position:"relative",overflow:"hidden",width:c+"px",height:d+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},b.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=b.forExport?new Ha(a,c,d,!0):new Va(a,c,d);$&&this.renderer.create(this,a,c,d)},getMargins:function(){var a=this.spacing,b,c=this.legend,d=this.margin,e=this.options.legend,
+f=o(e.margin,10),g=e.x,h=e.y,i=e.align,j=e.verticalAlign,k=this.titleOffset;this.resetMargins();b=this.axisOffset;if(k&&!u(d[0]))this.plotTop=s(this.plotTop,k+this.options.title.margin+a[0]);if(c.display&&!e.floating)if(i==="right"){if(!u(d[1]))this.marginRight=s(this.marginRight,c.legendWidth-g+f+a[1])}else if(i==="left"){if(!u(d[3]))this.plotLeft=s(this.plotLeft,c.legendWidth+g+f+a[3])}else if(j==="top"){if(!u(d[0]))this.plotTop=s(this.plotTop,c.legendHeight+h+f+a[0])}else if(j==="bottom"&&!u(d[2]))this.marginBottom=
+s(this.marginBottom,c.legendHeight-h+f+a[2]);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);this.hasCartesianSeries&&n(this.axes,function(a){a.getOffset()});u(d[3])||(this.plotLeft+=b[3]);u(d[0])||(this.plotTop+=b[0]);u(d[2])||(this.marginBottom+=b[2]);u(d[1])||(this.marginRight+=b[1]);this.setChartSize()},initReflow:function(){function a(a){var g=c.width||jb(d,"width"),h=c.height||jb(d,"height"),a=a?a.target:O;if(!b.hasUserSize&&
+g&&h&&(a===O||a===y)){if(g!==b.containerWidth||h!==b.containerHeight)clearTimeout(e),b.reflowTimeout=e=setTimeout(function(){if(b.container)b.setSize(g,h,!1),b.hasUserSize=null},100);b.containerWidth=g;b.containerHeight=h}}var b=this,c=b.options.chart,d=b.renderTo,e;b.reflow=a;J(O,"resize",a);J(b,"destroy",function(){aa(O,"resize",a)})},setSize:function(a,b,c){var d=this,e,f,g;d.isResizing+=1;g=function(){d&&z(d,"endResize",null,function(){d.isResizing-=1})};La(c,d);d.oldChartHeight=d.chartHeight;
+d.oldChartWidth=d.chartWidth;if(u(a))d.chartWidth=e=s(0,t(a)),d.hasUserSize=!!e;if(u(b))d.chartHeight=f=s(0,t(b));K(d.container,{width:e+"px",height:f+"px"});d.setChartSize(!0);d.renderer.setSize(e,f,c);d.maxTicks=null;n(d.axes,function(a){a.isDirty=!0;a.setScale()});n(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.getMargins();d.redraw(c);d.oldChartHeight=null;z(d,"resize");Fa===!1?g():setTimeout(g,Fa&&Fa.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,
+d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,j,k,l;this.plotLeft=i=t(this.plotLeft);this.plotTop=j=t(this.plotTop);this.plotWidth=k=s(0,t(d-i-this.marginRight));this.plotHeight=l=s(0,t(e-j-this.marginBottom));this.plotSizeX=b?l:k;this.plotSizeY=b?k:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:l};d=2*P(this.plotBorderWidth/2);
+b=xa(s(d,h[3])/2);c=xa(s(d,h[0])/2);this.clipBox={x:b,y:c,width:P(this.plotSizeX-s(d,h[1])/2-b),height:P(this.plotSizeY-s(d,h[2])/2-c)};a||n(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this.spacing,b=this.margin;this.plotTop=o(b[0],a[0]);this.marginRight=o(b[1],a[1]);this.marginBottom=o(b[2],a[2]);this.plotLeft=o(b[3],a[3]);this.axisOffset=[0,0,0,0];this.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,
+d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,p,q=this.plotLeft,o=this.plotTop,n=this.plotWidth,s=this.plotHeight,t=this.plotBox,u=this.clipRect,r=this.clipBox;p=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp(null,null,null,c-p,d-p));else{e={fill:j||S};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=b.rect(p/2,p/
+2,c-p,d-p,a.borderRadius,i).attr(e).add().shadow(a.shadow)}if(k)f?f.animate(t):this.plotBackground=b.rect(q,o,n,s,0).attr({fill:k}).add().shadow(a.plotShadow);if(l)h?h.animate(t):this.plotBGImage=b.image(l,q,o,n,s).add();u?u.animate({width:r.width,height:r.height}):this.clipRect=b.clipRect(r);if(m)g?g.animate(g.crisp(null,q,o,n,s)):this.plotBorder=b.rect(q,o,n,s,0,-m).attr({stroke:a.plotBorderColor,"stroke-width":m,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,
+c,d=a.options.series,e,f;n(["inverted","angular","polar"],function(g){c=W[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=W[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;n(b,function(a){a.linkedSeries.length=0});n(b,function(b){var d=b.options.linkedTo;if(ea(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d})},render:function(){var a=this,b=a.axes,c=a.renderer,d=a.options,
+e=d.labels,f=d.credits,g;a.setTitle();a.legend=new eb(a,d.legend);a.getStacks();n(b,function(a){a.setScale()});a.getMargins();a.maxTicks=null;n(b,function(a){a.setTickPositions(!0);a.setMaxTicks()});a.adjustTickAmounts();a.getMargins();a.drawChartBox();a.hasCartesianSeries&&n(b,function(a){a.render()});if(!a.seriesGroup)a.seriesGroup=c.g("series-group").attr({zIndex:3}).add();n(a.series,function(a){a.translate();a.setTooltipPoints();a.render()});e.items&&n(e.items,function(b){var d=r(e.style,b.style),
+f=C(d.left)+a.plotLeft,g=C(d.top)+a.plotTop+12;delete d.left;delete d.top;c.text(b.html,f,g).attr({zIndex:2}).css(d).add()});if(f.enabled&&!a.credits)g=f.href,a.credits=c.text(f.text,0,0).on("click",function(){if(g)location.href=g}).attr({align:f.position.align,zIndex:8}).css(f.style).add().align(f.position);a.hasRendered=!0},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;z(a,"destroy");Ga[a.index]=w;a.renderTo.removeAttribute("data-highcharts-chart");aa(a);for(e=
+b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();n("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML="",aa(d),f&&Ta(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!Z&&O==O.top&&y.readyState!=="complete"||$&&!O.canvg?($?Tb.push(function(){a.firstRender()},
+a.options.global.canvasToolsURL):y.attachEvent("onreadystatechange",function(){y.detachEvent("onreadystatechange",a.firstRender);y.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender())a.getContainer(),z(a,"init"),a.resetMargins(),a.setChartSize(),a.propFromSeries(),a.getAxes(),n(b.series||[],function(b){a.initSeries(b)}),a.linkSeries(),z(a,"beforeRender"),a.pointer=new xb(a,b),a.render(),a.renderer.draw(),c&&c.apply(a,
+[a]),n(a.callbacks,function(b){b.apply(a,[a])}),a.cloneRenderTo(!0),z(a,"load")},splashArray:function(a,b){var c=b[a],c=T(c)?c:[c,c,c,c];return[o(b[a+"Top"],c[0]),o(b[a+"Right"],c[1]),o(b[a+"Bottom"],c[2]),o(b[a+"Left"],c[3])]}};yb.prototype.callbacks=[];var Pa=function(){};Pa.prototype={init:function(a,b,c){this.series=a;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter=
+0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.pointValKey,a=Pa.prototype.optionsToObject.call(this,a);r(this,a);this.options=this.options?r(this.options,a):a;if(d)this.y=this[d];if(this.x===w&&c)this.x=b===w?c.autoIncrement():b;return this},optionsToObject:function(a){var b,c=this.series,d=c.pointArrayMap||["y"],e=d.length,f=0,g=0;if(typeof a==="number"||a===null)b={y:a};else if(Ia(a)){b={};if(a.length>e){c=typeof a[0];if(c==="string")b.name=a[0];else if(c===
+"number")b.x=a[0];f++}for(;g<e;)b[d[g++]]=a[f++]}else if(typeof a==="object"){b=a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}return b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),ga(b,this),!b.length))a.hoverPoints=null;if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)aa(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=null},destroyElements:function(){for(var a=
+"graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup".split(","),b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},select:function(a,b){var c=this,d=c.series,e=d.chart,a=o(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[qa(c,d.data)]=
+c.options;c.setState(a&&"select");b||n(e.getSelectedPoints(),function(a){if(a.selected&&a!==c)a.selected=a.options.selected=!1,d.options.data[qa(a,d.data)]=a.options,a.setState(""),a.firePointEvent("unselect")})})},onMouseOver:function(a){var b=this.series,c=b.chart,d=c.tooltip,e=c.hoverPoint;if(e&&e!==this)e.onMouseOut();this.firePointEvent("mouseOver");d&&(!d.shared||b.noSharedTooltip)&&d.refresh(this,a);this.setState("hover");c.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints;
+if(!b||qa(this,b)===-1)this.firePointEvent("mouseOut"),this.setState(),a.hoverPoint=null},tooltipFormatter:function(a){var b=this.series,c=b.tooltipOptions,d=o(c.valueDecimals,""),e=c.valuePrefix||"",f=c.valueSuffix||"";n(b.pointArrayMap||["y"],function(b){b="{point."+b;if(e||f)a=a.replace(b+"}",e+b+"}"+f);a=a.replace(b+"}",b+":,."+d+"f}")});return Ca(a,{point:this,series:this.series})},update:function(a,b,c){var d=this,e=d.series,f=d.graphic,g,h=e.data,i=e.chart,j=e.options,b=o(b,!0);d.firePointEvent("update",
+{options:a},function(){d.applyOptions(a);if(T(a)&&(e.getAttribs(),f))a.marker&&a.marker.symbol?d.graphic=f.destroy():f.attr(d.pointAttr[d.state||""]);g=qa(d,h);e.xData[g]=d.x;e.yData[g]=e.toYData?e.toYData(d):d.y;e.zData[g]=d.z;j.data[g]=d.options;e.isDirty=e.isDirtyData=!0;if(!e.fixedBox&&e.hasCartesianSeries)i.isDirtyBox=!0;j.legendType==="point"&&i.legend.destroyItem(d);b&&i.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.points,f=d.chart,g,h=d.data;La(b,f);a=o(a,!0);c.firePointEvent("remove",
+null,function(){g=qa(c,h);h.length===e.length&&e.splice(g,1);h.splice(g,1);d.options.data.splice(g,1);d.xData.splice(g,1);d.yData.splice(g,1);d.zData.splice(g,1);c.destroy();d.isDirty=!0;d.isDirtyData=!0;a&&f.redraw()})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a==="click"&&e.allowPointSelect&&(c=function(a){d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});z(this,a,b,c)},importEvents:function(){if(!this.hasImportedEvents){var a=
+x(this.series.options.point,this.options).events,b;this.events=a;for(b in a)J(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a){var b=this.plotX,c=this.plotY,d=this.series,e=d.options.states,f=Y[d.type].marker&&d.options.marker,g=f&&!f.enabled,h=f&&f.states[a],i=h&&h.enabled===!1,j=d.stateMarkerGraphic,k=this.marker||{},l=d.chart,m=this.pointAttr,a=a||"";if(!(a===this.state||this.selected&&a!=="select"||e[a]&&e[a].enabled===!1||a&&(i||g&&!h.enabled))){if(this.graphic)e=f&&this.graphic.symbolName&&
+m[a].r,this.graphic.attr(x(m[a],e?{x:b-e,y:c-e,width:2*e,height:2*e}:{}));else{if(a&&h)e=h.radius,k=k.symbol||d.symbol,j&&j.currentSymbol!==k&&(j=j.destroy()),j?j.attr({x:b-e,y:c-e}):(d.stateMarkerGraphic=j=l.renderer.symbol(k,b-e,c-e,2*e,2*e).attr(m[a]).add(d.markerGroup),j.currentSymbol=k);if(j)j[a&&l.isInsidePlot(b,c)?"show":"hide"]()}this.state=a}}};var Q=function(){};Q.prototype={isCartesian:!0,type:"line",pointClass:Pa,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",
+fill:"fillColor",r:"radius"},colorCounter:0,init:function(a,b){var c,d,e=a.series;this.chart=a;this.options=b=this.setOptions(b);this.linkedSeries=[];this.bindAxes();r(this,{name:b.name,state:"",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if($)b.animation=!1;d=b.events;for(c in d)J(this,c,d[c]);if(d&&d.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;this.getColor();this.getSymbol();this.setData(b.data,!1);if(this.isCartesian)a.hasCartesianSeries=
+!0;e.push(this);this._i=e.length-1;Kb(e,function(a,b){return o(a.options.index,a._i)-o(b.options.index,a._i)});n(e,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;a.isCartesian&&n(["xAxis","yAxis"],function(e){n(c[e],function(c){d=c.options;if(b[e]===d.index||b[e]!==w&&b[e]===d.id||b[e]===w&&d.index===0)c.series.push(a),a[e]=c,c.isDirty=!0});a[e]||ka(18,!0)})},autoIncrement:function(){var a=this.options,b=this.xIncrement,b=o(b,a.pointStart,
+0);this.pointInterval=o(this.pointInterval,a.pointInterval,1);this.xIncrement=b+this.pointInterval;return b},getSegments:function(){var a=-1,b=[],c,d=this.points,e=d.length;if(e)if(this.options.connectNulls){for(c=e;c--;)d[c].y===null&&d.splice(c,1);d.length&&(b=[d])}else n(d,function(c,g){c.y===null?(g>a+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart.options,c=b.plotOptions,d=c[this.type];this.userOptions=a;a=x(d,c.series,
+a);this.tooltipOptions=x(b.tooltip,a.tooltip);d.marker===null&&delete a.marker;return a},getColor:function(){var a=this.options,b=this.userOptions,c=this.chart.options.colors,d=this.chart.counters,e;e=a.color||Y[this.type].color;if(!e&&!a.colorByPoint)u(b._colorIndex)?a=b._colorIndex:(b._colorIndex=d.color,a=d.color++),e=c[a];this.color=e;d.wrapColor(c.length)},getSymbol:function(){var a=this.userOptions,b=this.options.marker,c=this.chart,d=c.options.symbols,c=c.counters;this.symbol=b.symbol;if(!this.symbol)u(a._symbolIndex)?
+a=a._symbolIndex:(a._symbolIndex=c.symbol,a=c.symbol++),this.symbol=d[a];if(/^url/.test(this.symbol))b.radius=0;c.wrapSymbol(d.length)},drawLegendSymbol:function(a){var b=this.options,c=b.marker,d=a.options,e;e=d.symbolWidth;var f=this.chart.renderer,g=this.legendGroup,a=a.baseline-t(f.fontMetrics(d.itemStyle.fontSize).b*0.3);if(b.lineWidth){d={"stroke-width":b.lineWidth};if(b.dashStyle)d.dashstyle=b.dashStyle;this.legendLine=f.path(["M",0,a,"L",e,a]).attr(d).add(g)}if(c&&c.enabled)b=c.radius,this.legendSymbol=
+e=f.symbol(this.symbol,e/2-b,a-b,2*b,2*b).add(g),e.isMarker=!0},addPoint:function(a,b,c,d){var e=this.options,f=this.data,g=this.graph,h=this.area,i=this.chart,j=this.xData,k=this.yData,l=this.zData,m=this.names,p=g&&g.shift||0,q=e.data,s;La(d,i);c&&n([g,h,this.graphNeg,this.areaNeg],function(a){if(a)a.shift=p+1});if(h)h.isArea=!0;b=o(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);g=d.x;h=j.length;if(this.requireSorting&&g<j[h-1])for(s=!0;h&&j[h-1]>g;)h--;j.splice(h,0,g);
+k.splice(h,0,this.toYData?this.toYData(d):d.y);l.splice(h,0,d.z);if(m)m[g]=d.name;q.splice(h,0,a);s&&(this.data.splice(h,0,null),this.processData());e.legendType==="point"&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),j.shift(),k.shift(),l.shift(),q.shift()));this.isDirtyData=this.isDirty=!0;b&&(this.getAttribs(),i.redraw())},setData:function(a,b){var c=this.points,d=this.options,e=this.chart,f=null,g=this.xAxis,h=g&&g.categories&&!g.categories.length?[]:null,i;this.xIncrement=
+null;this.pointRange=g&&g.categories?1:d.pointRange;this.colorCounter=0;var j=[],k=[],l=[],m=a?a.length:[];i=o(d.turboThreshold,1E3);var p=this.pointArrayMap,p=p&&p.length,q=!!this.toYData;if(i&&m>i){for(i=0;f===null&&i<m;)f=a[i],i++;if(sa(f)){f=o(d.pointStart,0);d=o(d.pointInterval,1);for(i=0;i<m;i++)j[i]=f,k[i]=a[i],f+=d;this.xIncrement=f}else if(Ia(f))if(p)for(i=0;i<m;i++)d=a[i],j[i]=d[0],k[i]=d.slice(1,p+1);else for(i=0;i<m;i++)d=a[i],j[i]=d[0],k[i]=d[1];else ka(12)}else for(i=0;i<m;i++)if(a[i]!==
+w&&(d={series:this},this.pointClass.prototype.applyOptions.apply(d,[a[i]]),j[i]=d.x,k[i]=q?this.toYData(d):d.y,l[i]=d.z,h&&d.name))h[d.x]=d.name;ea(k[0])&&ka(14,!0);this.data=[];this.options.data=a;this.xData=j;this.yData=k;this.zData=l;this.names=h;for(i=c&&c.length||0;i--;)c[i]&&c[i].destroy&&c[i].destroy();if(g)g.minRange=g.userMinRange;this.isDirty=this.isDirtyData=e.isDirtyBox=!0;o(b,!0)&&e.redraw(!1)},remove:function(a,b){var c=this,d=c.chart,a=o(a,!0);if(!c.isRemoving)c.isRemoving=!0,z(c,"remove",
+null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)});c.isRemoving=!1},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e;e=0;var f,g,h=this.xAxis,i=this.options,j=i.cropThreshold,k=this.isCartesian;if(k&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!a)return!1;if(k&&this.sorted&&(!j||d>j||this.forceCrop))if(a=h.min,h=h.max,b[d-1]<a||b[0]>h)b=[],c=[];else if(b[0]<a||b[d-1]>h)e=this.cropData(this.xData,this.yData,a,h),b=e.xData,c=e.yData,e=e.start,
+f=!0;for(h=b.length-1;h>=0;h--)d=b[h]-b[h-1],d>0&&(g===w||d<g)?g=d:d<0&&this.requireSorting&&ka(15);this.cropped=f;this.cropStart=e;this.processedXData=b;this.processedYData=c;if(i.pointRange===null)this.pointRange=g||1;this.closestPointRange=g},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,h=o(this.cropShoulder,1),i;for(i=0;i<e;i++)if(a[i]>=c){f=s(0,i-h);break}for(;i<e;i++)if(a[i]>d){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,
+b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(m=0;m<g;m++)i=h+m,j?l[m]=(new f).init(this,[d[m]].concat(ja(e[m]))):(b[i]?k=b[i]:a[i]!==w&&(b[i]=k=(new f).init(this,a[i],d[m])),l[m]=k);if(b&&(g!==(c=b.length)||j))for(m=0;m<c;m++)if(m===h&&!j&&(m+=g),b[m])b[m].destroyElements(),b[m].plotX=w;this.data=b;this.points=l},setStackedPoints:function(){if(this.options.stacking&&
+!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var a=this.processedXData,b=this.processedYData,c=[],d=b.length,e=this.options,f=e.threshold,g=e.stack,e=e.stacking,h=this.stackKey,i="-"+h,j=this.negStacks,k=this.yAxis,l=k.stacks,m=k.oldStacks,p,q,o,n,t;for(o=0;o<d;o++){n=a[o];t=b[o];q=(p=j&&t<f)?i:h;l[q]||(l[q]={});if(!l[q][n])m[q]&&m[q][n]?(l[q][n]=m[q][n],l[q][n].total=null):l[q][n]=new Mb(k,k.options.stackLabels,p,n,g,e);q=l[q][n];q.points[this.index]=[q.cum||0];e==="percent"?
+(p=p?h:i,j&&l[p]&&l[p][n]?(p=l[p][n],q.total=p.total=s(p.total,q.total)+N(t)||0):q.total+=N(t)||0):q.total+=t||0;q.cum=(q.cum||0)+(t||0);q.points[this.index].push(q.cum);c[o]=q.cum}if(e==="percent")k.usePercentage=!0;this.stackedYData=c;k.oldStacks={}}},setPercentStacks:function(){var a=this,b=a.stackKey,c=a.yAxis.stacks;n([b,"-"+b],function(b){var d;for(var e=a.xData.length,f,g;e--;)if(f=a.xData[e],d=(g=c[b]&&c[b][f])&&g.points[a.index],f=d)g=g.total?100/g.total:0,f[0]=ia(f[0]*g),f[1]=ia(f[1]*g),
+a.stackedYData[e]=f[1]})},getExtremes:function(){var a=this.yAxis,b=this.processedXData,c=this.stackedYData||this.processedYData,d=c.length,e=[],f=0,g=this.xAxis.getExtremes(),h=g.min,g=g.max,i,j,k,l;for(l=0;l<d;l++)if(j=b[l],k=c[l],i=k!==null&&k!==w&&(!a.isLog||k.length||k>0),j=this.getExtremesFromAll||this.cropped||(b[l+1]||j)>=h&&(b[l-1]||j)<=g,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=o(void 0,Ja(e));this.dataMax=o(void 0,va(e))},translate:function(){this.processedXData||
+this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i==="between"||sa(i),k=a.threshold,a=0;a<g;a++){var l=f[a],m=l.x,p=l.y,q=l.low,n=e.stacks[(this.negStacks&&p<k?"-":"")+this.stackKey];if(e.isLog&&p<=0)l.y=p=null;l.plotX=c.translate(m,0,0,0,1,i,this.type==="flags");if(b&&this.visible&&n&&n[m])n=n[m],p=n.points[this.index],q=p[0],p=p[1],q===0&&(q=o(k,e.min)),e.isLog&&
+q<=0&&(q=null),l.percentage=b==="percent"&&p,l.total=l.stackTotal=n.total,l.stackY=p,n.setOffset(this.pointXOffset||0,this.barW||0);l.yBottom=u(q)?e.translate(q,0,1,0,1):null;h&&(p=this.modifyValue(p,l));l.plotY=typeof p==="number"&&p!==Infinity?e.translate(p,0,1,0,1):w;l.clientX=j?c.translate(m,0,0,0,1):l.plotX;l.negative=l.y<(k||0);l.category=d&&d[l.x]!==w?d[l.x]:l.x}this.getSegments()},setTooltipPoints:function(a){var b=[],c,d,e=this.xAxis,f=e&&e.getExtremes(),g=e?e.tooltipLen||e.len:this.chart.plotSizeX,
+h,i,j=[];if(this.options.enableMouseTracking!==!1){if(a)this.tooltipPoints=null;n(this.segments||this.points,function(a){b=b.concat(a)});e&&e.reversed&&(b=b.reverse());this.orderTooltipPoints&&this.orderTooltipPoints(b);a=b.length;for(i=0;i<a;i++)if(e=b[i],c=e.x,c>=f.min&&c<=f.max){h=b[i+1];c=d===w?0:d+1;for(d=b[i+1]?I(s(0,P((e.clientX+(h?h.wrappedClientX||h.clientX:g))/2)),g):g;c>=0&&c<=d;)j[c++]=e}this.tooltipPoints=j}},tooltipHeaderFormatter:function(a){var b=this.tooltipOptions,c=b.xDateFormat,
+d=b.dateTimeLabelFormats,e=this.xAxis,f=e&&e.options.type==="datetime",b=b.headerFormat,e=e&&e.closestPointRange,g;if(f&&!c)if(e)for(g in D){if(D[g]>=e){c=d[g];break}}else c=d.day;f&&c&&sa(a.key)&&(b=b.replace("{point.key}","{point.key:"+c+"}"));return Ca(b,{point:a,series:this})},onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&z(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,
+b=this.chart,c=b.tooltip,d=b.hoverPoint;if(d)d.onMouseOut();this&&a.events.mouseOut&&z(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b=this,c=b.chart,d=c.renderer,e;e=b.options.animation;var f=c.clipBox,g=c.inverted,h;if(e&&!T(e))e=Y[b.type].animation;h="_sharedClip"+e.duration+e.easing;if(a)a=c[h],e=c[h+"m"],a||(c[h]=a=d.clipRect(r(f,{width:0})),c[h+"m"]=e=d.clipRect(-99,g?-c.plotLeft:-c.plotTop,99,g?
+c.chartWidth:c.chartHeight)),b.group.clip(a),b.markerGroup.clip(e),b.sharedClipKey=h;else{if(a=c[h])a.animate({width:c.plotSizeX},e),c[h+"m"].animate({width:c.plotSizeX+99},e);b.animate=null;b.animationTimeout=setTimeout(function(){b.afterAnimate()},e.duration)}},afterAnimate:function(){var a=this.chart,b=this.sharedClipKey,c=this.group;c&&this.options.clip!==!1&&(c.clip(a.clipRect),this.markerGroup.clip());setTimeout(function(){b&&a[b]&&(a[b]=a[b].destroy(),a[b+"m"]=a[b+"m"].destroy())},100)},drawPoints:function(){var a,
+b=this.points,c=this.chart,d,e,f,g,h,i,j,k,l=this.options.marker,m,p=this.markerGroup;if(l.enabled||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=P(g.plotX),e=g.plotY,k=g.graphic,i=g.marker||{},a=l.enabled&&i.enabled===w||i.enabled,m=c.isInsidePlot(t(d),e,c.inverted),a&&e!==w&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""],h=a.r,i=o(i.symbol,this.symbol),j=i.indexOf("url")===0,k)k.attr({visibility:m?Z?"inherit":"visible":"hidden"}).animate(r({x:d-h,y:e-h},k.symbolName?{width:2*
+h,height:2*h}:{}));else{if(m&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(p)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=o(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=Y[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color,h={stroke:g,fill:g},i=a.points||[],j=[],k,l=a.pointAttrToOptions,m=b.negativeColor,p=c.lineColor,q;
+b.marker?(e.radius=e.radius||c.radius+2,e.lineWidth=e.lineWidth||c.lineWidth+1):e.color=e.color||ra(e.color||g).brighten(e.brightness).get();j[""]=a.convertAttribs(c,h);n(["hover","select"],function(b){j[b]=a.convertAttribs(d[b],j[""])});a.pointAttr=j;for(g=i.length;g--;){h=i[g];if((c=h.options&&h.options.marker||h.options)&&c.enabled===!1)c.radius=0;if(h.negative&&m)h.color=h.fillColor=m;f=b.colorByPoint||h.color;if(h.options)for(q in l)u(c[l[q]])&&(f=!0);if(f){c=c||{};k=[];d=c.states||{};f=d.hover=
+d.hover||{};if(!b.marker)f.color=ra(f.color||h.color).brighten(f.brightness||e.brightness).get();k[""]=a.convertAttribs(r({color:h.color,fillColor:h.color,lineColor:p===null?h.color:w},c),j[""]);k.hover=a.convertAttribs(d.hover,j.hover,k[""]);k.select=a.convertAttribs(d.select,j.select,k[""])}else k=j;h.pointAttr=k}},update:function(a,b){var c=this.chart,d=this.type,e=W[d].prototype,f,a=x(this.userOptions,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1);
+for(f in e)e.hasOwnProperty(f)&&(this[f]=w);r(this,W[a.type||d].prototype);this.init(c,a);o(b,!0)&&c.redraw(!1)},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(oa),d,e,f=a.data||[],g,h,i;z(a,"destroy");aa(a);n(["xAxis","yAxis"],function(b){if(i=a[b])ga(i.series,a),i.isDirty=i.forceRedraw=!0,i.stacks={}});a.legendItem&&a.chart.legend.destroyItem(a);for(e=f.length;e--;)(g=f[e])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);n("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","),
+function(b){a[b]&&(d=c&&b==="group"?"hide":"destroy",a[b][d]())});if(b.hoverSeries===a)b.hoverSeries=null;ga(b.series,a);for(h in a)delete a[h]},drawDataLabels:function(){var a=this,b=a.options.dataLabels,c=a.points,d,e,f,g;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),g=a.plotGroup("dataLabelsGroup","data-labels",a.visible?"visible":"hidden",b.zIndex||6),e=b,n(c,function(c){var i,j=c.dataLabel,k,l,m=c.connector,p=!0;d=c.options&&c.options.dataLabels;i=o(d&&d.enabled,e.enabled);
+if(j&&!i)c.dataLabel=j.destroy();else if(i){b=x(e,d);i=b.rotation;k=c.getLabelConfig();f=b.format?Ca(b.format,k):b.formatter.call(k,b);b.style.color=o(b.color,b.style.color,a.color,"black");if(j)if(u(f))j.attr({text:f}),p=!1;else{if(c.dataLabel=j=j.destroy(),m)c.connector=m.destroy()}else if(u(f)){j={fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth,r:b.borderRadius||0,rotation:i,padding:b.padding,zIndex:1};for(l in j)j[l]===w&&delete j[l];j=c.dataLabel=a.chart.renderer[i?"text":
+"label"](f,0,-999,null,null,null,b.useHTML).attr(j).css(b.style).add(g).shadow(b.shadow)}j&&a.alignDataLabel(c,j,b,null,p)}})},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=o(a.plotX,-999),i=o(a.plotY,-999),j=b.getBBox();if(a=this.visible&&f.isInsidePlot(a.plotX,a.plotY,g))d=r({x:g?f.plotWidth-i:h,y:t(g?f.plotHeight-h:i),width:0,height:0},d),r(c,{width:j.width,height:j.height}),c.rotation?(g={align:c.align,x:d.x+c.x+d.width/2,y:d.y+c.y+d.height/2},b[e?"attr":"animate"](g)):(b.align(c,
+null,d),g=b.alignAttr,o(c.overflow,"justify")==="justify"?this.justifyDataLabel(b,c,g,j,d,e):o(c.crop,!0)&&(a=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+j.width,g.y+j.height)));a||b.attr({y:-999})},justifyDataLabel:function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k;j=c.x;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0;j=c.y;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height;if(j>g.plotHeight)i===
+"top"?b.verticalAlign="bottom":b.y=g.plotHeight-j,k=!0;if(k)a.placed=!f,a.align(b,null,e)},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;n(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?"L":"M"),d&&f&&(i=a[f-1],d==="right"?c.push(i.plotX,h):d==="center"?c.push((i.plotX+g)/2,i.plotY,(i.plotX+g)/2,h):c.push(g,i.plotY)),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];n(a.segments,function(e){c=
+a.getSegmentPath(e);e.length>1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color]],d=b.lineWidth,e=b.dashStyle,f=this.getGraphPath(),g=b.negativeColor;g&&c.push(["graphNeg",g]);n(c,function(c,g){var j=c[0],k=a[j];if(k)Wa(k),k.animate({d:f});else if(d&&f.length)k={stroke:c[1],"stroke-width":d,zIndex:1},e?k.dashstyle=e:k["stroke-linecap"]=k["stroke-linejoin"]="round",a[j]=a.chart.renderer.path(f).attr(k).add(a.group).shadow(!g&&
+b.shadow)})},clipNeg:function(){var a=this.options,b=this.chart,c=b.renderer,d=a.negativeColor||a.negativeFillColor,e,f=this.graph,g=this.area,h=this.posClip,i=this.negClip;e=b.chartWidth;var j=b.chartHeight,k=s(e,j),l=this.yAxis;if(d&&(f||g)){d=t(l.toPixels(a.threshold||0,!0));a={x:0,y:0,width:k,height:d};k={x:0,y:d,width:k,height:k};if(b.inverted)a.height=k.y=b.plotWidth-d,c.isVML&&(a={x:b.plotWidth-d-b.plotLeft,y:0,width:e,height:j},k={x:d+b.plotLeft-e,y:0,width:b.plotLeft+d,height:e});l.reversed?
+(b=k,e=a):(b=a,e=k);h?(h.animate(b),i.animate(e)):(this.posClip=h=c.clipRect(b),this.negClip=i=c.clipRect(e),f&&this.graphNeg&&(f.clip(h),this.graphNeg.clip(i)),g&&(g.clip(h),this.areaNeg.clip(i)))}},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};n(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)J(c,"resize",a),J(b,"destroy",function(){aa(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a],
+g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e));f[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){return{translateX:this.xAxis?this.xAxis.left:this.chart.plotLeft,translateY:this.yAxis?this.yAxis.top:this.chart.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this.chart,b,c=this.options,d=c.animation&&!!this.animate&&a.renderer.isSVG,e=this.visible?"visible":"hidden",f=c.zIndex,g=this.hasRendered,h=a.seriesGroup;b=this.plotGroup("group",
+"series",e,f,h);this.markerGroup=this.plotGroup("markerGroup","markers",e,f,h);d&&this.animate(!0);this.getAttribs();b.inverted=this.isCartesian?a.inverted:!1;this.drawGraph&&(this.drawGraph(),this.clipNeg());this.drawDataLabels();this.drawPoints();this.options.enableMouseTracking!==!1&&this.drawTracker();a.inverted&&this.invertGroups();c.clip!==!1&&!this.sharedClipKey&&!g&&b.clip(a.clipRect);d?this.animate():g||this.afterAnimate();this.isDirty=this.isDirtyData=!1;this.hasRendered=!0},redraw:function(){var a=
+this.chart,b=this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:o(d&&d.left,a.plotLeft),translateY:o(e&&e.top,a.plotTop)}));this.translate();this.setTooltipPoints(!0);this.render();b&&z(this,"updatedData")},setState:function(a){var b=this.options,c=this.graph,d=this.graphNeg,e=b.states,b=b.lineWidth,a=a||"";if(this.state!==a)this.state=a,e[a]&&e[a].enabled===!1||(a&&(b=e[a].lineWidth||b+1),c&&!c.dashstyle&&
+(a={"stroke-width":b},c.attr(a),d&&d.attr(a)))},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===w?!h:a)?"show":"hide";n(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&n(d.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});n(c.linkedSeries,function(b){b.setVisible(a,
+!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();z(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===w?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;z(this,a?"select":"unselect")},drawTracker:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,l=k&&{cursor:k},k=a.singlePoints,m,p=function(){if(f.hoverSeries!==
+a)a.onMouseOver()};if(e&&!c)for(m=e+1;m--;)d[m]==="M"&&d.splice(m+1,0,d[m+1]-i,d[m+2],"L"),(m&&d[m]==="M"||m===e)&&d.splice(m,0,"L",d[m-2]+i,d[m-1]);for(m=0;m<k.length;m++)e=k[m],d.push("M",e.plotX-i,e.plotY,"L",e.plotX+i,e.plotY);j?j.attr({d:d}):(a.tracker=h.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?"visible":"hidden",stroke:Qb,fill:c?Qb:S,"stroke-width":b.lineWidth+(c?0:2*i),zIndex:2}).add(a.group),n([a.tracker,a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover",
+p).on("mouseout",function(a){g.onTrackerMouseOut(a)}).css(l);if(ib)a.on("touchstart",p)}))}};G=ha(Q);W.line=G;Y.area=x(X,{threshold:0});G=ha(Q,{type:"area",getSegments:function(){var a=[],b=[],c=[],d=this.xAxis,e=this.yAxis,f=e.stacks[this.stackKey],g={},h,i,j=this.points,k=this.options.connectNulls,l,m,p;if(this.options.stacking&&!this.cropped){for(m=0;m<j.length;m++)g[j[m].x]=j[m];for(p in f)c.push(+p);c.sort(function(a,b){return a-b});n(c,function(a){if(!k||g[a]&&g[a].y!==null)g[a]?b.push(g[a]):
+(h=d.translate(a),l=f[a].percent?f[a].total?f[a].cum*100/f[a].total:0:f[a].cum,i=e.toPixels(l,!0),b.push({y:null,plotX:h,clientX:h,plotY:i,yBottom:i,onMouseOver:pa}))});b.length&&a.push(b)}else Q.prototype.getSegments.call(this),a=this.segments;this.segments=a},getSegmentPath:function(a){var b=Q.prototype.getSegmentPath.call(this,a),c=[].concat(b),d,e=this.options;d=b.length;var f=this.yAxis.getThreshold(e.threshold),g;d===3&&c.push("L",b[1],b[2]);if(e.stacking&&!this.closedStacks)for(d=a.length-
+1;d>=0;d--)g=o(a[d].yBottom,f),d<a.length-1&&e.step&&c.push(a[d+1].plotX,g),c.push(a[d].plotX,g);else this.closeSegment(c,a,f);this.areaPath=this.areaPath.concat(c);return b},closeSegment:function(a,b,c){a.push("L",b[b.length-1].plotX,c,"L",b[0].plotX,c)},drawGraph:function(){this.areaPath=[];Q.prototype.drawGraph.apply(this);var a=this,b=this.areaPath,c=this.options,d=c.negativeColor,e=c.negativeFillColor,f=[["area",this.color,c.fillColor]];(d||e)&&f.push(["areaNeg",d,e]);n(f,function(d){var e=d[0],
+f=a[e];f?f.animate({d:b}):a[e]=a.chart.renderer.path(b).attr({fill:o(d[2],ra(d[1]).setOpacity(o(c.fillOpacity,0.75)).get()),zIndex:0}).add(a.group)})},drawLegendSymbol:function(a,b){b.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,a.options.symbolWidth,12,2).attr({zIndex:3}).add(b.legendGroup)}});W.area=G;Y.spline=x(X);F=ha(Q,{type:"spline",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,f=a[c-1],g=a[c+1],h,i,j,k;if(f&&g){a=f.plotY;j=g.plotX;var g=g.plotY,l;h=(1.5*d+f.plotX)/2.5;i=(1.5*
+e+a)/2.5;j=(1.5*d+j)/2.5;k=(1.5*e+g)/2.5;l=(k-i)*(j-d)/(j-h)+e-k;i+=l;k+=l;i>a&&i>e?(i=s(a,e),k=2*e-i):i<a&&i<e&&(i=I(a,e),k=2*e-i);k>g&&k>e?(k=s(g,e),i=2*e-k):k<g&&k<e&&(k=I(g,e),i=2*e-k);b.rightContX=j;b.rightContY=k}c?(b=["C",f.rightContX||f.plotX,f.rightContY||f.plotY,h||d,i||e,d,e],f.rightContX=f.rightContY=null):b=["M",d,e];return b}});W.spline=F;Y.areaspline=x(Y.area);ma=G.prototype;F=ha(F,{type:"areaspline",closedStacks:!0,getSegmentPath:ma.getSegmentPath,closeSegment:ma.closeSegment,drawGraph:ma.drawGraph,
+drawLegendSymbol:ma.drawLegendSymbol});W.areaspline=F;Y.column=x(X,{borderColor:"#FFFFFF",borderWidth:1,borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},stickyTracking:!1,threshold:0});F=ha(Q,{type:"column",pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color",
+r:"borderRadius"},cropShoulder:0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){Q.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},getColumnMetrics:function(){var a=this,b=a.options,c=a.xAxis,d=a.yAxis,e=c.reversed,f,g={},h,i=0;b.grouping===!1?i=1:n(a.chart.series,function(b){var c=b.options,e=b.yAxis;if(b.type===a.type&&b.visible&&d.len===e.len&&d.pos===e.pos)c.stacking?(f=b.stackKey,g[f]===
+w&&(g[f]=i++),h=g[f]):c.grouping!==!1&&(h=i++),b.columnIndex=h});var c=I(N(c.transA)*(c.ordinalSlope||b.pointRange||c.closestPointRange||1),c.len),j=c*b.groupPadding,k=(c-2*j)/i,l=b.pointWidth,b=u(l)?(k-l)/2:k*b.pointPadding,l=o(l,k-2*b);return a.columnMetrics={width:l,offset:b+(j+((e?i-(a.columnIndex||0):a.columnIndex)||0)*k-c/2)*(e?-1:1)}},translate:function(){var a=this.chart,b=this.options,c=b.borderWidth,d=this.yAxis,e=this.translatedThreshold=d.getThreshold(b.threshold),f=o(b.minPointLength,
+5),b=this.getColumnMetrics(),g=b.width,h=this.barW=xa(s(g,1+2*c)),i=this.pointXOffset=b.offset,j=-(c%2?0.5:0),k=c%2?0.5:1;a.renderer.isVML&&a.inverted&&(k+=1);Q.prototype.translate.apply(this);n(this.points,function(a){var b=o(a.yBottom,e),c=I(s(-999-b,a.plotY),d.len+999+b),n=a.plotX+i,u=h,r=I(c,b),w,c=s(c,b)-r;N(c)<f&&f&&(c=f,r=t(N(r-e)>f?b-f:e-(d.translate(a.y,0,1,0,1)<=e?f:0)));a.barX=n;a.pointWidth=g;b=N(n)<0.5;u=t(n+u)+j;n=t(n)+j;u-=n;w=N(r)<0.5;c=t(r+c)+k;r=t(r)+k;c-=r;b&&(n+=1,u-=1);w&&(r-=
+1,c+=1);a.shapeType="rect";a.shapeArgs={x:n,y:r,width:u,height:c}})},getSymbol:pa,drawLegendSymbol:G.prototype.drawLegendSymbol,drawGraph:pa,drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d;n(a.points,function(e){var f=e.plotY,g=e.graphic;if(f!==w&&!isNaN(f)&&e.y!==null)d=e.shapeArgs,g?(Wa(g),g.animate(x(d))):e.graphic=c[e.shapeType](d).attr(e.pointAttr[e.selected?"select":""]).add(a.group).shadow(b.shadow,null,b.stacking&&!b.borderRadius);else if(g)e.graphic=g.destroy()})},drawTracker:function(){var a=
+this,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(c){var d=c.target,e;if(b.hoverSeries!==a)a.onMouseOver();for(;d&&!e;)e=d.point,d=d.parentNode;if(e!==w&&e!==b.hoverPoint)e.onMouseOver(c)};n(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)n(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),ib))a[b].on("touchstart",
+f)}),a._hasTracking=!0},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=a.dlBox||a.shapeArgs,i=a.below||a.plotY>o(this.translatedThreshold,f.plotSizeY),j=o(c.inside,!!this.options.stacking);if(h&&(d=x(h),g&&(d={x:f.plotWidth-d.y-d.height,y:f.plotHeight-d.x-d.width,width:d.height,height:d.width}),!j))g?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=o(c.align,!g||j?"center":i?"right":"left");c.verticalAlign=o(c.verticalAlign,g||j?"middle":i?"top":"bottom");Q.prototype.alignDataLabel.call(this,
+a,b,c,d,e)},animate:function(a){var b=this.yAxis,c=this.options,d=this.chart.inverted,e={};if(Z)a?(e.scaleY=0.001,a=I(b.pos+b.len,s(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):(e.scaleY=1,e[d?"translateX":"translateY"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0});Q.prototype.remove.apply(a,arguments)}});W.column=F;Y.bar=
+x(Y.column);ma=ha(F,{type:"bar",inverted:!0});W.bar=ma;Y.scatter=x(X,{lineWidth:0,tooltip:{headerFormat:'<span style="font-size: 10px; color:{series.color}">{series.name}</span><br/>',pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>",followPointer:!0},stickyTracking:!1});ma=ha(Q,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup"],drawTracker:F.prototype.drawTracker,setTooltipPoints:pa});W.scatter=ma;Y.pie=x(X,{borderColor:"#FFFFFF",borderWidth:1,
+center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});X={type:"pie",isCartesian:!1,pointClass:ha(Pa,{init:function(){Pa.prototype.init.apply(this,arguments);var a=this,b;if(a.y<0)a.y=null;r(a,{visible:a.visible!==!1,name:o(a.name,"Slice")});b=function(b){a.slice(b.type===
+"select")};J(a,"select",b);J(a,"unselect",b);return a},setVisible:function(a){var b=this,c=b.series,d=c.chart,e;b.visible=b.options.visible=a=a===w?!b.visible:a;c.options.data[qa(b,c.data)]=b.options;e=a?"show":"hide";n(["graphic","dataLabel","connector","shadowGroup"],function(a){if(b[a])b[a][e]()});b.legendItem&&d.legend.colorizeItem(b,a);if(!c.isDirty&&c.options.ignoreHiddenPoint)c.isDirty=!0,d.redraw()},slice:function(a,b,c){var d=this.series;La(c,d.chart);o(b,!0);this.sliced=this.options.sliced=
+a=u(a)?a:!this.sliced;d.options.data[qa(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:pa,animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)n(c,function(a){var c=a.graphic,a=a.shapeArgs;c&&(c.attr({r:b.center[3]/
+2,start:d,end:d}),c.animate({r:a.r,start:a.start,end:a.end},b.options.animation))}),b.animate=null},setData:function(a,b){Q.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();o(b,!0)&&this.chart.redraw()},generatePoints:function(){var a,b=0,c,d,e,f=this.options.ignoreHiddenPoint;Q.prototype.generatePoints.call(this);c=this.points;d=c.length;for(a=0;a<d;a++)e=c[a],b+=f&&!e.visible?0:e.y;this.total=b;for(a=0;a<d;a++)e=c[a],e.percentage=b>0?e.y/b*100:0,e.total=b},getCenter:function(){var a=
+this.options,b=this.chart,c=2*(a.slicedOffset||0),d,e=b.plotWidth-2*c,f=b.plotHeight-2*c,b=a.center,a=[o(b[0],"50%"),o(b[1],"50%"),a.size||"100%",a.innerSize||0],g=I(e,f),h;return Na(a,function(a,b){h=/%$/.test(a);d=b<2||b===2&&h;return(h?[e,f,g,g][b]*C(a)/100:a)+(d?c:0)})},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=ya/180*(i-90),i=(this.endAngleRad=ya/180*((c.endAngle||i+360)-90))-j,k=this.points,
+l=c.dataLabels.distance,c=c.ignoreHiddenPoint,m,n=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=R.asin((b-a[1])/(a[2]/2+l));return a[0]+(c?-1:1)*V(h)*(a[2]/2+l)};for(m=0;m<n;m++){o=k[m];f=j+b*i;if(!c||o.visible)b+=o.percentage/100;g=j+b*i;o.shapeType="arc";o.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:t(f*1E3)/1E3,end:t(g*1E3)/1E3};h=(g+f)/2;h>0.75*i&&(h-=2*ya);o.slicedTranslation={translateX:t(V(h)*d),translateY:t(ca(h)*d)};f=V(h)*a[2]/2;g=ca(h)*a[2]/2;o.tooltipPos=
+[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-ya/2||h>ya/2?1:0;o.angle=h;e=I(e,l/2);o.labelPos=[a[0]+f+V(h)*l,a[1]+g+ca(h)*l,a[0]+f+V(h)*e,a[1]+g+ca(h)*e,a[0]+f,a[1]+g,l<0?"center":o.half?"right":"left",h]}},setTooltipPoints:pa,drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);n(a.points,function(h){d=h.graphic;g=h.shapeArgs;f=h.shadowGroup;if(e&&!f)f=h.shadowGroup=b.g("shadow").add(a.shadowGroup);c=h.sliced?
+h.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);d?d.animate(r(g,c)):h.graphic=d=b.arc(g).setRadialReference(a.center).attr(h.pointAttr[h.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(c).add(a.group).shadow(e,f);h.visible===!1&&h.setVisible(!1)})},sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawDataLabels:function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=o(e.connectorPadding,10),g=o(e.connectorWidth,1),
+h=d.plotWidth,d=d.plotHeight,i,j,k=o(e.softConnector,!0),l=e.distance,m=a.center,p=m[2]/2,q=m[1],u=l>0,r,w,v,x,C=[[],[]],y,z,E,H,B,D=[0,0,0,0],I=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){Q.prototype.drawDataLabels.apply(a);n(b,function(a){a.dataLabel&&C[a.half].push(a)});for(H=0;!x&&b[H];)x=b[H]&&b[H].dataLabel&&(b[H].dataLabel.getBBox().height||21),H++;for(H=2;H--;){var b=[],K=[],G=C[H],J=G.length,F;a.sortByAngle(G,H-0.5);if(l>0){for(B=q-p-l;B<=q+p+l;B+=x)b.push(B);
+w=b.length;if(J>w){c=[].concat(G);c.sort(I);for(B=J;B--;)c[B].rank=B;for(B=J;B--;)G[B].rank>=w&&G.splice(B,1);J=G.length}for(B=0;B<J;B++){c=G[B];v=c.labelPos;c=9999;var O,M;for(M=0;M<w;M++)O=N(b[M]-v[1]),O<c&&(c=O,F=M);if(F<B&&b[B]!==null)F=B;else for(w<J-B+F&&b[B]!==null&&(F=w-J+B);b[F]===null;)F++;K.push({i:F,y:b[F]});b[F]=null}K.sort(I)}for(B=0;B<J;B++){c=G[B];v=c.labelPos;r=c.dataLabel;E=c.visible===!1?"hidden":"visible";c=v[1];if(l>0){if(w=K.pop(),F=w.i,z=w.y,c>z&&b[F+1]!==null||c<z&&b[F-1]!==
+null)z=c}else z=c;y=e.justify?m[0]+(H?-1:1)*(p+l):a.getX(F===0||F===b.length-1?c:z,H);r._attr={visibility:E,align:v[6]};r._pos={x:y+e.x+({left:f,right:-f}[v[6]]||0),y:z+e.y-10};r.connX=y;r.connY=z;if(this.options.size===null)w=r.width,y-w<f?D[3]=s(t(w-y+f),D[3]):y+w>h-f&&(D[1]=s(t(y+w-h+f),D[1])),z-x/2<0?D[0]=s(t(-z+x/2),D[0]):z+x/2>d&&(D[2]=s(t(z+x/2-d),D[2]))}}if(va(D)===0||this.verifyDataLabelOverflow(D))this.placeDataLabels(),u&&g&&n(this.points,function(b){i=b.connector;v=b.labelPos;if((r=b.dataLabel)&&
+r._pos)E=r._attr.visibility,y=r.connX,z=r.connY,j=k?["M",y+(v[6]==="left"?5:-5),z,"C",y,z,2*v[2]-v[4],2*v[3]-v[5],v[2],v[3],"L",v[4],v[5]]:["M",y+(v[6]==="left"?5:-5),z,"L",v[2],v[3],"L",v[4],v[5]],i?(i.animate({d:j}),i.attr("visibility",E)):b.connector=i=a.chart.renderer.path(j).attr({"stroke-width":g,stroke:e.connectorColor||b.color||"#606060",visibility:E}).add(a.group);else if(i)b.connector=i.destroy()})}},verifyDataLabelOverflow:function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize||
+80,f;d[0]!==null?e=s(b[2]-s(a[1],a[3]),c):(e=s(b[2]-a[1]-a[3],c),b[0]+=(a[3]-a[1])/2);d[1]!==null?e=s(I(e,b[2]-s(a[0],a[2])),c):(e=s(I(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);e<b[2]?(b[2]=e,this.translate(b),n(this.points,function(a){if(a.dataLabel)a.dataLabel._pos=null}),this.drawDataLabels()):f=!0;return f},placeDataLabels:function(){n(this.points,function(a){var a=a.dataLabel,b;if(a)(b=a._pos)?(a.attr(a._attr),a[a.moved?"animate":"attr"](b),a.moved=!0):a&&a.attr({y:-999})})},alignDataLabel:pa,
+drawTracker:F.prototype.drawTracker,drawLegendSymbol:G.prototype.drawLegendSymbol,getSymbol:pa};X=ha(Q,X);W.pie=X;r(Highcharts,{Axis:db,Chart:yb,Color:ra,Legend:eb,Pointer:xb,Point:Pa,Tick:Ma,Tooltip:wb,Renderer:Va,Series:Q,SVGElement:wa,SVGRenderer:Ha,arrayMin:Ja,arrayMax:va,charts:Ga,dateFormat:Xa,format:Ca,pathAnim:Ab,getOptions:function(){return M},hasBidiBug:Ub,isTouchDevice:Ob,numberFormat:Aa,seriesTypes:W,setOptions:function(a){M=x(M,a);Lb();return M},addEvent:J,removeEvent:aa,createElement:U,
+discardElement:Ta,css:K,each:n,extend:r,map:Na,merge:x,pick:o,splat:ja,extendClass:ha,pInt:C,wrap:mb,svg:Z,canvas:$,vml:!Z&&!$,product:"Highcharts",version:"3.0.6"})})();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts.src.js
new file mode 100644
index 0000000..a29b0fa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/highcharts.src.js
@@ -0,0 +1,16974 @@
+// ==ClosureCompiler==
+// @compilation_level SIMPLE_OPTIMIZATIONS
+
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ *
+ * (c) 2009-2013 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console, each, grep */
+
+(function () {
+// encapsulated variables
+var UNDEFINED,
+	doc = document,
+	win = window,
+	math = Math,
+	mathRound = math.round,
+	mathFloor = math.floor,
+	mathCeil = math.ceil,
+	mathMax = math.max,
+	mathMin = math.min,
+	mathAbs = math.abs,
+	mathCos = math.cos,
+	mathSin = math.sin,
+	mathPI = math.PI,
+	deg2rad = mathPI * 2 / 360,
+
+
+	// some variables
+	userAgent = navigator.userAgent,
+	isOpera = win.opera,
+	isIE = /msie/i.test(userAgent) && !isOpera,
+	docMode8 = doc.documentMode === 8,
+	isWebKit = /AppleWebKit/.test(userAgent),
+	isFirefox = /Firefox/.test(userAgent),
+	isTouchDevice = /(Mobile|Android|Windows Phone)/.test(userAgent),
+	SVG_NS = 'http://www.w3.org/2000/svg',
+	hasSVG = !!doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect,
+	hasBidiBug = isFirefox && parseInt(userAgent.split('Firefox/')[1], 10) < 4, // issue #38
+	useCanVG = !hasSVG && !isIE && !!doc.createElement('canvas').getContext,
+	Renderer,
+	hasTouch = doc.documentElement.ontouchstart !== UNDEFINED,
+	symbolSizes = {},
+	idCounter = 0,
+	garbageBin,
+	defaultOptions,
+	dateFormat, // function
+	globalAnimation,
+	pathAnim,
+	timeUnits,
+	noop = function () {},
+	charts = [],
+	PRODUCT = 'Highcharts',
+	VERSION = '3.0.6',
+
+	// some constants for frequently used strings
+	DIV = 'div',
+	ABSOLUTE = 'absolute',
+	RELATIVE = 'relative',
+	HIDDEN = 'hidden',
+	PREFIX = 'highcharts-',
+	VISIBLE = 'visible',
+	PX = 'px',
+	NONE = 'none',
+	M = 'M',
+	L = 'L',
+	/*
+	 * Empirical lowest possible opacities for TRACKER_FILL
+	 * IE6: 0.002
+	 * IE7: 0.002
+	 * IE8: 0.002
+	 * IE9: 0.00000000001 (unlimited)
+	 * IE10: 0.0001 (exporting only)
+	 * FF: 0.00000000001 (unlimited)
+	 * Chrome: 0.000001
+	 * Safari: 0.000001
+	 * Opera: 0.00000000001 (unlimited)
+	 */
+	TRACKER_FILL = 'rgba(192,192,192,' + (hasSVG ? 0.0001 : 0.002) + ')', // invisible but clickable
+	//TRACKER_FILL = 'rgba(192,192,192,0.5)',
+	NORMAL_STATE = '',
+	HOVER_STATE = 'hover',
+	SELECT_STATE = 'select',
+	MILLISECOND = 'millisecond',
+	SECOND = 'second',
+	MINUTE = 'minute',
+	HOUR = 'hour',
+	DAY = 'day',
+	WEEK = 'week',
+	MONTH = 'month',
+	YEAR = 'year',
+
+	// constants for attributes
+	LINEAR_GRADIENT = 'linearGradient',
+	STOPS = 'stops',
+	STROKE_WIDTH = 'stroke-width',
+
+	// time methods, changed based on whether or not UTC is used
+	makeTime,
+	getMinutes,
+	getHours,
+	getDay,
+	getDate,
+	getMonth,
+	getFullYear,
+	setMinutes,
+	setHours,
+	setDate,
+	setMonth,
+	setFullYear,
+
+
+	// lookup over the types and the associated classes
+	seriesTypes = {};
+
+// The Highcharts namespace
+win.Highcharts = win.Highcharts ? error(16, true) : {};
+
+/**
+ * Extend an object with the members of another
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to add to the first one
+ */
+function extend(a, b) {
+	var n;
+	if (!a) {
+		a = {};
+	}
+	for (n in b) {
+		a[n] = b[n];
+	}
+	return a;
+}
+	
+/**
+ * Deep merge two or more objects and return a third object.
+ * Previously this function redirected to jQuery.extend(true), but this had two limitations.
+ * First, it deep merged arrays, which lead to workarounds in Highcharts. Second,
+ * it copied properties from extended prototypes. 
+ */
+function merge() {
+	var i,
+		len = arguments.length,
+		ret = {},
+		doCopy = function (copy, original) {
+			var value, key;
+
+			// An object is replacing a primitive
+			if (typeof copy !== 'object') {
+				copy = {};
+			}
+
+			for (key in original) {
+				if (original.hasOwnProperty(key)) {
+					value = original[key];
+
+					// Copy the contents of objects, but not arrays or DOM nodes
+					if (value && typeof value === 'object' && Object.prototype.toString.call(value) !== '[object Array]'
+							&& typeof value.nodeType !== 'number') {
+						copy[key] = doCopy(copy[key] || {}, value);
+				
+					// Primitives and arrays are copied over directly
+					} else {
+						copy[key] = original[key];
+					}
+				}
+			}
+			return copy;
+		};
+
+	// For each argument, extend the return
+	for (i = 0; i < len; i++) {
+		ret = doCopy(ret, arguments[i]);
+	}
+
+	return ret;
+}
+
+/**
+ * Take an array and turn into a hash with even number arguments as keys and odd numbers as
+ * values. Allows creating constants for commonly used style properties, attributes etc.
+ * Avoid it in performance critical situations like looping
+ */
+function hash() {
+	var i = 0,
+		args = arguments,
+		length = args.length,
+		obj = {};
+	for (; i < length; i++) {
+		obj[args[i++]] = args[i];
+	}
+	return obj;
+}
+
+/**
+ * Shortcut for parseInt
+ * @param {Object} s
+ * @param {Number} mag Magnitude
+ */
+function pInt(s, mag) {
+	return parseInt(s, mag || 10);
+}
+
+/**
+ * Check for string
+ * @param {Object} s
+ */
+function isString(s) {
+	return typeof s === 'string';
+}
+
+/**
+ * Check for object
+ * @param {Object} obj
+ */
+function isObject(obj) {
+	return typeof obj === 'object';
+}
+
+/**
+ * Check for array
+ * @param {Object} obj
+ */
+function isArray(obj) {
+	return Object.prototype.toString.call(obj) === '[object Array]';
+}
+
+/**
+ * Check for number
+ * @param {Object} n
+ */
+function isNumber(n) {
+	return typeof n === 'number';
+}
+
+function log2lin(num) {
+	return math.log(num) / math.LN10;
+}
+function lin2log(num) {
+	return math.pow(10, num);
+}
+
+/**
+ * Remove last occurence of an item from an array
+ * @param {Array} arr
+ * @param {Mixed} item
+ */
+function erase(arr, item) {
+	var i = arr.length;
+	while (i--) {
+		if (arr[i] === item) {
+			arr.splice(i, 1);
+			break;
+		}
+	}
+	//return arr;
+}
+
+/**
+ * Returns true if the object is not null or undefined. Like MooTools' $.defined.
+ * @param {Object} obj
+ */
+function defined(obj) {
+	return obj !== UNDEFINED && obj !== null;
+}
+
+/**
+ * Set or get an attribute or an object of attributes. Can't use jQuery attr because
+ * it attempts to set expando properties on the SVG element, which is not allowed.
+ *
+ * @param {Object} elem The DOM element to receive the attribute(s)
+ * @param {String|Object} prop The property or an abject of key-value pairs
+ * @param {String} value The value if a single property is set
+ */
+function attr(elem, prop, value) {
+	var key,
+		setAttribute = 'setAttribute',
+		ret;
+
+	// if the prop is a string
+	if (isString(prop)) {
+		// set the value
+		if (defined(value)) {
+
+			elem[setAttribute](prop, value);
+
+		// get the value
+		} else if (elem && elem.getAttribute) { // elem not defined when printing pie demo...
+			ret = elem.getAttribute(prop);
+		}
+
+	// else if prop is defined, it is a hash of key/value pairs
+	} else if (defined(prop) && isObject(prop)) {
+		for (key in prop) {
+			elem[setAttribute](key, prop[key]);
+		}
+	}
+	return ret;
+}
+/**
+ * Check if an element is an array, and if not, make it into an array. Like
+ * MooTools' $.splat.
+ */
+function splat(obj) {
+	return isArray(obj) ? obj : [obj];
+}
+
+
+/**
+ * Return the first value that is defined. Like MooTools' $.pick.
+ */
+function pick() {
+	var args = arguments,
+		i,
+		arg,
+		length = args.length;
+	for (i = 0; i < length; i++) {
+		arg = args[i];
+		if (typeof arg !== 'undefined' && arg !== null) {
+			return arg;
+		}
+	}
+}
+
+/**
+ * Set CSS on a given element
+ * @param {Object} el
+ * @param {Object} styles Style object with camel case property names
+ */
+function css(el, styles) {
+	if (isIE) {
+		if (styles && styles.opacity !== UNDEFINED) {
+			styles.filter = 'alpha(opacity=' + (styles.opacity * 100) + ')';
+		}
+	}
+	extend(el.style, styles);
+}
+
+/**
+ * Utility function to create element with attributes and styles
+ * @param {Object} tag
+ * @param {Object} attribs
+ * @param {Object} styles
+ * @param {Object} parent
+ * @param {Object} nopad
+ */
+function createElement(tag, attribs, styles, parent, nopad) {
+	var el = doc.createElement(tag);
+	if (attribs) {
+		extend(el, attribs);
+	}
+	if (nopad) {
+		css(el, {padding: 0, border: NONE, margin: 0});
+	}
+	if (styles) {
+		css(el, styles);
+	}
+	if (parent) {
+		parent.appendChild(el);
+	}
+	return el;
+}
+
+/**
+ * Extend a prototyped class by new members
+ * @param {Object} parent
+ * @param {Object} members
+ */
+function extendClass(parent, members) {
+	var object = function () {};
+	object.prototype = new parent();
+	extend(object.prototype, members);
+	return object;
+}
+
+/**
+ * Format a number and return a string based on input settings
+ * @param {Number} number The input number to format
+ * @param {Number} decimals The amount of decimals
+ * @param {String} decPoint The decimal point, defaults to the one given in the lang options
+ * @param {String} thousandsSep The thousands separator, defaults to the one given in the lang options
+ */
+function numberFormat(number, decimals, decPoint, thousandsSep) {
+	var lang = defaultOptions.lang,
+		// http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format/
+		n = +number || 0,
+		c = decimals === -1 ?
+			(n.toString().split('.')[1] || '').length : // preserve decimals
+			(isNaN(decimals = mathAbs(decimals)) ? 2 : decimals),
+		d = decPoint === undefined ? lang.decimalPoint : decPoint,
+		t = thousandsSep === undefined ? lang.thousandsSep : thousandsSep,
+		s = n < 0 ? "-" : "",
+		i = String(pInt(n = mathAbs(n).toFixed(c))),
+		j = i.length > 3 ? i.length % 3 : 0;
+
+	return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) +
+		(c ? d + mathAbs(n - i).toFixed(c).slice(2) : "");
+}
+
+/**
+ * Pad a string to a given length by adding 0 to the beginning
+ * @param {Number} number
+ * @param {Number} length
+ */
+function pad(number, length) {
+	// Create an array of the remaining length +1 and join it with 0's
+	return new Array((length || 2) + 1 - String(number).length).join(0) + number;
+}
+
+/**
+ * Wrap a method with extended functionality, preserving the original function
+ * @param {Object} obj The context object that the method belongs to 
+ * @param {String} method The name of the method to extend
+ * @param {Function} func A wrapper function callback. This function is called with the same arguments
+ * as the original function, except that the original function is unshifted and passed as the first 
+ * argument. 
+ */
+function wrap(obj, method, func) {
+	var proceed = obj[method];
+	obj[method] = function () {
+		var args = Array.prototype.slice.call(arguments);
+		args.unshift(proceed);
+		return func.apply(this, args);
+	};
+}
+
+/**
+ * Based on http://www.php.net/manual/en/function.strftime.php
+ * @param {String} format
+ * @param {Number} timestamp
+ * @param {Boolean} capitalize
+ */
+dateFormat = function (format, timestamp, capitalize) {
+	if (!defined(timestamp) || isNaN(timestamp)) {
+		return 'Invalid date';
+	}
+	format = pick(format, '%Y-%m-%d %H:%M:%S');
+
+	var date = new Date(timestamp),
+		key, // used in for constuct below
+		// get the basic time values
+		hours = date[getHours](),
+		day = date[getDay](),
+		dayOfMonth = date[getDate](),
+		month = date[getMonth](),
+		fullYear = date[getFullYear](),
+		lang = defaultOptions.lang,
+		langWeekdays = lang.weekdays,
+
+		// List all format keys. Custom formats can be added from the outside. 
+		replacements = extend({
+
+			// Day
+			'a': langWeekdays[day].substr(0, 3), // Short weekday, like 'Mon'
+			'A': langWeekdays[day], // Long weekday, like 'Monday'
+			'd': pad(dayOfMonth), // Two digit day of the month, 01 to 31
+			'e': dayOfMonth, // Day of the month, 1 through 31
+
+			// Week (none implemented)
+			//'W': weekNumber(),
+
+			// Month
+			'b': lang.shortMonths[month], // Short month, like 'Jan'
+			'B': lang.months[month], // Long month, like 'January'
+			'm': pad(month + 1), // Two digit month number, 01 through 12
+
+			// Year
+			'y': fullYear.toString().substr(2, 2), // Two digits year, like 09 for 2009
+			'Y': fullYear, // Four digits year, like 2009
+
+			// Time
+			'H': pad(hours), // Two digits hours in 24h format, 00 through 23
+			'I': pad((hours % 12) || 12), // Two digits hours in 12h format, 00 through 11
+			'l': (hours % 12) || 12, // Hours in 12h format, 1 through 12
+			'M': pad(date[getMinutes]()), // Two digits minutes, 00 through 59
+			'p': hours < 12 ? 'AM' : 'PM', // Upper case AM or PM
+			'P': hours < 12 ? 'am' : 'pm', // Lower case AM or PM
+			'S': pad(date.getSeconds()), // Two digits seconds, 00 through  59
+			'L': pad(mathRound(timestamp % 1000), 3) // Milliseconds (naming from Ruby)
+		}, Highcharts.dateFormats);
+
+
+	// do the replaces
+	for (key in replacements) {
+		while (format.indexOf('%' + key) !== -1) { // regex would do it in one line, but this is faster
+			format = format.replace('%' + key, typeof replacements[key] === 'function' ? replacements[key](timestamp) : replacements[key]);
+		}
+	}
+
+	// Optionally capitalize the string and return
+	return capitalize ? format.substr(0, 1).toUpperCase() + format.substr(1) : format;
+};
+
+/** 
+ * Format a single variable. Similar to sprintf, without the % prefix.
+ */
+function formatSingle(format, val) {
+	var floatRegex = /f$/,
+		decRegex = /\.([0-9])/,
+		lang = defaultOptions.lang,
+		decimals;
+
+	if (floatRegex.test(format)) { // float
+		decimals = format.match(decRegex);
+		decimals = decimals ? decimals[1] : -1;
+		val = numberFormat(
+			val,
+			decimals,
+			lang.decimalPoint,
+			format.indexOf(',') > -1 ? lang.thousandsSep : ''
+		);
+	} else {
+		val = dateFormat(format, val);
+	}
+	return val;
+}
+
+/**
+ * Format a string according to a subset of the rules of Python's String.format method.
+ */
+function format(str, ctx) {
+	var splitter = '{',
+		isInside = false,
+		segment,
+		valueAndFormat,
+		path,
+		i,
+		len,
+		ret = [],
+		val,
+		index;
+	
+	while ((index = str.indexOf(splitter)) !== -1) {
+		
+		segment = str.slice(0, index);
+		if (isInside) { // we're on the closing bracket looking back
+			
+			valueAndFormat = segment.split(':');
+			path = valueAndFormat.shift().split('.'); // get first and leave format
+			len = path.length;
+			val = ctx;
+
+			// Assign deeper paths
+			for (i = 0; i < len; i++) {
+				val = val[path[i]];
+			}
+
+			// Format the replacement
+			if (valueAndFormat.length) {
+				val = formatSingle(valueAndFormat.join(':'), val);
+			}
+
+			// Push the result and advance the cursor
+			ret.push(val);
+			
+		} else {
+			ret.push(segment);
+			
+		}
+		str = str.slice(index + 1); // the rest
+		isInside = !isInside; // toggle
+		splitter = isInside ? '}' : '{'; // now look for next matching bracket
+	}
+	ret.push(str);
+	return ret.join('');
+}
+
+/**
+ * Get the magnitude of a number
+ */
+function getMagnitude(num) {
+	return math.pow(10, mathFloor(math.log(num) / math.LN10));
+}
+
+/**
+ * Take an interval and normalize it to multiples of 1, 2, 2.5 and 5
+ * @param {Number} interval
+ * @param {Array} multiples
+ * @param {Number} magnitude
+ * @param {Object} options
+ */
+function normalizeTickInterval(interval, multiples, magnitude, options) {
+	var normalized, i;
+
+	// round to a tenfold of 1, 2, 2.5 or 5
+	magnitude = pick(magnitude, 1);
+	normalized = interval / magnitude;
+
+	// multiples for a linear scale
+	if (!multiples) {
+		multiples = [1, 2, 2.5, 5, 10];
+
+		// the allowDecimals option
+		if (options && options.allowDecimals === false) {
+			if (magnitude === 1) {
+				multiples = [1, 2, 5, 10];
+			} else if (magnitude <= 0.1) {
+				multiples = [1 / magnitude];
+			}
+		}
+	}
+
+	// normalize the interval to the nearest multiple
+	for (i = 0; i < multiples.length; i++) {
+		interval = multiples[i];
+		if (normalized <= (multiples[i] + (multiples[i + 1] || multiples[i])) / 2) {
+			break;
+		}
+	}
+
+	// multiply back to the correct magnitude
+	interval *= magnitude;
+
+	return interval;
+}
+
+/**
+ * Get a normalized tick interval for dates. Returns a configuration object with
+ * unit range (interval), count and name. Used to prepare data for getTimeTicks. 
+ * Previously this logic was part of getTimeTicks, but as getTimeTicks now runs
+ * of segments in stock charts, the normalizing logic was extracted in order to 
+ * prevent it for running over again for each segment having the same interval. 
+ * #662, #697.
+ */
+function normalizeTimeTickInterval(tickInterval, unitsOption) {
+	var units = unitsOption || [[
+				MILLISECOND, // unit name
+				[1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples
+			], [
+				SECOND,
+				[1, 2, 5, 10, 15, 30]
+			], [
+				MINUTE,
+				[1, 2, 5, 10, 15, 30]
+			], [
+				HOUR,
+				[1, 2, 3, 4, 6, 8, 12]
+			], [
+				DAY,
+				[1, 2]
+			], [
+				WEEK,
+				[1, 2]
+			], [
+				MONTH,
+				[1, 2, 3, 4, 6]
+			], [
+				YEAR,
+				null
+			]],
+		unit = units[units.length - 1], // default unit is years
+		interval = timeUnits[unit[0]],
+		multiples = unit[1],
+		count,
+		i;
+		
+	// loop through the units to find the one that best fits the tickInterval
+	for (i = 0; i < units.length; i++) {
+		unit = units[i];
+		interval = timeUnits[unit[0]];
+		multiples = unit[1];
+
+
+		if (units[i + 1]) {
+			// lessThan is in the middle between the highest multiple and the next unit.
+			var lessThan = (interval * multiples[multiples.length - 1] +
+						timeUnits[units[i + 1][0]]) / 2;
+
+			// break and keep the current unit
+			if (tickInterval <= lessThan) {
+				break;
+			}
+		}
+	}
+
+	// prevent 2.5 years intervals, though 25, 250 etc. are allowed
+	if (interval === timeUnits[YEAR] && tickInterval < 5 * interval) {
+		multiples = [1, 2, 5];
+	}
+
+	// get the count
+	count = normalizeTickInterval(
+		tickInterval / interval, 
+		multiples,
+		unit[0] === YEAR ? getMagnitude(tickInterval / interval) : 1 // #1913
+	);
+	
+	return {
+		unitRange: interval,
+		count: count,
+		unitName: unit[0]
+	};
+}
+
+/**
+ * Set the tick positions to a time unit that makes sense, for example
+ * on the first of each month or on every Monday. Return an array
+ * with the time positions. Used in datetime axes as well as for grouping
+ * data on a datetime axis.
+ *
+ * @param {Object} normalizedInterval The interval in axis values (ms) and the count
+ * @param {Number} min The minimum in axis values
+ * @param {Number} max The maximum in axis values
+ * @param {Number} startOfWeek
+ */
+function getTimeTicks(normalizedInterval, min, max, startOfWeek) {
+	var tickPositions = [],
+		i,
+		higherRanks = {},
+		useUTC = defaultOptions.global.useUTC,
+		minYear, // used in months and years as a basis for Date.UTC()
+		minDate = new Date(min),
+		interval = normalizedInterval.unitRange,
+		count = normalizedInterval.count;
+
+	if (defined(min)) { // #1300
+		if (interval >= timeUnits[SECOND]) { // second
+			minDate.setMilliseconds(0);
+			minDate.setSeconds(interval >= timeUnits[MINUTE] ? 0 :
+				count * mathFloor(minDate.getSeconds() / count));
+		}
+	
+		if (interval >= timeUnits[MINUTE]) { // minute
+			minDate[setMinutes](interval >= timeUnits[HOUR] ? 0 :
+				count * mathFloor(minDate[getMinutes]() / count));
+		}
+	
+		if (interval >= timeUnits[HOUR]) { // hour
+			minDate[setHours](interval >= timeUnits[DAY] ? 0 :
+				count * mathFloor(minDate[getHours]() / count));
+		}
+	
+		if (interval >= timeUnits[DAY]) { // day
+			minDate[setDate](interval >= timeUnits[MONTH] ? 1 :
+				count * mathFloor(minDate[getDate]() / count));
+		}
+	
+		if (interval >= timeUnits[MONTH]) { // month
+			minDate[setMonth](interval >= timeUnits[YEAR] ? 0 :
+				count * mathFloor(minDate[getMonth]() / count));
+			minYear = minDate[getFullYear]();
+		}
+	
+		if (interval >= timeUnits[YEAR]) { // year
+			minYear -= minYear % count;
+			minDate[setFullYear](minYear);
+		}
+	
+		// week is a special case that runs outside the hierarchy
+		if (interval === timeUnits[WEEK]) {
+			// get start of current week, independent of count
+			minDate[setDate](minDate[getDate]() - minDate[getDay]() +
+				pick(startOfWeek, 1));
+		}
+	
+	
+		// get tick positions
+		i = 1;
+		minYear = minDate[getFullYear]();
+		var time = minDate.getTime(),
+			minMonth = minDate[getMonth](),
+			minDateDate = minDate[getDate](),
+			timezoneOffset = useUTC ? 
+				0 : 
+				(24 * 3600 * 1000 + minDate.getTimezoneOffset() * 60 * 1000) % (24 * 3600 * 1000); // #950
+	
+		// iterate and add tick positions at appropriate values
+		while (time < max) {
+			tickPositions.push(time);
+	
+			// if the interval is years, use Date.UTC to increase years
+			if (interval === timeUnits[YEAR]) {
+				time = makeTime(minYear + i * count, 0);
+	
+			// if the interval is months, use Date.UTC to increase months
+			} else if (interval === timeUnits[MONTH]) {
+				time = makeTime(minYear, minMonth + i * count);
+	
+			// if we're using global time, the interval is not fixed as it jumps
+			// one hour at the DST crossover
+			} else if (!useUTC && (interval === timeUnits[DAY] || interval === timeUnits[WEEK])) {
+				time = makeTime(minYear, minMonth, minDateDate +
+					i * count * (interval === timeUnits[DAY] ? 1 : 7));
+	
+			// else, the interval is fixed and we use simple addition
+			} else {
+				time += interval * count;
+			}
+	
+			i++;
+		}
+	
+		// push the last time
+		tickPositions.push(time);
+
+
+		// mark new days if the time is dividible by day (#1649, #1760)
+		each(grep(tickPositions, function (time) {
+			return interval <= timeUnits[HOUR] && time % timeUnits[DAY] === timezoneOffset;
+		}), function (time) {
+			higherRanks[time] = DAY;
+		});
+	}
+
+
+	// record information on the chosen unit - for dynamic label formatter
+	tickPositions.info = extend(normalizedInterval, {
+		higherRanks: higherRanks,
+		totalRange: interval * count
+	});
+
+	return tickPositions;
+}
+
+/**
+ * Helper class that contains variuos counters that are local to the chart.
+ */
+function ChartCounters() {
+	this.color = 0;
+	this.symbol = 0;
+}
+
+ChartCounters.prototype =  {
+	/**
+	 * Wraps the color counter if it reaches the specified length.
+	 */
+	wrapColor: function (length) {
+		if (this.color >= length) {
+			this.color = 0;
+		}
+	},
+
+	/**
+	 * Wraps the symbol counter if it reaches the specified length.
+	 */
+	wrapSymbol: function (length) {
+		if (this.symbol >= length) {
+			this.symbol = 0;
+		}
+	}
+};
+
+
+/**
+ * Utility method that sorts an object array and keeping the order of equal items.
+ * ECMA script standard does not specify the behaviour when items are equal.
+ */
+function stableSort(arr, sortFunction) {
+	var length = arr.length,
+		sortValue,
+		i;
+
+	// Add index to each item
+	for (i = 0; i < length; i++) {
+		arr[i].ss_i = i; // stable sort index
+	}
+
+	arr.sort(function (a, b) {
+		sortValue = sortFunction(a, b);
+		return sortValue === 0 ? a.ss_i - b.ss_i : sortValue;
+	});
+
+	// Remove index from items
+	for (i = 0; i < length; i++) {
+		delete arr[i].ss_i; // stable sort index
+	}
+}
+
+/**
+ * Non-recursive method to find the lowest member of an array. Math.min raises a maximum
+ * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This
+ * method is slightly slower, but safe.
+ */
+function arrayMin(data) {
+	var i = data.length,
+		min = data[0];
+
+	while (i--) {
+		if (data[i] < min) {
+			min = data[i];
+		}
+	}
+	return min;
+}
+
+/**
+ * Non-recursive method to find the lowest member of an array. Math.min raises a maximum
+ * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This
+ * method is slightly slower, but safe.
+ */
+function arrayMax(data) {
+	var i = data.length,
+		max = data[0];
+
+	while (i--) {
+		if (data[i] > max) {
+			max = data[i];
+		}
+	}
+	return max;
+}
+
+/**
+ * Utility method that destroys any SVGElement or VMLElement that are properties on the given object.
+ * It loops all properties and invokes destroy if there is a destroy method. The property is
+ * then delete'ed.
+ * @param {Object} The object to destroy properties on
+ * @param {Object} Exception, do not destroy this property, only delete it.
+ */
+function destroyObjectProperties(obj, except) {
+	var n;
+	for (n in obj) {
+		// If the object is non-null and destroy is defined
+		if (obj[n] && obj[n] !== except && obj[n].destroy) {
+			// Invoke the destroy
+			obj[n].destroy();
+		}
+
+		// Delete the property from the object.
+		delete obj[n];
+	}
+}
+
+
+/**
+ * Discard an element by moving it to the bin and delete
+ * @param {Object} The HTML node to discard
+ */
+function discardElement(element) {
+	// create a garbage bin element, not part of the DOM
+	if (!garbageBin) {
+		garbageBin = createElement(DIV);
+	}
+
+	// move the node and empty bin
+	if (element) {
+		garbageBin.appendChild(element);
+	}
+	garbageBin.innerHTML = '';
+}
+
+/**
+ * Provide error messages for debugging, with links to online explanation 
+ */
+function error(code, stop) {
+	var msg = 'Highcharts error #' + code + ': www.highcharts.com/errors/' + code;
+	if (stop) {
+		throw msg;
+	} else if (win.console) {
+		console.log(msg);
+	}
+}
+
+/**
+ * Fix JS round off float errors
+ * @param {Number} num
+ */
+function correctFloat(num) {
+	return parseFloat(
+		num.toPrecision(14)
+	);
+}
+
+/**
+ * Set the global animation to either a given value, or fall back to the
+ * given chart's animation option
+ * @param {Object} animation
+ * @param {Object} chart
+ */
+function setAnimation(animation, chart) {
+	globalAnimation = pick(animation, chart.animation);
+}
+
+/**
+ * The time unit lookup
+ */
+/*jslint white: true*/
+timeUnits = hash(
+	MILLISECOND, 1,
+	SECOND, 1000,
+	MINUTE, 60000,
+	HOUR, 3600000,
+	DAY, 24 * 3600000,
+	WEEK, 7 * 24 * 3600000,
+	MONTH, 31 * 24 * 3600000,
+	YEAR, 31556952000
+);
+/*jslint white: false*/
+/**
+ * Path interpolation algorithm used across adapters
+ */
+pathAnim = {
+	/**
+	 * Prepare start and end values so that the path can be animated one to one
+	 */
+	init: function (elem, fromD, toD) {
+		fromD = fromD || '';
+		var shift = elem.shift,
+			bezier = fromD.indexOf('C') > -1,
+			numParams = bezier ? 7 : 3,
+			endLength,
+			slice,
+			i,
+			start = fromD.split(' '),
+			end = [].concat(toD), // copy
+			startBaseLine,
+			endBaseLine,
+			sixify = function (arr) { // in splines make move points have six parameters like bezier curves
+				i = arr.length;
+				while (i--) {
+					if (arr[i] === M) {
+						arr.splice(i + 1, 0, arr[i + 1], arr[i + 2], arr[i + 1], arr[i + 2]);
+					}
+				}
+			};
+
+		if (bezier) {
+			sixify(start);
+			sixify(end);
+		}
+
+		// pull out the base lines before padding
+		if (elem.isArea) {
+			startBaseLine = start.splice(start.length - 6, 6);
+			endBaseLine = end.splice(end.length - 6, 6);
+		}
+
+		// if shifting points, prepend a dummy point to the end path
+		if (shift <= end.length / numParams && start.length === end.length) {
+			while (shift--) {
+				end = [].concat(end).splice(0, numParams).concat(end);
+			}
+		}
+		elem.shift = 0; // reset for following animations
+
+		// copy and append last point until the length matches the end length
+		if (start.length) {
+			endLength = end.length;
+			while (start.length < endLength) {
+
+				//bezier && sixify(start);
+				slice = [].concat(start).splice(start.length - numParams, numParams);
+				if (bezier) { // disable first control point
+					slice[numParams - 6] = slice[numParams - 2];
+					slice[numParams - 5] = slice[numParams - 1];
+				}
+				start = start.concat(slice);
+			}
+		}
+
+		if (startBaseLine) { // append the base lines for areas
+			start = start.concat(startBaseLine);
+			end = end.concat(endBaseLine);
+		}
+		return [start, end];
+	},
+
+	/**
+	 * Interpolate each value of the path and return the array
+	 */
+	step: function (start, end, pos, complete) {
+		var ret = [],
+			i = start.length,
+			startVal;
+
+		if (pos === 1) { // land on the final path without adjustment points appended in the ends
+			ret = complete;
+
+		} else if (i === end.length && pos < 1) {
+			while (i--) {
+				startVal = parseFloat(start[i]);
+				ret[i] =
+					isNaN(startVal) ? // a letter instruction like M or L
+						start[i] :
+						pos * (parseFloat(end[i] - startVal)) + startVal;
+
+			}
+		} else { // if animation is finished or length not matching, land on right value
+			ret = end;
+		}
+		return ret;
+	}
+};
+
+(function ($) {
+	/**
+	 * The default HighchartsAdapter for jQuery
+	 */
+	win.HighchartsAdapter = win.HighchartsAdapter || ($ && {
+		
+		/**
+		 * Initialize the adapter by applying some extensions to jQuery
+		 */
+		init: function (pathAnim) {
+			
+			// extend the animate function to allow SVG animations
+			var Fx = $.fx,
+				Step = Fx.step,
+				dSetter,
+				Tween = $.Tween,
+				propHooks = Tween && Tween.propHooks,
+				opacityHook = $.cssHooks.opacity;
+			
+			/*jslint unparam: true*//* allow unused param x in this function */
+			$.extend($.easing, {
+				easeOutQuad: function (x, t, b, c, d) {
+					return -c * (t /= d) * (t - 2) + b;
+				}
+			});
+			/*jslint unparam: false*/
+		
+			// extend some methods to check for elem.attr, which means it is a Highcharts SVG object
+			$.each(['cur', '_default', 'width', 'height', 'opacity'], function (i, fn) {
+				var obj = Step,
+					base,
+					elem;
+					
+				// Handle different parent objects
+				if (fn === 'cur') {
+					obj = Fx.prototype; // 'cur', the getter, relates to Fx.prototype
+				
+				} else if (fn === '_default' && Tween) { // jQuery 1.8 model
+					obj = propHooks[fn];
+					fn = 'set';
+				}
+		
+				// Overwrite the method
+				base = obj[fn];
+				if (base) { // step.width and step.height don't exist in jQuery < 1.7
+		
+					// create the extended function replacement
+					obj[fn] = function (fx) {
+		
+						// Fx.prototype.cur does not use fx argument
+						fx = i ? fx : this;
+
+						// Don't run animations on textual properties like align (#1821)
+						if (fx.prop === 'align') {
+							return;
+						}
+		
+						// shortcut
+						elem = fx.elem;
+		
+						// Fx.prototype.cur returns the current value. The other ones are setters
+						// and returning a value has no effect.
+						return elem.attr ? // is SVG element wrapper
+							elem.attr(fx.prop, fn === 'cur' ? UNDEFINED : fx.now) : // apply the SVG wrapper's method
+							base.apply(this, arguments); // use jQuery's built-in method
+					};
+				}
+			});
+
+			// Extend the opacity getter, needed for fading opacity with IE9 and jQuery 1.10+
+			wrap(opacityHook, 'get', function (proceed, elem, computed) {
+				return elem.attr ? (elem.opacity || 0) : proceed.call(this, elem, computed);
+			});
+			
+			
+			// Define the setter function for d (path definitions)
+			dSetter = function (fx) {
+				var elem = fx.elem,
+					ends;
+		
+				// Normally start and end should be set in state == 0, but sometimes,
+				// for reasons unknown, this doesn't happen. Perhaps state == 0 is skipped
+				// in these cases
+				if (!fx.started) {
+					ends = pathAnim.init(elem, elem.d, elem.toD);
+					fx.start = ends[0];
+					fx.end = ends[1];
+					fx.started = true;
+				}
+		
+		
+				// interpolate each value of the path
+				elem.attr('d', pathAnim.step(fx.start, fx.end, fx.pos, elem.toD));
+			};
+			
+			// jQuery 1.8 style
+			if (Tween) {
+				propHooks.d = {
+					set: dSetter
+				};
+			// pre 1.8
+			} else {
+				// animate paths
+				Step.d = dSetter;
+			}
+			
+			/**
+			 * Utility for iterating over an array. Parameters are reversed compared to jQuery.
+			 * @param {Array} arr
+			 * @param {Function} fn
+			 */
+			this.each = Array.prototype.forEach ?
+				function (arr, fn) { // modern browsers
+					return Array.prototype.forEach.call(arr, fn);
+					
+				} : 
+				function (arr, fn) { // legacy
+					var i = 0, 
+						len = arr.length;
+					for (; i < len; i++) {
+						if (fn.call(arr[i], arr[i], i, arr) === false) {
+							return i;
+						}
+					}
+				};
+			
+			/**
+			 * Register Highcharts as a plugin in the respective framework
+			 */
+			$.fn.highcharts = function () {
+				var constr = 'Chart', // default constructor
+					args = arguments,
+					options,
+					ret,
+					chart;
+
+				if (isString(args[0])) {
+					constr = args[0];
+					args = Array.prototype.slice.call(args, 1); 
+				}
+				options = args[0];
+
+				// Create the chart
+				if (options !== UNDEFINED) {
+					/*jslint unused:false*/
+					options.chart = options.chart || {};
+					options.chart.renderTo = this[0];
+					chart = new Highcharts[constr](options, args[1]);
+					ret = this;
+					/*jslint unused:true*/
+				}
+
+				// When called without parameters or with the return argument, get a predefined chart
+				if (options === UNDEFINED) {
+					ret = charts[attr(this[0], 'data-highcharts-chart')];
+				}	
+
+				return ret;
+			};
+
+		},
+
+		
+		/**
+		 * Downloads a script and executes a callback when done.
+		 * @param {String} scriptLocation
+		 * @param {Function} callback
+		 */
+		getScript: $.getScript,
+		
+		/**
+		 * Return the index of an item in an array, or -1 if not found
+		 */
+		inArray: $.inArray,
+		
+		/**
+		 * A direct link to jQuery methods. MooTools and Prototype adapters must be implemented for each case of method.
+		 * @param {Object} elem The HTML element
+		 * @param {String} method Which method to run on the wrapped element
+		 */
+		adapterRun: function (elem, method) {
+			return $(elem)[method]();
+		},
+	
+		/**
+		 * Filter an array
+		 */
+		grep: $.grep,
+	
+		/**
+		 * Map an array
+		 * @param {Array} arr
+		 * @param {Function} fn
+		 */
+		map: function (arr, fn) {
+			//return jQuery.map(arr, fn);
+			var results = [],
+				i = 0,
+				len = arr.length;
+			for (; i < len; i++) {
+				results[i] = fn.call(arr[i], arr[i], i, arr);
+			}
+			return results;
+	
+		},
+	
+		/**
+		 * Get the position of an element relative to the top left of the page
+		 */
+		offset: function (el) {
+			return $(el).offset();
+		},
+	
+		/**
+		 * Add an event listener
+		 * @param {Object} el A HTML element or custom object
+		 * @param {String} event The event type
+		 * @param {Function} fn The event handler
+		 */
+		addEvent: function (el, event, fn) {
+			$(el).bind(event, fn);
+		},
+	
+		/**
+		 * Remove event added with addEvent
+		 * @param {Object} el The object
+		 * @param {String} eventType The event type. Leave blank to remove all events.
+		 * @param {Function} handler The function to remove
+		 */
+		removeEvent: function (el, eventType, handler) {
+			// workaround for jQuery issue with unbinding custom events:
+			// http://forum.jQuery.com/topic/javascript-error-when-unbinding-a-custom-event-using-jQuery-1-4-2
+			var func = doc.removeEventListener ? 'removeEventListener' : 'detachEvent';
+			if (doc[func] && el && !el[func]) {
+				el[func] = function () {};
+			}
+	
+			$(el).unbind(eventType, handler);
+		},
+	
+		/**
+		 * Fire an event on a custom object
+		 * @param {Object} el
+		 * @param {String} type
+		 * @param {Object} eventArguments
+		 * @param {Function} defaultFunction
+		 */
+		fireEvent: function (el, type, eventArguments, defaultFunction) {
+			var event = $.Event(type),
+				detachedType = 'detached' + type,
+				defaultPrevented;
+	
+			// Remove warnings in Chrome when accessing layerX and layerY. Although Highcharts
+			// never uses these properties, Chrome includes them in the default click event and
+			// raises the warning when they are copied over in the extend statement below.
+			//
+			// To avoid problems in IE (see #1010) where we cannot delete the properties and avoid
+			// testing if they are there (warning in chrome) the only option is to test if running IE.
+			if (!isIE && eventArguments) {
+				delete eventArguments.layerX;
+				delete eventArguments.layerY;
+			}
+	
+			extend(event, eventArguments);
+	
+			// Prevent jQuery from triggering the object method that is named the
+			// same as the event. For example, if the event is 'select', jQuery
+			// attempts calling el.select and it goes into a loop.
+			if (el[type]) {
+				el[detachedType] = el[type];
+				el[type] = null;
+			}
+	
+			// Wrap preventDefault and stopPropagation in try/catch blocks in
+			// order to prevent JS errors when cancelling events on non-DOM
+			// objects. #615.
+			/*jslint unparam: true*/
+			$.each(['preventDefault', 'stopPropagation'], function (i, fn) {
+				var base = event[fn];
+				event[fn] = function () {
+					try {
+						base.call(event);
+					} catch (e) {
+						if (fn === 'preventDefault') {
+							defaultPrevented = true;
+						}
+					}
+				};
+			});
+			/*jslint unparam: false*/
+	
+			// trigger it
+			$(el).trigger(event);
+	
+			// attach the method
+			if (el[detachedType]) {
+				el[type] = el[detachedType];
+				el[detachedType] = null;
+			}
+	
+			if (defaultFunction && !event.isDefaultPrevented() && !defaultPrevented) {
+				defaultFunction(event);
+			}
+		},
+		
+		/**
+		 * Extension method needed for MooTools
+		 */
+		washMouseEvent: function (e) {
+			var ret = e.originalEvent || e;
+			
+			// computed by jQuery, needed by IE8
+			if (ret.pageX === UNDEFINED) { // #1236
+				ret.pageX = e.pageX;
+				ret.pageY = e.pageY;
+			}
+			
+			return ret;
+		},
+	
+		/**
+		 * Animate a HTML element or SVG element wrapper
+		 * @param {Object} el
+		 * @param {Object} params
+		 * @param {Object} options jQuery-like animation options: duration, easing, callback
+		 */
+		animate: function (el, params, options) {
+			var $el = $(el);
+			if (!el.style) {
+				el.style = {}; // #1881
+			}
+			if (params.d) {
+				el.toD = params.d; // keep the array form for paths, used in $.fx.step.d
+				params.d = 1; // because in jQuery, animating to an array has a different meaning
+			}
+	
+			$el.stop();
+			if (params.opacity !== UNDEFINED && el.attr) {
+				params.opacity += 'px'; // force jQuery to use same logic as width and height (#2161)
+			}
+			$el.animate(params, options);
+	
+		},
+		/**
+		 * Stop running animation
+		 */
+		stop: function (el) {
+			$(el).stop();
+		}
+	});
+}(win.jQuery));
+
+
+// check for a custom HighchartsAdapter defined prior to this file
+var globalAdapter = win.HighchartsAdapter,
+	adapter = globalAdapter || {};
+	
+// Initialize the adapter
+if (globalAdapter) {
+	globalAdapter.init.call(globalAdapter, pathAnim);
+}
+
+
+// Utility functions. If the HighchartsAdapter is not defined, adapter is an empty object
+// and all the utility functions will be null. In that case they are populated by the
+// default adapters below.
+var adapterRun = adapter.adapterRun,
+	getScript = adapter.getScript,
+	inArray = adapter.inArray,
+	each = adapter.each,
+	grep = adapter.grep,
+	offset = adapter.offset,
+	map = adapter.map,
+	addEvent = adapter.addEvent,
+	removeEvent = adapter.removeEvent,
+	fireEvent = adapter.fireEvent,
+	washMouseEvent = adapter.washMouseEvent,
+	animate = adapter.animate,
+	stop = adapter.stop;
+
+
+
+/* ****************************************************************************
+ * Handle the options                                                         *
+ *****************************************************************************/
+var
+
+defaultLabelOptions = {
+	enabled: true,
+	// rotation: 0,
+	// align: 'center',
+	x: 0,
+	y: 15,
+	/*formatter: function () {
+		return this.value;
+	},*/
+	style: {
+		color: '#666',
+		cursor: 'default',
+		fontSize: '11px',
+		lineHeight: '14px'
+	}
+};
+
+defaultOptions = {
+	colors: ['#2f7ed8', '#0d233a', '#8bbc21', '#910000', '#1aadce', '#492970',
+		'#f28f43', '#77a1e5', '#c42525', '#a6c96a'],
+	symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],
+	lang: {
+		loading: 'Loading...',
+		months: ['January', 'February', 'March', 'April', 'May', 'June', 'July',
+				'August', 'September', 'October', 'November', 'December'],
+		shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		decimalPoint: '.',
+		numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels
+		resetZoom: 'Reset zoom',
+		resetZoomTitle: 'Reset zoom level 1:1',
+		thousandsSep: ','
+	},
+	global: {
+		useUTC: true,
+		canvasToolsURL: 'http://code.highcharts.com/3.0.6/modules/canvas-tools.js',
+		VMLRadialGradientURL: 'http://code.highcharts.com/3.0.6/gfx/vml-radial-gradient.png'
+	},
+	chart: {
+		//animation: true,
+		//alignTicks: false,
+		//reflow: true,
+		//className: null,
+		//events: { load, selection },
+		//margin: [null],
+		//marginTop: null,
+		//marginRight: null,
+		//marginBottom: null,
+		//marginLeft: null,
+		borderColor: '#4572A7',
+		//borderWidth: 0,
+		borderRadius: 5,
+		defaultSeriesType: 'line',
+		ignoreHiddenSeries: true,
+		//inverted: false,
+		//shadow: false,
+		spacing: [10, 10, 15, 10],
+		//spacingTop: 10,
+		//spacingRight: 10,
+		//spacingBottom: 15,
+		//spacingLeft: 10,
+		style: {
+			fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif', // default font
+			fontSize: '12px'
+		},
+		backgroundColor: '#FFFFFF',
+		//plotBackgroundColor: null,
+		plotBorderColor: '#C0C0C0',
+		//plotBorderWidth: 0,
+		//plotShadow: false,
+		//zoomType: ''
+		resetZoomButton: {
+			theme: {
+				zIndex: 20
+			},
+			position: {
+				align: 'right',
+				x: -10,
+				//verticalAlign: 'top',
+				y: 10
+			}
+			// relativeTo: 'plot'
+		}
+	},
+	title: {
+		text: 'Chart title',
+		align: 'center',
+		// floating: false,
+		margin: 15,
+		// x: 0,
+		// verticalAlign: 'top',
+		// y: null,
+		style: {
+			color: '#274b6d',//#3E576F',
+			fontSize: '16px'
+		}
+
+	},
+	subtitle: {
+		text: '',
+		align: 'center',
+		// floating: false
+		// x: 0,
+		// verticalAlign: 'top',
+		// y: null,
+		style: {
+			color: '#4d759e'
+		}
+	},
+
+	plotOptions: {
+		line: { // base series options
+			allowPointSelect: false,
+			showCheckbox: false,
+			animation: {
+				duration: 1000
+			},
+			//connectNulls: false,
+			//cursor: 'default',
+			//clip: true,
+			//dashStyle: null,
+			//enableMouseTracking: true,
+			events: {},
+			//legendIndex: 0,
+			lineWidth: 2,
+			//shadow: false,
+			// stacking: null,
+			marker: {
+				enabled: true,
+				//symbol: null,
+				lineWidth: 0,
+				radius: 4,
+				lineColor: '#FFFFFF',
+				//fillColor: null,
+				states: { // states for a single point
+					hover: {
+						enabled: true
+						//radius: base + 2
+					},
+					select: {
+						fillColor: '#FFFFFF',
+						lineColor: '#000000',
+						lineWidth: 2
+					}
+				}
+			},
+			point: {
+				events: {}
+			},
+			dataLabels: merge(defaultLabelOptions, {
+				align: 'center',
+				enabled: false,
+				formatter: function () {
+					return this.y === null ? '' : numberFormat(this.y, -1);
+				},
+				verticalAlign: 'bottom', // above singular point
+				y: 0
+				// backgroundColor: undefined,
+				// borderColor: undefined,
+				// borderRadius: undefined,
+				// borderWidth: undefined,
+				// padding: 3,
+				// shadow: false
+			}),
+			cropThreshold: 300, // draw points outside the plot area when the number of points is less than this
+			pointRange: 0,
+			//pointStart: 0,
+			//pointInterval: 1,
+			showInLegend: true,
+			states: { // states for the entire series
+				hover: {
+					//enabled: false,
+					//lineWidth: base + 1,
+					marker: {
+						// lineWidth: base + 1,
+						// radius: base + 1
+					}
+				},
+				select: {
+					marker: {}
+				}
+			},
+			stickyTracking: true
+			//tooltip: {
+				//pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b>'
+				//valueDecimals: null,
+				//xDateFormat: '%A, %b %e, %Y',
+				//valuePrefix: '',
+				//ySuffix: ''				
+			//}
+			// turboThreshold: 1000
+			// zIndex: null
+		}
+	},
+	labels: {
+		//items: [],
+		style: {
+			//font: defaultFont,
+			position: ABSOLUTE,
+			color: '#3E576F'
+		}
+	},
+	legend: {
+		enabled: true,
+		align: 'center',
+		//floating: false,
+		layout: 'horizontal',
+		labelFormatter: function () {
+			return this.name;
+		},
+		borderWidth: 1,
+		borderColor: '#909090',
+		borderRadius: 5,
+		navigation: {
+			// animation: true,
+			activeColor: '#274b6d',
+			// arrowSize: 12
+			inactiveColor: '#CCC'
+			// style: {} // text styles
+		},
+		// margin: 10,
+		// reversed: false,
+		shadow: false,
+		// backgroundColor: null,
+		/*style: {
+			padding: '5px'
+		},*/
+		itemStyle: {
+			cursor: 'pointer',
+			color: '#274b6d',
+			fontSize: '12px'
+		},
+		itemHoverStyle: {
+			//cursor: 'pointer', removed as of #601
+			color: '#000'
+		},
+		itemHiddenStyle: {
+			color: '#CCC'
+		},
+		itemCheckboxStyle: {
+			position: ABSOLUTE,
+			width: '13px', // for IE precision
+			height: '13px'
+		},
+		// itemWidth: undefined,
+		symbolWidth: 16,
+		symbolPadding: 5,
+		verticalAlign: 'bottom',
+		// width: undefined,
+		x: 0,
+		y: 0,
+		title: {
+			//text: null,
+			style: {
+				fontWeight: 'bold'
+			}
+		}			
+	},
+
+	loading: {
+		// hideDuration: 100,
+		labelStyle: {
+			fontWeight: 'bold',
+			position: RELATIVE,
+			top: '1em'
+		},
+		// showDuration: 0,
+		style: {
+			position: ABSOLUTE,
+			backgroundColor: 'white',
+			opacity: 0.5,
+			textAlign: 'center'
+		}
+	},
+
+	tooltip: {
+		enabled: true,
+		animation: hasSVG,
+		//crosshairs: null,
+		backgroundColor: 'rgba(255, 255, 255, .85)',
+		borderWidth: 1,
+		borderRadius: 3,
+		dateTimeLabelFormats: { 
+			millisecond: '%A, %b %e, %H:%M:%S.%L',
+			second: '%A, %b %e, %H:%M:%S',
+			minute: '%A, %b %e, %H:%M',
+			hour: '%A, %b %e, %H:%M',
+			day: '%A, %b %e, %Y',
+			week: 'Week from %A, %b %e, %Y',
+			month: '%B %Y',
+			year: '%Y'
+		},
+		//formatter: defaultFormatter,
+		headerFormat: '<span style="font-size: 10px">{point.key}</span><br/>',
+		pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',
+		shadow: true,
+		//shared: false,
+		snap: isTouchDevice ? 25 : 10,
+		style: {
+			color: '#333333',
+			cursor: 'default',
+			fontSize: '12px',
+			padding: '8px',
+			whiteSpace: 'nowrap'
+		}
+		//xDateFormat: '%A, %b %e, %Y',
+		//valueDecimals: null,
+		//valuePrefix: '',
+		//valueSuffix: ''
+	},
+
+	credits: {
+		enabled: true,
+		text: 'Highcharts.com',
+		href: 'http://www.highcharts.com',
+		position: {
+			align: 'right',
+			x: -10,
+			verticalAlign: 'bottom',
+			y: -5
+		},
+		style: {
+			cursor: 'pointer',
+			color: '#909090',
+			fontSize: '9px'
+		}
+	}
+};
+
+
+
+
+// Series defaults
+var defaultPlotOptions = defaultOptions.plotOptions,
+	defaultSeriesOptions = defaultPlotOptions.line;
+
+// set the default time methods
+setTimeMethods();
+
+
+
+/**
+ * Set the time methods globally based on the useUTC option. Time method can be either
+ * local time or UTC (default).
+ */
+function setTimeMethods() {
+	var useUTC = defaultOptions.global.useUTC,
+		GET = useUTC ? 'getUTC' : 'get',
+		SET = useUTC ? 'setUTC' : 'set';
+
+	makeTime = useUTC ? Date.UTC : function (year, month, date, hours, minutes, seconds) {
+		return new Date(
+			year,
+			month,
+			pick(date, 1),
+			pick(hours, 0),
+			pick(minutes, 0),
+			pick(seconds, 0)
+		).getTime();
+	};
+	getMinutes =  GET + 'Minutes';
+	getHours =    GET + 'Hours';
+	getDay =      GET + 'Day';
+	getDate =     GET + 'Date';
+	getMonth =    GET + 'Month';
+	getFullYear = GET + 'FullYear';
+	setMinutes =  SET + 'Minutes';
+	setHours =    SET + 'Hours';
+	setDate =     SET + 'Date';
+	setMonth =    SET + 'Month';
+	setFullYear = SET + 'FullYear';
+
+}
+
+/**
+ * Merge the default options with custom options and return the new options structure
+ * @param {Object} options The new custom options
+ */
+function setOptions(options) {
+	
+	// Pull out axis options and apply them to the respective default axis options 
+	/*defaultXAxisOptions = merge(defaultXAxisOptions, options.xAxis);
+	defaultYAxisOptions = merge(defaultYAxisOptions, options.yAxis);
+	options.xAxis = options.yAxis = UNDEFINED;*/
+	
+	// Merge in the default options
+	defaultOptions = merge(defaultOptions, options);
+	
+	// Apply UTC
+	setTimeMethods();
+
+	return defaultOptions;
+}
+
+/**
+ * Get the updated default options. Merely exposing defaultOptions for outside modules
+ * isn't enough because the setOptions method creates a new object.
+ */
+function getOptions() {
+	return defaultOptions;
+}
+
+
+/**
+ * Handle color operations. The object methods are chainable.
+ * @param {String} input The input color in either rbga or hex format
+ */
+var Color = function (input) {
+	// declare variables
+	var rgba = [], result, stops;
+
+	/**
+	 * Parse the input color to rgba array
+	 * @param {String} input
+	 */
+	function init(input) {
+
+		// Gradients
+		if (input && input.stops) {
+			stops = map(input.stops, function (stop) {
+				return Color(stop[1]);
+			});
+
+		// Solid colors
+		} else {
+			// rgba
+			result = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(input);
+			if (result) {
+				rgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];
+			} else { 
+				// hex
+				result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(input);
+				if (result) {
+					rgba = [pInt(result[1], 16), pInt(result[2], 16), pInt(result[3], 16), 1];
+				} else {
+					// rgb
+					result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(input);
+					if (result) {
+						rgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];
+					}
+				}
+			}
+		}		
+
+	}
+	/**
+	 * Return the color a specified format
+	 * @param {String} format
+	 */
+	function get(format) {
+		var ret;
+
+		if (stops) {
+			ret = merge(input);
+			ret.stops = [].concat(ret.stops);
+			each(stops, function (stop, i) {
+				ret.stops[i] = [ret.stops[i][0], stop.get(format)];
+			});
+
+		// it's NaN if gradient colors on a column chart
+		} else if (rgba && !isNaN(rgba[0])) {
+			if (format === 'rgb') {
+				ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';
+			} else if (format === 'a') {
+				ret = rgba[3];
+			} else {
+				ret = 'rgba(' + rgba.join(',') + ')';
+			}
+		} else {
+			ret = input;
+		}
+		return ret;
+	}
+
+	/**
+	 * Brighten the color
+	 * @param {Number} alpha
+	 */
+	function brighten(alpha) {
+		if (stops) {
+			each(stops, function (stop) {
+				stop.brighten(alpha);
+			});
+		
+		} else if (isNumber(alpha) && alpha !== 0) {
+			var i;
+			for (i = 0; i < 3; i++) {
+				rgba[i] += pInt(alpha * 255);
+
+				if (rgba[i] < 0) {
+					rgba[i] = 0;
+				}
+				if (rgba[i] > 255) {
+					rgba[i] = 255;
+				}
+			}
+		}
+		return this;
+	}
+	/**
+	 * Set the color's opacity to a given alpha value
+	 * @param {Number} alpha
+	 */
+	function setOpacity(alpha) {
+		rgba[3] = alpha;
+		return this;
+	}
+
+	// initialize: parse the input
+	init(input);
+
+	// public methods
+	return {
+		get: get,
+		brighten: brighten,
+		rgba: rgba,
+		setOpacity: setOpacity
+	};
+};
+
+
+/**
+ * A wrapper object for SVG elements
+ */
+function SVGElement() {}
+
+SVGElement.prototype = {
+	/**
+	 * Initialize the SVG renderer
+	 * @param {Object} renderer
+	 * @param {String} nodeName
+	 */
+	init: function (renderer, nodeName) {
+		var wrapper = this;
+		wrapper.element = nodeName === 'span' ?
+			createElement(nodeName) :
+			doc.createElementNS(SVG_NS, nodeName);
+		wrapper.renderer = renderer;
+		/**
+		 * A collection of attribute setters. These methods, if defined, are called right before a certain
+		 * attribute is set on an element wrapper. Returning false prevents the default attribute
+		 * setter to run. Returning a value causes the default setter to set that value. Used in
+		 * Renderer.label.
+		 */
+		wrapper.attrSetters = {};
+	},
+	/**
+	 * Default base for animation
+	 */
+	opacity: 1,
+	/**
+	 * Animate a given attribute
+	 * @param {Object} params
+	 * @param {Number} options The same options as in jQuery animation
+	 * @param {Function} complete Function to perform at the end of animation
+	 */
+	animate: function (params, options, complete) {
+		var animOptions = pick(options, globalAnimation, true);
+		stop(this); // stop regardless of animation actually running, or reverting to .attr (#607)
+		if (animOptions) {
+			animOptions = merge(animOptions);
+			if (complete) { // allows using a callback with the global animation without overwriting it
+				animOptions.complete = complete;
+			}
+			animate(this, params, animOptions);
+		} else {
+			this.attr(params);
+			if (complete) {
+				complete();
+			}
+		}
+	},
+	/**
+	 * Set or get a given attribute
+	 * @param {Object|String} hash
+	 * @param {Mixed|Undefined} val
+	 */
+	attr: function (hash, val) {
+		var wrapper = this,
+			key,
+			value,
+			result,
+			i,
+			child,
+			element = wrapper.element,
+			nodeName = element.nodeName.toLowerCase(), // Android2 requires lower for "text"
+			renderer = wrapper.renderer,
+			skipAttr,
+			titleNode,
+			attrSetters = wrapper.attrSetters,
+			shadows = wrapper.shadows,
+			hasSetSymbolSize,
+			doTransform,
+			ret = wrapper;
+
+		// single key-value pair
+		if (isString(hash) && defined(val)) {
+			key = hash;
+			hash = {};
+			hash[key] = val;
+		}
+
+		// used as a getter: first argument is a string, second is undefined
+		if (isString(hash)) {
+			key = hash;
+			if (nodeName === 'circle') {
+				key = { x: 'cx', y: 'cy' }[key] || key;
+			} else if (key === 'strokeWidth') {
+				key = 'stroke-width';
+			}
+			ret = attr(element, key) || wrapper[key] || 0;
+			if (key !== 'd' && key !== 'visibility' && key !== 'fill') { // 'd' is string in animation step
+				ret = parseFloat(ret);
+			}
+
+		// setter
+		} else {
+
+			for (key in hash) {
+				skipAttr = false; // reset
+				value = hash[key];
+
+				// check for a specific attribute setter
+				result = attrSetters[key] && attrSetters[key].call(wrapper, value, key);
+
+				if (result !== false) {
+					if (result !== UNDEFINED) {
+						value = result; // the attribute setter has returned a new value to set
+					}
+
+
+					// paths
+					if (key === 'd') {
+						if (value && value.join) { // join path
+							value = value.join(' ');
+						}
+						if (/(NaN| {2}|^$)/.test(value)) {
+							value = 'M 0 0';
+						}
+						//wrapper.d = value; // shortcut for animations
+
+					// update child tspans x values
+					} else if (key === 'x' && nodeName === 'text') {
+						for (i = 0; i < element.childNodes.length; i++) {
+							child = element.childNodes[i];
+							// if the x values are equal, the tspan represents a linebreak
+							if (attr(child, 'x') === attr(element, 'x')) {
+								//child.setAttribute('x', value);
+								attr(child, 'x', value);
+							}
+						}
+
+					} else if (wrapper.rotation && (key === 'x' || key === 'y')) {
+						doTransform = true;
+
+					// apply gradients
+					} else if (key === 'fill') {
+						value = renderer.color(value, element, key);
+
+					// circle x and y
+					} else if (nodeName === 'circle' && (key === 'x' || key === 'y')) {
+						key = { x: 'cx', y: 'cy' }[key] || key;
+
+					// rectangle border radius
+					} else if (nodeName === 'rect' && key === 'r') {
+						attr(element, {
+							rx: value,
+							ry: value
+						});
+						skipAttr = true;
+
+					// translation and text rotation
+					} else if (key === 'translateX' || key === 'translateY' || key === 'rotation' ||
+							key === 'verticalAlign' || key === 'scaleX' || key === 'scaleY') {
+						doTransform = true;
+						skipAttr = true;
+
+					// apply opacity as subnode (required by legacy WebKit and Batik)
+					} else if (key === 'stroke') {
+						value = renderer.color(value, element, key);
+
+					// emulate VML's dashstyle implementation
+					} else if (key === 'dashstyle') {
+						key = 'stroke-dasharray';
+						value = value && value.toLowerCase();
+						if (value === 'solid') {
+							value = NONE;
+						} else if (value) {
+							value = value
+								.replace('shortdashdotdot', '3,1,1,1,1,1,')
+								.replace('shortdashdot', '3,1,1,1')
+								.replace('shortdot', '1,1,')
+								.replace('shortdash', '3,1,')
+								.replace('longdash', '8,3,')
+								.replace(/dot/g, '1,3,')
+								.replace('dash', '4,3,')
+								.replace(/,$/, '')
+								.split(','); // ending comma
+
+							i = value.length;
+							while (i--) {
+								value[i] = pInt(value[i]) * pick(hash['stroke-width'], wrapper['stroke-width']);
+							}
+							value = value.join(',');
+						}
+
+					// IE9/MooTools combo: MooTools returns objects instead of numbers and IE9 Beta 2
+					// is unable to cast them. Test again with final IE9.
+					} else if (key === 'width') {
+						value = pInt(value);
+
+					// Text alignment
+					} else if (key === 'align') {
+						key = 'text-anchor';
+						value = { left: 'start', center: 'middle', right: 'end' }[value];
+
+					// Title requires a subnode, #431
+					} else if (key === 'title') {
+						titleNode = element.getElementsByTagName('title')[0];
+						if (!titleNode) {
+							titleNode = doc.createElementNS(SVG_NS, 'title');
+							element.appendChild(titleNode);
+						}
+						titleNode.textContent = value;
+					}
+
+					// jQuery animate changes case
+					if (key === 'strokeWidth') {
+						key = 'stroke-width';
+					}
+
+					// In Chrome/Win < 6 as well as Batik, the stroke attribute can't be set when the stroke-
+					// width is 0. #1369
+					if (key === 'stroke-width' || key === 'stroke') {
+						wrapper[key] = value;
+						// Only apply the stroke attribute if the stroke width is defined and larger than 0
+						if (wrapper.stroke && wrapper['stroke-width']) {
+							attr(element, 'stroke', wrapper.stroke);
+							attr(element, 'stroke-width', wrapper['stroke-width']);
+							wrapper.hasStroke = true;
+						} else if (key === 'stroke-width' && value === 0 && wrapper.hasStroke) {
+							element.removeAttribute('stroke');
+							wrapper.hasStroke = false;
+						}
+						skipAttr = true;
+					}
+
+					// symbols
+					if (wrapper.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(key)) {
+
+
+						if (!hasSetSymbolSize) {
+							wrapper.symbolAttr(hash);
+							hasSetSymbolSize = true;
+						}
+						skipAttr = true;
+					}
+
+					// let the shadow follow the main element
+					if (shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {
+						i = shadows.length;
+						while (i--) {
+							attr(
+								shadows[i],
+								key,
+								key === 'height' ?
+									mathMax(value - (shadows[i].cutHeight || 0), 0) :
+									value
+							);
+						}
+					}
+
+					// validate heights
+					if ((key === 'width' || key === 'height') && nodeName === 'rect' && value < 0) {
+						value = 0;
+					}
+
+					// Record for animation and quick access without polling the DOM
+					wrapper[key] = value;
+
+
+					if (key === 'text') {
+						// Delete bBox memo when the text changes
+						if (value !== wrapper.textStr) {
+							delete wrapper.bBox;
+						}
+						wrapper.textStr = value;
+						if (wrapper.added) {
+							renderer.buildText(wrapper);
+						}
+					} else if (!skipAttr) {
+						attr(element, key, value);
+					}
+
+				}
+
+			}
+
+			// Update transform. Do this outside the loop to prevent redundant updating for batch setting
+			// of attributes.
+			if (doTransform) {
+				wrapper.updateTransform();
+			}
+
+		}
+
+		return ret;
+	},
+
+
+	/**
+	 * Add a class name to an element
+	 */
+	addClass: function (className) {
+		var element = this.element,
+			currentClassName = attr(element, 'class') || '';
+
+		if (currentClassName.indexOf(className) === -1) {
+			attr(element, 'class', currentClassName + ' ' + className);
+		}
+		return this;
+	},
+	/* hasClass and removeClass are not (yet) needed
+	hasClass: function (className) {
+		return attr(this.element, 'class').indexOf(className) !== -1;
+	},
+	removeClass: function (className) {
+		attr(this.element, 'class', attr(this.element, 'class').replace(className, ''));
+		return this;
+	},
+	*/
+
+	/**
+	 * If one of the symbol size affecting parameters are changed,
+	 * check all the others only once for each call to an element's
+	 * .attr() method
+	 * @param {Object} hash
+	 */
+	symbolAttr: function (hash) {
+		var wrapper = this;
+
+		each(['x', 'y', 'r', 'start', 'end', 'width', 'height', 'innerR', 'anchorX', 'anchorY'], function (key) {
+			wrapper[key] = pick(hash[key], wrapper[key]);
+		});
+
+		wrapper.attr({
+			d: wrapper.renderer.symbols[wrapper.symbolName](
+				wrapper.x,
+				wrapper.y,
+				wrapper.width,
+				wrapper.height,
+				wrapper
+			)
+		});
+	},
+
+	/**
+	 * Apply a clipping path to this object
+	 * @param {String} id
+	 */
+	clip: function (clipRect) {
+		return this.attr('clip-path', clipRect ? 'url(' + this.renderer.url + '#' + clipRect.id + ')' : NONE);
+	},
+
+	/**
+	 * Calculate the coordinates needed for drawing a rectangle crisply and return the
+	 * calculated attributes
+	 * @param {Number} strokeWidth
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	crisp: function (strokeWidth, x, y, width, height) {
+
+		var wrapper = this,
+			key,
+			attribs = {},
+			values = {},
+			normalizer;
+
+		strokeWidth = strokeWidth || wrapper.strokeWidth || (wrapper.attr && wrapper.attr('stroke-width')) || 0;
+		normalizer = mathRound(strokeWidth) % 2 / 2; // mathRound because strokeWidth can sometimes have roundoff errors
+
+		// normalize for crisp edges
+		values.x = mathFloor(x || wrapper.x || 0) + normalizer;
+		values.y = mathFloor(y || wrapper.y || 0) + normalizer;
+		values.width = mathFloor((width || wrapper.width || 0) - 2 * normalizer);
+		values.height = mathFloor((height || wrapper.height || 0) - 2 * normalizer);
+		values.strokeWidth = strokeWidth;
+
+		for (key in values) {
+			if (wrapper[key] !== values[key]) { // only set attribute if changed
+				wrapper[key] = attribs[key] = values[key];
+			}
+		}
+
+		return attribs;
+	},
+
+	/**
+	 * Set styles for the element
+	 * @param {Object} styles
+	 */
+	css: function (styles) {
+		/*jslint unparam: true*//* allow unused param a in the regexp function below */
+		var elemWrapper = this,
+			elem = elemWrapper.element,
+			textWidth = styles && styles.width && elem.nodeName.toLowerCase() === 'text',
+			n,
+			serializedCss = '',
+			hyphenate = function (a, b) { return '-' + b.toLowerCase(); };
+		/*jslint unparam: false*/
+
+		// convert legacy
+		if (styles && styles.color) {
+			styles.fill = styles.color;
+		}
+
+		// Merge the new styles with the old ones
+		styles = extend(
+			elemWrapper.styles,
+			styles
+		);
+
+		// store object
+		elemWrapper.styles = styles;
+
+
+		// Don't handle line wrap on canvas
+		if (useCanVG && textWidth) {
+			delete styles.width;
+		}
+
+		// serialize and set style attribute
+		if (isIE && !hasSVG) { // legacy IE doesn't support setting style attribute
+			if (textWidth) {
+				delete styles.width;
+			}
+			css(elemWrapper.element, styles);
+		} else {
+			for (n in styles) {
+				serializedCss += n.replace(/([A-Z])/g, hyphenate) + ':' + styles[n] + ';';
+			}
+			attr(elem, 'style', serializedCss); // #1881
+		}
+
+
+		// re-build text
+		if (textWidth && elemWrapper.added) {
+			elemWrapper.renderer.buildText(elemWrapper);
+		}
+
+		return elemWrapper;
+	},
+
+	/**
+	 * Add an event listener
+	 * @param {String} eventType
+	 * @param {Function} handler
+	 */
+	on: function (eventType, handler) {
+		var svgElement = this,
+			element = svgElement.element;
+		
+		// touch
+		if (hasTouch && eventType === 'click') {
+			element.ontouchstart = function (e) {			
+				svgElement.touchEventFired = Date.now();				
+				e.preventDefault();
+				handler.call(element, e);
+			};
+			element.onclick = function (e) {												
+				if (userAgent.indexOf('Android') === -1 || Date.now() - (svgElement.touchEventFired || 0) > 1100) { // #2269
+					handler.call(element, e);
+				}
+			};			
+		} else {
+			// simplest possible event model for internal use
+			element['on' + eventType] = handler;
+		}
+		return this;
+	},
+
+	/**
+	 * Set the coordinates needed to draw a consistent radial gradient across
+	 * pie slices regardless of positioning inside the chart. The format is
+	 * [centerX, centerY, diameter] in pixels.
+	 */
+	setRadialReference: function (coordinates) {
+		this.element.radialReference = coordinates;
+		return this;
+	},
+
+	/**
+	 * Move an object and its children by x and y values
+	 * @param {Number} x
+	 * @param {Number} y
+	 */
+	translate: function (x, y) {
+		return this.attr({
+			translateX: x,
+			translateY: y
+		});
+	},
+
+	/**
+	 * Invert a group, rotate and flip
+	 */
+	invert: function () {
+		var wrapper = this;
+		wrapper.inverted = true;
+		wrapper.updateTransform();
+		return wrapper;
+	},
+
+	/**
+	 * Apply CSS to HTML elements. This is used in text within SVG rendering and
+	 * by the VML renderer
+	 */
+	htmlCss: function (styles) {
+		var wrapper = this,
+			element = wrapper.element,
+			textWidth = styles && element.tagName === 'SPAN' && styles.width;
+
+		if (textWidth) {
+			delete styles.width;
+			wrapper.textWidth = textWidth;
+			wrapper.updateTransform();
+		}
+
+		wrapper.styles = extend(wrapper.styles, styles);
+		css(wrapper.element, styles);
+
+		return wrapper;
+	},
+
+
+
+	/**
+	 * VML and useHTML method for calculating the bounding box based on offsets
+	 * @param {Boolean} refresh Whether to force a fresh value from the DOM or to
+	 * use the cached value
+	 *
+	 * @return {Object} A hash containing values for x, y, width and height
+	 */
+
+	htmlGetBBox: function () {
+		var wrapper = this,
+			element = wrapper.element,
+			bBox = wrapper.bBox;
+
+		// faking getBBox in exported SVG in legacy IE
+		if (!bBox) {
+			// faking getBBox in exported SVG in legacy IE (is this a duplicate of the fix for #1079?)
+			if (element.nodeName === 'text') {
+				element.style.position = ABSOLUTE;
+			}
+
+			bBox = wrapper.bBox = {
+				x: element.offsetLeft,
+				y: element.offsetTop,
+				width: element.offsetWidth,
+				height: element.offsetHeight
+			};
+		}
+
+		return bBox;
+	},
+
+	/**
+	 * VML override private method to update elements based on internal
+	 * properties based on SVG transform
+	 */
+	htmlUpdateTransform: function () {
+		// aligning non added elements is expensive
+		if (!this.added) {
+			this.alignOnAdd = true;
+			return;
+		}
+
+		var wrapper = this,
+			renderer = wrapper.renderer,
+			elem = wrapper.element,
+			translateX = wrapper.translateX || 0,
+			translateY = wrapper.translateY || 0,
+			x = wrapper.x || 0,
+			y = wrapper.y || 0,
+			align = wrapper.textAlign || 'left',
+			alignCorrection = { left: 0, center: 0.5, right: 1 }[align],
+			nonLeft = align && align !== 'left',
+			shadows = wrapper.shadows;
+
+		// apply translate
+		css(elem, {
+			marginLeft: translateX,
+			marginTop: translateY
+		});
+		if (shadows) { // used in labels/tooltip
+			each(shadows, function (shadow) {
+				css(shadow, {
+					marginLeft: translateX + 1,
+					marginTop: translateY + 1
+				});
+			});
+		}
+
+		// apply inversion
+		if (wrapper.inverted) { // wrapper is a group
+			each(elem.childNodes, function (child) {
+				renderer.invertChild(child, elem);
+			});
+		}
+
+		if (elem.tagName === 'SPAN') {
+
+			var width, height,
+				rotation = wrapper.rotation,
+				baseline,
+				radians = 0,
+				costheta = 1,
+				sintheta = 0,
+				quad,
+				textWidth = pInt(wrapper.textWidth),
+				xCorr = wrapper.xCorr || 0,
+				yCorr = wrapper.yCorr || 0,
+				currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth].join(',');
+
+			if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed
+
+				if (defined(rotation)) {
+
+					radians = rotation * deg2rad; // deg to rad
+					costheta = mathCos(radians);
+					sintheta = mathSin(radians);
+
+					wrapper.setSpanRotation(rotation, sintheta, costheta);
+
+				}
+
+				width = pick(wrapper.elemWidth, elem.offsetWidth);
+				height = pick(wrapper.elemHeight, elem.offsetHeight);
+
+				// update textWidth
+				if (width > textWidth && /[ \-]/.test(elem.textContent || elem.innerText)) { // #983, #1254
+					css(elem, {
+						width: textWidth + PX,
+						display: 'block',
+						whiteSpace: 'normal'
+					});
+					width = textWidth;
+				}
+
+				// correct x and y
+				baseline = renderer.fontMetrics(elem.style.fontSize).b;
+				xCorr = costheta < 0 && -width;
+				yCorr = sintheta < 0 && -height;
+
+				// correct for baseline and corners spilling out after rotation
+				quad = costheta * sintheta < 0;
+				xCorr += sintheta * baseline * (quad ? 1 - alignCorrection : alignCorrection);
+				yCorr -= costheta * baseline * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1);
+
+				// correct for the length/height of the text
+				if (nonLeft) {
+					xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1);
+					if (rotation) {
+						yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1);
+					}
+					css(elem, {
+						textAlign: align
+					});
+				}
+
+				// record correction
+				wrapper.xCorr = xCorr;
+				wrapper.yCorr = yCorr;
+			}
+
+			// apply position with correction
+			css(elem, {
+				left: (x + xCorr) + PX,
+				top: (y + yCorr) + PX
+			});
+
+			// force reflow in webkit to apply the left and top on useHTML element (#1249)
+			if (isWebKit) {
+				height = elem.offsetHeight; // assigned to height for JSLint purpose
+			}
+
+			// record current text transform
+			wrapper.cTT = currentTextTransform;
+		}
+	},
+
+	/**
+	 * Set the rotation of an individual HTML span
+	 */
+	setSpanRotation: function (rotation) {
+		var rotationStyle = {},
+			cssTransformKey = isIE ? '-ms-transform' : isWebKit ? '-webkit-transform' : isFirefox ? 'MozTransform' : isOpera ? '-o-transform' : '';
+
+		rotationStyle[cssTransformKey] = rotationStyle.transform = 'rotate(' + rotation + 'deg)';
+		css(this.element, rotationStyle);
+	},
+
+	/**
+	 * Private method to update the transform attribute based on internal
+	 * properties
+	 */
+	updateTransform: function () {
+		var wrapper = this,
+			translateX = wrapper.translateX || 0,
+			translateY = wrapper.translateY || 0,
+			scaleX = wrapper.scaleX,
+			scaleY = wrapper.scaleY,
+			inverted = wrapper.inverted,
+			rotation = wrapper.rotation,
+			transform;
+
+		// flipping affects translate as adjustment for flipping around the group's axis
+		if (inverted) {
+			translateX += wrapper.attr('width');
+			translateY += wrapper.attr('height');
+		}
+
+		// Apply translate. Nearly all transformed elements have translation, so instead
+		// of checking for translate = 0, do it always (#1767, #1846).
+		transform = ['translate(' + translateX + ',' + translateY + ')'];
+
+		// apply rotation
+		if (inverted) {
+			transform.push('rotate(90) scale(-1,1)');
+		} else if (rotation) { // text rotation
+			transform.push('rotate(' + rotation + ' ' + (wrapper.x || 0) + ' ' + (wrapper.y || 0) + ')');
+		}
+
+		// apply scale
+		if (defined(scaleX) || defined(scaleY)) {
+			transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');
+		}
+
+		if (transform.length) {
+			attr(wrapper.element, 'transform', transform.join(' '));
+		}
+	},
+	/**
+	 * Bring the element to the front
+	 */
+	toFront: function () {
+		var element = this.element;
+		element.parentNode.appendChild(element);
+		return this;
+	},
+
+
+	/**
+	 * Break down alignment options like align, verticalAlign, x and y
+	 * to x and y relative to the chart.
+	 *
+	 * @param {Object} alignOptions
+	 * @param {Boolean} alignByTranslate
+	 * @param {String[Object} box The box to align to, needs a width and height. When the
+	 *        box is a string, it refers to an object in the Renderer. For example, when
+	 *        box is 'spacingBox', it refers to Renderer.spacingBox which holds width, height
+	 *        x and y properties.
+	 *
+	 */
+	align: function (alignOptions, alignByTranslate, box) {
+		var align,
+			vAlign,
+			x,
+			y,
+			attribs = {},
+			alignTo,
+			renderer = this.renderer,
+			alignedObjects = renderer.alignedObjects;
+
+		// First call on instanciate
+		if (alignOptions) {
+			this.alignOptions = alignOptions;
+			this.alignByTranslate = alignByTranslate;
+			if (!box || isString(box)) { // boxes other than renderer handle this internally
+				this.alignTo = alignTo = box || 'renderer';
+				erase(alignedObjects, this); // prevent duplicates, like legendGroup after resize
+				alignedObjects.push(this);
+				box = null; // reassign it below
+			}
+
+		// When called on resize, no arguments are supplied
+		} else {
+			alignOptions = this.alignOptions;
+			alignByTranslate = this.alignByTranslate;
+			alignTo = this.alignTo;
+		}
+
+		box = pick(box, renderer[alignTo], renderer);
+
+		// Assign variables
+		align = alignOptions.align;
+		vAlign = alignOptions.verticalAlign;
+		x = (box.x || 0) + (alignOptions.x || 0); // default: left align
+		y = (box.y || 0) + (alignOptions.y || 0); // default: top align
+
+		// Align
+		if (align === 'right' || align === 'center') {
+			x += (box.width - (alignOptions.width || 0)) /
+					{ right: 1, center: 2 }[align];
+		}
+		attribs[alignByTranslate ? 'translateX' : 'x'] = mathRound(x);
+
+
+		// Vertical align
+		if (vAlign === 'bottom' || vAlign === 'middle') {
+			y += (box.height - (alignOptions.height || 0)) /
+					({ bottom: 1, middle: 2 }[vAlign] || 1);
+
+		}
+		attribs[alignByTranslate ? 'translateY' : 'y'] = mathRound(y);
+
+		// Animate only if already placed
+		this[this.placed ? 'animate' : 'attr'](attribs);
+		this.placed = true;
+		this.alignAttr = attribs;
+
+		return this;
+	},
+
+	/**
+	 * Get the bounding box (width, height, x and y) for the element
+	 */
+	getBBox: function () {
+		var wrapper = this,
+			bBox = wrapper.bBox,
+			renderer = wrapper.renderer,
+			width,
+			height,
+			rotation = wrapper.rotation,
+			element = wrapper.element,
+			styles = wrapper.styles,
+			rad = rotation * deg2rad;
+
+		if (!bBox) {
+			// SVG elements
+			if (element.namespaceURI === SVG_NS || renderer.forExport) {
+				try { // Fails in Firefox if the container has display: none.
+
+					bBox = element.getBBox ?
+						// SVG: use extend because IE9 is not allowed to change width and height in case
+						// of rotation (below)
+						extend({}, element.getBBox()) :
+						// Canvas renderer and legacy IE in export mode
+						{
+							width: element.offsetWidth,
+							height: element.offsetHeight
+						};
+				} catch (e) {}
+
+				// If the bBox is not set, the try-catch block above failed. The other condition
+				// is for Opera that returns a width of -Infinity on hidden elements.
+				if (!bBox || bBox.width < 0) {
+					bBox = { width: 0, height: 0 };
+				}
+
+
+			// VML Renderer or useHTML within SVG
+			} else {
+
+				bBox = wrapper.htmlGetBBox();
+
+			}
+
+			// True SVG elements as well as HTML elements in modern browsers using the .useHTML option
+			// need to compensated for rotation
+			if (renderer.isSVG) {
+				width = bBox.width;
+				height = bBox.height;
+
+				// Workaround for wrong bounding box in IE9 and IE10 (#1101, #1505, #1669)
+				if (isIE && styles && styles.fontSize === '11px' && height.toPrecision(3) === '22.7') {
+					bBox.height = height = 14;
+				}
+
+				// Adjust for rotated text
+				if (rotation) {
+					bBox.width = mathAbs(height * mathSin(rad)) + mathAbs(width * mathCos(rad));
+					bBox.height = mathAbs(height * mathCos(rad)) + mathAbs(width * mathSin(rad));
+				}
+			}
+
+			wrapper.bBox = bBox;
+		}
+		return bBox;
+	},
+
+	/**
+	 * Show the element
+	 */
+	show: function () {
+		return this.attr({ visibility: VISIBLE });
+	},
+
+	/**
+	 * Hide the element
+	 */
+	hide: function () {
+		return this.attr({ visibility: HIDDEN });
+	},
+
+	fadeOut: function (duration) {
+		var elemWrapper = this;
+		elemWrapper.animate({
+			opacity: 0
+		}, {
+			duration: duration || 150,
+			complete: function () {
+				elemWrapper.hide();
+			}
+		});
+	},
+
+	/**
+	 * Add the element
+	 * @param {Object|Undefined} parent Can be an element, an element wrapper or undefined
+	 *    to append the element to the renderer.box.
+	 */
+	add: function (parent) {
+
+		var renderer = this.renderer,
+			parentWrapper = parent || renderer,
+			parentNode = parentWrapper.element || renderer.box,
+			childNodes = parentNode.childNodes,
+			element = this.element,
+			zIndex = attr(element, 'zIndex'),
+			otherElement,
+			otherZIndex,
+			i,
+			inserted;
+
+		if (parent) {
+			this.parentGroup = parent;
+		}
+
+		// mark as inverted
+		this.parentInverted = parent && parent.inverted;
+
+		// build formatted text
+		if (this.textStr !== undefined) {
+			renderer.buildText(this);
+		}
+
+		// mark the container as having z indexed children
+		if (zIndex) {
+			parentWrapper.handleZ = true;
+			zIndex = pInt(zIndex);
+		}
+
+		// insert according to this and other elements' zIndex
+		if (parentWrapper.handleZ) { // this element or any of its siblings has a z index
+			for (i = 0; i < childNodes.length; i++) {
+				otherElement = childNodes[i];
+				otherZIndex = attr(otherElement, 'zIndex');
+				if (otherElement !== element && (
+						// insert before the first element with a higher zIndex
+						pInt(otherZIndex) > zIndex ||
+						// if no zIndex given, insert before the first element with a zIndex
+						(!defined(zIndex) && defined(otherZIndex))
+
+						)) {
+					parentNode.insertBefore(element, otherElement);
+					inserted = true;
+					break;
+				}
+			}
+		}
+
+		// default: append at the end
+		if (!inserted) {
+			parentNode.appendChild(element);
+		}
+
+		// mark as added
+		this.added = true;
+
+		// fire an event for internal hooks
+		fireEvent(this, 'add');
+
+		return this;
+	},
+
+	/**
+	 * Removes a child either by removeChild or move to garbageBin.
+	 * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.
+	 */
+	safeRemoveChild: function (element) {
+		var parentNode = element.parentNode;
+		if (parentNode) {
+			parentNode.removeChild(element);
+		}
+	},
+
+	/**
+	 * Destroy the element and element wrapper
+	 */
+	destroy: function () {
+		var wrapper = this,
+			element = wrapper.element || {},
+			shadows = wrapper.shadows,
+			parentToClean = wrapper.renderer.isSVG && element.nodeName === 'SPAN' && element.parentNode,
+			grandParent,
+			key,
+			i;
+
+		// remove events
+		element.onclick = element.onmouseout = element.onmouseover = element.onmousemove = element.point = null;
+		stop(wrapper); // stop running animations
+
+		if (wrapper.clipPath) {
+			wrapper.clipPath = wrapper.clipPath.destroy();
+		}
+
+		// Destroy stops in case this is a gradient object
+		if (wrapper.stops) {
+			for (i = 0; i < wrapper.stops.length; i++) {
+				wrapper.stops[i] = wrapper.stops[i].destroy();
+			}
+			wrapper.stops = null;
+		}
+
+		// remove element
+		wrapper.safeRemoveChild(element);
+
+		// destroy shadows
+		if (shadows) {
+			each(shadows, function (shadow) {
+				wrapper.safeRemoveChild(shadow);
+			});
+		}
+
+		// In case of useHTML, clean up empty containers emulating SVG groups (#1960).
+		while (parentToClean && parentToClean.childNodes.length === 0) {
+			grandParent = parentToClean.parentNode;
+			wrapper.safeRemoveChild(parentToClean);
+			parentToClean = grandParent;
+		}
+
+		// remove from alignObjects
+		if (wrapper.alignTo) {
+			erase(wrapper.renderer.alignedObjects, wrapper);
+		}
+
+		for (key in wrapper) {
+			delete wrapper[key];
+		}
+
+		return null;
+	},
+
+	/**
+	 * Add a shadow to the element. Must be done after the element is added to the DOM
+	 * @param {Boolean|Object} shadowOptions
+	 */
+	shadow: function (shadowOptions, group, cutOff) {
+		var shadows = [],
+			i,
+			shadow,
+			element = this.element,
+			strokeWidth,
+			shadowWidth,
+			shadowElementOpacity,
+
+			// compensate for inverted plot area
+			transform;
+
+
+		if (shadowOptions) {
+			shadowWidth = pick(shadowOptions.width, 3);
+			shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;
+			transform = this.parentInverted ?
+				'(-1,-1)' :
+				'(' + pick(shadowOptions.offsetX, 1) + ', ' + pick(shadowOptions.offsetY, 1) + ')';
+			for (i = 1; i <= shadowWidth; i++) {
+				shadow = element.cloneNode(0);
+				strokeWidth = (shadowWidth * 2) + 1 - (2 * i);
+				attr(shadow, {
+					'isShadow': 'true',
+					'stroke': shadowOptions.color || 'black',
+					'stroke-opacity': shadowElementOpacity * i,
+					'stroke-width': strokeWidth,
+					'transform': 'translate' + transform,
+					'fill': NONE
+				});
+				if (cutOff) {
+					attr(shadow, 'height', mathMax(attr(shadow, 'height') - strokeWidth, 0));
+					shadow.cutHeight = strokeWidth;
+				}
+
+				if (group) {
+					group.element.appendChild(shadow);
+				} else {
+					element.parentNode.insertBefore(shadow, element);
+				}
+
+				shadows.push(shadow);
+			}
+
+			this.shadows = shadows;
+		}
+		return this;
+
+	}
+};
+
+
+/**
+ * The default SVG renderer
+ */
+var SVGRenderer = function () {
+	this.init.apply(this, arguments);
+};
+SVGRenderer.prototype = {
+	Element: SVGElement,
+
+	/**
+	 * Initialize the SVGRenderer
+	 * @param {Object} container
+	 * @param {Number} width
+	 * @param {Number} height
+	 * @param {Boolean} forExport
+	 */
+	init: function (container, width, height, forExport) {
+		var renderer = this,
+			loc = location,
+			boxWrapper,
+			element,
+			desc;
+
+		boxWrapper = renderer.createElement('svg')
+			.attr({
+				version: '1.1'
+			});
+		element = boxWrapper.element;
+		container.appendChild(element);
+
+		// For browsers other than IE, add the namespace attribute (#1978)
+		if (container.innerHTML.indexOf('xmlns') === -1) {
+			attr(element, 'xmlns', SVG_NS);
+		}
+
+		// object properties
+		renderer.isSVG = true;
+		renderer.box = element;
+		renderer.boxWrapper = boxWrapper;
+		renderer.alignedObjects = [];
+
+		// Page url used for internal references. #24, #672, #1070
+		renderer.url = (isFirefox || isWebKit) && doc.getElementsByTagName('base').length ?
+			loc.href
+				.replace(/#.*?$/, '') // remove the hash
+				.replace(/([\('\)])/g, '\\$1') // escape parantheses and quotes
+				.replace(/ /g, '%20') : // replace spaces (needed for Safari only)
+			'';
+
+		// Add description
+		desc = this.createElement('desc').add();
+		desc.element.appendChild(doc.createTextNode('Created with ' + PRODUCT + ' ' + VERSION));
+
+
+		renderer.defs = this.createElement('defs').add();
+		renderer.forExport = forExport;
+		renderer.gradients = {}; // Object where gradient SvgElements are stored
+
+		renderer.setSize(width, height, false);
+
+
+
+		// Issue 110 workaround:
+		// In Firefox, if a div is positioned by percentage, its pixel position may land
+		// between pixels. The container itself doesn't display this, but an SVG element
+		// inside this container will be drawn at subpixel precision. In order to draw
+		// sharp lines, this must be compensated for. This doesn't seem to work inside
+		// iframes though (like in jsFiddle).
+		var subPixelFix, rect;
+		if (isFirefox && container.getBoundingClientRect) {
+			renderer.subPixelFix = subPixelFix = function () {
+				css(container, { left: 0, top: 0 });
+				rect = container.getBoundingClientRect();
+				css(container, {
+					left: (mathCeil(rect.left) - rect.left) + PX,
+					top: (mathCeil(rect.top) - rect.top) + PX
+				});
+			};
+
+			// run the fix now
+			subPixelFix();
+
+			// run it on resize
+			addEvent(win, 'resize', subPixelFix);
+		}
+	},
+
+	/**
+	 * Detect whether the renderer is hidden. This happens when one of the parent elements
+	 * has display: none. #608.
+	 */
+	isHidden: function () {
+		return !this.boxWrapper.getBBox().width;
+	},
+
+	/**
+	 * Destroys the renderer and its allocated members.
+	 */
+	destroy: function () {
+		var renderer = this,
+			rendererDefs = renderer.defs;
+		renderer.box = null;
+		renderer.boxWrapper = renderer.boxWrapper.destroy();
+
+		// Call destroy on all gradient elements
+		destroyObjectProperties(renderer.gradients || {});
+		renderer.gradients = null;
+
+		// Defs are null in VMLRenderer
+		// Otherwise, destroy them here.
+		if (rendererDefs) {
+			renderer.defs = rendererDefs.destroy();
+		}
+
+		// Remove sub pixel fix handler
+		// We need to check that there is a handler, otherwise all functions that are registered for event 'resize' are removed
+		// See issue #982
+		if (renderer.subPixelFix) {
+			removeEvent(win, 'resize', renderer.subPixelFix);
+		}
+
+		renderer.alignedObjects = null;
+
+		return null;
+	},
+
+	/**
+	 * Create a wrapper for an SVG element
+	 * @param {Object} nodeName
+	 */
+	createElement: function (nodeName) {
+		var wrapper = new this.Element();
+		wrapper.init(this, nodeName);
+		return wrapper;
+	},
+
+	/**
+	 * Dummy function for use in canvas renderer
+	 */
+	draw: function () {},
+
+	/**
+	 * Parse a simple HTML string into SVG tspans
+	 *
+	 * @param {Object} textNode The parent text SVG node
+	 */
+	buildText: function (wrapper) {
+		var textNode = wrapper.element,
+			renderer = this,
+			forExport = renderer.forExport,
+			lines = pick(wrapper.textStr, '').toString()
+				.replace(/<(b|strong)>/g, '<span style="font-weight:bold">')
+				.replace(/<(i|em)>/g, '<span style="font-style:italic">')
+				.replace(/<a/g, '<span')
+				.replace(/<\/(b|strong|i|em|a)>/g, '</span>')
+				.split(/<br.*?>/g),
+			childNodes = textNode.childNodes,
+			styleRegex = /style="([^"]+)"/,
+			hrefRegex = /href="(http[^"]+)"/,
+			parentX = attr(textNode, 'x'),
+			textStyles = wrapper.styles,
+			width = textStyles && textStyles.width && pInt(textStyles.width),
+			textLineHeight = textStyles && textStyles.lineHeight,
+			i = childNodes.length;
+
+		/// remove old text
+		while (i--) {
+			textNode.removeChild(childNodes[i]);
+		}
+
+		if (width && !wrapper.added) {
+			this.box.appendChild(textNode); // attach it to the DOM to read offset width
+		}
+
+		// remove empty line at end
+		if (lines[lines.length - 1] === '') {
+			lines.pop();
+		}
+
+		// build the lines
+		each(lines, function (line, lineNo) {
+			var spans, spanNo = 0;
+
+			line = line.replace(/<span/g, '|||<span').replace(/<\/span>/g, '</span>|||');
+			spans = line.split('|||');
+
+			each(spans, function (span) {
+				if (span !== '' || spans.length === 1) {
+					var attributes = {},
+						tspan = doc.createElementNS(SVG_NS, 'tspan'),
+						spanStyle; // #390
+					if (styleRegex.test(span)) {
+						spanStyle = span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2');
+						attr(tspan, 'style', spanStyle);
+					}
+					if (hrefRegex.test(span) && !forExport) { // Not for export - #1529
+						attr(tspan, 'onclick', 'location.href=\"' + span.match(hrefRegex)[1] + '\"');
+						css(tspan, { cursor: 'pointer' });
+					}
+
+					span = (span.replace(/<(.|\n)*?>/g, '') || ' ')
+						.replace(/&lt;/g, '<')
+						.replace(/&gt;/g, '>');
+
+					// Nested tags aren't supported, and cause crash in Safari (#1596)
+					if (span !== ' ') {
+
+						// add the text node
+						tspan.appendChild(doc.createTextNode(span));
+
+						if (!spanNo) { // first span in a line, align it to the left
+							attributes.x = parentX;
+						} else {
+							attributes.dx = 0; // #16
+						}
+
+						// add attributes
+						attr(tspan, attributes);
+
+						// first span on subsequent line, add the line height
+						if (!spanNo && lineNo) {
+
+							// allow getting the right offset height in exporting in IE
+							if (!hasSVG && forExport) {
+								css(tspan, { display: 'block' });
+							}
+
+							// Set the line height based on the font size of either
+							// the text element or the tspan element
+							attr(
+								tspan,
+								'dy',
+								textLineHeight || renderer.fontMetrics(
+									/px$/.test(tspan.style.fontSize) ?
+										tspan.style.fontSize :
+										textStyles.fontSize
+								).h,
+								// Safari 6.0.2 - too optimized for its own good (#1539)
+								// TODO: revisit this with future versions of Safari
+								isWebKit && tspan.offsetHeight
+							);
+						}
+
+						// Append it
+						textNode.appendChild(tspan);
+
+						spanNo++;
+
+						// check width and apply soft breaks
+						if (width) {
+							var words = span.replace(/([^\^])-/g, '$1- ').split(' '), // #1273
+								tooLong,
+								actualWidth,
+								clipHeight = wrapper._clipHeight,
+								rest = [],
+								dy = pInt(textLineHeight || 16),
+								softLineNo = 1,
+								bBox;
+
+							while (words.length || rest.length) {
+								delete wrapper.bBox; // delete cache
+								bBox = wrapper.getBBox();
+								actualWidth = bBox.width;
+								tooLong = actualWidth > width;
+								if (!tooLong || words.length === 1) { // new line needed
+									words = rest;
+									rest = [];
+									if (words.length) {
+										softLineNo++;
+
+										if (clipHeight && softLineNo * dy > clipHeight) {
+											words = ['...'];
+											wrapper.attr('title', wrapper.textStr);
+										} else {
+
+											tspan = doc.createElementNS(SVG_NS, 'tspan');
+											attr(tspan, {
+												dy: dy,
+												x: parentX
+											});
+											if (spanStyle) { // #390
+												attr(tspan, 'style', spanStyle);
+											}
+											textNode.appendChild(tspan);
+
+											if (actualWidth > width) { // a single word is pressing it out
+												width = actualWidth;
+											}
+										}
+									}
+								} else { // append to existing line tspan
+									tspan.removeChild(tspan.firstChild);
+									rest.unshift(words.pop());
+								}
+								if (words.length) {
+									tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));
+								}
+							}
+						}
+					}
+				}
+			});
+		});
+	},
+
+	/**
+	 * Create a button with preset states
+	 * @param {String} text
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Function} callback
+	 * @param {Object} normalState
+	 * @param {Object} hoverState
+	 * @param {Object} pressedState
+	 */
+	button: function (text, x, y, callback, normalState, hoverState, pressedState, disabledState) {
+		var label = this.label(text, x, y, null, null, null, null, null, 'button'),
+			curState = 0,
+			stateOptions,
+			stateStyle,
+			normalStyle,
+			hoverStyle,
+			pressedStyle,
+			disabledStyle,
+			STYLE = 'style',
+			verticalGradient = { x1: 0, y1: 0, x2: 0, y2: 1 };
+
+		// Normal state - prepare the attributes
+		normalState = merge({
+			'stroke-width': 1,
+			stroke: '#CCCCCC',
+			fill: {
+				linearGradient: verticalGradient,
+				stops: [
+					[0, '#FEFEFE'],
+					[1, '#F6F6F6']
+				]
+			},
+			r: 2,
+			padding: 5,
+			style: {
+				color: 'black'
+			}
+		}, normalState);
+		normalStyle = normalState[STYLE];
+		delete normalState[STYLE];
+
+		// Hover state
+		hoverState = merge(normalState, {
+			stroke: '#68A',
+			fill: {
+				linearGradient: verticalGradient,
+				stops: [
+					[0, '#FFF'],
+					[1, '#ACF']
+				]
+			}
+		}, hoverState);
+		hoverStyle = hoverState[STYLE];
+		delete hoverState[STYLE];
+
+		// Pressed state
+		pressedState = merge(normalState, {
+			stroke: '#68A',
+			fill: {
+				linearGradient: verticalGradient,
+				stops: [
+					[0, '#9BD'],
+					[1, '#CDF']
+				]
+			}
+		}, pressedState);
+		pressedStyle = pressedState[STYLE];
+		delete pressedState[STYLE];
+
+		// Disabled state
+		disabledState = merge(normalState, {
+			style: {
+				color: '#CCC'
+			}
+		}, disabledState);
+		disabledStyle = disabledState[STYLE];
+		delete disabledState[STYLE];
+
+		// Add the events. IE9 and IE10 need mouseover and mouseout to funciton (#667).
+		addEvent(label.element, isIE ? 'mouseover' : 'mouseenter', function () {
+			if (curState !== 3) {
+				label.attr(hoverState)
+					.css(hoverStyle);
+			}
+		});
+		addEvent(label.element, isIE ? 'mouseout' : 'mouseleave', function () {
+			if (curState !== 3) {
+				stateOptions = [normalState, hoverState, pressedState][curState];
+				stateStyle = [normalStyle, hoverStyle, pressedStyle][curState];
+				label.attr(stateOptions)
+					.css(stateStyle);
+			}
+		});
+
+		label.setState = function (state) {
+			label.state = curState = state;
+			if (!state) {
+				label.attr(normalState)
+					.css(normalStyle);
+			} else if (state === 2) {
+				label.attr(pressedState)
+					.css(pressedStyle);
+			} else if (state === 3) {
+				label.attr(disabledState)
+					.css(disabledStyle);
+			}
+		};
+
+		return label
+			.on('click', function () {
+				if (curState !== 3) {
+					callback.call(label);
+				}
+			})
+			.attr(normalState)
+			.css(extend({ cursor: 'default' }, normalStyle));
+	},
+
+	/**
+	 * Make a straight line crisper by not spilling out to neighbour pixels
+	 * @param {Array} points
+	 * @param {Number} width
+	 */
+	crispLine: function (points, width) {
+		// points format: [M, 0, 0, L, 100, 0]
+		// normalize to a crisp line
+		if (points[1] === points[4]) {
+			// Substract due to #1129. Now bottom and left axis gridlines behave the same.
+			points[1] = points[4] = mathRound(points[1]) - (width % 2 / 2);
+		}
+		if (points[2] === points[5]) {
+			points[2] = points[5] = mathRound(points[2]) + (width % 2 / 2);
+		}
+		return points;
+	},
+
+
+	/**
+	 * Draw a path
+	 * @param {Array} path An SVG path in array form
+	 */
+	path: function (path) {
+		var attr = {
+			fill: NONE
+		};
+		if (isArray(path)) {
+			attr.d = path;
+		} else if (isObject(path)) { // attributes
+			extend(attr, path);
+		}
+		return this.createElement('path').attr(attr);
+	},
+
+	/**
+	 * Draw and return an SVG circle
+	 * @param {Number} x The x position
+	 * @param {Number} y The y position
+	 * @param {Number} r The radius
+	 */
+	circle: function (x, y, r) {
+		var attr = isObject(x) ?
+			x :
+			{
+				x: x,
+				y: y,
+				r: r
+			};
+
+		return this.createElement('circle').attr(attr);
+	},
+
+	/**
+	 * Draw and return an arc
+	 * @param {Number} x X position
+	 * @param {Number} y Y position
+	 * @param {Number} r Radius
+	 * @param {Number} innerR Inner radius like used in donut charts
+	 * @param {Number} start Starting angle
+	 * @param {Number} end Ending angle
+	 */
+	arc: function (x, y, r, innerR, start, end) {
+		var arc;
+
+		if (isObject(x)) {
+			y = x.y;
+			r = x.r;
+			innerR = x.innerR;
+			start = x.start;
+			end = x.end;
+			x = x.x;
+		}
+
+		// Arcs are defined as symbols for the ability to set
+		// attributes in attr and animate
+		arc = this.symbol('arc', x || 0, y || 0, r || 0, r || 0, {
+			innerR: innerR || 0,
+			start: start || 0,
+			end: end || 0
+		});
+		arc.r = r; // #959
+		return arc;
+	},
+
+	/**
+	 * Draw and return a rectangle
+	 * @param {Number} x Left position
+	 * @param {Number} y Top position
+	 * @param {Number} width
+	 * @param {Number} height
+	 * @param {Number} r Border corner radius
+	 * @param {Number} strokeWidth A stroke width can be supplied to allow crisp drawing
+	 */
+	rect: function (x, y, width, height, r, strokeWidth) {
+
+		r = isObject(x) ? x.r : r;
+
+		var wrapper = this.createElement('rect').attr({
+				rx: r,
+				ry: r,
+				fill: NONE
+			});
+		return wrapper.attr(
+				isObject(x) ?
+					x :
+					// do not crispify when an object is passed in (as in column charts)
+					wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))
+			);
+	},
+
+	/**
+	 * Resize the box and re-align all aligned elements
+	 * @param {Object} width
+	 * @param {Object} height
+	 * @param {Boolean} animate
+	 *
+	 */
+	setSize: function (width, height, animate) {
+		var renderer = this,
+			alignedObjects = renderer.alignedObjects,
+			i = alignedObjects.length;
+
+		renderer.width = width;
+		renderer.height = height;
+
+		renderer.boxWrapper[pick(animate, true) ? 'animate' : 'attr']({
+			width: width,
+			height: height
+		});
+
+		while (i--) {
+			alignedObjects[i].align();
+		}
+	},
+
+	/**
+	 * Create a group
+	 * @param {String} name The group will be given a class name of 'highcharts-{name}'.
+	 *     This can be used for styling and scripting.
+	 */
+	g: function (name) {
+		var elem = this.createElement('g');
+		return defined(name) ? elem.attr({ 'class': PREFIX + name }) : elem;
+	},
+
+	/**
+	 * Display an image
+	 * @param {String} src
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	image: function (src, x, y, width, height) {
+		var attribs = {
+				preserveAspectRatio: NONE
+			},
+			elemWrapper;
+
+		// optional properties
+		if (arguments.length > 1) {
+			extend(attribs, {
+				x: x,
+				y: y,
+				width: width,
+				height: height
+			});
+		}
+
+		elemWrapper = this.createElement('image').attr(attribs);
+
+		// set the href in the xlink namespace
+		if (elemWrapper.element.setAttributeNS) {
+			elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink',
+				'href', src);
+		} else {
+			// could be exporting in IE
+			// using href throws "not supported" in ie7 and under, requries regex shim to fix later
+			elemWrapper.element.setAttribute('hc-svg-href', src);
+	}
+
+		return elemWrapper;
+	},
+
+	/**
+	 * Draw a symbol out of pre-defined shape paths from the namespace 'symbol' object.
+	 *
+	 * @param {Object} symbol
+	 * @param {Object} x
+	 * @param {Object} y
+	 * @param {Object} radius
+	 * @param {Object} options
+	 */
+	symbol: function (symbol, x, y, width, height, options) {
+
+		var obj,
+
+			// get the symbol definition function
+			symbolFn = this.symbols[symbol],
+
+			// check if there's a path defined for this symbol
+			path = symbolFn && symbolFn(
+				mathRound(x),
+				mathRound(y),
+				width,
+				height,
+				options
+			),
+
+			imageElement,
+			imageRegex = /^url\((.*?)\)$/,
+			imageSrc,
+			imageSize,
+			centerImage;
+
+		if (path) {
+
+			obj = this.path(path);
+			// expando properties for use in animate and attr
+			extend(obj, {
+				symbolName: symbol,
+				x: x,
+				y: y,
+				width: width,
+				height: height
+			});
+			if (options) {
+				extend(obj, options);
+			}
+
+
+		// image symbols
+		} else if (imageRegex.test(symbol)) {
+
+			// On image load, set the size and position
+			centerImage = function (img, size) {
+				if (img.element) { // it may be destroyed in the meantime (#1390)
+					img.attr({
+						width: size[0],
+						height: size[1]
+					});
+
+					if (!img.alignByTranslate) { // #185
+						img.translate(
+							mathRound((width - size[0]) / 2), // #1378
+							mathRound((height - size[1]) / 2)
+						);
+					}
+				}
+			};
+
+			imageSrc = symbol.match(imageRegex)[1];
+			imageSize = symbolSizes[imageSrc];
+
+			// Ireate the image synchronously, add attribs async
+			obj = this.image(imageSrc)
+				.attr({
+					x: x,
+					y: y
+				});
+			obj.isImg = true;
+
+			if (imageSize) {
+				centerImage(obj, imageSize);
+			} else {
+				// Initialize image to be 0 size so export will still function if there's no cached sizes.
+				//
+				obj.attr({ width: 0, height: 0 });
+
+				// Create a dummy JavaScript image to get the width and height. Due to a bug in IE < 8,
+				// the created element must be assigned to a variable in order to load (#292).
+				imageElement = createElement('img', {
+					onload: function () {
+						centerImage(obj, symbolSizes[imageSrc] = [this.width, this.height]);
+					},
+					src: imageSrc
+				});
+			}
+		}
+
+		return obj;
+	},
+
+	/**
+	 * An extendable collection of functions for defining symbol paths.
+	 */
+	symbols: {
+		'circle': function (x, y, w, h) {
+			var cpw = 0.166 * w;
+			return [
+				M, x + w / 2, y,
+				'C', x + w + cpw, y, x + w + cpw, y + h, x + w / 2, y + h,
+				'C', x - cpw, y + h, x - cpw, y, x + w / 2, y,
+				'Z'
+			];
+		},
+
+		'square': function (x, y, w, h) {
+			return [
+				M, x, y,
+				L, x + w, y,
+				x + w, y + h,
+				x, y + h,
+				'Z'
+			];
+		},
+
+		'triangle': function (x, y, w, h) {
+			return [
+				M, x + w / 2, y,
+				L, x + w, y + h,
+				x, y + h,
+				'Z'
+			];
+		},
+
+		'triangle-down': function (x, y, w, h) {
+			return [
+				M, x, y,
+				L, x + w, y,
+				x + w / 2, y + h,
+				'Z'
+			];
+		},
+		'diamond': function (x, y, w, h) {
+			return [
+				M, x + w / 2, y,
+				L, x + w, y + h / 2,
+				x + w / 2, y + h,
+				x, y + h / 2,
+				'Z'
+			];
+		},
+		'arc': function (x, y, w, h, options) {
+			var start = options.start,
+				radius = options.r || w || h,
+				end = options.end - 0.001, // to prevent cos and sin of start and end from becoming equal on 360 arcs (related: #1561)
+				innerRadius = options.innerR,
+				open = options.open,
+				cosStart = mathCos(start),
+				sinStart = mathSin(start),
+				cosEnd = mathCos(end),
+				sinEnd = mathSin(end),
+				longArc = options.end - start < mathPI ? 0 : 1;
+
+			return [
+				M,
+				x + radius * cosStart,
+				y + radius * sinStart,
+				'A', // arcTo
+				radius, // x radius
+				radius, // y radius
+				0, // slanting
+				longArc, // long or short arc
+				1, // clockwise
+				x + radius * cosEnd,
+				y + radius * sinEnd,
+				open ? M : L,
+				x + innerRadius * cosEnd,
+				y + innerRadius * sinEnd,
+				'A', // arcTo
+				innerRadius, // x radius
+				innerRadius, // y radius
+				0, // slanting
+				longArc, // long or short arc
+				0, // clockwise
+				x + innerRadius * cosStart,
+				y + innerRadius * sinStart,
+
+				open ? '' : 'Z' // close
+			];
+		}
+	},
+
+	/**
+	 * Define a clipping rectangle
+	 * @param {String} id
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	clipRect: function (x, y, width, height) {
+		var wrapper,
+			id = PREFIX + idCounter++,
+
+			clipPath = this.createElement('clipPath').attr({
+				id: id
+			}).add(this.defs);
+
+		wrapper = this.rect(x, y, width, height, 0).add(clipPath);
+		wrapper.id = id;
+		wrapper.clipPath = clipPath;
+
+		return wrapper;
+	},
+
+
+	/**
+	 * Take a color and return it if it's a string, make it a gradient if it's a
+	 * gradient configuration object. Prior to Highstock, an array was used to define
+	 * a linear gradient with pixel positions relative to the SVG. In newer versions
+	 * we change the coordinates to apply relative to the shape, using coordinates
+	 * 0-1 within the shape. To preserve backwards compatibility, linearGradient
+	 * in this definition is an object of x1, y1, x2 and y2.
+	 *
+	 * @param {Object} color The color or config object
+	 */
+	color: function (color, elem, prop) {
+		var renderer = this,
+			colorObject,
+			regexRgba = /^rgba/,
+			gradName,
+			gradAttr,
+			gradients,
+			gradientObject,
+			stops,
+			stopColor,
+			stopOpacity,
+			radialReference,
+			n,
+			id,
+			key = [];
+
+		// Apply linear or radial gradients
+		if (color && color.linearGradient) {
+			gradName = 'linearGradient';
+		} else if (color && color.radialGradient) {
+			gradName = 'radialGradient';
+		}
+
+		if (gradName) {
+			gradAttr = color[gradName];
+			gradients = renderer.gradients;
+			stops = color.stops;
+			radialReference = elem.radialReference;
+
+			// Keep < 2.2 kompatibility
+			if (isArray(gradAttr)) {
+				color[gradName] = gradAttr = {
+					x1: gradAttr[0],
+					y1: gradAttr[1],
+					x2: gradAttr[2],
+					y2: gradAttr[3],
+					gradientUnits: 'userSpaceOnUse'
+				};
+			}
+
+			// Correct the radial gradient for the radial reference system
+			if (gradName === 'radialGradient' && radialReference && !defined(gradAttr.gradientUnits)) {
+				gradAttr = merge(gradAttr, {
+					cx: (radialReference[0] - radialReference[2] / 2) + gradAttr.cx * radialReference[2],
+					cy: (radialReference[1] - radialReference[2] / 2) + gradAttr.cy * radialReference[2],
+					r: gradAttr.r * radialReference[2],
+					gradientUnits: 'userSpaceOnUse'
+				});
+			}
+
+			// Build the unique key to detect whether we need to create a new element (#1282)
+			for (n in gradAttr) {
+				if (n !== 'id') {
+					key.push(n, gradAttr[n]);
+				}
+			}
+			for (n in stops) {
+				key.push(stops[n]);
+			}
+			key = key.join(',');
+
+			// Check if a gradient object with the same config object is created within this renderer
+			if (gradients[key]) {
+				id = gradients[key].id;
+
+			} else {
+
+				// Set the id and create the element
+				gradAttr.id = id = PREFIX + idCounter++;
+				gradients[key] = gradientObject = renderer.createElement(gradName)
+					.attr(gradAttr)
+					.add(renderer.defs);
+
+
+				// The gradient needs to keep a list of stops to be able to destroy them
+				gradientObject.stops = [];
+				each(stops, function (stop) {
+					var stopObject;
+					if (regexRgba.test(stop[1])) {
+						colorObject = Color(stop[1]);
+						stopColor = colorObject.get('rgb');
+						stopOpacity = colorObject.get('a');
+					} else {
+						stopColor = stop[1];
+						stopOpacity = 1;
+					}
+					stopObject = renderer.createElement('stop').attr({
+						offset: stop[0],
+						'stop-color': stopColor,
+						'stop-opacity': stopOpacity
+					}).add(gradientObject);
+
+					// Add the stop element to the gradient
+					gradientObject.stops.push(stopObject);
+				});
+			}
+
+			// Return the reference to the gradient object
+			return 'url(' + renderer.url + '#' + id + ')';
+
+		// Webkit and Batik can't show rgba.
+		} else if (regexRgba.test(color)) {
+			colorObject = Color(color);
+			attr(elem, prop + '-opacity', colorObject.get('a'));
+
+			return colorObject.get('rgb');
+
+
+		} else {
+			// Remove the opacity attribute added above. Does not throw if the attribute is not there.
+			elem.removeAttribute(prop + '-opacity');
+
+			return color;
+		}
+
+	},
+
+
+	/**
+	 * Add text to the SVG object
+	 * @param {String} str
+	 * @param {Number} x Left position
+	 * @param {Number} y Top position
+	 * @param {Boolean} useHTML Use HTML to render the text
+	 */
+	text: function (str, x, y, useHTML) {
+
+		// declare variables
+		var renderer = this,
+			defaultChartStyle = defaultOptions.chart.style,
+			fakeSVG = useCanVG || (!hasSVG && renderer.forExport),
+			wrapper;
+
+		if (useHTML && !renderer.forExport) {
+			return renderer.html(str, x, y);
+		}
+
+		x = mathRound(pick(x, 0));
+		y = mathRound(pick(y, 0));
+
+		wrapper = renderer.createElement('text')
+			.attr({
+				x: x,
+				y: y,
+				text: str
+			})
+			.css({
+				fontFamily: defaultChartStyle.fontFamily,
+				fontSize: defaultChartStyle.fontSize
+			});
+
+		// Prevent wrapping from creating false offsetWidths in export in legacy IE (#1079, #1063)
+		if (fakeSVG) {
+			wrapper.css({
+				position: ABSOLUTE
+			});
+		}
+
+		wrapper.x = x;
+		wrapper.y = y;
+		return wrapper;
+	},
+
+
+	/**
+	 * Create HTML text node. This is used by the VML renderer as well as the SVG
+	 * renderer through the useHTML option.
+	 *
+	 * @param {String} str
+	 * @param {Number} x
+	 * @param {Number} y
+	 */
+	html: function (str, x, y) {
+		var defaultChartStyle = defaultOptions.chart.style,
+			wrapper = this.createElement('span'),
+			attrSetters = wrapper.attrSetters,
+			element = wrapper.element,
+			renderer = wrapper.renderer;
+
+		// Text setter
+		attrSetters.text = function (value) {
+			if (value !== element.innerHTML) {
+				delete this.bBox;
+			}
+			element.innerHTML = value;
+			return false;
+		};
+
+		// Various setters which rely on update transform
+		attrSetters.x = attrSetters.y = attrSetters.align = function (value, key) {
+			if (key === 'align') {
+				key = 'textAlign'; // Do not overwrite the SVGElement.align method. Same as VML.
+			}
+			wrapper[key] = value;
+			wrapper.htmlUpdateTransform();
+			return false;
+		};
+
+		// Set the default attributes
+		wrapper.attr({
+				text: str,
+				x: mathRound(x),
+				y: mathRound(y)
+			})
+			.css({
+				position: ABSOLUTE,
+				whiteSpace: 'nowrap',
+				fontFamily: defaultChartStyle.fontFamily,
+				fontSize: defaultChartStyle.fontSize
+			});
+
+		// Use the HTML specific .css method
+		wrapper.css = wrapper.htmlCss;
+
+		// This is specific for HTML within SVG
+		if (renderer.isSVG) {
+			wrapper.add = function (svgGroupWrapper) {
+
+				var htmlGroup,
+					container = renderer.box.parentNode,
+					parentGroup,
+					parents = [];
+
+				// Create a mock group to hold the HTML elements
+				if (svgGroupWrapper) {
+					htmlGroup = svgGroupWrapper.div;
+					if (!htmlGroup) {
+
+						// Read the parent chain into an array and read from top down
+						parentGroup = svgGroupWrapper;
+						while (parentGroup) {
+
+							parents.push(parentGroup);
+
+							// Move up to the next parent group
+							parentGroup = parentGroup.parentGroup;
+						}
+
+						// Ensure dynamically updating position when any parent is translated
+						each(parents.reverse(), function (parentGroup) {
+							var htmlGroupStyle;
+
+							// Create a HTML div and append it to the parent div to emulate
+							// the SVG group structure
+							htmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, {
+								className: attr(parentGroup.element, 'class')
+							}, {
+								position: ABSOLUTE,
+								left: (parentGroup.translateX || 0) + PX,
+								top: (parentGroup.translateY || 0) + PX
+							}, htmlGroup || container); // the top group is appended to container
+
+							// Shortcut
+							htmlGroupStyle = htmlGroup.style;
+
+							// Set listeners to update the HTML div's position whenever the SVG group
+							// position is changed
+							extend(parentGroup.attrSetters, {
+								translateX: function (value) {
+									htmlGroupStyle.left = value + PX;
+								},
+								translateY: function (value) {
+									htmlGroupStyle.top = value + PX;
+								},
+								visibility: function (value, key) {
+									htmlGroupStyle[key] = value;
+								}
+							});
+						});
+
+					}
+				} else {
+					htmlGroup = container;
+				}
+
+				htmlGroup.appendChild(element);
+
+				// Shared with VML:
+				wrapper.added = true;
+				if (wrapper.alignOnAdd) {
+					wrapper.htmlUpdateTransform();
+				}
+
+				return wrapper;
+			};
+		}
+		return wrapper;
+	},
+
+	/**
+	 * Utility to return the baseline offset and total line height from the font size
+	 */
+	fontMetrics: function (fontSize) {
+		fontSize = pInt(fontSize || 11);
+
+		// Empirical values found by comparing font size and bounding box height.
+		// Applies to the default font family. http://jsfiddle.net/highcharts/7xvn7/
+		var lineHeight = fontSize < 24 ? fontSize + 4 : mathRound(fontSize * 1.2),
+			baseline = mathRound(lineHeight * 0.8);
+
+		return {
+			h: lineHeight,
+			b: baseline
+		};
+	},
+
+	/**
+	 * Add a label, a text item that can hold a colored or gradient background
+	 * as well as a border and shadow.
+	 * @param {string} str
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {String} shape
+	 * @param {Number} anchorX In case the shape has a pointer, like a flag, this is the
+	 *    coordinates it should be pinned to
+	 * @param {Number} anchorY
+	 * @param {Boolean} baseline Whether to position the label relative to the text baseline,
+	 *    like renderer.text, or to the upper border of the rectangle.
+	 * @param {String} className Class name for the group
+	 */
+	label: function (str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {
+
+		var renderer = this,
+			wrapper = renderer.g(className),
+			text = renderer.text('', 0, 0, useHTML)
+				.attr({
+					zIndex: 1
+				}),
+				//.add(wrapper),
+			box,
+			bBox,
+			alignFactor = 0,
+			padding = 3,
+			paddingLeft = 0,
+			width,
+			height,
+			wrapperX,
+			wrapperY,
+			crispAdjust = 0,
+			deferredAttr = {},
+			baselineOffset,
+			attrSetters = wrapper.attrSetters,
+			needsBox;
+
+		/**
+		 * This function runs after the label is added to the DOM (when the bounding box is
+		 * available), and after the text of the label is updated to detect the new bounding
+		 * box and reflect it in the border box.
+		 */
+		function updateBoxSize() {
+			var boxX,
+				boxY,
+				style = text.element.style;
+
+			bBox = (width === undefined || height === undefined || wrapper.styles.textAlign) &&
+				text.getBBox();
+			wrapper.width = (width || bBox.width || 0) + 2 * padding + paddingLeft;
+			wrapper.height = (height || bBox.height || 0) + 2 * padding;
+
+			// update the label-scoped y offset
+			baselineOffset = padding + renderer.fontMetrics(style && style.fontSize).b;
+
+			if (needsBox) {
+
+				// create the border box if it is not already present
+				if (!box) {
+					boxX = mathRound(-alignFactor * padding);
+					boxY = baseline ? -baselineOffset : 0;
+
+					wrapper.box = box = shape ?
+						renderer.symbol(shape, boxX, boxY, wrapper.width, wrapper.height) :
+						renderer.rect(boxX, boxY, wrapper.width, wrapper.height, 0, deferredAttr[STROKE_WIDTH]);
+					box.add(wrapper);
+				}
+
+				// apply the box attributes
+				if (!box.isImg) { // #1630
+					box.attr(merge({
+						width: wrapper.width,
+						height: wrapper.height
+					}, deferredAttr));
+				}
+				deferredAttr = null;
+			}
+		}
+
+		/**
+		 * This function runs after setting text or padding, but only if padding is changed
+		 */
+		function updateTextPadding() {
+			var styles = wrapper.styles,
+				textAlign = styles && styles.textAlign,
+				x = paddingLeft + padding * (1 - alignFactor),
+				y;
+
+			// determin y based on the baseline
+			y = baseline ? 0 : baselineOffset;
+
+			// compensate for alignment
+			if (defined(width) && (textAlign === 'center' || textAlign === 'right')) {
+				x += { center: 0.5, right: 1 }[textAlign] * (width - bBox.width);
+			}
+
+			// update if anything changed
+			if (x !== text.x || y !== text.y) {
+				text.attr({
+					x: x,
+					y: y
+				});
+			}
+
+			// record current values
+			text.x = x;
+			text.y = y;
+		}
+
+		/**
+		 * Set a box attribute, or defer it if the box is not yet created
+		 * @param {Object} key
+		 * @param {Object} value
+		 */
+		function boxAttr(key, value) {
+			if (box) {
+				box.attr(key, value);
+			} else {
+				deferredAttr[key] = value;
+			}
+		}
+
+		function getSizeAfterAdd() {
+			text.add(wrapper);
+			wrapper.attr({
+				text: str, // alignment is available now
+				x: x,
+				y: y
+			});
+
+			if (box && defined(anchorX)) {
+				wrapper.attr({
+					anchorX: anchorX,
+					anchorY: anchorY
+				});
+			}
+		}
+
+		/**
+		 * After the text element is added, get the desired size of the border box
+		 * and add it before the text in the DOM.
+		 */
+		addEvent(wrapper, 'add', getSizeAfterAdd);
+
+		/*
+		 * Add specific attribute setters.
+		 */
+
+		// only change local variables
+		attrSetters.width = function (value) {
+			width = value;
+			return false;
+		};
+		attrSetters.height = function (value) {
+			height = value;
+			return false;
+		};
+		attrSetters.padding =  function (value) {
+			if (defined(value) && value !== padding) {
+				padding = value;
+				updateTextPadding();
+			}
+			return false;
+		};
+		attrSetters.paddingLeft =  function (value) {
+			if (defined(value) && value !== paddingLeft) {
+				paddingLeft = value;
+				updateTextPadding();
+			}
+			return false;
+		};
+
+
+		// change local variable and set attribue as well
+		attrSetters.align = function (value) {
+			alignFactor = { left: 0, center: 0.5, right: 1 }[value];
+			return false; // prevent setting text-anchor on the group
+		};
+
+		// apply these to the box and the text alike
+		attrSetters.text = function (value, key) {
+			text.attr(key, value);
+			updateBoxSize();
+			updateTextPadding();
+			return false;
+		};
+
+		// apply these to the box but not to the text
+		attrSetters[STROKE_WIDTH] = function (value, key) {
+			needsBox = true;
+			crispAdjust = value % 2 / 2;
+			boxAttr(key, value);
+			return false;
+		};
+		attrSetters.stroke = attrSetters.fill = attrSetters.r = function (value, key) {
+			if (key === 'fill') {
+				needsBox = true;
+			}
+			boxAttr(key, value);
+			return false;
+		};
+		attrSetters.anchorX = function (value, key) {
+			anchorX = value;
+			boxAttr(key, value + crispAdjust - wrapperX);
+			return false;
+		};
+		attrSetters.anchorY = function (value, key) {
+			anchorY = value;
+			boxAttr(key, value - wrapperY);
+			return false;
+		};
+
+		// rename attributes
+		attrSetters.x = function (value) {
+			wrapper.x = value; // for animation getter
+			value -= alignFactor * ((width || bBox.width) + padding);
+			wrapperX = mathRound(value);
+
+			wrapper.attr('translateX', wrapperX);
+			return false;
+		};
+		attrSetters.y = function (value) {
+			wrapperY = wrapper.y = mathRound(value);
+			wrapper.attr('translateY', wrapperY);
+			return false;
+		};
+
+		// Redirect certain methods to either the box or the text
+		var baseCss = wrapper.css;
+		return extend(wrapper, {
+			/**
+			 * Pick up some properties and apply them to the text instead of the wrapper
+			 */
+			css: function (styles) {
+				if (styles) {
+					var textStyles = {};
+					styles = merge(styles); // create a copy to avoid altering the original object (#537)
+					each(['fontSize', 'fontWeight', 'fontFamily', 'color', 'lineHeight', 'width', 'textDecoration', 'textShadow'], function (prop) {
+						if (styles[prop] !== UNDEFINED) {
+							textStyles[prop] = styles[prop];
+							delete styles[prop];
+						}
+					});
+					text.css(textStyles);
+				}
+				return baseCss.call(wrapper, styles);
+			},
+			/**
+			 * Return the bounding box of the box, not the group
+			 */
+			getBBox: function () {
+				return {
+					width: bBox.width + 2 * padding,
+					height: bBox.height + 2 * padding,
+					x: bBox.x - padding,
+					y: bBox.y - padding
+				};
+			},
+			/**
+			 * Apply the shadow to the box
+			 */
+			shadow: function (b) {
+				if (box) {
+					box.shadow(b);
+				}
+				return wrapper;
+			},
+			/**
+			 * Destroy and release memory.
+			 */
+			destroy: function () {
+				removeEvent(wrapper, 'add', getSizeAfterAdd);
+
+				// Added by button implementation
+				removeEvent(wrapper.element, 'mouseenter');
+				removeEvent(wrapper.element, 'mouseleave');
+
+				if (text) {
+					text = text.destroy();
+				}
+				if (box) {
+					box = box.destroy();
+				}
+				// Call base implementation to destroy the rest
+				SVGElement.prototype.destroy.call(wrapper);
+
+				// Release local pointers (#1298)
+				wrapper = renderer = updateBoxSize = updateTextPadding = boxAttr = getSizeAfterAdd = null;
+			}
+		});
+	}
+}; // end SVGRenderer
+
+
+// general renderer
+Renderer = SVGRenderer;
+
+
+/* ****************************************************************************
+ *                                                                            *
+ * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE                              *
+ *                                                                            *
+ * For applications and websites that don't need IE support, like platform    *
+ * targeted mobile apps and web apps, this code can be removed.               *
+ *                                                                            *
+ *****************************************************************************/
+
+/**
+ * @constructor
+ */
+var VMLRenderer, VMLElement;
+if (!hasSVG && !useCanVG) {
+
+/**
+ * The VML element wrapper.
+ */
+Highcharts.VMLElement = VMLElement = {
+
+	/**
+	 * Initialize a new VML element wrapper. It builds the markup as a string
+	 * to minimize DOM traffic.
+	 * @param {Object} renderer
+	 * @param {Object} nodeName
+	 */
+	init: function (renderer, nodeName) {
+		var wrapper = this,
+			markup =  ['<', nodeName, ' filled="f" stroked="f"'],
+			style = ['position: ', ABSOLUTE, ';'],
+			isDiv = nodeName === DIV;
+
+		// divs and shapes need size
+		if (nodeName === 'shape' || isDiv) {
+			style.push('left:0;top:0;width:1px;height:1px;');
+		}
+		style.push('visibility: ', isDiv ? HIDDEN : VISIBLE);
+
+		markup.push(' style="', style.join(''), '"/>');
+
+		// create element with default attributes and style
+		if (nodeName) {
+			markup = isDiv || nodeName === 'span' || nodeName === 'img' ?
+				markup.join('')
+				: renderer.prepVML(markup);
+			wrapper.element = createElement(markup);
+		}
+
+		wrapper.renderer = renderer;
+		wrapper.attrSetters = {};
+	},
+
+	/**
+	 * Add the node to the given parent
+	 * @param {Object} parent
+	 */
+	add: function (parent) {
+		var wrapper = this,
+			renderer = wrapper.renderer,
+			element = wrapper.element,
+			box = renderer.box,
+			inverted = parent && parent.inverted,
+
+			// get the parent node
+			parentNode = parent ?
+				parent.element || parent :
+				box;
+
+
+		// if the parent group is inverted, apply inversion on all children
+		if (inverted) { // only on groups
+			renderer.invertChild(element, parentNode);
+		}
+
+		// append it
+		parentNode.appendChild(element);
+
+		// align text after adding to be able to read offset
+		wrapper.added = true;
+		if (wrapper.alignOnAdd && !wrapper.deferUpdateTransform) {
+			wrapper.updateTransform();
+		}
+
+		// fire an event for internal hooks
+		fireEvent(wrapper, 'add');
+
+		return wrapper;
+	},
+
+	/**
+	 * VML always uses htmlUpdateTransform
+	 */
+	updateTransform: SVGElement.prototype.htmlUpdateTransform,
+
+	/**
+	 * Set the rotation of a span with oldIE's filter
+	 */
+	setSpanRotation: function (rotation, sintheta, costheta) {
+		// Adjust for alignment and rotation. Rotation of useHTML content is not yet implemented
+		// but it can probably be implemented for Firefox 3.5+ on user request. FF3.5+
+		// has support for CSS3 transform. The getBBox method also needs to be updated
+		// to compensate for the rotation, like it currently does for SVG.
+		// Test case: http://highcharts.com/tests/?file=text-rotation
+		css(this.element, {
+			filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta,
+				', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta,
+				', sizingMethod=\'auto expand\')'].join('') : NONE
+		});
+	},
+
+	/**
+	 * Converts a subset of an SVG path definition to its VML counterpart. Takes an array
+	 * as the parameter and returns a string.
+	 */
+	pathToVML: function (value) {
+		// convert paths
+		var i = value.length,
+			path = [],
+			clockwise;
+
+		while (i--) {
+
+			// Multiply by 10 to allow subpixel precision.
+			// Substracting half a pixel seems to make the coordinates
+			// align with SVG, but this hasn't been tested thoroughly
+			if (isNumber(value[i])) {
+				path[i] = mathRound(value[i] * 10) - 5;
+			} else if (value[i] === 'Z') { // close the path
+				path[i] = 'x';
+			} else {
+				path[i] = value[i];
+
+				// When the start X and end X coordinates of an arc are too close,
+				// they are rounded to the same value above. In this case, substract 1 from the end X
+				// position. #760, #1371.
+				if (value.isArc && (value[i] === 'wa' || value[i] === 'at')) {
+					clockwise = value[i] === 'wa' ? 1 : -1; // #1642
+					if (path[i + 5] === path[i + 7]) {
+						path[i + 7] -= clockwise;
+					}
+					// Start and end Y (#1410)
+					if (path[i + 6] === path[i + 8]) {
+						path[i + 8] -= clockwise;
+					}
+				}
+			}
+		}
+		// Loop up again to handle path shortcuts (#2132)
+		/*while (i++ < path.length) {
+			if (path[i] === 'H') { // horizontal line to
+				path[i] = 'L';
+				path.splice(i + 2, 0, path[i - 1]);
+			} else if (path[i] === 'V') { // vertical line to
+				path[i] = 'L';
+				path.splice(i + 1, 0, path[i - 2]);
+			}
+		}*/
+		return path.join(' ') || 'x';
+	},
+
+	/**
+	 * Get or set attributes
+	 */
+	attr: function (hash, val) {
+		var wrapper = this,
+			key,
+			value,
+			i,
+			result,
+			element = wrapper.element || {},
+			elemStyle = element.style,
+			nodeName = element.nodeName,
+			renderer = wrapper.renderer,
+			symbolName = wrapper.symbolName,
+			hasSetSymbolSize,
+			shadows = wrapper.shadows,
+			skipAttr,
+			attrSetters = wrapper.attrSetters,
+			ret = wrapper;
+
+		// single key-value pair
+		if (isString(hash) && defined(val)) {
+			key = hash;
+			hash = {};
+			hash[key] = val;
+		}
+
+		// used as a getter, val is undefined
+		if (isString(hash)) {
+			key = hash;
+			if (key === 'strokeWidth' || key === 'stroke-width') {
+				ret = wrapper.strokeweight;
+			} else {
+				ret = wrapper[key];
+			}
+
+		// setter
+		} else {
+			for (key in hash) {
+				value = hash[key];
+				skipAttr = false;
+
+				// check for a specific attribute setter
+				result = attrSetters[key] && attrSetters[key].call(wrapper, value, key);
+
+				if (result !== false && value !== null) { // #620
+
+					if (result !== UNDEFINED) {
+						value = result; // the attribute setter has returned a new value to set
+					}
+
+
+					// prepare paths
+					// symbols
+					if (symbolName && /^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(key)) {
+						// if one of the symbol size affecting parameters are changed,
+						// check all the others only once for each call to an element's
+						// .attr() method
+						if (!hasSetSymbolSize) {
+							wrapper.symbolAttr(hash);
+
+							hasSetSymbolSize = true;
+						}
+						skipAttr = true;
+
+					} else if (key === 'd') {
+						value = value || [];
+						wrapper.d = value.join(' '); // used in getter for animation
+
+						element.path = value = wrapper.pathToVML(value);
+
+						// update shadows
+						if (shadows) {
+							i = shadows.length;
+							while (i--) {
+								shadows[i].path = shadows[i].cutOff ? this.cutOffPath(value, shadows[i].cutOff) : value;
+							}
+						}
+						skipAttr = true;
+
+					// handle visibility
+					} else if (key === 'visibility') {
+
+						// let the shadow follow the main element
+						if (shadows) {
+							i = shadows.length;
+							while (i--) {
+								shadows[i].style[key] = value;
+							}
+						}
+
+						// Instead of toggling the visibility CSS property, move the div out of the viewport.
+						// This works around #61 and #586
+						if (nodeName === 'DIV') {
+							value = value === HIDDEN ? '-999em' : 0;
+
+							// In order to redraw, IE7 needs the div to be visible when tucked away
+							// outside the viewport. So the visibility is actually opposite of
+							// the expected value. This applies to the tooltip only.
+							if (!docMode8) {
+								elemStyle[key] = value ? VISIBLE : HIDDEN;
+							}
+							key = 'top';
+						}
+						elemStyle[key] = value;
+						skipAttr = true;
+
+					// directly mapped to css
+					} else if (key === 'zIndex') {
+
+						if (value) {
+							elemStyle[key] = value;
+						}
+						skipAttr = true;
+
+					// x, y, width, height
+					} else if (inArray(key, ['x', 'y', 'width', 'height']) !== -1) {
+
+						wrapper[key] = value; // used in getter
+
+						if (key === 'x' || key === 'y') {
+							key = { x: 'left', y: 'top' }[key];
+						} else {
+							value = mathMax(0, value); // don't set width or height below zero (#311)
+						}
+
+						// clipping rectangle special
+						if (wrapper.updateClipping) {
+							wrapper[key] = value; // the key is now 'left' or 'top' for 'x' and 'y'
+							wrapper.updateClipping();
+						} else {
+							// normal
+							elemStyle[key] = value;
+						}
+
+						skipAttr = true;
+
+					// class name
+					} else if (key === 'class' && nodeName === 'DIV') {
+						// IE8 Standards mode has problems retrieving the className
+						element.className = value;
+
+					// stroke
+					} else if (key === 'stroke') {
+
+						value = renderer.color(value, element, key);
+
+						key = 'strokecolor';
+
+					// stroke width
+					} else if (key === 'stroke-width' || key === 'strokeWidth') {
+						element.stroked = value ? true : false;
+						key = 'strokeweight';
+						wrapper[key] = value; // used in getter, issue #113
+						if (isNumber(value)) {
+							value += PX;
+						}
+
+					// dashStyle
+					} else if (key === 'dashstyle') {
+						var strokeElem = element.getElementsByTagName('stroke')[0] ||
+							createElement(renderer.prepVML(['<stroke/>']), null, null, element);
+						strokeElem[key] = value || 'solid';
+						wrapper.dashstyle = value; /* because changing stroke-width will change the dash length
+							and cause an epileptic effect */
+						skipAttr = true;
+
+					// fill
+					} else if (key === 'fill') {
+
+						if (nodeName === 'SPAN') { // text color
+							elemStyle.color = value;
+						} else if (nodeName !== 'IMG') { // #1336
+							element.filled = value !== NONE ? true : false;
+
+							value = renderer.color(value, element, key, wrapper);
+
+							key = 'fillcolor';
+						}
+
+					// opacity: don't bother - animation is too slow and filters introduce artifacts
+					} else if (key === 'opacity') {
+						/*css(element, {
+							opacity: value
+						});*/
+						skipAttr = true;
+
+					// rotation on VML elements
+					} else if (nodeName === 'shape' && key === 'rotation') {
+
+						wrapper[key] = element.style[key] = value; // style is for #1873
+
+						// Correction for the 1x1 size of the shape container. Used in gauge needles.
+						element.style.left = -mathRound(mathSin(value * deg2rad) + 1) + PX;
+						element.style.top = mathRound(mathCos(value * deg2rad)) + PX;
+
+					// translation for animation
+					} else if (key === 'translateX' || key === 'translateY' || key === 'rotation') {
+						wrapper[key] = value;
+						wrapper.updateTransform();
+
+						skipAttr = true;
+
+					// text for rotated and non-rotated elements
+					} else if (key === 'text') {
+						this.bBox = null;
+						element.innerHTML = value;
+						skipAttr = true;
+					}
+
+
+					if (!skipAttr) {
+						if (docMode8) { // IE8 setAttribute bug
+							element[key] = value;
+						} else {
+							attr(element, key, value);
+						}
+					}
+
+				}
+			}
+		}
+		return ret;
+	},
+
+	/**
+	 * Set the element's clipping to a predefined rectangle
+	 *
+	 * @param {String} id The id of the clip rectangle
+	 */
+	clip: function (clipRect) {
+		var wrapper = this,
+			clipMembers,
+			cssRet;
+
+		if (clipRect) {
+			clipMembers = clipRect.members;
+			erase(clipMembers, wrapper); // Ensure unique list of elements (#1258)
+			clipMembers.push(wrapper);
+			wrapper.destroyClip = function () {
+				erase(clipMembers, wrapper);
+			};
+			cssRet = clipRect.getCSS(wrapper);
+
+		} else {
+			if (wrapper.destroyClip) {
+				wrapper.destroyClip();
+			}
+			cssRet = { clip: docMode8 ? 'inherit' : 'rect(auto)' }; // #1214
+		}
+
+		return wrapper.css(cssRet);
+
+	},
+
+	/**
+	 * Set styles for the element
+	 * @param {Object} styles
+	 */
+	css: SVGElement.prototype.htmlCss,
+
+	/**
+	 * Removes a child either by removeChild or move to garbageBin.
+	 * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.
+	 */
+	safeRemoveChild: function (element) {
+		// discardElement will detach the node from its parent before attaching it
+		// to the garbage bin. Therefore it is important that the node is attached and have parent.
+		if (element.parentNode) {
+			discardElement(element);
+		}
+	},
+
+	/**
+	 * Extend element.destroy by removing it from the clip members array
+	 */
+	destroy: function () {
+		if (this.destroyClip) {
+			this.destroyClip();
+		}
+
+		return SVGElement.prototype.destroy.apply(this);
+	},
+
+	/**
+	 * Add an event listener. VML override for normalizing event parameters.
+	 * @param {String} eventType
+	 * @param {Function} handler
+	 */
+	on: function (eventType, handler) {
+		// simplest possible event model for internal use
+		this.element['on' + eventType] = function () {
+			var evt = win.event;
+			evt.target = evt.srcElement;
+			handler(evt);
+		};
+		return this;
+	},
+
+	/**
+	 * In stacked columns, cut off the shadows so that they don't overlap
+	 */
+	cutOffPath: function (path, length) {
+
+		var len;
+
+		path = path.split(/[ ,]/);
+		len = path.length;
+
+		if (len === 9 || len === 11) {
+			path[len - 4] = path[len - 2] = pInt(path[len - 2]) - 10 * length;
+		}
+		return path.join(' ');
+	},
+
+	/**
+	 * Apply a drop shadow by copying elements and giving them different strokes
+	 * @param {Boolean|Object} shadowOptions
+	 */
+	shadow: function (shadowOptions, group, cutOff) {
+		var shadows = [],
+			i,
+			element = this.element,
+			renderer = this.renderer,
+			shadow,
+			elemStyle = element.style,
+			markup,
+			path = element.path,
+			strokeWidth,
+			modifiedPath,
+			shadowWidth,
+			shadowElementOpacity;
+
+		// some times empty paths are not strings
+		if (path && typeof path.value !== 'string') {
+			path = 'x';
+		}
+		modifiedPath = path;
+
+		if (shadowOptions) {
+			shadowWidth = pick(shadowOptions.width, 3);
+			shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;
+			for (i = 1; i <= 3; i++) {
+
+				strokeWidth = (shadowWidth * 2) + 1 - (2 * i);
+
+				// Cut off shadows for stacked column items
+				if (cutOff) {
+					modifiedPath = this.cutOffPath(path.value, strokeWidth + 0.5);
+				}
+
+				markup = ['<shape isShadow="true" strokeweight="', strokeWidth,
+					'" filled="false" path="', modifiedPath,
+					'" coordsize="10 10" style="', element.style.cssText, '" />'];
+
+				shadow = createElement(renderer.prepVML(markup),
+					null, {
+						left: pInt(elemStyle.left) + pick(shadowOptions.offsetX, 1),
+						top: pInt(elemStyle.top) + pick(shadowOptions.offsetY, 1)
+					}
+				);
+				if (cutOff) {
+					shadow.cutOff = strokeWidth + 1;
+				}
+
+				// apply the opacity
+				markup = ['<stroke color="', shadowOptions.color || 'black', '" opacity="', shadowElementOpacity * i, '"/>'];
+				createElement(renderer.prepVML(markup), null, null, shadow);
+
+
+				// insert it
+				if (group) {
+					group.element.appendChild(shadow);
+				} else {
+					element.parentNode.insertBefore(shadow, element);
+				}
+
+				// record it
+				shadows.push(shadow);
+
+			}
+
+			this.shadows = shadows;
+		}
+		return this;
+
+	}
+};
+VMLElement = extendClass(SVGElement, VMLElement);
+
+/**
+ * The VML renderer
+ */
+var VMLRendererExtension = { // inherit SVGRenderer
+
+	Element: VMLElement,
+	isIE8: userAgent.indexOf('MSIE 8.0') > -1,
+
+
+	/**
+	 * Initialize the VMLRenderer
+	 * @param {Object} container
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	init: function (container, width, height) {
+		var renderer = this,
+			boxWrapper,
+			box;
+
+		renderer.alignedObjects = [];
+
+		boxWrapper = renderer.createElement(DIV);
+		box = boxWrapper.element;
+		box.style.position = RELATIVE; // for freeform drawing using renderer directly
+		container.appendChild(boxWrapper.element);
+
+
+		// generate the containing box
+		renderer.isVML = true;
+		renderer.box = box;
+		renderer.boxWrapper = boxWrapper;
+
+
+		renderer.setSize(width, height, false);
+
+		// The only way to make IE6 and IE7 print is to use a global namespace. However,
+		// with IE8 the only way to make the dynamic shapes visible in screen and print mode
+		// seems to be to add the xmlns attribute and the behaviour style inline.
+		if (!doc.namespaces.hcv) {
+
+			doc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml');
+
+			// Setup default CSS (#2153)
+			(doc.styleSheets.length ? doc.styleSheets[0] : doc.createStyleSheet()).cssText +=
+				'hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke' +
+				'{ behavior:url(#default#VML); display: inline-block; } ';
+
+		}
+	},
+
+
+	/**
+	 * Detect whether the renderer is hidden. This happens when one of the parent elements
+	 * has display: none
+	 */
+	isHidden: function () {
+		return !this.box.offsetWidth;
+	},
+
+	/**
+	 * Define a clipping rectangle. In VML it is accomplished by storing the values
+	 * for setting the CSS style to all associated members.
+	 *
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	clipRect: function (x, y, width, height) {
+
+		// create a dummy element
+		var clipRect = this.createElement(),
+			isObj = isObject(x);
+
+		// mimic a rectangle with its style object for automatic updating in attr
+		return extend(clipRect, {
+			members: [],
+			left: (isObj ? x.x : x) + 1,
+			top: (isObj ? x.y : y) + 1,
+			width: (isObj ? x.width : width) - 1,
+			height: (isObj ? x.height : height) - 1,
+			getCSS: function (wrapper) {
+				var element = wrapper.element,
+					nodeName = element.nodeName,
+					isShape = nodeName === 'shape',
+					inverted = wrapper.inverted,
+					rect = this,
+					top = rect.top - (isShape ? element.offsetTop : 0),
+					left = rect.left,
+					right = left + rect.width,
+					bottom = top + rect.height,
+					ret = {
+						clip: 'rect(' +
+							mathRound(inverted ? left : top) + 'px,' +
+							mathRound(inverted ? bottom : right) + 'px,' +
+							mathRound(inverted ? right : bottom) + 'px,' +
+							mathRound(inverted ? top : left) + 'px)'
+					};
+
+				// issue 74 workaround
+				if (!inverted && docMode8 && nodeName === 'DIV') {
+					extend(ret, {
+						width: right + PX,
+						height: bottom + PX
+					});
+				}
+				return ret;
+			},
+
+			// used in attr and animation to update the clipping of all members
+			updateClipping: function () {
+				each(clipRect.members, function (member) {
+					member.css(clipRect.getCSS(member));
+				});
+			}
+		});
+
+	},
+
+
+	/**
+	 * Take a color and return it if it's a string, make it a gradient if it's a
+	 * gradient configuration object, and apply opacity.
+	 *
+	 * @param {Object} color The color or config object
+	 */
+	color: function (color, elem, prop, wrapper) {
+		var renderer = this,
+			colorObject,
+			regexRgba = /^rgba/,
+			markup,
+			fillType,
+			ret = NONE;
+
+		// Check for linear or radial gradient
+		if (color && color.linearGradient) {
+			fillType = 'gradient';
+		} else if (color && color.radialGradient) {
+			fillType = 'pattern';
+		}
+
+
+		if (fillType) {
+
+			var stopColor,
+				stopOpacity,
+				gradient = color.linearGradient || color.radialGradient,
+				x1,
+				y1,
+				x2,
+				y2,
+				opacity1,
+				opacity2,
+				color1,
+				color2,
+				fillAttr = '',
+				stops = color.stops,
+				firstStop,
+				lastStop,
+				colors = [],
+				addFillNode = function () {
+					// Add the fill subnode. When colors attribute is used, the meanings of opacity and o:opacity2
+					// are reversed.
+					markup = ['<fill colors="' + colors.join(',') + '" opacity="', opacity2, '" o:opacity2="', opacity1,
+						'" type="', fillType, '" ', fillAttr, 'focus="100%" method="any" />'];
+					createElement(renderer.prepVML(markup), null, null, elem);
+				};
+
+			// Extend from 0 to 1
+			firstStop = stops[0];
+			lastStop = stops[stops.length - 1];
+			if (firstStop[0] > 0) {
+				stops.unshift([
+					0,
+					firstStop[1]
+				]);
+			}
+			if (lastStop[0] < 1) {
+				stops.push([
+					1,
+					lastStop[1]
+				]);
+			}
+
+			// Compute the stops
+			each(stops, function (stop, i) {
+				if (regexRgba.test(stop[1])) {
+					colorObject = Color(stop[1]);
+					stopColor = colorObject.get('rgb');
+					stopOpacity = colorObject.get('a');
+				} else {
+					stopColor = stop[1];
+					stopOpacity = 1;
+				}
+
+				// Build the color attribute
+				colors.push((stop[0] * 100) + '% ' + stopColor);
+
+				// Only start and end opacities are allowed, so we use the first and the last
+				if (!i) {
+					opacity1 = stopOpacity;
+					color2 = stopColor;
+				} else {
+					opacity2 = stopOpacity;
+					color1 = stopColor;
+				}
+			});
+
+			// Apply the gradient to fills only.
+			if (prop === 'fill') {
+
+				// Handle linear gradient angle
+				if (fillType === 'gradient') {
+					x1 = gradient.x1 || gradient[0] || 0;
+					y1 = gradient.y1 || gradient[1] || 0;
+					x2 = gradient.x2 || gradient[2] || 0;
+					y2 = gradient.y2 || gradient[3] || 0;
+					fillAttr = 'angle="' + (90  - math.atan(
+						(y2 - y1) / // y vector
+						(x2 - x1) // x vector
+						) * 180 / mathPI) + '"';
+
+					addFillNode();
+
+				// Radial (circular) gradient
+				} else {
+
+					var r = gradient.r,
+						sizex = r * 2,
+						sizey = r * 2,
+						cx = gradient.cx,
+						cy = gradient.cy,
+						radialReference = elem.radialReference,
+						bBox,
+						applyRadialGradient = function () {
+							if (radialReference) {
+								bBox = wrapper.getBBox();
+								cx += (radialReference[0] - bBox.x) / bBox.width - 0.5;
+								cy += (radialReference[1] - bBox.y) / bBox.height - 0.5;
+								sizex *= radialReference[2] / bBox.width;
+								sizey *= radialReference[2] / bBox.height;
+							}
+							fillAttr = 'src="' + defaultOptions.global.VMLRadialGradientURL + '" ' +
+								'size="' + sizex + ',' + sizey + '" ' +
+								'origin="0.5,0.5" ' +
+								'position="' + cx + ',' + cy + '" ' +
+								'color2="' + color2 + '" ';
+
+							addFillNode();
+						};
+
+					// Apply radial gradient
+					if (wrapper.added) {
+						applyRadialGradient();
+					} else {
+						// We need to know the bounding box to get the size and position right
+						addEvent(wrapper, 'add', applyRadialGradient);
+					}
+
+					// The fill element's color attribute is broken in IE8 standards mode, so we
+					// need to set the parent shape's fillcolor attribute instead.
+					ret = color1;
+				}
+
+			// Gradients are not supported for VML stroke, return the first color. #722.
+			} else {
+				ret = stopColor;
+			}
+
+		// if the color is an rgba color, split it and add a fill node
+		// to hold the opacity component
+		} else if (regexRgba.test(color) && elem.tagName !== 'IMG') {
+
+			colorObject = Color(color);
+
+			markup = ['<', prop, ' opacity="', colorObject.get('a'), '"/>'];
+			createElement(this.prepVML(markup), null, null, elem);
+
+			ret = colorObject.get('rgb');
+
+
+		} else {
+			var propNodes = elem.getElementsByTagName(prop); // 'stroke' or 'fill' node
+			if (propNodes.length) {
+				propNodes[0].opacity = 1;
+				propNodes[0].type = 'solid';
+			}
+			ret = color;
+		}
+
+		return ret;
+	},
+
+	/**
+	 * Take a VML string and prepare it for either IE8 or IE6/IE7.
+	 * @param {Array} markup A string array of the VML markup to prepare
+	 */
+	prepVML: function (markup) {
+		var vmlStyle = 'display:inline-block;behavior:url(#default#VML);',
+			isIE8 = this.isIE8;
+
+		markup = markup.join('');
+
+		if (isIE8) { // add xmlns and style inline
+			markup = markup.replace('/>', ' xmlns="urn:schemas-microsoft-com:vml" />');
+			if (markup.indexOf('style="') === -1) {
+				markup = markup.replace('/>', ' style="' + vmlStyle + '" />');
+			} else {
+				markup = markup.replace('style="', 'style="' + vmlStyle);
+			}
+
+		} else { // add namespace
+			markup = markup.replace('<', '<hcv:');
+		}
+
+		return markup;
+	},
+
+	/**
+	 * Create rotated and aligned text
+	 * @param {String} str
+	 * @param {Number} x
+	 * @param {Number} y
+	 */
+	text: SVGRenderer.prototype.html,
+
+	/**
+	 * Create and return a path element
+	 * @param {Array} path
+	 */
+	path: function (path) {
+		var attr = {
+			// subpixel precision down to 0.1 (width and height = 1px)
+			coordsize: '10 10'
+		};
+		if (isArray(path)) {
+			attr.d = path;
+		} else if (isObject(path)) { // attributes
+			extend(attr, path);
+		}
+		// create the shape
+		return this.createElement('shape').attr(attr);
+	},
+
+	/**
+	 * Create and return a circle element. In VML circles are implemented as
+	 * shapes, which is faster than v:oval
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} r
+	 */
+	circle: function (x, y, r) {
+		var circle = this.symbol('circle');
+		if (isObject(x)) {
+			r = x.r;
+			y = x.y;
+			x = x.x;
+		}
+		circle.isCircle = true; // Causes x and y to mean center (#1682)
+		circle.r = r;
+		return circle.attr({ x: x, y: y });
+	},
+
+	/**
+	 * Create a group using an outer div and an inner v:group to allow rotating
+	 * and flipping. A simple v:group would have problems with positioning
+	 * child HTML elements and CSS clip.
+	 *
+	 * @param {String} name The name of the group
+	 */
+	g: function (name) {
+		var wrapper,
+			attribs;
+
+		// set the class name
+		if (name) {
+			attribs = { 'className': PREFIX + name, 'class': PREFIX + name };
+		}
+
+		// the div to hold HTML and clipping
+		wrapper = this.createElement(DIV).attr(attribs);
+
+		return wrapper;
+	},
+
+	/**
+	 * VML override to create a regular HTML image
+	 * @param {String} src
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @param {Number} width
+	 * @param {Number} height
+	 */
+	image: function (src, x, y, width, height) {
+		var obj = this.createElement('img')
+			.attr({ src: src });
+
+		if (arguments.length > 1) {
+			obj.attr({
+				x: x,
+				y: y,
+				width: width,
+				height: height
+			});
+		}
+		return obj;
+	},
+
+	/**
+	 * VML uses a shape for rect to overcome bugs and rotation problems
+	 */
+	rect: function (x, y, width, height, r, strokeWidth) {
+
+		var wrapper = this.symbol('rect');
+		wrapper.r = isObject(x) ? x.r : r;
+
+		//return wrapper.attr(wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0)));
+		return wrapper.attr(
+				isObject(x) ?
+					x :
+					// do not crispify when an object is passed in (as in column charts)
+					wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))
+			);
+	},
+
+	/**
+	 * In the VML renderer, each child of an inverted div (group) is inverted
+	 * @param {Object} element
+	 * @param {Object} parentNode
+	 */
+	invertChild: function (element, parentNode) {
+		var parentStyle = parentNode.style;
+		css(element, {
+			flip: 'x',
+			left: pInt(parentStyle.width) - 1,
+			top: pInt(parentStyle.height) - 1,
+			rotation: -90
+		});
+	},
+
+	/**
+	 * Symbol definitions that override the parent SVG renderer's symbols
+	 *
+	 */
+	symbols: {
+		// VML specific arc function
+		arc: function (x, y, w, h, options) {
+			var start = options.start,
+				end = options.end,
+				radius = options.r || w || h,
+				innerRadius = options.innerR,
+				cosStart = mathCos(start),
+				sinStart = mathSin(start),
+				cosEnd = mathCos(end),
+				sinEnd = mathSin(end),
+				ret;
+
+			if (end - start === 0) { // no angle, don't show it.
+				return ['x'];
+			}
+
+			ret = [
+				'wa', // clockwise arc to
+				x - radius, // left
+				y - radius, // top
+				x + radius, // right
+				y + radius, // bottom
+				x + radius * cosStart, // start x
+				y + radius * sinStart, // start y
+				x + radius * cosEnd, // end x
+				y + radius * sinEnd  // end y
+			];
+
+			if (options.open && !innerRadius) {
+				ret.push(
+					'e',
+					M,
+					x,// - innerRadius,
+					y// - innerRadius
+				);
+			}
+
+			ret.push(
+				'at', // anti clockwise arc to
+				x - innerRadius, // left
+				y - innerRadius, // top
+				x + innerRadius, // right
+				y + innerRadius, // bottom
+				x + innerRadius * cosEnd, // start x
+				y + innerRadius * sinEnd, // start y
+				x + innerRadius * cosStart, // end x
+				y + innerRadius * sinStart, // end y
+				'x', // finish path
+				'e' // close
+			);
+
+			ret.isArc = true;
+			return ret;
+
+		},
+		// Add circle symbol path. This performs significantly faster than v:oval.
+		circle: function (x, y, w, h, wrapper) {
+
+			if (wrapper) {
+				w = h = 2 * wrapper.r;
+			}
+
+			// Center correction, #1682
+			if (wrapper && wrapper.isCircle) {
+				x -= w / 2;
+				y -= h / 2;
+			}
+
+			// Return the path
+			return [
+				'wa', // clockwisearcto
+				x, // left
+				y, // top
+				x + w, // right
+				y + h, // bottom
+				x + w, // start x
+				y + h / 2,     // start y
+				x + w, // end x
+				y + h / 2,     // end y
+				//'x', // finish path
+				'e' // close
+			];
+		},
+		/**
+		 * Add rectangle symbol path which eases rotation and omits arcsize problems
+		 * compared to the built-in VML roundrect shape
+		 *
+		 * @param {Number} left Left position
+		 * @param {Number} top Top position
+		 * @param {Number} r Border radius
+		 * @param {Object} options Width and height
+		 */
+
+		rect: function (left, top, width, height, options) {
+
+			var right = left + width,
+				bottom = top + height,
+				ret,
+				r;
+
+			// No radius, return the more lightweight square
+			if (!defined(options) || !options.r) {
+				ret = SVGRenderer.prototype.symbols.square.apply(0, arguments);
+
+			// Has radius add arcs for the corners
+			} else {
+
+				r = mathMin(options.r, width, height);
+				ret = [
+					M,
+					left + r, top,
+
+					L,
+					right - r, top,
+					'wa',
+					right - 2 * r, top,
+					right, top + 2 * r,
+					right - r, top,
+					right, top + r,
+
+					L,
+					right, bottom - r,
+					'wa',
+					right - 2 * r, bottom - 2 * r,
+					right, bottom,
+					right, bottom - r,
+					right - r, bottom,
+
+					L,
+					left + r, bottom,
+					'wa',
+					left, bottom - 2 * r,
+					left + 2 * r, bottom,
+					left + r, bottom,
+					left, bottom - r,
+
+					L,
+					left, top + r,
+					'wa',
+					left, top,
+					left + 2 * r, top + 2 * r,
+					left, top + r,
+					left + r, top,
+
+
+					'x',
+					'e'
+				];
+			}
+			return ret;
+		}
+	}
+};
+Highcharts.VMLRenderer = VMLRenderer = function () {
+	this.init.apply(this, arguments);
+};
+VMLRenderer.prototype = merge(SVGRenderer.prototype, VMLRendererExtension);
+
+	// general renderer
+	Renderer = VMLRenderer;
+}
+
+/* ****************************************************************************
+ *                                                                            *
+ * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE                                *
+ *                                                                            *
+ *****************************************************************************/
+/* ****************************************************************************
+ *                                                                            *
+ * START OF ANDROID < 3 SPECIFIC CODE. THIS CAN BE REMOVED IF YOU'RE NOT      *
+ * TARGETING THAT SYSTEM.                                                     *
+ *                                                                            *
+ *****************************************************************************/
+var CanVGRenderer,
+	CanVGController;
+
+if (useCanVG) {
+	/**
+	 * The CanVGRenderer is empty from start to keep the source footprint small.
+	 * When requested, the CanVGController downloads the rest of the source packaged
+	 * together with the canvg library.
+	 */
+	Highcharts.CanVGRenderer = CanVGRenderer = function () {
+		// Override the global SVG namespace to fake SVG/HTML that accepts CSS
+		SVG_NS = 'http://www.w3.org/1999/xhtml';
+	};
+
+	/**
+	 * Start with an empty symbols object. This is needed when exporting is used (exporting.src.js will add a few symbols), but 
+	 * the implementation from SvgRenderer will not be merged in until first render.
+	 */
+	CanVGRenderer.prototype.symbols = {};
+
+	/**
+	 * Handles on demand download of canvg rendering support.
+	 */
+	CanVGController = (function () {
+		// List of renderering calls
+		var deferredRenderCalls = [];
+
+		/**
+		 * When downloaded, we are ready to draw deferred charts.
+		 */
+		function drawDeferred() {
+			var callLength = deferredRenderCalls.length,
+				callIndex;
+
+			// Draw all pending render calls
+			for (callIndex = 0; callIndex < callLength; callIndex++) {
+				deferredRenderCalls[callIndex]();
+			}
+			// Clear the list
+			deferredRenderCalls = [];
+		}
+
+		return {
+			push: function (func, scriptLocation) {
+				// Only get the script once
+				if (deferredRenderCalls.length === 0) {
+					getScript(scriptLocation, drawDeferred);
+				}
+				// Register render call
+				deferredRenderCalls.push(func);
+			}
+		};
+	}());
+
+	Renderer = CanVGRenderer;
+} // end CanVGRenderer
+
+/* ****************************************************************************
+ *                                                                            *
+ * END OF ANDROID < 3 SPECIFIC CODE                                           *
+ *                                                                            *
+ *****************************************************************************/
+
+/**
+ * The Tick class
+ */
+function Tick(axis, pos, type, noLabel) {
+	this.axis = axis;
+	this.pos = pos;
+	this.type = type || '';
+	this.isNew = true;
+
+	if (!type && !noLabel) {
+		this.addLabel();
+	}
+}
+
+Tick.prototype = {
+	/**
+	 * Write the tick label
+	 */
+	addLabel: function () {
+		var tick = this,
+			axis = tick.axis,
+			options = axis.options,
+			chart = axis.chart,
+			horiz = axis.horiz,
+			categories = axis.categories,
+			names = axis.series[0] && axis.series[0].names,
+			pos = tick.pos,
+			labelOptions = options.labels,
+			str,
+			tickPositions = axis.tickPositions,
+			width = (horiz && categories &&
+				!labelOptions.step && !labelOptions.staggerLines &&
+				!labelOptions.rotation &&
+				chart.plotWidth / tickPositions.length) ||
+				(!horiz && (chart.margin[3] || chart.chartWidth * 0.33)), // #1580, #1931
+			isFirst = pos === tickPositions[0],
+			isLast = pos === tickPositions[tickPositions.length - 1],
+			css,
+			attr,
+			value = categories ?
+				pick(categories[pos], names && names[pos], pos) : 
+				pos,
+			label = tick.label,
+			tickPositionInfo = tickPositions.info,
+			dateTimeLabelFormat;
+
+		// Set the datetime label format. If a higher rank is set for this position, use that. If not,
+		// use the general format.
+		if (axis.isDatetimeAxis && tickPositionInfo) {
+			dateTimeLabelFormat = options.dateTimeLabelFormats[tickPositionInfo.higherRanks[pos] || tickPositionInfo.unitName];
+		}
+
+		// set properties for access in render method
+		tick.isFirst = isFirst;
+		tick.isLast = isLast;
+
+		// get the string
+		str = axis.labelFormatter.call({
+			axis: axis,
+			chart: chart,
+			isFirst: isFirst,
+			isLast: isLast,
+			dateTimeLabelFormat: dateTimeLabelFormat,
+			value: axis.isLog ? correctFloat(lin2log(value)) : value
+		});
+
+		// prepare CSS
+		css = width && { width: mathMax(1, mathRound(width - 2 * (labelOptions.padding || 10))) + PX };
+		css = extend(css, labelOptions.style);
+
+		// first call
+		if (!defined(label)) {
+			attr = {
+				align: axis.labelAlign
+			};
+			if (isNumber(labelOptions.rotation)) {
+				attr.rotation = labelOptions.rotation;
+			}
+			if (width && labelOptions.ellipsis) {
+				attr._clipHeight = axis.len / tickPositions.length;
+			}
+
+			tick.label =
+				defined(str) && labelOptions.enabled ?
+					chart.renderer.text(
+							str,
+							0,
+							0,
+							labelOptions.useHTML
+						)
+						.attr(attr)
+						// without position absolute, IE export sometimes is wrong
+						.css(css)
+						.add(axis.labelGroup) :
+					null;
+
+		// update
+		} else if (label) {
+			label.attr({
+					text: str
+				})
+				.css(css);
+		}
+	},
+
+	/**
+	 * Get the offset height or width of the label
+	 */
+	getLabelSize: function () {
+		var label = this.label,
+			axis = this.axis;
+		return label ?
+			((this.labelBBox = label.getBBox()))[axis.horiz ? 'height' : 'width'] :
+			0;
+	},
+
+	/**
+	 * Find how far the labels extend to the right and left of the tick's x position. Used for anti-collision
+	 * detection with overflow logic.
+	 */
+	getLabelSides: function () {
+		var bBox = this.labelBBox, // assume getLabelSize has run at this point
+			axis = this.axis,
+			options = axis.options,
+			labelOptions = options.labels,
+			width = bBox.width,
+			leftSide = width * { left: 0, center: 0.5, right: 1 }[axis.labelAlign] - labelOptions.x;
+
+		return [-leftSide, width - leftSide];
+	},
+
+	/**
+	 * Handle the label overflow by adjusting the labels to the left and right edge, or
+	 * hide them if they collide into the neighbour label.
+	 */
+	handleOverflow: function (index, xy) {
+		var show = true,
+			axis = this.axis,
+			chart = axis.chart,
+			isFirst = this.isFirst,
+			isLast = this.isLast,
+			x = xy.x,
+			reversed = axis.reversed,
+			tickPositions = axis.tickPositions;
+
+		if (isFirst || isLast) {
+
+			var sides = this.getLabelSides(),
+				leftSide = sides[0],
+				rightSide = sides[1],
+				plotLeft = chart.plotLeft,
+				plotRight = plotLeft + axis.len,
+				neighbour = axis.ticks[tickPositions[index + (isFirst ? 1 : -1)]],
+				neighbourEdge = neighbour && neighbour.label.xy && neighbour.label.xy.x + neighbour.getLabelSides()[isFirst ? 0 : 1];
+
+			if ((isFirst && !reversed) || (isLast && reversed)) {
+				// Is the label spilling out to the left of the plot area?
+				if (x + leftSide < plotLeft) {
+
+					// Align it to plot left
+					x = plotLeft - leftSide;
+
+					// Hide it if it now overlaps the neighbour label
+					if (neighbour && x + rightSide > neighbourEdge) {
+						show = false;
+					}
+				}
+
+			} else {
+				// Is the label spilling out to the right of the plot area?
+				if (x + rightSide > plotRight) {
+
+					// Align it to plot right
+					x = plotRight - rightSide;
+
+					// Hide it if it now overlaps the neighbour label
+					if (neighbour && x + leftSide < neighbourEdge) {
+						show = false;
+					}
+
+				}
+			}
+
+			// Set the modified x position of the label
+			xy.x = x;
+		}
+		return show;
+	},
+
+	/**
+	 * Get the x and y position for ticks and labels
+	 */
+	getPosition: function (horiz, pos, tickmarkOffset, old) {
+		var axis = this.axis,
+			chart = axis.chart,
+			cHeight = (old && chart.oldChartHeight) || chart.chartHeight;
+		
+		return {
+			x: horiz ?
+				axis.translate(pos + tickmarkOffset, null, null, old) + axis.transB :
+				axis.left + axis.offset + (axis.opposite ? ((old && chart.oldChartWidth) || chart.chartWidth) - axis.right - axis.left : 0),
+
+			y: horiz ?
+				cHeight - axis.bottom + axis.offset - (axis.opposite ? axis.height : 0) :
+				cHeight - axis.translate(pos + tickmarkOffset, null, null, old) - axis.transB
+		};
+		
+	},
+	
+	/**
+	 * Get the x, y position of the tick label
+	 */
+	getLabelPosition: function (x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {
+		var axis = this.axis,
+			transA = axis.transA,
+			reversed = axis.reversed,
+			staggerLines = axis.staggerLines,
+			baseline = axis.chart.renderer.fontMetrics(labelOptions.style.fontSize).b,
+			rotation = labelOptions.rotation;
+			
+		x = x + labelOptions.x - (tickmarkOffset && horiz ?
+			tickmarkOffset * transA * (reversed ? -1 : 1) : 0);
+		y = y + labelOptions.y - (tickmarkOffset && !horiz ?
+			tickmarkOffset * transA * (reversed ? 1 : -1) : 0);
+
+		// Correct for rotation (#1764)
+		if (rotation && axis.side === 2) {
+			y -= baseline - baseline * mathCos(rotation * deg2rad);
+		}
+		
+		// Vertically centered
+		if (!defined(labelOptions.y) && !rotation) { // #1951
+			y += baseline - label.getBBox().height / 2;
+		}
+		
+		// Correct for staggered labels
+		if (staggerLines) {
+			y += (index / (step || 1) % staggerLines) * (axis.labelOffset / staggerLines);
+		}
+		
+		return {
+			x: x,
+			y: y
+		};
+	},
+	
+	/**
+	 * Extendible method to return the path of the marker
+	 */
+	getMarkPath: function (x, y, tickLength, tickWidth, horiz, renderer) {
+		return renderer.crispLine([
+				M,
+				x,
+				y,
+				L,
+				x + (horiz ? 0 : -tickLength),
+				y + (horiz ? tickLength : 0)
+			], tickWidth);
+	},
+
+	/**
+	 * Put everything in place
+	 *
+	 * @param index {Number}
+	 * @param old {Boolean} Use old coordinates to prepare an animation into new position
+	 */
+	render: function (index, old, opacity) {
+		var tick = this,
+			axis = tick.axis,
+			options = axis.options,
+			chart = axis.chart,
+			renderer = chart.renderer,
+			horiz = axis.horiz,
+			type = tick.type,
+			label = tick.label,
+			pos = tick.pos,
+			labelOptions = options.labels,
+			gridLine = tick.gridLine,
+			gridPrefix = type ? type + 'Grid' : 'grid',
+			tickPrefix = type ? type + 'Tick' : 'tick',
+			gridLineWidth = options[gridPrefix + 'LineWidth'],
+			gridLineColor = options[gridPrefix + 'LineColor'],
+			dashStyle = options[gridPrefix + 'LineDashStyle'],
+			tickLength = options[tickPrefix + 'Length'],
+			tickWidth = options[tickPrefix + 'Width'] || 0,
+			tickColor = options[tickPrefix + 'Color'],
+			tickPosition = options[tickPrefix + 'Position'],
+			gridLinePath,
+			mark = tick.mark,
+			markPath,
+			step = labelOptions.step,
+			attribs,
+			show = true,
+			tickmarkOffset = axis.tickmarkOffset,
+			xy = tick.getPosition(horiz, pos, tickmarkOffset, old),
+			x = xy.x,
+			y = xy.y,
+			reverseCrisp = ((horiz && x === axis.pos + axis.len) || (!horiz && y === axis.pos)) ? -1 : 1, // #1480, #1687
+			staggerLines = axis.staggerLines;
+
+		this.isActive = true;
+		
+		// create the grid line
+		if (gridLineWidth) {
+			gridLinePath = axis.getPlotLinePath(pos + tickmarkOffset, gridLineWidth * reverseCrisp, old, true);
+
+			if (gridLine === UNDEFINED) {
+				attribs = {
+					stroke: gridLineColor,
+					'stroke-width': gridLineWidth
+				};
+				if (dashStyle) {
+					attribs.dashstyle = dashStyle;
+				}
+				if (!type) {
+					attribs.zIndex = 1;
+				}
+				if (old) {
+					attribs.opacity = 0;
+				}
+				tick.gridLine = gridLine =
+					gridLineWidth ?
+						renderer.path(gridLinePath)
+							.attr(attribs).add(axis.gridGroup) :
+						null;
+			}
+
+			// If the parameter 'old' is set, the current call will be followed
+			// by another call, therefore do not do any animations this time
+			if (!old && gridLine && gridLinePath) {
+				gridLine[tick.isNew ? 'attr' : 'animate']({
+					d: gridLinePath,
+					opacity: opacity
+				});
+			}
+		}
+
+		// create the tick mark
+		if (tickWidth && tickLength) {
+
+			// negate the length
+			if (tickPosition === 'inside') {
+				tickLength = -tickLength;
+			}
+			if (axis.opposite) {
+				tickLength = -tickLength;
+			}
+
+			markPath = tick.getMarkPath(x, y, tickLength, tickWidth * reverseCrisp, horiz, renderer);
+
+			if (mark) { // updating
+				mark.animate({
+					d: markPath,
+					opacity: opacity
+				});
+			} else { // first time
+				tick.mark = renderer.path(
+					markPath
+				).attr({
+					stroke: tickColor,
+					'stroke-width': tickWidth,
+					opacity: opacity
+				}).add(axis.axisGroup);
+			}
+		}
+
+		// the label is created on init - now move it into place
+		if (label && !isNaN(x)) {
+			label.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);
+
+			// Apply show first and show last. If the tick is both first and last, it is 
+			// a single centered tick, in which case we show the label anyway (#2100).
+			if ((tick.isFirst && !tick.isLast && !pick(options.showFirstLabel, 1)) ||
+					(tick.isLast && !tick.isFirst && !pick(options.showLastLabel, 1))) {
+				show = false;
+
+			// Handle label overflow and show or hide accordingly
+			} else if (!staggerLines && horiz && labelOptions.overflow === 'justify' && !tick.handleOverflow(index, xy)) {
+				show = false;
+			}
+
+			// apply step
+			if (step && index % step) {
+				// show those indices dividable by step
+				show = false;
+			}
+
+			// Set the new position, and show or hide
+			if (show && !isNaN(xy.y)) {
+				xy.opacity = opacity;
+				label[tick.isNew ? 'attr' : 'animate'](xy);
+				tick.isNew = false;
+			} else {
+				label.attr('y', -9999); // #1338
+			}
+		}
+	},
+
+	/**
+	 * Destructor for the tick prototype
+	 */
+	destroy: function () {
+		destroyObjectProperties(this, this.axis);
+	}
+};
+
+/**
+ * The object wrapper for plot lines and plot bands
+ * @param {Object} options
+ */
+function PlotLineOrBand(axis, options) {
+	this.axis = axis;
+
+	if (options) {
+		this.options = options;
+		this.id = options.id;
+	}
+}
+
+PlotLineOrBand.prototype = {
+	
+	/**
+	 * Render the plot line or plot band. If it is already existing,
+	 * move it.
+	 */
+	render: function () {
+		var plotLine = this,
+			axis = plotLine.axis,
+			horiz = axis.horiz,
+			halfPointRange = (axis.pointRange || 0) / 2,
+			options = plotLine.options,
+			optionsLabel = options.label,
+			label = plotLine.label,
+			width = options.width,
+			to = options.to,
+			from = options.from,
+			isBand = defined(from) && defined(to),
+			value = options.value,
+			dashStyle = options.dashStyle,
+			svgElem = plotLine.svgElem,
+			path = [],
+			addEvent,
+			eventType,
+			xs,
+			ys,
+			x,
+			y,
+			color = options.color,
+			zIndex = options.zIndex,
+			events = options.events,
+			attribs,
+			renderer = axis.chart.renderer;
+
+		// logarithmic conversion
+		if (axis.isLog) {
+			from = log2lin(from);
+			to = log2lin(to);
+			value = log2lin(value);
+		}
+
+		// plot line
+		if (width) {
+			path = axis.getPlotLinePath(value, width);
+			attribs = {
+				stroke: color,
+				'stroke-width': width
+			};
+			if (dashStyle) {
+				attribs.dashstyle = dashStyle;
+			}
+		} else if (isBand) { // plot band
+			
+			// keep within plot area
+			from = mathMax(from, axis.min - halfPointRange);
+			to = mathMin(to, axis.max + halfPointRange);
+			
+			path = axis.getPlotBandPath(from, to, options);
+			attribs = {
+				fill: color
+			};
+			if (options.borderWidth) {
+				attribs.stroke = options.borderColor;
+				attribs['stroke-width'] = options.borderWidth;
+			}
+		} else {
+			return;
+		}
+		// zIndex
+		if (defined(zIndex)) {
+			attribs.zIndex = zIndex;
+		}
+
+		// common for lines and bands
+		if (svgElem) {
+			if (path) {
+				svgElem.animate({
+					d: path
+				}, null, svgElem.onGetPath);
+			} else {
+				svgElem.hide();
+				svgElem.onGetPath = function () {
+					svgElem.show();
+				};
+			}
+		} else if (path && path.length) {
+			plotLine.svgElem = svgElem = renderer.path(path)
+				.attr(attribs).add();
+
+			// events
+			if (events) {
+				addEvent = function (eventType) {
+					svgElem.on(eventType, function (e) {
+						events[eventType].apply(plotLine, [e]);
+					});
+				};
+				for (eventType in events) {
+					addEvent(eventType);
+				}
+			}
+		}
+
+		// the plot band/line label
+		if (optionsLabel && defined(optionsLabel.text) && path && path.length && axis.width > 0 && axis.height > 0) {
+			// apply defaults
+			optionsLabel = merge({
+				align: horiz && isBand && 'center',
+				x: horiz ? !isBand && 4 : 10,
+				verticalAlign : !horiz && isBand && 'middle',
+				y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,
+				rotation: horiz && !isBand && 90
+			}, optionsLabel);
+
+			// add the SVG element
+			if (!label) {
+				plotLine.label = label = renderer.text(
+						optionsLabel.text,
+						0,
+						0,
+						optionsLabel.useHTML
+					)
+					.attr({
+						align: optionsLabel.textAlign || optionsLabel.align,
+						rotation: optionsLabel.rotation,
+						zIndex: zIndex
+					})
+					.css(optionsLabel.style)
+					.add();
+			}
+
+			// get the bounding box and align the label
+			xs = [path[1], path[4], pick(path[6], path[1])];
+			ys = [path[2], path[5], pick(path[7], path[2])];
+			x = arrayMin(xs);
+			y = arrayMin(ys);
+
+			label.align(optionsLabel, false, {
+				x: x,
+				y: y,
+				width: arrayMax(xs) - x,
+				height: arrayMax(ys) - y
+			});
+			label.show();
+
+		} else if (label) { // move out of sight
+			label.hide();
+		}
+
+		// chainable
+		return plotLine;
+	},
+
+	/**
+	 * Remove the plot line or band
+	 */
+	destroy: function () {
+		// remove it from the lookup
+		erase(this.axis.plotLinesAndBands, this);
+		
+		delete this.axis;
+		destroyObjectProperties(this);
+	}
+};
+/**
+ * The class for stack items
+ */
+function StackItem(axis, options, isNegative, x, stackOption, stacking) {
+	
+	var inverted = axis.chart.inverted;
+
+	this.axis = axis;
+
+	// Tells if the stack is negative
+	this.isNegative = isNegative;
+
+	// Save the options to be able to style the label
+	this.options = options;
+
+	// Save the x value to be able to position the label later
+	this.x = x;
+
+	// Initialize total value
+	this.total = null;
+
+	// This will keep each points' extremes stored by series.index
+	this.points = {};
+
+	// Save the stack option on the series configuration object, and whether to treat it as percent
+	this.stack = stackOption;
+	this.percent = stacking === 'percent';
+
+	// The align options and text align varies on whether the stack is negative and
+	// if the chart is inverted or not.
+	// First test the user supplied value, then use the dynamic.
+	this.alignOptions = {
+		align: options.align || (inverted ? (isNegative ? 'left' : 'right') : 'center'),
+		verticalAlign: options.verticalAlign || (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),
+		y: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)),
+		x: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0)
+	};
+
+	this.textAlign = options.textAlign || (inverted ? (isNegative ? 'right' : 'left') : 'center');
+}
+
+StackItem.prototype = {
+	destroy: function () {
+		destroyObjectProperties(this, this.axis);
+	},
+
+	/**
+	 * Renders the stack total label and adds it to the stack label group.
+	 */
+	render: function (group) {
+		var options = this.options,
+			formatOption = options.format,
+			str = formatOption ?
+				format(formatOption, this) : 
+				options.formatter.call(this);  // format the text in the label
+
+		// Change the text to reflect the new total and set visibility to hidden in case the serie is hidden
+		if (this.label) {
+			this.label.attr({text: str, visibility: HIDDEN});
+		// Create new label
+		} else {
+			this.label =
+				this.axis.chart.renderer.text(str, 0, 0, options.useHTML)		// dummy positions, actual position updated with setOffset method in columnseries
+					.css(options.style)				// apply style
+					.attr({
+						align: this.textAlign,				// fix the text-anchor
+						rotation: options.rotation,	// rotation
+						visibility: HIDDEN					// hidden until setOffset is called
+					})				
+					.add(group);							// add to the labels-group
+		}
+	},
+
+	/**
+	 * Sets the offset that the stack has from the x value and repositions the label.
+	 */
+	setOffset: function (xOffset, xWidth) {
+		var stackItem = this,
+			axis = stackItem.axis,
+			chart = axis.chart,
+			inverted = chart.inverted,
+			neg = this.isNegative,							// special treatment is needed for negative stacks
+			y = axis.translate(this.percent ? 100 : this.total, 0, 0, 0, 1), // stack value translated mapped to chart coordinates
+			yZero = axis.translate(0),						// stack origin
+			h = mathAbs(y - yZero),							// stack height
+			x = chart.xAxis[0].translate(this.x) + xOffset,	// stack x position
+			plotHeight = chart.plotHeight,
+			stackBox = {	// this is the box for the complete stack
+				x: inverted ? (neg ? y : y - h) : x,
+				y: inverted ? plotHeight - x - xWidth : (neg ? (plotHeight - y - h) : plotHeight - y),
+				width: inverted ? h : xWidth,
+				height: inverted ? xWidth : h
+			},
+			label = this.label,
+			alignAttr;
+		
+		if (label) {
+			label.align(this.alignOptions, null, stackBox);	// align the label to the box
+				
+			// Set visibility (#678)
+			alignAttr = label.alignAttr;
+			label.attr({ 
+				visibility: this.options.crop === false || chart.isInsidePlot(alignAttr.x, alignAttr.y) ? 
+					(hasSVG ? 'inherit' : VISIBLE) : 
+					HIDDEN
+			});
+		}
+	}
+};
+/**
+ * Create a new axis object
+ * @param {Object} chart
+ * @param {Object} options
+ */
+function Axis() {
+	this.init.apply(this, arguments);
+}
+
+Axis.prototype = {
+	
+	/**
+	 * Default options for the X axis - the Y axis has extended defaults 
+	 */
+	defaultOptions: {
+		// allowDecimals: null,
+		// alternateGridColor: null,
+		// categories: [],
+		dateTimeLabelFormats: {
+			millisecond: '%H:%M:%S.%L',
+			second: '%H:%M:%S',
+			minute: '%H:%M',
+			hour: '%H:%M',
+			day: '%e. %b',
+			week: '%e. %b',
+			month: '%b \'%y',
+			year: '%Y'
+		},
+		endOnTick: false,
+		gridLineColor: '#C0C0C0',
+		// gridLineDashStyle: 'solid',
+		// gridLineWidth: 0,
+		// reversed: false,
+	
+		labels: defaultLabelOptions,
+			// { step: null },
+		lineColor: '#C0D0E0',
+		lineWidth: 1,
+		//linkedTo: null,
+		//max: undefined,
+		//min: undefined,
+		minPadding: 0.01,
+		maxPadding: 0.01,
+		//minRange: null,
+		minorGridLineColor: '#E0E0E0',
+		// minorGridLineDashStyle: null,
+		minorGridLineWidth: 1,
+		minorTickColor: '#A0A0A0',
+		//minorTickInterval: null,
+		minorTickLength: 2,
+		minorTickPosition: 'outside', // inside or outside
+		//minorTickWidth: 0,
+		//opposite: false,
+		//offset: 0,
+		//plotBands: [{
+		//	events: {},
+		//	zIndex: 1,
+		//	labels: { align, x, verticalAlign, y, style, rotation, textAlign }
+		//}],
+		//plotLines: [{
+		//	events: {}
+		//  dashStyle: {}
+		//	zIndex:
+		//	labels: { align, x, verticalAlign, y, style, rotation, textAlign }
+		//}],
+		//reversed: false,
+		// showFirstLabel: true,
+		// showLastLabel: true,
+		startOfWeek: 1,
+		startOnTick: false,
+		tickColor: '#C0D0E0',
+		//tickInterval: null,
+		tickLength: 5,
+		tickmarkPlacement: 'between', // on or between
+		tickPixelInterval: 100,
+		tickPosition: 'outside',
+		tickWidth: 1,
+		title: {
+			//text: null,
+			align: 'middle', // low, middle or high
+			//margin: 0 for horizontal, 10 for vertical axes,
+			//rotation: 0,
+			//side: 'outside',
+			style: {
+				color: '#4d759e',
+				//font: defaultFont.replace('normal', 'bold')
+				fontWeight: 'bold'
+			}
+			//x: 0,
+			//y: 0
+		},
+		type: 'linear' // linear, logarithmic or datetime
+	},
+	
+	/**
+	 * This options set extends the defaultOptions for Y axes
+	 */
+	defaultYAxisOptions: {
+		endOnTick: true,
+		gridLineWidth: 1,
+		tickPixelInterval: 72,
+		showLastLabel: true,
+		labels: {
+			x: -8,
+			y: 3
+		},
+		lineWidth: 0,
+		maxPadding: 0.05,
+		minPadding: 0.05,
+		startOnTick: true,
+		tickWidth: 0,
+		title: {
+			rotation: 270,
+			text: 'Values'
+		},
+		stackLabels: {
+			enabled: false,
+			//align: dynamic,
+			//y: dynamic,
+			//x: dynamic,
+			//verticalAlign: dynamic,
+			//textAlign: dynamic,
+			//rotation: 0,
+			formatter: function () {
+				return numberFormat(this.total, -1);
+			},
+			style: defaultLabelOptions.style
+		}
+	},
+	
+	/**
+	 * These options extend the defaultOptions for left axes
+	 */
+	defaultLeftAxisOptions: {
+		labels: {
+			x: -8,
+			y: null
+		},
+		title: {
+			rotation: 270
+		}
+	},
+	
+	/**
+	 * These options extend the defaultOptions for right axes
+	 */
+	defaultRightAxisOptions: {
+		labels: {
+			x: 8,
+			y: null
+		},
+		title: {
+			rotation: 90
+		}
+	},
+	
+	/**
+	 * These options extend the defaultOptions for bottom axes
+	 */
+	defaultBottomAxisOptions: {
+		labels: {
+			x: 0,
+			y: 14
+			// overflow: undefined,
+			// staggerLines: null
+		},
+		title: {
+			rotation: 0
+		}
+	},
+	/**
+	 * These options extend the defaultOptions for left axes
+	 */
+	defaultTopAxisOptions: {
+		labels: {
+			x: 0,
+			y: -5
+			// overflow: undefined
+			// staggerLines: null
+		},
+		title: {
+			rotation: 0
+		}
+	},
+	
+	/**
+	 * Initialize the axis
+	 */
+	init: function (chart, userOptions) {
+			
+		
+		var isXAxis = userOptions.isX,
+			axis = this;
+	
+		// Flag, is the axis horizontal
+		axis.horiz = chart.inverted ? !isXAxis : isXAxis;
+		
+		// Flag, isXAxis
+		axis.isXAxis = isXAxis;
+		axis.xOrY = isXAxis ? 'x' : 'y';
+	
+	
+		axis.opposite = userOptions.opposite; // needed in setOptions
+		axis.side = axis.horiz ?
+				(axis.opposite ? 0 : 2) : // top : bottom
+				(axis.opposite ? 1 : 3);  // right : left
+	
+		axis.setOptions(userOptions);
+		
+	
+		var options = this.options,
+			type = options.type,
+			isDatetimeAxis = type === 'datetime';
+	
+		axis.labelFormatter = options.labels.formatter || axis.defaultLabelFormatter; // can be overwritten by dynamic format
+	
+	
+		// Flag, stagger lines or not
+		axis.userOptions = userOptions;
+	
+		//axis.axisTitleMargin = UNDEFINED,// = options.title.margin,
+		axis.minPixelPadding = 0;
+		//axis.ignoreMinPadding = UNDEFINED; // can be set to true by a column or bar series
+		//axis.ignoreMaxPadding = UNDEFINED;
+	
+		axis.chart = chart;
+		axis.reversed = options.reversed;
+		axis.zoomEnabled = options.zoomEnabled !== false;
+	
+		// Initial categories
+		axis.categories = options.categories || type === 'category';
+	
+		// Elements
+		//axis.axisGroup = UNDEFINED;
+		//axis.gridGroup = UNDEFINED;
+		//axis.axisTitle = UNDEFINED;
+		//axis.axisLine = UNDEFINED;
+	
+		// Shorthand types
+		axis.isLog = type === 'logarithmic';
+		axis.isDatetimeAxis = isDatetimeAxis;
+	
+		// Flag, if axis is linked to another axis
+		axis.isLinked = defined(options.linkedTo);
+		// Linked axis.
+		//axis.linkedParent = UNDEFINED;	
+		
+		// Tick positions
+		//axis.tickPositions = UNDEFINED; // array containing predefined positions
+		// Tick intervals
+		//axis.tickInterval = UNDEFINED;
+		//axis.minorTickInterval = UNDEFINED;
+		
+		axis.tickmarkOffset = (axis.categories && options.tickmarkPlacement === 'between') ? 0.5 : 0;
+	
+		// Major ticks
+		axis.ticks = {};
+		// Minor ticks
+		axis.minorTicks = {};
+		//axis.tickAmount = UNDEFINED;
+	
+		// List of plotLines/Bands
+		axis.plotLinesAndBands = [];
+	
+		// Alternate bands
+		axis.alternateBands = {};
+	
+		// Axis metrics
+		//axis.left = UNDEFINED;
+		//axis.top = UNDEFINED;
+		//axis.width = UNDEFINED;
+		//axis.height = UNDEFINED;
+		//axis.bottom = UNDEFINED;
+		//axis.right = UNDEFINED;
+		//axis.transA = UNDEFINED;
+		//axis.transB = UNDEFINED;
+		//axis.oldTransA = UNDEFINED;
+		axis.len = 0;
+		//axis.oldMin = UNDEFINED;
+		//axis.oldMax = UNDEFINED;
+		//axis.oldUserMin = UNDEFINED;
+		//axis.oldUserMax = UNDEFINED;
+		//axis.oldAxisLength = UNDEFINED;
+		axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;
+		axis.range = options.range;
+		axis.offset = options.offset || 0;
+	
+	
+		// Dictionary for stacks
+		axis.stacks = {};
+		axis.oldStacks = {};
+
+		// Dictionary for stacks max values
+		axis.stackExtremes = {};
+
+		// Min and max in the data
+		//axis.dataMin = UNDEFINED,
+		//axis.dataMax = UNDEFINED,
+	
+		// The axis range
+		axis.max = null;
+		axis.min = null;
+	
+		// User set min and max
+		//axis.userMin = UNDEFINED,
+		//axis.userMax = UNDEFINED,
+
+		// Run Axis
+		
+		var eventType,
+			events = axis.options.events;
+
+		// Register
+		if (inArray(axis, chart.axes) === -1) { // don't add it again on Axis.update()
+			chart.axes.push(axis);
+			chart[isXAxis ? 'xAxis' : 'yAxis'].push(axis);
+		}
+
+		axis.series = axis.series || []; // populated by Series
+
+		// inverted charts have reversed xAxes as default
+		if (chart.inverted && isXAxis && axis.reversed === UNDEFINED) {
+			axis.reversed = true;
+		}
+
+		axis.removePlotBand = axis.removePlotBandOrLine;
+		axis.removePlotLine = axis.removePlotBandOrLine;
+
+
+		// register event listeners
+		for (eventType in events) {
+			addEvent(axis, eventType, events[eventType]);
+		}
+
+		// extend logarithmic axis
+		if (axis.isLog) {
+			axis.val2lin = log2lin;
+			axis.lin2val = lin2log;
+		}
+	},
+	
+	/**
+	 * Merge and set options
+	 */
+	setOptions: function (userOptions) {
+		this.options = merge(
+			this.defaultOptions,
+			this.isXAxis ? {} : this.defaultYAxisOptions,
+			[this.defaultTopAxisOptions, this.defaultRightAxisOptions,
+				this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side],
+			merge(
+				defaultOptions[this.isXAxis ? 'xAxis' : 'yAxis'], // if set in setOptions (#1053)
+				userOptions
+			)
+		);
+	},
+
+	/**
+	 * Update the axis with a new options structure
+	 */
+	update: function (newOptions, redraw) {
+		var chart = this.chart;
+
+		newOptions = chart.options[this.xOrY + 'Axis'][this.options.index] = merge(this.userOptions, newOptions);
+
+		this.destroy(true);
+		this._addedPlotLB = this.userMin = this.userMax = UNDEFINED; // #1611, #2306
+
+		this.init(chart, extend(newOptions, { events: UNDEFINED }));
+
+		chart.isDirtyBox = true;
+		if (pick(redraw, true)) {
+			chart.redraw();
+		}
+	},	
+	
+	/**
+     * Remove the axis from the chart
+     */
+	remove: function (redraw) {
+		var chart = this.chart,
+			key = this.xOrY + 'Axis'; // xAxis or yAxis
+
+		// Remove associated series
+		each(this.series, function (series) {
+			series.remove(false);
+		});
+
+		// Remove the axis
+		erase(chart.axes, this);
+		erase(chart[key], this);
+		chart.options[key].splice(this.options.index, 1);
+		each(chart[key], function (axis, i) { // Re-index, #1706
+			axis.options.index = i;
+		});
+		this.destroy();
+		chart.isDirtyBox = true;
+
+		if (pick(redraw, true)) {
+			chart.redraw();
+		}
+	},
+	
+	/** 
+	 * The default label formatter. The context is a special config object for the label.
+	 */
+	defaultLabelFormatter: function () {
+		var axis = this.axis,
+			value = this.value,
+			categories = axis.categories, 
+			dateTimeLabelFormat = this.dateTimeLabelFormat,
+			numericSymbols = defaultOptions.lang.numericSymbols,
+			i = numericSymbols && numericSymbols.length,
+			multi,
+			ret,
+			formatOption = axis.options.labels.format,
+			
+			// make sure the same symbol is added for all labels on a linear axis
+			numericSymbolDetector = axis.isLog ? value : axis.tickInterval;
+
+		if (formatOption) {
+			ret = format(formatOption, this);
+		
+		} else if (categories) {
+			ret = value;
+		
+		} else if (dateTimeLabelFormat) { // datetime axis
+			ret = dateFormat(dateTimeLabelFormat, value);
+		
+		} else if (i && numericSymbolDetector >= 1000) {
+			// Decide whether we should add a numeric symbol like k (thousands) or M (millions).
+			// If we are to enable this in tooltip or other places as well, we can move this
+			// logic to the numberFormatter and enable it by a parameter.
+			while (i-- && ret === UNDEFINED) {
+				multi = Math.pow(1000, i + 1);
+				if (numericSymbolDetector >= multi && numericSymbols[i] !== null) {
+					ret = numberFormat(value / multi, -1) + numericSymbols[i];
+				}
+			}
+		}
+		
+		if (ret === UNDEFINED) {
+			if (value >= 1000) { // add thousands separators
+				ret = numberFormat(value, 0);
+
+			} else { // small numbers
+				ret = numberFormat(value, -1);
+			}
+		}
+		
+		return ret;
+	},
+
+	/**
+	 * Get the minimum and maximum for the series of each axis
+	 */
+	getSeriesExtremes: function () {
+		var axis = this,
+			chart = axis.chart;
+
+		axis.hasVisibleSeries = false;
+
+		// reset dataMin and dataMax in case we're redrawing
+		axis.dataMin = axis.dataMax = null;
+
+		// reset cached stacking extremes
+		axis.stackExtremes = {};
+
+		axis.buildStacks();
+
+		// loop through this axis' series
+		each(axis.series, function (series) {
+
+			if (series.visible || !chart.options.chart.ignoreHiddenSeries) {
+
+				var seriesOptions = series.options,
+					xData,
+					threshold = seriesOptions.threshold,
+					seriesDataMin,
+					seriesDataMax;
+
+				axis.hasVisibleSeries = true;
+
+				// Validate threshold in logarithmic axes
+				if (axis.isLog && threshold <= 0) {
+					threshold = null;
+				}
+
+				// Get dataMin and dataMax for X axes
+				if (axis.isXAxis) {
+					xData = series.xData;
+					if (xData.length) {
+						axis.dataMin = mathMin(pick(axis.dataMin, xData[0]), arrayMin(xData));
+						axis.dataMax = mathMax(pick(axis.dataMax, xData[0]), arrayMax(xData));
+					}
+
+				// Get dataMin and dataMax for Y axes, as well as handle stacking and processed data
+				} else {
+
+					// Get this particular series extremes
+					series.getExtremes();
+					seriesDataMax = series.dataMax;
+					seriesDataMin = series.dataMin;
+
+					// Get the dataMin and dataMax so far. If percentage is used, the min and max are
+					// always 0 and 100. If seriesDataMin and seriesDataMax is null, then series
+					// doesn't have active y data, we continue with nulls
+					if (defined(seriesDataMin) && defined(seriesDataMax)) {
+						axis.dataMin = mathMin(pick(axis.dataMin, seriesDataMin), seriesDataMin);
+						axis.dataMax = mathMax(pick(axis.dataMax, seriesDataMax), seriesDataMax);
+					}
+
+					// Adjust to threshold
+					if (defined(threshold)) {
+						if (axis.dataMin >= threshold) {
+							axis.dataMin = threshold;
+							axis.ignoreMinPadding = true;
+						} else if (axis.dataMax < threshold) {
+							axis.dataMax = threshold;
+							axis.ignoreMaxPadding = true;
+						}
+					}
+				}
+			}
+		});
+	},
+
+	/**
+	 * Translate from axis value to pixel position on the chart, or back
+	 *
+	 */
+	translate: function (val, backwards, cvsCoord, old, handleLog, pointPlacement) {
+		var axis = this,
+			axisLength = axis.len,
+			sign = 1,
+			cvsOffset = 0,
+			localA = old ? axis.oldTransA : axis.transA,
+			localMin = old ? axis.oldMin : axis.min,
+			returnValue,
+			minPixelPadding = axis.minPixelPadding,
+			postTranslate = (axis.options.ordinal || (axis.isLog && handleLog)) && axis.lin2val;
+
+		if (!localA) {
+			localA = axis.transA;
+		}
+
+		// In vertical axes, the canvas coordinates start from 0 at the top like in 
+		// SVG. 
+		if (cvsCoord) {
+			sign *= -1; // canvas coordinates inverts the value
+			cvsOffset = axisLength;
+		}
+
+		// Handle reversed axis
+		if (axis.reversed) { 
+			sign *= -1;
+			cvsOffset -= sign * axisLength;
+		}
+
+		// From pixels to value
+		if (backwards) { // reverse translation
+			
+			val = val * sign + cvsOffset;
+			val -= minPixelPadding;
+			returnValue = val / localA + localMin; // from chart pixel to value
+			if (postTranslate) { // log and ordinal axes
+				returnValue = axis.lin2val(returnValue);
+			}
+
+		// From value to pixels
+		} else {
+			if (postTranslate) { // log and ordinal axes
+				val = axis.val2lin(val);
+			}
+			if (pointPlacement === 'between') {
+				pointPlacement = 0.5;
+			}
+			returnValue = sign * (val - localMin) * localA + cvsOffset + (sign * minPixelPadding) +
+				(isNumber(pointPlacement) ? localA * pointPlacement * axis.pointRange : 0);
+		}
+
+		return returnValue;
+	},
+
+	/**
+	 * Utility method to translate an axis value to pixel position. 
+	 * @param {Number} value A value in terms of axis units
+	 * @param {Boolean} paneCoordinates Whether to return the pixel coordinate relative to the chart
+	 *        or just the axis/pane itself.
+	 */
+	toPixels: function (value, paneCoordinates) {
+		return this.translate(value, false, !this.horiz, null, true) + (paneCoordinates ? 0 : this.pos);
+	},
+
+	/*
+	 * Utility method to translate a pixel position in to an axis value
+	 * @param {Number} pixel The pixel value coordinate
+	 * @param {Boolean} paneCoordiantes Whether the input pixel is relative to the chart or just the
+	 *        axis/pane itself.
+	 */
+	toValue: function (pixel, paneCoordinates) {
+		return this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, null, true);
+	},
+
+	/**
+	 * Create the path for a plot line that goes from the given value on
+	 * this axis, across the plot to the opposite side
+	 * @param {Number} value
+	 * @param {Number} lineWidth Used for calculation crisp line
+	 * @param {Number] old Use old coordinates (for resizing and rescaling)
+	 */
+	getPlotLinePath: function (value, lineWidth, old, force) {
+		var axis = this,
+			chart = axis.chart,
+			axisLeft = axis.left,
+			axisTop = axis.top,
+			x1,
+			y1,
+			x2,
+			y2,
+			translatedValue = axis.translate(value, null, null, old),
+			cHeight = (old && chart.oldChartHeight) || chart.chartHeight,
+			cWidth = (old && chart.oldChartWidth) || chart.chartWidth,
+			skip,
+			transB = axis.transB;
+
+		x1 = x2 = mathRound(translatedValue + transB);
+		y1 = y2 = mathRound(cHeight - translatedValue - transB);
+
+		if (isNaN(translatedValue)) { // no min or max
+			skip = true;
+
+		} else if (axis.horiz) {
+			y1 = axisTop;
+			y2 = cHeight - axis.bottom;
+			if (x1 < axisLeft || x1 > axisLeft + axis.width) {
+				skip = true;
+			}
+		} else {
+			x1 = axisLeft;
+			x2 = cWidth - axis.right;
+
+			if (y1 < axisTop || y1 > axisTop + axis.height) {
+				skip = true;
+			}
+		}
+		return skip && !force ?
+			null :
+			chart.renderer.crispLine([M, x1, y1, L, x2, y2], lineWidth || 0);
+	},
+	
+	/**
+	 * Create the path for a plot band
+	 */
+	getPlotBandPath: function (from, to) {
+
+		var toPath = this.getPlotLinePath(to),
+			path = this.getPlotLinePath(from);
+			
+		if (path && toPath) {
+			path.push(
+				toPath[4],
+				toPath[5],
+				toPath[1],
+				toPath[2]
+			);
+		} else { // outside the axis area
+			path = null;
+		}
+		
+		return path;
+	},
+	
+	/**
+	 * Set the tick positions of a linear axis to round values like whole tens or every five.
+	 */
+	getLinearTickPositions: function (tickInterval, min, max) {
+		var pos,
+			lastPos,
+			roundedMin = correctFloat(mathFloor(min / tickInterval) * tickInterval),
+			roundedMax = correctFloat(mathCeil(max / tickInterval) * tickInterval),
+			tickPositions = [];
+
+		// Populate the intermediate values
+		pos = roundedMin;
+		while (pos <= roundedMax) {
+
+			// Place the tick on the rounded value
+			tickPositions.push(pos);
+
+			// Always add the raw tickInterval, not the corrected one.
+			pos = correctFloat(pos + tickInterval);
+
+			// If the interval is not big enough in the current min - max range to actually increase
+			// the loop variable, we need to break out to prevent endless loop. Issue #619
+			if (pos === lastPos) {
+				break;
+			}
+
+			// Record the last value
+			lastPos = pos;
+		}
+		return tickPositions;
+	},
+	
+	/**
+	 * Set the tick positions of a logarithmic axis
+	 */
+	getLogTickPositions: function (interval, min, max, minor) {
+		var axis = this,
+			options = axis.options,
+			axisLength = axis.len,
+			// Since we use this method for both major and minor ticks,
+			// use a local variable and return the result
+			positions = []; 
+		
+		// Reset
+		if (!minor) {
+			axis._minorAutoInterval = null;
+		}
+		
+		// First case: All ticks fall on whole logarithms: 1, 10, 100 etc.
+		if (interval >= 0.5) {
+			interval = mathRound(interval);
+			positions = axis.getLinearTickPositions(interval, min, max);
+			
+		// Second case: We need intermediary ticks. For example 
+		// 1, 2, 4, 6, 8, 10, 20, 40 etc. 
+		} else if (interval >= 0.08) {
+			var roundedMin = mathFloor(min),
+				intermediate,
+				i,
+				j,
+				len,
+				pos,
+				lastPos,
+				break2;
+				
+			if (interval > 0.3) {
+				intermediate = [1, 2, 4];
+			} else if (interval > 0.15) { // 0.2 equals five minor ticks per 1, 10, 100 etc
+				intermediate = [1, 2, 4, 6, 8];
+			} else { // 0.1 equals ten minor ticks per 1, 10, 100 etc
+				intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];
+			}
+			
+			for (i = roundedMin; i < max + 1 && !break2; i++) {
+				len = intermediate.length;
+				for (j = 0; j < len && !break2; j++) {
+					pos = log2lin(lin2log(i) * intermediate[j]);
+					
+					if (pos > min && (!minor || lastPos <= max)) { // #1670
+						positions.push(lastPos);
+					}
+					
+					if (lastPos > max) {
+						break2 = true;
+					}
+					lastPos = pos;
+				}
+			}
+			
+		// Third case: We are so deep in between whole logarithmic values that
+		// we might as well handle the tick positions like a linear axis. For
+		// example 1.01, 1.02, 1.03, 1.04.
+		} else {
+			var realMin = lin2log(min),
+				realMax = lin2log(max),
+				tickIntervalOption = options[minor ? 'minorTickInterval' : 'tickInterval'],
+				filteredTickIntervalOption = tickIntervalOption === 'auto' ? null : tickIntervalOption,
+				tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),
+				totalPixelLength = minor ? axisLength / axis.tickPositions.length : axisLength;
+			
+			interval = pick(
+				filteredTickIntervalOption,
+				axis._minorAutoInterval,
+				(realMax - realMin) * tickPixelIntervalOption / (totalPixelLength || 1)
+			);
+			
+			interval = normalizeTickInterval(
+				interval, 
+				null, 
+				getMagnitude(interval)
+			);
+			
+			positions = map(axis.getLinearTickPositions(
+				interval, 
+				realMin,
+				realMax	
+			), log2lin);
+			
+			if (!minor) {
+				axis._minorAutoInterval = interval / 5;
+			}
+		}
+		
+		// Set the axis-level tickInterval variable 
+		if (!minor) {
+			axis.tickInterval = interval;
+		}
+		return positions;
+	},
+
+	/**
+	 * Return the minor tick positions. For logarithmic axes, reuse the same logic
+	 * as for major ticks.
+	 */
+	getMinorTickPositions: function () {
+		var axis = this,
+			options = axis.options,
+			tickPositions = axis.tickPositions,
+			minorTickInterval = axis.minorTickInterval,
+			minorTickPositions = [],
+			pos,
+			i,
+			len;
+		
+		if (axis.isLog) {
+			len = tickPositions.length;
+			for (i = 1; i < len; i++) {
+				minorTickPositions = minorTickPositions.concat(
+					axis.getLogTickPositions(minorTickInterval, tickPositions[i - 1], tickPositions[i], true)
+				);	
+			}
+		} else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314
+			minorTickPositions = minorTickPositions.concat(
+				getTimeTicks(
+					normalizeTimeTickInterval(minorTickInterval),
+					axis.min,
+					axis.max,
+					options.startOfWeek
+				)
+			);
+			if (minorTickPositions[0] < axis.min) {
+				minorTickPositions.shift();
+			}
+		} else {			
+			for (pos = axis.min + (tickPositions[0] - axis.min) % minorTickInterval; pos <= axis.max; pos += minorTickInterval) {
+				minorTickPositions.push(pos);
+			}
+		}
+		return minorTickPositions;
+	},
+
+	/**
+	 * Adjust the min and max for the minimum range. Keep in mind that the series data is 
+	 * not yet processed, so we don't have information on data cropping and grouping, or 
+	 * updated axis.pointRange or series.pointRange. The data can't be processed until
+	 * we have finally established min and max.
+	 */
+	adjustForMinRange: function () {
+		var axis = this,
+			options = axis.options,
+			min = axis.min,
+			max = axis.max,
+			zoomOffset,
+			spaceAvailable = axis.dataMax - axis.dataMin >= axis.minRange,
+			closestDataRange,
+			i,
+			distance,
+			xData,
+			loopLength,
+			minArgs,
+			maxArgs;
+
+		// Set the automatic minimum range based on the closest point distance
+		if (axis.isXAxis && axis.minRange === UNDEFINED && !axis.isLog) {
+
+			if (defined(options.min) || defined(options.max)) {
+				axis.minRange = null; // don't do this again
+
+			} else {
+
+				// Find the closest distance between raw data points, as opposed to
+				// closestPointRange that applies to processed points (cropped and grouped)
+				each(axis.series, function (series) {
+					xData = series.xData;
+					loopLength = series.xIncrement ? 1 : xData.length - 1;
+					for (i = loopLength; i > 0; i--) {
+						distance = xData[i] - xData[i - 1];
+						if (closestDataRange === UNDEFINED || distance < closestDataRange) {
+							closestDataRange = distance;
+						}
+					}
+				});
+				axis.minRange = mathMin(closestDataRange * 5, axis.dataMax - axis.dataMin);
+			}
+		}
+
+		// if minRange is exceeded, adjust
+		if (max - min < axis.minRange) {
+			var minRange = axis.minRange;
+			zoomOffset = (minRange - max + min) / 2;
+
+			// if min and max options have been set, don't go beyond it
+			minArgs = [min - zoomOffset, pick(options.min, min - zoomOffset)];
+			if (spaceAvailable) { // if space is available, stay within the data range
+				minArgs[2] = axis.dataMin;
+			}
+			min = arrayMax(minArgs);
+
+			maxArgs = [min + minRange, pick(options.max, min + minRange)];
+			if (spaceAvailable) { // if space is availabe, stay within the data range
+				maxArgs[2] = axis.dataMax;
+			}
+
+			max = arrayMin(maxArgs);
+
+			// now if the max is adjusted, adjust the min back
+			if (max - min < minRange) {
+				minArgs[0] = max - minRange;
+				minArgs[1] = pick(options.min, max - minRange);
+				min = arrayMax(minArgs);
+			}
+		}
+		
+		// Record modified extremes
+		axis.min = min;
+		axis.max = max;
+	},
+
+	/**
+	 * Update translation information
+	 */
+	setAxisTranslation: function (saveOld) {
+		var axis = this,
+			range = axis.max - axis.min,
+			pointRange = 0,
+			closestPointRange,
+			minPointOffset = 0,
+			pointRangePadding = 0,
+			linkedParent = axis.linkedParent,
+			ordinalCorrection,
+			transA = axis.transA;
+
+		// adjust translation for padding
+		if (axis.isXAxis) {
+			if (linkedParent) {
+				minPointOffset = linkedParent.minPointOffset;
+				pointRangePadding = linkedParent.pointRangePadding;
+				
+			} else {
+				each(axis.series, function (series) {
+					var seriesPointRange = series.pointRange,
+						pointPlacement = series.options.pointPlacement,
+						seriesClosestPointRange = series.closestPointRange;
+
+					if (seriesPointRange > range) { // #1446
+						seriesPointRange = 0;
+					}
+					pointRange = mathMax(pointRange, seriesPointRange);
+					
+					// minPointOffset is the value padding to the left of the axis in order to make
+					// room for points with a pointRange, typically columns. When the pointPlacement option
+					// is 'between' or 'on', this padding does not apply.
+					minPointOffset = mathMax(
+						minPointOffset, 
+						isString(pointPlacement) ? 0 : seriesPointRange / 2
+					);
+					
+					// Determine the total padding needed to the length of the axis to make room for the 
+					// pointRange. If the series' pointPlacement is 'on', no padding is added.
+					pointRangePadding = mathMax(
+						pointRangePadding,
+						pointPlacement === 'on' ? 0 : seriesPointRange
+					);
+
+					// Set the closestPointRange
+					if (!series.noSharedTooltip && defined(seriesClosestPointRange)) {
+						closestPointRange = defined(closestPointRange) ?
+							mathMin(closestPointRange, seriesClosestPointRange) :
+							seriesClosestPointRange;
+					}
+				});
+			}
+			
+			// Record minPointOffset and pointRangePadding
+			ordinalCorrection = axis.ordinalSlope && closestPointRange ? axis.ordinalSlope / closestPointRange : 1; // #988, #1853
+			axis.minPointOffset = minPointOffset = minPointOffset * ordinalCorrection;
+			axis.pointRangePadding = pointRangePadding = pointRangePadding * ordinalCorrection;
+
+			// pointRange means the width reserved for each point, like in a column chart
+			axis.pointRange = mathMin(pointRange, range);
+
+			// closestPointRange means the closest distance between points. In columns
+			// it is mostly equal to pointRange, but in lines pointRange is 0 while closestPointRange
+			// is some other value
+			axis.closestPointRange = closestPointRange;
+		}
+
+		// Secondary values
+		if (saveOld) {
+			axis.oldTransA = transA;
+		}
+		axis.translationSlope = axis.transA = transA = axis.len / ((range + pointRangePadding) || 1);
+		axis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend
+		axis.minPixelPadding = transA * minPointOffset;
+	},
+
+	/**
+	 * Set the tick positions to round values and optionally extend the extremes
+	 * to the nearest tick
+	 */
+	setTickPositions: function (secondPass) {
+		var axis = this,
+			chart = axis.chart,
+			options = axis.options,
+			isLog = axis.isLog,
+			isDatetimeAxis = axis.isDatetimeAxis,
+			isXAxis = axis.isXAxis,
+			isLinked = axis.isLinked,
+			tickPositioner = axis.options.tickPositioner,
+			maxPadding = options.maxPadding,
+			minPadding = options.minPadding,
+			length,
+			linkedParentExtremes,
+			tickIntervalOption = options.tickInterval,
+			minTickIntervalOption = options.minTickInterval,
+			tickPixelIntervalOption = options.tickPixelInterval,
+			tickPositions,
+			keepTwoTicksOnly,
+			categories = axis.categories;
+
+		// linked axis gets the extremes from the parent axis
+		if (isLinked) {
+			axis.linkedParent = chart[isXAxis ? 'xAxis' : 'yAxis'][options.linkedTo];
+			linkedParentExtremes = axis.linkedParent.getExtremes();
+			axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);
+			axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);
+			if (options.type !== axis.linkedParent.options.type) {
+				error(11, 1); // Can't link axes of different type
+			}
+		} else { // initial min and max from the extreme data values
+			axis.min = pick(axis.userMin, options.min, axis.dataMin);
+			axis.max = pick(axis.userMax, options.max, axis.dataMax);
+		}
+
+		if (isLog) {
+			if (!secondPass && mathMin(axis.min, pick(axis.dataMin, axis.min)) <= 0) { // #978
+				error(10, 1); // Can't plot negative values on log axis
+			}
+			axis.min = correctFloat(log2lin(axis.min)); // correctFloat cures #934
+			axis.max = correctFloat(log2lin(axis.max));
+		}
+
+		// handle zoomed range
+		if (axis.range) {
+			axis.userMin = axis.min = mathMax(axis.min, axis.max - axis.range); // #618
+			axis.userMax = axis.max;
+			if (secondPass) {
+				axis.range = null;  // don't use it when running setExtremes
+			}
+		}
+		
+		// Hook for adjusting this.min and this.max. Used by bubble series.
+		if (axis.beforePadding) {
+			axis.beforePadding();
+		}
+
+		// adjust min and max for the minimum range
+		axis.adjustForMinRange();
+		
+		// Pad the values to get clear of the chart's edges. To avoid tickInterval taking the padding
+		// into account, we do this after computing tick interval (#1337).
+		if (!categories && !axis.usePercentage && !isLinked && defined(axis.min) && defined(axis.max)) {
+			length = axis.max - axis.min;
+			if (length) {
+				if (!defined(options.min) && !defined(axis.userMin) && minPadding && (axis.dataMin < 0 || !axis.ignoreMinPadding)) {
+					axis.min -= length * minPadding;
+				}
+				if (!defined(options.max) && !defined(axis.userMax)  && maxPadding && (axis.dataMax > 0 || !axis.ignoreMaxPadding)) {
+					axis.max += length * maxPadding;
+				}
+			}
+		}
+
+		// get tickInterval
+		if (axis.min === axis.max || axis.min === undefined || axis.max === undefined) {
+			axis.tickInterval = 1;
+		} else if (isLinked && !tickIntervalOption &&
+				tickPixelIntervalOption === axis.linkedParent.options.tickPixelInterval) {
+			axis.tickInterval = axis.linkedParent.tickInterval;
+		} else {
+			axis.tickInterval = pick(
+				tickIntervalOption,
+				categories ? // for categoried axis, 1 is default, for linear axis use tickPix
+					1 :
+					// don't let it be more than the data range
+					(axis.max - axis.min) * tickPixelIntervalOption / mathMax(axis.len, tickPixelIntervalOption)
+			);
+			// For squished axes, set only two ticks
+			if (!defined(tickIntervalOption) && axis.len < tickPixelIntervalOption && !this.isRadial) {
+				keepTwoTicksOnly = true;
+				axis.tickInterval /= 4; // tick extremes closer to the real values
+			}
+		}
+
+		// Now we're finished detecting min and max, crop and group series data. This
+		// is in turn needed in order to find tick positions in ordinal axes. 
+		if (isXAxis && !secondPass) {
+			each(axis.series, function (series) {
+				series.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);
+			});
+		}
+
+		// set the translation factor used in translate function
+		axis.setAxisTranslation(true);
+
+		// hook for ordinal axes and radial axes
+		if (axis.beforeSetTickPositions) {
+			axis.beforeSetTickPositions();
+		}
+		
+		// hook for extensions, used in Highstock ordinal axes
+		if (axis.postProcessTickInterval) {
+			axis.tickInterval = axis.postProcessTickInterval(axis.tickInterval);
+		}
+
+		// In column-like charts, don't cramp in more ticks than there are points (#1943)
+		if (axis.pointRange) {
+			axis.tickInterval = mathMax(axis.pointRange, axis.tickInterval);
+		}
+		
+		// Before normalizing the tick interval, handle minimum tick interval. This applies only if tickInterval is not defined.
+		if (!tickIntervalOption && axis.tickInterval < minTickIntervalOption) {
+			axis.tickInterval = minTickIntervalOption;
+		}
+
+		// for linear axes, get magnitude and normalize the interval
+		if (!isDatetimeAxis && !isLog) { // linear
+			if (!tickIntervalOption) {
+				axis.tickInterval = normalizeTickInterval(axis.tickInterval, null, getMagnitude(axis.tickInterval), options);
+			}
+		}
+
+		// get minorTickInterval
+		axis.minorTickInterval = options.minorTickInterval === 'auto' && axis.tickInterval ?
+				axis.tickInterval / 5 : options.minorTickInterval;
+
+		// find the tick positions
+		axis.tickPositions = tickPositions = options.tickPositions ?
+			[].concat(options.tickPositions) : // Work on a copy (#1565)
+			(tickPositioner && tickPositioner.apply(axis, [axis.min, axis.max]));
+		if (!tickPositions) {
+			
+			// Too many ticks
+			if (!axis.ordinalPositions && (axis.max - axis.min) / axis.tickInterval > mathMax(2 * axis.len, 200)) {
+				error(19, true);
+			}
+			
+			if (isDatetimeAxis) {
+				tickPositions = (axis.getNonLinearTimeTicks || getTimeTicks)(
+					normalizeTimeTickInterval(axis.tickInterval, options.units),
+					axis.min,
+					axis.max,
+					options.startOfWeek,
+					axis.ordinalPositions,
+					axis.closestPointRange,
+					true
+				);
+			} else if (isLog) {
+				tickPositions = axis.getLogTickPositions(axis.tickInterval, axis.min, axis.max);
+			} else {
+				tickPositions = axis.getLinearTickPositions(axis.tickInterval, axis.min, axis.max);
+			}
+			if (keepTwoTicksOnly) {
+				tickPositions.splice(1, tickPositions.length - 2);
+			}
+
+			axis.tickPositions = tickPositions;
+		}
+
+		if (!isLinked) {
+
+			// reset min/max or remove extremes based on start/end on tick
+			var roundedMin = tickPositions[0],
+				roundedMax = tickPositions[tickPositions.length - 1],
+				minPointOffset = axis.minPointOffset || 0,
+				singlePad;
+
+			if (options.startOnTick) {
+				axis.min = roundedMin;
+			} else if (axis.min - minPointOffset > roundedMin) {
+				tickPositions.shift();
+			}
+
+			if (options.endOnTick) {
+				axis.max = roundedMax;
+			} else if (axis.max + minPointOffset < roundedMax) {
+				tickPositions.pop();
+			}
+			
+			// When there is only one point, or all points have the same value on this axis, then min
+			// and max are equal and tickPositions.length is 1. In this case, add some padding
+			// in order to center the point, but leave it with one tick. #1337.
+			if (tickPositions.length === 1) {
+				singlePad = 0.001; // The lowest possible number to avoid extra padding on columns
+				axis.min -= singlePad;
+				axis.max += singlePad;
+			}
+		}
+	},
+	
+	/**
+	 * Set the max ticks of either the x and y axis collection
+	 */
+	setMaxTicks: function () {
+		
+		var chart = this.chart,
+			maxTicks = chart.maxTicks || {},
+			tickPositions = this.tickPositions,
+			key = this._maxTicksKey = [this.xOrY, this.pos, this.len].join('-');
+		
+		if (!this.isLinked && !this.isDatetimeAxis && tickPositions && tickPositions.length > (maxTicks[key] || 0) && this.options.alignTicks !== false) {
+			maxTicks[key] = tickPositions.length;
+		}
+		chart.maxTicks = maxTicks;
+	},
+
+	/**
+	 * When using multiple axes, adjust the number of ticks to match the highest
+	 * number of ticks in that group
+	 */
+	adjustTickAmount: function () {
+		var axis = this,
+			chart = axis.chart,
+			key = axis._maxTicksKey,
+			tickPositions = axis.tickPositions,
+			maxTicks = chart.maxTicks;
+
+		if (maxTicks && maxTicks[key] && !axis.isDatetimeAxis && !axis.categories && !axis.isLinked && axis.options.alignTicks !== false) { // only apply to linear scale
+			var oldTickAmount = axis.tickAmount,
+				calculatedTickAmount = tickPositions.length,
+				tickAmount;
+
+			// set the axis-level tickAmount to use below
+			axis.tickAmount = tickAmount = maxTicks[key];
+
+			if (calculatedTickAmount < tickAmount) {
+				while (tickPositions.length < tickAmount) {
+					tickPositions.push(correctFloat(
+						tickPositions[tickPositions.length - 1] + axis.tickInterval
+					));
+				}
+				axis.transA *= (calculatedTickAmount - 1) / (tickAmount - 1);
+				axis.max = tickPositions[tickPositions.length - 1];
+
+			}
+			if (defined(oldTickAmount) && tickAmount !== oldTickAmount) {
+				axis.isDirty = true;
+			}
+		}
+	},
+
+	/**
+	 * Set the scale based on data min and max, user set min and max or options
+	 *
+	 */
+	setScale: function () {
+		var axis = this,
+			stacks = axis.stacks,
+			type,
+			i,
+			isDirtyData,
+			isDirtyAxisLength;
+
+		axis.oldMin = axis.min;
+		axis.oldMax = axis.max;
+		axis.oldAxisLength = axis.len;
+
+		// set the new axisLength
+		axis.setAxisSize();
+		//axisLength = horiz ? axisWidth : axisHeight;
+		isDirtyAxisLength = axis.len !== axis.oldAxisLength;
+
+		// is there new data?
+		each(axis.series, function (series) {
+			if (series.isDirtyData || series.isDirty ||
+					series.xAxis.isDirty) { // when x axis is dirty, we need new data extremes for y as well
+				isDirtyData = true;
+			}
+		});
+
+		// do we really need to go through all this?
+		if (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||
+			axis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax) {
+			
+			// reset stacks
+			if (!axis.isXAxis) {
+				for (type in stacks) {
+					delete stacks[type];
+				}
+			}
+
+			axis.forceRedraw = false;
+
+			// get data extremes if needed
+			axis.getSeriesExtremes();
+
+			// get fixed positions based on tickInterval
+			axis.setTickPositions();
+
+			// record old values to decide whether a rescale is necessary later on (#540)
+			axis.oldUserMin = axis.userMin;
+			axis.oldUserMax = axis.userMax;
+
+			// Mark as dirty if it is not already set to dirty and extremes have changed. #595.
+			if (!axis.isDirty) {
+				axis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;
+			}
+		} else if (!axis.isXAxis) {
+			if (axis.oldStacks) {
+				stacks = axis.stacks = axis.oldStacks;
+			}
+
+			// reset stacks
+			for (type in stacks) {
+				for (i in stacks[type]) {
+					stacks[type][i].cum = stacks[type][i].total;
+				}
+			}
+		}
+		
+		// Set the maximum tick amount
+		axis.setMaxTicks();
+	},
+
+	/**
+	 * Set the extremes and optionally redraw
+	 * @param {Number} newMin
+	 * @param {Number} newMax
+	 * @param {Boolean} redraw
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 * @param {Object} eventArguments 
+	 *
+	 */
+	setExtremes: function (newMin, newMax, redraw, animation, eventArguments) {
+		var axis = this,
+			chart = axis.chart;
+
+		redraw = pick(redraw, true); // defaults to true
+
+		// Extend the arguments with min and max
+		eventArguments = extend(eventArguments, {
+			min: newMin,
+			max: newMax
+		});
+
+		// Fire the event
+		fireEvent(axis, 'setExtremes', eventArguments, function () { // the default event handler
+
+			axis.userMin = newMin;
+			axis.userMax = newMax;
+			axis.eventArgs = eventArguments;
+
+			// Mark for running afterSetExtremes
+			axis.isDirtyExtremes = true;
+
+			// redraw
+			if (redraw) {
+				chart.redraw(animation);
+			}
+		});
+	},
+	
+	/**
+	 * Overridable method for zooming chart. Pulled out in a separate method to allow overriding
+	 * in stock charts.
+	 */
+	zoom: function (newMin, newMax) {
+
+		// Prevent pinch zooming out of range. Check for defined is for #1946.
+		if (!this.allowZoomOutside) {
+			if (defined(this.dataMin) && newMin <= this.dataMin) {
+				newMin = UNDEFINED;
+			}
+			if (defined(this.dataMax) && newMax >= this.dataMax) {
+				newMax = UNDEFINED;
+			}
+		}
+
+		// In full view, displaying the reset zoom button is not required
+		this.displayBtn = newMin !== UNDEFINED || newMax !== UNDEFINED;
+		
+		// Do it
+		this.setExtremes(
+			newMin,
+			newMax,
+			false, 
+			UNDEFINED, 
+			{ trigger: 'zoom' }
+		);
+		return true;
+	},
+	
+	/**
+	 * Update the axis metrics
+	 */
+	setAxisSize: function () {
+		var chart = this.chart,
+			options = this.options,
+			offsetLeft = options.offsetLeft || 0,
+			offsetRight = options.offsetRight || 0,
+			horiz = this.horiz,
+			width,
+			height,
+			top,
+			left;
+
+		// Expose basic values to use in Series object and navigator
+		this.left = left = pick(options.left, chart.plotLeft + offsetLeft);
+		this.top = top = pick(options.top, chart.plotTop);
+		this.width = width = pick(options.width, chart.plotWidth - offsetLeft + offsetRight);
+		this.height = height = pick(options.height, chart.plotHeight);
+		this.bottom = chart.chartHeight - height - top;
+		this.right = chart.chartWidth - width - left;
+
+		// Direction agnostic properties
+		this.len = mathMax(horiz ? width : height, 0); // mathMax fixes #905
+		this.pos = horiz ? left : top; // distance from SVG origin
+	},
+
+	/**
+	 * Get the actual axis extremes
+	 */
+	getExtremes: function () {
+		var axis = this,
+			isLog = axis.isLog;
+
+		return {
+			min: isLog ? correctFloat(lin2log(axis.min)) : axis.min,
+			max: isLog ? correctFloat(lin2log(axis.max)) : axis.max,
+			dataMin: axis.dataMin,
+			dataMax: axis.dataMax,
+			userMin: axis.userMin,
+			userMax: axis.userMax
+		};
+	},
+
+	/**
+	 * Get the zero plane either based on zero or on the min or max value.
+	 * Used in bar and area plots
+	 */
+	getThreshold: function (threshold) {
+		var axis = this,
+			isLog = axis.isLog;
+
+		var realMin = isLog ? lin2log(axis.min) : axis.min,
+			realMax = isLog ? lin2log(axis.max) : axis.max;
+		
+		if (realMin > threshold || threshold === null) {
+			threshold = realMin;
+		} else if (realMax < threshold) {
+			threshold = realMax;
+		}
+
+		return axis.translate(threshold, 0, 1, 0, 1);
+	},
+
+	addPlotBand: function (options) {
+		this.addPlotBandOrLine(options, 'plotBands');
+	},
+	
+	addPlotLine: function (options) {
+		this.addPlotBandOrLine(options, 'plotLines');
+	},
+
+	/**
+	 * Add a plot band or plot line after render time
+	 *
+	 * @param options {Object} The plotBand or plotLine configuration object
+	 */
+	addPlotBandOrLine: function (options, coll) {
+		var obj = new PlotLineOrBand(this, options).render(),
+			userOptions = this.userOptions;
+
+		if (obj) { // #2189
+			// Add it to the user options for exporting and Axis.update
+			if (coll) {
+				userOptions[coll] = userOptions[coll] || [];
+				userOptions[coll].push(options); 
+			}
+			this.plotLinesAndBands.push(obj); 
+		}
+		
+		return obj;
+	},
+
+	/**
+	 * Compute auto alignment for the axis label based on which side the axis is on 
+	 * and the given rotation for the label
+	 */
+	autoLabelAlign: function (rotation) {
+		var ret, 
+			angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360;
+
+		if (angle > 15 && angle < 165) {
+			ret = 'right';
+		} else if (angle > 195 && angle < 345) {
+			ret = 'left';
+		} else {
+			ret = 'center';
+		}
+		return ret;
+	},
+
+	/**
+	 * Render the tick labels to a preliminary position to get their sizes
+	 */
+	getOffset: function () {
+		var axis = this,
+			chart = axis.chart,
+			renderer = chart.renderer,
+			options = axis.options,
+			tickPositions = axis.tickPositions,
+			ticks = axis.ticks,
+			horiz = axis.horiz,
+			side = axis.side,
+			invertedSide = chart.inverted ? [1, 0, 3, 2][side] : side,
+			hasData,
+			showAxis,
+			titleOffset = 0,
+			titleOffsetOption,
+			titleMargin = 0,
+			axisTitleOptions = options.title,
+			labelOptions = options.labels,
+			labelOffset = 0, // reset
+			axisOffset = chart.axisOffset,
+			clipOffset = chart.clipOffset,
+			directionFactor = [-1, 1, 1, -1][side],
+			n,
+			i,
+			autoStaggerLines = 1,
+			maxStaggerLines = pick(labelOptions.maxStaggerLines, 5),
+			sortedPositions,
+			lastRight,
+			overlap,
+			pos,
+			bBox,
+			x,
+			w,
+			lineNo;
+			
+		// For reuse in Axis.render
+		axis.hasData = hasData = (axis.hasVisibleSeries || (defined(axis.min) && defined(axis.max) && !!tickPositions));
+		axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);
+
+		// Set/reset staggerLines
+		axis.staggerLines = axis.horiz && labelOptions.staggerLines;
+		
+		// Create the axisGroup and gridGroup elements on first iteration
+		if (!axis.axisGroup) {
+			axis.gridGroup = renderer.g('grid')
+				.attr({ zIndex: options.gridZIndex || 1 })
+				.add();
+			axis.axisGroup = renderer.g('axis')
+				.attr({ zIndex: options.zIndex || 2 })
+				.add();
+			axis.labelGroup = renderer.g('axis-labels')
+				.attr({ zIndex: labelOptions.zIndex || 7 })
+				.add();
+		}
+
+		if (hasData || axis.isLinked) {
+			
+			// Set the explicit or automatic label alignment
+			axis.labelAlign = pick(labelOptions.align || axis.autoLabelAlign(labelOptions.rotation));
+
+			each(tickPositions, function (pos) {
+				if (!ticks[pos]) {
+					ticks[pos] = new Tick(axis, pos);
+				} else {
+					ticks[pos].addLabel(); // update labels depending on tick interval
+				}
+			});
+
+			// Handle automatic stagger lines
+			if (axis.horiz && !axis.staggerLines && maxStaggerLines && !labelOptions.rotation) {
+				sortedPositions = axis.reversed ? [].concat(tickPositions).reverse() : tickPositions;
+				while (autoStaggerLines < maxStaggerLines) {
+					lastRight = [];
+					overlap = false;
+					
+					for (i = 0; i < sortedPositions.length; i++) {
+						pos = sortedPositions[i];
+						bBox = ticks[pos].label && ticks[pos].label.getBBox();
+						w = bBox ? bBox.width : 0;
+						lineNo = i % autoStaggerLines;
+						
+						if (w) {
+							x = axis.translate(pos); // don't handle log
+							if (lastRight[lineNo] !== UNDEFINED && x < lastRight[lineNo]) {
+								overlap = true;
+							}
+							lastRight[lineNo] = x + w;
+						}
+					}
+					if (overlap) {
+						autoStaggerLines++;
+					} else {
+						break;
+					}
+				}
+
+				if (autoStaggerLines > 1) {
+					axis.staggerLines = autoStaggerLines;
+				}
+			}
+
+
+			each(tickPositions, function (pos) {
+				// left side must be align: right and right side must have align: left for labels
+				if (side === 0 || side === 2 || { 1: 'left', 3: 'right' }[side] === axis.labelAlign) {
+
+					// get the highest offset
+					labelOffset = mathMax(
+						ticks[pos].getLabelSize(),
+						labelOffset
+					);
+				}
+
+			});
+			if (axis.staggerLines) {
+				labelOffset *= axis.staggerLines;
+				axis.labelOffset = labelOffset;
+			}
+			
+
+		} else { // doesn't have data
+			for (n in ticks) {
+				ticks[n].destroy();
+				delete ticks[n];
+			}
+		}
+
+		if (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) { 
+			if (!axis.axisTitle) {
+				axis.axisTitle = renderer.text(
+					axisTitleOptions.text,
+					0,
+					0,
+					axisTitleOptions.useHTML
+				)
+				.attr({
+					zIndex: 7,
+					rotation: axisTitleOptions.rotation || 0,
+					align:
+						axisTitleOptions.textAlign ||
+						{ low: 'left', middle: 'center', high: 'right' }[axisTitleOptions.align]
+				})
+				.css(axisTitleOptions.style)
+				.add(axis.axisGroup);
+				axis.axisTitle.isNew = true;
+			}
+
+			if (showAxis) {
+				titleOffset = axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];
+				titleMargin = pick(axisTitleOptions.margin, horiz ? 5 : 10);
+				titleOffsetOption = axisTitleOptions.offset;
+			}
+
+			// hide or show the title depending on whether showEmpty is set
+			axis.axisTitle[showAxis ? 'show' : 'hide']();
+		}
+		
+		// handle automatic or user set offset
+		axis.offset = directionFactor * pick(options.offset, axisOffset[side]);
+		
+		axis.axisTitleMargin =
+			pick(titleOffsetOption,
+				labelOffset + titleMargin +
+				(side !== 2 && labelOffset && directionFactor * options.labels[horiz ? 'y' : 'x'])
+			);
+
+		axisOffset[side] = mathMax(
+			axisOffset[side],
+			axis.axisTitleMargin + titleOffset + directionFactor * axis.offset
+		);
+		clipOffset[invertedSide] = mathMax(clipOffset[invertedSide], mathFloor(options.lineWidth / 2) * 2);
+	},
+	
+	/**
+	 * Get the path for the axis line
+	 */
+	getLinePath: function (lineWidth) {
+		var chart = this.chart,
+			opposite = this.opposite,
+			offset = this.offset,
+			horiz = this.horiz,
+			lineLeft = this.left + (opposite ? this.width : 0) + offset,
+			lineTop = chart.chartHeight - this.bottom - (opposite ? this.height : 0) + offset;
+			
+		if (opposite) {
+			lineWidth *= -1; // crispify the other way - #1480, #1687
+		}
+
+		return chart.renderer.crispLine([
+				M,
+				horiz ?
+					this.left :
+					lineLeft,
+				horiz ?
+					lineTop :
+					this.top,
+				L,
+				horiz ?
+					chart.chartWidth - this.right :
+					lineLeft,
+				horiz ?
+					lineTop :
+					chart.chartHeight - this.bottom
+			], lineWidth);
+	},
+	
+	/**
+	 * Position the title
+	 */
+	getTitlePosition: function () {
+		// compute anchor points for each of the title align options
+		var horiz = this.horiz,
+			axisLeft = this.left,
+			axisTop = this.top,
+			axisLength = this.len,
+			axisTitleOptions = this.options.title,			
+			margin = horiz ? axisLeft : axisTop,
+			opposite = this.opposite,
+			offset = this.offset,
+			fontSize = pInt(axisTitleOptions.style.fontSize || 12),
+			
+			// the position in the length direction of the axis
+			alongAxis = {
+				low: margin + (horiz ? 0 : axisLength),
+				middle: margin + axisLength / 2,
+				high: margin + (horiz ? axisLength : 0)
+			}[axisTitleOptions.align],
+	
+			// the position in the perpendicular direction of the axis
+			offAxis = (horiz ? axisTop + this.height : axisLeft) +
+				(horiz ? 1 : -1) * // horizontal axis reverses the margin
+				(opposite ? -1 : 1) * // so does opposite axes
+				this.axisTitleMargin +
+				(this.side === 2 ? fontSize : 0);
+
+		return {
+			x: horiz ?
+				alongAxis :
+				offAxis + (opposite ? this.width : 0) + offset +
+					(axisTitleOptions.x || 0), // x
+			y: horiz ?
+				offAxis - (opposite ? this.height : 0) + offset :
+				alongAxis + (axisTitleOptions.y || 0) // y
+		};
+	},
+	
+	/**
+	 * Render the axis
+	 */
+	render: function () {
+		var axis = this,
+			chart = axis.chart,
+			renderer = chart.renderer,
+			options = axis.options,
+			isLog = axis.isLog,
+			isLinked = axis.isLinked,
+			tickPositions = axis.tickPositions,
+			axisTitle = axis.axisTitle,
+			stacks = axis.stacks,
+			ticks = axis.ticks,
+			minorTicks = axis.minorTicks,
+			alternateBands = axis.alternateBands,
+			stackLabelOptions = options.stackLabels,
+			alternateGridColor = options.alternateGridColor,
+			tickmarkOffset = axis.tickmarkOffset,
+			lineWidth = options.lineWidth,
+			linePath,
+			hasRendered = chart.hasRendered,
+			slideInTicks = hasRendered && defined(axis.oldMin) && !isNaN(axis.oldMin),
+			hasData = axis.hasData,
+			showAxis = axis.showAxis,
+			from,
+			to;
+
+		// Mark all elements inActive before we go over and mark the active ones
+		each([ticks, minorTicks, alternateBands], function (coll) {
+			var pos;
+			for (pos in coll) {
+				coll[pos].isActive = false;
+			}
+		});
+
+		// If the series has data draw the ticks. Else only the line and title
+		if (hasData || isLinked) {
+
+			// minor ticks
+			if (axis.minorTickInterval && !axis.categories) {
+				each(axis.getMinorTickPositions(), function (pos) {
+					if (!minorTicks[pos]) {
+						minorTicks[pos] = new Tick(axis, pos, 'minor');
+					}
+
+					// render new ticks in old position
+					if (slideInTicks && minorTicks[pos].isNew) {
+						minorTicks[pos].render(null, true);
+					}
+
+					minorTicks[pos].render(null, false, 1);
+				});
+			}
+
+			// Major ticks. Pull out the first item and render it last so that
+			// we can get the position of the neighbour label. #808.
+			if (tickPositions.length) { // #1300
+				each(tickPositions.slice(1).concat([tickPositions[0]]), function (pos, i) {
+	
+					// Reorganize the indices
+					i = (i === tickPositions.length - 1) ? 0 : i + 1;
+	
+					// linked axes need an extra check to find out if
+					if (!isLinked || (pos >= axis.min && pos <= axis.max)) {
+	
+						if (!ticks[pos]) {
+							ticks[pos] = new Tick(axis, pos);
+						}
+	
+						// render new ticks in old position
+						if (slideInTicks && ticks[pos].isNew) {
+							ticks[pos].render(i, true);
+						}
+	
+						ticks[pos].render(i, false, 1);
+					}
+	
+				});
+				// In a categorized axis, the tick marks are displayed between labels. So
+				// we need to add a tick mark and grid line at the left edge of the X axis.
+				if (tickmarkOffset && axis.min === 0) {
+					if (!ticks[-1]) {
+						ticks[-1] = new Tick(axis, -1, null, true);
+					}
+					ticks[-1].render(-1);
+				}
+				
+			}
+
+			// alternate grid color
+			if (alternateGridColor) {
+				each(tickPositions, function (pos, i) {
+					if (i % 2 === 0 && pos < axis.max) {
+						if (!alternateBands[pos]) {
+							alternateBands[pos] = new PlotLineOrBand(axis);
+						}
+						from = pos + tickmarkOffset; // #949
+						to = tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] + tickmarkOffset : axis.max;
+						alternateBands[pos].options = {
+							from: isLog ? lin2log(from) : from,
+							to: isLog ? lin2log(to) : to,
+							color: alternateGridColor
+						};
+						alternateBands[pos].render();
+						alternateBands[pos].isActive = true;
+					}
+				});
+			}
+
+			// custom plot lines and bands
+			if (!axis._addedPlotLB) { // only first time
+				each((options.plotLines || []).concat(options.plotBands || []), function (plotLineOptions) {
+					axis.addPlotBandOrLine(plotLineOptions);
+				});
+				axis._addedPlotLB = true;
+			}
+
+		} // end if hasData
+
+		// Remove inactive ticks
+		each([ticks, minorTicks, alternateBands], function (coll) {
+			var pos, 
+				i,
+				forDestruction = [],
+				delay = globalAnimation ? globalAnimation.duration || 500 : 0,
+				destroyInactiveItems = function () {
+					i = forDestruction.length;
+					while (i--) {
+						// When resizing rapidly, the same items may be destroyed in different timeouts,
+						// or the may be reactivated
+						if (coll[forDestruction[i]] && !coll[forDestruction[i]].isActive) {
+							coll[forDestruction[i]].destroy();
+							delete coll[forDestruction[i]];
+						}
+					}
+					
+				};
+
+			for (pos in coll) {
+
+				if (!coll[pos].isActive) {
+					// Render to zero opacity
+					coll[pos].render(pos, false, 0);
+					coll[pos].isActive = false;
+					forDestruction.push(pos);
+				}
+			}
+
+			// When the objects are finished fading out, destroy them
+			if (coll === alternateBands || !chart.hasRendered || !delay) {
+				destroyInactiveItems();
+			} else if (delay) {
+				setTimeout(destroyInactiveItems, delay);
+			}
+		});
+
+		// Static items. As the axis group is cleared on subsequent calls
+		// to render, these items are added outside the group.
+		// axis line
+		if (lineWidth) {
+			linePath = axis.getLinePath(lineWidth);
+			if (!axis.axisLine) {
+				axis.axisLine = renderer.path(linePath)
+					.attr({
+						stroke: options.lineColor,
+						'stroke-width': lineWidth,
+						zIndex: 7
+					})
+					.add(axis.axisGroup);
+			} else {
+				axis.axisLine.animate({ d: linePath });
+			}
+
+			// show or hide the line depending on options.showEmpty
+			axis.axisLine[showAxis ? 'show' : 'hide']();
+		}
+
+		if (axisTitle && showAxis) {
+			
+			axisTitle[axisTitle.isNew ? 'attr' : 'animate'](
+				axis.getTitlePosition()
+			);
+			axisTitle.isNew = false;
+		}
+
+		// Stacked totals:
+		if (stackLabelOptions && stackLabelOptions.enabled) {
+			var stackKey, oneStack, stackCategory,
+				stackTotalGroup = axis.stackTotalGroup;
+
+			// Create a separate group for the stack total labels
+			if (!stackTotalGroup) {
+				axis.stackTotalGroup = stackTotalGroup =
+					renderer.g('stack-labels')
+						.attr({
+							visibility: VISIBLE,
+							zIndex: 6
+						})
+						.add();
+			}
+
+			// plotLeft/Top will change when y axis gets wider so we need to translate the
+			// stackTotalGroup at every render call. See bug #506 and #516
+			stackTotalGroup.translate(chart.plotLeft, chart.plotTop);
+
+			// Render each stack total
+			for (stackKey in stacks) {
+				oneStack = stacks[stackKey];
+				for (stackCategory in oneStack) {
+					oneStack[stackCategory].render(stackTotalGroup);
+				}
+			}
+		}
+		// End stacked totals
+
+		axis.isDirty = false;
+	},
+
+	/**
+	 * Remove a plot band or plot line from the chart by id
+	 * @param {Object} id
+	 */
+	removePlotBandOrLine: function (id) {
+		var plotLinesAndBands = this.plotLinesAndBands,
+			options = this.options,
+			userOptions = this.userOptions,
+			i = plotLinesAndBands.length;
+		while (i--) {
+			if (plotLinesAndBands[i].id === id) {
+				plotLinesAndBands[i].destroy();
+			}
+		}
+		each([options.plotLines || [], userOptions.plotLines || [], options.plotBands || [], userOptions.plotBands || []], function (arr) {
+			i = arr.length;
+			while (i--) {
+				if (arr[i].id === id) {
+					erase(arr, arr[i]);
+				}
+			}
+		});
+
+	},
+
+	/**
+	 * Update the axis title by options
+	 */
+	setTitle: function (newTitleOptions, redraw) {
+		this.update({ title: newTitleOptions }, redraw);
+	},
+
+	/**
+	 * Redraw the axis to reflect changes in the data or axis extremes
+	 */
+	redraw: function () {
+		var axis = this,
+			chart = axis.chart,
+			pointer = chart.pointer;
+
+		// hide tooltip and hover states
+		if (pointer.reset) {
+			pointer.reset(true);
+		}
+
+		// render the axis
+		axis.render();
+
+		// move plot lines and bands
+		each(axis.plotLinesAndBands, function (plotLine) {
+			plotLine.render();
+		});
+
+		// mark associated series as dirty and ready for redraw
+		each(axis.series, function (series) {
+			series.isDirty = true;
+		});
+
+	},
+
+	/**
+	 * Build the stacks from top down
+	 */
+	buildStacks: function () {
+		var series = this.series,
+			i = series.length;
+		if (!this.isXAxis) {
+			while (i--) {
+				series[i].setStackedPoints();
+			}
+			// Loop up again to compute percent stack
+			if (this.usePercentage) {
+				for (i = 0; i < series.length; i++) {
+					series[i].setPercentStacks();
+				}
+			}
+		}
+	},
+
+	/**
+	 * Set new axis categories and optionally redraw
+	 * @param {Array} categories
+	 * @param {Boolean} redraw
+	 */
+	setCategories: function (categories, redraw) {
+		this.update({ categories: categories }, redraw);
+	},
+
+	/**
+	 * Destroys an Axis instance.
+	 */
+	destroy: function (keepEvents) {
+		var axis = this,
+			stacks = axis.stacks,
+			stackKey,
+			plotLinesAndBands = axis.plotLinesAndBands,
+			i;
+
+		// Remove the events
+		if (!keepEvents) {
+			removeEvent(axis);
+		}
+
+		// Destroy each stack total
+		for (stackKey in stacks) {
+			destroyObjectProperties(stacks[stackKey]);
+
+			stacks[stackKey] = null;
+		}
+
+		// Destroy collections
+		each([axis.ticks, axis.minorTicks, axis.alternateBands], function (coll) {
+			destroyObjectProperties(coll);
+		});
+		i = plotLinesAndBands.length;
+		while (i--) { // #1975
+			plotLinesAndBands[i].destroy();
+		}
+
+		// Destroy local variables
+		each(['stackTotalGroup', 'axisLine', 'axisGroup', 'gridGroup', 'labelGroup', 'axisTitle'], function (prop) {
+			if (axis[prop]) {
+				axis[prop] = axis[prop].destroy();
+			}
+		});
+	}
+
+	
+}; // end Axis
+
+/**
+ * The tooltip object
+ * @param {Object} chart The chart instance
+ * @param {Object} options Tooltip options
+ */
+function Tooltip() {
+	this.init.apply(this, arguments);
+}
+
+Tooltip.prototype = {
+
+	init: function (chart, options) {
+
+		var borderWidth = options.borderWidth,
+			style = options.style,
+			padding = pInt(style.padding);
+
+		// Save the chart and options
+		this.chart = chart;
+		this.options = options;
+
+		// Keep track of the current series
+		//this.currentSeries = UNDEFINED;
+
+		// List of crosshairs
+		this.crosshairs = [];
+
+		// Current values of x and y when animating
+		this.now = { x: 0, y: 0 };
+
+		// The tooltip is initially hidden
+		this.isHidden = true;
+
+
+		// create the label
+		this.label = chart.renderer.label('', 0, 0, options.shape, null, null, options.useHTML, null, 'tooltip')
+			.attr({
+				padding: padding,
+				fill: options.backgroundColor,
+				'stroke-width': borderWidth,
+				r: options.borderRadius,
+				zIndex: 8
+			})
+			.css(style)
+			.css({ padding: 0 }) // Remove it from VML, the padding is applied as an attribute instead (#1117)
+			.add()
+			.attr({ y: -999 }); // #2301
+
+		// When using canVG the shadow shows up as a gray circle
+		// even if the tooltip is hidden.
+		if (!useCanVG) {
+			this.label.shadow(options.shadow);
+		}
+
+		// Public property for getting the shared state.
+		this.shared = options.shared;
+	},
+
+	/**
+	 * Destroy the tooltip and its elements.
+	 */
+	destroy: function () {
+		each(this.crosshairs, function (crosshair) {
+			if (crosshair) {
+				crosshair.destroy();
+			}
+		});
+
+		// Destroy and clear local variables
+		if (this.label) {
+			this.label = this.label.destroy();
+		}
+		clearTimeout(this.hideTimer);
+		clearTimeout(this.tooltipTimeout);
+	},
+
+	/**
+	 * Provide a soft movement for the tooltip
+	 *
+	 * @param {Number} x
+	 * @param {Number} y
+	 * @private
+	 */
+	move: function (x, y, anchorX, anchorY) {
+		var tooltip = this,
+			now = tooltip.now,
+			animate = tooltip.options.animation !== false && !tooltip.isHidden;
+
+		// get intermediate values for animation
+		extend(now, {
+			x: animate ? (2 * now.x + x) / 3 : x,
+			y: animate ? (now.y + y) / 2 : y,
+			anchorX: animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,
+			anchorY: animate ? (now.anchorY + anchorY) / 2 : anchorY
+		});
+
+		// move to the intermediate value
+		tooltip.label.attr(now);
+
+		
+		// run on next tick of the mouse tracker
+		if (animate && (mathAbs(x - now.x) > 1 || mathAbs(y - now.y) > 1)) {
+		
+			// never allow two timeouts
+			clearTimeout(this.tooltipTimeout);
+			
+			// set the fixed interval ticking for the smooth tooltip
+			this.tooltipTimeout = setTimeout(function () {
+				// The interval function may still be running during destroy, so check that the chart is really there before calling.
+				if (tooltip) {
+					tooltip.move(x, y, anchorX, anchorY);
+				}
+			}, 32);
+			
+		}
+	},
+
+	/**
+	 * Hide the tooltip
+	 */
+	hide: function () {
+		var tooltip = this,
+			hoverPoints;
+		
+		clearTimeout(this.hideTimer); // disallow duplicate timers (#1728, #1766)
+		if (!this.isHidden) {
+			hoverPoints = this.chart.hoverPoints;
+
+			this.hideTimer = setTimeout(function () {
+				tooltip.label.fadeOut();
+				tooltip.isHidden = true;
+			}, pick(this.options.hideDelay, 500));
+
+			// hide previous hoverPoints and set new
+			if (hoverPoints) {
+				each(hoverPoints, function (point) {
+					point.setState();
+				});
+			}
+
+			this.chart.hoverPoints = null;
+		}
+	},
+
+	/**
+	 * Hide the crosshairs
+	 */
+	hideCrosshairs: function () {
+		each(this.crosshairs, function (crosshair) {
+			if (crosshair) {
+				crosshair.hide();
+			}
+		});
+	},
+	
+	/** 
+	 * Extendable method to get the anchor position of the tooltip
+	 * from a point or set of points
+	 */
+	getAnchor: function (points, mouseEvent) {
+		var ret,
+			chart = this.chart,
+			inverted = chart.inverted,
+			plotTop = chart.plotTop,
+			plotX = 0,
+			plotY = 0,
+			yAxis;
+		
+		points = splat(points);
+		
+		// Pie uses a special tooltipPos
+		ret = points[0].tooltipPos;
+		
+		// When tooltip follows mouse, relate the position to the mouse
+		if (this.followPointer && mouseEvent) {
+			if (mouseEvent.chartX === UNDEFINED) {
+				mouseEvent = chart.pointer.normalize(mouseEvent);
+			}
+			ret = [
+				mouseEvent.chartX - chart.plotLeft,
+				mouseEvent.chartY - plotTop
+			];
+		}
+		// When shared, use the average position
+		if (!ret) {
+			each(points, function (point) {
+				yAxis = point.series.yAxis;
+				plotX += point.plotX;
+				plotY += (point.plotLow ? (point.plotLow + point.plotHigh) / 2 : point.plotY) +
+					(!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151
+			});
+			
+			plotX /= points.length;
+			plotY /= points.length;
+			
+			ret = [
+				inverted ? chart.plotWidth - plotY : plotX,
+				this.shared && !inverted && points.length > 1 && mouseEvent ? 
+					mouseEvent.chartY - plotTop : // place shared tooltip next to the mouse (#424)
+					inverted ? chart.plotHeight - plotX : plotY
+			];
+		}
+
+		return map(ret, mathRound);
+	},
+	
+	/**
+	 * Place the tooltip in a chart without spilling over
+	 * and not covering the point it self.
+	 */
+	getPosition: function (boxWidth, boxHeight, point) {
+		
+		// Set up the variables
+		var chart = this.chart,
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop,
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			distance = pick(this.options.distance, 12),
+			pointX = point.plotX,
+			pointY = point.plotY,
+			x = pointX + plotLeft + (chart.inverted ? distance : -boxWidth - distance),
+			y = pointY - boxHeight + plotTop + 15, // 15 means the point is 15 pixels up from the bottom of the tooltip
+			alignedRight;
+	
+		// It is too far to the left, adjust it
+		if (x < 7) {
+			x = plotLeft + mathMax(pointX, 0) + distance;
+		}
+	
+		// Test to see if the tooltip is too far to the right,
+		// if it is, move it back to be inside and then up to not cover the point.
+		if ((x + boxWidth) > (plotLeft + plotWidth)) {
+			x -= (x + boxWidth) - (plotLeft + plotWidth);
+			y = pointY - boxHeight + plotTop - distance;
+			alignedRight = true;
+		}
+	
+		// If it is now above the plot area, align it to the top of the plot area
+		if (y < plotTop + 5) {
+			y = plotTop + 5;
+	
+			// If the tooltip is still covering the point, move it below instead
+			if (alignedRight && pointY >= y && pointY <= (y + boxHeight)) {
+				y = pointY + plotTop + distance; // below
+			}
+		} 
+	
+		// Now if the tooltip is below the chart, move it up. It's better to cover the
+		// point than to disappear outside the chart. #834.
+		if (y + boxHeight > plotTop + plotHeight) {
+			y = mathMax(plotTop, plotTop + plotHeight - boxHeight - distance); // below
+		}
+	
+		return {x: x, y: y};
+	},
+
+	/**
+	 * In case no user defined formatter is given, this will be used. Note that the context
+	 * here is an object holding point, series, x, y etc.
+	 */
+	defaultFormatter: function (tooltip) {
+		var items = this.points || splat(this),
+			series = items[0].series,
+			s;
+
+		// build the header
+		s = [series.tooltipHeaderFormatter(items[0])];
+
+		// build the values
+		each(items, function (item) {
+			series = item.series;
+			s.push((series.tooltipFormatter && series.tooltipFormatter(item)) ||
+				item.point.tooltipFormatter(series.tooltipOptions.pointFormat));
+		});
+
+		// footer
+		s.push(tooltip.options.footerFormat || '');
+
+		return s.join('');
+	},
+
+	/**
+	 * Refresh the tooltip's text and position.
+	 * @param {Object} point
+	 */
+	refresh: function (point, mouseEvent) {
+		var tooltip = this,
+			chart = tooltip.chart,
+			label = tooltip.label,
+			options = tooltip.options,
+			x,
+			y,
+			anchor,
+			textConfig = {},
+			text,
+			pointConfig = [],
+			formatter = options.formatter || tooltip.defaultFormatter,
+			hoverPoints = chart.hoverPoints,
+			borderColor,
+			crosshairsOptions = options.crosshairs,
+			shared = tooltip.shared,
+			currentSeries;
+			
+		clearTimeout(this.hideTimer);
+		
+		// get the reference point coordinates (pie charts use tooltipPos)
+		tooltip.followPointer = splat(point)[0].series.tooltipOptions.followPointer;
+		anchor = tooltip.getAnchor(point, mouseEvent);
+		x = anchor[0];
+		y = anchor[1];
+
+		// shared tooltip, array is sent over
+		if (shared && !(point.series && point.series.noSharedTooltip)) {
+			
+			// hide previous hoverPoints and set new
+			
+			chart.hoverPoints = point;
+			if (hoverPoints) {
+				each(hoverPoints, function (point) {
+					point.setState();
+				});
+			}
+
+			each(point, function (item) {
+				item.setState(HOVER_STATE);
+
+				pointConfig.push(item.getLabelConfig());
+			});
+
+			textConfig = {
+				x: point[0].category,
+				y: point[0].y
+			};
+			textConfig.points = pointConfig;
+			point = point[0];
+
+		// single point tooltip
+		} else {
+			textConfig = point.getLabelConfig();
+		}
+		text = formatter.call(textConfig, tooltip);
+
+		// register the current series
+		currentSeries = point.series;
+
+		// update the inner HTML
+		if (text === false) {
+			this.hide();
+		} else {
+
+			// show it
+			if (tooltip.isHidden) {
+				stop(label);
+				label.attr('opacity', 1).show();
+			}
+
+			// update text
+			label.attr({
+				text: text
+			});
+
+			// set the stroke color of the box
+			borderColor = options.borderColor || point.color || currentSeries.color || '#606060';
+			label.attr({
+				stroke: borderColor
+			});
+			
+			tooltip.updatePosition({ plotX: x, plotY: y });
+		
+			this.isHidden = false;
+		}
+
+		// crosshairs
+		if (crosshairsOptions) {
+			crosshairsOptions = splat(crosshairsOptions); // [x, y]
+
+			var path,
+				i = crosshairsOptions.length,
+				attribs,
+				axis,
+				val,
+				series;
+
+			while (i--) {
+				series = point.series;
+				axis = series[i ? 'yAxis' : 'xAxis'];
+				if (crosshairsOptions[i] && axis) {
+					val = i ? pick(point.stackY, point.y) : point.x; // #814
+					if (axis.isLog) { // #1671
+						val = log2lin(val);
+					}
+					if (i === 1 && series.modifyValue) { // #1205, #2316
+						val = series.modifyValue(val);
+					}
+
+					path = axis.getPlotLinePath(
+						val,
+						1
+					);
+
+					if (tooltip.crosshairs[i]) {
+						tooltip.crosshairs[i].attr({ d: path, visibility: VISIBLE });
+					} else {
+						attribs = {
+							'stroke-width': crosshairsOptions[i].width || 1,
+							stroke: crosshairsOptions[i].color || '#C0C0C0',
+							zIndex: crosshairsOptions[i].zIndex || 2
+						};
+						if (crosshairsOptions[i].dashStyle) {
+							attribs.dashstyle = crosshairsOptions[i].dashStyle;
+						}
+						tooltip.crosshairs[i] = chart.renderer.path(path)
+							.attr(attribs)
+							.add();
+					}
+				}
+			}
+		}
+		fireEvent(chart, 'tooltipRefresh', {
+				text: text,
+				x: x + chart.plotLeft,
+				y: y + chart.plotTop,
+				borderColor: borderColor
+			});
+	},
+	
+	/**
+	 * Find the new position and perform the move
+	 */
+	updatePosition: function (point) {
+		var chart = this.chart,
+			label = this.label, 
+			pos = (this.options.positioner || this.getPosition).call(
+				this,
+				label.width,
+				label.height,
+				point
+			);
+
+		// do the move
+		this.move(
+			mathRound(pos.x), 
+			mathRound(pos.y), 
+			point.plotX + chart.plotLeft, 
+			point.plotY + chart.plotTop
+		);
+	}
+};
+/**
+ * The mouse tracker object. All methods starting with "on" are primary DOM event handlers. 
+ * Subsequent methods should be named differently from what they are doing.
+ * @param {Object} chart The Chart instance
+ * @param {Object} options The root options object
+ */
+function Pointer(chart, options) {
+	this.init(chart, options);
+}
+
+Pointer.prototype = {
+	/**
+	 * Initialize Pointer
+	 */
+	init: function (chart, options) {
+		
+		var chartOptions = options.chart,
+			chartEvents = chartOptions.events,
+			zoomType = useCanVG ? '' : chartOptions.zoomType,
+			inverted = chart.inverted,
+			zoomX,
+			zoomY;
+
+		// Store references
+		this.options = options;
+		this.chart = chart;
+		
+		// Zoom status
+		this.zoomX = zoomX = /x/.test(zoomType);
+		this.zoomY = zoomY = /y/.test(zoomType);
+		this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);
+		this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);
+
+		// Do we need to handle click on a touch device?
+		this.runChartClick = chartEvents && !!chartEvents.click;
+
+		this.pinchDown = [];
+		this.lastValidTouch = {};
+
+		if (options.tooltip.enabled) {
+			chart.tooltip = new Tooltip(chart, options.tooltip);
+		}
+
+		this.setDOMEvents();
+	}, 
+
+	/**
+	 * Add crossbrowser support for chartX and chartY
+	 * @param {Object} e The event object in standard browsers
+	 */
+	normalize: function (e, chartPosition) {
+		var chartX,
+			chartY,
+			ePos;
+
+		// common IE normalizing
+		e = e || win.event;
+		if (!e.target) {
+			e.target = e.srcElement;
+		}
+
+		// Framework specific normalizing (#1165)
+		e = washMouseEvent(e);
+		
+		// iOS
+		ePos = e.touches ? e.touches.item(0) : e;
+
+		// Get mouse position
+		if (!chartPosition) {
+			this.chartPosition = chartPosition = offset(this.chart.container);
+		}
+
+		// chartX and chartY
+		if (ePos.pageX === UNDEFINED) { // IE < 9. #886.
+			chartX = mathMax(e.x, e.clientX - chartPosition.left); // #2005, #2129: the second case is 
+				// for IE10 quirks mode within framesets
+			chartY = e.y;
+		} else {
+			chartX = ePos.pageX - chartPosition.left;
+			chartY = ePos.pageY - chartPosition.top;
+		}
+
+		return extend(e, {
+			chartX: mathRound(chartX),
+			chartY: mathRound(chartY)
+		});
+	},
+
+	/**
+	 * Get the click position in terms of axis values.
+	 *
+	 * @param {Object} e A pointer event
+	 */
+	getCoordinates: function (e) {
+		var coordinates = {
+				xAxis: [],
+				yAxis: []
+			};
+
+		each(this.chart.axes, function (axis) {
+			coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({
+				axis: axis,
+				value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])
+			});
+		});
+		return coordinates;
+	},
+	
+	/**
+	 * Return the index in the tooltipPoints array, corresponding to pixel position in 
+	 * the plot area.
+	 */
+	getIndex: function (e) {
+		var chart = this.chart;
+		return chart.inverted ? 
+			chart.plotHeight + chart.plotTop - e.chartY : 
+			e.chartX - chart.plotLeft;
+	},
+
+	/**
+	 * With line type charts with a single tracker, get the point closest to the mouse.
+	 * Run Point.onMouseOver and display tooltip for the point or points.
+	 */
+	runPointActions: function (e) {
+		var pointer = this,
+			chart = pointer.chart,
+			series = chart.series,
+			tooltip = chart.tooltip,
+			point,
+			points,
+			hoverPoint = chart.hoverPoint,
+			hoverSeries = chart.hoverSeries,
+			i,
+			j,
+			distance = chart.chartWidth,
+			index = pointer.getIndex(e),
+			anchor;
+
+		// shared tooltip
+		if (tooltip && pointer.options.tooltip.shared && !(hoverSeries && hoverSeries.noSharedTooltip)) {
+			points = [];
+
+			// loop over all series and find the ones with points closest to the mouse
+			i = series.length;
+			for (j = 0; j < i; j++) {
+				if (series[j].visible &&
+						series[j].options.enableMouseTracking !== false &&
+						!series[j].noSharedTooltip && series[j].tooltipPoints.length) {
+					point = series[j].tooltipPoints[index];
+					if (point && point.series) { // not a dummy point, #1544
+						point._dist = mathAbs(index - point.clientX);
+						distance = mathMin(distance, point._dist);
+						points.push(point);
+					}
+				}
+			}
+			// remove furthest points
+			i = points.length;
+			while (i--) {
+				if (points[i]._dist > distance) {
+					points.splice(i, 1);
+				}
+			}
+			// refresh the tooltip if necessary
+			if (points.length && (points[0].clientX !== pointer.hoverX)) {
+				tooltip.refresh(points, e);
+				pointer.hoverX = points[0].clientX;
+			}
+		}
+
+		// separate tooltip and general mouse events
+		if (hoverSeries && hoverSeries.tracker) { // only use for line-type series with common tracker
+
+			// get the point
+			point = hoverSeries.tooltipPoints[index];
+
+			// a new point is hovered, refresh the tooltip
+			if (point && point !== hoverPoint) {
+
+				// trigger the events
+				point.onMouseOver(e);
+
+			}
+			
+		} else if (tooltip && tooltip.followPointer && !tooltip.isHidden) {
+			anchor = tooltip.getAnchor([{}], e);
+			tooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });
+		}
+	},
+
+
+
+	/**
+	 * Reset the tracking by hiding the tooltip, the hover series state and the hover point
+	 * 
+	 * @param allowMove {Boolean} Instead of destroying the tooltip altogether, allow moving it if possible
+	 */
+	reset: function (allowMove) {
+		var pointer = this,
+			chart = pointer.chart,
+			hoverSeries = chart.hoverSeries,
+			hoverPoint = chart.hoverPoint,
+			tooltip = chart.tooltip,
+			tooltipPoints = tooltip && tooltip.shared ? chart.hoverPoints : hoverPoint;
+			
+		// Narrow in allowMove
+		allowMove = allowMove && tooltip && tooltipPoints;
+			
+		// Check if the points have moved outside the plot area, #1003
+		if (allowMove && splat(tooltipPoints)[0].plotX === UNDEFINED) {
+			allowMove = false;
+		}	
+
+		// Just move the tooltip, #349
+		if (allowMove) {
+			tooltip.refresh(tooltipPoints);
+
+		// Full reset
+		} else {
+
+			if (hoverPoint) {
+				hoverPoint.onMouseOut();
+			}
+
+			if (hoverSeries) {
+				hoverSeries.onMouseOut();
+			}
+
+			if (tooltip) {
+				tooltip.hide();
+				tooltip.hideCrosshairs();
+			}
+
+			pointer.hoverX = null;
+
+		}
+	},
+
+	/**
+	 * Scale series groups to a certain scale and translation
+	 */
+	scaleGroups: function (attribs, clip) {
+
+		var chart = this.chart,
+			seriesAttribs;
+
+		// Scale each series
+		each(chart.series, function (series) {
+			seriesAttribs = attribs || series.getPlotBox(); // #1701
+			if (series.xAxis && series.xAxis.zoomEnabled) {
+				series.group.attr(seriesAttribs);
+				if (series.markerGroup) {
+					series.markerGroup.attr(seriesAttribs);
+					series.markerGroup.clip(clip ? chart.clipRect : null);
+				}
+				if (series.dataLabelsGroup) {
+					series.dataLabelsGroup.attr(seriesAttribs);
+				}
+			}
+		});
+		
+		// Clip
+		chart.clipRect.attr(clip || chart.clipBox);
+	},
+
+	/**
+	 * Run translation operations for each direction (horizontal and vertical) independently
+	 */
+	pinchTranslateDirection: function (horiz, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {
+		var chart = this.chart,
+			xy = horiz ? 'x' : 'y',
+			XY = horiz ? 'X' : 'Y',
+			sChartXY = 'chart' + XY,
+			wh = horiz ? 'width' : 'height',
+			plotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')],
+			selectionWH,
+			selectionXY,
+			clipXY,
+			scale = 1,
+			inverted = chart.inverted,
+			bounds = chart.bounds[horiz ? 'h' : 'v'],
+			singleTouch = pinchDown.length === 1,
+			touch0Start = pinchDown[0][sChartXY],
+			touch0Now = touches[0][sChartXY],
+			touch1Start = !singleTouch && pinchDown[1][sChartXY],
+			touch1Now = !singleTouch && touches[1][sChartXY],
+			outOfBounds,
+			transformScale,
+			scaleKey,
+			setScale = function () {
+				if (!singleTouch && mathAbs(touch0Start - touch1Start) > 20) { // Don't zoom if fingers are too close on this axis
+					scale = mathAbs(touch0Now - touch1Now) / mathAbs(touch0Start - touch1Start);	
+				}
+				
+				clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;
+				selectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;
+			};
+
+		// Set the scale, first pass
+		setScale();
+
+		selectionXY = clipXY; // the clip position (x or y) is altered if out of bounds, the selection position is not
+
+		// Out of bounds
+		if (selectionXY < bounds.min) {
+			selectionXY = bounds.min;
+			outOfBounds = true;
+		} else if (selectionXY + selectionWH > bounds.max) {
+			selectionXY = bounds.max - selectionWH;
+			outOfBounds = true;
+		}
+		
+		// Is the chart dragged off its bounds, determined by dataMin and dataMax?
+		if (outOfBounds) {
+
+			// Modify the touchNow position in order to create an elastic drag movement. This indicates
+			// to the user that the chart is responsive but can't be dragged further.
+			touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);
+			if (!singleTouch) {
+				touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);
+			}
+
+			// Set the scale, second pass to adapt to the modified touchNow positions
+			setScale();
+
+		} else {
+			lastValidTouch[xy] = [touch0Now, touch1Now];
+		}
+
+		
+		// Set geometry for clipping, selection and transformation
+		if (!inverted) { // TODO: implement clipping for inverted charts
+			clip[xy] = clipXY - plotLeftTop;
+			clip[wh] = selectionWH;
+		}
+		scaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;
+		transformScale = inverted ? 1 / scale : scale;
+
+		selectionMarker[wh] = selectionWH;
+		selectionMarker[xy] = selectionXY;
+		transform[scaleKey] = scale;
+		transform['translate' + XY] = (transformScale * plotLeftTop) + (touch0Now - (transformScale * touch0Start));
+	},
+	
+	/**
+	 * Handle touch events with two touches
+	 */
+	pinch: function (e) {
+
+		var self = this,
+			chart = self.chart,
+			pinchDown = self.pinchDown,
+			followTouchMove = chart.tooltip && chart.tooltip.options.followTouchMove,
+			touches = e.touches,
+			touchesLength = touches.length,
+			lastValidTouch = self.lastValidTouch,
+			zoomHor = self.zoomHor || self.pinchHor,
+			zoomVert = self.zoomVert || self.pinchVert,
+			hasZoom = zoomHor || zoomVert,
+			selectionMarker = self.selectionMarker,
+			transform = {},
+			fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, PREFIX + 'tracker') && 
+				chart.runTrackerClick) || chart.runChartClick),
+			clip = {};
+
+		// On touch devices, only proceed to trigger click if a handler is defined
+		if ((hasZoom || followTouchMove) && !fireClickEvent) {
+			e.preventDefault();
+		}
+		
+		// Normalize each touch
+		map(touches, function (e) {
+			return self.normalize(e);
+		});
+			
+		// Register the touch start position
+		if (e.type === 'touchstart') {
+			each(touches, function (e, i) {
+				pinchDown[i] = { chartX: e.chartX, chartY: e.chartY };
+			});
+			lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];
+			lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];
+
+			// Identify the data bounds in pixels
+			each(chart.axes, function (axis) {
+				if (axis.zoomEnabled) {
+					var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],
+						minPixelPadding = axis.minPixelPadding,
+						min = axis.toPixels(axis.dataMin),
+						max = axis.toPixels(axis.dataMax),
+						absMin = mathMin(min, max),
+						absMax = mathMax(min, max);
+
+					// Store the bounds for use in the touchmove handler
+					bounds.min = mathMin(axis.pos, absMin - minPixelPadding);
+					bounds.max = mathMax(axis.pos + axis.len, absMax + minPixelPadding);
+				}
+			});
+		
+		// Event type is touchmove, handle panning and pinching
+		} else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first
+			
+
+			// Set the marker
+			if (!selectionMarker) {
+				self.selectionMarker = selectionMarker = extend({
+					destroy: noop
+				}, chart.plotBox);
+			}
+
+			
+
+			if (zoomHor) {
+				self.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+			}
+			if (zoomVert) {
+				self.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+			}
+
+			self.hasPinched = hasZoom;
+
+			// Scale and translate the groups to provide visual feedback during pinching
+			self.scaleGroups(transform, clip);
+			
+			// Optionally move the tooltip on touchmove
+			if (!hasZoom && followTouchMove && touchesLength === 1) {
+				this.runPointActions(self.normalize(e));
+			}
+		}
+	},
+
+	/**
+	 * Start a drag operation
+	 */
+	dragStart: function (e) {
+		var chart = this.chart;
+
+		// Record the start position
+		chart.mouseIsDown = e.type;
+		chart.cancelClick = false;
+		chart.mouseDownX = this.mouseDownX = e.chartX;
+		chart.mouseDownY = this.mouseDownY = e.chartY;
+	},
+
+	/**
+	 * Perform a drag operation in response to a mousemove event while the mouse is down
+	 */
+	drag: function (e) {
+
+		var chart = this.chart,
+			chartOptions = chart.options.chart,
+			chartX = e.chartX,
+			chartY = e.chartY,
+			zoomHor = this.zoomHor,
+			zoomVert = this.zoomVert,
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop,
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			clickedInside,
+			size,
+			mouseDownX = this.mouseDownX,
+			mouseDownY = this.mouseDownY;
+
+		// If the mouse is outside the plot area, adjust to cooordinates
+		// inside to prevent the selection marker from going outside
+		if (chartX < plotLeft) {
+			chartX = plotLeft;
+		} else if (chartX > plotLeft + plotWidth) {
+			chartX = plotLeft + plotWidth;
+		}
+
+		if (chartY < plotTop) {
+			chartY = plotTop;
+		} else if (chartY > plotTop + plotHeight) {
+			chartY = plotTop + plotHeight;
+		}
+		
+		// determine if the mouse has moved more than 10px
+		this.hasDragged = Math.sqrt(
+			Math.pow(mouseDownX - chartX, 2) +
+			Math.pow(mouseDownY - chartY, 2)
+		);
+		if (this.hasDragged > 10) {
+			clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);
+
+			// make a selection
+			if (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside) {
+				if (!this.selectionMarker) {
+					this.selectionMarker = chart.renderer.rect(
+						plotLeft,
+						plotTop,
+						zoomHor ? 1 : plotWidth,
+						zoomVert ? 1 : plotHeight,
+						0
+					)
+					.attr({
+						fill: chartOptions.selectionMarkerFill || 'rgba(69,114,167,0.25)',
+						zIndex: 7
+					})
+					.add();
+				}
+			}
+
+			// adjust the width of the selection marker
+			if (this.selectionMarker && zoomHor) {
+				size = chartX - mouseDownX;
+				this.selectionMarker.attr({
+					width: mathAbs(size),
+					x: (size > 0 ? 0 : size) + mouseDownX
+				});
+			}
+			// adjust the height of the selection marker
+			if (this.selectionMarker && zoomVert) {
+				size = chartY - mouseDownY;
+				this.selectionMarker.attr({
+					height: mathAbs(size),
+					y: (size > 0 ? 0 : size) + mouseDownY
+				});
+			}
+
+			// panning
+			if (clickedInside && !this.selectionMarker && chartOptions.panning) {
+				chart.pan(e, chartOptions.panning);
+			}
+		}
+	},
+
+	/**
+	 * On mouse up or touch end across the entire document, drop the selection.
+	 */
+	drop: function (e) {
+		var chart = this.chart,
+			hasPinched = this.hasPinched;
+
+		if (this.selectionMarker) {
+			var selectionData = {
+					xAxis: [],
+					yAxis: [],
+					originalEvent: e.originalEvent || e
+				},
+				selectionBox = this.selectionMarker,
+				selectionLeft = selectionBox.x,
+				selectionTop = selectionBox.y,
+				runZoom;
+			// a selection has been made
+			if (this.hasDragged || hasPinched) {
+
+				// record each axis' min and max
+				each(chart.axes, function (axis) {
+					if (axis.zoomEnabled) {
+						var horiz = axis.horiz,
+							selectionMin = axis.toValue((horiz ? selectionLeft : selectionTop)),
+							selectionMax = axis.toValue((horiz ? selectionLeft + selectionBox.width : selectionTop + selectionBox.height));
+
+						if (!isNaN(selectionMin) && !isNaN(selectionMax)) { // #859
+							selectionData[axis.xOrY + 'Axis'].push({
+								axis: axis,
+								min: mathMin(selectionMin, selectionMax), // for reversed axes,
+								max: mathMax(selectionMin, selectionMax)
+							});
+							runZoom = true;
+						}
+					}
+				});
+				if (runZoom) {
+					fireEvent(chart, 'selection', selectionData, function (args) { 
+						chart.zoom(extend(args, hasPinched ? { animation: false } : null)); 
+					});
+				}
+
+			}
+			this.selectionMarker = this.selectionMarker.destroy();
+
+			// Reset scaling preview
+			if (hasPinched) {
+				this.scaleGroups();
+			}
+		}
+
+		// Reset all
+		if (chart) { // it may be destroyed on mouse up - #877
+			css(chart.container, { cursor: chart._cursor });
+			chart.cancelClick = this.hasDragged > 10; // #370
+			chart.mouseIsDown = this.hasDragged = this.hasPinched = false;
+			this.pinchDown = [];
+		}
+	},
+
+	onContainerMouseDown: function (e) {
+
+		e = this.normalize(e);
+
+		// issue #295, dragging not always working in Firefox
+		if (e.preventDefault) {
+			e.preventDefault();
+		}
+		
+		this.dragStart(e);
+	},
+
+	
+
+	onDocumentMouseUp: function (e) {
+		this.drop(e);
+	},
+
+	/**
+	 * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.
+	 * Issue #149 workaround. The mouseleave event does not always fire. 
+	 */
+	onDocumentMouseMove: function (e) {
+		var chart = this.chart,
+			chartPosition = this.chartPosition,
+			hoverSeries = chart.hoverSeries;
+
+		e = this.normalize(e, chartPosition);
+
+		// If we're outside, hide the tooltip
+		if (chartPosition && hoverSeries && !this.inClass(e.target, 'highcharts-tracker') &&
+				!chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+			this.reset();
+		}
+	},
+
+	/**
+	 * When mouse leaves the container, hide the tooltip.
+	 */
+	onContainerMouseLeave: function () {
+		this.reset();
+		this.chartPosition = null; // also reset the chart position, used in #149 fix
+	},
+
+	// The mousemove, touchmove and touchstart event handler
+	onContainerMouseMove: function (e) {
+
+		var chart = this.chart;
+
+		// normalize
+		e = this.normalize(e);
+
+		// #295
+		e.returnValue = false;
+		
+		
+		if (chart.mouseIsDown === 'mousedown') {
+			this.drag(e);
+		} 
+		
+		// Show the tooltip and run mouse over events (#977)
+		if ((this.inClass(e.target, 'highcharts-tracker') || 
+				chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) && !chart.openMenu) {
+			this.runPointActions(e);
+		}
+	},
+
+	/**
+	 * Utility to detect whether an element has, or has a parent with, a specific
+	 * class name. Used on detection of tracker objects and on deciding whether
+	 * hovering the tooltip should cause the active series to mouse out.
+	 */
+	inClass: function (element, className) {
+		var elemClassName;
+		while (element) {
+			elemClassName = attr(element, 'class');
+			if (elemClassName) {
+				if (elemClassName.indexOf(className) !== -1) {
+					return true;
+				} else if (elemClassName.indexOf(PREFIX + 'container') !== -1) {
+					return false;
+				}
+			}
+			element = element.parentNode;
+		}		
+	},
+
+	onTrackerMouseOut: function (e) {
+		var series = this.chart.hoverSeries;
+		if (series && !series.options.stickyTracking && !this.inClass(e.toElement || e.relatedTarget, PREFIX + 'tooltip')) {
+			series.onMouseOut();
+		}
+	},
+
+	onContainerClick: function (e) {
+		var chart = this.chart,
+			hoverPoint = chart.hoverPoint, 
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop,
+			inverted = chart.inverted,
+			chartPosition,
+			plotX,
+			plotY;
+		
+		e = this.normalize(e);
+		e.cancelBubble = true; // IE specific
+
+		if (!chart.cancelClick) {
+			
+			// On tracker click, fire the series and point events. #783, #1583
+			if (hoverPoint && this.inClass(e.target, PREFIX + 'tracker')) {
+				chartPosition = this.chartPosition;
+				plotX = hoverPoint.plotX;
+				plotY = hoverPoint.plotY;
+
+				// add page position info
+				extend(hoverPoint, {
+					pageX: chartPosition.left + plotLeft +
+						(inverted ? chart.plotWidth - plotY : plotX),
+					pageY: chartPosition.top + plotTop +
+						(inverted ? chart.plotHeight - plotX : plotY)
+				});
+			
+				// the series click event
+				fireEvent(hoverPoint.series, 'click', extend(e, {
+					point: hoverPoint
+				}));
+
+				// the point click event
+				if (chart.hoverPoint) { // it may be destroyed (#1844)
+					hoverPoint.firePointEvent('click', e);
+				}
+
+			// When clicking outside a tracker, fire a chart event
+			} else {
+				extend(e, this.getCoordinates(e));
+
+				// fire a click event in the chart
+				if (chart.isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) {
+					fireEvent(chart, 'click', e);
+				}
+			}
+
+
+		}
+	},
+
+	onContainerTouchStart: function (e) {
+		var chart = this.chart;
+
+		if (e.touches.length === 1) {
+
+			e = this.normalize(e);
+
+			if (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+
+				// Prevent the click pseudo event from firing unless it is set in the options
+				/*if (!chart.runChartClick) {
+					e.preventDefault();
+				}*/
+			
+				// Run mouse events and display tooltip etc
+				this.runPointActions(e);
+
+				this.pinch(e);
+
+			} else {
+				// Hide the tooltip on touching outside the plot area (#1203)
+				this.reset();
+			}
+
+		} else if (e.touches.length === 2) {
+			this.pinch(e);
+		}		
+	},
+
+	onContainerTouchMove: function (e) {
+		if (e.touches.length === 1 || e.touches.length === 2) {
+			this.pinch(e);
+		}
+	},
+
+	onDocumentTouchEnd: function (e) {
+		this.drop(e);
+	},
+
+	/**
+	 * Set the JS DOM events on the container and document. This method should contain
+	 * a one-to-one assignment between methods and their handlers. Any advanced logic should
+	 * be moved to the handler reflecting the event's name.
+	 */
+	setDOMEvents: function () {
+
+		var pointer = this,
+			container = pointer.chart.container,
+			events;
+
+		this._events = events = [
+			[container, 'onmousedown', 'onContainerMouseDown'],
+			[container, 'onmousemove', 'onContainerMouseMove'],
+			[container, 'onclick', 'onContainerClick'],
+			[container, 'mouseleave', 'onContainerMouseLeave'],
+			[doc, 'mousemove', 'onDocumentMouseMove'],
+			[doc, 'mouseup', 'onDocumentMouseUp']
+		];
+
+		if (hasTouch) {
+			events.push(
+				[container, 'ontouchstart', 'onContainerTouchStart'],
+				[container, 'ontouchmove', 'onContainerTouchMove'],
+				[doc, 'touchend', 'onDocumentTouchEnd']
+			);
+		}
+
+		each(events, function (eventConfig) {
+
+			// First, create the callback function that in turn calls the method on Pointer
+			pointer['_' + eventConfig[2]] = function (e) {
+				pointer[eventConfig[2]](e);
+			};
+
+			// Now attach the function, either as a direct property or through addEvent
+			if (eventConfig[1].indexOf('on') === 0) {
+				eventConfig[0][eventConfig[1]] = pointer['_' + eventConfig[2]];
+			} else {
+				addEvent(eventConfig[0], eventConfig[1], pointer['_' + eventConfig[2]]);
+			}
+		});
+
+		
+	},
+
+	/**
+	 * Destroys the Pointer object and disconnects DOM events.
+	 */
+	destroy: function () {
+		var pointer = this;
+
+		// Release all DOM events
+		each(pointer._events, function (eventConfig) {	
+			if (eventConfig[1].indexOf('on') === 0) {
+				eventConfig[0][eventConfig[1]] = null; // delete breaks oldIE
+			} else {		
+				removeEvent(eventConfig[0], eventConfig[1], pointer['_' + eventConfig[2]]);
+			}
+		});
+		delete pointer._events;
+
+		// memory and CPU leak
+		clearInterval(pointer.tooltipTimeout);
+	}
+};
+/**
+ * The overview of the chart's series
+ */
+function Legend(chart, options) {
+	this.init(chart, options);
+}
+
+Legend.prototype = {
+	
+	/**
+	 * Initialize the legend
+	 */
+	init: function (chart, options) {
+		
+		var legend = this,
+			itemStyle = options.itemStyle,
+			padding = pick(options.padding, 8),
+			itemMarginTop = options.itemMarginTop || 0;
+	
+		this.options = options;
+
+		if (!options.enabled) {
+			return;
+		}
+	
+		legend.baseline = pInt(itemStyle.fontSize) + 3 + itemMarginTop; // used in Series prototype
+		legend.itemStyle = itemStyle;
+		legend.itemHiddenStyle = merge(itemStyle, options.itemHiddenStyle);
+		legend.itemMarginTop = itemMarginTop;
+		legend.padding = padding;
+		legend.initialItemX = padding;
+		legend.initialItemY = padding - 5; // 5 is the number of pixels above the text
+		legend.maxItemWidth = 0;
+		legend.chart = chart;
+		legend.itemHeight = 0;
+		legend.lastLineHeight = 0;
+
+		// Render it
+		legend.render();
+
+		// move checkboxes
+		addEvent(legend.chart, 'endResize', function () { 
+			legend.positionCheckboxes();
+		});
+
+	},
+
+	/**
+	 * Set the colors for the legend item
+	 * @param {Object} item A Series or Point instance
+	 * @param {Object} visible Dimmed or colored
+	 */
+	colorizeItem: function (item, visible) {
+		var legend = this,
+			options = legend.options,
+			legendItem = item.legendItem,
+			legendLine = item.legendLine,
+			legendSymbol = item.legendSymbol,
+			hiddenColor = legend.itemHiddenStyle.color,
+			textColor = visible ? options.itemStyle.color : hiddenColor,
+			symbolColor = visible ? item.color : hiddenColor,
+			markerOptions = item.options && item.options.marker,
+			symbolAttr = {
+				stroke: symbolColor,
+				fill: symbolColor
+			},
+			key,
+			val;
+		
+		if (legendItem) {
+			legendItem.css({ fill: textColor, color: textColor }); // color for #1553, oldIE
+		}
+		if (legendLine) {
+			legendLine.attr({ stroke: symbolColor });
+		}
+		
+		if (legendSymbol) {
+			
+			// Apply marker options
+			if (markerOptions && legendSymbol.isMarker) { // #585
+				markerOptions = item.convertAttribs(markerOptions);
+				for (key in markerOptions) {
+					val = markerOptions[key];
+					if (val !== UNDEFINED) {
+						symbolAttr[key] = val;
+					}
+				}
+			}
+
+			legendSymbol.attr(symbolAttr);
+		}
+	},
+
+	/**
+	 * Position the legend item
+	 * @param {Object} item A Series or Point instance
+	 */
+	positionItem: function (item) {
+		var legend = this,
+			options = legend.options,
+			symbolPadding = options.symbolPadding,
+			ltr = !options.rtl,
+			legendItemPos = item._legendItemPos,
+			itemX = legendItemPos[0],
+			itemY = legendItemPos[1],
+			checkbox = item.checkbox;
+
+		if (item.legendGroup) {
+			item.legendGroup.translate(
+				ltr ? itemX : legend.legendWidth - itemX - 2 * symbolPadding - 4,
+				itemY
+			);
+		}
+
+		if (checkbox) {
+			checkbox.x = itemX;
+			checkbox.y = itemY;
+		}
+	},
+
+	/**
+	 * Destroy a single legend item
+	 * @param {Object} item The series or point
+	 */
+	destroyItem: function (item) {
+		var checkbox = item.checkbox;
+
+		// destroy SVG elements
+		each(['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'], function (key) {
+			if (item[key]) {
+				item[key] = item[key].destroy();
+			}
+		});
+
+		if (checkbox) {
+			discardElement(item.checkbox);
+		}
+	},
+
+	/**
+	 * Destroys the legend.
+	 */
+	destroy: function () {
+		var legend = this,
+			legendGroup = legend.group,
+			box = legend.box;
+
+		if (box) {
+			legend.box = box.destroy();
+		}
+
+		if (legendGroup) {
+			legend.group = legendGroup.destroy();
+		}
+	},
+
+	/**
+	 * Position the checkboxes after the width is determined
+	 */
+	positionCheckboxes: function (scrollOffset) {
+		var alignAttr = this.group.alignAttr,
+			translateY,
+			clipHeight = this.clipHeight || this.legendHeight;
+
+		if (alignAttr) {
+			translateY = alignAttr.translateY;
+			each(this.allItems, function (item) {
+				var checkbox = item.checkbox,
+					top;
+				
+				if (checkbox) {
+					top = (translateY + checkbox.y + (scrollOffset || 0) + 3);
+					css(checkbox, {
+						left: (alignAttr.translateX + item.legendItemWidth + checkbox.x - 20) + PX,
+						top: top + PX,
+						display: top > translateY - 6 && top < translateY + clipHeight - 6 ? '' : NONE
+					});
+				}
+			});
+		}
+	},
+	
+	/**
+	 * Render the legend title on top of the legend
+	 */
+	renderTitle: function () {
+		var options = this.options,
+			padding = this.padding,
+			titleOptions = options.title,
+			titleHeight = 0,
+			bBox;
+		
+		if (titleOptions.text) {
+			if (!this.title) {
+				this.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, null, null, null, null, null, 'legend-title')
+					.attr({ zIndex: 1 })
+					.css(titleOptions.style)
+					.add(this.group);
+			}
+			bBox = this.title.getBBox();
+			titleHeight = bBox.height;
+			this.offsetWidth = bBox.width; // #1717
+			this.contentGroup.attr({ translateY: titleHeight });
+		}
+		this.titleHeight = titleHeight;
+	},
+
+	/**
+	 * Render a single specific legend item
+	 * @param {Object} item A series or point
+	 */
+	renderItem: function (item) {
+		var legend = this,
+			chart = legend.chart,
+			renderer = chart.renderer,
+			options = legend.options,
+			horizontal = options.layout === 'horizontal',
+			symbolWidth = options.symbolWidth,
+			symbolPadding = options.symbolPadding,
+			itemStyle = legend.itemStyle,
+			itemHiddenStyle = legend.itemHiddenStyle,
+			padding = legend.padding,
+			itemDistance = horizontal ? pick(options.itemDistance, 8) : 0,
+			ltr = !options.rtl,
+			itemHeight,
+			widthOption = options.width,
+			itemMarginBottom = options.itemMarginBottom || 0,
+			itemMarginTop = legend.itemMarginTop,
+			initialItemX = legend.initialItemX,
+			bBox,
+			itemWidth,
+			li = item.legendItem,
+			series = item.series || item,
+			itemOptions = series.options,
+			showCheckbox = itemOptions.showCheckbox,
+			useHTML = options.useHTML;
+
+		if (!li) { // generate it once, later move it
+
+			// Generate the group box
+			// A group to hold the symbol and text. Text is to be appended in Legend class.
+			item.legendGroup = renderer.g('legend-item')
+				.attr({ zIndex: 1 })
+				.add(legend.scrollGroup);
+
+			// Draw the legend symbol inside the group box
+			series.drawLegendSymbol(legend, item);
+
+			// Generate the list item text and add it to the group
+			item.legendItem = li = renderer.text(
+					options.labelFormat ? format(options.labelFormat, item) : options.labelFormatter.call(item),
+					ltr ? symbolWidth + symbolPadding : -symbolPadding,
+					legend.baseline,
+					useHTML
+				)
+				.css(merge(item.visible ? itemStyle : itemHiddenStyle)) // merge to prevent modifying original (#1021)
+				.attr({
+					align: ltr ? 'left' : 'right',
+					zIndex: 2
+				})
+				.add(item.legendGroup);
+
+			// Set the events on the item group, or in case of useHTML, the item itself (#1249)
+			(useHTML ? li : item.legendGroup).on('mouseover', function () {
+					item.setState(HOVER_STATE);
+					li.css(legend.options.itemHoverStyle);
+				})
+				.on('mouseout', function () {
+					li.css(item.visible ? itemStyle : itemHiddenStyle);
+					item.setState();
+				})
+				.on('click', function (event) {
+					var strLegendItemClick = 'legendItemClick',
+						fnLegendItemClick = function () {
+							item.setVisible();
+						};
+						
+					// Pass over the click/touch event. #4.
+					event = {
+						browserEvent: event
+					};
+
+					// click the name or symbol
+					if (item.firePointEvent) { // point
+						item.firePointEvent(strLegendItemClick, event, fnLegendItemClick);
+					} else {
+						fireEvent(item, strLegendItemClick, event, fnLegendItemClick);
+					}
+				});
+
+			// Colorize the items
+			legend.colorizeItem(item, item.visible);
+
+			// add the HTML checkbox on top
+			if (itemOptions && showCheckbox) {
+				item.checkbox = createElement('input', {
+					type: 'checkbox',
+					checked: item.selected,
+					defaultChecked: item.selected // required by IE7
+				}, options.itemCheckboxStyle, chart.container);
+
+				addEvent(item.checkbox, 'click', function (event) {
+					var target = event.target;
+					fireEvent(item, 'checkboxClick', {
+							checked: target.checked
+						},
+						function () {
+							item.select();
+						}
+					);
+				});
+			}
+		}
+
+		// calculate the positions for the next line
+		bBox = li.getBBox();
+
+		itemWidth = item.legendItemWidth =
+			options.itemWidth || symbolWidth + symbolPadding + bBox.width + itemDistance +
+			(showCheckbox ? 20 : 0);
+		legend.itemHeight = itemHeight = bBox.height;
+
+		// if the item exceeds the width, start a new line
+		if (horizontal && legend.itemX - initialItemX + itemWidth >
+				(widthOption || (chart.chartWidth - 2 * padding - initialItemX))) {
+			legend.itemX = initialItemX;
+			legend.itemY += itemMarginTop + legend.lastLineHeight + itemMarginBottom;
+			legend.lastLineHeight = 0; // reset for next line
+		}
+
+		// If the item exceeds the height, start a new column
+		/*if (!horizontal && legend.itemY + options.y + itemHeight > chart.chartHeight - spacingTop - spacingBottom) {
+			legend.itemY = legend.initialItemY;
+			legend.itemX += legend.maxItemWidth;
+			legend.maxItemWidth = 0;
+		}*/
+
+		// Set the edge positions
+		legend.maxItemWidth = mathMax(legend.maxItemWidth, itemWidth);
+		legend.lastItemY = itemMarginTop + legend.itemY + itemMarginBottom;
+		legend.lastLineHeight = mathMax(itemHeight, legend.lastLineHeight); // #915
+
+		// cache the position of the newly generated or reordered items
+		item._legendItemPos = [legend.itemX, legend.itemY];
+
+		// advance
+		if (horizontal) {
+			legend.itemX += itemWidth;
+
+		} else {
+			legend.itemY += itemMarginTop + itemHeight + itemMarginBottom;
+			legend.lastLineHeight = itemHeight;
+		}
+
+		// the width of the widest item
+		legend.offsetWidth = widthOption || mathMax(
+			(horizontal ? legend.itemX - initialItemX - itemDistance : itemWidth) + padding,
+			legend.offsetWidth
+		);
+	},
+
+	/**
+	 * Render the legend. This method can be called both before and after
+	 * chart.render. If called after, it will only rearrange items instead
+	 * of creating new ones.
+	 */
+	render: function () {
+		var legend = this,
+			chart = legend.chart,
+			renderer = chart.renderer,
+			legendGroup = legend.group,
+			allItems,
+			display,
+			legendWidth,
+			legendHeight,
+			box = legend.box,
+			options = legend.options,
+			padding = legend.padding,
+			legendBorderWidth = options.borderWidth,
+			legendBackgroundColor = options.backgroundColor;
+
+		legend.itemX = legend.initialItemX;
+		legend.itemY = legend.initialItemY;
+		legend.offsetWidth = 0;
+		legend.lastItemY = 0;
+
+		if (!legendGroup) {
+			legend.group = legendGroup = renderer.g('legend')
+				.attr({ zIndex: 7 }) 
+				.add();
+			legend.contentGroup = renderer.g()
+				.attr({ zIndex: 1 }) // above background
+				.add(legendGroup);
+			legend.scrollGroup = renderer.g()
+				.add(legend.contentGroup);
+		}
+		
+		legend.renderTitle();
+
+		// add each series or point
+		allItems = [];
+		each(chart.series, function (serie) {
+			var seriesOptions = serie.options;
+
+			if (!seriesOptions.showInLegend || defined(seriesOptions.linkedTo)) {
+				return;
+			}
+
+			// use points or series for the legend item depending on legendType
+			allItems = allItems.concat(
+					serie.legendItems ||
+					(seriesOptions.legendType === 'point' ?
+							serie.data :
+							serie)
+			);
+		});
+
+		// sort by legendIndex
+		stableSort(allItems, function (a, b) {
+			return ((a.options && a.options.legendIndex) || 0) - ((b.options && b.options.legendIndex) || 0);
+		});
+
+		// reversed legend
+		if (options.reversed) {
+			allItems.reverse();
+		}
+
+		legend.allItems = allItems;
+		legend.display = display = !!allItems.length;
+
+		// render the items
+		each(allItems, function (item) {
+			legend.renderItem(item); 
+		});
+
+		// Draw the border
+		legendWidth = options.width || legend.offsetWidth;
+		legendHeight = legend.lastItemY + legend.lastLineHeight + legend.titleHeight;
+		
+		
+		legendHeight = legend.handleOverflow(legendHeight);
+
+		if (legendBorderWidth || legendBackgroundColor) {
+			legendWidth += padding;
+			legendHeight += padding;
+
+			if (!box) {
+				legend.box = box = renderer.rect(
+					0,
+					0,
+					legendWidth,
+					legendHeight,
+					options.borderRadius,
+					legendBorderWidth || 0
+				).attr({
+					stroke: options.borderColor,
+					'stroke-width': legendBorderWidth || 0,
+					fill: legendBackgroundColor || NONE
+				})
+				.add(legendGroup)
+				.shadow(options.shadow);
+				box.isNew = true;
+
+			} else if (legendWidth > 0 && legendHeight > 0) {
+				box[box.isNew ? 'attr' : 'animate'](
+					box.crisp(null, null, null, legendWidth, legendHeight)
+				);
+				box.isNew = false;
+			}
+
+			// hide the border if no items
+			box[display ? 'show' : 'hide']();
+		}
+		
+		legend.legendWidth = legendWidth;
+		legend.legendHeight = legendHeight;
+
+		// Now that the legend width and height are established, put the items in the 
+		// final position
+		each(allItems, function (item) {
+			legend.positionItem(item);
+		});
+
+		// 1.x compatibility: positioning based on style
+		/*var props = ['left', 'right', 'top', 'bottom'],
+			prop,
+			i = 4;
+		while (i--) {
+			prop = props[i];
+			if (options.style[prop] && options.style[prop] !== 'auto') {
+				options[i < 2 ? 'align' : 'verticalAlign'] = prop;
+				options[i < 2 ? 'x' : 'y'] = pInt(options.style[prop]) * (i % 2 ? -1 : 1);
+			}
+		}*/
+
+		if (display) {
+			legendGroup.align(extend({
+				width: legendWidth,
+				height: legendHeight
+			}, options), true, 'spacingBox');
+		}
+
+		if (!chart.isResizing) {
+			this.positionCheckboxes();
+		}
+	},
+	
+	/**
+	 * Set up the overflow handling by adding navigation with up and down arrows below the
+	 * legend.
+	 */
+	handleOverflow: function (legendHeight) {
+		var legend = this,
+			chart = this.chart,
+			renderer = chart.renderer,
+			pageCount,
+			options = this.options,
+			optionsY = options.y,
+			alignTop = options.verticalAlign === 'top',
+			spaceHeight = chart.spacingBox.height + (alignTop ? -optionsY : optionsY) - this.padding,
+			maxHeight = options.maxHeight,
+			clipHeight,
+			clipRect = this.clipRect,
+			navOptions = options.navigation,
+			animation = pick(navOptions.animation, true),
+			arrowSize = navOptions.arrowSize || 12,
+			nav = this.nav;
+			
+		// Adjust the height
+		if (options.layout === 'horizontal') {
+			spaceHeight /= 2;
+		}
+		if (maxHeight) {
+			spaceHeight = mathMin(spaceHeight, maxHeight);
+		}
+		
+		// Reset the legend height and adjust the clipping rectangle
+		if (legendHeight > spaceHeight && !options.useHTML) {
+
+			this.clipHeight = clipHeight = spaceHeight - 20 - this.titleHeight;
+			this.pageCount = pageCount = mathCeil(legendHeight / clipHeight);
+			this.currentPage = pick(this.currentPage, 1);
+			this.fullHeight = legendHeight;
+			
+			// Only apply clipping if needed. Clipping causes blurred legend in PDF export (#1787)
+			if (!clipRect) {
+				clipRect = legend.clipRect = renderer.clipRect(0, 0, 9999, 0);
+				legend.contentGroup.clip(clipRect);
+			}
+			clipRect.attr({
+				height: clipHeight
+			});
+			
+			// Add navigation elements
+			if (!nav) {
+				this.nav = nav = renderer.g().attr({ zIndex: 1 }).add(this.group);
+				this.up = renderer.symbol('triangle', 0, 0, arrowSize, arrowSize)
+					.on('click', function () {
+						legend.scroll(-1, animation);
+					})
+					.add(nav);
+				this.pager = renderer.text('', 15, 10)
+					.css(navOptions.style)
+					.add(nav);
+				this.down = renderer.symbol('triangle-down', 0, 0, arrowSize, arrowSize)
+					.on('click', function () {
+						legend.scroll(1, animation);
+					})
+					.add(nav);
+			}
+			
+			// Set initial position
+			legend.scroll(0);
+			
+			legendHeight = spaceHeight;
+			
+		} else if (nav) {
+			clipRect.attr({
+				height: chart.chartHeight
+			});
+			nav.hide();
+			this.scrollGroup.attr({
+				translateY: 1
+			});
+			this.clipHeight = 0; // #1379
+		}
+		
+		return legendHeight;
+	},
+	
+	/**
+	 * Scroll the legend by a number of pages
+	 * @param {Object} scrollBy
+	 * @param {Object} animation
+	 */
+	scroll: function (scrollBy, animation) {
+		var pageCount = this.pageCount,
+			currentPage = this.currentPage + scrollBy,
+			clipHeight = this.clipHeight,
+			navOptions = this.options.navigation,
+			activeColor = navOptions.activeColor,
+			inactiveColor = navOptions.inactiveColor,
+			pager = this.pager,
+			padding = this.padding,
+			scrollOffset;
+		
+		// When resizing while looking at the last page
+		if (currentPage > pageCount) {
+			currentPage = pageCount;
+		}
+		
+		if (currentPage > 0) {
+			
+			if (animation !== UNDEFINED) {
+				setAnimation(animation, this.chart);
+			}
+			
+			this.nav.attr({
+				translateX: padding,
+				translateY: clipHeight + 7 + this.titleHeight,
+				visibility: VISIBLE
+			});
+			this.up.attr({
+					fill: currentPage === 1 ? inactiveColor : activeColor
+				})
+				.css({
+					cursor: currentPage === 1 ? 'default' : 'pointer'
+				});
+			pager.attr({
+				text: currentPage + '/' + this.pageCount
+			});
+			this.down.attr({
+					x: 18 + this.pager.getBBox().width, // adjust to text width
+					fill: currentPage === pageCount ? inactiveColor : activeColor
+				})
+				.css({
+					cursor: currentPage === pageCount ? 'default' : 'pointer'
+				});
+			
+			scrollOffset = -mathMin(clipHeight * (currentPage - 1), this.fullHeight - clipHeight + padding) + 1;
+			this.scrollGroup.animate({
+				translateY: scrollOffset
+			});
+			pager.attr({
+				text: currentPage + '/' + pageCount
+			});
+			
+			
+			this.currentPage = currentPage;
+			this.positionCheckboxes(scrollOffset);
+		}
+			
+	}
+	
+};
+
+// Workaround for #2030, horizontal legend items not displaying in IE11 Preview.
+// TODO: When IE11 is released, check again for this bug, and remove the fix
+// or make a better one.
+if (/Trident.*?11\.0/.test(userAgent)) {
+	wrap(Legend.prototype, 'positionItem', function (proceed, item) {
+		var legend = this;
+		setTimeout(function () {
+			proceed.call(legend, item);
+		});
+	});
+}
+
+/**
+ * The chart class
+ * @param {Object} options
+ * @param {Function} callback Function to run when the chart has loaded
+ */
+function Chart() {
+	this.init.apply(this, arguments);
+}
+
+Chart.prototype = {
+
+	/**
+	 * Initialize the chart
+	 */
+	init: function (userOptions, callback) {
+
+		// Handle regular options
+		var options,
+			seriesOptions = userOptions.series; // skip merging data points to increase performance
+
+		userOptions.series = null;
+		options = merge(defaultOptions, userOptions); // do the merge
+		options.series = userOptions.series = seriesOptions; // set back the series data
+
+		var optionsChart = options.chart;
+		
+		// Create margin & spacing array
+		this.margin = this.splashArray('margin', optionsChart);
+		this.spacing = this.splashArray('spacing', optionsChart);
+
+		var chartEvents = optionsChart.events;
+
+		//this.runChartClick = chartEvents && !!chartEvents.click;
+		this.bounds = { h: {}, v: {} }; // Pixel data bounds for touch zoom
+
+		this.callback = callback;
+		this.isResizing = 0;
+		this.options = options;
+		//chartTitleOptions = UNDEFINED;
+		//chartSubtitleOptions = UNDEFINED;
+
+		this.axes = [];
+		this.series = [];
+		this.hasCartesianSeries = optionsChart.showAxes;
+		//this.axisOffset = UNDEFINED;
+		//this.maxTicks = UNDEFINED; // handle the greatest amount of ticks on grouped axes
+		//this.inverted = UNDEFINED;
+		//this.loadingShown = UNDEFINED;
+		//this.container = UNDEFINED;
+		//this.chartWidth = UNDEFINED;
+		//this.chartHeight = UNDEFINED;
+		//this.marginRight = UNDEFINED;
+		//this.marginBottom = UNDEFINED;
+		//this.containerWidth = UNDEFINED;
+		//this.containerHeight = UNDEFINED;
+		//this.oldChartWidth = UNDEFINED;
+		//this.oldChartHeight = UNDEFINED;
+
+		//this.renderTo = UNDEFINED;
+		//this.renderToClone = UNDEFINED;
+
+		//this.spacingBox = UNDEFINED
+
+		//this.legend = UNDEFINED;
+
+		// Elements
+		//this.chartBackground = UNDEFINED;
+		//this.plotBackground = UNDEFINED;
+		//this.plotBGImage = UNDEFINED;
+		//this.plotBorder = UNDEFINED;
+		//this.loadingDiv = UNDEFINED;
+		//this.loadingSpan = UNDEFINED;
+
+		var chart = this,
+			eventType;
+
+		// Add the chart to the global lookup
+		chart.index = charts.length;
+		charts.push(chart);
+
+		// Set up auto resize
+		if (optionsChart.reflow !== false) {
+			addEvent(chart, 'load', function () {
+				chart.initReflow();
+			});
+		}
+
+		// Chart event handlers
+		if (chartEvents) {
+			for (eventType in chartEvents) {
+				addEvent(chart, eventType, chartEvents[eventType]);
+			}
+		}
+
+		chart.xAxis = [];
+		chart.yAxis = [];
+
+		// Expose methods and variables
+		chart.animation = useCanVG ? false : pick(optionsChart.animation, true);
+		chart.pointCount = 0;
+		chart.counters = new ChartCounters();
+
+		chart.firstRender();
+	},
+
+	/**
+	 * Initialize an individual series, called internally before render time
+	 */
+	initSeries: function (options) {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			type = options.type || optionsChart.type || optionsChart.defaultSeriesType,
+			series,
+			constr = seriesTypes[type];
+
+		// No such series type
+		if (!constr) {
+			error(17, true);
+		}
+
+		series = new constr();
+		series.init(this, options);
+		return series;
+	},
+
+	/**
+	 * Add a series dynamically after  time
+	 *
+	 * @param {Object} options The config options
+	 * @param {Boolean} redraw Whether to redraw the chart after adding. Defaults to true.
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 *
+	 * @return {Object} series The newly created series object
+	 */
+	addSeries: function (options, redraw, animation) {
+		var series,
+			chart = this;
+
+		if (options) {
+			redraw = pick(redraw, true); // defaults to true
+
+			fireEvent(chart, 'addSeries', { options: options }, function () {
+				series = chart.initSeries(options);
+				
+				chart.isDirtyLegend = true; // the series array is out of sync with the display
+				chart.linkSeries();
+				if (redraw) {
+					chart.redraw(animation);
+				}
+			});
+		}
+
+		return series;
+	},
+
+	/**
+     * Add an axis to the chart
+     * @param {Object} options The axis option
+     * @param {Boolean} isX Whether it is an X axis or a value axis
+     */
+	addAxis: function (options, isX, redraw, animation) {
+		var key = isX ? 'xAxis' : 'yAxis',
+			chartOptions = this.options,
+			axis;
+
+		/*jslint unused: false*/
+		axis = new Axis(this, merge(options, {
+			index: this[key].length,
+			isX: isX
+		}));
+		/*jslint unused: true*/
+
+		// Push the new axis options to the chart options
+		chartOptions[key] = splat(chartOptions[key] || {});
+		chartOptions[key].push(options);
+
+		if (pick(redraw, true)) {
+			this.redraw(animation);
+		}
+	},
+
+	/**
+	 * Check whether a given point is within the plot area
+	 *
+	 * @param {Number} plotX Pixel x relative to the plot area
+	 * @param {Number} plotY Pixel y relative to the plot area
+	 * @param {Boolean} inverted Whether the chart is inverted
+	 */
+	isInsidePlot: function (plotX, plotY, inverted) {
+		var x = inverted ? plotY : plotX,
+			y = inverted ? plotX : plotY;
+			
+		return x >= 0 &&
+			x <= this.plotWidth &&
+			y >= 0 &&
+			y <= this.plotHeight;
+	},
+
+	/**
+	 * Adjust all axes tick amounts
+	 */
+	adjustTickAmounts: function () {
+		if (this.options.chart.alignTicks !== false) {
+			each(this.axes, function (axis) {
+				axis.adjustTickAmount();
+			});
+		}
+		this.maxTicks = null;
+	},
+
+	/**
+	 * Redraw legend, axes or series based on updated data
+	 *
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+	redraw: function (animation) {
+		var chart = this,
+			axes = chart.axes,
+			series = chart.series,
+			pointer = chart.pointer,
+			legend = chart.legend,
+			redrawLegend = chart.isDirtyLegend,
+			hasStackedSeries,
+			hasDirtyStacks,
+			isDirtyBox = chart.isDirtyBox, // todo: check if it has actually changed?
+			seriesLength = series.length,
+			i = seriesLength,
+			serie,
+			renderer = chart.renderer,
+			isHiddenChart = renderer.isHidden(),
+			afterRedraw = [];
+			
+		setAnimation(animation, chart);
+		
+		if (isHiddenChart) {
+			chart.cloneRenderTo();
+		}
+
+		// Adjust title layout (reflow multiline text)
+		chart.layOutTitles();
+
+		// link stacked series
+		while (i--) {
+			serie = series[i];
+
+			if (serie.options.stacking) {
+				hasStackedSeries = true;
+				
+				if (serie.isDirty) {
+					hasDirtyStacks = true;
+					break;
+				}
+			}
+		}
+		if (hasDirtyStacks) { // mark others as dirty
+			i = seriesLength;
+			while (i--) {
+				serie = series[i];
+				if (serie.options.stacking) {
+					serie.isDirty = true;
+				}
+			}
+		}
+
+		// handle updated data in the series
+		each(series, function (serie) {
+			if (serie.isDirty) { // prepare the data so axis can read it
+				if (serie.options.legendType === 'point') {
+					redrawLegend = true;
+				}
+			}
+		});
+
+		// handle added or removed series
+		if (redrawLegend && legend.options.enabled) { // series or pie points are added or removed
+			// draw legend graphics
+			legend.render();
+
+			chart.isDirtyLegend = false;
+		}
+
+		// reset stacks
+		if (hasStackedSeries) {
+			chart.getStacks();
+		}
+
+
+		if (chart.hasCartesianSeries) {
+			if (!chart.isResizing) {
+
+				// reset maxTicks
+				chart.maxTicks = null;
+
+				// set axes scales
+				each(axes, function (axis) {
+					axis.setScale();
+				});
+			}
+
+			chart.adjustTickAmounts();
+			chart.getMargins();
+
+			// If one axis is dirty, all axes must be redrawn (#792, #2169)
+			each(axes, function (axis) {
+				if (axis.isDirty) {
+					isDirtyBox = true;
+				}
+			});
+
+			// redraw axes
+			each(axes, function (axis) {
+				
+				// Fire 'afterSetExtremes' only if extremes are set
+				if (axis.isDirtyExtremes) { // #821
+					axis.isDirtyExtremes = false;
+					afterRedraw.push(function () { // prevent a recursive call to chart.redraw() (#1119)
+						fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751
+						delete axis.eventArgs;
+					});
+				}
+				
+				if (isDirtyBox || hasStackedSeries) {
+					axis.redraw();
+				}
+			});
+
+
+		}
+		// the plot areas size has changed
+		if (isDirtyBox) {
+			chart.drawChartBox();
+		}
+
+
+		// redraw affected series
+		each(series, function (serie) {
+			if (serie.isDirty && serie.visible &&
+					(!serie.isCartesian || serie.xAxis)) { // issue #153
+				serie.redraw();
+			}
+		});
+
+		// move tooltip or reset
+		if (pointer && pointer.reset) {
+			pointer.reset(true);
+		}
+
+		// redraw if canvas
+		renderer.draw();
+
+		// fire the event
+		fireEvent(chart, 'redraw'); // jQuery breaks this when calling it from addEvent. Overwrites chart.redraw
+		
+		if (isHiddenChart) {
+			chart.cloneRenderTo(true);
+		}
+		
+		// Fire callbacks that are put on hold until after the redraw
+		each(afterRedraw, function (callback) {
+			callback.call();
+		});
+	},
+
+
+
+	/**
+	 * Dim the chart and show a loading text or symbol
+	 * @param {String} str An optional text to show in the loading label instead of the default one
+	 */
+	showLoading: function (str) {
+		var chart = this,
+			options = chart.options,
+			loadingDiv = chart.loadingDiv;
+
+		var loadingOptions = options.loading;
+
+		// create the layer at the first call
+		if (!loadingDiv) {
+			chart.loadingDiv = loadingDiv = createElement(DIV, {
+				className: PREFIX + 'loading'
+			}, extend(loadingOptions.style, {
+				zIndex: 10,
+				display: NONE
+			}), chart.container);
+
+			chart.loadingSpan = createElement(
+				'span',
+				null,
+				loadingOptions.labelStyle,
+				loadingDiv
+			);
+
+		}
+
+		// update text
+		chart.loadingSpan.innerHTML = str || options.lang.loading;
+
+		// show it
+		if (!chart.loadingShown) {
+			css(loadingDiv, { 
+				opacity: 0, 
+				display: '',
+				left: chart.plotLeft + PX,
+				top: chart.plotTop + PX,
+				width: chart.plotWidth + PX,
+				height: chart.plotHeight + PX
+			});
+			animate(loadingDiv, {
+				opacity: loadingOptions.style.opacity
+			}, {
+				duration: loadingOptions.showDuration || 0
+			});
+			chart.loadingShown = true;
+		}
+	},
+
+	/**
+	 * Hide the loading layer
+	 */
+	hideLoading: function () {
+		var options = this.options,
+			loadingDiv = this.loadingDiv;
+
+		if (loadingDiv) {
+			animate(loadingDiv, {
+				opacity: 0
+			}, {
+				duration: options.loading.hideDuration || 100,
+				complete: function () {
+					css(loadingDiv, { display: NONE });
+				}
+			});
+		}
+		this.loadingShown = false;
+	},
+
+	/**
+	 * Get an axis, series or point object by id.
+	 * @param id {String} The id as given in the configuration options
+	 */
+	get: function (id) {
+		var chart = this,
+			axes = chart.axes,
+			series = chart.series;
+
+		var i,
+			j,
+			points;
+
+		// search axes
+		for (i = 0; i < axes.length; i++) {
+			if (axes[i].options.id === id) {
+				return axes[i];
+			}
+		}
+
+		// search series
+		for (i = 0; i < series.length; i++) {
+			if (series[i].options.id === id) {
+				return series[i];
+			}
+		}
+
+		// search points
+		for (i = 0; i < series.length; i++) {
+			points = series[i].points || [];
+			for (j = 0; j < points.length; j++) {
+				if (points[j].id === id) {
+					return points[j];
+				}
+			}
+		}
+		return null;
+	},
+
+	/**
+	 * Create the Axis instances based on the config options
+	 */
+	getAxes: function () {
+		var chart = this,
+			options = this.options,
+			xAxisOptions = options.xAxis = splat(options.xAxis || {}),
+			yAxisOptions = options.yAxis = splat(options.yAxis || {}),
+			optionsArray,
+			axis;
+
+		// make sure the options are arrays and add some members
+		each(xAxisOptions, function (axis, i) {
+			axis.index = i;
+			axis.isX = true;
+		});
+
+		each(yAxisOptions, function (axis, i) {
+			axis.index = i;
+		});
+
+		// concatenate all axis options into one array
+		optionsArray = xAxisOptions.concat(yAxisOptions);
+
+		each(optionsArray, function (axisOptions) {
+			axis = new Axis(chart, axisOptions);
+		});
+
+		chart.adjustTickAmounts();
+	},
+
+
+	/**
+	 * Get the currently selected points from all series
+	 */
+	getSelectedPoints: function () {
+		var points = [];
+		each(this.series, function (serie) {
+			points = points.concat(grep(serie.points || [], function (point) {
+				return point.selected;
+			}));
+		});
+		return points;
+	},
+
+	/**
+	 * Get the currently selected series
+	 */
+	getSelectedSeries: function () {
+		return grep(this.series, function (serie) {
+			return serie.selected;
+		});
+	},
+
+	/**
+	 * Generate stacks for each series and calculate stacks total values
+	 */
+	getStacks: function () {
+		var chart = this;
+
+		// reset stacks for each yAxis
+		each(chart.yAxis, function (axis) {
+			if (axis.stacks && axis.hasVisibleSeries) {
+				axis.oldStacks = axis.stacks;
+			}
+		});
+
+		each(chart.series, function (series) {
+			if (series.options.stacking && (series.visible === true || chart.options.chart.ignoreHiddenSeries === false)) {
+				series.stackKey = series.type + pick(series.options.stack, '');
+			}
+		});
+	},
+
+	/**
+	 * Display the zoom button
+	 */
+	showResetZoom: function () {
+		var chart = this,
+			lang = defaultOptions.lang,
+			btnOptions = chart.options.chart.resetZoomButton,
+			theme = btnOptions.theme,
+			states = theme.states,
+			alignTo = btnOptions.relativeTo === 'chart' ? null : 'plotBox';
+			
+		this.resetZoomButton = chart.renderer.button(lang.resetZoom, null, null, function () { chart.zoomOut(); }, theme, states && states.hover)
+			.attr({
+				align: btnOptions.position.align,
+				title: lang.resetZoomTitle
+			})
+			.add()
+			.align(btnOptions.position, false, alignTo);
+			
+	},
+
+	/**
+	 * Zoom out to 1:1
+	 */
+	zoomOut: function () {
+		var chart = this;
+		fireEvent(chart, 'selection', { resetSelection: true }, function () { 
+			chart.zoom();
+		});
+	},
+
+	/**
+	 * Zoom into a given portion of the chart given by axis coordinates
+	 * @param {Object} event
+	 */
+	zoom: function (event) {
+		var chart = this,
+			hasZoomed,
+			pointer = chart.pointer,
+			displayButton = false,
+			resetZoomButton;
+
+		// If zoom is called with no arguments, reset the axes
+		if (!event || event.resetSelection) {
+			each(chart.axes, function (axis) {
+				hasZoomed = axis.zoom();
+			});
+		} else { // else, zoom in on all axes
+			each(event.xAxis.concat(event.yAxis), function (axisData) {
+				var axis = axisData.axis,
+					isXAxis = axis.isXAxis;
+
+				// don't zoom more than minRange
+				if (pointer[isXAxis ? 'zoomX' : 'zoomY'] || pointer[isXAxis ? 'pinchX' : 'pinchY']) {
+					hasZoomed = axis.zoom(axisData.min, axisData.max);
+					if (axis.displayBtn) {
+						displayButton = true;
+					}
+				}
+			});
+		}
+		
+		// Show or hide the Reset zoom button
+		resetZoomButton = chart.resetZoomButton;
+		if (displayButton && !resetZoomButton) {
+			chart.showResetZoom();
+		} else if (!displayButton && isObject(resetZoomButton)) {
+			chart.resetZoomButton = resetZoomButton.destroy();
+		}
+		
+
+		// Redraw
+		if (hasZoomed) {
+			chart.redraw(
+				pick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100) // animation
+			);
+		}
+	},
+
+	/**
+	 * Pan the chart by dragging the mouse across the pane. This function is called
+	 * on mouse move, and the distance to pan is computed from chartX compared to
+	 * the first chartX position in the dragging operation.
+	 */
+	pan: function (e, panning) {
+
+		var chart = this,
+			hoverPoints = chart.hoverPoints,
+			doRedraw;
+
+		// remove active points for shared tooltip
+		if (hoverPoints) {
+			each(hoverPoints, function (point) {
+				point.setState();
+			});
+		}
+
+		each(panning === 'xy' ? [1, 0] : [1], function (isX) { // xy is used in maps
+			var mousePos = e[isX ? 'chartX' : 'chartY'],
+				axis = chart[isX ? 'xAxis' : 'yAxis'][0],
+				startPos = chart[isX ? 'mouseDownX' : 'mouseDownY'],
+				halfPointRange = (axis.pointRange || 0) / 2,
+				extremes = axis.getExtremes(),
+				newMin = axis.toValue(startPos - mousePos, true) + halfPointRange,
+				newMax = axis.toValue(startPos + chart[isX ? 'plotWidth' : 'plotHeight'] - mousePos, true) - halfPointRange;
+
+			if (axis.series.length && newMin > mathMin(extremes.dataMin, extremes.min) && newMax < mathMax(extremes.dataMax, extremes.max)) {
+				axis.setExtremes(newMin, newMax, false, false, { trigger: 'pan' });
+				doRedraw = true;
+			}
+
+			chart[isX ? 'mouseDownX' : 'mouseDownY'] = mousePos; // set new reference for next run
+		});
+
+		if (doRedraw) {
+			chart.redraw(false);
+		}
+		css(chart.container, { cursor: 'move' });
+	},
+
+	/**
+	 * Show the title and subtitle of the chart
+	 *
+	 * @param titleOptions {Object} New title options
+	 * @param subtitleOptions {Object} New subtitle options
+	 *
+	 */
+	setTitle: function (titleOptions, subtitleOptions) {
+		var chart = this,
+			options = chart.options,
+			chartTitleOptions,
+			chartSubtitleOptions;
+
+		chartTitleOptions = options.title = merge(options.title, titleOptions);
+		chartSubtitleOptions = options.subtitle = merge(options.subtitle, subtitleOptions);
+
+		// add title and subtitle
+		each([
+			['title', titleOptions, chartTitleOptions],
+			['subtitle', subtitleOptions, chartSubtitleOptions]
+		], function (arr) {
+			var name = arr[0],
+				title = chart[name],
+				titleOptions = arr[1],
+				chartTitleOptions = arr[2];
+
+			if (title && titleOptions) {
+				chart[name] = title = title.destroy(); // remove old
+			}
+			
+			if (chartTitleOptions && chartTitleOptions.text && !title) {
+				chart[name] = chart.renderer.text(
+					chartTitleOptions.text,
+					0,
+					0,
+					chartTitleOptions.useHTML
+				)
+				.attr({
+					align: chartTitleOptions.align,
+					'class': PREFIX + name,
+					zIndex: chartTitleOptions.zIndex || 4
+				})
+				.css(chartTitleOptions.style)
+				.add();
+			}	
+		});
+		chart.layOutTitles();
+	},
+
+	/**
+	 * Lay out the chart titles and cache the full offset height for use in getMargins
+	 */
+	layOutTitles: function () {
+		var titleOffset = 0,
+			title = this.title,
+			subtitle = this.subtitle,
+			options = this.options,
+			titleOptions = options.title,
+			subtitleOptions = options.subtitle,
+			autoWidth = this.spacingBox.width - 44; // 44 makes room for default context button
+
+		if (title) {
+			title
+				.css({ width: (titleOptions.width || autoWidth) + PX })
+				.align(extend({ y: 15 }, titleOptions), false, 'spacingBox');
+			
+			if (!titleOptions.floating && !titleOptions.verticalAlign) {
+				titleOffset = title.getBBox().height;
+
+				// Adjust for browser consistency + backwards compat after #776 fix
+				if (titleOffset >= 18 && titleOffset <= 25) {
+					titleOffset = 15; 
+				}
+			}
+		}
+		if (subtitle) {
+			subtitle
+				.css({ width: (subtitleOptions.width || autoWidth) + PX })
+				.align(extend({ y: titleOffset + titleOptions.margin }, subtitleOptions), false, 'spacingBox');
+			
+			if (!subtitleOptions.floating && !subtitleOptions.verticalAlign) {
+				titleOffset = mathCeil(titleOffset + subtitle.getBBox().height);
+			}
+		}
+
+		this.titleOffset = titleOffset; // used in getMargins
+	},
+
+	/**
+	 * Get chart width and height according to options and container size
+	 */
+	getChartSize: function () {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			renderTo = chart.renderToClone || chart.renderTo;
+
+		// get inner width and height from jQuery (#824)
+		chart.containerWidth = adapterRun(renderTo, 'width');
+		chart.containerHeight = adapterRun(renderTo, 'height');
+		
+		chart.chartWidth = mathMax(0, optionsChart.width || chart.containerWidth || 600); // #1393, 1460
+		chart.chartHeight = mathMax(0, pick(optionsChart.height,
+			// the offsetHeight of an empty container is 0 in standard browsers, but 19 in IE7:
+			chart.containerHeight > 19 ? chart.containerHeight : 400));
+	},
+
+	/**
+	 * Create a clone of the chart's renderTo div and place it outside the viewport to allow
+	 * size computation on chart.render and chart.redraw
+	 */
+	cloneRenderTo: function (revert) {
+		var clone = this.renderToClone,
+			container = this.container;
+		
+		// Destroy the clone and bring the container back to the real renderTo div
+		if (revert) {
+			if (clone) {
+				this.renderTo.appendChild(container);
+				discardElement(clone);
+				delete this.renderToClone;
+			}
+		
+		// Set up the clone
+		} else {
+			if (container && container.parentNode === this.renderTo) {
+				this.renderTo.removeChild(container); // do not clone this
+			}
+			this.renderToClone = clone = this.renderTo.cloneNode(0);
+			css(clone, {
+				position: ABSOLUTE,
+				top: '-9999px',
+				display: 'block' // #833
+			});
+			doc.body.appendChild(clone);
+			if (container) {
+				clone.appendChild(container);
+			}
+		}
+	},
+
+	/**
+	 * Get the containing element, determine the size and create the inner container
+	 * div to hold the chart
+	 */
+	getContainer: function () {
+		var chart = this,
+			container,
+			optionsChart = chart.options.chart,
+			chartWidth,
+			chartHeight,
+			renderTo,
+			indexAttrName = 'data-highcharts-chart',
+			oldChartIndex,
+			containerId;
+
+		chart.renderTo = renderTo = optionsChart.renderTo;
+		containerId = PREFIX + idCounter++;
+
+		if (isString(renderTo)) {
+			chart.renderTo = renderTo = doc.getElementById(renderTo);
+		}
+		
+		// Display an error if the renderTo is wrong
+		if (!renderTo) {
+			error(13, true);
+		}
+		
+		// If the container already holds a chart, destroy it
+		oldChartIndex = pInt(attr(renderTo, indexAttrName));
+		if (!isNaN(oldChartIndex) && charts[oldChartIndex]) {
+			charts[oldChartIndex].destroy();
+		}		
+		
+		// Make a reference to the chart from the div
+		attr(renderTo, indexAttrName, chart.index);
+
+		// remove previous chart
+		renderTo.innerHTML = '';
+
+		// If the container doesn't have an offsetWidth, it has or is a child of a node
+		// that has display:none. We need to temporarily move it out to a visible
+		// state to determine the size, else the legend and tooltips won't render
+		// properly
+		if (!renderTo.offsetWidth) {
+			chart.cloneRenderTo();
+		}
+
+		// get the width and height
+		chart.getChartSize();
+		chartWidth = chart.chartWidth;
+		chartHeight = chart.chartHeight;
+
+		// create the inner container
+		chart.container = container = createElement(DIV, {
+				className: PREFIX + 'container' +
+					(optionsChart.className ? ' ' + optionsChart.className : ''),
+				id: containerId
+			}, extend({
+				position: RELATIVE,
+				overflow: HIDDEN, // needed for context menu (avoid scrollbars) and
+					// content overflow in IE
+				width: chartWidth + PX,
+				height: chartHeight + PX,
+				textAlign: 'left',
+				lineHeight: 'normal', // #427
+				zIndex: 0, // #1072
+				'-webkit-tap-highlight-color': 'rgba(0,0,0,0)'
+			}, optionsChart.style),
+			chart.renderToClone || renderTo
+		);
+
+		// cache the cursor (#1650)
+		chart._cursor = container.style.cursor;
+
+		chart.renderer =
+			optionsChart.forExport ? // force SVG, used for SVG export
+				new SVGRenderer(container, chartWidth, chartHeight, true) :
+				new Renderer(container, chartWidth, chartHeight);
+
+		if (useCanVG) {
+			// If we need canvg library, extend and configure the renderer
+			// to get the tracker for translating mouse events
+			chart.renderer.create(chart, container, chartWidth, chartHeight);
+		}
+	},
+
+	/**
+	 * Calculate margins by rendering axis labels in a preliminary position. Title,
+	 * subtitle and legend have already been rendered at this stage, but will be
+	 * moved into their final positions
+	 */
+	getMargins: function () {
+		var chart = this,
+			spacing = chart.spacing,
+			axisOffset,
+			legend = chart.legend,
+			margin = chart.margin,
+			legendOptions = chart.options.legend,
+			legendMargin = pick(legendOptions.margin, 10),
+			legendX = legendOptions.x,
+			legendY = legendOptions.y,
+			align = legendOptions.align,
+			verticalAlign = legendOptions.verticalAlign,
+			titleOffset = chart.titleOffset;
+
+		chart.resetMargins();
+		axisOffset = chart.axisOffset;
+
+		// Adjust for title and subtitle
+		if (titleOffset && !defined(margin[0])) {
+			chart.plotTop = mathMax(chart.plotTop, titleOffset + chart.options.title.margin + spacing[0]);
+		}
+		
+		// Adjust for legend
+		if (legend.display && !legendOptions.floating) {
+			if (align === 'right') { // horizontal alignment handled first
+				if (!defined(margin[1])) {
+					chart.marginRight = mathMax(
+						chart.marginRight,
+						legend.legendWidth - legendX + legendMargin + spacing[1]
+					);
+				}
+			} else if (align === 'left') {
+				if (!defined(margin[3])) {
+					chart.plotLeft = mathMax(
+						chart.plotLeft,
+						legend.legendWidth + legendX + legendMargin + spacing[3]
+					);
+				}
+
+			} else if (verticalAlign === 'top') {
+				if (!defined(margin[0])) {
+					chart.plotTop = mathMax(
+						chart.plotTop,
+						legend.legendHeight + legendY + legendMargin + spacing[0]
+					);
+				}
+
+			} else if (verticalAlign === 'bottom') {
+				if (!defined(margin[2])) {
+					chart.marginBottom = mathMax(
+						chart.marginBottom,
+						legend.legendHeight - legendY + legendMargin + spacing[2]
+					);
+				}
+			}
+		}
+
+		// adjust for scroller
+		if (chart.extraBottomMargin) {
+			chart.marginBottom += chart.extraBottomMargin;
+		}
+		if (chart.extraTopMargin) {
+			chart.plotTop += chart.extraTopMargin;
+		}
+
+		// pre-render axes to get labels offset width
+		if (chart.hasCartesianSeries) {
+			each(chart.axes, function (axis) {
+				axis.getOffset();
+			});
+		}
+		
+		if (!defined(margin[3])) {
+			chart.plotLeft += axisOffset[3];
+		}
+		if (!defined(margin[0])) {
+			chart.plotTop += axisOffset[0];
+		}
+		if (!defined(margin[2])) {
+			chart.marginBottom += axisOffset[2];
+		}
+		if (!defined(margin[1])) {
+			chart.marginRight += axisOffset[1];
+		}
+
+		chart.setChartSize();
+
+	},
+
+	/**
+	 * Add the event handlers necessary for auto resizing
+	 *
+	 */
+	initReflow: function () {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			renderTo = chart.renderTo,
+			reflowTimeout;
+			
+		function reflow(e) {
+			var width = optionsChart.width || adapterRun(renderTo, 'width'),
+				height = optionsChart.height || adapterRun(renderTo, 'height'),
+				target = e ? e.target : win; // #805 - MooTools doesn't supply e
+				
+			// Width and height checks for display:none. Target is doc in IE8 and Opera,
+			// win in Firefox, Chrome and IE9.
+			if (!chart.hasUserSize && width && height && (target === win || target === doc)) {
+				
+				if (width !== chart.containerWidth || height !== chart.containerHeight) {
+					clearTimeout(reflowTimeout);
+					chart.reflowTimeout = reflowTimeout = setTimeout(function () {
+						if (chart.container) { // It may have been destroyed in the meantime (#1257)
+							chart.setSize(width, height, false);
+							chart.hasUserSize = null;
+						}
+					}, 100);
+				}
+				chart.containerWidth = width;
+				chart.containerHeight = height;
+			}
+		}
+		chart.reflow = reflow;
+		addEvent(win, 'resize', reflow);
+		addEvent(chart, 'destroy', function () {
+			removeEvent(win, 'resize', reflow);
+		});
+	},
+
+	/**
+	 * Resize the chart to a given width and height
+	 * @param {Number} width
+	 * @param {Number} height
+	 * @param {Object|Boolean} animation
+	 */
+	setSize: function (width, height, animation) {
+		var chart = this,
+			chartWidth,
+			chartHeight,
+			fireEndResize;
+
+		// Handle the isResizing counter
+		chart.isResizing += 1;
+		fireEndResize = function () {
+			if (chart) {
+				fireEvent(chart, 'endResize', null, function () {
+					chart.isResizing -= 1;
+				});
+			}
+		};
+
+		// set the animation for the current process
+		setAnimation(animation, chart);
+
+		chart.oldChartHeight = chart.chartHeight;
+		chart.oldChartWidth = chart.chartWidth;
+		if (defined(width)) {
+			chart.chartWidth = chartWidth = mathMax(0, mathRound(width));
+			chart.hasUserSize = !!chartWidth;
+		}
+		if (defined(height)) {
+			chart.chartHeight = chartHeight = mathMax(0, mathRound(height));
+		}
+
+		css(chart.container, {
+			width: chartWidth + PX,
+			height: chartHeight + PX
+		});
+		chart.setChartSize(true);
+		chart.renderer.setSize(chartWidth, chartHeight, animation);
+
+		// handle axes
+		chart.maxTicks = null;
+		each(chart.axes, function (axis) {
+			axis.isDirty = true;
+			axis.setScale();
+		});
+
+		// make sure non-cartesian series are also handled
+		each(chart.series, function (serie) {
+			serie.isDirty = true;
+		});
+
+		chart.isDirtyLegend = true; // force legend redraw
+		chart.isDirtyBox = true; // force redraw of plot and chart border
+
+		chart.getMargins();
+
+		chart.redraw(animation);
+
+
+		chart.oldChartHeight = null;
+		fireEvent(chart, 'resize');
+
+		// fire endResize and set isResizing back
+		// If animation is disabled, fire without delay
+		if (globalAnimation === false) {
+			fireEndResize();
+		} else { // else set a timeout with the animation duration
+			setTimeout(fireEndResize, (globalAnimation && globalAnimation.duration) || 500);
+		}
+	},
+
+	/**
+	 * Set the public chart properties. This is done before and after the pre-render
+	 * to determine margin sizes
+	 */
+	setChartSize: function (skipAxes) {
+		var chart = this,
+			inverted = chart.inverted,
+			renderer = chart.renderer,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			optionsChart = chart.options.chart,
+			spacing = chart.spacing,
+			clipOffset = chart.clipOffset,
+			clipX,
+			clipY,
+			plotLeft,
+			plotTop,
+			plotWidth,
+			plotHeight,
+			plotBorderWidth;
+
+		chart.plotLeft = plotLeft = mathRound(chart.plotLeft);
+		chart.plotTop = plotTop = mathRound(chart.plotTop);
+		chart.plotWidth = plotWidth = mathMax(0, mathRound(chartWidth - plotLeft - chart.marginRight));
+		chart.plotHeight = plotHeight = mathMax(0, mathRound(chartHeight - plotTop - chart.marginBottom));
+
+		chart.plotSizeX = inverted ? plotHeight : plotWidth;
+		chart.plotSizeY = inverted ? plotWidth : plotHeight;
+		
+		chart.plotBorderWidth = optionsChart.plotBorderWidth || 0;
+
+		// Set boxes used for alignment
+		chart.spacingBox = renderer.spacingBox = {
+			x: spacing[3],
+			y: spacing[0],
+			width: chartWidth - spacing[3] - spacing[1],
+			height: chartHeight - spacing[0] - spacing[2]
+		};
+		chart.plotBox = renderer.plotBox = {
+			x: plotLeft,
+			y: plotTop,
+			width: plotWidth,
+			height: plotHeight
+		};
+
+		plotBorderWidth = 2 * mathFloor(chart.plotBorderWidth / 2);
+		clipX = mathCeil(mathMax(plotBorderWidth, clipOffset[3]) / 2);
+		clipY = mathCeil(mathMax(plotBorderWidth, clipOffset[0]) / 2);
+		chart.clipBox = {
+			x: clipX, 
+			y: clipY, 
+			width: mathFloor(chart.plotSizeX - mathMax(plotBorderWidth, clipOffset[1]) / 2 - clipX), 
+			height: mathFloor(chart.plotSizeY - mathMax(plotBorderWidth, clipOffset[2]) / 2 - clipY)
+		};
+
+		if (!skipAxes) {
+			each(chart.axes, function (axis) {
+				axis.setAxisSize();
+				axis.setAxisTranslation();
+			});
+		}
+	},
+
+	/**
+	 * Initial margins before auto size margins are applied
+	 */
+	resetMargins: function () {
+		var chart = this,
+			spacing = chart.spacing,
+			margin = chart.margin;
+
+		chart.plotTop = pick(margin[0], spacing[0]);
+		chart.marginRight = pick(margin[1], spacing[1]);
+		chart.marginBottom = pick(margin[2], spacing[2]);
+		chart.plotLeft = pick(margin[3], spacing[3]);
+		chart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left
+		chart.clipOffset = [0, 0, 0, 0];
+	},
+
+	/**
+	 * Draw the borders and backgrounds for chart and plot area
+	 */
+	drawChartBox: function () {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			renderer = chart.renderer,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			chartBackground = chart.chartBackground,
+			plotBackground = chart.plotBackground,
+			plotBorder = chart.plotBorder,
+			plotBGImage = chart.plotBGImage,
+			chartBorderWidth = optionsChart.borderWidth || 0,
+			chartBackgroundColor = optionsChart.backgroundColor,
+			plotBackgroundColor = optionsChart.plotBackgroundColor,
+			plotBackgroundImage = optionsChart.plotBackgroundImage,
+			plotBorderWidth = optionsChart.plotBorderWidth || 0,
+			mgn,
+			bgAttr,
+			plotLeft = chart.plotLeft,
+			plotTop = chart.plotTop,
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			plotBox = chart.plotBox,
+			clipRect = chart.clipRect,
+			clipBox = chart.clipBox;
+
+		// Chart area
+		mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);
+
+		if (chartBorderWidth || chartBackgroundColor) {
+			if (!chartBackground) {
+				
+				bgAttr = {
+					fill: chartBackgroundColor || NONE
+				};
+				if (chartBorderWidth) { // #980
+					bgAttr.stroke = optionsChart.borderColor;
+					bgAttr['stroke-width'] = chartBorderWidth;
+				}
+				chart.chartBackground = renderer.rect(mgn / 2, mgn / 2, chartWidth - mgn, chartHeight - mgn,
+						optionsChart.borderRadius, chartBorderWidth)
+					.attr(bgAttr)
+					.add()
+					.shadow(optionsChart.shadow);
+
+			} else { // resize
+				chartBackground.animate(
+					chartBackground.crisp(null, null, null, chartWidth - mgn, chartHeight - mgn)
+				);
+			}
+		}
+
+
+		// Plot background
+		if (plotBackgroundColor) {
+			if (!plotBackground) {
+				chart.plotBackground = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0)
+					.attr({
+						fill: plotBackgroundColor
+					})
+					.add()
+					.shadow(optionsChart.plotShadow);
+			} else {
+				plotBackground.animate(plotBox);
+			}
+		}
+		if (plotBackgroundImage) {
+			if (!plotBGImage) {
+				chart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight)
+					.add();
+			} else {
+				plotBGImage.animate(plotBox);
+			}
+		}
+		
+		// Plot clip
+		if (!clipRect) {
+			chart.clipRect = renderer.clipRect(clipBox);
+		} else {
+			clipRect.animate({
+				width: clipBox.width,
+				height: clipBox.height
+			});
+		}
+
+		// Plot area border
+		if (plotBorderWidth) {
+			if (!plotBorder) {
+				chart.plotBorder = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0, -plotBorderWidth)
+					.attr({
+						stroke: optionsChart.plotBorderColor,
+						'stroke-width': plotBorderWidth,
+						zIndex: 1
+					})
+					.add();
+			} else {
+				plotBorder.animate(
+					plotBorder.crisp(null, plotLeft, plotTop, plotWidth, plotHeight)
+				);
+			}
+		}
+
+		// reset
+		chart.isDirtyBox = false;
+	},
+
+	/**
+	 * Detect whether a certain chart property is needed based on inspecting its options
+	 * and series. This mainly applies to the chart.invert property, and in extensions to 
+	 * the chart.angular and chart.polar properties.
+	 */
+	propFromSeries: function () {
+		var chart = this,
+			optionsChart = chart.options.chart,
+			klass,
+			seriesOptions = chart.options.series,
+			i,
+			value;
+			
+			
+		each(['inverted', 'angular', 'polar'], function (key) {
+			
+			// The default series type's class
+			klass = seriesTypes[optionsChart.type || optionsChart.defaultSeriesType];
+			
+			// Get the value from available chart-wide properties
+			value = (
+				chart[key] || // 1. it is set before
+				optionsChart[key] || // 2. it is set in the options
+				(klass && klass.prototype[key]) // 3. it's default series class requires it
+			);
+	
+			// 4. Check if any the chart's series require it
+			i = seriesOptions && seriesOptions.length;
+			while (!value && i--) {
+				klass = seriesTypes[seriesOptions[i].type];
+				if (klass && klass.prototype[key]) {
+					value = true;
+				}
+			}
+	
+			// Set the chart property
+			chart[key] = value;	
+		});
+		
+	},
+
+	/**
+	 * Link two or more series together. This is done initially from Chart.render,
+	 * and after Chart.addSeries and Series.remove.
+	 */
+	linkSeries: function () {
+		var chart = this,
+			chartSeries = chart.series;
+
+		// Reset links
+		each(chartSeries, function (series) {
+			series.linkedSeries.length = 0;
+		});
+
+		// Apply new links
+		each(chartSeries, function (series) {
+			var linkedTo = series.options.linkedTo;
+			if (isString(linkedTo)) {
+				if (linkedTo === ':previous') {
+					linkedTo = chart.series[series.index - 1];
+				} else {
+					linkedTo = chart.get(linkedTo);
+				}
+				if (linkedTo) {
+					linkedTo.linkedSeries.push(series);
+					series.linkedParent = linkedTo;
+				}
+			}
+		});
+	},
+
+	/**
+	 * Render all graphics for the chart
+	 */
+	render: function () {
+		var chart = this,
+			axes = chart.axes,
+			renderer = chart.renderer,
+			options = chart.options;
+
+		var labels = options.labels,
+			credits = options.credits,
+			creditsHref;
+
+		// Title
+		chart.setTitle();
+
+
+		// Legend
+		chart.legend = new Legend(chart, options.legend);
+
+		chart.getStacks(); // render stacks
+
+		// Get margins by pre-rendering axes
+		// set axes scales
+		each(axes, function (axis) {
+			axis.setScale();
+		});
+
+		chart.getMargins();
+
+		chart.maxTicks = null; // reset for second pass
+		each(axes, function (axis) {
+			axis.setTickPositions(true); // update to reflect the new margins
+			axis.setMaxTicks();
+		});
+		chart.adjustTickAmounts();
+		chart.getMargins(); // second pass to check for new labels
+
+
+		// Draw the borders and backgrounds
+		chart.drawChartBox();		
+
+
+		// Axes
+		if (chart.hasCartesianSeries) {
+			each(axes, function (axis) {
+				axis.render();
+			});
+		}
+
+		// The series
+		if (!chart.seriesGroup) {
+			chart.seriesGroup = renderer.g('series-group')
+				.attr({ zIndex: 3 })
+				.add();
+		}
+		each(chart.series, function (serie) {
+			serie.translate();
+			serie.setTooltipPoints();
+			serie.render();
+		});
+
+		// Labels
+		if (labels.items) {
+			each(labels.items, function (label) {
+				var style = extend(labels.style, label.style),
+					x = pInt(style.left) + chart.plotLeft,
+					y = pInt(style.top) + chart.plotTop + 12;
+
+				// delete to prevent rewriting in IE
+				delete style.left;
+				delete style.top;
+
+				renderer.text(
+					label.html,
+					x,
+					y
+				)
+				.attr({ zIndex: 2 })
+				.css(style)
+				.add();
+
+			});
+		}
+
+		// Credits
+		if (credits.enabled && !chart.credits) {
+			creditsHref = credits.href;
+			chart.credits = renderer.text(
+				credits.text,
+				0,
+				0
+			)
+			.on('click', function () {
+				if (creditsHref) {
+					location.href = creditsHref;
+				}
+			})
+			.attr({
+				align: credits.position.align,
+				zIndex: 8
+			})
+			.css(credits.style)
+			.add()
+			.align(credits.position);
+		}
+
+		// Set flag
+		chart.hasRendered = true;
+
+	},
+
+	/**
+	 * Clean up memory usage
+	 */
+	destroy: function () {
+		var chart = this,
+			axes = chart.axes,
+			series = chart.series,
+			container = chart.container,
+			i,
+			parentNode = container && container.parentNode;
+			
+		// fire the chart.destoy event
+		fireEvent(chart, 'destroy');
+		
+		// Delete the chart from charts lookup array
+		charts[chart.index] = UNDEFINED;
+		chart.renderTo.removeAttribute('data-highcharts-chart');
+
+		// remove events
+		removeEvent(chart);
+
+		// ==== Destroy collections:
+		// Destroy axes
+		i = axes.length;
+		while (i--) {
+			axes[i] = axes[i].destroy();
+		}
+
+		// Destroy each series
+		i = series.length;
+		while (i--) {
+			series[i] = series[i].destroy();
+		}
+
+		// ==== Destroy chart properties:
+		each(['title', 'subtitle', 'chartBackground', 'plotBackground', 'plotBGImage', 
+				'plotBorder', 'seriesGroup', 'clipRect', 'credits', 'pointer', 'scroller', 
+				'rangeSelector', 'legend', 'resetZoomButton', 'tooltip', 'renderer'], function (name) {
+			var prop = chart[name];
+
+			if (prop && prop.destroy) {
+				chart[name] = prop.destroy();
+			}
+		});
+
+		// remove container and all SVG
+		if (container) { // can break in IE when destroyed before finished loading
+			container.innerHTML = '';
+			removeEvent(container);
+			if (parentNode) {
+				discardElement(container);
+			}
+
+		}
+
+		// clean it all up
+		for (i in chart) {
+			delete chart[i];
+		}
+
+	},
+
+
+	/**
+	 * VML namespaces can't be added until after complete. Listening
+	 * for Perini's doScroll hack is not enough.
+	 */
+	isReadyToRender: function () {
+		var chart = this;
+
+		// Note: in spite of JSLint's complaints, win == win.top is required
+		/*jslint eqeq: true*/
+		if ((!hasSVG && (win == win.top && doc.readyState !== 'complete')) || (useCanVG && !win.canvg)) {
+		/*jslint eqeq: false*/
+			if (useCanVG) {
+				// Delay rendering until canvg library is downloaded and ready
+				CanVGController.push(function () { chart.firstRender(); }, chart.options.global.canvasToolsURL);
+			} else {
+				doc.attachEvent('onreadystatechange', function () {
+					doc.detachEvent('onreadystatechange', chart.firstRender);
+					if (doc.readyState === 'complete') {
+						chart.firstRender();
+					}
+				});
+			}
+			return false;
+		}
+		return true;
+	},
+
+	/**
+	 * Prepare for first rendering after all data are loaded
+	 */
+	firstRender: function () {
+		var chart = this,
+			options = chart.options,
+			callback = chart.callback;
+
+		// Check whether the chart is ready to render
+		if (!chart.isReadyToRender()) {
+			return;
+		}
+
+		// Create the container
+		chart.getContainer();
+
+		// Run an early event after the container and renderer are established
+		fireEvent(chart, 'init');
+
+		
+		chart.resetMargins();
+		chart.setChartSize();
+
+		// Set the common chart properties (mainly invert) from the given series
+		chart.propFromSeries();
+
+		// get axes
+		chart.getAxes();
+
+		// Initialize the series
+		each(options.series || [], function (serieOptions) {
+			chart.initSeries(serieOptions);
+		});
+
+		chart.linkSeries();
+
+		// Run an event after axes and series are initialized, but before render. At this stage,
+		// the series data is indexed and cached in the xData and yData arrays, so we can access
+		// those before rendering. Used in Highstock. 
+		fireEvent(chart, 'beforeRender'); 
+
+		// depends on inverted and on margins being set
+		chart.pointer = new Pointer(chart, options);
+
+		chart.render();
+
+		// add canvas
+		chart.renderer.draw();
+		// run callbacks
+		if (callback) {
+			callback.apply(chart, [chart]);
+		}
+		each(chart.callbacks, function (fn) {
+			fn.apply(chart, [chart]);
+		});
+		
+		
+		// If the chart was rendered outside the top container, put it back in
+		chart.cloneRenderTo(true);
+
+		fireEvent(chart, 'load');
+
+	},
+
+	/**
+	* Creates arrays for spacing and margin from given options.
+	*/
+	splashArray: function (target, options) {
+		var oVar = options[target],
+			tArray = isObject(oVar) ? oVar : [oVar, oVar, oVar, oVar];
+
+		return [pick(options[target + 'Top'], tArray[0]),
+				pick(options[target + 'Right'], tArray[1]),
+				pick(options[target + 'Bottom'], tArray[2]),
+				pick(options[target + 'Left'], tArray[3])];
+	}
+}; // end Chart
+
+// Hook for exporting module
+Chart.prototype.callbacks = [];
+/**
+ * The Point object and prototype. Inheritable and used as base for PiePoint
+ */
+var Point = function () {};
+Point.prototype = {
+
+	/**
+	 * Initialize the point
+	 * @param {Object} series The series object containing this point
+	 * @param {Object} options The data in either number, array or object format
+	 */
+	init: function (series, options, x) {
+
+		var point = this,
+			colors;
+		point.series = series;
+		point.applyOptions(options, x);
+		point.pointAttr = {};
+
+		if (series.options.colorByPoint) {
+			colors = series.options.colors || series.chart.options.colors;
+			point.color = point.color || colors[series.colorCounter++];
+			// loop back to zero
+			if (series.colorCounter === colors.length) {
+				series.colorCounter = 0;
+			}
+		}
+
+		series.chart.pointCount++;
+		return point;
+	},
+	/**
+	 * Apply the options containing the x and y data and possible some extra properties.
+	 * This is called on point init or from point.update.
+	 *
+	 * @param {Object} options
+	 */
+	applyOptions: function (options, x) {
+		var point = this,
+			series = point.series,
+			pointValKey = series.pointValKey;
+
+		options = Point.prototype.optionsToObject.call(this, options);
+
+		// copy options directly to point
+		extend(point, options);
+		point.options = point.options ? extend(point.options, options) : options;
+			
+		// For higher dimension series types. For instance, for ranges, point.y is mapped to point.low.
+		if (pointValKey) {
+			point.y = point[pointValKey];
+		}
+		
+		// If no x is set by now, get auto incremented value. All points must have an
+		// x value, however the y value can be null to create a gap in the series
+		if (point.x === UNDEFINED && series) {
+			point.x = x === UNDEFINED ? series.autoIncrement() : x;
+		}
+		
+		return point;
+	},
+
+	/**
+	 * Transform number or array configs into objects
+	 */
+	optionsToObject: function (options) {
+		var ret,
+			series = this.series,
+			pointArrayMap = series.pointArrayMap || ['y'],
+			valueCount = pointArrayMap.length,
+			firstItemType,
+			i = 0,
+			j = 0;
+
+		if (typeof options === 'number' || options === null) {
+			ret = { y: options };
+
+		} else if (isArray(options)) {
+			ret = {};
+			// with leading x value
+			if (options.length > valueCount) {
+				firstItemType = typeof options[0];
+				if (firstItemType === 'string') {
+					ret.name = options[0];
+				} else if (firstItemType === 'number') {
+					ret.x = options[0];
+				}
+				i++;
+			}
+			while (j < valueCount) {
+				ret[pointArrayMap[j++]] = options[i++];
+			}			
+		} else if (typeof options === 'object') {
+			ret = options;
+
+			// This is the fastest way to detect if there are individual point dataLabels that need 
+			// to be considered in drawDataLabels. These can only occur in object configs.
+			if (options.dataLabels) {
+				series._hasPointLabels = true;
+			}
+
+			// Same approach as above for markers
+			if (options.marker) {
+				series._hasPointMarkers = true;
+			}
+		}
+		return ret;
+	},
+
+	/**
+	 * Destroy a point to clear memory. Its reference still stays in series.data.
+	 */
+	destroy: function () {
+		var point = this,
+			series = point.series,
+			chart = series.chart,
+			hoverPoints = chart.hoverPoints,
+			prop;
+
+		chart.pointCount--;
+
+		if (hoverPoints) {
+			point.setState();
+			erase(hoverPoints, point);
+			if (!hoverPoints.length) {
+				chart.hoverPoints = null;
+			}
+
+		}
+		if (point === chart.hoverPoint) {
+			point.onMouseOut();
+		}
+		
+		// remove all events
+		if (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive
+			removeEvent(point);
+			point.destroyElements();
+		}
+
+		if (point.legendItem) { // pies have legend items
+			chart.legend.destroyItem(point);
+		}
+
+		for (prop in point) {
+			point[prop] = null;
+		}
+
+
+	},
+
+	/**
+	 * Destroy SVG elements associated with the point
+	 */
+	destroyElements: function () {
+		var point = this,
+			props = ['graphic', 'dataLabel', 'dataLabelUpper', 'group', 'connector', 'shadowGroup'],
+			prop,
+			i = 6;
+		while (i--) {
+			prop = props[i];
+			if (point[prop]) {
+				point[prop] = point[prop].destroy();
+			}
+		}
+	},
+
+	/**
+	 * Return the configuration hash needed for the data label and tooltip formatters
+	 */
+	getLabelConfig: function () {
+		var point = this;
+		return {
+			x: point.category,
+			y: point.y,
+			key: point.name || point.category,
+			series: point.series,
+			point: point,
+			percentage: point.percentage,
+			total: point.total || point.stackTotal
+		};
+	},
+
+	/**
+	 * Toggle the selection status of a point
+	 * @param {Boolean} selected Whether to select or unselect the point.
+	 * @param {Boolean} accumulate Whether to add to the previous selection. By default,
+	 *     this happens if the control key (Cmd on Mac) was pressed during clicking.
+	 */
+	select: function (selected, accumulate) {
+		var point = this,
+			series = point.series,
+			chart = series.chart;
+
+		selected = pick(selected, !point.selected);
+
+		// fire the event with the defalut handler
+		point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {
+			point.selected = point.options.selected = selected;
+			series.options.data[inArray(point, series.data)] = point.options;
+			
+			point.setState(selected && SELECT_STATE);
+
+			// unselect all other points unless Ctrl or Cmd + click
+			if (!accumulate) {
+				each(chart.getSelectedPoints(), function (loopPoint) {
+					if (loopPoint.selected && loopPoint !== point) {
+						loopPoint.selected = loopPoint.options.selected = false;
+						series.options.data[inArray(loopPoint, series.data)] = loopPoint.options;
+						loopPoint.setState(NORMAL_STATE);
+						loopPoint.firePointEvent('unselect');
+					}
+				});
+			}
+		});
+	},
+
+	/**
+	 * Runs on mouse over the point
+	 */
+	onMouseOver: function (e) {
+		var point = this,
+			series = point.series,
+			chart = series.chart,
+			tooltip = chart.tooltip,
+			hoverPoint = chart.hoverPoint;
+
+		// set normal state to previous series
+		if (hoverPoint && hoverPoint !== point) {
+			hoverPoint.onMouseOut();
+		}
+
+		// trigger the event
+		point.firePointEvent('mouseOver');
+
+		// update the tooltip
+		if (tooltip && (!tooltip.shared || series.noSharedTooltip)) {
+			tooltip.refresh(point, e);
+		}
+
+		// hover this
+		point.setState(HOVER_STATE);
+		chart.hoverPoint = point;
+	},
+	
+	/**
+	 * Runs on mouse out from the point
+	 */
+	onMouseOut: function () {
+		var chart = this.series.chart,
+			hoverPoints = chart.hoverPoints;
+		
+		if (!hoverPoints || inArray(this, hoverPoints) === -1) { // #887
+			this.firePointEvent('mouseOut');
+	
+			this.setState();
+			chart.hoverPoint = null;
+		}
+	},
+
+	/**
+	 * Extendable method for formatting each point's tooltip line
+	 *
+	 * @return {String} A string to be concatenated in to the common tooltip text
+	 */
+	tooltipFormatter: function (pointFormat) {
+		
+		// Insert options for valueDecimals, valuePrefix, and valueSuffix
+		var series = this.series,
+			seriesTooltipOptions = series.tooltipOptions,
+			valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''),
+			valuePrefix = seriesTooltipOptions.valuePrefix || '',
+			valueSuffix = seriesTooltipOptions.valueSuffix || '';
+			
+		// Loop over the point array map and replace unformatted values with sprintf formatting markup
+		each(series.pointArrayMap || ['y'], function (key) {
+			key = '{point.' + key; // without the closing bracket
+			if (valuePrefix || valueSuffix) {
+				pointFormat = pointFormat.replace(key + '}', valuePrefix + key + '}' + valueSuffix);
+			}
+			pointFormat = pointFormat.replace(key + '}', key + ':,.' + valueDecimals + 'f}');
+		});
+		
+		return format(pointFormat, {
+			point: this,
+			series: this.series
+		});
+	},
+
+	/**
+	 * Update the point with new options (typically x/y data) and optionally redraw the series.
+	 *
+	 * @param {Object} options Point options as defined in the series.data array
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 *
+	 */
+	update: function (options, redraw, animation) {
+		var point = this,
+			series = point.series,
+			graphic = point.graphic,
+			i,
+			data = series.data,
+			chart = series.chart,
+			seriesOptions = series.options;
+
+		redraw = pick(redraw, true);
+
+		// fire the event with a default handler of doing the update
+		point.firePointEvent('update', { options: options }, function () {
+
+			point.applyOptions(options);
+
+			// update visuals
+			if (isObject(options)) {
+				series.getAttribs();
+				if (graphic) {
+					if (options.marker && options.marker.symbol) {
+						point.graphic = graphic.destroy();
+					} else {
+						graphic.attr(point.pointAttr[point.state || '']);
+					}
+				}
+			}
+
+			// record changes in the parallel arrays
+			i = inArray(point, data);
+			series.xData[i] = point.x;
+			series.yData[i] = series.toYData ? series.toYData(point) : point.y;
+			series.zData[i] = point.z;
+			seriesOptions.data[i] = point.options;
+
+			// redraw
+			series.isDirty = series.isDirtyData = true;
+			if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320
+				chart.isDirtyBox = true;
+			}
+			
+			if (seriesOptions.legendType === 'point') { // #1831, #1885
+				chart.legend.destroyItem(point);
+			}
+			if (redraw) {
+				chart.redraw(animation);
+			}
+		});
+	},
+
+	/**
+	 * Remove a point and optionally redraw the series and if necessary the axes
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+	remove: function (redraw, animation) {
+		var point = this,
+			series = point.series,
+			points = series.points,
+			chart = series.chart,
+			i,
+			data = series.data;
+
+		setAnimation(animation, chart);
+		redraw = pick(redraw, true);
+
+		// fire the event with a default handler of removing the point
+		point.firePointEvent('remove', null, function () {
+
+			// splice all the parallel arrays
+			i = inArray(point, data);
+			if (data.length === points.length) {
+				points.splice(i, 1);			
+			}
+			data.splice(i, 1);
+			series.options.data.splice(i, 1);
+			series.xData.splice(i, 1);
+			series.yData.splice(i, 1);
+			series.zData.splice(i, 1);
+
+			point.destroy();
+
+
+			// redraw
+			series.isDirty = true;
+			series.isDirtyData = true;
+			if (redraw) {
+				chart.redraw();
+			}
+		});
+
+
+	},
+
+	/**
+	 * Fire an event on the Point object. Must not be renamed to fireEvent, as this
+	 * causes a name clash in MooTools
+	 * @param {String} eventType
+	 * @param {Object} eventArgs Additional event arguments
+	 * @param {Function} defaultFunction Default event handler
+	 */
+	firePointEvent: function (eventType, eventArgs, defaultFunction) {
+		var point = this,
+			series = this.series,
+			seriesOptions = series.options;
+
+		// load event handlers on demand to save time on mouseover/out
+		if (seriesOptions.point.events[eventType] || (point.options && point.options.events && point.options.events[eventType])) {
+			this.importEvents();
+		}
+
+		// add default handler if in selection mode
+		if (eventType === 'click' && seriesOptions.allowPointSelect) {
+			defaultFunction = function (event) {
+				// Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera
+				point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);
+			};
+		}
+
+		fireEvent(this, eventType, eventArgs, defaultFunction);
+	},
+	/**
+	 * Import events from the series' and point's options. Only do it on
+	 * demand, to save processing time on hovering.
+	 */
+	importEvents: function () {
+		if (!this.hasImportedEvents) {
+			var point = this,
+				options = merge(point.series.options.point, point.options),
+				events = options.events,
+				eventType;
+
+			point.events = events;
+
+			for (eventType in events) {
+				addEvent(point, eventType, events[eventType]);
+			}
+			this.hasImportedEvents = true;
+
+		}
+	},
+
+	/**
+	 * Set the point's state
+	 * @param {String} state
+	 */
+	setState: function (state) {
+		var point = this,
+			plotX = point.plotX,
+			plotY = point.plotY,
+			series = point.series,
+			stateOptions = series.options.states,
+			markerOptions = defaultPlotOptions[series.type].marker && series.options.marker,
+			normalDisabled = markerOptions && !markerOptions.enabled,
+			markerStateOptions = markerOptions && markerOptions.states[state],
+			stateDisabled = markerStateOptions && markerStateOptions.enabled === false,
+			stateMarkerGraphic = series.stateMarkerGraphic,
+			pointMarker = point.marker || {},
+			chart = series.chart,
+			radius,
+			newSymbol,
+			pointAttr = point.pointAttr;
+
+		state = state || NORMAL_STATE; // empty string
+
+		if (
+				// already has this state
+				state === point.state ||
+				// selected points don't respond to hover
+				(point.selected && state !== SELECT_STATE) ||
+				// series' state options is disabled
+				(stateOptions[state] && stateOptions[state].enabled === false) ||
+				// point marker's state options is disabled
+				(state && (stateDisabled || (normalDisabled && !markerStateOptions.enabled)))
+
+			) {
+			return;
+		}
+
+		// apply hover styles to the existing point
+		if (point.graphic) {
+			radius = markerOptions && point.graphic.symbolName && pointAttr[state].r;
+			point.graphic.attr(merge(
+				pointAttr[state],
+				radius ? { // new symbol attributes (#507, #612)
+					x: plotX - radius,
+					y: plotY - radius,
+					width: 2 * radius,
+					height: 2 * radius
+				} : {}
+			));
+		} else {
+			// if a graphic is not applied to each point in the normal state, create a shared
+			// graphic for the hover state
+			if (state && markerStateOptions) {
+				radius = markerStateOptions.radius;
+				newSymbol = pointMarker.symbol || series.symbol;
+
+				// If the point has another symbol than the previous one, throw away the 
+				// state marker graphic and force a new one (#1459)
+				if (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {				
+					stateMarkerGraphic = stateMarkerGraphic.destroy();
+				}
+
+				// Add a new state marker graphic
+				if (!stateMarkerGraphic) {
+					series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(
+						newSymbol,
+						plotX - radius,
+						plotY - radius,
+						2 * radius,
+						2 * radius
+					)
+					.attr(pointAttr[state])
+					.add(series.markerGroup);
+					stateMarkerGraphic.currentSymbol = newSymbol;
+				
+				// Move the existing graphic
+				} else {
+					stateMarkerGraphic.attr({ // #1054
+						x: plotX - radius,
+						y: plotY - radius
+					});
+				}
+			}
+
+			if (stateMarkerGraphic) {
+				stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY) ? 'show' : 'hide']();
+			}
+		}
+
+		point.state = state;
+	}
+};
+
+/**
+ * @classDescription The base function which all other series types inherit from. The data in the series is stored
+ * in various arrays.
+ *
+ * - First, series.options.data contains all the original config options for
+ * each point whether added by options or methods like series.addPoint.
+ * - Next, series.data contains those values converted to points, but in case the series data length
+ * exceeds the cropThreshold, or if the data is grouped, series.data doesn't contain all the points. It
+ * only contains the points that have been created on demand.
+ * - Then there's series.points that contains all currently visible point objects. In case of cropping,
+ * the cropped-away points are not part of this array. The series.points array starts at series.cropStart
+ * compared to series.data and series.options.data. If however the series data is grouped, these can't
+ * be correlated one to one.
+ * - series.xData and series.processedXData contain clean x values, equivalent to series.data and series.points.
+ * - series.yData and series.processedYData contain clean x values, equivalent to series.data and series.points.
+ *
+ * @param {Object} chart
+ * @param {Object} options
+ */
+var Series = function () {};
+
+Series.prototype = {
+
+	isCartesian: true,
+	type: 'line',
+	pointClass: Point,
+	sorted: true, // requires the data to be sorted
+	requireSorting: true,
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		stroke: 'lineColor',
+		'stroke-width': 'lineWidth',
+		fill: 'fillColor',
+		r: 'radius'
+	},
+	colorCounter: 0,
+	init: function (chart, options) {
+		var series = this,
+			eventType,
+			events,
+			chartSeries = chart.series;
+
+		series.chart = chart;
+		series.options = options = series.setOptions(options); // merge with plotOptions
+		series.linkedSeries = [];
+
+		// bind the axes
+		series.bindAxes();
+
+		// set some variables
+		extend(series, {
+			name: options.name,
+			state: NORMAL_STATE,
+			pointAttr: {},
+			visible: options.visible !== false, // true by default
+			selected: options.selected === true // false by default
+		});
+		
+		// special
+		if (useCanVG) {
+			options.animation = false;
+		}
+
+		// register event listeners
+		events = options.events;
+		for (eventType in events) {
+			addEvent(series, eventType, events[eventType]);
+		}
+		if (
+			(events && events.click) ||
+			(options.point && options.point.events && options.point.events.click) ||
+			options.allowPointSelect
+		) {
+			chart.runTrackerClick = true;
+		}
+
+		series.getColor();
+		series.getSymbol();
+
+		// set the data
+		series.setData(options.data, false);
+		
+		// Mark cartesian
+		if (series.isCartesian) {
+			chart.hasCartesianSeries = true;
+		}
+
+		// Register it in the chart
+		chartSeries.push(series);
+		series._i = chartSeries.length - 1;
+		
+		// Sort series according to index option (#248, #1123)
+		stableSort(chartSeries, function (a, b) {
+			return pick(a.options.index, a._i) - pick(b.options.index, a._i);
+		});
+		each(chartSeries, function (series, i) {
+			series.index = i;
+			series.name = series.name || 'Series ' + (i + 1);
+		});
+
+	},
+	
+	/**
+	 * Set the xAxis and yAxis properties of cartesian series, and register the series
+	 * in the axis.series array
+	 */
+	bindAxes: function () {
+		var series = this,
+			seriesOptions = series.options,
+			chart = series.chart,
+			axisOptions;
+			
+		if (series.isCartesian) {
+			
+			each(['xAxis', 'yAxis'], function (AXIS) { // repeat for xAxis and yAxis
+				
+				each(chart[AXIS], function (axis) { // loop through the chart's axis objects
+					
+					axisOptions = axis.options;
+					
+					// apply if the series xAxis or yAxis option mathches the number of the 
+					// axis, or if undefined, use the first axis
+					if ((seriesOptions[AXIS] === axisOptions.index) ||
+							(seriesOptions[AXIS] !== UNDEFINED && seriesOptions[AXIS] === axisOptions.id) ||
+							(seriesOptions[AXIS] === UNDEFINED && axisOptions.index === 0)) {
+						
+						// register this series in the axis.series lookup
+						axis.series.push(series);
+						
+						// set this series.xAxis or series.yAxis reference
+						series[AXIS] = axis;
+						
+						// mark dirty for redraw
+						axis.isDirty = true;
+					}
+				});
+
+				// The series needs an X and an Y axis
+				if (!series[AXIS]) {
+					error(18, true);
+				}
+
+			});
+		}
+	},
+
+
+	/**
+	 * Return an auto incremented x value based on the pointStart and pointInterval options.
+	 * This is only used if an x value is not given for the point that calls autoIncrement.
+	 */
+	autoIncrement: function () {
+		var series = this,
+			options = series.options,
+			xIncrement = series.xIncrement;
+
+		xIncrement = pick(xIncrement, options.pointStart, 0);
+
+		series.pointInterval = pick(series.pointInterval, options.pointInterval, 1);
+
+		series.xIncrement = xIncrement + series.pointInterval;
+		return xIncrement;
+	},
+
+	/**
+	 * Divide the series data into segments divided by null values.
+	 */
+	getSegments: function () {
+		var series = this,
+			lastNull = -1,
+			segments = [],
+			i,
+			points = series.points,
+			pointsLength = points.length;
+
+		if (pointsLength) { // no action required for []
+			
+			// if connect nulls, just remove null points
+			if (series.options.connectNulls) {
+				i = pointsLength;
+				while (i--) {
+					if (points[i].y === null) {
+						points.splice(i, 1);
+					}
+				}
+				if (points.length) {
+					segments = [points];
+				}
+				
+			// else, split on null points
+			} else {
+				each(points, function (point, i) {
+					if (point.y === null) {
+						if (i > lastNull + 1) {
+							segments.push(points.slice(lastNull + 1, i));
+						}
+						lastNull = i;
+					} else if (i === pointsLength - 1) { // last value
+						segments.push(points.slice(lastNull + 1, i + 1));
+					}
+				});
+			}
+		}
+		
+		// register it
+		series.segments = segments;
+	},
+	
+	/**
+	 * Set the series options by merging from the options tree
+	 * @param {Object} itemOptions
+	 */
+	setOptions: function (itemOptions) {
+		var chart = this.chart,
+			chartOptions = chart.options,
+			plotOptions = chartOptions.plotOptions,
+			typeOptions = plotOptions[this.type],
+			options;
+
+		this.userOptions = itemOptions;
+
+		options = merge(
+			typeOptions,
+			plotOptions.series,
+			itemOptions
+		);
+		
+		// the tooltip options are merged between global and series specific options
+		this.tooltipOptions = merge(chartOptions.tooltip, options.tooltip);
+		
+		// Delte marker object if not allowed (#1125)
+		if (typeOptions.marker === null) {
+			delete options.marker;
+		}
+		
+		return options;
+
+	},
+	/**
+	 * Get the series' color
+	 */
+	getColor: function () {
+		var options = this.options,
+			userOptions = this.userOptions,
+			defaultColors = this.chart.options.colors,
+			counters = this.chart.counters,
+			color,
+			colorIndex;
+
+		color = options.color || defaultPlotOptions[this.type].color;
+
+		if (!color && !options.colorByPoint) {
+			if (defined(userOptions._colorIndex)) { // after Series.update()
+				colorIndex = userOptions._colorIndex;
+			} else {
+				userOptions._colorIndex = counters.color;
+				colorIndex = counters.color++;
+			}
+			color = defaultColors[colorIndex];
+		}
+		
+		this.color = color;
+		counters.wrapColor(defaultColors.length);
+	},
+	/**
+	 * Get the series' symbol
+	 */
+	getSymbol: function () {
+		var series = this,
+			userOptions = series.userOptions,
+			seriesMarkerOption = series.options.marker,
+			chart = series.chart,
+			defaultSymbols = chart.options.symbols,
+			counters = chart.counters,
+			symbolIndex;
+
+		series.symbol = seriesMarkerOption.symbol;
+		if (!series.symbol) {
+			if (defined(userOptions._symbolIndex)) { // after Series.update()
+				symbolIndex = userOptions._symbolIndex;
+			} else {
+				userOptions._symbolIndex = counters.symbol;
+				symbolIndex = counters.symbol++;
+			}
+			series.symbol = defaultSymbols[symbolIndex];
+		}
+
+		// don't substract radius in image symbols (#604)
+		if (/^url/.test(series.symbol)) {
+			seriesMarkerOption.radius = 0;
+		}
+		counters.wrapSymbol(defaultSymbols.length);
+	},
+
+	/**
+	 * Get the series' symbol in the legend. This method should be overridable to create custom 
+	 * symbols through Highcharts.seriesTypes[type].prototype.drawLegendSymbols.
+	 * 
+	 * @param {Object} legend The legend object
+	 */
+	drawLegendSymbol: function (legend) {
+		
+		var options = this.options,
+			markerOptions = options.marker,
+			radius,
+			legendOptions = legend.options,
+			legendSymbol,
+			symbolWidth = legendOptions.symbolWidth,
+			renderer = this.chart.renderer,
+			legendItemGroup = this.legendGroup,
+			verticalCenter = legend.baseline - mathRound(renderer.fontMetrics(legendOptions.itemStyle.fontSize).b * 0.3),
+			attr;
+			
+		// Draw the line
+		if (options.lineWidth) {
+			attr = {
+				'stroke-width': options.lineWidth
+			};
+			if (options.dashStyle) {
+				attr.dashstyle = options.dashStyle;
+			}
+			this.legendLine = renderer.path([
+				M,
+				0,
+				verticalCenter,
+				L,
+				symbolWidth,
+				verticalCenter
+			])
+			.attr(attr)
+			.add(legendItemGroup);
+		}
+		
+		// Draw the marker
+		if (markerOptions && markerOptions.enabled) {
+			radius = markerOptions.radius;
+			this.legendSymbol = legendSymbol = renderer.symbol(
+				this.symbol,
+				(symbolWidth / 2) - radius,
+				verticalCenter - radius,
+				2 * radius,
+				2 * radius
+			)
+			.add(legendItemGroup);
+			legendSymbol.isMarker = true;
+		}
+	},
+
+	/**
+	 * Add a point dynamically after chart load time
+	 * @param {Object} options Point options as given in series.data
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean} shift If shift is true, a point is shifted off the start
+	 *    of the series as one is appended to the end.
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+	addPoint: function (options, redraw, shift, animation) {
+		var series = this,
+			seriesOptions = series.options,
+			data = series.data,
+			graph = series.graph,
+			area = series.area,
+			chart = series.chart,
+			xData = series.xData,
+			yData = series.yData,
+			zData = series.zData,
+			names = series.names,
+			currentShift = (graph && graph.shift) || 0,
+			dataOptions = seriesOptions.data,
+			point,
+			isInTheMiddle,
+			x,
+			i;
+
+		setAnimation(animation, chart);
+
+		// Make graph animate sideways
+		if (shift) {
+			each([graph, area, series.graphNeg, series.areaNeg], function (shape) {
+				if (shape) {
+					shape.shift = currentShift + 1;
+				}
+			});
+		}
+		if (area) {
+			area.isArea = true; // needed in animation, both with and without shift
+		}
+		
+		// Optional redraw, defaults to true
+		redraw = pick(redraw, true);
+
+		// Get options and push the point to xData, yData and series.options. In series.generatePoints
+		// the Point instance will be created on demand and pushed to the series.data array.
+		point = { series: series };
+		series.pointClass.prototype.applyOptions.apply(point, [options]);
+		x = point.x;
+
+		// Get the insertion point
+		i = xData.length;
+		if (series.requireSorting && x < xData[i - 1]) {
+			isInTheMiddle = true;
+			while (i && xData[i - 1] > x) {
+				i--;
+			}
+		}
+		
+		xData.splice(i, 0, x);
+		yData.splice(i, 0, series.toYData ? series.toYData(point) : point.y);
+		zData.splice(i, 0, point.z);
+		if (names) {
+			names[x] = point.name;
+		}
+		dataOptions.splice(i, 0, options);
+
+		if (isInTheMiddle) {
+			series.data.splice(i, 0, null);
+			series.processData();
+		}
+		
+		// Generate points to be added to the legend (#1329) 
+		if (seriesOptions.legendType === 'point') {
+			series.generatePoints();
+		}
+
+		// Shift the first point off the parallel arrays
+		// todo: consider series.removePoint(i) method
+		if (shift) {
+			if (data[0] && data[0].remove) {
+				data[0].remove(false);
+			} else {
+				data.shift();
+				xData.shift();
+				yData.shift();
+				zData.shift();
+				dataOptions.shift();
+			}
+		}
+
+		// redraw
+		series.isDirty = true;
+		series.isDirtyData = true;
+		if (redraw) {
+			series.getAttribs(); // #1937
+			chart.redraw();
+		}
+	},
+
+	/**
+	 * Replace the series data with a new set of data
+	 * @param {Object} data
+	 * @param {Object} redraw
+	 */
+	setData: function (data, redraw) {
+		var series = this,
+			oldData = series.points,
+			options = series.options,
+			chart = series.chart,
+			firstPoint = null,
+			xAxis = series.xAxis,
+			names = xAxis && xAxis.categories && !xAxis.categories.length ? [] : null,
+			i;
+
+		// reset properties
+		series.xIncrement = null;
+		series.pointRange = xAxis && xAxis.categories ? 1 : options.pointRange;
+
+		series.colorCounter = 0; // for series with colorByPoint (#1547)
+		
+		// parallel arrays
+		var xData = [],
+			yData = [],
+			zData = [],
+			dataLength = data ? data.length : [],
+			turboThreshold = pick(options.turboThreshold, 1000),
+			pt,
+			pointArrayMap = series.pointArrayMap,
+			valueCount = pointArrayMap && pointArrayMap.length,
+			hasToYData = !!series.toYData;
+
+		// In turbo mode, only one- or twodimensional arrays of numbers are allowed. The
+		// first value is tested, and we assume that all the rest are defined the same
+		// way. Although the 'for' loops are similar, they are repeated inside each
+		// if-else conditional for max performance.
+		if (turboThreshold && dataLength > turboThreshold) { 
+			
+			// find the first non-null point
+			i = 0;
+			while (firstPoint === null && i < dataLength) {
+				firstPoint = data[i];
+				i++;
+			}
+		
+		
+			if (isNumber(firstPoint)) { // assume all points are numbers
+				var x = pick(options.pointStart, 0),
+					pointInterval = pick(options.pointInterval, 1);
+
+				for (i = 0; i < dataLength; i++) {
+					xData[i] = x;
+					yData[i] = data[i];
+					x += pointInterval;
+				}
+				series.xIncrement = x;
+			} else if (isArray(firstPoint)) { // assume all points are arrays
+				if (valueCount) { // [x, low, high] or [x, o, h, l, c]
+					for (i = 0; i < dataLength; i++) {
+						pt = data[i];
+						xData[i] = pt[0];
+						yData[i] = pt.slice(1, valueCount + 1);
+					}
+				} else { // [x, y]
+					for (i = 0; i < dataLength; i++) {
+						pt = data[i];
+						xData[i] = pt[0];
+						yData[i] = pt[1];
+					}
+				}
+			} else {
+				error(12); // Highcharts expects configs to be numbers or arrays in turbo mode
+			}
+		} else {
+			for (i = 0; i < dataLength; i++) {
+				if (data[i] !== UNDEFINED) { // stray commas in oldIE
+					pt = { series: series };
+					series.pointClass.prototype.applyOptions.apply(pt, [data[i]]);
+					xData[i] = pt.x;
+					yData[i] = hasToYData ? series.toYData(pt) : pt.y;
+					zData[i] = pt.z;
+					if (names && pt.name) {
+						names[pt.x] = pt.name; // #2046
+					}
+				}
+			}
+		}
+		
+		// Forgetting to cast strings to numbers is a common caveat when handling CSV or JSON		
+		if (isString(yData[0])) {
+			error(14, true);
+		} 
+
+		series.data = [];
+		series.options.data = data;
+		series.xData = xData;
+		series.yData = yData;
+		series.zData = zData;
+		series.names = names;
+
+		// destroy old points
+		i = (oldData && oldData.length) || 0;
+		while (i--) {
+			if (oldData[i] && oldData[i].destroy) {
+				oldData[i].destroy();
+			}
+		}
+
+		// reset minRange (#878)
+		if (xAxis) {
+			xAxis.minRange = xAxis.userMinRange;
+		}
+
+		// redraw
+		series.isDirty = series.isDirtyData = chart.isDirtyBox = true;
+		if (pick(redraw, true)) {
+			chart.redraw(false);
+		}
+	},
+
+	/**
+	 * Remove a series and optionally redraw the chart
+	 *
+	 * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+	 * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+	 *    configuration
+	 */
+
+	remove: function (redraw, animation) {
+		var series = this,
+			chart = series.chart;
+		redraw = pick(redraw, true);
+
+		if (!series.isRemoving) {  /* prevent triggering native event in jQuery
+				(calling the remove function from the remove event) */
+			series.isRemoving = true;
+
+			// fire the event with a default handler of removing the point
+			fireEvent(series, 'remove', null, function () {
+
+
+				// destroy elements
+				series.destroy();
+
+
+				// redraw
+				chart.isDirtyLegend = chart.isDirtyBox = true;
+				chart.linkSeries();
+				
+				if (redraw) {
+					chart.redraw(animation);
+				}
+			});
+
+		}
+		series.isRemoving = false;
+	},
+
+	/**
+	 * Process the data by cropping away unused data points if the series is longer
+	 * than the crop threshold. This saves computing time for lage series.
+	 */
+	processData: function (force) {
+		var series = this,
+			processedXData = series.xData, // copied during slice operation below
+			processedYData = series.yData,
+			dataLength = processedXData.length,
+			croppedData,
+			cropStart = 0,
+			cropped,
+			distance,
+			closestPointRange,
+			xAxis = series.xAxis,
+			i, // loop variable
+			options = series.options,
+			cropThreshold = options.cropThreshold,
+			isCartesian = series.isCartesian;
+
+		// If the series data or axes haven't changed, don't go through this. Return false to pass
+		// the message on to override methods like in data grouping. 
+		if (isCartesian && !series.isDirty && !xAxis.isDirty && !series.yAxis.isDirty && !force) {
+			return false;
+		}
+		
+
+		// optionally filter out points outside the plot area
+		if (isCartesian && series.sorted && (!cropThreshold || dataLength > cropThreshold || series.forceCrop)) {
+			var min = xAxis.min,
+				max = xAxis.max;
+
+			// it's outside current extremes
+			if (processedXData[dataLength - 1] < min || processedXData[0] > max) {
+				processedXData = [];
+				processedYData = [];
+			
+			// only crop if it's actually spilling out
+			} else if (processedXData[0] < min || processedXData[dataLength - 1] > max) {
+				croppedData = this.cropData(series.xData, series.yData, min, max);
+				processedXData = croppedData.xData;
+				processedYData = croppedData.yData;
+				cropStart = croppedData.start;
+				cropped = true;
+			}
+		}
+		
+		
+		// Find the closest distance between processed points
+		for (i = processedXData.length - 1; i >= 0; i--) {
+			distance = processedXData[i] - processedXData[i - 1];
+			if (distance > 0 && (closestPointRange === UNDEFINED || distance < closestPointRange)) {
+				closestPointRange = distance;
+
+			// Unsorted data is not supported by the line tooltip, as well as data grouping and 
+			// navigation in Stock charts (#725) and width calculation of columns (#1900)
+			} else if (distance < 0 && series.requireSorting) {
+				error(15);
+			}
+		}
+
+		// Record the properties
+		series.cropped = cropped; // undefined or true
+		series.cropStart = cropStart;
+		series.processedXData = processedXData;
+		series.processedYData = processedYData;
+
+		if (options.pointRange === null) { // null means auto, as for columns, candlesticks and OHLC
+			series.pointRange = closestPointRange || 1;
+		}
+		series.closestPointRange = closestPointRange;
+		
+	},
+
+	/**
+	 * Iterate over xData and crop values between min and max. Returns object containing crop start/end
+	 * cropped xData with corresponding part of yData, dataMin and dataMax within the cropped range
+	 */
+	cropData: function (xData, yData, min, max) {
+		var dataLength = xData.length,
+			cropStart = 0,
+			cropEnd = dataLength,
+			cropShoulder = pick(this.cropShoulder, 1), // line-type series need one point outside
+			i;
+
+		// iterate up to find slice start
+		for (i = 0; i < dataLength; i++) {
+			if (xData[i] >= min) {
+				cropStart = mathMax(0, i - cropShoulder);
+				break;
+			}
+		}
+
+		// proceed to find slice end
+		for (; i < dataLength; i++) {
+			if (xData[i] > max) {
+				cropEnd = i + cropShoulder;
+				break;
+			}
+		}
+
+		return {
+			xData: xData.slice(cropStart, cropEnd),
+			yData: yData.slice(cropStart, cropEnd),
+			start: cropStart,
+			end: cropEnd
+		};
+	},
+
+
+	/**
+	 * Generate the data point after the data has been processed by cropping away
+	 * unused points and optionally grouped in Highcharts Stock.
+	 */
+	generatePoints: function () {
+		var series = this,
+			options = series.options,
+			dataOptions = options.data,
+			data = series.data,
+			dataLength,
+			processedXData = series.processedXData,
+			processedYData = series.processedYData,
+			pointClass = series.pointClass,
+			processedDataLength = processedXData.length,
+			cropStart = series.cropStart || 0,
+			cursor,
+			hasGroupedData = series.hasGroupedData,
+			point,
+			points = [],
+			i;
+
+		if (!data && !hasGroupedData) {
+			var arr = [];
+			arr.length = dataOptions.length;
+			data = series.data = arr;
+		}
+
+		for (i = 0; i < processedDataLength; i++) {
+			cursor = cropStart + i;
+			if (!hasGroupedData) {
+				if (data[cursor]) {
+					point = data[cursor];
+				} else if (dataOptions[cursor] !== UNDEFINED) { // #970
+					data[cursor] = point = (new pointClass()).init(series, dataOptions[cursor], processedXData[i]);
+				}
+				points[i] = point;
+			} else {
+				// splat the y data in case of ohlc data array
+				points[i] = (new pointClass()).init(series, [processedXData[i]].concat(splat(processedYData[i])));
+			}
+		}
+
+		// Hide cropped-away points - this only runs when the number of points is above cropThreshold, or when
+		// swithching view from non-grouped data to grouped data (#637)	
+		if (data && (processedDataLength !== (dataLength = data.length) || hasGroupedData)) {
+			for (i = 0; i < dataLength; i++) {
+				if (i === cropStart && !hasGroupedData) { // when has grouped data, clear all points
+					i += processedDataLength;
+				}
+				if (data[i]) {
+					data[i].destroyElements();
+					data[i].plotX = UNDEFINED; // #1003
+				}
+			}
+		}
+
+		series.data = data;
+		series.points = points;
+	},
+
+	/**
+	 * Adds series' points value to corresponding stack
+	 */
+	setStackedPoints: function () {
+		if (!this.options.stacking || (this.visible !== true && this.chart.options.chart.ignoreHiddenSeries !== false)) {
+			return;
+		}
+
+		var series = this,
+			xData = series.processedXData,
+			yData = series.processedYData,
+			stackedYData = [],
+			yDataLength = yData.length,
+			seriesOptions = series.options,
+			threshold = seriesOptions.threshold,
+			stackOption = seriesOptions.stack,
+			stacking = seriesOptions.stacking,
+			stackKey = series.stackKey,
+			negKey = '-' + stackKey,
+			negStacks = series.negStacks,
+			yAxis = series.yAxis,
+			stacks = yAxis.stacks,
+			oldStacks = yAxis.oldStacks,
+			isNegative,
+			stack,
+			other,
+			key,
+			i,
+			x,
+			y;
+
+		// loop over the non-null y values and read them into a local array
+		for (i = 0; i < yDataLength; i++) {
+			x = xData[i];
+			y = yData[i];
+
+			// Read stacked values into a stack based on the x value,
+			// the sign of y and the stack key. Stacking is also handled for null values (#739)
+			isNegative = negStacks && y < threshold;
+			key = isNegative ? negKey : stackKey;
+
+			// Create empty object for this stack if it doesn't exist yet
+			if (!stacks[key]) {
+				stacks[key] = {};
+			}
+
+			// Initialize StackItem for this x
+			if (!stacks[key][x]) {
+				if (oldStacks[key] && oldStacks[key][x]) {
+					stacks[key][x] = oldStacks[key][x];
+					stacks[key][x].total = null;
+				} else {
+					stacks[key][x] = new StackItem(yAxis, yAxis.options.stackLabels, isNegative, x, stackOption, stacking);
+				}
+			}
+
+			// If the StackItem doesn't exist, create it first
+			stack = stacks[key][x];
+			stack.points[series.index] = [stack.cum || 0];
+
+			// Add value to the stack total
+			if (stacking === 'percent') {
+				
+				// Percent stacked column, totals are the same for the positive and negative stacks
+				other = isNegative ? stackKey : negKey;
+				if (negStacks && stacks[other] && stacks[other][x]) {
+					other = stacks[other][x];
+					stack.total = other.total = mathMax(other.total, stack.total) + mathAbs(y) || 0;
+
+				// Percent stacked areas					
+				} else {
+					stack.total += mathAbs(y) || 0;
+				}
+			} else {
+				stack.total += y || 0;
+			}
+
+			stack.cum = (stack.cum || 0) + (y || 0);
+
+			stack.points[series.index].push(stack.cum);
+			stackedYData[i] = stack.cum;
+
+		}
+
+		if (stacking === 'percent') {
+			yAxis.usePercentage = true;
+		}
+
+		this.stackedYData = stackedYData; // To be used in getExtremes
+		
+		// Reset old stacks
+		yAxis.oldStacks = {};
+	},
+
+	/**
+	 * Iterate over all stacks and compute the absolute values to percent
+	 */
+	setPercentStacks: function () {
+		var series = this,
+			stackKey = series.stackKey,
+			stacks = series.yAxis.stacks;
+		
+		each([stackKey, '-' + stackKey], function (key) {
+			var i = series.xData.length,
+				x,
+				stack,
+				pointExtremes,
+				totalFactor;
+
+			while (i--) {
+				x = series.xData[i];
+				stack = stacks[key] && stacks[key][x];
+				pointExtremes = stack && stack.points[series.index];
+				if (pointExtremes) {
+					totalFactor = stack.total ? 100 / stack.total : 0;
+					pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor); // Y bottom value
+					pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor); // Y value
+					series.stackedYData[i] = pointExtremes[1];
+				}
+			}
+		});
+	},
+
+	/**
+	 * Calculate Y extremes for visible data
+	 */
+	getExtremes: function () {
+		var xAxis = this.xAxis,
+			yAxis = this.yAxis,
+			xData = this.processedXData,
+			yData = this.stackedYData || this.processedYData,
+			yDataLength = yData.length,
+			activeYData = [],
+			activeCounter = 0,
+			xExtremes = xAxis.getExtremes(), // #2117, need to compensate for log X axis
+			xMin = xExtremes.min,
+			xMax = xExtremes.max,
+			validValue,
+			withinRange,
+			dataMin,
+			dataMax,
+			x,
+			y,
+			i,
+			j;
+
+		for (i = 0; i < yDataLength; i++) {
+			
+			x = xData[i];
+			y = yData[i];
+
+			// For points within the visible range, including the first point outside the
+			// visible range, consider y extremes
+			validValue = y !== null && y !== UNDEFINED && (!yAxis.isLog || (y.length || y > 0));
+			withinRange = this.getExtremesFromAll || this.cropped || ((xData[i + 1] || x) >= xMin && 
+				(xData[i - 1] || x) <= xMax);
+
+			if (validValue && withinRange) {
+
+				j = y.length;
+				if (j) { // array, like ohlc or range data
+					while (j--) {
+						if (y[j] !== null) {
+							activeYData[activeCounter++] = y[j];
+						}
+					}
+				} else {
+					activeYData[activeCounter++] = y;
+				}
+			}
+		}
+		this.dataMin = pick(dataMin, arrayMin(activeYData));
+		this.dataMax = pick(dataMax, arrayMax(activeYData));
+	},
+
+	/**
+	 * Translate data points from raw data values to chart specific positioning data
+	 * needed later in drawPoints, drawGraph and drawTracker.
+	 */
+	translate: function () {
+		if (!this.processedXData) { // hidden series
+			this.processData();
+		}
+		this.generatePoints();
+		var series = this,
+			options = series.options,
+			stacking = options.stacking,
+			xAxis = series.xAxis,
+			categories = xAxis.categories,
+			yAxis = series.yAxis,
+			points = series.points,
+			dataLength = points.length,
+			hasModifyValue = !!series.modifyValue,
+			i,
+			pointPlacement = options.pointPlacement,
+			dynamicallyPlaced = pointPlacement === 'between' || isNumber(pointPlacement),
+			threshold = options.threshold;
+
+		
+		// Translate each point
+		for (i = 0; i < dataLength; i++) {
+			var point = points[i],
+				xValue = point.x,
+				yValue = point.y,
+				yBottom = point.low,
+				stack = yAxis.stacks[(series.negStacks && yValue < threshold ? '-' : '') + series.stackKey],
+				pointStack,
+				stackValues;
+
+			// Discard disallowed y values for log axes
+			if (yAxis.isLog && yValue <= 0) {
+				point.y = yValue = null;
+			}
+			
+			// Get the plotX translation
+			point.plotX = xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement, this.type === 'flags'); // Math.round fixes #591
+			
+
+			// Calculate the bottom y value for stacked series
+			if (stacking && series.visible && stack && stack[xValue]) {
+
+				pointStack = stack[xValue];
+				stackValues = pointStack.points[series.index];
+				yBottom = stackValues[0];
+				yValue = stackValues[1];
+
+				if (yBottom === 0) {
+					yBottom = pick(threshold, yAxis.min);
+				}
+				if (yAxis.isLog && yBottom <= 0) { // #1200, #1232
+					yBottom = null;
+				}
+
+				point.percentage = stacking === 'percent' && yValue;
+				point.total = point.stackTotal = pointStack.total;
+				point.stackY = yValue;
+
+				// Place the stack label
+				pointStack.setOffset(series.pointXOffset || 0, series.barW || 0);
+				
+			}
+
+			// Set translated yBottom or remove it
+			point.yBottom = defined(yBottom) ? 
+				yAxis.translate(yBottom, 0, 1, 0, 1) :
+				null;
+				
+			// general hook, used for Highstock compare mode
+			if (hasModifyValue) {
+				yValue = series.modifyValue(yValue, point);
+			}
+
+			// Set the the plotY value, reset it for redraws
+			point.plotY = (typeof yValue === 'number' && yValue !== Infinity) ? 
+				//mathRound(yAxis.translate(yValue, 0, 1, 0, 1) * 10) / 10 : // Math.round fixes #591
+				yAxis.translate(yValue, 0, 1, 0, 1) : 
+				UNDEFINED;
+			
+			// Set client related positions for mouse tracking
+			point.clientX = dynamicallyPlaced ? xAxis.translate(xValue, 0, 0, 0, 1) : point.plotX; // #1514
+				
+			point.negative = point.y < (threshold || 0);
+
+			// some API data
+			point.category = categories && categories[point.x] !== UNDEFINED ?
+				categories[point.x] : point.x;
+
+
+		}
+
+		// now that we have the cropped data, build the segments
+		series.getSegments();
+	},
+	/**
+	 * Memoize tooltip texts and positions
+	 */
+	setTooltipPoints: function (renew) {
+		var series = this,
+			points = [],
+			pointsLength,
+			low,
+			high,
+			xAxis = series.xAxis,
+			xExtremes = xAxis && xAxis.getExtremes(),
+			axisLength = xAxis ? (xAxis.tooltipLen || xAxis.len) : series.chart.plotSizeX, // tooltipLen and tooltipPosName used in polar
+			point,
+			pointX,
+			nextPoint,
+			i,
+			tooltipPoints = []; // a lookup array for each pixel in the x dimension
+
+		// don't waste resources if tracker is disabled
+		if (series.options.enableMouseTracking === false) {
+			return;
+		}
+
+		// renew
+		if (renew) {
+			series.tooltipPoints = null;
+		}
+
+		// concat segments to overcome null values
+		each(series.segments || series.points, function (segment) {
+			points = points.concat(segment);
+		});
+
+		// Reverse the points in case the X axis is reversed
+		if (xAxis && xAxis.reversed) {
+			points = points.reverse();
+		}
+
+		// Polar needs additional shaping
+		if (series.orderTooltipPoints) {
+			series.orderTooltipPoints(points);
+		}
+
+		// Assign each pixel position to the nearest point
+		pointsLength = points.length;
+		for (i = 0; i < pointsLength; i++) {
+			point = points[i];
+			pointX = point.x;
+			if (pointX >= xExtremes.min && pointX <= xExtremes.max) { // #1149
+				nextPoint = points[i + 1];
+				
+				// Set this range's low to the last range's high plus one
+				low = high === UNDEFINED ? 0 : high + 1;
+				// Now find the new high
+				high = points[i + 1] ?
+					mathMin(mathMax(0, mathFloor( // #2070
+						(point.clientX + (nextPoint ? (nextPoint.wrappedClientX || nextPoint.clientX) : axisLength)) / 2
+					)), axisLength) :
+					axisLength;
+
+				while (low >= 0 && low <= high) {
+					tooltipPoints[low++] = point;
+				}
+			}
+		}
+		series.tooltipPoints = tooltipPoints;
+	},
+
+	/**
+	 * Format the header of the tooltip
+	 */
+	tooltipHeaderFormatter: function (point) {
+		var series = this,
+			tooltipOptions = series.tooltipOptions,
+			xDateFormat = tooltipOptions.xDateFormat,
+			dateTimeLabelFormats = tooltipOptions.dateTimeLabelFormats,
+			xAxis = series.xAxis,
+			isDateTime = xAxis && xAxis.options.type === 'datetime',
+			headerFormat = tooltipOptions.headerFormat,
+			closestPointRange = xAxis && xAxis.closestPointRange,
+			n;
+			
+		// Guess the best date format based on the closest point distance (#568)
+		if (isDateTime && !xDateFormat) {
+			if (closestPointRange) {
+				for (n in timeUnits) {
+					if (timeUnits[n] >= closestPointRange) {
+						xDateFormat = dateTimeLabelFormats[n];
+						break;
+					}
+				}
+			} else {
+				xDateFormat = dateTimeLabelFormats.day;
+			}
+		}
+		
+		// Insert the header date format if any
+		if (isDateTime && xDateFormat && isNumber(point.key)) {
+			headerFormat = headerFormat.replace('{point.key}', '{point.key:' + xDateFormat + '}');
+		}
+		
+		return format(headerFormat, {
+			point: point,
+			series: series
+		});
+	},
+
+	/**
+	 * Series mouse over handler
+	 */
+	onMouseOver: function () {
+		var series = this,
+			chart = series.chart,
+			hoverSeries = chart.hoverSeries;
+
+		// set normal state to previous series
+		if (hoverSeries && hoverSeries !== series) {
+			hoverSeries.onMouseOut();
+		}
+
+		// trigger the event, but to save processing time,
+		// only if defined
+		if (series.options.events.mouseOver) {
+			fireEvent(series, 'mouseOver');
+		}
+
+		// hover this
+		series.setState(HOVER_STATE);
+		chart.hoverSeries = series;
+	},
+
+	/**
+	 * Series mouse out handler
+	 */
+	onMouseOut: function () {
+		// trigger the event only if listeners exist
+		var series = this,
+			options = series.options,
+			chart = series.chart,
+			tooltip = chart.tooltip,
+			hoverPoint = chart.hoverPoint;
+
+		// trigger mouse out on the point, which must be in this series
+		if (hoverPoint) {
+			hoverPoint.onMouseOut();
+		}
+
+		// fire the mouse out event
+		if (series && options.events.mouseOut) {
+			fireEvent(series, 'mouseOut');
+		}
+
+
+		// hide the tooltip
+		if (tooltip && !options.stickyTracking && (!tooltip.shared || series.noSharedTooltip)) {
+			tooltip.hide();
+		}
+
+		// set normal state
+		series.setState();
+		chart.hoverSeries = null;
+	},
+
+	/**
+	 * Animate in the series
+	 */
+	animate: function (init) {
+		var series = this,
+			chart = series.chart,
+			renderer = chart.renderer,
+			clipRect,
+			markerClipRect,
+			animation = series.options.animation,
+			clipBox = chart.clipBox,
+			inverted = chart.inverted,
+			sharedClipKey;
+
+		// Animation option is set to true
+		if (animation && !isObject(animation)) {
+			animation = defaultPlotOptions[series.type].animation;
+		}
+		sharedClipKey = '_sharedClip' + animation.duration + animation.easing;
+
+		// Initialize the animation. Set up the clipping rectangle.
+		if (init) { 
+			
+			// If a clipping rectangle with the same properties is currently present in the chart, use that. 
+			clipRect = chart[sharedClipKey];
+			markerClipRect = chart[sharedClipKey + 'm'];
+			if (!clipRect) {
+				chart[sharedClipKey] = clipRect = renderer.clipRect(
+					extend(clipBox, { width: 0 })
+				);
+				
+				chart[sharedClipKey + 'm'] = markerClipRect = renderer.clipRect(
+					-99, // include the width of the first marker
+					inverted ? -chart.plotLeft : -chart.plotTop, 
+					99,
+					inverted ? chart.chartWidth : chart.chartHeight
+				);
+			}
+			series.group.clip(clipRect);
+			series.markerGroup.clip(markerClipRect);
+			series.sharedClipKey = sharedClipKey;
+
+		// Run the animation
+		} else { 
+			clipRect = chart[sharedClipKey];
+			if (clipRect) {
+				clipRect.animate({
+					width: chart.plotSizeX
+				}, animation);
+				chart[sharedClipKey + 'm'].animate({
+					width: chart.plotSizeX + 99
+				}, animation);
+			}
+
+			// Delete this function to allow it only once
+			series.animate = null;
+			
+			// Call the afterAnimate function on animation complete (but don't overwrite the animation.complete option
+			// which should be available to the user).
+			series.animationTimeout = setTimeout(function () {
+				series.afterAnimate();
+			}, animation.duration);
+		}
+	},
+	
+	/**
+	 * This runs after animation to land on the final plot clipping
+	 */
+	afterAnimate: function () {
+		var chart = this.chart,
+			sharedClipKey = this.sharedClipKey,
+			group = this.group;
+			
+		if (group && this.options.clip !== false) {
+			group.clip(chart.clipRect);
+			this.markerGroup.clip(); // no clip
+		}
+		
+		// Remove the shared clipping rectancgle when all series are shown		
+		setTimeout(function () {
+			if (sharedClipKey && chart[sharedClipKey]) {
+				chart[sharedClipKey] = chart[sharedClipKey].destroy();
+				chart[sharedClipKey + 'm'] = chart[sharedClipKey + 'm'].destroy();
+			}
+		}, 100);
+	},
+
+	/**
+	 * Draw the markers
+	 */
+	drawPoints: function () {
+		var series = this,
+			pointAttr,
+			points = series.points,
+			chart = series.chart,
+			plotX,
+			plotY,
+			i,
+			point,
+			radius,
+			symbol,
+			isImage,
+			graphic,
+			options = series.options,
+			seriesMarkerOptions = options.marker,
+			pointMarkerOptions,
+			enabled,
+			isInside,
+			markerGroup = series.markerGroup;
+
+		if (seriesMarkerOptions.enabled || series._hasPointMarkers) {
+			
+			i = points.length;
+			while (i--) {
+				point = points[i];
+				plotX = mathFloor(point.plotX); // #1843
+				plotY = point.plotY;
+				graphic = point.graphic;
+				pointMarkerOptions = point.marker || {};
+				enabled = (seriesMarkerOptions.enabled && pointMarkerOptions.enabled === UNDEFINED) || pointMarkerOptions.enabled;
+				isInside = chart.isInsidePlot(mathRound(plotX), plotY, chart.inverted); // #1858
+				
+				// only draw the point if y is defined
+				if (enabled && plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {
+
+					// shortcuts
+					pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE];
+					radius = pointAttr.r;
+					symbol = pick(pointMarkerOptions.symbol, series.symbol);
+					isImage = symbol.indexOf('url') === 0;
+
+					if (graphic) { // update
+						graphic
+							.attr({ // Since the marker group isn't clipped, each individual marker must be toggled
+								visibility: isInside ? (hasSVG ? 'inherit' : VISIBLE) : HIDDEN
+							})
+							.animate(extend({
+								x: plotX - radius,
+								y: plotY - radius
+							}, graphic.symbolName ? { // don't apply to image symbols #507
+								width: 2 * radius,
+								height: 2 * radius
+							} : {}));
+					} else if (isInside && (radius > 0 || isImage)) {
+						point.graphic = graphic = chart.renderer.symbol(
+							symbol,
+							plotX - radius,
+							plotY - radius,
+							2 * radius,
+							2 * radius
+						)
+						.attr(pointAttr)
+						.add(markerGroup);
+					}
+					
+				} else if (graphic) {
+					point.graphic = graphic.destroy(); // #1269
+				}
+			}
+		}
+
+	},
+
+	/**
+	 * Convert state properties from API naming conventions to SVG attributes
+	 *
+	 * @param {Object} options API options object
+	 * @param {Object} base1 SVG attribute object to inherit from
+	 * @param {Object} base2 Second level SVG attribute object to inherit from
+	 */
+	convertAttribs: function (options, base1, base2, base3) {
+		var conversion = this.pointAttrToOptions,
+			attr,
+			option,
+			obj = {};
+
+		options = options || {};
+		base1 = base1 || {};
+		base2 = base2 || {};
+		base3 = base3 || {};
+
+		for (attr in conversion) {
+			option = conversion[attr];
+			obj[attr] = pick(options[option], base1[attr], base2[attr], base3[attr]);
+		}
+		return obj;
+	},
+
+	/**
+	 * Get the state attributes. Each series type has its own set of attributes
+	 * that are allowed to change on a point's state change. Series wide attributes are stored for
+	 * all series, and additionally point specific attributes are stored for all
+	 * points with individual marker options. If such options are not defined for the point,
+	 * a reference to the series wide attributes is stored in point.pointAttr.
+	 */
+	getAttribs: function () {
+		var series = this,
+			seriesOptions = series.options,
+			normalOptions = defaultPlotOptions[series.type].marker ? seriesOptions.marker : seriesOptions,
+			stateOptions = normalOptions.states,
+			stateOptionsHover = stateOptions[HOVER_STATE],
+			pointStateOptionsHover,
+			seriesColor = series.color,
+			normalDefaults = {
+				stroke: seriesColor,
+				fill: seriesColor
+			},
+			points = series.points || [], // #927
+			i,
+			point,
+			seriesPointAttr = [],
+			pointAttr,
+			pointAttrToOptions = series.pointAttrToOptions,
+			hasPointSpecificOptions,
+			negativeColor = seriesOptions.negativeColor,
+			defaultLineColor = normalOptions.lineColor,
+			key;
+
+		// series type specific modifications
+		if (seriesOptions.marker) { // line, spline, area, areaspline, scatter
+
+			// if no hover radius is given, default to normal radius + 2
+			stateOptionsHover.radius = stateOptionsHover.radius || normalOptions.radius + 2;
+			stateOptionsHover.lineWidth = stateOptionsHover.lineWidth || normalOptions.lineWidth + 1;
+			
+		} else { // column, bar, pie
+
+			// if no hover color is given, brighten the normal color
+			stateOptionsHover.color = stateOptionsHover.color ||
+				Color(stateOptionsHover.color || seriesColor)
+					.brighten(stateOptionsHover.brightness).get();
+		}
+
+		// general point attributes for the series normal state
+		seriesPointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, normalDefaults);
+
+		// HOVER_STATE and SELECT_STATE states inherit from normal state except the default radius
+		each([HOVER_STATE, SELECT_STATE], function (state) {
+			seriesPointAttr[state] =
+					series.convertAttribs(stateOptions[state], seriesPointAttr[NORMAL_STATE]);
+		});
+
+		// set it
+		series.pointAttr = seriesPointAttr;
+
+
+		// Generate the point-specific attribute collections if specific point
+		// options are given. If not, create a referance to the series wide point
+		// attributes
+		i = points.length;
+		while (i--) {
+			point = points[i];
+			normalOptions = (point.options && point.options.marker) || point.options;
+			if (normalOptions && normalOptions.enabled === false) {
+				normalOptions.radius = 0;
+			}
+			
+			if (point.negative && negativeColor) {
+				point.color = point.fillColor = negativeColor;
+			}
+			
+			hasPointSpecificOptions = seriesOptions.colorByPoint || point.color; // #868
+
+			// check if the point has specific visual options
+			if (point.options) {
+				for (key in pointAttrToOptions) {
+					if (defined(normalOptions[pointAttrToOptions[key]])) {
+						hasPointSpecificOptions = true;
+					}
+				}
+			}
+
+			// a specific marker config object is defined for the individual point:
+			// create it's own attribute collection
+			if (hasPointSpecificOptions) {
+				normalOptions = normalOptions || {};
+				pointAttr = [];
+				stateOptions = normalOptions.states || {}; // reassign for individual point
+				pointStateOptionsHover = stateOptions[HOVER_STATE] = stateOptions[HOVER_STATE] || {};
+
+				// Handle colors for column and pies
+				if (!seriesOptions.marker) { // column, bar, point
+					// if no hover color is given, brighten the normal color
+					pointStateOptionsHover.color =
+						Color(pointStateOptionsHover.color || point.color)
+							.brighten(pointStateOptionsHover.brightness ||
+								stateOptionsHover.brightness).get();
+
+				}
+
+				// normal point state inherits series wide normal state
+				pointAttr[NORMAL_STATE] = series.convertAttribs(extend({
+					color: point.color, // #868
+					fillColor: point.color, // Individual point color or negative color markers (#2219)
+					lineColor: defaultLineColor === null ? point.color : UNDEFINED // Bubbles take point color, line markers use white
+				}, normalOptions), seriesPointAttr[NORMAL_STATE]);
+
+				// inherit from point normal and series hover
+				pointAttr[HOVER_STATE] = series.convertAttribs(
+					stateOptions[HOVER_STATE],
+					seriesPointAttr[HOVER_STATE],
+					pointAttr[NORMAL_STATE]
+				);
+				
+				// inherit from point normal and series hover
+				pointAttr[SELECT_STATE] = series.convertAttribs(
+					stateOptions[SELECT_STATE],
+					seriesPointAttr[SELECT_STATE],
+					pointAttr[NORMAL_STATE]
+				);
+
+
+			// no marker config object is created: copy a reference to the series-wide
+			// attribute collection
+			} else {
+				pointAttr = seriesPointAttr;
+			}
+
+			point.pointAttr = pointAttr;
+
+		}
+
+	},
+	/**
+	 * Update the series with a new set of options
+	 */
+	update: function (newOptions, redraw) {
+		var chart = this.chart,
+			// must use user options when changing type because this.options is merged
+			// in with type specific plotOptions
+			oldOptions = this.userOptions,
+			oldType = this.type,
+			proto = seriesTypes[oldType].prototype,
+			n;
+
+		// Do the merge, with some forced options
+		newOptions = merge(oldOptions, {
+			animation: false,
+			index: this.index,
+			pointStart: this.xData[0] // when updating after addPoint
+		}, { data: this.options.data }, newOptions);
+
+		// Destroy the series and reinsert methods from the type prototype
+		this.remove(false);
+		for (n in proto) { // Overwrite series-type specific methods (#2270)
+			if (proto.hasOwnProperty(n)) {
+				this[n] = UNDEFINED;
+			}
+		}
+		extend(this, seriesTypes[newOptions.type || oldType].prototype);
+		
+
+		this.init(chart, newOptions);
+		if (pick(redraw, true)) {
+			chart.redraw(false);
+		}
+	},
+
+	/**
+	 * Clear DOM objects and free up memory
+	 */
+	destroy: function () {
+		var series = this,
+			chart = series.chart,
+			issue134 = /AppleWebKit\/533/.test(userAgent),
+			destroy,
+			i,
+			data = series.data || [],
+			point,
+			prop,
+			axis;
+
+		// add event hook
+		fireEvent(series, 'destroy');
+
+		// remove all events
+		removeEvent(series);
+		
+		// erase from axes
+		each(['xAxis', 'yAxis'], function (AXIS) {
+			axis = series[AXIS];
+			if (axis) {
+				erase(axis.series, series);
+				axis.isDirty = axis.forceRedraw = true;
+				axis.stacks = {}; // Rebuild stacks when updating (#2229)
+			}
+		});
+
+		// remove legend items
+		if (series.legendItem) {
+			series.chart.legend.destroyItem(series);
+		}
+
+		// destroy all points with their elements
+		i = data.length;
+		while (i--) {
+			point = data[i];
+			if (point && point.destroy) {
+				point.destroy();
+			}
+		}
+		series.points = null;
+
+		// Clear the animation timeout if we are destroying the series during initial animation
+		clearTimeout(series.animationTimeout);
+
+		// destroy all SVGElements associated to the series
+		each(['area', 'graph', 'dataLabelsGroup', 'group', 'markerGroup', 'tracker',
+				'graphNeg', 'areaNeg', 'posClip', 'negClip'], function (prop) {
+			if (series[prop]) {
+
+				// issue 134 workaround
+				destroy = issue134 && prop === 'group' ?
+					'hide' :
+					'destroy';
+
+				series[prop][destroy]();
+			}
+		});
+
+		// remove from hoverSeries
+		if (chart.hoverSeries === series) {
+			chart.hoverSeries = null;
+		}
+		erase(chart.series, series);
+
+		// clear all members
+		for (prop in series) {
+			delete series[prop];
+		}
+	},
+
+	/**
+	 * Draw the data labels
+	 */
+	drawDataLabels: function () {
+		
+		var series = this,
+			seriesOptions = series.options,
+			options = seriesOptions.dataLabels,
+			points = series.points,
+			pointOptions,
+			generalOptions,
+			str,
+			dataLabelsGroup;
+		
+		if (options.enabled || series._hasPointLabels) {
+						
+			// Process default alignment of data labels for columns
+			if (series.dlProcessOptions) {
+				series.dlProcessOptions(options);
+			}
+
+			// Create a separate group for the data labels to avoid rotation
+			dataLabelsGroup = series.plotGroup(
+				'dataLabelsGroup', 
+				'data-labels', 
+				series.visible ? VISIBLE : HIDDEN, 
+				options.zIndex || 6
+			);
+			
+			// Make the labels for each point
+			generalOptions = options;
+			each(points, function (point) {
+				
+				var enabled,
+					dataLabel = point.dataLabel,
+					labelConfig,
+					attr,
+					name,
+					rotation,
+					connector = point.connector,
+					isNew = true;
+				
+				// Determine if each data label is enabled
+				pointOptions = point.options && point.options.dataLabels;
+				enabled = pick(pointOptions && pointOptions.enabled, generalOptions.enabled); // #2282
+				
+				
+				// If the point is outside the plot area, destroy it. #678, #820
+				if (dataLabel && !enabled) {
+					point.dataLabel = dataLabel.destroy();
+				
+				// Individual labels are disabled if the are explicitly disabled 
+				// in the point options, or if they fall outside the plot area.
+				} else if (enabled) {
+					
+					// Create individual options structure that can be extended without 
+					// affecting others
+					options = merge(generalOptions, pointOptions);
+
+					rotation = options.rotation;
+					
+					// Get the string
+					labelConfig = point.getLabelConfig();
+					str = options.format ?
+						format(options.format, labelConfig) : 
+						options.formatter.call(labelConfig, options);
+					
+					// Determine the color
+					options.style.color = pick(options.color, options.style.color, series.color, 'black');
+	
+					
+					// update existing label
+					if (dataLabel) {
+						
+						if (defined(str)) {
+							dataLabel
+								.attr({
+									text: str
+								});
+							isNew = false;
+						
+						} else { // #1437 - the label is shown conditionally
+							point.dataLabel = dataLabel = dataLabel.destroy();
+							if (connector) {
+								point.connector = connector.destroy();
+							}
+						}
+						
+					// create new label
+					} else if (defined(str)) {
+						attr = {
+							//align: align,
+							fill: options.backgroundColor,
+							stroke: options.borderColor,
+							'stroke-width': options.borderWidth,
+							r: options.borderRadius || 0,
+							rotation: rotation,
+							padding: options.padding,
+							zIndex: 1
+						};
+						// Remove unused attributes (#947)
+						for (name in attr) {
+							if (attr[name] === UNDEFINED) {
+								delete attr[name];
+							}
+						}
+						
+						dataLabel = point.dataLabel = series.chart.renderer[rotation ? 'text' : 'label']( // labels don't support rotation
+							str,
+							0,
+							-999,
+							null,
+							null,
+							null,
+							options.useHTML
+						)
+						.attr(attr)
+						.css(options.style)
+						.add(dataLabelsGroup)
+						.shadow(options.shadow);
+						
+					}
+					
+					if (dataLabel) {
+						// Now the data label is created and placed at 0,0, so we need to align it
+						series.alignDataLabel(point, dataLabel, options, null, isNew);
+					}
+				}
+			});
+		}
+	},
+	
+	/**
+	 * Align each individual data label
+	 */
+	alignDataLabel: function (point, dataLabel, options, alignTo, isNew) {
+		var chart = this.chart,
+			inverted = chart.inverted,
+			plotX = pick(point.plotX, -999),
+			plotY = pick(point.plotY, -999),
+			bBox = dataLabel.getBBox(),
+			visible = this.visible && chart.isInsidePlot(point.plotX, point.plotY, inverted),
+			alignAttr; // the final position;
+				
+		if (visible) {
+
+			// The alignment box is a singular point
+			alignTo = extend({
+				x: inverted ? chart.plotWidth - plotY : plotX,
+				y: mathRound(inverted ? chart.plotHeight - plotX : plotY),
+				width: 0,
+				height: 0
+			}, alignTo);
+			
+			// Add the text size for alignment calculation
+			extend(options, {
+				width: bBox.width,
+				height: bBox.height
+			});
+
+			// Allow a hook for changing alignment in the last moment, then do the alignment
+			if (options.rotation) { // Fancy box alignment isn't supported for rotated text
+				alignAttr = {
+					align: options.align,
+					x: alignTo.x + options.x + alignTo.width / 2,
+					y: alignTo.y + options.y + alignTo.height / 2
+				};
+				dataLabel[isNew ? 'attr' : 'animate'](alignAttr);
+			} else {
+				dataLabel.align(options, null, alignTo);
+				alignAttr = dataLabel.alignAttr;
+
+				// Handle justify or crop
+				if (pick(options.overflow, 'justify') === 'justify') { // docs: overflow: justify, also crop only applies when not justify
+					this.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);
+				
+				} else if (pick(options.crop, true)) {
+					// Now check that the data label is within the plot area
+					visible = chart.isInsidePlot(alignAttr.x, alignAttr.y) && chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);
+				
+				}
+			}		
+		}
+
+		// Show or hide based on the final aligned position
+		if (!visible) {
+			dataLabel.attr({ y: -999 });
+		}
+				
+	},
+	
+	/**
+	 * If data labels fall partly outside the plot area, align them back in, in a way that
+	 * doesn't hide the point.
+	 */
+	justifyDataLabel: function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {
+		var chart = this.chart,
+			align = options.align,
+			verticalAlign = options.verticalAlign,
+			off,
+			justified;
+
+		// Off left
+		off = alignAttr.x;
+		if (off < 0) {
+			if (align === 'right') {
+				options.align = 'left';
+			} else {
+				options.x = -off;
+			}
+			justified = true;
+		}
+
+		// Off right
+		off = alignAttr.x + bBox.width;
+		if (off > chart.plotWidth) {
+			if (align === 'left') {
+				options.align = 'right';
+			} else {
+				options.x = chart.plotWidth - off;
+			}
+			justified = true;
+		}
+
+		// Off top
+		off = alignAttr.y;
+		if (off < 0) {
+			if (verticalAlign === 'bottom') {
+				options.verticalAlign = 'top';
+			} else {
+				options.y = -off;
+			}
+			justified = true;
+		}
+
+		// Off bottom
+		off = alignAttr.y + bBox.height;
+		if (off > chart.plotHeight) {
+			if (verticalAlign === 'top') {
+				options.verticalAlign = 'bottom';
+			} else {
+				options.y = chart.plotHeight - off;
+			}
+			justified = true;
+		}
+		
+		if (justified) {
+			dataLabel.placed = !isNew;
+			dataLabel.align(options, null, alignTo);
+		}
+	},
+	
+	/**
+	 * Return the graph path of a segment
+	 */
+	getSegmentPath: function (segment) {		
+		var series = this,
+			segmentPath = [],
+			step = series.options.step;
+			
+		// build the segment line
+		each(segment, function (point, i) {
+			
+			var plotX = point.plotX,
+				plotY = point.plotY,
+				lastPoint;
+
+			if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object
+				segmentPath.push.apply(segmentPath, series.getPointSpline(segment, point, i));
+
+			} else {
+
+				// moveTo or lineTo
+				segmentPath.push(i ? L : M);
+
+				// step line?
+				if (step && i) {
+					lastPoint = segment[i - 1];
+					if (step === 'right') {
+						segmentPath.push(
+							lastPoint.plotX,
+							plotY
+						);
+						
+					} else if (step === 'center') {
+						segmentPath.push(
+							(lastPoint.plotX + plotX) / 2,
+							lastPoint.plotY,
+							(lastPoint.plotX + plotX) / 2,
+							plotY
+						);
+						
+					} else {
+						segmentPath.push(
+							plotX,
+							lastPoint.plotY
+						);
+					}
+				}
+
+				// normal line to next point
+				segmentPath.push(
+					point.plotX,
+					point.plotY
+				);
+			}
+		});
+		
+		return segmentPath;
+	},
+
+	/**
+	 * Get the graph path
+	 */
+	getGraphPath: function () {
+		var series = this,
+			graphPath = [],
+			segmentPath,
+			singlePoints = []; // used in drawTracker
+
+		// Divide into segments and build graph and area paths
+		each(series.segments, function (segment) {
+			
+			segmentPath = series.getSegmentPath(segment);
+			
+			// add the segment to the graph, or a single point for tracking
+			if (segment.length > 1) {
+				graphPath = graphPath.concat(segmentPath);
+			} else {
+				singlePoints.push(segment[0]);
+			}
+		});
+
+		// Record it for use in drawGraph and drawTracker, and return graphPath
+		series.singlePoints = singlePoints;
+		series.graphPath = graphPath;
+		
+		return graphPath;
+		
+	},
+	
+	/**
+	 * Draw the actual graph
+	 */
+	drawGraph: function () {
+		var series = this,
+			options = this.options,
+			props = [['graph', options.lineColor || this.color]],
+			lineWidth = options.lineWidth,
+			dashStyle =  options.dashStyle,
+			graphPath = this.getGraphPath(),
+			negativeColor = options.negativeColor;
+			
+		if (negativeColor) {
+			props.push(['graphNeg', negativeColor]);
+		}
+		
+		// draw the graph
+		each(props, function (prop, i) {
+			var graphKey = prop[0],
+				graph = series[graphKey],
+				attribs;
+			
+			if (graph) {
+				stop(graph); // cancel running animations, #459
+				graph.animate({ d: graphPath });
+	
+			} else if (lineWidth && graphPath.length) { // #1487
+				attribs = {
+					stroke: prop[1],
+					'stroke-width': lineWidth,
+					zIndex: 1 // #1069
+				};
+				if (dashStyle) {
+					attribs.dashstyle = dashStyle;
+				} else {
+					attribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';
+				}
+
+				series[graphKey] = series.chart.renderer.path(graphPath)
+					.attr(attribs)
+					.add(series.group)
+					.shadow(!i && options.shadow);
+			}
+		});
+	},
+	
+	/**
+	 * Clip the graphs into the positive and negative coloured graphs
+	 */
+	clipNeg: function () {
+		var options = this.options,
+			chart = this.chart,
+			renderer = chart.renderer,
+			negativeColor = options.negativeColor || options.negativeFillColor,
+			translatedThreshold,
+			posAttr,
+			negAttr,
+			graph = this.graph,
+			area = this.area,
+			posClip = this.posClip,
+			negClip = this.negClip,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			chartSizeMax = mathMax(chartWidth, chartHeight),
+			yAxis = this.yAxis,
+			above,
+			below;
+		
+		if (negativeColor && (graph || area)) {
+			translatedThreshold = mathRound(yAxis.toPixels(options.threshold || 0, true));
+			above = {
+				x: 0,
+				y: 0,
+				width: chartSizeMax,
+				height: translatedThreshold
+			};
+			below = {
+				x: 0,
+				y: translatedThreshold,
+				width: chartSizeMax,
+				height: chartSizeMax
+			};
+			
+			if (chart.inverted) {
+
+				above.height = below.y = chart.plotWidth - translatedThreshold;
+				if (renderer.isVML) {
+					above = {
+						x: chart.plotWidth - translatedThreshold - chart.plotLeft,
+						y: 0,
+						width: chartWidth,
+						height: chartHeight
+					};
+					below = {
+						x: translatedThreshold + chart.plotLeft - chartWidth,
+						y: 0,
+						width: chart.plotLeft + translatedThreshold,
+						height: chartWidth
+					};
+				}
+			}
+			
+			if (yAxis.reversed) {
+				posAttr = below;
+				negAttr = above;
+			} else {
+				posAttr = above;
+				negAttr = below;
+			}
+		
+			if (posClip) { // update
+				posClip.animate(posAttr);
+				negClip.animate(negAttr);
+			} else {
+				
+				this.posClip = posClip = renderer.clipRect(posAttr);
+				this.negClip = negClip = renderer.clipRect(negAttr);
+				
+				if (graph && this.graphNeg) {
+					graph.clip(posClip);
+					this.graphNeg.clip(negClip);	
+				}
+				
+				if (area) {
+					area.clip(posClip);
+					this.areaNeg.clip(negClip);
+				} 
+			} 
+		}	
+	},
+
+	/**
+	 * Initialize and perform group inversion on series.group and series.markerGroup
+	 */
+	invertGroups: function () {
+		var series = this,
+			chart = series.chart;
+
+		// Pie, go away (#1736)
+		if (!series.xAxis) {
+			return;
+		}
+		
+		// A fixed size is needed for inversion to work
+		function setInvert() {			
+			var size = {
+				width: series.yAxis.len,
+				height: series.xAxis.len
+			};
+			
+			each(['group', 'markerGroup'], function (groupName) {
+				if (series[groupName]) {
+					series[groupName].attr(size).invert();
+				}
+			});
+		}
+
+		addEvent(chart, 'resize', setInvert); // do it on resize
+		addEvent(series, 'destroy', function () {
+			removeEvent(chart, 'resize', setInvert);
+		});
+
+		// Do it now
+		setInvert(); // do it now
+		
+		// On subsequent render and redraw, just do setInvert without setting up events again
+		series.invertGroups = setInvert;
+	},
+	
+	/**
+	 * General abstraction for creating plot groups like series.group, series.dataLabelsGroup and 
+	 * series.markerGroup. On subsequent calls, the group will only be adjusted to the updated plot size.
+	 */
+	plotGroup: function (prop, name, visibility, zIndex, parent) {
+		var group = this[prop],
+			isNew = !group;
+		
+		// Generate it on first call
+		if (isNew) {	
+			this[prop] = group = this.chart.renderer.g(name)
+				.attr({
+					visibility: visibility,
+					zIndex: zIndex || 0.1 // IE8 needs this
+				})
+				.add(parent);
+		}
+		// Place it on first and subsequent (redraw) calls
+		group[isNew ? 'attr' : 'animate'](this.getPlotBox());
+		return group;		
+	},
+
+	/**
+	 * Get the translation and scale for the plot area of this series
+	 */
+	getPlotBox: function () {
+		return {
+			translateX: this.xAxis ? this.xAxis.left : this.chart.plotLeft, 
+			translateY: this.yAxis ? this.yAxis.top : this.chart.plotTop,
+			scaleX: 1, // #1623
+			scaleY: 1
+		};
+	},
+	
+	/**
+	 * Render the graph and markers
+	 */
+	render: function () {
+		var series = this,
+			chart = series.chart,
+			group,
+			options = series.options,
+			animation = options.animation,
+			doAnimation = animation && !!series.animate && 
+				chart.renderer.isSVG, // this animation doesn't work in IE8 quirks when the group div is hidden,
+				// and looks bad in other oldIE
+			visibility = series.visible ? VISIBLE : HIDDEN,
+			zIndex = options.zIndex,
+			hasRendered = series.hasRendered,
+			chartSeriesGroup = chart.seriesGroup;
+		
+		// the group
+		group = series.plotGroup(
+			'group', 
+			'series', 
+			visibility, 
+			zIndex, 
+			chartSeriesGroup
+		);
+		
+		series.markerGroup = series.plotGroup(
+			'markerGroup', 
+			'markers', 
+			visibility, 
+			zIndex, 
+			chartSeriesGroup
+		);
+		
+		// initiate the animation
+		if (doAnimation) {
+			series.animate(true);
+		}
+
+		// cache attributes for shapes
+		series.getAttribs();
+
+		// SVGRenderer needs to know this before drawing elements (#1089, #1795)
+		group.inverted = series.isCartesian ? chart.inverted : false;
+		
+		// draw the graph if any
+		if (series.drawGraph) {
+			series.drawGraph();
+			series.clipNeg();
+		}
+
+		// draw the data labels (inn pies they go before the points)
+		series.drawDataLabels();
+		
+		// draw the points
+		series.drawPoints();
+
+
+		// draw the mouse tracking area
+		if (series.options.enableMouseTracking !== false) {
+			series.drawTracker();
+		}
+		
+		// Handle inverted series and tracker groups
+		if (chart.inverted) {
+			series.invertGroups();
+		}
+		
+		// Initial clipping, must be defined after inverting groups for VML
+		if (options.clip !== false && !series.sharedClipKey && !hasRendered) {
+			group.clip(chart.clipRect);
+		}
+
+		// Run the animation
+		if (doAnimation) {
+			series.animate();
+		} else if (!hasRendered) {
+			series.afterAnimate();
+		}
+
+		series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see
+		// (See #322) series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see
+		series.hasRendered = true;
+	},
+	
+	/**
+	 * Redraw the series after an update in the axes.
+	 */
+	redraw: function () {
+		var series = this,
+			chart = series.chart,
+			wasDirtyData = series.isDirtyData, // cache it here as it is set to false in render, but used after
+			group = series.group,
+			xAxis = series.xAxis,
+			yAxis = series.yAxis;
+
+		// reposition on resize
+		if (group) {
+			if (chart.inverted) {
+				group.attr({
+					width: chart.plotWidth,
+					height: chart.plotHeight
+				});
+			}
+
+			group.animate({
+				translateX: pick(xAxis && xAxis.left, chart.plotLeft),
+				translateY: pick(yAxis && yAxis.top, chart.plotTop)
+			});
+		}
+
+		series.translate();
+		series.setTooltipPoints(true);
+
+		series.render();
+		if (wasDirtyData) {
+			fireEvent(series, 'updatedData');
+		}
+	},
+
+	/**
+	 * Set the state of the graph
+	 */
+	setState: function (state) {
+		var series = this,
+			options = series.options,
+			graph = series.graph,
+			graphNeg = series.graphNeg,
+			stateOptions = options.states,
+			lineWidth = options.lineWidth,
+			attribs;
+
+		state = state || NORMAL_STATE;
+
+		if (series.state !== state) {
+			series.state = state;
+
+			if (stateOptions[state] && stateOptions[state].enabled === false) {
+				return;
+			}
+
+			if (state) {
+				lineWidth = stateOptions[state].lineWidth || lineWidth + 1;
+			}
+
+			if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML
+				attribs = {
+					'stroke-width': lineWidth
+				};
+				// use attr because animate will cause any other animation on the graph to stop
+				graph.attr(attribs);
+				if (graphNeg) {
+					graphNeg.attr(attribs);
+				}
+			}
+		}
+	},
+
+	/**
+	 * Set the visibility of the graph
+	 *
+	 * @param vis {Boolean} True to show the series, false to hide. If UNDEFINED,
+	 *        the visibility is toggled.
+	 */
+	setVisible: function (vis, redraw) {
+		var series = this,
+			chart = series.chart,
+			legendItem = series.legendItem,
+			showOrHide,
+			ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,
+			oldVisibility = series.visible;
+
+		// if called without an argument, toggle visibility
+		series.visible = vis = series.userOptions.visible = vis === UNDEFINED ? !oldVisibility : vis;
+		showOrHide = vis ? 'show' : 'hide';
+
+		// show or hide elements
+		each(['group', 'dataLabelsGroup', 'markerGroup', 'tracker'], function (key) {
+			if (series[key]) {
+				series[key][showOrHide]();
+			}
+		});
+
+		
+		// hide tooltip (#1361)
+		if (chart.hoverSeries === series) {
+			series.onMouseOut();
+		}
+
+
+		if (legendItem) {
+			chart.legend.colorizeItem(series, vis);
+		}
+
+
+		// rescale or adapt to resized chart
+		series.isDirty = true;
+		// in a stack, all other series are affected
+		if (series.options.stacking) {
+			each(chart.series, function (otherSeries) {
+				if (otherSeries.options.stacking && otherSeries.visible) {
+					otherSeries.isDirty = true;
+				}
+			});
+		}
+
+		// show or hide linked series
+		each(series.linkedSeries, function (otherSeries) {
+			otherSeries.setVisible(vis, false);
+		});
+
+		if (ignoreHiddenSeries) {
+			chart.isDirtyBox = true;
+		}
+		if (redraw !== false) {
+			chart.redraw();
+		}
+
+		fireEvent(series, showOrHide);
+	},
+
+	/**
+	 * Show the graph
+	 */
+	show: function () {
+		this.setVisible(true);
+	},
+
+	/**
+	 * Hide the graph
+	 */
+	hide: function () {
+		this.setVisible(false);
+	},
+
+
+	/**
+	 * Set the selected state of the graph
+	 *
+	 * @param selected {Boolean} True to select the series, false to unselect. If
+	 *        UNDEFINED, the selection state is toggled.
+	 */
+	select: function (selected) {
+		var series = this;
+		// if called without an argument, toggle
+		series.selected = selected = (selected === UNDEFINED) ? !series.selected : selected;
+
+		if (series.checkbox) {
+			series.checkbox.checked = selected;
+		}
+
+		fireEvent(series, selected ? 'select' : 'unselect');
+	},
+
+	/**
+	 * Draw the tracker object that sits above all data labels and markers to
+	 * track mouse events on the graph or points. For the line type charts
+	 * the tracker uses the same graphPath, but with a greater stroke width
+	 * for better control.
+	 */
+	drawTracker: function () {
+		var series = this,
+			options = series.options,
+			trackByArea = options.trackByArea,
+			trackerPath = [].concat(trackByArea ? series.areaPath : series.graphPath),
+			trackerPathLength = trackerPath.length,
+			chart = series.chart,
+			pointer = chart.pointer,
+			renderer = chart.renderer,
+			snap = chart.options.tooltip.snap,
+			tracker = series.tracker,
+			cursor = options.cursor,
+			css = cursor && { cursor: cursor },
+			singlePoints = series.singlePoints,
+			singlePoint,
+			i,
+			onMouseOver = function () {
+				if (chart.hoverSeries !== series) {
+					series.onMouseOver();
+				}
+			};
+
+		// Extend end points. A better way would be to use round linecaps,
+		// but those are not clickable in VML.
+		if (trackerPathLength && !trackByArea) {
+			i = trackerPathLength + 1;
+			while (i--) {
+				if (trackerPath[i] === M) { // extend left side
+					trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L);
+				}
+				if ((i && trackerPath[i] === M) || i === trackerPathLength) { // extend right side
+					trackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]);
+				}
+			}
+		}
+
+		// handle single points
+		for (i = 0; i < singlePoints.length; i++) {
+			singlePoint = singlePoints[i];
+			trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,
+				L, singlePoint.plotX + snap, singlePoint.plotY);
+		}
+		
+		
+
+		// draw the tracker
+		if (tracker) {
+			tracker.attr({ d: trackerPath });
+
+		} else { // create
+				
+			series.tracker = renderer.path(trackerPath)
+				.attr({
+					'stroke-linejoin': 'round', // #1225
+					visibility: series.visible ? VISIBLE : HIDDEN,
+					stroke: TRACKER_FILL,
+					fill: trackByArea ? TRACKER_FILL : NONE,
+					'stroke-width' : options.lineWidth + (trackByArea ? 0 : 2 * snap),
+					zIndex: 2
+				})
+				.add(series.group);
+				
+			// The tracker is added to the series group, which is clipped, but is covered 
+			// by the marker group. So the marker group also needs to capture events.
+			each([series.tracker, series.markerGroup], function (tracker) {
+				tracker.addClass(PREFIX + 'tracker')
+					.on('mouseover', onMouseOver)
+					.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })
+					.css(css);
+
+				if (hasTouch) {
+					tracker.on('touchstart', onMouseOver);
+				} 
+			});
+		}
+
+	}
+
+}; // end Series prototype
+
+
+/**
+ * LineSeries object
+ */
+var LineSeries = extendClass(Series);
+seriesTypes.line = LineSeries;
+
+/**
+ * Set the default options for area
+ */
+defaultPlotOptions.area = merge(defaultSeriesOptions, {
+	threshold: 0
+	// trackByArea: false,
+	// lineColor: null, // overrides color, but lets fillColor be unaltered
+	// fillOpacity: 0.75,
+	// fillColor: null
+});
+
+/**
+ * AreaSeries object
+ */
+var AreaSeries = extendClass(Series, {
+	type: 'area',
+	
+	/**
+	 * For stacks, don't split segments on null values. Instead, draw null values with 
+	 * no marker. Also insert dummy points for any X position that exists in other series
+	 * in the stack.
+	 */ 
+	getSegments: function () {
+		var segments = [],
+			segment = [],
+			keys = [],
+			xAxis = this.xAxis,
+			yAxis = this.yAxis,
+			stack = yAxis.stacks[this.stackKey],
+			pointMap = {},
+			plotX,
+			plotY,
+			points = this.points,
+			connectNulls = this.options.connectNulls,
+			val,
+			i,
+			x;
+
+		if (this.options.stacking && !this.cropped) { // cropped causes artefacts in Stock, and perf issue
+			// Create a map where we can quickly look up the points by their X value.
+			for (i = 0; i < points.length; i++) {
+				pointMap[points[i].x] = points[i];
+			}
+
+			// Sort the keys (#1651)
+			for (x in stack) {
+				keys.push(+x);
+			}
+			keys.sort(function (a, b) {
+				return a - b;
+			});
+
+			each(keys, function (x) {
+				if (connectNulls && (!pointMap[x] || pointMap[x].y === null)) { // #1836
+					return;
+
+				// The point exists, push it to the segment
+				} else if (pointMap[x]) {
+					segment.push(pointMap[x]);
+
+				// There is no point for this X value in this series, so we 
+				// insert a dummy point in order for the areas to be drawn
+				// correctly.
+				} else {
+					plotX = xAxis.translate(x);
+					val = stack[x].percent ? (stack[x].total ? stack[x].cum * 100 / stack[x].total : 0) : stack[x].cum; // #1991
+					plotY = yAxis.toPixels(val, true);
+					segment.push({ 
+						y: null, 
+						plotX: plotX,
+						clientX: plotX, 
+						plotY: plotY, 
+						yBottom: plotY,
+						onMouseOver: noop
+					});
+				}
+			});
+
+			if (segment.length) {
+				segments.push(segment);
+			}
+
+		} else {
+			Series.prototype.getSegments.call(this);
+			segments = this.segments;
+		}
+
+		this.segments = segments;
+	},
+	
+	/**
+	 * Extend the base Series getSegmentPath method by adding the path for the area.
+	 * This path is pushed to the series.areaPath property.
+	 */
+	getSegmentPath: function (segment) {
+		
+		var segmentPath = Series.prototype.getSegmentPath.call(this, segment), // call base method
+			areaSegmentPath = [].concat(segmentPath), // work on a copy for the area path
+			i,
+			options = this.options,
+			segLength = segmentPath.length,
+			translatedThreshold = this.yAxis.getThreshold(options.threshold), // #2181
+			yBottom;
+		
+		if (segLength === 3) { // for animation from 1 to two points
+			areaSegmentPath.push(L, segmentPath[1], segmentPath[2]);
+		}
+		if (options.stacking && !this.closedStacks) {
+			
+			// Follow stack back. Todo: implement areaspline. A general solution could be to 
+			// reverse the entire graphPath of the previous series, though may be hard with
+			// splines and with series with different extremes
+			for (i = segment.length - 1; i >= 0; i--) {
+
+				yBottom = pick(segment[i].yBottom, translatedThreshold);
+			
+				// step line?
+				if (i < segment.length - 1 && options.step) {
+					areaSegmentPath.push(segment[i + 1].plotX, yBottom);
+				}
+				
+				areaSegmentPath.push(segment[i].plotX, yBottom);
+			}
+
+		} else { // follow zero line back
+			this.closeSegment(areaSegmentPath, segment, translatedThreshold);
+		}
+		this.areaPath = this.areaPath.concat(areaSegmentPath);
+		return segmentPath;
+	},
+	
+	/**
+	 * Extendable method to close the segment path of an area. This is overridden in polar 
+	 * charts.
+	 */
+	closeSegment: function (path, segment, translatedThreshold) {
+		path.push(
+			L,
+			segment[segment.length - 1].plotX,
+			translatedThreshold,
+			L,
+			segment[0].plotX,
+			translatedThreshold
+		);
+	},
+	
+	/**
+	 * Draw the graph and the underlying area. This method calls the Series base
+	 * function and adds the area. The areaPath is calculated in the getSegmentPath
+	 * method called from Series.prototype.drawGraph.
+	 */
+	drawGraph: function () {
+		
+		// Define or reset areaPath
+		this.areaPath = [];
+		
+		// Call the base method
+		Series.prototype.drawGraph.apply(this);
+		
+		// Define local variables
+		var series = this,
+			areaPath = this.areaPath,
+			options = this.options,
+			negativeColor = options.negativeColor,
+			negativeFillColor = options.negativeFillColor,
+			props = [['area', this.color, options.fillColor]]; // area name, main color, fill color
+		
+		if (negativeColor || negativeFillColor) {
+			props.push(['areaNeg', negativeColor, negativeFillColor]);
+		}
+		
+		each(props, function (prop) {
+			var areaKey = prop[0],
+				area = series[areaKey];
+				
+			// Create or update the area
+			if (area) { // update
+				area.animate({ d: areaPath });
+	
+			} else { // create
+				series[areaKey] = series.chart.renderer.path(areaPath)
+					.attr({
+						fill: pick(
+							prop[2],
+							Color(prop[1]).setOpacity(pick(options.fillOpacity, 0.75)).get()
+						),
+						zIndex: 0 // #1069
+					}).add(series.group);
+			}
+		});
+	},
+	
+	/**
+	 * Get the series' symbol in the legend
+	 * 
+	 * @param {Object} legend The legend object
+	 * @param {Object} item The series (this) or point
+	 */
+	drawLegendSymbol: function (legend, item) {
+		
+		item.legendSymbol = this.chart.renderer.rect(
+			0,
+			legend.baseline - 11,
+			legend.options.symbolWidth,
+			12,
+			2
+		).attr({
+			zIndex: 3
+		}).add(item.legendGroup);		
+		
+	}
+});
+
+seriesTypes.area = AreaSeries;/**
+ * Set the default options for spline
+ */
+defaultPlotOptions.spline = merge(defaultSeriesOptions);
+
+/**
+ * SplineSeries object
+ */
+var SplineSeries = extendClass(Series, {
+	type: 'spline',
+
+	/**
+	 * Get the spline segment from a given point's previous neighbour to the given point
+	 */
+	getPointSpline: function (segment, point, i) {
+		var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc
+			denom = smoothing + 1,
+			plotX = point.plotX,
+			plotY = point.plotY,
+			lastPoint = segment[i - 1],
+			nextPoint = segment[i + 1],
+			leftContX,
+			leftContY,
+			rightContX,
+			rightContY,
+			ret;
+
+		// find control points
+		if (lastPoint && nextPoint) {
+		
+			var lastX = lastPoint.plotX,
+				lastY = lastPoint.plotY,
+				nextX = nextPoint.plotX,
+				nextY = nextPoint.plotY,
+				correction;
+
+			leftContX = (smoothing * plotX + lastX) / denom;
+			leftContY = (smoothing * plotY + lastY) / denom;
+			rightContX = (smoothing * plotX + nextX) / denom;
+			rightContY = (smoothing * plotY + nextY) / denom;
+
+			// have the two control points make a straight line through main point
+			correction = ((rightContY - leftContY) * (rightContX - plotX)) /
+				(rightContX - leftContX) + plotY - rightContY;
+
+			leftContY += correction;
+			rightContY += correction;
+
+			// to prevent false extremes, check that control points are between
+			// neighbouring points' y values
+			if (leftContY > lastY && leftContY > plotY) {
+				leftContY = mathMax(lastY, plotY);
+				rightContY = 2 * plotY - leftContY; // mirror of left control point
+			} else if (leftContY < lastY && leftContY < plotY) {
+				leftContY = mathMin(lastY, plotY);
+				rightContY = 2 * plotY - leftContY;
+			}
+			if (rightContY > nextY && rightContY > plotY) {
+				rightContY = mathMax(nextY, plotY);
+				leftContY = 2 * plotY - rightContY;
+			} else if (rightContY < nextY && rightContY < plotY) {
+				rightContY = mathMin(nextY, plotY);
+				leftContY = 2 * plotY - rightContY;
+			}
+
+			// record for drawing in next point
+			point.rightContX = rightContX;
+			point.rightContY = rightContY;
+
+		}
+		
+		// Visualize control points for debugging
+		/*
+		if (leftContX) {
+			this.chart.renderer.circle(leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop, 2)
+				.attr({
+					stroke: 'red',
+					'stroke-width': 1,
+					fill: 'none'
+				})
+				.add();
+			this.chart.renderer.path(['M', leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop,
+				'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])
+				.attr({
+					stroke: 'red',
+					'stroke-width': 1
+				})
+				.add();
+			this.chart.renderer.circle(rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop, 2)
+				.attr({
+					stroke: 'green',
+					'stroke-width': 1,
+					fill: 'none'
+				})
+				.add();
+			this.chart.renderer.path(['M', rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop,
+				'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])
+				.attr({
+					stroke: 'green',
+					'stroke-width': 1
+				})
+				.add();
+		}
+		*/
+
+		// moveTo or lineTo
+		if (!i) {
+			ret = [M, plotX, plotY];
+		} else { // curve from last point to this
+			ret = [
+				'C',
+				lastPoint.rightContX || lastPoint.plotX,
+				lastPoint.rightContY || lastPoint.plotY,
+				leftContX || plotX,
+				leftContY || plotY,
+				plotX,
+				plotY
+			];
+			lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later
+		}
+		return ret;
+	}
+});
+seriesTypes.spline = SplineSeries;
+
+/**
+ * Set the default options for areaspline
+ */
+defaultPlotOptions.areaspline = merge(defaultPlotOptions.area);
+
+/**
+ * AreaSplineSeries object
+ */
+var areaProto = AreaSeries.prototype,
+	AreaSplineSeries = extendClass(SplineSeries, {
+		type: 'areaspline',
+		closedStacks: true, // instead of following the previous graph back, follow the threshold back
+		
+		// Mix in methods from the area series
+		getSegmentPath: areaProto.getSegmentPath,
+		closeSegment: areaProto.closeSegment,
+		drawGraph: areaProto.drawGraph,
+		drawLegendSymbol: areaProto.drawLegendSymbol
+	});
+seriesTypes.areaspline = AreaSplineSeries;
+
+/**
+ * Set the default options for column
+ */
+defaultPlotOptions.column = merge(defaultSeriesOptions, {
+	borderColor: '#FFFFFF',
+	borderWidth: 1,
+	borderRadius: 0,
+	//colorByPoint: undefined,
+	groupPadding: 0.2,
+	//grouping: true,
+	marker: null, // point options are specified in the base options
+	pointPadding: 0.1,
+	//pointWidth: null,
+	minPointLength: 0,
+	cropThreshold: 50, // when there are more points, they will not animate out of the chart on xAxis.setExtremes
+	pointRange: null, // null means auto, meaning 1 in a categorized axis and least distance between points if not categories
+	states: {
+		hover: {
+			brightness: 0.1,
+			shadow: false
+		},
+		select: {
+			color: '#C0C0C0',
+			borderColor: '#000000',
+			shadow: false
+		}
+	},
+	dataLabels: {
+		align: null, // auto
+		verticalAlign: null, // auto
+		y: null
+	},
+	stickyTracking: false,
+	threshold: 0
+});
+
+/**
+ * ColumnSeries object
+ */
+var ColumnSeries = extendClass(Series, {
+	type: 'column',
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		stroke: 'borderColor',
+		'stroke-width': 'borderWidth',
+		fill: 'color',
+		r: 'borderRadius'
+	},
+	cropShoulder: 0,
+	trackerGroups: ['group', 'dataLabelsGroup'],
+	negStacks: true, // use separate negative stacks, unlike area stacks where a negative 
+		// point is substracted from previous (#1910)
+	
+	/**
+	 * Initialize the series
+	 */
+	init: function () {
+		Series.prototype.init.apply(this, arguments);
+
+		var series = this,
+			chart = series.chart;
+
+		// if the series is added dynamically, force redraw of other
+		// series affected by a new column
+		if (chart.hasRendered) {
+			each(chart.series, function (otherSeries) {
+				if (otherSeries.type === series.type) {
+					otherSeries.isDirty = true;
+				}
+			});
+		}
+	},
+
+	/**
+	 * Return the width and x offset of the columns adjusted for grouping, groupPadding, pointPadding,
+	 * pointWidth etc. 
+	 */
+	getColumnMetrics: function () {
+
+		var series = this,
+			options = series.options,
+			xAxis = series.xAxis,
+			yAxis = series.yAxis,
+			reversedXAxis = xAxis.reversed,
+			stackKey,
+			stackGroups = {},
+			columnIndex,
+			columnCount = 0;
+
+		// Get the total number of column type series.
+		// This is called on every series. Consider moving this logic to a
+		// chart.orderStacks() function and call it on init, addSeries and removeSeries
+		if (options.grouping === false) {
+			columnCount = 1;
+		} else {
+			each(series.chart.series, function (otherSeries) {
+				var otherOptions = otherSeries.options,
+					otherYAxis = otherSeries.yAxis;
+				if (otherSeries.type === series.type && otherSeries.visible &&
+						yAxis.len === otherYAxis.len && yAxis.pos === otherYAxis.pos) {  // #642, #2086
+					if (otherOptions.stacking) {
+						stackKey = otherSeries.stackKey;
+						if (stackGroups[stackKey] === UNDEFINED) {
+							stackGroups[stackKey] = columnCount++;
+						}
+						columnIndex = stackGroups[stackKey];
+					} else if (otherOptions.grouping !== false) { // #1162
+						columnIndex = columnCount++;
+					}
+					otherSeries.columnIndex = columnIndex;
+				}
+			});
+		}
+
+		var categoryWidth = mathMin(
+				mathAbs(xAxis.transA) * (xAxis.ordinalSlope || options.pointRange || xAxis.closestPointRange || 1), 
+				xAxis.len // #1535
+			),
+			groupPadding = categoryWidth * options.groupPadding,
+			groupWidth = categoryWidth - 2 * groupPadding,
+			pointOffsetWidth = groupWidth / columnCount,
+			optionPointWidth = options.pointWidth,
+			pointPadding = defined(optionPointWidth) ? (pointOffsetWidth - optionPointWidth) / 2 :
+				pointOffsetWidth * options.pointPadding,
+			pointWidth = pick(optionPointWidth, pointOffsetWidth - 2 * pointPadding), // exact point width, used in polar charts
+			colIndex = (reversedXAxis ? 
+				columnCount - (series.columnIndex || 0) : // #1251
+				series.columnIndex) || 0,
+			pointXOffset = pointPadding + (groupPadding + colIndex *
+				pointOffsetWidth - (categoryWidth / 2)) *
+				(reversedXAxis ? -1 : 1);
+
+		// Save it for reading in linked series (Error bars particularly)
+		return (series.columnMetrics = { 
+			width: pointWidth, 
+			offset: pointXOffset 
+		});
+			
+	},
+
+	/**
+	 * Translate each point to the plot area coordinate system and find shape positions
+	 */
+	translate: function () {
+		var series = this,
+			chart = series.chart,
+			options = series.options,
+			borderWidth = options.borderWidth,
+			yAxis = series.yAxis,
+			threshold = options.threshold,
+			translatedThreshold = series.translatedThreshold = yAxis.getThreshold(threshold),
+			minPointLength = pick(options.minPointLength, 5),
+			metrics = series.getColumnMetrics(),
+			pointWidth = metrics.width,
+			seriesBarW = series.barW = mathCeil(mathMax(pointWidth, 1 + 2 * borderWidth)), // rounded and postprocessed for border width
+			pointXOffset = series.pointXOffset = metrics.offset,
+			xCrisp = -(borderWidth % 2 ? 0.5 : 0),
+			yCrisp = borderWidth % 2 ? 0.5 : 1;
+
+		if (chart.renderer.isVML && chart.inverted) {
+			yCrisp += 1;
+		}
+
+		Series.prototype.translate.apply(series);
+
+		// record the new values
+		each(series.points, function (point) {
+			var yBottom = pick(point.yBottom, translatedThreshold),
+				plotY = mathMin(mathMax(-999 - yBottom, point.plotY), yAxis.len + 999 + yBottom), // Don't draw too far outside plot area (#1303, #2241)
+				barX = point.plotX + pointXOffset,
+				barW = seriesBarW,
+				barY = mathMin(plotY, yBottom),
+				right,
+				bottom,
+				fromTop,
+				fromLeft,
+				barH = mathMax(plotY, yBottom) - barY;
+
+			// Handle options.minPointLength
+			if (mathAbs(barH) < minPointLength) {
+				if (minPointLength) {
+					barH = minPointLength;
+					barY =
+						mathRound(mathAbs(barY - translatedThreshold) > minPointLength ? // stacked
+							yBottom - minPointLength : // keep position
+							translatedThreshold - (yAxis.translate(point.y, 0, 1, 0, 1) <= translatedThreshold ? minPointLength : 0)); // use exact yAxis.translation (#1485)
+				}
+			}
+
+			// Cache for access in polar
+			point.barX = barX;
+			point.pointWidth = pointWidth;
+
+
+			// Round off to obtain crisp edges
+			fromLeft = mathAbs(barX) < 0.5;
+			right = mathRound(barX + barW) + xCrisp;
+			barX = mathRound(barX) + xCrisp;
+			barW = right - barX;
+
+			fromTop = mathAbs(barY) < 0.5;
+			bottom = mathRound(barY + barH) + yCrisp;
+			barY = mathRound(barY) + yCrisp;
+			barH = bottom - barY;
+
+			// Top and left edges are exceptions
+			if (fromLeft) {
+				barX += 1;
+				barW -= 1;
+			}
+			if (fromTop) {
+				barY -= 1;
+				barH += 1;
+			}
+
+			// Register shape type and arguments to be used in drawPoints
+			point.shapeType = 'rect';
+			point.shapeArgs = {
+				x: barX,
+				y: barY,
+				width: barW,
+				height: barH
+			};
+		});
+
+	},
+
+	getSymbol: noop,
+	
+	/**
+	 * Use a solid rectangle like the area series types
+	 */
+	drawLegendSymbol: AreaSeries.prototype.drawLegendSymbol,
+	
+	
+	/**
+	 * Columns have no graph
+	 */
+	drawGraph: noop,
+
+	/**
+	 * Draw the columns. For bars, the series.group is rotated, so the same coordinates
+	 * apply for columns and bars. This method is inherited by scatter series.
+	 *
+	 */
+	drawPoints: function () {
+		var series = this,
+			options = series.options,
+			renderer = series.chart.renderer,
+			shapeArgs;
+
+
+		// draw the columns
+		each(series.points, function (point) {
+			var plotY = point.plotY,
+				graphic = point.graphic;
+
+			if (plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {
+				shapeArgs = point.shapeArgs;
+				
+				if (graphic) { // update
+					stop(graphic);
+					graphic.animate(merge(shapeArgs));
+
+				} else {
+					point.graphic = graphic = renderer[point.shapeType](shapeArgs)
+						.attr(point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE])
+						.add(series.group)
+						.shadow(options.shadow, null, options.stacking && !options.borderRadius);
+				}
+
+			} else if (graphic) {
+				point.graphic = graphic.destroy(); // #1269
+			}
+		});
+	},
+
+	/**
+	 * Add tracking event listener to the series group, so the point graphics
+	 * themselves act as trackers
+	 */
+	drawTracker: function () {
+		var series = this,
+			chart = series.chart,
+			pointer = chart.pointer,
+			cursor = series.options.cursor,
+			css = cursor && { cursor: cursor },
+			onMouseOver = function (e) {
+				var target = e.target,
+					point;
+
+				if (chart.hoverSeries !== series) {
+					series.onMouseOver();
+				}
+				while (target && !point) {
+					point = target.point;
+					target = target.parentNode;
+				}
+				if (point !== UNDEFINED && point !== chart.hoverPoint) { // undefined on graph in scatterchart
+					point.onMouseOver(e);
+				}
+			};
+
+		// Add reference to the point
+		each(series.points, function (point) {
+			if (point.graphic) {
+				point.graphic.element.point = point;
+			}
+			if (point.dataLabel) {
+				point.dataLabel.element.point = point;
+			}
+		});
+
+		// Add the event listeners, we need to do this only once
+		if (!series._hasTracking) {
+			each(series.trackerGroups, function (key) {
+				if (series[key]) { // we don't always have dataLabelsGroup
+					series[key]
+						.addClass(PREFIX + 'tracker')
+						.on('mouseover', onMouseOver)
+						.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })
+						.css(css);
+					if (hasTouch) {
+						series[key].on('touchstart', onMouseOver);
+					}
+				}
+			});
+			series._hasTracking = true;
+		}
+	},
+	
+	/** 
+	 * Override the basic data label alignment by adjusting for the position of the column
+	 */
+	alignDataLabel: function (point, dataLabel, options,  alignTo, isNew) {
+		var chart = this.chart,
+			inverted = chart.inverted,
+			dlBox = point.dlBox || point.shapeArgs, // data label box for alignment
+			below = point.below || (point.plotY > pick(this.translatedThreshold, chart.plotSizeY)),
+			inside = pick(options.inside, !!this.options.stacking); // draw it inside the box?
+		
+		// Align to the column itself, or the top of it
+		if (dlBox) { // Area range uses this method but not alignTo
+			alignTo = merge(dlBox);
+			if (inverted) {
+				alignTo = {
+					x: chart.plotWidth - alignTo.y - alignTo.height,
+					y: chart.plotHeight - alignTo.x - alignTo.width,
+					width: alignTo.height,
+					height: alignTo.width
+				};
+			}
+				
+			// Compute the alignment box
+			if (!inside) {
+				if (inverted) {
+					alignTo.x += below ? 0 : alignTo.width;
+					alignTo.width = 0;
+				} else {
+					alignTo.y += below ? alignTo.height : 0;
+					alignTo.height = 0;
+				}
+			}
+		}
+		
+		// When alignment is undefined (typically columns and bars), display the individual 
+		// point below or above the point depending on the threshold
+		options.align = pick(
+			options.align, 
+			!inverted || inside ? 'center' : below ? 'right' : 'left'
+		);
+		options.verticalAlign = pick(
+			options.verticalAlign, 
+			inverted || inside ? 'middle' : below ? 'top' : 'bottom'
+		);
+		
+		// Call the parent method
+		Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);
+	},
+
+
+	/**
+	 * Animate the column heights one by one from zero
+	 * @param {Boolean} init Whether to initialize the animation or run it
+	 */
+	animate: function (init) {
+		var series = this,
+			yAxis = this.yAxis,
+			options = series.options,
+			inverted = this.chart.inverted,
+			attr = {},
+			translatedThreshold;
+
+		if (hasSVG) { // VML is too slow anyway
+			if (init) {
+				attr.scaleY = 0.001;
+				translatedThreshold = mathMin(yAxis.pos + yAxis.len, mathMax(yAxis.pos, yAxis.toPixels(options.threshold)));
+				if (inverted) {
+					attr.translateX = translatedThreshold - yAxis.len;
+				} else {
+					attr.translateY = translatedThreshold;
+				}
+				series.group.attr(attr);
+
+			} else { // run the animation
+				
+				attr.scaleY = 1;
+				attr[inverted ? 'translateX' : 'translateY'] = yAxis.pos;
+				series.group.animate(attr, series.options.animation);
+
+				// delete this function to allow it only once
+				series.animate = null;
+			}
+		}
+	},
+	
+	/**
+	 * Remove this series from the chart
+	 */
+	remove: function () {
+		var series = this,
+			chart = series.chart;
+
+		// column and bar series affects other series of the same type
+		// as they are either stacked or grouped
+		if (chart.hasRendered) {
+			each(chart.series, function (otherSeries) {
+				if (otherSeries.type === series.type) {
+					otherSeries.isDirty = true;
+				}
+			});
+		}
+
+		Series.prototype.remove.apply(series, arguments);
+	}
+});
+seriesTypes.column = ColumnSeries;
+/**
+ * Set the default options for bar
+ */
+defaultPlotOptions.bar = merge(defaultPlotOptions.column);
+/**
+ * The Bar series class
+ */
+var BarSeries = extendClass(ColumnSeries, {
+	type: 'bar',
+	inverted: true
+});
+seriesTypes.bar = BarSeries;
+
+/**
+ * Set the default options for scatter
+ */
+defaultPlotOptions.scatter = merge(defaultSeriesOptions, {
+	lineWidth: 0,
+	tooltip: {
+		headerFormat: '<span style="font-size: 10px; color:{series.color}">{series.name}</span><br/>',
+		pointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>',
+		followPointer: true
+	},
+	stickyTracking: false
+});
+
+/**
+ * The scatter series class
+ */
+var ScatterSeries = extendClass(Series, {
+	type: 'scatter',
+	sorted: false,
+	requireSorting: false,
+	noSharedTooltip: true,
+	trackerGroups: ['markerGroup'],
+
+	drawTracker: ColumnSeries.prototype.drawTracker,
+	
+	setTooltipPoints: noop
+});
+seriesTypes.scatter = ScatterSeries;
+
+/**
+ * Set the default options for pie
+ */
+defaultPlotOptions.pie = merge(defaultSeriesOptions, {
+	borderColor: '#FFFFFF',
+	borderWidth: 1,
+	center: [null, null],
+	clip: false,
+	colorByPoint: true, // always true for pies
+	dataLabels: {
+		// align: null,
+		// connectorWidth: 1,
+		// connectorColor: point.color,
+		// connectorPadding: 5,
+		distance: 30,
+		enabled: true,
+		formatter: function () {
+			return this.point.name;
+		}
+		// softConnector: true,
+		//y: 0
+	},
+	ignoreHiddenPoint: true,
+	//innerSize: 0,
+	legendType: 'point',
+	marker: null, // point options are specified in the base options
+	size: null,
+	showInLegend: false,
+	slicedOffset: 10,
+	states: {
+		hover: {
+			brightness: 0.1,
+			shadow: false
+		}
+	},
+	stickyTracking: false,
+	tooltip: {
+		followPointer: true
+	}
+});
+
+/**
+ * Extended point object for pies
+ */
+var PiePoint = extendClass(Point, {
+	/**
+	 * Initiate the pie slice
+	 */
+	init: function () {
+
+		Point.prototype.init.apply(this, arguments);
+
+		var point = this,
+			toggleSlice;
+
+		// Disallow negative values (#1530)
+		if (point.y < 0) {
+			point.y = null;
+		}
+
+		//visible: options.visible !== false,
+		extend(point, {
+			visible: point.visible !== false,
+			name: pick(point.name, 'Slice')
+		});
+
+		// add event listener for select
+		toggleSlice = function (e) {
+			point.slice(e.type === 'select');
+		};
+		addEvent(point, 'select', toggleSlice);
+		addEvent(point, 'unselect', toggleSlice);
+
+		return point;
+	},
+
+	/**
+	 * Toggle the visibility of the pie slice
+	 * @param {Boolean} vis Whether to show the slice or not. If undefined, the
+	 *    visibility is toggled
+	 */
+	setVisible: function (vis) {
+		var point = this,
+			series = point.series,
+			chart = series.chart,
+			method;
+
+		// if called without an argument, toggle visibility
+		point.visible = point.options.visible = vis = vis === UNDEFINED ? !point.visible : vis;
+		series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data
+		
+		method = vis ? 'show' : 'hide';
+
+		// Show and hide associated elements
+		each(['graphic', 'dataLabel', 'connector', 'shadowGroup'], function (key) {
+			if (point[key]) {
+				point[key][method]();
+			}
+		});
+
+		if (point.legendItem) {
+			chart.legend.colorizeItem(point, vis);
+		}
+		
+		// Handle ignore hidden slices
+		if (!series.isDirty && series.options.ignoreHiddenPoint) {
+			series.isDirty = true;
+			chart.redraw();
+		}
+	},
+
+	/**
+	 * Set or toggle whether the slice is cut out from the pie
+	 * @param {Boolean} sliced When undefined, the slice state is toggled
+	 * @param {Boolean} redraw Whether to redraw the chart. True by default.
+	 */
+	slice: function (sliced, redraw, animation) {
+		var point = this,
+			series = point.series,
+			chart = series.chart,
+			translation;
+
+		setAnimation(animation, chart);
+
+		// redraw is true by default
+		redraw = pick(redraw, true);
+
+		// if called without an argument, toggle
+		point.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;
+		series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data
+
+		translation = sliced ? point.slicedTranslation : {
+			translateX: 0,
+			translateY: 0
+		};
+
+		point.graphic.animate(translation);
+		
+		if (point.shadowGroup) {
+			point.shadowGroup.animate(translation);
+		}
+
+	}
+});
+
+/**
+ * The Pie series class
+ */
+var PieSeries = {
+	type: 'pie',
+	isCartesian: false,
+	pointClass: PiePoint,
+	requireSorting: false,
+	noSharedTooltip: true,
+	trackerGroups: ['group', 'dataLabelsGroup'],
+	pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+		stroke: 'borderColor',
+		'stroke-width': 'borderWidth',
+		fill: 'color'
+	},
+
+	/**
+	 * Pies have one color each point
+	 */
+	getColor: noop,
+
+	/**
+	 * Animate the pies in
+	 */
+	animate: function (init) {
+		var series = this,
+			points = series.points,
+			startAngleRad = series.startAngleRad;
+
+		if (!init) {
+			each(points, function (point) {
+				var graphic = point.graphic,
+					args = point.shapeArgs;
+
+				if (graphic) {
+					// start values
+					graphic.attr({
+						r: series.center[3] / 2, // animate from inner radius (#779)
+						start: startAngleRad,
+						end: startAngleRad
+					});
+
+					// animate
+					graphic.animate({
+						r: args.r,
+						start: args.start,
+						end: args.end
+					}, series.options.animation);
+				}
+			});
+
+			// delete this function to allow it only once
+			series.animate = null;
+		}
+	},
+
+	/**
+	 * Extend the basic setData method by running processData and generatePoints immediately,
+	 * in order to access the points from the legend.
+	 */
+	setData: function (data, redraw) {
+		Series.prototype.setData.call(this, data, false);
+		this.processData();
+		this.generatePoints();
+		if (pick(redraw, true)) {
+			this.chart.redraw();
+		} 
+	},
+
+	/**
+	 * Extend the generatePoints method by adding total and percentage properties to each point
+	 */
+	generatePoints: function () {
+		var i,
+			total = 0,
+			points,
+			len,
+			point,
+			ignoreHiddenPoint = this.options.ignoreHiddenPoint;
+
+		Series.prototype.generatePoints.call(this);
+
+		// Populate local vars
+		points = this.points;
+		len = points.length;
+		
+		// Get the total sum
+		for (i = 0; i < len; i++) {
+			point = points[i];
+			total += (ignoreHiddenPoint && !point.visible) ? 0 : point.y;
+		}
+		this.total = total;
+
+		// Set each point's properties
+		for (i = 0; i < len; i++) {
+			point = points[i];
+			point.percentage = total > 0 ? (point.y / total) * 100 : 0;
+			point.total = total;
+		}
+		
+	},
+	
+	/**
+	 * Get the center of the pie based on the size and center options relative to the  
+	 * plot area. Borrowed by the polar and gauge series types.
+	 */
+	getCenter: function () {
+		
+		var options = this.options,
+			chart = this.chart,
+			slicingRoom = 2 * (options.slicedOffset || 0),
+			handleSlicingRoom,
+			plotWidth = chart.plotWidth - 2 * slicingRoom,
+			plotHeight = chart.plotHeight - 2 * slicingRoom,
+			centerOption = options.center,
+			positions = [pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0],
+			smallestSize = mathMin(plotWidth, plotHeight),
+			isPercent;
+		
+		return map(positions, function (length, i) {
+			isPercent = /%$/.test(length);
+			handleSlicingRoom = i < 2 || (i === 2 && isPercent);
+			return (isPercent ?
+				// i == 0: centerX, relative to width
+				// i == 1: centerY, relative to height
+				// i == 2: size, relative to smallestSize
+				// i == 4: innerSize, relative to smallestSize
+				[plotWidth, plotHeight, smallestSize, smallestSize][i] *
+					pInt(length) / 100 :
+				length) + (handleSlicingRoom ? slicingRoom : 0);
+		});
+	},
+	
+	/**
+	 * Do translation for pie slices
+	 */
+	translate: function (positions) {
+		this.generatePoints();
+		
+		var series = this,
+			cumulative = 0,
+			precision = 1000, // issue #172
+			options = series.options,
+			slicedOffset = options.slicedOffset,
+			connectorOffset = slicedOffset + options.borderWidth,
+			start,
+			end,
+			angle,
+			startAngle = options.startAngle || 0,
+			startAngleRad = series.startAngleRad = mathPI / 180 * (startAngle - 90),
+			endAngleRad = series.endAngleRad = mathPI / 180 * ((options.endAngle || (startAngle + 360)) - 90), // docs
+			circ = endAngleRad - startAngleRad, //2 * mathPI,
+			points = series.points,
+			radiusX, // the x component of the radius vector for a given point
+			radiusY,
+			labelDistance = options.dataLabels.distance,
+			ignoreHiddenPoint = options.ignoreHiddenPoint,
+			i,
+			len = points.length,
+			point;
+
+		// Get positions - either an integer or a percentage string must be given.
+		// If positions are passed as a parameter, we're in a recursive loop for adjusting
+		// space for data labels.
+		if (!positions) {
+			series.center = positions = series.getCenter();
+		}
+
+		// utility for getting the x value from a given y, used for anticollision logic in data labels
+		series.getX = function (y, left) {
+
+			angle = math.asin((y - positions[1]) / (positions[2] / 2 + labelDistance));
+
+			return positions[0] +
+				(left ? -1 : 1) *
+				(mathCos(angle) * (positions[2] / 2 + labelDistance));
+		};
+
+		// Calculate the geometry for each point
+		for (i = 0; i < len; i++) {
+			
+			point = points[i];
+			
+			// set start and end angle
+			start = startAngleRad + (cumulative * circ);
+			if (!ignoreHiddenPoint || point.visible) {
+				cumulative += point.percentage / 100;
+			}
+			end = startAngleRad + (cumulative * circ);
+
+			// set the shape
+			point.shapeType = 'arc';
+			point.shapeArgs = {
+				x: positions[0],
+				y: positions[1],
+				r: positions[2] / 2,
+				innerR: positions[3] / 2,
+				start: mathRound(start * precision) / precision,
+				end: mathRound(end * precision) / precision
+			};
+
+			// center for the sliced out slice
+			angle = (end + start) / 2;
+			if (angle > 0.75 * circ) {
+				angle -= 2 * mathPI;
+			}
+			point.slicedTranslation = {
+				translateX: mathRound(mathCos(angle) * slicedOffset),
+				translateY: mathRound(mathSin(angle) * slicedOffset)
+			};
+
+			// set the anchor point for tooltips
+			radiusX = mathCos(angle) * positions[2] / 2;
+			radiusY = mathSin(angle) * positions[2] / 2;
+			point.tooltipPos = [
+				positions[0] + radiusX * 0.7,
+				positions[1] + radiusY * 0.7
+			];
+			
+			point.half = angle < -mathPI / 2 || angle > mathPI / 2 ? 1 : 0;
+			point.angle = angle;
+
+			// set the anchor point for data labels
+			connectorOffset = mathMin(connectorOffset, labelDistance / 2); // #1678
+			point.labelPos = [
+				positions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector
+				positions[1] + radiusY + mathSin(angle) * labelDistance, // a/a
+				positions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie
+				positions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a
+				positions[0] + radiusX, // landing point for connector
+				positions[1] + radiusY, // a/a
+				labelDistance < 0 ? // alignment
+					'center' :
+					point.half ? 'right' : 'left', // alignment
+				angle // center angle
+			];
+
+		}
+	},
+
+	setTooltipPoints: noop,
+	drawGraph: null,
+
+	/**
+	 * Draw the data points
+	 */
+	drawPoints: function () {
+		var series = this,
+			chart = series.chart,
+			renderer = chart.renderer,
+			groupTranslation,
+			//center,
+			graphic,
+			//group,
+			shadow = series.options.shadow,
+			shadowGroup,
+			shapeArgs;
+
+		if (shadow && !series.shadowGroup) {
+			series.shadowGroup = renderer.g('shadow')
+				.add(series.group);
+		}
+
+		// draw the slices
+		each(series.points, function (point) {
+			graphic = point.graphic;
+			shapeArgs = point.shapeArgs;
+			shadowGroup = point.shadowGroup;
+
+			// put the shadow behind all points
+			if (shadow && !shadowGroup) {
+				shadowGroup = point.shadowGroup = renderer.g('shadow')
+					.add(series.shadowGroup);
+			}
+
+			// if the point is sliced, use special translation, else use plot area traslation
+			groupTranslation = point.sliced ? point.slicedTranslation : {
+				translateX: 0,
+				translateY: 0
+			};
+
+			//group.translate(groupTranslation[0], groupTranslation[1]);
+			if (shadowGroup) {
+				shadowGroup.attr(groupTranslation);
+			}
+
+			// draw the slice
+			if (graphic) {
+				graphic.animate(extend(shapeArgs, groupTranslation));
+			} else {
+				point.graphic = graphic = renderer.arc(shapeArgs)
+					.setRadialReference(series.center)
+					.attr(
+						point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]
+					)
+					.attr({ 'stroke-linejoin': 'round' })
+					.attr(groupTranslation)
+					.add(series.group)
+					.shadow(shadow, shadowGroup);	
+			}
+
+			// detect point specific visibility
+			if (point.visible === false) {
+				point.setVisible(false);
+			}
+
+		});
+
+	},
+
+	/**
+	 * Utility for sorting data labels
+	 */
+	sortByAngle: function (points, sign) {
+		points.sort(function (a, b) {
+			return a.angle !== undefined && (b.angle - a.angle) * sign;
+		});
+	},
+
+	/**
+	 * Override the base drawDataLabels method by pie specific functionality
+	 */
+	drawDataLabels: function () {
+		var series = this,
+			data = series.data,
+			point,
+			chart = series.chart,
+			options = series.options.dataLabels,
+			connectorPadding = pick(options.connectorPadding, 10),
+			connectorWidth = pick(options.connectorWidth, 1),
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			connector,
+			connectorPath,
+			softConnector = pick(options.softConnector, true),
+			distanceOption = options.distance,
+			seriesCenter = series.center,
+			radius = seriesCenter[2] / 2,
+			centerY = seriesCenter[1],
+			outside = distanceOption > 0,
+			dataLabel,
+			dataLabelWidth,
+			labelPos,
+			labelHeight,
+			halves = [// divide the points into right and left halves for anti collision
+				[], // right
+				[]  // left
+			],
+			x,
+			y,
+			visibility,
+			rankArr,
+			i,
+			j,
+			overflow = [0, 0, 0, 0], // top, right, bottom, left
+			sort = function (a, b) {
+				return b.y - a.y;
+			};
+
+		// get out if not enabled
+		if (!series.visible || (!options.enabled && !series._hasPointLabels)) {
+			return;
+		}
+
+		// run parent method
+		Series.prototype.drawDataLabels.apply(series);
+
+		// arrange points for detection collision
+		each(data, function (point) {
+			if (point.dataLabel) { // it may have been cancelled in the base method (#407)
+				halves[point.half].push(point);
+			}
+		});
+
+		// assume equal label heights
+		i = 0;
+		while (!labelHeight && data[i]) { // #1569
+			labelHeight = data[i] && data[i].dataLabel && (data[i].dataLabel.getBBox().height || 21); // 21 is for #968
+			i++;
+		}
+
+		/* Loop over the points in each half, starting from the top and bottom
+		 * of the pie to detect overlapping labels.
+		 */
+		i = 2;
+		while (i--) {
+
+			var slots = [],
+				slotsLength,
+				usedSlots = [],
+				points = halves[i],
+				pos,
+				length = points.length,
+				slotIndex;
+				
+			// Sort by angle
+			series.sortByAngle(points, i - 0.5);
+
+			// Only do anti-collision when we are outside the pie and have connectors (#856)
+			if (distanceOption > 0) {
+				
+				// build the slots
+				for (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) {
+					slots.push(pos);
+					
+					// visualize the slot
+					/*
+					var slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0),
+						slotY = pos + chart.plotTop;
+					if (!isNaN(slotX)) {
+						chart.renderer.rect(slotX, slotY - 7, 100, labelHeight, 1)
+							.attr({
+								'stroke-width': 1,
+								stroke: 'silver'
+							})
+							.add();
+						chart.renderer.text('Slot '+ (slots.length - 1), slotX, slotY + 4)
+							.attr({
+								fill: 'silver'
+							}).add();
+					}
+					*/
+				}
+				slotsLength = slots.length;
+	
+				// if there are more values than available slots, remove lowest values
+				if (length > slotsLength) {
+					// create an array for sorting and ranking the points within each quarter
+					rankArr = [].concat(points);
+					rankArr.sort(sort);
+					j = length;
+					while (j--) {
+						rankArr[j].rank = j;
+					}
+					j = length;
+					while (j--) {
+						if (points[j].rank >= slotsLength) {
+							points.splice(j, 1);
+						}
+					}
+					length = points.length;
+				}
+	
+				// The label goes to the nearest open slot, but not closer to the edge than
+				// the label's index.
+				for (j = 0; j < length; j++) {
+	
+					point = points[j];
+					labelPos = point.labelPos;
+	
+					var closest = 9999,
+						distance,
+						slotI;
+	
+					// find the closest slot index
+					for (slotI = 0; slotI < slotsLength; slotI++) {
+						distance = mathAbs(slots[slotI] - labelPos[1]);
+						if (distance < closest) {
+							closest = distance;
+							slotIndex = slotI;
+						}
+					}
+	
+					// if that slot index is closer to the edges of the slots, move it
+					// to the closest appropriate slot
+					if (slotIndex < j && slots[j] !== null) { // cluster at the top
+						slotIndex = j;
+					} else if (slotsLength  < length - j + slotIndex && slots[j] !== null) { // cluster at the bottom
+						slotIndex = slotsLength - length + j;
+						while (slots[slotIndex] === null) { // make sure it is not taken
+							slotIndex++;
+						}
+					} else {
+						// Slot is taken, find next free slot below. In the next run, the next slice will find the
+						// slot above these, because it is the closest one
+						while (slots[slotIndex] === null) { // make sure it is not taken
+							slotIndex++;
+						}
+					}
+	
+					usedSlots.push({ i: slotIndex, y: slots[slotIndex] });
+					slots[slotIndex] = null; // mark as taken
+				}
+				// sort them in order to fill in from the top
+				usedSlots.sort(sort);
+			}
+
+			// now the used slots are sorted, fill them up sequentially
+			for (j = 0; j < length; j++) {
+				
+				var slot, naturalY;
+
+				point = points[j];
+				labelPos = point.labelPos;
+				dataLabel = point.dataLabel;
+				visibility = point.visible === false ? HIDDEN : VISIBLE;
+				naturalY = labelPos[1];
+				
+				if (distanceOption > 0) {
+					slot = usedSlots.pop();
+					slotIndex = slot.i;
+
+					// if the slot next to currrent slot is free, the y value is allowed
+					// to fall back to the natural position
+					y = slot.y;
+					if ((naturalY > y && slots[slotIndex + 1] !== null) ||
+							(naturalY < y &&  slots[slotIndex - 1] !== null)) {
+						y = naturalY;
+					}
+					
+				} else {
+					y = naturalY;
+				}
+
+				// get the x - use the natural x position for first and last slot, to prevent the top
+				// and botton slice connectors from touching each other on either side
+				x = options.justify ? 
+					seriesCenter[0] + (i ? -1 : 1) * (radius + distanceOption) :
+					series.getX(slotIndex === 0 || slotIndex === slots.length - 1 ? naturalY : y, i);
+				
+			
+				// Record the placement and visibility
+				dataLabel._attr = {
+					visibility: visibility,
+					align: labelPos[6]
+				};
+				dataLabel._pos = {
+					x: x + options.x +
+						({ left: connectorPadding, right: -connectorPadding }[labelPos[6]] || 0),
+					y: y + options.y - 10 // 10 is for the baseline (label vs text)
+				};
+				dataLabel.connX = x;
+				dataLabel.connY = y;
+				
+						
+				// Detect overflowing data labels
+				if (this.options.size === null) {
+					dataLabelWidth = dataLabel.width;
+					// Overflow left
+					if (x - dataLabelWidth < connectorPadding) {
+						overflow[3] = mathMax(mathRound(dataLabelWidth - x + connectorPadding), overflow[3]);
+						
+					// Overflow right
+					} else if (x + dataLabelWidth > plotWidth - connectorPadding) {
+						overflow[1] = mathMax(mathRound(x + dataLabelWidth - plotWidth + connectorPadding), overflow[1]);
+					}
+					
+					// Overflow top
+					if (y - labelHeight / 2 < 0) {
+						overflow[0] = mathMax(mathRound(-y + labelHeight / 2), overflow[0]);
+						
+					// Overflow left
+					} else if (y + labelHeight / 2 > plotHeight) {
+						overflow[2] = mathMax(mathRound(y + labelHeight / 2 - plotHeight), overflow[2]);
+					}
+				}
+			} // for each point
+		} // for each half
+		
+		// Do not apply the final placement and draw the connectors until we have verified
+		// that labels are not spilling over. 
+		if (arrayMax(overflow) === 0 || this.verifyDataLabelOverflow(overflow)) {
+			
+			// Place the labels in the final position
+			this.placeDataLabels();
+			
+			// Draw the connectors
+			if (outside && connectorWidth) {
+				each(this.points, function (point) {
+					connector = point.connector;
+					labelPos = point.labelPos;
+					dataLabel = point.dataLabel;
+					
+					if (dataLabel && dataLabel._pos) {
+						visibility = dataLabel._attr.visibility;
+						x = dataLabel.connX;
+						y = dataLabel.connY;
+						connectorPath = softConnector ? [
+							M,
+							x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label
+							'C',
+							x, y, // first break, next to the label
+							2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],
+							labelPos[2], labelPos[3], // second break
+							L,
+							labelPos[4], labelPos[5] // base
+						] : [
+							M,
+							x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label
+							L,
+							labelPos[2], labelPos[3], // second break
+							L,
+							labelPos[4], labelPos[5] // base
+						];
+		
+						if (connector) {
+							connector.animate({ d: connectorPath });
+							connector.attr('visibility', visibility);
+		
+						} else {
+							point.connector = connector = series.chart.renderer.path(connectorPath).attr({
+								'stroke-width': connectorWidth,
+								stroke: options.connectorColor || point.color || '#606060',
+								visibility: visibility
+							})
+							.add(series.group);
+						}
+					} else if (connector) {
+						point.connector = connector.destroy();
+					}
+				});
+			}			
+		}
+	},
+	
+	/**
+	 * Verify whether the data labels are allowed to draw, or we should run more translation and data
+	 * label positioning to keep them inside the plot area. Returns true when data labels are ready 
+	 * to draw.
+	 */
+	verifyDataLabelOverflow: function (overflow) {
+		
+		var center = this.center,
+			options = this.options,
+			centerOption = options.center,
+			minSize = options.minSize || 80,
+			newSize = minSize,
+			ret;
+			
+		// Handle horizontal size and center
+		if (centerOption[0] !== null) { // Fixed center
+			newSize = mathMax(center[2] - mathMax(overflow[1], overflow[3]), minSize);
+			
+		} else { // Auto center
+			newSize = mathMax(
+				center[2] - overflow[1] - overflow[3], // horizontal overflow					
+				minSize
+			);
+			center[0] += (overflow[3] - overflow[1]) / 2; // horizontal center
+		}
+		
+		// Handle vertical size and center
+		if (centerOption[1] !== null) { // Fixed center
+			newSize = mathMax(mathMin(newSize, center[2] - mathMax(overflow[0], overflow[2])), minSize);
+			
+		} else { // Auto center
+			newSize = mathMax(
+				mathMin(
+					newSize,		
+					center[2] - overflow[0] - overflow[2] // vertical overflow
+				),
+				minSize
+			);
+			center[1] += (overflow[0] - overflow[2]) / 2; // vertical center
+		}
+		
+		// If the size must be decreased, we need to run translate and drawDataLabels again
+		if (newSize < center[2]) {
+			center[2] = newSize;
+			this.translate(center);
+			each(this.points, function (point) {
+				if (point.dataLabel) {
+					point.dataLabel._pos = null; // reset
+				}
+			});
+			this.drawDataLabels();
+			
+		// Else, return true to indicate that the pie and its labels is within the plot area
+		} else {
+			ret = true;
+		}
+		return ret;
+	},
+	
+	/**
+	 * Perform the final placement of the data labels after we have verified that they
+	 * fall within the plot area.
+	 */
+	placeDataLabels: function () {
+		each(this.points, function (point) {
+			var dataLabel = point.dataLabel,
+				_pos;
+			
+			if (dataLabel) {
+				_pos = dataLabel._pos;
+				if (_pos) {
+					dataLabel.attr(dataLabel._attr);			
+					dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);
+					dataLabel.moved = true;
+				} else if (dataLabel) {
+					dataLabel.attr({ y: -999 });
+				}
+			}
+		});
+	},
+	
+	alignDataLabel: noop,
+
+	/**
+	 * Draw point specific tracker objects. Inherit directly from column series.
+	 */
+	drawTracker: ColumnSeries.prototype.drawTracker,
+
+	/**
+	 * Use a simple symbol from column prototype
+	 */
+	drawLegendSymbol: AreaSeries.prototype.drawLegendSymbol,
+
+	/**
+	 * Pies don't have point marker symbols
+	 */
+	getSymbol: noop
+
+};
+PieSeries = extendClass(Series, PieSeries);
+seriesTypes.pie = PieSeries;
+
+
+// global variables
+extend(Highcharts, {
+	
+	// Constructors
+	Axis: Axis,
+	Chart: Chart,
+	Color: Color,
+	Legend: Legend,
+	Pointer: Pointer,
+	Point: Point,
+	Tick: Tick,
+	Tooltip: Tooltip,
+	Renderer: Renderer,
+	Series: Series,
+	SVGElement: SVGElement,
+	SVGRenderer: SVGRenderer,
+	
+	// Various
+	arrayMin: arrayMin,
+	arrayMax: arrayMax,
+	charts: charts,
+	dateFormat: dateFormat,
+	format: format,
+	pathAnim: pathAnim,
+	getOptions: getOptions,
+	hasBidiBug: hasBidiBug,
+	isTouchDevice: isTouchDevice,
+	numberFormat: numberFormat,
+	seriesTypes: seriesTypes,
+	setOptions: setOptions,
+	addEvent: addEvent,
+	removeEvent: removeEvent,
+	createElement: createElement,
+	discardElement: discardElement,
+	css: css,
+	each: each,
+	extend: extend,
+	map: map,
+	merge: merge,
+	pick: pick,
+	splat: splat,
+	extendClass: extendClass,
+	pInt: pInt,
+	wrap: wrap,
+	svg: hasSVG,
+	canvas: useCanVG,
+	vml: !hasSVG && !useCanVG,
+	product: PRODUCT,
+	version: VERSION
+});
+}());
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/annotations.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/annotations.js
new file mode 100644
index 0000000..53958c1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/annotations.js
@@ -0,0 +1,7 @@
+(function(i,C){function m(a){return typeof a==="number"}function n(a){return a!==D&&a!==null}var D,p,r,s=i.Chart,t=i.extend,z=i.each;r=["path","rect","circle"];p={top:0,left:0,center:0.5,middle:0.5,bottom:1,right:1};var u=C.inArray,A=i.merge,B=function(){this.init.apply(this,arguments)};B.prototype={init:function(a,d){var c=d.shape&&d.shape.type;this.chart=a;var b,f;f={xAxis:0,yAxis:0,title:{style:{},text:"",x:0,y:0},shape:{params:{stroke:"#000000",fill:"transparent",strokeWidth:2}}};b={circle:{params:{x:0,
+y:0}}};if(b[c])f.shape=A(f.shape,b[c]);this.options=A({},f,d)},render:function(a){var d=this.chart,c=this.chart.renderer,b=this.group,f=this.title,e=this.shape,h=this.options,i=h.title,l=h.shape;if(!b)b=this.group=c.g();if(!e&&l&&u(l.type,r)!==-1)e=this.shape=c[h.shape.type](l.params),e.add(b);if(!f&&i)f=this.title=c.label(i),f.add(b);b.add(d.annotations.group);this.linkObjects();a!==!1&&this.redraw()},redraw:function(){var a=this.options,d=this.chart,c=this.group,b=this.title,f=this.shape,e=this.linkedObject,
+h=d.xAxis[a.xAxis],v=d.yAxis[a.yAxis],l=a.width,w=a.height,x=p[a.anchorY],y=p[a.anchorX],j,o,g,q;if(e)j=e instanceof i.Point?"point":e instanceof i.Series?"series":null,j==="point"?(a.xValue=e.x,a.yValue=e.y,o=e.series):j==="series"&&(o=e),c.visibility!==o.group.visibility&&c.attr({visibility:o.group.visibility});e=n(a.xValue)?h.toPixels(a.xValue+h.minPointOffset)-h.minPixelPadding:a.x;j=n(a.yValue)?v.toPixels(a.yValue):a.y;if(!isNaN(e)&&!isNaN(j)&&m(e)&&m(j)){b&&(b.attr(a.title),b.css(a.title.style));
+if(f){b=t({},a.shape.params);if(a.units==="values"){for(g in b)u(g,["width","x"])>-1?b[g]=h.translate(b[g]):u(g,["height","y"])>-1&&(b[g]=v.translate(b[g]));b.width&&(b.width-=h.toPixels(0)-h.left);b.x&&(b.x+=h.minPixelPadding);if(a.shape.type==="path"){g=b.d;o=e;for(var r=j,s=g.length,k=0;k<s;)typeof g[k]==="number"&&typeof g[k+1]==="number"?(g[k]=h.toPixels(g[k])-o,g[k+1]=v.toPixels(g[k+1])-r,k+=2):k+=1}}a.shape.type==="circle"&&(b.x+=b.r,b.y+=b.r);f.attr(b)}c.bBox=null;if(!m(l))q=c.getBBox(),l=
+q.width;if(!m(w))q||(q=c.getBBox()),w=q.height;if(!m(y))y=p.center;if(!m(x))x=p.center;e-=l*y;j-=w*x;d.animation&&n(c.translateX)&&n(c.translateY)?c.animate({translateX:e,translateY:j}):c.translate(e,j)}},destroy:function(){var a=this,d=this.chart.annotations.allItems,c=d.indexOf(a);c>-1&&d.splice(c,1);z(["title","shape","group"],function(b){a[b]&&(a[b].destroy(),a[b]=null)});a.group=a.title=a.shape=a.chart=a.options=null},update:function(a,d){t(this.options,a);this.linkObjects();this.render(d)},
+linkObjects:function(){var a=this.chart,d=this.linkedObject,c=d&&(d.id||d.options.id),b=this.options.linkedTo;if(n(b)){if(!n(d)||b!==c)this.linkedObject=a.get(b)}else this.linkedObject=null}};t(s.prototype,{annotations:{add:function(a,d){var c=this.allItems,b=this.chart,f,e;Object.prototype.toString.call(a)==="[object Array]"||(a=[a]);for(e=a.length;e--;)f=new B(b,a[e]),c.push(f),f.render(d)},redraw:function(){z(this.allItems,function(a){a.redraw()})}}});s.prototype.callbacks.push(function(a){var d=
+a.options.annotations,c;c=a.renderer.g("annotations");c.attr({zIndex:7});c.add();a.annotations.allItems=[];a.annotations.chart=a;a.annotations.group=c;Object.prototype.toString.call(d)==="[object Array]"&&d.length>0&&a.annotations.add(a.options.annotations);i.addEvent(a,"redraw",function(){a.annotations.redraw()})})})(Highcharts,HighchartsAdapter);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/annotations.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/annotations.src.js
new file mode 100644
index 0000000..40ce8df
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/annotations.src.js
@@ -0,0 +1,401 @@
+(function (Highcharts, HighchartsAdapter) {
+
+var UNDEFINED,
+	ALIGN_FACTOR,
+	ALLOWED_SHAPES,
+	Chart = Highcharts.Chart,
+	extend = Highcharts.extend,
+	each = Highcharts.each;
+
+ALLOWED_SHAPES = ["path", "rect", "circle"];
+
+ALIGN_FACTOR = {
+	top: 0,
+	left: 0,
+	center: 0.5,
+	middle: 0.5,
+	bottom: 1,
+	right: 1
+};
+
+
+// Highcharts helper methods
+var inArray = HighchartsAdapter.inArray,
+	merge = Highcharts.merge;
+
+function defaultOptions(shapeType) {
+	var shapeOptions,
+		options;
+
+	options = {
+		xAxis: 0,
+		yAxis: 0,
+		title: {
+			style: {},
+			text: "",
+			x: 0,
+			y: 0
+		},
+		shape: {
+			params: {
+				stroke: "#000000",
+				fill: "transparent",
+				strokeWidth: 2
+			}
+		}
+	};
+
+	shapeOptions = {
+		circle: {
+			params: {
+				x: 0,
+				y: 0
+			}
+		}
+	};
+
+	if (shapeOptions[shapeType]) {
+		options.shape = merge(options.shape, shapeOptions[shapeType]);
+	}
+
+	return options;
+}
+
+function isArray(obj) {
+	return Object.prototype.toString.call(obj) === '[object Array]';
+}
+
+function isNumber(n) {
+	return typeof n === 'number';
+}
+
+function defined(obj) {
+	return obj !== UNDEFINED && obj !== null;
+}
+
+function translatePath(d, xAxis, yAxis, xOffset, yOffset) {
+	var len = d.length,
+		i = 0;
+
+	while (i < len) {
+		if (typeof d[i] === 'number' && typeof d[i + 1] === 'number') {
+			d[i] = xAxis.toPixels(d[i]) - xOffset;
+			d[i + 1] = yAxis.toPixels(d[i + 1]) - yOffset;
+			i += 2;
+		} else {
+			i += 1;
+		}
+	}
+
+	return d;
+}
+
+
+// Define annotation prototype
+var Annotation = function () {
+	this.init.apply(this, arguments);
+};
+Annotation.prototype = {
+	/* 
+	 * Initialize the annotation
+	 */
+	init: function (chart, options) {
+		var shapeType = options.shape && options.shape.type;
+
+		this.chart = chart;
+		this.options = merge({}, defaultOptions(shapeType), options);
+	},
+
+	/*
+	 * Render the annotation
+	 */
+	render: function (redraw) {
+		var annotation = this,
+			chart = this.chart,
+			renderer = annotation.chart.renderer,
+			group = annotation.group,
+			title = annotation.title,
+			shape = annotation.shape,
+			options = annotation.options,
+			titleOptions = options.title,
+			shapeOptions = options.shape;
+
+		if (!group) {
+			group = annotation.group = renderer.g();
+		}
+
+
+		if (!shape && shapeOptions && inArray(shapeOptions.type, ALLOWED_SHAPES) !== -1) {
+			shape = annotation.shape = renderer[options.shape.type](shapeOptions.params);
+			shape.add(group);
+		}
+
+		if (!title && titleOptions) {
+			title = annotation.title = renderer.label(titleOptions);
+			title.add(group);
+		}
+
+		group.add(chart.annotations.group);
+
+		// link annotations to point or series
+		annotation.linkObjects();
+
+		if (redraw !== false) {
+			annotation.redraw();
+		}
+	},
+
+	/*
+	 * Redraw the annotation title or shape after options update
+	 */
+	redraw: function () {
+		var options = this.options,
+			chart = this.chart,
+			group = this.group,
+			title = this.title,
+			shape = this.shape,
+			linkedTo = this.linkedObject,
+			xAxis = chart.xAxis[options.xAxis],
+			yAxis = chart.yAxis[options.yAxis],
+			width = options.width,
+			height = options.height,
+			anchorY = ALIGN_FACTOR[options.anchorY],
+			anchorX = ALIGN_FACTOR[options.anchorX],
+			resetBBox = false,
+			shapeParams,
+			linkType,
+			series,
+			param,
+			bbox,
+			x,
+			y;
+
+		if (linkedTo) {
+			linkType = (linkedTo instanceof Highcharts.Point) ? 'point' :
+						(linkedTo instanceof Highcharts.Series) ? 'series' : null;
+
+			if (linkType === 'point') {
+				options.xValue = linkedTo.x;
+				options.yValue = linkedTo.y;
+				series = linkedTo.series;
+			} else if (linkType === 'series') {
+				series = linkedTo;
+			}
+
+			if (group.visibility !== series.group.visibility) {
+				group.attr({
+					visibility: series.group.visibility
+				});
+			}
+		}
+
+
+		// Based on given options find annotation pixel position
+		x = (defined(options.xValue) ? xAxis.toPixels(options.xValue + xAxis.minPointOffset) - xAxis.minPixelPadding : options.x);
+		y = defined(options.yValue) ? yAxis.toPixels(options.yValue) : options.y;
+
+		if (isNaN(x) || isNaN(y) || !isNumber(x) || !isNumber(y)) {
+			return;
+		}
+
+
+		if (title) {
+			title.attr(options.title);
+			title.css(options.title.style);
+			resetBBox = true;
+		}
+
+		if (shape) {
+			shapeParams = extend({}, options.shape.params);
+
+			if (options.units === 'values') {
+				for (param in shapeParams) {
+					if (inArray(param, ['width', 'x']) > -1) {
+						shapeParams[param] = xAxis.translate(shapeParams[param]);
+					} else if (inArray(param, ['height', 'y']) > -1) {
+						shapeParams[param] = yAxis.translate(shapeParams[param]);
+					}
+				}
+
+				if (shapeParams.width) {
+					shapeParams.width -= xAxis.toPixels(0) - xAxis.left;
+				}
+
+				if (shapeParams.x) {
+					shapeParams.x += xAxis.minPixelPadding;
+				}
+
+				if (options.shape.type === 'path') {
+					translatePath(shapeParams.d, xAxis, yAxis, x, y);
+				}
+			}
+
+			// move the center of the circle to shape x/y
+			if (options.shape.type === 'circle') {
+				shapeParams.x += shapeParams.r;
+				shapeParams.y += shapeParams.r;
+			}
+
+			resetBBox = true;
+			shape.attr(shapeParams);
+		}
+
+		group.bBox = null;
+
+		// If annotation width or height is not defined in options use bounding box size
+		if (!isNumber(width)) {
+			bbox = group.getBBox();
+			width = bbox.width;
+		}
+
+		if (!isNumber(height)) {
+			// get bbox only if it wasn't set before
+			if (!bbox) {
+				bbox = group.getBBox();
+			}
+
+			height = bbox.height;
+		}
+
+		// Calculate anchor point
+		if (!isNumber(anchorX)) {
+			anchorX = ALIGN_FACTOR.center;
+		}
+
+		if (!isNumber(anchorY)) {
+			anchorY = ALIGN_FACTOR.center;
+		}
+
+		// Translate group according to its dimension and anchor point
+		x = x - width * anchorX;
+		y = y - height * anchorY;
+
+		if (chart.animation && defined(group.translateX) && defined(group.translateY)) {
+			group.animate({
+				translateX: x,
+				translateY: y
+			});
+		} else {
+			group.translate(x, y);
+		}
+	},
+
+	/*
+	 * Destroy the annotation
+	 */
+	destroy: function () {
+		var annotation = this,
+			chart = this.chart,
+			allItems = chart.annotations.allItems,
+			index = allItems.indexOf(annotation);
+
+		if (index > -1) {
+			allItems.splice(index, 1);
+		}
+
+		each(['title', 'shape', 'group'], function (element) {
+			if (annotation[element]) {
+				annotation[element].destroy();
+				annotation[element] = null;
+			}
+		});
+
+		annotation.group = annotation.title = annotation.shape = annotation.chart = annotation.options = null;
+	},
+
+	/*
+	 * Update the annotation with a given options
+	 */
+	update: function (options, redraw) {
+		extend(this.options, options);
+
+		// update link to point or series
+		this.linkObjects();
+
+		this.render(redraw);
+	},
+
+	linkObjects: function () {
+		var annotation = this,
+			chart = annotation.chart,
+			linkedTo = annotation.linkedObject,
+			linkedId = linkedTo && (linkedTo.id || linkedTo.options.id),
+			options = annotation.options,
+			id = options.linkedTo;
+
+		if (!defined(id)) {
+			annotation.linkedObject = null;
+		} else if (!defined(linkedTo) || id !== linkedId) {
+			annotation.linkedObject = chart.get(id);
+		}
+	}
+};
+
+
+// Add annotations methods to chart prototype
+extend(Chart.prototype, {
+	annotations: {
+		/*
+		 * Unified method for adding annotations to the chart
+		 */
+		add: function (options, redraw) {
+			var annotations = this.allItems,
+				chart = this.chart,
+				item,
+				len;
+
+			if (!isArray(options)) {
+				options = [options];
+			}
+
+			len = options.length;
+
+			while (len--) {
+				item = new Annotation(chart, options[len]);
+				annotations.push(item);
+				item.render(redraw);
+			}
+		},
+
+		/**
+		 * Redraw all annotations, method used in chart events
+		 */
+		redraw: function () {
+			each(this.allItems, function (annotation) {
+				annotation.redraw();
+			});
+		}
+	}
+});
+
+
+// Initialize on chart load
+Chart.prototype.callbacks.push(function (chart) {
+	var options = chart.options.annotations,
+		group;
+
+	group = chart.renderer.g("annotations");
+	group.attr({
+		zIndex: 7
+	});
+	group.add();
+
+	// initialize empty array for annotations
+	chart.annotations.allItems = [];
+
+	// link chart object to annotations
+	chart.annotations.chart = chart;
+
+	// link annotations group element to the chart
+	chart.annotations.group = group;
+
+	if (isArray(options) && options.length > 0) {
+		chart.annotations.add(chart.options.annotations);
+	}
+
+	// update annotations after chart redraw
+	Highcharts.addEvent(chart, 'redraw', function () {
+		chart.annotations.redraw();
+	});
+});
+}(Highcharts, HighchartsAdapter));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/canvas-tools.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/canvas-tools.js
new file mode 100644
index 0000000..0ddf77a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/canvas-tools.js
@@ -0,0 +1,133 @@
+/*
+ A class to parse color values
+ @author Stoyan Stefanov <sstoo@gmail.com>
+ @link   http://www.phpied.com/rgb-color-parser-in-javascript/
+ Use it if you like it
+
+ canvg.js - Javascript SVG parser and renderer on Canvas
+ MIT Licensed 
+ Gabe Lerner (gabelerner@gmail.com)
+ http://code.google.com/p/canvg/
+
+ Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/
+
+ Highcharts JS v3.0.6 (2013-10-04)
+ CanVGRenderer Extension module
+
+ (c) 2011-2012 Torstein Hønsi, Erik Olsson
+
+ License: www.highcharts.com/license
+*/
+function RGBColor(m){this.ok=!1;m.charAt(0)=="#"&&(m=m.substr(1,6));var m=m.replace(/ /g,""),m=m.toLowerCase(),a={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",
+darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",
+gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",
+lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",
+oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",
+slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"},c;for(c in a)m==c&&(m=a[c]);var d=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(b){return[parseInt(b[1]),parseInt(b[2]),parseInt(b[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,
+example:["#00ff00","336699"],process:function(b){return[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(b){return[parseInt(b[1]+b[1],16),parseInt(b[2]+b[2],16),parseInt(b[3]+b[3],16)]}}];for(c=0;c<d.length;c++){var b=d[c].process,k=d[c].re.exec(m);if(k)channels=b(k),this.r=channels[0],this.g=channels[1],this.b=channels[2],this.ok=!0}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r;this.g=this.g<0||isNaN(this.g)?0:
+this.g>255?255:this.g;this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b;this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"};this.toHex=function(){var b=this.r.toString(16),a=this.g.toString(16),d=this.b.toString(16);b.length==1&&(b="0"+b);a.length==1&&(a="0"+a);d.length==1&&(d="0"+d);return"#"+b+a+d};this.getHelpXML=function(){for(var b=[],k=0;k<d.length;k++)for(var c=d[k].example,j=0;j<c.length;j++)b[b.length]=c[j];for(var h in a)b[b.length]=h;c=document.createElement("ul");
+c.setAttribute("id","rgbcolor-examples");for(k=0;k<b.length;k++)try{var l=document.createElement("li"),o=new RGBColor(b[k]),n=document.createElement("div");n.style.cssText="margin: 3px; border: 1px solid black; background:"+o.toHex()+"; color:"+o.toHex();n.appendChild(document.createTextNode("test"));var q=document.createTextNode(" "+b[k]+" -> "+o.toRGB()+" -> "+o.toHex());l.appendChild(n);l.appendChild(q);c.appendChild(l)}catch(p){}return c}}
+if(!window.console)window.console={},window.console.log=function(){},window.console.dir=function(){};if(!Array.prototype.indexOf)Array.prototype.indexOf=function(m){for(var a=0;a<this.length;a++)if(this[a]==m)return a;return-1};
+(function(){function m(){var a={FRAMERATE:30,MAX_VIRTUAL_PIXELS:3E4};a.init=function(c){a.Definitions={};a.Styles={};a.Animations=[];a.Images=[];a.ctx=c;a.ViewPort=new function(){this.viewPorts=[];this.Clear=function(){this.viewPorts=[]};this.SetCurrent=function(a,b){this.viewPorts.push({width:a,height:b})};this.RemoveCurrent=function(){this.viewPorts.pop()};this.Current=function(){return this.viewPorts[this.viewPorts.length-1]};this.width=function(){return this.Current().width};this.height=function(){return this.Current().height};
+this.ComputeSize=function(a){return a!=null&&typeof a=="number"?a:a=="x"?this.width():a=="y"?this.height():Math.sqrt(Math.pow(this.width(),2)+Math.pow(this.height(),2))/Math.sqrt(2)}}};a.init();a.ImagesLoaded=function(){for(var c=0;c<a.Images.length;c++)if(!a.Images[c].loaded)return!1;return!0};a.trim=function(a){return a.replace(/^\s+|\s+$/g,"")};a.compressSpaces=function(a){return a.replace(/[\s\r\t\n]+/gm," ")};a.ajax=function(a){var d;return(d=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP"))?
+(d.open("GET",a,!1),d.send(null),d.responseText):null};a.parseXml=function(a){if(window.DOMParser)return(new DOMParser).parseFromString(a,"text/xml");else{var a=a.replace(/<!DOCTYPE svg[^>]*>/,""),d=new ActiveXObject("Microsoft.XMLDOM");d.async="false";d.loadXML(a);return d}};a.Property=function(c,d){this.name=c;this.value=d;this.hasValue=function(){return this.value!=null&&this.value!==""};this.numValue=function(){if(!this.hasValue())return 0;var b=parseFloat(this.value);(this.value+"").match(/%$/)&&
+(b/=100);return b};this.valueOrDefault=function(b){return this.hasValue()?this.value:b};this.numValueOrDefault=function(b){return this.hasValue()?this.numValue():b};var b=this;this.Color={addOpacity:function(d){var c=b.value;if(d!=null&&d!=""){var f=new RGBColor(b.value);f.ok&&(c="rgba("+f.r+", "+f.g+", "+f.b+", "+d+")")}return new a.Property(b.name,c)}};this.Definition={getDefinition:function(){var d=b.value.replace(/^(url\()?#([^\)]+)\)?$/,"$2");return a.Definitions[d]},isUrl:function(){return b.value.indexOf("url(")==
+0},getFillStyle:function(b){var d=this.getDefinition();return d!=null&&d.createGradient?d.createGradient(a.ctx,b):d!=null&&d.createPattern?d.createPattern(a.ctx,b):null}};this.Length={DPI:function(){return 96},EM:function(b){var d=12,c=new a.Property("fontSize",a.Font.Parse(a.ctx.font).fontSize);c.hasValue()&&(d=c.Length.toPixels(b));return d},toPixels:function(d){if(!b.hasValue())return 0;var c=b.value+"";return c.match(/em$/)?b.numValue()*this.EM(d):c.match(/ex$/)?b.numValue()*this.EM(d)/2:c.match(/px$/)?
+b.numValue():c.match(/pt$/)?b.numValue()*1.25:c.match(/pc$/)?b.numValue()*15:c.match(/cm$/)?b.numValue()*this.DPI(d)/2.54:c.match(/mm$/)?b.numValue()*this.DPI(d)/25.4:c.match(/in$/)?b.numValue()*this.DPI(d):c.match(/%$/)?b.numValue()*a.ViewPort.ComputeSize(d):b.numValue()}};this.Time={toMilliseconds:function(){if(!b.hasValue())return 0;var a=b.value+"";if(a.match(/s$/))return b.numValue()*1E3;a.match(/ms$/);return b.numValue()}};this.Angle={toRadians:function(){if(!b.hasValue())return 0;var a=b.value+
+"";return a.match(/deg$/)?b.numValue()*(Math.PI/180):a.match(/grad$/)?b.numValue()*(Math.PI/200):a.match(/rad$/)?b.numValue():b.numValue()*(Math.PI/180)}}};a.Font=new function(){this.Styles=["normal","italic","oblique","inherit"];this.Variants=["normal","small-caps","inherit"];this.Weights="normal,bold,bolder,lighter,100,200,300,400,500,600,700,800,900,inherit".split(",");this.CreateFont=function(d,b,c,e,f,g){g=g!=null?this.Parse(g):this.CreateFont("","","","","",a.ctx.font);return{fontFamily:f||
+g.fontFamily,fontSize:e||g.fontSize,fontStyle:d||g.fontStyle,fontWeight:c||g.fontWeight,fontVariant:b||g.fontVariant,toString:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var c=this;this.Parse=function(d){for(var b={},d=a.trim(a.compressSpaces(d||"")).split(" "),k=!1,e=!1,f=!1,g=!1,j="",h=0;h<d.length;h++)if(!e&&c.Styles.indexOf(d[h])!=-1){if(d[h]!="inherit")b.fontStyle=d[h];e=!0}else if(!g&&c.Variants.indexOf(d[h])!=-1){if(d[h]!="inherit")b.fontVariant=
+d[h];e=g=!0}else if(!f&&c.Weights.indexOf(d[h])!=-1){if(d[h]!="inherit")b.fontWeight=d[h];e=g=f=!0}else if(k)d[h]!="inherit"&&(j+=d[h]);else{if(d[h]!="inherit")b.fontSize=d[h].split("/")[0];e=g=f=k=!0}if(j!="")b.fontFamily=j;return b}};a.ToNumberArray=function(c){for(var c=a.trim(a.compressSpaces((c||"").replace(/,/g," "))).split(" "),d=0;d<c.length;d++)c[d]=parseFloat(c[d]);return c};a.Point=function(a,d){this.x=a;this.y=d;this.angleTo=function(b){return Math.atan2(b.y-this.y,b.x-this.x)};this.applyTransform=
+function(b){var a=this.x*b[1]+this.y*b[3]+b[5];this.x=this.x*b[0]+this.y*b[2]+b[4];this.y=a}};a.CreatePoint=function(c){c=a.ToNumberArray(c);return new a.Point(c[0],c[1])};a.CreatePath=function(c){for(var c=a.ToNumberArray(c),d=[],b=0;b<c.length;b+=2)d.push(new a.Point(c[b],c[b+1]));return d};a.BoundingBox=function(a,d,b,k){this.y2=this.x2=this.y1=this.x1=Number.NaN;this.x=function(){return this.x1};this.y=function(){return this.y1};this.width=function(){return this.x2-this.x1};this.height=function(){return this.y2-
+this.y1};this.addPoint=function(b,a){if(b!=null){if(isNaN(this.x1)||isNaN(this.x2))this.x2=this.x1=b;if(b<this.x1)this.x1=b;if(b>this.x2)this.x2=b}if(a!=null){if(isNaN(this.y1)||isNaN(this.y2))this.y2=this.y1=a;if(a<this.y1)this.y1=a;if(a>this.y2)this.y2=a}};this.addX=function(b){this.addPoint(b,null)};this.addY=function(b){this.addPoint(null,b)};this.addBoundingBox=function(b){this.addPoint(b.x1,b.y1);this.addPoint(b.x2,b.y2)};this.addQuadraticCurve=function(b,a,d,c,k,l){d=b+2/3*(d-b);c=a+2/3*(c-
+a);this.addBezierCurve(b,a,d,d+1/3*(k-b),c,c+1/3*(l-a),k,l)};this.addBezierCurve=function(b,a,d,c,k,l,o,n){var q=[b,a],p=[d,c],t=[k,l],m=[o,n];this.addPoint(q[0],q[1]);this.addPoint(m[0],m[1]);for(i=0;i<=1;i++)b=function(b){return Math.pow(1-b,3)*q[i]+3*Math.pow(1-b,2)*b*p[i]+3*(1-b)*Math.pow(b,2)*t[i]+Math.pow(b,3)*m[i]},a=6*q[i]-12*p[i]+6*t[i],d=-3*q[i]+9*p[i]-9*t[i]+3*m[i],c=3*p[i]-3*q[i],d==0?a!=0&&(a=-c/a,0<a&&a<1&&(i==0&&this.addX(b(a)),i==1&&this.addY(b(a)))):(c=Math.pow(a,2)-4*c*d,c<0||(k=
+(-a+Math.sqrt(c))/(2*d),0<k&&k<1&&(i==0&&this.addX(b(k)),i==1&&this.addY(b(k))),a=(-a-Math.sqrt(c))/(2*d),0<a&&a<1&&(i==0&&this.addX(b(a)),i==1&&this.addY(b(a)))))};this.isPointInBox=function(b,a){return this.x1<=b&&b<=this.x2&&this.y1<=a&&a<=this.y2};this.addPoint(a,d);this.addPoint(b,k)};a.Transform=function(c){var d=this;this.Type={};this.Type.translate=function(b){this.p=a.CreatePoint(b);this.apply=function(b){b.translate(this.p.x||0,this.p.y||0)};this.applyToPoint=function(b){b.applyTransform([1,
+0,0,1,this.p.x||0,this.p.y||0])}};this.Type.rotate=function(b){b=a.ToNumberArray(b);this.angle=new a.Property("angle",b[0]);this.cx=b[1]||0;this.cy=b[2]||0;this.apply=function(b){b.translate(this.cx,this.cy);b.rotate(this.angle.Angle.toRadians());b.translate(-this.cx,-this.cy)};this.applyToPoint=function(b){var a=this.angle.Angle.toRadians();b.applyTransform([1,0,0,1,this.p.x||0,this.p.y||0]);b.applyTransform([Math.cos(a),Math.sin(a),-Math.sin(a),Math.cos(a),0,0]);b.applyTransform([1,0,0,1,-this.p.x||
+0,-this.p.y||0])}};this.Type.scale=function(b){this.p=a.CreatePoint(b);this.apply=function(b){b.scale(this.p.x||1,this.p.y||this.p.x||1)};this.applyToPoint=function(b){b.applyTransform([this.p.x||0,0,0,this.p.y||0,0,0])}};this.Type.matrix=function(b){this.m=a.ToNumberArray(b);this.apply=function(b){b.transform(this.m[0],this.m[1],this.m[2],this.m[3],this.m[4],this.m[5])};this.applyToPoint=function(b){b.applyTransform(this.m)}};this.Type.SkewBase=function(b){this.base=d.Type.matrix;this.base(b);this.angle=
+new a.Property("angle",b)};this.Type.SkewBase.prototype=new this.Type.matrix;this.Type.skewX=function(b){this.base=d.Type.SkewBase;this.base(b);this.m=[1,0,Math.tan(this.angle.Angle.toRadians()),1,0,0]};this.Type.skewX.prototype=new this.Type.SkewBase;this.Type.skewY=function(b){this.base=d.Type.SkewBase;this.base(b);this.m=[1,Math.tan(this.angle.Angle.toRadians()),0,1,0,0]};this.Type.skewY.prototype=new this.Type.SkewBase;this.transforms=[];this.apply=function(b){for(var a=0;a<this.transforms.length;a++)this.transforms[a].apply(b)};
+this.applyToPoint=function(b){for(var a=0;a<this.transforms.length;a++)this.transforms[a].applyToPoint(b)};for(var c=a.trim(a.compressSpaces(c)).split(/\s(?=[a-z])/),b=0;b<c.length;b++){var k=c[b].split("(")[0],e=c[b].split("(")[1].replace(")","");this.transforms.push(new this.Type[k](e))}};a.AspectRatio=function(c,d,b,k,e,f,g,j,h,l){var d=a.compressSpaces(d),d=d.replace(/^defer\s/,""),o=d.split(" ")[0]||"xMidYMid",d=d.split(" ")[1]||"meet",n=b/k,q=e/f,p=Math.min(n,q),m=Math.max(n,q);d=="meet"&&(k*=
+p,f*=p);d=="slice"&&(k*=m,f*=m);h=new a.Property("refX",h);l=new a.Property("refY",l);h.hasValue()&&l.hasValue()?c.translate(-p*h.Length.toPixels("x"),-p*l.Length.toPixels("y")):(o.match(/^xMid/)&&(d=="meet"&&p==q||d=="slice"&&m==q)&&c.translate(b/2-k/2,0),o.match(/YMid$/)&&(d=="meet"&&p==n||d=="slice"&&m==n)&&c.translate(0,e/2-f/2),o.match(/^xMax/)&&(d=="meet"&&p==q||d=="slice"&&m==q)&&c.translate(b-k,0),o.match(/YMax$/)&&(d=="meet"&&p==n||d=="slice"&&m==n)&&c.translate(0,e-f));o=="none"?c.scale(n,
+q):d=="meet"?c.scale(p,p):d=="slice"&&c.scale(m,m);c.translate(g==null?0:-g,j==null?0:-j)};a.Element={};a.Element.ElementBase=function(c){this.attributes={};this.styles={};this.children=[];this.attribute=function(b,d){var c=this.attributes[b];if(c!=null)return c;c=new a.Property(b,"");d==!0&&(this.attributes[b]=c);return c};this.style=function(b,d){var c=this.styles[b];if(c!=null)return c;c=this.attribute(b);if(c!=null&&c.hasValue())return c;c=this.parent;if(c!=null&&(c=c.style(b),c!=null&&c.hasValue()))return c;
+c=new a.Property(b,"");d==!0&&(this.styles[b]=c);return c};this.render=function(b){if(this.style("display").value!="none"&&this.attribute("visibility").value!="hidden"){b.save();this.setContext(b);if(this.attribute("mask").hasValue()){var a=this.attribute("mask").Definition.getDefinition();a!=null&&a.apply(b,this)}else this.style("filter").hasValue()?(a=this.style("filter").Definition.getDefinition(),a!=null&&a.apply(b,this)):this.renderChildren(b);this.clearContext(b);b.restore()}};this.setContext=
+function(){};this.clearContext=function(){};this.renderChildren=function(b){for(var a=0;a<this.children.length;a++)this.children[a].render(b)};this.addChild=function(b,d){var c=b;d&&(c=a.CreateElement(b));c.parent=this;this.children.push(c)};if(c!=null&&c.nodeType==1){for(var d=0;d<c.childNodes.length;d++){var b=c.childNodes[d];b.nodeType==1&&this.addChild(b,!0)}for(d=0;d<c.attributes.length;d++)b=c.attributes[d],this.attributes[b.nodeName]=new a.Property(b.nodeName,b.nodeValue);b=a.Styles[c.nodeName];
+if(b!=null)for(var k in b)this.styles[k]=b[k];if(this.attribute("class").hasValue())for(var d=a.compressSpaces(this.attribute("class").value).split(" "),e=0;e<d.length;e++){b=a.Styles["."+d[e]];if(b!=null)for(k in b)this.styles[k]=b[k];b=a.Styles[c.nodeName+"."+d[e]];if(b!=null)for(k in b)this.styles[k]=b[k]}if(this.attribute("style").hasValue()){b=this.attribute("style").value.split(";");for(d=0;d<b.length;d++)a.trim(b[d])!=""&&(c=b[d].split(":"),k=a.trim(c[0]),c=a.trim(c[1]),this.styles[k]=new a.Property(k,
+c))}this.attribute("id").hasValue()&&a.Definitions[this.attribute("id").value]==null&&(a.Definitions[this.attribute("id").value]=this)}};a.Element.RenderedElementBase=function(c){this.base=a.Element.ElementBase;this.base(c);this.setContext=function(d){if(this.style("fill").Definition.isUrl()){var b=this.style("fill").Definition.getFillStyle(this);if(b!=null)d.fillStyle=b}else if(this.style("fill").hasValue())b=this.style("fill"),this.style("fill-opacity").hasValue()&&(b=b.Color.addOpacity(this.style("fill-opacity").value)),
+d.fillStyle=b.value=="none"?"rgba(0,0,0,0)":b.value;if(this.style("stroke").Definition.isUrl()){if(b=this.style("stroke").Definition.getFillStyle(this),b!=null)d.strokeStyle=b}else if(this.style("stroke").hasValue())b=this.style("stroke"),this.style("stroke-opacity").hasValue()&&(b=b.Color.addOpacity(this.style("stroke-opacity").value)),d.strokeStyle=b.value=="none"?"rgba(0,0,0,0)":b.value;if(this.style("stroke-width").hasValue())d.lineWidth=this.style("stroke-width").Length.toPixels();if(this.style("stroke-linecap").hasValue())d.lineCap=
+this.style("stroke-linecap").value;if(this.style("stroke-linejoin").hasValue())d.lineJoin=this.style("stroke-linejoin").value;if(this.style("stroke-miterlimit").hasValue())d.miterLimit=this.style("stroke-miterlimit").value;if(typeof d.font!="undefined")d.font=a.Font.CreateFont(this.style("font-style").value,this.style("font-variant").value,this.style("font-weight").value,this.style("font-size").hasValue()?this.style("font-size").Length.toPixels()+"px":"",this.style("font-family").value).toString();
+this.attribute("transform").hasValue()&&(new a.Transform(this.attribute("transform").value)).apply(d);this.attribute("clip-path").hasValue()&&(b=this.attribute("clip-path").Definition.getDefinition(),b!=null&&b.apply(d));if(this.style("opacity").hasValue())d.globalAlpha=this.style("opacity").numValue()}};a.Element.RenderedElementBase.prototype=new a.Element.ElementBase;a.Element.PathElementBase=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.path=function(d){d!=null&&d.beginPath();
+return new a.BoundingBox};this.renderChildren=function(d){this.path(d);a.Mouse.checkPath(this,d);d.fillStyle!=""&&d.fill();d.strokeStyle!=""&&d.stroke();var b=this.getMarkers();if(b!=null){if(this.style("marker-start").Definition.isUrl()){var c=this.style("marker-start").Definition.getDefinition();c.render(d,b[0][0],b[0][1])}if(this.style("marker-mid").Definition.isUrl())for(var c=this.style("marker-mid").Definition.getDefinition(),e=1;e<b.length-1;e++)c.render(d,b[e][0],b[e][1]);this.style("marker-end").Definition.isUrl()&&
+(c=this.style("marker-end").Definition.getDefinition(),c.render(d,b[b.length-1][0],b[b.length-1][1]))}};this.getBoundingBox=function(){return this.path()};this.getMarkers=function(){return null}};a.Element.PathElementBase.prototype=new a.Element.RenderedElementBase;a.Element.svg=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseClearContext=this.clearContext;this.clearContext=function(d){this.baseClearContext(d);a.ViewPort.RemoveCurrent()};this.baseSetContext=this.setContext;
+this.setContext=function(d){d.strokeStyle="rgba(0,0,0,0)";d.lineCap="butt";d.lineJoin="miter";d.miterLimit=4;this.baseSetContext(d);this.attribute("x").hasValue()&&this.attribute("y").hasValue()&&d.translate(this.attribute("x").Length.toPixels("x"),this.attribute("y").Length.toPixels("y"));var b=a.ViewPort.width(),c=a.ViewPort.height();if(typeof this.root=="undefined"&&this.attribute("width").hasValue()&&this.attribute("height").hasValue()){var b=this.attribute("width").Length.toPixels("x"),c=this.attribute("height").Length.toPixels("y"),
+e=0,f=0;this.attribute("refX").hasValue()&&this.attribute("refY").hasValue()&&(e=-this.attribute("refX").Length.toPixels("x"),f=-this.attribute("refY").Length.toPixels("y"));d.beginPath();d.moveTo(e,f);d.lineTo(b,f);d.lineTo(b,c);d.lineTo(e,c);d.closePath();d.clip()}a.ViewPort.SetCurrent(b,c);if(this.attribute("viewBox").hasValue()){var e=a.ToNumberArray(this.attribute("viewBox").value),f=e[0],g=e[1],b=e[2],c=e[3];a.AspectRatio(d,this.attribute("preserveAspectRatio").value,a.ViewPort.width(),b,a.ViewPort.height(),
+c,f,g,this.attribute("refX").value,this.attribute("refY").value);a.ViewPort.RemoveCurrent();a.ViewPort.SetCurrent(e[2],e[3])}}};a.Element.svg.prototype=new a.Element.RenderedElementBase;a.Element.rect=function(c){this.base=a.Element.PathElementBase;this.base(c);this.path=function(d){var b=this.attribute("x").Length.toPixels("x"),c=this.attribute("y").Length.toPixels("y"),e=this.attribute("width").Length.toPixels("x"),f=this.attribute("height").Length.toPixels("y"),g=this.attribute("rx").Length.toPixels("x"),
+j=this.attribute("ry").Length.toPixels("y");this.attribute("rx").hasValue()&&!this.attribute("ry").hasValue()&&(j=g);this.attribute("ry").hasValue()&&!this.attribute("rx").hasValue()&&(g=j);d!=null&&(d.beginPath(),d.moveTo(b+g,c),d.lineTo(b+e-g,c),d.quadraticCurveTo(b+e,c,b+e,c+j),d.lineTo(b+e,c+f-j),d.quadraticCurveTo(b+e,c+f,b+e-g,c+f),d.lineTo(b+g,c+f),d.quadraticCurveTo(b,c+f,b,c+f-j),d.lineTo(b,c+j),d.quadraticCurveTo(b,c,b+g,c),d.closePath());return new a.BoundingBox(b,c,b+e,c+f)}};a.Element.rect.prototype=
+new a.Element.PathElementBase;a.Element.circle=function(c){this.base=a.Element.PathElementBase;this.base(c);this.path=function(d){var b=this.attribute("cx").Length.toPixels("x"),c=this.attribute("cy").Length.toPixels("y"),e=this.attribute("r").Length.toPixels();d!=null&&(d.beginPath(),d.arc(b,c,e,0,Math.PI*2,!0),d.closePath());return new a.BoundingBox(b-e,c-e,b+e,c+e)}};a.Element.circle.prototype=new a.Element.PathElementBase;a.Element.ellipse=function(c){this.base=a.Element.PathElementBase;this.base(c);
+this.path=function(d){var b=4*((Math.sqrt(2)-1)/3),c=this.attribute("rx").Length.toPixels("x"),e=this.attribute("ry").Length.toPixels("y"),f=this.attribute("cx").Length.toPixels("x"),g=this.attribute("cy").Length.toPixels("y");d!=null&&(d.beginPath(),d.moveTo(f,g-e),d.bezierCurveTo(f+b*c,g-e,f+c,g-b*e,f+c,g),d.bezierCurveTo(f+c,g+b*e,f+b*c,g+e,f,g+e),d.bezierCurveTo(f-b*c,g+e,f-c,g+b*e,f-c,g),d.bezierCurveTo(f-c,g-b*e,f-b*c,g-e,f,g-e),d.closePath());return new a.BoundingBox(f-c,g-e,f+c,g+e)}};a.Element.ellipse.prototype=
+new a.Element.PathElementBase;a.Element.line=function(c){this.base=a.Element.PathElementBase;this.base(c);this.getPoints=function(){return[new a.Point(this.attribute("x1").Length.toPixels("x"),this.attribute("y1").Length.toPixels("y")),new a.Point(this.attribute("x2").Length.toPixels("x"),this.attribute("y2").Length.toPixels("y"))]};this.path=function(d){var b=this.getPoints();d!=null&&(d.beginPath(),d.moveTo(b[0].x,b[0].y),d.lineTo(b[1].x,b[1].y));return new a.BoundingBox(b[0].x,b[0].y,b[1].x,b[1].y)};
+this.getMarkers=function(){var a=this.getPoints(),b=a[0].angleTo(a[1]);return[[a[0],b],[a[1],b]]}};a.Element.line.prototype=new a.Element.PathElementBase;a.Element.polyline=function(c){this.base=a.Element.PathElementBase;this.base(c);this.points=a.CreatePath(this.attribute("points").value);this.path=function(d){var b=new a.BoundingBox(this.points[0].x,this.points[0].y);d!=null&&(d.beginPath(),d.moveTo(this.points[0].x,this.points[0].y));for(var c=1;c<this.points.length;c++)b.addPoint(this.points[c].x,
+this.points[c].y),d!=null&&d.lineTo(this.points[c].x,this.points[c].y);return b};this.getMarkers=function(){for(var a=[],b=0;b<this.points.length-1;b++)a.push([this.points[b],this.points[b].angleTo(this.points[b+1])]);a.push([this.points[this.points.length-1],a[a.length-1][1]]);return a}};a.Element.polyline.prototype=new a.Element.PathElementBase;a.Element.polygon=function(c){this.base=a.Element.polyline;this.base(c);this.basePath=this.path;this.path=function(a){var b=this.basePath(a);a!=null&&(a.lineTo(this.points[0].x,
+this.points[0].y),a.closePath());return b}};a.Element.polygon.prototype=new a.Element.polyline;a.Element.path=function(c){this.base=a.Element.PathElementBase;this.base(c);c=this.attribute("d").value;c=c.replace(/,/gm," ");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");c=c.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,"$1 $2");c=c.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,"$1 $2");c=c.replace(/([0-9])([+\-])/gm,
+"$1 $2");c=c.replace(/(\.[0-9]*)(\.)/gm,"$1 $2");c=c.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");c=a.compressSpaces(c);c=a.trim(c);this.PathParser=new function(d){this.tokens=d.split(" ");this.reset=function(){this.i=-1;this.previousCommand=this.command="";this.start=new a.Point(0,0);this.control=new a.Point(0,0);this.current=new a.Point(0,0);this.points=[];this.angles=[]};this.isEnd=function(){return this.i>=this.tokens.length-1};this.isCommandOrEnd=function(){return this.isEnd()?
+!0:this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null};this.isRelativeCommand=function(){return this.command==this.command.toLowerCase()};this.getToken=function(){this.i+=1;return this.tokens[this.i]};this.getScalar=function(){return parseFloat(this.getToken())};this.nextCommand=function(){this.previousCommand=this.command;this.command=this.getToken()};this.getPoint=function(){return this.makeAbsolute(new a.Point(this.getScalar(),this.getScalar()))};this.getAsControlPoint=function(){var b=this.getPoint();
+return this.control=b};this.getAsCurrentPoint=function(){var b=this.getPoint();return this.current=b};this.getReflectedControlPoint=function(){return this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s"?this.current:new a.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y)};this.makeAbsolute=function(b){if(this.isRelativeCommand())b.x=this.current.x+b.x,b.y=this.current.y+b.y;return b};this.addMarker=function(b,a,d){d!=null&&this.angles.length>0&&this.angles[this.angles.length-
+1]==null&&(this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(d));this.addMarkerAngle(b,a==null?null:a.angleTo(b))};this.addMarkerAngle=function(b,a){this.points.push(b);this.angles.push(a)};this.getMarkerPoints=function(){return this.points};this.getMarkerAngles=function(){for(var b=0;b<this.angles.length;b++)if(this.angles[b]==null)for(var a=b+1;a<this.angles.length;a++)if(this.angles[a]!=null){this.angles[b]=this.angles[a];break}return this.angles}}(c);this.path=function(d){var b=
+this.PathParser;b.reset();var c=new a.BoundingBox;for(d!=null&&d.beginPath();!b.isEnd();)switch(b.nextCommand(),b.command.toUpperCase()){case "M":var e=b.getAsCurrentPoint();b.addMarker(e);c.addPoint(e.x,e.y);d!=null&&d.moveTo(e.x,e.y);for(b.start=b.current;!b.isCommandOrEnd();)e=b.getAsCurrentPoint(),b.addMarker(e,b.start),c.addPoint(e.x,e.y),d!=null&&d.lineTo(e.x,e.y);break;case "L":for(;!b.isCommandOrEnd();){var f=b.current,e=b.getAsCurrentPoint();b.addMarker(e,f);c.addPoint(e.x,e.y);d!=null&&
+d.lineTo(e.x,e.y)}break;case "H":for(;!b.isCommandOrEnd();)e=new a.Point((b.isRelativeCommand()?b.current.x:0)+b.getScalar(),b.current.y),b.addMarker(e,b.current),b.current=e,c.addPoint(b.current.x,b.current.y),d!=null&&d.lineTo(b.current.x,b.current.y);break;case "V":for(;!b.isCommandOrEnd();)e=new a.Point(b.current.x,(b.isRelativeCommand()?b.current.y:0)+b.getScalar()),b.addMarker(e,b.current),b.current=e,c.addPoint(b.current.x,b.current.y),d!=null&&d.lineTo(b.current.x,b.current.y);break;case "C":for(;!b.isCommandOrEnd();){var g=
+b.current,f=b.getPoint(),j=b.getAsControlPoint(),e=b.getAsCurrentPoint();b.addMarker(e,j,f);c.addBezierCurve(g.x,g.y,f.x,f.y,j.x,j.y,e.x,e.y);d!=null&&d.bezierCurveTo(f.x,f.y,j.x,j.y,e.x,e.y)}break;case "S":for(;!b.isCommandOrEnd();)g=b.current,f=b.getReflectedControlPoint(),j=b.getAsControlPoint(),e=b.getAsCurrentPoint(),b.addMarker(e,j,f),c.addBezierCurve(g.x,g.y,f.x,f.y,j.x,j.y,e.x,e.y),d!=null&&d.bezierCurveTo(f.x,f.y,j.x,j.y,e.x,e.y);break;case "Q":for(;!b.isCommandOrEnd();)g=b.current,j=b.getAsControlPoint(),
+e=b.getAsCurrentPoint(),b.addMarker(e,j,j),c.addQuadraticCurve(g.x,g.y,j.x,j.y,e.x,e.y),d!=null&&d.quadraticCurveTo(j.x,j.y,e.x,e.y);break;case "T":for(;!b.isCommandOrEnd();)g=b.current,j=b.getReflectedControlPoint(),b.control=j,e=b.getAsCurrentPoint(),b.addMarker(e,j,j),c.addQuadraticCurve(g.x,g.y,j.x,j.y,e.x,e.y),d!=null&&d.quadraticCurveTo(j.x,j.y,e.x,e.y);break;case "A":for(;!b.isCommandOrEnd();){var g=b.current,h=b.getScalar(),l=b.getScalar(),f=b.getScalar()*(Math.PI/180),o=b.getScalar(),j=b.getScalar(),
+e=b.getAsCurrentPoint(),n=new a.Point(Math.cos(f)*(g.x-e.x)/2+Math.sin(f)*(g.y-e.y)/2,-Math.sin(f)*(g.x-e.x)/2+Math.cos(f)*(g.y-e.y)/2),q=Math.pow(n.x,2)/Math.pow(h,2)+Math.pow(n.y,2)/Math.pow(l,2);q>1&&(h*=Math.sqrt(q),l*=Math.sqrt(q));o=(o==j?-1:1)*Math.sqrt((Math.pow(h,2)*Math.pow(l,2)-Math.pow(h,2)*Math.pow(n.y,2)-Math.pow(l,2)*Math.pow(n.x,2))/(Math.pow(h,2)*Math.pow(n.y,2)+Math.pow(l,2)*Math.pow(n.x,2)));isNaN(o)&&(o=0);var p=new a.Point(o*h*n.y/l,o*-l*n.x/h),g=new a.Point((g.x+e.x)/2+Math.cos(f)*
+p.x-Math.sin(f)*p.y,(g.y+e.y)/2+Math.sin(f)*p.x+Math.cos(f)*p.y),m=function(b,a){return(b[0]*a[0]+b[1]*a[1])/(Math.sqrt(Math.pow(b[0],2)+Math.pow(b[1],2))*Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2)))},s=function(b,a){return(b[0]*a[1]<b[1]*a[0]?-1:1)*Math.acos(m(b,a))},o=s([1,0],[(n.x-p.x)/h,(n.y-p.y)/l]),q=[(n.x-p.x)/h,(n.y-p.y)/l],p=[(-n.x-p.x)/h,(-n.y-p.y)/l],n=s(q,p);if(m(q,p)<=-1)n=Math.PI;m(q,p)>=1&&(n=0);j==0&&n>0&&(n-=2*Math.PI);j==1&&n<0&&(n+=2*Math.PI);q=new a.Point(g.x-h*Math.cos((o+n)/
+2),g.y-l*Math.sin((o+n)/2));b.addMarkerAngle(q,(o+n)/2+(j==0?1:-1)*Math.PI/2);b.addMarkerAngle(e,n+(j==0?1:-1)*Math.PI/2);c.addPoint(e.x,e.y);d!=null&&(m=h>l?h:l,e=h>l?1:h/l,h=h>l?l/h:1,d.translate(g.x,g.y),d.rotate(f),d.scale(e,h),d.arc(0,0,m,o,o+n,1-j),d.scale(1/e,1/h),d.rotate(-f),d.translate(-g.x,-g.y))}break;case "Z":d!=null&&d.closePath(),b.current=b.start}return c};this.getMarkers=function(){for(var a=this.PathParser.getMarkerPoints(),b=this.PathParser.getMarkerAngles(),c=[],e=0;e<a.length;e++)c.push([a[e],
+b[e]]);return c}};a.Element.path.prototype=new a.Element.PathElementBase;a.Element.pattern=function(c){this.base=a.Element.ElementBase;this.base(c);this.createPattern=function(d){var b=new a.Element.svg;b.attributes.viewBox=new a.Property("viewBox",this.attribute("viewBox").value);b.attributes.x=new a.Property("x",this.attribute("x").value);b.attributes.y=new a.Property("y",this.attribute("y").value);b.attributes.width=new a.Property("width",this.attribute("width").value);b.attributes.height=new a.Property("height",
+this.attribute("height").value);b.children=this.children;var c=document.createElement("canvas");c.width=this.attribute("width").Length.toPixels("x");c.height=this.attribute("height").Length.toPixels("y");b.render(c.getContext("2d"));return d.createPattern(c,"repeat")}};a.Element.pattern.prototype=new a.Element.ElementBase;a.Element.marker=function(c){this.base=a.Element.ElementBase;this.base(c);this.baseRender=this.render;this.render=function(d,b,c){d.translate(b.x,b.y);this.attribute("orient").valueOrDefault("auto")==
+"auto"&&d.rotate(c);this.attribute("markerUnits").valueOrDefault("strokeWidth")=="strokeWidth"&&d.scale(d.lineWidth,d.lineWidth);d.save();var e=new a.Element.svg;e.attributes.viewBox=new a.Property("viewBox",this.attribute("viewBox").value);e.attributes.refX=new a.Property("refX",this.attribute("refX").value);e.attributes.refY=new a.Property("refY",this.attribute("refY").value);e.attributes.width=new a.Property("width",this.attribute("markerWidth").value);e.attributes.height=new a.Property("height",
+this.attribute("markerHeight").value);e.attributes.fill=new a.Property("fill",this.attribute("fill").valueOrDefault("black"));e.attributes.stroke=new a.Property("stroke",this.attribute("stroke").valueOrDefault("none"));e.children=this.children;e.render(d);d.restore();this.attribute("markerUnits").valueOrDefault("strokeWidth")=="strokeWidth"&&d.scale(1/d.lineWidth,1/d.lineWidth);this.attribute("orient").valueOrDefault("auto")=="auto"&&d.rotate(-c);d.translate(-b.x,-b.y)}};a.Element.marker.prototype=
+new a.Element.ElementBase;a.Element.defs=function(c){this.base=a.Element.ElementBase;this.base(c);this.render=function(){}};a.Element.defs.prototype=new a.Element.ElementBase;a.Element.GradientBase=function(c){this.base=a.Element.ElementBase;this.base(c);this.gradientUnits=this.attribute("gradientUnits").valueOrDefault("objectBoundingBox");this.stops=[];for(c=0;c<this.children.length;c++)this.stops.push(this.children[c]);this.getGradient=function(){};this.createGradient=function(d,b){var c=this;this.attribute("xlink:href").hasValue()&&
+(c=this.attribute("xlink:href").Definition.getDefinition());for(var e=this.getGradient(d,b),f=0;f<c.stops.length;f++)e.addColorStop(c.stops[f].offset,c.stops[f].color);if(this.attribute("gradientTransform").hasValue()){c=a.ViewPort.viewPorts[0];f=new a.Element.rect;f.attributes.x=new a.Property("x",-a.MAX_VIRTUAL_PIXELS/3);f.attributes.y=new a.Property("y",-a.MAX_VIRTUAL_PIXELS/3);f.attributes.width=new a.Property("width",a.MAX_VIRTUAL_PIXELS);f.attributes.height=new a.Property("height",a.MAX_VIRTUAL_PIXELS);
+var g=new a.Element.g;g.attributes.transform=new a.Property("transform",this.attribute("gradientTransform").value);g.children=[f];f=new a.Element.svg;f.attributes.x=new a.Property("x",0);f.attributes.y=new a.Property("y",0);f.attributes.width=new a.Property("width",c.width);f.attributes.height=new a.Property("height",c.height);f.children=[g];g=document.createElement("canvas");g.width=c.width;g.height=c.height;c=g.getContext("2d");c.fillStyle=e;f.render(c);return c.createPattern(g,"no-repeat")}return e}};
+a.Element.GradientBase.prototype=new a.Element.ElementBase;a.Element.linearGradient=function(c){this.base=a.Element.GradientBase;this.base(c);this.getGradient=function(a,b){var c=b.getBoundingBox(),e=this.gradientUnits=="objectBoundingBox"?c.x()+c.width()*this.attribute("x1").numValue():this.attribute("x1").Length.toPixels("x"),f=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("y1").numValue():this.attribute("y1").Length.toPixels("y"),g=this.gradientUnits=="objectBoundingBox"?
+c.x()+c.width()*this.attribute("x2").numValue():this.attribute("x2").Length.toPixels("x"),c=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("y2").numValue():this.attribute("y2").Length.toPixels("y");return a.createLinearGradient(e,f,g,c)}};a.Element.linearGradient.prototype=new a.Element.GradientBase;a.Element.radialGradient=function(c){this.base=a.Element.GradientBase;this.base(c);this.getGradient=function(a,b){var c=b.getBoundingBox(),e=this.gradientUnits=="objectBoundingBox"?
+c.x()+c.width()*this.attribute("cx").numValue():this.attribute("cx").Length.toPixels("x"),f=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("cy").numValue():this.attribute("cy").Length.toPixels("y"),g=e,j=f;this.attribute("fx").hasValue()&&(g=this.gradientUnits=="objectBoundingBox"?c.x()+c.width()*this.attribute("fx").numValue():this.attribute("fx").Length.toPixels("x"));this.attribute("fy").hasValue()&&(j=this.gradientUnits=="objectBoundingBox"?c.y()+c.height()*this.attribute("fy").numValue():
+this.attribute("fy").Length.toPixels("y"));c=this.gradientUnits=="objectBoundingBox"?(c.width()+c.height())/2*this.attribute("r").numValue():this.attribute("r").Length.toPixels();return a.createRadialGradient(g,j,0,e,f,c)}};a.Element.radialGradient.prototype=new a.Element.GradientBase;a.Element.stop=function(c){this.base=a.Element.ElementBase;this.base(c);this.offset=this.attribute("offset").numValue();c=this.style("stop-color");this.style("stop-opacity").hasValue()&&(c=c.Color.addOpacity(this.style("stop-opacity").value));
+this.color=c.value};a.Element.stop.prototype=new a.Element.ElementBase;a.Element.AnimateBase=function(c){this.base=a.Element.ElementBase;this.base(c);a.Animations.push(this);this.duration=0;this.begin=this.attribute("begin").Time.toMilliseconds();this.maxDuration=this.begin+this.attribute("dur").Time.toMilliseconds();this.getProperty=function(){var a=this.attribute("attributeType").value,b=this.attribute("attributeName").value;return a=="CSS"?this.parent.style(b,!0):this.parent.attribute(b,!0)};this.initialValue=
+null;this.removed=!1;this.calcValue=function(){return""};this.update=function(a){if(this.initialValue==null)this.initialValue=this.getProperty().value;if(this.duration>this.maxDuration)if(this.attribute("repeatCount").value=="indefinite")this.duration=0;else return this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed?(this.removed=!0,this.getProperty().value=this.initialValue,!0):!1;this.duration+=a;a=!1;if(this.begin<this.duration)a=this.calcValue(),this.attribute("type").hasValue()&&
+(a=this.attribute("type").value+"("+a+")"),this.getProperty().value=a,a=!0;return a};this.progress=function(){return(this.duration-this.begin)/(this.maxDuration-this.begin)}};a.Element.AnimateBase.prototype=new a.Element.ElementBase;a.Element.animate=function(c){this.base=a.Element.AnimateBase;this.base(c);this.calcValue=function(){var a=this.attribute("from").numValue(),b=this.attribute("to").numValue();return a+(b-a)*this.progress()}};a.Element.animate.prototype=new a.Element.AnimateBase;a.Element.animateColor=
+function(c){this.base=a.Element.AnimateBase;this.base(c);this.calcValue=function(){var a=new RGBColor(this.attribute("from").value),b=new RGBColor(this.attribute("to").value);if(a.ok&&b.ok){var c=a.r+(b.r-a.r)*this.progress(),e=a.g+(b.g-a.g)*this.progress(),a=a.b+(b.b-a.b)*this.progress();return"rgb("+parseInt(c,10)+","+parseInt(e,10)+","+parseInt(a,10)+")"}return this.attribute("from").value}};a.Element.animateColor.prototype=new a.Element.AnimateBase;a.Element.animateTransform=function(c){this.base=
+a.Element.animate;this.base(c)};a.Element.animateTransform.prototype=new a.Element.animate;a.Element.font=function(c){this.base=a.Element.ElementBase;this.base(c);this.horizAdvX=this.attribute("horiz-adv-x").numValue();this.isArabic=this.isRTL=!1;this.missingGlyph=this.fontFace=null;this.glyphs=[];for(c=0;c<this.children.length;c++){var d=this.children[c];if(d.type=="font-face")this.fontFace=d,d.style("font-family").hasValue()&&(a.Definitions[d.style("font-family").value]=this);else if(d.type=="missing-glyph")this.missingGlyph=
+d;else if(d.type=="glyph")d.arabicForm!=""?(this.isArabic=this.isRTL=!0,typeof this.glyphs[d.unicode]=="undefined"&&(this.glyphs[d.unicode]=[]),this.glyphs[d.unicode][d.arabicForm]=d):this.glyphs[d.unicode]=d}};a.Element.font.prototype=new a.Element.ElementBase;a.Element.fontface=function(c){this.base=a.Element.ElementBase;this.base(c);this.ascent=this.attribute("ascent").value;this.descent=this.attribute("descent").value;this.unitsPerEm=this.attribute("units-per-em").numValue()};a.Element.fontface.prototype=
+new a.Element.ElementBase;a.Element.missingglyph=function(c){this.base=a.Element.path;this.base(c);this.horizAdvX=0};a.Element.missingglyph.prototype=new a.Element.path;a.Element.glyph=function(c){this.base=a.Element.path;this.base(c);this.horizAdvX=this.attribute("horiz-adv-x").numValue();this.unicode=this.attribute("unicode").value;this.arabicForm=this.attribute("arabic-form").value};a.Element.glyph.prototype=new a.Element.path;a.Element.text=function(c){this.base=a.Element.RenderedElementBase;
+this.base(c);if(c!=null){this.children=[];for(var d=0;d<c.childNodes.length;d++){var b=c.childNodes[d];b.nodeType==1?this.addChild(b,!0):b.nodeType==3&&this.addChild(new a.Element.tspan(b),!1)}}this.baseSetContext=this.setContext;this.setContext=function(b){this.baseSetContext(b);if(this.style("dominant-baseline").hasValue())b.textBaseline=this.style("dominant-baseline").value;if(this.style("alignment-baseline").hasValue())b.textBaseline=this.style("alignment-baseline").value};this.renderChildren=
+function(b){for(var a=this.style("text-anchor").valueOrDefault("start"),c=this.attribute("x").Length.toPixels("x"),d=this.attribute("y").Length.toPixels("y"),j=0;j<this.children.length;j++){var h=this.children[j];h.attribute("x").hasValue()?h.x=h.attribute("x").Length.toPixels("x"):(h.attribute("dx").hasValue()&&(c+=h.attribute("dx").Length.toPixels("x")),h.x=c);c=h.measureText(b);if(a!="start"&&(j==0||h.attribute("x").hasValue())){for(var l=c,o=j+1;o<this.children.length;o++){var n=this.children[o];
+if(n.attribute("x").hasValue())break;l+=n.measureText(b)}h.x-=a=="end"?l:l/2}c=h.x+c;h.attribute("y").hasValue()?h.y=h.attribute("y").Length.toPixels("y"):(h.attribute("dy").hasValue()&&(d+=h.attribute("dy").Length.toPixels("y")),h.y=d);d=h.y;h.render(b)}}};a.Element.text.prototype=new a.Element.RenderedElementBase;a.Element.TextElementBase=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.getGlyph=function(a,b,c){var e=b[c],f=null;if(a.isArabic){var g="isolated";if((c==0||b[c-
+1]==" ")&&c<b.length-2&&b[c+1]!=" ")g="terminal";c>0&&b[c-1]!=" "&&c<b.length-2&&b[c+1]!=" "&&(g="medial");if(c>0&&b[c-1]!=" "&&(c==b.length-1||b[c+1]==" "))g="initial";typeof a.glyphs[e]!="undefined"&&(f=a.glyphs[e][g],f==null&&a.glyphs[e].type=="glyph"&&(f=a.glyphs[e]))}else f=a.glyphs[e];if(f==null)f=a.missingGlyph;return f};this.renderChildren=function(c){var b=this.parent.style("font-family").Definition.getDefinition();if(b!=null){var k=this.parent.style("font-size").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize),
+e=this.parent.style("font-style").valueOrDefault(a.Font.Parse(a.ctx.font).fontStyle),f=this.getText();b.isRTL&&(f=f.split("").reverse().join(""));for(var g=a.ToNumberArray(this.parent.attribute("dx").value),j=0;j<f.length;j++){var h=this.getGlyph(b,f,j),l=k/b.fontFace.unitsPerEm;c.translate(this.x,this.y);c.scale(l,-l);var o=c.lineWidth;c.lineWidth=c.lineWidth*b.fontFace.unitsPerEm/k;e=="italic"&&c.transform(1,0,0.4,1,0,0);h.render(c);e=="italic"&&c.transform(1,0,-0.4,1,0,0);c.lineWidth=o;c.scale(1/
+l,-1/l);c.translate(-this.x,-this.y);this.x+=k*(h.horizAdvX||b.horizAdvX)/b.fontFace.unitsPerEm;typeof g[j]!="undefined"&&!isNaN(g[j])&&(this.x+=g[j])}}else c.strokeStyle!=""&&c.strokeText(a.compressSpaces(this.getText()),this.x,this.y),c.fillStyle!=""&&c.fillText(a.compressSpaces(this.getText()),this.x,this.y)};this.getText=function(){};this.measureText=function(c){var b=this.parent.style("font-family").Definition.getDefinition();if(b!=null){var c=this.parent.style("font-size").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize),
+k=0,e=this.getText();b.isRTL&&(e=e.split("").reverse().join(""));for(var f=a.ToNumberArray(this.parent.attribute("dx").value),g=0;g<e.length;g++){var j=this.getGlyph(b,e,g);k+=(j.horizAdvX||b.horizAdvX)*c/b.fontFace.unitsPerEm;typeof f[g]!="undefined"&&!isNaN(f[g])&&(k+=f[g])}return k}b=a.compressSpaces(this.getText());if(!c.measureText)return b.length*10;c.save();this.setContext(c);b=c.measureText(b).width;c.restore();return b}};a.Element.TextElementBase.prototype=new a.Element.RenderedElementBase;
+a.Element.tspan=function(c){this.base=a.Element.TextElementBase;this.base(c);this.text=c.nodeType==3?c.nodeValue:c.childNodes.length>0?c.childNodes[0].nodeValue:c.text;this.getText=function(){return this.text}};a.Element.tspan.prototype=new a.Element.TextElementBase;a.Element.tref=function(c){this.base=a.Element.TextElementBase;this.base(c);this.getText=function(){var a=this.attribute("xlink:href").Definition.getDefinition();if(a!=null)return a.children[0].getText()}};a.Element.tref.prototype=new a.Element.TextElementBase;
+a.Element.a=function(c){this.base=a.Element.TextElementBase;this.base(c);this.hasText=!0;for(var d=0;d<c.childNodes.length;d++)if(c.childNodes[d].nodeType!=3)this.hasText=!1;this.text=this.hasText?c.childNodes[0].nodeValue:"";this.getText=function(){return this.text};this.baseRenderChildren=this.renderChildren;this.renderChildren=function(b){if(this.hasText){this.baseRenderChildren(b);var c=new a.Property("fontSize",a.Font.Parse(a.ctx.font).fontSize);a.Mouse.checkBoundingBox(this,new a.BoundingBox(this.x,
+this.y-c.Length.toPixels("y"),this.x+this.measureText(b),this.y))}else c=new a.Element.g,c.children=this.children,c.parent=this,c.render(b)};this.onclick=function(){window.open(this.attribute("xlink:href").value)};this.onmousemove=function(){a.ctx.canvas.style.cursor="pointer"}};a.Element.a.prototype=new a.Element.TextElementBase;a.Element.image=function(c){this.base=a.Element.RenderedElementBase;this.base(c);a.Images.push(this);this.img=document.createElement("img");this.loaded=!1;var d=this;this.img.onload=
+function(){d.loaded=!0};this.img.src=this.attribute("xlink:href").value;this.renderChildren=function(b){var c=this.attribute("x").Length.toPixels("x"),d=this.attribute("y").Length.toPixels("y"),f=this.attribute("width").Length.toPixels("x"),g=this.attribute("height").Length.toPixels("y");f==0||g==0||(b.save(),b.translate(c,d),a.AspectRatio(b,this.attribute("preserveAspectRatio").value,f,this.img.width,g,this.img.height,0,0),b.drawImage(this.img,0,0),b.restore())}};a.Element.image.prototype=new a.Element.RenderedElementBase;
+a.Element.g=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.getBoundingBox=function(){for(var c=new a.BoundingBox,b=0;b<this.children.length;b++)c.addBoundingBox(this.children[b].getBoundingBox());return c}};a.Element.g.prototype=new a.Element.RenderedElementBase;a.Element.symbol=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseSetContext=this.setContext;this.setContext=function(c){this.baseSetContext(c);if(this.attribute("viewBox").hasValue()){var b=
+a.ToNumberArray(this.attribute("viewBox").value),k=b[0],e=b[1];width=b[2];height=b[3];a.AspectRatio(c,this.attribute("preserveAspectRatio").value,this.attribute("width").Length.toPixels("x"),width,this.attribute("height").Length.toPixels("y"),height,k,e);a.ViewPort.SetCurrent(b[2],b[3])}}};a.Element.symbol.prototype=new a.Element.RenderedElementBase;a.Element.style=function(c){this.base=a.Element.ElementBase;this.base(c);for(var c=c.childNodes[0].nodeValue+(c.childNodes.length>1?c.childNodes[1].nodeValue:
+""),c=c.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm,""),c=a.compressSpaces(c),c=c.split("}"),d=0;d<c.length;d++)if(a.trim(c[d])!="")for(var b=c[d].split("{"),k=b[0].split(","),b=b[1].split(";"),e=0;e<k.length;e++){var f=a.trim(k[e]);if(f!=""){for(var g={},j=0;j<b.length;j++){var h=b[j].indexOf(":"),l=b[j].substr(0,h),h=b[j].substr(h+1,b[j].length-h);l!=null&&h!=null&&(g[a.trim(l)]=new a.Property(a.trim(l),a.trim(h)))}a.Styles[f]=g;if(f=="@font-face"){f=g["font-family"].value.replace(/"/g,
+"");g=g.src.value.split(",");for(j=0;j<g.length;j++)if(g[j].indexOf('format("svg")')>0){l=g[j].indexOf("url");h=g[j].indexOf(")",l);l=g[j].substr(l+5,h-l-6);l=a.parseXml(a.ajax(l)).getElementsByTagName("font");for(h=0;h<l.length;h++){var o=a.CreateElement(l[h]);a.Definitions[f]=o}}}}}};a.Element.style.prototype=new a.Element.ElementBase;a.Element.use=function(c){this.base=a.Element.RenderedElementBase;this.base(c);this.baseSetContext=this.setContext;this.setContext=function(a){this.baseSetContext(a);
+this.attribute("x").hasValue()&&a.translate(this.attribute("x").Length.toPixels("x"),0);this.attribute("y").hasValue()&&a.translate(0,this.attribute("y").Length.toPixels("y"))};this.getDefinition=function(){var a=this.attribute("xlink:href").Definition.getDefinition();if(this.attribute("width").hasValue())a.attribute("width",!0).value=this.attribute("width").value;if(this.attribute("height").hasValue())a.attribute("height",!0).value=this.attribute("height").value;return a};this.path=function(a){var b=
+this.getDefinition();b!=null&&b.path(a)};this.renderChildren=function(a){var b=this.getDefinition();b!=null&&b.render(a)}};a.Element.use.prototype=new a.Element.RenderedElementBase;a.Element.mask=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,b){var c=this.attribute("x").Length.toPixels("x"),e=this.attribute("y").Length.toPixels("y"),f=this.attribute("width").Length.toPixels("x"),g=this.attribute("height").Length.toPixels("y"),j=b.attribute("mask").value;b.attribute("mask").value=
+"";var h=document.createElement("canvas");h.width=c+f;h.height=e+g;var l=h.getContext("2d");this.renderChildren(l);var o=document.createElement("canvas");o.width=c+f;o.height=e+g;var n=o.getContext("2d");b.render(n);n.globalCompositeOperation="destination-in";n.fillStyle=l.createPattern(h,"no-repeat");n.fillRect(0,0,c+f,e+g);a.fillStyle=n.createPattern(o,"no-repeat");a.fillRect(0,0,c+f,e+g);b.attribute("mask").value=j};this.render=function(){}};a.Element.mask.prototype=new a.Element.ElementBase;a.Element.clipPath=
+function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a){for(var b=0;b<this.children.length;b++)this.children[b].path&&(this.children[b].path(a),a.clip())};this.render=function(){}};a.Element.clipPath.prototype=new a.Element.ElementBase;a.Element.filter=function(c){this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,b){var c=b.getBoundingBox(),e=this.attribute("x").Length.toPixels("x"),f=this.attribute("y").Length.toPixels("y");if(e==0||f==0)e=c.x1,f=c.y1;var g=
+this.attribute("width").Length.toPixels("x"),j=this.attribute("height").Length.toPixels("y");if(g==0||j==0)g=c.width(),j=c.height();c=b.style("filter").value;b.style("filter").value="";var h=0.2*g,l=0.2*j,o=document.createElement("canvas");o.width=g+2*h;o.height=j+2*l;var n=o.getContext("2d");n.translate(-e+h,-f+l);b.render(n);for(var q=0;q<this.children.length;q++)this.children[q].apply(n,0,0,g+2*h,j+2*l);a.drawImage(o,0,0,g+2*h,j+2*l,e-h,f-l,g+2*h,j+2*l);b.style("filter",!0).value=c};this.render=
+function(){}};a.Element.filter.prototype=new a.Element.ElementBase;a.Element.feGaussianBlur=function(c){function d(a,c,d,f,g){for(var j=0;j<g;j++)for(var h=0;h<f;h++)for(var l=a[j*f*4+h*4+3]/255,o=0;o<4;o++){for(var n=d[0]*(l==0?255:a[j*f*4+h*4+o])*(l==0||o==3?1:l),q=1;q<d.length;q++){var p=Math.max(h-q,0),m=a[j*f*4+p*4+3]/255,p=Math.min(h+q,f-1),p=a[j*f*4+p*4+3]/255,s=d[q],r;m==0?r=255:(r=Math.max(h-q,0),r=a[j*f*4+r*4+o]);m=r*(m==0||o==3?1:m);p==0?r=255:(r=Math.min(h+q,f-1),r=a[j*f*4+r*4+o]);n+=
+s*(m+r*(p==0||o==3?1:p))}c[h*g*4+j*4+o]=n}}this.base=a.Element.ElementBase;this.base(c);this.apply=function(a,c,e,f,g){var e=this.attribute("stdDeviation").numValue(),c=a.getImageData(0,0,f,g),e=Math.max(e,0.01),j=Math.ceil(e*4)+1;mask=[];for(var h=0;h<j;h++)mask[h]=Math.exp(-0.5*(h/e)*(h/e));e=mask;j=0;for(h=1;h<e.length;h++)j+=Math.abs(e[h]);j=2*j+Math.abs(e[0]);for(h=0;h<e.length;h++)e[h]/=j;tmp=[];d(c.data,tmp,e,f,g);d(tmp,c.data,e,g,f);a.clearRect(0,0,f,g);a.putImageData(c,0,0)}};a.Element.filter.prototype=
+new a.Element.feGaussianBlur;a.Element.title=function(){};a.Element.title.prototype=new a.Element.ElementBase;a.Element.desc=function(){};a.Element.desc.prototype=new a.Element.ElementBase;a.Element.MISSING=function(a){console.log("ERROR: Element '"+a.nodeName+"' not yet implemented.")};a.Element.MISSING.prototype=new a.Element.ElementBase;a.CreateElement=function(c){var d=c.nodeName.replace(/^[^:]+:/,""),d=d.replace(/\-/g,""),b=null,b=typeof a.Element[d]!="undefined"?new a.Element[d](c):new a.Element.MISSING(c);
+b.type=c.nodeName;return b};a.load=function(c,d){a.loadXml(c,a.ajax(d))};a.loadXml=function(c,d){a.loadXmlDoc(c,a.parseXml(d))};a.loadXmlDoc=function(c,d){a.init(c);var b=function(a){for(var b=c.canvas;b;)a.x-=b.offsetLeft,a.y-=b.offsetTop,b=b.offsetParent;window.scrollX&&(a.x+=window.scrollX);window.scrollY&&(a.y+=window.scrollY);return a};if(a.opts.ignoreMouse!=!0)c.canvas.onclick=function(c){c=b(new a.Point(c!=null?c.clientX:event.clientX,c!=null?c.clientY:event.clientY));a.Mouse.onclick(c.x,c.y)},
+c.canvas.onmousemove=function(c){c=b(new a.Point(c!=null?c.clientX:event.clientX,c!=null?c.clientY:event.clientY));a.Mouse.onmousemove(c.x,c.y)};var k=a.CreateElement(d.documentElement),e=k.root=!0,f=function(){a.ViewPort.Clear();c.canvas.parentNode&&a.ViewPort.SetCurrent(c.canvas.parentNode.clientWidth,c.canvas.parentNode.clientHeight);if(a.opts.ignoreDimensions!=!0){if(k.style("width").hasValue())c.canvas.width=k.style("width").Length.toPixels("x"),c.canvas.style.width=c.canvas.width+"px";if(k.style("height").hasValue())c.canvas.height=
+k.style("height").Length.toPixels("y"),c.canvas.style.height=c.canvas.height+"px"}var b=c.canvas.clientWidth||c.canvas.width,d=c.canvas.clientHeight||c.canvas.height;a.ViewPort.SetCurrent(b,d);if(a.opts!=null&&a.opts.offsetX!=null)k.attribute("x",!0).value=a.opts.offsetX;if(a.opts!=null&&a.opts.offsetY!=null)k.attribute("y",!0).value=a.opts.offsetY;if(a.opts!=null&&a.opts.scaleWidth!=null&&a.opts.scaleHeight!=null){var f=1,g=1;k.attribute("width").hasValue()&&(f=k.attribute("width").Length.toPixels("x")/
+a.opts.scaleWidth);k.attribute("height").hasValue()&&(g=k.attribute("height").Length.toPixels("y")/a.opts.scaleHeight);k.attribute("width",!0).value=a.opts.scaleWidth;k.attribute("height",!0).value=a.opts.scaleHeight;k.attribute("viewBox",!0).value="0 0 "+b*f+" "+d*g;k.attribute("preserveAspectRatio",!0).value="none"}a.opts.ignoreClear!=!0&&c.clearRect(0,0,b,d);k.render(c);e&&(e=!1,a.opts!=null&&typeof a.opts.renderCallback=="function"&&a.opts.renderCallback())},g=!0;a.ImagesLoaded()&&(g=!1,f());
+a.intervalID=setInterval(function(){var b=!1;g&&a.ImagesLoaded()&&(g=!1,b=!0);a.opts.ignoreMouse!=!0&&(b|=a.Mouse.hasEvents());if(a.opts.ignoreAnimation!=!0)for(var c=0;c<a.Animations.length;c++)b|=a.Animations[c].update(1E3/a.FRAMERATE);a.opts!=null&&typeof a.opts.forceRedraw=="function"&&a.opts.forceRedraw()==!0&&(b=!0);b&&(f(),a.Mouse.runEvents())},1E3/a.FRAMERATE)};a.stop=function(){a.intervalID&&clearInterval(a.intervalID)};a.Mouse=new function(){this.events=[];this.hasEvents=function(){return this.events.length!=
+0};this.onclick=function(a,d){this.events.push({type:"onclick",x:a,y:d,run:function(a){if(a.onclick)a.onclick()}})};this.onmousemove=function(a,d){this.events.push({type:"onmousemove",x:a,y:d,run:function(a){if(a.onmousemove)a.onmousemove()}})};this.eventElements=[];this.checkPath=function(a,d){for(var b=0;b<this.events.length;b++){var k=this.events[b];d.isPointInPath&&d.isPointInPath(k.x,k.y)&&(this.eventElements[b]=a)}};this.checkBoundingBox=function(a,d){for(var b=0;b<this.events.length;b++){var k=
+this.events[b];d.isPointInBox(k.x,k.y)&&(this.eventElements[b]=a)}};this.runEvents=function(){a.ctx.canvas.style.cursor="";for(var c=0;c<this.events.length;c++)for(var d=this.events[c],b=this.eventElements[c];b;)d.run(b),b=b.parent;this.events=[];this.eventElements=[]}};return a}this.canvg=function(a,c,d){if(a==null&&c==null&&d==null)for(var c=document.getElementsByTagName("svg"),b=0;b<c.length;b++){a=c[b];d=document.createElement("canvas");d.width=a.clientWidth;d.height=a.clientHeight;a.parentNode.insertBefore(d,
+a);a.parentNode.removeChild(a);var k=document.createElement("div");k.appendChild(a);canvg(d,k.innerHTML)}else d=d||{},typeof a=="string"&&(a=document.getElementById(a)),a.svg==null?(b=m(),a.svg=b):(b=a.svg,b.stop()),b.opts=d,a=a.getContext("2d"),typeof c.documentElement!="undefined"?b.loadXmlDoc(a,c):c.substr(0,1)=="<"?b.loadXml(a,c):b.load(a,c)}})();
+if(CanvasRenderingContext2D)CanvasRenderingContext2D.prototype.drawSvg=function(m,a,c,d,b){canvg(this.canvas,m,{ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0,ignoreClear:!0,offsetX:a,offsetY:c,scaleWidth:d,scaleHeight:b})};
+(function(m){var a=m.css,c=m.CanVGRenderer,d=m.SVGRenderer,b=m.extend,k=m.merge,e=m.addEvent,f=m.createElement,g=m.discardElement;b(c.prototype,d.prototype);b(c.prototype,{create:function(a,b,c,d){this.setContainer(b,c,d);this.configure(a)},setContainer:function(a,b,c){var d=a.style,e=a.parentNode,g=d.left,d=d.top,k=a.offsetWidth,m=a.offsetHeight,s={visibility:"hidden",position:"absolute"};this.init.apply(this,[a,b,c]);this.canvas=f("canvas",{width:k,height:m},{position:"relative",left:g,top:d},a);
+this.ttLine=f("div",null,s,e);this.ttDiv=f("div",null,s,e);this.ttTimer=void 0;this.hiddenSvg=a=f("div",{width:k,height:m},{visibility:"hidden",left:g,top:d},e);a.appendChild(this.box)},configure:function(b){var c=this,d=b.options.tooltip,f=d.borderWidth,g=c.ttDiv,m=d.style,p=c.ttLine,t=parseInt(m.padding,10),m=k(m,{padding:t+"px","background-color":d.backgroundColor,"border-style":"solid","border-width":f+"px","border-radius":d.borderRadius+"px"});d.shadow&&(m=k(m,{"box-shadow":"1px 1px 3px gray",
+"-webkit-box-shadow":"1px 1px 3px gray"}));a(g,m);a(p,{"border-left":"1px solid darkgray"});e(b,"tooltipRefresh",function(d){var e=b.container,f=e.offsetLeft,e=e.offsetTop,k;g.innerHTML=d.text;k=b.tooltip.getPosition(g.offsetWidth,g.offsetHeight,{plotX:d.x,plotY:d.y});a(g,{visibility:"visible",left:k.x+"px",top:k.y+"px","border-color":d.borderColor});a(p,{visibility:"visible",left:f+d.x+"px",top:e+b.plotTop+"px",height:b.plotHeight+"px"});c.ttTimer!==void 0&&clearTimeout(c.ttTimer);c.ttTimer=setTimeout(function(){a(g,
+{visibility:"hidden"});a(p,{visibility:"hidden"})},3E3)})},destroy:function(){g(this.canvas);this.ttTimer!==void 0&&clearTimeout(this.ttTimer);g(this.ttLine);g(this.ttDiv);g(this.hiddenSvg);return d.prototype.destroy.apply(this)},color:function(a,b,c){a&&a.linearGradient&&(a=a.stops[a.stops.length-1][1]);return d.prototype.color.call(this,a,b,c)},draw:function(){window.canvg(this.canvas,this.hiddenSvg.innerHTML)}})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/canvas-tools.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/canvas-tools.src.js
new file mode 100644
index 0000000..3ebbdcf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/canvas-tools.src.js
@@ -0,0 +1,3113 @@
+/**
+ * @license A class to parse color values
+ * @author Stoyan Stefanov <sstoo@gmail.com>
+ * @link   http://www.phpied.com/rgb-color-parser-in-javascript/
+ * Use it if you like it
+ *
+ */
+function RGBColor(color_string)
+{
+    this.ok = false;
+
+    // strip any leading #
+    if (color_string.charAt(0) == '#') { // remove # if any
+        color_string = color_string.substr(1,6);
+    }
+
+    color_string = color_string.replace(/ /g,'');
+    color_string = color_string.toLowerCase();
+
+    // before getting into regexps, try simple matches
+    // and overwrite the input
+    var simple_colors = {
+        aliceblue: 'f0f8ff',
+        antiquewhite: 'faebd7',
+        aqua: '00ffff',
+        aquamarine: '7fffd4',
+        azure: 'f0ffff',
+        beige: 'f5f5dc',
+        bisque: 'ffe4c4',
+        black: '000000',
+        blanchedalmond: 'ffebcd',
+        blue: '0000ff',
+        blueviolet: '8a2be2',
+        brown: 'a52a2a',
+        burlywood: 'deb887',
+        cadetblue: '5f9ea0',
+        chartreuse: '7fff00',
+        chocolate: 'd2691e',
+        coral: 'ff7f50',
+        cornflowerblue: '6495ed',
+        cornsilk: 'fff8dc',
+        crimson: 'dc143c',
+        cyan: '00ffff',
+        darkblue: '00008b',
+        darkcyan: '008b8b',
+        darkgoldenrod: 'b8860b',
+        darkgray: 'a9a9a9',
+        darkgreen: '006400',
+        darkkhaki: 'bdb76b',
+        darkmagenta: '8b008b',
+        darkolivegreen: '556b2f',
+        darkorange: 'ff8c00',
+        darkorchid: '9932cc',
+        darkred: '8b0000',
+        darksalmon: 'e9967a',
+        darkseagreen: '8fbc8f',
+        darkslateblue: '483d8b',
+        darkslategray: '2f4f4f',
+        darkturquoise: '00ced1',
+        darkviolet: '9400d3',
+        deeppink: 'ff1493',
+        deepskyblue: '00bfff',
+        dimgray: '696969',
+        dodgerblue: '1e90ff',
+        feldspar: 'd19275',
+        firebrick: 'b22222',
+        floralwhite: 'fffaf0',
+        forestgreen: '228b22',
+        fuchsia: 'ff00ff',
+        gainsboro: 'dcdcdc',
+        ghostwhite: 'f8f8ff',
+        gold: 'ffd700',
+        goldenrod: 'daa520',
+        gray: '808080',
+        green: '008000',
+        greenyellow: 'adff2f',
+        honeydew: 'f0fff0',
+        hotpink: 'ff69b4',
+        indianred : 'cd5c5c',
+        indigo : '4b0082',
+        ivory: 'fffff0',
+        khaki: 'f0e68c',
+        lavender: 'e6e6fa',
+        lavenderblush: 'fff0f5',
+        lawngreen: '7cfc00',
+        lemonchiffon: 'fffacd',
+        lightblue: 'add8e6',
+        lightcoral: 'f08080',
+        lightcyan: 'e0ffff',
+        lightgoldenrodyellow: 'fafad2',
+        lightgrey: 'd3d3d3',
+        lightgreen: '90ee90',
+        lightpink: 'ffb6c1',
+        lightsalmon: 'ffa07a',
+        lightseagreen: '20b2aa',
+        lightskyblue: '87cefa',
+        lightslateblue: '8470ff',
+        lightslategray: '778899',
+        lightsteelblue: 'b0c4de',
+        lightyellow: 'ffffe0',
+        lime: '00ff00',
+        limegreen: '32cd32',
+        linen: 'faf0e6',
+        magenta: 'ff00ff',
+        maroon: '800000',
+        mediumaquamarine: '66cdaa',
+        mediumblue: '0000cd',
+        mediumorchid: 'ba55d3',
+        mediumpurple: '9370d8',
+        mediumseagreen: '3cb371',
+        mediumslateblue: '7b68ee',
+        mediumspringgreen: '00fa9a',
+        mediumturquoise: '48d1cc',
+        mediumvioletred: 'c71585',
+        midnightblue: '191970',
+        mintcream: 'f5fffa',
+        mistyrose: 'ffe4e1',
+        moccasin: 'ffe4b5',
+        navajowhite: 'ffdead',
+        navy: '000080',
+        oldlace: 'fdf5e6',
+        olive: '808000',
+        olivedrab: '6b8e23',
+        orange: 'ffa500',
+        orangered: 'ff4500',
+        orchid: 'da70d6',
+        palegoldenrod: 'eee8aa',
+        palegreen: '98fb98',
+        paleturquoise: 'afeeee',
+        palevioletred: 'd87093',
+        papayawhip: 'ffefd5',
+        peachpuff: 'ffdab9',
+        peru: 'cd853f',
+        pink: 'ffc0cb',
+        plum: 'dda0dd',
+        powderblue: 'b0e0e6',
+        purple: '800080',
+        red: 'ff0000',
+        rosybrown: 'bc8f8f',
+        royalblue: '4169e1',
+        saddlebrown: '8b4513',
+        salmon: 'fa8072',
+        sandybrown: 'f4a460',
+        seagreen: '2e8b57',
+        seashell: 'fff5ee',
+        sienna: 'a0522d',
+        silver: 'c0c0c0',
+        skyblue: '87ceeb',
+        slateblue: '6a5acd',
+        slategray: '708090',
+        snow: 'fffafa',
+        springgreen: '00ff7f',
+        steelblue: '4682b4',
+        tan: 'd2b48c',
+        teal: '008080',
+        thistle: 'd8bfd8',
+        tomato: 'ff6347',
+        turquoise: '40e0d0',
+        violet: 'ee82ee',
+        violetred: 'd02090',
+        wheat: 'f5deb3',
+        white: 'ffffff',
+        whitesmoke: 'f5f5f5',
+        yellow: 'ffff00',
+        yellowgreen: '9acd32'
+    };
+    for (var key in simple_colors) {
+        if (color_string == key) {
+            color_string = simple_colors[key];
+        }
+    }
+    // emd of simple type-in colors
+
+    // array of color definition objects
+    var color_defs = [
+        {
+            re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
+            example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],
+            process: function (bits){
+                return [
+                    parseInt(bits[1]),
+                    parseInt(bits[2]),
+                    parseInt(bits[3])
+                ];
+            }
+        },
+        {
+            re: /^(\w{2})(\w{2})(\w{2})$/,
+            example: ['#00ff00', '336699'],
+            process: function (bits){
+                return [
+                    parseInt(bits[1], 16),
+                    parseInt(bits[2], 16),
+                    parseInt(bits[3], 16)
+                ];
+            }
+        },
+        {
+            re: /^(\w{1})(\w{1})(\w{1})$/,
+            example: ['#fb0', 'f0f'],
+            process: function (bits){
+                return [
+                    parseInt(bits[1] + bits[1], 16),
+                    parseInt(bits[2] + bits[2], 16),
+                    parseInt(bits[3] + bits[3], 16)
+                ];
+            }
+        }
+    ];
+
+    // search through the definitions to find a match
+    for (var i = 0; i < color_defs.length; i++) {
+        var re = color_defs[i].re;
+        var processor = color_defs[i].process;
+        var bits = re.exec(color_string);
+        if (bits) {
+            channels = processor(bits);
+            this.r = channels[0];
+            this.g = channels[1];
+            this.b = channels[2];
+            this.ok = true;
+        }
+
+    }
+
+    // validate/cleanup values
+    this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);
+    this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);
+    this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);
+
+    // some getters
+    this.toRGB = function () {
+        return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';
+    }
+    this.toHex = function () {
+        var r = this.r.toString(16);
+        var g = this.g.toString(16);
+        var b = this.b.toString(16);
+        if (r.length == 1) r = '0' + r;
+        if (g.length == 1) g = '0' + g;
+        if (b.length == 1) b = '0' + b;
+        return '#' + r + g + b;
+    }
+
+    // help
+    this.getHelpXML = function () {
+
+        var examples = new Array();
+        // add regexps
+        for (var i = 0; i < color_defs.length; i++) {
+            var example = color_defs[i].example;
+            for (var j = 0; j < example.length; j++) {
+                examples[examples.length] = example[j];
+            }
+        }
+        // add type-in colors
+        for (var sc in simple_colors) {
+            examples[examples.length] = sc;
+        }
+
+        var xml = document.createElement('ul');
+        xml.setAttribute('id', 'rgbcolor-examples');
+        for (var i = 0; i < examples.length; i++) {
+            try {
+                var list_item = document.createElement('li');
+                var list_color = new RGBColor(examples[i]);
+                var example_div = document.createElement('div');
+                example_div.style.cssText =
+                        'margin: 3px; '
+                        + 'border: 1px solid black; '
+                        + 'background:' + list_color.toHex() + '; '
+                        + 'color:' + list_color.toHex()
+                ;
+                example_div.appendChild(document.createTextNode('test'));
+                var list_item_value = document.createTextNode(
+                    ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()
+                );
+                list_item.appendChild(example_div);
+                list_item.appendChild(list_item_value);
+                xml.appendChild(list_item);
+
+            } catch(e){}
+        }
+        return xml;
+
+    }
+
+}
+
+/**
+ * @license canvg.js - Javascript SVG parser and renderer on Canvas
+ * MIT Licensed 
+ * Gabe Lerner (gabelerner@gmail.com)
+ * http://code.google.com/p/canvg/
+ *
+ * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/
+ *
+ */
+if(!window.console) {
+	window.console = {};
+	window.console.log = function(str) {};
+	window.console.dir = function(str) {};
+}
+
+if(!Array.prototype.indexOf){
+	Array.prototype.indexOf = function(obj){
+		for(var i=0; i<this.length; i++){
+			if(this[i]==obj){
+				return i;
+			}
+		}
+		return -1;
+	}
+}
+
+(function(){
+	// canvg(target, s)
+	// empty parameters: replace all 'svg' elements on page with 'canvas' elements
+	// target: canvas element or the id of a canvas element
+	// s: svg string, url to svg file, or xml document
+	// opts: optional hash of options
+	//		 ignoreMouse: true => ignore mouse events
+	//		 ignoreAnimation: true => ignore animations
+	//		 ignoreDimensions: true => does not try to resize canvas
+	//		 ignoreClear: true => does not clear canvas
+	//		 offsetX: int => draws at a x offset
+	//		 offsetY: int => draws at a y offset
+	//		 scaleWidth: int => scales horizontally to width
+	//		 scaleHeight: int => scales vertically to height
+	//		 renderCallback: function => will call the function after the first render is completed
+	//		 forceRedraw: function => will call the function on every frame, if it returns true, will redraw
+	this.canvg = function (target, s, opts) {
+		// no parameters
+		if (target == null && s == null && opts == null) {
+			var svgTags = document.getElementsByTagName('svg');
+			for (var i=0; i<svgTags.length; i++) {
+				var svgTag = svgTags[i];
+				var c = document.createElement('canvas');
+				c.width = svgTag.clientWidth;
+				c.height = svgTag.clientHeight;
+				svgTag.parentNode.insertBefore(c, svgTag);
+				svgTag.parentNode.removeChild(svgTag);
+				var div = document.createElement('div');
+				div.appendChild(svgTag);
+				canvg(c, div.innerHTML);
+			}
+			return;
+		}	
+		opts = opts || {};
+	
+		if (typeof target == 'string') {
+			target = document.getElementById(target);
+		}
+		
+		// reuse class per canvas
+		var svg;
+		if (target.svg == null) {
+			svg = build();
+			target.svg = svg;
+		}
+		else {
+			svg = target.svg;
+			svg.stop();
+		}
+		svg.opts = opts;
+		
+		var ctx = target.getContext('2d');
+		if (typeof(s.documentElement) != 'undefined') {
+			// load from xml doc
+			svg.loadXmlDoc(ctx, s);
+		}
+		else if (s.substr(0,1) == '<') {
+			// load from xml string
+			svg.loadXml(ctx, s);
+		}
+		else {
+			// load from url
+			svg.load(ctx, s);
+		}
+	}
+
+	function build() {
+		var svg = { };
+		
+		svg.FRAMERATE = 30;
+		svg.MAX_VIRTUAL_PIXELS = 30000;
+		
+		// globals
+		svg.init = function(ctx) {
+			svg.Definitions = {};
+			svg.Styles = {};
+			svg.Animations = [];
+			svg.Images = [];
+			svg.ctx = ctx;
+			svg.ViewPort = new (function () {
+				this.viewPorts = [];
+				this.Clear = function() { this.viewPorts = []; }
+				this.SetCurrent = function(width, height) { this.viewPorts.push({ width: width, height: height }); }
+				this.RemoveCurrent = function() { this.viewPorts.pop(); }
+				this.Current = function() { return this.viewPorts[this.viewPorts.length - 1]; }
+				this.width = function() { return this.Current().width; }
+				this.height = function() { return this.Current().height; }
+				this.ComputeSize = function(d) {
+					if (d != null && typeof(d) == 'number') return d;
+					if (d == 'x') return this.width();
+					if (d == 'y') return this.height();
+					return Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2);			
+				}
+			});
+		}
+		svg.init();
+		
+		// images loaded
+		svg.ImagesLoaded = function() { 
+			for (var i=0; i<svg.Images.length; i++) {
+				if (!svg.Images[i].loaded) return false;
+			}
+			return true;
+		}
+
+		// trim
+		svg.trim = function(s) { return s.replace(/^\s+|\s+$/g, ''); }
+		
+		// compress spaces
+		svg.compressSpaces = function(s) { return s.replace(/[\s\r\t\n]+/gm,' '); }
+		
+		// ajax
+		svg.ajax = function(url) {
+			var AJAX;
+			if(window.XMLHttpRequest){AJAX=new XMLHttpRequest();}
+			else{AJAX=new ActiveXObject('Microsoft.XMLHTTP');}
+			if(AJAX){
+			   AJAX.open('GET',url,false);
+			   AJAX.send(null);
+			   return AJAX.responseText;
+			}
+			return null;
+		} 
+		
+		// parse xml
+		svg.parseXml = function(xml) {
+			if (window.DOMParser)
+			{
+				var parser = new DOMParser();
+				return parser.parseFromString(xml, 'text/xml');
+			}
+			else 
+			{
+				xml = xml.replace(/<!DOCTYPE svg[^>]*>/, '');
+				var xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
+				xmlDoc.async = 'false';
+				xmlDoc.loadXML(xml); 
+				return xmlDoc;
+			}		
+		}
+		
+		svg.Property = function(name, value) {
+			this.name = name;
+			this.value = value;
+			
+			this.hasValue = function() {
+				return (this.value != null && this.value !== '');
+			}
+							
+			// return the numerical value of the property
+			this.numValue = function() {
+				if (!this.hasValue()) return 0;
+				
+				var n = parseFloat(this.value);
+				if ((this.value + '').match(/%$/)) {
+					n = n / 100.0;
+				}
+				return n;
+			}
+			
+			this.valueOrDefault = function(def) {
+				if (this.hasValue()) return this.value;
+				return def;
+			}
+			
+			this.numValueOrDefault = function(def) {
+				if (this.hasValue()) return this.numValue();
+				return def;
+			}
+			
+			/* EXTENSIONS */
+			var that = this;
+			
+			// color extensions
+			this.Color = {
+				// augment the current color value with the opacity
+				addOpacity: function(opacity) {
+					var newValue = that.value;
+					if (opacity != null && opacity != '') {
+						var color = new RGBColor(that.value);
+						if (color.ok) {
+							newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacity + ')';
+						}
+					}
+					return new svg.Property(that.name, newValue);
+				}
+			}
+			
+			// definition extensions
+			this.Definition = {
+				// get the definition from the definitions table
+				getDefinition: function() {
+					var name = that.value.replace(/^(url\()?#([^\)]+)\)?$/, '$2');
+					return svg.Definitions[name];
+				},
+				
+				isUrl: function() {
+					return that.value.indexOf('url(') == 0
+				},
+				
+				getFillStyle: function(e) {
+					var def = this.getDefinition();
+					
+					// gradient
+					if (def != null && def.createGradient) {
+						return def.createGradient(svg.ctx, e);
+					}
+					
+					// pattern
+					if (def != null && def.createPattern) {
+						return def.createPattern(svg.ctx, e);
+					}
+					
+					return null;
+				}
+			}
+			
+			// length extensions
+			this.Length = {
+				DPI: function(viewPort) {
+					return 96.0; // TODO: compute?
+				},
+				
+				EM: function(viewPort) {
+					var em = 12;
+					
+					var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);
+					if (fontSize.hasValue()) em = fontSize.Length.toPixels(viewPort);
+					
+					return em;
+				},
+			
+				// get the length as pixels
+				toPixels: function(viewPort) {
+					if (!that.hasValue()) return 0;
+					var s = that.value+'';
+					if (s.match(/em$/)) return that.numValue() * this.EM(viewPort);
+					if (s.match(/ex$/)) return that.numValue() * this.EM(viewPort) / 2.0;
+					if (s.match(/px$/)) return that.numValue();
+					if (s.match(/pt$/)) return that.numValue() * 1.25;
+					if (s.match(/pc$/)) return that.numValue() * 15;
+					if (s.match(/cm$/)) return that.numValue() * this.DPI(viewPort) / 2.54;
+					if (s.match(/mm$/)) return that.numValue() * this.DPI(viewPort) / 25.4;
+					if (s.match(/in$/)) return that.numValue() * this.DPI(viewPort);
+					if (s.match(/%$/)) return that.numValue() * svg.ViewPort.ComputeSize(viewPort);
+					return that.numValue();
+				}
+			}
+			
+			// time extensions
+			this.Time = {
+				// get the time as milliseconds
+				toMilliseconds: function() {
+					if (!that.hasValue()) return 0;
+					var s = that.value+'';
+					if (s.match(/s$/)) return that.numValue() * 1000;
+					if (s.match(/ms$/)) return that.numValue();
+					return that.numValue();
+				}
+			}
+			
+			// angle extensions
+			this.Angle = {
+				// get the angle as radians
+				toRadians: function() {
+					if (!that.hasValue()) return 0;
+					var s = that.value+'';
+					if (s.match(/deg$/)) return that.numValue() * (Math.PI / 180.0);
+					if (s.match(/grad$/)) return that.numValue() * (Math.PI / 200.0);
+					if (s.match(/rad$/)) return that.numValue();
+					return that.numValue() * (Math.PI / 180.0);
+				}
+			}
+		}
+		
+		// fonts
+		svg.Font = new (function() {
+			this.Styles = ['normal','italic','oblique','inherit'];
+			this.Variants = ['normal','small-caps','inherit'];
+			this.Weights = ['normal','bold','bolder','lighter','100','200','300','400','500','600','700','800','900','inherit'];
+			
+			this.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) { 
+				var f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font);
+				return { 
+					fontFamily: fontFamily || f.fontFamily, 
+					fontSize: fontSize || f.fontSize, 
+					fontStyle: fontStyle || f.fontStyle, 
+					fontWeight: fontWeight || f.fontWeight, 
+					fontVariant: fontVariant || f.fontVariant,
+					toString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') } 
+				} 
+			}
+			
+			var that = this;
+			this.Parse = function(s) {
+				var f = {};
+				var d = svg.trim(svg.compressSpaces(s || '')).split(' ');
+				var set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false }
+				var ff = '';
+				for (var i=0; i<d.length; i++) {
+					if (!set.fontStyle && that.Styles.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontStyle = d[i]; set.fontStyle = true; }
+					else if (!set.fontVariant && that.Variants.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontVariant = d[i]; set.fontStyle = set.fontVariant = true;	}
+					else if (!set.fontWeight && that.Weights.indexOf(d[i]) != -1) {	if (d[i] != 'inherit') f.fontWeight = d[i]; set.fontStyle = set.fontVariant = set.fontWeight = true; }
+					else if (!set.fontSize) { if (d[i] != 'inherit') f.fontSize = d[i].split('/')[0]; set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; }
+					else { if (d[i] != 'inherit') ff += d[i]; }
+				} if (ff != '') f.fontFamily = ff;
+				return f;
+			}
+		});
+		
+		// points and paths
+		svg.ToNumberArray = function(s) {
+			var a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' ');
+			for (var i=0; i<a.length; i++) {
+				a[i] = parseFloat(a[i]);
+			}
+			return a;
+		}		
+		svg.Point = function(x, y) {
+			this.x = x;
+			this.y = y;
+			
+			this.angleTo = function(p) {
+				return Math.atan2(p.y - this.y, p.x - this.x);
+			}
+			
+			this.applyTransform = function(v) {
+				var xp = this.x * v[0] + this.y * v[2] + v[4];
+				var yp = this.x * v[1] + this.y * v[3] + v[5];
+				this.x = xp;
+				this.y = yp;
+			}
+		}
+		svg.CreatePoint = function(s) {
+			var a = svg.ToNumberArray(s);
+			return new svg.Point(a[0], a[1]);
+		}
+		svg.CreatePath = function(s) {
+			var a = svg.ToNumberArray(s);
+			var path = [];
+			for (var i=0; i<a.length; i+=2) {
+				path.push(new svg.Point(a[i], a[i+1]));
+			}
+			return path;
+		}
+		
+		// bounding box
+		svg.BoundingBox = function(x1, y1, x2, y2) { // pass in initial points if you want
+			this.x1 = Number.NaN;
+			this.y1 = Number.NaN;
+			this.x2 = Number.NaN;
+			this.y2 = Number.NaN;
+			
+			this.x = function() { return this.x1; }
+			this.y = function() { return this.y1; }
+			this.width = function() { return this.x2 - this.x1; }
+			this.height = function() { return this.y2 - this.y1; }
+			
+			this.addPoint = function(x, y) {	
+				if (x != null) {
+					if (isNaN(this.x1) || isNaN(this.x2)) {
+						this.x1 = x;
+						this.x2 = x;
+					}
+					if (x < this.x1) this.x1 = x;
+					if (x > this.x2) this.x2 = x;
+				}
+			
+				if (y != null) {
+					if (isNaN(this.y1) || isNaN(this.y2)) {
+						this.y1 = y;
+						this.y2 = y;
+					}
+					if (y < this.y1) this.y1 = y;
+					if (y > this.y2) this.y2 = y;
+				}
+			}			
+			this.addX = function(x) { this.addPoint(x, null); }
+			this.addY = function(y) { this.addPoint(null, y); }
+			
+			this.addBoundingBox = function(bb) {
+				this.addPoint(bb.x1, bb.y1);
+				this.addPoint(bb.x2, bb.y2);
+			}
+			
+			this.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) {
+				var cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)
+				var cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)
+				var cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)
+				var cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)
+				this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y,	cp2y, p2x, p2y);
+			}
+			
+			this.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {
+				// from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html
+				var p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y];
+				this.addPoint(p0[0], p0[1]);
+				this.addPoint(p3[0], p3[1]);
+				
+				for (i=0; i<=1; i++) {
+					var f = function(t) { 
+						return Math.pow(1-t, 3) * p0[i]
+						+ 3 * Math.pow(1-t, 2) * t * p1[i]
+						+ 3 * (1-t) * Math.pow(t, 2) * p2[i]
+						+ Math.pow(t, 3) * p3[i];
+					}
+					
+					var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];
+					var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];
+					var c = 3 * p1[i] - 3 * p0[i];
+					
+					if (a == 0) {
+						if (b == 0) continue;
+						var t = -c / b;
+						if (0 < t && t < 1) {
+							if (i == 0) this.addX(f(t));
+							if (i == 1) this.addY(f(t));
+						}
+						continue;
+					}
+					
+					var b2ac = Math.pow(b, 2) - 4 * c * a;
+					if (b2ac < 0) continue;
+					var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);
+					if (0 < t1 && t1 < 1) {
+						if (i == 0) this.addX(f(t1));
+						if (i == 1) this.addY(f(t1));
+					}
+					var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);
+					if (0 < t2 && t2 < 1) {
+						if (i == 0) this.addX(f(t2));
+						if (i == 1) this.addY(f(t2));
+					}
+				}
+			}
+			
+			this.isPointInBox = function(x, y) {
+				return (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2);
+			}
+			
+			this.addPoint(x1, y1);
+			this.addPoint(x2, y2);
+		}
+		
+		// transforms
+		svg.Transform = function(v) {	
+			var that = this;
+			this.Type = {}
+		
+			// translate
+			this.Type.translate = function(s) {
+				this.p = svg.CreatePoint(s);			
+				this.apply = function(ctx) {
+					ctx.translate(this.p.x || 0.0, this.p.y || 0.0);
+				}
+				this.applyToPoint = function(p) {
+					p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);
+				}
+			}
+			
+			// rotate
+			this.Type.rotate = function(s) {
+				var a = svg.ToNumberArray(s);
+				this.angle = new svg.Property('angle', a[0]);
+				this.cx = a[1] || 0;
+				this.cy = a[2] || 0;
+				this.apply = function(ctx) {
+					ctx.translate(this.cx, this.cy);
+					ctx.rotate(this.angle.Angle.toRadians());
+					ctx.translate(-this.cx, -this.cy);
+				}
+				this.applyToPoint = function(p) {
+					var a = this.angle.Angle.toRadians();
+					p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);
+					p.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);
+					p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]);
+				}			
+			}
+			
+			this.Type.scale = function(s) {
+				this.p = svg.CreatePoint(s);
+				this.apply = function(ctx) {
+					ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0);
+				}
+				this.applyToPoint = function(p) {
+					p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]);
+				}				
+			}
+			
+			this.Type.matrix = function(s) {
+				this.m = svg.ToNumberArray(s);
+				this.apply = function(ctx) {
+					ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]);
+				}
+				this.applyToPoint = function(p) {
+					p.applyTransform(this.m);
+				}					
+			}
+			
+			this.Type.SkewBase = function(s) {
+				this.base = that.Type.matrix;
+				this.base(s);
+				this.angle = new svg.Property('angle', s);
+			}
+			this.Type.SkewBase.prototype = new this.Type.matrix;
+			
+			this.Type.skewX = function(s) {
+				this.base = that.Type.SkewBase;
+				this.base(s);
+				this.m = [1, 0, Math.tan(this.angle.Angle.toRadians()), 1, 0, 0];
+			}
+			this.Type.skewX.prototype = new this.Type.SkewBase;
+			
+			this.Type.skewY = function(s) {
+				this.base = that.Type.SkewBase;
+				this.base(s);
+				this.m = [1, Math.tan(this.angle.Angle.toRadians()), 0, 1, 0, 0];
+			}
+			this.Type.skewY.prototype = new this.Type.SkewBase;
+		
+			this.transforms = [];
+			
+			this.apply = function(ctx) {
+				for (var i=0; i<this.transforms.length; i++) {
+					this.transforms[i].apply(ctx);
+				}
+			}
+			
+			this.applyToPoint = function(p) {
+				for (var i=0; i<this.transforms.length; i++) {
+					this.transforms[i].applyToPoint(p);
+				}
+			}
+			
+			var data = svg.trim(svg.compressSpaces(v)).split(/\s(?=[a-z])/);
+			for (var i=0; i<data.length; i++) {
+				var type = data[i].split('(')[0];
+				var s = data[i].split('(')[1].replace(')','');
+				var transform = new this.Type[type](s);
+				this.transforms.push(transform);
+			}
+		}
+		
+		// aspect ratio
+		svg.AspectRatio = function(ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) {
+			// aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute
+			aspectRatio = svg.compressSpaces(aspectRatio);
+			aspectRatio = aspectRatio.replace(/^defer\s/,''); // ignore defer
+			var align = aspectRatio.split(' ')[0] || 'xMidYMid';
+			var meetOrSlice = aspectRatio.split(' ')[1] || 'meet';					
+	
+			// calculate scale
+			var scaleX = width / desiredWidth;
+			var scaleY = height / desiredHeight;
+			var scaleMin = Math.min(scaleX, scaleY);
+			var scaleMax = Math.max(scaleX, scaleY);
+			if (meetOrSlice == 'meet') { desiredWidth *= scaleMin; desiredHeight *= scaleMin; }
+			if (meetOrSlice == 'slice') { desiredWidth *= scaleMax; desiredHeight *= scaleMax; }	
+			
+			refX = new svg.Property('refX', refX);
+			refY = new svg.Property('refY', refY);
+			if (refX.hasValue() && refY.hasValue()) {				
+				ctx.translate(-scaleMin * refX.Length.toPixels('x'), -scaleMin * refY.Length.toPixels('y'));
+			} 
+			else {					
+				// align
+				if (align.match(/^xMid/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width / 2.0 - desiredWidth / 2.0, 0); 
+				if (align.match(/YMid$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height / 2.0 - desiredHeight / 2.0); 
+				if (align.match(/^xMax/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width - desiredWidth, 0); 
+				if (align.match(/YMax$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height - desiredHeight); 
+			}
+			
+			// scale
+			if (align == 'none') ctx.scale(scaleX, scaleY);
+			else if (meetOrSlice == 'meet') ctx.scale(scaleMin, scaleMin); 
+			else if (meetOrSlice == 'slice') ctx.scale(scaleMax, scaleMax); 	
+			
+			// translate
+			ctx.translate(minX == null ? 0 : -minX, minY == null ? 0 : -minY);			
+		}
+		
+		// elements
+		svg.Element = {}
+		
+		svg.Element.ElementBase = function(node) {	
+			this.attributes = {};
+			this.styles = {};
+			this.children = [];
+			
+			// get or create attribute
+			this.attribute = function(name, createIfNotExists) {
+				var a = this.attributes[name];
+				if (a != null) return a;
+							
+				a = new svg.Property(name, '');
+				if (createIfNotExists == true) this.attributes[name] = a;
+				return a;
+			}
+			
+			// get or create style, crawls up node tree
+			this.style = function(name, createIfNotExists) {
+				var s = this.styles[name];
+				if (s != null) return s;
+				
+				var a = this.attribute(name);
+				if (a != null && a.hasValue()) {
+					return a;
+				}
+				
+				var p = this.parent;
+				if (p != null) {
+					var ps = p.style(name);
+					if (ps != null && ps.hasValue()) {
+						return ps;
+					}
+				}
+					
+				s = new svg.Property(name, '');
+				if (createIfNotExists == true) this.styles[name] = s;
+				return s;
+			}
+			
+			// base render
+			this.render = function(ctx) {
+				// don't render display=none
+				if (this.style('display').value == 'none') return;
+				
+				// don't render visibility=hidden
+				if (this.attribute('visibility').value == 'hidden') return;
+			
+				ctx.save();
+					this.setContext(ctx);
+						// mask
+						if (this.attribute('mask').hasValue()) {
+							var mask = this.attribute('mask').Definition.getDefinition();
+							if (mask != null) mask.apply(ctx, this);
+						}
+						else if (this.style('filter').hasValue()) {
+							var filter = this.style('filter').Definition.getDefinition();
+							if (filter != null) filter.apply(ctx, this);
+						}
+						else this.renderChildren(ctx);				
+					this.clearContext(ctx);
+				ctx.restore();
+			}
+			
+			// base set context
+			this.setContext = function(ctx) {
+				// OVERRIDE ME!
+			}
+			
+			// base clear context
+			this.clearContext = function(ctx) {
+				// OVERRIDE ME!
+			}			
+			
+			// base render children
+			this.renderChildren = function(ctx) {
+				for (var i=0; i<this.children.length; i++) {
+					this.children[i].render(ctx);
+				}
+			}
+			
+			this.addChild = function(childNode, create) {
+				var child = childNode;
+				if (create) child = svg.CreateElement(childNode);
+				child.parent = this;
+				this.children.push(child);			
+			}
+				
+			if (node != null && node.nodeType == 1) { //ELEMENT_NODE
+				// add children
+				for (var i=0; i<node.childNodes.length; i++) {
+					var childNode = node.childNodes[i];
+					if (childNode.nodeType == 1) this.addChild(childNode, true); //ELEMENT_NODE
+				}
+				
+				// add attributes
+				for (var i=0; i<node.attributes.length; i++) {
+					var attribute = node.attributes[i];
+					this.attributes[attribute.nodeName] = new svg.Property(attribute.nodeName, attribute.nodeValue);
+				}
+										
+				// add tag styles
+				var styles = svg.Styles[node.nodeName];
+				if (styles != null) {
+					for (var name in styles) {
+						this.styles[name] = styles[name];
+					}
+				}					
+				
+				// add class styles
+				if (this.attribute('class').hasValue()) {
+					var classes = svg.compressSpaces(this.attribute('class').value).split(' ');
+					for (var j=0; j<classes.length; j++) {
+						styles = svg.Styles['.'+classes[j]];
+						if (styles != null) {
+							for (var name in styles) {
+								this.styles[name] = styles[name];
+							}
+						}
+						styles = svg.Styles[node.nodeName+'.'+classes[j]];
+						if (styles != null) {
+							for (var name in styles) {
+								this.styles[name] = styles[name];
+							}
+						}
+					}
+				}
+				
+				// add inline styles
+				if (this.attribute('style').hasValue()) {
+					var styles = this.attribute('style').value.split(';');
+					for (var i=0; i<styles.length; i++) {
+						if (svg.trim(styles[i]) != '') {
+							var style = styles[i].split(':');
+							var name = svg.trim(style[0]);
+							var value = svg.trim(style[1]);
+							this.styles[name] = new svg.Property(name, value);
+						}
+					}
+				}	
+
+				// add id
+				if (this.attribute('id').hasValue()) {
+					if (svg.Definitions[this.attribute('id').value] == null) {
+						svg.Definitions[this.attribute('id').value] = this;
+					}
+				}
+			}
+		}
+		
+		svg.Element.RenderedElementBase = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.setContext = function(ctx) {
+				// fill
+				if (this.style('fill').Definition.isUrl()) {
+					var fs = this.style('fill').Definition.getFillStyle(this);
+					if (fs != null) ctx.fillStyle = fs;
+				}
+				else if (this.style('fill').hasValue()) {
+					var fillStyle = this.style('fill');
+					if (this.style('fill-opacity').hasValue()) fillStyle = fillStyle.Color.addOpacity(this.style('fill-opacity').value);
+					ctx.fillStyle = (fillStyle.value == 'none' ? 'rgba(0,0,0,0)' : fillStyle.value);
+				}
+									
+				// stroke
+				if (this.style('stroke').Definition.isUrl()) {
+					var fs = this.style('stroke').Definition.getFillStyle(this);
+					if (fs != null) ctx.strokeStyle = fs;
+				}
+				else if (this.style('stroke').hasValue()) {
+					var strokeStyle = this.style('stroke');
+					if (this.style('stroke-opacity').hasValue()) strokeStyle = strokeStyle.Color.addOpacity(this.style('stroke-opacity').value);
+					ctx.strokeStyle = (strokeStyle.value == 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value);
+				}
+				if (this.style('stroke-width').hasValue()) ctx.lineWidth = this.style('stroke-width').Length.toPixels();
+				if (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value;
+				if (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value;
+				if (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value;
+
+				// font
+				if (typeof(ctx.font) != 'undefined') {
+					ctx.font = svg.Font.CreateFont( 
+						this.style('font-style').value, 
+						this.style('font-variant').value, 
+						this.style('font-weight').value, 
+						this.style('font-size').hasValue() ? this.style('font-size').Length.toPixels() + 'px' : '', 
+						this.style('font-family').value).toString();
+				}
+				
+				// transform
+				if (this.attribute('transform').hasValue()) { 
+					var transform = new svg.Transform(this.attribute('transform').value);
+					transform.apply(ctx);
+				}
+				
+				// clip
+				if (this.attribute('clip-path').hasValue()) {
+					var clip = this.attribute('clip-path').Definition.getDefinition();
+					if (clip != null) clip.apply(ctx);
+				}
+				
+				// opacity
+				if (this.style('opacity').hasValue()) {
+					ctx.globalAlpha = this.style('opacity').numValue();
+				}
+			}		
+		}
+		svg.Element.RenderedElementBase.prototype = new svg.Element.ElementBase;
+		
+		svg.Element.PathElementBase = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				if (ctx != null) ctx.beginPath();
+				return new svg.BoundingBox();
+			}
+			
+			this.renderChildren = function(ctx) {
+				this.path(ctx);
+				svg.Mouse.checkPath(this, ctx);
+				if (ctx.fillStyle != '') ctx.fill();
+				if (ctx.strokeStyle != '') ctx.stroke();
+				
+				var markers = this.getMarkers();
+				if (markers != null) {
+					if (this.style('marker-start').Definition.isUrl()) {
+						var marker = this.style('marker-start').Definition.getDefinition();
+						marker.render(ctx, markers[0][0], markers[0][1]);
+					}
+					if (this.style('marker-mid').Definition.isUrl()) {
+						var marker = this.style('marker-mid').Definition.getDefinition();
+						for (var i=1;i<markers.length-1;i++) {
+							marker.render(ctx, markers[i][0], markers[i][1]);
+						}
+					}
+					if (this.style('marker-end').Definition.isUrl()) {
+						var marker = this.style('marker-end').Definition.getDefinition();
+						marker.render(ctx, markers[markers.length-1][0], markers[markers.length-1][1]);
+					}
+				}					
+			}
+			
+			this.getBoundingBox = function() {
+				return this.path();
+			}
+			
+			this.getMarkers = function() {
+				return null;
+			}
+		}
+		svg.Element.PathElementBase.prototype = new svg.Element.RenderedElementBase;
+		
+		// svg element
+		svg.Element.svg = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.baseClearContext = this.clearContext;
+			this.clearContext = function(ctx) {
+				this.baseClearContext(ctx);
+				svg.ViewPort.RemoveCurrent();
+			}
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {
+				// initial values
+				ctx.strokeStyle = 'rgba(0,0,0,0)';
+				ctx.lineCap = 'butt';
+				ctx.lineJoin = 'miter';
+				ctx.miterLimit = 4;			
+			
+				this.baseSetContext(ctx);
+				
+				// create new view port
+				if (this.attribute('x').hasValue() && this.attribute('y').hasValue()) {
+					ctx.translate(this.attribute('x').Length.toPixels('x'), this.attribute('y').Length.toPixels('y'));
+				}
+				
+				var width = svg.ViewPort.width();
+				var height = svg.ViewPort.height();
+				if (typeof(this.root) == 'undefined' && this.attribute('width').hasValue() && this.attribute('height').hasValue()) {
+					width = this.attribute('width').Length.toPixels('x');
+					height = this.attribute('height').Length.toPixels('y');
+					
+					var x = 0;
+					var y = 0;
+					if (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) {
+						x = -this.attribute('refX').Length.toPixels('x');
+						y = -this.attribute('refY').Length.toPixels('y');
+					}
+					
+					ctx.beginPath();
+					ctx.moveTo(x, y);
+					ctx.lineTo(width, y);
+					ctx.lineTo(width, height);
+					ctx.lineTo(x, height);
+					ctx.closePath();
+					ctx.clip();
+				}
+				svg.ViewPort.SetCurrent(width, height);	
+						
+				// viewbox
+				if (this.attribute('viewBox').hasValue()) {				
+					var viewBox = svg.ToNumberArray(this.attribute('viewBox').value);
+					var minX = viewBox[0];
+					var minY = viewBox[1];
+					width = viewBox[2];
+					height = viewBox[3];
+					
+					svg.AspectRatio(ctx,
+									this.attribute('preserveAspectRatio').value, 
+									svg.ViewPort.width(), 
+									width,
+									svg.ViewPort.height(),
+									height,
+									minX,
+									minY,
+									this.attribute('refX').value,
+									this.attribute('refY').value);
+										
+					svg.ViewPort.RemoveCurrent();	
+					svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);						
+				}				
+			}
+		}
+		svg.Element.svg.prototype = new svg.Element.RenderedElementBase;
+
+		// rect element
+		svg.Element.rect = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');
+				var rx = this.attribute('rx').Length.toPixels('x');
+				var ry = this.attribute('ry').Length.toPixels('y');
+				if (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx;
+				if (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry;
+				
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(x + rx, y);
+					ctx.lineTo(x + width - rx, y);
+					ctx.quadraticCurveTo(x + width, y, x + width, y + ry)
+					ctx.lineTo(x + width, y + height - ry);
+					ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height)
+					ctx.lineTo(x + rx, y + height);
+					ctx.quadraticCurveTo(x, y + height, x, y + height - ry)
+					ctx.lineTo(x, y + ry);
+					ctx.quadraticCurveTo(x, y, x + rx, y)
+					ctx.closePath();
+				}
+				
+				return new svg.BoundingBox(x, y, x + width, y + height);
+			}
+		}
+		svg.Element.rect.prototype = new svg.Element.PathElementBase;
+		
+		// circle element
+		svg.Element.circle = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				var cx = this.attribute('cx').Length.toPixels('x');
+				var cy = this.attribute('cy').Length.toPixels('y');
+				var r = this.attribute('r').Length.toPixels();
+			
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.arc(cx, cy, r, 0, Math.PI * 2, true); 
+					ctx.closePath();
+				}
+				
+				return new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r);
+			}
+		}
+		svg.Element.circle.prototype = new svg.Element.PathElementBase;	
+
+		// ellipse element
+		svg.Element.ellipse = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.path = function(ctx) {
+				var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);
+				var rx = this.attribute('rx').Length.toPixels('x');
+				var ry = this.attribute('ry').Length.toPixels('y');
+				var cx = this.attribute('cx').Length.toPixels('x');
+				var cy = this.attribute('cy').Length.toPixels('y');
+				
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(cx, cy - ry);
+					ctx.bezierCurveTo(cx + (KAPPA * rx), cy - ry,  cx + rx, cy - (KAPPA * ry), cx + rx, cy);
+					ctx.bezierCurveTo(cx + rx, cy + (KAPPA * ry), cx + (KAPPA * rx), cy + ry, cx, cy + ry);
+					ctx.bezierCurveTo(cx - (KAPPA * rx), cy + ry, cx - rx, cy + (KAPPA * ry), cx - rx, cy);
+					ctx.bezierCurveTo(cx - rx, cy - (KAPPA * ry), cx - (KAPPA * rx), cy - ry, cx, cy - ry);
+					ctx.closePath();
+				}
+				
+				return new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);
+			}
+		}
+		svg.Element.ellipse.prototype = new svg.Element.PathElementBase;			
+		
+		// line element
+		svg.Element.line = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.getPoints = function() {
+				return [
+					new svg.Point(this.attribute('x1').Length.toPixels('x'), this.attribute('y1').Length.toPixels('y')),
+					new svg.Point(this.attribute('x2').Length.toPixels('x'), this.attribute('y2').Length.toPixels('y'))];
+			}
+								
+			this.path = function(ctx) {
+				var points = this.getPoints();
+				
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(points[0].x, points[0].y);
+					ctx.lineTo(points[1].x, points[1].y);
+				}
+				
+				return new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y);
+			}
+			
+			this.getMarkers = function() {
+				var points = this.getPoints();	
+				var a = points[0].angleTo(points[1]);
+				return [[points[0], a], [points[1], a]];
+			}
+		}
+		svg.Element.line.prototype = new svg.Element.PathElementBase;		
+				
+		// polyline element
+		svg.Element.polyline = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+			
+			this.points = svg.CreatePath(this.attribute('points').value);
+			this.path = function(ctx) {
+				var bb = new svg.BoundingBox(this.points[0].x, this.points[0].y);
+				if (ctx != null) {
+					ctx.beginPath();
+					ctx.moveTo(this.points[0].x, this.points[0].y);
+				}
+				for (var i=1; i<this.points.length; i++) {
+					bb.addPoint(this.points[i].x, this.points[i].y);
+					if (ctx != null) ctx.lineTo(this.points[i].x, this.points[i].y);
+				}
+				return bb;
+			}
+			
+			this.getMarkers = function() {
+				var markers = [];
+				for (var i=0; i<this.points.length - 1; i++) {
+					markers.push([this.points[i], this.points[i].angleTo(this.points[i+1])]);
+				}
+				markers.push([this.points[this.points.length-1], markers[markers.length-1][1]]);
+				return markers;
+			}			
+		}
+		svg.Element.polyline.prototype = new svg.Element.PathElementBase;				
+				
+		// polygon element
+		svg.Element.polygon = function(node) {
+			this.base = svg.Element.polyline;
+			this.base(node);
+			
+			this.basePath = this.path;
+			this.path = function(ctx) {
+				var bb = this.basePath(ctx);
+				if (ctx != null) {
+					ctx.lineTo(this.points[0].x, this.points[0].y);
+					ctx.closePath();
+				}
+				return bb;
+			}
+		}
+		svg.Element.polygon.prototype = new svg.Element.polyline;
+
+		// path element
+		svg.Element.path = function(node) {
+			this.base = svg.Element.PathElementBase;
+			this.base(node);
+					
+			var d = this.attribute('d').value;
+			// TODO: convert to real lexer based on http://www.w3.org/TR/SVG11/paths.html#PathDataBNF
+			d = d.replace(/,/gm,' '); // get rid of all commas
+			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from commands
+			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from commands
+			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,'$1 $2'); // separate commands from points
+			d = d.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from points
+			d = d.replace(/([0-9])([+\-])/gm,'$1 $2'); // separate digits when no comma
+			d = d.replace(/(\.[0-9]*)(\.)/gm,'$1 $2'); // separate digits when no comma
+			d = d.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,'$1 $3 $4 '); // shorthand elliptical arc path syntax
+			d = svg.compressSpaces(d); // compress multiple spaces
+			d = svg.trim(d);
+			this.PathParser = new (function(d) {
+				this.tokens = d.split(' ');
+				
+				this.reset = function() {
+					this.i = -1;
+					this.command = '';
+					this.previousCommand = '';
+					this.start = new svg.Point(0, 0);
+					this.control = new svg.Point(0, 0);
+					this.current = new svg.Point(0, 0);
+					this.points = [];
+					this.angles = [];
+				}
+								
+				this.isEnd = function() {
+					return this.i >= this.tokens.length - 1;
+				}
+				
+				this.isCommandOrEnd = function() {
+					if (this.isEnd()) return true;
+					return this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null;
+				}
+				
+				this.isRelativeCommand = function() {
+					return this.command == this.command.toLowerCase();
+				}
+							
+				this.getToken = function() {
+					this.i = this.i + 1;
+					return this.tokens[this.i];
+				}
+				
+				this.getScalar = function() {
+					return parseFloat(this.getToken());
+				}
+				
+				this.nextCommand = function() {
+					this.previousCommand = this.command;
+					this.command = this.getToken();
+				}				
+				
+				this.getPoint = function() {
+					var p = new svg.Point(this.getScalar(), this.getScalar());
+					return this.makeAbsolute(p);
+				}
+				
+				this.getAsControlPoint = function() {
+					var p = this.getPoint();
+					this.control = p;
+					return p;
+				}
+				
+				this.getAsCurrentPoint = function() {
+					var p = this.getPoint();
+					this.current = p;
+					return p;	
+				}
+				
+				this.getReflectedControlPoint = function() {
+					if (this.previousCommand.toLowerCase() != 'c' && this.previousCommand.toLowerCase() != 's') {
+						return this.current;
+					}
+					
+					// reflect point
+					var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y);					
+					return p;
+				}
+				
+				this.makeAbsolute = function(p) {
+					if (this.isRelativeCommand()) {
+						p.x = this.current.x + p.x;
+						p.y = this.current.y + p.y;
+					}
+					return p;
+				}
+				
+				this.addMarker = function(p, from, priorTo) {
+					// if the last angle isn't filled in because we didn't have this point yet ...
+					if (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) {
+						this.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo);
+					}
+					this.addMarkerAngle(p, from == null ? null : from.angleTo(p));
+				}
+				
+				this.addMarkerAngle = function(p, a) {
+					this.points.push(p);
+					this.angles.push(a);
+				}				
+				
+				this.getMarkerPoints = function() { return this.points; }
+				this.getMarkerAngles = function() {
+					for (var i=0; i<this.angles.length; i++) {
+						if (this.angles[i] == null) {
+							for (var j=i+1; j<this.angles.length; j++) {
+								if (this.angles[j] != null) {
+									this.angles[i] = this.angles[j];
+									break;
+								}
+							}
+						}
+					}
+					return this.angles;
+				}
+			})(d);
+
+			this.path = function(ctx) {
+				var pp = this.PathParser;
+				pp.reset();
+
+				var bb = new svg.BoundingBox();
+				if (ctx != null) ctx.beginPath();
+				while (!pp.isEnd()) {
+					pp.nextCommand();
+					switch (pp.command.toUpperCase()) {
+					case 'M':
+						var p = pp.getAsCurrentPoint();
+						pp.addMarker(p);
+						bb.addPoint(p.x, p.y);
+						if (ctx != null) ctx.moveTo(p.x, p.y);
+						pp.start = pp.current;
+						while (!pp.isCommandOrEnd()) {
+							var p = pp.getAsCurrentPoint();
+							pp.addMarker(p, pp.start);
+							bb.addPoint(p.x, p.y);
+							if (ctx != null) ctx.lineTo(p.x, p.y);
+						}
+						break;
+					case 'L':
+						while (!pp.isCommandOrEnd()) {
+							var c = pp.current;
+							var p = pp.getAsCurrentPoint();
+							pp.addMarker(p, c);
+							bb.addPoint(p.x, p.y);
+							if (ctx != null) ctx.lineTo(p.x, p.y);
+						}
+						break;
+					case 'H':
+						while (!pp.isCommandOrEnd()) {
+							var newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y);
+							pp.addMarker(newP, pp.current);
+							pp.current = newP;
+							bb.addPoint(pp.current.x, pp.current.y);
+							if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);
+						}
+						break;
+					case 'V':
+						while (!pp.isCommandOrEnd()) {
+							var newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar());
+							pp.addMarker(newP, pp.current);
+							pp.current = newP;
+							bb.addPoint(pp.current.x, pp.current.y);
+							if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);
+						}
+						break;
+					case 'C':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var p1 = pp.getPoint();
+							var cntrl = pp.getAsControlPoint();
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, p1);
+							bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'S':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var p1 = pp.getReflectedControlPoint();
+							var cntrl = pp.getAsControlPoint();
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, p1);
+							bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'Q':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var cntrl = pp.getAsControlPoint();
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, cntrl);
+							bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'T':
+						while (!pp.isCommandOrEnd()) {
+							var curr = pp.current;
+							var cntrl = pp.getReflectedControlPoint();
+							pp.control = cntrl;
+							var cp = pp.getAsCurrentPoint();
+							pp.addMarker(cp, cntrl, cntrl);
+							bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);
+							if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);
+						}
+						break;
+					case 'A':
+						while (!pp.isCommandOrEnd()) {
+						    var curr = pp.current;
+							var rx = pp.getScalar();
+							var ry = pp.getScalar();
+							var xAxisRotation = pp.getScalar() * (Math.PI / 180.0);
+							var largeArcFlag = pp.getScalar();
+							var sweepFlag = pp.getScalar();
+							var cp = pp.getAsCurrentPoint();
+
+							// Conversion from endpoint to center parameterization
+							// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
+							// x1', y1'
+							var currp = new svg.Point(
+								Math.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0,
+								-Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0
+							);
+							// adjust radii
+							var l = Math.pow(currp.x,2)/Math.pow(rx,2)+Math.pow(currp.y,2)/Math.pow(ry,2);
+							if (l > 1) {
+								rx *= Math.sqrt(l);
+								ry *= Math.sqrt(l);
+							}
+							// cx', cy'
+							var s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt(
+								((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) /
+								(Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2))
+							);
+							if (isNaN(s)) s = 0;
+							var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);
+							// cx, cy
+							var centp = new svg.Point(
+								(curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y,
+								(curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y
+							);
+							// vector magnitude
+							var m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); }
+							// ratio between two vectors
+							var r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) }
+							// angle between two vectors
+							var a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); }
+							// initial angle
+							var a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]);
+							// angle delta
+							var u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry];
+							var v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry];
+							var ad = a(u, v);
+							if (r(u,v) <= -1) ad = Math.PI;
+							if (r(u,v) >= 1) ad = 0;
+
+							if (sweepFlag == 0 && ad > 0) ad = ad - 2 * Math.PI;
+							if (sweepFlag == 1 && ad < 0) ad = ad + 2 * Math.PI;
+
+							// for markers
+							var halfWay = new svg.Point(
+								centp.x - rx * Math.cos((a1 + ad) / 2),
+								centp.y - ry * Math.sin((a1 + ad) / 2)
+							);
+							pp.addMarkerAngle(halfWay, (a1 + ad) / 2 + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2);
+							pp.addMarkerAngle(cp, ad + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2);
+
+							bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better
+							if (ctx != null) {
+								var r = rx > ry ? rx : ry;
+								var sx = rx > ry ? 1 : rx / ry;
+								var sy = rx > ry ? ry / rx : 1;
+
+								ctx.translate(centp.x, centp.y);
+								ctx.rotate(xAxisRotation);
+								ctx.scale(sx, sy);
+								ctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag);
+								ctx.scale(1/sx, 1/sy);
+								ctx.rotate(-xAxisRotation);
+								ctx.translate(-centp.x, -centp.y);
+							}
+						}
+						break;
+					case 'Z':
+						if (ctx != null) ctx.closePath();
+						pp.current = pp.start;
+					}
+				}
+
+				return bb;
+			}
+
+			this.getMarkers = function() {
+				var points = this.PathParser.getMarkerPoints();
+				var angles = this.PathParser.getMarkerAngles();
+				
+				var markers = [];
+				for (var i=0; i<points.length; i++) {
+					markers.push([points[i], angles[i]]);
+				}
+				return markers;
+			}
+		}
+		svg.Element.path.prototype = new svg.Element.PathElementBase;
+		
+		// pattern element
+		svg.Element.pattern = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.createPattern = function(ctx, element) {
+				// render me using a temporary svg element
+				var tempSvg = new svg.Element.svg();
+				tempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);
+				tempSvg.attributes['x'] = new svg.Property('x', this.attribute('x').value);
+				tempSvg.attributes['y'] = new svg.Property('y', this.attribute('y').value);
+				tempSvg.attributes['width'] = new svg.Property('width', this.attribute('width').value);
+				tempSvg.attributes['height'] = new svg.Property('height', this.attribute('height').value);
+				tempSvg.children = this.children;
+				
+				var c = document.createElement('canvas');
+				c.width = this.attribute('width').Length.toPixels('x');
+				c.height = this.attribute('height').Length.toPixels('y');
+				tempSvg.render(c.getContext('2d'));		
+				return ctx.createPattern(c, 'repeat');
+			}
+		}
+		svg.Element.pattern.prototype = new svg.Element.ElementBase;
+		
+		// marker element
+		svg.Element.marker = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.baseRender = this.render;
+			this.render = function(ctx, point, angle) {
+				ctx.translate(point.x, point.y);
+				if (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(angle);
+				if (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth);
+				ctx.save();
+							
+				// render me using a temporary svg element
+				var tempSvg = new svg.Element.svg();
+				tempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);
+				tempSvg.attributes['refX'] = new svg.Property('refX', this.attribute('refX').value);
+				tempSvg.attributes['refY'] = new svg.Property('refY', this.attribute('refY').value);
+				tempSvg.attributes['width'] = new svg.Property('width', this.attribute('markerWidth').value);
+				tempSvg.attributes['height'] = new svg.Property('height', this.attribute('markerHeight').value);
+				tempSvg.attributes['fill'] = new svg.Property('fill', this.attribute('fill').valueOrDefault('black'));
+				tempSvg.attributes['stroke'] = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none'));
+				tempSvg.children = this.children;
+				tempSvg.render(ctx);
+				
+				ctx.restore();
+				if (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(1/ctx.lineWidth, 1/ctx.lineWidth);
+				if (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(-angle);
+				ctx.translate(-point.x, -point.y);
+			}
+		}
+		svg.Element.marker.prototype = new svg.Element.ElementBase;
+		
+		// definitions element
+		svg.Element.defs = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);	
+			
+			this.render = function(ctx) {
+				// NOOP
+			}
+		}
+		svg.Element.defs.prototype = new svg.Element.ElementBase;
+		
+		// base for gradients
+		svg.Element.GradientBase = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.gradientUnits = this.attribute('gradientUnits').valueOrDefault('objectBoundingBox');
+			
+			this.stops = [];			
+			for (var i=0; i<this.children.length; i++) {
+				var child = this.children[i];
+				this.stops.push(child);
+			}	
+			
+			this.getGradient = function() {
+				// OVERRIDE ME!
+			}			
+
+			this.createGradient = function(ctx, element) {
+				var stopsContainer = this;
+				if (this.attribute('xlink:href').hasValue()) {
+					stopsContainer = this.attribute('xlink:href').Definition.getDefinition();
+				}
+			
+				var g = this.getGradient(ctx, element);
+				for (var i=0; i<stopsContainer.stops.length; i++) {
+					g.addColorStop(stopsContainer.stops[i].offset, stopsContainer.stops[i].color);
+				}
+				
+				if (this.attribute('gradientTransform').hasValue()) {
+					// render as transformed pattern on temporary canvas
+					var rootView = svg.ViewPort.viewPorts[0];
+					
+					var rect = new svg.Element.rect();
+					rect.attributes['x'] = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS/3.0);
+					rect.attributes['y'] = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS/3.0);
+					rect.attributes['width'] = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS);
+					rect.attributes['height'] = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS);
+					
+					var group = new svg.Element.g();
+					group.attributes['transform'] = new svg.Property('transform', this.attribute('gradientTransform').value);
+					group.children = [ rect ];
+					
+					var tempSvg = new svg.Element.svg();
+					tempSvg.attributes['x'] = new svg.Property('x', 0);
+					tempSvg.attributes['y'] = new svg.Property('y', 0);
+					tempSvg.attributes['width'] = new svg.Property('width', rootView.width);
+					tempSvg.attributes['height'] = new svg.Property('height', rootView.height);
+					tempSvg.children = [ group ];
+					
+					var c = document.createElement('canvas');
+					c.width = rootView.width;
+					c.height = rootView.height;
+					var tempCtx = c.getContext('2d');
+					tempCtx.fillStyle = g;
+					tempSvg.render(tempCtx);		
+					return tempCtx.createPattern(c, 'no-repeat');
+				}
+				
+				return g;				
+			}
+		}
+		svg.Element.GradientBase.prototype = new svg.Element.ElementBase;
+		
+		// linear gradient element
+		svg.Element.linearGradient = function(node) {
+			this.base = svg.Element.GradientBase;
+			this.base(node);
+			
+			this.getGradient = function(ctx, element) {
+				var bb = element.getBoundingBox();
+				
+				var x1 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('x1').numValue() 
+					: this.attribute('x1').Length.toPixels('x'));
+				var y1 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('y1').numValue()
+					: this.attribute('y1').Length.toPixels('y'));
+				var x2 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('x2').numValue()
+					: this.attribute('x2').Length.toPixels('x'));
+				var y2 = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('y2').numValue()
+					: this.attribute('y2').Length.toPixels('y'));
+
+				return ctx.createLinearGradient(x1, y1, x2, y2);
+			}
+		}
+		svg.Element.linearGradient.prototype = new svg.Element.GradientBase;
+		
+		// radial gradient element
+		svg.Element.radialGradient = function(node) {
+			this.base = svg.Element.GradientBase;
+			this.base(node);
+			
+			this.getGradient = function(ctx, element) {
+				var bb = element.getBoundingBox();
+				
+				var cx = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('cx').numValue() 
+					: this.attribute('cx').Length.toPixels('x'));
+				var cy = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('cy').numValue() 
+					: this.attribute('cy').Length.toPixels('y'));
+				
+				var fx = cx;
+				var fy = cy;
+				if (this.attribute('fx').hasValue()) {
+					fx = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.x() + bb.width() * this.attribute('fx').numValue() 
+					: this.attribute('fx').Length.toPixels('x'));
+				}
+				if (this.attribute('fy').hasValue()) {
+					fy = (this.gradientUnits == 'objectBoundingBox' 
+					? bb.y() + bb.height() * this.attribute('fy').numValue() 
+					: this.attribute('fy').Length.toPixels('y'));
+				}
+				
+				var r = (this.gradientUnits == 'objectBoundingBox' 
+					? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue()
+					: this.attribute('r').Length.toPixels());
+				
+				return ctx.createRadialGradient(fx, fy, 0, cx, cy, r);
+			}
+		}
+		svg.Element.radialGradient.prototype = new svg.Element.GradientBase;
+		
+		// gradient stop element
+		svg.Element.stop = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.offset = this.attribute('offset').numValue();
+			
+			var stopColor = this.style('stop-color');
+			if (this.style('stop-opacity').hasValue()) stopColor = stopColor.Color.addOpacity(this.style('stop-opacity').value);
+			this.color = stopColor.value;
+		}
+		svg.Element.stop.prototype = new svg.Element.ElementBase;
+		
+		// animation base element
+		svg.Element.AnimateBase = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			svg.Animations.push(this);
+			
+			this.duration = 0.0;
+			this.begin = this.attribute('begin').Time.toMilliseconds();
+			this.maxDuration = this.begin + this.attribute('dur').Time.toMilliseconds();
+			
+			this.getProperty = function() {
+				var attributeType = this.attribute('attributeType').value;
+				var attributeName = this.attribute('attributeName').value;
+				
+				if (attributeType == 'CSS') {
+					return this.parent.style(attributeName, true);
+				}
+				return this.parent.attribute(attributeName, true);			
+			};
+			
+			this.initialValue = null;
+			this.removed = false;			
+
+			this.calcValue = function() {
+				// OVERRIDE ME!
+				return '';
+			}
+			
+			this.update = function(delta) {	
+				// set initial value
+				if (this.initialValue == null) {
+					this.initialValue = this.getProperty().value;
+				}
+			
+				// if we're past the end time
+				if (this.duration > this.maxDuration) {
+					// loop for indefinitely repeating animations
+					if (this.attribute('repeatCount').value == 'indefinite') {
+						this.duration = 0.0
+					}
+					else if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) {
+						this.removed = true;
+						this.getProperty().value = this.initialValue;
+						return true;
+					}
+					else {
+						return false; // no updates made
+					}
+				}			
+				this.duration = this.duration + delta;
+			
+				// if we're past the begin time
+				var updated = false;
+				if (this.begin < this.duration) {
+					var newValue = this.calcValue(); // tween
+					
+					if (this.attribute('type').hasValue()) {
+						// for transform, etc.
+						var type = this.attribute('type').value;
+						newValue = type + '(' + newValue + ')';
+					}
+					
+					this.getProperty().value = newValue;
+					updated = true;
+				}
+				
+				return updated;
+			}
+			
+			// fraction of duration we've covered
+			this.progress = function() {
+				return ((this.duration - this.begin) / (this.maxDuration - this.begin));
+			}			
+		}
+		svg.Element.AnimateBase.prototype = new svg.Element.ElementBase;
+		
+		// animate element
+		svg.Element.animate = function(node) {
+			this.base = svg.Element.AnimateBase;
+			this.base(node);
+			
+			this.calcValue = function() {
+				var from = this.attribute('from').numValue();
+				var to = this.attribute('to').numValue();
+				
+				// tween value linearly
+				return from + (to - from) * this.progress(); 
+			};
+		}
+		svg.Element.animate.prototype = new svg.Element.AnimateBase;
+			
+		// animate color element
+		svg.Element.animateColor = function(node) {
+			this.base = svg.Element.AnimateBase;
+			this.base(node);
+
+			this.calcValue = function() {
+				var from = new RGBColor(this.attribute('from').value);
+				var to = new RGBColor(this.attribute('to').value);
+				
+				if (from.ok && to.ok) {
+					// tween color linearly
+					var r = from.r + (to.r - from.r) * this.progress();
+					var g = from.g + (to.g - from.g) * this.progress();
+					var b = from.b + (to.b - from.b) * this.progress();
+					return 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')';
+				}
+				return this.attribute('from').value;
+			};
+		}
+		svg.Element.animateColor.prototype = new svg.Element.AnimateBase;
+		
+		// animate transform element
+		svg.Element.animateTransform = function(node) {
+			this.base = svg.Element.animate;
+			this.base(node);
+		}
+		svg.Element.animateTransform.prototype = new svg.Element.animate;
+		
+		// font element
+		svg.Element.font = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+
+			this.horizAdvX = this.attribute('horiz-adv-x').numValue();			
+			
+			this.isRTL = false;
+			this.isArabic = false;
+			this.fontFace = null;
+			this.missingGlyph = null;
+			this.glyphs = [];			
+			for (var i=0; i<this.children.length; i++) {
+				var child = this.children[i];
+				if (child.type == 'font-face') {
+					this.fontFace = child;
+					if (child.style('font-family').hasValue()) {
+						svg.Definitions[child.style('font-family').value] = this;
+					}
+				}
+				else if (child.type == 'missing-glyph') this.missingGlyph = child;
+				else if (child.type == 'glyph') {
+					if (child.arabicForm != '') {
+						this.isRTL = true;
+						this.isArabic = true;
+						if (typeof(this.glyphs[child.unicode]) == 'undefined') this.glyphs[child.unicode] = [];
+						this.glyphs[child.unicode][child.arabicForm] = child;
+					}
+					else {
+						this.glyphs[child.unicode] = child;
+					}
+				}
+			}	
+		}
+		svg.Element.font.prototype = new svg.Element.ElementBase;
+		
+		// font-face element
+		svg.Element.fontface = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);	
+			
+			this.ascent = this.attribute('ascent').value;
+			this.descent = this.attribute('descent').value;
+			this.unitsPerEm = this.attribute('units-per-em').numValue();				
+		}
+		svg.Element.fontface.prototype = new svg.Element.ElementBase;
+		
+		// missing-glyph element
+		svg.Element.missingglyph = function(node) {
+			this.base = svg.Element.path;
+			this.base(node);	
+			
+			this.horizAdvX = 0;
+		}
+		svg.Element.missingglyph.prototype = new svg.Element.path;
+		
+		// glyph element
+		svg.Element.glyph = function(node) {
+			this.base = svg.Element.path;
+			this.base(node);	
+			
+			this.horizAdvX = this.attribute('horiz-adv-x').numValue();
+			this.unicode = this.attribute('unicode').value;
+			this.arabicForm = this.attribute('arabic-form').value;
+		}
+		svg.Element.glyph.prototype = new svg.Element.path;
+		
+		// text element
+		svg.Element.text = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			if (node != null) {
+				// add children
+				this.children = [];
+				for (var i=0; i<node.childNodes.length; i++) {
+					var childNode = node.childNodes[i];
+					if (childNode.nodeType == 1) { // capture tspan and tref nodes
+						this.addChild(childNode, true);
+					}
+					else if (childNode.nodeType == 3) { // capture text
+						this.addChild(new svg.Element.tspan(childNode), false);
+					}
+				}
+			}
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {
+				this.baseSetContext(ctx);
+				if (this.style('dominant-baseline').hasValue()) ctx.textBaseline = this.style('dominant-baseline').value;
+				if (this.style('alignment-baseline').hasValue()) ctx.textBaseline = this.style('alignment-baseline').value;
+			}
+			
+			this.renderChildren = function(ctx) {
+				var textAnchor = this.style('text-anchor').valueOrDefault('start');
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				for (var i=0; i<this.children.length; i++) {
+					var child = this.children[i];
+				
+					if (child.attribute('x').hasValue()) {
+						child.x = child.attribute('x').Length.toPixels('x');
+					}
+					else {
+						if (child.attribute('dx').hasValue()) x += child.attribute('dx').Length.toPixels('x');
+						child.x = x;
+					}
+					
+					var childLength = child.measureText(ctx);
+					if (textAnchor != 'start' && (i==0 || child.attribute('x').hasValue())) { // new group?
+						// loop through rest of children
+						var groupLength = childLength;
+						for (var j=i+1; j<this.children.length; j++) {
+							var childInGroup = this.children[j];
+							if (childInGroup.attribute('x').hasValue()) break; // new group
+							groupLength += childInGroup.measureText(ctx);
+						}
+						child.x -= (textAnchor == 'end' ? groupLength : groupLength / 2.0);
+					}
+					x = child.x + childLength;
+					
+					if (child.attribute('y').hasValue()) {
+						child.y = child.attribute('y').Length.toPixels('y');
+					}
+					else {
+						if (child.attribute('dy').hasValue()) y += child.attribute('dy').Length.toPixels('y');
+						child.y = y;
+					}	
+					y = child.y;
+					
+					child.render(ctx);
+				}
+			}
+		}
+		svg.Element.text.prototype = new svg.Element.RenderedElementBase;
+		
+		// text base
+		svg.Element.TextElementBase = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.getGlyph = function(font, text, i) {
+				var c = text[i];
+				var glyph = null;
+				if (font.isArabic) {
+					var arabicForm = 'isolated';
+					if ((i==0 || text[i-1]==' ') && i<text.length-2 && text[i+1]!=' ') arabicForm = 'terminal'; 
+					if (i>0 && text[i-1]!=' ' && i<text.length-2 && text[i+1]!=' ') arabicForm = 'medial';
+					if (i>0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial';
+					if (typeof(font.glyphs[c]) != 'undefined') {
+						glyph = font.glyphs[c][arabicForm];
+						if (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c];
+					}
+				}
+				else {
+					glyph = font.glyphs[c];
+				}
+				if (glyph == null) glyph = font.missingGlyph;
+				return glyph;
+			}
+			
+			this.renderChildren = function(ctx) {
+				var customFont = this.parent.style('font-family').Definition.getDefinition();
+				if (customFont != null) {
+					var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);
+					var fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle);
+					var text = this.getText();
+					if (customFont.isRTL) text = text.split("").reverse().join("");
+					
+					var dx = svg.ToNumberArray(this.parent.attribute('dx').value);
+					for (var i=0; i<text.length; i++) {
+						var glyph = this.getGlyph(customFont, text, i);
+						var scale = fontSize / customFont.fontFace.unitsPerEm;
+						ctx.translate(this.x, this.y);
+						ctx.scale(scale, -scale);
+						var lw = ctx.lineWidth;
+						ctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize;
+						if (fontStyle == 'italic') ctx.transform(1, 0, .4, 1, 0, 0);
+						glyph.render(ctx);
+						if (fontStyle == 'italic') ctx.transform(1, 0, -.4, 1, 0, 0);
+						ctx.lineWidth = lw;
+						ctx.scale(1/scale, -1/scale);
+						ctx.translate(-this.x, -this.y);	
+						
+						this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm;
+						if (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {
+							this.x += dx[i];
+						}
+					}
+					return;
+				}
+			
+				if (ctx.strokeStyle != '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);
+				if (ctx.fillStyle != '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);
+			}
+			
+			this.getText = function() {
+				// OVERRIDE ME
+			}
+			
+			this.measureText = function(ctx) {
+				var customFont = this.parent.style('font-family').Definition.getDefinition();
+				if (customFont != null) {
+					var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);
+					var measure = 0;
+					var text = this.getText();
+					if (customFont.isRTL) text = text.split("").reverse().join("");
+					var dx = svg.ToNumberArray(this.parent.attribute('dx').value);
+					for (var i=0; i<text.length; i++) {
+						var glyph = this.getGlyph(customFont, text, i);
+						measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;
+						if (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {
+							measure += dx[i];
+						}
+					}
+					return measure;
+				}
+			
+				var textToMeasure = svg.compressSpaces(this.getText());
+				if (!ctx.measureText) return textToMeasure.length * 10;
+				
+				ctx.save();
+				this.setContext(ctx);
+				var width = ctx.measureText(textToMeasure).width;
+				ctx.restore();
+				return width;
+			}
+		}
+		svg.Element.TextElementBase.prototype = new svg.Element.RenderedElementBase;
+		
+		// tspan 
+		svg.Element.tspan = function(node) {
+			this.base = svg.Element.TextElementBase;
+			this.base(node);
+			
+			this.text = node.nodeType == 3 ? node.nodeValue : // text
+						node.childNodes.length > 0 ? node.childNodes[0].nodeValue : // element
+						node.text;
+			this.getText = function() {
+				return this.text;
+			}
+		}
+		svg.Element.tspan.prototype = new svg.Element.TextElementBase;
+		
+		// tref
+		svg.Element.tref = function(node) {
+			this.base = svg.Element.TextElementBase;
+			this.base(node);
+			
+			this.getText = function() {
+				var element = this.attribute('xlink:href').Definition.getDefinition();
+				if (element != null) return element.children[0].getText();
+			}
+		}
+		svg.Element.tref.prototype = new svg.Element.TextElementBase;		
+		
+		// a element
+		svg.Element.a = function(node) {
+			this.base = svg.Element.TextElementBase;
+			this.base(node);
+			
+			this.hasText = true;
+			for (var i=0; i<node.childNodes.length; i++) {
+				if (node.childNodes[i].nodeType != 3) this.hasText = false;
+			}
+			
+			// this might contain text
+			this.text = this.hasText ? node.childNodes[0].nodeValue : '';
+			this.getText = function() {
+				return this.text;
+			}		
+
+			this.baseRenderChildren = this.renderChildren;
+			this.renderChildren = function(ctx) {
+				if (this.hasText) {
+					// render as text element
+					this.baseRenderChildren(ctx);
+					var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);
+					svg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.Length.toPixels('y'), this.x + this.measureText(ctx), this.y));					
+				}
+				else {
+					// render as temporary group
+					var g = new svg.Element.g();
+					g.children = this.children;
+					g.parent = this;
+					g.render(ctx);
+				}
+			}
+			
+			this.onclick = function() {
+				window.open(this.attribute('xlink:href').value);
+			}
+			
+			this.onmousemove = function() {
+				svg.ctx.canvas.style.cursor = 'pointer';
+			}
+		}
+		svg.Element.a.prototype = new svg.Element.TextElementBase;		
+		
+		// image element
+		svg.Element.image = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			svg.Images.push(this);
+			this.img = document.createElement('img');
+			this.loaded = false;
+			var that = this;
+			this.img.onload = function() { that.loaded = true; }
+			this.img.src = this.attribute('xlink:href').value;
+			
+			this.renderChildren = function(ctx) {
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');			
+				if (width == 0 || height == 0) return;
+			
+				ctx.save();
+				ctx.translate(x, y);
+				svg.AspectRatio(ctx,
+								this.attribute('preserveAspectRatio').value,
+								width,
+								this.img.width,
+								height,
+								this.img.height,
+								0,
+								0);	
+				ctx.drawImage(this.img, 0, 0);			
+				ctx.restore();
+			}
+		}
+		svg.Element.image.prototype = new svg.Element.RenderedElementBase;
+		
+		// group element
+		svg.Element.g = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.getBoundingBox = function() {
+				var bb = new svg.BoundingBox();
+				for (var i=0; i<this.children.length; i++) {
+					bb.addBoundingBox(this.children[i].getBoundingBox());
+				}
+				return bb;
+			};
+		}
+		svg.Element.g.prototype = new svg.Element.RenderedElementBase;
+
+		// symbol element
+		svg.Element.symbol = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {		
+				this.baseSetContext(ctx);
+				
+				// viewbox
+				if (this.attribute('viewBox').hasValue()) {				
+					var viewBox = svg.ToNumberArray(this.attribute('viewBox').value);
+					var minX = viewBox[0];
+					var minY = viewBox[1];
+					width = viewBox[2];
+					height = viewBox[3];
+					
+					svg.AspectRatio(ctx,
+									this.attribute('preserveAspectRatio').value, 
+									this.attribute('width').Length.toPixels('x'),
+									width,
+									this.attribute('height').Length.toPixels('y'),
+									height,
+									minX,
+									minY);
+
+					svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);						
+				}
+			}			
+		}
+		svg.Element.symbol.prototype = new svg.Element.RenderedElementBase;		
+			
+		// style element
+		svg.Element.style = function(node) { 
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			// text, or spaces then CDATA
+			var css = node.childNodes[0].nodeValue + (node.childNodes.length > 1 ? node.childNodes[1].nodeValue : '');
+			css = css.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm, ''); // remove comments
+			css = svg.compressSpaces(css); // replace whitespace
+			var cssDefs = css.split('}');
+			for (var i=0; i<cssDefs.length; i++) {
+				if (svg.trim(cssDefs[i]) != '') {
+					var cssDef = cssDefs[i].split('{');
+					var cssClasses = cssDef[0].split(',');
+					var cssProps = cssDef[1].split(';');
+					for (var j=0; j<cssClasses.length; j++) {
+						var cssClass = svg.trim(cssClasses[j]);
+						if (cssClass != '') {
+							var props = {};
+							for (var k=0; k<cssProps.length; k++) {
+								var prop = cssProps[k].indexOf(':');
+								var name = cssProps[k].substr(0, prop);
+								var value = cssProps[k].substr(prop + 1, cssProps[k].length - prop);
+								if (name != null && value != null) {
+									props[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value));
+								}
+							}
+							svg.Styles[cssClass] = props;
+							if (cssClass == '@font-face') {
+								var fontFamily = props['font-family'].value.replace(/"/g,'');
+								var srcs = props['src'].value.split(',');
+								for (var s=0; s<srcs.length; s++) {
+									if (srcs[s].indexOf('format("svg")') > 0) {
+										var urlStart = srcs[s].indexOf('url');
+										var urlEnd = srcs[s].indexOf(')', urlStart);
+										var url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6);
+										var doc = svg.parseXml(svg.ajax(url));
+										var fonts = doc.getElementsByTagName('font');
+										for (var f=0; f<fonts.length; f++) {
+											var font = svg.CreateElement(fonts[f]);
+											svg.Definitions[fontFamily] = font;
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		svg.Element.style.prototype = new svg.Element.ElementBase;
+		
+		// use element 
+		svg.Element.use = function(node) {
+			this.base = svg.Element.RenderedElementBase;
+			this.base(node);
+			
+			this.baseSetContext = this.setContext;
+			this.setContext = function(ctx) {
+				this.baseSetContext(ctx);
+				if (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').Length.toPixels('x'), 0);
+				if (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').Length.toPixels('y'));
+			}
+			
+			this.getDefinition = function() {
+				var element = this.attribute('xlink:href').Definition.getDefinition();
+				if (this.attribute('width').hasValue()) element.attribute('width', true).value = this.attribute('width').value;
+				if (this.attribute('height').hasValue()) element.attribute('height', true).value = this.attribute('height').value;
+				return element;
+			}
+			
+			this.path = function(ctx) {
+				var element = this.getDefinition();
+				if (element != null) element.path(ctx);
+			}
+			
+			this.renderChildren = function(ctx) {
+				var element = this.getDefinition();
+				if (element != null) element.render(ctx);
+			}
+		}
+		svg.Element.use.prototype = new svg.Element.RenderedElementBase;
+		
+		// mask element
+		svg.Element.mask = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+						
+			this.apply = function(ctx, element) {
+				// render as temp svg	
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');
+				
+				// temporarily remove mask to avoid recursion
+				var mask = element.attribute('mask').value;
+				element.attribute('mask').value = '';
+				
+					var cMask = document.createElement('canvas');
+					cMask.width = x + width;
+					cMask.height = y + height;
+					var maskCtx = cMask.getContext('2d');
+					this.renderChildren(maskCtx);
+				
+					var c = document.createElement('canvas');
+					c.width = x + width;
+					c.height = y + height;
+					var tempCtx = c.getContext('2d');
+					element.render(tempCtx);
+					tempCtx.globalCompositeOperation = 'destination-in';
+					tempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');
+					tempCtx.fillRect(0, 0, x + width, y + height);
+					
+					ctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');
+					ctx.fillRect(0, 0, x + width, y + height);
+					
+				// reassign mask
+				element.attribute('mask').value = mask;	
+			}
+			
+			this.render = function(ctx) {
+				// NO RENDER
+			}
+		}
+		svg.Element.mask.prototype = new svg.Element.ElementBase;
+		
+		// clip element
+		svg.Element.clipPath = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+			
+			this.apply = function(ctx) {
+				for (var i=0; i<this.children.length; i++) {
+					if (this.children[i].path) {
+						this.children[i].path(ctx);
+						ctx.clip();
+					}
+				}
+			}
+			
+			this.render = function(ctx) {
+				// NO RENDER
+			}
+		}
+		svg.Element.clipPath.prototype = new svg.Element.ElementBase;
+
+		// filters
+		svg.Element.filter = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);
+						
+			this.apply = function(ctx, element) {
+				// render as temp svg	
+				var bb = element.getBoundingBox();
+				var x = this.attribute('x').Length.toPixels('x');
+				var y = this.attribute('y').Length.toPixels('y');
+				if (x == 0 || y == 0) {
+					x = bb.x1;
+					y = bb.y1;
+				}
+				var width = this.attribute('width').Length.toPixels('x');
+				var height = this.attribute('height').Length.toPixels('y');
+				if (width == 0 || height == 0) {
+					width = bb.width();
+					height = bb.height();
+				}
+				
+				// temporarily remove filter to avoid recursion
+				var filter = element.style('filter').value;
+				element.style('filter').value = '';
+				
+				// max filter distance
+				var extraPercent = .20;
+				var px = extraPercent * width;
+				var py = extraPercent * height;
+				
+				var c = document.createElement('canvas');
+				c.width = width + 2*px;
+				c.height = height + 2*py;
+				var tempCtx = c.getContext('2d');
+				tempCtx.translate(-x + px, -y + py);
+				element.render(tempCtx);
+			
+				// apply filters
+				for (var i=0; i<this.children.length; i++) {
+					this.children[i].apply(tempCtx, 0, 0, width + 2*px, height + 2*py);
+				}
+				
+				// render on me
+				ctx.drawImage(c, 0, 0, width + 2*px, height + 2*py, x - px, y - py, width + 2*px, height + 2*py);
+				
+				// reassign filter
+				element.style('filter', true).value = filter;	
+			}
+			
+			this.render = function(ctx) {
+				// NO RENDER
+			}		
+		}
+		svg.Element.filter.prototype = new svg.Element.ElementBase;
+		
+		svg.Element.feGaussianBlur = function(node) {
+			this.base = svg.Element.ElementBase;
+			this.base(node);	
+			
+			function make_fgauss(sigma) {
+				sigma = Math.max(sigma, 0.01);			      
+				var len = Math.ceil(sigma * 4.0) + 1;                     
+				mask = [];                               
+				for (var i = 0; i < len; i++) {                             
+					mask[i] = Math.exp(-0.5 * (i / sigma) * (i / sigma));                                           
+				}                                                           
+				return mask; 
+			}
+			
+			function normalize(mask) {
+				var sum = 0;
+				for (var i = 1; i < mask.length; i++) {
+					sum += Math.abs(mask[i]);
+				}
+				sum = 2 * sum + Math.abs(mask[0]);
+				for (var i = 0; i < mask.length; i++) {
+					mask[i] /= sum;
+				}
+				return mask;
+			}
+			
+			function convolve_even(src, dst, mask, width, height) {
+			  for (var y = 0; y < height; y++) {
+				for (var x = 0; x < width; x++) {
+				  var a = imGet(src, x, y, width, height, 3)/255;
+				  for (var rgba = 0; rgba < 4; rgba++) {					  
+					  var sum = mask[0] * (a==0?255:imGet(src, x, y, width, height, rgba)) * (a==0||rgba==3?1:a);
+					  for (var i = 1; i < mask.length; i++) {
+						var a1 = imGet(src, Math.max(x-i,0), y, width, height, 3)/255;
+					    var a2 = imGet(src, Math.min(x+i, width-1), y, width, height, 3)/255;
+						sum += mask[i] * 
+						  ((a1==0?255:imGet(src, Math.max(x-i,0), y, width, height, rgba)) * (a1==0||rgba==3?1:a1) + 
+						   (a2==0?255:imGet(src, Math.min(x+i, width-1), y, width, height, rgba)) * (a2==0||rgba==3?1:a2));
+					  }
+					  imSet(dst, y, x, height, width, rgba, sum);
+				  }			  
+				}
+			  }
+			}		
+
+			function imGet(img, x, y, width, height, rgba) {
+				return img[y*width*4 + x*4 + rgba];
+			}
+			
+			function imSet(img, x, y, width, height, rgba, val) {
+				img[y*width*4 + x*4 + rgba] = val;
+			}
+						
+			function blur(ctx, width, height, sigma)
+			{
+				var srcData = ctx.getImageData(0, 0, width, height);
+				var mask = make_fgauss(sigma);
+				mask = normalize(mask);
+				tmp = [];
+				convolve_even(srcData.data, tmp, mask, width, height);
+				convolve_even(tmp, srcData.data, mask, height, width);
+				ctx.clearRect(0, 0, width, height);
+				ctx.putImageData(srcData, 0, 0);
+			}			
+		
+			this.apply = function(ctx, x, y, width, height) {
+				// assuming x==0 && y==0 for now
+				blur(ctx, width, height, this.attribute('stdDeviation').numValue());
+			}
+		}
+		svg.Element.filter.prototype = new svg.Element.feGaussianBlur;
+		
+		// title element, do nothing
+		svg.Element.title = function(node) {
+		}
+		svg.Element.title.prototype = new svg.Element.ElementBase;
+
+		// desc element, do nothing
+		svg.Element.desc = function(node) {
+		}
+		svg.Element.desc.prototype = new svg.Element.ElementBase;		
+		
+		svg.Element.MISSING = function(node) {
+			console.log('ERROR: Element \'' + node.nodeName + '\' not yet implemented.');
+		}
+		svg.Element.MISSING.prototype = new svg.Element.ElementBase;
+		
+		// element factory
+		svg.CreateElement = function(node) {	
+			var className = node.nodeName.replace(/^[^:]+:/,''); // remove namespace
+			className = className.replace(/\-/g,''); // remove dashes
+			var e = null;
+			if (typeof(svg.Element[className]) != 'undefined') {
+				e = new svg.Element[className](node);
+			}
+			else {
+				e = new svg.Element.MISSING(node);
+			}
+
+			e.type = node.nodeName;
+			return e;
+		}
+				
+		// load from url
+		svg.load = function(ctx, url) {
+			svg.loadXml(ctx, svg.ajax(url));
+		}
+		
+		// load from xml
+		svg.loadXml = function(ctx, xml) {
+			svg.loadXmlDoc(ctx, svg.parseXml(xml));
+		}
+		
+		svg.loadXmlDoc = function(ctx, dom) {
+			svg.init(ctx);
+			
+			var mapXY = function(p) {
+				var e = ctx.canvas;
+				while (e) {
+					p.x -= e.offsetLeft;
+					p.y -= e.offsetTop;
+					e = e.offsetParent;
+				}
+				if (window.scrollX) p.x += window.scrollX;
+				if (window.scrollY) p.y += window.scrollY;
+				return p;
+			}
+			
+			// bind mouse
+			if (svg.opts['ignoreMouse'] != true) {
+				ctx.canvas.onclick = function(e) {
+					var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));
+					svg.Mouse.onclick(p.x, p.y);
+				};
+				ctx.canvas.onmousemove = function(e) {
+					var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));
+					svg.Mouse.onmousemove(p.x, p.y);
+				};
+			}
+		
+			var e = svg.CreateElement(dom.documentElement);
+			e.root = true;
+					
+			// render loop
+			var isFirstRender = true;
+			var draw = function() {
+				svg.ViewPort.Clear();
+				if (ctx.canvas.parentNode) svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight);
+			
+				if (svg.opts['ignoreDimensions'] != true) {
+					// set canvas size
+					if (e.style('width').hasValue()) {
+						ctx.canvas.width = e.style('width').Length.toPixels('x');
+						ctx.canvas.style.width = ctx.canvas.width + 'px';
+					}
+					if (e.style('height').hasValue()) {
+						ctx.canvas.height = e.style('height').Length.toPixels('y');
+						ctx.canvas.style.height = ctx.canvas.height + 'px';
+					}
+				}
+				var cWidth = ctx.canvas.clientWidth || ctx.canvas.width;
+				var cHeight = ctx.canvas.clientHeight || ctx.canvas.height;
+				svg.ViewPort.SetCurrent(cWidth, cHeight);		
+				
+				if (svg.opts != null && svg.opts['offsetX'] != null) e.attribute('x', true).value = svg.opts['offsetX'];
+				if (svg.opts != null && svg.opts['offsetY'] != null) e.attribute('y', true).value = svg.opts['offsetY'];
+				if (svg.opts != null && svg.opts['scaleWidth'] != null && svg.opts['scaleHeight'] != null) {
+					var xRatio = 1, yRatio = 1;
+					if (e.attribute('width').hasValue()) xRatio = e.attribute('width').Length.toPixels('x') / svg.opts['scaleWidth'];
+					if (e.attribute('height').hasValue()) yRatio = e.attribute('height').Length.toPixels('y') / svg.opts['scaleHeight'];
+				
+					e.attribute('width', true).value = svg.opts['scaleWidth'];
+					e.attribute('height', true).value = svg.opts['scaleHeight'];			
+					e.attribute('viewBox', true).value = '0 0 ' + (cWidth * xRatio) + ' ' + (cHeight * yRatio);
+					e.attribute('preserveAspectRatio', true).value = 'none';
+				}
+			
+				// clear and render
+				if (svg.opts['ignoreClear'] != true) {
+					ctx.clearRect(0, 0, cWidth, cHeight);
+				}
+				e.render(ctx);
+				if (isFirstRender) {
+					isFirstRender = false;
+					if (svg.opts != null && typeof(svg.opts['renderCallback']) == 'function') svg.opts['renderCallback']();
+				}			
+			}
+			
+			var waitingForImages = true;
+			if (svg.ImagesLoaded()) {
+				waitingForImages = false;
+				draw();
+			}
+			svg.intervalID = setInterval(function() { 
+				var needUpdate = false;
+				
+				if (waitingForImages && svg.ImagesLoaded()) {
+					waitingForImages = false;
+					needUpdate = true;
+				}
+			
+				// need update from mouse events?
+				if (svg.opts['ignoreMouse'] != true) {
+					needUpdate = needUpdate | svg.Mouse.hasEvents();
+				}
+			
+				// need update from animations?
+				if (svg.opts['ignoreAnimation'] != true) {
+					for (var i=0; i<svg.Animations.length; i++) {
+						needUpdate = needUpdate | svg.Animations[i].update(1000 / svg.FRAMERATE);
+					}
+				}
+				
+				// need update from redraw?
+				if (svg.opts != null && typeof(svg.opts['forceRedraw']) == 'function') {
+					if (svg.opts['forceRedraw']() == true) needUpdate = true;
+				}
+				
+				// render if needed
+				if (needUpdate) {
+					draw();				
+					svg.Mouse.runEvents(); // run and clear our events
+				}
+			}, 1000 / svg.FRAMERATE);
+		}
+		
+		svg.stop = function() {
+			if (svg.intervalID) {
+				clearInterval(svg.intervalID);
+			}
+		}
+		
+		svg.Mouse = new (function() {
+			this.events = [];
+			this.hasEvents = function() { return this.events.length != 0; }
+		
+			this.onclick = function(x, y) {
+				this.events.push({ type: 'onclick', x: x, y: y, 
+					run: function(e) { if (e.onclick) e.onclick(); }
+				});
+			}
+			
+			this.onmousemove = function(x, y) {
+				this.events.push({ type: 'onmousemove', x: x, y: y,
+					run: function(e) { if (e.onmousemove) e.onmousemove(); }
+				});
+			}			
+			
+			this.eventElements = [];
+			
+			this.checkPath = function(element, ctx) {
+				for (var i=0; i<this.events.length; i++) {
+					var e = this.events[i];
+					if (ctx.isPointInPath && ctx.isPointInPath(e.x, e.y)) this.eventElements[i] = element;
+				}
+			}
+			
+			this.checkBoundingBox = function(element, bb) {
+				for (var i=0; i<this.events.length; i++) {
+					var e = this.events[i];
+					if (bb.isPointInBox(e.x, e.y)) this.eventElements[i] = element;
+				}			
+			}
+			
+			this.runEvents = function() {
+				svg.ctx.canvas.style.cursor = '';
+				
+				for (var i=0; i<this.events.length; i++) {
+					var e = this.events[i];
+					var element = this.eventElements[i];
+					while (element) {
+						e.run(element);
+						element = element.parent;
+					}
+				}		
+			
+				// done running, clear
+				this.events = []; 
+				this.eventElements = [];
+			}
+		});
+		
+		return svg;
+	}
+})();
+
+if (CanvasRenderingContext2D) {
+	CanvasRenderingContext2D.prototype.drawSvg = function(s, dx, dy, dw, dh) {
+		canvg(this.canvas, s, { 
+			ignoreMouse: true, 
+			ignoreAnimation: true, 
+			ignoreDimensions: true, 
+			ignoreClear: true, 
+			offsetX: dx, 
+			offsetY: dy, 
+			scaleWidth: dw, 
+			scaleHeight: dh
+		});
+	}
+}/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ * CanVGRenderer Extension module
+ *
+ * (c) 2011-2012 Torstein Hønsi, Erik Olsson
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts */
+
+(function (Highcharts) { // encapsulate
+	var UNDEFINED,
+		DIV = 'div',
+		ABSOLUTE = 'absolute',
+		RELATIVE = 'relative',
+		HIDDEN = 'hidden',
+		VISIBLE = 'visible',
+		PX = 'px',
+		css = Highcharts.css,
+		CanVGRenderer = Highcharts.CanVGRenderer,
+		SVGRenderer = Highcharts.SVGRenderer,
+		extend = Highcharts.extend,
+		merge = Highcharts.merge,
+		addEvent = Highcharts.addEvent,
+		createElement = Highcharts.createElement,
+		discardElement = Highcharts.discardElement;
+
+	// Extend CanVG renderer on demand, inherit from SVGRenderer
+	extend(CanVGRenderer.prototype, SVGRenderer.prototype);
+
+	// Add additional functionality:
+	extend(CanVGRenderer.prototype, {
+		create: function (chart, container, chartWidth, chartHeight) {
+			this.setContainer(container, chartWidth, chartHeight);
+			this.configure(chart);
+		},
+		setContainer: function (container, chartWidth, chartHeight) {
+			var containerStyle = container.style,
+				containerParent = container.parentNode,
+				containerLeft = containerStyle.left,
+				containerTop = containerStyle.top,
+				containerOffsetWidth = container.offsetWidth,
+				containerOffsetHeight = container.offsetHeight,
+				canvas,
+				initialHiddenStyle = { visibility: HIDDEN, position: ABSOLUTE };
+
+			this.init.apply(this, [container, chartWidth, chartHeight]);
+
+			// add the canvas above it
+			canvas = createElement('canvas', {
+				width: containerOffsetWidth,
+				height: containerOffsetHeight
+			}, {
+				position: RELATIVE,
+				left: containerLeft,
+				top: containerTop
+			}, container);
+			this.canvas = canvas;
+
+			// Create the tooltip line and div, they are placed as siblings to
+			// the container (and as direct childs to the div specified in the html page)
+			this.ttLine = createElement(DIV, null, initialHiddenStyle, containerParent);
+			this.ttDiv = createElement(DIV, null, initialHiddenStyle, containerParent);
+			this.ttTimer = UNDEFINED;
+
+			// Move away the svg node to a new div inside the container's parent so we can hide it.
+			var hiddenSvg = createElement(DIV, {
+				width: containerOffsetWidth,
+				height: containerOffsetHeight
+			}, {
+				visibility: HIDDEN,
+				left: containerLeft,
+				top: containerTop
+			}, containerParent);
+			this.hiddenSvg = hiddenSvg;
+			hiddenSvg.appendChild(this.box);
+		},
+
+		/**
+		 * Configures the renderer with the chart. Attach a listener to the event tooltipRefresh.
+		 **/
+		configure: function (chart) {
+			var renderer = this,
+				options = chart.options.tooltip,
+				borderWidth = options.borderWidth,
+				tooltipDiv = renderer.ttDiv,
+				tooltipDivStyle = options.style,
+				tooltipLine = renderer.ttLine,
+				padding = parseInt(tooltipDivStyle.padding, 10);
+
+			// Add border styling from options to the style
+			tooltipDivStyle = merge(tooltipDivStyle, {
+				padding: padding + PX,
+				'background-color': options.backgroundColor,
+				'border-style': 'solid',
+				'border-width': borderWidth + PX,
+				'border-radius': options.borderRadius + PX
+			});
+
+			// Optionally add shadow
+			if (options.shadow) {
+				tooltipDivStyle = merge(tooltipDivStyle, {
+					'box-shadow': '1px 1px 3px gray', // w3c
+					'-webkit-box-shadow': '1px 1px 3px gray' // webkit
+				});
+			}
+			css(tooltipDiv, tooltipDivStyle);
+
+			// Set simple style on the line
+			css(tooltipLine, {
+				'border-left': '1px solid darkgray'
+			});
+
+			// This event is triggered when a new tooltip should be shown
+			addEvent(chart, 'tooltipRefresh', function (args) {
+				var chartContainer = chart.container,
+					offsetLeft = chartContainer.offsetLeft,
+					offsetTop = chartContainer.offsetTop,
+					position;
+
+				// Set the content of the tooltip
+				tooltipDiv.innerHTML = args.text;
+
+				// Compute the best position for the tooltip based on the divs size and container size.
+				position = chart.tooltip.getPosition(tooltipDiv.offsetWidth, tooltipDiv.offsetHeight, {plotX: args.x, plotY: args.y});
+
+				css(tooltipDiv, {
+					visibility: VISIBLE,
+					left: position.x + PX,
+					top: position.y + PX,
+					'border-color': args.borderColor
+				});
+
+				// Position the tooltip line
+				css(tooltipLine, {
+					visibility: VISIBLE,
+					left: offsetLeft + args.x + PX,
+					top: offsetTop + chart.plotTop + PX,
+					height: chart.plotHeight  + PX
+				});
+
+				// This timeout hides the tooltip after 3 seconds
+				// First clear any existing timer
+				if (renderer.ttTimer !== UNDEFINED) {
+					clearTimeout(renderer.ttTimer);
+				}
+
+				// Start a new timer that hides tooltip and line
+				renderer.ttTimer = setTimeout(function () {
+					css(tooltipDiv, { visibility: HIDDEN });
+					css(tooltipLine, { visibility: HIDDEN });
+				}, 3000);
+			});
+		},
+
+		/**
+		 * Extend SVGRenderer.destroy to also destroy the elements added by CanVGRenderer.
+		 */
+		destroy: function () {
+			var renderer = this;
+
+			// Remove the canvas
+			discardElement(renderer.canvas);
+
+			// Kill the timer
+			if (renderer.ttTimer !== UNDEFINED) {
+				clearTimeout(renderer.ttTimer);
+			}
+
+			// Remove the divs for tooltip and line
+			discardElement(renderer.ttLine);
+			discardElement(renderer.ttDiv);
+			discardElement(renderer.hiddenSvg);
+
+			// Continue with base class
+			return SVGRenderer.prototype.destroy.apply(renderer);
+		},
+
+		/**
+		 * Take a color and return it if it's a string, do not make it a gradient even if it is a
+		 * gradient. Currently canvg cannot render gradients (turns out black),
+		 * see: http://code.google.com/p/canvg/issues/detail?id=104
+		 *
+		 * @param {Object} color The color or config object
+		 */
+		color: function (color, elem, prop) {
+			if (color && color.linearGradient) {
+				// Pick the end color and forward to base implementation
+				color = color.stops[color.stops.length - 1][1];
+			}
+			return SVGRenderer.prototype.color.call(this, color, elem, prop);
+		},
+
+		/**
+		 * Draws the SVG on the canvas or adds a draw invokation to the deferred list.
+		 */
+		draw: function () {
+			var renderer = this;
+			window.canvg(renderer.canvas, renderer.hiddenSvg.innerHTML);
+		}
+	});
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/data.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/data.js
new file mode 100644
index 0000000..e309b39
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/data.js
@@ -0,0 +1,17 @@
+/*
+ Data plugin for Highcharts
+
+ (c) 2012-2013 Torstein Hønsi
+ Last revision 2013-06-07
+
+ License: www.highcharts.com/license
+*/
+(function(h){var k=h.each,m=function(b,a){this.init(b,a)};h.extend(m.prototype,{init:function(b,a){this.options=b;this.chartOptions=a;this.columns=b.columns||this.rowsToColumns(b.rows)||[];this.columns.length?this.dataFound():(this.parseCSV(),this.parseTable(),this.parseGoogleSpreadsheet())},getColumnDistribution:function(){var b=this.chartOptions,a=b&&b.chart&&b.chart.type,c=[];k(b&&b.series||[],function(b){c.push((h.seriesTypes[b.type||a||"line"].prototype.pointArrayMap||[0]).length)});this.valueCount=
+{global:(h.seriesTypes[a||"line"].prototype.pointArrayMap||[0]).length,individual:c}},dataFound:function(){this.parseTypes();this.findHeaderRow();this.parsed();this.complete()},parseCSV:function(){var b=this,a=this.options,c=a.csv,d=this.columns,f=a.startRow||0,i=a.endRow||Number.MAX_VALUE,j=a.startColumn||0,e=a.endColumn||Number.MAX_VALUE,g=0;c&&(c=c.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split(a.lineDelimiter||"\n"),k(c,function(c,h){var n=b.trim(c),p=n.indexOf("#")===0;h>=f&&h<=i&&!p&&n!==""&&
+(n=c.split(a.itemDelimiter||","),k(n,function(b,a){a>=j&&a<=e&&(d[a-j]||(d[a-j]=[]),d[a-j][g]=b)}),g+=1)}),this.dataFound())},parseTable:function(){var b=this.options,a=b.table,c=this.columns,d=b.startRow||0,f=b.endRow||Number.MAX_VALUE,i=b.startColumn||0,j=b.endColumn||Number.MAX_VALUE,e;a&&(typeof a==="string"&&(a=document.getElementById(a)),k(a.getElementsByTagName("tr"),function(a,b){e=0;b>=d&&b<=f&&k(a.childNodes,function(a){if((a.tagName==="TD"||a.tagName==="TH")&&e>=i&&e<=j)c[e]||(c[e]=[]),
+c[e][b-d]=a.innerHTML,e+=1})}),this.dataFound())},parseGoogleSpreadsheet:function(){var b=this,a=this.options,c=a.googleSpreadsheetKey,d=this.columns,f=a.startRow||0,i=a.endRow||Number.MAX_VALUE,j=a.startColumn||0,e=a.endColumn||Number.MAX_VALUE,g,h;c&&jQuery.getJSON("https://spreadsheets.google.com/feeds/cells/"+c+"/"+(a.googleSpreadsheetWorksheet||"od6")+"/public/values?alt=json-in-script&callback=?",function(a){var a=a.feed.entry,c,k=a.length,m=0,o=0,l;for(l=0;l<k;l++)c=a[l],m=Math.max(m,c.gs$cell.col),
+o=Math.max(o,c.gs$cell.row);for(l=0;l<m;l++)if(l>=j&&l<=e)d[l-j]=[],d[l-j].length=Math.min(o,i-f);for(l=0;l<k;l++)if(c=a[l],g=c.gs$cell.row-1,h=c.gs$cell.col-1,h>=j&&h<=e&&g>=f&&g<=i)d[h-j][g-f]=c.content.$t;b.dataFound()})},findHeaderRow:function(){k(this.columns,function(){});this.headerRow=0},trim:function(b){return typeof b==="string"?b.replace(/^\s+|\s+$/g,""):b},parseTypes:function(){for(var b=this.columns,a=b.length,c,d,f,i;a--;)for(c=b[a].length;c--;)d=b[a][c],f=parseFloat(d),i=this.trim(d),
+i==f?(b[a][c]=f,f>31536E6?b[a].isDatetime=!0:b[a].isNumeric=!0):(d=this.parseDate(d),a===0&&typeof d==="number"&&!isNaN(d)?(b[a][c]=d,b[a].isDatetime=!0):b[a][c]=i===""?null:i)},dateFormats:{"YYYY-mm-dd":{regex:"^([0-9]{4})-([0-9]{2})-([0-9]{2})$",parser:function(b){return Date.UTC(+b[1],b[2]-1,+b[3])}}},parseDate:function(b){var a=this.options.parseDate,c,d,f;a&&(c=a(b));if(typeof b==="string")for(d in this.dateFormats)a=this.dateFormats[d],(f=b.match(a.regex))&&(c=a.parser(f));return c},rowsToColumns:function(b){var a,
+c,d,f,i;if(b){i=[];c=b.length;for(a=0;a<c;a++){f=b[a].length;for(d=0;d<f;d++)i[d]||(i[d]=[]),i[d][a]=b[a][d]}}return i},parsed:function(){this.options.parsed&&this.options.parsed.call(this,this.columns)},complete:function(){var b=this.columns,a,c,d=this.options,f,i,j,e,g,k;if(d.complete){this.getColumnDistribution();b.length>1&&(a=b.shift(),this.headerRow===0&&a.shift(),a.isDatetime?c="datetime":a.isNumeric||(c="category"));for(e=0;e<b.length;e++)if(this.headerRow===0)b[e].name=b[e].shift();i=[];
+for(e=0,k=0;e<b.length;k++){f=h.pick(this.valueCount.individual[k],this.valueCount.global);j=[];for(g=0;g<b[e].length;g++)j[g]=[a[g],b[e][g]!==void 0?b[e][g]:null],f>1&&j[g].push(b[e+1][g]!==void 0?b[e+1][g]:null),f>2&&j[g].push(b[e+2][g]!==void 0?b[e+2][g]:null),f>3&&j[g].push(b[e+3][g]!==void 0?b[e+3][g]:null),f>4&&j[g].push(b[e+4][g]!==void 0?b[e+4][g]:null);i[k]={name:b[e].name,data:j};e+=f}d.complete({xAxis:{type:c},series:i})}}});h.Data=m;h.data=function(b,a){return new m(b,a)};h.wrap(h.Chart.prototype,
+"init",function(b,a,c){var d=this;a&&a.data?h.data(h.extend(a.data,{complete:function(f){a.series&&k(a.series,function(b,c){a.series[c]=h.merge(b,f.series[c])});a=h.merge(f,a);b.call(d,a,c)}}),a):b.call(d,a,c)})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/data.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/data.src.js
new file mode 100644
index 0000000..d344799
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/data.src.js
@@ -0,0 +1,582 @@
+/**
+ * @license Data plugin for Highcharts
+ *
+ * (c) 2012-2013 Torstein Hønsi
+ * Last revision 2013-06-07
+ *
+ * License: www.highcharts.com/license
+ */
+
+/*
+ * The Highcharts Data plugin is a utility to ease parsing of input sources like
+ * CSV, HTML tables or grid views into basic configuration options for use 
+ * directly in the Highcharts constructor.
+ *
+ * Demo: http://jsfiddle.net/highcharts/SnLFj/
+ *
+ * --- OPTIONS ---
+ *
+ * - columns : Array<Array<Mixed>>
+ * A two-dimensional array representing the input data on tabular form. This input can
+ * be used when the data is already parsed, for example from a grid view component.
+ * Each cell can be a string or number. If not switchRowsAndColumns is set, the columns
+ * are interpreted as series. See also the rows option.
+ *
+ * - complete : Function(chartOptions)
+ * The callback that is evaluated when the data is finished loading, optionally from an 
+ * external source, and parsed. The first argument passed is a finished chart options
+ * object, containing series and an xAxis with categories if applicable. Thise options
+ * can be extended with additional options and passed directly to the chart constructor.
+ *
+ * - csv : String
+ * A comma delimited string to be parsed. Related options are startRow, endRow, startColumn
+ * and endColumn to delimit what part of the table is used. The lineDelimiter and 
+ * itemDelimiter options define the CSV delimiter formats.
+ * 
+ * - endColumn : Integer
+ * In tabular input data, the first row (indexed by 0) to use. Defaults to the last 
+ * column containing data.
+ *
+ * - endRow : Integer
+ * In tabular input data, the last row (indexed by 0) to use. Defaults to the last row
+ * containing data.
+ *
+ * - googleSpreadsheetKey : String 
+ * A Google Spreadsheet key. See https://developers.google.com/gdata/samples/spreadsheet_sample
+ * for general information on GS.
+ *
+ * - googleSpreadsheetWorksheet : String 
+ * The Google Spreadsheet worksheet. The available id's can be read from 
+ * https://spreadsheets.google.com/feeds/worksheets/{key}/public/basic
+ *
+ * - itemDelimiter : String
+ * Item or cell delimiter for parsing CSV. Defaults to ",".
+ *
+ * - lineDelimiter : String
+ * Line delimiter for parsing CSV. Defaults to "\n".
+ *
+ * - parsed : Function
+ * A callback function to access the parsed columns, the two-dimentional input data
+ * array directly, before they are interpreted into series data and categories.
+ *
+ * - parseDate : Function
+ * A callback function to parse string representations of dates into JavaScript timestamps.
+ * Return an integer on success.
+ *
+ * - rows : Array<Array<Mixed>>
+ * The same as the columns input option, but defining rows intead of columns.
+ *
+ * - startColumn : Integer
+ * In tabular input data, the first column (indexed by 0) to use. 
+ *
+ * - startRow : Integer
+ * In tabular input data, the first row (indexed by 0) to use.
+ *
+ * - table : String|HTMLElement
+ * A HTML table or the id of such to be parsed as input data. Related options ara startRow,
+ * endRow, startColumn and endColumn to delimit what part of the table is used.
+ */
+
+// JSLint options:
+/*global jQuery */
+
+(function (Highcharts) {	
+	
+	// Utilities
+	var each = Highcharts.each;
+	
+	
+	// The Data constructor
+	var Data = function (dataOptions, chartOptions) {
+		this.init(dataOptions, chartOptions);
+	};
+	
+	// Set the prototype properties
+	Highcharts.extend(Data.prototype, {
+		
+	/**
+	 * Initialize the Data object with the given options
+	 */
+	init: function (options, chartOptions) {
+		this.options = options;
+		this.chartOptions = chartOptions;
+		this.columns = options.columns || this.rowsToColumns(options.rows) || [];
+
+		// No need to parse or interpret anything
+		if (this.columns.length) {
+			this.dataFound();
+
+		// Parse and interpret
+		} else {
+
+			// Parse a CSV string if options.csv is given
+			this.parseCSV();
+			
+			// Parse a HTML table if options.table is given
+			this.parseTable();
+
+			// Parse a Google Spreadsheet 
+			this.parseGoogleSpreadsheet();	
+		}
+
+	},
+
+	/**
+	 * Get the column distribution. For example, a line series takes a single column for 
+	 * Y values. A range series takes two columns for low and high values respectively,
+	 * and an OHLC series takes four columns.
+	 */
+	getColumnDistribution: function () {
+		var chartOptions = this.chartOptions,
+			getValueCount = function (type) {
+				return (Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap || [0]).length;
+			},
+			globalType = chartOptions && chartOptions.chart && chartOptions.chart.type,
+			individualCounts = [];
+
+		each((chartOptions && chartOptions.series) || [], function (series) {
+			individualCounts.push(getValueCount(series.type || globalType));
+		});
+
+		this.valueCount = {
+			global: getValueCount(globalType),
+			individual: individualCounts
+		};
+	},
+
+
+	dataFound: function () {
+		// Interpret the values into right types
+		this.parseTypes();
+		
+		// Use first row for series names?
+		this.findHeaderRow();
+		
+		// Handle columns if a handleColumns callback is given
+		this.parsed();
+		
+		// Complete if a complete callback is given
+		this.complete();
+		
+	},
+	
+	/**
+	 * Parse a CSV input string
+	 */
+	parseCSV: function () {
+		var self = this,
+			options = this.options,
+			csv = options.csv,
+			columns = this.columns,
+			startRow = options.startRow || 0,
+			endRow = options.endRow || Number.MAX_VALUE,
+			startColumn = options.startColumn || 0,
+			endColumn = options.endColumn || Number.MAX_VALUE,
+			lines,
+			activeRowNo = 0;
+			
+		if (csv) {
+			
+			lines = csv
+				.replace(/\r\n/g, "\n") // Unix
+				.replace(/\r/g, "\n") // Mac
+				.split(options.lineDelimiter || "\n");
+			
+			each(lines, function (line, rowNo) {
+				var trimmed = self.trim(line),
+					isComment = trimmed.indexOf('#') === 0,
+					isBlank = trimmed === '',
+					items;
+				
+				if (rowNo >= startRow && rowNo <= endRow && !isComment && !isBlank) {
+					items = line.split(options.itemDelimiter || ',');
+					each(items, function (item, colNo) {
+						if (colNo >= startColumn && colNo <= endColumn) {
+							if (!columns[colNo - startColumn]) {
+								columns[colNo - startColumn] = [];					
+							}
+							
+							columns[colNo - startColumn][activeRowNo] = item;
+						}
+					});
+					activeRowNo += 1;
+				}
+			});
+
+			this.dataFound();
+		}
+	},
+	
+	/**
+	 * Parse a HTML table
+	 */
+	parseTable: function () {
+		var options = this.options,
+			table = options.table,
+			columns = this.columns,
+			startRow = options.startRow || 0,
+			endRow = options.endRow || Number.MAX_VALUE,
+			startColumn = options.startColumn || 0,
+			endColumn = options.endColumn || Number.MAX_VALUE,
+			colNo;
+			
+		if (table) {
+			
+			if (typeof table === 'string') {
+				table = document.getElementById(table);
+			}
+			
+			each(table.getElementsByTagName('tr'), function (tr, rowNo) {
+				colNo = 0; 
+				if (rowNo >= startRow && rowNo <= endRow) {
+					each(tr.childNodes, function (item) {
+						if ((item.tagName === 'TD' || item.tagName === 'TH') && colNo >= startColumn && colNo <= endColumn) {
+							if (!columns[colNo]) {
+								columns[colNo] = [];					
+							}
+							columns[colNo][rowNo - startRow] = item.innerHTML;
+							
+							colNo += 1;
+						}
+					});
+				}
+			});
+
+			this.dataFound(); // continue
+		}
+	},
+
+	/**
+	 * TODO: 
+	 * - switchRowsAndColumns
+	 */
+	parseGoogleSpreadsheet: function () {
+		var self = this,
+			options = this.options,
+			googleSpreadsheetKey = options.googleSpreadsheetKey,
+			columns = this.columns,
+			startRow = options.startRow || 0,
+			endRow = options.endRow || Number.MAX_VALUE,
+			startColumn = options.startColumn || 0,
+			endColumn = options.endColumn || Number.MAX_VALUE,
+			gr, // google row
+			gc; // google column
+
+		if (googleSpreadsheetKey) {
+			jQuery.getJSON('https://spreadsheets.google.com/feeds/cells/' + 
+				  googleSpreadsheetKey + '/' + (options.googleSpreadsheetWorksheet || 'od6') +
+					  '/public/values?alt=json-in-script&callback=?',
+					  function (json) {
+					
+				// Prepare the data from the spreadsheat
+				var cells = json.feed.entry,
+					cell,
+					cellCount = cells.length,
+					colCount = 0,
+					rowCount = 0,
+					i;
+			
+				// First, find the total number of columns and rows that 
+				// are actually filled with data
+				for (i = 0; i < cellCount; i++) {
+					cell = cells[i];
+					colCount = Math.max(colCount, cell.gs$cell.col);
+					rowCount = Math.max(rowCount, cell.gs$cell.row);			
+				}
+			
+				// Set up arrays containing the column data
+				for (i = 0; i < colCount; i++) {
+					if (i >= startColumn && i <= endColumn) {
+						// Create new columns with the length of either end-start or rowCount
+						columns[i - startColumn] = [];
+
+						// Setting the length to avoid jslint warning
+						columns[i - startColumn].length = Math.min(rowCount, endRow - startRow);
+					}
+				}
+				
+				// Loop over the cells and assign the value to the right
+				// place in the column arrays
+				for (i = 0; i < cellCount; i++) {
+					cell = cells[i];
+					gr = cell.gs$cell.row - 1; // rows start at 1
+					gc = cell.gs$cell.col - 1; // columns start at 1
+
+					// If both row and col falls inside start and end
+					// set the transposed cell value in the newly created columns
+					if (gc >= startColumn && gc <= endColumn &&
+						gr >= startRow && gr <= endRow) {
+						columns[gc - startColumn][gr - startRow] = cell.content.$t;
+					}
+				}
+				self.dataFound();
+			});
+		}
+	},
+	
+	/**
+	 * Find the header row. For now, we just check whether the first row contains
+	 * numbers or strings. Later we could loop down and find the first row with 
+	 * numbers.
+	 */
+	findHeaderRow: function () {
+		var headerRow = 0;
+		each(this.columns, function (column) {
+			if (typeof column[0] !== 'string') {
+				headerRow = null;
+			}
+		});
+		this.headerRow = 0;			
+	},
+	
+	/**
+	 * Trim a string from whitespace
+	 */
+	trim: function (str) {
+		return typeof str === 'string' ? str.replace(/^\s+|\s+$/g, '') : str;
+	},
+	
+	/**
+	 * Parse numeric cells in to number types and date types in to true dates.
+	 * @param {Object} columns
+	 */
+	parseTypes: function () {
+		var columns = this.columns,
+			col = columns.length, 
+			row,
+			val,
+			floatVal,
+			trimVal,
+			dateVal;
+			
+		while (col--) {
+			row = columns[col].length;
+			while (row--) {
+				val = columns[col][row];
+				floatVal = parseFloat(val);
+				trimVal = this.trim(val);
+
+				/*jslint eqeq: true*/
+				if (trimVal == floatVal) { // is numeric
+				/*jslint eqeq: false*/
+					columns[col][row] = floatVal;
+					
+					// If the number is greater than milliseconds in a year, assume datetime
+					if (floatVal > 365 * 24 * 3600 * 1000) {
+						columns[col].isDatetime = true;
+					} else {
+						columns[col].isNumeric = true;
+					}					
+				
+				} else { // string, continue to determine if it is a date string or really a string
+					dateVal = this.parseDate(val);
+					
+					if (col === 0 && typeof dateVal === 'number' && !isNaN(dateVal)) { // is date
+						columns[col][row] = dateVal;
+						columns[col].isDatetime = true;
+					
+					} else { // string
+						columns[col][row] = trimVal === '' ? null : trimVal;
+					}
+				}
+				
+			}
+		}
+	},
+	//*
+	dateFormats: {
+		'YYYY-mm-dd': {
+			regex: '^([0-9]{4})-([0-9]{2})-([0-9]{2})$',
+			parser: function (match) {
+				return Date.UTC(+match[1], match[2] - 1, +match[3]);
+			}
+		}
+	},
+	// */
+	/**
+	 * Parse a date and return it as a number. Overridable through options.parseDate.
+	 */
+	parseDate: function (val) {
+		var parseDate = this.options.parseDate,
+			ret,
+			key,
+			format,
+			match;
+
+		if (parseDate) {
+			ret = parseDate(val);
+		}
+			
+		if (typeof val === 'string') {
+			for (key in this.dateFormats) {
+				format = this.dateFormats[key];
+				match = val.match(format.regex);
+				if (match) {
+					ret = format.parser(match);
+				}
+			}
+		}
+		return ret;
+	},
+	
+	/**
+	 * Reorganize rows into columns
+	 */
+	rowsToColumns: function (rows) {
+		var row,
+			rowsLength,
+			col,
+			colsLength,
+			columns;
+
+		if (rows) {
+			columns = [];
+			rowsLength = rows.length;
+			for (row = 0; row < rowsLength; row++) {
+				colsLength = rows[row].length;
+				for (col = 0; col < colsLength; col++) {
+					if (!columns[col]) {
+						columns[col] = [];
+					}
+					columns[col][row] = rows[row][col];
+				}
+			}
+		}
+		return columns;
+	},
+	
+	/**
+	 * A hook for working directly on the parsed columns
+	 */
+	parsed: function () {
+		if (this.options.parsed) {
+			this.options.parsed.call(this, this.columns);
+		}
+	},
+	
+	/**
+	 * If a complete callback function is provided in the options, interpret the 
+	 * columns into a Highcharts options object.
+	 */
+	complete: function () {
+		
+		var columns = this.columns,
+			firstCol,
+			type,
+			options = this.options,
+			valueCount,
+			series,
+			data,
+			i,
+			j,
+			seriesIndex;
+			
+		
+		if (options.complete) {
+
+			this.getColumnDistribution();
+			
+			// Use first column for X data or categories?
+			if (columns.length > 1) {
+				firstCol = columns.shift();
+				if (this.headerRow === 0) {
+					firstCol.shift(); // remove the first cell
+				}
+				
+				
+				if (firstCol.isDatetime) {
+					type = 'datetime';
+				} else if (!firstCol.isNumeric) {
+					type = 'category';
+				}
+			}
+
+			// Get the names and shift the top row
+			for (i = 0; i < columns.length; i++) {
+				if (this.headerRow === 0) {
+					columns[i].name = columns[i].shift();
+				}
+			}
+			
+			// Use the next columns for series
+			series = [];
+			for (i = 0, seriesIndex = 0; i < columns.length; seriesIndex++) {
+
+				// This series' value count
+				valueCount = Highcharts.pick(this.valueCount.individual[seriesIndex], this.valueCount.global);
+				
+				// Iterate down the cells of each column and add data to the series
+				data = [];
+				for (j = 0; j < columns[i].length; j++) {
+					data[j] = [
+						firstCol[j], 
+						columns[i][j] !== undefined ? columns[i][j] : null
+					];
+					if (valueCount > 1) {
+						data[j].push(columns[i + 1][j] !== undefined ? columns[i + 1][j] : null);
+					}
+					if (valueCount > 2) {
+						data[j].push(columns[i + 2][j] !== undefined ? columns[i + 2][j] : null);
+					}
+					if (valueCount > 3) {
+						data[j].push(columns[i + 3][j] !== undefined ? columns[i + 3][j] : null);
+					}
+					if (valueCount > 4) {
+						data[j].push(columns[i + 4][j] !== undefined ? columns[i + 4][j] : null);
+					}
+				}
+
+				// Add the series
+				series[seriesIndex] = {
+					name: columns[i].name,
+					data: data
+				};
+
+				i += valueCount;
+			}
+			
+			// Do the callback
+			options.complete({
+				xAxis: {
+					type: type
+				},
+				series: series
+			});
+		}
+	}
+	});
+	
+	// Register the Data prototype and data function on Highcharts
+	Highcharts.Data = Data;
+	Highcharts.data = function (options, chartOptions) {
+		return new Data(options, chartOptions);
+	};
+
+	// Extend Chart.init so that the Chart constructor accepts a new configuration
+	// option group, data.
+	Highcharts.wrap(Highcharts.Chart.prototype, 'init', function (proceed, userOptions, callback) {
+		var chart = this;
+
+		if (userOptions && userOptions.data) {
+			Highcharts.data(Highcharts.extend(userOptions.data, {
+				complete: function (dataOptions) {
+					
+					// Merge series configs
+					if (userOptions.series) {
+						each(userOptions.series, function (series, i) {
+							userOptions.series[i] = Highcharts.merge(series, dataOptions.series[i]);
+						});
+					}
+
+					// Do the merge
+					userOptions = Highcharts.merge(dataOptions, userOptions);
+
+					proceed.call(chart, userOptions, callback);
+				}
+			}), userOptions);
+		} else {
+			proceed.call(chart, userOptions, callback);
+		}
+	});
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/drilldown.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/drilldown.js
new file mode 100644
index 0000000..1df1acc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/drilldown.js
@@ -0,0 +1,11 @@
+(function(e){function q(b,a,c){return"rgba("+[Math.round(b[0]+(a[0]-b[0])*c),Math.round(b[1]+(a[1]-b[1])*c),Math.round(b[2]+(a[2]-b[2])*c),b[3]+(a[3]-b[3])*c].join(",")+")"}var m=function(){},j=e.getOptions(),g=e.each,n=e.extend,o=e.wrap,h=e.Chart,i=e.seriesTypes,k=i.pie,l=i.column,r=HighchartsAdapter.fireEvent;n(j.lang,{drillUpText:"◁ Back to {series.name}"});j.drilldown={activeAxisLabelStyle:{cursor:"pointer",color:"#039",fontWeight:"bold",textDecoration:"underline"},activeDataLabelStyle:{cursor:"pointer",
+color:"#039",fontWeight:"bold",textDecoration:"underline"},animation:{duration:500},drillUpButton:{position:{align:"right",x:-10,y:10}}};e.SVGRenderer.prototype.Element.prototype.fadeIn=function(){this.attr({opacity:0.1,visibility:"visible"}).animate({opacity:1},{duration:250})};h.prototype.drilldownLevels=[];h.prototype.addSeriesAsDrilldown=function(b,a){var c=b.series,d=c.xAxis,f=c.yAxis,e;e=b.color||c.color;var g,a=n({color:e},a);g=HighchartsAdapter.inArray(this,c.points);this.drilldownLevels.push({seriesOptions:c.userOptions,
+shapeArgs:b.shapeArgs,bBox:b.graphic.getBBox(),color:e,newSeries:a,pointOptions:c.options.data[g],pointIndex:g,oldExtremes:{xMin:d&&d.userMin,xMax:d&&d.userMax,yMin:f&&f.userMin,yMax:f&&f.userMax}});e=this.addSeries(a,!1);if(d)d.oldPos=d.pos,d.userMin=d.userMax=null,f.userMin=f.userMax=null;if(c.type===e.type)e.animate=e.animateDrilldown||m,e.options.animation=!0;c.remove(!1);this.redraw();this.showDrillUpButton()};h.prototype.getDrilldownBackText=function(){return this.options.lang.drillUpText.replace("{series.name}",
+this.drilldownLevels[this.drilldownLevels.length-1].seriesOptions.name)};h.prototype.showDrillUpButton=function(){var b=this,a=this.getDrilldownBackText(),c=b.options.drilldown.drillUpButton;this.drillUpButton?this.drillUpButton.attr({text:a}).align():this.drillUpButton=this.renderer.button(a,null,null,function(){b.drillUp()}).attr(n({align:c.position.align,zIndex:9},c.theme)).add().align(c.position,!1,c.relativeTo||"plotBox")};h.prototype.drillUp=function(){var b=this.drilldownLevels.pop(),a=this.series[0],
+c=b.oldExtremes,d=this.addSeries(b.seriesOptions,!1);r(this,"drillup",{seriesOptions:b.seriesOptions});if(d.type===a.type)d.drilldownLevel=b,d.animate=d.animateDrillupTo||m,d.options.animation=!0,a.animateDrillupFrom&&a.animateDrillupFrom(b);a.remove(!1);d.xAxis&&(d.xAxis.setExtremes(c.xMin,c.xMax,!1),d.yAxis.setExtremes(c.yMin,c.yMax,!1));this.redraw();this.drilldownLevels.length===0?this.drillUpButton=this.drillUpButton.destroy():this.drillUpButton.attr({text:this.getDrilldownBackText()}).align()};
+k.prototype.animateDrilldown=function(b){var a=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],c=this.chart.options.drilldown.animation,d=a.shapeArgs,f=d.start,s=(d.end-f)/this.points.length,h=e.Color(a.color).rgba;b||g(this.points,function(a,b){var g=e.Color(a.color).rgba;a.graphic.attr(e.merge(d,{start:f+b*s,end:f+(b+1)*s})).animate(a.shapeArgs,e.merge(c,{step:function(a,d){d.prop==="start"&&this.attr({fill:q(h,g,d.pos)})}}))})};k.prototype.animateDrillupTo=l.prototype.animateDrillupTo=
+function(b){if(!b){var a=this,c=a.drilldownLevel;g(this.points,function(a){a.graphic.hide();a.dataLabel&&a.dataLabel.hide();a.connector&&a.connector.hide()});setTimeout(function(){g(a.points,function(a,b){var e=b===c.pointIndex?"show":"fadeIn";a.graphic[e]();if(a.dataLabel)a.dataLabel[e]();if(a.connector)a.connector[e]()})},Math.max(this.chart.options.drilldown.animation.duration-50,0));this.animate=m}};l.prototype.animateDrilldown=function(b){var a=this.chart.drilldownLevels[this.chart.drilldownLevels.length-
+1].shapeArgs,c=this.chart.options.drilldown.animation;b||(a.x+=this.xAxis.oldPos-this.xAxis.pos,g(this.points,function(b){b.graphic.attr(a).animate(b.shapeArgs,c)}))};l.prototype.animateDrillupFrom=k.prototype.animateDrillupFrom=function(b){var a=this.chart.options.drilldown.animation,c=this.group;delete this.group;g(this.points,function(d){var f=d.graphic,g=e.Color(d.color).rgba;delete d.graphic;f.animate(b.shapeArgs,e.merge(a,{step:function(a,c){c.prop==="start"&&this.attr({fill:q(g,e.Color(b.color).rgba,
+c.pos)})},complete:function(){f.destroy();c&&(c=c.destroy())}}))})};e.Point.prototype.doDrilldown=function(){for(var b=this.series.chart,a=b.options.drilldown,c=a.series.length,d;c--&&!d;)a.series[c].id===this.drilldown&&(d=a.series[c]);r(b,"drilldown",{point:this,seriesOptions:d});d&&b.addSeriesAsDrilldown(this,d)};o(e.Point.prototype,"init",function(b,a,c,d){var f=b.call(this,a,c,d),b=a.chart,a=(a=a.xAxis&&a.xAxis.ticks[d])&&a.label;if(f.drilldown){if(e.addEvent(f,"click",function(){f.doDrilldown()}),
+a){if(!a._basicStyle)a._basicStyle=a.element.getAttribute("style");a.addClass("highcharts-drilldown-axis-label").css(b.options.drilldown.activeAxisLabelStyle).on("click",function(){f.doDrilldown&&f.doDrilldown()})}}else a&&a._basicStyle&&a.element.setAttribute("style",a._basicStyle);return f});o(e.Series.prototype,"drawDataLabels",function(b){var a=this.chart.options.drilldown.activeDataLabelStyle;b.call(this);g(this.points,function(b){if(b.drilldown&&b.dataLabel)b.dataLabel.attr({"class":"highcharts-drilldown-data-label"}).css(a).on("click",
+function(){b.doDrilldown()})})});l.prototype.supportsDrilldown=!0;k.prototype.supportsDrilldown=!0;var p,j=function(b){b.call(this);g(this.points,function(a){a.drilldown&&a.graphic&&a.graphic.attr({"class":"highcharts-drilldown-point"}).css({cursor:"pointer"})})};for(p in i)i[p].prototype.supportsDrilldown&&o(i[p].prototype,"drawTracker",j)})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/drilldown.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/drilldown.src.js
new file mode 100644
index 0000000..558aed4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/drilldown.src.js
@@ -0,0 +1,447 @@
+/**
+ * Highcharts Drilldown plugin
+ * 
+ * Author: Torstein Honsi
+ * Last revision: 2013-02-18
+ * License: MIT License
+ *
+ * Demo: http://jsfiddle.net/highcharts/Vf3yT/
+ */
+
+/*global HighchartsAdapter*/
+(function (H) {
+
+	"use strict";
+
+	var noop = function () {},
+		defaultOptions = H.getOptions(),
+		each = H.each,
+		extend = H.extend,
+		wrap = H.wrap,
+		Chart = H.Chart,
+		seriesTypes = H.seriesTypes,
+		PieSeries = seriesTypes.pie,
+		ColumnSeries = seriesTypes.column,
+		fireEvent = HighchartsAdapter.fireEvent;
+
+	// Utilities
+	function tweenColors(startColor, endColor, pos) {
+		var rgba = [
+				Math.round(startColor[0] + (endColor[0] - startColor[0]) * pos),
+				Math.round(startColor[1] + (endColor[1] - startColor[1]) * pos),
+				Math.round(startColor[2] + (endColor[2] - startColor[2]) * pos),
+				startColor[3] + (endColor[3] - startColor[3]) * pos
+			];
+		return 'rgba(' + rgba.join(',') + ')';
+	}
+
+	// Add language
+	extend(defaultOptions.lang, {
+		drillUpText: '◁ Back to {series.name}'
+	});
+	defaultOptions.drilldown = {
+		activeAxisLabelStyle: {
+			cursor: 'pointer',
+			color: '#039',
+			fontWeight: 'bold',
+			textDecoration: 'underline'			
+		},
+		activeDataLabelStyle: {
+			cursor: 'pointer',
+			color: '#039',
+			fontWeight: 'bold',
+			textDecoration: 'underline'			
+		},
+		animation: {
+			duration: 500
+		},
+		drillUpButton: {
+			position: { 
+				align: 'right',
+				x: -10,
+				y: 10
+			}
+			// relativeTo: 'plotBox'
+			// theme
+		}
+	};	
+
+	/**
+	 * A general fadeIn method
+	 */
+	H.SVGRenderer.prototype.Element.prototype.fadeIn = function () {
+		this
+		.attr({
+			opacity: 0.1,
+			visibility: 'visible'
+		})
+		.animate({
+			opacity: 1
+		}, {
+			duration: 250
+		});
+	};
+
+	// Extend the Chart prototype
+	Chart.prototype.drilldownLevels = [];
+
+	Chart.prototype.addSeriesAsDrilldown = function (point, ddOptions) {
+		var oldSeries = point.series,
+			xAxis = oldSeries.xAxis,
+			yAxis = oldSeries.yAxis,
+			newSeries,
+			color = point.color || oldSeries.color,
+			pointIndex,
+			level;
+			
+		ddOptions = extend({
+			color: color
+		}, ddOptions);
+		pointIndex = HighchartsAdapter.inArray(this, oldSeries.points);
+		level = {
+			seriesOptions: oldSeries.userOptions,
+			shapeArgs: point.shapeArgs,
+			bBox: point.graphic.getBBox(),
+			color: color,
+			newSeries: ddOptions,
+			pointOptions: oldSeries.options.data[pointIndex],
+			pointIndex: pointIndex,
+			oldExtremes: {
+				xMin: xAxis && xAxis.userMin,
+				xMax: xAxis && xAxis.userMax,
+				yMin: yAxis && yAxis.userMin,
+				yMax: yAxis && yAxis.userMax
+			}
+		};
+
+		this.drilldownLevels.push(level);
+
+		newSeries = this.addSeries(ddOptions, false);
+		if (xAxis) {
+			xAxis.oldPos = xAxis.pos;
+			xAxis.userMin = xAxis.userMax = null;
+			yAxis.userMin = yAxis.userMax = null;
+		}
+
+		// Run fancy cross-animation on supported and equal types
+		if (oldSeries.type === newSeries.type) {
+			newSeries.animate = newSeries.animateDrilldown || noop;
+			newSeries.options.animation = true;
+		}
+		
+		oldSeries.remove(false);
+		
+		this.redraw();
+		this.showDrillUpButton();
+	};
+
+	Chart.prototype.getDrilldownBackText = function () {
+		var lastLevel = this.drilldownLevels[this.drilldownLevels.length - 1];
+
+		return this.options.lang.drillUpText.replace('{series.name}', lastLevel.seriesOptions.name);
+
+	};
+
+	Chart.prototype.showDrillUpButton = function () {
+		var chart = this,
+			backText = this.getDrilldownBackText(),
+			buttonOptions = chart.options.drilldown.drillUpButton;
+			
+
+		if (!this.drillUpButton) {
+			this.drillUpButton = this.renderer.button(
+				backText,
+				null,
+				null,
+				function () {
+					chart.drillUp(); 
+				}
+			)
+			.attr(extend({
+				align: buttonOptions.position.align,
+				zIndex: 9
+			}, buttonOptions.theme))
+			.add()
+			.align(buttonOptions.position, false, buttonOptions.relativeTo || 'plotBox');
+		} else {
+			this.drillUpButton.attr({
+				text: backText
+			})
+			.align();
+		}
+	};
+
+	Chart.prototype.drillUp = function () {
+		var chart = this,
+			level = chart.drilldownLevels.pop(),
+			oldSeries = chart.series[0],
+			oldExtremes = level.oldExtremes,
+			newSeries = chart.addSeries(level.seriesOptions, false);
+		
+		fireEvent(chart, 'drillup', { seriesOptions: level.seriesOptions });
+
+		if (newSeries.type === oldSeries.type) {
+			newSeries.drilldownLevel = level;
+			newSeries.animate = newSeries.animateDrillupTo || noop;
+			newSeries.options.animation = true;
+
+			if (oldSeries.animateDrillupFrom) {
+				oldSeries.animateDrillupFrom(level);
+			}
+		}
+
+		oldSeries.remove(false);
+
+		// Reset the zoom level of the upper series
+		if (newSeries.xAxis) {
+			newSeries.xAxis.setExtremes(oldExtremes.xMin, oldExtremes.xMax, false);
+			newSeries.yAxis.setExtremes(oldExtremes.yMin, oldExtremes.yMax, false);
+		}
+
+
+		this.redraw();
+
+		if (this.drilldownLevels.length === 0) {
+			this.drillUpButton = this.drillUpButton.destroy();
+		} else {
+			this.drillUpButton.attr({
+				text: this.getDrilldownBackText()
+			})
+			.align();
+		}
+	};
+
+	PieSeries.prototype.animateDrilldown = function (init) {
+		var level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],
+			animationOptions = this.chart.options.drilldown.animation,
+			animateFrom = level.shapeArgs,
+			start = animateFrom.start,
+			angle = animateFrom.end - start,
+			startAngle = angle / this.points.length,
+			startColor = H.Color(level.color).rgba;
+
+		if (!init) {
+			each(this.points, function (point, i) {
+				var endColor = H.Color(point.color).rgba;
+
+				/*jslint unparam: true*/
+				point.graphic
+					.attr(H.merge(animateFrom, {
+						start: start + i * startAngle,
+						end: start + (i + 1) * startAngle
+					}))
+					.animate(point.shapeArgs, H.merge(animationOptions, {
+						step: function (val, fx) {
+							if (fx.prop === 'start') {
+								this.attr({
+									fill: tweenColors(startColor, endColor, fx.pos)
+								});
+							}
+						}
+					}));
+				/*jslint unparam: false*/
+			});
+		}
+	};
+
+
+	/**
+	 * When drilling up, keep the upper series invisible until the lower series has
+	 * moved into place
+	 */
+	PieSeries.prototype.animateDrillupTo = 
+			ColumnSeries.prototype.animateDrillupTo = function (init) {
+		if (!init) {
+			var newSeries = this,
+				level = newSeries.drilldownLevel;
+
+			each(this.points, function (point) {
+				point.graphic.hide();
+				if (point.dataLabel) {
+					point.dataLabel.hide();
+				}
+				if (point.connector) {
+					point.connector.hide();
+				}
+			});
+
+
+			// Do dummy animation on first point to get to complete
+			setTimeout(function () {
+				each(newSeries.points, function (point, i) {  
+					// Fade in other points			  
+					var verb = i === level.pointIndex ? 'show' : 'fadeIn';
+					point.graphic[verb]();
+					if (point.dataLabel) {
+						point.dataLabel[verb]();
+					}
+					if (point.connector) {
+						point.connector[verb]();
+					}
+				});
+			}, Math.max(this.chart.options.drilldown.animation.duration - 50, 0));
+
+			// Reset
+			this.animate = noop;
+		}
+
+	};
+	
+	ColumnSeries.prototype.animateDrilldown = function (init) {
+		var animateFrom = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1].shapeArgs,
+			animationOptions = this.chart.options.drilldown.animation;
+			
+		if (!init) {
+
+			animateFrom.x += (this.xAxis.oldPos - this.xAxis.pos);
+	
+			each(this.points, function (point) {
+				point.graphic
+					.attr(animateFrom)
+					.animate(point.shapeArgs, animationOptions);
+			});
+		}
+		
+	};
+
+	/**
+	 * When drilling up, pull out the individual point graphics from the lower series
+	 * and animate them into the origin point in the upper series.
+	 */
+	ColumnSeries.prototype.animateDrillupFrom = 
+		PieSeries.prototype.animateDrillupFrom =
+	function (level) {
+		var animationOptions = this.chart.options.drilldown.animation,
+			group = this.group;
+
+		delete this.group;
+		each(this.points, function (point) {
+			var graphic = point.graphic,
+				startColor = H.Color(point.color).rgba;
+
+			delete point.graphic;
+
+			/*jslint unparam: true*/
+			graphic.animate(level.shapeArgs, H.merge(animationOptions, {
+
+				step: function (val, fx) {
+					if (fx.prop === 'start') {
+						this.attr({
+							fill: tweenColors(startColor, H.Color(level.color).rgba, fx.pos)
+						});
+					}
+				},
+				complete: function () {
+					graphic.destroy();
+					if (group) {
+						group = group.destroy();
+					}
+				}
+			}));
+			/*jslint unparam: false*/
+		});
+	};
+	
+	H.Point.prototype.doDrilldown = function () {
+		var series = this.series,
+			chart = series.chart,
+			drilldown = chart.options.drilldown,
+			i = drilldown.series.length,
+			seriesOptions;
+		
+		while (i-- && !seriesOptions) {
+			if (drilldown.series[i].id === this.drilldown) {
+				seriesOptions = drilldown.series[i];
+			}
+		}
+
+		// Fire the event. If seriesOptions is undefined, the implementer can check for 
+		// seriesOptions, and call addSeriesAsDrilldown async if necessary.
+		fireEvent(chart, 'drilldown', { 
+			point: this,
+			seriesOptions: seriesOptions
+		});
+		
+		if (seriesOptions) {
+			chart.addSeriesAsDrilldown(this, seriesOptions);
+		}
+
+	};
+	
+	wrap(H.Point.prototype, 'init', function (proceed, series, options, x) {
+		var point = proceed.call(this, series, options, x),
+			chart = series.chart,
+			tick = series.xAxis && series.xAxis.ticks[x],
+			tickLabel = tick && tick.label;
+		
+		if (point.drilldown) {
+			
+			// Add the click event to the point label
+			H.addEvent(point, 'click', function () {
+				point.doDrilldown();
+			});
+			
+			// Make axis labels clickable
+			if (tickLabel) {
+				if (!tickLabel._basicStyle) {
+					tickLabel._basicStyle = tickLabel.element.getAttribute('style');
+				}
+				tickLabel
+					.addClass('highcharts-drilldown-axis-label')
+					.css(chart.options.drilldown.activeAxisLabelStyle)
+					.on('click', function () {
+						if (point.doDrilldown) {
+							point.doDrilldown();
+						}
+					});
+					
+			}
+		} else if (tickLabel && tickLabel._basicStyle) {
+			tickLabel.element.setAttribute('style', tickLabel._basicStyle);
+		}
+		
+		return point;
+	});
+
+	wrap(H.Series.prototype, 'drawDataLabels', function (proceed) {
+		var css = this.chart.options.drilldown.activeDataLabelStyle;
+
+		proceed.call(this);
+
+		each(this.points, function (point) {
+			if (point.drilldown && point.dataLabel) {
+				point.dataLabel
+					.attr({
+						'class': 'highcharts-drilldown-data-label'
+					})
+					.css(css)
+					.on('click', function () {
+						point.doDrilldown();
+					});
+			}
+		});
+	});
+
+	// Mark the trackers with a pointer 
+	ColumnSeries.prototype.supportsDrilldown = true;
+	PieSeries.prototype.supportsDrilldown = true;
+	var type, 
+		drawTrackerWrapper = function (proceed) {
+			proceed.call(this);
+			each(this.points, function (point) {
+				if (point.drilldown && point.graphic) {
+					point.graphic
+						.attr({
+							'class': 'highcharts-drilldown-point'
+						})
+						.css({ cursor: 'pointer' });
+				}
+			});
+		};
+	for (type in seriesTypes) {
+		if (seriesTypes[type].prototype.supportsDrilldown) {
+			wrap(seriesTypes[type].prototype, 'drawTracker', drawTrackerWrapper);
+		}
+	}
+		
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/exporting.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/exporting.js
new file mode 100644
index 0000000..8ec202c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/exporting.js
@@ -0,0 +1,22 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+ Exporting module
+
+ (c) 2010-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(f){var A=f.Chart,t=f.addEvent,C=f.removeEvent,k=f.createElement,n=f.discardElement,u=f.css,o=f.merge,r=f.each,p=f.extend,D=Math.max,j=document,B=window,E=f.isTouchDevice,F=f.Renderer.prototype.symbols,x=f.getOptions(),y;p(x.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"});x.navigation={menuStyle:{border:"1px solid #A0A0A0",
+background:"#FFFFFF",padding:"5px 0"},menuItemStyle:{padding:"0 10px",background:"none",color:"#303030",fontSize:E?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{symbolFill:"#E0E0E0",symbolSize:14,symbolStroke:"#666",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,theme:{fill:"white",stroke:"none"},verticalAlign:"top",width:24}};x.exporting={type:"image/png",url:"http://export.highcharts.com/",buttons:{contextButton:{menuClassName:"highcharts-contextmenu",
+symbol:"menu",_titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}};f.post=function(c,a){var d,b;b=k("form",{method:"post",
+action:c,enctype:"multipart/form-data"},{display:"none"},j.body);for(d in a)k("input",{type:"hidden",name:d,value:a[d]},null,b);b.submit();n(b)};p(A.prototype,{getSVG:function(c){var a=this,d,b,z,h,g=o(a.options,c);if(!j.createElementNS)j.createElementNS=function(a,b){return j.createElement(b)};c=k("div",null,{position:"absolute",top:"-9999em",width:a.chartWidth+"px",height:a.chartHeight+"px"},j.body);b=a.renderTo.style.width;h=a.renderTo.style.height;b=g.exporting.sourceWidth||g.chart.width||/px$/.test(b)&&
+parseInt(b,10)||600;h=g.exporting.sourceHeight||g.chart.height||/px$/.test(h)&&parseInt(h,10)||400;p(g.chart,{animation:!1,renderTo:c,forExport:!0,width:b,height:h});g.exporting.enabled=!1;g.series=[];r(a.series,function(a){z=o(a.options,{animation:!1,showCheckbox:!1,visible:a.visible});z.isInternal||g.series.push(z)});d=new f.Chart(g,a.callback);r(["xAxis","yAxis"],function(b){r(a[b],function(a,c){var g=d[b][c],f=a.getExtremes(),h=f.userMin,f=f.userMax;g&&(h!==void 0||f!==void 0)&&g.setExtremes(h,
+f,!0,!1)})});b=d.container.innerHTML;g=null;d.destroy();n(c);b=b.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ href=/g," xlink:href=").replace(/\n/," ").replace(/<\/svg>.*?$/,"</svg>").replace(/&nbsp;/g," ").replace(/&shy;/g,"­").replace(/<IMG /g,"<image ").replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g,
+'width="$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href="$1"/>').replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" >]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()});return b=b.replace(/(url\(#highcharts-[0-9]+)&quot;/g,"$1").replace(/&quot;/g,"'")},exportChart:function(c,a){var c=c||{},d=this.options.exporting,d=this.getSVG(o({chart:{borderRadius:0}},d.chartOptions,a,{exporting:{sourceWidth:c.sourceWidth||
+d.sourceWidth,sourceHeight:c.sourceHeight||d.sourceHeight}})),c=o(this.options.exporting,c);f.post(c.url,{filename:c.filename||"chart",type:c.type,width:c.width||0,scale:c.scale||2,svg:d})},print:function(){var c=this,a=c.container,d=[],b=a.parentNode,f=j.body,h=f.childNodes;if(!c.isPrinting)c.isPrinting=!0,r(h,function(a,b){if(a.nodeType===1)d[b]=a.style.display,a.style.display="none"}),f.appendChild(a),B.focus(),B.print(),setTimeout(function(){b.appendChild(a);r(h,function(a,b){if(a.nodeType===
+1)a.style.display=d[b]});c.isPrinting=!1},1E3)},contextMenu:function(c,a,d,b,f,h,g){var e=this,j=e.options.navigation,q=j.menuItemStyle,l=e.chartWidth,m=e.chartHeight,o="cache-"+c,i=e[o],s=D(f,h),v,w,n;if(!i)e[o]=i=k("div",{className:c},{position:"absolute",zIndex:1E3,padding:s+"px"},e.container),v=k("div",null,p({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},j.menuStyle),i),w=function(){u(i,{display:"none"});g&&g.setState(0);e.openMenu=!1},t(i,
+"mouseleave",function(){n=setTimeout(w,500)}),t(i,"mouseenter",function(){clearTimeout(n)}),t(document,"mousedown",function(a){e.pointer.inClass(a.target,c)||w()}),r(a,function(a){if(a){var b=a.separator?k("hr",null,null,v):k("div",{onmouseover:function(){u(this,j.menuItemHoverStyle)},onmouseout:function(){u(this,q)},onclick:function(){w();a.onclick.apply(e,arguments)},innerHTML:a.text||e.options.lang[a.textKey]},p({cursor:"pointer"},q),v);e.exportDivElements.push(b)}}),e.exportDivElements.push(v,
+i),e.exportMenuWidth=i.offsetWidth,e.exportMenuHeight=i.offsetHeight;a={display:"block"};d+e.exportMenuWidth>l?a.right=l-d-f-s+"px":a.left=d-s+"px";b+h+e.exportMenuHeight>m&&g.alignOptions.verticalAlign!=="top"?a.bottom=m-b-s+"px":a.top=b+h-s+"px";u(i,a);e.openMenu=!0},addButton:function(c){var a=this,d=a.renderer,b=o(a.options.navigation.buttonOptions,c),j=b.onclick,h=b.menuItems,g,e,k={stroke:b.symbolStroke,fill:b.symbolFill},q=b.symbolSize||12;if(!a.btnCount)a.btnCount=0;if(!a.exportDivElements)a.exportDivElements=
+[],a.exportSVGElements=[];if(b.enabled!==!1){var l=b.theme,m=l.states,n=m&&m.hover,m=m&&m.select,i;delete l.states;j?i=function(){j.apply(a,arguments)}:h&&(i=function(){a.contextMenu(e.menuClassName,h,e.translateX,e.translateY,e.width,e.height,e);e.setState(2)});b.text&&b.symbol?l.paddingLeft=f.pick(l.paddingLeft,25):b.text||p(l,{width:b.width,height:b.height,padding:0});e=d.button(b.text,0,0,i,l,n,m).attr({title:a.options.lang[b._titleKey],"stroke-linecap":"round"});e.menuClassName=c.menuClassName||
+"highcharts-menu-"+a.btnCount++;b.symbol&&(g=d.symbol(b.symbol,b.symbolX-q/2,b.symbolY-q/2,q,q).attr(p(k,{"stroke-width":b.symbolStrokeWidth||1,zIndex:1})).add(e));e.add().align(p(b,{width:e.width,x:f.pick(b.x,y)}),!0,"spacingBox");y+=(e.width+b.buttonSpacing)*(b.align==="right"?-1:1);a.exportSVGElements.push(e,g)}},destroyExport:function(c){var c=c.target,a,d;for(a=0;a<c.exportSVGElements.length;a++)if(d=c.exportSVGElements[a])d.onclick=d.ontouchstart=null,c.exportSVGElements[a]=d.destroy();for(a=
+0;a<c.exportDivElements.length;a++)d=c.exportDivElements[a],C(d,"mouseleave"),c.exportDivElements[a]=d.onmouseout=d.onmouseover=d.ontouchstart=d.onclick=null,n(d)}});F.menu=function(c,a,d,b){return["M",c,a+2.5,"L",c+d,a+2.5,"M",c,a+b/2+0.5,"L",c+d,a+b/2+0.5,"M",c,a+b-1.5,"L",c+d,a+b-1.5]};A.prototype.callbacks.push(function(c){var a,d=c.options.exporting,b=d.buttons;y=0;if(d.enabled!==!1){for(a in b)c.addButton(b[a]);t(c,"destroy",c.destroyExport)}})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/exporting.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/exporting.src.js
new file mode 100644
index 0000000..dfc825c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/exporting.src.js
@@ -0,0 +1,709 @@
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ * Exporting module
+ *
+ * (c) 2010-2013 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+// JSLint options:
+/*global Highcharts, document, window, Math, setTimeout */
+
+(function (Highcharts) { // encapsulate
+
+// create shortcuts
+var Chart = Highcharts.Chart,
+	addEvent = Highcharts.addEvent,
+	removeEvent = Highcharts.removeEvent,
+	createElement = Highcharts.createElement,
+	discardElement = Highcharts.discardElement,
+	css = Highcharts.css,
+	merge = Highcharts.merge,
+	each = Highcharts.each,
+	extend = Highcharts.extend,
+	math = Math,
+	mathMax = math.max,
+	doc = document,
+	win = window,
+	isTouchDevice = Highcharts.isTouchDevice,
+	M = 'M',
+	L = 'L',
+	DIV = 'div',
+	HIDDEN = 'hidden',
+	NONE = 'none',
+	PREFIX = 'highcharts-',
+	ABSOLUTE = 'absolute',
+	PX = 'px',
+	UNDEFINED,
+	symbols = Highcharts.Renderer.prototype.symbols,
+	defaultOptions = Highcharts.getOptions(),
+	buttonOffset;
+
+	// Add language
+	extend(defaultOptions.lang, {
+		printChart: 'Print chart',
+		downloadPNG: 'Download PNG image',
+		downloadJPEG: 'Download JPEG image',
+		downloadPDF: 'Download PDF document',
+		downloadSVG: 'Download SVG vector image',
+		contextButtonTitle: 'Chart context menu'
+	});
+
+// Buttons and menus are collected in a separate config option set called 'navigation'.
+// This can be extended later to add control buttons like zoom and pan right click menus.
+defaultOptions.navigation = {
+	menuStyle: {
+		border: '1px solid #A0A0A0',
+		background: '#FFFFFF',
+		padding: '5px 0'
+	},
+	menuItemStyle: {
+		padding: '0 10px',
+		background: NONE,
+		color: '#303030',
+		fontSize: isTouchDevice ? '14px' : '11px'
+	},
+	menuItemHoverStyle: {
+		background: '#4572A5',
+		color: '#FFFFFF'
+	},
+
+	buttonOptions: {
+		symbolFill: '#E0E0E0',
+		symbolSize: 14,
+		symbolStroke: '#666',
+		symbolStrokeWidth: 3,
+		symbolX: 12.5,
+		symbolY: 10.5,
+		align: 'right',
+		buttonSpacing: 3, 
+		height: 22,
+		// text: null,
+		theme: {
+			fill: 'white', // capture hover
+			stroke: 'none'
+		},
+		verticalAlign: 'top',
+		width: 24
+	}
+};
+
+
+
+// Add the export related options
+defaultOptions.exporting = {
+	//enabled: true,
+	//filename: 'chart',
+	type: 'image/png',
+	url: 'http://export.highcharts.com/',
+	//width: undefined,
+	//scale: 2
+	buttons: {
+		contextButton: {
+			menuClassName: PREFIX + 'contextmenu',
+			//x: -10,
+			symbol: 'menu',
+			_titleKey: 'contextButtonTitle',
+			menuItems: [{
+				textKey: 'printChart',
+				onclick: function () {
+					this.print();
+				}
+			}, {
+				separator: true
+			}, {
+				textKey: 'downloadPNG',
+				onclick: function () {
+					this.exportChart();
+				}
+			}, {
+				textKey: 'downloadJPEG',
+				onclick: function () {
+					this.exportChart({
+						type: 'image/jpeg'
+					});
+				}
+			}, {
+				textKey: 'downloadPDF',
+				onclick: function () {
+					this.exportChart({
+						type: 'application/pdf'
+					});
+				}
+			}, {
+				textKey: 'downloadSVG',
+				onclick: function () {
+					this.exportChart({
+						type: 'image/svg+xml'
+					});
+				}
+			}
+			// Enable this block to add "View SVG" to the dropdown menu
+			/*
+			,{
+
+				text: 'View SVG',
+				onclick: function () {
+					var svg = this.getSVG()
+						.replace(/</g, '\n&lt;')
+						.replace(/>/g, '&gt;');
+
+					doc.body.innerHTML = '<pre>' + svg + '</pre>';
+				}
+			} // */
+			]
+		}
+	}
+};
+
+// Add the Highcharts.post utility
+Highcharts.post = function (url, data) {
+	var name,
+		form;
+	
+	// create the form
+	form = createElement('form', {
+		method: 'post',
+		action: url,
+		enctype: 'multipart/form-data'
+	}, {
+		display: NONE
+	}, doc.body);
+
+	// add the data
+	for (name in data) {
+		createElement('input', {
+			type: HIDDEN,
+			name: name,
+			value: data[name]
+		}, null, form);
+	}
+
+	// submit
+	form.submit();
+
+	// clean up
+	discardElement(form);
+};
+
+extend(Chart.prototype, {
+
+	/**
+	 * Return an SVG representation of the chart
+	 *
+	 * @param additionalOptions {Object} Additional chart options for the generated SVG representation
+	 */
+	getSVG: function (additionalOptions) {
+		var chart = this,
+			chartCopy,
+			sandbox,
+			svg,
+			seriesOptions,
+			sourceWidth,
+			sourceHeight,
+			cssWidth,
+			cssHeight,
+			options = merge(chart.options, additionalOptions); // copy the options and add extra options
+
+		// IE compatibility hack for generating SVG content that it doesn't really understand
+		if (!doc.createElementNS) {
+			/*jslint unparam: true*//* allow unused parameter ns in function below */
+			doc.createElementNS = function (ns, tagName) {
+				return doc.createElement(tagName);
+			};
+			/*jslint unparam: false*/
+		}
+
+		// create a sandbox where a new chart will be generated
+		sandbox = createElement(DIV, null, {
+			position: ABSOLUTE,
+			top: '-9999em',
+			width: chart.chartWidth + PX,
+			height: chart.chartHeight + PX
+		}, doc.body);
+		
+		// get the source size
+		cssWidth = chart.renderTo.style.width;
+		cssHeight = chart.renderTo.style.height;
+		sourceWidth = options.exporting.sourceWidth ||
+			options.chart.width ||
+			(/px$/.test(cssWidth) && parseInt(cssWidth, 10)) ||
+			600;
+		sourceHeight = options.exporting.sourceHeight ||
+			options.chart.height ||
+			(/px$/.test(cssHeight) && parseInt(cssHeight, 10)) ||
+			400;
+
+		// override some options
+		extend(options.chart, {
+			animation: false,
+			renderTo: sandbox,
+			forExport: true,
+			width: sourceWidth,
+			height: sourceHeight
+		});
+		options.exporting.enabled = false; // hide buttons in print
+		
+		// prepare for replicating the chart
+		options.series = [];
+		each(chart.series, function (serie) {
+			seriesOptions = merge(serie.options, {
+				animation: false, // turn off animation
+				showCheckbox: false,
+				visible: serie.visible
+			});
+
+			if (!seriesOptions.isInternal) { // used for the navigator series that has its own option set
+				options.series.push(seriesOptions);
+			}
+		});
+
+		// generate the chart copy
+		chartCopy = new Highcharts.Chart(options, chart.callback);
+
+		// reflect axis extremes in the export
+		each(['xAxis', 'yAxis'], function (axisType) {
+			each(chart[axisType], function (axis, i) {
+				var axisCopy = chartCopy[axisType][i],
+					extremes = axis.getExtremes(),
+					userMin = extremes.userMin,
+					userMax = extremes.userMax;
+
+				if (axisCopy && (userMin !== UNDEFINED || userMax !== UNDEFINED)) {
+					axisCopy.setExtremes(userMin, userMax, true, false);
+				}
+			});
+		});
+
+		// get the SVG from the container's innerHTML
+		svg = chartCopy.container.innerHTML;
+
+		// free up memory
+		options = null;
+		chartCopy.destroy();
+		discardElement(sandbox);
+
+		// sanitize
+		svg = svg
+			.replace(/zIndex="[^"]+"/g, '')
+			.replace(/isShadow="[^"]+"/g, '')
+			.replace(/symbolName="[^"]+"/g, '')
+			.replace(/jQuery[0-9]+="[^"]+"/g, '')
+			.replace(/url\([^#]+#/g, 'url(#')
+			.replace(/<svg /, '<svg xmlns:xlink="http://www.w3.org/1999/xlink" ')
+			.replace(/ href=/g, ' xlink:href=')
+			.replace(/\n/, ' ')
+			.replace(/<\/svg>.*?$/, '</svg>') // any HTML added to the container after the SVG (#894)
+			/* This fails in IE < 8
+			.replace(/([0-9]+)\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight
+				return s2 +'.'+ s3[0];
+			})*/
+
+			// Replace HTML entities, issue #347
+			.replace(/&nbsp;/g, '\u00A0') // no-break space
+			.replace(/&shy;/g,  '\u00AD') // soft hyphen
+
+			// IE specific
+			.replace(/<IMG /g, '<image ')
+			.replace(/height=([^" ]+)/g, 'height="$1"')
+			.replace(/width=([^" ]+)/g, 'width="$1"')
+			.replace(/hc-svg-href="([^"]+)">/g, 'xlink:href="$1"/>')
+			.replace(/id=([^" >]+)/g, 'id="$1"')
+			.replace(/class=([^" >]+)/g, 'class="$1"')
+			.replace(/ transform /g, ' ')
+			.replace(/:(path|rect)/g, '$1')
+			.replace(/style="([^"]+)"/g, function (s) {
+				return s.toLowerCase();
+			});
+
+		// IE9 beta bugs with innerHTML. Test again with final IE9.
+		svg = svg.replace(/(url\(#highcharts-[0-9]+)&quot;/g, '$1')
+			.replace(/&quot;/g, "'");
+
+		return svg;
+	},
+
+	/**
+	 * Submit the SVG representation of the chart to the server
+	 * @param {Object} options Exporting options. Possible members are url, type and width.
+	 * @param {Object} chartOptions Additional chart options for the SVG representation of the chart
+	 */
+	exportChart: function (options, chartOptions) {
+		options = options || {};
+		
+		var chart = this,
+			chartExportingOptions = chart.options.exporting,
+			svg = chart.getSVG(merge(
+				{ chart: { borderRadius: 0 } },
+				chartExportingOptions.chartOptions,
+				chartOptions, 
+				{
+					exporting: {
+						sourceWidth: options.sourceWidth || chartExportingOptions.sourceWidth,
+						sourceHeight: options.sourceHeight || chartExportingOptions.sourceHeight
+					}
+				}
+			));
+
+		// merge the options
+		options = merge(chart.options.exporting, options);
+		
+		// do the post
+		Highcharts.post(options.url, {
+			filename: options.filename || 'chart',
+			type: options.type,
+			width: options.width || 0, // IE8 fails to post undefined correctly, so use 0
+			scale: options.scale || 2,
+			svg: svg
+		});
+
+	},
+	
+	/**
+	 * Print the chart
+	 */
+	print: function () {
+
+		var chart = this,
+			container = chart.container,
+			origDisplay = [],
+			origParent = container.parentNode,
+			body = doc.body,
+			childNodes = body.childNodes;
+
+		if (chart.isPrinting) { // block the button while in printing mode
+			return;
+		}
+
+		chart.isPrinting = true;
+
+		// hide all body content
+		each(childNodes, function (node, i) {
+			if (node.nodeType === 1) {
+				origDisplay[i] = node.style.display;
+				node.style.display = NONE;
+			}
+		});
+
+		// pull out the chart
+		body.appendChild(container);
+
+		// print
+		win.focus(); // #1510
+		win.print();
+
+		// allow the browser to prepare before reverting
+		setTimeout(function () {
+
+			// put the chart back in
+			origParent.appendChild(container);
+
+			// restore all body content
+			each(childNodes, function (node, i) {
+				if (node.nodeType === 1) {
+					node.style.display = origDisplay[i];
+				}
+			});
+
+			chart.isPrinting = false;
+
+		}, 1000);
+
+	},
+
+	/**
+	 * Display a popup menu for choosing the export type
+	 *
+	 * @param {String} className An identifier for the menu
+	 * @param {Array} items A collection with text and onclicks for the items
+	 * @param {Number} x The x position of the opener button
+	 * @param {Number} y The y position of the opener button
+	 * @param {Number} width The width of the opener button
+	 * @param {Number} height The height of the opener button
+	 */
+	contextMenu: function (className, items, x, y, width, height, button) {
+		var chart = this,
+			navOptions = chart.options.navigation,
+			menuItemStyle = navOptions.menuItemStyle,
+			chartWidth = chart.chartWidth,
+			chartHeight = chart.chartHeight,
+			cacheName = 'cache-' + className,
+			menu = chart[cacheName],
+			menuPadding = mathMax(width, height), // for mouse leave detection
+			boxShadow = '3px 3px 10px #888',
+			innerMenu,
+			hide,
+			hideTimer,
+			menuStyle;
+
+		// create the menu only the first time
+		if (!menu) {
+
+			// create a HTML element above the SVG
+			chart[cacheName] = menu = createElement(DIV, {
+				className: className
+			}, {
+				position: ABSOLUTE,
+				zIndex: 1000,
+				padding: menuPadding + PX
+			}, chart.container);
+
+			innerMenu = createElement(DIV, null,
+				extend({
+					MozBoxShadow: boxShadow,
+					WebkitBoxShadow: boxShadow,
+					boxShadow: boxShadow
+				}, navOptions.menuStyle), menu);
+
+			// hide on mouse out
+			hide = function () {
+				css(menu, { display: NONE });
+				if (button) {
+					button.setState(0);
+				}
+				chart.openMenu = false;
+			};
+
+			// Hide the menu some time after mouse leave (#1357)
+			addEvent(menu, 'mouseleave', function () {
+				hideTimer = setTimeout(hide, 500);
+			});
+			addEvent(menu, 'mouseenter', function () {
+				clearTimeout(hideTimer);
+			});
+			// Hide it on clicking or touching outside the menu (#2258)
+			addEvent(document, 'mousedown', function (e) {
+				if (!chart.pointer.inClass(e.target, className)) {
+					hide();
+				}
+			});
+
+
+			// create the items
+			each(items, function (item) {
+				if (item) {
+					var element = item.separator ? 
+						createElement('hr', null, null, innerMenu) :
+						createElement(DIV, {
+							onmouseover: function () {
+								css(this, navOptions.menuItemHoverStyle);
+							},
+							onmouseout: function () {
+								css(this, menuItemStyle);
+							},
+							onclick: function () {
+								hide();
+								item.onclick.apply(chart, arguments);
+							},
+							innerHTML: item.text || chart.options.lang[item.textKey]
+						}, extend({
+							cursor: 'pointer'
+						}, menuItemStyle), innerMenu);
+
+
+					// Keep references to menu divs to be able to destroy them
+					chart.exportDivElements.push(element);
+				}
+			});
+
+			// Keep references to menu and innerMenu div to be able to destroy them
+			chart.exportDivElements.push(innerMenu, menu);
+
+			chart.exportMenuWidth = menu.offsetWidth;
+			chart.exportMenuHeight = menu.offsetHeight;
+		}
+
+		menuStyle = { display: 'block' };
+
+		// if outside right, right align it
+		if (x + chart.exportMenuWidth > chartWidth) {
+			menuStyle.right = (chartWidth - x - width - menuPadding) + PX;
+		} else {
+			menuStyle.left = (x - menuPadding) + PX;
+		}
+		// if outside bottom, bottom align it
+		if (y + height + chart.exportMenuHeight > chartHeight && button.alignOptions.verticalAlign !== 'top') {
+			menuStyle.bottom = (chartHeight - y - menuPadding)  + PX;
+		} else {
+			menuStyle.top = (y + height - menuPadding) + PX;
+		}
+
+		css(menu, menuStyle);
+		chart.openMenu = true;
+	},
+
+	/**
+	 * Add the export button to the chart
+	 */
+	addButton: function (options) {
+		var chart = this,
+			renderer = chart.renderer,
+			btnOptions = merge(chart.options.navigation.buttonOptions, options),
+			onclick = btnOptions.onclick,
+			menuItems = btnOptions.menuItems,
+			symbol,
+			button,
+			symbolAttr = {
+				stroke: btnOptions.symbolStroke,
+				fill: btnOptions.symbolFill
+			},
+			symbolSize = btnOptions.symbolSize || 12;
+		if (!chart.btnCount) {
+			chart.btnCount = 0;
+		}
+
+		// Keeps references to the button elements
+		if (!chart.exportDivElements) {
+			chart.exportDivElements = [];
+			chart.exportSVGElements = [];
+		}
+
+		if (btnOptions.enabled === false) {
+			return;
+		}
+
+
+		var attr = btnOptions.theme,
+			states = attr.states,
+			hover = states && states.hover,
+			select = states && states.select,
+			callback;
+
+		delete attr.states;
+
+		if (onclick) {
+			callback = function () {
+				onclick.apply(chart, arguments);
+			};
+
+		} else if (menuItems) {
+			callback = function () {
+				chart.contextMenu(
+					button.menuClassName, 
+					menuItems, 
+					button.translateX, 
+					button.translateY, 
+					button.width, 
+					button.height,
+					button
+				);
+				button.setState(2);
+			};
+		}
+
+
+		if (btnOptions.text && btnOptions.symbol) {
+			attr.paddingLeft = Highcharts.pick(attr.paddingLeft, 25);
+		
+		} else if (!btnOptions.text) {
+			extend(attr, {
+				width: btnOptions.width,
+				height: btnOptions.height,
+				padding: 0
+			});
+		}
+
+		button = renderer.button(btnOptions.text, 0, 0, callback, attr, hover, select)
+			.attr({
+				title: chart.options.lang[btnOptions._titleKey],
+				'stroke-linecap': 'round'
+			});
+		button.menuClassName = options.menuClassName || PREFIX + 'menu-' + chart.btnCount++;
+
+		if (btnOptions.symbol) {
+			symbol = renderer.symbol(
+					btnOptions.symbol,
+					btnOptions.symbolX - (symbolSize / 2),
+					btnOptions.symbolY - (symbolSize / 2),
+					symbolSize,				
+					symbolSize
+				)
+				.attr(extend(symbolAttr, {
+					'stroke-width': btnOptions.symbolStrokeWidth || 1,
+					zIndex: 1
+				})).add(button);
+		}
+
+		button.add()
+			.align(extend(btnOptions, {
+				width: button.width,
+				x: Highcharts.pick(btnOptions.x, buttonOffset) // #1654
+			}), true, 'spacingBox');
+
+		buttonOffset += (button.width + btnOptions.buttonSpacing) * (btnOptions.align === 'right' ? -1 : 1);
+
+		chart.exportSVGElements.push(button, symbol);
+
+	},
+
+	/**
+	 * Destroy the buttons.
+	 */
+	destroyExport: function (e) {
+		var chart = e.target,
+			i,
+			elem;
+
+		// Destroy the extra buttons added
+		for (i = 0; i < chart.exportSVGElements.length; i++) {
+			elem = chart.exportSVGElements[i];
+			
+			// Destroy and null the svg/vml elements
+			if (elem) { // #1822
+				elem.onclick = elem.ontouchstart = null;
+				chart.exportSVGElements[i] = elem.destroy();
+			}
+		}
+
+		// Destroy the divs for the menu
+		for (i = 0; i < chart.exportDivElements.length; i++) {
+			elem = chart.exportDivElements[i];
+
+			// Remove the event handler
+			removeEvent(elem, 'mouseleave');
+
+			// Remove inline events
+			chart.exportDivElements[i] = elem.onmouseout = elem.onmouseover = elem.ontouchstart = elem.onclick = null;
+
+			// Destroy the div by moving to garbage bin
+			discardElement(elem);
+		}
+	}
+});
+
+
+symbols.menu = function (x, y, width, height) {
+	var arr = [
+		M, x, y + 2.5,
+		L, x + width, y + 2.5,
+		M, x, y + height / 2 + 0.5,
+		L, x + width, y + height / 2 + 0.5,
+		M, x, y + height - 1.5,
+		L, x + width, y + height - 1.5
+	];
+	return arr;
+};
+
+// Add the buttons on chart load
+Chart.prototype.callbacks.push(function (chart) {
+	var n,
+		exportingOptions = chart.options.exporting,
+		buttons = exportingOptions.buttons;
+
+	buttonOffset = 0;
+
+	if (exportingOptions.enabled !== false) {
+
+		for (n in buttons) {
+			chart.addButton(buttons[n]);
+		}
+
+		// Destroy the export elements at chart destroy
+		addEvent(chart, 'destroy', chart.destroyExport);
+	}
+
+});
+
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/funnel.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/funnel.js
new file mode 100644
index 0000000..d33b042
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/funnel.js
@@ -0,0 +1,12 @@
+/*
+ 
+ Highcharts funnel module, Beta
+
+ (c) 2010-2012 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(d){var u=d.getOptions().plotOptions,p=d.seriesTypes,D=d.merge,z=function(){},A=d.each;u.funnel=D(u.pie,{center:["50%","50%"],width:"90%",neckWidth:"30%",height:"100%",neckHeight:"25%",dataLabels:{connectorWidth:1,connectorColor:"#606060"},size:!0,states:{select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}}});p.funnel=d.extendClass(p.pie,{type:"funnel",animate:z,translate:function(){var a=function(k,a){return/%$/.test(k)?a*parseInt(k,10)/100:parseInt(k,10)},g=0,e=this.chart,f=e.plotWidth,
+e=e.plotHeight,h=0,c=this.options,C=c.center,b=a(C[0],f),d=a(C[0],e),p=a(c.width,f),i,q,j=a(c.height,e),r=a(c.neckWidth,f),s=a(c.neckHeight,e),v=j-s,a=this.data,w,x,u=c.dataLabels.position==="left"?1:0,y,m,B,n,l,t,o;this.getWidthAt=q=function(k){return k>j-s||j===s?r:r+(p-r)*((j-s-k)/(j-s))};this.getX=function(k,a){return b+(a?-1:1)*(q(k)/2+c.dataLabels.distance)};this.center=[b,d,j];this.centerX=b;A(a,function(a){g+=a.y});A(a,function(a){o=null;x=g?a.y/g:0;m=d-j/2+h*j;l=m+x*j;i=q(m);y=b-i/2;B=y+
+i;i=q(l);n=b-i/2;t=n+i;m>v?(y=n=b-r/2,B=t=b+r/2):l>v&&(o=l,i=q(v),n=b-i/2,t=n+i,l=v);w=["M",y,m,"L",B,m,t,l];o&&w.push(t,o,n,o);w.push(n,l,"Z");a.shapeType="path";a.shapeArgs={d:w};a.percentage=x*100;a.plotX=b;a.plotY=(m+(o||l))/2;a.tooltipPos=[b,a.plotY];a.slice=z;a.half=u;h+=x});this.setTooltipPoints()},drawPoints:function(){var a=this,g=a.options,e=a.chart.renderer;A(a.data,function(f){var h=f.graphic,c=f.shapeArgs;h?h.animate(c):f.graphic=e.path(c).attr({fill:f.color,stroke:g.borderColor,"stroke-width":g.borderWidth}).add(a.group)})},
+sortByAngle:z,drawDataLabels:function(){var a=this.data,g=this.options.dataLabels.distance,e,f,h,c=a.length,d,b;for(this.center[2]-=2*g;c--;)h=a[c],f=(e=h.half)?1:-1,b=h.plotY,d=this.getX(b,e),h.labelPos=[0,b,d+(g-5)*f,b,d+g*f,b,e?"right":"left",0];p.pie.prototype.drawDataLabels.call(this)}})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/funnel.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/funnel.src.js
new file mode 100644
index 0000000..f9f5c08
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/funnel.src.js
@@ -0,0 +1,289 @@
+/**
+ * @license 
+ * Highcharts funnel module, Beta
+ *
+ * (c) 2010-2012 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+/*global Highcharts */
+(function (Highcharts) {
+	
+'use strict';
+
+// create shortcuts
+var defaultOptions = Highcharts.getOptions(),
+	defaultPlotOptions = defaultOptions.plotOptions,
+	seriesTypes = Highcharts.seriesTypes,
+	merge = Highcharts.merge,
+	noop = function () {},
+	each = Highcharts.each;
+
+// set default options
+defaultPlotOptions.funnel = merge(defaultPlotOptions.pie, {
+	center: ['50%', '50%'],
+	width: '90%',
+	neckWidth: '30%',
+	height: '100%',
+	neckHeight: '25%',
+
+	dataLabels: {
+		//position: 'right',
+		connectorWidth: 1,
+		connectorColor: '#606060'
+	},
+	size: true, // to avoid adapting to data label size in Pie.drawDataLabels
+	states: {
+		select: {
+			color: '#C0C0C0',
+			borderColor: '#000000',
+			shadow: false
+		}
+	}	
+});
+
+
+seriesTypes.funnel = Highcharts.extendClass(seriesTypes.pie, {
+	
+	type: 'funnel',
+	animate: noop,
+
+	/**
+	 * Overrides the pie translate method
+	 */
+	translate: function () {
+		
+		var 
+			// Get positions - either an integer or a percentage string must be given
+			getLength = function (length, relativeTo) {
+				return (/%$/).test(length) ?
+					relativeTo * parseInt(length, 10) / 100 :
+					parseInt(length, 10);
+			},
+			
+			sum = 0,
+			series = this,
+			chart = series.chart,
+			plotWidth = chart.plotWidth,
+			plotHeight = chart.plotHeight,
+			cumulative = 0, // start at top
+			options = series.options,
+			center = options.center,
+			centerX = getLength(center[0], plotWidth),
+			centerY = getLength(center[0], plotHeight),
+			width = getLength(options.width, plotWidth),
+			tempWidth,
+			getWidthAt,
+			height = getLength(options.height, plotHeight),
+			neckWidth = getLength(options.neckWidth, plotWidth),
+			neckHeight = getLength(options.neckHeight, plotHeight),
+			neckY = height - neckHeight,
+			data = series.data,
+			path,
+			fraction,
+			half = options.dataLabels.position === 'left' ? 1 : 0,
+
+			x1, 
+			y1, 
+			x2, 
+			x3, 
+			y3, 
+			x4, 
+			y5;
+
+		// Return the width at a specific y coordinate
+		series.getWidthAt = getWidthAt = function (y) {
+			return y > height - neckHeight || height === neckHeight ?
+				neckWidth :
+				neckWidth + (width - neckWidth) * ((height - neckHeight - y) / (height - neckHeight));
+		};
+		series.getX = function (y, half) {
+			return centerX + (half ? -1 : 1) * ((getWidthAt(y) / 2) + options.dataLabels.distance);
+		};
+
+		// Expose
+		series.center = [centerX, centerY, height];
+		series.centerX = centerX;
+
+		/*
+		 * Individual point coordinate naming:
+		 *
+		 * x1,y1 _________________ x2,y1
+		 *  \                         /
+		 *   \                       /
+		 *    \                     /
+		 *     \                   /
+		 *      \                 /
+		 *     x3,y3 _________ x4,y3
+		 *
+		 * Additional for the base of the neck:
+		 *
+		 *       |               |
+		 *       |               |
+		 *       |               |
+		 *     x3,y5 _________ x4,y5
+		 */
+
+
+
+
+		// get the total sum
+		each(data, function (point) {
+			sum += point.y;
+		});
+
+		each(data, function (point) {
+			// set start and end positions
+			y5 = null;
+			fraction = sum ? point.y / sum : 0;
+			y1 = centerY - height / 2 + cumulative * height;
+			y3 = y1 + fraction * height;
+			//tempWidth = neckWidth + (width - neckWidth) * ((height - neckHeight - y1) / (height - neckHeight));
+			tempWidth = getWidthAt(y1);
+			x1 = centerX - tempWidth / 2;
+			x2 = x1 + tempWidth;
+			tempWidth = getWidthAt(y3);
+			x3 = centerX - tempWidth / 2;
+			x4 = x3 + tempWidth;
+
+			// the entire point is within the neck
+			if (y1 > neckY) {
+				x1 = x3 = centerX - neckWidth / 2;
+				x2 = x4 = centerX + neckWidth / 2;
+			
+			// the base of the neck
+			} else if (y3 > neckY) {
+				y5 = y3;
+
+				tempWidth = getWidthAt(neckY);
+				x3 = centerX - tempWidth / 2;
+				x4 = x3 + tempWidth;
+
+				y3 = neckY;
+			}
+
+			// save the path
+			path = [
+				'M',
+				x1, y1,
+				'L',
+				x2, y1,
+				x4, y3
+			];
+			if (y5) {
+				path.push(x4, y5, x3, y5);
+			}
+			path.push(x3, y3, 'Z');
+
+			// prepare for using shared dr
+			point.shapeType = 'path';
+			point.shapeArgs = { d: path };
+
+
+			// for tooltips and data labels
+			point.percentage = fraction * 100;
+			point.plotX = centerX;
+			point.plotY = (y1 + (y5 || y3)) / 2;
+
+			// Placement of tooltips and data labels
+			point.tooltipPos = [
+				centerX,
+				point.plotY
+			];
+
+			// Slice is a noop on funnel points
+			point.slice = noop;
+			
+			// Mimicking pie data label placement logic
+			point.half = half;
+
+			cumulative += fraction;
+		});
+
+
+		series.setTooltipPoints();
+	},
+	/**
+	 * Draw a single point (wedge)
+	 * @param {Object} point The point object
+	 * @param {Object} color The color of the point
+	 * @param {Number} brightness The brightness relative to the color
+	 */
+	drawPoints: function () {
+		var series = this,
+			options = series.options,
+			chart = series.chart,
+			renderer = chart.renderer;
+
+		each(series.data, function (point) {
+			
+			var graphic = point.graphic,
+				shapeArgs = point.shapeArgs;
+
+			if (!graphic) { // Create the shapes
+				point.graphic = renderer.path(shapeArgs).
+					attr({
+						fill: point.color,
+						stroke: options.borderColor,
+						'stroke-width': options.borderWidth
+					}).
+					add(series.group);
+					
+			} else { // Update the shapes
+				graphic.animate(shapeArgs);
+			}
+		});
+	},
+
+	/**
+	 * Funnel items don't have angles (#2289)
+	 */
+	sortByAngle: noop,
+	
+	/**
+	 * Extend the pie data label method
+	 */
+	drawDataLabels: function () {
+		var data = this.data,
+			labelDistance = this.options.dataLabels.distance,
+			leftSide,
+			sign,
+			point,
+			i = data.length,
+			x,
+			y;
+		
+		// In the original pie label anticollision logic, the slots are distributed
+		// from one labelDistance above to one labelDistance below the pie. In funnels
+		// we don't want this.
+		this.center[2] -= 2 * labelDistance;
+		
+		// Set the label position array for each point.
+		while (i--) {
+			point = data[i];
+			leftSide = point.half;
+			sign = leftSide ? 1 : -1;
+			y = point.plotY;
+			x = this.getX(y, leftSide);
+				
+			// set the anchor point for data labels
+			point.labelPos = [
+				0, // first break of connector
+				y, // a/a
+				x + (labelDistance - 5) * sign, // second break, right outside point shape
+				y, // a/a
+				x + labelDistance * sign, // landing point for connector
+				y, // a/a
+				leftSide ? 'right' : 'left', // alignment
+				0 // center angle
+			];
+		}
+		
+		seriesTypes.pie.prototype.drawDataLabels.call(this);
+	}
+
+});
+
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/heatmap.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/heatmap.js
new file mode 100644
index 0000000..32f9a3f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/heatmap.js
@@ -0,0 +1 @@
+(function(b){var k=b.seriesTypes,l=b.each;k.heatmap=b.extendClass(k.map,{colorKey:"z",useMapGeometry:!1,pointArrayMap:["y","z"],translate:function(){var c=this,b=c.options,i=Number.MAX_VALUE,j=Number.MIN_VALUE;c.generatePoints();l(c.data,function(a){var e=a.x,f=a.y,d=a.z,g=(b.colsize||1)/2,h=(b.rowsize||1)/2;a.path=["M",e-g,f-h,"L",e+g,f-h,"L",e+g,f+h,"L",e-g,f+h,"Z"];a.shapeType="path";a.shapeArgs={d:c.translatePath(a.path)};typeof d==="number"&&(d>j?j=d:d<i&&(i=d))});c.translateColors(i,j)},getBox:function(){}})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/heatmap.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/heatmap.src.js
new file mode 100644
index 0000000..b7e356a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/heatmap.src.js
@@ -0,0 +1,53 @@
+(function (Highcharts) {
+	var seriesTypes = Highcharts.seriesTypes,
+		each = Highcharts.each;
+	
+	seriesTypes.heatmap = Highcharts.extendClass(seriesTypes.map, {
+		colorKey: 'z',
+		useMapGeometry: false,
+		pointArrayMap: ['y', 'z'],
+		translate: function () {
+			var series = this,
+				options = series.options,
+				dataMin = Number.MAX_VALUE,
+				dataMax = Number.MIN_VALUE;
+
+			series.generatePoints();
+	
+			each(series.data, function (point) {
+				var x = point.x,
+					y = point.y,
+					value = point.z,
+					xPad = (options.colsize || 1) / 2,
+					yPad = (options.rowsize || 1) / 2;
+
+				point.path = [
+					'M', x - xPad, y - yPad,
+					'L', x + xPad, y - yPad,
+					'L', x + xPad, y + yPad,
+					'L', x - xPad, y + yPad,
+					'Z'
+				];
+				
+				point.shapeType = 'path';
+				point.shapeArgs = {
+					d: series.translatePath(point.path)
+				};
+				
+				if (typeof value === 'number') {
+					if (value > dataMax) {
+						dataMax = value;
+					} else if (value < dataMin) {
+						dataMin = value;
+					}
+				}
+			});
+			
+			series.translateColors(dataMin, dataMax);
+		},
+		
+		getBox: function () {}
+			
+	});
+	
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/map.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/map.js
new file mode 100644
index 0000000..9b8a632
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/map.js
@@ -0,0 +1,27 @@
+/*
+ Map plugin v0.1 for Highcharts
+
+ (c) 2011-2013 Torstein Hønsi
+
+ License: www.highcharts.com/license
+*/
+(function(g){function x(a,b,c){for(var d=4,e=[];d--;)e[d]=Math.round(b.rgba[d]+(a.rgba[d]-b.rgba[d])*(1-c));return"rgba("+e.join(",")+")"}var r=g.Axis,y=g.Chart,s=g.Point,z=g.Pointer,l=g.each,v=g.extend,p=g.merge,n=g.pick,A=g.numberFormat,B=g.getOptions(),k=g.seriesTypes,q=B.plotOptions,t=g.wrap,u=g.Color,w=function(){};B.mapNavigation={buttonOptions:{align:"right",verticalAlign:"bottom",x:0,width:18,height:18,style:{fontSize:"15px",fontWeight:"bold",textAlign:"center"}},buttons:{zoomIn:{onclick:function(){this.mapZoom(0.5)},
+text:"+",y:-32},zoomOut:{onclick:function(){this.mapZoom(2)},text:"-",y:0}}};g.splitPath=function(a){var b,a=a.replace(/([A-Za-z])/g," $1 "),a=a.replace(/^\s*/,"").replace(/\s*$/,""),a=a.split(/[ ,]+/);for(b=0;b<a.length;b++)/[a-zA-Z]/.test(a[b])||(a[b]=parseFloat(a[b]));return a};g.maps={};t(r.prototype,"getSeriesExtremes",function(a){var b=this.isXAxis,c,d,e=[];l(this.series,function(a,b){if(a.useMapGeometry)e[b]=a.xData,a.xData=[]});a.call(this);c=n(this.dataMin,Number.MAX_VALUE);d=n(this.dataMax,
+Number.MIN_VALUE);l(this.series,function(a,i){if(a.useMapGeometry)c=Math.min(c,a[b?"minX":"minY"]),d=Math.max(d,a[b?"maxX":"maxY"]),a.xData=e[i]});this.dataMin=c;this.dataMax=d});t(r.prototype,"setAxisTranslation",function(a){var b=this.chart,c=b.plotWidth/b.plotHeight,d=this.isXAxis,e=b.xAxis[0];a.call(this);if(b.options.chart.type==="map"&&!d&&e.transA!==void 0)this.transA=e.transA=Math.min(this.transA,e.transA),a=(e.max-e.min)/(this.max-this.min),e=a>c?this:e,c=(e.max-e.min)*e.transA,e.minPixelPadding=
+(e.len-c)/2});t(y.prototype,"render",function(a){var b=this,c=b.options.mapNavigation;a.call(b);b.renderMapNavigation();c.zoomOnDoubleClick&&g.addEvent(b.container,"dblclick",function(a){b.pointer.onContainerDblClick(a)});c.zoomOnMouseWheel&&g.addEvent(b.container,document.onmousewheel===void 0?"DOMMouseScroll":"mousewheel",function(a){b.pointer.onContainerMouseWheel(a)})});v(z.prototype,{onContainerDblClick:function(a){var b=this.chart,a=this.normalize(a);b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-
+b.plotTop)&&b.mapZoom(0.5,b.xAxis[0].toValue(a.chartX),b.yAxis[0].toValue(a.chartY))},onContainerMouseWheel:function(a){var b=this.chart,c,a=this.normalize(a);c=a.detail||-(a.wheelDelta/120);b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&b.mapZoom(c>0?2:0.5,b.xAxis[0].toValue(a.chartX),b.yAxis[0].toValue(a.chartY))}});t(z.prototype,"init",function(a,b,c){a.call(this,b,c);if(c.mapNavigation.enableTouchZoom)this.pinchX=this.pinchHor=this.pinchY=this.pinchVert=!0});v(y.prototype,{renderMapNavigation:function(){var a=
+this,b=this.options.mapNavigation,c=b.buttons,d,e,f,i=function(){this.handler.call(a)};if(b.enableButtons)for(d in c)if(c.hasOwnProperty(d))f=p(b.buttonOptions,c[d]),e=a.renderer.button(f.text,0,0,i).attr({width:f.width,height:f.height}).css(f.style).add(),e.handler=f.onclick,e.align(v(f,{width:e.width,height:e.height}),null,"spacingBox")},fitToBox:function(a,b){l([["x","width"],["y","height"]],function(c){var d=c[0],c=c[1];a[d]+a[c]>b[d]+b[c]&&(a[c]>b[c]?(a[c]=b[c],a[d]=b[d]):a[d]=b[d]+b[c]-a[c]);
+a[c]>b[c]&&(a[c]=b[c]);a[d]<b[d]&&(a[d]=b[d])});return a},mapZoom:function(a,b,c){if(!this.isMapZooming){var d=this,e=d.xAxis[0],f=e.max-e.min,i=n(b,e.min+f/2),b=f*a,f=d.yAxis[0],h=f.max-f.min,c=n(c,f.min+h/2);a*=h;i-=b/2;h=c-a/2;c=n(d.options.chart.animation,!0);b=d.fitToBox({x:i,y:h,width:b,height:a},{x:e.dataMin,y:f.dataMin,width:e.dataMax-e.dataMin,height:f.dataMax-f.dataMin});e.setExtremes(b.x,b.x+b.width,!1);f.setExtremes(b.y,b.y+b.height,!1);if(e=c?c.duration||500:0)d.isMapZooming=!0,setTimeout(function(){d.isMapZooming=
+!1},e);d.redraw()}}});q.map=p(q.scatter,{animation:!1,nullColor:"#F8F8F8",borderColor:"silver",borderWidth:1,marker:null,stickyTracking:!1,dataLabels:{verticalAlign:"middle"},turboThreshold:0,tooltip:{followPointer:!0,pointFormat:"{point.name}: {point.y}<br/>"},states:{normal:{animation:!0}}});r=g.extendClass(s,{applyOptions:function(a,b){var c=s.prototype.applyOptions.call(this,a,b);if(c.path&&typeof c.path==="string")c.path=c.options.path=g.splitPath(c.path);return c},onMouseOver:function(){clearTimeout(this.colorInterval);
+s.prototype.onMouseOver.call(this)},onMouseOut:function(){var a=this,b=+new Date,c=u(a.options.color),d=u(a.pointAttr.hover.fill),e=a.series.options.states.normal.animation,f=e&&(e.duration||500);if(f&&c.rgba.length===4&&d.rgba.length===4)delete a.pointAttr[""].fill,clearTimeout(a.colorInterval),a.colorInterval=setInterval(function(){var e=(new Date-b)/f,h=a.graphic;e>1&&(e=1);h&&h.attr("fill",x(d,c,e));e>=1&&clearTimeout(a.colorInterval)},13);s.prototype.onMouseOut.call(a)}});k.map=g.extendClass(k.scatter,
+{type:"map",pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},colorKey:"y",pointClass:r,trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:w,supportsDrilldown:!0,getExtremesFromAll:!0,useMapGeometry:!0,init:function(a){var b=this,c=a.options.legend.valueDecimals,d=[],e,f,i,h,j,o,m;o=a.options.legend.layout==="horizontal";g.Series.prototype.init.apply(this,arguments);j=b.options.colorRange;if(h=b.options.valueRanges)l(h,function(a){f=a.from;i=a.to;e=
+"";f===void 0?e="< ":i===void 0&&(e="> ");f!==void 0&&(e+=A(f,c));f!==void 0&&i!==void 0&&(e+=" - ");i!==void 0&&(e+=A(i,c));d.push(g.extend({chart:b.chart,name:e,options:{},drawLegendSymbol:k.area.prototype.drawLegendSymbol,visible:!0,setState:function(){},setVisible:function(){}},a))}),b.legendItems=d;else if(j)f=j.from,i=j.to,h=j.fromLabel,j=j.toLabel,m=o?[0,0,1,0]:[0,1,0,0],o||(o=h,h=j,j=o),o={linearGradient:{x1:m[0],y1:m[1],x2:m[2],y2:m[3]},stops:[[0,f],[1,i]]},d=[{chart:b.chart,options:{},fromLabel:h,
+toLabel:j,color:o,drawLegendSymbol:this.drawLegendSymbolGradient,visible:!0,setState:function(){},setVisible:function(){}}],b.legendItems=d},drawLegendSymbol:k.area.prototype.drawLegendSymbol,drawLegendSymbolGradient:function(a,b){var c=a.options.symbolPadding,d=n(a.options.padding,8),e,f,i=this.chart.renderer.fontMetrics(a.options.itemStyle.fontSize).h,h=a.options.layout==="horizontal",j;j=n(a.options.rectangleLength,200);h?(e=-(c/2),f=0):(e=-j+a.baseline-c/2,f=d+i);b.fromText=this.chart.renderer.text(b.fromLabel,
+f,e).attr({zIndex:2}).add(b.legendGroup);f=b.fromText.getBBox();b.legendSymbol=this.chart.renderer.rect(h?f.x+f.width+c:f.x-i-c,f.y,h?j:i,h?i:j,2).attr({zIndex:1}).add(b.legendGroup);j=b.legendSymbol.getBBox();b.toText=this.chart.renderer.text(b.toLabel,j.x+j.width+c,h?e:j.y+j.height-c).attr({zIndex:2}).add(b.legendGroup);e=b.toText.getBBox();h?(a.offsetWidth=f.width+j.width+e.width+c*2+d,a.itemY=i+d):(a.offsetWidth=Math.max(f.width,e.width)+c+j.width+d,a.itemY=j.height+d,a.itemX=c)},getBox:function(a){var b=
+Number.MIN_VALUE,c=Number.MAX_VALUE,d=Number.MIN_VALUE,e=Number.MAX_VALUE;l(a||this.options.data,function(a){for(var i=a.path,h=i.length,j=!1,g=Number.MIN_VALUE,m=Number.MAX_VALUE,k=Number.MIN_VALUE,l=Number.MAX_VALUE;h--;)typeof i[h]==="number"&&!isNaN(i[h])&&(j?(g=Math.max(g,i[h]),m=Math.min(m,i[h])):(k=Math.max(k,i[h]),l=Math.min(l,i[h])),j=!j);a._maxX=g;a._minX=m;a._maxY=k;a._minY=l;b=Math.max(b,g);c=Math.min(c,m);d=Math.max(d,k);e=Math.min(e,l)});this.minY=e;this.maxY=d;this.minX=c;this.maxX=
+b},translatePath:function(a){var b=!1,c=this.xAxis,d=this.yAxis,e,a=[].concat(a);for(e=a.length;e--;)typeof a[e]==="number"&&(a[e]=b?Math.round(c.translate(a[e])):Math.round(d.len-d.translate(a[e])),b=!b);return a},setData:function(){g.Series.prototype.setData.apply(this,arguments);this.getBox()},translate:function(){var a=this,b=Number.MAX_VALUE,c=Number.MIN_VALUE;a.generatePoints();l(a.data,function(d){d.shapeType="path";d.shapeArgs={d:a.translatePath(d.path)};if(typeof d.y==="number")if(d.y>c)c=
+d.y;else if(d.y<b)b=d.y});a.translateColors(b,c)},translateColors:function(a,b){var c=this.options,d=c.valueRanges,e=c.colorRange,f=this.colorKey,i,h;e&&(i=u(e.from),h=u(e.to));l(this.data,function(g){var k=g[f],m,l,n;if(d)for(n=d.length;n--;){if(m=d[n],i=m.from,h=m.to,(i===void 0||k>=i)&&(h===void 0||k<=h)){l=m.color;break}}else e&&k!==void 0&&(m=1-(b-k)/(b-a),l=k===null?c.nullColor:x(i,h,m));if(l)g.color=null,g.options.color=l})},drawGraph:w,drawDataLabels:w,drawPoints:function(){var a=this.xAxis,
+b=this.yAxis,c=this.colorKey;l(this.data,function(a){a.plotY=1;if(a[c]===null)a[c]=0,a.isNull=!0});k.column.prototype.drawPoints.apply(this);l(this.data,function(d){var e=d.dataLabels,f=a.toPixels(d._minX,!0),g=a.toPixels(d._maxX,!0),h=b.toPixels(d._minY,!0),j=b.toPixels(d._maxY,!0);d.plotX=Math.round(f+(g-f)*n(e&&e.anchorX,0.5));d.plotY=Math.round(h+(j-h)*n(e&&e.anchorY,0.5));d.isNull&&(d[c]=null)});g.Series.prototype.drawDataLabels.call(this)},animateDrilldown:function(a){var b=this.chart.plotBox,
+c=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],d=c.bBox,e=this.chart.options.drilldown.animation;if(!a)a=Math.min(d.width/b.width,d.height/b.height),c.shapeArgs={scaleX:a,scaleY:a,translateX:d.x,translateY:d.y},l(this.points,function(a){a.graphic.attr(c.shapeArgs).animate({scaleX:1,scaleY:1,translateX:0,translateY:0},e)}),delete this.animate},animateDrillupFrom:function(a){k.column.prototype.animateDrillupFrom.call(this,a)},animateDrillupTo:function(a){k.column.prototype.animateDrillupTo.call(this,
+a)}});q.mapline=p(q.map,{lineWidth:1,backgroundColor:"none"});k.mapline=g.extendClass(k.map,{type:"mapline",pointAttrToOptions:{stroke:"color","stroke-width":"lineWidth",fill:"backgroundColor"},drawLegendSymbol:k.line.prototype.drawLegendSymbol});q.mappoint=p(q.scatter,{dataLabels:{enabled:!0,format:"{point.name}",color:"black",style:{textShadow:"0 0 5px white"}}});k.mappoint=g.extendClass(k.scatter,{type:"mappoint"});g.Map=function(a,b){var c={endOnTick:!1,gridLineWidth:0,labels:{enabled:!1},lineWidth:0,
+minPadding:0,maxPadding:0,startOnTick:!1,tickWidth:0,title:null},d;d=a.series;a.series=null;a=p({chart:{type:"map",panning:"xy"},xAxis:c,yAxis:p(c,{reversed:!0})},a,{chart:{inverted:!1}});a.series=d;return new g.Chart(a,b)}})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/map.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/map.src.js
new file mode 100644
index 0000000..6af8e21
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/map.src.js
@@ -0,0 +1,1002 @@
+/**
+ * @license Map plugin v0.1 for Highcharts
+ *
+ * (c) 2011-2013 Torstein Hønsi
+ *
+ * License: www.highcharts.com/license
+ */
+
+/* 
+ * See www.highcharts.com/studies/world-map.htm for use case.
+ *
+ * To do:
+ * - Optimize long variable names and alias adapter methods and Highcharts namespace variables
+ * - Zoom and pan GUI
+ */
+(function (Highcharts) {
+	var UNDEFINED,
+		Axis = Highcharts.Axis,
+		Chart = Highcharts.Chart,
+		Point = Highcharts.Point,
+		Pointer = Highcharts.Pointer,
+		each = Highcharts.each,
+		extend = Highcharts.extend,
+		merge = Highcharts.merge,
+		pick = Highcharts.pick,
+		numberFormat = Highcharts.numberFormat,
+		defaultOptions = Highcharts.getOptions(),
+		seriesTypes = Highcharts.seriesTypes,
+		plotOptions = defaultOptions.plotOptions,
+		wrap = Highcharts.wrap,
+		Color = Highcharts.Color,
+		noop = function () {};
+
+	
+
+	/*
+	 * Return an intermediate color between two colors, according to pos where 0
+	 * is the from color and 1 is the to color
+	 */
+	function tweenColors(from, to, pos) {
+		var i = 4,
+			rgba = [];
+
+		while (i--) {
+			rgba[i] = Math.round(
+				to.rgba[i] + (from.rgba[i] - to.rgba[i]) * (1 - pos)
+			);
+		}
+		return 'rgba(' + rgba.join(',') + ')';
+	}
+
+	// Set the default map navigation options
+	defaultOptions.mapNavigation = {
+		buttonOptions: {
+			align: 'right',
+			verticalAlign: 'bottom',
+			x: 0,
+			width: 18,
+			height: 18,
+			style: {
+				fontSize: '15px',
+				fontWeight: 'bold',
+				textAlign: 'center'
+			}
+		},
+		buttons: {
+			zoomIn: {
+				onclick: function () {
+					this.mapZoom(0.5);
+				},
+				text: '+',
+				y: -32
+			},
+			zoomOut: {
+				onclick: function () {
+					this.mapZoom(2);
+				},
+				text: '-',
+				y: 0
+			}
+		}
+		// enableButtons: false,
+		// enableTouchZoom: false,
+		// zoomOnDoubleClick: false,
+		// zoomOnMouseWheel: false
+
+	};
+	
+	/**
+	 * Utility for reading SVG paths directly.
+	 */
+	Highcharts.splitPath = function (path) {
+		var i;
+
+		// Move letters apart
+		path = path.replace(/([A-Za-z])/g, ' $1 ');
+		// Trim
+		path = path.replace(/^\s*/, "").replace(/\s*$/, "");
+		
+		// Split on spaces and commas
+		path = path.split(/[ ,]+/);
+		
+		// Parse numbers
+		for (i = 0; i < path.length; i++) {
+			if (!/[a-zA-Z]/.test(path[i])) {
+				path[i] = parseFloat(path[i]);
+			}
+		}
+		return path;
+	};
+
+	// A placeholder for map definitions
+	Highcharts.maps = {};
+	
+	/**
+	 * Override to use the extreme coordinates from the SVG shape, not the
+	 * data values
+	 */
+	wrap(Axis.prototype, 'getSeriesExtremes', function (proceed) {
+		var isXAxis = this.isXAxis,
+			dataMin,
+			dataMax,
+			xData = [];
+
+		// Remove the xData array and cache it locally so that the proceed method doesn't use it
+		each(this.series, function (series, i) {
+			if (series.useMapGeometry) {
+				xData[i] = series.xData;
+				series.xData = [];
+			}
+		});
+
+		// Call base to reach normal cartesian series (like mappoint)
+		proceed.call(this);
+
+		// Run extremes logic for map and mapline
+		dataMin = pick(this.dataMin, Number.MAX_VALUE);
+		dataMax = pick(this.dataMax, Number.MIN_VALUE);
+		each(this.series, function (series, i) {
+			if (series.useMapGeometry) {
+				dataMin = Math.min(dataMin, series[isXAxis ? 'minX' : 'minY']);
+				dataMax = Math.max(dataMax, series[isXAxis ? 'maxX' : 'maxY']);
+				series.xData = xData[i]; // Reset xData array
+			}
+		});
+		
+		this.dataMin = dataMin;
+		this.dataMax = dataMax;
+	});
+	
+	/**
+	 * Override axis translation to make sure the aspect ratio is always kept
+	 */
+	wrap(Axis.prototype, 'setAxisTranslation', function (proceed) {
+		var chart = this.chart,
+			mapRatio,
+			plotRatio = chart.plotWidth / chart.plotHeight,
+			isXAxis = this.isXAxis,
+			adjustedAxisLength,
+			xAxis = chart.xAxis[0],
+			padAxis;
+		
+		// Run the parent method
+		proceed.call(this);
+		
+		// On Y axis, handle both
+		if (chart.options.chart.type === 'map' && !isXAxis && xAxis.transA !== UNDEFINED) {
+			
+			// Use the same translation for both axes
+			this.transA = xAxis.transA = Math.min(this.transA, xAxis.transA);
+			
+			mapRatio = (xAxis.max - xAxis.min) / (this.max - this.min);
+			
+			// What axis to pad to put the map in the middle
+			padAxis = mapRatio > plotRatio ? this : xAxis;
+			
+			// Pad it
+			adjustedAxisLength = (padAxis.max - padAxis.min) * padAxis.transA;
+			padAxis.minPixelPadding = (padAxis.len - adjustedAxisLength) / 2;
+		}
+	});
+
+
+	//--- Start zooming and panning features
+
+	wrap(Chart.prototype, 'render', function (proceed) {
+		var chart = this,
+			mapNavigation = chart.options.mapNavigation;
+
+		proceed.call(chart);
+
+		// Render the plus and minus buttons
+		chart.renderMapNavigation();
+
+		// Add the double click event
+		if (mapNavigation.zoomOnDoubleClick) {
+			Highcharts.addEvent(chart.container, 'dblclick', function (e) {
+				chart.pointer.onContainerDblClick(e);
+			});
+		}
+
+		// Add the mousewheel event
+		if (mapNavigation.zoomOnMouseWheel) {
+			Highcharts.addEvent(chart.container, document.onmousewheel === undefined ? 'DOMMouseScroll' : 'mousewheel', function (e) {
+				chart.pointer.onContainerMouseWheel(e);
+			});
+		}
+	});
+
+	// Extend the Pointer
+	extend(Pointer.prototype, {
+
+		/**
+		 * The event handler for the doubleclick event
+		 */
+		onContainerDblClick: function (e) {
+			var chart = this.chart;
+
+			e = this.normalize(e);
+
+			if (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+				chart.mapZoom(
+					0.5,
+					chart.xAxis[0].toValue(e.chartX),
+					chart.yAxis[0].toValue(e.chartY)
+				);
+			}
+		},
+
+		/**
+		 * The event handler for the mouse scroll event
+		 */
+		onContainerMouseWheel: function (e) {
+			var chart = this.chart,
+				delta;
+
+			e = this.normalize(e);
+
+			// Firefox uses e.detail, WebKit and IE uses wheelDelta
+			delta = e.detail || -(e.wheelDelta / 120);
+			if (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+				chart.mapZoom(
+					delta > 0 ? 2 : 0.5,
+					chart.xAxis[0].toValue(e.chartX),
+					chart.yAxis[0].toValue(e.chartY)
+				);
+			}
+		}
+	});
+	// Implement the pinchType option
+	wrap(Pointer.prototype, 'init', function (proceed, chart, options) {
+
+		proceed.call(this, chart, options);
+
+		// Pinch status
+		if (options.mapNavigation.enableTouchZoom) {
+			this.pinchX = this.pinchHor = 
+				this.pinchY = this.pinchVert = true;
+		}
+	});
+
+	// Add events to the Chart object itself
+	extend(Chart.prototype, {
+		renderMapNavigation: function () {
+			var chart = this,
+				options = this.options.mapNavigation,
+				buttons = options.buttons,
+				n,
+				button,
+				buttonOptions,
+				outerHandler = function () { 
+					this.handler.call(chart); 
+				};
+
+			if (options.enableButtons) {
+				for (n in buttons) {
+					if (buttons.hasOwnProperty(n)) {
+						buttonOptions = merge(options.buttonOptions, buttons[n]);
+
+						button = chart.renderer.button(buttonOptions.text, 0, 0, outerHandler)
+							.attr({
+								width: buttonOptions.width,
+								height: buttonOptions.height
+							})
+							.css(buttonOptions.style)
+							.add();
+						button.handler = buttonOptions.onclick;
+						button.align(extend(buttonOptions, { width: button.width, height: button.height }), null, 'spacingBox');
+					}
+				}
+			}
+		},
+
+		/**
+		 * Fit an inner box to an outer. If the inner box overflows left or right, align it to the sides of the
+		 * outer. If it overflows both sides, fit it within the outer. This is a pattern that occurs more places
+		 * in Highcharts, perhaps it should be elevated to a common utility function.
+		 */
+		fitToBox: function (inner, outer) {
+			each([['x', 'width'], ['y', 'height']], function (dim) {
+				var pos = dim[0],
+					size = dim[1];
+				if (inner[pos] + inner[size] > outer[pos] + outer[size]) { // right overflow
+					if (inner[size] > outer[size]) { // the general size is greater, fit fully to outer
+						inner[size] = outer[size];
+						inner[pos] = outer[pos];
+					} else { // align right
+						inner[pos] = outer[pos] + outer[size] - inner[size];
+					}
+				}
+				if (inner[size] > outer[size]) {
+					inner[size] = outer[size];
+				}
+				if (inner[pos] < outer[pos]) {
+					inner[pos] = outer[pos];
+				}
+				
+			});
+
+			return inner;
+		},
+
+		/**
+		 * Zoom the map in or out by a certain amount. Less than 1 zooms in, greater than 1 zooms out.
+		 */
+		mapZoom: function (howMuch, centerXArg, centerYArg) {
+
+			if (this.isMapZooming) {
+				return;
+			}
+
+			var chart = this,
+				xAxis = chart.xAxis[0],
+				xRange = xAxis.max - xAxis.min,
+				centerX = pick(centerXArg, xAxis.min + xRange / 2),
+				newXRange = xRange * howMuch,
+				yAxis = chart.yAxis[0],
+				yRange = yAxis.max - yAxis.min,
+				centerY = pick(centerYArg, yAxis.min + yRange / 2),
+				newYRange = yRange * howMuch,
+				newXMin = centerX - newXRange / 2,
+				newYMin = centerY - newYRange / 2,
+				animation = pick(chart.options.chart.animation, true),
+				delay,
+				newExt = chart.fitToBox({
+					x: newXMin,
+					y: newYMin,
+					width: newXRange,
+					height: newYRange
+				}, {
+					x: xAxis.dataMin,
+					y: yAxis.dataMin,
+					width: xAxis.dataMax - xAxis.dataMin,
+					height: yAxis.dataMax - yAxis.dataMin
+				});
+
+			xAxis.setExtremes(newExt.x, newExt.x + newExt.width, false);
+			yAxis.setExtremes(newExt.y, newExt.y + newExt.height, false);
+
+			// Prevent zooming until this one is finished animating
+			delay = animation ? animation.duration || 500 : 0;
+			if (delay) {
+				chart.isMapZooming = true;
+				setTimeout(function () {
+					chart.isMapZooming = false;
+				}, delay);
+			}
+
+			chart.redraw();
+		}
+	});
+	
+	/**
+	 * Extend the default options with map options
+	 */
+	plotOptions.map = merge(plotOptions.scatter, {
+		animation: false, // makes the complex shapes slow
+		nullColor: '#F8F8F8',
+		borderColor: 'silver',
+		borderWidth: 1,
+		marker: null,
+		stickyTracking: false,
+		dataLabels: {
+			verticalAlign: 'middle'
+		},
+		turboThreshold: 0,
+		tooltip: {
+			followPointer: true,
+			pointFormat: '{point.name}: {point.y}<br/>'
+		},
+		states: {
+			normal: {
+				animation: true
+			}
+		}
+	});
+
+	var MapAreaPoint = Highcharts.extendClass(Point, {
+		/**
+		 * Extend the Point object to split paths
+		 */
+		applyOptions: function (options, x) {
+
+			var point = Point.prototype.applyOptions.call(this, options, x);
+
+			if (point.path && typeof point.path === 'string') {
+				point.path = point.options.path = Highcharts.splitPath(point.path);
+			}
+
+			return point;
+		},
+		/**
+		 * Stop the fade-out 
+		 */
+		onMouseOver: function () {
+			clearTimeout(this.colorInterval);
+			Point.prototype.onMouseOver.call(this);
+		},
+		/**
+		 * Custom animation for tweening out the colors. Animation reduces blinking when hovering
+		 * over islands and coast lines. We run a custom implementation of animation becuase we
+		 * need to be able to run this independently from other animations like zoom redraw. Also,
+		 * adding color animation to the adapters would introduce almost the same amount of code.
+		 */
+		onMouseOut: function () {
+			var point = this,
+				start = +new Date(),
+				normalColor = Color(point.options.color),
+				hoverColor = Color(point.pointAttr.hover.fill),
+				animation = point.series.options.states.normal.animation,
+				duration = animation && (animation.duration || 500);
+
+			if (duration && normalColor.rgba.length === 4 && hoverColor.rgba.length === 4) {
+				delete point.pointAttr[''].fill; // avoid resetting it in Point.setState
+
+				clearTimeout(point.colorInterval);
+				point.colorInterval = setInterval(function () {
+					var pos = (new Date() - start) / duration,
+						graphic = point.graphic;
+					if (pos > 1) {
+						pos = 1;
+					}
+					if (graphic) {
+						graphic.attr('fill', tweenColors(hoverColor, normalColor, pos));
+					}
+					if (pos >= 1) {
+						clearTimeout(point.colorInterval);
+					}
+				}, 13);
+			}
+			Point.prototype.onMouseOut.call(point);
+		}
+	});
+
+	/**
+	 * Add the series type
+	 */
+	seriesTypes.map = Highcharts.extendClass(seriesTypes.scatter, {
+		type: 'map',
+		pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+			stroke: 'borderColor',
+			'stroke-width': 'borderWidth',
+			fill: 'color'
+		},
+		colorKey: 'y',
+		pointClass: MapAreaPoint,
+		trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],
+		getSymbol: noop,
+		supportsDrilldown: true,
+		getExtremesFromAll: true,
+		useMapGeometry: true, // get axis extremes from paths, not values
+		init: function (chart) {
+			var series = this,
+				valueDecimals = chart.options.legend.valueDecimals,
+				legendItems = [],
+				name,
+				from,
+				to,
+				fromLabel,
+				toLabel,
+				colorRange,
+				valueRanges,
+				gradientColor,
+				grad,
+				tmpLabel,
+				horizontal = chart.options.legend.layout === 'horizontal';
+
+			
+			Highcharts.Series.prototype.init.apply(this, arguments);
+			colorRange = series.options.colorRange;
+			valueRanges = series.options.valueRanges;
+
+			if (valueRanges) {
+				each(valueRanges, function (range) {
+					from = range.from;
+					to = range.to;
+					
+					// Assemble the default name. This can be overridden by legend.options.labelFormatter
+					name = '';
+					if (from === UNDEFINED) {
+						name = '< ';
+					} else if (to === UNDEFINED) {
+						name = '> ';
+					}
+					if (from !== UNDEFINED) {
+						name += numberFormat(from, valueDecimals);
+					}
+					if (from !== UNDEFINED && to !== UNDEFINED) {
+						name += ' - ';
+					}
+					if (to !== UNDEFINED) {
+						name += numberFormat(to, valueDecimals);
+					}
+					
+					// Add a mock object to the legend items
+					legendItems.push(Highcharts.extend({
+						chart: series.chart,
+						name: name,
+						options: {},
+						drawLegendSymbol: seriesTypes.area.prototype.drawLegendSymbol,
+						visible: true,
+						setState: function () {},
+						setVisible: function () {}
+					}, range));
+				});
+				series.legendItems = legendItems;
+
+			} else if (colorRange) {
+
+				from = colorRange.from;
+				to = colorRange.to;
+				fromLabel = colorRange.fromLabel;
+				toLabel = colorRange.toLabel;
+
+				// Flips linearGradient variables and label text.
+				grad = horizontal ? [0, 0, 1, 0] : [0, 1, 0, 0]; 
+				if (!horizontal) {
+					tmpLabel = fromLabel;
+					fromLabel = toLabel;
+					toLabel = tmpLabel;
+				} 
+
+				// Creates color gradient.
+				gradientColor = {
+					linearGradient: { x1: grad[0], y1: grad[1], x2: grad[2], y2: grad[3] },
+					stops: 
+					[
+						[0, from],
+						[1, to]
+					]
+				};
+
+				// Add a mock object to the legend items.
+				legendItems = [{
+					chart: series.chart,
+					options: {},
+					fromLabel: fromLabel,
+					toLabel: toLabel,
+					color: gradientColor,
+					drawLegendSymbol: this.drawLegendSymbolGradient,
+					visible: true,
+					setState: function () {},
+					setVisible: function () {}
+				}];
+
+				series.legendItems = legendItems;
+			}
+		},
+
+		/**
+		 * If neither valueRanges nor colorRanges are defined, use basic area symbol.
+		 */
+		drawLegendSymbol: seriesTypes.area.prototype.drawLegendSymbol,
+
+		/**
+		 * Gets the series' symbol in the legend and extended legend with more information.
+		 * 
+		 * @param {Object} legend The legend object
+		 * @param {Object} item The series (this) or point
+		 */
+		drawLegendSymbolGradient: function (legend, item) {
+			var spacing = legend.options.symbolPadding,
+				padding = pick(legend.options.padding, 8),
+				positionY,
+				positionX,
+				gradientSize = this.chart.renderer.fontMetrics(legend.options.itemStyle.fontSize).h,
+				horizontal = legend.options.layout === 'horizontal',
+				box1,
+				box2,
+				box3,
+				rectangleLength = pick(legend.options.rectangleLength, 200);
+
+			// Set local variables based on option.
+			if (horizontal) {
+				positionY = -(spacing / 2);
+				positionX = 0;
+			} else {
+				positionY = -rectangleLength + legend.baseline - (spacing / 2);
+				positionX = padding + gradientSize;
+			}
+
+			// Creates the from text.
+			item.fromText = this.chart.renderer.text(
+					item.fromLabel,	// Text.
+					positionX,		// Lower left x.
+					positionY		// Lower left y.
+				).attr({
+					zIndex: 2
+				}).add(item.legendGroup);
+			box1 = item.fromText.getBBox();
+
+			// Creates legend symbol.
+			// Ternary changes variables based on option.
+			item.legendSymbol = this.chart.renderer.rect(
+				horizontal ? box1.x + box1.width + spacing : box1.x - gradientSize - spacing,		// Upper left x.
+				box1.y,																				// Upper left y.
+				horizontal ? rectangleLength : gradientSize,											// Width.
+				horizontal ? gradientSize : rectangleLength,										// Height.
+				2																					// Corner radius.
+			).attr({
+				zIndex: 1
+			}).add(item.legendGroup);
+			box2 = item.legendSymbol.getBBox();
+
+			// Creates the to text.
+			// Vertical coordinate changed based on option.
+			item.toText = this.chart.renderer.text(
+					item.toLabel,
+					box2.x + box2.width + spacing,
+					horizontal ? positionY : box2.y + box2.height - spacing
+				).attr({
+					zIndex: 2
+				}).add(item.legendGroup);
+			box3 = item.toText.getBBox();
+
+			// Changes legend box settings based on option.
+			if (horizontal) {
+				legend.offsetWidth = box1.width + box2.width + box3.width + (spacing * 2) + padding;
+				legend.itemY = gradientSize + padding;
+			} else {
+				legend.offsetWidth = Math.max(box1.width, box3.width) + (spacing) + box2.width + padding;
+				legend.itemY = box2.height + padding;
+				legend.itemX = spacing;
+			}
+		},
+
+		/**
+		 * Get the bounding box of all paths in the map combined.
+		 */
+		getBox: function (paths) {
+			var maxX = Number.MIN_VALUE, 
+				minX =  Number.MAX_VALUE, 
+				maxY = Number.MIN_VALUE, 
+				minY =  Number.MAX_VALUE;
+			
+			
+			// Find the bounding box
+			each(paths || this.options.data, function (point) {
+				var path = point.path,
+					i = path.length,
+					even = false, // while loop reads from the end
+					pointMaxX = Number.MIN_VALUE, 
+					pointMinX =  Number.MAX_VALUE, 
+					pointMaxY = Number.MIN_VALUE, 
+					pointMinY =  Number.MAX_VALUE;
+					
+				while (i--) {
+					if (typeof path[i] === 'number' && !isNaN(path[i])) {
+						if (even) { // even = x
+							pointMaxX = Math.max(pointMaxX, path[i]);
+							pointMinX = Math.min(pointMinX, path[i]);
+						} else { // odd = Y
+							pointMaxY = Math.max(pointMaxY, path[i]);
+							pointMinY = Math.min(pointMinY, path[i]);
+						}
+						even = !even;
+					}
+				}
+				// Cache point bounding box for use to position data labels
+				point._maxX = pointMaxX;
+				point._minX = pointMinX;
+				point._maxY = pointMaxY;
+				point._minY = pointMinY;
+
+				maxX = Math.max(maxX, pointMaxX);
+				minX = Math.min(minX, pointMinX);
+				maxY = Math.max(maxY, pointMaxY);
+				minY = Math.min(minY, pointMinY);
+			});
+			this.minY = minY;
+			this.maxY = maxY;
+			this.minX = minX;
+			this.maxX = maxX;
+			
+		},
+		
+		
+		
+		/**
+		 * Translate the path so that it automatically fits into the plot area box
+		 * @param {Object} path
+		 */
+		translatePath: function (path) {
+			
+			var series = this,
+				even = false, // while loop reads from the end
+				xAxis = series.xAxis,
+				yAxis = series.yAxis,
+				i;
+				
+			// Preserve the original
+			path = [].concat(path);
+				
+			// Do the translation
+			i = path.length;
+			while (i--) {
+				if (typeof path[i] === 'number') {
+					if (even) { // even = x
+						path[i] = Math.round(xAxis.translate(path[i]));
+					} else { // odd = Y
+						path[i] = Math.round(yAxis.len - yAxis.translate(path[i]));
+					}
+					even = !even;
+				}
+			}
+			return path;
+		},
+		
+		setData: function () {
+			Highcharts.Series.prototype.setData.apply(this, arguments);
+			this.getBox();
+		},
+		
+		/**
+		 * Add the path option for data points. Find the max value for color calculation.
+		 */
+		translate: function () {
+			var series = this,
+				dataMin = Number.MAX_VALUE,
+				dataMax = Number.MIN_VALUE;
+	
+			series.generatePoints();
+	
+			each(series.data, function (point) {
+				
+				point.shapeType = 'path';
+				point.shapeArgs = {
+					d: series.translatePath(point.path)
+				};
+				
+				// TODO: do point colors in drawPoints instead of point.init
+				if (typeof point.y === 'number') {
+					if (point.y > dataMax) {
+						dataMax = point.y;
+					} else if (point.y < dataMin) {
+						dataMin = point.y;
+					}
+				}
+			});
+			
+			series.translateColors(dataMin, dataMax);
+		},
+		
+		/**
+		 * In choropleth maps, the color is a result of the value, so this needs translation too
+		 */
+		translateColors: function (dataMin, dataMax) {
+			
+			var seriesOptions = this.options,
+				valueRanges = seriesOptions.valueRanges,
+				colorRange = seriesOptions.colorRange,
+				colorKey = this.colorKey,
+				from,
+				to;
+
+			if (colorRange) {
+				from = Color(colorRange.from);
+				to = Color(colorRange.to);
+			}
+			
+			each(this.data, function (point) {
+				var value = point[colorKey],
+					range,
+					color,
+					i,
+					pos;
+
+				if (valueRanges) {
+					i = valueRanges.length;
+					while (i--) {
+						range = valueRanges[i];
+						from = range.from;
+						to = range.to;
+						if ((from === UNDEFINED || value >= from) && (to === UNDEFINED || value <= to)) {
+							color = range.color;
+							break;
+						}
+							
+					}
+				} else if (colorRange && value !== undefined) {
+
+					pos = 1 - ((dataMax - value) / (dataMax - dataMin));
+					color = value === null ? seriesOptions.nullColor : tweenColors(from, to, pos);
+				}
+
+				if (color) {
+					point.color = null; // reset from previous drilldowns, use of the same data options
+					point.options.color = color;
+				}
+			});
+		},
+		
+		drawGraph: noop,
+		
+		/**
+		 * We need the points' bounding boxes in order to draw the data labels, so 
+		 * we skip it now and call if from drawPoints instead.
+		 */
+		drawDataLabels: noop,
+		
+		/** 
+		 * Use the drawPoints method of column, that is able to handle simple shapeArgs.
+		 * Extend it by assigning the tooltip position.
+		 */
+		drawPoints: function () {
+			var series = this,
+				xAxis = series.xAxis,
+				yAxis = series.yAxis,
+				colorKey = series.colorKey;
+			
+			// Make points pass test in drawing
+			each(series.data, function (point) {
+				point.plotY = 1; // pass null test in column.drawPoints
+				if (point[colorKey] === null) {
+					point[colorKey] = 0;
+					point.isNull = true;
+				}
+			});
+			
+			// Draw them
+			seriesTypes.column.prototype.drawPoints.apply(series);
+			
+			each(series.data, function (point) {
+
+				var dataLabels = point.dataLabels,
+					minX = xAxis.toPixels(point._minX, true),
+					maxX = xAxis.toPixels(point._maxX, true),
+					minY = yAxis.toPixels(point._minY, true),
+					maxY = yAxis.toPixels(point._maxY, true);
+
+				point.plotX = Math.round(minX + (maxX - minX) * pick(dataLabels && dataLabels.anchorX, 0.5));
+				point.plotY = Math.round(minY + (maxY - minY) * pick(dataLabels && dataLabels.anchorY, 0.5)); 
+				
+				
+				// Reset escaped null points
+				if (point.isNull) {
+					point[colorKey] = null;
+				}
+			});
+
+			// Now draw the data labels
+			Highcharts.Series.prototype.drawDataLabels.call(series);
+			
+		},
+
+		/**
+		 * Animate in the new series from the clicked point in the old series.
+		 * Depends on the drilldown.js module
+		 */
+		animateDrilldown: function (init) {
+			var toBox = this.chart.plotBox,
+				level = this.chart.drilldownLevels[this.chart.drilldownLevels.length - 1],
+				fromBox = level.bBox,
+				animationOptions = this.chart.options.drilldown.animation,
+				scale;
+				
+			if (!init) {
+
+				scale = Math.min(fromBox.width / toBox.width, fromBox.height / toBox.height);
+				level.shapeArgs = {
+					scaleX: scale,
+					scaleY: scale,
+					translateX: fromBox.x,
+					translateY: fromBox.y
+				};
+				
+				// TODO: Animate this.group instead
+				each(this.points, function (point) {
+
+					point.graphic
+						.attr(level.shapeArgs)
+						.animate({
+							scaleX: 1,
+							scaleY: 1,
+							translateX: 0,
+							translateY: 0
+						}, animationOptions);
+
+				});
+
+				delete this.animate;
+			}
+			
+		},
+
+		/**
+		 * When drilling up, pull out the individual point graphics from the lower series
+		 * and animate them into the origin point in the upper series.
+		 */
+		animateDrillupFrom: function (level) {
+			seriesTypes.column.prototype.animateDrillupFrom.call(this, level);
+		},
+
+
+		/**
+		 * When drilling up, keep the upper series invisible until the lower series has
+		 * moved into place
+		 */
+		animateDrillupTo: function (init) {
+			seriesTypes.column.prototype.animateDrillupTo.call(this, init);
+		}
+	});
+
+
+	// The mapline series type
+	plotOptions.mapline = merge(plotOptions.map, {
+		lineWidth: 1,
+		backgroundColor: 'none'
+	});
+	seriesTypes.mapline = Highcharts.extendClass(seriesTypes.map, {
+		type: 'mapline',
+		pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+			stroke: 'color',
+			'stroke-width': 'lineWidth',
+			fill: 'backgroundColor'
+		},
+		drawLegendSymbol: seriesTypes.line.prototype.drawLegendSymbol
+	});
+
+	// The mappoint series type
+	plotOptions.mappoint = merge(plotOptions.scatter, {
+		dataLabels: {
+			enabled: true,
+			format: '{point.name}',
+			color: 'black',
+			style: {
+				textShadow: '0 0 5px white'
+			}
+		}
+	});
+	seriesTypes.mappoint = Highcharts.extendClass(seriesTypes.scatter, {
+		type: 'mappoint'
+	});
+	
+
+	
+	/**
+	 * A wrapper for Chart with all the default values for a Map
+	 */
+	Highcharts.Map = function (options, callback) {
+		
+		var hiddenAxis = {
+				endOnTick: false,
+				gridLineWidth: 0,
+				labels: {
+					enabled: false
+				},
+				lineWidth: 0,
+				minPadding: 0,
+				maxPadding: 0,
+				startOnTick: false,
+				tickWidth: 0,
+				title: null
+			},
+			seriesOptions;
+		
+		// Don't merge the data
+		seriesOptions = options.series;
+		options.series = null;
+		
+		options = merge({
+			chart: {
+				type: 'map',
+				panning: 'xy'
+			},
+			xAxis: hiddenAxis,
+			yAxis: merge(hiddenAxis, { reversed: true })	
+		},
+		options, // user's options
+	
+		{ // forced options
+			chart: {
+				inverted: false
+			}
+		});
+	
+		options.series = seriesOptions;
+	
+	
+		return new Highcharts.Chart(options, callback);
+	};
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/no-data-to-display.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/no-data-to-display.js
new file mode 100644
index 0000000..c9ff9ca
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/no-data-to-display.js
@@ -0,0 +1,12 @@
+/*
+ Highcharts JS v3.0.6 (2013-10-04)
+ Plugin for displaying a message when there is no data visible in chart.
+
+ (c) 2010-2013 Highsoft AS
+ Author: Øystein Moseng
+
+ License: www.highcharts.com/license
+*/
+(function(c){function f(){return!!this.points.length}function g(){this.hasData()?this.hideNoData():this.showNoData()}var d=c.seriesTypes,e=c.Chart.prototype,h=c.getOptions(),i=c.extend;i(h.lang,{noData:"No data to display"});h.noData={position:{x:0,y:0,align:"center",verticalAlign:"middle"},attr:{},style:{fontWeight:"bold",fontSize:"12px",color:"#60606a"}};d.pie.prototype.hasData=f;if(d.gauge)d.gauge.prototype.hasData=f;if(d.waterfall)d.waterfall.prototype.hasData=f;c.Series.prototype.hasData=function(){return this.dataMax!==
+void 0&&this.dataMin!==void 0};e.showNoData=function(a){var b=this.options,a=a||b.lang.noData,b=b.noData;if(!this.noDataLabel)this.noDataLabel=this.renderer.label(a,0,0,null,null,null,null,null,"no-data").attr(b.attr).css(b.style).add(),this.noDataLabel.align(i(this.noDataLabel.getBBox(),b.position),!1,"plotBox")};e.hideNoData=function(){if(this.noDataLabel)this.noDataLabel=this.noDataLabel.destroy()};e.hasData=function(){for(var a=this.series,b=a.length;b--;)if(a[b].hasData()&&!a[b].options.isInternal)return!0;
+return!1};e.callbacks.push(function(a){c.addEvent(a,"load",g);c.addEvent(a,"redraw",g)})})(Highcharts);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/no-data-to-display.src.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/no-data-to-display.src.js
new file mode 100644
index 0000000..bc278a8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/modules/no-data-to-display.src.js
@@ -0,0 +1,128 @@
+/**
+ * @license Highcharts JS v3.0.6 (2013-10-04)
+ * Plugin for displaying a message when there is no data visible in chart.
+ *
+ * (c) 2010-2013 Highsoft AS
+ * Author: Øystein Moseng
+ *
+ * License: www.highcharts.com/license
+ */
+
+(function (H) { // docs
+	
+	var seriesTypes = H.seriesTypes,
+		chartPrototype = H.Chart.prototype,
+		defaultOptions = H.getOptions(),
+		extend = H.extend;
+
+	// Add language option
+	extend(defaultOptions.lang, {
+		noData: 'No data to display'
+	});
+	
+	// Add default display options for message
+	defaultOptions.noData = {
+		position: {
+			x: 0,
+			y: 0,			
+			align: 'center',
+			verticalAlign: 'middle'
+		},
+		attr: {						
+		},
+		style: {	
+			fontWeight: 'bold',		
+			fontSize: '12px',
+			color: '#60606a'		
+		}
+	};
+
+	/**
+	 * Define hasData functions for series. These return true if there are data points on this series within the plot area
+	 */	
+	function hasDataPie() {
+		return !!this.points.length; /* != 0 */
+	}
+
+	seriesTypes.pie.prototype.hasData = hasDataPie;
+
+	if (seriesTypes.gauge) {
+		seriesTypes.gauge.prototype.hasData = hasDataPie;
+	}
+
+	if (seriesTypes.waterfall) {
+		seriesTypes.waterfall.prototype.hasData = hasDataPie;
+	}
+
+	H.Series.prototype.hasData = function () {
+		return this.dataMax !== undefined && this.dataMin !== undefined;
+	};
+	
+	/**
+	 * Display a no-data message.
+	 *
+	 * @param {String} str An optional message to show in place of the default one 
+	 */
+	chartPrototype.showNoData = function (str) {
+		var chart = this,
+			options = chart.options,
+			text = str || options.lang.noData,
+			noDataOptions = options.noData;
+
+		if (!chart.noDataLabel) {
+			chart.noDataLabel = chart.renderer.label(text, 0, 0, null, null, null, null, null, 'no-data')
+				.attr(noDataOptions.attr)
+				.css(noDataOptions.style)
+				.add();
+			chart.noDataLabel.align(extend(chart.noDataLabel.getBBox(), noDataOptions.position), false, 'plotBox');
+		}
+	};
+
+	/**
+	 * Hide no-data message	
+	 */	
+	chartPrototype.hideNoData = function () {
+		var chart = this;
+		if (chart.noDataLabel) {
+			chart.noDataLabel = chart.noDataLabel.destroy();
+		}
+	};
+
+	/**
+	 * Returns true if there are data points within the plot area now
+	 */	
+	chartPrototype.hasData = function () {
+		var chart = this,
+			series = chart.series,
+			i = series.length;
+
+		while (i--) {
+			if (series[i].hasData() && !series[i].options.isInternal) { 
+				return true;
+			}	
+		}
+
+		return false;
+	};
+
+	/**
+	 * Show no-data message if there is no data in sight. Otherwise, hide it.
+	 */
+	function handleNoData() {
+		var chart = this;
+		if (chart.hasData()) {
+			chart.hideNoData();
+		} else {
+			chart.showNoData();
+		}
+	}
+
+	/**
+	 * Add event listener to handle automatic display of no-data message
+	 */
+	chartPrototype.callbacks.push(function (chart) {
+		H.addEvent(chart, 'load', handleNoData);
+		H.addEvent(chart, 'redraw', handleNoData);
+	});
+
+}(Highcharts));
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/dark-blue.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/dark-blue.js
new file mode 100644
index 0000000..47e53e0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/dark-blue.js
@@ -0,0 +1,254 @@
+/**
+ * Dark blue theme for Highcharts JS
+ * @author Torstein Hønsi
+ */
+
+Highcharts.theme = {
+	colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 1, y2: 1 },
+			stops: [
+				[0, 'rgb(48, 48, 96)'],
+				[1, 'rgb(0, 0, 0)']
+			]
+		},
+		borderColor: '#000000',
+		borderWidth: 2,
+		className: 'dark-container',
+		plotBackgroundColor: 'rgba(255, 255, 255, .1)',
+		plotBorderColor: '#CCCCCC',
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#C0C0C0',
+			font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#666666',
+			font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineColor: '#333333',
+		gridLineWidth: 1,
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		tickColor: '#A0A0A0',
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+			}
+		}
+	},
+	yAxis: {
+		gridLineColor: '#333333',
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		minorTickInterval: null,
+		tickColor: '#A0A0A0',
+		tickWidth: 1,
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+			}
+		}
+	},
+	tooltip: {
+		backgroundColor: 'rgba(0, 0, 0, 0.75)',
+		style: {
+			color: '#F0F0F0'
+		}
+	},
+	toolbar: {
+		itemStyle: {
+			color: 'silver'
+		}
+	},
+	plotOptions: {
+		line: {
+			dataLabels: {
+				color: '#CCC'
+			},
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		spline: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		scatter: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		candlestick: {
+			lineColor: 'white'
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: '#A0A0A0'
+		},
+		itemHoverStyle: {
+			color: '#FFF'
+		},
+		itemHiddenStyle: {
+			color: '#444'
+		}
+	},
+	credits: {
+		style: {
+			color: '#666'
+		}
+	},
+	labels: {
+		style: {
+			color: '#CCC'
+		}
+	},
+
+	navigation: {
+		buttonOptions: {
+			symbolStroke: '#DDDDDD',
+			hoverSymbolStroke: '#FFFFFF',
+			theme: {
+				fill: {
+					linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+					stops: [
+						[0.4, '#606060'],
+						[0.6, '#333333']
+					]
+				},
+				stroke: '#000000'
+			}
+		}
+	},
+
+	// scroll charts
+	rangeSelector: {
+		buttonTheme: {
+			fill: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+			stroke: '#000000',
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold'
+			},
+			states: {
+				hover: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.4, '#BBB'],
+							[0.6, '#888']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'white'
+					}
+				},
+				select: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.1, '#000'],
+							[0.3, '#333']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'yellow'
+					}
+				}
+			}
+		},
+		inputStyle: {
+			backgroundColor: '#333',
+			color: 'silver'
+		},
+		labelStyle: {
+			color: 'silver'
+		}
+	},
+
+	navigator: {
+		handles: {
+			backgroundColor: '#666',
+			borderColor: '#AAA'
+		},
+		outlineColor: '#CCC',
+		maskFill: 'rgba(16, 16, 16, 0.5)',
+		series: {
+			color: '#7798BF',
+			lineColor: '#A6C7ED'
+		}
+	},
+
+	scrollbar: {
+		barBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		barBorderColor: '#CCC',
+		buttonArrowColor: '#CCC',
+		buttonBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		buttonBorderColor: '#CCC',
+		rifleColor: '#FFF',
+		trackBackgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#000'],
+				[1, '#333']
+			]
+		},
+		trackBorderColor: '#666'
+	},
+
+	// special colors for some of the
+	legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',
+	legendBackgroundColorSolid: 'rgb(35, 35, 70)',
+	dataLabelsColor: '#444',
+	textColor: '#C0C0C0',
+	maskColor: 'rgba(255,255,255,0.3)'
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/dark-green.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/dark-green.js
new file mode 100644
index 0000000..5edddf9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/dark-green.js
@@ -0,0 +1,255 @@
+/**
+ * Dark blue theme for Highcharts JS
+ * @author Torstein Hønsi
+ */
+
+Highcharts.theme = {
+	colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: {
+			linearGradient: [0, 0, 250, 500],
+			stops: [
+				[0, 'rgb(48, 96, 48)'],
+				[1, 'rgb(0, 0, 0)']
+			]
+		},
+		borderColor: '#000000',
+		borderWidth: 2,
+		className: 'dark-container',
+		plotBackgroundColor: 'rgba(255, 255, 255, .1)',
+		plotBorderColor: '#CCCCCC',
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#C0C0C0',
+			font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#666666',
+			font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineColor: '#333333',
+		gridLineWidth: 1,
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		tickColor: '#A0A0A0',
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+			}
+		}
+	},
+	yAxis: {
+		gridLineColor: '#333333',
+		labels: {
+			style: {
+				color: '#A0A0A0'
+			}
+		},
+		lineColor: '#A0A0A0',
+		minorTickInterval: null,
+		tickColor: '#A0A0A0',
+		tickWidth: 1,
+		title: {
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+			}
+		}
+	},
+	tooltip: {
+		backgroundColor: 'rgba(0, 0, 0, 0.75)',
+		style: {
+			color: '#F0F0F0'
+		}
+	},
+	toolbar: {
+		itemStyle: {
+			color: 'silver'
+		}
+	},
+	plotOptions: {
+		line: {
+			dataLabels: {
+				color: '#CCC'
+			},
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		spline: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		scatter: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		candlestick: {
+			lineColor: 'white'
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: '#A0A0A0'
+		},
+		itemHoverStyle: {
+			color: '#FFF'
+		},
+		itemHiddenStyle: {
+			color: '#444'
+		}
+	},
+	credits: {
+		style: {
+			color: '#666'
+		}
+	},
+	labels: {
+		style: {
+			color: '#CCC'
+		}
+	},
+
+
+	navigation: {
+		buttonOptions: {
+			symbolStroke: '#DDDDDD',
+			hoverSymbolStroke: '#FFFFFF',
+			theme: {
+				fill: {
+					linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+					stops: [
+						[0.4, '#606060'],
+						[0.6, '#333333']
+					]
+				},
+				stroke: '#000000'
+			}
+		}
+	},
+
+	// scroll charts
+	rangeSelector: {
+		buttonTheme: {
+			fill: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+			stroke: '#000000',
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold'
+			},
+			states: {
+				hover: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.4, '#BBB'],
+							[0.6, '#888']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'white'
+					}
+				},
+				select: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.1, '#000'],
+							[0.3, '#333']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'yellow'
+					}
+				}
+			}
+		},
+		inputStyle: {
+			backgroundColor: '#333',
+			color: 'silver'
+		},
+		labelStyle: {
+			color: 'silver'
+		}
+	},
+
+	navigator: {
+		handles: {
+			backgroundColor: '#666',
+			borderColor: '#AAA'
+		},
+		outlineColor: '#CCC',
+		maskFill: 'rgba(16, 16, 16, 0.5)',
+		series: {
+			color: '#7798BF',
+			lineColor: '#A6C7ED'
+		}
+	},
+
+	scrollbar: {
+		barBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		barBorderColor: '#CCC',
+		buttonArrowColor: '#CCC',
+		buttonBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		buttonBorderColor: '#CCC',
+		rifleColor: '#FFF',
+		trackBackgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#000'],
+				[1, '#333']
+			]
+		},
+		trackBorderColor: '#666'
+	},
+
+	// special colors for some of the
+	legendBackgroundColor: 'rgba(0, 0, 0, 0.5)',
+	legendBackgroundColorSolid: 'rgb(35, 35, 70)',
+	dataLabelsColor: '#444',
+	textColor: '#C0C0C0',
+	maskColor: 'rgba(255,255,255,0.3)'
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/gray.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/gray.js
new file mode 100644
index 0000000..4e8f82a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/gray.js
@@ -0,0 +1,257 @@
+/**
+ * Gray theme for Highcharts JS
+ * @author Torstein Hønsi
+ */
+
+Highcharts.theme = {
+	colors: ["#DDDF0D", "#7798BF", "#55BF3B", "#DF5353", "#aaeeee", "#ff0066", "#eeaaee",
+		"#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
+	chart: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, 'rgb(96, 96, 96)'],
+				[1, 'rgb(16, 16, 16)']
+			]
+		},
+		borderWidth: 0,
+		borderRadius: 15,
+		plotBackgroundColor: null,
+		plotShadow: false,
+		plotBorderWidth: 0
+	},
+	title: {
+		style: {
+			color: '#FFF',
+			font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#DDD',
+			font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineWidth: 0,
+		lineColor: '#999',
+		tickColor: '#999',
+		labels: {
+			style: {
+				color: '#999',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#AAA',
+				font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	yAxis: {
+		alternateGridColor: null,
+		minorTickInterval: null,
+		gridLineColor: 'rgba(255, 255, 255, .1)',
+		minorGridLineColor: 'rgba(255,255,255,0.07)',
+		lineWidth: 0,
+		tickWidth: 0,
+		labels: {
+			style: {
+				color: '#999',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#AAA',
+				font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	legend: {
+		itemStyle: {
+			color: '#CCC'
+		},
+		itemHoverStyle: {
+			color: '#FFF'
+		},
+		itemHiddenStyle: {
+			color: '#333'
+		}
+	},
+	labels: {
+		style: {
+			color: '#CCC'
+		}
+	},
+	tooltip: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, 'rgba(96, 96, 96, .8)'],
+				[1, 'rgba(16, 16, 16, .8)']
+			]
+		},
+		borderWidth: 0,
+		style: {
+			color: '#FFF'
+		}
+	},
+
+
+	plotOptions: {
+		series: {
+			shadow: true
+		},
+		line: {
+			dataLabels: {
+				color: '#CCC'
+			},
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		spline: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		scatter: {
+			marker: {
+				lineColor: '#333'
+			}
+		},
+		candlestick: {
+			lineColor: 'white'
+		}
+	},
+
+	toolbar: {
+		itemStyle: {
+			color: '#CCC'
+		}
+	},
+
+	navigation: {
+		buttonOptions: {
+			symbolStroke: '#DDDDDD',
+			hoverSymbolStroke: '#FFFFFF',
+			theme: {
+				fill: {
+					linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+					stops: [
+						[0.4, '#606060'],
+						[0.6, '#333333']
+					]
+				},
+				stroke: '#000000'
+			}
+		}
+	},
+
+	// scroll charts
+	rangeSelector: {
+		buttonTheme: {
+			fill: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+			stroke: '#000000',
+			style: {
+				color: '#CCC',
+				fontWeight: 'bold'
+			},
+			states: {
+				hover: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.4, '#BBB'],
+							[0.6, '#888']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'white'
+					}
+				},
+				select: {
+					fill: {
+						linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+						stops: [
+							[0.1, '#000'],
+							[0.3, '#333']
+						]
+					},
+					stroke: '#000000',
+					style: {
+						color: 'yellow'
+					}
+				}
+			}
+		},
+		inputStyle: {
+			backgroundColor: '#333',
+			color: 'silver'
+		},
+		labelStyle: {
+			color: 'silver'
+		}
+	},
+
+	navigator: {
+		handles: {
+			backgroundColor: '#666',
+			borderColor: '#AAA'
+		},
+		outlineColor: '#CCC',
+		maskFill: 'rgba(16, 16, 16, 0.5)',
+		series: {
+			color: '#7798BF',
+			lineColor: '#A6C7ED'
+		}
+	},
+
+	scrollbar: {
+		barBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		barBorderColor: '#CCC',
+		buttonArrowColor: '#CCC',
+		buttonBackgroundColor: {
+				linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+				stops: [
+					[0.4, '#888'],
+					[0.6, '#555']
+				]
+			},
+		buttonBorderColor: '#CCC',
+		rifleColor: '#FFF',
+		trackBackgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
+			stops: [
+				[0, '#000'],
+				[1, '#333']
+			]
+		},
+		trackBorderColor: '#666'
+	},
+
+	// special colors for some of the demo examples
+	legendBackgroundColor: 'rgba(48, 48, 48, 0.8)',
+	legendBackgroundColorSolid: 'rgb(70, 70, 70)',
+	dataLabelsColor: '#444',
+	textColor: '#E0E0E0',
+	maskColor: 'rgba(255,255,255,0.3)'
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/grid.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/grid.js
new file mode 100644
index 0000000..cee0657
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/grid.js
@@ -0,0 +1,103 @@
+/**
+ * Grid theme for Highcharts JS
+ * @author Torstein Hønsi
+ */
+
+Highcharts.theme = {
+	colors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'],
+	chart: {
+		backgroundColor: {
+			linearGradient: { x1: 0, y1: 0, x2: 1, y2: 1 },
+			stops: [
+				[0, 'rgb(255, 255, 255)'],
+				[1, 'rgb(240, 240, 255)']
+			]
+		},
+		borderWidth: 2,
+		plotBackgroundColor: 'rgba(255, 255, 255, .9)',
+		plotShadow: true,
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#000',
+			font: 'bold 16px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#666666',
+			font: 'bold 12px "Trebuchet MS", Verdana, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineWidth: 1,
+		lineColor: '#000',
+		tickColor: '#000',
+		labels: {
+			style: {
+				color: '#000',
+				font: '11px Trebuchet MS, Verdana, sans-serif'
+			}
+		},
+		title: {
+			style: {
+				color: '#333',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+
+			}
+		}
+	},
+	yAxis: {
+		minorTickInterval: 'auto',
+		lineColor: '#000',
+		lineWidth: 1,
+		tickWidth: 1,
+		tickColor: '#000',
+		labels: {
+			style: {
+				color: '#000',
+				font: '11px Trebuchet MS, Verdana, sans-serif'
+			}
+		},
+		title: {
+			style: {
+				color: '#333',
+				fontWeight: 'bold',
+				fontSize: '12px',
+				fontFamily: 'Trebuchet MS, Verdana, sans-serif'
+			}
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: 'black'
+
+		},
+		itemHoverStyle: {
+			color: '#039'
+		},
+		itemHiddenStyle: {
+			color: 'gray'
+		}
+	},
+	labels: {
+		style: {
+			color: '#99b'
+		}
+	},
+
+	navigation: {
+		buttonOptions: {
+			theme: {
+				stroke: '#CCCCCC'
+			}
+		}
+	}
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/skies.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/skies.js
new file mode 100644
index 0000000..e942648
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/highcharts/themes/skies.js
@@ -0,0 +1,89 @@
+/**
+ * Skies theme for Highcharts JS
+ * @author Torstein Hønsi
+ */
+
+Highcharts.theme = {
+	colors: ["#514F78", "#42A07B", "#9B5E4A", "#72727F", "#1F949A", "#82914E", "#86777F", "#42A07B"],
+	chart: {
+		className: 'skies',
+		borderWidth: 0,
+		plotShadow: true,
+		plotBackgroundImage: 'http://www.highcharts.com/demo/gfx/skies.jpg',
+		plotBackgroundColor: {
+			linearGradient: [0, 0, 250, 500],
+			stops: [
+				[0, 'rgba(255, 255, 255, 1)'],
+				[1, 'rgba(255, 255, 255, 0)']
+			]
+		},
+		plotBorderWidth: 1
+	},
+	title: {
+		style: {
+			color: '#3E576F',
+			font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	subtitle: {
+		style: {
+			color: '#6D869F',
+			font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+		}
+	},
+	xAxis: {
+		gridLineWidth: 0,
+		lineColor: '#C0D0E0',
+		tickColor: '#C0D0E0',
+		labels: {
+			style: {
+				color: '#666',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#666',
+				font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	yAxis: {
+		alternateGridColor: 'rgba(255, 255, 255, .5)',
+		lineColor: '#C0D0E0',
+		tickColor: '#C0D0E0',
+		tickWidth: 1,
+		labels: {
+			style: {
+				color: '#666',
+				fontWeight: 'bold'
+			}
+		},
+		title: {
+			style: {
+				color: '#666',
+				font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif'
+			}
+		}
+	},
+	legend: {
+		itemStyle: {
+			font: '9pt Trebuchet MS, Verdana, sans-serif',
+			color: '#3E576F'
+		},
+		itemHoverStyle: {
+			color: 'black'
+		},
+		itemHiddenStyle: {
+			color: 'silver'
+		}
+	},
+	labels: {
+		style: {
+			color: '#3E576F'
+		}
+	}
+};
+
+// Apply the theme
+var highchartsOptions = Highcharts.setOptions(Highcharts.theme);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.js
new file mode 100644
index 0000000..c5c6482
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.js
@@ -0,0 +1,9789 @@
+/*!
+ * jQuery JavaScript Library v1.10.2
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03T13:48Z
+ */
+(function( window, undefined ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//"use strict";
+var
+	// The deferred used on DOM ready
+	readyList,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// Support: IE<10
+	// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
+	core_strundefined = typeof undefined,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	location = window.location,
+	document = window.document,
+	docElem = document.documentElement,
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// [[Class]] -> type pairs
+	class2type = {},
+
+	// List of deleted data cache ids, so we can reuse them
+	core_deletedIds = [],
+
+	core_version = "1.10.2",
+
+	// Save a reference to some core methods
+	core_concat = core_deletedIds.concat,
+	core_push = core_deletedIds.push,
+	core_slice = core_deletedIds.slice,
+	core_indexOf = core_deletedIds.indexOf,
+	core_toString = class2type.toString,
+	core_hasOwn = class2type.hasOwnProperty,
+	core_trim = core_version.trim,
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Used for matching numbers
+	core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+	// Used for splitting on whitespace
+	core_rnotwhite = /\S+/g,
+
+	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	},
+
+	// The ready event handler
+	completed = function( event ) {
+
+		// readyState === "complete" is good enough for us to call the dom ready in oldIE
+		if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+			detach();
+			jQuery.ready();
+		}
+	},
+	// Clean-up method for dom ready events
+	detach = function() {
+		if ( document.addEventListener ) {
+			document.removeEventListener( "DOMContentLoaded", completed, false );
+			window.removeEventListener( "load", completed, false );
+
+		} else {
+			document.detachEvent( "onreadystatechange", completed );
+			window.detachEvent( "onload", completed );
+		}
+	};
+
+jQuery.fn = jQuery.prototype = {
+	// The current version of jQuery being used
+	jquery: core_version,
+
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector.charAt(0) === "<" && selector.charAt( 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;
+
+					// scripts is true for back-compat
+					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 ( jQuery.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] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).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.context = this[0] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return core_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 num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : 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;
+		ret.context = this.context;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Add the callback
+		jQuery.ready.promise().done( fn );
+
+		return this;
+	},
+
+	slice: function() {
+		return this.pushStack( core_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] ] : [] );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: core_push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var src, copyIsArray, copy, name, options, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		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 = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.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
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// 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,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// 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;
+		}
+
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( !document.body ) {
+			return setTimeout( jQuery.ready );
+		}
+
+		// 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 ] );
+
+		// Trigger any bound ready events
+		if ( jQuery.fn.trigger ) {
+			jQuery( document ).trigger("ready").off("ready");
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	isWindow: function( obj ) {
+		/* jshint eqeqeq: false */
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		if ( obj == null ) {
+			return String( obj );
+		}
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ core_toString.call(obj) ] || "object" :
+			typeof obj;
+	},
+
+	isPlainObject: function( obj ) {
+		var key;
+
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!core_hasOwn.call(obj, "constructor") &&
+				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Support: IE<9
+		// Handle iteration over inherited properties before own properties.
+		if ( jQuery.support.ownLast ) {
+			for ( key in obj ) {
+				return core_hasOwn.call( obj, key );
+			}
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+		for ( key in obj ) {}
+
+		return key === undefined || core_hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	// data: string of html
+	// context (optional): If specified, the fragment will be created in this context, defaults to document
+	// keepScripts (optional): If true, will include scripts passed in the html string
+	parseHTML: function( data, context, keepScripts ) {
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		if ( typeof context === "boolean" ) {
+			keepScripts = context;
+			context = false;
+		}
+		context = context || document;
+
+		var parsed = rsingleTag.exec( data ),
+			scripts = !keepScripts && [];
+
+		// Single tag
+		if ( parsed ) {
+			return [ context.createElement( parsed[1] ) ];
+		}
+
+		parsed = jQuery.buildFragment( [ data ], context, scripts );
+		if ( scripts ) {
+			jQuery( scripts ).remove();
+		}
+		return jQuery.merge( [], parsed.childNodes );
+	},
+
+	parseJSON: function( data ) {
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		if ( data === null ) {
+			return data;
+		}
+
+		if ( typeof data === "string" ) {
+
+			// Make sure leading/trailing whitespace is removed (IE can't handle it)
+			data = jQuery.trim( data );
+
+			if ( data ) {
+				// Make sure the incoming data is actual JSON
+				// Logic borrowed from http://json.org/json2.js
+				if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+					.replace( rvalidtokens, "]" )
+					.replace( rvalidbraces, "")) ) {
+
+					return ( new Function( "return " + data ) )();
+				}
+			}
+		}
+
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && jQuery.trim( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	},
+
+	// args is for internal usage only
+	each: function( obj, callback, args ) {
+		var value,
+			i = 0,
+			length = obj.length,
+			isArray = isArraylike( obj );
+
+		if ( args ) {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+		function( text ) {
+			return text == null ?
+				"" :
+				core_trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		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 {
+				core_push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( core_indexOf ) {
+				return core_indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var l = second.length,
+			i = first.length,
+			j = 0;
+
+		if ( typeof l === "number" ) {
+			for ( ; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var retVal,
+			ret = [],
+			i = 0,
+			length = elems.length;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value,
+			i = 0,
+			length = elems.length,
+			isArray = isArraylike( elems ),
+			ret = [];
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return core_concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var args, proxy, tmp;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = core_slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Multifunctional method to get and set values of a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+		var i = 0,
+			length = elems.length,
+			bulk = key == null;
+
+		// Sets many values
+		if ( jQuery.type( key ) === "object" ) {
+			chainable = true;
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+			}
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			chainable = true;
+
+			if ( !jQuery.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 < length; i++ ) {
+					fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+				}
+			}
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations.
+	// Note: this method belongs to the css module but it's needed here for the support module.
+	// If support gets modularized, this method should be moved back to the css module.
+	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;
+	}
+});
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called after the browser event has already occurred.
+		// we once tried to use readyState "interactive" here, but it caused issues like the one
+		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			setTimeout( jQuery.ready );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", completed, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", completed, false );
+
+		// If IE event model is used
+		} else {
+			// Ensure firing before onload, maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", completed );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", completed );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch(e) {}
+
+			if ( top && top.doScroll ) {
+				(function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll("left");
+						} catch(e) {
+							return setTimeout( doScrollCheck, 50 );
+						}
+
+						// detach all dom ready events
+						detach();
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				})();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+	var length = obj.length,
+		type = jQuery.type( obj );
+
+	if ( jQuery.isWindow( obj ) ) {
+		return false;
+	}
+
+	if ( obj.nodeType === 1 && length ) {
+		return true;
+	}
+
+	return type === "array" || type !== "function" &&
+		( length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+/*!
+ * Sizzle CSS Selector Engine v1.10.2
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03
+ */
+(function( window, undefined ) {
+
+var i,
+	support,
+	cachedruns,
+	Expr,
+	getText,
+	isXML,
+	compile,
+	outermostContext,
+	sortInput,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + -(new Date()),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	hasDuplicate = false,
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+		return 0;
+	},
+
+	// General-purpose constants
+	strundefined = typeof undefined,
+	MAX_NEGATIVE = 1 << 31,
+
+	// Instance methods
+	hasOwn = ({}).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	push_native = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+	// Use a stripped-down indexOf if we can't use a native one
+	indexOf = arr.indexOf || function( elem ) {
+		var i = 0,
+			len = this.length;
+		for ( ; i < len; i++ ) {
+			if ( this[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
+
+	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+	// http://www.w3.org/TR/css3-syntax/#characters
+	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+	// Loosely modeled on CSS identifier characters
+	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = characterEncoding.replace( "w", "w#" ),
+
+	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+		"*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+	// Prefer arguments quoted,
+	//   then not containing pseudos/brackets,
+	//   then attribute selectors/non-parenthetical expressions,
+	//   then anything else
+	// These preferences are here to reduce the number of selectors
+	//   needing tokenize in the PSEUDO preFilter
+	pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+	rsibling = new RegExp( whitespace + "*[+~]" ),
+	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+		"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" )
+	},
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rescape = /'|\\/g,
+
+	// 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
+		// Workaround erroneous numeric interpretation of +"0x"
+		return high !== high || escapedWhitespace ?
+			escaped :
+			// BMP codepoint
+			high < 0 ?
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	};
+
+// 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 match, elem, m, nodeType,
+		// QSA vars
+		i, groups, old, nid, newContext, newSelector;
+
+	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+		setDocument( context );
+	}
+
+	context = context || document;
+	results = results || [];
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( documentIsHTML && !seed ) {
+
+		// Shortcuts
+		if ( (match = rquickExpr.exec( selector )) ) {
+			// Speed-up: Sizzle("#ID")
+			if ( (m = match[1]) ) {
+				if ( nodeType === 9 ) {
+					elem = context.getElementById( m );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE, Opera, and Webkit return items
+						// by name instead of ID
+						if ( elem.id === m ) {
+							results.push( elem );
+							return results;
+						}
+					} else {
+						return results;
+					}
+				} else {
+					// Context is not a document
+					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+						contains( context, elem ) && elem.id === m ) {
+						results.push( elem );
+						return results;
+					}
+				}
+
+			// Speed-up: Sizzle("TAG")
+			} else if ( match[2] ) {
+				push.apply( results, context.getElementsByTagName( selector ) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+				push.apply( results, context.getElementsByClassName( m ) );
+				return results;
+			}
+		}
+
+		// QSA path
+		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+			nid = old = expando;
+			newContext = context;
+			newSelector = nodeType === 9 && selector;
+
+			// qSA works strangely on Element-rooted queries
+			// We can work around this by specifying an extra ID on the root
+			// and working up from there (Thanks to Andrew Dupont for the technique)
+			// IE 8 doesn't work on object elements
+			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+				groups = tokenize( selector );
+
+				if ( (old = context.getAttribute("id")) ) {
+					nid = old.replace( rescape, "\\$&" );
+				} else {
+					context.setAttribute( "id", nid );
+				}
+				nid = "[id='" + nid + "'] ";
+
+				i = groups.length;
+				while ( i-- ) {
+					groups[i] = nid + toSelector( groups[i] );
+				}
+				newContext = rsibling.test( selector ) && context.parentNode || context;
+				newSelector = groups.join(",");
+			}
+
+			if ( newSelector ) {
+				try {
+					push.apply( results,
+						newContext.querySelectorAll( newSelector )
+					);
+					return results;
+				} catch(qsaError) {
+				} finally {
+					if ( !old ) {
+						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 div and expects a boolean result
+ */
+function assert( fn ) {
+	var div = document.createElement("div");
+
+	try {
+		return !!fn( div );
+	} catch (e) {
+		return false;
+	} finally {
+		// Remove from its parent by default
+		if ( div.parentNode ) {
+			div.parentNode.removeChild( div );
+		}
+		// release memory in IE
+		div = 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 = attrs.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 &&
+			( ~b.sourceIndex || MAX_NEGATIVE ) -
+			( ~a.sourceIndex || MAX_NEGATIVE );
+
+	// 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 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]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+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;
+};
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * 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 doc = node ? node.ownerDocument || node : preferredDoc,
+		parent = doc.defaultView;
+
+	// If no document and documentElement is available, return
+	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Set our document
+	document = doc;
+	docElem = doc.documentElement;
+
+	// Support tests
+	documentIsHTML = !isXML( doc );
+
+	// Support: IE>8
+	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
+	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+	// IE6-8 do not support the defaultView property so parent will be undefined
+	if ( parent && parent.attachEvent && parent !== parent.top ) {
+		parent.attachEvent( "onbeforeunload", function() {
+			setDocument();
+		});
+	}
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+	support.attributes = assert(function( div ) {
+		div.className = "i";
+		return !div.getAttribute("className");
+	});
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert(function( div ) {
+		div.appendChild( doc.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	});
+
+	// Check if getElementsByClassName can be trusted
+	support.getElementsByClassName = assert(function( div ) {
+		div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+		// Support: Safari<4
+		// Catch class over-caching
+		div.firstChild.className = "i";
+		// Support: Opera<10
+		// Catch gEBCN failure to find non-leading classes
+		return div.getElementsByClassName("i").length === 2;
+	});
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert(function( div ) {
+		docElem.appendChild( div ).id = expando;
+		return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+	});
+
+	// ID find and filter
+	if ( support.getById ) {
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+				var m = context.getElementById( id );
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		};
+		Expr.filter["ID"] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute("id") === attrId;
+			};
+		};
+	} else {
+		// Support: IE6/7
+		// getElementById is not reliable as a find shortcut
+		delete Expr.find["ID"];
+
+		Expr.filter["ID"] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+				return node && node.value === attrId;
+			};
+		};
+	}
+
+	// Tag
+	Expr.find["TAG"] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== strundefined ) {
+				return context.getElementsByTagName( tag );
+			}
+		} :
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+				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 !== strundefined && 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 http://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// 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
+			// http://bugs.jquery.com/ticket/12359
+			div.innerHTML = "<select><option selected=''></option></select>";
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// 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 ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+		});
+
+		assert(function( div ) {
+
+			// Support: Opera 10-12/IE8
+			// ^= $= *= and empty values
+			// Should not select anything
+			// Support: Windows 8 Native Apps
+			// The type attribute is restricted during .innerHTML assignment
+			var input = doc.createElement("input");
+			input.setAttribute( "type", "hidden" );
+			div.appendChild( input ).setAttribute( "t", "" );
+
+			if ( div.querySelectorAll("[t^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + 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 ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			div.querySelectorAll("*,:x");
+			rbuggyQSA.push(",.*:");
+		});
+	}
+
+	if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector) )) ) {
+
+		assert(function( div ) {
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( div, "div" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( div, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		});
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+
+	// Element contains another
+	// Purposefully does not implement inclusive descendent
+	// As in, an element does not contain itself
+	contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
+		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 = docElem.compareDocumentPosition ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
+
+		if ( compare ) {
+			// Disconnected nodes
+			if ( compare & 1 ||
+				(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+				// Choose the first element that is related to our preferred document
+				if ( a === doc || contains(preferredDoc, a) ) {
+					return -1;
+				}
+				if ( b === doc || contains(preferredDoc, b) ) {
+					return 1;
+				}
+
+				// Maintain original order
+				return sortInput ?
+					( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+					0;
+			}
+
+			return compare & 4 ? -1 : 1;
+		}
+
+		// Not directly comparable, sort on existence of method
+		return a.compareDocumentPosition ? -1 : 1;
+	} :
+	function( a, b ) {
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Parentless nodes are either documents or disconnected
+		} else if ( !aup || !bup ) {
+			return a === doc ? -1 :
+				b === doc ? 1 :
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf.call( sortInput, a ) - indexOf.call( 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 doc;
+};
+
+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 &&
+		( !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 ?
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			(val = elem.getAttributeNode(name)) && val.specified ?
+				val.value :
+				null :
+		val;
+};
+
+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 );
+		}
+	}
+
+	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
+		for ( ; (node = elem[i]); 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 (see #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[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[5] && match[2];
+
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[3] && match[4] !== undefined ) {
+				match[2] = match[4];
+
+			// 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 !== strundefined && 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 + " " ).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, outerCache, node, diff, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType;
+
+					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
+							outerCache = parent[ expando ] || (parent[ expando ] = {});
+							cache = outerCache[ type ] || [];
+							nodeIndex = cache[0] === dirruns && cache[1];
+							diff = cache[0] === dirruns && 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 ) {
+									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						// Use previously-cached element index if available
+						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+							diff = cache[1];
+
+						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+						} else {
+							// 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 ) {
+										(node[ expando ] || (node[ expando ] = {}))[ 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.call( 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 );
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			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": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === 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 only affected by element nodes and content nodes(including text(3), cdata(4)),
+			//   not comment, processing instructions, or others
+			// Thanks to Diego Perini for the nodeName shortcut
+			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
+					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;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
+		},
+
+		// 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();
+
+function tokenize( 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,
+		checkNonElements = base && dir === "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 );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var data, cache, outerCache,
+				dirkey = dirruns + " " + doneName;
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from dir 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 ] = {});
+						if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
+							if ( (data = cache[1]) === true || data === cachedruns ) {
+								return data === true;
+							}
+						} else {
+							cache = outerCache[ dir ] = [ dirkey ];
+							cache[1] = matcher( elem, context, xml ) || cachedruns;
+							if ( cache[1] === true ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+		};
+}
+
+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 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.call( 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.call( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+		} ];
+
+	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 ) {
+	// A counter to specify which element is currently being matched
+	var matcherCachedRuns = 0,
+		bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, expandContext ) {
+			var elem, j, matcher,
+				setMatched = [],
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				outermost = expandContext != null,
+				contextBackup = outermostContext,
+				// We must always have either seed elements or context
+				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
+
+			if ( outermost ) {
+				outermostContext = context !== document && context;
+				cachedruns = matcherCachedRuns;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+			for ( ; (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+					while ( (matcher = elementMatchers[j++]) ) {
+						if ( matcher( elem, context, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+						cachedruns = ++matcherCachedRuns;
+					}
+				}
+
+				// 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 );
+					}
+				}
+			}
+
+			// Apply set filters to unmatched elements
+			matchedCount += i;
+			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, group /* 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 ( !group ) {
+			group = tokenize( selector );
+		}
+		i = group.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( group[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+	}
+	return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function select( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		match = tokenize( selector );
+
+	if ( !seed ) {
+		// Try to minimize operations if there is only one group
+		if ( match.length === 1 ) {
+
+			// Take a shortcut and set the context if the root selector is an ID
+			tokens = match[0] = match[0].slice( 0 );
+			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+					support.getById && 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;
+				}
+				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 ) && 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
+	// Provide `match` to avoid retokenization if we modified the selector above
+	compile( selector, match )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		rsibling.test( selector )
+	);
+	return results;
+}
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// 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( div1 ) {
+	// Should return 1, but returns 4 (following)
+	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+	div.innerHTML = "<a href='#'></a>";
+	return div.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( div ) {
+	div.innerHTML = "<input/>";
+	div.firstChild.setAttribute( "value", "" );
+	return div.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( div ) {
+	return div.getAttribute("disabled") == null;
+}) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return (val = elem.getAttributeNode( name )) && val.specified ?
+				val.value :
+				elem[ name ] === true ? name.toLowerCase() : null;
+		}
+	});
+}
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+	var object = optionsCache[ options ] = {};
+	jQuery.each( options.match( core_rnotwhite ) || [], 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" ?
+		( optionsCache[ options ] || 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,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = !options.once && [],
+		// Fire callbacks
+		fire = function( data ) {
+			memory = options.memory && data;
+			fired = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			firing = true;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+					memory = false; // To prevent further calls using add
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( stack ) {
+					if ( stack.length ) {
+						fire( stack.shift() );
+					}
+				} else if ( memory ) {
+					list = [];
+				} else {
+					self.disable();
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					// First, we save the current length
+					var start = list.length;
+					(function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							var type = jQuery.type( arg );
+							if ( type === "function" ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && type !== "string" ) {
+								// Inspect recursively
+								add( arg );
+							}
+						});
+					})( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away
+					} else if ( memory ) {
+						firingStart = start;
+						fire( memory );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					jQuery.each( arguments, function( _, arg ) {
+						var index;
+						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+							list.splice( index, 1 );
+							// Handle firing indexes
+							if ( firing ) {
+								if ( index <= firingLength ) {
+									firingLength--;
+								}
+								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 && list.length );
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				firingLength = 0;
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( list && ( !fired || stack ) ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					if ( firing ) {
+						stack.push( args );
+					} else {
+						fire( args );
+					}
+				}
+				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;
+};
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var tuples = [
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks("memory") ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var action = tuple[ 0 ],
+								fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[1] ](function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise()
+										.done( newDefer.resolve )
+										.fail( newDefer.reject )
+										.progress( newDefer.notify );
+								} else {
+									newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+								}
+							});
+						});
+						fns = null;
+					}).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 = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[1] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(function() {
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ]
+			deferred[ tuple[0] ] = function() {
+				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+				return this;
+			};
+			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( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = core_slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+					if( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+					} else if ( !( --remaining ) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject )
+						.progress( updateFunc( i, progressContexts, progressValues ) );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+});
+jQuery.support = (function( support ) {
+
+	var all, a, input, select, fragment, opt, eventName, isSupported, i,
+		div = document.createElement("div");
+
+	// Setup
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	// Finish early in limited (non-browser) environments
+	all = div.getElementsByTagName("*") || [];
+	a = div.getElementsByTagName("a")[ 0 ];
+	if ( !a || !a.style || !all.length ) {
+		return support;
+	}
+
+	// First batch of tests
+	select = document.createElement("select");
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName("input")[ 0 ];
+
+	a.style.cssText = "top:1px;float:left;opacity:.5";
+
+	// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+	support.getSetAttribute = div.className !== "t";
+
+	// IE strips leading whitespace when .innerHTML is used
+	support.leadingWhitespace = div.firstChild.nodeType === 3;
+
+	// Make sure that tbody elements aren't automatically inserted
+	// IE will insert them into empty tables
+	support.tbody = !div.getElementsByTagName("tbody").length;
+
+	// Make sure that link elements get serialized correctly by innerHTML
+	// This requires a wrapper element in IE
+	support.htmlSerialize = !!div.getElementsByTagName("link").length;
+
+	// Get the style information from getAttribute
+	// (IE uses .cssText instead)
+	support.style = /top/.test( a.getAttribute("style") );
+
+	// Make sure that URLs aren't manipulated
+	// (IE normalizes it by default)
+	support.hrefNormalized = a.getAttribute("href") === "/a";
+
+	// Make sure that element opacity exists
+	// (IE uses filter instead)
+	// Use a regex to work around a WebKit issue. See #5145
+	support.opacity = /^0.5/.test( a.style.opacity );
+
+	// Verify style float existence
+	// (IE uses styleFloat instead of cssFloat)
+	support.cssFloat = !!a.style.cssFloat;
+
+	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+	support.checkOn = !!input.value;
+
+	// Make sure that a selected-by-default option has a working selected property.
+	// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+	support.optSelected = opt.selected;
+
+	// Tests for enctype support on a form (#6743)
+	support.enctype = !!document.createElement("form").enctype;
+
+	// Makes sure cloning an html5 element does not cause problems
+	// Where outerHTML is undefined, this still works
+	support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>";
+
+	// Will be defined later
+	support.inlineBlockNeedsLayout = false;
+	support.shrinkWrapBlocks = false;
+	support.pixelPosition = false;
+	support.deleteExpando = true;
+	support.noCloneEvent = true;
+	support.reliableMarginRight = true;
+	support.boxSizingReliable = true;
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Support: IE<9
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	// Check if we can trust getAttribute("value")
+	input = document.createElement("input");
+	input.setAttribute( "value", "" );
+	support.input = input.getAttribute( "value" ) === "";
+
+	// Check if an input maintains its value after becoming a radio
+	input.value = "t";
+	input.setAttribute( "type", "radio" );
+	support.radioValue = input.value === "t";
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "checked", "t" );
+	input.setAttribute( "name", "t" );
+
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( input );
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE<9
+	// Opera does not clone events (and typeof div.attachEvent === undefined).
+	// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+	if ( div.attachEvent ) {
+		div.attachEvent( "onclick", function() {
+			support.noCloneEvent = false;
+		});
+
+		div.cloneNode( true ).click();
+	}
+
+	// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
+	// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+	for ( i in { submit: true, change: true, focusin: true }) {
+		div.setAttribute( eventName = "on" + i, "t" );
+
+		support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
+	}
+
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	// Support: IE<9
+	// Iteration over object's inherited properties before its own.
+	for ( i in jQuery( support ) ) {
+		break;
+	}
+	support.ownLast = i !== "0";
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, marginDiv, tds,
+			divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		container = document.createElement("div");
+		container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+
+		body.appendChild( container ).appendChild( div );
+
+		// Support: IE8
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName("td");
+		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Support: IE8
+		// Check if empty table cells still have offsetWidth/Height
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check box-sizing and margin behavior.
+		div.innerHTML = "";
+		div.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%;";
+
+		// Workaround failing boxSizing test due to offsetWidth returning wrong value
+		// with some non-1 values of body zoom, ticket #13543
+		jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
+			support.boxSizing = div.offsetWidth === 4;
+		});
+
+		// Use window.getComputedStyle because jsdom on node.js will break without it.
+		if ( window.getComputedStyle ) {
+			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+			// Check if div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container. (#3333)
+			// Fails in WebKit before Feb 2011 nightlies
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			marginDiv = div.appendChild( document.createElement("div") );
+			marginDiv.style.cssText = div.style.cssText = divReset;
+			marginDiv.style.marginRight = marginDiv.style.width = "0";
+			div.style.width = "1px";
+
+			support.reliableMarginRight =
+				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+		}
+
+		if ( typeof div.style.zoom !== core_strundefined ) {
+			// Support: IE<8
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			div.innerHTML = "";
+			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Support: IE6
+			// Check if elements with layout shrink-wrap their children
+			div.style.display = "block";
+			div.innerHTML = "<div></div>";
+			div.firstChild.style.width = "5px";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+			if ( support.inlineBlockNeedsLayout ) {
+				// Prevent IE 6 from affecting layout for positioned elements #11048
+				// Prevent IE from shrinking the body in IE 7 mode #12869
+				// Support: IE<8
+				body.style.zoom = 1;
+			}
+		}
+
+		body.removeChild( container );
+
+		// Null elements to avoid leaks in IE
+		container = div = tds = marginDiv = null;
+	});
+
+	// Null elements to avoid leaks in IE
+	all = select = fragment = opt = a = input = null;
+
+	return support;
+})({});
+
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ){
+	if ( !jQuery.acceptData( elem ) ) {
+		return;
+	}
+
+	var ret, thisCache,
+		internalKey = jQuery.expando,
+
+		// We have to handle DOM nodes and JS objects differently because IE6-7
+		// can't GC object references properly across the DOM-JS boundary
+		isNode = elem.nodeType,
+
+		// Only DOM nodes need the global jQuery cache; JS object data is
+		// attached directly to the object so GC can occur automatically
+		cache = isNode ? jQuery.cache : elem,
+
+		// Only defining an ID for JS objects if its cache already exists allows
+		// the code to shortcut on the same path as a DOM node with no cache
+		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+	// Avoid doing any more work than we need to when trying to get data on an
+	// object that has no data at all
+	if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
+		return;
+	}
+
+	if ( !id ) {
+		// Only DOM nodes need a new unique ID for each element since their data
+		// ends up in the global cache
+		if ( isNode ) {
+			id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;
+		} else {
+			id = internalKey;
+		}
+	}
+
+	if ( !cache[ id ] ) {
+		// Avoid exposing jQuery metadata on plain JS objects when the object
+		// is serialized using JSON.stringify
+		cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
+	}
+
+	// An object can be passed to jQuery.data instead of a key/value pair; this gets
+	// shallow copied over onto the existing cache
+	if ( typeof name === "object" || typeof name === "function" ) {
+		if ( pvt ) {
+			cache[ id ] = jQuery.extend( cache[ id ], name );
+		} else {
+			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+		}
+	}
+
+	thisCache = cache[ id ];
+
+	// jQuery data() is stored in a separate object inside the object's internal data
+	// cache in order to avoid key collisions between internal data and user-defined
+	// data.
+	if ( !pvt ) {
+		if ( !thisCache.data ) {
+			thisCache.data = {};
+		}
+
+		thisCache = thisCache.data;
+	}
+
+	if ( data !== undefined ) {
+		thisCache[ jQuery.camelCase( name ) ] = data;
+	}
+
+	// Check for both converted-to-camel and non-converted data property names
+	// If a data property was specified
+	if ( typeof name === "string" ) {
+
+		// First Try to find as-is property data
+		ret = thisCache[ name ];
+
+		// Test for null|undefined property data
+		if ( ret == null ) {
+
+			// Try to find the camelCased property
+			ret = thisCache[ jQuery.camelCase( name ) ];
+		}
+	} else {
+		ret = thisCache;
+	}
+
+	return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+	if ( !jQuery.acceptData( elem ) ) {
+		return;
+	}
+
+	var thisCache, i,
+		isNode = elem.nodeType,
+
+		// See jQuery.data for more information
+		cache = isNode ? jQuery.cache : elem,
+		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+	// If there is already no cache entry for this object, there is no
+	// purpose in continuing
+	if ( !cache[ id ] ) {
+		return;
+	}
+
+	if ( name ) {
+
+		thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+		if ( thisCache ) {
+
+			// Support array or space separated string names for data keys
+			if ( !jQuery.isArray( name ) ) {
+
+				// try the string as a key before any manipulation
+				if ( name in thisCache ) {
+					name = [ name ];
+				} else {
+
+					// split the camel cased version by spaces unless a key with the spaces exists
+					name = jQuery.camelCase( name );
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+						name = name.split(" ");
+					}
+				}
+			} else {
+				// If "name" is an array of keys...
+				// When data is initially created, via ("key", "val") signature,
+				// keys will be converted to camelCase.
+				// Since there is no way to tell _how_ a key was added, remove
+				// both plain key and camelCase key. #12786
+				// This will only penalize the array argument path.
+				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+			}
+
+			i = name.length;
+			while ( i-- ) {
+				delete thisCache[ name[i] ];
+			}
+
+			// If there is no data left in the cache, we want to continue
+			// and let the cache object itself get destroyed
+			if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
+				return;
+			}
+		}
+	}
+
+	// See jQuery.data for more information
+	if ( !pvt ) {
+		delete cache[ id ].data;
+
+		// Don't destroy the parent cache unless the internal data object
+		// had been the only thing left in it
+		if ( !isEmptyDataObject( cache[ id ] ) ) {
+			return;
+		}
+	}
+
+	// Destroy the cache
+	if ( isNode ) {
+		jQuery.cleanData( [ elem ], true );
+
+	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+	/* jshint eqeqeq: false */
+	} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+		/* jshint eqeqeq: true */
+		delete cache[ id ];
+
+	// When all else fails, null
+	} else {
+		cache[ id ] = null;
+	}
+}
+
+jQuery.extend({
+	cache: {},
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"applet": true,
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return internalData( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		return internalRemoveData( elem, name );
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return internalData( elem, name, data, true );
+	},
+
+	_removeData: function( elem, name ) {
+		return internalRemoveData( elem, name, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		// Do not set data on non-element because it will not be cleared (#8335).
+		if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
+			return false;
+		}
+
+		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+		// nodes accept data unless otherwise specified; rejection can be conditional
+		return !noData || noData !== true && elem.getAttribute("classid") === noData;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var attrs, name,
+			data = null,
+			i = 0,
+			elem = this[0];
+
+		// Special expections of .data basically thwart jQuery.access,
+		// so implement the relevant behavior ourselves
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attrs = elem.attributes;
+					for ( ; i < attrs.length; i++ ) {
+						name = attrs[i].name;
+
+						if ( name.indexOf("data-") === 0 ) {
+							name = jQuery.camelCase( name.slice(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		return arguments.length > 1 ?
+
+			// Sets one value
+			this.each(function() {
+				jQuery.data( this, key, value );
+			}) :
+
+			// Gets one value
+			// Try to fetch any internally stored data first
+			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+					data === "false" ? false :
+					data === "null" ? null :
+					// Only convert to a number if it doesn't change the string
+					+data + "" === data ? +data :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+						data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray(data) ) {
+					queue = jQuery._data( 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 intended for public consumption - generates a queueHooks object, or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks("once memory").add(function() {
+				jQuery._removeData( elem, type + "queue" );
+				jQuery._removeData( elem, 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 );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	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 = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	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 = jQuery._data( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+});
+var nodeHook, boolHook,
+	rclass = /[\t\r\n\f]/g,
+	rreturn = /\r/g,
+	rfocusable = /^(?:input|select|textarea|button|object)$/i,
+	rclickable = /^(?:a|area)$/i,
+	ruseDefault = /^(?:checked|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	getSetInput = jQuery.support.input;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classes, elem, cur, clazz, j,
+			i = 0,
+			len = this.length,
+			proceed = typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call( this, j, this.className ) );
+			});
+		}
+
+		if ( proceed ) {
+			// The disjunction here is for better compressibility (see removeClass)
+			classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					" "
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+					elem.className = jQuery.trim( cur );
+
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, clazz, j,
+			i = 0,
+			len = this.length,
+			proceed = arguments.length === 0 || typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, this.className ) );
+			});
+		}
+		if ( proceed ) {
+			classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					""
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+					elem.className = value ? jQuery.trim( cur ) : "";
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value;
+
+		if ( typeof stateVal === "boolean" && type === "string" ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					classNames = value.match( core_rnotwhite ) || [];
+
+				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 ( type === core_strundefined || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.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.
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var ret, hooks, isFunction,
+			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;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				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 ( jQuery.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 ) {
+				// Use proper attribute retrieval(#6932, #12072)
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+					elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one" || index < 0,
+					values = one ? null : [],
+					max = one ? index + 1 : options.length,
+					i = index < 0 ?
+						max :
+						one ? index : 0;
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// oldIE 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
+							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+							( !option.parentNode.disabled || !jQuery.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 ];
+					if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
+						optionSet = true;
+					}
+				}
+
+				// force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attr: function( elem, name, value ) {
+		var hooks, ret,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === core_strundefined ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+
+			} else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, value + "" );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+			ret = jQuery.find.attr( elem, name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret == null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name, propName,
+			i = 0,
+			attrNames = value && value.match( core_rnotwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( (name = attrNames[i++]) ) {
+				propName = jQuery.propFix[ name ] || name;
+
+				// Boolean attributes get special treatment (#10870)
+				if ( jQuery.expr.match.bool.test( name ) ) {
+					// Set corresponding property to false
+					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+						elem[ propName ] = false;
+					// Support: IE<9
+					// Also clear defaultChecked/defaultSelected (if appropriate)
+					} else {
+						elem[ jQuery.camelCase( "default-" + name ) ] =
+							elem[ propName ] = false;
+					}
+
+				// See #9699 for explanation of this approach (setting first, then removal)
+				} else {
+					jQuery.attr( elem, name, "" );
+				}
+
+				elem.removeAttribute( getSetAttribute ? name : propName );
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to default in case type is set after value during creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+				ret :
+				( elem[ name ] = value );
+
+		} else {
+			return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+				ret :
+				elem[ name ];
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// 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" );
+
+				return tabindex ?
+					parseInt( tabindex, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						-1;
+			}
+		}
+	}
+});
+
+// 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 if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+			// IE<8 needs the *property* name
+			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+		// Use defaultChecked and defaultSelected for oldIE
+		} else {
+			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+		}
+
+		return name;
+	}
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+	var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
+
+	jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
+		function( elem, name, isXML ) {
+			var fn = jQuery.expr.attrHandle[ name ],
+				ret = isXML ?
+					undefined :
+					/* jshint eqeqeq: false */
+					(jQuery.expr.attrHandle[ name ] = undefined) !=
+						getter( elem, name, isXML ) ?
+
+						name.toLowerCase() :
+						null;
+			jQuery.expr.attrHandle[ name ] = fn;
+			return ret;
+		} :
+		function( elem, name, isXML ) {
+			return isXML ?
+				undefined :
+				elem[ jQuery.camelCase( "default-" + name ) ] ?
+					name.toLowerCase() :
+					null;
+		};
+});
+
+// fix oldIE attroperties
+if ( !getSetInput || !getSetAttribute ) {
+	jQuery.attrHooks.value = {
+		set: function( elem, value, name ) {
+			if ( jQuery.nodeName( elem, "input" ) ) {
+				// Does not return so that setAttribute is also used
+				elem.defaultValue = value;
+			} else {
+				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
+				return nodeHook && nodeHook.set( elem, value, name );
+			}
+		}
+	};
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = {
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				elem.setAttributeNode(
+					(ret = elem.ownerDocument.createAttribute( name ))
+				);
+			}
+
+			ret.value = value += "";
+
+			// Break association with cloned elements by also using setAttribute (#9646)
+			return name === "value" || value === elem.getAttribute( name ) ?
+				value :
+				undefined;
+		}
+	};
+	jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
+		// Some attributes are constructed with empty-string values when not defined
+		function( elem, name, isXML ) {
+			var ret;
+			return isXML ?
+				undefined :
+				(ret = elem.getAttributeNode( name )) && ret.value !== "" ?
+					ret.value :
+					null;
+		};
+	jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret = elem.getAttributeNode( name );
+			return ret && ret.specified ?
+				ret.value :
+				undefined;
+		},
+		set: nodeHook.set
+	};
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		set: function( elem, value, name ) {
+			nodeHook.set( elem, value === "" ? false : value, name );
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		};
+	});
+}
+
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !jQuery.support.hrefNormalized ) {
+	// href/src property should get the full normalized URL (#10299/#12915)
+	jQuery.each([ "href", "src" ], function( i, name ) {
+		jQuery.propHooks[ name ] = {
+			get: function( elem ) {
+				return elem.getAttribute( name, 4 );
+			}
+		};
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Note: IE uppercases css property names, but if we were to .toLowerCase()
+			// .cssText, that would destroy case senstitivity in URL's, like in "background"
+			return elem.style.cssText || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = value + "" );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	};
+}
+
+jQuery.each([
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	};
+	if ( !jQuery.support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			// Support: Webkit
+			// "" is returned instead of "on" if a value isn't specified
+			return elem.getAttribute("value") === null ? "on" : elem.value;
+		};
+	}
+});
+var rformElems = /^(?:input|select|textarea)$/i,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+/*
+ * 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 tmp, events, t, handleObjIn,
+			special, eventHandle, handleObj,
+			handlers, type, namespaces, origType,
+			elemData = jQuery._data( 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;
+		}
+
+		// 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 !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( core_rnotwhite ) || [""];
+		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/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + 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;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+		var j, handleObj, tmp,
+			origCount, t, events,
+			special, handlers, type,
+			namespaces, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( core_rnotwhite ) || [""];
+		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 the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery._removeData( elem, "events" );
+		}
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		var handle, ontype, cur,
+			bubbleType, special, tmp, i,
+			eventPath = [ elem || document ],
+			type = core_hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+		cur = 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(".") >= 0 ) {
+			// 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.namespace_re = 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 && !jQuery.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() ) {
+
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === 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) &&
+				jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && elem[ type ] && !jQuery.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;
+					try {
+						elem[ type ]();
+					} catch ( e ) {
+						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
+						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
+					}
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event );
+
+		var i, ret, handleObj, matched, j,
+			handlerQueue = [],
+			args = core_slice.call( arguments ),
+			handlers = ( jQuery._data( 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;
+		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.namespace_re || event.namespace_re.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 sel, handleObj, matches, i,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		// Black-hole SVG <use> instance trees (#13180)
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+			/* jshint eqeqeq: false */
+			for ( ; cur != this; cur = cur.parentNode || this ) {
+				/* jshint eqeqeq: true */
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matches[ sel ] === undefined ) {
+							matches[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) >= 0 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matches[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, handlers: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+		}
+
+		return handlerQueue;
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop, copy,
+			type = event.type,
+			originalEvent = event,
+			fixHook = this.fixHooks[ type ];
+
+		if ( !fixHook ) {
+			this.fixHooks[ type ] = fixHook =
+				rmouseEvent.test( type ) ? this.mouseHooks :
+				rkeyEvent.test( type ) ? this.keyHooks :
+				{};
+		}
+		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = new jQuery.Event( originalEvent );
+
+		i = copy.length;
+		while ( i-- ) {
+			prop = copy[ i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Support: IE<9
+		// Fix target property (#1925)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Support: Chrome 23+, Safari?
+		// Target should not be a text node (#504, #13143)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Support: IE<9
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	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( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var body, eventDoc, doc,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	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 ) {
+					try {
+						this.focus();
+						return false;
+					} catch ( e ) {
+						// Support: IE<9
+						// If we error on focus to hidden element (#1486, #12518),
+						// let .trigger() run the handlers
+					}
+				}
+			},
+			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 ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+					this.click();
+					return false;
+				}
+			},
+
+			// For cross-browser consistency, don't fire native .click() on links
+			_default: function( event ) {
+				return jQuery.nodeName( event.target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Even when returnValue equals to undefined Firefox will still show alert
+				if ( event.result !== undefined ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8
+			// detachEvent needed property on element, by name of that event, to properly expose it to GC
+			if ( typeof elem[ name ] === core_strundefined ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, 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.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// 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 || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+		if ( !e ) {
+			return;
+		}
+
+		// If preventDefault exists, run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// Support: IE
+		// Otherwise set the returnValue property of the original event to false
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+		if ( !e ) {
+			return;
+		}
+		// If stopPropagation exists, run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+
+		// Support: IE
+		// Set the cancelBubble property of the original event to true
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	}
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, 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 mousenter/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;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !jQuery._data( form, "submitBubbles" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					jQuery._data( form, "submitBubbles", true );
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+						}
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event, true );
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					jQuery._data( elem, "changeBubbles", true );
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var type, origFn;
+
+		// 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 ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		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 this;
+		}
+
+		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 this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( 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 );
+		});
+	},
+
+	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 );
+		}
+	}
+});
+var isSimple = /^.[^:#\[\.,]*$/,
+	rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	rneedsContext = jQuery.expr.match.needsContext,
+	// 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({
+	find: function( selector ) {
+		var i,
+			ret = [],
+			self = this,
+			len = self.length;
+
+		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;
+					}
+				}
+			}) );
+		}
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		// Needed because $( selector, context ) becomes $( context ).find( selector )
+		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+		ret.selector = this.selector ? this.selector + " " + selector : selector;
+		return ret;
+	},
+
+	has: function( target ) {
+		var i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter(function() {
+			for ( i = 0; i < len; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector || [], true) );
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector || [], false) );
+	},
+
+	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;
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			ret = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+				// Always skip document fragments
+				if ( cur.nodeType < 11 && (pos ?
+					pos.index(cur) > -1 :
+
+					// Don't pass non-elements to Sizzle
+					cur.nodeType === 1 &&
+						jQuery.find.matchesSelector(cur, selectors)) ) {
+
+					cur = ret.push( cur );
+					break;
+				}
+			}
+		}
+
+		return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	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 jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( jQuery.unique(all) );
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter(selector)
+		);
+	}
+});
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && 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 jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		if ( this.length > 1 ) {
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				ret = jQuery.unique( ret );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				ret = ret.reverse();
+			}
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		var elem = elems[ 0 ];
+
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 && elem.nodeType === 1 ?
+			jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+			jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+				return elem.nodeType === 1;
+			}));
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			/* jshint -W018 */
+			return !!qualifier.call( elem, i, elem ) !== not;
+		});
+
+	}
+
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		});
+
+	}
+
+	if ( typeof qualifier === "string" ) {
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter( qualifier, elements, not );
+		}
+
+		qualifier = jQuery.filter( qualifier, elements );
+	}
+
+	return jQuery.grep( elements, function( elem ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
+	});
+}
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+		safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style|link)/i,
+	manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /^$|\/(?:java|ecma)script/i,
+	rscriptTypeMasked = /^true\/(.*)/,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+	// We have to close these tags to support XHTML (#13200)
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		area: [ 1, "<map>", "</map>" ],
+		param: [ 1, "<object>", "</object>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+		// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+		// unless wrapped in a div with non-breaking characters in front of it.
+		_default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
+	},
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip( 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 this.domManip( arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		});
+	},
+
+	after: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		});
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		var elem,
+			elems = selector ? jQuery.filter( selector, this ) : this,
+			i = 0;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( !keepData && elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem ) );
+			}
+
+			if ( elem.parentNode ) {
+				if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+					setGlobalEval( getAll( elem, "script" ) );
+				}
+				elem.parentNode.removeChild( elem );
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem, false ) );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+
+			// If this is a select, ensure that it displays empty (#12336)
+			// Support: IE<9
+			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+				elem.options.length = 0;
+			}
+		}
+
+		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 jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						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
+			// Snapshot the DOM in case .domManip sweeps something relevant into its fragment
+			args = jQuery.map( this, function( elem ) {
+				return [ elem.nextSibling, elem.parentNode ];
+			}),
+			i = 0;
+
+		// Make the changes, replacing each context element with the new content
+		this.domManip( arguments, function( elem ) {
+			var next = args[ i++ ],
+				parent = args[ i++ ];
+
+			if ( parent ) {
+				// Don't use the snapshot next if it has moved (#13810)
+				if ( next && next.parentNode !== parent ) {
+					next = this.nextSibling;
+				}
+				jQuery( this ).remove();
+				parent.insertBefore( elem, next );
+			}
+		// Allow new content to include elements from the context set
+		}, true );
+
+		// Force removal if there was no new content (e.g., from empty arguments)
+		return i ? this : this.remove();
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, callback, allowIntersection ) {
+
+		// Flatten any nested arrays
+		args = core_concat.apply( [], args );
+
+		var first, node, hasScripts,
+			scripts, doc, fragment,
+			i = 0,
+			l = this.length,
+			set = this,
+			iNoClone = l - 1,
+			value = args[0],
+			isFunction = jQuery.isFunction( value );
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
+			return this.each(function( index ) {
+				var self = set.eq( index );
+				if ( isFunction ) {
+					args[0] = value.call( this, index, self.html() );
+				}
+				self.domManip( args, callback, allowIntersection );
+			});
+		}
+
+		if ( l ) {
+			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				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 ) {
+							jQuery.merge( scripts, getAll( node, "script" ) );
+						}
+					}
+
+					callback.call( this[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 || "" ) &&
+							!jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+							if ( node.src ) {
+								// Hope ajax is available...
+								jQuery._evalUrl( node.src );
+							} else {
+								jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+							}
+						}
+					}
+				}
+
+				// Fix #11809: Avoid leaking memory
+				fragment = first = null;
+			}
+		}
+
+		return this;
+	}
+});
+
+// Support: IE<8
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+	return jQuery.nodeName( elem, "table" ) &&
+		jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
+
+		elem.getElementsByTagName("tbody")[0] ||
+			elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+		elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	var match = rscriptTypeMasked.exec( elem.type );
+	if ( match ) {
+		elem.type = match[1];
+	} else {
+		elem.removeAttribute("type");
+	}
+	return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var elem,
+		i = 0;
+	for ( ; (elem = elems[i]) != null; i++ ) {
+		jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+	}
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function fixCloneNodeIssues( src, dest ) {
+	var nodeName, e, data;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 copies events bound via attachEvent when using cloneNode.
+	if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
+		data = jQuery._data( dest );
+
+		for ( e in data.events ) {
+			jQuery.removeEvent( dest, e, data.handle );
+		}
+
+		// Event data gets referenced instead of copied if the expando gets copied too
+		dest.removeAttribute( jQuery.expando );
+	}
+
+	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+	if ( nodeName === "script" && dest.text !== src.text ) {
+		disableScript( dest ).text = src.text;
+		restoreScript( dest );
+
+	// IE6-10 improperly clones children of object elements using classid.
+	// IE10 throws NoModificationAllowedError if parent is null, #12132.
+	} else if ( nodeName === "object" ) {
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+
+		dest.defaultChecked = dest.checked = src.checked;
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.defaultSelected = dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone(true);
+			jQuery( insert[i] )[ original ]( elems );
+
+			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+			core_push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+function getAll( context, tag ) {
+	var elems, elem,
+		i = 0,
+		found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
+			typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
+			undefined;
+
+	if ( !found ) {
+		for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
+			if ( !tag || jQuery.nodeName( elem, tag ) ) {
+				found.push( elem );
+			} else {
+				jQuery.merge( found, getAll( elem, tag ) );
+			}
+		}
+	}
+
+	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+		jQuery.merge( [ context ], found ) :
+		found;
+}
+
+// Used in buildFragment, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( manipulation_rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var destElements, node, clone, i, srcElements,
+			inPage = jQuery.contains( elem.ownerDocument, elem );
+
+		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+
+			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			// Fix all IE cloning issues
+			for ( i = 0; (node = srcElements[i]) != null; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					fixCloneNodeIssues( node, 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; (node = srcElements[i]) != null; i++ ) {
+					cloneCopyEvent( node, destElements[i] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		destElements = srcElements = node = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	buildFragment: function( elems, context, scripts, selection ) {
+		var j, elem, contains,
+			tmp, tag, tbody, wrap,
+			l = elems.length,
+
+			// Ensure a safe fragment
+			safe = createSafeFragment( context ),
+
+			nodes = [],
+			i = 0;
+
+		for ( ; i < l; i++ ) {
+			elem = elems[ i ];
+
+			if ( elem || elem === 0 ) {
+
+				// Add nodes directly
+				if ( jQuery.type( elem ) === "object" ) {
+					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 || safe.appendChild( context.createElement("div") );
+
+					// Deserialize a standard representation
+					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+					wrap = wrapMap[ tag ] || wrapMap._default;
+
+					tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
+
+					// Descend through wrappers to the right content
+					j = wrap[0];
+					while ( j-- ) {
+						tmp = tmp.lastChild;
+					}
+
+					// Manually add leading whitespace removed by IE
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						elem = tag === "table" && !rtbody.test( elem ) ?
+							tmp.firstChild :
+
+							// String was a bare <thead> or <tfoot>
+							wrap[1] === "<table>" && !rtbody.test( elem ) ?
+								tmp :
+								0;
+
+						j = elem && elem.childNodes.length;
+						while ( j-- ) {
+							if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
+								elem.removeChild( tbody );
+							}
+						}
+					}
+
+					jQuery.merge( nodes, tmp.childNodes );
+
+					// Fix #12392 for WebKit and IE > 9
+					tmp.textContent = "";
+
+					// Fix #12392 for oldIE
+					while ( tmp.firstChild ) {
+						tmp.removeChild( tmp.firstChild );
+					}
+
+					// Remember the top-level container for proper cleanup
+					tmp = safe.lastChild;
+				}
+			}
+		}
+
+		// Fix #11356: Clear elements from fragment
+		if ( tmp ) {
+			safe.removeChild( tmp );
+		}
+
+		// Reset defaultChecked for any radios and checkboxes
+		// about to be appended to the DOM in IE 6/7 (#8060)
+		if ( !jQuery.support.appendChecked ) {
+			jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+		}
+
+		i = 0;
+		while ( (elem = nodes[ i++ ]) ) {
+
+			// #4087 - If origin and destination elements are the same, and this is
+			// that element, do not do anything
+			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+				continue;
+			}
+
+			contains = jQuery.contains( elem.ownerDocument, elem );
+
+			// Append to fragment
+			tmp = getAll( safe.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 );
+					}
+				}
+			}
+		}
+
+		tmp = null;
+
+		return safe;
+	},
+
+	cleanData: function( elems, /* internal */ acceptData ) {
+		var elem, type, id, data,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			deleteExpando = jQuery.support.deleteExpando,
+			special = jQuery.event.special;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( acceptData || jQuery.acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					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 );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// IE does not allow us to delete expando properties from nodes,
+						// nor does it have a removeAttribute function on Document nodes;
+						// we must handle all of these cases
+						if ( deleteExpando ) {
+							delete elem[ internalKey ];
+
+						} else if ( typeof elem.removeAttribute !== core_strundefined ) {
+							elem.removeAttribute( internalKey );
+
+						} else {
+							elem[ internalKey ] = null;
+						}
+
+						core_deletedIds.push( id );
+					}
+				}
+			}
+		}
+	},
+
+	_evalUrl: function( url ) {
+		return jQuery.ajax({
+			url: url,
+			type: "GET",
+			dataType: "script",
+			async: false,
+			global: false,
+			"throws": true
+		});
+	}
+});
+jQuery.fn.extend({
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var 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.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.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 isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	}
+});
+var iframe, getStyles, curCSS,
+	ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity\s*=\s*([^)]*)/,
+	rposition = /^(top|right|bottom|left)$/,
+	// 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]).+)/,
+	rmargin = /^margin/,
+	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+	rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
+	elemdisplay = { BODY: "block" },
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: 0,
+		fontWeight: 400
+	},
+
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in style ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt(0).toUpperCase() + name.slice(1),
+		origName = name,
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in style ) {
+			return name;
+		}
+	}
+
+	return origName;
+}
+
+function isHidden( elem, el ) {
+	// isHidden might be called from jQuery#filter function;
+	// in that case, element will be second argument
+	elem = el || elem;
+	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+	var display, elem, hidden,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		values[ index ] = jQuery._data( elem, "olddisplay" );
+		display = elem.style.display;
+		if ( show ) {
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && display === "none" ) {
+				elem.style.display = "";
+			}
+
+			// Set elements which have been overridden with display: none
+			// in a stylesheet to whatever the default browser style is
+			// for such an element
+			if ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+			}
+		} else {
+
+			if ( !values[ index ] ) {
+				hidden = isHidden( elem );
+
+				if ( display && display !== "none" || !hidden ) {
+					jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+				}
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend({
+	css: function( name, value ) {
+		return jQuery.access( this, function( elem, name, value ) {
+			var len, styles,
+				map = {},
+				i = 0;
+
+			if ( jQuery.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 );
+	},
+	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 ( isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		});
+	}
+});
+
+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: {
+		"columnCount": true,
+		"fillOpacity": 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: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// 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 = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+			// but it would mean to define eight (for every problematic property) identical functions
+			if ( !jQuery.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 ) {
+
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} 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 num, val, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		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 ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+		}
+		return val;
+	}
+});
+
+// NOTE: we've included the "window" in window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+	getStyles = function( elem ) {
+		return window.getComputedStyle( elem, null );
+	};
+
+	curCSS = function( elem, name, _computed ) {
+		var width, minWidth, maxWidth,
+			computed = _computed || getStyles( elem ),
+
+			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
+			ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
+			style = elem.style;
+
+		if ( computed ) {
+
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+			if ( rnumnonpx.test( ret ) && rmargin.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;
+	};
+} else if ( document.documentElement.currentStyle ) {
+	getStyles = function( elem ) {
+		return elem.currentStyle;
+	};
+
+	curCSS = function( elem, name, _computed ) {
+		var left, rs, rsLeft,
+			computed = _computed || getStyles( elem ),
+			ret = computed ? computed[ name ] : undefined,
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		// but not position css attributes, as those are proportional to the parent element instead
+		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rs = elem.runtimeStyle;
+			rsLeft = rs && rs.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				rs.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				rs.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+		value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+		// If we already have the right measurement, avoid augmentation
+		4 :
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+		}
+
+		if ( isBorderBox ) {
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		} else {
+			// at this point, extra isn't content, so add padding
+			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var valueIsBorderBox = true,
+		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		styles = getStyles( elem ),
+		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name, styles );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test(val) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles
+		)
+	) + "px";
+}
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+	var doc = document,
+		display = elemdisplay[ nodeName ];
+
+	if ( !display ) {
+		display = actualDisplay( nodeName, doc );
+
+		// If the simple way fails, read from inside an iframe
+		if ( display === "none" || !display ) {
+			// Use the already-created iframe if possible
+			iframe = ( iframe ||
+				jQuery("<iframe frameborder='0' width='0' height='0'/>")
+				.css( "cssText", "display:block !important" )
+			).appendTo( doc.documentElement );
+
+			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+			doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
+			doc.write("<!doctype html><html><body>");
+			doc.close();
+
+			display = actualDisplay( nodeName, doc );
+			iframe.detach();
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return display;
+}
+
+// Called ONLY from within css_defaultDisplay
+function actualDisplay( name, doc ) {
+	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+		display = jQuery.css( elem[0], "display" );
+	elem.remove();
+	return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+					jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					}) :
+					getWidthOrHeight( elem, name, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var styles = extra && getStyles( elem );
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+					styles
+				) : 0
+			);
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			// if value === "", then remove inline opacity #12685
+			if ( ( value >= 1 || value === "" ) &&
+					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+					style.removeAttribute ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there is no filter style applied in a css rule or unset inline opacity, we are done
+				if ( value === "" || currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+					// Work around by temporarily setting element display to inline-block
+					return jQuery.swap( elem, { "display": "inline-block" },
+						curCSS, [ elem, "marginRight" ] );
+				}
+			}
+		};
+	}
+
+	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+	// getComputedStyle returns percent when specified for top/left/bottom/right
+	// rather than make the css module depend on the offset module, we just check for it here
+	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+		jQuery.each( [ "top", "left" ], function( i, prop ) {
+			jQuery.cssHooks[ prop ] = {
+				get: function( elem, computed ) {
+					if ( computed ) {
+						computed = curCSS( elem, prop );
+						// if curCSS returns percentage, fallback to offset
+						return rnumnonpx.test( computed ) ?
+							jQuery( elem ).position()[ prop ] + "px" :
+							computed;
+					}
+				}
+			};
+		});
+	}
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		// Support: Opera <= 12.12
+		// Opera reports offsetWidths and offsetHeights less than zero on some elements
+		return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
+			(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// 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 ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+});
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+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 || !manipulation_rcheckableType.test( type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+//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, value ) {
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( jQuery.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( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( jQuery.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" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+jQuery.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( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+});
+
+jQuery.fn.extend({
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+	}
+});
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+	ajax_nonce = jQuery.now(),
+
+	ajax_rquery = /\?/,
+	rhash = /#.*$/,
+	rts = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* 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("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// 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( core_rnotwhite ) || [];
+
+		if ( jQuery.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 deep, key,
+		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;
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+	if ( typeof url !== "string" && _load ) {
+		return _load.apply( this, arguments );
+	}
+
+	var selector, response, type,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = url.slice( off, url.length );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( jQuery.isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax({
+			url: url,
+
+			// if "type" variable is undefined, then "GET" method will be used
+			type: type,
+			dataType: "html",
+			data: params
+		}).done(function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		}).complete( callback && function( jqXHR, status ) {
+			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+		});
+	}
+
+	return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
+	jQuery.fn[ type ] = function( fn ){
+		return this.on( type, fn );
+	};
+});
+
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		type: "GET",
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		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: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		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": jQuery.parseJSON,
+
+			// 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 // Cross-domain detection vars
+			parts,
+			// Loop variable
+			i,
+			// URL without anti-cache param
+			cacheURL,
+			// Response headers as string
+			responseHeadersString,
+			// timeout handle
+			timeoutTimer,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			transport,
+			// Response headers
+			responseHeaders,
+			// 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 = {},
+			// The jqXHR state
+			state = 0,
+			// Default abort message
+			strAbort = "canceled",
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						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 state === 2 ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					var lname = name.toLowerCase();
+					if ( !state ) {
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( state < 2 ) {
+							for ( code in map ) {
+								// Lazy-add the new callback in a way that preserves old ones
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						} else {
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						}
+					}
+					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 ).complete = completeDeferred.add;
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// 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 || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+			);
+		}
+
+		// 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 ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = 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
+		cacheURL = s.url;
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+				s.url = rts.test( cacheURL ) ?
+
+					// If there is already a '_' parameter, set its value
+					cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
+
+					// Otherwise add one to the end
+					cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
+			}
+		}
+
+		// 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 || state === 2 ) ) {
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// 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 ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout(function() {
+					jqXHR.abort("timeout");
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				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 {
+				// We extract error from statusText
+				// then normalize statusText and status 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 ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		});
+	};
+});
+
+/* 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 firstDataType, ct, finalDataType, type,
+		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 };
+}
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /(?:java|ecma)script/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || jQuery("head")[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement("script");
+
+				script.async = true;
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( script.parentNode ) {
+							script.parentNode.removeChild( script );
+						}
+
+						// Dereference the script
+						script = null;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+
+				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( undefined, true );
+				}
+			}
+		};
+	}
+});
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always(function() {
+			// Restore preexisting value
+			window[ callbackName ] = overwritten;
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		});
+
+		// Delegate to script
+		return "script";
+	}
+});
+var xhrCallbacks, xhrSupported,
+	xhrId = 0,
+	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject && function() {
+		// Abort all pending requests
+		var key;
+		for ( key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( undefined, true );
+		}
+	};
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject("Microsoft.XMLHTTP");
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+xhrSupported = jQuery.ajaxSettings.xhr();
+jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = jQuery.support.ajax = !!xhrSupported;
+
+// Create transport if the browser can provide an xhr
+if ( xhrSupported ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var handle, i,
+						xhr = s.xhr();
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.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 ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers["X-Requested-With"] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( err ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+						var status, responseHeaders, statusText, responses;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occurred
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									responses = {};
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									if ( typeof xhr.responseText === "string" ) {
+										responses.text = xhr.responseText;
+									}
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					if ( !s.async ) {
+						// if we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						setTimeout( callback );
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback( undefined, true );
+					}
+				}
+			};
+		}
+	});
+}
+var fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [function( prop, value ) {
+			var tween = this.createTween( prop, value ),
+				target = tween.cur(),
+				parts = rfxnum.exec( value ),
+				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+				// Starting value computation is required for potential unit mismatches
+				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+				scale = 1,
+				maxIterations = 20;
+
+			if ( start && start[ 3 ] !== unit ) {
+				// Trust units reported by jQuery.css
+				unit = unit || start[ 3 ];
+
+				// Make sure we update the tween properties later on
+				parts = parts || [];
+
+				// Iteratively approximate from a nonzero starting point
+				start = +target || 1;
+
+				do {
+					// If previous iteration zeroed out, double until we get *something*
+					// Use a string for doubling factor so we don't accidentally see scale as unchanged below
+					scale = scale || ".5";
+
+					// Adjust and apply
+					start = start / scale;
+					jQuery.style( tween.elem, prop, start + unit );
+
+				// Update scale, tolerating zero or NaN from tween.cur()
+				// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+			}
+
+			// Update tween properties
+			if ( parts ) {
+				start = tween.start = +start || +target || 0;
+				tween.unit = unit;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[ 1 ] ?
+					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+					+parts[ 2 ];
+			}
+
+			return tween;
+		}]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	});
+	return ( fxNow = jQuery.now() );
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( tweeners[ prop ] || [] ).concat( 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 Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = animationPrefilters.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 ),
+				// 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 ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise({
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, { specialEasing: {} }, 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.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 = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			return result;
+		}
+	}
+
+	jQuery.map( props, createTween, animation );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		})
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.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 wont overwrite keys already present.
+			// also - reusing 'index' from above 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;
+		}
+	}
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.split(" ");
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			tweeners[ prop ] = tweeners[ prop ] || [];
+			tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			animationPrefilters.unshift( callback );
+		} else {
+			animationPrefilters.push( callback );
+		}
+	}
+});
+
+function defaultPrefilter( elem, props, opts ) {
+	/* jshint validthis: true */
+	var prop, value, toggle, tween, hooks, oldfire,
+		anim = this,
+		orig = {},
+		style = elem.style,
+		hidden = elem.nodeType && isHidden( elem ),
+		dataShow = jQuery._data( elem, "fxshow" );
+
+	// handle queue: false promises
+	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() {
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always(function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			});
+		});
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+		// Make sure that nothing sneaks out
+		// Record all 3 overflow attributes because IE does not
+		// change the overflow attribute when overflowX and
+		// overflowY are set to the same value
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		if ( jQuery.css( elem, "display" ) === "inline" &&
+				jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !jQuery.support.shrinkWrapBlocks ) {
+			anim.always(function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			});
+		}
+	}
+
+
+	// show/hide pass
+	for ( prop in props ) {
+		value = props[ prop ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ prop ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+				continue;
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+		}
+	}
+
+	if ( !jQuery.isEmptyObject( orig ) ) {
+		if ( dataShow ) {
+			if ( "hidden" in dataShow ) {
+				hidden = dataShow.hidden;
+			}
+		} else {
+			dataShow = jQuery._data( elem, "fxshow", {} );
+		}
+
+		// store state if its toggle - enables .stop().toggle() to "reverse"
+		if ( toggle ) {
+			dataShow.hidden = !hidden;
+		}
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done(function() {
+				jQuery( elem ).hide();
+			});
+		}
+		anim.done(function() {
+			var prop;
+			jQuery._removeData( elem, "fxshow" );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		});
+		for ( prop in orig ) {
+			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+	}
+}
+
+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 || "swing";
+		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;
+
+			if ( tween.elem[ tween.prop ] != null &&
+				(!tween.elem.style || 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
+			// so, 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 its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.style && ( 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
+// 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.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 );
+	};
+});
+
+jQuery.fn.extend({
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).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 || jQuery._data( 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 = jQuery._data( 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 = jQuery._data( 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;
+		});
+	}
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, 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;
+}
+
+// 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.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			jQuery.isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+	};
+
+	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ 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 ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p*Math.PI ) / 2;
+	}
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	fxNow = jQuery.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	if ( timer() && jQuery.timers.push( timer ) ) {
+		jQuery.fx.start();
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+	if ( !timerId ) {
+		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.stop = function() {
+	clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+	// Default speed
+	_default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var docElem, win,
+		box = { top: 0, left: 0 },
+		elem = this[ 0 ],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return;
+	}
+
+	docElem = doc.documentElement;
+
+	// Make sure it's not a disconnected DOM node
+	if ( !jQuery.contains( docElem, elem ) ) {
+		return box;
+	}
+
+	// If we don't have gBCR, just use 0,0 rather than error
+	// BlackBerry 5, iOS 3 (original iPhone)
+	if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
+		box = elem.getBoundingClientRect();
+	}
+	win = getWindow( doc );
+	return {
+		top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
+		left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+	};
+};
+
+jQuery.offset = {
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset,
+			parentOffset = { top: 0, left: 0 },
+			elem = this[ 0 ];
+
+		// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+			// we assume that getBoundingClientRect is available when computed position is fixed
+			offset = elem.getBoundingClientRect();
+		} else {
+			// Get *real* offsetParent
+			offsetParent = this.offsetParent();
+
+			// Get correct offsets
+			offset = this.offset();
+			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+				parentOffset = offsetParent.offset();
+			}
+
+			// Add offsetParent borders
+			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+		}
+
+		// Subtract parent offsets and element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		return {
+			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || docElem;
+			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent || docElem;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return jQuery.access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	});
+});
+// Limit scope pollution from any deprecated API
+// (function() {
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+	return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// })();
+if ( typeof module === "object" && module && typeof module.exports === "object" ) {
+	// Expose jQuery as module.exports in loaders that implement the Node
+	// module pattern (including browserify). Do not create the global, since
+	// the user will be storing it themselves locally, and globals are frowned
+	// upon in the Node module world.
+	module.exports = jQuery;
+} else {
+	// Otherwise expose jQuery to the global object as usual
+	window.jQuery = window.$ = jQuery;
+
+	// Register as a named AMD module, since jQuery can be concatenated with other
+	// files that may use define, but not via a proper concatenation script that
+	// understands anonymous AMD modules. A named AMD is safest and most robust
+	// way to register. Lowercase jquery is used because AMD module names are
+	// derived from file names, and jQuery is normally delivered in a lowercase
+	// file name. Do this after creating the global so that if an AMD module wants
+	// to call noConflict to hide this version of jQuery, it will work.
+	if ( typeof define === "function" && define.amd ) {
+		define( "jquery", [], function () { return jQuery; } );
+	}
+}
+
+})( window );
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.min.js
new file mode 100644
index 0000000..da41706
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.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="<div class='a'></div><div class='a i'></div>",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="<select><option selected=''></option></select>",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="<a href='#'></a>","#"===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="<input/>",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="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",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></: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="<table><tr><td></td><td>t</td></tr></table>",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="<div></div>",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=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},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></$2>");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></$2>")+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)?"<table>"!==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("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.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=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.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){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},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)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):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):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.min.map b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.min.map
new file mode 100644
index 0000000..4dc4920
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/jquery-1.10.2.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"jquery-1.10.2.min.js","sources":["jquery-1.10.2.js"],"names":["window","undefined","readyList","rootjQuery","core_strundefined","location","document","docElem","documentElement","_jQuery","jQuery","_$","$","class2type","core_deletedIds","core_version","core_concat","concat","core_push","push","core_slice","slice","core_indexOf","indexOf","core_toString","toString","core_hasOwn","hasOwnProperty","core_trim","trim","selector","context","fn","init","core_pnum","source","core_rnotwhite","rtrim","rquickExpr","rsingleTag","rvalidchars","rvalidbraces","rvalidescape","rvalidtokens","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","completed","event","addEventListener","type","readyState","detach","ready","removeEventListener","detachEvent","prototype","jquery","constructor","match","elem","this","charAt","length","exec","find","merge","parseHTML","nodeType","ownerDocument","test","isPlainObject","isFunction","attr","getElementById","parentNode","id","makeArray","toArray","call","get","num","pushStack","elems","ret","prevObject","each","callback","args","promise","done","apply","arguments","first","eq","last","i","len","j","map","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isArray","expando","Math","random","replace","noConflict","isReady","readyWait","holdReady","hold","wait","body","setTimeout","resolveWith","trigger","off","obj","Array","isWindow","isNumeric","isNaN","parseFloat","isFinite","String","key","e","support","ownLast","isEmptyObject","error","msg","Error","data","keepScripts","parsed","scripts","createElement","buildFragment","remove","childNodes","parseJSON","JSON","parse","Function","parseXML","xml","tmp","DOMParser","parseFromString","ActiveXObject","async","loadXML","getElementsByTagName","noop","globalEval","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","arr","results","Object","inArray","max","second","l","grep","inv","retVal","arg","guid","proxy","access","chainable","emptyGet","raw","bulk","now","Date","getTime","swap","old","style","Deferred","attachEvent","top","frameElement","doScroll","doScrollCheck","split","cachedruns","Expr","getText","isXML","compile","outermostContext","sortInput","setDocument","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","hasDuplicate","sortOrder","a","b","strundefined","MAX_NEGATIVE","hasOwn","pop","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","RegExp","rcomma","rcombinators","rsibling","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rnative","rinputs","rheader","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","fromCharCode","els","Sizzle","seed","m","groups","nid","newContext","newSelector","getElementsByClassName","qsa","tokenize","getAttribute","setAttribute","toSelector","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","cacheLength","shift","markFunction","assert","div","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","node","doc","parent","defaultView","className","appendChild","createComment","innerHTML","firstChild","getById","getElementsByName","filter","attrId","getAttributeNode","tag","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","dirkey","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","dirrunsUnique","group","contexts","token","div1","defaultValue","unique","isXMLDoc","optionsCache","createOptions","object","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","list","stack","once","fire","stopOnFalse","self","disable","add","index","lock","locked","fireWith","func","tuples","state","always","deferred","fail","then","fns","newDefer","tuple","action","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","progressContexts","resolveContexts","fragment","opt","eventName","isSupported","cssText","getSetAttribute","leadingWhitespace","tbody","htmlSerialize","hrefNormalized","opacity","cssFloat","checkOn","optSelected","enctype","html5Clone","cloneNode","outerHTML","inlineBlockNeedsLayout","shrinkWrapBlocks","pixelPosition","deleteExpando","noCloneEvent","reliableMarginRight","boxSizingReliable","noCloneChecked","optDisabled","radioValue","createDocumentFragment","appendChecked","checkClone","click","change","focusin","backgroundClip","clearCloneStyle","container","marginDiv","tds","divReset","offsetHeight","display","reliableHiddenOffsets","zoom","boxSizing","offsetWidth","getComputedStyle","width","marginRight","rbrace","rmultiDash","internalData","pvt","acceptData","thisCache","internalKey","isNode","toJSON","internalRemoveData","isEmptyDataObject","cleanData","noData","applet","embed","hasData","removeData","_data","_removeData","dataAttr","queue","dequeue","startLength","hooks","_queueHooks","next","stop","setter","delay","time","fx","speeds","timeout","clearTimeout","clearQueue","count","defer","nodeHook","boolHook","rclass","rreturn","rfocusable","rclickable","ruseDefault","getSetInput","removeAttr","prop","removeProp","propFix","addClass","classes","clazz","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","valHooks","set","option","one","optionSet","nType","attrHooks","propName","attrNames","for","class","notxml","propHooks","tabindex","parseInt","getter","setAttributeNode","createAttribute","coords","contenteditable","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","global","types","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","original","which","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","orig","related","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","origFn","triggerHandler","isSimple","rparentsprev","rneedsContext","guaranteedUnique","children","contents","prev","targets","winnow","is","closest","pos","prevAll","addBack","sibling","parents","parentsUntil","until","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","n","r","qualifier","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","manipulation_rcheckableType","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","append","createTextNode","domManip","manipulationTarget","prepend","insertBefore","before","after","keepData","getAll","setGlobalEval","dataAndEvents","deepDataAndEvents","html","replaceWith","allowIntersection","hasScripts","iNoClone","disableScript","restoreScript","_evalUrl","content","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultChecked","defaultSelected","appendTo","prependTo","insertAfter","replaceAll","insert","found","fixDefaultChecked","destElements","srcElements","inPage","selection","wrap","safe","nodes","url","ajax","dataType","throws","wrapAll","wrapInner","unwrap","iframe","getStyles","curCSS","ralpha","ropacity","rposition","rdisplayswap","rmargin","rnumsplit","rnumnonpx","rrelNum","elemdisplay","BODY","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssExpand","cssPrefixes","vendorPropName","capName","origName","isHidden","el","css","showHide","show","hidden","css_defaultDisplay","styles","hide","toggle","cssHooks","computed","cssNumber","columnCount","fillOpacity","lineHeight","order","orphans","widows","zIndex","cssProps","float","extra","_computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","setPositiveNumber","subtract","augmentWidthOrHeight","isBorderBox","getWidthOrHeight","valueIsBorderBox","actualDisplay","write","close","$1","visible","margin","padding","border","prefix","suffix","expand","expanded","parts","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","serialize","serializeArray","traditional","s","encodeURIComponent","ajaxSettings","buildParams","v","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","ajaxLocParts","ajaxLocation","ajax_nonce","ajax_rquery","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","_load","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","originalOptions","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","params","response","responseText","complete","status","active","lastModified","etag","isLocal","processData","contentType","accepts","*","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","mimeType","code","abort","statusText","finalText","success","method","crossDomain","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","responses","isSuccess","modified","ajaxHandleResponses","ajaxConvert","rejectWith","getJSON","getScript","firstDataType","ct","finalDataType","conv2","current","conv","dataFilter","script","text script","head","scriptCharset","charset","onload","onreadystatechange","isAbort","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","xhrCallbacks","xhrSupported","xhrId","xhrOnUnloadAbort","createStandardXHR","XMLHttpRequest","createActiveXHR","xhr","cors","username","open","xhrFields","firefoxAccessException","unload","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","tween","createTween","unit","scale","maxIterations","createFxNow","animation","collection","Animation","properties","stopped","tick","currentTime","startTime","duration","percent","tweens","run","opts","specialEasing","originalProperties","Tween","easing","gotoEnd","propFilter","timer","anim","tweener","prefilter","oldfire","dataShow","unqueued","overflow","overflowX","overflowY","eased","step","cssFn","speed","animate","genFx","fadeTo","to","optall","doAnimation","finish","stopQueue","timers","includeWidth","height","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","linear","p","swing","cos","PI","interval","setInterval","clearInterval","slow","fast","animated","offset","setOffset","win","box","getBoundingClientRect","getWindow","pageYOffset","pageXOffset","curElem","curOffset","curCSSTop","curCSSLeft","calculatePosition","curPosition","curTop","curLeft","using","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","module","exports","define","amd"],"mappings":";;;CAaA,SAAWA,EAAQC,GAOnB,GAECC,GAGAC,EAIAC,QAA2BH,GAG3BI,EAAWL,EAAOK,SAClBC,EAAWN,EAAOM,SAClBC,EAAUD,EAASE,gBAGnBC,EAAUT,EAAOU,OAGjBC,EAAKX,EAAOY,EAGZC,KAGAC,KAEAC,EAAe,SAGfC,EAAcF,EAAgBG,OAC9BC,EAAYJ,EAAgBK,KAC5BC,EAAaN,EAAgBO,MAC7BC,EAAeR,EAAgBS,QAC/BC,EAAgBX,EAAWY,SAC3BC,EAAcb,EAAWc,eACzBC,EAAYb,EAAac,KAGzBnB,EAAS,SAAUoB,EAAUC,GAE5B,MAAO,IAAIrB,GAAOsB,GAAGC,KAAMH,EAAUC,EAAS5B,IAI/C+B,EAAY,sCAAsCC,OAGlDC,EAAiB,OAGjBC,EAAQ,qCAKRC,EAAa,sCAGbC,EAAa,6BAGbC,EAAc,gBACdC,EAAe,uBACfC,EAAe,qCACfC,EAAe,kEAGfC,EAAY,QACZC,EAAa,eAGbC,EAAa,SAAUC,EAAKC,GAC3B,MAAOA,GAAOC,eAIfC,EAAY,SAAUC,IAGhB7C,EAAS8C,kBAAmC,SAAfD,EAAME,MAA2C,aAAxB/C,EAASgD,cACnEC,IACA7C,EAAO8C,UAITD,EAAS,WACHjD,EAAS8C,kBACb9C,EAASmD,oBAAqB,mBAAoBP,GAAW,GAC7DlD,EAAOyD,oBAAqB,OAAQP,GAAW,KAG/C5C,EAASoD,YAAa,qBAAsBR,GAC5ClD,EAAO0D,YAAa,SAAUR,IAIjCxC,GAAOsB,GAAKtB,EAAOiD,WAElBC,OAAQ7C,EAER8C,YAAanD,EACbuB,KAAM,SAAUH,EAAUC,EAAS5B,GAClC,GAAI2D,GAAOC,CAGX,KAAMjC,EACL,MAAOkC,KAIR,IAAyB,gBAAblC,GAAwB,CAUnC,GAPCgC,EAF2B,MAAvBhC,EAASmC,OAAO,IAAyD,MAA3CnC,EAASmC,OAAQnC,EAASoC,OAAS,IAAepC,EAASoC,QAAU,GAE7F,KAAMpC,EAAU,MAGlBQ,EAAW6B,KAAMrC,IAIrBgC,IAAUA,EAAM,IAAO/B,EAqDrB,OAAMA,GAAWA,EAAQ6B,QACtB7B,GAAW5B,GAAaiE,KAAMtC,GAKhCkC,KAAKH,YAAa9B,GAAUqC,KAAMtC,EAxDzC,IAAKgC,EAAM,GAAK,CAWf,GAVA/B,EAAUA,YAAmBrB,GAASqB,EAAQ,GAAKA,EAGnDrB,EAAO2D,MAAOL,KAAMtD,EAAO4D,UAC1BR,EAAM,GACN/B,GAAWA,EAAQwC,SAAWxC,EAAQyC,eAAiBzC,EAAUzB,GACjE,IAIIiC,EAAWkC,KAAMX,EAAM,KAAQpD,EAAOgE,cAAe3C,GACzD,IAAM+B,IAAS/B,GAETrB,EAAOiE,WAAYX,KAAMF,IAC7BE,KAAMF,GAAS/B,EAAS+B,IAIxBE,KAAKY,KAAMd,EAAO/B,EAAS+B,GAK9B,OAAOE,MAQP,GAJAD,EAAOzD,EAASuE,eAAgBf,EAAM,IAIjCC,GAAQA,EAAKe,WAAa,CAG9B,GAAKf,EAAKgB,KAAOjB,EAAM,GACtB,MAAO3D,GAAWiE,KAAMtC,EAIzBkC,MAAKE,OAAS,EACdF,KAAK,GAAKD,EAKX,MAFAC,MAAKjC,QAAUzB,EACf0D,KAAKlC,SAAWA,EACTkC,KAcH,MAAKlC,GAASyC,UACpBP,KAAKjC,QAAUiC,KAAK,GAAKlC,EACzBkC,KAAKE,OAAS,EACPF,MAIItD,EAAOiE,WAAY7C,GACvB3B,EAAWqD,MAAO1B,IAGrBA,EAASA,WAAa7B,IAC1B+D,KAAKlC,SAAWA,EAASA,SACzBkC,KAAKjC,QAAUD,EAASC,SAGlBrB,EAAOsE,UAAWlD,EAAUkC,QAIpClC,SAAU,GAGVoC,OAAQ,EAERe,QAAS,WACR,MAAO7D,GAAW8D,KAAMlB,OAKzBmB,IAAK,SAAUC,GACd,MAAc,OAAPA,EAGNpB,KAAKiB,UAGG,EAANG,EAAUpB,KAAMA,KAAKE,OAASkB,GAAQpB,KAAMoB,IAKhDC,UAAW,SAAUC,GAGpB,GAAIC,GAAM7E,EAAO2D,MAAOL,KAAKH,cAAeyB,EAO5C,OAJAC,GAAIC,WAAaxB,KACjBuB,EAAIxD,QAAUiC,KAAKjC,QAGZwD,GAMRE,KAAM,SAAUC,EAAUC,GACzB,MAAOjF,GAAO+E,KAAMzB,KAAM0B,EAAUC,IAGrCnC,MAAO,SAAUxB,GAIhB,MAFAtB,GAAO8C,MAAMoC,UAAUC,KAAM7D,GAEtBgC,MAGR3C,MAAO,WACN,MAAO2C,MAAKqB,UAAWjE,EAAW0E,MAAO9B,KAAM+B,aAGhDC,MAAO,WACN,MAAOhC,MAAKiC,GAAI,IAGjBC,KAAM,WACL,MAAOlC,MAAKiC,GAAI,KAGjBA,GAAI,SAAUE,GACb,GAAIC,GAAMpC,KAAKE,OACdmC,GAAKF,GAAU,EAAJA,EAAQC,EAAM,EAC1B,OAAOpC,MAAKqB,UAAWgB,GAAK,GAASD,EAAJC,GAAYrC,KAAKqC,SAGnDC,IAAK,SAAUZ,GACd,MAAO1B,MAAKqB,UAAW3E,EAAO4F,IAAItC,KAAM,SAAUD,EAAMoC,GACvD,MAAOT,GAASR,KAAMnB,EAAMoC,EAAGpC,OAIjCwC,IAAK,WACJ,MAAOvC,MAAKwB,YAAcxB,KAAKH,YAAY,OAK5C1C,KAAMD,EACNsF,QAASA,KACTC,UAAWA,QAIZ/F,EAAOsB,GAAGC,KAAK0B,UAAYjD,EAAOsB,GAElCtB,EAAOgG,OAAShG,EAAOsB,GAAG0E,OAAS,WAClC,GAAIC,GAAKC,EAAaC,EAAMC,EAAMC,EAASC,EAC1CC,EAASlB,UAAU,OACnBI,EAAI,EACJjC,EAAS6B,UAAU7B,OACnBgD,GAAO,CAqBR,KAlBuB,iBAAXD,KACXC,EAAOD,EACPA,EAASlB,UAAU,OAEnBI,EAAI,GAIkB,gBAAXc,IAAwBvG,EAAOiE,WAAWsC,KACrDA,MAII/C,IAAWiC,IACfc,EAASjD,OACPmC,GAGSjC,EAAJiC,EAAYA,IAEnB,GAAmC,OAA7BY,EAAUhB,UAAWI,IAE1B,IAAMW,IAAQC,GACbJ,EAAMM,EAAQH,GACdD,EAAOE,EAASD,GAGXG,IAAWJ,IAKXK,GAAQL,IAAUnG,EAAOgE,cAAcmC,KAAUD,EAAclG,EAAOyG,QAAQN,MAC7ED,GACJA,GAAc,EACdI,EAAQL,GAAOjG,EAAOyG,QAAQR,GAAOA,MAGrCK,EAAQL,GAAOjG,EAAOgE,cAAciC,GAAOA,KAI5CM,EAAQH,GAASpG,EAAOgG,OAAQQ,EAAMF,EAAOH,IAGlCA,IAAS5G,IACpBgH,EAAQH,GAASD,GAOrB,OAAOI,IAGRvG,EAAOgG,QAGNU,QAAS,UAAarG,EAAesG,KAAKC,UAAWC,QAAS,MAAO,IAErEC,WAAY,SAAUN,GASrB,MARKlH,GAAOY,IAAMF,IACjBV,EAAOY,EAAID,GAGPuG,GAAQlH,EAAOU,SAAWA,IAC9BV,EAAOU,OAASD,GAGVC,GAIR+G,SAAS,EAITC,UAAW,EAGXC,UAAW,SAAUC,GACfA,EACJlH,EAAOgH,YAEPhH,EAAO8C,OAAO,IAKhBA,MAAO,SAAUqE,GAGhB,GAAKA,KAAS,KAASnH,EAAOgH,WAAYhH,EAAO+G,QAAjD,CAKA,IAAMnH,EAASwH,KACd,MAAOC,YAAYrH,EAAO8C,MAI3B9C,GAAO+G,SAAU,EAGZI,KAAS,KAAUnH,EAAOgH,UAAY,IAK3CxH,EAAU8H,YAAa1H,GAAYI,IAG9BA,EAAOsB,GAAGiG,SACdvH,EAAQJ,GAAW2H,QAAQ,SAASC,IAAI,YAO1CvD,WAAY,SAAUwD,GACrB,MAA4B,aAArBzH,EAAO2C,KAAK8E,IAGpBhB,QAASiB,MAAMjB,SAAW,SAAUgB,GACnC,MAA4B,UAArBzH,EAAO2C,KAAK8E,IAGpBE,SAAU,SAAUF,GAEnB,MAAc,OAAPA,GAAeA,GAAOA,EAAInI,QAGlCsI,UAAW,SAAUH,GACpB,OAAQI,MAAOC,WAAWL,KAAUM,SAAUN,IAG/C9E,KAAM,SAAU8E,GACf,MAAY,OAAPA,EACWA,EAARO,GAEc,gBAARP,IAAmC,kBAARA,GACxCtH,EAAYW,EAAc0D,KAAKiD,KAAU,eAClCA,IAGTzD,cAAe,SAAUyD,GACxB,GAAIQ,EAKJ,KAAMR,GAA4B,WAArBzH,EAAO2C,KAAK8E,IAAqBA,EAAI5D,UAAY7D,EAAO2H,SAAUF,GAC9E,OAAO,CAGR,KAEC,GAAKA,EAAItE,cACPnC,EAAYwD,KAAKiD,EAAK,iBACtBzG,EAAYwD,KAAKiD,EAAItE,YAAYF,UAAW,iBAC7C,OAAO,EAEP,MAAQiF,GAET,OAAO,EAKR,GAAKlI,EAAOmI,QAAQC,QACnB,IAAMH,IAAOR,GACZ,MAAOzG,GAAYwD,KAAMiD,EAAKQ,EAMhC,KAAMA,IAAOR,IAEb,MAAOQ,KAAQ1I,GAAayB,EAAYwD,KAAMiD,EAAKQ,IAGpDI,cAAe,SAAUZ,GACxB,GAAIrB,EACJ,KAAMA,IAAQqB,GACb,OAAO,CAER,QAAO,GAGRa,MAAO,SAAUC,GAChB,KAAUC,OAAOD,IAMlB3E,UAAW,SAAU6E,EAAMpH,EAASqH,GACnC,IAAMD,GAAwB,gBAATA,GACpB,MAAO,KAEgB,kBAAZpH,KACXqH,EAAcrH,EACdA,GAAU,GAEXA,EAAUA,GAAWzB,CAErB,IAAI+I,GAAS9G,EAAW4B,KAAMgF,GAC7BG,GAAWF,KAGZ,OAAKC,IACKtH,EAAQwH,cAAeF,EAAO,MAGxCA,EAAS3I,EAAO8I,eAAiBL,GAAQpH,EAASuH,GAC7CA,GACJ5I,EAAQ4I,GAAUG,SAEZ/I,EAAO2D,SAAWgF,EAAOK,cAGjCC,UAAW,SAAUR,GAEpB,MAAKnJ,GAAO4J,MAAQ5J,EAAO4J,KAAKC,MACxB7J,EAAO4J,KAAKC,MAAOV,GAGb,OAATA,EACGA,EAGa,gBAATA,KAGXA,EAAOzI,EAAOmB,KAAMsH,GAEfA,GAGC3G,EAAYiC,KAAM0E,EAAK5B,QAAS7E,EAAc,KACjD6E,QAAS5E,EAAc,KACvB4E,QAAS9E,EAAc,MAEXqH,SAAU,UAAYX,MAKtCzI,EAAOsI,MAAO,iBAAmBG,GAAjCzI,IAIDqJ,SAAU,SAAUZ,GACnB,GAAIa,GAAKC,CACT,KAAMd,GAAwB,gBAATA,GACpB,MAAO,KAER,KACMnJ,EAAOkK,WACXD,EAAM,GAAIC,WACVF,EAAMC,EAAIE,gBAAiBhB,EAAO,cAElCa,EAAM,GAAII,eAAe,oBACzBJ,EAAIK,MAAQ,QACZL,EAAIM,QAASnB,IAEb,MAAOP,GACRoB,EAAM/J,EAKP,MAHM+J,IAAQA,EAAIxJ,kBAAmBwJ,EAAIO,qBAAsB,eAAgBrG,QAC9ExD,EAAOsI,MAAO,gBAAkBG,GAE1Ba,GAGRQ,KAAM,aAKNC,WAAY,SAAUtB,GAChBA,GAAQzI,EAAOmB,KAAMsH,KAIvBnJ,EAAO0K,YAAc,SAAUvB,GAChCnJ,EAAe,KAAEkF,KAAMlF,EAAQmJ,KAC3BA,IAMPwB,UAAW,SAAUC,GACpB,MAAOA,GAAOrD,QAAS3E,EAAW,OAAQ2E,QAAS1E,EAAYC,IAGhE+H,SAAU,SAAU9G,EAAM+C,GACzB,MAAO/C,GAAK8G,UAAY9G,EAAK8G,SAASC,gBAAkBhE,EAAKgE,eAI9DrF,KAAM,SAAU0C,EAAKzC,EAAUC,GAC9B,GAAIoF,GACH5E,EAAI,EACJjC,EAASiE,EAAIjE,OACbiD,EAAU6D,EAAa7C,EAExB,IAAKxC,GACJ,GAAKwB,GACJ,KAAYjD,EAAJiC,EAAYA,IAGnB,GAFA4E,EAAQrF,EAASI,MAAOqC,EAAKhC,GAAKR,GAE7BoF,KAAU,EACd,UAIF,KAAM5E,IAAKgC,GAGV,GAFA4C,EAAQrF,EAASI,MAAOqC,EAAKhC,GAAKR,GAE7BoF,KAAU,EACd,UAOH,IAAK5D,GACJ,KAAYjD,EAAJiC,EAAYA,IAGnB,GAFA4E,EAAQrF,EAASR,KAAMiD,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpC4E,KAAU,EACd,UAIF,KAAM5E,IAAKgC,GAGV,GAFA4C,EAAQrF,EAASR,KAAMiD,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpC4E,KAAU,EACd,KAMJ,OAAO5C,IAIRtG,KAAMD,IAAcA,EAAUsD,KAAK,gBAClC,SAAU+F,GACT,MAAe,OAARA,EACN,GACArJ,EAAUsD,KAAM+F,IAIlB,SAAUA,GACT,MAAe,OAARA,EACN,IACEA,EAAO,IAAK1D,QAASlF,EAAO,KAIjC2C,UAAW,SAAUkG,EAAKC,GACzB,GAAI5F,GAAM4F,KAaV,OAXY,OAAPD,IACCF,EAAaI,OAAOF,IACxBxK,EAAO2D,MAAOkB,EACE,gBAAR2F,IACLA,GAAQA,GAGXhK,EAAUgE,KAAMK,EAAK2F,IAIhB3F,GAGR8F,QAAS,SAAUtH,EAAMmH,EAAK/E,GAC7B,GAAIC,EAEJ,IAAK8E,EAAM,CACV,GAAK5J,EACJ,MAAOA,GAAa4D,KAAMgG,EAAKnH,EAAMoC,EAMtC,KAHAC,EAAM8E,EAAIhH,OACViC,EAAIA,EAAQ,EAAJA,EAAQkB,KAAKiE,IAAK,EAAGlF,EAAMD,GAAMA,EAAI,EAEjCC,EAAJD,EAASA,IAEhB,GAAKA,IAAK+E,IAAOA,EAAK/E,KAAQpC,EAC7B,MAAOoC,GAKV,MAAO,IAGR9B,MAAO,SAAU2B,EAAOuF,GACvB,GAAIC,GAAID,EAAOrH,OACdiC,EAAIH,EAAM9B,OACVmC,EAAI,CAEL,IAAkB,gBAANmF,GACX,KAAYA,EAAJnF,EAAOA,IACdL,EAAOG,KAAQoF,EAAQlF,OAGxB,OAAQkF,EAAOlF,KAAOpG,EACrB+F,EAAOG,KAAQoF,EAAQlF,IAMzB,OAFAL,GAAM9B,OAASiC,EAERH,GAGRyF,KAAM,SAAUnG,EAAOI,EAAUgG,GAChC,GAAIC,GACHpG,KACAY,EAAI,EACJjC,EAASoB,EAAMpB,MAKhB,KAJAwH,IAAQA,EAIIxH,EAAJiC,EAAYA,IACnBwF,IAAWjG,EAAUJ,EAAOa,GAAKA,GAC5BuF,IAAQC,GACZpG,EAAIpE,KAAMmE,EAAOa,GAInB,OAAOZ,IAIRe,IAAK,SAAUhB,EAAOI,EAAUkG,GAC/B,GAAIb,GACH5E,EAAI,EACJjC,EAASoB,EAAMpB,OACfiD,EAAU6D,EAAa1F,GACvBC,IAGD,IAAK4B,EACJ,KAAYjD,EAAJiC,EAAYA,IACnB4E,EAAQrF,EAAUJ,EAAOa,GAAKA,EAAGyF,GAEnB,MAATb,IACJxF,EAAKA,EAAIrB,QAAW6G,OAMtB,KAAM5E,IAAKb,GACVyF,EAAQrF,EAAUJ,EAAOa,GAAKA,EAAGyF,GAEnB,MAATb,IACJxF,EAAKA,EAAIrB,QAAW6G,EAMvB,OAAO/J,GAAY8E,SAAWP,IAI/BsG,KAAM,EAINC,MAAO,SAAU9J,EAAID,GACpB,GAAI4D,GAAMmG,EAAO7B,CAUjB,OARwB,gBAAZlI,KACXkI,EAAMjI,EAAID,GACVA,EAAUC,EACVA,EAAKiI,GAKAvJ,EAAOiE,WAAY3C,IAKzB2D,EAAOvE,EAAW8D,KAAMa,UAAW,GACnC+F,EAAQ,WACP,MAAO9J,GAAG8D,MAAO/D,GAAWiC,KAAM2B,EAAK1E,OAAQG,EAAW8D,KAAMa,cAIjE+F,EAAMD,KAAO7J,EAAG6J,KAAO7J,EAAG6J,MAAQnL,EAAOmL,OAElCC,GAZC7L,GAiBT8L,OAAQ,SAAUzG,EAAOtD,EAAI2G,EAAKoC,EAAOiB,EAAWC,EAAUC,GAC7D,GAAI/F,GAAI,EACPjC,EAASoB,EAAMpB,OACfiI,EAAc,MAAPxD,CAGR,IAA4B,WAAvBjI,EAAO2C,KAAMsF,GAAqB,CACtCqD,GAAY,CACZ,KAAM7F,IAAKwC,GACVjI,EAAOqL,OAAQzG,EAAOtD,EAAImE,EAAGwC,EAAIxC,IAAI,EAAM8F,EAAUC,OAIhD,IAAKnB,IAAU9K,IACrB+L,GAAY,EAENtL,EAAOiE,WAAYoG,KACxBmB,GAAM,GAGFC,IAECD,GACJlK,EAAGkD,KAAMI,EAAOyF,GAChB/I,EAAK,OAILmK,EAAOnK,EACPA,EAAK,SAAU+B,EAAM4E,EAAKoC,GACzB,MAAOoB,GAAKjH,KAAMxE,EAAQqD,GAAQgH,MAKhC/I,GACJ,KAAYkC,EAAJiC,EAAYA,IACnBnE,EAAIsD,EAAMa,GAAIwC,EAAKuD,EAAMnB,EAAQA,EAAM7F,KAAMI,EAAMa,GAAIA,EAAGnE,EAAIsD,EAAMa,GAAIwC,IAK3E,OAAOqD,GACN1G,EAGA6G,EACCnK,EAAGkD,KAAMI,GACTpB,EAASlC,EAAIsD,EAAM,GAAIqD,GAAQsD,GAGlCG,IAAK,WACJ,OAAO,GAAMC,OAASC,WAMvBC,KAAM,SAAUxI,EAAMgD,EAASrB,EAAUC,GACxC,GAAIJ,GAAKuB,EACR0F,IAGD,KAAM1F,IAAQC,GACbyF,EAAK1F,GAAS/C,EAAK0I,MAAO3F,GAC1B/C,EAAK0I,MAAO3F,GAASC,EAASD,EAG/BvB,GAAMG,EAASI,MAAO/B,EAAM4B,MAG5B,KAAMmB,IAAQC,GACbhD,EAAK0I,MAAO3F,GAAS0F,EAAK1F,EAG3B,OAAOvB,MAIT7E,EAAO8C,MAAMoC,QAAU,SAAUuC,GAChC,IAAMjI,EAOL,GALAA,EAAYQ,EAAOgM,WAKU,aAAxBpM,EAASgD,WAEbyE,WAAYrH,EAAO8C,WAGb,IAAKlD,EAAS8C,iBAEpB9C,EAAS8C,iBAAkB,mBAAoBF,GAAW,GAG1DlD,EAAOoD,iBAAkB,OAAQF,GAAW,OAGtC,CAEN5C,EAASqM,YAAa,qBAAsBzJ,GAG5ClD,EAAO2M,YAAa,SAAUzJ,EAI9B,IAAI0J,IAAM,CAEV,KACCA,EAA6B,MAAvB5M,EAAO6M,cAAwBvM,EAASE,gBAC7C,MAAMoI,IAEHgE,GAAOA,EAAIE,UACf,QAAUC,KACT,IAAMrM,EAAO+G,QAAU,CAEtB,IAGCmF,EAAIE,SAAS,QACZ,MAAMlE,GACP,MAAOb,YAAYgF,EAAe,IAInCxJ,IAGA7C,EAAO8C,YAMZ,MAAOtD,GAAU0F,QAASuC,IAI3BzH,EAAO+E,KAAK,gEAAgEuH,MAAM,KAAM,SAAS7G,EAAGW,GACnGjG,EAAY,WAAaiG,EAAO,KAAQA,EAAKgE,eAG9C,SAASE,GAAa7C,GACrB,GAAIjE,GAASiE,EAAIjE,OAChBb,EAAO3C,EAAO2C,KAAM8E,EAErB,OAAKzH,GAAO2H,SAAUF,IACd,EAGc,IAAjBA,EAAI5D,UAAkBL,GACnB,EAGQ,UAATb,GAA6B,aAATA,IACb,IAAXa,GACgB,gBAAXA,IAAuBA,EAAS,GAAOA,EAAS,IAAOiE,IAIhEhI,EAAaO,EAAOJ,GAWpB,SAAWN,EAAQC,GAEnB,GAAIkG,GACH0C,EACAoE,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAlN,EACAC,EACAkN,EACAC,EACAC,EACAC,EACAC,EAGAzG,EAAU,UAAY,GAAKiF,MAC3ByB,EAAe9N,EAAOM,SACtByN,EAAU,EACVlI,EAAO,EACPmI,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,GAAe,EACfC,EAAY,SAAUC,EAAGC,GACxB,MAAKD,KAAMC,GACVH,GAAe,EACR,GAED,GAIRI,QAAsBvO,GACtBwO,EAAe,GAAK,GAGpBC,KAAc/M,eACduJ,KACAyD,EAAMzD,EAAIyD,IACVC,EAAc1D,EAAI/J,KAClBA,EAAO+J,EAAI/J,KACXE,EAAQ6J,EAAI7J,MAEZE,EAAU2J,EAAI3J,SAAW,SAAUwC,GAClC,GAAIoC,GAAI,EACPC,EAAMpC,KAAKE,MACZ,MAAYkC,EAAJD,EAASA,IAChB,GAAKnC,KAAKmC,KAAOpC,EAChB,MAAOoC,EAGT,OAAO,IAGR0I,EAAW,6HAKXC,EAAa,sBAEbC,EAAoB,mCAKpBC,EAAaD,EAAkBxH,QAAS,IAAK,MAG7C0H,EAAa,MAAQH,EAAa,KAAOC,EAAoB,IAAMD,EAClE,mBAAqBA,EAAa,wCAA0CE,EAAa,QAAUF,EAAa,OAQjHI,EAAU,KAAOH,EAAoB,mEAAqEE,EAAW1H,QAAS,EAAG,GAAM,eAGvIlF,EAAY8M,OAAQ,IAAML,EAAa,8BAAgCA,EAAa,KAAM,KAE1FM,EAAaD,OAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DO,EAAmBF,OAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAAa,KAE3FQ,EAAeH,OAAQL,EAAa,SACpCS,EAAuBJ,OAAQ,IAAML,EAAa,gBAAkBA,EAAa,OAAQ,KAEzFU,EAAcL,OAAQD,GACtBO,EAAkBN,OAAQ,IAAMH,EAAa,KAE7CU,GACCC,GAAUR,OAAQ,MAAQJ,EAAoB,KAC9Ca,MAAaT,OAAQ,QAAUJ,EAAoB,KACnDc,IAAWV,OAAQ,KAAOJ,EAAkBxH,QAAS,IAAK,MAAS,KACnEuI,KAAYX,OAAQ,IAAMF,GAC1Bc,OAAcZ,OAAQ,IAAMD,GAC5Bc,MAAab,OAAQ,yDAA2DL,EAC/E,+BAAiCA,EAAa,cAAgBA,EAC9D,aAAeA,EAAa,SAAU,KACvCmB,KAAYd,OAAQ,OAASN,EAAW,KAAM,KAG9CqB,aAAoBf,OAAQ,IAAML,EAAa,mDAC9CA,EAAa,mBAAqBA,EAAa,mBAAoB,MAGrEqB,EAAU,yBAGV7N,EAAa,mCAEb8N,GAAU,sCACVC,GAAU,SAEVC,GAAU,QAGVC,GAAgBpB,OAAQ,qBAAuBL,EAAa,MAAQA,EAAa,OAAQ,MACzF0B,GAAY,SAAUC,EAAGC,EAASC,GACjC,GAAIC,GAAO,KAAOF,EAAU,KAI5B,OAAOE,KAASA,GAAQD,EACvBD,EAEO,EAAPE,EACClI,OAAOmI,aAAcD,EAAO,OAE5BlI,OAAOmI,aAA2B,MAAbD,GAAQ,GAA4B,MAAR,KAAPA,GAI9C,KACCzP,EAAK2E,MACHoF,EAAM7J,EAAM6D,KAAM4I,EAAapE,YAChCoE,EAAapE,YAIdwB,EAAK4C,EAAapE,WAAWxF,QAASK,SACrC,MAAQqE,IACTzH,GAAS2E,MAAOoF,EAAIhH,OAGnB,SAAU+C,EAAQ6J,GACjBlC,EAAY9I,MAAOmB,EAAQ5F,EAAM6D,KAAK4L,KAKvC,SAAU7J,EAAQ6J,GACjB,GAAIzK,GAAIY,EAAO/C,OACdiC,EAAI,CAEL,OAASc,EAAOZ,KAAOyK,EAAI3K,MAC3Bc,EAAO/C,OAASmC,EAAI,IAKvB,QAAS0K,IAAQjP,EAAUC,EAASoJ,EAAS6F,GAC5C,GAAIlN,GAAOC,EAAMkN,EAAG1M,EAEnB4B,EAAG+K,EAAQ1E,EAAK2E,EAAKC,EAAYC,CASlC,KAPOtP,EAAUA,EAAQyC,eAAiBzC,EAAU+L,KAAmBxN,GACtEkN,EAAazL,GAGdA,EAAUA,GAAWzB,EACrB6K,EAAUA,OAEJrJ,GAAgC,gBAAbA,GACxB,MAAOqJ,EAGR,IAAuC,KAAjC5G,EAAWxC,EAAQwC,WAAgC,IAAbA,EAC3C,QAGD,IAAKkJ,IAAmBuD,EAAO,CAG9B,GAAMlN,EAAQxB,EAAW6B,KAAMrC,GAE9B,GAAMmP,EAAInN,EAAM,IACf,GAAkB,IAAbS,EAAiB,CAIrB,GAHAR,EAAOhC,EAAQ8C,eAAgBoM,IAG1BlN,IAAQA,EAAKe,WAQjB,MAAOqG,EALP,IAAKpH,EAAKgB,KAAOkM,EAEhB,MADA9F,GAAQhK,KAAM4C,GACPoH,MAOT,IAAKpJ,EAAQyC,gBAAkBT,EAAOhC,EAAQyC,cAAcK,eAAgBoM,KAC3EpD,EAAU9L,EAASgC,IAAUA,EAAKgB,KAAOkM,EAEzC,MADA9F,GAAQhK,KAAM4C,GACPoH,MAKH,CAAA,GAAKrH,EAAM,GAEjB,MADA3C,GAAK2E,MAAOqF,EAASpJ,EAAQwI,qBAAsBzI,IAC5CqJ,CAGD,KAAM8F,EAAInN,EAAM,KAAO+E,EAAQyI,wBAA0BvP,EAAQuP,uBAEvE,MADAnQ,GAAK2E,MAAOqF,EAASpJ,EAAQuP,uBAAwBL,IAC9C9F,EAKT,GAAKtC,EAAQ0I,OAAS7D,IAAcA,EAAUjJ,KAAM3C,IAAc,CASjE,GARAqP,EAAM3E,EAAMpF,EACZgK,EAAarP,EACbsP,EAA2B,IAAb9M,GAAkBzC,EAMd,IAAbyC,GAAqD,WAAnCxC,EAAQ8I,SAASC,cAA6B,CACpEoG,EAASM,GAAU1P,IAEb0K,EAAMzK,EAAQ0P,aAAa,OAChCN,EAAM3E,EAAIjF,QAAS+I,GAAS,QAE5BvO,EAAQ2P,aAAc,KAAMP,GAE7BA,EAAM,QAAUA,EAAM,MAEtBhL,EAAI+K,EAAOhN,MACX,OAAQiC,IACP+K,EAAO/K,GAAKgL,EAAMQ,GAAYT,EAAO/K,GAEtCiL,GAAa9B,EAAS7K,KAAM3C,IAAcC,EAAQ+C,YAAc/C,EAChEsP,EAAcH,EAAOU,KAAK,KAG3B,GAAKP,EACJ,IAIC,MAHAlQ,GAAK2E,MAAOqF,EACXiG,EAAWS,iBAAkBR,IAEvBlG,EACN,MAAM2G,IACN,QACKtF,GACLzK,EAAQgQ,gBAAgB,QAQ7B,MAAOC,IAAQlQ,EAASyF,QAASlF,EAAO,MAAQN,EAASoJ,EAAS6F,GASnE,QAAS/C,MACR,GAAIgE,KAEJ,SAASC,GAAOvJ,EAAKoC,GAMpB,MAJKkH,GAAK9Q,KAAMwH,GAAO,KAAQuE,EAAKiF,mBAE5BD,GAAOD,EAAKG,SAEZF,EAAOvJ,GAAQoC,EAExB,MAAOmH,GAOR,QAASG,IAAcrQ,GAEtB,MADAA,GAAIoF,IAAY,EACTpF,EAOR,QAASsQ,IAAQtQ,GAChB,GAAIuQ,GAAMjS,EAASiJ,cAAc,MAEjC,KACC,QAASvH,EAAIuQ,GACZ,MAAO3J,GACR,OAAO,EACN,QAEI2J,EAAIzN,YACRyN,EAAIzN,WAAW0N,YAAaD,GAG7BA,EAAM,MASR,QAASE,IAAWC,EAAOC,GAC1B,GAAIzH,GAAMwH,EAAM1F,MAAM,KACrB7G,EAAIuM,EAAMxO,MAEX,OAAQiC,IACP+G,EAAK0F,WAAY1H,EAAI/E,IAAOwM,EAU9B,QAASE,IAAcvE,EAAGC,GACzB,GAAIuE,GAAMvE,GAAKD,EACdyE,EAAOD,GAAsB,IAAfxE,EAAE/J,UAAiC,IAAfgK,EAAEhK,YAChCgK,EAAEyE,aAAevE,KACjBH,EAAE0E,aAAevE,EAGtB,IAAKsE,EACJ,MAAOA,EAIR,IAAKD,EACJ,MAASA,EAAMA,EAAIG,YAClB,GAAKH,IAAQvE,EACZ,MAAO,EAKV,OAAOD,GAAI,EAAI,GAOhB,QAAS4E,IAAmB7P,GAC3B,MAAO,UAAUU,GAChB,GAAI+C,GAAO/C,EAAK8G,SAASC,aACzB,OAAgB,UAAThE,GAAoB/C,EAAKV,OAASA,GAQ3C,QAAS8P,IAAoB9P,GAC5B,MAAO,UAAUU,GAChB,GAAI+C,GAAO/C,EAAK8G,SAASC,aACzB,QAAiB,UAAThE,GAA6B,WAATA,IAAsB/C,EAAKV,OAASA,GAQlE,QAAS+P,IAAwBpR,GAChC,MAAOqQ,IAAa,SAAUgB,GAE7B,MADAA,IAAYA,EACLhB,GAAa,SAAUrB,EAAMpD,GACnC,GAAIvH,GACHiN,EAAetR,KAAQgP,EAAK9M,OAAQmP,GACpClN,EAAImN,EAAapP,MAGlB,OAAQiC,IACF6K,EAAO3K,EAAIiN,EAAanN,MAC5B6K,EAAK3K,KAAOuH,EAAQvH,GAAK2K,EAAK3K,SAWnC+G,EAAQ2D,GAAO3D,MAAQ,SAAUrJ,GAGhC,GAAIvD,GAAkBuD,IAASA,EAAKS,eAAiBT,GAAMvD,eAC3D,OAAOA,GAA+C,SAA7BA,EAAgBqK,UAAsB,GAIhEhC,EAAUkI,GAAOlI,WAOjB2E,EAAcuD,GAAOvD,YAAc,SAAU+F,GAC5C,GAAIC,GAAMD,EAAOA,EAAK/O,eAAiB+O,EAAOzF,EAC7C2F,EAASD,EAAIE,WAGd,OAAKF,KAAQlT,GAA6B,IAAjBkT,EAAIjP,UAAmBiP,EAAIhT,iBAKpDF,EAAWkT,EACXjT,EAAUiT,EAAIhT,gBAGdiN,GAAkBL,EAAOoG,GAMpBC,GAAUA,EAAO9G,aAAe8G,IAAWA,EAAO7G,KACtD6G,EAAO9G,YAAa,iBAAkB,WACrCa,MASF3E,EAAQoG,WAAaqD,GAAO,SAAUC,GAErC,MADAA,GAAIoB,UAAY,KACRpB,EAAId,aAAa,eAO1B5I,EAAQ0B,qBAAuB+H,GAAO,SAAUC,GAE/C,MADAA,GAAIqB,YAAaJ,EAAIK,cAAc,MAC3BtB,EAAIhI,qBAAqB,KAAKrG,SAIvC2E,EAAQyI,uBAAyBgB,GAAO,SAAUC,GAQjD,MAPAA,GAAIuB,UAAY,+CAIhBvB,EAAIwB,WAAWJ,UAAY,IAGuB,IAA3CpB,EAAIjB,uBAAuB,KAAKpN,SAOxC2E,EAAQmL,QAAU1B,GAAO,SAAUC,GAElC,MADAhS,GAAQqT,YAAarB,GAAMxN,GAAKqC,GACxBoM,EAAIS,oBAAsBT,EAAIS,kBAAmB7M,GAAUlD,SAI/D2E,EAAQmL,SACZ9G,EAAK9I,KAAS,GAAI,SAAUW,EAAIhD,GAC/B,SAAYA,GAAQ8C,iBAAmB2J,GAAgBf,EAAiB,CACvE,GAAIwD,GAAIlP,EAAQ8C,eAAgBE,EAGhC,OAAOkM,IAAKA,EAAEnM,YAAcmM,QAG9B/D,EAAKgH,OAAW,GAAI,SAAUnP,GAC7B,GAAIoP,GAASpP,EAAGwC,QAASgJ,GAAWC,GACpC,OAAO,UAAUzM,GAChB,MAAOA,GAAK0N,aAAa,QAAU0C,YAM9BjH,GAAK9I,KAAS,GAErB8I,EAAKgH,OAAW,GAAK,SAAUnP,GAC9B,GAAIoP,GAASpP,EAAGwC,QAASgJ,GAAWC,GACpC,OAAO,UAAUzM,GAChB,GAAIwP,SAAcxP,GAAKqQ,mBAAqB5F,GAAgBzK,EAAKqQ,iBAAiB,KAClF,OAAOb,IAAQA,EAAKxI,QAAUoJ,KAMjCjH,EAAK9I,KAAU,IAAIyE,EAAQ0B,qBAC1B,SAAU8J,EAAKtS,GACd,aAAYA,GAAQwI,uBAAyBiE,EACrCzM,EAAQwI,qBAAsB8J,GADtC,GAID,SAAUA,EAAKtS,GACd,GAAIgC,GACHkG,KACA9D,EAAI,EACJgF,EAAUpJ,EAAQwI,qBAAsB8J,EAGzC,IAAa,MAARA,EAAc,CAClB,MAAStQ,EAAOoH,EAAQhF,KACA,IAAlBpC,EAAKQ,UACT0F,EAAI9I,KAAM4C,EAIZ,OAAOkG,GAER,MAAOkB,IAIT+B,EAAK9I,KAAY,MAAIyE,EAAQyI,wBAA0B,SAAUqC,EAAW5R,GAC3E,aAAYA,GAAQuP,yBAA2B9C,GAAgBf,EACvD1L,EAAQuP,uBAAwBqC,GADxC,GAWDhG,KAOAD,MAEM7E,EAAQ0I,IAAMpB,EAAQ1L,KAAM+O,EAAI3B,qBAGrCS,GAAO,SAAUC,GAMhBA,EAAIuB,UAAY,iDAIVvB,EAAIV,iBAAiB,cAAc3N,QACxCwJ,EAAUvM,KAAM,MAAQ2N,EAAa,aAAeD,EAAW,KAM1D0D,EAAIV,iBAAiB,YAAY3N,QACtCwJ,EAAUvM,KAAK,cAIjBmR,GAAO,SAAUC,GAOhB,GAAI+B,GAAQd,EAAIjK,cAAc,QAC9B+K,GAAM5C,aAAc,OAAQ,UAC5Ba,EAAIqB,YAAaU,GAAQ5C,aAAc,IAAK,IAEvCa,EAAIV,iBAAiB,WAAW3N,QACpCwJ,EAAUvM,KAAM,SAAW2N,EAAa,gBAKnCyD,EAAIV,iBAAiB,YAAY3N,QACtCwJ,EAAUvM,KAAM,WAAY,aAI7BoR,EAAIV,iBAAiB,QACrBnE,EAAUvM,KAAK,YAIX0H,EAAQ0L,gBAAkBpE,EAAQ1L,KAAOmJ,EAAUrN,EAAQiU,uBAChEjU,EAAQkU,oBACRlU,EAAQmU,kBACRnU,EAAQoU,qBAERrC,GAAO,SAAUC,GAGhB1J,EAAQ+L,kBAAoBhH,EAAQ1I,KAAMqN,EAAK,OAI/C3E,EAAQ1I,KAAMqN,EAAK,aACnB5E,EAAcxM,KAAM,KAAM+N,KAI5BxB,EAAYA,EAAUxJ,QAAciL,OAAQzB,EAAUkE,KAAK,MAC3DjE,EAAgBA,EAAczJ,QAAciL,OAAQxB,EAAciE,KAAK,MAQvE/D,EAAWsC,EAAQ1L,KAAMlE,EAAQsN,WAActN,EAAQsU,wBACtD,SAAUvG,EAAGC,GACZ,GAAIuG,GAAuB,IAAfxG,EAAE/J,SAAiB+J,EAAE9N,gBAAkB8N,EAClDyG,EAAMxG,GAAKA,EAAEzJ,UACd,OAAOwJ,KAAMyG,MAAWA,GAAwB,IAAjBA,EAAIxQ,YAClCuQ,EAAMjH,SACLiH,EAAMjH,SAAUkH,GAChBzG,EAAEuG,yBAA8D,GAAnCvG,EAAEuG,wBAAyBE,MAG3D,SAAUzG,EAAGC,GACZ,GAAKA,EACJ,MAASA,EAAIA,EAAEzJ,WACd,GAAKyJ,IAAMD,EACV,OAAO,CAIV,QAAO,GAOTD,EAAY9N,EAAQsU,wBACpB,SAAUvG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,MADAH,IAAe,EACR,CAGR,IAAI4G,GAAUzG,EAAEsG,yBAA2BvG,EAAEuG,yBAA2BvG,EAAEuG,wBAAyBtG,EAEnG,OAAKyG,GAEW,EAAVA,IACFnM,EAAQoM,cAAgB1G,EAAEsG,wBAAyBvG,KAAQ0G,EAGxD1G,IAAMkF,GAAO3F,EAASC,EAAcQ,GACjC,GAEHC,IAAMiF,GAAO3F,EAASC,EAAcS,GACjC,EAIDhB,EACJhM,EAAQ2D,KAAMqI,EAAWe,GAAM/M,EAAQ2D,KAAMqI,EAAWgB,GAC1D,EAGe,EAAVyG,EAAc,GAAK,EAIpB1G,EAAEuG,wBAA0B,GAAK,GAEzC,SAAUvG,EAAGC,GACZ,GAAIuE,GACH3M,EAAI,EACJ+O,EAAM5G,EAAExJ,WACRiQ,EAAMxG,EAAEzJ,WACRqQ,GAAO7G,GACP8G,GAAO7G,EAGR,IAAKD,IAAMC,EAEV,MADAH,IAAe,EACR,CAGD,KAAM8G,IAAQH,EACpB,MAAOzG,KAAMkF,EAAM,GAClBjF,IAAMiF,EAAM,EACZ0B,EAAM,GACNH,EAAM,EACNxH,EACEhM,EAAQ2D,KAAMqI,EAAWe,GAAM/M,EAAQ2D,KAAMqI,EAAWgB,GAC1D,CAGK,IAAK2G,IAAQH,EACnB,MAAOlC,IAAcvE,EAAGC,EAIzBuE,GAAMxE,CACN,OAASwE,EAAMA,EAAIhO,WAClBqQ,EAAGE,QAASvC,EAEbA,GAAMvE,CACN,OAASuE,EAAMA,EAAIhO,WAClBsQ,EAAGC,QAASvC,EAIb,OAAQqC,EAAGhP,KAAOiP,EAAGjP,GACpBA,GAGD,OAAOA,GAEN0M,GAAcsC,EAAGhP,GAAIiP,EAAGjP,IAGxBgP,EAAGhP,KAAO2H,EAAe,GACzBsH,EAAGjP,KAAO2H,EAAe,EACzB,GAGK0F,GA1UClT,GA6UTyQ,GAAOnD,QAAU,SAAU0H,EAAMC,GAChC,MAAOxE,IAAQuE,EAAM,KAAM,KAAMC,IAGlCxE,GAAOwD,gBAAkB,SAAUxQ,EAAMuR,GASxC,IAPOvR,EAAKS,eAAiBT,KAAWzD,GACvCkN,EAAazJ,GAIduR,EAAOA,EAAK/N,QAASgI,EAAkB,aAElC1G,EAAQ0L,kBAAmB9G,GAC5BE,GAAkBA,EAAclJ,KAAM6Q,IACtC5H,GAAkBA,EAAUjJ,KAAM6Q,IAErC,IACC,GAAI/P,GAAMqI,EAAQ1I,KAAMnB,EAAMuR,EAG9B,IAAK/P,GAAOsD,EAAQ+L,mBAGlB7Q,EAAKzD,UAAuC,KAA3ByD,EAAKzD,SAASiE,SAChC,MAAOgB,GAEP,MAAMqD,IAGT,MAAOmI,IAAQuE,EAAMhV,EAAU,MAAOyD,IAAQG,OAAS,GAGxD6M,GAAOlD,SAAW,SAAU9L,EAASgC,GAKpC,OAHOhC,EAAQyC,eAAiBzC,KAAczB,GAC7CkN,EAAazL,GAEP8L,EAAU9L,EAASgC,IAG3BgN,GAAOnM,KAAO,SAAUb,EAAM+C,IAEtB/C,EAAKS,eAAiBT,KAAWzD,GACvCkN,EAAazJ,EAGd,IAAI/B,GAAKkL,EAAK0F,WAAY9L,EAAKgE,eAE9B0K,EAAMxT,GAAM0M,EAAOxJ,KAAMgI,EAAK0F,WAAY9L,EAAKgE,eAC9C9I,EAAI+B,EAAM+C,GAAO2G,GACjBxN,CAEF,OAAOuV,KAAQvV,EACd4I,EAAQoG,aAAexB,EACtB1J,EAAK0N,aAAc3K,IAClB0O,EAAMzR,EAAKqQ,iBAAiBtN,KAAU0O,EAAIC,UAC1CD,EAAIzK,MACJ,KACFyK,GAGFzE,GAAO/H,MAAQ,SAAUC,GACxB,KAAUC,OAAO,0CAA4CD,IAO9D8H,GAAO2E,WAAa,SAAUvK,GAC7B,GAAIpH,GACH4R,KACAtP,EAAI,EACJF,EAAI,CAOL,IAJAiI,GAAgBvF,EAAQ+M,iBACxBrI,GAAa1E,EAAQgN,YAAc1K,EAAQ9J,MAAO,GAClD8J,EAAQ3E,KAAM6H,GAETD,EAAe,CACnB,MAASrK,EAAOoH,EAAQhF,KAClBpC,IAASoH,EAAShF,KACtBE,EAAIsP,EAAWxU,KAAMgF,GAGvB,OAAQE,IACP8E,EAAQ1E,OAAQkP,EAAYtP,GAAK,GAInC,MAAO8E,IAORgC,EAAU4D,GAAO5D,QAAU,SAAUpJ,GACpC,GAAIwP,GACHhO,EAAM,GACNY,EAAI,EACJ5B,EAAWR,EAAKQ,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArBR,GAAK+R,YAChB,MAAO/R,GAAK+R,WAGZ,KAAM/R,EAAOA,EAAKgQ,WAAYhQ,EAAMA,EAAOA,EAAKkP,YAC/C1N,GAAO4H,EAASpJ,OAGZ,IAAkB,IAAbQ,GAA+B,IAAbA,EAC7B,MAAOR,GAAKgS,cAhBZ,MAASxC,EAAOxP,EAAKoC,GAAKA,IAEzBZ,GAAO4H,EAASoG,EAkBlB,OAAOhO,IAGR2H,EAAO6D,GAAOiF,WAGb7D,YAAa,GAEb8D,aAAc5D,GAEdvO,MAAO4L,EAEPkD,cAEAxO,QAEA8R,UACCC,KAAOC,IAAK,aAAcpQ,OAAO,GACjCqQ,KAAOD,IAAK,cACZE,KAAOF,IAAK,kBAAmBpQ,OAAO,GACtCuQ,KAAOH,IAAK,oBAGbI,WACC1G,KAAQ,SAAUhM,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAGyD,QAASgJ,GAAWC,IAGxC1M,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAM,IAAKyD,QAASgJ,GAAWC,IAE5C,OAAb1M,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAMzC,MAAO,EAAG,IAGxB2O,MAAS,SAAUlM,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAGgH,cAEY,QAA3BhH,EAAM,GAAGzC,MAAO,EAAG,IAEjByC,EAAM,IACXiN,GAAO/H,MAAOlF,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjBiN,GAAO/H,MAAOlF,EAAM,IAGdA,GAGRiM,OAAU,SAAUjM,GACnB,GAAI2S,GACHC,GAAY5S,EAAM,IAAMA,EAAM,EAE/B,OAAK4L,GAAiB,MAAEjL,KAAMX,EAAM,IAC5B,MAIHA,EAAM,IAAMA,EAAM,KAAO7D,EAC7B6D,EAAM,GAAKA,EAAM,GAGN4S,GAAYlH,EAAQ/K,KAAMiS,KAEpCD,EAASjF,GAAUkF,GAAU,MAE7BD,EAASC,EAASnV,QAAS,IAAKmV,EAASxS,OAASuS,GAAWC,EAASxS,UAGvEJ,EAAM,GAAKA,EAAM,GAAGzC,MAAO,EAAGoV,GAC9B3S,EAAM,GAAK4S,EAASrV,MAAO,EAAGoV,IAIxB3S,EAAMzC,MAAO,EAAG,MAIzB6S,QAECrE,IAAO,SAAU8G,GAChB,GAAI9L,GAAW8L,EAAiBpP,QAASgJ,GAAWC,IAAY1F,aAChE,OAA4B,MAArB6L,EACN,WAAa,OAAO,GACpB,SAAU5S,GACT,MAAOA,GAAK8G,UAAY9G,EAAK8G,SAASC,gBAAkBD,IAI3D+E,MAAS,SAAU+D,GAClB,GAAIiD,GAAU5I,EAAY2F,EAAY,IAEtC,OAAOiD,KACLA,EAAczH,OAAQ,MAAQL,EAAa,IAAM6E,EAAY,IAAM7E,EAAa,SACjFd,EAAY2F,EAAW,SAAU5P,GAChC,MAAO6S,GAAQnS,KAAgC,gBAAnBV,GAAK4P,WAA0B5P,EAAK4P,iBAAoB5P,GAAK0N,eAAiBjD,GAAgBzK,EAAK0N,aAAa,UAAY,OAI3J3B,KAAQ,SAAUhJ,EAAM+P,EAAUC,GACjC,MAAO,UAAU/S,GAChB,GAAIgT,GAAShG,GAAOnM,KAAMb,EAAM+C,EAEhC,OAAe,OAAViQ,EACgB,OAAbF,EAEFA,GAINE,GAAU,GAEU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOxV,QAASuV,GAChC,OAAbD,EAAoBC,GAASC,EAAOxV,QAASuV,GAAU,GAC1C,OAAbD,EAAoBC,GAASC,EAAO1V,OAAQyV,EAAM5S,UAAa4S,EAClD,OAAbD,GAAsB,IAAME,EAAS,KAAMxV,QAASuV,GAAU,GACjD,OAAbD,EAAoBE,IAAWD,GAASC,EAAO1V,MAAO,EAAGyV,EAAM5S,OAAS,KAAQ4S,EAAQ,KACxF,IAZO,IAgBV9G,MAAS,SAAU3M,EAAM2T,EAAM3D,EAAUrN,EAAOE,GAC/C,GAAI+Q,GAAgC,QAAvB5T,EAAKhC,MAAO,EAAG,GAC3B6V,EAA+B,SAArB7T,EAAKhC,MAAO,IACtB8V,EAAkB,YAATH,CAEV,OAAiB,KAAVhR,GAAwB,IAATE,EAGrB,SAAUnC,GACT,QAASA,EAAKe,YAGf,SAAUf,EAAMhC,EAASiI,GACxB,GAAIkI,GAAOkF,EAAY7D,EAAMR,EAAMsE,EAAWC,EAC7ClB,EAAMa,IAAWC,EAAU,cAAgB,kBAC3CzD,EAAS1P,EAAKe,WACdgC,EAAOqQ,GAAUpT,EAAK8G,SAASC,cAC/ByM,GAAYvN,IAAQmN,CAErB,IAAK1D,EAAS,CAGb,GAAKwD,EAAS,CACb,MAAQb,EAAM,CACb7C,EAAOxP,CACP,OAASwP,EAAOA,EAAM6C,GACrB,GAAKe,EAAS5D,EAAK1I,SAASC,gBAAkBhE,EAAyB,IAAlByM,EAAKhP,SACzD,OAAO,CAIT+S,GAAQlB,EAAe,SAAT/S,IAAoBiU,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAUJ,EAAUzD,EAAOM,WAAaN,EAAO+D,WAG1CN,GAAWK,EAAW,CAE1BH,EAAa3D,EAAQrM,KAAcqM,EAAQrM,OAC3C8K,EAAQkF,EAAY/T,OACpBgU,EAAYnF,EAAM,KAAOnE,GAAWmE,EAAM,GAC1Ca,EAAOb,EAAM,KAAOnE,GAAWmE,EAAM,GACrCqB,EAAO8D,GAAa5D,EAAO/J,WAAY2N,EAEvC,OAAS9D,IAAS8D,GAAa9D,GAAQA,EAAM6C,KAG3CrD,EAAOsE,EAAY,IAAMC,EAAM3I,MAGhC,GAAuB,IAAlB4E,EAAKhP,YAAoBwO,GAAQQ,IAASxP,EAAO,CACrDqT,EAAY/T,IAAW0K,EAASsJ,EAAWtE,EAC3C,YAKI,IAAKwE,IAAarF,GAASnO,EAAMqD,KAAcrD,EAAMqD,QAAkB/D,KAAW6O,EAAM,KAAOnE,EACrGgF,EAAOb,EAAM,OAKb,OAASqB,IAAS8D,GAAa9D,GAAQA,EAAM6C,KAC3CrD,EAAOsE,EAAY,IAAMC,EAAM3I,MAEhC,IAAOwI,EAAS5D,EAAK1I,SAASC,gBAAkBhE,EAAyB,IAAlByM,EAAKhP,aAAsBwO,IAE5EwE,KACHhE,EAAMnM,KAAcmM,EAAMnM,QAAkB/D,IAAW0K,EAASgF,IAG7DQ,IAASxP,GACb,KAQJ,OADAgP,IAAQ7M,EACD6M,IAAS/M,GAA4B,IAAjB+M,EAAO/M,GAAe+M,EAAO/M,GAAS,KAKrE+J,OAAU,SAAU0H,EAAQpE,GAK3B,GAAI1N,GACH3D,EAAKkL,EAAKgC,QAASuI,IAAYvK,EAAKwK,WAAYD,EAAO3M,gBACtDiG,GAAO/H,MAAO,uBAAyByO,EAKzC,OAAKzV,GAAIoF,GACDpF,EAAIqR,GAIPrR,EAAGkC,OAAS,GAChByB,GAAS8R,EAAQA,EAAQ,GAAIpE,GACtBnG,EAAKwK,WAAW/V,eAAgB8V,EAAO3M,eAC7CuH,GAAa,SAAUrB,EAAMpD,GAC5B,GAAI+J,GACHC,EAAU5V,EAAIgP,EAAMqC,GACpBlN,EAAIyR,EAAQ1T,MACb,OAAQiC,IACPwR,EAAMpW,EAAQ2D,KAAM8L,EAAM4G,EAAQzR,IAClC6K,EAAM2G,KAAW/J,EAAS+J,GAAQC,EAAQzR,MAG5C,SAAUpC,GACT,MAAO/B,GAAI+B,EAAM,EAAG4B,KAIhB3D,IAITkN,SAEC2I,IAAOxF,GAAa,SAAUvQ,GAI7B,GAAIwS,MACHnJ,KACA2M,EAAUzK,EAASvL,EAASyF,QAASlF,EAAO,MAE7C,OAAOyV,GAAS1Q,GACfiL,GAAa,SAAUrB,EAAMpD,EAAS7L,EAASiI,GAC9C,GAAIjG,GACHgU,EAAYD,EAAS9G,EAAM,KAAMhH,MACjC7D,EAAI6K,EAAK9M,MAGV,OAAQiC,KACDpC,EAAOgU,EAAU5R,MACtB6K,EAAK7K,KAAOyH,EAAQzH,GAAKpC,MAI5B,SAAUA,EAAMhC,EAASiI,GAGxB,MAFAsK,GAAM,GAAKvQ,EACX+T,EAASxD,EAAO,KAAMtK,EAAKmB,IACnBA,EAAQwD,SAInBqJ,IAAO3F,GAAa,SAAUvQ,GAC7B,MAAO,UAAUiC,GAChB,MAAOgN,IAAQjP,EAAUiC,GAAOG,OAAS,KAI3C2J,SAAYwE,GAAa,SAAUpH,GAClC,MAAO,UAAUlH,GAChB,OAASA,EAAK+R,aAAe/R,EAAKkU,WAAa9K,EAASpJ,IAASxC,QAAS0J,GAAS,MAWrFiN,KAAQ7F,GAAc,SAAU6F,GAM/B,MAJMzI,GAAYhL,KAAKyT,GAAQ,KAC9BnH,GAAO/H,MAAO,qBAAuBkP,GAEtCA,EAAOA,EAAK3Q,QAASgJ,GAAWC,IAAY1F,cACrC,SAAU/G,GAChB,GAAIoU,EACJ,GACC,IAAMA,EAAW1K,EAChB1J,EAAKmU,KACLnU,EAAK0N,aAAa,aAAe1N,EAAK0N,aAAa,QAGnD,MADA0G,GAAWA,EAASrN,cACbqN,IAAaD,GAA2C,IAAnCC,EAAS5W,QAAS2W,EAAO,YAE5CnU,EAAOA,EAAKe,aAAiC,IAAlBf,EAAKQ,SAC3C,QAAO,KAKT0C,OAAU,SAAUlD,GACnB,GAAIqU,GAAOpY,EAAOK,UAAYL,EAAOK,SAAS+X,IAC9C,OAAOA,IAAQA,EAAK/W,MAAO,KAAQ0C,EAAKgB,IAGzCsT,KAAQ,SAAUtU,GACjB,MAAOA,KAASxD,GAGjB+X,MAAS,SAAUvU,GAClB,MAAOA,KAASzD,EAASiY,iBAAmBjY,EAASkY,UAAYlY,EAASkY,gBAAkBzU,EAAKV,MAAQU,EAAK0U,OAAS1U,EAAK2U,WAI7HC,QAAW,SAAU5U,GACpB,MAAOA,GAAK6U,YAAa,GAG1BA,SAAY,SAAU7U,GACrB,MAAOA,GAAK6U,YAAa,GAG1BC,QAAW,SAAU9U,GAGpB,GAAI8G,GAAW9G,EAAK8G,SAASC,aAC7B,OAAqB,UAAbD,KAA0B9G,EAAK8U,SAA0B,WAAbhO,KAA2B9G,EAAK+U,UAGrFA,SAAY,SAAU/U,GAOrB,MAJKA,GAAKe,YACTf,EAAKe,WAAWiU,cAGVhV,EAAK+U,YAAa,GAI1BE,MAAS,SAAUjV,GAMlB,IAAMA,EAAOA,EAAKgQ,WAAYhQ,EAAMA,EAAOA,EAAKkP,YAC/C,GAAKlP,EAAK8G,SAAW,KAAyB,IAAlB9G,EAAKQ,UAAoC,IAAlBR,EAAKQ,SACvD,OAAO,CAGT,QAAO,GAGRkP,OAAU,SAAU1P,GACnB,OAAQmJ,EAAKgC,QAAe,MAAGnL,IAIhCkV,OAAU,SAAUlV,GACnB,MAAOsM,IAAQ5L,KAAMV,EAAK8G,WAG3ByJ,MAAS,SAAUvQ,GAClB,MAAOqM,IAAQ3L,KAAMV,EAAK8G,WAG3BqO,OAAU,SAAUnV,GACnB,GAAI+C,GAAO/C,EAAK8G,SAASC,aACzB,OAAgB,UAAThE,GAAkC,WAAd/C,EAAKV,MAA8B,WAATyD,GAGtDmE,KAAQ,SAAUlH,GACjB,GAAIa,EAGJ,OAAuC,UAAhCb,EAAK8G,SAASC,eACN,SAAd/G,EAAKV,OACmC,OAArCuB,EAAOb,EAAK0N,aAAa,UAAoB7M,EAAKkG,gBAAkB/G,EAAKV,OAI9E2C,MAASoN,GAAuB,WAC/B,OAAS,KAGVlN,KAAQkN,GAAuB,SAAUE,EAAcpP,GACtD,OAASA,EAAS,KAGnB+B,GAAMmN,GAAuB,SAAUE,EAAcpP,EAAQmP,GAC5D,OAAoB,EAAXA,EAAeA,EAAWnP,EAASmP,KAG7C8F,KAAQ/F,GAAuB,SAAUE,EAAcpP,GACtD,GAAIiC,GAAI,CACR,MAAYjC,EAAJiC,EAAYA,GAAK,EACxBmN,EAAanS,KAAMgF,EAEpB,OAAOmN,KAGR8F,IAAOhG,GAAuB,SAAUE,EAAcpP,GACrD,GAAIiC,GAAI,CACR,MAAYjC,EAAJiC,EAAYA,GAAK,EACxBmN,EAAanS,KAAMgF,EAEpB,OAAOmN,KAGR+F,GAAMjG,GAAuB,SAAUE,EAAcpP,EAAQmP,GAC5D,GAAIlN,GAAe,EAAXkN,EAAeA,EAAWnP,EAASmP,CAC3C,QAAUlN,GAAK,GACdmN,EAAanS,KAAMgF,EAEpB,OAAOmN,KAGRgG,GAAMlG,GAAuB,SAAUE,EAAcpP,EAAQmP,GAC5D,GAAIlN,GAAe,EAAXkN,EAAeA,EAAWnP,EAASmP,CAC3C,MAAcnP,IAAJiC,GACTmN,EAAanS,KAAMgF,EAEpB,OAAOmN,OAKVpG,EAAKgC,QAAa,IAAIhC,EAAKgC,QAAY,EAGvC,KAAM/I,KAAOoT,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5EzM,EAAKgC,QAAS/I,GAAM+M,GAAmB/M,EAExC,KAAMA,KAAOyT,QAAQ,EAAMC,OAAO,GACjC3M,EAAKgC,QAAS/I,GAAMgN,GAAoBhN,EAIzC,SAASuR,OACTA,GAAW/T,UAAYuJ,EAAK4M,QAAU5M,EAAKgC,QAC3ChC,EAAKwK,WAAa,GAAIA,GAEtB,SAASlG,IAAU1P,EAAUiY,GAC5B,GAAInC,GAAS9T,EAAOkW,EAAQ3W,EAC3B4W,EAAO/I,EAAQgJ,EACfC,EAASjM,EAAYpM,EAAW,IAEjC,IAAKqY,EACJ,MAAOJ,GAAY,EAAII,EAAO9Y,MAAO,EAGtC4Y,GAAQnY,EACRoP,KACAgJ,EAAahN,EAAKsJ,SAElB,OAAQyD,EAAQ,GAGTrC,IAAY9T,EAAQsL,EAAOjL,KAAM8V,OACjCnW,IAEJmW,EAAQA,EAAM5Y,MAAOyC,EAAM,GAAGI,SAAY+V,GAE3C/I,EAAO/P,KAAM6Y,OAGdpC,GAAU,GAGJ9T,EAAQuL,EAAalL,KAAM8V,MAChCrC,EAAU9T,EAAMsO,QAChB4H,EAAO7Y,MACN4J,MAAO6M,EAEPvU,KAAMS,EAAM,GAAGyD,QAASlF,EAAO,OAEhC4X,EAAQA,EAAM5Y,MAAOuW,EAAQ1T,QAI9B,KAAMb,IAAQ6J,GAAKgH,SACZpQ,EAAQ4L,EAAWrM,GAAOc,KAAM8V,KAAcC,EAAY7W,MAC9DS,EAAQoW,EAAY7W,GAAQS,MAC7B8T,EAAU9T,EAAMsO,QAChB4H,EAAO7Y,MACN4J,MAAO6M,EACPvU,KAAMA,EACNuK,QAAS9J,IAEVmW,EAAQA,EAAM5Y,MAAOuW,EAAQ1T,QAI/B,KAAM0T,EACL,MAOF,MAAOmC,GACNE,EAAM/V,OACN+V,EACClJ,GAAO/H,MAAOlH,GAEdoM,EAAYpM,EAAUoP,GAAS7P,MAAO,GAGzC,QAASsQ,IAAYqI,GACpB,GAAI7T,GAAI,EACPC,EAAM4T,EAAO9V,OACbpC,EAAW,EACZ,MAAYsE,EAAJD,EAASA,IAChBrE,GAAYkY,EAAO7T,GAAG4E,KAEvB,OAAOjJ,GAGR,QAASsY,IAAetC,EAASuC,EAAYC,GAC5C,GAAIlE,GAAMiE,EAAWjE,IACpBmE,EAAmBD,GAAgB,eAARlE,EAC3BoE,EAAW3U,GAEZ,OAAOwU,GAAWrU,MAEjB,SAAUjC,EAAMhC,EAASiI,GACxB,MAASjG,EAAOA,EAAMqS,GACrB,GAAuB,IAAlBrS,EAAKQ,UAAkBgW,EAC3B,MAAOzC,GAAS/T,EAAMhC,EAASiI,IAMlC,SAAUjG,EAAMhC,EAASiI,GACxB,GAAIb,GAAM+I,EAAOkF,EAChBqD,EAAS1M,EAAU,IAAMyM,CAG1B,IAAKxQ,GACJ,MAASjG,EAAOA,EAAMqS,GACrB,IAAuB,IAAlBrS,EAAKQ,UAAkBgW,IACtBzC,EAAS/T,EAAMhC,EAASiI,GAC5B,OAAO,MAKV,OAASjG,EAAOA,EAAMqS,GACrB,GAAuB,IAAlBrS,EAAKQ,UAAkBgW,EAE3B,GADAnD,EAAarT,EAAMqD,KAAcrD,EAAMqD,QACjC8K,EAAQkF,EAAYhB,KAAUlE,EAAM,KAAOuI,GAChD,IAAMtR,EAAO+I,EAAM,OAAQ,GAAQ/I,IAAS8D,EAC3C,MAAO9D,MAAS,MAKjB,IAFA+I,EAAQkF,EAAYhB,IAAUqE,GAC9BvI,EAAM,GAAK4F,EAAS/T,EAAMhC,EAASiI,IAASiD,EACvCiF,EAAM,MAAO,EACjB,OAAO,GASf,QAASwI,IAAgBC,GACxB,MAAOA,GAASzW,OAAS,EACxB,SAAUH,EAAMhC,EAASiI,GACxB,GAAI7D,GAAIwU,EAASzW,MACjB,OAAQiC,IACP,IAAMwU,EAASxU,GAAIpC,EAAMhC,EAASiI,GACjC,OAAO,CAGT,QAAO,GAER2Q,EAAS,GAGX,QAASC,IAAU7C,EAAWzR,EAAK4N,EAAQnS,EAASiI,GACnD,GAAIjG,GACH8W,KACA1U,EAAI,EACJC,EAAM2R,EAAU7T,OAChB4W,EAAgB,MAAPxU,CAEV,MAAYF,EAAJD,EAASA,KACVpC,EAAOgU,EAAU5R,OAChB+N,GAAUA,EAAQnQ,EAAMhC,EAASiI,MACtC6Q,EAAa1Z,KAAM4C,GACd+W,GACJxU,EAAInF,KAAMgF,GAMd,OAAO0U,GAGR,QAASE,IAAYvE,EAAW1U,EAAUgW,EAASkD,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAY5T,KAC/B4T,EAAaD,GAAYC,IAErBC,IAAeA,EAAY7T,KAC/B6T,EAAaF,GAAYE,EAAYC,IAE/B7I,GAAa,SAAUrB,EAAM7F,EAASpJ,EAASiI,GACrD,GAAImR,GAAMhV,EAAGpC,EACZqX,KACAC,KACAC,EAAcnQ,EAAQjH,OAGtBoB,EAAQ0L,GAAQuK,GAAkBzZ,GAAY,IAAKC,EAAQwC,UAAaxC,GAAYA,MAGpFyZ,GAAYhF,IAAexF,GAASlP,EAEnCwD,EADAsV,GAAUtV,EAAO8V,EAAQ5E,EAAWzU,EAASiI,GAG9CyR,EAAa3D,EAEZmD,IAAgBjK,EAAOwF,EAAY8E,GAAeN,MAMjD7P,EACDqQ,CAQF,IALK1D,GACJA,EAAS0D,EAAWC,EAAY1Z,EAASiI,GAIrCgR,EAAa,CACjBG,EAAOP,GAAUa,EAAYJ,GAC7BL,EAAYG,KAAUpZ,EAASiI,GAG/B7D,EAAIgV,EAAKjX,MACT,OAAQiC,KACDpC,EAAOoX,EAAKhV,MACjBsV,EAAYJ,EAAQlV,MAASqV,EAAWH,EAAQlV,IAAOpC,IAK1D,GAAKiN,GACJ,GAAKiK,GAAczE,EAAY,CAC9B,GAAKyE,EAAa,CAEjBE,KACAhV,EAAIsV,EAAWvX,MACf,OAAQiC,KACDpC,EAAO0X,EAAWtV,KAEvBgV,EAAKha,KAAOqa,EAAUrV,GAAKpC,EAG7BkX,GAAY,KAAOQ,KAAkBN,EAAMnR,GAI5C7D,EAAIsV,EAAWvX,MACf,OAAQiC,KACDpC,EAAO0X,EAAWtV,MACtBgV,EAAOF,EAAa1Z,EAAQ2D,KAAM8L,EAAMjN,GAASqX,EAAOjV,IAAM,KAE/D6K,EAAKmK,KAAUhQ,EAAQgQ,GAAQpX,SAOlC0X,GAAab,GACZa,IAAetQ,EACdsQ,EAAWhV,OAAQ6U,EAAaG,EAAWvX,QAC3CuX,GAEGR,EACJA,EAAY,KAAM9P,EAASsQ,EAAYzR,GAEvC7I,EAAK2E,MAAOqF,EAASsQ,KAMzB,QAASC,IAAmB1B,GAC3B,GAAI2B,GAAc7D,EAASzR,EAC1BD,EAAM4T,EAAO9V,OACb0X,EAAkB1O,EAAKgJ,SAAU8D,EAAO,GAAG3W,MAC3CwY,EAAmBD,GAAmB1O,EAAKgJ,SAAS,KACpD/P,EAAIyV,EAAkB,EAAI,EAG1BE,EAAe1B,GAAe,SAAUrW,GACvC,MAAOA,KAAS4X,GACdE,GAAkB,GACrBE,EAAkB3B,GAAe,SAAUrW,GAC1C,MAAOxC,GAAQ2D,KAAMyW,EAAc5X,GAAS,IAC1C8X,GAAkB,GACrBlB,GAAa,SAAU5W,EAAMhC,EAASiI,GACrC,OAAU4R,IAAqB5R,GAAOjI,IAAYuL,MAChDqO,EAAe5Z,GAASwC,SACxBuX,EAAc/X,EAAMhC,EAASiI,GAC7B+R,EAAiBhY,EAAMhC,EAASiI,KAGpC,MAAY5D,EAAJD,EAASA,IAChB,GAAM2R,EAAU5K,EAAKgJ,SAAU8D,EAAO7T,GAAG9C,MACxCsX,GAAaP,GAAcM,GAAgBC,GAAY7C,QACjD,CAIN,GAHAA,EAAU5K,EAAKgH,OAAQ8F,EAAO7T,GAAG9C,MAAOyC,MAAO,KAAMkU,EAAO7T,GAAGyH,SAG1DkK,EAAS1Q,GAAY,CAGzB,IADAf,IAAMF,EACMC,EAAJC,EAASA,IAChB,GAAK6G,EAAKgJ,SAAU8D,EAAO3T,GAAGhD,MAC7B,KAGF,OAAO0X,IACN5U,EAAI,GAAKuU,GAAgBC,GACzBxU,EAAI,GAAKwL,GAERqI,EAAO3Y,MAAO,EAAG8E,EAAI,GAAIlF,QAAS8J,MAAgC,MAAzBiP,EAAQ7T,EAAI,GAAI9C,KAAe,IAAM,MAC7EkE,QAASlF,EAAO,MAClByV,EACIzR,EAAJF,GAASuV,GAAmB1B,EAAO3Y,MAAO8E,EAAGE,IACzCD,EAAJC,GAAWqV,GAAoB1B,EAASA,EAAO3Y,MAAOgF,IAClDD,EAAJC,GAAWsL,GAAYqI,IAGzBW,EAASxZ,KAAM2W,GAIjB,MAAO4C,IAAgBC,GAGxB,QAASqB,IAA0BC,EAAiBC,GAEnD,GAAIC,GAAoB,EACvBC,EAAQF,EAAYhY,OAAS,EAC7BmY,EAAYJ,EAAgB/X,OAAS,EACrCoY,EAAe,SAAUtL,EAAMjP,EAASiI,EAAKmB,EAASoR,GACrD,GAAIxY,GAAMsC,EAAGyR,EACZ0E,KACAC,EAAe,EACftW,EAAI,IACJ4R,EAAY/G,MACZ0L,EAA6B,MAAjBH,EACZI,EAAgBrP,EAEhBhI,EAAQ0L,GAAQqL,GAAanP,EAAK9I,KAAU,IAAG,IAAKmY,GAAiBxa,EAAQ+C,YAAc/C,GAE3F6a,EAAiB7O,GAA4B,MAAjB4O,EAAwB,EAAItV,KAAKC,UAAY,EAS1E,KAPKoV,IACJpP,EAAmBvL,IAAYzB,GAAYyB,EAC3CkL,EAAakP,GAKe,OAApBpY,EAAOuB,EAAMa,IAAaA,IAAM,CACxC,GAAKkW,GAAatY,EAAO,CACxBsC,EAAI,CACJ,OAASyR,EAAUmE,EAAgB5V,KAClC,GAAKyR,EAAS/T,EAAMhC,EAASiI,GAAQ,CACpCmB,EAAQhK,KAAM4C,EACd,OAGG2Y,IACJ3O,EAAU6O,EACV3P,IAAekP,GAKZC,KAEErY,GAAQ+T,GAAW/T,IACxB0Y,IAIIzL,GACJ+G,EAAU5W,KAAM4C,IAOnB,GADA0Y,GAAgBtW,EACXiW,GAASjW,IAAMsW,EAAe,CAClCpW,EAAI,CACJ,OAASyR,EAAUoE,EAAY7V,KAC9ByR,EAASC,EAAWyE,EAAYza,EAASiI,EAG1C,IAAKgH,EAAO,CAEX,GAAKyL,EAAe,EACnB,MAAQtW,IACA4R,EAAU5R,IAAMqW,EAAWrW,KACjCqW,EAAWrW,GAAKwI,EAAIzJ,KAAMiG,GAM7BqR,GAAa5B,GAAU4B,GAIxBrb,EAAK2E,MAAOqF,EAASqR,GAGhBE,IAAc1L,GAAQwL,EAAWtY,OAAS,GAC5CuY,EAAeP,EAAYhY,OAAW,GAExC6M,GAAO2E,WAAYvK,GAUrB,MALKuR,KACJ3O,EAAU6O,EACVtP,EAAmBqP,GAGb5E,EAGT,OAAOqE,GACN/J,GAAciK,GACdA,EAGFjP,EAAU0D,GAAO1D,QAAU,SAAUvL,EAAU+a,GAC9C,GAAI1W,GACH+V,KACAD,KACA9B,EAAShM,EAAerM,EAAW,IAEpC,KAAMqY,EAAS,CAER0C,IACLA,EAAQrL,GAAU1P,IAEnBqE,EAAI0W,EAAM3Y,MACV,OAAQiC,IACPgU,EAASuB,GAAmBmB,EAAM1W,IAC7BgU,EAAQ/S,GACZ8U,EAAY/a,KAAMgZ,GAElB8B,EAAgB9a,KAAMgZ,EAKxBA,GAAShM,EAAerM,EAAUka,GAA0BC,EAAiBC,IAE9E,MAAO/B,GAGR,SAASoB,IAAkBzZ,EAAUgb,EAAU3R,GAC9C,GAAIhF,GAAI,EACPC,EAAM0W,EAAS5Y,MAChB,MAAYkC,EAAJD,EAASA,IAChB4K,GAAQjP,EAAUgb,EAAS3W,GAAIgF,EAEhC,OAAOA,GAGR,QAAS6G,IAAQlQ,EAAUC,EAASoJ,EAAS6F,GAC5C,GAAI7K,GAAG6T,EAAQ+C,EAAO1Z,EAAMe,EAC3BN,EAAQ0N,GAAU1P,EAEnB,KAAMkP,GAEiB,IAAjBlN,EAAMI,OAAe,CAIzB,GADA8V,EAASlW,EAAM,GAAKA,EAAM,GAAGzC,MAAO,GAC/B2Y,EAAO9V,OAAS,GAAkC,QAA5B6Y,EAAQ/C,EAAO,IAAI3W,MAC5CwF,EAAQmL,SAAgC,IAArBjS,EAAQwC,UAAkBkJ,GAC7CP,EAAKgJ,SAAU8D,EAAO,GAAG3W,MAAS,CAGnC,GADAtB,GAAYmL,EAAK9I,KAAS,GAAG2Y,EAAMnP,QAAQ,GAAGrG,QAAQgJ,GAAWC,IAAYzO,QAAkB,IACzFA,EACL,MAAOoJ,EAERrJ,GAAWA,EAAST,MAAO2Y,EAAO5H,QAAQrH,MAAM7G,QAIjDiC,EAAIuJ,EAAwB,aAAEjL,KAAM3C,GAAa,EAAIkY,EAAO9V,MAC5D,OAAQiC,IAAM,CAIb,GAHA4W,EAAQ/C,EAAO7T,GAGV+G,EAAKgJ,SAAW7S,EAAO0Z,EAAM1Z,MACjC,KAED,KAAMe,EAAO8I,EAAK9I,KAAMf,MAEjB2N,EAAO5M,EACZ2Y,EAAMnP,QAAQ,GAAGrG,QAASgJ,GAAWC,IACrClB,EAAS7K,KAAMuV,EAAO,GAAG3W,OAAUtB,EAAQ+C,YAAc/C,IACrD,CAKJ,GAFAiY,EAAOvT,OAAQN,EAAG,GAClBrE,EAAWkP,EAAK9M,QAAUyN,GAAYqI,IAChClY,EAEL,MADAX,GAAK2E,MAAOqF,EAAS6F,GACd7F,CAGR,SAgBL,MAPAkC,GAASvL,EAAUgC,GAClBkN,EACAjP,GACC0L,EACDtC,EACAmE,EAAS7K,KAAM3C,IAETqJ,EAMRtC,EAAQgN,WAAazO,EAAQ4F,MAAM,IAAIxG,KAAM6H,GAAYuD,KAAK,MAAQxK,EAItEyB,EAAQ+M,iBAAmBxH,EAG3BZ,IAIA3E,EAAQoM,aAAe3C,GAAO,SAAU0K,GAEvC,MAAuE,GAAhEA,EAAKnI,wBAAyBvU,EAASiJ,cAAc,UAMvD+I,GAAO,SAAUC,GAEtB,MADAA,GAAIuB,UAAY,mBAC+B,MAAxCvB,EAAIwB,WAAWtC,aAAa,WAEnCgB,GAAW,yBAA0B,SAAU1O,EAAM+C,EAAMsG,GAC1D,MAAMA,GAAN,EACQrJ,EAAK0N,aAAc3K,EAA6B,SAAvBA,EAAKgE,cAA2B,EAAI,KAOjEjC,EAAQoG,YAAeqD,GAAO,SAAUC,GAG7C,MAFAA,GAAIuB,UAAY,WAChBvB,EAAIwB,WAAWrC,aAAc,QAAS,IACY,KAA3Ca,EAAIwB,WAAWtC,aAAc,YAEpCgB,GAAW,QAAS,SAAU1O,EAAM+C,EAAMsG,GACzC,MAAMA,IAAyC,UAAhCrJ,EAAK8G,SAASC,cAA7B,EACQ/G,EAAKkZ,eAOT3K,GAAO,SAAUC,GACtB,MAAuC,OAAhCA,EAAId,aAAa,eAExBgB,GAAW5D,EAAU,SAAU9K,EAAM+C,EAAMsG,GAC1C,GAAIoI,EACJ,OAAMpI,GAAN,GACSoI,EAAMzR,EAAKqQ,iBAAkBtN,KAAW0O,EAAIC,UACnDD,EAAIzK,MACJhH,EAAM+C,MAAW,EAAOA,EAAKgE,cAAgB,OAKjDpK,EAAO0D,KAAO2M,GACdrQ,EAAO4U,KAAOvE,GAAOiF,UACrBtV,EAAO4U,KAAK,KAAO5U,EAAO4U,KAAKpG,QAC/BxO,EAAOwc,OAASnM,GAAO2E,WACvBhV,EAAOuK,KAAO8F,GAAO5D,QACrBzM,EAAOyc,SAAWpM,GAAO3D,MACzB1M,EAAOmN,SAAWkD,GAAOlD,UAGrB7N,EAEJ,IAAIod,KAGJ,SAASC,GAAetW,GACvB,GAAIuW,GAASF,EAAcrW,KAI3B,OAHArG,GAAO+E,KAAMsB,EAAQjD,MAAO1B,OAAwB,SAAUqO,EAAG8M,GAChED,EAAQC,IAAS,IAEXD,EAyBR5c,EAAO8c,UAAY,SAAUzW,GAI5BA,EAA6B,gBAAZA,GACdqW,EAAcrW,IAAasW,EAAetW,GAC5CrG,EAAOgG,UAAYK,EAEpB,IACC0W,GAEAC,EAEAC,EAEAC,EAEAC,EAEAC,EAEAC,KAEAC,GAASjX,EAAQkX,SAEjBC,EAAO,SAAU/U,GAOhB,IANAuU,EAAS3W,EAAQ2W,QAAUvU,EAC3BwU,GAAQ,EACRE,EAAcC,GAAe,EAC7BA,EAAc,EACdF,EAAeG,EAAK7Z,OACpBuZ,GAAS,EACDM,GAAsBH,EAAdC,EAA4BA,IAC3C,GAAKE,EAAMF,GAAc/X,MAAOqD,EAAM,GAAKA,EAAM,OAAU,GAASpC,EAAQoX,YAAc,CACzFT,GAAS,CACT,OAGFD,GAAS,EACJM,IACCC,EACCA,EAAM9Z,QACVga,EAAMF,EAAM5L,SAEFsL,EACXK,KAEAK,EAAKC,YAKRD,GAECE,IAAK,WACJ,GAAKP,EAAO,CAEX,GAAIzG,GAAQyG,EAAK7Z,QACjB,QAAUoa,GAAK3Y,GACdjF,EAAO+E,KAAME,EAAM,SAAU8K,EAAG7E,GAC/B,GAAIvI,GAAO3C,EAAO2C,KAAMuI,EACV,cAATvI,EACE0D,EAAQmW,QAAWkB,EAAKpG,IAAKpM,IAClCmS,EAAK5c,KAAMyK,GAEDA,GAAOA,EAAI1H,QAAmB,WAATb,GAEhCib,EAAK1S,OAGJ7F,WAGC0X,EACJG,EAAeG,EAAK7Z,OAGTwZ,IACXI,EAAcxG,EACd4G,EAAMR,IAGR,MAAO1Z,OAGRyF,OAAQ,WAkBP,MAjBKsU,IACJrd,EAAO+E,KAAMM,UAAW,SAAU0K,EAAG7E,GACpC,GAAI2S,EACJ,QAASA,EAAQ7d,EAAO2K,QAASO,EAAKmS,EAAMQ,IAAY,GACvDR,EAAKtX,OAAQ8X,EAAO,GAEfd,IACUG,GAATW,GACJX,IAEaC,GAATU,GACJV,OAME7Z,MAIRgU,IAAK,SAAUhW,GACd,MAAOA,GAAKtB,EAAO2K,QAASrJ,EAAI+b,GAAS,MAASA,IAAQA,EAAK7Z,SAGhE8U,MAAO,WAGN,MAFA+E,MACAH,EAAe,EACR5Z,MAGRqa,QAAS,WAER,MADAN,GAAOC,EAAQN,EAASzd,EACjB+D,MAGR4U,SAAU,WACT,OAAQmF,GAGTS,KAAM,WAKL,MAJAR,GAAQ/d,EACFyd,GACLU,EAAKC,UAECra,MAGRya,OAAQ,WACP,OAAQT,GAGTU,SAAU,SAAU3c,EAAS4D,GAU5B,OATKoY,GAAWJ,IAASK,IACxBrY,EAAOA,MACPA,GAAS5D,EAAS4D,EAAKtE,MAAQsE,EAAKtE,QAAUsE,GACzC8X,EACJO,EAAM7c,KAAMwE,GAEZuY,EAAMvY,IAGD3B,MAGRka,KAAM,WAEL,MADAE,GAAKM,SAAU1a,KAAM+B,WACd/B,MAGR2Z,MAAO,WACN,QAASA,GAIZ,OAAOS,IAER1d,EAAOgG,QAENgG,SAAU,SAAUiS,GACnB,GAAIC,KAEA,UAAW,OAAQle,EAAO8c,UAAU,eAAgB,aACpD,SAAU,OAAQ9c,EAAO8c,UAAU,eAAgB,aACnD,SAAU,WAAY9c,EAAO8c,UAAU,YAE1CqB,EAAQ,UACRjZ,GACCiZ,MAAO,WACN,MAAOA,IAERC,OAAQ,WAEP,MADAC,GAASlZ,KAAME,WAAYiZ,KAAMjZ,WAC1B/B,MAERib,KAAM,WACL,GAAIC,GAAMnZ,SACV,OAAOrF,GAAOgM,SAAS,SAAUyS,GAChCze,EAAO+E,KAAMmZ,EAAQ,SAAUzY,EAAGiZ,GACjC,GAAIC,GAASD,EAAO,GACnBpd,EAAKtB,EAAOiE,WAAYua,EAAK/Y,KAAS+Y,EAAK/Y,EAE5C4Y,GAAUK,EAAM,IAAK,WACpB,GAAIE,GAAWtd,GAAMA,EAAG8D,MAAO9B,KAAM+B,UAChCuZ,IAAY5e,EAAOiE,WAAY2a,EAAS1Z,SAC5C0Z,EAAS1Z,UACPC,KAAMsZ,EAASI,SACfP,KAAMG,EAASK,QACfC,SAAUN,EAASO,QAErBP,EAAUE,EAAS,QAAUrb,OAAS4B,EAAUuZ,EAASvZ,UAAY5B,KAAMhC,GAAOsd,GAAavZ,eAIlGmZ,EAAM,OACJtZ,WAIJA,QAAS,SAAUuC,GAClB,MAAc,OAAPA,EAAczH,EAAOgG,OAAQyB,EAAKvC,GAAYA,IAGvDmZ,IAwCD,OArCAnZ,GAAQ+Z,KAAO/Z,EAAQqZ,KAGvBve,EAAO+E,KAAMmZ,EAAQ,SAAUzY,EAAGiZ,GACjC,GAAIrB,GAAOqB,EAAO,GACjBQ,EAAcR,EAAO,EAGtBxZ,GAASwZ,EAAM,IAAOrB,EAAKO,IAGtBsB,GACJ7B,EAAKO,IAAI,WAERO,EAAQe,GAGNhB,EAAY,EAAJzY,GAAS,GAAIkY,QAASO,EAAQ,GAAK,GAAIJ,MAInDO,EAAUK,EAAM,IAAO,WAEtB,MADAL,GAAUK,EAAM,GAAK,QAAUpb,OAAS+a,EAAWnZ,EAAU5B,KAAM+B,WAC5D/B,MAER+a,EAAUK,EAAM,GAAK,QAAWrB,EAAKW,WAItC9Y,EAAQA,QAASmZ,GAGZJ,GACJA,EAAKzZ,KAAM6Z,EAAUA,GAIfA,GAIRc,KAAM,SAAUC,GACf,GAAI3Z,GAAI,EACP4Z,EAAgB3e,EAAW8D,KAAMa,WACjC7B,EAAS6b,EAAc7b,OAGvB8b,EAAuB,IAAX9b,GAAkB4b,GAAepf,EAAOiE,WAAYmb,EAAYla,SAAc1B,EAAS,EAGnG6a,EAAyB,IAAdiB,EAAkBF,EAAcpf,EAAOgM,WAGlDuT,EAAa,SAAU9Z,EAAG2W,EAAUoD,GACnC,MAAO,UAAUnV,GAChB+R,EAAU3W,GAAMnC,KAChBkc,EAAQ/Z,GAAMJ,UAAU7B,OAAS,EAAI9C,EAAW8D,KAAMa,WAAcgF,EAChEmV,IAAWC,EACdpB,EAASqB,WAAYtD,EAAUoD,KACfF,GAChBjB,EAAS/W,YAAa8U,EAAUoD,KAKnCC,EAAgBE,EAAkBC,CAGnC,IAAKpc,EAAS,EAIb,IAHAic,EAAqB/X,MAAOlE,GAC5Bmc,EAAuBjY,MAAOlE,GAC9Boc,EAAsBlY,MAAOlE,GACjBA,EAAJiC,EAAYA,IACd4Z,EAAe5Z,IAAOzF,EAAOiE,WAAYob,EAAe5Z,GAAIP,SAChEma,EAAe5Z,GAAIP,UACjBC,KAAMoa,EAAY9Z,EAAGma,EAAiBP,IACtCf,KAAMD,EAASS,QACfC,SAAUQ,EAAY9Z,EAAGka,EAAkBF,MAE3CH,CAUL,OAJMA,IACLjB,EAAS/W,YAAasY,EAAiBP,GAGjChB,EAASnZ,aAGlBlF,EAAOmI,QAAU,SAAWA,GAE3B,GAAI9F,GAAKuL,EAAGgG,EAAOtC,EAAQuO,EAAUC,EAAKC,EAAWC,EAAava,EACjEoM,EAAMjS,EAASiJ,cAAc,MAS9B,IANAgJ,EAAIb,aAAc,YAAa,KAC/Ba,EAAIuB,UAAY,qEAGhB/Q,EAAMwP,EAAIhI,qBAAqB,SAC/B+D,EAAIiE,EAAIhI,qBAAqB,KAAM,IAC7B+D,IAAMA,EAAE7B,QAAU1J,EAAImB,OAC3B,MAAO2E,EAIRmJ,GAAS1R,EAASiJ,cAAc,UAChCiX,EAAMxO,EAAO4B,YAAatT,EAASiJ,cAAc,WACjD+K,EAAQ/B,EAAIhI,qBAAqB,SAAU,GAE3C+D,EAAE7B,MAAMkU,QAAU,gCAGlB9X,EAAQ+X,gBAAoC,MAAlBrO,EAAIoB,UAG9B9K,EAAQgY,kBAAgD,IAA5BtO,EAAIwB,WAAWxP,SAI3CsE,EAAQiY,OAASvO,EAAIhI,qBAAqB,SAASrG,OAInD2E,EAAQkY,gBAAkBxO,EAAIhI,qBAAqB,QAAQrG,OAI3D2E,EAAQ4D,MAAQ,MAAMhI,KAAM6J,EAAEmD,aAAa,UAI3C5I,EAAQmY,eAA4C,OAA3B1S,EAAEmD,aAAa,QAKxC5I,EAAQoY,QAAU,OAAOxc,KAAM6J,EAAE7B,MAAMwU,SAIvCpY,EAAQqY,WAAa5S,EAAE7B,MAAMyU,SAG7BrY,EAAQsY,UAAY7M,EAAMvJ,MAI1BlC,EAAQuY,YAAcZ,EAAI1H,SAG1BjQ,EAAQwY,UAAY/gB,EAASiJ,cAAc,QAAQ8X,QAInDxY,EAAQyY,WAA2E,kBAA9DhhB,EAASiJ,cAAc,OAAOgY,WAAW,GAAOC,UAGrE3Y,EAAQ4Y,wBAAyB,EACjC5Y,EAAQ6Y,kBAAmB,EAC3B7Y,EAAQ8Y,eAAgB,EACxB9Y,EAAQ+Y,eAAgB,EACxB/Y,EAAQgZ,cAAe,EACvBhZ,EAAQiZ,qBAAsB,EAC9BjZ,EAAQkZ,mBAAoB,EAG5BzN,EAAMuE,SAAU,EAChBhQ,EAAQmZ,eAAiB1N,EAAMiN,WAAW,GAAO1I,QAIjD7G,EAAO4G,UAAW,EAClB/P,EAAQoZ,aAAezB,EAAI5H,QAG3B,WACQrG,GAAI9N,KACV,MAAOmE,GACRC,EAAQ+Y,eAAgB,EAIzBtN,EAAQhU,EAASiJ,cAAc,SAC/B+K,EAAM5C,aAAc,QAAS,IAC7B7I,EAAQyL,MAA0C,KAAlCA,EAAM7C,aAAc,SAGpC6C,EAAMvJ,MAAQ,IACduJ,EAAM5C,aAAc,OAAQ,SAC5B7I,EAAQqZ,WAA6B,MAAhB5N,EAAMvJ,MAG3BuJ,EAAM5C,aAAc,UAAW,KAC/B4C,EAAM5C,aAAc,OAAQ,KAE5B6O,EAAWjgB,EAAS6hB,yBACpB5B,EAAS3M,YAAaU,GAItBzL,EAAQuZ,cAAgB9N,EAAMuE,QAG9BhQ,EAAQwZ,WAAa9B,EAASgB,WAAW,GAAOA,WAAW,GAAO/J,UAAUqB,QAKvEtG,EAAI5F,cACR4F,EAAI5F,YAAa,UAAW,WAC3B9D,EAAQgZ,cAAe,IAGxBtP,EAAIgP,WAAW,GAAOe,QAKvB,KAAMnc,KAAOyT,QAAQ,EAAM2I,QAAQ,EAAMC,SAAS,GACjDjQ,EAAIb,aAAc+O,EAAY,KAAOta,EAAG,KAExC0C,EAAS1C,EAAI,WAAcsa,IAAazgB,IAAUuS,EAAItD,WAAYwR,GAAYrZ,WAAY,CAG3FmL,GAAI9F,MAAMgW,eAAiB,cAC3BlQ,EAAIgP,WAAW,GAAO9U,MAAMgW,eAAiB,GAC7C5Z,EAAQ6Z,gBAA+C,gBAA7BnQ,EAAI9F,MAAMgW,cAIpC,KAAMtc,IAAKzF,GAAQmI,GAClB,KAoGD,OAlGAA,GAAQC,QAAgB,MAAN3C,EAGlBzF,EAAO,WACN,GAAIiiB,GAAWC,EAAWC,EACzBC,EAAW,+HACXhb,EAAOxH,EAASiK,qBAAqB,QAAQ,EAExCzC,KAKN6a,EAAYriB,EAASiJ,cAAc,OACnCoZ,EAAUlW,MAAMkU,QAAU,gFAE1B7Y,EAAK8L,YAAa+O,GAAY/O,YAAarB,GAS3CA,EAAIuB,UAAY,8CAChB+O,EAAMtQ,EAAIhI,qBAAqB,MAC/BsY,EAAK,GAAIpW,MAAMkU,QAAU,2CACzBD,EAA0C,IAA1BmC,EAAK,GAAIE,aAEzBF,EAAK,GAAIpW,MAAMuW,QAAU,GACzBH,EAAK,GAAIpW,MAAMuW,QAAU,OAIzBna,EAAQoa,sBAAwBvC,GAA2C,IAA1BmC,EAAK,GAAIE,aAG1DxQ,EAAIuB,UAAY,GAChBvB,EAAI9F,MAAMkU,QAAU,wKAIpBjgB,EAAO6L,KAAMzE,EAAyB,MAAnBA,EAAK2E,MAAMyW,MAAiBA,KAAM,MAAU,WAC9Dra,EAAQsa,UAAgC,IAApB5Q,EAAI6Q,cAIpBpjB,EAAOqjB,mBACXxa,EAAQ8Y,cAAuE,QAArD3hB,EAAOqjB,iBAAkB9Q,EAAK,WAAe3F,IACvE/D,EAAQkZ,kBAA2F,SAArE/hB,EAAOqjB,iBAAkB9Q,EAAK,QAAY+Q,MAAO,QAAUA,MAMzFV,EAAYrQ,EAAIqB,YAAatT,EAASiJ,cAAc,QACpDqZ,EAAUnW,MAAMkU,QAAUpO,EAAI9F,MAAMkU,QAAUmC,EAC9CF,EAAUnW,MAAM8W,YAAcX,EAAUnW,MAAM6W,MAAQ,IACtD/Q,EAAI9F,MAAM6W,MAAQ,MAElBza,EAAQiZ,qBACNtZ,YAAcxI,EAAOqjB,iBAAkBT,EAAW,WAAeW,oBAGxDhR,GAAI9F,MAAMyW,OAAS9iB,IAK9BmS,EAAIuB,UAAY,GAChBvB,EAAI9F,MAAMkU,QAAUmC,EAAW,8CAC/Bja,EAAQ4Y,uBAA+C,IAApBlP,EAAI6Q,YAIvC7Q,EAAI9F,MAAMuW,QAAU,QACpBzQ,EAAIuB,UAAY,cAChBvB,EAAIwB,WAAWtH,MAAM6W,MAAQ,MAC7Bza,EAAQ6Y,iBAAyC,IAApBnP,EAAI6Q,YAE5Bva,EAAQ4Y,yBAIZ3Z,EAAK2E,MAAMyW,KAAO,IAIpBpb,EAAK0K,YAAamQ,GAGlBA,EAAYpQ,EAAMsQ,EAAMD,EAAY,QAIrC7f,EAAMiP,EAASuO,EAAWC,EAAMlS,EAAIgG,EAAQ,KAErCzL;KAGR,IAAI2a,GAAS,+BACZC,EAAa,UAEd,SAASC,GAAc3f,EAAM+C,EAAMqC,EAAMwa,GACxC,GAAMjjB,EAAOkjB,WAAY7f,GAAzB,CAIA,GAAIwB,GAAKse,EACRC,EAAcpjB,EAAO0G,QAIrB2c,EAAShgB,EAAKQ,SAId2N,EAAQ6R,EAASrjB,EAAOwR,MAAQnO,EAIhCgB,EAAKgf,EAAShgB,EAAM+f,GAAgB/f,EAAM+f,IAAiBA,CAI5D,IAAO/e,GAAOmN,EAAMnN,KAAS4e,GAAQzR,EAAMnN,GAAIoE,OAAUA,IAASlJ,GAA6B,gBAAT6G,GAgEtF,MA5DM/B,KAIJA,EADIgf,EACChgB,EAAM+f,GAAgBhjB,EAAgB6N,OAASjO,EAAOmL,OAEtDiY,GAID5R,EAAOnN,KAGZmN,EAAOnN,GAAOgf,MAAgBC,OAAQtjB,EAAO8J,QAKzB,gBAAT1D,IAAqC,kBAATA,MAClC6c,EACJzR,EAAOnN,GAAOrE,EAAOgG,OAAQwL,EAAOnN,GAAM+B,GAE1CoL,EAAOnN,GAAKoE,KAAOzI,EAAOgG,OAAQwL,EAAOnN,GAAKoE,KAAMrC,IAItD+c,EAAY3R,EAAOnN,GAKb4e,IACCE,EAAU1a,OACf0a,EAAU1a,SAGX0a,EAAYA,EAAU1a,MAGlBA,IAASlJ,IACb4jB,EAAWnjB,EAAOiK,UAAW7D,IAAWqC,GAKpB,gBAATrC,IAGXvB,EAAMse,EAAW/c,GAGL,MAAPvB,IAGJA,EAAMse,EAAWnjB,EAAOiK,UAAW7D,MAGpCvB,EAAMse,EAGAte,GAGR,QAAS0e,GAAoBlgB,EAAM+C,EAAM6c,GACxC,GAAMjjB,EAAOkjB,WAAY7f,GAAzB,CAIA,GAAI8f,GAAW1d,EACd4d,EAAShgB,EAAKQ,SAGd2N,EAAQ6R,EAASrjB,EAAOwR,MAAQnO,EAChCgB,EAAKgf,EAAShgB,EAAMrD,EAAO0G,SAAY1G,EAAO0G,OAI/C,IAAM8K,EAAOnN,GAAb,CAIA,GAAK+B,IAEJ+c,EAAYF,EAAMzR,EAAOnN,GAAOmN,EAAOnN,GAAKoE,MAE3B,CAGVzI,EAAOyG,QAASL,GAsBrBA,EAAOA,EAAK7F,OAAQP,EAAO4F,IAAKQ,EAAMpG,EAAOiK,YAnBxC7D,IAAQ+c,GACZ/c,GAASA,IAITA,EAAOpG,EAAOiK,UAAW7D,GAExBA,EADIA,IAAQ+c,IACH/c,GAEFA,EAAKkG,MAAM,MAarB7G,EAAIW,EAAK5C,MACT,OAAQiC,UACA0d,GAAW/c,EAAKX,GAKxB,IAAKwd,GAAOO,EAAkBL,IAAcnjB,EAAOqI,cAAc8a,GAChE,QAMGF,UACEzR,GAAOnN,GAAKoE,KAIb+a,EAAmBhS,EAAOnN,QAM5Bgf,EACJrjB,EAAOyjB,WAAapgB,IAAQ,GAIjBrD,EAAOmI,QAAQ+Y,eAAiB1P,GAASA,EAAMlS,aAEnDkS,GAAOnN,GAIdmN,EAAOnN,GAAO,QAIhBrE,EAAOgG,QACNwL,SAIAkS,QACCC,QAAU,EACVC,OAAS,EAEThH,OAAU,8CAGXiH,QAAS,SAAUxgB,GAElB,MADAA,GAAOA,EAAKQ,SAAW7D,EAAOwR,MAAOnO,EAAKrD,EAAO0G,UAAarD,EAAMrD,EAAO0G,WAClErD,IAASmgB,EAAmBngB,IAGtCoF,KAAM,SAAUpF,EAAM+C,EAAMqC,GAC3B,MAAOua,GAAc3f,EAAM+C,EAAMqC,IAGlCqb,WAAY,SAAUzgB,EAAM+C,GAC3B,MAAOmd,GAAoBlgB,EAAM+C,IAIlC2d,MAAO,SAAU1gB,EAAM+C,EAAMqC,GAC5B,MAAOua,GAAc3f,EAAM+C,EAAMqC,GAAM,IAGxCub,YAAa,SAAU3gB,EAAM+C,GAC5B,MAAOmd,GAAoBlgB,EAAM+C,GAAM,IAIxC8c,WAAY,SAAU7f,GAErB,GAAKA,EAAKQ,UAA8B,IAAlBR,EAAKQ,UAAoC,IAAlBR,EAAKQ,SACjD,OAAO,CAGR,IAAI6f,GAASrgB,EAAK8G,UAAYnK,EAAO0jB,OAAQrgB,EAAK8G,SAASC,cAG3D,QAAQsZ,GAAUA,KAAW,GAAQrgB,EAAK0N,aAAa,aAAe2S,KAIxE1jB,EAAOsB,GAAG0E,QACTyC,KAAM,SAAUR,EAAKoC,GACpB,GAAI2H,GAAO5L,EACVqC,EAAO,KACPhD,EAAI,EACJpC,EAAOC,KAAK,EAMb,IAAK2E,IAAQ1I,EAAY,CACxB,GAAK+D,KAAKE,SACTiF,EAAOzI,EAAOyI,KAAMpF,GAEG,IAAlBA,EAAKQ,WAAmB7D,EAAO+jB,MAAO1gB,EAAM,gBAAkB,CAElE,IADA2O,EAAQ3O,EAAKkL,WACDyD,EAAMxO,OAAViC,EAAkBA,IACzBW,EAAO4L,EAAMvM,GAAGW,KAEe,IAA1BA,EAAKvF,QAAQ,WACjBuF,EAAOpG,EAAOiK,UAAW7D,EAAKzF,MAAM,IAEpCsjB,EAAU5gB,EAAM+C,EAAMqC,EAAMrC,IAG9BpG,GAAO+jB,MAAO1gB,EAAM,eAAe,GAIrC,MAAOoF,GAIR,MAAoB,gBAARR,GACJ3E,KAAKyB,KAAK,WAChB/E,EAAOyI,KAAMnF,KAAM2E,KAId5C,UAAU7B,OAAS,EAGzBF,KAAKyB,KAAK,WACT/E,EAAOyI,KAAMnF,KAAM2E,EAAKoC,KAKzBhH,EAAO4gB,EAAU5gB,EAAM4E,EAAKjI,EAAOyI,KAAMpF,EAAM4E,IAAU,MAG3D6b,WAAY,SAAU7b,GACrB,MAAO3E,MAAKyB,KAAK,WAChB/E,EAAO8jB,WAAYxgB,KAAM2E,OAK5B,SAASgc,GAAU5gB,EAAM4E,EAAKQ,GAG7B,GAAKA,IAASlJ,GAA+B,IAAlB8D,EAAKQ,SAAiB,CAEhD,GAAIuC,GAAO,QAAU6B,EAAIpB,QAASkc,EAAY,OAAQ3Y,aAItD,IAFA3B,EAAOpF,EAAK0N,aAAc3K,GAEL,gBAATqC,GAAoB,CAC/B,IACCA,EAAgB,SAATA,GAAkB,EACf,UAATA,GAAmB,EACV,SAATA,EAAkB,MAEjBA,EAAO,KAAOA,GAAQA,EACvBqa,EAAO/e,KAAM0E,GAASzI,EAAOiJ,UAAWR,GACvCA,EACD,MAAOP,IAGTlI,EAAOyI,KAAMpF,EAAM4E,EAAKQ,OAGxBA,GAAOlJ,EAIT,MAAOkJ,GAIR,QAAS+a,GAAmB/b,GAC3B,GAAIrB,EACJ,KAAMA,IAAQqB,GAGb,IAAc,SAATrB,IAAmBpG,EAAOqI,cAAeZ,EAAIrB,MAGpC,WAATA,EACJ,OAAO,CAIT,QAAO,EAERpG,EAAOgG,QACNke,MAAO,SAAU7gB,EAAMV,EAAM8F,GAC5B,GAAIyb,EAEJ,OAAK7gB,IACJV,GAASA,GAAQ,MAAS,QAC1BuhB,EAAQlkB,EAAO+jB,MAAO1gB,EAAMV,GAGvB8F,KACEyb,GAASlkB,EAAOyG,QAAQgC,GAC7Byb,EAAQlkB,EAAO+jB,MAAO1gB,EAAMV,EAAM3C,EAAOsE,UAAUmE,IAEnDyb,EAAMzjB,KAAMgI,IAGPyb,OAZR,GAgBDC,QAAS,SAAU9gB,EAAMV,GACxBA,EAAOA,GAAQ,IAEf,IAAIuhB,GAAQlkB,EAAOkkB,MAAO7gB,EAAMV,GAC/ByhB,EAAcF,EAAM1gB,OACpBlC,EAAK4iB,EAAMxS,QACX2S,EAAQrkB,EAAOskB,YAAajhB,EAAMV,GAClC4hB,EAAO,WACNvkB,EAAOmkB,QAAS9gB,EAAMV,GAIZ,gBAAPrB,IACJA,EAAK4iB,EAAMxS,QACX0S,KAGI9iB,IAIU,OAATqB,GACJuhB,EAAMvP,QAAS,oBAIT0P,GAAMG,KACbljB,EAAGkD,KAAMnB,EAAMkhB,EAAMF,KAGhBD,GAAeC,GACpBA,EAAM/L,MAAMkF,QAKd8G,YAAa,SAAUjhB,EAAMV,GAC5B,GAAIsF,GAAMtF,EAAO,YACjB,OAAO3C,GAAO+jB,MAAO1gB,EAAM4E,IAASjI,EAAO+jB,MAAO1gB,EAAM4E,GACvDqQ,MAAOtY,EAAO8c,UAAU,eAAec,IAAI,WAC1C5d,EAAOgkB,YAAa3gB,EAAMV,EAAO,SACjC3C,EAAOgkB,YAAa3gB,EAAM4E,UAM9BjI,EAAOsB,GAAG0E,QACTke,MAAO,SAAUvhB,EAAM8F,GACtB,GAAIgc,GAAS,CAQb,OANqB,gBAAT9hB,KACX8F,EAAO9F,EACPA,EAAO,KACP8hB,KAGuBA,EAAnBpf,UAAU7B,OACPxD,EAAOkkB,MAAO5gB,KAAK,GAAIX,GAGxB8F,IAASlJ,EACf+D,KACAA,KAAKyB,KAAK,WACT,GAAImf,GAAQlkB,EAAOkkB,MAAO5gB,KAAMX,EAAM8F,EAGtCzI,GAAOskB,YAAahhB,KAAMX,GAEZ,OAATA,GAA8B,eAAbuhB,EAAM,IAC3BlkB,EAAOmkB,QAAS7gB,KAAMX,MAI1BwhB,QAAS,SAAUxhB,GAClB,MAAOW,MAAKyB,KAAK,WAChB/E,EAAOmkB,QAAS7gB,KAAMX,MAKxB+hB,MAAO,SAAUC,EAAMhiB,GAItB,MAHAgiB,GAAO3kB,EAAO4kB,GAAK5kB,EAAO4kB,GAAGC,OAAQF,IAAUA,EAAOA,EACtDhiB,EAAOA,GAAQ,KAERW,KAAK4gB,MAAOvhB,EAAM,SAAU4hB,EAAMF,GACxC,GAAIS,GAAUzd,WAAYkd,EAAMI,EAChCN,GAAMG,KAAO,WACZO,aAAcD,OAIjBE,WAAY,SAAUriB,GACrB,MAAOW,MAAK4gB,MAAOvhB,GAAQ,UAI5BuC,QAAS,SAAUvC,EAAM8E,GACxB,GAAI8B,GACH0b,EAAQ,EACRC,EAAQllB,EAAOgM,WACf6I,EAAWvR,KACXmC,EAAInC,KAAKE,OACTqb,EAAU,aACCoG,GACTC,EAAM5d,YAAauN,GAAYA,IAIb,iBAATlS,KACX8E,EAAM9E,EACNA,EAAOpD,GAERoD,EAAOA,GAAQ,IAEf,OAAO8C,IACN8D,EAAMvJ,EAAO+jB,MAAOlP,EAAUpP,GAAK9C,EAAO,cACrC4G,GAAOA,EAAI+O,QACf2M,IACA1b,EAAI+O,MAAMsF,IAAKiB,GAIjB,OADAA,KACOqG,EAAMhgB,QAASuC,KAGxB,IAAI0d,GAAUC,EACbC,EAAS,cACTC,EAAU,MACVC,EAAa,6CACbC,EAAa,gBACbC,EAAc,0BACdvF,EAAkBlgB,EAAOmI,QAAQ+X,gBACjCwF,EAAc1lB,EAAOmI,QAAQyL,KAE9B5T,GAAOsB,GAAG0E,QACT9B,KAAM,SAAUkC,EAAMiE,GACrB,MAAOrK,GAAOqL,OAAQ/H,KAAMtD,EAAOkE,KAAMkC,EAAMiE,EAAOhF,UAAU7B,OAAS,IAG1EmiB,WAAY,SAAUvf,GACrB,MAAO9C,MAAKyB,KAAK,WAChB/E,EAAO2lB,WAAYriB,KAAM8C,MAI3Bwf,KAAM,SAAUxf,EAAMiE,GACrB,MAAOrK,GAAOqL,OAAQ/H,KAAMtD,EAAO4lB,KAAMxf,EAAMiE,EAAOhF,UAAU7B,OAAS,IAG1EqiB,WAAY,SAAUzf,GAErB,MADAA,GAAOpG,EAAO8lB,QAAS1f,IAAUA,EAC1B9C,KAAKyB,KAAK,WAEhB,IACCzB,KAAM8C,GAAS7G,QACR+D,MAAM8C,GACZ,MAAO8B,QAIX6d,SAAU,SAAU1b,GACnB,GAAI2b,GAAS3iB,EAAM+O,EAAK6T,EAAOtgB,EAC9BF,EAAI,EACJC,EAAMpC,KAAKE,OACX0iB,EAA2B,gBAAV7b,IAAsBA,CAExC,IAAKrK,EAAOiE,WAAYoG,GACvB,MAAO/G,MAAKyB,KAAK,SAAUY,GAC1B3F,EAAQsD,MAAOyiB,SAAU1b,EAAM7F,KAAMlB,KAAMqC,EAAGrC,KAAK2P,aAIrD,IAAKiT,EAIJ,IAFAF,GAAY3b,GAAS,IAAKjH,MAAO1B,OAErBgE,EAAJD,EAASA,IAOhB,GANApC,EAAOC,KAAMmC,GACb2M,EAAwB,IAAlB/O,EAAKQ,WAAoBR,EAAK4P,WACjC,IAAM5P,EAAK4P,UAAY,KAAMpM,QAASwe,EAAQ,KAChD,KAGU,CACV1f,EAAI,CACJ,OAASsgB,EAAQD,EAAQrgB,KACgB,EAAnCyM,EAAIvR,QAAS,IAAMolB,EAAQ,OAC/B7T,GAAO6T,EAAQ,IAGjB5iB,GAAK4P,UAAYjT,EAAOmB,KAAMiR,GAMjC,MAAO9O,OAGR6iB,YAAa,SAAU9b,GACtB,GAAI2b,GAAS3iB,EAAM+O,EAAK6T,EAAOtgB,EAC9BF,EAAI,EACJC,EAAMpC,KAAKE,OACX0iB,EAA+B,IAArB7gB,UAAU7B,QAAiC,gBAAV6G,IAAsBA,CAElE,IAAKrK,EAAOiE,WAAYoG,GACvB,MAAO/G,MAAKyB,KAAK,SAAUY,GAC1B3F,EAAQsD,MAAO6iB,YAAa9b,EAAM7F,KAAMlB,KAAMqC,EAAGrC,KAAK2P,aAGxD,IAAKiT,EAGJ,IAFAF,GAAY3b,GAAS,IAAKjH,MAAO1B,OAErBgE,EAAJD,EAASA,IAQhB,GAPApC,EAAOC,KAAMmC,GAEb2M,EAAwB,IAAlB/O,EAAKQ,WAAoBR,EAAK4P,WACjC,IAAM5P,EAAK4P,UAAY,KAAMpM,QAASwe,EAAQ,KAChD,IAGU,CACV1f,EAAI,CACJ,OAASsgB,EAAQD,EAAQrgB,KAExB,MAAQyM,EAAIvR,QAAS,IAAMolB,EAAQ,MAAS,EAC3C7T,EAAMA,EAAIvL,QAAS,IAAMof,EAAQ,IAAK,IAGxC5iB,GAAK4P,UAAY5I,EAAQrK,EAAOmB,KAAMiR,GAAQ,GAKjD,MAAO9O,OAGR8iB,YAAa,SAAU/b,EAAOgc,GAC7B,GAAI1jB,SAAc0H,EAElB,OAAyB,iBAAbgc,IAAmC,WAAT1jB,EAC9B0jB,EAAW/iB,KAAKyiB,SAAU1b,GAAU/G,KAAK6iB,YAAa9b,GAGzDrK,EAAOiE,WAAYoG,GAChB/G,KAAKyB,KAAK,SAAUU,GAC1BzF,EAAQsD,MAAO8iB,YAAa/b,EAAM7F,KAAKlB,KAAMmC,EAAGnC,KAAK2P,UAAWoT,GAAWA,KAItE/iB,KAAKyB,KAAK,WAChB,GAAc,WAATpC,EAAoB,CAExB,GAAIsQ,GACHxN,EAAI,EACJiY,EAAO1d,EAAQsD,MACfgjB,EAAajc,EAAMjH,MAAO1B,MAE3B,OAASuR,EAAYqT,EAAY7gB,KAE3BiY,EAAK6I,SAAUtT,GACnByK,EAAKyI,YAAalT,GAElByK,EAAKqI,SAAU9S,QAKNtQ,IAASjD,GAA8B,YAATiD,KACpCW,KAAK2P,WAETjT,EAAO+jB,MAAOzgB,KAAM,gBAAiBA,KAAK2P,WAO3C3P,KAAK2P,UAAY3P,KAAK2P,WAAa5I,KAAU,EAAQ,GAAKrK,EAAO+jB,MAAOzgB,KAAM,kBAAqB,OAKtGijB,SAAU,SAAUnlB,GACnB,GAAI6R,GAAY,IAAM7R,EAAW,IAChCqE,EAAI,EACJqF,EAAIxH,KAAKE,MACV,MAAYsH,EAAJrF,EAAOA,IACd,GAA0B,IAArBnC,KAAKmC,GAAG5B,WAAmB,IAAMP,KAAKmC,GAAGwN,UAAY,KAAKpM,QAAQwe,EAAQ,KAAKxkB,QAASoS,IAAe,EAC3G,OAAO,CAIT,QAAO,GAGR6B,IAAK,SAAUzK,GACd,GAAIxF,GAAKwf,EAAOpgB,EACfZ,EAAOC,KAAK,EAEb,EAAA,GAAM+B,UAAU7B,OAsBhB,MAFAS,GAAajE,EAAOiE,WAAYoG,GAEzB/G,KAAKyB,KAAK,SAAUU,GAC1B,GAAIqP,EAEmB,KAAlBxR,KAAKO,WAKTiR,EADI7Q,EACEoG,EAAM7F,KAAMlB,KAAMmC,EAAGzF,EAAQsD,MAAOwR,OAEpCzK,EAIK,MAAPyK,EACJA,EAAM,GACoB,gBAARA,GAClBA,GAAO,GACI9U,EAAOyG,QAASqO,KAC3BA,EAAM9U,EAAO4F,IAAIkP,EAAK,SAAWzK,GAChC,MAAgB,OAATA,EAAgB,GAAKA,EAAQ,MAItCga,EAAQrkB,EAAOwmB,SAAUljB,KAAKX,OAAU3C,EAAOwmB,SAAUljB,KAAK6G,SAASC,eAGjEia,GAAW,OAASA,IAAUA,EAAMoC,IAAKnjB,KAAMwR,EAAK,WAAcvV,IACvE+D,KAAK+G,MAAQyK,KAjDd,IAAKzR,EAGJ,MAFAghB,GAAQrkB,EAAOwmB,SAAUnjB,EAAKV,OAAU3C,EAAOwmB,SAAUnjB,EAAK8G,SAASC,eAElEia,GAAS,OAASA,KAAUxf,EAAMwf,EAAM5f,IAAKpB,EAAM,YAAe9D,EAC/DsF,GAGRA,EAAMxB,EAAKgH,MAEW,gBAARxF,GAEbA,EAAIgC,QAAQye,EAAS,IAEd,MAAPzgB,EAAc,GAAKA,OA0CxB7E,EAAOgG,QACNwgB,UACCE,QACCjiB,IAAK,SAAUpB,GAEd,GAAIyR,GAAM9U,EAAO0D,KAAKQ,KAAMb,EAAM,QAClC,OAAc,OAAPyR,EACNA,EACAzR,EAAKkH,OAGR+G,QACC7M,IAAK,SAAUpB,GACd,GAAIgH,GAAOqc,EACVrgB,EAAUhD,EAAKgD,QACfwX,EAAQxa,EAAKgV,cACbsO,EAAoB,eAAdtjB,EAAKV,MAAiC,EAARkb,EACpC2B,EAASmH,EAAM,QACf/b,EAAM+b,EAAM9I,EAAQ,EAAIxX,EAAQ7C,OAChCiC,EAAY,EAARoY,EACHjT,EACA+b,EAAM9I,EAAQ,CAGhB,MAAYjT,EAAJnF,EAASA,IAIhB,GAHAihB,EAASrgB,EAASZ,MAGXihB,EAAOtO,UAAY3S,IAAMoY,IAE5B7d,EAAOmI,QAAQoZ,YAAemF,EAAOxO,SAA+C,OAApCwO,EAAO3V,aAAa,cACnE2V,EAAOtiB,WAAW8T,UAAalY,EAAOmK,SAAUuc,EAAOtiB,WAAY,aAAiB,CAMxF,GAHAiG,EAAQrK,EAAQ0mB,GAAS5R,MAGpB6R,EACJ,MAAOtc,EAIRmV,GAAO/e,KAAM4J,GAIf,MAAOmV,IAGRiH,IAAK,SAAUpjB,EAAMgH,GACpB,GAAIuc,GAAWF,EACdrgB,EAAUhD,EAAKgD,QACfmZ,EAASxf,EAAOsE,UAAW+F,GAC3B5E,EAAIY,EAAQ7C,MAEb,OAAQiC,IACPihB,EAASrgB,EAASZ,IACZihB,EAAOtO,SAAWpY,EAAO2K,QAAS3K,EAAO0mB,GAAQ5R,MAAO0K,IAAY,KACzEoH,GAAY,EAQd,OAHMA,KACLvjB,EAAKgV,cAAgB,IAEfmH,KAKVtb,KAAM,SAAUb,EAAM+C,EAAMiE,GAC3B,GAAIga,GAAOxf,EACVgiB,EAAQxjB,EAAKQ,QAGd,IAAMR,GAAkB,IAAVwjB,GAAyB,IAAVA,GAAyB,IAAVA,EAK5C,aAAYxjB,GAAK0N,eAAiBrR,EAC1BM,EAAO4lB,KAAMviB,EAAM+C,EAAMiE,IAKlB,IAAVwc,GAAgB7mB,EAAOyc,SAAUpZ,KACrC+C,EAAOA,EAAKgE,cACZia,EAAQrkB,EAAO8mB,UAAW1gB,KACvBpG,EAAO4U,KAAKxR,MAAMmM,KAAKxL,KAAMqC,GAASgf,EAAWD,IAGhD9a,IAAU9K,EAaH8kB,GAAS,OAASA,IAA6C,QAAnCxf,EAAMwf,EAAM5f,IAAKpB,EAAM+C,IACvDvB,GAGPA,EAAM7E,EAAO0D,KAAKQ,KAAMb,EAAM+C,GAGhB,MAAPvB,EACNtF,EACAsF,GApBc,OAAVwF,EAGOga,GAAS,OAASA,KAAUxf,EAAMwf,EAAMoC,IAAKpjB,EAAMgH,EAAOjE,MAAY7G,EAC1EsF,GAGPxB,EAAK2N,aAAc5K,EAAMiE,EAAQ,IAC1BA,IAPPrK,EAAO2lB,WAAYtiB,EAAM+C,GAAzBpG,KAuBH2lB,WAAY,SAAUtiB,EAAMgH,GAC3B,GAAIjE,GAAM2gB,EACTthB,EAAI,EACJuhB,EAAY3c,GAASA,EAAMjH,MAAO1B,EAEnC,IAAKslB,GAA+B,IAAlB3jB,EAAKQ,SACtB,MAASuC,EAAO4gB,EAAUvhB,KACzBshB,EAAW/mB,EAAO8lB,QAAS1f,IAAUA,EAGhCpG,EAAO4U,KAAKxR,MAAMmM,KAAKxL,KAAMqC,GAE5Bsf,GAAexF,IAAoBuF,EAAY1hB,KAAMqC,GACzD/C,EAAM0jB,IAAa,EAInB1jB,EAAMrD,EAAOiK,UAAW,WAAa7D,IACpC/C,EAAM0jB,IAAa,EAKrB/mB,EAAOkE,KAAMb,EAAM+C,EAAM,IAG1B/C,EAAKgO,gBAAiB6O,EAAkB9Z,EAAO2gB,IAKlDD,WACCnkB,MACC8jB,IAAK,SAAUpjB,EAAMgH,GACpB,IAAMrK,EAAOmI,QAAQqZ,YAAwB,UAAVnX,GAAqBrK,EAAOmK,SAAS9G,EAAM,SAAW,CAGxF,GAAIyR,GAAMzR,EAAKgH,KAKf,OAJAhH,GAAK2N,aAAc,OAAQ3G,GACtByK,IACJzR,EAAKgH,MAAQyK,GAEPzK,MAMXyb,SACCmB,MAAO,UACPC,QAAS,aAGVtB,KAAM,SAAUviB,EAAM+C,EAAMiE,GAC3B,GAAIxF,GAAKwf,EAAO8C,EACfN,EAAQxjB,EAAKQ,QAGd,IAAMR,GAAkB,IAAVwjB,GAAyB,IAAVA,GAAyB,IAAVA,EAY5C,MARAM,GAAmB,IAAVN,IAAgB7mB,EAAOyc,SAAUpZ,GAErC8jB,IAEJ/gB,EAAOpG,EAAO8lB,QAAS1f,IAAUA,EACjCie,EAAQrkB,EAAOonB,UAAWhhB,IAGtBiE,IAAU9K,EACP8kB,GAAS,OAASA,KAAUxf,EAAMwf,EAAMoC,IAAKpjB,EAAMgH,EAAOjE,MAAY7G,EAC5EsF,EACExB,EAAM+C,GAASiE,EAGXga,GAAS,OAASA,IAA6C,QAAnCxf,EAAMwf,EAAM5f,IAAKpB,EAAM+C,IACzDvB,EACAxB,EAAM+C,IAITghB,WACCpP,UACCvT,IAAK,SAAUpB,GAId,GAAIgkB,GAAWrnB,EAAO0D,KAAKQ,KAAMb,EAAM,WAEvC,OAAOgkB,GACNC,SAAUD,EAAU,IACpB9B,EAAWxhB,KAAMV,EAAK8G,WAAcqb,EAAWzhB,KAAMV,EAAK8G,WAAc9G,EAAK0U,KAC5E,EACA,QAONqN,GACCqB,IAAK,SAAUpjB,EAAMgH,EAAOjE,GAa3B,MAZKiE,MAAU,EAEdrK,EAAO2lB,WAAYtiB,EAAM+C,GACdsf,GAAexF,IAAoBuF,EAAY1hB,KAAMqC,GAEhE/C,EAAK2N,cAAekP,GAAmBlgB,EAAO8lB,QAAS1f,IAAUA,EAAMA,GAIvE/C,EAAMrD,EAAOiK,UAAW,WAAa7D,IAAW/C,EAAM+C,IAAS,EAGzDA,IAGTpG,EAAO+E,KAAM/E,EAAO4U,KAAKxR,MAAMmM,KAAK9N,OAAO2B,MAAO,QAAU,SAAUqC,EAAGW,GACxE,GAAImhB,GAASvnB,EAAO4U,KAAK1C,WAAY9L,IAAUpG,EAAO0D,KAAKQ,IAE3DlE,GAAO4U,KAAK1C,WAAY9L,GAASsf,GAAexF,IAAoBuF,EAAY1hB,KAAMqC,GACrF,SAAU/C,EAAM+C,EAAMsG,GACrB,GAAIpL,GAAKtB,EAAO4U,KAAK1C,WAAY9L,GAChCvB,EAAM6H,EACLnN,GAECS,EAAO4U,KAAK1C,WAAY9L,GAAS7G,IACjCgoB,EAAQlkB,EAAM+C,EAAMsG,GAEpBtG,EAAKgE,cACL,IAEH,OADApK,GAAO4U,KAAK1C,WAAY9L,GAAS9E,EAC1BuD,GAER,SAAUxB,EAAM+C,EAAMsG,GACrB,MAAOA,GACNnN,EACA8D,EAAMrD,EAAOiK,UAAW,WAAa7D,IACpCA,EAAKgE,cACL,QAKCsb,GAAgBxF,IACrBlgB,EAAO8mB,UAAUzc,OAChBoc,IAAK,SAAUpjB,EAAMgH,EAAOjE,GAC3B,MAAKpG,GAAOmK,SAAU9G,EAAM,UAE3BA,EAAKkZ,aAAelS,EAApBhH,GAGO8hB,GAAYA,EAASsB,IAAKpjB,EAAMgH,EAAOjE,MAO5C8Z,IAILiF,GACCsB,IAAK,SAAUpjB,EAAMgH,EAAOjE,GAE3B,GAAIvB,GAAMxB,EAAKqQ,iBAAkBtN,EAUjC,OATMvB,IACLxB,EAAKmkB,iBACH3iB,EAAMxB,EAAKS,cAAc2jB,gBAAiBrhB,IAI7CvB,EAAIwF,MAAQA,GAAS,GAGL,UAATjE,GAAoBiE,IAAUhH,EAAK0N,aAAc3K,GACvDiE,EACA9K,IAGHS,EAAO4U,KAAK1C,WAAW7N,GAAKrE,EAAO4U,KAAK1C,WAAW9L,KAAOpG,EAAO4U,KAAK1C,WAAWwV,OAEhF,SAAUrkB,EAAM+C,EAAMsG,GACrB,GAAI7H,EACJ,OAAO6H,GACNnN,GACCsF,EAAMxB,EAAKqQ,iBAAkBtN,KAAyB,KAAdvB,EAAIwF,MAC5CxF,EAAIwF,MACJ,MAEJrK,EAAOwmB,SAAShO,QACf/T,IAAK,SAAUpB,EAAM+C,GACpB,GAAIvB,GAAMxB,EAAKqQ,iBAAkBtN,EACjC,OAAOvB,IAAOA,EAAIkQ,UACjBlQ,EAAIwF,MACJ9K,GAEFknB,IAAKtB,EAASsB,KAKfzmB,EAAO8mB,UAAUa,iBAChBlB,IAAK,SAAUpjB,EAAMgH,EAAOjE,GAC3B+e,EAASsB,IAAKpjB,EAAgB,KAAVgH,GAAe,EAAQA,EAAOjE,KAMpDpG,EAAO+E,MAAO,QAAS,UAAY,SAAUU,EAAGW,GAC/CpG,EAAO8mB,UAAW1gB,IACjBqgB,IAAK,SAAUpjB,EAAMgH,GACpB,MAAe,KAAVA,GACJhH,EAAK2N,aAAc5K,EAAM,QAClBiE,GAFR,OAYErK,EAAOmI,QAAQmY,gBAEpBtgB,EAAO+E,MAAO,OAAQ,OAAS,SAAUU,EAAGW,GAC3CpG,EAAOonB,UAAWhhB,IACjB3B,IAAK,SAAUpB,GACd,MAAOA,GAAK0N,aAAc3K,EAAM,OAM9BpG,EAAOmI,QAAQ4D,QACpB/L,EAAO8mB,UAAU/a,OAChBtH,IAAK,SAAUpB,GAId,MAAOA,GAAK0I,MAAMkU,SAAW1gB,GAE9BknB,IAAK,SAAUpjB,EAAMgH,GACpB,MAAShH,GAAK0I,MAAMkU,QAAU5V,EAAQ,MAOnCrK,EAAOmI,QAAQuY,cACpB1gB,EAAOonB,UAAUhP,UAChB3T,IAAK,SAAUpB,GACd,GAAI0P,GAAS1P,EAAKe,UAUlB,OARK2O,KACJA,EAAOsF,cAGFtF,EAAO3O,YACX2O,EAAO3O,WAAWiU,eAGb,QAKVrY,EAAO+E,MACN,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACF/E,EAAO8lB,QAASxiB,KAAK8G,eAAkB9G,OAIlCtD,EAAOmI,QAAQwY,UACpB3gB,EAAO8lB,QAAQnF,QAAU,YAI1B3gB,EAAO+E,MAAO,QAAS,YAAc,WACpC/E,EAAOwmB,SAAUljB,OAChBmjB,IAAK,SAAUpjB,EAAMgH,GACpB,MAAKrK,GAAOyG,QAAS4D,GACXhH,EAAK8U,QAAUnY,EAAO2K,QAAS3K,EAAOqD,GAAMyR,MAAOzK,IAAW,EADxE,IAKIrK,EAAOmI,QAAQsY,UACpBzgB,EAAOwmB,SAAUljB,MAAOmB,IAAM,SAAUpB,GAGvC,MAAsC,QAA/BA,EAAK0N,aAAa,SAAoB,KAAO1N,EAAKgH,SAI5D,IAAIud,GAAa,+BAChBC,GAAY,OACZC,GAAc,+BACdC,GAAc,kCACdC,GAAiB,sBAElB,SAASC,MACR,OAAO,EAGR,QAASC,MACR,OAAO,EAGR,QAASC,MACR,IACC,MAAOvoB,GAASiY,cACf,MAAQuQ,KAOXpoB,EAAOyC,OAEN4lB,UAEAzK,IAAK,SAAUva,EAAMilB,EAAOrW,EAASxJ,EAAMrH,GAC1C,GAAImI,GAAKgf,EAAQC,EAAGC,EACnBC,EAASC,EAAaC,EACtBC,EAAUlmB,EAAMmmB,EAAYC,EAC5BC,EAAWhpB,EAAO+jB,MAAO1gB,EAG1B,IAAM2lB,EAAN,CAKK/W,EAAQA,UACZwW,EAAcxW,EACdA,EAAUwW,EAAYxW,QACtB7Q,EAAWqnB,EAAYrnB,UAIlB6Q,EAAQ9G,OACb8G,EAAQ9G,KAAOnL,EAAOmL,SAIhBod,EAASS,EAAST,UACxBA,EAASS,EAAST,YAEZI,EAAcK,EAASC,UAC7BN,EAAcK,EAASC,OAAS,SAAU/gB,GAGzC,aAAclI,KAAWN,GAAuBwI,GAAKlI,EAAOyC,MAAMymB,YAAchhB,EAAEvF,KAEjFpD,EADAS,EAAOyC,MAAM0mB,SAAS/jB,MAAOujB,EAAYtlB,KAAMgC,YAIjDsjB,EAAYtlB,KAAOA,GAIpBilB,GAAUA,GAAS,IAAKllB,MAAO1B,KAAqB,IACpD8mB,EAAIF,EAAM9kB,MACV,OAAQglB,IACPjf,EAAMye,GAAevkB,KAAM6kB,EAAME,QACjC7lB,EAAOomB,EAAWxf,EAAI,GACtBuf,GAAevf,EAAI,IAAM,IAAK+C,MAAO,KAAMxG,OAGrCnD,IAKN+lB,EAAU1oB,EAAOyC,MAAMimB,QAAS/lB,OAGhCA,GAASvB,EAAWsnB,EAAQU,aAAeV,EAAQW,WAAc1mB,EAGjE+lB,EAAU1oB,EAAOyC,MAAMimB,QAAS/lB,OAGhCimB,EAAY5oB,EAAOgG,QAClBrD,KAAMA,EACNomB,SAAUA,EACVtgB,KAAMA,EACNwJ,QAASA,EACT9G,KAAM8G,EAAQ9G,KACd/J,SAAUA,EACVoO,aAAcpO,GAAYpB,EAAO4U,KAAKxR,MAAMoM,aAAazL,KAAM3C,GAC/DkoB,UAAWR,EAAW5X,KAAK,MACzBuX,IAGII,EAAWN,EAAQ5lB,MACzBkmB,EAAWN,EAAQ5lB,MACnBkmB,EAASU,cAAgB,EAGnBb,EAAQc,OAASd,EAAQc,MAAMhlB,KAAMnB,EAAMoF,EAAMqgB,EAAYH,MAAkB,IAE/EtlB,EAAKX,iBACTW,EAAKX,iBAAkBC,EAAMgmB,GAAa,GAE/BtlB,EAAK4I,aAChB5I,EAAK4I,YAAa,KAAOtJ,EAAMgmB,KAK7BD,EAAQ9K,MACZ8K,EAAQ9K,IAAIpZ,KAAMnB,EAAMulB,GAElBA,EAAU3W,QAAQ9G,OACvByd,EAAU3W,QAAQ9G,KAAO8G,EAAQ9G,OAK9B/J,EACJynB,EAAS9iB,OAAQ8iB,EAASU,gBAAiB,EAAGX,GAE9CC,EAASpoB,KAAMmoB,GAIhB5oB,EAAOyC,MAAM4lB,OAAQ1lB,IAAS,EAI/BU,GAAO,OAIR0F,OAAQ,SAAU1F,EAAMilB,EAAOrW,EAAS7Q,EAAUqoB,GACjD,GAAI9jB,GAAGijB,EAAWrf,EACjBmgB,EAAWlB,EAAGD,EACdG,EAASG,EAAUlmB,EACnBmmB,EAAYC,EACZC,EAAWhpB,EAAO6jB,QAASxgB,IAAUrD,EAAO+jB,MAAO1gB,EAEpD,IAAM2lB,IAAcT,EAASS,EAAST,QAAtC,CAKAD,GAAUA,GAAS,IAAKllB,MAAO1B,KAAqB,IACpD8mB,EAAIF,EAAM9kB,MACV,OAAQglB,IAMP,GALAjf,EAAMye,GAAevkB,KAAM6kB,EAAME,QACjC7lB,EAAOomB,EAAWxf,EAAI,GACtBuf,GAAevf,EAAI,IAAM,IAAK+C,MAAO,KAAMxG,OAGrCnD,EAAN,CAOA+lB,EAAU1oB,EAAOyC,MAAMimB,QAAS/lB,OAChCA,GAASvB,EAAWsnB,EAAQU,aAAeV,EAAQW,WAAc1mB,EACjEkmB,EAAWN,EAAQ5lB,OACnB4G,EAAMA,EAAI,IAAUkF,OAAQ,UAAYqa,EAAW5X,KAAK,iBAAmB,WAG3EwY,EAAY/jB,EAAIkjB,EAASrlB,MACzB,OAAQmC,IACPijB,EAAYC,EAAUljB,IAEf8jB,GAAeV,IAAaH,EAAUG,UACzC9W,GAAWA,EAAQ9G,OAASyd,EAAUzd,MACtC5B,IAAOA,EAAIxF,KAAM6kB,EAAUU,YAC3BloB,GAAYA,IAAawnB,EAAUxnB,WAAyB,OAAbA,IAAqBwnB,EAAUxnB,YACjFynB,EAAS9iB,OAAQJ,EAAG,GAEfijB,EAAUxnB,UACdynB,EAASU,gBAELb,EAAQ3f,QACZ2f,EAAQ3f,OAAOvE,KAAMnB,EAAMulB,GAOzBc,KAAcb,EAASrlB,SACrBklB,EAAQiB,UAAYjB,EAAQiB,SAASnlB,KAAMnB,EAAMylB,EAAYE,EAASC,WAAa,GACxFjpB,EAAO4pB,YAAavmB,EAAMV,EAAMqmB,EAASC,cAGnCV,GAAQ5lB,QAtCf,KAAMA,IAAQ4lB,GACbvoB,EAAOyC,MAAMsG,OAAQ1F,EAAMV,EAAO2lB,EAAOE,GAAKvW,EAAS7Q,GAAU,EA0C/DpB,GAAOqI,cAAekgB,WACnBS,GAASC,OAIhBjpB,EAAOgkB,YAAa3gB,EAAM,aAI5BkE,QAAS,SAAU9E,EAAOgG,EAAMpF,EAAMwmB,GACrC,GAAIZ,GAAQa,EAAQ1X,EACnB2X,EAAYrB,EAASnf,EAAK9D,EAC1BukB,GAAc3mB,GAAQzD,GACtB+C,EAAO3B,EAAYwD,KAAM/B,EAAO,QAAWA,EAAME,KAAOF,EACxDqmB,EAAa9nB,EAAYwD,KAAM/B,EAAO,aAAgBA,EAAM6mB,UAAUhd,MAAM,OAK7E,IAHA8F,EAAM7I,EAAMlG,EAAOA,GAAQzD,EAGJ,IAAlByD,EAAKQ,UAAoC,IAAlBR,EAAKQ,WAK5BkkB,GAAYhkB,KAAMpB,EAAO3C,EAAOyC,MAAMymB,aAItCvmB,EAAK9B,QAAQ,MAAQ,IAEzBioB,EAAanmB,EAAK2J,MAAM,KACxB3J,EAAOmmB,EAAWpX,QAClBoX,EAAWhjB,QAEZgkB,EAA6B,EAApBnnB,EAAK9B,QAAQ,MAAY,KAAO8B,EAGzCF,EAAQA,EAAOzC,EAAO0G,SACrBjE,EACA,GAAIzC,GAAOiqB,MAAOtnB,EAAuB,gBAAVF,IAAsBA,GAGtDA,EAAMynB,UAAYL,EAAe,EAAI,EACrCpnB,EAAM6mB,UAAYR,EAAW5X,KAAK,KAClCzO,EAAM0nB,aAAe1nB,EAAM6mB,UACtB7a,OAAQ,UAAYqa,EAAW5X,KAAK,iBAAmB,WAC3D,KAGDzO,EAAM4T,OAAS9W,EACTkD,EAAM8D,SACX9D,EAAM8D,OAASlD,GAIhBoF,EAAe,MAARA,GACJhG,GACFzC,EAAOsE,UAAWmE,GAAQhG,IAG3BimB,EAAU1oB,EAAOyC,MAAMimB,QAAS/lB,OAC1BknB,IAAgBnB,EAAQnhB,SAAWmhB,EAAQnhB,QAAQnC,MAAO/B,EAAMoF,MAAW,GAAjF,CAMA,IAAMohB,IAAiBnB,EAAQ0B,WAAapqB,EAAO2H,SAAUtE,GAAS,CAMrE,IAJA0mB,EAAarB,EAAQU,cAAgBzmB,EAC/BolB,GAAYhkB,KAAMgmB,EAAapnB,KACpCyP,EAAMA,EAAIhO,YAEHgO,EAAKA,EAAMA,EAAIhO,WACtB4lB,EAAUvpB,KAAM2R,GAChB7I,EAAM6I,CAIF7I,MAASlG,EAAKS,eAAiBlE,IACnCoqB,EAAUvpB,KAAM8I,EAAIyJ,aAAezJ,EAAI8gB,cAAgB/qB,GAKzDmG,EAAI,CACJ,QAAS2M,EAAM4X,EAAUvkB,QAAUhD,EAAM6nB,uBAExC7nB,EAAME,KAAO8C,EAAI,EAChBskB,EACArB,EAAQW,UAAY1mB,EAGrBsmB,GAAWjpB,EAAO+jB,MAAO3R,EAAK,eAAoB3P,EAAME,OAAU3C,EAAO+jB,MAAO3R,EAAK,UAChF6W,GACJA,EAAO7jB,MAAOgN,EAAK3J,GAIpBwgB,EAASa,GAAU1X,EAAK0X,GACnBb,GAAUjpB,EAAOkjB,WAAY9Q,IAAS6W,EAAO7jB,OAAS6jB,EAAO7jB,MAAOgN,EAAK3J,MAAW,GACxFhG,EAAM8nB,gBAMR,IAHA9nB,EAAME,KAAOA,GAGPknB,IAAiBpnB,EAAM+nB,wBAErB9B,EAAQ+B,UAAY/B,EAAQ+B,SAASrlB,MAAO4kB,EAAU/b,MAAOxF,MAAW,IAC9EzI,EAAOkjB,WAAY7f,IAKdymB,GAAUzmB,EAAMV,KAAW3C,EAAO2H,SAAUtE,GAAS,CAGzDkG,EAAMlG,EAAMymB,GAEPvgB,IACJlG,EAAMymB,GAAW,MAIlB9pB,EAAOyC,MAAMymB,UAAYvmB,CACzB,KACCU,EAAMV,KACL,MAAQuF,IAIVlI,EAAOyC,MAAMymB,UAAY3pB,EAEpBgK,IACJlG,EAAMymB,GAAWvgB,GAMrB,MAAO9G,GAAM4T,SAGd8S,SAAU,SAAU1mB,GAGnBA,EAAQzC,EAAOyC,MAAMioB,IAAKjoB,EAE1B,IAAIgD,GAAGZ,EAAK+jB,EAAW1R,EAASvR,EAC/BglB,KACA1lB,EAAOvE,EAAW8D,KAAMa,WACxBwjB,GAAa7oB,EAAO+jB,MAAOzgB,KAAM,eAAoBb,EAAME,UAC3D+lB,EAAU1oB,EAAOyC,MAAMimB,QAASjmB,EAAME,SAOvC,IAJAsC,EAAK,GAAKxC,EACVA,EAAMmoB,eAAiBtnB,MAGlBolB,EAAQmC,aAAenC,EAAQmC,YAAYrmB,KAAMlB,KAAMb,MAAY,EAAxE,CAKAkoB,EAAe3qB,EAAOyC,MAAMomB,SAASrkB,KAAMlB,KAAMb,EAAOomB,GAGxDpjB,EAAI,CACJ,QAASyR,EAAUyT,EAAcllB,QAAWhD,EAAM6nB,uBAAyB,CAC1E7nB,EAAMqoB,cAAgB5T,EAAQ7T,KAE9BsC,EAAI,CACJ,QAASijB,EAAY1R,EAAQ2R,SAAUljB,QAAWlD,EAAMsoB,kCAIjDtoB,EAAM0nB,cAAgB1nB,EAAM0nB,aAAapmB,KAAM6kB,EAAUU,cAE9D7mB,EAAMmmB,UAAYA,EAClBnmB,EAAMgG,KAAOmgB,EAAUngB,KAEvB5D,IAAS7E,EAAOyC,MAAMimB,QAASE,EAAUG,eAAkBE,QAAUL,EAAU3W,SAC5E7M,MAAO8R,EAAQ7T,KAAM4B,GAEnBJ,IAAQtF,IACNkD,EAAM4T,OAASxR,MAAS,IAC7BpC,EAAM8nB,iBACN9nB,EAAMuoB,oBAYX,MAJKtC,GAAQuC,cACZvC,EAAQuC,aAAazmB,KAAMlB,KAAMb,GAG3BA,EAAM4T,SAGdwS,SAAU,SAAUpmB,EAAOomB,GAC1B,GAAIqC,GAAKtC,EAAW1b,EAASzH,EAC5BklB,KACApB,EAAgBV,EAASU,cACzBnX,EAAM3P,EAAM8D,MAKb,IAAKgjB,GAAiBnX,EAAIvO,YAAcpB,EAAM+V,QAAyB,UAAf/V,EAAME,MAG7D,KAAQyP,GAAO9O,KAAM8O,EAAMA,EAAIhO,YAAcd,KAK5C,GAAsB,IAAjB8O,EAAIvO,WAAmBuO,EAAI8F,YAAa,GAAuB,UAAfzV,EAAME,MAAoB,CAE9E,IADAuK,KACMzH,EAAI,EAAO8jB,EAAJ9jB,EAAmBA,IAC/BmjB,EAAYC,EAAUpjB,GAGtBylB,EAAMtC,EAAUxnB,SAAW,IAEtB8L,EAASge,KAAU3rB,IACvB2N,EAASge,GAAQtC,EAAUpZ,aAC1BxP,EAAQkrB,EAAK5nB,MAAOua,MAAOzL,IAAS,EACpCpS,EAAO0D,KAAMwnB,EAAK5nB,KAAM,MAAQ8O,IAAQ5O,QAErC0J,EAASge,IACbhe,EAAQzM,KAAMmoB,EAGX1b,GAAQ1J,QACZmnB,EAAalqB,MAAO4C,KAAM+O,EAAKyW,SAAU3b,IAW7C,MAJqB2b,GAASrlB,OAAzB+lB,GACJoB,EAAalqB,MAAO4C,KAAMC,KAAMulB,SAAUA,EAASloB,MAAO4oB,KAGpDoB,GAGRD,IAAK,SAAUjoB,GACd,GAAKA,EAAOzC,EAAO0G,SAClB,MAAOjE,EAIR,IAAIgD,GAAGmgB,EAAMzf,EACZxD,EAAOF,EAAME,KACbwoB,EAAgB1oB,EAChB2oB,EAAU9nB,KAAK+nB,SAAU1oB,EAEpByoB,KACL9nB,KAAK+nB,SAAU1oB,GAASyoB,EACvBtD,GAAY/jB,KAAMpB,GAASW,KAAKgoB,WAChCzD,GAAU9jB,KAAMpB,GAASW,KAAKioB,aAGhCplB,EAAOilB,EAAQI,MAAQloB,KAAKkoB,MAAMjrB,OAAQ6qB,EAAQI,OAAUloB,KAAKkoB,MAEjE/oB,EAAQ,GAAIzC,GAAOiqB,MAAOkB,GAE1B1lB,EAAIU,EAAK3C,MACT,OAAQiC,IACPmgB,EAAOzf,EAAMV,GACbhD,EAAOmjB,GAASuF,EAAevF,EAmBhC,OAdMnjB,GAAM8D,SACX9D,EAAM8D,OAAS4kB,EAAcM,YAAc7rB,GAKb,IAA1B6C,EAAM8D,OAAO1C,WACjBpB,EAAM8D,OAAS9D,EAAM8D,OAAOnC,YAK7B3B,EAAMipB,UAAYjpB,EAAMipB,QAEjBN,EAAQ5X,OAAS4X,EAAQ5X,OAAQ/Q,EAAO0oB,GAAkB1oB,GAIlE+oB,MAAO,wHAAwHlf,MAAM,KAErI+e,YAEAE,UACCC,MAAO,4BAA4Blf,MAAM,KACzCkH,OAAQ,SAAU/Q,EAAOkpB,GAOxB,MAJoB,OAAflpB,EAAMmpB,QACVnpB,EAAMmpB,MAA6B,MAArBD,EAASE,SAAmBF,EAASE,SAAWF,EAASG,SAGjErpB,IAIT6oB,YACCE,MAAO,mGAAmGlf,MAAM,KAChHkH,OAAQ,SAAU/Q,EAAOkpB,GACxB,GAAIvkB,GAAM2kB,EAAUjZ,EACnB0F,EAASmT,EAASnT,OAClBwT,EAAcL,EAASK,WAuBxB,OApBoB,OAAfvpB,EAAMwpB,OAAqC,MAApBN,EAASO,UACpCH,EAAWtpB,EAAM8D,OAAOzC,eAAiBlE,EACzCkT,EAAMiZ,EAASjsB,gBACfsH,EAAO2kB,EAAS3kB,KAEhB3E,EAAMwpB,MAAQN,EAASO,SAAYpZ,GAAOA,EAAIqZ,YAAc/kB,GAAQA,EAAK+kB,YAAc,IAAQrZ,GAAOA,EAAIsZ,YAAchlB,GAAQA,EAAKglB,YAAc,GACnJ3pB,EAAM4pB,MAAQV,EAASW,SAAYxZ,GAAOA,EAAIyZ,WAAcnlB,GAAQA,EAAKmlB,WAAc,IAAQzZ,GAAOA,EAAI0Z,WAAcplB,GAAQA,EAAKolB,WAAc,KAI9I/pB,EAAMgqB,eAAiBT,IAC5BvpB,EAAMgqB,cAAgBT,IAAgBvpB,EAAM8D,OAASolB,EAASe,UAAYV,GAKrEvpB,EAAMmpB,OAASpT,IAAWjZ,IAC/BkD,EAAMmpB,MAAmB,EAATpT,EAAa,EAAe,EAATA,EAAa,EAAe,EAATA,EAAa,EAAI,GAGjE/V,IAITimB,SACCiE,MAECvC,UAAU,GAEXxS,OAECrQ,QAAS,WACR,GAAKjE,OAAS6kB,MAAuB7kB,KAAKsU,MACzC,IAEC,MADAtU,MAAKsU,SACE,EACN,MAAQ1P,MAOZkhB,aAAc,WAEfwD,MACCrlB,QAAS,WACR,MAAKjE,QAAS6kB,MAAuB7kB,KAAKspB,MACzCtpB,KAAKspB,QACE,GAFR,GAKDxD,aAAc,YAEfxH,OAECra,QAAS,WACR,MAAKvH,GAAOmK,SAAU7G,KAAM,UAA2B,aAAdA,KAAKX,MAAuBW,KAAKse,OACzEte,KAAKse,SACE,GAFR,GAOD6I,SAAU,SAAUhoB,GACnB,MAAOzC,GAAOmK,SAAU1H,EAAM8D,OAAQ,OAIxCsmB,cACC5B,aAAc,SAAUxoB,GAGlBA,EAAM4T,SAAW9W,IACrBkD,EAAM0oB,cAAc2B,YAAcrqB,EAAM4T,WAM5C0W,SAAU,SAAUpqB,EAAMU,EAAMZ,EAAOuqB,GAItC,GAAI9kB,GAAIlI,EAAOgG,OACd,GAAIhG,GAAOiqB,MACXxnB,GAECE,KAAMA,EACNsqB,aAAa,EACb9B,kBAGG6B,GACJhtB,EAAOyC,MAAM8E,QAASW,EAAG,KAAM7E,GAE/BrD,EAAOyC,MAAM0mB,SAAS3kB,KAAMnB,EAAM6E,GAE9BA,EAAEsiB,sBACN/nB,EAAM8nB,mBAKTvqB,EAAO4pB,YAAchqB,EAASmD,oBAC7B,SAAUM,EAAMV,EAAMsmB,GAChB5lB,EAAKN,qBACTM,EAAKN,oBAAqBJ,EAAMsmB,GAAQ,IAG1C,SAAU5lB,EAAMV,EAAMsmB,GACrB,GAAI7iB,GAAO,KAAOzD,CAEbU,GAAKL,oBAIGK,GAAM+C,KAAW1G,IAC5B2D,EAAM+C,GAAS,MAGhB/C,EAAKL,YAAaoD,EAAM6iB,KAI3BjpB,EAAOiqB,MAAQ,SAAUhkB,EAAKulB,GAE7B,MAAOloB,gBAAgBtD,GAAOiqB,OAKzBhkB,GAAOA,EAAItD,MACfW,KAAK6nB,cAAgBllB,EACrB3C,KAAKX,KAAOsD,EAAItD,KAIhBW,KAAKknB,mBAAuBvkB,EAAIinB,kBAAoBjnB,EAAI6mB,eAAgB,GACvE7mB,EAAIknB,mBAAqBlnB,EAAIknB,oBAAwBlF,GAAaC,IAInE5kB,KAAKX,KAAOsD,EAIRulB,GACJxrB,EAAOgG,OAAQ1C,KAAMkoB,GAItBloB,KAAK8pB,UAAYnnB,GAAOA,EAAImnB,WAAaptB,EAAO0L,MAGhDpI,KAAMtD,EAAO0G,UAAY,EAvBzB,GAJQ,GAAI1G,GAAOiqB,MAAOhkB,EAAKulB,IAgChCxrB,EAAOiqB,MAAMhnB,WACZunB,mBAAoBtC,GACpBoC,qBAAsBpC,GACtB6C,8BAA+B7C,GAE/BqC,eAAgB,WACf,GAAIriB,GAAI5E,KAAK6nB,aAEb7nB,MAAKknB,mBAAqBvC,GACpB/f,IAKDA,EAAEqiB,eACNriB,EAAEqiB,iBAKFriB,EAAE4kB,aAAc,IAGlB9B,gBAAiB,WAChB,GAAI9iB,GAAI5E,KAAK6nB,aAEb7nB,MAAKgnB,qBAAuBrC,GACtB/f,IAIDA,EAAE8iB,iBACN9iB,EAAE8iB,kBAKH9iB,EAAEmlB,cAAe,IAElBC,yBAA0B,WACzBhqB,KAAKynB,8BAAgC9C,GACrC3kB,KAAK0nB,oBAKPhrB,EAAO+E,MACNwoB,WAAY,YACZC,WAAY,YACV,SAAUC,EAAM/C,GAClB1qB,EAAOyC,MAAMimB,QAAS+E,IACrBrE,aAAcsB,EACdrB,SAAUqB,EAEVzB,OAAQ,SAAUxmB,GACjB,GAAIoC,GACH0B,EAASjD,KACToqB,EAAUjrB,EAAMgqB,cAChB7D,EAAYnmB,EAAMmmB,SASnB,SALM8E,GAAYA,IAAYnnB,IAAWvG,EAAOmN,SAAU5G,EAAQmnB,MACjEjrB,EAAME,KAAOimB,EAAUG,SACvBlkB,EAAM+jB,EAAU3W,QAAQ7M,MAAO9B,KAAM+B,WACrC5C,EAAME,KAAO+nB,GAEP7lB,MAMJ7E,EAAOmI,QAAQwlB,gBAEpB3tB,EAAOyC,MAAMimB,QAAQxP,QACpBsQ,MAAO,WAEN,MAAKxpB,GAAOmK,SAAU7G,KAAM,SACpB,GAIRtD,EAAOyC,MAAMmb,IAAKta,KAAM,iCAAkC,SAAU4E,GAEnE,GAAI7E,GAAO6E,EAAE3B,OACZqnB,EAAO5tB,EAAOmK,SAAU9G,EAAM,UAAarD,EAAOmK,SAAU9G,EAAM,UAAaA,EAAKuqB,KAAOruB,CACvFquB,KAAS5tB,EAAO+jB,MAAO6J,EAAM,mBACjC5tB,EAAOyC,MAAMmb,IAAKgQ,EAAM,iBAAkB,SAAUnrB,GACnDA,EAAMorB,gBAAiB,IAExB7tB,EAAO+jB,MAAO6J,EAAM,iBAAiB,MARvC5tB,IAcDirB,aAAc,SAAUxoB,GAElBA,EAAMorB,uBACHprB,GAAMorB,eACRvqB,KAAKc,aAAe3B,EAAMynB,WAC9BlqB,EAAOyC,MAAMsqB,SAAU,SAAUzpB,KAAKc,WAAY3B,GAAO,KAK5DknB,SAAU,WAET,MAAK3pB,GAAOmK,SAAU7G,KAAM,SACpB,GAIRtD,EAAOyC,MAAMsG,OAAQzF,KAAM,YAA3BtD,MAMGA,EAAOmI,QAAQ2lB,gBAEpB9tB,EAAOyC,MAAMimB,QAAQ7G,QAEpB2H,MAAO,WAEN,MAAK5B,GAAW7jB,KAAMT,KAAK6G,YAIP,aAAd7G,KAAKX,MAAqC,UAAdW,KAAKX,QACrC3C,EAAOyC,MAAMmb,IAAKta,KAAM,yBAA0B,SAAUb,GACjB,YAArCA,EAAM0oB,cAAc4C,eACxBzqB,KAAK0qB,eAAgB,KAGvBhuB,EAAOyC,MAAMmb,IAAKta,KAAM,gBAAiB,SAAUb,GAC7Ca,KAAK0qB,gBAAkBvrB,EAAMynB,YACjC5mB,KAAK0qB,eAAgB,GAGtBhuB,EAAOyC,MAAMsqB,SAAU,SAAUzpB,KAAMb,GAAO,OAGzC,IAGRzC,EAAOyC,MAAMmb,IAAKta,KAAM,yBAA0B,SAAU4E,GAC3D,GAAI7E,GAAO6E,EAAE3B,MAERqhB,GAAW7jB,KAAMV,EAAK8G,YAAenK,EAAO+jB,MAAO1gB,EAAM,mBAC7DrD,EAAOyC,MAAMmb,IAAKva,EAAM,iBAAkB,SAAUZ,IAC9Ca,KAAKc,YAAe3B,EAAMwqB,aAAgBxqB,EAAMynB,WACpDlqB,EAAOyC,MAAMsqB,SAAU,SAAUzpB,KAAKc,WAAY3B,GAAO,KAG3DzC,EAAO+jB,MAAO1gB,EAAM,iBAAiB,MATvCrD,IAcDipB,OAAQ,SAAUxmB,GACjB,GAAIY,GAAOZ,EAAM8D,MAGjB,OAAKjD,QAASD,GAAQZ,EAAMwqB,aAAexqB,EAAMynB,WAA4B,UAAd7mB,EAAKV,MAAkC,aAAdU,EAAKV,KACrFF,EAAMmmB,UAAU3W,QAAQ7M,MAAO9B,KAAM+B,WAD7C,GAKDskB,SAAU,WAGT,MAFA3pB,GAAOyC,MAAMsG,OAAQzF,KAAM,aAEnBskB,EAAW7jB,KAAMT,KAAK6G,aAM3BnK,EAAOmI,QAAQ8lB,gBACpBjuB,EAAO+E,MAAO6S,MAAO,UAAWgV,KAAM,YAAc,SAAUa,EAAM/C,GAGnE,GAAIwD,GAAW,EACdjc,EAAU,SAAUxP,GACnBzC,EAAOyC,MAAMsqB,SAAUrC,EAAKjoB,EAAM8D,OAAQvG,EAAOyC,MAAMioB,IAAKjoB,IAAS,GAGvEzC,GAAOyC,MAAMimB,QAASgC,IACrBlB,MAAO,WACc,IAAf0E,KACJtuB,EAAS8C,iBAAkB+qB,EAAMxb,GAAS,IAG5C0X,SAAU,WACW,MAAbuE,GACNtuB,EAASmD,oBAAqB0qB,EAAMxb,GAAS,OAOlDjS,EAAOsB,GAAG0E,QAETmoB,GAAI,SAAU7F,EAAOlnB,EAAUqH,EAAMnH,EAAiBqlB,GACrD,GAAIhkB,GAAMyrB,CAGV,IAAsB,gBAAV9F,GAAqB,CAEP,gBAAblnB,KAEXqH,EAAOA,GAAQrH,EACfA,EAAW7B,EAEZ,KAAMoD,IAAQ2lB,GACbhlB,KAAK6qB,GAAIxrB,EAAMvB,EAAUqH,EAAM6f,EAAO3lB,GAAQgkB,EAE/C,OAAOrjB,MAmBR,GAhBa,MAARmF,GAAsB,MAANnH,GAEpBA,EAAKF,EACLqH,EAAOrH,EAAW7B,GACD,MAAN+B,IACc,gBAAbF,IAEXE,EAAKmH,EACLA,EAAOlJ,IAGP+B,EAAKmH,EACLA,EAAOrH,EACPA,EAAW7B,IAGR+B,KAAO,EACXA,EAAK4mB,OACC,KAAM5mB,EACZ,MAAOgC,KAaR,OAVa,KAARqjB,IACJyH,EAAS9sB,EACTA,EAAK,SAAUmB,GAGd,MADAzC,KAASwH,IAAK/E,GACP2rB,EAAOhpB,MAAO9B,KAAM+B,YAG5B/D,EAAG6J,KAAOijB,EAAOjjB,OAAUijB,EAAOjjB,KAAOnL,EAAOmL,SAE1C7H,KAAKyB,KAAM,WACjB/E,EAAOyC,MAAMmb,IAAKta,KAAMglB,EAAOhnB,EAAImH,EAAMrH,MAG3CulB,IAAK,SAAU2B,EAAOlnB,EAAUqH,EAAMnH,GACrC,MAAOgC,MAAK6qB,GAAI7F,EAAOlnB,EAAUqH,EAAMnH,EAAI,IAE5CkG,IAAK,SAAU8gB,EAAOlnB,EAAUE,GAC/B,GAAIsnB,GAAWjmB,CACf,IAAK2lB,GAASA,EAAMiC,gBAAkBjC,EAAMM,UAQ3C,MANAA,GAAYN,EAAMM,UAClB5oB,EAAQsoB,EAAMsC,gBAAiBpjB,IAC9BohB,EAAUU,UAAYV,EAAUG,SAAW,IAAMH,EAAUU,UAAYV,EAAUG,SACjFH,EAAUxnB,SACVwnB,EAAU3W,SAEJ3O,IAER,IAAsB,gBAAVglB,GAAqB,CAEhC,IAAM3lB,IAAQ2lB,GACbhlB,KAAKkE,IAAK7E,EAAMvB,EAAUknB,EAAO3lB,GAElC,OAAOW,MAUR,OARKlC,KAAa,GAA6B,kBAAbA,MAEjCE,EAAKF,EACLA,EAAW7B,GAEP+B,KAAO,IACXA,EAAK4mB,IAEC5kB,KAAKyB,KAAK,WAChB/E,EAAOyC,MAAMsG,OAAQzF,KAAMglB,EAAOhnB,EAAIF,MAIxCmG,QAAS,SAAU5E,EAAM8F,GACxB,MAAOnF,MAAKyB,KAAK,WAChB/E,EAAOyC,MAAM8E,QAAS5E,EAAM8F,EAAMnF,SAGpC+qB,eAAgB,SAAU1rB,EAAM8F,GAC/B,GAAIpF,GAAOC,KAAK,EAChB,OAAKD,GACGrD,EAAOyC,MAAM8E,QAAS5E,EAAM8F,EAAMpF,GAAM,GADhD,IAKF,IAAIirB,IAAW,iBACdC,GAAe,iCACfC,GAAgBxuB,EAAO4U,KAAKxR,MAAMoM,aAElCif,IACCC,UAAU,EACVC,UAAU,EACVpK,MAAM,EACNqK,MAAM,EAGR5uB,GAAOsB,GAAG0E,QACTtC,KAAM,SAAUtC,GACf,GAAIqE,GACHZ,KACA6Y,EAAOpa,KACPoC,EAAMgY,EAAKla,MAEZ,IAAyB,gBAAbpC,GACX,MAAOkC,MAAKqB,UAAW3E,EAAQoB,GAAWoS,OAAO,WAChD,IAAM/N,EAAI,EAAOC,EAAJD,EAASA,IACrB,GAAKzF,EAAOmN,SAAUuQ,EAAMjY,GAAKnC,MAChC,OAAO,IAMX,KAAMmC,EAAI,EAAOC,EAAJD,EAASA,IACrBzF,EAAO0D,KAAMtC,EAAUsc,EAAMjY,GAAKZ,EAMnC,OAFAA,GAAMvB,KAAKqB,UAAWe,EAAM,EAAI1F,EAAOwc,OAAQ3X,GAAQA,GACvDA,EAAIzD,SAAWkC,KAAKlC,SAAWkC,KAAKlC,SAAW,IAAMA,EAAWA,EACzDyD,GAGRyS,IAAK,SAAU/Q,GACd,GAAId,GACHopB,EAAU7uB,EAAQuG,EAAQjD,MAC1BoC,EAAMmpB,EAAQrrB,MAEf,OAAOF,MAAKkQ,OAAO,WAClB,IAAM/N,EAAI,EAAOC,EAAJD,EAASA,IACrB,GAAKzF,EAAOmN,SAAU7J,KAAMurB,EAAQppB,IACnC,OAAO,KAMX0R,IAAK,SAAU/V,GACd,MAAOkC,MAAKqB,UAAWmqB,GAAOxrB,KAAMlC,OAAgB,KAGrDoS,OAAQ,SAAUpS,GACjB,MAAOkC,MAAKqB,UAAWmqB,GAAOxrB,KAAMlC,OAAgB,KAGrD2tB,GAAI,SAAU3tB,GACb,QAAS0tB,GACRxrB,KAIoB,gBAAblC,IAAyBotB,GAAczqB,KAAM3C,GACnDpB,EAAQoB,GACRA,OACD,GACCoC,QAGHwrB,QAAS,SAAU1Z,EAAWjU,GAC7B,GAAI+Q,GACH3M,EAAI,EACJqF,EAAIxH,KAAKE,OACTqB,KACAoqB,EAAMT,GAAczqB,KAAMuR,IAAoC,gBAAdA,GAC/CtV,EAAQsV,EAAWjU,GAAWiC,KAAKjC,SACnC,CAEF,MAAYyJ,EAAJrF,EAAOA,IACd,IAAM2M,EAAM9O,KAAKmC,GAAI2M,GAAOA,IAAQ/Q,EAAS+Q,EAAMA,EAAIhO,WAEtD,GAAoB,GAAfgO,EAAIvO,WAAkBorB,EAC1BA,EAAIpR,MAAMzL,GAAO,GAGA,IAAjBA,EAAIvO,UACH7D,EAAO0D,KAAKmQ,gBAAgBzB,EAAKkD,IAAc,CAEhDlD,EAAMvN,EAAIpE,KAAM2R,EAChB,OAKH,MAAO9O,MAAKqB,UAAWE,EAAIrB,OAAS,EAAIxD,EAAOwc,OAAQ3X,GAAQA,IAKhEgZ,MAAO,SAAUxa,GAGhB,MAAMA,GAKe,gBAATA,GACJrD,EAAO2K,QAASrH,KAAK,GAAItD,EAAQqD,IAIlCrD,EAAO2K,QAEbtH,EAAKH,OAASG,EAAK,GAAKA,EAAMC,MAXrBA,KAAK,IAAMA,KAAK,GAAGc,WAAed,KAAKgC,QAAQ4pB,UAAU1rB,OAAS,IAc7Eoa,IAAK,SAAUxc,EAAUC,GACxB,GAAIolB,GAA0B,gBAAbrlB,GACfpB,EAAQoB,EAAUC,GAClBrB,EAAOsE,UAAWlD,GAAYA,EAASyC,UAAazC,GAAaA,GAClEiB,EAAMrC,EAAO2D,MAAOL,KAAKmB,MAAOgiB,EAEjC,OAAOnjB,MAAKqB,UAAW3E,EAAOwc,OAAOna,KAGtC8sB,QAAS,SAAU/tB,GAClB,MAAOkC,MAAKsa,IAAiB,MAAZxc,EAChBkC,KAAKwB,WAAaxB,KAAKwB,WAAW0O,OAAOpS,MAK5C,SAASguB,IAAShd,EAAKsD,GACtB,EACCtD,GAAMA,EAAKsD,SACFtD,GAAwB,IAAjBA,EAAIvO,SAErB,OAAOuO,GAGRpS,EAAO+E,MACNgO,OAAQ,SAAU1P,GACjB,GAAI0P,GAAS1P,EAAKe,UAClB,OAAO2O,IAA8B,KAApBA,EAAOlP,SAAkBkP,EAAS,MAEpDsc,QAAS,SAAUhsB,GAClB,MAAOrD,GAAO0V,IAAKrS,EAAM,eAE1BisB,aAAc,SAAUjsB,EAAMoC,EAAG8pB,GAChC,MAAOvvB,GAAO0V,IAAKrS,EAAM,aAAcksB,IAExChL,KAAM,SAAUlhB,GACf,MAAO+rB,IAAS/rB,EAAM,gBAEvBurB,KAAM,SAAUvrB,GACf,MAAO+rB,IAAS/rB,EAAM,oBAEvBmsB,QAAS,SAAUnsB,GAClB,MAAOrD,GAAO0V,IAAKrS,EAAM,gBAE1B6rB,QAAS,SAAU7rB,GAClB,MAAOrD,GAAO0V,IAAKrS,EAAM,oBAE1BosB,UAAW,SAAUpsB,EAAMoC,EAAG8pB,GAC7B,MAAOvvB,GAAO0V,IAAKrS,EAAM,cAAeksB,IAEzCG,UAAW,SAAUrsB,EAAMoC,EAAG8pB,GAC7B,MAAOvvB,GAAO0V,IAAKrS,EAAM,kBAAmBksB,IAE7CI,SAAU,SAAUtsB,GACnB,MAAOrD,GAAOovB,SAAW/rB,EAAKe,gBAAmBiP,WAAYhQ,IAE9DqrB,SAAU,SAAUrrB,GACnB,MAAOrD,GAAOovB,QAAS/rB,EAAKgQ,aAE7Bsb,SAAU,SAAUtrB,GACnB,MAAOrD,GAAOmK,SAAU9G,EAAM,UAC7BA,EAAKusB,iBAAmBvsB,EAAKwsB,cAAcjwB,SAC3CI,EAAO2D,SAAWN,EAAK2F,cAEvB,SAAU5C,EAAM9E,GAClBtB,EAAOsB,GAAI8E,GAAS,SAAUmpB,EAAOnuB,GACpC,GAAIyD,GAAM7E,EAAO4F,IAAKtC,KAAMhC,EAAIiuB,EAsBhC,OApB0B,UAArBnpB,EAAKzF,MAAO,MAChBS,EAAWmuB,GAGPnuB,GAAgC,gBAAbA,KACvByD,EAAM7E,EAAOwT,OAAQpS,EAAUyD,IAG3BvB,KAAKE,OAAS,IAEZirB,GAAkBroB,KACvBvB,EAAM7E,EAAOwc,OAAQ3X,IAIjB0pB,GAAaxqB,KAAMqC,KACvBvB,EAAMA,EAAIirB,YAILxsB,KAAKqB,UAAWE,MAIzB7E,EAAOgG,QACNwN,OAAQ,SAAUoB,EAAMhQ,EAAOuS,GAC9B,GAAI9T,GAAOuB,EAAO,EAMlB,OAJKuS,KACJvC,EAAO,QAAUA,EAAO,KAGD,IAAjBhQ,EAAMpB,QAAkC,IAAlBH,EAAKQ,SACjC7D,EAAO0D,KAAKmQ,gBAAiBxQ,EAAMuR,IAAWvR,MAC9CrD,EAAO0D,KAAKwJ,QAAS0H,EAAM5U,EAAO+K,KAAMnG,EAAO,SAAUvB,GACxD,MAAyB,KAAlBA,EAAKQ,aAIf6R,IAAK,SAAUrS,EAAMqS,EAAK6Z,GACzB,GAAIrY,MACH9E,EAAM/O,EAAMqS,EAEb,OAAQtD,GAAwB,IAAjBA,EAAIvO,WAAmB0rB,IAAUhwB,GAA8B,IAAjB6S,EAAIvO,WAAmB7D,EAAQoS,GAAM2c,GAAIQ,IAC/E,IAAjBnd,EAAIvO,UACRqT,EAAQzW,KAAM2R,GAEfA,EAAMA,EAAIsD,EAEX,OAAOwB,IAGRkY,QAAS,SAAUW,EAAG1sB,GACrB,GAAI2sB,KAEJ,MAAQD,EAAGA,EAAIA,EAAExd,YACI,IAAfwd,EAAElsB,UAAkBksB,IAAM1sB,GAC9B2sB,EAAEvvB,KAAMsvB,EAIV,OAAOC,KAKT,SAASlB,IAAQja,EAAUob,EAAW9Y,GACrC,GAAKnX,EAAOiE,WAAYgsB,GACvB,MAAOjwB,GAAO+K,KAAM8J,EAAU,SAAUxR,EAAMoC,GAE7C,QAASwqB,EAAUzrB,KAAMnB,EAAMoC,EAAGpC,KAAW8T,GAK/C,IAAK8Y,EAAUpsB,SACd,MAAO7D,GAAO+K,KAAM8J,EAAU,SAAUxR,GACvC,MAASA,KAAS4sB,IAAgB9Y,GAKpC,IAA0B,gBAAd8Y,GAAyB,CACpC,GAAK3B,GAASvqB,KAAMksB,GACnB,MAAOjwB,GAAOwT,OAAQyc,EAAWpb,EAAUsC,EAG5C8Y,GAAYjwB,EAAOwT,OAAQyc,EAAWpb,GAGvC,MAAO7U,GAAO+K,KAAM8J,EAAU,SAAUxR,GACvC,MAASrD,GAAO2K,QAAStH,EAAM4sB,IAAe,IAAQ9Y,IAGxD,QAAS+Y,IAAoBtwB,GAC5B,GAAIyd,GAAO8S,GAAU7jB,MAAO,KAC3B8jB,EAAWxwB,EAAS6hB,wBAErB,IAAK2O,EAASvnB,cACb,MAAQwU,EAAK7Z,OACZ4sB,EAASvnB,cACRwU,EAAKpP,MAIR,OAAOmiB,GAGR,GAAID,IAAY,6JAEfE,GAAgB,6BAChBC,GAAmB7hB,OAAO,OAAS0hB,GAAY,WAAY,KAC3DI,GAAqB,OACrBC,GAAY,0EACZC,GAAW,YACXC,GAAS,UACTC,GAAQ,YACRC,GAAe,0BACfC,GAA8B,wBAE9BC,GAAW,oCACXC,GAAc,4BACdC,GAAoB,cACpBC,GAAe,2CAGfC,IACCxK,QAAU,EAAG,+BAAgC,aAC7CyK,QAAU,EAAG,aAAc,eAC3BC,MAAQ,EAAG,QAAS,UACpBC,OAAS,EAAG,WAAY,aACxBC,OAAS,EAAG,UAAW,YACvBC,IAAM,EAAG,iBAAkB,oBAC3BC,KAAO,EAAG,mCAAoC,uBAC9CC,IAAM,EAAG,qBAAsB,yBAI/BhH,SAAUzqB,EAAOmI,QAAQkY,eAAkB,EAAG,GAAI,KAAS,EAAG,SAAU,WAEzEqR,GAAexB,GAAoBtwB,GACnC+xB,GAAcD,GAAaxe,YAAatT,EAASiJ,cAAc,OAEhEqoB,IAAQU,SAAWV,GAAQxK,OAC3BwK,GAAQ9Q,MAAQ8Q,GAAQW,MAAQX,GAAQY,SAAWZ,GAAQa,QAAUb,GAAQI,MAC7EJ,GAAQc,GAAKd,GAAQO,GAErBzxB,EAAOsB,GAAG0E,QACTuE,KAAM,SAAUF,GACf,MAAOrK,GAAOqL,OAAQ/H,KAAM,SAAU+G,GACrC,MAAOA,KAAU9K,EAChBS,EAAOuK,KAAMjH,MACbA,KAAKgV,QAAQ2Z,QAAU3uB,KAAK,IAAMA,KAAK,GAAGQ,eAAiBlE,GAAWsyB,eAAgB7nB,KACrF,KAAMA,EAAOhF,UAAU7B,SAG3ByuB,OAAQ,WACP,MAAO3uB,MAAK6uB,SAAU9sB,UAAW,SAAUhC,GAC1C,GAAuB,IAAlBC,KAAKO,UAAoC,KAAlBP,KAAKO,UAAqC,IAAlBP,KAAKO,SAAiB,CACzE,GAAI0C,GAAS6rB,GAAoB9uB,KAAMD,EACvCkD,GAAO2M,YAAa7P,OAKvBgvB,QAAS,WACR,MAAO/uB,MAAK6uB,SAAU9sB,UAAW,SAAUhC,GAC1C,GAAuB,IAAlBC,KAAKO,UAAoC,KAAlBP,KAAKO,UAAqC,IAAlBP,KAAKO,SAAiB,CACzE,GAAI0C,GAAS6rB,GAAoB9uB,KAAMD,EACvCkD,GAAO+rB,aAAcjvB,EAAMkD,EAAO8M,gBAKrCkf,OAAQ,WACP,MAAOjvB,MAAK6uB,SAAU9sB,UAAW,SAAUhC,GACrCC,KAAKc,YACTd,KAAKc,WAAWkuB,aAAcjvB,EAAMC,SAKvCkvB,MAAO,WACN,MAAOlvB,MAAK6uB,SAAU9sB,UAAW,SAAUhC,GACrCC,KAAKc,YACTd,KAAKc,WAAWkuB,aAAcjvB,EAAMC,KAAKiP,gBAM5CxJ,OAAQ,SAAU3H,EAAUqxB,GAC3B,GAAIpvB,GACHuB,EAAQxD,EAAWpB,EAAOwT,OAAQpS,EAAUkC,MAASA,KACrDmC,EAAI,CAEL,MAA6B,OAApBpC,EAAOuB,EAAMa,IAAaA,IAE5BgtB,GAA8B,IAAlBpvB,EAAKQ,UACtB7D,EAAOyjB,UAAWiP,GAAQrvB,IAGtBA,EAAKe,aACJquB,GAAYzyB,EAAOmN,SAAU9J,EAAKS,cAAeT,IACrDsvB,GAAeD,GAAQrvB,EAAM,WAE9BA,EAAKe,WAAW0N,YAAazO,GAI/B,OAAOC,OAGRgV,MAAO,WACN,GAAIjV,GACHoC,EAAI,CAEL,MAA4B,OAAnBpC,EAAOC,KAAKmC,IAAaA,IAAM,CAEhB,IAAlBpC,EAAKQ,UACT7D,EAAOyjB,UAAWiP,GAAQrvB,GAAM,GAIjC,OAAQA,EAAKgQ,WACZhQ,EAAKyO,YAAazO,EAAKgQ,WAKnBhQ,GAAKgD,SAAWrG,EAAOmK,SAAU9G,EAAM,YAC3CA,EAAKgD,QAAQ7C,OAAS,GAIxB,MAAOF,OAGRgD,MAAO,SAAUssB,EAAeC,GAI/B,MAHAD,GAAiC,MAAjBA,GAAwB,EAAQA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzDvvB,KAAKsC,IAAK,WAChB,MAAO5F,GAAOsG,MAAOhD,KAAMsvB,EAAeC,MAI5CC,KAAM,SAAUzoB,GACf,MAAOrK,GAAOqL,OAAQ/H,KAAM,SAAU+G,GACrC,GAAIhH,GAAOC,KAAK,OACfmC,EAAI,EACJqF,EAAIxH,KAAKE,MAEV,IAAK6G,IAAU9K,EACd,MAAyB,KAAlB8D,EAAKQ,SACXR,EAAK+P,UAAUvM,QAASwpB,GAAe,IACvC9wB,CAIF,MAAsB,gBAAV8K,IAAuBumB,GAAa7sB,KAAMsG,KACnDrK,EAAOmI,QAAQkY,eAAkBiQ,GAAavsB,KAAMsG,KACpDrK,EAAOmI,QAAQgY,mBAAsBoQ,GAAmBxsB,KAAMsG,IAC/D6mB,IAAWT,GAAShtB,KAAM4G,KAAY,GAAI,KAAM,GAAGD,gBAAkB,CAEtEC,EAAQA,EAAMxD,QAAS2pB,GAAW,YAElC,KACC,KAAW1lB,EAAJrF,EAAOA,IAEbpC,EAAOC,KAAKmC,OACW,IAAlBpC,EAAKQ,WACT7D,EAAOyjB,UAAWiP,GAAQrvB,GAAM,IAChCA,EAAK+P,UAAY/I,EAInBhH,GAAO,EAGN,MAAM6E,KAGJ7E,GACJC,KAAKgV,QAAQ2Z,OAAQ5nB,IAEpB,KAAMA,EAAOhF,UAAU7B,SAG3BuvB,YAAa,WACZ,GAEC9tB,GAAOjF,EAAO4F,IAAKtC,KAAM,SAAUD,GAClC,OAASA,EAAKkP,YAAalP,EAAKe,cAEjCqB,EAAI,CAmBL,OAhBAnC,MAAK6uB,SAAU9sB,UAAW,SAAUhC,GACnC,GAAIkhB,GAAOtf,EAAMQ,KAChBsN,EAAS9N,EAAMQ,IAEXsN,KAECwR,GAAQA,EAAKngB,aAAe2O,IAChCwR,EAAOjhB,KAAKiP,aAEbvS,EAAQsD,MAAOyF,SACfgK,EAAOuf,aAAcjvB,EAAMkhB,MAG1B,GAGI9e,EAAInC,KAAOA,KAAKyF,UAGxBlG,OAAQ,SAAUzB,GACjB,MAAOkC,MAAKyF,OAAQ3H,GAAU,IAG/B+wB,SAAU,SAAUltB,EAAMD,EAAUguB,GAGnC/tB,EAAO3E,EAAY8E,SAAWH,EAE9B,IAAIK,GAAOuN,EAAMogB,EAChBrqB,EAASkK,EAAK+M,EACdpa,EAAI,EACJqF,EAAIxH,KAAKE,OACTijB,EAAMnjB,KACN4vB,EAAWpoB,EAAI,EACfT,EAAQpF,EAAK,GACbhB,EAAajE,EAAOiE,WAAYoG,EAGjC,IAAKpG,KAAsB,GAAL6G,GAA2B,gBAAVT,IAAsBrK,EAAOmI,QAAQwZ,aAAemP,GAAS/sB,KAAMsG,GACzG,MAAO/G,MAAKyB,KAAK,SAAU8Y,GAC1B,GAAIH,GAAO+I,EAAIlhB,GAAIsY,EACd5Z,KACJgB,EAAK,GAAKoF,EAAM7F,KAAMlB,KAAMua,EAAOH,EAAKoV,SAEzCpV,EAAKyU,SAAUltB,EAAMD,EAAUguB,IAIjC,IAAKloB,IACJ+U,EAAW7f,EAAO8I,cAAe7D,EAAM3B,KAAM,GAAIQ,eAAe,GAAQkvB,GAAqB1vB,MAC7FgC,EAAQua,EAASxM,WAEmB,IAA/BwM,EAAS7W,WAAWxF,SACxBqc,EAAWva,GAGPA,GAAQ,CAMZ,IALAsD,EAAU5I,EAAO4F,IAAK8sB,GAAQ7S,EAAU,UAAYsT,IACpDF,EAAarqB,EAAQpF,OAITsH,EAAJrF,EAAOA,IACdoN,EAAOgN,EAEFpa,IAAMytB,IACVrgB,EAAO7S,EAAOsG,MAAOuM,GAAM,GAAM,GAG5BogB,GACJjzB,EAAO2D,MAAOiF,EAAS8pB,GAAQ7f,EAAM,YAIvC7N,EAASR,KAAMlB,KAAKmC,GAAIoN,EAAMpN,EAG/B,IAAKwtB,EAOJ,IANAngB,EAAMlK,EAASA,EAAQpF,OAAS,GAAIM,cAGpC9D,EAAO4F,IAAKgD,EAASwqB,IAGf3tB,EAAI,EAAOwtB,EAAJxtB,EAAgBA,IAC5BoN,EAAOjK,EAASnD,GACXsrB,GAAYhtB,KAAM8O,EAAKlQ,MAAQ,MAClC3C,EAAO+jB,MAAOlR,EAAM,eAAkB7S,EAAOmN,SAAU2F,EAAKD,KAExDA,EAAK5M,IAETjG,EAAOqzB,SAAUxgB,EAAK5M,KAEtBjG,EAAO+J,YAAc8I,EAAKtI,MAAQsI,EAAKuC,aAAevC,EAAKO,WAAa,IAAKvM,QAASoqB,GAAc,KAOxGpR,GAAWva,EAAQ,KAIrB,MAAOhC,QAMT,SAAS8uB,IAAoB/uB,EAAMiwB,GAClC,MAAOtzB,GAAOmK,SAAU9G,EAAM,UAC7BrD,EAAOmK,SAA+B,IAArBmpB,EAAQzvB,SAAiByvB,EAAUA,EAAQjgB,WAAY,MAExEhQ,EAAKwG,qBAAqB,SAAS,IAClCxG,EAAK6P,YAAa7P,EAAKS,cAAc+E,cAAc,UACpDxF,EAIF,QAAS8vB,IAAe9vB,GAEvB,MADAA,GAAKV,MAA6C,OAArC3C,EAAO0D,KAAKQ,KAAMb,EAAM,SAAqB,IAAMA,EAAKV,KAC9DU,EAER,QAAS+vB,IAAe/vB,GACvB,GAAID,GAAQ4tB,GAAkBvtB,KAAMJ,EAAKV,KAMzC,OALKS,GACJC,EAAKV,KAAOS,EAAM,GAElBC,EAAKgO,gBAAgB,QAEfhO,EAIR,QAASsvB,IAAe/tB,EAAO2uB,GAC9B,GAAIlwB,GACHoC,EAAI,CACL,MAA6B,OAApBpC,EAAOuB,EAAMa,IAAaA,IAClCzF,EAAO+jB,MAAO1gB,EAAM,cAAekwB,GAAevzB,EAAO+jB,MAAOwP,EAAY9tB,GAAI,eAIlF,QAAS+tB,IAAgBvtB,EAAKwtB,GAE7B,GAAuB,IAAlBA,EAAK5vB,UAAmB7D,EAAO6jB,QAAS5d,GAA7C,CAIA,GAAItD,GAAM8C,EAAGqF,EACZ4oB,EAAU1zB,EAAO+jB,MAAO9d,GACxB0tB,EAAU3zB,EAAO+jB,MAAO0P,EAAMC,GAC9BnL,EAASmL,EAAQnL,MAElB,IAAKA,EAAS,OACNoL,GAAQ1K,OACf0K,EAAQpL,SAER,KAAM5lB,IAAQ4lB,GACb,IAAM9iB,EAAI,EAAGqF,EAAIyd,EAAQ5lB,GAAOa,OAAYsH,EAAJrF,EAAOA,IAC9CzF,EAAOyC,MAAMmb,IAAK6V,EAAM9wB,EAAM4lB,EAAQ5lB,GAAQ8C,IAM5CkuB,EAAQlrB,OACZkrB,EAAQlrB,KAAOzI,EAAOgG,UAAY2tB,EAAQlrB,QAI5C,QAASmrB,IAAoB3tB,EAAKwtB,GACjC,GAAItpB,GAAUjC,EAAGO,CAGjB,IAAuB,IAAlBgrB,EAAK5vB,SAAV,CAOA,GAHAsG,EAAWspB,EAAKtpB,SAASC,eAGnBpK,EAAOmI,QAAQgZ,cAAgBsS,EAAMzzB,EAAO0G,SAAY,CAC7D+B,EAAOzI,EAAO+jB,MAAO0P,EAErB,KAAMvrB,IAAKO,GAAK8f,OACfvoB,EAAO4pB,YAAa6J,EAAMvrB,EAAGO,EAAKwgB,OAInCwK,GAAKpiB,gBAAiBrR,EAAO0G,SAIZ,WAAbyD,GAAyBspB,EAAKlpB,OAAStE,EAAIsE,MAC/C4oB,GAAeM,GAAOlpB,KAAOtE,EAAIsE,KACjC6oB,GAAeK,IAIS,WAAbtpB,GACNspB,EAAKrvB,aACTqvB,EAAK3S,UAAY7a,EAAI6a,WAOjB9gB,EAAOmI,QAAQyY,YAAgB3a,EAAImN,YAAcpT,EAAOmB,KAAKsyB,EAAKrgB,aACtEqgB,EAAKrgB,UAAYnN,EAAImN,YAGE,UAAbjJ,GAAwB0mB,GAA4B9sB,KAAMkC,EAAItD,OAKzE8wB,EAAKI,eAAiBJ,EAAKtb,QAAUlS,EAAIkS,QAIpCsb,EAAKppB,QAAUpE,EAAIoE,QACvBopB,EAAKppB,MAAQpE,EAAIoE,QAKM,WAAbF,EACXspB,EAAKK,gBAAkBL,EAAKrb,SAAWnS,EAAI6tB,iBAInB,UAAb3pB,GAAqC,aAAbA,KACnCspB,EAAKlX,aAAetW,EAAIsW,eAI1Bvc,EAAO+E,MACNgvB,SAAU,SACVC,UAAW,UACX1B,aAAc,SACd2B,YAAa,QACbC,WAAY,eACV,SAAU9tB,EAAMulB,GAClB3rB,EAAOsB,GAAI8E,GAAS,SAAUhF,GAC7B,GAAIwD,GACHa,EAAI,EACJZ,KACAsvB,EAASn0B,EAAQoB,GACjBoE,EAAO2uB,EAAO3wB,OAAS,CAExB,MAAagC,GAALC,EAAWA,IAClBb,EAAQa,IAAMD,EAAOlC,KAAOA,KAAKgD,OAAM,GACvCtG,EAAQm0B,EAAO1uB,IAAMkmB,GAAY/mB,GAGjCpE,EAAU4E,MAAOP,EAAKD,EAAMH,MAG7B,OAAOnB,MAAKqB,UAAWE,KAIzB,SAAS6tB,IAAQrxB,EAASsS,GACzB,GAAI/O,GAAOvB,EACVoC,EAAI,EACJ2uB,QAAe/yB,GAAQwI,uBAAyBnK,EAAoB2B,EAAQwI,qBAAsB8J,GAAO,WACjGtS,GAAQ8P,mBAAqBzR,EAAoB2B,EAAQ8P,iBAAkBwC,GAAO,KACzFpU,CAEF,KAAM60B,EACL,IAAMA,KAAYxvB,EAAQvD,EAAQ2H,YAAc3H,EAA8B,OAApBgC,EAAOuB,EAAMa,IAAaA,KAC7EkO,GAAO3T,EAAOmK,SAAU9G,EAAMsQ,GACnCygB,EAAM3zB,KAAM4C,GAEZrD,EAAO2D,MAAOywB,EAAO1B,GAAQrvB,EAAMsQ,GAKtC,OAAOA,KAAQpU,GAAaoU,GAAO3T,EAAOmK,SAAU9I,EAASsS,GAC5D3T,EAAO2D,OAAStC,GAAW+yB,GAC3BA,EAIF,QAASC,IAAmBhxB,GACtBwtB,GAA4B9sB,KAAMV,EAAKV,QAC3CU,EAAKwwB,eAAiBxwB,EAAK8U,SAI7BnY,EAAOgG,QACNM,MAAO,SAAUjD,EAAMuvB,EAAeC,GACrC,GAAIyB,GAAczhB,EAAMvM,EAAOb,EAAG8uB,EACjCC,EAASx0B,EAAOmN,SAAU9J,EAAKS,cAAeT,EAW/C,IATKrD,EAAOmI,QAAQyY,YAAc5gB,EAAOyc,SAASpZ,KAAUitB,GAAavsB,KAAM,IAAMV,EAAK8G,SAAW,KACpG7D,EAAQjD,EAAKwd,WAAW,IAIxB8Q,GAAYve,UAAY/P,EAAKyd,UAC7B6Q,GAAY7f,YAAaxL,EAAQqrB,GAAYte,eAGvCrT,EAAOmI,QAAQgZ,cAAiBnhB,EAAOmI,QAAQmZ,gBACjC,IAAlBje,EAAKQ,UAAoC,KAAlBR,EAAKQ,UAAqB7D,EAAOyc,SAASpZ,IAOnE,IAJAixB,EAAe5B,GAAQpsB,GACvBiuB,EAAc7B,GAAQrvB,GAGhBoC,EAAI,EAA8B,OAA1BoN,EAAO0hB,EAAY9uB,MAAeA,EAE1C6uB,EAAa7uB,IACjBmuB,GAAoB/gB,EAAMyhB,EAAa7uB,GAM1C,IAAKmtB,EACJ,GAAKC,EAIJ,IAHA0B,EAAcA,GAAe7B,GAAQrvB,GACrCixB,EAAeA,GAAgB5B,GAAQpsB,GAEjCb,EAAI,EAA8B,OAA1BoN,EAAO0hB,EAAY9uB,IAAaA,IAC7C+tB,GAAgB3gB,EAAMyhB,EAAa7uB,QAGpC+tB,IAAgBnwB,EAAMiD,EAaxB,OARAguB,GAAe5B,GAAQpsB,EAAO,UACzBguB,EAAa9wB,OAAS,GAC1BmvB,GAAe2B,GAAeE,GAAU9B,GAAQrvB,EAAM,WAGvDixB,EAAeC,EAAc1hB,EAAO,KAG7BvM,GAGRwC,cAAe,SAAUlE,EAAOvD,EAASuH,EAAS6rB,GACjD,GAAI9uB,GAAGtC,EAAM8J,EACZ5D,EAAKoK,EAAKyM,EAAOsU,EACjB5pB,EAAIlG,EAAMpB,OAGVmxB,EAAOzE,GAAoB7uB,GAE3BuzB,KACAnvB,EAAI,CAEL,MAAYqF,EAAJrF,EAAOA,IAGd,GAFApC,EAAOuB,EAAOa,GAETpC,GAAiB,IAATA,EAGZ,GAA6B,WAAxBrD,EAAO2C,KAAMU,GACjBrD,EAAO2D,MAAOixB,EAAOvxB,EAAKQ,UAAaR,GAASA,OAG1C,IAAMstB,GAAM5sB,KAAMV,GAIlB,CACNkG,EAAMA,GAAOorB,EAAKzhB,YAAa7R,EAAQwH,cAAc,QAGrD8K,GAAQ8c,GAAShtB,KAAMJ,KAAW,GAAI,KAAM,GAAG+G,cAC/CsqB,EAAOxD,GAASvd,IAASud,GAAQzG,SAEjClhB,EAAI6J,UAAYshB,EAAK,GAAKrxB,EAAKwD,QAAS2pB,GAAW,aAAgBkE,EAAK,GAGxE/uB,EAAI+uB,EAAK,EACT,OAAQ/uB,IACP4D,EAAMA,EAAIuN,SASX,KALM9W,EAAOmI,QAAQgY,mBAAqBoQ,GAAmBxsB,KAAMV,IAClEuxB,EAAMn0B,KAAMY,EAAQ6wB,eAAgB3B,GAAmB9sB,KAAMJ,GAAO,MAI/DrD,EAAOmI,QAAQiY,MAAQ,CAG5B/c,EAAe,UAARsQ,GAAoB+c,GAAO3sB,KAAMV,GAI3B,YAAZqxB,EAAK,IAAqBhE,GAAO3sB,KAAMV,GAEtC,EADAkG,EAJDA,EAAI8J,WAOL1N,EAAItC,GAAQA,EAAK2F,WAAWxF,MAC5B,OAAQmC,IACF3F,EAAOmK,SAAWiW,EAAQ/c,EAAK2F,WAAWrD,GAAK,WAAcya,EAAMpX,WAAWxF,QAClFH,EAAKyO,YAAasO,GAKrBpgB,EAAO2D,MAAOixB,EAAOrrB,EAAIP,YAGzBO,EAAI6L,YAAc,EAGlB,OAAQ7L,EAAI8J,WACX9J,EAAIuI,YAAavI,EAAI8J,WAItB9J,GAAMorB,EAAK7d,cAtDX8d,GAAMn0B,KAAMY,EAAQ6wB,eAAgB7uB,GA4DlCkG,IACJorB,EAAK7iB,YAAavI,GAKbvJ,EAAOmI,QAAQuZ,eACpB1hB,EAAO+K,KAAM2nB,GAAQkC,EAAO,SAAWP,IAGxC5uB,EAAI,CACJ,OAASpC,EAAOuxB,EAAOnvB,KAItB,KAAKgvB,GAAmD,KAAtCz0B,EAAO2K,QAAStH,EAAMoxB,MAIxCtnB,EAAWnN,EAAOmN,SAAU9J,EAAKS,cAAeT,GAGhDkG,EAAMmpB,GAAQiC,EAAKzhB,YAAa7P,GAAQ,UAGnC8J,GACJwlB,GAAeppB,GAIXX,GAAU,CACdjD,EAAI,CACJ,OAAStC,EAAOkG,EAAK5D,KACforB,GAAYhtB,KAAMV,EAAKV,MAAQ,KACnCiG,EAAQnI,KAAM4C,GAQlB,MAFAkG,GAAM,KAECorB,GAGRlR,UAAW,SAAU7e,EAAsBse,GAC1C,GAAI7f,GAAMV,EAAM0B,EAAIoE,EACnBhD,EAAI,EACJ2d,EAAcpjB,EAAO0G,QACrB8K,EAAQxR,EAAOwR,MACf0P,EAAgBlhB,EAAOmI,QAAQ+Y,cAC/BwH,EAAU1oB,EAAOyC,MAAMimB,OAExB,MAA6B,OAApBrlB,EAAOuB,EAAMa,IAAaA,IAElC,IAAKyd,GAAcljB,EAAOkjB,WAAY7f,MAErCgB,EAAKhB,EAAM+f,GACX3a,EAAOpE,GAAMmN,EAAOnN,IAER,CACX,GAAKoE,EAAK8f,OACT,IAAM5lB,IAAQ8F,GAAK8f,OACbG,EAAS/lB,GACb3C,EAAOyC,MAAMsG,OAAQ1F,EAAMV,GAI3B3C,EAAO4pB,YAAavmB,EAAMV,EAAM8F,EAAKwgB,OAMnCzX;EAAOnN,WAEJmN,GAAOnN,GAKT6c,QACG7d,GAAM+f,SAEK/f,GAAKgO,kBAAoB3R,EAC3C2D,EAAKgO,gBAAiB+R,GAGtB/f,EAAM+f,GAAgB,KAGvBhjB,EAAgBK,KAAM4D,MAO3BgvB,SAAU,SAAUwB,GACnB,MAAO70B,GAAO80B,MACbD,IAAKA,EACLlyB,KAAM,MACNoyB,SAAU,SACVprB,OAAO,EACP0e,QAAQ,EACR2M,UAAU,OAIbh1B,EAAOsB,GAAG0E,QACTivB,QAAS,SAAUnC,GAClB,GAAK9yB,EAAOiE,WAAY6uB,GACvB,MAAOxvB,MAAKyB,KAAK,SAASU,GACzBzF,EAAOsD,MAAM2xB,QAASnC,EAAKtuB,KAAKlB,KAAMmC,KAIxC,IAAKnC,KAAK,GAAK,CAEd,GAAIoxB,GAAO10B,EAAQ8yB,EAAMxvB,KAAK,GAAGQ,eAAgByB,GAAG,GAAGe,OAAM,EAExDhD,MAAK,GAAGc,YACZswB,EAAKpC,aAAchvB,KAAK,IAGzBoxB,EAAK9uB,IAAI,WACR,GAAIvC,GAAOC,IAEX,OAAQD,EAAKgQ,YAA2C,IAA7BhQ,EAAKgQ,WAAWxP,SAC1CR,EAAOA,EAAKgQ,UAGb,OAAOhQ,KACL4uB,OAAQ3uB,MAGZ,MAAOA,OAGR4xB,UAAW,SAAUpC,GACpB,MAAK9yB,GAAOiE,WAAY6uB,GAChBxvB,KAAKyB,KAAK,SAASU,GACzBzF,EAAOsD,MAAM4xB,UAAWpC,EAAKtuB,KAAKlB,KAAMmC,MAInCnC,KAAKyB,KAAK,WAChB,GAAI2Y,GAAO1d,EAAQsD,MAClBqrB,EAAWjR,EAAKiR,UAEZA,GAASnrB,OACbmrB,EAASsG,QAASnC,GAGlBpV,EAAKuU,OAAQa,MAKhB4B,KAAM,SAAU5B,GACf,GAAI7uB,GAAajE,EAAOiE,WAAY6uB,EAEpC,OAAOxvB,MAAKyB,KAAK,SAASU,GACzBzF,EAAQsD,MAAO2xB,QAAShxB,EAAa6uB,EAAKtuB,KAAKlB,KAAMmC,GAAKqtB,MAI5DqC,OAAQ,WACP,MAAO7xB,MAAKyP,SAAShO,KAAK,WACnB/E,EAAOmK,SAAU7G,KAAM,SAC5BtD,EAAQsD,MAAOyvB,YAAazvB,KAAK0F,cAEhCnD,QAGL,IAAIuvB,IAAQC,GAAWC,GACtBC,GAAS,kBACTC,GAAW,wBACXC,GAAY,4BAGZC,GAAe,4BACfC,GAAU,UACVC,GAAgBnnB,OAAQ,KAAOjN,EAAY,SAAU,KACrDq0B,GAAgBpnB,OAAQ,KAAOjN,EAAY,kBAAmB,KAC9Ds0B,GAAcrnB,OAAQ,YAAcjN,EAAY,IAAK,KACrDu0B,IAAgBC,KAAM,SAEtBC,IAAYC,SAAU,WAAYC,WAAY,SAAU7T,QAAS,SACjE8T,IACCC,cAAe,EACfC,WAAY,KAGbC,IAAc,MAAO,QAAS,SAAU,QACxCC,IAAgB,SAAU,IAAK,MAAO,KAGvC,SAASC,IAAgB1qB,EAAO3F,GAG/B,GAAKA,IAAQ2F,GACZ,MAAO3F,EAIR,IAAIswB,GAAUtwB,EAAK7C,OAAO,GAAGhB,cAAgB6D,EAAKzF,MAAM,GACvDg2B,EAAWvwB,EACXX,EAAI+wB,GAAYhzB,MAEjB,OAAQiC,IAEP,GADAW,EAAOowB,GAAa/wB,GAAMixB,EACrBtwB,IAAQ2F,GACZ,MAAO3F,EAIT,OAAOuwB,GAGR,QAASC,IAAUvzB,EAAMwzB,GAIxB,MADAxzB,GAAOwzB,GAAMxzB,EAC4B,SAAlCrD,EAAO82B,IAAKzzB,EAAM,aAA2BrD,EAAOmN,SAAU9J,EAAKS,cAAeT,GAG1F,QAAS0zB,IAAUliB,EAAUmiB,GAC5B,GAAI1U,GAASjf,EAAM4zB,EAClBzX,KACA3B,EAAQ,EACRra,EAASqR,EAASrR,MAEnB,MAAgBA,EAARqa,EAAgBA,IACvBxa,EAAOwR,EAAUgJ,GACXxa,EAAK0I,QAIXyT,EAAQ3B,GAAU7d,EAAO+jB,MAAO1gB,EAAM,cACtCif,EAAUjf,EAAK0I,MAAMuW,QAChB0U,GAGExX,EAAQ3B,IAAuB,SAAZyE,IACxBjf,EAAK0I,MAAMuW,QAAU,IAMM,KAAvBjf,EAAK0I,MAAMuW,SAAkBsU,GAAUvzB,KAC3Cmc,EAAQ3B,GAAU7d,EAAO+jB,MAAO1gB,EAAM,aAAc6zB,GAAmB7zB,EAAK8G,aAIvEqV,EAAQ3B,KACboZ,EAASL,GAAUvzB,IAEdif,GAAuB,SAAZA,IAAuB2U,IACtCj3B,EAAO+jB,MAAO1gB,EAAM,aAAc4zB,EAAS3U,EAAUtiB,EAAO82B,IAAKzzB,EAAM,aAQ3E,KAAMwa,EAAQ,EAAWra,EAARqa,EAAgBA,IAChCxa,EAAOwR,EAAUgJ,GACXxa,EAAK0I,QAGLirB,GAA+B,SAAvB3zB,EAAK0I,MAAMuW,SAA6C,KAAvBjf,EAAK0I,MAAMuW,UACzDjf,EAAK0I,MAAMuW,QAAU0U,EAAOxX,EAAQ3B,IAAW,GAAK,QAItD,OAAOhJ,GAGR7U,EAAOsB,GAAG0E,QACT8wB,IAAK,SAAU1wB,EAAMiE,GACpB,MAAOrK,GAAOqL,OAAQ/H,KAAM,SAAUD,EAAM+C,EAAMiE,GACjD,GAAI3E,GAAKyxB,EACRvxB,KACAH,EAAI,CAEL,IAAKzF,EAAOyG,QAASL,GAAS,CAI7B,IAHA+wB,EAAS9B,GAAWhyB,GACpBqC,EAAMU,EAAK5C,OAECkC,EAAJD,EAASA,IAChBG,EAAKQ,EAAMX,IAAQzF,EAAO82B,IAAKzzB,EAAM+C,EAAMX,IAAK,EAAO0xB,EAGxD,OAAOvxB,GAGR,MAAOyE,KAAU9K,EAChBS,EAAO+L,MAAO1I,EAAM+C,EAAMiE,GAC1BrK,EAAO82B,IAAKzzB,EAAM+C,IACjBA,EAAMiE,EAAOhF,UAAU7B,OAAS,IAEpCwzB,KAAM,WACL,MAAOD,IAAUzzB,MAAM,IAExB8zB,KAAM,WACL,MAAOL,IAAUzzB,OAElB+zB,OAAQ,SAAUlZ,GACjB,MAAsB,iBAAVA,GACJA,EAAQ7a,KAAK0zB,OAAS1zB,KAAK8zB,OAG5B9zB,KAAKyB,KAAK,WACX6xB,GAAUtzB,MACdtD,EAAQsD,MAAO0zB,OAEfh3B,EAAQsD,MAAO8zB,YAMnBp3B,EAAOgG,QAGNsxB,UACC/W,SACC9b,IAAK,SAAUpB,EAAMk0B,GACpB,GAAKA,EAAW,CAEf,GAAI1yB,GAAMywB,GAAQjyB,EAAM,UACxB,OAAe,KAARwB,EAAa,IAAMA,MAO9B2yB,WACCC,aAAe,EACfC,aAAe,EACfpB,YAAc,EACdqB,YAAc,EACdpX,SAAW,EACXqX,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVvV,MAAQ,GAKTwV,UAECC,QAASj4B,EAAOmI,QAAQqY,SAAW,WAAa,cAIjDzU,MAAO,SAAU1I,EAAM+C,EAAMiE,EAAO6tB,GAEnC,GAAM70B,GAA0B,IAAlBA,EAAKQ,UAAoC,IAAlBR,EAAKQ,UAAmBR,EAAK0I,MAAlE,CAKA,GAAIlH,GAAKlC,EAAM0hB,EACdsS,EAAW32B,EAAOiK,UAAW7D,GAC7B2F,EAAQ1I,EAAK0I,KASd,IAPA3F,EAAOpG,EAAOg4B,SAAUrB,KAAgB32B,EAAOg4B,SAAUrB,GAAaF,GAAgB1qB,EAAO4qB,IAI7FtS,EAAQrkB,EAAOs3B,SAAUlxB,IAAUpG,EAAOs3B,SAAUX,GAG/CtsB,IAAU9K,EAsCd,MAAK8kB,IAAS,OAASA,KAAUxf,EAAMwf,EAAM5f,IAAKpB,GAAM,EAAO60B,MAAa34B,EACpEsF,EAIDkH,EAAO3F,EAhCd,IAVAzD,QAAc0H,GAGA,WAAT1H,IAAsBkC,EAAMixB,GAAQryB,KAAM4G,MAC9CA,GAAUxF,EAAI,GAAK,GAAMA,EAAI,GAAKiD,WAAY9H,EAAO82B,IAAKzzB,EAAM+C,IAEhEzD,EAAO,YAIM,MAAT0H,GAA0B,WAAT1H,GAAqBkF,MAAOwC,KAKpC,WAAT1H,GAAsB3C,EAAOw3B,UAAWb,KAC5CtsB,GAAS,MAKJrK,EAAOmI,QAAQ6Z,iBAA6B,KAAV3X,GAA+C,IAA/BjE,EAAKvF,QAAQ,gBACpEkL,EAAO3F,GAAS,WAIXie,GAAW,OAASA,KAAWha,EAAQga,EAAMoC,IAAKpjB,EAAMgH,EAAO6tB,MAAa34B,IAIjF,IACCwM,EAAO3F,GAASiE,EACf,MAAMnC,OAcX4uB,IAAK,SAAUzzB,EAAM+C,EAAM8xB,EAAOf,GACjC,GAAIzyB,GAAKoQ,EAAKuP,EACbsS,EAAW32B,EAAOiK,UAAW7D,EAyB9B,OAtBAA,GAAOpG,EAAOg4B,SAAUrB,KAAgB32B,EAAOg4B,SAAUrB,GAAaF,GAAgBpzB,EAAK0I,MAAO4qB,IAIlGtS,EAAQrkB,EAAOs3B,SAAUlxB,IAAUpG,EAAOs3B,SAAUX,GAG/CtS,GAAS,OAASA,KACtBvP,EAAMuP,EAAM5f,IAAKpB,GAAM,EAAM60B,IAIzBpjB,IAAQvV,IACZuV,EAAMwgB,GAAQjyB,EAAM+C,EAAM+wB,IAId,WAARriB,GAAoB1O,IAAQgwB,MAChCthB,EAAMshB,GAAoBhwB,IAIZ,KAAV8xB,GAAgBA,GACpBxzB,EAAMoD,WAAYgN,GACXojB,KAAU,GAAQl4B,EAAO4H,UAAWlD,GAAQA,GAAO,EAAIoQ,GAExDA,KAMJxV,EAAOqjB,kBACX0S,GAAY,SAAUhyB,GACrB,MAAO/D,GAAOqjB,iBAAkBtf,EAAM,OAGvCiyB,GAAS,SAAUjyB,EAAM+C,EAAM+xB,GAC9B,GAAIvV,GAAOwV,EAAUC,EACpBd,EAAWY,GAAa9C,GAAWhyB,GAGnCwB,EAAM0yB,EAAWA,EAASe,iBAAkBlyB,IAAUmxB,EAAUnxB,GAAS7G,EACzEwM,EAAQ1I,EAAK0I,KA8Bd,OA5BKwrB,KAES,KAAR1yB,GAAe7E,EAAOmN,SAAU9J,EAAKS,cAAeT,KACxDwB,EAAM7E,EAAO+L,MAAO1I,EAAM+C,IAOtByvB,GAAU9xB,KAAMc,IAAS8wB,GAAQ5xB,KAAMqC,KAG3Cwc,EAAQ7W,EAAM6W,MACdwV,EAAWrsB,EAAMqsB,SACjBC,EAAWtsB,EAAMssB,SAGjBtsB,EAAMqsB,SAAWrsB,EAAMssB,SAAWtsB,EAAM6W,MAAQ/d,EAChDA,EAAM0yB,EAAS3U,MAGf7W,EAAM6W,MAAQA,EACd7W,EAAMqsB,SAAWA,EACjBrsB,EAAMssB,SAAWA,IAIZxzB,IAEGjF,EAASE,gBAAgBy4B,eACpClD,GAAY,SAAUhyB,GACrB,MAAOA,GAAKk1B,cAGbjD,GAAS,SAAUjyB,EAAM+C,EAAM+xB,GAC9B,GAAIK,GAAMC,EAAIC,EACbnB,EAAWY,GAAa9C,GAAWhyB,GACnCwB,EAAM0yB,EAAWA,EAAUnxB,GAAS7G,EACpCwM,EAAQ1I,EAAK0I,KAoCd,OAhCY,OAAPlH,GAAekH,GAASA,EAAO3F,KACnCvB,EAAMkH,EAAO3F,IAUTyvB,GAAU9xB,KAAMc,KAAU4wB,GAAU1xB,KAAMqC,KAG9CoyB,EAAOzsB,EAAMysB,KACbC,EAAKp1B,EAAKs1B,aACVD,EAASD,GAAMA,EAAGD,KAGbE,IACJD,EAAGD,KAAOn1B,EAAKk1B,aAAaC,MAE7BzsB,EAAMysB,KAAgB,aAATpyB,EAAsB,MAAQvB,EAC3CA,EAAMkH,EAAM6sB,UAAY,KAGxB7sB,EAAMysB,KAAOA,EACRE,IACJD,EAAGD,KAAOE,IAIG,KAAR7zB,EAAa,OAASA,GAI/B,SAASg0B,IAAmBx1B,EAAMgH,EAAOyuB,GACxC,GAAI5rB,GAAU0oB,GAAUnyB,KAAM4G,EAC9B,OAAO6C,GAENvG,KAAKiE,IAAK,EAAGsC,EAAS,IAAQ4rB,GAAY,KAAU5rB,EAAS,IAAO,MACpE7C,EAGF,QAAS0uB,IAAsB11B,EAAM+C,EAAM8xB,EAAOc,EAAa7B,GAC9D,GAAI1xB,GAAIyyB,KAAYc,EAAc,SAAW,WAE5C,EAES,UAAT5yB,EAAmB,EAAI,EAEvB0O,EAAM,CAEP,MAAY,EAAJrP,EAAOA,GAAK,EAEJ,WAAVyyB,IACJpjB,GAAO9U,EAAO82B,IAAKzzB,EAAM60B,EAAQ3B,GAAW9wB,IAAK,EAAM0xB,IAGnD6B,GAEW,YAAVd,IACJpjB,GAAO9U,EAAO82B,IAAKzzB,EAAM,UAAYkzB,GAAW9wB,IAAK,EAAM0xB,IAI7C,WAAVe,IACJpjB,GAAO9U,EAAO82B,IAAKzzB,EAAM,SAAWkzB,GAAW9wB,GAAM,SAAS,EAAM0xB,MAIrEriB,GAAO9U,EAAO82B,IAAKzzB,EAAM,UAAYkzB,GAAW9wB,IAAK,EAAM0xB,GAG5C,YAAVe,IACJpjB,GAAO9U,EAAO82B,IAAKzzB,EAAM,SAAWkzB,GAAW9wB,GAAM,SAAS,EAAM0xB,IAKvE,OAAOriB,GAGR,QAASmkB,IAAkB51B,EAAM+C,EAAM8xB,GAGtC,GAAIgB,IAAmB,EACtBpkB,EAAe,UAAT1O,EAAmB/C,EAAKqf,YAAcrf,EAAKgf,aACjD8U,EAAS9B,GAAWhyB,GACpB21B,EAAch5B,EAAOmI,QAAQsa,WAAgE,eAAnDziB,EAAO82B,IAAKzzB,EAAM,aAAa,EAAO8zB,EAKjF,IAAY,GAAPriB,GAAmB,MAAPA,EAAc,CAQ9B,GANAA,EAAMwgB,GAAQjyB,EAAM+C,EAAM+wB,IACf,EAANriB,GAAkB,MAAPA,KACfA,EAAMzR,EAAK0I,MAAO3F,IAIdyvB,GAAU9xB,KAAK+Q,GACnB,MAAOA,EAKRokB,GAAmBF,IAAiBh5B,EAAOmI,QAAQkZ,mBAAqBvM,IAAQzR,EAAK0I,MAAO3F,IAG5F0O,EAAMhN,WAAYgN,IAAS,EAI5B,MAASA,GACRikB,GACC11B,EACA+C,EACA8xB,IAAWc,EAAc,SAAW,WACpCE,EACA/B,GAEE,KAIL,QAASD,IAAoB/sB,GAC5B,GAAI2I,GAAMlT,EACT0iB,EAAUyT,GAAa5rB,EA0BxB,OAxBMmY,KACLA,EAAU6W,GAAehvB,EAAU2I,GAGlB,SAAZwP,GAAuBA,IAE3B8S,IAAWA,IACVp1B,EAAO,kDACN82B,IAAK,UAAW,6BAChB/C,SAAUjhB,EAAIhT,iBAGhBgT,GAAQsiB,GAAO,GAAGvF,eAAiBuF,GAAO,GAAGxF,iBAAkBhwB,SAC/DkT,EAAIsmB,MAAM,+BACVtmB,EAAIumB,QAEJ/W,EAAU6W,GAAehvB,EAAU2I,GACnCsiB,GAAOvyB,UAIRkzB,GAAa5rB,GAAamY,GAGpBA,EAIR,QAAS6W,IAAe/yB,EAAM0M,GAC7B,GAAIzP,GAAOrD,EAAQ8S,EAAIjK,cAAezC,IAAS2tB,SAAUjhB,EAAI1L,MAC5Dkb,EAAUtiB,EAAO82B,IAAKzzB,EAAK,GAAI,UAEhC,OADAA,GAAK0F,SACEuZ,EAGRtiB,EAAO+E,MAAO,SAAU,SAAW,SAAUU,EAAGW,GAC/CpG,EAAOs3B,SAAUlxB,IAChB3B,IAAK,SAAUpB,EAAMk0B,EAAUW,GAC9B,MAAKX,GAGwB,IAArBl0B,EAAKqf,aAAqBgT,GAAa3xB,KAAM/D,EAAO82B,IAAKzzB,EAAM,YACrErD,EAAO6L,KAAMxI,EAAM4yB,GAAS,WAC3B,MAAOgD,IAAkB51B,EAAM+C,EAAM8xB,KAEtCe,GAAkB51B,EAAM+C,EAAM8xB,GAPhC,GAWDzR,IAAK,SAAUpjB,EAAMgH,EAAO6tB,GAC3B,GAAIf,GAASe,GAAS7C,GAAWhyB,EACjC,OAAOw1B,IAAmBx1B,EAAMgH,EAAO6tB,EACtCa,GACC11B,EACA+C,EACA8xB,EACAl4B,EAAOmI,QAAQsa,WAAgE,eAAnDziB,EAAO82B,IAAKzzB,EAAM,aAAa,EAAO8zB,GAClEA,GACG,OAMFn3B,EAAOmI,QAAQoY,UACpBvgB,EAAOs3B,SAAS/W,SACf9b,IAAK,SAAUpB,EAAMk0B,GAEpB,MAAO/B,IAASzxB,MAAOwzB,GAAYl0B,EAAKk1B,aAAel1B,EAAKk1B,aAAa/kB,OAASnQ,EAAK0I,MAAMyH,SAAW,IACrG,IAAO1L,WAAY2G,OAAO6qB,IAAS,GACrC/B,EAAW,IAAM,IAGnB9Q,IAAK,SAAUpjB,EAAMgH,GACpB,GAAI0B,GAAQ1I,EAAK0I,MAChBwsB,EAAel1B,EAAKk1B,aACpBhY,EAAUvgB,EAAO4H,UAAWyC,GAAU,iBAA2B,IAARA,EAAc,IAAM,GAC7EmJ,EAAS+kB,GAAgBA,EAAa/kB,QAAUzH,EAAMyH,QAAU,EAIjEzH,GAAMyW,KAAO,GAINnY,GAAS,GAAe,KAAVA,IAC6B,KAAhDrK,EAAOmB,KAAMqS,EAAO3M,QAAS0uB,GAAQ,MACrCxpB,EAAMsF,kBAKPtF,EAAMsF,gBAAiB,UAGR,KAAVhH,GAAgBkuB,IAAiBA,EAAa/kB,UAMpDzH,EAAMyH,OAAS+hB,GAAOxxB,KAAMyP,GAC3BA,EAAO3M,QAAS0uB,GAAQhV,GACxB/M,EAAS,IAAM+M,MAOnBvgB,EAAO,WACAA,EAAOmI,QAAQiZ,sBACpBphB,EAAOs3B,SAASzU,aACfpe,IAAK,SAAUpB,EAAMk0B,GACpB,MAAKA,GAGGv3B,EAAO6L,KAAMxI,GAAQif,QAAW,gBACtCgT,IAAUjyB,EAAM,gBAJlB,MAaGrD,EAAOmI,QAAQ8Y,eAAiBjhB,EAAOsB,GAAG40B,UAC/Cl2B,EAAO+E,MAAQ,MAAO,QAAU,SAAUU,EAAGmgB,GAC5C5lB,EAAOs3B,SAAU1R,IAChBnhB,IAAK,SAAUpB,EAAMk0B,GACpB,MAAKA,IACJA,EAAWjC,GAAQjyB,EAAMuiB,GAElBiQ,GAAU9xB,KAAMwzB,GACtBv3B,EAAQqD,GAAO6yB,WAAYtQ,GAAS,KACpC2R,GALF,QAcAv3B,EAAO4U,MAAQ5U,EAAO4U,KAAKwE,UAC/BpZ,EAAO4U,KAAKwE,QAAQ6d,OAAS,SAAU5zB,GAGtC,MAA2B,IAApBA,EAAKqf,aAAyC,GAArBrf,EAAKgf,eAClCriB,EAAOmI,QAAQoa,uBAAmG,UAAxElf,EAAK0I,OAAS1I,EAAK0I,MAAMuW,SAAYtiB,EAAO82B,IAAKzzB,EAAM,aAGrGrD,EAAO4U,KAAKwE,QAAQmgB,QAAU,SAAUl2B,GACvC,OAAQrD,EAAO4U,KAAKwE,QAAQ6d,OAAQ5zB,KAKtCrD,EAAO+E,MACNy0B,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpB55B,EAAOs3B,SAAUqC,EAASC,IACzBC,OAAQ,SAAUxvB,GACjB,GAAI5E,GAAI,EACPq0B,KAGAC,EAAyB,gBAAV1vB,GAAqBA,EAAMiC,MAAM,MAASjC,EAE1D,MAAY,EAAJ5E,EAAOA,IACdq0B,EAAUH,EAASpD,GAAW9wB,GAAMm0B,GACnCG,EAAOt0B,IAAOs0B,EAAOt0B,EAAI,IAAOs0B,EAAO,EAGzC,OAAOD,KAIHnE,GAAQ5xB,KAAM41B,KACnB35B,EAAOs3B,SAAUqC,EAASC,GAASnT,IAAMoS,KAG3C,IAAImB,IAAM,OACTC,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,oCAEhBp6B,GAAOsB,GAAG0E,QACTq0B,UAAW,WACV,MAAOr6B,GAAOqxB,MAAO/tB,KAAKg3B,mBAE3BA,eAAgB,WACf,MAAOh3B,MAAKsC,IAAI,WAEf,GAAIiP,GAAW7U,EAAO4lB,KAAMtiB,KAAM,WAClC,OAAOuR,GAAW7U,EAAOsE,UAAWuQ,GAAavR,OAEjDkQ,OAAO,WACP,GAAI7Q,GAAOW,KAAKX,IAEhB,OAAOW,MAAK8C,OAASpG,EAAQsD,MAAOyrB,GAAI,cACvCqL,GAAar2B,KAAMT,KAAK6G,YAAegwB,GAAgBp2B,KAAMpB,KAC3DW,KAAK6U,UAAY0Y,GAA4B9sB,KAAMpB,MAEtDiD,IAAI,SAAUH,EAAGpC,GACjB,GAAIyR,GAAM9U,EAAQsD,MAAOwR,KAEzB,OAAc,OAAPA,EACN,KACA9U,EAAOyG,QAASqO,GACf9U,EAAO4F,IAAKkP,EAAK,SAAUA,GAC1B,OAAS1O,KAAM/C,EAAK+C,KAAMiE,MAAOyK,EAAIjO,QAASqzB,GAAO,YAEpD9zB,KAAM/C,EAAK+C,KAAMiE,MAAOyK,EAAIjO,QAASqzB,GAAO,WAC9Cz1B,SAMLzE,EAAOqxB,MAAQ,SAAUzjB,EAAG2sB,GAC3B,GAAIZ,GACHa,KACA5c,EAAM,SAAU3V,EAAKoC,GAEpBA,EAAQrK,EAAOiE,WAAYoG,GAAUA,IAAqB,MAATA,EAAgB,GAAKA,EACtEmwB,EAAGA,EAAEh3B,QAAWi3B,mBAAoBxyB,GAAQ,IAAMwyB,mBAAoBpwB,GASxE,IALKkwB,IAAgBh7B,IACpBg7B,EAAcv6B,EAAO06B,cAAgB16B,EAAO06B,aAAaH,aAIrDv6B,EAAOyG,QAASmH,IAASA,EAAE1K,SAAWlD,EAAOgE,cAAe4J,GAEhE5N,EAAO+E,KAAM6I,EAAG,WACfgQ,EAAKta,KAAK8C,KAAM9C,KAAK+G,aAMtB,KAAMsvB,IAAU/rB,GACf+sB,GAAahB,EAAQ/rB,EAAG+rB,GAAUY,EAAa3c,EAKjD,OAAO4c,GAAEtpB,KAAM,KAAMrK,QAASmzB,GAAK,KAGpC,SAASW,IAAahB,EAAQlyB,EAAK8yB,EAAa3c,GAC/C,GAAIxX,EAEJ,IAAKpG,EAAOyG,QAASgB,GAEpBzH,EAAO+E,KAAM0C,EAAK,SAAUhC,EAAGm1B,GACzBL,GAAeN,GAASl2B,KAAM41B,GAElC/b,EAAK+b,EAAQiB,GAIbD,GAAahB,EAAS,KAAqB,gBAANiB,GAAiBn1B,EAAI,IAAO,IAAKm1B,EAAGL,EAAa3c,SAIlF,IAAM2c,GAAsC,WAAvBv6B,EAAO2C,KAAM8E,GAQxCmW,EAAK+b,EAAQlyB,OANb,KAAMrB,IAAQqB,GACbkzB,GAAahB,EAAS,IAAMvzB,EAAO,IAAKqB,EAAKrB,GAAQm0B,EAAa3c,GAQrE5d,EAAO+E,KAAM,0MAEqDuH,MAAM,KAAM,SAAU7G,EAAGW,GAG1FpG,EAAOsB,GAAI8E,GAAS,SAAUqC,EAAMnH,GACnC,MAAO+D,WAAU7B,OAAS,EACzBF,KAAK6qB,GAAI/nB,EAAM,KAAMqC,EAAMnH,GAC3BgC,KAAKiE,QAASnB,MAIjBpG,EAAOsB,GAAG0E,QACT60B,MAAO,SAAUC,EAAQC,GACxB,MAAOz3B,MAAKiqB,WAAYuN,GAAStN,WAAYuN,GAASD,IAGvDE,KAAM,SAAU1S,EAAO7f,EAAMnH,GAC5B,MAAOgC,MAAK6qB,GAAI7F,EAAO,KAAM7f,EAAMnH,IAEpC25B,OAAQ,SAAU3S,EAAOhnB,GACxB,MAAOgC,MAAKkE,IAAK8gB,EAAO,KAAMhnB,IAG/B45B,SAAU,SAAU95B,EAAUknB,EAAO7f,EAAMnH,GAC1C,MAAOgC,MAAK6qB,GAAI7F,EAAOlnB,EAAUqH,EAAMnH,IAExC65B,WAAY,SAAU/5B,EAAUknB,EAAOhnB,GAEtC,MAA4B,KAArB+D,UAAU7B,OAAeF,KAAKkE,IAAKpG,EAAU,MAASkC,KAAKkE,IAAK8gB,EAAOlnB,GAAY,KAAME,KAGlG,IAEC85B,IACAC,GACAC,GAAat7B,EAAO0L,MAEpB6vB,GAAc,KACdC,GAAQ,OACRC,GAAM,gBACNC,GAAW,gCAEXC,GAAiB,4DACjBC,GAAa,iBACbC,GAAY,QACZC,GAAO,8CAGPC,GAAQ/7B,EAAOsB,GAAGqrB,KAWlBqP,MAOAC,MAGAC,GAAW,KAAK37B,OAAO,IAIxB,KACC86B,GAAe17B,EAASoY,KACvB,MAAO7P,IAGRmzB,GAAez7B,EAASiJ,cAAe,KACvCwyB,GAAatjB,KAAO,GACpBsjB,GAAeA,GAAatjB,KAI7BqjB,GAAeU,GAAKr4B,KAAM43B,GAAajxB,kBAGvC,SAAS+xB,IAA6BC,GAGrC,MAAO,UAAUC,EAAoBpe,GAED,gBAAvBoe,KACXpe,EAAOoe,EACPA,EAAqB,IAGtB,IAAItH,GACHtvB,EAAI,EACJ62B,EAAYD,EAAmBjyB,cAAchH,MAAO1B,MAErD,IAAK1B,EAAOiE,WAAYga,GAEvB,MAAS8W,EAAWuH,EAAU72B,KAER,MAAhBsvB,EAAS,IACbA,EAAWA,EAASp0B,MAAO,IAAO,KACjCy7B,EAAWrH,GAAaqH,EAAWrH,QAAkBpgB,QAASsJ,KAI9Dme,EAAWrH,GAAaqH,EAAWrH,QAAkBt0B,KAAMwd,IAQjE,QAASse,IAA+BH,EAAW/1B,EAASm2B,EAAiBC,GAE5E,GAAIC,MACHC,EAAqBP,IAAcH,EAEpC,SAASW,GAAS7H,GACjB,GAAI3c,EAYJ,OAXAskB,GAAW3H,IAAa,EACxB/0B,EAAO+E,KAAMq3B,EAAWrH,OAAkB,SAAUhlB,EAAG8sB,GACtD,GAAIC,GAAsBD,EAAoBx2B,EAASm2B,EAAiBC,EACxE,OAAmC,gBAAxBK,IAAqCH,GAAqBD,EAAWI,GAIpEH,IACDvkB,EAAW0kB,GADf,GAHNz2B,EAAQi2B,UAAU3nB,QAASmoB,GAC3BF,EAASE,IACF,KAKF1kB,EAGR,MAAOwkB,GAASv2B,EAAQi2B,UAAW,MAAUI,EAAW,MAASE,EAAS,KAM3E,QAASG,IAAYx2B,EAAQN,GAC5B,GAAIO,GAAMyB,EACT+0B,EAAch9B,EAAO06B,aAAasC,eAEnC,KAAM/0B,IAAOhC,GACPA,EAAKgC,KAAU1I,KACjBy9B,EAAa/0B,GAAQ1B,EAAWC,IAASA,OAAgByB,GAAQhC,EAAKgC,GAO1E,OAJKzB,IACJxG,EAAOgG,QAAQ,EAAMO,EAAQC,GAGvBD,EAGRvG,EAAOsB,GAAGqrB,KAAO,SAAUkI,EAAKoI,EAAQj4B,GACvC,GAAoB,gBAAR6vB,IAAoBkH,GAC/B,MAAOA,IAAM32B,MAAO9B,KAAM+B,UAG3B,IAAIjE,GAAU87B,EAAUv6B,EACvB+a,EAAOpa,KACPkE,EAAMqtB,EAAIh0B,QAAQ,IA+CnB,OA7CK2G,IAAO,IACXpG,EAAWyzB,EAAIl0B,MAAO6G,EAAKqtB,EAAIrxB,QAC/BqxB,EAAMA,EAAIl0B,MAAO,EAAG6G,IAIhBxH,EAAOiE,WAAYg5B,IAGvBj4B,EAAWi4B,EACXA,EAAS19B,GAGE09B,GAA4B,gBAAXA,KAC5Bt6B,EAAO,QAIH+a,EAAKla,OAAS,GAClBxD,EAAO80B,MACND,IAAKA,EAGLlyB,KAAMA,EACNoyB,SAAU,OACVtsB,KAAMw0B,IACJ93B,KAAK,SAAUg4B,GAGjBD,EAAW73B,UAEXqY,EAAKoV,KAAM1xB,EAIVpB,EAAO,SAASiyB,OAAQjyB,EAAO4D,UAAWu5B,IAAiBz5B,KAAMtC,GAGjE+7B,KAECC,SAAUp4B,GAAY,SAAUy3B,EAAOY,GACzC3f,EAAK3Y,KAAMC,EAAUk4B,IAAcT,EAAMU,aAAcE,EAAQZ,MAI1Dn5B,MAIRtD,EAAO+E,MAAQ,YAAa,WAAY,eAAgB,YAAa,cAAe,YAAc,SAAUU,EAAG9C,GAC9G3C,EAAOsB,GAAIqB,GAAS,SAAUrB,GAC7B,MAAOgC,MAAK6qB,GAAIxrB,EAAMrB,MAIxBtB,EAAOgG,QAGNs3B,OAAQ,EAGRC,gBACAC,QAEA9C,cACC7F,IAAKwG,GACL14B,KAAM,MACN86B,QAAS9B,GAAe53B,KAAMq3B,GAAc,IAC5C/S,QAAQ,EACRqV,aAAa,EACb/zB,OAAO,EACPg0B,YAAa,mDAabC,SACCC,IAAK3B,GACL3xB,KAAM,aACNuoB,KAAM,YACNxpB,IAAK,4BACLw0B,KAAM,qCAGPnP,UACCrlB,IAAK,MACLwpB,KAAM,OACNgL,KAAM,QAGPC,gBACCz0B,IAAK,cACLiB,KAAM,eACNuzB,KAAM,gBAKPE,YAGCC,SAAUj2B,OAGVk2B,aAAa,EAGbC,YAAan+B,EAAOiJ,UAGpBm1B,WAAYp+B,EAAOqJ,UAOpB2zB,aACCnI,KAAK,EACLxzB,SAAS,IAOXg9B,UAAW,SAAU93B,EAAQ+3B,GAC5B,MAAOA,GAGNvB,GAAYA,GAAYx2B,EAAQvG,EAAO06B,cAAgB4D,GAGvDvB,GAAY/8B,EAAO06B,aAAcn0B,IAGnCg4B,cAAepC,GAA6BH,IAC5CwC,cAAerC,GAA6BF,IAG5CnH,KAAM,SAAUD,EAAKxuB,GAGA,gBAARwuB,KACXxuB,EAAUwuB,EACVA,EAAMt1B,GAIP8G,EAAUA,KAEV,IACC0zB,GAEAt0B,EAEAg5B,EAEAC,EAEAC,EAGAC,EAEAC,EAEAC,EAEAtE,EAAIx6B,EAAOq+B,aAAeh4B,GAE1B04B,EAAkBvE,EAAEn5B,SAAWm5B,EAE/BwE,EAAqBxE,EAAEn5B,UAAa09B,EAAgBl7B,UAAYk7B,EAAgB77B,QAC/ElD,EAAQ++B,GACR/+B,EAAOyC,MAER4b,EAAWre,EAAOgM,WAClBizB,EAAmBj/B,EAAO8c,UAAU,eAEpCoiB,EAAa1E,EAAE0E,eAEfC,KACAC,KAEAjhB,EAAQ,EAERkhB,EAAW,WAEX5C,GACC75B,WAAY,EAGZ08B,kBAAmB,SAAUr3B,GAC5B,GAAI7E,EACJ,IAAe,IAAV+a,EAAc,CAClB,IAAM2gB,EAAkB,CACvBA,IACA,OAAS17B,EAAQs4B,GAASj4B,KAAMi7B,GAC/BI,EAAiB17B,EAAM,GAAGgH,eAAkBhH,EAAO,GAGrDA,EAAQ07B,EAAiB72B,EAAImC,eAE9B,MAAgB,OAAThH,EAAgB,KAAOA,GAI/Bm8B,sBAAuB,WACtB,MAAiB,KAAVphB,EAAcugB,EAAwB,MAI9Cc,iBAAkB,SAAUp5B,EAAMiE,GACjC,GAAIo1B,GAAQr5B,EAAKgE,aAKjB,OAJM+T,KACL/X,EAAOg5B,EAAqBK,GAAUL,EAAqBK,IAAWr5B,EACtE+4B,EAAgB/4B,GAASiE,GAEnB/G,MAIRo8B,iBAAkB,SAAU/8B,GAI3B,MAHMwb,KACLqc,EAAEmF,SAAWh9B,GAEPW,MAIR47B,WAAY,SAAUt5B,GACrB,GAAIg6B,EACJ,IAAKh6B,EACJ,GAAa,EAARuY,EACJ,IAAMyhB,IAAQh6B,GAEbs5B,EAAYU,IAAWV,EAAYU,GAAQh6B,EAAKg6B,QAIjDnD,GAAMre,OAAQxY,EAAK62B,EAAMY,QAG3B,OAAO/5B,OAIRu8B,MAAO,SAAUC,GAChB,GAAIC,GAAYD,GAAcT,CAK9B,OAJKR,IACJA,EAAUgB,MAAOE,GAElB56B,EAAM,EAAG46B,GACFz8B,MAwCV,IAnCA+a,EAASnZ,QAASu3B,GAAQW,SAAW6B,EAAiBrhB,IACtD6e,EAAMuD,QAAUvD,EAAMt3B,KACtBs3B,EAAMn0B,MAAQm0B,EAAMne,KAMpBkc,EAAE3F,MAAUA,GAAO2F,EAAE3F,KAAOwG,IAAiB,IAAKx0B,QAAS20B,GAAO,IAAK30B,QAASg1B,GAAWT,GAAc,GAAM,MAG/GZ,EAAE73B,KAAO0D,EAAQ45B,QAAU55B,EAAQ1D,MAAQ63B,EAAEyF,QAAUzF,EAAE73B,KAGzD63B,EAAE8B,UAAYt8B,EAAOmB,KAAMq5B,EAAEzF,UAAY,KAAM3qB,cAAchH,MAAO1B,KAAqB,IAGnE,MAAjB84B,EAAE0F,cACNnG,EAAQ+B,GAAKr4B,KAAM+2B,EAAE3F,IAAIzqB,eACzBowB,EAAE0F,eAAkBnG,GACjBA,EAAO,KAAQqB,GAAc,IAAOrB,EAAO,KAAQqB,GAAc,KAChErB,EAAO,KAAwB,UAAfA,EAAO,GAAkB,KAAO,WAC/CqB,GAAc,KAA+B,UAAtBA,GAAc,GAAkB,KAAO,UAK/DZ,EAAE/xB,MAAQ+xB,EAAEkD,aAAiC,gBAAXlD,GAAE/xB,OACxC+xB,EAAE/xB,KAAOzI,EAAOqxB,MAAOmJ,EAAE/xB,KAAM+xB,EAAED,cAIlCgC,GAA+BP,GAAYxB,EAAGn0B,EAASo2B,GAGxC,IAAVte,EACJ,MAAOse,EAIRmC,GAAcpE,EAAEnS,OAGXuW,GAAmC,IAApB5+B,EAAOs9B,UAC1Bt9B,EAAOyC,MAAM8E,QAAQ,aAItBizB,EAAE73B,KAAO63B,EAAE73B,KAAKJ,cAGhBi4B,EAAE2F,YAAcvE,GAAW73B,KAAMy2B,EAAE73B,MAInC87B,EAAWjE,EAAE3F,IAGP2F,EAAE2F,aAGF3F,EAAE/xB,OACNg2B,EAAajE,EAAE3F,MAAS0G,GAAYx3B,KAAM06B,GAAa,IAAM,KAAQjE,EAAE/xB,WAEhE+xB,GAAE/xB,MAIL+xB,EAAEhpB,SAAU,IAChBgpB,EAAE3F,IAAM4G,GAAI13B,KAAM06B,GAGjBA,EAAS53B,QAAS40B,GAAK,OAASH,MAGhCmD,GAAalD,GAAYx3B,KAAM06B,GAAa,IAAM,KAAQ,KAAOnD,OAK/Dd,EAAE4F,aACDpgC,EAAOu9B,aAAckB,IACzBhC,EAAM+C,iBAAkB,oBAAqBx/B,EAAOu9B,aAAckB,IAE9Dz+B,EAAOw9B,KAAMiB,IACjBhC,EAAM+C,iBAAkB,gBAAiBx/B,EAAOw9B,KAAMiB,MAKnDjE,EAAE/xB,MAAQ+xB,EAAE2F,YAAc3F,EAAEmD,eAAgB,GAASt3B,EAAQs3B,cACjElB,EAAM+C,iBAAkB,eAAgBhF,EAAEmD,aAI3ClB,EAAM+C,iBACL,SACAhF,EAAE8B,UAAW,IAAO9B,EAAEoD,QAASpD,EAAE8B,UAAU,IAC1C9B,EAAEoD,QAASpD,EAAE8B,UAAU,KAA8B,MAArB9B,EAAE8B,UAAW,GAAc,KAAOJ,GAAW,WAAa,IAC1F1B,EAAEoD,QAAS,KAIb,KAAMn4B,IAAK+0B,GAAE6F,QACZ5D,EAAM+C,iBAAkB/5B,EAAG+0B,EAAE6F,QAAS56B,GAIvC,IAAK+0B,EAAE8F,aAAgB9F,EAAE8F,WAAW97B,KAAMu6B,EAAiBtC,EAAOjC,MAAQ,GAAmB,IAAVrc,GAElF,MAAOse,GAAMoD,OAIdR,GAAW,OAGX,KAAM55B,KAAOu6B,QAAS,EAAG13B,MAAO,EAAG80B,SAAU,GAC5CX,EAAOh3B,GAAK+0B,EAAG/0B,GAOhB,IAHAo5B,EAAYtC,GAA+BN,GAAYzB,EAAGn0B,EAASo2B,GAK5D,CACNA,EAAM75B,WAAa,EAGdg8B,GACJI,EAAmBz3B,QAAS,YAAck1B,EAAOjC,IAG7CA,EAAE7wB,OAAS6wB,EAAE1V,QAAU,IAC3B6Z,EAAet3B,WAAW,WACzBo1B,EAAMoD,MAAM,YACVrF,EAAE1V,SAGN,KACC3G,EAAQ,EACR0gB,EAAU0B,KAAMpB,EAAgBh6B,GAC/B,MAAQ+C,GAET,KAAa,EAARiW,GAIJ,KAAMjW,EAHN/C,GAAM,GAAI+C,QArBZ/C,GAAM,GAAI,eA8BX,SAASA,GAAMk4B,EAAQmD,EAAkBC,EAAWJ,GACnD,GAAIK,GAAWV,EAAS13B,EAAO40B,EAAUyD,EACxCb,EAAaU,CAGC,KAAVriB,IAKLA,EAAQ,EAGHwgB,GACJ5Z,aAAc4Z,GAKfE,EAAYt/B,EAGZm/B,EAAwB2B,GAAW,GAGnC5D,EAAM75B,WAAay6B,EAAS,EAAI,EAAI,EAGpCqD,EAAYrD,GAAU,KAAgB,IAATA,GAA2B,MAAXA,EAGxCoD,IACJvD,EAAW0D,GAAqBpG,EAAGiC,EAAOgE,IAI3CvD,EAAW2D,GAAarG,EAAG0C,EAAUT,EAAOiE,GAGvCA,GAGClG,EAAE4F,aACNO,EAAWlE,EAAM6C,kBAAkB,iBAC9BqB,IACJ3gC,EAAOu9B,aAAckB,GAAakC,GAEnCA,EAAWlE,EAAM6C,kBAAkB,QAC9BqB,IACJ3gC,EAAOw9B,KAAMiB,GAAakC,IAKZ,MAAXtD,GAA6B,SAAX7C,EAAE73B,KACxBm9B,EAAa,YAGS,MAAXzC,EACXyC,EAAa,eAIbA,EAAa5C,EAAS/e,MACtB6hB,EAAU9C,EAASz0B,KACnBH,EAAQ40B,EAAS50B,MACjBo4B,GAAap4B,KAKdA,EAAQw3B,GACHzC,IAAWyC,KACfA,EAAa,QACC,EAATzC,IACJA,EAAS,KAMZZ,EAAMY,OAASA,EACfZ,EAAMqD,YAAeU,GAAoBV,GAAe,GAGnDY,EACJriB,EAAS/W,YAAay3B,GAAmBiB,EAASF,EAAYrD,IAE9Dpe,EAASyiB,WAAY/B,GAAmBtC,EAAOqD,EAAYx3B,IAI5Dm0B,EAAMyC,WAAYA,GAClBA,EAAa3/B,EAERq/B,GACJI,EAAmBz3B,QAASm5B,EAAY,cAAgB,aACrDjE,EAAOjC,EAAGkG,EAAYV,EAAU13B,IAIpC22B,EAAiBjhB,SAAU+gB,GAAmBtC,EAAOqD,IAEhDlB,IACJI,EAAmBz3B,QAAS,gBAAkBk1B,EAAOjC,MAE3Cx6B,EAAOs9B,QAChBt9B,EAAOyC,MAAM8E,QAAQ,cAKxB,MAAOk1B,IAGRsE,QAAS,SAAUlM,EAAKpsB,EAAMzD,GAC7B,MAAOhF,GAAOyE,IAAKowB,EAAKpsB,EAAMzD,EAAU,SAGzCg8B,UAAW,SAAUnM,EAAK7vB,GACzB,MAAOhF,GAAOyE,IAAKowB,EAAKt1B,EAAWyF,EAAU,aAI/ChF,EAAO+E,MAAQ,MAAO,QAAU,SAAUU,EAAGw6B,GAC5CjgC,EAAQigC,GAAW,SAAUpL,EAAKpsB,EAAMzD,EAAUrC,GAQjD,MANK3C,GAAOiE,WAAYwE,KACvB9F,EAAOA,GAAQqC,EACfA,EAAWyD,EACXA,EAAOlJ,GAGDS,EAAO80B,MACbD,IAAKA,EACLlyB,KAAMs9B,EACNlL,SAAUpyB,EACV8F,KAAMA,EACNu3B,QAASh7B,MASZ,SAAS47B,IAAqBpG,EAAGiC,EAAOgE,GACvC,GAAIQ,GAAeC,EAAIC,EAAex+B,EACrCgsB,EAAW6L,EAAE7L,SACb2N,EAAY9B,EAAE8B,SAGf,OAA0B,MAAnBA,EAAW,GACjBA,EAAU5qB,QACLwvB,IAAO3hC,IACX2hC,EAAK1G,EAAEmF,UAAYlD,EAAM6C,kBAAkB,gBAK7C,IAAK4B,EACJ,IAAMv+B,IAAQgsB,GACb,GAAKA,EAAUhsB,IAAUgsB,EAAUhsB,GAAOoB,KAAMm9B,GAAO,CACtD5E,EAAU3nB,QAAShS,EACnB,OAMH,GAAK25B,EAAW,IAAOmE,GACtBU,EAAgB7E,EAAW,OACrB,CAEN,IAAM35B,IAAQ89B,GAAY,CACzB,IAAMnE,EAAW,IAAO9B,EAAEwD,WAAYr7B,EAAO,IAAM25B,EAAU,IAAO,CACnE6E,EAAgBx+B,CAChB,OAEKs+B,IACLA,EAAgBt+B,GAIlBw+B,EAAgBA,GAAiBF,EAMlC,MAAKE,IACCA,IAAkB7E,EAAW,IACjCA,EAAU3nB,QAASwsB,GAEbV,EAAWU,IAJnB,EAWD,QAASN,IAAarG,EAAG0C,EAAUT,EAAOiE,GACzC,GAAIU,GAAOC,EAASC,EAAM/3B,EAAKqlB,EAC9BoP,KAEA1B,EAAY9B,EAAE8B,UAAU37B,OAGzB,IAAK27B,EAAW,GACf,IAAMgF,IAAQ9G,GAAEwD,WACfA,EAAYsD,EAAKl3B,eAAkBowB,EAAEwD,WAAYsD,EAInDD,GAAU/E,EAAU5qB,OAGpB,OAAQ2vB,EAcP,GAZK7G,EAAEuD,eAAgBsD,KACtB5E,EAAOjC,EAAEuD,eAAgBsD,IAAcnE,IAIlCtO,GAAQ8R,GAAalG,EAAE+G,aAC5BrE,EAAW1C,EAAE+G,WAAYrE,EAAU1C,EAAEzF,WAGtCnG,EAAOyS,EACPA,EAAU/E,EAAU5qB,QAKnB,GAAiB,MAAZ2vB,EAEJA,EAAUzS,MAGJ,IAAc,MAATA,GAAgBA,IAASyS,EAAU,CAM9C,GAHAC,EAAOtD,EAAYpP,EAAO,IAAMyS,IAAarD,EAAY,KAAOqD,IAG1DC,EACL,IAAMF,IAASpD,GAId,GADAz0B,EAAM63B,EAAM90B,MAAO,KACd/C,EAAK,KAAQ83B,IAGjBC,EAAOtD,EAAYpP,EAAO,IAAMrlB,EAAK,KACpCy0B,EAAY,KAAOz0B,EAAK,KACb,CAEN+3B,KAAS,EACbA,EAAOtD,EAAYoD,GAGRpD,EAAYoD,MAAY,IACnCC,EAAU93B,EAAK,GACf+yB,EAAU3nB,QAASpL,EAAK,IAEzB,OAOJ,GAAK+3B,KAAS,EAGb,GAAKA,GAAQ9G,EAAG,UACf0C,EAAWoE,EAAMpE,OAEjB,KACCA,EAAWoE,EAAMpE,GAChB,MAAQh1B,GACT,OAASiW,MAAO,cAAe7V,MAAOg5B,EAAOp5B,EAAI,sBAAwB0mB,EAAO,OAASyS,IAQ/F,OAASljB,MAAO,UAAW1V,KAAMy0B,GAGlCl9B,EAAOq+B,WACNT,SACC4D,OAAQ,6FAET7S,UACC6S,OAAQ,uBAETxD,YACCyD,cAAe,SAAUl3B,GAExB,MADAvK,GAAO+J,WAAYQ,GACZA,MAMVvK,EAAOu+B,cAAe,SAAU,SAAU/D,GACpCA,EAAEhpB,QAAUjS,IAChBi7B,EAAEhpB,OAAQ,GAENgpB,EAAE0F,cACN1F,EAAE73B,KAAO,MACT63B,EAAEnS,QAAS,KAKbroB,EAAOw+B,cAAe,SAAU,SAAShE,GAGxC,GAAKA,EAAE0F,YAAc,CAEpB,GAAIsB,GACHE,EAAO9hC,EAAS8hC,MAAQ1hC,EAAO,QAAQ,IAAMJ,EAASE,eAEvD,QAECygC,KAAM,SAAUxwB,EAAG/K,GAElBw8B,EAAS5hC,EAASiJ,cAAc,UAEhC24B,EAAO73B,OAAQ,EAEV6wB,EAAEmH,gBACNH,EAAOI,QAAUpH,EAAEmH,eAGpBH,EAAOv7B,IAAMu0B,EAAE3F,IAGf2M,EAAOK,OAASL,EAAOM,mBAAqB,SAAU/xB,EAAGgyB,IAEnDA,IAAYP,EAAO5+B,YAAc,kBAAkBmB,KAAMy9B,EAAO5+B,eAGpE4+B,EAAOK,OAASL,EAAOM,mBAAqB,KAGvCN,EAAOp9B,YACXo9B,EAAOp9B,WAAW0N,YAAa0vB,GAIhCA,EAAS,KAGHO,GACL/8B,EAAU,IAAK,aAOlB08B,EAAKpP,aAAckP,EAAQE,EAAKruB,aAGjCwsB,MAAO,WACD2B,GACJA,EAAOK,OAAQtiC,GAAW,OAM/B,IAAIyiC,OACHC,GAAS,mBAGVjiC,GAAOq+B,WACN6D,MAAO,WACPC,cAAe,WACd,GAAIn9B,GAAWg9B,GAAa/zB,OAAWjO,EAAO0G,QAAU,IAAQ40B,IAEhE,OADAh4B,MAAM0B,IAAa,EACZA,KAKThF,EAAOu+B,cAAe,aAAc,SAAU/D,EAAG4H,EAAkB3F,GAElE,GAAI4F,GAAcC,EAAaC,EAC9BC,EAAWhI,EAAE0H,SAAU,IAAWD,GAAOl+B,KAAMy2B,EAAE3F,KAChD,MACkB,gBAAX2F,GAAE/xB,QAAwB+xB,EAAEmD,aAAe,IAAK98B,QAAQ,sCAAwCohC,GAAOl+B,KAAMy2B,EAAE/xB,OAAU,OAIlI,OAAK+5B,IAAiC,UAArBhI,EAAE8B,UAAW,IAG7B+F,EAAe7H,EAAE2H,cAAgBniC,EAAOiE,WAAYu2B,EAAE2H,eACrD3H,EAAE2H,gBACF3H,EAAE2H,cAGEK,EACJhI,EAAGgI,GAAahI,EAAGgI,GAAW37B,QAASo7B,GAAQ,KAAOI,GAC3C7H,EAAE0H,SAAU,IACvB1H,EAAE3F,MAAS0G,GAAYx3B,KAAMy2B,EAAE3F,KAAQ,IAAM,KAAQ2F,EAAE0H,MAAQ,IAAMG,GAItE7H,EAAEwD,WAAW,eAAiB,WAI7B,MAHMuE,IACLviC,EAAOsI,MAAO+5B,EAAe,mBAEvBE,EAAmB,IAI3B/H,EAAE8B,UAAW,GAAM,OAGnBgG,EAAchjC,EAAQ+iC,GACtB/iC,EAAQ+iC,GAAiB,WACxBE,EAAoBl9B,WAIrBo3B,EAAMre,OAAO,WAEZ9e,EAAQ+iC,GAAiBC,EAGpB9H,EAAG6H,KAEP7H,EAAE2H,cAAgBC,EAAiBD,cAGnCH,GAAavhC,KAAM4hC,IAIfE,GAAqBviC,EAAOiE,WAAYq+B,IAC5CA,EAAaC,EAAmB,IAGjCA,EAAoBD,EAAc/iC,IAI5B,UAtDR,GAyDD,IAAIkjC,IAAcC,GACjBC,GAAQ,EAERC,GAAmBtjC,EAAOoK,eAAiB,WAE1C,GAAIzB,EACJ,KAAMA,IAAOw6B,IACZA,GAAcx6B,GAAO1I,GAAW,GAKnC,SAASsjC,MACR,IACC,MAAO,IAAIvjC,GAAOwjC,eACjB,MAAO56B,KAGV,QAAS66B,MACR,IACC,MAAO,IAAIzjC,GAAOoK,cAAc,qBAC/B,MAAOxB,KAKVlI,EAAO06B,aAAasI,IAAM1jC,EAAOoK,cAOhC,WACC,OAAQpG,KAAKm6B,SAAWoF,MAAuBE,MAGhDF,GAGDH,GAAe1iC,EAAO06B,aAAasI,MACnChjC,EAAOmI,QAAQ86B,OAASP,IAAkB,mBAAqBA,IAC/DA,GAAe1iC,EAAOmI,QAAQ2sB,OAAS4N,GAGlCA,IAEJ1iC,EAAOw+B,cAAc,SAAUhE,GAE9B,IAAMA,EAAE0F,aAAelgC,EAAOmI,QAAQ86B,KAAO,CAE5C,GAAIj+B,EAEJ,QACCu7B,KAAM,SAAUF,EAASjD,GAGxB,GAAInU,GAAQxjB,EACXu9B,EAAMxI,EAAEwI,KAWT,IAPKxI,EAAE0I,SACNF,EAAIG,KAAM3I,EAAE73B,KAAM63B,EAAE3F,IAAK2F,EAAE7wB,MAAO6wB,EAAE0I,SAAU1I,EAAExhB,UAEhDgqB,EAAIG,KAAM3I,EAAE73B,KAAM63B,EAAE3F,IAAK2F,EAAE7wB,OAIvB6wB,EAAE4I,UACN,IAAM39B,IAAK+0B,GAAE4I,UACZJ,EAAKv9B,GAAM+0B,EAAE4I,UAAW39B,EAKrB+0B,GAAEmF,UAAYqD,EAAItD,kBACtBsD,EAAItD,iBAAkBlF,EAAEmF,UAQnBnF,EAAE0F,aAAgBG,EAAQ,sBAC/BA,EAAQ,oBAAsB,iBAI/B,KACC,IAAM56B,IAAK46B,GACV2C,EAAIxD,iBAAkB/5B,EAAG46B,EAAS56B,IAElC,MAAO2iB,IAKT4a,EAAIzC,KAAQ/F,EAAE2F,YAAc3F,EAAE/xB,MAAU,MAGxCzD,EAAW,SAAU+K,EAAGgyB,GACvB,GAAI1E,GAAQyB,EAAiBgB,EAAYW,CAKzC,KAGC,GAAKz7B,IAAc+8B,GAA8B,IAAnBiB,EAAIpgC,YAcjC,GAXAoC,EAAWzF,EAGN0pB,IACJ+Z,EAAIlB,mBAAqB9hC,EAAO8J,KAC3B84B,UACGH,IAAcxZ,IAKlB8Y,EAEoB,IAAnBiB,EAAIpgC,YACRogC,EAAInD,YAEC,CACNY,KACApD,EAAS2F,EAAI3F,OACbyB,EAAkBkE,EAAIzD,wBAIW,gBAArByD,GAAI7F,eACfsD,EAAUl2B,KAAOy4B,EAAI7F,aAKtB,KACC2C,EAAakD,EAAIlD,WAChB,MAAO53B,GAER43B,EAAa,GAQRzC,IAAU7C,EAAEiD,SAAYjD,EAAE0F,YAGT,OAAX7C,IACXA,EAAS,KAHTA,EAASoD,EAAUl2B,KAAO,IAAM,KAOlC,MAAO84B,GACFtB,GACL3E,EAAU,GAAIiG,GAKX5C,GACJrD,EAAUC,EAAQyC,EAAYW,EAAW3B,IAIrCtE,EAAE7wB,MAGuB,IAAnBq5B,EAAIpgC,WAGfyE,WAAYrC,IAEZikB,IAAW0Z,GACNC,KAGEH,KACLA,MACAziC,EAAQV,GAASgkC,OAAQV,KAG1BH,GAAcxZ,GAAWjkB,GAE1Bg+B,EAAIlB,mBAAqB98B,GAjBzBA,KAqBF66B,MAAO,WACD76B,GACJA,EAAUzF,GAAW,OAO3B,IAAIgkC,IAAOC,GACVC,GAAW,yBACXC,GAAaj1B,OAAQ,iBAAmBjN,EAAY,cAAe,KACnEmiC,GAAO,cACPC,IAAwBC,IACxBC,IACCjG,KAAM,SAAUjY,EAAMvb,GACrB,GAAI05B,GAAQzgC,KAAK0gC,YAAape,EAAMvb,GACnC9D,EAASw9B,EAAM3xB,MACf2nB,EAAQ2J,GAAOjgC,KAAM4G,GACrB45B,EAAOlK,GAASA,EAAO,KAAS/5B,EAAOw3B,UAAW5R,GAAS,GAAK,MAGhEhP,GAAU5W,EAAOw3B,UAAW5R,IAAmB,OAATqe,IAAkB19B,IACvDm9B,GAAOjgC,KAAMzD,EAAO82B,IAAKiN,EAAM1gC,KAAMuiB,IACtCse,EAAQ,EACRC,EAAgB,EAEjB,IAAKvtB,GAASA,EAAO,KAAQqtB,EAAO,CAEnCA,EAAOA,GAAQrtB,EAAO,GAGtBmjB,EAAQA,MAGRnjB,GAASrQ,GAAU,CAEnB,GAGC29B,GAAQA,GAAS,KAGjBttB,GAAgBstB,EAChBlkC,EAAO+L,MAAOg4B,EAAM1gC,KAAMuiB,EAAMhP,EAAQqtB,SAI/BC,KAAWA,EAAQH,EAAM3xB,MAAQ7L,IAAqB,IAAV29B,KAAiBC,GAaxE,MATKpK,KACJnjB,EAAQmtB,EAAMntB,OAASA,IAAUrQ,GAAU,EAC3Cw9B,EAAME,KAAOA,EAEbF,EAAMl+B,IAAMk0B,EAAO,GAClBnjB,GAAUmjB,EAAO,GAAM,GAAMA,EAAO,IACnCA,EAAO,IAGHgK,IAKV,SAASK,MAIR,MAHA/8B,YAAW,WACVk8B,GAAQhkC,IAEAgkC,GAAQvjC,EAAO0L,MAGzB,QAASs4B,IAAa35B,EAAOub,EAAMye,GAClC,GAAIN,GACHO,GAAeR,GAAUle,QAAerlB,OAAQujC,GAAU,MAC1DjmB,EAAQ,EACRra,EAAS8gC,EAAW9gC,MACrB,MAAgBA,EAARqa,EAAgBA,IACvB,GAAMkmB,EAAQO,EAAYzmB,GAAQrZ,KAAM6/B,EAAWze,EAAMvb,GAGxD,MAAO05B,GAKV,QAASQ,IAAWlhC,EAAMmhC,EAAYn+B,GACrC,GAAIgQ,GACHouB,EACA5mB,EAAQ,EACRra,EAASogC,GAAoBpgC,OAC7B6a,EAAWre,EAAOgM,WAAWoS,OAAQ,iBAE7BsmB,GAAKrhC,OAEbqhC,EAAO,WACN,GAAKD,EACJ,OAAO,CAER,IAAIE,GAAcpB,IAASa,KAC1B9kB,EAAY3Y,KAAKiE,IAAK,EAAGy5B,EAAUO,UAAYP,EAAUQ,SAAWF,GAEpElqB,EAAO6E,EAAY+kB,EAAUQ,UAAY,EACzCC,EAAU,EAAIrqB,EACdoD,EAAQ,EACRra,EAAS6gC,EAAUU,OAAOvhC,MAE3B,MAAgBA,EAARqa,EAAiBA,IACxBwmB,EAAUU,OAAQlnB,GAAQmnB,IAAKF,EAKhC,OAFAzmB,GAASqB,WAAYrc,GAAQghC,EAAWS,EAASxlB,IAElC,EAAVwlB,GAAethC,EACZ8b,GAEPjB,EAAS/W,YAAajE,GAAQghC,KACvB,IAGTA,EAAYhmB,EAASnZ,SACpB7B,KAAMA,EACNmoB,MAAOxrB,EAAOgG,UAAYw+B,GAC1BS,KAAMjlC,EAAOgG,QAAQ,GAAQk/B,kBAAqB7+B,GAClD8+B,mBAAoBX,EACpBhI,gBAAiBn2B,EACjBu+B,UAAWrB,IAASa,KACpBS,SAAUx+B,EAAQw+B,SAClBE,UACAf,YAAa,SAAUpe,EAAM/f,GAC5B,GAAIk+B,GAAQ/jC,EAAOolC,MAAO/hC,EAAMghC,EAAUY,KAAMrf,EAAM/f,EACpDw+B,EAAUY,KAAKC,cAAetf,IAAUye,EAAUY,KAAKI,OAEzD,OADAhB,GAAUU,OAAOtkC,KAAMsjC,GAChBA,GAERvf,KAAM,SAAU8gB,GACf,GAAIznB,GAAQ,EAGXra,EAAS8hC,EAAUjB,EAAUU,OAAOvhC,OAAS,CAC9C,IAAKihC,EACJ,MAAOnhC,KAGR,KADAmhC,GAAU,EACMjhC,EAARqa,EAAiBA,IACxBwmB,EAAUU,OAAQlnB,GAAQmnB,IAAK,EAUhC,OALKM,GACJjnB,EAAS/W,YAAajE,GAAQghC,EAAWiB,IAEzCjnB,EAASyiB,WAAYz9B,GAAQghC,EAAWiB,IAElChiC,QAGTkoB,EAAQ6Y,EAAU7Y,KAInB,KAFA+Z,GAAY/Z,EAAO6Y,EAAUY,KAAKC,eAElB1hC,EAARqa,EAAiBA,IAExB,GADAxH,EAASutB,GAAqB/lB,GAAQrZ,KAAM6/B,EAAWhhC,EAAMmoB,EAAO6Y,EAAUY,MAE7E,MAAO5uB,EAmBT,OAfArW,GAAO4F,IAAK4lB,EAAOwY,GAAaK,GAE3BrkC,EAAOiE,WAAYogC,EAAUY,KAAKruB,QACtCytB,EAAUY,KAAKruB,MAAMpS,KAAMnB,EAAMghC,GAGlCrkC,EAAO4kB,GAAG4gB,MACTxlC,EAAOgG,OAAQ0+B,GACdrhC,KAAMA,EACNoiC,KAAMpB,EACNngB,MAAOmgB,EAAUY,KAAK/gB,SAKjBmgB,EAAUtlB,SAAUslB,EAAUY,KAAKlmB,UACxC5Z,KAAMk/B,EAAUY,KAAK9/B,KAAMk/B,EAAUY,KAAK7H,UAC1C9e,KAAM+lB,EAAUY,KAAK3mB,MACrBF,OAAQimB,EAAUY,KAAK7mB,QAG1B,QAASmnB,IAAY/Z,EAAO0Z,GAC3B,GAAIrnB,GAAOzX,EAAMi/B,EAAQh7B,EAAOga,CAGhC,KAAMxG,IAAS2N,GAed,GAdAplB,EAAOpG,EAAOiK,UAAW4T,GACzBwnB,EAASH,EAAe9+B,GACxBiE,EAAQmhB,EAAO3N,GACV7d,EAAOyG,QAAS4D,KACpBg7B,EAASh7B,EAAO,GAChBA,EAAQmhB,EAAO3N,GAAUxT,EAAO,IAG5BwT,IAAUzX,IACdolB,EAAOplB,GAASiE,QACTmhB,GAAO3N,IAGfwG,EAAQrkB,EAAOs3B,SAAUlxB,GACpBie,GAAS,UAAYA,GAAQ,CACjCha,EAAQga,EAAMwV,OAAQxvB,SACfmhB,GAAOplB,EAId,KAAMyX,IAASxT,GACNwT,IAAS2N,KAChBA,EAAO3N,GAAUxT,EAAOwT,GACxBqnB,EAAernB,GAAUwnB,OAI3BH,GAAe9+B,GAASi/B,EAK3BrlC,EAAOukC,UAAYvkC,EAAOgG,OAAQu+B,IAEjCmB,QAAS,SAAUla,EAAOxmB,GACpBhF,EAAOiE,WAAYunB,IACvBxmB,EAAWwmB,EACXA,GAAU,MAEVA,EAAQA,EAAMlf,MAAM,IAGrB,IAAIsZ,GACH/H,EAAQ,EACRra,EAASgoB,EAAMhoB,MAEhB,MAAgBA,EAARqa,EAAiBA,IACxB+H,EAAO4F,EAAO3N,GACdimB,GAAUle,GAASke,GAAUle,OAC7Bke,GAAUle,GAAOjR,QAAS3P,IAI5B2gC,UAAW,SAAU3gC,EAAUqtB,GACzBA,EACJuR,GAAoBjvB,QAAS3P,GAE7B4+B,GAAoBnjC,KAAMuE,KAK7B,SAAS6+B,IAAkBxgC,EAAMmoB,EAAOyZ,GAEvC,GAAIrf,GAAMvb,EAAOgtB,EAAQ0M,EAAO1f,EAAOuhB,EACtCH,EAAOniC,KACPmqB,KACA1hB,EAAQ1I,EAAK0I,MACbkrB,EAAS5zB,EAAKQ,UAAY+yB,GAAUvzB,GACpCwiC,EAAW7lC,EAAO+jB,MAAO1gB,EAAM,SAG1B4hC,GAAK/gB,QACVG,EAAQrkB,EAAOskB,YAAajhB,EAAM,MACX,MAAlBghB,EAAMyhB,WACVzhB,EAAMyhB,SAAW,EACjBF,EAAUvhB,EAAM/L,MAAMkF,KACtB6G,EAAM/L,MAAMkF,KAAO,WACZ6G,EAAMyhB,UACXF,MAIHvhB,EAAMyhB,WAENL,EAAKrnB,OAAO,WAGXqnB,EAAKrnB,OAAO,WACXiG,EAAMyhB,WACA9lC,EAAOkkB,MAAO7gB,EAAM,MAAOG,QAChC6gB,EAAM/L,MAAMkF,YAOO,IAAlBna,EAAKQ,WAAoB,UAAY2nB,IAAS,SAAWA,MAK7DyZ,EAAKc,UAAah6B,EAAMg6B,SAAUh6B,EAAMi6B,UAAWj6B,EAAMk6B,WAIlB,WAAlCjmC,EAAO82B,IAAKzzB,EAAM,YACW,SAAhCrD,EAAO82B,IAAKzzB,EAAM,WAIbrD,EAAOmI,QAAQ4Y,wBAAkE,WAAxCmW,GAAoB7zB,EAAK8G,UAIvE4B,EAAMyW,KAAO,EAHbzW,EAAMuW,QAAU,iBAQd2iB,EAAKc,WACTh6B,EAAMg6B,SAAW,SACX/lC,EAAOmI,QAAQ6Y,kBACpBykB,EAAKrnB,OAAO,WACXrS,EAAMg6B,SAAWd,EAAKc,SAAU,GAChCh6B,EAAMi6B,UAAYf,EAAKc,SAAU,GACjCh6B,EAAMk6B,UAAYhB,EAAKc,SAAU,KAOpC,KAAMngB,IAAQ4F,GAEb,GADAnhB,EAAQmhB,EAAO5F,GACV6d,GAAShgC,KAAM4G,GAAU,CAG7B,SAFOmhB,GAAO5F,GACdyR,EAASA,GAAoB,WAAVhtB,EACdA,KAAY4sB,EAAS,OAAS,QAClC,QAEDxJ,GAAM7H,GAASigB,GAAYA,EAAUjgB,IAAU5lB,EAAO+L,MAAO1I,EAAMuiB,GAIrE,IAAM5lB,EAAOqI,cAAeolB,GAAS,CAC/BoY,EACC,UAAYA,KAChB5O,EAAS4O,EAAS5O,QAGnB4O,EAAW7lC,EAAO+jB,MAAO1gB,EAAM,aAI3Bg0B,IACJwO,EAAS5O,QAAUA,GAEfA,EACJj3B,EAAQqD,GAAO2zB,OAEfyO,EAAKtgC,KAAK,WACTnF,EAAQqD,GAAO+zB,SAGjBqO,EAAKtgC,KAAK,WACT,GAAIygB,EACJ5lB,GAAOgkB,YAAa3gB,EAAM,SAC1B,KAAMuiB,IAAQ6H,GACbztB,EAAO+L,MAAO1I,EAAMuiB,EAAM6H,EAAM7H,KAGlC,KAAMA,IAAQ6H,GACbsW,EAAQC,GAAa/M,EAAS4O,EAAUjgB,GAAS,EAAGA,EAAM6f,GAElD7f,IAAQigB,KACfA,EAAUjgB,GAASme,EAAMntB,MACpBqgB,IACJ8M,EAAMl+B,IAAMk+B,EAAMntB,MAClBmtB,EAAMntB,MAAiB,UAATgP,GAA6B,WAATA,EAAoB,EAAI,KAO/D,QAASwf,IAAO/hC,EAAMgD,EAASuf,EAAM/f,EAAKw/B,GACzC,MAAO,IAAID,IAAMniC,UAAU1B,KAAM8B,EAAMgD,EAASuf,EAAM/f,EAAKw/B,GAE5DrlC,EAAOolC,MAAQA,GAEfA,GAAMniC,WACLE,YAAaiiC,GACb7jC,KAAM,SAAU8B,EAAMgD,EAASuf,EAAM/f,EAAKw/B,EAAQpB,GACjD3gC,KAAKD,KAAOA,EACZC,KAAKsiB,KAAOA,EACZtiB,KAAK+hC,OAASA,GAAU,QACxB/hC,KAAK+C,QAAUA,EACf/C,KAAKsT,MAAQtT,KAAKoI,IAAMpI,KAAK8O,MAC7B9O,KAAKuC,IAAMA,EACXvC,KAAK2gC,KAAOA,IAAUjkC,EAAOw3B,UAAW5R,GAAS,GAAK,OAEvDxT,IAAK,WACJ,GAAIiS,GAAQ+gB,GAAMhe,UAAW9jB,KAAKsiB,KAElC,OAAOvB,IAASA,EAAM5f,IACrB4f,EAAM5f,IAAKnB,MACX8hC,GAAMhe,UAAUqD,SAAShmB,IAAKnB,OAEhC0hC,IAAK,SAAUF,GACd,GAAIoB,GACH7hB,EAAQ+gB,GAAMhe,UAAW9jB,KAAKsiB,KAoB/B,OAjBCtiB,MAAK2rB,IAAMiX,EADP5iC,KAAK+C,QAAQw+B,SACE7kC,EAAOqlC,OAAQ/hC,KAAK+hC,QACtCP,EAASxhC,KAAK+C,QAAQw+B,SAAWC,EAAS,EAAG,EAAGxhC,KAAK+C,QAAQw+B,UAG3CC,EAEpBxhC,KAAKoI,KAAQpI,KAAKuC,IAAMvC,KAAKsT,OAAUsvB,EAAQ5iC,KAAKsT,MAE/CtT,KAAK+C,QAAQ8/B,MACjB7iC,KAAK+C,QAAQ8/B,KAAK3hC,KAAMlB,KAAKD,KAAMC,KAAKoI,IAAKpI,MAGzC+gB,GAASA,EAAMoC,IACnBpC,EAAMoC,IAAKnjB,MAEX8hC,GAAMhe,UAAUqD,SAAShE,IAAKnjB,MAExBA,OAIT8hC,GAAMniC,UAAU1B,KAAK0B,UAAYmiC,GAAMniC,UAEvCmiC,GAAMhe,WACLqD,UACChmB,IAAK,SAAUs/B,GACd,GAAI1tB,EAEJ,OAAiC,OAA5B0tB,EAAM1gC,KAAM0gC,EAAMne,OACpBme,EAAM1gC,KAAK0I,OAA2C,MAAlCg4B,EAAM1gC,KAAK0I,MAAOg4B,EAAMne,OAQ/CvP,EAASrW,EAAO82B,IAAKiN,EAAM1gC,KAAM0gC,EAAMne,KAAM,IAErCvP,GAAqB,SAAXA,EAAwBA,EAAJ,GAT9B0tB,EAAM1gC,KAAM0gC,EAAMne,OAW3Ba,IAAK,SAAUsd,GAGT/jC,EAAO4kB,GAAGuhB,KAAMpC,EAAMne,MAC1B5lB,EAAO4kB,GAAGuhB,KAAMpC,EAAMne,MAAQme,GACnBA,EAAM1gC,KAAK0I,QAAgE,MAArDg4B,EAAM1gC,KAAK0I,MAAO/L,EAAOg4B,SAAU+L,EAAMne,QAAoB5lB,EAAOs3B,SAAUyM,EAAMne,OACrH5lB,EAAO+L,MAAOg4B,EAAM1gC,KAAM0gC,EAAMne,KAAMme,EAAMr4B,IAAMq4B,EAAME,MAExDF,EAAM1gC,KAAM0gC,EAAMne,MAASme,EAAMr4B,OASrC05B,GAAMhe,UAAUmF,UAAY6Y,GAAMhe,UAAU+E,YAC3C1F,IAAK,SAAUsd,GACTA,EAAM1gC,KAAKQ,UAAYkgC,EAAM1gC,KAAKe,aACtC2/B,EAAM1gC,KAAM0gC,EAAMne,MAASme,EAAMr4B,OAKpC1L,EAAO+E,MAAO,SAAU,OAAQ,QAAU,SAAUU,EAAGW,GACtD,GAAIggC,GAAQpmC,EAAOsB,GAAI8E,EACvBpG,GAAOsB,GAAI8E,GAAS,SAAUigC,EAAOhB,EAAQrgC,GAC5C,MAAgB,OAATqhC,GAAkC,iBAAVA,GAC9BD,EAAMhhC,MAAO9B,KAAM+B,WACnB/B,KAAKgjC,QAASC,GAAOngC,GAAM,GAAQigC,EAAOhB,EAAQrgC,MAIrDhF,EAAOsB,GAAG0E,QACTwgC,OAAQ,SAAUH,EAAOI,EAAIpB,EAAQrgC,GAGpC,MAAO1B,MAAKkQ,OAAQojB,IAAWE,IAAK,UAAW,GAAIE,OAGjDnxB,MAAMygC,SAAU/lB,QAASkmB,GAAMJ,EAAOhB,EAAQrgC,IAEjDshC,QAAS,SAAU1gB,EAAMygB,EAAOhB,EAAQrgC,GACvC,GAAIsT,GAAQtY,EAAOqI,cAAeud,GACjC8gB,EAAS1mC,EAAOqmC,MAAOA,EAAOhB,EAAQrgC,GACtC2hC,EAAc,WAEb,GAAIlB,GAAOlB,GAAWjhC,KAAMtD,EAAOgG,UAAY4f,GAAQ8gB,IAGlDpuB,GAAStY,EAAO+jB,MAAOzgB,KAAM,YACjCmiC,EAAKjhB,MAAM,GAKd,OAFCmiB,GAAYC,OAASD,EAEfruB,GAASouB,EAAOxiB,SAAU,EAChC5gB,KAAKyB,KAAM4hC,GACXrjC,KAAK4gB,MAAOwiB,EAAOxiB,MAAOyiB,IAE5BniB,KAAM,SAAU7hB,EAAMqiB,EAAYsgB,GACjC,GAAIuB,GAAY,SAAUxiB,GACzB,GAAIG,GAAOH,EAAMG,WACVH,GAAMG,KACbA,EAAM8gB,GAYP,OATqB,gBAAT3iC,KACX2iC,EAAUtgB,EACVA,EAAariB,EACbA,EAAOpD,GAEHylB,GAAcriB,KAAS,GAC3BW,KAAK4gB,MAAOvhB,GAAQ,SAGdW,KAAKyB,KAAK,WAChB,GAAIof,IAAU,EACbtG,EAAgB,MAARlb,GAAgBA,EAAO,aAC/BmkC,EAAS9mC,EAAO8mC,OAChBr+B,EAAOzI,EAAO+jB,MAAOzgB,KAEtB,IAAKua,EACCpV,EAAMoV,IAAWpV,EAAMoV,GAAQ2G,MACnCqiB,EAAWp+B,EAAMoV,QAGlB,KAAMA,IAASpV,GACTA,EAAMoV,IAAWpV,EAAMoV,GAAQ2G,MAAQmf,GAAK5/B,KAAM8Z,IACtDgpB,EAAWp+B,EAAMoV,GAKpB,KAAMA,EAAQipB,EAAOtjC,OAAQqa,KACvBipB,EAAQjpB,GAAQxa,OAASC,MAAiB,MAARX,GAAgBmkC,EAAQjpB,GAAQqG,QAAUvhB,IAChFmkC,EAAQjpB,GAAQ4nB,KAAKjhB,KAAM8gB,GAC3BnhB,GAAU,EACV2iB,EAAO/gC,OAAQ8X,EAAO,KAOnBsG,IAAYmhB,IAChBtlC,EAAOmkB,QAAS7gB,KAAMX,MAIzBikC,OAAQ,SAAUjkC,GAIjB,MAHKA,MAAS,IACbA,EAAOA,GAAQ,MAETW,KAAKyB,KAAK,WAChB,GAAI8Y,GACHpV,EAAOzI,EAAO+jB,MAAOzgB,MACrB4gB,EAAQzb,EAAM9F,EAAO,SACrB0hB,EAAQ5b,EAAM9F,EAAO,cACrBmkC,EAAS9mC,EAAO8mC,OAChBtjC,EAAS0gB,EAAQA,EAAM1gB,OAAS,CAajC,KAVAiF,EAAKm+B,QAAS,EAGd5mC,EAAOkkB,MAAO5gB,KAAMX,MAEf0hB,GAASA,EAAMG,MACnBH,EAAMG,KAAKhgB,KAAMlB,MAAM,GAIlBua,EAAQipB,EAAOtjC,OAAQqa,KACvBipB,EAAQjpB,GAAQxa,OAASC,MAAQwjC,EAAQjpB,GAAQqG,QAAUvhB,IAC/DmkC,EAAQjpB,GAAQ4nB,KAAKjhB,MAAM,GAC3BsiB,EAAO/gC,OAAQ8X,EAAO,GAKxB,KAAMA,EAAQ,EAAWra,EAARqa,EAAgBA,IAC3BqG,EAAOrG,IAAWqG,EAAOrG,GAAQ+oB,QACrC1iB,EAAOrG,GAAQ+oB,OAAOpiC,KAAMlB,YAKvBmF,GAAKm+B,WAMf,SAASL,IAAO5jC,EAAMokC,GACrB,GAAInb,GACH5Z,GAAUg1B,OAAQrkC,GAClB8C,EAAI,CAKL,KADAshC,EAAeA,EAAc,EAAI,EACtB,EAAJthC,EAAQA,GAAK,EAAIshC,EACvBnb,EAAQ2K,GAAW9wB,GACnBuM,EAAO,SAAW4Z,GAAU5Z,EAAO,UAAY4Z,GAAUjpB,CAO1D,OAJKokC,KACJ/0B,EAAMuO,QAAUvO,EAAM4Q,MAAQjgB,GAGxBqP,EAIRhS,EAAO+E,MACNkiC,UAAWV,GAAM,QACjBW,QAASX,GAAM,QACfY,YAAaZ,GAAM,UACnBa,QAAU7mB,QAAS,QACnB8mB,SAAW9mB,QAAS,QACpB+mB,YAAc/mB,QAAS,WACrB,SAAUna,EAAMolB,GAClBxrB,EAAOsB,GAAI8E,GAAS,SAAUigC,EAAOhB,EAAQrgC,GAC5C,MAAO1B,MAAKgjC,QAAS9a,EAAO6a,EAAOhB,EAAQrgC,MAI7ChF,EAAOqmC,MAAQ,SAAUA,EAAOhB,EAAQ/jC,GACvC,GAAIwe,GAAMumB,GAA0B,gBAAVA,GAAqBrmC,EAAOgG,UAAYqgC,IACjEjJ,SAAU97B,IAAOA,GAAM+jC,GACtBrlC,EAAOiE,WAAYoiC,IAAWA,EAC/BxB,SAAUwB,EACVhB,OAAQ/jC,GAAM+jC,GAAUA,IAAWrlC,EAAOiE,WAAYohC,IAAYA,EAwBnE,OArBAvlB,GAAI+kB,SAAW7kC,EAAO4kB,GAAGpd,IAAM,EAA4B,gBAAjBsY,GAAI+kB,SAAwB/kB,EAAI+kB,SACzE/kB,EAAI+kB,WAAY7kC,GAAO4kB,GAAGC,OAAS7kB,EAAO4kB,GAAGC,OAAQ/E,EAAI+kB,UAAa7kC,EAAO4kB,GAAGC,OAAO4F,UAGtE,MAAb3K,EAAIoE,OAAiBpE,EAAIoE,SAAU,KACvCpE,EAAIoE,MAAQ,MAIbpE,EAAIhU,IAAMgU,EAAIsd,SAEdtd,EAAIsd,SAAW,WACTp9B,EAAOiE,WAAY6b,EAAIhU,MAC3BgU,EAAIhU,IAAItH,KAAMlB,MAGVwc,EAAIoE,OACRlkB,EAAOmkB,QAAS7gB,KAAMwc,EAAIoE,QAIrBpE,GAGR9f,EAAOqlC,QACNkC,OAAQ,SAAUC,GACjB,MAAOA,IAERC,MAAO,SAAUD,GAChB,MAAO,GAAM7gC,KAAK+gC,IAAKF,EAAE7gC,KAAKghC,IAAO,IAIvC3nC,EAAO8mC,UACP9mC,EAAO4kB,GAAKwgB,GAAMniC,UAAU1B,KAC5BvB,EAAO4kB,GAAG8f,KAAO,WAChB,GAAIc,GACHsB,EAAS9mC,EAAO8mC,OAChBrhC,EAAI,CAIL,KAFA89B,GAAQvjC,EAAO0L,MAEHo7B,EAAOtjC,OAAXiC,EAAmBA,IAC1B+/B,EAAQsB,EAAQrhC,GAEV+/B,KAAWsB,EAAQrhC,KAAQ+/B,GAChCsB,EAAO/gC,OAAQN,IAAK,EAIhBqhC,GAAOtjC,QACZxD,EAAO4kB,GAAGJ,OAEX+e,GAAQhkC,GAGTS,EAAO4kB,GAAG4gB,MAAQ,SAAUA,GACtBA,KAAWxlC,EAAO8mC,OAAOrmC,KAAM+kC,IACnCxlC,EAAO4kB,GAAGhO,SAIZ5W,EAAO4kB,GAAGgjB,SAAW,GAErB5nC,EAAO4kB,GAAGhO,MAAQ,WACX4sB,KACLA,GAAUqE,YAAa7nC,EAAO4kB,GAAG8f,KAAM1kC,EAAO4kB,GAAGgjB,YAInD5nC,EAAO4kB,GAAGJ,KAAO,WAChBsjB,cAAetE,IACfA,GAAU,MAGXxjC,EAAO4kB,GAAGC,QACTkjB,KAAM,IACNC,KAAM,IAENvd,SAAU,KAIXzqB,EAAO4kB,GAAGuhB,QAELnmC,EAAO4U,MAAQ5U,EAAO4U,KAAKwE,UAC/BpZ,EAAO4U,KAAKwE,QAAQ6uB,SAAW,SAAU5kC,GACxC,MAAOrD,GAAO+K,KAAK/K,EAAO8mC,OAAQ,SAAUxlC,GAC3C,MAAO+B,KAAS/B,EAAG+B,OACjBG,SAGLxD,EAAOsB,GAAG4mC,OAAS,SAAU7hC,GAC5B,GAAKhB,UAAU7B,OACd,MAAO6C,KAAY9G,EAClB+D,KACAA,KAAKyB,KAAK,SAAUU,GACnBzF,EAAOkoC,OAAOC,UAAW7kC,KAAM+C,EAASZ,IAI3C,IAAI5F,GAASuoC,EACZC,GAAQn8B,IAAK,EAAGssB,KAAM,GACtBn1B,EAAOC,KAAM,GACbwP,EAAMzP,GAAQA,EAAKS,aAEpB,IAAMgP,EAON,MAHAjT,GAAUiT,EAAIhT,gBAGRE,EAAOmN,SAAUtN,EAASwD,UAMpBA,GAAKilC,wBAA0B5oC,IAC1C2oC,EAAMhlC,EAAKilC,yBAEZF,EAAMG,GAAWz1B,IAEhB5G,IAAKm8B,EAAIn8B,KAASk8B,EAAII,aAAe3oC,EAAQ0sB,YAAiB1sB,EAAQ2sB,WAAc,GACpFgM,KAAM6P,EAAI7P,MAAS4P,EAAIK,aAAe5oC,EAAQssB,aAAiBtsB,EAAQusB,YAAc,KAX9Eic,GAeTroC,EAAOkoC,QAENC,UAAW,SAAU9kC,EAAMgD,EAASZ,GACnC,GAAIywB,GAAWl2B,EAAO82B,IAAKzzB,EAAM,WAGf,YAAb6yB,IACJ7yB,EAAK0I,MAAMmqB,SAAW,WAGvB,IAAIwS,GAAU1oC,EAAQqD,GACrBslC,EAAYD,EAAQR,SACpBU,EAAY5oC,EAAO82B,IAAKzzB,EAAM,OAC9BwlC,EAAa7oC,EAAO82B,IAAKzzB,EAAM,QAC/BylC,GAAmC,aAAb5S,GAAwC,UAAbA,IAA0Bl2B,EAAO2K,QAAQ,QAASi+B,EAAWC,IAAe,GAC7Hrd,KAAYud,KAAkBC,EAAQC,CAGlCH,IACJC,EAAcL,EAAQxS,WACtB8S,EAASD,EAAY78B,IACrB+8B,EAAUF,EAAYvQ,OAEtBwQ,EAASlhC,WAAY8gC,IAAe,EACpCK,EAAUnhC,WAAY+gC,IAAgB,GAGlC7oC,EAAOiE,WAAYoC,KACvBA,EAAUA,EAAQ7B,KAAMnB,EAAMoC,EAAGkjC,IAGd,MAAftiC,EAAQ6F,MACZsf,EAAMtf,IAAQ7F,EAAQ6F,IAAMy8B,EAAUz8B,IAAQ88B,GAE1B,MAAhB3iC,EAAQmyB,OACZhN,EAAMgN,KAASnyB,EAAQmyB,KAAOmQ,EAAUnQ,KAASyQ,GAG7C,SAAW5iC,GACfA,EAAQ6iC,MAAM1kC,KAAMnB,EAAMmoB,GAE1Bkd,EAAQ5R,IAAKtL,KAMhBxrB,EAAOsB,GAAG0E,QAETkwB,SAAU,WACT,GAAM5yB,KAAM,GAAZ,CAIA,GAAI6lC,GAAcjB,EACjBkB,GAAiBl9B,IAAK,EAAGssB,KAAM,GAC/Bn1B,EAAOC,KAAM,EAwBd,OArBwC,UAAnCtD,EAAO82B,IAAKzzB,EAAM,YAEtB6kC,EAAS7kC,EAAKilC,yBAGda,EAAe7lC,KAAK6lC,eAGpBjB,EAAS5kC,KAAK4kC,SACRloC,EAAOmK,SAAUg/B,EAAc,GAAK,UACzCC,EAAeD,EAAajB,UAI7BkB,EAAal9B,KAAQlM,EAAO82B,IAAKqS,EAAc,GAAK,kBAAkB,GACtEC,EAAa5Q,MAAQx4B,EAAO82B,IAAKqS,EAAc,GAAK,mBAAmB,KAOvEj9B,IAAMg8B,EAAOh8B,IAAOk9B,EAAal9B,IAAMlM,EAAO82B,IAAKzzB,EAAM,aAAa,GACtEm1B,KAAM0P,EAAO1P,KAAO4Q,EAAa5Q,KAAOx4B,EAAO82B,IAAKzzB,EAAM,cAAc,MAI1E8lC,aAAc,WACb,MAAO7lC,MAAKsC,IAAI,WACf,GAAIujC,GAAe7lC,KAAK6lC,cAAgBtpC,CACxC,OAAQspC,IAAmBnpC,EAAOmK,SAAUg/B,EAAc,SAAsD,WAA1CnpC,EAAO82B,IAAKqS,EAAc,YAC/FA,EAAeA,EAAaA,YAE7B,OAAOA,IAAgBtpC,OAO1BG,EAAO+E,MAAOonB,WAAY,cAAeI,UAAW,eAAgB,SAAU0T,EAAQra,GACrF,GAAI1Z,GAAM,IAAInI,KAAM6hB,EAEpB5lB,GAAOsB,GAAI2+B,GAAW,SAAUnrB,GAC/B,MAAO9U,GAAOqL,OAAQ/H,KAAM,SAAUD,EAAM48B,EAAQnrB,GACnD,GAAIszB,GAAMG,GAAWllC,EAErB,OAAKyR,KAAQvV,EACL6oC,EAAOxiB,IAAQwiB,GAAOA,EAAKxiB,GACjCwiB,EAAIxoC,SAASE,gBAAiBmgC,GAC9B58B,EAAM48B,IAGHmI,EACJA,EAAIiB,SACFn9B,EAAYlM,EAAQooC,GAAMjc,aAApBrX,EACP5I,EAAM4I,EAAM9U,EAAQooC,GAAM7b,aAI3BlpB,EAAM48B,GAAWnrB,EAPlB,IASEmrB,EAAQnrB,EAAKzP,UAAU7B,OAAQ,QAIpC,SAAS+kC,IAAWllC,GACnB,MAAOrD,GAAO2H,SAAUtE,GACvBA,EACkB,IAAlBA,EAAKQ,SACJR,EAAK2P,aAAe3P,EAAKgnB,cACzB,EAGHrqB,EAAO+E,MAAQukC,OAAQ,SAAUC,MAAO,SAAW,SAAUnjC,EAAMzD,GAClE3C,EAAO+E,MAAQ00B,QAAS,QAAUrzB,EAAMktB,QAAS3wB,EAAM,GAAI,QAAUyD,GAAQ,SAAUojC,EAAcC,GAEpGzpC,EAAOsB,GAAImoC,GAAa,SAAUjQ,EAAQnvB,GACzC,GAAIiB,GAAYjG,UAAU7B,SAAYgmC,GAAkC,iBAAXhQ,IAC5DtB,EAAQsR,IAAkBhQ,KAAW,GAAQnvB,KAAU,EAAO,SAAW,SAE1E,OAAOrK,GAAOqL,OAAQ/H,KAAM,SAAUD,EAAMV,EAAM0H,GACjD,GAAIyI,EAEJ,OAAK9S,GAAO2H,SAAUtE,GAIdA,EAAKzD,SAASE,gBAAiB,SAAWsG,GAI3B,IAAlB/C,EAAKQ,UACTiP,EAAMzP,EAAKvD,gBAIJ6G,KAAKiE,IACXvH,EAAK+D,KAAM,SAAWhB,GAAQ0M,EAAK,SAAW1M,GAC9C/C,EAAK+D,KAAM,SAAWhB,GAAQ0M,EAAK,SAAW1M,GAC9C0M,EAAK,SAAW1M,KAIXiE,IAAU9K,EAEhBS,EAAO82B,IAAKzzB,EAAMV,EAAMu1B,GAGxBl4B,EAAO+L,MAAO1I,EAAMV,EAAM0H,EAAO6tB,IAChCv1B,EAAM2I,EAAYkuB,EAASj6B,EAAW+L,EAAW,WAQvDtL,EAAOsB,GAAGooC,KAAO,WAChB,MAAOpmC,MAAKE,QAGbxD,EAAOsB,GAAGqoC,QAAU3pC,EAAOsB,GAAG6tB,QAGP,gBAAXya,SAAuBA,QAAoC,gBAAnBA,QAAOC,QAK1DD,OAAOC,QAAU7pC,GAGjBV,EAAOU,OAASV,EAAOY,EAAIF,EASJ,kBAAX8pC,SAAyBA,OAAOC,KAC3CD,OAAQ,YAAc,WAAc,MAAO9pC,QAIzCV"}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/snapscreen/UEditorSnapscreen.exe b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/snapscreen/UEditorSnapscreen.exe
new file mode 100644
index 0000000..db68508
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/snapscreen/UEditorSnapscreen.exe
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.eot b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.eot
new file mode 100644
index 0000000..a075c19
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.eot
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.svg b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.svg
new file mode 100644
index 0000000..f1af0e5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.svg
@@ -0,0 +1,65 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+This is a custom SVG font generated by IcoMoon.
+<iconset grid="16"></iconset>
+</metadata>
+<defs>
+<font id="VideoJS" horiz-adv-x="512" >
+<font-face units-per-em="512" ascent="480" descent="-32" />
+<missing-glyph horiz-adv-x="512" />
+<glyph class="hidden" unicode="&#xf000;" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" />
+<glyph unicode="&#xe002;" d="M 64,416L 224,416L 224,32L 64,32zM 288,416L 448,416L 448,32L 288,32z"  />
+<glyph unicode="&#xe003;" d="M 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z"  />
+<glyph unicode="&#xe004;" d="M 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+		c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+		c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z"  />
+<glyph unicode="&#xe005;" d="M 359.765,64.235c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0,33.941
+		c 65.503,65.503, 65.503,172.085,0,237.588c-9.372,9.373-9.372,24.569,0,33.941c 9.372,9.371, 24.569,9.372, 33.941,0
+		C 417.532,335.938, 440,281.696, 440,224c0-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+		c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+		c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z"  />
+<glyph unicode="&#xe006;" d="M 445.020,18.98c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.373-9.372,24.568,0,33.941
+		C 471.868,103.771, 496.001,162.030, 496.001,224c0,61.969-24.133,120.229-67.952,164.049c-9.372,9.373-9.372,24.569,0,33.941
+		c 9.372,9.372, 24.569,9.372, 33.941,0c 52.885-52.886, 82.011-123.2, 82.011-197.99c0-74.791-29.126-145.104-82.011-197.99
+		C 457.304,21.323, 451.162,18.98, 445.020,18.98zM 359.765,64.235c-6.143,0-12.284,2.343-16.971,7.029c-9.372,9.372-9.372,24.568,0,33.941
+		c 65.503,65.503, 65.503,172.085,0,237.588c-9.372,9.373-9.372,24.569,0,33.941c 9.372,9.371, 24.569,9.372, 33.941,0
+		C 417.532,335.938, 440,281.696, 440,224c0-57.695-22.468-111.938-63.265-152.735C 372.049,66.578, 365.907,64.235, 359.765,64.235zM 274.51,109.49c-6.143,0-12.284,2.343-16.971,7.029c-9.373,9.373-9.373,24.568,0,33.941
+		c 40.55,40.55, 40.55,106.529,0,147.078c-9.373,9.373-9.373,24.569,0,33.941c 9.373,9.372, 24.568,9.372, 33.941,0
+		c 59.265-59.265, 59.265-155.696,0-214.961C 286.794,111.833, 280.652,109.49, 274.51,109.49zM 200.666,440.666 C 213.5,453.5 224,449.15 224,431 L 224,17 C 224-1.15 213.5-5.499 200.666,7.335 L 80,128 L 0,128 L 0,320 L 80,320 L 200.666,440.666 Z" horiz-adv-x="544"  />
+<glyph unicode="&#xe007;" d="M 256,480L 96,224L 256-32L 416,224 z"  />
+<glyph unicode="&#xe008;" d="M 0,480 L 687.158,480 L 687.158-35.207 L 0-35.207 L 0,480 z M 622.731,224.638 C 621.878,314.664 618.46,353.922 597.131,381.656 C 593.291,387.629 586.038,391.042 580.065,395.304 C 559.158,410.669 460.593,416.211 346.247,416.211 C 231.896,416.211 128.642,410.669 108.162,395.304 C 101.762,391.042 94.504,387.629 90.242,381.656 C 69.331,353.922 66.349,314.664 65.069,224.638 C 66.349,134.607 69.331,95.353 90.242,67.62 C 94.504,61.22 101.762,58.233 108.162,53.967 C 128.642,38.18 231.896,33.060 346.247,32.207 C 460.593,33.060 559.158,38.18 580.065,53.967 C 586.038,58.233 593.291,61.22 597.131,67.62 C 618.46,95.353 621.878,134.607 622.731,224.638 z M 331.179,247.952 C 325.389,318.401 287.924,359.905 220.901,359.905 C 159.672,359.905 111.54,304.689 111.54,215.965 C 111.54,126.859 155.405,71.267 227.907,71.267 C 285.79,71.267 326.306,113.916 332.701,184.742 L 263.55,184.742 C 260.81,158.468 249.843,138.285 226.69,138.285 C 190.136,138.285 183.435,174.462 183.435,212.92 C 183.435,265.854 198.665,292.886 223.951,292.886 C 246.492,292.886 260.81,276.511 262.939,247.952 L 331.179,247.952 z M 570.013,247.952 C 564.228,318.401 526.758,359.905 459.74,359.905 C 398.507,359.905 350.379,304.689 350.379,215.965 C 350.379,126.859 394.244,71.267 466.746,71.267 C 524.625,71.267 565.14,113.916 571.536,184.742 L 502.384,184.742 C 499.649,158.468 488.682,138.285 465.529,138.285 C 428.971,138.285 422.27,174.462 422.27,212.92 C 422.27,265.854 437.504,292.886 462.785,292.886 C 485.327,292.886 499.649,276.511 501.778,247.952 L 570.013,247.952 z " horiz-adv-x="687.158"  />
+<glyph unicode="&#xe009;" d="M 64,416L 448,416L 448,32L 64,32z"  />
+<glyph unicode="&#xe00a;" d="M 192,416A64,64 12780 1 1 320,416A64,64 12780 1 1 192,416zM 327.765,359.765A64,64 12780 1 1 455.765,359.765A64,64 12780 1 1 327.765,359.765zM 416,224A32,32 12780 1 1 480,224A32,32 12780 1 1 416,224zM 359.765,88.235A32,32 12780 1 1 423.765,88.23500000000001A32,32 12780 1 1 359.765,88.23500000000001zM 224.001,32A32,32 12780 1 1 288.001,32A32,32 12780 1 1 224.001,32zM 88.236,88.235A32,32 12780 1 1 152.236,88.23500000000001A32,32 12780 1 1 88.236,88.23500000000001zM 72.236,359.765A48,48 12780 1 1 168.236,359.765A48,48 12780 1 1 72.236,359.765zM 28,224A36,36 12780 1 1 100,224A36,36 12780 1 1 28,224z"  />
+<glyph unicode="&#xe00b;" d="M 224,192 L 224-16 L 144,64 L 48-32 L 0,16 L 96,112 L 16,192 ZM 512,432 L 416,336 L 496,256 L 288,256 L 288,464 L 368,384 L 464,480 Z"  />
+<glyph unicode="&#xe00c;" d="M 256,448 C 397.385,448 512,354.875 512,240 C 512,125.124 397.385,32 256,32 C 242.422,32 229.095,32.867 216.088,34.522 C 161.099-20.467 95.463-30.328 32-31.776 L 32-18.318 C 66.268-1.529 96,29.052 96,64 C 96,68.877 95.621,73.665 94.918,78.348 C 37.020,116.48 0,174.725 0,240 C 0,354.875 114.615,448 256,448 Z"  />
+<glyph unicode="&#xe00d;" d="M 256,480C 114.615,480,0,365.385,0,224s 114.615-256, 256-256s 256,114.615, 256,256S 397.385,480, 256,480z M 256,352
+	c 70.692,0, 128-57.308, 128-128s-57.308-128-128-128s-128,57.308-128,128S 185.308,352, 256,352z M 408.735,71.265
+	C 367.938,30.468, 313.695,8, 256,8c-57.696,0-111.938,22.468-152.735,63.265C 62.468,112.062, 40,166.304, 40,224
+	c0,57.695, 22.468,111.938, 63.265,152.735l 33.941-33.941c0,0,0,0,0,0c-65.503-65.503-65.503-172.085,0-237.588
+	C 168.937,73.475, 211.125,56, 256,56c 44.874,0, 87.062,17.475, 118.794,49.206c 65.503,65.503, 65.503,172.084,0,237.588l 33.941,33.941
+	C 449.532,335.938, 472,281.695, 472,224C 472,166.304, 449.532,112.062, 408.735,71.265z"  />
+<glyph unicode="&#xe01e;" d="M 512,224c-0.639,33.431-7.892,66.758-21.288,97.231c-13.352,30.5-32.731,58.129-56.521,80.96
+	c-23.776,22.848-51.972,40.91-82.492,52.826C 321.197,466.979, 288.401,472.693, 256,472c-32.405-0.641-64.666-7.687-94.167-20.678
+	c-29.524-12.948-56.271-31.735-78.367-54.788c-22.112-23.041-39.58-50.354-51.093-79.899C 20.816,287.104, 15.309,255.375, 16,224
+	c 0.643-31.38, 7.482-62.574, 20.067-91.103c 12.544-28.55, 30.738-54.414, 53.055-75.774c 22.305-21.377, 48.736-38.252, 77.307-49.36
+	C 194.988-3.389, 225.652-8.688, 256-8c 30.354,0.645, 60.481,7.277, 88.038,19.457c 27.575,12.141, 52.558,29.74, 73.183,51.322
+	c 20.641,21.57, 36.922,47.118, 47.627,74.715c 6.517,16.729, 10.94,34.2, 13.271,51.899c 0.623-0.036, 1.249-0.060, 1.881-0.060
+	c 17.673,0, 32,14.326, 32,32c0,0.898-0.047,1.786-0.119,2.666L 512,223.999 z M 461.153,139.026c-11.736-26.601-28.742-50.7-49.589-70.59
+	c-20.835-19.905-45.5-35.593-72.122-45.895C 312.828,12.202, 284.297,7.315, 256,8c-28.302,0.649-56.298,6.868-81.91,18.237
+	c-25.625,11.333-48.842,27.745-67.997,47.856c-19.169,20.099-34.264,43.882-44.161,69.529C 51.997,169.264, 47.318,196.729, 48,224
+	c 0.651,27.276, 6.664,54.206, 17.627,78.845c 10.929,24.65, 26.749,46.985, 46.123,65.405c 19.365,18.434, 42.265,32.935, 66.937,42.428
+	C 203.356,420.208, 229.755,424.681, 256,424c 26.25-0.653, 52.114-6.459, 75.781-17.017c 23.676-10.525, 45.128-25.751, 62.812-44.391
+	c 17.698-18.629, 31.605-40.647, 40.695-64.344C 444.412,274.552, 448.679,249.219, 448,224l 0.119,0 c-0.072-0.88-0.119-1.768-0.119-2.666
+	c0-16.506, 12.496-30.087, 28.543-31.812C 473.431,172.111, 468.278,155.113, 461.153,139.026z"  />
+<glyph unicode="&#xe01f;" d="M 256,480 C 116.626,480 3.271,368.619 0.076,230.013 C 3.036,350.945 94.992,448 208,448 C 322.875,448 416,347.712 416,224 C 416,197.49 437.49,176 464,176 C 490.51,176 512,197.49 512,224 C 512,365.385 397.385,480 256,480 ZM 256-32 C 395.374-32 508.729,79.381 511.924,217.987 C 508.964,97.055 417.008,0 304,0 C 189.125,0 96,100.288 96,224 C 96,250.51 74.51,272 48,272 C 21.49,272 0,250.51 0,224 C 0,82.615 114.615-32 256-32 Z"  />
+<glyph unicode="&#xe00e;" d="M 432,128c-22.58,0-42.96-9.369-57.506-24.415L 158.992,211.336C 159.649,215.462, 160,219.689, 160,224
+	s-0.351,8.538-1.008,12.663l 215.502,107.751C 389.040,329.369, 409.42,320, 432,320c 44.183,0, 80,35.817, 80,80S 476.183,480, 432,480
+	s-80-35.817-80-80c0-4.311, 0.352-8.538, 1.008-12.663L 137.506,279.585C 122.96,294.63, 102.58,304, 80,304c-44.183,0-80-35.818-80-80
+	c0-44.184, 35.817-80, 80-80c 22.58,0, 42.96,9.369, 57.506,24.414l 215.502-107.751C 352.352,56.538, 352,52.311, 352,48
+	c0-44.184, 35.817-80, 80-80s 80,35.816, 80,80C 512,92.182, 476.183,128, 432,128z"  />
+<glyph unicode="&#xe001;" d="M 96,416L 416,224L 96,32 z"  />
+<glyph unicode="&#xe000;" d="M 512,480 L 512,272 L 432,352 L 336,256 L 288,304 L 384,400 L 304,480 ZM 224,144 L 128,48 L 208-32 L 0-32 L 0,176 L 80,96 L 176,192 Z"  />
+<glyph unicode="&#x20;" horiz-adv-x="256" />
+</font></defs></svg>
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.ttf b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.ttf
new file mode 100644
index 0000000..eb24637
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.ttf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.woff b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.woff
new file mode 100644
index 0000000..c3f0f1d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/font/vjs.woff
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.css
new file mode 100644
index 0000000..2e8c332
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.css
@@ -0,0 +1,766 @@
+/*!
+Video.js Default Styles (http://videojs.com)
+Version 4.3.0
+Create your own skin at http://designer.videojs.com
+*/
+/* SKIN
+================================================================================
+The main class name for all skin-specific styles. To make your own skin,
+replace all occurances of 'vjs-default-skin' with a new name. Then add your new
+skin name to your video tag instead of the default skin.
+e.g. <video class="video-js my-skin-name">
+*/
+.vjs-default-skin {
+  color: #cccccc;
+}
+/* Custom Icon Font
+--------------------------------------------------------------------------------
+The control icons are from a custom font. Each icon corresponds to a character
+(e.g. "\e001"). Font icons allow for easy scaling and coloring of icons.
+*/
+@font-face {
+  font-family: 'VideoJS';
+  src: url('font/vjs.eot');
+  src: url('font/vjs.eot?#iefix') format('embedded-opentype'), url('font/vjs.woff') format('woff'), url('font/vjs.ttf') format('truetype');
+  font-weight: normal;
+  font-style: normal;
+}
+/* Base UI Component Classes
+--------------------------------------------------------------------------------
+*/
+/* Slider - used for Volume bar and Seek bar */
+.vjs-default-skin .vjs-slider {
+  /* Replace browser focus hightlight with handle highlight */
+  outline: 0;
+  position: relative;
+  cursor: pointer;
+  padding: 0;
+  /* background-color-with-alpha */
+  background-color: #333333;
+  background-color: rgba(51, 51, 51, 0.9);
+}
+.vjs-default-skin .vjs-slider:focus {
+  /* box-shadow */
+  -webkit-box-shadow: 0 0 2em #ffffff;
+  -moz-box-shadow: 0 0 2em #ffffff;
+  box-shadow: 0 0 2em #ffffff;
+}
+.vjs-default-skin .vjs-slider-handle {
+  position: absolute;
+  /* Needed for IE6 */
+  left: 0;
+  top: 0;
+}
+.vjs-default-skin .vjs-slider-handle:before {
+  content: "\e009";
+  font-family: VideoJS;
+  font-size: 1em;
+  line-height: 1;
+  text-align: center;
+  text-shadow: 0em 0em 1em #fff;
+  position: absolute;
+  top: 0;
+  left: 0;
+  /* Rotate the square icon to make a diamond */
+  /* transform */
+  -webkit-transform: rotate(-45deg);
+  -moz-transform: rotate(-45deg);
+  -ms-transform: rotate(-45deg);
+  -o-transform: rotate(-45deg);
+  transform: rotate(-45deg);
+}
+/* Control Bar
+--------------------------------------------------------------------------------
+The default control bar that is a container for most of the controls.
+*/
+.vjs-default-skin .vjs-control-bar {
+  /* Start hidden */
+  display: none;
+  position: absolute;
+  /* Place control bar at the bottom of the player box/video.
+     If you want more margin below the control bar, add more height. */
+  bottom: 0;
+  /* Use left/right to stretch to 100% width of player div */
+  left: 0;
+  right: 0;
+  /* Height includes any margin you want above or below control items */
+  height: 3.0em;
+  /* background-color-with-alpha */
+  background-color: #07141e;
+  background-color: rgba(7, 20, 30, 0.7);
+}
+/* Show the control bar only once the video has started playing */
+.vjs-default-skin.vjs-has-started .vjs-control-bar {
+  display: block;
+  /* Visibility needed to make sure things hide in older browsers too. */
+
+  visibility: visible;
+  opacity: 1;
+  /* transition */
+  -webkit-transition: visibility 0.1s, opacity 0.1s;
+  -moz-transition: visibility 0.1s, opacity 0.1s;
+  -o-transition: visibility 0.1s, opacity 0.1s;
+  transition: visibility 0.1s, opacity 0.1s;
+}
+/* Hide the control bar when the video is playing and the user is inactive  */
+.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
+  display: block;
+  visibility: hidden;
+  opacity: 0;
+  /* transition */
+  -webkit-transition: visibility 1s, opacity 1s;
+  -moz-transition: visibility 1s, opacity 1s;
+  -o-transition: visibility 1s, opacity 1s;
+  transition: visibility 1s, opacity 1s;
+}
+.vjs-default-skin.vjs-controls-disabled .vjs-control-bar {
+  display: none;
+}
+.vjs-default-skin.vjs-using-native-controls .vjs-control-bar {
+  display: none;
+}
+/* IE8 is flakey with fonts, and you have to change the actual content to force
+fonts to show/hide properly.
+  - "\9" IE8 hack didn't work for this
+  - Found in XP IE8 from http://modern.ie. Does not show up in "IE8 mode" in IE9
+*/
+@media \0screen {
+  .vjs-default-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before {
+    content: "";
+  }
+}
+/* General styles for individual controls. */
+.vjs-default-skin .vjs-control {
+  outline: none;
+  position: relative;
+  float: left;
+  text-align: center;
+  margin: 0;
+  padding: 0;
+  height: 3.0em;
+  width: 4em;
+}
+/* FontAwsome button icons */
+.vjs-default-skin .vjs-control:before {
+  font-family: VideoJS;
+  font-size: 1.5em;
+  line-height: 2;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  text-align: center;
+  text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
+}
+/* Replacement for focus outline */
+.vjs-default-skin .vjs-control:focus:before,
+.vjs-default-skin .vjs-control:hover:before {
+  text-shadow: 0em 0em 1em #ffffff;
+}
+.vjs-default-skin .vjs-control:focus {
+  /*  outline: 0; */
+  /* keyboard-only users cannot see the focus on several of the UI elements when
+  this is set to 0 */
+
+}
+/* Hide control text visually, but have it available for screenreaders */
+.vjs-default-skin .vjs-control-text {
+  /* hide-visually */
+  border: 0;
+  clip: rect(0 0 0 0);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px;
+}
+/* Play/Pause
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-play-control {
+  width: 5em;
+  cursor: pointer;
+}
+.vjs-default-skin .vjs-play-control:before {
+  content: "\e001";
+}
+.vjs-default-skin.vjs-playing .vjs-play-control:before {
+  content: "\e002";
+}
+/* Volume/Mute
+-------------------------------------------------------------------------------- */
+.vjs-default-skin .vjs-mute-control,
+.vjs-default-skin .vjs-volume-menu-button {
+  cursor: pointer;
+  float: right;
+}
+.vjs-default-skin .vjs-mute-control:before,
+.vjs-default-skin .vjs-volume-menu-button:before {
+  content: "\e006";
+}
+.vjs-default-skin .vjs-mute-control.vjs-vol-0:before,
+.vjs-default-skin .vjs-volume-menu-button.vjs-vol-0:before {
+  content: "\e003";
+}
+.vjs-default-skin .vjs-mute-control.vjs-vol-1:before,
+.vjs-default-skin .vjs-volume-menu-button.vjs-vol-1:before {
+  content: "\e004";
+}
+.vjs-default-skin .vjs-mute-control.vjs-vol-2:before,
+.vjs-default-skin .vjs-volume-menu-button.vjs-vol-2:before {
+  content: "\e005";
+}
+.vjs-default-skin .vjs-volume-control {
+  width: 5em;
+  float: right;
+}
+.vjs-default-skin .vjs-volume-bar {
+  width: 5em;
+  height: 0.6em;
+  margin: 1.1em auto 0;
+}
+.vjs-default-skin .vjs-volume-menu-button .vjs-menu-content {
+  height: 2.9em;
+}
+.vjs-default-skin .vjs-volume-level {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 0.5em;
+  background: #66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat;
+}
+.vjs-default-skin .vjs-volume-bar .vjs-volume-handle {
+  width: 0.5em;
+  height: 0.5em;
+}
+.vjs-default-skin .vjs-volume-handle:before {
+  font-size: 0.9em;
+  top: -0.2em;
+  left: -0.2em;
+  width: 1em;
+  height: 1em;
+}
+.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content {
+  width: 6em;
+  left: -4em;
+}
+/* Progress
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-progress-control {
+  position: absolute;
+  left: 0;
+  right: 0;
+  width: auto;
+  font-size: 0.3em;
+  height: 1em;
+  /* Set above the rest of the controls. */
+  top: -1em;
+  /* Shrink the bar slower than it grows. */
+  /* transition */
+  -webkit-transition: all 0.4s;
+  -moz-transition: all 0.4s;
+  -o-transition: all 0.4s;
+  transition: all 0.4s;
+}
+/* On hover, make the progress bar grow to something that's more clickable.
+    This simply changes the overall font for the progress bar, and this
+    updates both the em-based widths and heights, as wells as the icon font */
+.vjs-default-skin:hover .vjs-progress-control {
+  font-size: .9em;
+  /* Even though we're not changing the top/height, we need to include them in
+      the transition so they're handled correctly. */
+
+  /* transition */
+  -webkit-transition: all 0.2s;
+  -moz-transition: all 0.2s;
+  -o-transition: all 0.2s;
+  transition: all 0.2s;
+}
+/* Box containing play and load progresses. Also acts as seek scrubber. */
+.vjs-default-skin .vjs-progress-holder {
+  height: 100%;
+}
+/* Progress Bars */
+.vjs-default-skin .vjs-progress-holder .vjs-play-progress,
+.vjs-default-skin .vjs-progress-holder .vjs-load-progress {
+  position: absolute;
+  display: block;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  /* Needed for IE6 */
+  left: 0;
+  top: 0;
+}
+.vjs-default-skin .vjs-play-progress {
+  /*
+    Using a data URI to create the white diagonal lines with a transparent
+      background. Surprisingly works in IE8.
+      Created using http://www.patternify.com
+    Changing the first color value will change the bar color.
+    Also using a paralax effect to make the lines move backwards.
+      The -50% left position makes that happen.
+  */
+
+  background: #66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat;
+}
+.vjs-default-skin .vjs-load-progress {
+  background: #646464 /* IE8- Fallback */;
+  background: rgba(255, 255, 255, 0.4);
+}
+.vjs-default-skin .vjs-seek-handle {
+  width: 1.5em;
+  height: 100%;
+}
+.vjs-default-skin .vjs-seek-handle:before {
+  padding-top: 0.1em /* Minor adjustment */;
+}
+/* Time Display
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-time-controls {
+  font-size: 1em;
+  /* Align vertically by making the line height the same as the control bar */
+  line-height: 3em;
+}
+.vjs-default-skin .vjs-current-time {
+  float: left;
+}
+.vjs-default-skin .vjs-duration {
+  float: left;
+}
+/* Remaining time is in the HTML, but not included in default design */
+.vjs-default-skin .vjs-remaining-time {
+  display: none;
+  float: left;
+}
+.vjs-time-divider {
+  float: left;
+  line-height: 3em;
+}
+/* Fullscreen
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-fullscreen-control {
+  width: 3.8em;
+  cursor: pointer;
+  float: right;
+}
+.vjs-default-skin .vjs-fullscreen-control:before {
+  content: "\e000";
+}
+/* Switch to the exit icon when the player is in fullscreen */
+.vjs-default-skin.vjs-fullscreen .vjs-fullscreen-control:before {
+  content: "\e00b";
+}
+/* Big Play Button (play button at start)
+--------------------------------------------------------------------------------
+Positioning of the play button in the center or other corners can be done more
+easily in the skin designer. http://designer.videojs.com/
+*/
+.vjs-default-skin .vjs-big-play-button {
+  left: 0.5em;
+  top: 0.5em;
+  font-size: 3em;
+  display: block;
+  z-index: 2;
+  position: absolute;
+  width: 4em;
+  height: 2.6em;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  opacity: 1;
+  /* Need a slightly gray bg so it can be seen on black backgrounds */
+  /* background-color-with-alpha */
+  background-color: #07141e;
+  background-color: rgba(7, 20, 30, 0.7);
+  border: 0.1em solid #3b4249;
+  /* border-radius */
+  -webkit-border-radius: 0.8em;
+  -moz-border-radius: 0.8em;
+  border-radius: 0.8em;
+  /* box-shadow */
+  -webkit-box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
+  -moz-box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
+  box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
+  /* transition */
+  -webkit-transition: all 0.4s;
+  -moz-transition: all 0.4s;
+  -o-transition: all 0.4s;
+  transition: all 0.4s;
+}
+/* Optionally center */
+.vjs-default-skin.vjs-big-play-centered .vjs-big-play-button {
+  /* Center it horizontally */
+  left: 50%;
+  margin-left: -2.1em;
+  /* Center it vertically */
+  top: 50%;
+  margin-top: -1.4000000000000001em;
+}
+/* Hide if controls are disabled */
+.vjs-default-skin.vjs-controls-disabled .vjs-big-play-button {
+  display: none;
+}
+/* Hide when video starts playing */
+.vjs-default-skin.vjs-has-started .vjs-big-play-button {
+  display: none;
+}
+/* Hide on mobile devices. Remove when we stop using native controls
+    by default on mobile  */
+.vjs-default-skin.vjs-using-native-controls .vjs-big-play-button {
+  display: none;
+}
+.vjs-default-skin:hover .vjs-big-play-button,
+.vjs-default-skin .vjs-big-play-button:focus {
+  outline: 0;
+  border-color: #fff;
+  /* IE8 needs a non-glow hover state */
+  background-color: #505050;
+  background-color: rgba(50, 50, 50, 0.75);
+  /* box-shadow */
+  -webkit-box-shadow: 0 0 3em #ffffff;
+  -moz-box-shadow: 0 0 3em #ffffff;
+  box-shadow: 0 0 3em #ffffff;
+  /* transition */
+  -webkit-transition: all 0s;
+  -moz-transition: all 0s;
+  -o-transition: all 0s;
+  transition: all 0s;
+}
+.vjs-default-skin .vjs-big-play-button:before {
+  content: "\e001";
+  font-family: VideoJS;
+  /* In order to center the play icon vertically we need to set the line height
+     to the same as the button height */
+
+  line-height: 2.6em;
+  text-shadow: 0.05em 0.05em 0.1em #000;
+  text-align: center /* Needed for IE8 */;
+  position: absolute;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+/* Loading Spinner
+--------------------------------------------------------------------------------
+*/
+.vjs-loading-spinner {
+  display: none;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  font-size: 4em;
+  line-height: 1;
+  width: 1em;
+  height: 1em;
+  margin-left: -0.5em;
+  margin-top: -0.5em;
+  opacity: 0.75;
+  /* animation */
+  -webkit-animation: spin 1.5s infinite linear;
+  -moz-animation: spin 1.5s infinite linear;
+  -o-animation: spin 1.5s infinite linear;
+  animation: spin 1.5s infinite linear;
+}
+.vjs-default-skin .vjs-loading-spinner:before {
+  content: "\e01e";
+  font-family: VideoJS;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 1em;
+  height: 1em;
+  text-align: center;
+  text-shadow: 0em 0em 0.1em #000;
+}
+@-moz-keyframes spin {
+  0% {
+    -moz-transform: rotate(0deg);
+  }
+  100% {
+    -moz-transform: rotate(359deg);
+  }
+}
+@-webkit-keyframes spin {
+  0% {
+    -webkit-transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(359deg);
+  }
+}
+@-o-keyframes spin {
+  0% {
+    -o-transform: rotate(0deg);
+  }
+  100% {
+    -o-transform: rotate(359deg);
+  }
+}
+@keyframes spin {
+  0% {
+    transform: rotate(0deg);
+  }
+  100% {
+    transform: rotate(359deg);
+  }
+}
+/* Menu Buttons (Captions/Subtitles/etc.)
+--------------------------------------------------------------------------------
+*/
+.vjs-default-skin .vjs-menu-button {
+  float: right;
+  cursor: pointer;
+}
+.vjs-default-skin .vjs-menu {
+  display: none;
+  position: absolute;
+  bottom: 0;
+  left: 0em;
+  /* (Width of vjs-menu - width of button) / 2 */
+
+  width: 0em;
+  height: 0em;
+  margin-bottom: 3em;
+  border-left: 2em solid transparent;
+  border-right: 2em solid transparent;
+  border-top: 1.55em solid #000000;
+  /* Same width top as ul bottom */
+
+  border-top-color: rgba(7, 40, 50, 0.5);
+  /* Same as ul background */
+
+}
+/* Button Pop-up Menu */
+.vjs-default-skin .vjs-menu-button .vjs-menu .vjs-menu-content {
+  display: block;
+  padding: 0;
+  margin: 0;
+  position: absolute;
+  width: 10em;
+  bottom: 1.5em;
+  /* Same bottom as vjs-menu border-top */
+
+  max-height: 15em;
+  overflow: auto;
+  left: -5em;
+  /* Width of menu - width of button / 2 */
+
+  /* background-color-with-alpha */
+  background-color: #07141e;
+  background-color: rgba(7, 20, 30, 0.7);
+  /* box-shadow */
+  -webkit-box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
+  -moz-box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
+  box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
+}
+.vjs-default-skin .vjs-menu-button:hover .vjs-menu {
+  display: block;
+}
+.vjs-default-skin .vjs-menu-button ul li {
+  list-style: none;
+  margin: 0;
+  padding: 0.3em 0 0.3em 0;
+  line-height: 1.4em;
+  font-size: 1.2em;
+  text-align: center;
+  text-transform: lowercase;
+}
+.vjs-default-skin .vjs-menu-button ul li.vjs-selected {
+  background-color: #000;
+}
+.vjs-default-skin .vjs-menu-button ul li:focus,
+.vjs-default-skin .vjs-menu-button ul li:hover,
+.vjs-default-skin .vjs-menu-button ul li.vjs-selected:focus,
+.vjs-default-skin .vjs-menu-button ul li.vjs-selected:hover {
+  outline: 0;
+  color: #111;
+  /* background-color-with-alpha */
+  background-color: #ffffff;
+  background-color: rgba(255, 255, 255, 0.75);
+  /* box-shadow */
+  -webkit-box-shadow: 0 0 1em #ffffff;
+  -moz-box-shadow: 0 0 1em #ffffff;
+  box-shadow: 0 0 1em #ffffff;
+}
+.vjs-default-skin .vjs-menu-button ul li.vjs-menu-title {
+  text-align: center;
+  text-transform: uppercase;
+  font-size: 1em;
+  line-height: 2em;
+  padding: 0;
+  margin: 0 0 0.3em 0;
+  font-weight: bold;
+  cursor: default;
+}
+/* Subtitles Button */
+.vjs-default-skin .vjs-subtitles-button:before {
+  content: "\e00c";
+}
+/* Captions Button */
+.vjs-default-skin .vjs-captions-button:before {
+  content: "\e008";
+}
+/* Replacement for focus outline */
+.vjs-default-skin .vjs-captions-button:focus .vjs-control-content:before,
+.vjs-default-skin .vjs-captions-button:hover .vjs-control-content:before {
+  /* box-shadow */
+  -webkit-box-shadow: 0 0 1em #ffffff;
+  -moz-box-shadow: 0 0 1em #ffffff;
+  box-shadow: 0 0 1em #ffffff;
+}
+/*
+REQUIRED STYLES (be careful overriding)
+================================================================================
+When loading the player, the video tag is replaced with a DIV,
+that will hold the video tag or object tag for other playback methods.
+The div contains the video playback element (Flash or HTML5) and controls,
+and sets the width and height of the video.
+
+** If you want to add some kind of border/padding (e.g. a frame), or special
+positioning, use another containing element. Otherwise you risk messing up
+control positioning and full window mode. **
+*/
+.video-js {
+  background-color: #000;
+  position: relative;
+  padding: 0;
+  /* Start with 10px for base font size so other dimensions can be em based and
+     easily calculable. */
+
+  font-size: 10px;
+  /* Allow poster to be vertially aligned. */
+
+  vertical-align: middle;
+  /*  display: table-cell; */
+  /*This works in Safari but not Firefox.*/
+
+  /* Provide some basic defaults for fonts */
+
+  font-weight: normal;
+  font-style: normal;
+  /* Avoiding helvetica: issue #376 */
+
+  font-family: Arial, sans-serif;
+  /* Turn off user selection (text highlighting) by default.
+     The majority of player components will not be text blocks.
+     Text areas will need to turn user selection back on. */
+
+  /* user-select */
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+/* Playback technology elements expand to the width/height of the containing div
+    <video> or <object> */
+.video-js .vjs-tech {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+/* Fix for Firefox 9 fullscreen (only if it is enabled). Not needed when
+   checking fullScreenEnabled. */
+.video-js:-moz-full-screen {
+  position: absolute;
+}
+/* Fullscreen Styles */
+body.vjs-full-window {
+  padding: 0;
+  margin: 0;
+  height: 100%;
+  /* Fix for IE6 full-window. http://www.cssplay.co.uk/layouts/fixed.html */
+  overflow-y: auto;
+}
+.video-js.vjs-fullscreen {
+  position: fixed;
+  overflow: hidden;
+  z-index: 1000;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+  width: 100% !important;
+  height: 100% !important;
+  /* IE6 full-window (underscore hack) */
+  _position: absolute;
+}
+.video-js:-webkit-full-screen {
+  width: 100% !important;
+  height: 100% !important;
+}
+.video-js.vjs-fullscreen.vjs-user-inactive {
+  cursor: none;
+}
+/* Poster Styles */
+.vjs-poster {
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+  background-size: contain;
+  cursor: pointer;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  position: relative;
+  width: 100%;
+}
+.vjs-poster img {
+  display: block;
+  margin: 0 auto;
+  max-height: 100%;
+  padding: 0;
+  width: 100%;
+}
+/* Hide the poster when native controls are used otherwise it covers them */
+.video-js.vjs-using-native-controls .vjs-poster {
+  display: none;
+}
+/* Text Track Styles */
+/* Overall track holder for both captions and subtitles */
+.video-js .vjs-text-track-display {
+  text-align: center;
+  position: absolute;
+  bottom: 4em;
+  /* Leave padding on left and right */
+  left: 1em;
+  right: 1em;
+}
+/* Individual tracks */
+.video-js .vjs-text-track {
+  display: none;
+  font-size: 1.4em;
+  text-align: center;
+  margin-bottom: 0.1em;
+  /* Transparent black background, or fallback to all black (oldIE) */
+  /* background-color-with-alpha */
+  background-color: #000000;
+  background-color: rgba(0, 0, 0, 0.5);
+}
+.video-js .vjs-subtitles {
+  color: #ffffff /* Subtitles are white */;
+}
+.video-js .vjs-captions {
+  color: #ffcc66 /* Captions are yellow */;
+}
+.vjs-tt-cue {
+  display: block;
+}
+/* Hide disabled or unsupported controls */
+.vjs-default-skin .vjs-hidden {
+  display: none;
+}
+.vjs-lock-showing {
+  display: block !important;
+  opacity: 1;
+  visibility: visible;
+}
+/* -----------------------------------------------------------------------------
+The original source of this file lives at
+https://github.com/videojs/video.js/blob/master/src/css/video-js.less */
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.min.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.min.css
new file mode 100644
index 0000000..d3a1d60
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.min.css
@@ -0,0 +1,5 @@
+/*!
+Video.js Default Styles (http://videojs.com)
+Version 4.3.0
+Create your own skin at http://designer.videojs.com
+*/.vjs-default-skin{color:#ccc}@font-face{font-family:VideoJS;src:url(font/vjs.eot);src:url(font/vjs.eot?#iefix) format('embedded-opentype'),url(font/vjs.woff) format('woff'),url(font/vjs.ttf) format('truetype');font-weight:400;font-style:normal}.vjs-default-skin .vjs-slider{outline:0;position:relative;cursor:pointer;padding:0;background-color:#333;background-color:rgba(51,51,51,.9)}.vjs-default-skin .vjs-slider:focus{-webkit-box-shadow:0 0 2em #fff;-moz-box-shadow:0 0 2em #fff;box-shadow:0 0 2em #fff}.vjs-default-skin .vjs-slider-handle{position:absolute;left:0;top:0}.vjs-default-skin .vjs-slider-handle:before{content:"\e009";font-family:VideoJS;font-size:1em;line-height:1;text-align:center;text-shadow:0 0 1em #fff;position:absolute;top:0;left:0;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.vjs-default-skin .vjs-control-bar{display:none;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#07141e;background-color:rgba(7,20,30,.7)}.vjs-default-skin.vjs-has-started .vjs-control-bar{display:block;visibility:visible;opacity:1;-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s;transition:visibility .1s,opacity .1s}.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{display:block;visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-default-skin.vjs-controls-disabled .vjs-control-bar{display:none}.vjs-default-skin.vjs-using-native-controls .vjs-control-bar{display:none}@media \0screen{.vjs-default-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:""}}.vjs-default-skin .vjs-control{outline:0;position:relative;float:left;text-align:center;margin:0;padding:0;height:3em;width:4em}.vjs-default-skin .vjs-control:before{font-family:VideoJS;font-size:1.5em;line-height:2;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.5)}.vjs-default-skin .vjs-control:focus:before,.vjs-default-skin .vjs-control:hover:before{text-shadow:0 0 1em #fff}.vjs-default-skin .vjs-control:focus{}.vjs-default-skin .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-default-skin .vjs-play-control{width:5em;cursor:pointer}.vjs-default-skin .vjs-play-control:before{content:"\e001"}.vjs-default-skin.vjs-playing .vjs-play-control:before{content:"\e002"}.vjs-default-skin .vjs-mute-control,.vjs-default-skin .vjs-volume-menu-button{cursor:pointer;float:right}.vjs-default-skin .vjs-mute-control:before,.vjs-default-skin .vjs-volume-menu-button:before{content:"\e006"}.vjs-default-skin .vjs-mute-control.vjs-vol-0:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-0:before{content:"\e003"}.vjs-default-skin .vjs-mute-control.vjs-vol-1:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-1:before{content:"\e004"}.vjs-default-skin .vjs-mute-control.vjs-vol-2:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-2:before{content:"\e005"}.vjs-default-skin .vjs-volume-control{width:5em;float:right}.vjs-default-skin .vjs-volume-bar{width:5em;height:.6em;margin:1.1em auto 0}.vjs-default-skin .vjs-volume-menu-button .vjs-menu-content{height:2.9em}.vjs-default-skin .vjs-volume-level{position:absolute;top:0;left:0;height:.5em;background:#66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat}.vjs-default-skin .vjs-volume-bar .vjs-volume-handle{width:.5em;height:.5em}.vjs-default-skin .vjs-volume-handle:before{font-size:.9em;top:-.2em;left:-.2em;width:1em;height:1em}.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content{width:6em;left:-4em}.vjs-default-skin .vjs-progress-control{position:absolute;left:0;right:0;width:auto;font-size:.3em;height:1em;top:-1em;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-default-skin:hover .vjs-progress-control{font-size:.9em;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-default-skin .vjs-progress-holder{height:100%}.vjs-default-skin .vjs-progress-holder .vjs-play-progress,.vjs-default-skin .vjs-progress-holder .vjs-load-progress{position:absolute;display:block;height:100%;margin:0;padding:0;left:0;top:0}.vjs-default-skin .vjs-play-progress{background:#66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat}.vjs-default-skin .vjs-load-progress{background:#646464;background:rgba(255,255,255,.4)}.vjs-default-skin .vjs-seek-handle{width:1.5em;height:100%}.vjs-default-skin .vjs-seek-handle:before{padding-top:.1em}.vjs-default-skin .vjs-time-controls{font-size:1em;line-height:3em}.vjs-default-skin .vjs-current-time{float:left}.vjs-default-skin .vjs-duration{float:left}.vjs-default-skin .vjs-remaining-time{display:none;float:left}.vjs-time-divider{float:left;line-height:3em}.vjs-default-skin .vjs-fullscreen-control{width:3.8em;cursor:pointer;float:right}.vjs-default-skin .vjs-fullscreen-control:before{content:"\e000"}.vjs-default-skin.vjs-fullscreen .vjs-fullscreen-control:before{content:"\e00b"}.vjs-default-skin .vjs-big-play-button{left:.5em;top:.5em;font-size:3em;display:block;z-index:2;position:absolute;width:4em;height:2.6em;text-align:center;vertical-align:middle;cursor:pointer;opacity:1;background-color:#07141e;background-color:rgba(7,20,30,.7);border:.1em solid #3b4249;-webkit-border-radius:.8em;-moz-border-radius:.8em;border-radius:.8em;-webkit-box-shadow:0 0 1em rgba(255,255,255,.25);-moz-box-shadow:0 0 1em rgba(255,255,255,.25);box-shadow:0 0 1em rgba(255,255,255,.25);-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-default-skin.vjs-big-play-centered .vjs-big-play-button{left:50%;margin-left:-2.1em;top:50%;margin-top:-1.4000000000000001em}.vjs-default-skin.vjs-controls-disabled .vjs-big-play-button{display:none}.vjs-default-skin.vjs-has-started .vjs-big-play-button{display:none}.vjs-default-skin.vjs-using-native-controls .vjs-big-play-button{display:none}.vjs-default-skin:hover .vjs-big-play-button,.vjs-default-skin .vjs-big-play-button:focus{outline:0;border-color:#fff;background-color:#505050;background-color:rgba(50,50,50,.75);-webkit-box-shadow:0 0 3em #fff;-moz-box-shadow:0 0 3em #fff;box-shadow:0 0 3em #fff;-webkit-transition:all 0s;-moz-transition:all 0s;-o-transition:all 0s;transition:all 0s}.vjs-default-skin .vjs-big-play-button:before{content:"\e001";font-family:VideoJS;line-height:2.6em;text-shadow:.05em .05em .1em #000;text-align:center;position:absolute;left:0;width:100%;height:100%}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;font-size:4em;line-height:1;width:1em;height:1em;margin-left:-.5em;margin-top:-.5em;opacity:.75;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}.vjs-default-skin .vjs-loading-spinner:before{content:"\e01e";font-family:VideoJS;position:absolute;top:0;left:0;width:1em;height:1em;text-align:center;text-shadow:0 0 .1em #000}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.vjs-default-skin .vjs-menu-button{float:right;cursor:pointer}.vjs-default-skin .vjs-menu{display:none;position:absolute;bottom:0;left:0;width:0;height:0;margin-bottom:3em;border-left:2em solid transparent;border-right:2em solid transparent;border-top:1.55em solid #000;border-top-color:rgba(7,40,50,.5)}.vjs-default-skin .vjs-menu-button .vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;position:absolute;width:10em;bottom:1.5em;max-height:15em;overflow:auto;left:-5em;background-color:#07141e;background-color:rgba(7,20,30,.7);-webkit-box-shadow:-.2em -.2em .3em rgba(255,255,255,.2);-moz-box-shadow:-.2em -.2em .3em rgba(255,255,255,.2);box-shadow:-.2em -.2em .3em rgba(255,255,255,.2)}.vjs-default-skin .vjs-menu-button:hover .vjs-menu{display:block}.vjs-default-skin .vjs-menu-button ul li{list-style:none;margin:0;padding:.3em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.vjs-default-skin .vjs-menu-button ul li.vjs-selected{background-color:#000}.vjs-default-skin .vjs-menu-button ul li:focus,.vjs-default-skin .vjs-menu-button ul li:hover,.vjs-default-skin .vjs-menu-button ul li.vjs-selected:focus,.vjs-default-skin .vjs-menu-button ul li.vjs-selected:hover{outline:0;color:#111;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.vjs-default-skin .vjs-menu-button ul li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:default}.vjs-default-skin .vjs-subtitles-button:before{content:"\e00c"}.vjs-default-skin .vjs-captions-button:before{content:"\e008"}.vjs-default-skin .vjs-captions-button:focus .vjs-control-content:before,.vjs-default-skin .vjs-captions-button:hover .vjs-control-content:before{-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.video-js{background-color:#000;position:relative;padding:0;font-size:10px;vertical-align:middle;font-weight:400;font-style:normal;font-family:Arial,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}.video-js:-moz-full-screen{position:absolute}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0;width:100%!important;height:100%!important;_position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-poster{background-repeat:no-repeat;background-position:50% 50%;background-size:contain;cursor:pointer;height:100%;margin:0;padding:0;position:relative;width:100%}.vjs-poster img{display:block;margin:0 auto;max-height:100%;padding:0;width:100%}.video-js.vjs-using-native-controls .vjs-poster{display:none}.video-js .vjs-text-track-display{text-align:center;position:absolute;bottom:4em;left:1em;right:1em}.video-js .vjs-text-track{display:none;font-size:1.4em;text-align:center;margin-bottom:.1em;background-color:#000;background-color:rgba(0,0,0,.5)}.video-js .vjs-subtitles{color:#fff}.video-js .vjs-captions{color:#fc6}.vjs-tt-cue{display:block}.vjs-default-skin .vjs-hidden{display:none}.vjs-lock-showing{display:block!important;opacity:1;visibility:visible}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.swf b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.swf
new file mode 100644
index 0000000..9cf537a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video-js.swf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video.dev.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video.dev.js
new file mode 100644
index 0000000..d01ea60
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video.dev.js
@@ -0,0 +1,7108 @@
+/**
+ * @fileoverview Main function src.
+ */
+
+// HTML5 Shiv. Must be in <head> to support older browsers.
+document.createElement('video');
+document.createElement('audio');
+document.createElement('track');
+
+/**
+ * Doubles as the main function for users to create a player instance and also
+ * the main library object.
+ *
+ * **ALIASES** videojs, _V_ (deprecated)
+ *
+ * The `vjs` function can be used to initialize or retrieve a player.
+ *
+ *     var myPlayer = vjs('my_video_id');
+ *
+ * @param  {String|Element} id      Video element or video element ID
+ * @param  {Object=} options        Optional options object for config/settings
+ * @param  {Function=} ready        Optional ready callback
+ * @return {vjs.Player}             A player instance
+ * @namespace
+ */
+var vjs = function(id, options, ready){
+  var tag; // Element of ID
+
+  // Allow for element or ID to be passed in
+  // String ID
+  if (typeof id === 'string') {
+
+    // Adjust for jQuery ID syntax
+    if (id.indexOf('#') === 0) {
+      id = id.slice(1);
+    }
+
+    // If a player instance has already been created for this ID return it.
+    if (vjs.players[id]) {
+      return vjs.players[id];
+
+    // Otherwise get element for ID
+    } else {
+      tag = vjs.el(id);
+    }
+
+  // ID is a media element
+  } else {
+    tag = id;
+  }
+
+  // Check for a useable element
+  if (!tag || !tag.nodeName) { // re: nodeName, could be a box div also
+    throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns
+  }
+
+  // Element may have a player attr referring to an already created player instance.
+  // If not, set up a new player and return the instance.
+  return tag['player'] || new vjs.Player(tag, options, ready);
+};
+
+// Extended name, also available externally, window.videojs
+var videojs = vjs;
+window.videojs = window.vjs = vjs;
+
+// CDN Version. Used to target right flash swf.
+vjs.CDN_VERSION = '4.3';
+vjs.ACCESS_PROTOCOL = ('https:' == document.location.protocol ? 'https://' : 'http://');
+
+/**
+ * Global Player instance options, surfaced from vjs.Player.prototype.options_
+ * vjs.options = vjs.Player.prototype.options_
+ * All options should use string keys so they avoid
+ * renaming by closure compiler
+ * @type {Object}
+ */
+vjs.options = {
+  // Default order of fallback technology
+  'techOrder': ['html5','flash'],
+  // techOrder: ['flash','html5'],
+
+  'html5': {},
+  'flash': {},
+
+  // Default of web browser is 300x150. Should rely on source width/height.
+  'width': 300,
+  'height': 150,
+  // defaultVolume: 0.85,
+  'defaultVolume': 0.00, // The freakin seaguls are driving me crazy!
+
+  // Included control sets
+  'children': {
+    'mediaLoader': {},
+    'posterImage': {},
+    'textTrackDisplay': {},
+    'loadingSpinner': {},
+    'bigPlayButton': {},
+    'controlBar': {}
+  },
+
+  // Default message to show when a video cannot be played.
+  'notSupportedMessage': 'Sorry, no compatible source and playback ' +
+      'technology were found for this video. Try using another browser ' +
+      'like <a href="http://bit.ly/ccMUEC">Chrome</a> or download the ' +
+      'latest <a href="http://adobe.ly/mwfN1">Adobe Flash Player</a>.'
+};
+
+// Set CDN Version of swf
+// The added (+) blocks the replace from changing this 4.3 string
+if (vjs.CDN_VERSION !== 'GENERATED'+'_CDN_VSN') {
+  videojs.options['flash']['swf'] = vjs.ACCESS_PROTOCOL + 'vjs.zencdn.net/'+vjs.CDN_VERSION+'/video-js.swf';
+}
+
+/**
+ * Global player list
+ * @type {Object}
+ */
+vjs.players = {};
+/**
+ * Core Object/Class for objects that use inheritance + contstructors
+ *
+ * To create a class that can be subclassed itself, extend the CoreObject class.
+ *
+ *     var Animal = CoreObject.extend();
+ *     var Horse = Animal.extend();
+ *
+ * The constructor can be defined through the init property of an object argument.
+ *
+ *     var Animal = CoreObject.extend({
+ *       init: function(name, sound){
+ *         this.name = name;
+ *       }
+ *     });
+ *
+ * Other methods and properties can be added the same way, or directly to the
+ * prototype.
+ *
+ *    var Animal = CoreObject.extend({
+ *       init: function(name){
+ *         this.name = name;
+ *       },
+ *       getName: function(){
+ *         return this.name;
+ *       },
+ *       sound: '...'
+ *    });
+ *
+ *    Animal.prototype.makeSound = function(){
+ *      alert(this.sound);
+ *    };
+ *
+ * To create an instance of a class, use the create method.
+ *
+ *    var fluffy = Animal.create('Fluffy');
+ *    fluffy.getName(); // -> Fluffy
+ *
+ * Methods and properties can be overridden in subclasses.
+ *
+ *     var Horse = Animal.extend({
+ *       sound: 'Neighhhhh!'
+ *     });
+ *
+ *     var horsey = Horse.create('Horsey');
+ *     horsey.getName(); // -> Horsey
+ *     horsey.makeSound(); // -> Alert: Neighhhhh!
+ *
+ * @class
+ * @constructor
+ */
+vjs.CoreObject = vjs['CoreObject'] = function(){};
+// Manually exporting vjs['CoreObject'] here for Closure Compiler
+// because of the use of the extend/create class methods
+// If we didn't do this, those functions would get flattend to something like
+// `a = ...` and `this.prototype` would refer to the global object instead of
+// CoreObject
+
+/**
+ * Create a new object that inherits from this Object
+ *
+ *     var Animal = CoreObject.extend();
+ *     var Horse = Animal.extend();
+ *
+ * @param {Object} props Functions and properties to be applied to the
+ *                       new object's prototype
+ * @return {vjs.CoreObject} An object that inherits from CoreObject
+ * @this {*}
+ */
+vjs.CoreObject.extend = function(props){
+  var init, subObj;
+
+  props = props || {};
+  // Set up the constructor using the supplied init method
+  // or using the init of the parent object
+  // Make sure to check the unobfuscated version for external libs
+  init = props['init'] || props.init || this.prototype['init'] || this.prototype.init || function(){};
+  // In Resig's simple class inheritance (previously used) the constructor
+  //  is a function that calls `this.init.apply(arguments)`
+  // However that would prevent us from using `ParentObject.call(this);`
+  //  in a Child constuctor because the `this` in `this.init`
+  //  would still refer to the Child and cause an inifinite loop.
+  // We would instead have to do
+  //    `ParentObject.prototype.init.apply(this, argumnents);`
+  //  Bleh. We're not creating a _super() function, so it's good to keep
+  //  the parent constructor reference simple.
+  subObj = function(){
+    init.apply(this, arguments);
+  };
+
+  // Inherit from this object's prototype
+  subObj.prototype = vjs.obj.create(this.prototype);
+  // Reset the constructor property for subObj otherwise
+  // instances of subObj would have the constructor of the parent Object
+  subObj.prototype.constructor = subObj;
+
+  // Make the class extendable
+  subObj.extend = vjs.CoreObject.extend;
+  // Make a function for creating instances
+  subObj.create = vjs.CoreObject.create;
+
+  // Extend subObj's prototype with functions and other properties from props
+  for (var name in props) {
+    if (props.hasOwnProperty(name)) {
+      subObj.prototype[name] = props[name];
+    }
+  }
+
+  return subObj;
+};
+
+/**
+ * Create a new instace of this Object class
+ *
+ *     var myAnimal = Animal.create();
+ *
+ * @return {vjs.CoreObject} An instance of a CoreObject subclass
+ * @this {*}
+ */
+vjs.CoreObject.create = function(){
+  // Create a new object that inherits from this object's prototype
+  var inst = vjs.obj.create(this.prototype);
+
+  // Apply this constructor function to the new object
+  this.apply(inst, arguments);
+
+  // Return the new object
+  return inst;
+};
+/**
+ * @fileoverview Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)
+ * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)
+ * This should work very similarly to jQuery's events, however it's based off the book version which isn't as
+ * robust as jquery's, so there's probably some differences.
+ */
+
+/**
+ * Add an event listener to element
+ * It stores the handler function in a separate cache object
+ * and adds a generic handler to the element's event,
+ * along with a unique id (guid) to the element.
+ * @param  {Element|Object}   elem Element or object to bind listeners to
+ * @param  {String}   type Type of event to bind to.
+ * @param  {Function} fn   Event listener.
+ * @private
+ */
+vjs.on = function(elem, type, fn){
+  var data = vjs.getData(elem);
+
+  // We need a place to store all our handler data
+  if (!data.handlers) data.handlers = {};
+
+  if (!data.handlers[type]) data.handlers[type] = [];
+
+  if (!fn.guid) fn.guid = vjs.guid++;
+
+  data.handlers[type].push(fn);
+
+  if (!data.dispatcher) {
+    data.disabled = false;
+
+    data.dispatcher = function (event){
+
+      if (data.disabled) return;
+      event = vjs.fixEvent(event);
+
+      var handlers = data.handlers[event.type];
+
+      if (handlers) {
+        // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.
+        var handlersCopy = handlers.slice(0);
+
+        for (var m = 0, n = handlersCopy.length; m < n; m++) {
+          if (event.isImmediatePropagationStopped()) {
+            break;
+          } else {
+            handlersCopy[m].call(elem, event);
+          }
+        }
+      }
+    };
+  }
+
+  if (data.handlers[type].length == 1) {
+    if (document.addEventListener) {
+      elem.addEventListener(type, data.dispatcher, false);
+    } else if (document.attachEvent) {
+      elem.attachEvent('on' + type, data.dispatcher);
+    }
+  }
+};
+
+/**
+ * Removes event listeners from an element
+ * @param  {Element|Object}   elem Object to remove listeners from
+ * @param  {String=}   type Type of listener to remove. Don't include to remove all events from element.
+ * @param  {Function} fn   Specific listener to remove. Don't incldue to remove listeners for an event type.
+ * @private
+ */
+vjs.off = function(elem, type, fn) {
+  // Don't want to add a cache object through getData if not needed
+  if (!vjs.hasData(elem)) return;
+
+  var data = vjs.getData(elem);
+
+  // If no events exist, nothing to unbind
+  if (!data.handlers) { return; }
+
+  // Utility function
+  var removeType = function(t){
+     data.handlers[t] = [];
+     vjs.cleanUpEvents(elem,t);
+  };
+
+  // Are we removing all bound events?
+  if (!type) {
+    for (var t in data.handlers) removeType(t);
+    return;
+  }
+
+  var handlers = data.handlers[type];
+
+  // If no handlers exist, nothing to unbind
+  if (!handlers) return;
+
+  // If no listener was provided, remove all listeners for type
+  if (!fn) {
+    removeType(type);
+    return;
+  }
+
+  // We're only removing a single handler
+  if (fn.guid) {
+    for (var n = 0; n < handlers.length; n++) {
+      if (handlers[n].guid === fn.guid) {
+        handlers.splice(n--, 1);
+      }
+    }
+  }
+
+  vjs.cleanUpEvents(elem, type);
+};
+
+/**
+ * Clean up the listener cache and dispatchers
+ * @param  {Element|Object} elem Element to clean up
+ * @param  {String} type Type of event to clean up
+ * @private
+ */
+vjs.cleanUpEvents = function(elem, type) {
+  var data = vjs.getData(elem);
+
+  // Remove the events of a particular type if there are none left
+  if (data.handlers[type].length === 0) {
+    delete data.handlers[type];
+    // data.handlers[type] = null;
+    // Setting to null was causing an error with data.handlers
+
+    // Remove the meta-handler from the element
+    if (document.removeEventListener) {
+      elem.removeEventListener(type, data.dispatcher, false);
+    } else if (document.detachEvent) {
+      elem.detachEvent('on' + type, data.dispatcher);
+    }
+  }
+
+  // Remove the events object if there are no types left
+  if (vjs.isEmpty(data.handlers)) {
+    delete data.handlers;
+    delete data.dispatcher;
+    delete data.disabled;
+
+    // data.handlers = null;
+    // data.dispatcher = null;
+    // data.disabled = null;
+  }
+
+  // Finally remove the expando if there is no data left
+  if (vjs.isEmpty(data)) {
+    vjs.removeData(elem);
+  }
+};
+
+/**
+ * Fix a native event to have standard property values
+ * @param  {Object} event Event object to fix
+ * @return {Object}
+ * @private
+ */
+vjs.fixEvent = function(event) {
+
+  function returnTrue() { return true; }
+  function returnFalse() { return false; }
+
+  // Test if fixing up is needed
+  // Used to check if !event.stopPropagation instead of isPropagationStopped
+  // But native events return true for stopPropagation, but don't have
+  // other expected methods like isPropagationStopped. Seems to be a problem
+  // with the Javascript Ninja code. So we're just overriding all events now.
+  if (!event || !event.isPropagationStopped) {
+    var old = event || window.event;
+
+    event = {};
+    // Clone the old object so that we can modify the values event = {};
+    // IE8 Doesn't like when you mess with native event properties
+    // Firefox returns false for event.hasOwnProperty('type') and other props
+    //  which makes copying more difficult.
+    // TODO: Probably best to create a whitelist of event props
+    for (var key in old) {
+      // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y
+      if (key !== 'layerX' && key !== 'layerY') {
+        event[key] = old[key];
+      }
+    }
+
+    // The event occurred on this element
+    if (!event.target) {
+      event.target = event.srcElement || document;
+    }
+
+    // Handle which other element the event is related to
+    event.relatedTarget = event.fromElement === event.target ?
+      event.toElement :
+      event.fromElement;
+
+    // Stop the default browser action
+    event.preventDefault = function () {
+      if (old.preventDefault) {
+        old.preventDefault();
+      }
+      event.returnValue = false;
+      event.isDefaultPrevented = returnTrue;
+    };
+
+    event.isDefaultPrevented = returnFalse;
+
+    // Stop the event from bubbling
+    event.stopPropagation = function () {
+      if (old.stopPropagation) {
+        old.stopPropagation();
+      }
+      event.cancelBubble = true;
+      event.isPropagationStopped = returnTrue;
+    };
+
+    event.isPropagationStopped = returnFalse;
+
+    // Stop the event from bubbling and executing other handlers
+    event.stopImmediatePropagation = function () {
+      if (old.stopImmediatePropagation) {
+        old.stopImmediatePropagation();
+      }
+      event.isImmediatePropagationStopped = returnTrue;
+      event.stopPropagation();
+    };
+
+    event.isImmediatePropagationStopped = returnFalse;
+
+    // Handle mouse position
+    if (event.clientX != null) {
+      var doc = document.documentElement, body = document.body;
+
+      event.pageX = event.clientX +
+        (doc && doc.scrollLeft || body && body.scrollLeft || 0) -
+        (doc && doc.clientLeft || body && body.clientLeft || 0);
+      event.pageY = event.clientY +
+        (doc && doc.scrollTop || body && body.scrollTop || 0) -
+        (doc && doc.clientTop || body && body.clientTop || 0);
+    }
+
+    // Handle key presses
+    event.which = event.charCode || event.keyCode;
+
+    // Fix button for mouse clicks:
+    // 0 == left; 1 == middle; 2 == right
+    if (event.button != null) {
+      event.button = (event.button & 1 ? 0 :
+        (event.button & 4 ? 1 :
+          (event.button & 2 ? 2 : 0)));
+    }
+  }
+
+  // Returns fixed-up instance
+  return event;
+};
+
+/**
+ * Trigger an event for an element
+ * @param  {Element|Object} elem  Element to trigger an event on
+ * @param  {String} event Type of event to trigger
+ * @private
+ */
+vjs.trigger = function(elem, event) {
+  // Fetches element data and a reference to the parent (for bubbling).
+  // Don't want to add a data object to cache for every parent,
+  // so checking hasData first.
+  var elemData = (vjs.hasData(elem)) ? vjs.getData(elem) : {};
+  var parent = elem.parentNode || elem.ownerDocument;
+      // type = event.type || event,
+      // handler;
+
+  // If an event name was passed as a string, creates an event out of it
+  if (typeof event === 'string') {
+    event = { type:event, target:elem };
+  }
+  // Normalizes the event properties.
+  event = vjs.fixEvent(event);
+
+  // If the passed element has a dispatcher, executes the established handlers.
+  if (elemData.dispatcher) {
+    elemData.dispatcher.call(elem, event);
+  }
+
+  // Unless explicitly stopped or the event does not bubble (e.g. media events)
+    // recursively calls this function to bubble the event up the DOM.
+    if (parent && !event.isPropagationStopped() && event.bubbles !== false) {
+    vjs.trigger(parent, event);
+
+  // If at the top of the DOM, triggers the default action unless disabled.
+  } else if (!parent && !event.isDefaultPrevented()) {
+    var targetData = vjs.getData(event.target);
+
+    // Checks if the target has a default action for this event.
+    if (event.target[event.type]) {
+      // Temporarily disables event dispatching on the target as we have already executed the handler.
+      targetData.disabled = true;
+      // Executes the default action.
+      if (typeof event.target[event.type] === 'function') {
+        event.target[event.type]();
+      }
+      // Re-enables event dispatching.
+      targetData.disabled = false;
+    }
+  }
+
+  // Inform the triggerer if the default was prevented by returning false
+  return !event.isDefaultPrevented();
+  /* Original version of js ninja events wasn't complete.
+   * We've since updated to the latest version, but keeping this around
+   * for now just in case.
+   */
+  // // Added in attion to book. Book code was broke.
+  // event = typeof event === 'object' ?
+  //   event[vjs.expando] ?
+  //     event :
+  //     new vjs.Event(type, event) :
+  //   new vjs.Event(type);
+
+  // event.type = type;
+  // if (handler) {
+  //   handler.call(elem, event);
+  // }
+
+  // // Clean up the event in case it is being reused
+  // event.result = undefined;
+  // event.target = elem;
+};
+
+/**
+ * Trigger a listener only once for an event
+ * @param  {Element|Object}   elem Element or object to
+ * @param  {String}   type
+ * @param  {Function} fn
+ * @private
+ */
+vjs.one = function(elem, type, fn) {
+  var func = function(){
+    vjs.off(elem, type, func);
+    fn.apply(this, arguments);
+  };
+  func.guid = fn.guid = fn.guid || vjs.guid++;
+  vjs.on(elem, type, func);
+};
+var hasOwnProp = Object.prototype.hasOwnProperty;
+
+/**
+ * Creates an element and applies properties.
+ * @param  {String=} tagName    Name of tag to be created.
+ * @param  {Object=} properties Element properties to be applied.
+ * @return {Element}
+ * @private
+ */
+vjs.createEl = function(tagName, properties){
+  var el, propName;
+
+  el = document.createElement(tagName || 'div');
+
+  for (propName in properties){
+    if (hasOwnProp.call(properties, propName)) {
+      //el[propName] = properties[propName];
+      // Not remembering why we were checking for dash
+      // but using setAttribute means you have to use getAttribute
+
+      // The check for dash checks for the aria-* attributes, like aria-label, aria-valuemin.
+      // The additional check for "role" is because the default method for adding attributes does not
+      // add the attribute "role". My guess is because it's not a valid attribute in some namespaces, although
+      // browsers handle the attribute just fine. The W3C allows for aria-* attributes to be used in pre-HTML5 docs.
+      // http://www.w3.org/TR/wai-aria-primer/#ariahtml. Using setAttribute gets around this problem.
+
+       if (propName.indexOf('aria-') !== -1 || propName=='role') {
+         el.setAttribute(propName, properties[propName]);
+       } else {
+         el[propName] = properties[propName];
+       }
+    }
+  }
+  return el;
+};
+
+/**
+ * Uppercase the first letter of a string
+ * @param  {String} string String to be uppercased
+ * @return {String}
+ * @private
+ */
+vjs.capitalize = function(string){
+  return string.charAt(0).toUpperCase() + string.slice(1);
+};
+
+/**
+ * Object functions container
+ * @type {Object}
+ * @private
+ */
+vjs.obj = {};
+
+/**
+ * Object.create shim for prototypal inheritance
+ *
+ * https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create
+ *
+ * @function
+ * @param  {Object}   obj Object to use as prototype
+ * @private
+ */
+ vjs.obj.create = Object.create || function(obj){
+  //Create a new function called 'F' which is just an empty object.
+  function F() {}
+
+  //the prototype of the 'F' function should point to the
+  //parameter of the anonymous function.
+  F.prototype = obj;
+
+  //create a new constructor function based off of the 'F' function.
+  return new F();
+};
+
+/**
+ * Loop through each property in an object and call a function
+ * whose arguments are (key,value)
+ * @param  {Object}   obj Object of properties
+ * @param  {Function} fn  Function to be called on each property.
+ * @this {*}
+ * @private
+ */
+vjs.obj.each = function(obj, fn, context){
+  for (var key in obj) {
+    if (hasOwnProp.call(obj, key)) {
+      fn.call(context || this, key, obj[key]);
+    }
+  }
+};
+
+/**
+ * Merge two objects together and return the original.
+ * @param  {Object} obj1
+ * @param  {Object} obj2
+ * @return {Object}
+ * @private
+ */
+vjs.obj.merge = function(obj1, obj2){
+  if (!obj2) { return obj1; }
+  for (var key in obj2){
+    if (hasOwnProp.call(obj2, key)) {
+      obj1[key] = obj2[key];
+    }
+  }
+  return obj1;
+};
+
+/**
+ * Merge two objects, and merge any properties that are objects
+ * instead of just overwriting one. Uses to merge options hashes
+ * where deeper default settings are important.
+ * @param  {Object} obj1 Object to override
+ * @param  {Object} obj2 Overriding object
+ * @return {Object}      New object. Obj1 and Obj2 will be untouched.
+ * @private
+ */
+vjs.obj.deepMerge = function(obj1, obj2){
+  var key, val1, val2;
+
+  // make a copy of obj1 so we're not ovewriting original values.
+  // like prototype.options_ and all sub options objects
+  obj1 = vjs.obj.copy(obj1);
+
+  for (key in obj2){
+    if (hasOwnProp.call(obj2, key)) {
+      val1 = obj1[key];
+      val2 = obj2[key];
+
+      // Check if both properties are pure objects and do a deep merge if so
+      if (vjs.obj.isPlain(val1) && vjs.obj.isPlain(val2)) {
+        obj1[key] = vjs.obj.deepMerge(val1, val2);
+      } else {
+        obj1[key] = obj2[key];
+      }
+    }
+  }
+  return obj1;
+};
+
+/**
+ * Make a copy of the supplied object
+ * @param  {Object} obj Object to copy
+ * @return {Object}     Copy of object
+ * @private
+ */
+vjs.obj.copy = function(obj){
+  return vjs.obj.merge({}, obj);
+};
+
+/**
+ * Check if an object is plain, and not a dom node or any object sub-instance
+ * @param  {Object} obj Object to check
+ * @return {Boolean}     True if plain, false otherwise
+ * @private
+ */
+vjs.obj.isPlain = function(obj){
+  return !!obj
+    && typeof obj === 'object'
+    && obj.toString() === '[object Object]'
+    && obj.constructor === Object;
+};
+
+/**
+ * Bind (a.k.a proxy or Context). A simple method for changing the context of a function
+   It also stores a unique id on the function so it can be easily removed from events
+ * @param  {*}   context The object to bind as scope
+ * @param  {Function} fn      The function to be bound to a scope
+ * @param  {Number=}   uid     An optional unique ID for the function to be set
+ * @return {Function}
+ * @private
+ */
+vjs.bind = function(context, fn, uid) {
+  // Make sure the function has a unique ID
+  if (!fn.guid) { fn.guid = vjs.guid++; }
+
+  // Create the new function that changes the context
+  var ret = function() {
+    return fn.apply(context, arguments);
+  };
+
+  // Allow for the ability to individualize this function
+  // Needed in the case where multiple objects might share the same prototype
+  // IF both items add an event listener with the same function, then you try to remove just one
+  // it will remove both because they both have the same guid.
+  // when using this, you need to use the bind method when you remove the listener as well.
+  // currently used in text tracks
+  ret.guid = (uid) ? uid + '_' + fn.guid : fn.guid;
+
+  return ret;
+};
+
+/**
+ * Element Data Store. Allows for binding data to an element without putting it directly on the element.
+ * Ex. Event listneres are stored here.
+ * (also from jsninja.com, slightly modified and updated for closure compiler)
+ * @type {Object}
+ * @private
+ */
+vjs.cache = {};
+
+/**
+ * Unique ID for an element or function
+ * @type {Number}
+ * @private
+ */
+vjs.guid = 1;
+
+/**
+ * Unique attribute name to store an element's guid in
+ * @type {String}
+ * @constant
+ * @private
+ */
+vjs.expando = 'vdata' + (new Date()).getTime();
+
+/**
+ * Returns the cache object where data for an element is stored
+ * @param  {Element} el Element to store data for.
+ * @return {Object}
+ * @private
+ */
+vjs.getData = function(el){
+  var id = el[vjs.expando];
+  if (!id) {
+    id = el[vjs.expando] = vjs.guid++;
+    vjs.cache[id] = {};
+  }
+  return vjs.cache[id];
+};
+
+/**
+ * Returns the cache object where data for an element is stored
+ * @param  {Element} el Element to store data for.
+ * @return {Object}
+ * @private
+ */
+vjs.hasData = function(el){
+  var id = el[vjs.expando];
+  return !(!id || vjs.isEmpty(vjs.cache[id]));
+};
+
+/**
+ * Delete data for the element from the cache and the guid attr from getElementById
+ * @param  {Element} el Remove data for an element
+ * @private
+ */
+vjs.removeData = function(el){
+  var id = el[vjs.expando];
+  if (!id) { return; }
+  // Remove all stored data
+  // Changed to = null
+  // http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/
+  // vjs.cache[id] = null;
+  delete vjs.cache[id];
+
+  // Remove the expando property from the DOM node
+  try {
+    delete el[vjs.expando];
+  } catch(e) {
+    if (el.removeAttribute) {
+      el.removeAttribute(vjs.expando);
+    } else {
+      // IE doesn't appear to support removeAttribute on the document element
+      el[vjs.expando] = null;
+    }
+  }
+};
+
+/**
+ * Check if an object is empty
+ * @param  {Object}  obj The object to check for emptiness
+ * @return {Boolean}
+ * @private
+ */
+vjs.isEmpty = function(obj) {
+  for (var prop in obj) {
+    // Inlude null properties as empty.
+    if (obj[prop] !== null) {
+      return false;
+    }
+  }
+  return true;
+};
+
+/**
+ * Add a CSS class name to an element
+ * @param {Element} element    Element to add class name to
+ * @param {String} classToAdd Classname to add
+ * @private
+ */
+vjs.addClass = function(element, classToAdd){
+  if ((' '+element.className+' ').indexOf(' '+classToAdd+' ') == -1) {
+    element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;
+  }
+};
+
+/**
+ * Remove a CSS class name from an element
+ * @param {Element} element    Element to remove from class name
+ * @param {String} classToAdd Classname to remove
+ * @private
+ */
+vjs.removeClass = function(element, classToRemove){
+  var classNames, i;
+
+  if (element.className.indexOf(classToRemove) == -1) { return; }
+
+  classNames = element.className.split(' ');
+
+  // no arr.indexOf in ie8, and we don't want to add a big shim
+  for (i = classNames.length - 1; i >= 0; i--) {
+    if (classNames[i] === classToRemove) {
+      classNames.splice(i,1);
+    }
+  }
+
+  element.className = classNames.join(' ');
+};
+
+/**
+ * Element for testing browser HTML5 video capabilities
+ * @type {Element}
+ * @constant
+ * @private
+ */
+vjs.TEST_VID = vjs.createEl('video');
+
+/**
+ * Useragent for browser testing.
+ * @type {String}
+ * @constant
+ * @private
+ */
+vjs.USER_AGENT = navigator.userAgent;
+
+/**
+ * Device is an iPhone
+ * @type {Boolean}
+ * @constant
+ * @private
+ */
+vjs.IS_IPHONE = (/iPhone/i).test(vjs.USER_AGENT);
+vjs.IS_IPAD = (/iPad/i).test(vjs.USER_AGENT);
+vjs.IS_IPOD = (/iPod/i).test(vjs.USER_AGENT);
+vjs.IS_IOS = vjs.IS_IPHONE || vjs.IS_IPAD || vjs.IS_IPOD;
+
+vjs.IOS_VERSION = (function(){
+  var match = vjs.USER_AGENT.match(/OS (\d+)_/i);
+  if (match && match[1]) { return match[1]; }
+})();
+
+vjs.IS_ANDROID = (/Android/i).test(vjs.USER_AGENT);
+vjs.ANDROID_VERSION = (function() {
+  // This matches Android Major.Minor.Patch versions
+  // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned
+  var match = vjs.USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),
+    major,
+    minor;
+
+  if (!match) {
+    return null;
+  }
+
+  major = match[1] && parseFloat(match[1]);
+  minor = match[2] && parseFloat(match[2]);
+
+  if (major && minor) {
+    return parseFloat(match[1] + '.' + match[2]);
+  } else if (major) {
+    return major;
+  } else {
+    return null;
+  }
+})();
+// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser
+vjs.IS_OLD_ANDROID = vjs.IS_ANDROID && (/webkit/i).test(vjs.USER_AGENT) && vjs.ANDROID_VERSION < 2.3;
+
+vjs.IS_FIREFOX = (/Firefox/i).test(vjs.USER_AGENT);
+vjs.IS_CHROME = (/Chrome/i).test(vjs.USER_AGENT);
+
+vjs.TOUCH_ENABLED = !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch);
+
+/**
+ * Get an element's attribute values, as defined on the HTML tag
+ * Attributs are not the same as properties. They're defined on the tag
+ * or with setAttribute (which shouldn't be used with HTML)
+ * This will return true or false for boolean attributes.
+ * @param  {Element} tag Element from which to get tag attributes
+ * @return {Object}
+ * @private
+ */
+vjs.getAttributeValues = function(tag){
+  var obj, knownBooleans, attrs, attrName, attrVal;
+
+  obj = {};
+
+  // known boolean attributes
+  // we can check for matching boolean properties, but older browsers
+  // won't know about HTML5 boolean attributes that we still read from
+  knownBooleans = ','+'autoplay,controls,loop,muted,default'+',';
+
+  if (tag && tag.attributes && tag.attributes.length > 0) {
+    attrs = tag.attributes;
+
+    for (var i = attrs.length - 1; i >= 0; i--) {
+      attrName = attrs[i].name;
+      attrVal = attrs[i].value;
+
+      // check for known booleans
+      // the matching element property will return a value for typeof
+      if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(','+attrName+',') !== -1) {
+        // the value of an included boolean attribute is typically an empty
+        // string ('') which would equal false if we just check for a false value.
+        // we also don't want support bad code like autoplay='false'
+        attrVal = (attrVal !== null) ? true : false;
+      }
+
+      obj[attrName] = attrVal;
+    }
+  }
+
+  return obj;
+};
+
+/**
+ * Get the computed style value for an element
+ * From http://robertnyman.com/2006/04/24/get-the-rendered-style-of-an-element/
+ * @param  {Element} el        Element to get style value for
+ * @param  {String} strCssRule Style name
+ * @return {String}            Style value
+ * @private
+ */
+vjs.getComputedDimension = function(el, strCssRule){
+  var strValue = '';
+  if(document.defaultView && document.defaultView.getComputedStyle){
+    strValue = document.defaultView.getComputedStyle(el, '').getPropertyValue(strCssRule);
+
+  } else if(el.currentStyle){
+    // IE8 Width/Height support
+    strValue = el['client'+strCssRule.substr(0,1).toUpperCase() + strCssRule.substr(1)] + 'px';
+  }
+  return strValue;
+};
+
+/**
+ * Insert an element as the first child node of another
+ * @param  {Element} child   Element to insert
+ * @param  {[type]} parent Element to insert child into
+ * @private
+ */
+vjs.insertFirst = function(child, parent){
+  if (parent.firstChild) {
+    parent.insertBefore(child, parent.firstChild);
+  } else {
+    parent.appendChild(child);
+  }
+};
+
+/**
+ * Object to hold browser support information
+ * @type {Object}
+ * @private
+ */
+vjs.support = {};
+
+/**
+ * Shorthand for document.getElementById()
+ * Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.
+ * @param  {String} id  Element ID
+ * @return {Element}    Element with supplied ID
+ * @private
+ */
+vjs.el = function(id){
+  if (id.indexOf('#') === 0) {
+    id = id.slice(1);
+  }
+
+  return document.getElementById(id);
+};
+
+/**
+ * Format seconds as a time string, H:MM:SS or M:SS
+ * Supplying a guide (in seconds) will force a number of leading zeros
+ * to cover the length of the guide
+ * @param  {Number} seconds Number of seconds to be turned into a string
+ * @param  {Number} guide   Number (in seconds) to model the string after
+ * @return {String}         Time formatted as H:MM:SS or M:SS
+ * @private
+ */
+vjs.formatTime = function(seconds, guide) {
+  // Default to using seconds as guide
+  guide = guide || seconds;
+  var s = Math.floor(seconds % 60),
+      m = Math.floor(seconds / 60 % 60),
+      h = Math.floor(seconds / 3600),
+      gm = Math.floor(guide / 60 % 60),
+      gh = Math.floor(guide / 3600);
+
+  // handle invalid times
+  if (isNaN(seconds) || seconds === Infinity) {
+    // '-' is false for all relational operators (e.g. <, >=) so this setting
+    // will add the minimum number of fields specified by the guide
+    h = m = s = '-';
+  }
+
+  // Check if we need to show hours
+  h = (h > 0 || gh > 0) ? h + ':' : '';
+
+  // If hours are showing, we may need to add a leading zero.
+  // Always show at least one digit of minutes.
+  m = (((h || gm >= 10) && m < 10) ? '0' + m : m) + ':';
+
+  // Check if leading zero is need for seconds
+  s = (s < 10) ? '0' + s : s;
+
+  return h + m + s;
+};
+
+// Attempt to block the ability to select text while dragging controls
+vjs.blockTextSelection = function(){
+  document.body.focus();
+  document.onselectstart = function () { return false; };
+};
+// Turn off text selection blocking
+vjs.unblockTextSelection = function(){ document.onselectstart = function () { return true; }; };
+
+/**
+ * Trim whitespace from the ends of a string.
+ * @param  {String} string String to trim
+ * @return {String}        Trimmed string
+ * @private
+ */
+vjs.trim = function(str){
+  return (str+'').replace(/^\s+|\s+$/g, '');
+};
+
+/**
+ * Should round off a number to a decimal place
+ * @param  {Number} num Number to round
+ * @param  {Number} dec Number of decimal places to round to
+ * @return {Number}     Rounded number
+ * @private
+ */
+vjs.round = function(num, dec) {
+  if (!dec) { dec = 0; }
+  return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
+};
+
+/**
+ * Should create a fake TimeRange object
+ * Mimics an HTML5 time range instance, which has functions that
+ * return the start and end times for a range
+ * TimeRanges are returned by the buffered() method
+ * @param  {Number} start Start time in seconds
+ * @param  {Number} end   End time in seconds
+ * @return {Object}       Fake TimeRange object
+ * @private
+ */
+vjs.createTimeRange = function(start, end){
+  return {
+    length: 1,
+    start: function() { return start; },
+    end: function() { return end; }
+  };
+};
+
+/**
+ * Simple http request for retrieving external files (e.g. text tracks)
+ * @param  {String} url           URL of resource
+ * @param  {Function=} onSuccess  Success callback
+ * @param  {Function=} onError    Error callback
+ * @private
+ */
+vjs.get = function(url, onSuccess, onError){
+  var local, request;
+
+  if (typeof XMLHttpRequest === 'undefined') {
+    window.XMLHttpRequest = function () {
+      try { return new window.ActiveXObject('Msxml2.XMLHTTP.6.0'); } catch (e) {}
+      try { return new window.ActiveXObject('Msxml2.XMLHTTP.3.0'); } catch (f) {}
+      try { return new window.ActiveXObject('Msxml2.XMLHTTP'); } catch (g) {}
+      throw new Error('This browser does not support XMLHttpRequest.');
+    };
+  }
+
+  request = new XMLHttpRequest();
+  try {
+    request.open('GET', url);
+  } catch(e) {
+    onError(e);
+  }
+
+  local = (url.indexOf('file:') === 0 || (window.location.href.indexOf('file:') === 0 && url.indexOf('http') === -1));
+
+  request.onreadystatechange = function() {
+    if (request.readyState === 4) {
+      if (request.status === 200 || local && request.status === 0) {
+        onSuccess(request.responseText);
+      } else {
+        if (onError) {
+          onError();
+        }
+      }
+    }
+  };
+
+  try {
+    request.send();
+  } catch(e) {
+    if (onError) {
+      onError(e);
+    }
+  }
+};
+
+/**
+ * Add to local storage (may removeable)
+ * @private
+ */
+vjs.setLocalStorage = function(key, value){
+  try {
+    // IE was throwing errors referencing the var anywhere without this
+    var localStorage = window.localStorage || false;
+    if (!localStorage) { return; }
+    localStorage[key] = value;
+  } catch(e) {
+    if (e.code == 22 || e.code == 1014) { // Webkit == 22 / Firefox == 1014
+      vjs.log('LocalStorage Full (VideoJS)', e);
+    } else {
+      if (e.code == 18) {
+        vjs.log('LocalStorage not allowed (VideoJS)', e);
+      } else {
+        vjs.log('LocalStorage Error (VideoJS)', e);
+      }
+    }
+  }
+};
+
+/**
+ * Get abosolute version of relative URL. Used to tell flash correct URL.
+ * http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
+ * @param  {String} url URL to make absolute
+ * @return {String}     Absolute URL
+ * @private
+ */
+vjs.getAbsoluteURL = function(url){
+
+  // Check if absolute URL
+  if (!url.match(/^https?:\/\//)) {
+    // Convert to absolute URL. Flash hosted off-site needs an absolute URL.
+    url = vjs.createEl('div', {
+      innerHTML: '<a href="'+url+'">x</a>'
+    }).firstChild.href;
+  }
+
+  return url;
+};
+
+// usage: log('inside coolFunc',this,arguments);
+// http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
+vjs.log = function(){
+  vjs.log.history = vjs.log.history || [];   // store logs to an array for reference
+  vjs.log.history.push(arguments);
+  if(window.console){
+    window.console.log(Array.prototype.slice.call(arguments));
+  }
+};
+
+// Offset Left
+// getBoundingClientRect technique from John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/
+vjs.findPosition = function(el) {
+    var box, docEl, body, clientLeft, scrollLeft, left, clientTop, scrollTop, top;
+
+    if (el.getBoundingClientRect && el.parentNode) {
+      box = el.getBoundingClientRect();
+    }
+
+    if (!box) {
+      return {
+        left: 0,
+        top: 0
+      };
+    }
+
+    docEl = document.documentElement;
+    body = document.body;
+
+    clientLeft = docEl.clientLeft || body.clientLeft || 0;
+    scrollLeft = window.pageXOffset || body.scrollLeft;
+    left = box.left + scrollLeft - clientLeft;
+
+    clientTop = docEl.clientTop || body.clientTop || 0;
+    scrollTop = window.pageYOffset || body.scrollTop;
+    top = box.top + scrollTop - clientTop;
+
+    return {
+      left: left,
+      top: top
+    };
+};
+/**
+ * @fileoverview Player Component - Base class for all UI objects
+ *
+ */
+
+/**
+ * Base UI Component class
+ *
+ * Components are embeddable UI objects that are represented by both a
+ * javascript object and an element in the DOM. They can be children of other
+ * components, and can have many children themselves.
+ *
+ *     // adding a button to the player
+ *     var button = player.addChild('button');
+ *     button.el(); // -> button element
+ *
+ *     <div class="video-js">
+ *       <div class="vjs-button">Button</div>
+ *     </div>
+ *
+ * Components are also event emitters.
+ *
+ *     button.on('click', function(){
+ *       console.log('Button Clicked!');
+ *     });
+ *
+ *     button.trigger('customevent');
+ *
+ * @param {Object} player  Main Player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ * @extends vjs.CoreObject
+ */
+vjs.Component = vjs.CoreObject.extend({
+  /**
+   * the constructor funciton for the class
+   *
+   * @constructor
+   */
+  init: function(player, options, ready){
+    this.player_ = player;
+
+    // Make a copy of prototype.options_ to protect against overriding global defaults
+    this.options_ = vjs.obj.copy(this.options_);
+
+    // Updated options with supplied options
+    options = this.options(options);
+
+    // Get ID from options, element, or create using player ID and unique ID
+    this.id_ = options['id'] || ((options['el'] && options['el']['id']) ? options['el']['id'] : player.id() + '_component_' + vjs.guid++ );
+
+    this.name_ = options['name'] || null;
+
+    // Create element if one wasn't provided in options
+    this.el_ = options['el'] || this.createEl();
+
+    this.children_ = [];
+    this.childIndex_ = {};
+    this.childNameIndex_ = {};
+
+    // Add any child components in options
+    this.initChildren();
+
+    this.ready(ready);
+    // Don't want to trigger ready here or it will before init is actually
+    // finished for all children that run this constructor
+  }
+});
+
+/**
+ * Dispose of the component and all child components
+ */
+vjs.Component.prototype.dispose = function(){
+  this.trigger('dispose');
+
+  // Dispose all children.
+  if (this.children_) {
+    for (var i = this.children_.length - 1; i >= 0; i--) {
+      if (this.children_[i].dispose) {
+        this.children_[i].dispose();
+      }
+    }
+  }
+
+  // Delete child references
+  this.children_ = null;
+  this.childIndex_ = null;
+  this.childNameIndex_ = null;
+
+  // Remove all event listeners.
+  this.off();
+
+  // Remove element from DOM
+  if (this.el_.parentNode) {
+    this.el_.parentNode.removeChild(this.el_);
+  }
+
+  vjs.removeData(this.el_);
+  this.el_ = null;
+};
+
+/**
+ * Reference to main player instance
+ *
+ * @type {vjs.Player}
+ * @private
+ */
+vjs.Component.prototype.player_ = true;
+
+/**
+ * Return the component's player
+ *
+ * @return {vjs.Player}
+ */
+vjs.Component.prototype.player = function(){
+  return this.player_;
+};
+
+/**
+ * The component's options object
+ *
+ * @type {Object}
+ * @private
+ */
+vjs.Component.prototype.options_;
+
+/**
+ * Deep merge of options objects
+ *
+ * Whenever a property is an object on both options objects
+ * the two properties will be merged using vjs.obj.deepMerge.
+ *
+ * This is used for merging options for child components. We
+ * want it to be easy to override individual options on a child
+ * component without having to rewrite all the other default options.
+ *
+ *     Parent.prototype.options_ = {
+ *       children: {
+ *         'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },
+ *         'childTwo': {},
+ *         'childThree': {}
+ *       }
+ *     }
+ *     newOptions = {
+ *       children: {
+ *         'childOne': { 'foo': 'baz', 'abc': '123' }
+ *         'childTwo': null,
+ *         'childFour': {}
+ *       }
+ *     }
+ *
+ *     this.options(newOptions);
+ *
+ * RESULT
+ *
+ *     {
+ *       children: {
+ *         'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },
+ *         'childTwo': null, // Disabled. Won't be initialized.
+ *         'childThree': {},
+ *         'childFour': {}
+ *       }
+ *     }
+ *
+ * @param  {Object} obj Object whose values will be overwritten
+ * @return {Object}     NEW merged object. Does not return obj1.
+ */
+vjs.Component.prototype.options = function(obj){
+  if (obj === undefined) return this.options_;
+
+  return this.options_ = vjs.obj.deepMerge(this.options_, obj);
+};
+
+/**
+ * The DOM element for the component
+ *
+ * @type {Element}
+ * @private
+ */
+vjs.Component.prototype.el_;
+
+/**
+ * Create the component's DOM element
+ *
+ * @param  {String=} tagName  Element's node type. e.g. 'div'
+ * @param  {Object=} attributes An object of element attributes that should be set on the element
+ * @return {Element}
+ */
+vjs.Component.prototype.createEl = function(tagName, attributes){
+  return vjs.createEl(tagName, attributes);
+};
+
+/**
+ * Get the component's DOM element
+ *
+ *     var domEl = myComponent.el();
+ *
+ * @return {Element}
+ */
+vjs.Component.prototype.el = function(){
+  return this.el_;
+};
+
+/**
+ * An optional element where, if defined, children will be inserted instead of
+ * directly in `el_`
+ *
+ * @type {Element}
+ * @private
+ */
+vjs.Component.prototype.contentEl_;
+
+/**
+ * Return the component's DOM element for embedding content.
+ * Will either be el_ or a new element defined in createEl.
+ *
+ * @return {Element}
+ */
+vjs.Component.prototype.contentEl = function(){
+  return this.contentEl_ || this.el_;
+};
+
+/**
+ * The ID for the component
+ *
+ * @type {String}
+ * @private
+ */
+vjs.Component.prototype.id_;
+
+/**
+ * Get the component's ID
+ *
+ *     var id = myComponent.id();
+ *
+ * @return {String}
+ */
+vjs.Component.prototype.id = function(){
+  return this.id_;
+};
+
+/**
+ * The name for the component. Often used to reference the component.
+ *
+ * @type {String}
+ * @private
+ */
+vjs.Component.prototype.name_;
+
+/**
+ * Get the component's name. The name is often used to reference the component.
+ *
+ *     var name = myComponent.name();
+ *
+ * @return {String}
+ */
+vjs.Component.prototype.name = function(){
+  return this.name_;
+};
+
+/**
+ * Array of child components
+ *
+ * @type {Array}
+ * @private
+ */
+vjs.Component.prototype.children_;
+
+/**
+ * Get an array of all child components
+ *
+ *     var kids = myComponent.children();
+ *
+ * @return {Array} The children
+ */
+vjs.Component.prototype.children = function(){
+  return this.children_;
+};
+
+/**
+ * Object of child components by ID
+ *
+ * @type {Object}
+ * @private
+ */
+vjs.Component.prototype.childIndex_;
+
+/**
+ * Returns a child component with the provided ID
+ *
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.getChildById = function(id){
+  return this.childIndex_[id];
+};
+
+/**
+ * Object of child components by name
+ *
+ * @type {Object}
+ * @private
+ */
+vjs.Component.prototype.childNameIndex_;
+
+/**
+ * Returns a child component with the provided ID
+ *
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.getChild = function(name){
+  return this.childNameIndex_[name];
+};
+
+/**
+ * Adds a child component inside this component
+ *
+ *     myComponent.el();
+ *     // -> <div class='my-component'></div>
+ *     myComonent.children();
+ *     // [empty array]
+ *
+ *     var myButton = myComponent.addChild('MyButton');
+ *     // -> <div class='my-component'><div class="my-button">myButton<div></div>
+ *     // -> myButton === myComonent.children()[0];
+ *
+ * Pass in options for child constructors and options for children of the child
+ *
+ *    var myButton = myComponent.addChild('MyButton', {
+ *      text: 'Press Me',
+ *      children: {
+ *        buttonChildExample: {
+ *          buttonChildOption: true
+ *        }
+ *      }
+ *    });
+ *
+ * @param {String|vjs.Component} child The class name or instance of a child to add
+ * @param {Object=} options Options, including options to be passed to children of the child.
+ * @return {vjs.Component} The child component (created by this process if a string was used)
+ * @suppress {accessControls|checkRegExp|checkTypes|checkVars|const|constantProperty|deprecated|duplicate|es5Strict|fileoverviewTags|globalThis|invalidCasts|missingProperties|nonStandardJsDocs|strictModuleDepCheck|undefinedNames|undefinedVars|unknownDefines|uselessCode|visibility}
+ */
+vjs.Component.prototype.addChild = function(child, options){
+  var component, componentClass, componentName, componentId;
+
+  // If string, create new component with options
+  if (typeof child === 'string') {
+
+    componentName = child;
+
+    // Make sure options is at least an empty object to protect against errors
+    options = options || {};
+
+    // Assume name of set is a lowercased name of the UI Class (PlayButton, etc.)
+    componentClass = options['componentClass'] || vjs.capitalize(componentName);
+
+    // Set name through options
+    options['name'] = componentName;
+
+    // Create a new object & element for this controls set
+    // If there's no .player_, this is a player
+    // Closure Compiler throws an 'incomplete alias' warning if we use the vjs variable directly.
+    // Every class should be exported, so this should never be a problem here.
+    component = new window['videojs'][componentClass](this.player_ || this, options);
+
+  // child is a component instance
+  } else {
+    component = child;
+  }
+
+  this.children_.push(component);
+
+  if (typeof component.id === 'function') {
+    this.childIndex_[component.id()] = component;
+  }
+
+  // If a name wasn't used to create the component, check if we can use the
+  // name function of the component
+  componentName = componentName || (component.name && component.name());
+
+  if (componentName) {
+    this.childNameIndex_[componentName] = component;
+  }
+
+  // Add the UI object's element to the container div (box)
+  // Having an element is not required
+  if (typeof component['el'] === 'function' && component['el']()) {
+    this.contentEl().appendChild(component['el']());
+  }
+
+  // Return so it can stored on parent object if desired.
+  return component;
+};
+
+/**
+ * Remove a child component from this component's list of children, and the
+ * child component's element from this component's element
+ *
+ * @param  {vjs.Component} component Component to remove
+ */
+vjs.Component.prototype.removeChild = function(component){
+  if (typeof component === 'string') {
+    component = this.getChild(component);
+  }
+
+  if (!component || !this.children_) return;
+
+  var childFound = false;
+  for (var i = this.children_.length - 1; i >= 0; i--) {
+    if (this.children_[i] === component) {
+      childFound = true;
+      this.children_.splice(i,1);
+      break;
+    }
+  }
+
+  if (!childFound) return;
+
+  this.childIndex_[component.id] = null;
+  this.childNameIndex_[component.name] = null;
+
+  var compEl = component.el();
+  if (compEl && compEl.parentNode === this.contentEl()) {
+    this.contentEl().removeChild(component.el());
+  }
+};
+
+/**
+ * Add and initialize default child components from options
+ *
+ *     // when an instance of MyComponent is created, all children in options
+ *     // will be added to the instance by their name strings and options
+ *     MyComponent.prototype.options_.children = {
+ *       myChildComponent: {
+ *         myChildOption: true
+ *       }
+ *     }
+ */
+vjs.Component.prototype.initChildren = function(){
+  var options = this.options_;
+
+  if (options && options['children']) {
+    var self = this;
+
+    // Loop through components and add them to the player
+    vjs.obj.each(options['children'], function(name, opts){
+      // Allow for disabling default components
+      // e.g. vjs.options['children']['posterImage'] = false
+      if (opts === false) return;
+
+      // Allow waiting to add components until a specific event is called
+      var tempAdd = function(){
+        // Set property name on player. Could cause conflicts with other prop names, but it's worth making refs easy.
+        self[name] = self.addChild(name, opts);
+      };
+
+      if (opts['loadEvent']) {
+        // this.one(opts.loadEvent, tempAdd)
+      } else {
+        tempAdd();
+      }
+    });
+  }
+};
+
+/**
+ * Allows sub components to stack CSS class names
+ *
+ * @return {String} The constructed class name
+ */
+vjs.Component.prototype.buildCSSClass = function(){
+    // Child classes can include a function that does:
+    // return 'CLASS NAME' + this._super();
+    return '';
+};
+
+/* Events
+============================================================================= */
+
+/**
+ * Add an event listener to this component's element
+ *
+ *     var myFunc = function(){
+ *       var myPlayer = this;
+ *       // Do something when the event is fired
+ *     };
+ *
+ *     myPlayer.on("eventName", myFunc);
+ *
+ * The context will be the component.
+ *
+ * @param  {String}   type The event type e.g. 'click'
+ * @param  {Function} fn   The event listener
+ * @return {vjs.Component} self
+ */
+vjs.Component.prototype.on = function(type, fn){
+  vjs.on(this.el_, type, vjs.bind(this, fn));
+  return this;
+};
+
+/**
+ * Remove an event listener from the component's element
+ *
+ *     myComponent.off("eventName", myFunc);
+ *
+ * @param  {String=}   type Event type. Without type it will remove all listeners.
+ * @param  {Function=} fn   Event listener. Without fn it will remove all listeners for a type.
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.off = function(type, fn){
+  vjs.off(this.el_, type, fn);
+  return this;
+};
+
+/**
+ * Add an event listener to be triggered only once and then removed
+ *
+ * @param  {String}   type Event type
+ * @param  {Function} fn   Event listener
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.one = function(type, fn) {
+  vjs.one(this.el_, type, vjs.bind(this, fn));
+  return this;
+};
+
+/**
+ * Trigger an event on an element
+ *
+ *     myComponent.trigger('eventName');
+ *
+ * @param  {String}       type  The event type to trigger, e.g. 'click'
+ * @param  {Event|Object} event The event object to be passed to the listener
+ * @return {vjs.Component}      self
+ */
+vjs.Component.prototype.trigger = function(type, event){
+  vjs.trigger(this.el_, type, event);
+  return this;
+};
+
+/* Ready
+================================================================================ */
+/**
+ * Is the component loaded
+ * This can mean different things depending on the component.
+ *
+ * @private
+ * @type {Boolean}
+ */
+vjs.Component.prototype.isReady_;
+
+/**
+ * Trigger ready as soon as initialization is finished
+ *
+ * Allows for delaying ready. Override on a sub class prototype.
+ * If you set this.isReadyOnInitFinish_ it will affect all components.
+ * Specially used when waiting for the Flash player to asynchrnously load.
+ *
+ * @type {Boolean}
+ * @private
+ */
+vjs.Component.prototype.isReadyOnInitFinish_ = true;
+
+/**
+ * List of ready listeners
+ *
+ * @type {Array}
+ * @private
+ */
+vjs.Component.prototype.readyQueue_;
+
+/**
+ * Bind a listener to the component's ready state
+ *
+ * Different from event listeners in that if the ready event has already happend
+ * it will trigger the function immediately.
+ *
+ * @param  {Function} fn Ready listener
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.ready = function(fn){
+  if (fn) {
+    if (this.isReady_) {
+      fn.call(this);
+    } else {
+      if (this.readyQueue_ === undefined) {
+        this.readyQueue_ = [];
+      }
+      this.readyQueue_.push(fn);
+    }
+  }
+  return this;
+};
+
+/**
+ * Trigger the ready listeners
+ *
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.triggerReady = function(){
+  this.isReady_ = true;
+
+  var readyQueue = this.readyQueue_;
+
+  if (readyQueue && readyQueue.length > 0) {
+
+    for (var i = 0, j = readyQueue.length; i < j; i++) {
+      readyQueue[i].call(this);
+    }
+
+    // Reset Ready Queue
+    this.readyQueue_ = [];
+
+    // Allow for using event listeners also, in case you want to do something everytime a source is ready.
+    this.trigger('ready');
+  }
+};
+
+/* Display
+============================================================================= */
+
+/**
+ * Add a CSS class name to the component's element
+ *
+ * @param {String} classToAdd Classname to add
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.addClass = function(classToAdd){
+  vjs.addClass(this.el_, classToAdd);
+  return this;
+};
+
+/**
+ * Remove a CSS class name from the component's element
+ *
+ * @param {String} classToRemove Classname to remove
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.removeClass = function(classToRemove){
+  vjs.removeClass(this.el_, classToRemove);
+  return this;
+};
+
+/**
+ * Show the component element if hidden
+ *
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.show = function(){
+  this.el_.style.display = 'block';
+  return this;
+};
+
+/**
+ * Hide the component element if hidden
+ *
+ * @return {vjs.Component}
+ */
+vjs.Component.prototype.hide = function(){
+  this.el_.style.display = 'none';
+  return this;
+};
+
+/**
+ * Lock an item in its visible state
+ * To be used with fadeIn/fadeOut.
+ *
+ * @return {vjs.Component}
+ * @private
+ */
+vjs.Component.prototype.lockShowing = function(){
+  this.addClass('vjs-lock-showing');
+  return this;
+};
+
+/**
+ * Unlock an item to be hidden
+ * To be used with fadeIn/fadeOut.
+ *
+ * @return {vjs.Component}
+ * @private
+ */
+vjs.Component.prototype.unlockShowing = function(){
+  this.removeClass('vjs-lock-showing');
+  return this;
+};
+
+/**
+ * Disable component by making it unshowable
+ */
+vjs.Component.prototype.disable = function(){
+  this.hide();
+  this.show = function(){};
+};
+
+/**
+ * Set or get the width of the component (CSS values)
+ *
+ * Video tag width/height only work in pixels. No percents.
+ * But allowing limited percents use. e.g. width() will return number+%, not computed width
+ *
+ * @param  {Number|String=} num   Optional width number
+ * @param  {Boolean} skipListeners Skip the 'resize' event trigger
+ * @return {vjs.Component} Returns 'this' if width was set
+ * @return {Number|String} Returns the width if nothing was set
+ */
+vjs.Component.prototype.width = function(num, skipListeners){
+  return this.dimension('width', num, skipListeners);
+};
+
+/**
+ * Get or set the height of the component (CSS values)
+ *
+ * @param  {Number|String=} num     New component height
+ * @param  {Boolean=} skipListeners Skip the resize event trigger
+ * @return {vjs.Component} The component if the height was set
+ * @return {Number|String} The height if it wasn't set
+ */
+vjs.Component.prototype.height = function(num, skipListeners){
+  return this.dimension('height', num, skipListeners);
+};
+
+/**
+ * Set both width and height at the same time
+ *
+ * @param  {Number|String} width
+ * @param  {Number|String} height
+ * @return {vjs.Component} The component
+ */
+vjs.Component.prototype.dimensions = function(width, height){
+  // Skip resize listeners on width for optimization
+  return this.width(width, true).height(height);
+};
+
+/**
+ * Get or set width or height
+ *
+ * This is the shared code for the width() and height() methods.
+ * All for an integer, integer + 'px' or integer + '%';
+ *
+ * Known issue: Hidden elements officially have a width of 0. We're defaulting
+ * to the style.width value and falling back to computedStyle which has the
+ * hidden element issue. Info, but probably not an efficient fix:
+ * http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/
+ *
+ * @param  {String} widthOrHeight  'width' or 'height'
+ * @param  {Number|String=} num     New dimension
+ * @param  {Boolean=} skipListeners Skip resize event trigger
+ * @return {vjs.Component} The component if a dimension was set
+ * @return {Number|String} The dimension if nothing was set
+ * @private
+ */
+vjs.Component.prototype.dimension = function(widthOrHeight, num, skipListeners){
+  if (num !== undefined) {
+
+    // Check if using css width/height (% or px) and adjust
+    if ((''+num).indexOf('%') !== -1 || (''+num).indexOf('px') !== -1) {
+      this.el_.style[widthOrHeight] = num;
+    } else if (num === 'auto') {
+      this.el_.style[widthOrHeight] = '';
+    } else {
+      this.el_.style[widthOrHeight] = num+'px';
+    }
+
+    // skipListeners allows us to avoid triggering the resize event when setting both width and height
+    if (!skipListeners) { this.trigger('resize'); }
+
+    // Return component
+    return this;
+  }
+
+  // Not setting a value, so getting it
+  // Make sure element exists
+  if (!this.el_) return 0;
+
+  // Get dimension value from style
+  var val = this.el_.style[widthOrHeight];
+  var pxIndex = val.indexOf('px');
+  if (pxIndex !== -1) {
+    // Return the pixel value with no 'px'
+    return parseInt(val.slice(0,pxIndex), 10);
+
+  // No px so using % or no style was set, so falling back to offsetWidth/height
+  // If component has display:none, offset will return 0
+  // TODO: handle display:none and no dimension style using px
+  } else {
+
+    return parseInt(this.el_['offset'+vjs.capitalize(widthOrHeight)], 10);
+
+    // ComputedStyle version.
+    // Only difference is if the element is hidden it will return
+    // the percent value (e.g. '100%'')
+    // instead of zero like offsetWidth returns.
+    // var val = vjs.getComputedStyleValue(this.el_, widthOrHeight);
+    // var pxIndex = val.indexOf('px');
+
+    // if (pxIndex !== -1) {
+    //   return val.slice(0, pxIndex);
+    // } else {
+    //   return val;
+    // }
+  }
+};
+
+/**
+ * Fired when the width and/or height of the component changes
+ * @event resize
+ */
+vjs.Component.prototype.onResize;
+
+/**
+ * Emit 'tap' events when touch events are supported
+ *
+ * This is used to support toggling the controls through a tap on the video.
+ *
+ * We're requireing them to be enabled because otherwise every component would
+ * have this extra overhead unnecessarily, on mobile devices where extra
+ * overhead is especially bad.
+ * @private
+ */
+vjs.Component.prototype.emitTapEvents = function(){
+  var touchStart, touchTime, couldBeTap, noTap;
+
+  // Track the start time so we can determine how long the touch lasted
+  touchStart = 0;
+
+  this.on('touchstart', function(event) {
+    // Record start time so we can detect a tap vs. "touch and hold"
+    touchStart = new Date().getTime();
+    // Reset couldBeTap tracking
+    couldBeTap = true;
+  });
+
+  noTap = function(){
+    couldBeTap = false;
+  };
+  // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s
+  this.on('touchmove', noTap);
+  this.on('touchleave', noTap);
+  this.on('touchcancel', noTap);
+
+  // When the touch ends, measure how long it took and trigger the appropriate
+  // event
+  this.on('touchend', function() {
+    // Proceed only if the touchmove/leave/cancel event didn't happen
+    if (couldBeTap === true) {
+      // Measure how long the touch lasted
+      touchTime = new Date().getTime() - touchStart;
+      // The touch needs to be quick in order to consider it a tap
+      if (touchTime < 250) {
+        this.trigger('tap');
+        // It may be good to copy the touchend event object and change the
+        // type to tap, if the other event properties aren't exact after
+        // vjs.fixEvent runs (e.g. event.target)
+      }
+    }
+  });
+};
+/* Button - Base class for all buttons
+================================================================================ */
+/**
+ * Base class for all buttons
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.Button = vjs.Component.extend({
+  /**
+   * @constructor
+   * @inheritDoc
+   */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    var touchstart = false;
+    this.on('touchstart', function(event) {
+      // Stop click and other mouse events from triggering also
+      event.preventDefault();
+      touchstart = true;
+    });
+    this.on('touchmove', function() {
+      touchstart = false;
+    });
+    var self = this;
+    this.on('touchend', function(event) {
+      if (touchstart) {
+        self.onClick(event);
+      }
+      event.preventDefault();
+    });
+
+    this.on('click', this.onClick);
+    this.on('focus', this.onFocus);
+    this.on('blur', this.onBlur);
+  }
+});
+
+vjs.Button.prototype.createEl = function(type, props){
+  // Add standard Aria and Tabindex info
+  props = vjs.obj.merge({
+    className: this.buildCSSClass(),
+    innerHTML: '<div class="vjs-control-content"><span class="vjs-control-text">' + (this.buttonText || 'Need Text') + '</span></div>',
+    role: 'button',
+    'aria-live': 'polite', // let the screen reader user know that the text of the button may change
+    tabIndex: 0
+  }, props);
+
+  return vjs.Component.prototype.createEl.call(this, type, props);
+};
+
+vjs.Button.prototype.buildCSSClass = function(){
+  // TODO: Change vjs-control to vjs-button?
+  return 'vjs-control ' + vjs.Component.prototype.buildCSSClass.call(this);
+};
+
+  // Click - Override with specific functionality for button
+vjs.Button.prototype.onClick = function(){};
+
+  // Focus - Add keyboard functionality to element
+vjs.Button.prototype.onFocus = function(){
+  vjs.on(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+
+  // KeyPress (document level) - Trigger click when keys are pressed
+vjs.Button.prototype.onKeyPress = function(event){
+  // Check for space bar (32) or enter (13) keys
+  if (event.which == 32 || event.which == 13) {
+    event.preventDefault();
+    this.onClick();
+  }
+};
+
+// Blur - Remove keyboard triggers
+vjs.Button.prototype.onBlur = function(){
+  vjs.off(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+/* Slider
+================================================================================ */
+/**
+ * The base functionality for sliders like the volume bar and seek bar
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.Slider = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    // Set property names to bar and handle to match with the child Slider class is looking for
+    this.bar = this.getChild(this.options_['barName']);
+    this.handle = this.getChild(this.options_['handleName']);
+
+    player.on(this.playerEvent, vjs.bind(this, this.update));
+
+    this.on('mousedown', this.onMouseDown);
+    this.on('touchstart', this.onMouseDown);
+    this.on('focus', this.onFocus);
+    this.on('blur', this.onBlur);
+    this.on('click', this.onClick);
+
+    this.player_.on('controlsvisible', vjs.bind(this, this.update));
+
+    // This is actually to fix the volume handle position. http://twitter.com/#!/gerritvanaaken/status/159046254519787520
+    // this.player_.one('timeupdate', vjs.bind(this, this.update));
+
+    player.ready(vjs.bind(this, this.update));
+
+    this.boundEvents = {};
+  }
+});
+
+vjs.Slider.prototype.createEl = function(type, props) {
+  props = props || {};
+  // Add the slider element class to all sub classes
+  props.className = props.className + ' vjs-slider';
+  props = vjs.obj.merge({
+    role: 'slider',
+    'aria-valuenow': 0,
+    'aria-valuemin': 0,
+    'aria-valuemax': 100,
+    tabIndex: 0
+  }, props);
+
+  return vjs.Component.prototype.createEl.call(this, type, props);
+};
+
+vjs.Slider.prototype.onMouseDown = function(event){
+  event.preventDefault();
+  vjs.blockTextSelection();
+
+  this.boundEvents.move = vjs.bind(this, this.onMouseMove);
+  this.boundEvents.end = vjs.bind(this, this.onMouseUp);
+
+  vjs.on(document, 'mousemove', this.boundEvents.move);
+  vjs.on(document, 'mouseup', this.boundEvents.end);
+  vjs.on(document, 'touchmove', this.boundEvents.move);
+  vjs.on(document, 'touchend', this.boundEvents.end);
+
+  this.onMouseMove(event);
+};
+
+vjs.Slider.prototype.onMouseUp = function() {
+  vjs.unblockTextSelection();
+  vjs.off(document, 'mousemove', this.boundEvents.move, false);
+  vjs.off(document, 'mouseup', this.boundEvents.end, false);
+  vjs.off(document, 'touchmove', this.boundEvents.move, false);
+  vjs.off(document, 'touchend', this.boundEvents.end, false);
+
+  this.update();
+};
+
+vjs.Slider.prototype.update = function(){
+  // In VolumeBar init we have a setTimeout for update that pops and update to the end of the
+  // execution stack. The player is destroyed before then update will cause an error
+  if (!this.el_) return;
+
+  // If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.
+  // On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.
+  // var progress =  (this.player_.scrubbing) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();
+
+  var barProgress,
+      progress = this.getPercent(),
+      handle = this.handle,
+      bar = this.bar;
+
+  // Protect against no duration and other division issues
+  if (isNaN(progress)) { progress = 0; }
+
+  barProgress = progress;
+
+  // If there is a handle, we need to account for the handle in our calculation for progress bar
+  // so that it doesn't fall short of or extend past the handle.
+  if (handle) {
+
+    var box = this.el_,
+        boxWidth = box.offsetWidth,
+
+        handleWidth = handle.el().offsetWidth,
+
+        // The width of the handle in percent of the containing box
+        // In IE, widths may not be ready yet causing NaN
+        handlePercent = (handleWidth) ? handleWidth / boxWidth : 0,
+
+        // Get the adjusted size of the box, considering that the handle's center never touches the left or right side.
+        // There is a margin of half the handle's width on both sides.
+        boxAdjustedPercent = 1 - handlePercent,
+
+        // Adjust the progress that we'll use to set widths to the new adjusted box width
+        adjustedProgress = progress * boxAdjustedPercent;
+
+    // The bar does reach the left side, so we need to account for this in the bar's width
+    barProgress = adjustedProgress + (handlePercent / 2);
+
+    // Move the handle from the left based on the adjected progress
+    handle.el().style.left = vjs.round(adjustedProgress * 100, 2) + '%';
+  }
+
+  // Set the new bar width
+  bar.el().style.width = vjs.round(barProgress * 100, 2) + '%';
+};
+
+vjs.Slider.prototype.calculateDistance = function(event){
+  var el, box, boxX, boxY, boxW, boxH, handle, pageX, pageY;
+
+  el = this.el_;
+  box = vjs.findPosition(el);
+  boxW = boxH = el.offsetWidth;
+  handle = this.handle;
+
+  if (this.options_.vertical) {
+    boxY = box.top;
+
+    if (event.changedTouches) {
+      pageY = event.changedTouches[0].pageY;
+    } else {
+      pageY = event.pageY;
+    }
+
+    if (handle) {
+      var handleH = handle.el().offsetHeight;
+      // Adjusted X and Width, so handle doesn't go outside the bar
+      boxY = boxY + (handleH / 2);
+      boxH = boxH - handleH;
+    }
+
+    // Percent that the click is through the adjusted area
+    return Math.max(0, Math.min(1, ((boxY - pageY) + boxH) / boxH));
+
+  } else {
+    boxX = box.left;
+
+    if (event.changedTouches) {
+      pageX = event.changedTouches[0].pageX;
+    } else {
+      pageX = event.pageX;
+    }
+
+    if (handle) {
+      var handleW = handle.el().offsetWidth;
+
+      // Adjusted X and Width, so handle doesn't go outside the bar
+      boxX = boxX + (handleW / 2);
+      boxW = boxW - handleW;
+    }
+
+    // Percent that the click is through the adjusted area
+    return Math.max(0, Math.min(1, (pageX - boxX) / boxW));
+  }
+};
+
+vjs.Slider.prototype.onFocus = function(){
+  vjs.on(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+
+vjs.Slider.prototype.onKeyPress = function(event){
+  if (event.which == 37) { // Left Arrow
+    event.preventDefault();
+    this.stepBack();
+  } else if (event.which == 39) { // Right Arrow
+    event.preventDefault();
+    this.stepForward();
+  }
+};
+
+vjs.Slider.prototype.onBlur = function(){
+  vjs.off(document, 'keyup', vjs.bind(this, this.onKeyPress));
+};
+
+/**
+ * Listener for click events on slider, used to prevent clicks
+ *   from bubbling up to parent elements like button menus.
+ * @param  {Object} event Event object
+ */
+vjs.Slider.prototype.onClick = function(event){
+  event.stopImmediatePropagation();
+  event.preventDefault();
+};
+
+/**
+ * SeekBar Behavior includes play progress bar, and seek handle
+ * Needed so it can determine seek position based on handle position/size
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.SliderHandle = vjs.Component.extend();
+
+/**
+ * Default value of the slider
+ *
+ * @type {Number}
+ * @private
+ */
+vjs.SliderHandle.prototype.defaultValue = 0;
+
+/** @inheritDoc */
+vjs.SliderHandle.prototype.createEl = function(type, props) {
+  props = props || {};
+  // Add the slider element class to all sub classes
+  props.className = props.className + ' vjs-slider-handle';
+  props = vjs.obj.merge({
+    innerHTML: '<span class="vjs-control-text">'+this.defaultValue+'</span>'
+  }, props);
+
+  return vjs.Component.prototype.createEl.call(this, 'div', props);
+};
+/* Menu
+================================================================================ */
+/**
+ * The Menu component is used to build pop up menus, including subtitle and
+ * captions selection menus.
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.Menu = vjs.Component.extend();
+
+/**
+ * Add a menu item to the menu
+ * @param {Object|String} component Component or component type to add
+ */
+vjs.Menu.prototype.addItem = function(component){
+  this.addChild(component);
+  component.on('click', vjs.bind(this, function(){
+    this.unlockShowing();
+  }));
+};
+
+/** @inheritDoc */
+vjs.Menu.prototype.createEl = function(){
+  var contentElType = this.options().contentElType || 'ul';
+  this.contentEl_ = vjs.createEl(contentElType, {
+    className: 'vjs-menu-content'
+  });
+  var el = vjs.Component.prototype.createEl.call(this, 'div', {
+    append: this.contentEl_,
+    className: 'vjs-menu'
+  });
+  el.appendChild(this.contentEl_);
+
+  // Prevent clicks from bubbling up. Needed for Menu Buttons,
+  // where a click on the parent is significant
+  vjs.on(el, 'click', function(event){
+    event.preventDefault();
+    event.stopImmediatePropagation();
+  });
+
+  return el;
+};
+
+/**
+ * The component for a menu item. `<li>`
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.MenuItem = vjs.Button.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+    this.selected(options['selected']);
+  }
+});
+
+/** @inheritDoc */
+vjs.MenuItem.prototype.createEl = function(type, props){
+  return vjs.Button.prototype.createEl.call(this, 'li', vjs.obj.merge({
+    className: 'vjs-menu-item',
+    innerHTML: this.options_['label']
+  }, props));
+};
+
+/**
+ * Handle a click on the menu item, and set it to selected
+ */
+vjs.MenuItem.prototype.onClick = function(){
+  this.selected(true);
+};
+
+/**
+ * Set this menu item as selected or not
+ * @param  {Boolean} selected
+ */
+vjs.MenuItem.prototype.selected = function(selected){
+  if (selected) {
+    this.addClass('vjs-selected');
+    this.el_.setAttribute('aria-selected',true);
+  } else {
+    this.removeClass('vjs-selected');
+    this.el_.setAttribute('aria-selected',false);
+  }
+};
+
+
+/**
+ * A button class with a popup menu
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.MenuButton = vjs.Button.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+
+    this.menu = this.createMenu();
+
+    // Add list to element
+    this.addChild(this.menu);
+
+    // Automatically hide empty menu buttons
+    if (this.items && this.items.length === 0) {
+      this.hide();
+    }
+
+    this.on('keyup', this.onKeyPress);
+    this.el_.setAttribute('aria-haspopup', true);
+    this.el_.setAttribute('role', 'button');
+  }
+});
+
+/**
+ * Track the state of the menu button
+ * @type {Boolean}
+ * @private
+ */
+vjs.MenuButton.prototype.buttonPressed_ = false;
+
+vjs.MenuButton.prototype.createMenu = function(){
+  var menu = new vjs.Menu(this.player_);
+
+  // Add a title list item to the top
+  if (this.options().title) {
+    menu.el().appendChild(vjs.createEl('li', {
+      className: 'vjs-menu-title',
+      innerHTML: vjs.capitalize(this.kind_),
+      tabindex: -1
+    }));
+  }
+
+  this.items = this['createItems']();
+
+  if (this.items) {
+    // Add menu items to the menu
+    for (var i = 0; i < this.items.length; i++) {
+      menu.addItem(this.items[i]);
+    }
+  }
+
+  return menu;
+};
+
+/**
+ * Create the list of menu items. Specific to each subclass.
+ */
+vjs.MenuButton.prototype.createItems = function(){};
+
+/** @inheritDoc */
+vjs.MenuButton.prototype.buildCSSClass = function(){
+  return this.className + ' vjs-menu-button ' + vjs.Button.prototype.buildCSSClass.call(this);
+};
+
+// Focus - Add keyboard functionality to element
+// This function is not needed anymore. Instead, the keyboard functionality is handled by
+// treating the button as triggering a submenu. When the button is pressed, the submenu
+// appears. Pressing the button again makes the submenu disappear.
+vjs.MenuButton.prototype.onFocus = function(){};
+// Can't turn off list display that we turned on with focus, because list would go away.
+vjs.MenuButton.prototype.onBlur = function(){};
+
+vjs.MenuButton.prototype.onClick = function(){
+  // When you click the button it adds focus, which will show the menu indefinitely.
+  // So we'll remove focus when the mouse leaves the button.
+  // Focus is needed for tab navigation.
+  this.one('mouseout', vjs.bind(this, function(){
+    this.menu.unlockShowing();
+    this.el_.blur();
+  }));
+  if (this.buttonPressed_){
+    this.unpressButton();
+  } else {
+    this.pressButton();
+  }
+};
+
+vjs.MenuButton.prototype.onKeyPress = function(event){
+  event.preventDefault();
+
+  // Check for space bar (32) or enter (13) keys
+  if (event.which == 32 || event.which == 13) {
+    if (this.buttonPressed_){
+      this.unpressButton();
+    } else {
+      this.pressButton();
+    }
+  // Check for escape (27) key
+  } else if (event.which == 27){
+    if (this.buttonPressed_){
+      this.unpressButton();
+    }
+  }
+};
+
+vjs.MenuButton.prototype.pressButton = function(){
+  this.buttonPressed_ = true;
+  this.menu.lockShowing();
+  this.el_.setAttribute('aria-pressed', true);
+  if (this.items && this.items.length > 0) {
+    this.items[0].el().focus(); // set the focus to the title of the submenu
+  }
+};
+
+vjs.MenuButton.prototype.unpressButton = function(){
+  this.buttonPressed_ = false;
+  this.menu.unlockShowing();
+  this.el_.setAttribute('aria-pressed', false);
+};
+
+/**
+ * An instance of the `vjs.Player` class is created when any of the Video.js setup methods are used to initialize a video.
+ *
+ * ```js
+ * var myPlayer = videojs('example_video_1');
+ * ```
+ *
+ * In the follwing example, the `data-setup` attribute tells the Video.js library to create a player instance when the library is ready.
+ *
+ * ```html
+ * <video id="example_video_1" data-setup='{}' controls>
+ *   <source src="my-source.mp4" type="video/mp4">
+ * </video>
+ * ```
+ *
+ * After an instance has been created it can be accessed globally using `Video('example_video_1')`.
+ *
+ * @class
+ * @extends vjs.Component
+ */
+vjs.Player = vjs.Component.extend({
+
+  /**
+   * player's constructor function
+   *
+   * @constructs
+   * @method init
+   * @param {Element} tag        The original video tag used for configuring options
+   * @param {Object=} options    Player options
+   * @param {Function=} ready    Ready callback function
+   */
+  init: function(tag, options, ready){
+    this.tag = tag; // Store the original tag used to set options
+
+    // Set Options
+    // The options argument overrides options set in the video tag
+    // which overrides globally set options.
+    // This latter part coincides with the load order
+    // (tag must exist before Player)
+    options = vjs.obj.merge(this.getTagSettings(tag), options);
+
+    // Cache for video property values.
+    this.cache_ = {};
+
+    // Set poster
+    this.poster_ = options['poster'];
+    // Set controls
+    this.controls_ = options['controls'];
+    // Original tag settings stored in options
+    // now remove immediately so native controls don't flash.
+    // May be turned back on by HTML5 tech if nativeControlsForTouch is true
+    tag.controls = false;
+
+    // Run base component initializing with new options.
+    // Builds the element through createEl()
+    // Inits and embeds any child components in opts
+    vjs.Component.call(this, this, options, ready);
+
+    // Update controls className. Can't do this when the controls are initially
+    // set because the element doesn't exist yet.
+    if (this.controls()) {
+      this.addClass('vjs-controls-enabled');
+    } else {
+      this.addClass('vjs-controls-disabled');
+    }
+
+    // TODO: Make this smarter. Toggle user state between touching/mousing
+    // using events, since devices can have both touch and mouse events.
+    // if (vjs.TOUCH_ENABLED) {
+    //   this.addClass('vjs-touch-enabled');
+    // }
+
+    // Firstplay event implimentation. Not sold on the event yet.
+    // Could probably just check currentTime==0?
+    this.one('play', function(e){
+      var fpEvent = { type: 'firstplay', target: this.el_ };
+      // Using vjs.trigger so we can check if default was prevented
+      var keepGoing = vjs.trigger(this.el_, fpEvent);
+
+      if (!keepGoing) {
+        e.preventDefault();
+        e.stopPropagation();
+        e.stopImmediatePropagation();
+      }
+    });
+
+    this.on('ended', this.onEnded);
+    this.on('play', this.onPlay);
+    this.on('firstplay', this.onFirstPlay);
+    this.on('pause', this.onPause);
+    this.on('progress', this.onProgress);
+    this.on('durationchange', this.onDurationChange);
+    this.on('error', this.onError);
+    this.on('fullscreenchange', this.onFullscreenChange);
+
+    // Make player easily findable by ID
+    vjs.players[this.id_] = this;
+
+    if (options['plugins']) {
+      vjs.obj.each(options['plugins'], function(key, val){
+        this[key](val);
+      }, this);
+    }
+
+    this.listenForUserActivity();
+  }
+});
+
+/**
+ * Player instance options, surfaced using vjs.options
+ * vjs.options = vjs.Player.prototype.options_
+ * Make changes in vjs.options, not here.
+ * All options should use string keys so they avoid
+ * renaming by closure compiler
+ * @type {Object}
+ * @private
+ */
+vjs.Player.prototype.options_ = vjs.options;
+
+/**
+ * Destroys the video player and does any necessary cleanup
+ *
+ *     myPlayer.dispose();
+ *
+ * This is especially helpful if you are dynamically adding and removing videos
+ * to/from the DOM.
+ */
+vjs.Player.prototype.dispose = function(){
+  this.trigger('dispose');
+  // prevent dispose from being called twice
+  this.off('dispose');
+
+  // Kill reference to this player
+  vjs.players[this.id_] = null;
+  if (this.tag && this.tag['player']) { this.tag['player'] = null; }
+  if (this.el_ && this.el_['player']) { this.el_['player'] = null; }
+
+  // Ensure that tracking progress and time progress will stop and plater deleted
+  this.stopTrackingProgress();
+  this.stopTrackingCurrentTime();
+
+  if (this.tech) { this.tech.dispose(); }
+
+  // Component dispose
+  vjs.Component.prototype.dispose.call(this);
+};
+
+vjs.Player.prototype.getTagSettings = function(tag){
+  var options = {
+    'sources': [],
+    'tracks': []
+  };
+
+  vjs.obj.merge(options, vjs.getAttributeValues(tag));
+
+  // Get tag children settings
+  if (tag.hasChildNodes()) {
+    var children, child, childName, i, j;
+
+    children = tag.childNodes;
+
+    for (i=0,j=children.length; i<j; i++) {
+      child = children[i];
+      // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/
+      childName = child.nodeName.toLowerCase();
+      if (childName === 'source') {
+        options['sources'].push(vjs.getAttributeValues(child));
+      } else if (childName === 'track') {
+        options['tracks'].push(vjs.getAttributeValues(child));
+      }
+    }
+  }
+
+  return options;
+};
+
+vjs.Player.prototype.createEl = function(){
+  var el = this.el_ = vjs.Component.prototype.createEl.call(this, 'div');
+  var tag = this.tag;
+
+  // Remove width/height attrs from tag so CSS can make it 100% width/height
+  tag.removeAttribute('width');
+  tag.removeAttribute('height');
+  // Empty video tag tracks so the built-in player doesn't use them also.
+  // This may not be fast enough to stop HTML5 browsers from reading the tags
+  // so we'll need to turn off any default tracks if we're manually doing
+  // captions and subtitles. videoElement.textTracks
+  if (tag.hasChildNodes()) {
+    var nodes, nodesLength, i, node, nodeName, removeNodes;
+
+    nodes = tag.childNodes;
+    nodesLength = nodes.length;
+    removeNodes = [];
+
+    while (nodesLength--) {
+      node = nodes[nodesLength];
+      nodeName = node.nodeName.toLowerCase();
+      if (nodeName === 'track') {
+        removeNodes.push(node);
+      }
+    }
+
+    for (i=0; i<removeNodes.length; i++) {
+      tag.removeChild(removeNodes[i]);
+    }
+  }
+
+  // Make sure tag ID exists
+  tag.id = tag.id || 'vjs_video_' + vjs.guid++;
+
+  // Give video tag ID and class to player div
+  // ID will now reference player box, not the video tag
+  el.id = tag.id;
+  el.className = tag.className;
+
+  // Update tag id/class for use as HTML5 playback tech
+  // Might think we should do this after embedding in container so .vjs-tech class
+  // doesn't flash 100% width/height, but class only applies with .video-js parent
+  tag.id += '_html5_api';
+  tag.className = 'vjs-tech';
+
+  // Make player findable on elements
+  tag['player'] = el['player'] = this;
+  // Default state of video is paused
+  this.addClass('vjs-paused');
+
+  // Make box use width/height of tag, or rely on default implementation
+  // Enforce with CSS since width/height attrs don't work on divs
+  this.width(this.options_['width'], true); // (true) Skip resize listener on load
+  this.height(this.options_['height'], true);
+
+  // Wrap video tag in div (el/box) container
+  if (tag.parentNode) {
+    tag.parentNode.insertBefore(el, tag);
+  }
+  vjs.insertFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.
+
+  return el;
+};
+
+// /* Media Technology (tech)
+// ================================================================================ */
+// Load/Create an instance of playback technlogy including element and API methods
+// And append playback element in player div.
+vjs.Player.prototype.loadTech = function(techName, source){
+
+  // Pause and remove current playback technology
+  if (this.tech) {
+    this.unloadTech();
+
+  // if this is the first time loading, HTML5 tag will exist but won't be initialized
+  // so we need to remove it if we're not loading HTML5
+  } else if (techName !== 'Html5' && this.tag) {
+    vjs.Html5.disposeMediaElement(this.tag);
+    this.tag = null;
+  }
+
+  this.techName = techName;
+
+  // Turn off API access because we're loading a new tech that might load asynchronously
+  this.isReady_ = false;
+
+  var techReady = function(){
+    this.player_.triggerReady();
+
+    // Manually track progress in cases where the browser/flash player doesn't report it.
+    if (!this.features['progressEvents']) {
+      this.player_.manualProgressOn();
+    }
+
+    // Manually track timeudpates in cases where the browser/flash player doesn't report it.
+    if (!this.features['timeupdateEvents']) {
+      this.player_.manualTimeUpdatesOn();
+    }
+  };
+
+  // Grab tech-specific options from player options and add source and parent element to use.
+  var techOptions = vjs.obj.merge({ 'source': source, 'parentEl': this.el_ }, this.options_[techName.toLowerCase()]);
+
+  if (source) {
+    if (source.src == this.cache_.src && this.cache_.currentTime > 0) {
+      techOptions['startTime'] = this.cache_.currentTime;
+    }
+
+    this.cache_.src = source.src;
+  }
+
+  // Initialize tech instance
+  this.tech = new window['videojs'][techName](this, techOptions);
+
+  this.tech.ready(techReady);
+};
+
+vjs.Player.prototype.unloadTech = function(){
+  this.isReady_ = false;
+  this.tech.dispose();
+
+  // Turn off any manual progress or timeupdate tracking
+  if (this.manualProgress) { this.manualProgressOff(); }
+
+  if (this.manualTimeUpdates) { this.manualTimeUpdatesOff(); }
+
+  this.tech = false;
+};
+
+// There's many issues around changing the size of a Flash (or other plugin) object.
+// First is a plugin reload issue in Firefox that has been around for 11 years: https://bugzilla.mozilla.org/show_bug.cgi?id=90268
+// Then with the new fullscreen API, Mozilla and webkit browsers will reload the flash object after going to fullscreen.
+// To get around this, we're unloading the tech, caching source and currentTime values, and reloading the tech once the plugin is resized.
+// reloadTech: function(betweenFn){
+//   vjs.log('unloadingTech')
+//   this.unloadTech();
+//   vjs.log('unloadedTech')
+//   if (betweenFn) { betweenFn.call(); }
+//   vjs.log('LoadingTech')
+//   this.loadTech(this.techName, { src: this.cache_.src })
+//   vjs.log('loadedTech')
+// },
+
+/* Fallbacks for unsupported event types
+================================================================================ */
+// Manually trigger progress events based on changes to the buffered amount
+// Many flash players and older HTML5 browsers don't send progress or progress-like events
+vjs.Player.prototype.manualProgressOn = function(){
+  this.manualProgress = true;
+
+  // Trigger progress watching when a source begins loading
+  this.trackProgress();
+
+  // Watch for a native progress event call on the tech element
+  // In HTML5, some older versions don't support the progress event
+  // So we're assuming they don't, and turning off manual progress if they do.
+  // As opposed to doing user agent detection
+  this.tech.one('progress', function(){
+
+    // Update known progress support for this playback technology
+    this.features['progressEvents'] = true;
+
+    // Turn off manual progress tracking
+    this.player_.manualProgressOff();
+  });
+};
+
+vjs.Player.prototype.manualProgressOff = function(){
+  this.manualProgress = false;
+  this.stopTrackingProgress();
+};
+
+vjs.Player.prototype.trackProgress = function(){
+
+  this.progressInterval = setInterval(vjs.bind(this, function(){
+    // Don't trigger unless buffered amount is greater than last time
+    // log(this.cache_.bufferEnd, this.buffered().end(0), this.duration())
+    /* TODO: update for multiple buffered regions */
+    if (this.cache_.bufferEnd < this.buffered().end(0)) {
+      this.trigger('progress');
+    } else if (this.bufferedPercent() == 1) {
+      this.stopTrackingProgress();
+      this.trigger('progress'); // Last update
+    }
+  }), 500);
+};
+vjs.Player.prototype.stopTrackingProgress = function(){ clearInterval(this.progressInterval); };
+
+/*! Time Tracking -------------------------------------------------------------- */
+vjs.Player.prototype.manualTimeUpdatesOn = function(){
+  this.manualTimeUpdates = true;
+
+  this.on('play', this.trackCurrentTime);
+  this.on('pause', this.stopTrackingCurrentTime);
+  // timeupdate is also called by .currentTime whenever current time is set
+
+  // Watch for native timeupdate event
+  this.tech.one('timeupdate', function(){
+    // Update known progress support for this playback technology
+    this.features['timeupdateEvents'] = true;
+    // Turn off manual progress tracking
+    this.player_.manualTimeUpdatesOff();
+  });
+};
+
+vjs.Player.prototype.manualTimeUpdatesOff = function(){
+  this.manualTimeUpdates = false;
+  this.stopTrackingCurrentTime();
+  this.off('play', this.trackCurrentTime);
+  this.off('pause', this.stopTrackingCurrentTime);
+};
+
+vjs.Player.prototype.trackCurrentTime = function(){
+  if (this.currentTimeInterval) { this.stopTrackingCurrentTime(); }
+  this.currentTimeInterval = setInterval(vjs.bind(this, function(){
+    this.trigger('timeupdate');
+  }), 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15
+};
+
+// Turn off play progress tracking (when paused or dragging)
+vjs.Player.prototype.stopTrackingCurrentTime = function(){ clearInterval(this.currentTimeInterval); };
+
+// /* Player event handlers (how the player reacts to certain events)
+// ================================================================================ */
+
+/**
+ * Fired when the user agent begins looking for media data
+ * @event loadstart
+ */
+vjs.Player.prototype.onLoadStart;
+
+/**
+ * Fired when the player has initial duration and dimension information
+ * @event loadedmetadata
+ */
+vjs.Player.prototype.onLoadedMetaData;
+
+/**
+ * Fired when the player has downloaded data at the current playback position
+ * @event loadeddata
+ */
+vjs.Player.prototype.onLoadedData;
+
+/**
+ * Fired when the player has finished downloading the source data
+ * @event loadedalldata
+ */
+vjs.Player.prototype.onLoadedAllData;
+
+/**
+ * Fired whenever the media begins or resumes playback
+ * @event play
+ */
+vjs.Player.prototype.onPlay = function(){
+  vjs.removeClass(this.el_, 'vjs-paused');
+  vjs.addClass(this.el_, 'vjs-playing');
+};
+
+/**
+ * Fired the first time a video is played
+ *
+ * Not part of the HLS spec, and we're not sure if this is the best
+ * implementation yet, so use sparingly. If you don't have a reason to
+ * prevent playback, use `myPlayer.one('play');` instead.
+ *
+ * @event firstplay
+ */
+vjs.Player.prototype.onFirstPlay = function(){
+    //If the first starttime attribute is specified
+    //then we will start at the given offset in seconds
+    if(this.options_['starttime']){
+      this.currentTime(this.options_['starttime']);
+    }
+
+    this.addClass('vjs-has-started');
+};
+
+/**
+ * Fired whenever the media has been paused
+ * @event pause
+ */
+vjs.Player.prototype.onPause = function(){
+  vjs.removeClass(this.el_, 'vjs-playing');
+  vjs.addClass(this.el_, 'vjs-paused');
+};
+
+/**
+ * Fired when the current playback position has changed
+ *
+ * During playback this is fired every 15-250 milliseconds, depnding on the
+ * playback technology in use.
+ * @event timeupdate
+ */
+vjs.Player.prototype.onTimeUpdate;
+
+/**
+ * Fired while the user agent is downloading media data
+ * @event progress
+ */
+vjs.Player.prototype.onProgress = function(){
+  // Add custom event for when source is finished downloading.
+  if (this.bufferedPercent() == 1) {
+    this.trigger('loadedalldata');
+  }
+};
+
+/**
+ * Fired when the end of the media resource is reached (currentTime == duration)
+ * @event ended
+ */
+vjs.Player.prototype.onEnded = function(){
+  if (this.options_['loop']) {
+    this.currentTime(0);
+    this.play();
+  }
+};
+
+/**
+ * Fired when the duration of the media resource is first known or changed
+ * @event durationchange
+ */
+vjs.Player.prototype.onDurationChange = function(){
+  // Allows for cacheing value instead of asking player each time.
+  this.duration(this.techGet('duration'));
+};
+
+/**
+ * Fired when the volume changes
+ * @event volumechange
+ */
+vjs.Player.prototype.onVolumeChange;
+
+/**
+ * Fired when the player switches in or out of fullscreen mode
+ * @event fullscreenchange
+ */
+vjs.Player.prototype.onFullscreenChange = function() {
+  if (this.isFullScreen) {
+    this.addClass('vjs-fullscreen');
+  } else {
+    this.removeClass('vjs-fullscreen');
+  }
+};
+
+/**
+ * Fired when there is an error in playback
+ * @event error
+ */
+vjs.Player.prototype.onError = function(e) {
+  vjs.log('Video Error', e);
+};
+
+// /* Player API
+// ================================================================================ */
+
+/**
+ * Object for cached values.
+ * @private
+ */
+vjs.Player.prototype.cache_;
+
+vjs.Player.prototype.getCache = function(){
+  return this.cache_;
+};
+
+// Pass values to the playback tech
+vjs.Player.prototype.techCall = function(method, arg){
+  // If it's not ready yet, call method when it is
+  if (this.tech && !this.tech.isReady_) {
+    this.tech.ready(function(){
+      this[method](arg);
+    });
+
+  // Otherwise call method now
+  } else {
+    try {
+      this.tech[method](arg);
+    } catch(e) {
+      vjs.log(e);
+      throw e;
+    }
+  }
+};
+
+// Get calls can't wait for the tech, and sometimes don't need to.
+vjs.Player.prototype.techGet = function(method){
+
+  if (this.tech && this.tech.isReady_) {
+
+    // Flash likes to die and reload when you hide or reposition it.
+    // In these cases the object methods go away and we get errors.
+    // When that happens we'll catch the errors and inform tech that it's not ready any more.
+    try {
+      return this.tech[method]();
+    } catch(e) {
+      // When building additional tech libs, an expected method may not be defined yet
+      if (this.tech[method] === undefined) {
+        vjs.log('Video.js: ' + method + ' method not defined for '+this.techName+' playback technology.', e);
+      } else {
+        // When a method isn't available on the object it throws a TypeError
+        if (e.name == 'TypeError') {
+          vjs.log('Video.js: ' + method + ' unavailable on '+this.techName+' playback technology element.', e);
+          this.tech.isReady_ = false;
+        } else {
+          vjs.log(e);
+        }
+      }
+      throw e;
+    }
+  }
+
+  return;
+};
+
+/**
+ * start media playback
+ *
+ *     myPlayer.play();
+ *
+ * @return {vjs.Player} self
+ */
+vjs.Player.prototype.play = function(){
+  this.techCall('play');
+  return this;
+};
+
+/**
+ * Pause the video playback
+ *
+ *     myPlayer.pause();
+ *
+ * @return {vjs.Player} self
+ */
+vjs.Player.prototype.pause = function(){
+  this.techCall('pause');
+  return this;
+};
+
+/**
+ * Check if the player is paused
+ *
+ *     var isPaused = myPlayer.paused();
+ *     var isPlaying = !myPlayer.paused();
+ *
+ * @return {Boolean} false if the media is currently playing, or true otherwise
+ */
+vjs.Player.prototype.paused = function(){
+  // The initial state of paused should be true (in Safari it's actually false)
+  return (this.techGet('paused') === false) ? false : true;
+};
+
+/**
+ * Get or set the current time (in seconds)
+ *
+ *     // get
+ *     var whereYouAt = myPlayer.currentTime();
+ *
+ *     // set
+ *     myPlayer.currentTime(120); // 2 minutes into the video
+ *
+ * @param  {Number|String=} seconds The time to seek to
+ * @return {Number}        The time in seconds, when not setting
+ * @return {vjs.Player}    self, when the current time is set
+ */
+vjs.Player.prototype.currentTime = function(seconds){
+  if (seconds !== undefined) {
+
+    // cache the last set value for smoother scrubbing
+    this.cache_.lastSetCurrentTime = seconds;
+
+    this.techCall('setCurrentTime', seconds);
+
+    // improve the accuracy of manual timeupdates
+    if (this.manualTimeUpdates) { this.trigger('timeupdate'); }
+
+    return this;
+  }
+
+  // cache last currentTime and return
+  // default to 0 seconds
+  return this.cache_.currentTime = (this.techGet('currentTime') || 0);
+};
+
+/**
+ * Get the length in time of the video in seconds
+ *
+ *     var lengthOfVideo = myPlayer.duration();
+ *
+ * **NOTE**: The video must have started loading before the duration can be
+ * known, and in the case of Flash, may not be known until the video starts
+ * playing.
+ *
+ * @return {Number} The duration of the video in seconds
+ */
+vjs.Player.prototype.duration = function(seconds){
+  if (seconds !== undefined) {
+
+    // cache the last set value for optimiized scrubbing (esp. Flash)
+    this.cache_.duration = parseFloat(seconds);
+
+    return this;
+  }
+
+  if (this.cache_.duration === undefined) {
+    this.onDurationChange();
+  }
+
+  return this.cache_.duration;
+};
+
+// Calculates how much time is left. Not in spec, but useful.
+vjs.Player.prototype.remainingTime = function(){
+  return this.duration() - this.currentTime();
+};
+
+// http://dev.w3.org/html5/spec/video.html#dom-media-buffered
+// Buffered returns a timerange object.
+// Kind of like an array of portions of the video that have been downloaded.
+// So far no browsers return more than one range (portion)
+
+/**
+ * Get a TimeRange object with the times of the video that have been downloaded
+ *
+ * If you just want the percent of the video that's been downloaded,
+ * use bufferedPercent.
+ *
+ *     // Number of different ranges of time have been buffered. Usually 1.
+ *     numberOfRanges = bufferedTimeRange.length,
+ *
+ *     // Time in seconds when the first range starts. Usually 0.
+ *     firstRangeStart = bufferedTimeRange.start(0),
+ *
+ *     // Time in seconds when the first range ends
+ *     firstRangeEnd = bufferedTimeRange.end(0),
+ *
+ *     // Length in seconds of the first time range
+ *     firstRangeLength = firstRangeEnd - firstRangeStart;
+ *
+ * @return {Object} A mock TimeRange object (following HTML spec)
+ */
+vjs.Player.prototype.buffered = function(){
+  var buffered = this.techGet('buffered'),
+      start = 0,
+      buflast = buffered.length - 1,
+      // Default end to 0 and store in values
+      end = this.cache_.bufferEnd = this.cache_.bufferEnd || 0;
+
+  if (buffered && buflast >= 0 && buffered.end(buflast) !== end) {
+    end = buffered.end(buflast);
+    // Storing values allows them be overridden by setBufferedFromProgress
+    this.cache_.bufferEnd = end;
+  }
+
+  return vjs.createTimeRange(start, end);
+};
+
+/**
+ * Get the percent (as a decimal) of the video that's been downloaded
+ *
+ *     var howMuchIsDownloaded = myPlayer.bufferedPercent();
+ *
+ * 0 means none, 1 means all.
+ * (This method isn't in the HTML5 spec, but it's very convenient)
+ *
+ * @return {Number} A decimal between 0 and 1 representing the percent
+ */
+vjs.Player.prototype.bufferedPercent = function(){
+  return (this.duration()) ? this.buffered().end(0) / this.duration() : 0;
+};
+
+/**
+ * Get or set the current volume of the media
+ *
+ *     // get
+ *     var howLoudIsIt = myPlayer.volume();
+ *
+ *     // set
+ *     myPlayer.volume(0.5); // Set volume to half
+ *
+ * 0 is off (muted), 1.0 is all the way up, 0.5 is half way.
+ *
+ * @param  {Number} percentAsDecimal The new volume as a decimal percent
+ * @return {Number}                  The current volume, when getting
+ * @return {vjs.Player}              self, when setting
+ */
+vjs.Player.prototype.volume = function(percentAsDecimal){
+  var vol;
+
+  if (percentAsDecimal !== undefined) {
+    vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1
+    this.cache_.volume = vol;
+    this.techCall('setVolume', vol);
+    vjs.setLocalStorage('volume', vol);
+    return this;
+  }
+
+  // Default to 1 when returning current volume.
+  vol = parseFloat(this.techGet('volume'));
+  return (isNaN(vol)) ? 1 : vol;
+};
+
+
+/**
+ * Get the current muted state, or turn mute on or off
+ *
+ *     // get
+ *     var isVolumeMuted = myPlayer.muted();
+ *
+ *     // set
+ *     myPlayer.muted(true); // mute the volume
+ *
+ * @param  {Boolean=} muted True to mute, false to unmute
+ * @return {Boolean} True if mute is on, false if not, when getting
+ * @return {vjs.Player} self, when setting mute
+ */
+vjs.Player.prototype.muted = function(muted){
+  if (muted !== undefined) {
+    this.techCall('setMuted', muted);
+    return this;
+  }
+  return this.techGet('muted') || false; // Default to false
+};
+
+// Check if current tech can support native fullscreen (e.g. with built in controls lik iOS, so not our flash swf)
+vjs.Player.prototype.supportsFullScreen = function(){ return this.techGet('supportsFullScreen') || false; };
+
+/**
+ * Increase the size of the video to full screen
+ *
+ *     myPlayer.requestFullScreen();
+ *
+ * In some browsers, full screen is not supported natively, so it enters
+ * "full window mode", where the video fills the browser window.
+ * In browsers and devices that support native full screen, sometimes the
+ * browser's default controls will be shown, and not the Video.js custom skin.
+ * This includes most mobile devices (iOS, Android) and older versions of
+ * Safari.
+ *
+ * @return {vjs.Player} self
+ */
+vjs.Player.prototype.requestFullScreen = function(){
+  var requestFullScreen = vjs.support.requestFullScreen;
+  this.isFullScreen = true;
+
+  if (requestFullScreen) {
+    // the browser supports going fullscreen at the element level so we can
+    // take the controls fullscreen as well as the video
+
+    // Trigger fullscreenchange event after change
+    // We have to specifically add this each time, and remove
+    // when cancelling fullscreen. Otherwise if there's multiple
+    // players on a page, they would all be reacting to the same fullscreen
+    // events
+    vjs.on(document, requestFullScreen.eventName, vjs.bind(this, function(e){
+      this.isFullScreen = document[requestFullScreen.isFullScreen];
+
+      // If cancelling fullscreen, remove event listener.
+      if (this.isFullScreen === false) {
+        vjs.off(document, requestFullScreen.eventName, arguments.callee);
+      }
+
+      this.trigger('fullscreenchange');
+    }));
+
+    this.el_[requestFullScreen.requestFn]();
+
+  } else if (this.tech.supportsFullScreen()) {
+    // we can't take the video.js controls fullscreen but we can go fullscreen
+    // with native controls
+    this.techCall('enterFullScreen');
+  } else {
+    // fullscreen isn't supported so we'll just stretch the video element to
+    // fill the viewport
+    this.enterFullWindow();
+    this.trigger('fullscreenchange');
+  }
+
+  return this;
+};
+
+/**
+ * Return the video to its normal size after having been in full screen mode
+ *
+ *     myPlayer.cancelFullScreen();
+ *
+ * @return {vjs.Player} self
+ */
+vjs.Player.prototype.cancelFullScreen = function(){
+  var requestFullScreen = vjs.support.requestFullScreen;
+  this.isFullScreen = false;
+
+  // Check for browser element fullscreen support
+  if (requestFullScreen) {
+    document[requestFullScreen.cancelFn]();
+  } else if (this.tech.supportsFullScreen()) {
+   this.techCall('exitFullScreen');
+  } else {
+   this.exitFullWindow();
+   this.trigger('fullscreenchange');
+  }
+
+  return this;
+};
+
+// When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.
+vjs.Player.prototype.enterFullWindow = function(){
+  this.isFullWindow = true;
+
+  // Storing original doc overflow value to return to when fullscreen is off
+  this.docOrigOverflow = document.documentElement.style.overflow;
+
+  // Add listener for esc key to exit fullscreen
+  vjs.on(document, 'keydown', vjs.bind(this, this.fullWindowOnEscKey));
+
+  // Hide any scroll bars
+  document.documentElement.style.overflow = 'hidden';
+
+  // Apply fullscreen styles
+  vjs.addClass(document.body, 'vjs-full-window');
+
+  this.trigger('enterFullWindow');
+};
+vjs.Player.prototype.fullWindowOnEscKey = function(event){
+  if (event.keyCode === 27) {
+    if (this.isFullScreen === true) {
+      this.cancelFullScreen();
+    } else {
+      this.exitFullWindow();
+    }
+  }
+};
+
+vjs.Player.prototype.exitFullWindow = function(){
+  this.isFullWindow = false;
+  vjs.off(document, 'keydown', this.fullWindowOnEscKey);
+
+  // Unhide scroll bars.
+  document.documentElement.style.overflow = this.docOrigOverflow;
+
+  // Remove fullscreen styles
+  vjs.removeClass(document.body, 'vjs-full-window');
+
+  // Resize the box, controller, and poster to original sizes
+  // this.positionAll();
+  this.trigger('exitFullWindow');
+};
+
+vjs.Player.prototype.selectSource = function(sources){
+
+  // Loop through each playback technology in the options order
+  for (var i=0,j=this.options_['techOrder'];i<j.length;i++) {
+    var techName = vjs.capitalize(j[i]),
+        tech = window['videojs'][techName];
+
+    // Check if the browser supports this technology
+    if (tech.isSupported()) {
+      // Loop through each source object
+      for (var a=0,b=sources;a<b.length;a++) {
+        var source = b[a];
+
+        // Check if source can be played with this technology
+        if (tech['canPlaySource'](source)) {
+          return { source: source, tech: techName };
+        }
+      }
+    }
+  }
+
+  return false;
+};
+
+/**
+ * The source function updates the video source
+ *
+ * There are three types of variables you can pass as the argument.
+ *
+ * **URL String**: A URL to the the video file. Use this method if you are sure
+ * the current playback technology (HTML5/Flash) can support the source you
+ * provide. Currently only MP4 files can be used in both HTML5 and Flash.
+ *
+ *     myPlayer.src("http://www.example.com/path/to/video.mp4");
+ *
+ * **Source Object (or element):** A javascript object containing information
+ * about the source file. Use this method if you want the player to determine if
+ * it can support the file using the type information.
+ *
+ *     myPlayer.src({ type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" });
+ *
+ * **Array of Source Objects:** To provide multiple versions of the source so
+ * that it can be played using HTML5 across browsers you can use an array of
+ * source objects. Video.js will detect which version is supported and load that
+ * file.
+ *
+ *     myPlayer.src([
+ *       { type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" },
+ *       { type: "video/webm", src: "http://www.example.com/path/to/video.webm" },
+ *       { type: "video/ogg", src: "http://www.example.com/path/to/video.ogv" }
+ *     ]);
+ *
+ * @param  {String|Object|Array=} source The source URL, object, or array of sources
+ * @return {vjs.Player} self
+ */
+vjs.Player.prototype.src = function(source){
+  // Case: Array of source objects to choose from and pick the best to play
+  if (source instanceof Array) {
+
+    var sourceTech = this.selectSource(source),
+        techName;
+
+    if (sourceTech) {
+        source = sourceTech.source;
+        techName = sourceTech.tech;
+
+      // If this technology is already loaded, set source
+      if (techName == this.techName) {
+        this.src(source); // Passing the source object
+      // Otherwise load this technology with chosen source
+      } else {
+        this.loadTech(techName, source);
+      }
+    } else {
+      this.el_.appendChild(vjs.createEl('p', {
+        innerHTML: this.options()['notSupportedMessage']
+      }));
+    }
+
+  // Case: Source object { src: '', type: '' ... }
+  } else if (source instanceof Object) {
+
+    if (window['videojs'][this.techName]['canPlaySource'](source)) {
+      this.src(source.src);
+    } else {
+      // Send through tech loop to check for a compatible technology.
+      this.src([source]);
+    }
+
+  // Case: URL String (http://myvideo...)
+  } else {
+    // Cache for getting last set source
+    this.cache_.src = source;
+
+    if (!this.isReady_) {
+      this.ready(function(){
+        this.src(source);
+      });
+    } else {
+      this.techCall('src', source);
+      if (this.options_['preload'] == 'auto') {
+        this.load();
+      }
+      if (this.options_['autoplay']) {
+        this.play();
+      }
+    }
+  }
+  return this;
+};
+
+// Begin loading the src data
+// http://dev.w3.org/html5/spec/video.html#dom-media-load
+vjs.Player.prototype.load = function(){
+  this.techCall('load');
+  return this;
+};
+
+// http://dev.w3.org/html5/spec/video.html#dom-media-currentsrc
+vjs.Player.prototype.currentSrc = function(){
+  return this.techGet('currentSrc') || this.cache_.src || '';
+};
+
+// Attributes/Options
+vjs.Player.prototype.preload = function(value){
+  if (value !== undefined) {
+    this.techCall('setPreload', value);
+    this.options_['preload'] = value;
+    return this;
+  }
+  return this.techGet('preload');
+};
+vjs.Player.prototype.autoplay = function(value){
+  if (value !== undefined) {
+    this.techCall('setAutoplay', value);
+    this.options_['autoplay'] = value;
+    return this;
+  }
+  return this.techGet('autoplay', value);
+};
+vjs.Player.prototype.loop = function(value){
+  if (value !== undefined) {
+    this.techCall('setLoop', value);
+    this.options_['loop'] = value;
+    return this;
+  }
+  return this.techGet('loop');
+};
+
+/**
+ * the url of the poster image source
+ * @type {String}
+ * @private
+ */
+vjs.Player.prototype.poster_;
+
+/**
+ * get or set the poster image source url
+ *
+ * ##### EXAMPLE:
+ *
+ *     // getting
+ *     var currentPoster = myPlayer.poster();
+ *
+ *     // setting
+ *     myPlayer.poster('http://example.com/myImage.jpg');
+ *
+ * @param  {String=} [src] Poster image source URL
+ * @return {String} poster URL when getting
+ * @return {vjs.Player} self when setting
+ */
+vjs.Player.prototype.poster = function(src){
+  if (src !== undefined) {
+    this.poster_ = src;
+    return this;
+  }
+  return this.poster_;
+};
+
+/**
+ * Whether or not the controls are showing
+ * @type {Boolean}
+ * @private
+ */
+vjs.Player.prototype.controls_;
+
+/**
+ * Get or set whether or not the controls are showing.
+ * @param  {Boolean} controls Set controls to showing or not
+ * @return {Boolean}    Controls are showing
+ */
+vjs.Player.prototype.controls = function(bool){
+  if (bool !== undefined) {
+    bool = !!bool; // force boolean
+    // Don't trigger a change event unless it actually changed
+    if (this.controls_ !== bool) {
+      this.controls_ = bool;
+      if (bool) {
+        this.removeClass('vjs-controls-disabled');
+        this.addClass('vjs-controls-enabled');
+        this.trigger('controlsenabled');
+      } else {
+        this.removeClass('vjs-controls-enabled');
+        this.addClass('vjs-controls-disabled');
+        this.trigger('controlsdisabled');
+      }
+    }
+    return this;
+  }
+  return this.controls_;
+};
+
+vjs.Player.prototype.usingNativeControls_;
+
+/**
+ * Toggle native controls on/off. Native controls are the controls built into
+ * devices (e.g. default iPhone controls), Flash, or other techs
+ * (e.g. Vimeo Controls)
+ *
+ * **This should only be set by the current tech, because only the tech knows
+ * if it can support native controls**
+ *
+ * @param  {Boolean} bool    True signals that native controls are on
+ * @return {vjs.Player}      Returns the player
+ * @private
+ */
+vjs.Player.prototype.usingNativeControls = function(bool){
+  if (bool !== undefined) {
+    bool = !!bool; // force boolean
+    // Don't trigger a change event unless it actually changed
+    if (this.usingNativeControls_ !== bool) {
+      this.usingNativeControls_ = bool;
+      if (bool) {
+        this.addClass('vjs-using-native-controls');
+
+        /**
+         * player is using the native device controls
+         *
+         * @event usingnativecontrols
+         * @memberof vjs.Player
+         * @instance
+         * @private
+         */
+        this.trigger('usingnativecontrols');
+      } else {
+        this.removeClass('vjs-using-native-controls');
+
+        /**
+         * player is using the custom HTML controls
+         *
+         * @event usingcustomcontrols
+         * @memberof vjs.Player
+         * @instance
+         * @private
+         */
+        this.trigger('usingcustomcontrols');
+      }
+    }
+    return this;
+  }
+  return this.usingNativeControls_;
+};
+
+vjs.Player.prototype.error = function(){ return this.techGet('error'); };
+vjs.Player.prototype.ended = function(){ return this.techGet('ended'); };
+vjs.Player.prototype.seeking = function(){ return this.techGet('seeking'); };
+
+// When the player is first initialized, trigger activity so components
+// like the control bar show themselves if needed
+vjs.Player.prototype.userActivity_ = true;
+vjs.Player.prototype.reportUserActivity = function(event){
+  this.userActivity_ = true;
+};
+
+vjs.Player.prototype.userActive_ = true;
+vjs.Player.prototype.userActive = function(bool){
+  if (bool !== undefined) {
+    bool = !!bool;
+    if (bool !== this.userActive_) {
+      this.userActive_ = bool;
+      if (bool) {
+        // If the user was inactive and is now active we want to reset the
+        // inactivity timer
+        this.userActivity_ = true;
+        this.removeClass('vjs-user-inactive');
+        this.addClass('vjs-user-active');
+        this.trigger('useractive');
+      } else {
+        // We're switching the state to inactive manually, so erase any other
+        // activity
+        this.userActivity_ = false;
+
+        // Chrome/Safari/IE have bugs where when you change the cursor it can
+        // trigger a mousemove event. This causes an issue when you're hiding
+        // the cursor when the user is inactive, and a mousemove signals user
+        // activity. Making it impossible to go into inactive mode. Specifically
+        // this happens in fullscreen when we really need to hide the cursor.
+        //
+        // When this gets resolved in ALL browsers it can be removed
+        // https://code.google.com/p/chromium/issues/detail?id=103041
+        this.tech.one('mousemove', function(e){
+          e.stopPropagation();
+          e.preventDefault();
+        });
+        this.removeClass('vjs-user-active');
+        this.addClass('vjs-user-inactive');
+        this.trigger('userinactive');
+      }
+    }
+    return this;
+  }
+  return this.userActive_;
+};
+
+vjs.Player.prototype.listenForUserActivity = function(){
+  var onMouseActivity, onMouseDown, mouseInProgress, onMouseUp,
+      activityCheck, inactivityTimeout;
+
+  onMouseActivity = this.reportUserActivity;
+
+  onMouseDown = function() {
+    onMouseActivity();
+    // For as long as the they are touching the device or have their mouse down,
+    // we consider them active even if they're not moving their finger or mouse.
+    // So we want to continue to update that they are active
+    clearInterval(mouseInProgress);
+    // Setting userActivity=true now and setting the interval to the same time
+    // as the activityCheck interval (250) should ensure we never miss the
+    // next activityCheck
+    mouseInProgress = setInterval(vjs.bind(this, onMouseActivity), 250);
+  };
+
+  onMouseUp = function(event) {
+    onMouseActivity();
+    // Stop the interval that maintains activity if the mouse/touch is down
+    clearInterval(mouseInProgress);
+  };
+
+  // Any mouse movement will be considered user activity
+  this.on('mousedown', onMouseDown);
+  this.on('mousemove', onMouseActivity);
+  this.on('mouseup', onMouseUp);
+
+  // Listen for keyboard navigation
+  // Shouldn't need to use inProgress interval because of key repeat
+  this.on('keydown', onMouseActivity);
+  this.on('keyup', onMouseActivity);
+
+  // Consider any touch events that bubble up to be activity
+  // Certain touches on the tech will be blocked from bubbling because they
+  // toggle controls
+  this.on('touchstart', onMouseDown);
+  this.on('touchmove', onMouseActivity);
+  this.on('touchend', onMouseUp);
+  this.on('touchcancel', onMouseUp);
+
+  // Run an interval every 250 milliseconds instead of stuffing everything into
+  // the mousemove/touchmove function itself, to prevent performance degradation.
+  // `this.reportUserActivity` simply sets this.userActivity_ to true, which
+  // then gets picked up by this loop
+  // http://ejohn.org/blog/learning-from-twitter/
+  activityCheck = setInterval(vjs.bind(this, function() {
+    // Check to see if mouse/touch activity has happened
+    if (this.userActivity_) {
+      // Reset the activity tracker
+      this.userActivity_ = false;
+
+      // If the user state was inactive, set the state to active
+      this.userActive(true);
+
+      // Clear any existing inactivity timeout to start the timer over
+      clearTimeout(inactivityTimeout);
+
+      // In X seconds, if no more activity has occurred the user will be
+      // considered inactive
+      inactivityTimeout = setTimeout(vjs.bind(this, function() {
+        // Protect against the case where the inactivityTimeout can trigger just
+        // before the next user activity is picked up by the activityCheck loop
+        // causing a flicker
+        if (!this.userActivity_) {
+          this.userActive(false);
+        }
+      }), 2000);
+    }
+  }), 250);
+
+  // Clean up the intervals when we kill the player
+  this.on('dispose', function(){
+    clearInterval(activityCheck);
+    clearTimeout(inactivityTimeout);
+  });
+};
+
+// Methods to add support for
+// networkState: function(){ return this.techCall('networkState'); },
+// readyState: function(){ return this.techCall('readyState'); },
+// seeking: function(){ return this.techCall('seeking'); },
+// initialTime: function(){ return this.techCall('initialTime'); },
+// startOffsetTime: function(){ return this.techCall('startOffsetTime'); },
+// played: function(){ return this.techCall('played'); },
+// seekable: function(){ return this.techCall('seekable'); },
+// videoTracks: function(){ return this.techCall('videoTracks'); },
+// audioTracks: function(){ return this.techCall('audioTracks'); },
+// videoWidth: function(){ return this.techCall('videoWidth'); },
+// videoHeight: function(){ return this.techCall('videoHeight'); },
+// defaultPlaybackRate: function(){ return this.techCall('defaultPlaybackRate'); },
+// playbackRate: function(){ return this.techCall('playbackRate'); },
+// mediaGroup: function(){ return this.techCall('mediaGroup'); },
+// controller: function(){ return this.techCall('controller'); },
+// defaultMuted: function(){ return this.techCall('defaultMuted'); }
+
+// TODO
+// currentSrcList: the array of sources including other formats and bitrates
+// playList: array of source lists in order of playback
+
+// RequestFullscreen API
+(function(){
+  var prefix, requestFS, div;
+
+  div = document.createElement('div');
+
+  requestFS = {};
+
+  // Current W3C Spec
+  // http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#api
+  // Mozilla Draft: https://wiki.mozilla.org/Gecko:FullScreenAPI#fullscreenchange_event
+  // New: https://dvcs.w3.org/hg/fullscreen/raw-file/529a67b8d9f3/Overview.html
+  if (div.cancelFullscreen !== undefined) {
+    requestFS.requestFn = 'requestFullscreen';
+    requestFS.cancelFn = 'exitFullscreen';
+    requestFS.eventName = 'fullscreenchange';
+    requestFS.isFullScreen = 'fullScreen';
+
+  // Webkit (Chrome/Safari) and Mozilla (Firefox) have working implementations
+  // that use prefixes and vary slightly from the new W3C spec. Specifically,
+  // using 'exit' instead of 'cancel', and lowercasing the 'S' in Fullscreen.
+  // Other browsers don't have any hints of which version they might follow yet,
+  // so not going to try to predict by looping through all prefixes.
+  } else {
+
+    if (document.mozCancelFullScreen) {
+      prefix = 'moz';
+      requestFS.isFullScreen = prefix + 'FullScreen';
+    } else {
+      prefix = 'webkit';
+      requestFS.isFullScreen = prefix + 'IsFullScreen';
+    }
+
+    if (div[prefix + 'RequestFullScreen']) {
+      requestFS.requestFn = prefix + 'RequestFullScreen';
+      requestFS.cancelFn = prefix + 'CancelFullScreen';
+    }
+    requestFS.eventName = prefix + 'fullscreenchange';
+  }
+
+  if (document[requestFS.cancelFn]) {
+    vjs.support.requestFullScreen = requestFS;
+  }
+
+})();
+
+
+/**
+ * Container of main controls
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ * @extends vjs.Component
+ */
+vjs.ControlBar = vjs.Component.extend();
+
+vjs.ControlBar.prototype.options_ = {
+  loadEvent: 'play',
+  children: {
+    'playToggle': {},
+    'currentTimeDisplay': {},
+    'timeDivider': {},
+    'durationDisplay': {},
+    'remainingTimeDisplay': {},
+    'progressControl': {},
+    'fullscreenToggle': {},
+    'volumeControl': {},
+    'muteToggle': {}
+    // 'volumeMenuButton': {}
+  }
+};
+
+vjs.ControlBar.prototype.createEl = function(){
+  return vjs.createEl('div', {
+    className: 'vjs-control-bar'
+  });
+};
+/**
+ * Button to toggle between play and pause
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.PlayToggle = vjs.Button.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+
+    player.on('play', vjs.bind(this, this.onPlay));
+    player.on('pause', vjs.bind(this, this.onPause));
+  }
+});
+
+vjs.PlayToggle.prototype.buttonText = 'Play';
+
+vjs.PlayToggle.prototype.buildCSSClass = function(){
+  return 'vjs-play-control ' + vjs.Button.prototype.buildCSSClass.call(this);
+};
+
+// OnClick - Toggle between play and pause
+vjs.PlayToggle.prototype.onClick = function(){
+  if (this.player_.paused()) {
+    this.player_.play();
+  } else {
+    this.player_.pause();
+  }
+};
+
+  // OnPlay - Add the vjs-playing class to the element so it can change appearance
+vjs.PlayToggle.prototype.onPlay = function(){
+  vjs.removeClass(this.el_, 'vjs-paused');
+  vjs.addClass(this.el_, 'vjs-playing');
+  this.el_.children[0].children[0].innerHTML = 'Pause'; // change the button text to "Pause"
+};
+
+  // OnPause - Add the vjs-paused class to the element so it can change appearance
+vjs.PlayToggle.prototype.onPause = function(){
+  vjs.removeClass(this.el_, 'vjs-playing');
+  vjs.addClass(this.el_, 'vjs-paused');
+  this.el_.children[0].children[0].innerHTML = 'Play'; // change the button text to "Play"
+};
+/**
+ * Displays the current time
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.CurrentTimeDisplay = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    player.on('timeupdate', vjs.bind(this, this.updateContent));
+  }
+});
+
+vjs.CurrentTimeDisplay.prototype.createEl = function(){
+  var el = vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-current-time vjs-time-controls vjs-control'
+  });
+
+  this.content = vjs.createEl('div', {
+    className: 'vjs-current-time-display',
+    innerHTML: '<span class="vjs-control-text">Current Time </span>' + '0:00', // label the current time for screen reader users
+    'aria-live': 'off' // tell screen readers not to automatically read the time as it changes
+  });
+
+  el.appendChild(vjs.createEl('div').appendChild(this.content));
+  return el;
+};
+
+vjs.CurrentTimeDisplay.prototype.updateContent = function(){
+  // Allows for smooth scrubbing, when player can't keep up.
+  var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();
+  this.content.innerHTML = '<span class="vjs-control-text">Current Time </span>' + vjs.formatTime(time, this.player_.duration());
+};
+
+/**
+ * Displays the duration
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.DurationDisplay = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    player.on('timeupdate', vjs.bind(this, this.updateContent)); // this might need to be changes to 'durationchange' instead of 'timeupdate' eventually, however the durationchange event fires before this.player_.duration() is set, so the value cannot be written out using this method. Once the order of durationchange and this.player_.duration() being set is figured out, this can be updated.
+  }
+});
+
+vjs.DurationDisplay.prototype.createEl = function(){
+  var el = vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-duration vjs-time-controls vjs-control'
+  });
+
+  this.content = vjs.createEl('div', {
+    className: 'vjs-duration-display',
+    innerHTML: '<span class="vjs-control-text">Duration Time </span>' + '0:00', // label the duration time for screen reader users
+    'aria-live': 'off' // tell screen readers not to automatically read the time as it changes
+  });
+
+  el.appendChild(vjs.createEl('div').appendChild(this.content));
+  return el;
+};
+
+vjs.DurationDisplay.prototype.updateContent = function(){
+  var duration = this.player_.duration();
+  if (duration) {
+      this.content.innerHTML = '<span class="vjs-control-text">Duration Time </span>' + vjs.formatTime(duration); // label the duration time for screen reader users
+  }
+};
+
+/**
+ * The separator between the current time and duration
+ *
+ * Can be hidden if it's not needed in the design.
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.TimeDivider = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+  }
+});
+
+vjs.TimeDivider.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-time-divider',
+    innerHTML: '<div><span>/</span></div>'
+  });
+};
+
+/**
+ * Displays the time left in the video
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.RemainingTimeDisplay = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    player.on('timeupdate', vjs.bind(this, this.updateContent));
+  }
+});
+
+vjs.RemainingTimeDisplay.prototype.createEl = function(){
+  var el = vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-remaining-time vjs-time-controls vjs-control'
+  });
+
+  this.content = vjs.createEl('div', {
+    className: 'vjs-remaining-time-display',
+    innerHTML: '<span class="vjs-control-text">Remaining Time </span>' + '-0:00', // label the remaining time for screen reader users
+    'aria-live': 'off' // tell screen readers not to automatically read the time as it changes
+  });
+
+  el.appendChild(vjs.createEl('div').appendChild(this.content));
+  return el;
+};
+
+vjs.RemainingTimeDisplay.prototype.updateContent = function(){
+  if (this.player_.duration()) {
+    this.content.innerHTML = '<span class="vjs-control-text">Remaining Time </span>' + '-'+ vjs.formatTime(this.player_.remainingTime());
+  }
+
+  // Allows for smooth scrubbing, when player can't keep up.
+  // var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();
+  // this.content.innerHTML = vjs.formatTime(time, this.player_.duration());
+};
+/**
+ * Toggle fullscreen video
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @extends vjs.Button
+ */
+vjs.FullscreenToggle = vjs.Button.extend({
+  /**
+   * @constructor
+   * @memberof vjs.FullscreenToggle
+   * @instance
+   */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+  }
+});
+
+vjs.FullscreenToggle.prototype.buttonText = 'Fullscreen';
+
+vjs.FullscreenToggle.prototype.buildCSSClass = function(){
+  return 'vjs-fullscreen-control ' + vjs.Button.prototype.buildCSSClass.call(this);
+};
+
+vjs.FullscreenToggle.prototype.onClick = function(){
+  if (!this.player_.isFullScreen) {
+    this.player_.requestFullScreen();
+    this.el_.children[0].children[0].innerHTML = 'Non-Fullscreen'; // change the button text to "Non-Fullscreen"
+  } else {
+    this.player_.cancelFullScreen();
+    this.el_.children[0].children[0].innerHTML = 'Fullscreen'; // change the button to "Fullscreen"
+  }
+};
+/**
+ * The Progress Control component contains the seek bar, load progress,
+ * and play progress
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.ProgressControl = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+  }
+});
+
+vjs.ProgressControl.prototype.options_ = {
+  children: {
+    'seekBar': {}
+  }
+};
+
+vjs.ProgressControl.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-progress-control vjs-control'
+  });
+};
+
+/**
+ * Seek Bar and holder for the progress bars
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.SeekBar = vjs.Slider.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Slider.call(this, player, options);
+    player.on('timeupdate', vjs.bind(this, this.updateARIAAttributes));
+    player.ready(vjs.bind(this, this.updateARIAAttributes));
+  }
+});
+
+vjs.SeekBar.prototype.options_ = {
+  children: {
+    'loadProgressBar': {},
+    'playProgressBar': {},
+    'seekHandle': {}
+  },
+  'barName': 'playProgressBar',
+  'handleName': 'seekHandle'
+};
+
+vjs.SeekBar.prototype.playerEvent = 'timeupdate';
+
+vjs.SeekBar.prototype.createEl = function(){
+  return vjs.Slider.prototype.createEl.call(this, 'div', {
+    className: 'vjs-progress-holder',
+    'aria-label': 'video progress bar'
+  });
+};
+
+vjs.SeekBar.prototype.updateARIAAttributes = function(){
+    // Allows for smooth scrubbing, when player can't keep up.
+    var time = (this.player_.scrubbing) ? this.player_.getCache().currentTime : this.player_.currentTime();
+    this.el_.setAttribute('aria-valuenow',vjs.round(this.getPercent()*100, 2)); // machine readable value of progress bar (percentage complete)
+    this.el_.setAttribute('aria-valuetext',vjs.formatTime(time, this.player_.duration())); // human readable value of progress bar (time complete)
+};
+
+vjs.SeekBar.prototype.getPercent = function(){
+  var currentTime;
+  // Flash RTMP provider will not report the correct time
+  // immediately after a seek. This isn't noticeable if you're
+  // seeking while the video is playing, but it is if you seek
+  // while the video is paused.
+  if (this.player_.techName === 'Flash' && this.player_.seeking()) {
+    var cache = this.player_.getCache();
+    if (cache.lastSetCurrentTime) {
+      currentTime = cache.lastSetCurrentTime;
+    }
+    else {
+      currentTime = this.player_.currentTime();
+    }
+  }
+  else {
+    currentTime = this.player_.currentTime();
+  }
+
+  return currentTime / this.player_.duration();
+};
+
+vjs.SeekBar.prototype.onMouseDown = function(event){
+  vjs.Slider.prototype.onMouseDown.call(this, event);
+
+  this.player_.scrubbing = true;
+
+  this.videoWasPlaying = !this.player_.paused();
+  this.player_.pause();
+};
+
+vjs.SeekBar.prototype.onMouseMove = function(event){
+  var newTime = this.calculateDistance(event) * this.player_.duration();
+
+  // Don't let video end while scrubbing.
+  if (newTime == this.player_.duration()) { newTime = newTime - 0.1; }
+
+  // Set new time (tell player to seek to new time)
+  this.player_.currentTime(newTime);
+};
+
+vjs.SeekBar.prototype.onMouseUp = function(event){
+    debugger
+  vjs.Slider.prototype.onMouseUp.call(this, event);
+
+  this.player_.scrubbing = false;
+  if (this.videoWasPlaying) {
+      debugger
+    this.player_.play();
+  }
+};
+
+vjs.SeekBar.prototype.stepForward = function(){
+  this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users
+};
+
+vjs.SeekBar.prototype.stepBack = function(){
+  this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users
+};
+
+
+/**
+ * Shows load progress
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.LoadProgressBar = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+    player.on('progress', vjs.bind(this, this.update));
+  }
+});
+
+vjs.LoadProgressBar.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-load-progress',
+    innerHTML: '<span class="vjs-control-text">Loaded: 0%</span>'
+  });
+};
+
+vjs.LoadProgressBar.prototype.update = function(){
+  if (this.el_.style) { this.el_.style.width = vjs.round(this.player_.bufferedPercent() * 100, 2) + '%'; }
+};
+
+
+/**
+ * Shows play progress
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.PlayProgressBar = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+  }
+});
+
+vjs.PlayProgressBar.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-play-progress',
+    innerHTML: '<span class="vjs-control-text">Progress: 0%</span>'
+  });
+};
+
+/**
+ * The Seek Handle shows the current position of the playhead during playback,
+ * and can be dragged to adjust the playhead.
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.SeekHandle = vjs.SliderHandle.extend();
+
+/**
+ * The default value for the handle content, which may be read by screen readers
+ *
+ * @type {String}
+ * @private
+ */
+vjs.SeekHandle.prototype.defaultValue = '00:00';
+
+/** @inheritDoc */
+vjs.SeekHandle.prototype.createEl = function(){
+  return vjs.SliderHandle.prototype.createEl.call(this, 'div', {
+    className: 'vjs-seek-handle'
+  });
+};
+/**
+ * The component for controlling the volume level
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.VolumeControl = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    // hide volume controls when they're not supported by the current tech
+    if (player.tech && player.tech.features && player.tech.features['volumeControl'] === false) {
+      this.addClass('vjs-hidden');
+    }
+    player.on('loadstart', vjs.bind(this, function(){
+      if (player.tech.features && player.tech.features['volumeControl'] === false) {
+        this.addClass('vjs-hidden');
+      } else {
+        this.removeClass('vjs-hidden');
+      }
+    }));
+  }
+});
+
+vjs.VolumeControl.prototype.options_ = {
+  children: {
+    'volumeBar': {}
+  }
+};
+
+vjs.VolumeControl.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-volume-control vjs-control'
+  });
+};
+
+/**
+ * The bar that contains the volume level and can be clicked on to adjust the level
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.VolumeBar = vjs.Slider.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Slider.call(this, player, options);
+    player.on('volumechange', vjs.bind(this, this.updateARIAAttributes));
+    player.ready(vjs.bind(this, this.updateARIAAttributes));
+    setTimeout(vjs.bind(this, this.update), 0); // update when elements is in DOM
+  }
+});
+
+vjs.VolumeBar.prototype.updateARIAAttributes = function(){
+  // Current value of volume bar as a percentage
+  this.el_.setAttribute('aria-valuenow',vjs.round(this.player_.volume()*100, 2));
+  this.el_.setAttribute('aria-valuetext',vjs.round(this.player_.volume()*100, 2)+'%');
+};
+
+vjs.VolumeBar.prototype.options_ = {
+  children: {
+    'volumeLevel': {},
+    'volumeHandle': {}
+  },
+  'barName': 'volumeLevel',
+  'handleName': 'volumeHandle'
+};
+
+vjs.VolumeBar.prototype.playerEvent = 'volumechange';
+
+vjs.VolumeBar.prototype.createEl = function(){
+  return vjs.Slider.prototype.createEl.call(this, 'div', {
+    className: 'vjs-volume-bar',
+    'aria-label': 'volume level'
+  });
+};
+
+vjs.VolumeBar.prototype.onMouseMove = function(event) {
+  if (this.player_.muted()) {
+    this.player_.muted(false);
+  }
+
+  this.player_.volume(this.calculateDistance(event));
+};
+
+vjs.VolumeBar.prototype.getPercent = function(){
+  if (this.player_.muted()) {
+    return 0;
+  } else {
+    return this.player_.volume();
+  }
+};
+
+vjs.VolumeBar.prototype.stepForward = function(){
+  this.player_.volume(this.player_.volume() + 0.1);
+};
+
+vjs.VolumeBar.prototype.stepBack = function(){
+  this.player_.volume(this.player_.volume() - 0.1);
+};
+
+/**
+ * Shows volume level
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.VolumeLevel = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+  }
+});
+
+vjs.VolumeLevel.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-volume-level',
+    innerHTML: '<span class="vjs-control-text"></span>'
+  });
+};
+
+/**
+ * The volume handle can be dragged to adjust the volume level
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+ vjs.VolumeHandle = vjs.SliderHandle.extend();
+
+ vjs.VolumeHandle.prototype.defaultValue = '00:00';
+
+ /** @inheritDoc */
+ vjs.VolumeHandle.prototype.createEl = function(){
+   return vjs.SliderHandle.prototype.createEl.call(this, 'div', {
+     className: 'vjs-volume-handle'
+   });
+ };
+/**
+ * A button component for muting the audio
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.MuteToggle = vjs.Button.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+
+    player.on('volumechange', vjs.bind(this, this.update));
+
+    // hide mute toggle if the current tech doesn't support volume control
+    if (player.tech && player.tech.features && player.tech.features['volumeControl'] === false) {
+      this.addClass('vjs-hidden');
+    }
+    player.on('loadstart', vjs.bind(this, function(){
+      if (player.tech.features && player.tech.features['volumeControl'] === false) {
+        this.addClass('vjs-hidden');
+      } else {
+        this.removeClass('vjs-hidden');
+      }
+    }));
+  }
+});
+
+vjs.MuteToggle.prototype.createEl = function(){
+  return vjs.Button.prototype.createEl.call(this, 'div', {
+    className: 'vjs-mute-control vjs-control',
+    innerHTML: '<div><span class="vjs-control-text">Mute</span></div>'
+  });
+};
+
+vjs.MuteToggle.prototype.onClick = function(){
+  this.player_.muted( this.player_.muted() ? false : true );
+};
+
+vjs.MuteToggle.prototype.update = function(){
+  var vol = this.player_.volume(),
+      level = 3;
+
+  if (vol === 0 || this.player_.muted()) {
+    level = 0;
+  } else if (vol < 0.33) {
+    level = 1;
+  } else if (vol < 0.67) {
+    level = 2;
+  }
+
+  // Don't rewrite the button text if the actual text doesn't change.
+  // This causes unnecessary and confusing information for screen reader users.
+  // This check is needed because this function gets called every time the volume level is changed.
+  if(this.player_.muted()){
+      if(this.el_.children[0].children[0].innerHTML!='Unmute'){
+          this.el_.children[0].children[0].innerHTML = 'Unmute'; // change the button text to "Unmute"
+      }
+  } else {
+      if(this.el_.children[0].children[0].innerHTML!='Mute'){
+          this.el_.children[0].children[0].innerHTML = 'Mute'; // change the button text to "Mute"
+      }
+  }
+
+  /* TODO improve muted icon classes */
+  for (var i = 0; i < 4; i++) {
+    vjs.removeClass(this.el_, 'vjs-vol-'+i);
+  }
+  vjs.addClass(this.el_, 'vjs-vol-'+level);
+};
+/**
+ * Menu button with a popup for showing the volume slider.
+ * @constructor
+ */
+vjs.VolumeMenuButton = vjs.MenuButton.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.MenuButton.call(this, player, options);
+
+    // Same listeners as MuteToggle
+    player.on('volumechange', vjs.bind(this, this.update));
+
+    // hide mute toggle if the current tech doesn't support volume control
+    if (player.tech && player.tech.features && player.tech.features.volumeControl === false) {
+      this.addClass('vjs-hidden');
+    }
+    player.on('loadstart', vjs.bind(this, function(){
+      if (player.tech.features && player.tech.features.volumeControl === false) {
+        this.addClass('vjs-hidden');
+      } else {
+        this.removeClass('vjs-hidden');
+      }
+    }));
+    this.addClass('vjs-menu-button');
+  }
+});
+
+vjs.VolumeMenuButton.prototype.createMenu = function(){
+  var menu = new vjs.Menu(this.player_, {
+    contentElType: 'div'
+  });
+  var vc = new vjs.VolumeBar(this.player_, vjs.obj.merge({vertical: true}, this.options_.volumeBar));
+  menu.addChild(vc);
+  return menu;
+};
+
+vjs.VolumeMenuButton.prototype.onClick = function(){
+  vjs.MuteToggle.prototype.onClick.call(this);
+  vjs.MenuButton.prototype.onClick.call(this);
+};
+
+vjs.VolumeMenuButton.prototype.createEl = function(){
+  return vjs.Button.prototype.createEl.call(this, 'div', {
+    className: 'vjs-volume-menu-button vjs-menu-button vjs-control',
+    innerHTML: '<div><span class="vjs-control-text">Mute</span></div>'
+  });
+};
+vjs.VolumeMenuButton.prototype.update = vjs.MuteToggle.prototype.update;
+/* Poster Image
+================================================================================ */
+/**
+ * The component that handles showing the poster image.
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.PosterImage = vjs.Button.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Button.call(this, player, options);
+
+    if (!player.poster() || !player.controls()) {
+      this.hide();
+    }
+
+    player.on('play', vjs.bind(this, this.hide));
+  }
+});
+
+vjs.PosterImage.prototype.createEl = function(){
+  var el = vjs.createEl('div', {
+        className: 'vjs-poster',
+
+        // Don't want poster to be tabbable.
+        tabIndex: -1
+      }),
+      poster = this.player_.poster();
+
+  if (poster) {
+    if ('backgroundSize' in el.style) {
+      el.style.backgroundImage = 'url("' + poster + '")';
+    } else {
+      el.appendChild(vjs.createEl('img', { src: poster }));
+    }
+  }
+
+  return el;
+};
+
+vjs.PosterImage.prototype.onClick = function(){
+  // Only accept clicks when controls are enabled
+  if (this.player().controls()) {
+    this.player_.play();
+  }
+};
+/* Loading Spinner
+================================================================================ */
+/**
+ * Loading spinner for waiting events
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.LoadingSpinner = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    player.on('canplay', vjs.bind(this, this.hide));
+    player.on('canplaythrough', vjs.bind(this, this.hide));
+    player.on('playing', vjs.bind(this, this.hide));
+    player.on('seeked', vjs.bind(this, this.hide));
+
+    player.on('seeking', vjs.bind(this, this.show));
+
+    // in some browsers seeking does not trigger the 'playing' event,
+    // so we also need to trap 'seeked' if we are going to set a
+    // 'seeking' event
+    player.on('seeked', vjs.bind(this, this.hide));
+
+    player.on('error', vjs.bind(this, this.show));
+
+    // Not showing spinner on stalled any more. Browsers may stall and then not trigger any events that would remove the spinner.
+    // Checked in Chrome 16 and Safari 5.1.2. http://help.videojs.com/discussions/problems/883-why-is-the-download-progress-showing
+    // player.on('stalled', vjs.bind(this, this.show));
+
+    player.on('waiting', vjs.bind(this, this.show));
+  }
+});
+
+vjs.LoadingSpinner.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-loading-spinner'
+  });
+};
+/* Big Play Button
+================================================================================ */
+/**
+ * Initial play button. Shows before the video has played. The hiding of the
+ * big play button is done via CSS and player states.
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @class
+ * @constructor
+ */
+vjs.BigPlayButton = vjs.Button.extend();
+
+vjs.BigPlayButton.prototype.createEl = function(){
+  return vjs.Button.prototype.createEl.call(this, 'div', {
+    className: 'vjs-big-play-button',
+    innerHTML: '<span aria-hidden="true"></span>',
+    'aria-label': 'play video'
+  });
+};
+
+vjs.BigPlayButton.prototype.onClick = function(){
+  this.player_.play();
+};
+/**
+ * @fileoverview Media Technology Controller - Base class for media playback
+ * technology controllers like Flash and HTML5
+ */
+
+/**
+ * Base class for media (HTML5 Video, Flash) controllers
+ * @param {vjs.Player|Object} player  Central player instance
+ * @param {Object=} options Options object
+ * @constructor
+ */
+vjs.MediaTechController = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.Component.call(this, player, options, ready);
+
+    this.initControlsListeners();
+  }
+});
+
+/**
+ * Set up click and touch listeners for the playback element
+ * On desktops, a click on the video itself will toggle playback,
+ * on a mobile device a click on the video toggles controls.
+ * (toggling controls is done by toggling the user state between active and
+ * inactive)
+ *
+ * A tap can signal that a user has become active, or has become inactive
+ * e.g. a quick tap on an iPhone movie should reveal the controls. Another
+ * quick tap should hide them again (signaling the user is in an inactive
+ * viewing state)
+ *
+ * In addition to this, we still want the user to be considered inactive after
+ * a few seconds of inactivity.
+ *
+ * Note: the only part of iOS interaction we can't mimic with this setup
+ * is a touch and hold on the video element counting as activity in order to
+ * keep the controls showing, but that shouldn't be an issue. A touch and hold on
+ * any controls will still keep the user active
+ */
+vjs.MediaTechController.prototype.initControlsListeners = function(){
+  var player, tech, activateControls, deactivateControls;
+
+  tech = this;
+  player = this.player();
+
+  var activateControls = function(){
+    if (player.controls() && !player.usingNativeControls()) {
+      tech.addControlsListeners();
+    }
+  };
+
+  deactivateControls = vjs.bind(tech, tech.removeControlsListeners);
+
+  // Set up event listeners once the tech is ready and has an element to apply
+  // listeners to
+  this.ready(activateControls);
+  player.on('controlsenabled', activateControls);
+  player.on('controlsdisabled', deactivateControls);
+};
+
+vjs.MediaTechController.prototype.addControlsListeners = function(){
+  var preventBubble, userWasActive;
+
+  // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do
+  // trigger mousedown/up.
+  // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object
+  // Any touch events are set to block the mousedown event from happening
+  this.on('mousedown', this.onClick);
+
+  // We need to block touch events on the video element from bubbling up,
+  // otherwise they'll signal activity prematurely. The specific use case is
+  // when the video is playing and the controls have faded out. In this case
+  // only a tap (fast touch) should toggle the user active state and turn the
+  // controls back on. A touch and move or touch and hold should not trigger
+  // the controls (per iOS as an example at least)
+  //
+  // We always want to stop propagation on touchstart because touchstart
+  // at the player level starts the touchInProgress interval. We can still
+  // report activity on the other events, but won't let them bubble for
+  // consistency. We don't want to bubble a touchend without a touchstart.
+  this.on('touchstart', function(event) {
+    // Stop the mouse events from also happening
+    event.preventDefault();
+    event.stopPropagation();
+    // Record if the user was active now so we don't have to keep polling it
+    userWasActive = this.player_.userActive();
+  });
+
+  preventBubble = function(event){
+    event.stopPropagation();
+    if (userWasActive) {
+      this.player_.reportUserActivity();
+    }
+  };
+
+  // Treat all touch events the same for consistency
+  this.on('touchmove', preventBubble);
+  this.on('touchleave', preventBubble);
+  this.on('touchcancel', preventBubble);
+  this.on('touchend', preventBubble);
+
+  // Turn on component tap events
+  this.emitTapEvents();
+
+  // The tap listener needs to come after the touchend listener because the tap
+  // listener cancels out any reportedUserActivity when setting userActive(false)
+  this.on('tap', this.onTap);
+};
+
+/**
+ * Remove the listeners used for click and tap controls. This is needed for
+ * toggling to controls disabled, where a tap/touch should do nothing.
+ */
+vjs.MediaTechController.prototype.removeControlsListeners = function(){
+  // We don't want to just use `this.off()` because there might be other needed
+  // listeners added by techs that extend this.
+  this.off('tap');
+  this.off('touchstart');
+  this.off('touchmove');
+  this.off('touchleave');
+  this.off('touchcancel');
+  this.off('touchend');
+  this.off('click');
+  this.off('mousedown');
+};
+
+/**
+ * Handle a click on the media element. By default will play/pause the media.
+ */
+vjs.MediaTechController.prototype.onClick = function(event){
+  // We're using mousedown to detect clicks thanks to Flash, but mousedown
+  // will also be triggered with right-clicks, so we need to prevent that
+  if (event.button !== 0) return;
+
+  // When controls are disabled a click should not toggle playback because
+  // the click is considered a control
+  if (this.player().controls()) {
+    if (this.player().paused()) {
+      this.player().play();
+    } else {
+      this.player().pause();
+    }
+  }
+};
+
+/**
+ * Handle a tap on the media element. By default it will toggle the user
+ * activity state, which hides and shows the controls.
+ */
+
+vjs.MediaTechController.prototype.onTap = function(){
+  this.player().userActive(!this.player().userActive());
+};
+
+vjs.MediaTechController.prototype.features = {
+  'volumeControl': true,
+
+  // Resizing plugins using request fullscreen reloads the plugin
+  'fullscreenResize': false,
+
+  // Optional events that we can manually mimic with timers
+  // currently not triggered by video-js-swf
+  'progressEvents': false,
+  'timeupdateEvents': false
+};
+
+vjs.media = {};
+
+/**
+ * List of default API methods for any MediaTechController
+ * @type {String}
+ */
+vjs.media.ApiMethods = 'play,pause,paused,currentTime,setCurrentTime,duration,buffered,volume,setVolume,muted,setMuted,width,height,supportsFullScreen,enterFullScreen,src,load,currentSrc,preload,setPreload,autoplay,setAutoplay,loop,setLoop,error,networkState,readyState,seeking,initialTime,startOffsetTime,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks,defaultPlaybackRate,playbackRate,mediaGroup,controller,controls,defaultMuted'.split(',');
+// Create placeholder methods for each that warn when a method isn't supported by the current playback technology
+
+function createMethod(methodName){
+  return function(){
+    throw new Error('The "'+methodName+'" method is not available on the playback technology\'s API');
+  };
+}
+
+for (var i = vjs.media.ApiMethods.length - 1; i >= 0; i--) {
+  var methodName = vjs.media.ApiMethods[i];
+  vjs.MediaTechController.prototype[vjs.media.ApiMethods[i]] = createMethod(methodName);
+}
+/**
+ * @fileoverview HTML5 Media Controller - Wrapper for HTML5 Media API
+ */
+
+/**
+ * HTML5 Media Controller - Wrapper for HTML5 Media API
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @param {Function=} ready
+ * @constructor
+ */
+vjs.Html5 = vjs.MediaTechController.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    // volume cannot be changed from 1 on iOS
+    this.features['volumeControl'] = vjs.Html5.canControlVolume();
+
+    // In iOS, if you move a video element in the DOM, it breaks video playback.
+    this.features['movingMediaElementInDOM'] = !vjs.IS_IOS;
+
+    // HTML video is able to automatically resize when going to fullscreen
+    this.features['fullscreenResize'] = true;
+
+    vjs.MediaTechController.call(this, player, options, ready);
+
+    var source = options['source'];
+
+    // If the element source is already set, we may have missed the loadstart event, and want to trigger it.
+    // We don't want to set the source again and interrupt playback.
+    if (source && this.el_.currentSrc === source.src && this.el_.networkState > 0) {
+      player.trigger('loadstart');
+
+    // Otherwise set the source if one was provided.
+    } else if (source) {
+      this.el_.src = source.src;
+    }
+
+    // Determine if native controls should be used
+    // Our goal should be to get the custom controls on mobile solid everywhere
+    // so we can remove this all together. Right now this will block custom
+    // controls on touch enabled laptops like the Chrome Pixel
+    if (vjs.TOUCH_ENABLED && player.options()['nativeControlsForTouch'] !== false) {
+      this.useNativeControls();
+    }
+
+    // Chrome and Safari both have issues with autoplay.
+    // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.
+    // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)
+    // This fixes both issues. Need to wait for API, so it updates displays correctly
+    player.ready(function(){
+      if (this.tag && this.options_['autoplay'] && this.paused()) {
+        delete this.tag['poster']; // Chrome Fix. Fixed in Chrome v16.
+        this.play();
+      }
+    });
+
+    this.setupTriggers();
+    this.triggerReady();
+  }
+});
+
+vjs.Html5.prototype.dispose = function(){
+  vjs.MediaTechController.prototype.dispose.call(this);
+};
+
+vjs.Html5.prototype.createEl = function(){
+  var player = this.player_,
+      // If possible, reuse original tag for HTML5 playback technology element
+      el = player.tag,
+      newEl,
+      clone;
+
+  // Check if this browser supports moving the element into the box.
+  // On the iPhone video will break if you move the element,
+  // So we have to create a brand new element.
+  if (!el || this.features['movingMediaElementInDOM'] === false) {
+
+    // If the original tag is still there, clone and remove it.
+    if (el) {
+      clone = el.cloneNode(false);
+      vjs.Html5.disposeMediaElement(el);
+      el = clone;
+      player.tag = null;
+    } else {
+      el = vjs.createEl('video', {
+        id:player.id() + '_html5_api',
+        className:'vjs-tech'
+      });
+    }
+    // associate the player with the new tag
+    el['player'] = player;
+
+    vjs.insertFirst(el, player.el());
+  }
+
+  // Update specific tag settings, in case they were overridden
+  var attrs = ['autoplay','preload','loop','muted'];
+  for (var i = attrs.length - 1; i >= 0; i--) {
+    var attr = attrs[i];
+    if (player.options_[attr] !== null) {
+      el[attr] = player.options_[attr];
+    }
+  }
+
+  return el;
+  // jenniisawesome = true;
+};
+
+// Make video events trigger player events
+// May seem verbose here, but makes other APIs possible.
+vjs.Html5.prototype.setupTriggers = function(){
+  for (var i = vjs.Html5.Events.length - 1; i >= 0; i--) {
+    vjs.on(this.el_, vjs.Html5.Events[i], vjs.bind(this.player_, this.eventHandler));
+  }
+};
+// Triggers removed using this.off when disposed
+
+vjs.Html5.prototype.eventHandler = function(e){
+  this.trigger(e);
+
+  // No need for media events to bubble up.
+  e.stopPropagation();
+};
+
+vjs.Html5.prototype.useNativeControls = function(){
+  var tech, player, controlsOn, controlsOff, cleanUp;
+
+  tech = this;
+  player = this.player();
+
+  // If the player controls are enabled turn on the native controls
+  tech.setControls(player.controls());
+
+  // Update the native controls when player controls state is updated
+  controlsOn = function(){
+    tech.setControls(true);
+  };
+  controlsOff = function(){
+    tech.setControls(false);
+  };
+  player.on('controlsenabled', controlsOn);
+  player.on('controlsdisabled', controlsOff);
+
+  // Clean up when not using native controls anymore
+  cleanUp = function(){
+    player.off('controlsenabled', controlsOn);
+    player.off('controlsdisabled', controlsOff);
+  };
+  tech.on('dispose', cleanUp);
+  player.on('usingcustomcontrols', cleanUp);
+
+  // Update the state of the player to using native controls
+  player.usingNativeControls(true);
+};
+
+
+vjs.Html5.prototype.play = function(){ this.el_.play(); };
+vjs.Html5.prototype.pause = function(){ this.el_.pause(); };
+vjs.Html5.prototype.paused = function(){ return this.el_.paused; };
+
+vjs.Html5.prototype.currentTime = function(){ return this.el_.currentTime; };
+vjs.Html5.prototype.setCurrentTime = function(seconds){
+  try {
+    this.el_.currentTime = seconds;
+  } catch(e) {
+    vjs.log(e, 'Video is not ready. (Video.js)');
+    // this.warning(VideoJS.warnings.videoNotReady);
+  }
+};
+
+vjs.Html5.prototype.duration = function(){ return this.el_.duration || 0; };
+vjs.Html5.prototype.buffered = function(){ return this.el_.buffered; };
+
+vjs.Html5.prototype.volume = function(){ return this.el_.volume; };
+vjs.Html5.prototype.setVolume = function(percentAsDecimal){ this.el_.volume = percentAsDecimal; };
+vjs.Html5.prototype.muted = function(){ return this.el_.muted; };
+vjs.Html5.prototype.setMuted = function(muted){ this.el_.muted = muted; };
+
+vjs.Html5.prototype.width = function(){ return this.el_.offsetWidth; };
+vjs.Html5.prototype.height = function(){ return this.el_.offsetHeight; };
+
+vjs.Html5.prototype.supportsFullScreen = function(){
+  if (typeof this.el_.webkitEnterFullScreen == 'function') {
+
+    // Seems to be broken in Chromium/Chrome && Safari in Leopard
+    if (/Android/.test(vjs.USER_AGENT) || !/Chrome|Mac OS X 10.5/.test(vjs.USER_AGENT)) {
+      return true;
+    }
+  }
+  return false;
+};
+
+vjs.Html5.prototype.enterFullScreen = function(){
+  var video = this.el_;
+  if (video.paused && video.networkState <= video.HAVE_METADATA) {
+    // attempt to prime the video element for programmatic access
+    // this isn't necessary on the desktop but shouldn't hurt
+    this.el_.play();
+
+    // playing and pausing synchronously during the transition to fullscreen
+    // can get iOS ~6.1 devices into a play/pause loop
+    setTimeout(function(){
+      video.pause();
+      video.webkitEnterFullScreen();
+    }, 0);
+  } else {
+    video.webkitEnterFullScreen();
+  }
+};
+vjs.Html5.prototype.exitFullScreen = function(){
+  this.el_.webkitExitFullScreen();
+};
+vjs.Html5.prototype.src = function(src){ this.el_.src = src; };
+vjs.Html5.prototype.load = function(){ this.el_.load(); };
+vjs.Html5.prototype.currentSrc = function(){ return this.el_.currentSrc; };
+
+vjs.Html5.prototype.preload = function(){ return this.el_.preload; };
+vjs.Html5.prototype.setPreload = function(val){ this.el_.preload = val; };
+
+vjs.Html5.prototype.autoplay = function(){ return this.el_.autoplay; };
+vjs.Html5.prototype.setAutoplay = function(val){ this.el_.autoplay = val; };
+
+vjs.Html5.prototype.controls = function(){ return this.el_.controls; }
+vjs.Html5.prototype.setControls = function(val){ this.el_.controls = !!val; }
+
+vjs.Html5.prototype.loop = function(){ return this.el_.loop; };
+vjs.Html5.prototype.setLoop = function(val){ this.el_.loop = val; };
+
+vjs.Html5.prototype.error = function(){ return this.el_.error; };
+vjs.Html5.prototype.seeking = function(){ return this.el_.seeking; };
+vjs.Html5.prototype.ended = function(){ return this.el_.ended; };
+vjs.Html5.prototype.defaultMuted = function(){ return this.el_.defaultMuted; };
+
+/* HTML5 Support Testing ---------------------------------------------------- */
+
+vjs.Html5.isSupported = function(){
+  return !!vjs.TEST_VID.canPlayType;
+};
+
+vjs.Html5.canPlaySource = function(srcObj){
+  // IE9 on Windows 7 without MediaPlayer throws an error here
+  // https://github.com/videojs/video.js/issues/519
+  try {
+    return !!vjs.TEST_VID.canPlayType(srcObj.type);
+  } catch(e) {
+    return '';
+  }
+  // TODO: Check Type
+  // If no Type, check ext
+  // Check Media Type
+};
+
+vjs.Html5.canControlVolume = function(){
+  var volume =  vjs.TEST_VID.volume;
+  vjs.TEST_VID.volume = (volume / 2) + 0.1;
+  return volume !== vjs.TEST_VID.volume;
+};
+
+// List of all HTML5 events (various uses).
+vjs.Html5.Events = 'loadstart,suspend,abort,error,emptied,stalled,loadedmetadata,loadeddata,canplay,canplaythrough,playing,waiting,seeking,seeked,ended,durationchange,timeupdate,progress,play,pause,ratechange,volumechange'.split(',');
+
+vjs.Html5.disposeMediaElement = function(el){
+  if (!el) { return; }
+
+  el['player'] = null;
+
+  if (el.parentNode) {
+    el.parentNode.removeChild(el);
+  }
+
+  // remove any child track or source nodes to prevent their loading
+  while(el.hasChildNodes()) {
+    el.removeChild(el.firstChild);
+  }
+
+  // remove any src reference. not setting `src=''` because that causes a warning
+  // in firefox
+  el.removeAttribute('src');
+
+  // force the media element to update its loading state by calling load()
+  if (typeof el.load === 'function') {
+    el.load();
+  }
+};
+
+// HTML5 Feature detection and Device Fixes --------------------------------- //
+
+  // Override Android 2.2 and less canPlayType method which is broken
+if (vjs.IS_OLD_ANDROID) {
+  document.createElement('video').constructor.prototype.canPlayType = function(type){
+    return (type && type.toLowerCase().indexOf('video/mp4') != -1) ? 'maybe' : '';
+  };
+}
+/**
+ * @fileoverview VideoJS-SWF - Custom Flash Player with HTML5-ish API
+ * https://github.com/zencoder/video-js-swf
+ * Not using setupTriggers. Using global onEvent func to distribute events
+ */
+
+/**
+ * Flash Media Controller - Wrapper for fallback SWF API
+ *
+ * @param {vjs.Player} player
+ * @param {Object=} options
+ * @param {Function=} ready
+ * @constructor
+ */
+vjs.Flash = vjs.MediaTechController.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.MediaTechController.call(this, player, options, ready);
+
+    var source = options['source'],
+
+        // Which element to embed in
+        parentEl = options['parentEl'],
+
+        // Create a temporary element to be replaced by swf object
+        placeHolder = this.el_ = vjs.createEl('div', { id: player.id() + '_temp_flash' }),
+
+        // Generate ID for swf object
+        objId = player.id()+'_flash_api',
+
+        // Store player options in local var for optimization
+        // TODO: switch to using player methods instead of options
+        // e.g. player.autoplay();
+        playerOptions = player.options_,
+
+        // Merge default flashvars with ones passed in to init
+        flashVars = vjs.obj.merge({
+
+          // SWF Callback Functions
+          'readyFunction': 'videojs.Flash.onReady',
+          'eventProxyFunction': 'videojs.Flash.onEvent',
+          'errorEventProxyFunction': 'videojs.Flash.onError',
+
+          // Player Settings
+          'autoplay': playerOptions.autoplay,
+          'preload': playerOptions.preload,
+          'loop': playerOptions.loop,
+          'muted': playerOptions.muted
+
+        }, options['flashVars']),
+
+        // Merge default parames with ones passed in
+        params = vjs.obj.merge({
+          'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance
+          'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading
+        }, options['params']),
+
+        // Merge default attributes with ones passed in
+        attributes = vjs.obj.merge({
+          'id': objId,
+          'name': objId, // Both ID and Name needed or swf to identifty itself
+          'class': 'vjs-tech'
+        }, options['attributes'])
+    ;
+
+    // If source was supplied pass as a flash var.
+    if (source) {
+      if (source.type && vjs.Flash.isStreamingType(source.type)) {
+        var parts = vjs.Flash.streamToParts(source.src);
+        flashVars['rtmpConnection'] = encodeURIComponent(parts.connection);
+        flashVars['rtmpStream'] = encodeURIComponent(parts.stream);
+      }
+      else {
+        flashVars['src'] = encodeURIComponent(vjs.getAbsoluteURL(source.src));
+      }
+    }
+
+    // Add placeholder to player div
+    vjs.insertFirst(placeHolder, parentEl);
+
+    // Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers
+    // This allows resetting the playhead when we catch the reload
+    if (options['startTime']) {
+      this.ready(function(){
+        this.load();
+        this.play();
+        this.currentTime(options['startTime']);
+      });
+    }
+
+    // Flash iFrame Mode
+    // In web browsers there are multiple instances where changing the parent element or visibility of a plugin causes the plugin to reload.
+    // - Firefox just about always. https://bugzilla.mozilla.org/show_bug.cgi?id=90268 (might be fixed by version 13)
+    // - Webkit when hiding the plugin
+    // - Webkit and Firefox when using requestFullScreen on a parent element
+    // Loading the flash plugin into a dynamically generated iFrame gets around most of these issues.
+    // Issues that remain include hiding the element and requestFullScreen in Firefox specifically
+
+    // There's on particularly annoying issue with this method which is that Firefox throws a security error on an offsite Flash object loaded into a dynamically created iFrame.
+    // Even though the iframe was inserted into a page on the web, Firefox + Flash considers it a local app trying to access an internet file.
+    // I tried mulitple ways of setting the iframe src attribute but couldn't find a src that worked well. Tried a real/fake source, in/out of domain.
+    // Also tried a method from stackoverflow that caused a security error in all browsers. http://stackoverflow.com/questions/2486901/how-to-set-document-domain-for-a-dynamically-generated-iframe
+    // In the end the solution I found to work was setting the iframe window.location.href right before doing a document.write of the Flash object.
+    // The only downside of this it seems to trigger another http request to the original page (no matter what's put in the href). Not sure why that is.
+
+    // NOTE (2012-01-29): Cannot get Firefox to load the remote hosted SWF into a dynamically created iFrame
+    // Firefox 9 throws a security error, unleess you call location.href right before doc.write.
+    //    Not sure why that even works, but it causes the browser to look like it's continuously trying to load the page.
+    // Firefox 3.6 keeps calling the iframe onload function anytime I write to it, causing an endless loop.
+
+    if (options['iFrameMode'] === true && !vjs.IS_FIREFOX) {
+
+      // Create iFrame with vjs-tech class so it's 100% width/height
+      var iFrm = vjs.createEl('iframe', {
+        'id': objId + '_iframe',
+        'name': objId + '_iframe',
+        'className': 'vjs-tech',
+        'scrolling': 'no',
+        'marginWidth': 0,
+        'marginHeight': 0,
+        'frameBorder': 0
+      });
+
+      // Update ready function names in flash vars for iframe window
+      flashVars['readyFunction'] = 'ready';
+      flashVars['eventProxyFunction'] = 'events';
+      flashVars['errorEventProxyFunction'] = 'errors';
+
+      // Tried multiple methods to get this to work in all browsers
+
+      // Tried embedding the flash object in the page first, and then adding a place holder to the iframe, then replacing the placeholder with the page object.
+      // The goal here was to try to load the swf URL in the parent page first and hope that got around the firefox security error
+      // var newObj = vjs.Flash.embed(options['swf'], placeHolder, flashVars, params, attributes);
+      // (in onload)
+      //  var temp = vjs.createEl('a', { id:'asdf', innerHTML: 'asdf' } );
+      //  iDoc.body.appendChild(temp);
+
+      // Tried embedding the flash object through javascript in the iframe source.
+      // This works in webkit but still triggers the firefox security error
+      // iFrm.src = 'javascript: document.write('"+vjs.Flash.getEmbedCode(options['swf'], flashVars, params, attributes)+"');";
+
+      // Tried an actual local iframe just to make sure that works, but it kills the easiness of the CDN version if you require the user to host an iframe
+      // We should add an option to host the iframe locally though, because it could help a lot of issues.
+      // iFrm.src = "iframe.html";
+
+      // Wait until iFrame has loaded to write into it.
+      vjs.on(iFrm, 'load', vjs.bind(this, function(){
+
+        var iDoc,
+            iWin = iFrm.contentWindow;
+
+        // The one working method I found was to use the iframe's document.write() to create the swf object
+        // This got around the security issue in all browsers except firefox.
+        // I did find a hack where if I call the iframe's window.location.href='', it would get around the security error
+        // However, the main page would look like it was loading indefinitely (URL bar loading spinner would never stop)
+        // Plus Firefox 3.6 didn't work no matter what I tried.
+        // if (vjs.USER_AGENT.match('Firefox')) {
+        //   iWin.location.href = '';
+        // }
+
+        // Get the iFrame's document depending on what the browser supports
+        iDoc = iFrm.contentDocument ? iFrm.contentDocument : iFrm.contentWindow.document;
+
+        // Tried ensuring both document domains were the same, but they already were, so that wasn't the issue.
+        // Even tried adding /. that was mentioned in a browser security writeup
+        // document.domain = document.domain+'/.';
+        // iDoc.domain = document.domain+'/.';
+
+        // Tried adding the object to the iframe doc's innerHTML. Security error in all browsers.
+        // iDoc.body.innerHTML = swfObjectHTML;
+
+        // Tried appending the object to the iframe doc's body. Security error in all browsers.
+        // iDoc.body.appendChild(swfObject);
+
+        // Using document.write actually got around the security error that browsers were throwing.
+        // Again, it's a dynamically generated (same domain) iframe, loading an external Flash swf.
+        // Not sure why that's a security issue, but apparently it is.
+        iDoc.write(vjs.Flash.getEmbedCode(options['swf'], flashVars, params, attributes));
+
+        // Setting variables on the window needs to come after the doc write because otherwise they can get reset in some browsers
+        // So far no issues with swf ready event being called before it's set on the window.
+        iWin['player'] = this.player_;
+
+        // Create swf ready function for iFrame window
+        iWin['ready'] = vjs.bind(this.player_, function(currSwf){
+          var el = iDoc.getElementById(currSwf),
+              player = this,
+              tech = player.tech;
+
+          // Update reference to playback technology element
+          tech.el_ = el;
+
+          // Make sure swf is actually ready. Sometimes the API isn't actually yet.
+          vjs.Flash.checkReady(tech);
+        });
+
+        // Create event listener for all swf events
+        iWin['events'] = vjs.bind(this.player_, function(swfID, eventName){
+          var player = this;
+          if (player && player.techName === 'flash') {
+            player.trigger(eventName);
+          }
+        });
+
+        // Create error listener for all swf errors
+        iWin['errors'] = vjs.bind(this.player_, function(swfID, eventName){
+          vjs.log('Flash Error', eventName);
+        });
+
+      }));
+
+      // Replace placeholder with iFrame (it will load now)
+      placeHolder.parentNode.replaceChild(iFrm, placeHolder);
+
+    // If not using iFrame mode, embed as normal object
+    } else {
+      vjs.Flash.embed(options['swf'], placeHolder, flashVars, params, attributes);
+    }
+  }
+});
+
+vjs.Flash.prototype.dispose = function(){
+  vjs.MediaTechController.prototype.dispose.call(this);
+};
+
+vjs.Flash.prototype.play = function(){
+  this.el_.vjs_play();
+};
+
+vjs.Flash.prototype.pause = function(){
+  this.el_.vjs_pause();
+};
+
+vjs.Flash.prototype.src = function(src){
+  if (vjs.Flash.isStreamingSrc(src)) {
+    src = vjs.Flash.streamToParts(src);
+    this.setRtmpConnection(src.connection);
+    this.setRtmpStream(src.stream);
+  }
+  else {
+    // Make sure source URL is abosolute.
+    src = vjs.getAbsoluteURL(src);
+    this.el_.vjs_src(src);
+  }
+
+  // Currently the SWF doesn't autoplay if you load a source later.
+  // e.g. Load player w/ no source, wait 2s, set src.
+  if (this.player_.autoplay()) {
+    var tech = this;
+    setTimeout(function(){ tech.play(); }, 0);
+  }
+};
+
+vjs.Flash.prototype.currentSrc = function(){
+  var src = this.el_.vjs_getProperty('currentSrc');
+  // no src, check and see if RTMP
+  if (src == null) {
+    var connection = this.rtmpConnection(),
+        stream = this.rtmpStream();
+
+    if (connection && stream) {
+      src = vjs.Flash.streamFromParts(connection, stream);
+    }
+  }
+  return src;
+};
+
+vjs.Flash.prototype.load = function(){
+  this.el_.vjs_load();
+};
+
+vjs.Flash.prototype.poster = function(){
+  this.el_.vjs_getProperty('poster');
+};
+
+vjs.Flash.prototype.buffered = function(){
+  return vjs.createTimeRange(0, this.el_.vjs_getProperty('buffered'));
+};
+
+vjs.Flash.prototype.supportsFullScreen = function(){
+  return false; // Flash does not allow fullscreen through javascript
+};
+
+vjs.Flash.prototype.enterFullScreen = function(){
+  return false;
+};
+
+
+// Create setters and getters for attributes
+var api = vjs.Flash.prototype,
+    readWrite = 'rtmpConnection,rtmpStream,preload,currentTime,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted'.split(','),
+    readOnly = 'error,currentSrc,networkState,readyState,seeking,initialTime,duration,startOffsetTime,paused,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks'.split(',');
+    // Overridden: buffered
+
+/**
+ * @this {*}
+ * @private
+ */
+var createSetter = function(attr){
+  var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);
+  api['set'+attrUpper] = function(val){ return this.el_.vjs_setProperty(attr, val); };
+};
+
+/**
+ * @this {*}
+ * @private
+ */
+var createGetter = function(attr){
+  api[attr] = function(){ return this.el_.vjs_getProperty(attr); };
+};
+
+(function(){
+  var i;
+  // Create getter and setters for all read/write attributes
+  for (i = 0; i < readWrite.length; i++) {
+    createGetter(readWrite[i]);
+    createSetter(readWrite[i]);
+  }
+
+  // Create getters for read-only attributes
+  for (i = 0; i < readOnly.length; i++) {
+    createGetter(readOnly[i]);
+  }
+})();
+
+/* Flash Support Testing -------------------------------------------------------- */
+
+vjs.Flash.isSupported = function(){
+  return vjs.Flash.version()[0] >= 10;
+  // return swfobject.hasFlashPlayerVersion('10');
+};
+
+vjs.Flash.canPlaySource = function(srcObj){
+  var type;
+
+  if (!srcObj.type) {
+    return '';
+  }
+
+  type = srcObj.type.replace(/;.*/,'').toLowerCase();
+  if (type in vjs.Flash.formats || type in vjs.Flash.streamingFormats) {
+    return 'maybe';
+  }
+};
+
+vjs.Flash.formats = {
+  'video/flv': 'FLV',
+  'video/x-flv': 'FLV',
+  'video/mp4': 'MP4',
+  'video/m4v': 'MP4'
+};
+
+vjs.Flash.streamingFormats = {
+  'rtmp/mp4': 'MP4',
+  'rtmp/flv': 'FLV'
+};
+
+vjs.Flash['onReady'] = function(currSwf){
+  var el = vjs.el(currSwf);
+
+  // Get player from box
+  // On firefox reloads, el might already have a player
+  var player = el['player'] || el.parentNode['player'],
+      tech = player.tech;
+
+  // Reference player on tech element
+  el['player'] = player;
+
+  // Update reference to playback technology element
+  tech.el_ = el;
+
+  vjs.Flash.checkReady(tech);
+};
+
+// The SWF isn't alwasy ready when it says it is. Sometimes the API functions still need to be added to the object.
+// If it's not ready, we set a timeout to check again shortly.
+vjs.Flash.checkReady = function(tech){
+
+  // Check if API property exists
+  if (tech.el().vjs_getProperty) {
+
+    // If so, tell tech it's ready
+    tech.triggerReady();
+
+  // Otherwise wait longer.
+  } else {
+
+    setTimeout(function(){
+      vjs.Flash.checkReady(tech);
+    }, 50);
+
+  }
+};
+
+// Trigger events from the swf on the player
+vjs.Flash['onEvent'] = function(swfID, eventName){
+  var player = vjs.el(swfID)['player'];
+  player.trigger(eventName);
+};
+
+// Log errors from the swf
+vjs.Flash['onError'] = function(swfID, err){
+  var player = vjs.el(swfID)['player'];
+  player.trigger('error');
+  vjs.log('Flash Error', err, swfID);
+};
+
+// Flash Version Check
+vjs.Flash.version = function(){
+  var version = '0,0,0';
+
+  // IE
+  try {
+    version = new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
+
+  // other browsers
+  } catch(e) {
+    try {
+      if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin){
+        version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
+      }
+    } catch(err) {}
+  }
+  return version.split(',');
+};
+
+// Flash embedding method. Only used in non-iframe mode
+vjs.Flash.embed = function(swf, placeHolder, flashVars, params, attributes){
+  var code = vjs.Flash.getEmbedCode(swf, flashVars, params, attributes),
+
+      // Get element by embedding code and retrieving created element
+      obj = vjs.createEl('div', { innerHTML: code }).childNodes[0],
+
+      par = placeHolder.parentNode
+  ;
+
+  placeHolder.parentNode.replaceChild(obj, placeHolder);
+
+  // IE6 seems to have an issue where it won't initialize the swf object after injecting it.
+  // This is a dumb fix
+  var newObj = par.childNodes[0];
+  setTimeout(function(){
+    newObj.style.display = 'block';
+  }, 1000);
+
+  return obj;
+
+};
+
+vjs.Flash.getEmbedCode = function(swf, flashVars, params, attributes){
+
+  var objTag = '<object type="application/x-shockwave-flash"',
+      flashVarsString = '',
+      paramsString = '',
+      attrsString = '';
+
+  // Convert flash vars to string
+  if (flashVars) {
+    vjs.obj.each(flashVars, function(key, val){
+      flashVarsString += (key + '=' + val + '&amp;');
+    });
+  }
+
+  // Add swf, flashVars, and other default params
+  params = vjs.obj.merge({
+    'movie': swf,
+    'flashvars': flashVarsString,
+    'allowScriptAccess': 'always', // Required to talk to swf
+    'allowNetworking': 'all' // All should be default, but having security issues.
+  }, params);
+
+  // Create param tags string
+  vjs.obj.each(params, function(key, val){
+    paramsString += '<param name="'+key+'" value="'+val+'" />';
+  });
+
+  attributes = vjs.obj.merge({
+    // Add swf to attributes (need both for IE and Others to work)
+    'data': swf,
+
+    // Default to 100% width/height
+    'width': '100%',
+    'height': '100%'
+
+  }, attributes);
+
+  // Create Attributes string
+  vjs.obj.each(attributes, function(key, val){
+    attrsString += (key + '="' + val + '" ');
+  });
+
+  return objTag + attrsString + '>' + paramsString + '</object>';
+};
+
+vjs.Flash.streamFromParts = function(connection, stream) {
+  return connection + '&' + stream;
+};
+
+vjs.Flash.streamToParts = function(src) {
+  var parts = {
+    connection: '',
+    stream: ''
+  };
+
+  if (! src) {
+    return parts;
+  }
+
+  // Look for the normal URL separator we expect, '&'.
+  // If found, we split the URL into two pieces around the
+  // first '&'.
+  var connEnd = src.indexOf('&');
+  var streamBegin;
+  if (connEnd !== -1) {
+    streamBegin = connEnd + 1;
+  }
+  else {
+    // If there's not a '&', we use the last '/' as the delimiter.
+    connEnd = streamBegin = src.lastIndexOf('/') + 1;
+    if (connEnd === 0) {
+      // really, there's not a '/'?
+      connEnd = streamBegin = src.length;
+    }
+  }
+  parts.connection = src.substring(0, connEnd);
+  parts.stream = src.substring(streamBegin, src.length);
+
+  return parts;
+};
+
+vjs.Flash.isStreamingType = function(srcType) {
+  return srcType in vjs.Flash.streamingFormats;
+};
+
+// RTMP has four variations, any string starting
+// with one of these protocols should be valid
+vjs.Flash.RTMP_RE = /^rtmp[set]?:\/\//i;
+
+vjs.Flash.isStreamingSrc = function(src) {
+  return vjs.Flash.RTMP_RE.test(src);
+};
+/**
+ * The Media Loader is the component that decides which playback technology to load
+ * when the player is initialized.
+ *
+ * @constructor
+ */
+vjs.MediaLoader = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.Component.call(this, player, options, ready);
+
+    // If there are no sources when the player is initialized,
+    // load the first supported playback technology.
+    if (!player.options_['sources'] || player.options_['sources'].length === 0) {
+      for (var i=0,j=player.options_['techOrder']; i<j.length; i++) {
+        var techName = vjs.capitalize(j[i]),
+            tech = window['videojs'][techName];
+
+        // Check if the browser supports this technology
+        if (tech && tech.isSupported()) {
+          player.loadTech(techName);
+          break;
+        }
+      }
+    } else {
+      // // Loop through playback technologies (HTML5, Flash) and check for support.
+      // // Then load the best source.
+      // // A few assumptions here:
+      // //   All playback technologies respect preload false.
+      player.src(player.options_['sources']);
+    }
+  }
+});
+/**
+ * @fileoverview Text Tracks
+ * Text tracks are tracks of timed text events.
+ * Captions - text displayed over the video for the hearing impared
+ * Subtitles - text displayed over the video for those who don't understand langauge in the video
+ * Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video
+ * Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device
+ */
+
+// Player Additions - Functions add to the player object for easier access to tracks
+
+/**
+ * List of associated text tracks
+ * @type {Array}
+ * @private
+ */
+vjs.Player.prototype.textTracks_;
+
+/**
+ * Get an array of associated text tracks. captions, subtitles, chapters, descriptions
+ * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks
+ * @return {Array}           Array of track objects
+ * @private
+ */
+vjs.Player.prototype.textTracks = function(){
+  this.textTracks_ = this.textTracks_ || [];
+  return this.textTracks_;
+};
+
+/**
+ * Add a text track
+ * In addition to the W3C settings we allow adding additional info through options.
+ * http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack
+ * @param {String}  kind        Captions, subtitles, chapters, descriptions, or metadata
+ * @param {String=} label       Optional label
+ * @param {String=} language    Optional language
+ * @param {Object=} options     Additional track options, like src
+ * @private
+ */
+vjs.Player.prototype.addTextTrack = function(kind, label, language, options){
+  var tracks = this.textTracks_ = this.textTracks_ || [];
+  options = options || {};
+
+  options['kind'] = kind;
+  options['label'] = label;
+  options['language'] = language;
+
+  // HTML5 Spec says default to subtitles.
+  // Uppercase first letter to match class names
+  var Kind = vjs.capitalize(kind || 'subtitles');
+
+  // Create correct texttrack class. CaptionsTrack, etc.
+  var track = new window['videojs'][Kind + 'Track'](this, options);
+
+  tracks.push(track);
+
+  // If track.dflt() is set, start showing immediately
+  // TODO: Add a process to deterime the best track to show for the specific kind
+  // Incase there are mulitple defaulted tracks of the same kind
+  // Or the user has a set preference of a specific language that should override the default
+  // if (track.dflt()) {
+  //   this.ready(vjs.bind(track, track.show));
+  // }
+
+  return track;
+};
+
+/**
+ * Add an array of text tracks. captions, subtitles, chapters, descriptions
+ * Track objects will be stored in the player.textTracks() array
+ * @param {Array} trackList Array of track elements or objects (fake track elements)
+ * @private
+ */
+vjs.Player.prototype.addTextTracks = function(trackList){
+  var trackObj;
+
+  for (var i = 0; i < trackList.length; i++) {
+    trackObj = trackList[i];
+    this.addTextTrack(trackObj['kind'], trackObj['label'], trackObj['language'], trackObj);
+  }
+
+  return this;
+};
+
+// Show a text track
+// disableSameKind: disable all other tracks of the same kind. Value should be a track kind (captions, etc.)
+vjs.Player.prototype.showTextTrack = function(id, disableSameKind){
+  var tracks = this.textTracks_,
+      i = 0,
+      j = tracks.length,
+      track, showTrack, kind;
+
+  // Find Track with same ID
+  for (;i<j;i++) {
+    track = tracks[i];
+    if (track.id() === id) {
+      track.show();
+      showTrack = track;
+
+    // Disable tracks of the same kind
+    } else if (disableSameKind && track.kind() == disableSameKind && track.mode() > 0) {
+      track.disable();
+    }
+  }
+
+  // Get track kind from shown track or disableSameKind
+  kind = (showTrack) ? showTrack.kind() : ((disableSameKind) ? disableSameKind : false);
+
+  // Trigger trackchange event, captionstrackchange, subtitlestrackchange, etc.
+  if (kind) {
+    this.trigger(kind+'trackchange');
+  }
+
+  return this;
+};
+
+/**
+ * The base class for all text tracks
+ *
+ * Handles the parsing, hiding, and showing of text track cues
+ *
+ * @param {vjs.Player|Object} player
+ * @param {Object=} options
+ * @constructor
+ */
+vjs.TextTrack = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.Component.call(this, player, options);
+
+    // Apply track info to track object
+    // Options will often be a track element
+
+    // Build ID if one doesn't exist
+    this.id_ = options['id'] || ('vjs_' + options['kind'] + '_' + options['language'] + '_' + vjs.guid++);
+    this.src_ = options['src'];
+    // 'default' is a reserved keyword in js so we use an abbreviated version
+    this.dflt_ = options['default'] || options['dflt'];
+    this.title_ = options['title'];
+    this.language_ = options['srclang'];
+    this.label_ = options['label'];
+    this.cues_ = [];
+    this.activeCues_ = [];
+    this.readyState_ = 0;
+    this.mode_ = 0;
+
+    this.player_.on('fullscreenchange', vjs.bind(this, this.adjustFontSize));
+  }
+});
+
+/**
+ * Track kind value. Captions, subtitles, etc.
+ * @private
+ */
+vjs.TextTrack.prototype.kind_;
+
+/**
+ * Get the track kind value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.kind = function(){
+  return this.kind_;
+};
+
+/**
+ * Track src value
+ * @private
+ */
+vjs.TextTrack.prototype.src_;
+
+/**
+ * Get the track src value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.src = function(){
+  return this.src_;
+};
+
+/**
+ * Track default value
+ * If default is used, subtitles/captions to start showing
+ * @private
+ */
+vjs.TextTrack.prototype.dflt_;
+
+/**
+ * Get the track default value. ('default' is a reserved keyword)
+ * @return {Boolean}
+ */
+vjs.TextTrack.prototype.dflt = function(){
+  return this.dflt_;
+};
+
+/**
+ * Track title value
+ * @private
+ */
+vjs.TextTrack.prototype.title_;
+
+/**
+ * Get the track title value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.title = function(){
+  return this.title_;
+};
+
+/**
+ * Language - two letter string to represent track language, e.g. 'en' for English
+ * Spec def: readonly attribute DOMString language;
+ * @private
+ */
+vjs.TextTrack.prototype.language_;
+
+/**
+ * Get the track language value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.language = function(){
+  return this.language_;
+};
+
+/**
+ * Track label e.g. 'English'
+ * Spec def: readonly attribute DOMString label;
+ * @private
+ */
+vjs.TextTrack.prototype.label_;
+
+/**
+ * Get the track label value
+ * @return {String}
+ */
+vjs.TextTrack.prototype.label = function(){
+  return this.label_;
+};
+
+/**
+ * All cues of the track. Cues have a startTime, endTime, text, and other properties.
+ * Spec def: readonly attribute TextTrackCueList cues;
+ * @private
+ */
+vjs.TextTrack.prototype.cues_;
+
+/**
+ * Get the track cues
+ * @return {Array}
+ */
+vjs.TextTrack.prototype.cues = function(){
+  return this.cues_;
+};
+
+/**
+ * ActiveCues is all cues that are currently showing
+ * Spec def: readonly attribute TextTrackCueList activeCues;
+ * @private
+ */
+vjs.TextTrack.prototype.activeCues_;
+
+/**
+ * Get the track active cues
+ * @return {Array}
+ */
+vjs.TextTrack.prototype.activeCues = function(){
+  return this.activeCues_;
+};
+
+/**
+ * ReadyState describes if the text file has been loaded
+ * const unsigned short NONE = 0;
+ * const unsigned short LOADING = 1;
+ * const unsigned short LOADED = 2;
+ * const unsigned short ERROR = 3;
+ * readonly attribute unsigned short readyState;
+ * @private
+ */
+vjs.TextTrack.prototype.readyState_;
+
+/**
+ * Get the track readyState
+ * @return {Number}
+ */
+vjs.TextTrack.prototype.readyState = function(){
+  return this.readyState_;
+};
+
+/**
+ * Mode describes if the track is showing, hidden, or disabled
+ * const unsigned short OFF = 0;
+ * const unsigned short HIDDEN = 1; (still triggering cuechange events, but not visible)
+ * const unsigned short SHOWING = 2;
+ * attribute unsigned short mode;
+ * @private
+ */
+vjs.TextTrack.prototype.mode_;
+
+/**
+ * Get the track mode
+ * @return {Number}
+ */
+vjs.TextTrack.prototype.mode = function(){
+  return this.mode_;
+};
+
+/**
+ * Change the font size of the text track to make it larger when playing in fullscreen mode
+ * and restore it to its normal size when not in fullscreen mode.
+ */
+vjs.TextTrack.prototype.adjustFontSize = function(){
+    if (this.player_.isFullScreen) {
+        // Scale the font by the same factor as increasing the video width to the full screen window width.
+        // Additionally, multiply that factor by 1.4, which is the default font size for
+        // the caption track (from the CSS)
+        this.el_.style.fontSize = screen.width / this.player_.width() * 1.4 * 100 + '%';
+    } else {
+        // Change the font size of the text track back to its original non-fullscreen size
+        this.el_.style.fontSize = '';
+    }
+};
+
+/**
+ * Create basic div to hold cue text
+ * @return {Element}
+ */
+vjs.TextTrack.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-' + this.kind_ + ' vjs-text-track'
+  });
+};
+
+/**
+ * Show: Mode Showing (2)
+ * Indicates that the text track is active. If no attempt has yet been made to obtain the track's cues, the user agent will perform such an attempt momentarily.
+ * The user agent is maintaining a list of which cues are active, and events are being fired accordingly.
+ * In addition, for text tracks whose kind is subtitles or captions, the cues are being displayed over the video as appropriate;
+ * for text tracks whose kind is descriptions, the user agent is making the cues available to the user in a non-visual fashion;
+ * and for text tracks whose kind is chapters, the user agent is making available to the user a mechanism by which the user can navigate to any point in the media resource by selecting a cue.
+ * The showing by default state is used in conjunction with the default attribute on track elements to indicate that the text track was enabled due to that attribute.
+ * This allows the user agent to override the state if a later track is discovered that is more appropriate per the user's preferences.
+ */
+vjs.TextTrack.prototype.show = function(){
+  this.activate();
+
+  this.mode_ = 2;
+
+  // Show element.
+  vjs.Component.prototype.show.call(this);
+};
+
+/**
+ * Hide: Mode Hidden (1)
+ * Indicates that the text track is active, but that the user agent is not actively displaying the cues.
+ * If no attempt has yet been made to obtain the track's cues, the user agent will perform such an attempt momentarily.
+ * The user agent is maintaining a list of which cues are active, and events are being fired accordingly.
+ */
+vjs.TextTrack.prototype.hide = function(){
+  // When hidden, cues are still triggered. Disable to stop triggering.
+  this.activate();
+
+  this.mode_ = 1;
+
+  // Hide element.
+  vjs.Component.prototype.hide.call(this);
+};
+
+/**
+ * Disable: Mode Off/Disable (0)
+ * Indicates that the text track is not active. Other than for the purposes of exposing the track in the DOM, the user agent is ignoring the text track.
+ * No cues are active, no events are fired, and the user agent will not attempt to obtain the track's cues.
+ */
+vjs.TextTrack.prototype.disable = function(){
+  // If showing, hide.
+  if (this.mode_ == 2) { this.hide(); }
+
+  // Stop triggering cues
+  this.deactivate();
+
+  // Switch Mode to Off
+  this.mode_ = 0;
+};
+
+/**
+ * Turn on cue tracking. Tracks that are showing OR hidden are active.
+ */
+vjs.TextTrack.prototype.activate = function(){
+  // Load text file if it hasn't been yet.
+  if (this.readyState_ === 0) { this.load(); }
+
+  // Only activate if not already active.
+  if (this.mode_ === 0) {
+    // Update current cue on timeupdate
+    // Using unique ID for bind function so other tracks don't remove listener
+    this.player_.on('timeupdate', vjs.bind(this, this.update, this.id_));
+
+    // Reset cue time on media end
+    this.player_.on('ended', vjs.bind(this, this.reset, this.id_));
+
+    // Add to display
+    if (this.kind_ === 'captions' || this.kind_ === 'subtitles') {
+      this.player_.getChild('textTrackDisplay').addChild(this);
+    }
+  }
+};
+
+/**
+ * Turn off cue tracking.
+ */
+vjs.TextTrack.prototype.deactivate = function(){
+  // Using unique ID for bind function so other tracks don't remove listener
+  this.player_.off('timeupdate', vjs.bind(this, this.update, this.id_));
+  this.player_.off('ended', vjs.bind(this, this.reset, this.id_));
+  this.reset(); // Reset
+
+  // Remove from display
+  this.player_.getChild('textTrackDisplay').removeChild(this);
+};
+
+// A readiness state
+// One of the following:
+//
+// Not loaded
+// Indicates that the text track is known to exist (e.g. it has been declared with a track element), but its cues have not been obtained.
+//
+// Loading
+// Indicates that the text track is loading and there have been no fatal errors encountered so far. Further cues might still be added to the track.
+//
+// Loaded
+// Indicates that the text track has been loaded with no fatal errors. No new cues will be added to the track except if the text track corresponds to a MutableTextTrack object.
+//
+// Failed to load
+// Indicates that the text track was enabled, but when the user agent attempted to obtain it, this failed in some way (e.g. URL could not be resolved, network error, unknown text track format). Some or all of the cues are likely missing and will not be obtained.
+vjs.TextTrack.prototype.load = function(){
+
+  // Only load if not loaded yet.
+  if (this.readyState_ === 0) {
+    this.readyState_ = 1;
+    vjs.get(this.src_, vjs.bind(this, this.parseCues), vjs.bind(this, this.onError));
+  }
+
+};
+
+vjs.TextTrack.prototype.onError = function(err){
+  this.error = err;
+  this.readyState_ = 3;
+  this.trigger('error');
+};
+
+// Parse the WebVTT text format for cue times.
+// TODO: Separate parser into own class so alternative timed text formats can be used. (TTML, DFXP)
+vjs.TextTrack.prototype.parseCues = function(srcContent) {
+  var cue, time, text,
+      lines = srcContent.split('\n'),
+      line = '', id;
+
+  for (var i=1, j=lines.length; i<j; i++) {
+    // Line 0 should be 'WEBVTT', so skipping i=0
+
+    line = vjs.trim(lines[i]); // Trim whitespace and linebreaks
+
+    if (line) { // Loop until a line with content
+
+      // First line could be an optional cue ID
+      // Check if line has the time separator
+      if (line.indexOf('-->') == -1) {
+        id = line;
+        // Advance to next line for timing.
+        line = vjs.trim(lines[++i]);
+      } else {
+        id = this.cues_.length;
+      }
+
+      // First line - Number
+      cue = {
+        id: id, // Cue Number
+        index: this.cues_.length // Position in Array
+      };
+
+      // Timing line
+      time = line.split(' --> ');
+      cue.startTime = this.parseCueTime(time[0]);
+      cue.endTime = this.parseCueTime(time[1]);
+
+      // Additional lines - Cue Text
+      text = [];
+
+      // Loop until a blank line or end of lines
+      // Assumeing trim('') returns false for blank lines
+      while (lines[++i] && (line = vjs.trim(lines[i]))) {
+        text.push(line);
+      }
+
+      cue.text = text.join('<br/>');
+
+      // Add this cue
+      this.cues_.push(cue);
+    }
+  }
+
+  this.readyState_ = 2;
+  this.trigger('loaded');
+};
+
+
+vjs.TextTrack.prototype.parseCueTime = function(timeText) {
+  var parts = timeText.split(':'),
+      time = 0,
+      hours, minutes, other, seconds, ms;
+
+  // Check if optional hours place is included
+  // 00:00:00.000 vs. 00:00.000
+  if (parts.length == 3) {
+    hours = parts[0];
+    minutes = parts[1];
+    other = parts[2];
+  } else {
+    hours = 0;
+    minutes = parts[0];
+    other = parts[1];
+  }
+
+  // Break other (seconds, milliseconds, and flags) by spaces
+  // TODO: Make additional cue layout settings work with flags
+  other = other.split(/\s+/);
+  // Remove seconds. Seconds is the first part before any spaces.
+  seconds = other.splice(0,1)[0];
+  // Could use either . or , for decimal
+  seconds = seconds.split(/\.|,/);
+  // Get milliseconds
+  ms = parseFloat(seconds[1]);
+  seconds = seconds[0];
+
+  // hours => seconds
+  time += parseFloat(hours) * 3600;
+  // minutes => seconds
+  time += parseFloat(minutes) * 60;
+  // Add seconds
+  time += parseFloat(seconds);
+  // Add milliseconds
+  if (ms) { time += ms/1000; }
+
+  return time;
+};
+
+// Update active cues whenever timeupdate events are triggered on the player.
+vjs.TextTrack.prototype.update = function(){
+  if (this.cues_.length > 0) {
+
+    // Get curent player time
+    var time = this.player_.currentTime();
+
+    // Check if the new time is outside the time box created by the the last update.
+    if (this.prevChange === undefined || time < this.prevChange || this.nextChange <= time) {
+      var cues = this.cues_,
+
+          // Create a new time box for this state.
+          newNextChange = this.player_.duration(), // Start at beginning of the timeline
+          newPrevChange = 0, // Start at end
+
+          reverse = false, // Set the direction of the loop through the cues. Optimized the cue check.
+          newCues = [], // Store new active cues.
+
+          // Store where in the loop the current active cues are, to provide a smart starting point for the next loop.
+          firstActiveIndex, lastActiveIndex,
+          cue, i; // Loop vars
+
+      // Check if time is going forwards or backwards (scrubbing/rewinding)
+      // If we know the direction we can optimize the starting position and direction of the loop through the cues array.
+      if (time >= this.nextChange || this.nextChange === undefined) { // NextChange should happen
+        // Forwards, so start at the index of the first active cue and loop forward
+        i = (this.firstActiveIndex !== undefined) ? this.firstActiveIndex : 0;
+      } else {
+        // Backwards, so start at the index of the last active cue and loop backward
+        reverse = true;
+        i = (this.lastActiveIndex !== undefined) ? this.lastActiveIndex : cues.length - 1;
+      }
+
+      while (true) { // Loop until broken
+        cue = cues[i];
+
+        // Cue ended at this point
+        if (cue.endTime <= time) {
+          newPrevChange = Math.max(newPrevChange, cue.endTime);
+
+          if (cue.active) {
+            cue.active = false;
+          }
+
+          // No earlier cues should have an active start time.
+          // Nevermind. Assume first cue could have a duration the same as the video.
+          // In that case we need to loop all the way back to the beginning.
+          // if (reverse && cue.startTime) { break; }
+
+        // Cue hasn't started
+        } else if (time < cue.startTime) {
+          newNextChange = Math.min(newNextChange, cue.startTime);
+
+          if (cue.active) {
+            cue.active = false;
+          }
+
+          // No later cues should have an active start time.
+          if (!reverse) { break; }
+
+        // Cue is current
+        } else {
+
+          if (reverse) {
+            // Add cue to front of array to keep in time order
+            newCues.splice(0,0,cue);
+
+            // If in reverse, the first current cue is our lastActiveCue
+            if (lastActiveIndex === undefined) { lastActiveIndex = i; }
+            firstActiveIndex = i;
+          } else {
+            // Add cue to end of array
+            newCues.push(cue);
+
+            // If forward, the first current cue is our firstActiveIndex
+            if (firstActiveIndex === undefined) { firstActiveIndex = i; }
+            lastActiveIndex = i;
+          }
+
+          newNextChange = Math.min(newNextChange, cue.endTime);
+          newPrevChange = Math.max(newPrevChange, cue.startTime);
+
+          cue.active = true;
+        }
+
+        if (reverse) {
+          // Reverse down the array of cues, break if at first
+          if (i === 0) { break; } else { i--; }
+        } else {
+          // Walk up the array fo cues, break if at last
+          if (i === cues.length - 1) { break; } else { i++; }
+        }
+
+      }
+
+      this.activeCues_ = newCues;
+      this.nextChange = newNextChange;
+      this.prevChange = newPrevChange;
+      this.firstActiveIndex = firstActiveIndex;
+      this.lastActiveIndex = lastActiveIndex;
+
+      this.updateDisplay();
+
+      this.trigger('cuechange');
+    }
+  }
+};
+
+// Add cue HTML to display
+vjs.TextTrack.prototype.updateDisplay = function(){
+  var cues = this.activeCues_,
+      html = '',
+      i=0,j=cues.length;
+
+  for (;i<j;i++) {
+    html += '<span class="vjs-tt-cue">'+cues[i].text+'</span>';
+  }
+
+  this.el_.innerHTML = html;
+};
+
+// Set all loop helper values back
+vjs.TextTrack.prototype.reset = function(){
+  this.nextChange = 0;
+  this.prevChange = this.player_.duration();
+  this.firstActiveIndex = 0;
+  this.lastActiveIndex = 0;
+};
+
+// Create specific track types
+/**
+ * The track component for managing the hiding and showing of captions
+ *
+ * @constructor
+ */
+vjs.CaptionsTrack = vjs.TextTrack.extend();
+vjs.CaptionsTrack.prototype.kind_ = 'captions';
+// Exporting here because Track creation requires the track kind
+// to be available on global object. e.g. new window['videojs'][Kind + 'Track']
+
+/**
+ * The track component for managing the hiding and showing of subtitles
+ *
+ * @constructor
+ */
+vjs.SubtitlesTrack = vjs.TextTrack.extend();
+vjs.SubtitlesTrack.prototype.kind_ = 'subtitles';
+
+/**
+ * The track component for managing the hiding and showing of chapters
+ *
+ * @constructor
+ */
+vjs.ChaptersTrack = vjs.TextTrack.extend();
+vjs.ChaptersTrack.prototype.kind_ = 'chapters';
+
+
+/* Text Track Display
+============================================================================= */
+// Global container for both subtitle and captions text. Simple div container.
+
+/**
+ * The component for displaying text track cues
+ *
+ * @constructor
+ */
+vjs.TextTrackDisplay = vjs.Component.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.Component.call(this, player, options, ready);
+
+    // This used to be called during player init, but was causing an error
+    // if a track should show by default and the display hadn't loaded yet.
+    // Should probably be moved to an external track loader when we support
+    // tracks that don't need a display.
+    if (player.options_['tracks'] && player.options_['tracks'].length > 0) {
+      this.player_.addTextTracks(player.options_['tracks']);
+    }
+  }
+});
+
+vjs.TextTrackDisplay.prototype.createEl = function(){
+  return vjs.Component.prototype.createEl.call(this, 'div', {
+    className: 'vjs-text-track-display'
+  });
+};
+
+
+/**
+ * The specific menu item type for selecting a language within a text track kind
+ *
+ * @constructor
+ */
+vjs.TextTrackMenuItem = vjs.MenuItem.extend({
+  /** @constructor */
+  init: function(player, options){
+    var track = this.track = options['track'];
+
+    // Modify options for parent MenuItem class's init.
+    options['label'] = track.label();
+    options['selected'] = track.dflt();
+    vjs.MenuItem.call(this, player, options);
+
+    this.player_.on(track.kind() + 'trackchange', vjs.bind(this, this.update));
+  }
+});
+
+vjs.TextTrackMenuItem.prototype.onClick = function(){
+  vjs.MenuItem.prototype.onClick.call(this);
+  this.player_.showTextTrack(this.track.id_, this.track.kind());
+};
+
+vjs.TextTrackMenuItem.prototype.update = function(){
+  this.selected(this.track.mode() == 2);
+};
+
+/**
+ * A special menu item for turning of a specific type of text track
+ *
+ * @constructor
+ */
+vjs.OffTextTrackMenuItem = vjs.TextTrackMenuItem.extend({
+  /** @constructor */
+  init: function(player, options){
+    // Create pseudo track info
+    // Requires options['kind']
+    options['track'] = {
+      kind: function() { return options['kind']; },
+      player: player,
+      label: function(){ return options['kind'] + ' off'; },
+      dflt: function(){ return false; },
+      mode: function(){ return false; }
+    };
+    vjs.TextTrackMenuItem.call(this, player, options);
+    this.selected(true);
+  }
+});
+
+vjs.OffTextTrackMenuItem.prototype.onClick = function(){
+  vjs.TextTrackMenuItem.prototype.onClick.call(this);
+  this.player_.showTextTrack(this.track.id_, this.track.kind());
+};
+
+vjs.OffTextTrackMenuItem.prototype.update = function(){
+  var tracks = this.player_.textTracks(),
+      i=0, j=tracks.length, track,
+      off = true;
+
+  for (;i<j;i++) {
+    track = tracks[i];
+    if (track.kind() == this.track.kind() && track.mode() == 2) {
+      off = false;
+    }
+  }
+
+  this.selected(off);
+};
+
+/**
+ * The base class for buttons that toggle specific text track types (e.g. subtitles)
+ *
+ * @constructor
+ */
+vjs.TextTrackButton = vjs.MenuButton.extend({
+  /** @constructor */
+  init: function(player, options){
+    vjs.MenuButton.call(this, player, options);
+
+    if (this.items.length <= 1) {
+      this.hide();
+    }
+  }
+});
+
+// vjs.TextTrackButton.prototype.buttonPressed = false;
+
+// vjs.TextTrackButton.prototype.createMenu = function(){
+//   var menu = new vjs.Menu(this.player_);
+
+//   // Add a title list item to the top
+//   // menu.el().appendChild(vjs.createEl('li', {
+//   //   className: 'vjs-menu-title',
+//   //   innerHTML: vjs.capitalize(this.kind_),
+//   //   tabindex: -1
+//   // }));
+
+//   this.items = this.createItems();
+
+//   // Add menu items to the menu
+//   for (var i = 0; i < this.items.length; i++) {
+//     menu.addItem(this.items[i]);
+//   }
+
+//   // Add list to element
+//   this.addChild(menu);
+
+//   return menu;
+// };
+
+// Create a menu item for each text track
+vjs.TextTrackButton.prototype.createItems = function(){
+  var items = [], track;
+
+  // Add an OFF menu item to turn all tracks off
+  items.push(new vjs.OffTextTrackMenuItem(this.player_, { 'kind': this.kind_ }));
+
+  for (var i = 0; i < this.player_.textTracks().length; i++) {
+    track = this.player_.textTracks()[i];
+    if (track.kind() === this.kind_) {
+      items.push(new vjs.TextTrackMenuItem(this.player_, {
+        'track': track
+      }));
+    }
+  }
+
+  return items;
+};
+
+/**
+ * The button component for toggling and selecting captions
+ *
+ * @constructor
+ */
+vjs.CaptionsButton = vjs.TextTrackButton.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.TextTrackButton.call(this, player, options, ready);
+    this.el_.setAttribute('aria-label','Captions Menu');
+  }
+});
+vjs.CaptionsButton.prototype.kind_ = 'captions';
+vjs.CaptionsButton.prototype.buttonText = 'Captions';
+vjs.CaptionsButton.prototype.className = 'vjs-captions-button';
+
+/**
+ * The button component for toggling and selecting subtitles
+ *
+ * @constructor
+ */
+vjs.SubtitlesButton = vjs.TextTrackButton.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.TextTrackButton.call(this, player, options, ready);
+    this.el_.setAttribute('aria-label','Subtitles Menu');
+  }
+});
+vjs.SubtitlesButton.prototype.kind_ = 'subtitles';
+vjs.SubtitlesButton.prototype.buttonText = 'Subtitles';
+vjs.SubtitlesButton.prototype.className = 'vjs-subtitles-button';
+
+// Chapters act much differently than other text tracks
+// Cues are navigation vs. other tracks of alternative languages
+/**
+ * The button component for toggling and selecting chapters
+ *
+ * @constructor
+ */
+vjs.ChaptersButton = vjs.TextTrackButton.extend({
+  /** @constructor */
+  init: function(player, options, ready){
+    vjs.TextTrackButton.call(this, player, options, ready);
+    this.el_.setAttribute('aria-label','Chapters Menu');
+  }
+});
+vjs.ChaptersButton.prototype.kind_ = 'chapters';
+vjs.ChaptersButton.prototype.buttonText = 'Chapters';
+vjs.ChaptersButton.prototype.className = 'vjs-chapters-button';
+
+// Create a menu item for each text track
+vjs.ChaptersButton.prototype.createItems = function(){
+  var items = [], track;
+
+  for (var i = 0; i < this.player_.textTracks().length; i++) {
+    track = this.player_.textTracks()[i];
+    if (track.kind() === this.kind_) {
+      items.push(new vjs.TextTrackMenuItem(this.player_, {
+        'track': track
+      }));
+    }
+  }
+
+  return items;
+};
+
+vjs.ChaptersButton.prototype.createMenu = function(){
+  var tracks = this.player_.textTracks(),
+      i = 0,
+      j = tracks.length,
+      track, chaptersTrack,
+      items = this.items = [];
+
+  for (;i<j;i++) {
+    track = tracks[i];
+    if (track.kind() == this.kind_ && track.dflt()) {
+      if (track.readyState() < 2) {
+        this.chaptersTrack = track;
+        track.on('loaded', vjs.bind(this, this.createMenu));
+        return;
+      } else {
+        chaptersTrack = track;
+        break;
+      }
+    }
+  }
+
+  var menu = this.menu = new vjs.Menu(this.player_);
+
+  menu.el_.appendChild(vjs.createEl('li', {
+    className: 'vjs-menu-title',
+    innerHTML: vjs.capitalize(this.kind_),
+    tabindex: -1
+  }));
+
+  if (chaptersTrack) {
+    var cues = chaptersTrack.cues_, cue, mi;
+    i = 0;
+    j = cues.length;
+
+    for (;i<j;i++) {
+      cue = cues[i];
+
+      mi = new vjs.ChaptersTrackMenuItem(this.player_, {
+        'track': chaptersTrack,
+        'cue': cue
+      });
+
+      items.push(mi);
+
+      menu.addChild(mi);
+    }
+  }
+
+  if (this.items.length > 0) {
+    this.show();
+  }
+
+  return menu;
+};
+
+
+/**
+ * @constructor
+ */
+vjs.ChaptersTrackMenuItem = vjs.MenuItem.extend({
+  /** @constructor */
+  init: function(player, options){
+    var track = this.track = options['track'],
+        cue = this.cue = options['cue'],
+        currentTime = player.currentTime();
+
+    // Modify options for parent MenuItem class's init.
+    options['label'] = cue.text;
+    options['selected'] = (cue.startTime <= currentTime && currentTime < cue.endTime);
+    vjs.MenuItem.call(this, player, options);
+
+    track.on('cuechange', vjs.bind(this, this.update));
+  }
+});
+
+vjs.ChaptersTrackMenuItem.prototype.onClick = function(){
+  vjs.MenuItem.prototype.onClick.call(this);
+  this.player_.currentTime(this.cue.startTime);
+  this.update(this.cue.startTime);
+};
+
+vjs.ChaptersTrackMenuItem.prototype.update = function(){
+  var cue = this.cue,
+      currentTime = this.player_.currentTime();
+
+  // vjs.log(currentTime, cue.startTime);
+  this.selected(cue.startTime <= currentTime && currentTime < cue.endTime);
+};
+
+// Add Buttons to controlBar
+vjs.obj.merge(vjs.ControlBar.prototype.options_['children'], {
+  'subtitlesButton': {},
+  'captionsButton': {},
+  'chaptersButton': {}
+});
+
+// vjs.Cue = vjs.Component.extend({
+//   /** @constructor */
+//   init: function(player, options){
+//     vjs.Component.call(this, player, options);
+//   }
+// });
+/**
+ * @fileoverview Add JSON support
+ * @suppress {undefinedVars}
+ * (Compiler doesn't like JSON not being declared)
+ */
+
+/**
+ * Javascript JSON implementation
+ * (Parse Method Only)
+ * https://github.com/douglascrockford/JSON-js/blob/master/json2.js
+ * Only using for parse method when parsing data-setup attribute JSON.
+ * @suppress {undefinedVars}
+ * @namespace
+ * @private
+ */
+vjs.JSON;
+
+if (typeof window.JSON !== 'undefined' && window.JSON.parse === 'function') {
+  vjs.JSON = window.JSON;
+
+} else {
+  vjs.JSON = {};
+
+  var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+
+  /**
+   * parse the json
+   *
+   * @memberof vjs.JSON
+   * @return {Object|Array} The parsed JSON
+   */
+  vjs.JSON.parse = function (text, reviver) {
+      var j;
+
+      function walk(holder, key) {
+          var k, v, value = holder[key];
+          if (value && typeof value === 'object') {
+              for (k in value) {
+                  if (Object.prototype.hasOwnProperty.call(value, k)) {
+                      v = walk(value, k);
+                      if (v !== undefined) {
+                          value[k] = v;
+                      } else {
+                          delete value[k];
+                      }
+                  }
+              }
+          }
+          return reviver.call(holder, key, value);
+      }
+      text = String(text);
+      cx.lastIndex = 0;
+      if (cx.test(text)) {
+          text = text.replace(cx, function (a) {
+              return '\\u' +
+                  ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+          });
+      }
+
+      if (/^[\],:{}\s]*$/
+              .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
+                  .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
+                  .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+
+          j = eval('(' + text + ')');
+
+          return typeof reviver === 'function' ?
+              walk({'': j}, '') : j;
+      }
+
+      throw new SyntaxError('JSON.parse(): invalid or malformed JSON data');
+  };
+}
+/**
+ * @fileoverview Functions for automatically setting up a player
+ * based on the data-setup attribute of the video tag
+ */
+
+// Automatically set up any tags that have a data-setup attribute
+vjs.autoSetup = function(){
+  var options, vid, player,
+      vids = document.getElementsByTagName('video');
+
+  // Check if any media elements exist
+  if (vids && vids.length > 0) {
+
+    for (var i=0,j=vids.length; i<j; i++) {
+      vid = vids[i];
+
+      // Check if element exists, has getAttribute func.
+      // IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.
+      if (vid && vid.getAttribute) {
+
+        // Make sure this player hasn't already been set up.
+        if (vid['player'] === undefined) {
+          options = vid.getAttribute('data-setup');
+
+          // Check if data-setup attr exists.
+          // We only auto-setup if they've added the data-setup attr.
+          if (options !== null) {
+
+            // Parse options JSON
+            // If empty string, make it a parsable json object.
+            options = vjs.JSON.parse(options || '{}');
+
+            // Create new video.js instance.
+            player = videojs(vid, options);
+          }
+        }
+
+      // If getAttribute isn't defined, we need to wait for the DOM.
+      } else {
+        vjs.autoSetupTimeout(1);
+        break;
+      }
+    }
+
+  // No videos were found, so keep looping unless page is finisehd loading.
+  } else if (!vjs.windowLoaded) {
+    vjs.autoSetupTimeout(1);
+  }
+};
+
+// Pause to let the DOM keep processing
+vjs.autoSetupTimeout = function(wait){
+  setTimeout(vjs.autoSetup, wait);
+};
+
+if (document.readyState === 'complete') {
+  vjs.windowLoaded = true;
+} else {
+  vjs.one(window, 'load', function(){
+    vjs.windowLoaded = true;
+  });
+}
+
+// Run Auto-load players
+// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)
+vjs.autoSetupTimeout(1);
+/**
+ * the method for registering a video.js plugin
+ *
+ * @param  {String} name The name of the plugin
+ * @param  {Function} init The function that is run when the player inits
+ */
+vjs.plugin = function(name, init){
+  vjs.Player.prototype[name] = init;
+};
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video.js
new file mode 100644
index 0000000..01e5bc8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/video-js/video.js
@@ -0,0 +1,129 @@
+/*! Video.js v4.3.0 Copyright 2013 Brightcove, Inc. https://github.com/videojs/video.js/blob/master/LICENSE */ (function() {var b=void 0,f=!0,h=null,l=!1;function m(){return function(){}}function p(a){return function(){return this[a]}}function s(a){return function(){return a}}var t;document.createElement("video");document.createElement("audio");document.createElement("track");function u(a,c,d){if("string"===typeof a){0===a.indexOf("#")&&(a=a.slice(1));if(u.xa[a])return u.xa[a];a=u.w(a)}if(!a||!a.nodeName)throw new TypeError("The element or ID supplied is not valid. (videojs)");return a.player||new u.s(a,c,d)}var v=u;
+window.Td=window.Ud=u;u.Tb="4.3";u.Fc="https:"==document.location.protocol?"https://":"http://";u.options={techOrder:["html5","flash"],html5:{},flash:{},width:300,height:150,defaultVolume:0,children:{mediaLoader:{},posterImage:{},textTrackDisplay:{},loadingSpinner:{},bigPlayButton:{},controlBar:{}},notSupportedMessage:'Sorry, no compatible source and playback technology were found for this video. Try using another browser like <a href="http://bit.ly/ccMUEC">Chrome</a> or download the latest <a href="http://adobe.ly/mwfN1">Adobe Flash Player</a>.'};
+"GENERATED_CDN_VSN"!==u.Tb&&(v.options.flash.swf=u.Fc+"vjs.zencdn.net/"+u.Tb+"/video-js.swf");u.xa={};u.la=u.CoreObject=m();u.la.extend=function(a){var c,d;a=a||{};c=a.init||a.i||this.prototype.init||this.prototype.i||m();d=function(){c.apply(this,arguments)};d.prototype=u.k.create(this.prototype);d.prototype.constructor=d;d.extend=u.la.extend;d.create=u.la.create;for(var e in a)a.hasOwnProperty(e)&&(d.prototype[e]=a[e]);return d};
+u.la.create=function(){var a=u.k.create(this.prototype);this.apply(a,arguments);return a};u.d=function(a,c,d){var e=u.getData(a);e.z||(e.z={});e.z[c]||(e.z[c]=[]);d.t||(d.t=u.t++);e.z[c].push(d);e.W||(e.disabled=l,e.W=function(c){if(!e.disabled){c=u.kc(c);var d=e.z[c.type];if(d)for(var d=d.slice(0),k=0,q=d.length;k<q&&!c.pc();k++)d[k].call(a,c)}});1==e.z[c].length&&(document.addEventListener?a.addEventListener(c,e.W,l):document.attachEvent&&a.attachEvent("on"+c,e.W))};
+u.o=function(a,c,d){if(u.oc(a)){var e=u.getData(a);if(e.z)if(c){var g=e.z[c];if(g){if(d){if(d.t)for(e=0;e<g.length;e++)g[e].t===d.t&&g.splice(e--,1)}else e.z[c]=[];u.gc(a,c)}}else for(g in e.z)c=g,e.z[c]=[],u.gc(a,c)}};u.gc=function(a,c){var d=u.getData(a);0===d.z[c].length&&(delete d.z[c],document.removeEventListener?a.removeEventListener(c,d.W,l):document.detachEvent&&a.detachEvent("on"+c,d.W));u.Bb(d.z)&&(delete d.z,delete d.W,delete d.disabled);u.Bb(d)&&u.vc(a)};
+u.kc=function(a){function c(){return f}function d(){return l}if(!a||!a.Cb){var e=a||window.event;a={};for(var g in e)"layerX"!==g&&"layerY"!==g&&(a[g]=e[g]);a.target||(a.target=a.srcElement||document);a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;a.preventDefault=function(){e.preventDefault&&e.preventDefault();a.returnValue=l;a.Ab=c};a.Ab=d;a.stopPropagation=function(){e.stopPropagation&&e.stopPropagation();a.cancelBubble=f;a.Cb=c};a.Cb=d;a.stopImmediatePropagation=function(){e.stopImmediatePropagation&&
+e.stopImmediatePropagation();a.pc=c;a.stopPropagation()};a.pc=d;if(a.clientX!=h){g=document.documentElement;var j=document.body;a.pageX=a.clientX+(g&&g.scrollLeft||j&&j.scrollLeft||0)-(g&&g.clientLeft||j&&j.clientLeft||0);a.pageY=a.clientY+(g&&g.scrollTop||j&&j.scrollTop||0)-(g&&g.clientTop||j&&j.clientTop||0)}a.which=a.charCode||a.keyCode;a.button!=h&&(a.button=a.button&1?0:a.button&4?1:a.button&2?2:0)}return a};
+u.j=function(a,c){var d=u.oc(a)?u.getData(a):{},e=a.parentNode||a.ownerDocument;"string"===typeof c&&(c={type:c,target:a});c=u.kc(c);d.W&&d.W.call(a,c);if(e&&!c.Cb()&&c.bubbles!==l)u.j(e,c);else if(!e&&!c.Ab()&&(d=u.getData(c.target),c.target[c.type])){d.disabled=f;if("function"===typeof c.target[c.type])c.target[c.type]();d.disabled=l}return!c.Ab()};u.U=function(a,c,d){function e(){u.o(a,c,e);d.apply(this,arguments)}e.t=d.t=d.t||u.t++;u.d(a,c,e)};var w=Object.prototype.hasOwnProperty;
+u.e=function(a,c){var d,e;d=document.createElement(a||"div");for(e in c)w.call(c,e)&&(-1!==e.indexOf("aria-")||"role"==e?d.setAttribute(e,c[e]):d[e]=c[e]);return d};u.$=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};u.k={};u.k.create=Object.create||function(a){function c(){}c.prototype=a;return new c};u.k.ua=function(a,c,d){for(var e in a)w.call(a,e)&&c.call(d||this,e,a[e])};u.k.B=function(a,c){if(!c)return a;for(var d in c)w.call(c,d)&&(a[d]=c[d]);return a};
+u.k.ic=function(a,c){var d,e,g;a=u.k.copy(a);for(d in c)w.call(c,d)&&(e=a[d],g=c[d],a[d]=u.k.qc(e)&&u.k.qc(g)?u.k.ic(e,g):c[d]);return a};u.k.copy=function(a){return u.k.B({},a)};u.k.qc=function(a){return!!a&&"object"===typeof a&&"[object Object]"===a.toString()&&a.constructor===Object};u.bind=function(a,c,d){function e(){return c.apply(a,arguments)}c.t||(c.t=u.t++);e.t=d?d+"_"+c.t:c.t;return e};u.ra={};u.t=1;u.expando="vdata"+(new Date).getTime();
+u.getData=function(a){var c=a[u.expando];c||(c=a[u.expando]=u.t++,u.ra[c]={});return u.ra[c]};u.oc=function(a){a=a[u.expando];return!(!a||u.Bb(u.ra[a]))};u.vc=function(a){var c=a[u.expando];if(c){delete u.ra[c];try{delete a[u.expando]}catch(d){a.removeAttribute?a.removeAttribute(u.expando):a[u.expando]=h}}};u.Bb=function(a){for(var c in a)if(a[c]!==h)return l;return f};u.n=function(a,c){-1==(" "+a.className+" ").indexOf(" "+c+" ")&&(a.className=""===a.className?c:a.className+" "+c)};
+u.u=function(a,c){var d,e;if(-1!=a.className.indexOf(c)){d=a.className.split(" ");for(e=d.length-1;0<=e;e--)d[e]===c&&d.splice(e,1);a.className=d.join(" ")}};u.na=u.e("video");u.F=navigator.userAgent;u.Mc=/iPhone/i.test(u.F);u.Lc=/iPad/i.test(u.F);u.Nc=/iPod/i.test(u.F);u.Kc=u.Mc||u.Lc||u.Nc;var aa=u,x;var y=u.F.match(/OS (\d+)_/i);x=y&&y[1]?y[1]:b;aa.Fd=x;u.Ic=/Android/i.test(u.F);var ba=u,z;var A=u.F.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),B,C;
+A?(B=A[1]&&parseFloat(A[1]),C=A[2]&&parseFloat(A[2]),z=B&&C?parseFloat(A[1]+"."+A[2]):B?B:h):z=h;ba.Gc=z;u.Oc=u.Ic&&/webkit/i.test(u.F)&&2.3>u.Gc;u.Jc=/Firefox/i.test(u.F);u.Gd=/Chrome/i.test(u.F);u.ac=!!("ontouchstart"in window||window.Hc&&document instanceof window.Hc);
+u.xb=function(a){var c,d,e,g;c={};if(a&&a.attributes&&0<a.attributes.length){d=a.attributes;for(var j=d.length-1;0<=j;j--){e=d[j].name;g=d[j].value;if("boolean"===typeof a[e]||-1!==",autoplay,controls,loop,muted,default,".indexOf(","+e+","))g=g!==h?f:l;c[e]=g}}return c};
+u.Kd=function(a,c){var d="";document.defaultView&&document.defaultView.getComputedStyle?d=document.defaultView.getComputedStyle(a,"").getPropertyValue(c):a.currentStyle&&(d=a["client"+c.substr(0,1).toUpperCase()+c.substr(1)]+"px");return d};u.zb=function(a,c){c.firstChild?c.insertBefore(a,c.firstChild):c.appendChild(a)};u.Pb={};u.w=function(a){0===a.indexOf("#")&&(a=a.slice(1));return document.getElementById(a)};
+u.La=function(a,c){c=c||a;var d=Math.floor(a%60),e=Math.floor(a/60%60),g=Math.floor(a/3600),j=Math.floor(c/60%60),k=Math.floor(c/3600);if(isNaN(a)||Infinity===a)g=e=d="-";g=0<g||0<k?g+":":"";return g+(((g||10<=j)&&10>e?"0"+e:e)+":")+(10>d?"0"+d:d)};u.Tc=function(){document.body.focus();document.onselectstart=s(l)};u.Bd=function(){document.onselectstart=s(f)};u.trim=function(a){return(a+"").replace(/^\s+|\s+$/g,"")};u.round=function(a,c){c||(c=0);return Math.round(a*Math.pow(10,c))/Math.pow(10,c)};
+u.tb=function(a,c){return{length:1,start:function(){return a},end:function(){return c}}};
+u.get=function(a,c,d){var e,g;"undefined"===typeof XMLHttpRequest&&(window.XMLHttpRequest=function(){try{return new window.ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(a){}try{return new window.ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(c){}try{return new window.ActiveXObject("Msxml2.XMLHTTP")}catch(d){}throw Error("This browser does not support XMLHttpRequest.");});g=new XMLHttpRequest;try{g.open("GET",a)}catch(j){d(j)}e=0===a.indexOf("file:")||0===window.location.href.indexOf("file:")&&-1===a.indexOf("http");
+g.onreadystatechange=function(){4===g.readyState&&(200===g.status||e&&0===g.status?c(g.responseText):d&&d())};try{g.send()}catch(k){d&&d(k)}};u.td=function(a){try{var c=window.localStorage||l;c&&(c.volume=a)}catch(d){22==d.code||1014==d.code?u.log("LocalStorage Full (VideoJS)",d):18==d.code?u.log("LocalStorage not allowed (VideoJS)",d):u.log("LocalStorage Error (VideoJS)",d)}};u.mc=function(a){a.match(/^https?:\/\//)||(a=u.e("div",{innerHTML:'<a href="'+a+'">x</a>'}).firstChild.href);return a};
+u.log=function(){u.log.history=u.log.history||[];u.log.history.push(arguments);window.console&&window.console.log(Array.prototype.slice.call(arguments))};u.ad=function(a){var c,d;a.getBoundingClientRect&&a.parentNode&&(c=a.getBoundingClientRect());if(!c)return{left:0,top:0};a=document.documentElement;d=document.body;return{left:c.left+(window.pageXOffset||d.scrollLeft)-(a.clientLeft||d.clientLeft||0),top:c.top+(window.pageYOffset||d.scrollTop)-(a.clientTop||d.clientTop||0)}};
+u.c=u.la.extend({i:function(a,c,d){this.b=a;this.g=u.k.copy(this.g);c=this.options(c);this.Q=c.id||(c.el&&c.el.id?c.el.id:a.id()+"_component_"+u.t++);this.gd=c.name||h;this.a=c.el||this.e();this.G=[];this.qb={};this.V={};if((a=this.g)&&a.children){var e=this;u.k.ua(a.children,function(a,c){c!==l&&!c.loadEvent&&(e[a]=e.Z(a,c))})}this.L(d)}});t=u.c.prototype;
+t.D=function(){this.j("dispose");if(this.G)for(var a=this.G.length-1;0<=a;a--)this.G[a].D&&this.G[a].D();this.V=this.qb=this.G=h;this.o();this.a.parentNode&&this.a.parentNode.removeChild(this.a);u.vc(this.a);this.a=h};t.b=f;t.K=p("b");t.options=function(a){return a===b?this.g:this.g=u.k.ic(this.g,a)};t.e=function(a,c){return u.e(a,c)};t.w=p("a");t.id=p("Q");t.name=p("gd");t.children=p("G");
+t.Z=function(a,c){var d,e;"string"===typeof a?(e=a,c=c||{},d=c.componentClass||u.$(e),c.name=e,d=new window.videojs[d](this.b||this,c)):d=a;this.G.push(d);"function"===typeof d.id&&(this.qb[d.id()]=d);(e=e||d.name&&d.name())&&(this.V[e]=d);"function"===typeof d.el&&d.el()&&(this.sa||this.a).appendChild(d.el());return d};
+t.removeChild=function(a){"string"===typeof a&&(a=this.V[a]);if(a&&this.G){for(var c=l,d=this.G.length-1;0<=d;d--)if(this.G[d]===a){c=f;this.G.splice(d,1);break}c&&(this.qb[a.id]=h,this.V[a.name]=h,(c=a.w())&&c.parentNode===(this.sa||this.a)&&(this.sa||this.a).removeChild(a.w()))}};t.T=s("");t.d=function(a,c){u.d(this.a,a,u.bind(this,c));return this};t.o=function(a,c){u.o(this.a,a,c);return this};t.U=function(a,c){u.U(this.a,a,u.bind(this,c));return this};t.j=function(a,c){u.j(this.a,a,c);return this};
+t.L=function(a){a&&(this.aa?a.call(this):(this.Sa===b&&(this.Sa=[]),this.Sa.push(a)));return this};t.Ua=function(){this.aa=f;var a=this.Sa;if(a&&0<a.length){for(var c=0,d=a.length;c<d;c++)a[c].call(this);this.Sa=[];this.j("ready")}};t.n=function(a){u.n(this.a,a);return this};t.u=function(a){u.u(this.a,a);return this};t.show=function(){this.a.style.display="block";return this};t.C=function(){this.a.style.display="none";return this};function D(a){a.u("vjs-lock-showing")}
+t.disable=function(){this.C();this.show=m()};t.width=function(a,c){return E(this,"width",a,c)};t.height=function(a,c){return E(this,"height",a,c)};t.Xc=function(a,c){return this.width(a,f).height(c)};function E(a,c,d,e){if(d!==b)return a.a.style[c]=-1!==(""+d).indexOf("%")||-1!==(""+d).indexOf("px")?d:"auto"===d?"":d+"px",e||a.j("resize"),a;if(!a.a)return 0;d=a.a.style[c];e=d.indexOf("px");return-1!==e?parseInt(d.slice(0,e),10):parseInt(a.a["offset"+u.$(c)],10)}
+u.q=u.c.extend({i:function(a,c){u.c.call(this,a,c);var d=l;this.d("touchstart",function(a){a.preventDefault();d=f});this.d("touchmove",function(){d=l});var e=this;this.d("touchend",function(a){d&&e.p(a);a.preventDefault()});this.d("click",this.p);this.d("focus",this.Oa);this.d("blur",this.Na)}});t=u.q.prototype;
+t.e=function(a,c){c=u.k.B({className:this.T(),innerHTML:'<div class="vjs-control-content"><span class="vjs-control-text">'+(this.qa||"Need Text")+"</span></div>",qd:"button","aria-live":"polite",tabIndex:0},c);return u.c.prototype.e.call(this,a,c)};t.T=function(){return"vjs-control "+u.c.prototype.T.call(this)};t.p=m();t.Oa=function(){u.d(document,"keyup",u.bind(this,this.ba))};t.ba=function(a){if(32==a.which||13==a.which)a.preventDefault(),this.p()};
+t.Na=function(){u.o(document,"keyup",u.bind(this,this.ba))};u.O=u.c.extend({i:function(a,c){u.c.call(this,a,c);this.Sc=this.V[this.g.barName];this.handle=this.V[this.g.handleName];a.d(this.tc,u.bind(this,this.update));this.d("mousedown",this.Pa);this.d("touchstart",this.Pa);this.d("focus",this.Oa);this.d("blur",this.Na);this.d("click",this.p);this.b.d("controlsvisible",u.bind(this,this.update));a.L(u.bind(this,this.update));this.P={}}});t=u.O.prototype;
+t.e=function(a,c){c=c||{};c.className+=" vjs-slider";c=u.k.B({qd:"slider","aria-valuenow":0,"aria-valuemin":0,"aria-valuemax":100,tabIndex:0},c);return u.c.prototype.e.call(this,a,c)};t.Pa=function(a){a.preventDefault();u.Tc();this.P.move=u.bind(this,this.Hb);this.P.end=u.bind(this,this.Ib);u.d(document,"mousemove",this.P.move);u.d(document,"mouseup",this.P.end);u.d(document,"touchmove",this.P.move);u.d(document,"touchend",this.P.end);this.Hb(a)};
+t.Ib=function(){u.Bd();u.o(document,"mousemove",this.P.move,l);u.o(document,"mouseup",this.P.end,l);u.o(document,"touchmove",this.P.move,l);u.o(document,"touchend",this.P.end,l);this.update()};t.update=function(){if(this.a){var a,c=this.yb(),d=this.handle,e=this.Sc;isNaN(c)&&(c=0);a=c;if(d){a=this.a.offsetWidth;var g=d.w().offsetWidth;a=g?g/a:0;c*=1-a;a=c+a/2;d.w().style.left=u.round(100*c,2)+"%"}e.w().style.width=u.round(100*a,2)+"%"}};
+function F(a,c){var d,e,g,j;d=a.a;e=u.ad(d);j=g=d.offsetWidth;d=a.handle;if(a.g.Cd)return j=e.top,e=c.changedTouches?c.changedTouches[0].pageY:c.pageY,d&&(d=d.w().offsetHeight,j+=d/2,g-=d),Math.max(0,Math.min(1,(j-e+g)/g));g=e.left;e=c.changedTouches?c.changedTouches[0].pageX:c.pageX;d&&(d=d.w().offsetWidth,g+=d/2,j-=d);return Math.max(0,Math.min(1,(e-g)/j))}t.Oa=function(){u.d(document,"keyup",u.bind(this,this.ba))};
+t.ba=function(a){37==a.which?(a.preventDefault(),this.yc()):39==a.which&&(a.preventDefault(),this.zc())};t.Na=function(){u.o(document,"keyup",u.bind(this,this.ba))};t.p=function(a){a.stopImmediatePropagation();a.preventDefault()};u.ea=u.c.extend();u.ea.prototype.defaultValue=0;u.ea.prototype.e=function(a,c){c=c||{};c.className+=" vjs-slider-handle";c=u.k.B({innerHTML:'<span class="vjs-control-text">'+this.defaultValue+"</span>"},c);return u.c.prototype.e.call(this,"div",c)};u.ma=u.c.extend();
+function ca(a,c){a.Z(c);c.d("click",u.bind(a,function(){D(this)}))}u.ma.prototype.e=function(){var a=this.options().Vc||"ul";this.sa=u.e(a,{className:"vjs-menu-content"});a=u.c.prototype.e.call(this,"div",{append:this.sa,className:"vjs-menu"});a.appendChild(this.sa);u.d(a,"click",function(a){a.preventDefault();a.stopImmediatePropagation()});return a};u.N=u.q.extend({i:function(a,c){u.q.call(this,a,c);this.selected(c.selected)}});
+u.N.prototype.e=function(a,c){return u.q.prototype.e.call(this,"li",u.k.B({className:"vjs-menu-item",innerHTML:this.g.label},c))};u.N.prototype.p=function(){this.selected(f)};u.N.prototype.selected=function(a){a?(this.n("vjs-selected"),this.a.setAttribute("aria-selected",f)):(this.u("vjs-selected"),this.a.setAttribute("aria-selected",l))};
+u.R=u.q.extend({i:function(a,c){u.q.call(this,a,c);this.wa=this.Ka();this.Z(this.wa);this.I&&0===this.I.length&&this.C();this.d("keyup",this.ba);this.a.setAttribute("aria-haspopup",f);this.a.setAttribute("role","button")}});t=u.R.prototype;t.pa=l;t.Ka=function(){var a=new u.ma(this.b);this.options().title&&a.w().appendChild(u.e("li",{className:"vjs-menu-title",innerHTML:u.$(this.A),zd:-1}));if(this.I=this.createItems())for(var c=0;c<this.I.length;c++)ca(a,this.I[c]);return a};t.ta=m();
+t.T=function(){return this.className+" vjs-menu-button "+u.q.prototype.T.call(this)};t.Oa=m();t.Na=m();t.p=function(){this.U("mouseout",u.bind(this,function(){D(this.wa);this.a.blur()}));this.pa?G(this):H(this)};t.ba=function(a){a.preventDefault();32==a.which||13==a.which?this.pa?G(this):H(this):27==a.which&&this.pa&&G(this)};function H(a){a.pa=f;a.wa.n("vjs-lock-showing");a.a.setAttribute("aria-pressed",f);a.I&&0<a.I.length&&a.I[0].w().focus()}
+function G(a){a.pa=l;D(a.wa);a.a.setAttribute("aria-pressed",l)}
+u.s=u.c.extend({i:function(a,c,d){this.M=a;c=u.k.B(da(a),c);this.v={};this.uc=c.poster;this.sb=c.controls;a.controls=l;u.c.call(this,this,c,d);this.controls()?this.n("vjs-controls-enabled"):this.n("vjs-controls-disabled");this.U("play",function(a){u.j(this.a,{type:"firstplay",target:this.a})||(a.preventDefault(),a.stopPropagation(),a.stopImmediatePropagation())});this.d("ended",this.hd);this.d("play",this.Kb);this.d("firstplay",this.jd);this.d("pause",this.Jb);this.d("progress",this.ld);this.d("durationchange",
+this.sc);this.d("error",this.Gb);this.d("fullscreenchange",this.kd);u.xa[this.Q]=this;c.plugins&&u.k.ua(c.plugins,function(a,c){this[a](c)},this);var e,g,j,k;e=this.Mb;a=function(){e();clearInterval(g);g=setInterval(u.bind(this,e),250)};c=function(){e();clearInterval(g)};this.d("mousedown",a);this.d("mousemove",e);this.d("mouseup",c);this.d("keydown",e);this.d("keyup",e);this.d("touchstart",a);this.d("touchmove",e);this.d("touchend",c);this.d("touchcancel",c);j=setInterval(u.bind(this,function(){this.ka&&
+(this.ka=l,this.ja(f),clearTimeout(k),k=setTimeout(u.bind(this,function(){this.ka||this.ja(l)}),2E3))}),250);this.d("dispose",function(){clearInterval(j);clearTimeout(k)})}});t=u.s.prototype;t.g=u.options;t.D=function(){this.j("dispose");this.o("dispose");u.xa[this.Q]=h;this.M&&this.M.player&&(this.M.player=h);this.a&&this.a.player&&(this.a.player=h);clearInterval(this.Ra);this.za();this.h&&this.h.D();u.c.prototype.D.call(this)};
+function da(a){var c={sources:[],tracks:[]};u.k.B(c,u.xb(a));if(a.hasChildNodes()){var d,e,g,j;a=a.childNodes;g=0;for(j=a.length;g<j;g++)d=a[g],e=d.nodeName.toLowerCase(),"source"===e?c.sources.push(u.xb(d)):"track"===e&&c.tracks.push(u.xb(d))}return c}
+t.e=function(){var a=this.a=u.c.prototype.e.call(this,"div"),c=this.M;c.removeAttribute("width");c.removeAttribute("height");if(c.hasChildNodes()){var d,e,g,j,k;d=c.childNodes;e=d.length;for(k=[];e--;)g=d[e],j=g.nodeName.toLowerCase(),"track"===j&&k.push(g);for(d=0;d<k.length;d++)c.removeChild(k[d])}c.id=c.id||"vjs_video_"+u.t++;a.id=c.id;a.className=c.className;c.id+="_html5_api";c.className="vjs-tech";c.player=a.player=this;this.n("vjs-paused");this.width(this.g.width,f);this.height(this.g.height,
+f);c.parentNode&&c.parentNode.insertBefore(a,c);u.zb(c,a);return a};
+function I(a,c,d){a.h?(a.aa=l,a.h.D(),a.Eb&&(a.Eb=l,clearInterval(a.Ra)),a.Fb&&J(a),a.h=l):"Html5"!==c&&a.M&&(u.l.jc(a.M),a.M=h);a.ia=c;a.aa=l;var e=u.k.B({source:d,parentEl:a.a},a.g[c.toLowerCase()]);d&&(d.src==a.v.src&&0<a.v.currentTime&&(e.startTime=a.v.currentTime),a.v.src=d.src);a.h=new window.videojs[c](a,e);a.h.L(function(){this.b.Ua();if(!this.m.progressEvents){var a=this.b;a.Eb=f;a.Ra=setInterval(u.bind(a,function(){this.v.lb<this.buffered().end(0)?this.j("progress"):1==this.Ja()&&(clearInterval(this.Ra),
+this.j("progress"))}),500);a.h.U("progress",function(){this.m.progressEvents=f;var a=this.b;a.Eb=l;clearInterval(a.Ra)})}this.m.timeupdateEvents||(a=this.b,a.Fb=f,a.d("play",a.Cc),a.d("pause",a.za),a.h.U("timeupdate",function(){this.m.timeupdateEvents=f;J(this.b)}))})}function J(a){a.Fb=l;a.za();a.o("play",a.Cc);a.o("pause",a.za)}t.Cc=function(){this.hc&&this.za();this.hc=setInterval(u.bind(this,function(){this.j("timeupdate")}),250)};t.za=function(){clearInterval(this.hc)};
+t.Kb=function(){u.u(this.a,"vjs-paused");u.n(this.a,"vjs-playing")};t.jd=function(){this.g.starttime&&this.currentTime(this.g.starttime);this.n("vjs-has-started")};t.Jb=function(){u.u(this.a,"vjs-playing");u.n(this.a,"vjs-paused")};t.ld=function(){1==this.Ja()&&this.j("loadedalldata")};t.hd=function(){this.g.loop&&(this.currentTime(0),this.play())};t.sc=function(){this.duration(K(this,"duration"))};t.kd=function(){this.H?this.n("vjs-fullscreen"):this.u("vjs-fullscreen")};
+t.Gb=function(a){u.log("Video Error",a)};function L(a,c,d){if(a.h&&!a.h.aa)a.h.L(function(){this[c](d)});else try{a.h[c](d)}catch(e){throw u.log(e),e;}}function K(a,c){if(a.h&&a.h.aa)try{return a.h[c]()}catch(d){throw a.h[c]===b?u.log("Video.js: "+c+" method not defined for "+a.ia+" playback technology.",d):"TypeError"==d.name?(u.log("Video.js: "+c+" unavailable on "+a.ia+" playback technology element.",d),a.h.aa=l):u.log(d),d;}}t.play=function(){L(this,"play");return this};
+t.pause=function(){L(this,"pause");return this};t.paused=function(){return K(this,"paused")===l?l:f};t.currentTime=function(a){return a!==b?(this.v.rc=a,L(this,"setCurrentTime",a),this.Fb&&this.j("timeupdate"),this):this.v.currentTime=K(this,"currentTime")||0};t.duration=function(a){if(a!==b)return this.v.duration=parseFloat(a),this;this.v.duration===b&&this.sc();return this.v.duration};
+t.buffered=function(){var a=K(this,"buffered"),c=a.length-1,d=this.v.lb=this.v.lb||0;a&&(0<=c&&a.end(c)!==d)&&(d=a.end(c),this.v.lb=d);return u.tb(0,d)};t.Ja=function(){return this.duration()?this.buffered().end(0)/this.duration():0};t.volume=function(a){if(a!==b)return a=Math.max(0,Math.min(1,parseFloat(a))),this.v.volume=a,L(this,"setVolume",a),u.td(a),this;a=parseFloat(K(this,"volume"));return isNaN(a)?1:a};t.muted=function(a){return a!==b?(L(this,"setMuted",a),this):K(this,"muted")||l};
+t.Ta=function(){return K(this,"supportsFullScreen")||l};
+t.ya=function(){var a=u.Pb.ya;this.H=f;a?(u.d(document,a.vb,u.bind(this,function(c){this.H=document[a.H];this.H===l&&u.o(document,a.vb,arguments.callee);this.j("fullscreenchange")})),this.a[a.wc]()):this.h.Ta()?L(this,"enterFullScreen"):(this.cd=f,this.Yc=document.documentElement.style.overflow,u.d(document,"keydown",u.bind(this,this.lc)),document.documentElement.style.overflow="hidden",u.n(document.body,"vjs-full-window"),this.j("enterFullWindow"),this.j("fullscreenchange"));return this};
+t.ob=function(){var a=u.Pb.ya;this.H=l;if(a)document[a.nb]();else this.h.Ta()?L(this,"exitFullScreen"):(M(this),this.j("fullscreenchange"));return this};t.lc=function(a){27===a.keyCode&&(this.H===f?this.ob():M(this))};function M(a){a.cd=l;u.o(document,"keydown",a.lc);document.documentElement.style.overflow=a.Yc;u.u(document.body,"vjs-full-window");a.j("exitFullWindow")}
+t.src=function(a){if(a instanceof Array){var c;a:{c=a;for(var d=0,e=this.g.techOrder;d<e.length;d++){var g=u.$(e[d]),j=window.videojs[g];if(j.isSupported())for(var k=0,q=c;k<q.length;k++){var n=q[k];if(j.canPlaySource(n)){c={source:n,h:g};break a}}}c=l}c?(a=c.source,c=c.h,c==this.ia?this.src(a):I(this,c,a)):this.a.appendChild(u.e("p",{innerHTML:this.options().notSupportedMessage}))}else a instanceof Object?window.videojs[this.ia].canPlaySource(a)?this.src(a.src):this.src([a]):(this.v.src=a,this.aa?
+(L(this,"src",a),"auto"==this.g.preload&&this.load(),this.g.autoplay&&this.play()):this.L(function(){this.src(a)}));return this};t.load=function(){L(this,"load");return this};t.currentSrc=function(){return K(this,"currentSrc")||this.v.src||""};t.Qa=function(a){return a!==b?(L(this,"setPreload",a),this.g.preload=a,this):K(this,"preload")};t.autoplay=function(a){return a!==b?(L(this,"setAutoplay",a),this.g.autoplay=a,this):K(this,"autoplay")};
+t.loop=function(a){return a!==b?(L(this,"setLoop",a),this.g.loop=a,this):K(this,"loop")};t.poster=function(a){return a!==b?(this.uc=a,this):this.uc};t.controls=function(a){return a!==b?(a=!!a,this.sb!==a&&((this.sb=a)?(this.u("vjs-controls-disabled"),this.n("vjs-controls-enabled"),this.j("controlsenabled")):(this.u("vjs-controls-enabled"),this.n("vjs-controls-disabled"),this.j("controlsdisabled"))),this):this.sb};u.s.prototype.Sb;t=u.s.prototype;
+t.Rb=function(a){return a!==b?(a=!!a,this.Sb!==a&&((this.Sb=a)?(this.n("vjs-using-native-controls"),this.j("usingnativecontrols")):(this.u("vjs-using-native-controls"),this.j("usingcustomcontrols"))),this):this.Sb};t.error=function(){return K(this,"error")};t.seeking=function(){return K(this,"seeking")};t.ka=f;t.Mb=function(){this.ka=f};t.Qb=f;
+t.ja=function(a){return a!==b?(a=!!a,a!==this.Qb&&((this.Qb=a)?(this.ka=f,this.u("vjs-user-inactive"),this.n("vjs-user-active"),this.j("useractive")):(this.ka=l,this.h.U("mousemove",function(a){a.stopPropagation();a.preventDefault()}),this.u("vjs-user-active"),this.n("vjs-user-inactive"),this.j("userinactive"))),this):this.Qb};var N,O,P;P=document.createElement("div");O={};
+P.Hd!==b?(O.wc="requestFullscreen",O.nb="exitFullscreen",O.vb="fullscreenchange",O.H="fullScreen"):(document.mozCancelFullScreen?(N="moz",O.H=N+"FullScreen"):(N="webkit",O.H=N+"IsFullScreen"),P[N+"RequestFullScreen"]&&(O.wc=N+"RequestFullScreen",O.nb=N+"CancelFullScreen"),O.vb=N+"fullscreenchange");document[O.nb]&&(u.Pb.ya=O);u.Fa=u.c.extend();
+u.Fa.prototype.g={Md:"play",children:{playToggle:{},currentTimeDisplay:{},timeDivider:{},durationDisplay:{},remainingTimeDisplay:{},progressControl:{},fullscreenToggle:{},volumeControl:{},muteToggle:{}}};u.Fa.prototype.e=function(){return u.e("div",{className:"vjs-control-bar"})};u.Yb=u.q.extend({i:function(a,c){u.q.call(this,a,c);a.d("play",u.bind(this,this.Kb));a.d("pause",u.bind(this,this.Jb))}});t=u.Yb.prototype;t.qa="Play";t.T=function(){return"vjs-play-control "+u.q.prototype.T.call(this)};
+t.p=function(){this.b.paused()?this.b.play():this.b.pause()};t.Kb=function(){u.u(this.a,"vjs-paused");u.n(this.a,"vjs-playing");this.a.children[0].children[0].innerHTML="Pause"};t.Jb=function(){u.u(this.a,"vjs-playing");u.n(this.a,"vjs-paused");this.a.children[0].children[0].innerHTML="Play"};u.Ya=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("timeupdate",u.bind(this,this.Ca))}});
+u.Ya.prototype.e=function(){var a=u.c.prototype.e.call(this,"div",{className:"vjs-current-time vjs-time-controls vjs-control"});this.content=u.e("div",{className:"vjs-current-time-display",innerHTML:'<span class="vjs-control-text">Current Time </span>0:00',"aria-live":"off"});a.appendChild(u.e("div").appendChild(this.content));return a};
+u.Ya.prototype.Ca=function(){var a=this.b.Nb?this.b.v.currentTime:this.b.currentTime();this.content.innerHTML='<span class="vjs-control-text">Current Time </span>'+u.La(a,this.b.duration())};u.Za=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("timeupdate",u.bind(this,this.Ca))}});
+u.Za.prototype.e=function(){var a=u.c.prototype.e.call(this,"div",{className:"vjs-duration vjs-time-controls vjs-control"});this.content=u.e("div",{className:"vjs-duration-display",innerHTML:'<span class="vjs-control-text">Duration Time </span>0:00',"aria-live":"off"});a.appendChild(u.e("div").appendChild(this.content));return a};u.Za.prototype.Ca=function(){var a=this.b.duration();a&&(this.content.innerHTML='<span class="vjs-control-text">Duration Time </span>'+u.La(a))};
+u.cc=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.cc.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-time-divider",innerHTML:"<div><span>/</span></div>"})};u.fb=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("timeupdate",u.bind(this,this.Ca))}});
+u.fb.prototype.e=function(){var a=u.c.prototype.e.call(this,"div",{className:"vjs-remaining-time vjs-time-controls vjs-control"});this.content=u.e("div",{className:"vjs-remaining-time-display",innerHTML:'<span class="vjs-control-text">Remaining Time </span>-0:00',"aria-live":"off"});a.appendChild(u.e("div").appendChild(this.content));return a};u.fb.prototype.Ca=function(){this.b.duration()&&(this.content.innerHTML='<span class="vjs-control-text">Remaining Time </span>-'+u.La(this.b.duration()-this.b.currentTime()))};
+u.Ga=u.q.extend({i:function(a,c){u.q.call(this,a,c)}});u.Ga.prototype.qa="Fullscreen";u.Ga.prototype.T=function(){return"vjs-fullscreen-control "+u.q.prototype.T.call(this)};u.Ga.prototype.p=function(){this.b.H?(this.b.ob(),this.a.children[0].children[0].innerHTML="Fullscreen"):(this.b.ya(),this.a.children[0].children[0].innerHTML="Non-Fullscreen")};u.eb=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.eb.prototype.g={children:{seekBar:{}}};
+u.eb.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-progress-control vjs-control"})};u.Zb=u.O.extend({i:function(a,c){u.O.call(this,a,c);a.d("timeupdate",u.bind(this,this.Ba));a.L(u.bind(this,this.Ba))}});t=u.Zb.prototype;t.g={children:{loadProgressBar:{},playProgressBar:{},seekHandle:{}},barName:"playProgressBar",handleName:"seekHandle"};t.tc="timeupdate";t.e=function(){return u.O.prototype.e.call(this,"div",{className:"vjs-progress-holder","aria-label":"video progress bar"})};
+t.Ba=function(){var a=this.b.Nb?this.b.v.currentTime:this.b.currentTime();this.a.setAttribute("aria-valuenow",u.round(100*this.yb(),2));this.a.setAttribute("aria-valuetext",u.La(a,this.b.duration()))};t.yb=function(){var a;"Flash"===this.b.ia&&this.b.seeking()?(a=this.b.v,a=a.rc?a.rc:this.b.currentTime()):a=this.b.currentTime();return a/this.b.duration()};t.Pa=function(a){u.O.prototype.Pa.call(this,a);this.b.Nb=f;this.Dd=!this.b.paused();this.b.pause()};
+t.Hb=function(a){a=F(this,a)*this.b.duration();a==this.b.duration()&&(a-=0.1);this.b.currentTime(a)};t.Ib=function(a){u.O.prototype.Ib.call(this,a);this.b.Nb=l;this.Dd&&this.b.play()};t.zc=function(){this.b.currentTime(this.b.currentTime()+5)};t.yc=function(){this.b.currentTime(this.b.currentTime()-5)};u.ab=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("progress",u.bind(this,this.update))}});u.ab.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-load-progress",innerHTML:'<span class="vjs-control-text">Loaded: 0%</span>'})};
+u.ab.prototype.update=function(){this.a.style&&(this.a.style.width=u.round(100*this.b.Ja(),2)+"%")};u.Xb=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});u.Xb.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-play-progress",innerHTML:'<span class="vjs-control-text">Progress: 0%</span>'})};u.gb=u.ea.extend();u.gb.prototype.defaultValue="00:00";u.gb.prototype.e=function(){return u.ea.prototype.e.call(this,"div",{className:"vjs-seek-handle"})};
+u.ib=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.h&&(a.h.m&&a.h.m.volumeControl===l)&&this.n("vjs-hidden");a.d("loadstart",u.bind(this,function(){a.h.m&&a.h.m.volumeControl===l?this.n("vjs-hidden"):this.u("vjs-hidden")}))}});u.ib.prototype.g={children:{volumeBar:{}}};u.ib.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-volume-control vjs-control"})};
+u.hb=u.O.extend({i:function(a,c){u.O.call(this,a,c);a.d("volumechange",u.bind(this,this.Ba));a.L(u.bind(this,this.Ba));setTimeout(u.bind(this,this.update),0)}});t=u.hb.prototype;t.Ba=function(){this.a.setAttribute("aria-valuenow",u.round(100*this.b.volume(),2));this.a.setAttribute("aria-valuetext",u.round(100*this.b.volume(),2)+"%")};t.g={children:{volumeLevel:{},volumeHandle:{}},barName:"volumeLevel",handleName:"volumeHandle"};t.tc="volumechange";
+t.e=function(){return u.O.prototype.e.call(this,"div",{className:"vjs-volume-bar","aria-label":"volume level"})};t.Hb=function(a){this.b.muted()&&this.b.muted(l);this.b.volume(F(this,a))};t.yb=function(){return this.b.muted()?0:this.b.volume()};t.zc=function(){this.b.volume(this.b.volume()+0.1)};t.yc=function(){this.b.volume(this.b.volume()-0.1)};u.dc=u.c.extend({i:function(a,c){u.c.call(this,a,c)}});
+u.dc.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-volume-level",innerHTML:'<span class="vjs-control-text"></span>'})};u.jb=u.ea.extend();u.jb.prototype.defaultValue="00:00";u.jb.prototype.e=function(){return u.ea.prototype.e.call(this,"div",{className:"vjs-volume-handle"})};
+u.da=u.q.extend({i:function(a,c){u.q.call(this,a,c);a.d("volumechange",u.bind(this,this.update));a.h&&(a.h.m&&a.h.m.volumeControl===l)&&this.n("vjs-hidden");a.d("loadstart",u.bind(this,function(){a.h.m&&a.h.m.volumeControl===l?this.n("vjs-hidden"):this.u("vjs-hidden")}))}});u.da.prototype.e=function(){return u.q.prototype.e.call(this,"div",{className:"vjs-mute-control vjs-control",innerHTML:'<div><span class="vjs-control-text">Mute</span></div>'})};
+u.da.prototype.p=function(){this.b.muted(this.b.muted()?l:f)};u.da.prototype.update=function(){var a=this.b.volume(),c=3;0===a||this.b.muted()?c=0:0.33>a?c=1:0.67>a&&(c=2);this.b.muted()?"Unmute"!=this.a.children[0].children[0].innerHTML&&(this.a.children[0].children[0].innerHTML="Unmute"):"Mute"!=this.a.children[0].children[0].innerHTML&&(this.a.children[0].children[0].innerHTML="Mute");for(a=0;4>a;a++)u.u(this.a,"vjs-vol-"+a);u.n(this.a,"vjs-vol-"+c)};
+u.oa=u.R.extend({i:function(a,c){u.R.call(this,a,c);a.d("volumechange",u.bind(this,this.update));a.h&&(a.h.m&&a.h.m.Dc===l)&&this.n("vjs-hidden");a.d("loadstart",u.bind(this,function(){a.h.m&&a.h.m.Dc===l?this.n("vjs-hidden"):this.u("vjs-hidden")}));this.n("vjs-menu-button")}});u.oa.prototype.Ka=function(){var a=new u.ma(this.b,{Vc:"div"}),c=new u.hb(this.b,u.k.B({Cd:f},this.g.Vd));a.Z(c);return a};u.oa.prototype.p=function(){u.da.prototype.p.call(this);u.R.prototype.p.call(this)};
+u.oa.prototype.e=function(){return u.q.prototype.e.call(this,"div",{className:"vjs-volume-menu-button vjs-menu-button vjs-control",innerHTML:'<div><span class="vjs-control-text">Mute</span></div>'})};u.oa.prototype.update=u.da.prototype.update;u.cb=u.q.extend({i:function(a,c){u.q.call(this,a,c);(!a.poster()||!a.controls())&&this.C();a.d("play",u.bind(this,this.C))}});
+u.cb.prototype.e=function(){var a=u.e("div",{className:"vjs-poster",tabIndex:-1}),c=this.b.poster();c&&("backgroundSize"in a.style?a.style.backgroundImage='url("'+c+'")':a.appendChild(u.e("img",{src:c})));return a};u.cb.prototype.p=function(){this.K().controls()&&this.b.play()};
+u.Wb=u.c.extend({i:function(a,c){u.c.call(this,a,c);a.d("canplay",u.bind(this,this.C));a.d("canplaythrough",u.bind(this,this.C));a.d("playing",u.bind(this,this.C));a.d("seeked",u.bind(this,this.C));a.d("seeking",u.bind(this,this.show));a.d("seeked",u.bind(this,this.C));a.d("error",u.bind(this,this.show));a.d("waiting",u.bind(this,this.show))}});u.Wb.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-loading-spinner"})};u.Wa=u.q.extend();
+u.Wa.prototype.e=function(){return u.q.prototype.e.call(this,"div",{className:"vjs-big-play-button",innerHTML:'<span aria-hidden="true"></span>',"aria-label":"play video"})};u.Wa.prototype.p=function(){this.b.play()};
+u.r=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);var e,g;g=this;e=this.K();a=function(){if(e.controls()&&!e.Rb()){var a,c;g.d("mousedown",g.p);g.d("touchstart",function(a){a.preventDefault();a.stopPropagation();c=this.b.ja()});a=function(a){a.stopPropagation();c&&this.b.Mb()};g.d("touchmove",a);g.d("touchleave",a);g.d("touchcancel",a);g.d("touchend",a);var d,n,r;d=0;g.d("touchstart",function(){d=(new Date).getTime();r=f});a=function(){r=l};g.d("touchmove",a);g.d("touchleave",a);g.d("touchcancel",
+a);g.d("touchend",function(){r===f&&(n=(new Date).getTime()-d,250>n&&this.j("tap"))});g.d("tap",g.md)}};c=u.bind(g,g.pd);this.L(a);e.d("controlsenabled",a);e.d("controlsdisabled",c)}});u.r.prototype.pd=function(){this.o("tap");this.o("touchstart");this.o("touchmove");this.o("touchleave");this.o("touchcancel");this.o("touchend");this.o("click");this.o("mousedown")};u.r.prototype.p=function(a){0===a.button&&this.K().controls()&&(this.K().paused()?this.K().play():this.K().pause())};
+u.r.prototype.md=function(){this.K().ja(!this.K().ja())};u.r.prototype.m={volumeControl:f,fullscreenResize:l,progressEvents:l,timeupdateEvents:l};u.media={};u.media.Va="play pause paused currentTime setCurrentTime duration buffered volume setVolume muted setMuted width height supportsFullScreen enterFullScreen src load currentSrc preload setPreload autoplay setAutoplay loop setLoop error networkState readyState seeking initialTime startOffsetTime played seekable ended videoTracks audioTracks videoWidth videoHeight textTracks defaultPlaybackRate playbackRate mediaGroup controller controls defaultMuted".split(" ");
+function ea(){var a=u.media.Va[i];return function(){throw Error('The "'+a+"\" method is not available on the playback technology's API");}}for(var i=u.media.Va.length-1;0<=i;i--)u.r.prototype[u.media.Va[i]]=ea();
+u.l=u.r.extend({i:function(a,c,d){this.m.volumeControl=u.l.Uc();this.m.movingMediaElementInDOM=!u.Kc;this.m.fullscreenResize=f;u.r.call(this,a,c,d);(c=c.source)&&this.a.currentSrc===c.src&&0<this.a.networkState?a.j("loadstart"):c&&(this.a.src=c.src);if(u.ac&&a.options().nativeControlsForTouch!==l){var e,g,j,k;e=this;g=this.K();c=g.controls();e.a.controls=!!c;j=function(){e.a.controls=f};k=function(){e.a.controls=l};g.d("controlsenabled",j);g.d("controlsdisabled",k);c=function(){g.o("controlsenabled",
+j);g.o("controlsdisabled",k)};e.d("dispose",c);g.d("usingcustomcontrols",c);g.Rb(f)}a.L(function(){this.M&&(this.g.autoplay&&this.paused())&&(delete this.M.poster,this.play())});for(a=u.l.$a.length-1;0<=a;a--)u.d(this.a,u.l.$a[a],u.bind(this.b,this.$c));this.Ua()}});t=u.l.prototype;t.D=function(){u.r.prototype.D.call(this)};
+t.e=function(){var a=this.b,c=a.M,d;if(!c||this.m.movingMediaElementInDOM===l)c?(d=c.cloneNode(l),u.l.jc(c),c=d,a.M=h):c=u.e("video",{id:a.id()+"_html5_api",className:"vjs-tech"}),c.player=a,u.zb(c,a.w());d=["autoplay","preload","loop","muted"];for(var e=d.length-1;0<=e;e--){var g=d[e];a.g[g]!==h&&(c[g]=a.g[g])}return c};t.$c=function(a){this.j(a);a.stopPropagation()};t.play=function(){this.a.play()};t.pause=function(){this.a.pause()};t.paused=function(){return this.a.paused};t.currentTime=function(){return this.a.currentTime};
+t.sd=function(a){try{this.a.currentTime=a}catch(c){u.log(c,"Video is not ready. (Video.js)")}};t.duration=function(){return this.a.duration||0};t.buffered=function(){return this.a.buffered};t.volume=function(){return this.a.volume};t.xd=function(a){this.a.volume=a};t.muted=function(){return this.a.muted};t.vd=function(a){this.a.muted=a};t.width=function(){return this.a.offsetWidth};t.height=function(){return this.a.offsetHeight};
+t.Ta=function(){return"function"==typeof this.a.webkitEnterFullScreen&&(/Android/.test(u.F)||!/Chrome|Mac OS X 10.5/.test(u.F))?f:l};t.src=function(a){this.a.src=a};t.load=function(){this.a.load()};t.currentSrc=function(){return this.a.currentSrc};t.Qa=function(){return this.a.Qa};t.wd=function(a){this.a.Qa=a};t.autoplay=function(){return this.a.autoplay};t.rd=function(a){this.a.autoplay=a};t.controls=function(){return this.a.controls};t.loop=function(){return this.a.loop};
+t.ud=function(a){this.a.loop=a};t.error=function(){return this.a.error};t.seeking=function(){return this.a.seeking};u.l.isSupported=function(){return!!u.na.canPlayType};u.l.mb=function(a){try{return!!u.na.canPlayType(a.type)}catch(c){return""}};u.l.Uc=function(){var a=u.na.volume;u.na.volume=a/2+0.1;return a!==u.na.volume};u.l.$a="loadstart suspend abort error emptied stalled loadedmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate progress play pause ratechange volumechange".split(" ");
+u.l.jc=function(a){if(a){a.player=h;for(a.parentNode&&a.parentNode.removeChild(a);a.hasChildNodes();)a.removeChild(a.firstChild);a.removeAttribute("src");"function"===typeof a.load&&a.load()}};u.Oc&&(document.createElement("video").constructor.prototype.canPlayType=function(a){return a&&-1!=a.toLowerCase().indexOf("video/mp4")?"maybe":""});
+u.f=u.r.extend({i:function(a,c,d){u.r.call(this,a,c,d);var e=c.source;d=c.parentEl;var g=this.a=u.e("div",{id:a.id()+"_temp_flash"}),j=a.id()+"_flash_api";a=a.g;var k=u.k.B({readyFunction:"videojs.Flash.onReady",eventProxyFunction:"videojs.Flash.onEvent",errorEventProxyFunction:"videojs.Flash.onError",autoplay:a.autoplay,preload:a.Qa,loop:a.loop,muted:a.muted},c.flashVars),q=u.k.B({wmode:"opaque",bgcolor:"#000000"},c.params),n=u.k.B({id:j,name:j,"class":"vjs-tech"},c.attributes);e&&(e.type&&u.f.ed(e.type)?
+(a=u.f.Ac(e.src),k.rtmpConnection=encodeURIComponent(a.rb),k.rtmpStream=encodeURIComponent(a.Ob)):k.src=encodeURIComponent(u.mc(e.src)));u.zb(g,d);c.startTime&&this.L(function(){this.load();this.play();this.currentTime(c.startTime)});if(c.iFrameMode===f&&!u.Jc){var r=u.e("iframe",{id:j+"_iframe",name:j+"_iframe",className:"vjs-tech",scrolling:"no",marginWidth:0,marginHeight:0,frameBorder:0});k.readyFunction="ready";k.eventProxyFunction="events";k.errorEventProxyFunction="errors";u.d(r,"load",u.bind(this,
+function(){var a,d=r.contentWindow;a=r.contentDocument?r.contentDocument:r.contentWindow.document;a.write(u.f.nc(c.swf,k,q,n));d.player=this.b;d.ready=u.bind(this.b,function(c){var d=this.h;d.a=a.getElementById(c);u.f.pb(d)});d.events=u.bind(this.b,function(a,c){this&&"flash"===this.ia&&this.j(c)});d.errors=u.bind(this.b,function(a,c){u.log("Flash Error",c)})}));g.parentNode.replaceChild(r,g)}else u.f.Zc(c.swf,g,k,q,n)}});t=u.f.prototype;t.D=function(){u.r.prototype.D.call(this)};t.play=function(){this.a.vjs_play()};
+t.pause=function(){this.a.vjs_pause()};t.src=function(a){u.f.dd(a)?(a=u.f.Ac(a),this.Qd(a.rb),this.Rd(a.Ob)):(a=u.mc(a),this.a.vjs_src(a));if(this.b.autoplay()){var c=this;setTimeout(function(){c.play()},0)}};t.currentSrc=function(){var a=this.a.vjs_getProperty("currentSrc");if(a==h){var c=this.Od(),d=this.Pd();c&&d&&(a=u.f.yd(c,d))}return a};t.load=function(){this.a.vjs_load()};t.poster=function(){this.a.vjs_getProperty("poster")};t.buffered=function(){return u.tb(0,this.a.vjs_getProperty("buffered"))};
+t.Ta=s(l);var Q=u.f.prototype,R="rtmpConnection rtmpStream preload currentTime defaultPlaybackRate playbackRate autoplay loop mediaGroup controller controls volume muted defaultMuted".split(" "),S="error currentSrc networkState readyState seeking initialTime duration startOffsetTime paused played seekable ended videoTracks audioTracks videoWidth videoHeight textTracks".split(" ");
+function fa(){var a=R[T],c=a.charAt(0).toUpperCase()+a.slice(1);Q["set"+c]=function(c){return this.a.vjs_setProperty(a,c)}}function U(a){Q[a]=function(){return this.a.vjs_getProperty(a)}}var T;for(T=0;T<R.length;T++)U(R[T]),fa();for(T=0;T<S.length;T++)U(S[T]);u.f.isSupported=function(){return 10<=u.f.version()[0]};u.f.mb=function(a){if(!a.type)return"";a=a.type.replace(/;.*/,"").toLowerCase();if(a in u.f.bd||a in u.f.Bc)return"maybe"};
+u.f.bd={"video/flv":"FLV","video/x-flv":"FLV","video/mp4":"MP4","video/m4v":"MP4"};u.f.Bc={"rtmp/mp4":"MP4","rtmp/flv":"FLV"};u.f.onReady=function(a){a=u.w(a);var c=a.player||a.parentNode.player,d=c.h;a.player=c;d.a=a;u.f.pb(d)};u.f.pb=function(a){a.w().vjs_getProperty?a.Ua():setTimeout(function(){u.f.pb(a)},50)};u.f.onEvent=function(a,c){u.w(a).player.j(c)};u.f.onError=function(a,c){u.w(a).player.j("error");u.log("Flash Error",c,a)};
+u.f.version=function(){var a="0,0,0";try{a=(new window.ActiveXObject("ShockwaveFlash.ShockwaveFlash")).GetVariable("$version").replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}catch(c){try{navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin&&(a=(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g,",").match(/^,?(.+),?$/)[1])}catch(d){}}return a.split(",")};
+u.f.Zc=function(a,c,d,e,g){a=u.f.nc(a,d,e,g);a=u.e("div",{innerHTML:a}).childNodes[0];d=c.parentNode;c.parentNode.replaceChild(a,c);var j=d.childNodes[0];setTimeout(function(){j.style.display="block"},1E3)};
+u.f.nc=function(a,c,d,e){var g="",j="",k="";c&&u.k.ua(c,function(a,c){g+=a+"="+c+"&amp;"});d=u.k.B({movie:a,flashvars:g,allowScriptAccess:"always",allowNetworking:"all"},d);u.k.ua(d,function(a,c){j+='<param name="'+a+'" value="'+c+'" />'});e=u.k.B({data:a,width:"100%",height:"100%"},e);u.k.ua(e,function(a,c){k+=a+'="'+c+'" '});return'<object type="application/x-shockwave-flash"'+k+">"+j+"</object>"};u.f.yd=function(a,c){return a+"&"+c};
+u.f.Ac=function(a){var c={rb:"",Ob:""};if(!a)return c;var d=a.indexOf("&"),e;-1!==d?e=d+1:(d=e=a.lastIndexOf("/")+1,0===d&&(d=e=a.length));c.rb=a.substring(0,d);c.Ob=a.substring(e,a.length);return c};u.f.ed=function(a){return a in u.f.Bc};u.f.Qc=/^rtmp[set]?:\/\//i;u.f.dd=function(a){return u.f.Qc.test(a)};
+u.Pc=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);if(!a.g.sources||0===a.g.sources.length){c=0;for(d=a.g.techOrder;c<d.length;c++){var e=u.$(d[c]),g=window.videojs[e];if(g&&g.isSupported()){I(a,e);break}}}else a.src(a.g.sources)}});function V(a){a.Aa=a.Aa||[];return a.Aa}function W(a,c,d){for(var e=a.Aa,g=0,j=e.length,k,q;g<j;g++)k=e[g],k.id()===c?(k.show(),q=k):d&&(k.J()==d&&0<k.mode())&&k.disable();(c=q?q.J():d?d:l)&&a.j(c+"trackchange")}
+u.X=u.c.extend({i:function(a,c){u.c.call(this,a,c);this.Q=c.id||"vjs_"+c.kind+"_"+c.language+"_"+u.t++;this.xc=c.src;this.Wc=c["default"]||c.dflt;this.Ad=c.title;this.Ld=c.srclang;this.fd=c.label;this.fa=[];this.ec=[];this.ga=this.ha=0;this.b.d("fullscreenchange",u.bind(this,this.Rc))}});t=u.X.prototype;t.J=p("A");t.src=p("xc");t.ub=p("Wc");t.title=p("Ad");t.label=p("fd");t.readyState=p("ha");t.mode=p("ga");t.Rc=function(){this.a.style.fontSize=this.b.H?140*(screen.width/this.b.width())+"%":""};
+t.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-"+this.A+" vjs-text-track"})};t.show=function(){X(this);this.ga=2;u.c.prototype.show.call(this)};t.C=function(){X(this);this.ga=1;u.c.prototype.C.call(this)};t.disable=function(){2==this.ga&&this.C();this.b.o("timeupdate",u.bind(this,this.update,this.Q));this.b.o("ended",u.bind(this,this.reset,this.Q));this.reset();this.b.V.textTrackDisplay.removeChild(this);this.ga=0};
+function X(a){0===a.ha&&a.load();0===a.ga&&(a.b.d("timeupdate",u.bind(a,a.update,a.Q)),a.b.d("ended",u.bind(a,a.reset,a.Q)),("captions"===a.A||"subtitles"===a.A)&&a.b.V.textTrackDisplay.Z(a))}t.load=function(){0===this.ha&&(this.ha=1,u.get(this.xc,u.bind(this,this.nd),u.bind(this,this.Gb)))};t.Gb=function(a){this.error=a;this.ha=3;this.j("error")};
+t.nd=function(a){var c,d;a=a.split("\n");for(var e="",g=1,j=a.length;g<j;g++)if(e=u.trim(a[g])){-1==e.indexOf("--\x3e")?(c=e,e=u.trim(a[++g])):c=this.fa.length;c={id:c,index:this.fa.length};d=e.split(" --\x3e ");c.startTime=Y(d[0]);c.va=Y(d[1]);for(d=[];a[++g]&&(e=u.trim(a[g]));)d.push(e);c.text=d.join("<br/>");this.fa.push(c)}this.ha=2;this.j("loaded")};
+function Y(a){var c=a.split(":");a=0;var d,e,g;3==c.length?(d=c[0],e=c[1],c=c[2]):(d=0,e=c[0],c=c[1]);c=c.split(/\s+/);c=c.splice(0,1)[0];c=c.split(/\.|,/);g=parseFloat(c[1]);c=c[0];a+=3600*parseFloat(d);a+=60*parseFloat(e);a+=parseFloat(c);g&&(a+=g/1E3);return a}
+t.update=function(){if(0<this.fa.length){var a=this.b.currentTime();if(this.Lb===b||a<this.Lb||this.Ma<=a){var c=this.fa,d=this.b.duration(),e=0,g=l,j=[],k,q,n,r;a>=this.Ma||this.Ma===b?r=this.wb!==b?this.wb:0:(g=f,r=this.Db!==b?this.Db:c.length-1);for(;;){n=c[r];if(n.va<=a)e=Math.max(e,n.va),n.Ia&&(n.Ia=l);else if(a<n.startTime){if(d=Math.min(d,n.startTime),n.Ia&&(n.Ia=l),!g)break}else g?(j.splice(0,0,n),q===b&&(q=r),k=r):(j.push(n),k===b&&(k=r),q=r),d=Math.min(d,n.va),e=Math.max(e,n.startTime),
+n.Ia=f;if(g)if(0===r)break;else r--;else if(r===c.length-1)break;else r++}this.ec=j;this.Ma=d;this.Lb=e;this.wb=k;this.Db=q;a=this.ec;c="";d=0;for(e=a.length;d<e;d++)c+='<span class="vjs-tt-cue">'+a[d].text+"</span>";this.a.innerHTML=c;this.j("cuechange")}}};t.reset=function(){this.Ma=0;this.Lb=this.b.duration();this.Db=this.wb=0};u.Ub=u.X.extend();u.Ub.prototype.A="captions";u.$b=u.X.extend();u.$b.prototype.A="subtitles";u.Vb=u.X.extend();u.Vb.prototype.A="chapters";
+u.bc=u.c.extend({i:function(a,c,d){u.c.call(this,a,c,d);if(a.g.tracks&&0<a.g.tracks.length){c=this.b;a=a.g.tracks;var e;for(d=0;d<a.length;d++){e=a[d];var g=c,j=e.kind,k=e.label,q=e.language,n=e;e=g.Aa=g.Aa||[];n=n||{};n.kind=j;n.label=k;n.language=q;j=u.$(j||"subtitles");g=new window.videojs[j+"Track"](g,n);e.push(g)}}}});u.bc.prototype.e=function(){return u.c.prototype.e.call(this,"div",{className:"vjs-text-track-display"})};
+u.Y=u.N.extend({i:function(a,c){var d=this.ca=c.track;c.label=d.label();c.selected=d.ub();u.N.call(this,a,c);this.b.d(d.J()+"trackchange",u.bind(this,this.update))}});u.Y.prototype.p=function(){u.N.prototype.p.call(this);W(this.b,this.ca.Q,this.ca.J())};u.Y.prototype.update=function(){this.selected(2==this.ca.mode())};u.bb=u.Y.extend({i:function(a,c){c.track={J:function(){return c.kind},K:a,label:function(){return c.kind+" off"},ub:s(l),mode:s(l)};u.Y.call(this,a,c);this.selected(f)}});
+u.bb.prototype.p=function(){u.Y.prototype.p.call(this);W(this.b,this.ca.Q,this.ca.J())};u.bb.prototype.update=function(){for(var a=V(this.b),c=0,d=a.length,e,g=f;c<d;c++)e=a[c],e.J()==this.ca.J()&&2==e.mode()&&(g=l);this.selected(g)};u.S=u.R.extend({i:function(a,c){u.R.call(this,a,c);1>=this.I.length&&this.C()}});u.S.prototype.ta=function(){var a=[],c;a.push(new u.bb(this.b,{kind:this.A}));for(var d=0;d<V(this.b).length;d++)c=V(this.b)[d],c.J()===this.A&&a.push(new u.Y(this.b,{track:c}));return a};
+u.Da=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute("aria-label","Captions Menu")}});u.Da.prototype.A="captions";u.Da.prototype.qa="Captions";u.Da.prototype.className="vjs-captions-button";u.Ha=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute("aria-label","Subtitles Menu")}});u.Ha.prototype.A="subtitles";u.Ha.prototype.qa="Subtitles";u.Ha.prototype.className="vjs-subtitles-button";
+u.Ea=u.S.extend({i:function(a,c,d){u.S.call(this,a,c,d);this.a.setAttribute("aria-label","Chapters Menu")}});t=u.Ea.prototype;t.A="chapters";t.qa="Chapters";t.className="vjs-chapters-button";t.ta=function(){for(var a=[],c,d=0;d<V(this.b).length;d++)c=V(this.b)[d],c.J()===this.A&&a.push(new u.Y(this.b,{track:c}));return a};
+t.Ka=function(){for(var a=V(this.b),c=0,d=a.length,e,g,j=this.I=[];c<d;c++)if(e=a[c],e.J()==this.A&&e.ub()){if(2>e.readyState()){this.Id=e;e.d("loaded",u.bind(this,this.Ka));return}g=e;break}a=this.wa=new u.ma(this.b);a.a.appendChild(u.e("li",{className:"vjs-menu-title",innerHTML:u.$(this.A),zd:-1}));if(g){e=g.fa;for(var k,c=0,d=e.length;c<d;c++)k=e[c],k=new u.Xa(this.b,{track:g,cue:k}),j.push(k),a.Z(k)}0<this.I.length&&this.show();return a};
+u.Xa=u.N.extend({i:function(a,c){var d=this.ca=c.track,e=this.cue=c.cue,g=a.currentTime();c.label=e.text;c.selected=e.startTime<=g&&g<e.va;u.N.call(this,a,c);d.d("cuechange",u.bind(this,this.update))}});u.Xa.prototype.p=function(){u.N.prototype.p.call(this);this.b.currentTime(this.cue.startTime);this.update(this.cue.startTime)};u.Xa.prototype.update=function(){var a=this.cue,c=this.b.currentTime();this.selected(a.startTime<=c&&c<a.va)};
+u.k.B(u.Fa.prototype.g.children,{subtitlesButton:{},captionsButton:{},chaptersButton:{}});
+if("undefined"!==typeof window.JSON&&"function"===window.JSON.parse)u.JSON=window.JSON;else{u.JSON={};var Z=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;u.JSON.parse=function(a,c){function d(a,e){var k,q,n=a[e];if(n&&"object"===typeof n)for(k in n)Object.prototype.hasOwnProperty.call(n,k)&&(q=d(n,k),q!==b?n[k]=q:delete n[k]);return c.call(a,e,n)}var e;a=String(a);Z.lastIndex=0;Z.test(a)&&(a=a.replace(Z,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));
+if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return e=eval("("+a+")"),"function"===typeof c?d({"":e},""):e;throw new SyntaxError("JSON.parse(): invalid or malformed JSON data");}}
+u.fc=function(){var a,c,d=document.getElementsByTagName("video");if(d&&0<d.length)for(var e=0,g=d.length;e<g;e++)if((c=d[e])&&c.getAttribute)c.player===b&&(a=c.getAttribute("data-setup"),a!==h&&(a=u.JSON.parse(a||"{}"),v(c,a)));else{u.kb();break}else u.Ec||u.kb()};u.kb=function(){setTimeout(u.fc,1)};"complete"===document.readyState?u.Ec=f:u.U(window,"load",function(){u.Ec=f});u.kb();u.od=function(a,c){u.s.prototype[a]=c};var ga=this;ga.Ed=f;function $(a,c){var d=a.split("."),e=ga;!(d[0]in e)&&e.execScript&&e.execScript("var "+d[0]);for(var g;d.length&&(g=d.shift());)!d.length&&c!==b?e[g]=c:e=e[g]?e[g]:e[g]={}};$("videojs",u);$("_V_",u);$("videojs.options",u.options);$("videojs.players",u.xa);$("videojs.TOUCH_ENABLED",u.ac);$("videojs.cache",u.ra);$("videojs.Component",u.c);u.c.prototype.player=u.c.prototype.K;u.c.prototype.dispose=u.c.prototype.D;u.c.prototype.createEl=u.c.prototype.e;u.c.prototype.el=u.c.prototype.w;u.c.prototype.addChild=u.c.prototype.Z;u.c.prototype.children=u.c.prototype.children;u.c.prototype.on=u.c.prototype.d;u.c.prototype.off=u.c.prototype.o;u.c.prototype.one=u.c.prototype.U;
+u.c.prototype.trigger=u.c.prototype.j;u.c.prototype.triggerReady=u.c.prototype.Ua;u.c.prototype.show=u.c.prototype.show;u.c.prototype.hide=u.c.prototype.C;u.c.prototype.width=u.c.prototype.width;u.c.prototype.height=u.c.prototype.height;u.c.prototype.dimensions=u.c.prototype.Xc;u.c.prototype.ready=u.c.prototype.L;u.c.prototype.addClass=u.c.prototype.n;u.c.prototype.removeClass=u.c.prototype.u;$("videojs.Player",u.s);u.s.prototype.dispose=u.s.prototype.D;u.s.prototype.requestFullScreen=u.s.prototype.ya;
+u.s.prototype.cancelFullScreen=u.s.prototype.ob;u.s.prototype.bufferedPercent=u.s.prototype.Ja;u.s.prototype.usingNativeControls=u.s.prototype.Rb;u.s.prototype.reportUserActivity=u.s.prototype.Mb;u.s.prototype.userActive=u.s.prototype.ja;$("videojs.MediaLoader",u.Pc);$("videojs.TextTrackDisplay",u.bc);$("videojs.ControlBar",u.Fa);$("videojs.Button",u.q);$("videojs.PlayToggle",u.Yb);$("videojs.FullscreenToggle",u.Ga);$("videojs.BigPlayButton",u.Wa);$("videojs.LoadingSpinner",u.Wb);
+$("videojs.CurrentTimeDisplay",u.Ya);$("videojs.DurationDisplay",u.Za);$("videojs.TimeDivider",u.cc);$("videojs.RemainingTimeDisplay",u.fb);$("videojs.Slider",u.O);$("videojs.ProgressControl",u.eb);$("videojs.SeekBar",u.Zb);$("videojs.LoadProgressBar",u.ab);$("videojs.PlayProgressBar",u.Xb);$("videojs.SeekHandle",u.gb);$("videojs.VolumeControl",u.ib);$("videojs.VolumeBar",u.hb);$("videojs.VolumeLevel",u.dc);$("videojs.VolumeMenuButton",u.oa);$("videojs.VolumeHandle",u.jb);$("videojs.MuteToggle",u.da);
+$("videojs.PosterImage",u.cb);$("videojs.Menu",u.ma);$("videojs.MenuItem",u.N);$("videojs.MenuButton",u.R);u.R.prototype.createItems=u.R.prototype.ta;u.S.prototype.createItems=u.S.prototype.ta;u.Ea.prototype.createItems=u.Ea.prototype.ta;$("videojs.SubtitlesButton",u.Ha);$("videojs.CaptionsButton",u.Da);$("videojs.ChaptersButton",u.Ea);$("videojs.MediaTechController",u.r);u.r.prototype.features=u.r.prototype.m;u.r.prototype.m.volumeControl=u.r.prototype.m.Dc;u.r.prototype.m.fullscreenResize=u.r.prototype.m.Jd;
+u.r.prototype.m.progressEvents=u.r.prototype.m.Nd;u.r.prototype.m.timeupdateEvents=u.r.prototype.m.Sd;$("videojs.Html5",u.l);u.l.Events=u.l.$a;u.l.isSupported=u.l.isSupported;u.l.canPlaySource=u.l.mb;u.l.prototype.setCurrentTime=u.l.prototype.sd;u.l.prototype.setVolume=u.l.prototype.xd;u.l.prototype.setMuted=u.l.prototype.vd;u.l.prototype.setPreload=u.l.prototype.wd;u.l.prototype.setAutoplay=u.l.prototype.rd;u.l.prototype.setLoop=u.l.prototype.ud;$("videojs.Flash",u.f);u.f.isSupported=u.f.isSupported;
+u.f.canPlaySource=u.f.mb;u.f.onReady=u.f.onReady;$("videojs.TextTrack",u.X);u.X.prototype.label=u.X.prototype.label;$("videojs.CaptionsTrack",u.Ub);$("videojs.SubtitlesTrack",u.$b);$("videojs.ChaptersTrack",u.Vb);$("videojs.autoSetup",u.fc);$("videojs.plugin",u.od);$("videojs.createTimeRange",u.tb);})();
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/Uploader.swf b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/Uploader.swf
new file mode 100644
index 0000000..7c37835
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/Uploader.swf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.css b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.css
new file mode 100644
index 0000000..12f451f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.css
@@ -0,0 +1,28 @@
+.webuploader-container {
+	position: relative;
+}
+.webuploader-element-invisible {
+	position: absolute !important;
+	clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
+    clip: rect(1px,1px,1px,1px);
+}
+.webuploader-pick {
+	position: relative;
+	display: inline-block;
+	cursor: pointer;
+	background: #00b7ee;
+	padding: 10px 15px;
+	color: #fff;
+	text-align: center;
+	border-radius: 3px;
+	overflow: hidden;
+}
+.webuploader-pick-hover {
+	background: #00a2d4;
+}
+
+.webuploader-pick-disable {
+	opacity: 0.6;
+	pointer-events:none;
+}
+
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.custom.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.custom.js
new file mode 100644
index 0000000..583a0b8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.custom.js
@@ -0,0 +1,5670 @@
+/*! WebUploader 0.1.2 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+        },
+
+        exports = factory( root, _define, _require ),
+        origin;
+
+    // exports every module.
+    exportsTo( exports );
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = exports;
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([], exports );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = exports;
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( this, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        return window.jQuery || window.Zepto;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+    
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+    
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档将可能省略`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+    
+        var noop = function() {},
+            call = Function.call;
+    
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+    
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+    
+        function createObject( proto ) {
+            var f;
+    
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+    
+    
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+    
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.2',
+    
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+    
+            Deferred: promise.Deferred,
+    
+            isPromise: promise.isPromise,
+    
+            when: promise.when,
+    
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+    
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+    
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+    
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+    
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+    
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+    
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+    
+                /* jshint camelcase: false */
+    
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+    
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+    
+                return child;
+            },
+    
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+    
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+    
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+    
+            nextTick: (function() {
+    
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+    
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+    
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+    
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+    
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+    
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+    
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+    
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+    
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+    
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+    
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+    
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+    
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+    
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+    
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+    
+            while ( ++i < len ) {
+                handler = events[ i ];
+    
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+    
+            return !stoped;
+        }
+    
+        protos = {
+    
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+    
+                if ( !callback ) {
+                    return this;
+                }
+    
+                set = this._events || (this._events = []);
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+    
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+    
+                    set.push( handler );
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+    
+                if ( !callback ) {
+                    return me;
+                }
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+    
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+    
+                return me;
+            },
+    
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+    
+                if ( !events ) {
+                    return this;
+                }
+    
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+    
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+    
+                if ( !this._events || !type ) {
+                    return this;
+                }
+    
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+    
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+    
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+    
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+    
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$;
+    
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+    
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+    
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            getRuntimeType: 'get-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+    
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+    
+            _init: function( opts ) {
+                var me = this;
+    
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+    
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     resize: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.options( 'resize', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+    
+                // setter
+                if ( arguments.length > 1 ) {
+    
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+    
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+    
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `queueNum` 还在队列中的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+    
+                return {
+                    successNum: stats.numOfSuccess,
+    
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue
+                };
+            },
+    
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+    
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+    
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+    
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+    
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+    
+                    return false;
+                }
+    
+                return true;
+            },
+    
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+    
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+    
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+    
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            factories = {},
+    
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+    
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+    
+        $.extend( Runtime.prototype, {
+    
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+    
+                if ( this._container ) {
+                    return this._container;
+                }
+    
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+    
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+    
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                return container;
+            },
+    
+            init: Base.noop,
+            exec: Base.noop,
+    
+            destroy: function() {
+                if ( this._container ) {
+                    this._container.parentNode.removeChild( this.__container );
+                }
+    
+                this.off();
+            }
+        });
+    
+        Runtime.orders = 'html5,flash';
+    
+    
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+    
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+    
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+    
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+    
+            type = type || getFirstKey( factories );
+    
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+    
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+    
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+    
+        var cache;
+    
+        cache = (function() {
+            var obj = {};
+    
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+    
+                get: function( ruid, standalone ) {
+                    var i;
+    
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+    
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+    
+                        return obj[ i ];
+                    }
+    
+                    return null;
+                },
+    
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+    
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+    
+            this.uid = Base.guid('client_');
+    
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+    
+            this.connectRuntime = function( opts, cb ) {
+    
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+    
+                deferred.done( cb );
+    
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+    
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+    
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+    
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                runtime.__client--;
+    
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+    
+                runtime = null;
+            };
+    
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+    
+                return runtime.exec.apply( this, args );
+            };
+    
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+    
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+    
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+    
+        function Blob( ruid, source ) {
+            var me = this;
+    
+            me.source = source;
+            me.ruid = ruid;
+    
+            RuntimeClient.call( me, 'Blob' );
+    
+            this.uid = source.uid || this.uid;
+            this.type = source.type || '';
+            this.size = source.size || 0;
+    
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+    
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+    
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+    
+            getSource: function() {
+                return this.source;
+            }
+        });
+    
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+    
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+    
+        function File( ruid, file ) {
+            var ext;
+    
+            Blob.apply( this, arguments );
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+    
+            // todo 支持其他类型文件的转换。
+    
+            // 如果有mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && this.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+    
+            // 如果没有指定mimetype, 但是知道文件后缀。
+            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
+                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
+            }
+    
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+        }
+    
+        return Base.inherits( Blob, File );
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+    
+        var $ = Base.$;
+    
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+    
+            opts.container = $( opts.id );
+    
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+    
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+    
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+    
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+    
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+    
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+    
+                button.addClass('webuploader-pick');
+    
+                me.on( 'all', function( type ) {
+                    var files;
+    
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+    
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+    
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+    
+                $( window ).on( 'resize', function() {
+                    me.refresh();
+                });
+            },
+    
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+    
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+    
+                    pos = button.offset();
+    
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+    
+            enable: function() {
+                var btn = this.options.button;
+    
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+    
+            disable: function() {
+                var btn = this.options.button;
+    
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+    
+                btn.addClass('webuploader-pick-disable');
+            },
+    
+            destroy: function() {
+                if ( this.runtime ) {
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                }
+            }
+        });
+    
+        return FilePicker;
+    });
+    
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+    
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            IGNORE = {},
+            widgetClass = [];
+    
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+    
+            var length = obj.length,
+                type = $.type( obj );
+    
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+    
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+    
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+    
+        $.extend( Widget.prototype, {
+    
+            init: Base.noop,
+    
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+    
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+    
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+    
+                    return IGNORE;
+                }
+    
+                return this[ map[ apiName ] ].apply( this, args );
+    
+            },
+    
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+    
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+    
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [];
+    
+                $.each( widgetClass, function( _, klass ) {
+                    widgets.push( new klass( me ) );
+                });
+    
+                return _init.apply( me, arguments );
+            },
+    
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+    
+                args = isArrayLike( args ) ? args : [ args ];
+    
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+    
+                    if ( rlt !== IGNORE ) {
+    
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+    
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+    
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个tick中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+    
+                                setTimeout(function() {
+                                    deferred.resolve.apply( deferred, args );
+                                }, 1 );
+    
+                                return deferred.promise();
+                            })[ key ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            }
+        });
+    
+        /**
+         * 添加组件
+         * @param  {object} widgetProto 组件原型,构造函数通过constructor属性定义
+         * @param  {object} responseMap API名称与函数实现的映射
+         * @example
+         *     Uploader.register( {
+         *         init: function( options ) {},
+         *         makeThumb: function() {}
+         *     }, {
+         *         'make-thumb': 'makeThumb'
+         *     } );
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init' },
+                klass;
+    
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+                widgetProto.responseMap = map;
+            } else {
+                widgetProto.responseMap = $.extend( map, responseMap );
+            }
+    
+            klass = Base.inherits( Widget, widgetProto );
+            widgetClass.push( klass );
+    
+            return klass;
+        };
+    
+        return Widget;
+    });
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+    
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+    
+        return Uploader.register({
+            'add-btn': 'addButton',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable'
+        }, {
+    
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addButton( opts.pick );
+            },
+    
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+    
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addButton: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    options, picker, deferred;
+    
+                if ( !pick ) {
+                    return;
+                }
+    
+                deferred = Base.Deferred();
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+    
+                options = $.extend({}, pick, {
+                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                    swf: opts.swf,
+                    runtimeOrder: opts.runtimeOrder
+                });
+    
+                picker = new FilePicker( options );
+    
+                picker.once( 'ready', deferred.resolve );
+                picker.on( 'select', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                picker.init();
+    
+                this.pickers.push( picker );
+    
+                return deferred.promise();
+            },
+    
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+    
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+    
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+    
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+    
+        // 默认选项。
+        Image.options = {
+    
+            // 默认的图片处理质量
+            quality: 90,
+    
+            // 是否裁剪
+            crop: false,
+    
+            // 是否保留头部信息
+            preserveHeaders: true,
+    
+            // 是否允许放大。
+            allowMagnify: true
+        };
+    
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+    
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+    
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+    
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+    
+        var $ = Base.$,
+            throttle;
+    
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+    
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+    
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: false,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+    
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+    
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+    
+        return Uploader.register({
+            'make-thumb': 'makeThumb',
+            'before-send-file': 'compressImage'
+        }, {
+    
+    
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             *
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+    
+                opts = $.extend({}, this.options.thumb );
+    
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+    
+                width = width || opts.width;
+                height = height || opts.height;
+    
+                image = new Image( opts );
+    
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( width, height );
+                });
+    
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+    
+                image.once( 'error', function() {
+                    cb( true );
+                    image.destroy();
+                });
+    
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+    
+            compressImage: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 300 * 1024,
+                    image, deferred;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+    
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+    
+                image = new Image( opts );
+    
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( opts.width, opts.height );
+                });
+    
+                image.once( 'complete', function() {
+                    var blob, size;
+    
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+    
+                        size = file.size;
+    
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+    
+                            file.trigger( 'resize', blob.size, size );
+                        }
+    
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+    
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+    
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+    
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+    
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+    
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+    
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+    
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application'
+             */
+            this.type = source.type || 'application';
+    
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+    
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+    
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+    
+    
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+    
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+    
+            this.source = source;
+            this.loaded = 0;
+    
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+    
+        $.extend( WUFile.prototype, {
+    
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+    
+                var prevStatus = statusMap[ this.id ];
+    
+                typeof text !== 'undefined' && (this.statusText = text);
+    
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+    
+            },
+    
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+    
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+    
+            destory: function() {
+                delete statusMap[ this.id ];
+            }
+        });
+    
+        Mediator.installTo( WUFile.prototype );
+    
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+    
+        return WUFile;
+    });
+    
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+    
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+    
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+    
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被移除的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0
+            };
+    
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+    
+            // 存储所有文件
+            this._map = {};
+        }
+    
+        $.extend( Queue.prototype, {
+    
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+    
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+    
+                status = status || STATUS.QUEUED;
+    
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+    
+                return null;
+            },
+    
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+    
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+    
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+    
+                    ret.push( file );
+                }
+    
+                return ret;
+            },
+    
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+    
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+    
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+    
+                file.setStatus( STATUS.QUEUED );
+            },
+    
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+    
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+    
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+                }
+    
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+    
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+    
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+    
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+                }
+            }
+    
+        });
+    
+        Mediator.installTo( Queue.prototype );
+    
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+    
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+    
+        return Uploader.register({
+            'sort-files': 'sortFiles',
+            'add-file': 'addFiles',
+            'get-file': 'getFile',
+            'fetch-file': 'fetchFile',
+            'get-stats': 'getStats',
+            'get-files': 'getFiles',
+            'remove-file': 'removeFile',
+            'retry': 'retry',
+            'reset': 'reset',
+            'accept-file': 'acceptFile'
+        }, {
+    
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+    
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+    
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+    
+                    me.accept = new RegExp( accept, 'i' );
+                }
+    
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+    
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+    
+    
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+    
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+    
+                    file = new WUFile( file );
+                }
+    
+                return file;
+            },
+    
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || file.size < 6 || this.accept &&
+    
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+    
+                return !invalid;
+            },
+    
+    
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+    
+            _addFile: function( file ) {
+                var me = this;
+    
+                file = me._wrapFile( file );
+    
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+    
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+    
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+    
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+    
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFiles: function( files ) {
+                var me = this;
+    
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+    
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+    
+                me.owner.trigger( 'filesQueued', files );
+    
+                if ( me.options.auto ) {
+                    me.request('start-upload');
+                }
+            },
+    
+            getStats: function() {
+                return this.stats;
+            },
+    
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file ) {
+                var me = this;
+    
+                file = file.id ? file : me.queue.getFile( file );
+    
+                file.setStatus( Status.CANCELLED );
+                me.owner.trigger( 'fileDequeued', file );
+            },
+    
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+    
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+    
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+    
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+    
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+    
+                me.request('start-upload');
+            },
+    
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            }
+        });
+    
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+    
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+    
+        return Uploader.register({
+            'predict-runtime-type': 'predictRuntmeType'
+        }, {
+    
+            init: function() {
+                if ( !this.predictRuntmeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+    
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntmeType() => String
+             * @method predictRuntmeType
+             * @for  Uploader
+             */
+            predictRuntmeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+    
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+    
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+    
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+    
+        var $ = Base.$;
+    
+        function Transport( opts ) {
+            var me = this;
+    
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+    
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+    
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+    
+        Transport.options = {
+            server: '',
+            method: 'POST',
+    
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+    
+        $.extend( Transport.prototype, {
+    
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+    
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+    
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+    
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+    
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+    
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+    
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+    
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+    
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+    
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+    
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+    
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+    
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+    
+                if ( !duration ) {
+                    return;
+                }
+    
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+    
+        });
+    
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+    
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+    
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+    
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+    
+    
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+    
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+    
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+    
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+    
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+    
+    
+            /**
+             * @property {Object} [formData]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: null
+    
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+    
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+    
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+    
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len;
+    
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+    
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++
+                });
+                start += len;
+            }
+    
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+    
+            return {
+                file: file,
+    
+                has: function() {
+                    return !!pending.length;
+                },
+    
+                fetch: function() {
+                    return pending.shift();
+                }
+            };
+        }
+    
+        Uploader.register({
+            'start-upload': 'start',
+            'stop-upload': 'stop',
+            'skip-file': 'skipFile',
+            'is-in-progress': 'isInProgress'
+        }, {
+    
+            init: function() {
+                var owner = this.owner;
+    
+                this.runing = false;
+    
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+    
+                // 缓存即将上传的文件。
+                this.pending = [];
+    
+                // 跟踪还有多少分片没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+    
+                owner.on( 'uploadComplete', function( file ) {
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+    
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+    
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             * @grammar upload() => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            start: function() {
+                var me = this;
+    
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+    
+                if ( me.runing ) {
+                    return;
+                }
+    
+                me.runing = true;
+    
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+    
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        file.setStatus( Status.PROGRESS );
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+    
+                me._trigged = false;
+                me.owner.trigger('startUpload');
+                Base.nextTick( me.__tick );
+            },
+    
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stop: function( interrupt ) {
+                var me = this;
+    
+                if ( me.runing === false ) {
+                    return;
+                }
+    
+                me.runing = false;
+    
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+    
+                me.owner.trigger('stopUpload');
+            },
+    
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.runing;
+            },
+    
+            getStats: function() {
+                return this.request('get-stats');
+            },
+    
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = this.request( 'get-file', file );
+    
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+    
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+    
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+    
+                this.owner.trigger( 'uploadSkip', file );
+            },
+    
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+    
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+    
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+    
+                    fn = function( val ) {
+                        me._promise = null;
+    
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+    
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+    
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me.getStats().numOfQueue ) {
+                    me.runing = false;
+    
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+    
+            _nextBlock: function() {
+                var me = this,
+                    act = me._act,
+                    opts = me.options,
+                    next, done;
+    
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( act && act.has() &&
+                        act.file.getStatus() === Status.PROGRESS ) {
+    
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+    
+                    return act.fetch();
+    
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+    
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me.getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+    
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+    
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me._act = act;
+                        return act.fetch();
+                    };
+    
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    return isPromise( next ) ?
+                            next[ next.pipe ? 'pipe' : 'then']( done ) :
+                            done( next );
+                }
+            },
+    
+    
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+    
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+    
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.QUEUED ) {
+                            me.owner.trigger( 'uploadStart', file );
+                            file.setStatus( Status.PROGRESS );
+                            return file;
+                        }
+    
+                        return me._finishFile( file );
+                    });
+    
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+    
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+    
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+    
+                    pending.push( promise );
+                }
+            },
+    
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+    
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+    
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+    
+                me.pool.push( block );
+                me.remaning++;
+    
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+    
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+    
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+    
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+    
+    
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+    
+    
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+    
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+    
+                block.transport = tr;
+    
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+    
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    var totalPercent = 0,
+                        uploaded = 0;
+    
+                    // 可能没有abort掉,progress还是执行进来了。
+                    // if ( !file.blocks ) {
+                    //     return;
+                    // }
+    
+                    totalPercent = block.percentage = percentage;
+    
+                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。
+                        $.each( file.blocks, function( _, v ) {
+                            uploaded += (v.percentage || 0) * (v.end - v.start);
+                        });
+    
+                        totalPercent = uploaded / file.size;
+                    }
+    
+                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+                });
+    
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+    
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+    
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+    
+                    return reject;
+                };
+    
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+    
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+    
+                        block.retried++;
+                        tr.send();
+    
+                    } else {
+    
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+    
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+    
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+    
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+    
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+    
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+    
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+    
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+    
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+    
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+    
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+    
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+    
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            }
+    
+        });
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+    
+        function CompBase( owner, runtime ) {
+    
+            this.owner = owner;
+            this.options = owner.options;
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+    
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+    
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var type = 'html5',
+            components = {};
+    
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destory = this.destory;
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+    
+            me.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+    
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+    
+        });
+    
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+    
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+    
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+    
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+    
+                blob = slice.call( blob, start, end );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var $ = Base.$;
+    
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    lable = $( document.createElement('label') ),
+                    input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+    
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+    
+                lable.on( 'click', function() {
+                    input.trigger('click');
+                });
+    
+                lable.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+    
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+    
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+    
+                    input.attr( 'accept', arr.join(',') );
+                }
+    
+                container.append( input );
+                container.append( lable );
+    
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+    
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+    
+                    me.files = e.target.files;
+    
+                    // reset input
+                    clone = this.cloneNode( true );
+                    this.parentNode.replaceChild( clone, this );
+    
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+    
+                    owner.trigger('change');
+                });
+    
+                lable.on( 'mouseenter mouseleave', mouseHandler );
+    
+            },
+    
+    
+            getFiles: function() {
+                return this.files;
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/util',[
+        'base'
+    ], function( Base ) {
+    
+        var urlAPI = window.createObjectURL && window ||
+                window.URL && URL.revokeObjectURL && URL ||
+                window.webkitURL,
+            createObjectURL = Base.noop,
+            revokeObjectURL = createObjectURL;
+    
+        if ( urlAPI ) {
+    
+            // 更安全的方式调用,比如android里面就能把context改成其他的对象。
+            createObjectURL = function() {
+                return urlAPI.createObjectURL.apply( urlAPI, arguments );
+            };
+    
+            revokeObjectURL = function() {
+                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
+            };
+        }
+    
+        return {
+            createObjectURL: createObjectURL,
+            revokeObjectURL: revokeObjectURL,
+    
+            dataURL2Blob: function( dataURI ) {
+                var byteStr, intArray, ab, i, mimetype, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                ab = new ArrayBuffer( byteStr.length );
+                intArray = new Uint8Array( ab );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
+    
+                return this.arrayBufferToBlob( ab, mimetype );
+            },
+    
+            dataURL2ArrayBuffer: function( dataURI ) {
+                var byteStr, intArray, i, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                intArray = new Uint8Array( byteStr.length );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                return intArray.buffer;
+            },
+    
+            arrayBufferToBlob: function( buffer, type ) {
+                var builder = window.BlobBuilder || window.WebKitBlobBuilder,
+                    bb;
+    
+                // android不支持直接new Blob, 只能借助blobbuilder.
+                if ( builder ) {
+                    bb = new builder();
+                    bb.append( buffer );
+                    return bb.getBlob( type );
+                }
+    
+                return new Blob([ buffer ], type ? { type: type } : {} );
+            },
+    
+            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
+            // 你得到的结果是png.
+            canvasToDataUrl: function( canvas, type, quality ) {
+                return canvas.toDataURL( type, quality / 100 );
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            parseMeta: function( blob, callback ) {
+                callback( false, {});
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            updateImageHead: function( data ) {
+                return data;
+            }
+        };
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/imagemeta',[
+        'runtime/html5/util'
+    ], function( Util ) {
+    
+        var api;
+    
+        api = {
+            parsers: {
+                0xffe1: []
+            },
+    
+            maxMetaDataSize: 262144,
+    
+            parse: function( blob, cb ) {
+                var me = this,
+                    fr = new FileReader();
+    
+                fr.onload = function() {
+                    cb( false, me._parse( this.result ) );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                fr.onerror = function( e ) {
+                    cb( e.message );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                blob = blob.slice( 0, me.maxMetaDataSize );
+                fr.readAsArrayBuffer( blob.getSource() );
+            },
+    
+            _parse: function( buffer, noParse ) {
+                if ( buffer.byteLength < 6 ) {
+                    return;
+                }
+    
+                var dataview = new DataView( buffer ),
+                    offset = 2,
+                    maxOffset = dataview.byteLength - 4,
+                    headLength = offset,
+                    ret = {},
+                    markerBytes, markerLength, parsers, i;
+    
+                if ( dataview.getUint16( 0 ) === 0xffd8 ) {
+    
+                    while ( offset < maxOffset ) {
+                        markerBytes = dataview.getUint16( offset );
+    
+                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
+                                markerBytes === 0xfffe ) {
+    
+                            markerLength = dataview.getUint16( offset + 2 ) + 2;
+    
+                            if ( offset + markerLength > dataview.byteLength ) {
+                                break;
+                            }
+    
+                            parsers = api.parsers[ markerBytes ];
+    
+                            if ( !noParse && parsers ) {
+                                for ( i = 0; i < parsers.length; i += 1 ) {
+                                    parsers[ i ].call( api, dataview, offset,
+                                            markerLength, ret );
+                                }
+                            }
+    
+                            offset += markerLength;
+                            headLength = offset;
+                        } else {
+                            break;
+                        }
+                    }
+    
+                    if ( headLength > 6 ) {
+                        if ( buffer.slice ) {
+                            ret.imageHead = buffer.slice( 2, headLength );
+                        } else {
+                            // Workaround for IE10, which does not yet
+                            // support ArrayBuffer.slice:
+                            ret.imageHead = new Uint8Array( buffer )
+                                    .subarray( 2, headLength );
+                        }
+                    }
+                }
+    
+                return ret;
+            },
+    
+            updateImageHead: function( buffer, head ) {
+                var data = this._parse( buffer, true ),
+                    buf1, buf2, bodyoffset;
+    
+    
+                bodyoffset = 2;
+                if ( data.imageHead ) {
+                    bodyoffset = 2 + data.imageHead.byteLength;
+                }
+    
+                if ( buffer.slice ) {
+                    buf2 = buffer.slice( bodyoffset );
+                } else {
+                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
+                }
+    
+                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
+    
+                buf1[ 0 ] = 0xFF;
+                buf1[ 1 ] = 0xD8;
+                buf1.set( new Uint8Array( head ), 2 );
+                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
+    
+                return buf1.buffer;
+            }
+        };
+    
+        Util.parseMeta = function() {
+            return api.parse.apply( api, arguments );
+        };
+    
+        Util.updateImageHead = function() {
+            return api.updateImageHead.apply( api, arguments );
+        };
+    
+        return api;
+    });
+    /**
+     * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
+     * 暂时项目中只用了orientation.
+     *
+     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
+     * @fileOverview EXIF解析
+     */
+    
+    // Sample
+    // ====================================
+    // Make : Apple
+    // Model : iPhone 4S
+    // Orientation : 1
+    // XResolution : 72 [72/1]
+    // YResolution : 72 [72/1]
+    // ResolutionUnit : 2
+    // Software : QuickTime 7.7.1
+    // DateTime : 2013:09:01 22:53:55
+    // ExifIFDPointer : 190
+    // ExposureTime : 0.058823529411764705 [1/17]
+    // FNumber : 2.4 [12/5]
+    // ExposureProgram : Normal program
+    // ISOSpeedRatings : 800
+    // ExifVersion : 0220
+    // DateTimeOriginal : 2013:09:01 22:52:51
+    // DateTimeDigitized : 2013:09:01 22:52:51
+    // ComponentsConfiguration : YCbCr
+    // ShutterSpeedValue : 4.058893515764426
+    // ApertureValue : 2.5260688216892597 [4845/1918]
+    // BrightnessValue : -0.3126686601998395
+    // MeteringMode : Pattern
+    // Flash : Flash did not fire, compulsory flash mode
+    // FocalLength : 4.28 [107/25]
+    // SubjectArea : [4 values]
+    // FlashpixVersion : 0100
+    // ColorSpace : 1
+    // PixelXDimension : 2448
+    // PixelYDimension : 3264
+    // SensingMethod : One-chip color area sensor
+    // ExposureMode : 0
+    // WhiteBalance : Auto white balance
+    // FocalLengthIn35mmFilm : 35
+    // SceneCaptureType : Standard
+    define('runtime/html5/imagemeta/exif',[
+        'base',
+        'runtime/html5/imagemeta'
+    ], function( Base, ImageMeta ) {
+    
+        var EXIF = {};
+    
+        EXIF.ExifMap = function() {
+            return this;
+        };
+    
+        EXIF.ExifMap.prototype.map = {
+            'Orientation': 0x0112
+        };
+    
+        EXIF.ExifMap.prototype.get = function( id ) {
+            return this[ id ] || this[ this.map[ id ] ];
+        };
+    
+        EXIF.exifTagTypes = {
+            // byte, 8-bit unsigned int:
+            1: {
+                getValue: function( dataView, dataOffset ) {
+                    return dataView.getUint8( dataOffset );
+                },
+                size: 1
+            },
+    
+            // ascii, 8-bit byte:
+            2: {
+                getValue: function( dataView, dataOffset ) {
+                    return String.fromCharCode( dataView.getUint8( dataOffset ) );
+                },
+                size: 1,
+                ascii: true
+            },
+    
+            // short, 16 bit int:
+            3: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint16( dataOffset, littleEndian );
+                },
+                size: 2
+            },
+    
+            // long, 32 bit int:
+            4: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // rational = two long values,
+            // first is numerator, second is denominator:
+            5: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian ) /
+                        dataView.getUint32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            },
+    
+            // slong, 32 bit signed int:
+            9: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // srational, two slongs, first is numerator, second is denominator:
+            10: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian ) /
+                        dataView.getInt32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            }
+        };
+    
+        // undefined, 8-bit byte, value depending on field:
+        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
+    
+        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
+                littleEndian ) {
+    
+            var tagType = EXIF.exifTagTypes[ type ],
+                tagSize, dataOffset, values, i, str, c;
+    
+            if ( !tagType ) {
+                Base.log('Invalid Exif data: Invalid tag type.');
+                return;
+            }
+    
+            tagSize = tagType.size * length;
+    
+            // Determine if the value is contained in the dataOffset bytes,
+            // or if the value at the dataOffset is a pointer to the actual data:
+            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
+                    littleEndian ) : (offset + 8);
+    
+            if ( dataOffset + tagSize > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid data offset.');
+                return;
+            }
+    
+            if ( length === 1 ) {
+                return tagType.getValue( dataView, dataOffset, littleEndian );
+            }
+    
+            values = [];
+    
+            for ( i = 0; i < length; i += 1 ) {
+                values[ i ] = tagType.getValue( dataView,
+                        dataOffset + i * tagType.size, littleEndian );
+            }
+    
+            if ( tagType.ascii ) {
+                str = '';
+    
+                // Concatenate the chars:
+                for ( i = 0; i < values.length; i += 1 ) {
+                    c = values[ i ];
+    
+                    // Ignore the terminating NULL byte(s):
+                    if ( c === '\u0000' ) {
+                        break;
+                    }
+                    str += c;
+                }
+    
+                return str;
+            }
+            return values;
+        };
+    
+        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
+                data ) {
+    
+            var tag = dataView.getUint16( offset, littleEndian );
+            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
+                    dataView.getUint16( offset + 2, littleEndian ),    // tag type
+                    dataView.getUint32( offset + 4, littleEndian ),    // tag length
+                    littleEndian );
+        };
+    
+        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
+                littleEndian, data ) {
+    
+            var tagsNumber, dirEndOffset, i;
+    
+            if ( dirOffset + 6 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory offset.');
+                return;
+            }
+    
+            tagsNumber = dataView.getUint16( dirOffset, littleEndian );
+            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
+    
+            if ( dirEndOffset + 4 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory size.');
+                return;
+            }
+    
+            for ( i = 0; i < tagsNumber; i += 1 ) {
+                this.parseExifTag( dataView, tiffOffset,
+                        dirOffset + 2 + 12 * i,    // tag offset
+                        littleEndian, data );
+            }
+    
+            // Return the offset to the next directory:
+            return dataView.getUint32( dirEndOffset, littleEndian );
+        };
+    
+        // EXIF.getExifThumbnail = function(dataView, offset, length) {
+        //     var hexData,
+        //         i,
+        //         b;
+        //     if (!length || offset + length > dataView.byteLength) {
+        //         Base.log('Invalid Exif data: Invalid thumbnail data.');
+        //         return;
+        //     }
+        //     hexData = [];
+        //     for (i = 0; i < length; i += 1) {
+        //         b = dataView.getUint8(offset + i);
+        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));
+        //     }
+        //     return 'data:image/jpeg,%' + hexData.join('%');
+        // };
+    
+        EXIF.parseExifData = function( dataView, offset, length, data ) {
+    
+            var tiffOffset = offset + 10,
+                littleEndian, dirOffset;
+    
+            // Check for the ASCII code for "Exif" (0x45786966):
+            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
+                // No Exif data, might be XMP data instead
+                return;
+            }
+            if ( tiffOffset + 8 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid segment size.');
+                return;
+            }
+    
+            // Check for the two null bytes:
+            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
+                Base.log('Invalid Exif data: Missing byte alignment offset.');
+                return;
+            }
+    
+            // Check the byte alignment:
+            switch ( dataView.getUint16( tiffOffset ) ) {
+                case 0x4949:
+                    littleEndian = true;
+                    break;
+    
+                case 0x4D4D:
+                    littleEndian = false;
+                    break;
+    
+                default:
+                    Base.log('Invalid Exif data: Invalid byte alignment marker.');
+                    return;
+            }
+    
+            // Check for the TIFF tag marker (0x002A):
+            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
+                Base.log('Invalid Exif data: Missing TIFF marker.');
+                return;
+            }
+    
+            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
+            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
+            // Create the exif object to store the tags:
+            data.exif = new EXIF.ExifMap();
+            // Parse the tags of the main image directory and retrieve the
+            // offset to the next directory, usually the thumbnail directory:
+            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
+                    tiffOffset + dirOffset, littleEndian, data );
+    
+            // 尝试读取缩略图
+            // if ( dirOffset ) {
+            //     thumbnailData = {exif: {}};
+            //     dirOffset = EXIF.parseExifTags(
+            //         dataView,
+            //         tiffOffset,
+            //         tiffOffset + dirOffset,
+            //         littleEndian,
+            //         thumbnailData
+            //     );
+    
+            //     // Check for JPEG Thumbnail offset:
+            //     if (thumbnailData.exif[0x0201]) {
+            //         data.exif.Thumbnail = EXIF.getExifThumbnail(
+            //             dataView,
+            //             tiffOffset + thumbnailData.exif[0x0201],
+            //             thumbnailData.exif[0x0202] // Thumbnail data length
+            //         );
+            //     }
+            // }
+        };
+    
+        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
+        return EXIF;
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('runtime/html5/image',[
+        'base',
+        'runtime/html5/runtime',
+        'runtime/html5/util'
+    ], function( Base, Html5Runtime, Util ) {
+    
+        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
+    
+        return Html5Runtime.register( 'Image', {
+    
+            // flag: 标记是否被修改过。
+            modified: false,
+    
+            init: function() {
+                var me = this,
+                    img = new Image();
+    
+                img.onload = function() {
+    
+                    me._info = {
+                        type: me.type,
+                        width: this.width,
+                        height: this.height
+                    };
+    
+                    // 读取meta信息。
+                    if ( !me._metas && 'image/jpeg' === me.type ) {
+                        Util.parseMeta( me._blob, function( error, ret ) {
+                            me._metas = ret;
+                            me.owner.trigger('load');
+                        });
+                    } else {
+                        me.owner.trigger('load');
+                    }
+                };
+    
+                img.onerror = function() {
+                    me.owner.trigger('error');
+                };
+    
+                me._img = img;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    img = me._img;
+    
+                me._blob = blob;
+                me.type = blob.type;
+                img.src = Util.createObjectURL( blob.getSource() );
+                me.owner.once( 'load', function() {
+                    Util.revokeObjectURL( img.src );
+                });
+            },
+    
+            resize: function( width, height ) {
+                var canvas = this._canvas ||
+                        (this._canvas = document.createElement('canvas'));
+    
+                this._resize( this._img, canvas, width, height );
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger('complete');
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this._blob,
+                    opts = this.options,
+                    canvas;
+    
+                type = type || this.type;
+    
+                // blob需要重新生成。
+                if ( this.modified || this.type !== type ) {
+                    canvas = this._canvas;
+    
+                    if ( type === 'image/jpeg' ) {
+    
+                        blob = Util.canvasToDataUrl( canvas, 'image/jpeg',
+                                opts.quality );
+    
+                        if ( opts.preserveHeaders && this._metas &&
+                                this._metas.imageHead ) {
+    
+                            blob = Util.dataURL2ArrayBuffer( blob );
+                            blob = Util.updateImageHead( blob,
+                                    this._metas.imageHead );
+                            blob = Util.arrayBufferToBlob( blob, type );
+                            return blob;
+                        }
+                    } else {
+                        blob = Util.canvasToDataUrl( canvas, type );
+                    }
+    
+                    blob = Util.dataURL2Blob( blob );
+                }
+    
+                return blob;
+            },
+    
+            getAsDataUrl: function( type ) {
+                var opts = this.options;
+    
+                type = type || this.type;
+    
+                if ( type === 'image/jpeg' ) {
+                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );
+                } else {
+                    return this._canvas.toDataURL( type );
+                }
+            },
+    
+            getOrientation: function() {
+                return this._metas && this._metas.exif &&
+                        this._metas.exif.get('Orientation') || 1;
+            },
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            destroy: function() {
+                var canvas = this._canvas;
+                this._img.onload = null;
+    
+                if ( canvas ) {
+                    canvas.getContext('2d')
+                            .clearRect( 0, 0, canvas.width, canvas.height );
+                    canvas.width = canvas.height = 0;
+                    this._canvas = null;
+                }
+    
+                // 释放内存。非常重要,否则释放不了image的内存。
+                this._img.src = BLANK;
+                this._img = this._blob = null;
+            },
+    
+            _resize: function( img, cvs, width, height ) {
+                var opts = this.options,
+                    naturalWidth = img.width,
+                    naturalHeight = img.height,
+                    orientation = this.getOrientation(),
+                    scale, w, h, x, y;
+    
+                // values that require 90 degree rotation
+                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+    
+                    // 交换width, height的值。
+                    width ^= height;
+                    height ^= width;
+                    width ^= height;
+                }
+    
+                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
+                        height / naturalHeight );
+    
+                // 不允许放大。
+                opts.allowMagnify || (scale = Math.min( 1, scale ));
+    
+                w = naturalWidth * scale;
+                h = naturalHeight * scale;
+    
+                if ( opts.crop ) {
+                    cvs.width = width;
+                    cvs.height = height;
+                } else {
+                    cvs.width = w;
+                    cvs.height = h;
+                }
+    
+                x = (cvs.width - w) / 2;
+                y = (cvs.height - h) / 2;
+    
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+    
+                this._renderImageToCanvas( cvs, img, x, y, w, h );
+            },
+    
+            _rotate2Orientaion: function( canvas, orientation ) {
+                var width = canvas.width,
+                    height = canvas.height,
+                    ctx = canvas.getContext('2d');
+    
+                switch ( orientation ) {
+                    case 5:
+                    case 6:
+                    case 7:
+                    case 8:
+                        canvas.width = height;
+                        canvas.height = width;
+                        break;
+                }
+    
+                switch ( orientation ) {
+                    case 2:    // horizontal flip
+                        ctx.translate( width, 0 );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 3:    // 180 rotate left
+                        ctx.translate( width, height );
+                        ctx.rotate( Math.PI );
+                        break;
+    
+                    case 4:    // vertical flip
+                        ctx.translate( 0, height );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 5:    // vertical flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 6:    // 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( 0, -height );
+                        break;
+    
+                    case 7:    // horizontal flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( width, -height );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 8:    // 90 rotate left
+                        ctx.rotate( -0.5 * Math.PI );
+                        ctx.translate( -width, 0 );
+                        break;
+                }
+            },
+    
+            // https://github.com/stomita/ios-imagefile-megapixel/
+            // blob/master/src/megapix-image.js
+            _renderImageToCanvas: (function() {
+    
+                // 如果不是ios, 不需要这么复杂!
+                if ( !Base.os.ios ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        canvas.getContext('2d').drawImage( img, x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detecting vertical squash in loaded image.
+                 * Fixes a bug which squash image vertically while drawing into
+                 * canvas for some images.
+                 */
+                function detectVerticalSquash( img, iw, ih ) {
+                    var canvas = document.createElement('canvas'),
+                        ctx = canvas.getContext('2d'),
+                        sy = 0,
+                        ey = ih,
+                        py = ih,
+                        data, alpha, ratio;
+    
+    
+                    canvas.width = 1;
+                    canvas.height = ih;
+                    ctx.drawImage( img, 0, 0 );
+                    data = ctx.getImageData( 0, 0, 1, ih ).data;
+    
+                    // search image edge pixel position in case
+                    // it is squashed vertically.
+                    while ( py > sy ) {
+                        alpha = data[ (py - 1) * 4 + 3 ];
+    
+                        if ( alpha === 0 ) {
+                            ey = py;
+                        } else {
+                            sy = py;
+                        }
+    
+                        py = (ey + sy) >> 1;
+                    }
+    
+                    ratio = (py / ih);
+                    return (ratio === 0) ? 1 : ratio;
+                }
+    
+                // fix ie7 bug
+                // http://stackoverflow.com/questions/11929099/
+                // html5-canvas-drawimage-ratio-bug-ios
+                if ( Base.os.ios >= 7 ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        var iw = img.naturalWidth,
+                            ih = img.naturalHeight,
+                            vertSquashRatio = detectVerticalSquash( img, iw, ih );
+    
+                        return canvas.getContext('2d').drawImage( img, 0, 0,
+                            iw * vertSquashRatio, ih * vertSquashRatio,
+                            x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detect subsampling in loaded image.
+                 * In iOS, larger images than 2M pixels may be
+                 * subsampled in rendering.
+                 */
+                function detectSubsampling( img ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        canvas, ctx;
+    
+                    // subsampling may happen overmegapixel image
+                    if ( iw * ih > 1024 * 1024 ) {
+                        canvas = document.createElement('canvas');
+                        canvas.width = canvas.height = 1;
+                        ctx = canvas.getContext('2d');
+                        ctx.drawImage( img, -iw + 1, 0 );
+    
+                        // subsampled image becomes half smaller in rendering size.
+                        // check alpha channel value to confirm image is covering
+                        // edge pixel or not. if alpha value is 0
+                        // image is not covering, hence subsampled.
+                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
+                    } else {
+                        return false;
+                    }
+                }
+    
+    
+                return function( canvas, img, x, y, width, height ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        ctx = canvas.getContext('2d'),
+                        subsampled = detectSubsampling( img ),
+                        doSquash = this.type === 'image/jpeg',
+                        d = 1024,
+                        sy = 0,
+                        dy = 0,
+                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
+    
+                    if ( subsampled ) {
+                        iw /= 2;
+                        ih /= 2;
+                    }
+    
+                    ctx.save();
+                    tmpCanvas = document.createElement('canvas');
+                    tmpCanvas.width = tmpCanvas.height = d;
+    
+                    tmpCtx = tmpCanvas.getContext('2d');
+                    vertSquashRatio = doSquash ?
+                            detectVerticalSquash( img, iw, ih ) : 1;
+    
+                    dw = Math.ceil( d * width / iw );
+                    dh = Math.ceil( d * height / ih / vertSquashRatio );
+    
+                    while ( sy < ih ) {
+                        sx = 0;
+                        dx = 0;
+                        while ( sx < iw ) {
+                            tmpCtx.clearRect( 0, 0, d, d );
+                            tmpCtx.drawImage( img, -sx, -sy );
+                            ctx.drawImage( tmpCanvas, 0, 0, d, d,
+                                    x + dx, y + dy, dw, dh );
+                            sx += d;
+                            dx += dw;
+                        }
+                        sy += d;
+                        dy += dh;
+                    }
+                    ctx.restore();
+                    tmpCanvas = tmpCtx = null;
+                };
+            })()
+        });
+    });
+    /**
+     * 这个方式性能不行,但是可以解决android里面的toDataUrl的bug
+     * android里面toDataUrl('image/jpege')得到的结果却是png.
+     *
+     * 所以这里没辙,只能借助这个工具
+     * @fileOverview jpeg encoder
+     */
+    define('runtime/html5/jpegencoder',[], function( require, exports, module ) {
+    
+        /*
+          Copyright (c) 2008, Adobe Systems Incorporated
+          All rights reserved.
+    
+          Redistribution and use in source and binary forms, with or without
+          modification, are permitted provided that the following conditions are
+          met:
+    
+          * Redistributions of source code must retain the above copyright notice,
+            this list of conditions and the following disclaimer.
+    
+          * Redistributions in binary form must reproduce the above copyright
+            notice, this list of conditions and the following disclaimer in the
+            documentation and/or other materials provided with the distribution.
+    
+          * Neither the name of Adobe Systems Incorporated nor the names of its
+            contributors may be used to endorse or promote products derived from
+            this software without specific prior written permission.
+    
+          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+          IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+          PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+          CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+          EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+          PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+          PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+          NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+          SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+        */
+        /*
+        JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009
+    
+        Basic GUI blocking jpeg encoder
+        */
+    
+        function JPEGEncoder(quality) {
+          var self = this;
+            var fround = Math.round;
+            var ffloor = Math.floor;
+            var YTable = new Array(64);
+            var UVTable = new Array(64);
+            var fdtbl_Y = new Array(64);
+            var fdtbl_UV = new Array(64);
+            var YDC_HT;
+            var UVDC_HT;
+            var YAC_HT;
+            var UVAC_HT;
+    
+            var bitcode = new Array(65535);
+            var category = new Array(65535);
+            var outputfDCTQuant = new Array(64);
+            var DU = new Array(64);
+            var byteout = [];
+            var bytenew = 0;
+            var bytepos = 7;
+    
+            var YDU = new Array(64);
+            var UDU = new Array(64);
+            var VDU = new Array(64);
+            var clt = new Array(256);
+            var RGB_YUV_TABLE = new Array(2048);
+            var currentQuality;
+    
+            var ZigZag = [
+                     0, 1, 5, 6,14,15,27,28,
+                     2, 4, 7,13,16,26,29,42,
+                     3, 8,12,17,25,30,41,43,
+                     9,11,18,24,31,40,44,53,
+                    10,19,23,32,39,45,52,54,
+                    20,22,33,38,46,51,55,60,
+                    21,34,37,47,50,56,59,61,
+                    35,36,48,49,57,58,62,63
+                ];
+    
+            var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
+            var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
+            var std_ac_luminance_values = [
+                    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
+                    0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
+                    0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
+                    0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
+                    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
+                    0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
+                    0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
+                    0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
+                    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
+                    0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
+                    0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
+                    0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
+                    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
+                    0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
+                    0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
+                    0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
+                    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
+                    0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
+                    0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
+                    0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+    
+            var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
+            var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
+            var std_ac_chrominance_values = [
+                    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
+                    0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
+                    0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
+                    0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
+                    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
+                    0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
+                    0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
+                    0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
+                    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
+                    0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
+                    0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
+                    0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
+                    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
+                    0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
+                    0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
+                    0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
+                    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
+                    0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
+                    0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
+                    0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+    
+            function initQuantTables(sf){
+                    var YQT = [
+                        16, 11, 10, 16, 24, 40, 51, 61,
+                        12, 12, 14, 19, 26, 58, 60, 55,
+                        14, 13, 16, 24, 40, 57, 69, 56,
+                        14, 17, 22, 29, 51, 87, 80, 62,
+                        18, 22, 37, 56, 68,109,103, 77,
+                        24, 35, 55, 64, 81,104,113, 92,
+                        49, 64, 78, 87,103,121,120,101,
+                        72, 92, 95, 98,112,100,103, 99
+                    ];
+    
+                    for (var i = 0; i < 64; i++) {
+                        var t = ffloor((YQT[i]*sf+50)/100);
+                        if (t < 1) {
+                            t = 1;
+                        } else if (t > 255) {
+                            t = 255;
+                        }
+                        YTable[ZigZag[i]] = t;
+                    }
+                    var UVQT = [
+                        17, 18, 24, 47, 99, 99, 99, 99,
+                        18, 21, 26, 66, 99, 99, 99, 99,
+                        24, 26, 56, 99, 99, 99, 99, 99,
+                        47, 66, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99
+                    ];
+                    for (var j = 0; j < 64; j++) {
+                        var u = ffloor((UVQT[j]*sf+50)/100);
+                        if (u < 1) {
+                            u = 1;
+                        } else if (u > 255) {
+                            u = 255;
+                        }
+                        UVTable[ZigZag[j]] = u;
+                    }
+                    var aasf = [
+                        1.0, 1.387039845, 1.306562965, 1.175875602,
+                        1.0, 0.785694958, 0.541196100, 0.275899379
+                    ];
+                    var k = 0;
+                    for (var row = 0; row < 8; row++)
+                    {
+                        for (var col = 0; col < 8; col++)
+                        {
+                            fdtbl_Y[k]  = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            k++;
+                        }
+                    }
+                }
+    
+                function computeHuffmanTbl(nrcodes, std_table){
+                    var codevalue = 0;
+                    var pos_in_table = 0;
+                    var HT = new Array();
+                    for (var k = 1; k <= 16; k++) {
+                        for (var j = 1; j <= nrcodes[k]; j++) {
+                            HT[std_table[pos_in_table]] = [];
+                            HT[std_table[pos_in_table]][0] = codevalue;
+                            HT[std_table[pos_in_table]][1] = k;
+                            pos_in_table++;
+                            codevalue++;
+                        }
+                        codevalue*=2;
+                    }
+                    return HT;
+                }
+    
+                function initHuffmanTbl()
+                {
+                    YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
+                    UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
+                    YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
+                    UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
+                }
+    
+                function initCategoryNumber()
+                {
+                    var nrlower = 1;
+                    var nrupper = 2;
+                    for (var cat = 1; cat <= 15; cat++) {
+                        //Positive numbers
+                        for (var nr = nrlower; nr<nrupper; nr++) {
+                            category[32767+nr] = cat;
+                            bitcode[32767+nr] = [];
+                            bitcode[32767+nr][1] = cat;
+                            bitcode[32767+nr][0] = nr;
+                        }
+                        //Negative numbers
+                        for (var nrneg =-(nrupper-1); nrneg<=-nrlower; nrneg++) {
+                            category[32767+nrneg] = cat;
+                            bitcode[32767+nrneg] = [];
+                            bitcode[32767+nrneg][1] = cat;
+                            bitcode[32767+nrneg][0] = nrupper-1+nrneg;
+                        }
+                        nrlower <<= 1;
+                        nrupper <<= 1;
+                    }
+                }
+    
+                function initRGBYUVTable() {
+                    for(var i = 0; i < 256;i++) {
+                        RGB_YUV_TABLE[i]            =  19595 * i;
+                        RGB_YUV_TABLE[(i+ 256)>>0]  =  38470 * i;
+                        RGB_YUV_TABLE[(i+ 512)>>0]  =   7471 * i + 0x8000;
+                        RGB_YUV_TABLE[(i+ 768)>>0]  = -11059 * i;
+                        RGB_YUV_TABLE[(i+1024)>>0]  = -21709 * i;
+                        RGB_YUV_TABLE[(i+1280)>>0]  =  32768 * i + 0x807FFF;
+                        RGB_YUV_TABLE[(i+1536)>>0]  = -27439 * i;
+                        RGB_YUV_TABLE[(i+1792)>>0]  = - 5329 * i;
+                    }
+                }
+    
+                // IO functions
+                function writeBits(bs)
+                {
+                    var value = bs[0];
+                    var posval = bs[1]-1;
+                    while ( posval >= 0 ) {
+                        if (value & (1 << posval) ) {
+                            bytenew |= (1 << bytepos);
+                        }
+                        posval--;
+                        bytepos--;
+                        if (bytepos < 0) {
+                            if (bytenew == 0xFF) {
+                                writeByte(0xFF);
+                                writeByte(0);
+                            }
+                            else {
+                                writeByte(bytenew);
+                            }
+                            bytepos=7;
+                            bytenew=0;
+                        }
+                    }
+                }
+    
+                function writeByte(value)
+                {
+                    byteout.push(clt[value]); // write char directly instead of converting later
+                }
+    
+                function writeWord(value)
+                {
+                    writeByte((value>>8)&0xFF);
+                    writeByte((value   )&0xFF);
+                }
+    
+                // DCT & quantization core
+                function fDCTQuant(data, fdtbl)
+                {
+                    var d0, d1, d2, d3, d4, d5, d6, d7;
+                    /* Pass 1: process rows. */
+                    var dataOff=0;
+                    var i;
+                    var I8 = 8;
+                    var I64 = 64;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff+1];
+                        d2 = data[dataOff+2];
+                        d3 = data[dataOff+3];
+                        d4 = data[dataOff+4];
+                        d5 = data[dataOff+5];
+                        d6 = data[dataOff+6];
+                        d7 = data[dataOff+7];
+    
+                        var tmp0 = d0 + d7;
+                        var tmp7 = d0 - d7;
+                        var tmp1 = d1 + d6;
+                        var tmp6 = d1 - d6;
+                        var tmp2 = d2 + d5;
+                        var tmp5 = d2 - d5;
+                        var tmp3 = d3 + d4;
+                        var tmp4 = d3 - d4;
+    
+                        /* Even part */
+                        var tmp10 = tmp0 + tmp3;    /* phase 2 */
+                        var tmp13 = tmp0 - tmp3;
+                        var tmp11 = tmp1 + tmp2;
+                        var tmp12 = tmp1 - tmp2;
+    
+                        data[dataOff] = tmp10 + tmp11; /* phase 3 */
+                        data[dataOff+4] = tmp10 - tmp11;
+    
+                        var z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */
+                        data[dataOff+2] = tmp13 + z1; /* phase 5 */
+                        data[dataOff+6] = tmp13 - z1;
+    
+                        /* Odd part */
+                        tmp10 = tmp4 + tmp5; /* phase 2 */
+                        tmp11 = tmp5 + tmp6;
+                        tmp12 = tmp6 + tmp7;
+    
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */
+                        var z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */
+                        var z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */
+                        var z3 = tmp11 * 0.707106781; /* c4 */
+    
+                        var z11 = tmp7 + z3;    /* phase 5 */
+                        var z13 = tmp7 - z3;
+    
+                        data[dataOff+5] = z13 + z2; /* phase 6 */
+                        data[dataOff+3] = z13 - z2;
+                        data[dataOff+1] = z11 + z4;
+                        data[dataOff+7] = z11 - z4;
+    
+                        dataOff += 8; /* advance pointer to next row */
+                    }
+    
+                    /* Pass 2: process columns. */
+                    dataOff = 0;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff + 8];
+                        d2 = data[dataOff + 16];
+                        d3 = data[dataOff + 24];
+                        d4 = data[dataOff + 32];
+                        d5 = data[dataOff + 40];
+                        d6 = data[dataOff + 48];
+                        d7 = data[dataOff + 56];
+    
+                        var tmp0p2 = d0 + d7;
+                        var tmp7p2 = d0 - d7;
+                        var tmp1p2 = d1 + d6;
+                        var tmp6p2 = d1 - d6;
+                        var tmp2p2 = d2 + d5;
+                        var tmp5p2 = d2 - d5;
+                        var tmp3p2 = d3 + d4;
+                        var tmp4p2 = d3 - d4;
+    
+                        /* Even part */
+                        var tmp10p2 = tmp0p2 + tmp3p2;  /* phase 2 */
+                        var tmp13p2 = tmp0p2 - tmp3p2;
+                        var tmp11p2 = tmp1p2 + tmp2p2;
+                        var tmp12p2 = tmp1p2 - tmp2p2;
+    
+                        data[dataOff] = tmp10p2 + tmp11p2; /* phase 3 */
+                        data[dataOff+32] = tmp10p2 - tmp11p2;
+    
+                        var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781; /* c4 */
+                        data[dataOff+16] = tmp13p2 + z1p2; /* phase 5 */
+                        data[dataOff+48] = tmp13p2 - z1p2;
+    
+                        /* Odd part */
+                        tmp10p2 = tmp4p2 + tmp5p2; /* phase 2 */
+                        tmp11p2 = tmp5p2 + tmp6p2;
+                        tmp12p2 = tmp6p2 + tmp7p2;
+    
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433; /* c6 */
+                        var z2p2 = 0.541196100 * tmp10p2 + z5p2; /* c2-c6 */
+                        var z4p2 = 1.306562965 * tmp12p2 + z5p2; /* c2+c6 */
+                        var z3p2 = tmp11p2 * 0.707106781; /* c4 */
+    
+                        var z11p2 = tmp7p2 + z3p2;  /* phase 5 */
+                        var z13p2 = tmp7p2 - z3p2;
+    
+                        data[dataOff+40] = z13p2 + z2p2; /* phase 6 */
+                        data[dataOff+24] = z13p2 - z2p2;
+                        data[dataOff+ 8] = z11p2 + z4p2;
+                        data[dataOff+56] = z11p2 - z4p2;
+    
+                        dataOff++; /* advance pointer to next column */
+                    }
+    
+                    // Quantize/descale the coefficients
+                    var fDCTQuant;
+                    for (i=0; i<I64; ++i)
+                    {
+                        // Apply the quantization and scaling factor & Round to nearest integer
+                        fDCTQuant = data[i]*fdtbl[i];
+                        outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);
+                        //outputfDCTQuant[i] = fround(fDCTQuant);
+    
+                    }
+                    return outputfDCTQuant;
+                }
+    
+                function writeAPP0()
+                {
+                    writeWord(0xFFE0); // marker
+                    writeWord(16); // length
+                    writeByte(0x4A); // J
+                    writeByte(0x46); // F
+                    writeByte(0x49); // I
+                    writeByte(0x46); // F
+                    writeByte(0); // = "JFIF",'\0'
+                    writeByte(1); // versionhi
+                    writeByte(1); // versionlo
+                    writeByte(0); // xyunits
+                    writeWord(1); // xdensity
+                    writeWord(1); // ydensity
+                    writeByte(0); // thumbnwidth
+                    writeByte(0); // thumbnheight
+                }
+    
+                function writeSOF0(width, height)
+                {
+                    writeWord(0xFFC0); // marker
+                    writeWord(17);   // length, truecolor YUV JPG
+                    writeByte(8);    // precision
+                    writeWord(height);
+                    writeWord(width);
+                    writeByte(3);    // nrofcomponents
+                    writeByte(1);    // IdY
+                    writeByte(0x11); // HVY
+                    writeByte(0);    // QTY
+                    writeByte(2);    // IdU
+                    writeByte(0x11); // HVU
+                    writeByte(1);    // QTU
+                    writeByte(3);    // IdV
+                    writeByte(0x11); // HVV
+                    writeByte(1);    // QTV
+                }
+    
+                function writeDQT()
+                {
+                    writeWord(0xFFDB); // marker
+                    writeWord(132);    // length
+                    writeByte(0);
+                    for (var i=0; i<64; i++) {
+                        writeByte(YTable[i]);
+                    }
+                    writeByte(1);
+                    for (var j=0; j<64; j++) {
+                        writeByte(UVTable[j]);
+                    }
+                }
+    
+                function writeDHT()
+                {
+                    writeWord(0xFFC4); // marker
+                    writeWord(0x01A2); // length
+    
+                    writeByte(0); // HTYDCinfo
+                    for (var i=0; i<16; i++) {
+                        writeByte(std_dc_luminance_nrcodes[i+1]);
+                    }
+                    for (var j=0; j<=11; j++) {
+                        writeByte(std_dc_luminance_values[j]);
+                    }
+    
+                    writeByte(0x10); // HTYACinfo
+                    for (var k=0; k<16; k++) {
+                        writeByte(std_ac_luminance_nrcodes[k+1]);
+                    }
+                    for (var l=0; l<=161; l++) {
+                        writeByte(std_ac_luminance_values[l]);
+                    }
+    
+                    writeByte(1); // HTUDCinfo
+                    for (var m=0; m<16; m++) {
+                        writeByte(std_dc_chrominance_nrcodes[m+1]);
+                    }
+                    for (var n=0; n<=11; n++) {
+                        writeByte(std_dc_chrominance_values[n]);
+                    }
+    
+                    writeByte(0x11); // HTUACinfo
+                    for (var o=0; o<16; o++) {
+                        writeByte(std_ac_chrominance_nrcodes[o+1]);
+                    }
+                    for (var p=0; p<=161; p++) {
+                        writeByte(std_ac_chrominance_values[p]);
+                    }
+                }
+    
+                function writeSOS()
+                {
+                    writeWord(0xFFDA); // marker
+                    writeWord(12); // length
+                    writeByte(3); // nrofcomponents
+                    writeByte(1); // IdY
+                    writeByte(0); // HTY
+                    writeByte(2); // IdU
+                    writeByte(0x11); // HTU
+                    writeByte(3); // IdV
+                    writeByte(0x11); // HTV
+                    writeByte(0); // Ss
+                    writeByte(0x3f); // Se
+                    writeByte(0); // Bf
+                }
+    
+                function processDU(CDU, fdtbl, DC, HTDC, HTAC){
+                    var EOB = HTAC[0x00];
+                    var M16zeroes = HTAC[0xF0];
+                    var pos;
+                    var I16 = 16;
+                    var I63 = 63;
+                    var I64 = 64;
+                    var DU_DCT = fDCTQuant(CDU, fdtbl);
+                    //ZigZag reorder
+                    for (var j=0;j<I64;++j) {
+                        DU[ZigZag[j]]=DU_DCT[j];
+                    }
+                    var Diff = DU[0] - DC; DC = DU[0];
+                    //Encode DC
+                    if (Diff==0) {
+                        writeBits(HTDC[0]); // Diff might be 0
+                    } else {
+                        pos = 32767+Diff;
+                        writeBits(HTDC[category[pos]]);
+                        writeBits(bitcode[pos]);
+                    }
+                    //Encode ACs
+                    var end0pos = 63; // was const... which is crazy
+                    for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {};
+                    //end0pos = first element in reverse order !=0
+                    if ( end0pos == 0) {
+                        writeBits(EOB);
+                        return DC;
+                    }
+                    var i = 1;
+                    var lng;
+                    while ( i <= end0pos ) {
+                        var startpos = i;
+                        for (; (DU[i]==0) && (i<=end0pos); ++i) {}
+                        var nrzeroes = i-startpos;
+                        if ( nrzeroes >= I16 ) {
+                            lng = nrzeroes>>4;
+                            for (var nrmarker=1; nrmarker <= lng; ++nrmarker)
+                                writeBits(M16zeroes);
+                            nrzeroes = nrzeroes&0xF;
+                        }
+                        pos = 32767+DU[i];
+                        writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
+                        writeBits(bitcode[pos]);
+                        i++;
+                    }
+                    if ( end0pos != I63 ) {
+                        writeBits(EOB);
+                    }
+                    return DC;
+                }
+    
+                function initCharLookupTable(){
+                    var sfcc = String.fromCharCode;
+                    for(var i=0; i < 256; i++){ ///// ACHTUNG // 255
+                        clt[i] = sfcc(i);
+                    }
+                }
+    
+                this.encode = function(image,quality) // image data object
+                {
+                    // var time_start = new Date().getTime();
+    
+                    if(quality) setQuality(quality);
+    
+                    // Initialize bit writer
+                    byteout = new Array();
+                    bytenew=0;
+                    bytepos=7;
+    
+                    // Add JPEG headers
+                    writeWord(0xFFD8); // SOI
+                    writeAPP0();
+                    writeDQT();
+                    writeSOF0(image.width,image.height);
+                    writeDHT();
+                    writeSOS();
+    
+    
+                    // Encode 8x8 macroblocks
+                    var DCY=0;
+                    var DCU=0;
+                    var DCV=0;
+    
+                    bytenew=0;
+                    bytepos=7;
+    
+    
+                    this.encode.displayName = "_encode_";
+    
+                    var imageData = image.data;
+                    var width = image.width;
+                    var height = image.height;
+    
+                    var quadWidth = width*4;
+                    var tripleWidth = width*3;
+    
+                    var x, y = 0;
+                    var r, g, b;
+                    var start,p, col,row,pos;
+                    while(y < height){
+                        x = 0;
+                        while(x < quadWidth){
+                        start = quadWidth * y + x;
+                        p = start;
+                        col = -1;
+                        row = 0;
+    
+                        for(pos=0; pos < 64; pos++){
+                            row = pos >> 3;// /8
+                            col = ( pos & 7 ) * 4; // %8
+                            p = start + ( row * quadWidth ) + col;
+    
+                            if(y+row >= height){ // padding bottom
+                                p-= (quadWidth*(y+1+row-height));
+                            }
+    
+                            if(x+col >= quadWidth){ // padding right
+                                p-= ((x+col) - quadWidth +4)
+                            }
+    
+                            r = imageData[ p++ ];
+                            g = imageData[ p++ ];
+                            b = imageData[ p++ ];
+    
+    
+                            /* // calculate YUV values dynamically
+                            YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
+                            UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
+                            VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
+                            */
+    
+                            // use lookup table (slightly faster)
+                            YDU[pos] = ((RGB_YUV_TABLE[r]             + RGB_YUV_TABLE[(g +  256)>>0] + RGB_YUV_TABLE[(b +  512)>>0]) >> 16)-128;
+                            UDU[pos] = ((RGB_YUV_TABLE[(r +  768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;
+                            VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;
+    
+                        }
+    
+                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
+                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
+                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
+                        x+=32;
+                        }
+                        y+=8;
+                    }
+    
+    
+                    ////////////////////////////////////////////////////////////////
+    
+                    // Do the bit alignment of the EOI marker
+                    if ( bytepos >= 0 ) {
+                        var fillbits = [];
+                        fillbits[1] = bytepos+1;
+                        fillbits[0] = (1<<(bytepos+1))-1;
+                        writeBits(fillbits);
+                    }
+    
+                    writeWord(0xFFD9); //EOI
+    
+                    var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
+    
+                    byteout = [];
+    
+                    // benchmarking
+                    // var duration = new Date().getTime() - time_start;
+                    // console.log('Encoding time: '+ currentQuality + 'ms');
+                    //
+    
+                    return jpegDataUri
+            }
+    
+            function setQuality(quality){
+                if (quality <= 0) {
+                    quality = 1;
+                }
+                if (quality > 100) {
+                    quality = 100;
+                }
+    
+                if(currentQuality == quality) return // don't recalc if unchanged
+    
+                var sf = 0;
+                if (quality < 50) {
+                    sf = Math.floor(5000 / quality);
+                } else {
+                    sf = Math.floor(200 - quality*2);
+                }
+    
+                initQuantTables(sf);
+                currentQuality = quality;
+                // console.log('Quality set to: '+quality +'%');
+            }
+    
+            function init(){
+                // var time_start = new Date().getTime();
+                if(!quality) quality = 50;
+                // Create tables
+                initCharLookupTable()
+                initHuffmanTbl();
+                initCategoryNumber();
+                initRGBYUVTable();
+    
+                setQuality(quality);
+                // var duration = new Date().getTime() - time_start;
+                // console.log('Initialization '+ duration + 'ms');
+            }
+    
+            init();
+    
+        };
+    
+        JPEGEncoder.encode = function( data, quality ) {
+            var encoder = new JPEGEncoder( quality );
+    
+            return encoder.encode( data );
+        }
+    
+        return JPEGEncoder;
+    });
+    /**
+     * @fileOverview Fix android canvas.toDataUrl bug.
+     */
+    define('runtime/html5/androidpatch',[
+        'runtime/html5/util',
+        'runtime/html5/jpegencoder',
+        'base'
+    ], function( Util, encoder, Base ) {
+        var origin = Util.canvasToDataUrl,
+            supportJpeg;
+    
+        Util.canvasToDataUrl = function( canvas, type, quality ) {
+            var ctx, w, h, fragement, parts;
+    
+            // 非android手机直接跳过。
+            if ( !Base.os.android ) {
+                return origin.apply( null, arguments );
+            }
+    
+            // 检测是否canvas支持jpeg导出,根据数据格式来判断。
+            // JPEG 前两位分别是:255, 216
+            if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {
+                fragement = origin.apply( null, arguments );
+    
+                parts = fragement.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    fragement = atob( parts[ 1 ] );
+                } else {
+                    fragement = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                fragement = fragement.substring( 0, 2 );
+    
+                supportJpeg = fragement.charCodeAt( 0 ) === 255 &&
+                        fragement.charCodeAt( 1 ) === 216;
+            }
+    
+            // 只有在android环境下才修复
+            if ( type === 'image/jpeg' && !supportJpeg ) {
+                w = canvas.width;
+                h = canvas.height;
+                ctx = canvas.getContext('2d');
+    
+                return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );
+            }
+    
+            return origin.apply( null, arguments );
+        };
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var noop = Base.noop,
+            $ = Base.$;
+    
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+    
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+    
+                if ( binary ) {
+                    xhr.overrideMimeType('application/octet-stream');
+    
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+    
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+    
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+    
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+    
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+    
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+    
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+    
+                    return me.trigger( 'progress', percentage );
+                };
+    
+                xhr.onreadystatechange = function() {
+    
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+    
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+    
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+    
+    
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+    
+            _parseJson: function( str ) {
+                var json;
+    
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+    
+                return json;
+            }
+        });
+    });
+    define('webuploader',[
+        'base',
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'runtime/html5/blob',
+        'runtime/html5/filepicker',
+        'runtime/html5/imagemeta/exif',
+        'runtime/html5/image',
+        'runtime/html5/androidpatch',
+        'runtime/html5/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.custom.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.custom.min.js
new file mode 100644
index 0000000..5c256b4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.custom.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",getDimension:"get-dimension",addButton:"add-btn",getRuntimeType:"get-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){b._info=b._info||d.info(),b._meta=b._meta||d.meta(),d.resize(g.width,g.height)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,a.size<c&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destory:function(){delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d.getStats().numOfQueue||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_nextBlock:function(){var a,b,c=this,d=c._act,f=c.options;return d&&d.has()&&d.file.getStatus()===h.PROGRESS?(f.prepareNextFile&&!c.pending.length&&c._prepareNextFile(),d.fetch()):c.runing?(!c.pending.length&&c.getStats().numOfQueue&&c._prepareNextFile(),a=c.pending.shift(),b=function(a){return a?(d=e(a,f.chunked?f.chunkSize:0),c._act=d,d.fetch()):null},g(a)?a[a.pipe?"pipe":"then"](b):b(a)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.QUEUED?(b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),c):b._finishFile(c)}),a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d._popBlock(b),a.nextTick(d.__tick))})},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){var c=0,d=0;c=b.percentage=a,b.chunks>1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;e<b.length;e++)c[e]=b.charCodeAt(e);return f=g[0].split(":")[1].split(";")[0],this.arrayBufferToBlob(d,f)},dataURL2ArrayBuffer:function(a){var b,c,d,e;for(e=a.split(","),b=~e[0].indexOf("base64")?atob(e[1]):decodeURIComponent(e[1]),c=new Uint8Array(b.length),d=0;d<b.length;d++)c[d]=b.charCodeAt(d);return c.buffer},arrayBufferToBlob:function(b,c){var d,e=a.BlobBuilder||a.WebKitBlobBuilder;return e?(d=new e,d.append(b),d.getBlob(c)):new Blob([b],c?{type:c}:{})},canvasToDataUrl:function(a,b,c){return a.toDataURL(b,c/100)},parseMeta:function(a,b){b(!1,{})},updateImageHead:function(a){return a}}}),b("runtime/html5/imagemeta",["runtime/html5/util"],function(a){var b;return b={parsers:{65505:[]},maxMetaDataSize:262144,parse:function(a,b){var c=this,d=new FileReader;d.onload=function(){b(!1,c._parse(this.result)),d=d.onload=d.onerror=null},d.onerror=function(a){b(a.message),d=d.onload=d.onerror=null},a=a.slice(0,c.maxMetaDataSize),d.readAsArrayBuffer(a.getSource())},_parse:function(a,c){if(!(a.byteLength<6)){var d,e,f,g,h=new DataView(a),i=2,j=h.byteLength-4,k=i,l={};if(65496===h.getUint16(0)){for(;j>i&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g<f.length;g+=1)f[g].call(b,h,i,e,l);i+=e,k=i}k>6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)
+},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;l<k.length&&(n=k[l],"\x00"!==n);l+=1)m+=n;return m}return k},c.parseExifTag=function(a,b,d,e,f){var g=a.getUint16(d,e);f.exif[g]=c.getExifValue(a,b,d,a.getUint16(d+2,e),a.getUint32(d+4,e),e)},c.parseExifTags=function(b,c,d,e,f){var g,h,i;if(d+6>b.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,"image/jpeg",e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(a,b,c,d,e,f){a.getContext("2d").drawImage(b,c,d,e,f)}}()})}),b("runtime/html5/jpegencoder",[],function(){function a(a){function b(a){for(var b=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],c=0;64>c;c++){var d=y((b[c]*a+50)/100);1>d?d=1:d>255&&(d=255),z[P[c]]=d}for(var e=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],f=0;64>f;f++){var g=y((e[f]*a+50)/100);1>g?g=1:g>255&&(g=255),A[P[f]]=g}for(var h=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],i=0,j=0;8>j;j++)for(var k=0;8>k;k++)B[i]=1/(z[P[i]]*h[j]*h[k]*8),C[i]=1/(A[P[i]]*h[j]*h[k]*8),i++}function c(a,b){for(var c=0,d=0,e=new Array,f=1;16>=f;f++){for(var g=1;g<=a[f];g++)e[b[d]]=[],e[b[d]][0]=c,e[b[d]][1]=f,d++,c++;c*=2}return e}function d(){t=c(Q,R),u=c(U,V),v=c(S,T),w=c(W,X)}function e(){for(var a=1,b=2,c=1;15>=c;c++){for(var d=a;b>d;d++)E[32767+d]=c,D[32767+d]=[],D[32767+d][1]=c,D[32767+d][0]=d;for(var e=-(b-1);-a>=e;e++)E[32767+e]=c,D[32767+e]=[],D[32767+e][1]=c,D[32767+e][0]=b-1+e;a<<=1,b<<=1}}function f(){for(var a=0;256>a;a++)O[a]=19595*a,O[a+256>>0]=38470*a,O[a+512>>0]=7471*a+32768,O[a+768>>0]=-11059*a,O[a+1024>>0]=-21709*a,O[a+1280>>0]=32768*a+8421375,O[a+1536>>0]=-27439*a,O[a+1792>>0]=-5329*a}function g(a){for(var b=a[0],c=a[1]-1;c>=0;)b&1<<c&&(I|=1<<J),c--,J--,0>J&&(255==I?(h(255),h(0)):h(I),J=7,I=0)}function h(a){H.push(N[a])}function i(a){h(a>>8&255),h(255&a)}function j(a,b){var c,d,e,f,g,h,i,j,k,l=0,m=8,n=64;for(k=0;m>k;++k){c=a[l],d=a[l+1],e=a[l+2],f=a[l+3],g=a[l+4],h=a[l+5],i=a[l+6],j=a[l+7];var o=c+j,p=c-j,q=d+i,r=d-i,s=e+h,t=e-h,u=f+g,v=f-g,w=o+u,x=o-u,y=q+s,z=q-s;a[l]=w+y,a[l+4]=w-y;var A=.707106781*(z+x);a[l+2]=x+A,a[l+6]=x-A,w=v+t,y=t+r,z=r+p;var B=.382683433*(w-z),C=.5411961*w+B,D=1.306562965*z+B,E=.707106781*y,G=p+E,H=p-E;a[l+5]=H+C,a[l+3]=H-C,a[l+1]=G+D,a[l+7]=G-D,l+=8}for(l=0,k=0;m>k;++k){c=a[l],d=a[l+8],e=a[l+16],f=a[l+24],g=a[l+32],h=a[l+40],i=a[l+48],j=a[l+56];var I=c+j,J=c-j,K=d+i,L=d-i,M=e+h,N=e-h,O=f+g,P=f-g,Q=I+O,R=I-O,S=K+M,T=K-M;a[l]=Q+S,a[l+32]=Q-S;var U=.707106781*(T+R);a[l+16]=R+U,a[l+48]=R-U,Q=P+N,S=N+L,T=L+J;var V=.382683433*(Q-T),W=.5411961*Q+V,X=1.306562965*T+V,Y=.707106781*S,Z=J+Y,$=J-Y;a[l+40]=$+W,a[l+24]=$-W,a[l+8]=Z+X,a[l+56]=Z-X,l++}var _;for(k=0;n>k;++k)_=a[k]*b[k],F[k]=_>0?_+.5|0:_-.5|0;return F}function k(){i(65504),i(16),h(74),h(70),h(73),h(70),h(0),h(1),h(1),h(0),i(1),i(1),h(0),h(0)}function l(a,b){i(65472),i(17),h(8),i(b),i(a),h(3),h(1),h(17),h(0),h(2),h(17),h(1),h(3),h(17),h(1)}function m(){i(65499),i(132),h(0);for(var a=0;64>a;a++)h(z[a]);h(1);for(var b=0;64>b;b++)h(A[b])}function n(){i(65476),i(418),h(0);for(var a=0;16>a;a++)h(Q[a+1]);for(var b=0;11>=b;b++)h(R[b]);h(16);for(var c=0;16>c;c++)h(S[c+1]);for(var d=0;161>=d;d++)h(T[d]);h(1);for(var e=0;16>e;e++)h(U[e+1]);for(var f=0;11>=f;f++)h(V[f]);h(17);for(var g=0;16>g;g++)h(W[g+1]);for(var j=0;161>=j;j++)h(X[j])}function o(){i(65498),i(12),h(3),h(1),h(0),h(2),h(17),h(3),h(17),h(0),h(63),h(0)}function p(a,b,c,d,e){for(var f,h=e[0],i=e[240],k=16,l=63,m=64,n=j(a,b),o=0;m>o;++o)G[P[o]]=n[o];var p=G[0]-c;c=G[0],0==p?g(d[0]):(f=32767+p,g(d[E[f]]),g(D[f]));for(var q=63;q>0&&0==G[q];q--);if(0==q)return g(h),c;for(var r,s=1;q>=s;){for(var t=s;0==G[s]&&q>=s;++s);var u=s-t;if(u>=k){r=u>>4;for(var v=1;r>=v;++v)g(i);u=15&u}f=32767+G[s],g(e[(u<<4)+E[f]]),g(D[f]),s++}return q!=l&&g(h),c}function q(){for(var a=String.fromCharCode,b=0;256>b;b++)N[b]=a(b)}function r(a){if(0>=a&&(a=1),a>100&&(a=100),x!=a){var c=0;c=Math.floor(50>a?5e3/a:200-2*a),b(c),x=a}}function s(){a||(a=50),q(),d(),e(),f(),r(a)}var t,u,v,w,x,y=(Math.round,Math.floor),z=new Array(64),A=new Array(64),B=new Array(64),C=new Array(64),D=new Array(65535),E=new Array(65535),F=new Array(64),G=new Array(64),H=[],I=0,J=7,K=new Array(64),L=new Array(64),M=new Array(64),N=new Array(256),O=new Array(2048),P=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],Q=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],R=[0,1,2,3,4,5,6,7,8,9,10,11],S=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],T=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],U=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],V=[0,1,2,3,4,5,6,7,8,9,10,11],W=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],X=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];this.encode=function(a,b){b&&r(b),H=new Array,I=0,J=7,i(65496),k(),m(),l(a.width,a.height),n(),o();var c=0,d=0,e=0;I=0,J=7,this.encode.displayName="_encode_";for(var f,h,j,q,s,x,y,z,A,D=a.data,E=a.width,F=a.height,G=4*E,N=0;F>N;){for(f=0;G>f;){for(s=G*N+f,x=s,y=-1,z=0,A=0;64>A;A++)z=A>>3,y=4*(7&A),x=s+z*G+y,N+z>=F&&(x-=G*(N+1+z-F)),f+y>=G&&(x-=f+y-G+4),h=D[x++],j=D[x++],q=D[x++],K[A]=(O[h]+O[j+256>>0]+O[q+512>>0]>>16)-128,L[A]=(O[h+768>>0]+O[j+1024>>0]+O[q+1280>>0]>>16)-128,M[A]=(O[h+1280>>0]+O[j+1536>>0]+O[q+1792>>0]>>16)-128;c=p(K,B,c,t,v),d=p(L,C,d,u,w),e=p(M,C,e,u,w),f+=32}N+=8}if(J>=0){var P=[];P[1]=J+1,P[0]=(1<<J+1)-1,g(P)}i(65497);var Q="data:image/jpeg;base64,"+btoa(H.join(""));return H=[],Q},s()}return a.encode=function(b,c){var d=new a(c);return d.encode(b)},a}),b("runtime/html5/androidpatch",["runtime/html5/util","runtime/html5/jpegencoder","base"],function(a,b,c){var d,e=a.canvasToDataUrl;a.canvasToDataUrl=function(a,f,g){var h,i,j,k,l;return c.os.android?("image/jpeg"===f&&"undefined"==typeof d&&(k=e.apply(null,arguments),l=k.split(","),k=~l[0].indexOf("base64")?atob(l[1]):decodeURIComponent(l[1]),k=k.substring(0,2),d=255===k.charCodeAt(0)&&216===k.charCodeAt(1)),"image/jpeg"!==f||d?e.apply(null,arguments):(i=a.width,j=a.height,h=a.getContext("2d"),b.encode(h.getImageData(0,0,i,j),g))):e.apply(null,arguments)}}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("webuploader",["base","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","runtime/html5/blob","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/image","runtime/html5/androidpatch","runtime/html5/transport"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.flashonly.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.flashonly.js
new file mode 100644
index 0000000..10f4496
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.flashonly.js
@@ -0,0 +1,4176 @@
+/*! WebUploader 0.1.2 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+        },
+
+        exports = factory( root, _define, _require ),
+        origin;
+
+    // exports every module.
+    exportsTo( exports );
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = exports;
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([], exports );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = exports;
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( this, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        return window.jQuery || window.Zepto;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+    
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+    
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档将可能省略`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+    
+        var noop = function() {},
+            call = Function.call;
+    
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+    
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+    
+        function createObject( proto ) {
+            var f;
+    
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+    
+    
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+    
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.2',
+    
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+    
+            Deferred: promise.Deferred,
+    
+            isPromise: promise.isPromise,
+    
+            when: promise.when,
+    
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+    
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+    
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+    
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+    
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+    
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+    
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+    
+                /* jshint camelcase: false */
+    
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+    
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+    
+                return child;
+            },
+    
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+    
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+    
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+    
+            nextTick: (function() {
+    
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+    
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+    
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+    
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+    
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+    
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+    
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+    
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+    
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+    
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+    
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+    
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+    
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+    
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+    
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+    
+            while ( ++i < len ) {
+                handler = events[ i ];
+    
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+    
+            return !stoped;
+        }
+    
+        protos = {
+    
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+    
+                if ( !callback ) {
+                    return this;
+                }
+    
+                set = this._events || (this._events = []);
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+    
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+    
+                    set.push( handler );
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+    
+                if ( !callback ) {
+                    return me;
+                }
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+    
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+    
+                return me;
+            },
+    
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+    
+                if ( !events ) {
+                    return this;
+                }
+    
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+    
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+    
+                if ( !this._events || !type ) {
+                    return this;
+                }
+    
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+    
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+    
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+    
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+    
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$;
+    
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+    
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+    
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            getRuntimeType: 'get-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+    
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+    
+            _init: function( opts ) {
+                var me = this;
+    
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+    
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     resize: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.options( 'resize', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+    
+                // setter
+                if ( arguments.length > 1 ) {
+    
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+    
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+    
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `queueNum` 还在队列中的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+    
+                return {
+                    successNum: stats.numOfSuccess,
+    
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue
+                };
+            },
+    
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+    
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+    
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+    
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+    
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+    
+                    return false;
+                }
+    
+                return true;
+            },
+    
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+    
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+    
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+    
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            factories = {},
+    
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+    
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+    
+        $.extend( Runtime.prototype, {
+    
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+    
+                if ( this._container ) {
+                    return this._container;
+                }
+    
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+    
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+    
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                return container;
+            },
+    
+            init: Base.noop,
+            exec: Base.noop,
+    
+            destroy: function() {
+                if ( this._container ) {
+                    this._container.parentNode.removeChild( this.__container );
+                }
+    
+                this.off();
+            }
+        });
+    
+        Runtime.orders = 'html5,flash';
+    
+    
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+    
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+    
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+    
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+    
+            type = type || getFirstKey( factories );
+    
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+    
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+    
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+    
+        var cache;
+    
+        cache = (function() {
+            var obj = {};
+    
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+    
+                get: function( ruid, standalone ) {
+                    var i;
+    
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+    
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+    
+                        return obj[ i ];
+                    }
+    
+                    return null;
+                },
+    
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+    
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+    
+            this.uid = Base.guid('client_');
+    
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+    
+            this.connectRuntime = function( opts, cb ) {
+    
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+    
+                deferred.done( cb );
+    
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+    
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+    
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+    
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                runtime.__client--;
+    
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+    
+                runtime = null;
+            };
+    
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+    
+                return runtime.exec.apply( this, args );
+            };
+    
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+    
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+    
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+    
+        function Blob( ruid, source ) {
+            var me = this;
+    
+            me.source = source;
+            me.ruid = ruid;
+    
+            RuntimeClient.call( me, 'Blob' );
+    
+            this.uid = source.uid || this.uid;
+            this.type = source.type || '';
+            this.size = source.size || 0;
+    
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+    
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+    
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+    
+            getSource: function() {
+                return this.source;
+            }
+        });
+    
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+    
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+    
+        function File( ruid, file ) {
+            var ext;
+    
+            Blob.apply( this, arguments );
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+    
+            // todo 支持其他类型文件的转换。
+    
+            // 如果有mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && this.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+    
+            // 如果没有指定mimetype, 但是知道文件后缀。
+            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
+                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
+            }
+    
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+        }
+    
+        return Base.inherits( Blob, File );
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+    
+        var $ = Base.$;
+    
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+    
+            opts.container = $( opts.id );
+    
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+    
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+    
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+    
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+    
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+    
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+    
+                button.addClass('webuploader-pick');
+    
+                me.on( 'all', function( type ) {
+                    var files;
+    
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+    
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+    
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+    
+                $( window ).on( 'resize', function() {
+                    me.refresh();
+                });
+            },
+    
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+    
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+    
+                    pos = button.offset();
+    
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+    
+            enable: function() {
+                var btn = this.options.button;
+    
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+    
+            disable: function() {
+                var btn = this.options.button;
+    
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+    
+                btn.addClass('webuploader-pick-disable');
+            },
+    
+            destroy: function() {
+                if ( this.runtime ) {
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                }
+            }
+        });
+    
+        return FilePicker;
+    });
+    
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+    
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            IGNORE = {},
+            widgetClass = [];
+    
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+    
+            var length = obj.length,
+                type = $.type( obj );
+    
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+    
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+    
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+    
+        $.extend( Widget.prototype, {
+    
+            init: Base.noop,
+    
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+    
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+    
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+    
+                    return IGNORE;
+                }
+    
+                return this[ map[ apiName ] ].apply( this, args );
+    
+            },
+    
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+    
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+    
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [];
+    
+                $.each( widgetClass, function( _, klass ) {
+                    widgets.push( new klass( me ) );
+                });
+    
+                return _init.apply( me, arguments );
+            },
+    
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+    
+                args = isArrayLike( args ) ? args : [ args ];
+    
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+    
+                    if ( rlt !== IGNORE ) {
+    
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+    
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+    
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个tick中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+    
+                                setTimeout(function() {
+                                    deferred.resolve.apply( deferred, args );
+                                }, 1 );
+    
+                                return deferred.promise();
+                            })[ key ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            }
+        });
+    
+        /**
+         * 添加组件
+         * @param  {object} widgetProto 组件原型,构造函数通过constructor属性定义
+         * @param  {object} responseMap API名称与函数实现的映射
+         * @example
+         *     Uploader.register( {
+         *         init: function( options ) {},
+         *         makeThumb: function() {}
+         *     }, {
+         *         'make-thumb': 'makeThumb'
+         *     } );
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init' },
+                klass;
+    
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+                widgetProto.responseMap = map;
+            } else {
+                widgetProto.responseMap = $.extend( map, responseMap );
+            }
+    
+            klass = Base.inherits( Widget, widgetProto );
+            widgetClass.push( klass );
+    
+            return klass;
+        };
+    
+        return Widget;
+    });
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+    
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+    
+        return Uploader.register({
+            'add-btn': 'addButton',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable'
+        }, {
+    
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addButton( opts.pick );
+            },
+    
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+    
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addButton: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    options, picker, deferred;
+    
+                if ( !pick ) {
+                    return;
+                }
+    
+                deferred = Base.Deferred();
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+    
+                options = $.extend({}, pick, {
+                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                    swf: opts.swf,
+                    runtimeOrder: opts.runtimeOrder
+                });
+    
+                picker = new FilePicker( options );
+    
+                picker.once( 'ready', deferred.resolve );
+                picker.on( 'select', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                picker.init();
+    
+                this.pickers.push( picker );
+    
+                return deferred.promise();
+            },
+    
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+    
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+    
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+    
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+    
+        // 默认选项。
+        Image.options = {
+    
+            // 默认的图片处理质量
+            quality: 90,
+    
+            // 是否裁剪
+            crop: false,
+    
+            // 是否保留头部信息
+            preserveHeaders: true,
+    
+            // 是否允许放大。
+            allowMagnify: true
+        };
+    
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+    
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+    
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+    
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+    
+        var $ = Base.$,
+            throttle;
+    
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+    
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+    
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: false,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+    
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+    
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+    
+        return Uploader.register({
+            'make-thumb': 'makeThumb',
+            'before-send-file': 'compressImage'
+        }, {
+    
+    
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             *
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+    
+                opts = $.extend({}, this.options.thumb );
+    
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+    
+                width = width || opts.width;
+                height = height || opts.height;
+    
+                image = new Image( opts );
+    
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( width, height );
+                });
+    
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+    
+                image.once( 'error', function() {
+                    cb( true );
+                    image.destroy();
+                });
+    
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+    
+            compressImage: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 300 * 1024,
+                    image, deferred;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+    
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+    
+                image = new Image( opts );
+    
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( opts.width, opts.height );
+                });
+    
+                image.once( 'complete', function() {
+                    var blob, size;
+    
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+    
+                        size = file.size;
+    
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+    
+                            file.trigger( 'resize', blob.size, size );
+                        }
+    
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+    
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+    
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+    
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+    
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+    
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+    
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+    
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application'
+             */
+            this.type = source.type || 'application';
+    
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+    
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+    
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+    
+    
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+    
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+    
+            this.source = source;
+            this.loaded = 0;
+    
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+    
+        $.extend( WUFile.prototype, {
+    
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+    
+                var prevStatus = statusMap[ this.id ];
+    
+                typeof text !== 'undefined' && (this.statusText = text);
+    
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+    
+            },
+    
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+    
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+    
+            destory: function() {
+                delete statusMap[ this.id ];
+            }
+        });
+    
+        Mediator.installTo( WUFile.prototype );
+    
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+    
+        return WUFile;
+    });
+    
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+    
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+    
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+    
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被移除的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0
+            };
+    
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+    
+            // 存储所有文件
+            this._map = {};
+        }
+    
+        $.extend( Queue.prototype, {
+    
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+    
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+    
+                status = status || STATUS.QUEUED;
+    
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+    
+                return null;
+            },
+    
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+    
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+    
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+    
+                    ret.push( file );
+                }
+    
+                return ret;
+            },
+    
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+    
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+    
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+    
+                file.setStatus( STATUS.QUEUED );
+            },
+    
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+    
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+    
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+                }
+    
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+    
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+    
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+    
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+                }
+            }
+    
+        });
+    
+        Mediator.installTo( Queue.prototype );
+    
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+    
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+    
+        return Uploader.register({
+            'sort-files': 'sortFiles',
+            'add-file': 'addFiles',
+            'get-file': 'getFile',
+            'fetch-file': 'fetchFile',
+            'get-stats': 'getStats',
+            'get-files': 'getFiles',
+            'remove-file': 'removeFile',
+            'retry': 'retry',
+            'reset': 'reset',
+            'accept-file': 'acceptFile'
+        }, {
+    
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+    
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+    
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+    
+                    me.accept = new RegExp( accept, 'i' );
+                }
+    
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+    
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+    
+    
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+    
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+    
+                    file = new WUFile( file );
+                }
+    
+                return file;
+            },
+    
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || file.size < 6 || this.accept &&
+    
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+    
+                return !invalid;
+            },
+    
+    
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+    
+            _addFile: function( file ) {
+                var me = this;
+    
+                file = me._wrapFile( file );
+    
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+    
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+    
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+    
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+    
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFiles: function( files ) {
+                var me = this;
+    
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+    
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+    
+                me.owner.trigger( 'filesQueued', files );
+    
+                if ( me.options.auto ) {
+                    me.request('start-upload');
+                }
+            },
+    
+            getStats: function() {
+                return this.stats;
+            },
+    
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file ) {
+                var me = this;
+    
+                file = file.id ? file : me.queue.getFile( file );
+    
+                file.setStatus( Status.CANCELLED );
+                me.owner.trigger( 'fileDequeued', file );
+            },
+    
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+    
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+    
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+    
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+    
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+    
+                me.request('start-upload');
+            },
+    
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            }
+        });
+    
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+    
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+    
+        return Uploader.register({
+            'predict-runtime-type': 'predictRuntmeType'
+        }, {
+    
+            init: function() {
+                if ( !this.predictRuntmeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+    
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntmeType() => String
+             * @method predictRuntmeType
+             * @for  Uploader
+             */
+            predictRuntmeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+    
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+    
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+    
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+    
+        var $ = Base.$;
+    
+        function Transport( opts ) {
+            var me = this;
+    
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+    
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+    
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+    
+        Transport.options = {
+            server: '',
+            method: 'POST',
+    
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+    
+        $.extend( Transport.prototype, {
+    
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+    
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+    
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+    
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+    
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+    
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+    
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+    
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+    
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+    
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+    
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+    
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+    
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+    
+                if ( !duration ) {
+                    return;
+                }
+    
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+    
+        });
+    
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+    
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+    
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+    
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+    
+    
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+    
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+    
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+    
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+    
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+    
+    
+            /**
+             * @property {Object} [formData]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: null
+    
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+    
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+    
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+    
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len;
+    
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+    
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++
+                });
+                start += len;
+            }
+    
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+    
+            return {
+                file: file,
+    
+                has: function() {
+                    return !!pending.length;
+                },
+    
+                fetch: function() {
+                    return pending.shift();
+                }
+            };
+        }
+    
+        Uploader.register({
+            'start-upload': 'start',
+            'stop-upload': 'stop',
+            'skip-file': 'skipFile',
+            'is-in-progress': 'isInProgress'
+        }, {
+    
+            init: function() {
+                var owner = this.owner;
+    
+                this.runing = false;
+    
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+    
+                // 缓存即将上传的文件。
+                this.pending = [];
+    
+                // 跟踪还有多少分片没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+    
+                owner.on( 'uploadComplete', function( file ) {
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+    
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+    
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             * @grammar upload() => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            start: function() {
+                var me = this;
+    
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+    
+                if ( me.runing ) {
+                    return;
+                }
+    
+                me.runing = true;
+    
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+    
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        file.setStatus( Status.PROGRESS );
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+    
+                me._trigged = false;
+                me.owner.trigger('startUpload');
+                Base.nextTick( me.__tick );
+            },
+    
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stop: function( interrupt ) {
+                var me = this;
+    
+                if ( me.runing === false ) {
+                    return;
+                }
+    
+                me.runing = false;
+    
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+    
+                me.owner.trigger('stopUpload');
+            },
+    
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.runing;
+            },
+    
+            getStats: function() {
+                return this.request('get-stats');
+            },
+    
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = this.request( 'get-file', file );
+    
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+    
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+    
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+    
+                this.owner.trigger( 'uploadSkip', file );
+            },
+    
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+    
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+    
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+    
+                    fn = function( val ) {
+                        me._promise = null;
+    
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+    
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+    
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me.getStats().numOfQueue ) {
+                    me.runing = false;
+    
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+    
+            _nextBlock: function() {
+                var me = this,
+                    act = me._act,
+                    opts = me.options,
+                    next, done;
+    
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( act && act.has() &&
+                        act.file.getStatus() === Status.PROGRESS ) {
+    
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+    
+                    return act.fetch();
+    
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+    
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me.getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+    
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+    
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me._act = act;
+                        return act.fetch();
+                    };
+    
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    return isPromise( next ) ?
+                            next[ next.pipe ? 'pipe' : 'then']( done ) :
+                            done( next );
+                }
+            },
+    
+    
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+    
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+    
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.QUEUED ) {
+                            me.owner.trigger( 'uploadStart', file );
+                            file.setStatus( Status.PROGRESS );
+                            return file;
+                        }
+    
+                        return me._finishFile( file );
+                    });
+    
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+    
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+    
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+    
+                    pending.push( promise );
+                }
+            },
+    
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+    
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+    
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+    
+                me.pool.push( block );
+                me.remaning++;
+    
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+    
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+    
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+    
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+    
+    
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+    
+    
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+    
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+    
+                block.transport = tr;
+    
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+    
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    var totalPercent = 0,
+                        uploaded = 0;
+    
+                    // 可能没有abort掉,progress还是执行进来了。
+                    // if ( !file.blocks ) {
+                    //     return;
+                    // }
+    
+                    totalPercent = block.percentage = percentage;
+    
+                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。
+                        $.each( file.blocks, function( _, v ) {
+                            uploaded += (v.percentage || 0) * (v.end - v.start);
+                        });
+    
+                        totalPercent = uploaded / file.size;
+                    }
+    
+                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+                });
+    
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+    
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+    
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+    
+                    return reject;
+                };
+    
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+    
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+    
+                        block.retried++;
+                        tr.send();
+    
+                    } else {
+    
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+    
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+    
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+    
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+    
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+    
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+    
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+    
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+    
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+    
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+    
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+    
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+    
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            }
+    
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+    
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+    
+        var $ = Base.$,
+            validators = {},
+            api;
+    
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * @for  Uploader
+         */
+    
+        // 暴露给外面的api
+        api = {
+    
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+    
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+    
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            init: function() {
+                var me = this;
+                $.each( validators, function() {
+                    this.call( me.owner );
+                });
+            }
+        });
+    
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileNumLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return count >= max ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+    
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+    
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileSizeLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+    
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return invalid ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', file );
+                    return false;
+                }
+    
+            });
+    
+        });
+    
+        /**
+         * @property {int} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+    
+            if ( opts.duplicate ) {
+                return;
+            }
+    
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+    
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+    
+                return hash;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+    
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (mapping[ hash ] = true);
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (delete mapping[ hash ]);
+            });
+        });
+    
+        return api;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+    
+        function CompBase( owner, runtime ) {
+    
+            this.owner = owner;
+            this.options = owner.options;
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+    
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+    
+        return CompBase;
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+    
+    
+        function getFlashVersion() {
+            var version;
+    
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+    
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destory = this.destory,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                clients[ uid ] = client;
+    
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+    
+                    instance = pool[ uid ];
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+    
+                return me.flashExec.apply( client, arguments );
+            };
+    
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+    
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+    
+                // console.log.apply( console, arguments );
+    
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+    
+                // Base.log( evt, obj );
+            }
+    
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+    
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+    
+            this.jsreciver = jsreciver;
+    
+            this.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+    
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+    
+                return flash.exec( this.uid, comp, fn, args );
+            };
+    
+            // @todo
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+    
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+    
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+    
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+    
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+    
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+    
+                container.html( html );
+            },
+    
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+    
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+    
+        });
+    
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+    
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+    
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+    
+            return component;
+        };
+    
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+    
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+    
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+    
+                delete copy.button;
+                delete copy.container;
+    
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * @fileOverview 图片压缩
+     */
+    define('runtime/flash/image',[
+        'runtime/flash/runtime'
+    ], function( FlashRuntime ) {
+    
+        return FlashRuntime.register( 'Image', {
+            // init: function( options ) {
+            //     var owner = this.owner;
+    
+            //     this.flashExec( 'Image', 'init', options );
+            //     owner.on( 'load', function() {
+            //         debugger;
+            //     });
+            // },
+    
+            loadFromBlob: function( blob ) {
+                var owner = this.owner;
+    
+                owner.info() && this.flashExec( 'Image', 'info', owner.info() );
+                owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );
+    
+                this.flashExec( 'Image', 'loadFromBlob', blob.uid );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+    
+                xhr.connectRuntime( blob.ruid );
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+    
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server
+                }, binary );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+    
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    return me.trigger( 'progress', e.loaded / e.total );
+                });
+    
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        err = '';
+    
+                    xhr.off();
+                    me._xhr = null;
+    
+                    if ( status >= 200 && status < 300 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                    } else if ( status >= 500 && status < 600 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+    
+                    xhr.destroy();
+                    xhr = null;
+    
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+    
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview 只有flash实现的文件版本。
+     */
+    define('preset/flashonly',[
+        'base',
+    
+        // widgets
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+    
+        // runtimes
+    
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/image',
+        'runtime/flash/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/flashonly'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.flashonly.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.flashonly.min.js
new file mode 100644
index 0000000..49c6b50
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.flashonly.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",getDimension:"get-dimension",addButton:"add-btn",getRuntimeType:"get-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){b._info=b._info||d.info(),b._meta=b._meta||d.meta(),d.resize(g.width,g.height)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,a.size<c&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destory:function(){delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d.getStats().numOfQueue||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_nextBlock:function(){var a,b,c=this,d=c._act,f=c.options;return d&&d.has()&&d.file.getStatus()===h.PROGRESS?(f.prepareNextFile&&!c.pending.length&&c._prepareNextFile(),d.fetch()):c.runing?(!c.pending.length&&c.getStats().numOfQueue&&c._prepareNextFile(),a=c.pending.shift(),b=function(a){return a?(d=e(a,f.chunked?f.chunkSize:0),c._act=d,d.fetch()):null},g(a)?a[a.pipe?"pipe":"then"](b):b(a)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.QUEUED?(b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),c):b._finishFile(c)}),a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d._popBlock(b),a.nextTick(d.__tick))})},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){var c=0,d=0;c=b.percentage=a,b.chunks>1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destory,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destory=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){}})}),b("runtime/flash/image",["runtime/flash/runtime"],function(a){return a.register("Image",{loadFromBlob:function(a){var b=this.owner;b.info()&&this.flashExec("Image","info",b.info()),b.meta()&&this.flashExec("Image","meta",b.meta()),this.flashExec("Image","loadFromBlob",a.uid)}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(a,b,c){var d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,e=this._initAjax(),f=b._blob,g=c.server;e.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+d.param(b._formData),a=f.uid):(d.each(b._formData,function(a,b){e.exec("append",a,b)
+}),e.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(e,c.headers),e.exec("send",{method:c.method,url:g},a)},getStatus:function(){return this._status},getResponse:function(){return this._response},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new c("XMLHttpRequest");return b.on("uploadprogress progress",function(b){return a.trigger("progress",b.loaded/b.total)}),b.on("load",function(){var c=b.exec("getStatus"),d="";return b.off(),a._xhr=null,c>=200&&300>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson")):c>=500&&600>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson"),d="server"):d="http",b.destroy(),b=null,d?a.trigger("error",d):a.trigger("load")}),b.on("error",function(){b.off(),a._xhr=null,a.trigger("error","http")}),a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("preset/flashonly",["base","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/flash/filepicker","runtime/flash/image","runtime/flash/transport"],function(a){return a}),b("webuploader",["preset/flashonly"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.html5only.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.html5only.js
new file mode 100644
index 0000000..5dd4813
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.html5only.js
@@ -0,0 +1,5559 @@
+/*! WebUploader 0.1.2 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+        },
+
+        exports = factory( root, _define, _require ),
+        origin;
+
+    // exports every module.
+    exportsTo( exports );
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = exports;
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([], exports );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = exports;
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( this, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        return window.jQuery || window.Zepto;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+    
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+    
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档将可能省略`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+    
+        var noop = function() {},
+            call = Function.call;
+    
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+    
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+    
+        function createObject( proto ) {
+            var f;
+    
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+    
+    
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+    
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.2',
+    
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+    
+            Deferred: promise.Deferred,
+    
+            isPromise: promise.isPromise,
+    
+            when: promise.when,
+    
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+    
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+    
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+    
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+    
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+    
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+    
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+    
+                /* jshint camelcase: false */
+    
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+    
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+    
+                return child;
+            },
+    
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+    
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+    
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+    
+            nextTick: (function() {
+    
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+    
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+    
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+    
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+    
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+    
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+    
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+    
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+    
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+    
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+    
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+    
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+    
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+    
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+    
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+    
+            while ( ++i < len ) {
+                handler = events[ i ];
+    
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+    
+            return !stoped;
+        }
+    
+        protos = {
+    
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+    
+                if ( !callback ) {
+                    return this;
+                }
+    
+                set = this._events || (this._events = []);
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+    
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+    
+                    set.push( handler );
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+    
+                if ( !callback ) {
+                    return me;
+                }
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+    
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+    
+                return me;
+            },
+    
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+    
+                if ( !events ) {
+                    return this;
+                }
+    
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+    
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+    
+                if ( !this._events || !type ) {
+                    return this;
+                }
+    
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+    
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+    
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+    
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+    
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$;
+    
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+    
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+    
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            getRuntimeType: 'get-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+    
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+    
+            _init: function( opts ) {
+                var me = this;
+    
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+    
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     resize: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.options( 'resize', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+    
+                // setter
+                if ( arguments.length > 1 ) {
+    
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+    
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+    
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `queueNum` 还在队列中的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+    
+                return {
+                    successNum: stats.numOfSuccess,
+    
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue
+                };
+            },
+    
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+    
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+    
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+    
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+    
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+    
+                    return false;
+                }
+    
+                return true;
+            },
+    
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+    
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+    
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+    
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            factories = {},
+    
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+    
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+    
+        $.extend( Runtime.prototype, {
+    
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+    
+                if ( this._container ) {
+                    return this._container;
+                }
+    
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+    
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+    
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                return container;
+            },
+    
+            init: Base.noop,
+            exec: Base.noop,
+    
+            destroy: function() {
+                if ( this._container ) {
+                    this._container.parentNode.removeChild( this.__container );
+                }
+    
+                this.off();
+            }
+        });
+    
+        Runtime.orders = 'html5,flash';
+    
+    
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+    
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+    
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+    
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+    
+            type = type || getFirstKey( factories );
+    
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+    
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+    
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+    
+        var cache;
+    
+        cache = (function() {
+            var obj = {};
+    
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+    
+                get: function( ruid, standalone ) {
+                    var i;
+    
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+    
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+    
+                        return obj[ i ];
+                    }
+    
+                    return null;
+                },
+    
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+    
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+    
+            this.uid = Base.guid('client_');
+    
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+    
+            this.connectRuntime = function( opts, cb ) {
+    
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+    
+                deferred.done( cb );
+    
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+    
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+    
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+    
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                runtime.__client--;
+    
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+    
+                runtime = null;
+            };
+    
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+    
+                return runtime.exec.apply( this, args );
+            };
+    
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+    
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+    
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+    
+            opts.container = $( opts.container );
+    
+            if ( !opts.container.length ) {
+                return;
+            }
+    
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+    
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.disconnectRuntime();
+            }
+        });
+    
+        Mediator.installTo( DragAndDrop.prototype );
+    
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+    
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            IGNORE = {},
+            widgetClass = [];
+    
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+    
+            var length = obj.length,
+                type = $.type( obj );
+    
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+    
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+    
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+    
+        $.extend( Widget.prototype, {
+    
+            init: Base.noop,
+    
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+    
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+    
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+    
+                    return IGNORE;
+                }
+    
+                return this[ map[ apiName ] ].apply( this, args );
+    
+            },
+    
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+    
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+    
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [];
+    
+                $.each( widgetClass, function( _, klass ) {
+                    widgets.push( new klass( me ) );
+                });
+    
+                return _init.apply( me, arguments );
+            },
+    
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+    
+                args = isArrayLike( args ) ? args : [ args ];
+    
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+    
+                    if ( rlt !== IGNORE ) {
+    
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+    
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+    
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个tick中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+    
+                                setTimeout(function() {
+                                    deferred.resolve.apply( deferred, args );
+                                }, 1 );
+    
+                                return deferred.promise();
+                            })[ key ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            }
+        });
+    
+        /**
+         * 添加组件
+         * @param  {object} widgetProto 组件原型,构造函数通过constructor属性定义
+         * @param  {object} responseMap API名称与函数实现的映射
+         * @example
+         *     Uploader.register( {
+         *         init: function( options ) {},
+         *         makeThumb: function() {}
+         *     }, {
+         *         'make-thumb': 'makeThumb'
+         *     } );
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init' },
+                klass;
+    
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+                widgetProto.responseMap = map;
+            } else {
+                widgetProto.responseMap = $.extend( map, responseMap );
+            }
+    
+            klass = Base.inherits( Widget, widgetProto );
+            widgetClass.push( klass );
+    
+            return klass;
+        };
+    
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+    
+        Uploader.options.dnd = '';
+    
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+    
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+    
+                dnd = new Dnd( options );
+    
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+    
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+    
+                dnd.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.exec('destroy');
+                this.disconnectRuntime();
+                this.off();
+            }
+        });
+    
+        Mediator.installTo( FilePaste.prototype );
+    
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+    
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+    
+                paste = new FilePaste( options );
+    
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+    
+        function Blob( ruid, source ) {
+            var me = this;
+    
+            me.source = source;
+            me.ruid = ruid;
+    
+            RuntimeClient.call( me, 'Blob' );
+    
+            this.uid = source.uid || this.uid;
+            this.type = source.type || '';
+            this.size = source.size || 0;
+    
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+    
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+    
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+    
+            getSource: function() {
+                return this.source;
+            }
+        });
+    
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+    
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+    
+        function File( ruid, file ) {
+            var ext;
+    
+            Blob.apply( this, arguments );
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+    
+            // todo 支持其他类型文件的转换。
+    
+            // 如果有mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && this.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+    
+            // 如果没有指定mimetype, 但是知道文件后缀。
+            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
+                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
+            }
+    
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+        }
+    
+        return Base.inherits( Blob, File );
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+    
+        var $ = Base.$;
+    
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+    
+            opts.container = $( opts.id );
+    
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+    
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+    
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+    
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+    
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+    
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+    
+                button.addClass('webuploader-pick');
+    
+                me.on( 'all', function( type ) {
+                    var files;
+    
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+    
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+    
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+    
+                $( window ).on( 'resize', function() {
+                    me.refresh();
+                });
+            },
+    
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+    
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+    
+                    pos = button.offset();
+    
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+    
+            enable: function() {
+                var btn = this.options.button;
+    
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+    
+            disable: function() {
+                var btn = this.options.button;
+    
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+    
+                btn.addClass('webuploader-pick-disable');
+            },
+    
+            destroy: function() {
+                if ( this.runtime ) {
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                }
+            }
+        });
+    
+        return FilePicker;
+    });
+    
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+    
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+    
+        return Uploader.register({
+            'add-btn': 'addButton',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable'
+        }, {
+    
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addButton( opts.pick );
+            },
+    
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+    
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addButton: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    options, picker, deferred;
+    
+                if ( !pick ) {
+                    return;
+                }
+    
+                deferred = Base.Deferred();
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+    
+                options = $.extend({}, pick, {
+                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                    swf: opts.swf,
+                    runtimeOrder: opts.runtimeOrder
+                });
+    
+                picker = new FilePicker( options );
+    
+                picker.once( 'ready', deferred.resolve );
+                picker.on( 'select', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                picker.init();
+    
+                this.pickers.push( picker );
+    
+                return deferred.promise();
+            },
+    
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+    
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+    
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+    
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+    
+        // 默认选项。
+        Image.options = {
+    
+            // 默认的图片处理质量
+            quality: 90,
+    
+            // 是否裁剪
+            crop: false,
+    
+            // 是否保留头部信息
+            preserveHeaders: true,
+    
+            // 是否允许放大。
+            allowMagnify: true
+        };
+    
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+    
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+    
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+    
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+    
+        var $ = Base.$,
+            throttle;
+    
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+    
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+    
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: false,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+    
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+    
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+    
+        return Uploader.register({
+            'make-thumb': 'makeThumb',
+            'before-send-file': 'compressImage'
+        }, {
+    
+    
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             *
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+    
+                opts = $.extend({}, this.options.thumb );
+    
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+    
+                width = width || opts.width;
+                height = height || opts.height;
+    
+                image = new Image( opts );
+    
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( width, height );
+                });
+    
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+    
+                image.once( 'error', function() {
+                    cb( true );
+                    image.destroy();
+                });
+    
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+    
+            compressImage: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 300 * 1024,
+                    image, deferred;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+    
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+    
+                image = new Image( opts );
+    
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( opts.width, opts.height );
+                });
+    
+                image.once( 'complete', function() {
+                    var blob, size;
+    
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+    
+                        size = file.size;
+    
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+    
+                            file.trigger( 'resize', blob.size, size );
+                        }
+    
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+    
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+    
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+    
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+    
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+    
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+    
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+    
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application'
+             */
+            this.type = source.type || 'application';
+    
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+    
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+    
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+    
+    
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+    
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+    
+            this.source = source;
+            this.loaded = 0;
+    
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+    
+        $.extend( WUFile.prototype, {
+    
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+    
+                var prevStatus = statusMap[ this.id ];
+    
+                typeof text !== 'undefined' && (this.statusText = text);
+    
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+    
+            },
+    
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+    
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+    
+            destory: function() {
+                delete statusMap[ this.id ];
+            }
+        });
+    
+        Mediator.installTo( WUFile.prototype );
+    
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+    
+        return WUFile;
+    });
+    
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+    
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+    
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+    
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被移除的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0
+            };
+    
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+    
+            // 存储所有文件
+            this._map = {};
+        }
+    
+        $.extend( Queue.prototype, {
+    
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+    
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+    
+                status = status || STATUS.QUEUED;
+    
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+    
+                return null;
+            },
+    
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+    
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+    
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+    
+                    ret.push( file );
+                }
+    
+                return ret;
+            },
+    
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+    
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+    
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+    
+                file.setStatus( STATUS.QUEUED );
+            },
+    
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+    
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+    
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+                }
+    
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+    
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+    
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+    
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+                }
+            }
+    
+        });
+    
+        Mediator.installTo( Queue.prototype );
+    
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+    
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+    
+        return Uploader.register({
+            'sort-files': 'sortFiles',
+            'add-file': 'addFiles',
+            'get-file': 'getFile',
+            'fetch-file': 'fetchFile',
+            'get-stats': 'getStats',
+            'get-files': 'getFiles',
+            'remove-file': 'removeFile',
+            'retry': 'retry',
+            'reset': 'reset',
+            'accept-file': 'acceptFile'
+        }, {
+    
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+    
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+    
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+    
+                    me.accept = new RegExp( accept, 'i' );
+                }
+    
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+    
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+    
+    
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+    
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+    
+                    file = new WUFile( file );
+                }
+    
+                return file;
+            },
+    
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || file.size < 6 || this.accept &&
+    
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+    
+                return !invalid;
+            },
+    
+    
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+    
+            _addFile: function( file ) {
+                var me = this;
+    
+                file = me._wrapFile( file );
+    
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+    
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+    
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+    
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+    
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFiles: function( files ) {
+                var me = this;
+    
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+    
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+    
+                me.owner.trigger( 'filesQueued', files );
+    
+                if ( me.options.auto ) {
+                    me.request('start-upload');
+                }
+            },
+    
+            getStats: function() {
+                return this.stats;
+            },
+    
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file ) {
+                var me = this;
+    
+                file = file.id ? file : me.queue.getFile( file );
+    
+                file.setStatus( Status.CANCELLED );
+                me.owner.trigger( 'fileDequeued', file );
+            },
+    
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+    
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+    
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+    
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+    
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+    
+                me.request('start-upload');
+            },
+    
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            }
+        });
+    
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+    
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+    
+        return Uploader.register({
+            'predict-runtime-type': 'predictRuntmeType'
+        }, {
+    
+            init: function() {
+                if ( !this.predictRuntmeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+    
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntmeType() => String
+             * @method predictRuntmeType
+             * @for  Uploader
+             */
+            predictRuntmeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+    
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+    
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+    
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+    
+        var $ = Base.$;
+    
+        function Transport( opts ) {
+            var me = this;
+    
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+    
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+    
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+    
+        Transport.options = {
+            server: '',
+            method: 'POST',
+    
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+    
+        $.extend( Transport.prototype, {
+    
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+    
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+    
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+    
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+    
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+    
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+    
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+    
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+    
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+    
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+    
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+    
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+    
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+    
+                if ( !duration ) {
+                    return;
+                }
+    
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+    
+        });
+    
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+    
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+    
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+    
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+    
+    
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+    
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+    
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+    
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+    
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+    
+    
+            /**
+             * @property {Object} [formData]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: null
+    
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+    
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+    
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+    
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len;
+    
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+    
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++
+                });
+                start += len;
+            }
+    
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+    
+            return {
+                file: file,
+    
+                has: function() {
+                    return !!pending.length;
+                },
+    
+                fetch: function() {
+                    return pending.shift();
+                }
+            };
+        }
+    
+        Uploader.register({
+            'start-upload': 'start',
+            'stop-upload': 'stop',
+            'skip-file': 'skipFile',
+            'is-in-progress': 'isInProgress'
+        }, {
+    
+            init: function() {
+                var owner = this.owner;
+    
+                this.runing = false;
+    
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+    
+                // 缓存即将上传的文件。
+                this.pending = [];
+    
+                // 跟踪还有多少分片没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+    
+                owner.on( 'uploadComplete', function( file ) {
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+    
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+    
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             * @grammar upload() => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            start: function() {
+                var me = this;
+    
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+    
+                if ( me.runing ) {
+                    return;
+                }
+    
+                me.runing = true;
+    
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+    
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        file.setStatus( Status.PROGRESS );
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+    
+                me._trigged = false;
+                me.owner.trigger('startUpload');
+                Base.nextTick( me.__tick );
+            },
+    
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stop: function( interrupt ) {
+                var me = this;
+    
+                if ( me.runing === false ) {
+                    return;
+                }
+    
+                me.runing = false;
+    
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+    
+                me.owner.trigger('stopUpload');
+            },
+    
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.runing;
+            },
+    
+            getStats: function() {
+                return this.request('get-stats');
+            },
+    
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = this.request( 'get-file', file );
+    
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+    
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+    
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+    
+                this.owner.trigger( 'uploadSkip', file );
+            },
+    
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+    
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+    
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+    
+                    fn = function( val ) {
+                        me._promise = null;
+    
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+    
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+    
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me.getStats().numOfQueue ) {
+                    me.runing = false;
+    
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+    
+            _nextBlock: function() {
+                var me = this,
+                    act = me._act,
+                    opts = me.options,
+                    next, done;
+    
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( act && act.has() &&
+                        act.file.getStatus() === Status.PROGRESS ) {
+    
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+    
+                    return act.fetch();
+    
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+    
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me.getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+    
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+    
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me._act = act;
+                        return act.fetch();
+                    };
+    
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    return isPromise( next ) ?
+                            next[ next.pipe ? 'pipe' : 'then']( done ) :
+                            done( next );
+                }
+            },
+    
+    
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+    
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+    
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.QUEUED ) {
+                            me.owner.trigger( 'uploadStart', file );
+                            file.setStatus( Status.PROGRESS );
+                            return file;
+                        }
+    
+                        return me._finishFile( file );
+                    });
+    
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+    
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+    
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+    
+                    pending.push( promise );
+                }
+            },
+    
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+    
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+    
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+    
+                me.pool.push( block );
+                me.remaning++;
+    
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+    
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+    
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+    
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+    
+    
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+    
+    
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+    
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+    
+                block.transport = tr;
+    
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+    
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    var totalPercent = 0,
+                        uploaded = 0;
+    
+                    // 可能没有abort掉,progress还是执行进来了。
+                    // if ( !file.blocks ) {
+                    //     return;
+                    // }
+    
+                    totalPercent = block.percentage = percentage;
+    
+                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。
+                        $.each( file.blocks, function( _, v ) {
+                            uploaded += (v.percentage || 0) * (v.end - v.start);
+                        });
+    
+                        totalPercent = uploaded / file.size;
+                    }
+    
+                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+                });
+    
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+    
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+    
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+    
+                    return reject;
+                };
+    
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+    
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+    
+                        block.retried++;
+                        tr.send();
+    
+                    } else {
+    
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+    
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+    
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+    
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+    
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+    
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+    
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+    
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+    
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+    
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+    
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+    
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+    
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            }
+    
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+    
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+    
+        var $ = Base.$,
+            validators = {},
+            api;
+    
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * @for  Uploader
+         */
+    
+        // 暴露给外面的api
+        api = {
+    
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+    
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+    
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            init: function() {
+                var me = this;
+                $.each( validators, function() {
+                    this.call( me.owner );
+                });
+            }
+        });
+    
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileNumLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return count >= max ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+    
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+    
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileSizeLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+    
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return invalid ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', file );
+                    return false;
+                }
+    
+            });
+    
+        });
+    
+        /**
+         * @property {int} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+    
+            if ( opts.duplicate ) {
+                return;
+            }
+    
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+    
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+    
+                return hash;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+    
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (mapping[ hash ] = true);
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (delete mapping[ hash ]);
+            });
+        });
+    
+        return api;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+    
+        function CompBase( owner, runtime ) {
+    
+            this.owner = owner;
+            this.options = owner.options;
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+    
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+    
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var type = 'html5',
+            components = {};
+    
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destory = this.destory;
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+    
+            me.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+    
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+    
+        });
+    
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+    
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+    
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+    
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+    
+                blob = slice.call( blob, start, end );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+    
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+    
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+    
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+    
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+    
+                e = e.originalEvent || e;
+    
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+    
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+    
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+    
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+    
+    
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+    
+                return false;
+            },
+    
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+    
+                return false;
+            },
+    
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+    
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+    
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+    
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 );
+    
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                me._getTansferFiles( e, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+    
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+    
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( e, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, dataTransfer, file, item, i, len, canAccessFolder;
+    
+                e = e.originalEvent || e;
+    
+                dataTransfer = e.dataTransfer;
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+    
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+    
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+    
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+    
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+    
+                Base.when.apply( Base, promises ).done(function() {
+    
+                    if ( !results.length ) {
+                        return;
+                    }
+    
+                    callback( results );
+                });
+            },
+    
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+    
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+    
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+    
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+    
+                return deferred.promise();
+            },
+    
+            destroy: function() {
+                var elem = this.elem;
+    
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragEnterHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+    
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+    
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+    
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+    
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+    
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+    
+                    allowed.push( new File( ruid, blob ) );
+                }
+    
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+    
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var $ = Base.$;
+    
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    lable = $( document.createElement('label') ),
+                    input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+    
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+    
+                lable.on( 'click', function() {
+                    input.trigger('click');
+                });
+    
+                lable.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+    
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+    
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+    
+                    input.attr( 'accept', arr.join(',') );
+                }
+    
+                container.append( input );
+                container.append( lable );
+    
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+    
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+    
+                    me.files = e.target.files;
+    
+                    // reset input
+                    clone = this.cloneNode( true );
+                    this.parentNode.replaceChild( clone, this );
+    
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+    
+                    owner.trigger('change');
+                });
+    
+                lable.on( 'mouseenter mouseleave', mouseHandler );
+    
+            },
+    
+    
+            getFiles: function() {
+                return this.files;
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/util',[
+        'base'
+    ], function( Base ) {
+    
+        var urlAPI = window.createObjectURL && window ||
+                window.URL && URL.revokeObjectURL && URL ||
+                window.webkitURL,
+            createObjectURL = Base.noop,
+            revokeObjectURL = createObjectURL;
+    
+        if ( urlAPI ) {
+    
+            // 更安全的方式调用,比如android里面就能把context改成其他的对象。
+            createObjectURL = function() {
+                return urlAPI.createObjectURL.apply( urlAPI, arguments );
+            };
+    
+            revokeObjectURL = function() {
+                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
+            };
+        }
+    
+        return {
+            createObjectURL: createObjectURL,
+            revokeObjectURL: revokeObjectURL,
+    
+            dataURL2Blob: function( dataURI ) {
+                var byteStr, intArray, ab, i, mimetype, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                ab = new ArrayBuffer( byteStr.length );
+                intArray = new Uint8Array( ab );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
+    
+                return this.arrayBufferToBlob( ab, mimetype );
+            },
+    
+            dataURL2ArrayBuffer: function( dataURI ) {
+                var byteStr, intArray, i, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                intArray = new Uint8Array( byteStr.length );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                return intArray.buffer;
+            },
+    
+            arrayBufferToBlob: function( buffer, type ) {
+                var builder = window.BlobBuilder || window.WebKitBlobBuilder,
+                    bb;
+    
+                // android不支持直接new Blob, 只能借助blobbuilder.
+                if ( builder ) {
+                    bb = new builder();
+                    bb.append( buffer );
+                    return bb.getBlob( type );
+                }
+    
+                return new Blob([ buffer ], type ? { type: type } : {} );
+            },
+    
+            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
+            // 你得到的结果是png.
+            canvasToDataUrl: function( canvas, type, quality ) {
+                return canvas.toDataURL( type, quality / 100 );
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            parseMeta: function( blob, callback ) {
+                callback( false, {});
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            updateImageHead: function( data ) {
+                return data;
+            }
+        };
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/imagemeta',[
+        'runtime/html5/util'
+    ], function( Util ) {
+    
+        var api;
+    
+        api = {
+            parsers: {
+                0xffe1: []
+            },
+    
+            maxMetaDataSize: 262144,
+    
+            parse: function( blob, cb ) {
+                var me = this,
+                    fr = new FileReader();
+    
+                fr.onload = function() {
+                    cb( false, me._parse( this.result ) );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                fr.onerror = function( e ) {
+                    cb( e.message );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                blob = blob.slice( 0, me.maxMetaDataSize );
+                fr.readAsArrayBuffer( blob.getSource() );
+            },
+    
+            _parse: function( buffer, noParse ) {
+                if ( buffer.byteLength < 6 ) {
+                    return;
+                }
+    
+                var dataview = new DataView( buffer ),
+                    offset = 2,
+                    maxOffset = dataview.byteLength - 4,
+                    headLength = offset,
+                    ret = {},
+                    markerBytes, markerLength, parsers, i;
+    
+                if ( dataview.getUint16( 0 ) === 0xffd8 ) {
+    
+                    while ( offset < maxOffset ) {
+                        markerBytes = dataview.getUint16( offset );
+    
+                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
+                                markerBytes === 0xfffe ) {
+    
+                            markerLength = dataview.getUint16( offset + 2 ) + 2;
+    
+                            if ( offset + markerLength > dataview.byteLength ) {
+                                break;
+                            }
+    
+                            parsers = api.parsers[ markerBytes ];
+    
+                            if ( !noParse && parsers ) {
+                                for ( i = 0; i < parsers.length; i += 1 ) {
+                                    parsers[ i ].call( api, dataview, offset,
+                                            markerLength, ret );
+                                }
+                            }
+    
+                            offset += markerLength;
+                            headLength = offset;
+                        } else {
+                            break;
+                        }
+                    }
+    
+                    if ( headLength > 6 ) {
+                        if ( buffer.slice ) {
+                            ret.imageHead = buffer.slice( 2, headLength );
+                        } else {
+                            // Workaround for IE10, which does not yet
+                            // support ArrayBuffer.slice:
+                            ret.imageHead = new Uint8Array( buffer )
+                                    .subarray( 2, headLength );
+                        }
+                    }
+                }
+    
+                return ret;
+            },
+    
+            updateImageHead: function( buffer, head ) {
+                var data = this._parse( buffer, true ),
+                    buf1, buf2, bodyoffset;
+    
+    
+                bodyoffset = 2;
+                if ( data.imageHead ) {
+                    bodyoffset = 2 + data.imageHead.byteLength;
+                }
+    
+                if ( buffer.slice ) {
+                    buf2 = buffer.slice( bodyoffset );
+                } else {
+                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
+                }
+    
+                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
+    
+                buf1[ 0 ] = 0xFF;
+                buf1[ 1 ] = 0xD8;
+                buf1.set( new Uint8Array( head ), 2 );
+                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
+    
+                return buf1.buffer;
+            }
+        };
+    
+        Util.parseMeta = function() {
+            return api.parse.apply( api, arguments );
+        };
+    
+        Util.updateImageHead = function() {
+            return api.updateImageHead.apply( api, arguments );
+        };
+    
+        return api;
+    });
+    /**
+     * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
+     * 暂时项目中只用了orientation.
+     *
+     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
+     * @fileOverview EXIF解析
+     */
+    
+    // Sample
+    // ====================================
+    // Make : Apple
+    // Model : iPhone 4S
+    // Orientation : 1
+    // XResolution : 72 [72/1]
+    // YResolution : 72 [72/1]
+    // ResolutionUnit : 2
+    // Software : QuickTime 7.7.1
+    // DateTime : 2013:09:01 22:53:55
+    // ExifIFDPointer : 190
+    // ExposureTime : 0.058823529411764705 [1/17]
+    // FNumber : 2.4 [12/5]
+    // ExposureProgram : Normal program
+    // ISOSpeedRatings : 800
+    // ExifVersion : 0220
+    // DateTimeOriginal : 2013:09:01 22:52:51
+    // DateTimeDigitized : 2013:09:01 22:52:51
+    // ComponentsConfiguration : YCbCr
+    // ShutterSpeedValue : 4.058893515764426
+    // ApertureValue : 2.5260688216892597 [4845/1918]
+    // BrightnessValue : -0.3126686601998395
+    // MeteringMode : Pattern
+    // Flash : Flash did not fire, compulsory flash mode
+    // FocalLength : 4.28 [107/25]
+    // SubjectArea : [4 values]
+    // FlashpixVersion : 0100
+    // ColorSpace : 1
+    // PixelXDimension : 2448
+    // PixelYDimension : 3264
+    // SensingMethod : One-chip color area sensor
+    // ExposureMode : 0
+    // WhiteBalance : Auto white balance
+    // FocalLengthIn35mmFilm : 35
+    // SceneCaptureType : Standard
+    define('runtime/html5/imagemeta/exif',[
+        'base',
+        'runtime/html5/imagemeta'
+    ], function( Base, ImageMeta ) {
+    
+        var EXIF = {};
+    
+        EXIF.ExifMap = function() {
+            return this;
+        };
+    
+        EXIF.ExifMap.prototype.map = {
+            'Orientation': 0x0112
+        };
+    
+        EXIF.ExifMap.prototype.get = function( id ) {
+            return this[ id ] || this[ this.map[ id ] ];
+        };
+    
+        EXIF.exifTagTypes = {
+            // byte, 8-bit unsigned int:
+            1: {
+                getValue: function( dataView, dataOffset ) {
+                    return dataView.getUint8( dataOffset );
+                },
+                size: 1
+            },
+    
+            // ascii, 8-bit byte:
+            2: {
+                getValue: function( dataView, dataOffset ) {
+                    return String.fromCharCode( dataView.getUint8( dataOffset ) );
+                },
+                size: 1,
+                ascii: true
+            },
+    
+            // short, 16 bit int:
+            3: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint16( dataOffset, littleEndian );
+                },
+                size: 2
+            },
+    
+            // long, 32 bit int:
+            4: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // rational = two long values,
+            // first is numerator, second is denominator:
+            5: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian ) /
+                        dataView.getUint32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            },
+    
+            // slong, 32 bit signed int:
+            9: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // srational, two slongs, first is numerator, second is denominator:
+            10: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian ) /
+                        dataView.getInt32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            }
+        };
+    
+        // undefined, 8-bit byte, value depending on field:
+        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
+    
+        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
+                littleEndian ) {
+    
+            var tagType = EXIF.exifTagTypes[ type ],
+                tagSize, dataOffset, values, i, str, c;
+    
+            if ( !tagType ) {
+                Base.log('Invalid Exif data: Invalid tag type.');
+                return;
+            }
+    
+            tagSize = tagType.size * length;
+    
+            // Determine if the value is contained in the dataOffset bytes,
+            // or if the value at the dataOffset is a pointer to the actual data:
+            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
+                    littleEndian ) : (offset + 8);
+    
+            if ( dataOffset + tagSize > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid data offset.');
+                return;
+            }
+    
+            if ( length === 1 ) {
+                return tagType.getValue( dataView, dataOffset, littleEndian );
+            }
+    
+            values = [];
+    
+            for ( i = 0; i < length; i += 1 ) {
+                values[ i ] = tagType.getValue( dataView,
+                        dataOffset + i * tagType.size, littleEndian );
+            }
+    
+            if ( tagType.ascii ) {
+                str = '';
+    
+                // Concatenate the chars:
+                for ( i = 0; i < values.length; i += 1 ) {
+                    c = values[ i ];
+    
+                    // Ignore the terminating NULL byte(s):
+                    if ( c === '\u0000' ) {
+                        break;
+                    }
+                    str += c;
+                }
+    
+                return str;
+            }
+            return values;
+        };
+    
+        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
+                data ) {
+    
+            var tag = dataView.getUint16( offset, littleEndian );
+            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
+                    dataView.getUint16( offset + 2, littleEndian ),    // tag type
+                    dataView.getUint32( offset + 4, littleEndian ),    // tag length
+                    littleEndian );
+        };
+    
+        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
+                littleEndian, data ) {
+    
+            var tagsNumber, dirEndOffset, i;
+    
+            if ( dirOffset + 6 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory offset.');
+                return;
+            }
+    
+            tagsNumber = dataView.getUint16( dirOffset, littleEndian );
+            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
+    
+            if ( dirEndOffset + 4 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory size.');
+                return;
+            }
+    
+            for ( i = 0; i < tagsNumber; i += 1 ) {
+                this.parseExifTag( dataView, tiffOffset,
+                        dirOffset + 2 + 12 * i,    // tag offset
+                        littleEndian, data );
+            }
+    
+            // Return the offset to the next directory:
+            return dataView.getUint32( dirEndOffset, littleEndian );
+        };
+    
+        // EXIF.getExifThumbnail = function(dataView, offset, length) {
+        //     var hexData,
+        //         i,
+        //         b;
+        //     if (!length || offset + length > dataView.byteLength) {
+        //         Base.log('Invalid Exif data: Invalid thumbnail data.');
+        //         return;
+        //     }
+        //     hexData = [];
+        //     for (i = 0; i < length; i += 1) {
+        //         b = dataView.getUint8(offset + i);
+        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));
+        //     }
+        //     return 'data:image/jpeg,%' + hexData.join('%');
+        // };
+    
+        EXIF.parseExifData = function( dataView, offset, length, data ) {
+    
+            var tiffOffset = offset + 10,
+                littleEndian, dirOffset;
+    
+            // Check for the ASCII code for "Exif" (0x45786966):
+            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
+                // No Exif data, might be XMP data instead
+                return;
+            }
+            if ( tiffOffset + 8 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid segment size.');
+                return;
+            }
+    
+            // Check for the two null bytes:
+            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
+                Base.log('Invalid Exif data: Missing byte alignment offset.');
+                return;
+            }
+    
+            // Check the byte alignment:
+            switch ( dataView.getUint16( tiffOffset ) ) {
+                case 0x4949:
+                    littleEndian = true;
+                    break;
+    
+                case 0x4D4D:
+                    littleEndian = false;
+                    break;
+    
+                default:
+                    Base.log('Invalid Exif data: Invalid byte alignment marker.');
+                    return;
+            }
+    
+            // Check for the TIFF tag marker (0x002A):
+            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
+                Base.log('Invalid Exif data: Missing TIFF marker.');
+                return;
+            }
+    
+            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
+            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
+            // Create the exif object to store the tags:
+            data.exif = new EXIF.ExifMap();
+            // Parse the tags of the main image directory and retrieve the
+            // offset to the next directory, usually the thumbnail directory:
+            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
+                    tiffOffset + dirOffset, littleEndian, data );
+    
+            // 尝试读取缩略图
+            // if ( dirOffset ) {
+            //     thumbnailData = {exif: {}};
+            //     dirOffset = EXIF.parseExifTags(
+            //         dataView,
+            //         tiffOffset,
+            //         tiffOffset + dirOffset,
+            //         littleEndian,
+            //         thumbnailData
+            //     );
+    
+            //     // Check for JPEG Thumbnail offset:
+            //     if (thumbnailData.exif[0x0201]) {
+            //         data.exif.Thumbnail = EXIF.getExifThumbnail(
+            //             dataView,
+            //             tiffOffset + thumbnailData.exif[0x0201],
+            //             thumbnailData.exif[0x0202] // Thumbnail data length
+            //         );
+            //     }
+            // }
+        };
+    
+        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
+        return EXIF;
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('runtime/html5/image',[
+        'base',
+        'runtime/html5/runtime',
+        'runtime/html5/util'
+    ], function( Base, Html5Runtime, Util ) {
+    
+        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
+    
+        return Html5Runtime.register( 'Image', {
+    
+            // flag: 标记是否被修改过。
+            modified: false,
+    
+            init: function() {
+                var me = this,
+                    img = new Image();
+    
+                img.onload = function() {
+    
+                    me._info = {
+                        type: me.type,
+                        width: this.width,
+                        height: this.height
+                    };
+    
+                    // 读取meta信息。
+                    if ( !me._metas && 'image/jpeg' === me.type ) {
+                        Util.parseMeta( me._blob, function( error, ret ) {
+                            me._metas = ret;
+                            me.owner.trigger('load');
+                        });
+                    } else {
+                        me.owner.trigger('load');
+                    }
+                };
+    
+                img.onerror = function() {
+                    me.owner.trigger('error');
+                };
+    
+                me._img = img;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    img = me._img;
+    
+                me._blob = blob;
+                me.type = blob.type;
+                img.src = Util.createObjectURL( blob.getSource() );
+                me.owner.once( 'load', function() {
+                    Util.revokeObjectURL( img.src );
+                });
+            },
+    
+            resize: function( width, height ) {
+                var canvas = this._canvas ||
+                        (this._canvas = document.createElement('canvas'));
+    
+                this._resize( this._img, canvas, width, height );
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger('complete');
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this._blob,
+                    opts = this.options,
+                    canvas;
+    
+                type = type || this.type;
+    
+                // blob需要重新生成。
+                if ( this.modified || this.type !== type ) {
+                    canvas = this._canvas;
+    
+                    if ( type === 'image/jpeg' ) {
+    
+                        blob = Util.canvasToDataUrl( canvas, 'image/jpeg',
+                                opts.quality );
+    
+                        if ( opts.preserveHeaders && this._metas &&
+                                this._metas.imageHead ) {
+    
+                            blob = Util.dataURL2ArrayBuffer( blob );
+                            blob = Util.updateImageHead( blob,
+                                    this._metas.imageHead );
+                            blob = Util.arrayBufferToBlob( blob, type );
+                            return blob;
+                        }
+                    } else {
+                        blob = Util.canvasToDataUrl( canvas, type );
+                    }
+    
+                    blob = Util.dataURL2Blob( blob );
+                }
+    
+                return blob;
+            },
+    
+            getAsDataUrl: function( type ) {
+                var opts = this.options;
+    
+                type = type || this.type;
+    
+                if ( type === 'image/jpeg' ) {
+                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );
+                } else {
+                    return this._canvas.toDataURL( type );
+                }
+            },
+    
+            getOrientation: function() {
+                return this._metas && this._metas.exif &&
+                        this._metas.exif.get('Orientation') || 1;
+            },
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            destroy: function() {
+                var canvas = this._canvas;
+                this._img.onload = null;
+    
+                if ( canvas ) {
+                    canvas.getContext('2d')
+                            .clearRect( 0, 0, canvas.width, canvas.height );
+                    canvas.width = canvas.height = 0;
+                    this._canvas = null;
+                }
+    
+                // 释放内存。非常重要,否则释放不了image的内存。
+                this._img.src = BLANK;
+                this._img = this._blob = null;
+            },
+    
+            _resize: function( img, cvs, width, height ) {
+                var opts = this.options,
+                    naturalWidth = img.width,
+                    naturalHeight = img.height,
+                    orientation = this.getOrientation(),
+                    scale, w, h, x, y;
+    
+                // values that require 90 degree rotation
+                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+    
+                    // 交换width, height的值。
+                    width ^= height;
+                    height ^= width;
+                    width ^= height;
+                }
+    
+                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
+                        height / naturalHeight );
+    
+                // 不允许放大。
+                opts.allowMagnify || (scale = Math.min( 1, scale ));
+    
+                w = naturalWidth * scale;
+                h = naturalHeight * scale;
+    
+                if ( opts.crop ) {
+                    cvs.width = width;
+                    cvs.height = height;
+                } else {
+                    cvs.width = w;
+                    cvs.height = h;
+                }
+    
+                x = (cvs.width - w) / 2;
+                y = (cvs.height - h) / 2;
+    
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+    
+                this._renderImageToCanvas( cvs, img, x, y, w, h );
+            },
+    
+            _rotate2Orientaion: function( canvas, orientation ) {
+                var width = canvas.width,
+                    height = canvas.height,
+                    ctx = canvas.getContext('2d');
+    
+                switch ( orientation ) {
+                    case 5:
+                    case 6:
+                    case 7:
+                    case 8:
+                        canvas.width = height;
+                        canvas.height = width;
+                        break;
+                }
+    
+                switch ( orientation ) {
+                    case 2:    // horizontal flip
+                        ctx.translate( width, 0 );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 3:    // 180 rotate left
+                        ctx.translate( width, height );
+                        ctx.rotate( Math.PI );
+                        break;
+    
+                    case 4:    // vertical flip
+                        ctx.translate( 0, height );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 5:    // vertical flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 6:    // 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( 0, -height );
+                        break;
+    
+                    case 7:    // horizontal flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( width, -height );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 8:    // 90 rotate left
+                        ctx.rotate( -0.5 * Math.PI );
+                        ctx.translate( -width, 0 );
+                        break;
+                }
+            },
+    
+            // https://github.com/stomita/ios-imagefile-megapixel/
+            // blob/master/src/megapix-image.js
+            _renderImageToCanvas: (function() {
+    
+                // 如果不是ios, 不需要这么复杂!
+                if ( !Base.os.ios ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        canvas.getContext('2d').drawImage( img, x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detecting vertical squash in loaded image.
+                 * Fixes a bug which squash image vertically while drawing into
+                 * canvas for some images.
+                 */
+                function detectVerticalSquash( img, iw, ih ) {
+                    var canvas = document.createElement('canvas'),
+                        ctx = canvas.getContext('2d'),
+                        sy = 0,
+                        ey = ih,
+                        py = ih,
+                        data, alpha, ratio;
+    
+    
+                    canvas.width = 1;
+                    canvas.height = ih;
+                    ctx.drawImage( img, 0, 0 );
+                    data = ctx.getImageData( 0, 0, 1, ih ).data;
+    
+                    // search image edge pixel position in case
+                    // it is squashed vertically.
+                    while ( py > sy ) {
+                        alpha = data[ (py - 1) * 4 + 3 ];
+    
+                        if ( alpha === 0 ) {
+                            ey = py;
+                        } else {
+                            sy = py;
+                        }
+    
+                        py = (ey + sy) >> 1;
+                    }
+    
+                    ratio = (py / ih);
+                    return (ratio === 0) ? 1 : ratio;
+                }
+    
+                // fix ie7 bug
+                // http://stackoverflow.com/questions/11929099/
+                // html5-canvas-drawimage-ratio-bug-ios
+                if ( Base.os.ios >= 7 ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        var iw = img.naturalWidth,
+                            ih = img.naturalHeight,
+                            vertSquashRatio = detectVerticalSquash( img, iw, ih );
+    
+                        return canvas.getContext('2d').drawImage( img, 0, 0,
+                            iw * vertSquashRatio, ih * vertSquashRatio,
+                            x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detect subsampling in loaded image.
+                 * In iOS, larger images than 2M pixels may be
+                 * subsampled in rendering.
+                 */
+                function detectSubsampling( img ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        canvas, ctx;
+    
+                    // subsampling may happen overmegapixel image
+                    if ( iw * ih > 1024 * 1024 ) {
+                        canvas = document.createElement('canvas');
+                        canvas.width = canvas.height = 1;
+                        ctx = canvas.getContext('2d');
+                        ctx.drawImage( img, -iw + 1, 0 );
+    
+                        // subsampled image becomes half smaller in rendering size.
+                        // check alpha channel value to confirm image is covering
+                        // edge pixel or not. if alpha value is 0
+                        // image is not covering, hence subsampled.
+                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
+                    } else {
+                        return false;
+                    }
+                }
+    
+    
+                return function( canvas, img, x, y, width, height ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        ctx = canvas.getContext('2d'),
+                        subsampled = detectSubsampling( img ),
+                        doSquash = this.type === 'image/jpeg',
+                        d = 1024,
+                        sy = 0,
+                        dy = 0,
+                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
+    
+                    if ( subsampled ) {
+                        iw /= 2;
+                        ih /= 2;
+                    }
+    
+                    ctx.save();
+                    tmpCanvas = document.createElement('canvas');
+                    tmpCanvas.width = tmpCanvas.height = d;
+    
+                    tmpCtx = tmpCanvas.getContext('2d');
+                    vertSquashRatio = doSquash ?
+                            detectVerticalSquash( img, iw, ih ) : 1;
+    
+                    dw = Math.ceil( d * width / iw );
+                    dh = Math.ceil( d * height / ih / vertSquashRatio );
+    
+                    while ( sy < ih ) {
+                        sx = 0;
+                        dx = 0;
+                        while ( sx < iw ) {
+                            tmpCtx.clearRect( 0, 0, d, d );
+                            tmpCtx.drawImage( img, -sx, -sy );
+                            ctx.drawImage( tmpCanvas, 0, 0, d, d,
+                                    x + dx, y + dy, dw, dh );
+                            sx += d;
+                            dx += dw;
+                        }
+                        sy += d;
+                        dy += dh;
+                    }
+                    ctx.restore();
+                    tmpCanvas = tmpCtx = null;
+                };
+            })()
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var noop = Base.noop,
+            $ = Base.$;
+    
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+    
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+    
+                if ( binary ) {
+                    xhr.overrideMimeType('application/octet-stream');
+    
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+    
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+    
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+    
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+    
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+    
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+    
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+    
+                    return me.trigger( 'progress', percentage );
+                };
+    
+                xhr.onreadystatechange = function() {
+    
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+    
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+    
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+    
+    
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+    
+            _parseJson: function( str ) {
+                var json;
+    
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+    
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview 只有html5实现的文件版本。
+     */
+    define('preset/html5only',[
+        'base',
+    
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+    
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/imagemeta/exif',
+        'runtime/html5/image',
+        'runtime/html5/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/html5only'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.html5only.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.html5only.min.js
new file mode 100644
index 0000000..866dcde
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.html5only.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",getDimension:"get-dimension",addButton:"add-btn",getRuntimeType:"get-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.disconnectRuntime()}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.exec("destroy"),this.disconnectRuntime(),this.off()}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){b._info=b._info||d.info(),b._meta=b._meta||d.meta(),d.resize(g.width,g.height)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,a.size<c&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destory:function(){delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d.getStats().numOfQueue||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_nextBlock:function(){var a,b,c=this,d=c._act,f=c.options;return d&&d.has()&&d.file.getStatus()===h.PROGRESS?(f.prepareNextFile&&!c.pending.length&&c._prepareNextFile(),d.fetch()):c.runing?(!c.pending.length&&c.getStats().numOfQueue&&c._prepareNextFile(),a=c.pending.shift(),b=function(a){return a?(d=e(a,f.chunked?f.chunkSize:0),c._act=d,d.fetch()):null},g(a)?a[a.pipe?"pipe":"then"](b):b(a)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.QUEUED?(b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),c):b._finishFile(c)}),a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d._popBlock(b),a.nextTick(d.__tick))})},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){var c=0,d=0;c=b.percentage=a,b.chunks>1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))
+},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b=this,f=b.getRuid(),g=b.elem.parent().get(0);return g&&!d.contains(g,a.currentTarget)?!1:(b._getTansferFiles(a,function(a){b.trigger("drop",d.map(a,function(a){return new c(f,a)}))}),b.dndOver=!1,b.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k,l=[],m=[];for(b=b.originalEvent||b,f=b.dataTransfer,d=f.items,e=f.files,k=!(!d||!d[0].webkitGetAsEntry),i=0,j=e.length;j>i;i++)g=e[i],h=d&&d[i],k&&h.webkitGetAsEntry().isDirectory?m.push(this._traverseDirectoryTree(h.webkitGetAsEntry(),l)):l.push(g);a.when.apply(a,m).done(function(){l.length&&c(l)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragEnterHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;e<b.length;e++)c[e]=b.charCodeAt(e);return f=g[0].split(":")[1].split(";")[0],this.arrayBufferToBlob(d,f)},dataURL2ArrayBuffer:function(a){var b,c,d,e;for(e=a.split(","),b=~e[0].indexOf("base64")?atob(e[1]):decodeURIComponent(e[1]),c=new Uint8Array(b.length),d=0;d<b.length;d++)c[d]=b.charCodeAt(d);return c.buffer},arrayBufferToBlob:function(b,c){var d,e=a.BlobBuilder||a.WebKitBlobBuilder;return e?(d=new e,d.append(b),d.getBlob(c)):new Blob([b],c?{type:c}:{})},canvasToDataUrl:function(a,b,c){return a.toDataURL(b,c/100)},parseMeta:function(a,b){b(!1,{})},updateImageHead:function(a){return a}}}),b("runtime/html5/imagemeta",["runtime/html5/util"],function(a){var b;return b={parsers:{65505:[]},maxMetaDataSize:262144,parse:function(a,b){var c=this,d=new FileReader;d.onload=function(){b(!1,c._parse(this.result)),d=d.onload=d.onerror=null},d.onerror=function(a){b(a.message),d=d.onload=d.onerror=null},a=a.slice(0,c.maxMetaDataSize),d.readAsArrayBuffer(a.getSource())},_parse:function(a,c){if(!(a.byteLength<6)){var d,e,f,g,h=new DataView(a),i=2,j=h.byteLength-4,k=i,l={};if(65496===h.getUint16(0)){for(;j>i&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g<f.length;g+=1)f[g].call(b,h,i,e,l);i+=e,k=i}k>6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;l<k.length&&(n=k[l],"\x00"!==n);l+=1)m+=n;return m}return k},c.parseExifTag=function(a,b,d,e,f){var g=a.getUint16(d,e);f.exif[g]=c.getExifValue(a,b,d,a.getUint16(d+2,e),a.getUint32(d+4,e),e)},c.parseExifTags=function(b,c,d,e,f){var g,h,i;if(d+6>b.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,"image/jpeg",e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(a,b,c,d,e,f){a.getContext("2d").drawImage(b,c,d,e,f)}}()})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("preset/html5only",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/image","runtime/html5/transport"],function(a){return a}),b("webuploader",["preset/html5only"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.js
new file mode 100644
index 0000000..39d9351
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.js
@@ -0,0 +1,6733 @@
+/*! WebUploader 0.1.2 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+        },
+
+        exports = factory( root, _define, _require ),
+        origin;
+
+    // exports every module.
+    exportsTo( exports );
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = exports;
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([], exports );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = exports;
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( this, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        return window.jQuery || window.Zepto;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+    
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+    
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档将可能省略`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+    
+        var noop = function() {},
+            call = Function.call;
+    
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+    
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+    
+        function createObject( proto ) {
+            var f;
+    
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+    
+    
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+    
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.2',
+    
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+    
+            Deferred: promise.Deferred,
+    
+            isPromise: promise.isPromise,
+    
+            when: promise.when,
+    
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+    
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+    
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+    
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+    
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+    
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+    
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+    
+                /* jshint camelcase: false */
+    
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+    
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+    
+                return child;
+            },
+    
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+    
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+    
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+    
+            nextTick: (function() {
+    
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+    
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+    
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+    
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+    
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+    
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+    
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+    
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+    
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+    
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+    
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+    
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+    
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+    
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+    
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+    
+            while ( ++i < len ) {
+                handler = events[ i ];
+    
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+    
+            return !stoped;
+        }
+    
+        protos = {
+    
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+    
+                if ( !callback ) {
+                    return this;
+                }
+    
+                set = this._events || (this._events = []);
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+    
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+    
+                    set.push( handler );
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+    
+                if ( !callback ) {
+                    return me;
+                }
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+    
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+    
+                return me;
+            },
+    
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+    
+                if ( !events ) {
+                    return this;
+                }
+    
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+    
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+    
+                if ( !this._events || !type ) {
+                    return this;
+                }
+    
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+    
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+    
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+    
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+    
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$;
+    
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+    
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+    
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            getRuntimeType: 'get-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+    
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+    
+            _init: function( opts ) {
+                var me = this;
+    
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+    
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     resize: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.options( 'resize', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+    
+                // setter
+                if ( arguments.length > 1 ) {
+    
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+    
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+    
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `queueNum` 还在队列中的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+    
+                return {
+                    successNum: stats.numOfSuccess,
+    
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue
+                };
+            },
+    
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+    
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+    
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+    
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+    
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+    
+                    return false;
+                }
+    
+                return true;
+            },
+    
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+    
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+    
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+    
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            factories = {},
+    
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+    
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+    
+        $.extend( Runtime.prototype, {
+    
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+    
+                if ( this._container ) {
+                    return this._container;
+                }
+    
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+    
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+    
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                return container;
+            },
+    
+            init: Base.noop,
+            exec: Base.noop,
+    
+            destroy: function() {
+                if ( this._container ) {
+                    this._container.parentNode.removeChild( this.__container );
+                }
+    
+                this.off();
+            }
+        });
+    
+        Runtime.orders = 'html5,flash';
+    
+    
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+    
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+    
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+    
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+    
+            type = type || getFirstKey( factories );
+    
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+    
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+    
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+    
+        var cache;
+    
+        cache = (function() {
+            var obj = {};
+    
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+    
+                get: function( ruid, standalone ) {
+                    var i;
+    
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+    
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+    
+                        return obj[ i ];
+                    }
+    
+                    return null;
+                },
+    
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+    
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+    
+            this.uid = Base.guid('client_');
+    
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+    
+            this.connectRuntime = function( opts, cb ) {
+    
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+    
+                deferred.done( cb );
+    
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+    
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+    
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+    
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                runtime.__client--;
+    
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+    
+                runtime = null;
+            };
+    
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+    
+                return runtime.exec.apply( this, args );
+            };
+    
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+    
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+    
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+    
+            opts.container = $( opts.container );
+    
+            if ( !opts.container.length ) {
+                return;
+            }
+    
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+    
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.disconnectRuntime();
+            }
+        });
+    
+        Mediator.installTo( DragAndDrop.prototype );
+    
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+    
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            IGNORE = {},
+            widgetClass = [];
+    
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+    
+            var length = obj.length,
+                type = $.type( obj );
+    
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+    
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+    
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+    
+        $.extend( Widget.prototype, {
+    
+            init: Base.noop,
+    
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+    
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+    
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+    
+                    return IGNORE;
+                }
+    
+                return this[ map[ apiName ] ].apply( this, args );
+    
+            },
+    
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+    
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+    
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [];
+    
+                $.each( widgetClass, function( _, klass ) {
+                    widgets.push( new klass( me ) );
+                });
+    
+                return _init.apply( me, arguments );
+            },
+    
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+    
+                args = isArrayLike( args ) ? args : [ args ];
+    
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+    
+                    if ( rlt !== IGNORE ) {
+    
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+    
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+    
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个tick中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+    
+                                setTimeout(function() {
+                                    deferred.resolve.apply( deferred, args );
+                                }, 1 );
+    
+                                return deferred.promise();
+                            })[ key ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            }
+        });
+    
+        /**
+         * 添加组件
+         * @param  {object} widgetProto 组件原型,构造函数通过constructor属性定义
+         * @param  {object} responseMap API名称与函数实现的映射
+         * @example
+         *     Uploader.register( {
+         *         init: function( options ) {},
+         *         makeThumb: function() {}
+         *     }, {
+         *         'make-thumb': 'makeThumb'
+         *     } );
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init' },
+                klass;
+    
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+                widgetProto.responseMap = map;
+            } else {
+                widgetProto.responseMap = $.extend( map, responseMap );
+            }
+    
+            klass = Base.inherits( Widget, widgetProto );
+            widgetClass.push( klass );
+    
+            return klass;
+        };
+    
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+    
+        Uploader.options.dnd = '';
+    
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+    
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+    
+                dnd = new Dnd( options );
+    
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+    
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+    
+                dnd.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.exec('destroy');
+                this.disconnectRuntime();
+                this.off();
+            }
+        });
+    
+        Mediator.installTo( FilePaste.prototype );
+    
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+    
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+    
+                paste = new FilePaste( options );
+    
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+    
+        function Blob( ruid, source ) {
+            var me = this;
+    
+            me.source = source;
+            me.ruid = ruid;
+    
+            RuntimeClient.call( me, 'Blob' );
+    
+            this.uid = source.uid || this.uid;
+            this.type = source.type || '';
+            this.size = source.size || 0;
+    
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+    
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+    
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+    
+            getSource: function() {
+                return this.source;
+            }
+        });
+    
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+    
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+    
+        function File( ruid, file ) {
+            var ext;
+    
+            Blob.apply( this, arguments );
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+    
+            // todo 支持其他类型文件的转换。
+    
+            // 如果有mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && this.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+    
+            // 如果没有指定mimetype, 但是知道文件后缀。
+            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
+                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
+            }
+    
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+        }
+    
+        return Base.inherits( Blob, File );
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+    
+        var $ = Base.$;
+    
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+    
+            opts.container = $( opts.id );
+    
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+    
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+    
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+    
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+    
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+    
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+    
+                button.addClass('webuploader-pick');
+    
+                me.on( 'all', function( type ) {
+                    var files;
+    
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+    
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+    
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+    
+                $( window ).on( 'resize', function() {
+                    me.refresh();
+                });
+            },
+    
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+    
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+    
+                    pos = button.offset();
+    
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+    
+            enable: function() {
+                var btn = this.options.button;
+    
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+    
+            disable: function() {
+                var btn = this.options.button;
+    
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+    
+                btn.addClass('webuploader-pick-disable');
+            },
+    
+            destroy: function() {
+                if ( this.runtime ) {
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                }
+            }
+        });
+    
+        return FilePicker;
+    });
+    
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+    
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+    
+        return Uploader.register({
+            'add-btn': 'addButton',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable'
+        }, {
+    
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addButton( opts.pick );
+            },
+    
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+    
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addButton: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    options, picker, deferred;
+    
+                if ( !pick ) {
+                    return;
+                }
+    
+                deferred = Base.Deferred();
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+    
+                options = $.extend({}, pick, {
+                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                    swf: opts.swf,
+                    runtimeOrder: opts.runtimeOrder
+                });
+    
+                picker = new FilePicker( options );
+    
+                picker.once( 'ready', deferred.resolve );
+                picker.on( 'select', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                picker.init();
+    
+                this.pickers.push( picker );
+    
+                return deferred.promise();
+            },
+    
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+    
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('lib/image',[
+        'base',
+        'runtime/client',
+        'lib/blob'
+    ], function( Base, RuntimeClient, Blob ) {
+        var $ = Base.$;
+    
+        // 构造器。
+        function Image( opts ) {
+            this.options = $.extend({}, Image.options, opts );
+            RuntimeClient.call( this, 'Image' );
+    
+            this.on( 'load', function() {
+                this._info = this.exec('info');
+                this._meta = this.exec('meta');
+            });
+        }
+    
+        // 默认选项。
+        Image.options = {
+    
+            // 默认的图片处理质量
+            quality: 90,
+    
+            // 是否裁剪
+            crop: false,
+    
+            // 是否保留头部信息
+            preserveHeaders: true,
+    
+            // 是否允许放大。
+            allowMagnify: true
+        };
+    
+        // 继承RuntimeClient.
+        Base.inherits( RuntimeClient, {
+            constructor: Image,
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    ruid = blob.getRuid();
+    
+                this.connectRuntime( ruid, function() {
+                    me.exec( 'init', me.options );
+                    me.exec( 'loadFromBlob', blob );
+                });
+            },
+    
+            resize: function() {
+                var args = Base.slice( arguments );
+                return this.exec.apply( this, [ 'resize' ].concat( args ) );
+            },
+    
+            getAsDataUrl: function( type ) {
+                return this.exec( 'getAsDataUrl', type );
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this.exec( 'getAsBlob', type );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    
+        return Image;
+    });
+    /**
+     * @fileOverview 图片操作, 负责预览图片和上传前压缩图片
+     */
+    define('widgets/image',[
+        'base',
+        'uploader',
+        'lib/image',
+        'widgets/widget'
+    ], function( Base, Uploader, Image ) {
+    
+        var $ = Base.$,
+            throttle;
+    
+        // 根据要处理的文件大小来节流,一次不能处理太多,会卡。
+        throttle = (function( max ) {
+            var occupied = 0,
+                waiting = [],
+                tick = function() {
+                    var item;
+    
+                    while ( waiting.length && occupied < max ) {
+                        item = waiting.shift();
+                        occupied += item[ 0 ];
+                        item[ 1 ]();
+                    }
+                };
+    
+            return function( emiter, size, cb ) {
+                waiting.push([ size, cb ]);
+                emiter.once( 'destroy', function() {
+                    occupied -= size;
+                    setTimeout( tick, 1 );
+                });
+                setTimeout( tick, 1 );
+            };
+        })( 5 * 1024 * 1024 );
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Object} [thumb]
+             * @namespace options
+             * @for Uploader
+             * @description 配置生成缩略图的选项。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 110,
+             *     height: 110,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 70,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: true,
+             *
+             *     // 是否允许裁剪。
+             *     crop: true,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: false,
+             *
+             *     // 为空的话则保留原有图片格式。
+             *     // 否则强制转换成指定的类型。
+             *     type: 'image/jpeg'
+             * }
+             * ```
+             */
+            thumb: {
+                width: 110,
+                height: 110,
+                quality: 70,
+                allowMagnify: true,
+                crop: true,
+                preserveHeaders: false,
+    
+                // 为空的话则保留原有图片格式。
+                // 否则强制转换成指定的类型。
+                // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                type: 'image/jpeg'
+            },
+    
+            /**
+             * @property {Object} [compress]
+             * @namespace options
+             * @for Uploader
+             * @description 配置压缩的图片的选项。如果此选项为`false`, 则图片在上传前不进行压缩。
+             *
+             * 默认为:
+             *
+             * ```javascript
+             * {
+             *     width: 1600,
+             *     height: 1600,
+             *
+             *     // 图片质量,只有type为`image/jpeg`的时候才有效。
+             *     quality: 90,
+             *
+             *     // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
+             *     allowMagnify: false,
+             *
+             *     // 是否允许裁剪。
+             *     crop: false,
+             *
+             *     // 是否保留头部meta信息。
+             *     preserveHeaders: true
+             * }
+             * ```
+             */
+            compress: {
+                width: 1600,
+                height: 1600,
+                quality: 90,
+                allowMagnify: false,
+                crop: false,
+                preserveHeaders: true
+            }
+        });
+    
+        return Uploader.register({
+            'make-thumb': 'makeThumb',
+            'before-send-file': 'compressImage'
+        }, {
+    
+    
+            /**
+             * 生成缩略图,此过程为异步,所以需要传入`callback`。
+             * 通常情况在图片加入队里后调用此方法来生成预览图以增强交互效果。
+             *
+             * `callback`中可以接收到两个参数。
+             * * 第一个为error,如果生成缩略图有错误,此error将为真。
+             * * 第二个为ret, 缩略图的Data URL值。
+             *
+             * **注意**
+             * Date URL在IE6/7中不支持,所以不用调用此方法了,直接显示一张暂不支持预览图片好了。
+             *
+             *
+             * @method makeThumb
+             * @grammar makeThumb( file, callback ) => undefined
+             * @grammar makeThumb( file, callback, width, height ) => undefined
+             * @for Uploader
+             * @example
+             *
+             * uploader.on( 'fileQueued', function( file ) {
+             *     var $li = ...;
+             *
+             *     uploader.makeThumb( file, function( error, ret ) {
+             *         if ( error ) {
+             *             $li.text('预览错误');
+             *         } else {
+             *             $li.append('<img alt="" src="' + ret + '" />');
+             *         }
+             *     });
+             *
+             * });
+             */
+            makeThumb: function( file, cb, width, height ) {
+                var opts, image;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !file.type.match( /^image/ ) ) {
+                    cb( true );
+                    return;
+                }
+    
+                opts = $.extend({}, this.options.thumb );
+    
+                // 如果传入的是object.
+                if ( $.isPlainObject( width ) ) {
+                    opts = $.extend( opts, width );
+                    width = null;
+                }
+    
+                width = width || opts.width;
+                height = height || opts.height;
+    
+                image = new Image( opts );
+    
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( width, height );
+                });
+    
+                image.once( 'complete', function() {
+                    cb( false, image.getAsDataUrl( opts.type ) );
+                    image.destroy();
+                });
+    
+                image.once( 'error', function() {
+                    cb( true );
+                    image.destroy();
+                });
+    
+                throttle( image, file.source.size, function() {
+                    file._info && image.info( file._info );
+                    file._meta && image.meta( file._meta );
+                    image.loadFromBlob( file.source );
+                });
+            },
+    
+            compressImage: function( file ) {
+                var opts = this.options.compress || this.options.resize,
+                    compressSize = opts && opts.compressSize || 300 * 1024,
+                    image, deferred;
+    
+                file = this.request( 'get-file', file );
+    
+                // 只预览图片格式。
+                if ( !opts || !~'image/jpeg,image/jpg'.indexOf( file.type ) ||
+                        file.size < compressSize ||
+                        file._compressed ) {
+                    return;
+                }
+    
+                opts = $.extend({}, opts );
+                deferred = Base.Deferred();
+    
+                image = new Image( opts );
+    
+                deferred.always(function() {
+                    image.destroy();
+                    image = null;
+                });
+                image.once( 'error', deferred.reject );
+                image.once( 'load', function() {
+                    file._info = file._info || image.info();
+                    file._meta = file._meta || image.meta();
+                    image.resize( opts.width, opts.height );
+                });
+    
+                image.once( 'complete', function() {
+                    var blob, size;
+    
+                    // 移动端 UC / qq 浏览器的无图模式下
+                    // ctx.getImageData 处理大图的时候会报 Exception
+                    // INDEX_SIZE_ERR: DOM Exception 1
+                    try {
+                        blob = image.getAsBlob( opts.type );
+    
+                        size = file.size;
+    
+                        // 如果压缩后,比原来还大则不用压缩后的。
+                        if ( blob.size < size ) {
+                            // file.source.destroy && file.source.destroy();
+                            file.source = blob;
+                            file.size = blob.size;
+    
+                            file.trigger( 'resize', blob.size, size );
+                        }
+    
+                        // 标记,避免重复压缩。
+                        file._compressed = true;
+                        deferred.resolve();
+                    } catch ( e ) {
+                        // 出错了直接继续,让其上传原始图片
+                        deferred.resolve();
+                    }
+                });
+    
+                file._info && image.info( file._info );
+                file._meta && image.meta( file._meta );
+    
+                image.loadFromBlob( file.source );
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+    
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+    
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+    
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+    
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+    
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application'
+             */
+            this.type = source.type || 'application';
+    
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+    
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+    
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+    
+    
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+    
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+    
+            this.source = source;
+            this.loaded = 0;
+    
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+    
+        $.extend( WUFile.prototype, {
+    
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+    
+                var prevStatus = statusMap[ this.id ];
+    
+                typeof text !== 'undefined' && (this.statusText = text);
+    
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+    
+            },
+    
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+    
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+    
+            destory: function() {
+                delete statusMap[ this.id ];
+            }
+        });
+    
+        Mediator.installTo( WUFile.prototype );
+    
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+    
+        return WUFile;
+    });
+    
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+    
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+    
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+    
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被移除的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0
+            };
+    
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+    
+            // 存储所有文件
+            this._map = {};
+        }
+    
+        $.extend( Queue.prototype, {
+    
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+    
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+    
+                status = status || STATUS.QUEUED;
+    
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+    
+                return null;
+            },
+    
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+    
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+    
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+    
+                    ret.push( file );
+                }
+    
+                return ret;
+            },
+    
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+    
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+    
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+    
+                file.setStatus( STATUS.QUEUED );
+            },
+    
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+    
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+    
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+                }
+    
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+    
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+    
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+    
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+                }
+            }
+    
+        });
+    
+        Mediator.installTo( Queue.prototype );
+    
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+    
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+    
+        return Uploader.register({
+            'sort-files': 'sortFiles',
+            'add-file': 'addFiles',
+            'get-file': 'getFile',
+            'fetch-file': 'fetchFile',
+            'get-stats': 'getStats',
+            'get-files': 'getFiles',
+            'remove-file': 'removeFile',
+            'retry': 'retry',
+            'reset': 'reset',
+            'accept-file': 'acceptFile'
+        }, {
+    
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+    
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+    
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+    
+                    me.accept = new RegExp( accept, 'i' );
+                }
+    
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+    
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+    
+    
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+    
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+    
+                    file = new WUFile( file );
+                }
+    
+                return file;
+            },
+    
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || file.size < 6 || this.accept &&
+    
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+    
+                return !invalid;
+            },
+    
+    
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+    
+            _addFile: function( file ) {
+                var me = this;
+    
+                file = me._wrapFile( file );
+    
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+    
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+    
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+    
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+    
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFiles: function( files ) {
+                var me = this;
+    
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+    
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+    
+                me.owner.trigger( 'filesQueued', files );
+    
+                if ( me.options.auto ) {
+                    me.request('start-upload');
+                }
+            },
+    
+            getStats: function() {
+                return this.stats;
+            },
+    
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file ) {
+                var me = this;
+    
+                file = file.id ? file : me.queue.getFile( file );
+    
+                file.setStatus( Status.CANCELLED );
+                me.owner.trigger( 'fileDequeued', file );
+            },
+    
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+    
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+    
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+    
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+    
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+    
+                me.request('start-upload');
+            },
+    
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            }
+        });
+    
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+    
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+    
+        return Uploader.register({
+            'predict-runtime-type': 'predictRuntmeType'
+        }, {
+    
+            init: function() {
+                if ( !this.predictRuntmeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+    
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntmeType() => String
+             * @method predictRuntmeType
+             * @for  Uploader
+             */
+            predictRuntmeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+    
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+    
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+    
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+    
+        var $ = Base.$;
+    
+        function Transport( opts ) {
+            var me = this;
+    
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+    
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+    
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+    
+        Transport.options = {
+            server: '',
+            method: 'POST',
+    
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+    
+        $.extend( Transport.prototype, {
+    
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+    
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+    
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+    
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+    
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+    
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+    
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+    
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+    
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+    
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+    
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+    
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+    
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+    
+                if ( !duration ) {
+                    return;
+                }
+    
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+    
+        });
+    
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+    
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+    
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+    
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+    
+    
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+    
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+    
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+    
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+    
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+    
+    
+            /**
+             * @property {Object} [formData]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: null
+    
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+    
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+    
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+    
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len;
+    
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+    
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++
+                });
+                start += len;
+            }
+    
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+    
+            return {
+                file: file,
+    
+                has: function() {
+                    return !!pending.length;
+                },
+    
+                fetch: function() {
+                    return pending.shift();
+                }
+            };
+        }
+    
+        Uploader.register({
+            'start-upload': 'start',
+            'stop-upload': 'stop',
+            'skip-file': 'skipFile',
+            'is-in-progress': 'isInProgress'
+        }, {
+    
+            init: function() {
+                var owner = this.owner;
+    
+                this.runing = false;
+    
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+    
+                // 缓存即将上传的文件。
+                this.pending = [];
+    
+                // 跟踪还有多少分片没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+    
+                owner.on( 'uploadComplete', function( file ) {
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+    
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+    
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             * @grammar upload() => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            start: function() {
+                var me = this;
+    
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+    
+                if ( me.runing ) {
+                    return;
+                }
+    
+                me.runing = true;
+    
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+    
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        file.setStatus( Status.PROGRESS );
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+    
+                me._trigged = false;
+                me.owner.trigger('startUpload');
+                Base.nextTick( me.__tick );
+            },
+    
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stop: function( interrupt ) {
+                var me = this;
+    
+                if ( me.runing === false ) {
+                    return;
+                }
+    
+                me.runing = false;
+    
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+    
+                me.owner.trigger('stopUpload');
+            },
+    
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.runing;
+            },
+    
+            getStats: function() {
+                return this.request('get-stats');
+            },
+    
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = this.request( 'get-file', file );
+    
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+    
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+    
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+    
+                this.owner.trigger( 'uploadSkip', file );
+            },
+    
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+    
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+    
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+    
+                    fn = function( val ) {
+                        me._promise = null;
+    
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+    
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+    
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me.getStats().numOfQueue ) {
+                    me.runing = false;
+    
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+    
+            _nextBlock: function() {
+                var me = this,
+                    act = me._act,
+                    opts = me.options,
+                    next, done;
+    
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( act && act.has() &&
+                        act.file.getStatus() === Status.PROGRESS ) {
+    
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+    
+                    return act.fetch();
+    
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+    
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me.getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+    
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+    
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me._act = act;
+                        return act.fetch();
+                    };
+    
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    return isPromise( next ) ?
+                            next[ next.pipe ? 'pipe' : 'then']( done ) :
+                            done( next );
+                }
+            },
+    
+    
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+    
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+    
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.QUEUED ) {
+                            me.owner.trigger( 'uploadStart', file );
+                            file.setStatus( Status.PROGRESS );
+                            return file;
+                        }
+    
+                        return me._finishFile( file );
+                    });
+    
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+    
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+    
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+    
+                    pending.push( promise );
+                }
+            },
+    
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+    
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+    
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+    
+                me.pool.push( block );
+                me.remaning++;
+    
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+    
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+    
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+    
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+    
+    
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+    
+    
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+    
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+    
+                block.transport = tr;
+    
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+    
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    var totalPercent = 0,
+                        uploaded = 0;
+    
+                    // 可能没有abort掉,progress还是执行进来了。
+                    // if ( !file.blocks ) {
+                    //     return;
+                    // }
+    
+                    totalPercent = block.percentage = percentage;
+    
+                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。
+                        $.each( file.blocks, function( _, v ) {
+                            uploaded += (v.percentage || 0) * (v.end - v.start);
+                        });
+    
+                        totalPercent = uploaded / file.size;
+                    }
+    
+                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+                });
+    
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+    
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+    
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+    
+                    return reject;
+                };
+    
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+    
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+    
+                        block.retried++;
+                        tr.send();
+    
+                    } else {
+    
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+    
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+    
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+    
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+    
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+    
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+    
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+    
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+    
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+    
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+    
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+    
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+    
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            }
+    
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+    
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+    
+        var $ = Base.$,
+            validators = {},
+            api;
+    
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * @for  Uploader
+         */
+    
+        // 暴露给外面的api
+        api = {
+    
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+    
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+    
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            init: function() {
+                var me = this;
+                $.each( validators, function() {
+                    this.call( me.owner );
+                });
+            }
+        });
+    
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileNumLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return count >= max ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+    
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+    
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileSizeLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+    
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return invalid ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', file );
+                    return false;
+                }
+    
+            });
+    
+        });
+    
+        /**
+         * @property {int} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+    
+            if ( opts.duplicate ) {
+                return;
+            }
+    
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+    
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+    
+                return hash;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+    
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (mapping[ hash ] = true);
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (delete mapping[ hash ]);
+            });
+        });
+    
+        return api;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+    
+        function CompBase( owner, runtime ) {
+    
+            this.owner = owner;
+            this.options = owner.options;
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+    
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+    
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var type = 'html5',
+            components = {};
+    
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destory = this.destory;
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+    
+            me.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+    
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+    
+        });
+    
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+    
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+    
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+    
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+    
+                blob = slice.call( blob, start, end );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+    
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+    
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+    
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+    
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+    
+                e = e.originalEvent || e;
+    
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+    
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+    
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+    
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+    
+    
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+    
+                return false;
+            },
+    
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+    
+                return false;
+            },
+    
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+    
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+    
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+    
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 );
+    
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                me._getTansferFiles( e, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+    
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+    
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( e, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, dataTransfer, file, item, i, len, canAccessFolder;
+    
+                e = e.originalEvent || e;
+    
+                dataTransfer = e.dataTransfer;
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+    
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+    
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+    
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+    
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+    
+                Base.when.apply( Base, promises ).done(function() {
+    
+                    if ( !results.length ) {
+                        return;
+                    }
+    
+                    callback( results );
+                });
+            },
+    
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+    
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+    
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+    
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+    
+                return deferred.promise();
+            },
+    
+            destroy: function() {
+                var elem = this.elem;
+    
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragEnterHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+    
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+    
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+    
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+    
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+    
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+    
+                    allowed.push( new File( ruid, blob ) );
+                }
+    
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+    
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var $ = Base.$;
+    
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    lable = $( document.createElement('label') ),
+                    input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+    
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+    
+                lable.on( 'click', function() {
+                    input.trigger('click');
+                });
+    
+                lable.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+    
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+    
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+    
+                    input.attr( 'accept', arr.join(',') );
+                }
+    
+                container.append( input );
+                container.append( lable );
+    
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+    
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+    
+                    me.files = e.target.files;
+    
+                    // reset input
+                    clone = this.cloneNode( true );
+                    this.parentNode.replaceChild( clone, this );
+    
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+    
+                    owner.trigger('change');
+                });
+    
+                lable.on( 'mouseenter mouseleave', mouseHandler );
+    
+            },
+    
+    
+            getFiles: function() {
+                return this.files;
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/util',[
+        'base'
+    ], function( Base ) {
+    
+        var urlAPI = window.createObjectURL && window ||
+                window.URL && URL.revokeObjectURL && URL ||
+                window.webkitURL,
+            createObjectURL = Base.noop,
+            revokeObjectURL = createObjectURL;
+    
+        if ( urlAPI ) {
+    
+            // 更安全的方式调用,比如android里面就能把context改成其他的对象。
+            createObjectURL = function() {
+                return urlAPI.createObjectURL.apply( urlAPI, arguments );
+            };
+    
+            revokeObjectURL = function() {
+                return urlAPI.revokeObjectURL.apply( urlAPI, arguments );
+            };
+        }
+    
+        return {
+            createObjectURL: createObjectURL,
+            revokeObjectURL: revokeObjectURL,
+    
+            dataURL2Blob: function( dataURI ) {
+                var byteStr, intArray, ab, i, mimetype, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                ab = new ArrayBuffer( byteStr.length );
+                intArray = new Uint8Array( ab );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                mimetype = parts[ 0 ].split(':')[ 1 ].split(';')[ 0 ];
+    
+                return this.arrayBufferToBlob( ab, mimetype );
+            },
+    
+            dataURL2ArrayBuffer: function( dataURI ) {
+                var byteStr, intArray, i, parts;
+    
+                parts = dataURI.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    byteStr = atob( parts[ 1 ] );
+                } else {
+                    byteStr = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                intArray = new Uint8Array( byteStr.length );
+    
+                for ( i = 0; i < byteStr.length; i++ ) {
+                    intArray[ i ] = byteStr.charCodeAt( i );
+                }
+    
+                return intArray.buffer;
+            },
+    
+            arrayBufferToBlob: function( buffer, type ) {
+                var builder = window.BlobBuilder || window.WebKitBlobBuilder,
+                    bb;
+    
+                // android不支持直接new Blob, 只能借助blobbuilder.
+                if ( builder ) {
+                    bb = new builder();
+                    bb.append( buffer );
+                    return bb.getBlob( type );
+                }
+    
+                return new Blob([ buffer ], type ? { type: type } : {} );
+            },
+    
+            // 抽出来主要是为了解决android下面canvas.toDataUrl不支持jpeg.
+            // 你得到的结果是png.
+            canvasToDataUrl: function( canvas, type, quality ) {
+                return canvas.toDataURL( type, quality / 100 );
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            parseMeta: function( blob, callback ) {
+                callback( false, {});
+            },
+    
+            // imagemeat会复写这个方法,如果用户选择加载那个文件了的话。
+            updateImageHead: function( data ) {
+                return data;
+            }
+        };
+    });
+    /**
+     * Terms:
+     *
+     * Uint8Array, FileReader, BlobBuilder, atob, ArrayBuffer
+     * @fileOverview Image控件
+     */
+    define('runtime/html5/imagemeta',[
+        'runtime/html5/util'
+    ], function( Util ) {
+    
+        var api;
+    
+        api = {
+            parsers: {
+                0xffe1: []
+            },
+    
+            maxMetaDataSize: 262144,
+    
+            parse: function( blob, cb ) {
+                var me = this,
+                    fr = new FileReader();
+    
+                fr.onload = function() {
+                    cb( false, me._parse( this.result ) );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                fr.onerror = function( e ) {
+                    cb( e.message );
+                    fr = fr.onload = fr.onerror = null;
+                };
+    
+                blob = blob.slice( 0, me.maxMetaDataSize );
+                fr.readAsArrayBuffer( blob.getSource() );
+            },
+    
+            _parse: function( buffer, noParse ) {
+                if ( buffer.byteLength < 6 ) {
+                    return;
+                }
+    
+                var dataview = new DataView( buffer ),
+                    offset = 2,
+                    maxOffset = dataview.byteLength - 4,
+                    headLength = offset,
+                    ret = {},
+                    markerBytes, markerLength, parsers, i;
+    
+                if ( dataview.getUint16( 0 ) === 0xffd8 ) {
+    
+                    while ( offset < maxOffset ) {
+                        markerBytes = dataview.getUint16( offset );
+    
+                        if ( markerBytes >= 0xffe0 && markerBytes <= 0xffef ||
+                                markerBytes === 0xfffe ) {
+    
+                            markerLength = dataview.getUint16( offset + 2 ) + 2;
+    
+                            if ( offset + markerLength > dataview.byteLength ) {
+                                break;
+                            }
+    
+                            parsers = api.parsers[ markerBytes ];
+    
+                            if ( !noParse && parsers ) {
+                                for ( i = 0; i < parsers.length; i += 1 ) {
+                                    parsers[ i ].call( api, dataview, offset,
+                                            markerLength, ret );
+                                }
+                            }
+    
+                            offset += markerLength;
+                            headLength = offset;
+                        } else {
+                            break;
+                        }
+                    }
+    
+                    if ( headLength > 6 ) {
+                        if ( buffer.slice ) {
+                            ret.imageHead = buffer.slice( 2, headLength );
+                        } else {
+                            // Workaround for IE10, which does not yet
+                            // support ArrayBuffer.slice:
+                            ret.imageHead = new Uint8Array( buffer )
+                                    .subarray( 2, headLength );
+                        }
+                    }
+                }
+    
+                return ret;
+            },
+    
+            updateImageHead: function( buffer, head ) {
+                var data = this._parse( buffer, true ),
+                    buf1, buf2, bodyoffset;
+    
+    
+                bodyoffset = 2;
+                if ( data.imageHead ) {
+                    bodyoffset = 2 + data.imageHead.byteLength;
+                }
+    
+                if ( buffer.slice ) {
+                    buf2 = buffer.slice( bodyoffset );
+                } else {
+                    buf2 = new Uint8Array( buffer ).subarray( bodyoffset );
+                }
+    
+                buf1 = new Uint8Array( head.byteLength + 2 + buf2.byteLength );
+    
+                buf1[ 0 ] = 0xFF;
+                buf1[ 1 ] = 0xD8;
+                buf1.set( new Uint8Array( head ), 2 );
+                buf1.set( new Uint8Array( buf2 ), head.byteLength + 2 );
+    
+                return buf1.buffer;
+            }
+        };
+    
+        Util.parseMeta = function() {
+            return api.parse.apply( api, arguments );
+        };
+    
+        Util.updateImageHead = function() {
+            return api.updateImageHead.apply( api, arguments );
+        };
+    
+        return api;
+    });
+    /**
+     * 代码来自于:https://github.com/blueimp/JavaScript-Load-Image
+     * 暂时项目中只用了orientation.
+     *
+     * 去除了 Exif Sub IFD Pointer, GPS Info IFD Pointer, Exif Thumbnail.
+     * @fileOverview EXIF解析
+     */
+    
+    // Sample
+    // ====================================
+    // Make : Apple
+    // Model : iPhone 4S
+    // Orientation : 1
+    // XResolution : 72 [72/1]
+    // YResolution : 72 [72/1]
+    // ResolutionUnit : 2
+    // Software : QuickTime 7.7.1
+    // DateTime : 2013:09:01 22:53:55
+    // ExifIFDPointer : 190
+    // ExposureTime : 0.058823529411764705 [1/17]
+    // FNumber : 2.4 [12/5]
+    // ExposureProgram : Normal program
+    // ISOSpeedRatings : 800
+    // ExifVersion : 0220
+    // DateTimeOriginal : 2013:09:01 22:52:51
+    // DateTimeDigitized : 2013:09:01 22:52:51
+    // ComponentsConfiguration : YCbCr
+    // ShutterSpeedValue : 4.058893515764426
+    // ApertureValue : 2.5260688216892597 [4845/1918]
+    // BrightnessValue : -0.3126686601998395
+    // MeteringMode : Pattern
+    // Flash : Flash did not fire, compulsory flash mode
+    // FocalLength : 4.28 [107/25]
+    // SubjectArea : [4 values]
+    // FlashpixVersion : 0100
+    // ColorSpace : 1
+    // PixelXDimension : 2448
+    // PixelYDimension : 3264
+    // SensingMethod : One-chip color area sensor
+    // ExposureMode : 0
+    // WhiteBalance : Auto white balance
+    // FocalLengthIn35mmFilm : 35
+    // SceneCaptureType : Standard
+    define('runtime/html5/imagemeta/exif',[
+        'base',
+        'runtime/html5/imagemeta'
+    ], function( Base, ImageMeta ) {
+    
+        var EXIF = {};
+    
+        EXIF.ExifMap = function() {
+            return this;
+        };
+    
+        EXIF.ExifMap.prototype.map = {
+            'Orientation': 0x0112
+        };
+    
+        EXIF.ExifMap.prototype.get = function( id ) {
+            return this[ id ] || this[ this.map[ id ] ];
+        };
+    
+        EXIF.exifTagTypes = {
+            // byte, 8-bit unsigned int:
+            1: {
+                getValue: function( dataView, dataOffset ) {
+                    return dataView.getUint8( dataOffset );
+                },
+                size: 1
+            },
+    
+            // ascii, 8-bit byte:
+            2: {
+                getValue: function( dataView, dataOffset ) {
+                    return String.fromCharCode( dataView.getUint8( dataOffset ) );
+                },
+                size: 1,
+                ascii: true
+            },
+    
+            // short, 16 bit int:
+            3: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint16( dataOffset, littleEndian );
+                },
+                size: 2
+            },
+    
+            // long, 32 bit int:
+            4: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // rational = two long values,
+            // first is numerator, second is denominator:
+            5: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getUint32( dataOffset, littleEndian ) /
+                        dataView.getUint32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            },
+    
+            // slong, 32 bit signed int:
+            9: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian );
+                },
+                size: 4
+            },
+    
+            // srational, two slongs, first is numerator, second is denominator:
+            10: {
+                getValue: function( dataView, dataOffset, littleEndian ) {
+                    return dataView.getInt32( dataOffset, littleEndian ) /
+                        dataView.getInt32( dataOffset + 4, littleEndian );
+                },
+                size: 8
+            }
+        };
+    
+        // undefined, 8-bit byte, value depending on field:
+        EXIF.exifTagTypes[ 7 ] = EXIF.exifTagTypes[ 1 ];
+    
+        EXIF.getExifValue = function( dataView, tiffOffset, offset, type, length,
+                littleEndian ) {
+    
+            var tagType = EXIF.exifTagTypes[ type ],
+                tagSize, dataOffset, values, i, str, c;
+    
+            if ( !tagType ) {
+                Base.log('Invalid Exif data: Invalid tag type.');
+                return;
+            }
+    
+            tagSize = tagType.size * length;
+    
+            // Determine if the value is contained in the dataOffset bytes,
+            // or if the value at the dataOffset is a pointer to the actual data:
+            dataOffset = tagSize > 4 ? tiffOffset + dataView.getUint32( offset + 8,
+                    littleEndian ) : (offset + 8);
+    
+            if ( dataOffset + tagSize > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid data offset.');
+                return;
+            }
+    
+            if ( length === 1 ) {
+                return tagType.getValue( dataView, dataOffset, littleEndian );
+            }
+    
+            values = [];
+    
+            for ( i = 0; i < length; i += 1 ) {
+                values[ i ] = tagType.getValue( dataView,
+                        dataOffset + i * tagType.size, littleEndian );
+            }
+    
+            if ( tagType.ascii ) {
+                str = '';
+    
+                // Concatenate the chars:
+                for ( i = 0; i < values.length; i += 1 ) {
+                    c = values[ i ];
+    
+                    // Ignore the terminating NULL byte(s):
+                    if ( c === '\u0000' ) {
+                        break;
+                    }
+                    str += c;
+                }
+    
+                return str;
+            }
+            return values;
+        };
+    
+        EXIF.parseExifTag = function( dataView, tiffOffset, offset, littleEndian,
+                data ) {
+    
+            var tag = dataView.getUint16( offset, littleEndian );
+            data.exif[ tag ] = EXIF.getExifValue( dataView, tiffOffset, offset,
+                    dataView.getUint16( offset + 2, littleEndian ),    // tag type
+                    dataView.getUint32( offset + 4, littleEndian ),    // tag length
+                    littleEndian );
+        };
+    
+        EXIF.parseExifTags = function( dataView, tiffOffset, dirOffset,
+                littleEndian, data ) {
+    
+            var tagsNumber, dirEndOffset, i;
+    
+            if ( dirOffset + 6 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory offset.');
+                return;
+            }
+    
+            tagsNumber = dataView.getUint16( dirOffset, littleEndian );
+            dirEndOffset = dirOffset + 2 + 12 * tagsNumber;
+    
+            if ( dirEndOffset + 4 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid directory size.');
+                return;
+            }
+    
+            for ( i = 0; i < tagsNumber; i += 1 ) {
+                this.parseExifTag( dataView, tiffOffset,
+                        dirOffset + 2 + 12 * i,    // tag offset
+                        littleEndian, data );
+            }
+    
+            // Return the offset to the next directory:
+            return dataView.getUint32( dirEndOffset, littleEndian );
+        };
+    
+        // EXIF.getExifThumbnail = function(dataView, offset, length) {
+        //     var hexData,
+        //         i,
+        //         b;
+        //     if (!length || offset + length > dataView.byteLength) {
+        //         Base.log('Invalid Exif data: Invalid thumbnail data.');
+        //         return;
+        //     }
+        //     hexData = [];
+        //     for (i = 0; i < length; i += 1) {
+        //         b = dataView.getUint8(offset + i);
+        //         hexData.push((b < 16 ? '0' : '') + b.toString(16));
+        //     }
+        //     return 'data:image/jpeg,%' + hexData.join('%');
+        // };
+    
+        EXIF.parseExifData = function( dataView, offset, length, data ) {
+    
+            var tiffOffset = offset + 10,
+                littleEndian, dirOffset;
+    
+            // Check for the ASCII code for "Exif" (0x45786966):
+            if ( dataView.getUint32( offset + 4 ) !== 0x45786966 ) {
+                // No Exif data, might be XMP data instead
+                return;
+            }
+            if ( tiffOffset + 8 > dataView.byteLength ) {
+                Base.log('Invalid Exif data: Invalid segment size.');
+                return;
+            }
+    
+            // Check for the two null bytes:
+            if ( dataView.getUint16( offset + 8 ) !== 0x0000 ) {
+                Base.log('Invalid Exif data: Missing byte alignment offset.');
+                return;
+            }
+    
+            // Check the byte alignment:
+            switch ( dataView.getUint16( tiffOffset ) ) {
+                case 0x4949:
+                    littleEndian = true;
+                    break;
+    
+                case 0x4D4D:
+                    littleEndian = false;
+                    break;
+    
+                default:
+                    Base.log('Invalid Exif data: Invalid byte alignment marker.');
+                    return;
+            }
+    
+            // Check for the TIFF tag marker (0x002A):
+            if ( dataView.getUint16( tiffOffset + 2, littleEndian ) !== 0x002A ) {
+                Base.log('Invalid Exif data: Missing TIFF marker.');
+                return;
+            }
+    
+            // Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:
+            dirOffset = dataView.getUint32( tiffOffset + 4, littleEndian );
+            // Create the exif object to store the tags:
+            data.exif = new EXIF.ExifMap();
+            // Parse the tags of the main image directory and retrieve the
+            // offset to the next directory, usually the thumbnail directory:
+            dirOffset = EXIF.parseExifTags( dataView, tiffOffset,
+                    tiffOffset + dirOffset, littleEndian, data );
+    
+            // 尝试读取缩略图
+            // if ( dirOffset ) {
+            //     thumbnailData = {exif: {}};
+            //     dirOffset = EXIF.parseExifTags(
+            //         dataView,
+            //         tiffOffset,
+            //         tiffOffset + dirOffset,
+            //         littleEndian,
+            //         thumbnailData
+            //     );
+    
+            //     // Check for JPEG Thumbnail offset:
+            //     if (thumbnailData.exif[0x0201]) {
+            //         data.exif.Thumbnail = EXIF.getExifThumbnail(
+            //             dataView,
+            //             tiffOffset + thumbnailData.exif[0x0201],
+            //             thumbnailData.exif[0x0202] // Thumbnail data length
+            //         );
+            //     }
+            // }
+        };
+    
+        ImageMeta.parsers[ 0xffe1 ].push( EXIF.parseExifData );
+        return EXIF;
+    });
+    /**
+     * 这个方式性能不行,但是可以解决android里面的toDataUrl的bug
+     * android里面toDataUrl('image/jpege')得到的结果却是png.
+     *
+     * 所以这里没辙,只能借助这个工具
+     * @fileOverview jpeg encoder
+     */
+    define('runtime/html5/jpegencoder',[], function( require, exports, module ) {
+    
+        /*
+          Copyright (c) 2008, Adobe Systems Incorporated
+          All rights reserved.
+    
+          Redistribution and use in source and binary forms, with or without
+          modification, are permitted provided that the following conditions are
+          met:
+    
+          * Redistributions of source code must retain the above copyright notice,
+            this list of conditions and the following disclaimer.
+    
+          * Redistributions in binary form must reproduce the above copyright
+            notice, this list of conditions and the following disclaimer in the
+            documentation and/or other materials provided with the distribution.
+    
+          * Neither the name of Adobe Systems Incorporated nor the names of its
+            contributors may be used to endorse or promote products derived from
+            this software without specific prior written permission.
+    
+          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+          IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+          THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+          PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+          CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+          EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+          PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+          PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+          LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+          NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+          SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+        */
+        /*
+        JPEG encoder ported to JavaScript and optimized by Andreas Ritter, www.bytestrom.eu, 11/2009
+    
+        Basic GUI blocking jpeg encoder
+        */
+    
+        function JPEGEncoder(quality) {
+          var self = this;
+            var fround = Math.round;
+            var ffloor = Math.floor;
+            var YTable = new Array(64);
+            var UVTable = new Array(64);
+            var fdtbl_Y = new Array(64);
+            var fdtbl_UV = new Array(64);
+            var YDC_HT;
+            var UVDC_HT;
+            var YAC_HT;
+            var UVAC_HT;
+    
+            var bitcode = new Array(65535);
+            var category = new Array(65535);
+            var outputfDCTQuant = new Array(64);
+            var DU = new Array(64);
+            var byteout = [];
+            var bytenew = 0;
+            var bytepos = 7;
+    
+            var YDU = new Array(64);
+            var UDU = new Array(64);
+            var VDU = new Array(64);
+            var clt = new Array(256);
+            var RGB_YUV_TABLE = new Array(2048);
+            var currentQuality;
+    
+            var ZigZag = [
+                     0, 1, 5, 6,14,15,27,28,
+                     2, 4, 7,13,16,26,29,42,
+                     3, 8,12,17,25,30,41,43,
+                     9,11,18,24,31,40,44,53,
+                    10,19,23,32,39,45,52,54,
+                    20,22,33,38,46,51,55,60,
+                    21,34,37,47,50,56,59,61,
+                    35,36,48,49,57,58,62,63
+                ];
+    
+            var std_dc_luminance_nrcodes = [0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
+            var std_dc_luminance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_luminance_nrcodes = [0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
+            var std_ac_luminance_values = [
+                    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
+                    0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
+                    0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
+                    0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
+                    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
+                    0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
+                    0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
+                    0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
+                    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
+                    0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
+                    0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
+                    0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
+                    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
+                    0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
+                    0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
+                    0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
+                    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
+                    0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
+                    0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
+                    0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+    
+            var std_dc_chrominance_nrcodes = [0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
+            var std_dc_chrominance_values = [0,1,2,3,4,5,6,7,8,9,10,11];
+            var std_ac_chrominance_nrcodes = [0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
+            var std_ac_chrominance_values = [
+                    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
+                    0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
+                    0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
+                    0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
+                    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
+                    0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
+                    0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
+                    0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
+                    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
+                    0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
+                    0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
+                    0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
+                    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
+                    0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
+                    0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
+                    0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
+                    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
+                    0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
+                    0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
+                    0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                    0xf9,0xfa
+                ];
+    
+            function initQuantTables(sf){
+                    var YQT = [
+                        16, 11, 10, 16, 24, 40, 51, 61,
+                        12, 12, 14, 19, 26, 58, 60, 55,
+                        14, 13, 16, 24, 40, 57, 69, 56,
+                        14, 17, 22, 29, 51, 87, 80, 62,
+                        18, 22, 37, 56, 68,109,103, 77,
+                        24, 35, 55, 64, 81,104,113, 92,
+                        49, 64, 78, 87,103,121,120,101,
+                        72, 92, 95, 98,112,100,103, 99
+                    ];
+    
+                    for (var i = 0; i < 64; i++) {
+                        var t = ffloor((YQT[i]*sf+50)/100);
+                        if (t < 1) {
+                            t = 1;
+                        } else if (t > 255) {
+                            t = 255;
+                        }
+                        YTable[ZigZag[i]] = t;
+                    }
+                    var UVQT = [
+                        17, 18, 24, 47, 99, 99, 99, 99,
+                        18, 21, 26, 66, 99, 99, 99, 99,
+                        24, 26, 56, 99, 99, 99, 99, 99,
+                        47, 66, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99,
+                        99, 99, 99, 99, 99, 99, 99, 99
+                    ];
+                    for (var j = 0; j < 64; j++) {
+                        var u = ffloor((UVQT[j]*sf+50)/100);
+                        if (u < 1) {
+                            u = 1;
+                        } else if (u > 255) {
+                            u = 255;
+                        }
+                        UVTable[ZigZag[j]] = u;
+                    }
+                    var aasf = [
+                        1.0, 1.387039845, 1.306562965, 1.175875602,
+                        1.0, 0.785694958, 0.541196100, 0.275899379
+                    ];
+                    var k = 0;
+                    for (var row = 0; row < 8; row++)
+                    {
+                        for (var col = 0; col < 8; col++)
+                        {
+                            fdtbl_Y[k]  = (1.0 / (YTable [ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            fdtbl_UV[k] = (1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0));
+                            k++;
+                        }
+                    }
+                }
+    
+                function computeHuffmanTbl(nrcodes, std_table){
+                    var codevalue = 0;
+                    var pos_in_table = 0;
+                    var HT = new Array();
+                    for (var k = 1; k <= 16; k++) {
+                        for (var j = 1; j <= nrcodes[k]; j++) {
+                            HT[std_table[pos_in_table]] = [];
+                            HT[std_table[pos_in_table]][0] = codevalue;
+                            HT[std_table[pos_in_table]][1] = k;
+                            pos_in_table++;
+                            codevalue++;
+                        }
+                        codevalue*=2;
+                    }
+                    return HT;
+                }
+    
+                function initHuffmanTbl()
+                {
+                    YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
+                    UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
+                    YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
+                    UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
+                }
+    
+                function initCategoryNumber()
+                {
+                    var nrlower = 1;
+                    var nrupper = 2;
+                    for (var cat = 1; cat <= 15; cat++) {
+                        //Positive numbers
+                        for (var nr = nrlower; nr<nrupper; nr++) {
+                            category[32767+nr] = cat;
+                            bitcode[32767+nr] = [];
+                            bitcode[32767+nr][1] = cat;
+                            bitcode[32767+nr][0] = nr;
+                        }
+                        //Negative numbers
+                        for (var nrneg =-(nrupper-1); nrneg<=-nrlower; nrneg++) {
+                            category[32767+nrneg] = cat;
+                            bitcode[32767+nrneg] = [];
+                            bitcode[32767+nrneg][1] = cat;
+                            bitcode[32767+nrneg][0] = nrupper-1+nrneg;
+                        }
+                        nrlower <<= 1;
+                        nrupper <<= 1;
+                    }
+                }
+    
+                function initRGBYUVTable() {
+                    for(var i = 0; i < 256;i++) {
+                        RGB_YUV_TABLE[i]            =  19595 * i;
+                        RGB_YUV_TABLE[(i+ 256)>>0]  =  38470 * i;
+                        RGB_YUV_TABLE[(i+ 512)>>0]  =   7471 * i + 0x8000;
+                        RGB_YUV_TABLE[(i+ 768)>>0]  = -11059 * i;
+                        RGB_YUV_TABLE[(i+1024)>>0]  = -21709 * i;
+                        RGB_YUV_TABLE[(i+1280)>>0]  =  32768 * i + 0x807FFF;
+                        RGB_YUV_TABLE[(i+1536)>>0]  = -27439 * i;
+                        RGB_YUV_TABLE[(i+1792)>>0]  = - 5329 * i;
+                    }
+                }
+    
+                // IO functions
+                function writeBits(bs)
+                {
+                    var value = bs[0];
+                    var posval = bs[1]-1;
+                    while ( posval >= 0 ) {
+                        if (value & (1 << posval) ) {
+                            bytenew |= (1 << bytepos);
+                        }
+                        posval--;
+                        bytepos--;
+                        if (bytepos < 0) {
+                            if (bytenew == 0xFF) {
+                                writeByte(0xFF);
+                                writeByte(0);
+                            }
+                            else {
+                                writeByte(bytenew);
+                            }
+                            bytepos=7;
+                            bytenew=0;
+                        }
+                    }
+                }
+    
+                function writeByte(value)
+                {
+                    byteout.push(clt[value]); // write char directly instead of converting later
+                }
+    
+                function writeWord(value)
+                {
+                    writeByte((value>>8)&0xFF);
+                    writeByte((value   )&0xFF);
+                }
+    
+                // DCT & quantization core
+                function fDCTQuant(data, fdtbl)
+                {
+                    var d0, d1, d2, d3, d4, d5, d6, d7;
+                    /* Pass 1: process rows. */
+                    var dataOff=0;
+                    var i;
+                    var I8 = 8;
+                    var I64 = 64;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff+1];
+                        d2 = data[dataOff+2];
+                        d3 = data[dataOff+3];
+                        d4 = data[dataOff+4];
+                        d5 = data[dataOff+5];
+                        d6 = data[dataOff+6];
+                        d7 = data[dataOff+7];
+    
+                        var tmp0 = d0 + d7;
+                        var tmp7 = d0 - d7;
+                        var tmp1 = d1 + d6;
+                        var tmp6 = d1 - d6;
+                        var tmp2 = d2 + d5;
+                        var tmp5 = d2 - d5;
+                        var tmp3 = d3 + d4;
+                        var tmp4 = d3 - d4;
+    
+                        /* Even part */
+                        var tmp10 = tmp0 + tmp3;    /* phase 2 */
+                        var tmp13 = tmp0 - tmp3;
+                        var tmp11 = tmp1 + tmp2;
+                        var tmp12 = tmp1 - tmp2;
+    
+                        data[dataOff] = tmp10 + tmp11; /* phase 3 */
+                        data[dataOff+4] = tmp10 - tmp11;
+    
+                        var z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */
+                        data[dataOff+2] = tmp13 + z1; /* phase 5 */
+                        data[dataOff+6] = tmp13 - z1;
+    
+                        /* Odd part */
+                        tmp10 = tmp4 + tmp5; /* phase 2 */
+                        tmp11 = tmp5 + tmp6;
+                        tmp12 = tmp6 + tmp7;
+    
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */
+                        var z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */
+                        var z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */
+                        var z3 = tmp11 * 0.707106781; /* c4 */
+    
+                        var z11 = tmp7 + z3;    /* phase 5 */
+                        var z13 = tmp7 - z3;
+    
+                        data[dataOff+5] = z13 + z2; /* phase 6 */
+                        data[dataOff+3] = z13 - z2;
+                        data[dataOff+1] = z11 + z4;
+                        data[dataOff+7] = z11 - z4;
+    
+                        dataOff += 8; /* advance pointer to next row */
+                    }
+    
+                    /* Pass 2: process columns. */
+                    dataOff = 0;
+                    for (i=0; i<I8; ++i)
+                    {
+                        d0 = data[dataOff];
+                        d1 = data[dataOff + 8];
+                        d2 = data[dataOff + 16];
+                        d3 = data[dataOff + 24];
+                        d4 = data[dataOff + 32];
+                        d5 = data[dataOff + 40];
+                        d6 = data[dataOff + 48];
+                        d7 = data[dataOff + 56];
+    
+                        var tmp0p2 = d0 + d7;
+                        var tmp7p2 = d0 - d7;
+                        var tmp1p2 = d1 + d6;
+                        var tmp6p2 = d1 - d6;
+                        var tmp2p2 = d2 + d5;
+                        var tmp5p2 = d2 - d5;
+                        var tmp3p2 = d3 + d4;
+                        var tmp4p2 = d3 - d4;
+    
+                        /* Even part */
+                        var tmp10p2 = tmp0p2 + tmp3p2;  /* phase 2 */
+                        var tmp13p2 = tmp0p2 - tmp3p2;
+                        var tmp11p2 = tmp1p2 + tmp2p2;
+                        var tmp12p2 = tmp1p2 - tmp2p2;
+    
+                        data[dataOff] = tmp10p2 + tmp11p2; /* phase 3 */
+                        data[dataOff+32] = tmp10p2 - tmp11p2;
+    
+                        var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781; /* c4 */
+                        data[dataOff+16] = tmp13p2 + z1p2; /* phase 5 */
+                        data[dataOff+48] = tmp13p2 - z1p2;
+    
+                        /* Odd part */
+                        tmp10p2 = tmp4p2 + tmp5p2; /* phase 2 */
+                        tmp11p2 = tmp5p2 + tmp6p2;
+                        tmp12p2 = tmp6p2 + tmp7p2;
+    
+                        /* The rotator is modified from fig 4-8 to avoid extra negations. */
+                        var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433; /* c6 */
+                        var z2p2 = 0.541196100 * tmp10p2 + z5p2; /* c2-c6 */
+                        var z4p2 = 1.306562965 * tmp12p2 + z5p2; /* c2+c6 */
+                        var z3p2 = tmp11p2 * 0.707106781; /* c4 */
+    
+                        var z11p2 = tmp7p2 + z3p2;  /* phase 5 */
+                        var z13p2 = tmp7p2 - z3p2;
+    
+                        data[dataOff+40] = z13p2 + z2p2; /* phase 6 */
+                        data[dataOff+24] = z13p2 - z2p2;
+                        data[dataOff+ 8] = z11p2 + z4p2;
+                        data[dataOff+56] = z11p2 - z4p2;
+    
+                        dataOff++; /* advance pointer to next column */
+                    }
+    
+                    // Quantize/descale the coefficients
+                    var fDCTQuant;
+                    for (i=0; i<I64; ++i)
+                    {
+                        // Apply the quantization and scaling factor & Round to nearest integer
+                        fDCTQuant = data[i]*fdtbl[i];
+                        outputfDCTQuant[i] = (fDCTQuant > 0.0) ? ((fDCTQuant + 0.5)|0) : ((fDCTQuant - 0.5)|0);
+                        //outputfDCTQuant[i] = fround(fDCTQuant);
+    
+                    }
+                    return outputfDCTQuant;
+                }
+    
+                function writeAPP0()
+                {
+                    writeWord(0xFFE0); // marker
+                    writeWord(16); // length
+                    writeByte(0x4A); // J
+                    writeByte(0x46); // F
+                    writeByte(0x49); // I
+                    writeByte(0x46); // F
+                    writeByte(0); // = "JFIF",'\0'
+                    writeByte(1); // versionhi
+                    writeByte(1); // versionlo
+                    writeByte(0); // xyunits
+                    writeWord(1); // xdensity
+                    writeWord(1); // ydensity
+                    writeByte(0); // thumbnwidth
+                    writeByte(0); // thumbnheight
+                }
+    
+                function writeSOF0(width, height)
+                {
+                    writeWord(0xFFC0); // marker
+                    writeWord(17);   // length, truecolor YUV JPG
+                    writeByte(8);    // precision
+                    writeWord(height);
+                    writeWord(width);
+                    writeByte(3);    // nrofcomponents
+                    writeByte(1);    // IdY
+                    writeByte(0x11); // HVY
+                    writeByte(0);    // QTY
+                    writeByte(2);    // IdU
+                    writeByte(0x11); // HVU
+                    writeByte(1);    // QTU
+                    writeByte(3);    // IdV
+                    writeByte(0x11); // HVV
+                    writeByte(1);    // QTV
+                }
+    
+                function writeDQT()
+                {
+                    writeWord(0xFFDB); // marker
+                    writeWord(132);    // length
+                    writeByte(0);
+                    for (var i=0; i<64; i++) {
+                        writeByte(YTable[i]);
+                    }
+                    writeByte(1);
+                    for (var j=0; j<64; j++) {
+                        writeByte(UVTable[j]);
+                    }
+                }
+    
+                function writeDHT()
+                {
+                    writeWord(0xFFC4); // marker
+                    writeWord(0x01A2); // length
+    
+                    writeByte(0); // HTYDCinfo
+                    for (var i=0; i<16; i++) {
+                        writeByte(std_dc_luminance_nrcodes[i+1]);
+                    }
+                    for (var j=0; j<=11; j++) {
+                        writeByte(std_dc_luminance_values[j]);
+                    }
+    
+                    writeByte(0x10); // HTYACinfo
+                    for (var k=0; k<16; k++) {
+                        writeByte(std_ac_luminance_nrcodes[k+1]);
+                    }
+                    for (var l=0; l<=161; l++) {
+                        writeByte(std_ac_luminance_values[l]);
+                    }
+    
+                    writeByte(1); // HTUDCinfo
+                    for (var m=0; m<16; m++) {
+                        writeByte(std_dc_chrominance_nrcodes[m+1]);
+                    }
+                    for (var n=0; n<=11; n++) {
+                        writeByte(std_dc_chrominance_values[n]);
+                    }
+    
+                    writeByte(0x11); // HTUACinfo
+                    for (var o=0; o<16; o++) {
+                        writeByte(std_ac_chrominance_nrcodes[o+1]);
+                    }
+                    for (var p=0; p<=161; p++) {
+                        writeByte(std_ac_chrominance_values[p]);
+                    }
+                }
+    
+                function writeSOS()
+                {
+                    writeWord(0xFFDA); // marker
+                    writeWord(12); // length
+                    writeByte(3); // nrofcomponents
+                    writeByte(1); // IdY
+                    writeByte(0); // HTY
+                    writeByte(2); // IdU
+                    writeByte(0x11); // HTU
+                    writeByte(3); // IdV
+                    writeByte(0x11); // HTV
+                    writeByte(0); // Ss
+                    writeByte(0x3f); // Se
+                    writeByte(0); // Bf
+                }
+    
+                function processDU(CDU, fdtbl, DC, HTDC, HTAC){
+                    var EOB = HTAC[0x00];
+                    var M16zeroes = HTAC[0xF0];
+                    var pos;
+                    var I16 = 16;
+                    var I63 = 63;
+                    var I64 = 64;
+                    var DU_DCT = fDCTQuant(CDU, fdtbl);
+                    //ZigZag reorder
+                    for (var j=0;j<I64;++j) {
+                        DU[ZigZag[j]]=DU_DCT[j];
+                    }
+                    var Diff = DU[0] - DC; DC = DU[0];
+                    //Encode DC
+                    if (Diff==0) {
+                        writeBits(HTDC[0]); // Diff might be 0
+                    } else {
+                        pos = 32767+Diff;
+                        writeBits(HTDC[category[pos]]);
+                        writeBits(bitcode[pos]);
+                    }
+                    //Encode ACs
+                    var end0pos = 63; // was const... which is crazy
+                    for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {};
+                    //end0pos = first element in reverse order !=0
+                    if ( end0pos == 0) {
+                        writeBits(EOB);
+                        return DC;
+                    }
+                    var i = 1;
+                    var lng;
+                    while ( i <= end0pos ) {
+                        var startpos = i;
+                        for (; (DU[i]==0) && (i<=end0pos); ++i) {}
+                        var nrzeroes = i-startpos;
+                        if ( nrzeroes >= I16 ) {
+                            lng = nrzeroes>>4;
+                            for (var nrmarker=1; nrmarker <= lng; ++nrmarker)
+                                writeBits(M16zeroes);
+                            nrzeroes = nrzeroes&0xF;
+                        }
+                        pos = 32767+DU[i];
+                        writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
+                        writeBits(bitcode[pos]);
+                        i++;
+                    }
+                    if ( end0pos != I63 ) {
+                        writeBits(EOB);
+                    }
+                    return DC;
+                }
+    
+                function initCharLookupTable(){
+                    var sfcc = String.fromCharCode;
+                    for(var i=0; i < 256; i++){ ///// ACHTUNG // 255
+                        clt[i] = sfcc(i);
+                    }
+                }
+    
+                this.encode = function(image,quality) // image data object
+                {
+                    // var time_start = new Date().getTime();
+    
+                    if(quality) setQuality(quality);
+    
+                    // Initialize bit writer
+                    byteout = new Array();
+                    bytenew=0;
+                    bytepos=7;
+    
+                    // Add JPEG headers
+                    writeWord(0xFFD8); // SOI
+                    writeAPP0();
+                    writeDQT();
+                    writeSOF0(image.width,image.height);
+                    writeDHT();
+                    writeSOS();
+    
+    
+                    // Encode 8x8 macroblocks
+                    var DCY=0;
+                    var DCU=0;
+                    var DCV=0;
+    
+                    bytenew=0;
+                    bytepos=7;
+    
+    
+                    this.encode.displayName = "_encode_";
+    
+                    var imageData = image.data;
+                    var width = image.width;
+                    var height = image.height;
+    
+                    var quadWidth = width*4;
+                    var tripleWidth = width*3;
+    
+                    var x, y = 0;
+                    var r, g, b;
+                    var start,p, col,row,pos;
+                    while(y < height){
+                        x = 0;
+                        while(x < quadWidth){
+                        start = quadWidth * y + x;
+                        p = start;
+                        col = -1;
+                        row = 0;
+    
+                        for(pos=0; pos < 64; pos++){
+                            row = pos >> 3;// /8
+                            col = ( pos & 7 ) * 4; // %8
+                            p = start + ( row * quadWidth ) + col;
+    
+                            if(y+row >= height){ // padding bottom
+                                p-= (quadWidth*(y+1+row-height));
+                            }
+    
+                            if(x+col >= quadWidth){ // padding right
+                                p-= ((x+col) - quadWidth +4)
+                            }
+    
+                            r = imageData[ p++ ];
+                            g = imageData[ p++ ];
+                            b = imageData[ p++ ];
+    
+    
+                            /* // calculate YUV values dynamically
+                            YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
+                            UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
+                            VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
+                            */
+    
+                            // use lookup table (slightly faster)
+                            YDU[pos] = ((RGB_YUV_TABLE[r]             + RGB_YUV_TABLE[(g +  256)>>0] + RGB_YUV_TABLE[(b +  512)>>0]) >> 16)-128;
+                            UDU[pos] = ((RGB_YUV_TABLE[(r +  768)>>0] + RGB_YUV_TABLE[(g + 1024)>>0] + RGB_YUV_TABLE[(b + 1280)>>0]) >> 16)-128;
+                            VDU[pos] = ((RGB_YUV_TABLE[(r + 1280)>>0] + RGB_YUV_TABLE[(g + 1536)>>0] + RGB_YUV_TABLE[(b + 1792)>>0]) >> 16)-128;
+    
+                        }
+    
+                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
+                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
+                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
+                        x+=32;
+                        }
+                        y+=8;
+                    }
+    
+    
+                    ////////////////////////////////////////////////////////////////
+    
+                    // Do the bit alignment of the EOI marker
+                    if ( bytepos >= 0 ) {
+                        var fillbits = [];
+                        fillbits[1] = bytepos+1;
+                        fillbits[0] = (1<<(bytepos+1))-1;
+                        writeBits(fillbits);
+                    }
+    
+                    writeWord(0xFFD9); //EOI
+    
+                    var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
+    
+                    byteout = [];
+    
+                    // benchmarking
+                    // var duration = new Date().getTime() - time_start;
+                    // console.log('Encoding time: '+ currentQuality + 'ms');
+                    //
+    
+                    return jpegDataUri
+            }
+    
+            function setQuality(quality){
+                if (quality <= 0) {
+                    quality = 1;
+                }
+                if (quality > 100) {
+                    quality = 100;
+                }
+    
+                if(currentQuality == quality) return // don't recalc if unchanged
+    
+                var sf = 0;
+                if (quality < 50) {
+                    sf = Math.floor(5000 / quality);
+                } else {
+                    sf = Math.floor(200 - quality*2);
+                }
+    
+                initQuantTables(sf);
+                currentQuality = quality;
+                // console.log('Quality set to: '+quality +'%');
+            }
+    
+            function init(){
+                // var time_start = new Date().getTime();
+                if(!quality) quality = 50;
+                // Create tables
+                initCharLookupTable()
+                initHuffmanTbl();
+                initCategoryNumber();
+                initRGBYUVTable();
+    
+                setQuality(quality);
+                // var duration = new Date().getTime() - time_start;
+                // console.log('Initialization '+ duration + 'ms');
+            }
+    
+            init();
+    
+        };
+    
+        JPEGEncoder.encode = function( data, quality ) {
+            var encoder = new JPEGEncoder( quality );
+    
+            return encoder.encode( data );
+        }
+    
+        return JPEGEncoder;
+    });
+    /**
+     * @fileOverview Fix android canvas.toDataUrl bug.
+     */
+    define('runtime/html5/androidpatch',[
+        'runtime/html5/util',
+        'runtime/html5/jpegencoder',
+        'base'
+    ], function( Util, encoder, Base ) {
+        var origin = Util.canvasToDataUrl,
+            supportJpeg;
+    
+        Util.canvasToDataUrl = function( canvas, type, quality ) {
+            var ctx, w, h, fragement, parts;
+    
+            // 非android手机直接跳过。
+            if ( !Base.os.android ) {
+                return origin.apply( null, arguments );
+            }
+    
+            // 检测是否canvas支持jpeg导出,根据数据格式来判断。
+            // JPEG 前两位分别是:255, 216
+            if ( type === 'image/jpeg' && typeof supportJpeg === 'undefined' ) {
+                fragement = origin.apply( null, arguments );
+    
+                parts = fragement.split(',');
+    
+                if ( ~parts[ 0 ].indexOf('base64') ) {
+                    fragement = atob( parts[ 1 ] );
+                } else {
+                    fragement = decodeURIComponent( parts[ 1 ] );
+                }
+    
+                fragement = fragement.substring( 0, 2 );
+    
+                supportJpeg = fragement.charCodeAt( 0 ) === 255 &&
+                        fragement.charCodeAt( 1 ) === 216;
+            }
+    
+            // 只有在android环境下才修复
+            if ( type === 'image/jpeg' && !supportJpeg ) {
+                w = canvas.width;
+                h = canvas.height;
+                ctx = canvas.getContext('2d');
+    
+                return encoder.encode( ctx.getImageData( 0, 0, w, h ), quality );
+            }
+    
+            return origin.apply( null, arguments );
+        };
+    });
+    /**
+     * @fileOverview Image
+     */
+    define('runtime/html5/image',[
+        'base',
+        'runtime/html5/runtime',
+        'runtime/html5/util'
+    ], function( Base, Html5Runtime, Util ) {
+    
+        var BLANK = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D';
+    
+        return Html5Runtime.register( 'Image', {
+    
+            // flag: 标记是否被修改过。
+            modified: false,
+    
+            init: function() {
+                var me = this,
+                    img = new Image();
+    
+                img.onload = function() {
+    
+                    me._info = {
+                        type: me.type,
+                        width: this.width,
+                        height: this.height
+                    };
+    
+                    // 读取meta信息。
+                    if ( !me._metas && 'image/jpeg' === me.type ) {
+                        Util.parseMeta( me._blob, function( error, ret ) {
+                            me._metas = ret;
+                            me.owner.trigger('load');
+                        });
+                    } else {
+                        me.owner.trigger('load');
+                    }
+                };
+    
+                img.onerror = function() {
+                    me.owner.trigger('error');
+                };
+    
+                me._img = img;
+            },
+    
+            loadFromBlob: function( blob ) {
+                var me = this,
+                    img = me._img;
+    
+                me._blob = blob;
+                me.type = blob.type;
+                img.src = Util.createObjectURL( blob.getSource() );
+                me.owner.once( 'load', function() {
+                    Util.revokeObjectURL( img.src );
+                });
+            },
+    
+            resize: function( width, height ) {
+                var canvas = this._canvas ||
+                        (this._canvas = document.createElement('canvas'));
+    
+                this._resize( this._img, canvas, width, height );
+                this._blob = null;    // 没用了,可以删掉了。
+                this.modified = true;
+                this.owner.trigger('complete');
+            },
+    
+            getAsBlob: function( type ) {
+                var blob = this._blob,
+                    opts = this.options,
+                    canvas;
+    
+                type = type || this.type;
+    
+                // blob需要重新生成。
+                if ( this.modified || this.type !== type ) {
+                    canvas = this._canvas;
+    
+                    if ( type === 'image/jpeg' ) {
+    
+                        blob = Util.canvasToDataUrl( canvas, 'image/jpeg',
+                                opts.quality );
+    
+                        if ( opts.preserveHeaders && this._metas &&
+                                this._metas.imageHead ) {
+    
+                            blob = Util.dataURL2ArrayBuffer( blob );
+                            blob = Util.updateImageHead( blob,
+                                    this._metas.imageHead );
+                            blob = Util.arrayBufferToBlob( blob, type );
+                            return blob;
+                        }
+                    } else {
+                        blob = Util.canvasToDataUrl( canvas, type );
+                    }
+    
+                    blob = Util.dataURL2Blob( blob );
+                }
+    
+                return blob;
+            },
+    
+            getAsDataUrl: function( type ) {
+                var opts = this.options;
+    
+                type = type || this.type;
+    
+                if ( type === 'image/jpeg' ) {
+                    return Util.canvasToDataUrl( this._canvas, type, opts.quality );
+                } else {
+                    return this._canvas.toDataURL( type );
+                }
+            },
+    
+            getOrientation: function() {
+                return this._metas && this._metas.exif &&
+                        this._metas.exif.get('Orientation') || 1;
+            },
+    
+            info: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._info = val;
+                    return this;
+                }
+    
+                // getter
+                return this._info;
+            },
+    
+            meta: function( val ) {
+    
+                // setter
+                if ( val ) {
+                    this._meta = val;
+                    return this;
+                }
+    
+                // getter
+                return this._meta;
+            },
+    
+            destroy: function() {
+                var canvas = this._canvas;
+                this._img.onload = null;
+    
+                if ( canvas ) {
+                    canvas.getContext('2d')
+                            .clearRect( 0, 0, canvas.width, canvas.height );
+                    canvas.width = canvas.height = 0;
+                    this._canvas = null;
+                }
+    
+                // 释放内存。非常重要,否则释放不了image的内存。
+                this._img.src = BLANK;
+                this._img = this._blob = null;
+            },
+    
+            _resize: function( img, cvs, width, height ) {
+                var opts = this.options,
+                    naturalWidth = img.width,
+                    naturalHeight = img.height,
+                    orientation = this.getOrientation(),
+                    scale, w, h, x, y;
+    
+                // values that require 90 degree rotation
+                if ( ~[ 5, 6, 7, 8 ].indexOf( orientation ) ) {
+    
+                    // 交换width, height的值。
+                    width ^= height;
+                    height ^= width;
+                    width ^= height;
+                }
+    
+                scale = Math[ opts.crop ? 'max' : 'min' ]( width / naturalWidth,
+                        height / naturalHeight );
+    
+                // 不允许放大。
+                opts.allowMagnify || (scale = Math.min( 1, scale ));
+    
+                w = naturalWidth * scale;
+                h = naturalHeight * scale;
+    
+                if ( opts.crop ) {
+                    cvs.width = width;
+                    cvs.height = height;
+                } else {
+                    cvs.width = w;
+                    cvs.height = h;
+                }
+    
+                x = (cvs.width - w) / 2;
+                y = (cvs.height - h) / 2;
+    
+                opts.preserveHeaders || this._rotate2Orientaion( cvs, orientation );
+    
+                this._renderImageToCanvas( cvs, img, x, y, w, h );
+            },
+    
+            _rotate2Orientaion: function( canvas, orientation ) {
+                var width = canvas.width,
+                    height = canvas.height,
+                    ctx = canvas.getContext('2d');
+    
+                switch ( orientation ) {
+                    case 5:
+                    case 6:
+                    case 7:
+                    case 8:
+                        canvas.width = height;
+                        canvas.height = width;
+                        break;
+                }
+    
+                switch ( orientation ) {
+                    case 2:    // horizontal flip
+                        ctx.translate( width, 0 );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 3:    // 180 rotate left
+                        ctx.translate( width, height );
+                        ctx.rotate( Math.PI );
+                        break;
+    
+                    case 4:    // vertical flip
+                        ctx.translate( 0, height );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 5:    // vertical flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.scale( 1, -1 );
+                        break;
+    
+                    case 6:    // 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( 0, -height );
+                        break;
+    
+                    case 7:    // horizontal flip + 90 rotate right
+                        ctx.rotate( 0.5 * Math.PI );
+                        ctx.translate( width, -height );
+                        ctx.scale( -1, 1 );
+                        break;
+    
+                    case 8:    // 90 rotate left
+                        ctx.rotate( -0.5 * Math.PI );
+                        ctx.translate( -width, 0 );
+                        break;
+                }
+            },
+    
+            // https://github.com/stomita/ios-imagefile-megapixel/
+            // blob/master/src/megapix-image.js
+            _renderImageToCanvas: (function() {
+    
+                // 如果不是ios, 不需要这么复杂!
+                if ( !Base.os.ios ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        canvas.getContext('2d').drawImage( img, x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detecting vertical squash in loaded image.
+                 * Fixes a bug which squash image vertically while drawing into
+                 * canvas for some images.
+                 */
+                function detectVerticalSquash( img, iw, ih ) {
+                    var canvas = document.createElement('canvas'),
+                        ctx = canvas.getContext('2d'),
+                        sy = 0,
+                        ey = ih,
+                        py = ih,
+                        data, alpha, ratio;
+    
+    
+                    canvas.width = 1;
+                    canvas.height = ih;
+                    ctx.drawImage( img, 0, 0 );
+                    data = ctx.getImageData( 0, 0, 1, ih ).data;
+    
+                    // search image edge pixel position in case
+                    // it is squashed vertically.
+                    while ( py > sy ) {
+                        alpha = data[ (py - 1) * 4 + 3 ];
+    
+                        if ( alpha === 0 ) {
+                            ey = py;
+                        } else {
+                            sy = py;
+                        }
+    
+                        py = (ey + sy) >> 1;
+                    }
+    
+                    ratio = (py / ih);
+                    return (ratio === 0) ? 1 : ratio;
+                }
+    
+                // fix ie7 bug
+                // http://stackoverflow.com/questions/11929099/
+                // html5-canvas-drawimage-ratio-bug-ios
+                if ( Base.os.ios >= 7 ) {
+                    return function( canvas, img, x, y, w, h ) {
+                        var iw = img.naturalWidth,
+                            ih = img.naturalHeight,
+                            vertSquashRatio = detectVerticalSquash( img, iw, ih );
+    
+                        return canvas.getContext('2d').drawImage( img, 0, 0,
+                            iw * vertSquashRatio, ih * vertSquashRatio,
+                            x, y, w, h );
+                    };
+                }
+    
+                /**
+                 * Detect subsampling in loaded image.
+                 * In iOS, larger images than 2M pixels may be
+                 * subsampled in rendering.
+                 */
+                function detectSubsampling( img ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        canvas, ctx;
+    
+                    // subsampling may happen overmegapixel image
+                    if ( iw * ih > 1024 * 1024 ) {
+                        canvas = document.createElement('canvas');
+                        canvas.width = canvas.height = 1;
+                        ctx = canvas.getContext('2d');
+                        ctx.drawImage( img, -iw + 1, 0 );
+    
+                        // subsampled image becomes half smaller in rendering size.
+                        // check alpha channel value to confirm image is covering
+                        // edge pixel or not. if alpha value is 0
+                        // image is not covering, hence subsampled.
+                        return ctx.getImageData( 0, 0, 1, 1 ).data[ 3 ] === 0;
+                    } else {
+                        return false;
+                    }
+                }
+    
+    
+                return function( canvas, img, x, y, width, height ) {
+                    var iw = img.naturalWidth,
+                        ih = img.naturalHeight,
+                        ctx = canvas.getContext('2d'),
+                        subsampled = detectSubsampling( img ),
+                        doSquash = this.type === 'image/jpeg',
+                        d = 1024,
+                        sy = 0,
+                        dy = 0,
+                        tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx;
+    
+                    if ( subsampled ) {
+                        iw /= 2;
+                        ih /= 2;
+                    }
+    
+                    ctx.save();
+                    tmpCanvas = document.createElement('canvas');
+                    tmpCanvas.width = tmpCanvas.height = d;
+    
+                    tmpCtx = tmpCanvas.getContext('2d');
+                    vertSquashRatio = doSquash ?
+                            detectVerticalSquash( img, iw, ih ) : 1;
+    
+                    dw = Math.ceil( d * width / iw );
+                    dh = Math.ceil( d * height / ih / vertSquashRatio );
+    
+                    while ( sy < ih ) {
+                        sx = 0;
+                        dx = 0;
+                        while ( sx < iw ) {
+                            tmpCtx.clearRect( 0, 0, d, d );
+                            tmpCtx.drawImage( img, -sx, -sy );
+                            ctx.drawImage( tmpCanvas, 0, 0, d, d,
+                                    x + dx, y + dy, dw, dh );
+                            sx += d;
+                            dx += dw;
+                        }
+                        sy += d;
+                        dy += dh;
+                    }
+                    ctx.restore();
+                    tmpCanvas = tmpCtx = null;
+                };
+            })()
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var noop = Base.noop,
+            $ = Base.$;
+    
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+    
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+    
+                if ( binary ) {
+                    xhr.overrideMimeType('application/octet-stream');
+    
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+    
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+    
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+    
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+    
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+    
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+    
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+    
+                    return me.trigger( 'progress', percentage );
+                };
+    
+                xhr.onreadystatechange = function() {
+    
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+    
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+    
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+    
+    
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+    
+            _parseJson: function( str ) {
+                var json;
+    
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+    
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+    
+    
+        function getFlashVersion() {
+            var version;
+    
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+    
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destory = this.destory,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                clients[ uid ] = client;
+    
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+    
+                    instance = pool[ uid ];
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+    
+                return me.flashExec.apply( client, arguments );
+            };
+    
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+    
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+    
+                // console.log.apply( console, arguments );
+    
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+    
+                // Base.log( evt, obj );
+            }
+    
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+    
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+    
+            this.jsreciver = jsreciver;
+    
+            this.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+    
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+    
+                return flash.exec( this.uid, comp, fn, args );
+            };
+    
+            // @todo
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+    
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+    
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+    
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+    
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+    
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+    
+                container.html( html );
+            },
+    
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+    
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+    
+        });
+    
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+    
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+    
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+    
+            return component;
+        };
+    
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+    
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+    
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+    
+                delete copy.button;
+                delete copy.container;
+    
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * @fileOverview 图片压缩
+     */
+    define('runtime/flash/image',[
+        'runtime/flash/runtime'
+    ], function( FlashRuntime ) {
+    
+        return FlashRuntime.register( 'Image', {
+            // init: function( options ) {
+            //     var owner = this.owner;
+    
+            //     this.flashExec( 'Image', 'init', options );
+            //     owner.on( 'load', function() {
+            //         debugger;
+            //     });
+            // },
+    
+            loadFromBlob: function( blob ) {
+                var owner = this.owner;
+    
+                owner.info() && this.flashExec( 'Image', 'info', owner.info() );
+                owner.meta() && this.flashExec( 'Image', 'meta', owner.meta() );
+    
+                this.flashExec( 'Image', 'loadFromBlob', blob.uid );
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+    
+                xhr.connectRuntime( blob.ruid );
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+    
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server
+                }, binary );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+    
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    return me.trigger( 'progress', e.loaded / e.total );
+                });
+    
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        err = '';
+    
+                    xhr.off();
+                    me._xhr = null;
+    
+                    if ( status >= 200 && status < 300 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                    } else if ( status >= 500 && status < 600 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+    
+                    xhr.destroy();
+                    xhr = null;
+    
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+    
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview 完全版本。
+     */
+    define('preset/all',[
+        'base',
+    
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/image',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+    
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/imagemeta/exif',
+        'runtime/html5/androidpatch',
+        'runtime/html5/image',
+        'runtime/html5/transport',
+    
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/image',
+        'runtime/flash/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/all'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.min.js
new file mode 100644
index 0000000..8807780
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",getDimension:"get-dimension",addButton:"add-btn",getRuntimeType:"get-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.disconnectRuntime()}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.exec("destroy"),this.disconnectRuntime(),this.off()}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!0,allowMagnify:!0},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({"make-thumb":"makeThumb","before-send-file":"compressImage"},{makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(){b(!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},compressImage:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||307200;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){b._info=b._info||d.info(),b._meta=b._meta||d.meta(),d.resize(g.width,g.height)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,a.size<c&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destory:function(){delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d.getStats().numOfQueue||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_nextBlock:function(){var a,b,c=this,d=c._act,f=c.options;return d&&d.has()&&d.file.getStatus()===h.PROGRESS?(f.prepareNextFile&&!c.pending.length&&c._prepareNextFile(),d.fetch()):c.runing?(!c.pending.length&&c.getStats().numOfQueue&&c._prepareNextFile(),a=c.pending.shift(),b=function(a){return a?(d=e(a,f.chunked?f.chunkSize:0),c._act=d,d.fetch()):null},g(a)?a[a.pipe?"pipe":"then"](b):b(a)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.QUEUED?(b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),c):b._finishFile(c)}),a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d._popBlock(b),a.nextTick(d.__tick))})},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){var c=0,d=0;c=b.percentage=a,b.chunks>1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))
+},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b=this,f=b.getRuid(),g=b.elem.parent().get(0);return g&&!d.contains(g,a.currentTarget)?!1:(b._getTansferFiles(a,function(a){b.trigger("drop",d.map(a,function(a){return new c(f,a)}))}),b.dndOver=!1,b.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k,l=[],m=[];for(b=b.originalEvent||b,f=b.dataTransfer,d=f.items,e=f.files,k=!(!d||!d[0].webkitGetAsEntry),i=0,j=e.length;j>i;i++)g=e[i],h=d&&d[i],k&&h.webkitGetAsEntry().isDirectory?m.push(this._traverseDirectoryTree(h.webkitGetAsEntry(),l)):l.push(g);a.when.apply(a,m).done(function(){l.length&&c(l)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragEnterHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;e<b.length;e++)c[e]=b.charCodeAt(e);return f=g[0].split(":")[1].split(";")[0],this.arrayBufferToBlob(d,f)},dataURL2ArrayBuffer:function(a){var b,c,d,e;for(e=a.split(","),b=~e[0].indexOf("base64")?atob(e[1]):decodeURIComponent(e[1]),c=new Uint8Array(b.length),d=0;d<b.length;d++)c[d]=b.charCodeAt(d);return c.buffer},arrayBufferToBlob:function(b,c){var d,e=a.BlobBuilder||a.WebKitBlobBuilder;return e?(d=new e,d.append(b),d.getBlob(c)):new Blob([b],c?{type:c}:{})},canvasToDataUrl:function(a,b,c){return a.toDataURL(b,c/100)},parseMeta:function(a,b){b(!1,{})},updateImageHead:function(a){return a}}}),b("runtime/html5/imagemeta",["runtime/html5/util"],function(a){var b;return b={parsers:{65505:[]},maxMetaDataSize:262144,parse:function(a,b){var c=this,d=new FileReader;d.onload=function(){b(!1,c._parse(this.result)),d=d.onload=d.onerror=null},d.onerror=function(a){b(a.message),d=d.onload=d.onerror=null},a=a.slice(0,c.maxMetaDataSize),d.readAsArrayBuffer(a.getSource())},_parse:function(a,c){if(!(a.byteLength<6)){var d,e,f,g,h=new DataView(a),i=2,j=h.byteLength-4,k=i,l={};if(65496===h.getUint16(0)){for(;j>i&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g<f.length;g+=1)f[g].call(b,h,i,e,l);i+=e,k=i}k>6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;l<k.length&&(n=k[l],"\x00"!==n);l+=1)m+=n;return m}return k},c.parseExifTag=function(a,b,d,e,f){var g=a.getUint16(d,e);f.exif[g]=c.getExifValue(a,b,d,a.getUint16(d+2,e),a.getUint32(d+4,e),e)},c.parseExifTags=function(b,c,d,e,f){var g,h,i;if(d+6>b.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/jpegencoder",[],function(){function a(a){function b(a){for(var b=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],c=0;64>c;c++){var d=y((b[c]*a+50)/100);1>d?d=1:d>255&&(d=255),z[P[c]]=d}for(var e=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],f=0;64>f;f++){var g=y((e[f]*a+50)/100);1>g?g=1:g>255&&(g=255),A[P[f]]=g}for(var h=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],i=0,j=0;8>j;j++)for(var k=0;8>k;k++)B[i]=1/(z[P[i]]*h[j]*h[k]*8),C[i]=1/(A[P[i]]*h[j]*h[k]*8),i++}function c(a,b){for(var c=0,d=0,e=new Array,f=1;16>=f;f++){for(var g=1;g<=a[f];g++)e[b[d]]=[],e[b[d]][0]=c,e[b[d]][1]=f,d++,c++;c*=2}return e}function d(){t=c(Q,R),u=c(U,V),v=c(S,T),w=c(W,X)}function e(){for(var a=1,b=2,c=1;15>=c;c++){for(var d=a;b>d;d++)E[32767+d]=c,D[32767+d]=[],D[32767+d][1]=c,D[32767+d][0]=d;for(var e=-(b-1);-a>=e;e++)E[32767+e]=c,D[32767+e]=[],D[32767+e][1]=c,D[32767+e][0]=b-1+e;a<<=1,b<<=1}}function f(){for(var a=0;256>a;a++)O[a]=19595*a,O[a+256>>0]=38470*a,O[a+512>>0]=7471*a+32768,O[a+768>>0]=-11059*a,O[a+1024>>0]=-21709*a,O[a+1280>>0]=32768*a+8421375,O[a+1536>>0]=-27439*a,O[a+1792>>0]=-5329*a}function g(a){for(var b=a[0],c=a[1]-1;c>=0;)b&1<<c&&(I|=1<<J),c--,J--,0>J&&(255==I?(h(255),h(0)):h(I),J=7,I=0)}function h(a){H.push(N[a])}function i(a){h(a>>8&255),h(255&a)}function j(a,b){var c,d,e,f,g,h,i,j,k,l=0,m=8,n=64;for(k=0;m>k;++k){c=a[l],d=a[l+1],e=a[l+2],f=a[l+3],g=a[l+4],h=a[l+5],i=a[l+6],j=a[l+7];var o=c+j,p=c-j,q=d+i,r=d-i,s=e+h,t=e-h,u=f+g,v=f-g,w=o+u,x=o-u,y=q+s,z=q-s;a[l]=w+y,a[l+4]=w-y;var A=.707106781*(z+x);a[l+2]=x+A,a[l+6]=x-A,w=v+t,y=t+r,z=r+p;var B=.382683433*(w-z),C=.5411961*w+B,D=1.306562965*z+B,E=.707106781*y,G=p+E,H=p-E;a[l+5]=H+C,a[l+3]=H-C,a[l+1]=G+D,a[l+7]=G-D,l+=8}for(l=0,k=0;m>k;++k){c=a[l],d=a[l+8],e=a[l+16],f=a[l+24],g=a[l+32],h=a[l+40],i=a[l+48],j=a[l+56];var I=c+j,J=c-j,K=d+i,L=d-i,M=e+h,N=e-h,O=f+g,P=f-g,Q=I+O,R=I-O,S=K+M,T=K-M;a[l]=Q+S,a[l+32]=Q-S;var U=.707106781*(T+R);a[l+16]=R+U,a[l+48]=R-U,Q=P+N,S=N+L,T=L+J;var V=.382683433*(Q-T),W=.5411961*Q+V,X=1.306562965*T+V,Y=.707106781*S,Z=J+Y,$=J-Y;a[l+40]=$+W,a[l+24]=$-W,a[l+8]=Z+X,a[l+56]=Z-X,l++}var _;for(k=0;n>k;++k)_=a[k]*b[k],F[k]=_>0?_+.5|0:_-.5|0;return F}function k(){i(65504),i(16),h(74),h(70),h(73),h(70),h(0),h(1),h(1),h(0),i(1),i(1),h(0),h(0)}function l(a,b){i(65472),i(17),h(8),i(b),i(a),h(3),h(1),h(17),h(0),h(2),h(17),h(1),h(3),h(17),h(1)}function m(){i(65499),i(132),h(0);for(var a=0;64>a;a++)h(z[a]);h(1);for(var b=0;64>b;b++)h(A[b])}function n(){i(65476),i(418),h(0);for(var a=0;16>a;a++)h(Q[a+1]);for(var b=0;11>=b;b++)h(R[b]);h(16);for(var c=0;16>c;c++)h(S[c+1]);for(var d=0;161>=d;d++)h(T[d]);h(1);for(var e=0;16>e;e++)h(U[e+1]);for(var f=0;11>=f;f++)h(V[f]);h(17);for(var g=0;16>g;g++)h(W[g+1]);for(var j=0;161>=j;j++)h(X[j])}function o(){i(65498),i(12),h(3),h(1),h(0),h(2),h(17),h(3),h(17),h(0),h(63),h(0)}function p(a,b,c,d,e){for(var f,h=e[0],i=e[240],k=16,l=63,m=64,n=j(a,b),o=0;m>o;++o)G[P[o]]=n[o];var p=G[0]-c;c=G[0],0==p?g(d[0]):(f=32767+p,g(d[E[f]]),g(D[f]));for(var q=63;q>0&&0==G[q];q--);if(0==q)return g(h),c;for(var r,s=1;q>=s;){for(var t=s;0==G[s]&&q>=s;++s);var u=s-t;if(u>=k){r=u>>4;for(var v=1;r>=v;++v)g(i);u=15&u}f=32767+G[s],g(e[(u<<4)+E[f]]),g(D[f]),s++}return q!=l&&g(h),c}function q(){for(var a=String.fromCharCode,b=0;256>b;b++)N[b]=a(b)}function r(a){if(0>=a&&(a=1),a>100&&(a=100),x!=a){var c=0;c=Math.floor(50>a?5e3/a:200-2*a),b(c),x=a}}function s(){a||(a=50),q(),d(),e(),f(),r(a)}var t,u,v,w,x,y=(Math.round,Math.floor),z=new Array(64),A=new Array(64),B=new Array(64),C=new Array(64),D=new Array(65535),E=new Array(65535),F=new Array(64),G=new Array(64),H=[],I=0,J=7,K=new Array(64),L=new Array(64),M=new Array(64),N=new Array(256),O=new Array(2048),P=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],Q=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],R=[0,1,2,3,4,5,6,7,8,9,10,11],S=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],T=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],U=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],V=[0,1,2,3,4,5,6,7,8,9,10,11],W=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],X=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];this.encode=function(a,b){b&&r(b),H=new Array,I=0,J=7,i(65496),k(),m(),l(a.width,a.height),n(),o();var c=0,d=0,e=0;I=0,J=7,this.encode.displayName="_encode_";for(var f,h,j,q,s,x,y,z,A,D=a.data,E=a.width,F=a.height,G=4*E,N=0;F>N;){for(f=0;G>f;){for(s=G*N+f,x=s,y=-1,z=0,A=0;64>A;A++)z=A>>3,y=4*(7&A),x=s+z*G+y,N+z>=F&&(x-=G*(N+1+z-F)),f+y>=G&&(x-=f+y-G+4),h=D[x++],j=D[x++],q=D[x++],K[A]=(O[h]+O[j+256>>0]+O[q+512>>0]>>16)-128,L[A]=(O[h+768>>0]+O[j+1024>>0]+O[q+1280>>0]>>16)-128,M[A]=(O[h+1280>>0]+O[j+1536>>0]+O[q+1792>>0]>>16)-128;c=p(K,B,c,t,v),d=p(L,C,d,u,w),e=p(M,C,e,u,w),f+=32}N+=8}if(J>=0){var P=[];P[1]=J+1,P[0]=(1<<J+1)-1,g(P)}i(65497);var Q="data:image/jpeg;base64,"+btoa(H.join(""));return H=[],Q},s()}return a.encode=function(b,c){var d=new a(c);return d.encode(b)},a}),b("runtime/html5/androidpatch",["runtime/html5/util","runtime/html5/jpegencoder","base"],function(a,b,c){var d,e=a.canvasToDataUrl;a.canvasToDataUrl=function(a,f,g){var h,i,j,k,l;return c.os.android?("image/jpeg"===f&&"undefined"==typeof d&&(k=e.apply(null,arguments),l=k.split(","),k=~l[0].indexOf("base64")?atob(l[1]):decodeURIComponent(l[1]),k=k.substring(0,2),d=255===k.charCodeAt(0)&&216===k.charCodeAt(1)),"image/jpeg"!==f||d?e.apply(null,arguments):(i=a.width,j=a.height,h=a.getContext("2d"),b.encode(h.getImageData(0,0,i,j),g))):e.apply(null,arguments)}}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,"image/jpeg",e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(a,b,c,d,e,f){a.getContext("2d").drawImage(b,c,d,e,f)}}()})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destory,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destory=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){}})}),b("runtime/flash/image",["runtime/flash/runtime"],function(a){return a.register("Image",{loadFromBlob:function(a){var b=this.owner;b.info()&&this.flashExec("Image","info",b.info()),b.meta()&&this.flashExec("Image","meta",b.meta()),this.flashExec("Image","loadFromBlob",a.uid)}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(a,b,c){var d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,e=this._initAjax(),f=b._blob,g=c.server;e.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+d.param(b._formData),a=f.uid):(d.each(b._formData,function(a,b){e.exec("append",a,b)}),e.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(e,c.headers),e.exec("send",{method:c.method,url:g},a)},getStatus:function(){return this._status},getResponse:function(){return this._response},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new c("XMLHttpRequest");return b.on("uploadprogress progress",function(b){return a.trigger("progress",b.loaded/b.total)}),b.on("load",function(){var c=b.exec("getStatus"),d="";return b.off(),a._xhr=null,c>=200&&300>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson")):c>=500&&600>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson"),d="server"):d="http",b.destroy(),b=null,d?a.trigger("error",d):a.trigger("load")}),b.on("error",function(){b.off(),a._xhr=null,a.trigger("error","http")}),a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("preset/all",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/androidpatch","runtime/html5/image","runtime/html5/transport","runtime/flash/filepicker","runtime/flash/image","runtime/flash/transport"],function(a){return a}),b("webuploader",["preset/all"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.withoutimage.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.withoutimage.js
new file mode 100644
index 0000000..1b921c3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.withoutimage.js
@@ -0,0 +1,4593 @@
+/*! WebUploader 0.1.2 */
+
+
+/**
+ * @fileOverview 让内部各个部件的代码可以用[amd](https://github.com/amdjs/amdjs-api/wiki/AMD)模块定义方式组织起来。
+ *
+ * AMD API 内部的简单不完全实现,请忽略。只有当WebUploader被合并成一个文件的时候才会引入。
+ */
+(function( root, factory ) {
+    var modules = {},
+
+        // 内部require, 简单不完全实现。
+        // https://github.com/amdjs/amdjs-api/wiki/require
+        _require = function( deps, callback ) {
+            var args, len, i;
+
+            // 如果deps不是数组,则直接返回指定module
+            if ( typeof deps === 'string' ) {
+                return getModule( deps );
+            } else {
+                args = [];
+                for( len = deps.length, i = 0; i < len; i++ ) {
+                    args.push( getModule( deps[ i ] ) );
+                }
+
+                return callback.apply( null, args );
+            }
+        },
+
+        // 内部define,暂时不支持不指定id.
+        _define = function( id, deps, factory ) {
+            if ( arguments.length === 2 ) {
+                factory = deps;
+                deps = null;
+            }
+
+            _require( deps || [], function() {
+                setModule( id, factory, arguments );
+            });
+        },
+
+        // 设置module, 兼容CommonJs写法。
+        setModule = function( id, factory, args ) {
+            var module = {
+                    exports: factory
+                },
+                returned;
+
+            if ( typeof factory === 'function' ) {
+                args.length || (args = [ _require, module.exports, module ]);
+                returned = factory.apply( null, args );
+                returned !== undefined && (module.exports = returned);
+            }
+
+            modules[ id ] = module.exports;
+        },
+
+        // 根据id获取module
+        getModule = function( id ) {
+            var module = modules[ id ] || root[ id ];
+
+            if ( !module ) {
+                throw new Error( '`' + id + '` is undefined' );
+            }
+
+            return module;
+        },
+
+        // 将所有modules,将路径ids装换成对象。
+        exportsTo = function( obj ) {
+            var key, host, parts, part, last, ucFirst;
+
+            // make the first character upper case.
+            ucFirst = function( str ) {
+                return str && (str.charAt( 0 ).toUpperCase() + str.substr( 1 ));
+            };
+
+            for ( key in modules ) {
+                host = obj;
+
+                if ( !modules.hasOwnProperty( key ) ) {
+                    continue;
+                }
+
+                parts = key.split('/');
+                last = ucFirst( parts.pop() );
+
+                while( (part = ucFirst( parts.shift() )) ) {
+                    host[ part ] = host[ part ] || {};
+                    host = host[ part ];
+                }
+
+                host[ last ] = modules[ key ];
+            }
+        },
+
+        exports = factory( root, _define, _require ),
+        origin;
+
+    // exports every module.
+    exportsTo( exports );
+
+    if ( typeof module === 'object' && typeof module.exports === 'object' ) {
+
+        // For CommonJS and CommonJS-like environments where a proper window is present,
+        module.exports = exports;
+    } else if ( typeof define === 'function' && define.amd ) {
+
+        // Allow using this built library as an AMD module
+        // in another project. That other project will only
+        // see this AMD call, not the internal modules in
+        // the closure below.
+        define([], exports );
+    } else {
+
+        // Browser globals case. Just assign the
+        // result to a property on the global.
+        origin = root.WebUploader;
+        root.WebUploader = exports;
+        root.WebUploader.noConflict = function() {
+            root.WebUploader = origin;
+        };
+    }
+})( this, function( window, define, require ) {
+
+
+    /**
+     * @fileOverview jQuery or Zepto
+     */
+    define('dollar-third',[],function() {
+        return window.jQuery || window.Zepto;
+    });
+    /**
+     * @fileOverview Dom 操作相关
+     */
+    define('dollar',[
+        'dollar-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 使用jQuery的Promise
+     */
+    define('promise-third',[
+        'dollar'
+    ], function( $ ) {
+        return {
+            Deferred: $.Deferred,
+            when: $.when,
+    
+            isPromise: function( anything ) {
+                return anything && typeof anything.then === 'function';
+            }
+        };
+    });
+    /**
+     * @fileOverview Promise/A+
+     */
+    define('promise',[
+        'promise-third'
+    ], function( _ ) {
+        return _;
+    });
+    /**
+     * @fileOverview 基础类方法。
+     */
+    
+    /**
+     * Web Uploader内部类的详细说明,以下提及的功能类,都可以在`WebUploader`这个变量中访问到。
+     *
+     * As you know, Web Uploader的每个文件都是用过[AMD](https://github.com/amdjs/amdjs-api/wiki/AMD)规范中的`define`组织起来的, 每个Module都会有个module id.
+     * 默认module id该文件的路径,而此路径将会转化成名字空间存放在WebUploader中。如:
+     *
+     * * module `base`:WebUploader.Base
+     * * module `file`: WebUploader.File
+     * * module `lib/dnd`: WebUploader.Lib.Dnd
+     * * module `runtime/html5/dnd`: WebUploader.Runtime.Html5.Dnd
+     *
+     *
+     * 以下文档将可能省略`WebUploader`前缀。
+     * @module WebUploader
+     * @title WebUploader API文档
+     */
+    define('base',[
+        'dollar',
+        'promise'
+    ], function( $, promise ) {
+    
+        var noop = function() {},
+            call = Function.call;
+    
+        // http://jsperf.com/uncurrythis
+        // 反科里化
+        function uncurryThis( fn ) {
+            return function() {
+                return call.apply( fn, arguments );
+            };
+        }
+    
+        function bindFn( fn, context ) {
+            return function() {
+                return fn.apply( context, arguments );
+            };
+        }
+    
+        function createObject( proto ) {
+            var f;
+    
+            if ( Object.create ) {
+                return Object.create( proto );
+            } else {
+                f = function() {};
+                f.prototype = proto;
+                return new f();
+            }
+        }
+    
+    
+        /**
+         * 基础类,提供一些简单常用的方法。
+         * @class Base
+         */
+        return {
+    
+            /**
+             * @property {String} version 当前版本号。
+             */
+            version: '0.1.2',
+    
+            /**
+             * @property {jQuery|Zepto} $ 引用依赖的jQuery或者Zepto对象。
+             */
+            $: $,
+    
+            Deferred: promise.Deferred,
+    
+            isPromise: promise.isPromise,
+    
+            when: promise.when,
+    
+            /**
+             * @description  简单的浏览器检查结果。
+             *
+             * * `webkit`  webkit版本号,如果浏览器为非webkit内核,此属性为`undefined`。
+             * * `chrome`  chrome浏览器版本号,如果浏览器为chrome,此属性为`undefined`。
+             * * `ie`  ie浏览器版本号,如果浏览器为非ie,此属性为`undefined`。**暂不支持ie10+**
+             * * `firefox`  firefox浏览器版本号,如果浏览器为非firefox,此属性为`undefined`。
+             * * `safari`  safari浏览器版本号,如果浏览器为非safari,此属性为`undefined`。
+             * * `opera`  opera浏览器版本号,如果浏览器为非opera,此属性为`undefined`。
+             *
+             * @property {Object} [browser]
+             */
+            browser: (function( ua ) {
+                var ret = {},
+                    webkit = ua.match( /WebKit\/([\d.]+)/ ),
+                    chrome = ua.match( /Chrome\/([\d.]+)/ ) ||
+                        ua.match( /CriOS\/([\d.]+)/ ),
+    
+                    ie = ua.match( /MSIE\s([\d\.]+)/ ) ||
+                        ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
+                    firefox = ua.match( /Firefox\/([\d.]+)/ ),
+                    safari = ua.match( /Safari\/([\d.]+)/ ),
+                    opera = ua.match( /OPR\/([\d.]+)/ );
+    
+                webkit && (ret.webkit = parseFloat( webkit[ 1 ] ));
+                chrome && (ret.chrome = parseFloat( chrome[ 1 ] ));
+                ie && (ret.ie = parseFloat( ie[ 1 ] ));
+                firefox && (ret.firefox = parseFloat( firefox[ 1 ] ));
+                safari && (ret.safari = parseFloat( safari[ 1 ] ));
+                opera && (ret.opera = parseFloat( opera[ 1 ] ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * @description  操作系统检查结果。
+             *
+             * * `android`  如果在android浏览器环境下,此值为对应的android版本号,否则为`undefined`。
+             * * `ios` 如果在ios浏览器环境下,此值为对应的ios版本号,否则为`undefined`。
+             * @property {Object} [os]
+             */
+            os: (function( ua ) {
+                var ret = {},
+    
+                    // osx = !!ua.match( /\(Macintosh\; Intel / ),
+                    android = ua.match( /(?:Android);?[\s\/]+([\d.]+)?/ ),
+                    ios = ua.match( /(?:iPad|iPod|iPhone).*OS\s([\d_]+)/ );
+    
+                // osx && (ret.osx = true);
+                android && (ret.android = parseFloat( android[ 1 ] ));
+                ios && (ret.ios = parseFloat( ios[ 1 ].replace( /_/g, '.' ) ));
+    
+                return ret;
+            })( navigator.userAgent ),
+    
+            /**
+             * 实现类与类之间的继承。
+             * @method inherits
+             * @grammar Base.inherits( super ) => child
+             * @grammar Base.inherits( super, protos ) => child
+             * @grammar Base.inherits( super, protos, statics ) => child
+             * @param  {Class} super 父类
+             * @param  {Object | Function} [protos] 子类或者对象。如果对象中包含constructor,子类将是用此属性值。
+             * @param  {Function} [protos.constructor] 子类构造器,不指定的话将创建个临时的直接执行父类构造器的方法。
+             * @param  {Object} [statics] 静态属性或方法。
+             * @return {Class} 返回子类。
+             * @example
+             * function Person() {
+             *     console.log( 'Super' );
+             * }
+             * Person.prototype.hello = function() {
+             *     console.log( 'hello' );
+             * };
+             *
+             * var Manager = Base.inherits( Person, {
+             *     world: function() {
+             *         console.log( 'World' );
+             *     }
+             * });
+             *
+             * // 因为没有指定构造器,父类的构造器将会执行。
+             * var instance = new Manager();    // => Super
+             *
+             * // 继承子父类的方法
+             * instance.hello();    // => hello
+             * instance.world();    // => World
+             *
+             * // 子类的__super__属性指向父类
+             * console.log( Manager.__super__ === Person );    // => true
+             */
+            inherits: function( Super, protos, staticProtos ) {
+                var child;
+    
+                if ( typeof protos === 'function' ) {
+                    child = protos;
+                    protos = null;
+                } else if ( protos && protos.hasOwnProperty('constructor') ) {
+                    child = protos.constructor;
+                } else {
+                    child = function() {
+                        return Super.apply( this, arguments );
+                    };
+                }
+    
+                // 复制静态方法
+                $.extend( true, child, Super, staticProtos || {} );
+    
+                /* jshint camelcase: false */
+    
+                // 让子类的__super__属性指向父类。
+                child.__super__ = Super.prototype;
+    
+                // 构建原型,添加原型方法或属性。
+                // 暂时用Object.create实现。
+                child.prototype = createObject( Super.prototype );
+                protos && $.extend( true, child.prototype, protos );
+    
+                return child;
+            },
+    
+            /**
+             * 一个不做任何事情的方法。可以用来赋值给默认的callback.
+             * @method noop
+             */
+            noop: noop,
+    
+            /**
+             * 返回一个新的方法,此方法将已指定的`context`来执行。
+             * @grammar Base.bindFn( fn, context ) => Function
+             * @method bindFn
+             * @example
+             * var doSomething = function() {
+             *         console.log( this.name );
+             *     },
+             *     obj = {
+             *         name: 'Object Name'
+             *     },
+             *     aliasFn = Base.bind( doSomething, obj );
+             *
+             *  aliasFn();    // => Object Name
+             *
+             */
+            bindFn: bindFn,
+    
+            /**
+             * 引用Console.log如果存在的话,否则引用一个[空函数loop](#WebUploader:Base.log)。
+             * @grammar Base.log( args... ) => undefined
+             * @method log
+             */
+            log: (function() {
+                if ( window.console ) {
+                    return bindFn( console.log, console );
+                }
+                return noop;
+            })(),
+    
+            nextTick: (function() {
+    
+                return function( cb ) {
+                    setTimeout( cb, 1 );
+                };
+    
+                // @bug 当浏览器不在当前窗口时就停了。
+                // var next = window.requestAnimationFrame ||
+                //     window.webkitRequestAnimationFrame ||
+                //     window.mozRequestAnimationFrame ||
+                //     function( cb ) {
+                //         window.setTimeout( cb, 1000 / 60 );
+                //     };
+    
+                // // fix: Uncaught TypeError: Illegal invocation
+                // return bindFn( next, window );
+            })(),
+    
+            /**
+             * 被[uncurrythis](http://www.2ality.com/2011/11/uncurrying-this.html)的数组slice方法。
+             * 将用来将非数组对象转化成数组对象。
+             * @grammar Base.slice( target, start[, end] ) => Array
+             * @method slice
+             * @example
+             * function doSomthing() {
+             *     var args = Base.slice( arguments, 1 );
+             *     console.log( args );
+             * }
+             *
+             * doSomthing( 'ignored', 'arg2', 'arg3' );    // => Array ["arg2", "arg3"]
+             */
+            slice: uncurryThis( [].slice ),
+    
+            /**
+             * 生成唯一的ID
+             * @method guid
+             * @grammar Base.guid() => String
+             * @grammar Base.guid( prefx ) => String
+             */
+            guid: (function() {
+                var counter = 0;
+    
+                return function( prefix ) {
+                    var guid = (+new Date()).toString( 32 ),
+                        i = 0;
+    
+                    for ( ; i < 5; i++ ) {
+                        guid += Math.floor( Math.random() * 65535 ).toString( 32 );
+                    }
+    
+                    return (prefix || 'wu_') + guid + (counter++).toString( 32 );
+                };
+            })(),
+    
+            /**
+             * 格式化文件大小, 输出成带单位的字符串
+             * @method formatSize
+             * @grammar Base.formatSize( size ) => String
+             * @grammar Base.formatSize( size, pointLength ) => String
+             * @grammar Base.formatSize( size, pointLength, units ) => String
+             * @param {Number} size 文件大小
+             * @param {Number} [pointLength=2] 精确到的小数点数。
+             * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节,到千字节,一直往上指定。如果单位数组里面只指定了到了K(千字节),同时文件大小大于M, 此方法的输出将还是显示成多少K.
+             * @example
+             * console.log( Base.formatSize( 100 ) );    // => 100B
+             * console.log( Base.formatSize( 1024 ) );    // => 1.00K
+             * console.log( Base.formatSize( 1024, 0 ) );    // => 1K
+             * console.log( Base.formatSize( 1024 * 1024 ) );    // => 1.00M
+             * console.log( Base.formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
+             * console.log( Base.formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
+             */
+            formatSize: function( size, pointLength, units ) {
+                var unit;
+    
+                units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
+    
+                while ( (unit = units.shift()) && size > 1024 ) {
+                    size = size / 1024;
+                }
+    
+                return (unit === 'B' ? size : size.toFixed( pointLength || 2 )) +
+                        unit;
+            }
+        };
+    });
+    /**
+     * 事件处理类,可以独立使用,也可以扩展给对象使用。
+     * @fileOverview Mediator
+     */
+    define('mediator',[
+        'base'
+    ], function( Base ) {
+        var $ = Base.$,
+            slice = [].slice,
+            separator = /\s+/,
+            protos;
+    
+        // 根据条件过滤出事件handlers.
+        function findHandlers( arr, name, callback, context ) {
+            return $.grep( arr, function( handler ) {
+                return handler &&
+                        (!name || handler.e === name) &&
+                        (!callback || handler.cb === callback ||
+                        handler.cb._cb === callback) &&
+                        (!context || handler.ctx === context);
+            });
+        }
+    
+        function eachEvent( events, callback, iterator ) {
+            // 不支持对象,只支持多个event用空格隔开
+            $.each( (events || '').split( separator ), function( _, key ) {
+                iterator( key, callback );
+            });
+        }
+    
+        function triggerHanders( events, args ) {
+            var stoped = false,
+                i = -1,
+                len = events.length,
+                handler;
+    
+            while ( ++i < len ) {
+                handler = events[ i ];
+    
+                if ( handler.cb.apply( handler.ctx2, args ) === false ) {
+                    stoped = true;
+                    break;
+                }
+            }
+    
+            return !stoped;
+        }
+    
+        protos = {
+    
+            /**
+             * 绑定事件。
+             *
+             * `callback`方法在执行时,arguments将会来源于trigger的时候携带的参数。如
+             * ```javascript
+             * var obj = {};
+             *
+             * // 使得obj有事件行为
+             * Mediator.installTo( obj );
+             *
+             * obj.on( 'testa', function( arg1, arg2 ) {
+             *     console.log( arg1, arg2 ); // => 'arg1', 'arg2'
+             * });
+             *
+             * obj.trigger( 'testa', 'arg1', 'arg2' );
+             * ```
+             *
+             * 如果`callback`中,某一个方法`return false`了,则后续的其他`callback`都不会被执行到。
+             * 切会影响到`trigger`方法的返回值,为`false`。
+             *
+             * `on`还可以用来添加一个特殊事件`all`, 这样所有的事件触发都会响应到。同时此类`callback`中的arguments有一个不同处,
+             * 就是第一个参数为`type`,记录当前是什么事件在触发。此类`callback`的优先级比脚低,会再正常`callback`执行完后触发。
+             * ```javascript
+             * obj.on( 'all', function( type, arg1, arg2 ) {
+             *     console.log( type, arg1, arg2 ); // => 'testa', 'arg1', 'arg2'
+             * });
+             * ```
+             *
+             * @method on
+             * @grammar on( name, callback[, context] ) => self
+             * @param  {String}   name     事件名,支持多个事件用空格隔开
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             * @class Mediator
+             */
+            on: function( name, callback, context ) {
+                var me = this,
+                    set;
+    
+                if ( !callback ) {
+                    return this;
+                }
+    
+                set = this._events || (this._events = []);
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var handler = { e: name };
+    
+                    handler.cb = callback;
+                    handler.ctx = context;
+                    handler.ctx2 = context || me;
+                    handler.id = set.length;
+    
+                    set.push( handler );
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 绑定事件,且当handler执行完后,自动解除绑定。
+             * @method once
+             * @grammar once( name, callback[, context] ) => self
+             * @param  {String}   name     事件名
+             * @param  {Function} callback 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            once: function( name, callback, context ) {
+                var me = this;
+    
+                if ( !callback ) {
+                    return me;
+                }
+    
+                eachEvent( name, callback, function( name, callback ) {
+                    var once = function() {
+                            me.off( name, once );
+                            return callback.apply( context || me, arguments );
+                        };
+    
+                    once._cb = callback;
+                    me.on( name, once, context );
+                });
+    
+                return me;
+            },
+    
+            /**
+             * 解除事件绑定
+             * @method off
+             * @grammar off( [name[, callback[, context] ] ] ) => self
+             * @param  {String}   [name]     事件名
+             * @param  {Function} [callback] 事件处理器
+             * @param  {Object}   [context]  事件处理器的上下文。
+             * @return {self} 返回自身,方便链式
+             * @chainable
+             */
+            off: function( name, cb, ctx ) {
+                var events = this._events;
+    
+                if ( !events ) {
+                    return this;
+                }
+    
+                if ( !name && !cb && !ctx ) {
+                    this._events = [];
+                    return this;
+                }
+    
+                eachEvent( name, cb, function( name, cb ) {
+                    $.each( findHandlers( events, name, cb, ctx ), function() {
+                        delete events[ this.id ];
+                    });
+                });
+    
+                return this;
+            },
+    
+            /**
+             * 触发事件
+             * @method trigger
+             * @grammar trigger( name[, args...] ) => self
+             * @param  {String}   type     事件名
+             * @param  {*} [...] 任意参数
+             * @return {Boolean} 如果handler中return false了,则返回false, 否则返回true
+             */
+            trigger: function( type ) {
+                var args, events, allEvents;
+    
+                if ( !this._events || !type ) {
+                    return this;
+                }
+    
+                args = slice.call( arguments, 1 );
+                events = findHandlers( this._events, type );
+                allEvents = findHandlers( this._events, 'all' );
+    
+                return triggerHanders( events, args ) &&
+                        triggerHanders( allEvents, arguments );
+            }
+        };
+    
+        /**
+         * 中介者,它本身是个单例,但可以通过[installTo](#WebUploader:Mediator:installTo)方法,使任何对象具备事件行为。
+         * 主要目的是负责模块与模块之间的合作,降低耦合度。
+         *
+         * @class Mediator
+         */
+        return $.extend({
+    
+            /**
+             * 可以通过这个接口,使任何对象具备事件功能。
+             * @method installTo
+             * @param  {Object} obj 需要具备事件行为的对象。
+             * @return {Object} 返回obj.
+             */
+            installTo: function( obj ) {
+                return $.extend( obj, protos );
+            }
+    
+        }, protos );
+    });
+    /**
+     * @fileOverview Uploader上传类
+     */
+    define('uploader',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$;
+    
+        /**
+         * 上传入口类。
+         * @class Uploader
+         * @constructor
+         * @grammar new Uploader( opts ) => Uploader
+         * @example
+         * var uploader = WebUploader.Uploader({
+         *     swf: 'path_of_swf/Uploader.swf',
+         *
+         *     // 开起分片上传。
+         *     chunked: true
+         * });
+         */
+        function Uploader( opts ) {
+            this.options = $.extend( true, {}, Uploader.options, opts );
+            this._init( this.options );
+        }
+    
+        // default Options
+        // widgets中有相应扩展
+        Uploader.options = {};
+        Mediator.installTo( Uploader.prototype );
+    
+        // 批量添加纯命令式方法。
+        $.each({
+            upload: 'start-upload',
+            stop: 'stop-upload',
+            getFile: 'get-file',
+            getFiles: 'get-files',
+            addFile: 'add-file',
+            addFiles: 'add-file',
+            sort: 'sort-files',
+            removeFile: 'remove-file',
+            skipFile: 'skip-file',
+            retry: 'retry',
+            isInProgress: 'is-in-progress',
+            makeThumb: 'make-thumb',
+            getDimension: 'get-dimension',
+            addButton: 'add-btn',
+            getRuntimeType: 'get-runtime-type',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable',
+            reset: 'reset'
+        }, function( fn, command ) {
+            Uploader.prototype[ fn ] = function() {
+                return this.request( command, arguments );
+            };
+        });
+    
+        $.extend( Uploader.prototype, {
+            state: 'pending',
+    
+            _init: function( opts ) {
+                var me = this;
+    
+                me.request( 'init', opts, function() {
+                    me.state = 'ready';
+                    me.trigger('ready');
+                });
+            },
+    
+            /**
+             * 获取或者设置Uploader配置项。
+             * @method option
+             * @grammar option( key ) => *
+             * @grammar option( key, val ) => self
+             * @example
+             *
+             * // 初始状态图片上传前不会压缩
+             * var uploader = new WebUploader.Uploader({
+             *     resize: null;
+             * });
+             *
+             * // 修改后图片上传前,尝试将图片压缩到1600 * 1600
+             * uploader.options( 'resize', {
+             *     width: 1600,
+             *     height: 1600
+             * });
+             */
+            option: function( key, val ) {
+                var opts = this.options;
+    
+                // setter
+                if ( arguments.length > 1 ) {
+    
+                    if ( $.isPlainObject( val ) &&
+                            $.isPlainObject( opts[ key ] ) ) {
+                        $.extend( opts[ key ], val );
+                    } else {
+                        opts[ key ] = val;
+                    }
+    
+                } else {    // getter
+                    return key ? opts[ key ] : opts;
+                }
+            },
+    
+            /**
+             * 获取文件统计信息。返回一个包含一下信息的对象。
+             * * `successNum` 上传成功的文件数
+             * * `uploadFailNum` 上传失败的文件数
+             * * `cancelNum` 被删除的文件数
+             * * `invalidNum` 无效的文件数
+             * * `queueNum` 还在队列中的文件数
+             * @method getStats
+             * @grammar getStats() => Object
+             */
+            getStats: function() {
+                // return this._mgr.getStats.apply( this._mgr, arguments );
+                var stats = this.request('get-stats');
+    
+                return {
+                    successNum: stats.numOfSuccess,
+    
+                    // who care?
+                    // queueFailNum: 0,
+                    cancelNum: stats.numOfCancel,
+                    invalidNum: stats.numOfInvalid,
+                    uploadFailNum: stats.numOfUploadFailed,
+                    queueNum: stats.numOfQueue
+                };
+            },
+    
+            // 需要重写此方法来来支持opts.onEvent和instance.onEvent的处理器
+            trigger: function( type/*, args...*/ ) {
+                var args = [].slice.call( arguments, 1 ),
+                    opts = this.options,
+                    name = 'on' + type.substring( 0, 1 ).toUpperCase() +
+                        type.substring( 1 );
+    
+                if (
+                        // 调用通过on方法注册的handler.
+                        Mediator.trigger.apply( this, arguments ) === false ||
+    
+                        // 调用opts.onEvent
+                        $.isFunction( opts[ name ] ) &&
+                        opts[ name ].apply( this, args ) === false ||
+    
+                        // 调用this.onEvent
+                        $.isFunction( this[ name ] ) &&
+                        this[ name ].apply( this, args ) === false ||
+    
+                        // 广播所有uploader的事件。
+                        Mediator.trigger.apply( Mediator,
+                        [ this, type ].concat( args ) ) === false ) {
+    
+                    return false;
+                }
+    
+                return true;
+            },
+    
+            // widgets/widget.js将补充此方法的详细文档。
+            request: Base.noop
+        });
+    
+        /**
+         * 创建Uploader实例,等同于new Uploader( opts );
+         * @method create
+         * @class Base
+         * @static
+         * @grammar Base.create( opts ) => Uploader
+         */
+        Base.create = Uploader.create = function( opts ) {
+            return new Uploader( opts );
+        };
+    
+        // 暴露Uploader,可以通过它来扩展业务逻辑。
+        Base.Uploader = Uploader;
+    
+        return Uploader;
+    });
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/runtime',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            factories = {},
+    
+            // 获取对象的第一个key
+            getFirstKey = function( obj ) {
+                for ( var key in obj ) {
+                    if ( obj.hasOwnProperty( key ) ) {
+                        return key;
+                    }
+                }
+                return null;
+            };
+    
+        // 接口类。
+        function Runtime( options ) {
+            this.options = $.extend({
+                container: document.body
+            }, options );
+            this.uid = Base.guid('rt_');
+        }
+    
+        $.extend( Runtime.prototype, {
+    
+            getContainer: function() {
+                var opts = this.options,
+                    parent, container;
+    
+                if ( this._container ) {
+                    return this._container;
+                }
+    
+                parent = $( opts.container || document.body );
+                container = $( document.createElement('div') );
+    
+                container.attr( 'id', 'rt_' + this.uid );
+                container.css({
+                    position: 'absolute',
+                    top: '0px',
+                    left: '0px',
+                    width: '1px',
+                    height: '1px',
+                    overflow: 'hidden'
+                });
+    
+                parent.append( container );
+                parent.addClass('webuploader-container');
+                this._container = container;
+                return container;
+            },
+    
+            init: Base.noop,
+            exec: Base.noop,
+    
+            destroy: function() {
+                if ( this._container ) {
+                    this._container.parentNode.removeChild( this.__container );
+                }
+    
+                this.off();
+            }
+        });
+    
+        Runtime.orders = 'html5,flash';
+    
+    
+        /**
+         * 添加Runtime实现。
+         * @param {String} type    类型
+         * @param {Runtime} factory 具体Runtime实现。
+         */
+        Runtime.addRuntime = function( type, factory ) {
+            factories[ type ] = factory;
+        };
+    
+        Runtime.hasRuntime = function( type ) {
+            return !!(type ? factories[ type ] : getFirstKey( factories ));
+        };
+    
+        Runtime.create = function( opts, orders ) {
+            var type, runtime;
+    
+            orders = orders || Runtime.orders;
+            $.each( orders.split( /\s*,\s*/g ), function() {
+                if ( factories[ this ] ) {
+                    type = this;
+                    return false;
+                }
+            });
+    
+            type = type || getFirstKey( factories );
+    
+            if ( !type ) {
+                throw new Error('Runtime Error');
+            }
+    
+            runtime = new factories[ type ]( opts );
+            return runtime;
+        };
+    
+        Mediator.installTo( Runtime.prototype );
+        return Runtime;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/client',[
+        'base',
+        'mediator',
+        'runtime/runtime'
+    ], function( Base, Mediator, Runtime ) {
+    
+        var cache;
+    
+        cache = (function() {
+            var obj = {};
+    
+            return {
+                add: function( runtime ) {
+                    obj[ runtime.uid ] = runtime;
+                },
+    
+                get: function( ruid, standalone ) {
+                    var i;
+    
+                    if ( ruid ) {
+                        return obj[ ruid ];
+                    }
+    
+                    for ( i in obj ) {
+                        // 有些类型不能重用,比如filepicker.
+                        if ( standalone && obj[ i ].__standalone ) {
+                            continue;
+                        }
+    
+                        return obj[ i ];
+                    }
+    
+                    return null;
+                },
+    
+                remove: function( runtime ) {
+                    delete obj[ runtime.uid ];
+                }
+            };
+        })();
+    
+        function RuntimeClient( component, standalone ) {
+            var deferred = Base.Deferred(),
+                runtime;
+    
+            this.uid = Base.guid('client_');
+    
+            // 允许runtime没有初始化之前,注册一些方法在初始化后执行。
+            this.runtimeReady = function( cb ) {
+                return deferred.done( cb );
+            };
+    
+            this.connectRuntime = function( opts, cb ) {
+    
+                // already connected.
+                if ( runtime ) {
+                    throw new Error('already connected!');
+                }
+    
+                deferred.done( cb );
+    
+                if ( typeof opts === 'string' && cache.get( opts ) ) {
+                    runtime = cache.get( opts );
+                }
+    
+                // 像filePicker只能独立存在,不能公用。
+                runtime = runtime || cache.get( null, standalone );
+    
+                // 需要创建
+                if ( !runtime ) {
+                    runtime = Runtime.create( opts, opts.runtimeOrder );
+                    runtime.__promise = deferred.promise();
+                    runtime.once( 'ready', deferred.resolve );
+                    runtime.init();
+                    cache.add( runtime );
+                    runtime.__client = 1;
+                } else {
+                    // 来自cache
+                    Base.$.extend( runtime.options, opts );
+                    runtime.__promise.then( deferred.resolve );
+                    runtime.__client++;
+                }
+    
+                standalone && (runtime.__standalone = standalone);
+                return runtime;
+            };
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.disconnectRuntime = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                runtime.__client--;
+    
+                if ( runtime.__client <= 0 ) {
+                    cache.remove( runtime );
+                    delete runtime.__promise;
+                    runtime.destroy();
+                }
+    
+                runtime = null;
+            };
+    
+            this.exec = function() {
+                if ( !runtime ) {
+                    return;
+                }
+    
+                var args = Base.slice( arguments );
+                component && args.unshift( component );
+    
+                return runtime.exec.apply( this, args );
+            };
+    
+            this.getRuid = function() {
+                return runtime && runtime.uid;
+            };
+    
+            this.destroy = (function( destroy ) {
+                return function() {
+                    destroy && destroy.apply( this, arguments );
+                    this.trigger('destroy');
+                    this.off();
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                };
+            })( this.destroy );
+        }
+    
+        Mediator.installTo( RuntimeClient.prototype );
+        return RuntimeClient;
+    });
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/dnd',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function DragAndDrop( opts ) {
+            opts = this.options = $.extend({}, DragAndDrop.options, opts );
+    
+            opts.container = $( opts.container );
+    
+            if ( !opts.container.length ) {
+                return;
+            }
+    
+            RuntimeClent.call( this, 'DragAndDrop' );
+        }
+    
+        DragAndDrop.options = {
+            accept: null,
+            disableGlobalDnd: false
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: DragAndDrop,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.disconnectRuntime();
+            }
+        });
+    
+        Mediator.installTo( DragAndDrop.prototype );
+    
+        return DragAndDrop;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/widget',[
+        'base',
+        'uploader'
+    ], function( Base, Uploader ) {
+    
+        var $ = Base.$,
+            _init = Uploader.prototype._init,
+            IGNORE = {},
+            widgetClass = [];
+    
+        function isArrayLike( obj ) {
+            if ( !obj ) {
+                return false;
+            }
+    
+            var length = obj.length,
+                type = $.type( obj );
+    
+            if ( obj.nodeType === 1 && length ) {
+                return true;
+            }
+    
+            return type === 'array' || type !== 'function' && type !== 'string' &&
+                    (length === 0 || typeof length === 'number' && length > 0 &&
+                    (length - 1) in obj);
+        }
+    
+        function Widget( uploader ) {
+            this.owner = uploader;
+            this.options = uploader.options;
+        }
+    
+        $.extend( Widget.prototype, {
+    
+            init: Base.noop,
+    
+            // 类Backbone的事件监听声明,监听uploader实例上的事件
+            // widget直接无法监听事件,事件只能通过uploader来传递
+            invoke: function( apiName, args ) {
+    
+                /*
+                    {
+                        'make-thumb': 'makeThumb'
+                    }
+                 */
+                var map = this.responseMap;
+    
+                // 如果无API响应声明则忽略
+                if ( !map || !(apiName in map) || !(map[ apiName ] in this) ||
+                        !$.isFunction( this[ map[ apiName ] ] ) ) {
+    
+                    return IGNORE;
+                }
+    
+                return this[ map[ apiName ] ].apply( this, args );
+    
+            },
+    
+            /**
+             * 发送命令。当传入`callback`或者`handler`中返回`promise`时。返回一个当所有`handler`中的promise都完成后完成的新`promise`。
+             * @method request
+             * @grammar request( command, args ) => * | Promise
+             * @grammar request( command, args, callback ) => Promise
+             * @for  Uploader
+             */
+            request: function() {
+                return this.owner.request.apply( this.owner, arguments );
+            }
+        });
+    
+        // 扩展Uploader.
+        $.extend( Uploader.prototype, {
+    
+            // 覆写_init用来初始化widgets
+            _init: function() {
+                var me = this,
+                    widgets = me._widgets = [];
+    
+                $.each( widgetClass, function( _, klass ) {
+                    widgets.push( new klass( me ) );
+                });
+    
+                return _init.apply( me, arguments );
+            },
+    
+            request: function( apiName, args, callback ) {
+                var i = 0,
+                    widgets = this._widgets,
+                    len = widgets.length,
+                    rlts = [],
+                    dfds = [],
+                    widget, rlt, promise, key;
+    
+                args = isArrayLike( args ) ? args : [ args ];
+    
+                for ( ; i < len; i++ ) {
+                    widget = widgets[ i ];
+                    rlt = widget.invoke( apiName, args );
+    
+                    if ( rlt !== IGNORE ) {
+    
+                        // Deferred对象
+                        if ( Base.isPromise( rlt ) ) {
+                            dfds.push( rlt );
+                        } else {
+                            rlts.push( rlt );
+                        }
+                    }
+                }
+    
+                // 如果有callback,则用异步方式。
+                if ( callback || dfds.length ) {
+                    promise = Base.when.apply( Base, dfds );
+                    key = promise.pipe ? 'pipe' : 'then';
+    
+                    // 很重要不能删除。删除了会死循环。
+                    // 保证执行顺序。让callback总是在下一个tick中执行。
+                    return promise[ key ](function() {
+                                var deferred = Base.Deferred(),
+                                    args = arguments;
+    
+                                setTimeout(function() {
+                                    deferred.resolve.apply( deferred, args );
+                                }, 1 );
+    
+                                return deferred.promise();
+                            })[ key ]( callback || Base.noop );
+                } else {
+                    return rlts[ 0 ];
+                }
+            }
+        });
+    
+        /**
+         * 添加组件
+         * @param  {object} widgetProto 组件原型,构造函数通过constructor属性定义
+         * @param  {object} responseMap API名称与函数实现的映射
+         * @example
+         *     Uploader.register( {
+         *         init: function( options ) {},
+         *         makeThumb: function() {}
+         *     }, {
+         *         'make-thumb': 'makeThumb'
+         *     } );
+         */
+        Uploader.register = Widget.register = function( responseMap, widgetProto ) {
+            var map = { init: 'init' },
+                klass;
+    
+            if ( arguments.length === 1 ) {
+                widgetProto = responseMap;
+                widgetProto.responseMap = map;
+            } else {
+                widgetProto.responseMap = $.extend( map, responseMap );
+            }
+    
+            klass = Base.inherits( Widget, widgetProto );
+            widgetClass.push( klass );
+    
+            return klass;
+        };
+    
+        return Widget;
+    });
+    /**
+     * @fileOverview DragAndDrop Widget。
+     */
+    define('widgets/filednd',[
+        'base',
+        'uploader',
+        'lib/dnd',
+        'widgets/widget'
+    ], function( Base, Uploader, Dnd ) {
+        var $ = Base.$;
+    
+        Uploader.options.dnd = '';
+    
+        /**
+         * @property {Selector} [dnd=undefined]  指定Drag And Drop拖拽的容器,如果不指定,则不启动。
+         * @namespace options
+         * @for Uploader
+         */
+    
+        /**
+         * @event dndAccept
+         * @param {DataTransferItemList} items DataTransferItem
+         * @description 阻止此事件可以拒绝某些类型的文件拖入进来。目前只有 chrome 提供这样的 API,且只能通过 mime-type 验证。
+         * @for  Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.dnd ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        disableGlobalDnd: opts.disableGlobalDnd,
+                        container: opts.dnd,
+                        accept: opts.accept
+                    }),
+                    dnd;
+    
+                dnd = new Dnd( options );
+    
+                dnd.once( 'ready', deferred.resolve );
+                dnd.on( 'drop', function( files ) {
+                    me.request( 'add-file', [ files ]);
+                });
+    
+                // 检测文件是否全部允许添加。
+                dnd.on( 'accept', function( items ) {
+                    return me.owner.trigger( 'dndAccept', items );
+                });
+    
+                dnd.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepaste',[
+        'base',
+        'mediator',
+        'runtime/client'
+    ], function( Base, Mediator, RuntimeClent ) {
+    
+        var $ = Base.$;
+    
+        function FilePaste( opts ) {
+            opts = this.options = $.extend({}, opts );
+            opts.container = $( opts.container || document.body );
+            RuntimeClent.call( this, 'FilePaste' );
+        }
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePaste,
+    
+            init: function() {
+                var me = this;
+    
+                me.connectRuntime( me.options, function() {
+                    me.exec('init');
+                    me.trigger('ready');
+                });
+            },
+    
+            destroy: function() {
+                this.exec('destroy');
+                this.disconnectRuntime();
+                this.off();
+            }
+        });
+    
+        Mediator.installTo( FilePaste.prototype );
+    
+        return FilePaste;
+    });
+    /**
+     * @fileOverview 组件基类。
+     */
+    define('widgets/filepaste',[
+        'base',
+        'uploader',
+        'lib/filepaste',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePaste ) {
+        var $ = Base.$;
+    
+        /**
+         * @property {Selector} [paste=undefined]  指定监听paste事件的容器,如果不指定,不启用此功能。此功能为通过粘贴来添加截屏的图片。建议设置为`document.body`.
+         * @namespace options
+         * @for Uploader
+         */
+        return Uploader.register({
+            init: function( opts ) {
+    
+                if ( !opts.paste ||
+                        this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                var me = this,
+                    deferred = Base.Deferred(),
+                    options = $.extend({}, {
+                        container: opts.paste,
+                        accept: opts.accept
+                    }),
+                    paste;
+    
+                paste = new FilePaste( options );
+    
+                paste.once( 'ready', deferred.resolve );
+                paste.on( 'paste', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                paste.init();
+    
+                return deferred.promise();
+            }
+        });
+    });
+    /**
+     * @fileOverview Blob
+     */
+    define('lib/blob',[
+        'base',
+        'runtime/client'
+    ], function( Base, RuntimeClient ) {
+    
+        function Blob( ruid, source ) {
+            var me = this;
+    
+            me.source = source;
+            me.ruid = ruid;
+    
+            RuntimeClient.call( me, 'Blob' );
+    
+            this.uid = source.uid || this.uid;
+            this.type = source.type || '';
+            this.size = source.size || 0;
+    
+            if ( ruid ) {
+                me.connectRuntime( ruid );
+            }
+        }
+    
+        Base.inherits( RuntimeClient, {
+            constructor: Blob,
+    
+            slice: function( start, end ) {
+                return this.exec( 'slice', start, end );
+            },
+    
+            getSource: function() {
+                return this.source;
+            }
+        });
+    
+        return Blob;
+    });
+    /**
+     * 为了统一化Flash的File和HTML5的File而存在。
+     * 以至于要调用Flash里面的File,也可以像调用HTML5版本的File一下。
+     * @fileOverview File
+     */
+    define('lib/file',[
+        'base',
+        'lib/blob'
+    ], function( Base, Blob ) {
+    
+        var uid = 1,
+            rExt = /\.([^.]+)$/;
+    
+        function File( ruid, file ) {
+            var ext;
+    
+            Blob.apply( this, arguments );
+            this.name = file.name || ('untitled' + uid++);
+            ext = rExt.exec( file.name ) ? RegExp.$1.toLowerCase() : '';
+    
+            // todo 支持其他类型文件的转换。
+    
+            // 如果有mimetype, 但是文件名里面没有找出后缀规律
+            if ( !ext && this.type ) {
+                ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec( this.type ) ?
+                        RegExp.$1.toLowerCase() : '';
+                this.name += '.' + ext;
+            }
+    
+            // 如果没有指定mimetype, 但是知道文件后缀。
+            if ( !this.type &&  ~'jpg,jpeg,png,gif,bmp'.indexOf( ext ) ) {
+                this.type = 'image/' + (ext === 'jpg' ? 'jpeg' : ext);
+            }
+    
+            this.ext = ext;
+            this.lastModifiedDate = file.lastModifiedDate ||
+                    (new Date()).toLocaleString();
+        }
+    
+        return Base.inherits( Blob, File );
+    });
+    
+    /**
+     * @fileOverview 错误信息
+     */
+    define('lib/filepicker',[
+        'base',
+        'runtime/client',
+        'lib/file'
+    ], function( Base, RuntimeClent, File ) {
+    
+        var $ = Base.$;
+    
+        function FilePicker( opts ) {
+            opts = this.options = $.extend({}, FilePicker.options, opts );
+    
+            opts.container = $( opts.id );
+    
+            if ( !opts.container.length ) {
+                throw new Error('按钮指定错误');
+            }
+    
+            opts.innerHTML = opts.innerHTML || opts.label ||
+                    opts.container.html() || '';
+    
+            opts.button = $( opts.button || document.createElement('div') );
+            opts.button.html( opts.innerHTML );
+            opts.container.html( opts.button );
+    
+            RuntimeClent.call( this, 'FilePicker', true );
+        }
+    
+        FilePicker.options = {
+            button: null,
+            container: null,
+            label: null,
+            innerHTML: null,
+            multiple: true,
+            accept: null,
+            name: 'file'
+        };
+    
+        Base.inherits( RuntimeClent, {
+            constructor: FilePicker,
+    
+            init: function() {
+                var me = this,
+                    opts = me.options,
+                    button = opts.button;
+    
+                button.addClass('webuploader-pick');
+    
+                me.on( 'all', function( type ) {
+                    var files;
+    
+                    switch ( type ) {
+                        case 'mouseenter':
+                            button.addClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'mouseleave':
+                            button.removeClass('webuploader-pick-hover');
+                            break;
+    
+                        case 'change':
+                            files = me.exec('getFiles');
+                            me.trigger( 'select', $.map( files, function( file ) {
+                                file = new File( me.getRuid(), file );
+    
+                                // 记录来源。
+                                file._refer = opts.container;
+                                return file;
+                            }), opts.container );
+                            break;
+                    }
+                });
+    
+                me.connectRuntime( opts, function() {
+                    me.refresh();
+                    me.exec( 'init', opts );
+                    me.trigger('ready');
+                });
+    
+                $( window ).on( 'resize', function() {
+                    me.refresh();
+                });
+            },
+    
+            refresh: function() {
+                var shimContainer = this.getRuntime().getContainer(),
+                    button = this.options.button,
+                    width = button.outerWidth ?
+                            button.outerWidth() : button.width(),
+    
+                    height = button.outerHeight ?
+                            button.outerHeight() : button.height(),
+    
+                    pos = button.offset();
+    
+                width && height && shimContainer.css({
+                    bottom: 'auto',
+                    right: 'auto',
+                    width: width + 'px',
+                    height: height + 'px'
+                }).offset( pos );
+            },
+    
+            enable: function() {
+                var btn = this.options.button;
+    
+                btn.removeClass('webuploader-pick-disable');
+                this.refresh();
+            },
+    
+            disable: function() {
+                var btn = this.options.button;
+    
+                this.getRuntime().getContainer().css({
+                    top: '-99999px'
+                });
+    
+                btn.addClass('webuploader-pick-disable');
+            },
+    
+            destroy: function() {
+                if ( this.runtime ) {
+                    this.exec('destroy');
+                    this.disconnectRuntime();
+                }
+            }
+        });
+    
+        return FilePicker;
+    });
+    
+    /**
+     * @fileOverview 文件选择相关
+     */
+    define('widgets/filepicker',[
+        'base',
+        'uploader',
+        'lib/filepicker',
+        'widgets/widget'
+    ], function( Base, Uploader, FilePicker ) {
+        var $ = Base.$;
+    
+        $.extend( Uploader.options, {
+    
+            /**
+             * @property {Selector | Object} [pick=undefined]
+             * @namespace options
+             * @for Uploader
+             * @description 指定选择文件的按钮容器,不指定则不创建按钮。
+             *
+             * * `id` {Seletor} 指定选择文件的按钮容器,不指定则不创建按钮。
+             * * `label` {String} 请采用 `innerHTML` 代替
+             * * `innerHTML` {String} 指定按钮文字。不指定时优先从指定的容器中看是否自带文字。
+             * * `multiple` {Boolean} 是否开起同时选择多个文件能力。
+             */
+            pick: null,
+    
+            /**
+             * @property {Arroy} [accept=null]
+             * @namespace options
+             * @for Uploader
+             * @description 指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
+             *
+             * * `title` {String} 文字描述
+             * * `extensions` {String} 允许的文件后缀,不带点,多个用逗号分割。
+             * * `mimeTypes` {String} 多个用逗号分割。
+             *
+             * 如:
+             *
+             * ```
+             * {
+             *     title: 'Images',
+             *     extensions: 'gif,jpg,jpeg,bmp,png',
+             *     mimeTypes: 'image/*'
+             * }
+             * ```
+             */
+            accept: null/*{
+                title: 'Images',
+                extensions: 'gif,jpg,jpeg,bmp,png',
+                mimeTypes: 'image/*'
+            }*/
+        });
+    
+        return Uploader.register({
+            'add-btn': 'addButton',
+            refresh: 'refresh',
+            disable: 'disable',
+            enable: 'enable'
+        }, {
+    
+            init: function( opts ) {
+                this.pickers = [];
+                return opts.pick && this.addButton( opts.pick );
+            },
+    
+            refresh: function() {
+                $.each( this.pickers, function() {
+                    this.refresh();
+                });
+            },
+    
+            /**
+             * @method addButton
+             * @for Uploader
+             * @grammar addButton( pick ) => Promise
+             * @description
+             * 添加文件选择按钮,如果一个按钮不够,需要调用此方法来添加。参数跟[options.pick](#WebUploader:Uploader:options)一致。
+             * @example
+             * uploader.addButton({
+             *     id: '#btnContainer',
+             *     innerHTML: '选择文件'
+             * });
+             */
+            addButton: function( pick ) {
+                var me = this,
+                    opts = me.options,
+                    accept = opts.accept,
+                    options, picker, deferred;
+    
+                if ( !pick ) {
+                    return;
+                }
+    
+                deferred = Base.Deferred();
+                $.isPlainObject( pick ) || (pick = {
+                    id: pick
+                });
+    
+                options = $.extend({}, pick, {
+                    accept: $.isPlainObject( accept ) ? [ accept ] : accept,
+                    swf: opts.swf,
+                    runtimeOrder: opts.runtimeOrder
+                });
+    
+                picker = new FilePicker( options );
+    
+                picker.once( 'ready', deferred.resolve );
+                picker.on( 'select', function( files ) {
+                    me.owner.request( 'add-file', [ files ]);
+                });
+                picker.init();
+    
+                this.pickers.push( picker );
+    
+                return deferred.promise();
+            },
+    
+            disable: function() {
+                $.each( this.pickers, function() {
+                    this.disable();
+                });
+            },
+    
+            enable: function() {
+                $.each( this.pickers, function() {
+                    this.enable();
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview 文件属性封装
+     */
+    define('file',[
+        'base',
+        'mediator'
+    ], function( Base, Mediator ) {
+    
+        var $ = Base.$,
+            idPrefix = 'WU_FILE_',
+            idSuffix = 0,
+            rExt = /\.([^.]+)$/,
+            statusMap = {};
+    
+        function gid() {
+            return idPrefix + idSuffix++;
+        }
+    
+        /**
+         * 文件类
+         * @class File
+         * @constructor 构造函数
+         * @grammar new File( source ) => File
+         * @param {Lib.File} source [lib.File](#Lib.File)实例, 此source对象是带有Runtime信息的。
+         */
+        function WUFile( source ) {
+    
+            /**
+             * 文件名,包括扩展名(后缀)
+             * @property name
+             * @type {string}
+             */
+            this.name = source.name || 'Untitled';
+    
+            /**
+             * 文件体积(字节)
+             * @property size
+             * @type {uint}
+             * @default 0
+             */
+            this.size = source.size || 0;
+    
+            /**
+             * 文件MIMETYPE类型,与文件类型的对应关系请参考[http://t.cn/z8ZnFny](http://t.cn/z8ZnFny)
+             * @property type
+             * @type {string}
+             * @default 'application'
+             */
+            this.type = source.type || 'application';
+    
+            /**
+             * 文件最后修改日期
+             * @property lastModifiedDate
+             * @type {int}
+             * @default 当前时间戳
+             */
+            this.lastModifiedDate = source.lastModifiedDate || (new Date() * 1);
+    
+            /**
+             * 文件ID,每个对象具有唯一ID,与文件名无关
+             * @property id
+             * @type {string}
+             */
+            this.id = gid();
+    
+            /**
+             * 文件扩展名,通过文件名获取,例如test.png的扩展名为png
+             * @property ext
+             * @type {string}
+             */
+            this.ext = rExt.exec( this.name ) ? RegExp.$1 : '';
+    
+    
+            /**
+             * 状态文字说明。在不同的status语境下有不同的用途。
+             * @property statusText
+             * @type {string}
+             */
+            this.statusText = '';
+    
+            // 存储文件状态,防止通过属性直接修改
+            statusMap[ this.id ] = WUFile.Status.INITED;
+    
+            this.source = source;
+            this.loaded = 0;
+    
+            this.on( 'error', function( msg ) {
+                this.setStatus( WUFile.Status.ERROR, msg );
+            });
+        }
+    
+        $.extend( WUFile.prototype, {
+    
+            /**
+             * 设置状态,状态变化时会触发`change`事件。
+             * @method setStatus
+             * @grammar setStatus( status[, statusText] );
+             * @param {File.Status|String} status [文件状态值](#WebUploader:File:File.Status)
+             * @param {String} [statusText=''] 状态说明,常在error时使用,用http, abort,server等来标记是由于什么原因导致文件错误。
+             */
+            setStatus: function( status, text ) {
+    
+                var prevStatus = statusMap[ this.id ];
+    
+                typeof text !== 'undefined' && (this.statusText = text);
+    
+                if ( status !== prevStatus ) {
+                    statusMap[ this.id ] = status;
+                    /**
+                     * 文件状态变化
+                     * @event statuschange
+                     */
+                    this.trigger( 'statuschange', status, prevStatus );
+                }
+    
+            },
+    
+            /**
+             * 获取文件状态
+             * @return {File.Status}
+             * @example
+                     文件状态具体包括以下几种类型:
+                     {
+                         // 初始化
+                        INITED:     0,
+                        // 已入队列
+                        QUEUED:     1,
+                        // 正在上传
+                        PROGRESS:     2,
+                        // 上传出错
+                        ERROR:         3,
+                        // 上传成功
+                        COMPLETE:     4,
+                        // 上传取消
+                        CANCELLED:     5
+                    }
+             */
+            getStatus: function() {
+                return statusMap[ this.id ];
+            },
+    
+            /**
+             * 获取文件原始信息。
+             * @return {*}
+             */
+            getSource: function() {
+                return this.source;
+            },
+    
+            destory: function() {
+                delete statusMap[ this.id ];
+            }
+        });
+    
+        Mediator.installTo( WUFile.prototype );
+    
+        /**
+         * 文件状态值,具体包括以下几种类型:
+         * * `inited` 初始状态
+         * * `queued` 已经进入队列, 等待上传
+         * * `progress` 上传中
+         * * `complete` 上传完成。
+         * * `error` 上传出错,可重试
+         * * `interrupt` 上传中断,可续传。
+         * * `invalid` 文件不合格,不能重试上传。会自动从队列中移除。
+         * * `cancelled` 文件被移除。
+         * @property {Object} Status
+         * @namespace File
+         * @class File
+         * @static
+         */
+        WUFile.Status = {
+            INITED:     'inited',    // 初始状态
+            QUEUED:     'queued',    // 已经进入队列, 等待上传
+            PROGRESS:   'progress',    // 上传中
+            ERROR:      'error',    // 上传出错,可重试
+            COMPLETE:   'complete',    // 上传完成。
+            CANCELLED:  'cancelled',    // 上传取消。
+            INTERRUPT:  'interrupt',    // 上传中断,可续传。
+            INVALID:    'invalid'    // 文件不合格,不能重试上传。
+        };
+    
+        return WUFile;
+    });
+    
+    /**
+     * @fileOverview 文件队列
+     */
+    define('queue',[
+        'base',
+        'mediator',
+        'file'
+    ], function( Base, Mediator, WUFile ) {
+    
+        var $ = Base.$,
+            STATUS = WUFile.Status;
+    
+        /**
+         * 文件队列, 用来存储各个状态中的文件。
+         * @class Queue
+         * @extends Mediator
+         */
+        function Queue() {
+    
+            /**
+             * 统计文件数。
+             * * `numOfQueue` 队列中的文件数。
+             * * `numOfSuccess` 上传成功的文件数
+             * * `numOfCancel` 被移除的文件数
+             * * `numOfProgress` 正在上传中的文件数
+             * * `numOfUploadFailed` 上传错误的文件数。
+             * * `numOfInvalid` 无效的文件数。
+             * @property {Object} stats
+             */
+            this.stats = {
+                numOfQueue: 0,
+                numOfSuccess: 0,
+                numOfCancel: 0,
+                numOfProgress: 0,
+                numOfUploadFailed: 0,
+                numOfInvalid: 0
+            };
+    
+            // 上传队列,仅包括等待上传的文件
+            this._queue = [];
+    
+            // 存储所有文件
+            this._map = {};
+        }
+    
+        $.extend( Queue.prototype, {
+    
+            /**
+             * 将新文件加入对队列尾部
+             *
+             * @method append
+             * @param  {File} file   文件对象
+             */
+            append: function( file ) {
+                this._queue.push( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 将新文件加入对队列头部
+             *
+             * @method prepend
+             * @param  {File} file   文件对象
+             */
+            prepend: function( file ) {
+                this._queue.unshift( file );
+                this._fileAdded( file );
+                return this;
+            },
+    
+            /**
+             * 获取文件对象
+             *
+             * @method getFile
+             * @param  {String} fileId   文件ID
+             * @return {File}
+             */
+            getFile: function( fileId ) {
+                if ( typeof fileId !== 'string' ) {
+                    return fileId;
+                }
+                return this._map[ fileId ];
+            },
+    
+            /**
+             * 从队列中取出一个指定状态的文件。
+             * @grammar fetch( status ) => File
+             * @method fetch
+             * @param {String} status [文件状态值](#WebUploader:File:File.Status)
+             * @return {File} [File](#WebUploader:File)
+             */
+            fetch: function( status ) {
+                var len = this._queue.length,
+                    i, file;
+    
+                status = status || STATUS.QUEUED;
+    
+                for ( i = 0; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( status === file.getStatus() ) {
+                        return file;
+                    }
+                }
+    
+                return null;
+            },
+    
+            /**
+             * 对队列进行排序,能够控制文件上传顺序。
+             * @grammar sort( fn ) => undefined
+             * @method sort
+             * @param {Function} fn 排序方法
+             */
+            sort: function( fn ) {
+                if ( typeof fn === 'function' ) {
+                    this._queue.sort( fn );
+                }
+            },
+    
+            /**
+             * 获取指定类型的文件列表, 列表中每一个成员为[File](#WebUploader:File)对象。
+             * @grammar getFiles( [status1[, status2 ...]] ) => Array
+             * @method getFiles
+             * @param {String} [status] [文件状态值](#WebUploader:File:File.Status)
+             */
+            getFiles: function() {
+                var sts = [].slice.call( arguments, 0 ),
+                    ret = [],
+                    i = 0,
+                    len = this._queue.length,
+                    file;
+    
+                for ( ; i < len; i++ ) {
+                    file = this._queue[ i ];
+    
+                    if ( sts.length && !~$.inArray( file.getStatus(), sts ) ) {
+                        continue;
+                    }
+    
+                    ret.push( file );
+                }
+    
+                return ret;
+            },
+    
+            _fileAdded: function( file ) {
+                var me = this,
+                    existing = this._map[ file.id ];
+    
+                if ( !existing ) {
+                    this._map[ file.id ] = file;
+    
+                    file.on( 'statuschange', function( cur, pre ) {
+                        me._onFileStatusChange( cur, pre );
+                    });
+                }
+    
+                file.setStatus( STATUS.QUEUED );
+            },
+    
+            _onFileStatusChange: function( curStatus, preStatus ) {
+                var stats = this.stats;
+    
+                switch ( preStatus ) {
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress--;
+                        break;
+    
+                    case STATUS.QUEUED:
+                        stats.numOfQueue --;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed--;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid--;
+                        break;
+                }
+    
+                switch ( curStatus ) {
+                    case STATUS.QUEUED:
+                        stats.numOfQueue++;
+                        break;
+    
+                    case STATUS.PROGRESS:
+                        stats.numOfProgress++;
+                        break;
+    
+                    case STATUS.ERROR:
+                        stats.numOfUploadFailed++;
+                        break;
+    
+                    case STATUS.COMPLETE:
+                        stats.numOfSuccess++;
+                        break;
+    
+                    case STATUS.CANCELLED:
+                        stats.numOfCancel++;
+                        break;
+    
+                    case STATUS.INVALID:
+                        stats.numOfInvalid++;
+                        break;
+                }
+            }
+    
+        });
+    
+        Mediator.installTo( Queue.prototype );
+    
+        return Queue;
+    });
+    /**
+     * @fileOverview 队列
+     */
+    define('widgets/queue',[
+        'base',
+        'uploader',
+        'queue',
+        'file',
+        'lib/file',
+        'runtime/client',
+        'widgets/widget'
+    ], function( Base, Uploader, Queue, WUFile, File, RuntimeClient ) {
+    
+        var $ = Base.$,
+            rExt = /\.\w+$/,
+            Status = WUFile.Status;
+    
+        return Uploader.register({
+            'sort-files': 'sortFiles',
+            'add-file': 'addFiles',
+            'get-file': 'getFile',
+            'fetch-file': 'fetchFile',
+            'get-stats': 'getStats',
+            'get-files': 'getFiles',
+            'remove-file': 'removeFile',
+            'retry': 'retry',
+            'reset': 'reset',
+            'accept-file': 'acceptFile'
+        }, {
+    
+            init: function( opts ) {
+                var me = this,
+                    deferred, len, i, item, arr, accept, runtime;
+    
+                if ( $.isPlainObject( opts.accept ) ) {
+                    opts.accept = [ opts.accept ];
+                }
+    
+                // accept中的中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].extensions;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = '\\.' + arr.join(',')
+                                .replace( /,/g, '$|\\.' )
+                                .replace( /\*/g, '.*' ) + '$';
+                    }
+    
+                    me.accept = new RegExp( accept, 'i' );
+                }
+    
+                me.queue = new Queue();
+                me.stats = me.queue.stats;
+    
+                // 如果当前不是html5运行时,那就算了。
+                // 不执行后续操作
+                if ( this.request('predict-runtime-type') !== 'html5' ) {
+                    return;
+                }
+    
+                // 创建一个 html5 运行时的 placeholder
+                // 以至于外部添加原生 File 对象的时候能正确包裹一下供 webuploader 使用。
+                deferred = Base.Deferred();
+                runtime = new RuntimeClient('Placeholder');
+                runtime.connectRuntime({
+                    runtimeOrder: 'html5'
+                }, function() {
+                    me._ruid = runtime.getRuid();
+                    deferred.resolve();
+                });
+                return deferred.promise();
+            },
+    
+    
+            // 为了支持外部直接添加一个原生File对象。
+            _wrapFile: function( file ) {
+                if ( !(file instanceof WUFile) ) {
+    
+                    if ( !(file instanceof File) ) {
+                        if ( !this._ruid ) {
+                            throw new Error('Can\'t add external files.');
+                        }
+                        file = new File( this._ruid, file );
+                    }
+    
+                    file = new WUFile( file );
+                }
+    
+                return file;
+            },
+    
+            // 判断文件是否可以被加入队列
+            acceptFile: function( file ) {
+                var invalid = !file || file.size < 6 || this.accept &&
+    
+                        // 如果名字中有后缀,才做后缀白名单处理。
+                        rExt.exec( file.name ) && !this.accept.test( file.name );
+    
+                return !invalid;
+            },
+    
+    
+            /**
+             * @event beforeFileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列之前触发,此事件的handler返回值为`false`,则此文件不会被添加进入队列。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event fileQueued
+             * @param {File} file File对象
+             * @description 当文件被加入队列以后触发。
+             * @for  Uploader
+             */
+    
+            _addFile: function( file ) {
+                var me = this;
+    
+                file = me._wrapFile( file );
+    
+                // 不过类型判断允许不允许,先派送 `beforeFileQueued`
+                if ( !me.owner.trigger( 'beforeFileQueued', file ) ) {
+                    return;
+                }
+    
+                // 类型不匹配,则派送错误事件,并返回。
+                if ( !me.acceptFile( file ) ) {
+                    me.owner.trigger( 'error', 'Q_TYPE_DENIED', file );
+                    return;
+                }
+    
+                me.queue.append( file );
+                me.owner.trigger( 'fileQueued', file );
+                return file;
+            },
+    
+            getFile: function( fileId ) {
+                return this.queue.getFile( fileId );
+            },
+    
+            /**
+             * @event filesQueued
+             * @param {File} files 数组,内容为原始File(lib/File)对象。
+             * @description 当一批文件添加进队列以后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method addFiles
+             * @grammar addFiles( file ) => undefined
+             * @grammar addFiles( [file1, file2 ...] ) => undefined
+             * @param {Array of File or File} [files] Files 对象 数组
+             * @description 添加文件到队列
+             * @for  Uploader
+             */
+            addFiles: function( files ) {
+                var me = this;
+    
+                if ( !files.length ) {
+                    files = [ files ];
+                }
+    
+                files = $.map( files, function( file ) {
+                    return me._addFile( file );
+                });
+    
+                me.owner.trigger( 'filesQueued', files );
+    
+                if ( me.options.auto ) {
+                    me.request('start-upload');
+                }
+            },
+    
+            getStats: function() {
+                return this.stats;
+            },
+    
+            /**
+             * @event fileDequeued
+             * @param {File} file File对象
+             * @description 当文件被移除队列后触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @method removeFile
+             * @grammar removeFile( file ) => undefined
+             * @grammar removeFile( id ) => undefined
+             * @param {File|id} file File对象或这File对象的id
+             * @description 移除某一文件。
+             * @for  Uploader
+             * @example
+             *
+             * $li.on('click', '.remove-this', function() {
+             *     uploader.removeFile( file );
+             * })
+             */
+            removeFile: function( file ) {
+                var me = this;
+    
+                file = file.id ? file : me.queue.getFile( file );
+    
+                file.setStatus( Status.CANCELLED );
+                me.owner.trigger( 'fileDequeued', file );
+            },
+    
+            /**
+             * @method getFiles
+             * @grammar getFiles() => Array
+             * @grammar getFiles( status1, status2, status... ) => Array
+             * @description 返回指定状态的文件集合,不传参数将返回所有状态的文件。
+             * @for  Uploader
+             * @example
+             * console.log( uploader.getFiles() );    // => all files
+             * console.log( uploader.getFiles('error') )    // => all error files.
+             */
+            getFiles: function() {
+                return this.queue.getFiles.apply( this.queue, arguments );
+            },
+    
+            fetchFile: function() {
+                return this.queue.fetch.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method retry
+             * @grammar retry() => undefined
+             * @grammar retry( file ) => undefined
+             * @description 重试上传,重试指定文件,或者从出错的文件开始重新上传。
+             * @for  Uploader
+             * @example
+             * function retry() {
+             *     uploader.retry();
+             * }
+             */
+            retry: function( file, noForceStart ) {
+                var me = this,
+                    files, i, len;
+    
+                if ( file ) {
+                    file = file.id ? file : me.queue.getFile( file );
+                    file.setStatus( Status.QUEUED );
+                    noForceStart || me.request('start-upload');
+                    return;
+                }
+    
+                files = me.queue.getFiles( Status.ERROR );
+                i = 0;
+                len = files.length;
+    
+                for ( ; i < len; i++ ) {
+                    file = files[ i ];
+                    file.setStatus( Status.QUEUED );
+                }
+    
+                me.request('start-upload');
+            },
+    
+            /**
+             * @method sort
+             * @grammar sort( fn ) => undefined
+             * @description 排序队列中的文件,在上传之前调整可以控制上传顺序。
+             * @for  Uploader
+             */
+            sortFiles: function() {
+                return this.queue.sort.apply( this.queue, arguments );
+            },
+    
+            /**
+             * @method reset
+             * @grammar reset() => undefined
+             * @description 重置uploader。目前只重置了队列。
+             * @for  Uploader
+             * @example
+             * uploader.reset();
+             */
+            reset: function() {
+                this.queue = new Queue();
+                this.stats = this.queue.stats;
+            }
+        });
+    
+    });
+    /**
+     * @fileOverview 添加获取Runtime相关信息的方法。
+     */
+    define('widgets/runtime',[
+        'uploader',
+        'runtime/runtime',
+        'widgets/widget'
+    ], function( Uploader, Runtime ) {
+    
+        Uploader.support = function() {
+            return Runtime.hasRuntime.apply( Runtime, arguments );
+        };
+    
+        return Uploader.register({
+            'predict-runtime-type': 'predictRuntmeType'
+        }, {
+    
+            init: function() {
+                if ( !this.predictRuntmeType() ) {
+                    throw Error('Runtime Error');
+                }
+            },
+    
+            /**
+             * 预测Uploader将采用哪个`Runtime`
+             * @grammar predictRuntmeType() => String
+             * @method predictRuntmeType
+             * @for  Uploader
+             */
+            predictRuntmeType: function() {
+                var orders = this.options.runtimeOrder || Runtime.orders,
+                    type = this.type,
+                    i, len;
+    
+                if ( !type ) {
+                    orders = orders.split( /\s*,\s*/g );
+    
+                    for ( i = 0, len = orders.length; i < len; i++ ) {
+                        if ( Runtime.hasRuntime( orders[ i ] ) ) {
+                            this.type = type = orders[ i ];
+                            break;
+                        }
+                    }
+                }
+    
+                return type;
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     */
+    define('lib/transport',[
+        'base',
+        'runtime/client',
+        'mediator'
+    ], function( Base, RuntimeClient, Mediator ) {
+    
+        var $ = Base.$;
+    
+        function Transport( opts ) {
+            var me = this;
+    
+            opts = me.options = $.extend( true, {}, Transport.options, opts || {} );
+            RuntimeClient.call( this, 'Transport' );
+    
+            this._blob = null;
+            this._formData = opts.formData || {};
+            this._headers = opts.headers || {};
+    
+            this.on( 'progress', this._timeout );
+            this.on( 'load error', function() {
+                me.trigger( 'progress', 1 );
+                clearTimeout( me._timer );
+            });
+        }
+    
+        Transport.options = {
+            server: '',
+            method: 'POST',
+    
+            // 跨域时,是否允许携带cookie, 只有html5 runtime才有效
+            withCredentials: false,
+            fileVal: 'file',
+            timeout: 2 * 60 * 1000,    // 2分钟
+            formData: {},
+            headers: {},
+            sendAsBinary: false
+        };
+    
+        $.extend( Transport.prototype, {
+    
+            // 添加Blob, 只能添加一次,最后一次有效。
+            appendBlob: function( key, blob, filename ) {
+                var me = this,
+                    opts = me.options;
+    
+                if ( me.getRuid() ) {
+                    me.disconnectRuntime();
+                }
+    
+                // 连接到blob归属的同一个runtime.
+                me.connectRuntime( blob.ruid, function() {
+                    me.exec('init');
+                });
+    
+                me._blob = blob;
+                opts.fileVal = key || opts.fileVal;
+                opts.filename = filename || opts.filename;
+            },
+    
+            // 添加其他字段
+            append: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._formData, key );
+                } else {
+                    this._formData[ key ] = value;
+                }
+            },
+    
+            setRequestHeader: function( key, value ) {
+                if ( typeof key === 'object' ) {
+                    $.extend( this._headers, key );
+                } else {
+                    this._headers[ key ] = value;
+                }
+            },
+    
+            send: function( method ) {
+                this.exec( 'send', method );
+                this._timeout();
+            },
+    
+            abort: function() {
+                clearTimeout( this._timer );
+                return this.exec('abort');
+            },
+    
+            destroy: function() {
+                this.trigger('destroy');
+                this.off();
+                this.exec('destroy');
+                this.disconnectRuntime();
+            },
+    
+            getResponse: function() {
+                return this.exec('getResponse');
+            },
+    
+            getResponseAsJson: function() {
+                return this.exec('getResponseAsJson');
+            },
+    
+            getStatus: function() {
+                return this.exec('getStatus');
+            },
+    
+            _timeout: function() {
+                var me = this,
+                    duration = me.options.timeout;
+    
+                if ( !duration ) {
+                    return;
+                }
+    
+                clearTimeout( me._timer );
+                me._timer = setTimeout(function() {
+                    me.abort();
+                    me.trigger( 'error', 'timeout' );
+                }, duration );
+            }
+    
+        });
+    
+        // 让Transport具备事件功能。
+        Mediator.installTo( Transport.prototype );
+    
+        return Transport;
+    });
+    /**
+     * @fileOverview 负责文件上传相关。
+     */
+    define('widgets/upload',[
+        'base',
+        'uploader',
+        'file',
+        'lib/transport',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile, Transport ) {
+    
+        var $ = Base.$,
+            isPromise = Base.isPromise,
+            Status = WUFile.Status;
+    
+        // 添加默认配置项
+        $.extend( Uploader.options, {
+    
+    
+            /**
+             * @property {Boolean} [prepareNextFile=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否允许在文件传输时提前把下一个文件准备好。
+             * 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。
+             * 如果能提前在当前文件传输期处理,可以节省总体耗时。
+             */
+            prepareNextFile: false,
+    
+            /**
+             * @property {Boolean} [chunked=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否要分片处理大文件上传。
+             */
+            chunked: false,
+    
+            /**
+             * @property {Boolean} [chunkSize=5242880]
+             * @namespace options
+             * @for Uploader
+             * @description 如果要分片,分多大一片? 默认大小为5M.
+             */
+            chunkSize: 5 * 1024 * 1024,
+    
+            /**
+             * @property {Boolean} [chunkRetry=2]
+             * @namespace options
+             * @for Uploader
+             * @description 如果某个分片由于网络问题出错,允许自动重传多少次?
+             */
+            chunkRetry: 2,
+    
+            /**
+             * @property {Boolean} [threads=3]
+             * @namespace options
+             * @for Uploader
+             * @description 上传并发数。允许同时最大上传进程数。
+             */
+            threads: 3,
+    
+    
+            /**
+             * @property {Object} [formData]
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传请求的参数表,每次发送都会发送此对象中的参数。
+             */
+            formData: null
+    
+            /**
+             * @property {Object} [fileVal='file']
+             * @namespace options
+             * @for Uploader
+             * @description 设置文件上传域的name。
+             */
+    
+            /**
+             * @property {Object} [method='POST']
+             * @namespace options
+             * @for Uploader
+             * @description 文件上传方式,`POST`或者`GET`。
+             */
+    
+            /**
+             * @property {Object} [sendAsBinary=false]
+             * @namespace options
+             * @for Uploader
+             * @description 是否已二进制的流的方式发送文件,这样整个上传内容`php://input`都为文件内容,
+             * 其他参数在$_GET数组中。
+             */
+        });
+    
+        // 负责将文件切片。
+        function CuteFile( file, chunkSize ) {
+            var pending = [],
+                blob = file.source,
+                total = blob.size,
+                chunks = chunkSize ? Math.ceil( total / chunkSize ) : 1,
+                start = 0,
+                index = 0,
+                len;
+    
+            while ( index < chunks ) {
+                len = Math.min( chunkSize, total - start );
+    
+                pending.push({
+                    file: file,
+                    start: start,
+                    end: chunkSize ? (start + len) : total,
+                    total: total,
+                    chunks: chunks,
+                    chunk: index++
+                });
+                start += len;
+            }
+    
+            file.blocks = pending.concat();
+            file.remaning = pending.length;
+    
+            return {
+                file: file,
+    
+                has: function() {
+                    return !!pending.length;
+                },
+    
+                fetch: function() {
+                    return pending.shift();
+                }
+            };
+        }
+    
+        Uploader.register({
+            'start-upload': 'start',
+            'stop-upload': 'stop',
+            'skip-file': 'skipFile',
+            'is-in-progress': 'isInProgress'
+        }, {
+    
+            init: function() {
+                var owner = this.owner;
+    
+                this.runing = false;
+    
+                // 记录当前正在传的数据,跟threads相关
+                this.pool = [];
+    
+                // 缓存即将上传的文件。
+                this.pending = [];
+    
+                // 跟踪还有多少分片没有完成上传。
+                this.remaning = 0;
+                this.__tick = Base.bindFn( this._tick, this );
+    
+                owner.on( 'uploadComplete', function( file ) {
+                    // 把其他块取消了。
+                    file.blocks && $.each( file.blocks, function( _, v ) {
+                        v.transport && (v.transport.abort(), v.transport.destroy());
+                        delete v.transport;
+                    });
+    
+                    delete file.blocks;
+                    delete file.remaning;
+                });
+            },
+    
+            /**
+             * @event startUpload
+             * @description 当开始上传流程时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 开始上传。此方法可以从初始状态调用开始上传流程,也可以从暂停状态调用,继续上传流程。
+             * @grammar upload() => undefined
+             * @method upload
+             * @for  Uploader
+             */
+            start: function() {
+                var me = this;
+    
+                // 移出invalid的文件
+                $.each( me.request( 'get-files', Status.INVALID ), function() {
+                    me.request( 'remove-file', this );
+                });
+    
+                if ( me.runing ) {
+                    return;
+                }
+    
+                me.runing = true;
+    
+                // 如果有暂停的,则续传
+                $.each( me.pool, function( _, v ) {
+                    var file = v.file;
+    
+                    if ( file.getStatus() === Status.INTERRUPT ) {
+                        file.setStatus( Status.PROGRESS );
+                        me._trigged = false;
+                        v.transport && v.transport.send();
+                    }
+                });
+    
+                me._trigged = false;
+                me.owner.trigger('startUpload');
+                Base.nextTick( me.__tick );
+            },
+    
+            /**
+             * @event stopUpload
+             * @description 当开始上传流程暂停时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * 暂停上传。第一个参数为是否中断上传当前正在上传的文件。
+             * @grammar stop() => undefined
+             * @grammar stop( true ) => undefined
+             * @method stop
+             * @for  Uploader
+             */
+            stop: function( interrupt ) {
+                var me = this;
+    
+                if ( me.runing === false ) {
+                    return;
+                }
+    
+                me.runing = false;
+    
+                interrupt && $.each( me.pool, function( _, v ) {
+                    v.transport && v.transport.abort();
+                    v.file.setStatus( Status.INTERRUPT );
+                });
+    
+                me.owner.trigger('stopUpload');
+            },
+    
+            /**
+             * 判断`Uplaode`r是否正在上传中。
+             * @grammar isInProgress() => Boolean
+             * @method isInProgress
+             * @for  Uploader
+             */
+            isInProgress: function() {
+                return !!this.runing;
+            },
+    
+            getStats: function() {
+                return this.request('get-stats');
+            },
+    
+            /**
+             * 掉过一个文件上传,直接标记指定文件为已上传状态。
+             * @grammar skipFile( file ) => undefined
+             * @method skipFile
+             * @for  Uploader
+             */
+            skipFile: function( file, status ) {
+                file = this.request( 'get-file', file );
+    
+                file.setStatus( status || Status.COMPLETE );
+                file.skipped = true;
+    
+                // 如果正在上传。
+                file.blocks && $.each( file.blocks, function( _, v ) {
+                    var _tr = v.transport;
+    
+                    if ( _tr ) {
+                        _tr.abort();
+                        _tr.destroy();
+                        delete v.transport;
+                    }
+                });
+    
+                this.owner.trigger( 'uploadSkip', file );
+            },
+    
+            /**
+             * @event uploadFinished
+             * @description 当所有文件上传结束时触发。
+             * @for  Uploader
+             */
+            _tick: function() {
+                var me = this,
+                    opts = me.options,
+                    fn, val;
+    
+                // 上一个promise还没有结束,则等待完成后再执行。
+                if ( me._promise ) {
+                    return me._promise.always( me.__tick );
+                }
+    
+                // 还有位置,且还有文件要处理的话。
+                if ( me.pool.length < opts.threads && (val = me._nextBlock()) ) {
+                    me._trigged = false;
+    
+                    fn = function( val ) {
+                        me._promise = null;
+    
+                        // 有可能是reject过来的,所以要检测val的类型。
+                        val && val.file && me._startSend( val );
+                        Base.nextTick( me.__tick );
+                    };
+    
+                    me._promise = isPromise( val ) ? val.always( fn ) : fn( val );
+    
+                // 没有要上传的了,且没有正在传输的了。
+                } else if ( !me.remaning && !me.getStats().numOfQueue ) {
+                    me.runing = false;
+    
+                    me._trigged || Base.nextTick(function() {
+                        me.owner.trigger('uploadFinished');
+                    });
+                    me._trigged = true;
+                }
+            },
+    
+            _nextBlock: function() {
+                var me = this,
+                    act = me._act,
+                    opts = me.options,
+                    next, done;
+    
+                // 如果当前文件还有没有需要传输的,则直接返回剩下的。
+                if ( act && act.has() &&
+                        act.file.getStatus() === Status.PROGRESS ) {
+    
+                    // 是否提前准备下一个文件
+                    if ( opts.prepareNextFile && !me.pending.length ) {
+                        me._prepareNextFile();
+                    }
+    
+                    return act.fetch();
+    
+                // 否则,如果正在运行,则准备下一个文件,并等待完成后返回下个分片。
+                } else if ( me.runing ) {
+    
+                    // 如果缓存中有,则直接在缓存中取,没有则去queue中取。
+                    if ( !me.pending.length && me.getStats().numOfQueue ) {
+                        me._prepareNextFile();
+                    }
+    
+                    next = me.pending.shift();
+                    done = function( file ) {
+                        if ( !file ) {
+                            return null;
+                        }
+    
+                        act = CuteFile( file, opts.chunked ? opts.chunkSize : 0 );
+                        me._act = act;
+                        return act.fetch();
+                    };
+    
+                    // 文件可能还在prepare中,也有可能已经完全准备好了。
+                    return isPromise( next ) ?
+                            next[ next.pipe ? 'pipe' : 'then']( done ) :
+                            done( next );
+                }
+            },
+    
+    
+            /**
+             * @event uploadStart
+             * @param {File} file File对象
+             * @description 某个文件开始上传前触发,一个文件只会触发一次。
+             * @for  Uploader
+             */
+            _prepareNextFile: function() {
+                var me = this,
+                    file = me.request('fetch-file'),
+                    pending = me.pending,
+                    promise;
+    
+                if ( file ) {
+                    promise = me.request( 'before-send-file', file, function() {
+    
+                        // 有可能文件被skip掉了。文件被skip掉后,状态坑定不是Queued.
+                        if ( file.getStatus() === Status.QUEUED ) {
+                            me.owner.trigger( 'uploadStart', file );
+                            file.setStatus( Status.PROGRESS );
+                            return file;
+                        }
+    
+                        return me._finishFile( file );
+                    });
+    
+                    // 如果还在pending中,则替换成文件本身。
+                    promise.done(function() {
+                        var idx = $.inArray( promise, pending );
+    
+                        ~idx && pending.splice( idx, 1, file );
+                    });
+    
+                    // befeore-send-file的钩子就有错误发生。
+                    promise.fail(function( reason ) {
+                        file.setStatus( Status.ERROR, reason );
+                        me.owner.trigger( 'uploadError', file, reason );
+                        me.owner.trigger( 'uploadComplete', file );
+                    });
+    
+                    pending.push( promise );
+                }
+            },
+    
+            // 让出位置了,可以让其他分片开始上传
+            _popBlock: function( block ) {
+                var idx = $.inArray( block, this.pool );
+    
+                this.pool.splice( idx, 1 );
+                block.file.remaning--;
+                this.remaning--;
+            },
+    
+            // 开始上传,可以被掉过。如果promise被reject了,则表示跳过此分片。
+            _startSend: function( block ) {
+                var me = this,
+                    file = block.file,
+                    promise;
+    
+                me.pool.push( block );
+                me.remaning++;
+    
+                // 如果没有分片,则直接使用原始的。
+                // 不会丢失content-type信息。
+                block.blob = block.chunks === 1 ? file.source :
+                        file.source.slice( block.start, block.end );
+    
+                // hook, 每个分片发送之前可能要做些异步的事情。
+                promise = me.request( 'before-send', block, function() {
+    
+                    // 有可能文件已经上传出错了,所以不需要再传输了。
+                    if ( file.getStatus() === Status.PROGRESS ) {
+                        me._doSend( block );
+                    } else {
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+    
+                // 如果为fail了,则跳过此分片。
+                promise.fail(function() {
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file ).always(function() {
+                            block.percentage = 1;
+                            me._popBlock( block );
+                            me.owner.trigger( 'uploadComplete', file );
+                            Base.nextTick( me.__tick );
+                        });
+                    } else {
+                        block.percentage = 1;
+                        me._popBlock( block );
+                        Base.nextTick( me.__tick );
+                    }
+                });
+            },
+    
+    
+            /**
+             * @event uploadBeforeSend
+             * @param {Object} object
+             * @param {Object} data 默认的上传参数,可以扩展此对象来控制上传参数。
+             * @description 当某个文件的分块在发送前触发,主要用来询问是否要添加附带参数,大文件在开起分片上传的前提下此事件可能会触发多次。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadAccept
+             * @param {Object} object
+             * @param {Object} ret 服务端的返回数据,json格式,如果服务端不是json格式,从ret._raw中取数据,自行解析。
+             * @description 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。如果此事件handler返回值为`false`, 则此文件将派送`server`类型的`uploadError`事件。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadProgress
+             * @param {File} file File对象
+             * @param {Number} percentage 上传进度
+             * @description 上传过程中触发,携带上传进度。
+             * @for  Uploader
+             */
+    
+    
+            /**
+             * @event uploadError
+             * @param {File} file File对象
+             * @param {String} reason 出错的code
+             * @description 当文件上传出错时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadSuccess
+             * @param {File} file File对象
+             * @param {Object} response 服务端返回的数据
+             * @description 当文件上传成功时触发。
+             * @for  Uploader
+             */
+    
+            /**
+             * @event uploadComplete
+             * @param {File} [file] File对象
+             * @description 不管成功或者失败,文件上传完成时触发。
+             * @for  Uploader
+             */
+    
+            // 做上传操作。
+            _doSend: function( block ) {
+                var me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    file = block.file,
+                    tr = new Transport( opts ),
+                    data = $.extend({}, opts.formData ),
+                    headers = $.extend({}, opts.headers ),
+                    requestAccept, ret;
+    
+                block.transport = tr;
+    
+                tr.on( 'destroy', function() {
+                    delete block.transport;
+                    me._popBlock( block );
+                    Base.nextTick( me.__tick );
+                });
+    
+                // 广播上传进度。以文件为单位。
+                tr.on( 'progress', function( percentage ) {
+                    var totalPercent = 0,
+                        uploaded = 0;
+    
+                    // 可能没有abort掉,progress还是执行进来了。
+                    // if ( !file.blocks ) {
+                    //     return;
+                    // }
+    
+                    totalPercent = block.percentage = percentage;
+    
+                    if ( block.chunks > 1 ) {    // 计算文件的整体速度。
+                        $.each( file.blocks, function( _, v ) {
+                            uploaded += (v.percentage || 0) * (v.end - v.start);
+                        });
+    
+                        totalPercent = uploaded / file.size;
+                    }
+    
+                    owner.trigger( 'uploadProgress', file, totalPercent || 0 );
+                });
+    
+                // 用来询问,是否返回的结果是有错误的。
+                requestAccept = function( reject ) {
+                    var fn;
+    
+                    ret = tr.getResponseAsJson() || {};
+                    ret._raw = tr.getResponse();
+                    fn = function( value ) {
+                        reject = value;
+                    };
+    
+                    // 服务端响应了,不代表成功了,询问是否响应正确。
+                    if ( !owner.trigger( 'uploadAccept', block, ret, fn ) ) {
+                        reject = reject || 'server';
+                    }
+    
+                    return reject;
+                };
+    
+                // 尝试重试,然后广播文件上传出错。
+                tr.on( 'error', function( type, flag ) {
+                    block.retried = block.retried || 0;
+    
+                    // 自动重试
+                    if ( block.chunks > 1 && ~'http,abort'.indexOf( type ) &&
+                            block.retried < opts.chunkRetry ) {
+    
+                        block.retried++;
+                        tr.send();
+    
+                    } else {
+    
+                        // http status 500 ~ 600
+                        if ( !flag && type === 'server' ) {
+                            type = requestAccept( type );
+                        }
+    
+                        file.setStatus( Status.ERROR, type );
+                        owner.trigger( 'uploadError', file, type );
+                        owner.trigger( 'uploadComplete', file );
+                    }
+                });
+    
+                // 上传成功
+                tr.on( 'load', function() {
+                    var reason;
+    
+                    // 如果非预期,转向上传出错。
+                    if ( (reason = requestAccept()) ) {
+                        tr.trigger( 'error', reason, true );
+                        return;
+                    }
+    
+                    // 全部上传完成。
+                    if ( file.remaning === 1 ) {
+                        me._finishFile( file, ret );
+                    } else {
+                        tr.destroy();
+                    }
+                });
+    
+                // 配置默认的上传字段。
+                data = $.extend( data, {
+                    id: file.id,
+                    name: file.name,
+                    type: file.type,
+                    lastModifiedDate: file.lastModifiedDate,
+                    size: file.size
+                });
+    
+                block.chunks > 1 && $.extend( data, {
+                    chunks: block.chunks,
+                    chunk: block.chunk
+                });
+    
+                // 在发送之间可以添加字段什么的。。。
+                // 如果默认的字段不够使用,可以通过监听此事件来扩展
+                owner.trigger( 'uploadBeforeSend', block, data, headers );
+    
+                // 开始发送。
+                tr.appendBlob( opts.fileVal, block.blob, file.name );
+                tr.append( data );
+                tr.setRequestHeader( headers );
+                tr.send();
+            },
+    
+            // 完成上传。
+            _finishFile: function( file, ret, hds ) {
+                var owner = this.owner;
+    
+                return owner
+                        .request( 'after-send-file', arguments, function() {
+                            file.setStatus( Status.COMPLETE );
+                            owner.trigger( 'uploadSuccess', file, ret, hds );
+                        })
+                        .fail(function( reason ) {
+    
+                            // 如果外部已经标记为invalid什么的,不再改状态。
+                            if ( file.getStatus() === Status.PROGRESS ) {
+                                file.setStatus( Status.ERROR, reason );
+                            }
+    
+                            owner.trigger( 'uploadError', file, reason );
+                        })
+                        .always(function() {
+                            owner.trigger( 'uploadComplete', file );
+                        });
+            }
+    
+        });
+    });
+    /**
+     * @fileOverview 各种验证,包括文件总大小是否超出、单文件是否超出和文件是否重复。
+     */
+    
+    define('widgets/validator',[
+        'base',
+        'uploader',
+        'file',
+        'widgets/widget'
+    ], function( Base, Uploader, WUFile ) {
+    
+        var $ = Base.$,
+            validators = {},
+            api;
+    
+        /**
+         * @event error
+         * @param {String} type 错误类型。
+         * @description 当validate不通过时,会以派送错误事件的形式通知调用者。通过`upload.on('error', handler)`可以捕获到此类错误,目前有以下错误会在特定的情况下派送错来。
+         *
+         * * `Q_EXCEED_NUM_LIMIT` 在设置了`fileNumLimit`且尝试给`uploader`添加的文件数量超出这个值时派送。
+         * * `Q_EXCEED_SIZE_LIMIT` 在设置了`Q_EXCEED_SIZE_LIMIT`且尝试给`uploader`添加的文件总大小超出这个值时派送。
+         * @for  Uploader
+         */
+    
+        // 暴露给外面的api
+        api = {
+    
+            // 添加验证器
+            addValidator: function( type, cb ) {
+                validators[ type ] = cb;
+            },
+    
+            // 移除验证器
+            removeValidator: function( type ) {
+                delete validators[ type ];
+            }
+        };
+    
+        // 在Uploader初始化的时候启动Validators的初始化
+        Uploader.register({
+            init: function() {
+                var me = this;
+                $.each( validators, function() {
+                    this.call( me.owner );
+                });
+            }
+        });
+    
+        /**
+         * @property {int} [fileNumLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总数量, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileNumLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileNumLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( count >= max && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_NUM_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return count >= max ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function() {
+                count++;
+            });
+    
+            uploader.on( 'fileDequeued', function() {
+                count--;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+    
+        /**
+         * @property {int} [fileSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证文件总大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                count = 0,
+                max = opts.fileSizeLimit >> 0,
+                flag = true;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var invalid = count + file.size > max;
+    
+                if ( invalid && flag ) {
+                    flag = false;
+                    this.trigger( 'error', 'Q_EXCEED_SIZE_LIMIT', max, file );
+                    setTimeout(function() {
+                        flag = true;
+                    }, 1 );
+                }
+    
+                return invalid ? false : true;
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                count += file.size;
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                count -= file.size;
+            });
+    
+            uploader.on( 'uploadFinished', function() {
+                count = 0;
+            });
+        });
+    
+        /**
+         * @property {int} [fileSingleSizeLimit=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 验证单个文件大小是否超出限制, 超出则不允许加入队列。
+         */
+        api.addValidator( 'fileSingleSizeLimit', function() {
+            var uploader = this,
+                opts = uploader.options,
+                max = opts.fileSingleSizeLimit;
+    
+            if ( !max ) {
+                return;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+    
+                if ( file.size > max ) {
+                    file.setStatus( WUFile.Status.INVALID, 'exceed_size' );
+                    this.trigger( 'error', 'F_EXCEED_SIZE', file );
+                    return false;
+                }
+    
+            });
+    
+        });
+    
+        /**
+         * @property {int} [duplicate=undefined]
+         * @namespace options
+         * @for Uploader
+         * @description 去重, 根据文件名字、文件大小和最后修改时间来生成hash Key.
+         */
+        api.addValidator( 'duplicate', function() {
+            var uploader = this,
+                opts = uploader.options,
+                mapping = {};
+    
+            if ( opts.duplicate ) {
+                return;
+            }
+    
+            function hashString( str ) {
+                var hash = 0,
+                    i = 0,
+                    len = str.length,
+                    _char;
+    
+                for ( ; i < len; i++ ) {
+                    _char = str.charCodeAt( i );
+                    hash = _char + (hash << 6) + (hash << 16) - hash;
+                }
+    
+                return hash;
+            }
+    
+            uploader.on( 'beforeFileQueued', function( file ) {
+                var hash = file.__hash || (file.__hash = hashString( file.name +
+                        file.size + file.lastModifiedDate ));
+    
+                // 已经重复了
+                if ( mapping[ hash ] ) {
+                    this.trigger( 'error', 'F_DUPLICATE', file );
+                    return false;
+                }
+            });
+    
+            uploader.on( 'fileQueued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (mapping[ hash ] = true);
+            });
+    
+            uploader.on( 'fileDequeued', function( file ) {
+                var hash = file.__hash;
+    
+                hash && (delete mapping[ hash ]);
+            });
+        });
+    
+        return api;
+    });
+    
+    /**
+     * @fileOverview Runtime管理器,负责Runtime的选择, 连接
+     */
+    define('runtime/compbase',[],function() {
+    
+        function CompBase( owner, runtime ) {
+    
+            this.owner = owner;
+            this.options = owner.options;
+    
+            this.getRuntime = function() {
+                return runtime;
+            };
+    
+            this.getRuid = function() {
+                return runtime.uid;
+            };
+    
+            this.trigger = function() {
+                return owner.trigger.apply( owner, arguments );
+            };
+        }
+    
+        return CompBase;
+    });
+    /**
+     * @fileOverview Html5Runtime
+     */
+    define('runtime/html5/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var type = 'html5',
+            components = {};
+    
+        function Html5Runtime() {
+            var pool = {},
+                me = this,
+                destory = this.destory;
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                if ( components[ comp ] ) {
+                    instance = pool[ uid ] = pool[ uid ] ||
+                            new components[ comp ]( client, me );
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+            };
+    
+            me.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: Html5Runtime,
+    
+            // 不需要连接其他程序,直接执行callback
+            init: function() {
+                var me = this;
+                setTimeout(function() {
+                    me.trigger('ready');
+                }, 1 );
+            }
+    
+        });
+    
+        // 注册Components
+        Html5Runtime.register = function( name, component ) {
+            var klass = components[ name ] = Base.inherits( CompBase, component );
+            return klass;
+        };
+    
+        // 注册html5运行时。
+        // 只有在支持的前提下注册。
+        if ( window.Blob && window.FileReader && window.DataView ) {
+            Runtime.addRuntime( type, Html5Runtime );
+        }
+    
+        return Html5Runtime;
+    });
+    /**
+     * @fileOverview Blob Html实现
+     */
+    define('runtime/html5/blob',[
+        'runtime/html5/runtime',
+        'lib/blob'
+    ], function( Html5Runtime, Blob ) {
+    
+        return Html5Runtime.register( 'Blob', {
+            slice: function( start, end ) {
+                var blob = this.owner.source,
+                    slice = blob.slice || blob.webkitSlice || blob.mozSlice;
+    
+                blob = slice.call( blob, start, end );
+    
+                return new Blob( this.getRuid(), blob );
+            }
+        });
+    });
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/dnd',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        var $ = Base.$,
+            prefix = 'webuploader-dnd-';
+    
+        return Html5Runtime.register( 'DragAndDrop', {
+            init: function() {
+                var elem = this.elem = this.options.container;
+    
+                this.dragEnterHandler = Base.bindFn( this._dragEnterHandler, this );
+                this.dragOverHandler = Base.bindFn( this._dragOverHandler, this );
+                this.dragLeaveHandler = Base.bindFn( this._dragLeaveHandler, this );
+                this.dropHandler = Base.bindFn( this._dropHandler, this );
+                this.dndOver = false;
+    
+                elem.on( 'dragenter', this.dragEnterHandler );
+                elem.on( 'dragover', this.dragOverHandler );
+                elem.on( 'dragleave', this.dragLeaveHandler );
+                elem.on( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).on( 'dragover', this.dragOverHandler );
+                    $( document ).on( 'drop', this.dropHandler );
+                }
+            },
+    
+            _dragEnterHandler: function( e ) {
+                var me = this,
+                    denied = me._denied || false,
+                    items;
+    
+                e = e.originalEvent || e;
+    
+                if ( !me.dndOver ) {
+                    me.dndOver = true;
+    
+                    // 注意只有 chrome 支持。
+                    items = e.dataTransfer.items;
+    
+                    if ( items && items.length ) {
+                        me._denied = denied = !me.trigger( 'accept', items );
+                    }
+    
+                    me.elem.addClass( prefix + 'over' );
+                    me.elem[ denied ? 'addClass' :
+                            'removeClass' ]( prefix + 'denied' );
+                }
+    
+    
+                e.dataTransfer.dropEffect = denied ? 'none' : 'copy';
+    
+                return false;
+            },
+    
+            _dragOverHandler: function( e ) {
+                // 只处理框内的。
+                var parentElem = this.elem.parent().get( 0 );
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                clearTimeout( this._leaveTimer );
+                this._dragEnterHandler.call( this, e );
+    
+                return false;
+            },
+    
+            _dragLeaveHandler: function() {
+                var me = this,
+                    handler;
+    
+                handler = function() {
+                    me.dndOver = false;
+                    me.elem.removeClass( prefix + 'over ' + prefix + 'denied' );
+                };
+    
+                clearTimeout( me._leaveTimer );
+                me._leaveTimer = setTimeout( handler, 100 );
+                return false;
+            },
+    
+            _dropHandler: function( e ) {
+                var me = this,
+                    ruid = me.getRuid(),
+                    parentElem = me.elem.parent().get( 0 );
+    
+                // 只处理框内的。
+                if ( parentElem && !$.contains( parentElem, e.currentTarget ) ) {
+                    return false;
+                }
+    
+                me._getTansferFiles( e, function( results ) {
+                    me.trigger( 'drop', $.map( results, function( file ) {
+                        return new File( ruid, file );
+                    }) );
+                });
+    
+                me.dndOver = false;
+                me.elem.removeClass( prefix + 'over' );
+                return false;
+            },
+    
+            // 如果传入 callback 则去查看文件夹,否则只管当前文件夹。
+            _getTansferFiles: function( e, callback ) {
+                var results  = [],
+                    promises = [],
+                    items, files, dataTransfer, file, item, i, len, canAccessFolder;
+    
+                e = e.originalEvent || e;
+    
+                dataTransfer = e.dataTransfer;
+                items = dataTransfer.items;
+                files = dataTransfer.files;
+    
+                canAccessFolder = !!(items && items[ 0 ].webkitGetAsEntry);
+    
+                for ( i = 0, len = files.length; i < len; i++ ) {
+                    file = files[ i ];
+                    item = items && items[ i ];
+    
+                    if ( canAccessFolder && item.webkitGetAsEntry().isDirectory ) {
+    
+                        promises.push( this._traverseDirectoryTree(
+                                item.webkitGetAsEntry(), results ) );
+                    } else {
+                        results.push( file );
+                    }
+                }
+    
+                Base.when.apply( Base, promises ).done(function() {
+    
+                    if ( !results.length ) {
+                        return;
+                    }
+    
+                    callback( results );
+                });
+            },
+    
+            _traverseDirectoryTree: function( entry, results ) {
+                var deferred = Base.Deferred(),
+                    me = this;
+    
+                if ( entry.isFile ) {
+                    entry.file(function( file ) {
+                        results.push( file );
+                        deferred.resolve();
+                    });
+                } else if ( entry.isDirectory ) {
+                    entry.createReader().readEntries(function( entries ) {
+                        var len = entries.length,
+                            promises = [],
+                            arr = [],    // 为了保证顺序。
+                            i;
+    
+                        for ( i = 0; i < len; i++ ) {
+                            promises.push( me._traverseDirectoryTree(
+                                    entries[ i ], arr ) );
+                        }
+    
+                        Base.when.apply( Base, promises ).then(function() {
+                            results.push.apply( results, arr );
+                            deferred.resolve();
+                        }, deferred.reject );
+                    });
+                }
+    
+                return deferred.promise();
+            },
+    
+            destroy: function() {
+                var elem = this.elem;
+    
+                elem.off( 'dragenter', this.dragEnterHandler );
+                elem.off( 'dragover', this.dragEnterHandler );
+                elem.off( 'dragleave', this.dragLeaveHandler );
+                elem.off( 'drop', this.dropHandler );
+    
+                if ( this.options.disableGlobalDnd ) {
+                    $( document ).off( 'dragover', this.dragOverHandler );
+                    $( document ).off( 'drop', this.dropHandler );
+                }
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePaste
+     */
+    define('runtime/html5/filepaste',[
+        'base',
+        'runtime/html5/runtime',
+        'lib/file'
+    ], function( Base, Html5Runtime, File ) {
+    
+        return Html5Runtime.register( 'FilePaste', {
+            init: function() {
+                var opts = this.options,
+                    elem = this.elem = opts.container,
+                    accept = '.*',
+                    arr, i, len, item;
+    
+                // accetp的mimeTypes中生成匹配正则。
+                if ( opts.accept ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        item = opts.accept[ i ].mimeTypes;
+                        item && arr.push( item );
+                    }
+    
+                    if ( arr.length ) {
+                        accept = arr.join(',');
+                        accept = accept.replace( /,/g, '|' ).replace( /\*/g, '.*' );
+                    }
+                }
+                this.accept = accept = new RegExp( accept, 'i' );
+                this.hander = Base.bindFn( this._pasteHander, this );
+                elem.on( 'paste', this.hander );
+            },
+    
+            _pasteHander: function( e ) {
+                var allowed = [],
+                    ruid = this.getRuid(),
+                    items, item, blob, i, len;
+    
+                e = e.originalEvent || e;
+                items = e.clipboardData.items;
+    
+                for ( i = 0, len = items.length; i < len; i++ ) {
+                    item = items[ i ];
+    
+                    if ( item.kind !== 'file' || !(blob = item.getAsFile()) ) {
+                        continue;
+                    }
+    
+                    allowed.push( new File( ruid, blob ) );
+                }
+    
+                if ( allowed.length ) {
+                    // 不阻止非文件粘贴(文字粘贴)的事件冒泡
+                    e.preventDefault();
+                    e.stopPropagation();
+                    this.trigger( 'paste', allowed );
+                }
+            },
+    
+            destroy: function() {
+                this.elem.off( 'paste', this.hander );
+            }
+        });
+    });
+    
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/html5/filepicker',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var $ = Base.$;
+    
+        return Html5Runtime.register( 'FilePicker', {
+            init: function() {
+                var container = this.getRuntime().getContainer(),
+                    me = this,
+                    owner = me.owner,
+                    opts = me.options,
+                    lable = $( document.createElement('label') ),
+                    input = $( document.createElement('input') ),
+                    arr, i, len, mouseHandler;
+    
+                input.attr( 'type', 'file' );
+                input.attr( 'name', opts.name );
+                input.addClass('webuploader-element-invisible');
+    
+                lable.on( 'click', function() {
+                    input.trigger('click');
+                });
+    
+                lable.css({
+                    opacity: 0,
+                    width: '100%',
+                    height: '100%',
+                    display: 'block',
+                    cursor: 'pointer',
+                    background: '#ffffff'
+                });
+    
+                if ( opts.multiple ) {
+                    input.attr( 'multiple', 'multiple' );
+                }
+    
+                // @todo Firefox不支持单独指定后缀
+                if ( opts.accept && opts.accept.length > 0 ) {
+                    arr = [];
+    
+                    for ( i = 0, len = opts.accept.length; i < len; i++ ) {
+                        arr.push( opts.accept[ i ].mimeTypes );
+                    }
+    
+                    input.attr( 'accept', arr.join(',') );
+                }
+    
+                container.append( input );
+                container.append( lable );
+    
+                mouseHandler = function( e ) {
+                    owner.trigger( e.type );
+                };
+    
+                input.on( 'change', function( e ) {
+                    var fn = arguments.callee,
+                        clone;
+    
+                    me.files = e.target.files;
+    
+                    // reset input
+                    clone = this.cloneNode( true );
+                    this.parentNode.replaceChild( clone, this );
+    
+                    input.off();
+                    input = $( clone ).on( 'change', fn )
+                            .on( 'mouseenter mouseleave', mouseHandler );
+    
+                    owner.trigger('change');
+                });
+    
+                lable.on( 'mouseenter mouseleave', mouseHandler );
+    
+            },
+    
+    
+            getFiles: function() {
+                return this.files;
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * @fileOverview Transport
+     * @todo 支持chunked传输,优势:
+     * 可以将大文件分成小块,挨个传输,可以提高大文件成功率,当失败的时候,也只需要重传那小部分,
+     * 而不需要重头再传一次。另外断点续传也需要用chunked方式。
+     */
+    define('runtime/html5/transport',[
+        'base',
+        'runtime/html5/runtime'
+    ], function( Base, Html5Runtime ) {
+    
+        var noop = Base.noop,
+            $ = Base.$;
+    
+        return Html5Runtime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    formData, binary, fr;
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.getSource();
+                } else {
+                    formData = new FormData();
+                    $.each( owner._formData, function( k, v ) {
+                        formData.append( k, v );
+                    });
+    
+                    formData.append( opts.fileVal, blob.getSource(),
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                if ( opts.withCredentials && 'withCredentials' in xhr ) {
+                    xhr.open( opts.method, server, true );
+                    xhr.withCredentials = true;
+                } else {
+                    xhr.open( opts.method, server );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+    
+                if ( binary ) {
+                    xhr.overrideMimeType('application/octet-stream');
+    
+                    // android直接发送blob会导致服务端接收到的是空文件。
+                    // bug详情。
+                    // https://code.google.com/p/android/issues/detail?id=39882
+                    // 所以先用fileReader读取出来再通过arraybuffer的方式发送。
+                    if ( Base.os.android ) {
+                        fr = new FileReader();
+    
+                        fr.onload = function() {
+                            xhr.send( this.result );
+                            fr = fr.onload = null;
+                        };
+    
+                        fr.readAsArrayBuffer( binary );
+                    } else {
+                        xhr.send( binary );
+                    }
+                } else {
+                    xhr.send( formData );
+                }
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._parseJson( this._response );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    xhr.abort();
+    
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new XMLHttpRequest(),
+                    opts = this.options;
+    
+                if ( opts.withCredentials && !('withCredentials' in xhr) &&
+                        typeof XDomainRequest !== 'undefined' ) {
+                    xhr = new XDomainRequest();
+                }
+    
+                xhr.upload.onprogress = function( e ) {
+                    var percentage = 0;
+    
+                    if ( e.lengthComputable ) {
+                        percentage = e.loaded / e.total;
+                    }
+    
+                    return me.trigger( 'progress', percentage );
+                };
+    
+                xhr.onreadystatechange = function() {
+    
+                    if ( xhr.readyState !== 4 ) {
+                        return;
+                    }
+    
+                    xhr.upload.onprogress = noop;
+                    xhr.onreadystatechange = noop;
+                    me._xhr = null;
+                    me._status = xhr.status;
+    
+                    if ( xhr.status >= 200 && xhr.status < 300 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger('load');
+                    } else if ( xhr.status >= 500 && xhr.status < 600 ) {
+                        me._response = xhr.responseText;
+                        return me.trigger( 'error', 'server' );
+                    }
+    
+    
+                    return me.trigger( 'error', me._status ? 'http' : 'abort' );
+                };
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.setRequestHeader( key, val );
+                });
+            },
+    
+            _parseJson: function( str ) {
+                var json;
+    
+                try {
+                    json = JSON.parse( str );
+                } catch ( ex ) {
+                    json = {};
+                }
+    
+                return json;
+            }
+        });
+    });
+    /**
+     * @fileOverview FlashRuntime
+     */
+    define('runtime/flash/runtime',[
+        'base',
+        'runtime/runtime',
+        'runtime/compbase'
+    ], function( Base, Runtime, CompBase ) {
+    
+        var $ = Base.$,
+            type = 'flash',
+            components = {};
+    
+    
+        function getFlashVersion() {
+            var version;
+    
+            try {
+                version = navigator.plugins[ 'Shockwave Flash' ];
+                version = version.description;
+            } catch ( ex ) {
+                try {
+                    version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                } catch ( ex2 ) {
+                    version = '0.0';
+                }
+            }
+            version = version.match( /\d+/g );
+            return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 );
+        }
+    
+        function FlashRuntime() {
+            var pool = {},
+                clients = {},
+                destory = this.destory,
+                me = this,
+                jsreciver = Base.guid('webuploader_');
+    
+            Runtime.apply( me, arguments );
+            me.type = type;
+    
+    
+            // 这个方法的调用者,实际上是RuntimeClient
+            me.exec = function( comp, fn/*, args...*/ ) {
+                var client = this,
+                    uid = client.uid,
+                    args = Base.slice( arguments, 2 ),
+                    instance;
+    
+                clients[ uid ] = client;
+    
+                if ( components[ comp ] ) {
+                    if ( !pool[ uid ] ) {
+                        pool[ uid ] = new components[ comp ]( client, me );
+                    }
+    
+                    instance = pool[ uid ];
+    
+                    if ( instance[ fn ] ) {
+                        return instance[ fn ].apply( instance, args );
+                    }
+                }
+    
+                return me.flashExec.apply( client, arguments );
+            };
+    
+            function handler( evt, obj ) {
+                var type = evt.type || evt,
+                    parts, uid;
+    
+                parts = type.split('::');
+                uid = parts[ 0 ];
+                type = parts[ 1 ];
+    
+                // console.log.apply( console, arguments );
+    
+                if ( type === 'Ready' && uid === me.uid ) {
+                    me.trigger('ready');
+                } else if ( clients[ uid ] ) {
+                    clients[ uid ].trigger( type.toLowerCase(), evt, obj );
+                }
+    
+                // Base.log( evt, obj );
+            }
+    
+            // flash的接受器。
+            window[ jsreciver ] = function() {
+                var args = arguments;
+    
+                // 为了能捕获得到。
+                setTimeout(function() {
+                    handler.apply( null, args );
+                }, 1 );
+            };
+    
+            this.jsreciver = jsreciver;
+    
+            this.destory = function() {
+                // @todo 删除池子中的所有实例
+                return destory && destory.apply( this, arguments );
+            };
+    
+            this.flashExec = function( comp, fn ) {
+                var flash = me.getFlash(),
+                    args = Base.slice( arguments, 2 );
+    
+                return flash.exec( this.uid, comp, fn, args );
+            };
+    
+            // @todo
+        }
+    
+        Base.inherits( Runtime, {
+            constructor: FlashRuntime,
+    
+            init: function() {
+                var container = this.getContainer(),
+                    opts = this.options,
+                    html;
+    
+                // if not the minimal height, shims are not initialized
+                // in older browsers (e.g FF3.6, IE6,7,8, Safari 4.0,5.0, etc)
+                container.css({
+                    position: 'absolute',
+                    top: '-8px',
+                    left: '-8px',
+                    width: '9px',
+                    height: '9px',
+                    overflow: 'hidden'
+                });
+    
+                // insert flash object
+                html = '<object id="' + this.uid + '" type="application/' +
+                        'x-shockwave-flash" data="' +  opts.swf + '" ';
+    
+                if ( Base.browser.ie ) {
+                    html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                }
+    
+                html += 'width="100%" height="100%" style="outline:0">'  +
+                    '<param name="movie" value="' + opts.swf + '" />' +
+                    '<param name="flashvars" value="uid=' + this.uid +
+                    '&jsreciver=' + this.jsreciver + '" />' +
+                    '<param name="wmode" value="transparent" />' +
+                    '<param name="allowscriptaccess" value="always" />' +
+                '</object>';
+    
+                container.html( html );
+            },
+    
+            getFlash: function() {
+                if ( this._flash ) {
+                    return this._flash;
+                }
+    
+                this._flash = $( '#' + this.uid ).get( 0 );
+                return this._flash;
+            }
+    
+        });
+    
+        FlashRuntime.register = function( name, component ) {
+            component = components[ name ] = Base.inherits( CompBase, $.extend({
+    
+                // @todo fix this later
+                flashExec: function() {
+                    var owner = this.owner,
+                        runtime = this.getRuntime();
+    
+                    return runtime.flashExec.apply( owner, arguments );
+                }
+            }, component ) );
+    
+            return component;
+        };
+    
+        if ( getFlashVersion() >= 11.4 ) {
+            Runtime.addRuntime( type, FlashRuntime );
+        }
+    
+        return FlashRuntime;
+    });
+    /**
+     * @fileOverview FilePicker
+     */
+    define('runtime/flash/filepicker',[
+        'base',
+        'runtime/flash/runtime'
+    ], function( Base, FlashRuntime ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'FilePicker', {
+            init: function( opts ) {
+                var copy = $.extend({}, opts ),
+                    len, i;
+    
+                // 修复Flash再没有设置title的情况下无法弹出flash文件选择框的bug.
+                len = copy.accept && copy.accept.length;
+                for (  i = 0; i < len; i++ ) {
+                    if ( !copy.accept[ i ].title ) {
+                        copy.accept[ i ].title = 'Files';
+                    }
+                }
+    
+                delete copy.button;
+                delete copy.container;
+    
+                this.flashExec( 'FilePicker', 'init', copy );
+            },
+    
+            destroy: function() {
+                // todo
+            }
+        });
+    });
+    /**
+     * @fileOverview  Transport flash实现
+     */
+    define('runtime/flash/transport',[
+        'base',
+        'runtime/flash/runtime',
+        'runtime/client'
+    ], function( Base, FlashRuntime, RuntimeClient ) {
+        var $ = Base.$;
+    
+        return FlashRuntime.register( 'Transport', {
+            init: function() {
+                this._status = 0;
+                this._response = null;
+                this._responseJson = null;
+            },
+    
+            send: function() {
+                var owner = this.owner,
+                    opts = this.options,
+                    xhr = this._initAjax(),
+                    blob = owner._blob,
+                    server = opts.server,
+                    binary;
+    
+                xhr.connectRuntime( blob.ruid );
+    
+                if ( opts.sendAsBinary ) {
+                    server += (/\?/.test( server ) ? '&' : '?') +
+                            $.param( owner._formData );
+    
+                    binary = blob.uid;
+                } else {
+                    $.each( owner._formData, function( k, v ) {
+                        xhr.exec( 'append', k, v );
+                    });
+    
+                    xhr.exec( 'appendBlob', opts.fileVal, blob.uid,
+                            opts.filename || owner._formData.name || '' );
+                }
+    
+                this._setRequestHeader( xhr, opts.headers );
+                xhr.exec( 'send', {
+                    method: opts.method,
+                    url: server
+                }, binary );
+            },
+    
+            getStatus: function() {
+                return this._status;
+            },
+    
+            getResponse: function() {
+                return this._response;
+            },
+    
+            getResponseAsJson: function() {
+                return this._responseJson;
+            },
+    
+            abort: function() {
+                var xhr = this._xhr;
+    
+                if ( xhr ) {
+                    xhr.exec('abort');
+                    xhr.destroy();
+                    this._xhr = xhr = null;
+                }
+            },
+    
+            destroy: function() {
+                this.abort();
+            },
+    
+            _initAjax: function() {
+                var me = this,
+                    xhr = new RuntimeClient('XMLHttpRequest');
+    
+                xhr.on( 'uploadprogress progress', function( e ) {
+                    return me.trigger( 'progress', e.loaded / e.total );
+                });
+    
+                xhr.on( 'load', function() {
+                    var status = xhr.exec('getStatus'),
+                        err = '';
+    
+                    xhr.off();
+                    me._xhr = null;
+    
+                    if ( status >= 200 && status < 300 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                    } else if ( status >= 500 && status < 600 ) {
+                        me._response = xhr.exec('getResponse');
+                        me._responseJson = xhr.exec('getResponseAsJson');
+                        err = 'server';
+                    } else {
+                        err = 'http';
+                    }
+    
+                    xhr.destroy();
+                    xhr = null;
+    
+                    return err ? me.trigger( 'error', err ) : me.trigger('load');
+                });
+    
+                xhr.on( 'error', function() {
+                    xhr.off();
+                    me._xhr = null;
+                    me.trigger( 'error', 'http' );
+                });
+    
+                me._xhr = xhr;
+                return xhr;
+            },
+    
+            _setRequestHeader: function( xhr, headers ) {
+                $.each( headers, function( key, val ) {
+                    xhr.exec( 'setRequestHeader', key, val );
+                });
+            }
+        });
+    });
+    /**
+     * @fileOverview 没有图像处理的版本。
+     */
+    define('preset/withoutimage',[
+        'base',
+    
+        // widgets
+        'widgets/filednd',
+        'widgets/filepaste',
+        'widgets/filepicker',
+        'widgets/queue',
+        'widgets/runtime',
+        'widgets/upload',
+        'widgets/validator',
+    
+        // runtimes
+        // html5
+        'runtime/html5/blob',
+        'runtime/html5/dnd',
+        'runtime/html5/filepaste',
+        'runtime/html5/filepicker',
+        'runtime/html5/transport',
+    
+        // flash
+        'runtime/flash/filepicker',
+        'runtime/flash/transport'
+    ], function( Base ) {
+        return Base;
+    });
+    define('webuploader',[
+        'preset/withoutimage'
+    ], function( preset ) {
+        return preset;
+    });
+    return require('webuploader');
+});
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.withoutimage.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.withoutimage.min.js
new file mode 100644
index 0000000..70a7d48
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/webuploader/webuploader.withoutimage.min.js
@@ -0,0 +1,2 @@
+/* WebUploader 0.1.2 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}},j=b(a,f,e);i(j),"object"==typeof module&&"object"==typeof module.exports?module.exports=j:"function"==typeof define&&define.amd?define([],j):(c=a.WebUploader,a.WebUploader=j,a.WebUploader.noConflict=function(){a.WebUploader=c})}(this,function(a,b,c){return b("dollar-third",[],function(){return a.jQuery||a.Zepto}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.2",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",getDimension:"get-dimension",addButton:"add-btn",getRuntimeType:"get-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return{successNum:a.numOfSuccess,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.parentNode.removeChild(this.__container),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.disconnectRuntime()}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g={},h=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):g},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[];return e.each(h,function(c,d){b.push(new d(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,h,i,j,k=0,l=this._widgets,m=l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],h=f.invoke(b,d),h!==g&&(a.isPromise(h)?o.push(h):n.push(h));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return setTimeout(function(){b.resolve.apply(b,c)},1),b.promise()})[j](e||a.noop)):n[0]}}),b.register=d.register=function(b,c){var f,g={init:"init"};return 1===arguments.length?(c=b,c.responseMap=g):c.responseMap=e.extend(g,b),f=a.inherits(d,c),h.push(f),f},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})},destroy:function(){this.exec("destroy"),this.disconnectRuntime(),this.off()}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,b.call(d,"Blob"),this.uid=c.uid||this.uid,this.type=c.type||"",this.size=c.size||0,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;b.apply(this,arguments),this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&this.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(this.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),!this.type&&~"jpg,jpeg,png,gif,bmp".indexOf(f)&&(this.type="image/"+("jpg"===f?"jpeg":f)),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString()}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var b=this,c=b.options,e=c.button;e.addClass("webuploader-pick"),b.on("all",function(a){var g;switch(a){case"mouseenter":e.addClass("webuploader-pick-hover");break;case"mouseleave":e.removeClass("webuploader-pick-hover");break;case"change":g=b.exec("getFiles"),b.trigger("select",f.map(g,function(a){return a=new d(b.getRuid(),a),a._refer=c.container,a}),c.container)}}),b.connectRuntime(c,function(){b.refresh(),b.exec("init",c),b.trigger("ready")}),f(a).on("resize",function(){b.refresh()})},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){this.runtime&&(this.exec("destroy"),this.disconnectRuntime())}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({"add-btn":"addButton",refresh:"refresh",disable:"disable",enable:"enable"},{init:function(a){return this.pickers=[],a.pick&&this.addButton(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addButton:function(b){var e,f,g,h=this,i=h.options,j=i.accept;if(b)return g=a.Deferred(),d.isPlainObject(b)||(b={id:b}),e=d.extend({},b,{accept:d.isPlainObject(j)?[j]:j,swf:i.swf,runtimeOrder:i.runtimeOrder}),f=new c(e),f.once("ready",g.resolve),f.on("select",function(a){h.owner.request("add-file",[a])}),f.init(),this.pickers.push(f),g.promise()},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destory:function(){delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)})),a.setStatus(f.QUEUED)},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({"sort-files":"sortFiles","add-file":"addFiles","get-file":"getFile","fetch-file":"fetchFile","get-stats":"getStats","get-files":"getFiles","remove-file":"removeFile",retry:"retry",reset:"reset","accept-file":"acceptFile"},{init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||a.size<6||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFiles:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&b.request("start-upload")},getStats:function(){return this.stats},removeFile:function(a){var b=this;a=a.id?a:b.queue.getFile(a),a.setStatus(i.CANCELLED),b.owner.trigger("fileDequeued",a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.queue=new c,this.stats=this.queue.stats}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({"predict-runtime-type":"predictRuntmeType"},{init:function(){if(!this.predictRuntmeType())throw Error("Runtime Error")},predictRuntmeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){for(var c,d=[],e=a.source,f=e.size,g=b?Math.ceil(f/b):1,h=0,i=0;g>i;)c=Math.min(b,f-h),d.push({file:a,start:h,end:b?h+c:f,total:f,chunks:g,chunk:i++}),h+=c;return a.blocks=d.concat(),a.remaning=d.length,{file:a,has:function(){return!!d.length},fetch:function(){return d.shift()}}}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:null}),b.register({"start-upload":"start","stop-upload":"stop","skip-file":"skipFile","is-in-progress":"isInProgress"},{init:function(){var b=this.owner;this.runing=!1,this.pool=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},start:function(){var b=this;f.each(b.request("get-files",h.INVALID),function(){b.request("remove-file",this)}),b.runing||(b.runing=!0,f.each(b.pool,function(a,c){var d=c.file;d.getStatus()===h.INTERRUPT&&(d.setStatus(h.PROGRESS),b._trigged=!1,c.transport&&c.transport.send())}),b._trigged=!1,b.owner.trigger("startUpload"),a.nextTick(b.__tick))},stop:function(a){var b=this;b.runing!==!1&&(b.runing=!1,a&&f.each(b.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),b.owner.trigger("stopUpload"))},isInProgress:function(){return!!this.runing},getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d.getStats().numOfQueue||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_nextBlock:function(){var a,b,c=this,d=c._act,f=c.options;return d&&d.has()&&d.file.getStatus()===h.PROGRESS?(f.prepareNextFile&&!c.pending.length&&c._prepareNextFile(),d.fetch()):c.runing?(!c.pending.length&&c.getStats().numOfQueue&&c._prepareNextFile(),a=c.pending.shift(),b=function(a){return a?(d=e(a,f.chunked?f.chunkSize:0),c._act=d,d.fetch()):null},g(a)?a[a.pipe?"pipe":"then"](b):b(a)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.QUEUED?(b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),c):b._finishFile(c)}),a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d._popBlock(b),a.nextTick(d.__tick))})},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){var c=0,d=0;c=b.percentage=a,b.chunks>1&&(f.each(k.blocks,function(a,b){d+=(b.percentage||0)*(b.end-b.start)}),c=d/k.size),i.trigger("uploadProgress",k,c||0)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)}).always(function(){d.trigger("uploadComplete",a)})}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({init:function(){var a=this;e.each(f,function(){this.call(a.owner)})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=b.fileNumLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=b.fileSizeLimit>>0,e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("uploadFinished",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}))}),d}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destory;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destory=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b=this,f=b.getRuid(),g=b.elem.parent().get(0);return g&&!d.contains(g,a.currentTarget)?!1:(b._getTansferFiles(a,function(a){b.trigger("drop",d.map(a,function(a){return new c(f,a)}))}),b.dndOver=!1,b.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k,l=[],m=[];for(b=b.originalEvent||b,f=b.dataTransfer,d=f.items,e=f.files,k=!(!d||!d[0].webkitGetAsEntry),i=0,j=e.length;j>i;i++)g=e[i],h=d&&d[i],k&&h.webkitGetAsEntry().isDirectory?m.push(this._traverseDirectoryTree(h.webkitGetAsEntry(),l)):l.push(g);a.when.apply(a,m).done(function(){l.length&&c(l)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragEnterHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))
+}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=c(document.createElement("label")),k=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){}})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destory,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destory=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(a,b,c){var d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,e=this._initAjax(),f=b._blob,g=c.server;e.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+d.param(b._formData),a=f.uid):(d.each(b._formData,function(a,b){e.exec("append",a,b)}),e.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(e,c.headers),e.exec("send",{method:c.method,url:g},a)},getStatus:function(){return this._status},getResponse:function(){return this._response},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new c("XMLHttpRequest");return b.on("uploadprogress progress",function(b){return a.trigger("progress",b.loaded/b.total)}),b.on("load",function(){var c=b.exec("getStatus"),d="";return b.off(),a._xhr=null,c>=200&&300>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson")):c>=500&&600>c?(a._response=b.exec("getResponse"),a._responseJson=b.exec("getResponseAsJson"),d="server"):d="http",b.destroy(),b=null,d?a.trigger("error",d):a.trigger("load")}),b.on("error",function(){b.off(),a._xhr=null,a.trigger("error","http")}),a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("preset/withoutimage",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/transport","runtime/flash/filepicker","runtime/flash/transport"],function(a){return a}),b("webuploader",["preset/withoutimage"],function(a){return a}),c("webuploader")});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/xss.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/xss.min.js
new file mode 100644
index 0000000..48d7880
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/xss.min.js
@@ -0,0 +1 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){var FilterCSS=require("cssfilter").FilterCSS;var _=require("./util");function getDefaultWhiteList(){return{a:["target","href","title"],abbr:["title"],address:[],area:["shape","coords","href","alt"],article:[],aside:[],audio:["autoplay","controls","loop","preload","src"],b:[],bdi:["dir"],bdo:["dir"],big:[],blockquote:["cite"],br:[],caption:[],center:[],cite:[],code:[],col:["align","valign","span","width"],colgroup:["align","valign","span","width"],dd:[],del:["datetime"],details:["open"],div:[],dl:[],dt:[],em:[],font:["color","size","face"],footer:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],header:[],hr:[],i:[],img:["src","alt","title","width","height"],ins:["datetime"],li:[],mark:[],nav:[],ol:[],p:[],pre:[],s:[],section:[],small:[],span:[],sub:[],sup:[],strong:[],table:["width","border","align","valign"],tbody:["align","valign"],td:["width","rowspan","colspan","align","valign"],tfoot:["align","valign"],th:["width","rowspan","colspan","align","valign"],thead:["align","valign"],tr:["rowspan","align","valign"],tt:[],u:[],ul:[],video:["autoplay","controls","loop","preload","src","height","width"]}}var defaultCSSFilter=new FilterCSS;function onTag(tag,html,options){}function onIgnoreTag(tag,html,options){}function onTagAttr(tag,name,value){}function onIgnoreTagAttr(tag,name,value){}function escapeHtml(html){return html.replace(REGEXP_LT,"&lt;").replace(REGEXP_GT,"&gt;")}function safeAttrValue(tag,name,value,cssFilter){cssFilter=cssFilter||defaultCSSFilter;value=friendlyAttrValue(value);if(name==="href"||name==="src"){value=_.trim(value);if(value==="#")return"#";if(!(value.substr(0,7)==="http://"||value.substr(0,8)==="https://"||value.substr(0,7)==="mailto:"||value[0]==="#"||value[0]==="/")){return""}}else if(name==="background"){REGEXP_DEFAULT_ON_TAG_ATTR_4.lastIndex=0;if(REGEXP_DEFAULT_ON_TAG_ATTR_4.test(value)){return""}}else if(name==="style"){REGEXP_DEFAULT_ON_TAG_ATTR_7.lastIndex=0;if(REGEXP_DEFAULT_ON_TAG_ATTR_7.test(value)){return""}REGEXP_DEFAULT_ON_TAG_ATTR_8.lastIndex=0;if(REGEXP_DEFAULT_ON_TAG_ATTR_8.test(value)){REGEXP_DEFAULT_ON_TAG_ATTR_4.lastIndex=0;if(REGEXP_DEFAULT_ON_TAG_ATTR_4.test(value)){return""}}value=cssFilter.process(value)}value=escapeAttrValue(value);return value}var REGEXP_LT=/</g;var REGEXP_GT=/>/g;var REGEXP_QUOTE=/"/g;var REGEXP_QUOTE_2=/&quot;/g;var REGEXP_ATTR_VALUE_1=/&#([a-zA-Z0-9]*);?/gim;var REGEXP_ATTR_VALUE_COLON=/&colon;?/gim;var REGEXP_ATTR_VALUE_NEWLINE=/&newline;?/gim;var REGEXP_DEFAULT_ON_TAG_ATTR_3=/\/\*|\*\//gm;var REGEXP_DEFAULT_ON_TAG_ATTR_4=/((j\s*a\s*v\s*a|v\s*b|l\s*i\s*v\s*e)\s*s\s*c\s*r\s*i\s*p\s*t\s*|m\s*o\s*c\s*h\s*a)\:/gi;var REGEXP_DEFAULT_ON_TAG_ATTR_5=/^[\s"'`]*(d\s*a\s*t\s*a\s*)\:/gi;var REGEXP_DEFAULT_ON_TAG_ATTR_6=/^[\s"'`]*(d\s*a\s*t\s*a\s*)\:\s*image\//gi;var REGEXP_DEFAULT_ON_TAG_ATTR_7=/e\s*x\s*p\s*r\s*e\s*s\s*s\s*i\s*o\s*n\s*\(.*/gi;var REGEXP_DEFAULT_ON_TAG_ATTR_8=/u\s*r\s*l\s*\(.*/gi;function escapeQuote(str){return str.replace(REGEXP_QUOTE,"&quot;")}function unescapeQuote(str){return str.replace(REGEXP_QUOTE_2,'"')}function escapeHtmlEntities(str){return str.replace(REGEXP_ATTR_VALUE_1,function replaceUnicode(str,code){return code[0]==="x"||code[0]==="X"?String.fromCharCode(parseInt(code.substr(1),16)):String.fromCharCode(parseInt(code,10))})}function escapeDangerHtml5Entities(str){return str.replace(REGEXP_ATTR_VALUE_COLON,":").replace(REGEXP_ATTR_VALUE_NEWLINE," ")}function clearNonPrintableCharacter(str){var str2="";for(var i=0,len=str.length;i<len;i++){str2+=str.charCodeAt(i)<32?" ":str.charAt(i)}return _.trim(str2)}function friendlyAttrValue(str){str=unescapeQuote(str);str=escapeHtmlEntities(str);str=escapeDangerHtml5Entities(str);str=clearNonPrintableCharacter(str);return str}function escapeAttrValue(str){str=escapeQuote(str);str=escapeHtml(str);return str}function onIgnoreTagStripAll(){return""}function StripTagBody(tags,next){if(typeof next!=="function"){next=function(){}}var isRemoveAllTag=!Array.isArray(tags);function isRemoveTag(tag){if(isRemoveAllTag)return true;return _.indexOf(tags,tag)!==-1}var removeList=[];var posStart=false;return{onIgnoreTag:function(tag,html,options){if(isRemoveTag(tag)){if(options.isClosing){var ret="[/removed]";var end=options.position+ret.length;removeList.push([posStart!==false?posStart:options.position,end]);posStart=false;return ret}else{if(!posStart){posStart=options.position}return"[removed]"}}else{return next(tag,html,options)}},remove:function(html){var rethtml="";var lastPos=0;_.forEach(removeList,function(pos){rethtml+=html.slice(lastPos,pos[0]);lastPos=pos[1]});rethtml+=html.slice(lastPos);return rethtml}}}function stripCommentTag(html){return html.replace(STRIP_COMMENT_TAG_REGEXP,"")}var STRIP_COMMENT_TAG_REGEXP=/<!--[\s\S]*?-->/g;function stripBlankChar(html){var chars=html.split("");chars=chars.filter(function(char){var c=char.charCodeAt(0);if(c===127)return false;if(c<=31){if(c===10||c===13)return true;return false}return true});return chars.join("")}exports.whiteList=getDefaultWhiteList();exports.getDefaultWhiteList=getDefaultWhiteList;exports.onTag=onTag;exports.onIgnoreTag=onIgnoreTag;exports.onTagAttr=onTagAttr;exports.onIgnoreTagAttr=onIgnoreTagAttr;exports.safeAttrValue=safeAttrValue;exports.escapeHtml=escapeHtml;exports.escapeQuote=escapeQuote;exports.unescapeQuote=unescapeQuote;exports.escapeHtmlEntities=escapeHtmlEntities;exports.escapeDangerHtml5Entities=escapeDangerHtml5Entities;exports.clearNonPrintableCharacter=clearNonPrintableCharacter;exports.friendlyAttrValue=friendlyAttrValue;exports.escapeAttrValue=escapeAttrValue;exports.onIgnoreTagStripAll=onIgnoreTagStripAll;exports.StripTagBody=StripTagBody;exports.stripCommentTag=stripCommentTag;exports.stripBlankChar=stripBlankChar;exports.cssFilter=defaultCSSFilter},{"./util":4,cssfilter:8}],2:[function(require,module,exports){var DEFAULT=require("./default");var parser=require("./parser");var FilterXSS=require("./xss");function filterXSS(html,options){var xss=new FilterXSS(options);return xss.process(html)}exports=module.exports=filterXSS;exports.FilterXSS=FilterXSS;for(var i in DEFAULT)exports[i]=DEFAULT[i];for(var i in parser)exports[i]=parser[i];if(typeof window!=="undefined"){window.filterXSS=module.exports}},{"./default":1,"./parser":3,"./xss":5}],3:[function(require,module,exports){var _=require("./util");function getTagName(html){var i=html.indexOf(" ");if(i===-1){var tagName=html.slice(1,-1)}else{var tagName=html.slice(1,i+1)}tagName=_.trim(tagName).toLowerCase();if(tagName.slice(0,1)==="/")tagName=tagName.slice(1);if(tagName.slice(-1)==="/")tagName=tagName.slice(0,-1);return tagName}function isClosing(html){return html.slice(0,2)==="</"}function parseTag(html,onTag,escapeHtml){"user strict";var rethtml="";var lastPos=0;var tagStart=false;var quoteStart=false;var currentPos=0;var len=html.length;var currentHtml="";var currentTagName="";for(currentPos=0;currentPos<len;currentPos++){var c=html.charAt(currentPos);if(tagStart===false){if(c==="<"){tagStart=currentPos;continue}}else{if(quoteStart===false){if(c==="<"){rethtml+=escapeHtml(html.slice(lastPos,currentPos));tagStart=currentPos;lastPos=currentPos;continue}if(c===">"){rethtml+=escapeHtml(html.slice(lastPos,tagStart));currentHtml=html.slice(tagStart,currentPos+1);currentTagName=getTagName(currentHtml);rethtml+=onTag(tagStart,rethtml.length,currentTagName,currentHtml,isClosing(currentHtml));lastPos=currentPos+1;tagStart=false;continue}if((c==='"'||c==="'")&&html.charAt(currentPos-1)==="="){quoteStart=c;continue}}else{if(c===quoteStart){quoteStart=false;continue}}}}if(lastPos<html.length){rethtml+=escapeHtml(html.substr(lastPos))}return rethtml}var REGEXP_ATTR_NAME=/[^a-zA-Z0-9_:\.\-]/gim;function parseAttr(html,onAttr){"user strict";var lastPos=0;var retAttrs=[];var tmpName=false;var len=html.length;function addAttr(name,value){name=_.trim(name);name=name.replace(REGEXP_ATTR_NAME,"").toLowerCase();if(name.length<1)return;var ret=onAttr(name,value||"");if(ret)retAttrs.push(ret)}for(var i=0;i<len;i++){var c=html.charAt(i);var v,j;if(tmpName===false&&c==="="){tmpName=html.slice(lastPos,i);lastPos=i+1;continue}if(tmpName!==false){if(i===lastPos&&(c==='"'||c==="'")&&html.charAt(i-1)==="="){j=html.indexOf(c,i+1);if(j===-1){break}else{v=_.trim(html.slice(lastPos+1,j));addAttr(tmpName,v);tmpName=false;i=j;lastPos=i+1;continue}}}if(c===" "){if(tmpName===false){j=findNextEqual(html,i);if(j===-1){v=_.trim(html.slice(lastPos,i));addAttr(v);tmpName=false;lastPos=i+1;continue}else{i=j-1;continue}}else{j=findBeforeEqual(html,i-1);if(j===-1){v=_.trim(html.slice(lastPos,i));v=stripQuoteWrap(v);addAttr(tmpName,v);tmpName=false;lastPos=i+1;continue}else{continue}}}}if(lastPos<html.length){if(tmpName===false){addAttr(html.slice(lastPos))}else{addAttr(tmpName,stripQuoteWrap(_.trim(html.slice(lastPos))))}}return _.trim(retAttrs.join(" "))}function findNextEqual(str,i){for(;i<str.length;i++){var c=str[i];if(c===" ")continue;if(c==="=")return i;return-1}}function findBeforeEqual(str,i){for(;i>0;i--){var c=str[i];if(c===" ")continue;if(c==="=")return i;return-1}}function isQuoteWrapString(text){if(text[0]==='"'&&text[text.length-1]==='"'||text[0]==="'"&&text[text.length-1]==="'"){return true}else{return false}}function stripQuoteWrap(text){if(isQuoteWrapString(text)){return text.substr(1,text.length-2)}else{return text}}exports.parseTag=parseTag;exports.parseAttr=parseAttr},{"./util":4}],4:[function(require,module,exports){module.exports={indexOf:function(arr,item){var i,j;if(Array.prototype.indexOf){return arr.indexOf(item)}for(i=0,j=arr.length;i<j;i++){if(arr[i]===item){return i}}return-1},forEach:function(arr,fn,scope){var i,j;if(Array.prototype.forEach){return arr.forEach(fn,scope)}for(i=0,j=arr.length;i<j;i++){fn.call(scope,arr[i],i,arr)}},trim:function(str){if(String.prototype.trim){return str.trim()}return str.replace(/(^\s*)|(\s*$)/g,"")}}},{}],5:[function(require,module,exports){var FilterCSS=require("cssfilter").FilterCSS;var DEFAULT=require("./default");var parser=require("./parser");var parseTag=parser.parseTag;var parseAttr=parser.parseAttr;var _=require("./util");function isNull(obj){return obj===undefined||obj===null}function getAttrs(html){var i=html.indexOf(" ");if(i===-1){return{html:"",closing:html[html.length-2]==="/"}}html=_.trim(html.slice(i+1,-1));var isClosing=html[html.length-1]==="/";if(isClosing)html=_.trim(html.slice(0,-1));return{html:html,closing:isClosing}}function FilterXSS(options){options=options||{};if(options.stripIgnoreTag){if(options.onIgnoreTag){console.error('Notes: cannot use these two options "stripIgnoreTag" and "onIgnoreTag" at the same time')}options.onIgnoreTag=DEFAULT.onIgnoreTagStripAll}options.whiteList=options.whiteList||DEFAULT.whiteList;options.onTag=options.onTag||DEFAULT.onTag;options.onTagAttr=options.onTagAttr||DEFAULT.onTagAttr;options.onIgnoreTag=options.onIgnoreTag||DEFAULT.onIgnoreTag;options.onIgnoreTagAttr=options.onIgnoreTagAttr||DEFAULT.onIgnoreTagAttr;options.safeAttrValue=options.safeAttrValue||DEFAULT.safeAttrValue;options.escapeHtml=options.escapeHtml||DEFAULT.escapeHtml;options.css=options.css||{};this.options=options;this.cssFilter=new FilterCSS(options.css)}FilterXSS.prototype.process=function(html){html=html||"";html=html.toString();if(!html)return"";var me=this;var options=me.options;var whiteList=options.whiteList;var onTag=options.onTag;var onIgnoreTag=options.onIgnoreTag;var onTagAttr=options.onTagAttr;var onIgnoreTagAttr=options.onIgnoreTagAttr;var safeAttrValue=options.safeAttrValue;var escapeHtml=options.escapeHtml;var cssFilter=me.cssFilter;if(options.stripBlankChar){html=DEFAULT.stripBlankChar(html)}if(!options.allowCommentTag){html=DEFAULT.stripCommentTag(html)}var stripIgnoreTagBody=false;if(options.stripIgnoreTagBody){var stripIgnoreTagBody=DEFAULT.StripTagBody(options.stripIgnoreTagBody,onIgnoreTag);onIgnoreTag=stripIgnoreTagBody.onIgnoreTag}var retHtml=parseTag(html,function(sourcePosition,position,tag,html,isClosing){var info={sourcePosition:sourcePosition,position:position,isClosing:isClosing,isWhite:tag in whiteList};var ret=onTag(tag,html,info);if(!isNull(ret))return ret;if(info.isWhite){if(info.isClosing){return"</"+tag+">"}var attrs=getAttrs(html);var whiteAttrList=whiteList[tag];var attrsHtml=parseAttr(attrs.html,function(name,value){var isWhiteAttr=_.indexOf(whiteAttrList,name)!==-1;var ret=onTagAttr(tag,name,value,isWhiteAttr);if(!isNull(ret))return ret;if(isWhiteAttr){value=safeAttrValue(tag,name,value,cssFilter);if(value){return name+'="'+value+'"'}else{return name}}else{var ret=onIgnoreTagAttr(tag,name,value,isWhiteAttr);if(!isNull(ret))return ret;return}});var html="<"+tag;if(attrsHtml)html+=" "+attrsHtml;if(attrs.closing)html+=" /";html+=">";return html}else{var ret=onIgnoreTag(tag,html,info);if(!isNull(ret))return ret;return escapeHtml(html)}},escapeHtml);if(stripIgnoreTagBody){retHtml=stripIgnoreTagBody.remove(retHtml)}return retHtml};module.exports=FilterXSS},{"./default":1,"./parser":3,"./util":4,cssfilter:8}],6:[function(require,module,exports){var DEFAULT=require("./default");var parseStyle=require("./parser");var _=require("./util");function isNull(obj){return obj===undefined||obj===null}function FilterCSS(options){options=options||{};options.whiteList=options.whiteList||DEFAULT.whiteList;options.onAttr=options.onAttr||DEFAULT.onAttr;options.onIgnoreAttr=options.onIgnoreAttr||DEFAULT.onIgnoreAttr;this.options=options}FilterCSS.prototype.process=function(css){css=css||"";css=css.toString();if(!css)return"";var me=this;var options=me.options;var whiteList=options.whiteList;var onAttr=options.onAttr;var onIgnoreAttr=options.onIgnoreAttr;var retCSS=parseStyle(css,function(sourcePosition,position,name,value,source){var check=whiteList[name];var isWhite=false;if(check===true)isWhite=check;else if(typeof check==="function")isWhite=check(value);else if(check instanceof RegExp)isWhite=check.test(value);if(isWhite!==true)isWhite=false;var opts={position:position,sourcePosition:sourcePosition,source:source,isWhite:isWhite};if(isWhite){var ret=onAttr(name,value,opts);if(isNull(ret)){return name+":"+value}else{return ret}}else{var ret=onIgnoreAttr(name,value,opts);if(!isNull(ret)){return ret}}});return retCSS};module.exports=FilterCSS},{"./default":7,"./parser":9,"./util":10}],7:[function(require,module,exports){function getDefaultWhiteList(){var whiteList={};whiteList["align-content"]=false;whiteList["align-items"]=false;whiteList["align-self"]=false;whiteList["alignment-adjust"]=false;whiteList["alignment-baseline"]=false;whiteList["all"]=false;whiteList["anchor-point"]=false;whiteList["animation"]=false;whiteList["animation-delay"]=false;whiteList["animation-direction"]=false;whiteList["animation-duration"]=false;whiteList["animation-fill-mode"]=false;whiteList["animation-iteration-count"]=false;whiteList["animation-name"]=false;whiteList["animation-play-state"]=false;whiteList["animation-timing-function"]=false;whiteList["azimuth"]=false;whiteList["backface-visibility"]=false;whiteList["background"]=true;whiteList["background-attachment"]=true;whiteList["background-clip"]=true;whiteList["background-color"]=true;whiteList["background-image"]=true;whiteList["background-origin"]=true;whiteList["background-position"]=true;whiteList["background-repeat"]=true;whiteList["background-size"]=true;whiteList["baseline-shift"]=false;whiteList["binding"]=false;whiteList["bleed"]=false;whiteList["bookmark-label"]=false;whiteList["bookmark-level"]=false;whiteList["bookmark-state"]=false;whiteList["border"]=true;whiteList["border-bottom"]=true;whiteList["border-bottom-color"]=true;whiteList["border-bottom-left-radius"]=true;whiteList["border-bottom-right-radius"]=true;whiteList["border-bottom-style"]=true;whiteList["border-bottom-width"]=true;whiteList["border-collapse"]=true;whiteList["border-color"]=true;whiteList["border-image"]=true;whiteList["border-image-outset"]=true;whiteList["border-image-repeat"]=true;whiteList["border-image-slice"]=true;whiteList["border-image-source"]=true;whiteList["border-image-width"]=true;whiteList["border-left"]=true;whiteList["border-left-color"]=true;whiteList["border-left-style"]=true;whiteList["border-left-width"]=true;whiteList["border-radius"]=true;whiteList["border-right"]=true;whiteList["border-right-color"]=true;whiteList["border-right-style"]=true;whiteList["border-right-width"]=true;whiteList["border-spacing"]=true;whiteList["border-style"]=true;whiteList["border-top"]=true;whiteList["border-top-color"]=true;whiteList["border-top-left-radius"]=true;whiteList["border-top-right-radius"]=true;whiteList["border-top-style"]=true;whiteList["border-top-width"]=true;whiteList["border-width"]=true;whiteList["bottom"]=false;whiteList["box-decoration-break"]=true;whiteList["box-shadow"]=true;whiteList["box-sizing"]=true;whiteList["box-snap"]=true;whiteList["box-suppress"]=true;whiteList["break-after"]=true;whiteList["break-before"]=true;whiteList["break-inside"]=true;whiteList["caption-side"]=false;whiteList["chains"]=false;whiteList["clear"]=true;whiteList["clip"]=false;whiteList["clip-path"]=false;whiteList["clip-rule"]=false;whiteList["color"]=true;whiteList["color-interpolation-filters"]=true;whiteList["column-count"]=false;whiteList["column-fill"]=false;whiteList["column-gap"]=false;whiteList["column-rule"]=false;whiteList["column-rule-color"]=false;whiteList["column-rule-style"]=false;whiteList["column-rule-width"]=false;whiteList["column-span"]=false;whiteList["column-width"]=false;whiteList["columns"]=false;whiteList["contain"]=false;whiteList["content"]=false;whiteList["counter-increment"]=false;whiteList["counter-reset"]=false;whiteList["counter-set"]=false;whiteList["crop"]=false;whiteList["cue"]=false;whiteList["cue-after"]=false;whiteList["cue-before"]=false;whiteList["cursor"]=false;whiteList["direction"]=false;whiteList["display"]=true;whiteList["display-inside"]=true;whiteList["display-list"]=true;whiteList["display-outside"]=true;whiteList["dominant-baseline"]=false;whiteList["elevation"]=false;whiteList["empty-cells"]=false;whiteList["filter"]=false;whiteList["flex"]=false;whiteList["flex-basis"]=false;whiteList["flex-direction"]=false;whiteList["flex-flow"]=false;whiteList["flex-grow"]=false;whiteList["flex-shrink"]=false;whiteList["flex-wrap"]=false;whiteList["float"]=false;whiteList["float-offset"]=false;whiteList["flood-color"]=false;whiteList["flood-opacity"]=false;whiteList["flow-from"]=false;whiteList["flow-into"]=false;whiteList["font"]=true;whiteList["font-family"]=true;whiteList["font-feature-settings"]=true;whiteList["font-kerning"]=true;whiteList["font-language-override"]=true;whiteList["font-size"]=true;whiteList["font-size-adjust"]=true;whiteList["font-stretch"]=true;whiteList["font-style"]=true;whiteList["font-synthesis"]=true;whiteList["font-variant"]=true;whiteList["font-variant-alternates"]=true;whiteList["font-variant-caps"]=true;whiteList["font-variant-east-asian"]=true;whiteList["font-variant-ligatures"]=true;whiteList["font-variant-numeric"]=true;whiteList["font-variant-position"]=true;whiteList["font-weight"]=true;whiteList["grid"]=false;whiteList["grid-area"]=false;whiteList["grid-auto-columns"]=false;whiteList["grid-auto-flow"]=false;whiteList["grid-auto-rows"]=false;whiteList["grid-column"]=false;whiteList["grid-column-end"]=false;whiteList["grid-column-start"]=false;whiteList["grid-row"]=false;whiteList["grid-row-end"]=false;whiteList["grid-row-start"]=false;whiteList["grid-template"]=false;whiteList["grid-template-areas"]=false;whiteList["grid-template-columns"]=false;whiteList["grid-template-rows"]=false;whiteList["hanging-punctuation"]=false;whiteList["height"]=true;whiteList["hyphens"]=false;whiteList["icon"]=false;whiteList["image-orientation"]=false;whiteList["image-resolution"]=false;whiteList["ime-mode"]=false;whiteList["initial-letters"]=false;whiteList["inline-box-align"]=false;whiteList["justify-content"]=false;whiteList["justify-items"]=false;whiteList["justify-self"]=false;whiteList["left"]=false;whiteList["letter-spacing"]=true;whiteList["lighting-color"]=true;whiteList["line-box-contain"]=false;whiteList["line-break"]=false;whiteList["line-grid"]=false;whiteList["line-height"]=false;whiteList["line-snap"]=false;whiteList["line-stacking"]=false;whiteList["line-stacking-ruby"]=false;whiteList["line-stacking-shift"]=false;whiteList["line-stacking-strategy"]=false;whiteList["list-style"]=true;whiteList["list-style-image"]=true;whiteList["list-style-position"]=true;whiteList["list-style-type"]=true;whiteList["margin"]=true;whiteList["margin-bottom"]=true;whiteList["margin-left"]=true;whiteList["margin-right"]=true;whiteList["margin-top"]=true;whiteList["marker-offset"]=false;whiteList["marker-side"]=false;whiteList["marks"]=false;whiteList["mask"]=false;whiteList["mask-box"]=false;whiteList["mask-box-outset"]=false;whiteList["mask-box-repeat"]=false;whiteList["mask-box-slice"]=false;whiteList["mask-box-source"]=false;whiteList["mask-box-width"]=false;whiteList["mask-clip"]=false;whiteList["mask-image"]=false;whiteList["mask-origin"]=false;whiteList["mask-position"]=false;whiteList["mask-repeat"]=false;whiteList["mask-size"]=false;whiteList["mask-source-type"]=false;whiteList["mask-type"]=false;whiteList["max-height"]=true;whiteList["max-lines"]=false;whiteList["max-width"]=true;whiteList["min-height"]=true;whiteList["min-width"]=true;whiteList["move-to"]=false;whiteList["nav-down"]=false;whiteList["nav-index"]=false;whiteList["nav-left"]=false;whiteList["nav-right"]=false;whiteList["nav-up"]=false;whiteList["object-fit"]=false;whiteList["object-position"]=false;whiteList["opacity"]=false;whiteList["order"]=false;whiteList["orphans"]=false;whiteList["outline"]=false;whiteList["outline-color"]=false;whiteList["outline-offset"]=false;whiteList["outline-style"]=false;whiteList["outline-width"]=false;whiteList["overflow"]=false;whiteList["overflow-wrap"]=false;whiteList["overflow-x"]=false;whiteList["overflow-y"]=false;whiteList["padding"]=true;whiteList["padding-bottom"]=true;whiteList["padding-left"]=true;whiteList["padding-right"]=true;whiteList["padding-top"]=true;whiteList["page"]=false;whiteList["page-break-after"]=false;whiteList["page-break-before"]=false;whiteList["page-break-inside"]=false;whiteList["page-policy"]=false;whiteList["pause"]=false;whiteList["pause-after"]=false;whiteList["pause-before"]=false;whiteList["perspective"]=false;whiteList["perspective-origin"]=false;whiteList["pitch"]=false;whiteList["pitch-range"]=false;whiteList["play-during"]=false;whiteList["position"]=false;whiteList["presentation-level"]=false;whiteList["quotes"]=false;whiteList["region-fragment"]=false;whiteList["resize"]=false;whiteList["rest"]=false;whiteList["rest-after"]=false;whiteList["rest-before"]=false;whiteList["richness"]=false;whiteList["right"]=false;whiteList["rotation"]=false;whiteList["rotation-point"]=false;whiteList["ruby-align"]=false;whiteList["ruby-merge"]=false;whiteList["ruby-position"]=false;whiteList["shape-image-threshold"]=false;whiteList["shape-outside"]=false;whiteList["shape-margin"]=false;whiteList["size"]=false;whiteList["speak"]=false;whiteList["speak-as"]=false;whiteList["speak-header"]=false;whiteList["speak-numeral"]=false;whiteList["speak-punctuation"]=false;whiteList["speech-rate"]=false;whiteList["stress"]=false;whiteList["string-set"]=false;whiteList["tab-size"]=false;whiteList["table-layout"]=false;whiteList["text-align"]=true;whiteList["text-align-last"]=true;whiteList["text-combine-upright"]=true;whiteList["text-decoration"]=true;whiteList["text-decoration-color"]=true;whiteList["text-decoration-line"]=true;whiteList["text-decoration-skip"]=true;whiteList["text-decoration-style"]=true;whiteList["text-emphasis"]=true;whiteList["text-emphasis-color"]=true;whiteList["text-emphasis-position"]=true;whiteList["text-emphasis-style"]=true;whiteList["text-height"]=true;whiteList["text-indent"]=true;whiteList["text-justify"]=true;whiteList["text-orientation"]=true;whiteList["text-overflow"]=true;whiteList["text-shadow"]=true;whiteList["text-space-collapse"]=true;whiteList["text-transform"]=true;whiteList["text-underline-position"]=true;whiteList["text-wrap"]=true;whiteList["top"]=false;whiteList["transform"]=false;whiteList["transform-origin"]=false;whiteList["transform-style"]=false;whiteList["transition"]=false;whiteList["transition-delay"]=false;whiteList["transition-duration"]=false;whiteList["transition-property"]=false;whiteList["transition-timing-function"]=false;whiteList["unicode-bidi"]=false;whiteList["vertical-align"]=false;whiteList["visibility"]=false;whiteList["voice-balance"]=false;whiteList["voice-duration"]=false;whiteList["voice-family"]=false;whiteList["voice-pitch"]=false;whiteList["voice-range"]=false;whiteList["voice-rate"]=false;whiteList["voice-stress"]=false;whiteList["voice-volume"]=false;whiteList["volume"]=false;whiteList["white-space"]=false;whiteList["widows"]=false;whiteList["width"]=true;whiteList["will-change"]=false;whiteList["word-break"]=true;whiteList["word-spacing"]=true;whiteList["word-wrap"]=true;whiteList["wrap-flow"]=false;whiteList["wrap-through"]=false;whiteList["writing-mode"]=false;whiteList["z-index"]=false;return whiteList}function onAttr(name,value,options){}function onIgnoreAttr(name,value,options){}exports.whiteList=getDefaultWhiteList();exports.getDefaultWhiteList=getDefaultWhiteList;exports.onAttr=onAttr;exports.onIgnoreAttr=onIgnoreAttr},{}],8:[function(require,module,exports){var DEFAULT=require("./default");var FilterCSS=require("./css");function filterCSS(html,options){var xss=new FilterCSS(options);return xss.process(html)}exports=module.exports=filterCSS;exports.FilterCSS=FilterCSS;for(var i in DEFAULT)exports[i]=DEFAULT[i];if(typeof window!=="undefined"){window.filterCSS=module.exports}},{"./css":6,"./default":7}],9:[function(require,module,exports){var _=require("./util");function parseStyle(css,onAttr){css=_.trimRight(css);if(css[css.length-1]!==";")css+=";";var cssLength=css.length;var isParenthesisOpen=false;var lastPos=0;var i=0;var retCSS="";function addNewAttr(){if(!isParenthesisOpen){var source=_.trim(css.slice(lastPos,i));var j=source.indexOf(":");if(j!==-1){var name=_.trim(source.slice(0,j));var value=_.trim(source.slice(j+1));if(name){var ret=onAttr(lastPos,retCSS.length,name,value,source);if(ret)retCSS+=ret+"; "}}}lastPos=i+1}for(;i<cssLength;i++){var c=css[i];if(c==="/"&&css[i+1]==="*"){var j=css.indexOf("*/",i+2);if(j===-1)break;i=j+1;lastPos=i+1;isParenthesisOpen=false}else if(c==="("){isParenthesisOpen=true}else if(c===")"){isParenthesisOpen=false}else if(c===";"){if(isParenthesisOpen){}else{addNewAttr()}}else if(c==="\n"){addNewAttr()}}return _.trim(retCSS)}module.exports=parseStyle},{"./util":10}],10:[function(require,module,exports){module.exports={indexOf:function(arr,item){var i,j;if(Array.prototype.indexOf){return arr.indexOf(item)}for(i=0,j=arr.length;i<j;i++){if(arr[i]===item){return i}}return-1},forEach:function(arr,fn,scope){var i,j;if(Array.prototype.forEach){return arr.forEach(fn,scope)}for(i=0,j=arr.length;i<j;i++){fn.call(scope,arr[i],i,arr)}},trim:function(str){if(String.prototype.trim){return str.trim()}return str.replace(/(^\s*)|(\s*$)/g,"")},trimRight:function(str){if(String.prototype.trimRight){return str.trimRight()}return str.replace(/(\s*$)/g,"")}}},{}]},{},[2]);
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.js
new file mode 100644
index 0000000..1d5d868
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.js
@@ -0,0 +1,1256 @@
+/*!
+* ZeroClipboard
+* The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.
+* Copyright (c) 2014 Jon Rohan, James M. Greene
+* Licensed MIT
+* http://zeroclipboard.org/
+* v2.0.0-beta.5
+*/
+(function(window) {
+  "use strict";
+  var _currentElement;
+  var _flashState = {
+    bridge: null,
+    version: "0.0.0",
+    pluginType: "unknown",
+    disabled: null,
+    outdated: null,
+    unavailable: null,
+    deactivated: null,
+    overdue: null,
+    ready: null
+  };
+  var _clipData = {};
+  var _clipDataFormatMap = null;
+  var _clientIdCounter = 0;
+  var _clientMeta = {};
+  var _elementIdCounter = 0;
+  var _elementMeta = {};
+  var _swfPath = function() {
+    var i, jsDir, tmpJsPath, jsPath, swfPath = "ZeroClipboard.swf";
+    if (!(document.currentScript && (jsPath = document.currentScript.src))) {
+      var scripts = document.getElementsByTagName("script");
+      if ("readyState" in scripts[0]) {
+        for (i = scripts.length; i--; ) {
+          if (scripts[i].readyState === "interactive" && (jsPath = scripts[i].src)) {
+            break;
+          }
+        }
+      } else if (document.readyState === "loading") {
+        jsPath = scripts[scripts.length - 1].src;
+      } else {
+        for (i = scripts.length; i--; ) {
+          tmpJsPath = scripts[i].src;
+          if (!tmpJsPath) {
+            jsDir = null;
+            break;
+          }
+          tmpJsPath = tmpJsPath.split("#")[0].split("?")[0];
+          tmpJsPath = tmpJsPath.slice(0, tmpJsPath.lastIndexOf("/") + 1);
+          if (jsDir == null) {
+            jsDir = tmpJsPath;
+          } else if (jsDir !== tmpJsPath) {
+            jsDir = null;
+            break;
+          }
+        }
+        if (jsDir !== null) {
+          jsPath = jsDir;
+        }
+      }
+    }
+    if (jsPath) {
+      jsPath = jsPath.split("#")[0].split("?")[0];
+      swfPath = jsPath.slice(0, jsPath.lastIndexOf("/") + 1) + swfPath;
+    }
+    return swfPath;
+  }();
+  var _camelizeCssPropName = function() {
+    var matcherRegex = /\-([a-z])/g, replacerFn = function(match, group) {
+      return group.toUpperCase();
+    };
+    return function(prop) {
+      return prop.replace(matcherRegex, replacerFn);
+    };
+  }();
+  var _getStyle = function(el, prop) {
+    var value, camelProp, tagName;
+    if (window.getComputedStyle) {
+      value = window.getComputedStyle(el, null).getPropertyValue(prop);
+    } else {
+      camelProp = _camelizeCssPropName(prop);
+      if (el.currentStyle) {
+        value = el.currentStyle[camelProp];
+      } else {
+        value = el.style[camelProp];
+      }
+    }
+    if (prop === "cursor") {
+      if (!value || value === "auto") {
+        tagName = el.tagName.toLowerCase();
+        if (tagName === "a") {
+          return "pointer";
+        }
+      }
+    }
+    return value;
+  };
+  var _elementMouseOver = function(event) {
+    if (!event) {
+      event = window.event;
+    }
+    var target;
+    if (this !== window) {
+      target = this;
+    } else if (event.target) {
+      target = event.target;
+    } else if (event.srcElement) {
+      target = event.srcElement;
+    }
+    ZeroClipboard.activate(target);
+  };
+  var _addEventHandler = function(element, method, func) {
+    if (!element || element.nodeType !== 1) {
+      return;
+    }
+    if (element.addEventListener) {
+      element.addEventListener(method, func, false);
+    } else if (element.attachEvent) {
+      element.attachEvent("on" + method, func);
+    }
+  };
+  var _removeEventHandler = function(element, method, func) {
+    if (!element || element.nodeType !== 1) {
+      return;
+    }
+    if (element.removeEventListener) {
+      element.removeEventListener(method, func, false);
+    } else if (element.detachEvent) {
+      element.detachEvent("on" + method, func);
+    }
+  };
+  var _addClass = function(element, value) {
+    if (!element || element.nodeType !== 1) {
+      return element;
+    }
+    if (element.classList) {
+      if (!element.classList.contains(value)) {
+        element.classList.add(value);
+      }
+      return element;
+    }
+    if (value && typeof value === "string") {
+      var classNames = (value || "").split(/\s+/);
+      if (element.nodeType === 1) {
+        if (!element.className) {
+          element.className = value;
+        } else {
+          var className = " " + element.className + " ", setClass = element.className;
+          for (var c = 0, cl = classNames.length; c < cl; c++) {
+            if (className.indexOf(" " + classNames[c] + " ") < 0) {
+              setClass += " " + classNames[c];
+            }
+          }
+          element.className = setClass.replace(/^\s+|\s+$/g, "");
+        }
+      }
+    }
+    return element;
+  };
+  var _removeClass = function(element, value) {
+    if (!element || element.nodeType !== 1) {
+      return element;
+    }
+    if (element.classList) {
+      if (element.classList.contains(value)) {
+        element.classList.remove(value);
+      }
+      return element;
+    }
+    if (value && typeof value === "string" || value === undefined) {
+      var classNames = (value || "").split(/\s+/);
+      if (element.nodeType === 1 && element.className) {
+        if (value) {
+          var className = (" " + element.className + " ").replace(/[\n\t]/g, " ");
+          for (var c = 0, cl = classNames.length; c < cl; c++) {
+            className = className.replace(" " + classNames[c] + " ", " ");
+          }
+          element.className = className.replace(/^\s+|\s+$/g, "");
+        } else {
+          element.className = "";
+        }
+      }
+    }
+    return element;
+  };
+  var _getZoomFactor = function() {
+    var rect, physicalWidth, logicalWidth, zoomFactor = 1;
+    if (typeof document.body.getBoundingClientRect === "function") {
+      rect = document.body.getBoundingClientRect();
+      physicalWidth = rect.right - rect.left;
+      logicalWidth = document.body.offsetWidth;
+      zoomFactor = Math.round(physicalWidth / logicalWidth * 100) / 100;
+    }
+    return zoomFactor;
+  };
+  var _getDOMObjectPosition = function(obj, defaultZIndex) {
+    var info = {
+      left: 0,
+      top: 0,
+      width: 0,
+      height: 0,
+      zIndex: _getSafeZIndex(defaultZIndex) - 1
+    };
+    if (obj.getBoundingClientRect) {
+      var rect = obj.getBoundingClientRect();
+      var pageXOffset, pageYOffset, zoomFactor;
+      if ("pageXOffset" in window && "pageYOffset" in window) {
+        pageXOffset = window.pageXOffset;
+        pageYOffset = window.pageYOffset;
+      } else {
+        zoomFactor = _getZoomFactor();
+        pageXOffset = Math.round(document.documentElement.scrollLeft / zoomFactor);
+        pageYOffset = Math.round(document.documentElement.scrollTop / zoomFactor);
+      }
+      var leftBorderWidth = document.documentElement.clientLeft || 0;
+      var topBorderWidth = document.documentElement.clientTop || 0;
+      info.left = rect.left + pageXOffset - leftBorderWidth;
+      info.top = rect.top + pageYOffset - topBorderWidth;
+      info.width = "width" in rect ? rect.width : rect.right - rect.left;
+      info.height = "height" in rect ? rect.height : rect.bottom - rect.top;
+    }
+    return info;
+  };
+  var _cacheBust = function(path, options) {
+    var cacheBust = options == null || options && options.cacheBust === true;
+    if (cacheBust) {
+      return (path.indexOf("?") === -1 ? "?" : "&") + "noCache=" + new Date().getTime();
+    } else {
+      return "";
+    }
+  };
+  var _vars = function(options) {
+    var i, len, domain, domains, str = "", trustedOriginsExpanded = [];
+    if (options.trustedDomains) {
+      if (typeof options.trustedDomains === "string") {
+        domains = [ options.trustedDomains ];
+      } else if (typeof options.trustedDomains === "object" && "length" in options.trustedDomains) {
+        domains = options.trustedDomains;
+      }
+    }
+    if (domains && domains.length) {
+      for (i = 0, len = domains.length; i < len; i++) {
+        if (domains.hasOwnProperty(i) && domains[i] && typeof domains[i] === "string") {
+          domain = _extractDomain(domains[i]);
+          if (!domain) {
+            continue;
+          }
+          if (domain === "*") {
+            trustedOriginsExpanded = [ domain ];
+            break;
+          }
+          trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [ domain, "//" + domain, window.location.protocol + "//" + domain ]);
+        }
+      }
+    }
+    if (trustedOriginsExpanded.length) {
+      str += "trustedOrigins=" + encodeURIComponent(trustedOriginsExpanded.join(","));
+    }
+    if (options.forceEnhancedClipboard === true) {
+      str += (str ? "&" : "") + "forceEnhancedClipboard=true";
+    }
+    return str;
+  };
+  var _inArray = function(elem, array, fromIndex) {
+    if (typeof array.indexOf === "function") {
+      return array.indexOf(elem, fromIndex);
+    }
+    var i, len = array.length;
+    if (typeof fromIndex === "undefined") {
+      fromIndex = 0;
+    } else if (fromIndex < 0) {
+      fromIndex = len + fromIndex;
+    }
+    for (i = fromIndex; i < len; i++) {
+      if (array.hasOwnProperty(i) && array[i] === elem) {
+        return i;
+      }
+    }
+    return -1;
+  };
+  var _prepClip = function(elements) {
+    if (typeof elements === "string") {
+      throw new TypeError("ZeroClipboard doesn't accept query strings.");
+    }
+    return typeof elements.length !== "number" ? [ elements ] : elements;
+  };
+  var _dispatchCallback = function(func, context, args, async) {
+    if (async) {
+      window.setTimeout(function() {
+        func.apply(context, args);
+      }, 0);
+    } else {
+      func.apply(context, args);
+    }
+  };
+  var _getSafeZIndex = function(val) {
+    var zIndex, tmp;
+    if (val) {
+      if (typeof val === "number" && val > 0) {
+        zIndex = val;
+      } else if (typeof val === "string" && (tmp = parseInt(val, 10)) && !isNaN(tmp) && tmp > 0) {
+        zIndex = tmp;
+      }
+    }
+    if (!zIndex) {
+      if (typeof _globalConfig.zIndex === "number" && _globalConfig.zIndex > 0) {
+        zIndex = _globalConfig.zIndex;
+      } else if (typeof _globalConfig.zIndex === "string" && (tmp = parseInt(_globalConfig.zIndex, 10)) && !isNaN(tmp) && tmp > 0) {
+        zIndex = tmp;
+      }
+    }
+    return zIndex || 0;
+  };
+  var _extend = function() {
+    var i, len, arg, prop, src, copy, target = arguments[0] || {};
+    for (i = 1, len = arguments.length; i < len; i++) {
+      if ((arg = arguments[i]) != null) {
+        for (prop in arg) {
+          if (arg.hasOwnProperty(prop)) {
+            src = target[prop];
+            copy = arg[prop];
+            if (target === copy) {
+              continue;
+            }
+            if (copy !== undefined) {
+              target[prop] = copy;
+            }
+          }
+        }
+      }
+    }
+    return target;
+  };
+  var _extractDomain = function(originOrUrl) {
+    if (originOrUrl == null || originOrUrl === "") {
+      return null;
+    }
+    originOrUrl = originOrUrl.replace(/^\s+|\s+$/g, "");
+    if (originOrUrl === "") {
+      return null;
+    }
+    var protocolIndex = originOrUrl.indexOf("//");
+    originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2);
+    var pathIndex = originOrUrl.indexOf("/");
+    originOrUrl = pathIndex === -1 ? originOrUrl : protocolIndex === -1 || pathIndex === 0 ? null : originOrUrl.slice(0, pathIndex);
+    if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === ".swf") {
+      return null;
+    }
+    return originOrUrl || null;
+  };
+  var _determineScriptAccess = function() {
+    var _extractAllDomains = function(origins, resultsArray) {
+      var i, len, tmp;
+      if (origins == null || resultsArray[0] === "*") {
+        return;
+      }
+      if (typeof origins === "string") {
+        origins = [ origins ];
+      }
+      if (!(typeof origins === "object" && typeof origins.length === "number")) {
+        return;
+      }
+      for (i = 0, len = origins.length; i < len; i++) {
+        if (origins.hasOwnProperty(i) && (tmp = _extractDomain(origins[i]))) {
+          if (tmp === "*") {
+            resultsArray.length = 0;
+            resultsArray.push("*");
+            break;
+          }
+          if (_inArray(tmp, resultsArray) === -1) {
+            resultsArray.push(tmp);
+          }
+        }
+      }
+    };
+    return function(currentDomain, configOptions) {
+      var swfDomain = _extractDomain(configOptions.swfPath);
+      if (swfDomain === null) {
+        swfDomain = currentDomain;
+      }
+      var trustedDomains = [];
+      _extractAllDomains(configOptions.trustedOrigins, trustedDomains);
+      _extractAllDomains(configOptions.trustedDomains, trustedDomains);
+      var len = trustedDomains.length;
+      if (len > 0) {
+        if (len === 1 && trustedDomains[0] === "*") {
+          return "always";
+        }
+        if (_inArray(currentDomain, trustedDomains) !== -1) {
+          if (len === 1 && currentDomain === swfDomain) {
+            return "sameDomain";
+          }
+          return "always";
+        }
+      }
+      return "never";
+    };
+  }();
+  var _objectKeys = function(obj) {
+    if (obj == null) {
+      return [];
+    }
+    if (Object.keys) {
+      return Object.keys(obj);
+    }
+    var keys = [];
+    for (var prop in obj) {
+      if (obj.hasOwnProperty(prop)) {
+        keys.push(prop);
+      }
+    }
+    return keys;
+  };
+  var _deleteOwnProperties = function(obj) {
+    if (obj) {
+      for (var prop in obj) {
+        if (obj.hasOwnProperty(prop)) {
+          delete obj[prop];
+        }
+      }
+    }
+    return obj;
+  };
+  var _safeActiveElement = function() {
+    try {
+      return document.activeElement;
+    } catch (err) {}
+    return null;
+  };
+  var _pick = function(obj, keys) {
+    var newObj = {};
+    for (var i = 0, len = keys.length; i < len; i++) {
+      if (keys[i] in obj) {
+        newObj[keys[i]] = obj[keys[i]];
+      }
+    }
+    return newObj;
+  };
+  var _omit = function(obj, keys) {
+    var newObj = {};
+    for (var prop in obj) {
+      if (_inArray(prop, keys) === -1) {
+        newObj[prop] = obj[prop];
+      }
+    }
+    return newObj;
+  };
+  var _mapClipDataToFlash = function(clipData) {
+    var newClipData = {}, formatMap = {};
+    if (!(typeof clipData === "object" && clipData)) {
+      return;
+    }
+    for (var dataFormat in clipData) {
+      if (dataFormat && clipData.hasOwnProperty(dataFormat) && typeof clipData[dataFormat] === "string" && clipData[dataFormat]) {
+        switch (dataFormat.toLowerCase()) {
+         case "text/plain":
+         case "text":
+         case "air:text":
+         case "flash:text":
+          newClipData.text = clipData[dataFormat];
+          formatMap.text = dataFormat;
+          break;
+
+         case "text/html":
+         case "html":
+         case "air:html":
+         case "flash:html":
+          newClipData.html = clipData[dataFormat];
+          formatMap.html = dataFormat;
+          break;
+
+         case "application/rtf":
+         case "text/rtf":
+         case "rtf":
+         case "richtext":
+         case "air:rtf":
+         case "flash:rtf":
+          newClipData.rtf = clipData[dataFormat];
+          formatMap.rtf = dataFormat;
+          break;
+
+         default:
+          break;
+        }
+      }
+    }
+    return {
+      data: newClipData,
+      formatMap: formatMap
+    };
+  };
+  var _mapClipResultsFromFlash = function(clipResults, formatMap) {
+    if (!(typeof clipResults === "object" && clipResults && typeof formatMap === "object" && formatMap)) {
+      return clipResults;
+    }
+    var newResults = {};
+    for (var prop in clipResults) {
+      if (clipResults.hasOwnProperty(prop)) {
+        if (prop !== "success" && prop !== "data") {
+          newResults[prop] = clipResults[prop];
+          continue;
+        }
+        newResults[prop] = {};
+        var tmpHash = clipResults[prop];
+        for (var dataFormat in tmpHash) {
+          if (dataFormat && tmpHash.hasOwnProperty(dataFormat) && formatMap.hasOwnProperty(dataFormat)) {
+            newResults[prop][formatMap[dataFormat]] = tmpHash[dataFormat];
+          }
+        }
+      }
+    }
+    return newResults;
+  };
+  var _args = function(arraySlice) {
+    return function(args) {
+      return arraySlice.call(args, 0);
+    };
+  }(window.Array.prototype.slice);
+  var _detectFlashSupport = function() {
+    var plugin, ax, mimeType, hasFlash = false, isActiveX = false, isPPAPI = false, flashVersion = "";
+    function parseFlashVersion(desc) {
+      var matches = desc.match(/[\d]+/g);
+      matches.length = 3;
+      return matches.join(".");
+    }
+    function isPepperFlash(flashPlayerFileName) {
+      return !!flashPlayerFileName && (flashPlayerFileName = flashPlayerFileName.toLowerCase()) && (/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(flashPlayerFileName) || flashPlayerFileName.slice(-13) === "chrome.plugin");
+    }
+    function inspectPlugin(plugin) {
+      if (plugin) {
+        hasFlash = true;
+        if (plugin.version) {
+          flashVersion = parseFlashVersion(plugin.version);
+        }
+        if (!flashVersion && plugin.description) {
+          flashVersion = parseFlashVersion(plugin.description);
+        }
+        if (plugin.filename) {
+          isPPAPI = isPepperFlash(plugin.filename);
+        }
+      }
+    }
+    if (navigator.plugins && navigator.plugins.length) {
+      plugin = navigator.plugins["Shockwave Flash"];
+      inspectPlugin(plugin);
+      if (navigator.plugins["Shockwave Flash 2.0"]) {
+        hasFlash = true;
+        flashVersion = "2.0.0.11";
+      }
+    } else if (navigator.mimeTypes && navigator.mimeTypes.length) {
+      mimeType = navigator.mimeTypes["application/x-shockwave-flash"];
+      plugin = mimeType && mimeType.enabledPlugin;
+      inspectPlugin(plugin);
+    } else if (typeof ActiveXObject !== "undefined") {
+      isActiveX = true;
+      try {
+        ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
+        hasFlash = true;
+        flashVersion = parseFlashVersion(ax.GetVariable("$version"));
+      } catch (e1) {
+        try {
+          ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
+          hasFlash = true;
+          flashVersion = "6.0.21";
+        } catch (e2) {
+          try {
+            ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
+            hasFlash = true;
+            flashVersion = parseFlashVersion(ax.GetVariable("$version"));
+          } catch (e3) {
+            isActiveX = false;
+          }
+        }
+      }
+    }
+    _flashState.disabled = hasFlash !== true;
+    _flashState.outdated = flashVersion && parseFloat(flashVersion) < 11;
+    _flashState.version = flashVersion || "0.0.0";
+    _flashState.pluginType = isPPAPI ? "pepper" : isActiveX ? "activex" : hasFlash ? "netscape" : "unknown";
+  };
+  _detectFlashSupport();
+  var ZeroClipboard = function(elements) {
+    if (!(this instanceof ZeroClipboard)) {
+      return new ZeroClipboard(elements);
+    }
+    this.id = "" + _clientIdCounter++;
+    _clientMeta[this.id] = {
+      instance: this,
+      elements: [],
+      handlers: {}
+    };
+    if (elements) {
+      this.clip(elements);
+    }
+    if (typeof _flashState.ready !== "boolean") {
+      _flashState.ready = false;
+    }
+    if (!ZeroClipboard.isFlashUnusable() && _flashState.bridge === null) {
+      var _client = this;
+      var maxWait = _globalConfig.flashLoadTimeout;
+      if (typeof maxWait === "number" && maxWait >= 0) {
+        setTimeout(function() {
+          if (typeof _flashState.deactivated !== "boolean") {
+            _flashState.deactivated = true;
+          }
+          if (_flashState.deactivated === true) {
+            ZeroClipboard.emit({
+              type: "error",
+              name: "flash-deactivated",
+              client: _client
+            });
+          }
+        }, maxWait);
+      }
+      _flashState.overdue = false;
+      _bridge();
+    }
+  };
+  ZeroClipboard.prototype.setText = function(text) {
+    ZeroClipboard.setData("text/plain", text);
+    return this;
+  };
+  ZeroClipboard.prototype.setHtml = function(html) {
+    ZeroClipboard.setData("text/html", html);
+    return this;
+  };
+  ZeroClipboard.prototype.setRichText = function(richText) {
+    ZeroClipboard.setData("application/rtf", richText);
+    return this;
+  };
+  ZeroClipboard.prototype.setData = function() {
+    ZeroClipboard.setData.apply(ZeroClipboard, _args(arguments));
+    return this;
+  };
+  ZeroClipboard.prototype.clearData = function() {
+    ZeroClipboard.clearData.apply(ZeroClipboard, _args(arguments));
+    return this;
+  };
+  ZeroClipboard.prototype.setSize = function(width, height) {
+    _setSize(width, height);
+    return this;
+  };
+  var _setHandCursor = function(enabled) {
+    if (_flashState.ready === true && _flashState.bridge && typeof _flashState.bridge.setHandCursor === "function") {
+      _flashState.bridge.setHandCursor(enabled);
+    } else {
+      _flashState.ready = false;
+    }
+  };
+  ZeroClipboard.prototype.destroy = function() {
+    this.unclip();
+    this.off();
+    delete _clientMeta[this.id];
+  };
+  var _getAllClients = function() {
+    var i, len, client, clients = [], clientIds = _objectKeys(_clientMeta);
+    for (i = 0, len = clientIds.length; i < len; i++) {
+      client = _clientMeta[clientIds[i]].instance;
+      if (client && client instanceof ZeroClipboard) {
+        clients.push(client);
+      }
+    }
+    return clients;
+  };
+  ZeroClipboard.version = "2.0.0-beta.5";
+  var _globalConfig = {
+    swfPath: _swfPath,
+    trustedDomains: window.location.host ? [ window.location.host ] : [],
+    cacheBust: true,
+    forceHandCursor: false,
+    forceEnhancedClipboard: false,
+    zIndex: 999999999,
+    debug: false,
+    title: null,
+    autoActivate: true,
+    flashLoadTimeout: 3e4
+  };
+  ZeroClipboard.isFlashUnusable = function() {
+    return !!(_flashState.disabled || _flashState.outdated || _flashState.unavailable || _flashState.deactivated);
+  };
+  ZeroClipboard.config = function(options) {
+    if (typeof options === "object" && options !== null) {
+      _extend(_globalConfig, options);
+    }
+    if (typeof options === "string" && options) {
+      if (_globalConfig.hasOwnProperty(options)) {
+        return _globalConfig[options];
+      }
+      return;
+    }
+    var copy = {};
+    for (var prop in _globalConfig) {
+      if (_globalConfig.hasOwnProperty(prop)) {
+        if (typeof _globalConfig[prop] === "object" && _globalConfig[prop] !== null) {
+          if ("length" in _globalConfig[prop]) {
+            copy[prop] = _globalConfig[prop].slice(0);
+          } else {
+            copy[prop] = _extend({}, _globalConfig[prop]);
+          }
+        } else {
+          copy[prop] = _globalConfig[prop];
+        }
+      }
+    }
+    return copy;
+  };
+  ZeroClipboard.destroy = function() {
+    ZeroClipboard.deactivate();
+    for (var clientId in _clientMeta) {
+      if (_clientMeta.hasOwnProperty(clientId) && _clientMeta[clientId]) {
+        var client = _clientMeta[clientId].instance;
+        if (client && typeof client.destroy === "function") {
+          client.destroy();
+        }
+      }
+    }
+    var flashBridge = _flashState.bridge;
+    if (flashBridge) {
+      var htmlBridge = _getHtmlBridge(flashBridge);
+      if (htmlBridge) {
+        if (_flashState.pluginType === "activex" && "readyState" in flashBridge) {
+          flashBridge.style.display = "none";
+          (function removeSwfFromIE() {
+            if (flashBridge.readyState === 4) {
+              for (var prop in flashBridge) {
+                if (typeof flashBridge[prop] === "function") {
+                  flashBridge[prop] = null;
+                }
+              }
+              flashBridge.parentNode.removeChild(flashBridge);
+              if (htmlBridge.parentNode) {
+                htmlBridge.parentNode.removeChild(htmlBridge);
+              }
+            } else {
+              setTimeout(removeSwfFromIE, 10);
+            }
+          })();
+        } else {
+          flashBridge.parentNode.removeChild(flashBridge);
+          if (htmlBridge.parentNode) {
+            htmlBridge.parentNode.removeChild(htmlBridge);
+          }
+        }
+      }
+      _flashState.ready = null;
+      _flashState.bridge = null;
+      _flashState.deactivated = null;
+    }
+    ZeroClipboard.clearData();
+  };
+  ZeroClipboard.activate = function(element) {
+    if (_currentElement) {
+      _removeClass(_currentElement, _globalConfig.hoverClass);
+      _removeClass(_currentElement, _globalConfig.activeClass);
+    }
+    _currentElement = element;
+    _addClass(element, _globalConfig.hoverClass);
+    _reposition();
+    var newTitle = _globalConfig.title || element.getAttribute("title");
+    if (newTitle) {
+      var htmlBridge = _getHtmlBridge(_flashState.bridge);
+      if (htmlBridge) {
+        htmlBridge.setAttribute("title", newTitle);
+      }
+    }
+    var useHandCursor = _globalConfig.forceHandCursor === true || _getStyle(element, "cursor") === "pointer";
+    _setHandCursor(useHandCursor);
+  };
+  ZeroClipboard.deactivate = function() {
+    var htmlBridge = _getHtmlBridge(_flashState.bridge);
+    if (htmlBridge) {
+      htmlBridge.removeAttribute("title");
+      htmlBridge.style.left = "0px";
+      htmlBridge.style.top = "-9999px";
+      _setSize(1, 1);
+    }
+    if (_currentElement) {
+      _removeClass(_currentElement, _globalConfig.hoverClass);
+      _removeClass(_currentElement, _globalConfig.activeClass);
+      _currentElement = null;
+    }
+  };
+  ZeroClipboard.state = function() {
+    return {
+      browser: _pick(window.navigator, [ "userAgent", "platform", "appName" ]),
+      flash: _omit(_flashState, [ "bridge" ]),
+      zeroclipboard: {
+        version: ZeroClipboard.version,
+        config: ZeroClipboard.config()
+      }
+    };
+  };
+  ZeroClipboard.setData = function(format, data) {
+    var dataObj;
+    if (typeof format === "object" && format && typeof data === "undefined") {
+      dataObj = format;
+      ZeroClipboard.clearData();
+    } else if (typeof format === "string" && format) {
+      dataObj = {};
+      dataObj[format] = data;
+    } else {
+      return;
+    }
+    for (var dataFormat in dataObj) {
+      if (dataFormat && dataObj.hasOwnProperty(dataFormat) && typeof dataObj[dataFormat] === "string" && dataObj[dataFormat]) {
+        _clipData[dataFormat] = dataObj[dataFormat];
+      }
+    }
+  };
+  ZeroClipboard.clearData = function(format) {
+    if (typeof format === "undefined") {
+      _deleteOwnProperties(_clipData);
+      _clipDataFormatMap = null;
+    } else if (typeof format === "string" && _clipData.hasOwnProperty(format)) {
+      delete _clipData[format];
+    }
+  };
+  var _bridge = function() {
+    var flashBridge, len;
+    var container = document.getElementById("global-zeroclipboard-html-bridge");
+    if (!container) {
+      var allowScriptAccess = _determineScriptAccess(window.location.host, _globalConfig);
+      var allowNetworking = allowScriptAccess === "never" ? "none" : "all";
+      var flashvars = _vars(_globalConfig);
+      var swfUrl = _globalConfig.swfPath + _cacheBust(_globalConfig.swfPath, _globalConfig);
+      container = _createHtmlBridge();
+      var divToBeReplaced = document.createElement("div");
+      container.appendChild(divToBeReplaced);
+      document.body.appendChild(container);
+      var tmpDiv = document.createElement("div");
+      var oldIE = _flashState.pluginType === "activex";
+      tmpDiv.innerHTML = '<object id="global-zeroclipboard-flash-bridge" name="global-zeroclipboard-flash-bridge" ' + 'width="100%" height="100%" ' + (oldIE ? 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"' : 'type="application/x-shockwave-flash" data="' + swfUrl + '"') + ">" + (oldIE ? '<param name="movie" value="' + swfUrl + '"/>' : "") + '<param name="allowScriptAccess" value="' + allowScriptAccess + '"/>' + '<param name="allowNetworking" value="' + allowNetworking + '"/>' + '<param name="menu" value="false"/>' + '<param name="wmode" value="transparent"/>' + '<param name="flashvars" value="' + flashvars + '"/>' + "</object>";
+      flashBridge = tmpDiv.firstChild;
+      tmpDiv = null;
+      flashBridge.ZeroClipboard = ZeroClipboard;
+      container.replaceChild(flashBridge, divToBeReplaced);
+    }
+    if (!flashBridge) {
+      flashBridge = document["global-zeroclipboard-flash-bridge"];
+      if (flashBridge && (len = flashBridge.length)) {
+        flashBridge = flashBridge[len - 1];
+      }
+      if (!flashBridge) {
+        flashBridge = container.firstChild;
+      }
+    }
+    _flashState.bridge = flashBridge || null;
+  };
+  var _createHtmlBridge = function() {
+    var container = document.createElement("div");
+    container.id = "global-zeroclipboard-html-bridge";
+    container.className = "global-zeroclipboard-container";
+    container.style.position = "absolute";
+    container.style.left = "0px";
+    container.style.top = "-9999px";
+    container.style.width = "1px";
+    container.style.height = "1px";
+    container.style.zIndex = "" + _getSafeZIndex(_globalConfig.zIndex);
+    return container;
+  };
+  var _getHtmlBridge = function(flashBridge) {
+    var htmlBridge = flashBridge && flashBridge.parentNode;
+    while (htmlBridge && htmlBridge.nodeName === "OBJECT" && htmlBridge.parentNode) {
+      htmlBridge = htmlBridge.parentNode;
+    }
+    return htmlBridge || null;
+  };
+  var _reposition = function() {
+    if (_currentElement) {
+      var pos = _getDOMObjectPosition(_currentElement, _globalConfig.zIndex);
+      var htmlBridge = _getHtmlBridge(_flashState.bridge);
+      if (htmlBridge) {
+        htmlBridge.style.top = pos.top + "px";
+        htmlBridge.style.left = pos.left + "px";
+        htmlBridge.style.width = pos.width + "px";
+        htmlBridge.style.height = pos.height + "px";
+        htmlBridge.style.zIndex = pos.zIndex + 1;
+      }
+      _setSize(pos.width, pos.height);
+    }
+  };
+  var _setSize = function(width, height) {
+    var htmlBridge = _getHtmlBridge(_flashState.bridge);
+    if (htmlBridge) {
+      htmlBridge.style.width = width + "px";
+      htmlBridge.style.height = height + "px";
+    }
+  };
+  ZeroClipboard.emit = function(event) {
+    var eventType, eventObj, performCallbackAsync, clients, i, len, eventCopy, returnVal, tmp;
+    if (typeof event === "string" && event) {
+      eventType = event;
+    }
+    if (typeof event === "object" && event && typeof event.type === "string" && event.type) {
+      eventType = event.type;
+      eventObj = event;
+    }
+    if (!eventType) {
+      return;
+    }
+    event = _createEvent(eventType, eventObj);
+    _preprocessEvent(event);
+    if (event.type === "ready" && _flashState.overdue === true) {
+      return ZeroClipboard.emit({
+        type: "error",
+        name: "flash-overdue"
+      });
+    }
+    performCallbackAsync = !/^(before)?copy$/.test(event.type);
+    if (event.client) {
+      _dispatchClientCallbacks.call(event.client, event, performCallbackAsync);
+    } else {
+      clients = event.target && event.target !== window && _globalConfig.autoActivate === true ? _getAllClientsClippedToElement(event.target) : _getAllClients();
+      for (i = 0, len = clients.length; i < len; i++) {
+        eventCopy = _extend({}, event, {
+          client: clients[i]
+        });
+        _dispatchClientCallbacks.call(clients[i], eventCopy, performCallbackAsync);
+      }
+    }
+    if (event.type === "copy") {
+      tmp = _mapClipDataToFlash(_clipData);
+      returnVal = tmp.data;
+      _clipDataFormatMap = tmp.formatMap;
+    }
+    return returnVal;
+  };
+  var _dispatchClientCallbacks = function(event, async) {
+    var handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers[event.type];
+    if (handlers && handlers.length) {
+      var i, len, func, context, originalContext = this;
+      for (i = 0, len = handlers.length; i < len; i++) {
+        func = handlers[i];
+        context = originalContext;
+        if (typeof func === "string" && typeof window[func] === "function") {
+          func = window[func];
+        }
+        if (typeof func === "object" && func && typeof func.handleEvent === "function") {
+          context = func;
+          func = func.handleEvent;
+        }
+        if (typeof func === "function") {
+          _dispatchCallback(func, context, [ event ], async);
+        }
+      }
+    }
+    return this;
+  };
+  var _eventMessages = {
+    ready: "Flash communication is established",
+    error: {
+      "flash-disabled": "Flash is disabled or not installed",
+      "flash-outdated": "Flash is too outdated to support ZeroClipboard",
+      "flash-unavailable": "Flash is unable to communicate bidirectionally with JavaScript",
+      "flash-deactivated": "Flash is too outdated for your browser and/or is configured as click-to-activate",
+      "flash-overdue": "Flash communication was established but NOT within the acceptable time limit"
+    }
+  };
+  var _createEvent = function(eventType, event) {
+    if (!(eventType || event && event.type)) {
+      return;
+    }
+    event = event || {};
+    eventType = (eventType || event.type).toLowerCase();
+    _extend(event, {
+      type: eventType,
+      target: event.target || _currentElement || null,
+      relatedTarget: event.relatedTarget || null,
+      currentTarget: _flashState && _flashState.bridge || null
+    });
+    var msg = _eventMessages[event.type];
+    if (event.type === "error" && event.name && msg) {
+      msg = msg[event.name];
+    }
+    if (msg) {
+      event.message = msg;
+    }
+    if (event.type === "ready") {
+      _extend(event, {
+        target: null,
+        version: _flashState.version
+      });
+    }
+    if (event.type === "error") {
+      event.target = null;
+      if (/^flash-(outdated|unavailable|deactivated|overdue)$/.test(event.name)) {
+        _extend(event, {
+          version: _flashState.version,
+          minimumVersion: "11.0.0"
+        });
+      }
+    }
+    if (event.type === "copy") {
+      event.clipboardData = {
+        setData: ZeroClipboard.setData,
+        clearData: ZeroClipboard.clearData
+      };
+    }
+    if (event.type === "aftercopy") {
+      event = _mapClipResultsFromFlash(event, _clipDataFormatMap);
+    }
+    if (event.target && !event.relatedTarget) {
+      event.relatedTarget = _getRelatedTarget(event.target);
+    }
+    return event;
+  };
+  var _getRelatedTarget = function(targetEl) {
+    var relatedTargetId = targetEl && targetEl.getAttribute && targetEl.getAttribute("data-clipboard-target");
+    return relatedTargetId ? document.getElementById(relatedTargetId) : null;
+  };
+  var _preprocessEvent = function(event) {
+    var element = event.target || _currentElement;
+    switch (event.type) {
+     case "error":
+      if (_inArray(event.name, [ "flash-disabled", "flash-outdated", "flash-deactivated", "flash-overdue" ])) {
+        _extend(_flashState, {
+          disabled: event.name === "flash-disabled",
+          outdated: event.name === "flash-outdated",
+          unavailable: event.name === "flash-unavailable",
+          deactivated: event.name === "flash-deactivated",
+          overdue: event.name === "flash-overdue",
+          ready: false
+        });
+      }
+      break;
+
+     case "ready":
+      var wasDeactivated = _flashState.deactivated === true;
+      _extend(_flashState, {
+        disabled: false,
+        outdated: false,
+        unavailable: false,
+        deactivated: false,
+        overdue: wasDeactivated,
+        ready: !wasDeactivated
+      });
+      break;
+
+     case "copy":
+      var textContent, htmlContent, targetEl = event.relatedTarget;
+      if (!(_clipData["text/html"] || _clipData["text/plain"]) && targetEl && (htmlContent = targetEl.value || targetEl.outerHTML || targetEl.innerHTML) && (textContent = targetEl.value || targetEl.textContent || targetEl.innerText)) {
+        event.clipboardData.clearData();
+        event.clipboardData.setData("text/plain", textContent);
+        if (htmlContent !== textContent) {
+          event.clipboardData.setData("text/html", htmlContent);
+        }
+      } else if (!_clipData["text/plain"] && event.target && (textContent = event.target.getAttribute("data-clipboard-text"))) {
+        event.clipboardData.clearData();
+        event.clipboardData.setData("text/plain", textContent);
+      }
+      break;
+
+     case "aftercopy":
+      ZeroClipboard.clearData();
+      if (element && element !== _safeActiveElement() && element.focus) {
+        element.focus();
+      }
+      break;
+
+     case "mouseover":
+      _addClass(element, _globalConfig.hoverClass);
+      break;
+
+     case "mouseout":
+      if (_globalConfig.autoActivate === true) {
+        ZeroClipboard.deactivate();
+      }
+      break;
+
+     case "mousedown":
+      _addClass(element, _globalConfig.activeClass);
+      break;
+
+     case "mouseup":
+      _removeClass(element, _globalConfig.activeClass);
+      break;
+    }
+  };
+  ZeroClipboard.prototype.on = function(eventName, func) {
+    var i, len, events, added = {}, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
+    if (typeof eventName === "string" && eventName) {
+      events = eventName.toLowerCase().split(/\s+/);
+    } else if (typeof eventName === "object" && eventName && typeof func === "undefined") {
+      for (i in eventName) {
+        if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") {
+          this.on(i, eventName[i]);
+        }
+      }
+    }
+    if (events && events.length) {
+      for (i = 0, len = events.length; i < len; i++) {
+        eventName = events[i].replace(/^on/, "");
+        added[eventName] = true;
+        if (!handlers[eventName]) {
+          handlers[eventName] = [];
+        }
+        handlers[eventName].push(func);
+      }
+      if (added.ready && _flashState.ready) {
+        ZeroClipboard.emit({
+          type: "ready",
+          client: this
+        });
+      }
+      if (added.error) {
+        var errorTypes = [ "disabled", "outdated", "unavailable", "deactivated", "overdue" ];
+        for (i = 0, len = errorTypes.length; i < len; i++) {
+          if (_flashState[errorTypes[i]]) {
+            ZeroClipboard.emit({
+              type: "error",
+              name: "flash-" + errorTypes[i],
+              client: this
+            });
+            break;
+          }
+        }
+      }
+    }
+    return this;
+  };
+  ZeroClipboard.prototype.off = function(eventName, func) {
+    var i, len, foundIndex, events, perEventHandlers, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
+    if (arguments.length === 0) {
+      events = _objectKeys(handlers);
+    } else if (typeof eventName === "string" && eventName) {
+      events = eventName.split(/\s+/);
+    } else if (typeof eventName === "object" && eventName && typeof func === "undefined") {
+      for (i in eventName) {
+        if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") {
+          this.off(i, eventName[i]);
+        }
+      }
+    }
+    if (events && events.length) {
+      for (i = 0, len = events.length; i < len; i++) {
+        eventName = events[i].toLowerCase().replace(/^on/, "");
+        perEventHandlers = handlers[eventName];
+        if (perEventHandlers && perEventHandlers.length) {
+          if (func) {
+            foundIndex = _inArray(func, perEventHandlers);
+            while (foundIndex !== -1) {
+              perEventHandlers.splice(foundIndex, 1);
+              foundIndex = _inArray(func, perEventHandlers, foundIndex);
+            }
+          } else {
+            handlers[eventName].length = 0;
+          }
+        }
+      }
+    }
+    return this;
+  };
+  ZeroClipboard.prototype.handlers = function(eventName) {
+    var prop, copy = null, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
+    if (handlers) {
+      if (typeof eventName === "string" && eventName) {
+        return handlers[eventName] ? handlers[eventName].slice(0) : null;
+      }
+      copy = {};
+      for (prop in handlers) {
+        if (handlers.hasOwnProperty(prop) && handlers[prop]) {
+          copy[prop] = handlers[prop].slice(0);
+        }
+      }
+    }
+    return copy;
+  };
+  ZeroClipboard.prototype.clip = function(elements) {
+    elements = _prepClip(elements);
+    for (var i = 0; i < elements.length; i++) {
+      if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {
+        if (!elements[i].zcClippingId) {
+          elements[i].zcClippingId = "zcClippingId_" + _elementIdCounter++;
+          _elementMeta[elements[i].zcClippingId] = [ this.id ];
+          if (_globalConfig.autoActivate === true) {
+            _addEventHandler(elements[i], "mouseover", _elementMouseOver);
+          }
+        } else if (_inArray(this.id, _elementMeta[elements[i].zcClippingId]) === -1) {
+          _elementMeta[elements[i].zcClippingId].push(this.id);
+        }
+        var clippedElements = _clientMeta[this.id].elements;
+        if (_inArray(elements[i], clippedElements) === -1) {
+          clippedElements.push(elements[i]);
+        }
+      }
+    }
+    return this;
+  };
+  ZeroClipboard.prototype.unclip = function(elements) {
+    var meta = _clientMeta[this.id];
+    if (!meta) {
+      return this;
+    }
+    var clippedElements = meta.elements;
+    var arrayIndex;
+    if (typeof elements === "undefined") {
+      elements = clippedElements.slice(0);
+    } else {
+      elements = _prepClip(elements);
+    }
+    for (var i = elements.length; i--; ) {
+      if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) {
+        arrayIndex = 0;
+        while ((arrayIndex = _inArray(elements[i], clippedElements, arrayIndex)) !== -1) {
+          clippedElements.splice(arrayIndex, 1);
+        }
+        var clientIds = _elementMeta[elements[i].zcClippingId];
+        if (clientIds) {
+          arrayIndex = 0;
+          while ((arrayIndex = _inArray(this.id, clientIds, arrayIndex)) !== -1) {
+            clientIds.splice(arrayIndex, 1);
+          }
+          if (clientIds.length === 0) {
+            if (_globalConfig.autoActivate === true) {
+              _removeEventHandler(elements[i], "mouseover", _elementMouseOver);
+            }
+            delete elements[i].zcClippingId;
+          }
+        }
+      }
+    }
+    return this;
+  };
+  ZeroClipboard.prototype.elements = function() {
+    var meta = _clientMeta[this.id];
+    return meta && meta.elements ? meta.elements.slice(0) : [];
+  };
+  var _getAllClientsClippedToElement = function(element) {
+    var elementMetaId, clientIds, i, len, client, clients = [];
+    if (element && element.nodeType === 1 && (elementMetaId = element.zcClippingId) && _elementMeta.hasOwnProperty(elementMetaId)) {
+      clientIds = _elementMeta[elementMetaId];
+      if (clientIds && clientIds.length) {
+        for (i = 0, len = clientIds.length; i < len; i++) {
+          client = _clientMeta[clientIds[i]].instance;
+          if (client && client instanceof ZeroClipboard) {
+            clients.push(client);
+          }
+        }
+      }
+    }
+    return clients;
+  };
+  _globalConfig.hoverClass = "zeroclipboard-is-hover";
+  _globalConfig.activeClass = "zeroclipboard-is-active";
+  if (typeof define === "function" && define.amd) {
+    define(function() {
+      return ZeroClipboard;
+    });
+  } else if (typeof module === "object" && module && typeof module.exports === "object" && module.exports) {
+    module.exports = ZeroClipboard;
+  } else {
+    window.ZeroClipboard = ZeroClipboard;
+  }
+})(function() {
+  return this;
+}());
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.min.js
new file mode 100644
index 0000000..c500f23
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.min.js
@@ -0,0 +1,9 @@
+/*!
+* ZeroClipboard
+* The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.
+* Copyright (c) 2014 Jon Rohan, James M. Greene
+* Licensed MIT
+* http://zeroclipboard.org/
+* v2.0.0-beta.5
+*/
+!function(a){"use strict";var b,c={bridge:null,version:"0.0.0",pluginType:"unknown",disabled:null,outdated:null,unavailable:null,deactivated:null,overdue:null,ready:null},d={},e=null,f=0,g={},h=0,i={},j=function(){var a,b,c,d,e="ZeroClipboard.swf";if(!document.currentScript||!(d=document.currentScript.src)){var f=document.getElementsByTagName("script");if("readyState"in f[0])for(a=f.length;a--&&("interactive"!==f[a].readyState||!(d=f[a].src)););else if("loading"===document.readyState)d=f[f.length-1].src;else{for(a=f.length;a--;){if(c=f[a].src,!c){b=null;break}if(c=c.split("#")[0].split("?")[0],c=c.slice(0,c.lastIndexOf("/")+1),null==b)b=c;else if(b!==c){b=null;break}}null!==b&&(d=b)}}return d&&(d=d.split("#")[0].split("?")[0],e=d.slice(0,d.lastIndexOf("/")+1)+e),e}(),k=function(){var a=/\-([a-z])/g,b=function(a,b){return b.toUpperCase()};return function(c){return c.replace(a,b)}}(),l=function(b,c){var d,e,f;return a.getComputedStyle?d=a.getComputedStyle(b,null).getPropertyValue(c):(e=k(c),d=b.currentStyle?b.currentStyle[e]:b.style[e]),"cursor"!==c||d&&"auto"!==d||(f=b.tagName.toLowerCase(),"a"!==f)?d:"pointer"},m=function(b){b||(b=a.event);var c;this!==a?c=this:b.target?c=b.target:b.srcElement&&(c=b.srcElement),L.activate(c)},n=function(a,b,c){a&&1===a.nodeType&&(a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c))},o=function(a,b,c){a&&1===a.nodeType&&(a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent&&a.detachEvent("on"+b,c))},p=function(a,b){if(!a||1!==a.nodeType)return a;if(a.classList)return a.classList.contains(b)||a.classList.add(b),a;if(b&&"string"==typeof b){var c=(b||"").split(/\s+/);if(1===a.nodeType)if(a.className){for(var d=" "+a.className+" ",e=a.className,f=0,g=c.length;g>f;f++)d.indexOf(" "+c[f]+" ")<0&&(e+=" "+c[f]);a.className=e.replace(/^\s+|\s+$/g,"")}else a.className=b}return a},q=function(a,b){if(!a||1!==a.nodeType)return a;if(a.classList)return a.classList.contains(b)&&a.classList.remove(b),a;if(b&&"string"==typeof b||void 0===b){var c=(b||"").split(/\s+/);if(1===a.nodeType&&a.className)if(b){for(var d=(" "+a.className+" ").replace(/[\n\t]/g," "),e=0,f=c.length;f>e;e++)d=d.replace(" "+c[e]+" "," ");a.className=d.replace(/^\s+|\s+$/g,"")}else a.className=""}return a},r=function(){var a,b,c,d=1;return"function"==typeof document.body.getBoundingClientRect&&(a=document.body.getBoundingClientRect(),b=a.right-a.left,c=document.body.offsetWidth,d=Math.round(b/c*100)/100),d},s=function(b,c){var d={left:0,top:0,width:0,height:0,zIndex:y(c)-1};if(b.getBoundingClientRect){var e,f,g,h=b.getBoundingClientRect();"pageXOffset"in a&&"pageYOffset"in a?(e=a.pageXOffset,f=a.pageYOffset):(g=r(),e=Math.round(document.documentElement.scrollLeft/g),f=Math.round(document.documentElement.scrollTop/g));var i=document.documentElement.clientLeft||0,j=document.documentElement.clientTop||0;d.left=h.left+e-i,d.top=h.top+f-j,d.width="width"in h?h.width:h.right-h.left,d.height="height"in h?h.height:h.bottom-h.top}return d},t=function(a,b){var c=null==b||b&&b.cacheBust===!0;return c?(-1===a.indexOf("?")?"?":"&")+"noCache="+(new Date).getTime():""},u=function(b){var c,d,e,f,g="",h=[];if(b.trustedDomains&&("string"==typeof b.trustedDomains?f=[b.trustedDomains]:"object"==typeof b.trustedDomains&&"length"in b.trustedDomains&&(f=b.trustedDomains)),f&&f.length)for(c=0,d=f.length;d>c;c++)if(f.hasOwnProperty(c)&&f[c]&&"string"==typeof f[c]){if(e=A(f[c]),!e)continue;if("*"===e){h=[e];break}h.push.apply(h,[e,"//"+e,a.location.protocol+"//"+e])}return h.length&&(g+="trustedOrigins="+encodeURIComponent(h.join(","))),b.forceEnhancedClipboard===!0&&(g+=(g?"&":"")+"forceEnhancedClipboard=true"),g},v=function(a,b,c){if("function"==typeof b.indexOf)return b.indexOf(a,c);var d,e=b.length;for("undefined"==typeof c?c=0:0>c&&(c=e+c),d=c;e>d;d++)if(b.hasOwnProperty(d)&&b[d]===a)return d;return-1},w=function(a){if("string"==typeof a)throw new TypeError("ZeroClipboard doesn't accept query strings.");return"number"!=typeof a.length?[a]:a},x=function(b,c,d,e){e?a.setTimeout(function(){b.apply(c,d)},0):b.apply(c,d)},y=function(a){var b,c;return a&&("number"==typeof a&&a>0?b=a:"string"==typeof a&&(c=parseInt(a,10))&&!isNaN(c)&&c>0&&(b=c)),b||("number"==typeof O.zIndex&&O.zIndex>0?b=O.zIndex:"string"==typeof O.zIndex&&(c=parseInt(O.zIndex,10))&&!isNaN(c)&&c>0&&(b=c)),b||0},z=function(){var a,b,c,d,e,f,g=arguments[0]||{};for(a=1,b=arguments.length;b>a;a++)if(null!=(c=arguments[a]))for(d in c)if(c.hasOwnProperty(d)){if(e=g[d],f=c[d],g===f)continue;void 0!==f&&(g[d]=f)}return g},A=function(a){if(null==a||""===a)return null;if(a=a.replace(/^\s+|\s+$/g,""),""===a)return null;var b=a.indexOf("//");a=-1===b?a:a.slice(b+2);var c=a.indexOf("/");return a=-1===c?a:-1===b||0===c?null:a.slice(0,c),a&&".swf"===a.slice(-4).toLowerCase()?null:a||null},B=function(){var a=function(a,b){var c,d,e;if(null!=a&&"*"!==b[0]&&("string"==typeof a&&(a=[a]),"object"==typeof a&&"number"==typeof a.length))for(c=0,d=a.length;d>c;c++)if(a.hasOwnProperty(c)&&(e=A(a[c]))){if("*"===e){b.length=0,b.push("*");break}-1===v(e,b)&&b.push(e)}};return function(b,c){var d=A(c.swfPath);null===d&&(d=b);var e=[];a(c.trustedOrigins,e),a(c.trustedDomains,e);var f=e.length;if(f>0){if(1===f&&"*"===e[0])return"always";if(-1!==v(b,e))return 1===f&&b===d?"sameDomain":"always"}return"never"}}(),C=function(a){if(null==a)return[];if(Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},D=function(a){if(a)for(var b in a)a.hasOwnProperty(b)&&delete a[b];return a},E=function(){try{return document.activeElement}catch(a){}return null},F=function(a,b){for(var c={},d=0,e=b.length;e>d;d++)b[d]in a&&(c[b[d]]=a[b[d]]);return c},G=function(a,b){var c={};for(var d in a)-1===v(d,b)&&(c[d]=a[d]);return c},H=function(a){var b={},c={};if("object"==typeof a&&a){for(var d in a)if(d&&a.hasOwnProperty(d)&&"string"==typeof a[d]&&a[d])switch(d.toLowerCase()){case"text/plain":case"text":case"air:text":case"flash:text":b.text=a[d],c.text=d;break;case"text/html":case"html":case"air:html":case"flash:html":b.html=a[d],c.html=d;break;case"application/rtf":case"text/rtf":case"rtf":case"richtext":case"air:rtf":case"flash:rtf":b.rtf=a[d],c.rtf=d}return{data:b,formatMap:c}}},I=function(a,b){if("object"!=typeof a||!a||"object"!=typeof b||!b)return a;var c={};for(var d in a)if(a.hasOwnProperty(d)){if("success"!==d&&"data"!==d){c[d]=a[d];continue}c[d]={};var e=a[d];for(var f in e)f&&e.hasOwnProperty(f)&&b.hasOwnProperty(f)&&(c[d][b[f]]=e[f])}return c},J=function(a){return function(b){return a.call(b,0)}}(a.Array.prototype.slice),K=function(){function a(a){var b=a.match(/[\d]+/g);return b.length=3,b.join(".")}function b(a){return!!a&&(a=a.toLowerCase())&&(/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(a)||"chrome.plugin"===a.slice(-13))}function d(c){c&&(h=!0,c.version&&(k=a(c.version)),!k&&c.description&&(k=a(c.description)),c.filename&&(j=b(c.filename)))}var e,f,g,h=!1,i=!1,j=!1,k="";if(navigator.plugins&&navigator.plugins.length)e=navigator.plugins["Shockwave Flash"],d(e),navigator.plugins["Shockwave Flash 2.0"]&&(h=!0,k="2.0.0.11");else if(navigator.mimeTypes&&navigator.mimeTypes.length)g=navigator.mimeTypes["application/x-shockwave-flash"],e=g&&g.enabledPlugin,d(e);else if("undefined"!=typeof ActiveXObject){i=!0;try{f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"),h=!0,k=a(f.GetVariable("$version"))}catch(l){try{f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),h=!0,k="6.0.21"}catch(m){try{f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),h=!0,k=a(f.GetVariable("$version"))}catch(n){i=!1}}}}c.disabled=h!==!0,c.outdated=k&&parseFloat(k)<11,c.version=k||"0.0.0",c.pluginType=j?"pepper":i?"activex":h?"netscape":"unknown"};K();var L=function(a){if(!(this instanceof L))return new L(a);if(this.id=""+f++,g[this.id]={instance:this,elements:[],handlers:{}},a&&this.clip(a),"boolean"!=typeof c.ready&&(c.ready=!1),!L.isFlashUnusable()&&null===c.bridge){var b=this,d=O.flashLoadTimeout;"number"==typeof d&&d>=0&&setTimeout(function(){"boolean"!=typeof c.deactivated&&(c.deactivated=!0),c.deactivated===!0&&L.emit({type:"error",name:"flash-deactivated",client:b})},d),c.overdue=!1,P()}};L.prototype.setText=function(a){return L.setData("text/plain",a),this},L.prototype.setHtml=function(a){return L.setData("text/html",a),this},L.prototype.setRichText=function(a){return L.setData("application/rtf",a),this},L.prototype.setData=function(){return L.setData.apply(L,J(arguments)),this},L.prototype.clearData=function(){return L.clearData.apply(L,J(arguments)),this},L.prototype.setSize=function(a,b){return T(a,b),this};var M=function(a){c.ready===!0&&c.bridge&&"function"==typeof c.bridge.setHandCursor?c.bridge.setHandCursor(a):c.ready=!1};L.prototype.destroy=function(){this.unclip(),this.off(),delete g[this.id]};var N=function(){var a,b,c,d=[],e=C(g);for(a=0,b=e.length;b>a;a++)c=g[e[a]].instance,c&&c instanceof L&&d.push(c);return d};L.version="2.0.0-beta.5";var O={swfPath:j,trustedDomains:a.location.host?[a.location.host]:[],cacheBust:!0,forceHandCursor:!1,forceEnhancedClipboard:!1,zIndex:999999999,debug:!1,title:null,autoActivate:!0,flashLoadTimeout:3e4};L.isFlashUnusable=function(){return!!(c.disabled||c.outdated||c.unavailable||c.deactivated)},L.config=function(a){"object"==typeof a&&null!==a&&z(O,a);{if("string"!=typeof a||!a){var b={};for(var c in O)O.hasOwnProperty(c)&&(b[c]="object"==typeof O[c]&&null!==O[c]?"length"in O[c]?O[c].slice(0):z({},O[c]):O[c]);return b}if(O.hasOwnProperty(a))return O[a]}},L.destroy=function(){L.deactivate();for(var a in g)if(g.hasOwnProperty(a)&&g[a]){var b=g[a].instance;b&&"function"==typeof b.destroy&&b.destroy()}var d=c.bridge;if(d){var e=R(d);e&&("activex"===c.pluginType&&"readyState"in d?(d.style.display="none",function f(){if(4===d.readyState){for(var a in d)"function"==typeof d[a]&&(d[a]=null);d.parentNode.removeChild(d),e.parentNode&&e.parentNode.removeChild(e)}else setTimeout(f,10)}()):(d.parentNode.removeChild(d),e.parentNode&&e.parentNode.removeChild(e))),c.ready=null,c.bridge=null,c.deactivated=null}L.clearData()},L.activate=function(a){b&&(q(b,O.hoverClass),q(b,O.activeClass)),b=a,p(a,O.hoverClass),S();var d=O.title||a.getAttribute("title");if(d){var e=R(c.bridge);e&&e.setAttribute("title",d)}var f=O.forceHandCursor===!0||"pointer"===l(a,"cursor");M(f)},L.deactivate=function(){var a=R(c.bridge);a&&(a.removeAttribute("title"),a.style.left="0px",a.style.top="-9999px",T(1,1)),b&&(q(b,O.hoverClass),q(b,O.activeClass),b=null)},L.state=function(){return{browser:F(a.navigator,["userAgent","platform","appName"]),flash:G(c,["bridge"]),zeroclipboard:{version:L.version,config:L.config()}}},L.setData=function(a,b){var c;if("object"==typeof a&&a&&"undefined"==typeof b)c=a,L.clearData();else{if("string"!=typeof a||!a)return;c={},c[a]=b}for(var e in c)e&&c.hasOwnProperty(e)&&"string"==typeof c[e]&&c[e]&&(d[e]=c[e])},L.clearData=function(a){"undefined"==typeof a?(D(d),e=null):"string"==typeof a&&d.hasOwnProperty(a)&&delete d[a]};var P=function(){var b,d,e=document.getElementById("global-zeroclipboard-html-bridge");if(!e){var f=B(a.location.host,O),g="never"===f?"none":"all",h=u(O),i=O.swfPath+t(O.swfPath,O);e=Q();var j=document.createElement("div");e.appendChild(j),document.body.appendChild(e);var k=document.createElement("div"),l="activex"===c.pluginType;k.innerHTML='<object id="global-zeroclipboard-flash-bridge" name="global-zeroclipboard-flash-bridge" width="100%" height="100%" '+(l?'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"':'type="application/x-shockwave-flash" data="'+i+'"')+">"+(l?'<param name="movie" value="'+i+'"/>':"")+'<param name="allowScriptAccess" value="'+f+'"/><param name="allowNetworking" value="'+g+'"/><param name="menu" value="false"/><param name="wmode" value="transparent"/><param name="flashvars" value="'+h+'"/></object>',b=k.firstChild,k=null,b.ZeroClipboard=L,e.replaceChild(b,j)}b||(b=document["global-zeroclipboard-flash-bridge"],b&&(d=b.length)&&(b=b[d-1]),b||(b=e.firstChild)),c.bridge=b||null},Q=function(){var a=document.createElement("div");return a.id="global-zeroclipboard-html-bridge",a.className="global-zeroclipboard-container",a.style.position="absolute",a.style.left="0px",a.style.top="-9999px",a.style.width="1px",a.style.height="1px",a.style.zIndex=""+y(O.zIndex),a},R=function(a){for(var b=a&&a.parentNode;b&&"OBJECT"===b.nodeName&&b.parentNode;)b=b.parentNode;return b||null},S=function(){if(b){var a=s(b,O.zIndex),d=R(c.bridge);d&&(d.style.top=a.top+"px",d.style.left=a.left+"px",d.style.width=a.width+"px",d.style.height=a.height+"px",d.style.zIndex=a.zIndex+1),T(a.width,a.height)}},T=function(a,b){var d=R(c.bridge);d&&(d.style.width=a+"px",d.style.height=b+"px")};L.emit=function(b){var f,g,h,i,j,k,l,m,n;if("string"==typeof b&&b&&(f=b),"object"==typeof b&&b&&"string"==typeof b.type&&b.type&&(f=b.type,g=b),f){if(b=W(f,g),Y(b),"ready"===b.type&&c.overdue===!0)return L.emit({type:"error",name:"flash-overdue"});if(h=!/^(before)?copy$/.test(b.type),b.client)U.call(b.client,b,h);else for(i=b.target&&b.target!==a&&O.autoActivate===!0?Z(b.target):N(),j=0,k=i.length;k>j;j++)l=z({},b,{client:i[j]}),U.call(i[j],l,h);return"copy"===b.type&&(n=H(d),m=n.data,e=n.formatMap),m}};var U=function(b,c){var d=g[this.id]&&g[this.id].handlers[b.type];if(d&&d.length){var e,f,h,i,j=this;for(e=0,f=d.length;f>e;e++)h=d[e],i=j,"string"==typeof h&&"function"==typeof a[h]&&(h=a[h]),"object"==typeof h&&h&&"function"==typeof h.handleEvent&&(i=h,h=h.handleEvent),"function"==typeof h&&x(h,i,[b],c)}return this},V={ready:"Flash communication is established",error:{"flash-disabled":"Flash is disabled or not installed","flash-outdated":"Flash is too outdated to support ZeroClipboard","flash-unavailable":"Flash is unable to communicate bidirectionally with JavaScript","flash-deactivated":"Flash is too outdated for your browser and/or is configured as click-to-activate","flash-overdue":"Flash communication was established but NOT within the acceptable time limit"}},W=function(a,d){if(a||d&&d.type){d=d||{},a=(a||d.type).toLowerCase(),z(d,{type:a,target:d.target||b||null,relatedTarget:d.relatedTarget||null,currentTarget:c&&c.bridge||null});var f=V[d.type];return"error"===d.type&&d.name&&f&&(f=f[d.name]),f&&(d.message=f),"ready"===d.type&&z(d,{target:null,version:c.version}),"error"===d.type&&(d.target=null,/^flash-(outdated|unavailable|deactivated|overdue)$/.test(d.name)&&z(d,{version:c.version,minimumVersion:"11.0.0"})),"copy"===d.type&&(d.clipboardData={setData:L.setData,clearData:L.clearData}),"aftercopy"===d.type&&(d=I(d,e)),d.target&&!d.relatedTarget&&(d.relatedTarget=X(d.target)),d}},X=function(a){var b=a&&a.getAttribute&&a.getAttribute("data-clipboard-target");return b?document.getElementById(b):null},Y=function(a){var e=a.target||b;switch(a.type){case"error":v(a.name,["flash-disabled","flash-outdated","flash-deactivated","flash-overdue"])&&z(c,{disabled:"flash-disabled"===a.name,outdated:"flash-outdated"===a.name,unavailable:"flash-unavailable"===a.name,deactivated:"flash-deactivated"===a.name,overdue:"flash-overdue"===a.name,ready:!1});break;case"ready":var f=c.deactivated===!0;z(c,{disabled:!1,outdated:!1,unavailable:!1,deactivated:!1,overdue:f,ready:!f});break;case"copy":var g,h,i=a.relatedTarget;!d["text/html"]&&!d["text/plain"]&&i&&(h=i.value||i.outerHTML||i.innerHTML)&&(g=i.value||i.textContent||i.innerText)?(a.clipboardData.clearData(),a.clipboardData.setData("text/plain",g),h!==g&&a.clipboardData.setData("text/html",h)):!d["text/plain"]&&a.target&&(g=a.target.getAttribute("data-clipboard-text"))&&(a.clipboardData.clearData(),a.clipboardData.setData("text/plain",g));break;case"aftercopy":L.clearData(),e&&e!==E()&&e.focus&&e.focus();break;case"mouseover":p(e,O.hoverClass);break;case"mouseout":O.autoActivate===!0&&L.deactivate();break;case"mousedown":p(e,O.activeClass);break;case"mouseup":q(e,O.activeClass)}};L.prototype.on=function(a,b){var d,e,f,h={},i=g[this.id]&&g[this.id].handlers;if("string"==typeof a&&a)f=a.toLowerCase().split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(d in a)a.hasOwnProperty(d)&&"string"==typeof d&&d&&"function"==typeof a[d]&&this.on(d,a[d]);if(f&&f.length){for(d=0,e=f.length;e>d;d++)a=f[d].replace(/^on/,""),h[a]=!0,i[a]||(i[a]=[]),i[a].push(b);if(h.ready&&c.ready&&L.emit({type:"ready",client:this}),h.error){var j=["disabled","outdated","unavailable","deactivated","overdue"];for(d=0,e=j.length;e>d;d++)if(c[j[d]]){L.emit({type:"error",name:"flash-"+j[d],client:this});break}}}return this},L.prototype.off=function(a,b){var c,d,e,f,h,i=g[this.id]&&g[this.id].handlers;if(0===arguments.length)f=C(i);else if("string"==typeof a&&a)f=a.split(/\s+/);else if("object"==typeof a&&a&&"undefined"==typeof b)for(c in a)a.hasOwnProperty(c)&&"string"==typeof c&&c&&"function"==typeof a[c]&&this.off(c,a[c]);if(f&&f.length)for(c=0,d=f.length;d>c;c++)if(a=f[c].toLowerCase().replace(/^on/,""),h=i[a],h&&h.length)if(b)for(e=v(b,h);-1!==e;)h.splice(e,1),e=v(b,h,e);else i[a].length=0;return this},L.prototype.handlers=function(a){var b,c=null,d=g[this.id]&&g[this.id].handlers;if(d){if("string"==typeof a&&a)return d[a]?d[a].slice(0):null;c={};for(b in d)d.hasOwnProperty(b)&&d[b]&&(c[b]=d[b].slice(0))}return c},L.prototype.clip=function(a){a=w(a);for(var b=0;b<a.length;b++)if(a.hasOwnProperty(b)&&a[b]&&1===a[b].nodeType){a[b].zcClippingId?-1===v(this.id,i[a[b].zcClippingId])&&i[a[b].zcClippingId].push(this.id):(a[b].zcClippingId="zcClippingId_"+h++,i[a[b].zcClippingId]=[this.id],O.autoActivate===!0&&n(a[b],"mouseover",m));var c=g[this.id].elements;-1===v(a[b],c)&&c.push(a[b])}return this},L.prototype.unclip=function(a){var b=g[this.id];if(!b)return this;var c,d=b.elements;a="undefined"==typeof a?d.slice(0):w(a);for(var e=a.length;e--;)if(a.hasOwnProperty(e)&&a[e]&&1===a[e].nodeType){for(c=0;-1!==(c=v(a[e],d,c));)d.splice(c,1);var f=i[a[e].zcClippingId];if(f){for(c=0;-1!==(c=v(this.id,f,c));)f.splice(c,1);0===f.length&&(O.autoActivate===!0&&o(a[e],"mouseover",m),delete a[e].zcClippingId)}}return this},L.prototype.elements=function(){var a=g[this.id];return a&&a.elements?a.elements.slice(0):[]};var Z=function(a){var b,c,d,e,f,h=[];if(a&&1===a.nodeType&&(b=a.zcClippingId)&&i.hasOwnProperty(b)&&(c=i[b],c&&c.length))for(d=0,e=c.length;e>d;d++)f=g[c[d]].instance,f&&f instanceof L&&h.push(f);return h};O.hoverClass="zeroclipboard-is-hover",O.activeClass="zeroclipboard-is-active","function"==typeof define&&define.amd?define(function(){return L}):"object"==typeof module&&module&&"object"==typeof module.exports&&module.exports?module.exports=L:a.ZeroClipboard=L}(function(){return this}());
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.swf b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.swf
new file mode 100644
index 0000000..ed1c9d2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/third-party/zeroclipboard/ZeroClipboard.swf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.all.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.all.js
new file mode 100644
index 0000000..585340f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.all.js
@@ -0,0 +1,29568 @@
+/*!
+ * UEditor
+ * version: ueditor
+ * build: Wed Aug 10 2016 11:06:16 GMT+0800 (CST)
+ */
+
+(function(){
+
+// editor.js
+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 = {};
+
+// core/browser.js
+/**
+ * 浏览器判断模块
+ * @file
+ * @module UE.browser
+ * @since 1.2.6.1
+ */
+
+/**
+ * 提供浏览器检测的模块
+ * @unfile
+ * @module UE.browser
+ */
+var browser = UE.browser = function(){
+    var agent = navigator.userAgent.toLowerCase(),
+        opera = window.opera,
+        browser = {
+        /**
+         * @property {boolean} ie 检测当前浏览器是否为IE
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie ) {
+         *     console.log( '当前浏览器是IE' );
+         * }
+         * ```
+         */
+        ie		:  /(msie\s|trident.*rv:)([\w.]+)/.test(agent),
+
+        /**
+         * @property {boolean} opera 检测当前浏览器是否为Opera
+         * @example
+         * ```javascript
+         * if ( UE.browser.opera ) {
+         *     console.log( '当前浏览器是Opera' );
+         * }
+         * ```
+         */
+        opera	: ( !!opera && opera.version ),
+
+        /**
+         * @property {boolean} webkit 检测当前浏览器是否是webkit内核的浏览器
+         * @example
+         * ```javascript
+         * if ( UE.browser.webkit ) {
+         *     console.log( '当前浏览器是webkit内核浏览器' );
+         * }
+         * ```
+         */
+        webkit	: ( agent.indexOf( ' applewebkit/' ) > -1 ),
+
+        /**
+         * @property {boolean} mac 检测当前浏览器是否是运行在mac平台下
+         * @example
+         * ```javascript
+         * if ( UE.browser.mac ) {
+         *     console.log( '当前浏览器运行在mac平台下' );
+         * }
+         * ```
+         */
+        mac	: ( agent.indexOf( 'macintosh' ) > -1 ),
+
+        /**
+         * @property {boolean} quirks 检测当前浏览器是否处于“怪异模式”下
+         * @example
+         * ```javascript
+         * if ( UE.browser.quirks ) {
+         *     console.log( '当前浏览器运行处于“怪异模式”' );
+         * }
+         * ```
+         */
+        quirks : ( document.compatMode == 'BackCompat' )
+    };
+
+    /**
+    * @property {boolean} gecko 检测当前浏览器内核是否是gecko内核
+    * @example
+    * ```javascript
+    * if ( UE.browser.gecko ) {
+    *     console.log( '当前浏览器内核是gecko内核' );
+    * }
+    * ```
+    */
+    browser.gecko =( navigator.product == 'Gecko' && !browser.webkit && !browser.opera && !browser.ie);
+
+    var version = 0;
+
+    // Internet Explorer 6.0+
+    if ( browser.ie ){
+
+        var v1 =  agent.match(/(?:msie\s([\w.]+))/);
+        var v2 = agent.match(/(?:trident.*rv:([\w.]+))/);
+        if(v1 && v2 && v1[1] && v2[1]){
+            version = Math.max(v1[1]*1,v2[1]*1);
+        }else if(v1 && v1[1]){
+            version = v1[1]*1;
+        }else if(v2 && v2[1]){
+            version = v2[1]*1;
+        }else{
+            version = 0;
+        }
+
+        browser.ie11Compat = document.documentMode == 11;
+        /**
+         * @property { boolean } ie9Compat 检测浏览器模式是否为 IE9 兼容模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie9Compat ) {
+         *     console.log( '当前浏览器运行在IE9兼容模式下' );
+         * }
+         * ```
+         */
+        browser.ie9Compat = document.documentMode == 9;
+
+        /**
+         * @property { boolean } ie8 检测浏览器是否是IE8浏览器
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie8 ) {
+         *     console.log( '当前浏览器是IE8浏览器' );
+         * }
+         * ```
+         */
+        browser.ie8 = !!document.documentMode;
+
+        /**
+         * @property { boolean } ie8Compat 检测浏览器模式是否为 IE8 兼容模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie8Compat ) {
+         *     console.log( '当前浏览器运行在IE8兼容模式下' );
+         * }
+         * ```
+         */
+        browser.ie8Compat = document.documentMode == 8;
+
+        /**
+         * @property { boolean } ie7Compat 检测浏览器模式是否为 IE7 兼容模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie7Compat ) {
+         *     console.log( '当前浏览器运行在IE7兼容模式下' );
+         * }
+         * ```
+         */
+        browser.ie7Compat = ( ( version == 7 && !document.documentMode )
+                || document.documentMode == 7 );
+
+        /**
+         * @property { boolean } ie6Compat 检测浏览器模式是否为 IE6 模式 或者怪异模式
+         * @warning 如果浏览器不是IE, 则该值为undefined
+         * @example
+         * ```javascript
+         * if ( UE.browser.ie6Compat ) {
+         *     console.log( '当前浏览器运行在IE6模式或者怪异模式下' );
+         * }
+         * ```
+         */
+        browser.ie6Compat = ( version < 7 || browser.quirks );
+
+        browser.ie9above = version > 8;
+
+        browser.ie9below = version < 9;
+
+        browser.ie11above = version > 10;
+
+        browser.ie11below = version < 11;
+
+    }
+
+    // Gecko.
+    if ( browser.gecko ){
+        var geckoRelease = agent.match( /rv:([\d\.]+)/ );
+        if ( geckoRelease )
+        {
+            geckoRelease = geckoRelease[1].split( '.' );
+            version = geckoRelease[0] * 10000 + ( geckoRelease[1] || 0 ) * 100 + ( geckoRelease[2] || 0 ) * 1;
+        }
+    }
+
+    /**
+     * @property { Number } chrome 检测当前浏览器是否为Chrome, 如果是,则返回Chrome的大版本号
+     * @warning 如果浏览器不是chrome, 则该值为undefined
+     * @example
+     * ```javascript
+     * if ( UE.browser.chrome ) {
+     *     console.log( '当前浏览器是Chrome' );
+     * }
+     * ```
+     */
+    if (/chrome\/(\d+\.\d)/i.test(agent)) {
+        browser.chrome = + RegExp['\x241'];
+    }
+
+    /**
+     * @property { Number } safari 检测当前浏览器是否为Safari, 如果是,则返回Safari的大版本号
+     * @warning 如果浏览器不是safari, 则该值为undefined
+     * @example
+     * ```javascript
+     * if ( UE.browser.safari ) {
+     *     console.log( '当前浏览器是Safari' );
+     * }
+     * ```
+     */
+    if(/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) && !/chrome/i.test(agent)){
+    	browser.safari = + (RegExp['\x241'] || RegExp['\x242']);
+    }
+
+
+    // Opera 9.50+
+    if ( browser.opera )
+        version = parseFloat( opera.version() );
+
+    // WebKit 522+ (Safari 3+)
+    if ( browser.webkit )
+        version = parseFloat( agent.match( / applewebkit\/(\d+)/ )[1] );
+
+    /**
+     * @property { Number } version 检测当前浏览器版本号
+     * @remind
+     * <ul>
+     *     <li>IE系列返回值为5,6,7,8,9,10等</li>
+     *     <li>gecko系列会返回10900,158900等</li>
+     *     <li>webkit系列会返回其build号 (如 522等)</li>
+     * </ul>
+     * @example
+     * ```javascript
+     * console.log( '当前浏览器版本号是: ' + UE.browser.version );
+     * ```
+     */
+    browser.version = version;
+
+    /**
+     * @property { boolean } isCompatible 检测当前浏览器是否能够与UEditor良好兼容
+     * @example
+     * ```javascript
+     * if ( UE.browser.isCompatible ) {
+     *     console.log( '浏览器与UEditor能够良好兼容' );
+     * }
+     * ```
+     */
+    browser.isCompatible =
+        !browser.mobile && (
+        ( browser.ie && version >= 6 ) ||
+        ( browser.gecko && version >= 10801 ) ||
+        ( browser.opera && version >= 9.5 ) ||
+        ( browser.air && version >= 1 ) ||
+        ( browser.webkit && version >= 522 ) ||
+        false );
+    return browser;
+}();
+//快捷方式
+var ie = browser.ie,
+    webkit = browser.webkit,
+    gecko = browser.gecko,
+    opera = browser.opera;
+
+// core/utils.js
+/**
+ * 工具函数包
+ * @file
+ * @module UE.utils
+ * @since 1.2.6.1
+ */
+
+/**
+ * UEditor封装使用的静态工具函数
+ * @module UE.utils
+ * @unfile
+ */
+
+var utils = UE.utils = {
+
+    /**
+     * 用给定的迭代器遍历对象
+     * @method each
+     * @param { Object } obj 需要遍历的对象
+     * @param { Function } iterator 迭代器, 该方法接受两个参数, 第一个参数是当前所处理的value, 第二个参数是当前遍历对象的key
+     * @example
+     * ```javascript
+     * var demoObj = {
+     *     key1: 1,
+     *     key2: 2
+     * };
+     *
+     * //output: key1: 1, key2: 2
+     * UE.utils.each( demoObj, funciton ( value, key ) {
+     *
+     *     console.log( key + ":" + value );
+     *
+     * } );
+     * ```
+     */
+
+    /**
+     * 用给定的迭代器遍历数组或类数组对象
+     * @method each
+     * @param { Array } array 需要遍历的数组或者类数组
+     * @param { Function } iterator 迭代器, 该方法接受两个参数, 第一个参数是当前所处理的value, 第二个参数是当前遍历对象的key
+     * @example
+     * ```javascript
+     * var divs = document.getElmentByTagNames( "div" );
+     *
+     * //output: 0: DIV, 1: DIV ...
+     * UE.utils.each( divs, funciton ( value, key ) {
+     *
+     *     console.log( key + ":" + value.tagName );
+     *
+     * } );
+     * ```
+     */
+    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;
+                }
+            }
+        }
+    },
+
+    /**
+     * 以给定对象作为原型创建一个新对象
+     * @method makeInstance
+     * @param { Object } protoObject 该对象将作为新创建对象的原型
+     * @return { Object } 新的对象, 该对象的原型是给定的protoObject对象
+     * @example
+     * ```javascript
+     *
+     * var protoObject = { sayHello: function () { console.log('Hello UEditor!'); } };
+     *
+     * var newObject = UE.utils.makeInstance( protoObject );
+     * //output: Hello UEditor!
+     * newObject.sayHello();
+     * ```
+     */
+    makeInstance:function (obj) {
+        var noop = new Function();
+        noop.prototype = obj;
+        obj = new noop;
+        noop.prototype = null;
+        return obj;
+    },
+
+    /**
+     * 将source对象中的属性扩展到target对象上
+     * @method extend
+     * @remind 该方法将强制把source对象上的属性复制到target对象上
+     * @see UE.utils.extend(Object,Object,Boolean)
+     * @param { Object } target 目标对象, 新的属性将附加到该对象上
+     * @param { Object } source 源对象, 该对象的属性会被附加到target对象上
+     * @return { Object } 返回target对象
+     * @example
+     * ```javascript
+     *
+     * var target = { name: 'target', sex: 1 },
+     *      source = { name: 'source', age: 17 };
+     *
+     * UE.utils.extend( target, source );
+     *
+     * //output: { name: 'source', sex: 1, age: 17 }
+     * console.log( target );
+     *
+     * ```
+     */
+
+    /**
+     * 将source对象中的属性扩展到target对象上, 根据指定的isKeepTarget值决定是否保留目标对象中与
+     * 源对象属性名相同的属性值。
+     * @method extend
+     * @param { Object } target 目标对象, 新的属性将附加到该对象上
+     * @param { Object } source 源对象, 该对象的属性会被附加到target对象上
+     * @param { Boolean } isKeepTarget 是否保留目标对象中与源对象中属性名相同的属性
+     * @return { Object } 返回target对象
+     * @example
+     * ```javascript
+     *
+     * var target = { name: 'target', sex: 1 },
+     *      source = { name: 'source', age: 17 };
+     *
+     * UE.utils.extend( target, source, true );
+     *
+     * //output: { name: 'target', sex: 1, age: 17 }
+     * console.log( target );
+     *
+     * ```
+     */
+    extend:function (t, s, b) {
+        if (s) {
+            for (var k in s) {
+                if (!b || !t.hasOwnProperty(k)) {
+                    t[k] = s[k];
+                }
+            }
+        }
+        return t;
+    },
+
+    /**
+     * 将给定的多个对象的属性复制到目标对象target上
+     * @method extend2
+     * @remind 该方法将强制把源对象上的属性复制到target对象上
+     * @remind 该方法支持两个及以上的参数, 从第二个参数开始, 其属性都会被复制到第一个参数上。 如果遇到同名的属性,
+     *          将会覆盖掉之前的值。
+     * @param { Object } target 目标对象, 新的属性将附加到该对象上
+     * @param { Object... } source 源对象, 支持多个对象, 该对象的属性会被附加到target对象上
+     * @return { Object } 返回target对象
+     * @example
+     * ```javascript
+     *
+     * var target = {},
+     *     source1 = { name: 'source', age: 17 },
+     *     source2 = { title: 'dev' };
+     *
+     * UE.utils.extend2( target, source1, source2 );
+     *
+     * //output: { name: 'source', age: 17, title: 'dev' }
+     * console.log( target );
+     *
+     * ```
+     */
+    extend2:function (t) {
+        var a = arguments;
+        for (var i = 1; i < a.length; i++) {
+            var x = a[i];
+            for (var k in x) {
+                if (!t.hasOwnProperty(k)) {
+                    t[k] = x[k];
+                }
+            }
+        }
+        return t;
+    },
+
+    /**
+     * 模拟继承机制, 使得subClass继承自superClass
+     * @method inherits
+     * @param { Object } subClass 子类对象
+     * @param { Object } superClass 超类对象
+     * @warning 该方法只能让subClass继承超类的原型, subClass对象自身的属性和方法不会被继承
+     * @return { Object } 继承superClass后的子类对象
+     * @example
+     * ```javascript
+     * function SuperClass(){
+     *     this.name = "小李";
+     * }
+     *
+     * SuperClass.prototype = {
+     *     hello:function(str){
+     *         console.log(this.name + str);
+     *     }
+     * }
+     *
+     * function SubClass(){
+     *     this.name = "小张";
+     * }
+     *
+     * UE.utils.inherits(SubClass,SuperClass);
+     *
+     * var sub = new SubClass();
+     * //output: '小张早上好!
+     * sub.hello("早上好!");
+     * ```
+     */
+    inherits:function (subClass, superClass) {
+        var oldP = subClass.prototype,
+            newP = utils.makeInstance(superClass.prototype);
+        utils.extend(newP, oldP, true);
+        subClass.prototype = newP;
+        return (newP.constructor = subClass);
+    },
+
+    /**
+     * 用指定的context对象作为函数fn的上下文
+     * @method bind
+     * @param { Function } fn 需要绑定上下文的函数对象
+     * @param { Object } content 函数fn新的上下文对象
+     * @return { Function } 一个新的函数, 该函数作为原始函数fn的代理, 将完成fn的上下文调换工作。
+     * @example
+     * ```javascript
+     *
+     * var name = 'window',
+     *     newTest = null;
+     *
+     * function test () {
+     *     console.log( this.name );
+     * }
+     *
+     * newTest = UE.utils.bind( test, { name: 'object' } );
+     *
+     * //output: object
+     * newTest();
+     *
+     * //output: window
+     * test();
+     *
+     * ```
+     */
+    bind:function (fn, context) {
+        return function () {
+            return fn.apply(context, arguments);
+        };
+    },
+
+    /**
+     * 创建延迟指定时间后执行的函数fn
+     * @method defer
+     * @param { Function } fn 需要延迟执行的函数对象
+     * @param { int } delay 延迟的时间, 单位是毫秒
+     * @warning 该方法的时间控制是不精确的,仅仅只能保证函数的执行是在给定的时间之后,
+     *           而不能保证刚好到达延迟时间时执行。
+     * @return { Function } 目标函数fn的代理函数, 只有执行该函数才能起到延时效果
+     * @example
+     * ```javascript
+     * var start = 0;
+     *
+     * function test(){
+     *     console.log( new Date() - start );
+     * }
+     *
+     * var testDefer = UE.utils.defer( test, 1000 );
+     * //
+     * start = new Date();
+     * //output: (大约在1000毫秒之后输出) 1000
+     * testDefer();
+     * ```
+     */
+
+    /**
+     * 创建延迟指定时间后执行的函数fn, 如果在延迟时间内再次执行该方法, 将会根据指定的exclusion的值,
+     * 决定是否取消前一次函数的执行, 如果exclusion的值为true, 则取消执行,反之,将继续执行前一个方法。
+     * @method defer
+     * @param { Function } fn 需要延迟执行的函数对象
+     * @param { int } delay 延迟的时间, 单位是毫秒
+     * @param { Boolean } exclusion 如果在延迟时间内再次执行该函数,该值将决定是否取消执行前一次函数的执行,
+     *                     值为true表示取消执行, 反之则将在执行前一次函数之后才执行本次函数调用。
+     * @warning 该方法的时间控制是不精确的,仅仅只能保证函数的执行是在给定的时间之后,
+     *           而不能保证刚好到达延迟时间时执行。
+     * @return { Function } 目标函数fn的代理函数, 只有执行该函数才能起到延时效果
+     * @example
+     * ```javascript
+     *
+     * function test(){
+     *     console.log(1);
+     * }
+     *
+     * var testDefer = UE.utils.defer( test, 1000, true );
+     *
+     * //output: (两次调用仅有一次输出) 1
+     * testDefer();
+     * testDefer();
+     * ```
+     */
+    defer:function (fn, delay, exclusion) {
+        var timerID;
+        return function () {
+            if (exclusion) {
+                clearTimeout(timerID);
+            }
+            timerID = setTimeout(fn, delay);
+        };
+    },
+
+    /**
+     * 获取元素item在数组array中首次出现的位置, 如果未找到item, 则返回-1
+     * @method indexOf
+     * @remind 该方法的匹配过程使用的是恒等“===”
+     * @param { Array } array 需要查找的数组对象
+     * @param { * } item 需要在目标数组中查找的值
+     * @return { int } 返回item在目标数组array中首次出现的位置, 如果在数组中未找到item, 则返回-1
+     * @example
+     * ```javascript
+     * var item = 1,
+     *     arr = [ 3, 4, 6, 8, 1, 1, 2 ];
+     *
+     * //output: 4
+     * console.log( UE.utils.indexOf( arr, item ) );
+     * ```
+     */
+
+    /**
+     * 获取元素item数组array中首次出现的位置, 如果未找到item, 则返回-1。通过start的值可以指定搜索的起始位置。
+     * @method indexOf
+     * @remind 该方法的匹配过程使用的是恒等“===”
+     * @param { Array } array 需要查找的数组对象
+     * @param { * } item 需要在目标数组中查找的值
+     * @param { int } start 搜索的起始位置
+     * @return { int } 返回item在目标数组array中的start位置之后首次出现的位置, 如果在数组中未找到item, 则返回-1
+     * @example
+     * ```javascript
+     * var item = 1,
+     *     arr = [ 3, 4, 6, 8, 1, 2, 8, 3, 2, 1, 1, 4 ];
+     *
+     * //output: 9
+     * console.log( UE.utils.indexOf( arr, item, 5 ) );
+     * ```
+     */
+    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;
+    },
+
+    /**
+     * 移除数组array中所有的元素item
+     * @method removeItem
+     * @param { Array } array 要移除元素的目标数组
+     * @param { * } item 将要被移除的元素
+     * @remind 该方法的匹配过程使用的是恒等“===”
+     * @example
+     * ```javascript
+     * var arr = [ 4, 5, 7, 1, 3, 4, 6 ];
+     *
+     * UE.utils.removeItem( arr, 4 );
+     * //output: [ 5, 7, 1, 3, 6 ]
+     * console.log( arr );
+     *
+     * ```
+     */
+    removeItem:function (array, item) {
+        for (var i = 0, l = array.length; i < l; i++) {
+            if (array[i] === item) {
+                array.splice(i, 1);
+                i--;
+            }
+        }
+    },
+
+    /**
+     * 删除字符串str的首尾空格
+     * @method trim
+     * @param { String } str 需要删除首尾空格的字符串
+     * @return { String } 删除了首尾的空格后的字符串
+     * @example
+     * ```javascript
+     *
+     * var str = " UEdtior ";
+     *
+     * //output: 9
+     * console.log( str.length );
+     *
+     * //output: 7
+     * console.log( UE.utils.trim( " UEdtior " ).length );
+     *
+     * //output: 9
+     * console.log( str.length );
+     *
+     *  ```
+     */
+    trim:function (str) {
+        return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, '');
+    },
+
+    /**
+     * 将字符串str以','分隔成数组后,将该数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1
+     * @method listToMap
+     * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。
+     * @param { String } str 该字符串将被以','分割为数组, 然后进行转化
+     * @return { Object } 转化之后的hash对象
+     * @example
+     * ```javascript
+     *
+     * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1}
+     * console.log( UE.utils.listToMap( 'UEdtior,Hello' ) );
+     *
+     * ```
+     */
+
+    /**
+     * 将字符串数组转换成哈希对象, 其生成的hash对象的key为数组中的元素, value为1
+     * @method listToMap
+     * @warning 该方法在生成的hash对象中,会为每一个key同时生成一个另一个全大写的key。
+     * @param { Array } arr 字符串数组
+     * @return { Object } 转化之后的hash对象
+     * @example
+     * ```javascript
+     *
+     * //output: Object {UEdtior: 1, UEDTIOR: 1, Hello: 1, HELLO: 1}
+     * console.log( UE.utils.listToMap( [ 'UEdtior', 'Hello' ] ) );
+     *
+     * ```
+     */
+    listToMap:function (list) {
+        if (!list)return {};
+        list = utils.isArray(list) ? list : list.split(',');
+        for (var i = 0, ci, obj = {}; ci = list[i++];) {
+            obj[ci.toUpperCase()] = obj[ci] = 1;
+        }
+        return obj;
+    },
+
+    /**
+     * 将str中的html符号转义,将转义“',&,<,",>”五个字符
+     * @method unhtml
+     * @param { String } str 需要转义的字符串
+     * @return { String } 转义后的字符串
+     * @example
+     * ```javascript
+     * var html = '<body>&</body>';
+     *
+     * //output: &lt;body&gt;&amp;&lt;/body&gt;
+     * console.log( UE.utils.unhtml( html ) );
+     *
+     * ```
+     */
+    unhtml:function (str, reg) {
+        return str ? str.replace(reg || /[&<">'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g, function (a, b) {
+            if (b) {
+                return a;
+            } else {
+                return {
+                    '<':'&lt;',
+                    '&':'&amp;',
+                    '"':'&quot;',
+                    '>':'&gt;',
+                    "'":'&#39;'
+                }[a]
+            }
+
+        }) : '';
+    },
+    /**
+     * 将url中的html字符转义, 仅转义  ', ", <, > 四个字符
+     * @param  { String } str 需要转义的字符串
+     * @param  { RegExp } reg 自定义的正则
+     * @return { String }     转义后的字符串
+     */
+    unhtmlForUrl:function (str, reg) {
+        return str ? str.replace(reg || /[<">']/g, function (a) {
+            return {
+                '<':'&lt;',
+                '&':'&amp;',
+                '"':'&quot;',
+                '>':'&gt;',
+                "'":'&#39;'
+            }[a]
+
+        }) : '';
+    },
+
+    /**
+     * 将str中的转义字符还原成html字符
+     * @see UE.utils.unhtml(String);
+     * @method html
+     * @param { String } str 需要逆转义的字符串
+     * @return { String } 逆转义后的字符串
+     * @example
+     * ```javascript
+     *
+     * var str = '&lt;body&gt;&amp;&lt;/body&gt;';
+     *
+     * //output: <body>&</body>
+     * console.log( UE.utils.html( str ) );
+     *
+     * ```
+     */
+    html:function (str) {
+        return str ? str.replace(/&((g|l|quo)t|amp|#39|nbsp);/g, function (m) {
+            return {
+                '&lt;':'<',
+                '&amp;':'&',
+                '&quot;':'"',
+                '&gt;':'>',
+                '&#39;':"'",
+                '&nbsp;':' '
+            }[m]
+        }) : '';
+    },
+
+    /**
+     * 将css样式转换为驼峰的形式
+     * @method cssStyleToDomStyle
+     * @param { String } cssName 需要转换的css样式名
+     * @return { String } 转换成驼峰形式后的css样式名
+     * @example
+     * ```javascript
+     *
+     * var str = 'border-top';
+     *
+     * //output: borderTop
+     * console.log( UE.utils.cssStyleToDomStyle( str ) );
+     *
+     * ```
+     */
+    cssStyleToDomStyle:function () {
+        var test = document.createElement('div').style,
+            cache = {
+                'float':test.cssFloat != undefined ? 'cssFloat' : test.styleFloat != undefined ? 'styleFloat' : 'float'
+            };
+
+        return function (cssName) {
+            return cache[cssName] || (cache[cssName] = cssName.toLowerCase().replace(/-./g, function (match) {
+                return match.charAt(1).toUpperCase();
+            }));
+        };
+    }(),
+
+    /**
+     * 动态加载文件到doc中
+     * @method loadFile
+     * @param { DomDocument } document 需要加载资源文件的文档对象
+     * @param { Object } options 加载资源文件的属性集合, 取值请参考代码示例
+     * @example
+     * ```javascript
+     *
+     * UE.utils.loadFile( document, {
+     *     src:"test.js",
+     *     tag:"script",
+     *     type:"text/javascript",
+     *     defer:"defer"
+     * } );
+     *
+     * ```
+     */
+
+    /**
+     * 动态加载文件到doc中,加载成功后执行的回调函数fn
+     * @method loadFile
+     * @param { DomDocument } document 需要加载资源文件的文档对象
+     * @param { Object } options 加载资源文件的属性集合, 该集合支持的值是script标签和style标签支持的所有属性。
+     * @param { Function } fn 资源文件加载成功之后执行的回调
+     * @warning 对于在同一个文档中多次加载同一URL的文件, 该方法会在第一次加载之后缓存该请求,
+     *           在此之后的所有同一URL的请求, 将会直接触发回调。
+     * @example
+     * ```javascript
+     *
+     * UE.utils.loadFile( document, {
+     *     src:"test.js",
+     *     tag:"script",
+     *     type:"text/javascript",
+     *     defer:"defer"
+     * }, function () {
+     *     console.log('加载成功');
+     * } );
+     *
+     * ```
+     */
+    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(' ') + ' ></' + obj.tag + '>');
+                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 settings of file ueditor.config.js ')
+            };
+            doc.getElementsByTagName("head")[0].appendChild(element);
+        }
+    }(),
+
+    /**
+     * 判断obj对象是否为空
+     * @method isEmptyObject
+     * @param { * } obj 需要判断的对象
+     * @remind 如果判断的对象是NULL, 将直接返回true, 如果是数组且为空, 返回true, 如果是字符串, 且字符串为空,
+     *          返回true, 如果是普通对象, 且该对象没有任何实例属性, 返回true
+     * @return { Boolean } 对象是否为空
+     * @example
+     * ```javascript
+     *
+     * //output: true
+     * console.log( UE.utils.isEmptyObject( {} ) );
+     *
+     * //output: true
+     * console.log( UE.utils.isEmptyObject( [] ) );
+     *
+     * //output: true
+     * console.log( UE.utils.isEmptyObject( "" ) );
+     *
+     * //output: false
+     * console.log( UE.utils.isEmptyObject( { key: 1 } ) );
+     *
+     * //output: false
+     * console.log( UE.utils.isEmptyObject( [1] ) );
+     *
+     * //output: false
+     * console.log( UE.utils.isEmptyObject( "1" ) );
+     *
+     * ```
+     */
+    isEmptyObject:function (obj) {
+        if (obj == null) return true;
+        if (this.isArray(obj) || this.isString(obj)) return obj.length === 0;
+        for (var key in obj) if (obj.hasOwnProperty(key)) return false;
+        return true;
+    },
+
+    /**
+     * 把rgb格式的颜色值转换成16进制格式
+     * @method fixColor
+     * @param { String } rgb格式的颜色值
+     * @param { String }
+     * @example
+     * rgb(255,255,255)  => "#ffffff"
+     */
+    fixColor:function (name, value) {
+        if (/color/i.test(name) && /rgba?/.test(value)) {
+            var array = value.split(",");
+            if (array.length > 3)
+                return "";
+            value = "#";
+            for (var i = 0, color; color = array[i++];) {
+                color = parseInt(color.replace(/[^\d]/gi, ''), 10).toString(16);
+                value += color.length == 1 ? "0" + color : color;
+            }
+            value = value.toUpperCase();
+        }
+        return  value;
+    },
+    /**
+     * 只针对border,padding,margin做了处理,因为性能问题
+     * @public
+     * @function
+     * @param {String}    val style字符串
+     */
+    optCss:function (val) {
+        var padding, margin, border;
+        val = val.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi, function (str, key, name, val) {
+            if (val.split(' ').length == 1) {
+                switch (key) {
+                    case 'padding':
+                        !padding && (padding = {});
+                        padding[name] = val;
+                        return '';
+                    case 'margin':
+                        !margin && (margin = {});
+                        margin[name] = val;
+                        return '';
+                    case 'border':
+                        return val == 'initial' ? '' : str;
+                }
+            }
+            return str;
+        });
+
+        function opt(obj, name) {
+            if (!obj) {
+                return '';
+            }
+            var t = obj.top , b = obj.bottom, l = obj.left, r = obj.right, val = '';
+            if (!t || !l || !b || !r) {
+                for (var p in obj) {
+                    val += ';' + name + '-' + p + ':' + obj[p] + ';';
+                }
+            } else {
+                val += ';' + name + ':' +
+                    (t == b && b == l && l == r ? t :
+                        t == b && l == r ? (t + ' ' + l) :
+                            l == r ? (t + ' ' + l + ' ' + b) : (t + ' ' + r + ' ' + b + ' ' + l)) + ';'
+            }
+            return val;
+        }
+
+        val += opt(padding, 'padding') + opt(margin, 'margin');
+        return val.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 + ";;" : ';'
+            });
+    },
+
+    /**
+     * 克隆对象
+     * @method clone
+     * @param { Object } source 源对象
+     * @return { Object } source的一个副本
+     */
+
+    /**
+     * 深度克隆对象,将source的属性克隆到target对象, 会覆盖target重名的属性。
+     * @method clone
+     * @param { Object } source 源对象
+     * @param { Object } target 目标对象
+     * @return { Object } 附加了source对象所有属性的target对象
+     */
+    clone:function (source, target) {
+        var tmp;
+        target = target || {};
+        for (var i in source) {
+            if (source.hasOwnProperty(i)) {
+                tmp = source[i];
+                if (typeof tmp == 'object') {
+                    target[i] = utils.isArray(tmp) ? [] : {};
+                    utils.clone(source[i], target[i])
+                } else {
+                    target[i] = tmp;
+                }
+            }
+        }
+        return target;
+    },
+
+    /**
+     * 把cm/pt为单位的值转换为px为单位的值
+     * @method transUnitToPx
+     * @param { String } 待转换的带单位的字符串
+     * @return { String } 转换为px为计量单位的值的字符串
+     * @example
+     * ```javascript
+     *
+     * //output: 500px
+     * console.log( UE.utils.transUnitToPx( '20cm' ) );
+     *
+     * //output: 27px
+     * console.log( UE.utils.transUnitToPx( '20pt' ) );
+     *
+     * ```
+     */
+    transUnitToPx:function (val) {
+        if (!/(pt|cm)/.test(val)) {
+            return val
+        }
+        var unit;
+        val.replace(/([\d.]+)(\w+)/, function (str, v, u) {
+            val = v;
+            unit = u;
+        });
+        switch (unit) {
+            case 'cm':
+                val = parseFloat(val) * 25;
+                break;
+            case 'pt':
+                val = Math.round(parseFloat(val) * 96 / 72);
+        }
+        return val + (val ? 'px' : '');
+    },
+
+    /**
+     * 在dom树ready之后执行给定的回调函数
+     * @method domReady
+     * @remind 如果在执行该方法的时候, dom树已经ready, 那么回调函数将立刻执行
+     * @param { Function } fn dom树ready之后的回调函数
+     * @example
+     * ```javascript
+     *
+     * UE.utils.domReady( function () {
+     *
+     *     console.log('123');
+     *
+     * } );
+     *
+     * ```
+     */
+    domReady:function () {
+
+        var fnArr = [];
+
+        function doReady(doc) {
+            //确保onready只执行一次
+            doc.isReady = true;
+            for (var ci; ci = fnArr.pop(); ci()) {
+            }
+        }
+
+        return function (onready, win) {
+            win = win || window;
+            var doc = win.document;
+            onready && fnArr.push(onready);
+            if (doc.readyState === "complete") {
+                doReady(doc);
+            } else {
+                doc.isReady && doReady(doc);
+                if (browser.ie && browser.version != 11) {
+                    (function () {
+                        if (doc.isReady) return;
+                        try {
+                            doc.documentElement.doScroll("left");
+                        } catch (error) {
+                            setTimeout(arguments.callee, 0);
+                            return;
+                        }
+                        doReady(doc);
+                    })();
+                    win.attachEvent('onload', function () {
+                        doReady(doc)
+                    });
+                } else {
+                    doc.addEventListener("DOMContentLoaded", function () {
+                        doc.removeEventListener("DOMContentLoaded", arguments.callee, false);
+                        doReady(doc);
+                    }, false);
+                    win.addEventListener('load', function () {
+                        doReady(doc)
+                    }, false);
+                }
+            }
+
+        }
+    }(),
+
+    /**
+     * 动态添加css样式
+     * @method cssRule
+     * @param { String } 节点名称
+     * @grammar UE.utils.cssRule('添加的样式的节点名称',['样式','放到哪个document上'])
+     * @grammar UE.utils.cssRule('body','body{background:#ccc}') => null  //给body添加背景颜色
+     * @grammar UE.utils.cssRule('body') =>样式的字符串  //取得key值为body的样式的内容,如果没有找到key值先关的样式将返回空,例如刚才那个背景颜色,将返回 body{background:#ccc}
+     * @grammar UE.utils.cssRule('body',document) => 返回指定key的样式,并且指定是哪个document
+     * @grammar UE.utils.cssRule('body','') =>null //清空给定的key值的背景颜色
+     */
+    cssRule:browser.ie && browser.version != 11 ? function (key, style, doc) {
+        var indexList, index;
+        if(style === undefined || style && style.nodeType && style.nodeType == 9){
+            //获取样式
+            doc = style && style.nodeType && style.nodeType == 9 ? style : (doc || document);
+            indexList = doc.indexList || (doc.indexList = {});
+            index = indexList[key];
+            if(index !==  undefined){
+                return doc.styleSheets[index].cssText
+            }
+            return undefined;
+        }
+        doc = doc || document;
+        indexList = doc.indexList || (doc.indexList = {});
+        index = indexList[key];
+        //清除样式
+        if(style === ''){
+            if(index!== undefined){
+                doc.styleSheets[index].cssText = '';
+                delete indexList[key];
+                return true
+            }
+            return false;
+        }
+
+        //添加样式
+        if(index!== undefined){
+            sheetStyle =  doc.styleSheets[index];
+        }else{
+            sheetStyle = doc.createStyleSheet('', index = doc.styleSheets.length);
+            indexList[key] = index;
+        }
+        sheetStyle.cssText = style;
+    }: function (key, style, doc) {
+        var head, node;
+        if(style === undefined || style && style.nodeType && style.nodeType == 9){
+            //获取样式
+            doc = style && style.nodeType && style.nodeType == 9 ? style : (doc || document);
+            node = doc.getElementById(key);
+            return node ? node.innerHTML : undefined;
+        }
+        doc = doc || document;
+        node = doc.getElementById(key);
+
+        //清除样式
+        if(style === ''){
+            if(node){
+                node.parentNode.removeChild(node);
+                return true
+            }
+            return false;
+        }
+
+        //添加样式
+        if(node){
+            node.innerHTML = style;
+        }else{
+            node = doc.createElement('style');
+            node.id = key;
+            node.innerHTML = style;
+            doc.getElementsByTagName('head')[0].appendChild(node);
+        }
+    },
+    sort:function(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;
+    },
+    serializeParam:function (json) {
+        var strArr = [];
+        for (var i in json) {
+            //忽略默认的几个参数
+            if(i=="method" || i=="timeout" || i=="async") 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("&");
+    },
+    formatUrl:function (url) {
+        var u = url.replace(/&&/g, '&');
+        u = u.replace(/\?&/g, '?');
+        u = u.replace(/&$/g, '');
+        u = u.replace(/&#/g, '#');
+        u = u.replace(/&+/g, '&');
+        return u;
+    },
+    isCrossDomainUrl:function (url) {
+        var a = document.createElement('a');
+        a.href = url;
+        if (browser.ie) {
+            a.href = a.href;
+        }
+        return !(a.protocol == location.protocol && a.hostname == location.hostname &&
+        (a.port == location.port || (a.port == '80' && location.port == '') || (a.port == '' && location.port == '80')));
+    },
+    clearEmptyAttrs : function(obj){
+        for(var p in obj){
+            if(obj[p] === ''){
+                delete obj[p]
+            }
+        }
+        return obj;
+    },
+    str2json : function(s){
+
+        if (!utils.isString(s)) return null;
+        if (window.JSON) {
+            return JSON.parse(s);
+        } else {
+            return (new Function("return " + utils.trim(s || '')))();
+        }
+
+    },
+    json2str : (function(){
+
+        if (window.JSON) {
+
+            return JSON.stringify;
+
+        } else {
+
+            var escapeMap = {
+                "\b": '\\b',
+                "\t": '\\t',
+                "\n": '\\n',
+                "\f": '\\f',
+                "\r": '\\r',
+                '"' : '\\"',
+                "\\": '\\\\'
+            };
+
+            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 + '"';
+            }
+
+            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(utils.json2str(item));
+                            preComma = 1;
+                    }
+                }
+                result.push("]");
+                return result.join("");
+            }
+
+            function pad(source) {
+                return source < 10 ? '0' + source : source;
+            }
+
+            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 (utils.isArray(value)) {
+                            return encodeArray(value);
+                        } else if (utils.isDate(value)) {
+                            return encodeDate(value);
+                        } else {
+                            var result = ['{'],
+                                encode = utils.json2str,
+                                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('');
+                        }
+                }
+            };
+        }
+
+    })()
+
+};
+/**
+ * 判断给定的对象是否是字符串
+ * @method isString
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是字符串
+ */
+
+/**
+ * 判断给定的对象是否是数组
+ * @method isArray
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是数组
+ */
+
+/**
+ * 判断给定的对象是否是一个Function
+ * @method isFunction
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是Function
+ */
+
+/**
+ * 判断给定的对象是否是Number
+ * @method isNumber
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是Number
+ */
+
+/**
+ * 判断给定的对象是否是一个正则表达式
+ * @method isRegExp
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是正则表达式
+ */
+
+/**
+ * 判断给定的对象是否是一个普通对象
+ * @method isObject
+ * @param { * } object 需要判断的对象
+ * @return { Boolean } 给定的对象是否是普通对象
+ */
+utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object', 'Date'], function (v) {
+    UE.utils['is' + v] = function (obj) {
+        return Object.prototype.toString.apply(obj) == '[object ' + v + ']';
+    }
+});
+
+
+// core/EventBase.js
+/**
+ * UE采用的事件基类
+ * @file
+ * @module UE
+ * @class EventBase
+ * @since 1.2.6.1
+ */
+
+/**
+ * UEditor公用空间,UEditor所有的功能都挂载在该空间下
+ * @unfile
+ * @module UE
+ */
+
+/**
+ * UE采用的事件基类,继承此类的对应类将获取addListener,removeListener,fireEvent方法。
+ * 在UE中,Editor以及所有ui实例都继承了该类,故可以在对应的ui对象以及editor对象上使用上述方法。
+ * @unfile
+ * @module UE
+ * @class EventBase
+ */
+
+/**
+ * 通过此构造器,子类可以继承EventBase获取事件监听的方法
+ * @constructor
+ * @example
+ * ```javascript
+ * UE.EventBase.call(editor);
+ * ```
+ */
+var EventBase = UE.EventBase = function () {};
+
+EventBase.prototype = {
+
+    /**
+     * 注册事件监听器
+     * @method addListener
+     * @param { String } types 监听的事件名称,同时监听多个事件使用空格分隔
+     * @param { Function } fn 监听的事件被触发时,会执行该回调函数
+     * @waining 事件被触发时,监听的函数假如返回的值恒等于true,回调函数的队列中后面的函数将不执行
+     * @example
+     * ```javascript
+     * editor.addListener('selectionchange',function(){
+     *      console.log("选区已经变化!");
+     * })
+     * editor.addListener('beforegetcontent aftergetcontent',function(type){
+     *         if(type == 'beforegetcontent'){
+     *             //do something
+     *         }else{
+     *             //do something
+     *         }
+     *         console.log(this.getContent) // this是注册的事件的编辑器实例
+     * })
+     * ```
+     * @see UE.EventBase:fireEvent(String)
+     */
+    addListener:function (types, listener) {
+        types = utils.trim(types).split(/\s+/);
+        for (var i = 0, ti; ti = types[i++];) {
+            getListener(this, ti, true).push(listener);
+        }
+    },
+
+    on : function(types, listener){
+      return this.addListener(types,listener);
+    },
+    off : function(types, listener){
+        return this.removeListener(types, listener)
+    },
+    trigger:function(){
+        return this.fireEvent.apply(this,arguments);
+    },
+    /**
+     * 移除事件监听器
+     * @method removeListener
+     * @param { String } types 移除的事件名称,同时移除多个事件使用空格分隔
+     * @param { Function } fn 移除监听事件的函数引用
+     * @example
+     * ```javascript
+     * //changeCallback为方法体
+     * editor.removeListener("selectionchange",changeCallback);
+     * ```
+     */
+    removeListener:function (types, listener) {
+        types = utils.trim(types).split(/\s+/);
+        for (var i = 0, ti; ti = types[i++];) {
+            utils.removeItem(getListener(this, ti) || [], listener);
+        }
+    },
+
+    /**
+     * 触发事件
+     * @method fireEvent
+     * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔
+     * @remind 该方法会触发addListener
+     * @return { * } 返回触发事件的队列中,最后执行的回调函数的返回值
+     * @example
+     * ```javascript
+     * editor.fireEvent("selectionchange");
+     * ```
+     */
+
+    /**
+     * 触发事件
+     * @method fireEvent
+     * @param { String } types 触发的事件名称,同时触发多个事件使用空格分隔
+     * @param { *... } options 可选参数,可以传入一个或多个参数,会传给事件触发的回调函数
+     * @return { * } 返回触发事件的队列中,最后执行的回调函数的返回值
+     * @example
+     * ```javascript
+     *
+     * editor.addListener( "selectionchange", function ( type, arg1, arg2 ) {
+     *
+     *     console.log( arg1 + " " + arg2 );
+     *
+     * } );
+     *
+     * //触发selectionchange事件, 会执行上面的事件监听器
+     * //output: Hello World
+     * editor.fireEvent("selectionchange", "Hello", "World");
+     * ```
+     */
+    fireEvent:function () {
+        var types = arguments[0];
+        types = utils.trim(types).split(' ');
+        for (var i = 0, ti; ti = types[i++];) {
+            var listeners = getListener(this, ti),
+                r, t, k;
+            if (listeners) {
+                k = listeners.length;
+                while (k--) {
+                    if(!listeners[k])continue;
+                    t = listeners[k].apply(this, arguments);
+                    if(t === true){
+                        return t;
+                    }
+                    if (t !== undefined) {
+                        r = t;
+                    }
+                }
+            }
+            if (t = this['on' + ti.toLowerCase()]) {
+                r = t.apply(this, arguments);
+            }
+        }
+        return r;
+    }
+};
+/**
+ * 获得对象所拥有监听类型的所有监听器
+ * @unfile
+ * @module UE
+ * @since 1.2.6.1
+ * @method getListener
+ * @public
+ * @param { Object } obj  查询监听器的对象
+ * @param { String } type 事件类型
+ * @param { Boolean } force  为true且当前所有type类型的侦听器不存在时,创建一个空监听器数组
+ * @return { Array } 监听器数组
+ */
+function getListener(obj, type, force) {
+    var allListeners;
+    type = type.toLowerCase();
+    return ( ( allListeners = ( obj.__allListeners || force && ( obj.__allListeners = {} ) ) )
+        && ( allListeners[type] || force && ( allListeners[type] = [] ) ) );
+}
+
+
+
+// core/dtd.js
+///import editor.js
+///import core/dom/dom.js
+///import core/utils.js
+/**
+ * dtd html语义化的体现类
+ * @constructor
+ * @namespace dtd
+ */
+var dtd = dom.dtd = (function() {
+    function _( s ) {
+        for (var k in s) {
+            s[k.toUpperCase()] = s[k];
+        }
+        return s;
+    }
+    var X = utils.extend2;
+    var A = _({isindex:1,fieldset:1}),
+        B = _({input:1,button:1,select:1,textarea:1,label:1}),
+        C = X( _({a:1}), B ),
+        D = X( {iframe:1}, C ),
+        E = _({hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1}),
+        F = _({ins:1,del:1,script:1,style:1}),
+        G = X( _({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1}), F ),
+        H = X( _({sub:1,img:1,embed:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1}), G ),
+        I = X( _({p:1}), H ),
+        J = X( _({iframe:1}), H, B ),
+        K = _({img:1,embed:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1}),
+
+        L = X( _({a:0}), J ),//a不能被切开,所以把他
+        M = _({tr:1}),
+        N = _({'#':1}),
+        O = X( _({param:1}), K ),
+        P = X( _({form:1}), A, D, E, I ),
+        Q = _({li:1,ol:1,ul:1}),
+        R = _({style:1,script:1}),
+        S = _({base:1,link:1,meta:1,title:1}),
+        T = X( S, R ),
+        U = _({head:1,body:1}),
+        V = _({html:1});
+
+    var block = _({address:1,blockquote:1,center:1,dir:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,menu:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1}),
+
+        empty =  _({area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1});
+
+    return  _({
+
+        // $ 表示自定的属性
+
+        // body外的元素列表.
+        $nonBodyContent: X( V, U, S ),
+
+        //块结构元素列表
+        $block : block,
+
+        //内联元素列表
+        $inline : L,
+
+        $inlineWithA : X(_({a:1}),L),
+
+        $body : X( _({script:1,style:1}), block ),
+
+        $cdata : _({script:1,style:1}),
+
+        //自闭和元素
+        $empty : empty,
+
+        //不是自闭合,但不能让range选中里边
+        $nonChild : _({iframe:1,textarea:1}),
+        //列表元素列表
+        $listItem : _({dd:1,dt:1,li:1}),
+
+        //列表根元素列表
+        $list: _({ul:1,ol:1,dl:1}),
+
+        //不能认为是空的元素
+        $isNotEmpty : _({table:1,ul:1,ol:1,dl:1,iframe:1,area:1,base:1,col:1,hr:1,img:1,embed:1,input:1,link:1,meta:1,param:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1}),
+
+        //如果没有子节点就可以删除的元素列表,像span,a
+        $removeEmpty : _({a:1,abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1}),
+
+        $removeEmptyBlock : _({'p':1,'div':1}),
+
+        //在table元素里的元素列表
+        $tableContent : _({caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1,table:1}),
+        //不转换的标签
+        $notTransContent : _({pre:1,script:1,style:1,textarea:1}),
+        html: U,
+        head: T,
+        style: N,
+        script: N,
+        body: P,
+        base: {},
+        link: {},
+        meta: {},
+        title: N,
+        col : {},
+        tr : _({td:1,th:1}),
+        img : {},
+        embed: {},
+        colgroup : _({thead:1,col:1,tbody:1,tr:1,tfoot:1}),
+        noscript : P,
+        td : P,
+        br : {},
+        th : P,
+        center : P,
+        kbd : L,
+        button : X( I, E ),
+        basefont : {},
+        h5 : L,
+        h4 : L,
+        samp : L,
+        h6 : L,
+        ol : Q,
+        h1 : L,
+        h3 : L,
+        option : N,
+        h2 : L,
+        form : X( A, D, E, I ),
+        select : _({optgroup:1,option:1}),
+        font : L,
+        ins : L,
+        menu : Q,
+        abbr : L,
+        label : L,
+        table : _({thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1}),
+        code : L,
+        tfoot : M,
+        cite : L,
+        li : P,
+        input : {},
+        iframe : P,
+        strong : L,
+        textarea : N,
+        noframes : P,
+        big : L,
+        small : L,
+        //trace:
+        span :_({'#':1,br:1,b:1,strong:1,u:1,i:1,em:1,sub:1,sup:1,strike:1,span:1}),
+        hr : L,
+        dt : L,
+        sub : L,
+        optgroup : _({option:1}),
+        param : {},
+        bdo : L,
+        'var' : L,
+        div : P,
+        object : O,
+        sup : L,
+        dd : P,
+        strike : L,
+        area : {},
+        dir : Q,
+        map : X( _({area:1,form:1,p:1}), A, F, E ),
+        applet : O,
+        dl : _({dt:1,dd:1}),
+        del : L,
+        isindex : {},
+        fieldset : X( _({legend:1}), K ),
+        thead : M,
+        ul : Q,
+        acronym : L,
+        b : L,
+        a : X( _({a:1}), J ),
+        blockquote :X(_({td:1,tr:1,tbody:1,li:1}),P),
+        caption : L,
+        i : L,
+        u : L,
+        tbody : M,
+        s : L,
+        address : X( D, I ),
+        tt : L,
+        legend : L,
+        q : L,
+        pre : X( G, C ),
+        p : X(_({'a':1}),L),
+        em :L,
+        dfn : L
+    });
+})();
+
+
+// core/domUtils.js
+/**
+ * Dom操作工具包
+ * @file
+ * @module UE.dom.domUtils
+ * @since 1.2.6.1
+ */
+
+/**
+ * Dom操作工具包
+ * @unfile
+ * @module UE.dom.domUtils
+ */
+function getDomNode(node, start, ltr, startFromChild, fn, guard) {
+    var tmpNode = startFromChild && node[start],
+        parent;
+    !tmpNode && (tmpNode = node[ltr]);
+    while (!tmpNode && (parent = (parent || node).parentNode)) {
+        if (parent.tagName == 'BODY' || guard && !guard(parent)) {
+            return null;
+        }
+        tmpNode = parent[ltr];
+    }
+    if (tmpNode && fn && !fn(tmpNode)) {
+        return  getDomNode(tmpNode, start, ltr, false, fn);
+    }
+    return tmpNode;
+}
+var attrFix = ie && browser.version < 9 ? {
+        tabindex:"tabIndex",
+        readonly:"readOnly",
+        "for":"htmlFor",
+        "class":"className",
+        maxlength:"maxLength",
+        cellspacing:"cellSpacing",
+        cellpadding:"cellPadding",
+        rowspan:"rowSpan",
+        colspan:"colSpan",
+        usemap:"useMap",
+        frameborder:"frameBorder"
+    } : {
+        tabindex:"tabIndex",
+        readonly:"readOnly"
+    },
+    styleBlock = utils.listToMap([
+        '-webkit-box', '-moz-box', 'block' ,
+        'list-item' , 'table' , 'table-row-group' ,
+        'table-header-group', 'table-footer-group' ,
+        'table-row' , 'table-column-group' , 'table-column' ,
+        'table-cell' , 'table-caption'
+    ]);
+var domUtils = dom.domUtils = {
+    //节点常量
+    NODE_ELEMENT:1,
+    NODE_DOCUMENT:9,
+    NODE_TEXT:3,
+    NODE_COMMENT:8,
+    NODE_DOCUMENT_FRAGMENT:11,
+
+    //位置关系
+    POSITION_IDENTICAL:0,
+    POSITION_DISCONNECTED:1,
+    POSITION_FOLLOWING:2,
+    POSITION_PRECEDING:4,
+    POSITION_IS_CONTAINED:8,
+    POSITION_CONTAINS:16,
+    //ie6使用其他的会有一段空白出现
+    fillChar:ie && browser.version == '6' ? '\ufeff' : '\u200B',
+    //-------------------------Node部分--------------------------------
+    keys:{
+        /*Backspace*/ 8:1, /*Delete*/ 46:1,
+        /*Shift*/ 16:1, /*Ctrl*/ 17:1, /*Alt*/ 18:1,
+        37:1, 38:1, 39:1, 40:1,
+        13:1 /*enter*/
+    },
+    /**
+     * 获取节点A相对于节点B的位置关系
+     * @method getPosition
+     * @param { Node } nodeA 需要查询位置关系的节点A
+     * @param { Node } nodeB 需要查询位置关系的节点B
+     * @return { Number } 节点A与节点B的关系
+     * @example
+     * ```javascript
+     * //output: 20
+     * var position = UE.dom.domUtils.getPosition( document.documentElement, document.body );
+     *
+     * switch ( position ) {
+     *
+     *      //0
+     *      case UE.dom.domUtils.POSITION_IDENTICAL:
+     *          console.log('元素相同');
+     *          break;
+     *      //1
+     *      case UE.dom.domUtils.POSITION_DISCONNECTED:
+     *          console.log('两个节点在不同的文档中');
+     *          break;
+     *      //2
+     *      case UE.dom.domUtils.POSITION_FOLLOWING:
+     *          console.log('节点A在节点B之后');
+     *          break;
+     *      //4
+     *      case UE.dom.domUtils.POSITION_PRECEDING;
+     *          console.log('节点A在节点B之前');
+     *          break;
+     *      //8
+     *      case UE.dom.domUtils.POSITION_IS_CONTAINED:
+     *          console.log('节点A被节点B包含');
+     *          break;
+     *      case 10:
+     *          console.log('节点A被节点B包含且节点A在节点B之后');
+     *          break;
+     *      //16
+     *      case UE.dom.domUtils.POSITION_CONTAINS:
+     *          console.log('节点A包含节点B');
+     *          break;
+     *      case 20:
+     *          console.log('节点A包含节点B且节点A在节点B之前');
+     *          break;
+     *
+     * }
+     * ```
+     */
+    getPosition:function (nodeA, nodeB) {
+        // 如果两个节点是同一个节点
+        if (nodeA === nodeB) {
+            // domUtils.POSITION_IDENTICAL
+            return 0;
+        }
+        var node,
+            parentsA = [nodeA],
+            parentsB = [nodeB];
+        node = nodeA;
+        while (node = node.parentNode) {
+            // 如果nodeB是nodeA的祖先节点
+            if (node === nodeB) {
+                // domUtils.POSITION_IS_CONTAINED + domUtils.POSITION_FOLLOWING
+                return 10;
+            }
+            parentsA.push(node);
+        }
+        node = nodeB;
+        while (node = node.parentNode) {
+            // 如果nodeA是nodeB的祖先节点
+            if (node === nodeA) {
+                // domUtils.POSITION_CONTAINS + domUtils.POSITION_PRECEDING
+                return 20;
+            }
+            parentsB.push(node);
+        }
+        parentsA.reverse();
+        parentsB.reverse();
+        if (parentsA[0] !== parentsB[0]) {
+            // domUtils.POSITION_DISCONNECTED
+            return 1;
+        }
+        var i = -1;
+        while (i++, parentsA[i] === parentsB[i]) {
+        }
+        nodeA = parentsA[i];
+        nodeB = parentsB[i];
+        while (nodeA = nodeA.nextSibling) {
+            if (nodeA === nodeB) {
+                // domUtils.POSITION_PRECEDING
+                return 4
+            }
+        }
+        // domUtils.POSITION_FOLLOWING
+        return  2;
+    },
+
+    /**
+     * 检测节点node在父节点中的索引位置
+     * @method getNodeIndex
+     * @param { Node } node 需要检测的节点对象
+     * @return { Number } 该节点在父节点中的位置
+     * @see UE.dom.domUtils.getNodeIndex(Node,Boolean)
+     */
+
+    /**
+     * 检测节点node在父节点中的索引位置, 根据给定的mergeTextNode参数决定是否要合并多个连续的文本节点为一个节点
+     * @method getNodeIndex
+     * @param { Node } node 需要检测的节点对象
+     * @param { Boolean } mergeTextNode 是否合并多个连续的文本节点为一个节点
+     * @return { Number } 该节点在父节点中的位置
+     * @example
+     * ```javascript
+     *
+     *      var node = document.createElement("div");
+     *
+     *      node.appendChild( document.createTextNode( "hello" ) );
+     *      node.appendChild( document.createTextNode( "world" ) );
+     *      node.appendChild( node = document.createElement( "div" ) );
+     *
+     *      //output: 2
+     *      console.log( UE.dom.domUtils.getNodeIndex( node ) );
+     *
+     *      //output: 1
+     *      console.log( UE.dom.domUtils.getNodeIndex( node, true ) );
+     *
+     * ```
+     */
+    getNodeIndex:function (node, ignoreTextNode) {
+        var preNode = node,
+            i = 0;
+        while (preNode = preNode.previousSibling) {
+            if (ignoreTextNode && preNode.nodeType == 3) {
+                if(preNode.nodeType != preNode.nextSibling.nodeType ){
+                    i++;
+                }
+                continue;
+            }
+            i++;
+        }
+        return i;
+    },
+
+    /**
+     * 检测节点node是否在给定的document对象上
+     * @method inDoc
+     * @param { Node } node 需要检测的节点对象
+     * @param { DomDocument } doc 需要检测的document对象
+     * @return { Boolean } 该节点node是否在给定的document的dom树上
+     * @example
+     * ```javascript
+     *
+     * var node = document.createElement("div");
+     *
+     * //output: false
+     * console.log( UE.do.domUtils.inDoc( node, document ) );
+     *
+     * document.body.appendChild( node );
+     *
+     * //output: true
+     * console.log( UE.do.domUtils.inDoc( node, document ) );
+     *
+     * ```
+     */
+    inDoc:function (node, doc) {
+        return domUtils.getPosition(node, doc) == 10;
+    },
+    /**
+     * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点,
+     * 查找的起点是给定node节点的父节点。
+     * @method findParent
+     * @param { Node } node 需要查找的节点
+     * @param { Function } filterFn 自定义的过滤方法。
+     * @warning 查找的终点是到body节点为止
+     * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数, 该对象代表当前执行检测的祖先节点。 如果该
+     *          节点满足过滤条件, 则要求返回true, 这时将直接返回该节点作为findParent()的结果, 否则, 请返回false。
+     * @return { Node | Null } 如果找到符合过滤条件的节点, 就返回该节点, 否则返回NULL
+     * @example
+     * ```javascript
+     * var filterNode = UE.dom.domUtils.findParent( document.body.firstChild, function ( node ) {
+     *
+     *     //由于查找的终点是body节点, 所以永远也不会匹配当前过滤器的条件, 即这里永远会返回false
+     *     return node.tagName === "HTML";
+     *
+     * } );
+     *
+     * //output: true
+     * console.log( filterNode === null );
+     * ```
+     */
+
+    /**
+     * 根据给定的过滤规则filterFn, 查找符合该过滤规则的node节点的第一个祖先节点,
+     * 如果includeSelf的值为true,则查找的起点是给定的节点node, 否则, 起点是node的父节点
+     * @method findParent
+     * @param { Node } node 需要查找的节点
+     * @param { Function } filterFn 自定义的过滤方法。
+     * @param { Boolean } includeSelf 查找过程是否包含自身
+     * @warning 查找的终点是到body节点为止
+     * @remind 自定义的过滤方法filterFn接受一个Node对象作为参数, 该对象代表当前执行检测的祖先节点。 如果该
+     *          节点满足过滤条件, 则要求返回true, 这时将直接返回该节点作为findParent()的结果, 否则, 请返回false。
+     * @remind 如果includeSelf为true, 则过滤器第一次执行时的参数会是节点本身。
+     *          反之, 过滤器第一次执行时的参数将是该节点的父节点。
+     * @return { Node | Null } 如果找到符合过滤条件的节点, 就返回该节点, 否则返回NULL
+     * @example
+     * ```html
+     * <body>
+     *
+     *      <div id="test">
+     *      </div>
+     *
+     *      <script type="text/javascript">
+     *
+     *          //output: DIV, BODY
+     *          var filterNode = UE.dom.domUtils.findParent( document.getElementById( "test" ), function ( node ) {
+     *
+     *              console.log( node.tagName );
+     *              return false;
+     *
+     *          }, true );
+     *
+     *      </script>
+     * </body>
+     * ```
+     */
+    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
+     * <div id="test">
+     *     <div id="child">你好</div>
+     * </div>
+     * <script>
+     *     UE.dom.domUtils.remove( document.body, false );
+     *     //output: false
+     *     console.log( document.getElementById( "child" ) !== null );
+     * </script>
+     * ```
+     */
+
+    /**
+     * 删除节点node,并根据keepChildren的值决定是否保留子节点
+     * @method remove
+     * @param { Node } node 需要删除的节点对象
+     * @param { Boolean } keepChildren 是否需要保留子节点
+     * @return { Node } 返回刚删除的节点对象
+     * @example
+     * ```html
+     * <div id="test">
+     *     <div id="child">你好</div>
+     * </div>
+     * <script>
+     *     UE.dom.domUtils.remove( document.body, true );
+     *     //output: true
+     *     console.log( document.getElementById( "child" ) !== null );
+     * </script>
+     * ```
+     */
+    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
+     *     <body>
+     *      <div id="test">
+     *          <span></span>
+     *      </div>
+     *      <i>xxx</i>
+     * </body>
+     * <script>
+     *
+     *     //output: i节点
+     *     console.log( UE.dom.domUtils.getNextDomNode( document.getElementById( "test" ) ) );
+     *
+     * </script>
+     * ```
+     * @example
+     * ```html
+     * <body>
+     *      <div>
+     *          <span></span>
+     *          <i id="test">xxx</i>
+     *      </div>
+     *      <b>xxx</b>
+     * </body>
+     * <script>
+     *
+     *     //由于id为test的i节点之后没有兄弟节点, 则查找其父节点(div)后面的兄弟节点
+     *     //output: b节点
+     *     console.log( UE.dom.domUtils.getNextDomNode( document.getElementById( "test" ) ) );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点,
+     * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false,
+     * 则执行<a href="#UE.dom.domUtils.getNextDomNode(Node)">getNextDomNode(Node node)</a>的查找过程。
+     * @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
+     * <span id="_baidu_bookmark_1"></span>
+     * <script>
+     *      var bookmarkNode = document.getElementById("_baidu_bookmark_1");
+     *      //output: true
+     *      console.log( UE.dom.domUtils.isBookmarkNode( bookmarkNode ) );
+     * </script>
+     * ```
+     */
+    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
+     * <body>
+     *     <div></div>
+     *     <span id="test"></span>
+     *     <i></i>
+     *     <b></b>
+     *     <em>xxx</em>
+     *     <span></span>
+     * </body>
+     * <script>
+     *
+     *      UE.dom.domUtils.clearEmptySibling( document.getElementById( "test" ) );
+     *
+     *      //output: <div></div><span id="test"></span><em>xxx</em><span></span>
+     *      console.log( document.body.innerHTML );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 清除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
+     * <div id="test">abcdef</div>
+     * <script>
+     *      var newNode = UE.dom.domUtils.split( document.getElementById( "test" ).firstChild, 3 );
+     *      //output: def
+     *      console.log( newNode.nodeValue );
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test">
+     *
+     * </div>
+     * <script>
+     *      //output: true
+     *      console.log( UE.dom.domUtils.isWhitespace( document.getElementById("test").firstChild ) );
+     * </script>
+     * ```
+     */
+    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
+     * <span style="font-size:12px">ssss</span>
+     * <span style="font-size:12px">bbbbb</span>
+     * <span style="font-size:13px">ssss</span>
+     * <span style="font-size:14px">bbbbb</span>
+     *
+     * <script>
+     *
+     *     var nodes = document.getElementsByTagName( "span" );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isSameElement( nodes[0], nodes[1] ) );
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.isSameElement( nodes[2], nodes[3] ) );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <span style="font-size:12px">ssss</span>
+     * <span style="font-size:12px">bbbbb</span>
+     * <span style="font-size:13px">ssss</span>
+     * <span style="font-size:14px">bbbbb</span>
+     *
+     * <script>
+     *
+     *     var nodes = document.getElementsByTagName( "span" );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isSameStyle( nodes[0], nodes[1] ) );
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.isSameStyle( nodes[2], nodes[3] ) );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <span id="test1" style="display: block"></span>
+     * <span id="test2"></span>
+     * <div id="test3" style="display: inline"></div>
+     *
+     * <script>
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isBlockElm( document.getElementById("test1") ) );
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.isBlockElm( document.getElementById("test2") ) );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isBlockElm( document.getElementById("test3") ) );
+     *
+     * </script>
+     * ```
+     */
+    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: <p><span></span></p>
+     *      console.log( wrapNode.innerHTML );
+     *
+     *
+     *      UE.dom.domUtils.breakParent( node, parent );
+     *      //拆分后
+     *      //output: <p></p><span></span><p></p>
+     *      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
+     * <b><i></i></b> => 1
+     * <b><i></i><u></u></b> => 1
+     * <b></b> => 1
+     * <b>xx<i></i></b> => 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
+     * <p><span style="font-size:12px;">xx<span style="font-size:12px;">aa</span>xx</span></p>
+     * ==> UE.dom.domUtils.mergeChild(node,'span')
+     * <p><span style="font-size:12px;">xxaaxx</span></p>
+     */
+    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
+     * <div id="parent">
+     *     <div id="sub">
+     *         <span id="child"></span>
+     *     </div>
+     * </div>
+     *
+     * <script>
+     *
+     *     var child = document.getElementById( "child" );
+     *
+     *     //output: sub
+     *     console.log( child.parentNode.id );
+     *
+     *     UE.dom.domUtils.mergeToParent( child );
+     *
+     *     //output: parent
+     *     console.log( child.parentNode.id );
+     *
+     * </script>
+     * ```
+     */
+    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需要特殊处理  不处理这样的情况 <span stlye="color:#fff">xxx<span style="color:#ccc">xxx</span>xxx</span>
+                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
+     * <b>xxxx</b><b id="test">ooo</b><b>xxxx</b>
+     *
+     * <script>
+     *     var demoNode = document.getElementById("test");
+     *     UE.dom.domUtils.mergeSibling( demoNode );
+     *     //output: xxxxoooxxxx
+     *     console.log( demoNode.innerHTML );
+     * </script>
+     * ```
+     */
+
+    /**
+     * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。
+     * @method mergeSibling
+     * @param { Element } node 需要合并的目标节点
+     * @param { Boolean } ignorePre 是否忽略合并左节点
+     * @example
+     * ```html
+     * <b>xxxx</b><b id="test">ooo</b><b>xxxx</b>
+     *
+     * <script>
+     *     var demoNode = document.getElementById("test");
+     *     UE.dom.domUtils.mergeSibling( demoNode, true );
+     *     //output: oooxxxx
+     *     console.log( demoNode.innerHTML );
+     * </script>
+     * ```
+     */
+
+    /**
+     * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。
+     * @method mergeSibling
+     * @param { Element } node 需要合并的目标节点
+     * @param { Boolean } ignorePre 是否忽略合并左节点
+     * @param { Boolean } ignoreNext 是否忽略合并右节点
+     * @remind 如果同时忽略左右节点, 则该操作什么也不会做
+     * @example
+     * ```html
+     * <b>xxxx</b><b id="test">ooo</b><b>xxxx</b>
+     *
+     * <script>
+     *     var demoNode = document.getElementById("test");
+     *     UE.dom.domUtils.mergeSibling( demoNode, false, true );
+     *     //output: xxxxooo
+     *     console.log( demoNode.innerHTML );
+     * </script>
+     * ```
+     */
+    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
+     * <div id="wrap">
+     *      <span style="font-size:14px;" id="test" name="followMe">xxxxx</span>
+     * </div>
+     *
+     * <script>
+     *
+     *     UE.dom.domUtils.removeAttributes( document.getElementById( "test" ), "id name" );
+     *
+     *     //output: <span style="font-size:14px;">xxxxx</span>
+     *     console.log( document.getElementById("wrap").innerHTML );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 删除节点node上的指定属性名称的属性
+     * @method  removeAttributes
+     * @param { Node } node 需要删除属性的节点对象
+     * @param { Array } attrNames 需要删除的属性名数组
+     * @example
+     * ```html
+     * <div id="wrap">
+     *      <span style="font-size:14px;" id="test" name="followMe">xxxxx</span>
+     * </div>
+     *
+     * <script>
+     *
+     *     UE.dom.domUtils.removeAttributes( document.getElementById( "test" ), ["id", "name"] );
+     *
+     *     //output: <span style="font-size:14px;">xxxxx</span>
+     *     console.log( document.getElementById("wrap").innerHTML );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <span id="test"></span>
+     *
+     * <script>
+     *
+     *     var testNode = UE.dom.domUtils.setAttributes( document.getElementById( "test" ), {
+     *         id: 'demo'
+     *     } );
+     *
+     *     //output: demo
+     *     console.log( testNode.id );
+     *
+     * </script>
+     *
+     */
+    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
+     * <style type="text/css">
+     *      #test {
+     *          font-size: 15px;
+     *      }
+     * </style>
+     *
+     * <span id="test"></span>
+     *
+     * <script>
+     *     //output: 15px
+     *     console.log( UE.dom.domUtils.getComputedStyle( document.getElementById( "test" ), 'font-size' ) );
+     * </script>
+     * ```
+     */
+    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
+     * <span id="test" class="test1 test2 test3">xxx</span>
+     *
+     * <script>
+     *
+     *     var testNode = document.getElementById( "test" );
+     *     UE.dom.domUtils.removeClasses( testNode, "test1 test2" );
+     *
+     *     //output: test3
+     *     console.log( testNode.className );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 删除元素element指定的className
+     * @method removeClasses
+     * @param { Element } ele 需要删除class的元素节点
+     * @param { Array } classNames 需要删除的className数组
+     * @example
+     * ```html
+     * <span id="test" class="test1 test2 test3">xxx</span>
+     *
+     * <script>
+     *
+     *     var testNode = document.getElementById( "test" );
+     *     UE.dom.domUtils.removeClasses( testNode, ["test1", "test2"] );
+     *
+     *     //output: test3
+     *     console.log( testNode.className );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <span id="test" class="cls1 cls2"></span>
+     *
+     * <script>
+     *     var testNode = document.getElementById("test");
+     *
+     *     UE.dom.domUtils.addClass( testNode, "cls2 cls3 cls4" );
+     *
+     *     //output: cl1 cls2 cls3 cls4
+     *     console.log( testNode.className );
+     *
+     * <script>
+     * ```
+     */
+
+    /**
+     * 给元素element添加className
+     * @method addClass
+     * @param { Node } ele 需要增加className的元素
+     * @param { Array } classNames 需要添加的className的数组
+     * @remind 相同的类名不会被重复添加
+     * @example
+     * ```html
+     * <span id="test" class="cls1 cls2"></span>
+     *
+     * <script>
+     *     var testNode = document.getElementById("test");
+     *
+     *     UE.dom.domUtils.addClass( testNode, ["cls2", "cls3", "cls4"] );
+     *
+     *     //output: cl1 cls2 cls3 cls4
+     *     console.log( testNode.className );
+     *
+     * <script>
+     * ```
+     */
+    addClass:function (elm, classNames) {
+        if(!elm)return;
+        classNames = utils.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);
+    },
+    /**
+     * 判断元素element是否包含给定的样式类名className
+     * @method hasClass
+     * @param { Node } ele 需要检测的元素
+     * @param { String } classNames 需要检测的className, 多个className之间用空格分割
+     * @return { Boolean } 元素是否包含所有给定的className
+     * @example
+     * ```html
+     * <span id="test1" class="cls1 cls2"></span>
+     *
+     * <script>
+     *     var test1 = document.getElementById("test1");
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.hasClass( test1, "cls2 cls1 cls3" ) );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.hasClass( test1, "cls2 cls1" ) );
+     * </script>
+     * ```
+     */
+
+    /**
+     * 判断元素element是否包含给定的样式类名className
+     * @method hasClass
+     * @param { Node } ele 需要检测的元素
+     * @param { Array } classNames 需要检测的className数组
+     * @return { Boolean } 元素是否包含所有给定的className
+     * @example
+     * ```html
+     * <span id="test1" class="cls1 cls2"></span>
+     *
+     * <script>
+     *     var test1 = document.getElementById("test1");
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.hasClass( test1, [ "cls2", "cls1", "cls3" ] ) );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.hasClass( test1, [ "cls2", "cls1" ]) );
+     * </script>
+     * ```
+     */
+    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
+     * <span id="test" style="color: red; background: blue;"></span>
+     *
+     * <script>
+     *
+     *     var testNode = document.getElementById("test");
+     *
+     *     UE.dom.domUtils.removeStyle( testNode, 'color' );
+     *
+     *     //output: background: blue;
+     *     console.log( testNode.style.cssText );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test" style="color: red;"></div>
+     *
+     * <script>
+     *
+     *      var testNode = document.getElementById( "test" );
+     *
+     *      //output: red
+     *      console.log( UE.dom.domUtils.getStyle( testNode, "color" ) );
+     *
+     *      //output: ""
+     *      console.log( UE.dom.domUtils.getStyle( testNode, "background" ) );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"></div>
+     *
+     * <script>
+     *
+     *      var testNode = document.getElementById( "test" );
+     *
+     *      //output: ""
+     *      console.log( testNode.style.color );
+     *
+     *      UE.dom.domUtils.setStyle( testNode, 'color', 'red' );
+     *      //output: "red"
+     *      console.log( testNode.style.color );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"></div>
+     *
+     * <script>
+     *
+     *      var testNode = document.getElementById( "test" );
+     *
+     *      //output: ""
+     *      console.log( testNode.style.color );
+     *
+     *      UE.dom.domUtils.setStyles( testNode, {
+     *          'color': 'red'
+     *      } );
+     *      //output: "red"
+     *      console.log( testNode.style.color );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test">
+     *      <span></span>
+     * </div>
+     *
+     * <script>
+     *
+     *     //output: 3
+     *     console.log( UE.dom.domUtils.getChildCount( document.getElementById("test") ) );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 根据给定的过滤规则, 获取符合条件的子节点的数量
+     * @method getChildCount
+     * @param { Element } node 需要检测的元素
+     * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false
+     * @return { Number } 符合过滤条件的node元素的子节点数量
+     * @example
+     * ```html
+     * <div id="test">
+     *      <span></span>
+     * </div>
+     *
+     * <script>
+     *
+     *     //output: 1
+     *     console.log( UE.dom.domUtils.getChildCount( document.getElementById("test"), function ( node ) {
+     *
+     *         return node.nodeType === 1;
+     *
+     *     } ) );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"></div>
+     *
+     * <script>
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isEmptyBlock( document.getElementById("test") ) );
+     * </script>
+     * ```
+     */
+
+    /**
+     * 根据指定的判断规则判断给定的元素是否是一个空元素
+     * @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
+     * <div id="test" style="top: 100px; left: 50px; position: absolute;"></div>
+     *
+     * <script>
+     *
+     *     var testNode = document.getElementById("test");
+     *
+     *     UE.dom.domUtils.setViewportOffset( testNode, {
+     *         left: 200,
+     *         top: 50
+     *     } );
+     *
+     *     //output: top: 300px; left: 100px; position: absolute;
+     *     console.log( testNode.style.cssText );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"></div>
+     *
+     * <script>
+     *     var testNode = document.getElementById("test");
+     *
+     *     //output: 0
+     *     console.log( testNode.childNodes.length );
+     *
+     *     UE.dom.domUtils.fillNode( document, testNode );
+     *
+     *     //output: 1
+     *     console.log( testNode.childNodes.length );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test1">
+     *      <span></span>
+     * </div>
+     * <div id="test2">
+     *     <div></div>
+     * </div>
+     *
+     * <script>
+     *
+     *     var test1 = document.getElementById("test1"),
+     *         test2 = document.getElementById("test2");
+     *
+     *     UE.dom.domUtils.moveChild( test1, test2 );
+     *
+     *     //output: ""(空字符串)
+     *     console.log( test1.innerHTML );
+     *
+     *     //output: "<div></div><span></span>"
+     *     console.log( test2.innerHTML );
+     *
+     * </script>
+     * ```
+     */
+
+    /**
+     * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部”
+     * @method moveChild
+     * @param { Node } src 源节点, 该节点下的所有子节点将被移除
+     * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下
+     * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾
+     * @example
+     * ```html
+     * <div id="test1">
+     *      <span></span>
+     * </div>
+     * <div id="test2">
+     *     <div></div>
+     * </div>
+     *
+     * <script>
+     *
+     *     var test1 = document.getElementById("test1"),
+     *         test2 = document.getElementById("test2");
+     *
+     *     UE.dom.domUtils.moveChild( test1, test2, true );
+     *
+     *     //output: ""(空字符串)
+     *     console.log( test1.innerHTML );
+     *
+     *     //output: "<span></span><div></div>"
+     *     console.log( test2.innerHTML );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"><span>xxxx</span></div>
+     *
+     * <script>
+     *
+     *     //output: false
+     *     console.log( UE.dom.domUtils.hasNoAttributes( document.getElementById("test") ) );
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.hasNoAttributes( document.getElementById("test").firstChild ) );
+     *
+     * </script>
+     * ```
+     */
+    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
+     * <div id="test"></div>
+     *
+     * <script>
+     *
+     *     //output: true
+     *     console.log( UE.dom.domUtils.isTagNode( document.getElementById("test"), "div" ) );
+     *
+     * </script>
+     * ```
+     */
+    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 ? '&nbsp;' : '<br/>'
+};
+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
+         * <body>
+         *      <!-- 中括号表示选区 -->
+         *      <b>x<i>x[x</i>xx]x</b>
+         *
+         *      <script>
+         *          //range是已选中的选区
+         *          var fragment = range.cloneContents(),
+         *              node = document.createElement("div");
+         *
+         *          node.appendChild( fragment );
+         *
+         *          //output: <i>x</i>xx
+         *          console.log( node.innerHTML );
+         *
+         *      </script>
+         * </body>
+         * ```
+         */
+        cloneContents:function () {
+            return this.collapsed ? null : execContentsAction(this, 0);
+        },
+
+        /**
+         * 删除当前选区范围中的所有内容
+         * @method deleteContents
+         * @remind 执行完该操作后, 当前Range对象变成了闭合状态
+         * @return { UE.dom.Range } 当前操作的Range对象
+         * @example
+         * ```html
+         * <body>
+         *      <!-- 中括号表示选区 -->
+         *      <b>x<i>x[x</i>xx]x</b>
+         *
+         *      <script>
+         *          //range是已选中的选区
+         *          range.deleteContents();
+         *
+         *          //竖线表示闭合后的选区位置
+         *          //output: <b>x<i>x</i>|x</b>
+         *          console.log( document.body.innerHTML );
+         *
+         *          //此时, range的各项属性为
+         *          //output: B
+         *          console.log( range.startContainer.tagName );
+         *          //output: 2
+         *          console.log( range.startOffset );
+         *          //output: B
+         *          console.log( range.endContainer.tagName );
+         *          //output: 2
+         *          console.log( range.endOffset );
+         *          //output: true
+         *          console.log( range.collapsed );
+         *
+         *      </script>
+         * </body>
+         * ```
+         */
+        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
+         * <body>
+         *      <!-- 中括号表示选区 -->
+         *      <b>x<i>x[x</i>xx]x</b>
+         *
+         *      <script>
+         *          //range是已选中的选区
+         *          var fragment = range.extractContents(),
+         *              node = document.createElement( "div" );
+         *
+         *          node.appendChild( fragment );
+         *
+         *          //竖线表示闭合后的选区位置
+         *
+         *          //output: <b>x<i>x</i>|x</b>
+         *          console.log( document.body.innerHTML );
+         *          //output: <i>x</i>xx
+         *          console.log( node.innerHTML );
+         *
+         *          //此时, range的各项属性为
+         *          //output: B
+         *          console.log( range.startContainer.tagName );
+         *          //output: 2
+         *          console.log( range.startOffset );
+         *          //output: B
+         *          console.log( range.endContainer.tagName );
+         *          //output: 2
+         *          console.log( range.endOffset );
+         *          //output: true
+         *          console.log( range.collapsed );
+         *
+         *      </script>
+         * </body>
+         */
+        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
+         * <!-- 选区 -->
+         * <b>xxx<i>x<span>xx</span>xx<em>xx</em>xxx</i>[xxx]</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.setStart( document.getElementsByTagName("i")[0], 1 );
+         *
+         *     //此时, 选区变成了
+         *     //<b>xxx<i>x[<span>xx</span>xx<em>xx</em>xxx</i>xxx]</b>
+         *
+         * </script>
+         * ```
+         * @example
+         * ```html
+         * <!-- 选区 -->
+         * <b>xxx<img>[xx]x</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.setStart( document.getElementsByTagName("img")[0], 3 );
+         *
+         *     //此时, 选区变成了
+         *     //<b>xxx[<img>xx]x</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>xx[x</span>xxx]</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.setStartAfter( document.getElementsByTagName("i")[0] );
+         *
+         *     //结果选区
+         *     //<b>xx<i>xxx</i>[<span>xxx</span>xxx]</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>[xx<i>xxx</i><span>xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.setStartAfter( document.getElementsByTagName("span")[0] );
+         *
+         *     //结果选区
+         *     //<b>[xx<i>xxx</i><span>xxx</span>]xxx</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.setStartAtFirst( document.getElementsByTagName("i")[0] );
+         *
+         *     //结果选区
+         *     //<b>xx<i>[xxx</i><span>xx]x</span>xxx</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.selectNode( document.getElementsByTagName("i")[0] );
+         *
+         *     //结果选区
+         *     //<b>xx[<i>xxx</i>]<span>xxx</span>xxx</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.selectNode( document.getElementsByTagName("b")[0] );
+         *
+         *     //结果选区
+         *     //<b>[xx<i>xxx</i><span>xxx</span>xxx]</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.collapse();
+         *
+         *     //结果选区
+         *     //“|”表示选区已闭合
+         *     //<b>xx<i>xxx</i><span>xx|x</span>xxx</b>
+         *
+         * </script>
+         * ```
+         */
+
+        /**
+         * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合,
+         * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。
+         * @method  collapse
+         * @param { Boolean } toStart 是否向选区开始处闭合
+         * @return { UE.dom.Range } 当前range对象,此时range对象处于闭合状态
+         * @see UE.dom.Range:collapse()
+         * @example
+         * ```html
+         * <!-- 选区示例 -->
+         * <b>xx<i>xxx</i><span>[xx]x</span>xxx</b>
+         *
+         * <script>
+         *
+         *     //执行操作
+         *     range.collapse( true );
+         *
+         *     //结果选区
+         *     //“|”表示选区已闭合
+         *     //<b>xx<i>xxx</i><span>|xxx</span>xxx</b>
+         *
+         * </script>
+         * ```
+         */
+        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
+         * <span>xx<b>xx[</b>xxxxx]</span> => <span>xx<b>xx</b>[xxxxx]</span>
+         * ```
+         *
+         * @example
+         * ```html
+         * <!-- 选区示例 -->
+         * <b>x[xx</b><i>]xxx</i>
+         *
+         * <script>
+         *
+         *     //执行收缩
+         *     range.shrinkBoundary();
+         *
+         *     //结果选区
+         *     //<b>x[xx]</b><i>xxx</i>
+         * </script>
+         * ```
+         *
+         * @example
+         * ```html
+         * [<b><i>xxxx</i>xxxxxxx</b>] => <b><i>[xxxx</i>xxxxxxx]</b>
+         * ```
+         */
+
+        /**
+         * 调整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
+         * //选区示例
+         * <span>xxx<b>x[x<em>xx]x</em>xxx</b>xx</span>
+         * <script>
+         *
+         *     var node = range.getCommonAncestor();
+         *
+         *     //公共祖先节点是: b节点
+         *     //输出: B
+         *     console.log(node.tagName);
+         *
+         * </script>
+         * ```
+         */
+
+        /**
+         * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到
+         * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf
+         * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点
+         * @method  getCommonAncestor
+         * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点
+         * @return { Node } 当前range对象内所有节点的公共祖先节点
+         * @see UE.dom.Range:getCommonAncestor()
+         * @example
+         * ```html
+         * <body>
+         *
+         *     <!-- 选区示例 -->
+         *     <b>xxx<i>xxxx<span>xx[x</span>xx]x</i>xxxxxxx</b>
+         *
+         *     <script>
+         *
+         *         var node = range.getCommonAncestor( false );
+         *
+         *         //这里的公共祖先节点是B而不是I, 是因为参数限制了获取到的节点不能是容器节点
+         *         //output: B
+         *         console.log( node.tagName );
+         *
+         *     </script>
+         *
+         * </body>
+         * ```
+         */
+
+        /**
+         * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 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
+         * <body>
+         *
+         *     <!-- 选区示例 -->
+         *     <b>xxx<i>xxxx<span>x[x]x</span>xxx</i>xxxxxxx</b>
+         *
+         *     <script>
+         *
+         *         var node = range.getCommonAncestor( true, false );
+         *
+         *         //output: SPAN
+         *         console.log( node.tagName );
+         *
+         *     </script>
+         *
+         * </body>
+         * ```
+         */
+        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
+         *
+         * //选区示例
+         * <b>xxx<i>[xxxxx]</i>xxx</b>
+         *
+         * <script>
+         *     //未调整前, 选区的开始容器和结束都是文本节点
+         *     //执行调整
+         *     range.trimBoundary();
+         *
+         *     //调整之后, 容器节点变成了i节点
+         *     //<b>xxx[<i>xxxxx</i>]xxx</b>
+         * </script>
+         * ```
+         */
+
+        /**
+         * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上,
+         * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整
+         * @method trimBoundary
+         * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整
+         * @return { UE.dom.Range } 当前range对象
+         * @example
+         * ```html
+         *
+         * //选区示例
+         * <b>xxx<i>[xxxxx]</i>xxx</b>
+         *
+         * <script>
+         *     //未调整前, 选区的开始容器和结束都是文本节点
+         *     //执行调整
+         *     range.trimBoundary( true );
+         *
+         *     //调整之后, 开始容器节点变成了i节点
+         *     //但是, 结束容器没有发生变化
+         *     //<b>xxx[<i>xxxxx]</i>xxx</b>
+         * </script>
+         * ```
+         */
+        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
+         * <p>xxxx[xxxx]x</p>  ==>  range.applyInlineStyle("strong")  ==>  <p>xxxx[<strong>xxxx</strong>]x</p>
+         * ```
+         */
+
+        /**
+         * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。
+         * @method applyInlineStyle
+         * @param { String } tagName 需要添加的标签名
+         * @param { Object } attrs 跟随新添加的标签的属性
+         * @return { UE.dom.Range } 当前选区
+         * @example
+         * ```html
+         * <p>xxxx[xxxx]x</p>
+         *
+         * ==>
+         *
+         * <!-- 执行操作 -->
+         * range.applyInlineStyle("strong",{"style":"font-size:12px"})
+         *
+         * ==>
+         *
+         * <p>xxxx[<strong style="font-size:12px">xxxx</strong>]x</p>
+         * ```
+         */
+        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[x<span>xxx<em>yyy</em>zz]z</span>  => range.removeInlineStyle(["em"])  => xx[x<span>xxxyyyzz]z</span>
+         * ```
+         */
+
+        /**
+         * 移除当前选区内指定的一组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) {
+                    //使用<span>|x<span>固定住光标
+                    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);
+//                    }
+//
+                    //处理光标落在文本节点的情况
+                    //处理以下的情况
+                    //<b>|xxxx</b>
+                    //<b>xxxx</b>|xxxx
+                    //xxxx<b>|</b>
+                    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 = '&nbsp;';
+            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
+         * <body>
+         *     <p>
+         *         aaaa
+         *         <em>
+         *             <!-- 选区开始 -->
+         *             bbbb
+         *             <!-- 选区结束 -->
+         *         </em>
+         *     </p>
+         *
+         *     <script>
+         *         //output: {startAddress:[0,1,0,0],endAddress:[0,1,0,4]}
+         *         console.log( range.createAddress() );
+         *     </script>
+         * </body>
+         * ```
+         */
+        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
+         * <body>
+         *     <p>
+         *         aaaa
+         *         <em>
+         *             <!-- 选区开始 -->
+         *             bbbb
+         *             <!-- 选区结束 -->
+         *         </em>
+         *     </p>
+         *
+         *     <script>
+         *         var range = editor.selection.getRange();
+         *         range.moveToAddress({startAddress:[0,1,0,0],endAddress:[0,1,0,4]});
+         *         range.select();
+         *         //output: 'bbbb'
+         *         console.log(editor.selection.getText());
+         *     </script>
+         * </body>
+         * ```
+         */
+        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
+         *
+         * <body>
+         *
+         *     <!-- 选区开始 -->
+         *     <span></span>
+         *     <a></a>
+         *     <!-- 选区结束 -->
+         * </body>
+         *
+         * <script>
+         *
+         *     //output: <span></span><a></a>
+         *     console.log( range.cloneContents() );
+         *
+         *     range.traversal( function ( node ) {
+         *
+         *         if ( node.nodeType === 1 ) {
+         *             node.className = "test";
+         *         }
+         *
+         *     } );
+         *
+         *     //output: <span class="test"></span><a class="test"></a>
+         *     console.log( range.cloneContents() );
+         *
+         * </script>
+         * ```
+         */
+
+        /**
+         * 遍历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
+         *
+         * <body>
+         *
+         *     <!-- 选区开始 -->
+         *     <span></span>
+         *     <a></a>
+         *     <!-- 选区结束 -->
+         * </body>
+         *
+         * <script>
+         *
+         *     //output: <span></span><a></a>
+         *     console.log( range.cloneContents() );
+         *
+         *     range.traversal( function ( node ) {
+         *
+         *         node.className = "test";
+         *
+         *     }, function ( node ) {
+         *          return node.nodeType === 1;
+         *     } );
+         *
+         *     //output: <span class="test"></span><a class="test"></a>
+         *     console.log( range.cloneContents() );
+         *
+         * </script>
+         * ```
+         */
+        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下<b>x</b>[xx] 闭合后 <b>x|</b>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  ? '' : '<!DOCTYPE html>') +
+                    '<html xmlns=\'http://www.w3.org/1999/xhtml\' class=\'view\' ><head>' +
+                    '<style type=\'text/css\'>' +
+                    //设置四周的留边
+                    '.view{padding:0;word-wrap:break-word;cursor:text;height:90%;}\n' +
+                    //设置默认字体和字号
+                    //font-family不能呢随便改,在safari下fillchar会有解析问题
+                    'body{margin:8px;font-family:sans-serif;font-size:16px;}' +
+                    //设置段落间距
+                    'p{margin:5px 0;}</style>' +
+                    ( options.iframeCssUrl ? '<link rel=\'stylesheet\' type=\'text/css\' href=\'' + utils.unhtml(options.iframeCssUrl) + '\'/>' : '' ) +
+                    (options.initialStyle ? '<style>' + options.initialStyle + '</style>' : '') +
+                    '</head><body class=\'view\' ></body>' +
+                    '<script type=\'text/javascript\' ' + (ie ? 'defer=\'defer\'' : '' ) +' id=\'_initialScript\'>' +
+                    'setTimeout(function(){editor = window.parent.UE.instants[\'ueditorInstant' + me.uid + '\'];editor._setup(document);},0);' +
+                    'var _tmpScript = document.getElementById(\'_initialScript\');_tmpScript.parentNode.removeChild(_tmpScript);</script></html>';
+                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 = '<p>' + (browser.ie ? '' : '<br/>') + '</p>';
+            }
+            //如果要求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 } 编辑器的内容字符串, 如果编辑器的内容为空,或者是空的标签内容(如:”&lt;p&gt;&lt;br/&gt;&lt;/p&gt;“), 则返回空字符串
+         * @example
+         * ```javascript
+         * //编辑器html内容:<p>1<strong>2<em>34</em>5</strong>6</p>
+         * var content = editor.getContent(); //返回值:<p>1<strong>2<em>34</em>5</strong>6</p>
+         * ```
+         */
+
+        /**
+         * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则
+         * @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(); //返回格式大致是: <html><head>...</head><body>...</body></html>
+         * ```
+         */
+        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 ? '<link rel="stylesheet" type="text/css" href="' + si.href + '" />' : '<style>' + si.cssText + '</style>');
+                });
+                utils.each(me.document.getElementsByTagName('script'), function (si) {
+                    headHtmlForIE9 += si.outerHTML;
+                });
+
+            }
+            return '<html><head>' + (me.options.charset ? '<meta http-equiv="Content-Type" content="text/html; charset=' + me.options.charset + '"/>' : '')
+                + (headHtmlForIE9 || me.document.getElementsByTagName('head')[0].innerHTML) + headHtml.join('\n') + '</head>'
+                + '<body ' + (ie && browser.version < 9 ? 'class="view"' : '') + '>' + me.getContent(null, null, true) + '</body></html>';
+        },
+
+        /**
+         * 得到编辑器的纯文本内容,但会保留段落格式
+         * @method getPlainTxt
+         * @return { String } 编辑器带段落格式的纯文本内容字符串
+         * @example
+         * ```javascript
+         * //编辑器html内容:<p><strong>1</strong></p><p><strong>2</strong></p>
+         * 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)[^>]*>(<br\/?>|&nbsp;)<\/\1>/gi, '\n')
+                .replace(/<br\/?>/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(/&nbsp;/g, ' ');
+        },
+
+        /**
+         * 获取编辑器中的纯文本内容,没有段落格式
+         * @method getContentTxt
+         * @return { String } 编辑器不带段落格式的纯文本内容字符串
+         * @example
+         * ```javascript
+         * //编辑器html内容:<p><strong>1</strong></p><p><strong>2</strong></p>
+         * 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('<p>test</p>');
+         * ```
+         */
+
+        /**
+         * 设置编辑器的内容,可修改编辑器当前的html内容
+         * @method setContent
+         * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容
+         * @warning 该方法会触发selectionchange事件
+         * @param { String } html 要插入的html内容
+         * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入
+         * @example
+         * ```javascript
+         * //假设设置前的编辑器内容是 <p>old text</p>
+         * editor.setContent('<p>new text</p>', true); //插入的结果是<p>old text</p><p>new text</p>
+         * ```
+         */
+        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 = '<p>' + (browser.ie ? '&nbsp;' : '<br/>') + '</p>' + 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 具体命令的使用请参考<a href="#COMMAND.LIST">命令列表</a>
+         * @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 具体命令的使用请参考<a href="#COMMAND.LIST">命令列表</a>
+         * @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 具体命令的使用请参考<a href="#COMMAND.LIST">命令列表</a>
+         * @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 = '<p>' + (ie ? '' : '<br/>') + '</p>';
+                    me.removeListener('firstBeforeExecCommand focus', clear);
+                    setTimeout(function () {
+                        me.focus();
+                        me._selectionChange();
+                    }, 0)
+                }
+            }
+
+            return function (cont) {
+                var me = this;
+                me.body.innerHTML = '<p id="initContent">' + cont + '</p>';
+
+                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内容<p><strong>132</strong></p>
+         * editor.getContentLength() //返回27
+         * ```
+         */
+        /**
+         * 计算编辑器当前纯文本内容的长度
+         * @method  getContentLength
+         * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算
+         * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1
+         * @example
+         * ```javascript
+         * //编辑器html内容<p><strong>132</strong></p>
+         * 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( /<!--[\s\S]*?-->/ig, "" )
+                //转换图片
+                .replace(/<v:shape [^>]*>[\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 '<img width="'+ transUnit(width) +'" height="'+transUnit(height) +'" src="' + src + '" />';
+                    } 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( /<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>" )
+                //去掉多余的属性
+                .replace( /\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/ig, function(str,name,marks,val){
+                    //保留list的标示
+                    return name == 'class' && val == 'MsoListParagraph' ? str : ''
+                })
+                //清除多余的font/span不能匹配&nbsp;有可能是空格
+                .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(/&#39;/g,'\'')
+                            .replace( /&quot;/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(!/<table/.test(tag))
+                                        n[i] = name.replace( /^mso-|-alt$/g, "" ) + ":" + transUnit( value );
+                                    continue;
+                                case "horiz-align":
+                                    n[i] = "text-align:" + value;
+                                    continue;
+
+                                case "vert-align":
+                                    n[i] = "vertical-align:" + value;
+                                    continue;
+
+                                case "font-color":
+                                case "mso-foreground":
+                                    n[i] = "color:" + value;
+                                    continue;
+
+                                case "mso-background":
+                                case "mso-highlight":
+                                    n[i] = "background:" + value;
+                                    continue;
+
+                                case "mso-default-height":
+                                    n[i] = "min-height:" + transUnit( value );
+                                    continue;
+
+                                case "mso-default-width":
+                                    n[i] = "min-width:" + transUnit( value );
+                                    continue;
+
+                                case "mso-padding-between-alt":
+                                    n[i] = "border-collapse:separate;border-spacing:" + transUnit( value );
+                                    continue;
+
+                                case "text-line-through":
+                                    if ( (value == "single") || (value == "double") ) {
+                                        n[i] = "text-decoration:line-through";
+                                    }
+                                    continue;
+                                case "mso-zero-height":
+                                    if ( value == "yes" ) {
+                                        n[i] = "display:none";
+                                    }
+                                    continue;
+//                                case 'background':
+//                                    break;
+                                case 'margin':
+                                    if ( !/[1-9]/.test( value ) ) {
+                                        continue;
+                                    }
+
+                            }
+
+                            if ( /^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test( name )
+                                ||
+                                /text\-indent|padding|margin/.test(name) && /\-[\d.]+/.test(value)
+                            ) {
+                                continue;
+                            }
+
+                            n[i] = name + ":" + parts[1];
+                        }
+                    }
+                    return tag + (n.length ? ' style="' + n.join( ';').replace(/;{2,}/g,';') + '"' : '');
+                })
+
+
+    }
+
+    return function ( html ) {
+        return (isWordDocument( html ) ? filterPasteWord( html ) : html);
+    };
+}();
+
+// core/node.js
+/**
+ * 编辑器模拟的节点类
+ * @file
+ * @module UE
+ * @class uNode
+ * @since 1.2.6.1
+ */
+
+/**
+ * UEditor公用空间,UEditor所有的功能都挂载在该空间下
+ * @unfile
+ * @module UE
+ */
+
+(function () {
+
+    /**
+     * 编辑器模拟的节点类
+     * @unfile
+     * @module UE
+     * @class uNode
+     */
+
+    /**
+     * 通过一个键值对,创建一个uNode对象
+     * @constructor
+     * @param { Object } attr 传入要创建的uNode的初始属性
+     * @example
+     * ```javascript
+     * var node = new uNode({
+     *     type:'element',
+     *     tagName:'span',
+     *     attrs:{style:'font-size:14px;'}
+     * }
+     * ```
+     */
+    var uNode = UE.uNode = function (obj) {
+        this.type = obj.type;
+        this.data = obj.data;
+        this.tagName = obj.tagName;
+        this.parentNode = obj.parentNode;
+        this.attrs = obj.attrs || {};
+        this.children = obj.children;
+    };
+
+    var notTransAttrs = {
+        'href':1,
+        'src':1,
+        '_src':1,
+        '_href':1,
+        'cdata_data':1
+    };
+
+    var notTransTagName = {
+        style:1,
+        script:1
+    };
+
+    var indentChar = '    ',
+        breakChar = '\n';
+
+    function insertLine(arr, current, begin) {
+        arr.push(breakChar);
+        return current + (begin ? 1 : -1);
+    }
+
+    function insertIndent(arr, current) {
+        //插入缩进
+        for (var i = 0; i < current; i++) {
+            arr.push(indentChar);
+        }
+    }
+
+    //创建uNode的静态方法
+    //支持标签和html
+    uNode.createElement = function (html) {
+        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,' &nbsp;'))
+        }
+
+    }
+
+    function isElement(node, arr, formatter, current) {
+        var attrhtml = '';
+        if (node.attrs) {
+            attrhtml = [];
+            var attrs = node.attrs;
+            for (var a in attrs) {
+                //这里就针对
+                //<p>'<img src='http://nsclick.baidu.com/u.gif?&asdf=\"sdf&asdfasdfs;asdf'></p>
+                //这里边的\"做转换,要不用innerHTML直接被截断了,属性src
+                //有可能做的不够
+                attrhtml.push(a + (attrs[a] !== undefined ? '="' + (notTransAttrs[a] ? utils.html(attrs[a]).replace(/["]/g, function (a) {
+                   return '&quot;'
+                }) : 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('<!--' + node.data + '-->');
+    }
+
+    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('<span>text</span>');
+         * ```
+         */
+        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('<span>text</span>');
+         * ```
+         */
+        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('<p><b>htmlparser</b></p>', true);
+ * ```
+ */
+
+var htmlparser = UE.htmlparser = function (htmlstr,ignoreBlank) {
+    //todo 原来的方式  [^"'<>\/] 有\/就不能配对上 <TD vAlign=top background=../AAA.JPG> 这样的标签了
+    //先去掉了,加上的原因忘了,这里先记录
+    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;
+
+    }
+    //如果结束是文本,就有可能丢掉,所以这里手动判断一下
+    //例如 <li>sdfsdfsdf<li>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 ? '&nbsp;' : '<br/>')
+                        }
+                        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这两个文本
+ * //执行命令,插入<b>CC</b>
+ * //插入后的效果 xxx<b>CC</b>xxx
+ * //<p>xx|xxx</p> 当前选区为闭合状态
+ * //插入<p>CC</p>
+ * //结果 <p>xx</p><p>CC</p><p>xxx</p>
+ * //<p>xxxx</p>|</p>xxx</p> 当前选区在两个p标签之间
+ * //插入 xxxx
+ * //结果 <p>xxxx</p><p>xxxx</p></p>xxx</p>
+ * ```
+ */
+
+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]<br/>
+            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 = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';
+                        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>|<[p> ==> <p></p><div></div><p>|</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 : '<br/>';
+                    }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 = '<style type="text/css">body{';
+                var bgObj = {
+                    "background-color": domUtils.getComputedStyle(body, "background-color") || "#ffffff",
+                    'background-image': url ? 'url(' + url + ')' : '',
+                    'background-repeat': domUtils.getComputedStyle(body, "background-repeat") || "",
+                    'background-position': browser.ie ? (domUtils.getComputedStyle(body, "background-position-x") + " " + domUtils.getComputedStyle(body, "background-position-y")) : domUtils.getComputedStyle(body, "background-position"),
+                    'height': domUtils.getComputedStyle(body, "height")
+                };
+                for (var name in bgObj) {
+                    if (bgObj.hasOwnProperty(name)) {
+                        html += name + ":" + bgObj[name] + "; ";
+                    }
+                }
+                html += '}</style> ';
+                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('<p style="display:none;" data-background="' + utils.trim(styles[1].replace(/"/g, '').replace(/[\s]+/g, ' ')) + '"><br/></p>'));
+            }
+        },
+        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', '<p id="_img_parent_tmp" style="text-align:center">' + pN.innerHTML + '</p>');
+
+                            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 = '<img src="' + ci.src + '" ' + (ci._src ? ' _src="' + ci._src + '" ' : '') +
+                    (ci.width ? 'width="' + ci.width + '" ' : '') +
+                    (ci.height ? ' height="' + ci.height + '" ' : '') +
+                    (ci['floatStyle'] == 'left' || ci['floatStyle'] == 'right' ? ' style="float:' + ci['floatStyle'] + ';"' : '') +
+                    (ci.title && ci.title != "" ? ' title="' + ci.title + '"' : '') +
+                    (ci.border && ci.border != "0" ? ' border="' + ci.border + '"' : '') +
+                    (ci.alt && ci.alt != "" ? ' alt="' + ci.alt + '"' : '') +
+                    (ci.hspace && ci.hspace != "0" ? ' hspace = "' + ci.hspace + '"' : '') +
+                    (ci.vspace && ci.vspace != "0" ? ' vspace = "' + ci.vspace + '"' : '') + '/>';
+                if (ci['floatStyle'] == 'center') {
+                    str = '<p style="text-align: center">' + str + '</p>';
+                }
+                html.push(str);
+
+            } else {
+                for (var i = 0; ci = opt[i++];) {
+                    unhtmlData(ci);
+                    str = '<p ' + (ci['floatStyle'] == 'center' ? 'style="text-align: center" ' : '') + '><img src="' + ci.src + '" ' +
+                        (ci.width ? 'width="' + ci.width + '" ' : '') + (ci._src ? ' _src="' + ci._src + '" ' : '') +
+                        (ci.height ? ' height="' + ci.height + '" ' : '') +
+                        ' style="' + (ci['floatStyle'] && ci['floatStyle'] != 'center' ? 'float:' + ci['floatStyle'] + ';' : '') +
+                        (ci.border || '') + '" ' +
+                        (ci.title ? ' title="' + ci.title + '"' : '') + ' /></p>';
+                    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  如果是<p><a>xx</a></p> 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);
+                //清除冗余的代码 <b><bookmark></b>
+                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('<!DOCTYPE html><html><head><meta charset="utf-8"/><script src="'+this.options.UEDITOR_HOME_URL+'ueditor.parse.js"></script><script>' +
+            "setTimeout(function(){uParse('div',{rootPath: '"+ this.options.UEDITOR_HOME_URL +"'})},300)" +
+            '</script></head><body><div>'+this.getContent(null,null,true)+'</div></body></html>');
+        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','<hr>');
+                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 ? '&nbsp;':''):'<br/>';
+                }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 += '<br>'
+                                    }else if(!dtd.$empty[node.tagName]){
+                                        utils.each(node.children,function(cn){
+                                            if(cn.type =='element'){
+                                                if(cn.tagName == 'br'){
+                                                    code += '<br>'
+                                                }else if(!dtd.$empty[node.tagName]){
+                                                    code += cn.innerText();
+                                                }
+                                            }else{
+                                                code += cn.data
+                                            }
+                                        });
+                                        if(!/br>$/.test(code)){
+                                            code += '<br>';
+                                        }
+                                    }
+                                }else{
+                                    code += node.data + '<br>'
+                                }
+                                if(!node.nextSibling() && /<br>$/.test(code)){
+                                    code = code.replace(/<br>$/,'');
+                                }
+
+                            }else{
+                                code += (node.type == 'element' ? (dtd.$empty[node.tagName] ?  '' : node.innerText()) : node.data);
+                                if(!/br\/?\s*>$/.test(code)){
+                                    if(!node.nextSibling())
+                                        return;
+                                    code += '<br>'
+                                }
+                            }
+
+                        }
+
+                    });
+                }
+                me.execCommand('inserthtml','<pre id="coder"class="brush:'+lang+';toolbar:false">'+code+'</pre>',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,'&nbsp;').replace(/\n$/,'');
+               }else{
+                   if(n.tagName == 'br'){
+                       code  += '\n'
+                   }else{
+                       code += (!dtd.$empty[n.tagName] ? '' : n.innerText());
+                   }
+
+               }
+
+            });
+
+            pre.innerText(code.replace(/(&nbsp;|\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(/&nbsp;/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(/&nbsp;/g,' '))));
+
+                                    }
+                                }else{
+                                    frag.appendChild(me.document.createTextNode(utils.html( cn.data.replace(/&nbsp;/g,' '))));
+
+                                }
+                            })
+                            if(frag.lastChild.nodeName != 'BR'){
+                                frag.appendChild(me.document.createElement('br'))
+                            }
+                        }
+                    }else{
+                        frag.appendChild(me.document.createTextNode(utils.html( node.data.replace(/&nbsp;/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 = "<br/>";
+            range.setStart(me.body,0).setCursor();
+        }else{
+            me.body.innerHTML = "<p>"+(ie ? "" : "<br/>")+"</p>";
+            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('<hr class="pagebreak" noshade="noshade" size="5" style="-webkit-user-select: none;">');
+                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会产生多余的</hr>
+    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(/>&nbsp;</g, '><').replace(/\s*</g, '<').replace(/>\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 = '&nbsp;';
+        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 = '<p><br/></p>';
+                        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字符,也会产生&nbsp;这里过滤掉
+            html = div.innerHTML;//.replace(/>(?:(\s|&nbsp;)*?)</g,'><');
+
+            //过滤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(' &nbsp; &nbsp;'),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 ? '&nbsp;' : '<br/>')
+            }
+            //去掉末尾的空白
+            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*(&nbsp;)+\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 = '<p></p>';
+                            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><br/></p>类型的空节点,干掉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(/&nbsp;/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() || '<p>' + (browser.ie ? '' : '<br/>')+'</p>';
+                    };
+                } else {
+                    me.iframe.style.cssText = bakCssText;
+                    var cont = sourceEditor.getContent() || '<p>' + (browser.ie ? '' : '<br/>')+'</p>';
+                    //处理掉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 = '<p>'+(browser.ie?'':'<br/>')+'</p>';
+                        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, '<p>');
+                            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, '<p>');
+
+                        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]<br/>
+            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 = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';
+                        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 || '&nbsp;'; 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 : '<br/>'
+                    });
+                    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('<span class="edui-editor-imagescale-hand' + i + '"></span>');
+                }
+                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 = '<img ' + (id ? 'id="' + id+'"' : '') + ' width="'+ width +'" height="' + height + '" _url="'+url+'" class="' + classname.replace(/\bvideo-js\b/, '') + '"'  +
+                    ' src="' + me.options.UEDITOR_HOME_URL+'themes/default/images/spacer.gif" style="background:url('+me.options.UEDITOR_HOME_URL+'themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;'+(align ? 'float:' + align + ';': '')+'" />'
+                break;
+            case 'embed':
+                str = '<embed type="application/x-shockwave-flash" class="' + classname + '" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
+                    ' src="' +  utils.html(url) + '" width="' + width  + '" height="' + height  + '"'  + (align ? ' style="float:' + align + '"': '') +
+                    ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >';
+                break;
+            case 'video':
+                var ext = url.substr(url.lastIndexOf('.') + 1);
+                if(ext == 'ogv') ext = 'ogg';
+                str = '<video' + (id ? ' id="' + id + '"' : '') + ' class="' + classname + ' video-js" ' + (align ? ' style="float:' + align + '"': '') +
+                    ' controls preload="none" width="' + width + '" height="' + height + '" src="' + url + '" data-setup="{}">' +
+                    '<source src="' + url + '" type="video/' + ext + '" /></video>';
+                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, 'video'));
+            }
+            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 : "<br />");
+        },
+        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('<tr' + (r == 0 ? ' class="firstRow"':'') + '>');
+                    for (var c = 0; c < colsNum; c++) {
+                        html.push('<td width="' + tdWidth + '"  vAlign="' + opt.tdvalign + '" >' + (browser.ie && browser.version < 11 ? domUtils.fillChar : '<br/>') + '</td>')
+                    }
+                    html.push('</tr>')
+                }
+                //禁止指定table-width
+                return '<table><tbody>' + html.join('') + '</tbody></table>'
+            }
+
+            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 ? '&nbsp;' : '<br />';
+                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 : '<br/>'
+                    });
+                    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 : '<br/>';
+                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  ' +
+                        ( isFullCol && isFullRow ? 'width="' + width + '"' : '') +
+                        '>' + table.innerHTML.replace(/>\s*</g, '><').replace(/\bth\b/gi, "td") + '</table>')
+                }
+                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 = '&nbsp;'
+//                        }
+//                    }
+//                });
+//                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 = '&nbsp;'
+//                        }
+//                    }
+//                });
+                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 = '&nbsp;'
+                }
+            });
+        });
+        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 百度应用主页: <a href="http://app.baidu.com/" target="_blank">http://app.baidu.com/</a>
+ * @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 ? '<p>' : '') + '<img title="'+obj.title+'" width="' + obj.width + '" height="' + obj.height + '"' +
+//                        ' src="' + me.options.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif" style="background:url(' + obj.logo+') no-repeat center center; border:1px solid gray;" class="edui-faked-webapp" _url="' + obj.url + '" />' +
+//                        (addParagraph ? '</p>' : '')
+//                :
+//                '<iframe class="edui-faked-webapp" title="'+obj.title+'" width="' + obj.width + '" height="' + obj.height + '"  scrolling="no" frameborder="0" src="' + obj.url + '" logo_url = '+obj.logo+'></iframe>';
+//    }
+//
+//    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 ?
+            '<img title="'+obj.title+'" width="' + obj.width + '" height="' + obj.height + '"' +
+                ' src="' + me.options.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif" _logo_url="'+obj.logo+'" style="background:url(' + obj.logo
+                +') no-repeat center center; border:1px solid gray;" class="edui-faked-webapp" _url="' + obj.url + '" ' +
+                (obj.align && !obj.cssfloat? 'align="' + obj.align + '"' : '') +
+                (obj.cssfloat ? 'style="float:' + obj.cssfloat + '"' : '') +
+                '/>'
+            :
+            '<iframe class="edui-faked-webapp" title="'+obj.title+'" ' +
+                (obj.align && !obj.cssfloat? 'align="' + obj.align + '"' : '') +
+                (obj.cssfloat ? 'style="float:' + obj.cssfloat + '"' : '') +
+                'width="' + obj.width + '" height="' + obj.height + '"  scrolling="no" frameborder="0" src="' + obj.url + '" logo_url = "'+obj.logo+'"></iframe>'
+
+    }
+    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 百度应用主页: <a href="http://app.baidu.com/" target="_blank">http://app.baidu.com/</a>
+             * @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 ?
+                '<img ' +
+                    (align && !cssfloat? 'align="' + align + '"' : '') +
+                    (cssfloat ? 'style="float:' + cssfloat + '"' : '') +
+                    ' width="'+ width +'" height="' + height + '" _url="'+url+'" class="edui-faked-music"' +
+                    ' src="'+me.options.langPath+me.options.lang+'/images/music.png" />'
+            :
+            '<embed type="application/x-shockwave-flash" class="edui-faked-music" pluginspage="http://www.macromedia.com/go/getflashplayer"' +
+                ' src="' + url + '" width="' + width  + '" height="' + height  + '" '+ (align && !cssfloat? 'align="' + align + '"' : '') +
+                (cssfloat ? 'style="float:' + cssfloat + '"' : '') +
+                ' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >';
+    }
+    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 = '<img class="loadingclass" id="' + loadingId + '" src="' +
+                me.options.themePath + me.options.theme +
+                '/images/spacer.gif" title="' + (me.getLang('autoupload.loading') || '') + '" >';
+            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 = '<p>' +
+                '<img class="loadingclass" id="' + loadingId + '" src="' +
+                me.options.themePath + me.options.theme +
+                '/images/spacer.gif" title="' + (me.getLang('autoupload.loading') || '') + '" >' +
+                '</p>';
+            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 ) || '<p>'+domUtils.fillHtml+'</p>';
+                        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 = '<form id="edui_form_' + timestrap + '" target="edui_iframe_' + timestrap + '" method="POST" enctype="multipart/form-data" action="' + me.getOpt('serverUrl') + '" ' +
+            'style="' + btnStyle + '">' +
+            '<input id="edui_input_' + timestrap + '" type="file" accept="image/*" name="' + me.options.imageFieldName + '" ' +
+            'style="' + btnStyle + '">' +
+            '</form>' +
+            '<iframe id="edui_iframe_' + timestrap + '" name="edui_iframe_' + timestrap + '" style="display:none;width:0;height:0;border:0;margin:0;padding:0;position:absolute;"></iframe>';
+
+            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', '<img class="loadingclass" id="' + loadingId + '" src="' + me.options.themePath + me.options.theme +'/images/spacer.gif" title="' + (me.getLang('simpleupload.loading') || '') + '" >');
+
+                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 += '<p style="line-height: 16px;">' +
+                            '<img style="vertical-align: middle; margin-right: 2px;" src="'+ icon + '" _src="' + icon + '" />' +
+                            '<a style="font-size:12px; color:#0066cc;" href="' + item.url +'" title="' + title + '">' + title + '</a>' +
+                            '</p>';
+                    }
+                    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 '<div id="##" class="edui-box %%"></div>';
+        }
+    };
+    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 '<div id="##" class="edui-mask %%" onclick="return $$._onClick(event, this);" onmousedown="return $$._onMouseDown(event, this);"></div>';
+        },
+        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 '<div id="##" class="edui-popup %%" onmousedown="return false;">' +
+                ' <div id="##_body" class="edui-popup-body">' +
+                ' <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe>' +
+                ' <div class="edui-shadow"></div>' +
+                ' <div id="##_content" class="edui-popup-content">' +
+                this.getContentHtmlTpl() +
+                '  </div>' +
+                ' </div>' +
+                '</div>';
+        },
+        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 = '<div id="##" class="edui-colorpicker %%">' +
+            '<div class="edui-colorpicker-topbar edui-clearfix">' +
+            '<div unselectable="on" id="##_preview" class="edui-colorpicker-preview"></div>' +
+            '<div unselectable="on" class="edui-colorpicker-nocolor" onclick="$$._onPickNoColor(event, this);">'+ noColorText +'</div>' +
+            '</div>' +
+            '<table  class="edui-box" style="border-collapse: collapse;" onmouseover="$$._onTableOver(event, this);" onmouseout="$$._onTableOut(event, this);" onclick="return $$._onTableClick(event, this);" cellspacing="0" cellpadding="0">' +
+            '<tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;padding-top: 2px"><td colspan="10">'+editor.getLang("themeColor")+'</td> </tr>'+
+            '<tr class="edui-colorpicker-tablefirstrow" >';
+        for (var i=0; i<COLORS.length; i++) {
+            if (i && i%10 === 0) {
+                html += '</tr>'+(i==60?'<tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;"><td colspan="10">'+editor.getLang("standardColor")+'</td></tr>':'')+'<tr'+(i==60?' class="edui-colorpicker-tablefirstrow"':'')+'>';
+            }
+            html += i<70 ? '<td style="padding: 0 2px;"><a hidefocus title="'+COLORS[i]+'" onclick="return false;" href="javascript:" unselectable="on" class="edui-box edui-colorpicker-colorcell"' +
+                ' data-color="#'+ COLORS[i] +'"'+
+                ' style="background-color:#'+ COLORS[i] +';border:solid #ccc;'+
+                (i<10 || i>=60?'border-width:1px;':
+                    i>=10&&i<20?'border-width:1px 1px 0 1px;':
+
+                        'border-width:0 1px 0 1px;')+
+                '"' +
+                '></a></td>':'';
+        }
+        html += '</tr></table></div>';
+        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 '<div id="##" class="edui-tablepicker %%">' +
+                 '<div class="edui-tablepicker-body">' +
+                  '<div class="edui-infoarea">' +
+                   '<span id="##_label" class="edui-label"></span>' +
+                  '</div>' +
+                  '<div class="edui-pickarea"' +
+                   ' onmousemove="$$._onMouseMove(event, this);"' +
+                   ' onmouseover="$$._onMouseOver(event, this);"' +
+                   ' onmouseout="$$._onMouseOut(event, this);"' +
+                   ' onclick="$$._onClick(event, this);"' +
+                  '>' +
+                    '<div id="##_overlay" class="edui-overlay"></div>' +
+                  '</div>' +
+                 '</div>' +
+                '</div>';
+        },
+        _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 '<div id="##" class="edui-box %%">' +
+                '<div id="##_state" stateful>' +
+                 '<div class="%%-wrap"><div id="##_body" unselectable="on" ' + (this.title ? 'title="' + this.title + '"' : '') +
+                 ' class="%%-body" onmousedown="return $$._onMouseDown(event, this);" onclick="return $$._onClick(event, this);">' +
+                  (this.showIcon ? '<div class="edui-box edui-icon"></div>' : '') +
+                  (this.showText ? '<div class="edui-box edui-label">' + this.label + '</div>' : '') +
+                 '</div>' +
+                '</div>' +
+                '</div></div>';
+        },
+        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('<div id="' +
+                        this.popup.id + '_bordereraser" class="edui-bordereraser edui-background" style="width:' +
+                        (uiUtils.getClientRect(this.getDom()).width + 20) + 'px"></div>')
+                    );
+                popup.getDom().className += ' ' + this.className;
+            }, this));
+            this.popup = popup;
+        },
+        _onPopupShow: function (){
+            this.addState('opened');
+        },
+        _onPopupHide: function (){
+            this.removeState('opened');
+        },
+        getHtmlTpl: function (){
+            return '<div id="##" class="edui-box %%">' +
+                '<div '+ (this.title ? 'title="' + this.title + '"' : '') +' id="##_state" stateful><div class="%%-body">' +
+                '<div id="##_button_body" class="edui-box edui-button-body" onclick="$$._onButtonClick(event, this);">' +
+                '<div class="edui-box edui-icon"></div>' +
+                '</div>' +
+                '<div class="edui-box edui-splitborder"></div>' +
+                '<div class="edui-box edui-arrow" onclick="$$._onArrowClick();"></div>' +
+                '</div></div></div>';
+        },
+        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('<div id="' + this.id + '_colorlump" class="edui-colorlump"></div>')
+            );
+            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 '<div id="##" class="edui-autotypesetpicker %%">' +
+                '<div class="edui-autotypesetpicker-body">' +
+                '<table >' +
+                '<tr><td nowrap><input type="checkbox" name="mergeEmptyline" ' + (opt["mergeEmptyline"] ? "checked" : "" ) + '>' + lang.mergeLine + '</td><td colspan="2"><input type="checkbox" name="removeEmptyline" ' + (opt["removeEmptyline"] ? "checked" : "" ) + '>' + lang.delLine + '</td></tr>' +
+                '<tr><td nowrap><input type="checkbox" name="removeClass" ' + (opt["removeClass"] ? "checked" : "" ) + '>' + lang.removeFormat + '</td><td colspan="2"><input type="checkbox" name="indent" ' + (opt["indent"] ? "checked" : "" ) + '>' + lang.indent + '</td></tr>' +
+                '<tr>' +
+                '<td nowrap><input type="checkbox" name="textAlign" ' + (opt["textAlign"] ? "checked" : "" ) + '>' + lang.alignment + '</td>' +
+                '<td colspan="2" id="' + textAlignInputName + '">' +
+                '<input type="radio" name="'+ textAlignInputName +'" value="left" ' + ((opt["textAlign"] && opt["textAlign"] == "left") ? "checked" : "") + '>' + me.getLang("justifyleft") +
+                '<input type="radio" name="'+ textAlignInputName +'" value="center" ' + ((opt["textAlign"] && opt["textAlign"] == "center") ? "checked" : "") + '>' + me.getLang("justifycenter") +
+                '<input type="radio" name="'+ textAlignInputName +'" value="right" ' + ((opt["textAlign"] && opt["textAlign"] == "right") ? "checked" : "") + '>' + me.getLang("justifyright") +
+                '</td>' +
+                '</tr>' +
+                '<tr>' +
+                '<td nowrap><input type="checkbox" name="imageBlockLine" ' + (opt["imageBlockLine"] ? "checked" : "" ) + '>' + lang.imageFloat + '</td>' +
+                '<td nowrap id="'+ imageBlockInputName +'">' +
+                '<input type="radio" name="'+ imageBlockInputName +'" value="none" ' + ((opt["imageBlockLine"] && opt["imageBlockLine"] == "none") ? "checked" : "") + '>' + me.getLang("default") +
+                '<input type="radio" name="'+ imageBlockInputName +'" value="left" ' + ((opt["imageBlockLine"] && opt["imageBlockLine"] == "left") ? "checked" : "") + '>' + me.getLang("justifyleft") +
+                '<input type="radio" name="'+ imageBlockInputName +'" value="center" ' + ((opt["imageBlockLine"] && opt["imageBlockLine"] == "center") ? "checked" : "") + '>' + me.getLang("justifycenter") +
+                '<input type="radio" name="'+ imageBlockInputName +'" value="right" ' + ((opt["imageBlockLine"] && opt["imageBlockLine"] == "right") ? "checked" : "") + '>' + me.getLang("justifyright") +
+                '</td>' +
+                '</tr>' +
+                '<tr><td nowrap><input type="checkbox" name="clearFontSize" ' + (opt["clearFontSize"] ? "checked" : "" ) + '>' + lang.removeFontsize + '</td><td colspan="2"><input type="checkbox" name="clearFontFamily" ' + (opt["clearFontFamily"] ? "checked" : "" ) + '>' + lang.removeFontFamily + '</td></tr>' +
+                '<tr><td nowrap colspan="3"><input type="checkbox" name="removeEmptyNode" ' + (opt["removeEmptyNode"] ? "checked" : "" ) + '>' + lang.removeHtml + '</td></tr>' +
+                '<tr><td nowrap colspan="3"><input type="checkbox" name="pasteFilter" ' + (opt["pasteFilter"] ? "checked" : "" ) + '>' + lang.pasteFilter + '</td></tr>' +
+                '<tr>' +
+                '<td nowrap><input type="checkbox" name="symbolConver" ' + (opt["bdc2sb"] || opt["tobdc"] ? "checked" : "" ) + '>' + lang.symbol + '</td>' +
+                '<td id="' + symbolConverInputName + '">' +
+                '<input type="radio" name="bdc" value="bdc2sb" ' + (opt["bdc2sb"] ? "checked" : "" ) + '>' + lang.bdc2sb +
+                '<input type="radio" name="bdc" value="tobdc" ' + (opt["tobdc"] ? "checked" : "" ) + '>' + lang.tobdc + '' +
+                '</td>' +
+                '<td nowrap align="right"><button >' + lang.run + '</button></td>' +
+                '</tr>' +
+                '</table>' +
+                '</div>' +
+                '</div>';
+
+
+        },
+        _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('<tr>');
+
+                tmpl.push( '<td index="'+ i +'" ' + tempClassName + ' stateful><div class="edui-icon edui-'+ alignType[ tempIndex ] +'"></div></td>' );
+
+                tempIndex === 2 && tmpl.push('</tr>');
+
+            }
+
+            return '<div id="##" class="edui-cellalignpicker %%">' +
+                '<div class="edui-cellalignpicker-body">' +
+                '<table onclick="$$._onClick(event);">' +
+                tmpl.join('') +
+                '</table>' +
+                '</div>' +
+                '</div>';
+        },
+        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 '<div class="edui-pasteicon" onclick="$$._onClick(this)"></div>' +
+                '<div class="edui-pastecontainer">' +
+                '<div class="edui-title">' + this.editor.getLang("pasteOpt") + '</div>' +
+                '<div class="edui-button">' +
+                '<div title="' + this.editor.getLang("pasteSourceFormat") + '" onclick="$$.format(false)" stateful>' +
+                '<div class="edui-richtxticon"></div></div>' +
+                '<div title="' + this.editor.getLang("tagFormat") + '" onclick="$$.format(2)" stateful>' +
+                '<div class="edui-tagicon"></div></div>' +
+                '<div title="' + this.editor.getLang("pasteTextFormat") + '" onclick="$$.format(true)" stateful>' +
+                '<div class="edui-plaintxticon"></div></div>' +
+                '</div>' +
+                '</div>' +
+                '</div>'
+        },
+        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 '<div id="##" class="edui-toolbar %%" onselectstart="return false;" onmousedown="return $$._onMouseDown(event, this);">' +
+                buff.join('') +
+                '</div>'
+        },
+        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 '<div class="edui-menuitem edui-menuseparator"><div class="edui-menuseparator-inner"></div></div>';
+        },
+        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 ('<div class="%%-body">' + buff.join('') + '</div>');
+        },
+        _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 '<div id="##" class="%%" stateful onclick="$$._onClick(event, this);">' +
+                '<div class="%%-body">' +
+                this.renderLabelHtml() +
+                '</div>' +
+                '</div>';
+        },
+        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 '<div class="edui-arrow"></div>' +
+                '<div class="edui-box edui-icon"></div>' +
+                '<div class="edui-box edui-label %%-label">' + (this.label || '') + '</div>';
+        },
+        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 = '<span id="'+ this.id +'_contmask" class="dialogcontmask"></span><iframe id="'+ this.id +
+                    '_iframe" class="%%-iframe" height="100%" width="100%" frameborder="0" src="'+ this.iframeUrl +'"></iframe>';
+            }
+            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 = '<div class="%%-foot">' +
+                     '<div id="##_buttons" class="%%-buttons">' + buff.join('') + '</div>' +
+                    '</div>';
+            }
+
+            return '<div id="##" class="%%"><div '+ ( !this.fullscreen ? 'class="%%"' : 'class="%%-wrap edui-dialog-fullscreen-flag"' ) +'><div id="##_body" class="%%-body">' +
+                '<div class="%%-shadow"></div>' +
+                '<div id="##_titlebar" class="%%-titlebar">' +
+                '<div class="%%-draghandle" onmousedown="$$._onTitlebarMouseDown(event, this);">' +
+                 '<span class="%%-caption">' + (this.title || '') + '</span>' +
+                '</div>' +
+                this.closeButton.renderHtml() +
+                '</div>' +
+                '<div id="##_content" class="%%-content">'+ ( this.autoReset ? '' : this.getContentHtml()) +'</div>' +
+                footHtml +
+                '</div></div></div>';
+        },
+        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 = '<iframe id="'+me.id+'_iframe" src="'+ me.iframeUrl +'" frameborder="0"></iframe>';
+                        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 '<div id="##" class="%% edui-toolbar" data-src="shortcutmenu" onmousedown="return false;" onselectstart="return false;" >' +
+                buff +
+                '</div>';
+        }
+    };
+
+    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 '<br/>';
+        }
+    };
+    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 '<div id="##" class="edui-message %%">' +
+            ' <div id="##_closer" class="edui-message-closer">×</div>' +
+            ' <div id="##_body" class="edui-message-body edui-message-type-info">' +
+            ' <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe>' +
+            ' <div class="edui-shadow"></div>' +
+            ' <div id="##_content" class="edui-message-content">' +
+            '  </div>' +
+            ' </div>' +
+            '</div>';
+        },
+        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 '<div class="edui-label %%-label" >' + (this.label || '') + '</div>';
+                }
+            });
+        });
+
+        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 '<div class="edui-label %%-label" style="font-family:' +
+                            utils.unhtml(this.value) + '">' + (this.label || '') + '</div>';
+                    }
+                });
+            })(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 '<div class="edui-label %%-label" style="line-height:1;font-size:' +
+                        this.value + '">' + (this.label || '') + '</div>';
+                }
+            });
+        }
+        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 '<div class="edui-label %%-label"><span class="edui-for-' + this.value + '">' + (this.label || '') + '</span></div>';
+                }
+            })
+        }
+        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 '<div class="edui-label %%-label">' + '<' + ck.tag + ' ' + (ck.className ? ' class="' + ck.className + '"' : "")
+                            + (ck.style ? ' style="' + ck.style + '"' : "") + '>' + ck.label + "<\/" + ck.tag + ">"
+                            + '</div>';
+                    }
+                });
+            })(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 = '<div class="edui-editor-breadcrumb">' + editor.getLang("elementPathTip") + ':</div>';
+                }
+                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(
+                            '<nobr>' + editor.getLang("property") + ': <span onclick=$$._setIframeAlign(-2) class="edui-clickable">' + editor.getLang("default") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(-1) class="edui-clickable">' + editor.getLang("justifyleft") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(1) class="edui-clickable">' + editor.getLang("justifyright") + '</span>&nbsp;&nbsp;' +
+                                ' <span onclick="$$._updateIframe( this);" class="edui-clickable">' + editor.getLang("modify") + '</span></nobr>');
+                        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(
+                                '<nobr>' + editor.getLang("property") + ': <span onclick=$$._onImgEditButtonClick("anchorDialog") class="edui-clickable">' + editor.getLang("modify") + '</span>&nbsp;&nbsp;' +
+                                    '<span onclick=$$._onRemoveButtonClick(\'anchor\') class="edui-clickable">' + editor.getLang("delete") + '</span></nobr>');
+                        }
+                        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 = '<nobr>' + editor.getLang("property") + ': '+
+                            '<span onclick=$$._onImgSetFloat("none") class="edui-clickable">' + editor.getLang("default") + '</span>&nbsp;&nbsp;' +
+                            '<span onclick=$$._onImgSetFloat("left") class="edui-clickable">' + editor.getLang("justifyleft") + '</span>&nbsp;&nbsp;' +
+                            '<span onclick=$$._onImgSetFloat("right") class="edui-clickable">' + editor.getLang("justifyright") + '</span>&nbsp;&nbsp;' +
+                            '<span onclick=$$._onImgSetFloat("center") class="edui-clickable">' + editor.getLang("justifycenter") + '</span>&nbsp;&nbsp;'+
+                            '<span onclick="$$._onImgEditButtonClick(\'' + dialogName + '\');" class="edui-clickable">' + editor.getLang("modify") + '</span></nobr>';
+
+                        !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 += '<div style="height:5px;"></div>'
+                            }
+                            html += popup.formatHtml(
+                                '<nobr>' + editor.getLang("anthorMsg") + ': <a target="_blank" href="' + url + '" title="' + url + '" >' + txt + '</a>' +
+                                    ' <span class="edui-clickable" onclick="$$._onEditButtonClick();">' + editor.getLang("modify") + '</span>' +
+                                    ' <span class="edui-clickable" onclick="$$._onRemoveButtonClick(\'unlink\');"> ' + editor.getLang("clear") + '</span></nobr>');
+                            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 '<div id="##" class="%%">' +
+                '<div id="##_toolbarbox" class="%%-toolbarbox">' +
+                (this.toolbars.length ?
+                    '<div id="##_toolbarboxouter" class="%%-toolbarboxouter"><div class="%%-toolbarboxinner">' +
+                        this.renderToolbarBoxHtml() +
+                        '</div></div>' : '') +
+                '<div id="##_toolbarmsg" class="%%-toolbarmsg" style="display:none;">' +
+                '<div id = "##_upload_dialog" class="%%-toolbarmsg-upload" onclick="$$.showWordImageDialog();">' + this.editor.getLang("clickToUpload") + '</div>' +
+                '<div class="%%-toolbarmsg-close" onclick="$$.hideToolbarMsg();">x</div>' +
+                '<div id="##_toolbarmsg_label" class="%%-toolbarmsg-label"></div>' +
+                '<div style="height:0;overflow:hidden;clear:both;"></div>' +
+                '</div>' +
+                '<div id="##_message_holder" class="%%-messageholder"></div>' +
+                '</div>' +
+                '<div id="##_iframeholder" class="%%-iframeholder">' +
+                '</div>' +
+                //modify wdcount by matao
+                '<div id="##_bottombar" class="%%-bottomContainer"><table><tr>' +
+                '<td id="##_elementpath" class="%%-bottombar"></td>' +
+                '<td id="##_wordcount" class="%%-wordcount"></td>' +
+                '<td id="##_scale" class="%%-scale"><div class="%%-icon"></div></td>' +
+                '</tr></table></div>' +
+                '<div id="##_scalelayer"></div>' +
+                '</div>';
+        },
+        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('<span unselectable="on" onclick="$$.editor.execCommand(&quot;elementpath&quot;, &quot;' + i + '&quot;);">' + ci + '</span>');
+                }
+                bottom.innerHTML = '<div class="edui-editor-breadcrumb" onmousedown="return false;">' + this.editor.getLang("elementPathTip") + ': ' + buff.join(' &gt; ') + '</div>';
+
+            } 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})+</g, '<')
+                                    .replace(/>[\n\r\t]+</g, '><');
+                            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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.all.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.all.min.js
new file mode 100644
index 0000000..b357d50
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.all.min.js
@@ -0,0 +1,18 @@
+/*!
+ * UEditor
+ * version: ueditor
+ * build: Wed Aug 10 2016 11:06:16 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<e;d++)if(b.call(c,a[d],d,a)===!1)return!1}else for(var f in a)if(a.hasOwnProperty(f)&&b.call(c,a[f],f,a)===!1)return!1},makeInstance:function(a){var b=new Function;return b.prototype=a,a=new b,b.prototype=null,a},extend:function(a,b,c){if(b)for(var d in b)c&&a.hasOwnProperty(d)||(a[d]=b[d]);return a},extend2:function(a){for(var b=arguments,c=1;c<b.length;c++){var d=b[c];for(var e in d)a.hasOwnProperty(e)||(a[e]=d[e])}return a},inherits:function(a,b){var c=a.prototype,d=utils.makeInstance(b.prototype);return utils.extend(d,c,!0),a.prototype=d,d.constructor=a},bind:function(a,b){return function(){return a.apply(b,arguments)}},defer:function(a,b,c){var d;return function(){c&&clearTimeout(d),d=setTimeout(a,b)}},indexOf:function(a,b,c){var d=-1;return c=this.isNumber(c)?c:0,this.each(a,function(a,e){if(e>=c&&a===b)return d=e,!1}),d},removeItem:function(a,b){for(var c=0,d=a.length;c<d;c++)a[c]===b&&(a.splice(c,1),c--)},trim:function(a){return a.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g,"")},listToMap:function(a){if(!a)return{};a=utils.isArray(a)?a:a.split(",");for(var b,c=0,d={};b=a[c++];)d[b.toUpperCase()]=d[b]=1;return d},unhtml:function(a,b){return a?a.replace(b||/[&<">'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g,function(a,b){return b?a:{"<":"&lt;","&":"&amp;",'"':"&quot;",">":"&gt;","'":"&#39;"}[a]}):""},unhtmlForUrl:function(a,b){return a?a.replace(b||/[<">']/g,function(a){return{"<":"&lt;","&":"&amp;",'"':"&quot;",">":"&gt;","'":"&#39;"}[a]}):""},html:function(a){return a?a.replace(/&((g|l|quo)t|amp|#39|nbsp);/g,function(a){return{"&lt;":"<","&amp;":"&","&quot;":'"',"&gt;":">","&#39;":"'","&nbsp;":" "}[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(" ")+" ></"+d.tag+">")}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;c<d;c++)for(var e=c,f=a.length;e<f;e++)if(b(a[c],a[e])>0){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;d<a[c].length;d++)b.push(encodeURIComponent(c)+"[]="+encodeURIComponent(a[c][d]));return b.join("&")},formatUrl:function(a){var b=a.replace(/&&/g,"&");return b=b.replace(/\?&/g,"?"),b=b.replace(/&$/g,""),b=b.replace(/&#/g,"#"),b=b.replace(/&+/g,"&")},isCrossDomainUrl:function(a){var b=document.createElement("a");return b.href=a,browser.ie&&(b.href=b.href),!(b.protocol==location.protocol&&b.hostname==location.hostname&&(b.port==location.port||"80"==b.port&&""==location.port||""==b.port&&"80"==location.port))},clearEmptyAttrs:function(a){for(var b in a)""===a[b]&&delete a[b];return a},str2json:function(a){return utils.isString(a)?window.JSON?JSON.parse(a):new Function("return "+utils.trim(a||""))():null},json2str:function(){function a(a){return/["\\\x00-\x1f]/.test(a)&&(a=a.replace(/["\\\x00-\x1f]/g,function(a){var b=e[a];return b?b:(b=a.charCodeAt(),"\\u00"+Math.floor(b/16).toString(16)+(b%16).toString(16))})),'"'+a+'"'}function b(a){var b,c,d,e=["["],f=a.length;for(c=0;c<f;c++)switch(d=a[c],typeof d){case"undefined":case"function":case"unknown":break;default:b&&e.push(","),e.push(utils.json2str(d)),b=1}return e.push("]"),e.join("")}function c(a){return a<10?"0"+a:a}function d(a){return'"'+a.getFullYear()+"-"+c(a.getMonth()+1)+"-"+c(a.getDate())+"T"+c(a.getHours())+":"+c(a.getMinutes())+":"+c(a.getSeconds())+'"'}if(window.JSON)return JSON.stringify;var e={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};return function(c){switch(typeof c){case"undefined":return"undefined";case"number":return isFinite(c)?String(c):"null";case"string":return a(c);case"boolean":return String(c);default:if(null===c)return"null";if(utils.isArray(c))return b(c);if(utils.isDate(c))return d(c);var e,f,g=["{"],h=utils.json2str;for(var i in c)if(Object.prototype.hasOwnProperty.call(c,i))switch(f=c[i],typeof f){case"undefined":case"unknown":case"function":break;default:e&&g.push(","),e=1,g.push(h(i)+":"+h(f))}return g.push("}"),g.join("")}}}()};utils.each(["String","Function","Array","Number","RegExp","Object","Date"],function(a){UE.utils["is"+a]=function(b){return Object.prototype.toString.apply(b)=="[object "+a+"]"}});var EventBase=UE.EventBase=function(){};EventBase.prototype={addListener:function(a,b){a=utils.trim(a).split(/\s+/);for(var c,d=0;c=a[d++];)getListener(this,c,!0).push(b)},on:function(a,b){return this.addListener(a,b)},off:function(a,b){return this.removeListener(a,b)},trigger:function(){return this.fireEvent.apply(this,arguments)},removeListener:function(a,b){a=utils.trim(a).split(/\s+/);for(var c,d=0;c=a[d++];)utils.removeItem(getListener(this,c)||[],b)},fireEvent:function(){var a=arguments[0];a=utils.trim(a).split(" ");for(var b,c=0;b=a[c++];){var d,e,f,g=getListener(this,b);if(g)for(f=g.length;f--;)if(g[f]){if(e=g[f].apply(this,arguments),e===!0)return e;void 0!==e&&(d=e)}(e=this["on"+b.toLowerCase()])&&(d=e.apply(this,arguments))}return d}};var dtd=dom.dtd=function(){function a(a){for(var b in a)a[b.toUpperCase()]=a[b];return a}var b=utils.extend2,c=a({isindex:1,fieldset:1}),d=a({input:1,button:1,select:1,textarea:1,label:1}),e=b(a({a:1}),d),f=b({iframe:1},e),g=a({hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1}),h=a({ins:1,del:1,script:1,style:1}),i=b(a({b:1,acronym:1,bdo:1,"var":1,"#":1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1}),h),j=b(a({sub:1,img:1,embed:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1}),i),k=b(a({p:1}),j),l=b(a({iframe:1}),j,d),m=a({img:1,embed:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,"#":1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,"var":1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1}),n=b(a({a:0}),l),o=a({tr:1}),p=a({"#":1}),q=b(a({param:1}),m),r=b(a({form:1}),c,f,g,k),s=a({li:1,ol:1,ul:1}),t=a({style:1,script:1}),u=a({base:1,link:1,meta:1,title:1}),v=b(u,t),w=a({head:1,body:1}),x=a({html:1}),y=a({address:1,blockquote:1,center:1,dir:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,menu:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1}),z=a({area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1});return a({$nonBodyContent:b(x,w,u),$block:y,$inline:n,$inlineWithA:b(a({a:1}),n),$body:b(a({script:1,style:1}),y),$cdata:a({script:1,style:1}),$empty:z,$nonChild:a({iframe:1,textarea:1}),$listItem:a({dd:1,dt:1,li:1}),$list:a({ul:1,ol:1,dl:1}),$isNotEmpty:a({table:1,ul:1,ol:1,dl:1,iframe:1,area:1,base:1,col:1,hr:1,img:1,embed:1,input:1,link:1,meta:1,param:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1}),$removeEmpty:a({a:1,abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1}),$removeEmptyBlock:a({p:1,div:1}),$tableContent:a({caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1,table:1}),$notTransContent:a({pre:1,script:1,style:1,textarea:1}),html:w,head:v,style:p,script:p,body:r,base:{},link:{},meta:{},title:p,col:{},tr:a({td:1,th:1}),img:{},embed:{},colgroup:a({thead:1,col:1,tbody:1,tr:1,tfoot:1}),noscript:r,td:r,br:{},th:r,center:r,kbd:n,button:b(k,g),basefont:{},h5:n,h4:n,samp:n,h6:n,ol:s,h1:n,h3:n,option:p,h2:n,form:b(c,f,g,k),select:a({optgroup:1,option:1}),font:n,ins:n,menu:s,abbr:n,label:n,table:a({thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1}),code:n,tfoot:o,cite:n,li:r,input:{},iframe:r,strong:n,textarea:p,noframes:r,big:n,small:n,span:a({"#":1,br:1,b:1,strong:1,u:1,i:1,em:1,sub:1,sup:1,strike:1,span:1}),hr:n,dt:n,sub:n,optgroup:a({option:1}),param:{},bdo:n,"var":n,div:r,object:q,sup:n,dd:r,strike:n,area:{},dir:s,map:b(a({area:1,form:1,p:1}),c,h,g),applet:q,dl:a({dt:1,dd:1}),del:n,isindex:{},fieldset:b(a({legend:1}),m),thead:o,ul:s,acronym:n,b:n,a:b(a({a:1}),l),blockquote:b(a({td:1,tr:1,tbody:1,li:1}),r),caption:n,i:n,u:n,tbody:o,s:n,address:b(f,k),tt:n,legend:n,q:n,pre:b(i,e),p:b(a({a:1}),n),em:n,dfn:n})}(),attrFix=ie&&browser.version<9?{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder"}:{tabindex:"tabIndex",readonly:"readOnly"},styleBlock=utils.listToMap(["-webkit-box","-moz-box","block","list-item","table","table-row-group","table-header-group","table-footer-group","table-row","table-column-group","table-column","table-cell","table-caption"]),domUtils=dom.domUtils={NODE_ELEMENT:1,NODE_DOCUMENT:9,NODE_TEXT:3,NODE_COMMENT:8,NODE_DOCUMENT_FRAGMENT:11,POSITION_IDENTICAL:0,POSITION_DISCONNECTED:1,POSITION_FOLLOWING:2,POSITION_PRECEDING:4,POSITION_IS_CONTAINED:8,POSITION_CONTAINS:16,fillChar:ie&&"6"==browser.version?"\ufeff":"​",keys:{8:1,46:1,16:1,17:1,18:1,37:1,38:1,39:1,40:1,13:1},getPosition:function(a,b){if(a===b)return 0;var c,d=[a],e=[b];for(c=a;c=c.parentNode;){if(c===b)return 10;d.push(c)}for(c=b;c=c.parentNode;){if(c===a)return 20;e.push(c)}if(d.reverse(),e.reverse(),d[0]!==e[0])return 1;for(var f=-1;f++,d[f]===e[f];);for(a=d[f],b=e[f];a=a.nextSibling;)if(a===b)return 4;return 2},getNodeIndex:function(a,b){for(var c=a,d=0;c=c.previousSibling;)b&&3==c.nodeType?c.nodeType!=c.nextSibling.nodeType&&d++:d++;return d},inDoc:function(a,b){return 10==domUtils.getPosition(a,b)},findParent:function(a,b,c){if(a&&!domUtils.isBody(a))for(a=c?a:a.parentNode;a;){if(!b||b(a)||domUtils.isBody(a))return b&&!b(a)&&domUtils.isBody(a)?null:a;a=a.parentNode}return null},findParentByTagName:function(a,b,c,d){return b=utils.listToMap(utils.isArray(b)?b:[b]),domUtils.findParent(a,function(a){return b[a.tagName]&&!(d&&d(a))},c)},findParents:function(a,b,c,d){for(var e=b&&(c&&c(a)||!c)?[a]:[];a=domUtils.findParent(a,c);)e.push(a);return d?e:e.reverse()},insertAfter:function(a,b){return a.nextSibling?a.parentNode.insertBefore(b,a.nextSibling):a.parentNode.appendChild(b)},remove:function(a,b){var c,d=a.parentNode;if(d){if(b&&a.hasChildNodes())for(;c=a.firstChild;)d.insertBefore(c,a);d.removeChild(a)}return a},getNextDomNode:function(a,b,c,d){return getDomNode(a,"firstChild","nextSibling",b,c,d)},getPreDomNode:function(a,b,c,d){return getDomNode(a,"lastChild","previousSibling",b,c,d)},isBookmarkNode:function(a){return 1==a.nodeType&&a.id&&/^_baidu_bookmark_/i.test(a.id)},getWindow:function(a){var b=a.ownerDocument||a;return b.defaultView||b.parentWindow},getCommonAncestor:function(a,b){if(a===b)return a;for(var c=[a],d=[b],e=a,f=-1;e=e.parentNode;){if(e===b)return e;c.push(e)}for(e=b;e=e.parentNode;){if(e===a)return e;d.push(e)}for(c.reverse(),d.reverse();f++,c[f]===d[f];);return 0==f?null:c[f-1]},clearEmptySibling:function(a,b,c){function d(a,b){for(var c;a&&!domUtils.isBookmarkNode(a)&&(domUtils.isEmptyInlineElement(a)||!new RegExp("[^\t\n\r"+domUtils.fillChar+"]").test(a.nodeValue));)c=a[b],domUtils.remove(a),a=c}!b&&d(a.nextSibling,"nextSibling"),!c&&d(a.previousSibling,"previousSibling")},split:function(a,b){var c=a.ownerDocument;if(browser.ie&&b==a.nodeValue.length){var d=c.createTextNode("");return domUtils.insertAfter(a,d)}var e=a.splitText(b);if(browser.ie8){var f=c.createTextNode("");domUtils.insertAfter(e,f),domUtils.remove(f)}return e},isWhitespace:function(a){return!new RegExp("[^ \t\n\r"+domUtils.fillChar+"]").test(a.nodeValue)},getXY:function(a){for(var b=0,c=0;a.offsetParent;)c+=a.offsetTop,b+=a.offsetLeft,a=a.offsetParent;return{x:b,y:c}},on:function(a,b,c){var d=utils.isArray(b)?b:utils.trim(b).split(/\s+/),e=d.length;if(e)for(;e--;)if(b=d[e],a.addEventListener)a.addEventListener(b,c,!1);else{c._d||(c._d={els:[]});var f=b+c.toString(),g=utils.indexOf(c._d.els,a);c._d[f]&&g!=-1||(g==-1&&c._d.els.push(a),c._d[f]||(c._d[f]=function(a){return c.call(a.srcElement,a||window.event)}),a.attachEvent("on"+b,c._d[f]))}a=null},un:function(a,b,c){var d=utils.isArray(b)?b:utils.trim(b).split(/\s+/),e=d.length;if(e)for(;e--;)if(b=d[e],a.removeEventListener)a.removeEventListener(b,c,!1);else{var f=b+c.toString();try{a.detachEvent("on"+b,c._d?c._d[f]:c)}catch(g){}if(c._d&&c._d[f]){var h=utils.indexOf(c._d.els,a);h!=-1&&c._d.els.splice(h,1),0==c._d.els.length&&delete c._d[f]}}},isSameElement:function(a,b){if(a.tagName!=b.tagName)return!1;var c=a.attributes,d=b.attributes;if(!ie&&c.length!=d.length)return!1;for(var e,f,g=0,h=0,i=0;e=c[i++];){if("style"==e.nodeName){if(e.specified&&g++,domUtils.isSameStyle(a,b))continue;return!1}if(ie){if(!e.specified)continue;g++,f=d.getNamedItem(e.nodeName)}else f=b.attributes[e.nodeName];if(!f.specified||e.nodeValue!=f.nodeValue)return!1}if(ie){for(i=0;f=d[i++];)f.specified&&h++;if(g!=h)return!1}return!0},isSameStyle:function(a,b){var c=a.style.cssText.replace(/( ?; ?)/g,";").replace(/( ?: ?)/g,":"),d=b.style.cssText.replace(/( ?; ?)/g,";").replace(/( ?: ?)/g,":");if(browser.opera){if(c=a.style,d=b.style,c.length!=d.length)return!1;for(var e in c)if(!/^(\d+|csstext)$/i.test(e)&&c[e]!=d[e])return!1;return!0}if(!c||!d)return c==d;if(c=c.split(";"),d=d.split(";"),c.length!=d.length)return!1;for(var f,g=0;f=c[g++];)if(utils.indexOf(d,f)==-1)return!1;return!0},isBlockElm:function(a){return 1==a.nodeType&&(dtd.$block[a.tagName]||styleBlock[domUtils.getComputedStyle(a,"display")])&&!dtd.$nonChild[a.tagName]},isBody:function(a){return a&&1==a.nodeType&&"body"==a.tagName.toLowerCase()},breakParent:function(a,b){var c,d,e,f=a,g=a;do{for(f=f.parentNode,d?(c=f.cloneNode(!1),c.appendChild(d),d=c,c=f.cloneNode(!1),c.appendChild(e),e=c):(d=f.cloneNode(!1),e=d.cloneNode(!1));c=g.previousSibling;)d.insertBefore(c,d.firstChild);for(;c=g.nextSibling;)e.appendChild(c);g=f}while(b!==f);return c=b.parentNode,c.insertBefore(d,b),c.insertBefore(e,b),c.insertBefore(a,e),domUtils.remove(b),a},isEmptyInlineElement:function(a){if(1!=a.nodeType||!dtd.$removeEmpty[a.tagName])return 0;for(a=a.firstChild;a;){if(domUtils.isBookmarkNode(a))return 0;if(1==a.nodeType&&!domUtils.isEmptyInlineElement(a)||3==a.nodeType&&!domUtils.isWhitespace(a))return 0;a=a.nextSibling}return 1},trimWhiteTextNode:function(a){function b(b){for(var c;(c=a[b])&&3==c.nodeType&&domUtils.isWhitespace(c);)a.removeChild(c)}b("firstChild"),b("lastChild")},mergeChild:function(a,b,c){for(var d,e=domUtils.getElementsByTagName(a,a.tagName.toLowerCase()),f=0;d=e[f++];)if(d.parentNode&&!domUtils.isBookmarkNode(d))if("span"!=d.tagName.toLowerCase())domUtils.isSameElement(a,d)&&domUtils.remove(d,!0);else{if(a===d.parentNode&&(domUtils.trimWhiteTextNode(a),1==a.childNodes.length)){a.style.cssText=d.style.cssText+";"+a.style.cssText,domUtils.remove(d,!0);continue}if(d.style.cssText=a.style.cssText+";"+d.style.cssText,c){var g=c.style;if(g){g=g.split(";");for(var h,i=0;h=g[i++];)d.style[utils.cssStyleToDomStyle(h.split(":")[0])]=h.split(":")[1]}}domUtils.isSameStyle(d,a)&&domUtils.remove(d,!0)}},getElementsByTagName:function(a,b,c){if(c&&utils.isString(c)){var d=c;c=function(a){return domUtils.hasClass(a,d)}}b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var e,f=[],g=0;e=b[g++];)for(var h,i=a.getElementsByTagName(e),j=0;h=i[j++];)c&&!c(h)||f.push(h);return f},mergeToParent:function(a){for(var b=a.parentNode;b&&dtd.$removeEmpty[b.tagName];){if(b.tagName==a.tagName||"A"==b.tagName){if(domUtils.trimWhiteTextNode(b),"SPAN"==b.tagName&&!domUtils.isSameStyle(b,a)||"A"==b.tagName&&"SPAN"==a.tagName){if(b.childNodes.length>1||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||g<i-f)&&b.scrollTo(0,g+(g<0?-20:20))},isBr:function(a){return 1==a.nodeType&&"BR"==a.tagName},isFillChar:function(a,b){if(3!=a.nodeType)return!1;var c=a.nodeValue;return b?new RegExp("^"+domUtils.fillChar).test(c):!c.replace(new RegExp(domUtils.fillChar,"g"),"").length},isStartInblock:function(a){var b,c=a.cloneRange(),d=0,e=c.startContainer;if(1==e.nodeType&&e.childNodes[c.startOffset]){e=e.childNodes[c.startOffset];for(var f=e.previousSibling;f&&domUtils.isFillChar(f);)e=f,f=f.previousSibling}for(this.isFillChar(e,!0)&&1==c.startOffset&&(c.setStartBefore(e),e=c.startContainer);e&&domUtils.isFillChar(e);)b=e,e=e.previousSibling;for(b&&(c.setStartBefore(b),e=c.startContainer),1==e.nodeType&&domUtils.isEmptyNode(e)&&1==c.startOffset&&c.setStart(e,0).collapse(!0);!c.startOffset;){if(e=c.startContainer,domUtils.isBlockElm(e)||domUtils.isBody(e)){d=1;break}var g,f=c.startContainer.previousSibling;if(f){for(;f&&domUtils.isFillChar(f);)g=f,f=f.previousSibling;g?c.setStartBefore(g):c.setStartBefore(c.startContainer)}else c.setStartBefore(c.startContainer)}return d&&!domUtils.isBody(c.startContainer)?1:0},isEmptyBlock:function(a,b){if(1!=a.nodeType)return 0;if(b=b||new RegExp("[  \t\r\n"+domUtils.fillChar+"]","g"),a[browser.ie?"innerText":"textContent"].replace(b,"").length>0)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?"&nbsp;":"<br/>"},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<e.nodeValue.length&&domUtils.split(e,c),this.setEndAfter(e)))),this},txtToElmBoundary:function(a){function b(a,b){var c=a[b+"Container"],d=a[b+"Offset"];3==c.nodeType&&(d?d>=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.length<c&&(a[d+"Offset"]=b.nodeValue.length)}b(a.startContainer,a.startOffset,"start"),b(a.endContainer,a.endOffset,"end")}var c,d=domUtils.getWindow(this.document),h=d.getSelection();if(browser.gecko?this.document.body.focus():d.focus(),h){if(h.removeAllRanges(),this.collapsed&&!a){var j=this.startContainer,k=j;1==j.nodeType&&(k=j.childNodes[this.startOffset]),3==j.nodeType&&this.startOffset||(k?k.previousSibling&&3==k.previousSibling.nodeType:j.lastChild&&3==j.lastChild.nodeType)||(c=this.document.createTextNode(i),this.insertNode(c),e(this.document,c),f(c,"previousSibling"),f(c,"nextSibling"),g=c,this.setStart(c,browser.webkit?1:0).collapse(!0))}var l=this.document.createRange();if(this.collapsed&&browser.opera&&1==this.startContainer.nodeType){var k=this.startContainer.childNodes[this.startOffset];if(k){for(;k&&domUtils.isBlockElm(k)&&1==k.nodeType&&k.childNodes[0];)k=k.childNodes[0];k&&this.setStartBefore(k).collapse(!0)}else k=this.startContainer.lastChild,k&&domUtils.isBr(k)&&this.setStartBefore(k).collapse(!0)}b(this),l.setStart(this.startContainer,this.startOffset),l.setEnd(this.endContainer,this.endOffset),h.addRange(l)}return this},scrollToView:function(a,b){a=a?window:domUtils.getWindow(this.document);var c=this,d=c.document.createElement("span");return d.innerHTML="&nbsp;",c.cloneRange().insertNode(d),domUtils.scrollToView(d,a,b),domUtils.remove(d),c},inFillChar:function(){var a=this.startContainer;return!(!this.collapsed||3!=a.nodeType||a.nodeValue.replace(new RegExp("^"+domUtils.fillChar),"").length+1!=a.nodeValue.length)},createAddress:function(a,b){function c(a){for(var c,d=a?e.startContainer:e.endContainer,f=domUtils.findParents(d,!0,function(a){return!domUtils.isBody(a)}),g=[],h=0;c=f[h++];)g.push(domUtils.getNodeIndex(c,b));var i=0;if(b)if(3==d.nodeType){for(var j=d.previousSibling;j&&3==j.nodeType;)i+=j.nodeValue.replace(fillCharReg,"").length,j=j.previousSibling;i+=a?e.startOffset:e.endOffset}else if(d=d.childNodes[a?e.startOffset:e.endOffset])i=domUtils.getNodeIndex(d,b);else{d=a?e.startContainer:e.endContainer;for(var k=d.firstChild;k;)if(domUtils.isFillChar(k))k=k.nextSibling;else if(i++,3==k.nodeType)for(;k&&3==k.nodeType;)k=k.nextSibling;else k=k.nextSibling}else i=a?domUtils.isFillChar(d)?0:e.startOffset:e.endOffset;return i<0&&(i=0),g.push(i),g}var d={},e=this;return d.startAddress=c(!0),a||(d.endAddress=e.collapsed?[].concat(d.startAddress):c()),d},moveToAddress:function(a,b){function c(a,b){for(var c,e,f,g=d.document.body,h=0,i=a.length;h<i;h++)if(f=a[h],c=g,g=g.childNodes[f],!g){e=f;break}b?g?d.setStartBefore(g):d.setStart(c,e):g?d.setEndBefore(g):d.setEnd(c,e)}var d=this;return c(a.startAddress,!0),!b&&a.endAddress&&c(a.endAddress),d},equals:function(a){for(var b in this)if(this.hasOwnProperty(b)&&this[b]!==a[b])return!1;return!0},traversal:function(a,b){if(this.collapsed)return this;for(var c=this.createBookmark(),d=c.end,e=domUtils.getNextDomNode(c.start,!1,b);e&&e!==d&&domUtils.getPosition(e,d)&domUtils.POSITION_PRECEDING;){var f=domUtils.getNextDomNode(e,!1,b);a(e),e=f}return this.moveToBookmark(c)}}}(),function(){function a(a,b){var c=domUtils.getNodeIndex;a=a.duplicate(),a.collapse(b);var d=a.parentElement();if(!d.hasChildNodes())return{container:d,offset:0};for(var e,f,g=d.children,h=a.duplicate(),i=0,j=g.length-1,k=-1;i<=j;){k=Math.floor((i+j)/2),e=g[k],h.moveToElementText(e);var l=h.compareEndPoints("StartToStart",a);if(l>0)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?"":"<!DOCTYPE html>")+"<html xmlns='http://www.w3.org/1999/xhtml' class='view' ><head><style type='text/css'>.view{padding:0;word-wrap:break-word;cursor:text;height:90%;}\nbody{margin:8px;font-family:sans-serif;font-size:16px;}p{margin:5px 0;}</style>"+(c.iframeCssUrl?"<link rel='stylesheet' type='text/css' href='"+utils.unhtml(c.iframeCssUrl)+"'/>":"")+(c.initialStyle?"<style>"+c.initialStyle+"</style>":"")+"</head><body class='view' ></body><script type='text/javascript' "+(ie?"defer='defer'":"")+" id='_initialScript'>setTimeout(function(){editor = window.parent.UE.instants['ueditorInstant"+b.uid+"'];editor._setup(document);},0);var _tmpScript = document.getElementById('_initialScript');_tmpScript.parentNode.removeChild(_tmpScript);</script></html>";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="<p>"+(browser.ie?"":"<br/>")+"</p>"),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?'<link rel="stylesheet" type="text/css" href="'+a.href+'" />':"<style>"+a.cssText+"</style>"}),utils.each(a.document.getElementsByTagName("script"),function(a){c+=a.outerHTML})}return"<html><head>"+(a.options.charset?'<meta http-equiv="Content-Type" content="text/html; charset='+a.options.charset+'"/>':"")+(c||a.document.getElementsByTagName("head")[0].innerHTML)+b.join("\n")+"</head><body "+(ie&&browser.version<9?'class="view"':"")+">"+a.getContent(null,null,!0)+"</body></html>"},getPlainTxt:function(){var a=new RegExp(domUtils.fillChar,"g"),b=this.body.innerHTML.replace(/[\n\r]/g,"");return b=b.replace(/<(p|div)[^>]*>(<br\/?>|&nbsp;)<\/\1>/gi,"\n").replace(/<br\/?>/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(/&nbsp;/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="<p>"+(browser.ie?"&nbsp;":"<br/>")+"</p>"+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="<p>"+(ie?"":"<br/>")+"</p>",b.removeListener("firstBeforeExecCommand focus",a),setTimeout(function(){b.focus(),b._selectionChange()},0))}return function(b){var c=this;c.body.innerHTML='<p id="initContent">'+b+"</p>",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<a[c].length;d++)b.push(encodeURIComponent(c)+"[]="+encodeURIComponent(a[c][d]));return b.join("&")}function b(b,c){var d=f(),e=!1,g={method:"POST",timeout:5e3,async:!0,data:{},onsuccess:function(){},onerror:function(){}};if("object"==typeof b&&(c=b,b=c.url),d&&b){var h=c?utils.extend(g,c):g,i=a(h);utils.isEmptyObject(h.data)||(i+=(i?"&":"")+a(h.data));var j=setTimeout(function(){4!=d.readyState&&(e=!0,d.abort(),clearTimeout(j))},h.timeout),k=h.method.toUpperCase(),l=b+(b.indexOf("?")==-1?"?":"&")+("POST"==k?"":i+"&noCache="+ +new Date);d.open(k,l,h.async),d.onreadystatechange=function(){4==d.readyState&&(e||200!=d.status?h.onerror(d):h.onsuccess(d))},"POST"==k?(d.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),d.send(i)):d.send(null)}}function c(b,c){function d(a,b,c){a.setAttribute("type","text/javascript"),a.setAttribute("defer","defer"),c&&a.setAttribute("charset",c),a.setAttribute("src",b),document.getElementsByTagName("head")[0].appendChild(a)}function e(a){return function(){try{if(a)k.onerror&&k.onerror();else try{clearTimeout(g),i.apply(window,arguments)}catch(b){}}catch(c){k.onerror&&k.onerror.call(window,c)}finally{k.oncomplete&&k.oncomplete.apply(window,arguments),j.parentNode&&j.parentNode.removeChild(j),window[f]=null;try{delete window[f]}catch(b){}}}}var f,g,h,i=c.onsuccess||function(){},j=document.createElement("SCRIPT"),k=c||{},l=k.charset,m=k.jsonp||"callback",n=k.timeOut||0,o=new RegExp("(\\?|&)"+m+"=([^&]*)");utils.isFunction(i)?(f="bd__editor__"+Math.floor(2147483648*Math.random()).toString(36),window[f]=e(0)):utils.isString(i)?f=i:(h=o.exec(b))&&(f=h[2]),b=b.replace(o,"$1"+m+"="+f),b.search(o)<0&&(b+=(b.indexOf("?")<0?"?":"&")+m+"="+f);var p=a(c);utils.isEmptyObject(c.data)||(p+=(p?"&":"")+a(c.data)),p&&(b=b.replace(/\?/,"?"+p+"&")),j.onerror=e(1),n&&(g=setTimeout(e(1),n)),d(j,b,l)}var d="XMLHttpRequest()";try{new ActiveXObject("Msxml2.XMLHTTP"),d="ActiveXObject('Msxml2.XMLHTTP')"}catch(e){try{new ActiveXObject("Microsoft.XMLHTTP"),d="ActiveXObject('Microsoft.XMLHTTP')"}catch(e){}}var f=new Function("return new "+d);return{request:function(a,d){d&&"jsonp"==d.dataType?c(a,d):b(a,d)},getJSONP:function(a,b,d){var e={data:b,oncomplete:d};c(a,e)}}}();var filterWord=UE.filterWord=function(){function a(a){return/(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/gi.test(a)}function b(a){return a=a.replace(/[\d.]+\w+/g,function(a){return utils.transUnitToPx(a)})}function c(a){return a.replace(/[\t\r\n]+/g," ").replace(/<!--[\s\S]*?-->/gi,"").replace(/<v:shape [^>]*>[\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'<img width="'+b(c)+'" height="'+b(d)+'" src="'+e+'" />'}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(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>").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(/&#39;/g,"'").replace(/&quot;/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":/<table/.test(c)||(g[i]=j.replace(/^mso-|-alt$/g,"")+":"+b(k));continue;case"horiz-align":g[i]="text-align:"+k;continue;case"vert-align":g[i]="vertical-align:"+k;continue;case"font-color":case"mso-foreground":g[i]="color:"+k;continue;case"mso-background":case"mso-highlight":g[i]="background:"+k;continue;case"mso-default-height":g[i]="min-height:"+b(k);continue;case"mso-default-width":g[i]="min-width:"+b(k);continue;case"mso-padding-between-alt":g[i]="border-collapse:separate;border-spacing:"+b(k);continue;case"text-line-through":"single"!=k&&"double"!=k||(g[i]="text-decoration:line-through");continue;case"mso-zero-height":"yes"==k&&(g[i]="display:none");continue;case"margin":if(!/[1-9]/.test(k))continue}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test(j)||/text\-indent|padding|margin/.test(j)&&/\-[\d.]+/.test(k))continue;g[i]=j+":"+l[1]}}return c+(g.length?' style="'+g.join(";").replace(/;{2,}/g,";")+'"':"")})}return function(b){return a(b)?c(b):b}}();!function(){function a(a,b,c){return a.push(n),b+(c?1:-1)}function b(a,b){for(var c=0;c<b;c++)a.push(m)}function c(g,h,i,j){switch(g.type){case"root":for(var k,l=0;k=g.children[l++];)i&&"element"==k.type&&!dtd.$inlineWithA[k.tagName]&&l>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," &nbsp;"))}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"&quot;"}):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("</"+d.tagName+">"))}function f(a,b){b.push("<!--"+a.data+"-->")}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?"":" ")+"]*</?(\\w+)\\s*(?:[^>]*)>[\\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<a.length&&c(q,a.slice(o)),p},filterNode=UE.filterNode=function(){function a(b,c){switch(b.type){case"text":break;case"element":var d;if(d=c[b.tagName])if("-"===d)b.parentNode.removeChild(b);else if(utils.isFunction(d)){var e=b.parentNode,f=b.getIndex();if(d(b),b.parentNode){if(b.children)for(var g,h=0;g=b.children[h];)a(g,c),g.parentNode&&h++}else for(var g,h=f;g=e.children[h];)a(g,c),g.parentNode&&h++}else{var i=d.$;if(i&&b.attrs){var j,k={};for(var l in i){if(j=b.getAttr(l),"style"==l&&utils.isArray(i[l])){var m=[];utils.each(i[l],function(a){var c;(c=b.getStyle(a))&&m.push(a+":"+c)}),j=m.join(";")}j&&(k[l]=j)}b.attrs=k}if(b.children)for(var g,h=0;g=b.children[h];)a(g,c),g.parentNode&&h++}else if(dtd.$cdata[b.tagName])b.parentNode.removeChild(b);else{var e=b.parentNode,f=b.getIndex();b.parentNode.removeChild(b,!0);for(var g,h=f;g=e.children[h];)a(g,c),g.parentNode&&h++}break;case"comment":b.parentNode.removeChild(b)}}return function(b,c){if(utils.isEmptyObject(c))return b;var d;(d=c["-"])&&utils.each(d.split(" "),function(a){c[a]="-"});for(var e,f=0;e=b.children[f];)a(e,c),e.parentNode&&f++;return b}}();UE.plugin=function(){var a={};return{register:function(b,c,d,e){d&&utils.isFunction(d)&&(e=d,d=null),a[b]={optionName:d||b,execFn:c,afterDisabled:e}},load:function(b){utils.each(a,function(a){var c=a.execFn.call(b);b.options[a.optionName]!==!1?c&&utils.each(c,function(a,c){switch(c.toLowerCase()){case"shortcutkey":b.addshortcutkey(a);break;case"bindevents":utils.each(a,function(a,c){b.addListener(c,a)});break;case"bindmultievents":utils.each(utils.isArray(a)?a:[a],function(a){var c=utils.trim(a.type).split(/\s+/);utils.each(c,function(c){b.addListener(c,a.handler)})});break;case"commands":utils.each(a,function(a,c){b.commands[c]=a});break;case"outputrule":b.addOutputRule(a);break;case"inputrule":b.addInputRule(a);break;case"defaultoptions":b.setOpt(a)}}):a.afterDisabled&&a.afterDisabled.call(b)}),utils.each(UE.plugins,function(a){a.call(b)})},run:function(b,c){var d=a[b];d&&d.exeFn.call(c)}}}();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},LocalStorage=UE.LocalStorage=function(){function a(){var a=document.createElement("div");return a.style.display="none",a.addBehavior?(a.addBehavior("#default#userdata"),{getItem:function(b){var d=null;try{document.body.appendChild(a),a.load(c),d=a.getAttribute(b),document.body.removeChild(a)}catch(e){}return d},setItem:function(b,d){document.body.appendChild(a),a.setAttribute(b,d),a.save(c),document.body.removeChild(a)},removeItem:function(b){document.body.appendChild(a),a.removeAttribute(b),a.save(c),document.body.removeChild(a)}}):null}var b=window.localStorage||a()||null,c="localStorage";return{saveLocalData:function(a,c){return!(!b||!c)&&(b.setItem(a,c),!0)},getLocalData:function(a){return b?b.getItem(a):null},removeItem:function(a){b&&b.removeItem(a)}}}();!function(){var a="ueditor_preference";UE.Editor.prototype.setPreferences=function(b,c){var d={};utils.isString(b)?d[b]=c:d=b;var e=LocalStorage.getLocalData(a);e&&(e=utils.str2json(e))?utils.extend(e,d):e=d,e&&LocalStorage.saveLocalData(a,utils.json2str(e))},UE.Editor.prototype.getPreferences=function(b){var c=LocalStorage.getLocalData(a);return c&&(c=utils.str2json(c))?b?c[b]:c:null},UE.Editor.prototype.removePreferences=function(b){var c=LocalStorage.getLocalData(a);c&&(c=utils.str2json(c))&&(c[b]=void 0,delete c[b]),c&&LocalStorage.saveLocalData(a,utils.json2str(c))}}(),UE.plugins.defaultfilter=function(){var a=this;a.setOpt({allowDivTransToP:!0,disabledTableInTable:!0}),a.addInputRule(function(b){function c(a){for(;a&&"element"==a.type;){if("td"==a.tagName)return!0;a=a.parentNode}return!1}var d,e=this.options.allowDivTransToP;b.traversal(function(b){if("element"==b.type){if(!dtd.$cdata[b.tagName]&&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"style":case"script":b.setAttr({cdata_tag:b.tagName,cdata_data:b.innerHTML()||"",_ue_custom_node_:"true"}),b.tagName="div",b.innerHTML("");break;case"a":(d=b.getAttr("href"))&&b.setAttr("_href",d);break;case"img":if((d=b.getAttr("src"))&&/^data:/.test(d)){b.parentNode.removeChild(b);break}b.setAttr("_src",b.getAttr("src"));break;case"span":browser.webkit&&(d=b.getStyle("white-space"))&&/nowrap|normal/.test(d)&&(b.setStyle("white-space",""),a.options.autoClearEmptyNode&&utils.isEmptyObject(b.attrs)&&b.parentNode.removeChild(b,!0)),d=b.getAttr("id"),d&&/^_baidu_bookmark_/i.test(d)&&b.parentNode.removeChild(b);break;case"p":(d=b.getAttr("align"))&&(b.setAttr("align"),b.setStyle("text-align",d)),utils.each(b.children,function(a){if("element"==a.type&&"p"==a.tagName){var c=a.nextSibling();b.parentNode.insertAfter(a,b);for(var d=a;c;){var e=c.nextSibling();b.parentNode.insertAfter(c,d),d=c,c=e}return!1}}),b.firstChild()||b.innerHTML(browser.ie?"&nbsp;":"<br/>");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="<p>"+(browser.ie?"":"<br/>")+"</p>",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:"<br/>"}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<a.length;c++){var d=a.charCodeAt(c);b+=d>=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;c<a.length;c++)b+=32==a.charCodeAt(c)?String.fromCharCode(12288):a.charCodeAt(c)<127?String.fromCharCode(a.charCodeAt(c)+65248):a.charAt(c);return b}function f(){var a=h.getPreferences("autotypeset");utils.extend(h.options.autotypeset,a)}this.setOpt({autotypeset:{mergeEmptyline:!0,removeClass:!0,removeEmptyline:!1,textAlign:"left",imageBlockLine:"center",pasteFilter:!1,clearFontSize:!1,clearFontFamily:!1,removeEmptyNode:!1,removeTagNames:utils.extend({div:1},dtd.$removeEmpty),indent:!1,indentValue:"2em",bdc2sb:!1,tobdc:!1}});var g,h=this,i=h.options.autotypeset,j={selectTdClass:1,pagebreak:1,anchorclass:1},k={li:1},l={div:1,p:1,blockquote:1,center:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,span:1};i&&(f(),i.pasteFilter&&h.addListener("beforepaste",c),h.commands.autotypeset={execCommand:function(){h.removeListener("beforepaste",c),i.pasteFilter&&h.addListener("beforepaste",c),c.call(h)}})},UE.plugin.register("autosubmit",function(){return{shortcutkey:{autosubmit:"ctrl+13"},commands:{autosubmit:{execCommand:function(){var a=this,b=domUtils.findParentByTagName(a.iframe,"form",!1);if(b){if(a.fireEvent("beforesubmit")===!1)return;a.sync(),b.submit()}}}}}}),UE.plugin.register("background",function(){function a(a){var b={},c=a.split(";");return utils.each(c,function(a){var c=a.indexOf(":"),d=utils.trim(a.substr(0,c)).toLowerCase();d&&(b[d]=utils.trim(a.substr(c+1)||""))}),b}function b(a){if(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c+":"+a[c]+"; ");utils.cssRule(e,b.length?"body{"+b.join("")+"}":"",d.document)}else utils.cssRule(e,"",d.document)}var c,d=this,e="editor_background",f=new RegExp("body[\\s]*\\{(.+)\\}","i"),g=d.hasContents;return d.hasContents=function(){return!!d.queryCommandValue("background")||g.apply(d,arguments)},{bindEvents:{getAllHtml:function(a,b){var c=this.body,e=domUtils.getComputedStyle(c,"background-image"),f="";
+f=e.indexOf(d.options.imagePath)>0?e.substring(e.indexOf(d.options.imagePath),e.length-1).replace(/"|\(|\)/gi,""):"none"!=e?e.replace(/url\("?|"?\)/gi,""):"";var g='<style type="text/css">body{',h={"background-color":domUtils.getComputedStyle(c,"background-color")||"#ffffff","background-image":f?"url("+f+")":"","background-repeat":domUtils.getComputedStyle(c,"background-repeat")||"","background-position":browser.ie?domUtils.getComputedStyle(c,"background-position-x")+" "+domUtils.getComputedStyle(c,"background-position-y"):domUtils.getComputedStyle(c,"background-position"),height:domUtils.getComputedStyle(c,"height")};for(var i in h)h.hasOwnProperty(i)&&(g+=i+":"+h[i]+"; ");g+="}</style> ",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('<p style="display:none;" data-background="'+utils.trim(c[1].replace(/"/g,"").replace(/[\s]+/g," "))+'"><br/></p>'))},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",'<p id="_img_parent_tmp" style="text-align:center">'+i.innerHTML+"</p>"),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='<img src="'+g.src+'" '+(g._src?' _src="'+g._src+'" ':"")+(g.width?'width="'+g.width+'" ':"")+(g.height?' height="'+g.height+'" ':"")+("left"==g.floatStyle||"right"==g.floatStyle?' style="float:'+g.floatStyle+';"':"")+(g.title&&""!=g.title?' title="'+g.title+'"':"")+(g.border&&"0"!=g.border?' border="'+g.border+'"':"")+(g.alt&&""!=g.alt?' alt="'+g.alt+'"':"")+(g.hspace&&"0"!=g.hspace?' hspace = "'+g.hspace+'"':"")+(g.vspace&&"0"!=g.vspace?' vspace = "'+g.vspace+'"':"")+"/>","center"==g.floatStyle&&(i='<p style="text-align: center">'+i+"</p>"),h.push(i);else for(var j=0;g=b[j++];)c(g),i="<p "+("center"==g.floatStyle?'style="text-align: center" ':"")+'><img src="'+g.src+'" '+(g.width?'width="'+g.width+'" ':"")+(g._src?' _src="'+g._src+'" ':"")+(g.height?' height="'+g.height+'" ':"")+' style="'+(g.floatStyle&&"center"!=g.floatStyle?"float:"+g.floatStyle+";":"")+(g.border||"")+'" '+(g.title?' title="'+g.title+'"':"")+" /></p>",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<d;c++)if(b[c].specified)return 0;return 1}}return!a.attributes.length}function g(a){var b=a.createBookmark();if(a.collapsed&&a.enlarge(!0),!e){var d=domUtils.findParentByTagName(a.startContainer,"a",!0);d&&a.setStartBefore(d),d=domUtils.findParentByTagName(a.endContainer,"a",!0),d&&a.setEndAfter(d)}for(h=a.createBookmark(),p=h.start;(i=p.parentNode)&&!domUtils.isBlockElm(i);)domUtils.breakParent(p,i),domUtils.clearEmptySibling(p);if(h.end){for(p=h.end;(i=p.parentNode)&&!domUtils.isBlockElm(i);)domUtils.breakParent(p,i),domUtils.clearEmptySibling(p);for(var g,l=domUtils.getNextDomNode(h.start,!1,m);l&&l!=h.end;)g=domUtils.getNextDomNode(l,!0,m),dtd.$empty[l.tagName.toLowerCase()]||domUtils.isBookmarkNode(l)||(j.test(l.tagName)?c?(domUtils.removeStyle(l,c),f(l)&&"text-decoration"!=c&&domUtils.remove(l,!0)):domUtils.remove(l,!0):dtd.$tableContent[l.tagName]||dtd.$list[l.tagName]||(domUtils.removeAttributes(l,k),f(l)&&domUtils.remove(l,!0))),l=g}var n=h.start.parentNode;!domUtils.isBlockElm(n)||dtd.$tableContent[n.tagName]||dtd.$list[n.tagName]||domUtils.removeAttributes(n,k),n=h.end.parentNode,h.end&&domUtils.isBlockElm(n)&&!dtd.$tableContent[n.tagName]&&!dtd.$list[n.tagName]&&domUtils.removeAttributes(n,k),a.moveToBookmark(h).moveToBookmark(b);for(var o,p=a.startContainer,q=a.collapsed;1==p.nodeType&&domUtils.isEmptyNode(p)&&dtd.$removeEmpty[p.tagName];)o=p.parentNode,a.setStartBefore(p),a.startContainer===a.endContainer&&a.endOffset--,domUtils.remove(p),p=o;if(!q)for(p=a.endContainer;1==p.nodeType&&domUtils.isEmptyNode(p)&&dtd.$removeEmpty[p.tagName];)o=p.parentNode,a.setEndBefore(p),domUtils.remove(p),p=o}var h,i,j=new RegExp("^(?:"+(b||this.options.removeFormatTags).replace(/,/g,"|")+")$","i"),k=c?[]:(d||this.options.removeFormatAttributes).split(","),l=new dom.Range(this.document),m=function(a){return 1==a.nodeType};l=this.selection.getRange(),g(l),l.select()}}},UE.plugins.blockquote=function(){function a(a){return domUtils.filterNodeList(a.selection.getStartElementPath(),"blockquote")}var b=this;b.commands.blockquote={execCommand:function(b,c){var d=this.selection.getRange(),e=a(this),f=dtd.blockquote,g=d.createBookmark();if(e){var h=d.startContainer,i=domUtils.isBlockElm(h)?h:domUtils.findParent(h,function(a){return domUtils.isBlockElm(a)}),j=d.endContainer,k=domUtils.isBlockElm(j)?j:domUtils.findParent(j,function(a){return domUtils.isBlockElm(a)});i=domUtils.findParentByTagName(i,"li",!0)||i,k=domUtils.findParentByTagName(k,"li",!0)||k,"LI"==i.tagName||"TD"==i.tagName||i===e||domUtils.isBody(i)?domUtils.remove(e,!0):domUtils.breakParent(i,e),i!==k&&(e=domUtils.findParentByTagName(k,"blockquote"),e&&("LI"==k.tagName||"TD"==k.tagName||domUtils.isBody(k)?e.parentNode&&domUtils.remove(e,!0):domUtils.breakParent(k,e)));for(var l,m=domUtils.getElementsByTagName(this.document,"blockquote"),n=0;l=m[n++];)l.childNodes.length?domUtils.getPosition(l,i)&domUtils.POSITION_FOLLOWING&&domUtils.getPosition(l,k)&domUtils.POSITION_PRECEDING&&domUtils.remove(l,!0):domUtils.remove(l)}else{for(var o=d.cloneRange(),p=1==o.startContainer.nodeType?o.startContainer:o.startContainer.parentNode,q=p,r=1;;){if(domUtils.isBody(p)){q!==p?d.collapsed?(o.selectNode(q),r=0):o.setStartBefore(q):o.setStart(p,0);break}if(!f[p.tagName]){d.collapsed?o.selectNode(q):o.setStartBefore(q);break}q=p,p=p.parentNode}if(r)for(q=p=p=1==o.endContainer.nodeType?o.endContainer:o.endContainer.parentNode;;){if(domUtils.isBody(p)){q!==p?o.setEndAfter(q):o.setEnd(p,p.childNodes.length);break}if(!f[p.tagName]){o.setEndAfter(q);break}q=p,p=p.parentNode}p=d.document.createElement("blockquote"),domUtils.setAttributes(p,c),p.appendChild(o.extractContents()),o.insertNode(p);for(var s,t=domUtils.getElementsByTagName(p,"blockquote"),n=0;s=t[n++];)s.parentNode&&domUtils.remove(s,!0)}d.moveToBookmark(g).select()},queryCommandState:function(){return a(this)?1:0}}},UE.commands.touppercase=UE.commands.tolowercase={execCommand:function(a){var b=this,c=b.selection.getRange();if(c.collapsed)return c;for(var d=c.createBookmark(),e=d.end,f=function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)},g=domUtils.getNextDomNode(d.start,!1,f);g&&domUtils.getPosition(g,e)&domUtils.POSITION_PRECEDING&&(3==g.nodeType&&(g.nodeValue=g.nodeValue["touppercase"==a?"toUpperCase":"toLowerCase"]()),g=domUtils.getNextDomNode(g,!0,f),g!==e););c.moveToBookmark(d).select()}},UE.commands.indent={execCommand:function(){var a=this,b=a.queryCommandState("indent")?"0em":a.options.indentValue||"2em";a.execCommand("Paragraph","p",{style:"text-indent:"+b})},queryCommandState:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),"p h1 h2 h3 h4 h5 h6");return a&&a.style.textIndent&&parseInt(a.style.textIndent)?1:0}},UE.commands.print={execCommand:function(){this.window.print()},notNeedUndo:1},UE.commands.preview={execCommand:function(){var a=window.open("","_blank",""),b=a.document;b.open(),b.write('<!DOCTYPE html><html><head><meta charset="utf-8"/><script src="'+this.options.UEDITOR_HOME_URL+"ueditor.parse.js\"></script><script>setTimeout(function(){uParse('div',{rootPath: '"+this.options.UEDITOR_HOME_URL+"'})},300)</script></head><body><div>"+this.getContent(null,null,!0)+"</div></body></html>"),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","<hr>");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?"&nbsp;":"":"<br/>";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+="<br>":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="<br>":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/br>$/.test(f)||(f+="<br>")):f+=a.data+"<br>",!a.nextSibling()&&/<br>$/.test(f)&&(f=f.replace(/<br>$/,""));else if(f+="element"==a.type?dtd.$empty[a.tagName]?"":a.innerText():a.data,!/br\/?\s*>$/.test(f)){if(!a.nextSibling())return;f+="<br>"}})}c.execCommand("inserthtml",'<pre id="coder"class="brush:'+b+';toolbar:false">'+f+"</pre>",!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,"&nbsp;").replace(/\n$/,""):"br"==a.tagName?"\n":dtd.$empty[a.tagName]?a.innerText():""}),a.innerText(b.replace(/(&nbsp;|\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(/&nbsp;/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(/&nbsp;/g," ")))):h.appendChild(c.document.createTextNode(utils.html(b.data.replace(/&nbsp;/g," "))))}),"BR"!=h.lastChild.nodeName&&h.appendChild(c.document.createElement("br"))):h.appendChild(c.document.createTextNode(utils.html(a.data.replace(/&nbsp;/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="<br/>",d.setStart(b.body,0).setCursor()):(b.body.innerHTML="<p>"+(ie?"":"<br/>")+"</p>",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('<hr class="pagebreak" noshade="noshade" size="5" style="-webkit-user-select: none;">');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;c<d;c++)if(a[c]!=b[c])return 0;return 1}function b(b,c){return b.collapsed!=c.collapsed?0:a(b.startAddress,c.startAddress)&&a(b.endAddress,c.endAddress)?1:0}function c(){this.list=[],this.index=0,this.hasUndo=!1,this.hasRedo=!1,this.undo=function(){if(this.hasUndo){if(!this.list[this.index-1]&&1==this.list.length)return void this.reset();for(;this.list[this.index].content==this.list[this.index-1].content;)if(this.index--,0==this.index)return this.restore(0);this.restore(--this.index)}},this.redo=function(){if(this.hasRedo){for(;this.list[this.index].content==this.list[this.index+1].content;)if(this.index++,this.index==this.list.length-1)return this.restore(this.index);this.restore(++this.index)}},this.restore=function(){var a=this.editor,b=this.list[this.index],c=UE.htmlparser(b.content.replace(h,""));a.options.autoClearEmptyNode=!1,a.filterInputRule(c),a.options.autoClearEmptyNode=j,a.document.body.innerHTML=c.toHtml(),a.fireEvent("afterscencerestore"),browser.ie&&utils.each(domUtils.getElementsByTagName(a.document,"td th caption p"),function(b){domUtils.isEmptyNode(b)&&domUtils.fillNode(a.document,b)});try{var d=new dom.Range(a.document).moveToAddress(b.address);d.select(i[d.startContainer.nodeName.toLowerCase()])}catch(e){}this.update(),this.clearKey(),a.fireEvent("reset",!0)},this.getScene=function(){var a=this.editor,b=a.selection.getRange(),c=b.createAddress(!1,!0);a.fireEvent("beforegetscene");var d=UE.htmlparser(a.body.innerHTML);a.options.autoClearEmptyNode=!1,a.filterOutputRule(d),a.options.autoClearEmptyNode=j;var e=d.toHtml();return a.fireEvent("aftergetscene"),{address:c,content:e}},this.save=function(a,c){clearTimeout(d);var g=this.getScene(c),h=this.list[this.index];h&&h.content!=g.content&&e.trigger("contentchange"),h&&h.content==g.content&&(a?1:b(h.address,g.address))||(this.list=this.list.slice(0,this.index+1),this.list.push(g),this.list.length>f&&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+"|</hr>","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="<p><br/></p>",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(" &nbsp; &nbsp;"),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?"&nbsp;":"<br/>");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*(&nbsp;)+\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="<p></p>",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(/&nbsp;/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()||"<p>"+(browser.ie?"":"<br/>")+"</p>"}}else{e.iframe.style.cssText=h;var k=c.getContent()||"<p>"+(browser.ie?"":"<br/>")+"</p>";k=k.replace(new RegExp("[\\r\\t\\n ]*</?(\\w+)\\s*(?:[^>]*)>","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="<p>"+(browser.ie?"":"<br/>")+"</p>",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,"<p>"),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,"<p>"),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="<p>"+(browser.ie?"":"<br/>")+"</p>",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||"&nbsp;";l<n;l++)m+=o;var p=a.document.createElement("span");if(p.innerHTML=m+domUtils.fillChar,k.collapsed)k.insertNode(p.cloneNode(!0).firstChild).setCursor(!0);else{var q=function(a){return domUtils.isBlockElm(a)&&!j[a.tagName.toLowerCase()]};if(h=domUtils.findParent(k.startContainer,q,!0),i=domUtils.findParent(k.endContainer,q,!0),h&&i&&h===i)k.deleteContents(),k.insertNode(p.cloneNode(!0).firstChild).setCursor(!0);else{var r=k.createBookmark();k.enlarge(!0);for(var s=k.createBookmark(),t=domUtils.getNextDomNode(s.start,!1,q);t&&!(domUtils.getPosition(t,s.end)&domUtils.POSITION_FOLLOWING);)t.insertBefore(p.cloneNode(!0).firstChild,t.firstChild),t=domUtils.getNextDomNode(t,!1,q);k.moveToBookmark(s).moveToBookmark(r).select()}}domUtils.preventDefault(d)}if(browser.gecko&&46==e&&(k=a.selection.getRange(),k.collapsed&&(h=k.startContainer,domUtils.isEmptyBlock(h)))){for(var u=h.parentNode;1==domUtils.getChildCount(u)&&!domUtils.isBody(u);)h=u,u=u.parentNode;return void(h===u.lastChild&&d.preventDefault())}}),a.addListener("keyup",function(a,c){var d,e=c.keyCode||c.which,f=this;if(e==keymap.Backspace){if(f.fireEvent("delkeyup"))return;if(d=f.selection.getRange(),d.collapsed){var g,h=["h1","h2","h3","h4","h5","h6"];if((g=domUtils.findParentByTagName(d.startContainer,h,!0))&&domUtils.isEmptyBlock(g)){var i=g.previousSibling;if(i&&"TABLE"!=i.nodeName)return domUtils.remove(g),void d.setStartAtLast(i).setCursor(!1,!0);var j=g.nextSibling;if(j&&"TABLE"!=j.nodeName)return domUtils.remove(g),void d.setStartAtFirst(j).setCursor(!1,!0)}if(domUtils.isBody(d.startContainer)){var g=domUtils.createElement(f.document,"p",{innerHTML:browser.ie?domUtils.fillChar:"<br/>"});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('<span class="edui-editor-imagescale-hand'+i+'"></span>');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="<img "+(e?'id="'+e+'"':"")+' width="'+b+'" height="'+d+'" _url="'+a+'" class="'+g.replace(/\bvideo-js\b/,"")+'" src="'+c.options.UEDITOR_HOME_URL+'themes/default/images/spacer.gif" style="background:url('+c.options.UEDITOR_HOME_URL+"themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;"+(f?"float:"+f+";":"")+'" />';break;case"embed":i='<embed type="application/x-shockwave-flash" class="'+g+'" pluginspage="http://www.macromedia.com/go/getflashplayer" src="'+utils.html(a)+'" width="'+b+'" height="'+d+'"'+(f?' style="float:'+f+'"':"")+' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >';break;case"video":var j=a.substr(a.lastIndexOf(".")+1);"ogv"==j&&(j="ogg"),i="<video"+(e?' id="'+e+'"':"")+' class="'+g+' video-js" '+(f?' style="float:'+f+'"':"")+' controls preload="none" width="'+b+'" height="'+d+'" src="'+a+'" data-setup="{}"><source src="'+a+'" type="video/'+j+'" /></video>'}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;j<k;j++)g=d[j],f="upload"==e?"edui-upload-video video-js vjs-default-skin":"edui-faked-video",h.push(a(g.url,g.width||420,g.height||280,i+j,null,f,"image"));c.execCommand("inserthtml",h.join(""),!0);for(var l=this.selection.getRange(),j=0,k=d.length;j<k;j++){var m=this.document.getElementById("tmpVedio"+j);domUtils.removeAttributes(m,"id"),l.selectNode(m).select(),c.execCommand("imagefloat",d[j].align)}},queryCommandState:function(){var a=c.selection.getRange().getClosedNode(),b=a&&("edui-faked-video"==a.className||a.className.indexOf("edui-upload-video")!=-1);return b?1:0}}},function(){function a(a){}var b=UE.UETable=function(a){this.table=a,this.indexTable=[],this.selectedTds=[],this.cellsRange={},this.update(a)};b.removeSelectedClass=function(a){utils.each(a,function(a){domUtils.removeClasses(a,"selectTdClass")})},b.addSelectedClass=function(a){utils.each(a,function(a){domUtils.addClass(a,"selectTdClass")})},b.isEmptyBlock=function(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(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;i<f.rowSpan;i++)d["row_"+(e+i)]?d["row_"+(e+i)]++:d["row_"+(e+i)]=f.colSpan||1;g+=d["row_"+e]||0,c=Math.max(g,c)}return c},getCellColIndex:function(a){},getHSideCell: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.colIndex==this.colsNum-1)?null:(d=g?h.beginRowIndex:f.rowIndex,e=c?g?h.endColIndex+1:f.colIndex+1: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)}},getTabNextCell:function(a,b){var c,d=this.getCellInfo(a),e=b||d.rowIndex,f=d.colIndex+1+(d.colSpan-1);try{c=this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex)}catch(g){try{e=1*e+1,f=0,c=this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex)}catch(g){}}return c},getVSideCell: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)}},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;i<this.rowsNum;i++){g=f[i].cells;for(var j,k=0;j=g[k++];){var l=domUtils.getXY(j)[d?"x":"y"]+j["offset"+(d?"Width":"Height")];if(l>e&&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:"<br />")},cloneCell:b.cloneCell,getSameStartPosXCells:function(b){try{for(var c,d=domUtils.getXY(b).x+b.offsetWidth,e=this.table.rows,f=[],g=0;g<this.rowsNum;g++){c=e[g].cells;for(var h,i=0;h=c[i++];){var j=domUtils.getXY(h).x;if(j>d)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;f<g;f++)this.indexTable[f]=new Array(e);for(var h,i=0;h=b[i];i++)for(var j,k=0,l=h.cells;j=l[k];k++){j.rowSpan>c&&(j.rowSpan=c);for(var m=k,n=j.rowSpan||1,o=j.colSpan||1;this.indexTable[i][m];)m++;for(var p=0;p<n;p++)for(var q=0;q<o;q++)this.indexTable[i+p][m+q]={rowIndex:i,cellIndex:k,colIndex:m,rowSpan:n,colSpan:o}}for(p=0;p<c;p++)for(q=0;q<e;q++)void 0===this.indexTable[p][q]&&(h=b[p],j=h.cells[h.cells.length-1],j=j?j.cloneNode(!0):this.table.ownerDocument.createElement("td"),this.setCellContent(j),1!==j.colSpan&&(j.colSpan=1),1!==j.rowSpan&&(j.rowSpan=1),h.appendChild(j),this.indexTable[p][q]={rowIndex:p,cellIndex:j.cellIndex,colIndex:q,rowSpan:1,colSpan:1});var r=domUtils.getElementsByTagName(this.table,"td"),s=[];if(utils.each(r,function(a){domUtils.hasClass(a,"selectTdClass")&&s.push(a)}),s.length){var t=s[0],u=s[s.length-1],v=this.getCellInfo(t),w=this.getCellInfo(u);this.selectedTds=s,this.cellsRange={beginRowIndex:v.rowIndex,beginColIndex:v.colIndex,endRowIndex:w.rowIndex+w.rowSpan-1,endColIndex:w.colIndex+w.colSpan-1}}if(!domUtils.hasClass(this.table.rows[0],"firstRow")){domUtils.addClass(this.table.rows[0],"firstRow");for(var f=1;f<this.table.rows.length;f++)domUtils.removeClasses(this.table.rows[f],"firstRow")}},getCellInfo:function(a){if(a)for(var b=a.cellIndex,c=a.parentNode.rowIndex,d=this.indexTable[c],e=this.colsNum,f=b;f<e;f++){var g=d[f];if(g.rowIndex===c&&g.cellIndex===b)return g}},getCell:function(a,b){return a<this.rowsNum&&this.table.rows[a].cells[b]||null},deleteCell:function(a,b){b="number"==typeof b?b:a.parentNode.rowIndex;var c=this.table.rows[b];c.deleteCell(a.cellIndex)},getCellsRange:function(a,b){function c(a,b,e,f){var g,h,i,j=a,k=b,l=e,m=f;if(a>0)for(h=b;h<f;h++)g=d.indexTable[a][h],i=g.rowIndex,i<a&&(j=Math.min(i,j));if(f<d.colsNum)for(i=a;i<e;i++)g=d.indexTable[i][f],h=g.colIndex+g.colSpan-1,h>f&&(m=Math.max(h,m));if(e<d.rowsNum)for(h=b;h<f;h++)g=d.indexTable[e][h],i=g.rowIndex+g.rowSpan-1,i>e&&(l=Math.max(i,l));if(b>0)for(i=a;i<e;i++)g=d.indexTable[i][b],h=g.colIndex,h<b&&(k=Math.min(g.colIndex,k));return j!=a||k!=b||l!=e||m!=f?c(j,k,l,m):{beginRowIndex:a,beginColIndex:b,endRowIndex:e,endColIndex:f}}try{var d=this,e=d.getCellInfo(a);if(a===b)return{beginRowIndex:e.rowIndex,beginColIndex:e.colIndex,endRowIndex:e.rowIndex+e.rowSpan-1,endColIndex:e.colIndex+e.colSpan-1};var f=d.getCellInfo(b),g=Math.min(e.rowIndex,f.rowIndex),h=Math.min(e.colIndex,f.colIndex),i=Math.max(e.rowIndex+e.rowSpan-1,f.rowIndex+f.rowSpan-1),j=Math.max(e.colIndex+e.colSpan-1,f.colIndex+f.colSpan-1);return c(g,h,i,j)}catch(k){}},getCells:function(a){this.clearSelected();for(var b,c,d,e=a.beginRowIndex,f=a.beginColIndex,g=a.endRowIndex,h=a.endColIndex,i={},j=[],k=e;k<=g;k++)for(var l=f;l<=h;l++){b=this.indexTable[k][l],c=b.rowIndex,d=b.colIndex;var m=c+"|"+d;if(!i[m]){if(i[m]=1,c<k||d<l||c+b.rowSpan-1>g||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;g<j;g++)this.table.deleteRow(i);else for(var g=0,j=b.rowSpan-1;g<j;g++){var k=this.table.rows[h+1];k.parentNode.removeChild(k)}b.rowSpan=1}this.update()},insertRow:function(a,b){function c(a,b,c){if(0==a){var d=c.nextSibling||c.previousSibling,e=d.cells[a];"TH"==e.tagName&&(e=b.ownerDocument.createElement("th"),e.appendChild(b.firstChild),c.insertBefore(e,b),domUtils.remove(b))}else if("TH"==b.tagName){var f=b.ownerDocument.createElement("td");f.appendChild(b.firstChild),c.insertBefore(f,b),domUtils.remove(b)}}var d,e=this.colsNum,f=this.table,g=f.insertRow(a),h="string"==typeof b&&"TH"==b.toUpperCase();if(0==a||a==this.rowsNum)for(var i=0;i<e;i++)d=this.cloneCell(b,!0),this.setCellContent(d),d.getAttribute("vAlign")&&d.setAttribute("vAlign",d.getAttribute("vAlign")),g.appendChild(d),h||c(i,d,g);else{var j=this.indexTable[a];for(i=0;i<e;i++){var k=j[i];k.rowIndex<a?(d=this.getCell(k.rowIndex,k.cellIndex),d.rowSpan=k.rowSpan+1):(d=this.cloneCell(b,!0),this.setCellContent(d),g.appendChild(d)),h||c(i,d,g)}}return this.update(),g},deleteRow:function(a){for(var b=this.table.rows[a],c=this.indexTable[a],d=this.colsNum,e=0,f=0;f<d;){var g=c[f],h=this.getCell(g.rowIndex,g.cellIndex);if(h.rowSpan>1&&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;m<f?(j=f-m-1,domUtils.insertAfter(l.cells[j],i)):l.cells.length&&l.insertBefore(i,l.cells[0]),e+=1}f+=h.colSpan||1}var n=[],o={};for(f=0;f<d;f++){var p=c[f].rowIndex,q=c[f].cellIndex,r=p+"_"+q;o[r]||(o[r]=1,h=this.getCell(p,q),n.push(h))}var s=[];utils.each(n,function(a){1==a.rowSpan?a.parentNode.removeChild(a):s.push(a)}),utils.each(s,function(a){a.rowSpan--}),b.parentNode.removeChild(b),this.update()},insertCol:function(a,b,c){function d(a,b,c){if(0==a){var d=b.nextSibling||b.previousSibling;"TH"==d.tagName&&(d=b.ownerDocument.createElement("th"),d.appendChild(b.firstChild),c.insertBefore(d,b),domUtils.remove(b))}else if("TH"==b.tagName){var e=b.ownerDocument.createElement("td");e.appendChild(b.firstChild),c.insertBefore(e,b),domUtils.remove(b)}}var e,f,g,h=this.rowsNum,i=0,j=parseInt((this.table.offsetWidth-20*(this.colsNum+1)-(this.colsNum+1))/(this.colsNum+1),10),k="string"==typeof b&&"TH"==b.toUpperCase();if(0==a||a==this.colsNum)for(;i<h;i++)e=this.table.rows[i],g=e.cells[0==a?a:e.cells.length],f=this.cloneCell(b,!0),this.setCellContent(f),f.setAttribute("vAlign",f.getAttribute("vAlign")),g&&f.setAttribute("width",g.getAttribute("width")),a?domUtils.insertAfter(e.cells[e.cells.length-1],f):e.insertBefore(f,e.cells[0]),k||d(i,f,e);else for(;i<h;i++){var l=this.indexTable[i][a];l.colIndex<a?(f=this.getCell(l.rowIndex,l.cellIndex),f.colSpan=l.colSpan+1):(e=this.table.rows[i],g=e.cells[l.cellIndex],f=this.cloneCell(b,!0),this.setCellContent(f),f.setAttribute("vAlign",f.getAttribute("vAlign")),g&&f.setAttribute("width",g.getAttribute("width")),g?e.insertBefore(f,g):e.appendChild(f)),k||d(i,f,e)}this.update(),this.updateWidth(j,c||{tdPadding:10,tdBorder:1})},updateWidth:function(a,c){var d=this.table,e=b.getWidth(d)-2*c.tdPadding-c.tdBorder+a;if(e<d.ownerDocument.body.offsetWidth)return void d.setAttribute("width",e);var f=domUtils.getElementsByTagName(this.table,"td th");utils.each(f,function(b){b.setAttribute("width",a)})},deleteCol:function(a){for(var b=this.indexTable,c=this.table.rows,d=this.table.getAttribute("width"),e=0,f=this.rowsNum,g={},h=0;h<f;){var i=b[h],j=i[a],k=j.rowIndex+"_"+j.colIndex;if(!g[k]){g[k]=1;var l=this.getCell(j.rowIndex,j.cellIndex);e||(e=l&&parseInt(l.offsetWidth/l.colSpan,10).toFixed(0)),l.colSpan>1?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<g;f++)if(f!=c){var h=this.table.rows[f],i=h.insertCell(d-this.getPreviewMergedCellsNum(f,d));i.colSpan=b.colSpan,this.setCellContent(i),i.setAttribute("vAlign",a.getAttribute("vAlign")),i.setAttribute("align",a.getAttribute("align")),a.style.cssText&&(i.style.cssText=a.style.cssText),e.push(i)}return this.update(),e},getPreviewMergedCellsNum:function(a,b){for(var c=this.indexTable[a],d=0,e=0;e<b;){var f=c[e].colSpan,g=c[e].rowIndex;d+=f-(g==a?1:0),e+=f}return d},splitToCols:function(a){var b=(a.offsetWidth/a.colSpan-22).toFixed(0),c=this.getCellInfo(a),d=c.rowIndex,e=c.colIndex,f=[];a.colSpan=1,a.setAttribute("width",b),f.push(a);for(var g=e,h=e+c.colSpan;g<h;g++)if(g!=e){var i=this.table.rows[d],j=i.insertCell(this.indexTable[d][g].cellIndex+1);if(j.rowSpan=c.rowSpan,this.setCellContent(j),j.setAttribute("vAlign",a.getAttribute("vAlign")),j.setAttribute("align",a.getAttribute("align")),j.setAttribute("width",b),a.style.cssText&&(j.style.cssText=a.style.cssText),"TH"==a.tagName){var k=a.ownerDocument.createElement("th");k.appendChild(j.firstChild),k.setAttribute("vAlign",a.getAttribute("vAlign")),k.rowSpan=j.rowSpan,i.insertBefore(k,j),domUtils.remove(j)}f.push(j)}return this.update(),f},isLastCell:function(a,b,c){b=b||this.rowsNum,c=c||this.colsNum;var d=this.getCellInfo(a);return d.rowIndex+d.rowSpan==b&&d.colIndex+d.colSpan==c},getLastCell:function(a){a=a||this.table.getElementsByTagName("td");var b,c=(this.getCellInfo(a[0]),this),d=a[0],e=d.parentNode,f=0,g=0;return utils.each(a,function(a){a.parentNode==e&&(g+=a.colSpan||1),f+=a.rowSpan*a.colSpan||1}),b=f/g,utils.each(a,function(a){if(c.isLastCell(a,b,g))return d=a,!1}),d},selectRow:function(a){var b=this.indexTable[a],c=this.getCell(b[0].rowIndex,b[0].cellIndex),d=this.getCell(b[this.colsNum-1].rowIndex,b[this.colsNum-1].cellIndex),e=this.getCellsRange(c,d);this.setSelected(e)},selectTable:function(){var a=this.table.getElementsByTagName("td"),b=this.getCellsRange(a[0],a[a.length-1]);this.setSelected(b)},setBackground:function(a,b){if("string"==typeof b)utils.each(a,function(a){a.style.backgroundColor=b});else if("object"==typeof b){b=utils.extend({repeat:!0,colorList:["#ddd","#fff"]},b);for(var c,d=this.getCellInfo(a[0]).rowIndex,e=0,f=b.colorList,g=function(a,b,c){return a[b]?a[b]:c?a[b%a.length]:""},h=0;c=a[h++];){var i=this.getCellInfo(c);c.style.backgroundColor=g(f,d+e==i.rowIndex?e:++e,b.repeat)}}},removeBackground:function(a){utils.each(a,function(a){a.style.backgroundColor=""})}}}(),function(){function a(a,c){var d=domUtils.getElementsByTagName(a,"td th");utils.each(d,function(a){a.removeAttribute("width")}),a.setAttribute("width",b(c,!0,g(c,a)));var e=[];setTimeout(function(){utils.each(d,function(a){1==a.colSpan&&e.push(a.offsetWidth)}),utils.each(d,function(a,b){1==a.colSpan&&a.setAttribute("width",e[b]+"")})},0)}function b(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 c(a){var b=e(a).cell;if(b){var c=h(b);return c.selectedTds.length?c.selectedTds:[b]}return[]}var d=UE.UETable,e=function(a){return d.getTableItemsByRange(a)},f=function(a){return d.getUETableBySelected(a)},g=function(a,b){return d.getDefaultValue(a,b)},h=function(a){return d.getUETable(a)};UE.commands.inserttable={queryCommandState:function(){return e(this).table?-1:0},execCommand:function(a,b){function c(a,b){for(var c=[],d=a.numRows,e=a.numCols,f=0;f<d;f++){c.push("<tr"+(0==f?' class="firstRow"':"")+">");for(var g=0;g<e;g++)c.push('<td width="'+b+'"  vAlign="'+a.tdvalign+'" >'+(browser.ie&&browser.version<11?domUtils.fillChar:"<br/>")+"</td>");c.push("</tr>")}return"<table><tbody>"+c.join("")+"</tbody></table>"}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?"&nbsp;":"<br />",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:"<br/>"}),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:"<br/>",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<b.rows.length;c++)domUtils.remove(b.rows[c].children[0]);a(b,this);var d=b.getElementsByTagName("td")[0];this.selection.getRange().setStart(d,0).setCursor(!1,!0)}},UE.commands.mergeright={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.colIndex+g.colSpan;if(i>=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).rowsNum<this.options.maxRowNum?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this),d=c.cell,f=c.table,g=h(f),i=g.getCellInfo(d);if(g.selectedTds.length)for(var j=g.cellsRange,k=0,l=j.endRowIndex-j.beginRowIndex+1;k<l;k++)g.insertRow(j.beginRowIndex,d);else g.insertRow(i.rowIndex,d);a.moveToBookmark(b).select(),"enabled"===f.getAttribute("interlaced")&&this.fireEvent("interlacetable",f)}},UE.commands.insertrownext={queryCommandState:function(){var a=e(this),b=a.cell;return b&&"TD"==b.tagName&&h(a.table).rowsNum<this.options.maxRowNum?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this),d=c.cell,f=c.table,g=h(f),i=g.getCellInfo(d);if(g.selectedTds.length)for(var j=g.cellsRange,k=0,l=j.endRowIndex-j.beginRowIndex+1;k<l;k++)g.insertRow(j.endRowIndex+1,d);else g.insertRow(i.rowIndex+i.rowSpan,d);a.moveToBookmark(b).select(),"enabled"===f.getAttribute("interlaced")&&this.fireEvent("interlacetable",f)}},UE.commands.deleterow={queryCommandState:function(){var a=e(this);return a.cell?0:-1},execCommand:function(){var a=e(this).cell,b=h(a),c=b.cellsRange,d=b.getCellInfo(a),f=b.getVSideCell(a),g=b.getVSideCell(a,!0),i=this.selection.getRange();if(utils.isEmptyObject(c))b.deleteRow(d.rowIndex);else for(var j=c.beginRowIndex;j<c.endRowIndex+1;j++)b.deleteRow(c.beginRowIndex);var k=b.table;if(k.getElementsByTagName("td").length)if(1==d.rowSpan||d.rowSpan==c.endRowIndex-c.beginRowIndex+1)(g||f)&&i.selectNodeContents(g||f).setCursor(!1,!0);else{var l=b.getCell(d.rowIndex,b.indexTable[d.rowIndex][d.colIndex].cellIndex);l&&i.selectNodeContents(l).setCursor(!1,!0)}else{var m=k.nextSibling;domUtils.remove(k),m&&i.setStart(m,0).setCursor(!1,!0)}"enabled"===k.getAttribute("interlaced")&&this.fireEvent("interlacetable",k)}},UE.commands.insertcol={queryCommandState:function(a){var b=e(this),c=b.cell;return c&&("TD"==c.tagName||"TH"==c.tagName&&c!==b.tr.cells[0])&&h(b.table).colsNum<this.options.maxColNum?0:-1},execCommand:function(a){var b=this.selection.getRange(),c=b.createBookmark(!0);if(this.queryCommandState(a)!=-1){var d=e(this).cell,f=h(d),g=f.getCellInfo(d);if(f.selectedTds.length)for(var i=f.cellsRange,j=0,k=i.endColIndex-i.beginColIndex+1;j<k;j++)f.insertCol(i.beginColIndex,d);else f.insertCol(g.colIndex,d);b.moveToBookmark(c).select(!0)}}},UE.commands.insertcolnext={queryCommandState:function(){var a=e(this),b=a.cell;return b&&h(a.table).colsNum<this.options.maxColNum?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c),f=d.getCellInfo(c);
+if(d.selectedTds.length)for(var g=d.cellsRange,i=0,j=g.endColIndex-g.beginColIndex+1;i<j;i++)d.insertCol(g.endColIndex+1,c);else d.insertCol(f.colIndex+f.colSpan,c);a.moveToBookmark(b).select()}},UE.commands.deletecol={queryCommandState:function(){var a=e(this);return a.cell?0:-1},execCommand:function(){var a=e(this).cell,b=h(a),c=b.cellsRange,d=b.getCellInfo(a),f=b.getHSideCell(a),g=b.getHSideCell(a,!0);if(utils.isEmptyObject(c))b.deleteCol(d.colIndex);else for(var i=c.beginColIndex;i<c.endColIndex+1;i++)b.deleteCol(c.beginColIndex);var j=b.table,k=this.selection.getRange();if(j.getElementsByTagName("td").length)domUtils.inDoc(a,this.document)?k.setStart(a,0).setCursor(!1,!0):g&&domUtils.inDoc(g,this.document)?k.selectNodeContents(g).setCursor(!1,!0):f&&domUtils.inDoc(f,this.document)&&k.selectNodeContents(f).setCursor(!0,!0);else{var l=j.nextSibling;domUtils.remove(j),l&&k.setStart(l,0).setCursor(!1,!0)}}},UE.commands.splittocells={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||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,g<h?h:g>i?i:g}}function l(b,c){try{var d=domUtils.getXY(b).y,e=f(c).y;return e<d?d:e}catch(g){a(g)}}function m(b,c,d,e,f){try{b.body.style.cursor="h"==d?"col-resize":"v"==d?"row-resize":"text",browser.ie&&(!d||ia||Z(b)?I(b):(H(b,b.document),J(d,f))),da=c}catch(g){a(g)}}function n(a,b){var c=domUtils.getXY(a);return c?c.x+a.offsetWidth-b.x<S?"h":b.x-c.x<S?"h1":c.y+a.offsetHeight-b.y<S?"v":b.y-c.y<S?"v1":"":""}function o(a,b){if(!A())if(V={x:b.clientX,y:b.clientY},2==b.button){var c=Z(N),d=!1;if(c){var e=M(N,b);utils.each(c.selectedTds,function(a){a===e&&(d=!0)}),d?(e=c.selectedTds[0],setTimeout(function(){N.selection.getRange().setStart(e,0).setCursor(!1,!0)},0)):(_(domUtils.getElementsByTagName(N.body,"th td")),c.clearSelected())}}else q(b)}function p(a){U=0,a=a||N.window.event;var b=d(a.target||a.srcElement);if(b){var c;if(c=n(b,f(a))){if(I(N),"h1"==c)if(c="h",j(domUtils.findParentByTagName(b,"table"),b,a))N.execCommand("adaptbywindow");else if(b=Y(b).getPreviewCell(b)){var e=N.selection.getRange();e.selectNodeContents(b).setCursor(!0,!0)}if("h"==c){var g=Y(b),h=g.table,i=C(b,h,!0);i=s(i,"left"),g.width=g.offsetWidth;var k=[],l=[];utils.each(i,function(a){k.push(a.offsetWidth)}),utils.each(i,function(a){a.removeAttribute("width")}),window.setTimeout(function(){var a=!0;utils.each(i,function(b,c){var d=b.offsetWidth;return d>k[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;e<f;e++)d=a[e][b],d&&c.push(d);return c}function t(){O&&clearTimeout(O),O=null}function u(a){var b=["pageX","pageY","clientX","clientY","srcElement","target"],c={};if(a)for(var d,e,f=0;d=b[f];f++)e=a[d],e&&(c[d]=e);return c}function v(a){if(R=!1,aa=a.target||a.srcElement){var b=n(aa,f(a));/\d/.test(b)&&(b=b.replace(/\d/,""),aa=Y(aa).getPreviewCell(aa,"v"==b)),I(N),H(N,N.document),N.fireEvent("saveScene"),J(b,aa),ia=!0,ca=b,ha=aa}}function w(a,b){if(!A()){if(t(),R=!1,da&&(U=++U%3,V={x:b.clientX,y:b.clientY},P=setTimeout(function(){U>0&&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=e<d?d:e,a.style.height&&(a.style.height=""),1==a.rowSpan?a.setAttribute("height",b):a.removeAttribute&&a.removeAttribute("height")}function z(a,b){var c=Y(a);if(c){var d=c.table,e=C(a,d);if(d.style.width="",d.removeAttribute("width"),b=D(b,a,e),a.nextSibling){utils.each(e,function(a){a.left.width=+a.left.width+b,a.right&&(a.right.width=+a.right.width-b)})}else utils.each(e,function(a){a.left.width-=-b})}}function A(){return"false"===N.body.contentEditable}function B(a,b){if(!(Math.abs(b)<10)){var c=Y(a);if(c)for(var d,e=c.getSameEndPosCells(a,"y"),f=e[0]?e[0].offsetHeight:0,g=0;d=e[g++];)y(d,b,f)}}function C(a,b,c){if(b||(b=domUtils.findParentByTagName(a,"table")),!b)return null;for(var d=(domUtils.getNodeIndex(a),a),e=b.rows,f=0;d;)1===d.nodeType&&(f+=d.colSpan||1),d=d.previousSibling;d=null;var g=[];return utils.each(e,function(a){var b=a.cells,d=0;utils.each(b,function(a){return d+=a.colSpan||1,d===f?(g.push({left:a,right:a.nextSibling||null}),!1):d>f?(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;r<w;r++)h.execCommand("insertcol");h.__hasEnterExecCommand=!1,n=o.table.rows[0].cells[y.cellIndex],"TH"==n.tagName&&(n=o.table.rows[1].cells[y.cellIndex])}for(var q,r=0;q=a[r++];){l=n;for(var s,u=0;s=q[u++];)if(n)n.innerHTML=s.innerHTML,s.getAttribute("width")&&n.setAttribute("width",s.getAttribute("width")),s.getAttribute("vAlign")&&n.setAttribute("vAlign",s.getAttribute("vAlign")),s.getAttribute("align")&&n.setAttribute("align",s.getAttribute("align")),s.style.cssText&&(n.style.cssText=s.style.cssText),m=n,n=n.nextSibling;else{var x=s.cloneNode(!0);domUtils.removeAttributes(x,["class","rowSpan","colSpan"]),m.parentNode.appendChild(x)}if(n=o.getNextCell(l,!0,!0),!a[r])break;if(!n){var y=o.getCellInfo(l);o.table.insertRow(o.table.rows.length),o.update(),n=o.getVSideCell(l,!0)}}}o.update()}else{k=h.document.createElement("table");for(var q,r=0;q=a[r++];){for(var s,t=k.insertRow(k.rows.length),u=0;s=q[u++];)x=X.cloneCell(s,null,!0),domUtils.removeAttributes(x,["class"]),t.appendChild(x);2==u&&x.rowSpan>1&&(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","<table  "+(c&&f?'width="'+A+'"':"")+">"+k.innerHTML.replace(/>\s*</g,"><").replace(/\bth\b/gi,"td")+"</table>")}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;h<f;h++)e[h].className=g(c||d.options.classList,h,!0)}),N.addListener("uninterlacetable",function(a,b){if(b)for(var c=this,d=b.rows,e=c.options.classList,f=d.length,g=0;g<f;g++)domUtils.removeClasses(d[g],e)}),N.addListener("mousedown",o),N.addListener("mouseup",w),domUtils.on(N.body,"dragstart",function(a){w.call(N,"dragstart",a)}),N.addOutputRule(function(a){utils.each(a.getNodesByTagName("div"),function(a){"ue_tableDragLine"==a.getAttr("id")&&a.parentNode.removeChild(a)})});var k=0;N.addListener("mousedown",function(){k=0}),N.addListener("tabkeydown",function(){var a=this.selection.getRange(),b=a.getCommonAncestor(!0,!0),c=domUtils.findParentByTagName(b,"table");if(c){if(domUtils.findParentByTagName(b,"caption",!0)){var d=domUtils.getElementsByTagName(c,"th td");d&&d.length&&a.setStart(d[0],0).setCursor(!1,!0)}else{var d=domUtils.findParentByTagName(b,["td","th"],!0),f=Y(d);k=d.rowSpan>1?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="&nbsp;")})}),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.offsetWidth<N.body.offsetWidth)return!1;var b=domUtils.getElementsByTagName(a,"td"),d=[];utils.each(b,function(a){d.push(a.offsetWidth)});for(var e,f=0;e=b[f];f++)e.setAttribute("width",Math.floor(d[f]*c));a.setAttribute("width",Math.floor(L(N,ja,$(N))))})}});var l=N.execCommand;N.execCommand=function(a,b){var c=this;a=a.toLowerCase();var d,f,g=Z(c),h=new dom.Range(c.document),i=c.commands[a]||UE.commands[a];if(i){if(!g||ka[a]||i.notNeedUndo||c.__hasEnterExecCommand)f=l.apply(c,arguments);else{c.__hasEnterExecCommand=!0,c.fireEvent("beforeexeccommand",a),d=g.selectedTds;for(var j,k,m,n=-2,o=-2,p=0;m=d[p];p++)e(m)?h.setStart(m,0).setCursor(!1,!0):h.selectNode(m).select(!0),k=c.queryCommandState(a),j=c.queryCommandValue(a),k!=-1&&(n===k&&o===j||(c._ignoreContentChange=!0,f=l.apply(c,arguments),c._ignoreContentChange=!1),n=c.queryCommandState(a),o=c.queryCommandValue(a),domUtils.isEmptyBlock(m)&&domUtils.fillNode(c.document,m));h.setStart(d[0],0).shrinkBoundary(!0).setCursor(!1,!0),c.fireEvent("contentchange"),c.fireEvent("afterexeccommand",a),c.__hasEnterExecCommand=!1,c._selectionChange()}return f}}});var la},UE.UETable.prototype.sortTable=function(a,b){var c=this.table,d=c.rows,e=[],f="TH"===d[0].cells[0].tagName,g=0;if(this.selectedTds.length){for(var h=this.cellsRange,i=h.endRowIndex+1,j=h.beginRowIndex;j<i;j++)e[j]=d[j];e.splice(0,h.beginRowIndex),g=h.endRowIndex+1===this.rowsNum?0:h.endRowIndex+1;
+}else for(var j=0,i=d.length;j<i;j++)e[j]=d[j];var k={reversecurrent:function(a,b){return 1},orderbyasc:function(a,b){var c=a.innerText||a.textContent,d=b.innerText||b.textContent;return c.localeCompare(d)},reversebyasc:function(a,b){var c=a.innerHTML,d=b.innerHTML;return d.localeCompare(c)},orderbynum:function(a,b){var c=a[browser.ie?"innerText":"textContent"].match(/\d+/),d=b[browser.ie?"innerText":"textContent"].match(/\d+/);return c&&(c=+c[0]),d&&(d=+d[0]),(c||0)-(d||0)},reversebynum:function(a,b){var c=a[browser.ie?"innerText":"textContent"].match(/\d+/),d=b[browser.ie?"innerText":"textContent"].match(/\d+/);return c&&(c=+c[0]),d&&(d=+d[0]),(d||0)-(c||0)}};c.setAttribute("data-sort-type",b&&"string"==typeof b&&k[b]?b:""),f&&e.splice(0,1),e=utils.sort(e,function(c,d){var e;return e=b&&"function"==typeof b?b.call(this,c.cells[a],d.cells[a]):b&&"number"==typeof b?1:b&&"string"==typeof b&&k[b]?k[b].call(this,c.cells[a],d.cells[a]):k.orderbyasc.call(this,c.cells[a],d.cells[a])});for(var l=c.ownerDocument.createDocumentFragment(),m=0,i=e.length;m<i;m++)l.appendChild(e[m]);var n=c.getElementsByTagName("tbody")[0];g?n.insertBefore(l,d[g-h.endRowIndex+h.beginRowIndex-1]):n.appendChild(l)},UE.plugins.tablesort=function(){var a=this,b=UE.UETable,c=function(a){return b.getUETable(a)},d=function(a){return b.getTableItemsByRange(a)};a.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("+a.options.themePath+a.options.theme+"/images/sortable.png);}",a.document),a.addListener("afterexeccommand",function(a,b){"mergeright"!=b&&"mergedown"!=b&&"mergecells"!=b||this.execCommand("disablesort")})}),UE.commands.sorttable={queryCommandState:function(){var a=this,b=d(a);if(!b.cell)return-1;for(var c,e=b.table,f=e.getElementsByTagName("td"),g=0;c=f[g++];)if(1!=c.rowSpan||1!=c.colSpan)return-1;return 0},execCommand:function(a,b){var e=this,f=e.selection.getRange(),g=f.createBookmark(!0),h=d(e),i=h.cell,j=c(h.table),k=j.getCellInfo(i);j.sortTable(k.cellIndex,b),f.moveToBookmark(g);try{f.select()}catch(l){}}},UE.commands.enablesort=UE.commands.disablesort={queryCommandState:function(a){var b=d(this).table;if(b&&"enablesort"==a)for(var c=domUtils.getElementsByTagName(b,"th td"),e=0;e<c.length;e++)if(c[e].getAttribute("colspan")>1||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?'<iframe class="edui-faked-webapp" title="'+a.title+'" '+(a.align&&!a.cssfloat?'align="'+a.align+'"':"")+(a.cssfloat?'style="float:'+a.cssfloat+'"':"")+'width="'+a.width+'" height="'+a.height+'"  scrolling="no" frameborder="0" src="'+a.url+'" logo_url = "'+a.logo+'"></iframe>':'<img title="'+a.title+'" width="'+a.width+'" height="'+a.height+'" src="'+b.options.UEDITOR_HOME_URL+'themes/default/images/spacer.gif" _logo_url="'+a.logo+'" style="background:url('+a.logo+') no-repeat center center; border:1px solid gray;" class="edui-faked-webapp" _url="'+a.url+'" '+(a.align&&!a.cssfloat?'align="'+a.align+'"':"")+(a.cssfloat?'style="float:'+a.cssfloat+'"':"")+"/>"}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?'<embed type="application/x-shockwave-flash" class="edui-faked-music" pluginspage="http://www.macromedia.com/go/getflashplayer" src="'+a+'" width="'+c+'" height="'+d+'" '+(e&&!f?'align="'+e+'"':"")+(f?'style="float:'+f+'"':"")+' wmode="transparent" play="true" loop="false" menu="false" allowscriptaccess="never" allowfullscreen="true" >':"<img "+(e&&!f?'align="'+e+'"':"")+(f?'style="float:'+f+'"':"")+' width="'+c+'" height="'+d+'" _url="'+a+'" class="edui-faked-music" src="'+b.options.langPath+b.options.lang+'/images/music.png" />'}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='<img class="loadingclass" id="'+m+'" src="'+k.options.themePath+k.options.theme+'/images/spacer.gif" title="'+(k.getLang("autoupload.loading")||"")+'" >',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='<p><img class="loadingclass" id="'+m+'" src="'+k.options.themePath+k.options.theme+'/images/spacer.gif" title="'+(k.getLang("autoupload.loading")||"")+'" ></p>',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-c<d)){if(!a.hasContents())return void(e&&b.removePreferences(e));c=new Date,a._saveFlag=null,f=b.body.innerHTML,a.fireEvent("beforeautosave",{content:f})!==!1&&(b.setPreferences(e,f),a.fireEvent("afterautosave",{content:f}))}}var b=this,c=new Date,d=20,e=null;return{defaultOptions:{saveInterval:500},bindEvents:{ready:function(){var a="-drafts-data",c=null;c=b.key?b.key+a:(b.container.parentNode.id||"ue-common")+a,e=(location.protocol+location.host+location.pathname).replace(/[.:\/]/g,"_")+c},contentchange:function(){e&&(b._saveFlag&&window.clearTimeout(b._saveFlag),b.options.saveInterval>0?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)||"<p>"+domUtils.fillHtml+"</p>",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<a.length;d++){if(!c.childNodes)return null;c=c.childNodes[a[d]]}return c}var d=this;return{bindMultiEvents:{type:"aftersetcontent afterscencerestore",handler:function(){d.fireEvent("updateSections")}},bindEvents:{ready:function(){d.fireEvent("updateSections"),domUtils.on(d.body,"drop paste",function(){d.fireEvent("updateSections")})},afterexeccommand:function(a,b){"paragraph"==b&&d.fireEvent("updateSections")},keyup:function(a,b){var c=this,d=c.selection.getRange();if(1!=d.collapsed)c.fireEvent("updateSections");else{var e=b.keyCode||b.which;13!=e&&8!=e&&46!=e||c.fireEvent("updateSections")}}},commands:{getsections:{execCommand:function(a,c){function d(a){for(var b=0;b<f.length;b++)if(f[b](a))return b;return-1}function e(a,c){for(var f,g,i,k=null,l=a.childNodes,m=0,n=l.length;m<n;m++)if(i=l[m],f=d(i),f>=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<f.length;g++)"string"==typeof f[g]?f[g]=function(a){return function(b){return b.tagName==a.toUpperCase()}}(f[g]):"function"!=typeof f[g]&&(f[g]=function(a){return null});var h=this,i=b({level:-1,title:"root"}),j=i;return e(h.body,i),i},notNeedUndo:!0},movesection:{execCommand:function(a,b,d,e){function f(a,b,c){for(var d=!1,e=!1,f=0;f<a.length&&!(f>=c.length);f++){if(c[f]>a[f]){d=!0;break}if(c[f]<a[f])break}for(var f=0;f<b.length&&!(f>=c.length);f++){if(c[f]<a[f]){e=!0;break}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<a.length;c++){if(!b.childNodes)return null;b=b.childNodes[a[c]]}return b}var e=this;if(b){var f,g=d(b.startAddress),h=d(b.endAddress),i=g;if(c)domUtils.remove(i);else for(;i&&domUtils.inDoc(h,e.document)&&!(domUtils.getPosition(i,h)&domUtils.POSITION_FOLLOWING);)f=i.nextSibling,domUtils.remove(i),i=f;e.fireEvent("updateSections")}}},selectsection:{execCommand:function(a,b){if(!b&&!b.dom)return!1;var c=this,d=c.selection.getRange(),e={startAddress:utils.clone(b.startAddress,[]),endAddress:utils.clone(b.endAddress,[])};return e.endAddress[e.endAddress.length-1]++,d.moveToAddress(e).select().scrollToView(),!0},notNeedUndo:!0},scrolltosection:{execCommand:function(a,b){if(!b&&!b.dom)return!1;var c=this,d=c.selection.getRange(),e={startAddress:b.startAddress,endAddress:b.endAddress};return e.endAddress[e.endAddress.length-1]++,d.moveToAddress(e).scrollToView(),!0},notNeedUndo:!0}}}}),UE.plugin.register("simpleupload",function(){function a(){var a=b.offsetWidth||20,e=b.offsetHeight||20,f=document.createElement("iframe"),g="display:block;width:"+a+"px;height:"+e+"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(f,"load",function(){var b,h,i,j=(+new Date).toString(36);h=f.contentDocument||f.contentWindow.document,i=h.body,b=h.createElement("div"),b.innerHTML='<form id="edui_form_'+j+'" target="edui_iframe_'+j+'" method="POST" enctype="multipart/form-data" action="'+c.getOpt("serverUrl")+'" style="'+g+'"><input id="edui_input_'+j+'" type="file" accept="image/*" name="'+c.options.imageFieldName+'" style="'+g+'"></form><iframe id="edui_iframe_'+j+'" name="edui_iframe_'+j+'" style="display:none;width:0;height:0;border:0;margin:0;padding:0;position:absolute;"></iframe>',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",'<img class="loadingclass" id="'+d+'" src="'+c.options.themePath+c.options.theme+'/images/spacer.gif" title="'+(c.getLang("simpleupload.loading")||"")+'" >'),!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<d.length;e++)f=d[e],g=k+a(f.url),h=f.title||f.url.substr(f.url.lastIndexOf("/")+1),i+='<p style="line-height: 16px;"><img style="vertical-align: middle; margin-right: 2px;" src="'+g+'" _src="'+g+'" /><a style="font-size:12px; color:#0066cc;" href="'+f.url+'" title="'+h+'">'+h+"</a></p>";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.childNodes.length;b++)1==a.childNodes[b].nodeType&&i.makeUnselectable(a.childNodes[b])}else void 0!==a.style.MozUserSelect?a.style.MozUserSelect="none":void 0!==a.style.WebkitUserSelect?a.style.WebkitUserSelect="none":void 0!==a.style.KhtmlUserSelect&&(a.style.KhtmlUserSelect="none")}}}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.EventBase,d=baidu.editor.ui.UIBase=function(){};d.prototype={className:"",uiName:"",initOptions:function(a){var c=this;for(var d in a)c[d]=a[d];this.id=this.id||"edui"+b.uid()},initUIBase:function(){this._globalKey=a.unhtml(b.setGlobal(this.id,this))},render:function(a){for(var c,d=this.renderHtml(),e=b.createElementByHtml(d),f=domUtils.getElementsByTagName(e,"*"),g="edui-"+(this.theme||this.editor.options.theme),h=document.getElementById("edui_fixedlayer"),i=0;c=f[i++];)domUtils.addClass(c,g);domUtils.addClass(e,g),h&&(h.className="",domUtils.addClass(h,g));var j=this.getDom();null!=j?(j.parentNode.replaceChild(e,j),b.copyAttributes(e,j)):("string"==typeof a&&(a=document.getElementById(a)),a=a||b.getFixedLayer(),domUtils.addClass(a,g),a.appendChild(e)),this.postRender()},getDom:function(a){return a?document.getElementById(this.id+"_"+a):document.getElementById(this.id)},postRender:function(){this.fireEvent("postrender")},getHtmlTpl:function(){return""},formatHtml:function(a){var b="edui-"+this.uiName;return a.replace(/##/g,this.id).replace(/%%-/g,this.uiName?b+"-":"").replace(/%%/g,(this.uiName?b:"")+" "+this.className).replace(/\$\$/g,this._globalKey)},renderHtml:function(){return this.formatHtml(this.getHtmlTpl())},dispose:function(){var a=this.getDom();a&&baidu.editor.dom.domUtils.remove(a),b.unsetGlobal(this.id)}},a.inherits(d,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Separator=function(a){this.initOptions(a),this.initSeparator()};c.prototype={uiName:"separator",initSeparator:function(){this.initUIBase()},getHtmlTpl:function(){return'<div id="##" class="edui-box %%"></div>'}},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'<div id="##" class="edui-mask %%" onclick="return $$._onClick(event, this);" onmousedown="return $$._onMouseDown(event, this);"></div>'},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<g.length;c++){var d=g[c];if(!d.isHidden()&&d.queryAutoHide(b)!==!1){if(a&&/scroll/gi.test(a.type)&&"edui-wordpastepop"==d.className)return;d.hide()}}g.length&&d.editor.fireEvent("afterhidepop")}var b=baidu.editor.utils,c=baidu.editor.ui.uiUtils,d=baidu.editor.dom.domUtils,e=baidu.editor.ui.UIBase,f=baidu.editor.ui.Popup=function(a){this.initOptions(a),this.initPopup()},g=[];f.postHide=a;var h=["edui-anchor-topleft","edui-anchor-topright","edui-anchor-bottomleft","edui-anchor-bottomright"];f.prototype={SHADOW_RADIUS:5,content:null,_hidden:!1,autoRender:!0,canSideLeft:!0,canSideUp:!0,initPopup:function(){this.initUIBase(),g.push(this)},getHtmlTpl:function(){return'<div id="##" class="edui-popup %%" onmousedown="return false;"> <div id="##_body" class="edui-popup-body"> <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe> <div class="edui-shadow"></div> <div id="##_content" class="edui-popup-content">'+this.getContentHtmlTpl()+"  </div> </div></div>"},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='<div id="##" class="edui-colorpicker %%"><div class="edui-colorpicker-topbar edui-clearfix"><div unselectable="on" id="##_preview" class="edui-colorpicker-preview"></div><div unselectable="on" class="edui-colorpicker-nocolor" onclick="$$._onPickNoColor(event, this);">'+a+'</div></div><table  class="edui-box" style="border-collapse: collapse;" onmouseover="$$._onTableOver(event, this);" onmouseout="$$._onTableOut(event, this);" onclick="return $$._onTableClick(event, this);" cellspacing="0" cellpadding="0"><tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;padding-top: 2px"><td colspan="10">'+b.getLang("themeColor")+'</td> </tr><tr class="edui-colorpicker-tablefirstrow" >',d=0;d<e.length;d++)d&&d%10===0&&(c+="</tr>"+(60==d?'<tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;"><td colspan="10">'+b.getLang("standardColor")+"</td></tr>":"")+"<tr"+(60==d?' class="edui-colorpicker-tablefirstrow"':"")+">"),c+=d<70?'<td style="padding: 0 2px;"><a hidefocus title="'+e[d]+'" onclick="return false;" href="javascript:" unselectable="on" class="edui-box edui-colorpicker-colorcell" data-color="#'+e[d]+'" style="background-color:#'+e[d]+";border:solid #ccc;"+(d<10||d>=60?"border-width:1px;":d>=10&&d<20?"border-width:1px 1px 0 1px;":"border-width:0 1px 0 1px;")+'"></a></td>':"";return c+="</tr></table></div>"}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'<div id="##" class="edui-tablepicker %%"><div class="edui-tablepicker-body"><div class="edui-infoarea"><span id="##_label" class="edui-label"></span></div><div class="edui-pickarea" onmousemove="$$._onMouseMove(event, this);" onmouseover="$$._onMouseOver(event, this);" onmouseout="$$._onMouseOut(event, this);" onclick="$$._onClick(event, this);"><div id="##_overlay" class="edui-overlay"></div></div></div></div>'},_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'<div id="##" class="edui-box %%"><div id="##_state" stateful><div class="%%-wrap"><div id="##_body" unselectable="on" '+(this.title?'title="'+this.title+'"':"")+' class="%%-body" onmousedown="return $$._onMouseDown(event, this);" onclick="return $$._onClick(event, this);">'+(this.showIcon?'<div class="edui-box edui-icon"></div>':"")+(this.showText?'<div class="edui-box edui-label">'+this.label+"</div>":"")+"</div></div></div></div>"},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('<div id="'+this.popup.id+'_bordereraser" class="edui-bordereraser edui-background" style="width:'+(b.getClientRect(this.getDom()).width+20)+'px"></div>')),c.getDom().className+=" "+this.className},this)),this.popup=c)},_onPopupShow:function(){this.addState("opened")},_onPopupHide:function(){this.removeState("opened")},getHtmlTpl:function(){return'<div id="##" class="edui-box %%"><div '+(this.title?'title="'+this.title+'"':"")+' id="##_state" stateful><div class="%%-body"><div id="##_button_body" class="edui-box edui-button-body" onclick="$$._onButtonClick(event, this);"><div class="edui-box edui-icon"></div></div><div class="edui-box edui-splitborder"></div><div class="edui-box edui-arrow" onclick="$$._onArrowClick();"></div></div></div></div>'},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('<div id="'+this.id+'_colorlump" class="edui-colorlump"></div>')),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'<div id="##" class="edui-autotypesetpicker %%"><div class="edui-autotypesetpicker-body"><table ><tr><td nowrap><input type="checkbox" name="mergeEmptyline" '+(b.mergeEmptyline?"checked":"")+">"+c.mergeLine+'</td><td colspan="2"><input type="checkbox" name="removeEmptyline" '+(b.removeEmptyline?"checked":"")+">"+c.delLine+'</td></tr><tr><td nowrap><input type="checkbox" name="removeClass" '+(b.removeClass?"checked":"")+">"+c.removeFormat+'</td><td colspan="2"><input type="checkbox" name="indent" '+(b.indent?"checked":"")+">"+c.indent+'</td></tr><tr><td nowrap><input type="checkbox" name="textAlign" '+(b.textAlign?"checked":"")+">"+c.alignment+'</td><td colspan="2" id="'+d+'"><input type="radio" name="'+d+'" value="left" '+(b.textAlign&&"left"==b.textAlign?"checked":"")+">"+a.getLang("justifyleft")+'<input type="radio" name="'+d+'" value="center" '+(b.textAlign&&"center"==b.textAlign?"checked":"")+">"+a.getLang("justifycenter")+'<input type="radio" name="'+d+'" value="right" '+(b.textAlign&&"right"==b.textAlign?"checked":"")+">"+a.getLang("justifyright")+'</td></tr><tr><td nowrap><input type="checkbox" name="imageBlockLine" '+(b.imageBlockLine?"checked":"")+">"+c.imageFloat+'</td><td nowrap id="'+e+'"><input type="radio" name="'+e+'" value="none" '+(b.imageBlockLine&&"none"==b.imageBlockLine?"checked":"")+">"+a.getLang("default")+'<input type="radio" name="'+e+'" value="left" '+(b.imageBlockLine&&"left"==b.imageBlockLine?"checked":"")+">"+a.getLang("justifyleft")+'<input type="radio" name="'+e+'" value="center" '+(b.imageBlockLine&&"center"==b.imageBlockLine?"checked":"")+">"+a.getLang("justifycenter")+'<input type="radio" name="'+e+'" value="right" '+(b.imageBlockLine&&"right"==b.imageBlockLine?"checked":"")+">"+a.getLang("justifyright")+'</td></tr><tr><td nowrap><input type="checkbox" name="clearFontSize" '+(b.clearFontSize?"checked":"")+">"+c.removeFontsize+'</td><td colspan="2"><input type="checkbox" name="clearFontFamily" '+(b.clearFontFamily?"checked":"")+">"+c.removeFontFamily+'</td></tr><tr><td nowrap colspan="3"><input type="checkbox" name="removeEmptyNode" '+(b.removeEmptyNode?"checked":"")+">"+c.removeHtml+'</td></tr><tr><td nowrap colspan="3"><input type="checkbox" name="pasteFilter" '+(b.pasteFilter?"checked":"")+">"+c.pasteFilter+'</td></tr><tr><td nowrap><input type="checkbox" name="symbolConver" '+(b.bdc2sb||b.tobdc?"checked":"")+">"+c.symbol+'</td><td id="'+f+'"><input type="radio" name="bdc" value="bdc2sb" '+(b.bdc2sb?"checked":"")+">"+c.bdc2sb+'<input type="radio" name="bdc" value="tobdc" '+(b.tobdc?"checked":"")+">"+c.tobdc+'</td><td nowrap align="right"><button >'+c.run+"</button></td></tr></table></div></div>"},_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<i.length;k++)g?i[k].value==j[e.name]&&(i[k].checked="checked"):i[k].checked=!1;if(e.name=="imageBlockLineValue"+f||e.name=="textAlignValue"+f||"bdc"==e.name){var l=e.parentNode.previousSibling.getElementsByTagName("input");l&&(l[0].checked=!0)}a(c)}}),e=1}}),this.initSplitButton()}},b.inherits(f,e)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Popup,c=baidu.editor.ui.Stateful,d=baidu.editor.ui.UIBase,e=baidu.editor.ui.CellAlignPicker=function(a){this.initOptions(a),this.initSelected(),this.initCellAlignPicker()};e.prototype={initSelected:function(){var a={valign:{top:0,middle:1,bottom:2},align:{left:0,center:1,right:2},count:3};this.selected&&(this.selectedIndex=a.valign[this.selected.valign]*a.count+a.align[this.selected.align])},initCellAlignPicker:function(){this.initUIBase(),this.Stateful_init()},getHtmlTpl:function(){for(var a=["left","center","right"],b=9,c=null,d=-1,e=[],f=0;f<b;f++)c=this.selectedIndex===f?' class="edui-cellalign-selected" ':"",d=f%3,0===d&&e.push("<tr>"),e.push('<td index="'+f+'" '+c+' stateful><div class="edui-icon edui-'+a[d]+'"></div></td>'),2===d&&e.push("</tr>");return'<div id="##" class="edui-cellalignpicker %%"><div class="edui-cellalignpicker-body"><table onclick="$$._onClick(event);">'+e.join("")+"</table></div></div>"},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'<div class="edui-pasteicon" onclick="$$._onClick(this)"></div><div class="edui-pastecontainer"><div class="edui-title">'+this.editor.getLang("pasteOpt")+'</div><div class="edui-button"><div title="'+this.editor.getLang("pasteSourceFormat")+'" onclick="$$.format(false)" stateful><div class="edui-richtxticon"></div></div><div title="'+this.editor.getLang("tagFormat")+'" onclick="$$.format(2)" stateful><div class="edui-tagicon"></div></div><div title="'+this.editor.getLang("pasteTextFormat")+'" onclick="$$.format(true)" stateful><div class="edui-plaintxticon"></div></div></div></div></div>'},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<this.items.length;b++)a[b]=this.items[b].renderHtml();return'<div id="##" class="edui-toolbar %%" onselectstart="return false;" onmousedown="return $$._onMouseDown(event, this);">'+a.join("")+"</div>"},postRender:function(){for(var a=this.getDom(),c=0;c<this.items.length;c++)this.items[c].postRender();b.makeUnselectable(a)},_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}},a.inherits(d,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.ui.Popup,f=baidu.editor.ui.Stateful,g=baidu.editor.ui.CellAlignPicker,h=baidu.editor.ui.Menu=function(a){this.initOptions(a),this.initMenu()},i={renderHtml:function(){return'<div class="edui-menuitem edui-menuseparator"><div class="edui-menuseparator-inner"></div></div>'},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<this.items.length;a++){var b=this.items[a];"-"==b?this.items[a]=this.getSeparator():b instanceof j||(b.editor=this.editor,b.theme=this.editor.options.theme,this.items[a]=this.createItem(b))}},getSeparator:function(){return i},createItem:function(a){return a.menu=this,new j(a)},_Popup_getContentHtmlTpl:e.prototype.getContentHtmlTpl,getContentHtmlTpl:function(){if(0==this.items.length)return this._Popup_getContentHtmlTpl();for(var a=[],b=0;b<this.items.length;b++){var c=this.items[b];a[b]=c.renderHtml()}return'<div class="%%-body">'+a.join("")+"</div>"},_Popup_postRender:e.prototype.postRender,postRender:function(){for(var a=this,d=0;d<this.items.length;d++){var e=this.items[d];e.ownerMenu=this,e.postRender()}b.on(this.getDom(),"mouseover",function(b){b=b||event;var d=b.relatedTarget||b.fromElement,e=a.getDom();c.contains(e,d)||e===d||a.fireEvent("over")}),this._Popup_postRender()},queryAutoHide:function(a){if(a){if(c.contains(this.getDom(),a))return!1;for(var b=0;b<this.items.length;b++){var d=this.items[b];if(d.queryAutoHide(a)===!1)return!1}}},clearItems:function(){for(var a=0;a<this.items.length;a++){var b=this.items[a];clearTimeout(b._showingTimer),clearTimeout(b._closingTimer),b.subMenu&&b.subMenu.destroy()}this.items=[]},destroy:function(){this.getDom()&&b.remove(this.getDom()),this.clearItems()},dispose:function(){this.destroy()}},a.inherits(h,e);var j=baidu.editor.ui.MenuItem=function(a){if(this.initOptions(a),this.initUIBase(),this.Stateful_init(),this.subMenu&&!(this.subMenu instanceof h))if(a.className&&a.className.indexOf("aligntd")!=-1){var c=this;this.subMenu.selected=this.editor.queryCommandValue("cellalignment"),this.subMenu=new e({content:new g(this.subMenu),parentMenu:c,editor:c.editor,destroy:function(){this.getDom()&&b.remove(this.getDom())}}),this.subMenu.addListener("postRenderAfter",function(){b.on(this.getDom(),"mouseover",function(){c.addState("opened")})})}else this.subMenu=new h(this.subMenu)};j.prototype={label:"",subMenu:null,ownerMenu:null,uiName:"menuitem",alwalysHoverable:!0,getHtmlTpl:function(){return'<div id="##" class="%%" stateful onclick="$$._onClick(event, this);"><div class="%%-body">'+this.renderLabelHtml()+"</div></div>"},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'<div class="edui-arrow"></div><div class="edui-box edui-icon"></div><div class="edui-box edui-label %%-label">'+(this.label||"")+"</div>"},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;b<this.items.length;b++){var d=this.items[b];d.uiName="listitem",d.index=b,d.onclick=function(){a.selectByIndex(this.index)}}this.popup=new c({items:this.items,uiName:"list",editor:this.editor,captureWheel:!0,combox:this}),this.initSplitButton()},_SplitButton_postRender:d.prototype.postRender,postRender:function(){this._SplitButton_postRender(),this.setLabel(this.label||""),this.setValue(this.initValue||"")},showPopup:function(){var a=b.getClientRect(this.getDom());a.top+=1,a.bottom-=1,a.height-=2,this.popup.showAnchorRect(a)},getValue:function(){return this.value},setValue:function(a){var b=this.indexByValue(a);b!=-1?(this.selectedIndex=b,this.setLabel(this.items[b].label),this.value=this.items[b].value):(this.selectedIndex=-1,this.setLabel(this.getLabelForUnknowValue(a)),this.value=a)},setLabel:function(a){this.getDom("button_body").innerHTML=a,this.label=a},getLabelForUnknowValue:function(a){return a},indexByValue:function(a){for(var b=0;b<this.items.length;b++)if(a==this.items[b].value)return b;return-1},getItem:function(a){return this.items[a]},selectByIndex:function(a){a<this.items.length&&this.fireEvent("select",a)!==!1&&(this.selectedIndex=a,this.value=this.items[a].value,this.setLabel(this.items[a].label))}},a.inherits(e,d)}(),function(){var a,b,c,d=baidu.editor.utils,e=baidu.editor.dom.domUtils,f=baidu.editor.ui.uiUtils,g=baidu.editor.ui.Mask,h=baidu.editor.ui.UIBase,i=baidu.editor.ui.Button,j=baidu.editor.ui.Dialog=function(a){if(a.name){var b=a.name,c=a.cssRules;a.className||(a.className="edui-for-"+b),c&&(a.cssRules=".edui-default .edui-for-"+b+" .edui-dialog-content  {"+c+"}")}this.initOptions(d.extend({autoReset:!0,draggable:!0,onok:function(){},oncancel:function(){},onclose:function(a,b){return b?this.onok():this.oncancel()},holdScroll:!1},a)),this.initDialog()};j.prototype={draggable:!1,uiName:"dialog",initDialog:function(){var e=this,f=this.editor.options.theme;if(this.cssRules&&d.cssRule("edui-customize-"+this.name+"-style",this.cssRules),this.initUIBase(),this.modalMask=a||(a=new g({className:"edui-dialog-modalmask",theme:f,onclick:function(){c&&c.close(!1)}})),this.dragMask=b||(b=new g({className:"edui-dialog-dragmask",theme:f})),this.closeButton=new i({className:"edui-dialog-closebutton",title:e.closeDialog,theme:f,onclick:function(){e.close(!1)}}),this.fullscreen&&this.initResizeEvent(),this.buttons)for(var h=0;h<this.buttons.length;h++)this.buttons[h]instanceof i||(this.buttons[h]=new i(d.extend(this.buttons[h],{editor:this.editor},!0)))},initResizeEvent:function(){var a=this;e.on(window,"resize",function(){a._hidden||void 0===a._hidden||(a.__resizeTimer&&window.clearTimeout(a.__resizeTimer),a.__resizeTimer=window.setTimeout(function(){a.__resizeTimer=null;var b=a.getDom(),c=a.getDom("content"),d=UE.ui.uiUtils.getClientRect(b),e=UE.ui.uiUtils.getClientRect(c),g=f.getViewportRect();c.style.width=g.width-d.width+e.width+"px",c.style.height=g.height-d.height+e.height+"px",b.style.width=g.width+"px",b.style.height=g.height+"px",a.fireEvent("resize")},100))})},fitSize:function(){var a=this.getDom("body"),b=this.mesureSize();return a.style.width=b.width+"px",a.style.height=b.height+"px",b},safeSetOffset:function(a){var b=this,c=b.getDom(),d=f.getViewportRect(),e=f.getClientRect(c),g=a.left;g+e.width>d.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='<span id="'+this.id+'_contmask" class="dialogcontmask"></span><iframe id="'+this.id+'_iframe" class="%%-iframe" height="100%" width="100%" frameborder="0" src="'+this.iframeUrl+'"></iframe>'),a},getHtmlTpl:function(){var a="";if(this.buttons){for(var b=[],c=0;c<this.buttons.length;c++)b[c]=this.buttons[c].renderHtml();a='<div class="%%-foot"><div id="##_buttons" class="%%-buttons">'+b.join("")+"</div></div>"}return'<div id="##" class="%%"><div '+(this.fullscreen?'class="%%-wrap edui-dialog-fullscreen-flag"':'class="%%"')+'><div id="##_body" class="%%-body"><div class="%%-shadow"></div><div id="##_titlebar" class="%%-titlebar"><div class="%%-draghandle" onmousedown="$$._onTitlebarMouseDown(event, this);"><span class="%%-caption">'+(this.title||"")+"</span></div>"+this.closeButton.renderHtml()+'</div><div id="##_content" class="%%-content">'+(this.autoReset?"":this.getContentHtml())+"</div>"+a+"</div></div></div>"},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<this.buttons.length;b++)this.buttons[b].postRender();e.on(window,"resize",function(){setTimeout(function(){a.isHidden()||a.safeSetOffset(f.getClientRect(a.getDom()))})}),this._hide()},mesureSize:function(){var a=this.getDom("body"),b=f.getClientRect(this.getDom("content")).width,c=a.style;return c.width=b,f.getClientRect(a)},_onTitlebarMouseDown:function(a,b){if(this.draggable){var c,d=(f.getViewportRect(),this);f.startDrag(a,{ondragstart:function(){c=f.getClientRect(d.getDom()),d.getDom("contmask").style.visibility="visible",d.dragMask.show(d.getDom().style.zIndex-1)},ondragmove:function(a,b){var e=c.left+a,f=c.top+b;d.safeSetOffset({left:e,top:f})},ondragstop:function(){d.getDom("contmask").style.visibility="hidden",e.removeClasses(d.getDom(),["edui-state-centered"]),d.dragMask.hide()}})}},reset:function(){this.getDom("content").innerHTML=this.getContentHtml(),this.fireEvent("dialogafterreset")},_show:function(){this._hidden&&(this.getDom().style.display="",this.editor.container.style.zIndex&&(this.getDom().style.zIndex=1*this.editor.container.style.zIndex+10),this._hidden=!1,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 a=this.getDom();a.style.display="none",a.style.zIndex="",a.style.width="",a.style.height="",this._hidden=!0,this.fireEvent("hide")}},open:function(){if(this.autoReset)try{this.reset()}catch(a){this.render(),this.open()}if(this.showAtCenter(),this.iframeUrl)try{this.getDom("iframe").focus()}catch(b){}c=this},_onCloseButtonClick:function(a,b){this.close(!1)},close:function(a){if(this.fireEvent("close",a)!==!1){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();var b=this.getDom("content"),c=this.getDom("iframe");if(b&&c){var d=c.contentDocument||c.contentWindow.document;d&&(d.body.innerHTML=""),e.remove(b)}}}},d.inherits(j,h)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Menu,c=baidu.editor.ui.SplitButton,d=baidu.editor.ui.MenuButton=function(a){this.initOptions(a),this.initMenuButton()};d.prototype={initMenuButton:function(){var a=this;this.uiName="menubutton",this.popup=new b({items:a.items,className:a.className,editor:a.editor}),this.popup.addListener("show",function(){for(var b=this,c=0;c<b.items.length;c++)b.items[c].removeState("checked"),b.items[c].value==a._value&&(b.items[c].addState("checked"),this.value=a._value)}),this.initSplitButton()},setValue:function(a){this._value=a}},a.inherits(d,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Popup,c=baidu.editor.ui.SplitButton,d=baidu.editor.ui.MultiMenuPop=function(a){this.initOptions(a),this.initMultiMenu()};d.prototype={initMultiMenu:function(){var a=this;this.popup=new b({content:"",editor:a.editor,iframe_rendered:!1,onshow:function(){this.iframe_rendered||(this.iframe_rendered=!0,this.getDom("content").innerHTML='<iframe id="'+a.id+'_iframe" src="'+a.iframeUrl+'" frameborder="0"></iframe>',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&&k<i?a.setOpacity(e,"1"):k>i&&k<i+70?(a.setOpacity(e,"0.5"),d=!1):k>i+70&&k<i+140&&a.hide(),d&&j>0&&j<h?a.setOpacity(e,"1"):j>h&&j<h+70?a.setOpacity(e,"0.5"):j>h+70&&j<h+140&&a.hide()})}}),browser.chrome&&g.on(c,"mouseout",function(b){var c=b.relatedTarget||b.toElement;null!=c&&"HTML"!=c.tagName||a.hide()}),a.editor.addListener("afterhidepop",function(){a.isHidden||(i=!0)})},initItems:function(){if(f.isArray(this.items))for(var a=0,b=this.items.length;a<b;a++){var d=this.items[a].toLowerCase();c[d]&&(this.items[a]=new c[d](this.editor),this.items[a].className+=" edui-shortcutsubmenu ")}},setOpacity:function(a,b){browser.ie&&browser.version<9?a.style.filter="alpha(opacity = "+100*parseFloat(b)+");":a.style.opacity=b},getSubMenuMark:function(){i=!1;for(var a,b=e.getFixedLayer(),c=g.getElementsByTagName(b,"div",function(a){return g.hasClass(a,"edui-shortcutsubmenu edui-popup")}),d=0;a=c[d++];)"none"!=a.style.display&&(i=!0);return i},show:function(a,b){function c(a){a.left<0&&(a.left=0),a.top<0&&(a.top=0),i.style.cssText="position:absolute;left:"+a.left+"px;top:"+a.top+"px;"}function d(a){a.tagName||(a=a.getDom()),h.left=parseInt(a.style.left),h.top=parseInt(a.style.top),h.top-=i.offsetHeight+15,c(h)}var f=this,h={},i=this.getDom(),j=e.getFixedLayer();if(f.eventType=a.type,i.style.cssText="display:block;left:-9999px","contextmenu"==a.type&&b){var k=g.getElementsByTagName(j,"div","edui-contextmenu")[0];k?d(k):f.editor.addListener("aftershowcontextmenu",function(a,b){d(b)})}else h=e.getViewportOffsetByEvent(a),h.top-=i.offsetHeight+f.SPACE,h.left+=f.SPACE+20,c(h),f.setOpacity(i,.2);f.isHidden=!1,f.left=a.screenX+i.offsetWidth/2-f.SPACE,f.top=a.screenY-i.offsetHeight/2-f.SPACE,f.editor&&(i.style.zIndex=1*f.editor.container.style.zIndex+10,j.style.zIndex=i.style.zIndex-1)},hide:function(){this.getDom()&&(this.getDom().style.display="none"),this.isHidden=!0},postRender:function(){if(f.isArray(this.items))for(var a,b=0;a=this.items[b++];)a.postRender()},getHtmlTpl:function(){var a;if(f.isArray(this.items)){a=[];for(var b=0;b<this.items.length;b++)a[b]=this.items[b].renderHtml();a=a.join("")}else a=this.items;return'<div id="##" class="%% edui-toolbar" data-src="shortcutmenu" onmousedown="return false;" onselectstart="return false;" >'+a+"</div>"}},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"<br/>"}},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'<div id="##" class="edui-message %%"> <div id="##_closer" class="edui-message-closer">×</div> <div id="##_body" class="edui-message-body edui-message-type-info"> <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe> <div class="edui-shadow"></div> <div id="##_content" class="edui-message-content">  </div> </div></div>'},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'<div class="edui-label %%-label" >'+(this.label||"")+"</div>"}})});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'<div class="edui-label %%-label" style="font-family:'+a.unhtml(this.value)+'">'+(this.label||"")+"</div>"}})}(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<c.length;f++){var g=c[f]+"px";e.push({label:g,value:g,theme:a.options.theme,renderLabelHtml:function(){return'<div class="edui-label %%-label" style="line-height:1;font-size:'+this.value+'">'+(this.label||"")+"</div>"}})}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'<div class="edui-label %%-label"><span class="edui-for-'+this.value+'">'+(this.label||"")+"</span></div>"}});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'<div class="edui-label %%-label"><'+c.tag+" "+(c.className?' class="'+c.className+'"':"")+(c.style?' style="'+c.style+'"':"")+">"+c.label+"</"+c.tag+"></div>"}})}(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='<div class="edui-editor-breadcrumb">'+b.getLang("elementPathTip")+":</div>"),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("<nobr>"+b.getLang("property")+': <span onclick=$$._setIframeAlign(-2) class="edui-clickable">'+b.getLang("default")+'</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(-1) class="edui-clickable">'+b.getLang("justifyleft")+'</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(1) class="edui-clickable">'+b.getLang("justifyright")+'</span>&nbsp;&nbsp; <span onclick="$$._updateIframe( this);" class="edui-clickable">'+b.getLang("modify")+"</span></nobr>");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("<nobr>"+b.getLang("property")+': <span onclick=$$._onImgEditButtonClick("anchorDialog") class="edui-clickable">'+b.getLang("modify")+"</span>&nbsp;&nbsp;<span onclick=$$._onRemoveButtonClick('anchor') class=\"edui-clickable\">"+b.getLang("delete")+"</span></nobr>")),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="<nobr>"+b.getLang("property")+': <span onclick=$$._onImgSetFloat("none") class="edui-clickable">'+b.getLang("default")+'</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("left") class="edui-clickable">'+b.getLang("justifyleft")+'</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("right") class="edui-clickable">'+b.getLang("justifyright")+'</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("center") class="edui-clickable">'+b.getLang("justifycenter")+"</span>&nbsp;&nbsp;<span onclick=\"$$._onImgEditButtonClick('"+j+'\');" class="edui-clickable">'+b.getLang("modify")+"</span></nobr>",!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+='<div style="height:5px;"></div>'),d+=h.formatHtml("<nobr>"+b.getLang("anthorMsg")+': <a target="_blank" href="'+k+'" title="'+k+'" >'+m+'</a> <span class="edui-clickable" onclick="$$._onEditButtonClick();">'+b.getLang("modify")+'</span> <span class="edui-clickable" onclick="$$._onRemoveButtonClick(\'unlink\');"> '+b.getLang("clear")+"</span></nobr>"),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<c.length;e++){for(var f=c[e],g=new baidu.editor.ui.Toolbar({theme:a.options.theme}),h=0;h<f.length;h++){var i=f[h],j=null;if("string"==typeof i){if(i=i.toLowerCase(),"|"==i&&(i="Separator"),"||"==i&&(i="Breakline"),baidu.editor.ui[i]&&(j=new baidu.editor.ui[i](a)),"fullscreen"==i){d&&d[0]?d[0].items.splice(0,0,j):j&&g.items.splice(0,0,j);continue}}else j=i;j&&j.id&&g.add(j)}d[e]=g}b.each(UE._customizeUI,function(b,c){var d,e;return(!b.id||b.id==a.key)&&(d=b.execFn.call(a,a,c),void(d&&(e=b.index,void 0===e&&(e=g.items.length),g.add(d,e))))}),this.toolbars=d},getHtmlTpl:function(){return'<div id="##" class="%%"><div id="##_toolbarbox" class="%%-toolbarbox">'+(this.toolbars.length?'<div id="##_toolbarboxouter" class="%%-toolbarboxouter"><div class="%%-toolbarboxinner">'+this.renderToolbarBoxHtml()+"</div></div>":"")+'<div id="##_toolbarmsg" class="%%-toolbarmsg" style="display:none;"><div id = "##_upload_dialog" class="%%-toolbarmsg-upload" onclick="$$.showWordImageDialog();">'+this.editor.getLang("clickToUpload")+'</div><div class="%%-toolbarmsg-close" onclick="$$.hideToolbarMsg();">x</div><div id="##_toolbarmsg_label" class="%%-toolbarmsg-label"></div><div style="height:0;overflow:hidden;clear:both;"></div></div><div id="##_message_holder" class="%%-messageholder"></div></div><div id="##_iframeholder" class="%%-iframeholder"></div><div id="##_bottombar" class="%%-bottomContainer"><table><tr><td id="##_elementpath" class="%%-bottombar"></td><td id="##_wordcount" class="%%-wordcount"></td><td id="##_scale" class="%%-scale"><div class="%%-icon"></div></td></tr></table></div><div id="##_scalelayer"></div></div>'},showWordImageDialog:function(){this._dialogs.wordimageDialog.open()},renderToolbarBoxHtml:function(){for(var a=[],b=0;b<this.toolbars.length;b++)a.push(this.toolbars[b].renderHtml());return a.join("")},setFullScreen:function(a){var b=this.editor,c=b.container.parentNode.parentNode;if(this._fullscreen!=a){if(this._fullscreen=a,this.editor.fireEvent("beforefullscreenchange",a),baidu.editor.browser.gecko)var d=b.selection.getRange().createBookmark();if(a){for(;"BODY"!=c.tagName;){var e=baidu.editor.dom.domUtils.getComputedStyle(c,"position");f.push(e),c.style.position="static",c=c.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=b.iframe.parentNode.offsetWidth,this._bakAutoHeight&&(b.autoHeightEnabled=!1,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,b.iframe.parentNode.style.width="",this._updateFullScreen()}else{for(;"BODY"!=c.tagName;)c.style.position=f.shift(),c=c.parentNode;this.getDom().style.cssText=this._bakCssText,this.getDom("iframeholder").style.cssText=this._bakCssText1,this._bakAutoHeight&&(b.autoHeightEnabled=!0,this.editor.enableAutoHeight()),document.documentElement.style.overflow=this._bakHtmlOverflow,document.body.style.overflow=this._bakBodyOverflow,b.iframe.parentNode.style.width=this._bakEditorContaninerWidth+"px",window.scrollTo(0,this._bakScrollTop)}if(browser.gecko&&"true"===b.body.contentEditable){var g=document.createElement("input");document.body.appendChild(g),b.body.contentEditable=!1,setTimeout(function(){g.focus(),setTimeout(function(){b.body.contentEditable=!0,b.fireEvent("fullscreenchanged",a),b.selection.getRange().moveToBookmark(d).select(!0),baidu.editor.dom.domUtils.remove(g),a&&window.scroll(0,0)},0)},0)}"true"===b.body.contentEditable&&(this.editor.fireEvent("fullscreenchanged",a),this.triggerLayout())}},_updateFullScreen:function(){if(this._fullscreen){var a=c.getViewportRect();if(this.getDom().style.cssText="border:0;position:absolute;left:0;top:"+(this.editor.options.topOffset||0)+"px;width:"+a.width+"px;height:"+a.height+"px;z-index:"+(1*this.getDom().style.zIndex+100),c.setViewportOffset(this.getDom(),{left:0,top:this.editor.options.topOffset||0}),this.editor.setHeight(a.height-this.getDom("toolbarbox").offsetHeight-this.getDom("bottombar").offsetHeight-(this.editor.options.topOffset||0),!0),browser.gecko)try{window.onresize()}catch(b){}}},_updateElementPath:function(){var a,b=this.getDom("elementpath");if(this.elementPathEnabled&&(a=this.editor.queryCommandValue("elementpath"))){for(var c,d=[],e=0;c=a[e];e++)d[e]=this.formatHtml('<span unselectable="on" onclick="$$.editor.execCommand(&quot;elementpath&quot;, &quot;'+e+'&quot;);">'+c+"</span>");b.innerHTML='<div class="edui-editor-breadcrumb" onmousedown="return false;">'+this.editor.getLang("elementPathTip")+": "+d.join(" &gt; ")+"</div>"}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<this.toolbars.length;a++)this.toolbars[a].postRender();var b,c=this,e=baidu.editor.dom.domUtils,f=function(){clearTimeout(b),b=setTimeout(function(){c._updateFullScreen()})};e.on(window,"resize",f),c.addListener("destroy",function(){e.un(window,"resize",f),clearTimeout(b)})},showToolbarMsg:function(a,b){if(this.getDom("toolbarmsg_label").innerHTML=a,this.getDom("toolbarmsg").style.display="",!b){var c=this.getDom("upload_dialog");c.style.display="none"}},hideToolbarMsg:function(){this.getDom("toolbarmsg").style.display="none"},mapUrl:function(a){return a?a.replace("~/",this.editor.options.UEDITOR_HOME_URL||""):""},triggerLayout:function(){var a=this.getDom();"1"==a.style.zoom?a.style.zoom="100%":a.style.zoom="1"}},b.inherits(a,baidu.editor.ui.UIBase);var g={};UE.ui.Editor=function(c){var d=new UE.Editor(c);d.options.editor=d,b.loadFile(document,{href:d.options.themePath+d.options.theme+"/css/ueditor.css",tag:"link",type:"text/css",rel:"stylesheet"});var f=d.render;return d.render=function(c){c.constructor===String&&(d.key=c,g[c]=d),b.domReady(function(){function b(){if(d.setOpt({labelMap:d.options.labelMap||d.getLang("labelMap")}),new a(d.options),c&&(c.constructor===String&&(c=document.getElementById(c)),c&&c.getAttribute("name")&&(d.options.textarea=c.getAttribute("name")),c&&/script|textarea/gi.test(c.tagName))){var b=document.createElement("div");c.parentNode.insertBefore(b,c);var g=c.value||c.innerHTML;d.options.initialContent=/^[\t\r\n ]*$/.test(g)?d.options.initialContent:g.replace(/>[\n\r\t]+([ ]{4})+/g,">").replace(/[\n\r\t]+([ ]{4})+</g,"<").replace(/>[\n\r\t]+</g,"><"),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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.config.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.config.js
new file mode 100644
index 0000000..949ecef
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.config.js
@@ -0,0 +1,512 @@
+/**
+ * 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: Feng.ctxPath + "/config"
+        // , serverUrl: "/config"
+
+        //工具栏上的所有的功能按钮和下拉框,可以在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',  'insertvideo', 'music', 'attachment', 'map',  'insertframe', 'insertcode',  '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(' &nbsp; &nbsp;'),node);
+        //            }
+        //            node.parentNode.removeChild(node,node.innerText())
+        //        }
+        //    }
+        //}()
+ 
+        /*,imageUrl:URL+"http://localhost/viav"
+        ,imagePath:"http://localhost/viav"
+        ,savePath: [ 'Uploads' ]
+        ,imageManagerUrl:URL + "php/imageManager.php"       //图片在线管理的处理地址
+        ,imageManagerPath: ""
+        ,fileUrl:URL+"php/fileUp.php"               //附件上传提交地址
+        ,filePath: ""*/
+ 
+        //图片上传配置区
+        //,imageUrl:Feng.ctxPath + "/KanHu/upload/imageUP"             //图片上传提交地址
+        //,imagePath:""                     //图片修正地址,引用了fixedImagePath,如有特殊需求,可自行配置
+        //,imageFieldName:"upfile"                   //图片数据的key,若此处修改,需要在后台对应文件修改对应参数
+ 
+        //,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 : true
+ 
+        //wordCount
+        //,wordCount:true          //是否开启字数统计
+        //,maximumWords:10000       //允许的最大字符数
+        //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数,留空支持多语言自动切换,否则按此配置显示
+        //,wordCountMsg:''   //当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符
+        //超出字数限制提示  留空支持多语言自动切换,否则按此配置显示
+        //,wordOverFlowMsg:''    //<span style="color:red;">你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存!</span>
+ 
+        //tab
+        //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位
+        //,tabSize:4
+        //,tabNode:'&nbsp;'
+ 
+        //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: {
+            iframe: ['frameborder','border','marginwidth','marginheight','width','height','src','id'],//增加这一行
+            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
+    };
+ 
+})();
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.parse.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.parse.js
new file mode 100644
index 0000000..84421f2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.parse.js
@@ -0,0 +1,1022 @@
+/*!
+ * UEditor
+ * version: ueditor
+ * build: Wed Aug 10 2016 11:06:16 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(' ') + ' ></'+obj.tag+'>');
+                        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 = '&nbsp;';
+
+                }
+            })
+        });
+
+        //表格可排序
+        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/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.parse.min.js b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.parse.min.js
new file mode 100644
index 0000000..9fe9a08
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor.parse.min.js
@@ -0,0 +1,7 @@
+/*!
+ * UEditor
+ * version: ueditor
+ * build: Wed Aug 10 2016 11:06:19 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<e;f++){var g=c[f];for(var h in g)d&&a.hasOwnProperty(h)||(a[h]=g[h])}return a},isIE:a,cssRule:a?function(a,b,c){var d,e;c=c||document,d=c.indexList?c.indexList:c.indexList={};var f;if(d[a])f=c.styleSheets[d[a]];else{if(void 0===b)return"";f=c.createStyleSheet("",e=c.styleSheets.length),d[a]=e}return void 0===b?f.cssText:void(f.cssText=f.cssText+"\n"+(b||""))}:function(a,b,c){c=c||document;var d,e=c.getElementsByTagName("head")[0];if(!(d=c.getElementById(a))){if(void 0===b)return"";d=c.createElement("style"),d.id=a,e.appendChild(d)}return void 0===b?d.innerHTML:void(""!==b?d.innerHTML=d.innerHTML+"\n"+b:e.removeChild(d))},domReady:function(b){var c=window.document;"complete"===c.readyState?b():a?(!function(){if(!c.isReady){try{c.documentElement.doScroll("left")}catch(a){return void setTimeout(arguments.callee,0)}b()}}(),window.attachEvent("onload",function(){b()})):(c.addEventListener("DOMContentLoaded",function(){c.removeEventListener("DOMContentLoaded",arguments.callee,!1),b()},!1),window.addEventListener("load",function(){b()},!1))},each:function(a,b,c){if(null!=a)if(a.length===+a.length){for(var d=0,e=a.length;d<e;d++)if(b.call(c,a[d],d,a)===!1)return!1}else for(var f in a)if(a.hasOwnProperty(f)&&b.call(c,a[f],f,a)===!1)return!1},inArray:function(a,b){var c=-1;return this.each(a,function(a,d){if(a===b)return c=d,!1}),c},pushItem:function(a,b){this.inArray(a,b)==-1&&a.push(b)},trim:function(a){return a.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g,"")},indexOf:function(a,b,c){var d=-1;return c=this.isNumber(c)?c:0,this.each(a,function(a,e){if(e>=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(" ")+" ></"+d.tag+">")}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;d<c.length;d++)if(e.tagName==c[d].toUpperCase())return e;e=e.parentNode}return null}function c(b,c,e){for(var f=b.rows,g=[],h="TH"===f[0].cells[0].tagName,i=0,j=0,k=f.length;j<k;j++)g[j]=f[j];var l={reversecurrent:function(a,b){return 1},orderbyasc:function(a,b){var c=a.innerText||a.textContent,d=b.innerText||b.textContent;return c.localeCompare(d)},reversebyasc:function(a,b){var c=a.innerHTML,d=b.innerHTML;return d.localeCompare(c)},orderbynum:function(b,c){var d=b[a.isIE?"innerText":"textContent"].match(/\d+/),e=c[a.isIE?"innerText":"textContent"].match(/\d+/);return d&&(d=+d[0]),e&&(e=+e[0]),(d||0)-(e||0)},reversebynum:function(b,c){var d=b[a.isIE?"innerText":"textContent"].match(/\d+/),e=c[a.isIE?"innerText":"textContent"].match(/\d+/);return d&&(d=+d[0]),e&&(e=+e[0]),(e||0)-(d||0)}};b.setAttribute("data-sort-type",e&&"string"==typeof e&&l[e]?e:""),h&&g.splice(0,1),g=d(g,function(a,b){var d;return d=e&&"function"==typeof e?e.call(this,a.cells[c],b.cells[c]):e&&"number"==typeof e?1:e&&"string"==typeof e&&l[e]?l[e].call(this,a.cells[c],b.cells[c]):l.orderbyasc.call(this,a.cells[c],b.cells[c])});for(var m=b.ownerDocument.createDocumentFragment(),n=0,k=g.length;n<k;n++)m.appendChild(g[n]);var o=b.getElementsByTagName("tbody")[0];i?o.insertBefore(m,f[i-range.endRowIndex+range.beginRowIndex-1]):o.appendChild(m)}function d(a,b){b=b||function(a,b){return a.localeCompare(b)};for(var c=0,d=a.length;c<d;c++)for(var e=c,f=a.length;e<f;e++)if(b(a[c],a[e])>0){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<b.rows.length;c++)a.removeClass(b.rows[c],"firstRow");a.addClass(b.rows[0],"firstRow")}}var f=this,g=this.root,h=g.getElementsByTagName("table");if(h.length){var i=this.selector;a.cssRule("table",i+" table.noBorderTable td,"+i+" table.noBorderTable th,"+i+" table.noBorderTable caption{border:1px dashed #ddd !important}"+i+" table.sortEnabled tr.firstRow th,"+i+" 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);}"+i+" table.sortEnabled tr.firstRow th:hover,"+i+" table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}"+i+" table{margin-bottom:10px;border-collapse:collapse;display:table;}"+i+" td,"+i+" th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}"+i+" caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}"+i+" th{border-top:1px solid #BBB;background:#F7F7F7;}"+i+" table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}"+i+" tr.ue-table-interlace-color-single td{ background: #fcfcfc; }"+i+" tr.ue-table-interlace-color-double td{ background: #f7faff; }"+i+" td p{margin:0;padding:0;}",document),a.each("td th caption".split(" "),function(b){var c=g.getElementsByTagName(b);c.length&&a.each(c,function(a){a.firstChild||(a.innerHTML="&nbsp;")})});var h=g.getElementsByTagName("table");a.each(h,function(d){/\bsortEnabled\b/.test(d.className)&&a.on(d,"click",function(d){var g=d.target||d.srcElement,h=b(g,["td","th"]),i=b(g,"table"),j=a.indexOf(i.rows[0].cells,h),k=i.getAttribute("data-sort-type");j!=-1&&(c(i,j,f.tableSortCompareFn||k),e(i))})})}}),UE.parse.register("charts",function(a){function b(){return n?c(n):null}function c(a){for(var b,c=[],e=a.getElementsByTagName("table"),f=0;b=e[f];f++)null!==b.getAttribute("data-chart")&&c.push(d(b));return c.length?c:null}function d(a){for(var b,c=a.getAttribute("data-chart"),d={},e=[],f=0;b=a.rows[f];f++){for(var g,h=[],i=0;g=b.cells[i];i++){var j=g.innerText||g.textContent||"";h.push("TH"==g.tagName?j:0|j)}e.push(h)}c=c.split(";");for(var k,f=0;k=c[f];f++)k=k.split(":"),d[k[0]]=k[1];return{table:a,meta:d,data:e}}function e(){f()}function f(){window.jQuery?g():a.loadFile(document,{src:m+"/third-party/jquery-1.10.2.min.js",tag:"script",type:"text/javascript",defer:"defer"},function(){g()})}function g(){window.Highcharts?h():a.loadFile(document,{src:m+"/third-party/highcharts/highcharts.js",tag:"script",type:"text/javascript",defer:"defer"},function(){h()})}function h(){a.loadFile(document,{src:m+"/dialogs/charts/chart.config.js",tag:"script",type:"text/javascript",defer:"defer"},function(){i()})}function i(){for(var a=null,b=null,c=null,d=0,e=o.length;d<e;d++)a=o[d],b=l(a),c=k(a.table),j(c,typeConfig[a.meta.chartType],b)}function j(a,b,c){$(a).highcharts($.extend({},b,{credits:{enabled:!1},exporting:{enabled:!1},title:{text:c.title,x:-20},subtitle:{text:c.subTitle,x:-20},xAxis:{title:{text:c.xTitle},categories:c.categories},yAxis:{title:{text:c.yTitle},plotLines:[{value:0,width:1,color:"#808080"}]},tooltip:{enabled:!0,valueSuffix:c.suffix},legend:{layout:"vertical",align:"right",verticalAlign:"middle",borderWidth:1},series:c.series}))}function k(a){var b=document.createElement("div");return b.className="edui-chart-container",a.parentNode.replaceChild(b,a),b}function l(a){var b=[],c=[],d=[],e=a.data,f=a.meta;if("1"!=f.dataFormat){for(var g=0,h=e.length;g<h;g++)for(var i=0,j=e[g].length;i<j;i++)d[i]||(d[i]=[]),d[i][g]=e[g][i];e=d}if(d={},f.chartType!=typeConfig.length-1){c=e[0].slice(1);for(var k,g=1;k=e[g];g++)b.push({name:k[0],data:k.slice(1)});d.series=b,d.categories=c,d.title=f.title,d.subTitle=f.subTitle,d.xTitle=f.xTitle,d.yTitle=f.yTitle,d.suffix=f.suffix}else{for(var k=[],g=1,h=e[0].length;g<h;g++)k.push([e[0][g],0|e[1][g]]);b[0]={type:"pie",name:f.tip,data:k},d.series=b,d.title=f.title,d.suffix=f.suffix}return d}a.cssRule("chartsContainerHeight",".edui-chart-container { height:"+(this.chartContainerHeight||300)+"px}");var m=this.rootPath,n=this.root,o=null;m&&(o=b())&&e()}),UE.parse.register("background",function(a){for(var b,c,d=this,e=d.root,f=e.getElementsByTagName("p"),g=0;c=f[g++];)b=c.getAttribute("data-background"),b&&c.parentNode.removeChild(c);b&&a.cssRule("ueditor_background",d.selector+"{"+b+"}",document)}),UE.parse.register("list",function(a){function b(b){var e=this;a.each(b,function(b){if(b.className&&/custom_/i.test(b.className)){var f=b.className.match(/custom_(\w+)/)[1];if("dash"==f||"dot"==f)a.pushItem(c,h+" li.list-"+d[f]+"{background-image:url("+e.liiconpath+d[f]+".gif)}"),a.pushItem(c,h+" ul.custom_"+f+"{list-style:none;} "+h+" ul.custom_"+f+" li{background-position:0 3px;background-repeat:no-repeat}");else{var g=1;a.each(b.childNodes,function(b){"LI"==b.tagName&&(a.pushItem(c,h+" li.list-"+d[f]+g+"{background-image:url("+e.liiconpath+"list-"+d[f]+g+".gif)}"),g++)}),a.pushItem(c,h+" ol.custom_"+f+"{list-style:none;}"+h+" ol.custom_"+f+" li{background-position:0 3px;background-repeat:no-repeat}")}switch(f){case"cn":a.pushItem(c,h+" li.list-"+f+"-paddingleft-1{padding-left:25px}"),a.pushItem(c,h+" li.list-"+f+"-paddingleft-2{padding-left:40px}"),a.pushItem(c,h+" li.list-"+f+"-paddingleft-3{padding-left:55px}");break;case"cn1":a.pushItem(c,h+" li.list-"+f+"-paddingleft-1{padding-left:30px}"),a.pushItem(c,h+" li.list-"+f+"-paddingleft-2{padding-left:40px}"),a.pushItem(c,h+" li.list-"+f+"-paddingleft-3{padding-left:55px}");break;case"cn2":a.pushItem(c,h+" li.list-"+f+"-paddingleft-1{padding-left:40px}"),a.pushItem(c,h+" li.list-"+f+"-paddingleft-2{padding-left:55px}"),a.pushItem(c,h+" li.list-"+f+"-paddingleft-3{padding-left:68px}");break;case"num":case"num1":a.pushItem(c,h+" li.list-"+f+"-paddingleft-1{padding-left:25px}");break;case"num2":a.pushItem(c,h+" li.list-"+f+"-paddingleft-1{padding-left:35px}"),a.pushItem(c,h+" li.list-"+f+"-paddingleft-2{padding-left:40px}");break;case"dash":a.pushItem(c,h+" li.list-"+f+"-paddingleft{padding-left:35px}");break;case"dot":a.pushItem(c,h+" li.list-"+f+"-paddingleft{padding-left:20px}")}}})}var c=[],d={cn:"cn-1-",cn1:"cn-2-",cn2:"cn-3-",num:"num-1-",num1:"num-2-",num2:"num-3-",dash:"dash",dot:"dot"};a.extend(this,{liiconpath:"http://bs.baidu.com/listicon/",listDefaultPaddingLeft:"20"});var e=this.root,f=e.getElementsByTagName("ol"),g=e.getElementsByTagName("ul"),h=this.selector;f.length&&b.call(this,f),g.length&&b.call(this,g),(f.length||g.length)&&(c.push(h+" .list-paddingleft-1{padding-left:0}"),c.push(h+" .list-paddingleft-2{padding-left:"+this.listDefaultPaddingLeft+"px}"),c.push(h+" .list-paddingleft-3{padding-left:"+2*this.listDefaultPaddingLeft+"px}"),a.cssRule("list",h+" ol,"+h+" ul{margin:0;padding:0;}li{clear:both;}"+c.join("\n"),document))}),UE.parse.register("vedio",function(a){var b=this.root.getElementsByTagName("video"),c=this.root.getElementsByTagName("audio");if(document.createElement("video"),document.createElement("audio"),b.length||c.length){var d=a.removeLastbs(this.rootPath),e=d+"/third-party/video-js/video.js",f=d+"/third-party/video-js/video-js.min.css",g=d+"/third-party/video-js/video-js.swf";window.videojs?videojs.autoSetup():(a.loadFile(document,{id:"video_css",tag:"link",rel:"stylesheet",type:"text/css",href:f}),a.loadFile(document,{id:"video_js",src:e,tag:"script",type:"text/javascript"},function(){videojs.options.flash.swf=g,videojs.autoSetup()}))}})}();
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229766809036054.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229766809036054.jpg
new file mode 100644
index 0000000..ddaf18a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229766809036054.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229845707005523.png b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229845707005523.png
new file mode 100644
index 0000000..203e065
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229845707005523.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229845748008398.jpg b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229845748008398.jpg
new file mode 100644
index 0000000..ddaf18a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/js/ueditor/jsp/ueditor/jsp/upload/image/20161220/1482229845748008398.jpg
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/css/layui.css b/management/guns-admin/src/main/webapp/static/layui/css/layui.css
new file mode 100644
index 0000000..5a10469
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/css/layui.css
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ .layui-inline,img{display:inline-block;vertical-align:middle}h1,h2,h3,h4,h5,h6{font-weight:400}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-body,.layui-edge,.layui-elip{overflow:hidden}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-elip,.layui-form-checkbox span,.layui-form-pane .layui-form-label{text-overflow:ellipsis;white-space:nowrap}.layui-breadcrumb,.layui-tree-btnGroup{visibility:hidden}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:24px;font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:1px;margin:10px 0;border:0;clear:both}a{color:#333;text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-edge{display:inline-block;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=256);src:url(../font/iconfont.eot?v=256#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=256) format('woff2'),url(../font/iconfont.woff?v=256) format('woff'),url(../font/iconfont.ttf?v=256) format('truetype'),url(../font/iconfont.svg?v=256#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-key:before{content:"\e683"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-ios:before{content:"\e680"}.layui-icon-at:before{content:"\e687"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-addition:before{content:"\e624"}.layui-icon-home:before{content:"\e68e"}.layui-icon-time:before{content:"\e68d"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-logout:before{content:"\e682"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-android:before{content:"\e684"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-service:before{content:"\e626"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-print:before{content:"\e66d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-export:before{content:"\e67d"}.layui-icon-rss:before{content:"\e808"}.layui-icon-slider:before{content:"\e714"}.layui-icon-email:before{content:"\e618"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-light:before{content:"\e748"}.layui-icon-gift:before{content:"\e627"}.layui-icon-mute:before{content:"\e685"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-music:before{content:"\e690"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:absolute;left:200px;right:0;top:0;bottom:0;z-index:998;width:auto;overflow-y:auto;box-sizing:border-box}.layui-layout-body{overflow:hidden}.layui-layout-admin .layui-header{background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:fixed;top:60px;bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;height:44px;line-height:44px;padding:0 15px;background-color:#eee}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:'';display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:22px;border-left:5px solid #009688;border-radius:0 2px 2px 0;background-color:#f2f2f2}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:10px 15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#e2e2e2}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#f2f2f2;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:22px;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{position:relative;height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-card-body{position:relative;padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #E6E6E6;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-textarea{position:relative}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#eee!important;color:#666!important}.layui-badge-rim,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#e6e6e6}.layui-timeline-item:before,hr{background-color:#e6e6e6}.layui-text{line-height:22px;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding:0 5px!important}.layui-btn{display:inline-block;height:38px;line-height:38px;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border:none;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{margin-right:3px;font-size:18px;vertical-align:bottom;vertical-align:middle\9}.layui-btn-primary{border:1px solid #C9C9C9;background-color:#fff;color:#555}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-checked{background-color:#5FB878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border:1px solid #e6e6e6;background-color:#FBFBFB;color:#C9C9C9;cursor:not-allowed;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-sm i{font-size:16px!important}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:14px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#C9C9C9;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #c9c9c9}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#D2D2D2!important}.layui-input:focus,.layui-textarea:focus{border-color:#C9C9C9!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f2f2f2;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878!important;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2}.layui-checkbox-disbaled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disbaled,.layui-checkbox-disbaled i{border-color:#e2e2e2!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disbaled span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio>i:hover,.layui-form-radioed>i{color:#5FB878}.layui-radio-disbaled>i{color:#e2e2e2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FBFBFB;overflow:hidden;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #e2e2e2}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#e2e2e2;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #e2e2e2}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#e6e6e6}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-table td[data-edit=text]{cursor:text}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#f2f2f2}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0 0 0 1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:0 -1px 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#C9C9C9}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0 0 0 1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#666}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#666;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{padding:0 10px;color:#999}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-transfer-active,.layui-transfer-box{display:inline-block;vertical-align:middle}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#e6e6e6}.layui-transfer-box{position:relative;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#666}.layui-transfer-active{margin:0 15px}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5FB878;border-color:#5FB878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#FBFBFB;border-color:#e6e6e6;color:#C9C9C9}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#f2f2f2;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar,.layui-nav-tree .layui-nav-itemed:after{position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s}.layui-nav-bar{z-index:1000}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{content:'';top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{content:'';width:0;height:0;border-style:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:50%;right:3px;margin-top:-3px;border-width:6px;border-top-color:rgba(255,255,255,.7)}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{margin-top:-9px;border-style:dashed dashed solid;border-color:transparent transparent #fff}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #d2d2d2;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#333}.layui-nav .layui-nav-child a:hover{background-color:#f2f2f2;color:#000}.layui-nav-child dd{position:relative}.layui-nav .layui-nav-child dd.layui-this a,.layui-nav-child dd.layui-this{background-color:#5FB878;color:#fff}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:45px}.layui-nav-tree .layui-nav-item a{position:relative;height:45px;line-height:45px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item a:hover{background-color:#4E5465}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child a{height:40px;line-height:40px;color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-tree .layui-nav-more{right:10px}.layui-nav-itemed>.layui-nav-child{display:block;padding:0;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-bg-blue .layui-nav-bar,.layui-bg-blue .layui-nav-itemed:after,.layui-bg-blue .layui-this:after{background-color:#93D1FF}.layui-bg-blue .layui-nav-child dd.layui-this{background-color:#1E9FFF}.layui-bg-blue .layui-nav-itemed>a,.layui-nav-tree.layui-bg-blue .layui-nav-title a,.layui-nav-tree.layui-bg-blue .layui-nav-title a:hover{background-color:#007DDB!important}.layui-breadcrumb{font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:'';width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#e2e2e2;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:10px}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#f2f2f2}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:'';position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:last-child:before{display:none}.layui-timeline-item:first-child:before{display:block}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-8px 6px 0}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#e2e2e2;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New;font-size:12px}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #e6e6e6;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#FFF;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;z-index:66666666;width:280px;padding:7px;background:#FFF;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#FFF,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #FFF;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#666}.layui-slider{height:4px;background:#e2e2e2;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#FFF;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#FFF;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:66666666;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#FFF;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:'';position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #e6e6e6;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-15px}.layui-slider-input-btn{display:none;position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #d2d2d2}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #d2d2d2}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:34px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-iconClick,.layui-tree-main{display:inline-block;vertical-align:middle}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:'';position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:'';position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#666}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:'';position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-btnGroup,.layui-tree-editInput{position:relative;vertical-align:middle;display:inline-block}.layui-tree-spread>.layui-tree-entry>.layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#666}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .3s;-webkit-transition:all .3s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,30px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/css/layui.mobile.css b/management/guns-admin/src/main/webapp/static/layui/css/layui.mobile.css
new file mode 100644
index 0000000..7835392
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/css/layui.mobile.css
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}@-webkit-keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-left{-webkit-animation-name:layui-m-anim-left;animation-name:layui-m-anim-left}@-webkit-keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-right{-webkit-animation-name:layui-m-anim-right;animation-name:layui-m-anim-right}@-webkit-keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.layui-m-anim-lout{-webkit-animation-name:layui-m-anim-lout;animation-name:layui-m-anim-lout}@-webkit-keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.layui-m-anim-rout{-webkit-animation-name:layui-m-anim-rout;animation-name:layui-m-anim-rout}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/css/modules/code.css b/management/guns-admin/src/main/webapp/static/layui/css/modules/code.css
new file mode 100644
index 0000000..9143a25
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/css/modules/code.css
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/css/modules/laydate/default/laydate.css b/management/guns-admin/src/main/webapp/static/layui/css/modules/laydate/default/laydate.css
new file mode 100644
index 0000000..b900971
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/css/modules/laydate/default/laydate.css
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/icon-ext.png b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/icon-ext.png
new file mode 100644
index 0000000..bbbb669
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/icon-ext.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/icon.png b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/icon.png
new file mode 100644
index 0000000..3e17da8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/icon.png
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/layer.css b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/layer.css
new file mode 100644
index 0000000..032ae12
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/layer.css
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-0.gif b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-0.gif
new file mode 100644
index 0000000..6f3c953
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-0.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-1.gif b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-1.gif
new file mode 100644
index 0000000..db3a483
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-1.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-2.gif b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-2.gif
new file mode 100644
index 0000000..5bb90fd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/css/modules/layer/default/loading-2.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/font/iconfont.eot b/management/guns-admin/src/main/webapp/static/layui/font/iconfont.eot
new file mode 100644
index 0000000..622d7ec
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/font/iconfont.eot
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/font/iconfont.svg b/management/guns-admin/src/main/webapp/static/layui/font/iconfont.svg
new file mode 100644
index 0000000..999ca1f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/font/iconfont.svg
@@ -0,0 +1,554 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<!--
+2013-9-30: Created.
+-->
+<svg>
+<metadata>
+Created by iconfont
+</metadata>
+<defs>
+
+<font id="layui-icon" horiz-adv-x="1024" >
+  <font-face
+    font-family="layui-icon"
+    font-weight="500"
+    font-stretch="normal"
+    units-per-em="1024"
+    ascent="896"
+    descent="-128"
+  />
+    <missing-glyph />
+    
+    <glyph glyph-name="reply-fill" unicode="&#58897;" d="M507.904 835.5840000000001q93.184 1.024 175.104-33.792t143.872-94.72 97.792-141.312 36.864-174.592q1.024-88.064-30.208-165.888t-87.04-137.728-131.072-98.816-162.304-48.128q-22.528-3.072-48.128-5.12t-56.832-3.072-69.632 0-86.528 6.144q-106.496 10.24-158.208 26.624t-41.472 18.432q54.272 9.216 93.184 29.696 20.48 11.264 16.896 32.256t-19.968 39.424q-52.224 57.344-84.48 133.632t-34.304 164.352q-1.024 93.184 33.792 175.104t95.232 143.36 142.336 97.28 175.104 36.864zM707.584 385.024q0-26.624 18.432-45.568t45.056-18.944 45.568 18.944 18.944 45.568-18.944 45.056-45.568 18.432-45.056-18.432-18.432-45.056zM450.56 385.024q0-26.624 19.456-46.08t46.08-19.456q27.648 0 46.592 19.456t18.944 46.08q0 27.648-18.944 46.592t-46.592 18.944q-26.624 0-46.08-18.944t-19.456-46.592zM196.608 386.048q0-26.624 18.944-46.08t45.568-19.456q27.648 0 46.592 19.456t18.944 46.08-18.944 45.568-46.592 18.944q-26.624 0-45.568-18.944t-18.944-45.568z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="set-fill" unicode="&#58900;" d="M916.9398 445.2101l-69.9664 10.7833c-18.6619 2.863-38.1388 17.826-43.3424 33.2487-5.1618 15.3809-15.0883 65.4524-3.9288 80.6661l41.9004 57.135c11.1595 15.2346 9.3832 38.5985-3.9706 51.9314l-30.6364 30.6573c-13.3538 13.3538-36.7177 15.151-51.9314 3.9497l-57.135-41.8795c-15.2346-11.1804-39.4344-14.3987-53.7704-7.168-14.3569 7.2307-57.3022 35.7773-60.1652 54.4183l-10.7833 69.9664C570.3471 807.6016 552.542 822.8571 533.6712 822.8571h-43.34236734693877c-18.8709 0-36.6759-15.2555-39.5389-33.9174l-10.7833-69.9664c-2.863-18.6619-17.826-38.1388-33.2487-43.3424-15.4018-5.1827-65.4524-15.1092-80.687-3.9288L268.9567 713.5817c-15.2346 11.1804-38.6194 9.3832-51.9523-3.9497l-30.6364-30.6573c-13.3747-13.3538-15.151-36.7177-3.9706-51.9314l41.9004-57.135c11.1595-15.2346 14.3778-39.4136 7.168-53.7704-7.2307-14.3569-35.7773-57.2813-54.4183-60.1443l-69.9664-10.7833C88.3984 442.3471 73.1429 424.542 73.1429 405.6712v-43.34236734693877c0-18.8709 15.2555-36.6759 33.9174-39.5389l69.9664-10.7833c18.6619-2.863 38.1388-17.8469 43.3424-33.2487 5.1618-15.4018 15.0883-65.4733 3.9288-80.687l-41.9004-57.135c-11.1595-15.2346-9.3832-38.6194 3.9706-51.9314l30.6364-30.6573c13.3538-13.3538 36.7177-15.151 51.9523-3.9706l57.135 41.9213c15.2346 11.1386 39.4136 14.3778 53.7704 7.168 14.3569-7.2307 57.2813-35.7773 60.1443-54.4183l10.7833-69.9664c2.863-18.6619 20.6472-33.9174 39.5389-33.9174h43.34236734693877c18.8709 0 36.6759 15.2555 39.5389 33.9174l10.7833 69.9664c2.863 18.6619 17.826 38.1388 33.2487 43.3215 15.4018 5.1827 65.4524 15.0883 80.6661 3.9288l57.1559-41.9213c15.2346-11.1595 38.5985-9.3623 51.9314 3.9706l30.6364 30.6573c13.3747 13.3329 15.151 36.7177 3.9706 51.9314l-41.9004 57.135c-11.1595 15.2346-14.3778 39.4136-7.168 53.7496 7.2307 14.3778 35.7773 57.3231 54.4183 60.1861l69.9664 10.7833c18.6619 2.863 33.9174 20.6472 33.9174 39.5389v43.34236734693877C950.8571 424.542 935.6016 442.3471 916.9398 445.2101zM512 210.4633c-95.838 0-173.5367 77.6986-173.5367 173.5367s77.6986 173.5367 173.5367 173.5367 173.5367-77.6986 173.5367-173.5367S607.838 210.4633 512 210.4633zM512 384m-104.7824 0a5.014 5.014 0 1 1 209.5647 0 5.014 5.014 0 1 1-209.5647 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="menu-fill" unicode="&#58895;" d="M511.999488 834.254727c-248.678712 0-450.273176-201.585181-450.273176-450.254727s201.594464-450.254727 450.273176-450.254727 450.273176 201.585181 450.273176 450.254727S760.6782 834.254727 511.999488 834.254727zM266.371377 589.705012l491.256222 0 0-33.772174L266.371377 555.932838 266.371377 589.705012zM757.627599 178.29396499999996L266.371377 178.29396499999996l0 33.773198 491.256222 0L757.627599 178.29396499999996zM140.487278 367.11340099999995l0 33.771151 743.024421 0 0-33.771151L140.487278 367.11340099999995z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="search" unicode="&#58901;" d="M439.323351 120.52219c-49.280352 0-97.09834 9.656941-142.126681 28.699646-43.480015 18.388812-82.522793 44.706201-116.043584 78.225619s-59.841305 72.560596-78.230871 116.03883C83.878729 388.513804 74.222416 436.330856 74.222416 485.609189c0 49.284473 9.656313 97.104595 28.699798 142.133138 18.388542 43.479257 44.71008 82.520435 78.231894 116.03883 33.518745 33.515325 72.562546 59.832713 116.043584 78.219479 45.027318 19.039635 92.846329 28.694529 142.125658 28.694529 49.280352 0 97.099364-9.653871 142.126681-28.694529 43.481039-18.385742 82.525863-44.704155 116.044608-78.220502 33.520791-33.518395 59.842328-72.559573 78.230871-116.03883 19.042462-45.028543 28.699798-92.848665 28.699798-142.133138 0-49.278333-9.657336-97.095385-28.701845-142.122905-18.388542-43.47721-44.708033-82.520435-78.228824-116.03883s-72.563569-59.838853-116.043584-78.226642C536.422715 130.177084 488.603703 120.52219 439.323351 120.52219zM439.323351 797.483242c-171.975699 0-311.887855-139.906423-311.887855-311.875077S267.347652 173.734112 439.323351 173.734112s311.887855 139.907447 311.887855 311.874053S611.299051 797.483242 439.323351 797.483242zM890.678206-48.734702c-22.121716 0-42.90387 8.562003-58.541653 24.115234L674.672953 128.025071l37.039062 38.20616 157.888289-153.058978c5.606924-5.606695 13.091693-8.692986 21.077901-8.692986 7.983139 0 15.464837 3.087315 21.070738 8.69094 5.616135 5.622044 8.715856 13.126972 8.715856 21.123087 0 7.980765-3.091535 15.46318-8.702552 21.067828l-0.301888 0.306992L758.714395 213.230662l38.207726 37.035498 152.611906-157.427472c15.571265-15.638165 24.144876-36.422538 24.144876-58.549487 0-22.195511-8.625801-43.054585-24.287121-58.735729C933.723298-40.112324 912.876674-48.734702 890.678206-48.734702zM281.015489 327.245392c-42.340005 42.320874-65.652899 98.584296-65.643689 158.421102 0.008187 59.818387 23.319034 116.074645 65.637549 158.4078l37.634651-37.619806c-66.60666-66.629513-66.60973-175.00071-0.007163-241.577011L281.015489 327.245392z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="share" unicode="&#58945;" d="M769.714 306.453c-51.754 0-97.702-24.851-126.571-63.269L394.479 367.94100000000003c3.93 13.798 6.034 28.364 6.034 43.424 0 16.496-2.527 32.399-7.211 47.35l247.724 124.288c28.71-40.052 75.647-66.151 128.687-66.151 87.388 0 158.229 70.84 158.229 158.229 0 87.388-70.841 158.229-158.229 158.229-87.389 0-158.229-70.841-158.229-158.229 0-6.046 0.352-12.009 1.011-17.88L351.22 526.116c-28.371 26.943-66.723 43.479-108.938 43.479-87.388 0-158.229-70.84-158.229-158.229s70.84-158.229 158.229-158.229c43.752 0 83.354 17.758 111.997 46.459l258.676-129.779c-0.964-7.062-1.474-14.266-1.474-21.592 0-87.389 70.84-158.229 158.229-158.229s158.229 70.84 158.229 158.229C927.938 235.61199999999997 857.103 306.453 769.714 306.453L769.714 306.453z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="set-sm" unicode="&#58912;" d="M946.367 405.895c0.02 21.85-13.04 38.49-31.74 41.57-18.69 3.07-79.05 13.01-85.99 14.14-6.95 1.15-14.09 8.07-15.4 11.45-1.32 3.37-8.94 22.2-11.87 29.46-2.95 7.27-1.92 16.58 4.39 25.52 6.3 8.93 39.9 55.87 48.38 67.72 8.49 11.87 8.65 34.61-4.84 48.39-13.48 13.78-47.75 47.09-56.73 55.86-8.99 8.76-31.08 8.64-42.67 0.43-11.58-8.2-71.69-51.01-71.69-51.01s-9.97-6.89-20.67-2.64c-10.7 4.24-33.43 14.07-33.43 14.07s-7.19 5.43-9.68 19.79c-2.5 14.37-11.11 65.28-14.07 82.7-2.97 17.42-20.67 29.62-37.83 29.46-17.16-0.14-57.91 0-74.33 0s-32.26-15.68-34.75-29.46c-2.49-13.79-11.56-69.16-14.07-84.45-2.52-15.3-11.44-18.48-11.44-18.48s-19.56-8.06-29.91-12.31c-10.34-4.26-15.39-2.64-30.35 7.48-14.95 10.11-44.74 31.03-63.04 43.83-18.3 12.81-38.12 7.92-49.26-3.52s-36.06-35.77-51.02-50.43c-14.95-14.66-12.61-37.54 0.58-55.71 13.2-18.18 32.34-45.43 41.35-58.21 9.01-12.78 10.84-19.5 8.36-26.82-2.49-7.34-6.64-16.58-11.43-27.72-4.81-11.13-9.69-13.64-27.86-17.01-17.36-3.21-58.42-9.92-77.4-13.31-18.99-3.37-30.66-21.43-30.66-41.81l0-64.66c0-24.34 13.2-37.24 38.42-41.93 25.22-4.69 62.66-10.66 74.77-12.61 12.1-1.95 17.67-6.6 21.41-15.54 3.73-8.94 5.13-10.12 9.37-22.57 4.26-12.47 6.46-15.55-4.98-31.67-11.44-16.13-34.31-48.11-46.03-64.51-11.74-16.4-6.45-37.83 4.98-49.85 11.44-12.03 35.47-35.64 48.97-48.97 13.49-13.33 35.19-16.28 53.36-3.52 18.19 12.75 54.98 38.99 65.69 46.62 10.7 7.63 21.91 5.28 27.85 2.94 5.94-2.35 11.25-4.6 22-9.1 10.73-4.48 13.85-11.2 16.41-23.45 2.57-12.24 10.19-56.85 13.93-78.59 3.75-21.72 18.91-33.43 40.62-33.72 21.7-0.29 33.27-0.12 61.57 0 28.29 0.13 41.86 12.61 45.45 31.38 3.59 18.76 12.45 72.94 14.22 83.72 1.78 10.76 5.94 14.73 13.63 18.47 7.7 3.74 14.32 6.47 26.84 11.88 12.51 5.4 18.91 0.66 27.7-5.72 8.8-6.39 47.51-33.78 63.78-45.31 16.28-11.53 36.73-10.33 51.9 4.4 15.18 14.73 31.62 30.99 49.27 48.38 17.64 17.4 12.16 39.59 4.4 51.46-7.77 11.88-44.49 62.95-49.71 70.23-5.21 7.28-4.4 18.62-1.75 24.63 2.64 6.01 8.44 18.24 11.72 25.22 3.29 6.97 9.6 11.22 18.18 12.9 8.58 1.69 62.72 11 83.75 14.61 21.03 3.64 31.11 19.92 31.26 39.92C946.427 359.93499999999995 946.347 388.525 946.367 405.895zM908.587 338.615c0.21-5.76-4.66-10.65-8.82-11.38-4.17-0.73-63.26-11.38-81.48-14.29-18.21-2.92-33.23-15.07-38.72-28.06-3.98-9.44-5.47-13.51-10.59-26.96-5.12-13.44-4.64-32.19 2.56-42.26 7.2-10.08 46.82-64.9 50.38-70.45s4.27-11.95-1.28-17.5-40.99-41.2-47.39-47.39c-6.41-6.19-11.83-4.8-18.79 0-6.95 4.8-39.61 26.39-64.44 44.36-16.96 12.28-32.82 12.43-48.7 6.02-15.87-6.42 1.28 0.28-22.2-8.97-23.48-9.25-30.23-27.62-33.73-48.24-3.5-20.63-10.67-62.98-11.95-70.45-1.28-7.47-5.55-11.1-13.66-11.1l-64.9 0c-8.11 0-11.74 2.99-14.52 11.95-2.77 8.97-10.03 54.87-12.8 74.29-2.78 19.43-13.82 36.12-24.77 40.56-10.94 4.45-4.98 2.14-27.32 11.1-22.34 8.97-39.63 4.5-51.23-3.84-11.61-8.34-58.64-42.69-65.33-46.96-6.68-4.28-14.65-3.28-18.35 0.42-3.7 3.7-40.56 40.56-46.54 46.54-5.98 5.98-5.36 12.92 0 20.49 5.36 7.58 28.39 40.76 40.99 57.95 12.59 17.2 17.93 34.74 9.82 53.49-8.12 18.74-4.42 10.24-12.39 28.6-7.96 18.36-24.28 24.46-38.42 26.9-14.14 2.43-68.88 11.53-76.85 13.23-7.97 1.71-11.95 7.26-11.95 14.09l0 66.18c0 9.53 7.67 12.44 12.38 13.23 4.7 0.8 54.22 9.18 73 12.39 18.79 3.2 36.36 11.32 43.55 29.03 7.19 17.7 4.27 11.1 11.1 27.32 6.83 16.23 3.8 33.94-7.68 49.96-11.49 16.01-38.85 54-44.4 61.9-5.55 7.9-5.77 12.6 0.85 19.21 6.62 6.62 42.05 42.48 46.96 46.97 4.91 4.48 12.07 5.4 18.36 0.85 6.3-4.55 49.31-35.65 64.04-46.11 14.73-10.46 32.35-12.56 49.1-5.55 16.75 7.02 10.25 4.48 26.9 11.1s24.84 19.09 28.18 39.71c3.33 20.61 11.95 74.14 12.81 77.7 0.85 3.55 5.55 10.46 11.74 10.46s65.82-0.07 69.8 0c3.99 0.07 10.3-3.29 11.32-9.18 1.02-5.9 13.02-74.29 14.94-86.25 1.92-11.95 15.58-28.57 25.54-32.73 9.96-4.16 21.35-8.75 31.31-13.09 9.97-4.34 30.13-1.91 36.15 2.28 6.03 4.18 70.52 48.81 75.43 52.37 4.91 3.56 11.52 3.27 17.64-2.85s43.34-43.19 47.54-47.53c4.19-4.34 4.66-8.66 1.14-13.66-3.53-5.01-36.72-51.8-47.54-67.46-10.81-15.65-11.73-33.73-5.41-48.96 6.33-15.22 3.99-9.39 9.11-21.91 5.13-12.53 16.28-29.03 33.59-31.88 17.31-2.85 76.92-12.74 84.82-13.95 7.9-1.21 11.1-7.18 11.1-13.37S908.377 344.385 908.587 338.615zM526.833 573.1949999999999c-110.45 0-200-89.54-200-200s89.55-200 200-200c110.46 0 200 89.54 200 200S637.293 573.1949999999999 526.833 573.1949999999999zM526.833 208.19500000000005c-91.12 0-165 73.87-165 165s73.88 165 165 165c91.13 0 165-73.87 165-165S617.963 208.19500000000005 526.833 208.19500000000005z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="engine" unicode="&#58920;" d="M422.214332 360.70413299999996L186.183684 360.70413299999996l0 46.568461 236.030648 0c10.379577 40.075407 46.47537 69.794509 89.785668 69.794509 51.432433 0 93.067103-41.657943 93.067103-93.067103C605.067103 332.56756700000005 563.40916 290.909624 512 290.909624 468.689703 290.909624 432.593909 320.65199900000005 422.214332 360.70413299999996L422.214332 360.70413299999996zM512 779.634098c-218.529658 0-395.634098-177.10444-395.634098-395.634098 0-218.529658 177.10444-395.634098 395.634098-395.634098 154.76275 0 288.417257 89.064217 353.440885 218.55293l101.398692-59.112389-23.063141-39.959044-62.161099 35.909613c-33.745261-51.595341-77.42792-96.115813-129.093079-129.744711l35.653614-61.765464-40.308133-23.295867-35.653614 61.765464c-53.620057-27.345298-113.360805-44.404109-176.894987-47.73209L535.319139-127.99706800000001l-46.568461 0 0 70.981412c-63.534182 3.327981-123.27493 20.386792-176.894987 47.73209l-35.653614-61.765464-40.308133 23.295867 35.653614 61.765464c-51.665159 33.628898-95.347818 78.149371-129.093079 129.744711l-62.161099-35.909613-23.295867 40.308133 62.114553 35.863067c-27.415116 53.550239-44.799743 113.104807-48.127724 176.685534L0.002932 360.70413299999996l0 46.568461 70.958139 0c3.327981 63.580727 20.712609 123.135295 48.127724 176.685534l-62.114553 35.863067 23.295867 40.308133 62.161099-35.909613c33.745261 51.595341 77.42792 96.115813 129.093079 129.744711l-35.653614 61.765464 40.308133 23.295867 35.653614-61.765464c53.620057 27.345298 113.360805 44.404109 176.894987 47.73209L488.727406 895.997068l46.568461 0 0-70.981412c63.534182-3.327981 123.27493-20.386792 176.894987-47.73209l35.653614 61.765464 40.308133-23.295867-35.653614-61.765464c51.665159-33.628898 95.347818-78.149371 129.093079-129.744711l62.161099 35.909613 23.063141-39.959044-101.398692-59.112389C800.417257 690.569881 666.76275 779.634098 512 779.634098L512 779.634098z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="close" unicode="&#4102;" d="M783.483 701.249L512 429.775 240.517 701.249c-10.082 10.083-26.429 10.083-36.51 0-10.083-10.082-10.083-26.429 0-36.509l271.481-271.475L204.008 121.78800000000001c-10.083-10.081-10.083-26.428 0-36.508 10.082-10.082 26.429-10.082 36.51 0L512 356.755l271.483-271.475c10.082-10.082 26.429-10.082 36.513 0 10.081 10.083 10.081 26.428 0 36.508L548.51 393.265l271.485 271.474c10.081 10.083 10.081 26.429 0 36.509C809.912 711.33 793.564 711.33 783.483 701.249z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="close-fill" unicode="&#4103;" d="M512 822.022125c-217.47508 0-394.423141-176.949085-394.423141-394.423141 0-217.474057 176.948061-394.422118 394.423141-394.422118 217.473033 0 394.422118 176.948061 394.422118 394.422118C906.422118 645.07304 729.473033 822.022125 512 822.022125zM702.228529 270.92978200000005c8.030907-8.030907 8.030907-21.052478 0-29.083385s-21.052478-8.030907-29.083385 0L512 402.992563 350.853833 241.84741899999995c-8.030907-8.030907-21.052478-8.030907-29.083385 0s-8.030907 21.052478 0 29.083385l161.146167 161.146167L321.771471 593.222115c-8.030907 8.030907-8.030907 21.052478 0 29.083385s21.052478 8.030907 29.083385 0l161.146167-161.146167L673.145144 622.305501c8.030907 8.030907 21.052478 8.030907 29.083385 0s8.030907-21.052478 0-29.083385L541.082362 432.075949 702.228529 270.92978200000005z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="chart-screen" unicode="&#58921;" d="M963.930903 179.21903299999997l0 34.824133-37.354769-2.675946L926.576133 694.8538169999999 691.413206 694.8538169999999l0 70.462818L330.260819 765.316635l0-70.462818L95.690386 694.8538169999999l0-480.809627-35.621289 0 0-34.824133 432.583253 0 0-141.228535-90.313935 0 0-35.307134 216.753649 0 0 35.307134-90.313935 0L528.778128 179.21903299999997 963.930903 179.21903299999997zM366.212636 730.008478L655.216819 730.008478l0-35.307134L366.212636 694.7013440000001 366.212636 730.008478zM364.817869 332.73133600000006L222.224244 406.252817l14.295588 27.736715 123.238812-63.523779 173.928285 159.755494 127.5807-92.634794 93.13826 122.414027 12.420891-9.449209 12.420891-9.449209L667.639756 394.365068l-131.636063 95.621824L364.817869 332.73133600000006z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="star" unicode="&#58880;" d="M749.624889-84.152889c-15.672889 0-31.246222 3.882667-45.084444 11.306667l-192.526222 103.637333L319.544889-72.817778c-31.203556-16.64-70.314667-14.392889-99.043556 5.304889-29.511111 20.337778-44.743111 55.921778-38.840889 90.695111l37.703111 225.251556L56.661333 410.908444c-25.002667 24.888889-33.464889 60.984889-22.058667 94.193778 11.349333 32.910222 40.064 56.576 74.965333 61.752889l221.326222 32.896 96.128 199.580444c15.488 32.085333 48.853333 52.807111 84.992 52.807111 36.167111 0 69.518222-20.736 84.963556-52.807111l96.156444-199.580444 221.297778-32.910222c34.872889-5.162667 63.616-28.8 74.979556-61.696 11.392-33.28 2.944-69.361778-22.030222-94.250667L804.622222 248.433778l37.745778-225.28c5.845333-34.773333-9.386667-70.357333-38.812444-90.638222C787.569778-78.392889 768.938667-84.152889 749.624889-84.152889zM512.014222 91.548444c4.636444 0 9.272889-1.137778 13.482667-3.384889l205.937778-110.862222c12.373333-6.641778 28.316444-5.802667 39.936 2.133333 11.392 7.836444 17.123556 21.006222 14.890667 34.304L746.097778 253.496889c-1.507556 9.088 1.450667 18.332444 7.964444 24.832l173.141333 172.842667c9.457778 9.429333 12.686222 23.025778 8.405333 35.484444-4.380444 12.672-15.701333 21.873778-29.525333 23.921778L669.866667 545.706667c-9.315556 1.379556-17.365333 7.296-21.447111 15.786667L545.720889 774.641778c-6.030222 12.529778-19.256889 20.608-33.706667 20.608s-27.690667-8.092444-33.763556-20.622222L375.608889 561.493333c-4.081778-8.490667-12.131556-14.407111-21.447111-15.786667L117.930667 510.577778c-13.624889-2.033778-25.201778-11.434667-29.539556-23.992889-4.266667-12.416-1.024-25.984 8.433778-35.399111L269.937778 278.328889c6.513778-6.499556 9.472-15.744 7.964444-24.832l-40.135111-239.744c-2.247111-13.312 3.484444-26.439111 14.976-34.360889 11.434667-7.836444 27.349333-8.775111 39.950222-2.062222l205.852444 110.833778C502.741333 90.410667 507.377778 91.548444 512.014222 91.548444zM200.32 439.210667c-6.840889 0-12.885333 4.963556-14.023111 11.946667-1.251556 7.751111 4.010667 15.061333 11.761778 16.312889l9.443556 1.536c7.793778 1.336889 15.061333-4.010667 16.312889-11.761778 1.251556-7.751111-4.010667-15.061333-11.761778-16.312889l-9.443556-1.536C201.856 439.267556 201.073778 439.210667 200.32 439.210667zM252.544 447.687111c-6.684444 0-12.643556 4.721778-13.937778 11.534222-1.493333 7.708444 3.555556 15.175111 11.264 16.654222l153.927111 29.696 58.055111 133.148444c3.157333 7.182222 11.548444 10.496 18.716444 7.352889 7.210667-3.143111 10.510222-11.52 7.367111-18.716444l-61.056-140.017778c-1.877333-4.295111-5.745778-7.395556-10.353778-8.277333l-161.28-31.118222C254.336 447.758222 253.44 447.687111 252.544 447.687111z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="circle-dot" unicode="&#58903;" d="M513.133312 830.6731560000001c-247.538793 0-448.208115-200.669322-448.208115-448.207092 0-247.538793 200.670346-448.208115 448.208115-448.208115 247.538793 0 448.208115 200.670346 448.208115 448.208115C961.341427 630.004857 760.673128 830.6731560000001 513.133312 830.6731560000001zM513.132288-6.649187999999981c-214.901465 0-389.113205 174.212764-389.113205 389.114229 0 214.902488 174.21174 389.115252 389.113205 389.115252 214.903511 0 389.115252-174.212764 389.115252-389.115252C902.24754 167.563576 728.0358-6.649187999999981 513.132288-6.649187999999981zM513.133312 382.46504100000004m-344.602456 0a336.754 336.754 0 1 1 689.204911 0 336.754 336.754 0 1 1-689.204911 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="chat" unicode="&#58886;" d="M132.682393 414.567179c0 208.287837 166.471452 377.143593 379.317095 377.143593s385.380184-168.855756 385.380184-377.143593c0-177.196725-122.197086-325.812507-290.49821-366.259708l-116.291586-51.04763 0 41.126676C290.570353 52.175568999999996 132.682393 215.31206599999996 132.682393 414.567179zM83.799056 414.567179c0-211.946157 160.764474-387.135154 369.469819-415.152255-3.2623-20.458961-10.036587-65.024969-7.286963-65.024969 2.384303 0 114.89068 47.294143 189.700503 78.865185 176.193885 51.91437 304.518528 211.946157 304.518528 401.312038 0 231.432976-191.70823 419.042865-428.200432 419.042865S83.799056 646.0001560000001 83.799056 414.567179zM340.71952 276.63573699999995c22.935362-41.481763 89.831958-75.102489 170.391738-75.102489 79.650061 0 148.489916 32.909527 172.168198 73.681116-12.701277 5.979178-19.068288 8.02886-28.131711 12.21009-19.894096-31.257911-75.425853-59.661821-142.729725-59.661821-66.969251 0-122.836653 28.40391-143.598512 61.083194L340.71952 276.63573699999995z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="release" unicode="&#58889;" d="M990.78144 828.5388800000001c-3.35872 1.59744-7.04512 2.37568-11.01824 2.37568-14.45888 0-27.60704-10.81344-27.40224-10.81344-8.8064-4.42368-880.59904-443.22816-911.44192-459.44832-17.408-9.13408-27.36128-24.73984-25.92768-40.71424 1.10592-13.14816 9.78944-23.51104 23.10144-27.77088 26.17344-8.27392 290.24256-91.58656 290.24256-91.58656l4.83328-1.47456 16.67072 50.05312-254.32064 79.54432 780.73856 406.28224c-82.82112-93.88032-420.53632-476.32384-436.10112-493.93664-20.11136-22.48704-29.4912-45.09696-29.40928-70.98368l0.28672-153.27232-0.08192 0c0 0 0.08192-53.49376 0.08192-53.6576l0-1.96608 0 0c1.18784-13.5168 12.73856-24.24832 26.54208-24.24832s25.51808 10.73152 26.74688 24.24832l0 0c0 0 0.53248 191.03744 0 205.08672-0.49152 12.4928 5.07904 26.54208 10.69056 33.05472 5.65248 6.38976 390.63552 442.61376 465.75616 527.81056-21.38112-106.41408-126.68928-629.76-128.24576-637.41952-0.8192-4.05504-2.58048-4.05504-3.35872-4.05504-0.6144 0-1.31072 0.12288-2.048 0.36864-7.45472 2.37568-268.82048 81.55136-279.92064 84.91008l-4.7104 1.4336-17.16224-50.50368 5.07904-1.59744c2.58048-0.77824 258.90816-79.09376 284.38528-86.46656 5.07904-1.47456 10.24-2.2528 15.44192-2.2528 26.99264 0 49.5616 19.37408 54.8864 46.98112 2.08896 10.93632 27.0336 134.67648 55.9104 277.99552 39.77216 197.14048 84.7872 420.61824 85.93408 427.6224l0.6144 3.31776C1009.70496 798.96576 1013.26848 817.9712 990.78144 828.5388800000001z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="list" unicode="&#58890;" d="M618.04471 733.97072l-397.175835 0c-16.927531 0-30.699186-13.771655-30.699186-30.699186l0-638.543068c0-16.927531 13.771655-30.699186 30.699186-30.699186l582.261227 0c16.927531 0 30.699186 13.771655 30.699186 30.699186l-0.726547 476.760404L618.04471 733.97072zM803.771715 541.488871 619.537713 541.488871 619.537713 705.552483 803.771715 541.488871zM813.363164 64.728466c0-5.64251-4.590552-10.233062-10.233062-10.233062l-582.261227 0c-5.64251 0-10.233062 4.590552-10.233062 10.233062l0 638.543068c0 5.64251 4.590552 10.233062 10.233062 10.233062l378.202715 0 0-192.481849 214.291574 0L813.363164 64.728466zM298.129516 482.495268l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 468.168981l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM298.129516 342.044446l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 327.718159l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM298.129516 199.804884l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 185.478598l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM881.315812 53.053566"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="chart" unicode="&#58924;" d="M953.440991 315.668729L784.061302 315.668729 681.06451 437.392024c-0.312108 0.373507-0.635473 0.737804-0.969071 1.094938-0.013303 0.014326-0.026606 0.027629-0.039909 0.041956-0.276293 0.293689-0.559748 0.582261-0.851391 0.86367-0.053212 0.051165-0.107447 0.099261-0.160659 0.150426-0.249687 0.237407-0.50142 0.470721-0.76134 0.697895-0.089028 0.078795-0.181125 0.153496-0.272199 0.230244-0.225127 0.191358-0.451278 0.381693-0.683569 0.565888-0.124843 0.099261-0.251733 0.192382-0.3776 0.288572-0.200568 0.153496-0.402159 0.306992-0.607844 0.454348-0.159636 0.11461-0.322341 0.224104-0.485047 0.334621-0.177032 0.12075-0.354064 0.242524-0.535189 0.35918-0.195451 0.12689-0.394996 0.246617-0.593518 0.367367-0.152473 0.092098-0.302899 0.186242-0.457418 0.275269-0.237407 0.137123-0.477884 0.268106-0.718361 0.397043-0.121773 0.065492-0.2415 0.132006-0.364297 0.195451-0.283456 0.146333-0.571005 0.285502-0.859577 0.420579-0.085958 0.040932-0.170892 0.082888-0.257873 0.122797-0.337691 0.154519-0.679475 0.298805-1.022283 0.437975-0.044002 0.017396-0.086981 0.036839-0.130983 0.055259-1.604544 0.638543-3.2623 1.113357-4.948709 1.416256-0.343831 0.062422-0.687662 0.112564-1.031493 0.160659-0.055259 0.008186-0.110517 0.01842-0.165776 0.025583-1.633197 0.216941-3.25923 0.26913-4.861728 0.173962-0.013303-0.001023-0.026606-0.001023-0.040932-0.002047-0.363274-0.022513-0.724501-0.054235-1.085728-0.091074-0.060375-0.00614-0.119727-0.011256-0.180102-0.017396-0.310062-0.034792-0.618077-0.077771-0.926092-0.122797-0.116657-0.017396-0.232291-0.032746-0.348947-0.051165-0.24764-0.040932-0.494257-0.086981-0.740874-0.135076-0.178055-0.033769-0.355087-0.067538-0.532119-0.105401-0.183172-0.039909-0.36532-0.083911-0.547469-0.127913-0.237407-0.056282-0.474814-0.113587-0.710175-0.176009-0.12075-0.032746-0.240477-0.068562-0.360204-0.102331-0.292666-0.082888-0.584308-0.168846-0.874927-0.26299-0.063445-0.020466-0.125867-0.042979-0.188288-0.063445-0.338714-0.112564-0.675382-0.230244-1.010003-0.357134-0.019443-0.007163-0.038886-0.01535-0.058328-0.022513-1.493004-0.571005-2.948145-1.284249-4.340865-2.149966-0.067538-0.041956-0.13303-0.088004-0.200568-0.12996-0.273223-0.172939-0.545422-0.346901-0.813528-0.531096-1.416256-0.971118-2.734274-2.089591-3.936659-3.333932-0.025583-0.026606-0.049119-0.053212-0.074701-0.079818-0.26299-0.275269-0.521886-0.555655-0.773619-0.843204-0.058328-0.066515-0.112564-0.134053-0.169869-0.200568-0.211824-0.246617-0.420579-0.496304-0.62217-0.751107-0.083911-0.106424-0.164752-0.214894-0.246617-0.322341-0.167822-0.218988-0.334621-0.437975-0.49528-0.663102-0.102331-0.14224-0.199545-0.287549-0.298805-0.431835-0.13303-0.194428-0.26606-0.387833-0.393973-0.586354-0.115634-0.179079-0.225127-0.360204-0.335644-0.541329-0.103354-0.168846-0.207731-0.336668-0.306992-0.508583-0.12689-0.220011-0.24764-0.443092-0.36839-0.666172-0.074701-0.138146-0.151449-0.275269-0.223081-0.416486-0.137123-0.265036-0.265036-0.533143-0.39295-0.802272-0.050142-0.105401-0.101307-0.209778-0.150426-0.316202-0.144286-0.317225-0.279363-0.63752-0.410346-0.958838-0.026606-0.064468-0.055259-0.127913-0.080841-0.193405-0.150426-0.378623-0.291642-0.760317-0.423649-1.14508-0.005117-0.016373-0.011256-0.031722-0.017396-0.048095-0.157589-0.463558-0.303922-0.930185-0.434905-1.400906l-97.897657-342.642824L435.093423 811.832042c-0.071631 0.569982-0.165776 1.13587-0.275269 1.696642-0.008186 0.040932-0.017396 0.081864-0.025583 0.12382-0.071631 0.356111-0.148379 0.709151-0.234337 1.061169-0.031722 0.128937-0.065492 0.255827-0.099261 0.38374-0.066515 0.254803-0.135076 0.508583-0.208754 0.760317-0.060375 0.206708-0.124843 0.411369-0.190335 0.615007-0.053212 0.166799-0.107447 0.332575-0.164752 0.49835-0.092098 0.26913-0.190335 0.535189-0.290619 0.800225-0.037862 0.098237-0.074701 0.196475-0.113587 0.293689-0.12382 0.313132-0.25378 0.623193-0.38988 0.930185-0.022513 0.050142-0.044002 0.100284-0.066515 0.150426-0.152473 0.338714-0.311085 0.672312-0.477884 1.00284-0.01228 0.024559-0.024559 0.049119-0.037862 0.074701-0.173962 0.343831-0.356111 0.682545-0.545422 1.017166-0.011256 0.019443-0.022513 0.039909-0.033769 0.059352-0.188288 0.330528-0.382717 0.654916-0.584308 0.975211-0.021489 0.034792-0.044002 0.068562-0.065492 0.103354-0.190335 0.298805-0.385786 0.592494-0.587378 0.88209-0.045025 0.065492-0.091074 0.12996-0.137123 0.194428-0.180102 0.252757-0.363274 0.502443-0.551562 0.74906-0.079818 0.105401-0.162706 0.208754-0.24457 0.312108-0.157589 0.199545-0.317225 0.396019-0.480954 0.590448-0.124843 0.149403-0.252757 0.295735-0.381693 0.442068-0.125867 0.14224-0.251733 0.284479-0.38067 0.424672-0.174985 0.191358-0.355087 0.378623-0.536212 0.563842-0.088004 0.090051-0.176009 0.180102-0.26606 0.26913-0.224104 0.222057-0.452301 0.440022-0.684592 0.653893-0.054235 0.050142-0.10847 0.100284-0.163729 0.150426-0.265036 0.240477-0.535189 0.474814-0.810459 0.704035-0.028653 0.023536-0.056282 0.047072-0.084934 0.070608-0.294712 0.243547-0.595564 0.479931-0.902556 0.711198-0.01535 0.011256-0.029676 0.022513-0.045025 0.033769-0.311085 0.232291-0.627287 0.458441-0.949628 0.677429-0.019443 0.013303-0.037862 0.025583-0.057305 0.038886-0.309038 0.208754-0.623193 0.411369-0.942465 0.606821-0.045025 0.027629-0.090051 0.054235-0.134053 0.081864-0.288572 0.174985-0.581238 0.343831-0.877997 0.50756-0.090051 0.050142-0.181125 0.098237-0.272199 0.147356-0.25071 0.134053-0.502443 0.265036-0.759293 0.391926-0.156566 0.077771-0.314155 0.151449-0.472767 0.226151-0.194428 0.091074-0.38988 0.182149-0.587378 0.268106-0.239454 0.105401-0.481977 0.204661-0.724501 0.302899-0.12382 0.049119-0.246617 0.100284-0.37146 0.148379-0.334621 0.128937-0.673335 0.249687-1.014096 0.36532-0.042979 0.014326-0.085958 0.029676-0.128937 0.044002-1.6158 0.536212-3.296069 0.915859-5.02034 1.119497-0.01535 0.002047-0.029676 0.004093-0.044002 0.00614-0.309038 0.035816-0.620124 0.062422-0.931209 0.086981-0.132006 0.010233-0.265036 0.025583-0.397043 0.033769-0.174985 0.011256-0.349971 0.01535-0.525979 0.022513-0.270153 0.01228-0.539282 0.024559-0.808412 0.027629-0.054235 0.001023-0.10847-0.001023-0.162706-0.001023-1.696642 0.010233-3.371794-0.149403-5.006014-0.466628-0.065492-0.01228-0.12996-0.027629-0.195451-0.039909-0.331551-0.067538-0.662079-0.13917-0.989537-0.218988-0.148379-0.035816-0.295735-0.075725-0.443092-0.11461-0.234337-0.061398-0.468674-0.124843-0.700965-0.192382-0.224104-0.065492-0.445138-0.135076-0.666172-0.206708-0.149403-0.048095-0.297782-0.096191-0.446162-0.147356-0.286526-0.098237-0.568958-0.201591-0.850367-0.309038-0.079818-0.030699-0.160659-0.061398-0.240477-0.093121-0.330528-0.12996-0.655939-0.267083-0.979304-0.410346-0.033769-0.01535-0.067538-0.029676-0.101307-0.045025-0.355087-0.159636-0.705058-0.325411-1.050935-0.500397-0.008186-0.004093-0.016373-0.008186-0.023536-0.01228-0.360204-0.182149-0.714268-0.372483-1.064238-0.569982-0.004093-0.002047-0.008186-0.005117-0.013303-0.007163-0.344854-0.196475-0.684592-0.399089-1.019213-0.610914-0.020466-0.013303-0.040932-0.025583-0.060375-0.038886-0.313132-0.199545-0.621147-0.404206-0.925069-0.61603-0.050142-0.034792-0.099261-0.070608-0.149403-0.105401-0.268106-0.190335-0.532119-0.38374-0.791016-0.583285-0.091074-0.069585-0.181125-0.141216-0.271176-0.212848-0.212848-0.167822-0.422625-0.337691-0.629333-0.512676-0.137123-0.11461-0.271176-0.232291-0.406253-0.349971-0.154519-0.1361-0.308015-0.272199-0.459464-0.412392-0.179079-0.164752-0.354064-0.332575-0.528026-0.502443-0.102331-0.100284-0.204661-0.199545-0.304945-0.301875-0.211824-0.212848-0.418532-0.430812-0.623193-0.651846-0.059352-0.064468-0.119727-0.128937-0.179079-0.194428-0.231267-0.254803-0.456395-0.515746-0.678452-0.780783-0.031722-0.037862-0.063445-0.075725-0.095167-0.11461-0.23536-0.285502-0.465604-0.577145-0.688685-0.874927-0.01842-0.024559-0.036839-0.048095-0.055259-0.072655-0.226151-0.301875-0.445138-0.60989-0.657986-0.923022-0.019443-0.028653-0.038886-0.057305-0.058328-0.084934-0.202615-0.300852-0.400113-0.606821-0.590448-0.916882-0.032746-0.053212-0.064468-0.105401-0.096191-0.158612-0.169869-0.282433-0.335644-0.567935-0.49528-0.857531-0.053212-0.097214-0.105401-0.194428-0.158612-0.292666-0.130983-0.24457-0.258896-0.490164-0.381693-0.73985-0.080841-0.162706-0.157589-0.326435-0.234337-0.491187-0.088004-0.189312-0.177032-0.378623-0.260943-0.571005-0.107447-0.245593-0.209778-0.493234-0.310062-0.741897-0.047072-0.11768-0.095167-0.234337-0.141216-0.354064-0.130983-0.340761-0.25378-0.684592-0.370437-1.030469-0.013303-0.037862-0.026606-0.075725-0.038886-0.113587-0.180102-0.543376-0.345877-1.092891-0.48914-1.650593L244.22942 305.59939599999996 67.355037 305.59939599999996c-14.128789 0-25.582655-11.453866-25.582655-25.582655s11.453866-25.582655 25.582655-25.582655l191.314257 0c0.867764 0 1.725294 0.044002 2.570545 0.128937 0.828878-0.080841 1.656733-0.1361 2.478448-0.1361 11.218506 0 21.512966 7.439436 24.644283 18.779715l113.358791 410.43686 103.412254-723.884758c0.00921-0.072655 0.021489-0.145309 0.030699-0.217964l0.046049-0.320295c0.002047-0.011256 0.005117-0.021489 0.00614-0.032746 0.109494-0.7552 0.25071-1.502213 0.425695-2.238994 0.01535-0.064468 0.031722-0.12689 0.047072-0.191358 0.166799-0.679475 0.358157-1.350764 0.579191-2.01182 0.041956-0.124843 0.088004-0.24764 0.130983-0.37146 0.210801-0.600681 0.437975-1.194198 0.692778-1.77646 0.068562-0.156566 0.144286-0.309038 0.215918-0.464581 0.223081-0.484024 0.460488-0.961908 0.713244-1.431605 0.106424-0.196475 0.213871-0.390903 0.325411-0.584308 0.265036-0.462534 0.545422-0.914836 0.838088-1.359974 0.088004-0.13303 0.170892-0.268106 0.260943-0.399089 0.354064-0.51677 0.732687-1.016143 1.12359-1.506307 0.078795-0.099261 0.156566-0.198521 0.237407-0.296759 0.420579-0.511653 0.864694-1.004887 1.325182-1.482771 0.051165-0.052189 0.101307-0.105401 0.152473-0.157589 0.494257-0.50449 1.010003-0.989537 1.548262-1.454118 0.00921-0.007163 0.017396-0.014326 0.026606-0.022513 1.636267-1.408069 3.466961-2.620687 5.466502-3.592828 0.075725-0.036839 0.151449-0.074701 0.228197-0.11154 0.576121-0.273223 1.165546-0.525979 1.768273-0.75827 0.158612-0.061398 0.319272-0.118704 0.478907-0.177032 0.558725-0.202615 1.124614-0.393973 1.704828-0.559748 0.005117-0.001023 0.010233-0.002047 0.01535-0.004093 0.278339-0.079818 0.562818-0.13917 0.844228-0.209778 0.394996-0.098237 0.789992-0.194428 1.184989-0.274246 0.283456-0.056282 0.568958-0.103354 0.854461-0.149403 0.445138-0.073678 0.889253-0.134053 1.333368-0.183172 0.229221-0.024559 0.456395-0.052189 0.686638-0.071631 0.710175-0.059352 1.418302-0.099261 2.122337-0.099261 0.337691 0 0.671289 0.027629 1.007957 0.040932 0.276293 0.011256 0.550539 0.013303 0.828878 0.033769 0.401136 0.029676 0.799202 0.079818 1.196245 0.127913 0.191358 0.022513 0.38067 0.033769 0.572028 0.061398 0.069585 0.010233 0.1361 0.024559 0.205685 0.034792 0.232291 0.034792 0.462534 0.075725 0.692778 0.116657 0.463558 0.082888 0.921999 0.176009 1.3743 0.283456 0.109494 0.025583 0.218988 0.047072 0.327458 0.074701 0.582261 0.145309 1.152243 0.316202 1.716084 0.499373 0.098237 0.031722 0.196475 0.063445 0.293689 0.097214 1.90335 0.644683 3.694135 1.50119 5.351891 2.540869 0.014326 0.00921 0.028653 0.01842 0.042979 0.027629 1.089821 0.686638 2.121314 1.452071 3.087315 2.287089 0.083911 0.071631 0.167822 0.143263 0.25071 0.215918 0.424672 0.3776 0.837064 0.76748 1.235131 1.170662 0.12382 0.124843 0.243547 0.254803 0.36532 0.382717 0.317225 0.334621 0.626263 0.677429 0.925069 1.028423 0.155543 0.183172 0.308015 0.36839 0.458441 0.556679 0.26606 0.331551 0.523933 0.670266 0.773619 1.01512 0.130983 0.180102 0.261966 0.35918 0.387833 0.543376 0.294712 0.429789 0.575098 0.86981 0.843204 1.316995 0.099261 0.165776 0.195451 0.334621 0.290619 0.503467 0.283456 0.499373 0.555655 1.004887 0.806365 1.52268 0.031722 0.065492 0.060375 0.13303 0.091074 0.199545 0.276293 0.584308 0.530073 1.178849 0.762363 1.784646 0.00614 0.017396 0.014326 0.034792 0.020466 0.051165 0.251733 0.661056 0.472767 1.336438 0.669242 2.020006 0.002047 0.008186 0.00614 0.016373 0.008186 0.024559l0.061398 0.215918c0.029676 0.106424 0.062422 0.210801 0.090051 0.317225l117.579929 411.527704 79.800487-94.308923c0.070608-0.083911 0.146333-0.161682 0.217964-0.243547 0.190335-0.220011 0.38374-0.436952 0.581238-0.649799 0.134053-0.144286 0.26913-0.285502 0.405229-0.425695 0.164752-0.168846 0.331551-0.335644 0.50142-0.500397 0.164752-0.159636 0.329505-0.319272 0.496304-0.473791 0.138146-0.12689 0.279363-0.25071 0.419556-0.37453 0.198521-0.174985 0.397043-0.350994 0.599657-0.518816 0.081864-0.067538 0.166799-0.132006 0.249687-0.198521 0.817622-0.661056 1.667989-1.264806 2.545986-1.811252 0.098237-0.061398 0.195451-0.125867 0.294712-0.185218 0.228197-0.138146 0.459464-0.267083 0.691755-0.398066 0.157589-0.089028 0.315178-0.178055 0.474814-0.264013 0.200568-0.107447 0.403183-0.208754 0.606821-0.311085 0.202615-0.101307 0.406253-0.201591 0.611937-0.297782 0.173962-0.080841 0.348947-0.159636 0.523933-0.237407 0.245593-0.10847 0.494257-0.212848 0.743944-0.313132 0.144286-0.058328 0.289596-0.115634 0.434905-0.171915 0.291642-0.11154 0.586354-0.216941 0.883113-0.317225 0.11154-0.037862 0.223081-0.076748 0.334621-0.113587 0.337691-0.109494 0.677429-0.210801 1.02126-0.305969 0.078795-0.021489 0.157589-0.046049 0.236384-0.066515 0.376577-0.101307 0.757247-0.193405 1.140986-0.277316 0.050142-0.011256 0.100284-0.023536 0.150426-0.034792 0.405229-0.085958 0.813528-0.162706 1.225921-0.229221 0.031722-0.005117 0.063445-0.01228 0.096191-0.017396 0.412392-0.065492 0.828878-0.12075 1.24741-0.165776 0.032746-0.004093 0.064468-0.00921 0.097214-0.01228 0.382717-0.039909 0.768503-0.068562 1.155313-0.092098 0.068562-0.004093 0.1361-0.01228 0.204661-0.01535 0.25992-0.013303 0.521886-0.01535 0.782829-0.020466 0.188288-0.004093 0.376577-0.01535 0.564865-0.01535 0.008186 0 0.01535 0.001023 0.023536 0.001023l181.208085 0c14.129812 0 25.582655 11.453866 25.582655 25.582655S967.56978 315.668729 953.440991 315.668729z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="ok-circle" unicode="&#4101;" d="M516.152065-63.152063c-60.696384 0-119.594819 11.894911-175.056991 35.353183-53.55473 22.651906-101.646028 55.073316-142.936433 96.364745-41.291428 41.291428-73.712839 89.381703-96.363721 142.936433-23.458271 55.462173-35.353183 114.359584-35.353183 175.055968s11.894911 119.594819 35.353183 175.056991c22.651906 53.55473 55.073316 101.646028 96.363721 142.936433 41.290405 41.291428 89.381703 73.712839 142.936433 96.363721 55.462173 23.458271 114.359584 35.353183 175.056991 35.353183s119.594819-11.894911 175.056991-35.353183c53.55473-22.651906 101.645005-55.073316 142.936433-96.363721 41.291428-41.290405 73.711815-89.38068 96.363721-142.936433 23.459295-55.462173 35.353183-114.359584 35.353183-175.056991 0-60.696384-11.893888-119.593795-35.353183-175.055968-22.651906-53.55473-55.072293-101.645005-96.363721-142.936433s-89.381703-73.712839-142.936433-96.364745C635.747907-51.25715200000002 576.849472-63.152063 516.152065-63.152063zM516.152065 774.870222c-214.115566 0-388.311956-174.196391-388.311956-388.311956s174.196391-388.311956 388.311956-388.311956 388.311956 174.196391 388.311956 388.311956S730.268654 774.870222 516.152065 774.870222zM434.74908 132.830517L209.49278 358.08784 289.087583 437.68162 434.74908 292.020122 743.218594 600.488613 822.812373 520.89381Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="layim-theme" unicode="&#58907;" d="M958.830745 538.643056L740.659817 692.753993l-100.539834 0-3.977591-9.332553c-0.37146-0.871857-38.021965-86.8613-124.772748-88.667435-35.691897 0.76441-67.206658 15.500019-93.680613 43.828204-20.658506 22.106484-30.374798 44.584428-30.456662 44.776809l-3.955078 9.393951-100.587929 0L64.518433 538.643056 169.320337 379.756349l89.956801 65.019853-19.016099-368.05254 268.86654 0 4.093225 0 269.866311 0-19.016099 368.051517 89.956801-65.018829L958.830745 538.643056zM730.105437 507.20402l20.655436-399.781172-237.540068 0-4.093225 0L272.587282 107.42284700000005l20.656459 399.781172-115.938546-83.797521-36.3243 55.070246 159.440315 111.641683-19.276019 30.638811L121.066333 508.667348l-14.548344 22.056342 185.921433 131.330094 71.077825 0c5.332449-10.04375 15.433504-26.779923 30.951943-43.580564 32.047904-34.69622 72.256674-53.486168 116.345822-54.411237l0-0.031722c0.203638 0.00307 0.406253 0.01228 0.60989 0.016373 0.203638-0.00307 0.406253-0.013303 0.60989-0.016373l0 0.031722c44.073798 0.925069 84.359316 19.703761 116.566856 54.379515 15.623839 16.821107 25.814945 33.579793 31.188326 43.612287l71.120804 0 185.921433-131.330094-14.548344-22.056342L742.203986 620.7551920000001l-19.276019-30.638811 159.440315-111.641683-36.3243-55.070246L730.105437 507.20402z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="table" unicode="&#58925;" d="M304.738028 343.684806M729.544153 511.153982M595.52788 637.723655M143.806755 686.614156l0-601.704045L881.172549 84.91011100000003l0 601.704045L143.806755 686.614156zM420.318416 299.80441299999995l0 128.936581 184.341448 0 0-128.936581L420.318416 299.80441299999995zM604.659865 256.825552l0-128.936581L420.318416 127.88897099999997l0 128.936581L604.659865 256.825552zM604.659865 600.656435l0-128.936581L420.318416 471.719854l0 128.936581L604.659865 600.656435zM374.232798 600.656435l0-128.936581L189.89135 471.719854l0 128.936581L374.232798 600.656435zM189.89135 428.740994L374.232798 428.740994l0-128.936581L189.89135 299.80441299999995 189.89135 428.740994zM650.745483 428.740994l184.341448 0 0-128.936581L650.745483 299.80441299999995 650.745483 428.740994zM650.745483 471.719854l0 128.936581 184.341448 0 0-128.936581L650.745483 471.719854zM189.89135 256.825552L374.232798 256.825552l0-128.936581L189.89135 127.88897099999997 189.89135 256.825552zM650.745483 127.88897099999997l0 128.936581 184.341448 0 0-128.936581L650.745483 127.88897099999997z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="right" unicode="&#58882;" d="M283.648 721.9189759999999L340.873216 780.926976 740.352 383.99795200000005 340.876288-12.925952000000052 283.648 46.07795199999998 619.52 383.99795200000005Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="left" unicode="&#58883;" d="M740.352 721.9189759999999L683.126784 780.926976 283.648 383.99795200000005 683.123712-12.925952000000052 740.352 46.07795199999998 404.48 383.99795200000005Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="cart-simple" unicode="&#59032;" d="M235.097303 196.866982C247.384597 160.417152 286.382106 132.37606800000003 324.772759 132.37606800000003L861.658537 132.37606800000003 880.429732 132.37606800000003 885.649214 150.54185399999994 1009.08775 580.154957C1021.388907 622.967661 993.187631 660.786325 949.051586 660.786325L424.585365 660.786325C410.791718 660.786325 399.609756 649.5207379999999 399.609756 635.623932 399.609756 621.727125 410.791718 610.461538 424.585365 610.461538L949.051586 610.461538C959.924 610.461538 964.161052 604.779539 961.106394 594.148171L837.667859 164.53506800000002 861.658537 182.70085500000005 324.772759 182.70085500000005C307.742153 182.70085500000005 287.789837 197.04752900000005 282.395194 213.05054900000005L73.600164 832.433664C69.16437 845.592294 54.980454 852.636656 41.919502 848.167687 28.858551 843.698719 21.86648 829.408727 26.302275 816.250097L235.097303 196.866982ZM399.609756-6.017094000000043C399.609756 49.57012899999995 354.881911 94.63247799999999 299.707317 94.63247799999999 244.532723 94.63247799999999 199.804878 49.57012899999995 199.804878-6.017094000000043 199.804878-61.604318000000035 244.532723-106.66666699999996 299.707317-106.66666699999996 354.881911-106.66666699999996 399.609756-61.604318000000035 399.609756-6.017094000000043ZM249.756098-6.017094000000043C249.756098 21.77651800000001 272.120021 44.30769299999997 299.707317 44.30769299999997 327.294613 44.30769299999997 349.658537 21.77651800000001 349.658537-6.017094000000043 349.658537-33.810704999999984 327.294613-56.34187899999995 299.707317-56.34187899999995 272.120021-56.34187899999995 249.756098-33.810704999999984 249.756098-6.017094000000043ZM924.097562-6.017094000000043C924.097562 49.57012899999995 879.369715 94.63247799999999 824.195121 94.63247799999999 769.020529 94.63247799999999 724.292683 49.57012899999995 724.292683-6.017094000000043 724.292683-61.604318000000035 769.020529-106.66666699999996 824.195121-106.66666699999996 879.369715-106.66666699999996 924.097562-61.604318000000035 924.097562-6.017094000000043ZM774.243902-6.017094000000043C774.243902 21.77651800000001 796.607825 44.30769299999997 824.195121 44.30769299999997 851.782419 44.30769299999997 874.146342 21.77651800000001 874.146342-6.017094000000043 874.146342-33.810704999999984 851.782419-56.34187899999995 824.195121-56.34187899999995 796.607825-56.34187899999995 774.243902-33.810704999999984 774.243902-6.017094000000043Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="face-cry" unicode="&#59036;" d="M1024 384C1024 666.769792 794.769792 896 512 896 229.230208 896 0 666.769792 0 384 0 101.23020799999995 229.230208-128 512-128 629.410831-128 740.826187-88.33104600000001 830.768465-16.686661999999956 841.557579-8.092490999999995 843.33693 7.620766000000003 834.742758 18.409879000000046 826.148587 29.198990999999978 810.43533 30.978341999999998 799.646219 22.384173000000033 718.470035-42.277495000000044 618.001779-78.04878099999996 512-78.04878099999996 256.817504-78.04878099999996 49.951219 128.81750399999999 49.951219 384 49.951219 639.182496 256.817504 846.048781 512 846.048781 767.182496 846.048781 974.048781 639.182496 974.048781 384 974.048781 296.507166 949.714859 212.66323599999998 904.470807 140.039307 897.177109 128.33175700000004 900.755245 112.92820300000005 912.462793 105.63450699999999 924.170342 98.34080900000004 939.573897 101.91894200000002 946.867595 113.62649199999998 997.013826 194.11920399999997 1024 287.101621 1024 384ZM337.170731 396.487806C371.654852 396.487806 399.609756 424.442709 399.609756 458.926829 399.609756 493.41095 371.654852 521.365854 337.170731 521.365854 302.686611 521.365854 274.731708 493.41095 274.731708 458.926829 274.731708 424.442709 302.686611 396.487806 337.170731 396.487806ZM711.804879 396.487806C746.288998 396.487806 774.243902 424.442709 774.243902 458.926829 774.243902 493.41095 746.288998 521.365854 711.804879 521.365854 677.320757 521.365854 649.365854 493.41095 649.365854 458.926829 649.365854 424.442709 677.320757 396.487806 711.804879 396.487806ZM352.788105 191.21547499999997C396.165222 225.91716899999994 453.151987 246.639629 524.487806 246.639629 595.823622 246.639629 652.810387 225.91716899999994 696.187505 191.21547499999997 722.700531 170.00505399999997 738.882517 148.42907300000002 746.631548 132.931012 752.800254 120.59359800000004 747.799529 105.59142399999996 735.462114 99.42271600000004 723.124702 93.25401 708.122526 98.25473499999998 701.953818 110.59214899999995 701.03616 112.42746499999998 698.492224 116.61747600000001 694.165854 122.38597100000004 686.602473 132.47047699999996 676.927317 142.654852 664.983226 152.21012499999995 630.311565 179.947456 584.273939 196.68840999999998 524.487806 196.68840999999998 464.70167 196.68840999999998 418.664045 179.947456 383.992384 152.21012499999995 372.048292 142.654852 362.373137 132.47047699999996 354.809756 122.38597100000004 350.483386 116.61747600000001 347.93945 112.42746499999998 347.021792 110.59214899999995 340.853084 98.25473499999998 325.850908 93.25401 313.513495 99.42271600000004 301.176081 105.59142399999996 296.175356 120.59359800000004 302.344062 132.931012 310.093092 148.42907300000002 326.275078 170.00505399999997 352.788105 191.21547499999997Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="face-smile" unicode="&#59055;" d="M1024 384C1024 666.769792 794.769792 896 512 896 229.230208 896 0 666.769792 0 384 0 101.23020799999995 229.230208-128 512-128 629.410831-128 740.826187-88.33104600000001 830.768465-16.686661999999956 841.557579-8.092490999999995 843.33693 7.620766000000003 834.742758 18.409879000000046 826.148587 29.198990999999978 810.43533 30.978341999999998 799.646219 22.384173000000033 718.470035-42.277495000000044 618.001779-78.04878099999996 512-78.04878099999996 256.817504-78.04878099999996 49.951219 128.81750399999999 49.951219 384 49.951219 639.182496 256.817504 846.048781 512 846.048781 767.182496 846.048781 974.048781 639.182496 974.048781 384 974.048781 296.507166 949.714859 212.66323599999998 904.470807 140.039307 897.177109 128.33175700000004 900.755245 112.92820300000005 912.462793 105.63450699999999 924.170342 98.34080900000004 939.573897 101.91894200000002 946.867595 113.62649199999998 997.013826 194.11920399999997 1024 287.101621 1024 384ZM337.170731 396.487806C371.654852 396.487806 399.609756 424.442709 399.609756 458.926829 399.609756 493.41095 371.654852 521.365854 337.170731 521.365854 302.686611 521.365854 274.731708 493.41095 274.731708 458.926829 274.731708 424.442709 302.686611 396.487806 337.170731 396.487806ZM711.804879 396.487806C746.288998 396.487806 774.243902 424.442709 774.243902 458.926829 774.243902 493.41095 746.288998 521.365854 711.804879 521.365854 677.320757 521.365854 649.365854 493.41095 649.365854 458.926829 649.365854 424.442709 677.320757 396.487806 711.804879 396.487806ZM352.788105 127.22903299999996C396.165222 92.52733899999998 453.151987 71.80487900000003 524.487806 71.80487900000003 595.823622 71.80487900000003 652.810387 92.52733899999998 696.187505 127.22903299999996 722.700531 148.43945399999996 738.882517 170.01543500000002 746.631548 185.51349500000003 752.800254 197.850908 747.799529 212.85308399999997 735.462114 219.021792 723.124702 225.19049800000005 708.122526 220.18977299999995 701.953818 207.85235799999998 701.03616 206.01704299999994 698.492224 201.82703100000003 694.165854 196.058537 686.602473 185.97402899999997 676.927317 175.78965500000004 664.983226 166.23438299999998 630.311565 138.49705200000005 584.273939 121.75609799999995 524.487806 121.75609799999995 464.70167 121.75609799999995 418.664045 138.49705200000005 383.992384 166.23438299999998 372.048292 175.78965500000004 362.373137 185.97402899999997 354.809756 196.058537 350.483386 201.82703100000003 347.93945 206.01704299999994 347.021792 207.85235799999998 340.853084 220.18977299999995 325.850908 225.19049800000005 313.513495 219.021792 301.176081 212.85308399999997 296.175356 197.850908 302.344062 185.51349500000003 310.093092 170.01543500000002 326.275078 148.43945399999996 352.788105 127.22903299999996Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="survey" unicode="&#59058;" d="M722.355804 849.454545C761.006291 849.454545 792.380951 818.166023 792.380951 779.627344L792.380951 437.500928 799.081094 453.813218 401.874746 51.22138 418.539682 58.181818 138.070006 58.181818C99.387643 58.181818 68.063492 89.328555 68.063492 127.771428L68.063492 872.727273 44.698413 849.454545 722.355804 849.454545ZM21.333333 896 21.333333 872.727273 21.333333 127.771428C21.333333 63.604277 73.59726 11.636363 138.070006 11.636363L418.539682 11.636363 428.337293 11.636363 435.204619 18.596802 832.410967 421.18864 839.11111 427.979625 839.11111 437.500928 839.11111 779.627344C839.11111 843.859757 786.827324 896 722.355804 896L44.698413 896 21.333333 896ZM775.859347 307.365395 759.337741 290.90909 775.859347 274.452787 869.319663 181.361879 885.841269 164.905574 902.362876 181.361879 972.458114 251.18006 988.979721 267.636363 972.458114 284.092668 878.997796 377.183575 862.47619 393.639878 845.954583 377.183575 775.859347 307.365395ZM845.954583 344.27097 939.414901 251.18006 939.414901 284.092668 869.319663 214.274485 902.362876 214.274485 808.902558 307.365395 808.902558 274.452787 878.997796 344.27097 845.954583 344.27097ZM518.843473 51.365395 513.841133 46.382827 512.453734 39.473248 489.088655-76.890387 482.215251-111.121568 516.58227-104.275332 633.407665-81.002605 640.344663-79.620689 645.347004-74.638121 902.362876 181.361879 918.884482 197.818182 902.362876 214.274485 808.902558 307.365395 792.380951 323.821698 775.859347 307.365395 518.843473 51.365395ZM775.859347 274.452787 869.319663 181.361879 869.319663 214.274485 612.303791-41.725515 624.243127-35.361033 507.41773-58.633758 534.911345-86.018703 558.276425 30.344934 551.886686 18.452787 808.902558 274.452787 775.859347 274.452787ZM426.576706 298.269073C444.201086 298.269073 458.488469 284.053815 458.488469 266.500753L458.488469 258.086116C458.488469 240.540958 444.323959 226.317797 426.576706 226.317797L426.576706 226.317797C408.952326 226.317797 394.664943 240.533054 394.664943 258.086116L394.664943 266.500753C394.664943 284.045911 408.829453 298.269073 426.576706 298.269073L426.576706 298.269073ZM278.349205 552.435127C278.349205 552.435127 280.851125 530.485568 305.477133 530.485568 330.103138 530.485568 331.559155 552.435127 331.559155 552.435127 329.927383 623.508937 362.988497 657.25782 430.67155 653.905282 475.722639 648.839223 499.06407 623.508937 500.624896 577.839917 497.503245 557.501184 480.405116 531.202385 449.969026 499.092521 409.671358 458.489557 389.522524 422.133143 389.522524 390.023279L389.522524 357.093903C389.522524 357.093903 392.614705 337.454532 414.885933 337.454532 437.157161 337.454532 440.249342 357.093903 440.249342 357.093903L440.249342 379.965664C440.249342 406.785969 459.546816 439.044836 498.21271 476.369762 538.652271 513.471183 558.730159 547.369069 558.730159 577.839917 555.395669 662.323878 511.195938 706.353877 425.776235 709.780917 327.515198 711.419936 278.349205 658.971339 278.349205 552.435127Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="tree" unicode="&#58926;" d="M962.691679 258.53447400000005c-8.721639 54.163597-34.298154 97.584526-73.089645 133.8638-44.721551 41.825594-99.282191 65.724911-156.512636 84.432994-26.935466 8.80555-54.079686 16.971533-81.129762 25.427112 41.188074 7.485485 81.495082 10.991332 121.872698 12.269441 39.906895 1.26276 79.885422 0.276293 120.633475 0.276293-30.644951 44.233434-74.588789 71.110571-127.260405 84.384899-53.004191 13.357216-103.742782 9.715269-152.261822-32.081673 18.715247 66.336848 12.464893 120.18936-38.810934 160.830989-32.450063 25.719778-77.127611 31.000038-111.319341 14.916734 58.583257-31.127951 82.051761-84.265172 94.304829-145.102772-44.638663 69.056795-110.067838 96.432283-187.710173 86.487793-56.123228-7.187703-110.723777-26.270317-166.003801-40.048111 15.677051-14.358009 31.136138-24.116257 47.932686-27.839045 51.427276-11.399631 103.405091-20.301372 155.098427-30.524201 37.036521-7.323802 75.163887-12.144598 104.448864-40.879036-78.096682 23.458271-155.928329 30.034037-235.541551 9.092076C186.718589 530.20385 104.838743 479.821369 81.996502 429.437865c46.955428 23.955598 95.807043 18.776645 144.606469 17.139356 37.737486-1.266853 76.089979-3.461845 113.238041 1.594311 52.683896 7.170307 104.513332 20.624736 159.209048 31.909757-91.88164-62.077847-186.516997-122.342396-159.194722-259.889075 58.852386 100.205213 163.392324 150.107763 229.951229 238.105956-16.239869-91.498924 6.980995-169.376619 66.432015-237.83785 41.815361-48.152696 89.979314-92.010577 110.706381-156.013263 12.758582 141.877311-25.823132 270.789333-97.911984 396.334677C755.996107 391.809873 858.199837 325.909977 962.691679 258.53447400000005zM513.476631 320.10169099999996c-27.767414-14.065344-39.008432-35.954887-42.252313-64.998363-6.078439-54.437843-15.162328-108.532879-21.799492-162.916487-3.90903-32.026414-5.519714-64.333214-8.16496-96.53052 30.078039 0 55.507198 0 79.961146 0 9.912767 78.200036 19.732413 154.247037 28.913517 230.369761 0.883113 7.322779-0.756223 15.746636-3.705392 22.591531C536.246217 272.25086999999996 524.967336 295.41135899999995 513.476631 320.10169099999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="ie" unicode="&#59323;" d="M734.208 267.1616l236.05248 0c1.82272 16.36352 2.53952 33.09568 2.53952 50.19648 0 80.22016-21.52448 155.46368-59.12576 220.2624 38.87104 103.30112 37.49888 190.99648-14.56128 243.38432-49.50016 49.27488-182.29248 41.28768-332.41088-25.1904-11.10016 0.83968-22.3232 1.26976-33.62816 1.26976-206.04928 0-378.92096-141.80352-426.7008-332.84096 64.63488 82.75968 132.62848 142.7456 223.47776 186.44992-8.25344-7.74144-56.46336-55.64416-64.55296-63.75424-239.55456-239.47264-315.0848-552.30464-233.79968-633.61024 61.78816-61.76768 173.75232-51.34336 302.36672 11.65312 59.8016-30.45376 127.50848-47.63648 199.20896-47.63648 193.1264 0 356.80256 124.3136 416.09216 297.45152l-237.8752 0c-32.72704-60.37504-96.74752-101.4784-170.20928-101.4784s-137.48224 41.10336-170.20928 101.4784c-14.5408 27.27936-22.91712 58.55232-22.91712 91.648l0 0.7168 386.2528 0zM348.30336 383.20128c5.44768 97.11616 86.20032 174.592 184.77056 174.592s179.3024-77.47584 184.77056-174.592l-369.54112 0zM896.96256 732.20096c33.52576-33.87392 32.68608-96.21504 4.01408-174.01856-49.13152 74.91584-120.5248 133.9392-204.8 167.64928 90.112 38.64576 163.40992 43.76576 200.78592 6.38976zM93.4912-71.24992c-42.78272 42.8032-29.88032 132.608 25.23136 240.82432 34.304-96.27648 101.15072-177.09056 187.33056-229.15072-95.4368-43.3152-173.52704-50.66752-212.56192-11.6736z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="upload-circle" unicode="&#58927;" d="M512-128c282.768 0 512 229.216 512 512C1024 666.768 794.768 896 512 896 229.216 896 0 666.768 0 384 0 101.21600000000001 229.216-128 512-128zM512 848c256.272 0 464-207.744 464-464 0-256.272-207.728-464-464-464S48 127.72799999999995 48 384C48 640.256 255.728 848 512 848zM377.728 534.544L480 534.544l0-478c0-17.664 14.336-32 32-32s32 14.336 32 32L544 534.544l102.272 0c17.616 0 23.424 11.568 12.944 25.68l-128.128 172.624c-10.496 14.128-27.664 14.128-38.16 0L364.8 560.24C354.32 546.1120000000001 360.128 534.544 377.728 534.544z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="add-circle" unicode="&#58911;" d="M675.04 412.736l-127.04 0 0 127.264c0 20.064-16.288 36.32-36.32 36.32-20.064 0-36.32-16.192-36.32-36.32l0-127.232-127.072 0c-20.064 0-36.352-16.32-36.352-36.352 0-20.064 16.224-36.352 36.352-36.352l127.072 0 0-127.232c0-20 16.256-36.384 36.32-36.384 20.032 0 36.32 16.256 36.32 36.384l0 127.136 127.04 0c19.968 0 36.352 16.256 36.352 36.384C711.36 396.448 695.136 412.736 675.04 412.736L675.04 412.736zM511.328 830.56c-250.24 0-453.952-203.616-453.952-453.952 0-250.336 203.712-453.952 453.952-453.952 250.336 0 453.984 203.584 453.984 453.952C965.312 626.944 761.696 830.56 511.328 830.56L511.328 830.56zM511.328-20.576000000000022c-219.04 0-397.184 178.176-397.184 397.152 0 219.104 178.144 397.216 397.184 397.216s397.216-178.112 397.216-397.216C908.576 157.63199999999995 730.368-20.576000000000022 511.328-20.576000000000022L511.328-20.576000000000022zM511.328-20.576000000000022"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="download-circle" unicode="&#58881;" d="M510.771521 828.211081c-244.998947 0-443.597097-198.60429-443.597097-443.590957s198.59815-443.591981 443.597097-443.591981c244.986667 0 443.583794 198.60429 443.583794 443.591981S755.758188 828.211081 510.771521 828.211081zM510.771521-30.044013999999947c-229.010811 0-414.664138 185.65435-414.664138 414.664138 0 229.010811 185.653327 414.657998 414.664138 414.657998 228.996484 0 414.652881-185.647187 414.652881-414.657998C925.424402 155.60931300000004 739.768005-30.044013999999947 510.771521-30.044013999999947zM662.749888 352.39518799999996L537.719266 245.82501100000002l0 324.388065c0 14.887059-12.06478 26.953885-26.947745 26.953885-14.894222 0-26.961048-12.066827-26.961048-26.953885l0-325.410348L357.936647 352.39518799999996c-10.56359 10.599406-27.693736 10.599406-38.267559 0-10.56359-10.596336-10.56359-27.777647 0-38.375006l170.181961-161.220868c5.629207-5.652743 13.111622-8.060583 20.49887-7.680936 7.373944-0.379647 14.859429 2.02717 20.488637 7.680936l170.181961 161.220868c10.562567 10.597359 10.562567 27.77867 0 38.375006C690.443623 362.99561700000004 673.313477 362.99561700000004 662.749888 352.39518799999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="templeate-1" unicode="&#58928;" d="M320 384L106.666667 384c-35.349333 0-64-28.650667-64-64l0-213.333333c0-35.349333 28.650667-64 64-64l213.333333 0c35.349333 0 64 28.650667 64 64L384 320C384 355.349333 355.349333 384 320 384zM256 341.33333300000004l0-256L170.666667 85.33333300000004 170.666667 341.33333300000004 256 341.33333300000004zM85.333333 106.66666699999996L85.333333 320c0 11.754667 9.578667 21.333333 21.333333 21.333333l42.666667 0 0-256L106.666667 85.33333300000004C94.912 85.33333300000004 85.333333 94.91200000000003 85.333333 106.66666699999996zM341.333333 106.66666699999996c0-11.754667-9.578667-21.333333-21.333333-21.333333l-42.666667 0L277.333333 341.33333300000004l42.666667 0c11.754667 0 21.333333-9.578667 21.333333-21.333333L341.333333 106.66666699999996zM576 554.666667L234.666667 554.666667c-47.061333 0-85.333333-38.272-85.333333-85.333333l0-42.666667 42.666667 0 0 42.666667c0 23.530667 19.136 42.666667 42.666667 42.666667l42.666667 0 0-96 21.333333 0L298.666667 512l213.333333 0 0-426.666667-85.333333 0-21.333333-42.666667 170.666667 0c47.061333 0 85.333333 38.272 85.333333 85.333333L661.333333 469.333333C661.333333 516.394667 623.061333 554.666667 576 554.666667zM618.666667 128c0-23.530667-19.136-42.666667-42.666667-42.666667l-42.666667 0L533.333333 512l42.666667 0c23.530667 0 42.666667-19.136 42.666667-42.666667L618.666667 128zM853.333333 42.66666699999996c47.061333 0 85.333333 38.272 85.333333 85.333333L938.666667 640c0 47.061333-38.272 85.333333-85.333333 85.333333L341.333333 725.333333c-47.061333 0-85.333333-38.272-85.333333-85.333333l0-42.666667 42.666667 0 0 42.666667c0 23.530667 19.136 42.666667 42.666667 42.666667l85.333333 0 0-85.333333 21.333333 0 0 85.333333 298.666667 0 0-597.333333-42.666667 0-21.333333-42.666667L853.333333 42.66666699999996zM896 128c0-23.530667-19.136-42.666667-42.666667-42.666667l-85.333333 0L768 682.666667l85.333333 0c23.530667 0 42.666667-19.136 42.666667-42.666667L896 128z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="util" unicode="&#58929;" d="M282.127566 639.0826059999999c-13.120832-13.221116-30.625508-20.50808-49.278333-20.50808-18.618033 0-36.157501 7.286963-49.311079 20.50808l-32.885991 33.019021 98.623181 99.027387 32.885991-33.019021c13.186324-13.221116 20.473287-30.829146 20.473287-49.548486C302.599829 669.8769589999999 295.347658 652.26893 282.127566 639.0826059999999L282.127566 639.0826059999999zM249.308089 705.0899489999999l-0.032746 0-32.884968-32.987299c4.418636-4.417613 10.252505-6.845918 16.458857-6.845918 6.206352 0 12.041244 2.428306 16.426111 6.813173 4.418636 4.452405 6.845918 10.288321 6.845918 16.493649C256.121262 694.802652 253.693979 700.671313 249.308089 705.0899489999999L249.308089 705.0899489999999zM396.703067 496.343671L249.578242 638.778684l32.278147 33.626865 147.157571-142.468782L396.703067 496.343671 396.703067 496.343671zM751.45979 133.92852400000004L618.131179 274.071332l32.884968 32.985252 133.330658-140.141784L751.45979 133.92852400000004 751.45979 133.92852400000004zM850.184279 67.95597399999997c-22.700001-22.766516-52.481282-34.168194-82.264609-34.168194-29.714765 0-59.395762 11.333116-81.994456 34.033118L538.194592 222.398462l32.884968 33.021068L718.811206 100.806149c27.117614-27.183106 71.269183-27.116591 98.488105 0.169869 27.186176 27.287483 27.117614 71.773673-0.135076 99.196233l-147.426701 154.273642 32.851199 33.021068 147.461493-154.308435C895.447159 187.557956 895.514697 113.421468 850.184279 67.95597399999997L850.184279 67.95597399999997zM801.716404 468.380806c-30.726815-30.860868-71.605851-47.861054-115.082038-47.861054-43.442418 0-84.321454 16.999163-115.082038 47.861054-30.760584 30.861892-47.692209 71.877027-47.692209 115.521037s16.931624 84.691891 47.692209 115.554806l42.497906 42.666752 32.885991-32.986275-42.497906-42.667775c-21.99085-22.090111-34.099632-51.367925-34.065863-82.566484 0-31.163767 12.108782-60.441581 34.065863-82.499969 21.956058-22.058388 51.16531-34.20094 82.196047-34.20094 31.064506 0 60.239989 12.142551 82.196047 34.20094l42.49893 42.665729 32.884968-33.019021L801.716404 468.380806 801.716404 468.380806zM844.214311 511.049604l-49.311079 49.51267-16.45988-16.493649c-17.538445-17.638729-40.879036-27.352975-65.73719-27.352975l-0.032746 0c-24.824385 0-48.198745 9.713222-65.73719 27.352975-17.539468 17.607006-27.252691 41.082674-27.252691 66.007343 0 24.925692 9.679453 48.400337 27.252691 66.040089l16.458857 16.495696-49.344848 49.51267 32.885991 33.021068 82.196047-82.533738-49.311079-49.482995c-8.769734-8.835226-13.626345-20.571525-13.626345-33.051767 0-12.446473 4.856611-24.183795 13.626345-32.987299 8.768711-8.835226 20.439518-13.69286 32.884968-13.69286 12.411681 0 24.082488 4.857635 32.852222 13.69286l49.344848 49.514717 82.196047-82.534761L844.214311 511.049604 844.214311 511.049604zM233.591129 129.139451l0 46.681182 46.512337 0 0-46.681182L233.591129 129.139451 233.591129 129.139451zM538.160823 356.538555l-92.247984 91.572602 32.717146 33.18889 92.214215-91.539856L538.160823 356.538555 538.160823 356.538555zM304.2187 101.04355599999997l173.634596 239.842507 37.641295-27.454282L338.318332 69.23715300000003c-21.923312-22.057365-51.132564-34.20094-82.19707-34.20094-31.028691 0-60.237943 12.143575-82.196047 34.168194-21.958104 22.057365-34.065863 51.335179-34.065863 82.533738 0 31.198559 12.107759 60.476373 34.065863 82.533738l2.765997 2.360767L417.243893 412.054963l27.353998-37.742603L205.596542 200.00340600000004c-12.411681-13.053294-19.224854-30.119995-19.224854-48.26526 0-18.71934 7.252171-36.291554 20.438495-49.513694C232.747925 76.15265599999998 277.775444 75.71263499999998 304.2187 101.04355599999997L304.2187 101.04355599999997z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="face-surprised" unicode="&#58980;" d="M485.656116-128C221.592397-128 6.762016 86.81718000000001 6.762016 350.87649799999997s214.830381 478.867697 478.8941 478.867697c264.041716 0 478.854495-214.812779 478.854495-478.867697S749.697832-128 485.656116-128zM485.656116 798.834741c-247.024795 0-447.975846-200.959852-447.975846-447.962644 0-247.002792 200.951051-447.962644 447.975846-447.962644 247.002792 0 447.953843 200.959852 447.953843 447.962644C933.609959 597.8748889999999 732.658908 798.834741 485.656116 798.834741zM352.033458 447.380528c0-30.469398-24.682677-55.147675-55.143274-55.147675-30.451796 0-55.143274 24.678276-55.143274 55.147675 0 30.460597 24.691478 55.138874 55.143274 55.138874C327.350781 502.519402 352.033458 477.845526 352.033458 447.380528zM674.417647 502.519402c-30.460597 0-55.156476-24.678276-55.156476-55.138874 0-30.469398 24.695879-55.147675 55.156476-55.147675 30.451796 0 55.143274 24.678276 55.143274 55.147675C729.560922 477.845526 704.869444 502.519402 674.417647 502.519402zM562.005634 165.30976499999997c0-59.733046-34.192262-108.165484-76.349518-108.165484-42.166057 0-76.36272 48.432438-76.36272 108.165484 0 59.724245 34.196663 108.152282 76.36272 108.152282C527.813371 273.45764699999995 562.005634 225.03400999999997 562.005634 165.30976499999997zM835.631745 793.712503c0 0 12.871605 56.819883 41.959231 85.925112 29.083226 29.096427 69.915916 15.124685 78.492585-8.801097 9.461179-26.385689-2.033053-50.069442-29.092027-56.164202C899.404495 808.463141 874.880237 826.192952 835.631745 793.712503zM916.698651 757.570797c0 0 35.767659 20.576965 64.877288 19.393218 29.136032-1.174946 41.431165-29.144833 33.109728-45.110024-9.192746-17.588993-27.054573-22.966463-43.217788-11.797871C954.979023 731.44034 952.453108 752.721393 916.698651 757.570797z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="edit" unicode="&#58946;" d="M769.089 516.251l-125.896 125.89 62.974 62.947c20.866 20.838 54.652 20.838 75.517 0l50.353-50.351c20.865-20.865 20.865-54.703 0-75.567L769.089 516.251zM403.349 150.52700000000004L277.453 276.418 619.706 615.982 745.601 490.09ZM176.314 47.283000000000015L252.912 251.87699999999995 377.753 127.01199999999994Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="speaker" unicode="&#58949;" d="M587.182306 754.7203c-6.003737 2.705622-13.043061 1.642406-17.984606-2.721994l-259.223926-229.293243-148.246369 0c-9.253758 0-16.752546-7.498788-16.752546-16.756639l0-267.886213c0-9.249665 7.498788-16.756639 16.752546-16.756639l144.050814 0c9.253758 0 16.752546 7.506974 16.752546 16.756639L322.530764 490.391099c1.774413 0.704035 3.433192 1.719154 4.892427 3.010567l236.127905 208.861912 0-653.332912-160.751171 137.64287c-2.12643 1.824555-90.300632 78.69941-93.927229 76.162634-4.427846-3.097548-15.768125-17.59882-18.419512-22.512736-0.953721-1.768273-2.196015-1.334391 15.413038-16.379039 25.674753-21.936615 73.780377-61.548798 75.144444-62.717414l10.007935-8.570189 178.388876-152.761196c3.093455-2.653433 6.978948-4.028757 10.900258-4.028757 2.369977 0 4.756327 0.503467 7.003508 1.534959 5.939269 2.738367 9.749038 8.677637 9.749038 15.217586L597.060281 739.446431C597.060281 746.034477 593.190137 752.013655 587.182306 754.7203L587.182306 754.7203zM290.453185 254.814756l-115.040083 0L175.413102 489.195877l115.03906 0 0-234.381122L290.453185 254.814756zM747.742119 375.98444300000006c0-51.55212-34.83232-96.658434-84.702124-109.693308-1.415232-0.375553-2.846838-0.551562-4.245697-0.551562-7.438413 0-14.234189 4.992711-16.200984 12.523221-2.338255 8.949836 3.021823 18.104333 11.967566 20.442588 35.136242 9.18929 59.672054 40.96397 59.672054 77.279061 0 36.307927-24.535813 68.090794-59.672054 77.271898-8.945743 2.346441-14.305821 11.492752-11.967566 20.450774 2.342348 8.953929 11.499915 14.305821 20.446681 11.967566C712.909799 472.643899 747.742119 427.530422 747.742119 375.98444300000006L747.742119 375.98444300000006zM864.950588 375.793084c0-88.87619-48.554856-170.44495-126.718053-212.883505-2.537799-1.375324-5.276167-2.02717-7.982812-2.02717-5.939269 0-11.69946 3.166109-14.733563 8.762571-4.417613 8.134261-1.39886 18.303878 6.727215 22.720468 67.350944 36.566824 109.198028 106.851587 109.198028 183.427636 0 76.844156-42.055838 147.272181-109.741403 183.78784-8.154727 4.396123-11.192923 14.557554-6.795776 22.700001 4.38896 8.142447 14.558577 11.184737 22.701025 6.795776C816.151162 546.697499 864.950588 464.976266 864.950588 375.793084L864.950588 375.793084z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="down" unicode="&#58906;" d="M888.306 619.94c15.615 15.617 40.93 15.617 56.545 0v0c15.617-15.615 15.617-40.93 0-56.545l-405.733-405.734c-15.615-15.617-40.928-15.617-56.545 0v0c-15.615 15.615-15.615 40.93 0 56.545l405.733 405.734zM538.619 214.20600000000002c15.617-15.615 15.617-40.93 0-56.545v0c-15.615-15.617-40.928-15.617-56.545 0l-405.734 405.734c-15.615 15.615-15.615 40.93 0 56.545v0c15.617 15.617 40.93 15.617 56.547 0l405.732-405.734zM538.619 214.20600000000002z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="file" unicode="&#58913;" d="M887.443911 598.6304l0-44.578133 0-45.511111 0-477.866667c0-37.705956-30.560711-68.266667-68.266667-68.266667l-614.4 0c-37.705956 0-68.266667 30.560711-68.266667 68.266667l0 705.422222c0 37.6832 30.560711 68.266667 68.266667 68.266667l386.844444 0 45.511111 0 38.024533 0c7.805156 2.594133 16.566044 1.2288 22.778311-5.006222l183.136711-183.159467C885.919289 611.373511 887.876267 604.9564439999999 887.443911 598.6304zM659.888356 531.296711c-12.583822 0-22.755556 10.171733-22.755556 22.755556l0 204.8-45.511111 0-364.088889 0c-25.122133 0-45.511111-20.388978-45.511111-45.511111l0-659.911111c0-25.122133 20.388978-45.511111 45.511111-45.511111l568.888889 0c25.122133 0 45.511111 20.388978 45.511111 45.511111l0 455.111111 0 22.755556L659.888356 531.296711zM682.643911 750.273422l0-173.4656 159.288889 0 0 14.176711L682.643911 750.273422z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="layouts" unicode="&#58930;" d="M917.213-103.239h-810.426c-23.151 0-41.918 18.766-41.918 41.917l0 698.644c0 23.148 18.767 41.917 41.918 41.917h810.426c23.149 0 41.918-18.769 41.918-41.917v-698.643c0-23.151-18.769-41.918-41.918-41.918zM316.38-61.321h600.833v363.294h-600.833v-363.294zM106.787-61.321h167.674v363.294h-167.674v-363.294zM148.705 637.322c-23.151 0-41.918-18.769-41.918-41.92s18.767-41.92 41.918-41.92 41.92 18.768 41.92 41.92-18.769 41.92-41.92 41.92zM274.461 637.322c-23.151 0-41.918-18.769-41.918-41.92s18.767-41.92 41.918-41.92c23.151 0 41.92 18.768 41.92 41.92s-18.77 41.92-41.92 41.92zM400.216 637.322c-23.15 0-41.918-18.769-41.918-41.92s18.769-41.92 41.918-41.92c23.152 0 41.92 18.768 41.92 41.92s-18.768 41.92-41.92 41.92zM875.293 511.566h-768.506v-167.675h810.426l0 167.675h-41.921z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="rate-half" unicode="&#59081;" d="M1012.064 504l-359.552 31.008-140.512 331.04-140.512-331.552-359.552-30.496 273.024-236.544-82.016-351.552 309.056 186.528 309.056-186.528-81.504 351.552 272.544 236.544zM512 195.96799999999996l0 465.056 85.504-202.016 219.04-19.008-166.016-144.032 50.016-214.016-188.512 114.016z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="add-circle-fine" unicode="&#58888;" d="M509.989715-60.972421000000054c-246.734474 0-446.75195 200.023616-446.75195 446.75809 0 246.732427 200.017476 446.75195 446.75195 446.75195 246.733451 0 446.757067-200.019523 446.757067-446.75195C956.746782 139.051195 756.723166-60.972421000000054 509.989715-60.972421000000054L509.989715-60.972421000000054zM509.989715 812.433746c-235.633648 0-426.650123-191.014428-426.650123-426.648077 0-235.639788 191.016475-426.654216 426.650123-426.654216 235.638765 0 426.654216 191.014428 426.654216 426.654216C936.643931 621.419318 745.62848 812.433746 509.989715 812.433746L509.989715 812.433746zM527.863804 153.46957999999995l-35.741016 0L492.122789 367.909533 277.678742 367.909533 277.678742 403.653619l214.443024 0L492.121765 618.0956189999999l35.741016 0L527.862781 403.653619l214.442 0 0-35.744086L527.863804 367.909533 527.863804 153.46957999999995 527.863804 153.46957999999995zM527.863804 153.46957999999995"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="prev-circle" unicode="&#58931;" d="M508.638018 827.97307c-246.403458 0-446.845649-200.463469-446.845649-446.845649 0-246.382179 200.442191-446.845649 446.845649-446.845649 246.382179 0 446.845649 200.463469 446.845649 446.845649C955.483667 627.5096 755.041476 827.97307 508.638018 827.97307zM508.638018-23.16149900000005c-222.933422 0-404.28892 181.355498-404.28892 404.28892 0 222.933422 181.355498 404.28892 404.28892 404.28892 222.912144 0 404.28892-181.355498 404.28892-404.28892C912.926939 158.19399899999996 731.57144-23.16149900000005 508.638018-23.16149900000005zM252.87208 485.1999c8.639016 26.129831-32.470784 37.215859-41.067243 11.32009-27.810822-83.730363-22.321004-168.545923 14.086277-248.573851 11.362646-24.938243 48.025268-3.298146 36.747735 21.491148C230.976644 339.081373 228.806251 412.853462 252.87208 485.1999zM599.262572 247.73335499999996l-127.627629 133.394065 127.47868 133.223838c9.043305 9.064583 9.022026 23.789211-0.021278 32.832516-8.809243 8.830521-24.087108 8.766686-32.832516 0l-148.310199-148.310199c-4.617405-4.638683-6.979303-11.064749-6.553736-17.746156-0.404289-6.702685 1.936331-13.107472 6.575015-17.788712l148.310199-148.28892c4.383343-4.383343 10.213615-6.787798 16.405619-6.787798 6.170726 0 12.000997 2.404455 16.405619 6.787798C608.156928 224.114371 608.156928 238.83899899999994 599.262572 247.73335499999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="read" unicode="&#59141;" d="M335.282306 712.495464C399.587328 713.451107 442.778899 696.882717 470.183494 669.3706540000001 479.127332 660.39174 485.691302 650.857363 490.241971 641.442689 492.795622 636.159553 494.049041 632.438701 494.358795 631.0740940000001L493.723712 636.7409230000001 493.723706 196.90019600000005C493.723706 199.018106 495.816045 203.920655 503.591595 207.36436700000002 511.039185 210.66283299999998 515.68422 209.16527399999995 517.176538 207.906613L500.671543 188.33763 521.297207 203.50146800000005C514.140179 213.23636899999997 499.631258 225.71450900000002 476.134074 237.35914000000002 439.577969 255.475456 390.86048 266.10507900000005 328.491925 266.10508200000004 265.860796 266.10508200000004 219.424582 255.71817999999996 186.827162 237.741581 164.977332 225.69198700000004 152.538132 212.28117299999997 147.220271 201.30886999999996L170.257196 190.14374199999997 151.035786 207.05224299999998C152.884078 209.15336100000002 158.307299 211.80336599999998 167.849005 208.050434 177.092077 204.41496099999995 179.2 199.20011699999998 179.2 196.66445199999998L179.2 497.049743 179.2 636.7409230000001 175.817447 624.023021C177.078908 626.226721 180.088681 630.807811 184.828724 636.965629 192.95423 647.521524 202.792594 658.127492 214.297641 668.007961 247.526453 696.544681 287.381649 713.209056 334.514421 712.495571L335.282306 712.495464ZM335.289387 763.689705C274.661039 764.607483 223.081402 743.04085 180.940156 706.850184 156.32698 685.712527 139.975514 664.470237 131.382553 649.4588249999999L128 643.549699 128 636.7409230000001 128 497.049743 128 196.66445199999998C128 159.26104999999995 164.542545 144.88818300000003 189.478606 173.23524099999997L191.776657 175.84764199999995 193.294121 178.978613C194.07832 180.59664399999997 199.156367 186.07133399999998 211.552092 192.907243 236.030601 206.40648099999999 274.024879 214.905082 328.491925 214.905082 383.221547 214.905079 424.163878 205.97190999999998 453.399258 191.483569 469.376966 183.56540600000005 477.614626 176.48075300000005 480.045882 173.17379000000005L481.844905 170.72677999999996 484.166551 168.768644C511.279708 145.90070000000003 544.923706 160.801293 544.923706 196.90019600000005L544.923712 636.740922 544.288627 642.407751C540.427211 659.419023 529.175531 682.697124 506.45814 705.503602 468.987716 743.1209699999999 412.352271 764.846461 334.521502 763.689812L335.289387 763.689705ZM0 506.026694L0 27.856867999999963C0-8.875636999999983 34.793167-23.40043300000002 61.4635 1.2485080000000153L63.46242 3.315859000000046C65.301149 5.444836000000009 69.655573 9.862312999999972 76.498228 15.820363000000043 88.306297 26.101906999999983 102.566352 36.46294 119.251411 46.17438500000003 167.295691 74.13829099999998 224.90855 90.95018200000004 292.337329 90.95018200000004 358.378978 90.95018000000005 409.459345 71.66956600000003 448.125308 39.64774 461.506042 28.56627400000002 472.380655 16.734758000000056 480.912593 4.997000999999955 485.832384-1.7713730000000396 488.762874-6.741985999999997 489.872527-9.02252199999998 496.058545-21.73590200000001 511.379537-27.027375000000006 524.092917-20.84135500000002 536.806298-14.655337000000031 542.097771 0.6656550000000152 535.91175 13.379036000000042 527.471002 30.726293000000055 509.777717 55.06771800000001 480.782336 79.08069999999998 433.134118 118.54132300000003 370.586889 142.15017999999998 292.337329 142.15018199999997 215.474895 142.15018499999996 149.074727 122.77408400000002 93.495781 90.424668 59.761154 70.78961500000003 36.872315 50.859801999999945 24.713677 36.78188399999999L44.088049 20.048869999999965 26.712598 38.84923500000002C28.162783 40.189508000000046 32.877261 41.946117999999956 40.792576 38.64178100000004 49.035365 35.200736000000006 51.2 30.12989200000004 51.2 27.856867999999963L51.2 506.026694C51.2 520.165184 39.73849 531.626694 25.6 531.626694 11.46151 531.626694 0 520.165184 0 506.026694L0 506.026694ZM696.80221 763.689812C618.971441 764.846461 562.335996 743.1209699999999 524.86557 705.503602 502.148181 682.697124 490.896501 659.419023 487.035083 642.407751L486.4 636.740922 486.400004 196.90019600000005C486.400006 160.801293 520.044004 145.90070000000003 547.157161 168.768644L549.478807 170.72677999999996 551.27783 173.17379000000005C553.709086 176.48075300000005 561.946746 183.56540600000005 577.924452 191.483569 607.159834 205.97190999999998 648.102165 214.905079 702.831787 214.905082 757.298833 214.905082 795.293111 206.40648099999999 819.77162 192.907243 832.167345 186.07133399999998 837.245391 180.59664399999997 838.029591 178.978613L839.547055 175.84764199999995 841.845105 173.23524099999997C866.781167 144.88818300000003 903.323712 159.26104999999995 903.323712 196.66445199999998L903.323712 497.049743 903.323712 636.7409230000001 903.323712 643.549699 899.941158 649.4588249999999C891.348196 664.470237 874.996732 685.712527 850.383556 706.850184 808.24231 743.04085 756.662673 764.607483 696.034325 763.689705L696.80221 763.689812ZM696.809291 712.495571C743.942063 713.209056 783.797257 696.544681 817.026071 668.007961 828.531119 658.127492 838.369481 647.521524 846.494989 636.965629 851.235031 630.807811 854.244804 626.226721 855.506263 624.023021L852.123712 636.7409230000001 852.123712 497.049743 852.123712 196.66445199999998C852.123712 199.20011699999998 854.231635 204.41496099999995 863.474707 208.050434 873.016412 211.80336599999998 878.439633 209.15336100000002 880.287925 207.05224299999998L861.066515 190.14374199999997 884.103441 201.30886999999996C878.785579 212.28117299999997 866.346381 225.69198700000004 844.49655 237.741581 811.89913 255.71817999999996 765.462916 266.10508200000004 702.831785 266.10508200000004 640.463232 266.10507900000005 591.745741 255.475456 555.189638 237.35914000000002 531.692454 225.71450900000002 517.183533 213.23636899999997 510.026502 203.50146800000005L530.652166 188.33763 514.147172 207.906613C515.63949 209.16527399999995 520.284527 210.66283299999998 527.732117 207.36436700000002 535.507665 203.920655 537.600004 199.018106 537.600004 196.90019600000005L537.6 636.7409230000001 536.964917 631.0740940000001C537.274671 632.438701 538.52809 636.159553 541.081741 641.442689 545.63241 650.857363 552.196378 660.39174 561.140218 669.3706540000001 588.544813 696.882717 631.736384 713.451107 696.041406 712.495464L696.809291 712.495571ZM972.799998 506.026694L972.799998 27.856867999999963C972.799998 30.12989200000004 974.964631 35.200736000000006 983.207422 38.64178100000004 991.122737 41.946117999999956 995.837214 40.189508000000046 997.287401 38.84923500000002L979.911949 20.048869999999965 999.286321 36.78188399999999C987.127682 50.859801999999945 964.238844 70.78961500000003 930.504218 90.424668 874.925269 122.77408400000002 808.525103 142.15018499999996 731.662669 142.15018199999997 653.132708 142.15017999999998 590.55104 117.26282200000003 543.127755 75.73800100000005 514.370099 50.55719499999998 496.945662 25.10259599999995 488.705389 7.022771000000034 482.841769-5.842485000000011 488.517717-21.02524200000005 501.382974-26.888862000000017 514.248233-32.752481999999986 529.430987-27.07653300000004 535.294607-14.211275 536.420563-11.740835999999945 539.350332-6.450639000000024 544.25735 0.7178109999999833 552.731727 13.097653000000037 563.54464 25.561581000000047 576.856734 37.21792900000003 615.190044 70.78337499999998 665.901421 90.95018000000005 731.662669 90.95018200000004 799.091447 90.95018200000004 856.704307 74.13829099999998 904.748587 46.17438500000003 921.433645 36.46294 935.6937 26.101906999999983 947.501771 15.820363000000043 954.344425 9.862312999999972 958.698848 5.444836000000009 960.537577 3.315859000000046L962.536497 1.2485080000000153C989.206831-23.40043300000002 1023.999998-8.875636999999983 1023.999998 27.856867999999963L1023.999998 506.026694C1023.999998 520.165184 1012.538487 531.626694 998.399998 531.626694 984.261508 531.626694 972.799998 520.165184 972.799998 506.026694L972.799998 506.026694Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="404" unicode="&#58908;" d="M300.197309 299.705317l4.427931 1.803972c1.147982-2.787956 10.167841-7.543882 26.89558-14.267777l5.411915-12.955798c10.659833-24.927611 23.123639-62.483024 37.555413-112.66624 14.431775 5.575913 34.439462 0.983985 60.351057-13.611787l1.803972-4.427931L389.575913 107.828315l18.203716-42.639334c2.459962-5.575913-12.463805-15.579757-44.7713-29.847534-11.151826 7.215887-19.84369 9.675849-26.403587 7.05189l-0.983985 2.131967c-10.823831 25.419603-16.235746 42.311339-16.399744 50.675208l-4.427931-1.803972 6.3959-14.923767-11.151826-4.263933c-41.655349-16.235746-71.830878-18.695708-90.690583-7.871877l-4.427931-1.803972-1.803972 4.263933c-7.05189 16.727739 3.607944 77.406791 32.307495 182.037156 11.479821 4.427931 19.1877 14.923767 22.959641 31.323511C281.337604 290.685458 291.83344 296.425368 300.197309 299.705317L300.197309 299.705317zM216.230621 80.276746c28.371557 19.515695 40.999359 32.799488 38.047406 39.68738-0.983985 2.131967-0.65599 5.575913 0.65599 10.167841l-0.983985 2.131967c-25.5836-21.483664-38.047406-32.963485-37.391416-34.439462C215.246637 88.804612 215.082639 83.064702 216.230621 80.276746L216.230621 80.276746zM216.722614 72.896861l0.983985-2.131967c11.643818 1.147982 21.155669 3.279949 28.699552 6.231903 0.819987 0.327995 7.379885 5.411915 19.84369 15.251762l-0.983985 2.131967c-7.543882-2.951954-12.7918-0.983985-15.743754 6.067905C226.398463 85.032671 215.574632 75.848815 216.722614 72.896861L216.722614 72.896861zM225.90647 143.743754l11.151826 4.263933c-1.147982-2.623959-6.3959-8.691864-15.579757-18.53171-2.295964-10.823831-2.787956-17.547726-1.639974-20.335682 27.715567 20.663677 40.34337 33.783472 37.883408 39.523382l0.819987 10.331839-3.443946-3.935939-9.019859-3.443946-0.983985 2.131967c11.151826 4.263933 17.875721 16.891736 20.49968 37.719411l-0.983985 2.131967C239.35426 172.443306 227.21845 160.307495 227.874439 157.027546L225.90647 143.743754 225.90647 143.743754zM231.646381 173.42729l0.983985-2.131967 2.131967 0.819987c28.371557 23.123639 40.179372 40.179372 35.423447 51.331198 1.475977 0.65599 1.967969 1.639974 1.475977 2.951954l-2.295964-0.819987c-28.863549-21.647662-40.999359-38.047406-36.407431-49.035234C231.482383 175.723254 230.990391 174.73927 231.646381 173.42729L231.646381 173.42729zM240.994234 211.966688l0.983985-2.131967c13.775785 10.331839 35.915439 29.847534 66.418962 58.21909l2.131967 0.819987-6.3959 14.923767 0.491992 5.083921-2.295964-0.819987c-36.571429-32.963485-55.431134-51.82319-56.579116-56.743113L240.994234 211.966688 240.994234 211.966688zM311.67713 107.336323l-35.751441-13.939782c-1.475977-0.491992-6.887892-4.263933-16.235746-11.315823l0.819987-1.967969 12.299808 2.131967 20.007687 7.871877c11.643818 4.591928 32.143498 19.84369 61.171044 46.08328l-6.3959 14.923767-2.131967-0.819987c-24.107623-16.891736-34.439462-29.191544-31.159513-36.899423C315.449071 110.616272 314.629084 108.484305 311.67713 107.336323L311.67713 107.336323zM267.889814 264.773863l0.819987-1.967969c17.875721 16.891736 27.387572 25.419603 28.207559 25.747598l-0.983985 2.131967-8.855862-3.443946C274.941704 282.485586 268.545804 274.941704 267.889814 264.773863L267.889814 264.773863zM275.597694 222.954516c16.071749-37.883408 20.007687-67.894939 11.971813-90.034593l-3.443946-28.863549 26.89558 10.495836c-7.543882 30.011531-18.367713 65.598975-32.471493 106.926329l-0.983985 2.131967L275.597694 222.954516 275.597694 222.954516zM279.369635 231.810378l6.3959-14.923767c13.44779 15.087764 24.435618 24.271621 32.63549 27.55157l-3.607944 8.527867-2.459962 11.643818-2.131967-0.819987C289.045484 247.06214 278.713645 236.566304 279.369635 231.810378L279.369635 231.810378zM292.817425 194.58296c23.943626 17.219731 33.619475 30.995516 29.191544 41.491352l-2.787956 6.3959-2.295964-0.819987c-21.483664-18.859705-30.667521-31.651505-27.879564-38.3754L292.817425 194.58296 292.817425 194.58296zM294.457399 190.483024l2.787956-6.3959 2.295964-11.807816 2.295964 0.819987-0.491992-5.083921 6.3959-14.923767 32.471493 27.387572-6.3959 15.087764c-9.347854-10.331839-16.235746-16.399744-20.827675-18.203716l-2.295964-0.983985c-0.65599 1.639974 6.067905 10.167841 20.335682 25.419603l-3.115951 13.611787-0.983985 2.131967L294.457399 190.483024 294.457399 190.483024zM307.413197 148.171685l2.787956-6.3959 2.295964-11.643818c23.943626 17.219731 35.259449 27.387572 33.94747 30.503523l-5.411915 12.955798C329.224856 165.719411 318.07303 157.191544 307.413197 148.171685L307.413197 148.171685zM355.792441 131.935939c-23.779628-17.711723-34.111467-30.011531-30.995516-37.227418l1.475977-9.347854c25.255605 18.039718 36.899423 29.355541 34.931454 33.783472 24.435618 21.155669 38.703395 32.471493 42.803331 33.94747l-0.819987 1.967969c-1.803972 2.787956-6.723895 4.099936-14.595772 4.427931l-30.831518-31.9795L355.792441 131.935939 355.792441 131.935939zM327.912876 81.26073l4.591928-10.659833-0.491992-5.083921 2.295964 0.819987c23.451634 14.595772 34.275464 23.615631 32.63549 27.55157l-5.411915 12.955798L327.912876 81.26073 327.912876 81.26073zM333.816784 61.253043l5.411915-12.7918c25.747598 13.283792 37.719411 22.139654 35.915439 26.403587l-4.591928 10.659833C348.412556 70.272902 336.112748 62.237028 333.816784 61.253043L333.816784 61.253043zM357.596413 139.971813l1.803972-4.099936c4.919923 1.967969 8.527867 9.839846 10.823831 23.943626l-2.295964-0.819987C364.648302 147.679693 361.204356 141.44779 357.596413 139.971813L357.596413 139.971813zM731.674568 256.081999l3.935939-0.163997c-0.163997-2.459962 4.755926-9.019859 14.759769-19.515695l-0.65599-11.315823c-1.147982-21.975657-5.411915-53.955157-12.955798-95.774504 12.627803-0.65599 25.911595-10.659833 39.68738-30.175529l-0.163997-3.935939-47.887252-10.823831-1.967969-37.719411c-0.327995-4.919923-14.923767-7.379885-43.951313-7.379885-5.575913 9.019859-11.151826 13.775785-16.891736 13.939782l0.163997 1.967969c1.147982 22.467649 3.279949 36.735426 6.231903 42.967329l-3.935939 0.163997-0.65599-13.119795-9.839846 0.491992c-36.571429 1.803972-60.023062 9.839846-70.026906 24.271621l-3.935939 0.163997 0.163997 3.771941c0.819987 14.759769 30.667521 56.087124 89.706598 124.14606 10.167841-0.491992 19.515695 4.755926 28.371557 15.579757C714.290839 255.754004 724.294683 256.573991 731.674568 256.081999L731.674568 256.081999zM587.848815 115.86419l-0.163997-1.967969c9.019859-2.951954 16.891736-4.591928 23.615631-4.919923 0.65599 0 7.379885 1.475977 20.171685 4.755926l0.163997 1.967969c-6.723895 0.327995-9.839846 3.607944-9.511851 9.675849C599.328635 121.6041 588.012812 118.324151 587.848815 115.86419L587.848815 115.86419zM590.144779 121.440102c28.043562 5.083921 42.147341 10.659833 42.475336 16.727739 0.163997 1.803972 1.475977 4.263933 4.099936 7.215887l0.163997 1.967969c-26.731582-7.379885-40.015375-11.807816-40.179372-13.119795C592.440743 128.163997 590.308776 123.900064 590.144779 121.440102L590.144779 121.440102zM620.15631 165.227418l9.839846-0.491992c-1.803972-1.475977-7.871877-4.427931-18.367713-8.527867-5.575913-7.215887-8.527867-12.13581-8.527867-14.595772 28.043562 6.067905 42.147341 11.643818 42.311339 16.727739l4.263933 7.379885-3.935939-1.803972-8.035874 0.327995 0.163997 1.967969c9.839846-0.491992 19.351698 6.559898 28.863549 21.155669l0.163997 1.967969c-26.23959-7.379885-39.68738-12.463805-40.34337-14.923767L620.15631 165.227418 620.15631 165.227418zM670.667521 109.960282l-31.487508 1.475977c-1.31198 0-6.559898-0.983985-16.071749-2.951954l-0.163997-1.803972 9.839846-2.459962 17.711723-0.819987c10.331839-0.491992 30.995516 4.099936 61.991031 13.939782l0.65599 13.119795-1.803972 0.163997c-23.943626-4.591928-36.079436-10.167841-36.407431-16.891736C674.603459 110.944266 673.29148 109.796284 670.667521 109.960282L670.667521 109.960282zM635.244074 185.399103l-0.163997-1.967969 1.803972-0.163997c29.355541 7.70788 44.279308 16.563741 44.7713 26.23959 1.31198 0 2.131967 0.491992 2.131967 1.639974l-1.967969 0.163997c-29.191544-6.3959-44.115311-14.595772-44.607303-24.271621C635.900064 187.039078 635.244074 186.547085 635.244074 185.399103L635.244074 185.399103zM685.755285 207.37476c-1.803972-33.29148-9.675849-56.907111-23.615631-70.682896l-12.955798-20.171685 23.779628-1.147982c5.247918 24.763613 10.167841 54.611147 14.595772 89.870596l0.163997 1.967969L685.755285 207.37476 685.755285 207.37476zM656.071749 210.818706l-0.163997-1.967969c13.939782 3.115951 37.391416 10.167841 70.354901 21.155669l1.803972-0.163997 0.65599 13.119795 2.295964 3.607944-1.967969 0.163997c-39.03139-12.299808-59.859065-20.007687-62.483024-23.287636L656.071749 210.818706 656.071749 210.818706zM670.339526 68.46893l-0.65599-11.315823c23.943626 1.31198 35.915439 3.935939 36.079436 7.70788l0.491992 9.347854C684.443306 70.272902 672.471493 68.304933 670.339526 68.46893L670.339526 68.46893zM673.29148 85.196669l-0.491992-9.347854-2.295964-3.607944 1.967969-0.163997c22.631646 2.951954 33.94747 6.231903 34.111467 9.511851l0.65599 11.315823L673.29148 85.196669 673.29148 85.196669zM712.158873 113.568225c-23.943626-5.247918-36.079436-10.987828-36.407431-17.219731l-2.295964-7.379885c25.255605 5.083921 37.883408 9.511851 38.211403 13.44779 25.747598 7.543882 40.34337 11.151826 43.951313 10.987828l0.163997 1.803972c-0.327995 2.623959-3.443946 5.247918-9.347854 8.035874l-34.439462-13.44779L712.158873 113.568225 712.158873 113.568225zM682.147341 141.611787l-0.327995-5.73991-2.459962-9.347854c23.943626 4.755926 36.079436 8.691864 36.079436 11.479821l0.65599 11.315823C704.778988 147.351698 693.463165 144.727739 682.147341 141.611787L682.147341 141.611787zM688.051249 177.199231l-0.327995-5.73991-2.623959-9.511851 1.967969-0.163997-2.295964-3.607944-0.65599-13.119795 33.94747 9.511851 0.65599 13.283792c-10.659833-4.591928-18.039718-6.723895-21.975657-6.559898l-1.967969 0.163997c0 1.475977 8.199872 5.411915 24.271621 12.13581l2.623959 11.151826 0.163997 1.967969L688.051249 177.199231 688.051249 177.199231zM688.215247 180.807175c23.943626 4.755926 36.243434 11.807816 36.735426 20.991672l0.327995 5.73991-1.967969 0.163997c-22.631646-6.887892-34.275464-13.283792-34.603459-19.1877L688.215247 180.807175 688.215247 180.807175zM691.82319 212.786675l-0.65599-13.119795c15.415759 6.723895 26.89558 10.003844 34.111467 9.511851l0.327995 7.543882 2.459962 9.511851-1.803972 0.163997C704.450993 220.986547 692.971172 216.558616 691.82319 212.786675L691.82319 212.786675zM695.103139 240.994234l-0.163997-1.803972c19.351698 6.559898 29.355541 9.839846 30.339526 9.839846l0.163997 1.967969-7.871877 0.327995C706.746957 251.818065 699.367072 248.374119 695.103139 240.994234L695.103139 240.994234zM716.422806 118.980141l-0.163997-3.607944c4.427931-0.163997 10.003844 4.427931 16.727739 14.10378l-1.967969 0.163997C724.45868 122.26009 719.538757 118.816143 716.422806 118.980141L716.422806 118.980141zM479.118514 382.196028c53.627162 10.167841 89.870596 1.967969 109.222293-24.599616 9.675849-18.695708 15.579757-33.455477 17.875721-44.279308 11.807816-56.743113-5.903908-103.154388-53.299167-138.741832-12.463805-5.083921-22.631646-8.363869-30.339526-10.003844-31.651505-6.067905-63.631006 5.083921-95.938501 33.455477-9.347854 16.399744-15.251762 31.159513-18.039718 44.279308-13.283792 63.795003 1.967969 108.238309 45.919283 133.165919L479.118514 382.196028 479.118514 382.196028zM410.075593 265.429853c6.231903 5.247918 11.479821 8.199872 15.579757 9.019859-9.675849-9.347854-14.431775-15.087764-13.939782-17.219731-0.327995-5.411915-0.163997-10.167841 0.819987-14.267777l2.131967 0.327995c24.271621 15.743754 35.915439 25.5836 35.095452 29.519539l-2.131967 10.003844c-4.099936-3.607944-8.035874-5.73991-11.643818-6.559898l-0.819987 4.099936c10.823831 2.131967 15.251762 11.971813 13.44779 29.519539l-1.967969-0.327995c-22.467649-16.399744-34.603459-27.715567-36.407431-33.94747C409.255605 273.30173 409.255605 269.857783 410.075593 265.429853L410.075593 265.429853zM410.23959 286.257527c33.127482 21.647662 47.887252 40.34337 44.607303 56.251121-29.683536-23.615631-44.443306-36.079436-44.279308-37.555413C409.747598 295.769379 409.5836 289.537476 410.23959 286.257527L410.23959 286.257527zM412.699552 315.777066l0.491992-2.131967c27.059577 20.663677 44.607303 37.227418 52.643177 49.527226 10.331839 1.967969 17.055734 7.379885 20.49968 16.235746l-2.131967-0.491992C447.303011 372.028187 423.523382 350.872518 412.699552 315.777066L412.699552 315.777066zM414.339526 234.926329c2.459962-4.919923 4.263933-9.347854 5.083921-13.44779 18.859705 14.759769 30.339526 22.467649 34.111467 23.123639l-3.771941 18.039718C444.18706 261.493914 432.379244 252.310058 414.339526 234.926329L414.339526 234.926329zM421.883408 220.002562c2.131967-9.839846 5.247918-14.759769 9.675849-14.759769l27.879564 21.975657c-0.327995 1.147982-2.131967 6.231903-5.411915 15.415759C437.299167 228.530429 426.639334 220.986547 421.883408 220.002562L421.883408 220.002562zM432.707239 199.174888c5.083921-5.903908 8.527867-8.691864 10.495836-8.363869l3.935939 0.819987c10.987828 10.495836 19.1877 16.235746 24.599616 17.219731-0.819987 3.935939-3.935939 8.855862-9.511851 14.759769C442.21909 209.014734 432.379244 200.814862 432.707239 199.174888L432.707239 199.174888zM448.450993 185.563101l0.491992-2.131967c2.459962 0.491992 6.3959-0.819987 11.807816-3.771941 18.859705 10.003844 28.207559 16.727739 28.207559 19.84369-6.067905 1.639974-9.511851 4.427931-10.331839 8.363869C466.818706 202.946829 456.814862 195.566944 448.450993 185.563101L448.450993 185.563101zM469.442665 179.331198l0.491992-2.131967 14.923767 0.65599 12.627803 2.459962c2.459962 0.491992 8.199872 3.771941 17.547726 9.839846l-0.491992 2.131967c-6.887892-1.31198-13.611787 0.163997-20.49968 4.263933L469.442665 179.331198 469.442665 179.331198zM476.494555 249.030109l4.591928-21.811659c2.951954-14.431775 12.463805-25.091608 28.535554-31.9795l4.099936 0.819987c24.599616 34.275464 32.143498 73.798847 22.795644 118.570147l-2.459962 11.971813-6.231903 19.515695-6.067905-1.147982c-3.935939-0.819987-14.267777 0-30.831518 2.295964C473.870596 316.597053 469.278668 283.961563 476.494555 249.030109L476.494555 249.030109zM476.494555 363.172325l0.327995-1.967969c10.823831-2.131967 17.547726-3.115951 20.007687-2.623959 13.939782 10.167841 21.647662 17.875721 23.287636 23.287636l-21.319667-1.967969C496.174247 379.408072 488.630365 373.832159 476.494555 363.172325L476.494555 363.172325zM508.966047 363.172325l3.771941 2.787956c1.147982 0.163997 6.231903-2.951954 15.087764-9.675849 10.331839 13.119795 18.203716 20.171685 23.779628 21.155669-0.65599 2.951954-8.199872 4.263933-22.467649 4.099936C515.361947 370.716208 508.638053 364.648302 508.966047 363.172325L508.966047 363.172325zM511.590006 185.235106l0.491992-2.131967 4.099936 0.819987c19.84369 3.771941 35.751441 17.219731 47.723254 40.34337C554.557335 214.754644 537.173607 201.634849 511.590006 185.235106L511.590006 185.235106zM521.921845 197.534914c38.211403 24.271621 56.087124 42.311339 53.79116 53.79116 1.967969 4.919923 2.623959 8.527867 2.295964 10.823831-35.095452-26.567585-51.495195-44.935298-49.363229-54.939142C526.349776 206.71877 524.217809 203.602819 521.921845 197.534914L521.921845 197.534914zM528.64574 352.348495l7.543882-15.251762 2.131967 0.491992c4.263933 5.73991 13.283792 14.431775 27.059577 25.911595l-0.491992 2.131967c-5.411915 5.247918-8.363869 8.855862-8.855862 10.823831l-4.099936-0.819987L528.64574 352.348495 528.64574 352.348495zM536.845612 333.324792l4.263933-9.675849-0.491992-8.363869 4.099936 0.819987c19.515695 17.711723 29.027546 27.059577 28.863549 28.371557l-0.491992 2.131967c-1.967969 9.347854-4.263933 13.611787-7.05189 13.119795C548.817425 342.508648 539.141576 333.652787 536.845612 333.324792L536.845612 333.324792zM539.797566 236.402306c27.715567 19.84369 40.999359 32.63549 39.68738 38.703395 1.31198 7.215887 1.803972 12.13581 1.147982 14.759769l-1.967969-0.327995-35.095452-29.519539C540.78155 245.586163 539.469571 237.714286 539.797566 236.402306L539.797566 236.402306zM542.257527 307.413197l2.459962-11.971813 10.003844 3.935939c-7.05189-7.871877-10.331839-12.627803-10.003844-14.267777-0.65599-10.495836-0.819987-16.727739-0.327995-18.695708 18.695708 13.611787 30.831518 24.927611 36.243434 33.94747l-2.459962 11.971813c-7.05189-7.05189-12.7918-10.987828-16.727739-11.807816 8.035874 11.315823 13.939782 17.383728 17.711723 18.039718l-4.099936 19.84369C554.557335 320.532992 543.733504 310.201153 542.257527 307.413197L542.257527 307.413197zM307.249199 569.153107c-9.675849 0-17.711723-6.887892-19.84369-16.071749-4.263933-12.463805 1.639974-28.863549 29.519539-35.751441 1.31198 35.587444 0 49.527226 0 49.527226C313.809097 568.33312 310.693145 569.153107 307.249199 569.153107L307.249199 569.153107zM709.862908 537.173607c0-1.147982 0-2.131967-0.163997-3.115951 2.131967 3.279949 3.279949 7.215887 3.279949 11.479821 0 11.643818-9.183857 21.155669-20.49968 21.155669-3.443946 0-6.723895-0.819987-9.511851-2.459962C697.891095 563.905189 709.862908 551.933376 709.862908 537.173607L709.862908 537.173607zM531.761691 520.281871c0.65599 15.743754-32.963485 49.199231-32.963485 49.199231 0-18.203716 9.347854-42.803331 12.463805-48.707239-8.035874-11.643818-13.283792-32.307495-13.283792-32.307495S531.105701 504.374119 531.761691 520.281871L531.761691 520.281871zM488.794363 507.326073c2.459962 0 4.427931 1.967969 4.427931 4.427931 0 2.459962-1.967969 4.427931-4.427931 4.427931-2.459962 0-4.427931-1.967969-4.427931-4.427931C484.366432 509.294042 486.334401 507.326073 488.794363 507.326073L488.794363 507.326073zM445.335042 629.668161c-0.819987 8.855862-2.131967 16.235746-2.131967 16.235746s-53.627162 7.05189-63.959001-30.503523C395.151826 632.94811 427.623318 631.144138 445.335042 629.668161L445.335042 629.668161zM620.648302 614.908392c-9.675849 37.719411-63.303011 31.651505-63.303011 31.651505s-1.475977-7.379885-2.459962-16.235746C572.597053 631.636131 605.232543 632.784113 620.648302 614.908392L620.648302 614.908392zM419.587444 518.313901c29.847534 0 53.955157 21.975657 53.955157 49.035234 0 27.059577-24.271621 49.035234-53.955157 49.035234-29.847534 0-53.955157-21.975657-53.955157-49.035234C365.632287 540.289558 389.903908 518.313901 419.587444 518.313901L419.587444 518.313901zM419.587444 613.76041c28.371557 0 51.331198-20.827675 51.331198-46.411275 0-25.5836-22.959641-46.411275-51.331198-46.411275-28.207559 0-51.331198 20.827675-51.331198 46.411275C368.256246 592.932735 391.379885 613.76041 419.587444 613.76041L419.587444 613.76041zM419.587444 534.38565c20.007687 0 36.243434 14.759769 36.243434 32.799488 0 18.203716-16.235746 32.799488-36.243434 32.799488s-36.243434-14.759769-36.243434-32.799488C383.34401 549.14542 399.579757 534.38565 419.587444 534.38565L419.587444 534.38565zM435.331198 552.261371c1.967969 2.131967 4.919923 2.623959 6.559898 1.147982 1.639974-1.475977 1.475977-4.263933-0.491992-6.3959-1.967969-2.131967-4.919923-2.623959-6.559898-1.147982C433.035234 547.341448 433.199231 550.129404 435.331198 552.261371L435.331198 552.261371zM395.971813 585.880846c5.411915 5.73991 13.283792 7.05189 17.875721 3.115951 4.591928-3.935939 3.935939-11.807816-1.475977-17.547726-5.411915-5.73991-13.283792-7.05189-17.875721-3.115951C389.903908 572.433056 390.559898 580.304933 395.971813 585.880846L395.971813 585.880846zM584.240871 518.313901c29.847534 0 53.955157 21.975657 53.955157 49.035234 0 27.059577-24.271621 49.035234-53.955157 49.035234-29.847534 0-53.955157-21.975657-53.955157-49.035234C530.121717 540.289558 554.393338 518.313901 584.240871 518.313901L584.240871 518.313901zM584.240871 613.76041c28.371557 0 51.331198-20.827675 51.331198-46.411275 0-25.5836-22.959641-46.411275-51.331198-46.411275-28.207559 0-51.331198 20.827675-51.331198 46.411275C532.909673 592.932735 555.869315 613.76041 584.240871 613.76041L584.240871 613.76041zM584.240871 534.38565c20.007687 0 36.243434 14.759769 36.243434 32.799488 0 18.203716-16.235746 32.799488-36.243434 32.799488-20.007687 0-36.243434-14.759769-36.243434-32.799488C547.997438 549.14542 564.233184 534.38565 584.240871 534.38565L584.240871 534.38565zM599.820628 552.261371c1.967969 2.131967 4.919923 2.623959 6.559898 1.147982 1.639974-1.475977 1.475977-4.263933-0.491992-6.3959-1.967969-2.131967-4.919923-2.623959-6.559898-1.147982C597.688661 547.341448 597.852659 550.129404 599.820628 552.261371L599.820628 552.261371zM560.62524 585.880846c5.411915 5.73991 13.283792 7.05189 17.875721 3.115951 4.591928-3.935939 3.935939-11.807816-1.475977-17.547726-5.411915-5.73991-13.283792-7.05189-17.875721-3.115951C554.557335 572.433056 555.213325 580.304933 560.62524 585.880846L560.62524 585.880846zM957.171044 381.540038C957.171044 381.540038 957.171044 381.540038 957.171044 381.540038c-0.65599 0.983985-1.31198 1.803972-1.967969 2.951954-0.327995 0.327995-0.491992 0.65599-0.819987 0.983985-0.327995 0.327995-1.967969 0.65599-2.295964 0.983985-11.315823 14.759769-29.355541 40.34337-62.975016 46.247277l0 34.931454c0 4.263933-0.819987 8.691864-5.083921 8.691864L685.919283 476.330557c-0.163997 10.331839-0.327995 18.203716-0.65599 27.879564 24.435618 1.803972 43.295324 19.351698 43.295324 41.491352 0 22.467649-19.84369 40.671365-45.263293 41.819347-1.967969 78.226778-5.903908 143.98975-7.70788 150.549648l-0.491992 0.983985c-1.967969 2.295964-9.511851 5.247918-21.155669 8.363869 0.327995 13.939782-3.279949 29.355541-11.643818 46.08328 3.443946-21.647662-22.795644-36.079436-26.567585-38.047406-0.163997 0-0.327995 0-0.491992 0 0.163997 4.427931 0 57.727098-88.230621 97.90647-1.475977-44.115311-14.10378-70.682896-31.9795-86.754644L494.534273 766.606022l-5.411915-0.327995 0-0.163997 0 0 0 0 0.327995 0 0.327995-0.163997c-0.819987-0.163997-0.983985-0.491992-1.147982-1.147982-10.331839-8.035874-28.043562-18.203716-64.450993-18.203716-13.283792 0-28.207559 1.31198-44.607303 3.935939-4.099936 0.819987-7.70788 1.147982-11.151826 1.147982-5.575913 0-10.003844-0.983985-16.071749-2.295964l-0.327995 0-0.327995-0.163997c-17.547726-4.099936-27.55157-7.70788-30.011531-10.659833l-0.491992-0.983985c-0.491992-2.131967-2.295964-8.363869-5.73991-150.549648-25.255605-0.983985-45.263293-19.351698-45.263293-41.983344 0-22.139654 18.859705-39.523382 43.459321-41.163357-0.163997-9.675849-0.327995-17.547726-0.65599-27.879564L132.099936 476.002562c-4.427931 0-10.495836-4.591928-10.495836-8.691864l0-97.414478c-11.807816-0.65599-19.679693-2.295964-26.731582-4.755926-29.027546-10.495836-35.751441-35.915439-35.587444-60.023062 0-1.475977 0.491992-2.787956 0.983985-3.771941-6.723895-11.643818-6.231903-25.5836-5.083921-35.587444 0.983985-8.035874 2.623959-12.13581 4.427931-13.939782-4.263933-8.855862-0.983985-18.859705 1.967969-26.731582 3.771941-10.167841 12.13581-11.971813 22.139654-10.003844-4.755926-9.019859-2.459962-17.219731 11.643818-28.699552 4.427931-3.607944 14.267777 7.05189 26.075593 16.071749l0-267.151826c0-4.263933 6.067905-6.067905 10.331839-6.067905l751.928251 0c4.427931 0 5.083921 1.803972 5.083921 6.067905L888.784113 248.374119c16.727739 0.983985 29.355541 7.70788 38.539398 19.84369 4.591928 6.231903 7.871877 11.807816 8.691864 16.891736C977.670724 313.153107 982.262652 344.640615 957.171044 381.540038L957.171044 381.540038zM316.433056 508.638053c-22.959641 0.491992-40.835362 16.727739-40.835362 36.735426 0 20.335682 18.859705 36.899423 41.983344 36.899423l0 2.623959 0.163997-0.65599c0-0.819987 0-1.475977 0-2.295964 0.491992 0.163997 0.983985 0.163997 1.475977 0.327995l1.803972 0 0 0.491992c5.247918 1.31198 12.7918 2.951954 19.351698 3.771941 10.003844 35.095452 34.111467 64.122998 34.111467 64.122998s-9.839846 28.863549-13.939782 67.238949c51.167201-85.11467 229.268418-81.178732 280.107623-10.823831-4.591928-32.799488-12.627803-56.415119-12.627803-56.415119s24.107623-28.863549 34.111467-64.122998c6.559898-0.819987 13.939782-1.147982 19.023703-2.295964 0 0.491992 0 2.623959 0 2.623959l0.491992 0c23.123639 0 41.983344-18.695708 41.983344-39.03139 0-9.347854-3.935939-18.695708-10.495836-25.419603-10.167841-6.723895-25.091608-10.331839-40.835362-10.331839 0-6.723895 0.983985-19.351698 1.803972-35.423447L318.401025 476.658552c0.163997 10.331839 0.491992 19.84369 0.65599 30.175529l0 2.131967L316.433056 508.638053 316.433056 508.638053zM126.524023 462.554773c0 4.099936 6.3959 9.183857 10.823831 9.183857l741.432415 0c4.263933 0 5.575913-4.919923 5.575913-9.183857l0-29.027546c0 0.491992-6.723895 1.475977-10.823831 1.147982-22.795644-2.295964-44.443306-3.607944-60.679052-9.183857L176.215247 425.491352l-1.31198-2.787956 0-60.18706c-10.823831 5.903908-25.5836 8.363869-48.215247 7.871877L126.68802 462.554773 126.524023 462.554773zM821.381166-13.693786 180.807175-13.693786 180.807175 282.649584c10.823831 4.263933 15.579757 10.987828 15.087764 21.975657-0.491992 8.363869-4.263933 13.611787-15.087764 16.727739l0 7.379885c5.903908 1.967969 3.935939 4.263933 5.247918 6.723895 5.411915 10.495836 5.575913 18.203716-5.247918 23.779628l0 55.759129 615.318386 0c-2.787956-5.575913-4.755926-7.871877-5.575913-12.299808-1.475977-8.035874-1.639974-18.367713-1.147982-28.207559L697.891095 315.449071c0 0-28.371557-15.251762-16.727739-32.799488 11.643818-17.383728 32.307495-11.479821 50.511211-0.327995 12.13581 7.379885 39.68738 23.287636 63.959001 40.179372 0.163997-0.163997 0.327995-0.163997 0.491992-0.327995-1.803972-1.31198-2.951954-2.295964-2.951954-2.295964-11.151826-7.543882-6.887892-36.899423 15.415759-41.327354 3.115951-0.65599 9.675849 0 9.675849 1.147982l0-293.391416L821.381166-13.693786 821.381166-13.693786zM177.855221 271.169763c0 3.443946-2.131967 6.231903-4.755926 8.035874 1.639974 0.491992 3.771941 0.983985 4.755926 1.475977L177.855221 271.169763 177.855221 271.169763zM177.855221 322.828956c-0.983985 0.163997-1.639974 0.327995-2.459962 0.491992 0.819987 0.491992 1.475977 0.983985 2.459962 1.475977L177.855221 322.828956 177.855221 322.828956zM878.780269-65.516976 137.347854-65.516976c-4.263933 0-10.823831 2.131967-10.823831 6.3959L126.524023 206.882767c5.903908 1.147982 4.919923 2.295964 6.723895 3.279949 19.679693 8.035874 38.047406 25.255605 25.747598 33.127482-0.163997 0-1.475977 0.163997-1.639974 0.163997 9.511851 3.771941 17.547726 9.839846 17.547726 20.663677l0-289.29148 655.169763 2.459962 0 291.915439c9.839846-9.675849 21.647662-14.595772 34.603459-10.331839 3.279949-6.559898 13.611787-9.839846 19.515695-10.331839l0-307.495195C884.192184-63.38501 883.044202-65.516976 878.780269-65.516976L878.780269-65.516976zM878.780269-65.516976"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="carousel" unicode="&#58932;" d="M1002.069333 144.38400000000001L1002.069333 611.6906670000001c0 24.213333-16.917333 49.578667-42.069333 49.578667l-64 0 1.152 6.4c0 31.338667-26.005333 57.6-58.538667 57.6L186.432 725.269333c-31.936 0-58.410667-31.957333-58.410667-64l-0.213333 0.96L67.178667 662.229333c-25.152 0-45.226667-20.288-45.226667-44.501333l0-467.328L21.354667 150.39999999999998c0-24.789333 20.629333-44.693333 45.312-44.693333L127.786667 105.70666700000004l0-5.184C127.786667 69.03466700000001 153.792 42.66666699999996 186.432 42.66666699999996l652.842667 0c31.658667 0 56.277333 10.901333 56.725333 42.602667l64 0c24.661333 0 42.666667 34.325333 42.666667 59.114667L1002.069333 144.38400000000001zM128 149.26933299999996L64 149.26933299999996l0 469.333333 64 0L128 149.26933299999996zM853.333333 106.602667c0-6.421333-14.848-21.333333-21.333333-21.333333l-640 0c-6.485333 0-21.333333 14.848-21.333333 21.333333l0 554.666667c0 6.378667 9.258667 18.56 15.744 18.56l5.589333 2.773333 640 0c6.442667 0 21.333333-14.954667 21.333333-21.333333L853.333333 106.602667zM960 127.93600000000004l-64 0 0 490.666667 60.842667 1.984c4.970667 0 3.157333 2.944 3.157333-1.984l0-469.333333C960 144.29866700000002 965.013333 127.93600000000004 960 127.93600000000004zM412.458667 399.829333c43.925333 0 79.637333 34.773333 79.637333 77.482667 0 42.752-35.712 77.482667-79.637333 77.482667-43.925333 0-79.637333-34.730667-79.637333-77.482667C332.8 434.602667 368.533333 399.829333 412.458667 399.829333zM412.458667 516.0533330000001c21.952 0 39.829333-17.365333 39.829333-38.741333 0-21.333333-17.877333-38.741333-39.829333-38.741333-21.952 0-39.829333 17.408-39.829333 38.741333C372.629333 498.709333 390.506667 516.0533330000001 412.458667 516.0533330000001zM785.92 457.386667c-95.914667-23.338667-137.728-87.765333-168.256-134.805333-24.213333-37.269333-39.082667-58.346667-65.109333-58.346667l-0.042667 0c-35.456 0-57.109333 14.272-80.042667 28.16-24.362667 14.741333-49.536 29.952-88.64 29.952-75.648 0-156.906667-93.269333-165.930667-103.893333L213.333333 167.38133300000004c0-10.709333 8.917333-18.112 19.925333-18.112l557.504 0c10.986667 0 19.904 7.402667 19.904 18.112L810.666667 438.570667c0 5.973333-2.837333 11.626667-7.658667 15.296C798.186667 457.536 791.872 458.858667 785.92 457.386667zM770.858667 188.52266699999996L253.162667 188.52266699999996c24.874667 27.733333 85.290667 95.082667 130.666667 95.082667 27.733333 0 46.229333-11.157333 67.605333-24.128 25.152-15.168 53.632-32.426667 99.712-33.941333l2.944-0.064c47.637333 0 71.722667 37.12 97.237333 76.416 26.645333 41.088 56.469333 79.104 119.530667 102.485333L770.858667 188.52266699999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="help" unicode="&#58887;" d="M690.2 741.8C635.2 783.6 573.2 798 494.6 798c-59.6 0-110.6-12.2-151-39.4C284 718 256 649.8 256 542l153.6 0c0 28.8-2.8 59.8 14 86.4 16.8 26.6 40.2 47 80.4 47 40.8 0 61.8-11.8 81.6-36.2 16.8-20.8 23.2-45.6 23.2-72 0-22.8-11.6-43.8-25.4-62.8-7.6-11.2-17.6-21.2-30.2-30.8 0 0-83-49.4-112.2-96.2-21.8-34.8-29.6-78.4-31.4-130.6-0.2-3.8 1.2-11.6 14.4-11.6 13 0 112 0 123.6 0 11.6 0 14 8.8 14.2 12.4 0.8 19 3.2 48.2 6.6 59.2 6.6 20.8 19.4 39 39.4 54.6l41.4 28.6c37.4 29.2 67.2 53 80.4 71.8 22.6 30.8 38.4 68.8 38.4 113.8C768 649 741 703.2 690.2 741.8zM484 155.6c-51.8 1.6-94.6-34.4-96.4-90.6-1.6-56.4 39-93.4 91-95 54-1.6 95.8 33.2 97.4 89.4C577.6 115.6 538 154 484 155.6z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="code-circle" unicode="&#58933;" d="M513.544163 893.525741c-282.101629 0-510.78094-228.679311-510.78094-510.76288 0-282.083569 228.679311-510.76288 510.78094-510.76288s510.76288 228.679311 510.76288 510.76288C1024.325103 664.8464309999999 795.645793 893.525741 513.544163 893.525741zM513.544163-83.46335899999997c-257.503523 0-466.22622 208.740757-466.22622 466.22622S256.0587 848.989082 513.544163 848.989082s466.22622-208.740757 466.22622-466.22622S771.047686-83.46335899999997 513.544163-83.46335899999997zM171.771357 359.77212099999997L414.357086 256.088033 414.357086 300.805295 221.978945 380.50532599999997 414.357086 459.464886 414.357086 504.182148 171.771357 401.76228ZM442.585309 193.38272800000004L478.814238 193.38272800000004 584.737801 572.1429949999999 548.743656 572.1429949999999ZM612.749301 504.182148L612.749301 459.464886 804.874598 380.50532599999997 612.749301 300.805295 612.749301 256.088033 855.33503 359.77212099999997 855.33503 401.76228Z"  horiz-adv-x="1025" />
+
+    
+    <glyph glyph-name="windows" unicode="&#59007;" d="M437 329l0-325.5-341 47 0 278.5 341 0zm0 371.5l0-329.5-341 0 0 282.5zm491-371.5l0-393-453.5 62.5 0 330.5 453.5 0zm0 439l0-397-453.5 0 0 334.5z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="water" unicode="&#58934;" d="M862.315763 33.684211000000005C802.869868 33.684211000000005 754.526289 82.94399999999996 754.526289 143.50371900000005 754.526289 162.33094700000004 759.35885 180.96056099999998 768.520956 197.43438600000002 768.64671 197.79368399999998 768.808394 198.15298199999995 769.006008 198.49431600000003L849.075622 334.542596 849.057657 334.542596 862.315763 357.052632 875.573868 334.542596 875.573868 334.542596 955.140464 199.356632C955.715341 198.67396499999995 956.164464 197.865544 956.380043 196.96729800000003 965.380464 180.60126300000002 970.123201 162.151298 970.105236 143.50371900000005 970.105236 82.94399999999996 921.761657 33.684211000000005 862.315763 33.684211000000005L862.315763 33.684211000000005ZM924.33064 188.57768399999998C924.204885 188.79326300000002 924.115061 189.02680699999996 924.025236 189.27831600000002L862.315763 302.996211 800.606289 189.260351C800.516464 189.02680699999996 800.42664 188.79326300000002 800.300885 188.57768399999998 793.977236 176.505263 790.635763 162.81600000000003 790.635763 148.965053 790.635763 105.29235100000005 822.792956 69.75775399999998 862.333727 69.75775399999998 901.856534 69.75775399999998 933.995763 105.29235100000005 933.995763 148.98301800000002 933.995763 162.81600000000003 930.654289 176.52322800000002 924.33064 188.57768399999998L924.33064 188.57768399999998ZM682.684605 392.982456C593.50678 392.982456 520.982429 469.602807 520.982429 563.8108070000001 520.982429 593.093614 528.240254 622.071018 541.965447 647.706947 542.163061 648.281825 542.396605 648.820772 542.684043 649.341754L662.815412 860.968421 662.797447 860.968421 682.684605 896 702.571763 860.968421 702.535833 860.968421 821.89471 650.689123C822.774991 649.647158 823.439692 648.3716489999999 823.781026 646.970386 837.25471 621.514105 844.368815 592.8241399999999 844.35085 563.8108070000001 844.35085 469.602807 771.844464 392.982456 682.684605 392.982456L682.684605 392.982456ZM791.408254 630.1192980000001C791.21064 630.4965609999999 791.030991 630.891789 790.887271 631.322947L682.684605 823.924772 574.446008 631.287018C574.320254 630.891789 574.140605 630.4965609999999 573.942991 630.1013330000001 562.840675 609.6931930000001 556.912254 596.075789 556.912254 572.631579 556.912254 498.634105 613.375973 428.876351 682.684605 428.876351 751.993236 428.876351 808.367131 489.058807 808.367131 563.056281 808.367131 586.500491 802.492605 609.6931930000001 791.408254 630.1192980000001L791.408254 630.1192980000001ZM538.695833 276.983018C540.115061 275.330246 541.174991 273.33614 541.713938 271.12645599999996 563.433517 231.11859600000003 574.895131 186.02666699999997 574.895131 140.43171900000004 574.895131-7.581192999999985 458.051341-128 314.403903-128 170.738499-128 53.89471-7.581192999999985 53.89471 140.43171900000004 53.89471 186.47578899999996 65.589868 231.998877 87.704675 272.294175 88.010078 273.17445599999996 88.387341 274.01880700000004 88.872394 274.863158L282.408394 607.411649 282.372464 607.411649 314.403903 662.45614 346.453306 607.411649 346.399412 607.411649 538.695833 276.983018 538.695833 276.983018ZM314.403903 590.614456L119.807973 257.79649099999995C119.556464 257.113825 119.251061 256.449123 118.873798 255.78442099999995 98.932745 220.48336800000004 88.387341 180.42161399999998 88.387341 139.91073700000004 88.387341 12.072420999999963 189.799271-91.89052600000002 314.421868-91.89052600000002 439.026499-91.89052600000002 540.420464 12.072420999999963 540.402499 139.91073700000004 540.402499 180.42161399999998 529.857096 220.50133300000005 509.916043 255.78442099999995 509.53878 256.449123 509.233377 257.131789 508.963903 257.86835099999996L314.403903 590.614456 314.403903 590.614456Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="username" unicode="&#58991;" d="M514.594 824.888c-144.11 0-260.979-118.46-260.979-264.558 0-88.783 43.497-166.928 109.711-214.898-135.361-59.354-230.159-195.858-230.159-354.931h0.894c1.541-21.375 18.641-38.377 40.117-38.377s38.575 17.051 40.117 38.377h0.645c0 0.944-0.099 1.79-0.099 2.734 0 0.05 0 0.099 0 0.149 0 0.099-0.05 0.149-0.05 0.199 0.05 159.967 120 291.054 273.009 304.924 8.948-0.944 17.598-2.734 26.844-2.734 144.11 0 260.979 118.46 260.979 264.558s-116.919 264.558-261.029 264.558zM514.594 377.54499999999996c-99.769 0-180.698 81.972-180.698 183.183s80.879 183.183 180.698 183.183c99.719 0 180.647-81.972 180.647-183.183s-80.879-183.183-180.647-183.183zM896.021-6.615000000000009c0 0.348-0.199 0.645-0.199 0.994-1.043 105.038-43.397 200.034-111.35 269.131v0c-7.157 7.357-17.001 11.98-27.986 11.98-21.574 0-39.122-17.747-39.122-39.668 0-11.135 4.573-21.127 11.83-28.334l-0.099-0.05c52.742-55.229 85.302-130.589 85.302-213.853 0-1.043-0.149-1.987-0.149-3.034h0.994c1.491-21.375 18.691-38.377 40.117-38.377 21.475 0 38.575 17.051 40.117 38.377h0.597c0 0.796-0.099 1.491-0.099 2.287-0.05 0.149 0.05 0.348 0.05 0.547z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="find-fill" unicode="&#58992;" d="M512 896C229.236364 896 0 666.763636 0 384c0-282.786909 229.236364-512 512-512s512 229.213091 512 512C1024 666.763636 794.763636 896 512 896zM657.291636 383.976727c0-77.195636-60.392727-139.729455-136.424727-144.407273l-175.732364-151.714909-22.877091 13.242182 58.228364 222.021818c-8.634182 18.548364-13.800727 39.074909-13.800727 60.858182 0 77.195636 60.369455 139.729455 136.378182 144.430545l175.802182 151.714909 22.877091-13.172364-58.251636-222.068364C652.125091 426.309818 657.291636 405.806545 657.291636 383.976727zM512 384m-66.048 0a2.838 2.838 0 1 1 132.096 0 2.838 2.838 0 1 1-132.096 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="about" unicode="&#58891;" d="M514.27174 834.607768c-249.516844 0-451.789687-202.272843-451.789687-451.789687s202.272843-451.789687 451.789687-451.789687 451.789687 202.272843 451.789687 451.789687S763.788583 834.607768 514.27174 834.607768zM514.27174-20.12919999999997c-222.541469 0-402.947282 180.405813-402.947282 402.947282s180.405813 402.947282 402.947282 402.947282 402.947282-180.405813 402.947282-402.947282S736.814232-20.12919999999997 514.27174-20.12919999999997zM514.295276 593.979362c-9.44614-10.360975-14.307867-22.951735-14.307867-37.483706 0-11.960403 3.886517-22.396079 11.534707-30.457686 7.783267-8.211009 17.853623-12.450567 29.313629-12.450567 9.312086 0 23.139 2.849908 35.782971 16.900925 9.865695 10.641361 14.866592 23.437805 14.866592 37.693484 0 11.68104-4.031826 21.900799-11.744485 29.832446C562.925856 615.325529 532.358677 613.449809 514.295276 593.979362zM549.461193 293.282882c-12.110829-11.541871-20.589944-18.759249-26.236548-23.316032 2.77009 14.953573 9.976212 44.614104 27.330462 103.023398 17.297968 57.890478 18.799158 67.991534 18.799158 72.955592 0 8.65717-3.63683 16.335037-9.921977 21.642926-14.124695 11.661597-39.035038 9.349949-69.131497-7.677866-16.779152-9.408277-34.595936-24.759917-54.493102-46.576805l-10.377348-11.541871 34.425044-26.548656 8.818853 8.715499c9.573029 9.292644 16.086373 15.35164 20.411889 19.393699-26.294876-86.460164-39.093367-140.190903-39.093367-164.262134 0-10.907421 3.172249-19.970844 9.573029-26.839275 6.460132-7.039323 15.510252-10.736529 25.891693-10.736529 10.146081 0 21.792329 3.926426 35.922141 11.949146 12.741185 7.212262 31.883151 23.029506 58.641585 48.190559l10.837836 10.391674-31.30703 30.475082L549.461193 293.282882z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="location" unicode="&#59157;" d="M451.673935-98.39569900000004C478.883834-129.01914699999998 524.254807-128.8089789999999 551.400292-97.92885100000001 553.755808-95.38790800000004 558.821323-89.79676199999994 565.872444-81.84834999999998 577.572838-68.65901699999995 590.597131-53.62432000000001 604.615947-36.99831500000005 644.662065 10.495494000000008 684.708678 61.282182000000034 722.129538 113.35355300000003 759.658524 165.575381 792.492213 216.29072599999995 819.314991 264.54153799999995 868.685946 353.35368300000005 896 430.456574 896 493.714285 896 715.890551 719.301715 896 501.333333 896 283.364952 896 106.666667 715.890551 106.666667 493.714285 106.666667 430.401284 134.05152 353.19426999999996 183.54613 264.23737800000004 210.371803 216.02347099999997 243.193308 165.34812399999998 280.699364 113.16684599999996 318.155192 61.05544999999995 358.239268 10.22578999999996 398.322835-37.31103099999996 412.354743-53.95207300000004 425.391185-69.00072999999998 437.102468-82.20257900000001 444.160087-90.15846599999998 449.230214-95.75492099999997 451.982775-98.73670600000003L451.673935-98.39569900000004ZM486.822684-65.32134799999994C484.281231-62.568254000000024 479.425084-57.207989 472.585916-49.49835900000005 461.135889-36.591016999999965 448.364015-21.84776099999999 434.602351-5.527214999999956 395.275714 41.11192700000004 355.949587 90.98045200000001 319.289224 141.985137 282.808749 192.739548 250.983685 241.87642200000005 225.158316 288.29247799999996 179.388826 370.55419500000005 154.50505 440.709839 154.50505 493.714285 154.50505 688.960095 309.785362 847.238095 501.333333 847.238095 692.881306 847.238095 848.161617 688.960095 848.161617 493.714285 848.161617 440.753978 823.345286 370.701737 777.693969 288.58074899999997 751.873483 242.13293399999998 720.038415 192.96007499999996 683.537446 142.16873799999996 646.912604 91.20503299999996 607.624538 41.38032599999997 568.335977-5.21503800000005 554.587654-21.52024300000005 541.828177-36.24924999999996 530.389289-49.14379699999995 523.556841-56.84571100000005 518.705521-62.20043499999997 516.166694-64.95052599999997 507.543772-74.74891100000002 495.255793-74.80583000000001 487.131524-65.66235300000005L486.822684-65.32134799999994ZM714.955981 428.971194C723.919106 453.372045 728.565658 479.331002 728.565658 505.904762 728.565658 627.091817 632.184774 725.333333 513.29293 725.333333 394.401086 725.333333 298.020202 627.091817 298.020202 505.904762 298.020202 384.717709 394.401086 286.47619 513.29293 286.47619 549.003859 286.47619 583.510052 295.36805300000003 614.373097 312.125591 626.032316 318.456132 630.449257 333.22218 624.238611 345.10648100000003 618.027966 356.99078199999997 603.541579 361.49299399999995 591.882359 355.16245100000003 567.900883 342.14136099999996 541.111735 335.23809500000004 513.29293 335.23809500000004 420.821495 335.23809500000004 345.858586 411.648164 345.858586 505.904762 345.858586 600.161359 420.821495 676.571428 513.29293 676.571428 605.764365 676.571428 680.727273 600.161359 680.727273 505.904762 680.727273 485.192019 677.117041 465.022684 670.154965 446.069408 665.522846 433.459117 671.796821 419.408892 684.168282 414.687349 696.53974 409.965809 710.323861 416.360905 714.955981 428.971194L714.955981 428.971194Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="up" unicode="&#58905;" d="M513.6 539.2l384-384c12.8-12.8 32-12.8 44.8 0 12.801 12.8 12.801 32 0 44.8l-403.2 403.2C532.8 609.6 520 616 513.6 616c-6.4 0-19.2 0-25.599-6.4L78.399 200c-12.8-12.8-12.8-32 0-44.8s32-12.8 44.8 0L513.6 539.2z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="pause" unicode="&#58961;" d="M512-128c-282.714 0-511.893 229.232-511.893 512 0 282.768 229.179 512 511.893 512 282.714 0 511.893-229.232 511.893-512 0-282.768-229.179-512-511.893-512zM512 863.996c-265.043 0-479.9-214.91-479.9-479.996 0-265.097 214.857-479.996 479.9-479.996 265.043 0 479.9 214.899 479.9 479.996 0 265.086-214.857 479.996-479.9 479.996zM639.973 181.32299999999998h-21.329c-23.558 0-42.658 19.1-42.658 42.658v319.933c0 23.558 19.1 42.658 42.658 42.658h21.329c23.558 0 42.658-19.1 42.658-42.658v-319.933c0-23.558-19.1-42.658-42.658-42.658zM405.356 181.32299999999998h-21.329c-23.558 0-42.658 19.1-42.658 42.658v319.933c0 23.558 19.1 42.658 42.658 42.658h21.329c23.558 0 42.658-19.1 42.658-42.658v-319.933c0-23.558-19.1-42.658-42.658-42.658z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="date" unicode="&#58935;" d="M933.185668 758.3591759999999l-167.054737 0 0 56.506968L732.333174 814.866145l0-56.506968L539.505447 758.3591759999999l0 56.506968-33.796734 0 0-56.506968-216.255299 0 0 56.506968-33.796734 0 0-56.506968L88.005356 758.3591759999999c-12.255115 0-22.224164-9.970072-22.224164-22.224164l0-706.60521c0-12.255115 9.970072-22.225187 22.224164-22.225187l845.179288 0c12.255115 0 22.225187 9.970072 22.225187 22.225187L955.409832 736.135012C955.409832 748.389104 945.43976 758.3591759999999 933.185668 758.3591759999999zM939.036933 29.528778999999986c0-3.226484-2.62478-5.852288-5.852288-5.852288l-845.179288 0c-3.226484 0-5.851265 2.62478-5.851265 5.852288L82.154092 736.135012c0 3.226484 2.62478 5.851265 5.851265 5.851265l167.650301 0 0-55.657624 33.796734 0 0 55.657624 216.255299 0 0-55.657624 33.796734 0 0 55.657624L732.333174 741.986277l0-55.657624 33.796734 0 0 55.657624 167.054737 0c3.226484 0 5.852288-2.62478 5.852288-5.851265L939.036933 29.528778999999986zM206.835765 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM206.835765 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM206.835765 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="layim-uploadfile" unicode="&#58909;" d="M914.7359263333336 663.0359498888887c-20.806884999999987 20.806885000000012-48.471967999999976 32.265868000000026-77.89816099999994 32.265868000000054l-352.221993 2.2737367544323206e-13-120.26099099999992 95.03035300000005-11.157106999999995 8.816806000000007-14.220886 9.769962616701378e-15L197.09333633333344 799.148976888889c-51.69538300000001 2.1316282072803006e-14-93.75224400000005-42.88778599999995-93.75224400000006-95.60442799999993l-1.5631940186722204e-13-255.13888799999998c-1.7763568394002505e-15-2.302439 0.08391099999999785-4.716417999999999 0.24968699999999489-7.196911999999999l-1.9895196601282805e-13-340.692403c-1.9539925233402755e-14-29.426192999999998 11.458982999999954-57.09127599999999 32.26586799999994-77.89816100000002 20.806884999999987-20.806885000000012 48.471967999999976-32.265868000000026 77.89816099999994-32.265868000000054l623.083981-3.410605131648481e-13c29.426192999999998-1.9539925233402755e-14 57.09127599999999 11.458982999999954 77.89816100000002 32.26586799999994 20.806885000000012 20.806884999999987 32.265868000000026 48.471967999999976 32.265868000000054 77.89816099999994L947.0028173333335 585.1377888888885C947.0017943333336 614.5639818888885 935.5428113333334 642.2280418888886 914.7359263333336 663.0359498888887zM197.09333633333372 758.2167298888891l141.88345099999998-8.526512829121202e-14L470.3948853333333 654.369569888889l366.44287999999995-2.2737367544323206e-13c38.236859-2.1316282072803006e-14 69.23178099999997-30.99492100000004 69.23178099999994-69.23178100000004L906.0695463333333 465.9195468888886 144.27334033333327 465.91954688888893 144.2733403333336 703.5445488888892C144.2733403333336 733.7361748888891 167.92296933333355 758.2167298888891 197.09333633333372 758.2167298888891zM836.8377653333331 31.28558888888881L213.75480733333322 31.28558888888915c-38.236859 2.1316282072803006e-14-69.23178099999997 30.99492100000004-69.23178099999994 69.23178100000004L144.52302633333338 424.4776928888892l761.546519-6.252776074688882e-13-2.2737367544323206e-13-323.96134599999993C906.0695463333333 62.28050988888867 875.0746243333334 31.285588888888583 836.8377653333331 31.28558888888881z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="delete" unicode="&#58944;" d="M738.923 24.288h-451.956c-27.2 0-49.327 21.603-49.327 48.157v418.017c0 26.548 22.129 48.147 49.327 48.147h451.956c27.2 0 49.327-21.598 49.327-48.147v-418.017c0-26.555-22.129-48.157-49.327-48.157zM286.966 494.547c-4.447 0-7.168-2.644-7.168-4.084v-418.017c0-1.443 2.722-4.093 7.168-4.093h451.956c4.448 0 7.168 2.651 7.168 4.093v418.017c0 1.44-2.722 4.084-7.168 4.084h-451.956zM832.199 496.302h-640.401c-27.201 0-49.327 20.131-49.327 44.876v61.045c0 24.74 22.128 44.867 49.327 44.867h640.401c27.2 0 49.327-20.127 49.327-44.867v-61.045c0-24.744-22.129-44.876-49.327-44.876zM184.631 541.327c0.387-0.733 2.722-2.866 7.168-2.866h640.401c4.445 0 6.782 2.132 7.168 2.867v60.741c-0.393 0.736-2.733 2.863-7.168 2.863h-640.401c-4.437 0-6.776-2.128-7.168-2.863v-60.742zM600.748 605.354h-174.546c-27.201 0-49.327 20.13-49.327 44.876v10.736c0 24.74 22.128 44.867 49.327 44.867h174.546c27.2 0 49.327-20.126 49.327-44.867v-10.736c0-24.745-22.128-44.876-49.327-44.876zM419.034 650.378c0.387-0.733 2.722-2.865 7.168-2.865h174.546c4.446 0 6.782 2.131 7.168 2.865v10.432c-0.393 0.736-2.734 2.862-7.168 2.862h-174.546c-4.437 0-6.776-2.126-7.168-2.862v-10.432zM404.099 430.833h-30.097c-7.297 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.916-13.212 13.213-13.212h30.098c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213zM659.583 430.833h-30.097c-7.298 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.917-13.212 13.213-13.212h30.097c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213zM531.841 430.833h-30.098c-7.297 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.917-13.212 13.213-13.212h30.098c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="play" unicode="&#58962;" d="M512 896C229.376 896 0 666.624 0 384 0 101.37599999999998 229.376-128 512-128 794.624-128 1024 101.37599999999998 1024 384 1024 666.624 794.624 896 512 896L512 896 512 896zM512-95.23199999999997C245.76-95.23199999999997 32.768 117.75999999999999 32.768 384 32.768 650.24 245.76 863.232 512 863.232S991.232 650.24 991.232 384C991.232 117.75999999999999 778.24-95.23199999999997 512-95.23199999999997L512-95.23199999999997 512-95.23199999999997zM733.184 392.192L393.216 588.8c-4.096 4.096-8.192 4.096-12.288 0C376.832 588.8 372.736 584.704 372.736 580.608l0-393.216c0-4.096 4.096-8.192 4.096-8.192 4.096-4.096 8.192-4.096 12.288 0l344.064 196.608c4.096 4.096 4.096 4.096 4.096 8.192C741.376 388.096 737.28 392.192 733.184 392.192L733.184 392.192 733.184 392.192zM733.184 392.192"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="top" unicode="&#58884;" d="M812 153.4l-300 172.8-300-172.8 300 604L812 153.4zM264.5 209.2l247.5 142.5 247.5-142.5L512 707.5 264.5 209.2zM371.7 138.3l0-126.2-15.9 0 0 126.2-45.9 0L309.9 153l107.4 0 0-14.8L371.7 138.2zM506.6 154.5c26.6 0 43.3-3.9 50-11.7 6.7-7.8 10-27.2 10-58.3 0-33.5-3.2-54.2-9.6-62-6.4-7.8-23.2-11.8-50.4-11.8-27 0-43.8 3.9-50.3 11.7-6.5 7.8-9.8 27.9-9.8 60.3l0 9.9 0.2 13.3c0 18.7 4.2 31.5 12.6 38.4C467.8 151 483.5 154.5 506.6 154.5zM506.5 141c-22.3 0-35.3-2.5-39.1-7.4-3.8-5-5.7-22-5.7-51 0-29.1 1.9-46.1 5.7-51.1 3.8-5 16.8-7.4 39.1-7.4 22.4 0 35.4 2.5 39.2 7.4 3.8 5 5.7 22 5.7 51.1l0 9.2-0.1 13.3c0 15.6-2.6 25.4-7.8 29.6S525.9 141 506.5 141zM608.4 12.1 608.4 153l59.2 0 5.4 0c15.9 0 26.7-3.1 32.5-9.2 5.8-6.1 8.7-17.6 8.7-34.4 0-16.1-3-27.1-9-32.9-6-5.9-17.3-8.8-33.9-8.8l-6.2-0.1-40.7 0 0-55.5L608.4 12.1zM624.3 81.1l37.7 0c15.8 0 25.9 1.6 30.3 4.9 4.4 3.2 6.7 10.7 6.7 22.3 0 13.6-1.5 22.2-4.5 25.9-3 3.6-10.1 5.4-21.3 5.4l-6.1 0.1-42.7 0L624.4 81.1z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="firefox" unicode="&#59014;" d="M516.010667-128q-161.706667 0-288.277333 85.994667t-188.288 227.712q-33.152 74.858667-38.293333 172.010667t14.848 189.994667 63.424 178.282667 102.293333 138.581333l-6.293333-160.576q6.293333 8 38.848 8.853333t40-8.853333q24 46.293333 91.712 78.848t133.994667 33.706667q-30.848-25.706667-68.288-84.864t-33.429333-93.418667q14.293333-4.565333 35.712-7.722667t36.010667-4.288 38.848-2.282667 28.864-1.706667q8.576-2.858667 5.418667-26.005333t-17.429333-43.136q-2.858667-4.010667-9.429333-10.581333t-32.277333-20.288-57.706667-19.434667l8.576-108.010667-79.424 38.293333q-10.282667-24.576-4.288-46.570667t20.565333-37.994667 37.418667-23.722667 46.293333-3.712q29.141333 5.141333 56 19.712t47.722667 25.706667 42.005333 10.005333q34.858667-2.282667 51.136-18.858667t11.136-37.141333q-0.576-1.152-1.429333-3.136t-4.864-7.146667-10.282667-8.853333-18.005333-5.994667-26.581333-0.576q-34.282667-54.293333-82.581333-77.418667t-119.722667-16.853333q42.282667-34.858667 92.864-47.146667t96.277333-3.434667 88.277333 29.717333 73.152 50.005333 45.994667 59.434667q24.576 52.010667 22.293333 109.994667t-21.418667 107.712-44.864 71.424q49.706667-21.717333 78.293333-45.418667t44.010667-64.277333q8.576 97.152-32.853333 196.010667t-119.722667 162.282667q151.424-44.010667 235.434667-159.722667t86.293333-295.722667q1.152-72.576-23.146667-145.706667t-70.570667-136-108.010667-112-141.418667-77.418667-164.864-28.288z"  horiz-adv-x="1025" />
+
+    
+    <glyph glyph-name="friends" unicode="&#58898;" d="M672.02974 765.933689c7.66047-32.266891 8.420787-62.237483 7.713682-95.365998-0.283456-12.778024-7.291057-71.832002-5.3918-89.926102 1.561565-14.936177 5.132904-16.128329 10.759041-28.436656 9.803273-21.422915 6.51846-50.970882 2.76088-72.566736-2.056845-11.816117-6.404873-28.64541-13.017478-38.287001-7.291057-10.645454-21.864984-10.711969-28.319999-23.12365-9.29469-17.848507-4.045129-42.930765-9.903557-62.21497-6.65763-21.883403-23.599488-23.420409-24.877597-52.040237 8.316409-1.243317 16.59598-2.479471 24.877597-3.722788 8.316409-18.498306 23.533996-55.70265 39.08518-66.900689 13.024641-3.728928 26.048259-7.448646 39.07904-11.156084 45.641503-19.593244 96.365768-43.032072 142.108578-63.215764 41.656749-18.381649 91.51325-24.937972 106.575294-70.629617 0-31.026644 2.795673-104.309694 2.025123-144.978952L58.155515-56.631556000000046c-0.757247 40.669258 2.029216 113.952308 2.029216 144.978952 15.065114 45.691645 64.928778 52.247968 106.578364 70.629617 45.74281 20.182668 96.467075 43.62252 142.098345 63.215764 13.027711 3.707438 26.054399 7.427156 39.08211 11.156084 15.554254 11.197016 30.78105 48.402383 39.09439 66.900689l18.492166 4.710278c-4.196579 24.429389-18.658965 26.322505-24.682146 43.62559-2.356674 26.013467-4.729721 52.052516-7.095605 78.079286 0.107447-1.234107-17.006326 3.246951-19.252483 4.716418-24.130583 15.838733-24.618701 80.075757-26.941606 106.793258-1.063215 12.222369 15.163351 22.240537 10.654664 44.62536-26.433022 131.125433 11.437493 219.776496 71.330582 240.123916 41.564651 17.633612 119.167077 50.323129 191.563944 3.716648l17.971303-17.428951 29.061896-5.237281C662.71663 795.172617 672.02974 765.933689 672.02974 765.933689z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="refresh-3" unicode="&#59818;" d="M820.376904 697.14807C740.637816 774.519228 631.884926 822.157201 511.999488 822.157201c-244.621347 0-442.925808-198.305485-442.925808-442.926832 0-244.6193 198.304462-442.925808 442.925808-442.925808 206.075449 0 379.271046 140.739395 428.740738 331.337337L822.859445 267.64189899999997c-45.759183-127.45381-167.656441-218.623229-310.859957-218.623229-182.371584 0-330.210677 147.842163-330.210677 330.210677 0 182.371584 147.840116 330.2117 330.210677 330.2117 88.762603 0 169.32443-35.035958 228.655723-92.015693L557.051567 433.822732l280.641725 0 113.880677 0 3.351328 0L954.925297 831.695438 820.376904 697.14807z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="ok" unicode="&#58885;" d="M960 640L915.2 684.8 371.2 172.79999999999995 108.8 454.4 64 409.6 358.4 83.20000000000005 364.8 89.60000000000002 371.2 83.20000000000005Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="layer" unicode="&#58936;" d="M96.089 724.318l0-684.236 831.822 0L927.911 724.318 96.089 724.318zM884.178 84.457L140.464 84.457 140.464 489.559l743.714 0L884.178 84.457z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="face-smile-fine" unicode="&#58892;" d="M511.558443 852.9315573333333c-246.787686 0-447.597201-200.783932-447.597201-447.598224 0-246.815315 200.783932-447.598224 447.597201-447.598224 246.841921 0 447.64939 200.782909 447.64939 447.598224C959.207833 652.1476253333334 758.400365 852.9315573333333 511.558443 852.9315573333333zM511.558443-4.962310666666667c-226.247884 0-410.295644 184.046736-410.295644 410.295644 0 226.249931 184.072319 410.296667 410.295644 410.296667 226.27449 0 410.346809-184.046736 410.346809-410.296667C921.905252 179.08442633333334 737.832933-4.962310666666667 511.558443-4.962310666666667zM724.38055 303.5726953333334c-9.698896 3.457752-20.366863-1.566682-23.848151-11.264555-28.500101-79.45461-104.372116-132.844587-188.82353-132.844587-84.798315 0-160.770614 53.689806-189.070146 133.590578-3.432169 9.723455-14.075577 14.772448-23.823592 11.364839-9.699919-3.432169-14.797008-14.100136-11.364839-23.823592 33.547047-94.77248 123.668601-158.434405 224.234017-158.434405 100.142791 0 190.140525 63.314001 223.935212 157.564595C739.125369 289.3978573333334 734.102982 300.0903843333334 724.38055 303.5726953333334zM302.49494 515.3479593333334c0-24.653493 19.98517-44.638663 44.638663-44.638663 24.653493 0 44.638663 19.98517 44.638663 44.638663s-19.98517 44.63764-44.638663 44.63764C322.48011 559.9855993333333 302.49494 540.0014523333333 302.49494 515.3479593333334L302.49494 515.3479593333334zM631.398856 515.3479593333334c0-24.653493 19.98517-44.638663 44.63764-44.638663 24.653493 0 44.63764 19.98517 44.63764 44.638663s-19.984147 44.63764-44.63764 44.63764C651.384026 559.9855993333333 631.398856 540.0014523333333 631.398856 515.3479593333334L631.398856 515.3479593333334z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="dollar" unicode="&#58969;" d="M517.565-65.45399999999995c-244.263 0-442.299 198.014-442.299 442.299s198.014 442.299 442.299 442.299c244.263 0 442.299-198.014 442.299-442.299 0-244.263-198.014-442.299-442.299-442.299zM517.565 863.383c-268.751 0-486.564-217.834-486.564-486.564s217.834-486.564 486.564-486.564c268.751 0 486.564 217.834 486.564 486.564 0 268.751-217.834 486.564-486.564 486.564zM497.036 425.349c-18.443 6.957-33.605 16.314-45.238 27.617-11.581 11.306-20.059 23.465-25.468 36.742-5.423 13.177-8.178 26.235-8.178 39.172-0.004 18.194 2.564 34.357 7.846 48.514 5.327 14.231 13.748 25.85 25.468 35.02 11.581 9.167 26.798 15.204 45.482 18.295v-205.52zM534.455 356.13199999999995c16.937-6.756 32.277-14.997 46.035-24.855 13.748-9.678 24.613-21.601 32.929-35.57 8.204-13.909 12.436-30.734 12.622-50.307 0-14.231-1.859-27.907-5.785-40.833-3.858-12.866-9.542-24.531-17.271-34.804-7.691-10.211-17.271-18.443-28.678-24.613-11.328-6.318-24.613-9.678-39.76-10.341v221.377zM534.455 94.18299999999999c29.037 3.318 53.978 11.306 74.785 24.134 20.985 12.866 37.018 30.15 48.281 51.734 11.125 21.535 16.876 46.832 16.937 76.196 0 16.08-1.67 30.377-5.033 42.985-3.318 12.622-8.204 24.15-14.836 34.357-6.739 10.341-14.836 20.189-24.613 29.326-8.853 8.204-19.107 15.957-30.659 23.041-11.328 7.197-22.836 13.706-34.281 19.261-11.581 5.694-21.601 10.516-30.659 14.231v221.377c14.527-3.318 26.662-8.594 36.62-16.192 9.859-7.395 17.766-16.192 23.776-26.384 5.941-10.211 10.341-20.985 12.972-32.345 2.666-11.328 4.026-22.836 3.858-34.097h46.155c0.004 16.314-1.566 32.345-5.327 48.281-3.543 15.957-9.938 30.909-19.107 44.969-8.996 13.909-21.601 26.235-37.684 36.742-16.192 10.521-36.62 18.295-61.318 23.562v49.426h-37.441v-53.316c-23.465-2.624-42.985-8.178-58.595-16.314-15.633-8.204-28.279-18.194-37.684-29.562-9.441-11.328-16.523-23.302-21.226-35.317-4.59-12.062-7.846-23.302-9.316-33.326-1.566-10.211-2.256-18.194-2.115-24.029 0.004-21.601 3.452-40.612 9.863-57.238 6.479-16.523 15.58-30.909 27.178-43.441 11.659-12.436 25.361-23.562 40.833-33.204 15.633-9.678 32.649-18.443 51.098-26.235v-237.329c-18.194 1.984-33.326 7.197-45.094 15.633-11.97 8.369-21.074 19.107-27.714 31.902-6.739 12.972-11.011 27.178-13.363 42.701-2.256 15.58-3.034 31.313-2.115 47.367h-47.803c-1.183-23.776 0.397-46.035 5.033-66.676s12.357-39.03 23.376-55.019c10.892-16.08 25.361-29.037 43.142-39.03 17.847-9.863 39.472-16.08 64.586-18.295v-65.283h37.441v65.283z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="group" unicode="&#58899;" d="M1328.72893437-13.274022189999982L1325.7954575 10.932401249999998 1319.19311938 40.27361905999999 1309.65730438 68.14729219000003 1296.45423969 96.75473719000001 1283.25117594 118.75984405999998 1264.91331781 140.03117906 1244.37414312 156.90310406000003 1215.76669813 173.03964562 1195.22913594 182.57546062999995 1168.08923563 189.17779874999997 1140.94772187 195.77852437 1117.47507031 204.58056750000003 1088.13546594 218.51740312000004 1064.66281438 229.52076375000001 1036.05536844 242.72382749999997 1014.0502625 255.19473187999995 1014.0502625 332.94718406000004 1023.58446406 343.95054469 1032.38811969 358.61954062999996 1038.98884531 373.29014906 1044.12363969 391.62800719 1049.992205 413.63472656 1052.19191 430.50504 1055.370515 429.77126719 1061.727725 430.75016813 1066.61900281 434.662545 1071.99731188 443.46458812 1075.42104594 453.7325625 1077.37723437 466.4469825 1079.82206656 489.43099031 1080.799355 508.991265 1079.82206656 525.61806187 1076.39833344 535.88764969 1069.55247969 539.80002656 1065.64010188 538.82112656 1069.06383594 560.82623344 1071.99731188 587.2339743800001 1072.97621281 611.19526969 1072.48595656 630.26689969 1069.55247969 647.870985 1064.17255719 664.98642656 1056.83805969 680.63432344 1046.56847188 698.24002125 1034.83295281 712.91063063 1021.13963187 724.15750594 1003.53554656 735.40438125 981.53043969 745.67396812 962.94745344 750.56363437 940.45370281 754.47601125 918.4469825 754.964655 895.95323188 751.05227812 874.43676969 743.71777969 855.36513875 735.893025 838.73834188 725.1347934400001 823.33396063 711.44308594 808.66335125 695.30493188 795.4602875 676.23330187 785.9244725 655.69573969 780.05751875 632.22308813 779.32374687 602.14809844 782.25722375 574.27442531 785.9244725 538.3324818799999 777.85620219 538.3324818799999 772.72140875 531.73014375 771.25547656 519.99462469 772.72140875 492.12095156 776.3886575 459.84625688 779.32374687 443.70810375 784.45854031 434.90606063 793.99435531 429.77126719 799.86130906 430.50504 803.53017031 404.83268344 807.19742 389.42830219 813.06598531 372.55637719000003 821.13425656 355.68606375 830.67007156 342.48299999999995 838.00456906 332.94718406000004 837.27079719 253.72718719 845.06329813 250.99690875 855.81346625 248.0392425 867.37158969 243.73981969 878.39107625 239.43878530999996 888.6058325 235.67638781000005 897.74331406 231.10603405999996 908.76441312 226.53729375 920.85956187 219.54952313 932.95471062 212.56014000000005 942.898535 205.30305094000005 955.80002656 195.62693156 966.82112656 185.41378874999998 977.30358781 172.51229719000003 988.32307531 158.26743750000003 1000.01505219 141.87125344000003 1010.0943425 122.51901655999995 1018.69641219 101.55409219 1026.22120719 82.20185436999998 1031.46243781 64.05913219000001 1035.09098281 45.110066250000045 1038.71952688 23.741970000000038 1041.13855625-1.2546703100000514 1041.54172812-18.187877810000032 1040.73538531-33.30681374999995 1037.30842625-44.99879062000002 1030.79156-57.83254968999995 1023.19742-66.36688593999997 1009.28799875-73.42238906 1298.65555719-73.42238906 1311.85862094-66.82005093999999 1322.12820875-56.552076560000046 1328.72893437-45.54871687000002 1330.19647906-31.611880309999947ZM443.23504906 789.36487031L427.10818437 771.62531906 412.59400625 750.66039469 402.11154406 728.08278469 395.66079781 702.27980156 394.854455 669.21972844 398.07982813 638.57868562 402.11154406 599.06786719 393.24176844 599.06786719 387.59736594 591.81077812 385.98467938 578.90928656 387.59736594 548.26824375 391.62908187 512.7891412500001 394.854455 495.04959 400.4988575 485.37347156 410.98131969 479.72906906 417.43206594 480.53541188 421.46378187 452.31339844 425.49549781 435.38019094 431.94624406 416.83429687 440.81601969 398.28840187 451.29848094 383.77422375000003 459.36191375 373.29176156000005 458.55557094 286.20669281000005 444.84773562 277.33691719 412.59400625 262.01639531 379.53393406 247.50221719 352.92460719 234.60072562000005 331.95968281 225.73095 308.57572906 218.47386094 284.3854325 213.63580125 261.00147875 207.99139875000003 236.81118125 197.50893656000005 214.23357031 186.22013156000003 194.07498969 171.70595344000003 171.49737969 149.12834250000003 155.370515 125.74438874999998 143.27536625 103.16677875000005 133.59924781 78.97648125 123.92312844 51.56081156000005 119.08506875 29.789544370000044 115.05335281 11.243650310000021 112.63432344-10.527616869999974 112.63432344-29.879854690000002 115.85969656-49.23209250000002 125.535815-62.133584059999976 140.04999313-71.80970344000002 158.59588719-73.42238906 965.74546437-73.42238906 980.2596425-66.1653 991.5484475-54.87649499999998 998.80553656-42.781346249999956 1000.41822312-27.46082531000002 998.80553656-7.302244689999952 995.58016438 19.30708218999996 988.32307531 51.56081156000005 977.84061313 82.20185436999998 963.326435 113.64924094000003 948.81225688 137.8395375 928.65367531 161.22349125000005 906.07606531 179.76938625000003 874.62867875 197.50893656000005 852.05106875 207.99139875000003 822.21636875 215.24848781000003 792.38166875 222.50557688000004 766.57868562 232.18169624999996 734.32495625 247.50221719 708.52197312 259.59736594000003 677.07458656 274.11154406 652.88429 287.81937937 652.88429 373.29176156000005 663.36675219 385.38691031 673.04287063 401.513775 680.29995969 417.64063969 685.94436219 437.79922031 692.39510844 461.98951781 694.81413781 480.53541188 698.30882938 479.72906906 705.2966 480.80473031 710.67168406 485.10415312 716.585405 494.78027156 720.3478025 506.06907656 722.49912688 520.04623031 725.18586219 545.31218906 726.26152437 566.8141378099999 725.18586219 585.09071344 721.42346469 596.3795184400001 713.89705719 600.68055375 709.59763438 599.6048915599999 713.36003188 623.79518906 716.585405 652.82354531 717.66106719 679.16516625 717.12242937 700.13008969 713.89705719 719.4823275 707.98494781 738.2959275000001 699.92151594 755.49845437 688.63271094 774.85069219 675.73121937 790.97755688 660.67840344 803.34202406 641.32616563 815.70487875 617.13586906 826.99368375 596.7095825 832.37038031 571.98064812 836.66980219 547.79035063 837.20844 523.06302875 832.90740469 499.40975656 824.84397281 478.44483313 816.24351562 460.16825656 804.4160728100001Z"  horiz-adv-x="1449" />
+
+    
+    <glyph glyph-name="layim-download" unicode="&#58910;" d="M186.888458 77.07363199999998l0 581.729108c14.85022-14.450107 35.050284-23.436782 57.359382-23.436782l560.03604 0 0-151.561881 25.029046 0 0 176.591951-585.065086 0c-31.191396 0-57.359382 26.166963-57.359382 57.359382 0 31.191396 26.165939 57.359382 57.359382 57.359382l572.551074 0L816.798914 800.143838 244.24784 800.143838c-45.431725 0-82.388429-36.957727-82.388429-82.388429l0-640.681778c0-41.796942 34.000372-75.789127 75.789127-75.789127l225.950102 0 0 25.029046L237.648538 26.31355099999996C209.661114 26.31355099999996 186.888458 49.078021000000035 186.888458 77.07363199999998zM236.947574 730.269421l560.38601 0 0-25.029046-560.38601 0 0 25.029046ZM686.086897 428.171012c-85.917812 0-164.908864-55.248302-194.553021-135.882783-30.013571-81.641415-4.269233-175.567621 62.624293-230.942813 67.00302-55.465243 164.474982-62.808488 238.931764-17.720593 74.094532 44.868907 113.272833 133.533272 96.080266 218.517829C869.882923 357.47283300000004 783.297916 428.171012 686.086897 428.171012zM686.086897 38.82858599999997c-75.595722 0-145.060817 48.634674-171.092703 119.595842-26.354228 71.839165-3.63069 154.438395 55.287187 203.074092 59.017138 48.718585 144.762011 55.029314 210.191186 15.237029 65.11195-39.59888 99.396801-117.681236 84.064604-192.408171C847.384513 100.72940100000005 771.387655 38.82858599999997 686.086897 38.82858599999997zM698.600909 152.23547199999996L698.600909 311.02496499999995 673.571862 311.02496499999995 673.571862 152.28459099999998 604.675726 221.17254100000002 586.978668 203.47548400000005 686.111456 104.35190499999999 785.185916 203.42738799999995 767.489882 221.123422Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="picture-fine" unicode="&#58893;" d="M958.648085 84.30682933333333L65.772494 84.30682933333333 65.772494 721.9115253333333l892.87559 0L958.648085 84.30682933333333zM97.660762 116.20328333333339l829.099055 0L926.759817 690.0570263333334 97.660762 690.0570263333334 97.660762 116.20328333333339zM648.731616 419.05893933333334l-1.991354 0c-47.801702 0-86.696548 38.900985-86.696548 86.695524l0 1.978051c0 47.809889 38.894845 86.671988 86.696548 86.671988l1.991354 0c47.801702 0 86.698594-38.862099 86.698594-86.671988l0-1.978051C735.43021 457.95992433333333 696.533318 419.05893933333334 648.731616 419.05893933333334zM646.740262 562.5193053333333c-30.224372 0-54.810327-24.582885-54.810327-54.787814l0-1.978051c0-30.230512 24.584931-54.803163 54.810327-54.803163l1.991354 0c30.222325 0 54.810327 24.572652 54.810327 54.803163l0 1.978051c0 30.203906-24.586978 54.787814-54.810327 54.787814L646.740262 562.5193053333333zM91.097276 181.7900473333334l-22.748097 22.338774 274.373974 279.332916 22.750143-22.351054L91.097276 181.7900473333334zM604.886015 215.92242633333342L339.999113 480.74793033333333l22.548552 22.525016L627.433544 238.4638153333334 604.886015 215.92242633333342zM619.007641 202.70744933333333l-22.763446 22.337751 167.989015 171.035398 22.765493-22.350031L619.007641 202.70744933333333zM925.622924 222.7939273333334L758.534418 389.8343373333333l22.548552 22.529109 167.086459-167.044504L925.622924 222.7939273333334z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="link" unicode="&#58956;" d="M262.4-121.60000000000002c-64 0-128 25.6-179.2 76.8-102.4 102.4-102.4 262.4 0 364.8l134.4 134.4 89.6-89.6-134.4-134.4c-51.2-51.2-51.2-128 0-179.2 51.2-51.2 128-51.2 179.2 0l179.2 179.2c25.6 25.6 38.4 57.6 38.4 89.6S556.8 384 537.6 409.6L467.2 473.6l89.6 89.6 70.4-70.4C672 448 697.6 384 697.6 313.6c0-70.4-25.6-134.4-76.8-179.2l-179.2-179.2C396.8-96 326.4-121.60000000000002 262.4-121.60000000000002zM467.2 204.79999999999995L396.8 268.79999999999995c-102.4 102.4-102.4 262.4 0 364.8l179.2 179.2c102.4 102.4 262.4 102.4 364.8 0 102.4-102.4 102.4-262.4 0-364.8l-134.4-134.4-89.6 89.6 134.4 134.4c51.2 51.2 51.2 128 0 179.2-51.2 51.2-134.4 51.2-179.2 0L486.4 544c-51.2-51.2-51.2-128 0-179.2l70.4-70.4L467.2 204.79999999999995z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="diamond" unicode="&#59189;" d="M998.4 526.933333L797.866667 802.133333c-4.266667 6.4-12.8 10.666667-19.2 10.666667L243.2 812.8c0 0-14.933333-2.133333-23.466667-17.066667C194.133333 753.066667 32 512 32 512L21.333333 494.933333l12.8-14.933333L469.333333-27.733333000000016c4.266667-4.266667 6.4-6.4 10.666667-8.533333 6.4-4.266667 32-10.666667 46.933333 0 4.266667 2.133333 6.4 6.4 10.666667 8.533333l409.6 420.266667c10.666667 8.533333 10.666667 25.6 0 34.133333-8.533333 10.666667-23.466667 10.666667-32 0L561.066667 61.86666700000001l153.6 422.4 0 0 251.733333 0c2.133333 0 19.2 0 23.466667 4.266667l2.133333 2.133333C1004.8 497.066667 1006.933333 512 998.4 526.933333zM782.933333 763.733333l-96-226.133333L341.333333 537.6l-85.333333 226.133333L782.933333 763.733333zM221.866667 714.666667l72.533333-179.2-192 0L221.866667 714.666667zM91.733333 488.533333l215.466667 0 138.666667-416L91.733333 488.533333zM503.466667 44.799999999999955l-147.2 443.733333 307.2 0L503.466667 44.799999999999955zM736 535.4666669999999L810.666667 701.866667l119.466667-168.533333L736 533.333333z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="log" unicode="&#58894;" d="M828.01742 700.357158C743.476979 784.899646 631.076002 831.458031 511.516999 831.458031c-119.55798 0-231.959979-46.558385-316.500421-131.09985C110.47716 615.81774 63.918775 503.41574 63.918775 383.85776c0-87.103824 25.045419-171.548074 72.429613-244.204861 9.393951-14.402011 28.685319-18.46249 43.087331-9.071609 14.404058 9.393951 18.46556 28.685319 9.072633 43.089377-40.768519 62.511729-62.317301 135.194098-62.317301 210.187093 0 212.469066 172.85586 385.326972 385.325949 385.326972s385.325949-172.857906 385.325949-385.326972-172.85586-385.326972-385.325949-385.326972c-70.357418 0-139.188062 19.131733-199.052498 55.323003-14.71412 8.900717-33.856086 4.180206-42.753733-10.534937-8.896624-14.71719-4.180206-33.856086 10.534937-42.753733 69.584821-42.070164 149.556201-64.307631 231.271294-64.307631 119.559003 0 231.959979 46.558385 316.500421 131.09985 84.539418 84.539418 131.097804 196.941418 131.097804 316.499397S912.556838 615.81774 828.01742 700.357158zM494.28964 690.216193c-21.782096 0-39.397289-17.658172-39.397289-39.439244l0-283.524378c0-1.360997 0.358157-2.706645 0.493234-4.03285 2.020006-19.886933 18.959817-34.573423 39.379892-34.573423l0 0 0.146333 0.832971 223.590358 0c21.782096 0 39.438221 17.616216 39.438221 39.397289s-17.658172 39.397289-39.439244 39.397289L533.686928 408.273846l0 242.503103C533.686928 672.5580219999999 516.071735 690.216193 494.28964 690.216193z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="key" unicode="&#59011;" d="M819.2 588.8c0-172.8-140.8-307.2-307.2-307.2-172.8 0-307.2 140.8-307.2 307.2C204.8 755.2 339.2 896 512 896S819.2 755.2 819.2 588.8L819.2 588.8zM512 838.4c-140.8 0-249.6-115.2-249.6-249.6 0-134.4 108.8-256 249.6-256s256 115.2 256 249.6S652.8 838.4 512 838.4L512 838.4zM480 300.79999999999995l64 0L544-128l-64 0L480 300.79999999999995 480 300.79999999999995zM512 192l192 0 0-64L512 128 512 192 512 192zM512 64l192 0 0-64L512 0 512 64 512 64z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="rate-solid" unicode="&#59002;" d="M957.111079 492.519576c-3.927449 11.669784-14.447037 19.86442-26.723641 20.816095L647.68068 535.250796 540.183388 811.873997c-4.586458 11.803837-15.951297 19.579941-28.614711 19.579941s-24.02723-7.776104-28.614711-19.579941L375.458719 535.250796l-282.708803-21.915126c-12.276604-0.951675-22.796192-9.146311-26.723641-20.816095-3.927449-11.669784-0.50142-24.557302 8.701173-32.737612l217.547735-193.358823-67.980277-291.298436c-2.848884-12.20702 2.009773-24.919553 12.273535-32.114418 10.264784-7.195889 23.87271-7.42818 34.375925-0.586354l240.624313 156.709111 240.625336-156.709111c5.099135-3.320629 10.92891-4.974291 16.752546-4.974291 6.173606 0 12.342096 1.858324 17.623379 5.561669 10.263761 7.194866 15.122419 19.907399 12.273535 32.114418l-67.980277 291.299459L948.409906 459.781964C957.613522 467.962274 961.037505 480.849792 957.111079 492.519576z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-del" unicode="&#58959;" d="M928 448l-143.616 0c-3.456 55.616-14.272 106.56-29.504 144.96C725.504 666.816 617.344 768 464.32 768L256 768l0-320L96 448C78.336 448 64 433.664 64 416S78.336 384 96 384L256 384l0-320 229.632 0c156.288 0 240.768 97.856 267.904 167.488C772.736 280.96000000000004 782.272 333.312 784.96 384L928 384C945.664 384 960 398.336 960 416S945.664 448 928 448zM349.376 711.488l63.936 0c35.712 0 251.84 27.968 266.944-263.488l-330.88 0L349.376 711.488zM439.296 120.51199999999994L349.376 120.51199999999994 349.376 382.528 349.376 384l330.88 0C665.344 113.98400000000004 467.968 120.51199999999994 439.296 120.51199999999994z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="unlink" unicode="&#58957;" d="M150.336 767.6800000000001C133.44 762.304 124.16 744.3199999999999 129.472 727.488 131.2 722.1759999999999 134.208 717.44 138.304 713.664l122.624-122.432C270.208 576.192 289.92 571.52 304.96 580.736 320 590.0799999999999 324.672 609.7280000000001 315.456 624.832 312.832 629.056 309.184 632.64 304.96 635.264L182.336 757.696C175.168 765.44 164.672 769.216 154.304 767.6800000000001 152.96 767.808 151.552 767.808 150.336 767.6800000000001L150.336 767.6800000000001zM406.08 831.424c-13.696-4.48-22.72-17.6-22.016-32L384.064 672c0-17.664 14.336-32 32-32s31.872 14.336 31.872 32L447.936 799.424C448.256 817.088 434.304 831.6800000000001 416.64 832 414.464 832.064 412.16 831.808 410.048 831.424 408.704 831.552 407.296 831.552 406.08 831.424L406.08 831.424zM91.392 511.872C73.728 509.12 61.632 492.544 64.384 474.88 67.136 457.28 83.712 445.248 101.376 448L224 448C241.664 448 256 462.208 256 479.872s-14.336 32-32 32L101.376 511.872c-1.984 0.192-3.968 0.192-6.016 0C94.016 512 92.608 512 91.392 511.872L91.392 511.872zM795.456 320c-17.728-2.752-29.824-14.08-27.072-31.744 2.752-17.6 19.328-35.008 36.992-32.256L928 256c17.664 0 32 19.584 32 37.248S945.664 320 928 320l-122.624 0c-1.984 0.192-3.968 0.192-6.016 0-1.344 0.128-2.688 0.128-4.032 0L795.456 320zM598.272 127.42399999999998c-13.76-4.48-22.72-17.6-22.08-32L576.192-32c0-17.664 14.336-32 32-32S640-49.66399999999999 640-32l0 127.424c0.32 17.6-13.568 32.256-31.232 32.576-2.176 0.064-4.352-0.192-6.592-0.576-1.344 0.128-2.688 0.128-4.032 0L598.272 127.42399999999998zM726.272 191.67999999999995c-16.896-5.376-26.24-23.36-20.864-40.192 1.664-5.312 4.736-10.048 8.832-13.824l122.56-122.432c9.28-15.04 28.928-19.776 44.032-10.496 14.976 9.344 19.712 28.992 10.368 44.032-2.624 4.224-6.144 7.808-10.368 10.432l-122.56 122.432c-7.168 7.744-17.6 11.52-28.032 9.984-1.344 0.128-2.688 0.128-4.032 0L726.272 191.61599999999999zM339.968 28.03200000000004c-49.152 0-98.304 18.688-135.744 56.128-74.816 74.88-74.816 196.608 0 271.488l87.744 87.744c12.48 12.48 32.768 12.48 45.248 0s12.48-32.768 0-45.248L249.408 310.46400000000006c-49.92-49.856-49.92-131.136 0-180.992 49.856-49.856 131.136-49.856 180.992 0l87.744 87.744c12.48 12.48 32.768 12.48 45.248 0s12.48-32.768 0-45.248l-87.744-87.744C438.272 46.72000000000003 389.12 28.03200000000004 339.968 28.03200000000004zM702.144 323.712c-8.192 0-16.384 3.136-22.656 9.344-12.48 12.48-12.48 32.768 0 45.248l87.744 87.744c49.856 49.92 49.856 131.072 0 180.992-49.856 49.856-131.136 49.856-180.992 0L498.496 559.296c-12.48-12.48-32.768-12.48-45.248 0s-12.48 32.768 0 45.248l87.744 87.744c74.88 74.88 196.608 74.88 271.488 0 74.88-74.816 74.88-196.672 0-271.488l-87.744-87.744C718.528 326.784 710.336 323.712 702.144 323.712z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-clear" unicode="&#58937;" d="M944.787709 197.20939699999997L857.081297 197.20939699999997 741.092979-127.73993700000005 815.146059-127.73993700000005 832.440281-65.58476199999996 966.82809-65.58476199999996 984.512408-127.73993700000005 1062.011328-127.73993700000005 944.787709 197.20939699999997 944.787709 197.20939699999997ZM848.04409 1.1865400000000363L898.951519 153.25866699999995 949.923963 1.1865400000000363 848.04409 1.1865400000000363 848.04409 1.1865400000000363ZM210.238376 489.910857L183.386821 513.121524 12.46009 313.522794C-5.874386 292.652698-3.728862 260.989968 17.271265 242.720508 38.401424 224.45104800000001 70.454249 226.66158700000005 88.853741 247.53168300000004L100.361551 260.599873C106.603075 267.55657099999996 117.200662 268.20673 124.287392 262.22527 131.309106 256.048762 132.024281 245.51619000000005 125.912789 238.55949199999998 107.448281 217.62438099999997 98.085995 173.08850800000005 119.216154 154.81904799999995 140.281297 136.614603 183.841932 151.76330199999995 202.371455 172.69841299999996 208.417932 179.525079 219.145551 180.30526999999995 226.167265 174.19377799999995 233.188979 168.14730199999997 233.904154 157.61473 227.792662 150.65803200000005 209.328154 129.85295199999996 199.965868 85.05701599999998 221.096027 66.91758700000003 242.16117 48.648127000000045 285.656789 63.86184100000003 304.186313 84.666921 310.362821 91.62361899999996 321.025424 92.40381000000002 327.982122 86.29231700000003 335.068852 80.18082500000003 335.784027 69.71326999999997 329.672535 62.75657100000001 311.143011 41.82146 301.845741-2.9094599999999673 322.910884-20.983873000000017 344.041043-39.253333 387.601678-24.039619000000016 406.00117-3.234540000000038 412.177678 3.7221590000000333 422.840281 4.437332999999967 429.927011-1.6091430000000173 436.948725-7.720635000000016 437.598884-18.31822199999999 431.487392-25.144889000000035 413.022884-46.08000000000004 403.725614-90.81092100000001 424.790757-109.01536499999997 445.920916-127.15479400000004 477.973741-125.00927000000001 496.373233-104.20419000000004L667.299963 95.52457100000004 658.652852 132.90869799999996 210.238376 489.910857 210.238376 489.910857ZM844.013106 329.516698L680.10809 471.12127 929.639011 715.190857C933.2799 718.376635 936.725741 721.562413 939.976535 725.203302 977.815773 768.048762 973.524725 833.129651 930.28917 870.513778 887.183646 907.702857 821.58263 903.281778 783.808408 860.631365L783.483328 860.761397 564.249805 571.3107299999999 399.824662 713.56546C385.391138 726.113524 363.480789 724.553143 350.867709 710.249651L248.14263 593.871238 225.322059 567.994921 251.393424 545.434413 695.7119 161.25561900000002 726.26936 136.679619 847.328916 281.014857C859.941995 295.318349 858.44663 316.96863499999995 844.013106 329.516698L844.013106 329.516698ZM817.941741 830.724063C839.136916 854.779937 876.000916 857.315556 900.186821 836.250413 924.372725 815.380317 926.908344 778.906413 905.648154 754.85054 884.452979 730.924698 847.588979 728.389079 823.403075 749.3892060000001 799.21717 770.324317 796.811582 806.798222 817.941741 830.724063L817.941741 830.724063ZM765.473932 758.491429C768.919773 741.522286 777.6319 725.593397 791.80536 713.305397 806.043836 701.017397 823.533106 694.580825 841.087392 693.540571L643.634186 494.526984 593.116852 538.2176509999999 765.473932 758.491429 765.473932 758.491429ZM776.006503 299.739429L709.755328 219.314794 307.502122 566.369524 376.809043 645.03873C382.920535 651.865397 393.38809 652.5155560000001 400.409805 646.534095L774.381106 323.01511100000005C781.337805 317.098667 782.117995 306.69612700000005 776.006503 299.739429L776.006503 299.739429Z"  horiz-adv-x="1063" />
+
+    
+    <glyph glyph-name="triangle-r" unicode="&#58915;" d="M293.291 728.256l426.88-355.456-426.88-355.52z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="circle" unicode="&#58943;" d="M511.998 847.999C255.739 847.999 48 640.26 48 383.999c0-256.258 207.739-463.998 463.998-463.998C768.261-79.99900000000002 976 127.74199999999996 976 383.999 976 640.26 768.261 847.999 511.998 847.999zM512.002-16.000999999999976c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400C912 163.087 732.914-16.000999999999976 512.002-16.000999999999976z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="radio" unicode="&#58947;" d="M512.5 383.5m-192 0a192 192 0 1 1 384 0 192 192 0 1 1-384 0ZM511.998 847.999C255.739 847.999 48 640.26 48 383.999c0-256.258 207.739-463.998 463.998-463.998C768.261-79.99900000000002 976 127.74199999999996 976 383.999 976 640.26 768.261 847.999 511.998 847.999zM512.002-16.000999999999976c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400C912 163.087 732.914-16.000999999999976 512.002-16.000999999999976z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="align-center" unicode="&#58951;" d="M992 448L32 448C14.32 448 0 462.336 0 480 0 497.664 14.32 512 32 512L992 512C1009.68 512 1024 497.664 1024 480 1024 462.336 1009.68 448 992 448ZM800 704C817.664 704 832 689.664 832 672 832 654.336 817.664 640 800 640L224 640C206.32 640 192 654.336 192 672 192 689.664 206.32 704 224 704L800 704ZM992 832L32 832C14.32 832 0 846.336 0 864 0 881.664 14.32 896 32 896L992 896C1009.68 896 1024 881.664 1024 864 1024 846.336 1009.68 832 992 832ZM224 256C206.32 256 192 270.336 192 288 192 305.664 206.32 320 224 320L800 320C817.664 320 832 305.664 832 288 832 270.336 817.664 256 800 256L224 256ZM32 128L992 128C1009.68 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.68 64 992 64L32 64C14.32 64 0 78.33600000000001 0 96 0 113.66399999999999 14.32 128 32 128ZM224-64L800-64C817.664-64 832-78.33600000000001 832-96 832-113.66399999999999 817.664-128 800-128L224-128C206.32-128 192-113.66399999999999 192-96 192-78.33600000000001 206.32-64 224-64Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="align-right" unicode="&#58952;" d="M992 64L32 64C14.32 64 0 78.33600000000001 0 96 0 113.66399999999999 14.32 128 32 128L992 128C1009.68 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.68 64 992 64ZM992 256L288 256C270.32 256 256 270.336 256 288 256 305.664 270.32 320 288 320L992 320C1009.68 320 1024 305.664 1024 288 1024 270.336 1009.68 256 992 256ZM992 448L32 448C14.32 448 0 462.336 0 480 0 497.664 14.32 512 32 512L992 512C1009.68 512 1024 497.664 1024 480 1024 462.336 1009.68 448 992 448ZM992 640L288 640C270.32 640 256 654.336 256 672 256 689.664 270.32 704 288 704L992 704C1009.68 704 1024 689.664 1024 672 1024 654.336 1009.68 640 992 640ZM992 832L32 832C14.32 832 0 846.336 0 864 0 881.664 14.32 896 32 896L992 896C1009.68 896 1024 881.664 1024 864 1024 846.336 1009.68 832 992 832ZM288-64L992-64C1009.68-64 1024-78.33600000000001 1024-96 1024-113.66399999999999 1009.68-128 992-128L288-128C270.32-128 256-113.66399999999999 256-96 256-78.33600000000001 270.32-64 288-64Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="align-left" unicode="&#58953;" d="M992 448L32 448C14.336 448 0 462.336 0 480 0 497.664 14.336 512 32 512L992 512C1009.664 512 1024 497.664 1024 480 1024 462.336 1009.664 448 992 448ZM32 704L736 704C753.68 704 768 689.664 768 672 768 654.336 753.68 640 736 640L32 640C14.336 640 0 654.336 0 672 0 689.664 14.336 704 32 704ZM992 832L32 832C14.336 832 0 846.336 0 864 0 881.664 14.336 896 32 896L992 896C1009.664 896 1024 881.664 1024 864 1024 846.336 1009.664 832 992 832ZM32 320L736 320C753.68 320 768 305.664 768 288 768 270.336 753.68 256 736 256L32 256C14.336 256 0 270.336 0 288 0 305.664 14.336 320 32 320ZM32 128L992 128C1009.664 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.664 64 992 64L32 64C14.336 64 0 78.33600000000001 0 96 0 113.66399999999999 14.336 128 32 128ZM32-64L736-64C753.68-64 768-78.33600000000001 768-96 768-113.66399999999999 753.68-128 736-128L32-128C14.336-128 0-113.66399999999999 0-96 0-78.33600000000001 14.336-64 32-64Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="loading-1" unicode="&#58942;" d="M537.574469 831.696462c-14.123672 0-25.574469-11.447726-25.574469-25.574469 0-14.123672 11.450796-25.574469 25.574469-25.574469 204.495464 0 370.82877-166.358889 370.82877-370.82877 0-14.123672 11.450796-25.574469 25.574469-25.574469 14.123672 0 25.574469 11.450796 25.574469 25.574469C959.551152 642.385838 770.241552 831.696462 537.574469 831.696462z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="return" unicode="&#58972;" d="M927.858848 417.938973L168.863431 417.938973l308.721247 308.86758c11.685133 11.69025 11.435447 30.881334-0.557702 42.868343-11.992125 11.985986-31.18321 12.226462-42.868343 0.536212L75.199191 411.071565c-1.994424-1.662873-3.773953-3.583618-5.294586-5.713119-4.047176-5.373381-6.013971-11.839653-5.9055-18.328437-0.12996-7.794523 2.725064-15.561417 8.595772-21.432125l361.565802-361.744881c11.685133-11.691273 30.876218-11.449773 42.868343 0.535189 11.993149 11.985986 12.242835 31.17707 0.557702 42.868343L168.441828 356.54571799999997l759.417019 0c16.527418 0 29.925566 13.738909 29.925566 30.694069S944.386266 417.938973 927.858848 417.938973z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-strong" unicode="&#58923;" d="M199.092919 848.487893l355.326704 0c70.335928 0 122.780371-2.942005 157.349701-8.809643 34.568307-5.884011 65.491597-18.131963 92.78522-36.759205 27.27725-18.627243 50.01409-43.427068 68.209498-74.397431 18.195408-30.986735 27.293623-65.699328 27.293623-104.169501 0-41.7161-11.17655-79.977519-33.496905-114.802676s-52.604078-60.951187-90.818425-78.362742c54.075593-15.765055 95.647407-42.626843 124.715443-80.585363s43.602054-82.58388 43.602054-133.877103c0-40.388872-9.417487-79.673597-28.220738-117.839849-18.803251-38.182624-44.482097-68.673056-77.035514-91.489714-32.55444-22.833031-72.702835-36.855396-120.414487-42.09984-29.931706-3.229554-102.122889-5.260817-216.572524-6.060019L199.092919-40.765192999999954 199.092919 848.487893zM378.171504 700.1084940000001l0-205.684546 117.64849 0c69.935816 0 113.410979 1.006933 130.390699 3.038196 30.730908 3.629667 54.891168 14.246469 72.478731 31.850405 17.588587 17.588587 26.381857 40.756239 26.381857 69.473281 0 27.501354-7.594979 49.838082-22.75219 67.042929-15.158235 17.188474-37.702694 27.597545-67.618027 31.242562-17.796318 2.01489-68.945255 3.038196-153.431461 3.038196L378.171504 700.109518zM378.171504 346.04454999999996l0-236.383732 166.622902 0c64.85203 0 106.008382 1.807159 123.43631 5.420453 26.750247 4.828982 48.543599 16.58063 65.363683 35.272341s25.247011 43.714617 25.247011 75.085092c0 26.526143-6.491855 49.03888-19.459191 67.538209-12.983709 18.48398-31.722492 31.961946-56.250118 40.404222s-77.739549 12.663414-159.619394 12.663414L378.171504 346.04454999999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="upload" unicode="&#59004;" d="M831.488 478.208C831.488 478.208 831.488 478.208 831.488 478.208c0 143.36-114.688 258.048-253.952 258.048-98.304 0-184.32-57.344-225.28-139.264C327.68 605.184 307.2 609.28 286.72 609.28c-90.112 0-159.744-73.728-159.744-159.744 0-16.384 4.096-28.672 8.192-40.96C57.344 379.904 0 310.27200000000005 0 224.25599999999997c0-106.496 86.016-192.512 192.512-192.512l192.512 0 0 192.512L258.048 224.25599999999997l258.048 258.048 258.048-258.048-126.976 0 0-192.512 192.512 0L839.68 35.84000000000003c106.496 16.384 192.512 110.592 192.512 221.184C1024 371.712 937.984 465.92 831.488 478.208z"  horiz-adv-x="1033" />
+
+    
+    <glyph glyph-name="dialogue" unicode="&#58938;" d="M998.4 500.992C998.4 682.24 811.392 829.696 581.632 829.696c-121.216 0-235.904-41.472-315.264-114.048 37.504 8.192 76.416 13.056 115.456 14.464 59.264 30.592 128.256 46.72 199.808 46.72 198.144 0 359.296-123.776 359.296-275.968 0-31.872-7.04-63.232-20.992-93.056 7.552-28.16 11.264-57.344 11.008-86.528C975.104 374.784 998.4 436.736 998.4 500.992L998.4 500.992zM442.368 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328S473.088 398.72 442.368 398.72zM243.328 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328C299.264 375.67999999999995 274.176 398.72 243.328 398.72zM641.28 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328S672.128 398.72 641.28 398.72zM442.368 677.888C212.608 677.888 25.6 530.432 25.6 349.312c0-179.968 173.696-296.192 332.544-321.664l60.8-78.336c5.632-7.424 14.464-11.008 23.296-11.008 8.832 0 17.792 3.712 23.424 11.008l60.8 78.464C685.312 53.24800000000005 859.008 169.47199999999998 859.008 349.44000000000005 859.136 530.432 672.128 677.888 442.368 677.888zM714.88 173.82399999999996c-52.224-45.184-124.288-77.952-197.376-89.6C503.168 81.91999999999996 490.112 74.24000000000001 481.28 62.72000000000003l-38.784-49.92-38.912 49.92c-8.96 11.52-21.888 19.2-36.224 21.504-73.216 11.776-145.152 44.416-197.376 89.728-39.68 34.304-86.912 92.544-86.912 175.36 0 69.76 35.584 136.192 100.352 187.264 68.736 54.144 160.768 84.096 258.944 84.096 98.304 0 190.336-29.824 259.072-84.096 64.768-51.072 100.352-117.504 100.352-187.264C801.664 266.36800000000005 754.56 208.12800000000004 714.88 173.82399999999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="video" unicode="&#59117;" d="M952.523633 599.2477269999999L952.523633 599.2477269999999 952.523633 599.2477269999999zM100.53762400000005 661.054062C100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062zM100.74228 720.404517L100.74228 720.404517 100.74228 720.404517zM660.990107 739.9449716666666c8.697911 0 17.498151-0.511642 25.684421-2.353553 12.279404-2.865194 23.22854-8.18627 34.382332-16.679524 15.144599-11.460777 26.196063-29.572899 32.02878-52.187469 3.479165-13.405016 2.967523-28.651944 2.558209-42.05696-0.102328-4.195463-0.204657-8.083941-0.204657-11.665434l0-37.759169 101.407415 70.401919 25.479764 17.60048c0.511642 0.306985 1.330269 1.023284 2.148896 1.637254 4.40012 3.376836 11.051464 8.595583 20.977316 11.051464 3.274508 0.818627 6.549016 1.22794 10.02818 1.22794 9.618867 0 19.44239-3.274508 27.730987999999996-9.311882 18.82842-13.916657999999998 18.726092-35.405616 18.726092-51.061857 0-1.023284 0-2.148896 0-3.172179l0-409.620466c0-15.963226 0.102328-37.963825-19.647047-51.982812-6.753672-4.809433-16.679524-8.390926-27.219346-8.390926-5.01409 0-10.130509 0.818627-15.144599 2.762866-7.162986 2.762866-12.279404 6.856000999999999-16.065554 9.823524-0.920955 0.716299-1.841911 1.432597-2.353553 1.841911l-24.968122 17.395823-101.10043 70.094934 0-37.963825c0-3.581493 0.102328-7.367643 0.204657-11.460777 0.409313-14.735285 0.818627-29.982212-2.865194-43.796542-5.62806-21.488957999999997-16.679524-39.396423-31.107825-50.447886-7.879285-6.037374-18.930748-13.405016-34.075347-16.986509-7.776956-1.841911-16.167882-2.353553-24.45648-2.353553-4.297792 0-8.595583 0.102328-12.688718 0.204657-3.683821 0.102328-7.162986 0.204657-10.232837 0.204657L167.15339300000005 84.94107466666674c-1.944239 0-3.888478 0-5.832717 0-1.944239 0-3.990806 0-5.935045 0-16.577196 0-33.461377 0.61397-47.787349 6.549016-27.935644999999997 11.563106-46.764065 37.759169-53.006096 73.574098l-0.409313 2.251224 0 2.353553c-0.102328 18.930748-0.204657 37.861497-0.306985 56.792245l0 0.511642L53.87588699999998 598.0155226666666c0 4.40012-0.102328 8.902568-0.102328 13.712001999999998-0.306985 27.01469-0.716299 54.950335 9.311882 76.643949 9.823524 21.284300999999996 27.526331999999996 38.066154 48.708304 45.945438 5.730389 2.148896 11.051464 2.762866 15.04227 3.172179 1.023284 0.102328 2.353553 0.306985 3.069851 0.409313l4.093135 1.534926 500.9997 0c3.581493 0 7.572299 0.102328 11.767763 0.306985C651.166583 739.7403146666667 656.078345 739.9449716666666 660.990107 739.9449716666666M304.273409 266.7785886666668L559.889677 394.2797376666667l0 33.973019L304.273409 555.9585626666667 304.273409 266.7785886666668M660.990107 780.8763196666666c-5.62806 0-10.949136-0.204657-15.758569-0.306985-3.888478-0.102328-7.469971-0.204657-10.437494-0.204657L133.79434400000002 780.3646776666667l-7.265314 0-6.446687-2.353553c-5.3210749999999996-0.61397-13.609673-1.841911-22.716898-5.218747-31.210153-11.665434-57.303887-36.121915-71.629859-67.229739-13.814329999999998-30.084541-13.405016-64.159888-12.995703-94.244429 0.102328-4.604777 0.102328-9.004897 0.102328-13.20036l0-371.349655 0-0.102328 0-0.102328 0-0.511642c0.102328-18.930748 0.204657-37.861497 0.306985-56.792245l0-2.251224 0-3.479165 0.61397-3.376836 0.409313-2.251224c4.195463-23.944839 12.791046-45.126811 25.479764-62.727291 13.609673-18.82842 31.107825-32.847407 52.08514-41.545318 21.488957999999997-8.902568 44.001199-9.618867 63.443589-9.618867 2.046567 0 4.093135 0 6.139702 0 1.841911 0 3.78615 0 5.62806 0l473.166384 0c2.558209 0 5.62806-0.102328 9.004897-0.204657 4.195463-0.102328 8.902568-0.306985 13.916657999999998-0.306985 13.302688 0 24.149495 1.125612 33.973019 3.479165 22.819227 5.423404 39.089437 16.474868 49.322274 24.251824 21.693613999999997 16.577196 37.963825 42.363944999999994 45.84311 72.653143 2.251224 8.595583 3.376836 17.088838 3.990806 25.377436l36.838213-25.582093 24.558809-17.088838c0.306985-0.204657 0.61397-0.511642 0.920955-0.716299 4.809433-3.683821 13.609673-10.642149999999999 26.400719-15.656241 9.516538-3.683821 19.647047-5.62806 30.084541-5.62806 18.009793 0 36.53122799999999 5.832717 50.8572 15.963226 16.577196 11.767763 27.730987999999996 27.935644999999997 33.052064 48.094334 3.78615 14.4283 3.78615 27.628659999999996 3.78615 37.34985499999999l0 409.518137c0 0.920955 0 1.739582 0 2.660538l0 0.409313c0 9.41421 0.102328 22.409913-3.479165 36.53122799999999-5.116419 19.749375-15.758569 35.81493-31.721795 47.68502-15.144599 11.153792-33.666034 17.293495-52.08514 17.293495-6.753672 0-13.507345-0.818627-19.954032-2.455881-18.21445-4.604777-30.289198-13.916657999999998-36.019586-18.419107l0 0c-0.204657-0.204657-0.511642-0.409313-0.716299-0.511642l-25.172779-17.293495-0.102328 0-0.102328 0-37.14519799999999-25.786749c-0.511642 7.674628-1.637254 15.553912-3.683821 23.433197-8.18627 31.721795-24.354152 57.508544-46.866394 74.597382-15.758569 11.972419-32.02878 19.851704-49.833916 23.944839C685.8559009999999 779.7507076666667 674.702109 780.8763196666666 660.990107 780.8763196666666L660.990107 780.8763196666666zM345.204757 332.9850436666668L345.204757 489.75210666666663l157.074048-78.48586L345.204757 332.9850436666668 345.204757 332.9850436666668zM347.455981 429.177975L347.455981 308.02118499999995 347.455981 429.177975Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="headset" unicode="&#59132;" d="M356.285031 2.1522690000000466L356.396571 2.1522690000000466 356.396571 285.236626 253.462201 285.236626 253.462201 2.1522690000000466ZM665.076886 285.236626l103.042841 0 0-283.08538-103.042841 0 0 283.08538ZM63.809793 301.950286c0-38.758746-3.195785-112.220874 5.457292-148.208507l65.735144 0c-10.112312 35.644825-7.747451 109.176538-7.747451 148.208507 0 219.937155 172.264389 398.231887 384.763131 398.231887 212.498742 0 384.763131-178.294732 384.763131-398.231887 0-39.031968 2.266623-112.563682-7.845689-148.208507l65.735144 0c8.653077 35.987632 5.555529 109.449761 5.555529 148.208507 0 256.20415-200.670346 463.898469-448.208115 463.898469C264.479115 765.848755 63.809793 558.1544349999999 63.809793 301.950286z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="cellphone-fine" unicode="&#58939;" d="M731.514252 896L292.485748 896C195.323702 896 116.154627 816.830925 116.154627 719.6688790000001l0-671.337759c0-97.162046 79.169075-176.331121 176.331121-176.331121l438.628661 0c97.162046 0 176.331121 79.169075 176.331121 176.331121L907.445529 719.6688790000001C907.845373 816.830925 828.676298 896 731.514252 896zM292.485748 853.216712l438.628661 0c70.772355 0 128.349863-55.178446 133.147989-124.751269L159.737602 728.465443C164.135884 798.038266 222.113237 853.216712 292.485748 853.216712zM865.062085 48.73096399999997c0-73.571261-59.976572-133.547833-133.547833-133.547833L292.485748-84.816868c-73.571261 0-133.547833 59.976572-133.547833 133.547833l0 45.582194 705.724326 0L864.662241 48.73096399999997zM865.062085 137.096447L158.937915 137.096447 158.937915 685.682155l705.724326 0L864.662241 137.096447zM512-54.82858299999998c13.59469 0 26.789535 5.597813 36.385787 15.194065 9.596251 9.596251 15.194065 22.791097 15.194065 36.385787 0 13.59469-5.597813 26.789535-15.194065 36.385787-9.596251 9.596251-22.791097 15.194065-36.385787 15.194065-13.59469 0-26.789535-5.597813-36.385787-15.194065-9.596251-9.596251-15.194065-22.791097-15.194065-36.385787 0-13.59469 5.597813-26.789535 15.194065-36.385787C485.210465-49.23076900000001 498.40531-54.82858299999998 512-54.82858299999998z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="add-1" unicode="&#58964;" d="M566.935 57.63900000000001c0-30.366-24.612-54.972-54.935-54.972v0c-30.384 0-54.996 24.612-54.996 54.972v610.057c0 30.361 24.612 54.972 54.996 54.972v0c30.33 0 54.935-24.612 54.935-54.972v-610.057zM817.004 417.633c30.384 0 54.996-24.606 54.996-54.966v0c0-30.354-24.612-54.966-54.996-54.966h-610.062c-30.33 0-54.942 24.612-54.942 54.966v0c0 30.359 24.612 54.966 54.942 54.966h610.062zM817.004 417.633z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="face-smile-b" unicode="&#58960;" d="M511.931733-128c-136.738133 0-265.284267 53.213867-361.984 149.879467C53.282133 118.51093300000002 0 247.09119999999996 0 384c0 136.738133 53.282133 265.3184 150.050133 362.0864C246.749867 842.683733 375.296 896 512.136533 896s265.4208-53.316267 362.1888-149.9136c199.645867-199.714133 199.543467-524.5952 0-724.206933C777.454933-74.71786699999996 648.772267-128 511.931733-128L511.931733-128 511.931733-128 511.931733-128 511.931733-128 511.931733-128zM512.034133 829.303467c-118.920533 0-230.741333-46.2848-314.914133-130.389333C113.083733 614.8778669999999 66.7648 502.8864 66.7648 384c0-118.9888 46.2848-230.912 130.3552-315.016533 84.0704-84.0704 195.857067-130.321067 314.811733-130.321067 119.022933 0 230.946133 46.318933 315.016533 130.423467 173.704533 173.636267 173.704533 456.157867 0 629.794133C742.877867 782.984533 631.057067 829.303467 512.034133 829.303467L512.034133 829.303467 512.034133 829.303467 512.034133 829.303467 512.034133 829.303467 512.034133 829.303467zM330.103467 244.25813300000004c0 0 59.904-95.9488 181.828267-95.9488s201.8304 95.9488 201.8304 95.9488 45.294933 0.136533 45.192533-47.957333c0 0-78.506667-111.8208-247.022933-111.8208s-223.368533 111.8208-223.368533 111.8208S286.856533 244.25813300000004 330.103467 244.25813300000004L330.103467 244.25813300000004 330.103467 244.25813300000004 330.103467 244.25813300000004 330.103467 244.25813300000004zM363.2128 548.590933c-34.5088 0-62.702933-28.091733-62.702933-62.737067 0-34.679467 28.194133-62.6688 62.702933-62.6688 34.679467 0 62.702933 28.091733 62.702933 62.6688C425.915733 520.4992 397.858133 548.590933 363.2128 548.590933L363.2128 548.590933 363.2128 548.590933 363.2128 548.590933 363.2128 548.590933 363.2128 548.590933zM684.544 548.590933c-34.679467 0-62.702933-28.091733-62.702933-62.737067 0-34.679467 28.023467-62.6688 62.702933-62.6688 34.6112 0 62.600533 28.091733 62.600533 62.6688C747.144533 520.4992 719.121067 548.590933 684.544 548.590933L684.544 548.590933 684.544 548.590933 684.544 548.590933 684.544 548.590933 684.544 548.590933zM684.544 548.590933"  horiz-adv-x="1025" />
+
+    
+    <glyph glyph-name="fonts-html" unicode="&#58955;" d="M194.33 416.235h-101.295v101.28h-46.035v-267.03h46.035v119.7h101.28v-119.7h46.035v267.03h-46.035v-101.28zM277.205 480.69h73.665v-230.205h46.035v230.205h73.665v36.825h-193.365v-36.825zM627.815 335.58000000000004l-46.755 181.935h-73.665v-267.03h46.035v211.785l46.035-211.785h55.245l46.83 213.93-0.795-213.93h46.035v267.03h-73.665l-45.3-181.935zM848.09 287.30999999999995v230.205h-46.035v-267.03h174.945v36.825h-128.91z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="screen-full" unicode="&#58914;" d="M641.750109 511.899972l205.227128 204.519-0.704035-115.89966c-0.282433-9.611915 7.489578-18.09103 17.101493-17.808598l12.297071 0c9.611915 0.283456 17.667382 5.936199 17.808598 15.689331l0.565888 172.57752c0 0.14224 0.282433 9.187243 0.282433 9.187243 0.14224 4.804423-0.99056 9.187243-4.100388 12.297071-3.109828 3.109828-7.347339 5.086855-12.297071 4.946662l-8.763594-0.14224c-0.141216 0-0.278339 0-0.420579-0.14224L697.581696 797.833213c-9.611915-0.283456-17.667382-8.200776-17.808598-17.950837l0-12.297071c1.416256-11.44875 10.458189-18.092054 20.070104-17.808598l112.789832-0.283456-204.66124-203.814965c-9.329483-9.329483-9.329483-24.449855 0-33.778314 9.329483-9.470699 24.452925-9.470699 33.782408 0L641.750109 511.899972zM383.095141 319.11010699999997L177.726797 115.29411900000002l0.707105 115.338888c0.283456 9.607822-7.492648 18.086937-17.104563 17.808598l-13.001105 0c-9.611915-0.283456-17.667382-5.937223-17.808598-15.690354l-0.565888-172.718737c0-0.14224-0.282433-9.187243-0.282433-9.187243-0.14224-4.808516 0.99056-9.187243 4.096295-12.297071 3.109828-3.109828 7.351432-5.086855 12.297071-4.946662l8.762571 0.14224c0.14224 0 0.283456 0 0.425695 0.14224l171.873486-0.708128c9.607822 0.283456 17.667382 8.196683 17.808598 17.950837L344.93503 63.42477399999996c-1.415232 11.44875-10.461259 18.092054-20.074198 17.808598L212.069977 81.51682800000003 416.59 285.32872299999997c9.329483 9.329483 9.329483 24.453948 0 33.782408C407.40685 328.58182999999997 392.424624 328.58182999999997 383.095141 319.11010699999997L383.095141 319.11010699999997zM894.047276 60.03251399999999l-0.424672 172.718737c-0.283456 9.612938-8.200776 15.406898-17.809621 15.690354l-12.296047 0c-9.612938 0.278339-17.243733-8.200776-17.105586-17.808598l0.708128-115.903753L641.750109 319.11010699999997c-9.329483 9.329483-24.452925 9.329483-33.782408 0-9.325389-9.328459-9.325389-24.452925 0-33.782408L812.490795 81.51682800000003l-112.789832-0.283456c-9.611915 0.283456-18.515702-6.502088-20.073174-17.808598l0-12.297071c0.282433-9.611915 8.200776-17.667382 17.808598-17.950837l171.166381 0.708128c0.141216 0 0.282433-0.14224 0.424672-0.14224l8.763594-0.14224c4.803399-0.141216 9.187243 1.694595 12.296047 4.946662 3.109828 3.109828 4.238534 7.488555 4.097318 12.297071 0 0-0.14224 9.046027-0.14224 9.187243L894.047276 60.03149099999996zM212.216309 749.493252l112.789832 0.283456c9.607822-0.283456 18.512632 6.502088 20.070104 17.808598L345.076246 779.883399c-0.283456 9.611915-8.196683 17.667382-17.808598 17.950837l-172.011632-0.708128c-0.14224 0-0.283456 0.14224-0.425695 0.14224l-8.761548 0.14224c-4.808516 0.141216-9.187243-1.694595-12.297071-4.946662-3.109828-3.109828-4.242627-7.488555-4.096295-12.297071 0 0 0.282433-9.046027 0.282433-9.187243l0.420579-172.718737c0.14224-9.608845 8.200776-15.406898 17.808598-15.686261l13.005198 0c9.611915-0.282433 17.242709 8.196683 17.10047 17.808598l-0.564865 115.334795 205.231221-203.958228c9.324366-9.329483 24.448832-9.329483 33.777291 0 9.329483 9.329483 9.329483 24.452925 0 33.782408L212.216309 749.493252 212.216309 749.493252zM212.216309 749.493252"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="form" unicode="&#58940;" d="M314.278111 437.019389l395.439892 0 0-30.297458-395.439892 0L314.278111 437.019389zM314.278111 315.83495200000004l395.439892 0 0-30.297458-395.439892 0L314.278111 315.83495200000004zM314.278111 194.62833l263.626661 0 0-30.297458L314.278111 164.330872 314.278111 194.62833zM609.376235 739.9931730000001c-7.849678 42.966669-48.394988 75.742447-97.378777 75.742447-48.961604 0-89.51311-32.775778-97.380776-75.742447L116.55177 739.9931730000001l0-787.725922 790.893774 0 0 787.725922L609.376235 739.9931730000001zM446.091342 670.440529l0 17.613058 0 36.791056c0 33.410348 29.57295 60.594317 65.906116 60.594317 36.352353 0 65.907115-27.183969 65.907115-60.594317l0-36.791056 0-17.621053 16.672696-8.712493c32.358061-16.929922 57.169039-42.663874 71.406386-73.213161L358.043239 588.50688c14.240345 30.555683 39.051523 56.281241 71.408385 73.213161L446.091342 670.440529zM874.489888-17.436289999999985L149.505227-17.436289999999985 149.505227 709.694715 413.138884 709.694715l0-21.641327c-51.44492-26.923746-88.727643-74.124144-98.86377-129.845165l395.44289 0c-10.102151 55.730615-47.40466 102.921419-98.859773 129.845165l0 21.641327 263.631658 0L874.489888-17.436289999999985z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="cart" unicode="&#58967;" d="M365.920994 84.618469c-39.030945 0-70.78516-31.754215-70.78516-70.78516s31.754215-70.784136 70.78516-70.784136c39.030945 0 70.784136 31.753191 70.784136 70.784136S404.951939 84.618469 365.920994 84.618469zM365.920994-5.784493999999995c-10.818393 0-19.61985 8.801457-19.61985 19.618826 0 10.818393 8.801457 19.61985 19.61985 19.61985s19.618826-8.801457 19.618826-19.61985C385.540843 3.015939000000003 376.739387-5.784493999999995 365.920994-5.784493999999995zM808.821219 84.618469c-39.030945 0-70.784136-31.754215-70.784136-70.78516s31.753191-70.784136 70.784136-70.784136 70.78516 31.753191 70.78516 70.784136S847.852164 84.618469 808.821219 84.618469zM808.821219-5.784493999999995c-10.81737 0-19.618826 8.801457-19.618826 19.618826 0 10.818393 8.801457 19.61985 19.618826 19.61985 10.818393 0 19.61985-8.801457 19.61985-19.61985C828.441069 3.015939000000003 819.640636-5.784493999999995 808.821219-5.784493999999995zM443.99107 305.940157c-14.057157-1.416256-24.305569-13.959943-22.890336-28.0171 1.328251-13.187347 12.446473-23.02132 25.423019-23.02132 0.856507 0 1.723248 0.042979 2.594081 0.130983l439.314561 44.245713c0.088004 0.007163 0.174985 0.01842 0.261966 0.026606l0.180102 0.01842c0.50449 0.051165 1.001817 0.119727 1.496074 0.198521 0.222057 0.035816 0.443092 0.076748 0.663102 0.11768 0.552585 0.103354 1.100054 0.217964 1.638313 0.355087 0.085958 0.022513 0.169869 0.047072 0.254803 0.069585 0.586354 0.156566 1.161453 0.334621 1.728364 0.530073 0.077771 0.026606 0.155543 0.051165 0.233314 0.078795 0.626263 0.222057 1.239224 0.469698 1.840928 0.737804 0.039909 0.017396 0.078795 0.035816 0.118704 0.054235 1.277086 0.577145 2.496867 1.252527 3.647063 2.020006 0.001023 0.001023 0.002047 0.001023 0.00307 0.002047 0.553609 0.369414 1.088798 0.76134 1.609661 1.170662 0.069585 0.054235 0.137123 0.10847 0.205685 0.163729 0.48607 0.38988 0.958838 0.795109 1.413186 1.218758 0.092098 0.084934 0.180102 0.173962 0.270153 0.25992 0.394996 0.378623 0.778736 0.76748 1.14815 1.169639 0.11154 0.121773 0.222057 0.243547 0.331551 0.367367 0.333598 0.3776 0.653893 0.766456 0.964978 1.163499 0.12382 0.158612 0.249687 0.314155 0.370437 0.475837 0.322341 0.432859 0.629333 0.876973 0.925069 1.329275 0.113587 0.173962 0.224104 0.348947 0.333598 0.525979 0.296759 0.479931 0.580215 0.968048 0.845251 1.467421 0.069585 0.130983 0.134053 0.265036 0.201591 0.397043 0.289596 0.568958 0.563842 1.147126 0.811482 1.738597 0.00307 0.007163 0.005117 0.014326 0.008186 0.021489 0.569982 1.369184 1.019213 2.796696 1.345648 4.26514 0 0.001023 0 0.002047 0.001023 0.00307l0.00307 0.013303c0.035816 0.162706 0.075725 0.323365 0.10847 0.487094l56.17951 252.734118c0.895393 4.030803 0.780783 8.04728-0.165776 11.794627 0.50449 2.003634 0.774643 4.101411 0.774643 6.261611 0 14.128789-11.452843 25.582655-25.582655 25.582655L195.47502 616.098125l-52.358485 159.553902c-3.631714 11.067057-14.093996 17.972327-25.177426 17.590634-0.207731 0.005117-0.413416 0.01535-0.62217 0.01535L54.663994 793.258011c-14.128789 0-25.582655-11.453866-25.582655-25.582655s11.453866-25.582655 25.582655-25.582655l45.614897 0 197.955514-603.235934c3.536546-10.776438 13.546527-17.613146 24.303522-17.613146 2.067079 0 4.16281 0.26299 6.245238 0.788969l567.583946 0c14.129812 0 25.582655 11.453866 25.582655 25.582655s-11.452843 25.582655-25.582655 25.582655L340.816223 173.1979 212.265428 564.933839l701.224666 0-48.137347-216.557174L443.99107 305.940157z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="camera-fill" unicode="&#58973;" d="M512 480C436.515555 480 375.111111 419.712 375.111111 345.6 375.111111 271.48800000000006 436.515555 211.20000000000005 512 211.20000000000005 587.484446 211.20000000000005 648.888887 271.48800000000006 648.888887 345.6 648.888887 419.712 587.484446 480 512 480M512 172.79999999999995C414.808889 172.79999999999995 336 250.15679999999998 336 345.6 336 441.0432 414.808889 518.4 512 518.4 609.210667 518.4 688 441.0432 688 345.6 688 250.15679999999998 609.210667 172.79999999999995 512 172.79999999999995M903.111113 691.2L723.767113 691.2C713.383113 691.2 703.448887 695.2512 696.115554 702.4512L640.792887 756.7488C633.459554 763.9488 623.505779 768 613.141333 768L512 768 410.878222 768C400.494222 768 390.56 763.9488 383.226667 756.7488L327.904 702.4512C320.570667 695.2512 310.616889 691.2 300.252445 691.2L120.888889 691.2C77.866667 691.2 42.666667 656.64 42.666667 614.4L42.666667 76.79999999999995C42.666667 34.559999999999945 77.866667 0 120.888889 0L903.111113 0C946.133333 0 981.333333 34.559999999999945 981.333333 76.79999999999995L981.333333 614.4C981.333333 656.64 946.133333 691.2 903.111113 691.2"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="tabs" unicode="&#58922;" d="M310.30303 523.636364L124.121212 523.636364c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-186.181818c0-17.128727 13.901576-31.030303 31.030303-31.030303l186.181818 0c17.128727 0 31.030303 13.901576 31.030303 31.030303L341.333333 492.606061C341.333333 509.734788 327.431758 523.636364 310.30303 523.636364zM294.787879 306.42424200000005L139.636364 306.42424200000005c-17.128727 0-15.515152-1.613576-15.515152 15.515152L124.121212 477.090909c0 17.128727-1.613576 15.515152 15.515152 15.515152l155.151515 0c17.128727 0 15.515152 1.613576 15.515152-15.515152l0-155.151515C310.30303 304.81066699999997 311.916606 306.42424200000005 294.787879 306.42424200000005zM418.909091 352.969697l480.969697 0 0 31.030303L418.909091 384 418.909091 352.969697zM418.909091 228.84848499999998l480.969697 0 0 31.030303L418.909091 259.878788 418.909091 228.84848499999998zM418.909091 89.21212100000002l480.969697 0 0 31.030303L418.909091 120.24242400000003 418.909091 89.21212100000002zM418.909091 492.606061l480.969697 0 0 31.030303L418.909091 523.636364 418.909091 492.606061zM992.969697 725.333333l-15.515152 0L977.454545 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L775.757576 880.484848c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-124.121212-139.636364 0L605.090909 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L403.393939 880.484848c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-124.121212-124.121212 0L248.242424 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L31.030303 880.484848C13.901576 880.484848 0 866.583273 0 849.454545l0-946.424242c0-17.128727 13.901576-31.030303 31.030303-31.030303l961.939394 0c17.128727 0 31.030303 13.901576 31.030303 31.030303L1024 694.30303C1024 711.431758 1010.098424 725.333333 992.969697 725.333333zM992.969697-65.939394c0-17.128727-13.901576-31.030303-31.030303-31.030303L62.060606-96.969697c-17.128727 0-31.030303 13.901576-31.030303 31.030303L31.030303 818.424242c0 17.128727 13.901576 31.030303 31.030303 31.030303l124.121212 0c17.128727 0 31.030303-13.901576 31.030303-31.030303l0-124.121212 744.727273 0c17.128727 0 31.030303-13.901576 31.030303-31.030303L992.969697-65.939394z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="heart-fill" unicode="&#59023;" d="M729.068827 776.44202c-94.686523 0-176.905082-48.314379-217.069851-118.640074-40.163745 70.325695-122.382305 118.640074-217.044268 118.640074-143.767358 0-229.665727-123.660414-229.665727-243.219417 0-283.128359 415.870616-527.841803 433.576883-538.126031 4.062526-2.363837 8.584516-3.538593 13.132088-3.538593 4.547573 0 9.070586 1.174756 13.132088 3.538593 17.706267 10.283204 433.576883 254.997672 433.576883 538.126031C958.708971 652.781606 872.811626 776.44202 729.068827 776.44202z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-code" unicode="&#58958;" d="M270 626c-12 12-32 12-44 0L9 409c-12-12-12-32 0-44l217-217c6-6 14-9 22-9s16 3 22 9c12 12 12 32 0 44L75 387 270 582C282 595 282 614 270 626zM1015 409L798 626c-12 12-32 12-44 0-12-12-12-32 0-44l195-195L754 192c-12-12-12-32 0-44 6-6 14-9 22-9s16 3 22 9l217 217C1027 377 1027 397 1015 409zM624 696L624 696c-16 6-34-3-40-19L382 119c-6-16 2-34 19-40l0 0c16-6 34 3 40 19l202 558C648 672 640 690 624 696z"  horiz-adv-x="1025" />
+
+    
+    <glyph glyph-name="ios" unicode="&#59008;" d="M821.235026 351.984884c-1.287001 129.729651 105.791442 191.891776 110.553344 194.980577-60.102924 88.030835-153.796561 100.12864-187.258574 101.54434-79.794032 7.979403-155.598362-46.975519-196.010178-46.975519-40.411816 0-102.831341 45.688518-168.983167 44.530218-86.872534-1.287001-167.052666-50.57912-211.840284-128.442651-90.347436-156.756662-23.166009-388.931554 64.864826-515.958505 42.985817-62.162125 94.337137-132.046252 161.647264-129.600951 64.864826 2.574001 89.317835 41.956217 167.696167 41.956217s100.38604-41.956217 169.111867-40.669216c69.755428 1.287001 114.028245 63.449125 156.756662 125.86865 49.42082 72.200729 69.755428 142.084856 70.913728 145.559758C957.14228 145.550002 822.522026 197.030023 821.235026 351.984884L821.235026 351.984884 821.235026 351.984884zM692.277575 732.550935c35.778614 43.371917 59.845524 103.474841 53.281821 163.449065-51.48002-2.059201-113.899545-34.234214-150.83646-77.477431C561.647023 780.041254 532.560811 718.78003 540.411514 660.092806 597.811737 655.588305 656.49896 689.307718 692.277575 732.550935L692.277575 732.550935 692.277575 732.550935z"  horiz-adv-x="1084" />
+
+    
+    <glyph glyph-name="at" unicode="&#59015;" d="M514.162246 831.556269c-246.201331 0-446.51045-200.783932-446.51045-447.571618 0-246.772336 201.037712-447.539896 448.157973-447.539896 50.29857 0 99.615788 8.224312 146.523121 24.436552 18.414395 6.370081 31.060413 12.423961 31.472805 12.630668 7.194866 3.217275 12.614296 9.049097 15.213493 16.401552 2.63092 7.305383 2.155083 15.133675-1.299599 22.043039l-2.883677 5.831822c-7.131421 14.262842-24.974811 20.569478-40.156582 13.850449-0.031722-0.031722-5.8001-3.02694-20.094664-8.082072-41.075511-14.627139-84.21196-22.059412-128.235616-22.059412-210.92592 0-382.487298 171.57775-382.487298 382.487298S305.423131 766.487298 516.349051 766.487298c210.894198 0 382.455575-171.5931 382.455575-382.423853-0.887206-51.868321-13.882172-100.486622-36.606733-136.855948-20.664645-33.104979-46.939055-51.994188-72.199369-51.994188-0.317225 0-0.601704 0-0.887206 0-45.829791 0.792039-75.433016 68.586075-75.433016 172.718737l0 185.269587c0 5.53097-1.426489 9.635451-4.373611 12.550851-4.944616 4.944616-12.360516 4.817726-21.267373 4.864798l-2.472308-0.016373-9.223059 0.016373c-7.701402-0.031722-13.469779 0.063445-17.495466-3.945869-3.645017-3.613294-4.119831-9.096169-4.119831-13.469779l0-31.060413c-45.196365 36.100196-80.440054 59.474556-131.9758 60.378136-1.045819 0.016373-2.059915 0.031722-3.074012 0.031722-108.74368 0-198.470237-99.218746-200.657043-222.779899-2.155083-124.701117 84.845387-227.723491 193.969737-229.625818 1.045819-0.01535 2.059915-0.031722 3.074012-0.031722 63.293535 0 122.276904 34.087353 159.992901 92.103698 24.373107-60.251246 61.519122-91.216491 110.48637-92.071975 0.697895-0.01535 1.394766-0.01535 2.060939-0.01535 33.945113 0 66.716494 14.610766 94.924953 42.328038 47.63695 46.796816 76.066443 124.796284 76.066443 208.643947l0 2.883677C959.595154 630.772336 759.761873 831.556269 514.162246 831.556269zM646.73975 354.651578c0-92.230588-58.475809-167.282934-130.390699-167.282934s-130.390699 75.052347-130.390699 167.282934c0 92.246961 58.475809 167.298284 130.390699 167.298284S646.73975 446.897515 646.73975 354.651578z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fire" unicode="&#59222;" d="M890.059904 352.19948999999997C845.890699 458.956706 840.554889 548.4951550000001 857.396326 618.42714 859.144623 625.686731 860.991676 631.9776790000001 862.858846 637.425182 863.763607 640.064841 865.906573 645.659889 866.16406 646.532651L880.890349 696.448108 833.062903 675.9309969999999C832.106692 675.5208 830.618069 674.894716 827.426684 673.550492 824.667648 672.380966 822.310677 671.354022 819.868514 670.244809 813.291441 667.2575449999999 807.049466 664.090938 800.697749 660.4128450000001 784.089623 650.795565 768.486253 638.656896 753.86285 623.033596 727.630498 595.007563 706.526618 557.766355 691.78157 509.713231 675.041103 455.157161 671.516484 411.46006 673.004574 347.939834 673.477918 327.73476900000003 673.463923 322.197583 672.83965 318.324215 673.779618 324.156339 684.455526 333.67819899999995 696.104608 329.19567600000005 693.056849 330.36844199999996 685.695898 339.012828 676.314007 361.368339 660.550914 398.92921 646.834249 460.170272 636.817284 549.350468 625.445924 650.588768 630.103925 734.7280519999999 644.646978 801.338628 647.677924 815.221065 650.899934 827.082435 654.086773 836.904609 655.91465 842.538316 657.254607 846.094657 657.880284 847.554385L678.645286 896 628.243642 880.578031C617.409833 877.263087 599.94569 869.52239 578.105438 855.845223 542.547644 833.577626 507.199569 802.385036 474.400401 760.836776 447.596676 726.883228 423.611383 687.30061 403.118547 641.7016189999999 378.907516 587.829195 363.003277 542.798944 353.158029 503.238462 349.274261 487.632585 346.433259 473.323627 344.1945 458.925156 343.334411 453.39353 342.592734 448.063234 341.804612 441.911844 341.502524 439.553997 340.356619 430.329551 340.073506 428.145504 337.596047 409.033293 335.848224 404.35337 329.235273 398.312868 336.081933 404.566848 343.232634 404.098227 346.608002 402.086756 344.852318 403.133013 341.598345 406.493651 337.991853 411.887149 327.030897 428.279226 317.980358 454.883162 313.690598 489.339595 311.250185 508.941598 310.203772 539.08627 310.370048 576.545325 310.480474 601.422138 311.113088 628.122479 312.099068 654.977888 312.481453 665.393013 312.891081 675.105466 313.30045 683.8491750000001 313.545346 689.079919 313.735044 692.813105 313.84201 694.783403L317.55517 763.179488 271.360516 712.604139C270.467691 711.626645 268.852992 709.837042 266.618705 707.326295 262.927895 703.178805 258.823678 698.493751 254.407949 693.3614689999999 241.78797 678.693606 229.164348 663.340425 217.341267 648.004036 211.724185 640.717803 206.411389 633.591345 201.450577 626.6638379999999 176.017063 591.147305 156.617347 555.4025280000001 138.122768 512.155497 90.841957 401.595812 76.97672 299.64870599999995 99.261816 188.13489300000003 126.80821 50.29373899999996 188.553235-37.64422200000001 278.8297-84.690336 344.19104-118.75233700000001 408.837235-128 507.940695-128 525.713007-128 557.977207-125.567138 590.857378-120.46215900000004 641.152493-112.65333099999998 687.496192-99.78932299999997 726.063273-80.59104400000001 738.155853-74.57148800000004 743.07901-59.88870199999997 737.059454-47.79612199999997 731.039898-35.70354299999997 716.357111-30.780384000000026 704.264531-36.79993999999999 670.855859-53.43041900000003 629.092954-65.02289699999994 583.352478-72.12456999999995 552.984316-76.83953499999996 523.228215-79.08327499999996 507.940695-79.08327499999996 416.16215-79.08327499999996 357.934257-70.75375399999996 301.436271-41.310745999999995 224.830174-1.3887230000000272 171.977796 73.88423 147.230072 197.72094500000003 126.99711 298.965952 139.514783 391.004811 183.099329 492.921284 200.282663 533.1021499999999 218.020237 565.784358 241.22153 598.183718 245.831691 604.6215589999999 250.802959 611.289899 256.082244 618.137961 267.31885 632.713596 279.402035 647.409487 291.488864 661.457681 298.732051 669.8762429999999 304.338773 676.1767130000001 307.478705 679.614406L264.997214 697.435142C264.883874 695.347445 264.688038 691.493511 264.43725 686.13688 264.020474 677.234965 263.603959 667.359281 263.215279 656.7726250000001 262.21142 629.430212 261.566827 602.224414 261.453805 576.7624579999999 261.278897 537.3588179999999 262.385015 505.49418 265.148621 483.296209 276.058157 395.668083 322.627019 326.024497 362.226031 362.19561799999997 379.341732 377.829698 384.756649 392.328523 388.584361 421.857186 397.932742 493.974714 407.332926 531.746825 447.736538 621.64966 466.587287 663.594818 488.484326 699.731218 512.795234 730.526996 542.034492 767.565749 573.156162 795.028785 604.068111 814.386984 614.696751 821.043029 624.472062 826.201428 633.124687 830.036563 638.02329 832.207788 641.258688 833.404991 642.556233 833.802016L612.91959 866.825663C608.658554 856.884484 602.686705 838.478616 596.856038 811.772799 581.186705 740.003594 576.231674 650.498985 588.206246 543.890345 607.295279 373.94226100000003 638.819345 298.82556999999997 678.537329 283.542234 701.302332 274.78234499999996 717.731637 289.43566899999996 721.133156 310.5407 722.475759 318.870999 722.489387 324.26340300000004 721.907881 349.08549100000005 720.532565 407.791853 723.691247 446.952173 738.546223 495.36355 751.151827 536.44438 768.544047 567.135763 789.576147 589.605967 809.230566 610.60429 821.725461 617.839716 852.347733 630.9761169999999L842.705318 653.453557 819.246577 660.374464C822.235501 670.505564 813.450321 644.87463 809.839253 629.8801189999999 790.647573 550.1890470000001 796.611315 450.1135 844.8591 333.498332 883.105728 241.056017 874.587669 126.06492400000002 824.002925 61.39712899999995 815.680378 50.75754500000005 817.558709 35.38570000000004 828.198295 27.063153000000057 838.837879 18.740607999999952 854.209724 20.618939999999952 862.532269 31.258523999999966 924.762731 110.81426299999998 934.658528 244.404363 890.059904 352.19948999999997Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="set" unicode="&#59158;" d="M466.496-126.62400000000002l-1.056 0.064c-25.184 2.08-47.456 22.368-51.744 47.232l-17.344 102.4c-0.672 4.064-6.624 11.04-10.56 12.416l-30.336 12.416c-5.44 2.496-15.424 0.8-17.472-0.64l-84.992-60.16c-19.584-14.016-51.456-12.736-70.08 3.168l-64.288 64c-17.952 20.48-19.488 50.592-4.736 71.296l60.416 84.672c2.176 3.072 2.784 11.52 1.024 15.04l0 0c0 0-1.664 3.104-7.264 16.608-6.176 14.848-6.816 17.44-6.816 17.44-0.992 3.04-7.456 8.672-11.36 9.376l-102.56 17.248c-25.152 4.288-45.44 26.624-47.168 52L0 428.288c2.112 27.36 22.496 49.6 47.52 53.728l102.528 17.344c4.128 0.672 11.008 6.56 12.416 10.496l12.608 30.336c2.368 4.992 1.6 14.112-0.8 17.504L113.984 642.24C99.36 662.88 100.704 692.896 117.056 712.192l64.416 64.224c20.672 18.208 51.296 18.784 71.36 4.64l84.992-60.16c1.952-1.376 13.28-2.016 15.04-1.056 0.384 0.192 2.528 1.344 16.704 7.168 14.24 5.92 16.576 6.592 16.576 6.592 3.84 1.184 9.504 7.648 10.144 11.424l17.44 102.4c4.32 25.152 26.752 45.376 52.128 47.104l90.528 0.064c27.328-2.112 49.632-22.368 53.952-47.232l17.344-102.432c0.672-4.064 6.656-11.04 10.624-12.48l30.304-12.352c6.24-2.784 15.456-0.8 17.44 0.608l85.024 60.16c19.52 14.016 51.392 12.704 70.08-3.136l64.288-64.032c17.952-20.48 19.456-50.56 4.736-71.264l-60.416-84.672c-2.208-3.136-2.848-11.616-1.056-15.04 0.16-0.352 1.376-2.56 7.232-16.672 5.856-14.112 6.592-16.512 6.592-16.512 1.248-4.032 7.712-9.6 11.648-10.304l102.56-17.248c25.152-4.224 45.44-26.592 47.168-52l0.096-90.304c-2.112-27.392-22.528-49.6-47.552-53.728l-102.528-17.376c-4.128-0.672-10.944-6.496-12.32-10.432l-12.736-30.432c-2.336-4.928-1.568-14.112 0.832-17.472l60.288-84.512c14.624-20.736 13.216-50.816-3.232-70.048l-64.192-64.096c-11.328-9.92-24.64-14.72-38.784-14.72l0 0c-11.904 0-23.52 3.552-32.704 10.016l-84.992 60.16c-1.952 1.408-13.312 2.016-15.072 1.056-0.288-0.16-2.432-1.312-16.608-7.2-14.08-5.792-16.384-6.496-16.384-6.496-4.16-1.28-9.792-7.776-10.432-11.52l-17.408-102.4c-4.352-25.152-26.72-45.344-52.032-47.104L466.496-126.62400000000002zM347.84 100.60799999999995c10.368 0 20.192-2.112 28.48-6.112l27.648-11.296c20.416-7.072 38.976-28.992 42.848-51.584l17.344-102.336c0.288-1.6 3.136-4.32 5.056-4.832l87.296 0.064c-0.032 0.064 3.04 2.944 3.328 4.672l17.408 102.368c3.872 22.656 23.328 44.832 45.28 51.584 0 0 0 0 0 0-0.096 0 2.976 1.152 12.448 5.056 9.472 3.936 12.384 5.248 13.12 5.568 18.208 9.6 49.44 8.032 67.776-4.96l84.928-60.16c0.192-0.128 1.312-0.64 3.104-0.64l0 0c2.048 0 3.52 0.672 3.872 0.96l61.536 61.408 0 0c-0.16 0 0.064 4.416-0.992 5.952l-60.224 84.448c-13.248 18.624-15.68 47.168-5.792 67.872l11.648 27.84c6.944 19.968 29.408 38.912 51.68 42.496l102.464 17.376c1.824 0.384 4.736 3.648 4.864 5.408L972.8 428.288l0 0c-0.096 0-2.88 3.072-4.576 3.424l-102.72 17.28c-23.168 4.032-44.896 22.976-51.776 45.056l0 0c-0.032 0-1.216 3.04-5.12 12.512-3.968 9.568-5.28 12.512-5.632 13.248-10.24 19.36-8.288 48.736 4.96 67.456L868.448 672c0.96 1.408 0.736 5.6-0.384 6.912l-61.408 61.184c0.704-0.8-0.768-0.192-2.848-0.192-1.728 0-2.784-0.416-3.008-0.576l-85.024-60.16c-17.824-12.8-47.776-15.36-68-5.664l-27.712 11.296c-20.512 7.2-39.04 29.088-42.88 51.584l-17.344 102.336c-0.288 1.76-3.616 4.704-5.504 4.864L467.616 843.52c0-0.064-3.104-2.944-3.392-4.672l-17.408-102.336c-3.84-22.624-23.264-44.8-45.216-51.584 0-0.032-3.008-1.184-12.416-5.088-9.568-3.936-12.512-5.248-13.248-5.568-17.984-9.568-49.344-8.032-67.744 4.992L223.264 739.36c-0.416 0.32-6.176 0.288-6.848-0.224L154.688 677.6320000000001c0 0 0 0 0 0 0.224 0 0.032-4.384 1.056-5.856L216 587.264c13.312-18.752 15.744-47.296 5.76-67.968l-11.52-27.648c-6.976-20.032-29.472-38.944-51.776-42.624L55.968 431.68c-1.824-0.384-4.704-3.648-4.832-5.408l0.096-86.56 0 0c0.096 0 2.912-3.104 4.608-3.424l102.656-17.28c23.04-4 44.704-22.912 51.712-44.928 0.256-0.736 1.44-3.84 5.088-12.64 3.68-8.832 5.024-11.84 5.472-12.736 10.592-20.288 8.672-48.96-4.672-67.904l-60.512-84.768c-0.96-1.408-0.736-5.632 0.384-6.912l61.408-61.184c-0.736 0.8 0.736 0.224 2.816 0.192 1.728 0 2.784 0.416 3.008 0.576l84.992 60.16C318.624 96.32000000000005 333.088 100.60799999999995 347.84 100.60799999999995zM512.032 133.856c-138.336 0-250.848 112.224-250.848 250.176 0 137.92 112.544 250.144 250.848 250.144s250.848-112.224 250.848-250.144C762.88 246.08000000000004 650.336 133.856 512.032 133.856zM512.032 583.136c-110.08 0-199.648-89.312-199.648-199.104s89.568-199.136 199.648-199.136 199.648 89.344 199.648 199.136S622.112 583.136 512.032 583.136z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-u" unicode="&#58950;" d="M0-49.23076900000001L945.230769-49.23076900000001 945.230769-128 0-128 0-49.23076900000001ZM0 896L407.076943 896 407.076943 834.065644 319.153861 827.872177 299.076923 809.911217 299.076923 365.841959C299.076923 281.19796199999996 317.076716 220.709337 353.076933 184.37435100000005 389.077071 148.03936499999998 448.153442 129.87210800000003 530.307702 129.87210800000003 606.000364 129.87210800000003 660.807522 149.17482299999995 694.730752 187.78072599999996 728.653982 226.38662899999997 745.61536 289.66226700000004 745.61536 377.60953099999995L745.61536 804.956475 724.153817 826.633531 633.461524 834.065644 633.461524 896 955.384596 896 955.384596 834.065644 868.846119 826.633531 849.461563 804.956475 849.461563 364.60331299999996C849.461563 246.92743900000005 819.923338 161.66533900000002 760.846178 108.81441500000005 701.76894 55.96348999999998 606.462188 29.53846199999998 474.923087 29.53846199999998 406.153531 29.53846199999998 345.807951 38.51886300000001 293.884613 56.47990200000004 241.961275 74.44093999999996 201.230887 100.143419 171.692347 133.58820400000002 149.076834 160.01362700000004 133.038474 190.25793999999996 123.57695 224.32200899999998 114.115348 258.386078 109.384625 307.21047599999997 109.384625 370.796702L109.384625 809.911217 89.307687 827.872177 0 834.065644 0 896Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="triangle-d" unicode="&#58917;" d="M773.128299 88.65234199999998M889.696178 575.195553L158.862147 575.195553 524.357446 209.64704300000005 889.696178 575.195553Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="tips" unicode="&#59138;" d="M967.280184 578.537671c-24.915459 58.887178-60.544935 111.76755-105.96745 157.161413-45.393863 45.393863-98.273211 81.051991-157.160389 105.96745-60.988026 25.803689-125.735679 38.853913-192.494129 38.853913-66.729797 0-131.504056-13.0799-192.494129-38.853913-58.887178-24.916483-111.766526-60.544935-157.160389-105.96745-45.393863-45.393863-81.051991-98.274234-105.96745-157.161413-25.803689-60.988026-38.884612-125.734656-38.884612-192.464453s13.0799-131.50508 38.884612-192.464453c24.915459-58.887178 60.544935-111.737874 105.96745-157.161413 45.393863-45.393863 98.273211-81.051991 157.160389-105.96745 60.988026-25.803689 125.735679-38.853913 192.494129-38.853913 66.729797 0 131.504056 13.0799 192.494129 38.853913 58.887178 24.916483 111.766526 60.544935 157.160389 105.96745 45.393863 45.393863 81.051991 98.274234 105.96745 157.161413 25.803689 60.988026 38.853913 125.734656 38.853913 192.464453S993.084896 517.549645 967.280184 578.537671zM511.687892-55.138552000000004c-243.302305 0-441.241446 197.909465-441.241446 441.21177S268.385587 827.284989 511.687892 827.284989c243.273652-0.029676 441.210747-197.938118 441.210747-441.21177S754.990197-55.138552000000004 511.687892-55.138552000000004zM511.657192 573.565427m-45.511543 0a44.475 44.475 0 1 1 91.023086 0 44.475 44.475 0 1 1-91.023086 0ZM542.729885 184.14011300000004c0-17.162892-13.906731-31.071669-31.070646-31.071669l0 0c-17.163915 0-31.070646 13.907755-31.070646 31.071669L480.588593 426.998303c0 17.162892 13.906731 31.071669 31.070646 31.071669l0 0c17.163915 0 31.070646-13.907755 31.070646-31.071669L542.729885 184.14011300000004z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="picture" unicode="&#58954;" d="M765.376 615.424c0 0 103.04 1.024 103.04-100.992 0 0 9.536-98.752-103.04-100.928 0 0-100.864-2.176-99.84 100.928C665.536 514.496 664.448 605.8879999999999 765.376 615.424ZM968.32 770.56c0 0 54.208-4.224 54.208-52.032l0-712.832c0 0-3.2-51.008-54.208-52.096L968.32 770.56ZM1.472 5.631999999999948c0 0 2.176-52.096 52.096-52.096L968.32-46.464000000000055l0 150.848-99.712 0-203.072 206.144-153.024-153.984L304.32 413.568l-205.056-307.072-45.632-1.024L52.48 718.4639999999999 1.472 718.4639999999999 1.472 5.631999999999948ZM968.32 770.56L53.568 770.56c0 0-52.096 1.088-52.096-52.032L968.32 718.528 968.32 770.56Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="more-vertical" unicode="&#58993;" d="M511.998465 623.681848c40.525995 0 73.386404 35.771715 73.386404 79.892585s-32.860409 79.892585-73.386404 79.892585c-40.524972 0-73.384357-35.771715-73.384357-79.892585S471.47247 623.681848 511.998465 623.681848L511.998465 623.681848zM511.998465 463.893608c-40.524972 0-73.384357-35.772738-73.384357-79.893608 0-44.12087 32.859385-79.892585 73.384357-79.892585 40.525995 0 73.386404 35.772738 73.386404 79.892585C585.384869 428.12087 552.52446 463.893608 511.998465 463.893608L511.998465 463.893608zM511.998465 144.320199c-40.524972 0-73.384357-35.733852-73.384357-79.894631 0-44.119847 32.859385-79.893608 73.384357-79.893608 40.525995 0 73.386404 35.772738 73.386404 79.893608C585.383846 108.58634600000005 552.52446 144.320199 511.998465 144.320199L511.998465 144.320199z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="bluetooth" unicode="&#59017;" d="M844.799642 221.19607699999995L538.533306 374.84141l307.696917 177.029926c10.583033 5.006014 17.398252 15.59621 17.569144 27.302833s-6.332219 22.491247-16.764825 27.804253L475.584626 830.045869c-9.517771 4.846378-20.869307 4.39817-29.974685-1.181919-9.105379-5.581112-14.656815-15.493879-14.656815-26.174126l0-288.760636L210.662931 699.284733c-12.974499 10.915607-32.339546 9.248641-43.255153-3.724835-10.915607-12.973476-9.248641-32.339546 3.724835-43.255153L430.953126 433.687656l0-102.83511L171.558307 120.428046c-13.166881-10.68127-15.181771-30.013571-4.500501-43.180452 6.068206-7.480368 14.924921-11.360745 23.859407-11.360745 6.794753 0 13.634532 2.245134 19.322068 6.859221l220.714867 179.046862 0-283.065937c0-10.689457 5.561669-20.61041 14.680351-26.188452 4.903683-2.99931 10.455119-4.510734 16.019859-4.510734 4.78498 0 9.580193 1.118474 13.980409 3.368724l371.449917 224.085638c10.664897 5.456269 17.182334 16.618493 16.691147 28.589129C863.284645 206.04091200000005 855.875908 216.63110800000004 844.799642 221.19607699999995zM763.458055 580.639542L492.351498 420.917818l0 21.60711c0.563842 3.368724 0.558725 6.801916 0 10.153244L492.351498 752.604102 763.458055 580.639542zM492.351498 18.915047999999956L492.351498 311.51001199999996c0.558725 3.347235 0.562818 6.777357 0 10.146081l0 5.809309 267.472797-137.65822L492.351498 18.915047999999956z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="flag" unicode="&#58988;" d="M878.368178 798.272211c-11.363815 4.799306-24.470321 2.360767-33.31578-6.245238-0.36532-0.350994-37.162388-35.304064-95.163383-56.05262-75.462692-26.993794-150.763702-18.409279-223.812415 25.517163-38.347376 23.060205-81.875752 40.665165-129.376603 52.327786-37.582967 9.228175-77.742619 14.777565-119.363552 16.496719-70.805626 2.925632-121.493052-6.224772-123.615389-6.615675-14.56574-2.682086-25.140587-15.380292-25.140587-30.191626L128.58047-31.312913999999978c0-16.954137 13.745049-30.699186 30.699186-30.699186s30.699186 13.745049 30.699186 30.699186L189.978842 266.68306099999995c15.562441 5.250584 47.994084 14.447037 91.40171 17.48728 35.985586 2.51938 72.440869 0.378623 108.35073-6.363941 44.847417-8.420787 89.059362-24.102954 131.409912-46.611597 46.26879-24.591071 93.776803-41.069371 141.203976-48.977481 38.270629-6.380314 76.541257-7.219425 113.740484-2.491751 64.277956 8.16803 103.877859 30.461779 105.532545 31.406291 9.56689 5.464455 15.471366 15.637142 15.471366 26.656103L897.089565 769.958352C897.091612 782.298402 889.73711 793.470859 878.368178 798.272211zM835.69324 257.496841c-14.58416-5.755074-38.82526-13.530155-70.319555-17.225313-30.990828-3.635807-62.940494-2.676969-94.952582 2.851954-40.201607 6.943133-80.731696 21.171182-120.464629 42.289152-48.455595 25.753547-99.208513 43.61945-150.848637 53.101405-29.29214 5.378497-58.896388 8.079002-88.407516 8.079002-12.228509 0-24.443715-0.464581-36.609803-1.39272-34.879392-2.663666-63.618946-8.741082-84.111676-14.355963L189.978842 766.569162c19.971867 2.003634 50.446949 3.910053 86.392626 2.334161 58.186214-2.554172 143.250588-15.041578 218.064504-60.029188 61.32674-36.877909 119.196753-49.491181 169.691797-49.488111 42.293245 0.002047 79.416747 8.854669 109.019972 19.711947 24.269753 8.901741 45.327348 19.747763 62.544475 30.179346L835.692217 257.496841z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="loading" unicode="&#58941;" d="M511.999488 756.654348m-70.608128 0a69 69 0 1 1 141.216255 0 69 69 0 1 1-141.216255 0ZM236.047576 639.997442m-68.561515 0a67 67 0 1 1 137.123031 0 67 67 0 1 1-137.123031 0ZM125.530506 382.12428m-62.421678 0a61 61 0 1 1 124.843356 0 61 61 0 1 1-124.843356 0ZM227.861126 100.71507499999996m-54.235229 0a53 53 0 1 1 108.470457 0 53 53 0 1 1-108.470457 0ZM514.166851-16.84438799999998m-47.192835 0a46.118 46.118 0 1 1 94.385671 0 46.118 46.118 0 1 1-94.385671 0ZM804.730553 91.450061m-33.834596 0a33.064 33.064 0 1 1 67.669192 0 33.064 33.064 0 1 1-67.669192 0ZM935.55411 383.395226m-23.969924 0a23.424 23.424 0 1 1 47.939849 0 23.424 23.424 0 1 1-47.939849 0ZM856.723717 634.80007m-17.135262 0a16.745 16.745 0 1 1 34.270525 0 16.745 16.745 0 1 1-34.270525 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-i" unicode="&#58948;" d="M897.948 834.255l0-64.322-128.65 0L447.674-1.9329999999999927l128.65 0 0-64.32L126.052-66.25300000000004l0 64.32 128.65 0 321.622 771.866-128.65 0L447.674 834.255 897.948 834.255z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="refresh-1" unicode="&#58982;" d="M688.146 736l-192 128v-256l192 128.001zM496.146 767.7090000000001c-231.174-8.416-416-198.479-416-431.709 0-238.587 193.413-432 432-432 233.23 0 423.293 184.826 431.709 416h-64.05c-8.377-195.817-169.778-352-367.658-352-203.241 0-368 164.759-368 368 0 197.88 156.183 359.282 352 367.658v64.051z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="rmb" unicode="&#58974;" d="M511.998465 896C229.23338 896 0.004605 666.769178 0.004605 384.001023c0-282.773272 229.227752-512.001023 511.99386-512.001023 282.769178 0 511.994883 229.227752 511.994883 512.001023C1023.994372 666.769178 794.767644 896 511.998465 896zM511.998465-91.59690499999999c-262.660188 0-475.589742 212.930577-475.589742 475.597929 0 262.663258 212.929554 475.594859 475.589742 475.594859 262.663258 0 475.590765-212.9316 475.590765-475.594859C987.590254 121.33469500000001 774.662747-91.59690499999999 511.998465-91.59690499999999zM738.742652 301.137781L544.432155 301.137781l0 69.780273 194.310497 0c17.835204 0 32.249495 14.43885 32.249495 32.220842 0 17.784038-14.414291 32.19526-32.249495 32.19526L589.7462 435.334155l149.620669 209.579249c8.916067 15.397688 3.63069 35.099403-11.82021 43.988864-15.398712 8.891508-35.097356 3.629667-44.017516-11.793604L512.187777 437.098335 340.84334 677.108664c-8.864902 15.423271-28.617781 20.685111-44.016493 11.793604-15.395642-8.889461-20.685111-28.590152-11.82021-43.988864l149.622716-209.579249L285.628808 435.334155c-17.781992 0-32.245402-14.411221-32.245402-32.19526 0-17.781992 14.46341-32.220842 32.245402-32.220842l194.310497 0 0-69.780273L285.628808 301.137781c-17.781992 0-32.245402-14.413268-32.245402-32.19526s14.46341-32.220842 32.245402-32.220842l194.310497 0 0-132.435265c0-17.780969 14.46341-32.19526 32.248472-32.19526 17.835204 0 32.245402 14.414291 32.245402 32.19526L544.433178 236.72065499999997l194.310497 0c17.835204 0 32.249495 14.43885 32.249495 32.220842S756.577856 301.137781 738.742652 301.137781"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="addition" unicode="&#58916;" d="M544 768L480 768 480 416 128 416 128 352 480 352 480 0 544 0 544 352 895.936 352 895.936 416 544 416Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="home" unicode="&#59022;" d="M824.084343-40.42033900000001H232.898863c-74.604138 0-85.85232 28.334325-85.852321 49.997718l-0.584307 5.314029V447.645552h48.806589v-402.916582c0-25.547863 13.548574-36.343743 37.629015-36.343743h568.020898c25.928532 0 27.978215 6.220678 27.978215 37.84391V447.585177l48.806589 0.118704c0.022513-14.346753 0-382.76666 0-433.098999 0-38.130436-12.726859-54.765301-51.858088-54.765301l-1.76111-0.25992zM1012.470921 493.103884C849.773422 615.120868 687.101505 737.137853 524.404006 859.153814c-6.207375 4.659113-18.433838 4.659113-24.641213 0C337.077573 737.137853 174.393377 615.120868 11.696902 493.103884c-24.856108-18.635429-0.572028-61.044308 24.642236-42.13361A15995638.709915 15995638.709915 0 0 1 512.025071 807.737794c0.988514-0.715291 1.644453-1.144056 2.823302-2.037403 18.040888-13.524015 36.057217-27.036773 54.073546-40.560788 58.291614-43.718711 116.583229-87.437421 174.874843-131.143852 81.33647-61.008492 162.696476-122.015961 244.033969-183.024454 25.212218-18.911722 49.496298 23.497157 24.64019 42.132587z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="time" unicode="&#59021;" d="M511.98464 829.44c-118.97856 0-230.83008-46.35136-314.95168-130.4832C112.90624 614.84032 66.56 502.95808 66.56 384.00512c0-118.9632 46.34624-230.84544 130.47296-314.9568C281.15456-15.093759999999975 393.00608-61.440000000000055 511.98464-61.440000000000055c118.98368 0 230.84032 46.34624 314.9824 130.48832C911.09376 153.15967999999998 957.44 265.02144 957.44 384.00512c0 118.97856-46.34624 230.8352-130.47296 314.95168C742.82496 783.0886399999999 630.96832 829.44 511.98464 829.44z m275.58912-721.02912c-73.61024-73.63584-171.47904-114.18624-275.58912-114.18624s-201.97376 40.5504-275.57888 114.18624c-73.63584 73.61024-114.16064 171.47904-114.16064 275.59424 0 104.11008 40.54528 201.97376 114.18112 275.58912 73.60512 73.63072 171.47392 114.176 275.584 114.176s201.97376-40.54528 275.584-114.176c73.63584-73.61536 114.18112-171.47904 114.18112-275.58912 0-104.1152-40.56576-201.984-114.2016-275.59424zM519.1168 340.20863999999995V628.08064a27.8528 27.8528 0 0 1-27.84256 27.84768 27.8528 27.8528 0 0 1-27.84256-27.84768v-306.23232a27.81184 27.81184 0 0 1 16.88064-25.58976M734.70464 321.84831999999994a31.0784 31.0784 0 0 0-31.07328-31.0784H496.44544a31.08864 31.08864 0 0 0-31.07328 31.0784 31.09376 31.09376 0 0 0 31.07328 31.0784h207.18592a31.08864 31.08864 0 0 0 31.07328-31.0784z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="user" unicode="&#59248;" d="M611.2 342.4c70.4 54.4 115.2 140.8 115.2 230.4 0 156.8-128 288-284.8 288s-284.8-128-284.8-284.8c0-92.8 44.8-182.4 115.2-236.8C108.8 272 0 105.60000000000002 0-80c0-9.6 9.6-19.2 19.2-19.2h848c9.6 0 19.2 9.6 19.2 19.2 0 188.8-112 355.2-275.2 422.4z m-576-396.8C44.8 115.20000000000005 156.8 268.79999999999995 320 320c6.4 3.2 12.8 9.6 12.8 16s-3.2 16-9.6 19.2c-76.8 41.6-128 131.2-128 224 0 134.4 112 246.4 246.4 246.4s246.4-112 246.4-249.6c0-89.6-51.2-176-128-220.8-6.4-3.2-9.6-9.6-9.6-19.2 0-6.4 6.4-12.8 12.8-16 160-51.2 275.2-204.8 281.6-377.6H35.2zM812.8 361.6c54.4 41.6 86.4 108.8 86.4 176 0 89.6-54.4 172.8-134.4 208-9.6 3.2-22.4 0-25.6-9.6-3.2-9.6 0-22.4 9.6-25.6 67.2-28.8 112-99.2 112-172.8 0-67.2-38.4-131.2-96-163.2-6.4-3.2-9.6-9.6-9.6-19.2 0-6.4 6.4-12.8 12.8-16 131.2-41.6 217.6-160 217.6-297.6 0-9.6 9.6-19.2 19.2-19.2s19.2 9.6 19.2 19.2c-3.2 140.8-86.4 262.4-211.2 320z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="notice" unicode="&#58983;" d="M544 798.976V864h-64v-65.024C289.536 786.304 160 658.624 160 416v-288h64V416c0 192 115.456 320 288 320 180.544 0 288-128 288-320v-288h64V416c0 242.88-122.496 370.56-320 382.976zM672 64a160 160 0 1 0-320 0h64a96 96 0 0 1 192 0h64zM64 128h896v-64H64v64z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="chrome" unicode="&#59018;" d="M515.436 583.685H914.285C840.842 730.955 688.748 832.132 513 832.132c-141.284 0-267.274-65.395-349.42-167.546l151.66-262.682c8.535 102.325 95.704 181.781 200.196 181.781zM514.218 550.803c-91.476 0-165.631-74.155-165.631-165.631s74.155-165.631 165.631-165.631c52.7 0 99.615 24.642 129.95 62.999l1.428 2.474 0.355-0.205c21.252 27.852 33.898 62.624 33.898 100.363 0 84.774-63.702 154.626-145.841 164.413l-6.393 0.632c-4.424 0.354-8.882 0.586-13.397 0.586zM929.561 549.585H627.443c52.209-36.066 86.506-96.297 86.506-164.413 0-45.547-18.268-81.598-41.12-121.192L483.898-63.257c9.624-0.617 19.322-0.966 29.102-0.966 247.521 0 448.177 200.656 448.177 448.177 0 58.508-11.225 114.391-31.616 165.631zM514.218 185.441c-83.583 0-144.927 54.804-185.034 124.651l-0.235-0.136-187.482 324.727C93.081 563.124 64.823 476.84 64.823 383.954c0-225.02 165.839-411.288 381.958-443.298l152.278 263.752c-25.769-12.143-54.518-18.967-84.841-18.967z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="edge" unicode="&#59019;" d="M854.794 669.297C797.923 743.783 683.626 823.59 548.62 830.822 136.707 852.889 85.742 435.448 85.742 435.448c55.449 53.038 58.01 97.116 163.936 154.293C673.983 818.768 676.394 476.432 676.394 476.432H346.111c-7.232 65.092 62.681 137.417 62.681 137.417-202.509-98.844-216.974-284.477-216.974-284.477s-28.93-279.655 219.385-364.034 452.029 42.189 452.029 42.189V193.16c-59.065-32.546-102.292-54.405-153.087-63.887-361.623-67.503-364.034 188.044-364.034 188.044h585.83c0 0.001 39.075 199.761-77.147 351.98z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="login-weibo" unicode="&#58997;" d="M411.270737 288.350316c-17.973895 7.504842-41.189053-0.229053-52.264421-17.542737-11.223579-17.394526-5.955368-38.103579 11.870316-46.201263 18.108632-8.232421 42.132211-0.417684 53.342316 17.421474C435.253895 260.05557899999997 429.446737 280.62989500000003 411.270737 288.350316zM455.545263 306.64757899999995c-6.885053 2.721684-15.508211-0.579368-19.550316-7.329684-3.920842-6.790737-1.751579-14.524632 5.146947-17.367579 7.019789-2.883368 16.006737 0.458105 20.048842 7.370105C465.071158 296.259368 462.551579 304.087579 455.545263 306.64757899999995zM427.52 426.684632c-115.968-11.439158-203.924211-82.216421-196.378947-158.073263 7.531789-75.910737 107.654737-128.161684 223.649684-116.749474 115.994947 11.439158 203.924211 82.216421 196.392421 158.140632C643.664842 385.859368 543.541895 438.110316 427.52 426.684632zM529.300211 247.70021099999997c-23.673263-53.355789-91.769263-81.798737-149.530947-63.232-55.754105 17.933474-79.373474 72.811789-54.945684 122.246737 23.956211 48.464842 86.352842 75.870316 141.541053 61.561263C523.506526 353.562947 552.663579 299.85684200000003 529.300211 247.70021099999997zM512 896C229.241263 896 0 666.772211 0 384c0-282.758737 229.241263-512 512-512 282.772211 0 512 229.241263 512 512C1024 666.772211 794.772211 896 512 896zM455.531789 101.02568399999996c-145.354105 0-293.941895 70.197895-293.941895 185.667368 0 60.362105 38.386526 130.182737 104.474947 196.069053 88.252632 87.929263 191.164632 127.986526 229.874526 89.397895 17.084632-17.003789 18.741895-46.457263 7.760842-81.623579-5.726316-17.690947 16.666947-7.895579 16.666947-7.936 71.343158 29.763368 133.564632 31.514947 156.321684-0.862316 12.139789-17.246316 10.954105-41.472-0.215579-69.510737-5.173895-12.921263 1.589895-14.928842 11.466105-17.879579 40.178526-12.422737 84.924632-42.455579 84.924632-95.380211C772.837053 211.36168399999997 646.090105 101.02568399999996 455.531789 101.02568399999996zM718.672842 468.197053c4.715789 14.457263 1.765053 30.962526-9.202526 43.061895-10.954105 12.072421-27.136 16.666947-42.037895 13.527579l0 0.026947c-12.463158-2.694737-24.724211 5.268211-27.392 17.664-2.667789 12.463158 5.281684 24.697263 17.744842 27.338105 30.531368 6.467368 63.595789-2.937263 85.989053-27.715368 22.447158-24.764632 28.456421-58.489263 18.849684-88.064-3.907368-12.099368-16.936421-18.728421-29.062737-14.848-12.139789 3.920842-18.782316 16.922947-14.874947 28.995368L718.672842 468.183579zM853.261474 424.865684c-0.013474-0.013474-0.013474-0.080842-0.013474-0.107789-4.567579-14.026105-19.712-21.706105-33.778526-17.165474-14.133895 4.554105-21.854316 19.590737-17.300211 33.670737l0 0.013474c13.999158 43.169684 5.12 92.429474-27.567158 128.565895-32.714105 36.122947-80.949895 49.92-125.507368 40.488421-14.484211-3.085474-28.752842 6.130526-31.838316 20.574316-3.098947 14.403368 6.144 28.631579 20.641684 31.717053l0.026947 0c62.625684 13.271579 130.519579-6.117053 176.545684-56.966737C860.483368 554.886737 872.892632 485.618526 853.261474 424.865684z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="voice" unicode="&#59016;" d="M463.380164 644.0568969999999v-0.003069c-4.550643 4.549619-10.484795 7.02295-16.913205 7.02295s-12.365632-2.473331-16.915251-7.02295c-4.549619-4.551666-7.020904-10.485819-7.020904-16.914229s2.471284-12.365632 7.020904-16.915251c60.437487-60.438511 93.675496-140.756791 93.675496-226.222301 0-85.464487-33.238009-165.783791-93.675496-226.220255-4.549619-4.551666-7.020904-10.487865-7.020904-16.915252 0-6.429433 2.471284-12.365632 7.020904-16.914228 4.550643-4.549619 10.486842-7.02295 16.915251-7.02295s12.364609 2.473331 16.913205 7.02295c35.114752 35.116799 62.317301 76.06849 80.814584 121.668037 17.904789 44.018539 26.90579 90.608647 26.90579 138.384768s-9.101285 94.26799-26.90579 138.384767c-18.59552 45.697785-45.698808 86.550215-80.814584 121.667013zM781.892405 618.929614v-0.002047c-31.358195 77.452-77.550237 146.990772-137.098471 206.539007-4.550643 4.549619-10.485819 7.02295-16.915252 7.02295-6.42841 0-12.363585-2.473331-16.914228-7.02295-9.29776-9.299807-9.29776-24.531719 0-33.82948 54.997592-54.998615 97.631598-119.195729 126.613676-190.71153 27.993564-69.044516 42.237987-142.045133 42.237987-216.924541s-14.244422-147.882072-42.237987-216.923518c-28.982078-71.517847-71.616084-135.616724-126.613676-190.711529-9.29776-9.298783-9.29776-24.531719 0-33.82948 4.551666-4.551666 10.485819-7.02295 16.914228-7.02295 6.429433 0 12.366655 2.471284 16.915252 7.02295 59.547211 59.547211 105.740276 129.085984 137.098471 206.53696 30.369681 74.78117 45.699832 153.817248 45.699831 234.928591 0 81.111343-15.331173 160.146397-45.699831 234.927567zM299.474141 427.621497c-11.670807 11.573593-27.103288 18.004049-43.522236 18.004049-16.419971 0-31.852452-6.429433-43.52326-18.004049-11.57257-11.57257-18.003026-27.104311-18.003026-43.522236 0-16.420995 6.42841-31.851429 18.003026-43.52326 11.574616-11.57257 27.103288-18.003026 43.52326-18.003025s31.852452 6.429433 43.522236 18.003025c11.573593 11.573593 18.003026 27.104311 18.003025 43.52326 0 16.419971-6.427386 31.852452-18.003025 43.522236z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="upload-drag" unicode="&#59009;" d="M666.931 445.918l-124.245 99.362c-7.221 5.639-16.428 9.042-26.429 9.042-9.963 0-19.136-3.376-26.438-9.047l-124.215-99.391c-9.615-7.772-15.713-19.565-15.713-32.782 0-9.946 3.453-19.084 9.223-26.284 13.828-17.359 41.51-20.465 58.918-6.505l56.252 45.022v-261.12c0-23.177 18.842-41.984 41.95-41.984s41.95 18.842 41.95 41.984v261.12l56.286-45.056c17.545-13.892 45.09-10.718 58.914 6.554 5.754 7.137 9.236 16.316 9.236 26.308 0 13.211-6.086 24.999-15.609 32.716zM235.827 142.95000000000005c-85.026 0-152.542 31.71-188.655 89.839-36.113 58.095-34.406 134.724 4.335 195.174 37.342 58.334 102.366 92.023 178.995 94.549-19.866 130.492 42.667 202.377 84.753 235.008 90.112 69.871 234.257 79.053 335.565 21.367 58.982-33.587 94.037-85.675 100.454-146.978 113.937 18.978 177.562-33.826 206.814-69.905 63.317-78.131 71.27-204.39 18.91-300.203-46.524-85.06-130.389-127.317-229.82-116.497-18.739 2.116-32.222 18.978-30.174 37.683s19.285 32.017 37.683 30.174c96.7-10.718 143.258 46.353 162.406 81.408 39.014 71.373 33.826 167.868-12.049 224.495-38.673 47.684-100.352 60.518-178.483 37.069-2.94-0.916-6.319-1.443-9.822-1.443-18.851 0-34.133 15.282-34.133 34.133 0 1.495 0.096 2.969 0.283 4.414 8.549 68.506-31.114 106.53-65.93 126.362-77.346 44.066-191.522 37.035-259.925-15.974-58.266-45.193-75.947-117.18-51.132-208.179 0.761-2.688 1.198-5.775 1.198-8.963 0-18.851-15.282-34.133-34.133-34.133-1.481 0-2.94 0.094-4.371 0.277-70.759 8.822-128.991-13.535-159.677-61.424-24.61-38.434-26.146-86.46-3.823-122.368 27.716-44.578 86.05-64.375 164.147-55.637 1.132 0.133 2.443 0.209 3.772 0.209 18.853 0 34.138-15.284 34.138-34.138 0-17.525-13.205-31.965-30.208-33.914-14.153-1.653-27.874-2.404-41.118-2.404z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="login-qq" unicode="&#58998;" d="M512 896C229.227789 896 0 666.772211 0 384c0-282.745263 229.227789-512 512-512s512 229.254737 512 512C1024 666.772211 794.772211 896 512 896L512 896zM738.856421 258.93726300000003c0 0-16.208842-44.220632-45.945263-83.941053 0 0 53.126737-18.054737 48.64-64.983579 0 0 1.778526-52.345263-113.461895-48.734316 0 0-81.071158 6.319158-105.377684 40.609684l-21.423158 0c-24.306526-34.304-105.350737-40.609684-105.350737-40.609684-115.280842-3.610947-113.475368 48.734316-113.475368 48.734316-4.500211 46.928842 48.626526 64.983579 48.626526 64.983579-29.709474 39.720421-45.918316 83.941053-45.918316 83.941053-72.057263-116.439579-64.848842 16.249263-64.848842 16.249263 13.527579 78.524632 70.238316 129.967158 70.238316 129.967158-8.111158 71.316211 21.611789 83.941053 21.611789 83.941053C318.410105 709.712842 508.025263 705.859368 512 705.751579c3.988211 0.107789 193.576421 3.961263 199.828211-216.643368 0 0 29.709474-12.638316 21.611789-83.941053 0 0 56.737684-51.442526 70.238316-129.967158l0 0C803.678316 275.18652599999996 810.873263 142.49768400000005 738.856421 258.93726300000003L738.856421 258.93726300000003zM738.856421 258.93726300000003"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="snowflake" unicode="&#59057;" d="M480.695-64h63.725V59.291000000000054l68.854-68.242 44.945 44.546-113.798 112.79v180.02l177.271-102.44 41.67-155.652 60.725 16.284-25.398 94.872 85.259-49.266 31.87 55.246-84.726 48.961 94.497 25.343-16.495 61.622-156.068-41.855-176.934 102.245 177.667 102.667 155.513-41.709 16.274 60.793-94.78 25.418 85.255 49.264-31.869 55.247-84.733-48.965 25.326 94.594-61.557 16.51-41.817-156.206-176.948-102.251V644.461l113.849 113.951-44.459 44.496-69.392-69.454V832h-63.725v-97.935l-69.188 69.249-45.068-45.107 114.256-114.355V438.89l-156.557 90.469L283.45 684.39l-60.188-16.458 24.84-94.632-107.544 62.145-31.868-55.247 106.667-61.639-93.463-25.557 16.074-61.237 154.482 42.243 156.169-90.243-156.138-90.226-154.485 42.243-15.855-60.409 94.289-25.784-107.534-62.14 31.868-55.247 106.672 61.642-24.621-93.801 61.012-16.685 40.69 155.028 156.179 90.25v-180.455l-113.801-112.79 44.338-43.944 69.463 68.845V-64z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="heart" unicode="&#59020;" d="M512 4.100000000000023c-108.9 0-447.3 277.5-447.3 522.2 0 131 106.6 237.6 237.6 237.6 94.9 0 174.8-50.2 209.7-76.1 34.9 25.9 114.8 76.1 209.7 76.1 131 0 237.6-106.6 237.6-237.6 0-244.7-338.4-522.2-447.3-522.2zM302.3 708c-100.2 0-181.7-81.5-181.7-181.7 0-221 326.8-466.3 391.4-466.3s391.4 245.3 391.4 466.3c0 100.2-81.5 181.7-181.7 181.7-103.9 0-190.2-76-191.1-76.8-10.6-9.5-26.7-9.5-37.3 0-0.8 0.8-87.7 76.8-191 76.8z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="logout" unicode="&#59010;" d="M512 832a32 32 0 0 1-32-32v-416a32 32 0 0 1 64 0V800a32 32 0 0 1-32 32zM683.34 798.06a32 32 0 0 1-24.48-59.15C798.07 681.24 896 544.06 896 384c0-212.08-171.92-384-384-384S128 171.91999999999996 128 384c0 160.06 97.93 297.24 237.14 354.91a32 32 0 0 1-24.48 59.15C178.25 730.78 64 570.74 64 384c0-247.42 200.58-448 448-448s448 200.58 448 448c0 186.74-114.25 346.78-276.66 414.06z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="file-b" unicode="&#58965;" d="M790.08 177.91999999999996l-138.112-119.232V177.91999999999996h138.112zM198.848 763.008h627.328v-516.16H617.088a34.56 34.56 0 0 1-34.816-34.432v-206.528H198.848V763.008z m662.208 68.8H164.032a34.56 34.56 0 0 1-34.816-34.432v-825.92a34.56 34.56 0 0 1 34.816-34.432h453.056l278.784 240.896V797.376a34.56 34.56 0 0 1-34.816 34.432z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="template" unicode="&#58979;" d="M734 172.89999999999998v82.8h-59.9v-37l-35.7-9.7 15.7-57.8zM674.1 419.3H734v-81.8h-59.9zM734 600.2l-95.6-26 15.7-57.8 20 5.4v-20.7H734zM866.1 131.29999999999995v-37l-35.7-9.7 7.9-28.9 7.8-28.9 79.9 21.7v82.8h-29.9zM740.9 60.299999999999955L651.4 36l7.9-28.9 7.8-29 89.5 24.4-7.8 28.9zM740.9 781.7l-89.5-24.3 7.9-28.9 7.8-28.9 89.5 24.3-7.8 28.9zM830.4 806l7.9-28.9 7.8-28.9 20 5.5v-20.8H926V832zM866.1 612.6v-120.3H926V612.6h-29.9zM866.1 371.9v-120.3H926V371.9h-29.9zM541.9 665.6l35.7 9.7-7.8 28.9-7.8 28.9-50-13.6L98 832v-783.5l384.1-104.3L512-64l29.9 8.1 35.7 9.7-7.8 28.9-7.8 28.9-20-5.4V120.79999999999995l35.7 9.7-15.7 57.8-20-5.4V486l35.7 9.7-15.7 57.8-20-5.4V665.6z m-59.8-659.4l-324.2 88.1V753.7l324.2-88.1V548l-192 52.2v-427.3l192-52.2v-114.5z m0 360.9V182.79999999999995l-132.2 35.9V521.8l132.2-35.9v-118.8z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="transfer" unicode="&#59025;" d="M320 768H128c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h192c35.2 0 64 28.8 64 64V704c0 35.2-28.8 64-64 64z m0-672c0-16-16-32-32-32H160c-16 0-32 16-32 32V672c0 16 16 32 32 32h128c16 0 32-16 32-32v-576z m256 544h-64c-19.2 0-32-12.8-32-32s16-32 32-32h64c19.2 0 32 12.8 32 32s-16 32-32 32z m-64-448h-64c-19.2 0-32-12.8-32-32s16-32 32-32h64c19.2 0 32 12.8 32 32s-16 32-32 32z m384 576H704c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h192c35.2 0 64 28.8 64 64V704c0 35.2-28.8 64-64 64z m0-672c0-16-16-32-32-32H736c-16 0-32 16-32 32V672c0 16 16 32 32 32h128c16 0 32-16 32-32v-576z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="auz" unicode="&#58994;" d="M324.266667 435.2c-17.066667 17.066667-39.822222 17.066667-51.2 0-17.066667-17.066667-17.066667-39.822222 0-51.2l153.6-159.288889c5.688889-5.688889 17.066667-11.377778 28.444444-11.377778s17.066667 5.688889 28.444445 11.377778l295.822222 290.133333c17.066667 17.066667 17.066667 39.822222 0 51.2-17.066667 17.066667-39.822222 17.066667-51.2 0L455.111111 304.355556 324.266667 435.2zM927.288889 753.777778L523.377778 896h-22.755556L96.711111 753.777778c-17.066667-5.688889-28.444444-17.066667-28.444444-34.133334v-432.355555c11.377778-250.311111 409.6-409.6 426.666666-415.288889h22.755556c17.066667 5.688889 415.288889 159.288889 426.666667 415.288889V719.644444c11.377778 17.066667 0 28.444444-17.066667 34.133334z m-45.511111-460.8c-5.688889-182.044444-301.511111-312.888889-369.777778-341.333334-113.777778 45.511111-358.4 182.044444-369.777778 341.333334v398.222222L512 822.044444l369.777778-125.155555v-403.911111z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="console" unicode="&#58981;" d="M30.552 104.72699999999998c4.654-16.29 23.272-23.272 37.236-18.618 16.291 4.655 23.273 23.273 18.618 37.236C16.588 314.182 84.08 521.31 237.68 640c11.636 9.31 23.273 16.29 37.236 25.6 25.6 16.29 53.528 30.255 83.782 39.564 58.182 20.945 118.691 30.254 176.873 27.927h25.6c6.982 0 11.636 0 18.618-2.327 30.255-4.655 58.182-11.637 88.436-23.273 235.055-86.11 356.073-346.764 269.964-581.818-4.654-16.291 2.327-32.582 18.618-37.237 16.291-4.654 32.582 2.328 37.237 18.619 41.89 116.363 39.563 239.709 0 349.09h2.327C921.897 656.2909999999999 738.043 784.2909999999999 537.897 793.6h-48.873c-200.145-9.31-384-137.31-458.472-337.455-39.564-109.381-41.891-232.727 0-351.418z m707.49 386.328a29.498 29.498 0 0 1-41.89 0L521.606 316.509c-4.654 2.327-9.309 2.327-13.963 2.327-32.582 0-58.182-25.6-58.182-58.181s25.6-58.182 58.182-58.182 58.181 25.6 58.181 58.182c0 4.654 0 9.309-2.327 16.29l174.546 174.546c11.636 11.636 11.636 30.254 0 39.564z m228.073-458.473H58.48c-16.29 0-30.255-13.964-30.255-30.255 0-16.29 13.964-30.254 30.255-30.254h907.636c16.291 0 30.255 13.963 30.255 30.254 0 16.291-13.964 30.255-30.255 30.255z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="app" unicode="&#58963;" d="M432.022 818.946h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM391.517 471.196h-295.169v295.169h295.021v-295.169zM976.847 635.717l-211.95 211.95c-8.837 8.837-23.124 8.837-31.963 0l-211.95-211.95c-8.837-8.837-8.837-23.124 0-31.963l211.95-212.098c8.837-8.837 23.124-8.837 31.963 0l211.95 211.95c8.837 8.987 8.837 23.271 0 32.109zM432.022 313.45000000000005h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM391.517-34.15499999999997h-295.169v295.021h295.021v-295.021zM932.511 313.45000000000005h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM891.859-34.15499999999997h-295.021v295.021h295.021v-295.021z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="prev" unicode="&#58970;" d="M62.573 384.103l423.401 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.751-18.976-68.727 0l-39.753 39.753 0.269 0.246-385.655 385.661zM451.365 384.103l423.407 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.757-18.977-68.727 0l-39.762 39.754 0.273 0.249-385.662 385.661zM451.365 384.103z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="website" unicode="&#59310;" d="M777.073418 147.443038c-30.460759 21.387342-40.83038 40.182278-76.47595 53.792405 25.275949 60.273418 40.182278 83.605063 42.126583 154.896203H887.898734c-3.888608-99.159494-45.367089-143.878481-110.825316-208.688608zM136.101266 356.13164600000005h167.210126c1.944304-71.291139 16.850633-94.622785 42.126583-154.896203-34.997468-13.610127-68.050633-31.756962-98.511393-53.792405C181.468354 212.25316499999997 139.989873 256.97215200000005 136.101266 356.13164600000005z m103.048101 259.888607c29.164557-23.979747 61.56962-42.774684 96.567089-57.681012-19.443038-53.792405-30.460759-90.734177-31.756962-152.951899H136.101266c3.240506 90.734177 46.663291 147.767089 103.048101 210.632911z m309.144304-209.98481V523.989873c47.311392 1.296203 71.291139 10.36962 114.065823 25.27595 18.146835-51.2 28.516456-84.901266 30.460759-143.23038H548.293671z m104.344304-195.078481c-40.182278 12.962025-60.273418 20.091139-104.344304 21.387342V356.13164600000005h144.526582c-1.944304-68.050633-16.202532-88.141772-40.182278-145.174684z m36.941772-57.681013c31.756962-12.313924 39.534177-28.516456 66.75443-47.311392-51.848101-44.718987-114.713924-73.883544-182.116455-84.901266 36.941772 37.589873 90.734177 82.308861 115.362025 132.212658z m-163.321519-137.397468l22.035443 165.913924c40.182278-1.296203 56.38481-7.777215 92.678481-18.794937-27.220253-56.38481-66.106329-106.288608-113.417722-147.118987h-1.296202z m-75.827848 5.18481c-67.402532 11.017722-130.268354 40.83038-182.764557 84.901266 27.868354 19.443038 57.681013 34.997468 88.789873 47.311392 23.331646-48.607595 55.088608-93.326582 93.974684-132.212658z m47.311392 335.068355v-123.787342c-44.070886-1.296203-64.162025-8.425316-104.344304-21.387342-23.979747 57.681013-38.237975 77.124051-40.182278 145.174684h144.526582zM383.675949 549.265823c42.774684-14.906329 66.75443-23.331646 114.065823-25.27595v-117.95443H353.21519c1.944304 58.329114 12.313924 92.03038 30.460759 143.23038z m-37.589873 57.032911c-31.756962 12.962025-60.921519 30.460759-88.141772 51.848101 53.792405 51.848101 115.362025 91.382278 192.486076 104.344304-44.718987-44.718987-80.364557-97.863291-104.344304-156.192405z m151.655696 161.377215v-193.782278c-44.070886 1.296203-64.162025 9.073418-103.696202 22.683544 29.164557 68.698734 49.903797 127.027848 102.4 171.098734h1.296202z m75.827848-4.536708c77.772152-13.610127 149.711392-49.903797 206.744304-104.344304-29.164557-22.035443-46.01519-37.589873-80.364557-51.848102-25.275949 59.625316-82.956962 112.76962-126.379747 156.192406z m-46.01519 4.536708c54.440506-46.01519 97.21519-104.992405 124.435443-171.098734-39.534177-13.610127-59.625316-21.387342-103.696202-22.683544l-22.035443 193.782278h1.296202z m-31.10886-751.149367c-46.663291 38.886076-62.865823 88.789873-91.382279 147.118988 36.293671 11.665823 53.144304 17.498734 93.326582 18.794936v-165.913924h-1.944303zM887.898734 406.035443h-145.174683c-1.296203 61.56962-12.313924 98.511392-31.756962 152.303798 37.589873 15.55443 57.032911 33.053165 88.789873 57.681012 56.38481-62.865823 84.901266-119.898734 88.141772-209.98481z m-375.898734 427.746835c-244.334177 0-442.005063-197.670886-442.005063-442.005063S267.665823-50.227847999999994 512-50.227847999999994s442.005063 197.670886 442.005063 442.005063S756.334177 833.782278 512 833.782278z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="next" unicode="&#58971;" d="M948.066926 382.958838l-411.990051-412.24426c-18.47333-18.47333-48.417689-18.47333-66.875207 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L814.691135 383.088983 467.512212 730.269123c-18.466032 18.458735-18.466032 48.405526 0 66.873991 18.468465 18.464816 48.410391 18.464816 66.872774 0l38.682336-38.682336-0.261507-0.239614 375.259894-375.265975v0.003649m-378.312834 0L157.756743-29.28542200000004c-18.47333-18.47333-48.415256-18.47333-66.872775 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L436.369787 383.088983 89.19208 730.269123c-18.4636 18.458735-18.4636 48.405526 0 66.873991 18.470898 18.464816 48.415256 18.464816 66.872774 0l38.692067-38.682336-0.266372-0.239614 375.267191-375.265975-0.004865 0.003649m0 0z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="component" unicode="&#59479;" d="M917.376 652.544L500.8 891.2a34.304 34.304 0 0 1-34.176 0L50.112 652.48a33.92 33.92 0 0 1-17.088-29.376v-477.44c0-12.16 6.528-23.296 17.088-29.44l416.512-238.72a35.136 35.136 0 0 1 34.176 0l416.576 238.72a33.92 33.92 0 0 1 17.088 29.44v477.44a33.92 33.92 0 0 1-17.088 29.44z m-51.264-487.36l-382.4-219.136-382.336 219.136V603.52l382.336 219.136 382.4-219.136v-438.272zM198.784 535.488a33.792 33.792 0 0 1 12.544-46.4l237.824-136.32V83.20000000000005c0-18.816 15.232-33.92 34.176-33.92a33.92 33.92 0 0 1 34.176 33.92V352.384l238.656 136.832a33.856 33.856 0 0 1 12.544 46.4 34.368 34.368 0 0 1-46.72 12.416L483.712 411.52 245.504 548.0319999999999a34.432 34.432 0 0 1-46.72-12.544z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="android" unicode="&#59012;" d="M391.405714 619.995429a22.308571 22.308571 0 0 1 0 44.544c-11.995429 0-21.723429-10.276571-21.723428-22.272s9.728-22.272 21.723428-22.272z m241.152 0c11.995429 0 21.723429 10.276571 21.723429 22.272s-9.728 22.272-21.723429 22.272a22.308571 22.308571 0 0 1 0-44.544zM168.539429 514.852571a58.514286 58.514286 0 0 0 58.294857-58.294857v-245.723428c0-32.585143-25.709714-58.843429-58.294857-58.843429S109.696 178.285714 109.696 210.834286v245.723428c0 32 26.294857 58.294857 58.843429 58.294857z m605.732571-10.861714v-380.562286c0-34.852571-28.013714-62.866286-62.281143-62.866285h-42.861714v-129.718857c0-32.585143-26.294857-58.843429-58.843429-58.843429s-58.843429 26.294857-58.843428 58.843429v129.718857H472.594286v-129.718857c0-32.585143-26.294857-58.843429-58.843429-58.843429a58.660571 58.660571 0 0 0-58.294857 58.843429l-0.585143 129.718857H312.594286a62.683429 62.683429 0 0 0-62.866286 62.866285V503.990857h524.580571z m-132.571429 231.424c80.018286-41.142857 134.290286-119.990857 134.290286-210.870857H247.424c0 90.843429 54.272 169.728 134.838857 210.870857L341.705143 810.276571a8.338286 8.338286 0 0 0 2.852571 11.446858c3.986286 1.718857 9.142857 0.585143 11.446857-3.437715L397.147429 742.838857c34.852571 15.433143 73.728 23.990857 114.870857 23.990857s80.018286-8.557714 114.870857-23.990857l41.142857 75.446857c2.304 3.986286 7.424 5.156571 11.446857 3.437715a8.338286 8.338286 0 0 0 2.852572-11.446858zM914.267429 456.557714v-245.723428c0-32.585143-26.294857-58.843429-58.843429-58.843429a58.660571 58.660571 0 0 0-58.294857 58.843429v245.723428a58.148571 58.148571 0 0 0 58.294857 58.294857c32.585143 0 58.843429-25.709714 58.843429-58.294857z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="more" unicode="&#58975;" d="M224 288c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z m288 0c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z m288 0c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="login-wechat" unicode="&#58999;" d="M516.464646 896C233.714646 896 4.464646 666.75 4.464646 384S233.714646-128 516.464646-128s512 229.25 512 512S799.214646 896 516.464646 896z m-74-523.375c-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.25-1.125-0.5-1.875s-0.5-1.125-0.5-1.875c-0.25-0.75-0.25-1.125-0.5-1.875s-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875c0-0.75-0.25-1.125-0.25-1.875s-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875 0-1.125-0.25-1.875c0-0.75-0.25-1.125-0.25-1.875s0-1.125-0.25-1.875c0-0.75 0-1.125-0.25-1.875 0-0.75 0-1.125-0.25-1.875v-22.5c0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0.25-1.125 0.25-1.875s0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875l0.25-0.875c-4.25-0.25-8.625-0.75-12.75-0.75-3.75-0.25-7.25-0.25-11-0.25-3.5 0-7 0-10.5 0.25-7.25 0.25-14 0.875-20.75 1.875-4.25 0.5-8.125 1.125-12.375 1.875-3.5 0.5-6.75 1.125-10.25 1.875-3 0.5-6.25 1.125-9.25 1.875-3 0.75-5.875 1.125-8.875 1.875-2.75 0.75-5.875 1.125-8.875 1.875-2.75 0.5-5.625 1.125-8.375 1.625l-3.25-1.625-3.75-1.875-4 1.375-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-2.75-1.375-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-2.5-1.375 0.5 1.375 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.5 1.125c-0.5 0.25-0.75 0.5-1.125 0.75-0.875 0.75-1.625 1.125-2.5 1.875s-1.625 1.125-2.5 1.875-1.625 1.125-2.5 1.875c-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.375 1.125-2.375 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-1.875 1.875-0.75 0.75-1.375 1.125-1.875 1.875l-1.875 1.875-1.875 1.875-1.875 1.875-1.875 1.875c-0.75 0.75-1.125 1.125-1.625 1.875s-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-0.875 1.125-1.625 1.875c-0.5 0.75-0.875 1.125-1.625 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.125 1.875-0.5 0.75-0.875 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.25 1.125-0.5 1.875s-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875 0 1.125-0.25 1.875c0 0.75 0 1.125-0.25 1.875 0 0.75 0 1.125-0.25 1.875 0 0.75 0 1.125-0.25 1.875V457.25v1.875 1.875 1.875 1.875 1.875 0.875 0.875 1.875 1.875 1.875 1.875 1.875 1.875c0 0.75 0 1.125 0.25 1.875 0 0.75 0 1.125 0.25 1.875 0 0.75 0 1.125 0.25 1.875 0 0.75 0.25 1.125 0.25 1.875s0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.5 1.875c0 0.75 0.25 1.125 0.5 1.875s0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.5 1.125 0.5 1.875c0.25 0.75 0.5 1.125 0.5 1.875 0.25 0.75 0.5 1.125 0.5 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.625 1.875 0.5 0.75 0.875 1.125 1.625 1.875 0.5 0.75 1.125 1.125 1.625 1.875s1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875l1.875 1.875 1.875 1.875 1.875 1.875 1.875 1.875c0.75 0.75 1.375 1.125 1.875 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.875 0.75 1.625 1.125 2.5 1.875s1.625 1.125 2.5 1.875 1.875 1.125 2.5 1.875c0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 3 1.875 0.875 0.75 2.125 1.125 3 1.875s2.125 1.125 3 1.875c1.125 0.75 2.125 1.125 3.25 1.875 1.125 0.75 2.375 1.125 3.25 1.875 1.125 0.75 2.375 1.125 3.5 1.875 1.125 0.75 2.375 1.125 3.75 1.875 1.125 0.75 2.5 1.125 3.75 1.875 1.375 0.75 2.5 1.125 4 1.875 1.375 0.75 2.75 1.125 4.25 1.875 1.375 0.75 2.75 1.125 4.25 1.875 1.375 0.75 3 1.125 4.375 1.875 1.625 0.75 3 1.125 4.625 1.875 1.625 0.75 3.25 1.125 4.875 1.875 1.875 0.75 3.5 1.125 5.375 1.875s3.75 1.125 5.625 1.875c2.125 0.75 4.25 1.125 6 1.875 2.375 0.75 4.375 1.125 6.75 1.875 2.5 0.75 4.875 1.125 7.5 1.875 2.75 0.75 5.625 1.125 8.625 1.875 3.5 0.75 6.75 1.125 10.25 1.875 4.375 0.75 8.875 1.375 13.25 1.875 11 1.125 22.125 1.875 33.25 1.875h2.5c11.125 0 22.375-0.75 33.5-1.875 4.375-0.5 8.875-1.125 13.25-1.875 3.5-0.5 7-1.125 10.25-1.875 2.75-0.5 5.875-1.125 8.625-1.875 2.5-0.5 5.125-1.125 7.625-1.875 2.375-0.5 4.625-1.125 6.75-1.875 2.125-0.5 4.25-1.125 6.25-1.875 1.875-0.75 4-1.125 5.875-1.875s3.75-1.125 5.375-1.875c1.625-0.75 3.5-1.125 5.125-1.875 1.625-0.75 3.25-1.125 4.875-1.875 1.625-0.75 3-1.125 4.625-1.875 1.375-0.75 3-1.125 4.375-1.875s2.75-1.125 4.25-1.875c1.375-0.75 2.75-1.125 4-1.875 1.375-0.75 2.5-1.125 3.75-1.875 1.125-0.75 2.5-1.125 3.75-1.875 1.125-0.75 2.375-1.125 3.5-1.875 1.125-0.75 2.375-1.125 3.5-1.875 1.125-0.75 2.375-1.125 3.25-1.875 1.125-0.75 2.125-1.125 3.25-1.875 1.125-0.75 2.125-1.125 3-1.875s2.125-1.125 3-1.875 1.875-1.125 3-1.875c0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.5-1.875 0.875-0.75 1.625-1.125 2.5-1.875s1.625-1.125 2.5-1.875 1.625-1.125 2.375-1.875c0.75-0.75 1.625-1.125 2.375-1.875 0.75-0.75 1.625-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 1.875-1.875 0.75-0.75 1.375-1.125 1.875-1.875l1.875-1.875 1.875-1.875 1.875-1.875 1.875-1.875c0.75-0.75 1.125-1.125 1.625-1.875s1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 0.875-1.125 1.625-1.875c0.5-0.75 0.875-1.125 1.625-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.5-1.875 0.25-0.75 0.5-1.125 0.5-1.875 0.25-0.75 0.25-1.125 0.5-1.875s0.5-1.125 0.5-1.875c0.25-0.75 0.25-1.125 0.5-1.875s0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875c0-0.5 0.25-0.75 0.25-1.125-4.625 0.5-9.25 0.875-14 1.125-3.5 0.25-7 0.25-10.75 0.25-4 0-8.125 0-12.125-0.25-6.75-0.25-13.25-0.875-19.5-1.875-3.75-0.5-7.625-1.125-11.375-1.875-3-0.5-5.875-1.125-8.875-1.875-2.5-0.5-5.125-1.125-7.5-1.875-2.125-0.5-4.375-1.125-6.5-1.875-1.875-0.5-4-1.125-5.875-1.875-1.875-0.5-3.5-1.125-5.375-1.875-1.625-0.75-3.25-1.125-4.875-1.875-1.625-0.75-3-1.125-4.625-1.875-1.375-0.75-3-1.125-4.375-1.875s-2.75-1.125-4.25-1.875c-1.375-0.75-2.5-1.125-4-1.875-1.125-0.75-2.5-1.125-3.75-1.875-1.125-0.75-2.375-1.125-3.5-1.875-1.125-0.75-2.375-1.125-3.5-1.875-1.125-0.75-2.125-1.125-3.25-1.875-0.875-0.75-2.125-1.125-3-1.875s-2.125-1.125-3-1.875-1.875-1.125-3-1.875c-0.875-0.75-1.875-1.125-2.75-1.875-0.875-0.75-1.875-1.125-2.75-1.875-0.875-0.75-1.875-1.125-2.5-1.875-0.875-0.75-1.625-1.125-2.5-1.875s-1.625-1.125-2.5-1.875c-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-1.875-1.875l-1.875-1.875-1.875-1.875-1.875-1.875c-0.75-0.75-1.125-1.125-1.625-1.875s-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-0.875-1.125-1.625-1.875c-0.5-0.75-0.875-1.125-1.625-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.125-1.875-0.5-0.75-0.875-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.75-1.875-3.125-4.625-3.375-5.125-3.625-5.75z m433.625-71.25v-11.375c0-0.5 0-0.875-0.25-1.625 0-0.5 0-0.875-0.25-1.625 0-0.5 0-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625l-1.625-1.625-1.625-1.625c-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.375-0.875-1.875-1.625-0.75-0.5-1.375-0.875-1.875-1.625-0.75-0.5-1.375-0.875-2.125-1.625-0.75-0.5-1.375-0.875-2.125-1.625l-0.75-0.5 0.25-0.875 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.25-1.125-2.125 1.125-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-0.5 0.25-0.875-0.25c-2.125-0.5-4.25-0.875-6-1.625-2.125-0.5-4.25-0.875-6.25-1.625-2.125-0.5-4.25-0.875-6.5-1.625-2.375-0.5-4.375-0.875-6.75-1.625-2.375-0.5-4.875-1.125-7.25-1.625-2.75-0.5-5.375-1.125-8.125-1.625-3.25-0.5-6.5-1.125-9.75-1.625-5.375-0.75-10.75-1.125-15.875-1.625-2.75-0.25-5.875-0.25-8.625-0.25-3.75 0-7.5 0-11.125 0.25-6.5 0.25-12.75 0.75-19.125 1.625-3.75 0.5-7.5 0.875-11 1.625-2.75 0.5-5.875 0.875-8.625 1.625-2.375 0.5-4.875 0.875-7.25 1.625-2.125 0.5-4.25 0.875-6.25 1.625-1.875 0.5-3.75 0.875-5.625 1.625-1.875 0.5-3.5 0.875-5.125 1.625-1.625 0.5-3.25 0.875-4.875 1.625-1.375 0.5-3 0.875-4.375 1.625-1.375 0.5-2.75 0.875-4.25 1.625-1.375 0.5-2.5 0.875-4 1.625-1.125 0.5-2.5 0.875-3.75 1.625-1.125 0.5-2.375 0.875-3.75 1.625-1.125 0.5-2.375 0.875-3.5 1.625-1.125 0.5-2.125 0.875-3.25 1.625-1.125 0.5-2.125 0.875-3.25 1.625-0.875 0.5-2.125 0.875-3 1.625-0.875 0.5-1.875 0.875-3 1.625-0.875 0.5-1.875 0.875-2.75 1.625-0.875 0.5-1.875 0.875-2.75 1.625-0.875 0.5-1.875 0.875-2.5 1.625-0.875 0.5-1.625 0.875-2.5 1.625-0.875 0.5-1.625 0.875-2.5 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.375 0.875-2.375 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-1.875 1.625-0.75 0.5-1.375 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625l-1.625 1.625-1.625 1.625c-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625v1.625 1.625 1.625 3.25 1.625 3.25 1.375 1.625 1.625 1.625 1.625 1.625 1.625 1.625 1.625 1.625c0 0.5 0 0.875 0.25 1.625 0 0.5 0 0.875 0.25 1.625 0 0.5 0 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625l1.625 1.625 1.625 1.625c0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.375 0.875 1.875 1.625 0.75 0.5 1.375 0.875 1.875 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.875 0.5 1.625 0.875 2.5 1.625 0.875 0.5 1.625 0.875 2.5 1.625 0.875 0.5 1.875 0.875 2.5 1.625 0.875 0.5 1.875 0.875 2.75 1.625 0.875 0.5 1.875 0.875 2.75 1.625 0.875 0.5 1.875 0.875 3 1.625 0.875 0.5 2.125 0.875 3 1.625 1.125 0.5 2.125 0.875 3.25 1.625 1.125 0.5 2.125 0.875 3.25 1.625 1.125 0.5 2.375 0.875 3.5 1.625 1.125 0.5 2.375 0.875 3.75 1.625 1.125 0.5 2.5 0.875 3.75 1.625 1.375 0.5 2.5 0.875 4 1.625 1.375 0.5 2.75 0.875 4.25 1.625 1.375 0.5 3 0.875 4.375 1.625 1.625 0.5 3.25 0.875 4.875 1.625 1.625 0.5 3.5 0.875 5.125 1.625 1.875 0.5 3.75 0.875 5.875 1.625 2.125 0.5 4.25 1.125 6.25 1.625 2.375 0.5 4.875 1.125 7.25 1.625 2.75 0.5 5.875 1.125 8.625 1.625 3.75 0.75 7.5 1.125 11.125 1.625 9.25 1.125 19.125 1.625 28.875 1.625h1.375c9.25 0 18.375-0.75 27.5-1.625 3.75-0.5 7.25-0.875 10.75-1.625 2.75-0.5 5.625-0.875 8.375-1.625 2.375-0.5 4.625-0.875 7-1.625 2.125-0.5 4.25-0.875 6.25-1.625 1.875-0.5 3.75-0.875 5.625-1.625 1.625-0.5 3.5-0.875 5.125-1.625 1.625-0.5 3.25-0.875 4.625-1.625 1.375-0.5 3-0.875 4.375-1.625 1.375-0.5 2.75-0.875 4.25-1.625 1.375-0.5 2.5-0.875 4-1.625 1.125-0.5 2.5-0.875 3.75-1.625 1.125-0.5 2.375-0.875 3.5-1.625 1.125-0.5 2.375-0.875 3.5-1.625 1.125-0.5 2.125-0.875 3.25-1.625 1.125-0.5 2.125-0.875 3.25-1.625 0.875-0.5 2.125-0.875 3-1.625 0.875-0.5 1.875-0.875 3-1.625 0.875-0.5 1.875-0.875 2.75-1.625 0.875-0.5 1.875-0.875 2.75-1.625 0.875-0.5 1.875-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.75-0.5 1.625-0.875 2.375-1.625 0.75-0.5 1.625-0.875 2.375-1.625 0.75-0.5 1.375-0.875 2.375-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 1.875-1.625 0.75-0.5 1.375-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625l1.625-1.625 1.625-1.625c0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.875-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625v-11.375h-3.125zM589.714646 384c-12.625 0-25.375-12.75-25.375-25.375 0-12.75 12.75-25.375 25.375-25.375 19.375 0 31.875 12.625 31.875 25.375-0.125 12.625-12.75 25.375-31.875 25.375zM729.589646 384c-12.625 0-25.375-12.75-25.375-25.375 0-12.75 12.75-25.375 25.375-25.375 19.125 0 31.875 12.625 31.875 25.375 0 12.625-12.75 25.375-31.875 25.375zM328.714646 568.75c-19.125 0-38.375-12.625-38.375-31.625 0-19.125 19.375-31.875 38.375-31.875s31.875 12.75 31.875 31.875-12.875 31.625-31.875 31.625zM506.964646 568.75c-19.125 0-38.125-12.625-38.125-31.625 0-19.125 19.125-31.875 38.125-31.875 19.125 0 31.875 12.75 31.875 31.875s-12.875 31.625-31.875 31.625z"  horiz-adv-x="1059" />
+
+    
+    <glyph glyph-name="shrink-right" unicode="&#58984;" d="M52.294-28.71900000000005h899.793c16.546 0 29.999 13.405 29.999 29.999v59.974c-0.013 16.562-13.436 29.985-29.998 29.999h-899.795c-16.57 0-29.999-13.429-29.999-29.999v-59.974c0-16.617 13.429-29.999 29.999-29.999zM952.087 451.165h-479.884c-16.57 0-29.999-13.405-29.999-29.999v-59.974c0 0 0 0 0 0 0-16.572 13.428-30.01 29.997-30.022h479.885c16.571 0.013 29.999 13.448 29.999 30.022 0 0 0 0 0 0v59.974c0 16.593-13.429 29.999-29.999 29.999zM52.294 691.0840000000001h899.793c16.554 0.013 29.972 13.423 29.999 29.974v59.999c0 16.57-13.429 29.999-29.999 29.999h-899.793c-16.57 0-29.999-13.429-29.999-29.999v-59.997c0-16.546 13.429-29.975 29.999-29.975zM45.183 383.53499999999997l239.919-150.598v301.196l-239.919-150.598z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="spread-left" unicode="&#58987;" d="M942.974 770.924h-843.556c-15.513 0-28.124-12.567-28.124-28.124v-56.226c0.012-15.527 12.596-28.111 28.123-28.124h843.559c15.534 0 28.124 12.59 28.124 28.124v56.226c0 15.578-12.59 28.124-28.124 28.124zM99.418 321.033h449.891c15.534 0 28.124 12.567 28.124 28.124v56.226c0 0 0 0 0 0 0 15.537-12.589 28.134-28.122 28.146h-449.892c-15.534-0.012-28.124-12.608-28.124-28.146 0 0 0 0 0 0v-56.226c0-15.556 12.59-28.124 28.124-28.124zM942.974 96.10900000000004h-843.556c-15.519-0.012-28.099-12.584-28.124-28.101v-56.249c0-15.534 12.59-28.124 28.124-28.124h843.556c15.534 0 28.124 12.59 28.124 28.124v56.248c0 15.513-12.59 28.103-28.124 28.102zM949.641 384.436l-224.924 141.186v-282.37l224.924 141.186z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="camera" unicode="&#58976;" d="M884.3 648.6H704.2L679.5 698l-0.2 0.4c-1.9 3.6-3.6 6.9-5.1 9.9-12 23.4-21.5 41.9-54.1 41.9H416.7c-32.9 0-43.7-21.3-55.1-43.8-1.3-2.6-2.7-5.3-4.2-8.1l-24.8-49.7H152.4c-34 0-61.7-27.7-61.7-61.7v-488c0-34 27.7-61.7 61.7-61.7h731.9c34 0 61.7 27.7 61.7 61.7v488c0 34-27.7 61.7-61.7 61.7zM904 98.89999999999998c0-10.8-8.8-19.7-19.7-19.7H152.4c-10.8 0-19.7 8.8-19.7 19.7v488c0 10.8 8.8 19.7 19.7 19.7h206.1l36.2 72.5c1.5 2.9 2.9 5.7 4.3 8.3 10.6 20.8 11.1 20.8 17.7 20.8H620c4.6 0 5.8-0.6 5.8-0.6 2-1.2 7.2-11.2 10.9-18.5 1.6-3.1 3.3-6.5 5.3-10.1l36.2-72.4h206.1c10.8 0 19.7-8.8 19.7-19.7v-488zM525.5 565.5c-123.5 0-223.6-100.1-223.6-223.6S402 118.20000000000005 525.5 118.20000000000005s223.7 100.1 223.7 223.7c0 123.5-100.2 223.6-223.7 223.6z m0-402.5c-98.8 0-178.9 80.1-178.9 178.9 0 98.8 80.1 178.9 178.9 178.9 98.8 0 178.9-80.1 178.9-178.9 0-98.8-80.1-178.9-178.9-178.9z m246 402.5v-44.7H861v44.7h-89.5z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="note" unicode="&#58990;" d="M987.2 384.36L512.43 859.13a84.75 84.75 0 0 1-65 24.71L111.55 864.09a84.83 84.83 0 0 1-79.65-79.65L12.15 448.57a84.57 84.57 0 0 1 24.69-65l474.8-474.8a84.91 84.91 0 0 1 119.93 0L987.2 264.41999999999996a84.9 84.9 0 0 1 0 119.94z m-39.28-80.66L592.29-51.91999999999996a29.31 29.31 0 0 0-41.37 0L76.1 422.9a29.22 29.22 0 0 0-8.49 22.38l19.74 335.88a29.29 29.29 0 0 0 27.48 27.48l335.9 19.75a29.32 29.32 0 0 0 22.38-8.52l474.8-474.8a29.31 29.31 0 0 0 0.01-41.37zM236.86 659.14c-50.92-50.95-50.92-133.8 0-184.72a130.61 130.61 0 1 1 184.71 184.72c-50.89 50.86-133.77 50.86-184.71 0zM382.29 513.7c-28.38-28.38-77.78-28.38-106.15 0a75.08 75.08 0 1 0 106.15 0z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="refresh" unicode="&#58985;" d="M928 810.666667c-18.133333 0-32-13.866667-32-32v-164.266667C816 747.733333 669.866667 832 512 832 264.533333 832 64 631.4666669999999 64 384s200.533333-448 448-448c230.4 0 422.4 172.8 445.866667 402.133333 2.133333 17.066667-10.666667 33.066667-28.8 35.2-17.066667 2.133333-33.066667-10.666667-35.2-28.8C873.6 148.26666699999998 709.333333 0 512 0c-212.266667 0-384 171.733333-384 384s171.733333 384 384 384c137.6 0 264.533333-74.666667 332.8-192H693.333333c-18.133333 0-32-13.866667-32-32s13.866667-32 32-32h266.666667V778.666667c0 18.133333-14.933333 32-32 32z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="female" unicode="&#58977;" d="M774.4 800c-48 35.2-108.8 51.2-172.8 51.2-105.6 0-208-51.2-268.8-150.4-89.6-134.4-57.6-313.6 60.8-416l-32-51.2-188.8 121.6S128 384 108.8 352c-22.4-35.2 22.4-64 22.4-64l188.8-121.6-105.6-163.2s-19.2-32 16-51.2c38.4-22.4 57.6 12.8 57.6 12.8l102.4 160 185.6-121.6s48-28.8 70.4 6.4c19.2 28.8-25.6 57.6-25.6 57.6L432 192l32 48c44.8-22.4 92.8-32 137.6-32 105.6 0 208 51.2 268.8 150.4 96 147.2 51.2 345.6-96 441.6z m35.2-400c-44.8-67.2-118.4-108.8-201.6-108.8-44.8 0-92.8 12.8-131.2 38.4-112 73.6-147.2 220.8-73.6 332.8 44.8 64 121.6 105.6 201.6 108.8 44.8 0 92.8-12.8 131.2-38.4 112-73.6 147.2-220.8 73.6-332.8z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="male" unicode="&#58978;" d="M889.6 800h-240s-35.2 0-38.4-41.6c0-19.2 16-38.4 38.4-38.4h140.8l-179.2-179.2C556.8 582.4 489.6 608 416 608 240 608 96 464 96 288s144-320 320-320 320 144 320 320c0 73.6-25.6 140.8-67.2 195.2l179.2 179.2v-140.8c0-22.4 19.2-38.4 38.4-38.4 22.4 0 38.4 19.2 38.4 41.6V764.8h3.2C924.8 800 889.6 800 889.6 800zM416 48c-131.2 0-236.8 105.6-236.8 236.8 0 131.2 105.6 236.8 236.8 236.8s236.8-105.6 236.8-236.8c0-131.2-105.6-236.8-236.8-236.8z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="screen-restore" unicode="&#59224;" d="M582.6 454.6v320h50V540l274 274 35.4-35.4-274-274h234.6v-50h-320zM117.4-46l274 274v-234.6h50v320h-320v-50H356l-274-274 35.4-35.4zM132 764h302V814H82v-352h50V764z m760-760H590v-50h352V306h-50v-302z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="password" unicode="&#58995;" d="M519.2 343.29999999999995c-41.1 0-74.4-33.3-74.4-74.4 0-29.7 17.5-55 42.5-67.1v-81.9c0-17.6 14.3-31.9 31.9-31.9 17.6 0 31.9 14.3 31.9 31.9v81.9c25.1 12 42.5 37.4 42.5 66.9 0 41.3-33.2 74.6-74.4 74.6zM827.6-62.10000000000002H189.4c-35.9 0-65.1 29.2-65.1 65.1V428.4c0 35.9 29.2 65.1 65.1 65.1h638.2c17.3 0 33.7-6.7 46-19.1 12.3-12.3 19.1-28.7 19.1-46V3c0-35.9-29.2-65.1-65.1-65.1zM231.9 427.2c-34.8 0-41.3-6.6-41.3-41.3v-340.4c0-34.8 6.6-41.3 41.3-41.3h553.2c34.8 0 41.3 6.6 41.3 41.3V385.9c0 34.8-6.6 41.3-41.3 41.3H231.9zM519.2 86.70000000000005c-18.3 0-33.2 14.8-33.2 33.2V201c-26.3 12.8-42.6 38.8-42.6 67.8 0 41.8 33.9 75.7 75.7 75.7s75.7-33.9 75.7-75.7c0-29-16.3-55-42.5-67.8v-81.1c0.1-18.2-14.9-33.2-33.1-33.2zM519.2 342c-40.4 0-73.2-32.9-73.2-73.2 0-28.3 16.1-53.6 41.9-65.8l0.7-0.4V120c0-17 13.7-30.7 30.7-30.7S550 103.10000000000002 550 120v82.6l0.7 0.4c25.8 12.3 41.9 37.5 41.9 65.8-0.2 40.4-33.1 73.2-73.4 73.2zM207 523.1c-9.1 0-17.6 3.5-23.9 10-6.4 6.4-10 15-10 23.9v2h-0.2l0.2 1.4c0.1 0.5 0.1 0.9 0.2 1.4l0.2 1c0.1 0.6 0.2 1.4 0.4 2 15.3 75.7 57 144.2 117.2 193 29.9 24.2 63.4 43 99.8 56 37.5 13.3 77 20.2 117.5 20.2 61 0 120.8-16.3 173-47.2 50.6-29.9 93-72.8 122.5-123.8 4-5.6 6.1-12.2 6.1-19.2 0-18.3-15-33.3-33.3-33.3-13.2 0-25.1 7.7-30.4 19.8-49.2 84.6-140.4 137.4-238 137.4-128.1 0-238.2-87.1-267.6-211.8v-0.2c-0.7-18.4-15.4-32.6-33.7-32.6z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="senior" unicode="&#58996;" d="M719.9 249.39999999999998L514.7 379.5V485.1C615.6 419 731.5 344 731.5 344s139.2-45.6 139.2 106.5c0 93-172.5 112.1-197.2 11.8l-69.6 47.3s24.2 101.5 162.4 106.5c138.2 4.9 192-94.6 190.9-199.6-1.2-104.7-136-198.3-237.3-167.1zM561 414c-4-19-23-33.7-47.6-33.7l-6.9 4.3-217.3 137.8S171 555.2 160.8 439c-10.2-116.1 147.4-129.5 186.8-23.8l81.7-47.6s-65.1-119.1-198.5-119.1C97.3 248.5 0.6 423.8 114 546.3c113.5 122.4 218.6 64.6 257 35.7 16.4-12.4 85.3-57.9 158.6-105.9l3.1-2.4c28.3-18.2 33.4-35.6 28.3-59.7zM434.1 149.70000000000005h212c16.7 0 30.3-13.6 30.3-30.3v-15.1c0-16.7-13.6-30.3-30.3-30.3h-212c-16.7 0-30.3 13.6-30.3 30.3v15.1c0 16.8 13.6 30.3 30.3 30.3z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="theme" unicode="&#58986;" d="M512 800C229.696 800 0 570.304 0 288c0-90.368 30.304-174.496 85.344-236.896 55.264-62.624 129.152-97.12 208.128-97.12 81.568 0 161.536 36.832 231.264 106.592l2.272 2.496c65.792 81.472 132.896 121.056 205.088 121.056 46.72 0 89.216-15.872 126.688-29.92 30.336-11.328 56.576-21.12 81.216-21.12C1024 133.08799999999997 1024 241.664 1024 288c0 282.304-229.696 512-512 512z m428-602.912c-13.088 0-35.296 8.288-58.784 17.088-40.48 15.136-90.848 33.952-149.12 33.952-92.352 0-175.328-46.944-253.76-143.456-57.184-56.704-121.056-86.688-184.832-86.688-60.352 0-117.216 26.784-160.128 75.456C88.64 144.12800000000004 64 213.216 64 288 64 535.04 264.96 736 512 736s448-200.96 448-448c0-27.328-1.952-90.912-20-90.912zM800.704 379.93600000000004m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM457.024 582.624m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM672.704 555.9359999999999m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM291.392 443.936m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM278.4 197.24800000000005m-96 0a96 96 0 1 1 192 0 96 96 0 1 1-192 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="tread" unicode="&#59077;" d="M860.8 172.79999999999995l6.4-57.6-6.4 57.6c12.8 0 25.6 3.2 35.2 12.8 6.4 9.6 6.4 22.4 3.2 32l57.6 12.8-57.6-12.8L800 553.6c-6.4 28.8-25.6 51.2-48 64-9.6 6.4-22.4 9.6-32 9.6H182.4c-22.4 3.2-41.6-6.4-51.2-25.6-6.4-9.6-6.4-19.2-9.6-28.8v-342.4c0-19.2 9.6-38.4 28.8-48 6.4-3.2 12.8-6.4 19.2-6.4h192l19.2-25.6 147.2-188.8c6.4-9.6 19.2-12.8 28.8-9.6 16 3.2 25.6 19.2 22.4 35.2l-9.6 118.4-6.4 67.2h297.6z m-233.6-57.6l9.6-128c3.2-28.8-9.6-54.4-28.8-73.6-35.2-32-92.8-28.8-124.8 6.4l-156.8 195.2H179.2c-19.2 0-38.4 6.4-57.6 16-35.2 19.2-57.6 57.6-57.6 99.2V572.8c0 19.2 6.4 38.4 16 57.6 19.2 38.4 57.6 60.8 99.2 54.4h537.6c67.2-3.2 121.6-48 137.6-112l102.4-339.2c6.4-28.8 3.2-57.6-12.8-80-19.2-22.4-48-38.4-76.8-38.4h-240zM304 627.2v-451.2h57.6V627.2H304z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="praise" unicode="&#59078;" d="M860.8 595.2h-297.6l6.4 67.2 9.6 118.4c3.2 16-6.4 32-22.4 35.2-9.6 3.2-22.4 0-28.8-9.6l-147.2-188.8-19.2-25.6h-192c-6.4 0-12.8-3.2-19.2-6.4-19.2-9.6-28.8-28.8-28.8-48v-342.4c0-9.6 3.2-22.4 9.6-28.8 9.6-19.2 28.8-28.8 48-25.6h537.6c12.8 0 22.4 3.2 32 9.6 25.6 12.8 44.8 35.2 48 64l102.4 336 57.6-12.8-57.6 12.8c3.2 9.6 0 22.4-3.2 32-9.6 6.4-22.4 12.8-35.2 12.8l6.4 57.6-6.4-57.6z m-233.6 57.6h240c28.8 0 57.6-12.8 76.8-38.4 16-22.4 19.2-54.4 12.8-80l-102.4-339.2c-16-64-70.4-108.8-137.6-112H179.2c-41.6-3.2-80 19.2-99.2 54.4-9.6 19.2-16 38.4-16 57.6V537.6c0 41.6 22.4 80 57.6 99.2 19.2 9.6 38.4 12.8 57.6 16h144L480 848c32 35.2 89.6 38.4 124.8 6.4 19.2-19.2 32-44.8 28.8-73.6l-6.4-128z m-323.2-512h57.6V592H304v-451.2z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="star-fill" unicode="&#58968;" d="M752-43.200000000000045c-9.6 0-20.8 3.2-30.4 8l-208 104-209.6-104c-20.8-11.2-48-9.6-67.2 4.8-19.2 14.4-30.4 40-25.6 64l43.2 224L89.6 411.2C72 428.8 65.6 456 72 478.4c8 24 27.2 41.6 52.8 44.8l228.8 41.6 102.4 208c11.2 22.4 33.6 36.8 57.6 36.8s48-14.4 57.6-36.8l102.4-208 228.8-40c24-3.2 44.8-20.8 51.2-44.8 8-24 1.6-49.6-16-67.2L772.8 257.6l41.6-224c4.8-25.6-6.4-49.6-25.6-64-9.6-8-22.4-12.8-36.8-12.8z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="rate" unicode="&#59003;" d="M959.008 489.984l-308 47.008L512 832 372.992 536.992l-308-47.008 223.008-228-52.992-324L512 90.976l276.992-152.992-52.992 324zM512 156L304 39.00800000000004l40 235.008-179.008 182.016 242.016 32 104.992 224 104-224 240.992-34.016L680 273.024l36.992-235.008z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="template-1" unicode="&#58966;" d="M512 384zM43.52 601.6l409.6-176.64c58.88-30.72 110.08 0 110.08 0l414.72 174.08 2.56 2.56c10.24 5.12 15.36 15.36 15.36 28.16 0 15.36-10.24 28.16-23.04 30.72L563.2 837.12c-56.32 23.04-97.28 0-97.28 0L46.08 660.48c-12.8-5.12-20.48-17.92-20.48-30.72s7.68-23.04 17.92-28.16z m0 0M512 222.72000000000003c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 12.8 20.48 17.92 33.28 12.8L512 276.48 988.16 486.4c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04c-2.56-2.56-7.68-2.56-10.24-2.56zM512 71.67999999999995c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 10.24 20.48 17.92 33.28 10.24L512 125.44000000000005 988.16 332.79999999999995c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04H512zM512-79.36000000000001c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 12.8 20.48 17.92 33.28 12.8L512-25.600000000000023l476.16 209.92c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04c-2.56-2.56-7.68-2.56-10.24-2.56z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="vercode" unicode="&#59001;" d="M513.807059-128C351.171765-128 58.428235 126.19294100000002 54.211765 376.16941199999997V662.287059a93.364706 93.364706 0 0 0 81.317647 88.545882 570.428235 570.428235 0 0 1 163.237647 40.357647A393.336471 393.336471 0 0 1 446.945882 872.508235a101.797647 101.797647 0 0 0 120.470589 5.421177A629.458824 629.458824 0 0 1 716.8 792.395294a1255.303529 1255.303529 0 0 1 169.863529-38.550588 98.785882 98.785882 0 0 0 79.510589-90.955294 2911.171765 2911.171765 0 0 0-3.011765-291.538824C924.611765 49.09176500000001 672.828235-128 513.807059-128z m0 963.764706a39.152941 39.152941 0 0 1-24.696471-7.830588A438.512941 438.512941 0 0 0 319.247059 734.569412a608.376471 608.376471 0 0 0-180.705883-43.369412 33.731765 33.731765 0 0 1-24.094117-30.117647v-283.708235C118.663529 155.10588199999995 389.722353-67.76470600000005 513.807059-67.76470600000005s354.183529 148.178824 391.529412 444.536471c9.035294 175.887059 0 281.901176 0 283.105882a38.550588 38.550588 0 0 1-29.515295 33.731765 1287.830588 1287.830588 0 0 0-180.705882 41.562353A676.442353 676.442353 0 0 0 536.094118 829.741176a37.345882 37.345882 0 0 1-24.094118 6.02353zM784.865882 479.171765L487.905882 198.47529399999996a40.357647 40.357647 0 0 0-49.392941-4.818823l-7.830588 6.625882-161.430588 171.068235a40.357647 40.357647 0 1 0 60.235294 55.416471l133.722353-141.552941 267.444706 252.988235a40.357647 40.357647 0 1 0 55.41647-60.235294"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="service" unicode="&#58918;" d="M849.00812012 487.71642715A27.54528398 27.54528398 0 0 1 849.00812012 496.71080566 337.28919434 337.28919434 0 0 1 174.42973145 496.71080566a27.54528398 27.54528398 0 0 1-1e-8-8.99437852 147.28294776 147.28294776 0 0 1-112.42973144-140.53716386V328.06620849a148.40724551 148.40724551 0 0 1 123.67270459-143.34790781A308.6196126 308.6196126 0 0 1 414.4672083-9.222985839999978h5.05933769a84.32229815 84.32229815 0 1 1 0 56.21486573 252.40474688 252.40474688 0 0 0-172.01748955 137.16427235h31.48032481A35.41536562 35.41536562 0 0 1 314.96689531 215.63647705000005V458.48469697a35.41536562 35.41536562 0 0 1-35.97751406 34.29106787H230.64459717A26.42098711 26.42098711 0 0 1 230.64459717 496.71080566a281.07432862 281.07432862 0 0 0 562.14865723 0 26.42098711 26.42098711 0 0 1 0-3.3728915h-48.34478497a35.41536562 35.41536562 0 0 1-35.97751406-34.29106875V215.63647705000005a35.41536562 35.41536562 0 0 1 35.97751406-34.29106787h63.52279893A150.0936917 150.0936917 0 0 1 961.43785156 328.06620849v19.11305479a147.28294776 147.28294776 0 0 1-112.42973144 140.53716386zM498.22735801 46.991879880000056a28.10743242 28.10743242 0 1 0-28.1074333-28.10743242 28.10743242 28.10743242 0 0 0 28.10743329 28.10743242zM258.75202959 240.37101797000003h-43.28544639A93.87882598 93.87882598 0 0 0 118.21486572 328.06620849v19.11305479a93.87882598 93.87882598 0 0 0 97.25171748 89.94378516h43.28544639zM905.22298584 328.06620849a93.87882598 93.87882598 0 0 0-97.25171748-89.94378515h-43.28544727V437.12304844h43.28544727A93.87882598 93.87882598 0 0 0 905.22298584 347.17926328zM633.70518418 705.83010615l-20.7995001 7.30793232a28.10743242 28.10743242 0 0 1-17.42660859-56.21486571l16.30231084-6.18363458a28.10743242 28.10743242 0 1 1 21.92379785 51.71767646zM330.14490928 639.49656503A28.10743242 28.10743242 0 0 1 376.80324805 609.14053711 177.63897568 177.63897568 0 0 0 511.71892578 676.59837597a28.10743242 28.10743242 0 0 1 0 56.21486573 231.60524678 231.60524678 0 0 1-181.57401651-93.31667667z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="cellphone" unicode="&#59000;" d="M785.066667 896H238.933333a102.4 102.4 0 0 1-102.4-102.4v-819.2a102.4 102.4 0 0 1 102.4-102.4h546.133334a102.4 102.4 0 0 1 102.4 102.4V793.6a102.4 102.4 0 0 1-102.4 102.4zM238.933333 827.733333h546.133334a34.133333 34.133333 0 0 0 34.133333-34.133333v-648.533333H204.8V793.6a34.133333 34.133333 0 0 0 34.133333 34.133333z m546.133334-887.466666H238.933333a34.133333 34.133333 0 0 0-34.133333 34.133333v102.4h614.4v-102.4a34.133333 34.133333 0 0 0-34.133333-34.133333zM512 8.53333299999997m-34.133333 0a34.133333 34.133333 0 1 1 68.266666 0 34.133333 34.133333 0 1 1-68.266666 0ZM426.666667 725.333333h170.666666a17.066667 17.066667 0 0 1 0 34.133334h-170.666666a17.066667 17.066667 0 0 1 0-34.133334z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="print" unicode="&#58989;" d="M843.946667 603.733333h-47.36V725.333333a90.026667 90.026667 0 0 1-94.72 85.333334H312.32a81.493333 81.493333 0 0 1-85.333333-85.333334v-121.6H170.666667a81.493333 81.493333 0 0 1-85.333334-85.333333v-325.12a89.173333 89.173333 0 0 1 85.333334-93.866667h56.746666v-52.48a89.6 89.6 0 0 1 89.6-89.6h389.973334a89.6 89.6 0 0 1 89.6 89.6v52.48h47.36a97.706667 97.706667 0 0 1 94.72 93.866667V518.4a90.026667 90.026667 0 0 1-94.72 85.333333zM279.466667 725.333333a30.72 30.72 0 0 0 32.853333 33.706667h389.546667c18.773333 0 42.666667-11.52 42.666666-33.706667v-121.6H279.466667z m465.066666-678.4a37.546667 37.546667 0 0 0-37.546666-37.973333H317.013333a37.546667 37.546667 0 0 0-37.546666 37.973333v170.666667a37.546667 37.546667 0 0 0 37.546666 38.4h389.973334a37.546667 37.546667 0 0 0 37.546666-37.973333z m142.506667 146.346667a45.653333 45.653333 0 0 0-42.666667-42.666667h-47.786666v66.133334a89.6 89.6 0 0 1-89.6 89.6H317.013333a89.6 89.6 0 0 1-89.6-89.6v-65.28H170.666667a37.546667 37.546667 0 0 0-33.28 42.666666v324.266667A31.146667 31.146667 0 0 0 170.666667 552.106667h673.28c19.2 0 42.666667-11.52 42.666666-33.706667z m-640 281.173333h-37.546667a13.226667 13.226667 0 0 0 0 26.026667h38.826667a13.226667 13.226667 0 1 0 0-26.026667z m94.293333 0H298.666667a13.226667 13.226667 0 1 0 0 26.026667h42.666666a13.226667 13.226667 0 0 0 0-26.026667z m426.666667-116.48H248.32a13.226667 13.226667 0 0 0 0 26.026667H768a13.226667 13.226667 0 0 0 0-26.026667z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="cols" unicode="&#58896;" d="M128 448h384V832H128z m64 320h256v-256H192zM576 832v-384h384V832z m320-320H640V768h256zM192 384h64v-384H192zM384 384h64v-384H384zM640 384h64v-384H640zM832 384h64v-384h-64z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="wifi" unicode="&#59360;" d="M723 275.5C666.8 324.4 593.4 354 513 354s-153.8-29.6-210.1-78.6c-3.2-2.8-3.6-7.8-0.8-11.2l36-42.9c2.9-3.4 8-3.8 11.4-0.9C393.1 258.8 450.3 282 513 282s119.9-23.2 163.5-61.5c3.4-2.9 8.5-2.5 11.4 0.9l36 42.9c2.8 3.3 2.4 8.3-0.9 11.2zM840.4 415.6C751.7 489.5 637.6 534 513 534s-238.7-44.5-327.5-118.4c-3.4-2.8-3.8-7.9-1-11.3l36-42.9c2.8-3.4 7.9-3.8 11.2-1C308 423.8 406.1 462 513 462s205-38.2 281.2-101.6c3.4-2.8 8.4-2.4 11.2 1l36 42.9c2.8 3.4 2.4 8.5-1 11.3zM957.1 554.6C835.7 654.2 680.3 714 511 714c-168.2 0-322.6-59-443.7-157.4-3.5-2.8-4-7.9-1.1-11.4l36-42.9c2.8-3.3 7.8-3.8 11.1-1.1C222 589.3 360.3 642 511 642c151.8 0 291-53.5 400-142.7 3.4-2.8 8.4-2.3 11.2 1.1l36 42.9c2.9 3.4 2.4 8.5-1.1 11.3zM512 118m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="export" unicode="&#59005;" d="M896.4374528 479.830016c0 26.673152-21.6236032 48.2967552-48.2967552 48.2967552H630.8069376c-26.673152 0-48.2967552-21.6236032-48.2967552-48.2967552v-83.04831147H384.69522773l-2.71428266 5.36849067c-41.336832 87.44686933-35.95195733 204.128256 150.601728 199.94487467v-108.91537067l172.19037866 164.757504L532.58267307 822.7110912v-106.57245867c-228.64418133 5.70709333-263.651328-183.517184-157.433856-314.01028266l4.6891008-5.34664534h-88.46595414c-26.673152 0-48.2967552-21.6236032-48.2967552-48.2967552v-66.78882986h-98.43616426c-26.673152 0-40.4258816-21.6236032-30.71781547-48.2967552l79.10304427-217.33485227c9.70806613-26.673152 39.20145067-48.2967552 65.87460266-48.2967552h603.70670934c23.75898453 0 37.2506624 17.16169387 33.05745066 39.76178347 0.4980736 2.77108053 0.77441707 5.619712 0.77441707 8.53497173v463.765504z m-60.37067093-306.4528896l-21.8464256 60.02223787c-9.70806613 26.673152-39.20145067 48.2967552-65.87460267 48.2967552H303.44697173v30.56708266c0 13.336576 10.81125547 24.14783147 24.14783147 24.14783147h315.28605013v107.1972352c0 13.336576 10.81125547 24.14783147 24.14783147 24.14783147h144.88917333c13.336576 0 24.14783147-10.81125547 24.14783147-24.14783147v-270.2311424z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="rss" unicode="&#59400;" d="M810.666667 42.624C810.666667 395.562667 523.562667 682.666667 170.666667 682.666667v-85.333334c305.834667 0 554.666667-248.832 554.666666-554.709333h85.333334zM512 42.624h85.333333C597.333333 277.930667 405.930667 469.333333 170.666667 469.333333v-85.333333c188.202667 0 341.333333-153.130667 341.333333-341.376zM256 128m-85.333333 0a85.333333 85.333333 0 1 1 170.666666 0 85.333333 85.333333 0 1 1-170.666666 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="slider" unicode="&#59156;" d="M228.7 683.9v-66.7H112v66.7h116.7z m333.2-266.6v-66.7H112v66.7h449.9zM295.4 150.60000000000002V84H112v66.7h183.4v-0.1z m116.6 600c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H278.8c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.3-9.9 23.5V717.1c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.3 9.9 23.5 9.9h133.3v0.1h-0.1z m66.7-533.3c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H345.3c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.5-9.9 23.5V183.89999999999998c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.3 9.9 23.5 9.9h133.4v0.1zM912 683.9v-66.7H462.1v66.7H912z m0-533.3V84H528.6v66.7h383.3v-0.1h0.1zM745.2 483.9c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H612c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.3-9.9 23.5V450.6c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.5 9.9 23.5 9.9l133.2-0.1zM912 417.3v-66.7H795.3v66.7H912z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="email" unicode="&#58904;" d="M834.446 682.553H194.105c-50.176 0-91.022-40.846-91.022-91.022v-423.026c0-50.176 40.846-91.022 91.022-91.022h640.341c50.176 0 91.022 40.846 91.022 91.022V591.531c0 50.176-40.846 91.022-91.022 91.022z m36.409-514.048c0-20.025-16.384-36.409-36.409-36.409H194.105c-20.025 0-36.409 16.384-36.409 36.409V591.531c0 20.025 16.384 36.409 36.409 36.409h640.341c20.025 0 36.409-16.384 36.409-36.409v-423.026zM786.773 537.941L514.275 366.023 241.777 537.941c-12.743 8.078-29.582 4.21-37.661-8.533-8.078-12.743-4.21-29.582 8.533-37.661l286.72-180.907c4.551-2.845 9.557-4.21 14.563-4.21h0.91c5.006 0 10.013 1.365 14.563 4.21l286.72 180.907c12.743 8.078 16.611 24.917 8.533 37.661-8.306 12.857-25.145 16.611-37.888 8.533z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="subtraction" unicode="&#59006;" d="M785 348H239c-19.8 0-36 16.2-36 36s16.2 36 36 36h546c19.8 0 36-16.2 36-36s-16.2-36-36-36z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="mike" unicode="&#59100;" d="M512 256c115.2 0 208 92.8 208 208V624c0 115.2-92.8 208-208 208s-208-92.8-208-208v-160c0-115.2 92.8-208 208-208zM368 624c0 80 64 144 144 144s144-64 144-144v-160c0-80-64-144-144-144s-144 64-144 144V624zM844.8 416c0 17.6-14.4 32-32 32-16 0-30.4-12.8-32-28.8C758.4 289.6 646.4 192 512 192s-246.4 97.6-268.8 227.2c-1.6 16-16 28.8-32 28.8-17.6 0-32-14.4-32-32v-4.8C204.8 260.79999999999995 328 144 480 129.60000000000002V-32c0-17.6 14.4-32 32-32s32 14.4 32 32V129.60000000000002c152 14.4 275.2 131.2 299.2 280 0 1.6 1.6 4.8 1.6 6.4z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="light" unicode="&#59208;" d="M512 72c-172.313 0-312 139.687-312 312s139.687 312 312 312 312-139.687 312-312-139.687-312-312-312z m0 64c136.967 0 248 111.033 248 248 0 136.967-111.033 248-248 248-136.967 0-248-111.033-248-248 0-136.967 111.033-248 248-248z m0 696c17.673 0 32-14.327 32-32v-51c0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32V800c0 17.673 14.327 32 32 32z m0-785c17.673 0 32-14.327 32-32v-51c0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32v51c0 17.673 14.327 32 32 32z m325.945 11.055c-12.497-12.496-32.758-12.496-45.255 0l-36.063 36.063c-12.496 12.497-12.496 32.758 0 45.255 12.497 12.496 32.758 12.496 45.255 0l36.063-36.063c12.496-12.497 12.496-32.758 0-45.255z m-568 565c-12.497-12.496-32.758-12.496-45.255 0l-36.063 36.063c-12.496 12.497-12.496 32.758 0 45.255 12.497 12.496 32.758 12.496 45.255 0l36.063-36.063c12.496-12.497 12.496-32.758 0-45.255z m561 81.318c12.496-12.497 12.496-32.758 0-45.255l-36.063-36.063c-12.497-12.496-32.758-12.496-45.255 0-12.496 12.497-12.496 32.758 0 45.255l36.063 36.063c12.497 12.496 32.758 12.496 45.255 0z m-563.572-565c12.496-12.497 12.496-32.758 0-45.255l-36.063-36.063c-12.497-12.496-32.758-12.496-45.255 0-12.496 12.497-12.496 32.758 0 45.255l36.063 36.063c12.497 12.496 32.758 12.496 45.255 0zM960 384c0-17.673-14.327-32-32-32h-51c-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32h51c17.673 0 32-14.327 32-32z m-781 0c0-17.673-14.327-32-32-32H96c-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32h51c17.673 0 32-14.327 32-32z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="gift" unicode="&#58919;" d="M796.3 600h-6.7c5.1 6.7 9.6 13.4 13.4 20.1 18.3 32.2 20.8 63.1 7 87.1-9.1 15.7-33 41.2-91.9 36-35.4-3.2-76.1-17.2-114.7-39.4-37.9-21.9-68.9-49.3-89-77.5-4.5 6.4-9.5 12.8-15.1 19.1-19.8 22.3-45.4 42.8-74.1 59.4-38.4 22.2-79.3 35.9-115.1 38.5-43.3 3.2-75.8-10-91.4-37-13.8-24-11.3-54.8 7-86.7 3.7-6.5 8.1-13 13.1-19.5H236c-21.3 0-41.6-7.2-57.4-20.2-17.8-14.9-27.6-35.4-27.6-58v-50.8c0-34.4 23-64.6 55-76.6v-283.9c0-23.3 10.9-47.1 30.1-65.3 18.3-17.4 41.4-27.3 63.4-27.3h434.3c22 0 44.9 10 63 27.6 18.7 18.1 29.3 41.8 29.3 65.1V395c11 4.3 19.6 10.9 27.2 19.5 13.3 15.1 20.8 35.2 20.8 56.6v50.8c-0.1 45.3-32.8 78.1-77.8 78.1z m17.7-78.1v-50.8c0-7.7-3.2-20.3-15-22-0.9 0.1-1.7 0.1-2.6 0.1-1.5 0-2.9-0.1-4.3-0.3H543v91h253.3c11.9 0.1 17.7-5.8 17.7-18zM633.4 651.8c30.7 17.7 63.5 29.2 90 31.6 21.5 1.9 32.6-2.8 34.6-6.3 4.2-7.3-6.3-41.2-52.9-77.2H569.8c14 17 35.3 35.6 63.6 51.9z m-362.8 24.4c2.2 3.7 13.3 8.7 35 7.1 26.6-1.9 59.2-13.1 89.5-30.6 27.7-16 49.4-35.1 63.9-52.8H323.5c-20.3 15.6-36.4 32.9-45.8 49.4-8.9 15.6-8.5 24.4-7.1 26.9zM211 521.9c0 11.2 12.9 18.1 24.9 18.1H483v-91H240.1c-1.4 0.2-2.8 0.3-4.3 0.3-0.9 0-1.8 0-2.7-0.1-11.5 1.5-22.1 11.6-22.1 22v50.7z m55-411.3V389h217v-311H299.4c-13.2 0-33.4 17.5-33.4 32.6zM733.7 78H543V389h223v-278.4c0-15.5-19.1-32.6-32.3-32.6z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="mute" unicode="&#59013;" d="M739 294.4l180.2 180.2M735.391 297.9l180.24 180.24 7.07-7.07-180.239-180.24zM631.4-29.700000000000045c-5.1 0-10.1 1.3-14.5 3.7L277.1 162.20000000000005H116.8c-16 0-28.9 13-28.9 28.9v384c0 16 13 28.9 28.9 28.9h160.3l339.7 189.9c4.5 2.5 9.5 3.8 14.6 3.8 5.3 0 10.6-1.4 15.1-4.1 9.1-5.3 14.8-15.2 14.8-25.8v-767.6c0-10.5-5.6-20.4-14.7-25.8-4.6-2.7-9.9-4.1-15.2-4.1zM305.8 551.5v-336.7L601.4 51V716.8L305.8 551.5zM145.7 220.10000000000002h102.2v326H145.7v-326zM913.2 258.9c-9.3 0-18.1 3.6-24.7 10.3l-63.4 63.4-63.4-63.4c-6.6-6.6-15.4-10.3-24.7-10.3s-18.1 3.6-24.7 10.3c-13.6 13.6-13.6 35.9 0 49.5l63.4 63.4-67.4 67.4c-6.6 6.6-10.3 15.4-10.3 24.7 0 9.3 3.6 18.1 10.3 24.7 6.6 6.6 15.4 10.3 24.7 10.3s18.1-3.6 24.7-10.3l67.4-67.4 67.4 67.4c6.6 6.6 15.4 10.3 24.7 10.3s18.1-3.6 24.7-10.3c6.6-6.6 10.3-15.4 10.3-24.7 0-9.3-3.6-18.1-10.3-24.7L874.6 382l63.4-63.4c13.6-13.6 13.6-35.9 0-49.5-6.7-6.6-15.5-10.2-24.8-10.2z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="reduce-circle" unicode="&#58902;" d="M512-65.5c-60.6 0-119.4 11.9-174.8 35.3-53.5 22.6-101.5 55-142.7 96.2-41.2 41.2-73.6 89.2-96.2 142.7C74.9 264.1 63 322.9 63 383.5s11.9 119.4 35.3 174.8c22.6 53.5 55 101.5 96.2 142.7 41.2 41.2 89.2 73.6 142.7 96.2C392.6 820.6 451.4 832.5 512 832.5s119.4-11.9 174.8-35.3c53.5-22.6 101.5-55 142.7-96.2 41.2-41.2 73.6-89.2 96.2-142.7 23.4-55.4 35.3-114.2 35.3-174.8s-11.9-119.4-35.3-174.8c-22.6-53.5-55-101.5-96.2-142.7s-89.2-73.6-142.7-96.2c-55.4-23.4-114.2-35.3-174.8-35.3z m0 848c-220 0-399-179-399-399s179-399 399-399 399 179 399 399-179 399-399 399zM772 359H252c-13.8 0-25 11.2-25 25s11.2 25 25 25h520c13.8 0 25-11.2 25-25s-11.2-25-25-25z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="music" unicode="&#59024;" d="M575.4 832h-74.5v-633.5C385 251.20000000000005 249.3 180.70000000000005 226.8 76c-7.3-34.1 7.9-70.9 21.9-87.8 79.3-94.6 252.2-50.5 331.6 51.3 35.2 45.2 32.3 84.6 32.3 181.3V608.5c48.8-36.3 103.9-70.1 123.7-135 12.2-40.3-4.1-107.3-17-141.5-3.9-10.3-14.7-18.9-9.7-29.2 34.2-25.4 51.1 28.6 60.9 51.2 10.6 24.5 20.8 54.7 24.4 75.6C833.2 653.2 595.5 661.7 575.4 832z"  horiz-adv-x="1024" />
+
+    
+
+
+  </font>
+</defs></svg>
diff --git a/management/guns-admin/src/main/webapp/static/layui/font/iconfont.ttf b/management/guns-admin/src/main/webapp/static/layui/font/iconfont.ttf
new file mode 100644
index 0000000..06e30f9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/font/iconfont.ttf
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/font/iconfont.woff b/management/guns-admin/src/main/webapp/static/layui/font/iconfont.woff
new file mode 100644
index 0000000..66a1783
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/font/iconfont.woff
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/font/iconfont.woff2 b/management/guns-admin/src/main/webapp/static/layui/font/iconfont.woff2
new file mode 100644
index 0000000..47e9980
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/font/iconfont.woff2
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/0.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/0.gif
new file mode 100644
index 0000000..a63f0d5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/0.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/1.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/1.gif
new file mode 100644
index 0000000..b2b78b2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/1.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/10.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/10.gif
new file mode 100644
index 0000000..556c7e3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/10.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/11.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/11.gif
new file mode 100644
index 0000000..2bfc58b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/11.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/12.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/12.gif
new file mode 100644
index 0000000..1c321c7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/12.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/13.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/13.gif
new file mode 100644
index 0000000..300bbc2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/13.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/14.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/14.gif
new file mode 100644
index 0000000..43b6d0a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/14.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/15.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/15.gif
new file mode 100644
index 0000000..c9f25fa
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/15.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/16.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/16.gif
new file mode 100644
index 0000000..34f28e4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/16.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/17.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/17.gif
new file mode 100644
index 0000000..39cd035
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/17.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/18.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/18.gif
new file mode 100644
index 0000000..7bce299
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/18.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/19.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/19.gif
new file mode 100644
index 0000000..adac542
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/19.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/2.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/2.gif
new file mode 100644
index 0000000..7edbb58
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/2.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/20.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/20.gif
new file mode 100644
index 0000000..50631a6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/20.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/21.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/21.gif
new file mode 100644
index 0000000..b984212
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/21.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/22.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/22.gif
new file mode 100644
index 0000000..1f0bd8b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/22.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/23.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/23.gif
new file mode 100644
index 0000000..e05e0f9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/23.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/24.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/24.gif
new file mode 100644
index 0000000..f35928a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/24.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/25.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/25.gif
new file mode 100644
index 0000000..0b4a883
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/25.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/26.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/26.gif
new file mode 100644
index 0000000..45c4fb5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/26.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/27.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/27.gif
new file mode 100644
index 0000000..7a4c013
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/27.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/28.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/28.gif
new file mode 100644
index 0000000..fc5a0cf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/28.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/29.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/29.gif
new file mode 100644
index 0000000..5dd7442
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/29.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/3.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/3.gif
new file mode 100644
index 0000000..86df67b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/3.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/30.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/30.gif
new file mode 100644
index 0000000..b751f98
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/30.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/31.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/31.gif
new file mode 100644
index 0000000..c9476d7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/31.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/32.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/32.gif
new file mode 100644
index 0000000..9931b06
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/32.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/33.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/33.gif
new file mode 100644
index 0000000..59111a3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/33.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/34.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/34.gif
new file mode 100644
index 0000000..a334548
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/34.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/35.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/35.gif
new file mode 100644
index 0000000..a932264
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/35.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/36.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/36.gif
new file mode 100644
index 0000000..6de432a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/36.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/37.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/37.gif
new file mode 100644
index 0000000..d05f2da
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/37.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/38.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/38.gif
new file mode 100644
index 0000000..8b1c88a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/38.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/39.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/39.gif
new file mode 100644
index 0000000..38b84a5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/39.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/4.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/4.gif
new file mode 100644
index 0000000..d52200c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/4.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/40.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/40.gif
new file mode 100644
index 0000000..ae42991
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/40.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/41.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/41.gif
new file mode 100644
index 0000000..b9c715c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/41.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/42.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/42.gif
new file mode 100644
index 0000000..0eb1434
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/42.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/43.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/43.gif
new file mode 100644
index 0000000..ac0b700
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/43.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/44.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/44.gif
new file mode 100644
index 0000000..ad44497
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/44.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/45.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/45.gif
new file mode 100644
index 0000000..6837fca
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/45.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/46.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/46.gif
new file mode 100644
index 0000000..d62916d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/46.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/47.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/47.gif
new file mode 100644
index 0000000..58a0836
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/47.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/48.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/48.gif
new file mode 100644
index 0000000..7ffd161
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/48.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/49.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/49.gif
new file mode 100644
index 0000000..959b992
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/49.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/5.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/5.gif
new file mode 100644
index 0000000..4e8b09f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/5.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/50.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/50.gif
new file mode 100644
index 0000000..6e22e7f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/50.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/51.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/51.gif
new file mode 100644
index 0000000..ad3f4d3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/51.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/52.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/52.gif
new file mode 100644
index 0000000..39f8a22
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/52.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/53.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/53.gif
new file mode 100644
index 0000000..a181ee7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/53.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/54.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/54.gif
new file mode 100644
index 0000000..e289d92
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/54.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/55.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/55.gif
new file mode 100644
index 0000000..4351083
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/55.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/56.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/56.gif
new file mode 100644
index 0000000..e0eff22
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/56.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/57.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/57.gif
new file mode 100644
index 0000000..0bf130f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/57.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/58.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/58.gif
new file mode 100644
index 0000000..0f06508
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/58.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/59.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/59.gif
new file mode 100644
index 0000000..7081e4f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/59.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/6.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/6.gif
new file mode 100644
index 0000000..f7715bf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/6.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/60.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/60.gif
new file mode 100644
index 0000000..6e15f89
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/60.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/61.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/61.gif
new file mode 100644
index 0000000..f092d7e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/61.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/62.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/62.gif
new file mode 100644
index 0000000..7fe4984
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/62.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/63.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/63.gif
new file mode 100644
index 0000000..cf8e23e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/63.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/64.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/64.gif
new file mode 100644
index 0000000..a779719
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/64.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/65.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/65.gif
new file mode 100644
index 0000000..7bb98f2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/65.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/66.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/66.gif
new file mode 100644
index 0000000..bb6d077
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/66.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/67.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/67.gif
new file mode 100644
index 0000000..6e33f7c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/67.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/68.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/68.gif
new file mode 100644
index 0000000..1a6c400
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/68.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/69.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/69.gif
new file mode 100644
index 0000000..a02f0b2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/69.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/7.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/7.gif
new file mode 100644
index 0000000..e6d4db8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/7.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/70.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/70.gif
new file mode 100644
index 0000000..416c5c1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/70.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/71.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/71.gif
new file mode 100644
index 0000000..c17d60c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/71.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/8.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/8.gif
new file mode 100644
index 0000000..66f967b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/8.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/images/face/9.gif b/management/guns-admin/src/main/webapp/static/layui/images/face/9.gif
new file mode 100644
index 0000000..6044740
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/images/face/9.gif
Binary files differ
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/carousel.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/carousel.js
new file mode 100644
index 0000000..2c4521b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/carousel.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;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&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['<button class="layui-icon '+u+'" lay-type="sub">'+("updown"===n.anim?"&#xe619;":"&#xe603;")+"</button>",'<button class="layui-icon '+u+'" lay-type="add">'+("updown"===n.anim?"&#xe61a;":"&#xe602;")+"</button>"].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(['<div class="'+c+'"><ul>',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("<li"+(n.index===e?' class="layui-this"':"")+"></li>")}),i.join("")}(),"</ul></div>"].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<n.index&&e.slide("sub",n.index-a)})},m.prototype.slide=function(e,i){var n=this,l=n.elemItem,u=n.config,c=u.index,m=u.elem.attr("lay-filter");n.haveSlide||("sub"===e?(n.subIndex(i),l.eq(u.index).addClass(d),setTimeout(function(){l.eq(c).addClass(r),l.eq(u.index).addClass(r)},50)):(n.addIndex(i),l.eq(u.index).addClass(s),setTimeout(function(){l.eq(c).addClass(o),l.eq(u.index).addClass(o)},50)),setTimeout(function(){l.removeClass(a+" "+d+" "+s+" "+o+" "+r),l.eq(u.index).addClass(a),n.haveSlide=!1},300),n.elemInd.find("li").eq(u.index).addClass(a).siblings().removeClass(a),n.haveSlide=!0,layui.event.call(this,t,"change("+m+")",{index:u.index,prevIndex:c,item:l.eq(u.index)}))},m.prototype.events=function(){var e=this,i=e.config;i.elem.data("haveEvents")||(i.elem.on("mouseenter",function(){clearInterval(e.timer)}).on("mouseleave",function(){e.autoplay()}),i.elem.data("haveEvents",!0))},n.render=function(e){var i=new m(e);return i},e(t,n)});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/code.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/code.js
new file mode 100644
index 0000000..877c86f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/code.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&quot;")),c.html('<ol class="layui-code-ol"><li>'+o.replace(/[\r\t\n]+/g,"</li><li>")+"</li></ol>"),c.find(">.layui-code-h3")[0]||c.prepend('<h3 class="layui-code-h3">'+(c.attr("lay-title")||e.title||"code")+(e.about?'<a href="'+l+'" target="_blank">layui.code</a>':"")+"</h3>");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");
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/colorpicker.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/colorpicker.js
new file mode 100644
index 0000000..0fc6395
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/colorpicker.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['<div class="layui-unselect layui-colorpicker">',"<span "+("rgb"==o.format&&o.alpha?'class="layui-colorpicker-trigger-bgcolor"':"")+">",'<span class="layui-colorpicker-trigger-span" ','lay-type="'+("rgb"==o.format?o.alpha?"rgba":"torgb":"")+'" ','style="'+function(){var e="";return o.color?(e=o.color,(o.color.match(/[0-9]{1,3}/g)||[]).length>3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','<i class="layui-icon layui-colorpicker-trigger-i '+(o.color?a:s)+'"></i>',"</span>","</span>","</div>"].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['<div id="layui-colorpicker'+e.index+'" data-index="'+e.index+'" class="layui-anim layui-anim-upbit layui-colorpicker-main">','<div class="layui-colorpicker-main-wrapper">','<div class="layui-colorpicker-basis">','<div class="layui-colorpicker-basis-white"></div>','<div class="layui-colorpicker-basis-black"></div>','<div class="layui-colorpicker-basis-cursor"></div>',"</div>",'<div class="layui-colorpicker-side">','<div class="layui-colorpicker-side-slider"></div>',"</div>","</div>",'<div class="layui-colorpicker-main-alpha '+(o.alpha?n:"")+'">','<div class="layui-colorpicker-alpha-bgcolor">','<div class="layui-colorpicker-alpha-slider"></div>',"</div>","</div>",function(){if(o.predefine){var e=['<div class="layui-colorpicker-main-pre">'];return layui.each(o.colors,function(i,o){e.push(['<div class="layui-colorpicker-pre'+((o.match(/[0-9]{1,3}/g)||[]).length>3?" layui-colorpicker-pre-isalpha":"")+'">','<div style="background:'+o+'"></div>',"</div>"].join(""))}),e.push("</div>"),e.join("")}return""}(),'<div class="layui-colorpicker-main-input">','<div class="layui-inline">','<input type="text" class="layui-input">',"</div>",'<div class="layui-btn-container">','<button class="layui-btn layui-btn-primary layui-btn-sm" colorpicker-events="clear">清空</button>','<button class="layui-btn layui-btn-sm" colorpicker-events="confirm">确定</button>',"</div","</div>","</div>"].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:f<s&&(f=s),d+l+s>a()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['<div class="layui-auxiliar-moving" id="LAY-colorpicker-moving"></div'].join("")),Y=function(e){i("#LAY-colorpicker-moving")[0]||i("body").append(M),M.on("mousemove",e),M.on("mouseup",function(){M.remove()}).on("mouseleave",function(){M.remove()})};l.on("mousedown",function(e){var i=this.offsetTop,o=e.clientY,r=function(e){var r=i+(e.clientY-o),t=n[0].offsetHeight;r<0&&(r=0),r>t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/element.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/element.js
new file mode 100644
index 0000000..290a1e8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/element.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;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='<li lay-id="'+(i.id||"")+'"'+(i.attr?' lay-attr="'+i.attr+'"':"")+">"+(i.title||"unnaming")+"</li>";return s[0]?s.before(r):n.append(r),o.append('<div class="layui-tab-item">'+(i.content||"")+"</div>"),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('<span class="layui-unselect layui-tab-bar" '+r+"><i "+r+' class="layui-icon">&#xe61a;</i></span>');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 class="layui-icon layui-unselect '+l+'">&#x1006;</i>');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("&#xe602;"),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"&#xe61a;":"&#xe602;"),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('<span class="'+c+'"></span>'),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('<span class="'+y+'"></span>'),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("<span "+i+">"+e+"</span>")}),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('<span class="'+t+'-text">'+l+"</span>")},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('<i class="layui-icon layui-colla-icon">'+(l?"&#xe602;":"&#xe61a;")+"</i>"),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)});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/flow.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/flow.js
new file mode 100644
index 0000000..924c78d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/flow.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='<i class="layui-anim layui-anim-rotate layui-anim-loop layui-icon ">&#xe63e;</i>';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="<cite>加载更多</cite>",h=l('<div class="layui-flow-more"><a href="javascript:;">'+d+"</a></div>");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&&f.width()&&(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;s<t.lazyimg.elem.length;s++){var v=t.lazyimg.elem.eq(s),y=a?function(){return v.offset().top-n.offset().top+m}():v.offset().top;if(c(v,f),i=s,y>u)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)});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/form.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/form.js
new file mode 100644
index 0000000..818dd39
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/form.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;layui.define("layer",function(e){"use strict";var t=layui.$,i=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 i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=this,n=t(r+'[lay-filter="'+e+'"]');return n.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value==t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e),a.getValue(e)},u.prototype.getValue=function(e,i){i=i||t(r+'[lay-filter="'+e+'"]').eq(0);var a={},n={},l=i.find("input,select,textarea");return layui.each(l,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];a[i]=0|a[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(n[t.name]=t.value)}}),n},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),g=i.find("dl"),x=g.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=g.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),x.removeClass(o),y=null,x.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),T()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||$(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},T=function(){var e=g.children("dd."+s);if(e[0]){var t=e.position().top,i=g.height(),a=e.height();t>i&&g.scrollTop(t+g.scrollTop()-i+a-5),t<0&&g.scrollTop(t+g.scrollTop()-5)}};m.on("click",function(e){i.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 t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=g.children("dd."+s);if(g.children("dd."+o)[0]&&"next"===t){var i=g.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n<e.index()&&!i.hasClass(s))return i.eq(0).prev()[0]?i.eq(0).prev():g.children(":last")}return a&&a[0]?a:y&&y[0]?y:e}();return l=r[t](),n=r[t]("dd:not(."+o+")"),l[0]?(y=r[t](),n[0]&&!n.hasClass(c)||!y[0]?(n.addClass(s).siblings().removeClass(s),void T()):i(t,y)):y=null};38===t&&i("prev"),40===t&&i("next"),13===t&&(e.preventDefault(),g.children("dd."+s).trigger("click"))});var $=function(e,i,a){var n=0;layui.each(x,function(){var i=t(this),l=i.text(),r=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:r)&&n++,"keyup"===a&&i[r?"addClass":"removeClass"](o)});var l=n===x.length;return i(l),l},q=function(e){var t=this.value,i=e.keyCode;return 9!==i&&13!==i&&37!==i&&38!==i&&39!==i&&40!==i&&($(t,function(e){e?g.find("."+r)[0]||g.append('<p class="'+r+'">无匹配项</p>'):g.find("."+r).remove()},"keyup"),""===t&&g.find("."+r).remove(),void T())};f&&k.on("keyup",q).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){$(k.val(),function(e){d||k.val("")},"blur")},200)}),x.on("click",function(){var e=t(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:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(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?i:v.innerHTML||i:i,m=t(['<div class="'+(h?"":"layui-unselect ")+a,(u?" layui-select-disabled":"")+'">','<div class="'+n+'">','<input type="text" placeholder="'+p+'" '+('value="'+(d?f.html():"")+'"')+(!u&&h?"":" readonly")+' class="layui-input'+(h?"":" layui-unselect")+(u?" "+c:"")+'">','<i class="layui-edge"></i></div>','<dl class="layui-anim layui-anim-upbit'+(r.find("optgroup")[0]?" layui-select-group":"")+'">',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("<dt>"+a.label+"</dt>"):t.push('<dd lay-value="'+a.value+'" class="'+(d===a.value?s:"")+(a.disabled?" "+c:"")+'">'+a.innerHTML+"</dd>"):t.push('<dd lay-value="" class="layui-select-tips">'+(a.innerHTML||i)+"</dd>")}),0===t.length&&t.push('<dd lay-value="" class="'+c+'">没有选项</dd>'),t.join("")}(r.find("*"))+"</dl>","</div>"].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"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(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=t(['<div class="layui-unselect '+u[0],n.checked?" "+u[1]:"",o?" layui-checkbox-disbaled "+c:"",'"',r?' lay-skin="'+r+'"':"",">",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?"<span>"+n.title+"</span>":"",'<i class="layui-icon layui-icon-ok"></i>'].join(""),_switch:"<em>"+((n.checked?s[0]:s[1])||"")+"</em><i></i>"};return t[r]||t.checkbox}(),"</div>"].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["&#xe643;","&#xe63f;"],a=u.find("input[type=radio]"),n=function(a){var n=t(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=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[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=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['<div class="layui-unselect '+e,l.checked?" "+e+"ed":"",(o?" layui-radio-disbaled "+c:"")+'">','<i class="layui-anim layui-icon">'+i[l.checked?0:1]+"</i>","<div>"+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"</div>","</div>"].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=null,a=f.config.verify,s="layui-form-danger",o={},c=t(this),u=c.parents(r),d=u.find("*[lay-verify]"),v=c.parents("form")[0],h=c.attr("lay-filter");return layui.each(d,function(l,r){var o=t(this),c=o.attr("lay-verify").split("|"),u=o.attr("lay-verType"),d=o.val();if(o.removeClass(s),layui.each(c,function(t,l){var c,f="",v="function"==typeof a[l];if(a[l]){var c=v?f=a[l](d,r):!a[l][0].test(d);if(f=f||a[l][1],"required"===l&&(f=o.attr("lay-reqText")||f),c)return"tips"===u?i.tips(f,function(){return"string"==typeof o.attr("lay-ignore")||"select"!==r.tagName.toLowerCase()&&!/^checkbox|radio$/.test(r.type)?o:o.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||setTimeout(function(){r.focus()},7),o.addClass(s),e=!0}}),e)return e}),!e&&(o=f.getValue(null,u),layui.event.call(this,l,"submit("+h+")",{elem:this,form:v,field:o}))},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/jquery.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/jquery.js
new file mode 100644
index 0000000..10d8c2b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/jquery.js
@@ -0,0 +1,5 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&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<d;x++)if(a=e[x],a||0===a)if("object"===pe.type(a))pe.merge(v,a.nodeType?[a]:a);else if(Ue.test(a)){for(u=u||y.appendChild(t.createElement("div")),l=(We.exec(a)||["",""])[1].toLowerCase(),f=Xe[l]||Xe._default,u.innerHTML=f[1]+pe.htmlPrefilter(a)+f[2],o=f[0];o--;)u=u.lastChild;if(!fe.leadingWhitespace&&$e.test(a)&&v.push(t.createTextNode($e.exec(a)[0])),!fe.tbody)for(a="table"!==l||Ve.test(a)?"<table>"!==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;r<i;r++)pe.event.add(t,n,s[n][r])}a.data&&(a.data=pe.extend({},a.data))}}function k(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!fe.noCloneEvent&&t[pe.expando]){i=pe._data(t);for(r in i.events)pe.removeEvent(t,r,i.handle);t.removeAttribute(pe.expando)}"script"===n&&t.text!==e.text?(C(t).text=e.text,E(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),fe.html5Clone&&e.innerHTML&&!pe.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Be.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)}}function S(e,t,n,r){t=oe.apply([],t);var i,o,a,s,u,l,c=0,f=e.length,d=f-1,p=t[0],g=pe.isFunction(p);if(g||f>1&&"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<f;c++)o=l,c!==d&&(o=pe.clone(o,!0,!0),a&&pe.merge(s,h(o,"script"))),n.call(e[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,pe.map(s,E),c=0;c<a;c++)o=s[c],Ie.test(o.type||"")&&!pe._data(o,"globalEval")&&pe.contains(u,o)&&(o.src?pe._evalUrl&&pe._evalUrl(o.src):pe.globalEval((o.text||o.textContent||o.innerHTML||"").replace(ot,"")));l=i=null}return e}function A(e,t,n){for(var r,i=t?pe.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||pe.cleanData(h(r)),r.parentNode&&(n&&pe.contains(r.ownerDocument,r)&&g(h(r,"script")),r.parentNode.removeChild(r));return e}function D(e,t){var n=pe(t.createElement(e)).appendTo(t.body),r=pe.css(n[0],"display");return n.detach(),r}function j(e){var t=re,n=lt[e];return n||(n=D(e,t),"none"!==n&&n||(ut=(ut||pe("<iframe frameborder='0' width='0' height='0'/>")).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<s;a++)r=e[a],r.style&&(o[a]=pe._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&Re(r)&&(o[a]=pe._data(r,"olddisplay",j(r.nodeName)))):(i=Re(r),(n&&"none"!==n||!i)&&pe._data(r,"olddisplay",i?n:pe.css(r,"display"))));for(a=0;a<s;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function _(e,t,n){var r=bt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function F(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;o<4;o+=2)"margin"===n&&(a+=pe.css(e,n+Oe[o],!0,i)),r?("content"===n&&(a-=pe.css(e,"padding"+Oe[o],!0,i)),"margin"!==n&&(a-=pe.css(e,"border"+Oe[o]+"Width",!0,i))):(a+=pe.css(e,"padding"+Oe[o],!0,i),"padding"!==n&&(a+=pe.css(e,"border"+Oe[o]+"Width",!0,i)));return a}function M(t,n,r){var i=!0,o="width"===n?t.offsetWidth:t.offsetHeight,a=ht(t),s=fe.boxSizing&&"border-box"===pe.css(t,"boxSizing",!1,a);if(re.msFullscreenElement&&e.top!==e&&t.getClientRects().length&&(o=Math.round(100*t.getBoundingClientRect()[n])),o<=0||null==o){if(o=gt(t,n,a),(o<0||null==o)&&(o=t.style[n]),ft.test(o))return o;i=s&&(fe.boxSizingReliable()||o===t.style[n]),o=parseFloat(o)||0}return o+F(t,n,r||(s?"border":"content"),i,a)+"px"}function O(e,t,n,r,i){return new O.prototype.init(e,t,n,r,i)}function R(){return e.setTimeout(function(){Nt=void 0}),Nt=pe.now()}function P(e,t){var n,r={height:e},i=0;for(t=t?1:0;i<4;i+=2-t)n=Oe[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function B(e,t,n){for(var r,i=($.tweeners[t]||[]).concat($.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function W(e,t,n){var r,i,o,a,s,u,l,c,f=this,d={},p=e.style,h=e.nodeType&&Re(e),g=pe._data(e,"fxshow");n.queue||(s=pe._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,u=s.empty.fire,s.empty.fire=function(){s.unqueued||u()}),s.unqueued++,f.always(function(){f.always(function(){s.unqueued--,pe.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],l=pe.css(e,"display"),c="none"===l?pe._data(e,"olddisplay")||j(e.nodeName):l,"inline"===c&&"none"===pe.css(e,"float")&&(fe.inlineBlockNeedsLayout&&"inline"!==j(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",fe.shrinkWrapBlocks()||f.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],St.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!g||void 0===g[r])continue;h=!0}d[r]=g&&g[r]||pe.style(e,r)}else l=void 0;if(pe.isEmptyObject(d))"inline"===("none"===l?j(e.nodeName):l)&&(p.display=l);else{g?"hidden"in g&&(h=g.hidden):g=pe._data(e,"fxshow",{}),o&&(g.hidden=!h),h?pe(e).show():f.done(function(){pe(e).hide()}),f.done(function(){var t;pe._removeData(e,"fxshow");for(t in d)pe.style(e,t,d[t])});for(r in d)a=B(h?g[r]:0,r,f),r in g||(g[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function I(e,t){var n,r,i,o,a;for(n in e)if(r=pe.camelCase(n),i=t[r],o=e[n],pe.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=pe.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function $(e,t,n){var r,i,o=0,a=$.prefilters.length,s=pe.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Nt||R(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;a<u;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),o<1&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:pe.extend({},t),opts:pe.extend(!0,{specialEasing:{},easing:pe.easing._default},n),originalProperties:t,originalOptions:n,startTime:Nt||R(),duration:n.duration,tweens:[],createTween:function(t,n){var r=pe.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(I(c,l.opts.specialEasing);o<a;o++)if(r=$.prefilters[o].call(l,e,c,l.opts))return pe.isFunction(r.stop)&&(pe._queueHooks(l.elem,l.opts.queue).stop=pe.proxy(r.stop,r)),r;return pe.map(c,B,l),pe.isFunction(l.opts.start)&&l.opts.start.call(e,l),pe.fx.timer(pe.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function z(e){return pe.attr(e,"class")||""}function X(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(De)||[];if(pe.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function U(e,t,n,r){function i(s){var u;return o[s]=!0,pe.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||a||o[l]?a?!(u=l):void 0:(t.dataTypes.unshift(l),i(l),!1)}),u}var o={},a=e===Qt;return i(t.dataTypes[0])||!o["*"]&&i("*")}function V(e,t){var n,r,i=pe.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&pe.extend(!0,e,n),e}function Y(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){u.unshift(a);break}if(u[0]in n)o=u[0];else{for(a in n){if(!u[0]||e.converters[a+" "+u[0]]){o=a;break}r||(r=a)}o=o||r}if(o)return o!==u[0]&&u.unshift(o),n[o]}function J(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(a=l[u+" "+o]||l["* "+o],!a)for(i in l)if(s=i.split(" "),s[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){a===!0?a=l[i]:l[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(f){return{state:"parsererror",error:a?f:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}function G(e){return e.style&&e.style.display||pe.css(e,"display")}function K(e){for(;e&&1===e.nodeType;){if("none"===G(e)||"hidden"===e.type)return!0;e=e.parentNode}return!1}function Q(e,t,n,r){var i;if(pe.isArray(t))pe.each(t,function(t,i){n||rn.test(e)?r(e,i):Q(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==pe.type(t))r(e,t);else for(i in t)Q(e+"["+i+"]",t[i],n,r)}function Z(){try{return new e.XMLHttpRequest}catch(t){}}function ee(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function te(e){return pe.isWindow(e)?e:9===e.nodeType&&(e.defaultView||e.parentWindow)}var ne=[],re=e.document,ie=ne.slice,oe=ne.concat,ae=ne.push,se=ne.indexOf,ue={},le=ue.toString,ce=ue.hasOwnProperty,fe={},de="1.12.3",pe=function(e,t){return new pe.fn.init(e,t)},he=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,ge=/^-ms-/,me=/-([\da-z])/gi,ye=function(e,t){return t.toUpperCase()};pe.fn=pe.prototype={jquery:de,constructor:pe,selector:"",length:0,toArray:function(){return ie.call(this)},get:function(e){return null!=e?e<0?this[e+this.length]:this[e]:ie.call(this)},pushStack:function(e){var t=pe.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e){return pe.each(this,e)},map:function(e){return this.pushStack(pe.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(ie.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ae,sort:ne.sort,splice:ne.splice},pe.extend=pe.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||pe.isFunction(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(i=arguments[s]))for(r in i)e=a[r],n=i[r],a!==n&&(l&&n&&(pe.isPlainObject(n)||(t=pe.isArray(n)))?(t?(t=!1,o=e&&pe.isArray(e)?e:[]):o=e&&pe.isPlainObject(e)?e:{},a[r]=pe.extend(l,o,n)):void 0!==n&&(a[r]=n));return a},pe.extend({expando:"jQuery"+(de+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===pe.type(e)},isArray:Array.isArray||function(e){return"array"===pe.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){var t=e&&e.toString();return!pe.isArray(e)&&t-parseFloat(t)+1>=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;i<r&&t.call(e[i],i,e[i])!==!1;i++);else for(i in e)if(t.call(e[i],i,e[i])===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(he,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?pe.merge(r,"string"==typeof e?[e]:e):ae.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(se)return se.call(t,e,n);for(r=t.length,n=n?n<0?Math.max(0,r+n):n:0;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;)e[i++]=t[r++];if(n!==n)for(;void 0!==t[r];)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)r=!t(e[o],o),r!==s&&i.push(e[o]);return i},map:function(e,t,r){var i,o,a=0,s=[];if(n(e))for(i=e.length;a<i;a++)o=t(e[a],a,r),null!=o&&s.push(o);else for(a in e)o=t(e[a],a,r),null!=o&&s.push(o);return oe.apply([],s)},guid:1,proxy:function(e,t){var n,r,i;if("string"==typeof t&&(i=e[t],t=e,e=i),pe.isFunction(e))return n=ie.call(arguments,2),r=function(){return e.apply(t||this,n.concat(ie.call(arguments)))},r.guid=e.guid=e.guid||pe.guid++,r},now:function(){return+new Date},support:fe}),"function"==typeof Symbol&&(pe.fn[Symbol.iterator]=ne[Symbol.iterator]),pe.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){ue["[object "+t+"]"]=t.toLowerCase()});var ve=function(e){function t(e,t,n,r){var i,o,a,s,u,l,f,p,h=t&&t.ownerDocument,g=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==g&&9!==g&&11!==g)return n;if(!r&&((t?t.ownerDocument||t:B)!==H&&L(t),t=t||H,_)){if(11!==g&&(l=ye.exec(e)))if(i=l[1]){if(9===g){if(!(a=t.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(h&&(a=h.getElementById(i))&&R(t,a)&&a.id===i)return n.push(a),n}else{if(l[2])return Q.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&w.getElementsByClassName&&t.getElementsByClassName)return Q.apply(n,t.getElementsByClassName(i)),n}if(w.qsa&&!X[e+" "]&&(!F||!F.test(e))){if(1!==g)h=t,p=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(xe,"\\$&"):t.setAttribute("id",s=P),f=N(e),o=f.length,u=de.test(s)?"#"+s:"[id='"+s+"']";o--;)f[o]=u+" "+d(f[o]);p=f.join(","),h=ve.test(e)&&c(t.parentNode)||t}if(p)try{return Q.apply(n,h.querySelectorAll(p)),n}catch(m){}finally{s===P&&t.removeAttribute("id")}}}return S(e.replace(se,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>T.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="";t<n;t++)r+=e[t].value;return r}function p(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=I++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,u,l,c=[W,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[P]||(t[P]={}),u=l[t.uniqueID]||(l[t.uniqueID]={}),(s=u[r])&&s[0]===W&&s[1]===o)return c[2]=s[2];if(u[r]=c,c[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?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<o;i++)t(e,n[i],r);return r}function m(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function y(e,t,n,i,o,a){return i&&!i[P]&&(i=y(i)),o&&!o[P]&&(o=y(o,a)),r(function(r,a,s,u){var l,c,f,d=[],p=[],h=a.length,y=r||g(t||"*",s.nodeType?[s]:s,[]),v=!e||!r&&t?y:m(y,d,e,s,u),x=n?o||(r?e:h||i)?[]:a:v;if(n&&n(v,x,s,u),i)for(l=m(x,p),i(l,[],s,u),c=l.length;c--;)(f=l[c])&&(x[p[c]]=!(v[p[c]]=f));if(r){if(o||e){if(o){for(l=[],c=x.length;c--;)(f=x[c])&&l.push(v[c]=f);o(null,x=[],l,u)}for(c=x.length;c--;)(f=x[c])&&(l=o?ee(r,f):d[c])>-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}];s<i;s++)if(n=T.relative[e[s].type])c=[p(h(c),n)];else{if(n=T.filter[e[s].type].apply(null,e[s].matches),n[P]){for(r=++s;r<i&&!T.relative[e[r].type];r++);return y(s>1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s<r&&v(e.slice(s,r)),r<i&&v(e=e.slice(r)),r<i&&d(e))}c.push(n)}return h(c)}function x(e,n){var i=n.length>0,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<r;n++)if(e[n]===t)return n;return-1},te="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",ne="[\\x20\\t\\r\\n\\f]",re="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",ie="\\["+ne+"*("+re+")(?:"+ne+"*([*^$|!~]?=)"+ne+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+re+"))|)"+ne+"*\\]",oe=":("+re+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+ie+")*)|.*)\\)|)",ae=new RegExp(ne+"+","g"),se=new RegExp("^"+ne+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ne+"+$","g"),ue=new RegExp("^"+ne+"*,"+ne+"*"),le=new RegExp("^"+ne+"*([>+~]|"+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="<a id='"+P+"'></a><select id='"+P+"-\r\\' msallowcapture=''><option selected=''></option></select>",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<t;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:l(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[b]=s(b);for(b in{submit:!0,reset:!0})T.pseudos[b]=u(b);return f.prototype=T.filters=T.pseudos,T.setFilters=new f,N=t.tokenize=function(e,n){var r,i,o,a,s,u,l,c=z[e+" "];if(c)return n?0:c.slice(0);for(s=e,u=[],l=T.preFilter;s;){r&&!(i=ue.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),r=!1,(i=le.exec(s))&&(r=i.shift(),o.push({value:r,type:i[0].replace(se," ")}),s=s.slice(r.length));for(a in T.filter)!(i=pe[a].exec(s))||l[a]&&!(i=l[a](i))||(r=i.shift(),o.push({value:r,type:a,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):z(e,u).slice(0)},k=t.compile=function(e,t){var n,r=[],i=[],o=X[e+" "];if(!o){for(t||(t=N(e)),n=t.length;n--;)o=v(t[n]),o[P]?r.push(o):i.push(o);o=X(e,x(i,r)),o.selector=e}return o},S=t.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,f=!r&&N(e=l.selector||e);if(n=n||[],1===f.length){if(o=f[0]=f[0].slice(0),o.length>2&&"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="<a href='#'></a>","#"===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="<input/>",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;t<i;t++)if(pe.contains(r[t],this))return!0}));for(t=0;t<i;t++)pe.find(e,r[t],n);return n=this.pushStack(i>1?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<r;t++)if(pe.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=we.test(e)||"string"!=typeof e?pe(e,t||this.context):0;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-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<a.length;)a[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=a.length,n=!1);e.memory||(n=!1),t=!1,i&&(a=n?[]:"")},c={add:function(){return a&&(n&&!t&&(u=a.length-1,s.push(n)),function r(t){pe.each(t,function(t,n){pe.isFunction(n)?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==pe.type(n)&&r(n)})}(arguments),n&&!t&&l()),this},remove:function(){return pe.each(arguments,function(e,t){for(var n;(n=pe.inArray(t,a,n))>-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);i<a;i++)o[i]&&pe.isFunction(o[i].promise)?o[i].promise().progress(l(i,n,t)).done(l(i,r,o)).fail(u.reject):--s;return s||u.resolveWith(r,o),u.promise()}});var je;pe.fn.ready=function(e){return pe.ready.promise().done(e),this},pe.extend({isReady:!1,readyWait:1,holdReady:function(e){e?pe.readyWait++:pe.ready(!0)},ready:function(e){(e===!0?--pe.readyWait:pe.isReady)||(pe.isReady=!0,e!==!0&&--pe.readyWait>0||(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<n?pe.queue(this[0],e):void 0===t?this:this.each(function(){var n=pe.queue(this,e,t);pe._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&pe.dequeue(this,e)})},dequeue:function(e){return this.each(function(){pe.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=pe.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";a--;)n=pe._data(o[a],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}}),function(){var e;fe.shrinkWrapBlocks=function(){if(null!=e)return e;e=!1;var t,n,r;return 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="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",t.appendChild(re.createElement("div")).style.width="5px",e=3!==t.offsetWidth),n.removeChild(r),e):void 0}}();var Fe=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Me=new RegExp("^(?:([+-])=|)("+Fe+")([a-z%]*)$","i"),Oe=["Top","Right","Bottom","Left"],Re=function(e,t){return e=t||e,"none"===pe.css(e,"display")||!pe.contains(e.ownerDocument,e)},Pe=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===pe.type(n)){i=!0;for(s in n)Pe(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,pe.isFunction(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(pe(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},Be=/^(?:checkbox|radio)$/i,We=/<([\w:-]+)/,Ie=/^$|\/(?:java|ecma)script/i,$e=/^\s+/,ze="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";!function(){var e=re.createElement("div"),t=re.createDocumentFragment(),n=re.createElement("input");e.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav></:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="<textarea>x</textarea>",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,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:fe.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/<tbody/i;!function(){var t,n,r=re.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(fe[t]=n in e)||(r.setAttribute(n,"t"),fe[t]=r.attributes[n].expando===!1);r=null}();var Ye=/^(?:input|select|textarea)$/i,Je=/^key/,Ge=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ke=/^(?:focusinfocus|focusoutblur)$/,Qe=/^([^.]*)(?:\.(.+)|)/;pe.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe._data(e);if(m){for(n.handler&&(u=n,n=u.handler,i=u.selector),n.guid||(n.guid=pe.guid++),(a=m.events)||(a=m.events={}),(c=m.handle)||(c=m.handle=function(e){return"undefined"==typeof pe||e&&pe.event.triggered===e.type?void 0:pe.event.dispatch.apply(c.elem,arguments)},c.elem=e),t=(t||"").match(De)||[""],s=t.length;s--;)o=Qe.exec(t[s])||[],p=g=o[1],h=(o[2]||"").split(".").sort(),p&&(l=pe.event.special[p]||{},p=(i?l.delegateType:l.bindType)||p,l=pe.event.special[p]||{},f=pe.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&pe.expr.match.needsContext.test(i),namespace:h.join(".")},u),(d=a[p])||(d=a[p]=[],d.delegateCount=0,l.setup&&l.setup.call(e,r,h,c)!==!1||(e.addEventListener?e.addEventListener(p,c,!1):e.attachEvent&&e.attachEvent("on"+p,c))),l.add&&(l.add.call(e,f),f.handler.guid||(f.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,f):d.push(f),pe.event.global[p]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe.hasData(e)&&pe._data(e);if(m&&(c=m.events)){for(t=(t||"").match(De)||[""],l=t.length;l--;)if(s=Qe.exec(t[l])||[],p=g=s[1],h=(s[2]||"").split(".").sort(),p){for(f=pe.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,d=c[p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=d.length;o--;)a=d[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(d.splice(o,1),a.selector&&d.delegateCount--,f.remove&&f.remove.call(e,a));u&&!d.length&&(f.teardown&&f.teardown.call(e,h,m.handle)!==!1||pe.removeEvent(e,p,m.handle),delete c[p])}else for(p in c)pe.event.remove(e,p+t[l],n,r,!0);pe.isEmptyObject(c)&&(delete m.handle,pe._removeData(e,"events"))}},trigger:function(t,n,r,i){var o,a,s,u,l,c,f,d=[r||re],p=ce.call(t,"type")?t.type:t,h=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=c=r=r||re,3!==r.nodeType&&8!==r.nodeType&&!Ke.test(p+pe.event.triggered)&&(p.indexOf(".")>-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<s;n++)o=t[n],i=o.selector+" ",void 0===r[i]&&(r[i]=o.needsContext?pe(i,this).index(u)>-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s<t.length&&a.push({elem:this,handlers:t.slice(s)}),a},fix:function(e){if(e[pe.expando])return e;var t,n,r,i=e.type,o=e,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Ge.test(i)?this.mouseHooks:Je.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new pe.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||re),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,a.filter?a.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget detail 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,t){var n,r,i,o=t.button,a=t.fromElement;return null==e.pageX&&null!=t.clientX&&(r=e.target.ownerDocument||re,i=r.documentElement,n=r.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?t.toElement:a),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==b()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){if(this===b()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(pe.nodeName(this,"input")&&"checkbox"===this.type&&this.click)return this.click(),!1},_default:function(e){return pe.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n){var r=pe.extend(new pe.Event,n,{type:e,isSimulated:!0});pe.event.trigger(r,null,t),r.isDefaultPrevented()&&n.preventDefault()}},pe.removeEvent=re.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)}:function(e,t,n){var r="on"+t;e.detachEvent&&("undefined"==typeof e[r]&&(e[r]=null),e.detachEvent(r,n))},pe.Event=function(e,t){return this instanceof pe.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?v:x):this.type=e,t&&pe.extend(this,t),this.timeStamp=e&&e.timeStamp||pe.now(),void(this[pe.expando]=!0)):new pe.Event(e,t)},pe.Event.prototype={constructor:pe.Event,isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=v,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=v,e&&!this.isSimulated&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=v,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},pe.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){pe.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||pe.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),fe.submit||(pe.event.special.submit={setup:function(){return!pe.nodeName(this,"form")&&void pe.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=pe.nodeName(t,"input")||pe.nodeName(t,"button")?pe.prop(t,"form"):void 0;n&&!pe._data(n,"submit")&&(pe.event.add(n,"submit._submit",function(e){e._submitBubble=!0}),pe._data(n,"submit",!0))})},postDispatch:function(e){e._submitBubble&&(delete e._submitBubble,this.parentNode&&!e.isTrigger&&pe.event.simulate("submit",this.parentNode,e))},teardown:function(){return!pe.nodeName(this,"form")&&void pe.event.remove(this,"._submit")}}),fe.change||(pe.event.special.change={setup:function(){return Ye.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(pe.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._justChanged=!0)}),pe.event.add(this,"click._change",function(e){this._justChanged&&!e.isTrigger&&(this._justChanged=!1),pe.event.simulate("change",this,e)})),!1):void pe.event.add(this,"beforeactivate._change",function(e){var t=e.target;Ye.test(t.nodeName)&&!pe._data(t,"change")&&(pe.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||pe.event.simulate("change",this.parentNode,e)}),pe._data(t,"change",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type)return e.handleObj.handler.apply(this,arguments)},teardown:function(){return pe.event.remove(this,"._change"),!Ye.test(this.nodeName)}}),fe.focusin||pe.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){pe.event.simulate(t,e.target,pe.event.fix(e))};pe.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=pe._data(r,t);i||r.addEventListener(e,n,!0),pe._data(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=pe._data(r,t)-1;i?pe._data(r,t,i):(r.removeEventListener(e,n,!0),pe._removeData(r,t))}}}),pe.fn.extend({on:function(e,t,n,r){return w(this,e,t,n,r)},one:function(e,t,n,r){return w(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,pe(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return t!==!1&&"function"!=typeof t||(n=t,t=void 0),n===!1&&(n=x),this.each(function(){pe.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){pe.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return pe.event.trigger(e,t,n,!0)}});var Ze=/ jQuery\d+="(?:null|\d+)"/g,et=new RegExp("<(?:"+ze+")[\\s/>]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/<script|<style|<link/i,rt=/checked\s*(?:[^=]|=\s*.checked.)/i,it=/^true\/(.*)/,ot=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1></$2>")},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(;n<r;n++)t=this[n]||{},1===t.nodeType&&(pe.cleanData(h(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return S(this,arguments,function(t){var n=this.parentNode;pe.inArray(this,e)<0&&(pe.cleanData(h(this)),
+n&&n.replaceChild(t,this))},e)}}),pe.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){pe.fn[e]=function(e){for(var n,r=0,i=[],o=pe(e),a=o.length-1;r<=a;r++)n=r===a?this:this.clone(!0),pe(o[r])[t](n),ae.apply(i,n.get());return this.pushStack(i)}});var ut,lt={HTML:"block",BODY:"block"},ct=/^margin/,ft=new RegExp("^("+Fe+")(?!px)[a-z%]+$","i"),dt=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},pt=re.documentElement;!function(){function t(){var t,c,f=re.documentElement;f.appendChild(u),l.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",n=i=s=!1,r=a=!0,e.getComputedStyle&&(c=e.getComputedStyle(l),n="1%"!==(c||{}).top,s="2px"===(c||{}).marginLeft,i="4px"===(c||{width:"4px"}).width,l.style.marginRight="50%",r="4px"===(c||{marginRight:"4px"}).marginRight,t=l.appendChild(re.createElement("div")),t.style.cssText=l.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",t.style.marginRight=t.style.width="0",l.style.width="1px",a=!parseFloat((e.getComputedStyle(t)||{}).marginRight),l.removeChild(t)),l.style.display="none",o=0===l.getClientRects().length,o&&(l.style.display="",l.innerHTML="<table><tr><td></td><td>t</td></tr></table>",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;a<i;a++)o[t[a]]=pe.css(e,t[a],!1,r);return o}return void 0!==n?pe.style(e,t,n):pe.css(e,t)},e,t,arguments.length>1)},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<i;r++)n=e[r],$.tweeners[n]=$.tweeners[n]||[],$.tweeners[n].unshift(t)},prefilters:[W],prefilter:function(e,t){t?$.prefilters.unshift(e):$.prefilters.push(e)}}),pe.speed=function(e,t,n){var r=e&&"object"==typeof e?pe.extend({},e):{complete:n||!n&&t||pe.isFunction(e)&&e,duration:e,easing:n&&t||t&&!pe.isFunction(t)&&t};return r.duration=pe.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in pe.fx.speeds?pe.fx.speeds[r.duration]:pe.fx.speeds._default,null!=r.queue&&r.queue!==!0||(r.queue="fx"),r.old=r.complete,r.complete=function(){pe.isFunction(r.old)&&r.old.call(this),r.queue&&pe.dequeue(this,r.queue)},r},pe.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Re).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=pe.isEmptyObject(e),o=pe.speed(t,n,r),a=function(){var t=$(this,pe.extend({},e),o);(i||pe._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=pe.timers,a=pe._data(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&At.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||pe.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=pe._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=pe.timers,a=r?r.length:0;for(n.finish=!0,pe.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),pe.each(["toggle","show","hide"],function(e,t){var n=pe.fn[t];pe.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(P(t,!0),e,r,i)}}),pe.each({slideDown:P("show"),slideUp:P("hide"),slideToggle:P("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){pe.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),pe.timers=[],pe.fx.tick=function(){var e,t=pe.timers,n=0;for(Nt=pe.now();n<t.length;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||pe.fx.stop(),Nt=void 0},pe.fx.timer=function(e){pe.timers.push(e),e()?pe.fx.start():pe.timers.pop()},pe.fx.interval=13,pe.fx.start=function(){kt||(kt=e.setInterval(pe.fx.tick,pe.fx.interval))},pe.fx.stop=function(){e.clearInterval(kt),kt=null},pe.fx.speeds={slow:600,fast:200,_default:400},pe.fn.delay=function(t,n){return t=pe.fx?pe.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e,t=re.createElement("input"),n=re.createElement("div"),r=re.createElement("select"),i=r.appendChild(re.createElement("option"));n=re.createElement("div"),n.setAttribute("className","t"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",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<s;u++)if(n=r[u],(n.selected||u===i)&&(fe.optDisabled?!n.disabled:null===n.getAttribute("disabled"))&&(!n.parentNode.disabled||!pe.nodeName(n.parentNode,"optgroup"))){if(t=pe(n).val(),o)return t;a.push(t)}return a},set:function(e,t){for(var n,r,i=e.options,o=pe.makeArray(t),a=i.length;a--;)if(r=i[a],pe.inArray(pe.valHooks.option.get(r),o)>-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("<div>").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});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/laydate.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/laydate.js
new file mode 100644
index 0000000..0766cb5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/laydate.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;!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="开始日期超出了结束日期<br>建议重新选择",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));t<n.length;t++)this.push(n[t])};C.prototype=[],C.prototype.constructor=C,w.extend=function(){var e=1,t=arguments,n=function(e,t){e=e||(t.constructor===Array?[]:{});for(var a in t)e[a]=t[a]&&t[a].constructor===Object?n(e[a],t[a]):t[a];return e};for(t[0]="object"==typeof t[0]?t[0]:{};e<t.length;e++)"object"==typeof t[e]&&n(t[0],t[e]);return t[0]},w.ie=function(){var e=navigator.userAgent.toLowerCase();return!!(window.ActiveXObject||"ActiveXObject"in window)&&((e.match(/msie\s(\d+)/)||[])[1]||"11")}(),w.stope=function(e){e=e||window.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},w.each=function(e,t){var n,a=this;if("function"!=typeof t)return a;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;n<e.length&&!t.call(e[n],n,e[n]);n++);return a},w.digit=function(e,t,n){var a="";e=String(e),t=t||2;for(var i=e.length;i<t;i++)a+="0";return e<Math.pow(10,t)?a+(0|e):e},w.elem=function(e,t){var n=document.createElement(e);return w.each(t||{},function(e,t){n.setAttribute(e,t)}),n},C.addStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){new RegExp("\\b"+n+"\\b").test(e)||(e=e+" "+n)}),e.replace(/^\s|\s$/,"")},C.removeStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){var a=new RegExp("\\b"+n+"\\b");a.test(e)&&(e=e.replace(a,""))}),e.replace(/\s+/," ").replace(/^\s|\s$/,"")},C.prototype.find=function(e){var t=this,n=0,a=[],i="object"==typeof e;return this.each(function(r,o){for(var s=i?[e]:o.querySelectorAll(e||null);n<s.length;n++)a.push(s[n]);t.shift()}),i||(t.selector=(t.selector?t.selector+" ":"")+e),w.each(a,function(e,n){t.push(n)}),t},C.prototype.each=function(e){return w.each.call(this,this,e)},C.prototype.addClass=function(e,t){return this.each(function(n,a){a.className=C[t?"removeStr":"addStr"](a.className,e)})},C.prototype.removeClass=function(e){return this.addClass(e,!0)},C.prototype.hasClass=function(e){var t=!1;return this.each(function(n,a){new RegExp("\\b"+e+"\\b").test(a.className)&&(t=!0)}),t},C.prototype.attr=function(e,t){var n=this;return void 0===t?function(){if(n.length>0)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?r<s?o+r*s:r:o);a=[l.getFullYear(),l.getMonth()+1,l.getDate()],r<s||(i=[l.getHours(),l.getMinutes(),l.getSeconds()])}else a=(t[n].match(/\d+-\d+-\d+/)||[""])[0].split("-"),i=(t[n].match(/\d+:\d+:\d+/)||[""])[0].split(":");t[n]={year:0|a[0]||(new Date).getFullYear(),month:a[1]?(0|a[1])-1:(new Date).getMonth(),date:0|a[2]||(new Date).getDate(),hours:0|i[0],minutes:0|i[1],seconds:0|i[2]}}),e.elemID="layui-laydate"+t.elem.attr("lay-key"),(t.show||a)&&e.render(),a||e.events(),t.value&&t.isInitValue&&(t.value.constructor===Date?e.setValue(e.parse(0,e.systemDate(t.value))):e.setValue(t.value)))},T.prototype.render=function(){var e=this,t=e.config,n=e.lang(),a="static"===t.position,i=e.elem=w.elem("div",{id:e.elemID,"class":["layui-laydate",t.range?" layui-laydate-range":"",a?" "+c:"",t.theme&&"default"!==t.theme&&!/^#/.test(t.theme)?" laydate-theme-"+t.theme:""].join("")}),r=e.elemMain=[],o=e.elemHeader=[],s=e.elemCont=[],l=e.table=[],d=e.footer=w.elem("div",{"class":p});if(t.zIndex&&(i.style.zIndex=t.zIndex),w.each(new Array(2),function(e){if(!t.range&&e>0)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="&#xe65a;",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="&#xe603;",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="&#xe602;",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="&#xe65b;",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('<span lay-type="datetime" class="laydate-btns-time">'+n.timeTips+"</span>"),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('<span lay-type="'+r+'" class="laydate-btns-'+r+'">'+o+"</span>"))}),e.push('<div class="laydate-footer-btns">'+i.join("")+"</div>"),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}));t.elem&&(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<l.length&&(a=!0),/yyyy|y/.test(l)?(c<d[0]&&(c=d[0],a=!0),e.year=c):/MM|M/.test(l)?(c<1&&(c=1,a=!0),e.month=c-1):/dd|d/.test(l)?(c<1&&(c=1,a=!0),e.date=c):/HH|H/.test(l)?(c<1&&(c=0,a=!0),e.hours=c,r.range&&(i[o[n]].hours=c)):/mm|m/.test(l)?(c<1&&(c=0,a=!0),e.minutes=c,r.range&&(i[o[n]].minutes=c)):/ss|s/.test(l)&&(c<1&&(c=0,a=!0),e.seconds=c,r.range&&(i[o[n]].seconds=c))}),c(e)};return"limit"===e?(c(o),i):(l=l||r.value,"string"==typeof l&&(l=l.replace(/\s+/g," ").replace(/^\s|\s$/g,"")),i.startState&&!i.endState&&(delete i.startState,i.endState=!0),"string"==typeof l&&l?i.EXP_IF.test(l)?r.range?(l=l.split(" "+r.range+" "),i.startDate=i.startDate||i.systemDate(),i.endDate=i.endDate||i.systemDate(),r.dateTime=w.extend({},i.startDate),w.each([i.startDate,i.endDate],function(e,t){m(t,l[e],e)})):m(o,l):(i.hint("日期格式不合法<br>必须遵循下述格式:<br>"+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"<br>已为你重置"),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('<span class="laydate-day-mark">'+n+"</span>"),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.now<l.min||l.now>l.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.year<d[0]&&(l.year=d[0],r.hint("最低只能支持到公元"+d[0]+"年")),l.year>d[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?(c=a-t+e,n.addClass("laydate-day-prev"),d=r.getAsYM(l.year,l.month,"sub")):e>=t&&e<i+t?(c=e-t,s.range||c+1===l.date&&n.addClass(o)):(c=e-i-t,n.addClass("laydate-day-next"),d=r.getAsYM(l.year,l.month)),d[1]++,d[2]=c+1,n.attr("lay-ymd",d.join("-")).html(d[2]),r.mark(n,d).limit(n,{year:d[0],month:d[1]-1,date:d[2]},e)}),w(f[0]).attr("lay-ym",l.year+"-"+(l.month+1)),w(f[1]).attr("lay-ym",l.year+"-"+(l.month+1)),"cn"===s.lang?(w(f[0]).attr("lay-type","year").html(l.year+"年"),w(f[1]).attr("lay-type","month").html(l.month+1+"月")):(w(f[0]).attr("lay-type","month").html(m.month[l.month]),w(f[1]).attr("lay-type","year").html(l.year)),u&&(s.range&&(e?r.endDate=r.endDate||{year:l.year+("year"===s.type?1:0),month:l.month+("month"===s.type?0:-1)}:r.startDate=r.startDate||{year:l.year,month:l.month},e&&(r.listYM=[[r.startDate.year,r.startDate.month+1],[r.endDate.year,r.endDate.month+1]],r.list(s.type,0).list(s.type,1),"time"===s.type?r.setBtnStatus("时间",w.extend({},r.systemDate(),r.startTime),w.extend({},r.systemDate(),r.endTime)):r.setBtnStatus(!0))),s.range||(r.listYM=[[l.year,l.month+1]],r.list(s.type,0))),s.range&&!e){var p=r.getAsYM(l.year,l.month);r.calendar(w.extend({},l,{year:p[0],month:p[1]}))}return s.range||r.limit(w(r.footer).find(g),null,0,["hours","minutes","seconds"]),s.range&&e&&!u&&r.stampRange(),r},T.prototype.list=function(e,t){var n=this,a=n.config,i=a.dateTime,r=n.lang(),l=a.range&&"date"!==a.type&&"datetime"!==a.type,d=w.elem("ul",{"class":m+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[e]}),c=n.elemHeader[t],u=w(c[2]).find("span"),h=n.elemCont[t||0],y=w(h).find("."+m)[0],f="cn"===a.lang,p=f?"年":"",T=n.listYM[t]||{},C=["hours","minutes","seconds"],x=["startTime","endTime"][t];if(T[0]<1&&(T[0]=1),"year"===e){var M,b=M=T[0]-7;b<1&&(b=M=1),w.each(new Array(15),function(e){var i=w.elem("li",{"lay-ym":M}),r={year:M};M==T[0]&&w(i).addClass(o),i.innerHTML=M+p,d.appendChild(i),M<n.firstDate.year?(r.month=a.min.month,r.date=a.min.date):M>=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.min.date: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=["<p>"+r.time[e]+"</p><ol>"];w.each(new Array(t),function(t){i.push("<li"+(n[x][C[e]]===t?' class="'+o+'"':"")+">"+w.digit(t,2)+"</li>")}),a.innerHTML=i.join("")+"</ol>",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&&s<t&&w(i).addClass(u)})},T.prototype.done=function(e,t){var n=this,a=n.config,i=w.extend({},n.startDate?w.extend(n.startDate,n.startTime):a.dateTime),r=w.extend({},w.extend(n.endDate,n.endTime));return w.each([i,r],function(e,t){"month"in t&&w.extend(t,{month:t.month+1})}),e=e||[n.parse(),i,r],"function"==typeof a[t||"done"]&&a[t||"done"].apply(a,e),n},T.prototype.choose=function(e){var t=this,n=t.config,a=n.dateTime,i=w(t.elem).find("td"),r=e.attr("lay-ymd").split("-"),l=function(e){new Date;e&&w.extend(a,r),n.range&&(t.startDate?w.extend(t.startDate,r):t.startDate=w.extend({},r,t.startTime),t.startYMD=r)};if(r={year:0|r[0],month:(0|r[1])-1,date:0|r[2]},!e.hasClass(s))if(n.range){if(w.each(["startTime","endTime"],function(e,n){t[n]=t[n]||{hours:0,minutes:0,seconds:0}}),t.endState)l(),delete t.endState,delete t.endDate,t.startState=!0,i.removeClass(o+" "+u),e.addClass(o);else if(t.startState){if(e.addClass(o),t.endDate?w.extend(t.endDate,r):t.endDate=w.extend({},r,t.endTime),t.newDate(r).getTime()<t.newDate(t.startYMD).getTime()){var d=w.extend({},t.endDate,{hours:t.startDate.hours,minutes:t.startDate.minutes,seconds:t.startDate.seconds});w.extend(t.endDate,t.startDate,{hours:t.endDate.hours,minutes:t.endDate.minutes,seconds:t.endDate.seconds}),t.startDate=d}n.showBottom||t.done(),t.stampRange(),t.endState=!0,t.done(null,"change")}else e.addClass(o),l(),t.startState=!0;w(t.footer).find(g)[t.endDate?"removeClass":"addClass"](s)}else"static"===n.position?(l(!0),t.calendar().done().done(null,"change")):"date"===n.type?(l(!0),t.setValue(t.parse()).remove().done()):"datetime"===n.type&&(l(!0),t.calendar().done(null,"change"))},T.prototype.tool=function(e,t){var n=this,a=n.config,i=a.dateTime,r="static"===a.position,o={datetime:function(){w(e).hasClass(s)||(n.list("time",0),a.range&&n.list("time",1),w(e).attr("lay-type","date").html(n.lang().dateTips))},date:function(){n.closeList(),w(e).attr("lay-type","datetime").html(n.lang().timeTips)},clear:function(){n.setValue("").remove(),r&&(w.extend(i,n.firstDate),n.calendar()),a.range&&(delete n.startState,delete n.endState,delete n.endDate,delete n.startTime,delete n.endTime),n.done(["",{},{}])},now:function(){var e=new Date;w.extend(i,n.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),n.setValue(n.parse()).remove(),r&&n.calendar(),n.done()},confirm:function(){if(a.range){if(!n.endDate)return n.hint("请先选择日期范围");if(w(e).hasClass(s))return n.hint("time"===a.type?l.replace(/日期/g,"时间"):l)}else if(w(e).hasClass(s))return n.hint("不在有效日期或时间范围内");n.done(),n.setValue(n.parse()).remove()}};o[t]&&o[t]()},T.prototype.change=function(e){var t=this,n=t.config,a=n.dateTime,i=n.range&&("year"===n.type||"month"===n.type),r=t.elemCont[e||0],o=t.listYM[e],s=function(s){var l=["startDate","endDate"][e],d=w(r).find(".laydate-year-list")[0],c=w(r).find(".laydate-month-list")[0];return d&&(o[0]=s?o[0]-15:o[0]+15,t.list("year",e)),c&&(s?o[0]--:o[0]++,t.list("month",e)),(d||c)&&(w.extend(a,{year:o[0]}),i&&(t[l].year=o[0]),n.range||t.done(null,"change"),t.setBtnStatus(),n.range||t.limit(w(t.footer).find(g),{year:o[0]})),d||c};return{prevYear:function(){s("sub")||(a.year--,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))},prevMonth:function(){var e=t.getAsYM(a.year,a.month,"sub");w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextMonth:function(){var e=t.getAsYM(a.year,a.month);w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextYear:function(){s()||(a.year++,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))}}},T.prototype.changeEvent=function(){var e=this;e.config;w(e.elem).on("click",function(e){w.stope(e)}),w.each(e.elemHeader,function(t,n){w(n[0]).on("click",function(n){e.change(t).prevYear()}),w(n[1]).on("click",function(n){e.change(t).prevMonth()}),w(n[2]).find("span").on("click",function(n){var a=w(this),i=a.attr("lay-ym"),r=a.attr("lay-type");i&&(i=i.split("-"),e.listYM[t]=[0|i[0],0|i[1]],e.list(r,t),w(e.footer).find(D).addClass(s))}),w(n[3]).on("click",function(n){e.change(t).nextMonth()}),w(n[4]).on("click",function(n){e.change(t).nextYear()})}),w.each(e.table,function(t,n){var a=w(n).find("td");a.on("click",function(){e.choose(w(this))})}),w(e.footer).find("span").on("click",function(){var t=w(this).attr("lay-type");e.tool(this,t)})},T.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())},T.prototype.events=function(){var e=this,t=e.config,n=function(n,a){n.on(t.trigger,function(){a&&(e.bindElem=this),e.render()})};t.elem[0]&&!t.elem[0].eventHandler&&(n(t.elem,"bind"),n(t.eventElem),w(document).on("click",function(n){n.target!==t.elem[0]&&n.target!==t.eventElem[0]&&n.target!==w(t.closeStop)[0]&&e.remove()}).on("keydown",function(t){13===t.keyCode&&w("#"+e.elemID)[0]&&e.elemID===T.thisElem&&(t.preventDefault(),w(e.footer).find(g)[0].click())}),w(window).on("resize",function(){return!(!e.elem||!w(r)[0])&&void e.position()}),t.elem[0].eventHandler=!0)},n.render=function(e){var t=new T(e);return a.call(t)},n.getEndDate=function(e,t){var n=new Date;return n.setFullYear(t||n.getFullYear(),e||n.getMonth()+1,1),new Date(n.getTime()-864e5).getDate()},window.lay=window.lay||w,e?(n.ready(),layui.define(function(e){n.path=layui.cache.dir,e(i,n)})):"function"==typeof define&&define.amd?define(function(){return n}):function(){n.ready(),window.laydate=n}()}();
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/layedit.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/layedit.js
new file mode 100644
index 0000000..6a18044
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/layedit.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;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(['<div class="'+r+'">','<div class="layui-unselect layui-layedit-tool">'+f+"</div>",'<div class="layui-layedit-iframe">','<iframe id="'+u+'" name="'+u+'" textarea="'+t+'" frameborder="0"></iframe>',"</div>","</div>"].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(["<style>","*{margin: 0; padding: 0;}","body{padding: 10px; line-height: 20px; overflow-x: hidden; word-wrap: break-word; font: 14px Helvetica Neue,Helvetica,PingFang SC,Microsoft YaHei,Tahoma,Arial,sans-serif; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}","a{color:#01AAED; text-decoration:none;}a:hover{color:#c00}","p{margin-bottom: 10px;}","img{display: inline-block; border: none; vertical-align: middle;}","pre{margin: 10px 0; padding: 10px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}","</style>"].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,"<p>")}}),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,"<p>"),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,"<p>"),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:['<ul class="layui-form" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">URL</label>','<div class="layui-input-block" style="margin-left: 90px">','<input name="url" lay-verify="url" value="'+(t.href||"")+'" autofocus="true" autocomplete="off" class="layui-input">',"</div>","</li>",'<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">打开方式</label>','<div class="layui-input-block" style="margin-left: 90px">','<input type="radio" name="target" value="_self" class="layui-input" title="当前窗口"'+("_self"!==t.target&&t.target?"":"checked")+">",'<input type="radio" name="target" value="_blank" class="layui-input" title="新窗口" '+("_blank"===t.target?"checked":"")+">","</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-link-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].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('<li title="'+e+'"><img src="'+i+'" alt="'+e+'"></li>')}),'<ul class="layui-clear">'+t.join("")+"</ul>"}(),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:['<ul class="layui-form layui-form-pane" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label">请选择语言</label>','<div class="layui-input-block">','<select name="lang">','<option value="JavaScript">JavaScript</option>','<option value="HTML">HTML</option>','<option value="CSS">CSS</option>','<option value="Java">Java</option>','<option value="PHP">PHP</option>','<option value="C#">C#</option>','<option value="Python">Python</option>','<option value="Ruby">Ruby</option>','<option value="Go">Go</option>',"</select>","</div>","</li>",'<li class="layui-form-item layui-form-text">','<label class="layui-form-label">代码</label>','<div class="layui-input-block">','<textarea name="code" lay-verify="required" autofocus="true" class="layui-textarea" style="height: 200px;"></textarea>',"</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-code-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].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:'<i class="layui-icon layedit-tool-html" title="HTML源代码" lay-command="html" layedit-event="html"">&#xe64b;</i><span class="layedit-tool-mid"></span>',strong:'<i class="layui-icon layedit-tool-b" title="加粗" lay-command="Bold" layedit-event="b"">&#xe62b;</i>',italic:'<i class="layui-icon layedit-tool-i" title="斜体" lay-command="italic" layedit-event="i"">&#xe644;</i>',underline:'<i class="layui-icon layedit-tool-u" title="下划线" lay-command="underline" layedit-event="u"">&#xe646;</i>',del:'<i class="layui-icon layedit-tool-d" title="删除线" lay-command="strikeThrough" layedit-event="d"">&#xe64f;</i>',"|":'<span class="layedit-tool-mid"></span>',left:'<i class="layui-icon layedit-tool-left" title="左对齐" lay-command="justifyLeft" layedit-event="left"">&#xe649;</i>',center:'<i class="layui-icon layedit-tool-center" title="居中对齐" lay-command="justifyCenter" layedit-event="center"">&#xe647;</i>',right:'<i class="layui-icon layedit-tool-right" title="右对齐" lay-command="justifyRight" layedit-event="right"">&#xe648;</i>',link:'<i class="layui-icon layedit-tool-link" title="插入链接" layedit-event="link"">&#xe64c;</i>',unlink:'<i class="layui-icon layedit-tool-unlink layui-disabled" title="清除链接" lay-command="unlink" layedit-event="unlink"">&#xe64d;</i>',face:'<i class="layui-icon layedit-tool-face" title="表情" layedit-event="face"">&#xe650;</i>',image:'<i class="layui-icon layedit-tool-image" title="图片" layedit-event="image">&#xe64a;<input type="file" name="file"></i>',code:'<i class="layui-icon layedit-tool-code" title="插入代码" layedit-event="code">&#xe64e;</i>',help:'<i class="layui-icon layedit-tool-help" title="帮助" layedit-event="help">&#xe607;</i>'},w=new c;t(n,w)});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/layer.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/layer.js
new file mode 100644
index 0000000..03e780c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/layer.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 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:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],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:"&#x4FE1;&#x606F;",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?'<div class="layui-layer-title" style="'+(f?r.title[1]:"")+'">'+(f?r.title[0]:r.title)+"</div>":"";return r.zIndex=s,t([r.shade?'<div class="layui-layer-shade" id="layui-layer-shade'+a+'" times="'+a+'" style="'+("z-index:"+(s-1)+"; ")+'"></div>':"",'<div class="'+l[0]+(" layui-layer-"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?"":" layui-layer-border")+" "+(r.skin||"")+'" id="'+l[0]+a+'" type="'+o.type[r.type]+'" times="'+a+'" showtime="'+r.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+s+"; width:"+r.area[0]+";height:"+r.area[1]+(r.fixed?"":";position:absolute;")+'">'+(e&&2!=r.type?"":u)+'<div id="'+(r.id||"")+'" class="layui-layer-content'+(0==r.type&&r.icon!==-1?" layui-layer-padding":"")+(3==r.type?" layui-layer-loading"+r.icon:"")+'">'+(0==r.type&&r.icon!==-1?'<i class="layui-layer-ico layui-layer-ico'+r.icon+'"></i>':"")+(1==r.type&&e?"":r.content||"")+'</div><span class="layui-layer-setwin">'+function(){var e=c?'<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>':"";return r.closeBtn&&(e+='<a class="layui-layer-ico '+l[7]+" "+l[7]+(r.title?r.closeBtn:4==r.type?"1":"2")+'" href="javascript:;"></a>'),e}()+"</span>"+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class="'+l[6]+t+'">'+r.btn[t]+"</a>";return'<div class="'+l[6]+" layui-layer-btn-"+(r.btnAlign||"")+'">'+e+"</div>"}():"")+(r.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],u,i('<div class="layui-layer-move"></div>')),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||"","auto"];t.content='<iframe scrolling="'+(t.content[1]||"auto")+'" allowtransparency="true" id="'+l[4]+a+'" name="'+l[4]+a+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+t.content[0]+'"></iframe>';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]+'<i class="layui-layer-TipsG"></i>',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;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(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?'<textarea class="layui-layer-input"'+a+"></textarea>":function(){return'<input type="'+(1==e.formType?"password":"text")+'" class="layui-layer-input">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],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("&#x6700;&#x591A;&#x8F93;&#x5165;"+(e.maxlength||500)+"&#x4E2A;&#x5B57;&#x6570;",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='<span class="'+n+'">'+t[0].title+"</span>";i<e;i++)a+="<span>"+t[i].title+"</span>";return a}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=t.length,i=1,a="";if(e>0)for(a='<li class="layui-layer-tabli '+n+'">'+(t[0].content||"no content")+"</li>";i<e;i++)a+='<li class="layui-layer-tabli">'+(t[i].content||"no  content")+"</li>";return a}()+"</ul>",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("&#x6CA1;&#x6709;&#x56FE;&#x7247;")}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]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+"px",a[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,isOutAnim:!1,skin:"layui-layer-photos"+c("photos"),content:'<div class="layui-layer-phimg"><img src="'+u[d].src+'" alt="'+(u[d].alt||"")+'" layer-pid="'+u[d].pid+'"><div class="layui-layer-imgsee">'+(u.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(a?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(u[d].alt||"")+"</a><em>"+s.imgIndex+"/"+u.length+"</em></span></div></div></div>",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("&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;",{time:3e4,btn:["&#x4E0B;&#x4E00;&#x5F20;","&#x4E0D;&#x770B;&#x4E86;"],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/management/guns-admin/src/main/webapp/static/layui/lay/modules/laypage.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/laypage.js
new file mode 100644
index 0000000..2e2ab0d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/laypage.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 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:"&#x4E0A;&#x4E00;&#x9875;",a.next="next"in a?a.next:"&#x4E0B;&#x4E00;&#x9875;";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 href="javascript:;" class="layui-laypage-prev'+(1==a.curr?" "+r:"")+'" data-page="'+(a.curr-1)+'">'+a.prev+"</a>":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push('<a href="javascript:;" class="layui-laypage-first" data-page="1"  title="&#x9996;&#x9875;">'+(a.first||1)+"</a>");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-r<t-1&&(r=u-t+1),a.first!==!1&&r>2&&e.push('<span class="layui-laypage-spr">&#x2026;</span>');r<=u;r++)r===a.curr?e.push('<span class="layui-laypage-curr"><em class="layui-laypage-em" '+(/^#/.test(a.theme)?'style="background-color:'+a.theme+';"':"")+"></em><em>"+r+"</em></span>"):e.push('<a href="javascript:;" data-page="'+r+'">'+r+"</a>");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1<a.pages&&e.push('<span class="layui-laypage-spr">&#x2026;</span>'),0!==t&&e.push('<a href="javascript:;" class="layui-laypage-last" title="&#x5C3E;&#x9875;"  data-page="'+a.pages+'">'+(a.last||a.pages)+"</a>")),e.join("")}(),next:function(){return a.next?'<a href="javascript:;" class="layui-laypage-next'+(a.curr==a.pages?" "+r:"")+'" data-page="'+(a.curr+1)+'">'+a.next+"</a>":""}(),count:'<span class="layui-laypage-count">共 '+a.count+" 条</span>",limit:function(){var e=['<span class="layui-laypage-limits"><select lay-ignore>'];return layui.each(a.limits,function(t,n){e.push('<option value="'+n+'"'+(n===a.limit?"selected":"")+">"+n+" 条/页</option>")}),e.join("")+"</select></span>"}(),refresh:['<a href="javascript:;" data-page="'+a.curr+'" class="layui-laypage-refresh">','<i class="layui-icon layui-icon-refresh"></i>',"</a>"].join(""),skip:function(){return['<span class="layui-laypage-skip">&#x5230;&#x7B2C;','<input type="text" min="1" value="'+a.curr+'" class="layui-input">','&#x9875;<button type="button" class="layui-laypage-btn">&#x786e;&#x5b9a;</button>',"</span>"].join("")}()};return['<div class="layui-box layui-laypage layui-laypage-'+(a.theme?/^#/.test(a.theme)?"molv":a.theme:"default")+'" id="layui-laypage-'+a.index+'">',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"</div>"].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;o<y;o++)"a"===r[o].nodeName.toLowerCase()&&s.on(r[o],"click",function(){var e=0|this.getAttribute("data-page");e<1||e>i.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/management/guns-admin/src/main/webapp/static/layui/lay/modules/laytpl.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/laytpl.js
new file mode 100644
index 0000000..11cc3c4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/laytpl.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&quot;")},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/management/guns-admin/src/main/webapp/static/layui/lay/modules/mobile.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/mobile.js
new file mode 100644
index 0000000..ebda601
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/mobile.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&quot;")},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?'<h3 style="'+(e?i.title[1]:"")+'">'+(e?i.title[0]:i.title)+"</h3>":""}(),d=function(){"string"==typeof i.btn&&(i.btn=[i.btn]);var e,t=(i.btn||[]).length;return 0!==t&&i.btn?(e='<span yes type="1">'+i.btn[0]+"</span>",2===t&&(e='<span no type="0">'+i.btn[1]+"</span>"+e),'<div class="layui-m-layerbtn">'+e+"</div>"):""}();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></i><i class="layui-m-layerload"></i><i></i><p>'+(i.content||"")+"</p>"),i.skin&&(i.anim="up"),"msg"===i.skin&&(i.shade=!1),s.innerHTML=(i.shade?"<div "+("string"==typeof i.shade?'style="'+i.shade+'"':"")+' class="layui-m-layershade"></div>':"")+'<div class="layui-m-layermain" '+(i.fixed?"":'style="position:static;"')+'><div class="layui-m-layersection"><div class="layui-m-layerchild '+(i.skin?"layui-m-layer-"+i.skin+" ":"")+(i.className?i.className:"")+" "+(i.anim?"layui-m-anim-"+i.anim:"")+'" '+(i.style?'style="'+i.style+'"':"")+">"+l+'<div class="layui-m-layercont">'+i.content+"</div>"+d+"</div></div></div>",!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;r<o;r++)l.touch(s[r],a);if(e.shade&&e.shadeClose){var d=t[n]("layui-m-layershade")[0];l.touch(d,function(){c.close(i.index,e.end)})}e.end&&(l.end[i.index]=e.end)};var c={v:"2.0 m",index:o,open:function(e){var t=new d(e||{});return t.index},close:function(e){var i=a("#"+r[0]+e)[0];i&&(i.innerHTML="",t.body.removeChild(i),clearTimeout(l.timer[e]),delete l.timer[e],"function"==typeof l.end[e]&&l.end[e](),delete l.end[e])},closeAll:function(){for(var e=t[n](r[0]),i=0,a=e.length;i<a;i++)c.close(0|e[0].getAttribute("index"))}};e("layer-mobile",c)});layui.define(function(t){var e=function(){function t(t){return null==t?String(t):J[W.call(t)]||"object"}function e(e){return"function"==t(e)}function n(t){return null!=t&&t==t.window}function r(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE}function i(e){return"object"==t(e)}function o(t){return i(t)&&!n(t)&&Object.getPrototypeOf(t)==Object.prototype}function a(t){var e=!!t&&"length"in t&&t.length,r=T.type(t);return"function"!=r&&!n(t)&&("array"==r||0===e||"number"==typeof e&&e>0&&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;n++)this[n]=t[n];this.length=r,this.selector=e||""}function m(t,e,n){for(j in e)n&&(o(e[j])||Q(e[j]))?(o(e[j])&&!o(t[j])&&(t[j]={}),Q(e[j])&&!Q(t[j])&&(t[j]=[]),m(t[j],e[j],n)):e[j]!==E&&(t[j]=e[j])}function v(t,e){return null==e?T(t):T(t).filter(e)}function g(t,n,r,i){return e(n)?n.call(t,r,i):n}function y(t,e,n){null==n?t.removeAttribute(e):t.setAttribute(e,n)}function x(t,e){var n=t.className||"",r=n&&n.baseVal!==E;return e===E?r?n.baseVal:n:void(r?n.baseVal=e:t.className=e)}function b(t){try{return t?"true"==t||"false"!=t&&("null"==t?null:+t+""==t?+t:/^[\[\{]/.test(t)?T.parseJSON(t):t):t}catch(e){return t}}function w(t,e){e(t);for(var n=0,r=t.childNodes.length;n<r;n++)w(t.childNodes[n],e)}var E,j,T,S,C,N,O=[],P=O.concat,A=O.filter,D=O.slice,L=window.document,$={},F={},k={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},M=/^\s*<(\w+|!)[^>]*>/,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></$2>")),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<t.length;r++)n=e(t[r],r),null!=n&&o.push(n);else for(i in t)n=e(t[i],i),null!=n&&o.push(n);return u(o)},T.each=function(t,e){var n,r;if(a(t)){for(n=0;n<t.length;n++)if(e.call(t[n],n,t[n])===!1)return t}else for(r in t)if(e.call(t[r],r,t[r])===!1)return t;return t},T.grep=function(t,e){return A.call(t,e)},window.JSON&&(T.parseJSON=JSON.parse),T.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(t,e){J["[object "+e+"]"]=e.toLowerCase()}),T.fn={constructor:Y.Z,length:0,forEach:O.forEach,reduce:O.reduce,push:O.push,sort:O.sort,splice:O.splice,indexOf:O.indexOf,concat:function(){var t,e,n=[];for(t=0;t<arguments.length;t++)e=arguments[t],n[t]=Y.isZ(e)?e.toArray():e;return P.apply(Y.isZ(this)?this.toArray():this,n)},map:function(t){return T(T.map(this,function(e,n){return t.call(e,n,e)}))},slice:function(){return T(D.apply(this,arguments))},ready:function(t){return U.test(L.readyState)&&L.body?t(T):L.addEventListener("DOMContentLoaded",function(){t(T)},!1),this},get:function(t){return t===E?D.call(this):this[t>=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\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/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("<div>").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(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/management/guns-admin/src/main/webapp/static/layui/lay/modules/rate.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/rate.js
new file mode 100644
index 0000000..7feef34
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/rate.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 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='<ul class="layui-rate" '+(i.readonly?"readonly":"")+">",u=1;u<=i.length;u++){var r='<li class="layui-inline"><i class="layui-icon '+(u>Math.floor(i.value)?o:s)+'" '+l+"></i></li>";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'<li><i class="layui-icon layui-icon-rate-half" '+l+"></i></li>":n+=r}n+="</ul>"+(i.text?'<span class="layui-inline">'+i.value+"星":"")+"</span>";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/management/guns-admin/src/main/webapp/static/layui/lay/modules/slider.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/slider.js
new file mode 100644
index 0000000..6f824a9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/slider.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 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.max<t.min&&(t.max=t.min+t.step),t.range){t.value="object"==typeof t.value?t.value:[t.min,t.value];var a=Math.min(t.value[0],t.value[1]),n=Math.max(t.value[0],t.value[1]);t.value[0]=a>t.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.value<t.min&&(t.value=t.min),t.value>t.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='<div class="layui-slider '+("vertical"===t.type?"layui-slider-vertical":"")+'">'+(t.tips?'<div class="layui-slider-tips"></div>':"")+'<div class="layui-slider-bar" style="background:'+p+"; "+("vertical"===t.type?"height":"width")+":"+m+";"+("vertical"===t.type?"bottom":"left")+":"+(r||0)+';"></div><div class="layui-slider-wrap" style="'+("vertical"===t.type?"bottom":"left")+":"+(r||m)+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+p+';"></div></div>'+(t.range?'<div class="layui-slider-wrap" style="'+("vertical"===t.type?"bottom":"left")+":"+v+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+p+';"></div></div>':"")+"</div>",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<g+1;x++){var T=100*x/g;T<100&&(b+='<div class="layui-slider-step" style="'+("vertical"===t.type?"bottom":"left")+":"+T+'%"></div>')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('<div class="layui-slider-input layui-input"><div class="layui-slider-input-txt"><input type="text" class="layui-input"></div><div class="layui-slider-input-btn"><i class="layui-icon layui-icon-up"></i><i class="layui-icon layui-icon-down"></i></div></div>');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(['<div class="layui-auxiliar-moving" id="LAY-slider-moving"></div'].join("")),M=function(e,t){var a=function(){t&&t(),w.remove()};i("#LAY-slider-moving")[0]||i("body").append(w),w.on("mousemove",e),w.on("mouseup",a).on("mouseleave",a)};if("set"===e)return x(t,a);s.find("."+u).each(function(e){var t=i(this);t.on("mousedown",function(i){i=i||window.event;var a=t.parent()[0].offsetLeft,n=i.clientX;"vertical"===l.type&&(a=f()-t.parent()[0].offsetTop-h.height(),n=i.clientY);var r=function(i){i=i||window.event;var r=a+("vertical"===l.type?n-i.clientY:i.clientX-n);r<0&&(r=0),r>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.step<l.min?l.min:Number(g)-l.step:Number(g)+l.step>l.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=e<l.min?l.min:e,e=e>l.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/management/guns-admin/src/main/webapp/static/layui/lay/modules/table.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/table.js
new file mode 100644
index 0000000..0882b71
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/table.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,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,y,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{config:t,reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)}}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u=function(e,a,l,n){var o=e.templet?function(){return"function"==typeof e.templet?e.templet(l):i(t(e.templet).html()||String(a)).render(l)}():a;return n?t("<div>"+o+"</div>").text():o},y="table",h=".layui-table",f="layui-hide",p="layui-none",v="layui-table-view",m=".layui-table-tool",g=".layui-table-box",b=".layui-table-init",x=".layui-table-header",k=".layui-table-body",C=".layui-table-main",w=".layui-table-fixed",T=".layui-table-fixed-l",A=".layui-table-fixed-r",L=".layui-table-total",N=".layui-table-page",S=".layui-table-sort",R="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<thead>","{{# layui.each(d.data.cols, function(i1, item1){ }}","<tr>","{{# 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"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'<th data-field="{{ item2.field||i2 }}" data-key="{{d.index}}-{{i1}}-{{i2}}" {{# if( item2.parentKey){ }}data-parentkey="{{ item2.parentKey }}"{{# } }} {{# if(item2.minWidth){ }}data-minwidth="{{item2.minWidth}}"{{# } }} '+t+' {{# if(item2.unresize || item2.colGroup){ }}data-unresize="true"{{# } }} class="{{# if(item2.hide){ }}layui-hide{{# } }}{{# if(isSort){ }} layui-unselect{{# } }}{{# if(!item2.field){ }} layui-table-col-special{{# } }}">','<div class="layui-table-cell laytable-cell-',"{{# if(item2.colGroup){ }}","group","{{# } else { }}","{{d.index}}-{{i1}}-{{i2}}",'{{# if(item2.type !== "normal"){ }}'," laytable-cell-{{ item2.type }}","{{# } }}","{{# } }}",'" {{#if(item2.align){}}align="{{item2.align}}"{{#}}}>','{{# if(item2.type === "checkbox"){ }}','<input type="checkbox" name="layTableCheckbox" lay-skin="primary" lay-filter="layTableAllChoose" {{# if(item2[d.data.checkName]){ }}checked{{# }; }}>',"{{# } else { }}",'<span>{{item2.title||""}}</span>',"{{# if(isSort){ }}",'<span class="layui-table-sort layui-inline"><i class="layui-edge layui-table-sort-asc" title="升序"></i><i class="layui-edge layui-table-sort-desc" title="降序"></i></span>',"{{# } }}","{{# } }}","</div>","</th>",e.fixed?"{{# }; }}":"","{{# }); }}","</tr>","{{# }); }}","</thead>","</table>"].join("")},E=['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<tbody></tbody>","</table>"].join(""),z=['<div class="layui-form layui-border-box {{d.VIEW_CLASS}}" lay-filter="LAY-table-{{d.index}}" lay-id="{{ d.data.id }}" style="{{# if(d.data.width){ }}width:{{d.data.width}}px;{{# } }} {{# if(d.data.height){ }}height:{{d.data.height}}px;{{# } }}">',"{{# if(d.data.toolbar){ }}",'<div class="layui-table-tool">','<div class="layui-table-tool-temp"></div>','<div class="layui-table-tool-self"></div>',"</div>","{{# } }}",'<div class="layui-table-box">',"{{# if(d.data.loading){ }}",'<div class="layui-table-init" style="background-color: #fff;">','<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>',"</div>","{{# } }}","{{# var left, right; }}",'<div class="layui-table-header">',_(),"</div>",'<div class="layui-table-body layui-table-main">',E,"</div>","{{# if(left){ }}",'<div class="layui-table-fixed layui-table-fixed-l">','<div class="layui-table-header">',_({fixed:!0}),"</div>",'<div class="layui-table-body">',E,"</div>","</div>","{{# }; }}","{{# if(right){ }}",'<div class="layui-table-fixed layui-table-fixed-r">','<div class="layui-table-header">',_({fixed:"right"}),'<div class="layui-table-mend"></div>',"</div>",'<div class="layui-table-body">',E,"</div>","</div>","{{# }; }}","</div>","{{# if(d.data.totalRow){ }}",'<div class="layui-table-total">','<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>','<tbody><tr><td><div class="layui-table-cell" style="visibility: hidden;">Total</div></td></tr></tbody>',"</table>","</div>","{{# } }}","{{# if(d.data.page){ }}",'<div class="layui-table-page">','<div id="layui-table-page{{d.index}}"></div>',"</div>","{{# } }}","<style>","{{# layui.each(d.data.cols, function(i1, item1){","layui.each(item1, function(i2, item2){ }}",".laytable-cell-{{d.index}}-{{i1}}-{{i2}}{ ","{{# if(item2.width){ }}","width: {{item2.width}}px;","{{# } }}"," }","{{# });","}); }}","</style>","</div>"].join(""),H=t(window),j=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.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")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",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;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+v),o=e.elem=t(i(z).render({VIEW_CLASS:v,data:a,index:e.index}));if(a.index=e.index,e.key=a.id||a.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(m),e.layBox=o.find(g),e.layHeader=o.find(x),e.layMain=o.find(C),e.layBody=o.find(k),e.layFixed=o.find(w),e.layFixLeft=o.find(T),e.layFixRight=o.find(A),e.layTotal=o.find(L),e.layPage=o.find(N),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(x).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio: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])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['<div class="layui-inline" lay-event="add"><i class="layui-icon layui-icon-add-1"></i></div>','<div class="layui-inline" lay-event="update"><i class="layui-icon layui-icon-edit"></i></div>','<div class="layui-inline" lay-event="delete"><i class="layui-icon layui-icon-delete"></i></div>'].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i="string"==typeof t?r[t]:t;i&&d.push('<div class="layui-inline" title="'+i.title+'" lay-event="'+i.layEvent+'"><i class="layui-icon '+i.icon+'"></i></div>')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](f),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&l<s&&(a--,c=s):(c=d.width||0,/\d+%$/.test(c)?(c=Math.floor(parseFloat(c)/100*o),c<s&&(c=s)):c||(d.width=c=0,a++)),d.hide&&(c=0),n+=c)):void r.splice(i,1)})}),o>n&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;e=e||{},delete i.haveInit,e.data&&e.data.constructor===Array&&delete i.config.data,i.config=t.extend(!0,{},i.config,e),i.render()},F.prototype.errorView=function(e){var i=this,a=i.layMain.find("."+p),l=t('<div class="'+p+'">'+(e||"Error")+"</div>");a[0]&&(i.layNone.remove(),a.remove()),i.layFixed.addClass(f),i.layMain.find("tbody").html(""),i.layMain.append(i.layNone=l),d.cache[i.key]=[]},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),i.loading(),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.errorView(t[n.msgName]||'返回的数据不符合规范,正确的成功状态码应为:"'+n.statusName+'": '+n.statusCode)):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.errorView("数据接口请求异常:"+t),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,"object"==typeof a.totalRow&&(c[n.totalRowName]=t.extend({},a.totalRow)),i.renderData(c,e,c[n.countName]),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,y=e[s.response.dataName]||[],h=e[s.response.totalRowName],v=[],m=[],g=[],b=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(y,function(a,l){var o=[],y=[],h=[],p=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,v=s.index+"-"+r.key,m=l[c];if(void 0!==m&&null!==m||(m=""),!r.colGroup){var g=['<td data-field="'+c+'" data-key="'+v+'" '+function(){var e=[];return r.edit&&e.push('data-edit="'+r.edit+'"'),r.align&&e.push('align="'+r.align+'"'),r.templet&&e.push('data-content="'+m+'"'),r.toolbar&&e.push('data-off="true"'),r.event&&e.push('lay-event="'+r.event+'"'),r.style&&e.push('style="'+r.style+'"'),r.minWidth&&e.push('data-minwidth="'+r.minWidth+'"'),e.join(" ")}()+' class="'+function(){var e=[];return r.hide&&e.push(f),r.field||e.push("layui-table-col-special"),e.join(" ")}()+'">','<div class="layui-table-cell laytable-cell-'+function(){return"normal"===r.type?v:v+" laytable-cell-"+r.type}()+'">'+function(){var n=t.extend(!0,{LAY_INDEX:p},l),o=d.config.checkName;switch(r.type){case"checkbox":return'<input type="checkbox" name="layTableCheckbox" lay-skin="primary" '+function(){return r[o]?(l[o]=r[o],r[o]?"checked":""):n[o]?"checked":""}()+">";case"radio":return n[o]&&(e=a),'<input type="radio" name="layTableRadio_'+s.index+'" '+(n[o]?"checked":"")+' lay-type="layTableRadio">';case"numbers":return p}return r.toolbar?i(t(r.toolbar).html()||"").render(n):u(r,m,n)}(),"</div></td>"].join("");o.push(g),r.fixed&&"right"!==r.fixed&&y.push(g),"right"===r.fixed&&h.push(g)}}),v.push('<tr data-index="'+a+'">'+o.join("")+"</tr>"),m.push('<tr data-index="'+a+'">'+y.join("")+"</tr>"),g.push('<tr data-index="'+a+'">'+h.join("")+"</tr>"))}),c.layBody.scrollTop(0),c.layMain.find("."+p).remove(),c.layMain.find("tbody").html(v.join("")),c.layFixLeft.find("tbody").html(m.join("")),c.layFixRight.find("tbody").html(g.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return d.cache[c.key]=y,c.layPage[0==o||0===y.length&&1==n?"addClass":"removeClass"](f),r?b():0===y.length?(c.renderForm(),c.errorView(s.text.none)):(c.layFixed.removeClass(f),b(),c.renderTotal(y,h),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:'<i class="layui-icon">&#xe603;</i>',next:'<i class="layui-icon">&#xe602;</i>',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e,t){var i=this,a=i.config,l={};if(a.totalRow){layui.each(e,function(e,t){0!==t.length&&i.eachCols(function(e,i){var a=i.field||e,n=t[a];i.totalRow&&(l[a]=(l[a]||0)+(parseFloat(n)||0))})}),i.dataTotal={};var n=[];i.eachCols(function(e,o){var r=o.field||e,d=function(){var e=o.totalRowText||"",i=parseFloat(l[r]).toFixed(2),a={};return a[r]=i,i=u(o,i,a),t?t[o.field]||e:o.totalRow?i||e:e}(),c=['<td data-field="'+r+'" data-key="'+a.index+"-"+o.key+'" '+function(){var e=[];return o.align&&e.push('align="'+o.align+'"'),o.style&&e.push('style="'+o.style+'"'),o.minWidth&&e.push('data-minwidth="'+o.minWidth+'"'),e.join(" ")}()+' class="'+function(){var e=[];return o.hide&&e.push(f),o.field||e.push("layui-table-col-special"),e.join(" ")}()+'">','<div class="layui-table-cell laytable-cell-'+function(){var e=a.index+"-"+o.key;return"normal"===o.type?e:e+" laytable-cell-"+o.type}()+'">'+d,"</div></td>"].join("");o.field&&(i.dataTotal[r]=d),n.push(c)}),i.layTotal.find("tbody").html("<tr>"+n.join("")+"</tr>")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},u=c.config,h=u.elem.attr("lay-filter"),f=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"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.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},u.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[u.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,y,"sort("+h+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(b).remove()):(i.layInit=t(['<div class="layui-table-init">','<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>',"</div>"].join("")),i.layBox.append(i.layInit)))},F.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)},F.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)))},F.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(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e-=t.layPage.outerHeight()||41),t.layMain.css("height",e-2))},F.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},F.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]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('<th class="layui-table-patch"><div class="layui-table-cell"></div></th>');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(k).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](f),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,i=this,a=i.config,o=t("body"),c={},s=i.layHeader.find("th"),h=".layui-table-cell",p=a.elem.attr("lay-filter");i.layTool.on("click","*[lay-event]",function(e){var o=t(this),c=o.attr("lay-event"),s=function(e){var l=t(e.list),n=t('<ul class="layui-table-tool-panel"></ul>');n.html(l),a.height&&n.css("max-height",a.height-(i.layTool.outerHeight()||50)),o.find(".layui-table-tool-panel")[0]||o.append(n),i.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),j.trigger("table.tool.panel.remove"),l.close(i.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return i.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('<li><input type="checkbox" name="'+i.field+'" data-key="'+i.key+'" data-parentkey="'+(i.parentKey||"")+'" lay-skin="primary" '+(i.hide?"":"checked")+' title="'+(i.title||i.field)+'" lay-filter="LAY_TABLE_TOOL_COLS"></li>')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var l=t(e.elem),n=this.checked,o=l.data("key"),r=l.data("parentkey");layui.each(a.cols,function(e,t){layui.each(t,function(t,l){if(e+"-"+t===o){var d=l.hide;l.hide=!n,i.elem.find('*[data-key="'+a.index+"-"+o+'"]')[n?"removeClass":"addClass"](f),d!=l.hide&&i.setParentCol(!n,r),i.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['<li data-type="csv">导出到 Csv 文件</li>','<li data-type="xls">导出到 Excel 文件</li>'].join("")}(),done:function(e,l){l.on("click",function(){var e=t(this).data("type");d.exportFile.call(i,a.id,null,e)})}});break;case"LAYTABLE_PRINT":var u=window.open("打印窗口","_blank"),h=["<style>","body{font-size: 12px; color: #666;}","table{width: 100%; border-collapse: collapse; border-spacing: 0;}","th,td{line-height: 20px; padding: 9px 15px; border: 1px solid #ccc; text-align: left; font-size: 12px; color: #666;}","a{color: #666; text-decoration:none;}","*.layui-hide{display: none}","</style>"].join(""),v=t(i.layHeader.html());v.append(i.layMain.find("table").html()),v.append(i.layTotal.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),u.document.write(h+v.prop("outerHTML")),u.document.close(),u.print(),u.close()}layui.event.call(this,y,"toolbar("+p+")",t.extend({event:c,config:a},{}))}),s.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;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 l=t(this);if(c.allowResize){var n=l.data("key");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],i.getCssRule(n,function(e){var t=e.style.width||l.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=l.data("minwidth")||a.cellMinWidth})}}),j.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var a=c.ruleWidth+t.clientX-c.offset[0];a<c.minWidth&&(a=c.minWidth),c.rule.style.width=a+"px",l.close(i.tipsIndex)}e=1}}).on("mouseup",function(t){c.resizeStart&&(c={},o.css("cursor",""),i.scrollPatch()),2===e&&(e=null)}),s.on("click",function(a){var l,n=t(this),o=n.find(S),r=o.attr("lay-sort");return o[0]&&1!==e?(l="asc"===r?"desc":"desc"===r?null:"asc",void i.sort(n,l,null,!0)):e=2}).find(S+" .layui-edge ").on("click",function(e){var a=t(this),l=a.index(),n=a.parents("th").eq(0).data("field");layui.stope(e),0===l?i.sort(n,"asc",null,!0):i.sort(n,"desc",null,!0)});var v=function(e){var a=t(this),l=a.parents("tr").eq(0).data("index"),n=i.layBody.find('tr[data-index="'+l+'"]'),o=d.cache[i.key]||[];return o=o[l]||{},t.extend({tr:n,data:d.clearCacheKey(o),del:function(){d.cache[i.key][l]=[],n.remove(),i.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,t){if(e in o){var a,l=n.children('td[data-field="'+e+'"]');o[e]=t,i.eachCols(function(t,i){i.field==e&&i.templet&&(a=i.templet)}),l.children(h).html(u({templet:a},t,o)),l.data("content",t)}})}},e)};i.elem.on("click",'input[name="layTableCheckbox"]+',function(){var e=t(this).prev(),a=i.layBody.find('input[name="layTableCheckbox"]'),l=e.parents("tr").eq(0).data("index"),n=e[0].checked,o="layTableAllChoose"===e.attr("lay-filter");o?(a.each(function(e,t){t.checked=n,i.setCheckData(e,n)}),i.syncCheckAll(),i.renderForm("checkbox")):(i.setCheckData(l,n),i.syncCheckAll()),layui.event.call(e[0],y,"checkbox("+p+")",v.call(e[0],{checked:n,type:o?"all":"one"}))}),i.elem.on("click",'input[lay-type="layTableRadio"]+',function(){var e=t(this).prev(),a=e[0].checked,l=d.cache[i.key],n=e.parents("tr").eq(0).data("index");layui.each(l,function(e,t){n===e?t.LAY_CHECKED=!0:delete t.LAY_CHECKED}),i.setThisRowChecked(n),layui.event.call(this,y,"radio("+p+")",v.call(this,{checked:a}))}),i.layBody.on("mouseenter","tr",function(){var e=t(this),a=e.index();e.data("off")||i.layBody.find("tr:eq("+a+")").addClass(W)}).on("mouseleave","tr",function(){var e=t(this),a=e.index();e.data("off")||i.layBody.find("tr:eq("+a+")").removeClass(W)}).on("click","tr",function(){m.call(this,"row")}).on("dblclick","tr",function(){m.call(this,"rowDouble")});var m=function(e){var i=t(this);i.data("off")||layui.event.call(this,y,e+"("+p+")",v.call(i.children("td")[0]))};i.layBody.on("change","."+R,function(){var e=t(this),a=this.value,l=e.parent().data("field"),n=e.parents("tr").eq(0).data("index"),o=d.cache[i.key][n];o[l]=a,layui.event.call(this,y,"edit("+p+")",v.call(this,{value:a,field:l}))}).on("blur","."+R,function(){var e,a=t(this),l=this,n=a.parent().data("field"),o=a.parents("tr").eq(0).data("index"),r=d.cache[i.key][o];i.eachCols(function(t,i){i.field==n&&i.templet&&(e=i.templet)}),a.siblings(h).html(function(t){return u({templet:e},t,r)}(l.value)),a.parent().data("content",l.value),a.remove()}),i.layBody.on("click","td",function(e){var i=t(this),a=(i.data("field"),i.data("edit")),l=i.children(h);if(!i.data("off")&&a){var n=t('<input class="layui-input '+R+'">');return n[0].value=i.data("content")||l.text(),i.find("."+R)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(h);if(!i.data("off"))if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('<div class="'+g+'"><i class="layui-icon layui-icon-down"></i></div>')}};i.layBody.on("click","."+g,function(e){var n=t(this),o=n.parent(),d=o.children(h);i.tipsIndex=l.tips(['<div class="layui-table-tips-main" style="margin-top: -'+(d.height()+16)+"px;"+function(){return"sm"===a.size?"padding: 4px 15px; font-size: 12px;":"lg"===a.size?"padding: 14px 15px;":""}()+'">',d.html(),"</div>",'<i class="layui-icon layui-table-tips-c layui-icon-close"></i>'].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:i.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),i.layBody.on("click","*[lay-event]",function(){var e=t(this),a=e.parents("tr").eq(0).data("index");layui.event.call(this,y,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),i.setThisRowChecked(a)}),i.layMain.on("scroll",function(){var e=t(this),a=e.scrollLeft(),n=e.scrollTop();i.layHeader.scrollLeft(a),i.layTotal.scrollLeft(a),i.layFixed.find(k).scrollTop(n),l.close(i.tipsIndex)}),H.on("resize",function(){i.resize()})},function(){j.on("click",function(){j.trigger("table.remove.tool.panel")}),j.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()})}(),d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[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},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},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}},d.exportFile=function(e,t,i){var a=this;t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var l=c.config[e]||{},n={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],s=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(s.href="data:"+n+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],l=[],n=[];return layui.each(t,function(t,a){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(a),function(e,t){n.push('"'+(t||"")+'"')})):d.eachCols(e,function(e,l){if(l.field&&"normal"==l.type&&!l.hide){var o=a[l.field];void 0!==o&&null!==o||(o=""),0==t&&i.push(l.title||""),n.push('"'+u(l,o,a,"text")+'"')}}),l.push(n.join(","))}),layui.each(a.dataTotal,function(e,t){n.push(t)}),i.join(",")+"\r\n"+l.join("\r\n")+"\r\n"+n.join(",")}()),s.download=(l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(s),s.click(),void document.body.removeChild(s))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,t){var i=s(e);if(i){var a=c.that[e];return a.reload(t),c.call(a)}},d.render=function(e){var t=new F(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(y,d)});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/transfer.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/transfer.js
new file mode 100644
index 0000000..2483921
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/transfer.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;layui.define(["laytpl","form"],function(e){"use strict";var a=layui.$,t=layui.laytpl,n=layui.form,i="transfer",l={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=a.extend({},t.config,e),t},on:function(e,a){return layui.onevent.call(this,i,e,a)}},r=function(){var e=this,a=e.config,t=a.id||e.index;return r.that[t]=e,r.config[t]=a,{config:a,reload:function(a){e.reload.call(e,a)},getData:function(){return e.getData.call(e)}}},c="layui-hide",o="layui-btn-disabled",d="layui-none",s="layui-transfer-box",u="layui-transfer-header",h="layui-transfer-search",f="layui-transfer-active",y="layui-transfer-data",p=function(e){return e=e||{},['<div class="layui-transfer-box" data-index="'+e.index+'">','<div class="layui-transfer-header">','<input type="checkbox" name="'+e.checkAllName+'" lay-filter="layTransferCheckbox" lay-type="all" lay-skin="primary" title="{{ d.data.title['+e.index+"] || 'list"+(e.index+1)+"' }}\">","</div>","{{# if(d.data.showSearch){ }}",'<div class="layui-transfer-search">','<i class="layui-icon layui-icon-search"></i>','<input type="input" class="layui-input" placeholder="关键词搜索">',"</div>","{{# } }}",'<ul class="layui-transfer-data"></ul>',"</div>"].join("")},v=['<div class="layui-transfer layui-form layui-border-box" lay-filter="LAY-transfer-{{ d.index }}">',p({index:0,checkAllName:"layTransferLeftCheckAll"}),'<div class="layui-transfer-active">','<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="0">','<i class="layui-icon layui-icon-next"></i>',"</button>",'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="1">','<i class="layui-icon layui-icon-prev"></i>',"</button>","</div>",p({index:1,checkAllName:"layTransferRightCheckAll"}),"</div>"].join(""),x=function(e){var t=this;t.index=++l.index,t.config=a.extend({},t.config,l.config,e),t.render()};x.prototype.config={title:["列表一","列表二"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"无数据",searchNone:"无匹配数据"}},x.prototype.reload=function(e){var t=this;layui.each(e,function(e,a){a.constructor===Array&&delete t.config[e]}),t.config=a.extend(!0,{},t.config,e),t.render()},x.prototype.render=function(){var e=this,n=e.config,i=e.elem=a(t(v).render({data:n,index:e.index})),l=n.elem=a(n.elem);l[0]&&(n.data=n.data||[],n.value=n.value||[],e.key=n.id||e.index,l.html(e.elem),e.layBox=e.elem.find("."+s),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+h),e.layData=i.find("."+y),e.layBtn=i.find("."+f+" .layui-btn"),e.layBox.css({width:n.width,height:n.height}),e.layData.css({height:function(){return n.height-e.layHeader.outerHeight()-e.laySearch.outerHeight()-2}()}),e.renderData(),e.events())},x.prototype.renderData=function(){var e=this,a=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,n=["<li>",'<input type="checkbox" name="'+a[t].checkName+'" lay-skin="primary" lay-filter="layTransferCheckbox" title="'+e.title+'"'+(e.disabled?" disabled":"")+(e.checked?" checked":"")+' value="'+e.value+'">',"</li>"].join("");a[t].views.push(n),delete e.selected}),e.layData.eq(0).html(a[0].views.join("")),e.layData.eq(1).html(a[1].views.join("")),e.renderCheckBtn()},x.prototype.renderForm=function(e){n.render(e,"LAY-transfer-"+this.index)},x.prototype.renderCheckBtn=function(e){var t=this,n=t.config;e=e||{},t.layBox.each(function(i){var l=a(this),r=l.find("."+y),d=l.find("."+u).find('input[type="checkbox"]'),s=r.find('input[type="checkbox"]'),h=0,f=!1;if(s.each(function(){var e=a(this).data("hide");(this.checked||this.disabled||e)&&h++,this.checked&&!e&&(f=!0)}),d.prop("checked",f&&h===s.length),t.layBtn.eq(i)[f?"removeClass":"addClass"](o),!e.stopNone){var p=r.children("li:not(."+c+")").length;t.noneView(r,p?"":n.text.none)}}),t.renderForm("checkbox")},x.prototype.noneView=function(e,t){var n=a('<p class="layui-none">'+(t||"")+"</p>");e.find("."+d)[0]&&e.find("."+d).remove(),t.replace(/\s/g,"")&&e.append(n)},x.prototype.setValue=function(){var e=this,t=e.config,n=[];return e.layBox.eq(1).find("."+y+' input[type="checkbox"]').each(function(){var e=a(this).data("hide");e||n.push(this.value)}),t.value=n,e},x.prototype.parseData=function(e){var t=this,n=t.config,i=[];return layui.each(n.data,function(t,l){l=("function"==typeof n.parseData?n.parseData(l):l)||l,i.push(l=a.extend({},l)),layui.each(n.value,function(e,a){a==l.value&&(l.selected=!0)}),e&&e(l)}),n.data=i,t},x.prototype.getData=function(e){var a=this,t=a.config,n=[];return a.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&n.push(t)})}),n},x.prototype.events=function(){var e=this,t=e.config;e.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var t=a(this).prev(),n=t[0].checked,i=t.parents("."+s).eq(0).find("."+y);t[0].disabled||("all"===t.attr("lay-type")&&i.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=n)}),e.renderCheckBtn({stopNone:!0}))}),e.layBtn.on("click",function(){var n=a(this),i=n.data("index"),l=e.layBox.eq(i),r=[];if(!n.hasClass(o)){e.layBox.eq(i).each(function(t){var n=a(this),i=n.find("."+y);i.children("li").each(function(){var t=a(this),n=t.find('input[type="checkbox"]'),i=n.data("hide");n[0].checked&&!i&&(n[0].checked=!1,l.siblings("."+s).find("."+y).append(t.clone()),t.remove(),r.push(n[0].value)),e.setValue()})}),e.renderCheckBtn();var c=l.siblings("."+s).find("."+h+" input");""===c.val()||c.trigger("keyup"),t.onchange&&t.onchange(e.getData(r),i)}}),e.laySearch.find("input").on("keyup",function(){var n=this.value,i=a(this).parents("."+h).eq(0).siblings("."+y),l=i.children("li");l.each(function(){var e=a(this),t=e.find('input[type="checkbox"]'),i=t[0].title.indexOf(n)!==-1;e[i?"removeClass":"addClass"](c),t.data("hide",!i)}),e.renderCheckBtn();var r=l.length===i.children("li."+c).length;e.noneView(i,r?t.text.searchNone:"")})},r.that={},r.config={},l.reload=function(e,a){var t=r.that[e];return t.reload(a),r.call(t)},l.getData=function(e){var a=r.that[e];return a.getData()},l.render=function(e){var a=new x(e);return r.call(a)},e(i,l)});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/tree.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/tree.js
new file mode 100644
index 0000000..c9c93a2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/tree.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;layui.define("form",function(e){"use strict";var i=layui.$,a=layui.form,n=layui.layer,t="tree",r={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var a=this;return a.config=i.extend({},a.config,e),a},on:function(e,i){return layui.onevent.call(this,t,e,i)}},l=function(){var e=this,i=e.config,a=i.id||e.index;return l.that[a]=e,l.config[a]=i,{config:i,reload:function(i){e.reload.call(e,i)},getChecked:function(){return e.getChecked.call(e)},setChecked:function(i){return e.setChecked.call(e,i)}}},c="layui-hide",d="layui-disabled",s="layui-tree-set",o="layui-tree-iconClick",h="layui-icon-addition",u="layui-icon-subtraction",p="layui-tree-entry",f="layui-tree-main",y="layui-tree-txt",v="layui-tree-pack",C="layui-tree-spread",k="layui-tree-setLineShort",m="layui-tree-showLine",x="layui-tree-lineExtend",b=function(e){var a=this;a.index=++r.index,a.config=i.extend({},a.config,r.config,e),a.render()};b.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"未命名",none:"无数据"}},b.prototype.reload=function(e){var a=this;layui.each(e,function(e,i){i.constructor===Array&&delete a.config[e]}),a.config=i.extend(!0,{},a.config,e),a.render()},b.prototype.render=function(){var e=this,a=e.config;e.checkids=[];var n=i('<div class="layui-tree'+(a.showCheckbox?" layui-form":"")+(a.showLine?" layui-tree-line":"")+'" lay-filter="LAY-tree-'+e.index+'"></div>');e.tree(n);var t=a.elem=i(a.elem);if(t[0]){if(e.key=a.id||e.index,e.elem=n,e.elemNone=i('<div class="layui-tree-emptyText">'+a.text.none+"</div>"),t.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);a.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=i(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(k),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(k)}),e.events()}},b.prototype.renderForm=function(e){a.render(e,"LAY-tree-"+this.index)},b.prototype.tree=function(e,a){var n=this,t=n.config,r=a||t.data;layui.each(r,function(a,r){var l=r.children&&r.children.length>0,o=i('<div class="layui-tree-pack" '+(r.spread?'style="display: block;"':"")+'"></div>'),h=i(['<div data-id="'+r.id+'" class="layui-tree-set'+(r.spread?" layui-tree-spread":"")+(r.checked?" layui-tree-checkedFirst":"")+'">','<div class="layui-tree-entry">','<div class="layui-tree-main">',function(){return t.showLine?l?'<span class="layui-tree-iconClick layui-tree-icon"><i class="layui-icon '+(r.spread?"layui-icon-subtraction":"layui-icon-addition")+'"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-icon layui-icon-file"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-tree-iconArrow '+(l?"":c)+'"></i></span>'}(),function(){return t.showCheckbox?'<input type="checkbox" name="'+(r.field||"layuiTreeCheck_"+r.id)+'" same="layuiTreeCheck" lay-skin="primary" '+(r.disabled?"disabled":"")+' value="'+r.id+'">':""}(),function(){return t.isJump&&r.href?'<a href="'+r.href+'" target="_blank" class="'+y+'">'+(r.title||r.label||t.text.defaultNodeName)+"</a>":'<span class="'+y+(r.disabled?" "+d:"")+'">'+(r.title||r.label||t.text.defaultNodeName)+"</span>"}(),"</div>",function(){if(!t.edit)return"";var e={add:'<i class="layui-icon layui-icon-add-1"  data-type="add"></i>',update:'<i class="layui-icon layui-icon-edit" data-type="update"></i>',del:'<i class="layui-icon layui-icon-delete" data-type="del"></i>'},i=['<div class="layui-btn-group layui-tree-btnGroup">'];return t.edit===!0&&(t.edit=["update","del"]),"object"==typeof t.edit?(layui.each(t.edit,function(a,n){i.push(e[n]||"")}),i.join("")+"</div>"):void 0}(),"</div></div>"].join(""));l&&(h.append(o),n.tree(o,r.children)),e.append(h),h.prev("."+s)[0]&&h.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),l||h.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),n.spread(h,r),t.showCheckbox&&(r.checked&&n.checkids.push(r.id),n.checkClick(h,r)),t.edit&&n.operate(h,r)})},b.prototype.spread=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f),c=r.find("."+o),k=r.find("."+y),m=t.onlyIconControl?c:l,x="";m.on("click",function(i){var a=e.children("."+v),n=m.children(".layui-icon")[0]?m.children(".layui-icon"):m.find(".layui-tree-icon").children(".layui-icon");if(a[0]){if(e.hasClass(C))e.removeClass(C),a.slideUp(200),n.removeClass(u).addClass(h);else if(e.addClass(C),a.slideDown(200),n.addClass(u).removeClass(h),t.accordion){var r=e.siblings("."+s);r.removeClass(C),r.children("."+v).slideUp(200),r.find(".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)}}else x="normal"}),k.on("click",function(){var n=i(this);n.hasClass(d)||(x=e.hasClass(C)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:e,state:x,data:a}))})},b.prototype.setCheckbox=function(e,i,a){var n=this,t=(n.config,a.prop("checked"));if(!a.prop("disabled")){if("object"==typeof i.children||e.find("."+v)[0]){var r=e.find("."+v).find('input[same="layuiTreeCheck"]');r.each(function(){this.disabled||(this.checked=t)})}var l=function(e){if(e.parents("."+s)[0]){var i,a=e.parent("."+v),n=a.parent(),r=a.prev().find('input[same="layuiTreeCheck"]');t?r.prop("checked",t):(a.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||r.prop("checked",!1)),l(n)}};l(e),n.renderForm("checkbox")}},b.prototype.checkClick=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f);l.on("click",'input[same="layuiTreeCheck"]+',function(r){layui.stope(r);var l=i(this).prev(),c=l.prop("checked");l.prop("disabled")||(n.setCheckbox(e,a,l),t.oncheck&&t.oncheck({elem:e,checked:c,data:a}))})},b.prototype.operate=function(e,a){var t=this,r=t.config,l=e.children("."+p),d=l.children("."+f);l.children(".layui-tree-btnGroup").on("click",".layui-icon",function(l){layui.stope(l);var f=i(this).data("type"),b=e.children("."+v),g={data:a,type:f,elem:e};if("add"==f){b[0]||(r.showLine?(d.find("."+o).addClass("layui-tree-icon"),d.find("."+o).children(".layui-icon").addClass(h).removeClass("layui-icon-file")):d.find(".layui-tree-iconArrow").removeClass(c),e.append('<div class="layui-tree-pack"></div>'));var w=r.operate&&r.operate(g),N={};if(N.title=r.text.defaultNodeName,N.id=w,t.tree(e.children("."+v),[N]),r.showLine)if(b[0])b.hasClass(x)||b.addClass(x),e.find("."+v).each(function(){i(this).children("."+s).last().addClass(k)}),b.children("."+s).last().prev().hasClass(k)?b.children("."+s).last().prev().removeClass(k):b.children("."+s).last().removeClass(k),!e.parent("."+v)[0]&&e.next()[0]&&b.children("."+s).last().removeClass(k);else{var T=e.siblings("."+s),L=1,A=e.parent("."+v);layui.each(T,function(e,a){i(a).children("."+v)[0]||(L=0)}),1==L?(T.children("."+v).addClass(m),T.children("."+v).children("."+s).removeClass(k),e.children("."+v).addClass(m),A.removeClass(x),A.children("."+s).last().children("."+v).children("."+s).last().addClass(k)):e.children("."+v).children("."+s).addClass(k)}if(!r.showCheckbox)return;if(d.find('input[same="layuiTreeCheck"]')[0].checked){var I=e.children("."+v).children("."+s).last();I.find('input[same="layuiTreeCheck"]')[0].checked=!0}t.renderForm("checkbox")}else if("update"==f){var F=d.children("."+y).html();d.children("."+y).html(""),d.append('<input type="text" class="layui-tree-editInput">'),d.children(".layui-tree-editInput").val(F).focus();var j=function(e){var i=e.val().trim();i=i?i:r.text.defaultNodeName,e.remove(),d.children("."+y).html(i),g.data.title=i,r.operate&&r.operate(g)};d.children(".layui-tree-editInput").blur(function(){j(i(this))}),d.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),j(i(this)))})}else n.confirm('确认删除该节点 "<span style="color: #999;">'+(a.title||"")+'</span>" 吗?',function(a){if(r.operate&&r.operate(g),g.status="remove",n.close(a),!e.prev("."+s)[0]&&!e.next("."+s)[0]&&!e.parent("."+v)[0])return e.remove(),void t.elem.append(t.elemNone);if(e.siblings("."+s).children("."+p)[0]){if(r.showCheckbox){var l=function(e){if(e.parents("."+s)[0]){var a=e.siblings("."+s).children("."+p),n=e.parent("."+v).prev(),r=n.find('input[same="layuiTreeCheck"]')[0],c=1,d=0;0==r.checked&&(a.each(function(e,a){var n=i(a).find('input[same="layuiTreeCheck"]')[0];0!=n.checked||n.disabled||(c=0),n.disabled||(d=1)}),1==c&&1==d&&(r.checked=!0,t.renderForm("checkbox"),l(n.parent("."+s))))}};l(e)}if(r.showLine){var d=e.siblings("."+s),h=1,f=e.parent("."+v);layui.each(d,function(e,a){i(a).children("."+v)[0]||(h=0)}),1==h?(b[0]||(f.removeClass(x),d.children("."+v).addClass(m),d.children("."+v).children("."+s).removeClass(k)),e.next()[0]?f.children("."+s).last().children("."+v).children("."+s).last().addClass(k):e.prev().children("."+v).children("."+s).last().addClass(k),e.next()[0]||e.parents("."+s)[1]||e.parents("."+s).eq(0).next()[0]||e.prev("."+s).addClass(k)):!e.next()[0]&&e.hasClass(k)&&e.prev().addClass(k)}}else{var y=e.parent("."+v).prev();if(r.showLine){y.find("."+o).removeClass("layui-tree-icon"),y.find("."+o).children(".layui-icon").removeClass(u).addClass("layui-icon-file");var w=y.parents("."+v).eq(0);w.addClass(x),w.children("."+s).each(function(){i(this).children("."+v).children("."+s).last().addClass(k)})}else y.find(".layui-tree-iconArrow").addClass(c);e.parents("."+s).eq(0).removeClass(C),e.parent("."+v).remove()}e.remove()})})},b.prototype.events=function(){var e=this,a=e.config;e.elem.find(".layui-tree-checkedFirst");e.setChecked(e.checkids),e.elem.find(".layui-tree-search").on("keyup",function(){var n=i(this),t=n.val(),r=n.nextAll(),l=[];r.find("."+y).each(function(){var e=i(this).parents("."+p);if(i(this).html().indexOf(t)!=-1){l.push(i(this).parent());var a=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+v)[0]&&a(e.parent("."+v).parent("."+s))};a(e.parent("."+s))}}),r.find("."+p).each(function(){var e=i(this).parent("."+s);e.hasClass("layui-tree-searchShow")||e.addClass(c)}),0==r.find(".layui-tree-searchShow").length&&e.elem.append(e.elemNone),a.onsearch&&a.onsearch({elem:l})}),e.elem.find(".layui-tree-search").on("keydown",function(){i(this).nextAll().find("."+p).each(function(){var e=i(this).parent("."+s);e.removeClass("layui-tree-searchShow "+c)}),i(".layui-tree-emptyText")[0]&&i(".layui-tree-emptyText").remove()})},b.prototype.getChecked=function(){var e=this,a=e.config,n=[],t=[];e.elem.find(".layui-form-checked").each(function(){n.push(i(this).prev()[0].value)});var r=function(e,a){layui.each(e,function(e,t){layui.each(n,function(e,n){if(t.id==n){var l=i.extend({},t);return delete l.children,a.push(l),t.children&&(l.children=[],r(t.children,l.children)),!0}})})};return r(i.extend({},a.data),t),t},b.prototype.setChecked=function(e){var a=this;a.config;a.elem.find("."+s).each(function(a,n){var t=i(this).data("id"),r=i(n).children("."+p).find('input[same="layuiTreeCheck"]'),l=r.next();if("number"==typeof e){if(t==e)return r[0].checked||l.click(),!1}else"object"==typeof e&&layui.each(e,function(e,i){if(i==t&&!r[0].checked)return l.click(),!0})})},l.that={},l.config={},r.reload=function(e,i){var a=l.that[e];return a.reload(i),l.call(a)},r.getChecked=function(e){var i=l.that[e];return i.getChecked()},r.setChecked=function(e,i){var a=l.that[e];return a.setChecked(i)},r.render=function(e){var i=new b(e);return l.call(i)},e(t,r)});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/upload.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/upload.js
new file mode 100644
index 0000000..9298ecf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/upload.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,n=layui.hint(),o=layui.device(),a={config:{},set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,r,e,t)}},l=function(){var e=this;return{upload:function(t){e.upload.call(e,t)},reload:function(t){e.reload.call(e,t)},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 i=this;i.config=t.extend({},i.config,a.config,e),i.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var i=this,e=i.config;e.elem=t(e.elem),e.bindAction=t(e.bindAction),i.file(),i.events()},p.prototype.file=function(){var e=this,i=e.config,n=e.elemFile=t(['<input class="'+u+'" type="file" accept="'+i.acceptMime+'" name="'+i.field+'"',i.multiple?" multiple":"",">"].join("")),a=i.elem.next();(a.hasClass(u)||a.hasClass(c))&&a.remove(),o.ie&&o.ie<10&&i.elem.wrap('<div class="layui-upload-wrap"></div>'),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(n),o.ie&&o.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,i=e.config,n=t('<iframe id="'+f+'" class="'+f+'" name="'+f+'" frameborder="0"></iframe>'),o=t(['<form target="'+f+'" class="'+c+'" method="post" key="set-mine" enctype="multipart/form-data" action="'+i.url+'">',"</form>"].join(""));t("#"+f)[0]||t("body").append(n),i.elem.next().hasClass(c)||(e.elemFile.wrap(o),i.elem.next("."+c).append(function(){var e=[];return layui.each(i.data,function(t,i){i="function"==typeof i?i():i,e.push('<input type="hidden" name="'+t+'" value="'+i+'">')}),e.join("")}()))},p.prototype.msg=function(e){return i.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 t=this;window.FileReader&&layui.each(t.chooseFiles,function(t,i){var n=new FileReader;n.readAsDataURL(i),n.onload=function(){e&&e(t,i,this.result)}})},p.prototype.upload=function(e,i){var n,a=this,l=a.config,r=a.elemFile[0],u=function(){var i=0,n=0,o=e||a.files||a.chooseFiles||r.files,u=function(){l.multiple&&i+n===a.fileLength&&"function"==typeof l.allDone&&l.allDone({total:a.fileLength,successful:i,aborted:n})};layui.each(o,function(e,o){var r=new FormData;r.append(l.field,o),layui.each(l.data,function(e,t){t="function"==typeof t?t():t,r.append(e,t)});var c={url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(t){i++,d(e,t),u()},error:function(){n++,a.msg("请求上传接口出现异常"),m(e),u()}};"function"==typeof l.progress&&(c.xhr=function(){var e=t.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=Math.floor(e.loaded/e.total*100);l.progress(t,l.item[0],e)}}),e}),t.ajax(c)})},c=function(){var e=t("#"+f);a.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var t,i=e.contents().find("body");try{t=i.text()}catch(n){a.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}t&&(clearInterval(p.timer),i.html(""),d(0,t))},30)},d=function(e,t){if(a.elemFile.next("."+s).remove(),r.value="","object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(t,e||0,function(e){a.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){a.upload(e)})},h=l.exts,v=function(){var t=[];return layui.each(e||a.chooseFiles,function(e,i){t.push(i.name)}),t}(),g={preview:function(e){a.preview(e)},upload:function(e,t){var i={};i[e]=t,a.upload(i)},pushFile:function(){return a.files=a.files||{},layui.each(a.chooseFiles,function(e,t){a.files[e]=t}),a.files},resetFile:function(e,t,i){var n=new File([t],i);a.files=a.files||{},a.files[e]=n}},y=function(){if("choose"!==i&&!l.auto||(l.choose&&l.choose(g),"choose"!==i))return l.before&&l.before(g),o.ie?o.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 a.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return a.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return a.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,t){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(t))||(n=!0)}),n)return a.msg("选择的图片中包含不支持的格式"),r.value=""}if(a.fileLength=function(){var t=0,i=e||a.files||a.chooseFiles||r.files;return layui.each(i,function(){t++}),t}(),l.number&&a.fileLength>l.number)return a.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(o.ie&&o.ie<10)){var F;if(layui.each(a.chooseFiles,function(e,t){if(t.size>1024*l.size){var i=l.size/1024;i=i>=1?i.toFixed(2)+"MB":l.size+"KB",r.value="",F=i}}),F)return a.msg("文件不能超过"+F)}y()}},p.prototype.reload=function(e){e=e||{},delete e.elem,delete e.bindAction;var i=this,e=i.config=t.extend({},i.config,a.config,e),n=e.elem.next();n.attr({name:e.name,accept:e.acceptMime,multiple:e.multiple})},p.prototype.events=function(){var e=this,i=e.config,a=function(t){e.chooseFiles={},layui.each(t,function(t,i){var n=(new Date).getTime();e.chooseFiles[n+"-"+t]=i})},l=function(t,n){var o=e.elemFile,a=t.length>1?t.length+"个文件":(t[0]||{}).name||o[0].value.match(/[^\/\\]+\..+/g)||[]||"";o.next().hasClass(s)&&o.next().remove(),e.upload(null,"choose"),e.isFile()||i.choose||o.after('<span class="layui-inline '+s+'">'+a+"</span>")};i.elem.off("upload.start").on("upload.start",function(){var o=t(this),a=o.attr("lay-data");if(a)try{a=new Function("return "+a)(),e.config=t.extend({},i,a)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+a)}e.config.item=o,e.elemFile[0].click()}),o.ie&&o.ie<10||i.elem.off("upload.over").on("upload.over",function(){var e=t(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=t(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,o){var r=t(this),u=o.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),a(u),i.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var t=this.files||[];a(t),i.auto?e.upload():l(t)}),i.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),i.elem.data("haveEvents")||(e.elemFile.on("change",function(){t(this).trigger("upload.change")}),i.elem.on("click",function(){e.isFile()||t(this).trigger("upload.start")}),i.drag&&i.elem.on("dragover",function(e){e.preventDefault(),t(this).trigger("upload.over")}).on("dragleave",function(e){t(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),t(this).trigger("upload.drop",e)}),i.bindAction.on("click",function(){t(this).trigger("upload.action")}),i.elem.data("haveEvents",!0))},a.render=function(e){var t=new p(e);return l.call(t)},e(r,a)});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/lay/modules/util.js b/management/guns-admin/src/main/webapp/static/layui/lay/modules/util.js
new file mode 100644
index 0000000..fdc1ec2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/lay/modules/util.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,n,a="layui-fixbar",o="layui-fixbar-top",r=t(document),l=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"&#xe606;":e.bar1,e.bar2=e.bar2===!0?"&#xe607;":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,"&#xe604;"],u=t(['<ul class="'+a+'">',e.bar1?'<li class="layui-icon" lay-type="bar1" style="'+e.bgcolor+'">'+c[0]+"</li>":"",e.bar2?'<li class="layui-icon" lay-type="bar2" style="'+e.bgcolor+'">'+c[1]+"</li>":"",'<li class="layui-icon '+o+'" lay-type="top" style="'+e.bgcolor+'">'+c[2]+"</li>","</ul>"].join("")),g=u.find("."+o),s=function(){var t=r.scrollTop();t>=e.showHeight?i||(g.show(),i=1):i&&(g.hide(),i=0)};t("."+a)[0]||("object"==typeof e.css&&u.css(e.css),l.append(u),s(),u.find("li").on("click",function(){var i=t(this),n=i.attr("lay-type");"top"===n&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,n)}),r.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var n=this,a="function"==typeof t,o=new Date(e).getTime(),r=new Date(!t||a?(new Date).getTime():t).getTime(),l=o-r,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=t);var u=setTimeout(function(){n.countdown(e,r+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,u),l<=0&&clearTimeout(u),u},timeAgo:function(e,t){var i=this,n=[[],[]],a=(new Date).getTime()-new Date(e).getTime();return a>26784e5?(a=new Date(e),n[0][0]=i.digit(a.getFullYear(),4),n[0][1]=i.digit(a.getMonth()+1),n[0][2]=i.digit(a.getDate()),t||(n[1][0]=i.digit(a.getHours()),n[1][1]=i.digit(a.getMinutes()),n[1][2]=i.digit(a.getSeconds())),n[0].join("-")+" "+n[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=18e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var n=e.length;n<t;n++)i+="0";return e<Math.pow(10,t)?i+(0|e):e},toDateString:function(e,t){var i=this,n=new Date(e||new Date),a=[i.digit(n.getFullYear(),4),i.digit(n.getMonth()+1),i.digit(n.getDate())],o=[i.digit(n.getHours()),i.digit(n.getMinutes()),i.digit(n.getSeconds())];return t=t||"yyyy-MM-dd HH:mm:ss",t.replace(/yyyy/g,a[0]).replace(/MM/g,a[1]).replace(/dd/g,a[2]).replace(/HH/g,o[0]).replace(/mm/g,o[1]).replace(/ss/g,o[2])},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&quot;")},event:function(e,n,a){var o=t("body");return a=a||"click",n=i.event[e]=t.extend(!0,i.event[e],n)||{},i.event.UTIL_EVENT_CALLBACK=i.event.UTIL_EVENT_CALLBACK||{},o.off(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),i.event.UTIL_EVENT_CALLBACK[e]=function(){var i=t(this),a=i.attr(e);"function"==typeof n[a]&&n[a].call(this,i)},o.on(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),n}};!function(e,t,i){"$:nomunge";function n(){a=t[l](function(){o.each(function(){var t=e(this),i=t.width(),n=t.height(),a=e.data(this,u);(i!==a.w||n!==a.h)&&t.trigger(c,[a.w=i,a.h=n])}),n()},r[g])}var a,o=e([]),r=e.resize=e.extend(e.resize,{}),l="setTimeout",c="resize",u=c+"-special-event",g="delay",s="throttleWindow";r[g]=250,r[s]=!0,e.event.special[c]={setup:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.add(t),e.data(this,u,{w:t.width(),h:t.height()}),1===o.length&&n()},teardown:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.not(t),t.removeData(u),o.length||clearTimeout(a)},add:function(t){function n(t,n,o){var r=e(this),l=e.data(this,u)||{};l.w=n!==i?n:r.width(),l.h=o!==i?o:r.height(),a.apply(this,arguments)}if(!r[s]&&this[l])return!1;var a;return e.isFunction(t)?(a=t,n):(a=t.handler,void(t.handler=n))}}}(t,window),e("util",i)});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/layui.all.js b/management/guns-admin/src/main/webapp/static/layui/layui.all.js
new file mode 100644
index 0000000..af3355c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/layui.all.js
@@ -0,0 +1,5 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;!function(e){"use strict";var t=document,n={modules:{},status:{},timeout:10,event:{}},r=function(){this.v="2.5.6"},o=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,n=t.scripts,r=n.length-1,o=r;o>0;o--)if("interactive"===n[o].readyState){e=n[o].src;break}return e||n[r].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",transfer:"modules/transfer",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};r.prototype.cache=n,r.prototype.define=function(e,t){var r=this,o="function"==typeof e,a=function(){var e=function(e,t){layui[e]=t,n.status[e]=!0};return"function"==typeof t&&t(function(r,o){e(r,o),n.callback[r]=function(){t(e)}}),this};return o&&(t=e,e=[]),!layui["layui.all"]&&layui["layui.mobile"]?a.call(r):(r.use(e,a),r)},r.prototype.use=function(e,r,l){function c(e,t){var r="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||r.test((e.currentTarget||e.srcElement).readyState))&&(n.modules[d]=t,y.removeChild(h),function o(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void(n.status[d]?s():setTimeout(o,4))}())}function s(){l.push(layui[d]),e.length>1?p.use(e.slice(1),r,l):"function"==typeof r&&r.apply(layui,l)}var p=this,f=n.dir=n.dir?n.dir:o,y=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(p.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||(f.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[d]||!layui["layui.all"]&&layui["layui.mobile"]&&u[d])return s(),p;var v=(u[d]?f+"lay/":/^\{\/\}/.test(p.modules[d])?"":n.base||"")+(p.modules[d]||d)+".js";if(v=v.replace(/^\{\/\}/,""),!n.modules[d]&&layui[d]&&(n.modules[d]=v),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]?s():setTimeout(g,4))}();else{var h=t.createElement("script");h.async=!0,h.charset="utf-8",h.src=v+function(){var e=n.version===!0?n.v||(new Date).getTime():n.version||"";return e?"?v="+e:""}(),y.appendChild(h),!h.attachEvent||h.attachEvent.toString&&h.attachEvent.toString().indexOf("[native code")<0||i?h.addEventListener("load",function(e){c(e,v)},!1):h.attachEvent("onreadystatechange",function(e){c(e,v)}),n.modules[d]=v}return p},r.prototype.getStyle=function(t,n){var r=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return r[r.getPropertyValue?"getPropertyValue":"getAttribute"](n)},r.prototype.link=function(e,r,o){var i=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof r&&(o=r);var c=(o||e).replace(/\.|\//g,""),s=u.id="layuicss-"+c,p=0;return u.rel="stylesheet",u.href=e+(n.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(s)||l.appendChild(u),"function"!=typeof r?i:(function f(){return++p>1e3*n.timeout/100?a(e+" timeout"):void(1989===parseInt(i.getStyle(t.getElementById(s),"width"))?function(){r()}():setTimeout(f,100))}(),i)},n.callback={},r.prototype.factory=function(e){if(layui[e])return"function"==typeof n.callback[e]?n.callback[e]:null},r.prototype.addcss=function(e,t,r){return layui.link(n.dir+"css/"+e,t,r)},r.prototype.img=function(e,t,n){var r=new Image;return r.src=e,r.complete?t(r):(r.onload=function(){r.onload=null,"function"==typeof t&&t(r)},void(r.onerror=function(e){r.onerror=null,"function"==typeof n&&n(e)}))},r.prototype.config=function(e){e=e||{};for(var t in e)n[t]=e[t];return this},r.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),r.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},r.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},r.prototype.url=function(e){var t=this,n={pathname:function(){var t=e?function(){var t=(e.match(/\.[^.]+?\/.+/)||[])[0]||"";return t.replace(/^[^\/]+/,"").replace(/\?.+/,"")}():location.pathname;return t.replace(/^\//,"").split("/")}(),search:function(){var n={},r=(e?function(){var t=(e.match(/\?.+/)||[])[0]||"";return t.replace(/\#.+/,"")}():location.search).replace(/^\?+/,"").split("&");return t.each(r,function(e,t){var r=t.indexOf("="),o=function(){return r<0?t.substr(0,t.length):0!==r&&t.substr(0,r)}();o&&(n[o]=r>0?t.substr(r+1):null)}),n}(),hash:t.router(function(){return e?(e.match(/#.+/)||[])[0]||"":location.hash}())};return n},r.prototype.data=function(t,n,r){if(t=t||"layui",r=r||localStorage,e.JSON&&e.JSON.parse){if(null===n)return delete r[t];n="object"==typeof n?n:{key:n};try{var o=JSON.parse(r[t])}catch(a){var o={}}return"value"in n&&(o[n.key]=n.value),n.remove&&delete o[n.key],r[t]=JSON.stringify(o),n.key?o[n.key]:o}},r.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},r.prototype.device=function(t){var n=navigator.userAgent.toLowerCase(),r=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(n.match(t)||[])[1],e||!1},o={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:r("micromessenger")};return t&&!o[t]&&(o[t]=r(t)),o.android=/android/.test(n),o.ios="ios"===o.os,o.mobile=!(!o.android&&!o.ios),o},r.prototype.hint=function(){return{error:a}},r.prototype.each=function(e,t){var n,r=this;if("function"!=typeof t)return r;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;n<e.length&&!t.call(e[n],n,e[n]);n++);return r},r.prototype.sort=function(e,t,n){var r=JSON.parse(JSON.stringify(e||[]));return t?(r.sort(function(e,n){var r=/^-?\d+$/,o=e[t],a=n[t];return r.test(o)&&(o=parseFloat(o)),r.test(a)&&(a=parseFloat(a)),o&&!a?1:!o&&a?-1:o>a?1:o<a?-1:0}),n&&r.reverse(),r):r},r.prototype.stope=function(t){t=t||e.event;try{t.stopPropagation()}catch(n){t.cancelBubble=!0}},r.prototype.onevent=function(e,t,n){return"string"!=typeof e||"function"!=typeof n?this:r.event(e,t,null,n)},r.prototype.event=r.event=function(e,t,r,o){var a=this,i=null,u=t.match(/\((.*)\)$/)||[],l=(e+"."+t).replace(u[0],""),c=u[1]||"",s=function(e,t){var n=t&&t.call(a,r);n===!1&&null===i&&(i=!1)};return o?(n.event[l]=n.event[l]||{},n.event[l][c]=[o],this):(layui.each(n.event[l],function(e,t){return"{*}"===c?void layui.each(t,s):(""===e&&layui.each(t,s),void(c&&e===c&&layui.each(t,s)))}),i)},e.layui=new r}(window);layui.define(function(a){var i=layui.cache;layui.config({dir:i.dir.replace(/lay\/dest\/$/,"")}),a("layui.all",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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&quot;")},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:"&#x4E0A;&#x4E00;&#x9875;",a.next="next"in a?a.next:"&#x4E0B;&#x4E00;&#x9875;";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 href="javascript:;" class="layui-laypage-prev'+(1==a.curr?" "+r:"")+'" data-page="'+(a.curr-1)+'">'+a.prev+"</a>":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push('<a href="javascript:;" class="layui-laypage-first" data-page="1"  title="&#x9996;&#x9875;">'+(a.first||1)+"</a>");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-r<t-1&&(r=u-t+1),a.first!==!1&&r>2&&e.push('<span class="layui-laypage-spr">&#x2026;</span>');r<=u;r++)r===a.curr?e.push('<span class="layui-laypage-curr"><em class="layui-laypage-em" '+(/^#/.test(a.theme)?'style="background-color:'+a.theme+';"':"")+"></em><em>"+r+"</em></span>"):e.push('<a href="javascript:;" data-page="'+r+'">'+r+"</a>");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1<a.pages&&e.push('<span class="layui-laypage-spr">&#x2026;</span>'),0!==t&&e.push('<a href="javascript:;" class="layui-laypage-last" title="&#x5C3E;&#x9875;"  data-page="'+a.pages+'">'+(a.last||a.pages)+"</a>")),e.join("")}(),next:function(){return a.next?'<a href="javascript:;" class="layui-laypage-next'+(a.curr==a.pages?" "+r:"")+'" data-page="'+(a.curr+1)+'">'+a.next+"</a>":""}(),count:'<span class="layui-laypage-count">共 '+a.count+" 条</span>",limit:function(){var e=['<span class="layui-laypage-limits"><select lay-ignore>'];return layui.each(a.limits,function(t,n){e.push('<option value="'+n+'"'+(n===a.limit?"selected":"")+">"+n+" 条/页</option>")}),e.join("")+"</select></span>"}(),refresh:['<a href="javascript:;" data-page="'+a.curr+'" class="layui-laypage-refresh">','<i class="layui-icon layui-icon-refresh"></i>',"</a>"].join(""),skip:function(){return['<span class="layui-laypage-skip">&#x5230;&#x7B2C;','<input type="text" min="1" value="'+a.curr+'" class="layui-input">','&#x9875;<button type="button" class="layui-laypage-btn">&#x786e;&#x5b9a;</button>',"</span>"].join("")}()};return['<div class="layui-box layui-laypage layui-laypage-'+(a.theme?/^#/.test(a.theme)?"molv":a.theme:"default")+'" id="layui-laypage-'+a.index+'">',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"</div>"].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;o<y;o++)"a"===r[o].nodeName.toLowerCase()&&s.on(r[o],"click",function(){var e=0|this.getAttribute("data-page");e<1||e>i.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="开始日期超出了结束日期<br>建议重新选择",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));t<n.length;t++)this.push(n[t])};C.prototype=[],C.prototype.constructor=C,w.extend=function(){var e=1,t=arguments,n=function(e,t){e=e||(t.constructor===Array?[]:{});for(var a in t)e[a]=t[a]&&t[a].constructor===Object?n(e[a],t[a]):t[a];return e};for(t[0]="object"==typeof t[0]?t[0]:{};e<t.length;e++)"object"==typeof t[e]&&n(t[0],t[e]);return t[0]},w.ie=function(){var e=navigator.userAgent.toLowerCase();return!!(window.ActiveXObject||"ActiveXObject"in window)&&((e.match(/msie\s(\d+)/)||[])[1]||"11")}(),w.stope=function(e){e=e||window.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},w.each=function(e,t){var n,a=this;if("function"!=typeof t)return a;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;n<e.length&&!t.call(e[n],n,e[n]);n++);return a},w.digit=function(e,t,n){var a="";e=String(e),t=t||2;for(var i=e.length;i<t;i++)a+="0";return e<Math.pow(10,t)?a+(0|e):e},w.elem=function(e,t){var n=document.createElement(e);return w.each(t||{},function(e,t){n.setAttribute(e,t)}),n},C.addStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){new RegExp("\\b"+n+"\\b").test(e)||(e=e+" "+n)}),e.replace(/^\s|\s$/,"")},C.removeStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){var a=new RegExp("\\b"+n+"\\b");a.test(e)&&(e=e.replace(a,""))}),e.replace(/\s+/," ").replace(/^\s|\s$/,"")},C.prototype.find=function(e){var t=this,n=0,a=[],i="object"==typeof e;return this.each(function(r,o){for(var s=i?[e]:o.querySelectorAll(e||null);n<s.length;n++)a.push(s[n]);t.shift()}),i||(t.selector=(t.selector?t.selector+" ":"")+e),w.each(a,function(e,n){t.push(n)}),t},C.prototype.each=function(e){return w.each.call(this,this,e)},C.prototype.addClass=function(e,t){return this.each(function(n,a){a.className=C[t?"removeStr":"addStr"](a.className,e)})},C.prototype.removeClass=function(e){return this.addClass(e,!0)},C.prototype.hasClass=function(e){var t=!1;return this.each(function(n,a){new RegExp("\\b"+e+"\\b").test(a.className)&&(t=!0)}),t},C.prototype.attr=function(e,t){var n=this;return void 0===t?function(){if(n.length>0)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?r<s?o+r*s:r:o);a=[l.getFullYear(),l.getMonth()+1,l.getDate()],r<s||(i=[l.getHours(),l.getMinutes(),l.getSeconds()])}else a=(t[n].match(/\d+-\d+-\d+/)||[""])[0].split("-"),i=(t[n].match(/\d+:\d+:\d+/)||[""])[0].split(":");t[n]={year:0|a[0]||(new Date).getFullYear(),month:a[1]?(0|a[1])-1:(new Date).getMonth(),date:0|a[2]||(new Date).getDate(),hours:0|i[0],minutes:0|i[1],seconds:0|i[2]}}),e.elemID="layui-laydate"+t.elem.attr("lay-key"),(t.show||a)&&e.render(),a||e.events(),t.value&&t.isInitValue&&(t.value.constructor===Date?e.setValue(e.parse(0,e.systemDate(t.value))):e.setValue(t.value)))},T.prototype.render=function(){var e=this,t=e.config,n=e.lang(),a="static"===t.position,i=e.elem=w.elem("div",{id:e.elemID,"class":["layui-laydate",t.range?" layui-laydate-range":"",a?" "+c:"",t.theme&&"default"!==t.theme&&!/^#/.test(t.theme)?" laydate-theme-"+t.theme:""].join("")}),r=e.elemMain=[],o=e.elemHeader=[],s=e.elemCont=[],l=e.table=[],d=e.footer=w.elem("div",{"class":p});if(t.zIndex&&(i.style.zIndex=t.zIndex),w.each(new Array(2),function(e){if(!t.range&&e>0)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="&#xe65a;",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="&#xe603;",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="&#xe602;",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="&#xe65b;",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('<span lay-type="datetime" class="laydate-btns-time">'+n.timeTips+"</span>"),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('<span lay-type="'+r+'" class="laydate-btns-'+r+'">'+o+"</span>"))}),e.push('<div class="laydate-footer-btns">'+i.join("")+"</div>"),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}));t.elem&&(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<l.length&&(a=!0),/yyyy|y/.test(l)?(c<d[0]&&(c=d[0],a=!0),e.year=c):/MM|M/.test(l)?(c<1&&(c=1,a=!0),e.month=c-1):/dd|d/.test(l)?(c<1&&(c=1,a=!0),e.date=c):/HH|H/.test(l)?(c<1&&(c=0,a=!0),e.hours=c,r.range&&(i[o[n]].hours=c)):/mm|m/.test(l)?(c<1&&(c=0,a=!0),e.minutes=c,r.range&&(i[o[n]].minutes=c)):/ss|s/.test(l)&&(c<1&&(c=0,a=!0),e.seconds=c,r.range&&(i[o[n]].seconds=c))}),c(e)};return"limit"===e?(c(o),i):(l=l||r.value,"string"==typeof l&&(l=l.replace(/\s+/g," ").replace(/^\s|\s$/g,"")),i.startState&&!i.endState&&(delete i.startState,i.endState=!0),"string"==typeof l&&l?i.EXP_IF.test(l)?r.range?(l=l.split(" "+r.range+" "),i.startDate=i.startDate||i.systemDate(),i.endDate=i.endDate||i.systemDate(),r.dateTime=w.extend({},i.startDate),w.each([i.startDate,i.endDate],function(e,t){m(t,l[e],e)})):m(o,l):(i.hint("日期格式不合法<br>必须遵循下述格式:<br>"+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"<br>已为你重置"),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('<span class="laydate-day-mark">'+n+"</span>"),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.now<l.min||l.now>l.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.year<d[0]&&(l.year=d[0],r.hint("最低只能支持到公元"+d[0]+"年")),l.year>d[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?(c=a-t+e,n.addClass("laydate-day-prev"),d=r.getAsYM(l.year,l.month,"sub")):e>=t&&e<i+t?(c=e-t,s.range||c+1===l.date&&n.addClass(o)):(c=e-i-t,n.addClass("laydate-day-next"),d=r.getAsYM(l.year,l.month)),d[1]++,d[2]=c+1,n.attr("lay-ymd",d.join("-")).html(d[2]),r.mark(n,d).limit(n,{year:d[0],month:d[1]-1,date:d[2]},e)}),w(f[0]).attr("lay-ym",l.year+"-"+(l.month+1)),w(f[1]).attr("lay-ym",l.year+"-"+(l.month+1)),"cn"===s.lang?(w(f[0]).attr("lay-type","year").html(l.year+"年"),w(f[1]).attr("lay-type","month").html(l.month+1+"月")):(w(f[0]).attr("lay-type","month").html(m.month[l.month]),w(f[1]).attr("lay-type","year").html(l.year)),u&&(s.range&&(e?r.endDate=r.endDate||{year:l.year+("year"===s.type?1:0),month:l.month+("month"===s.type?0:-1)}:r.startDate=r.startDate||{year:l.year,month:l.month},e&&(r.listYM=[[r.startDate.year,r.startDate.month+1],[r.endDate.year,r.endDate.month+1]],r.list(s.type,0).list(s.type,1),"time"===s.type?r.setBtnStatus("时间",w.extend({},r.systemDate(),r.startTime),w.extend({},r.systemDate(),r.endTime)):r.setBtnStatus(!0))),s.range||(r.listYM=[[l.year,l.month+1]],r.list(s.type,0))),s.range&&!e){var p=r.getAsYM(l.year,l.month);r.calendar(w.extend({},l,{year:p[0],month:p[1]}))}return s.range||r.limit(w(r.footer).find(g),null,0,["hours","minutes","seconds"]),s.range&&e&&!u&&r.stampRange(),r},T.prototype.list=function(e,t){var n=this,a=n.config,i=a.dateTime,r=n.lang(),l=a.range&&"date"!==a.type&&"datetime"!==a.type,d=w.elem("ul",{"class":m+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[e]}),c=n.elemHeader[t],u=w(c[2]).find("span"),h=n.elemCont[t||0],y=w(h).find("."+m)[0],f="cn"===a.lang,p=f?"年":"",T=n.listYM[t]||{},C=["hours","minutes","seconds"],x=["startTime","endTime"][t];if(T[0]<1&&(T[0]=1),"year"===e){var M,b=M=T[0]-7;b<1&&(b=M=1),w.each(new Array(15),function(e){var i=w.elem("li",{"lay-ym":M}),r={year:M};M==T[0]&&w(i).addClass(o),i.innerHTML=M+p,d.appendChild(i),M<n.firstDate.year?(r.month=a.min.month,r.date=a.min.date):M>=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.min.date: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=["<p>"+r.time[e]+"</p><ol>"];w.each(new Array(t),function(t){i.push("<li"+(n[x][C[e]]===t?' class="'+o+'"':"")+">"+w.digit(t,2)+"</li>")}),a.innerHTML=i.join("")+"</ol>",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&&s<t&&w(i).addClass(u)})},T.prototype.done=function(e,t){var n=this,a=n.config,i=w.extend({},n.startDate?w.extend(n.startDate,n.startTime):a.dateTime),r=w.extend({},w.extend(n.endDate,n.endTime));return w.each([i,r],function(e,t){"month"in t&&w.extend(t,{month:t.month+1})}),e=e||[n.parse(),i,r],"function"==typeof a[t||"done"]&&a[t||"done"].apply(a,e),n},T.prototype.choose=function(e){var t=this,n=t.config,a=n.dateTime,i=w(t.elem).find("td"),r=e.attr("lay-ymd").split("-"),l=function(e){new Date;e&&w.extend(a,r),n.range&&(t.startDate?w.extend(t.startDate,r):t.startDate=w.extend({},r,t.startTime),t.startYMD=r)};if(r={year:0|r[0],month:(0|r[1])-1,date:0|r[2]},!e.hasClass(s))if(n.range){if(w.each(["startTime","endTime"],function(e,n){t[n]=t[n]||{hours:0,minutes:0,seconds:0}}),t.endState)l(),delete t.endState,delete t.endDate,t.startState=!0,i.removeClass(o+" "+u),e.addClass(o);else if(t.startState){if(e.addClass(o),t.endDate?w.extend(t.endDate,r):t.endDate=w.extend({},r,t.endTime),t.newDate(r).getTime()<t.newDate(t.startYMD).getTime()){var d=w.extend({},t.endDate,{hours:t.startDate.hours,minutes:t.startDate.minutes,seconds:t.startDate.seconds});w.extend(t.endDate,t.startDate,{hours:t.endDate.hours,minutes:t.endDate.minutes,seconds:t.endDate.seconds}),t.startDate=d}n.showBottom||t.done(),t.stampRange(),t.endState=!0,t.done(null,"change")}else e.addClass(o),l(),t.startState=!0;w(t.footer).find(g)[t.endDate?"removeClass":"addClass"](s)}else"static"===n.position?(l(!0),t.calendar().done().done(null,"change")):"date"===n.type?(l(!0),t.setValue(t.parse()).remove().done()):"datetime"===n.type&&(l(!0),t.calendar().done(null,"change"))},T.prototype.tool=function(e,t){var n=this,a=n.config,i=a.dateTime,r="static"===a.position,o={datetime:function(){w(e).hasClass(s)||(n.list("time",0),a.range&&n.list("time",1),w(e).attr("lay-type","date").html(n.lang().dateTips))},date:function(){n.closeList(),w(e).attr("lay-type","datetime").html(n.lang().timeTips)},clear:function(){n.setValue("").remove(),r&&(w.extend(i,n.firstDate),n.calendar()),a.range&&(delete n.startState,delete n.endState,delete n.endDate,delete n.startTime,delete n.endTime),n.done(["",{},{}])},now:function(){var e=new Date;w.extend(i,n.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),n.setValue(n.parse()).remove(),r&&n.calendar(),n.done()},confirm:function(){if(a.range){if(!n.endDate)return n.hint("请先选择日期范围");if(w(e).hasClass(s))return n.hint("time"===a.type?l.replace(/日期/g,"时间"):l)}else if(w(e).hasClass(s))return n.hint("不在有效日期或时间范围内");n.done(),n.setValue(n.parse()).remove()}};o[t]&&o[t]()},T.prototype.change=function(e){var t=this,n=t.config,a=n.dateTime,i=n.range&&("year"===n.type||"month"===n.type),r=t.elemCont[e||0],o=t.listYM[e],s=function(s){var l=["startDate","endDate"][e],d=w(r).find(".laydate-year-list")[0],c=w(r).find(".laydate-month-list")[0];return d&&(o[0]=s?o[0]-15:o[0]+15,t.list("year",e)),c&&(s?o[0]--:o[0]++,t.list("month",e)),(d||c)&&(w.extend(a,{year:o[0]}),i&&(t[l].year=o[0]),n.range||t.done(null,"change"),t.setBtnStatus(),n.range||t.limit(w(t.footer).find(g),{year:o[0]})),d||c};return{prevYear:function(){s("sub")||(a.year--,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))},prevMonth:function(){var e=t.getAsYM(a.year,a.month,"sub");w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextMonth:function(){var e=t.getAsYM(a.year,a.month);w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextYear:function(){s()||(a.year++,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))}}},T.prototype.changeEvent=function(){var e=this;e.config;w(e.elem).on("click",function(e){w.stope(e)}),w.each(e.elemHeader,function(t,n){w(n[0]).on("click",function(n){e.change(t).prevYear()}),w(n[1]).on("click",function(n){e.change(t).prevMonth()}),w(n[2]).find("span").on("click",function(n){var a=w(this),i=a.attr("lay-ym"),r=a.attr("lay-type");i&&(i=i.split("-"),e.listYM[t]=[0|i[0],0|i[1]],e.list(r,t),w(e.footer).find(D).addClass(s))}),w(n[3]).on("click",function(n){e.change(t).nextMonth()}),w(n[4]).on("click",function(n){e.change(t).nextYear()})}),w.each(e.table,function(t,n){var a=w(n).find("td");a.on("click",function(){e.choose(w(this))})}),w(e.footer).find("span").on("click",function(){var t=w(this).attr("lay-type");e.tool(this,t)})},T.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())},T.prototype.events=function(){var e=this,t=e.config,n=function(n,a){n.on(t.trigger,function(){a&&(e.bindElem=this),e.render()})};t.elem[0]&&!t.elem[0].eventHandler&&(n(t.elem,"bind"),n(t.eventElem),w(document).on("click",function(n){n.target!==t.elem[0]&&n.target!==t.eventElem[0]&&n.target!==w(t.closeStop)[0]&&e.remove()}).on("keydown",function(t){13===t.keyCode&&w("#"+e.elemID)[0]&&e.elemID===T.thisElem&&(t.preventDefault(),w(e.footer).find(g)[0].click())}),w(window).on("resize",function(){return!(!e.elem||!w(r)[0])&&void e.position()}),t.elem[0].eventHandler=!0)},n.render=function(e){var t=new T(e);return a.call(t)},n.getEndDate=function(e,t){var n=new Date;return n.setFullYear(t||n.getFullYear(),e||n.getMonth()+1,1),new Date(n.getTime()-864e5).getDate()},window.lay=window.lay||w,e?(n.ready(),layui.define(function(e){n.path=layui.cache.dir,e(i,n)})):"function"==typeof define&&define.amd?define(function(){return n}):function(){n.ready(),window.laydate=n}()}();!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&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<d;x++)if(a=e[x],a||0===a)if("object"===pe.type(a))pe.merge(v,a.nodeType?[a]:a);else if(Ue.test(a)){for(u=u||y.appendChild(t.createElement("div")),l=(We.exec(a)||["",""])[1].toLowerCase(),f=Xe[l]||Xe._default,u.innerHTML=f[1]+pe.htmlPrefilter(a)+f[2],o=f[0];o--;)u=u.lastChild;if(!fe.leadingWhitespace&&$e.test(a)&&v.push(t.createTextNode($e.exec(a)[0])),!fe.tbody)for(a="table"!==l||Ve.test(a)?"<table>"!==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;r<i;r++)pe.event.add(t,n,s[n][r])}a.data&&(a.data=pe.extend({},a.data))}}function k(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!fe.noCloneEvent&&t[pe.expando]){i=pe._data(t);for(r in i.events)pe.removeEvent(t,r,i.handle);t.removeAttribute(pe.expando)}"script"===n&&t.text!==e.text?(C(t).text=e.text,E(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),fe.html5Clone&&e.innerHTML&&!pe.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Be.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)}}function S(e,t,n,r){t=oe.apply([],t);var i,o,a,s,u,l,c=0,f=e.length,d=f-1,p=t[0],g=pe.isFunction(p);if(g||f>1&&"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<f;c++)o=l,c!==d&&(o=pe.clone(o,!0,!0),a&&pe.merge(s,h(o,"script"))),n.call(e[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,pe.map(s,E),c=0;c<a;c++)o=s[c],Ie.test(o.type||"")&&!pe._data(o,"globalEval")&&pe.contains(u,o)&&(o.src?pe._evalUrl&&pe._evalUrl(o.src):pe.globalEval((o.text||o.textContent||o.innerHTML||"").replace(ot,"")));l=i=null}return e}function A(e,t,n){for(var r,i=t?pe.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||pe.cleanData(h(r)),r.parentNode&&(n&&pe.contains(r.ownerDocument,r)&&g(h(r,"script")),r.parentNode.removeChild(r));return e}function D(e,t){var n=pe(t.createElement(e)).appendTo(t.body),r=pe.css(n[0],"display");return n.detach(),r}function j(e){var t=re,n=lt[e];return n||(n=D(e,t),"none"!==n&&n||(ut=(ut||pe("<iframe frameborder='0' width='0' height='0'/>")).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<s;a++)r=e[a],r.style&&(o[a]=pe._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&Re(r)&&(o[a]=pe._data(r,"olddisplay",j(r.nodeName)))):(i=Re(r),(n&&"none"!==n||!i)&&pe._data(r,"olddisplay",i?n:pe.css(r,"display"))));for(a=0;a<s;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function _(e,t,n){var r=bt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function F(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;o<4;o+=2)"margin"===n&&(a+=pe.css(e,n+Oe[o],!0,i)),r?("content"===n&&(a-=pe.css(e,"padding"+Oe[o],!0,i)),"margin"!==n&&(a-=pe.css(e,"border"+Oe[o]+"Width",!0,i))):(a+=pe.css(e,"padding"+Oe[o],!0,i),"padding"!==n&&(a+=pe.css(e,"border"+Oe[o]+"Width",!0,i)));return a}function M(t,n,r){var i=!0,o="width"===n?t.offsetWidth:t.offsetHeight,a=ht(t),s=fe.boxSizing&&"border-box"===pe.css(t,"boxSizing",!1,a);if(re.msFullscreenElement&&e.top!==e&&t.getClientRects().length&&(o=Math.round(100*t.getBoundingClientRect()[n])),o<=0||null==o){if(o=gt(t,n,a),(o<0||null==o)&&(o=t.style[n]),ft.test(o))return o;i=s&&(fe.boxSizingReliable()||o===t.style[n]),o=parseFloat(o)||0}return o+F(t,n,r||(s?"border":"content"),i,a)+"px"}function O(e,t,n,r,i){return new O.prototype.init(e,t,n,r,i)}function R(){return e.setTimeout(function(){Nt=void 0}),Nt=pe.now()}function P(e,t){var n,r={height:e},i=0;for(t=t?1:0;i<4;i+=2-t)n=Oe[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function B(e,t,n){for(var r,i=($.tweeners[t]||[]).concat($.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function W(e,t,n){var r,i,o,a,s,u,l,c,f=this,d={},p=e.style,h=e.nodeType&&Re(e),g=pe._data(e,"fxshow");n.queue||(s=pe._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,u=s.empty.fire,s.empty.fire=function(){s.unqueued||u()}),s.unqueued++,f.always(function(){f.always(function(){s.unqueued--,pe.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],l=pe.css(e,"display"),c="none"===l?pe._data(e,"olddisplay")||j(e.nodeName):l,"inline"===c&&"none"===pe.css(e,"float")&&(fe.inlineBlockNeedsLayout&&"inline"!==j(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",fe.shrinkWrapBlocks()||f.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],St.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!g||void 0===g[r])continue;h=!0}d[r]=g&&g[r]||pe.style(e,r)}else l=void 0;if(pe.isEmptyObject(d))"inline"===("none"===l?j(e.nodeName):l)&&(p.display=l);else{g?"hidden"in g&&(h=g.hidden):g=pe._data(e,"fxshow",{}),o&&(g.hidden=!h),h?pe(e).show():f.done(function(){pe(e).hide()}),f.done(function(){var t;pe._removeData(e,"fxshow");for(t in d)pe.style(e,t,d[t])});for(r in d)a=B(h?g[r]:0,r,f),r in g||(g[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function I(e,t){var n,r,i,o,a;for(n in e)if(r=pe.camelCase(n),i=t[r],o=e[n],pe.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=pe.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function $(e,t,n){var r,i,o=0,a=$.prefilters.length,s=pe.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Nt||R(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;a<u;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),o<1&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:pe.extend({},t),opts:pe.extend(!0,{specialEasing:{},easing:pe.easing._default},n),originalProperties:t,originalOptions:n,startTime:Nt||R(),duration:n.duration,tweens:[],createTween:function(t,n){var r=pe.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(I(c,l.opts.specialEasing);o<a;o++)if(r=$.prefilters[o].call(l,e,c,l.opts))return pe.isFunction(r.stop)&&(pe._queueHooks(l.elem,l.opts.queue).stop=pe.proxy(r.stop,r)),r;return pe.map(c,B,l),pe.isFunction(l.opts.start)&&l.opts.start.call(e,l),pe.fx.timer(pe.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function z(e){return pe.attr(e,"class")||""}function X(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(De)||[];if(pe.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function U(e,t,n,r){function i(s){var u;return o[s]=!0,pe.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||a||o[l]?a?!(u=l):void 0:(t.dataTypes.unshift(l),i(l),!1)}),u}var o={},a=e===Qt;return i(t.dataTypes[0])||!o["*"]&&i("*")}function V(e,t){var n,r,i=pe.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&pe.extend(!0,e,n),e}function Y(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){u.unshift(a);break}if(u[0]in n)o=u[0];else{for(a in n){if(!u[0]||e.converters[a+" "+u[0]]){o=a;break}r||(r=a)}o=o||r}if(o)return o!==u[0]&&u.unshift(o),n[o]}function J(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(a=l[u+" "+o]||l["* "+o],!a)for(i in l)if(s=i.split(" "),s[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){a===!0?a=l[i]:l[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(f){return{state:"parsererror",error:a?f:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}function G(e){return e.style&&e.style.display||pe.css(e,"display")}function K(e){for(;e&&1===e.nodeType;){if("none"===G(e)||"hidden"===e.type)return!0;e=e.parentNode}return!1}function Q(e,t,n,r){var i;if(pe.isArray(t))pe.each(t,function(t,i){n||rn.test(e)?r(e,i):Q(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==pe.type(t))r(e,t);else for(i in t)Q(e+"["+i+"]",t[i],n,r)}function Z(){try{return new e.XMLHttpRequest}catch(t){}}function ee(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function te(e){return pe.isWindow(e)?e:9===e.nodeType&&(e.defaultView||e.parentWindow)}var ne=[],re=e.document,ie=ne.slice,oe=ne.concat,ae=ne.push,se=ne.indexOf,ue={},le=ue.toString,ce=ue.hasOwnProperty,fe={},de="1.12.3",pe=function(e,t){return new pe.fn.init(e,t)},he=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,ge=/^-ms-/,me=/-([\da-z])/gi,ye=function(e,t){return t.toUpperCase()};pe.fn=pe.prototype={jquery:de,constructor:pe,selector:"",length:0,toArray:function(){return ie.call(this)},get:function(e){return null!=e?e<0?this[e+this.length]:this[e]:ie.call(this)},pushStack:function(e){var t=pe.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e){return pe.each(this,e)},map:function(e){return this.pushStack(pe.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(ie.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ae,sort:ne.sort,splice:ne.splice},pe.extend=pe.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||pe.isFunction(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(i=arguments[s]))for(r in i)e=a[r],n=i[r],a!==n&&(l&&n&&(pe.isPlainObject(n)||(t=pe.isArray(n)))?(t?(t=!1,o=e&&pe.isArray(e)?e:[]):o=e&&pe.isPlainObject(e)?e:{},a[r]=pe.extend(l,o,n)):void 0!==n&&(a[r]=n));return a},pe.extend({expando:"jQuery"+(de+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===pe.type(e)},isArray:Array.isArray||function(e){return"array"===pe.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){var t=e&&e.toString();return!pe.isArray(e)&&t-parseFloat(t)+1>=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;i<r&&t.call(e[i],i,e[i])!==!1;i++);else for(i in e)if(t.call(e[i],i,e[i])===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(he,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?pe.merge(r,"string"==typeof e?[e]:e):ae.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(se)return se.call(t,e,n);for(r=t.length,n=n?n<0?Math.max(0,r+n):n:0;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;)e[i++]=t[r++];if(n!==n)for(;void 0!==t[r];)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)r=!t(e[o],o),r!==s&&i.push(e[o]);return i},map:function(e,t,r){var i,o,a=0,s=[];if(n(e))for(i=e.length;a<i;a++)o=t(e[a],a,r),null!=o&&s.push(o);else for(a in e)o=t(e[a],a,r),null!=o&&s.push(o);return oe.apply([],s)},guid:1,proxy:function(e,t){var n,r,i;if("string"==typeof t&&(i=e[t],t=e,e=i),pe.isFunction(e))return n=ie.call(arguments,2),r=function(){return e.apply(t||this,n.concat(ie.call(arguments)))},r.guid=e.guid=e.guid||pe.guid++,r},now:function(){return+new Date},support:fe}),"function"==typeof Symbol&&(pe.fn[Symbol.iterator]=ne[Symbol.iterator]),pe.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){ue["[object "+t+"]"]=t.toLowerCase()});var ve=function(e){function t(e,t,n,r){var i,o,a,s,u,l,f,p,h=t&&t.ownerDocument,g=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==g&&9!==g&&11!==g)return n;if(!r&&((t?t.ownerDocument||t:B)!==H&&L(t),t=t||H,_)){if(11!==g&&(l=ye.exec(e)))if(i=l[1]){if(9===g){if(!(a=t.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(h&&(a=h.getElementById(i))&&R(t,a)&&a.id===i)return n.push(a),n}else{if(l[2])return Q.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&w.getElementsByClassName&&t.getElementsByClassName)return Q.apply(n,t.getElementsByClassName(i)),n}if(w.qsa&&!X[e+" "]&&(!F||!F.test(e))){if(1!==g)h=t,p=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(xe,"\\$&"):t.setAttribute("id",s=P),f=N(e),o=f.length,u=de.test(s)?"#"+s:"[id='"+s+"']";o--;)f[o]=u+" "+d(f[o]);p=f.join(","),h=ve.test(e)&&c(t.parentNode)||t}if(p)try{return Q.apply(n,h.querySelectorAll(p)),n}catch(m){}finally{s===P&&t.removeAttribute("id")}}}return S(e.replace(se,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>T.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="";t<n;t++)r+=e[t].value;return r}function p(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=I++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,u,l,c=[W,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[P]||(t[P]={}),u=l[t.uniqueID]||(l[t.uniqueID]={}),(s=u[r])&&s[0]===W&&s[1]===o)return c[2]=s[2];if(u[r]=c,c[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?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<o;i++)t(e,n[i],r);return r}function m(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function y(e,t,n,i,o,a){return i&&!i[P]&&(i=y(i)),o&&!o[P]&&(o=y(o,a)),r(function(r,a,s,u){var l,c,f,d=[],p=[],h=a.length,y=r||g(t||"*",s.nodeType?[s]:s,[]),v=!e||!r&&t?y:m(y,d,e,s,u),x=n?o||(r?e:h||i)?[]:a:v;if(n&&n(v,x,s,u),i)for(l=m(x,p),i(l,[],s,u),c=l.length;c--;)(f=l[c])&&(x[p[c]]=!(v[p[c]]=f));if(r){if(o||e){if(o){for(l=[],c=x.length;c--;)(f=x[c])&&l.push(v[c]=f);o(null,x=[],l,u)}for(c=x.length;c--;)(f=x[c])&&(l=o?ee(r,f):d[c])>-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}];s<i;s++)if(n=T.relative[e[s].type])c=[p(h(c),n)];else{if(n=T.filter[e[s].type].apply(null,e[s].matches),n[P]){for(r=++s;r<i&&!T.relative[e[r].type];r++);return y(s>1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s<r&&v(e.slice(s,r)),r<i&&v(e=e.slice(r)),r<i&&d(e))}c.push(n)}return h(c)}function x(e,n){var i=n.length>0,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<r;n++)if(e[n]===t)return n;return-1},te="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",ne="[\\x20\\t\\r\\n\\f]",re="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",ie="\\["+ne+"*("+re+")(?:"+ne+"*([*^$|!~]?=)"+ne+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+re+"))|)"+ne+"*\\]",oe=":("+re+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+ie+")*)|.*)\\)|)",ae=new RegExp(ne+"+","g"),se=new RegExp("^"+ne+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ne+"+$","g"),ue=new RegExp("^"+ne+"*,"+ne+"*"),le=new RegExp("^"+ne+"*([>+~]|"+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="<a id='"+P+"'></a><select id='"+P+"-\r\\' msallowcapture=''><option selected=''></option></select>",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<t;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:l(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[b]=s(b);for(b in{submit:!0,reset:!0})T.pseudos[b]=u(b);return f.prototype=T.filters=T.pseudos,T.setFilters=new f,N=t.tokenize=function(e,n){var r,i,o,a,s,u,l,c=z[e+" "];if(c)return n?0:c.slice(0);for(s=e,u=[],l=T.preFilter;s;){r&&!(i=ue.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),r=!1,(i=le.exec(s))&&(r=i.shift(),o.push({value:r,type:i[0].replace(se," ")}),s=s.slice(r.length));for(a in T.filter)!(i=pe[a].exec(s))||l[a]&&!(i=l[a](i))||(r=i.shift(),o.push({value:r,type:a,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):z(e,u).slice(0)},k=t.compile=function(e,t){var n,r=[],i=[],o=X[e+" "];if(!o){for(t||(t=N(e)),n=t.length;n--;)o=v(t[n]),o[P]?r.push(o):i.push(o);o=X(e,x(i,r)),o.selector=e}return o},S=t.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,f=!r&&N(e=l.selector||e);if(n=n||[],1===f.length){if(o=f[0]=f[0].slice(0),o.length>2&&"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="<a href='#'></a>","#"===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="<input/>",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;t<i;t++)if(pe.contains(r[t],this))return!0}));for(t=0;t<i;t++)pe.find(e,r[t],n);return n=this.pushStack(i>1?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<r;t++)if(pe.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=we.test(e)||"string"!=typeof e?pe(e,t||this.context):0;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-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<a.length;)a[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=a.length,n=!1);e.memory||(n=!1),t=!1,i&&(a=n?[]:"")},c={add:function(){return a&&(n&&!t&&(u=a.length-1,s.push(n)),function r(t){pe.each(t,function(t,n){pe.isFunction(n)?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==pe.type(n)&&r(n)})}(arguments),n&&!t&&l()),this},remove:function(){return pe.each(arguments,function(e,t){for(var n;(n=pe.inArray(t,a,n))>-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);i<a;i++)o[i]&&pe.isFunction(o[i].promise)?o[i].promise().progress(l(i,n,t)).done(l(i,r,o)).fail(u.reject):--s;return s||u.resolveWith(r,o),u.promise()}});var je;pe.fn.ready=function(e){return pe.ready.promise().done(e),this},pe.extend({isReady:!1,readyWait:1,holdReady:function(e){e?pe.readyWait++:pe.ready(!0)},ready:function(e){(e===!0?--pe.readyWait:pe.isReady)||(pe.isReady=!0,e!==!0&&--pe.readyWait>0||(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<n?pe.queue(this[0],e):void 0===t?this:this.each(function(){var n=pe.queue(this,e,t);pe._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&pe.dequeue(this,e)})},dequeue:function(e){return this.each(function(){pe.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=pe.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";a--;)n=pe._data(o[a],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}}),function(){var e;fe.shrinkWrapBlocks=function(){if(null!=e)return e;e=!1;var t,n,r;return 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="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",t.appendChild(re.createElement("div")).style.width="5px",e=3!==t.offsetWidth),n.removeChild(r),e):void 0}}();var Fe=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Me=new RegExp("^(?:([+-])=|)("+Fe+")([a-z%]*)$","i"),Oe=["Top","Right","Bottom","Left"],Re=function(e,t){return e=t||e,"none"===pe.css(e,"display")||!pe.contains(e.ownerDocument,e)},Pe=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===pe.type(n)){i=!0;for(s in n)Pe(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,pe.isFunction(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(pe(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},Be=/^(?:checkbox|radio)$/i,We=/<([\w:-]+)/,Ie=/^$|\/(?:java|ecma)script/i,$e=/^\s+/,ze="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";!function(){var e=re.createElement("div"),t=re.createDocumentFragment(),n=re.createElement("input");e.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav></:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="<textarea>x</textarea>",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,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:fe.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/<tbody/i;!function(){var t,n,r=re.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(fe[t]=n in e)||(r.setAttribute(n,"t"),fe[t]=r.attributes[n].expando===!1);r=null}();var Ye=/^(?:input|select|textarea)$/i,Je=/^key/,Ge=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ke=/^(?:focusinfocus|focusoutblur)$/,Qe=/^([^.]*)(?:\.(.+)|)/;pe.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe._data(e);if(m){for(n.handler&&(u=n,n=u.handler,i=u.selector),n.guid||(n.guid=pe.guid++),(a=m.events)||(a=m.events={}),(c=m.handle)||(c=m.handle=function(e){return"undefined"==typeof pe||e&&pe.event.triggered===e.type?void 0:pe.event.dispatch.apply(c.elem,arguments)},c.elem=e),t=(t||"").match(De)||[""],s=t.length;s--;)o=Qe.exec(t[s])||[],p=g=o[1],h=(o[2]||"").split(".").sort(),p&&(l=pe.event.special[p]||{},p=(i?l.delegateType:l.bindType)||p,l=pe.event.special[p]||{},f=pe.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&pe.expr.match.needsContext.test(i),namespace:h.join(".")},u),(d=a[p])||(d=a[p]=[],d.delegateCount=0,l.setup&&l.setup.call(e,r,h,c)!==!1||(e.addEventListener?e.addEventListener(p,c,!1):e.attachEvent&&e.attachEvent("on"+p,c))),l.add&&(l.add.call(e,f),f.handler.guid||(f.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,f):d.push(f),pe.event.global[p]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe.hasData(e)&&pe._data(e);if(m&&(c=m.events)){for(t=(t||"").match(De)||[""],l=t.length;l--;)if(s=Qe.exec(t[l])||[],p=g=s[1],h=(s[2]||"").split(".").sort(),p){for(f=pe.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,d=c[p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=d.length;o--;)a=d[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(d.splice(o,1),a.selector&&d.delegateCount--,f.remove&&f.remove.call(e,a));u&&!d.length&&(f.teardown&&f.teardown.call(e,h,m.handle)!==!1||pe.removeEvent(e,p,m.handle),delete c[p])}else for(p in c)pe.event.remove(e,p+t[l],n,r,!0);pe.isEmptyObject(c)&&(delete m.handle,pe._removeData(e,"events"))}},trigger:function(t,n,r,i){var o,a,s,u,l,c,f,d=[r||re],p=ce.call(t,"type")?t.type:t,h=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=c=r=r||re,3!==r.nodeType&&8!==r.nodeType&&!Ke.test(p+pe.event.triggered)&&(p.indexOf(".")>-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<s;n++)o=t[n],i=o.selector+" ",void 0===r[i]&&(r[i]=o.needsContext?pe(i,this).index(u)>-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s<t.length&&a.push({elem:this,handlers:t.slice(s)}),a},fix:function(e){if(e[pe.expando])return e;var t,n,r,i=e.type,o=e,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Ge.test(i)?this.mouseHooks:Je.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new pe.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||re),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,a.filter?a.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget detail 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,t){var n,r,i,o=t.button,a=t.fromElement;return null==e.pageX&&null!=t.clientX&&(r=e.target.ownerDocument||re,i=r.documentElement,n=r.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?t.toElement:a),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==b()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){if(this===b()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(pe.nodeName(this,"input")&&"checkbox"===this.type&&this.click)return this.click(),!1},_default:function(e){return pe.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n){var r=pe.extend(new pe.Event,n,{type:e,isSimulated:!0});pe.event.trigger(r,null,t),r.isDefaultPrevented()&&n.preventDefault()}},pe.removeEvent=re.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)}:function(e,t,n){var r="on"+t;e.detachEvent&&("undefined"==typeof e[r]&&(e[r]=null),e.detachEvent(r,n))},pe.Event=function(e,t){return this instanceof pe.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?v:x):this.type=e,t&&pe.extend(this,t),this.timeStamp=e&&e.timeStamp||pe.now(),void(this[pe.expando]=!0)):new pe.Event(e,t)},pe.Event.prototype={constructor:pe.Event,isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=v,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=v,e&&!this.isSimulated&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=v,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},pe.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){pe.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||pe.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),fe.submit||(pe.event.special.submit={setup:function(){return!pe.nodeName(this,"form")&&void pe.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=pe.nodeName(t,"input")||pe.nodeName(t,"button")?pe.prop(t,"form"):void 0;n&&!pe._data(n,"submit")&&(pe.event.add(n,"submit._submit",function(e){e._submitBubble=!0}),pe._data(n,"submit",!0))})},postDispatch:function(e){e._submitBubble&&(delete e._submitBubble,this.parentNode&&!e.isTrigger&&pe.event.simulate("submit",this.parentNode,e))},teardown:function(){return!pe.nodeName(this,"form")&&void pe.event.remove(this,"._submit")}}),fe.change||(pe.event.special.change={setup:function(){return Ye.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(pe.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._justChanged=!0)}),pe.event.add(this,"click._change",function(e){this._justChanged&&!e.isTrigger&&(this._justChanged=!1),pe.event.simulate("change",this,e)})),!1):void pe.event.add(this,"beforeactivate._change",function(e){var t=e.target;Ye.test(t.nodeName)&&!pe._data(t,"change")&&(pe.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||pe.event.simulate("change",this.parentNode,e)}),pe._data(t,"change",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type)return e.handleObj.handler.apply(this,arguments)},teardown:function(){return pe.event.remove(this,"._change"),!Ye.test(this.nodeName)}}),fe.focusin||pe.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){pe.event.simulate(t,e.target,pe.event.fix(e))};pe.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=pe._data(r,t);i||r.addEventListener(e,n,!0),pe._data(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=pe._data(r,t)-1;i?pe._data(r,t,i):(r.removeEventListener(e,n,!0),pe._removeData(r,t))}}}),pe.fn.extend({on:function(e,t,n,r){return w(this,e,t,n,r)},one:function(e,t,n,r){return w(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,pe(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return t!==!1&&"function"!=typeof t||(n=t,t=void 0),n===!1&&(n=x),this.each(function(){pe.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){pe.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return pe.event.trigger(e,t,n,!0)}});var Ze=/ jQuery\d+="(?:null|\d+)"/g,et=new RegExp("<(?:"+ze+")[\\s/>]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/<script|<style|<link/i,rt=/checked\s*(?:[^=]|=\s*.checked.)/i,it=/^true\/(.*)/,ot=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1></$2>")},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(;n<r;n++)t=this[n]||{},1===t.nodeType&&(pe.cleanData(h(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return S(this,arguments,function(t){var n=this.parentNode;pe.inArray(this,e)<0&&(pe.cleanData(h(this)),
+n&&n.replaceChild(t,this))},e)}}),pe.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){pe.fn[e]=function(e){for(var n,r=0,i=[],o=pe(e),a=o.length-1;r<=a;r++)n=r===a?this:this.clone(!0),pe(o[r])[t](n),ae.apply(i,n.get());return this.pushStack(i)}});var ut,lt={HTML:"block",BODY:"block"},ct=/^margin/,ft=new RegExp("^("+Fe+")(?!px)[a-z%]+$","i"),dt=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},pt=re.documentElement;!function(){function t(){var t,c,f=re.documentElement;f.appendChild(u),l.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",n=i=s=!1,r=a=!0,e.getComputedStyle&&(c=e.getComputedStyle(l),n="1%"!==(c||{}).top,s="2px"===(c||{}).marginLeft,i="4px"===(c||{width:"4px"}).width,l.style.marginRight="50%",r="4px"===(c||{marginRight:"4px"}).marginRight,t=l.appendChild(re.createElement("div")),t.style.cssText=l.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",t.style.marginRight=t.style.width="0",l.style.width="1px",a=!parseFloat((e.getComputedStyle(t)||{}).marginRight),l.removeChild(t)),l.style.display="none",o=0===l.getClientRects().length,o&&(l.style.display="",l.innerHTML="<table><tr><td></td><td>t</td></tr></table>",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;a<i;a++)o[t[a]]=pe.css(e,t[a],!1,r);return o}return void 0!==n?pe.style(e,t,n):pe.css(e,t)},e,t,arguments.length>1)},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<i;r++)n=e[r],$.tweeners[n]=$.tweeners[n]||[],$.tweeners[n].unshift(t)},prefilters:[W],prefilter:function(e,t){t?$.prefilters.unshift(e):$.prefilters.push(e)}}),pe.speed=function(e,t,n){var r=e&&"object"==typeof e?pe.extend({},e):{complete:n||!n&&t||pe.isFunction(e)&&e,duration:e,easing:n&&t||t&&!pe.isFunction(t)&&t};return r.duration=pe.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in pe.fx.speeds?pe.fx.speeds[r.duration]:pe.fx.speeds._default,null!=r.queue&&r.queue!==!0||(r.queue="fx"),r.old=r.complete,r.complete=function(){pe.isFunction(r.old)&&r.old.call(this),r.queue&&pe.dequeue(this,r.queue)},r},pe.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Re).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=pe.isEmptyObject(e),o=pe.speed(t,n,r),a=function(){var t=$(this,pe.extend({},e),o);(i||pe._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=pe.timers,a=pe._data(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&At.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||pe.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=pe._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=pe.timers,a=r?r.length:0;for(n.finish=!0,pe.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),pe.each(["toggle","show","hide"],function(e,t){var n=pe.fn[t];pe.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(P(t,!0),e,r,i)}}),pe.each({slideDown:P("show"),slideUp:P("hide"),slideToggle:P("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){pe.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),pe.timers=[],pe.fx.tick=function(){var e,t=pe.timers,n=0;for(Nt=pe.now();n<t.length;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||pe.fx.stop(),Nt=void 0},pe.fx.timer=function(e){pe.timers.push(e),e()?pe.fx.start():pe.timers.pop()},pe.fx.interval=13,pe.fx.start=function(){kt||(kt=e.setInterval(pe.fx.tick,pe.fx.interval))},pe.fx.stop=function(){e.clearInterval(kt),kt=null},pe.fx.speeds={slow:600,fast:200,_default:400},pe.fn.delay=function(t,n){return t=pe.fx?pe.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e,t=re.createElement("input"),n=re.createElement("div"),r=re.createElement("select"),i=r.appendChild(re.createElement("option"));n=re.createElement("div"),n.setAttribute("className","t"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",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<s;u++)if(n=r[u],(n.selected||u===i)&&(fe.optDisabled?!n.disabled:null===n.getAttribute("disabled"))&&(!n.parentNode.disabled||!pe.nodeName(n.parentNode,"optgroup"))){if(t=pe(n).val(),o)return t;a.push(t)}return a},set:function(e,t){for(var n,r,i=e.options,o=pe.makeArray(t),a=i.length;a--;)if(r=i[a],pe.inArray(pe.valHooks.option.get(r),o)>-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("<div>").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:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],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:"&#x4FE1;&#x606F;",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?'<div class="layui-layer-title" style="'+(f?r.title[1]:"")+'">'+(f?r.title[0]:r.title)+"</div>":"";return r.zIndex=s,t([r.shade?'<div class="layui-layer-shade" id="layui-layer-shade'+a+'" times="'+a+'" style="'+("z-index:"+(s-1)+"; ")+'"></div>':"",'<div class="'+l[0]+(" layui-layer-"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?"":" layui-layer-border")+" "+(r.skin||"")+'" id="'+l[0]+a+'" type="'+o.type[r.type]+'" times="'+a+'" showtime="'+r.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+s+"; width:"+r.area[0]+";height:"+r.area[1]+(r.fixed?"":";position:absolute;")+'">'+(e&&2!=r.type?"":u)+'<div id="'+(r.id||"")+'" class="layui-layer-content'+(0==r.type&&r.icon!==-1?" layui-layer-padding":"")+(3==r.type?" layui-layer-loading"+r.icon:"")+'">'+(0==r.type&&r.icon!==-1?'<i class="layui-layer-ico layui-layer-ico'+r.icon+'"></i>':"")+(1==r.type&&e?"":r.content||"")+'</div><span class="layui-layer-setwin">'+function(){var e=c?'<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>':"";return r.closeBtn&&(e+='<a class="layui-layer-ico '+l[7]+" "+l[7]+(r.title?r.closeBtn:4==r.type?"1":"2")+'" href="javascript:;"></a>'),e}()+"</span>"+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class="'+l[6]+t+'">'+r.btn[t]+"</a>";return'<div class="'+l[6]+" layui-layer-btn-"+(r.btnAlign||"")+'">'+e+"</div>"}():"")+(r.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],u,i('<div class="layui-layer-move"></div>')),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||"","auto"];t.content='<iframe scrolling="'+(t.content[1]||"auto")+'" allowtransparency="true" id="'+l[4]+a+'" name="'+l[4]+a+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+t.content[0]+'"></iframe>';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]+'<i class="layui-layer-TipsG"></i>',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;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(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?'<textarea class="layui-layer-input"'+a+"></textarea>":function(){return'<input type="'+(1==e.formType?"password":"text")+'" class="layui-layer-input">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],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("&#x6700;&#x591A;&#x8F93;&#x5165;"+(e.maxlength||500)+"&#x4E2A;&#x5B57;&#x6570;",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='<span class="'+n+'">'+t[0].title+"</span>";i<e;i++)a+="<span>"+t[i].title+"</span>";return a}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=t.length,i=1,a="";if(e>0)for(a='<li class="layui-layer-tabli '+n+'">'+(t[0].content||"no content")+"</li>";i<e;i++)a+='<li class="layui-layer-tabli">'+(t[i].content||"no  content")+"</li>";return a}()+"</ul>",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("&#x6CA1;&#x6709;&#x56FE;&#x7247;")}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]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+"px",a[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,isOutAnim:!1,skin:"layui-layer-photos"+c("photos"),content:'<div class="layui-layer-phimg"><img src="'+u[d].src+'" alt="'+(u[d].alt||"")+'" layer-pid="'+u[d].pid+'"><div class="layui-layer-imgsee">'+(u.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(a?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(u[d].alt||"")+"</a><em>"+s.imgIndex+"/"+u.length+"</em></span></div></div></div>",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("&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;",{time:3e4,btn:["&#x4E0B;&#x4E00;&#x5F20;","&#x4E0D;&#x770B;&#x4E86;"],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='<li lay-id="'+(i.id||"")+'"'+(i.attr?' lay-attr="'+i.attr+'"':"")+">"+(i.title||"unnaming")+"</li>";return s[0]?s.before(r):n.append(r),o.append('<div class="layui-tab-item">'+(i.content||"")+"</div>"),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('<span class="layui-unselect layui-tab-bar" '+r+"><i "+r+' class="layui-icon">&#xe61a;</i></span>');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 class="layui-icon layui-unselect '+l+'">&#x1006;</i>');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("&#xe602;"),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"&#xe61a;":"&#xe602;"),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('<span class="'+c+'"></span>'),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('<span class="'+y+'"></span>'),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("<span "+i+">"+e+"</span>")}),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('<span class="'+t+'-text">'+l+"</span>")},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('<i class="layui-icon layui-colla-icon">'+(l?"&#xe602;":"&#xe61a;")+"</i>"),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 t=layui.$,i=layui.layer,n=layui.hint(),o=layui.device(),a={config:{},set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,r,e,t)}},l=function(){var e=this;return{upload:function(t){e.upload.call(e,t)},reload:function(t){e.reload.call(e,t)},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 i=this;i.config=t.extend({},i.config,a.config,e),i.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var i=this,e=i.config;e.elem=t(e.elem),e.bindAction=t(e.bindAction),i.file(),i.events()},p.prototype.file=function(){var e=this,i=e.config,n=e.elemFile=t(['<input class="'+u+'" type="file" accept="'+i.acceptMime+'" name="'+i.field+'"',i.multiple?" multiple":"",">"].join("")),a=i.elem.next();(a.hasClass(u)||a.hasClass(c))&&a.remove(),o.ie&&o.ie<10&&i.elem.wrap('<div class="layui-upload-wrap"></div>'),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(n),o.ie&&o.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,i=e.config,n=t('<iframe id="'+f+'" class="'+f+'" name="'+f+'" frameborder="0"></iframe>'),o=t(['<form target="'+f+'" class="'+c+'" method="post" key="set-mine" enctype="multipart/form-data" action="'+i.url+'">',"</form>"].join(""));t("#"+f)[0]||t("body").append(n),i.elem.next().hasClass(c)||(e.elemFile.wrap(o),i.elem.next("."+c).append(function(){var e=[];return layui.each(i.data,function(t,i){i="function"==typeof i?i():i,e.push('<input type="hidden" name="'+t+'" value="'+i+'">')}),e.join("")}()))},p.prototype.msg=function(e){return i.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 t=this;window.FileReader&&layui.each(t.chooseFiles,function(t,i){var n=new FileReader;n.readAsDataURL(i),n.onload=function(){e&&e(t,i,this.result)}})},p.prototype.upload=function(e,i){var n,a=this,l=a.config,r=a.elemFile[0],u=function(){var i=0,n=0,o=e||a.files||a.chooseFiles||r.files,u=function(){l.multiple&&i+n===a.fileLength&&"function"==typeof l.allDone&&l.allDone({total:a.fileLength,successful:i,aborted:n})};layui.each(o,function(e,o){var r=new FormData;r.append(l.field,o),layui.each(l.data,function(e,t){t="function"==typeof t?t():t,r.append(e,t)});var c={url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(t){i++,d(e,t),u()},error:function(){n++,a.msg("请求上传接口出现异常"),m(e),u()}};"function"==typeof l.progress&&(c.xhr=function(){var e=t.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=Math.floor(e.loaded/e.total*100);l.progress(t,l.item[0],e)}}),e}),t.ajax(c)})},c=function(){var e=t("#"+f);a.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var t,i=e.contents().find("body");try{t=i.text()}catch(n){a.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}t&&(clearInterval(p.timer),i.html(""),d(0,t))},30)},d=function(e,t){if(a.elemFile.next("."+s).remove(),r.value="","object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(t,e||0,function(e){a.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){a.upload(e)})},h=l.exts,v=function(){var t=[];return layui.each(e||a.chooseFiles,function(e,i){t.push(i.name)}),t}(),g={preview:function(e){a.preview(e)},upload:function(e,t){var i={};i[e]=t,a.upload(i)},pushFile:function(){return a.files=a.files||{},layui.each(a.chooseFiles,function(e,t){a.files[e]=t}),a.files},resetFile:function(e,t,i){var n=new File([t],i);a.files=a.files||{},a.files[e]=n}},y=function(){if("choose"!==i&&!l.auto||(l.choose&&l.choose(g),"choose"!==i))return l.before&&l.before(g),o.ie?o.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 a.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return a.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return a.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,t){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(t))||(n=!0)}),n)return a.msg("选择的图片中包含不支持的格式"),r.value=""}if(a.fileLength=function(){var t=0,i=e||a.files||a.chooseFiles||r.files;return layui.each(i,function(){t++}),t}(),l.number&&a.fileLength>l.number)return a.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(o.ie&&o.ie<10)){var F;if(layui.each(a.chooseFiles,function(e,t){if(t.size>1024*l.size){var i=l.size/1024;i=i>=1?i.toFixed(2)+"MB":l.size+"KB",r.value="",F=i}}),F)return a.msg("文件不能超过"+F)}y()}},p.prototype.reload=function(e){e=e||{},delete e.elem,delete e.bindAction;var i=this,e=i.config=t.extend({},i.config,a.config,e),n=e.elem.next();n.attr({name:e.name,accept:e.acceptMime,multiple:e.multiple})},p.prototype.events=function(){var e=this,i=e.config,a=function(t){e.chooseFiles={},layui.each(t,function(t,i){var n=(new Date).getTime();e.chooseFiles[n+"-"+t]=i})},l=function(t,n){var o=e.elemFile,a=t.length>1?t.length+"个文件":(t[0]||{}).name||o[0].value.match(/[^\/\\]+\..+/g)||[]||"";o.next().hasClass(s)&&o.next().remove(),e.upload(null,"choose"),e.isFile()||i.choose||o.after('<span class="layui-inline '+s+'">'+a+"</span>")};i.elem.off("upload.start").on("upload.start",function(){var o=t(this),a=o.attr("lay-data");if(a)try{a=new Function("return "+a)(),e.config=t.extend({},i,a)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+a)}e.config.item=o,e.elemFile[0].click()}),o.ie&&o.ie<10||i.elem.off("upload.over").on("upload.over",function(){var e=t(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=t(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,o){var r=t(this),u=o.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),a(u),i.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var t=this.files||[];a(t),i.auto?e.upload():l(t)}),i.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),i.elem.data("haveEvents")||(e.elemFile.on("change",function(){t(this).trigger("upload.change")}),i.elem.on("click",function(){e.isFile()||t(this).trigger("upload.start")}),i.drag&&i.elem.on("dragover",function(e){e.preventDefault(),t(this).trigger("upload.over")}).on("dragleave",function(e){t(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),t(this).trigger("upload.drop",e)}),i.bindAction.on("click",function(){t(this).trigger("upload.action")}),i.elem.data("haveEvents",!0))},a.render=function(e){var t=new p(e);return l.call(t)},e(r,a)});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.max<t.min&&(t.max=t.min+t.step),t.range){t.value="object"==typeof t.value?t.value:[t.min,t.value];var a=Math.min(t.value[0],t.value[1]),n=Math.max(t.value[0],t.value[1]);t.value[0]=a>t.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.value<t.min&&(t.value=t.min),t.value>t.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='<div class="layui-slider '+("vertical"===t.type?"layui-slider-vertical":"")+'">'+(t.tips?'<div class="layui-slider-tips"></div>':"")+'<div class="layui-slider-bar" style="background:'+p+"; "+("vertical"===t.type?"height":"width")+":"+m+";"+("vertical"===t.type?"bottom":"left")+":"+(r||0)+';"></div><div class="layui-slider-wrap" style="'+("vertical"===t.type?"bottom":"left")+":"+(r||m)+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+p+';"></div></div>'+(t.range?'<div class="layui-slider-wrap" style="'+("vertical"===t.type?"bottom":"left")+":"+v+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+p+';"></div></div>':"")+"</div>",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<g+1;x++){var T=100*x/g;T<100&&(b+='<div class="layui-slider-step" style="'+("vertical"===t.type?"bottom":"left")+":"+T+'%"></div>')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('<div class="layui-slider-input layui-input"><div class="layui-slider-input-txt"><input type="text" class="layui-input"></div><div class="layui-slider-input-btn"><i class="layui-icon layui-icon-up"></i><i class="layui-icon layui-icon-down"></i></div></div>');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(['<div class="layui-auxiliar-moving" id="LAY-slider-moving"></div'].join("")),M=function(e,t){var a=function(){t&&t(),w.remove()};i("#LAY-slider-moving")[0]||i("body").append(w),w.on("mousemove",e),w.on("mouseup",a).on("mouseleave",a)};if("set"===e)return x(t,a);s.find("."+u).each(function(e){var t=i(this);t.on("mousedown",function(i){i=i||window.event;var a=t.parent()[0].offsetLeft,n=i.clientX;"vertical"===l.type&&(a=f()-t.parent()[0].offsetTop-h.height(),n=i.clientY);var r=function(i){i=i||window.event;var r=a+("vertical"===l.type?n-i.clientY:i.clientX-n);r<0&&(r=0),r>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.step<l.min?l.min:Number(g)-l.step:Number(g)+l.step>l.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=e<l.min?l.min:e,e=e>l.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)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['<div class="layui-unselect layui-colorpicker">',"<span "+("rgb"==o.format&&o.alpha?'class="layui-colorpicker-trigger-bgcolor"':"")+">",'<span class="layui-colorpicker-trigger-span" ','lay-type="'+("rgb"==o.format?o.alpha?"rgba":"torgb":"")+'" ','style="'+function(){var e="";return o.color?(e=o.color,(o.color.match(/[0-9]{1,3}/g)||[]).length>3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','<i class="layui-icon layui-colorpicker-trigger-i '+(o.color?a:s)+'"></i>',"</span>","</span>","</div>"].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['<div id="layui-colorpicker'+e.index+'" data-index="'+e.index+'" class="layui-anim layui-anim-upbit layui-colorpicker-main">','<div class="layui-colorpicker-main-wrapper">','<div class="layui-colorpicker-basis">','<div class="layui-colorpicker-basis-white"></div>','<div class="layui-colorpicker-basis-black"></div>','<div class="layui-colorpicker-basis-cursor"></div>',"</div>",'<div class="layui-colorpicker-side">','<div class="layui-colorpicker-side-slider"></div>',"</div>","</div>",'<div class="layui-colorpicker-main-alpha '+(o.alpha?n:"")+'">','<div class="layui-colorpicker-alpha-bgcolor">','<div class="layui-colorpicker-alpha-slider"></div>',"</div>","</div>",function(){if(o.predefine){var e=['<div class="layui-colorpicker-main-pre">'];return layui.each(o.colors,function(i,o){e.push(['<div class="layui-colorpicker-pre'+((o.match(/[0-9]{1,3}/g)||[]).length>3?" layui-colorpicker-pre-isalpha":"")+'">','<div style="background:'+o+'"></div>',"</div>"].join(""))}),e.push("</div>"),e.join("")}return""}(),'<div class="layui-colorpicker-main-input">','<div class="layui-inline">','<input type="text" class="layui-input">',"</div>",'<div class="layui-btn-container">','<button class="layui-btn layui-btn-primary layui-btn-sm" colorpicker-events="clear">清空</button>','<button class="layui-btn layui-btn-sm" colorpicker-events="confirm">确定</button>',"</div","</div>","</div>"].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:f<s&&(f=s),d+l+s>a()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['<div class="layui-auxiliar-moving" id="LAY-colorpicker-moving"></div'].join("")),Y=function(e){i("#LAY-colorpicker-moving")[0]||i("body").append(M),M.on("mousemove",e),M.on("mouseup",function(){M.remove()}).on("mouseleave",function(){M.remove()})};l.on("mousedown",function(e){var i=this.offsetTop,o=e.clientY,r=function(e){var r=i+(e.clientY-o),t=n[0].offsetHeight;r<0&&(r=0),r>t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)});layui.define("layer",function(e){"use strict";var t=layui.$,i=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 i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=this,n=t(r+'[lay-filter="'+e+'"]');return n.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value==t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e),a.getValue(e)},u.prototype.getValue=function(e,i){i=i||t(r+'[lay-filter="'+e+'"]').eq(0);var a={},n={},l=i.find("input,select,textarea");return layui.each(l,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];a[i]=0|a[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(n[t.name]=t.value)}}),n},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),g=i.find("dl"),x=g.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=g.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),x.removeClass(o),y=null,x.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),T()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||$(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},T=function(){var e=g.children("dd."+s);if(e[0]){var t=e.position().top,i=g.height(),a=e.height();t>i&&g.scrollTop(t+g.scrollTop()-i+a-5),t<0&&g.scrollTop(t+g.scrollTop()-5)}};m.on("click",function(e){i.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 t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=g.children("dd."+s);if(g.children("dd."+o)[0]&&"next"===t){var i=g.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n<e.index()&&!i.hasClass(s))return i.eq(0).prev()[0]?i.eq(0).prev():g.children(":last")}return a&&a[0]?a:y&&y[0]?y:e}();return l=r[t](),n=r[t]("dd:not(."+o+")"),l[0]?(y=r[t](),n[0]&&!n.hasClass(c)||!y[0]?(n.addClass(s).siblings().removeClass(s),void T()):i(t,y)):y=null};38===t&&i("prev"),40===t&&i("next"),13===t&&(e.preventDefault(),g.children("dd."+s).trigger("click"))});var $=function(e,i,a){var n=0;layui.each(x,function(){var i=t(this),l=i.text(),r=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:r)&&n++,"keyup"===a&&i[r?"addClass":"removeClass"](o)});var l=n===x.length;return i(l),l},q=function(e){var t=this.value,i=e.keyCode;return 9!==i&&13!==i&&37!==i&&38!==i&&39!==i&&40!==i&&($(t,function(e){e?g.find("."+r)[0]||g.append('<p class="'+r+'">无匹配项</p>'):g.find("."+r).remove()},"keyup"),""===t&&g.find("."+r).remove(),void T())};f&&k.on("keyup",q).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){$(k.val(),function(e){d||k.val("")},"blur")},200)}),x.on("click",function(){var e=t(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:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(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?i:v.innerHTML||i:i,m=t(['<div class="'+(h?"":"layui-unselect ")+a,(u?" layui-select-disabled":"")+'">','<div class="'+n+'">','<input type="text" placeholder="'+p+'" '+('value="'+(d?f.html():"")+'"')+(!u&&h?"":" readonly")+' class="layui-input'+(h?"":" layui-unselect")+(u?" "+c:"")+'">','<i class="layui-edge"></i></div>','<dl class="layui-anim layui-anim-upbit'+(r.find("optgroup")[0]?" layui-select-group":"")+'">',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("<dt>"+a.label+"</dt>"):t.push('<dd lay-value="'+a.value+'" class="'+(d===a.value?s:"")+(a.disabled?" "+c:"")+'">'+a.innerHTML+"</dd>"):t.push('<dd lay-value="" class="layui-select-tips">'+(a.innerHTML||i)+"</dd>")}),0===t.length&&t.push('<dd lay-value="" class="'+c+'">没有选项</dd>'),t.join("")}(r.find("*"))+"</dl>","</div>"].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"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(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=t(['<div class="layui-unselect '+u[0],n.checked?" "+u[1]:"",o?" layui-checkbox-disbaled "+c:"",'"',r?' lay-skin="'+r+'"':"",">",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?"<span>"+n.title+"</span>":"",'<i class="layui-icon layui-icon-ok"></i>'].join(""),_switch:"<em>"+((n.checked?s[0]:s[1])||"")+"</em><i></i>"};return t[r]||t.checkbox}(),"</div>"].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["&#xe643;","&#xe63f;"],a=u.find("input[type=radio]"),n=function(a){var n=t(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=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[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=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['<div class="layui-unselect '+e,l.checked?" "+e+"ed":"",(o?" layui-radio-disbaled "+c:"")+'">','<i class="layui-anim layui-icon">'+i[l.checked?0:1]+"</i>","<div>"+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"</div>","</div>"].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=null,a=f.config.verify,s="layui-form-danger",o={},c=t(this),u=c.parents(r),d=u.find("*[lay-verify]"),v=c.parents("form")[0],h=c.attr("lay-filter");return layui.each(d,function(l,r){var o=t(this),c=o.attr("lay-verify").split("|"),u=o.attr("lay-verType"),d=o.val();if(o.removeClass(s),layui.each(c,function(t,l){var c,f="",v="function"==typeof a[l];if(a[l]){var c=v?f=a[l](d,r):!a[l][0].test(d);if(f=f||a[l][1],"required"===l&&(f=o.attr("lay-reqText")||f),c)return"tips"===u?i.tips(f,function(){return"string"==typeof o.attr("lay-ignore")||"select"!==r.tagName.toLowerCase()&&!/^checkbox|radio$/.test(r.type)?o:o.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||setTimeout(function(){r.focus()},7),o.addClass(s),e=!0}}),e)return e}),!e&&(o=f.getValue(null,u),layui.event.call(this,l,"submit("+h+")",{elem:this,form:v,field:o}))},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(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("form",function(e){"use strict";var i=layui.$,a=layui.form,n=layui.layer,t="tree",r={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var a=this;return a.config=i.extend({},a.config,e),a},on:function(e,i){return layui.onevent.call(this,t,e,i)}},l=function(){var e=this,i=e.config,a=i.id||e.index;return l.that[a]=e,l.config[a]=i,{config:i,reload:function(i){e.reload.call(e,i)},getChecked:function(){return e.getChecked.call(e)},setChecked:function(i){return e.setChecked.call(e,i)}}},c="layui-hide",d="layui-disabled",s="layui-tree-set",o="layui-tree-iconClick",h="layui-icon-addition",u="layui-icon-subtraction",p="layui-tree-entry",f="layui-tree-main",y="layui-tree-txt",v="layui-tree-pack",C="layui-tree-spread",k="layui-tree-setLineShort",m="layui-tree-showLine",x="layui-tree-lineExtend",b=function(e){var a=this;a.index=++r.index,a.config=i.extend({},a.config,r.config,e),a.render()};b.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"未命名",none:"无数据"}},b.prototype.reload=function(e){var a=this;layui.each(e,function(e,i){i.constructor===Array&&delete a.config[e]}),a.config=i.extend(!0,{},a.config,e),a.render()},b.prototype.render=function(){var e=this,a=e.config;e.checkids=[];var n=i('<div class="layui-tree'+(a.showCheckbox?" layui-form":"")+(a.showLine?" layui-tree-line":"")+'" lay-filter="LAY-tree-'+e.index+'"></div>');e.tree(n);var t=a.elem=i(a.elem);if(t[0]){if(e.key=a.id||e.index,e.elem=n,e.elemNone=i('<div class="layui-tree-emptyText">'+a.text.none+"</div>"),t.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);a.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=i(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(k),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(k)}),e.events()}},b.prototype.renderForm=function(e){a.render(e,"LAY-tree-"+this.index)},b.prototype.tree=function(e,a){var n=this,t=n.config,r=a||t.data;layui.each(r,function(a,r){var l=r.children&&r.children.length>0,o=i('<div class="layui-tree-pack" '+(r.spread?'style="display: block;"':"")+'"></div>'),h=i(['<div data-id="'+r.id+'" class="layui-tree-set'+(r.spread?" layui-tree-spread":"")+(r.checked?" layui-tree-checkedFirst":"")+'">','<div class="layui-tree-entry">','<div class="layui-tree-main">',function(){return t.showLine?l?'<span class="layui-tree-iconClick layui-tree-icon"><i class="layui-icon '+(r.spread?"layui-icon-subtraction":"layui-icon-addition")+'"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-icon layui-icon-file"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-tree-iconArrow '+(l?"":c)+'"></i></span>'}(),function(){return t.showCheckbox?'<input type="checkbox" name="'+(r.field||"layuiTreeCheck_"+r.id)+'" same="layuiTreeCheck" lay-skin="primary" '+(r.disabled?"disabled":"")+' value="'+r.id+'">':""}(),function(){return t.isJump&&r.href?'<a href="'+r.href+'" target="_blank" class="'+y+'">'+(r.title||r.label||t.text.defaultNodeName)+"</a>":'<span class="'+y+(r.disabled?" "+d:"")+'">'+(r.title||r.label||t.text.defaultNodeName)+"</span>"}(),"</div>",function(){if(!t.edit)return"";var e={add:'<i class="layui-icon layui-icon-add-1"  data-type="add"></i>',update:'<i class="layui-icon layui-icon-edit" data-type="update"></i>',del:'<i class="layui-icon layui-icon-delete" data-type="del"></i>'},i=['<div class="layui-btn-group layui-tree-btnGroup">'];return t.edit===!0&&(t.edit=["update","del"]),"object"==typeof t.edit?(layui.each(t.edit,function(a,n){i.push(e[n]||"")}),i.join("")+"</div>"):void 0}(),"</div></div>"].join(""));l&&(h.append(o),n.tree(o,r.children)),e.append(h),h.prev("."+s)[0]&&h.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),l||h.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),n.spread(h,r),t.showCheckbox&&(r.checked&&n.checkids.push(r.id),n.checkClick(h,r)),t.edit&&n.operate(h,r)})},b.prototype.spread=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f),c=r.find("."+o),k=r.find("."+y),m=t.onlyIconControl?c:l,x="";m.on("click",function(i){var a=e.children("."+v),n=m.children(".layui-icon")[0]?m.children(".layui-icon"):m.find(".layui-tree-icon").children(".layui-icon");if(a[0]){if(e.hasClass(C))e.removeClass(C),a.slideUp(200),n.removeClass(u).addClass(h);else if(e.addClass(C),a.slideDown(200),n.addClass(u).removeClass(h),t.accordion){var r=e.siblings("."+s);r.removeClass(C),r.children("."+v).slideUp(200),r.find(".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)}}else x="normal"}),k.on("click",function(){var n=i(this);n.hasClass(d)||(x=e.hasClass(C)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:e,state:x,data:a}))})},b.prototype.setCheckbox=function(e,i,a){var n=this,t=(n.config,a.prop("checked"));if(!a.prop("disabled")){if("object"==typeof i.children||e.find("."+v)[0]){var r=e.find("."+v).find('input[same="layuiTreeCheck"]');r.each(function(){this.disabled||(this.checked=t)})}var l=function(e){if(e.parents("."+s)[0]){var i,a=e.parent("."+v),n=a.parent(),r=a.prev().find('input[same="layuiTreeCheck"]');t?r.prop("checked",t):(a.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||r.prop("checked",!1)),l(n)}};l(e),n.renderForm("checkbox")}},b.prototype.checkClick=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f);l.on("click",'input[same="layuiTreeCheck"]+',function(r){layui.stope(r);var l=i(this).prev(),c=l.prop("checked");l.prop("disabled")||(n.setCheckbox(e,a,l),t.oncheck&&t.oncheck({elem:e,checked:c,data:a}))})},b.prototype.operate=function(e,a){var t=this,r=t.config,l=e.children("."+p),d=l.children("."+f);l.children(".layui-tree-btnGroup").on("click",".layui-icon",function(l){layui.stope(l);var f=i(this).data("type"),b=e.children("."+v),g={data:a,type:f,elem:e};if("add"==f){b[0]||(r.showLine?(d.find("."+o).addClass("layui-tree-icon"),d.find("."+o).children(".layui-icon").addClass(h).removeClass("layui-icon-file")):d.find(".layui-tree-iconArrow").removeClass(c),e.append('<div class="layui-tree-pack"></div>'));var w=r.operate&&r.operate(g),N={};if(N.title=r.text.defaultNodeName,N.id=w,t.tree(e.children("."+v),[N]),r.showLine)if(b[0])b.hasClass(x)||b.addClass(x),e.find("."+v).each(function(){i(this).children("."+s).last().addClass(k)}),b.children("."+s).last().prev().hasClass(k)?b.children("."+s).last().prev().removeClass(k):b.children("."+s).last().removeClass(k),!e.parent("."+v)[0]&&e.next()[0]&&b.children("."+s).last().removeClass(k);else{var T=e.siblings("."+s),L=1,A=e.parent("."+v);layui.each(T,function(e,a){i(a).children("."+v)[0]||(L=0)}),1==L?(T.children("."+v).addClass(m),T.children("."+v).children("."+s).removeClass(k),e.children("."+v).addClass(m),A.removeClass(x),A.children("."+s).last().children("."+v).children("."+s).last().addClass(k)):e.children("."+v).children("."+s).addClass(k)}if(!r.showCheckbox)return;if(d.find('input[same="layuiTreeCheck"]')[0].checked){var I=e.children("."+v).children("."+s).last();I.find('input[same="layuiTreeCheck"]')[0].checked=!0}t.renderForm("checkbox")}else if("update"==f){var F=d.children("."+y).html();d.children("."+y).html(""),d.append('<input type="text" class="layui-tree-editInput">'),d.children(".layui-tree-editInput").val(F).focus();var j=function(e){var i=e.val().trim();i=i?i:r.text.defaultNodeName,e.remove(),d.children("."+y).html(i),g.data.title=i,r.operate&&r.operate(g)};d.children(".layui-tree-editInput").blur(function(){j(i(this))}),d.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),j(i(this)))})}else n.confirm('确认删除该节点 "<span style="color: #999;">'+(a.title||"")+'</span>" 吗?',function(a){if(r.operate&&r.operate(g),g.status="remove",n.close(a),!e.prev("."+s)[0]&&!e.next("."+s)[0]&&!e.parent("."+v)[0])return e.remove(),void t.elem.append(t.elemNone);if(e.siblings("."+s).children("."+p)[0]){if(r.showCheckbox){var l=function(e){if(e.parents("."+s)[0]){var a=e.siblings("."+s).children("."+p),n=e.parent("."+v).prev(),r=n.find('input[same="layuiTreeCheck"]')[0],c=1,d=0;0==r.checked&&(a.each(function(e,a){var n=i(a).find('input[same="layuiTreeCheck"]')[0];0!=n.checked||n.disabled||(c=0),n.disabled||(d=1)}),1==c&&1==d&&(r.checked=!0,t.renderForm("checkbox"),l(n.parent("."+s))))}};l(e)}if(r.showLine){var d=e.siblings("."+s),h=1,f=e.parent("."+v);layui.each(d,function(e,a){i(a).children("."+v)[0]||(h=0)}),1==h?(b[0]||(f.removeClass(x),d.children("."+v).addClass(m),d.children("."+v).children("."+s).removeClass(k)),e.next()[0]?f.children("."+s).last().children("."+v).children("."+s).last().addClass(k):e.prev().children("."+v).children("."+s).last().addClass(k),e.next()[0]||e.parents("."+s)[1]||e.parents("."+s).eq(0).next()[0]||e.prev("."+s).addClass(k)):!e.next()[0]&&e.hasClass(k)&&e.prev().addClass(k)}}else{var y=e.parent("."+v).prev();if(r.showLine){y.find("."+o).removeClass("layui-tree-icon"),y.find("."+o).children(".layui-icon").removeClass(u).addClass("layui-icon-file");var w=y.parents("."+v).eq(0);w.addClass(x),w.children("."+s).each(function(){i(this).children("."+v).children("."+s).last().addClass(k)})}else y.find(".layui-tree-iconArrow").addClass(c);e.parents("."+s).eq(0).removeClass(C),e.parent("."+v).remove()}e.remove()})})},b.prototype.events=function(){var e=this,a=e.config;e.elem.find(".layui-tree-checkedFirst");e.setChecked(e.checkids),e.elem.find(".layui-tree-search").on("keyup",function(){var n=i(this),t=n.val(),r=n.nextAll(),l=[];r.find("."+y).each(function(){var e=i(this).parents("."+p);if(i(this).html().indexOf(t)!=-1){l.push(i(this).parent());var a=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+v)[0]&&a(e.parent("."+v).parent("."+s))};a(e.parent("."+s))}}),r.find("."+p).each(function(){var e=i(this).parent("."+s);e.hasClass("layui-tree-searchShow")||e.addClass(c)}),0==r.find(".layui-tree-searchShow").length&&e.elem.append(e.elemNone),a.onsearch&&a.onsearch({elem:l})}),e.elem.find(".layui-tree-search").on("keydown",function(){i(this).nextAll().find("."+p).each(function(){var e=i(this).parent("."+s);e.removeClass("layui-tree-searchShow "+c)}),i(".layui-tree-emptyText")[0]&&i(".layui-tree-emptyText").remove()})},b.prototype.getChecked=function(){var e=this,a=e.config,n=[],t=[];e.elem.find(".layui-form-checked").each(function(){n.push(i(this).prev()[0].value)});var r=function(e,a){layui.each(e,function(e,t){layui.each(n,function(e,n){if(t.id==n){var l=i.extend({},t);return delete l.children,a.push(l),t.children&&(l.children=[],r(t.children,l.children)),!0}})})};return r(i.extend({},a.data),t),t},b.prototype.setChecked=function(e){var a=this;a.config;a.elem.find("."+s).each(function(a,n){var t=i(this).data("id"),r=i(n).children("."+p).find('input[same="layuiTreeCheck"]'),l=r.next();if("number"==typeof e){if(t==e)return r[0].checked||l.click(),!1}else"object"==typeof e&&layui.each(e,function(e,i){if(i==t&&!r[0].checked)return l.click(),!0})})},l.that={},l.config={},r.reload=function(e,i){var a=l.that[e];return a.reload(i),l.call(a)},r.getChecked=function(e){var i=l.that[e];return i.getChecked()},r.setChecked=function(e,i){var a=l.that[e];return a.setChecked(i)},r.render=function(e){var i=new b(e);return l.call(i)},e(t,r)});layui.define(["laytpl","form"],function(e){"use strict";var a=layui.$,t=layui.laytpl,n=layui.form,i="transfer",l={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=a.extend({},t.config,e),t},on:function(e,a){return layui.onevent.call(this,i,e,a)}},r=function(){var e=this,a=e.config,t=a.id||e.index;return r.that[t]=e,r.config[t]=a,{config:a,reload:function(a){e.reload.call(e,a)},getData:function(){return e.getData.call(e)}}},c="layui-hide",o="layui-btn-disabled",d="layui-none",s="layui-transfer-box",u="layui-transfer-header",h="layui-transfer-search",f="layui-transfer-active",y="layui-transfer-data",p=function(e){return e=e||{},['<div class="layui-transfer-box" data-index="'+e.index+'">','<div class="layui-transfer-header">','<input type="checkbox" name="'+e.checkAllName+'" lay-filter="layTransferCheckbox" lay-type="all" lay-skin="primary" title="{{ d.data.title['+e.index+"] || 'list"+(e.index+1)+"' }}\">","</div>","{{# if(d.data.showSearch){ }}",'<div class="layui-transfer-search">','<i class="layui-icon layui-icon-search"></i>','<input type="input" class="layui-input" placeholder="关键词搜索">',"</div>","{{# } }}",'<ul class="layui-transfer-data"></ul>',"</div>"].join("")},v=['<div class="layui-transfer layui-form layui-border-box" lay-filter="LAY-transfer-{{ d.index }}">',p({index:0,checkAllName:"layTransferLeftCheckAll"}),'<div class="layui-transfer-active">','<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="0">','<i class="layui-icon layui-icon-next"></i>',"</button>",'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="1">','<i class="layui-icon layui-icon-prev"></i>',"</button>","</div>",p({index:1,checkAllName:"layTransferRightCheckAll"}),"</div>"].join(""),x=function(e){var t=this;t.index=++l.index,t.config=a.extend({},t.config,l.config,e),t.render()};x.prototype.config={title:["列表一","列表二"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"无数据",searchNone:"无匹配数据"}},x.prototype.reload=function(e){var t=this;layui.each(e,function(e,a){a.constructor===Array&&delete t.config[e]}),t.config=a.extend(!0,{},t.config,e),t.render()},x.prototype.render=function(){var e=this,n=e.config,i=e.elem=a(t(v).render({data:n,index:e.index})),l=n.elem=a(n.elem);l[0]&&(n.data=n.data||[],n.value=n.value||[],e.key=n.id||e.index,l.html(e.elem),e.layBox=e.elem.find("."+s),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+h),e.layData=i.find("."+y),e.layBtn=i.find("."+f+" .layui-btn"),e.layBox.css({width:n.width,height:n.height}),e.layData.css({height:function(){return n.height-e.layHeader.outerHeight()-e.laySearch.outerHeight()-2}()}),e.renderData(),e.events())},x.prototype.renderData=function(){var e=this,a=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,n=["<li>",'<input type="checkbox" name="'+a[t].checkName+'" lay-skin="primary" lay-filter="layTransferCheckbox" title="'+e.title+'"'+(e.disabled?" disabled":"")+(e.checked?" checked":"")+' value="'+e.value+'">',"</li>"].join("");a[t].views.push(n),delete e.selected}),e.layData.eq(0).html(a[0].views.join("")),e.layData.eq(1).html(a[1].views.join("")),e.renderCheckBtn()},x.prototype.renderForm=function(e){n.render(e,"LAY-transfer-"+this.index)},x.prototype.renderCheckBtn=function(e){var t=this,n=t.config;e=e||{},t.layBox.each(function(i){var l=a(this),r=l.find("."+y),d=l.find("."+u).find('input[type="checkbox"]'),s=r.find('input[type="checkbox"]'),h=0,f=!1;if(s.each(function(){var e=a(this).data("hide");(this.checked||this.disabled||e)&&h++,this.checked&&!e&&(f=!0)}),d.prop("checked",f&&h===s.length),t.layBtn.eq(i)[f?"removeClass":"addClass"](o),!e.stopNone){var p=r.children("li:not(."+c+")").length;t.noneView(r,p?"":n.text.none)}}),t.renderForm("checkbox")},x.prototype.noneView=function(e,t){var n=a('<p class="layui-none">'+(t||"")+"</p>");e.find("."+d)[0]&&e.find("."+d).remove(),t.replace(/\s/g,"")&&e.append(n)},x.prototype.setValue=function(){var e=this,t=e.config,n=[];return e.layBox.eq(1).find("."+y+' input[type="checkbox"]').each(function(){var e=a(this).data("hide");e||n.push(this.value)}),t.value=n,e},x.prototype.parseData=function(e){var t=this,n=t.config,i=[];return layui.each(n.data,function(t,l){l=("function"==typeof n.parseData?n.parseData(l):l)||l,i.push(l=a.extend({},l)),layui.each(n.value,function(e,a){a==l.value&&(l.selected=!0)}),e&&e(l)}),n.data=i,t},x.prototype.getData=function(e){var a=this,t=a.config,n=[];return a.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&n.push(t)})}),n},x.prototype.events=function(){var e=this,t=e.config;e.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var t=a(this).prev(),n=t[0].checked,i=t.parents("."+s).eq(0).find("."+y);t[0].disabled||("all"===t.attr("lay-type")&&i.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=n)}),e.renderCheckBtn({stopNone:!0}))}),e.layBtn.on("click",function(){var n=a(this),i=n.data("index"),l=e.layBox.eq(i),r=[];if(!n.hasClass(o)){e.layBox.eq(i).each(function(t){var n=a(this),i=n.find("."+y);i.children("li").each(function(){var t=a(this),n=t.find('input[type="checkbox"]'),i=n.data("hide");n[0].checked&&!i&&(n[0].checked=!1,l.siblings("."+s).find("."+y).append(t.clone()),t.remove(),r.push(n[0].value)),e.setValue()})}),e.renderCheckBtn();var c=l.siblings("."+s).find("."+h+" input");""===c.val()||c.trigger("keyup"),t.onchange&&t.onchange(e.getData(r),i)}}),e.laySearch.find("input").on("keyup",function(){var n=this.value,i=a(this).parents("."+h).eq(0).siblings("."+y),l=i.children("li");l.each(function(){var e=a(this),t=e.find('input[type="checkbox"]'),i=t[0].title.indexOf(n)!==-1;e[i?"removeClass":"addClass"](c),t.data("hide",!i)}),e.renderCheckBtn();var r=l.length===i.children("li."+c).length;e.noneView(i,r?t.text.searchNone:"")})},r.that={},r.config={},l.reload=function(e,a){var t=r.that[e];return t.reload(a),r.call(t)},l.getData=function(e){var a=r.that[e];return a.getData()},l.render=function(e){var a=new x(e);return r.call(a)},e(i,l)});layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,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,y,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{config:t,reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)}}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u=function(e,a,l,n){var o=e.templet?function(){return"function"==typeof e.templet?e.templet(l):i(t(e.templet).html()||String(a)).render(l)}():a;return n?t("<div>"+o+"</div>").text():o},y="table",h=".layui-table",f="layui-hide",p="layui-none",v="layui-table-view",m=".layui-table-tool",g=".layui-table-box",b=".layui-table-init",x=".layui-table-header",k=".layui-table-body",C=".layui-table-main",w=".layui-table-fixed",T=".layui-table-fixed-l",A=".layui-table-fixed-r",L=".layui-table-total",N=".layui-table-page",S=".layui-table-sort",R="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<thead>","{{# layui.each(d.data.cols, function(i1, item1){ }}","<tr>","{{# 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"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'<th data-field="{{ item2.field||i2 }}" data-key="{{d.index}}-{{i1}}-{{i2}}" {{# if( item2.parentKey){ }}data-parentkey="{{ item2.parentKey }}"{{# } }} {{# if(item2.minWidth){ }}data-minwidth="{{item2.minWidth}}"{{# } }} '+t+' {{# if(item2.unresize || item2.colGroup){ }}data-unresize="true"{{# } }} class="{{# if(item2.hide){ }}layui-hide{{# } }}{{# if(isSort){ }} layui-unselect{{# } }}{{# if(!item2.field){ }} layui-table-col-special{{# } }}">','<div class="layui-table-cell laytable-cell-',"{{# if(item2.colGroup){ }}","group","{{# } else { }}","{{d.index}}-{{i1}}-{{i2}}",'{{# if(item2.type !== "normal"){ }}'," laytable-cell-{{ item2.type }}","{{# } }}","{{# } }}",'" {{#if(item2.align){}}align="{{item2.align}}"{{#}}}>','{{# if(item2.type === "checkbox"){ }}','<input type="checkbox" name="layTableCheckbox" lay-skin="primary" lay-filter="layTableAllChoose" {{# if(item2[d.data.checkName]){ }}checked{{# }; }}>',"{{# } else { }}",'<span>{{item2.title||""}}</span>',"{{# if(isSort){ }}",'<span class="layui-table-sort layui-inline"><i class="layui-edge layui-table-sort-asc" title="升序"></i><i class="layui-edge layui-table-sort-desc" title="降序"></i></span>',"{{# } }}","{{# } }}","</div>","</th>",e.fixed?"{{# }; }}":"","{{# }); }}","</tr>","{{# }); }}","</thead>","</table>"].join("")},E=['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<tbody></tbody>","</table>"].join(""),z=['<div class="layui-form layui-border-box {{d.VIEW_CLASS}}" lay-filter="LAY-table-{{d.index}}" lay-id="{{ d.data.id }}" style="{{# if(d.data.width){ }}width:{{d.data.width}}px;{{# } }} {{# if(d.data.height){ }}height:{{d.data.height}}px;{{# } }}">',"{{# if(d.data.toolbar){ }}",'<div class="layui-table-tool">','<div class="layui-table-tool-temp"></div>','<div class="layui-table-tool-self"></div>',"</div>","{{# } }}",'<div class="layui-table-box">',"{{# if(d.data.loading){ }}",'<div class="layui-table-init" style="background-color: #fff;">','<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>',"</div>","{{# } }}","{{# var left, right; }}",'<div class="layui-table-header">',_(),"</div>",'<div class="layui-table-body layui-table-main">',E,"</div>","{{# if(left){ }}",'<div class="layui-table-fixed layui-table-fixed-l">','<div class="layui-table-header">',_({fixed:!0}),"</div>",'<div class="layui-table-body">',E,"</div>","</div>","{{# }; }}","{{# if(right){ }}",'<div class="layui-table-fixed layui-table-fixed-r">','<div class="layui-table-header">',_({fixed:"right"}),'<div class="layui-table-mend"></div>',"</div>",'<div class="layui-table-body">',E,"</div>","</div>","{{# }; }}","</div>","{{# if(d.data.totalRow){ }}",'<div class="layui-table-total">','<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>','<tbody><tr><td><div class="layui-table-cell" style="visibility: hidden;">Total</div></td></tr></tbody>',"</table>","</div>","{{# } }}","{{# if(d.data.page){ }}",'<div class="layui-table-page">','<div id="layui-table-page{{d.index}}"></div>',"</div>","{{# } }}","<style>","{{# layui.each(d.data.cols, function(i1, item1){","layui.each(item1, function(i2, item2){ }}",".laytable-cell-{{d.index}}-{{i1}}-{{i2}}{ ","{{# if(item2.width){ }}","width: {{item2.width}}px;","{{# } }}"," }","{{# });","}); }}","</style>","</div>"].join(""),H=t(window),j=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.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")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",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;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+v),o=e.elem=t(i(z).render({VIEW_CLASS:v,data:a,index:e.index}));if(a.index=e.index,e.key=a.id||a.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(m),e.layBox=o.find(g),e.layHeader=o.find(x),e.layMain=o.find(C),e.layBody=o.find(k),e.layFixed=o.find(w),e.layFixLeft=o.find(T),e.layFixRight=o.find(A),e.layTotal=o.find(L),e.layPage=o.find(N),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(x).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio: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])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['<div class="layui-inline" lay-event="add"><i class="layui-icon layui-icon-add-1"></i></div>','<div class="layui-inline" lay-event="update"><i class="layui-icon layui-icon-edit"></i></div>','<div class="layui-inline" lay-event="delete"><i class="layui-icon layui-icon-delete"></i></div>'].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i="string"==typeof t?r[t]:t;i&&d.push('<div class="layui-inline" title="'+i.title+'" lay-event="'+i.layEvent+'"><i class="layui-icon '+i.icon+'"></i></div>')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](f),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&l<s&&(a--,c=s):(c=d.width||0,/\d+%$/.test(c)?(c=Math.floor(parseFloat(c)/100*o),c<s&&(c=s)):c||(d.width=c=0,a++)),d.hide&&(c=0),n+=c)):void r.splice(i,1)})}),o>n&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;e=e||{},delete i.haveInit,e.data&&e.data.constructor===Array&&delete i.config.data,i.config=t.extend(!0,{},i.config,e),i.render()},F.prototype.errorView=function(e){var i=this,a=i.layMain.find("."+p),l=t('<div class="'+p+'">'+(e||"Error")+"</div>");a[0]&&(i.layNone.remove(),a.remove()),i.layFixed.addClass(f),i.layMain.find("tbody").html(""),i.layMain.append(i.layNone=l),d.cache[i.key]=[]},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),i.loading(),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.errorView(t[n.msgName]||'返回的数据不符合规范,正确的成功状态码应为:"'+n.statusName+'": '+n.statusCode)):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.errorView("数据接口请求异常:"+t),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,"object"==typeof a.totalRow&&(c[n.totalRowName]=t.extend({},a.totalRow)),i.renderData(c,e,c[n.countName]),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,y=e[s.response.dataName]||[],h=e[s.response.totalRowName],v=[],m=[],g=[],b=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(y,function(a,l){var o=[],y=[],h=[],p=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,v=s.index+"-"+r.key,m=l[c];if(void 0!==m&&null!==m||(m=""),!r.colGroup){var g=['<td data-field="'+c+'" data-key="'+v+'" '+function(){var e=[];return r.edit&&e.push('data-edit="'+r.edit+'"'),r.align&&e.push('align="'+r.align+'"'),r.templet&&e.push('data-content="'+m+'"'),r.toolbar&&e.push('data-off="true"'),r.event&&e.push('lay-event="'+r.event+'"'),r.style&&e.push('style="'+r.style+'"'),r.minWidth&&e.push('data-minwidth="'+r.minWidth+'"'),e.join(" ")}()+' class="'+function(){var e=[];return r.hide&&e.push(f),r.field||e.push("layui-table-col-special"),e.join(" ")}()+'">','<div class="layui-table-cell laytable-cell-'+function(){return"normal"===r.type?v:v+" laytable-cell-"+r.type}()+'">'+function(){var n=t.extend(!0,{LAY_INDEX:p},l),o=d.config.checkName;switch(r.type){case"checkbox":return'<input type="checkbox" name="layTableCheckbox" lay-skin="primary" '+function(){return r[o]?(l[o]=r[o],r[o]?"checked":""):n[o]?"checked":""}()+">";case"radio":return n[o]&&(e=a),'<input type="radio" name="layTableRadio_'+s.index+'" '+(n[o]?"checked":"")+' lay-type="layTableRadio">';case"numbers":return p}return r.toolbar?i(t(r.toolbar).html()||"").render(n):u(r,m,n)}(),"</div></td>"].join("");o.push(g),r.fixed&&"right"!==r.fixed&&y.push(g),"right"===r.fixed&&h.push(g)}}),v.push('<tr data-index="'+a+'">'+o.join("")+"</tr>"),m.push('<tr data-index="'+a+'">'+y.join("")+"</tr>"),g.push('<tr data-index="'+a+'">'+h.join("")+"</tr>"))}),c.layBody.scrollTop(0),c.layMain.find("."+p).remove(),c.layMain.find("tbody").html(v.join("")),c.layFixLeft.find("tbody").html(m.join("")),c.layFixRight.find("tbody").html(g.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return d.cache[c.key]=y,c.layPage[0==o||0===y.length&&1==n?"addClass":"removeClass"](f),r?b():0===y.length?(c.renderForm(),c.errorView(s.text.none)):(c.layFixed.removeClass(f),b(),c.renderTotal(y,h),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:'<i class="layui-icon">&#xe603;</i>',next:'<i class="layui-icon">&#xe602;</i>',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e,t){var i=this,a=i.config,l={};if(a.totalRow){layui.each(e,function(e,t){0!==t.length&&i.eachCols(function(e,i){var a=i.field||e,n=t[a];i.totalRow&&(l[a]=(l[a]||0)+(parseFloat(n)||0))})}),i.dataTotal={};var n=[];i.eachCols(function(e,o){var r=o.field||e,d=function(){var e=o.totalRowText||"",i=parseFloat(l[r]).toFixed(2),a={};return a[r]=i,i=u(o,i,a),t?t[o.field]||e:o.totalRow?i||e:e}(),c=['<td data-field="'+r+'" data-key="'+a.index+"-"+o.key+'" '+function(){var e=[];return o.align&&e.push('align="'+o.align+'"'),o.style&&e.push('style="'+o.style+'"'),o.minWidth&&e.push('data-minwidth="'+o.minWidth+'"'),e.join(" ")}()+' class="'+function(){var e=[];return o.hide&&e.push(f),o.field||e.push("layui-table-col-special"),e.join(" ")}()+'">','<div class="layui-table-cell laytable-cell-'+function(){var e=a.index+"-"+o.key;return"normal"===o.type?e:e+" laytable-cell-"+o.type}()+'">'+d,"</div></td>"].join("");o.field&&(i.dataTotal[r]=d),n.push(c)}),i.layTotal.find("tbody").html("<tr>"+n.join("")+"</tr>")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},u=c.config,h=u.elem.attr("lay-filter"),f=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"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.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},u.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[u.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,y,"sort("+h+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(b).remove()):(i.layInit=t(['<div class="layui-table-init">','<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>',"</div>"].join("")),i.layBox.append(i.layInit)))},F.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)},F.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)))},F.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(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e-=t.layPage.outerHeight()||41),t.layMain.css("height",e-2))},F.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},F.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]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('<th class="layui-table-patch"><div class="layui-table-cell"></div></th>');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(k).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](f),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,i=this,a=i.config,o=t("body"),c={},s=i.layHeader.find("th"),h=".layui-table-cell",p=a.elem.attr("lay-filter");i.layTool.on("click","*[lay-event]",function(e){var o=t(this),c=o.attr("lay-event"),s=function(e){var l=t(e.list),n=t('<ul class="layui-table-tool-panel"></ul>');n.html(l),a.height&&n.css("max-height",a.height-(i.layTool.outerHeight()||50)),o.find(".layui-table-tool-panel")[0]||o.append(n),i.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),j.trigger("table.tool.panel.remove"),l.close(i.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return i.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('<li><input type="checkbox" name="'+i.field+'" data-key="'+i.key+'" data-parentkey="'+(i.parentKey||"")+'" lay-skin="primary" '+(i.hide?"":"checked")+' title="'+(i.title||i.field)+'" lay-filter="LAY_TABLE_TOOL_COLS"></li>')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var l=t(e.elem),n=this.checked,o=l.data("key"),r=l.data("parentkey");layui.each(a.cols,function(e,t){layui.each(t,function(t,l){if(e+"-"+t===o){var d=l.hide;l.hide=!n,i.elem.find('*[data-key="'+a.index+"-"+o+'"]')[n?"removeClass":"addClass"](f),d!=l.hide&&i.setParentCol(!n,r),i.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['<li data-type="csv">导出到 Csv 文件</li>','<li data-type="xls">导出到 Excel 文件</li>'].join("")}(),done:function(e,l){l.on("click",function(){var e=t(this).data("type");d.exportFile.call(i,a.id,null,e)})}});break;case"LAYTABLE_PRINT":var u=window.open("打印窗口","_blank"),h=["<style>","body{font-size: 12px; color: #666;}","table{width: 100%; border-collapse: collapse; border-spacing: 0;}","th,td{line-height: 20px; padding: 9px 15px; border: 1px solid #ccc; text-align: left; font-size: 12px; color: #666;}","a{color: #666; text-decoration:none;}","*.layui-hide{display: none}","</style>"].join(""),v=t(i.layHeader.html());v.append(i.layMain.find("table").html()),v.append(i.layTotal.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),u.document.write(h+v.prop("outerHTML")),u.document.close(),u.print(),u.close()}layui.event.call(this,y,"toolbar("+p+")",t.extend({event:c,config:a},{}))}),s.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;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 l=t(this);if(c.allowResize){var n=l.data("key");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],i.getCssRule(n,function(e){var t=e.style.width||l.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=l.data("minwidth")||a.cellMinWidth})}}),j.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var a=c.ruleWidth+t.clientX-c.offset[0];a<c.minWidth&&(a=c.minWidth),c.rule.style.width=a+"px",l.close(i.tipsIndex)}e=1}}).on("mouseup",function(t){c.resizeStart&&(c={},o.css("cursor",""),i.scrollPatch()),2===e&&(e=null)}),s.on("click",function(a){var l,n=t(this),o=n.find(S),r=o.attr("lay-sort");return o[0]&&1!==e?(l="asc"===r?"desc":"desc"===r?null:"asc",void i.sort(n,l,null,!0)):e=2}).find(S+" .layui-edge ").on("click",function(e){var a=t(this),l=a.index(),n=a.parents("th").eq(0).data("field");layui.stope(e),0===l?i.sort(n,"asc",null,!0):i.sort(n,"desc",null,!0)});var v=function(e){var a=t(this),l=a.parents("tr").eq(0).data("index"),n=i.layBody.find('tr[data-index="'+l+'"]'),o=d.cache[i.key]||[];return o=o[l]||{},t.extend({tr:n,data:d.clearCacheKey(o),del:function(){d.cache[i.key][l]=[],n.remove(),i.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,t){if(e in o){var a,l=n.children('td[data-field="'+e+'"]');o[e]=t,i.eachCols(function(t,i){i.field==e&&i.templet&&(a=i.templet)}),l.children(h).html(u({templet:a},t,o)),l.data("content",t)}})}},e)};i.elem.on("click",'input[name="layTableCheckbox"]+',function(){var e=t(this).prev(),a=i.layBody.find('input[name="layTableCheckbox"]'),l=e.parents("tr").eq(0).data("index"),n=e[0].checked,o="layTableAllChoose"===e.attr("lay-filter");o?(a.each(function(e,t){t.checked=n,i.setCheckData(e,n)}),i.syncCheckAll(),i.renderForm("checkbox")):(i.setCheckData(l,n),i.syncCheckAll()),layui.event.call(e[0],y,"checkbox("+p+")",v.call(e[0],{checked:n,type:o?"all":"one"}))}),i.elem.on("click",'input[lay-type="layTableRadio"]+',function(){var e=t(this).prev(),a=e[0].checked,l=d.cache[i.key],n=e.parents("tr").eq(0).data("index");layui.each(l,function(e,t){n===e?t.LAY_CHECKED=!0:delete t.LAY_CHECKED}),i.setThisRowChecked(n),layui.event.call(this,y,"radio("+p+")",v.call(this,{checked:a}))}),i.layBody.on("mouseenter","tr",function(){var e=t(this),a=e.index();e.data("off")||i.layBody.find("tr:eq("+a+")").addClass(W)}).on("mouseleave","tr",function(){var e=t(this),a=e.index();e.data("off")||i.layBody.find("tr:eq("+a+")").removeClass(W)}).on("click","tr",function(){m.call(this,"row")}).on("dblclick","tr",function(){m.call(this,"rowDouble")});var m=function(e){var i=t(this);i.data("off")||layui.event.call(this,y,e+"("+p+")",v.call(i.children("td")[0]))};i.layBody.on("change","."+R,function(){var e=t(this),a=this.value,l=e.parent().data("field"),n=e.parents("tr").eq(0).data("index"),o=d.cache[i.key][n];o[l]=a,layui.event.call(this,y,"edit("+p+")",v.call(this,{value:a,field:l}))}).on("blur","."+R,function(){var e,a=t(this),l=this,n=a.parent().data("field"),o=a.parents("tr").eq(0).data("index"),r=d.cache[i.key][o];i.eachCols(function(t,i){i.field==n&&i.templet&&(e=i.templet)}),a.siblings(h).html(function(t){return u({templet:e},t,r)}(l.value)),a.parent().data("content",l.value),a.remove()}),i.layBody.on("click","td",function(e){var i=t(this),a=(i.data("field"),i.data("edit")),l=i.children(h);if(!i.data("off")&&a){var n=t('<input class="layui-input '+R+'">');return n[0].value=i.data("content")||l.text(),i.find("."+R)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(h);if(!i.data("off"))if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('<div class="'+g+'"><i class="layui-icon layui-icon-down"></i></div>')}};i.layBody.on("click","."+g,function(e){var n=t(this),o=n.parent(),d=o.children(h);i.tipsIndex=l.tips(['<div class="layui-table-tips-main" style="margin-top: -'+(d.height()+16)+"px;"+function(){return"sm"===a.size?"padding: 4px 15px; font-size: 12px;":"lg"===a.size?"padding: 14px 15px;":""}()+'">',d.html(),"</div>",'<i class="layui-icon layui-table-tips-c layui-icon-close"></i>'].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:i.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),i.layBody.on("click","*[lay-event]",function(){var e=t(this),a=e.parents("tr").eq(0).data("index");layui.event.call(this,y,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),i.setThisRowChecked(a)}),i.layMain.on("scroll",function(){var e=t(this),a=e.scrollLeft(),n=e.scrollTop();i.layHeader.scrollLeft(a),i.layTotal.scrollLeft(a),i.layFixed.find(k).scrollTop(n),l.close(i.tipsIndex)}),H.on("resize",function(){i.resize()})},function(){j.on("click",function(){j.trigger("table.remove.tool.panel")}),j.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()})}(),d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[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},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},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}},d.exportFile=function(e,t,i){var a=this;t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var l=c.config[e]||{},n={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],s=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(s.href="data:"+n+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],l=[],n=[];return layui.each(t,function(t,a){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(a),function(e,t){n.push('"'+(t||"")+'"')})):d.eachCols(e,function(e,l){if(l.field&&"normal"==l.type&&!l.hide){var o=a[l.field];void 0!==o&&null!==o||(o=""),0==t&&i.push(l.title||""),n.push('"'+u(l,o,a,"text")+'"')}}),l.push(n.join(","))}),layui.each(a.dataTotal,function(e,t){n.push(t)}),i.join(",")+"\r\n"+l.join("\r\n")+"\r\n"+n.join(",")}()),s.download=(l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(s),s.click(),void document.body.removeChild(s))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,t){var i=s(e);if(i){var a=c.that[e];return a.reload(t),c.call(a)}},d.render=function(e){var t=new F(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(y,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&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['<button class="layui-icon '+u+'" lay-type="sub">'+("updown"===n.anim?"&#xe619;":"&#xe603;")+"</button>",'<button class="layui-icon '+u+'" lay-type="add">'+("updown"===n.anim?"&#xe61a;":"&#xe602;")+"</button>"].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(['<div class="'+c+'"><ul>',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("<li"+(n.index===e?' class="layui-this"':"")+"></li>")}),i.join("")}(),"</ul></div>"].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<n.index&&e.slide("sub",n.index-a)})},m.prototype.slide=function(e,i){var n=this,l=n.elemItem,u=n.config,c=u.index,m=u.elem.attr("lay-filter");n.haveSlide||("sub"===e?(n.subIndex(i),l.eq(u.index).addClass(d),setTimeout(function(){l.eq(c).addClass(r),l.eq(u.index).addClass(r)},50)):(n.addIndex(i),l.eq(u.index).addClass(s),setTimeout(function(){l.eq(c).addClass(o),l.eq(u.index).addClass(o)},50)),setTimeout(function(){l.removeClass(a+" "+d+" "+s+" "+o+" "+r),l.eq(u.index).addClass(a),n.haveSlide=!1},300),n.elemInd.find("li").eq(u.index).addClass(a).siblings().removeClass(a),n.haveSlide=!0,layui.event.call(this,t,"change("+m+")",{index:u.index,prevIndex:c,item:l.eq(u.index)}))},m.prototype.events=function(){var e=this,i=e.config;i.elem.data("haveEvents")||(i.elem.on("mouseenter",function(){clearInterval(e.timer)}).on("mouseleave",function(){e.autoplay()}),i.elem.data("haveEvents",!0))},n.render=function(e){var i=new m(e);return i},e(t,n)});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='<ul class="layui-rate" '+(i.readonly?"readonly":"")+">",u=1;u<=i.length;u++){var r='<li class="layui-inline"><i class="layui-icon '+(u>Math.floor(i.value)?o:s)+'" '+l+"></i></li>";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'<li><i class="layui-icon layui-icon-rate-half" '+l+"></i></li>":n+=r}n+="</ul>"+(i.text?'<span class="layui-inline">'+i.value+"星":"")+"</span>";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,n,a="layui-fixbar",o="layui-fixbar-top",r=t(document),l=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"&#xe606;":e.bar1,e.bar2=e.bar2===!0?"&#xe607;":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,"&#xe604;"],u=t(['<ul class="'+a+'">',e.bar1?'<li class="layui-icon" lay-type="bar1" style="'+e.bgcolor+'">'+c[0]+"</li>":"",e.bar2?'<li class="layui-icon" lay-type="bar2" style="'+e.bgcolor+'">'+c[1]+"</li>":"",'<li class="layui-icon '+o+'" lay-type="top" style="'+e.bgcolor+'">'+c[2]+"</li>","</ul>"].join("")),g=u.find("."+o),s=function(){var t=r.scrollTop();t>=e.showHeight?i||(g.show(),i=1):i&&(g.hide(),i=0)};t("."+a)[0]||("object"==typeof e.css&&u.css(e.css),l.append(u),s(),u.find("li").on("click",function(){var i=t(this),n=i.attr("lay-type");"top"===n&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,n)}),r.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var n=this,a="function"==typeof t,o=new Date(e).getTime(),r=new Date(!t||a?(new Date).getTime():t).getTime(),l=o-r,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=t);var u=setTimeout(function(){n.countdown(e,r+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,u),l<=0&&clearTimeout(u),u},timeAgo:function(e,t){var i=this,n=[[],[]],a=(new Date).getTime()-new Date(e).getTime();return a>26784e5?(a=new Date(e),n[0][0]=i.digit(a.getFullYear(),4),n[0][1]=i.digit(a.getMonth()+1),n[0][2]=i.digit(a.getDate()),t||(n[1][0]=i.digit(a.getHours()),n[1][1]=i.digit(a.getMinutes()),n[1][2]=i.digit(a.getSeconds())),n[0].join("-")+" "+n[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=18e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var n=e.length;n<t;n++)i+="0";return e<Math.pow(10,t)?i+(0|e):e},toDateString:function(e,t){var i=this,n=new Date(e||new Date),a=[i.digit(n.getFullYear(),4),i.digit(n.getMonth()+1),i.digit(n.getDate())],o=[i.digit(n.getHours()),i.digit(n.getMinutes()),i.digit(n.getSeconds())];return t=t||"yyyy-MM-dd HH:mm:ss",t.replace(/yyyy/g,a[0]).replace(/MM/g,a[1]).replace(/dd/g,a[2]).replace(/HH/g,o[0]).replace(/mm/g,o[1]).replace(/ss/g,o[2])},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&quot;")},event:function(e,n,a){var o=t("body");return a=a||"click",n=i.event[e]=t.extend(!0,i.event[e],n)||{},i.event.UTIL_EVENT_CALLBACK=i.event.UTIL_EVENT_CALLBACK||{},o.off(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),i.event.UTIL_EVENT_CALLBACK[e]=function(){var i=t(this),a=i.attr(e);"function"==typeof n[a]&&n[a].call(this,i)},o.on(a,"*["+e+"]",i.event.UTIL_EVENT_CALLBACK[e]),n}};!function(e,t,i){"$:nomunge";function n(){a=t[l](function(){o.each(function(){var t=e(this),i=t.width(),n=t.height(),a=e.data(this,u);(i!==a.w||n!==a.h)&&t.trigger(c,[a.w=i,a.h=n])}),n()},r[g])}var a,o=e([]),r=e.resize=e.extend(e.resize,{}),l="setTimeout",c="resize",u=c+"-special-event",g="delay",s="throttleWindow";r[g]=250,r[s]=!0,e.event.special[c]={setup:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.add(t),e.data(this,u,{w:t.width(),h:t.height()}),1===o.length&&n()},teardown:function(){if(!r[s]&&this[l])return!1;var t=e(this);o=o.not(t),t.removeData(u),o.length||clearTimeout(a)},add:function(t){function n(t,n,o){var r=e(this),l=e.data(this,u)||{};l.w=n!==i?n:r.width(),l.h=o!==i?o:r.height(),a.apply(this,arguments)}if(!r[s]&&this[l])return!1;var a;return e.isFunction(t)?(a=t,n):(a=t.handler,void(t.handler=n))}}}(t,window),e("util",i)});layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='<i class="layui-anim layui-anim-rotate layui-anim-loop layui-icon ">&#xe63e;</i>';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="<cite>加载更多</cite>",h=l('<div class="layui-flow-more"><a href="javascript:;">'+d+"</a></div>");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&&f.width()&&(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;s<t.lazyimg.elem.length;s++){var v=t.lazyimg.elem.eq(s),y=a?function(){return v.offset().top-n.offset().top+m}():v.offset().top;if(c(v,f),i=s,y>u)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(["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(['<div class="'+r+'">','<div class="layui-unselect layui-layedit-tool">'+f+"</div>",'<div class="layui-layedit-iframe">','<iframe id="'+u+'" name="'+u+'" textarea="'+t+'" frameborder="0"></iframe>',"</div>","</div>"].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(["<style>","*{margin: 0; padding: 0;}","body{padding: 10px; line-height: 20px; overflow-x: hidden; word-wrap: break-word; font: 14px Helvetica Neue,Helvetica,PingFang SC,Microsoft YaHei,Tahoma,Arial,sans-serif; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}","a{color:#01AAED; text-decoration:none;}a:hover{color:#c00}","p{margin-bottom: 10px;}","img{display: inline-block; border: none; vertical-align: middle;}","pre{margin: 10px 0; padding: 10px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}","</style>"].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,"<p>")}}),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,"<p>"),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,"<p>"),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:['<ul class="layui-form" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">URL</label>','<div class="layui-input-block" style="margin-left: 90px">','<input name="url" lay-verify="url" value="'+(t.href||"")+'" autofocus="true" autocomplete="off" class="layui-input">',"</div>","</li>",'<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">打开方式</label>','<div class="layui-input-block" style="margin-left: 90px">','<input type="radio" name="target" value="_self" class="layui-input" title="当前窗口"'+("_self"!==t.target&&t.target?"":"checked")+">",'<input type="radio" name="target" value="_blank" class="layui-input" title="新窗口" '+("_blank"===t.target?"checked":"")+">","</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-link-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].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('<li title="'+e+'"><img src="'+i+'" alt="'+e+'"></li>')}),'<ul class="layui-clear">'+t.join("")+"</ul>"}(),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:['<ul class="layui-form layui-form-pane" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label">请选择语言</label>','<div class="layui-input-block">','<select name="lang">','<option value="JavaScript">JavaScript</option>','<option value="HTML">HTML</option>','<option value="CSS">CSS</option>','<option value="Java">Java</option>','<option value="PHP">PHP</option>','<option value="C#">C#</option>','<option value="Python">Python</option>','<option value="Ruby">Ruby</option>','<option value="Go">Go</option>',"</select>","</div>","</li>",'<li class="layui-form-item layui-form-text">','<label class="layui-form-label">代码</label>','<div class="layui-input-block">','<textarea name="code" lay-verify="required" autofocus="true" class="layui-textarea" style="height: 200px;"></textarea>',"</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-code-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].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:'<i class="layui-icon layedit-tool-html" title="HTML源代码" lay-command="html" layedit-event="html"">&#xe64b;</i><span class="layedit-tool-mid"></span>',strong:'<i class="layui-icon layedit-tool-b" title="加粗" lay-command="Bold" layedit-event="b"">&#xe62b;</i>',italic:'<i class="layui-icon layedit-tool-i" title="斜体" lay-command="italic" layedit-event="i"">&#xe644;</i>',underline:'<i class="layui-icon layedit-tool-u" title="下划线" lay-command="underline" layedit-event="u"">&#xe646;</i>',del:'<i class="layui-icon layedit-tool-d" title="删除线" lay-command="strikeThrough" layedit-event="d"">&#xe64f;</i>',"|":'<span class="layedit-tool-mid"></span>',left:'<i class="layui-icon layedit-tool-left" title="左对齐" lay-command="justifyLeft" layedit-event="left"">&#xe649;</i>',center:'<i class="layui-icon layedit-tool-center" title="居中对齐" lay-command="justifyCenter" layedit-event="center"">&#xe647;</i>',right:'<i class="layui-icon layedit-tool-right" title="右对齐" lay-command="justifyRight" layedit-event="right"">&#xe648;</i>',link:'<i class="layui-icon layedit-tool-link" title="插入链接" layedit-event="link"">&#xe64c;</i>',unlink:'<i class="layui-icon layedit-tool-unlink layui-disabled" title="清除链接" lay-command="unlink" layedit-event="unlink"">&#xe64d;</i>',face:'<i class="layui-icon layedit-tool-face" title="表情" layedit-event="face"">&#xe650;</i>',image:'<i class="layui-icon layedit-tool-image" title="图片" layedit-event="image">&#xe64a;<input type="file" name="file"></i>',code:'<i class="layui-icon layedit-tool-code" title="插入代码" layedit-event="code">&#xe64e;</i>',help:'<i class="layui-icon layedit-tool-help" title="帮助" layedit-event="help">&#xe607;</i>'},w=new c;t(n,w)});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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#39;").replace(/"/g,"&quot;")),c.html('<ol class="layui-code-ol"><li>'+o.replace(/[\r\t\n]+/g,"</li><li>")+"</li></ol>"),c.find(">.layui-code-h3")[0]||c.prepend('<h3 class="layui-code-h3">'+(c.attr("lay-title")||e.title||"code")+(e.about?'<a href="'+l+'" target="_blank">layui.code</a>':"")+"</h3>");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");
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/layui/layui.js b/management/guns-admin/src/main/webapp/static/layui/layui.js
new file mode 100644
index 0000000..99dba90
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/layui/layui.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ ;!function(e){"use strict";var t=document,n={modules:{},status:{},timeout:10,event:{}},r=function(){this.v="2.5.6"},o=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,n=t.scripts,r=n.length-1,o=r;o>0;o--)if("interactive"===n[o].readyState){e=n[o].src;break}return e||n[r].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",transfer:"modules/transfer",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};r.prototype.cache=n,r.prototype.define=function(e,t){var r=this,o="function"==typeof e,a=function(){var e=function(e,t){layui[e]=t,n.status[e]=!0};return"function"==typeof t&&t(function(r,o){e(r,o),n.callback[r]=function(){t(e)}}),this};return o&&(t=e,e=[]),!layui["layui.all"]&&layui["layui.mobile"]?a.call(r):(r.use(e,a),r)},r.prototype.use=function(e,r,l){function c(e,t){var r="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||r.test((e.currentTarget||e.srcElement).readyState))&&(n.modules[d]=t,y.removeChild(h),function o(){return++m>1e3*n.timeout/4?a(d+" is not a valid module"):void(n.status[d]?s():setTimeout(o,4))}())}function s(){l.push(layui[d]),e.length>1?p.use(e.slice(1),r,l):"function"==typeof r&&r.apply(layui,l)}var p=this,f=n.dir=n.dir?n.dir:o,y=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(p.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||(f.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[d]||!layui["layui.all"]&&layui["layui.mobile"]&&u[d])return s(),p;var v=(u[d]?f+"lay/":/^\{\/\}/.test(p.modules[d])?"":n.base||"")+(p.modules[d]||d)+".js";if(v=v.replace(/^\{\/\}/,""),!n.modules[d]&&layui[d]&&(n.modules[d]=v),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]?s():setTimeout(g,4))}();else{var h=t.createElement("script");h.async=!0,h.charset="utf-8",h.src=v+function(){var e=n.version===!0?n.v||(new Date).getTime():n.version||"";return e?"?v="+e:""}(),y.appendChild(h),!h.attachEvent||h.attachEvent.toString&&h.attachEvent.toString().indexOf("[native code")<0||i?h.addEventListener("load",function(e){c(e,v)},!1):h.attachEvent("onreadystatechange",function(e){c(e,v)}),n.modules[d]=v}return p},r.prototype.getStyle=function(t,n){var r=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return r[r.getPropertyValue?"getPropertyValue":"getAttribute"](n)},r.prototype.link=function(e,r,o){var i=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof r&&(o=r);var c=(o||e).replace(/\.|\//g,""),s=u.id="layuicss-"+c,p=0;return u.rel="stylesheet",u.href=e+(n.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(s)||l.appendChild(u),"function"!=typeof r?i:(function f(){return++p>1e3*n.timeout/100?a(e+" timeout"):void(1989===parseInt(i.getStyle(t.getElementById(s),"width"))?function(){r()}():setTimeout(f,100))}(),i)},n.callback={},r.prototype.factory=function(e){if(layui[e])return"function"==typeof n.callback[e]?n.callback[e]:null},r.prototype.addcss=function(e,t,r){return layui.link(n.dir+"css/"+e,t,r)},r.prototype.img=function(e,t,n){var r=new Image;return r.src=e,r.complete?t(r):(r.onload=function(){r.onload=null,"function"==typeof t&&t(r)},void(r.onerror=function(e){r.onerror=null,"function"==typeof n&&n(e)}))},r.prototype.config=function(e){e=e||{};for(var t in e)n[t]=e[t];return this},r.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),r.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},r.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},r.prototype.url=function(e){var t=this,n={pathname:function(){var t=e?function(){var t=(e.match(/\.[^.]+?\/.+/)||[])[0]||"";return t.replace(/^[^\/]+/,"").replace(/\?.+/,"")}():location.pathname;return t.replace(/^\//,"").split("/")}(),search:function(){var n={},r=(e?function(){var t=(e.match(/\?.+/)||[])[0]||"";return t.replace(/\#.+/,"")}():location.search).replace(/^\?+/,"").split("&");return t.each(r,function(e,t){var r=t.indexOf("="),o=function(){return r<0?t.substr(0,t.length):0!==r&&t.substr(0,r)}();o&&(n[o]=r>0?t.substr(r+1):null)}),n}(),hash:t.router(function(){return e?(e.match(/#.+/)||[])[0]||"":location.hash}())};return n},r.prototype.data=function(t,n,r){if(t=t||"layui",r=r||localStorage,e.JSON&&e.JSON.parse){if(null===n)return delete r[t];n="object"==typeof n?n:{key:n};try{var o=JSON.parse(r[t])}catch(a){var o={}}return"value"in n&&(o[n.key]=n.value),n.remove&&delete o[n.key],r[t]=JSON.stringify(o),n.key?o[n.key]:o}},r.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},r.prototype.device=function(t){var n=navigator.userAgent.toLowerCase(),r=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(n.match(t)||[])[1],e||!1},o={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:r("micromessenger")};return t&&!o[t]&&(o[t]=r(t)),o.android=/android/.test(n),o.ios="ios"===o.os,o.mobile=!(!o.android&&!o.ios),o},r.prototype.hint=function(){return{error:a}},r.prototype.each=function(e,t){var n,r=this;if("function"!=typeof t)return r;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;n<e.length&&!t.call(e[n],n,e[n]);n++);return r},r.prototype.sort=function(e,t,n){var r=JSON.parse(JSON.stringify(e||[]));return t?(r.sort(function(e,n){var r=/^-?\d+$/,o=e[t],a=n[t];return r.test(o)&&(o=parseFloat(o)),r.test(a)&&(a=parseFloat(a)),o&&!a?1:!o&&a?-1:o>a?1:o<a?-1:0}),n&&r.reverse(),r):r},r.prototype.stope=function(t){t=t||e.event;try{t.stopPropagation()}catch(n){t.cancelBubble=!0}},r.prototype.onevent=function(e,t,n){return"string"!=typeof e||"function"!=typeof n?this:r.event(e,t,null,n)},r.prototype.event=r.event=function(e,t,r,o){var a=this,i=null,u=t.match(/\((.*)\)$/)||[],l=(e+"."+t).replace(u[0],""),c=u[1]||"",s=function(e,t){var n=t&&t.call(a,r);n===!1&&null===i&&(i=!1)};return o?(n.event[l]=n.event[l]||{},n.event[l][c]=[o],this):(layui.each(n.event[l],function(e,t){return"{*}"===c?void layui.each(t,s):(""===e&&layui.each(t,s),void(c&&e===c&&layui.each(t,s)))}),i)},e.layui=new r}(window);
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/code/gen.js b/management/guns-admin/src/main/webapp/static/modular/code/gen.js
new file mode 100644
index 0000000..619d9b1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/code/gen.js
@@ -0,0 +1,93 @@
+/**
+ * 初始化
+ */
+var Code = {
+    ztreeInstance: null,
+    tableName: "",
+    submitData: {},
+    switchs: {}
+};
+
+/**
+ * 选择table的事件
+ */
+Code.selectTable = function (tableName) {
+
+    SelectList.clearSelect("templateList");
+    Code.switchs = {};
+
+    if (SelectList.singelSelect("tableList", "tableName", tableName) == true) {
+        Code.tableName = tableName;
+        Code.setTableName(tableName);
+    } else {
+        Code.tableName = "";
+    }
+};
+
+/**
+ * 选择模板的事件
+ */
+Code.selectTemplate = function (templateKey) {
+    if (Code.tableName != "") {
+        if (SelectList.mutiSelect("templateList", "key", templateKey) == true) {
+            Code.switchs[templateKey] = true;
+        } else {
+            Code.switchs[templateKey] = false;
+        }
+    } else {
+        Feng.info("请先选择表");
+    }
+};
+
+/**
+ * 点击生成
+ */
+Code.generate = function () {
+    Code.submitData = {};
+    Code.submitData.tableName = Code.tableName;
+    this.set('projectPath').set('author').set('projectPackage').set('corePackage').set('ignoreTabelPrefix').set('bizName').set('moduleName').set('parentMenuName');
+    var baseAjax = Feng.baseAjax("/code/generate", "生成代码");
+
+    for (var item in Code.switchs) {
+        Code.submitData[item] = Code.switchs[item];
+    }
+
+    baseAjax.setData(Code.submitData);
+    baseAjax.start();
+};
+
+/**
+ * 设置表名称
+ */
+Code.setTableName = function (tableName) {
+    var preSize = $("#ignoreTabelPrefix").val().length;
+    $("#tableName").val(tableName);
+    $("#className").val(Feng.underLineToCamel(tableName.substring(preSize)));
+};
+
+/**
+ * 点击父级编号input框时
+ */
+Code.onClickDept = function (e, treeId, treeNode) {
+    $("#parentMenuName").attr("value", Code.ztreeInstance.getSelectedVal());
+};
+
+/**
+ * 显示父级菜单选择的树
+ */
+Code.showMenuSelectTree = function () {
+    Feng.showInputTree("parentMenuName", "pcodeTreeDiv", 15, 34);
+};
+
+$(function () {
+    var ztree = new $ZTree("pcodeTree", "/menu/selectMenuTreeList");
+    ztree.bindOnClick(Code.onClickDept);
+    ztree.init();
+    Code.ztreeInstance = ztree;
+    $("#pcodeTree").css('width',$("#parentMenuName").css('width'));
+});
+
+Code.set = function (key, value) {
+    Code.submitData[key] = (typeof value == "undefined") ? $("#" + key).val() : value;
+    return this;
+};
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/flowable/expense/expense.js b/management/guns-admin/src/main/webapp/static/modular/flowable/expense/expense.js
new file mode 100644
index 0000000..3749f2f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/flowable/expense/expense.js
@@ -0,0 +1,93 @@
+/**
+ * 报销管理管理初始化
+ */
+var Expense = {
+    id: "ExpenseTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+Expense.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '报销id', field: 'id', visible: true, align: 'center', valign: 'middle'},
+        {title: '报销金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+        {title: '描述', field: 'desc', visible: true, align: 'center', valign: 'middle'},
+        {title: '状态', field: 'stateName', visible: true, align: 'center', valign: 'middle'},
+        {title: '创建时间', field: 'createtime', visible: true, align: 'center', valign: 'middle'},
+        {
+            title: '操作', visible: true, align: 'center', valign: 'middle', formatter: function (value, row, index) {
+            if (row.state == 3) {
+                return '<button type="button" class="btn btn-danger button-margin" onclick="Expense.deleteRecord(' + row.id + ')" id=""><i class="fa fa-arrows-alt"></i>&nbsp;删除</button>';
+            } else {
+                return '<button type="button" class="btn btn-primary button-margin" onclick="Expense.findRecord(' + row.id + ')" id=""><i class="fa fa-edit"></i>&nbsp;查看</button>' +
+                    '<button type="button" class="btn btn-danger button-margin" onclick="Expense.deleteRecord(' + row.id + ')" id=""><i class="fa fa-arrows-alt"></i>&nbsp;删除</button>';
+            }
+        }
+        }
+    ];
+};
+
+/**
+ * 流程详情
+ */
+Expense.findRecord = function (id) {
+    var index = layer.open({
+        type: 2,
+        title: '流程详情',
+        area: ['1000px', '500px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/expense/expense_update/' + id
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 删除审核记录
+ */
+Expense.deleteRecord = function (id) {
+    var ajax = new $ax(Feng.ctxPath + "/expense/delete", function (data) {
+        Feng.success("删除成功!");
+        Expense.table.refresh();
+    }, function (data) {
+        Feng.error("删除失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("expenseId", id);
+    ajax.start();
+};
+
+/**
+ * 点击添加报销管理
+ */
+Expense.openAddExpense = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加报销管理',
+        area: ['600px', '350px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/expense/expense_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 查询报销管理列表
+ */
+Expense.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    Expense.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = Expense.initColumn();
+    var table = new BSTable(Expense.id, "/expense/list", defaultColunms);
+    table.setPaginationType("client");
+    Expense.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/flowable/expense/expense_info.js b/management/guns-admin/src/main/webapp/static/modular/flowable/expense/expense_info.js
new file mode 100644
index 0000000..481af18
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/flowable/expense/expense_info.js
@@ -0,0 +1,96 @@
+/**
+ * 初始化报销管理详情对话框
+ */
+var ExpenseInfoDlg = {
+    expenseInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+ExpenseInfoDlg.clearData = function() {
+    this.expenseInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+ExpenseInfoDlg.set = function(key, val) {
+    this.expenseInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+ExpenseInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+ExpenseInfoDlg.close = function() {
+    parent.layer.close(window.parent.Expense.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+ExpenseInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('money')
+    .set('desc')
+    ;
+}
+
+/**
+ * 提交添加
+ */
+ExpenseInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/expense/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.Expense.table.refresh();
+        ExpenseInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.expenseInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+ExpenseInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/expense/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.Expense.table.refresh();
+        ExpenseInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.expenseInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/flowable/process/process.js b/management/guns-admin/src/main/webapp/static/modular/flowable/process/process.js
new file mode 100644
index 0000000..27c79c7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/flowable/process/process.js
@@ -0,0 +1,77 @@
+/**
+ * 报销管理管理初始化
+ */
+var Process = {
+    id: "ProcessTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+Process.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '任务id', field: 'id', visible: true, align: 'center', valign: 'middle'},
+        {title: '名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+        {title: '金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+        {title: '创建时间', field: 'createTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '申请人', field: 'assignee', visible: true, align: 'center', valign: 'middle'},
+        {
+            title: '操作', visible: true, align: 'center', valign: 'middle', formatter: function (value, row, index) {
+            if (row.selfFlag == true) {
+                return '<button type="button" class="btn btn-primary button-margin" onclick="Process.pass(' + row.id + ')" id=""><i class="fa fa-edit"></i>&nbsp;通过</button>' +
+                    '<button type="button" class="btn btn-danger button-margin" onclick="Process.unPass(' + row.id + ')" id=""><i class="fa fa-arrows-alt"></i>&nbsp;不通过</button>';
+            } else {
+                return '<button type="button" class="btn btn-primary button-margin" onclick="Process.pass(' + row.id + ')" id=""><i class="fa fa-edit"></i>&nbsp;通过</button>';
+            }
+        }
+        }
+    ];
+};
+
+/**
+ * 通过审核
+ */
+Process.pass = function (id) {
+    var ajax = new $ax(Feng.ctxPath + "/process/pass", function (data) {
+        Feng.success("审核成功!");
+        Process.table.refresh();
+    }, function (data) {
+        Feng.error("审核失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("taskId", id);
+    ajax.start();
+};
+
+/**
+ * 未通过审核
+ */
+Process.unPass = function (id) {
+    var ajax = new $ax(Feng.ctxPath + "/process/unPass", function (data) {
+        Feng.success("审核成功!");
+        Process.table.refresh();
+    }, function (data) {
+        Feng.error("审核失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("taskId", id);
+    ajax.start();
+};
+
+/**
+ * 查询报销管理列表
+ */
+Process.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    Process.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = Process.initColumn();
+    var table = new BSTable(Process.id, "/process/list", defaultColunms);
+    table.setPaginationType("client");
+    Process.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/flowable/process/process_info.js b/management/guns-admin/src/main/webapp/static/modular/flowable/process/process_info.js
new file mode 100644
index 0000000..481af18
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/flowable/process/process_info.js
@@ -0,0 +1,96 @@
+/**
+ * 初始化报销管理详情对话框
+ */
+var ExpenseInfoDlg = {
+    expenseInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+ExpenseInfoDlg.clearData = function() {
+    this.expenseInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+ExpenseInfoDlg.set = function(key, val) {
+    this.expenseInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+ExpenseInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+ExpenseInfoDlg.close = function() {
+    parent.layer.close(window.parent.Expense.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+ExpenseInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('money')
+    .set('desc')
+    ;
+}
+
+/**
+ * 提交添加
+ */
+ExpenseInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/expense/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.Expense.table.refresh();
+        ExpenseInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.expenseInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+ExpenseInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/expense/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.Expense.table.refresh();
+        ExpenseInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.expenseInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/code/code.js b/management/guns-admin/src/main/webapp/static/modular/system/code/code.js
new file mode 100644
index 0000000..1f2fc4e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/code/code.js
@@ -0,0 +1,18 @@
+/**
+ * 代码生成管理初始化
+ */
+var Code = {
+
+};
+
+/**
+ * 提交代码生成
+ */
+Code.generate = function () {
+    var baseAjax = Feng.baseAjax("/code/generate","生成代码");
+    baseAjax.set("bizChName");
+    baseAjax.set("bizEnName");
+    baseAjax.set("path");
+    baseAjax.set("moduleName");
+    baseAjax.start();
+};
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/dept/dept.js b/management/guns-admin/src/main/webapp/static/modular/system/dept/dept.js
new file mode 100644
index 0000000..ccbba59
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/dept/dept.js
@@ -0,0 +1,110 @@
+/**
+ * 部门管理初始化
+ */
+var Dept = {
+    id: "DeptTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+Dept.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', align: 'center', valign: 'middle',width:'50px'},
+        {title: '部门简称', field: 'simplename', align: 'center', valign: 'middle', sortable: true},
+        {title: '部门全称', field: 'fullname', align: 'center', valign: 'middle', sortable: true},
+        {title: '排序', field: 'num', align: 'center', valign: 'middle', sortable: true},
+        {title: '备注', field: 'tips', align: 'center', valign: 'middle', sortable: true}];
+};
+
+/**
+ * 检查是否选中
+ */
+Dept.check = function () {
+    var selected = $('#' + this.id).bootstrapTreeTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        Dept.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加部门
+ */
+Dept.openAddDept = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加部门',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/dept/dept_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看部门详情
+ */
+Dept.openDeptDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '部门详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/dept/dept_update/' + Dept.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除部门
+ */
+Dept.delete = function () {
+    if (this.check()) {
+
+        var operation = function(){
+            var ajax = new $ax(Feng.ctxPath + "/dept/delete", function () {
+                Feng.success("删除成功!");
+                Dept.table.refresh();
+            }, function (data) {
+                Feng.error("删除失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("deptId",Dept.seItem.id);
+            ajax.start();
+        };
+
+        Feng.confirm("是否刪除该部门?", operation);
+    }
+};
+
+/**
+ * 查询部门列表
+ */
+Dept.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    Dept.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = Dept.initColumn();
+    var table = new BSTreeTable(Dept.id, "/dept/list", defaultColunms);
+    table.setExpandColumn(2);
+    table.setIdField("id");
+    table.setCodeField("id");
+    table.setParentCodeField("pid");
+    table.setExpandAll(true);
+    table.init();
+    Dept.table = table;
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/dept/dept_info.js b/management/guns-admin/src/main/webapp/static/modular/system/dept/dept_info.js
new file mode 100644
index 0000000..4ea6c98
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/dept/dept_info.js
@@ -0,0 +1,195 @@
+/**
+ * 初始化部门详情对话框
+ */
+var DeptInfoDlg = {
+    deptInfoData : {},
+    zTreeInstance : null,
+    validateFields: {
+        simplename: {
+            validators: {
+                notEmpty: {
+                    message: '部门名称不能为空'
+                }
+            }
+        },
+        fullname: {
+            validators: {
+                notEmpty: {
+                    message: '部门全称不能为空'
+                }
+            }
+        },
+        /*pName: {
+            validators: {
+                notEmpty: {
+                    message: '上级名称不能为空'
+                }
+            }
+        }*/
+    }
+};
+
+/**
+ * 清除数据
+ */
+DeptInfoDlg.clearData = function() {
+    this.deptInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+DeptInfoDlg.set = function(key, val) {
+    this.deptInfoData[key] = (typeof value == "undefined") ? $("#" + key).val() : value;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+DeptInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+DeptInfoDlg.close = function() {
+    parent.layer.close(window.parent.Dept.layerIndex);
+}
+
+/**
+ * 点击部门ztree列表的选项时
+ *
+ * @param e
+ * @param treeId
+ * @param treeNode
+ * @returns
+ */
+DeptInfoDlg.onClickDept = function(e, treeId, treeNode) {
+    $("#pName").attr("value", DeptInfoDlg.zTreeInstance.getSelectedVal());
+    $("#pid").attr("value", treeNode.id);
+}
+
+/**
+ * 显示部门选择的树
+ *
+ * @returns
+ */
+DeptInfoDlg.showDeptSelectTree = function() {
+    var pName = $("#pName");
+    var pNameOffset = $("#pName").offset();
+    $("#parentDeptMenu").css({
+        left : pNameOffset.left + "px",
+        top : pNameOffset.top + pName.outerHeight() + "px"
+    }).slideDown("fast");
+
+    $("body").bind("mousedown", onBodyDown);
+}
+
+/**
+ * 隐藏部门选择的树
+ */
+DeptInfoDlg.hideDeptSelectTree = function() {
+    $("#parentDeptMenu").fadeOut("fast");
+    $("body").unbind("mousedown", onBodyDown);// mousedown当鼠标按下就可以触发,不用弹起
+}
+
+/**
+ * 收集数据
+ */
+DeptInfoDlg.collectData = function() {
+    this.set('id').set('simplename').set('fullname').set('tips').set('num').set('pid');
+}
+
+/**
+ * 验证数据是否为空
+ */
+DeptInfoDlg.validate = function () {
+    $('#deptInfoForm').data("bootstrapValidator").resetForm();
+    $('#deptInfoForm').bootstrapValidator('validate');
+    return $("#deptInfoForm").data('bootstrapValidator').isValid();
+}
+
+/**
+ * 提交添加部门
+ */
+DeptInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    if (!this.validate()) {
+        return;
+    }
+    var pName = $("#pName").val();
+    if ("" == pName){
+        Feng.info("上级部门不能为空");
+        return;
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/dept/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.Dept.table.refresh();
+        DeptInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.deptInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+DeptInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    if (!this.validate()) {
+        return;
+    }
+    var pName = $("#pName").val();
+    var pid = $("#pid").val();
+    if (0 != pid){
+        if ("" == pName){
+            Feng.info("上级部门不能为空");
+            return;
+        }
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/dept/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.Dept.table.refresh();
+        DeptInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.deptInfoData);
+    ajax.start();
+}
+
+function onBodyDown(event) {
+    if (!(event.target.id == "menuBtn" || event.target.id == "parentDeptMenu" || $(
+            event.target).parents("#parentDeptMenu").length > 0)) {
+        DeptInfoDlg.hideDeptSelectTree();
+    }
+}
+
+$(function() {
+    Feng.initValidator("deptInfoForm", DeptInfoDlg.validateFields);
+
+    var ztree = new $ZTree("parentDeptMenuTree", "/dept/tree");
+    ztree.bindOnClick(DeptInfoDlg.onClickDept);
+    ztree.init();
+    DeptInfoDlg.zTreeInstance = ztree;
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/dict/dict.js b/management/guns-admin/src/main/webapp/static/modular/system/dict/dict.js
new file mode 100644
index 0000000..b4f87a2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/dict/dict.js
@@ -0,0 +1,104 @@
+/**
+ * 字典管理初始化
+ */
+var Dict = {
+    id: "DictTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+Dict.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '名称', field: 'name', align: 'center', valign: 'middle', sortable: true},
+        {title: '详情', field: 'detail', align: 'center', valign: 'middle', sortable: true},
+        {title: '备注', field: 'tips', align: 'center', valign: 'middle', sortable: true}];
+};
+
+/**
+ * 检查是否选中
+ */
+Dict.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        Dict.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加字典
+ */
+Dict.openAddDict = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加字典',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/dict/dict_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看字典详情
+ */
+Dict.openDictDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '字典详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/dict/dict_edit/' + Dict.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除字典
+ */
+Dict.delete = function () {
+    if (this.check()) {
+
+        var operation = function(){
+            var ajax = new $ax(Feng.ctxPath + "/dict/delete", function (data) {
+                Feng.success("删除成功!");
+                Dict.table.refresh();
+            }, function (data) {
+                Feng.error("删除失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("dictId", Dict.seItem.id);
+            ajax.start();
+        };
+
+        Feng.confirm("是否刪除字典 " + Dict.seItem.name + "?", operation);
+    }
+};
+
+/**
+ * 查询字典列表
+ */
+Dict.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    Dict.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = Dict.initColumn();
+    var table = new BSTable(Dict.id, "/dict/list", defaultColunms);
+    table.setPaginationType("client");
+    Dict.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/dict/dict_info.js b/management/guns-admin/src/main/webapp/static/modular/system/dict/dict_info.js
new file mode 100644
index 0000000..34ceb41
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/dict/dict_info.js
@@ -0,0 +1,118 @@
+/**
+ * 初始化字典详情对话框
+ */
+var DictInfoDlg = {
+    count: $("#itemSize").val(),
+    dictName: '',			//字典的名称
+    dictCode: '',//字典类型编码
+    dictTips: '',//字典备注
+    mutiString: '',		//拼接字符串内容(拼接字典条目)
+    itemTemplate: $("#itemTemplate").html()
+};
+
+/**
+ * item获取新的id
+ */
+DictInfoDlg.newId = function () {
+    if(this.count == undefined){
+        this.count = 0;
+    }
+    this.count = this.count + 1;
+    return "dictItem" + this.count;
+};
+
+/**
+ * 关闭此对话框
+ */
+DictInfoDlg.close = function () {
+    parent.layer.close(window.parent.Dict.layerIndex);
+};
+
+/**
+ * 添加条目
+ */
+DictInfoDlg.addItem = function () {
+    $("#itemsArea").append(this.itemTemplate);
+    $("#dictItem").attr("id", this.newId());
+};
+
+/**
+ * 删除item
+ */
+DictInfoDlg.deleteItem = function (event) {
+    var obj = Feng.eventParseObject(event);
+    obj = obj.is('button') ? obj : obj.parent();
+    obj.parent().parent().remove();
+};
+
+/**
+ * 清除为空的item Dom
+ */
+DictInfoDlg.clearNullDom = function(){
+    $("[name='dictItem']").each(function(){
+        var num = $(this).find("[name='itemNum']").val();
+        var name = $(this).find("[name='itemName']").val();
+        if(num == '' || name == ''){
+            $(this).remove();
+        }
+    });
+};
+
+/**
+ * 收集添加字典的数据
+ */
+DictInfoDlg.collectData = function () {
+    this.clearNullDom();
+    var mutiString = "";
+    $("[name='dictItem']").each(function(){
+        var code = $(this).find("[name='itemCode']").val();
+        var name = $(this).find("[name='itemName']").val();
+        var num = $(this).find("[name='itemNum']").val();
+        mutiString = mutiString + (code + ":" + name + ":"+ num+";");
+    });
+    this.dictName = $("#dictName").val();
+    this.dictCode = $("#dictCode").val();
+    this.dictTips = $("#dictTips").val();
+    this.mutiString = mutiString;
+};
+
+
+/**
+ * 提交添加字典
+ */
+DictInfoDlg.addSubmit = function () {
+    this.collectData();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/dict/add", function (data) {
+        Feng.success("添加成功!");
+        window.parent.Dict.table.refresh();
+        DictInfoDlg.close();
+    }, function (data) {
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set('dictName',this.dictName);
+    ajax.set('dictCode',this.dictCode);
+    ajax.set('dictTips',this.dictTips);
+    ajax.set('dictValues',this.mutiString);
+    ajax.start();
+};
+
+/**
+ * 提交修改
+ */
+DictInfoDlg.editSubmit = function () {
+    this.collectData();
+    var ajax = new $ax(Feng.ctxPath + "/dict/update", function (data) {
+        Feng.success("修改成功!");
+        window.parent.Dict.table.refresh();
+        DictInfoDlg.close();
+    }, function (data) {
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set('dictId',$("#dictId").val());
+    ajax.set('dictName',this.dictName);
+    ajax.set('dictCode',this.dictCode);
+    ajax.set('dictTips',this.dictTips);
+    ajax.set('dictValues',this.mutiString);
+    ajax.start();
+};
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/driverActivity/driverActivity.js b/management/guns-admin/src/main/webapp/static/modular/system/driverActivity/driverActivity.js
new file mode 100644
index 0000000..032b1a7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/driverActivity/driverActivity.js
@@ -0,0 +1,208 @@
+/**
+ * 管理初始化
+ */
+var DriverActivity = {
+    id: "DriverActivityTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+DriverActivity.initColumn = function () {
+    return [
+            {field: 'selectItem', radio: true},
+            {title: '', field: 'id', visible: false, align: 'center', valign: 'middle'},
+            {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '活动名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+            {title: '开始时间', field: 'startTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '结束时间', field: 'endTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '参与人次', field: 'number', visible: true, align: 'center', valign: 'middle'},
+            {title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle'},
+            {title: '状态', field: 'status', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==1){
+                        return "待审核";
+                    }else if(value==2){
+                        return "已驳回";
+                    }else if(value==3){
+                        if(new Date()<new Date(row.startTime.replace(/-/g,"/"))){
+                            return "未开始";
+                        }else if(new Date()>new Date(row.endTime.replace(/-/g,"/"))){
+                            return "已结束";
+                        }else{
+                            return "进行中";
+                        }
+                    }else if(value==4){
+                        return "已暂停";
+                    }
+                }
+            }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+DriverActivity.check = function (type) {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        //验证类型null删除,1=审核,2=编辑,3=启动/暂停
+        if(type==null){
+            DriverActivity.seItem = selected[0];
+            return true;
+        }else if(type==3 && selected[0].status!=3 && selected[0].status!=4){
+            Feng.info("当前状态不能暂停/启动!");
+            return false;
+        }else if(type==3 && selected[0].status==3 && (selected[0].startTime>new Date() || new Date()>selected[0].endTime)){
+            Feng.info("当前状态不能暂停/启动!");
+            return false;
+        }else if(type==1 && selected[0].status!=1){
+            Feng.info("当前状态不能审核!");
+            return false;
+        }else if(type==2 && selected[0].status!=2){
+            Feng.info("当前状态不能编辑!");
+            return false;
+        }
+        DriverActivity.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+DriverActivity.openAddDriverActivity = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/driverActivity/driverActivity_add'
+    });
+    this.layerIndex = index;
+};
+/**
+ * 打开编辑
+ */
+DriverActivity.openUpdateDriverActivity = function () {
+    if (this.check(2)) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/driverActivity/driverActivity_update/' + DriverActivity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+/**
+ * 打开查看详情
+ */
+DriverActivity.openDriverActivityDetail = function () {
+    if (this.check(null)) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/driverActivity/driverActivity_detail/' + DriverActivity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+DriverActivity.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/driverActivity/delete", function (data) {
+            Feng.success("删除成功!");
+            DriverActivity.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("driverActivityId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 启动/暂停
+ */
+DriverActivity.updateStatus = function () {
+    if (this.check(3)) {
+        var ajax = new $ax(Feng.ctxPath + "/driverActivity/updateStatus", function (data) {
+            Feng.success("启动/暂停成功!");
+            DriverActivity.table.refresh();
+        }, function (data) {
+            Feng.error("动/暂停失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",this.seItem.id);
+        ajax.set("status",this.seItem.status==3?4:3);
+        ajax.start();
+    }
+};
+/**
+ * 领取记录
+ */
+DriverActivity.receiveRecord= function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '领取记录',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/driverActivity/receiveRecord?activityId='+ DriverActivity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 打开立即处理页面
+ */
+DriverActivity.immediately = function () {
+    if (this.check(1)) {
+        var index = layer.open({
+            type: 2,
+            title: '审核',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/driverActivity/driverActivity_immediately/' +  DriverActivity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+/**
+ * 查询列表
+ */
+DriverActivity.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['name'] = $("#name").val();
+    DriverActivity.table.refresh({query: queryData});
+};
+DriverActivity.resetSearch = function () {
+    $("#createTime").val("");
+    $("#name").val("");
+    DriverActivity.search();
+};
+$(function () {
+    var defaultColunms = DriverActivity.initColumn();
+    var table = new BSTable(DriverActivity.id, "/driverActivity/list", defaultColunms);
+    table.setPaginationType("server");
+    DriverActivity.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/driverActivity/driverActivity_info.js b/management/guns-admin/src/main/webapp/static/modular/system/driverActivity/driverActivity_info.js
new file mode 100644
index 0000000..78c7327
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/driverActivity/driverActivity_info.js
@@ -0,0 +1,277 @@
+/**
+ * 初始化详情对话框
+ */
+var DriverActivityInfoDlg = {
+    driverActivityInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+DriverActivityInfoDlg.clearData = function() {
+    this.driverActivityInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+DriverActivityInfoDlg.set = function(key, val) {
+    this.driverActivityInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+DriverActivityInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+DriverActivityInfoDlg.close = function() {
+    parent.layer.close(window.parent.DriverActivity.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+DriverActivityInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('name')
+    .set('companyId')
+    .set('insertTime')
+    .set('status')
+    .set('remark')
+    .set('startTime')
+    .set('endTime');
+}
+
+/**
+ * 提交添加
+ */
+DriverActivityInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    var staTime =$("#staTime").val();
+
+    if ($.trim($("#num1").val())=="") {
+        Feng.error("名称不能为空!");
+        return;
+    }
+    var re =  /^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/;
+    if (!re.test($("#num2").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+    if (!re.test($("#num3").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+
+    if (!re.test($("#num5").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+    if (!re.test($("#num7").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+    if (!re.test($("#num9").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+    if (!re.test($("#num11").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+
+    if (!/^[1-9]\d*$/.test($("#num4").val())) {
+        Feng.error("请输入正确小时数!");
+        return;
+    }
+    if (!/^[1-9]\d*$/.test($("#num6").val())) {
+        Feng.error("请输入正确小时数!");
+        return;
+    }
+    if (!/^[1-9]\d*$/.test($("#num8").val())) {
+        Feng.error("请输入正确小时数!");
+        return;
+    }
+    if (!/^[1-9]\d*$/.test($("#num10").val())) {
+        Feng.error("请输入正确单数!");
+        return;
+    }
+    if($.trim($("#startTime").val())==""){
+        Feng.error("请选择活动时间!");
+        return;
+    }
+    if($.trim(staTime)==""){
+        Feng.error("请选择时间!");
+        return;
+    }
+    if(parseInt(staTime.split(" - ")[0].split(":")[0])>parseInt(staTime.split(" - ")[1].split(":")[0])){
+        Feng.error("开始时间不能大于结束时间!");
+        return;
+    }
+    if(parseInt(staTime.split(" - ")[0].split(":")[0])==parseInt(staTime.split(" - ")[1].split(":")[0]) && parseInt(staTime.split(" - ")[0].split(":")[1])>parseInt(staTime.split(" - ")[1].split(":")[1])){
+        Feng.error("开始时间不能大于结束时间!");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/driverActivity/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.DriverActivity.table.refresh();
+        DriverActivityInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("startTime",$("#startTime").val());
+    ajax.set("staTime",$("#staTime").val());
+    ajax.set("num1",$("#num1").val());
+    ajax.set("num2",$("#num2").val());
+    ajax.set("num3",$("#num3").val());
+    ajax.set("num4",$("#num4").val());
+    ajax.set("num5",$("#num5").val());
+    ajax.set("num6",$("#num6").val());
+    ajax.set("num7",$("#num7").val());
+    ajax.set("num8",$("#num8").val());
+    ajax.set("num9",$("#num9").val());
+    ajax.set("num10",$("#num10").val());
+    ajax.set("num11",$("#num11").val());
+    ajax.start();
+}
+/**
+ * 立即处理
+ */
+DriverActivityInfoDlg.immediately = function(){
+
+    this.clearData();
+    this.collectData();
+
+    var remark = $("#remark").val();
+    if (remark.length > 250){
+        Feng.info("备注不能超过250个字");
+        return;
+    }
+    var state = $("input[name='state']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/driverActivity/immediately", function(data){
+        Feng.success("处理成功!");
+        window.parent.DriverActivity.table.refresh();
+        DriverActivityInfoDlg.close();
+    },function(data){
+        Feng.error("处理失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("state",state);
+    ajax.set("remark",$("#remark").val());
+    ajax.start();
+}
+/**
+ * 提交修改
+ */
+DriverActivityInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if ($.trim($("#num1").val())=="") {
+        Feng.error("名称不能为空!");
+        return;
+    }
+    var re =  /^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/;
+    if (!re.test($("#num2").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+    if (!re.test($("#num3").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+
+    if (!re.test($("#num5").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+    if (!re.test($("#num7").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+    if (!re.test($("#num9").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+    if (!re.test($("#num11").val())) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+
+    if (!/^[1-9]\d*$/.test($("#num4").val())) {
+        Feng.error("请输入正确小时数!");
+        return;
+    }
+    if (!/^[1-9]\d*$/.test($("#num6").val())) {
+        Feng.error("请输入正确小时数!");
+        return;
+    }
+    if (!/^[1-9]\d*$/.test($("#num8").val())) {
+        Feng.error("请输入正确小时数!");
+        return;
+    }
+    if (!/^[1-9]\d*$/.test($("#num10").val())) {
+        Feng.error("请输入正确单数!");
+        return;
+    }
+    if($.trim($("#startTime").val())==""){
+        Feng.error("请选择活动时间!");
+        return;
+    }
+    if($.trim($("#staTime").val())==""){
+        Feng.error("请选择时间!");
+        return;
+    }
+    if(parseInt(staTime.split(" - ")[0].split(":")[0])>parseInt(staTime.split(" - ")[1].split(":")[0])){
+        Feng.error("开始时间不能大于结束时间!");
+        return;
+    }
+    if(parseInt(staTime.split(" - ")[0].split(":")[0])==parseInt(staTime.split(" - ")[1].split(":")[0]) && parseInt(staTime.split(" - ")[0].split(":")[1])>parseInt(staTime.split(" - ")[1].split(":")[1])){
+        Feng.error("开始时间不能大于结束时间!");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/driverActivity/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.DriverActivity.table.refresh();
+        DriverActivityInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("startTime",$("#startTime").val());
+    ajax.set("staTime",$("#staTime").val());
+    ajax.set("num1",$("#num1").val());
+    ajax.set("num2",$("#num2").val());
+    ajax.set("num3",$("#num3").val());
+    ajax.set("num4",$("#num4").val());
+    ajax.set("num5",$("#num5").val());
+    ajax.set("num6",$("#num6").val());
+    ajax.set("num7",$("#num7").val());
+    ajax.set("num8",$("#num8").val());
+    ajax.set("num9",$("#num9").val());
+    ajax.set("num10",$("#num10").val());
+    ajax.set("num11",$("#num11").val());
+    ajax.set("id",$("#id").val());
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/driverActivityHistory/driverActivityHistory.js b/management/guns-admin/src/main/webapp/static/modular/system/driverActivityHistory/driverActivityHistory.js
new file mode 100644
index 0000000..9cce5ff
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/driverActivityHistory/driverActivityHistory.js
@@ -0,0 +1,104 @@
+/**
+ * 管理初始化
+ */
+var DriverActivityHistory = {
+    id: "DriverActivityHistoryTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+DriverActivityHistory.initColumn = function () {
+    return [
+            {title: '主键', field: 'id', visible: false, align: 'center', valign: 'middle'},
+            {title: '领取时间', field: 'collectionTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '领取人', field: 'name', visible: true, align: 'center', valign: 'middle'},
+            {title: '领取人电话', field: 'phone', visible: true, align: 'center', valign: 'middle'},
+            {title: '领取金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+DriverActivityHistory.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        DriverActivityHistory.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+DriverActivityHistory.openAddDriverActivityHistory = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/driverActivityHistory/driverActivityHistory_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+DriverActivityHistory.openDriverActivityHistoryDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/driverActivityHistory/driverActivityHistory_update/' + DriverActivityHistory.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+DriverActivityHistory.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/driverActivityHistory/delete", function (data) {
+            Feng.success("删除成功!");
+            DriverActivityHistory.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("driverActivityHistoryId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询列表
+ */
+DriverActivityHistory.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    DriverActivityHistory.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = DriverActivityHistory.initColumn();
+    var table = new BSTable(DriverActivityHistory.id, "/driverActivityHistory/list", defaultColunms);
+    table.setPaginationType("server");
+    var queryData = {};
+    queryData['activityId'] = $("#activityId").val();
+    queryData['type'] = $("#type").val();
+    table.setQueryParams(queryData);
+    DriverActivityHistory.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/log/log.js b/management/guns-admin/src/main/webapp/static/modular/system/log/log.js
new file mode 100644
index 0000000..624df0f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/log/log.js
@@ -0,0 +1,105 @@
+/**
+ * 日志管理初始化
+ */
+var OptLog = {
+    id: "OptLogTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+OptLog.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        /*{title: '日志类型', field: 'logtype', align: 'center', valign: 'middle'},*/
+        {title: '日志名称', field: 'logname', align: 'center', valign: 'middle'},
+        // {title: '用户名称', field: 'userName', align: 'center', valign: 'middle', sortable: true, sortName: 'userid'},
+        {title: '用户名称', field: 'userName', align: 'center', valign: 'middle'},
+        // {title: '类名', field: 'classname', align: 'center', valign: 'middle'},
+        // {title: '方法名', field: 'method', align: 'center', valign: 'middle'},
+        {title: '时间', field: 'createtime', align: 'center', valign: 'middle'},
+        {title: '具体消息', field: 'message', align: 'center', valign: 'middle'}];
+};
+
+/**
+ * 检查是否选中
+ */
+OptLog.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        OptLog.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 查看日志详情
+ */
+OptLog.detail = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/log/detail/" + this.seItem.id, function (data) {
+            Feng.infoDetail("日志详情", data.regularMessage);
+        }, function (data) {
+            Feng.error("获取详情失败!");
+        });
+        ajax.start();
+    }
+};
+
+
+/**
+ * 清空日志
+ */
+OptLog.delLog = function () {
+    Feng.confirm("是否清空所有日志?",function(){
+        var ajax = Feng.baseAjax("/log/delLog","清空日志");
+        ajax.start();
+        OptLog.table.refresh();
+    });
+}
+
+/**
+ * 查询表单提交参数对象
+ * @returns {{}}
+ */
+OptLog.formParams = function() {
+    var queryData = {};
+
+    queryData['logName'] = $("#logName").val();
+    queryData['beginTime'] = $("#beginTime").val();
+    queryData['endTime'] = $("#endTime").val();
+    queryData['logType'] = $("#logType").val();
+
+    return queryData;
+}
+
+/**
+ * 查询日志列表
+ */
+OptLog.search = function () {
+
+    OptLog.table.refresh({query: OptLog.formParams()});
+};
+
+
+OptLog.resetSearch = function () {
+    $("#beginTime").val("");
+    $("#endTime").val("");
+    $("#logName").val("");
+    OptLog.search();
+}
+
+$(function () {
+    var defaultColunms = OptLog.initColumn();
+    var table = new BSTable(OptLog.id, "/log/list", defaultColunms);
+    table.setPaginationType("server");
+    table.setQueryParams(OptLog.formParams());
+    OptLog.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/log/login_log.js b/management/guns-admin/src/main/webapp/static/modular/system/log/login_log.js
new file mode 100644
index 0000000..a9302f3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/log/login_log.js
@@ -0,0 +1,123 @@
+/**
+ * 日志管理初始化
+ */
+var LoginLog = {
+    id: "LoginLogTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+LoginLog.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '日志名称', field: 'logname', align: 'center', valign: 'middle'},
+        {title: '用户名称', field: 'userName', align: 'center', valign: 'middle'},
+        {title: '时间', field: 'createtime', align: 'center', valign: 'middle'},
+        /*{title: '具体消息', field: 'message', align: 'center', valign: 'middle', sortable: true},*/
+        {title: 'ip', field: 'ip', align: 'center', valign: 'middle'}];
+};
+
+/**
+ * 检查是否选中
+ */
+LoginLog.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        LoginLog.seItem = selected[0];
+        return true;
+    }
+};
+
+
+/**
+ * 清空日志
+ */
+LoginLog.delLog = function () {
+    Feng.confirm("是否清空所有日志?", function () {
+        var ajax = Feng.baseAjax("/loginLog/delLoginLog", "清空日志");
+        ajax.start();
+        LoginLog.table.refresh();
+    });
+}
+
+/**
+ * 查询日志列表
+ */
+LoginLog.search = function () {
+    var queryData = {};
+
+    queryData['logName'] = $("#logName").val();
+    queryData['beginTime'] = $("#beginTime").val();
+    queryData['endTime'] = $("#endTime").val();
+
+    LoginLog.table.refresh({query: queryData});
+};
+
+/**
+ * 搜索充值
+ */
+LoginLog.resetSearch = function () {
+    $("#beginTime").val("");
+    $("#endTime").val("");
+    $("#logName").val("");
+    LoginLog.search();
+}
+
+$(function () {
+
+    init();
+
+    var defaultColunms = LoginLog.initColumn();
+    var table = new BSTable(LoginLog.id, "/loginLog/list", defaultColunms);
+    table.setPaginationType("server");
+    LoginLog.table = table.init();
+});
+
+function init() {
+
+    var BootstrapTable = $.fn.bootstrapTable.Constructor;
+    BootstrapTable.prototype.onSort = function (event) {
+        var $this = event.type === "keypress" ? $(event.currentTarget) : $(event.currentTarget).parent(),
+            $this_ = this.$header.find('th').eq($this.index()),
+            sortName = this.header.sortNames[$this.index()];
+
+        this.$header.add(this.$header_).find('span.order').remove();
+
+        if (this.options.sortName === $this.data('field')) {
+            this.options.sortOrder = this.options.sortOrder === 'asc' ? 'desc' : 'asc';
+        } else {
+            this.options.sortName = sortName || $this.data('field');
+            this.options.sortOrder = $this.data('order') === 'asc' ? 'desc' : 'asc';
+        }
+        this.trigger('sort', this.options.sortName, this.options.sortOrder);
+
+        $this.add($this_).data('order', this.options.sortOrder);
+
+        // Assign the correct sortable arrow
+        this.getCaret();
+
+        if (this.options.sidePagination === 'server') {
+            this.initServer(this.options.silentSort);
+            return;
+        }
+
+        this.initSort();
+        this.initBody();
+    };
+    BootstrapTable.prototype.getCaret = function () {
+        var that = this;
+
+        $.each(this.$header.find('th'), function (i, th) {
+            var sortName = that.header.sortNames[i];
+            $(th).find('.sortable').removeClass('desc asc').addClass((sortName || $(th).data('field')) === that.options.sortName ? that.options.sortOrder : 'both');
+        });
+    };
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/menu/menu.js b/management/guns-admin/src/main/webapp/static/modular/system/menu/menu.js
new file mode 100644
index 0000000..79e65a1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/menu/menu.js
@@ -0,0 +1,119 @@
+/**
+ * 角色管理的单例
+ */
+var Menu = {
+    id: "menuTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+Menu.initColumn = function () {
+    var columns = [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '菜单名称', field: 'name', align: 'center', valign: 'middle', sortable: true},
+        {title: '菜单编号', field: 'code', align: 'center', valign: 'middle', sortable: true},
+        {title: '菜单父编号', field: 'pcode', align: 'center', valign: 'middle', sortable: true},
+        {title: '请求地址', field: 'url', align: 'center', valign: 'middle', sortable: true},
+        {title: '排序', field: 'num', align: 'center', valign: 'middle', sortable: true},
+        {title: '层级', field: 'levels', align: 'center', valign: 'middle', sortable: true},
+        {title: '是否是菜单', field: 'isMenuName', align: 'center', valign: 'middle', sortable: true},
+        {title: '状态', field: 'statusName', align: 'center', valign: 'middle', sortable: true}]
+    return columns;
+};
+
+
+/**
+ * 检查是否选中
+ */
+Menu.check = function () {
+    var selected = $('#' + this.id).bootstrapTreeTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        Menu.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加菜单
+ */
+Menu.openAddMenu = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加菜单',
+        area: ['830px', '450px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/menu/menu_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 点击修改
+ */
+Menu.openChangeMenu = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '修改菜单',
+            area: ['800px', '450px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/menu/menu_edit/' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+Menu.delMenu = function () {
+    if (this.check()) {
+
+        var operation = function () {
+            var ajax = new $ax(Feng.ctxPath + "/menu/remove", function (data) {
+                Feng.success("删除成功!");
+                Menu.table.refresh();
+            }, function (data) {
+                Feng.error("删除失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("menuId", Menu.seItem.id);
+            ajax.start();
+        };
+
+        Feng.confirm("是否刪除该菜单?", operation);
+    }
+};
+
+/**
+ * 搜索
+ */
+Menu.search = function () {
+    var queryData = {};
+
+    queryData['menuName'] = $("#menuName").val();
+    queryData['level'] = $("#level").val();
+
+    Menu.table.refresh({query: queryData});
+}
+
+$(function () {
+    var defaultColunms = Menu.initColumn();
+    var table = new BSTreeTable(Menu.id, "/menu/list", defaultColunms);
+    table.setExpandColumn(2);
+    table.setIdField("id");
+    table.setCodeField("code");
+    table.setParentCodeField("pcode");
+    table.setExpandAll(true);
+    table.init();
+    Menu.table = table;
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/menu/menu_info.js b/management/guns-admin/src/main/webapp/static/modular/system/menu/menu_info.js
new file mode 100644
index 0000000..8fca601
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/menu/menu_info.js
@@ -0,0 +1,175 @@
+/**
+ * 菜单详情对话框
+ */
+var MenuInfoDlg = {
+    menuInfoData: {},
+    ztreeInstance: null,
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '菜单名称不能为空'
+                }
+            }
+        },
+        code: {
+            validators: {
+                notEmpty: {
+                    message: '菜单编号不能为空'
+                }
+            }
+        },
+        pcodeName: {
+            validators: {
+                notEmpty: {
+                    message: '父菜单不能为空'
+                }
+            }
+        },
+        url: {
+            validators: {
+                notEmpty: {
+                    message: '请求地址不能为空'
+                }
+            }
+        },
+        num: {
+            validators: {
+                notEmpty: {
+                    message: '序号不能为空'
+                }
+            }
+        }
+    }
+};
+
+/**
+ * 清除数据
+ */
+MenuInfoDlg.clearData = function () {
+    this.menuInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+MenuInfoDlg.set = function (key, value) {
+    this.menuInfoData[key] = (typeof value == "undefined") ? $("#" + key).val() : value;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+MenuInfoDlg.get = function (key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+MenuInfoDlg.close = function () {
+    parent.layer.close(window.parent.Menu.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+MenuInfoDlg.collectData = function () {
+    this.set('id').set('name').set('code').set('pcode').set('url').set('num').set('levels').set('icon').set("ismenu");
+}
+
+/**
+ * 验证数据是否为空
+ */
+MenuInfoDlg.validate = function () {
+    $('#menuInfoForm').data("bootstrapValidator").resetForm();
+    $('#menuInfoForm').bootstrapValidator('validate');
+    return $("#menuInfoForm").data('bootstrapValidator').isValid();
+}
+
+/**
+ * 提交添加用户
+ */
+MenuInfoDlg.addSubmit = function () {
+
+    this.clearData();
+    this.collectData();
+
+    if (!this.validate()) {
+        return;
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/menu/add", function (data) {
+        Feng.success("添加成功!");
+        window.parent.Menu.table.refresh();
+        MenuInfoDlg.close();
+    }, function (data) {
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.menuInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+MenuInfoDlg.editSubmit = function () {
+
+    this.clearData();
+    this.collectData();
+
+    if (!this.validate()) {
+        return;
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/menu/edit", function (data) {
+        Feng.success("修改成功!");
+        window.parent.Menu.table.refresh();
+        MenuInfoDlg.close();
+    }, function (data) {
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.menuInfoData);
+    ajax.start();
+}
+
+/**
+ * 点击父级编号input框时
+ */
+MenuInfoDlg.onClickDept = function (e, treeId, treeNode) {
+    $("#pcodeName").attr("value", MenuInfoDlg.ztreeInstance.getSelectedVal());
+    $("#pcode").attr("value", treeNode.id);
+};
+
+
+/**
+ * 显示父级菜单选择的树
+ */
+MenuInfoDlg.showMenuSelectTree = function () {
+    Feng.showInputTree("pcodeName", "pcodeTreeDiv", 15, 34);
+};
+
+$(function () {
+    Feng.initValidator("menuInfoForm", MenuInfoDlg.validateFields);
+
+    var ztree = new $ZTree("pcodeTree", "/menu/selectMenuTreeList");
+    ztree.bindOnClick(MenuInfoDlg.onClickDept);
+    ztree.init();
+    MenuInfoDlg.ztreeInstance = ztree;
+
+    //初始化是否是菜单
+    if($("#ismenuValue").val() == undefined){
+        $("#ismenu").val(0);
+    }else{
+        $("#ismenu").val($("#ismenuValue").val());
+    }
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/notice/notice.js b/management/guns-admin/src/main/webapp/static/modular/system/notice/notice.js
new file mode 100644
index 0000000..fc5f730
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/notice/notice.js
@@ -0,0 +1,106 @@
+/**
+ * 通知管理初始化
+ */
+var Notice = {
+    id: "NoticeTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+Notice.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '标题', field: 'title', align: 'center', valign: 'middle', sortable: true},
+        {title: '内容', field: 'content', align: 'center', valign: 'middle', sortable: true},
+        {title: '发布者', field: 'createrName', align: 'center', valign: 'middle', sortable: true},
+        {title: '创建时间', field: 'createtime', align: 'center', valign: 'middle', sortable: true}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+Notice.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        Notice.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加通知
+ */
+Notice.openAddNotice = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加通知',
+        area: ['800px', '500px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/notice/notice_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看通知详情
+ */
+Notice.openNoticeDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '通知详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/notice/notice_update/' + Notice.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除通知
+ */
+Notice.delete = function () {
+    if (this.check()) {
+
+        var operation = function(){
+            var ajax = new $ax(Feng.ctxPath + "/notice/delete", function (data) {
+                Feng.success("删除成功!");
+                Notice.table.refresh();
+            }, function (data) {
+                Feng.error("删除失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("noticeId", Notice.seItem.id);
+            ajax.start();
+        };
+
+        Feng.confirm("是否删除通知 " + Notice.seItem.title + "?", operation);
+    }
+};
+
+/**
+ * 查询通知列表
+ */
+Notice.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    Notice.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = Notice.initColumn();
+    var table = new BSTable(Notice.id, "/notice/list", defaultColunms);
+    table.setPaginationType("client");
+    Notice.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/notice/notice_info.js b/management/guns-admin/src/main/webapp/static/modular/system/notice/notice_info.js
new file mode 100644
index 0000000..a376d48
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/notice/notice_info.js
@@ -0,0 +1,127 @@
+/**
+ * 初始化通知详情对话框
+ */
+var NoticeInfoDlg = {
+    noticeInfoData: {},
+    editor: null,
+    validateFields: {
+        title: {
+            validators: {
+                notEmpty: {
+                    message: '标题不能为空'
+                }
+            }
+        }
+    }
+};
+
+/**
+ * 清除数据
+ */
+NoticeInfoDlg.clearData = function () {
+    this.noticeInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+NoticeInfoDlg.set = function (key, value) {
+    this.noticeInfoData[key] = (typeof value == "undefined") ? $("#" + key).val() : value;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+NoticeInfoDlg.get = function (key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+NoticeInfoDlg.close = function () {
+    parent.layer.close(window.parent.Notice.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+NoticeInfoDlg.collectData = function () {
+    this.noticeInfoData['content'] = NoticeInfoDlg.editor.txt.html();
+    this.set('id').set('title');
+}
+
+/**
+ * 验证数据是否为空
+ */
+NoticeInfoDlg.validate = function () {
+    $('#noticeInfoForm').data("bootstrapValidator").resetForm();
+    $('#noticeInfoForm').bootstrapValidator('validate');
+    return $("#noticeInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 提交添加
+ */
+NoticeInfoDlg.addSubmit = function () {
+
+    this.clearData();
+    this.collectData();
+
+    if (!this.validate()) {
+        return;
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/notice/add", function (data) {
+        Feng.success("添加成功!");
+        window.parent.Notice.table.refresh();
+        NoticeInfoDlg.close();
+    }, function (data) {
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.noticeInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+NoticeInfoDlg.editSubmit = function () {
+
+    this.clearData();
+    this.collectData();
+
+    if (!this.validate()) {
+        return;
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/notice/update", function (data) {
+        Feng.success("修改成功!");
+        window.parent.Notice.table.refresh();
+        NoticeInfoDlg.close();
+    }, function (data) {
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.noticeInfoData);
+    ajax.start();
+}
+
+$(function () {
+    Feng.initValidator("noticeInfoForm", NoticeInfoDlg.validateFields);
+
+    //初始化编辑器
+    var E = window.wangEditor;
+    var editor = new E('#editor');
+    editor.create();
+    editor.txt.html($("#contentVal").val());
+    NoticeInfoDlg.editor = editor;
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/report/couponStatistics.js b/management/guns-admin/src/main/webapp/static/modular/system/report/couponStatistics.js
new file mode 100644
index 0000000..d91d466
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/report/couponStatistics.js
@@ -0,0 +1,399 @@
+/**
+ * 车辆品牌管理管理初始化
+ */
+var CouponStatistics = {
+    id: "TCarBrandTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1,
+    type: 1,
+    dataId: null
+};
+
+/**
+ * 初始化表格的列
+ */
+CouponStatistics.initColumn = function () {
+    return [
+        [
+            {field: 'selectItem', radio: true, colspan: 1, rowspan: 2},
+            {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle', colspan: 1, rowspan: 2},
+            {title: '日期', field: 'time', visible: true, align: 'center', valign: 'middle',width:'300px',colspan: 1, rowspan: 2},
+            {title: '领取情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 4, rowspan: 1},
+            {title: '使用情况', field: '', visible: true, align: 'center', valign: 'middle',width:'800px', colspan: 3, rowspan: 1}
+        ],
+        [
+            {title: '注册领取人数', field: 'orderNum', visible: true, align: 'center', valign: 'middle',width:'30%'},
+            {title: '赠送派发人数', field: 'cancelNum', visible: true, align: 'center', valign: 'middle',width:'30%'},
+            {title: '合计', field: 'cancelProportion', visible: true, align: 'center', valign: 'middle'},
+            {title: '领取金额', field: 'onlinePay', visible: true, align: 'center', valign: 'middle',width:'10%'},
+            {title: '使用人数', field: 'offlinePay', visible: true, align: 'center', valign: 'middle',width:'10%'},
+            {title: '使用张数', field: 'total', visible: true, align: 'center', valign: 'middle',width:'10%'},
+            {title: '使用金额', field: 'payProportion', visible: true, align: 'center', valign: 'middle',width:'10%'}
+        ]
+
+
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+CouponStatistics.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        CouponStatistics.seItem = selected[0];
+        return true;
+    }
+};
+
+
+CouponStatistics.cutover = function(type, e){
+    if(typeof type != 'undefined' && null != type){
+        CouponStatistics.type = type;
+    }
+    if(null != e){
+        $('.nav-tabs li').removeAttr('class');
+        $(e).attr('class', 'active');
+    }
+    CouponStatistics.refresh();
+
+}
+
+
+CouponStatistics.refresh = function(){
+    switch (CouponStatistics.type) {
+        case 1:
+            $('#panel1').show();
+            $('#panel2').hide();
+            $('#panel3').hide();
+            $('#panel4').hide();
+            $('#panel5').hide();
+            var defaultColunms = [
+                [
+                    {field: 'selectItem', radio: true, colspan: 1, rowspan: 2},
+                    {title: '日期', field: 'time', visible: true, align: 'center', valign: 'middle',width:'200px',colspan: 1, rowspan: 2},
+                    {title: '领取情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 4, rowspan: 1},
+                    {title: '使用情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 3, rowspan: 1}
+                ],
+                [
+                    {title: '注册领取人数', field: 'receivePeople', visible: true, align: 'center', valign: 'middle'},
+                    {title: '赠送派发人数', field: 'giving', visible: true, align: 'center', valign: 'middle'},
+                    {title: '合计', field: 'receive', visible: true, align: 'center', valign: 'middle'},
+                    {title: '领取金额', field: 'receiveMoney', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用人数', field: 'usePeople', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用张数', field: 'use', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用金额', field: 'useMoney', visible: true, align: 'center', valign: 'middle'}
+                ]
+            ];
+            var table = new BSTable("TCarBrandTable1", "/report/queryCouponRegister", defaultColunms);
+            table.setPaginationType("server");
+            table.setQueryParams({
+                type: 2,
+            })
+            CouponStatistics.table = table.init();
+            break;
+        case 2:
+            $('#panel1').hide();
+            $('#panel2').show();
+            $('#panel3').hide();
+            $('#panel4').hide();
+            $('#panel5').hide();
+            var defaultColunms = [
+                [
+                    {field: 'selectItem', radio: true, colspan: 1, rowspan: 2},
+                    {title: '日期', field: 'time', visible: true, align: 'center', valign: 'middle',width:'200px',colspan: 1, rowspan: 2},
+                    {title: '领取情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 4, rowspan: 1},
+                    {title: '使用情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 3, rowspan: 1}
+                ],
+                [
+                    {title: '邀请领取人数', field: 'receivePeople', visible: true, align: 'center', valign: 'middle'},
+                    {title: '合计', field: 'receive', visible: true, align: 'center', valign: 'middle'},
+                    {title: '领取金额', field: 'receiveMoney', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用人数', field: 'usePeople', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用张数', field: 'use', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用金额', field: 'useMoney', visible: true, align: 'center', valign: 'middle'}
+                ]
+            ];
+            var table = new BSTable("TCarBrandTable2", "/report/queryCouponRegister", defaultColunms);
+            table.setPaginationType("server");
+            table.setQueryParams({
+                type: 3,
+            })
+            CouponStatistics.table = table.init();
+            break;
+        case 3:
+            $('#panel1').hide();
+            $('#panel2').hide();
+            $('#panel3').show();
+            $('#panel4').hide();
+            $('#panel5').hide();
+            var defaultColunms = [
+                [
+                    {field: 'selectItem', radio: true, colspan: 1, rowspan: 2},
+                    {title: '日期', field: 'time', visible: true, align: 'center', valign: 'middle',width:'200px',colspan: 1, rowspan: 2},
+                    {title: '领取情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 4, rowspan: 1},
+                    {title: '使用情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 3, rowspan: 1}
+                ],
+                [
+                    {title: '充值领取人数', field: 'receivePeople', visible: true, align: 'center', valign: 'middle'},
+                    {title: '合计', field: 'receive', visible: true, align: 'center', valign: 'middle'},
+                    {title: '领取金额', field: 'receiveMoney', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用人数', field: 'usePeople', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用张数', field: 'use', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用金额', field: 'useMoney', visible: true, align: 'center', valign: 'middle'}
+                ]
+            ];
+            var table = new BSTable("TCarBrandTable3", "/report/queryCouponRegister", defaultColunms);
+            table.setPaginationType("server");
+            table.setQueryParams({
+                type: 4,
+            })
+            CouponStatistics.table = table.init();
+            break;
+        case 4:
+            $('#panel1').hide();
+            $('#panel2').hide();
+            $('#panel3').hide();
+            $('#panel4').show();
+            $('#panel5').hide();
+            var defaultColunms = [
+                [
+                    {field: 'selectItem', radio: true, colspan: 1, rowspan: 2},
+                    {title: '日期', field: 'time', visible: true, align: 'center', valign: 'middle',width:'200px',colspan: 1, rowspan: 2},
+                    {title: '使用情况', field: '', visible: true, align: 'center', valign: 'middle',width:'800px', colspan: 2, rowspan: 1}
+                ],
+                [
+                    {title: '折扣参与人数', field: 'userNum', visible: true, align: 'center', valign: 'middle'},
+                    {title: '折扣金额', field: 'discountMoney', visible: true, align: 'center', valign: 'middle'}
+                ]
+            ];
+            var table = new BSTable("TCarBrandTable4", "/report/queryDiscount1", defaultColunms);
+            table.setPaginationType("server");
+            table.setQueryParams()
+            CouponStatistics.table = table.init();
+            break;
+        case 5:
+            $('#panel1').hide();
+            $('#panel2').hide();
+            $('#panel3').hide();
+            $('#panel4').hide();
+            $('#panel5').show();
+            var defaultColunms = [
+                [
+                    {field: 'selectItem', radio: true, colspan: 1, rowspan: 2},
+                    {title: '日期', field: 'time', visible: true, align: 'center', valign: 'middle',width:'200px',colspan: 1, rowspan: 2},
+                    {title: '领取情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 4, rowspan: 1},
+                    {title: '使用情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 3, rowspan: 1}
+                ],
+                [
+                    {title: '红包领取人数', field: 'receivePeople', visible: true, align: 'center', valign: 'middle'},
+                    {title: '合计', field: 'receivePeople', visible: true, align: 'center', valign: 'middle'},
+                    {title: '领取金额', field: 'receiveMoney', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用人数', field: 'usePeople', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用张数', field: 'use', visible: true, align: 'center', valign: 'middle'},
+                    {title: '使用金额', field: 'useMoney', visible: true, align: 'center', valign: 'middle'}
+                ]
+            ];
+            var table = new BSTable("TCarBrandTable5", "/report/queryRedEnvelopes", defaultColunms);
+            table.setPaginationType("server");
+            table.setQueryParams({})
+            CouponStatistics.table = table.init();
+            break;
+    }
+}
+
+
+
+CouponStatistics.openCouponStatisticsInfo1 = function (type) {
+    var index = layer.open({
+        type: 2,
+        title: '注册奖励明细',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/report/showCouponStatisticsInfo?type=' + type
+    });
+    this.layerIndex = index;
+};
+CouponStatistics.openCouponStatisticsInfo2 = function (type) {
+    var index = layer.open({
+        type: 2,
+        title: '邀请奖励明细',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/report/showCouponStatisticsInfo?type=' + type
+    });
+    this.layerIndex = index;
+};
+CouponStatistics.openCouponStatisticsInfo3 = function (type) {
+    var index = layer.open({
+        type: 2,
+        title: '充值赠送奖励',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/report/showCouponStatisticsInfo?type=' + type
+    });
+    this.layerIndex = index;
+};
+CouponStatistics.openCouponStatisticsInfo4 = function (type) {
+    var index = layer.open({
+        type: 2,
+        title: '折扣优惠',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/report/showCouponStatisticsInfo?type=' + type
+    });
+    this.layerIndex = index;
+};
+CouponStatistics.openCouponStatisticsInfo5 = function (type) {
+    var index = layer.open({
+        type: 2,
+        title: '红包奖励',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/report/showCouponStatisticsInfo?type=' + type
+    });
+    this.layerIndex = index;
+};
+
+
+
+
+
+
+CouponStatistics.downloadExcel1 = function(){
+    window.location.href = Feng.ctxPath + "/report/downloadCouponRegister?type=2&name=" + $("#name1").val() + "&time=" + $("#time1").val() + "&companyId=" + $("#company1").val();
+}
+CouponStatistics.downloadExcel2 = function(){
+    window.location.href = Feng.ctxPath + "/report/downloadCouponRegister?type=3&name=" + $("#name2").val() + "&time=" + $("#time2").val() + "&companyId=" + $("#company2").val();
+}
+CouponStatistics.downloadExcel3 = function(){
+    window.location.href = Feng.ctxPath + "/report/downloadCouponRegister?type=4&name=" + $("#name3").val() + "&time=" + $("#time3").val() + "&companyId=" + $("#company3").val();
+}
+CouponStatistics.downloadExcel4 = function(){
+    window.location.href = Feng.ctxPath + "/report/downloadDiscount1?name=" + $("#name4").val() + "&time=" + $("#time4").val() + "&companyId=" + $("#company4").val();
+}
+CouponStatistics.downloadExcel5 = function(){
+    window.location.href = Feng.ctxPath + "/report/downloadRedEnvelopes?name=" + $("#name5").val() + "&time=" + $("#time5").val() + "&companyId=" + $("#company5").val();
+}
+
+
+
+
+/**
+ * 查询车辆品牌管理列表
+ */
+CouponStatistics.search1 = function () {
+    var queryData = {};
+    queryData['name'] = $("#name1").val();
+    queryData['time'] = $("#time1").val();
+    queryData['companyId'] = $("#company1").val();
+    CouponStatistics.table.refresh({query: queryData});
+};
+
+CouponStatistics.resetSearch1 = function () {
+    $("#name1").val("");
+    $("#time1").val("");
+    $("#company1").val("");
+    CouponStatistics.search();
+};
+
+
+CouponStatistics.search2 = function () {
+    var queryData = {};
+    queryData['name'] = $("#name2").val();
+    queryData['time'] = $("#time2").val();
+    queryData['companyId'] = $("#company2").val();
+    CouponStatistics.table.refresh({query: queryData});
+};
+
+CouponStatistics.resetSearch2 = function () {
+    $("#name2").val("");
+    $("#time2").val("");
+    $("#company2").val("");
+    CouponStatistics.search();
+};
+
+CouponStatistics.search3 = function () {
+    var queryData = {};
+    queryData['name'] = $("#name3").val();
+    queryData['time'] = $("#time3").val();
+    queryData['companyId'] = $("#company3").val();
+    CouponStatistics.table.refresh({query: queryData});
+};
+
+CouponStatistics.resetSearch3 = function () {
+    $("#name3").val("");
+    $("#time3").val("");
+    $("#company3").val("");
+    CouponStatistics.search();
+};
+
+
+CouponStatistics.search4 = function () {
+    var queryData = {};
+    queryData['name'] = $("#name4").val();
+    queryData['time'] = $("#time4").val();
+    queryData['companyId'] = $("#company4").val();
+    CouponStatistics.table.refresh({query: queryData});
+};
+
+CouponStatistics.resetSearch4 = function () {
+    $("#name4").val("");
+    $("#time4").val("");
+    $("#company4").val("");
+    CouponStatistics.search();
+};
+
+
+CouponStatistics.search5 = function () {
+    var queryData = {};
+    queryData['name'] = $("#name5").val();
+    queryData['time'] = $("#time5").val();
+    queryData['companyId'] = $("#company5").val();
+    CouponStatistics.table.refresh({query: queryData});
+};
+
+CouponStatistics.resetSearch5 = function () {
+    $("#name5").val("");
+    $("#time5").val("");
+    $("#company5").val("");
+    CouponStatistics.search();
+};
+
+
+$(function () {
+    var defaultColunms = [
+        [
+            {field: 'selectItem', radio: true, colspan: 1, rowspan: 2},
+            {title: '日期', field: 'time', visible: true, align: 'center', valign: 'middle',width:'200px',colspan: 1, rowspan: 2},
+            {title: '领取情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 4, rowspan: 1},
+            {title: '使用情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 3, rowspan: 1}
+        ],
+        [
+            {title: '注册领取人数', field: 'receivePeople', visible: true, align: 'center', valign: 'middle'},
+            {title: '赠送派发人数', field: 'giving', visible: true, align: 'center', valign: 'middle'},
+            {title: '合计', field: 'receive', visible: true, align: 'center', valign: 'middle'},
+            {title: '领取金额', field: 'receiveMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '使用人数', field: 'usePeople', visible: true, align: 'center', valign: 'middle'},
+            {title: '使用张数', field: 'use', visible: true, align: 'center', valign: 'middle'},
+            {title: '使用金额', field: 'useMoney', visible: true, align: 'center', valign: 'middle'}
+        ]
+
+
+    ];
+    var table = new BSTable("TCarBrandTable1", "/report/queryCouponRegister", defaultColunms);
+    table.setPaginationType("server");
+    table.setQueryParams({
+        type: 2,
+    })
+    CouponStatistics.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/report/couponStatisticsInfo.js b/management/guns-admin/src/main/webapp/static/modular/system/report/couponStatisticsInfo.js
new file mode 100644
index 0000000..756c743
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/report/couponStatisticsInfo.js
@@ -0,0 +1,135 @@
+/**
+ * 车辆品牌管理管理初始化
+ */
+var CouponStatisticsInfo = {
+    id: "TCarBrandTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1,
+    type: $('#type').val(),
+    dataId: null
+};
+
+
+
+/**
+ * 检查是否选中
+ */
+CouponStatisticsInfo.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        CouponStatisticsInfo.seItem = selected[0];
+        return true;
+    }
+};
+
+
+CouponStatisticsInfo.downloadExcel = function(){
+    window.location.href = Feng.ctxPath + "/report/downloadCouponStatisticsInfo?type=" + CouponStatisticsInfo.type +"&name=" + $("#name").val() + "&time=" + $("#time").val() + "&companyId=" + $("#company").val();
+}
+
+
+/**
+ * 查询车辆品牌管理列表
+ */
+CouponStatisticsInfo.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['time'] = $("#time").val();
+    queryData['companyId'] = $("#company").val();
+    CouponStatisticsInfo.table.refresh({query: queryData});
+};
+
+CouponStatisticsInfo.resetSearch = function () {
+    $("#name").val("");
+    $("#time").val("");
+    $("#company").val("");
+    CouponStatisticsInfo.search();
+};
+
+
+$(function () {
+    if(CouponStatisticsInfo.type == 1 || CouponStatisticsInfo.type == 2){
+        var defaultColunms =
+            [
+                {field: 'selectItem', radio: true},
+                {title: '领取时间', field: 'time', visible: true, align: 'center', valign: 'middle',width:'200px'},
+                {title: '领取人', field: 'userName', visible: true, align: 'center', valign: 'middle',width:'200px'},
+                {title: '领取人电话', field: 'phone', visible: true, align: 'center', valign: 'middle',width:'200px'},
+                {title: '领取金额', field: 'money', visible: true, align: 'center', valign: 'middle',width:'200px'},
+                {title: '到期时间', field: 'expirationTime', visible: true, align: 'center', valign: 'middle',width:'200px'},
+                {title: '领取类型', field: 'couponType', visible: true, align: 'center', valign: 'middle',width:'200px'},
+                {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',width:'200px'},
+                {title: '使用时间', field: 'endTime', visible: true, align: 'center', valign: 'middle',width:'200px'}
+            ]
+        var table = new BSTable(CouponStatisticsInfo.id, '/report/queryCouponRegisterInfo', defaultColunms);
+        table.setPaginationType("server");
+        table.setQueryParams({
+            type: CouponStatisticsInfo.type,
+        })
+        CouponStatisticsInfo.table = table.init();
+    }
+
+    if(CouponStatisticsInfo.type == 5){
+        var defaultColunms =
+            [
+                {field: 'selectItem', radio: true},
+                {title: '领取时间', field: 'time', visible: true, align: 'center', valign: 'middle'},
+                {title: '领取人', field: 'name', visible: true, align: 'center', valign: 'middle'},
+                {title: '领取人电话', field: 'phone', visible: true, align: 'center', valign: 'middle'},
+                {title: '领取金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+                {title: '到期时间', field: 'expirationTime', visible: true, align: 'center', valign: 'middle'},
+                {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle'},
+                {title: '使用时间', field: 'endTime', visible: true, align: 'center', valign: 'middle'}
+            ]
+        var table = new BSTable(CouponStatisticsInfo.id, '/report/queryRedEnvelopesInfo', defaultColunms);
+        table.setPaginationType("server");
+        table.setQueryParams({})
+        CouponStatisticsInfo.table = table.init();
+    }
+
+    if(CouponStatisticsInfo.type == 4){
+        var defaultColunms =
+            [
+                {field: 'selectItem', radio: true},
+                {title: '打折时间', field: 'time', visible: true, align: 'center', valign: 'middle'},
+                {title: '打折使用人', field: 'name', visible: true, align: 'center', valign: 'middle'},
+                {title: '打折使用人电话', field: 'phone', visible: true, align: 'center', valign: 'middle'},
+                {title: '打折金额', field: 'discountMoney', visible: true, align: 'center', valign: 'middle'}
+            ]
+        var table = new BSTable(CouponStatisticsInfo.id, '/report/queryDiscountInfo', defaultColunms);
+        table.setPaginationType("server");
+        table.setQueryParams({})
+        CouponStatisticsInfo.table = table.init();
+    }
+    if(CouponStatisticsInfo.type == 3){
+        var defaultColunms =
+            [
+                {field: 'selectItem', radio: true},
+                {title: '充值时间', field: 'time', visible: true, align: 'center', valign: 'middle'},
+                {title: '充值人', field: 'userName', visible: true, align: 'center', valign: 'middle'},
+                {title: '充值人电话', field: 'phone', visible: true, align: 'center', valign: 'middle'},
+                {title: '充值金额', field: 'amount', visible: true, align: 'center', valign: 'middle'},
+                {title: '通用券领取总数', field: 'tyNum', visible: true, align: 'center', valign: 'middle'},
+                {title: '通用券使用总数', field: 'tyUseNum', visible: true, align: 'center', valign: 'middle'},
+                {title: '通用券使用总金额', field: 'tyUseMoney', visible: true, align: 'center', valign: 'middle'},
+                {title: '专车券领取总数', field: 'zcNum', visible: true, align: 'center', valign: 'middle'},
+                {title: '专车券使用总数', field: 'zcUseNum', visible: true, align: 'center', valign: 'middle'},
+                {title: '专车券使用总金额', field: 'zcUseMoney', visible: true, align: 'center', valign: 'middle'},
+                {title: '出租车券领取总数', field: 'czcNum', visible: true, align: 'center', valign: 'middle'},
+                {title: '出租车使用总数', field: 'czcUseNum', visible: true, align: 'center', valign: 'middle'},
+                {title: '出租车使用总金额', field: 'czcUseMoney', visible: true, align: 'center', valign: 'middle'},
+                {title: '跨城券领取总数', field: 'kcNum', visible: true, align: 'center', valign: 'middle'},
+                {title: '跨城券使用总数', field: 'kcUseNum', visible: true, align: 'center', valign: 'middle'},
+                {title: '跨城券使用总金额', field: 'kcUseMoney', visible: true, align: 'center', valign: 'middle'},
+            ]
+        var table = new BSTable(CouponStatisticsInfo.id, '/report/queryCouponRegisterInfo1', defaultColunms);
+        table.setPaginationType("server");
+        table.setQueryParams({})
+        CouponStatisticsInfo.table = table.init();
+    }
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/report/operationalData.js b/management/guns-admin/src/main/webapp/static/modular/system/report/operationalData.js
new file mode 100644
index 0000000..90fb874
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/report/operationalData.js
@@ -0,0 +1,87 @@
+/**
+ * 车辆品牌管理管理初始化
+ */
+var OperationalData = {
+    id: "TCarBrandTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+OperationalData.initColumn = function () {
+    return [
+        [
+            {field: 'selectItem', radio: true, colspan: 1, rowspan: 2},
+            {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle', colspan: 1, rowspan: 2},
+            {title: '日期', field: 'time', visible: true, align: 'center', valign: 'middle',width:'150px',colspan: 1, rowspan: 2},
+            {title: '用户注册数量', field: 'register', visible: true, align: 'center', valign: 'middle',width:'100px',colspan: 1, rowspan: 2},
+            {title: '在线司机数', field: 'online', visible: true, align: 'center', valign: 'middle',width:'100px',colspan: 1, rowspan: 2},
+            {title: '订单情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 3, rowspan: 1},
+            {title: '支付情况', field: '', visible: true, align: 'center', valign: 'middle',width:'500px', colspan: 5, rowspan: 1},
+            {title: '投诉数量', field: 'complaint', visible: true, align: 'center', valign: 'middle',width:'100px',colspan: 1, rowspan: 2}
+        ],
+        [
+            {title: '下单数量', field: 'orderNum', visible: true, align: 'center', valign: 'middle'},
+            {title: '乘客取消数量', field: 'cancelNum', visible: true, align: 'center', valign: 'middle'},
+            {title: '取消占比', field: 'cancelProportion', visible: true, align: 'center', valign: 'middle'},
+            {title: '通过平台支付(单)', field: 'onlinePay', visible: true, align: 'center', valign: 'middle'},
+            {title: '通过其它支付(单)', field: 'offlinePay', visible: true, align: 'center', valign: 'middle'},
+            {title: '合计', field: 'total', visible: true, align: 'center', valign: 'middle'},
+            {title: '平台支付占比%', field: 'payProportion', visible: true, align: 'center', valign: 'middle'},
+            {title: '金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+        ]
+
+
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+OperationalData.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        OperationalData.seItem = selected[0];
+        return true;
+    }
+};
+
+OperationalData.downloadExcel = function(){
+    window.location.href = Feng.ctxPath + "/report/downloadOperationalData?type=" + $("#type").val() + "&time=" + $("#time").val() + "&companyId=" + $("#company").val();
+}
+
+
+
+/**
+ * 查询车辆品牌管理列表
+ */
+OperationalData.search = function () {
+    var queryData = {};
+    queryData['type'] = $("#type").val();
+    queryData['time'] = $("#time").val();
+    queryData['companyId'] = $("#company").val();
+    OperationalData.table.refresh({query: queryData});
+};
+
+OperationalData.resetSearch = function () {
+    $("#type").val("2");
+    $("#time").val("");
+    $("#company").val("");
+    OperationalData.search();
+};
+
+$(function () {
+    var defaultColunms = OperationalData.initColumn();
+    var table = new BSTable(OperationalData.id, "/report/queryOperationalData", defaultColunms);
+    table.setPaginationType("server");
+    table.setQueryParams({
+        type: 2,
+    })
+    OperationalData.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/role/role.js b/management/guns-admin/src/main/webapp/static/modular/system/role/role.js
new file mode 100644
index 0000000..c595da2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/role/role.js
@@ -0,0 +1,134 @@
+/**
+ * 角色管理的单例
+ */
+var Role = {
+    id: "roleTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+Role.initColumn = function () {
+    var columns = [
+        {field: 'selectItem', radio: true,
+            /*formatter: function (value, row) {
+                if (row.id == 1)
+                    return {
+                        disabled : true,//设置是否可用
+                    };
+                return "";
+            }*/
+        },
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '名称', field: 'name', align: 'center', valign: 'middle', sortable: true},
+        {title: '上级角色', field: 'pName', align: 'center', valign: 'middle', sortable: true},
+        {title: '所在部门', field: 'deptName', align: 'center', valign: 'middle', sortable: true},
+        {title: '包含账户数', field: 'userCount', align: 'center', valign: 'middle', sortable: true},
+        {title: '别名', field: 'tips', align: 'center', valign: 'middle', sortable: true}]
+    return columns;
+};
+
+
+/**
+ * 检查是否选中
+ */
+Role.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        Role.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加管理员
+ */
+Role.openAddRole = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加角色',
+        area: ['800px', '450px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/role/role_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 点击修改按钮时
+ */
+Role.openChangeRole = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '修改角色',
+            area: ['800px', '450px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/role/role_edit/' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除角色
+ */
+Role.delRole = function () {
+    if (this.check()) {
+
+        var operation = function(){
+            var ajax = new $ax(Feng.ctxPath + "/role/remove", function () {
+                Feng.success("删除成功!");
+                Role.table.refresh();
+            }, function (data) {
+                Feng.error("删除失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("roleId", Role.seItem.id);
+            ajax.start();
+        };
+
+        Feng.confirm("是否删除角色 " + Role.seItem.name + "?",operation);
+    }
+};
+
+/**
+ * 权限配置
+ */
+Role.assign = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '权限配置',
+            area: ['30%', '80%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/role/role_assign/' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 搜索角色
+ */
+Role.search = function () {
+    var queryData = {};
+    queryData['roleName'] = $("#roleName").val();
+    Role.table.refresh({query: queryData});
+}
+
+$(function () {
+    var defaultColunms = Role.initColumn();
+    var table = new BSTable(Role.id, "/role/list", defaultColunms);
+    table.setPaginationType("client");
+    table.init();
+    Role.table = table;
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/role/role_info.js b/management/guns-admin/src/main/webapp/static/modular/system/role/role_info.js
new file mode 100644
index 0000000..c9fc418
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/role/role_info.js
@@ -0,0 +1,202 @@
+/**
+ * 角色详情对话框(可用于添加和修改对话框)
+ */
+var RolInfoDlg = {
+    roleInfoData: {},
+    deptZtree: null,
+    pNameZtree: null,
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '用户名不能为空'
+                }
+            }
+        },
+        tips: {
+            validators: {
+                notEmpty: {
+                    message: '别名不能为空'
+                }
+            }
+        }/*,
+        pName: {
+            validators: {
+                notEmpty: {
+                    message: '父级名称不能为空'
+                }
+            }
+        }*/
+    }
+};
+
+/**
+ * 清除数据
+ */
+RolInfoDlg.clearData = function () {
+    this.roleInfoData = {};
+};
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+RolInfoDlg.set = function (key, value) {
+    this.roleInfoData[key] = (typeof value == "undefined") ? $("#" + key).val() : value;
+    return this;
+};
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+RolInfoDlg.get = function (key) {
+    return $("#" + key).val();
+};
+
+/**
+ * 关闭此对话框
+ */
+RolInfoDlg.close = function () {
+    parent.layer.close(window.parent.Role.layerIndex);
+};
+
+/**
+ * 点击部门input框时
+ *
+ * @param e
+ * @param treeId
+ * @param treeNode
+ * @returns
+ */
+RolInfoDlg.onClickDept = function (e, treeId, treeNode) {
+    $("#deptName").attr("value", RolInfoDlg.deptZtree.getSelectedVal());
+    $("#deptid").attr("value", treeNode.id);
+};
+RolInfoDlg.onDblClickDept = function (e, treeId, treeNode) {
+    $("#deptName").attr("value", RolInfoDlg.deptZtree.getSelectedVal());
+    $("#deptid").attr("value", treeNode.id);
+    $("#deptContent").fadeOut("fast");
+};
+
+/**
+ * 点击父级菜单input框时
+ *
+ * @param e
+ * @param treeId
+ * @param treeNode
+ * @returns
+ */
+RolInfoDlg.onClickPName = function (e, treeId, treeNode) {
+    $("#pName").attr("value", RolInfoDlg.pNameZtree.getSelectedVal());
+    $("#pid").attr("value", treeNode.id);
+};
+
+/**
+ * 显示部门选择的树
+ *
+ * @returns
+ */
+RolInfoDlg.showDeptSelectTree = function () {
+    Feng.showInputTree("deptName", "deptContent");
+};
+
+/**
+ * 显示父级菜单的树
+ *
+ * @returns
+ */
+RolInfoDlg.showPNameSelectTree = function () {
+    Feng.showInputTree("pName", "pNameContent");
+};
+
+/**
+ * 收集数据
+ */
+RolInfoDlg.collectData = function () {
+    this.set('id').set('name').set('pid').set('deptid').set('tips').set('num');
+};
+
+/**
+ * 验证数据是否为空
+ */
+RolInfoDlg.validate = function () {
+    $('#roleInfoForm').data("bootstrapValidator").resetForm();
+    $('#roleInfoForm').bootstrapValidator('validate');
+    return $("#roleInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 提交添加用户
+ */
+RolInfoDlg.addSubmit = function () {
+
+    this.clearData();
+    this.collectData();
+
+    if (!this.validate()) {
+        return;
+    }
+    var pName = $("#pName").val();
+    if ("" == pName){
+        Feng.info("上级名称不能为空");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/role/add", function (data) {
+        Feng.success("添加成功!");
+        window.parent.Role.table.refresh();
+        RolInfoDlg.close();
+    }, function (data) {
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.roleInfoData);
+    ajax.start();
+};
+
+/**
+ * 提交修改
+ */
+RolInfoDlg.editSubmit = function () {
+
+    this.clearData();
+    this.collectData();
+
+    if (!this.validate()) {
+        return;
+    }
+    var pName = $("#pName").val();
+    if ("" == pName){
+        Feng.info("上级名称不能为空");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/role/edit", function (data) {
+        Feng.success("修改成功!");
+        window.parent.Role.table.refresh();
+        RolInfoDlg.close();
+    }, function (data) {
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.roleInfoData);
+    ajax.start();
+};
+
+$(function () {
+    Feng.initValidator("roleInfoForm", RolInfoDlg.validateFields);
+
+    var deptTree = new $ZTree("deptTree", "/dept/tree");
+    deptTree.bindOnClick(RolInfoDlg.onClickDept);
+    deptTree.bindOnDblClick(RolInfoDlg.onDblClickDept)
+    deptTree.init();
+    RolInfoDlg.deptZtree = deptTree;
+
+    var pNameTree = new $ZTree("pNameTree", "/role/roleTreeList");
+    pNameTree.bindOnClick(RolInfoDlg.onClickPName);
+    pNameTree.init();
+    RolInfoDlg.pNameZtree = pNameTree;
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponActivity.js b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponActivity.js
new file mode 100644
index 0000000..2783c7d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponActivity.js
@@ -0,0 +1,184 @@
+/**
+ * 管理初始化
+ */
+var SysCouponActivity = {
+    id: "SysCouponActivityTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SysCouponActivity.initColumn = function () {
+    return [
+            {field: 'selectItem', radio: true},
+            {title: '', field: 'id', visible: false, align: 'center', valign: 'middle'},
+            {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券类型', field: 'couponUseType', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==0){
+                        return "通用券";
+                    }else if(value==1){
+                        return "专车券";
+                    }else if(value==2){
+                        return "出租券";
+                    }else if(value==3){
+                        return "跨城出行券";
+                    }else{
+                        return "";
+                    }
+                }
+            },
+            {title: '金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+            {title: '有效天数', field: 'effective', visible: true, align: 'center', valign: 'middle'},
+            {title: '领取人数', field: 'sendUserNum', visible: true, align: 'center', valign: 'middle'},
+            {title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle'},
+            {title: '状态', field: 'status', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==1){
+                        return "待审核";
+                    }else if(value==2){
+                        return "已驳回";
+                    }else if(value==3){
+                        return "已发送";
+                    }else{
+                        return "";
+                    }
+                }
+            }
+    ];
+};
+
+/**
+ * 打开立即处理页面
+ */
+SysCouponActivity.immediately = function () {
+    if (this.check(1)) {
+        var index = layer.open({
+            type: 2,
+            title: '审核',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/sysCouponActivity/sysCouponActivity_immediately/' +  SysCouponActivity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+/**
+ * 检查是否选中
+ */
+SysCouponActivity.check = function (type) {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        //验证类型null删除,1=审核,2=编辑
+        if(type==null){
+            SysCouponActivity.seItem = selected[0];
+            return true;
+        }else if(type==1 && selected[0].status!=1){
+            Feng.info("当前状态不能审核!");
+            return false;
+        }else if(type==2 && selected[0].status!=2){
+            Feng.info("当前状态不能编辑!");
+            return false;
+        }
+
+        SysCouponActivity.seItem = selected[0];
+        return true;
+    }
+};
+/**
+ * 领取记录
+ */
+SysCouponActivity.userCouponRecord= function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '领取记录',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/userCouponRecord?activityType=1&couponActivityId='+ SysCouponActivity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+/**
+ * 点击添加
+ */
+SysCouponActivity.openAddSysCouponActivity = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/sysCouponActivity/sysCouponActivity_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+SysCouponActivity.openSysCouponActivityDetail = function () {
+    if (this.check(2)) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/sysCouponActivity/sysCouponActivity_update/' + SysCouponActivity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+SysCouponActivity.delete = function () {
+    if (this.check()) {
+        var operation = function(){
+            var ajax = new $ax(Feng.ctxPath + "/sysCouponActivity/delete", function (data) {
+                Feng.success("删除成功!");
+                SysCouponActivity.table.refresh();
+            }, function (data) {
+                Feng.error("删除失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("sysCouponActivityId",SysCouponActivity.seItem.id);
+            ajax.start();
+        }
+        Feng.confirm("是否确定刪除?", operation);
+
+    }
+};
+
+/**
+ * 查询列表
+ */
+SysCouponActivity.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['couponUseType'] = $("#couponUseType").val();
+    queryData['status'] = $("#status").val();
+    SysCouponActivity.table.refresh({query: queryData});
+};
+SysCouponActivity.resetSearch = function () {
+    $("#createTime").val("");
+    $("#couponUseType").val("");
+    $("#status").val("");
+    SysCouponRecord.search();
+};
+$(function () {
+    var defaultColunms = SysCouponActivity.initColumn();
+    var table = new BSTable(SysCouponActivity.id, "/sysCouponActivity/list", defaultColunms);
+    table.setPaginationType("server");
+    SysCouponActivity.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponActivity_info.js b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponActivity_info.js
new file mode 100644
index 0000000..8edc178
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponActivity_info.js
@@ -0,0 +1,291 @@
+/**
+ * 初始化详情对话框
+ */
+var SysCouponActivityInfoDlg = {
+    sysCouponActivityInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '活动标题不能为空'
+                }
+            }
+        },
+        effective: {
+            validators: {
+                notEmpty: {
+                    message: '有效天数不能为空'
+                },
+                regexp: {
+                    regexp: /^[1-9]\d*$/,
+                    message: '有效天数格式不正确'
+                }
+            }
+        },
+        number: {
+            validators: {
+                notEmpty: {
+                    message: '张数数不能为空'
+                },
+                regexp: {
+                    regexp: /^[1-9]\d*$/,
+                    message: '张数格式不正确'
+                }
+            }
+        }
+    }
+};
+/**
+ * 验证数据是否为空
+ */
+SysCouponActivityInfoDlg.validate = function () {
+    $('#sysCouponActivityInfoForm').data("bootstrapValidator").resetForm();
+    $('#sysCouponActivityInfoForm').bootstrapValidator('validate');
+    return $("#sysCouponActivityInfoForm").data('bootstrapValidator').isValid();
+};
+/**
+ * 清除数据
+ */
+SysCouponActivityInfoDlg.clearData = function() {
+    this.sysCouponActivityInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+SysCouponActivityInfoDlg.set = function(key, val) {
+    this.sysCouponActivityInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+SysCouponActivityInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+SysCouponActivityInfoDlg.close = function() {
+    parent.layer.close(window.parent.SysCouponActivity.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+SysCouponActivityInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('money')
+    .set('fullMoney')
+    .set('companyId')
+    .set('name')
+    .set('effective')
+    .set('sendType')
+    .set('number')
+    .set('sendUserId');
+}
+
+/**
+ * 提交添加
+ */
+SysCouponActivityInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var activityId = $("#activityId").val();
+    if($.trim(activityId)==""){
+        Feng.error("请选择优惠券!");
+        return;
+    }
+    var sendType = $("input[name='sendType']:checked").val();
+    var subArr=[];
+    $(".timeClass").each(function () {
+        subArr.push({
+            //companyName,nickName,phone
+            userId:$(this).find("input[name*='userId']").val(),
+            companyName:$(this).find("input[name*='companyName']").val(),
+            nickName:$(this).find("input[name*='nickName']").val(),
+            phone:$(this).find("input[name*='phone']").val(),
+        })
+    });
+    if(sendType==2 && subArr.length <= 0){
+        Feng.error("请选择用户");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/sysCouponActivity/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.SysCouponActivity.table.refresh();
+        SysCouponActivityInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.sysCouponActivityInfoData);
+    ajax.set("activityId",activityId);
+    ajax.set("sendUserId",JSON.stringify(subArr));
+    ajax.set("sendType",sendType);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+SysCouponActivityInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    if(!this.validate()){
+        return ;
+    }
+    var activityId = $("#activityId").val();
+    if($.trim(activityId)==""){
+        Feng.error("请选择优惠券!");
+        return;
+    }
+    var sendType = $("input[name='sendType']:checked").val();
+    var subArr=[];
+    $(".timeClass").each(function () {
+        subArr.push({
+            //companyName,nickName,phone
+            userId:$(this).find("input[name*='userId']").val(),
+            companyName:$(this).find("input[name*='companyName']").val(),
+            nickName:$(this).find("input[name*='nickName']").val(),
+            phone:$(this).find("input[name*='phone']").val(),
+        })
+    });
+    if(sendType==2 && subArr.length <= 0){
+        Feng.error("请选择用户");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/sysCouponActivity/update", function(data){
+        Feng.success("添加成功!");
+        window.parent.SysCouponActivity.table.refresh();
+        SysCouponActivityInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.sysCouponActivityInfoData);
+    ajax.set("activityId",activityId);
+    ajax.set("sendUserId",JSON.stringify(subArr));
+    ajax.set("sendType",sendType);
+    ajax.start();
+}
+/**
+ * 立即处理
+ */
+SysCouponActivityInfoDlg.immediately = function(){
+
+    this.clearData();
+    this.collectData();
+
+    if(!this.validate()){
+        return ;
+    }
+    var remark = $("#remark").val();
+    if (remark.length > 250){
+        Feng.info("备注不能超过250个字");
+        return;
+    }
+    var state = $("input[name='state']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/sysCouponActivity/immediately", function(data){
+        Feng.success("处理成功!");
+        window.parent.SysCouponActivity.table.refresh();
+        SysCouponActivityInfoDlg.close();
+    },function(data){
+        Feng.error("处理失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("state",state);
+    ajax.set("remark",$("#remark").val());
+    ajax.start();
+}
+
+/**
+ * 跳转到选择优惠券页面
+ */
+SysCouponActivityInfoDlg.toSelectCouponOpt = function () {
+    var index = layer.open({
+        type: 2,
+        title: '选择优惠券',
+        area: ['90%', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/sysCouponActivity/sysCouponRecord'
+    });
+    this.layerIndex = index;
+}
+
+SysCouponActivityInfoDlg.toSelectUserOpt = function () {
+    var index = layer.open({
+        type: 2,
+        title: '选择用户',
+        area: ['90%', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/sysCouponActivity/user'
+    });
+    this.layerIndex = index;
+}
+/**
+ * 选择优惠券后数据回显
+ * @param id
+ * @param couponUseType
+ * @param couponType
+ * @param money
+ */
+SysCouponActivityInfoDlg.selectCouponOpt=function(id,couponUseType,couponType,money){
+    $("#couponUseType").val(couponUseType==0?"通用券":couponUseType==1?"专车券":couponUseType==2?"出租券":"跨城出行券");
+    $("#couponType").val(couponType==1?"抵扣":"满减");
+    $("#money").val(money);
+    $("#activityId").val(id);
+}
+/**
+ * 选择用户后数据回显
+ * @param id
+ * @param companyName
+ * @param nickName
+ * @param phone
+ */
+SysCouponActivityInfoDlg.selecUserOpt=function(id,companyName,nickName,phone){
+    //获取所有的值
+    var subArr=[];
+    $(".timeClass").each(function () {
+        subArr.push({
+            userId:$(this).find("input[name*='userId']").val(),
+        })
+    });
+    for(var i=0;i<subArr.length;i++){
+        var userId = subArr[i].userId;
+        if (userId == id) {
+            Feng.info("用户已选择,请重新选择");
+            return;
+        }
+    }
+    console.log(subArr);
+    var str = '<tr class="timeClass">' +
+        '<td><input type="hidden" id="userId" name="userId" value="'+id+'"><input type="hidden" id="nickName" name="nickName" value="'+nickName+'">' + nickName + '</td>' +
+        '<td><input type="hidden" id="phone" name="phone" value="'+phone+'">' + phone + '</td>' +
+        '<td><input type="hidden" id="companyName" name="companyName" value="'+companyName+'">' + companyName + '</td><td><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#coun").append(str);
+}
+function deleteSub(e) {
+    $(e).parent().parent().remove();
+}
+$(function() {
+    Feng.initValidator("sysCouponActivityInfoForm", SysCouponActivityInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponRecord.js b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponRecord.js
new file mode 100644
index 0000000..f7df47a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/sysCouponRecord.js
@@ -0,0 +1,110 @@
+/**
+ * 管理初始化
+ */
+var SysCouponRecord = {
+    id: "SysCouponRecordTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SysCouponRecord.initColumn = function () {
+    return [
+            {field: 'selectItem', radio: true},
+            {title: '序号', field: 'id', visible: true, align: 'center', valign: 'middle',width:'8%'},
+            {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+            {title: '条件金额', field: 'fullMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券类型', field: 'couponUseType', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==0){
+                        return "通用券";
+                    }else if(value==1){
+                        return "专车券";
+                    }else if(value==2){
+                        return "出租券";
+                    }else if(value==3){
+                        return "跨城出行券";
+                    }else{
+                        return "";
+                    }
+                }
+            },
+            {title: '服务类型', field: 'couponType', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==1){
+                        return "抵扣";
+                    }else if(value==2){
+                        return "满减";
+                    }else{
+                        return "";
+                    }
+                }
+            }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+SysCouponRecord.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        SysCouponRecord.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 关闭选择用户页面
+ */
+SysCouponRecord.close = function () {
+    parent.layer.close(window.parent.SysCouponActivityInfoDlg.layerIndex);
+}
+
+/**
+ * 确认选择
+ */
+SysCouponRecord.selectCouponOpt = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }
+    var id = selected[0].id;
+    var couponUseType = selected[0].couponUseType;
+    var couponType = selected[0].couponType;
+    var money = selected[0].money;
+    if ("" == id || null == id || undefined == id){
+        Feng.info("请先选中表格中的某一记录!");
+        return ;
+    }
+    var obj = $("#obj").val();
+    window.parent.SysCouponActivityInfoDlg.selectCouponOpt(id,couponUseType,couponType,money);
+    SysCouponRecord.close();
+}
+/**
+ * 查询列表
+ */
+SysCouponRecord.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    SysCouponRecord.table.refresh({query: queryData});
+};
+SysCouponRecord.resetSearch = function () {
+    $("#createTime").val("");
+    SysCouponRecord.search();
+};
+$(function () {
+    var defaultColunms = SysCouponRecord.initColumn();
+    var table = new BSTable(SysCouponRecord.id, "/sysCouponRecord/list", defaultColunms);
+    table.setPaginationType("server");
+    SysCouponRecord.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/tUser.js b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/tUser.js
new file mode 100644
index 0000000..0cd92e3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponActivity/tUser.js
@@ -0,0 +1,238 @@
+/**
+ * 用户管理管理初始化
+ */
+var TUser = {
+    id: "TUserTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 鼠标悬停提示框 class .toolTip 为无效样式,作用于个别选择器使用
+ */
+TUser.tooltip = function(){
+    $(".toolTip").tooltip();
+};
+
+/**
+ * 初始化表格的列
+ */
+TUser.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '注册时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用户ID', field: 'id', visible: true, align: 'center', valign: 'middle'},
+        {title: '注册地IP', field: 'registIp', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.registIp != '' && row.registIp != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.registIp + '" onfocus="TUser.tooltip()">' + row.registIp + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '注册地所属分公司ID', field: 'companyId', visible: false, align: 'center', valign: 'middle'},
+        {title: '注册地所属分公司', field: 'companyName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyName != '' && row.companyName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyName + '" onfocus="TUser.tooltip()">' + row.companyName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '昵称', field: 'nickName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.nickName != '' && row.nickName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.nickName + '" onfocus="TUser.tooltip()">' + row.nickName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '手机号', field: 'phone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.phone != '' && row.phone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.phone + '" onfocus="TUser.tooltip()">' + row.phone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '紧急联系人姓名', field: 'emergencyContact', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.emergencyContact != '' && row.emergencyContact != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.emergencyContact + '" onfocus="TUser.tooltip()">' + row.emergencyContact + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '紧急联系人电话', field: 'emergencyContactNumber', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.emergencyContactNumber != '' && row.emergencyContactNumber != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.emergencyContactNumber + '" onfocus="TUser.tooltip()">' + row.emergencyContactNumber + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '是否实名认证', field: 'isAuth', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.isAuth != '' && row.isAuth != null) {
+                    if (row.isAuth == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="否" onfocus="TUser.tooltip()">否</p>']
+                    } else if (row.isAuth == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="是" onfocus="TUser.tooltip()">是</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '历史出行次数', field: 'historyNum', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.historyNum != '' && row.historyNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.historyNum + '" onfocus="TUser.tooltip()">' + row.historyNum + '</p>']
+                }else {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '历史消费', field: 'consumption', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.consumption != '' && row.consumption != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="¥' + row.consumption + '" onfocus="TUser.tooltip()">¥' + row.consumption + '</p>']
+                }else {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="¥0" onfocus="TUser.tooltip()">¥0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '积分', field: 'integral', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.integral != '' && row.integral != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.integral + '" onfocus="TUser.tooltip()">' + row.integral + '</p>']
+                }else {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.remark != '' && row.remark != null){
+                    var str = row.remark;
+                    if (row.remark.length > 10){
+                        str = row.remark.substring(0,10)+"...";
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.remark + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: #0d8ddb;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="冻结" onfocus="TUser.tooltip()">冻结</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TUser.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TUser.seItem = selected[0];
+        return true;
+    }
+};
+/**
+ * 关闭选择用户页面
+ */
+TUser.close = function () {
+    parent.layer.close(window.parent.SysCouponActivityInfoDlg.layerIndex);
+}
+
+/**
+ * 确认选择
+ */
+TUser.selectUserOpt = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }
+    var id = selected[0].id;
+    var companyName = selected[0].companyName;
+    if(companyName==undefined)companyName="";
+    var nickName = selected[0].nickName;
+    var phone = selected[0].phone;
+    if ("" == id || null == id || undefined == id){
+        Feng.info("请先选中表格中的某一记录!");
+        return ;
+    }
+    var obj = $("#obj").val();
+    window.parent.SysCouponActivityInfoDlg.selecUserOpt(id,companyName,nickName,phone);
+    TUser.close();
+}
+/**
+ * 查询用户管理列表
+ */
+TUser.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['id'] = $("#id").val();
+    queryData['nickName'] = $("#nickName").val();
+    queryData['isAuth'] = $("#isAuth").val();
+    queryData['state'] = $("#state").val();
+    queryData['phone'] = $("#phone").val();
+    queryData['companyName'] = $("#companyName").val();
+    TUser.table.refresh({query: queryData});
+};
+TUser.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#id").val("");
+    $("#nickName").val("");
+    $("#isAuth").val("");
+    $("#companyName").val("");
+    $("#state").val("");
+    $("#phone").val("");
+    TUser.search();
+};
+
+$(function () {
+    var defaultColunms = TUser.initColumn();
+    var table = new BSTable(TUser.id, "/tUser/list", defaultColunms);
+    // 设置物理分页server(逻辑分页client)
+    table.setPaginationType("server");
+    TUser.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord.js b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord.js
new file mode 100644
index 0000000..630e6d6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord.js
@@ -0,0 +1,133 @@
+/**
+ * 管理初始化
+ */
+var SysCouponRecord = {
+    id: "SysCouponRecordTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SysCouponRecord.initColumn = function () {
+    return [
+            {title: '', field: 'id', visible: false, align: 'center', valign: 'middle'},
+            {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+            {title: '条件金额', field: 'fullMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券类型', field: 'couponUseType', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==0){
+                        return "通用券";
+                    }else if(value==1){
+                        return "专车券";
+                    }else if(value==2){
+                        return "出租券";
+                    }else if(value==3){
+                        return "跨城出行券";
+                    }else{
+                        return "";
+                    }
+                }
+            },
+            {title: '服务类型', field: 'couponType', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==1){
+                        return "抵扣";
+                    }else if(value==2){
+                        return "满减";
+                    }else{
+                        return "";
+                    }
+                }
+            }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+SysCouponRecord.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        SysCouponRecord.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+SysCouponRecord.openAddSysCouponRecord = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/sysCouponRecord/sysCouponRecord_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+SysCouponRecord.openSysCouponRecordDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/sysCouponRecord/sysCouponRecord_update/' + SysCouponRecord.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+SysCouponRecord.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/sysCouponRecord/delete", function (data) {
+            Feng.success("删除成功!");
+            SysCouponRecord.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("sysCouponRecordId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询列表
+ */
+SysCouponRecord.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['couponUseType'] = $("#couponUseType").val();
+    queryData['couponType'] = $("#couponType").val();
+    SysCouponRecord.table.refresh({query: queryData});
+};
+SysCouponRecord.resetSearch = function () {
+    $("#createTime").val("");
+    $("#couponUseType").val("");
+    $("#couponType").val("");
+    SysCouponRecord.search();
+};
+$(function () {
+    var defaultColunms = SysCouponRecord.initColumn();
+    var table = new BSTable(SysCouponRecord.id, "/sysCouponRecord/list", defaultColunms);
+    table.setPaginationType("server");
+    SysCouponRecord.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord_info.js b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord_info.js
new file mode 100644
index 0000000..8192792
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord_info.js
@@ -0,0 +1,143 @@
+/**
+ * 初始化详情对话框
+ */
+var SysCouponRecordInfoDlg = {
+    sysCouponRecordInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '名称不能为空'
+                }
+            }
+        },
+        money: {
+            validators: {
+                notEmpty: {
+                    message: '金额不能为空'
+                },
+                regexp: {
+                    regexp: /^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/,
+                    message: '金额格式不正确'
+                }
+            }
+        }
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+SysCouponRecordInfoDlg.validate = function () {
+    $('#sysCouponRecordInfoForm').data("bootstrapValidator").resetForm();
+    $('#sysCouponRecordInfoForm').bootstrapValidator('validate');
+    return $("#sysCouponRecordInfoForm").data('bootstrapValidator').isValid();
+};
+/**
+ * 清除数据
+ */
+SysCouponRecordInfoDlg.clearData = function() {
+    this.sysCouponRecordInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+SysCouponRecordInfoDlg.set = function(key, val) {
+    this.sysCouponRecordInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+SysCouponRecordInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+SysCouponRecordInfoDlg.close = function() {
+    parent.layer.close(window.parent.SysCouponRecord.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+SysCouponRecordInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('money')
+    .set('fullMoney')
+    .set('insertTime')
+    .set('companyId')
+    .set('couponUseType')
+    .set('couponType')
+    .set('name')
+    .set('effective');
+}
+
+/**
+ * 提交添加
+ */
+SysCouponRecordInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    if ($("#name").val().length > 20){
+        Feng.info("名称不能超过20个字");
+        return;
+    }
+    if ( $("#money").val() > 9999   ){
+        Feng.info("金额最多不能超过4位数");
+        return;
+    }
+    if($("couponType").val()==2 && $("#fullMoney").val() > 9999){
+        Feng.info("金额最多不能超过4位数");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/sysCouponRecord/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.SysCouponRecord.table.refresh();
+        SysCouponRecordInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.sysCouponRecordInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+SysCouponRecordInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/sysCouponRecord/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.SysCouponRecord.table.refresh();
+        SysCouponRecordInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.sysCouponRecordInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("sysCouponRecordInfoForm", SysCouponRecordInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/sysRedPacketRecord/sysRedPacketRecord.js b/management/guns-admin/src/main/webapp/static/modular/system/sysRedPacketRecord/sysRedPacketRecord.js
new file mode 100644
index 0000000..5a19b08
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/sysRedPacketRecord/sysRedPacketRecord.js
@@ -0,0 +1,122 @@
+/**
+ * 管理初始化
+ */
+var SysRedPacketRecord = {
+    id: "SysRedPacketRecordTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SysRedPacketRecord.initColumn = function () {
+    return [
+        {title: '', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '红包名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+        {title: '红包金额类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                if(value==1){
+                    return "固定金额";
+                }else if(value==2){
+                    return "随机金额";
+                }else{
+                    return "";
+                }
+            }
+        },
+        {title: '总金额', field: 'totalMoney', visible: true, align: 'center', valign: 'middle'},
+        {title: '每个红包金额', field: 'money', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                if(row.type==1){
+                    return row.money;
+                }else if(row.type==2){
+                    return row.startMoney+"-"+row.endMoney;
+                }
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+SysRedPacketRecord.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        SysRedPacketRecord.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+SysRedPacketRecord.openAddSysRedPacketRecord = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/sysRedPacketRecord/sysRedPacketRecord_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+SysRedPacketRecord.openSysRedPacketRecordDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/sysRedPacketRecord/sysRedPacketRecord_update/' + SysRedPacketRecord.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+SysRedPacketRecord.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/sysRedPacketRecord/delete", function (data) {
+            Feng.success("删除成功!");
+            SysRedPacketRecord.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("sysRedPacketRecordId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询列表
+ */
+SysRedPacketRecord.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    SysRedPacketRecord.table.refresh({query: queryData});
+};
+SysRedPacketRecord.resetSearch = function () {
+    $("#createTime").val("");
+    SysRedPacketRecord.search();
+};
+$(function () {
+    var defaultColunms = SysRedPacketRecord.initColumn();
+    var table = new BSTable(SysRedPacketRecord.id, "/sysRedPacketRecord/list", defaultColunms);
+    table.setPaginationType("server");
+    SysRedPacketRecord.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/sysRedPacketRecord/sysRedPacketRecord_info.js b/management/guns-admin/src/main/webapp/static/modular/system/sysRedPacketRecord/sysRedPacketRecord_info.js
new file mode 100644
index 0000000..0bc4999
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/sysRedPacketRecord/sysRedPacketRecord_info.js
@@ -0,0 +1,199 @@
+/**
+ * 初始化详情对话框
+ */
+var SysRedPacketRecordInfoDlg = {
+    sysRedPacketRecordInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '红包名称不能为空'
+                }
+            }
+        },
+        totalMoney: {
+            validators: {
+                notEmpty: {
+                    message: '总金额不能为空'
+                },
+                regexp: {
+                    regexp: /^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/,
+                    message: '金额格式不正确'
+                }
+            }
+        },
+        effective: {
+            validators: {
+                notEmpty: {
+                    message: '有效天数不能为空'
+                },
+                regexp: {
+                    regexp: /^[1-9]\d*$/,
+                    message: '有效天数格式不正确'
+                }
+            }
+        }
+    }
+};
+/**
+ * 验证数据是否为空
+ */
+SysRedPacketRecordInfoDlg.validate = function () {
+    $('#sysRedPacketRecordInfoForm').data("bootstrapValidator").resetForm();
+    $('#sysRedPacketRecordInfoForm').bootstrapValidator('validate');
+    return $("#sysRedPacketRecordInfoForm").data('bootstrapValidator').isValid();
+};
+/**
+ * 清除数据
+ */
+SysRedPacketRecordInfoDlg.clearData = function() {
+    this.sysRedPacketRecordInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+SysRedPacketRecordInfoDlg.set = function(key, val) {
+    if(key=="type"){
+        var type="";
+        $('input[name="type"]:checked').each(function(){
+            type=$(this).val();
+        });
+        this.sysRedPacketRecordInfoData[key] = type;
+    }else{
+        this.sysRedPacketRecordInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    }
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+SysRedPacketRecordInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+SysRedPacketRecordInfoDlg.close = function() {
+    parent.layer.close(window.parent.SysRedPacketRecord.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+SysRedPacketRecordInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('money')
+    .set('insertTime')
+    .set('companyId')
+    .set('name')
+    .set('type')
+    .set('totalMoney')
+    .set('laveMoney')
+    .set('startMoney')
+    .set('endMoney')
+    .set('effective')
+    .set('companyType');
+}
+
+/**
+ * 提交添加
+ */
+SysRedPacketRecordInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if ($.trim($("#name").val())=="") {
+        Feng.error("红包名称不能为空!");
+        return;
+    }
+    if ($("#name").val().length > 15){
+        Feng.info("名称不能超过15个字");
+        return;
+    }
+    if ($("#totalMoney").val() > 99999999 ){
+        Feng.info("总金额最多不能超过8位数");
+        return;
+    }
+
+    var type =this.sysRedPacketRecordInfoData["type"];
+    var re =  /^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/;
+    if (!re.test($("#totalMoney").val())) {
+        Feng.error("请输入正确总金额数!");
+        return;
+    }
+    if(type==1){
+        if (!re.test($("#money").val())) {
+            Feng.error("请输入正确金额数!");
+            return;
+        }
+        if ($("#money").val() > 999 ){
+            Feng.info("金额最多不能超过3位数");
+            return;
+        }
+        if(parseFloat($("#money").val())>parseFloat($("#totalMoney").val())){
+            Feng.info("每个红包金额不能大于总金额");
+            return;
+        }
+    }else{
+        if (!re.test($("#startMoney").val()) || !re.test($("#endMoney").val())) {
+            Feng.error("请输入正确金额数!");
+            return;
+        }
+        if(parseFloat($("#endMoney").val())<parseFloat($("#startMoney").val())){
+            Feng.info("开始金额不能大于结束金额");
+            return;
+        }
+        if(parseFloat($("#totalMoney").val())<parseFloat($("#endMoney").val())){
+            Feng.info("每个红包金额不能大于总金额");
+            return;
+        }
+    }
+    if (!/^[1-9]\d*$/.test($("#effective").val())) {
+        Feng.error("请输入正确天数!");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/sysRedPacketRecord/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.SysRedPacketRecord.table.refresh();
+        SysRedPacketRecordInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.sysRedPacketRecordInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+SysRedPacketRecordInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/sysRedPacketRecord/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.SysRedPacketRecord.table.refresh();
+        SysRedPacketRecordInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.sysRedPacketRecordInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("sysRedPacketRecordInfoForm", SysRedPacketRecordInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tAdvertisement/tAdvertisement.js b/management/guns-admin/src/main/webapp/static/modular/system/tAdvertisement/tAdvertisement.js
new file mode 100644
index 0000000..15456c1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tAdvertisement/tAdvertisement.js
@@ -0,0 +1,296 @@
+/**
+ * 广告设置管理初始化
+ */
+var TAdvertisement = {
+    id: "TAdvertisementTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TAdvertisement.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '广告名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '广告类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.type != '' && row.type != null) {
+                    if (row.type == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="弹窗广告" onfocus="TUser.tooltip()">弹窗广告</p>']
+                    } else if (row.type == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="首页底部广告" onfocus="TUser.tooltip()">首页底部广告</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '所属省', field: 'provinceName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.provinceName != '' && row.provinceName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.provinceName + '" onfocus="TUser.tooltip()">' + row.provinceName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '广告图片', field: 'imgUrl', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                if (row.imgUrl == null || row.imgUrl == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.imgUrl + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '是否跳转', field: 'isJump', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.isJump != '' && row.isJump != null) {
+                    if (row.isJump == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="是" onfocus="TUser.tooltip()">是</p>']
+                    } else if (row.isJump == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="否" onfocus="TUser.tooltip()">否</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '跳转类型', field: 'jumpType', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.jumpType != '' && row.jumpType != null) {
+                    if (row.jumpType == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="外部" onfocus="TUser.tooltip()">外部</p>']
+                    } else if (row.jumpType == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="内部" onfocus="TUser.tooltip()">内部</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '跳转内容', field: 'jumpUrl', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.jumpUrl != '' && row.jumpUrl != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.jumpUrl + '" onfocus="TUser.tooltip()">' + row.jumpUrl + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: #0d8ddb;" title="已上线" onfocus="TUser.tooltip()">已上线</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="已下线" onfocus="TUser.tooltip()">已下线</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TAdvertisement.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TAdvertisement.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加广告设置
+ */
+TAdvertisement.openAddTAdvertisement = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加广告图',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tAdvertisement/tAdvertisement_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看广告设置详情
+ */
+TAdvertisement.openTAdvertisementDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑广告图',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tAdvertisement/tAdvertisement_update/' + TAdvertisement.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除广告设置
+ */
+TAdvertisement.delete = function () {
+    if (this.check()) {
+        var name = TAdvertisement.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该广告";
+        } else {
+            name = "【" + name + "】";
+        }
+        swal({
+            title: "您是否确认删除" + name + "?",
+            text: "请谨慎操作,删除后不可恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tAdvertisement/delete", function (data) {
+                swal("删除成功", "您已经成功删除了" + name + "。", "success");
+                TAdvertisement.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tAdvertisementId",TAdvertisement.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 上线
+ */
+TAdvertisement.up = function(){
+    if (this.check()) {
+        var name = TAdvertisement.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该广告";
+        } else {
+            name = "【" + name + "】";
+        }
+        if (TAdvertisement.seItem.state != 2) {
+            swal("上线失败", "【已下线】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            swal({
+                title: "您是否确认上线" + name + "?",
+                text: "请谨慎操作!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "上线",
+                closeOnConfirm: false
+            }, function () {
+                var ajax = new $ax(Feng.ctxPath + "/tAdvertisement/opt", function (data) {
+                    swal("上线成功", "您已经成功上线了" + name + "。", "success");
+                    TAdvertisement.table.refresh();
+                }, function (data) {
+                    swal("上线失败", data.responseJSON.message + "!", "warning");
+                });
+                ajax.set("tAdvertisementId", TAdvertisement.seItem.id);
+                ajax.set("optType", 1);
+                ajax.start();
+            });
+        }
+    }
+}
+
+/**
+ * 下线
+ */
+TAdvertisement.down = function(){
+    if (this.check()) {
+        var name = TAdvertisement.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该广告";
+        } else {
+            name = "【" + name + "】";
+        }
+        if (TAdvertisement.seItem.state != 1) {
+            swal("下线失败", "【已上线】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            swal({
+                title: "您是否确认下线" + name + "?",
+                text: "请谨慎操作!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "下线",
+                closeOnConfirm: false
+            }, function () {
+                var ajax = new $ax(Feng.ctxPath + "/tAdvertisement/opt", function (data) {
+                    swal("下线成功", "您已经成功下线了" + name + "。", "success");
+                    TAdvertisement.table.refresh();
+                }, function (data) {
+                    swal("下线失败", data.responseJSON.message + "!", "warning");
+                });
+                ajax.set("tAdvertisementId", TAdvertisement.seItem.id);
+                ajax.set("optType", 2);
+                ajax.start();
+            });
+        }
+    }
+}
+
+/**
+ * 查询广告设置列表
+ */
+TAdvertisement.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['type'] = $("#type").val();
+    TAdvertisement.table.refresh({query: queryData});
+};
+TAdvertisement.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#name").val("");
+    $("#type").val("");
+    TAdvertisement.search();
+};
+
+$(function () {
+    var defaultColunms = TAdvertisement.initColumn();
+    var table = new BSTable(TAdvertisement.id, "/tAdvertisement/list", defaultColunms);
+    table.setPaginationType("server");
+    TAdvertisement.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tAdvertisement/tAdvertisement_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tAdvertisement/tAdvertisement_info.js
new file mode 100644
index 0000000..7c36965
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tAdvertisement/tAdvertisement_info.js
@@ -0,0 +1,210 @@
+/**
+ * 初始化广告设置详情对话框
+ */
+var TAdvertisementInfoDlg = {
+    tAdvertisementInfoData : {},
+    editor: null,
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '广告图名称不能为空'
+                }
+            }
+        },
+        type: {
+            validators: {
+                notEmpty: {
+                    message: '请先选择广告类型'
+                }
+            }
+        },
+        provinceCode: {
+            validators: {
+                notEmpty: {
+                    message: '请先选择所属省'
+                }
+            }
+        },
+        isJump: {
+            validators: {
+                notEmpty: {
+                    message: '请先选择是否跳转'
+                }
+            }
+        },
+        isJump: {
+            validators: {
+                notEmpty: {
+                    message: '请先选择跳转类型'
+                }
+            }
+        },
+        jumpUrl: {
+            validators: {
+                notEmpty: {
+                    message: '跳转路径不能为空'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TAdvertisementInfoDlg.validate = function () {
+    $('#advertisementInfoForm').data("bootstrapValidator").resetForm();
+    $('#advertisementInfoForm').bootstrapValidator('validate');
+    return $("#advertisementInfoForm").data('bootstrapValidator').isValid();
+};
+
+
+/**
+ * 清除数据
+ */
+TAdvertisementInfoDlg.clearData = function() {
+    this.tAdvertisementInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TAdvertisementInfoDlg.set = function(key, val) {
+    this.tAdvertisementInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TAdvertisementInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TAdvertisementInfoDlg.close = function() {
+    parent.layer.close(window.parent.TAdvertisement.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TAdvertisementInfoDlg.collectData = function() {
+    this.tAdvertisementInfoData['content'] = TAdvertisementInfoDlg.editor.getContent();
+    this
+    .set('id')
+    .set('name')
+    .set('imgUrl')
+    .set('type')
+    .set('isJump')
+    .set('jumpType')
+    .set('jumpUrl')
+    .set('flag')
+    .set('insertTime')
+    .set('insertUser')
+    .set('updateTime')
+    .set('updateUser')
+    .set('state')
+    .set('provinceId');
+}
+
+/**
+ * 提交添加
+ */
+TAdvertisementInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var imgUrl = $("#imgUrl").valueOf();
+    if ("" == imgUrl){
+        Feng.info("请上传广告图图片");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tAdvertisement/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TAdvertisement.table.refresh();
+        TAdvertisementInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tAdvertisementInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TAdvertisementInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var imgUrl = $("#imgUrl").valueOf();
+    if ("" == imgUrl){
+        Feng.info("请上传广告图图片");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tAdvertisement/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TAdvertisement.table.refresh();
+        TAdvertisementInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tAdvertisementInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("advertisementInfoForm", TAdvertisementInfoDlg.validateFields);
+    //初始化编辑器
+    TAdvertisementInfoDlg.editor = UE.getEditor('editor');
+    // 初始化图片上传
+    var imgUrl = new $WebUpload("imgUrl");
+    imgUrl.setUploadBarId("progressBar");
+    imgUrl.init();
+});
+
+/**
+ * 是否跳转
+ */
+TAdvertisementInfoDlg.isJump = function () {
+    var isJump = $("#isJump").val();
+    if (1 == isJump){
+        $("#yesDiv").show();
+    } else {
+        $("#yesDiv").hide();
+    }
+}
+/**
+ * 跳转类型
+ */
+TAdvertisementInfoDlg.jumpType = function () {
+    var jumpType = $("#jumpType").val();
+    if (1 == jumpType){
+        $("#internalDiv").show();
+        $("#externalDiv").hide();
+    } else if (2 == jumpType) {
+        $("#internalDiv").hide();
+        $("#externalDiv").show();
+    } else {
+        $("#internalDiv").hide();
+        $("#externalDiv").hide();
+    }
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tAgreement/tAgreement.js b/management/guns-admin/src/main/webapp/static/modular/system/tAgreement/tAgreement.js
new file mode 100644
index 0000000..6cc29db
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tAgreement/tAgreement.js
@@ -0,0 +1,105 @@
+/**
+ * 用户端协议管理管理初始化
+ */
+var TAgreement = {
+    id: "TAgreementTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TAgreement.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+            {title: '主键id', field: 'id', visible: true, align: 'center', valign: 'middle'},
+            {title: '1=用户,2=司机', field: 'use', visible: true, align: 'center', valign: 'middle'},
+            {title: '协议内容', field: 'content', visible: true, align: 'center', valign: 'middle'},
+            {title: '类型(1:隐私协议,2:用户协议,3:用户指南,4:法律条款,5:关于我们,6=注册协议)', field: 'type', visible: true, align: 'center', valign: 'middle'},
+            {title: '1:创建,2:修改,3:删除', field: 'flag', visible: true, align: 'center', valign: 'middle'},
+            {title: '', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '', field: 'insertUser', visible: true, align: 'center', valign: 'middle'},
+            {title: '', field: 'updateTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '', field: 'updateUser', visible: true, align: 'center', valign: 'middle'}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TAgreement.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TAgreement.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加用户端协议管理
+ */
+TAgreement.openAddTAgreement = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加用户端协议管理',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tAgreement/tAgreement_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看用户端协议管理详情
+ */
+TAgreement.openTAgreementDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '用户端协议管理详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tAgreement/tAgreement_update/' + TAgreement.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除用户端协议管理
+ */
+TAgreement.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tAgreement/delete", function (data) {
+            Feng.success("删除成功!");
+            TAgreement.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tAgreementId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询用户端协议管理列表
+ */
+TAgreement.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    TAgreement.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = TAgreement.initColumn();
+    var table = new BSTable(TAgreement.id, "/tAgreement/list", defaultColunms);
+    table.setPaginationType("client");
+    TAgreement.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tAgreement/tAgreement_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tAgreement/tAgreement_info.js
new file mode 100644
index 0000000..bebbd62
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tAgreement/tAgreement_info.js
@@ -0,0 +1,101 @@
+/**
+ * 初始化用户端协议管理详情对话框
+ */
+var TAgreementInfoDlg = {
+    tAgreementInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TAgreementInfoDlg.clearData = function() {
+    this.tAgreementInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TAgreementInfoDlg.set = function(key, val) {
+    this.tAgreementInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TAgreementInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TAgreementInfoDlg.close = function() {
+    parent.layer.close(window.parent.TAgreement.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TAgreementInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('use')
+    .set('content')
+    .set('type')
+    .set('flag')
+    .set('insertTime')
+    .set('insertUser')
+    .set('updateTime')
+    .set('updateUser');
+}
+
+/**
+ * 提交添加
+ */
+TAgreementInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tAgreement/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TAgreement.table.refresh();
+        TAgreementInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tAgreementInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TAgreementInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tAgreement/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TAgreement.table.refresh();
+        TAgreementInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tAgreementInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCar/carInsurance.js b/management/guns-admin/src/main/webapp/static/modular/system/tCar/carInsurance.js
new file mode 100644
index 0000000..d485714
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCar/carInsurance.js
@@ -0,0 +1,117 @@
+/**
+ * 车辆管理管理初始化
+ */
+var CarInsurance = {
+    id: "TCarTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1,
+    carId: $('#carId').val()
+};
+
+/**
+ * 初始化表格的列
+ */
+CarInsurance.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '保险公司名称', field: 'insurCom', visible: true, align: 'center', valign: 'middle'},
+        {title: '保险号', field: 'insurNum', visible: true, align: 'center', valign: 'middle'},
+        {title: '保险类型', field: 'insurType', visible: true, align: 'center', valign: 'middle'},
+        {title: '保险金额', field: 'insurCount', visible: true, align: 'center', valign: 'middle'},
+        {title: '保险生效时间', field: 'insurEff', visible: true, align: 'center', valign: 'middle'},
+        {title: '保险到期时间', field: 'insurExp', visible: true, align: 'center', valign: 'middle'}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+CarInsurance.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        CarInsurance.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加车辆管理
+ */
+CarInsurance.openAddCarInsurance = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加车险',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCar/showAddCarInsurance?carId=' + CarInsurance.carId
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看车辆管理详情
+ */
+CarInsurance.openCarInsuranceDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑车险',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCar/showEditCarInsurance?id=' + CarInsurance.seItem.id + "&carId=" + CarInsurance.carId
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除车辆管理
+ */
+CarInsurance.delete = function () {
+    if (this.check()) {
+        swal({
+            title: "您是否确认删除?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tCar/delCarInsurance", function (data) {
+                swal("删除成功", "您已经成功删除了。", "success");
+                CarInsurance.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message+"!", "warning");
+            });
+            ajax.set("id", CarInsurance.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+
+/**
+ * 查询车辆管理列表
+ */
+CarInsurance.search = function () {
+    var queryData = {};
+    CarInsurance.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = CarInsurance.initColumn();
+    var table = new BSTable(CarInsurance.id, "/tCar/queryInsuranceList", defaultColunms);
+    table.setPaginationType("server");
+    table.setQueryParams({
+        carId: CarInsurance.carId
+    })
+    CarInsurance.table = table.init();
+});
+
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCar/carInsuranceInfo.js b/management/guns-admin/src/main/webapp/static/modular/system/tCar/carInsuranceInfo.js
new file mode 100644
index 0000000..6bb47d2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCar/carInsuranceInfo.js
@@ -0,0 +1,100 @@
+var CarInsuranceInfo = {
+    id: $('#id').val(),
+    carId: $('#carId').val()
+}
+
+
+/**
+ * 关闭此对话框
+ */
+CarInsuranceInfo.close = function() {
+    parent.layer.close(window.parent.CarInsurance.layerIndex);
+}
+
+/**
+ * 提交添加
+ */
+CarInsuranceInfo.addSubmit = function() {
+    var insurCom = $('#insurCom').val();
+    var insurNum = $('#insurNum').val();
+    var insurType = $('#insurType').val();
+    var insurCount = $('#insurCount').val();
+    var insurEff = $('#insurEff').val();
+    var insurExp = $('#insurExp').val();
+    if(null == insurCom || '' == insurCom){
+        Feng.error("保险公司名称不能为空");
+        return;
+    }
+    if(null == insurNum || '' == insurNum){
+        Feng.error("保险号不能为空");
+        return;
+    }
+    if(null == insurType || '' == insurType){
+        Feng.error("保险类型不能为空");
+        return;
+    }
+    if(null == insurCount || '' == insurCount){
+        Feng.error("保险金额不能为空");
+        return;
+    }
+    if(null == insurEff || '' == insurEff){
+        Feng.error("保险生效时间不能为空");
+        return;
+    }
+    if(null == insurExp || '' == insurExp){
+        Feng.error("保险到期时间不能为空");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCar/saveCarInsurance", function(data){
+        Feng.success("添加成功!");
+        window.parent.CarInsurance.table.refresh();
+        CarInsuranceInfo.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarInfoData);
+    ajax.setData({
+        id: CarInsuranceInfo.id,
+        carId: CarInsuranceInfo.carId,
+        insurCom: insurCom,
+        insurNum: insurNum,
+        insurType: insurType,
+        insurCount: insurCount,
+        insurEff: insurEff,
+        insurExp: insurExp
+    })
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+CarInsuranceInfo.queryInfo = function() {
+//提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCar/queryCarInsurance", function(data){
+        var s = data.data;
+        $('#insurCom').val(s.insurCom);
+        $('#insurNum').val(s.insurNum);
+        $('#insurType').val(s.insurType);
+        $('#insurCount').val(s.insurCount);
+        $('#insurEff').val(s.insurEff.split(" ")[0]);
+        $('#insurExp').val(s.insurExp.split(" ")[0]);
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarInfoData);
+    ajax.setData({
+        id: CarInsuranceInfo.id
+    })
+    ajax.start();
+
+}
+
+$(function() {
+    if(CarInsuranceInfo.id != ''){
+        CarInsuranceInfo.queryInfo()
+    }
+});
+
+
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCar/tCar.js b/management/guns-admin/src/main/webapp/static/modular/system/tCar/tCar.js
new file mode 100644
index 0000000..a5c5cdf
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCar/tCar.js
@@ -0,0 +1,385 @@
+/**
+ * 车辆管理管理初始化
+ */
+var TCar = {
+    id: "TCarTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TCar.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车辆ID', field: 'id', visible: true, align: 'center', valign: 'middle'},
+        {title: '所属<br/>分公司', field: 'companyName', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyName != '' && row.companyName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyName + '" onfocus="TUser.tooltip()">' + row.companyName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '所属<br/>加盟商', field: 'franchiseeName', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.franchiseeName != '' && row.franchiseeName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.franchiseeName + '" onfocus="TUser.tooltip()">' + row.franchiseeName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车辆<br/>品牌', field: 'brandName', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.brandName != '' && row.brandName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.brandName + '" onfocus="TUser.tooltip()">' + row.brandName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车辆<br/>类型', field: 'modelName', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.modelName != '' && row.modelName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.modelName + '" onfocus="TUser.tooltip()">' + row.modelName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '颜色', field: 'carColor', visible: true, align: 'center', valign: 'middle',width:'5%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.carColor != '' && row.carColor != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.carColor + '" onfocus="TUser.tooltip()">' + row.carColor + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '服务<br/>模式', field: 'serverStr', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.serverStr != '' && row.serverStr != null) {
+                    var labelStr = "";
+                    var labelStrs = "";
+                    var labelArray = row.serverStr.split(",");
+                    for(var i=0;i<labelArray.length;i++){
+                        labelStr += labelArray[i] +"<br>";
+                        labelStrs += labelArray[i] + "&#10;";
+                    }
+                    labelStr = labelStr.substring(0,labelStr.length-4);
+                    labelStrs = labelStrs.substring(0,labelStrs.length-5);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + labelStrs + '" onfocus="TUser.tooltip()">' + labelStr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车牌号', field: 'carLicensePlate', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.carLicensePlate != '' && row.carLicensePlate != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.carLicensePlate + '" onfocus="TUser.tooltip()">' + row.carLicensePlate + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车辆照片', field: 'carPhoto', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                if (row.carPhoto == null || row.carPhoto == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.carPhoto + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '行驶证<br/>号码', field: 'drivingLicenseNumber', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.drivingLicenseNumber != '' && row.drivingLicenseNumber != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.drivingLicenseNumber + '" onfocus="TUser.tooltip()">' + row.drivingLicenseNumber + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '行驶证<br/>照片', field: 'drivingLicensePhoto', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                if (row.drivingLicensePhoto == null || row.drivingLicensePhoto == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.drivingLicensePhoto + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '座位数', field: 'seat', visible: true, align: 'center', valign: 'middle',width:'5%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.seat != '' && row.seat != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.seat + '" onfocus="TUser.tooltip()">' + row.seat + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '关联司机', field: 'driverName', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driverName != '' && row.driverName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.driverName + '" onfocus="TUser.tooltip()">' + row.driverName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '年检<br/>到期时间', field: 'annualInspectionTime', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.annualInspectionTime != '' && row.annualInspectionTime != null) {
+                    var time = row.annualInspectionTime.substring(0,10);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + time + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '商业保险<br/>到期时间', field: 'commercialInsuranceTime', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.commercialInsuranceTime != '' && row.commercialInsuranceTime != null) {
+                    var time = row.commercialInsuranceTime.substring(0,10);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + time + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TCar.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCar.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加车辆管理
+ */
+TCar.openAddTCar = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加车辆',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCar/tCar_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看车辆管理详情
+ */
+TCar.openTCarDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑车辆',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCar/tCar_update/' + TCar.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除车辆管理
+ */
+TCar.delete = function () {
+    if (this.check()) {
+        var nickname = TCar.seItem.carLicensePlate;
+        if (nickname == "" || nickname == null || nickname == undefined){
+            nickname = "该车辆";
+        }else{
+            nickname = "【"+nickname+"】";
+        }
+        swal({
+            title: "您是否确认删除"+ nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tCar/delete", function (data) {
+                swal("删除成功", "您已经成功删除了"+ nickname + "。", "success");
+                TCar.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message+"!", "warning");
+            });
+            ajax.set("tCarId",TCar.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+
+TCar.carInsurance = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '车辆保险',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCar/carInsurance?carId=' + TCar.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+
+/**
+ * 查询车辆管理列表
+ */
+TCar.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['id'] = $("#id").val();
+    queryData['brandName'] = $("#brandName").val();
+    queryData['modelName'] = $("#modelName").val();
+    queryData['carColor'] = $("#carColor").val();
+    queryData['serverStr'] = $("#serverStr").val();
+    queryData['carLicensePlate'] = $("#carLicensePlate").val();
+    queryData['driverName'] = $("#driverName").val();
+    queryData['companyName'] = $("#companyName").val();
+    queryData['franchiseeName'] = $("#franchiseeName").val();
+    TCar.table.refresh({query: queryData});
+};
+
+TCar.resetSearch = function () {
+    $("#createTime").val("");
+    $("#id").val("");
+    $("#brandName").val("");
+    $("#modelName").val("");
+    $("#carColor").val("");
+    $("#serverStr").val("");
+    $("#carLicensePlate").val("");
+    $("#driverName").val("");
+    $("#companyName").val("");
+    $("#franchiseeName").val("");
+    TCar.search();
+};
+
+$(function () {
+    var defaultColunms = TCar.initColumn();
+    var table = new BSTable(TCar.id, "/tCar/list", defaultColunms);
+    table.setPaginationType("server");
+    TCar.table = table.init();
+});
+
+/**
+ * 下载模板
+ */
+TCar.uploadCarModel = function () {
+    window.location.href = Feng.ctxPath + "/tCar/uploadCarModel";
+}
+
+var agreement = function(){
+    this.init = function(){
+        //模拟上传excel  
+        $("#uploadEventBtn").unbind("click").bind("click",function(){
+            $("#uploadEventFile").click();
+        });
+    };
+}
+/**
+ * 导入合同
+ */
+TCar.exportCar = function () {
+    var uploadEventFile = $("#uploadEventFile").val();
+    if(uploadEventFile == ''){
+        Feng.info("请选择Excel,再上传");
+    }else if(uploadEventFile.lastIndexOf(".xls")<0){//可判断以.xls和.xlsx结尾的excel  
+        Feng.info("只能上传Excel文件");
+    }else{
+        var url = Feng.ctxPath + '/tCar/exportCar';
+        var file = document.querySelector('input[name=file]').files[0];
+        var reader = new FileReader();
+        if (file) {
+            var formData = new FormData();
+            formData.append("myfile", file);
+            this.sendAjaxRequest(url, 'POST', formData);
+        }
+    }
+}
+TCar.sendAjaxRequest = function(url,type,data){
+    $.ajax({
+        url : url,
+        type : type,
+        data : data,
+        success : function(result) {
+            if(result.code==500) {
+                Feng.info(result.message);
+            }else {
+                Feng.success("导入成功!");
+            }
+            TCar.table.refresh();
+        },
+        error : function() {
+            Feng.error("excel上传失败!");
+        },
+        cache : false,
+        contentType : false,
+        processData : false
+    });
+};
+
+var agreement;
+$(function(){
+    agreement = new agreement();
+    agreement.init();
+});
+
+/**
+ * 导出车辆操作
+ */
+TCar.outCar = function () {
+    var operation = function() {
+        window.location.href = Feng.ctxPath + "/tCar/outCar";
+    };
+    Feng.confirm("是否确认导出车辆信息?", operation);
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCar/tCar_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tCar/tCar_info.js
new file mode 100644
index 0000000..169b423
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCar/tCar_info.js
@@ -0,0 +1,550 @@
+/**
+ * 初始化车辆管理详情对话框
+ */
+var TCarInfoDlg = {
+    tCarInfoData : {},
+    validateFields: {
+        carBrandId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择车辆品牌'
+                }
+            }
+        },
+        carModelId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择车辆类型'
+                }
+            }
+        },
+        zcModel: {
+            validators: {
+                notEmpty: {
+                    message: '请选择专车车型'
+                }
+            }
+        },
+        kcModel: {
+            validators: {
+                notEmpty: {
+                    message: '请选择跨城出行车型'
+                }
+            }
+        },
+        carColor: {
+            validators: {
+                notEmpty: {
+                    message: '车辆颜色不能为空'
+                }
+            }
+        },
+        drivingLicenseNumber: {
+            validators: {
+                notEmpty: {
+                    message: '行驶证编号不能为空'
+                }
+            }
+        },
+        annualInspectionTime: {
+            validators: {
+                notEmpty: {
+                    message: '年检到期时间不能为空'
+                }
+            }
+        },
+        commercialInsuranceTime: {
+            validators: {
+                notEmpty: {
+                    message: '商业保险到期时间不能为空'
+                }
+            }
+        },
+        plateColor: {
+            validators: {
+                notEmpty: {
+                    message: '车牌颜色不能为空'
+                }
+            }
+        },
+        vehicleType: {
+            validators: {
+                notEmpty: {
+                    message: '车辆类型不能为空'
+                }
+            }
+        },
+        ownerName: {
+            validators: {
+                notEmpty: {
+                    message: '车辆所有人不能为空'
+                }
+            }
+        },
+        engineId: {
+            validators: {
+                notEmpty: {
+                    message: '发动机号不能为空'
+                }
+            }
+        },
+        VIN: {
+            validators: {
+                notEmpty: {
+                    message: '车辆VIN码不能为空'
+                }
+            }
+        },
+        certifyDateA: {
+            validators: {
+                notEmpty: {
+                    message: '车辆注册日期不能为空'
+                }
+            }
+        },
+        fuelType: {
+            validators: {
+                notEmpty: {
+                    message: '车辆燃料类型不能为空'
+                }
+            }
+        },
+        engineDisplace: {
+            validators: {
+                notEmpty: {
+                    message: '发动机排量不能为空'
+                }
+            }
+        },
+        certificate: {
+            validators: {
+                notEmpty: {
+                    message: '运输证字号不能为空'
+                }
+            }
+        },
+        transAgency: {
+            validators: {
+                notEmpty: {
+                    message: '车辆运输证发证机构不能为空'
+                }
+            }
+        },
+        transArea: {
+            validators: {
+                notEmpty: {
+                    message: '车辆经营区域不能为空'
+                }
+            }
+        },
+        transDateStart: {
+            validators: {
+                notEmpty: {
+                    message: '车辆运输证有效期起不能为空'
+                }
+            }
+        },
+        transDateStop: {
+            validators: {
+                notEmpty: {
+                    message: '车辆运输证有效期止不能为空'
+                }
+            }
+        },
+        certifyDateB: {
+            validators: {
+                notEmpty: {
+                    message: '车辆初次登记日期不能为空'
+                }
+            }
+        },
+        fixState: {
+            validators: {
+                notEmpty: {
+                    message: '车辆维修状态不能为空'
+                }
+            }
+        },
+        nextFixDate: {
+            validators: {
+                notEmpty: {
+                    message: '车辆下次年检时间不能为空'
+                }
+            }
+        },
+        checkState: {
+            validators: {
+                notEmpty: {
+                    message: '车辆年度审核状态不能为空'
+                }
+            }
+        },
+        feePrintId: {
+            validators: {
+                notEmpty: {
+                    message: '发票打印设备序列号不能为空'
+                }
+            }
+        },
+        GPSBrand: {
+            validators: {
+                notEmpty: {
+                    message: '卫星定位装置品牌不能为空'
+                }
+            }
+        },
+        GPSModel: {
+            validators: {
+                notEmpty: {
+                    message: '卫星定位装置型号不能为空'
+                }
+            }
+        },
+        GPSIMEI: {
+            validators: {
+                notEmpty: {
+                    message: '卫星定位装置IMEI号不能为空'
+                }
+            }
+        },
+        GPSInstallDate: {
+            validators: {
+                notEmpty: {
+                    message: '卫星定位装置安装时间不能为空'
+                }
+            }
+        },
+        registerDate: {
+            validators: {
+                notEmpty: {
+                    message: '车辆报备日期不能为空'
+                }
+            }
+        },
+        commercialType: {
+            validators: {
+                notEmpty: {
+                    message: '服务类型不能为空'
+                }
+            }
+        }
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TCarInfoDlg.validate = function () {
+    $('#carInfoForm').data("bootstrapValidator").resetForm();
+    $('#carInfoForm').bootstrapValidator('validate');
+    return $("#carInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TCarInfoDlg.clearData = function() {
+    this.tCarInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarInfoDlg.set = function(key, val) {
+    this.tCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TCarInfoDlg.close = function() {
+    parent.layer.close(window.parent.TCar.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TCarInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('isPlatCar')
+    .set('companyId')
+    .set('franchiseeId')
+    .set('carColor')
+    .set('carModelId')
+    .set('carBrandId')
+    .set('carLicensePlate')
+    .set('carPhoto')
+    .set('drivingLicenseNumber')
+    .set('drivingLicensePhoto')
+    .set('annualInspectionTime')
+    .set('commercialInsuranceTime')
+    .set('createTime')
+    .set('state')
+    .set('addType')
+    .set('addObjectId')
+    .set('plateColor')
+    .set('vehicleType')
+    .set('ownerName')
+    .set('engineId')
+    .set('VIN')
+    .set('certifyDateA')
+    .set('fuelType')
+    .set('engineDisplace')
+    .set('certificate')
+    .set('transAgency')
+    .set('transArea')
+    .set('transDateStart')
+    .set('transDateStop')
+    .set('certifyDateB')
+    .set('fixState')
+    .set('nextFixDate')
+    .set('checkState')
+    .set('feePrintId')
+    .set('GPSBrand')
+    .set('GPSModel')
+    .set('GPSIMEI')
+    .set('GPSInstallDate')
+    .set('registerDate')
+    .set('commercialType');
+}
+
+/**
+ * 提交添加
+ */
+TCarInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var roleType = $("#roleType").val();  //1=平台  2=分公司 3=加盟商
+    var companyType = $("input[name='companyType']:checked").val();
+    if (1 == roleType){
+        if (2 == companyType){
+            var oneId = $("#oneId").val();
+            if ("" == oneId){
+                Feng.info("所属分公司不能为空!");
+                return;
+            }
+        }
+    }
+    var serverBox =[];
+    $('input[name="serverBox"]:checked').each(function(){
+        serverBox.push($(this).val());
+    });
+    if (serverBox.length == 0){
+        Feng.info("请选择经营业务");
+        return;
+    }
+    var carPhoto = $("#carPhoto").valueOf();
+    if ("" == carPhoto){
+        Feng.info("请上传车辆照片");
+        return;
+    }
+    var drivingLicensePhoto = $("#drivingLicensePhoto").valueOf();
+    if ("" == drivingLicensePhoto){
+        Feng.info("请上传行驶证照片");
+        return;
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCar/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TCar.table.refresh();
+        TCarInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarInfoData);
+    ajax.set("serverBox",serverBox.toString());
+    ajax.set("zcModel",$("#zcModel").val());
+    ajax.set("kcModel",$("#kcModel").val());
+    ajax.set("roleType",roleType);
+    if (1 == roleType){
+        ajax.set("companyType",companyType);
+        ajax.set("oneId",$("#oneId").val());
+        ajax.set("twoId",$("#twoId").val());
+        ajax.set("franchiseeId",0);
+    } else if (2 == roleType) {
+        ajax.set("franchiseeId",$("#franchiseeId").val());
+        ajax.set("companyType",0);
+        ajax.set("oneId",0);
+        ajax.set("twoId",0);
+    }else if (3 == roleType){
+        ajax.set("franchiseeId",0);
+        ajax.set("companyType",0);
+        ajax.set("oneId",0);
+        ajax.set("twoId",0);
+    }
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TCarInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var roleType = $("#roleType").val();  //1=平台  2=分公司 3=加盟商
+    var companyType = $("input[name='companyType']:checked").val();
+    if (1 == roleType){
+        if (2 == companyType){
+            var oneId = $("#oneId").val();
+            if ("" == oneId){
+                Feng.info("所属分公司不能为空!");
+                return;
+            }
+        }
+    }
+    var serverBox =[];
+    $('input[name="serverBox"]:checked').each(function(){
+        serverBox.push($(this).val());
+    });
+    if (serverBox.length == 0){
+        Feng.info("请选择经营业务");
+        return;
+    }
+    var carPhoto = $("#carPhoto").valueOf();
+    if ("" == carPhoto){
+        Feng.info("请上传车辆照片");
+        return;
+    }
+    var drivingLicensePhoto = $("#drivingLicensePhoto").valueOf();
+    if ("" == drivingLicensePhoto){
+        Feng.info("请上传行驶证照片");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCar/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TCar.table.refresh();
+        TCarInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarInfoData);
+    ajax.set("serverBox",serverBox.toString());
+    ajax.set("zcModel",$("#zcModel").val());
+    ajax.set("kcModel",$("#kcModel").val());
+    ajax.set("roleType",roleType);
+    if (1 == roleType){
+        ajax.set("companyType",companyType);
+        ajax.set("oneId",$("#oneId").val());
+        ajax.set("twoId",$("#twoId").val());
+        ajax.set("franchiseeId",0);
+    } else if (2 == roleType) {
+        ajax.set("franchiseeId",$("#franchiseeId").val());
+        ajax.set("companyType",0);
+        ajax.set("oneId",0);
+        ajax.set("twoId",0);
+    }else if (3 == roleType){
+        ajax.set("franchiseeId",0);
+        ajax.set("companyType",0);
+        ajax.set("oneId",0);
+        ajax.set("twoId",0);
+    }
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("carInfoForm", TCarInfoDlg.validateFields);
+    // 初始化图片上传
+    var carPhoto = new $WebUpload("carPhoto");
+    carPhoto.setUploadBarId("progressBar");
+    carPhoto.init();
+    var drivingLicensePhoto = new $WebUpload("drivingLicensePhoto");
+    drivingLicensePhoto.setUploadBarId("progressBar");
+    drivingLicensePhoto.init();
+});
+
+/**
+ * 选择分公司后执行
+ */
+TCarInfoDlg.oneChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tDriver/oneChange", function(data){
+        if(data!=null){
+            var content='<option value="">选择所属加盟商</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#twoId").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+
+/**
+ * 类型改变执行
+ * @param e
+ */
+TCarInfoDlg.companyTypeClick = function (e) {
+    if (1 == e){
+        $(".companyDiv").hide();
+    } else if (2 == e){
+        $(".companyDiv").show();
+    }
+}
+
+/**
+ * 车辆品牌改变时执行
+ */
+TCarInfoDlg.brandChange = function (e) {
+    var carBrandId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCar/brandChange", function(data){
+        if(data!=null){
+            var content='<option value="">选择车辆类型</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#carModelId").empty().append(content);
+        }
+    });
+    ajax.set("carBrandId",carBrandId);
+    ajax.start();
+}
+
+/**
+ * 专车服务被点击
+ */
+TCarInfoDlg.zcServerClick = function () {
+    var serverBox1 = $('#serverBox1').prop('checked');
+    if (serverBox1){
+        $("#zcModelDiv").show();
+    } else {
+        $("#zcModelDiv").hide();
+    }
+}
+
+/**
+ * 跨城服务被点击
+ */
+TCarInfoDlg.kcServerClick = function () {
+    var serverBox3 = $('#serverBox3').prop('checked');
+    if (serverBox3){
+        $("#kcModelDiv").show();
+    } else {
+        $("#kcModelDiv").hide();
+    }
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCarBrand/tCarBrand.js b/management/guns-admin/src/main/webapp/static/modular/system/tCarBrand/tCarBrand.js
new file mode 100644
index 0000000..088aca0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCarBrand/tCarBrand.js
@@ -0,0 +1,190 @@
+/**
+ * 车辆品牌管理管理初始化
+ */
+var TCarBrand = {
+    id: "TCarBrandTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TCarBrand.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车辆<br/>品牌名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '品牌<br/>图标', field: 'imgUrl', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                if (row.imgUrl == null || row.imgUrl == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.imgUrl + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '关联<br/>车型数', field: 'modelNum', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.modelNum != '' && row.modelNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.modelNum + '" onfocus="TUser.tooltip()">' + row.modelNum + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '关联<br/>车辆数', field: 'carNum', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.carNum != '' && row.carNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.carNum + '" onfocus="TUser.tooltip()">' + row.carNum + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.remark != '' && row.remark != null){
+                    var str = row.remark;
+                    if (row.remark.length > 10){
+                        str = row.remark.substring(0,10)+"...";
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.remark + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TCarBrand.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCarBrand.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加车辆品牌管理
+ */
+TCarBrand.openAddTCarBrand = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加车辆品牌',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCarBrand/tCarBrand_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看车辆品牌管理详情
+ */
+TCarBrand.openTCarBrandDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑车辆品牌',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCarBrand/tCarBrand_update/' + TCarBrand.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除车辆品牌管理
+ */
+TCarBrand.delete = function () {
+    if (this.check()) {
+        var nickname = TCarBrand.seItem.name;
+        if (nickname == "" || nickname == null || nickname == undefined){
+            nickname = "该品牌";
+        }else{
+            nickname = "【"+nickname+"】";
+        }
+        var modelNum = TCarBrand.seItem.modelNum;
+        var carNum = TCarBrand.seItem.carNum;
+        if (parseInt(modelNum) > 0 || parseInt(carNum) > 0){
+            swal("删除失败", nickname +"下还有关联车型或关联车辆!", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除"+ nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tCarBrand/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "。", "success");
+                TCarBrand.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tCarBrandId", TCarBrand.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询车辆品牌管理列表
+ */
+TCarBrand.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['name'] = $("#name").val();
+    TCarBrand.table.refresh({query: queryData});
+};
+
+TCarBrand.resetSearch = function () {
+    $("#createTime").val("");
+    $("#name").val("");
+    TCarBrand.search();
+};
+
+$(function () {
+    var defaultColunms = TCarBrand.initColumn();
+    var table = new BSTable(TCarBrand.id, "/tCarBrand/list", defaultColunms);
+    table.setPaginationType("server");
+    TCarBrand.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCarBrand/tCarBrand_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tCarBrand/tCarBrand_info.js
new file mode 100644
index 0000000..83919bc
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCarBrand/tCarBrand_info.js
@@ -0,0 +1,134 @@
+/**
+ * 初始化车辆品牌管理详情对话框
+ */
+var TCarBrandInfoDlg = {
+    tCarBrandInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '品牌名称不能为空'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TCarBrandInfoDlg.validate = function () {
+    $('#carBrandInfoForm').data("bootstrapValidator").resetForm();
+    $('#carBrandInfoForm').bootstrapValidator('validate');
+    return $("#carBrandInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TCarBrandInfoDlg.clearData = function() {
+    this.tCarBrandInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarBrandInfoDlg.set = function(key, val) {
+    this.tCarBrandInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarBrandInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TCarBrandInfoDlg.close = function() {
+    parent.layer.close(window.parent.TCarBrand.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TCarBrandInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('name')
+    .set('imgUrl')
+    .set('remark')
+    .set('createTime')
+    .set('state');
+}
+
+/**
+ * 提交添加
+ */
+TCarBrandInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var driveCardImgUrl = $("#driveCardImgUrl").valueOf();
+    if ("" == driveCardImgUrl){
+        Feng.info("请上传品牌图标");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCarBrand/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TCarBrand.table.refresh();
+        TCarBrandInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarBrandInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TCarBrandInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var driveCardImgUrl = $("#driveCardImgUrl").valueOf();
+    if ("" == driveCardImgUrl){
+        Feng.info("请上传品牌图标");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCarBrand/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TCarBrand.table.refresh();
+        TCarBrandInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarBrandInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("carBrandInfoForm", TCarBrandInfoDlg.validateFields);
+    // 初始化图片上传
+    var imgUrl = new $WebUpload("imgUrl");
+    imgUrl.setUploadBarId("progressBar");
+    imgUrl.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCarModel/tCarModel.js b/management/guns-admin/src/main/webapp/static/modular/system/tCarModel/tCarModel.js
new file mode 100644
index 0000000..23b80a1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCarModel/tCarModel.js
@@ -0,0 +1,189 @@
+/**
+ * 车辆类型管理管理初始化
+ */
+var TCarModel = {
+    id: "TCarModelTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TCarModel.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车辆类型<br/>名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车型<br/>座位数', field: 'seat', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.seat != '' && row.seat != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.seat + '" onfocus="TUser.tooltip()">' + row.seat + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '品牌id', field: 'brandId', visible: false, align: 'center', valign: 'middle'},
+        {title: '所属<br/>车辆品牌', field: 'brandName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.brandName != '' && row.brandName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.brandName + '" onfocus="TUser.tooltip()">' + row.brandName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '关联<br/>车辆数', field: 'carNum', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.carNum != '' && row.carNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.carNum + '" onfocus="TUser.tooltip()">' + row.carNum + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.remark != '' && row.remark != null){
+                    var str = row.remark;
+                    if (row.remark.length > 10){
+                        str = row.remark.substring(0,10)+"...";
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.remark + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TCarModel.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCarModel.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加车辆类型管理
+ */
+TCarModel.openAddTCarModel = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加车辆类型',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCarModel/tCarModel_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看车辆类型管理详情
+ */
+TCarModel.openTCarModelDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑车辆类型',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCarModel/tCarModel_update/' + TCarModel.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除车辆类型管理
+ */
+TCarModel.delete = function () {
+    if (this.check()) {
+        var nickname = TCarModel.seItem.name;
+        if (nickname == "" || nickname == null || nickname == undefined){
+            nickname = "该类型";
+        }else{
+            nickname = "【"+nickname+"】";
+        }
+        var carNum = TCarModel.seItem.carNum;
+        if (parseInt(carNum) > 0){
+            swal("删除失败", nickname +"下还有关联车辆!", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除"+ nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tCarModel/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "。", "success");
+                TCarModel.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tCarModelId", TCarModel.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询车辆类型管理列表
+ */
+TCarModel.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['name'] = $("#name").val();
+    TCarModel.table.refresh({query: queryData});
+};
+
+TCarModel.resetSearch = function () {
+    $("#createTime").val("");
+    $("#name").val("");
+    TCarModel.search();
+};
+
+$(function () {
+    var defaultColunms = TCarModel.initColumn();
+    var table = new BSTable(TCarModel.id, "/tCarModel/list", defaultColunms);
+    table.setPaginationType("server");
+    TCarModel.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCarModel/tCarModel_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tCarModel/tCarModel_info.js
new file mode 100644
index 0000000..ee16bb8
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCarModel/tCarModel_info.js
@@ -0,0 +1,139 @@
+/**
+ * 初始化车辆类型管理详情对话框
+ */
+var TCarModelInfoDlg = {
+    tCarModelInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '类型名称不能为空'
+                }
+            }
+        },
+        seat: {
+            validators: {
+                notEmpty: {
+                    message: '座位数不能为空'
+                },
+                regexp: {
+                    regexp: /^[1-9]\d*$/,
+                    message: '座位数不正确'
+                }
+            }
+        },
+        brandId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择所属车辆品牌'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TCarModelInfoDlg.validate = function () {
+    $('#carModelInfoForm').data("bootstrapValidator").resetForm();
+    $('#carModelInfoForm').bootstrapValidator('validate');
+    return $("#carModelInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TCarModelInfoDlg.clearData = function() {
+    this.tCarModelInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarModelInfoDlg.set = function(key, val) {
+    this.tCarModelInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCarModelInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TCarModelInfoDlg.close = function() {
+    parent.layer.close(window.parent.TCarModel.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TCarModelInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('name')
+    .set('remark')
+    .set('createTime')
+    .set('state')
+    .set('seat')
+    .set('brandId');
+}
+
+/**
+ * 提交添加
+ */
+TCarModelInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCarModel/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TCarModel.table.refresh();
+        TCarModelInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarModelInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TCarModelInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCarModel/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TCarModel.table.refresh();
+        TCarModelInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tCarModelInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("carModelInfoForm", TCarModelInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCompany/franchisee.js b/management/guns-admin/src/main/webapp/static/modular/system/tCompany/franchisee.js
new file mode 100644
index 0000000..9874343
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCompany/franchisee.js
@@ -0,0 +1,270 @@
+/**
+ * 加盟商管理管理初始化
+ */
+var Franchisee = {
+    id: "FranchiseeTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+Franchisee.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '加盟商<br/>名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '所属<br/>分公司', field: 'companyName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyName != '' && row.companyName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyName + '" onfocus="TUser.tooltip()">' + row.companyName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '账号', field: 'account', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.account != '' && row.account != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.account + '" onfocus="TUser.tooltip()">' + row.account + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '加盟商<br/>地址', field: 'detailAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.detailAddress != '' && row.detailAddress != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.detailAddress + '" onfocus="TUser.tooltip()">' + row.detailAddress + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '联系人', field: 'principalName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.principalName != '' && row.principalName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.principalName + '" onfocus="TUser.tooltip()">' + row.principalName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '联系电话', field: 'principalPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.principalPhone != '' && row.principalPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.principalPhone + '" onfocus="TUser.tooltip()">' + row.principalPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '经营业务', field: 'serverStr', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.serverStr != '' && row.serverStr != null) {
+                    var labelStr = "";
+                    var labelStrs = "";
+                    var labelArray = row.serverStr.split(",");
+                    for(var i=0;i<labelArray.length;i++){
+                        labelStr += labelArray[i] +"<br>";
+                        labelStrs += labelArray[i] + "&#10;";
+                    }
+                    labelStr = labelStr.substring(0,labelStr.length-4);
+                    labelStrs = labelStrs.substring(0,labelStrs.length-5);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + labelStrs + '" onfocus="TUser.tooltip()">' + labelStr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车辆数', field: 'carNumber', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.carNumber != '' && row.carNumber != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.carNumber + '" onfocus="TUser.tooltip()">' + row.carNumber + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '司机数', field: 'driverNumber', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driverNumber != '' && row.driverNumber != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.driverNumber + '" onfocus="TUser.tooltip()">' + row.driverNumber + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="禁用" onfocus="TUser.tooltip()">禁用</p>']
+                    }
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+Franchisee.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        Franchisee.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加加盟商管理
+ */
+Franchisee.addFranchisee = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加加盟商',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCompany/tCompany_addFranchisee'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 查看
+ */
+Franchisee.detailFranchisee = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '查看详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCompany/tCompany_detailFranchisee/' + Franchisee.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+/**
+ * 打开查看加盟商管理详情
+ */
+Franchisee.updateFranchisee = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑加盟商',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCompany/tCompany_updateFranchisee/' + Franchisee.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+Franchisee.deleteFranchisee = function () {
+    if (this.check()) {
+        var nickname = Franchisee.seItem.name;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该加盟商";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        var carNumber = Franchisee.seItem.carNumber;
+        var driverNumber = Franchisee.seItem.driverNumber;
+        if (parseInt(carNumber) > 0 || parseInt(driverNumber) > 0){
+            swal("操作失败", nickname + "下还有车辆或司机!", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除" + nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tCompany/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "。", "success");
+                Franchisee.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tCompanyId", Franchisee.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询加盟商管理列表
+ */
+Franchisee.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['account'] = $("#account").val();
+    queryData['principalName'] = $("#principalName").val();
+    queryData['principalPhone'] = $("#principalPhone").val();
+    queryData['serviceStr'] = $("#serviceStr").val();
+    queryData['state'] = $("#state").val();
+    Franchisee.table.refresh({query: queryData});
+};
+
+Franchisee.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#name").val("");
+    $("#account").val("");
+    $("#principalName").val("");
+    $("#principalPhone").val("");
+    $("#serviceStr").val("");
+    $("#state").val("");
+    Franchisee.search();
+};
+
+$(function () {
+    var defaultColunms = Franchisee.initColumn();
+    var table = new BSTable(Franchisee.id, "/tCompany/listFranchisee", defaultColunms);
+    table.setPaginationType("server");
+    Franchisee.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCompany/franchisee_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tCompany/franchisee_info.js
new file mode 100644
index 0000000..26cf6d9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCompany/franchisee_info.js
@@ -0,0 +1,606 @@
+/**
+ * 初始化加盟商管理详情对话框
+ */
+var FranchiseeInfoDlg = {
+    franchiseeInfoData : {},
+    editor: null,
+    validateFields: {
+        superiorId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择所属分公司'
+                }
+            }
+        },
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '分公司名称不能为空'
+                }
+            }
+        },
+        account: {
+            validators: {
+                notEmpty: {
+                    message: '登录账号不能为空'
+                }
+            }
+        },
+        password: {
+            validators: {
+                notEmpty: {
+                    message: '登录密码不能为空'
+                },
+                identical: {
+                    field: 'rePassword',
+                    message: '两次密码不一致'
+                },
+            }
+        },
+        rePassword: {
+            validators: {
+                notEmpty: {
+                    message: '密码不能为空'
+                },
+                identical: {
+                    field: 'password',
+                    message: '两次密码不一致'
+                },
+            }
+        }
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+FranchiseeInfoDlg.validate = function () {
+    $('#franchiseeInfoForm').data("bootstrapValidator").resetForm();
+    $('#franchiseeInfoForm').bootstrapValidator('validate');
+    return $("#franchiseeInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+FranchiseeInfoDlg.clearData = function() {
+    this.franchiseeInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+FranchiseeInfoDlg.set = function(key, val) {
+    this.franchiseeInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+FranchiseeInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+FranchiseeInfoDlg.close = function() {
+    parent.layer.close(window.parent.Franchisee.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+FranchiseeInfoDlg.collectData = function() {
+    if ("" != $("#licenseTime").val()){
+        this.set('licenseTime')
+    }
+    if ("" != $("#licenseStartTime").val()){
+        this.set('licenseStartTime')
+    }
+    if ("" != $("#licenseEndTime").val()){
+        this.set('licenseEndTime')
+    }
+    if ("" != $("#setupTime").val()){
+        this.set('setupTime')
+    }
+    this
+        .set('id')
+        .set('isSpe')
+        .set('isTaxi')
+        .set('isCross')
+        .set('isCrossLogistics')
+        .set('isSameLogistics')
+        .set('isCharter')
+        .set('isSpeFixedOrProportional')
+        .set('isTaxiFixedOrProportional')
+        .set('isCrossLogisticsFixedOrProportional')
+        .set('isSameLogisticsFixedOrProportional')
+        .set('speMoney')
+        .set('taxiMoney')
+        .set('crossLogisticsMoney')
+        .set('sameLogisticsMoney')
+        .set('isNeedFerry')
+        .set('name')
+        .set('type')
+        .set('superiorId')
+        .set('principalName')
+        .set('principalPhone')
+        .set('adminName')
+        .set('adminPhone')
+        .set('urgentPhoen')
+        .set('identifier')
+        .set('addressCode')
+        .set('businessScope')
+        .set('contactAddress')
+        .set('documentAddress')
+        .set('economicType')
+        .set('regCapital')
+        .set('legalName')
+        .set('legalId')
+        .set('legalPhone')
+        .set('legalPhotoUrl')
+        .set('licensingAgency')
+        .set('licenseNumber')
+        .set('carNum')
+        .set('driverNum')
+        .set('mac')
+        .set('state')
+        .set('flag')
+        .set('upload')
+        .set('detailAddress')
+        .set('code')
+        .set('scopeCode')
+        .set('idCardPositive')
+        .set('idCardReverse')
+        .set('serviceScope');
+}
+
+/**
+ * 提交添加
+ */
+FranchiseeInfoDlg.addFranchisee = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var serverBox =[];
+    $('input[name="checkbox"]:checked').each(function(){
+        serverBox.push($(this).val());
+    });
+    if (serverBox.length == 0){
+        Feng.info("请选择经营业务!");
+        return;
+    }
+    var checkbox1 = $('#checkbox1').prop('checked');
+    if (checkbox1) {
+        var zc = $("input[name='zc']:checked").val();
+        if (1 == zc){
+            var zcPercent = $("#zcPercent").val();
+            if ("" == zcPercent){
+                Feng.info("专车比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(zcPercent)) {
+                Feng.info("专车比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == zc){
+            var zcMoney = $("#zcMoney").val();
+            if ("" == zcMoney){
+                Feng.info("专车固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(zcMoney)) {
+                Feng.info("专车固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox2 = $('#checkbox2').prop('checked');
+    if (checkbox2) {
+        var cz = $("input[name='cz']:checked").val();
+        if (1 == cz){
+            var czPercent = $("#czPercent").val();
+            if ("" == czPercent){
+                Feng.info("出租车比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(czPercent)) {
+                Feng.info("出租车比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == cz){
+            var czMoney = $("#czMoney").val();
+            if ("" == czMoney){
+                Feng.info("出租车固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(czMoney)) {
+                Feng.info("出租车固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox3 = $('#checkbox3').prop('checked');
+    var checkbox4 = $('#checkbox4').prop('checked');
+    if (checkbox4) {
+        var tcx = $("input[name='tcx']:checked").val();
+        if (1 == tcx){
+            var tcxPercent = $("#tcxPercent").val();
+            if ("" == tcxPercent){
+                Feng.info("同城小件物流比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(tcxPercent)) {
+                Feng.info("同城小件物流比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == tcx){
+            var tcxMoney = $("#tcxMoney").val();
+            if ("" == tcxMoney){
+                Feng.info("同城小件物流固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(tcxMoney)) {
+                Feng.info("同城小件物流固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox5 = $('#checkbox5').prop('checked');
+    if (checkbox5) {
+        var kcx = $("input[name='kcx']:checked").val();
+        if (1 == kcx){
+            var kcxPercent = $("#kcxPercent").val();
+            if ("" == kcxPercent){
+                Feng.info("跨城小件物流比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(kcxPercent)) {
+                Feng.info("跨城小件物流比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == kcx){
+            var kcxMoney = $("#kcxMoney").val();
+            if ("" == kcxMoney){
+                Feng.info("跨城小件物流固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(kcxMoney)) {
+                Feng.info("跨城小件物流固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox6 = $('#checkbox6').prop('checked');
+
+    var isNeedFerry = $("input[name='isNeedFerry']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCompany/addFranchisee", function(data){
+        if ("error" == data){
+            Feng.error("登录账户已存在,请重新输入");
+            return;
+        }
+        Feng.success("添加成功!");
+        window.parent.Franchisee.table.refresh();
+        FranchiseeInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(FranchiseeInfoDlg.franchiseeInfoData);
+    if (checkbox1){
+        var zc = $("input[name='zc']:checked").val();
+        ajax.set("isSpeFixedOrProportional",zc);
+        if (1 == zc){
+            ajax.set("speMoney",$("#zcPercent").val());
+        }else if (2 == zc) {
+            ajax.set("speMoney",$("#zcMoney").val());
+        }
+        ajax.set("isSpe",1);
+    }else{
+        ajax.set("isSpe",2);
+    }
+    if (checkbox2){
+        var cz = $("input[name='cz']:checked").val()
+        ajax.set("isTaxiFixedOrProportional",cz);
+        if (1 == cz){
+            ajax.set("taxiMoney",$("#czPercent").val());
+        }else if (2 == cz) {
+            ajax.set("taxiMoney",$("#czMoney").val());
+        }
+        ajax.set("isTaxi",1);
+    }else{
+        ajax.set("isTaxi",2);
+    }
+    if (checkbox3){
+        ajax.set("isCross",1);
+    }else{
+        ajax.set("isCross",2);
+    }
+    if (checkbox4){
+        var tcx = $("input[name='tcx']:checked").val();
+        ajax.set("isSameLogisticsFixedOrProportional",tcx);
+        if (1 == tcx){
+            ajax.set("sameLogisticsMoney",$("#tcxPercent").val());
+        }else if (2 == tcx) {
+            ajax.set("sameLogisticsMoney",$("#tcxMoney").val());
+        }
+        ajax.set("isSameLogistics",1);
+    }else{
+        ajax.set("isSameLogistics",2);
+    }
+    if (checkbox5){
+        var kcx = $("input[name='kcx']:checked").val()
+        ajax.set("isCrossLogisticsFixedOrProportional",kcx);
+        if (1 == kcx){
+            ajax.set("crossLogisticsMoney",$("#kcxPercent").val());
+        }else if (2 == kcx) {
+            ajax.set("crossLogisticsMoney",$("#kcxMoney").val());
+        }
+        ajax.set("isCrossLogistics",1);
+    }else{
+        ajax.set("isCrossLogistics",2);
+    }
+    if (checkbox6){
+        ajax.set("isCharter",1);
+    }else{
+        ajax.set("isCharter",2);
+    }
+    ajax.set("isNeedFerry",isNeedFerry);
+    ajax.set("account",$("#account").val());
+    ajax.set("password",$("#password").val());
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+FranchiseeInfoDlg.updateFranchisee = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var serverBox =[];
+    $('input[name="checkbox"]:checked').each(function(){
+        serverBox.push($(this).val());
+    });
+    if (serverBox.length == 0){
+        Feng.info("请选择经营业务!");
+        return;
+    }
+    var checkbox1 = $('#checkbox1').prop('checked');
+    if (checkbox1) {
+        var zc = $("input[name='zc']:checked").val();
+        if (1 == zc){
+            var zcPercent = $("#zcPercent").val();
+            if ("" == zcPercent){
+                Feng.info("专车比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(zcPercent)) {
+                Feng.info("专车比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == zc){
+            var zcMoney = $("#zcMoney").val();
+            if ("" == zcMoney){
+                Feng.info("专车固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(zcMoney)) {
+                Feng.info("专车固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox2 = $('#checkbox2').prop('checked');
+    if (checkbox2) {
+        var cz = $("input[name='cz']:checked").val();
+        if (1 == cz){
+            var czPercent = $("#czPercent").val();
+            if ("" == czPercent){
+                Feng.info("出租车比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(czPercent)) {
+                Feng.info("出租车比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == cz){
+            var czMoney = $("#czMoney").val();
+            if ("" == czMoney){
+                Feng.info("出租车固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(czMoney)) {
+                Feng.info("出租车固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox3 = $('#checkbox3').prop('checked');
+    var checkbox4 = $('#checkbox4').prop('checked');
+    if (checkbox4) {
+        var tcx = $("input[name='tcx']:checked").val();
+        if (1 == tcx){
+            var tcxPercent = $("#tcxPercent").val();
+            if ("" == tcxPercent){
+                Feng.info("同城小件物流比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(tcxPercent)) {
+                Feng.info("同城小件物流比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == tcx){
+            var tcxMoney = $("#tcxMoney").val();
+            if ("" == tcxMoney){
+                Feng.info("同城小件物流固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(tcxMoney)) {
+                Feng.info("同城小件物流固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox5 = $('#checkbox5').prop('checked');
+    if (checkbox5) {
+        var kcx = $("input[name='kcx']:checked").val();
+        if (1 == kcx){
+            var kcxPercent = $("#kcxPercent").val();
+            if ("" == kcxPercent){
+                Feng.info("跨城小件物流比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(kcxPercent)) {
+                Feng.info("跨城小件物流比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == kcx){
+            var kcxMoney = $("#kcxMoney").val();
+            if ("" == kcxMoney){
+                Feng.info("跨城小件物流固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(kcxMoney)) {
+                Feng.info("跨城小件物流固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox6 = $('#checkbox6').prop('checked');
+
+    var isNeedFerry = $("input[name='isNeedFerry']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCompany/updateFranchisee", function(data){
+        if ("error" == data){
+            Feng.error("登录账户已存在,请重新输入");
+            return;
+        }
+        Feng.success("修改成功!");
+        window.parent.Franchisee.table.refresh();
+        FranchiseeInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(FranchiseeInfoDlg.franchiseeInfoData);
+    if (checkbox1){
+        var zc = $("input[name='zc']:checked").val();
+        ajax.set("isSpeFixedOrProportional",zc);
+        if (1 == zc){
+            ajax.set("speMoney",$("#zcPercent").val());
+        }else if (2 == zc) {
+            ajax.set("speMoney",$("#zcMoney").val());
+        }
+        ajax.set("isSpe",1);
+    }else{
+        ajax.set("isSpe",2);
+    }
+    if (checkbox2){
+        var cz = $("input[name='cz']:checked").val()
+        ajax.set("isTaxiFixedOrProportional",cz);
+        if (1 == cz){
+            ajax.set("taxiMoney",$("#czPercent").val());
+        }else if (2 == cz) {
+            ajax.set("taxiMoney",$("#czMoney").val());
+        }
+        ajax.set("isTaxi",1);
+    }else{
+        ajax.set("isTaxi",2);
+    }
+    if (checkbox3){
+        ajax.set("isCross",1);
+    }else{
+        ajax.set("isCross",2);
+    }
+    if (checkbox4){
+        var tcx = $("input[name='tcx']:checked").val();
+        ajax.set("isSameLogisticsFixedOrProportional",tcx);
+        if (1 == tcx){
+            ajax.set("sameLogisticsMoney",$("#tcxPercent").val());
+        }else if (2 == tcx) {
+            ajax.set("sameLogisticsMoney",$("#tcxMoney").val());
+        }
+        ajax.set("isSameLogistics",1);
+    }else{
+        ajax.set("isSameLogistics",2);
+    }
+    if (checkbox5){
+        var kcx = $("input[name='kcx']:checked").val()
+        ajax.set("isCrossLogisticsFixedOrProportional",kcx);
+        if (1 == kcx){
+            ajax.set("crossLogisticsMoney",$("#kcxPercent").val());
+        }else if (2 == kcx) {
+            ajax.set("crossLogisticsMoney",$("#kcxMoney").val());
+        }
+        ajax.set("isCrossLogistics",1);
+    }else{
+        ajax.set("isCrossLogistics",2);
+    }
+    if (checkbox6){
+        ajax.set("isCharter",1);
+    }else{
+        ajax.set("isCharter",2);
+    }
+    ajax.set("isNeedFerry",isNeedFerry);
+    ajax.set("account",$("#account").val());
+    ajax.set("password",$("#password").val());
+    ajax.set("userId",$("#userId").val());
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("franchiseeInfoForm", FranchiseeInfoDlg.validateFields);
+});
+
+//专车
+FranchiseeInfoDlg.checkbox1 = function () {
+    var checkbox1 = $('#checkbox1').prop('checked');
+    if (checkbox1){
+        $("#zcDiv").show();
+    } else {
+        $("#zcDiv").hide();
+    }
+}
+//出租车
+FranchiseeInfoDlg.checkbox2 = function () {
+    var checkbox2 = $('#checkbox2').prop('checked');
+    if (checkbox2){
+        $("#czDiv").show();
+    } else {
+        $("#czDiv").hide();
+    }
+}
+//跨城出行
+FranchiseeInfoDlg.checkbox3 = function () {
+    var checkbox3 = $('#checkbox3').prop('checked');
+    if (checkbox3){
+        $("#kcDiv").show();
+    } else {
+        $("#kcDiv").hide();
+    }
+}
+//同城小件物流
+FranchiseeInfoDlg.checkbox4 = function () {
+    var checkbox4 = $('#checkbox4').prop('checked');
+    if (checkbox4){
+        $("#tcxDiv").show();
+    } else {
+        $("#tcxDiv").hide();
+    }
+}
+//跨城小件物流
+FranchiseeInfoDlg.checkbox5 = function () {
+    var checkbox5 = $('#checkbox5').prop('checked');
+    if (checkbox5){
+        $("#kcxDiv").show();
+    } else {
+        $("#kcxDiv").hide();
+    }
+}
+//包车
+FranchiseeInfoDlg.checkbox6 = function () {
+    var checkbox6 = $('#checkbox6').prop('checked');
+    if (checkbox6){
+        $("#bcDiv").show();
+    } else {
+        $("#bcDiv").hide();
+    }
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCompany/tCompany.js b/management/guns-admin/src/main/webapp/static/modular/system/tCompany/tCompany.js
new file mode 100644
index 0000000..1579a03
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCompany/tCompany.js
@@ -0,0 +1,293 @@
+/**
+ * 分公司管理管理初始化
+ */
+var TCompany = {
+    id: "TCompanyTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TCompany.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '分公司<br/>名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '账号', field: 'account', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.account != '' && row.account != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.account + '" onfocus="TUser.tooltip()">' + row.account + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '分公司<br/>地址', field: 'detailAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.detailAddress != '' && row.detailAddress != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.detailAddress + '" onfocus="TUser.tooltip()">' + row.detailAddress + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '负责人', field: 'principalName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.principalName != '' && row.principalName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.principalName + '" onfocus="TUser.tooltip()">' + row.principalName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '负责人<br/>电话', field: 'principalPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.principalPhone != '' && row.principalPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.principalPhone + '" onfocus="TUser.tooltip()">' + row.principalPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '管理人<br/>名称', field: 'adminName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.adminName != '' && row.adminName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.adminName + '" onfocus="TUser.tooltip()">' + row.adminName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '管理人<br/>电话', field: 'adminPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.adminPhone != '' && row.adminPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.adminPhone + '" onfocus="TUser.tooltip()">' + row.adminPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '下属加<br/>盟商数', field: 'franchiseeNum', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.franchiseeNum != '' && row.franchiseeNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.franchiseeNum + '" onfocus="TUser.tooltip()">' + row.franchiseeNum + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '经营<br/>业务', field: 'serverStr', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.serverStr != '' && row.serverStr != null) {
+                    var labelStr = "";
+                    var labelStrs = "";
+                    var labelArray = row.serverStr.split(",");
+                    for(var i=0;i<labelArray.length;i++){
+                        labelStr += labelArray[i] +"<br>";
+                        labelStrs += labelArray[i] + "&#10;";
+                    }
+                    labelStr = labelStr.substring(0,labelStr.length-4);
+                    labelStrs = labelStrs.substring(0,labelStrs.length-5);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + labelStrs + '" onfocus="TUser.tooltip()">' + labelStr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车辆数', field: 'carNumber', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.carNumber != '' && row.carNumber != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.carNumber + '" onfocus="TUser.tooltip()">' + row.carNumber + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '司机数', field: 'driverNumber', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driverNumber != '' && row.driverNumber != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.driverNumber + '" onfocus="TUser.tooltip()">' + row.driverNumber + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="禁用" onfocus="TUser.tooltip()">禁用</p>']
+                    }
+                } else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TCompany.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCompany.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加分公司管理
+ */
+TCompany.openAddTCompany = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加分公司',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tCompany/tCompany_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看分公司管理详情
+ */
+TCompany.openTCompanyDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑分公司',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCompany/tCompany_update/' + TCompany.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 查看
+ */
+TCompany.detail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '查看详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tCompany/tCompany_detail/' + TCompany.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除分公司管理
+ */
+TCompany.delete = function () {
+    if (this.check()) {
+        var nickname = TCompany.seItem.name;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该分公司";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        var franchiseeNum = TCompany.seItem.franchiseeNum;
+        var carNumber = TCompany.seItem.carNumber;
+        var driverNumber = TCompany.seItem.driverNumber;
+        if (parseInt(franchiseeNum) > 0 ||parseInt(carNumber) > 0 || parseInt(driverNumber) > 0){
+            swal("操作失败", nickname + "下还有加盟商或车辆或司机!", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除" + nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tCompany/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "。", "success");
+                TCompany.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tCompanyId", TCompany.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询分公司管理列表
+ */
+TCompany.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['principalName'] = $("#principalName").val();
+    queryData['principalPhone'] = $("#principalPhone").val();
+    queryData['adminName'] = $("#adminName").val();
+    queryData['adminPhone'] = $("#adminPhone").val();
+    queryData['serviceStr'] = $("#serviceStr").val();
+    queryData['state'] = $("#state").val();
+    TCompany.table.refresh({query: queryData});
+};
+
+TCompany.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#name").val("");
+    $("#principalName").val("");
+    $("#principalPhone").val("");
+    $("#adminName").val("");
+    $("#adminPhone").val("");
+    $("#serviceStr").val("");
+    $("#state").val("");
+    TCompany.search();
+};
+
+$(function () {
+    var defaultColunms = TCompany.initColumn();
+    var table = new BSTable(TCompany.id, "/tCompany/list", defaultColunms);
+    table.setPaginationType("server");
+    TCompany.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tCompany/tCompany_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tCompany/tCompany_info.js
new file mode 100644
index 0000000..1e3d9a5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tCompany/tCompany_info.js
@@ -0,0 +1,716 @@
+/**
+ * 初始化分公司管理详情对话框
+ */
+var TCompanyInfoDlg = {
+    tCompanyInfoData : {},
+    editor: null,
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '分公司名称不能为空'
+                }
+            }
+        },
+        account: {
+            validators: {
+                notEmpty: {
+                    message: '登录账号不能为空'
+                }
+            }
+        },
+        password: {
+            validators: {
+                notEmpty: {
+                    message: '登录密码不能为空'
+                },
+                identical: {
+                    field: 'rePassword',
+                    message: '两次密码不一致'
+                },
+            }
+        },
+        rePassword: {
+            validators: {
+                notEmpty: {
+                    message: '密码不能为空'
+                },
+                identical: {
+                    field: 'password',
+                    message: '两次密码不一致'
+                },
+            }
+        }
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TCompanyInfoDlg.validate = function () {
+    $('#companyInfoForm').data("bootstrapValidator").resetForm();
+    $('#companyInfoForm').bootstrapValidator('validate');
+    return $("#companyInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TCompanyInfoDlg.clearData = function() {
+    this.tCompanyInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCompanyInfoDlg.set = function(key, val) {
+    this.tCompanyInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCompanyInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TCompanyInfoDlg.close = function() {
+    parent.layer.close(window.parent.TCompany.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TCompanyInfoDlg.collectData = function() {
+    if ("" != $("#licenseTime").val()){
+        this.set('licenseTime')
+    }
+    if ("" != $("#licenseStartTime").val()){
+        this.set('licenseStartTime')
+    }
+    if ("" != $("#licenseEndTime").val()){
+        this.set('licenseEndTime')
+    }
+    if ("" != $("#setupTime").val()){
+        this.set('setupTime')
+    }
+    this
+    .set('id')
+    .set('isSpe')
+    .set('isTaxi')
+    .set('isCross')
+    .set('isCrossLogistics')
+    .set('isSameLogistics')
+    .set('isCharter')
+    .set('isSpeFixedOrProportional')
+    .set('isTaxiFixedOrProportional')
+    .set('isCrossLogisticsFixedOrProportional')
+    .set('isSameLogisticsFixedOrProportional')
+    .set('speMoney')
+    .set('taxiMoney')
+    .set('crossLogisticsMoney')
+    .set('sameLogisticsMoney')
+    .set('isNeedFerry')
+    .set('name')
+    .set('type')
+    .set('superiorId')
+    .set('principalName')
+    .set('principalPhone')
+    .set('adminName')
+    .set('adminPhone')
+    .set('urgentPhoen')
+    .set('identifier')
+    .set('addressCode')
+    .set('businessScope')
+    .set('contactAddress')
+    .set('documentAddress')
+    .set('economicType')
+    .set('regCapital')
+    .set('legalName')
+    .set('legalId')
+    .set('legalPhone')
+    .set('legalPhotoUrl')
+    .set('licensingAgency')
+    .set('licenseNumber')
+    .set('carNum')
+    .set('driverNum')
+    .set('mac')
+    .set('state')
+    .set('flag')
+    .set('upload')
+    .set('detailAddress')
+    .set('code')
+    .set('scopeCode')
+    .set('idCardPositive')
+    .set('idCardReverse')
+    .set('serviceScope');
+}
+
+/**
+ * 提交添加
+ */
+TCompanyInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var serverBox =[];
+    $('input[name="checkbox"]:checked').each(function(){
+        serverBox.push($(this).val());
+    });
+    if (serverBox.length == 0){
+        Feng.info("请选择经营业务!");
+        return;
+    }
+    var checkbox1 = $('#checkbox1').prop('checked');
+    if (checkbox1) {
+        var zc = $("input[name='zc']:checked").val();
+        if (1 == zc){
+            var zcPercent = $("#zcPercent").val();
+            if ("" == zcPercent){
+                Feng.info("专车比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(zcPercent)) {
+                Feng.info("专车比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == zc){
+            var zcMoney = $("#zcMoney").val();
+            if ("" == zcMoney){
+                Feng.info("专车固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(zcMoney)) {
+                Feng.info("专车固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox2 = $('#checkbox2').prop('checked');
+    if (checkbox2) {
+        var cz = $("input[name='cz']:checked").val();
+        if (1 == cz){
+            var czPercent = $("#czPercent").val();
+            if ("" == czPercent){
+                Feng.info("出租车比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(czPercent)) {
+                Feng.info("出租车比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == cz){
+            var czMoney = $("#czMoney").val();
+            if ("" == czMoney){
+                Feng.info("出租车固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(czMoney)) {
+                Feng.info("出租车固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox3 = $('#checkbox3').prop('checked');
+    var checkbox4 = $('#checkbox4').prop('checked');
+    if (checkbox4) {
+        var tcx = $("input[name='tcx']:checked").val();
+        if (1 == tcx){
+            var tcxPercent = $("#tcxPercent").val();
+            if ("" == tcxPercent){
+                Feng.info("同城小件物流比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(tcxPercent)) {
+                Feng.info("同城小件物流比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == tcx){
+            var tcxMoney = $("#tcxMoney").val();
+            if ("" == tcxMoney){
+                Feng.info("同城小件物流固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(tcxMoney)) {
+                Feng.info("同城小件物流固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox5 = $('#checkbox5').prop('checked');
+    if (checkbox5) {
+        var kcx = $("input[name='kcx']:checked").val();
+        if (1 == kcx){
+            var kcxPercent = $("#kcxPercent").val();
+            if ("" == kcxPercent){
+                Feng.info("跨城小件物流比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(kcxPercent)) {
+                Feng.info("跨城小件物流比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == kcx){
+            var kcxMoney = $("#kcxMoney").val();
+            if ("" == kcxMoney){
+                Feng.info("跨城小件物流固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(kcxMoney)) {
+                Feng.info("跨城小件物流固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox6 = $('#checkbox6').prop('checked');
+
+    var subArr=[];
+    $(".timeClass").each(function () {
+        subArr.push({
+            recordId:$(this).find("input[name*='recordId']").val(),
+            provinceCode:$(this).find("input[name*='provinceCode']").val(),
+            cityCode:$(this).find("input[name*='cityCode']").val(),
+            areaCode:$(this).find("input[name*='areaCode']").val(),
+        })
+    });
+    if(subArr.length <= 0){
+        Feng.error("请选择经营区域");
+        return;
+    }
+    var isNeedFerry = $("input[name='isNeedFerry']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCompany/add", function(data){
+        if ("error" == data){
+            Feng.error("登录账户已存在,请重新输入");
+            return;
+        }
+        Feng.success("添加成功!");
+        window.parent.TCompany.table.refresh();
+        TCompanyInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(TCompanyInfoDlg.tCompanyInfoData);
+    if (checkbox1){
+        var zc = $("input[name='zc']:checked").val();
+        ajax.set("isSpeFixedOrProportional",zc);
+        if (1 == zc){
+            ajax.set("speMoney",$("#zcPercent").val());
+        }else if (2 == zc) {
+            ajax.set("speMoney",$("#zcMoney").val());
+        }
+        ajax.set("isSpe",1);
+    }else{
+        ajax.set("isSpe",2);
+    }
+    if (checkbox2){
+        var cz = $("input[name='cz']:checked").val()
+        ajax.set("isTaxiFixedOrProportional",cz);
+        if (1 == cz){
+            ajax.set("taxiMoney",$("#czPercent").val());
+        }else if (2 == cz) {
+            ajax.set("taxiMoney",$("#czMoney").val());
+        }
+        ajax.set("isTaxi",1);
+    }else{
+        ajax.set("isTaxi",2);
+    }
+    if (checkbox3){
+        ajax.set("isCross",1);
+    }else{
+        ajax.set("isCross",2);
+    }
+    if (checkbox4){
+        var tcx = $("input[name='tcx']:checked").val();
+        ajax.set("isSameLogisticsFixedOrProportional",tcx);
+        if (1 == tcx){
+            ajax.set("sameLogisticsMoney",$("#tcxPercent").val());
+        }else if (2 == tcx) {
+            ajax.set("sameLogisticsMoney",$("#tcxMoney").val());
+        }
+        ajax.set("isSameLogistics",1);
+    }else{
+        ajax.set("isSameLogistics",2);
+    }
+    if (checkbox5){
+        var kcx = $("input[name='kcx']:checked").val()
+        ajax.set("isCrossLogisticsFixedOrProportional",kcx);
+        if (1 == kcx){
+            ajax.set("crossLogisticsMoney",$("#kcxPercent").val());
+        }else if (2 == kcx) {
+            ajax.set("crossLogisticsMoney",$("#kcxMoney").val());
+        }
+        ajax.set("isCrossLogistics",1);
+    }else{
+        ajax.set("isCrossLogistics",2);
+    }
+    if (checkbox6){
+        ajax.set("isCharter",1);
+    }else{
+        ajax.set("isCharter",2);
+    }
+    ajax.set("isNeedFerry",isNeedFerry);
+
+    ajax.set("subArr",JSON.stringify(subArr));
+    ajax.set("account",$("#account").val());
+    ajax.set("password",$("#password").val());
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TCompanyInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var serverBox =[];
+    $('input[name="checkbox"]:checked').each(function(){
+        serverBox.push($(this).val());
+    });
+    if (serverBox.length == 0){
+        Feng.info("请选择经营业务!");
+        return;
+    }
+    var checkbox1 = $('#checkbox1').prop('checked');
+    if (checkbox1) {
+        var zc = $("input[name='zc']:checked").val();
+        if (1 == zc){
+            var zcPercent = $("#zcPercent").val();
+            if ("" == zcPercent){
+                Feng.info("专车比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(zcPercent)) {
+                Feng.info("专车比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == zc){
+            var zcMoney = $("#zcMoney").val();
+            if ("" == zcMoney){
+                Feng.info("专车固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(zcMoney)) {
+                Feng.info("专车固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox2 = $('#checkbox2').prop('checked');
+    if (checkbox2) {
+        var cz = $("input[name='cz']:checked").val();
+        if (1 == cz){
+            var czPercent = $("#czPercent").val();
+            if ("" == czPercent){
+                Feng.info("出租车比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(czPercent)) {
+                Feng.info("出租车比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == cz){
+            var czMoney = $("#czMoney").val();
+            if ("" == czMoney){
+                Feng.info("出租车固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(czMoney)) {
+                Feng.info("出租车固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox3 = $('#checkbox3').prop('checked');
+    var checkbox4 = $('#checkbox4').prop('checked');
+    if (checkbox4) {
+        var tcx = $("input[name='tcx']:checked").val();
+        if (1 == tcx){
+            var tcxPercent = $("#tcxPercent").val();
+            if ("" == tcxPercent){
+                Feng.info("同城小件物流比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(tcxPercent)) {
+                Feng.info("同城小件物流比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == tcx){
+            var tcxMoney = $("#tcxMoney").val();
+            if ("" == tcxMoney){
+                Feng.info("同城小件物流固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(tcxMoney)) {
+                Feng.info("同城小件物流固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox5 = $('#checkbox5').prop('checked');
+    if (checkbox5) {
+        var kcx = $("input[name='kcx']:checked").val();
+        if (1 == kcx){
+            var kcxPercent = $("#kcxPercent").val();
+            if ("" == kcxPercent){
+                Feng.info("跨城小件物流比例抽成不能为空!");
+                return;
+            }else if (!regDouble.test(kcxPercent)) {
+                Feng.info("跨城小件物流比例抽成格式不正确!");
+                return;
+            }
+        }else if (2 == kcx){
+            var kcxMoney = $("#kcxMoney").val();
+            if ("" == kcxMoney){
+                Feng.info("跨城小件物流固定金额抽成不能为空!");
+                return;
+            }else if (!regDouble.test(kcxMoney)) {
+                Feng.info("跨城小件物流固定金额抽成格式不正确!");
+                return;
+            }
+        }
+    }
+    var checkbox6 = $('#checkbox6').prop('checked');
+
+    var subArr=[];
+    $(".timeClass").each(function () {
+        subArr.push({
+            recordId:$(this).find("input[name*='recordId']").val(),
+            provinceCode:$(this).find("input[name*='provinceCode']").val(),
+            cityCode:$(this).find("input[name*='cityCode']").val(),
+            areaCode:$(this).find("input[name*='areaCode']").val(),
+        })
+    });
+    if(subArr.length <= 0){
+        Feng.error("请选择经营区域");
+        return;
+    }
+    var isNeedFerry = $("input[name='isNeedFerry']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tCompany/update", function(data){
+        if ("error" == data){
+            Feng.error("登录账户已存在,请重新输入");
+            return;
+        }
+        Feng.success("修改成功!");
+        window.parent.TCompany.table.refresh();
+        TCompanyInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(TCompanyInfoDlg.tCompanyInfoData);
+    if (checkbox1){
+        var zc = $("input[name='zc']:checked").val();
+        ajax.set("isSpeFixedOrProportional",zc);
+        if (1 == zc){
+            ajax.set("speMoney",$("#zcPercent").val());
+        }else if (2 == zc) {
+            ajax.set("speMoney",$("#zcMoney").val());
+        }
+        ajax.set("isSpe",1);
+    }else{
+        ajax.set("isSpe",2);
+    }
+    if (checkbox2){
+        var cz = $("input[name='cz']:checked").val()
+        ajax.set("isTaxiFixedOrProportional",cz);
+        if (1 == cz){
+            ajax.set("taxiMoney",$("#czPercent").val());
+        }else if (2 == cz) {
+            ajax.set("taxiMoney",$("#czMoney").val());
+        }
+        ajax.set("isTaxi",1);
+    }else{
+        ajax.set("isTaxi",2);
+    }
+    if (checkbox3){
+        ajax.set("isCross",1);
+    }else{
+        ajax.set("isCross",2);
+    }
+    if (checkbox4){
+        var tcx = $("input[name='tcx']:checked").val();
+        ajax.set("isSameLogisticsFixedOrProportional",tcx);
+        if (1 == tcx){
+            ajax.set("sameLogisticsMoney",$("#tcxPercent").val());
+        }else if (2 == tcx) {
+            ajax.set("sameLogisticsMoney",$("#tcxMoney").val());
+        }
+        ajax.set("isSameLogistics",1);
+    }else{
+        ajax.set("isSameLogistics",2);
+    }
+    if (checkbox5){
+        var kcx = $("input[name='kcx']:checked").val()
+        ajax.set("isCrossLogisticsFixedOrProportional",kcx);
+        if (1 == kcx){
+            ajax.set("crossLogisticsMoney",$("#kcxPercent").val());
+        }else if (2 == kcx) {
+            ajax.set("crossLogisticsMoney",$("#kcxMoney").val());
+        }
+        ajax.set("isCrossLogistics",1);
+    }else{
+        ajax.set("isCrossLogistics",2);
+    }
+    if (checkbox6){
+        ajax.set("isCharter",1);
+    }else{
+        ajax.set("isCharter",2);
+    }
+    ajax.set("isNeedFerry",isNeedFerry);
+
+    ajax.set("subArr",JSON.stringify(subArr));
+    ajax.set("account",$("#account").val());
+    ajax.set("password",$("#password").val());
+    ajax.set("userId",$("#userId").val());
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("companyInfoForm", TCompanyInfoDlg.validateFields);
+    // 初始化图片上传
+    var idCardPositive = new $WebUpload("idCardPositive");
+    idCardPositive.setUploadBarId("progressBar");
+    idCardPositive.init();
+    var idCardReverse = new $WebUpload("idCardReverse");
+    idCardReverse.setUploadBarId("progressBar");
+    idCardReverse.init();
+});
+
+//专车
+TCompanyInfoDlg.checkbox1 = function () {
+    var checkbox1 = $('#checkbox1').prop('checked');
+    if (checkbox1){
+        $("#zcDiv").show();
+    } else {
+        $("#zcDiv").hide();
+    }
+}
+//出租车
+TCompanyInfoDlg.checkbox2 = function () {
+    var checkbox2 = $('#checkbox2').prop('checked');
+    if (checkbox2){
+        $("#czDiv").show();
+    } else {
+        $("#czDiv").hide();
+    }
+}
+//跨城出行
+TCompanyInfoDlg.checkbox3 = function () {
+    var checkbox3 = $('#checkbox3').prop('checked');
+    if (checkbox3){
+        $("#kcDiv").show();
+    } else {
+        $("#kcDiv").hide();
+    }
+}
+//同城小件物流
+TCompanyInfoDlg.checkbox4 = function () {
+    var checkbox4 = $('#checkbox4').prop('checked');
+    if (checkbox4){
+        $("#tcxDiv").show();
+    } else {
+        $("#tcxDiv").hide();
+    }
+}
+//跨城小件物流
+TCompanyInfoDlg.checkbox5 = function () {
+    var checkbox5 = $('#checkbox5').prop('checked');
+    if (checkbox5){
+        $("#kcxDiv").show();
+    } else {
+        $("#kcxDiv").hide();
+    }
+}
+//包车
+TCompanyInfoDlg.checkbox6 = function () {
+    var checkbox6 = $('#checkbox6').prop('checked');
+    if (checkbox6){
+        $("#bcDiv").show();
+    } else {
+        $("#bcDiv").hide();
+    }
+}
+//省改变
+TCompanyInfoDlg.provinceChange = function (e) {
+    var provinceCode=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
+        if(data!=null){
+            var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#city").empty().append(content);
+            $("#area").empty().append('<option value="">选择区</option>');
+        }
+    });
+    ajax.set("code",provinceCode);
+    ajax.start();
+}
+//市改变
+TCompanyInfoDlg.cityChage = function (e) {
+    var cityCode=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
+        if(data!=null){
+            var content='<option value="">选择区</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#area").empty().append(content);
+        }
+    });
+    ajax.set("code",cityCode);
+    ajax.start();
+}
+//添加区域
+TCompanyInfoDlg.addScope = function () {
+    var province = $("#province").val();
+    var city = $("#city").val();
+    var area = $("#area").val();
+    if ("" == province){
+        Feng.info("请选择区域");
+        return;
+    }
+    var subArr=[];
+    $(".timeClass").each(function () {
+        subArr.push({
+            recordId:$(this).find("input[name*='recordId']").val(),
+            provinceCode:$(this).find("input[name*='provinceCode']").val(),
+            cityCode:$(this).find("input[name*='cityCode']").val(),
+            areaCode:$(this).find("input[name*='areaCode']").val(),
+        })
+    });
+    for(var i=0;i<subArr.length;i++){
+        var provinceCode = subArr[i].provinceCode;
+        var cityCode = subArr[i].cityCode;
+        var areaCode = subArr[i].areaCode;
+        if (province == provinceCode && city == cityCode && area == areaCode) {
+            Feng.info("区域已存在,请重新选择");
+            return;
+        }
+    }
+    var provinceValue = $("#province option:selected").text();
+    var cityValue = "";
+    if (city != ""){
+        cityValue = $("#city option:selected").text();
+    }
+    var areaValue = "";
+    if (area != ""){
+        areaValue = $("#area option:selected").text();
+    }
+
+    var str = '<tr class="timeClass">' +
+        '<td><input type="hidden" id="recordId" name="recordId" value="0">' +
+        '<input type="hidden" id="provinceCode" name="provinceCode" value="'+province+'">' +
+        '<input type="hidden" id="cityCode" name="cityCode" value="'+city+'">' +
+        '<input type="hidden" id="areaCode" name="areaCode" value="'+area+'">'+provinceValue+cityValue+areaValue+'</td>' +
+        '<td><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#conn").append(str);
+}
+
+function deleteSub(e) {
+    $(e).parent().parent().remove();
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tComplaint/tComplaint.js b/management/guns-admin/src/main/webapp/static/modular/system/tComplaint/tComplaint.js
new file mode 100644
index 0000000..863a177
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tComplaint/tComplaint.js
@@ -0,0 +1,239 @@
+/**
+ * 投诉列表管理初始化
+ */
+var TComplaint = {
+    id: "TComplaintTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TComplaint.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '投诉时间', field: 'insert_time', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insert_time != '' && row.insert_time != null) {
+                    var time = row.insert_time.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insert_time + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '投诉人昵称', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '投诉人<br/>电话', field: 'userPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userPhone != '' && row.userPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userPhone + '" onfocus="TUser.tooltip()">' + row.userPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '投诉司机<br/>电话', field: 'driverPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driverPhone != '' && row.driverPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.driverPhone + '" onfocus="TUser.tooltip()">' + row.driverPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '投诉<br/>原因', field: 'reason', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.reason != '' && row.reason != null) {
+                    var str = row.reason;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TComplaint.buttonClick(' +  row.id+','+ 1+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.reason + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '描述', field: 'description', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.description != '' && row.description != null) {
+                    var str = row.description;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TComplaint.buttonClick(' +  row.id+','+ 2+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.description + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '备注', field: 'handleResult', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.handleResult != '' && row.handleResult != null) {
+                    var str = row.handleResult;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TComplaint.buttonClick(' +  row.id+','+ 3+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.handleResult + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'isHandle', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.isHandle != '' && row.isHandle != null) {
+                    if (row.isHandle == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已处理" onfocus="TUser.tooltip()">已处理</p>']
+                    }
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="未处理" onfocus="TUser.tooltip()">未处理</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '处理时间', field: 'handleTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.handleTime != '' && row.handleTime != null) {
+                    var time = row.handleTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.handleTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '处理人', field: 'handleUserName', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.handleUserName != '' && row.handleUserName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.handleUserName + '" onfocus="TUser.tooltip()">' + row.handleUserName + '</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 查看更多按钮
+ * @param con
+ */
+TComplaint.buttonClick = function (id,type) {
+    var index = layer.open({
+        type: 2,
+        title: '查看详情',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tComplaint/lookDetail/'+id+"/"+type
+    });
+    this.layerIndex = index;
+}
+
+
+
+/**
+ * 检查是否选中
+ */
+TComplaint.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TComplaint.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 立即处理
+ */
+TComplaint.immediately = function(){
+    if (this.check()) {
+        if (TComplaint.seItem.isHandle == 1) {
+            swal("处理失败", "【未处理】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即处理',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tComplaint/tComplaint_immediately/' + TComplaint.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+/**
+ * 删除投诉列表
+ */
+TComplaint.delete = function () {
+    if (this.check()) {
+        if (TComplaint.seItem.isHandle != 1) {
+            swal("删除失败", "【已处理】状态下才能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除该投诉记录?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tComplaint/delete", function (data) {
+                swal("删除成功", "您已经删除了该投诉记录。", "success");
+                TComplaint.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tComplaintId", TComplaint.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询投诉列表列表
+ */
+TComplaint.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['userPhone'] = $("#userPhone").val();
+    queryData['driverPhone'] = $("#driverPhone").val();
+    queryData['isHandle'] = $("#isHandle").val();
+    TComplaint.table.refresh({query: queryData});
+};
+
+TComplaint.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#userName").val("");
+    $("#userPhone").val("");
+    $("#driverPhone").val("");
+    $("#isHandle").val("");
+    TComplaint.search();
+};
+
+$(function () {
+    var defaultColunms = TComplaint.initColumn();
+    var table = new BSTable(TComplaint.id, "/tComplaint/list", defaultColunms);
+    table.setPaginationType("server");
+    TComplaint.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tComplaint/tComplaint_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tComplaint/tComplaint_info.js
new file mode 100644
index 0000000..ff1c132
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tComplaint/tComplaint_info.js
@@ -0,0 +1,111 @@
+/**
+ * 初始化投诉列表详情对话框
+ */
+var TComplaintInfoDlg = {
+    tComplaintInfoData : {},
+    validateFields: {
+        handleResult: {
+            validators: {
+                notEmpty: {
+                    message: '备注不能为空'
+                }/*,
+                regexp: {
+                    regexp: /^.{1,500}$/,
+                    message: '备注不能超过500个长度'
+                }*/
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TComplaintInfoDlg.validate = function () {
+    $('#complaintFormInfo').data("bootstrapValidator").resetForm();
+    $('#complaintFormInfo').bootstrapValidator('validate');
+    return $("#complaintFormInfo").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TComplaintInfoDlg.clearData = function() {
+    this.tComplaintInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TComplaintInfoDlg.set = function(key, val) {
+    this.tComplaintInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TComplaintInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TComplaintInfoDlg.close = function() {
+    parent.layer.close(window.parent.TComplaint.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TComplaintInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('userId')
+    .set('reason')
+    .set('driverId')
+    .set('description')
+    .set('isHandle')
+    .set('insertTime')
+    .set('handleResult')
+    .set('handleUserId');
+}
+
+/**
+ * 立即处理
+ */
+TComplaintInfoDlg.immediately = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var handleResult = $("#handleResult").val();
+    if (handleResult.length > 500){
+        Feng.info("备注不能超过500个字");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tComplaint/immediately", function(data){
+        Feng.success("处理成功!");
+        window.parent.TComplaint.table.refresh();
+        TComplaintInfoDlg.close();
+    },function(data){
+        Feng.error("处理失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("handleResult",$("#handleResult").val());
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("complaintFormInfo", TComplaintInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tDispatch/tDispatch.js b/management/guns-admin/src/main/webapp/static/modular/system/tDispatch/tDispatch.js
new file mode 100644
index 0000000..c07d023
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tDispatch/tDispatch.js
@@ -0,0 +1,226 @@
+/**
+ * 调度管理管理初始化
+ */
+var TDispatch = {
+    id: "TDispatchTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TDispatch.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '调度名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '所属分公司ID', field: 'companyId', visible: false, align: 'center', valign: 'middle'},
+        {title: '所属分公司', field: 'companyName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyName != '' && row.companyName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyName + '" onfocus="TUser.tooltip()">' + row.companyName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '所属加盟商ID', field: 'franchiseeId', visible: false, align: 'center', valign: 'middle'},
+        {title: '所属加盟商', field: 'franchiseeName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.franchiseeName != '' && row.franchiseeName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.franchiseeName + '" onfocus="TUser.tooltip()">' + row.franchiseeName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '调度电话', field: 'phone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.phone != '' && row.phone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.phone + '" onfocus="TUser.tooltip()">' + row.phone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '账号', field: 'account', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.account != '' && row.account != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.account + '" onfocus="TUser.tooltip()">' + row.account + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (1 == row.state){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                    } else if (2 == row.state){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="冻结" onfocus="TUser.tooltip()">冻结</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TDispatch.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TDispatch.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加调度管理
+ */
+TDispatch.openAddTDispatch = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加调度管理',
+        area: ['800px', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tDispatch/tDispatch_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看调度管理详情
+ */
+TDispatch.openTDispatchDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '调度管理详情',
+            area: ['800px', '80%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDispatch/tDispatch_update/' + TDispatch.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除调度管理
+ */
+TDispatch.opt = function (type) {
+    if (this.check()) {
+        var name = TDispatch.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该调度账号";
+        } else {
+            name = "【" + name + "】";
+        }
+        var str = "";
+        var text = "请谨慎操作!";
+        var title = "请谨慎操作!";
+        if (1 == type){
+            str = "删除";
+            title = "您是否确认删除"+name+"?";
+            text = "请谨慎操作,删除后数据无法恢复!";
+        } else if (2 == type){
+            str = "冻结";
+            title = "您是否确认冻结"+name+"?";
+        } else if (3 == type){
+            str = "解冻";
+            title = "您是否确认解冻"+name+"?";
+        }
+        if(2 == type){
+            if (TDispatch.seItem.state != 1) {
+                swal("冻结失败", "【正常】状态下才能执行此操作", "warning");
+                return;
+            }
+        }
+        if (3 == type){
+            if (TDispatch.seItem.state != 2){
+                swal("解冻失败", "【冻结】状态下才能执行此操作", "warning");
+                return;
+            }
+        }
+
+        swal({
+            title: title,
+            text: text,
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: str,
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tDispatch/opt", function (data) {
+                swal(str+"成功", "您已经"+str+"了" + name + "。", "success");
+                TDispatch.table.refresh();
+            }, function (data) {
+                swal(str+"失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tDispatchId",TDispatch.seItem.id);
+            ajax.set("optType", type);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询调度管理列表
+ */
+TDispatch.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['companyName'] = $("#companyName").val();
+    queryData['franchiseeName'] = $("#franchiseeName").val();
+    queryData['account'] = $("#account").val();
+    queryData['state'] = $("#state").val();
+    TDispatch.table.refresh({query: queryData});
+};
+
+TDispatch.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#name").val("");
+    $("#companyName").val("");
+    $("#franchiseeName").val("");
+    $("#account").val("");
+    $("#state").val("");
+    TDispatch.search();
+};
+
+$(function () {
+    var defaultColunms = TDispatch.initColumn();
+    var table = new BSTable(TDispatch.id, "/tDispatch/list", defaultColunms);
+    table.setPaginationType("server");
+    TDispatch.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tDispatch/tDispatch_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tDispatch/tDispatch_info.js
new file mode 100644
index 0000000..8d63de2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tDispatch/tDispatch_info.js
@@ -0,0 +1,251 @@
+/**
+ * 初始化调度管理详情对话框
+ */
+var TDispatchInfoDlg = {
+    tDispatchInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '调度名称不能为空'
+                }
+            }
+        },
+        /*oneId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择所属分公司'
+                }
+            }
+        },
+        twoId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择所属加盟商'
+                }
+            }
+        },
+        franchiseeId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择所属加盟商'
+                }
+            }
+        },*/
+        phone: {
+            validators: {
+                notEmpty: {
+                    message: '联系电话不能为空'
+                },
+                regexp: {
+                    regexp: /^1\d{10}$/,
+                    message: '联系电话格式不正确'
+                }
+            }
+        },
+        account: {
+            validators: {
+                notEmpty: {
+                    message: '登录账号不能为空'
+                },
+                regexp: {
+                    regexp: /^1\d{10}$/,
+                    message: '登录账号格式不正确'
+                }
+            }
+        },
+        password: {
+            validators: {
+                notEmpty: {
+                    message: '密码不能为空'
+                },
+                identical: {
+                    field: 'rePassword',
+                    message: '两次密码不一致'
+                },
+            }
+        },
+        rePassword: {
+            validators: {
+                notEmpty: {
+                    message: '密码不能为空'
+                },
+                identical: {
+                    field: 'password',
+                    message: '两次密码不一致'
+                },
+            }
+        }
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TDispatchInfoDlg.validate = function () {
+    $('#dispatchInfoForm').data("bootstrapValidator").resetForm();
+    $('#dispatchInfoForm').bootstrapValidator('validate');
+    return $("#dispatchInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TDispatchInfoDlg.clearData = function() {
+    this.tDispatchInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TDispatchInfoDlg.set = function(key, val) {
+    this.tDispatchInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TDispatchInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TDispatchInfoDlg.close = function() {
+    parent.layer.close(window.parent.TDispatch.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TDispatchInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('insertTime')
+    .set('name')
+    .set('companyId')
+    .set('franchiseeId')
+    .set('phone')
+    .set('account')
+    .set('password')
+    .set('insertUserId')
+    .set('insertUserRole')
+    .set('state');
+}
+
+/**
+ * 提交添加
+ */
+TDispatchInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var roleType = $("#roleType").val();  //1=平台  2=分公司 3=加盟商
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tDispatch/add", function(data){
+        if (data.code == 500){
+            Feng.error(data.message);
+            return ;
+        } else {
+            Feng.success("添加成功!");
+            window.parent.TDispatch.table.refresh();
+            TDispatchInfoDlg.close();
+        }
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tDispatchInfoData);
+    if (1 == roleType){
+        var companyId = $("#oneId").val();
+        if ("" != companyId && null != companyId && undefined != companyId){
+            ajax.set("companyId",companyId);
+        }
+        var franchiseeId = $("#twoId").val();
+        if ("" != franchiseeId && null != franchiseeId && undefined != franchiseeId){
+            ajax.set("franchiseeId",franchiseeId);
+        }
+    }else if (2 == roleType) {
+        var franchiseeId = $("#franchiseeId").val();
+        if ("" != franchiseeId && null != franchiseeId && undefined != franchiseeId){
+            ajax.set("franchiseeId",franchiseeId);
+        }
+    }
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TDispatchInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var roleType = $("#roleType").val();  //1=平台  2=分公司 3=加盟商
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tDispatch/update", function(data){
+        if (data.code == 500){
+            Feng.error(data.message);
+            return ;
+        } else {
+            Feng.success("修改成功!");
+            window.parent.TDispatch.table.refresh();
+            TDispatchInfoDlg.close();
+        }
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tDispatchInfoData);
+    if (1 == roleType){
+        var companyId = $("#oneId").val();
+        if ("" != companyId && null != companyId && undefined != companyId){
+            ajax.set("companyId",companyId);
+        }
+        var franchiseeId = $("#twoId").val();
+        if ("" != franchiseeId && null != franchiseeId && undefined != franchiseeId){
+            ajax.set("franchiseeId",franchiseeId);
+        }
+    }else if (2 == roleType) {
+        var franchiseeId = $("#franchiseeId").val();
+        if ("" != franchiseeId && null != franchiseeId && undefined != franchiseeId){
+            ajax.set("franchiseeId",franchiseeId);
+        }
+    }
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("dispatchInfoForm", TDispatchInfoDlg.validateFields);
+});
+
+/**
+ * 公司改变执行
+ */
+TDispatchInfoDlg.companyChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tDispatch/companyChange", function(data){
+        if(data!=null){
+            var content='<option value="">选择所属加盟商</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#twoId").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tDriver/punish.js b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/punish.js
new file mode 100644
index 0000000..19939a3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/punish.js
@@ -0,0 +1,157 @@
+var netCarDriverId = $('#netCarDriverId').val();
+var array = [];
+
+$(function () {
+    laydate.render({
+        elem: '#punishTime', //指定元素
+        format: 'yyyy-MM-dd',//日期格式
+        value: '',//默认值
+        zIndex: 99999999,//层叠顺序
+        trigger: 'click',
+        done: function(value, date, endDate){
+            console.log(value); //得到日期生成的值,如:2017-08-18
+        }
+    });
+    if('' != netCarDriverId){
+        getData();
+    }
+});
+
+var Training = {
+    id: "OpenCity",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1,
+
+};
+
+/**
+ * 关闭此对话框
+ */
+Training.close = function () {
+    parent.layer.close(window.parent.YesDriver.layerIndex);
+};
+
+
+
+/**
+ * 保存数据
+ */
+function save() {
+    if(array.length == 0){
+        Feng.error("请先添加处罚记录");
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/tDriver/savePunish",
+        type: 'POST',
+        data: {
+            punish: array.toString(),
+            driverId: netCarDriverId
+        },
+        success: function (res) {
+            if(res.status == 200){
+                Feng.success("添加成功");
+                Training.close();
+                window.parent.YesDriver.table.refresh();//刷新表格数据
+            }else{
+                Feng.error(res.msg)
+            }
+        }
+    });
+}
+
+
+function add() {
+    var id = $('#id').val();
+    var punishTime = $('#punishTime').val().trim();
+    var punishReason = $('#punishReason').val().trim();
+    var punishReault = $('#punishReault').val().trim();
+    if('' == punishTime){
+        Feng.error("处罚时间不能为空");
+        return;
+    }
+    if('' == punishReason){
+        Feng.error("处罚原因不能为空");
+        return;
+    }
+    if('' == punishReault){
+        Feng.error("处罚结果不能为空");
+        return;
+    }
+    var str = id + '_' + punishTime + '_' + punishReason + '_' + punishReault;
+    if($.inArray(str, array) < 0){
+        array.push(str);
+        $('#id').val('');
+        $('#punishTime').val('');
+        $('#punishReason').val('');
+        $('#punishReault').val('');
+    }
+    analysis();
+}
+
+
+function analysis() {
+    var str = '';
+    for(var i in array){
+        var a = array[i].split('_');
+        str += '<tr><td>' + (parseInt(i) + 1) + '</td><td>' + a[1] + '</td><td>' + a[2] + '</td><td>' + a[3] + '</td>' +
+            '<td><button onclick="remove(' + i + ')" >移除</button><button onclick="updateData(' + i + ')">修改</button></td></tr>';
+    }
+    $('#transAreaAdd').html(str);
+}
+
+
+function remove(i) {
+    var arr = [];
+    for(var l in array){
+        if(i == l){
+            continue
+        }
+        arr.push(array[l]);
+    }
+    array = arr;
+    analysis();
+}
+
+
+function updateData(i) {
+    var id = $('#id').val();
+    var punishTime = $('#punishTime').val().trim();
+    var punishReason = $('#punishReason').val().trim();
+    var punishReault = $('#punishReault').val().trim();
+    if('' != id || '' != punishTime || '' != punishReason || '' != punishReault){
+        Feng.error("请先处理当前数据");
+        return;
+    }
+    for(var l in array){
+        if(i == l){
+            var d = array[i].split('_');
+            $('#id').val(d[0]);
+            $('#punishTime').val(d[1]);
+            $('#punishReason').val(d[2]);
+            $('#punishReault').val(d[3]);
+            remove(i);
+        }
+    }
+}
+
+function getData() {
+    $.ajax({
+        url: Feng.ctxPath + '/tDriver/queryAllPunish',
+        type: 'POST',
+        data: {
+            driverId: netCarDriverId
+        },
+        success: function (res) {
+            if(res.status == 200){
+                var data = res.data;
+                for(var i in data){
+                    var str = data[i].id + '_' + data[i].punishTime.split(" ")[0] + '_' + data[i].punishReason + '_' + data[i].punishReault;
+                    array.push(str);
+                }
+                analysis();
+            }
+        }
+    });
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver.js b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver.js
new file mode 100644
index 0000000..9eab01e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver.js
@@ -0,0 +1,307 @@
+/**
+ * 司机审核列表管理初始化
+ */
+var TDriver = {
+    id: "TDriverTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TDriver.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '司机姓名', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '司机头像', field: 'headImgUrl', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                if (row.headImgUrl == null || row.headImgUrl == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.headImgUrl + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '司机来源', field: 'addType', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.addType != '' && row.addType != null) {
+                    if(row.addType == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="司机注册" onfocus="TUser.tooltip()">司机注册</p>']
+                    }else if (row.addType == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="平台添加" onfocus="TUser.tooltip()">平台添加</p>']
+                    }else if (row.addType == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="分公司添加" onfocus="TUser.tooltip()">分公司添加</p>']
+                    }else if (row.addType == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="加盟商添加" onfocus="TUser.tooltip()">加盟商添加</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '企业id', field: 'companyId', visible: false, align: 'center', valign: 'middle'},
+        {title: '所属分公司', field: 'companyName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyName != '' && row.companyName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyName + '" onfocus="TUser.tooltip()">' + row.companyName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '所属加盟商', field: 'franchiseeName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.franchiseeName != '' && row.franchiseeName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.franchiseeName + '" onfocus="TUser.tooltip()">' + row.franchiseeName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '登录账号【手机号】', field: 'phone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.phone != '' && row.phone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.phone + '" onfocus="TUser.tooltip()">' + row.phone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '性别', field: 'sex', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.sex != '' && row.sex != null) {
+                    if (row.sex == 1) {
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="男" onfocus="TUser.tooltip()">男</p>']
+                    }else if (row.sex == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="女" onfocus="TUser.tooltip()">女</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '驾驶证号码', field: 'driveCard', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driveCard != '' && row.driveCard != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.driveCard + '" onfocus="TUser.tooltip()">' + row.driveCard + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '驾龄', field: 'driverAge', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driverAge != '' && row.driverAge != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.driverAge + '" onfocus="TUser.tooltip()">' + row.driverAge + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '身份证号码', field: 'idCard', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.idCard != '' && row.idCard != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.idCard + '" onfocus="TUser.tooltip()">' + row.idCard + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '服务模式', field: 'serverStr', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.serverStr != '' && row.serverStr != null) {
+                    var labelStr = "";
+                    var labelStrs = "";
+                    var labelArray = row.serverStr.split(",");
+                    for(var i=0;i<labelArray.length;i++){
+                        labelStr += labelArray[i] +"<br>";
+                        labelStrs += labelArray[i] + "&#10;";
+                    }
+                    labelStr = labelStr.substring(0,labelStr.length-4);
+                    labelStrs = labelStrs.substring(0,labelStrs.length-5);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + labelStrs + '" onfocus="TUser.tooltip()">' + labelStr + '</p>']
+                }
+                return btn;
+            }
+        },
+        /*{title: '账号', field: 'phone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.phone != '' && row.phone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.phone + '" onfocus="TUser.tooltip()">' + row.phone + '</p>']
+                }
+                return btn;
+            }
+        },*/
+        /*{title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.remark != '' && row.remark != null){
+                    var str = row.remark;
+                    if (row.remark.length > 10){
+                        str = row.remark.substring(0,10)+"...";
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.remark + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },*/
+        {title: '状态', field: 'authState', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.authState != '' && row.authState != null) {
+                    if (row.authState == 1) {
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="待审核" onfocus="TUser.tooltip()">待审核</p>']
+                    }else if (row.authState == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已拒绝" onfocus="TUser.tooltip()">已拒绝</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TDriver.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TDriver.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 立即审核
+ */
+TDriver.immediately = function(){
+    if (this.check()) {
+        var authState = TDriver.seItem.authState;
+        if(authState != 1){
+            swal("操作失败", "待审核状态下才能执行此操作!", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即审核',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriver/tDriver_immediately/' + TDriver.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+/**
+ * 查看详情
+ */
+TDriver.look = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '查看详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriver/tDriver_look/' + TDriver.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+/**
+ * 删除司机审核列表
+ */
+TDriver.delete = function () {
+    if (this.check()) {
+        var nickname = TDriver.seItem.name;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该司机";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        swal({
+            title: "您是否确认删除" + nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tDriver/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "。", "success");
+                AppMachineInfo.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tDriverId", TDriver.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询司机审核列表列表
+ */
+TDriver.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['companyName'] = $("#companyName").val();
+    queryData['phone'] = $("#phone").val();
+    queryData['account'] = $("#account").val();
+    queryData['addType'] = $("#addType").val();
+    queryData['authState'] = $("#authState").val();
+    TDriver.table.refresh({query: queryData});
+};
+TDriver.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#companyName").val("");
+    $("#phone").val("");
+    $("#account").val("");
+    $("#addType").val("");
+    $("#authState").val("");
+    TDriver.search();
+};
+
+$(function () {
+    var defaultColunms = TDriver.initColumn();
+    var table = new BSTable(TDriver.id, "/tDriver/list", defaultColunms);
+    table.setPaginationType("server");
+    TDriver.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver_info.js
new file mode 100644
index 0000000..3180e08
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver_info.js
@@ -0,0 +1,172 @@
+/**
+ * 初始化司机审核列表详情对话框
+ */
+var TDriverInfoDlg = {
+    tDriverInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TDriverInfoDlg.clearData = function() {
+    this.tDriverInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TDriverInfoDlg.set = function(key, val) {
+    this.tDriverInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TDriverInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TDriverInfoDlg.close = function() {
+    parent.layer.close(window.parent.TDriver.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TDriverInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('account')
+    .set('jobNumber')
+    .set('phone')
+    .set('password')
+    .set('name')
+    .set('sex')
+    .set('idCard')
+    .set('companyId')
+    .set('headImgUrl')
+    .set('faceImgUrl')
+    .set('idCardImgUrl1')
+    .set('idCardImgUrl2')
+    .set('placeOfEmployment')
+    .set('birthday')
+    .set('bankCardNumber')
+    .set('driverNationality')
+    .set('driverNation')
+    .set('driverMaritalStatus')
+    .set('driverLanguageLevel')
+    .set('driverEducation')
+    .set('driverCensus')
+    .set('driverAddress')
+    .set('driverContactAddress')
+    .set('licenseCode')
+    .set('licenselImgUrl')
+    .set('driverAge')
+    .set('driveCard')
+    .set('driveCardImgUrl')
+    .set('driverType')
+    .set('getDriverLicenseDate')
+    .set('driverLicenseOn')
+    .set('driverLicenseOff')
+    .set('taxiDriver')
+    .set('taxiAptitudeCard')
+    .set('networkCarlssueImg')
+    .set('networkCarlssueOrganization')
+    .set('networkCarlssueDate')
+    .set('getNetworkCarProofDate')
+    .set('networkCarProofOn')
+    .set('networkCarProofOff')
+    .set('registerDate')
+    .set('fullTimeDriver')
+    .set('inDriverBlacklist')
+    .set('commercialType')
+    .set('contractCompany')
+    .set('contractOn')
+    .set('contractOff')
+    .set('emergencyContact')
+    .set('emergencyContactPhone')
+    .set('emergencyContactAddress')
+    .set('remark')
+    .set('isPlatCar')
+    .set('carId')
+    .set('authState')
+    .set('state')
+    .set('flag')
+    .set('insertTime')
+    .set('insertUser')
+    .set('updateTime')
+    .set('updateUser')
+    .set('addType');
+}
+
+/**
+ * 审核操作
+ */
+TDriverInfoDlg.authOpt = function(){
+    var authState = $("input[name='authState']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tDriver/authOpt", function(data){
+        Feng.success("操作成功!");
+        window.parent.TDriver.table.refresh();
+        TDriverInfoDlg.close();
+    },function(data){
+        Feng.error("操作失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("authState",authState);
+    ajax.start();
+}
+
+/**
+ * 提交添加
+ */
+TDriverInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tDriver/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TDriver.table.refresh();
+        TDriverInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tDriverInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TDriverInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tDriver/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TDriver.table.refresh();
+        TDriverInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tDriverInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tDriver/training.js b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/training.js
new file mode 100644
index 0000000..7587bf0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/training.js
@@ -0,0 +1,211 @@
+var netCarDriverId = $('#netCarDriverId').val();
+var array = [];
+
+$(function () {
+    laydate.render({
+        elem: '#courseTime', //指定元素
+        format: 'yyyy-MM-dd',//日期格式
+        value: '',//默认值
+        zIndex: 99999999,//层叠顺序
+        trigger: 'click',
+        done: function(value, date, endDate){
+            console.log(value); //得到日期生成的值,如:2017-08-18
+        }
+    });
+    laydate.render({
+        elem: '#startTime', //指定元素
+        format: 'HH:mm:ss',//日期格式
+        type: 'time',
+        value: '',//默认值
+        zIndex: 99999999,//层叠顺序
+        trigger: 'click',
+        done: function(value, date, endDate){
+            // console.log(value); //得到日期生成的值,如:2017-08-18
+            // var s = value;
+            // var start = new Date(s).getTime();
+            // var e = $('#endTime').val();
+            // var end = new Date(e).getTime();
+            // if(start >= end){
+            //     Feng.error("开始时间不能小于结束时间");
+            //     $(this).val('');
+            // }
+        }
+    });
+    laydate.render({
+        elem: '#endTime', //指定元素
+        format: 'HH:mm:ss',//日期格式
+        type: 'time',
+        value: '',//默认值
+        zIndex: 99999999,//层叠顺序
+        trigger: 'click',
+        done: function(value, date, endDate){
+            // console.log(value); //得到日期生成的值,如:2017-08-18
+            // var s = $('#startTime').val();
+            // var start = new Date(s).getTime();
+            // var e = value;
+            // var end = new Date(e).getTime();
+            // if(start >= end){
+            //     Feng.error("开始时间不能小于结束时间");
+            //     $('#startTime').val('');
+            // }
+        }
+    });
+    if('' != netCarDriverId){
+        getData();
+    }
+});
+
+var Training = {
+    id: "OpenCity",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1,
+
+};
+
+/**
+ * 关闭此对话框
+ */
+Training.close = function () {
+    parent.layer.close(window.parent.YesDriver.layerIndex);
+};
+
+
+
+/**
+ * 保存数据
+ */
+function save() {
+    if(array.length == 0){
+        Feng.error("请先添加培训记录");
+        return;
+    }
+    $.ajax({
+        url: Feng.ctxPath + "/tDriver/saveTrain",
+        type: 'POST',
+        data: {
+            train: array.toString(),
+            driverId: netCarDriverId
+        },
+        success: function (res) {
+            if(res.status == 200){
+                Feng.success("添加成功");
+                Training.close();
+                window.parent.YesDriver.table.refresh();//刷新表格数据
+            }else{
+                Feng.error(res.msg)
+            }
+        }
+    });
+}
+
+
+function add() {
+    var id = $('#id').val();
+    var courseName = $('#courseName').val().trim();
+    var courseTime = $('#courseTime').val().trim();
+    var startTime = $('#startTime').val().trim();
+    var endTime = $('#endTime').val().trim();
+    var duration = $('#duration').val().trim();
+    if('' == courseName){
+        Feng.error("课程名称不能为空");
+        return;
+    }
+    if('' == courseTime){
+        Feng.error("课程日期不能为空");
+        return;
+    }
+    if('' == startTime){
+        Feng.error("课程开始时间不能为空");
+        return;
+    }
+    if('' == endTime){
+        Feng.error("课程结束时间不能为空");
+        return;
+    }
+    if('' == duration){
+        Feng.error("课程时长不能为空");
+        return;
+    }
+    var str = id + '_' + courseName + '_' + courseTime + '_' + startTime + '_' + endTime + '_' + duration;
+    if($.inArray(str, array) < 0){
+        array.push(str);
+        $('#id').val('');
+        $('#courseName').val('');
+        $('#courseTime').val('');
+        $('#startTime').val('');
+        $('#endTime').val('');
+        $('#duration').val('');
+    }
+    analysis();
+}
+
+
+function analysis() {
+    var str = '';
+    for(var i in array){
+        var a = array[i].split('_');
+        str += '<tr><td>' + (parseInt(i) + 1) + '</td><td>' + a[1] + '</td><td>' + a[2] + '</td><td>' + a[3] + '</td><td>' + a[4] + '</td><td>' + a[5] + '</td>' +
+            '<td><button onclick="remove(' + i + ')" >移除</button><button onclick="updateData(' + i + ')">修改</button></td></tr>';
+    }
+    $('#transAreaAdd').html(str);
+}
+
+
+function remove(i) {
+    var arr = [];
+    for(var l in array){
+        if(i == l){
+            continue
+        }
+        arr.push(array[l]);
+    }
+    array = arr;
+    analysis();
+}
+
+
+function updateData(i) {
+    var id = $('#id').val();
+    var courseName = $('#courseName').val().trim();
+    var courseTime = $('#courseTime').val().trim();
+    var startTime = $('#startTime').val().trim();
+    var endTime = $('#endTime').val().trim();
+    var duration = $('#duration').val().trim();
+    if('' != id || '' != courseName || '' != courseTime || '' != startTime || '' != endTime || '' != duration){
+        Feng.error("请先处理当前数据");
+        return;
+    }
+    for(var l in array){
+        if(i == l){
+            var d = array[i].split('_');
+            $('#id').val(d[0]);
+            $('#courseName').val(d[1]);
+            $('#courseTime').val(d[2]);
+            $('#startTime').val(d[3]);
+            $('#endTime').val(d[4]);
+            $('#duration').val(d[5]);
+            remove(i);
+        }
+    }
+}
+
+function getData() {
+    $.ajax({
+        url: Feng.ctxPath + '/tDriver/queryAllTrain',
+        type: 'POST',
+        data: {
+            driverId: netCarDriverId
+        },
+        success: function (res) {
+            if(res.status == 200){
+                var data = res.data;
+                for(var i in data){
+                    var str = data[i].id + '_' + data[i].courseName + '_' + data[i].courseDate.split(" ")[0] + '_' + data[i].startTime + '_' + data[i].stopTime + '_' + data[i].duration;
+                    array.push(str);
+                }
+                analysis();
+            }
+        }
+    });
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver.js b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver.js
new file mode 100644
index 0000000..4b847e2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver.js
@@ -0,0 +1,567 @@
+/**
+ * 司机审核列表管理初始化
+ */
+var YesDriver = {
+    id: "YesDriverTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+YesDriver.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'7%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '姓名', field: 'name', visible: true, align: 'center', valign: 'middle',width:'5%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '头像', field: 'headImgUrl', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                if (row.headImgUrl == null || row.headImgUrl == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.headImgUrl + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '登录账号<br/>【手机号】', field: 'phone', visible: true, align: 'center', valign: 'middle',width:'5%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.phone != '' && row.phone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.phone + '" onfocus="TUser.tooltip()">' + row.phone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '性别', field: 'sex', visible: true, align: 'center', valign: 'middle',width:'3%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.sex != '' && row.sex != null) {
+                    if (row.sex == 1) {
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="男" onfocus="TUser.tooltip()">男</p>']
+                    }else if (row.sex == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="女" onfocus="TUser.tooltip()">女</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '司机来源', field: 'addType', visible: true, align: 'center', valign: 'middle',width:'5%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.addType != '' && row.addType != null) {
+                    if(row.addType == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="司机注册" onfocus="TUser.tooltip()">司机注册</p>']
+                    }else if (row.addType == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="平台添加" onfocus="TUser.tooltip()">平台添加</p>']
+                    }else if (row.addType == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="分公司添加" onfocus="TUser.tooltip()">分公司添加</p>']
+                    }else if (row.addType == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="加盟商添加" onfocus="TUser.tooltip()">加盟商添加</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '企业id', field: 'companyId', visible: false, align: 'center', valign: 'middle'},
+        {title: '所属<br/>分公司', field: 'companyName', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyName != '' && row.companyName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyName + '" onfocus="TUser.tooltip()">' + row.companyName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '所属<br/>加盟商', field: 'franchiseeName', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.franchiseeName != '' && row.franchiseeName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.franchiseeName + '" onfocus="TUser.tooltip()">' + row.franchiseeName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '当前车辆', field: 'carLicensePlate', visible: true, align: 'center', valign: 'middle',width:'7%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.carLicensePlate != '' && row.carLicensePlate != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.carLicensePlate + '" onfocus="TUser.tooltip()">' + row.carLicensePlate + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '服务模式', field: 'serverStr', visible: true, align: 'center', valign: 'middle',width:'7%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.serverStr != '' && row.serverStr != null) {
+                    var labelStr = "";
+                    var labelStrs = "";
+                    var labelArray = row.serverStr.split(",");
+                    for(var i=0;i<labelArray.length;i++){
+                        labelStr += labelArray[i] +"<br>";
+                        labelStrs += labelArray[i] + "&#10;";
+                    }
+                    labelStr = labelStr.substring(0,labelStr.length-4);
+                    labelStrs = labelStrs.substring(0,labelStrs.length-5);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + labelStrs + '" onfocus="TUser.tooltip()">' + labelStr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '关联线路', field: 'lineStr', visible: true, align: 'center', valign: 'middle',width:'7%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.lineStr != '' && row.lineStr != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.lineStr + '" onfocus="TUser.tooltip()">' + row.lineStr + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '评分', field: 'evaluateNum', visible: true, align: 'center', valign: 'middle',width:'7%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.evaluateNum != '' && row.evaluateNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.evaluateNum + '" onfocus="TUser.tooltip()">' + row.evaluateNum + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '历史<br/>接单数', field: 'historyNum', visible: true, align: 'center', valign: 'middle',width:'7%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.historyNum != '' && row.historyNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.historyNum + '" onfocus="TUser.tooltip()">' + row.historyNum + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '历史订单<br/>总金额', field: 'historyMoney', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.historyMoney != '' && row.historyMoney != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.historyMoney + '" onfocus="TUser.tooltip()">' + row.historyMoney + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '当前钱<br/>包余额', field: 'balance', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.balance != '' && row.balance != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + (row.laveActivityMoney + row.laveBusinessMoney) + '" onfocus="TUser.tooltip()">' + (row.laveActivityMoney + row.laveBusinessMoney) + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '钱包活<br/>动余额', field: 'laveActivityMoney', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.laveActivityMoney != '' && row.laveActivityMoney != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.laveActivityMoney + '" onfocus="TUser.tooltip()">' + row.laveActivityMoney + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '钱包收<br/>入余额', field: 'laveBusinessMoney', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.laveBusinessMoney != '' && row.laveBusinessMoney != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.laveBusinessMoney + '" onfocus="TUser.tooltip()">' + row.laveBusinessMoney + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'authState', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.authState != '' && row.authState != null) {
+                    if (row.authState == 2) {
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                    }else if (row.authState == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="冻结" onfocus="TUser.tooltip()">冻结</p>']
+                    }else if (row.authState == 1) {
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: #4858ff;" title="待审核" onfocus="TUser.tooltip()">待审核</p>']
+                    }else if (row.authState == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: rgba(60,70,63,0.54)" title="已拒绝" onfocus="TUser.tooltip()">已拒绝</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+YesDriver.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        YesDriver.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 添加司机
+ */
+YesDriver.add = function(){
+    var index = layer.open({
+        type: 2,
+        title: '添加司机',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tDriver/tDriver_add'
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 编辑司机
+ */
+YesDriver.update = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑司机',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriver/tDriver_update/' + YesDriver.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+/**
+ * 跳转至更换车辆页面
+ */
+YesDriver.changeCar = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '更换车辆',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriver/tDriver_changeCar/' + YesDriver.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+/**
+ * 冻结司机
+ */
+YesDriver.freeze = function(){
+    if (this.check()) {
+        var nickname = YesDriver.seItem.name;
+        if (YesDriver.seItem.authState == 3 ){
+            swal("冻结失败", "【正常】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '冻结司机'+"【"+nickname+"】",
+            area: ['720px', '450px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriver/tDriver_optDriver/' + YesDriver.seItem.id +"/"+2
+        });
+        this.layerIndex = index;
+
+        /*var nickname = YesDriver.seItem.name;
+        if (nickname == "" || nickname == null || nickname == undefined){
+            nickname = "该司机";
+        }else{
+            nickname = "【"+nickname+"】";
+        }
+        if (YesDriver.seItem.authState == 3 ){
+            swal("冻结失败", "【正常】状态下才能执行此操作", "warning");
+            return;
+        }else{
+            swal({
+                title: "您是否确认冻结"+ nickname + "?",
+                text: "请谨慎操作!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "冻结",
+                closeOnConfirm: true
+            }, function () {
+                /!*var ajax = new $ax(Feng.ctxPath + "/tDriver/optDriver", function (data) {
+                    swal("冻结成功", "您已经冻结了"+ nickname + "。", "success");
+                    YesDriver.table.refresh();
+                }, function (data) {
+                    swal("冻结失败", data.responseJSON.message+"!", "warning");
+                });
+                ajax.set("driverId",YesDriver.seItem.id);
+                ajax.set("optType",2);
+                ajax.start();*!/
+            });
+        }*/
+    }
+}
+
+/**
+ * 解冻司机
+ */
+YesDriver.thaw = function(){
+    if (this.check()) {
+        var nickname = YesDriver.seItem.name;
+        if (YesDriver.seItem.authState == 2 ){
+            swal("解冻失败", "【冻结】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '解冻司机'+"【"+nickname+"】",
+            area: ['720px', '450px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriver/tDriver_optDriver/' + YesDriver.seItem.id +"/"+1
+        });
+        this.layerIndex = index;
+        /*var nickname = YesDriver.seItem.name;
+        if (nickname == "" || nickname == null || nickname == undefined){
+            nickname = "该司机";
+        }else{
+            nickname = "【"+nickname+"】";
+        }
+        if (YesDriver.seItem.authState == 2 ){
+            swal("解冻失败", "【冻结】状态下才能执行此操作", "warning");
+            return;
+        }else{
+            swal({
+                title: "您是否确认解冻"+ nickname + "?",
+                text: "请谨慎操作!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "解冻",
+                closeOnConfirm: true
+            }, function () {
+                var ajax = new $ax(Feng.ctxPath + "/tDriver/optDriver", function (data) {
+                    swal("解冻成功", "您已经解冻了"+ nickname + "。", "success");
+                    YesDriver.table.refresh();
+                }, function (data) {
+                    swal("解冻失败", data.responseJSON.message+"!", "warning");
+                });
+                ajax.set("driverId",YesDriver.seItem.id);
+                ajax.set("optType",1);
+                ajax.start();
+            });
+        }*/
+    }
+}
+
+/**
+ * 删除司机
+ */
+YesDriver.deleteDriver = function(){
+    if (this.check()) {
+        var nickname = YesDriver.seItem.name;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该司机";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        swal({
+            title: "您是否确认删除" + nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tDriver/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "。", "success");
+                YesDriver.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tDriverId", YesDriver.seItem.id);
+            ajax.start();
+        });
+    }
+}
+
+YesDriver.training = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '添加培训',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriver/showTraining?id=' + YesDriver.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+
+YesDriver.punish = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '添加处罚',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriver/showPunish?id=' + YesDriver.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+
+/**
+ * 查询司机审核列表列表
+ */
+YesDriver.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['companyName'] = $("#companyName").val();
+    queryData['phone'] = $("#phone").val();
+    queryData['name'] = $("#name").val();
+    queryData['addType'] = $("#addType").val();
+    queryData['authState'] = $("#authState").val();
+    YesDriver.table.refresh({query: queryData});
+};
+YesDriver.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#companyName").val("");
+    $("#phone").val("");
+    $("#name").val("");
+    $("#addType").val("");
+    $("#authState").val("");
+    YesDriver.search();
+};
+
+$(function () {
+    var defaultColunms = YesDriver.initColumn();
+    var table = new BSTable(YesDriver.id, "/tDriver/listYesDriver", defaultColunms);
+    table.setPaginationType("server");
+    YesDriver.table = table.init();
+});
+
+/**
+ * 下载模板
+ */
+YesDriver.uploadDriverModel = function () {
+    window.location.href = Feng.ctxPath + "/tDriver/uploadDriverModel";
+}
+
+var agreement = function(){
+    this.init = function(){
+        //模拟上传excel  
+        $("#uploadEventBtn").unbind("click").bind("click",function(){
+            $("#uploadEventFile").click();
+        });
+    };
+}
+/**
+ * 导入合同
+ */
+YesDriver.exportDriver = function () {
+    var uploadEventFile = $("#uploadEventFile").val();
+    if(uploadEventFile == ''){
+        Feng.info("请选择Excel,再上传");
+    }else if(uploadEventFile.lastIndexOf(".xls")<0){//可判断以.xls和.xlsx结尾的excel  
+        Feng.info("只能上传Excel文件");
+    }else{
+        var url = Feng.ctxPath + '/tDriver/exportDriver';
+        var file = document.querySelector('input[name=file]').files[0];
+        var reader = new FileReader();
+        if (file) {
+            var formData = new FormData();
+            formData.append("myfile", file);
+            this.sendAjaxRequest(url, 'POST', formData);
+        }
+    }
+}
+YesDriver.sendAjaxRequest = function(url,type,data){
+    $.ajax({
+        url : url,
+        type : type,
+        data : data,
+        success : function(result) {
+            if(result.code==500) {
+                Feng.info(result.message);
+                $('input[name=file]').val('');
+            }else {
+                Feng.success("导入成功!");
+            }
+            YesDriver.table.refresh();
+        },
+        error : function() {
+            Feng.error("excel上传失败!");
+        },
+        cache : false,
+        contentType : false,
+        processData : false
+    });
+};
+
+var agreement;
+$(function(){
+    agreement = new agreement();
+    agreement.init();
+});
+
+/**
+ * 导出司机操作
+ */
+YesDriver.outDriver = function () {
+    var operation = function() {
+        window.location.href = Feng.ctxPath + "/tDriver/outDriver";
+    };
+    Feng.confirm("是否确认导出司机信息?", operation);
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_info.js
new file mode 100644
index 0000000..eb53f62
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_info.js
@@ -0,0 +1,714 @@
+/**
+ * 初始化司机审核列表详情对话框
+ */
+var YesDriverInfoDlg = {
+    yesDriverInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '司机名称不能为空'
+                }
+            }
+        },
+        phone: {
+            validators: {
+                notEmpty: {
+                    message: '手机号不能为空'
+                },
+                regexp: {
+                    regexp: /^1\d{10}$/,
+                    message: '电话格式不正确'
+                }
+            }
+        },
+        driveCard: {
+            validators: {
+                notEmpty: {
+                    message: '驾驶证号码不能为空'
+                }
+            }
+        },
+        driverAge: {
+            validators: {
+                notEmpty: {
+                    message: '驾龄不能为空'
+                },
+                regexp: {
+                    regexp: /^[0-9]\d*$/,
+                    message: '驾龄格式不正确'
+                }
+            }
+        },
+        idCard: {
+            validators: {
+                notEmpty: {
+                    message: '身份证号不能为空'
+                },
+                regexp: {
+                    regexp: /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/,
+                    message: '身份证号格式不正确'
+                }
+            }
+        },
+        driverAddress: {
+            validators: {
+                notEmpty: {
+                    message: '居住地址不能为空'
+                }
+            }
+        },
+        taxiAptitudeCard: {
+            validators: {
+                notEmpty: {
+                    message: '出租车资格证号不能为空'
+                }
+            }
+        },
+       /* account: {
+            validators: {
+                notEmpty: {
+                    message: '登录账号不能为空'
+                }
+            }
+        },*/
+        password: {
+            validators: {
+                notEmpty: {
+                    message: '密码不能为空'
+                },
+                regexp:{
+                    regexp: /^.{6,18}$/,
+                    message: '密码长度为6-18'
+                },
+                identical: {
+                    field: 'rePassword',
+                    message: '两次密码不一致'
+                },
+            }
+        },
+        rePassword: {
+            validators: {
+                notEmpty: {
+                    message: '密码不能为空'
+                },
+                regexp:{
+                    regexp: /^.{6,18}$/,
+                    message: '密码长度为6-18'
+                },
+                identical: {
+                    field: 'password',
+                    message: '两次密码不一致'
+                },
+            }
+        },
+        remark: {
+            validators: {
+                notEmpty: {
+                    message: '操作备注不能为空'
+                }
+            }
+        }
+
+        ,
+        driverNationality: {
+            validators: {
+                notEmpty: {
+                    message: '国籍不能为空'
+                }
+            }
+        },
+        driverNation: {
+            validators: {
+                notEmpty: {
+                    message: '民族不能为空'
+                }
+            }
+        },
+        driverLanguageLevel: {
+            validators: {
+                notEmpty: {
+                    message: '外语能力不能为空'
+                }
+            }
+        },
+        driverEducation: {
+            validators: {
+                notEmpty: {
+                    message: '学历不能为空'
+                }
+            }
+        },
+        driverCensus: {
+            validators: {
+                notEmpty: {
+                    message: '户口登记机关名称不能为空'
+                }
+            }
+        },
+        driverAddress: {
+            validators: {
+                notEmpty: {
+                    message: '户口地址不能为空'
+                }
+            }
+        },
+        driverContactAddress: {
+            validators: {
+                notEmpty: {
+                    message: '通信地址不能为空'
+                }
+            }
+        },
+        getDriverLicenseDate: {
+            validators: {
+                notEmpty: {
+                    message: '初次领取驾驶证日期不能为空'
+                }
+            }
+        },
+        driverLicenseOn: {
+            validators: {
+                notEmpty: {
+                    message: '驾驶证有效期限起不能为空'
+                }
+            }
+        },
+        driverLicenseOff: {
+            validators: {
+                notEmpty: {
+                    message: '驾驶证有效期限止不能为空'
+                }
+            }
+        },
+        networkCarlssueOrganization: {
+            validators: {
+                notEmpty: {
+                    message: '网络预约出租车驾驶员证发证机构不能为空'
+                }
+            }
+        },
+        networkCarlssueDate: {
+            validators: {
+                notEmpty: {
+                    message: '资格证发证日期不能为空'
+                }
+            }
+        },
+        getNetworkCarProofDate: {
+            validators: {
+                notEmpty: {
+                    message: '初次认领资格证日期不能为空'
+                }
+            }
+        },
+        networkCarProofOn: {
+            validators: {
+                notEmpty: {
+                    message: '资格证有效起始日期不能为空'
+                }
+            }
+        },
+        networkCarProofOff: {
+            validators: {
+                notEmpty: {
+                    message: '资格证有效截至日期不能为空'
+                }
+            }
+        },
+        registerDate: {
+            validators: {
+                notEmpty: {
+                    message: '报备日期不能为空'
+                }
+            }
+        },
+        contractCompany: {
+            validators: {
+                notEmpty: {
+                    message: '驾驶员合同签署公司不能为空'
+                }
+            }
+        },
+        contractOn: {
+            validators: {
+                notEmpty: {
+                    message: '合同有效期起不能为空'
+                }
+            }
+        },
+        contractOff: {
+            validators: {
+                notEmpty: {
+                    message: '合同有效期止不能为空'
+                }
+            }
+        },
+        emergencyContact: {
+            validators: {
+                notEmpty: {
+                    message: '紧急联系人不能为空'
+                }
+            }
+        },
+        emergencyContactPhone: {
+            validators: {
+                notEmpty: {
+                    message: '紧急联系电话不能为空'
+                }
+            }
+        },
+        emergencyContactAddress: {
+            validators: {
+                notEmpty: {
+                    message: '紧急联系地址不能为空'
+                }
+            }
+        }
+
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+YesDriverInfoDlg.validate = function () {
+    $('#yesDriverInfoForm').data("bootstrapValidator").resetForm();
+    $('#yesDriverInfoForm').bootstrapValidator('validate');
+    return $("#yesDriverInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+YesDriverInfoDlg.clearData = function() {
+    this.yesDriverInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+YesDriverInfoDlg.set = function(key, val) {
+    this.yesDriverInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+YesDriverInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+YesDriverInfoDlg.close = function() {
+    parent.layer.close(window.parent.YesDriver.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+YesDriverInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('account')
+    .set('jobNumber')
+    .set('phone')
+    .set('password')
+    .set('name')
+    .set('sex')
+    .set('idCard')
+    .set('companyId')
+    .set('headImgUrl')
+    .set('faceImgUrl')
+    .set('idCardImgUrl1')
+    .set('idCardImgUrl2')
+    .set('placeOfEmployment')
+    .set('birthday')
+    .set('bankCardNumber')
+    .set('driverNationality')
+    .set('driverNation')
+    .set('driverMaritalStatus')
+    .set('driverLanguageLevel')
+    .set('driverEducation')
+    .set('driverCensus')
+    .set('driverAddress')
+    .set('driverContactAddress')
+    .set('licenseCode')
+    .set('licenselImgUrl')
+    .set('driverAge')
+    .set('driveCard')
+    .set('driveCardImgUrl')
+    .set('driverType')
+    .set('getDriverLicenseDate')
+    .set('driverLicenseOn')
+    .set('driverLicenseOff')
+    .set('taxiDriver')
+    .set('taxiAptitudeCard')
+    .set('networkCarlssueImg')
+    .set('networkCarlssueOrganization')
+    .set('networkCarlssueDate')
+    .set('getNetworkCarProofDate')
+    .set('networkCarProofOn')
+    .set('networkCarProofOff')
+    .set('registerDate')
+    .set('fullTimeDriver')
+    .set('inDriverBlacklist')
+    .set('commercialType')
+    .set('contractCompany')
+    .set('contractOn')
+    .set('contractOff')
+    .set('emergencyContact')
+    .set('emergencyContactPhone')
+    .set('emergencyContactAddress')
+    .set('remark')
+    .set('isPlatCar')
+    .set('carId')
+    .set('authState')
+    .set('state')
+    .set('flag')
+    .set('insertTime')
+    .set('insertUser')
+    .set('updateTime')
+    .set('updateUser')
+    .set('addType');
+}
+
+/**
+ * 提交添加
+ */
+YesDriverInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var roleType = $("#roleType").val();  //1=平台  2=分公司 3=加盟商
+    var companyType = $("input[name='companyType']:checked").val();
+    if (1 == roleType){
+        if (2 == companyType){
+            var oneId = $("#oneId").val();
+            if ("" == oneId){
+                Feng.info("所属分公司不能为空!");
+                return;
+            }
+        }
+    }
+
+    var sex = $("input[name='sex']:checked").val();
+    var headImgUrl = $("#headImgUrl").val();
+    if ("" == headImgUrl){
+        Feng.info("请上传头像");
+        return;
+    }
+    var faceImgUrl = $("#faceImgUrl").val();
+    if ("" == faceImgUrl){
+        Feng.info("请上传人脸识别照片");
+        return;
+    }
+    var driveCardImgUrl = $("#driveCardImgUrl").val();
+    if ("" == driveCardImgUrl){
+        Feng.info("请上传驾驶证照片");
+        return;
+    }
+    var serverBox =[];
+    $('input[name="serverBox"]:checked').each(function(){
+        serverBox.push($(this).val());
+    });
+    if (serverBox.length == 0){
+        Feng.info("请选择经营业务!");
+        return;
+    }
+    var serverBox3 = $('#serverBox3').prop('checked');
+    var subArr=[];
+    if (serverBox3){
+        //线路不能为空
+        $(".lineClass").each(function () {
+            subArr.push({
+                lineId:$(this).find("input[name*='lineId']").val(),
+                time:$(this).find("input[name*='time']").val(),
+            })
+        });
+        if(subArr.length <= 0){
+            Feng.error("请选择关联线路");
+            return;
+        }
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tDriver/add", function(data){
+        if ("error" == data) {
+            Feng.error("登录账户已存在,请重新输入");
+            return;
+        }
+        Feng.success("添加成功!");
+        window.parent.YesDriver.table.refresh();
+        YesDriverInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.yesDriverInfoData);
+    ajax.set("serverBox",serverBox.toString());
+    ajax.set("lineStr",JSON.stringify(subArr));
+    ajax.set("sex",sex);
+    ajax.set("roleType",roleType);
+    if (1 == roleType){
+        ajax.set("companyType",companyType);
+        ajax.set("oneId",$("#oneId").val());
+        ajax.set("twoId",$("#twoId").val());
+        ajax.set("franchiseeId",0);
+    } else if (2 == roleType) {
+        ajax.set("franchiseeId",$("#franchiseeId").val());
+        ajax.set("companyType",0);
+        ajax.set("oneId",0);
+        ajax.set("twoId",0);
+    }else if (3 == roleType){
+        ajax.set("franchiseeId",0);
+        ajax.set("companyType",0);
+        ajax.set("oneId",0);
+        ajax.set("twoId",0);
+    }
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+YesDriverInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var roleType = $("#roleType").val();  //1=平台  2=分公司 3=加盟商
+    var companyType = $("input[name='companyType']:checked").val();
+    if (1 == roleType){
+        if (2 == companyType){
+            var oneId = $("#oneId").val();
+            if ("" == oneId){
+                Feng.info("所属分公司不能为空!");
+                return;
+            }
+        }
+    }
+    var sex = $("input[name='sex']:checked").val();
+    var headImgUrl = $("#headImgUrl").val();
+    if ("" == headImgUrl){
+        Feng.info("请上传头像");
+        return;
+    }
+    var faceImgUrl = $("#faceImgUrl").val();
+    if ("" == faceImgUrl){
+        Feng.info("请上传人脸识别照片");
+        return;
+    }
+    var driveCardImgUrl = $("#driveCardImgUrl").val();
+    if ("" == driveCardImgUrl){
+        Feng.info("请上传驾驶证照片");
+        return;
+    }
+    var serverBox =[];
+    $('input[name="serverBox"]:checked').each(function(){
+        serverBox.push($(this).val());
+    });
+    if (serverBox.length == 0){
+        Feng.info("请选择经营业务!");
+        return;
+    }
+    var serverBox3 = $('#serverBox3').prop('checked');
+    var subArr=[];
+    if (serverBox3){
+        //线路不能为空
+        $(".lineClass").each(function () {
+            subArr.push({
+                lineId:$(this).find("input[name*='lineId']").val(),
+                time:$(this).find("input[name*='time']").val(),
+            })
+        });
+        if(subArr.length <= 0){
+            Feng.error("请选择关联线路");
+            return;
+        }
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tDriver/update", function(data){
+        if ("error" == data) {
+            Feng.error("登录账户已存在,请重新输入");
+            return;
+        }
+        Feng.success("修改成功!");
+        window.parent.YesDriver.table.refresh();
+        YesDriverInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.yesDriverInfoData);
+    ajax.set("serverBox",serverBox.toString());
+    ajax.set("lineStr",JSON.stringify(subArr));
+    ajax.set("sex",sex);
+    ajax.set("roleType",roleType);
+    if (1 == roleType){
+        ajax.set("companyType",companyType);
+        ajax.set("oneId",$("#oneId").val());
+        ajax.set("twoId",$("#twoId").val());
+        ajax.set("franchiseeId",0);
+    } else if (2 == roleType) {
+        ajax.set("franchiseeId",$("#franchiseeId").val());
+        ajax.set("companyType",0);
+        ajax.set("oneId",0);
+        ajax.set("twoId",0);
+    }else if (3 == roleType){
+        ajax.set("franchiseeId",0);
+        ajax.set("companyType",0);
+        ajax.set("oneId",0);
+        ajax.set("twoId",0);
+    }
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("yesDriverInfoForm", YesDriverInfoDlg.validateFields);
+    // 初始化图片上传
+    var headImgUrl = new $WebUpload("headImgUrl");
+    headImgUrl.setUploadBarId("progressBar");
+    headImgUrl.init();
+    var faceImgUrl = new $WebUpload("faceImgUrl");
+    faceImgUrl.setUploadBarId("progressBar");
+    faceImgUrl.init();
+    var driveCardImgUrl = new $WebUpload("driveCardImgUrl");
+    driveCardImgUrl.setUploadBarId("progressBar");
+    driveCardImgUrl.init();
+    var networkCarlssueImg = new $WebUpload("networkCarlssueImg");
+    networkCarlssueImg.setUploadBarId("progressBar");
+    networkCarlssueImg.init();
+});
+
+/**
+ * 添加线路操作
+ */
+YesDriverInfoDlg.addLine = function () {
+    var selectLineName = $("#selectLineId option:selected").text();
+    var selectLineId = $("#selectLineId").val();
+    if ("" == selectLineId){
+        Feng.info("选择关联线路");
+        return;
+    }
+    //获取所有的值
+    var subArr=[];
+    $(".lineClass").each(function () {
+        subArr.push({
+            lineId:$(this).find("input[name*='lineId']").val(),
+            time:$(this).find("input[name*='time']").val(),
+        })
+    });
+    for(var i=0;i<subArr.length;i++){
+        var lineId = subArr[i].lineId;
+        if (selectLineId == lineId) {
+            Feng.info("关联线路已存在,请重新选择");
+            return;
+        }
+    }
+    var str = '<tr class="lineClass">' +
+        '<td style="text-align: center;"><input type="hidden" id="lineId" name="lineId" value="'+selectLineId+'">' +
+        '<input type="hidden" id="time" name="time" value="'+getNowFormatDate()+'">' + getNowFormatDate() + '</td>' +
+        '<td style="text-align: center;">' + selectLineName + '</td>' +
+        '<td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#line").append(str);
+
+}
+
+function deleteSub(e) {
+    $(e).parent().parent().remove();
+}
+
+//获取当前时间,格式YYYY-MM-DD
+function getNowFormatDate() {
+    var date = new Date();
+    var seperator1 = "-";
+    var year = date.getFullYear();
+    var month = date.getMonth() + 1;
+    var strDate = date.getDate();
+    if (month >= 1 && month <= 9) {
+        month = "0" + month;
+    }
+    if (strDate >= 0 && strDate <= 9) {
+        strDate = "0" + strDate;
+    }
+    var currentdate = year + seperator1 + month + seperator1 + strDate;
+    return currentdate;
+}
+
+/**
+ * "跨城出行"点击事件
+ */
+YesDriverInfoDlg.checkBox = function(){
+    var serverBox3 = $('#serverBox3').prop('checked');
+    if (serverBox3){
+        $("#lineDiv").show();
+    } else {
+        $("#lineDiv").hide();
+    }
+}
+
+/**
+ * 选择分公司后执行
+ */
+YesDriverInfoDlg.oneChange = function (e) {
+    var oneId=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tDriver/oneChange", function(data){
+        if(data!=null){
+            var content='<option value="">选择所属加盟商</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#twoId").empty().append(content);
+        }
+    });
+    ajax.set("oneId",oneId);
+    ajax.start();
+}
+
+/**
+ * 操作用户
+ */
+YesDriverInfoDlg.optDriver = function () {
+    var remark = $("#remark").val();
+    if ("" == remark){
+        Feng.info("操作备注不能为空");
+        return;
+    }
+    var ajax = new $ax(Feng.ctxPath + "/tDriver/optDriver", function(data){
+        Feng.success("操作成功!");
+        window.parent.YesDriver.table.refresh();
+        YesDriverInfoDlg.close();
+    },function(data){
+        Feng.error("操作失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.yesDriverInfoData);
+    ajax.set("driverId",$("#tDriverId").val());
+    ajax.set("optType",$("#optType").val());
+    ajax.set("remark",$("#remark").val());
+    ajax.start();
+}
+
+/**
+ * 类型改变执行
+ * @param e
+ */
+YesDriverInfoDlg.companyTypeClick = function (e) {
+    if (1 == e){
+        $("#companyDiv").hide();
+    } else if (2 == e){
+        $("#companyDiv").show();
+    }
+}
+
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_selectCar.js b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_selectCar.js
new file mode 100644
index 0000000..217459b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_selectCar.js
@@ -0,0 +1,155 @@
+/**
+ * 选择车辆
+ */
+var SelectCar = {
+    id: "SelectCarTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SelectCar.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '车牌号', field: 'carLicensePlate', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.carLicensePlate != '' && row.carLicensePlate != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.carLicensePlate + '" onfocus="TUser.tooltip()">' + row.carLicensePlate + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车辆照片', field: 'carPhoto', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                if (row.carPhoto == null || row.carPhoto == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.carPhoto + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '车辆品牌', field: 'brandName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.brandName != '' && row.brandName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.brandName + '" onfocus="TUser.tooltip()">' + row.brandName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车辆类型', field: 'modelName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.modelName != '' && row.modelName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.modelName + '" onfocus="TUser.tooltip()">' + row.modelName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车辆颜色', field: 'carColor', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.carColor != '' && row.carColor != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.carColor + '" onfocus="TUser.tooltip()">' + row.carColor + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '服务模式', field: 'serverStr', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.serverStr != '' && row.serverStr != null) {
+                    var labelStr = "";
+                    var labelStrs = "";
+                    var labelArray = row.serverStr.split(",");
+                    for(var i=0;i<labelArray.length;i++){
+                        labelStr += labelArray[i] +"<br>";
+                        labelStrs += labelArray[i] + "&#10;";
+                    }
+                    labelStr = labelStr.substring(0,labelStr.length-4);
+                    labelStrs = labelStrs.substring(0,labelStrs.length-5);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + labelStrs + '" onfocus="TUser.tooltip()">' + labelStr + '</p>']
+                }
+                return btn;
+            }
+        },
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+SelectCar.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        SelectCar.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 查询司机审核列表列表
+ */
+SelectCar.search = function () {
+    var queryData = {};
+    queryData['carLicensePlate'] = $("#carLicensePlate").val();
+    queryData['brandName'] = $("#brandName").val();
+    queryData['modelName'] = $("#modelName").val();
+    queryData['color'] = $("#color").val();
+    queryData['serverStr'] = $("#serverStr").val();
+    SelectCar.table.refresh({query: queryData});
+};
+SelectCar.resetSearch = function () {
+    $("#carLicensePlate").val("");
+    $("#brandName").val("");
+    $("#modelName").val("");
+    $("#color").val("");
+    $("#serverStr").val("");
+    SelectCar.search();
+};
+
+$(function () {
+    var tDriverId = $("#tDriverId").val();
+    var defaultColunms = SelectCar.initColumn();
+    var table = new BSTable(SelectCar.id, "/tDriver/selectCarList/"+tDriverId, defaultColunms);
+    table.setPaginationType("server");
+    SelectCar.table = table.init();
+});
+
+/**
+ * 关闭选择用户页面
+ */
+SelectCar.close = function () {
+    parent.layer.close(window.parent.YesDriver.layerIndex);
+}
+
+/**
+ * 选择车辆操作
+ */
+SelectCar.selectCarOpt = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tDriver/selectCarOpt", function(data){
+        Feng.success("操作成功!");
+        window.parent.YesDriver.table.refresh();
+        SelectCar.close();
+    },function(data){
+        Feng.error("操作失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("tDriverId",$("#tDriverId").val());
+    ajax.set("carId",selected[0].id);
+    ajax.start();
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tFeedback/tFeedback.js b/management/guns-admin/src/main/webapp/static/modular/system/tFeedback/tFeedback.js
new file mode 100644
index 0000000..ff31f3b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tFeedback/tFeedback.js
@@ -0,0 +1,199 @@
+/**
+ * 反馈管理管理初始化
+ */
+var TFeedback = {
+    id: "TFeedbackTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TFeedback.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '反馈时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '反馈人ID', field: 'userId', visible: false, align: 'center', valign: 'middle'},
+        {title: '反馈人', field: 'driverName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driverName != '' && row.driverName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.driverName + '" onfocus="TUser.tooltip()">' + row.driverName+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '反馈人<br/>手机号', field: 'driverPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driverPhone != '' && row.driverPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.driverPhone + '" onfocus="TUser.tooltip()">' + row.driverPhone+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '反馈内容', field: 'content', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.content != '' && row.content != null) {
+                    var str = row.content;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TFeedback.buttonClick(' +  row.id+','+ 1+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.content + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.remark != '' && row.remark != null) {
+                    var str = row.remark;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TFeedback.buttonClick(' +  row.id+','+ 2+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.remark + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="未处理" onfocus="TUser.tooltip()">未处理</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已处理" onfocus="TUser.tooltip()">已处理</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '处理时间', field: 'cldate', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.cldate != '' && row.cldate != null) {
+                    var time = row.cldate.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.cldate + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '处理人Id', field: 'handleUserId', visible: false, align: 'center', valign: 'middle'},
+        {title: '处理人', field: 'handleUserName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.handleUserName != '' && row.handleUserName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.handleUserName + '" onfocus="TUser.tooltip()">' + row.handleUserName+ '</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 查看更多按钮
+ * @param con
+ */
+TFeedback.buttonClick = function (id,type) {
+    var index = layer.open({
+        type: 2,
+        title: '查看详情',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tFeedback/lookDetail/'+id+"/"+type
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 检查是否选中
+ */
+TFeedback.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TFeedback.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 立即处理
+ */
+TFeedback.immediately = function(){
+    if (this.check()) {
+        if (TFeedback.seItem.state != 1) {
+            swal("处理失败", "【未处理】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即处理',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tFeedback/tFeedback_immediately/' + TFeedback.seItem.id+"/"+2
+        });
+        this.layerIndex = index;
+    }
+}
+
+/**
+ * 删除反馈管理
+ */
+TFeedback.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tFeedback/delete", function (data) {
+            Feng.success("删除成功!");
+            TFeedback.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tFeedbackId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询反馈管理列表
+ */
+TFeedback.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['driverName'] = $("#driverName").val();
+    queryData['driverPhone'] = $("#driverPhone").val();
+    queryData['state'] = $("#state").val();
+    TFeedback.table.refresh({query: queryData});
+};
+TFeedback.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#driverName").val("");
+    $("#driverPhone").val("");
+    $("#state").val("");
+    TFeedback.search();
+};
+$(function () {
+    var defaultColunms = TFeedback.initColumn();
+    var table = new BSTable(TFeedback.id, "/tFeedback/list", defaultColunms);
+    table.setPaginationType("server");
+    TFeedback.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tFeedback/tFeedback_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tFeedback/tFeedback_info.js
new file mode 100644
index 0000000..91fe918
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tFeedback/tFeedback_info.js
@@ -0,0 +1,123 @@
+/**
+ * 初始化反馈管理详情对话框
+ */
+var TFeedbackInfoDlg = {
+    tFeedbackInfoData : {},
+    validateFields: {
+        remark: {
+            validators: {
+                notEmpty: {
+                    message: '备注不能为空'
+                }/*,
+                regexp: {
+                    regexp: /^.{1,500}$/,
+                    message: '备注不能超过500个长度'
+                }*/
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TFeedbackInfoDlg.validate = function () {
+    $('#feedbackInfoForm').data("bootstrapValidator").resetForm();
+    $('#feedbackInfoForm').bootstrapValidator('validate');
+    return $("#feedbackInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TFeedbackInfoDlg.clearData = function() {
+    this.tFeedbackInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TFeedbackInfoDlg.set = function(key, val) {
+    this.tFeedbackInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TFeedbackInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TFeedbackInfoDlg.close = function() {
+    var type = $("#type").val();
+    if (2 == type){
+        parent.layer.close(window.parent.TFeedback.layerIndex);
+    }else if (1 == type){
+        parent.layer.close(window.parent.TUserFeedback.layerIndex);
+    }
+}
+
+/**
+ * 收集数据
+ */
+TFeedbackInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('userId')
+    .set('handleUserId')
+    .set('content')
+    .set('insertTime')
+    .set('imgUrl')
+    .set('flag')
+    .set('state')
+    .set('cldate')
+    .set('remark')
+    .set('type');
+}
+
+/**
+ * 立即处理
+ */
+TFeedbackInfoDlg.immediately = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var remark = $("#remark").val();
+    if (remark.length > 500){
+        Feng.info("备注不能超过500个字");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tFeedback/immediately", function(data){
+        Feng.success("操作成功!");
+        var type = $("#type").val();
+        if (2 == type){
+            window.parent.TFeedback.table.refresh();
+        }else if (1 == type){
+            window.parent.TUserFeedback.table.refresh();
+        }
+        TFeedbackInfoDlg.close();
+    },function(data){
+        Feng.error("操作失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("remark",$("#remark").val());
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("feedbackInfoForm", TFeedbackInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tFeedback/userFeedback.js b/management/guns-admin/src/main/webapp/static/modular/system/tFeedback/userFeedback.js
new file mode 100644
index 0000000..d158a58
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tFeedback/userFeedback.js
@@ -0,0 +1,199 @@
+/**
+ * 反馈管理管理初始化
+ */
+var TUserFeedback = {
+    id: "TUserFeedbackTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TUserFeedback.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '反馈时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '反馈人ID', field: 'userId', visible: false, align: 'center', valign: 'middle'},
+        {title: '反馈人', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '反馈人手机号', field: 'userPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userPhone != '' && row.userPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userPhone + '" onfocus="TUser.tooltip()">' + row.userPhone+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '反馈内容', field: 'content', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.content != '' && row.content != null) {
+                    var str = row.content;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TUserFeedback.buttonClick(' +  row.id+','+ 1+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.content + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.remark != '' && row.remark != null) {
+                    var str = row.remark;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TUserFeedback.buttonClick(' +  row.id+','+ 2+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.remark + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="未处理" onfocus="TUser.tooltip()">未处理</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已处理" onfocus="TUser.tooltip()">已处理</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '处理时间', field: 'cldate', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.cldate != '' && row.cldate != null) {
+                    var time = row.cldate.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.cldate + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '处理人Id', field: 'handleUserId', visible: false, align: 'center', valign: 'middle'},
+        {title: '处理人', field: 'handleUserName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.handleUserName != '' && row.handleUserName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.handleUserName + '" onfocus="TUser.tooltip()">' + row.handleUserName+ '</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 查看更多按钮
+ * @param con
+ */
+TUserFeedback.buttonClick = function (id,type) {
+    var index = layer.open({
+        type: 2,
+        title: '查看详情',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tFeedback/lookDetail/'+id+"/"+type
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 检查是否选中
+ */
+TUserFeedback.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TUserFeedback.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 立即处理
+ */
+TUserFeedback.immediately = function(){
+    if (this.check()) {
+        if (TUserFeedback.seItem.state != 1) {
+            swal("处理失败", "【未处理】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即处理',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tFeedback/tFeedback_immediately/' + TUserFeedback.seItem.id+"/"+1
+        });
+        this.layerIndex = index;
+    }
+}
+
+/**
+ * 删除反馈管理
+ */
+TUserFeedback.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tFeedback/delete", function (data) {
+            Feng.success("删除成功!");
+            TUserFeedback.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tFeedbackId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询反馈管理列表
+ */
+TUserFeedback.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['userPhone'] = $("#userPhone").val();
+    queryData['state'] = $("#state").val();
+    TUserFeedback.table.refresh({query: queryData});
+};
+TUserFeedback.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#userName").val("");
+    $("#userPhone").val("");
+    $("#state").val("");
+    TUserFeedback.search();
+};
+$(function () {
+    var defaultColunms = TUserFeedback.initColumn();
+    var table = new BSTable(TUserFeedback.id, "/tFeedback/listUser", defaultColunms);
+    table.setPaginationType("server");
+    TUserFeedback.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tIntegralGoods/tIntegralGoods.js b/management/guns-admin/src/main/webapp/static/modular/system/tIntegralGoods/tIntegralGoods.js
new file mode 100644
index 0000000..ae18a92
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tIntegralGoods/tIntegralGoods.js
@@ -0,0 +1,202 @@
+/**
+ * 商品管理管理初始化
+ */
+var TIntegralGoods = {
+    id: "TIntegralGoodsTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TIntegralGoods.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '商品名称', field: 'name', visible: true, align: 'center', valign: 'middle',width:'30%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '商品图片', field: 'imgUrl', visible: true, align: 'center', valign: 'middle',width:'20%',
+            formatter: function (value, row) {
+                if (row.imgUrl == null || row.imgUrl == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 60px;height:60px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 100px;height:60px;" src="' + row.imgUrl + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '兑换积分', field: 'integral', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.integral != '' && row.integral != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.integral + '" onfocus="TUser.tooltip()">' + row.integral + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',width:'12%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="已下架" onfocus="TUser.tooltip()">已下架</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TIntegralGoods.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TIntegralGoods.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加商品管理
+ */
+TIntegralGoods.openAddTIntegralGoods = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加商品',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tIntegralGoods/tIntegralGoods_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看商品管理详情
+ */
+TIntegralGoods.openTIntegralGoodsDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑商品',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tIntegralGoods/tIntegralGoods_update/' + TIntegralGoods.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 操作商品管理
+ * type 1=上架 2=下架 3=删除
+ */
+TIntegralGoods.opt = function (type) {
+    if (this.check()) {
+        var name = TIntegralGoods.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该积分商品";
+        } else {
+            name = "【" + name + "】";
+        }
+        var str = "";
+        var text = "请谨慎操作!";
+        var title = "请谨慎操作!";
+        if (1 == type){
+            str = "上架";
+            title = "您是否确认上架"+name+"?";
+        }else if (2 == type){
+            str = "下架";
+            title = "您是否确认下架"+name+"?";
+        }else if (3 == type){
+            str = "删除";
+            title = "您是否确认删除"+name+"?";
+            text = "请谨慎操作,删除后数据无法恢复!";
+        }
+        if(1 == type){
+            if (TIntegralGoods.seItem.state != 2) {
+                swal("上架失败", "【已下架】状态下才能执行此操作", "warning");
+                return;
+            }
+        }
+        if (2 == type){
+            if (TIntegralGoods.seItem.state != 1){
+                swal("下架失败", "【正常】状态下才能执行此操作", "warning");
+                return;
+            }
+        }
+
+        swal({
+            title: title,
+            text: text,
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: str,
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tIntegralGoods/opt", function (data) {
+                swal(str+"成功", "您已经"+str+"了" + name + "。", "success");
+                TIntegralGoods.table.refresh();
+            }, function (data) {
+                swal(str+"失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tIntegralGoodsId",TIntegralGoods.seItem.id);
+            ajax.set("optType", type);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询商品管理列表
+ */
+TIntegralGoods.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['state'] = $("#state").val();
+    TIntegralGoods.table.refresh({query: queryData});
+};
+
+TIntegralGoods.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#name").val("");
+    $("#state").val("");
+    TIntegralGoods.search();
+};
+
+$(function () {
+    var defaultColunms = TIntegralGoods.initColumn();
+    var table = new BSTable(TIntegralGoods.id, "/tIntegralGoods/list", defaultColunms);
+    table.setPaginationType("server");
+    TIntegralGoods.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tIntegralGoods/tIntegralGoods_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tIntegralGoods/tIntegralGoods_info.js
new file mode 100644
index 0000000..ddcff51
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tIntegralGoods/tIntegralGoods_info.js
@@ -0,0 +1,151 @@
+/**
+ * 初始化商品管理详情对话框
+ */
+var TIntegralGoodsInfoDlg = {
+    tIntegralGoodsInfoData : {},
+    editor: null,
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '商品名称不能为空'
+                }
+            }
+        },
+        integral: {
+            validators: {
+                notEmpty: {
+                    message: '兑换积分不能为空'
+                },
+                regexp: {
+                    regexp: /^[0-9]\d*$/,
+                    message: '兑换积分格式不正确'
+                }
+            }
+        }
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TIntegralGoodsInfoDlg.validate = function () {
+    $('#integralGoodsInfoForm').data("bootstrapValidator").resetForm();
+    $('#integralGoodsInfoForm').bootstrapValidator('validate');
+    return $("#integralGoodsInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TIntegralGoodsInfoDlg.clearData = function() {
+    this.tIntegralGoodsInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TIntegralGoodsInfoDlg.set = function(key, val) {
+    this.tIntegralGoodsInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TIntegralGoodsInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TIntegralGoodsInfoDlg.close = function() {
+    parent.layer.close(window.parent.TIntegralGoods.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TIntegralGoodsInfoDlg.collectData = function() {
+    this.tIntegralGoodsInfoData['instructions'] = TIntegralGoodsInfoDlg.editor.getContent();
+    this
+    .set('id')
+    .set('insertTime')
+    .set('name')
+    .set('imgUrl')
+    .set('integral')
+    .set('state')
+    .set('insertUserId')
+    .set('insertUserRole');
+}
+
+/**
+ * 提交添加
+ */
+TIntegralGoodsInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var imgUrl = $("#imgUrl").val();
+    if ("" == imgUrl){
+        Feng.info("请上传商品图片");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tIntegralGoods/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TIntegralGoods.table.refresh();
+        TIntegralGoodsInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tIntegralGoodsInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TIntegralGoodsInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var imgUrl = $("#imgUrl").val();
+    if ("" == imgUrl){
+        Feng.info("请上传商品图片");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tIntegralGoods/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TIntegralGoods.table.refresh();
+        TIntegralGoodsInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tIntegralGoodsInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("integralGoodsInfoForm", TIntegralGoodsInfoDlg.validateFields);
+    // 初始化图片上传
+    var imgUrl = new $WebUpload("imgUrl");
+    imgUrl.setUploadBarId("progressBar");
+    imgUrl.init();
+    // 初始化编辑器
+    TIntegralGoodsInfoDlg.editor = UE.getEditor('editor');
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tIntegralOrder/tIntegralOrder.js b/management/guns-admin/src/main/webapp/static/modular/system/tIntegralOrder/tIntegralOrder.js
new file mode 100644
index 0000000..da78f17
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tIntegralOrder/tIntegralOrder.js
@@ -0,0 +1,240 @@
+/**
+ * 积分兑换订单管理初始化
+ */
+var TIntegralOrder = {
+    id: "TIntegralOrderTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TIntegralOrder.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '兑换时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '兑换用户ID', field: 'userId', visible: false, align: 'center', valign: 'middle'},
+        {title: '兑换用户', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '兑换商品ID', field: 'goodsId', visible: false, align: 'center', valign: 'middle'},
+        {title: '兑换商品', field: 'goodsName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.goodsName != '' && row.goodsName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.goodsName + '" onfocus="TUser.tooltip()">' + row.goodsName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '兑换数量', field: 'num', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.num != '' && row.num != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.num + '" onfocus="TUser.tooltip()">' + row.num + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '收货人', field: 'consigneeName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.consigneeName != '' && row.consigneeName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.consigneeName + '" onfocus="TUser.tooltip()">' + row.consigneeName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '联系电话', field: 'consigneePhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.consigneePhone != '' && row.consigneePhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.consigneePhone + '" onfocus="TUser.tooltip()">' + row.consigneePhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '收货地址', field: 'consigneeAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.consigneeAddress != '' && row.consigneeAddress != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.consigneeAddress + '" onfocus="TUser.tooltip()">' + row.consigneeAddress + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '处理备注', field: 'remark', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.remark != '' && row.remark != null) {
+                    var str = row.remark;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TIntegralOrder.buttonClick(' +  row.id + ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.remark + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if(row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="待处理" onfocus="TUser.tooltip()">待处理</p>']
+                    }else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已处理" onfocus="TUser.tooltip()">已处理</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 查看更多按钮
+ * @param con
+ */
+TIntegralOrder.buttonClick = function (id) {
+    var index = layer.open({
+        type: 2,
+        title: '查看详情',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tIntegralOrder/lookDetail/'+id
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 检查是否选中
+ */
+TIntegralOrder.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TIntegralOrder.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加积分兑换订单
+ */
+TIntegralOrder.openAddTIntegralOrder = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加积分兑换订单',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tIntegralOrder/tIntegralOrder_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 立即处理
+ */
+TIntegralOrder.immediately = function () {
+    if (this.check()) {
+        if (TIntegralOrder.seItem.state != 1){
+            swal("处理失败", "【待处理】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即处理',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tIntegralOrder/tIntegralOrder_immediately/' + TIntegralOrder.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除积分兑换订单
+ */
+TIntegralOrder.delete = function () {
+    if (this.check()) {
+        var state = TIntegralOrder.seItem.state;
+        if (state != 2){
+            swal("删除失败", "【已处理】状态下才能执行此操作!", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除当前兑换订单记录?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tIntegralOrder/delete", function (data) {
+                swal("删除成功", "您已经删除了兑换订单数据。", "success");
+                TIntegralOrder.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tIntegralOrderId",TIntegralOrder.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询积分兑换订单列表
+ */
+TIntegralOrder.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['goodsName'] = $("#goodsName").val();
+    queryData['consigneeName'] = $("#consigneeName").val();
+    queryData['consigneePhone'] = $("#consigneePhone").val();
+    queryData['state'] = $("#state").val();
+    TIntegralOrder.table.refresh({query: queryData});
+};
+
+TIntegralOrder.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#userName").val("");
+    $("#goodsName").val("");
+    $("#consigneeName").val("");
+    $("#consigneePhone").val("");
+    $("#state").val("");
+    TIntegralOrder.search();
+};
+
+
+$(function () {
+    var defaultColunms = TIntegralOrder.initColumn();
+    var table = new BSTable(TIntegralOrder.id, "/tIntegralOrder/list", defaultColunms);
+    table.setPaginationType("server");
+    TIntegralOrder.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tIntegralOrder/tIntegralOrder_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tIntegralOrder/tIntegralOrder_info.js
new file mode 100644
index 0000000..904dafd
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tIntegralOrder/tIntegralOrder_info.js
@@ -0,0 +1,106 @@
+/**
+ * 初始化积分兑换订单详情对话框
+ */
+var TIntegralOrderInfoDlg = {
+    tIntegralOrderInfoData : {},
+    validateFields: {
+        remark: {
+            validators: {
+                notEmpty: {
+                    message: '处理备注不能为空'
+                }/*,
+                regexp: {
+                    regexp: /^.{1,500}$/,
+                    message: '回复内容不能超过500个长度'
+                }*/
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TIntegralOrderInfoDlg.validate = function () {
+    $('#integralOrderInfoForm').data("bootstrapValidator").resetForm();
+    $('#integralOrderInfoForm').bootstrapValidator('validate');
+    return $("#integralOrderInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TIntegralOrderInfoDlg.clearData = function() {
+    this.tIntegralOrderInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TIntegralOrderInfoDlg.set = function(key, val) {
+    this.tIntegralOrderInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TIntegralOrderInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TIntegralOrderInfoDlg.close = function() {
+    parent.layer.close(window.parent.TIntegralOrder.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TIntegralOrderInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('insertTime')
+    .set('userId')
+    .set('goodsId')
+    .set('num')
+    .set('consigneeName')
+    .set('consigneePhone')
+    .set('consigneeAddress')
+    .set('remark')
+    .set('state');
+}
+
+/**
+ * 提交修改
+ */
+TIntegralOrderInfoDlg.immediately = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tIntegralOrder/immediately", function(data){
+        Feng.success("处理成功!");
+        window.parent.TIntegralOrder.table.refresh();
+        TIntegralOrderInfoDlg.close();
+    },function(data){
+        Feng.error("处理失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tIntegralOrderInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("integralOrderInfoForm", TIntegralOrderInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tInvoice/tInvoice.js b/management/guns-admin/src/main/webapp/static/modular/system/tInvoice/tInvoice.js
new file mode 100644
index 0000000..269c576
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tInvoice/tInvoice.js
@@ -0,0 +1,244 @@
+/**
+ * 开发票列表管理初始化
+ */
+var TInvoice = {
+    id: "TInvoiceTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TInvoice.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '申请时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '抬头类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.type != '' && row.type != null) {
+                    if (row.type == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="个人发票" onfocus="TUser.tooltip()">个人发票</p>']
+                    } else if (row.type == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="单位发票" onfocus="TUser.tooltip()">单位发票</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '发票抬头', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '发票内容', field: 'content', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.content != '' && row.content != null) {
+                    var str = row.content;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TInvoice.buttonClick(' +  row.id+','+ 1+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.content + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '发票金额', field: 'money', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.money != '' && row.money != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.money + '" onfocus="TUser.tooltip()">' + row.money+ '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '更多信息', field: 'value', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.value != '' && row.value != null) {
+                    var labelStr = "";
+                    var labelStrs = "";
+                    var labelArray = row.value.split(",");
+                    for(var i=0;i<labelArray.length;i++){
+                        labelStr += labelArray[i] +"<br>";
+                        labelStrs += labelArray[i] + "&#10;";
+                    }
+                    labelStr = labelStr.substring(0,labelStr.length-4);
+                    labelStrs = labelStrs.substring(0,labelStrs.length-5);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + labelStrs + '" onfocus="TUser.tooltip()">' + labelStr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '邮箱', field: 'email', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.email != '' && row.email != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.email + '" onfocus="TUser.tooltip()">' + row.email+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待开票" onfocus="TUser.tooltip()">待开票</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="开票成功" onfocus="TUser.tooltip()">开票成功</p>']
+                    } else if (row.state == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="开票失败" onfocus="TUser.tooltip()">开票失败</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 查看更多按钮
+ * @param con
+ */
+TInvoice.buttonClick = function (id,type) {
+    var index = layer.open({
+        type: 2,
+        title: '查看详情',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tInvoice/lookDetail/'+id+"/"+type
+    });
+    this.layerIndex = index;
+}
+
+
+/**
+ * 检查是否选中
+ */
+TInvoice.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TInvoice.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 重新开票
+ */
+TInvoice.again = function(){
+    if (this.check()) {
+        var nickname = TInvoice.seItem.name;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该发票";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (TInvoice.seItem.state != 3) {
+            swal("开票失败", "【开票失败】状态下才能执行此操作", "warning");
+            return;
+        }
+        var ajax = new $ax(Feng.ctxPath + "/tInvoice/again", function (data) {
+            if ("error" == data){
+                swal("开票失败", data.responseJSON.message + "!", "warning");
+                TInvoice.table.refresh();
+            } else {
+                swal("开票成功", "您已经成功开票了" + nickname + "。", "success");
+                TInvoice.table.refresh();
+            }
+        }, function (data) {
+            swal("开票失败", data.responseJSON.message + "!", "warning");
+        });
+        ajax.set("tInvoiceId",TInvoice.seItem.id);
+        ajax.start();
+    }
+}
+
+/**
+ * 删除开发票列表
+ */
+TInvoice.delete = function () {
+    if (this.check()) {
+        var nickname = TInvoice.seItem.name;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该发票";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (TInvoice.seItem.state != 3) {
+            swal("删除失败", "【开票失败】状态下才能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除" + nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tInvoice/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "。", "success");
+                TInvoice.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tInvoiceId",TInvoice.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询开发票列表列表
+ */
+TInvoice.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['email'] = $("#email").val();
+    queryData['name'] = $("#name").val();
+    queryData['type'] = $("#type").val();
+    queryData['state'] = $("#state").val();
+    TInvoice.table.refresh({query: queryData});
+};
+
+TInvoice.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#email").val("");
+    $("#name").val("");
+    $("#type").val("");
+    $("#state").val("");
+    TInvoice.search();
+};
+
+$(function () {
+    var defaultColunms = TInvoice.initColumn();
+    var table = new BSTable(TInvoice.id, "/tInvoice/list", defaultColunms);
+    table.setPaginationType("server");
+    TInvoice.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tInvoice/tInvoice_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tInvoice/tInvoice_info.js
new file mode 100644
index 0000000..968efe7
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tInvoice/tInvoice_info.js
@@ -0,0 +1,106 @@
+/**
+ * 初始化开发票列表详情对话框
+ */
+var TInvoiceInfoDlg = {
+    tInvoiceInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TInvoiceInfoDlg.clearData = function() {
+    this.tInvoiceInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TInvoiceInfoDlg.set = function(key, val) {
+    this.tInvoiceInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TInvoiceInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TInvoiceInfoDlg.close = function() {
+    parent.layer.close(window.parent.TInvoice.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TInvoiceInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('money')
+    .set('orderNum')
+    .set('type')
+    .set('name')
+    .set('code')
+    .set('content')
+    .set('remark')
+    .set('address')
+    .set('bank')
+    .set('email')
+    .set('userId')
+    .set('state')
+    .set('insertTime');
+}
+
+/**
+ * 提交添加
+ */
+TInvoiceInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tInvoice/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TInvoice.table.refresh();
+        TInvoiceInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tInvoiceInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TInvoiceInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tInvoice/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TInvoice.table.refresh();
+        TInvoiceInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tInvoiceInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tLine/tLine.js b/management/guns-admin/src/main/webapp/static/modular/system/tLine/tLine.js
new file mode 100644
index 0000000..cf0d164
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tLine/tLine.js
@@ -0,0 +1,244 @@
+/**
+ * 跨城站点管理管理初始化
+ */
+var TLine = {
+    id: "TLineTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TLine.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '线路名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '关联车型', field: 'modelStr', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.modelStr != '' && row.modelStr != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.modelStr + '" onfocus="TUser.tooltip()">' + row.modelStr+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '班次数', field: 'shiftNum', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.shiftNum != '' && row.shiftNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.shiftNum + '" onfocus="TUser.tooltip()">' + row.shiftNum+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '关联企业数', field: 'companyNum', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyNum != '' && row.companyNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyNum + '" onfocus="TUser.tooltip()">' + row.companyNum+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '申请班次间隔时间', field: 'shiftInterval', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.shiftInterval != '' && row.shiftInterval != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.shiftInterval + '分钟" onfocus="TUser.tooltip()">' + row.shiftInterval+ '分钟</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="冻结" onfocus="TUser.tooltip()">冻结</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TLine.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TLine.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 添加跨城线路
+ */
+TLine.openAddTLine = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加跨城线路',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tLine/tLine_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 编辑跨城线路
+ */
+TLine.openTLineDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑跨城线路',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tLine/tLine_update/' + TLine.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+/**
+ * 分配企业
+ */
+TLine.addCompany = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '分配企业',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tLine/tLine_addCompany/' + TLine.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除跨城站点管理
+ */
+TLine.opt = function (type) {
+    if (this.check()) {
+        var name = TLine.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该线路";
+        } else {
+            name = "【" + name + "】";
+        }
+        var str = "";
+        var text = "请谨慎操作!";
+        var title = "请谨慎操作!";
+        if (1 == type){
+            str = "删除";
+            title = "您是否确认删除"+name+"?";
+            text = "请谨慎操作,删除后数据无法恢复!";
+        } else if (2 == type){
+            str = "冻结";
+            title = "您是否确认冻结"+name+"?";
+        } else if (3 == type){
+            str = "解冻";
+            title = "您是否确认解冻"+name+"?";
+        }
+        if (1 == type){
+            if (TLine.seItem.companyNum != "" && TLine.seItem.companyNum != null && TLine.seItem.companyNum > 0) {
+                swal("删除失败", "该线路还有关联企业!", "warning");
+                return;
+            }
+        }
+        if(2 == type){
+            if (TLine.seItem.state != 1) {
+                swal("冻结失败", "【正常】状态下才能执行此操作!", "warning");
+                return;
+            }
+        }
+        if (3 == type){
+            if (TLine.seItem.state != 2){
+                swal("解冻失败", "【冻结】状态下才能执行此操作!", "warning");
+                return;
+            }
+        }
+
+        swal({
+            title: title,
+            text: text,
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: str,
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tLine/opt", function (data) {
+                swal(str+"成功", "您已经"+str+"了" + name + "。", "success");
+                TLine.table.refresh();
+            }, function (data) {
+                swal(str+"失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tLineId",TLine.seItem.id);
+            ajax.set("optType", type);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询跨城站点管理列表
+ */
+TLine.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['insertUser'] = $("#insertUser").val();
+    queryData['modelStr'] = $("#modelStr").val();
+    queryData['state'] = $("#state").val();
+    TLine.table.refresh({query: queryData});
+};
+
+TLine.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#name").val("");
+    $("#insertUser").val("");
+    $("#modelStr").val("");
+    $("#state").val("");
+    TLine.search();
+};
+
+$(function () {
+    var defaultColunms = TLine.initColumn();
+    var table = new BSTable(TLine.id, "/tLine/list", defaultColunms);
+    table.setPaginationType("server");
+    TLine.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tLine/tLine_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tLine/tLine_info.js
new file mode 100644
index 0000000..8a9b5ce
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tLine/tLine_info.js
@@ -0,0 +1,441 @@
+/**
+ * 初始化跨城站点管理详情对话框
+ */
+var TLineInfoDlg = {
+    tLineInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '线路名称不能为空'
+                }
+            }
+        },
+        startSiteId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择起点'
+                }
+            }
+        },
+        endSiteId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择终点'
+                }
+            }
+        },
+        shiftInterval: {
+            validators: {
+                notEmpty: {
+                    message: '司机申请限制分钟数不能为空'
+                },
+                regexp: {
+                    regexp: /^[0-9]{0,3}$/,
+                    message: '司机申请限制分钟数格式不正确'
+                }
+            }
+        },
+        rakeRate: {
+            validators: {
+                notEmpty: {
+                    message: '抽成比例不能为空'
+                },
+                regexp: {
+                    regexp: /^([0-9]{1,2}$)|(^[0-9]{1,2}\.[0-9]{1,2}$)|100$/,
+                    message: '抽成比例格式不正确'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TLineInfoDlg.validate = function () {
+    $('#lineInfoForm').data("bootstrapValidator").resetForm();
+    $('#lineInfoForm').bootstrapValidator('validate');
+    return $("#lineInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TLineInfoDlg.clearData = function() {
+    this.tLineInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TLineInfoDlg.set = function(key, val) {
+    this.tLineInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TLineInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TLineInfoDlg.close = function() {
+    parent.layer.close(window.parent.TLine.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TLineInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('name')
+    .set('shiftInterval')
+    .set('rakeRate')
+    .set('state')
+    .set('insertTime');
+}
+
+/**
+ * 提交添加
+ */
+TLineInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var startSiteId = $("#startSiteId").val();
+    var endSiteId = $("#endSiteId").val();
+
+    var subArr=[];
+    $(".typeValueClass").each(function () {
+        subArr.push({
+            serverModelId:$(this).find("input[name*='serverModelIdValue']").val(),
+            type:$(this).find("input[name*='typeValue']").val(),
+            time:$(this).find("input[name*='timeValue']").val(),
+            content:$(this).find("input[name*='contentValue']").val(),
+            contentStr:$(this).find("input[name*='contentStrValue']").val(),
+        })
+    });
+    if(subArr.length <= 0){
+        Feng.error("请至少设置一条价格设置");
+        return;
+    }
+    var shuArr=[];
+    $(".shiftValueClass").each(function () {
+        shuArr.push({
+            shiftTime:$(this).find("input[name*='shiftTimeValue']").val(),
+            carNum:$(this).find("input[name*='carNumValue']").val(),
+            time2:$(this).find("input[name*='time2Value']").val(),
+        })
+    })
+    if(shuArr.length <= 0){
+        Feng.error("请至少设置一条班次设置");
+        return;
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tLine/add", function(data){
+        if(data.status == 200){
+            Feng.success("添加成功!");
+            window.parent.TLine.table.refresh();
+            TLineInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tLineInfoData);
+    ajax.set("startSiteId",startSiteId);
+    ajax.set("endSiteId",endSiteId);
+    ajax.set("subArr",JSON.stringify(subArr));
+    ajax.set("shuArr",JSON.stringify(shuArr));
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TLineInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+
+    var startSiteId = $("#startSiteId").val();
+    var endSiteId = $("#endSiteId").val();
+
+    var subArr=[];
+    $(".typeValueClass").each(function () {
+        subArr.push({
+            serverModelId:$(this).find("input[name*='serverModelIdValue']").val(),
+            type:$(this).find("input[name*='typeValue']").val(),
+            time:$(this).find("input[name*='timeValue']").val(),
+            content:$(this).find("input[name*='contentValue']").val(),
+            contentStr:$(this).find("input[name*='contentStrValue']").val(),
+        })
+    });
+    if(subArr.length <= 0){
+        Feng.error("请至少设置一条价格设置");
+        return;
+    }
+    var shuArr=[];
+    $(".shiftValueClass").each(function () {
+        shuArr.push({
+            shiftTime:$(this).find("input[name*='shiftTimeValue']").val(),
+            carNum:$(this).find("input[name*='carNumValue']").val(),
+            time2:$(this).find("input[name*='time2Value']").val(),
+        })
+    })
+    if(shuArr.length <= 0){
+        Feng.error("请至少设置一条班次设置");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tLine/update", function(data){
+        if(data.status == 200){
+            Feng.success("修改成功!");
+            window.parent.TLine.table.refresh();
+            TLineInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tLineInfoData);
+    ajax.set("startSiteId",startSiteId);
+    ajax.set("endSiteId",endSiteId);
+    ajax.set("subArr",JSON.stringify(subArr));
+    ajax.set("shuArr",JSON.stringify(shuArr));
+    ajax.start();
+}
+
+//添加公司提交
+TLineInfoDlg.addCompanySubmit = function(){
+    var comArr=[];
+    $(".companyValueClass").each(function () {
+        comArr.push({
+            companyId:$(this).find("input[name*='companyIdValue']").val(),
+        })
+    })
+    /*if(comArr.length <= 0){
+        Feng.error("请至少添加一个企业");
+        return;
+    }*/
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tLine/addCompany", function(data){
+        Feng.success("操作成功!");
+        window.parent.TLine.table.refresh();
+        TLineInfoDlg.close();
+    },function(data){
+        Feng.error("操作失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("lineId",$("#lineId").val());
+    ajax.set("comArr",JSON.stringify(comArr));
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("lineInfoForm", TLineInfoDlg.validateFields);
+});
+
+/**
+ * 计价方式改变时
+ * @param e
+ */
+TLineInfoDlg.typeClick = function (e) {
+    if (1 == e){
+        $("#fixedDiv").show();
+        $("#floatDiv").hide();
+    } else if (2 == e){
+        $("#floatDiv").show();
+        $("#fixedDiv").hide();
+    }
+}
+
+/**
+ * 添加价格
+ */
+TLineInfoDlg.addPrice = function () {
+    var serverModelId = $("#serverModelId").val();
+    var serverModelText = $("#serverModelId option:selected").text();
+    if ("" == serverModelId){
+        Feng.info("请选择车型");
+        return;
+    }
+    var type = $("input[name='type']:checked").val();
+    var content = '';
+    var contentStr = "";
+    if (1 == type){
+        var num1 = $("#num1").val();
+        var num2 = $("#num2").val();
+        var num3 = $("#num3").val();
+        var num4 = $("#num4").val();
+        if(!regDouble.test(num1) || !regDouble.test(num2) || !regXiShu.test(num3) || !regXiShu.test(num4)){
+            Feng.info("固定计价格式不正确!");
+            return;
+        }
+        content = '{"num1":"'+num1+'","num2":"'+num2+'","num3":"'+num3+'","num4":"'+num4+'"}';
+        contentStr = "单人价格:"+num1+";包车价格:"+num2+";五座系数:"+num3+";七座系数:"+num4+";";
+    } else if (2 == type){
+        var num11 = $("#num11").val();
+        var num12 = $("#num12").val();
+        var num13 = $("#num13").val();
+        var num14 = $("#num14").val();
+        var num15 = $("#num15").val();
+        var num16 = $("#num16").val();
+        var num17 = $("#num17").val();
+        if(!regDouble.test(num11) || !regDouble.test(num12) || !regDouble.test(num13) || !regXiShu.test(num14) || !regXiShu.test(num15) || !regXiShu.test(num16) || !regXiShu.test(num17)){
+            Feng.info("浮动计价格式不正确!");
+            return;
+        }
+        content = '{"num1":"'+num11+'","num2":"'+num12+'","num3":"'+num13+'","num4":"'+num14+'","num5":"'+num15+'","num6":"'+num16+'","num7":"'+num17+'"}';
+        contentStr = "参考费用:"+num11+";参考里程:"+num12+";基础单价:"+num13+";优惠系数:"+num14+";包车系数:"+num15+";五座系数:"+num16+";七座系数:"+num17+";";
+    }
+
+    var subArr=[];
+    $(".typeValueClass").each(function () {
+        subArr.push({
+            serverModelId:$(this).find("input[name*='serverModelIdValue']").val(),
+            type:$(this).find("input[name*='typeValue']").val(),
+            time:$(this).find("input[name*='timeValue']").val(),
+            content:$(this).find("input[name*='contentValue']").val(),
+            contentStr:$(this).find("input[name*='contentStrValue']").val(),
+        })
+    });
+    //判断车型是否存在
+    for(var i=0;i<subArr.length;i++){
+        var serverModelIdValue = subArr[i].serverModelId;
+        if (serverModelIdValue == serverModelId) {
+            Feng.info("车型已存在,请重新选择");
+            return;
+        }
+    }
+    //封装数据
+    var str = '<tr class="typeValueClass">' +
+        '<td style="text-align: center;"><input type="hidden" id="timeValue" name="timeValue" value="'+getNowFormatDate()+'">' + getNowFormatDate() + '</td>' +
+        '<td style="text-align: center;"><input type="hidden" id="serverModelIdValue" name="serverModelIdValue" value="'+serverModelId+'">'+serverModelText+'</td>' +
+        '<td style="text-align: center;"><input type="hidden" id="typeValue" name="typeValue" value="'+type+'">' +
+        '   <input type="hidden" id="contentValue" name="contentValue" value='+content+'>' +
+        '   <input type="hidden" id="contentStrValue" name="contentStrValue" value="'+contentStr+'">'+contentStr+'</td>' +
+        '<td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#priceValue").append(str);
+    //清除数据
+    $("#serverModelId").val("");
+    if (1 == type){
+        $("#num1").val("");
+        $("#num2").val("");
+        $("#num3").val("");
+        $("#num4").val("");
+    } else if (2 == type){
+        $("#num11").val("");
+        $("#num12").val("");
+        $("#num13").val("");
+        $("#num14").val("");
+        $("#num15").val("");
+        $("#num16").val("");
+        $("#num17").val("");
+    }
+}
+
+/**
+ * 添加班次
+ */
+TLineInfoDlg.addShift = function () {
+    var shiftTime = $("#shiftTime").val();
+    if ("" == shiftTime){
+        Feng.info("请选择班次时间区间");
+        return;
+    }
+    var carNum = $("#carNum").val();
+    if ("" == carNum){
+        Feng.info("请填写车次数");
+        return;
+    }else if (!regInt.test(carNum)){
+        Feng.info("车次数格式不正确");
+        return;
+    }
+
+    var shuArr=[];
+    $(".shiftValueClass").each(function () {
+        shuArr.push({
+            shiftTime:$(this).find("input[name*='shiftTimeValue']").val(),
+            carNum:$(this).find("input[name*='carNumValue']").val(),
+            time2:$(this).find("input[name*='time2Value']").val(),
+        })
+    })
+
+    //判断时间是否存在
+    for(var i=0;i<shuArr.length;i++){
+        var shiftTimeValue = shuArr[i].shiftTime;
+        if (shiftTimeValue == shiftTime) {
+            Feng.info("班次时间已存在,请重新选择");
+            return;
+        }
+    }
+    //封装数据
+    var str = '<tr class="shiftValueClass">' +
+        '<td style="text-align: center;"><input type="hidden" id="time2Value" name="time2Value" value="'+getNowFormatDate()+'">' + getNowFormatDate() + '</td>' +
+        '<td style="text-align: center;"><input type="hidden" id="shiftTimeValue" name="shiftTimeValue" value="'+shiftTime+'">'+shiftTime+'</td>' +
+        '<td style="text-align: center;"><input type="hidden" id="carNumValue" name="carNumValue" value="'+carNum+'">'+carNum+'</td>' +
+        '<td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#shiftValue").append(str);
+    //清除数据
+    $("#shiftTime").val("");
+    $("#carNum").val("");
+}
+
+/**
+ * 添加公司
+ */
+TLineInfoDlg.addCompany = function () {
+    var companyId = $("#companyId").val();
+    var companyText = $("#companyId option:selected").text();
+    if ("" == companyId){
+        Feng.info("请选择企业");
+        return;
+    }
+    var comArr=[];
+    $(".companyValueClass").each(function () {
+        comArr.push({
+            companyId:$(this).find("input[name*='companyIdValue']").val(),
+        })
+    })
+    //判断公司是否存在
+    for(var i=0;i<comArr.length;i++){
+        var companyIdValue = comArr[i].companyId;
+        if (companyIdValue == companyId) {
+            Feng.info("企业已存在,请重新选择");
+            return;
+        }
+    }
+    //封装数据
+    var str = '<tr class="companyValueClass">' +
+        '<td style="text-align: center;"><input type="hidden" id="companyIdValue" name="companyIdValue" value="'+companyId+'">'+companyText+'</td>' +
+        '<td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#companyValue").append(str);
+    //清除数据
+    $("#companyId").val("");
+
+}
+
+function deleteSub(e) {
+    $(e).parent().parent().remove();
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tNotices/system.js b/management/guns-admin/src/main/webapp/static/modular/system/tNotices/system.js
new file mode 100644
index 0000000..6481ff4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tNotices/system.js
@@ -0,0 +1,200 @@
+/**
+ * 系统公告设置管理初始化
+ */
+var System = {
+    id: "SystemTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+System.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '序号', field: 'id', visible: true, align: 'center', valign: 'middle',width:'5%'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '封面', field: 'imgUrl', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                if (row.imgUrl == null || row.imgUrl == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.imgUrl + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '公告标题', field: 'title', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.title != '' && row.title != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.title + '" onfocus="TUser.tooltip()">' + row.title + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '是否发布', field: 'isShow', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.isShow != '' && row.isShow != null) {
+                    if (row.isShow == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="是" onfocus="TUser.tooltip()">是</p>']
+                    } else if (row.isShow == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="否" onfocus="TUser.tooltip()">否</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+System.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        System.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 添加系统公告
+ */
+System.addSystem = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加系统公告',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tNotices/system_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 编辑系统公告
+ */
+System.updateSystem = function () {
+    if (this.check()) {
+        if (System.seItem.isShow == 1) {
+            swal("编辑失败", "【已发布】公告不能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '编辑系统公告',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tNotices/system_update/' + System.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 发布公告
+ */
+System.sendSystem = function(){
+    if (this.check()) {
+        var nickname = System.seItem.title;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该系统公告";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (System.seItem.isShow == 1) {
+            swal("发布失败", "该系统公告已发布过,不可重复发布", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认发布" + nickname + "?",
+            text: "请谨慎操作!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "发布",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tNotices/sendSystem", function (data) {
+                swal("发布成功", "您已经成功发布了" + nickname + "。", "success");
+                System.table.refresh();
+            }, function (data) {
+                swal("发布失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tNoticesId", System.seItem.id);
+            ajax.start();
+        });
+    }
+}
+
+/**
+ * 删除滚动消息设置
+ */
+System.deleteSystem = function () {
+    if (this.check()) {
+        var nickname = System.seItem.title;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该系统公告";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        swal({
+            title: "您是否确认删除" + nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tNotices/delete", function (data) {
+                swal("删除成功", "您已经成功删除了" + nickname + "。", "success");
+                System.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tNoticesId", System.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询滚动消息设置列表
+ */
+System.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['content'] = $("#content").val();
+    System.table.refresh({query: queryData});
+};
+System.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#content").val("");
+    System.search();
+};
+$(function () {
+    var defaultColunms = System.initColumn();
+    var table = new BSTable(System.id, "/tNotices/listSystem", defaultColunms);
+    table.setPaginationType("server");
+    System.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tNotices/system_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tNotices/system_info.js
new file mode 100644
index 0000000..660d093
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tNotices/system_info.js
@@ -0,0 +1,179 @@
+/**
+ * 初始化滚动消息设置详情对话框
+ */
+var SystemInfoDlg = {
+    tSystemInfoData : {},
+    editor: null,
+    validateFields: {
+        title: {
+            validators: {
+                notEmpty: {
+                    message: '公告标题不能为空'
+                }
+            }
+        },
+        isBroadcast: {
+            validators: {
+                notEmpty: {
+                    message: '选择是否播报'
+                }
+            }
+        },
+        isShow: {
+            validators: {
+                notEmpty: {
+                    message: '选择是否发布'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+SystemInfoDlg.validate = function () {
+    $('#systemInfoForm').data("bootstrapValidator").resetForm();
+    $('#systemInfoForm').bootstrapValidator('validate');
+    return $("#systemInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+SystemInfoDlg.clearData = function() {
+    this.tSystemInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+SystemInfoDlg.set = function(key, val) {
+    this.tSystemInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+SystemInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+SystemInfoDlg.close = function() {
+    parent.layer.close(window.parent.System.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+SystemInfoDlg.collectData = function() {
+    this.tSystemInfoData['content'] = SystemInfoDlg.editor.getContent();
+    this
+        .set('id')
+        .set('title')
+        .set('sort')
+        .set('isShow')
+        .set('isBroadcast')
+        .set('type')
+        .set('imgUrl')
+        .set('flag')
+        .set('insertTime')
+        .set('insertUser')
+        .set('updateTime')
+        .set('updateUser')
+        .set('isUser')
+        .set('isDriver');
+}
+
+/**
+ * 提交添加
+ */
+SystemInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var serverBox =[];
+    $('input[name="serverBox"]:checked').each(function(){
+        serverBox.push($(this).val());
+    });
+    if (serverBox.length == 0){
+        Feng.info("请选择发布对象!");
+        return;
+    }
+    var imgUrl = $("#imgUrl").val();
+    if ("" == imgUrl){
+        Feng.info("请上传封面");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tNotices/addSystem", function(data){
+        Feng.success("添加成功!");
+        window.parent.System.table.refresh();
+        SystemInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(SystemInfoDlg.tSystemInfoData);
+    var serverBox1 = $('#serverBox1').prop('checked');
+    if (serverBox1){
+        ajax.set("isUser",2);
+    }else{
+        ajax.set("isUser",1);
+    }
+    var serverBox2 = $('#serverBox2').prop('checked');
+    if (serverBox2){
+        ajax.set("isDriver",2);
+    }else{
+        ajax.set("isDriver",1);
+    }
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+SystemInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var imgUrl = $("#imgUrl").val();
+    if ("" == imgUrl){
+        Feng.info("请上传封面");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tNotices/updateSystem", function(data){
+        Feng.success("修改成功!");
+        window.parent.System.table.refresh();
+        SystemInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(SystemInfoDlg.tSystemInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("systemInfoForm", SystemInfoDlg.validateFields);
+    //初始化编辑器
+    SystemInfoDlg.editor = UE.getEditor('editor');
+    var imgUrl = new $WebUpload("imgUrl");
+    imgUrl.setUploadBarId("progressBar");
+    imgUrl.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tNotices/tNotices.js b/management/guns-admin/src/main/webapp/static/modular/system/tNotices/tNotices.js
new file mode 100644
index 0000000..6baf235
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tNotices/tNotices.js
@@ -0,0 +1,171 @@
+/**
+ * 滚动消息设置管理初始化
+ */
+var TNotices = {
+    id: "TNoticesTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TNotices.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '序号', field: 'id', visible: true, align: 'center', valign: 'middle',width:'5%'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '消息内容', field: 'content', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.content != '' && row.content != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.content + '" onfocus="TUser.tooltip()">' + row.content + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '是否显示', field: 'isShow', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.isShow != '' && row.isShow != null) {
+                    if (row.isShow == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="是" onfocus="TUser.tooltip()">是</p>']
+                    } else if (row.isShow == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="否" onfocus="TUser.tooltip()">否</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '排序', field: 'sort', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.sort != '' && row.sort != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.sort + '" onfocus="TUser.tooltip()">' + row.sort + '</p>']
+                }
+                return btn;
+            }
+        }/*,
+        {title: '标题', field: 'title', visible: true, align: 'center', valign: 'middle'},
+        {title: '内容', field: 'content', visible: true, align: 'center', valign: 'middle'},
+        {title: '排序', field: 'sort', visible: true, align: 'center', valign: 'middle'},
+        {title: '是否显示/发布(1=是,2=否)', field: 'isShow', visible: true, align: 'center', valign: 'middle'},
+        {title: '是否播报(1=是,2=否)', field: 'isBroadcast', visible: true, align: 'center', valign: 'middle'},
+        {title: '公告类型(1=滚动消息,2=公告)', field: 'type', visible: true, align: 'center', valign: 'middle'},
+        {title: '图片路径', field: 'imgUrl', visible: true, align: 'center', valign: 'middle'},
+        {title: '1:创建,2:修改,3:删除', field: 'flag', visible: true, align: 'center', valign: 'middle'},
+        {title: '', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '', field: 'insertUser', visible: true, align: 'center', valign: 'middle'},
+        {title: '', field: 'updateTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '', field: 'updateUser', visible: true, align: 'center', valign: 'middle'}*/
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TNotices.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TNotices.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加滚动消息设置
+ */
+TNotices.openAddTNotices = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加滚动消息',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tNotices/tNotices_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看滚动消息设置详情
+ */
+TNotices.openTNoticesDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑滚动消息',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tNotices/tNotices_update/' + TNotices.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除滚动消息设置
+ */
+TNotices.delete = function () {
+    if (this.check()) {
+        var nickname = TNotices.seItem.content;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该滚动消息";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        swal({
+            title: "您是否确认删除" + nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tNotices/delete", function (data) {
+                swal("删除成功", "您已经成功删除了" + nickname + "。", "success");
+                TNotices.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tNoticesId", TNotices.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询滚动消息设置列表
+ */
+TNotices.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['content'] = $("#content").val();
+    TNotices.table.refresh({query: queryData});
+};
+TNotices.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#content").val("");
+    TNotices.search();
+};
+$(function () {
+    var defaultColunms = TNotices.initColumn();
+    var table = new BSTable(TNotices.id, "/tNotices/list", defaultColunms);
+    table.setPaginationType("server");
+    TNotices.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tNotices/tNotices_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tNotices/tNotices_info.js
new file mode 100644
index 0000000..363d8a6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tNotices/tNotices_info.js
@@ -0,0 +1,150 @@
+/**
+ * 初始化滚动消息设置详情对话框
+ */
+var TNoticesInfoDlg = {
+    tNoticesInfoData : {},
+    editor: null,
+    validateFields: {
+        content: {
+            validators: {
+                notEmpty: {
+                    message: '消息内容不能为空'
+                },
+                regexp:{
+                    regexp: /^.{1,20}$/,
+                    message: '消息内容不超过20个字'
+                },
+            }
+        },
+        sort: {
+            validators: {
+                notEmpty: {
+                    message: '排序不能为空'
+                },
+                regexp: {
+                    regexp: /^[1-9]\d*$/,
+                    message: '排序格式不正确'
+                }
+            }
+        },
+        isShow: {
+            validators: {
+                notEmpty: {
+                    message: '选择是否显示'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TNoticesInfoDlg.validate = function () {
+    $('#noticeInfoForm').data("bootstrapValidator").resetForm();
+    $('#noticeInfoForm').bootstrapValidator('validate');
+    return $("#noticeInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TNoticesInfoDlg.clearData = function() {
+    this.tNoticesInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TNoticesInfoDlg.set = function(key, val) {
+    this.tNoticesInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TNoticesInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TNoticesInfoDlg.close = function() {
+    parent.layer.close(window.parent.TNotices.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TNoticesInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('title')
+    .set('content')
+    .set('sort')
+    .set('isShow')
+    .set('isBroadcast')
+    .set('type')
+    .set('imgUrl')
+    .set('flag')
+    .set('insertTime')
+    .set('insertUser')
+    .set('updateTime')
+    .set('updateUser');
+}
+
+/**
+ * 提交添加
+ */
+TNoticesInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tNotices/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TNotices.table.refresh();
+        TNoticesInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tNoticesInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TNoticesInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tNotices/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TNotices.table.refresh();
+        TNoticesInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tNoticesInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("noticeInfoForm", TNoticesInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity.js b/management/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity.js
new file mode 100644
index 0000000..f44dd05
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity.js
@@ -0,0 +1,182 @@
+/**
+ * 城市管理管理初始化
+ */
+var TOpenCity = {
+    id: "TOpenCityTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TOpenCity.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '省', field: 'areaName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.areaName != '' && row.areaName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.areaName + '" onfocus="TUser.tooltip()">' + row.areaName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '市', field: 'cityName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.cityName != '' && row.cityName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.cityName + '" onfocus="TUser.tooltip()">' + row.cityName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '区', field: 'provinceName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.provinceName != '' && row.provinceName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.provinceName + '" onfocus="TUser.tooltip()">' + row.provinceName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '经营业务', field: 'business', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.business != '' && row.business != null) {
+                    var labelStr = "";
+                    var labelStrs = "";
+                    var labelArray = row.business.split(",");
+                    for(var i=0;i<labelArray.length;i++){
+                        labelStr += labelArray[i] +"<br>";
+                        labelStrs += labelArray[i] + "&#10;";
+                    }
+                    labelStr = labelStr.substring(0,labelStr.length-4);
+                    labelStrs = labelStrs.substring(0,labelStrs.length-5);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + labelStrs + '" onfocus="TUser.tooltip()">' + labelStr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '是否需要<br/>网约车资格证', field: 'isQualifications', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.isQualifications != '' && row.isQualifications != null) {
+                    if (row.isQualifications == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="是" onfocus="TUser.tooltip()">是</p>']
+                    } else if (row.isQualifications == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="否" onfocus="TUser.tooltip()">否</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TOpenCity.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TOpenCity.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加城市管理
+ */
+TOpenCity.openAddTOpenCity = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加开通城市',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tOpenCity/tOpenCity_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看城市管理详情
+ */
+TOpenCity.openTOpenCityDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑开通城市',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOpenCity/tOpenCity_update/' + TOpenCity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除城市管理
+ */
+TOpenCity.delete = function () {
+    if (this.check()) {
+        var name = "该开通城市";
+        swal({
+            title: "您是否确认删除" + name + "?",
+            text: "请谨慎操作,删除后不可恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOpenCity/delete", function (data) {
+                swal("删除成功", "您已经成功删除了" + name + "。", "success");
+                TOpenCity.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tOpenCityId",TOpenCity.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询城市管理列表
+ */
+TOpenCity.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['condition'] = $("#condition").val();
+    TOpenCity.table.refresh({query: queryData});
+};
+TOpenCity.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#condition").val("");
+    TOpenCity.search();
+};
+
+$(function () {
+    var defaultColunms = TOpenCity.initColumn();
+    var table = new BSTable(TOpenCity.id, "/tOpenCity/list", defaultColunms);
+    table.setPaginationType("server");
+    TOpenCity.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity_info.js
new file mode 100644
index 0000000..7fa11db
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity_info.js
@@ -0,0 +1,309 @@
+/**
+ * 初始化城市管理详情对话框
+ */
+var TOpenCityInfoDlg = {
+    tOpenCityInfoData : {},
+    editor: null,
+    validateFields: {
+        provinceId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择省'
+                }
+            }
+        },
+        cityId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择市'
+                }
+            }
+        },
+        isQualifications: {
+            validators: {
+                notEmpty: {
+                    message: '请选择是否需要网约车资格证'
+                }
+            }
+        }
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TOpenCityInfoDlg.validate = function () {
+    $('#openCityForm').data("bootstrapValidator").resetForm();
+    $('#openCityForm').bootstrapValidator('validate');
+    return $("#openCityForm").data('bootstrapValidator').isValid();
+};
+
+
+/**
+ * 清除数据
+ */
+TOpenCityInfoDlg.clearData = function() {
+    this.tOpenCityInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOpenCityInfoDlg.set = function(key, val) {
+    this.tOpenCityInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOpenCityInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TOpenCityInfoDlg.close = function() {
+    parent.layer.close(window.parent.TOpenCity.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TOpenCityInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('code')
+    .set('lon')
+    .set('lat')
+    .set('isQualifications')
+    .set('areaName')
+    .set('cityName')
+    .set('provinceName')
+    .set('flag')
+    .set('insertTime')
+    .set('insertUser')
+    .set('updateTime')
+    .set('updateUser');
+}
+/**
+ * 提交添加
+ */
+TOpenCityInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var subArr=[];
+    $(".timeClass").each(function () {
+        subArr.push({
+            busId:$(this).find("input[name*='busId']").val(),
+            time:$(this).find("input[name*='time']").val(),
+            type:$(this).find("input[name*='type']").val(),
+            sort:$(this).find("input[name*='sort']").val(),
+        })
+    });
+    if(subArr.length <= 0){
+        Feng.error("请选择经营业务");
+        return;
+    }
+
+    //获取经纬度
+    var provinceValue = $("#provinceId option:selected").text();
+    var cityValue = $("#cityId option:selected").text();
+    if ("选择市" == cityValue){
+        cityValue = "";
+    }
+    var areaValue = $("#areaId option:selected").text();
+    if ("选择区" == areaValue){
+        areaValue = "";
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOpenCity/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TOpenCity.table.refresh();
+        TOpenCityInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOpenCityInfoData);
+    ajax.set("businessTypeStr",JSON.stringify(subArr));
+    ajax.set("areaName",provinceValue);
+    ajax.set("cityName",cityValue);
+    ajax.set("provinceName",areaValue);
+    ajax.set("provinceId",$("#areaId").val());
+    ajax.set("cityId",$("#cityId").val());
+    ajax.set("areaId",$("#provinceId").val());
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TOpenCityInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var subArr=[];
+    $(".timeClass").each(function () {
+        subArr.push({
+            busId:$(this).find("input[name*='busId']").val(),
+            time:$(this).find("input[name*='time']").val(),
+            type:$(this).find("input[name*='type']").val(),
+            sort:$(this).find("input[name*='sort']").val(),
+        })
+    });
+    if(subArr.length <= 0){
+        Feng.error("请选择经营业务");
+        return;
+    }
+
+    //获取经纬度
+    var provinceValue = $("#provinceId option:selected").text();
+    var cityValue = $("#cityId option:selected").text();
+    if ("选择市" == cityValue){
+        cityValue = "";
+    }
+    var areaValue = $("#areaId option:selected").text();
+    if ("选择区" == areaValue){
+        areaValue = "";
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOpenCity/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TOpenCity.table.refresh();
+        TOpenCityInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOpenCityInfoData);
+    ajax.set("businessTypeStr",JSON.stringify(subArr));
+    ajax.set("areaName",provinceValue);
+    ajax.set("cityName",cityValue);
+    ajax.set("provinceName",areaValue);
+    ajax.set("provinceId",$("#areaId").val());
+    ajax.set("cityId",$("#cityId").val());
+    ajax.set("areaId",$("#provinceId").val());
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("openCityForm", TOpenCityInfoDlg.validateFields);
+});
+
+/**
+ * 省改变时执行
+ */
+TOpenCityInfoDlg.provinceChange = function () {
+    var provinceId = $("#provinceId").val();
+    var ajax = new $ax(Feng.ctxPath + "/tOpenCity/change", function(data){
+        if(data!=null){
+            var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#cityId").empty().append(content);
+            $("#areaId").empty().append('<option value="">选择区</option>');
+        }
+    });
+    ajax.set("id",provinceId);
+    ajax.start();
+}
+/**
+ * 市改变时执行
+ */
+TOpenCityInfoDlg.cityChange = function () {
+    var cityId = $("#cityId").val();
+    var ajax = new $ax(Feng.ctxPath + "/tOpenCity/change", function(data){
+        if(data!=null){
+            var content='<option value="">选择区</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.id+"'>"+v.name+"</option>";
+            });
+            $("#areaId").empty().append(content);
+        }
+    });
+    ajax.set("id",cityId);
+    ajax.start();
+}
+
+/**
+ * 点击添加业务类型
+ */
+function addBusinessType(){
+    var businessType=$("#businessType option:selected").text();
+    if ("选择经营业务" == businessType){
+        Feng.info("请选择经营业务");
+        return;
+    }
+    var businessSort=$("#businessSort").val();
+    if ("" == businessSort){
+        Feng.info("排序不能为空");
+        return;
+    }else if (!reg.test(businessSort)) {
+        Feng.info("排序格式不正确");
+        return;
+    }
+
+    //获取所有的值
+    var subArr=[];
+    $(".timeClass").each(function () {
+        subArr.push({
+            busId:$(this).find("input[name*='busId']").val(),
+            time:$(this).find("input[name*='time']").val(),
+            type:$(this).find("input[name*='type']").val(),
+            sort:$(this).find("input[name*='sort']").val(),
+        })
+    });
+    for(var i=0;i<subArr.length;i++){
+        var time = subArr[i].time;
+        var type = subArr[i].type;
+        var sort = subArr[i].sort;
+        if (type == businessType) {
+            Feng.info("经营业务已存在,请重新选择");
+            return;
+        }
+        if (sort == businessSort) {
+            Feng.info("排序已存在,请重新填写");
+            return;
+        }
+    }
+    var str = '<tr class="timeClass">' +
+        '<td><input type="hidden" id="busId" name="busId" value="0"><input type="hidden" id="time" name="time" value="'+getNowFormatDate()+'">' + getNowFormatDate() + '</td>' +
+        '<td><input type="hidden" id="type" name="type" value="'+businessType+'">' + businessType + '</td>' +
+        '<td><input type="hidden" id="sort" name="sort" value="'+businessSort+'">' + businessSort + '</td><td><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#coun").append(str);
+}
+
+function deleteSub(e) {
+    $(e).parent().parent().remove();
+}
+
+//获取当前时间,格式YYYY-MM-DD
+function getNowFormatDate() {
+    var date = new Date();
+    var seperator1 = "-";
+    var year = date.getFullYear();
+    var month = date.getMonth() + 1;
+    var strDate = date.getDate();
+    if (month >= 1 && month <= 9) {
+        month = "0" + month;
+    }
+    if (strDate >= 0 && strDate <= 9) {
+        strDate = "0" + strDate;
+    }
+    var currentdate = year + seperator1 + month + seperator1 + strDate;
+    return currentdate;
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharter/tOrderCharter.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharter/tOrderCharter.js
new file mode 100644
index 0000000..7a7733f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharter/tOrderCharter.js
@@ -0,0 +1,222 @@
+/**
+ * 旅游包车订单管理初始化
+ */
+var TOrderCharter = {
+    id: "TOrderCharterTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TOrderCharter.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '提交时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用户ID', field: 'userId', visible: false, align: 'center', valign: 'middle'},
+        {title: '提交用户', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用车时间', field: 'useTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                if(typeof value != 'undefined'){
+                    return value.split(" ")[0];
+                }
+            }
+        },
+        {title: '用车时长', field: 'useDuration', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.useDuration != '' && row.useDuration != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.useDuration + '" onfocus="TUser.tooltip()">' + row.useDuration + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用车类型', field: 'serverCarModel', visible: true, align: 'center', valign: 'middle', width:'200px'},
+        {title: '用车需求', field: 'useDemand', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.useDemand != '' && row.useDemand != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.useDemand + '" onfocus="TUser.tooltip()">' + row.useDemand + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '乘车人数', field: 'peopleNumber', visible: true, align: 'center', valign: 'middle', width:'200px'},
+        {title: '单价区间', field: 'price', visible: true, align: 'center', valign: 'middle', width:'200px'},
+        {title: '联系人', field: 'contactName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.contactName != '' && row.contactName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.contactName + '" onfocus="TUser.tooltip()">' + row.contactName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '联系电话', field: 'contactPhone', visible: true, align: 'center', valign: 'middle', width:'150px'},
+        {title: '处理备注', field: 'remark', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.remark != '' && row.remark != null) {
+                    var str = row.remark;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TOrderCharter.buttonClick(' +  row.id + ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.remark + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if(row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="待处理" onfocus="TUser.tooltip()">待处理</p>']
+                    }else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已处理" onfocus="TUser.tooltip()">已处理</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 查看更多按钮
+ * @param con
+ */
+TOrderCharter.buttonClick = function (id) {
+    var index = layer.open({
+        type: 2,
+        title: '查看详情',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tOrderCharter/lookDetail/'+id
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 检查是否选中
+ */
+TOrderCharter.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TOrderCharter.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 立即处理
+ */
+TOrderCharter.immediately = function () {
+    if (this.check()) {
+        if (TOrderCharter.seItem.state != 1){
+            swal("处理失败", "【待处理】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即处理',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderCharter/tOrderCharter_immediately/' + TOrderCharter.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除旅游包车订单
+ */
+TOrderCharter.delete = function () {
+    if (this.check()) {
+        var nickname = TOrderCharter.seItem.userName;
+        if (nickname == "" || nickname == null || nickname == undefined){
+            nickname = "该用户";
+        }else{
+            nickname = "【"+nickname+"】";
+        }
+        var state = TOrderCharter.seItem.state;
+        if (state != 2){
+            swal("删除失败", "【已处理】状态下才能执行此操作!", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除"+ nickname + "的包车记录?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOrderCharter/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "的包车记录。", "success");
+                TOrderCharter.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tOrderCharterId", TOrderCharter.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询旅游包车订单列表
+ */
+TOrderCharter.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['contactName'] = $("#contactName").val();
+    queryData['contactPhone'] = $("#contactPhone").val();
+    queryData['useDemand'] = $("#useDemand").val();
+    queryData['state'] = $("#state").val();
+    TOrderCharter.table.refresh({query: queryData});
+};
+
+TOrderCharter.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#userName").val("");
+    $("#contactName").val("");
+    $("#contactPhone").val("");
+    $("#useDemand").val("");
+    $("#state").val("");
+    TOrderCharter.search();
+};
+
+$(function () {
+    var defaultColunms = TOrderCharter.initColumn();
+    var table = new BSTable(TOrderCharter.id, "/tOrderCharter/list", defaultColunms);
+    table.setPaginationType("server");
+    TOrderCharter.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharter/tOrderCharter_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharter/tOrderCharter_info.js
new file mode 100644
index 0000000..73de91a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharter/tOrderCharter_info.js
@@ -0,0 +1,106 @@
+/**
+ * 初始化旅游包车订单详情对话框
+ */
+var TOrderCharterInfoDlg = {
+    tOrderCharterInfoData : {},
+    validateFields: {
+        remark: {
+            validators: {
+                notEmpty: {
+                    message: '处理备注不能为空'
+                }/*,
+                regexp: {
+                    regexp: /^.{1,500}$/,
+                    message: '回复内容不能超过500个长度'
+                }*/
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TOrderCharterInfoDlg.validate = function () {
+    $('#orderCharterInfoForm').data("bootstrapValidator").resetForm();
+    $('#orderCharterInfoForm').bootstrapValidator('validate');
+    return $("#orderCharterInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TOrderCharterInfoDlg.clearData = function() {
+    this.tOrderCharterInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderCharterInfoDlg.set = function(key, val) {
+    this.tOrderCharterInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderCharterInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TOrderCharterInfoDlg.close = function() {
+    parent.layer.close(window.parent.TOrderCharter.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TOrderCharterInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('insertTime')
+    .set('userId')
+    .set('useTime')
+    .set('useDuration')
+    .set('useDemand')
+    .set('contactName')
+    .set('contactPhone')
+    .set('remark')
+    .set('state');
+}
+
+/**
+ * 立即处理
+ */
+TOrderCharterInfoDlg.immediately = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderCharter/immediately", function(data){
+        Feng.success("处理成功!");
+        window.parent.TOrderCharter.table.refresh();
+        TOrderCharterInfoDlg.close();
+    },function(data){
+        Feng.error("处理失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderCharterInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("orderCharterInfoForm", TOrderCharterInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharteredCar/tOrderCharteredCar.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharteredCar/tOrderCharteredCar.js
new file mode 100644
index 0000000..2ea181e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharteredCar/tOrderCharteredCar.js
@@ -0,0 +1,216 @@
+/**
+ * 旅游包车订单管理初始化
+ */
+var TOrderCharteredCar = {
+    id: "TOrderCharteredCarTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TOrderCharteredCar.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '提交时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle', width:'200px',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用户ID', field: 'userId', visible: false, align: 'center', valign: 'middle', width:'200px'},
+        {title: '提交用户', field: 'userName', visible: true, align: 'center', valign: 'middle', width:'200px',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用车时间', field: 'traveltime', visible: true, align: 'center', valign: 'middle', width:'200px',
+            formatter: function (value, row) {
+                if(typeof value != 'undefined'){
+                    return value.split(" ")[0];
+                }
+            }
+        },
+        {title: '用车时长【天】', field: 'carTime', visible: true, align: 'center', valign: 'middle', width:'200px',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.carTime != '' && row.carTime != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.carTime + '" onfocus="TUser.tooltip()">' + row.carTime + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用车类型', field: 'serverCarModel', visible: true, align: 'center', valign: 'middle', width:'200px'},
+        {title: '用车需求', field: 'modelUse', visible: true, align: 'center', valign: 'middle', width:'200px',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.modelUse != '' && row.modelUse != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.modelUse + '" onfocus="TUser.tooltip()">' + row.modelUse + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '乘车人数', field: 'peopleNumber', visible: true, align: 'center', valign: 'middle', width:'200px'},
+        {title: '价格区间', field: 'price', visible: true, align: 'center', valign: 'middle', width:'200px'},
+        {title: '联系人', field: 'contactPerson', visible: true, align: 'center', valign: 'middle', width:'200px',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.contactPerson != '' && row.contactPerson != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.contactPerson + '" onfocus="TUser.tooltip()">' + row.contactPerson + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '联系电话', field: 'contactPhone', visible: true, align: 'center', valign: 'middle', width:'200px',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.contactPhone != '' && row.contactPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.contactPhone + '" onfocus="TUser.tooltip()">' + row.contactPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '处理备注', field: 'remark', visible: true, align: 'center', valign: 'middle', width:'300px',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.remark != '' && row.remark != null) {
+                    var str = row.remark;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TOrderCharter.buttonClick(' +  row.id + ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.remark + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle', width:'100px',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if(row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="待处理" onfocus="TUser.tooltip()">待处理</p>']
+                    }else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已处理" onfocus="TUser.tooltip()">已处理</p>']
+                    }else if (row.state == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TOrderCharteredCar.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TOrderCharteredCar.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 删除旅游包车订单
+ */
+TOrderCharteredCar.delete = function () {
+    if (this.check()) {
+        var nickname = TOrderCharteredCar.seItem.userName;
+        if (nickname == "" || nickname == null || nickname == undefined){
+            nickname = "该用户";
+        }else{
+            nickname = "【"+nickname+"】";
+        }
+        var state = TOrderCharteredCar.seItem.state;
+        if (state != 2){
+            swal("删除失败", "【已处理】状态下才能执行此操作!", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除"+ nickname + "的包车记录?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOrderCharteredCar/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "的包车记录。", "success");
+                TOrderCharteredCar.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tOrderCharterId", TOrderCharteredCar.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 立即处理
+ */
+TOrderCharteredCar.immediately = function () {
+    if (this.check()) {
+        if (TOrderCharteredCar.seItem.state != 1){
+            swal("处理失败", "【待处理】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即处理',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderCharteredCar/tOrderCharteredCar_immediately/' + TOrderCharteredCar.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 查询旅游包车订单列表
+ */
+TOrderCharteredCar.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['contactPerson'] = $("#contactPerson").val();
+    queryData['contactPhone'] = $("#contactPhone").val();
+    queryData['modelUse'] = $("#modelUse").val();
+    TOrderCharteredCar.table.refresh({query: queryData});
+};
+
+TOrderCharteredCar.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#userName").val("");
+    $("#contactPerson").val("");
+    $("#contactPhone").val("");
+    $("#modelUse").val("");
+    $("#state").val("");
+    TOrderCharteredCar.search();
+};
+
+
+$(function () {
+    var defaultColunms = TOrderCharteredCar.initColumn();
+    var table = new BSTable(TOrderCharteredCar.id, "/tOrderCharteredCar/list", defaultColunms);
+    table.setPaginationType("server");
+    TOrderCharteredCar.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharteredCar/tOrderCharteredCar_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharteredCar/tOrderCharteredCar_info.js
new file mode 100644
index 0000000..b5b958c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCharteredCar/tOrderCharteredCar_info.js
@@ -0,0 +1,107 @@
+/**
+ * 初始化旅游包车订单详情对话框
+ */
+var TOrderCharteredCarInfoDlg = {
+    tOrderCharteredCarInfoData : {},
+    validateFields: {
+        remark: {
+            validators: {
+                notEmpty: {
+                    message: '处理备注不能为空'
+                }/*,
+                regexp: {
+                    regexp: /^.{1,500}$/,
+                    message: '回复内容不能超过500个长度'
+                }*/
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TOrderCharteredCarInfoDlg.validate = function () {
+    $('#orderCharterCarInfoForm').data("bootstrapValidator").resetForm();
+    $('#orderCharterCarInfoForm').bootstrapValidator('validate');
+    return $("#orderCharterCarInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TOrderCharteredCarInfoDlg.clearData = function() {
+    this.tOrderCharteredCarInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderCharteredCarInfoDlg.set = function(key, val) {
+    this.tOrderCharteredCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderCharteredCarInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TOrderCharteredCarInfoDlg.close = function() {
+    parent.layer.close(window.parent.TOrderCharteredCar.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TOrderCharteredCarInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('userId')
+    .set('companyId')
+    .set('orderNumber')
+    .set('traveltime')
+    .set('carTime')
+    .set('serverCarModelId')
+    .set('modelUse')
+    .set('peopleNumber')
+    .set('contactPerson')
+    .set('contactPhone')
+    .set('state')
+    .set('remark')
+    .set('isDelete')
+    .set('insertTime');
+}
+/**
+ * 立即处理
+ */
+TOrderCharteredCarInfoDlg.immediately = function() {
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderCharteredCar/immediately", function(data){
+        Feng.success("处理成功!");
+        window.parent.TOrderCharteredCar.table.refresh();
+        TOrderCharteredCarInfoDlg.close();
+    },function(data){
+        Feng.error("处理失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set({
+        id: $('#id').val(),
+        remark: $('#remark').val()
+    });
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("orderCharterCarInfoForm", TOrderCharteredCarInfoDlg.validateFields);
+});
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderCrossCity/tOrderCrossCity.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCrossCity/tOrderCrossCity.js
new file mode 100644
index 0000000..62d9238
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCrossCity/tOrderCrossCity.js
@@ -0,0 +1,383 @@
+/**
+ * 跨城出行订单管理初始化
+ */
+var TOrderCrossCity = {
+    id: "TOrderCrossCityTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TOrderCrossCity.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '下单时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单编号', field: 'orderNum', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderNum != '' && row.orderNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderNum + '" onfocus="TUser.tooltip()">' + row.orderNum+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单来源', field: 'orderSource', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderSource != '' && row.orderSource != null) {
+                    if (row.orderSource == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="APP下单" onfocus="TUser.tooltip()">APP下单</p>']
+                    } else if (row.orderSource == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="扫码下单" onfocus="TUser.tooltip()">扫码下单</p>']
+                    } else if (row.orderSource == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="小程序下单" onfocus="TUser.tooltip()">小程序下单</p>']
+                    } else if (row.orderSource == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="司机下单" onfocus="TUser.tooltip()">司机下单</p>']
+                    } else if (row.orderSource == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="调度下单" onfocus="TUser.tooltip()">调度下单</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '乘车时间', field: 'travelTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.travelTime != '' && row.travelTime != null) {
+                    var time = row.travelTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.travelTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用户id', field: 'userId', visible: false, align: 'center', valign: 'middle'},
+        {title: '下单用<br/>户昵称', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '下单用<br/>户手机', field: 'userPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userPhone != '' && row.userPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userPhone + '" onfocus="TUser.tooltip()">' + row.userPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '乘车用<br/>户姓名', field: 'passengers', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.passengers != '' && row.passengers != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.passengers + '" onfocus="TUser.tooltip()">' + row.passengers + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '乘车用<br/>户手机', field: 'passengersPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.passengersPhone != '' && row.passengersPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.passengersPhone + '" onfocus="TUser.tooltip()">' + row.passengersPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '起点', field: 'startAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.startAddress != '' && row.startAddress != null) {
+                    var str = row.startAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.startAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '终点', field: 'endAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.endAddress != '' && row.endAddress != null) {
+                    var str = row.endAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.endAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '线路名称', field: 'lineName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.lineName != '' && row.lineName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.lineName + '" onfocus="TUser.tooltip()">' + row.lineName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '选择车型', field: 'serverCarModel', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.serverCarModel != '' && row.serverCarModel != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.serverCarModel + '" onfocus="TUser.tooltip()">' + row.serverCarModel + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '接单司机', field: 'driver', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driver != '' && row.driver != null) {
+                    var driverName1 = row.driver.replace("-","<br>");
+                    var driverName2 = row.driver.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + driverName2 + '" onfocus="TUser.tooltip()">' + driverName1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '接单车辆', field: 'car', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.car != '' && row.car != null) {
+                    var car1 = row.car.replace("-","<br>");
+                    var car2 = row.car.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + car2 + '" onfocus="TUser.tooltip()">' + car1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单金额', field: 'orderMoney', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderMoney != '' && row.orderMoney != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderMoney + '" onfocus="TUser.tooltip()">' + row.orderMoney + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待接单" onfocus="TUser.tooltip()">待接单</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待出发" onfocus="TUser.tooltip()">待出发</p>']
+                    } else if (row.state == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待到达预约地点" onfocus="TUser.tooltip()">待到达预约地点</p>']
+                    } else if (row.state == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待乘客上车" onfocus="TUser.tooltip()">待乘客上车</p>']
+                    } else if (row.state == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="服务中" onfocus="TUser.tooltip()">服务中</p>']
+                    } else if (row.state == 6){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="完成服务" onfocus="TUser.tooltip()">完成服务</p>']
+                    } else if (row.state == 7){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待支付" onfocus="TUser.tooltip()">待支付</p>']
+                    } else if (row.state == 8){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待评价" onfocus="TUser.tooltip()">待评价</p>']
+                    } else if (row.state == 9){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已完成" onfocus="TUser.tooltip()">已完成</p>']
+                    } else if (row.state == 10){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
+                    } else if (row.state == 11){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="改派中" onfocus="TUser.tooltip()">改派中</p>']
+                    } else if (row.state == 12){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="取消待支付" onfocus="TUser.tooltip()">取消待支付</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TOrderCrossCity.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TOrderCrossCity.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 打开查看跨城出行订单详情
+ */
+TOrderCrossCity.detail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '跨城出行订单详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderCrossCity/tOrderCrossCity_detail/' + TOrderCrossCity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 订单轨迹
+ */
+TOrderCrossCity.track = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '跨城出行订单轨迹',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderCrossCity/tOrderCrossCity_track/' + TOrderCrossCity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+/**
+ * 取消订单操作
+ */
+TOrderCrossCity.cancel = function(){
+    if (this.check()) {
+        var nickname = TOrderCrossCity.seItem.orderNum;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该订单";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (TOrderCrossCity.seItem.state == 8 || TOrderCrossCity.seItem.state == 9 || TOrderCrossCity.seItem.state == 10 ) {
+            swal("取消失败", "【待评价】【已完成】【已取消】状态下不能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认取消订单" + nickname + "?",
+            text: "请谨慎操作,取消后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "取消订单",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOrderCrossCity/cancel", function (data) {
+                swal("取消订单成功", "您已经成功取消了" + nickname + "。", "success");
+                TOrderCrossCity.table.refresh();
+            }, function (data) {
+                swal("取消订单失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tOrderCrossCityId", TOrderCrossCity.seItem.id);
+            ajax.start();
+        });
+    }
+}
+
+/**
+ * 删除跨城出行订单
+ */
+TOrderCrossCity.delete = function () {
+    if (this.check()) {
+        var orderNum = TOrderCrossCity.seItem.orderNum;
+        if (orderNum == "" || orderNum == null || orderNum == undefined) {
+            orderNum = "该订单";
+        } else {
+            orderNum = "【" + orderNum + "】";
+        }
+        if (TOrderCrossCity.seItem.state != 10) {
+            swal("删除失败", "【已取消】状态下才能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除" + orderNum + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOrderCrossCity/delete", function (data) {
+                swal("删除成功", "您已经删除了" + orderNum + "。", "success");
+                TOrderCrossCity.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tOrderCrossCityId", TOrderCrossCity.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询跨城出行订单列表
+ */
+TOrderCrossCity.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['orderNum'] = $("#orderNum").val();
+    queryData['orderSource'] = $("#orderSource").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['userPhone'] = $("#userPhone").val();
+    queryData['passengers'] = $("#passengers").val();
+    queryData['passengersPhone'] = $("#passengersPhone").val();
+    queryData['serverCarModelId'] = $("#serverCarModelId").val();
+    queryData['driver'] = $("#driver").val();
+    queryData['lineId'] = $("#lineId").val();
+    queryData['state'] = $("#state").val();
+    TOrderCrossCity.table.refresh({query: queryData});
+};
+
+TOrderCrossCity.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#orderNum").val("");
+    $("#orderSource").val("");
+    $("#userName").val("");
+    $("#userPhone").val("");
+    $("#passengers").val("");
+    $("#passengersPhone").val("");
+    $("#serverCarModelId").val("");
+    $("#driver").val("");
+    $("#lineId").val("");
+    $("#state").val("");
+    TOrderCrossCity.search();
+};
+
+$(function () {
+    var defaultColunms = TOrderCrossCity.initColumn();
+    var table = new BSTable(TOrderCrossCity.id, "/tOrderCrossCity/list", defaultColunms);
+    table.setPaginationType("server");
+    TOrderCrossCity.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderCrossCity/tOrderCrossCity_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCrossCity/tOrderCrossCity_info.js
new file mode 100644
index 0000000..1872724
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderCrossCity/tOrderCrossCity_info.js
@@ -0,0 +1,244 @@
+/**
+ * 初始化跨城出行订单详情对话框
+ */
+var TOrderCrossCityInfoDlg = {
+    tOrderCrossCityInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TOrderCrossCityInfoDlg.clearData = function() {
+    this.tOrderCrossCityInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderCrossCityInfoDlg.set = function(key, val) {
+    this.tOrderCrossCityInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderCrossCityInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TOrderCrossCityInfoDlg.close = function() {
+    parent.layer.close(window.parent.TOrderCrossCity.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TOrderCrossCityInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('userId')
+    .set('driverId')
+    .set('lineId')
+    .set('carId')
+    .set('serverCarModelId')
+    .set('orderNum')
+    .set('placementLon')
+    .set('placementLat')
+    .set('placementAddress')
+    .set('startLon')
+    .set('startLat')
+    .set('endLon')
+    .set('startAddress')
+    .set('endLat')
+    .set('endAddress')
+    .set('boardingLon')
+    .set('boardingLat')
+    .set('boardingAddress')
+    .set('boardingTime')
+    .set('getoffLon')
+    .set('getoffLat')
+    .set('getoffAddress')
+    .set('getoffTime')
+    .set('mileage')
+    .set('payManner')
+    .set('payType')
+    .set('orderMoney')
+    .set('redPacketMoney')
+    .set('couponMoney')
+    .set('redPacketId')
+    .set('couponId')
+    .set('discount')
+    .set('discountMoney')
+    .set('activityId')
+    .set('companyId')
+    .set('payMoney')
+    .set('passengers')
+    .set('passengersPhone')
+    .set('sort')
+    .set('insertTime')
+    .set('travelTime')
+    .set('snatchOrderTime')
+    .set('setOutTime')
+    .set('arriveTime')
+    .set('startServiceTime')
+    .set('endServiceTime')
+    .set('travelMode')
+    .set('orderSource')
+    .set('invoiceId')
+    .set('trackId')
+    .set('state')
+    .set('isDelete')
+    .set('telX')
+    .set('bindId');
+}
+
+/**
+ * 提交添加
+ */
+TOrderCrossCityInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderCrossCity/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TOrderCrossCity.table.refresh();
+        TOrderCrossCityInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderCrossCityInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TOrderCrossCityInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderCrossCity/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TOrderCrossCity.table.refresh();
+        TOrderCrossCityInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderCrossCityInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
+
+var map = new AMap.Map("container", {
+    resizeEnable: true,
+    zoom: 14
+});
+$(function() {
+    getTrajectory();
+});
+
+function getTrajectory() {
+    $.ajax({
+        url: Feng.ctxPath + '/tOrderCrossCity/getOrderTrack',
+        type: 'POST',
+        data:{
+            orderDetailId: $("#id").val()
+        },
+        success: function (res) {
+            if(res.status == 200){
+                var data = res.data;
+                if(data.length > 0){
+                    orderTrack(data);
+                }/*else{
+                    Feng.error("当前订单没有轨迹");
+                }*/
+            }else{
+                Feng.error(res.msg);
+            }
+        }
+    });
+}
+
+var marker, lineArr = [];
+
+function orderTrack(data) {
+    for(var i in data){
+        var waypoints = [];
+        var lon = parseFloat(data[i].lon);
+        var lat = parseFloat(data[i].lat);
+        waypoints.push(lon);
+        waypoints.push(lat);
+        lineArr.push(waypoints);
+    }
+
+    marker = new AMap.Marker({
+        map: map,
+        position: lineArr[0],
+        icon: "https://webapi.amap.com/images/car.png",
+        offset: new AMap.Pixel(-26, -13),
+        autoRotation: true,
+        angle:-90,
+    });
+
+    // 绘制轨迹
+    var polyline = new AMap.Polyline({
+        map: map,
+        path: lineArr,
+        showDir:true,
+        strokeColor: "#28F",  //线颜色
+        // strokeOpacity: 1,     //线透明度
+        strokeWeight: 6,      //线宽
+        // strokeStyle: "solid"  //线样式
+    });
+
+    var passedPolyline = new AMap.Polyline({
+        map: map,
+        // path: lineArr,
+        strokeColor: "#AF5",  //线颜色
+        // strokeOpacity: 1,     //线透明度
+        strokeWeight: 6,      //线宽
+        // strokeStyle: "solid"  //线样式
+    });
+
+
+    marker.on('moving', function (e) {
+        passedPolyline.setPath(e.passedPath);
+    });
+
+    map.setFitView();
+}
+
+
+function startAnimation () {
+    marker.moveAlong(lineArr, 200);
+}
+
+function pauseAnimation () {
+    marker.pauseMove();
+}
+
+function resumeAnimation () {
+    marker.resumeMove();
+}
+
+function stopAnimation () {
+    marker.stopMove();
+}
+
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderEvaluate/tOrderEvaluate.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderEvaluate/tOrderEvaluate.js
new file mode 100644
index 0000000..41af42c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderEvaluate/tOrderEvaluate.js
@@ -0,0 +1,224 @@
+/**
+ * 评价列表管理初始化
+ */
+var TOrderEvaluate = {
+    id: "TOrderEvaluateTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TOrderEvaluate.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '评论时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '评论用户ID', field: 'userId', visible: false, align: 'center', valign: 'middle'},
+        {title: '评论用户', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '评论用户<br/>手机号', field: 'userPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userPhone != '' && row.userPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userPhone + '" onfocus="TUser.tooltip()">' + row.userPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '司机ID', field: 'driverId', visible: false, align: 'center', valign: 'middle'},
+        {title: '评论司机', field: 'driverName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driverName != '' && row.driverName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.driverName + '" onfocus="TUser.tooltip()">' + row.driverName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '评论司机<br/>手机号', field: 'driverPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driverPhone != '' && row.driverPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.driverPhone + '" onfocus="TUser.tooltip()">' + row.driverPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单类型', field: 'orderType', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderType != '' && row.orderType != null) {
+                    if (row.orderType == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="专车" onfocus="TUser.tooltip()">专车</p>']
+                    } else if (row.orderType == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="出租车" onfocus="TUser.tooltip()">出租车</p>']
+                    } else if (row.orderType == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="跨城出行" onfocus="TUser.tooltip()">跨城出行</p>']
+                    } else if (row.orderType == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="同城小件物流" onfocus="TUser.tooltip()">同城小件物流</p>']
+                    } else if (row.orderType == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="跨城小件物流" onfocus="TUser.tooltip()">跨城小件物流</p>']
+                    } else if (row.orderType == 6){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="包车" onfocus="TUser.tooltip()">包车</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '评分分数', field: 'fraction', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.fraction != '' && row.fraction != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.fraction + '" onfocus="TUser.tooltip()">' + row.fraction + '</p>']
+                } else {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '评论内容', field: 'content', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.content != '' && row.content != null) {
+                    var str = row.content;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TOrderEvaluate.buttonClick(' +  row.id+','+ 1+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.content + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 查看更多按钮
+ * @param con
+ */
+TOrderEvaluate.buttonClick = function (id,type) {
+    var index = layer.open({
+        type: 2,
+        title: '查看详情',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tOrderEvaluate/lookDetail/'+id+"/"+type
+    });
+    this.layerIndex = index;
+}
+
+
+/**
+ * 检查是否选中
+ */
+TOrderEvaluate.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TOrderEvaluate.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加评价列表
+ */
+TOrderEvaluate.openAddTOrderEvaluate = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加评价列表',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tOrderEvaluate/tOrderEvaluate_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看评价列表详情
+ */
+TOrderEvaluate.openTOrderEvaluateDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '评价列表详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderEvaluate/tOrderEvaluate_update/' + TOrderEvaluate.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除评价列表
+ */
+TOrderEvaluate.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tOrderEvaluate/delete", function (data) {
+            Feng.success("删除成功!");
+            TOrderEvaluate.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tOrderEvaluateId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询评价列表列表
+ */
+TOrderEvaluate.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['userPhone'] = $("#userPhone").val();
+    queryData['driverName'] = $("#driverName").val();
+    queryData['driverPhone'] = $("#driverPhone").val();
+    queryData['fraction'] = $("#fraction").val();
+    queryData['orderType'] = $("#orderType").val();
+    TOrderEvaluate.table.refresh({query: queryData});
+};
+
+TOrderEvaluate.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#userName").val("");
+    $("#userPhone").val("");
+    $("#driverName").val("");
+    $("#driverPhone").val("");
+    $("#fraction").val("");
+    $("#orderType").val("");
+    TOrderEvaluate.search();
+};
+
+$(function () {
+    var defaultColunms = TOrderEvaluate.initColumn();
+    var table = new BSTable(TOrderEvaluate.id, "/tOrderEvaluate/list", defaultColunms);
+    table.setPaginationType("server");
+    TOrderEvaluate.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderEvaluate/tOrderEvaluate_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderEvaluate/tOrderEvaluate_info.js
new file mode 100644
index 0000000..c2b1ecb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderEvaluate/tOrderEvaluate_info.js
@@ -0,0 +1,100 @@
+/**
+ * 初始化评价列表详情对话框
+ */
+var TOrderEvaluateInfoDlg = {
+    tOrderEvaluateInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TOrderEvaluateInfoDlg.clearData = function() {
+    this.tOrderEvaluateInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderEvaluateInfoDlg.set = function(key, val) {
+    this.tOrderEvaluateInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderEvaluateInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TOrderEvaluateInfoDlg.close = function() {
+    parent.layer.close(window.parent.TOrderEvaluate.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TOrderEvaluateInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('orderId')
+    .set('driverId')
+    .set('orderType')
+    .set('fraction')
+    .set('content')
+    .set('insertTime')
+    .set('userId');
+}
+
+/**
+ * 提交添加
+ */
+TOrderEvaluateInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderEvaluate/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TOrderEvaluate.table.refresh();
+        TOrderEvaluateInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderEvaluateInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TOrderEvaluateInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderEvaluate/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TOrderEvaluate.table.refresh();
+        TOrderEvaluateInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderEvaluateInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderLogistics/tOrderLogistics.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderLogistics/tOrderLogistics.js
new file mode 100644
index 0000000..e467b22
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderLogistics/tOrderLogistics.js
@@ -0,0 +1,366 @@
+/**
+ * 小件物流订单管理初始化
+ */
+var TOrderLogistics = {
+    id: "TOrderLogisticsTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TOrderLogistics.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '下单时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.type != '' && row.type != null) {
+                    if (row.type == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="同城物流" onfocus="TUser.tooltip()">同城物流</p>']
+                    } else if (row.type == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="跨城物流" onfocus="TUser.tooltip()">跨城物流</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '订单编号', field: 'orderNum', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderNum != '' && row.orderNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderNum + '" onfocus="TUser.tooltip()">' + row.orderNum + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单来源', field: 'orderSource', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderSource != '' && row.orderSource != null) {
+                    if (row.orderSource == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="APP下单" onfocus="TUser.tooltip()">APP下单</p>']
+                    } else if (row.orderSource == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="扫码下单" onfocus="TUser.tooltip()">扫码下单</p>']
+                    } else if (row.orderSource == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="小程序下单" onfocus="TUser.tooltip()">小程序下单</p>']
+                    } else if (row.orderSource == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="司机下单" onfocus="TUser.tooltip()">司机下单</p>']
+                    } else if (row.orderSource == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="调度下单" onfocus="TUser.tooltip()">调度下单</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '乘车时间', field: 'travelTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.travelTime != '' && row.travelTime != null) {
+                    var time = row.travelTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.travelTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用户id', field: 'userId', visible: false, align: 'center', valign: 'middle'},
+        {title: '下单用<br/>户昵称', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '下单用<br/>户手机', field: 'userPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userPhone != '' && row.userPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userPhone + '" onfocus="TUser.tooltip()">' + row.userPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '收货人<br/>姓名', field: 'recipient', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.recipient != '' && row.recipient != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.recipient + '" onfocus="TUser.tooltip()">' + row.recipient + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '收货人<br/>手机', field: 'recipientPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.recipientPhone != '' && row.recipientPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.recipientPhone + '" onfocus="TUser.tooltip()">' + row.recipientPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '起点', field: 'startAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.startAddress != '' && row.startAddress != null) {
+                    var str = row.startAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.startAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '终点', field: 'endAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.endAddress != '' && row.endAddress != null) {
+                    var str = row.endAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.endAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '接单司机', field: 'driver', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driver != '' && row.driver != null) {
+                    var driverName1 = row.driver.replace("-","<br>");
+                    var driverName2 = row.driver.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + driverName2 + '" onfocus="TUser.tooltip()">' + driverName1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '接单车辆', field: 'car', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.car != '' && row.car != null) {
+                    var car1 = row.car.replace("-","<br>");
+                    var car2 = row.car.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + car2 + '" onfocus="TUser.tooltip()">' + car1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单金额', field: 'orderMoney', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderMoney != '' && row.orderMoney != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderMoney + '" onfocus="TUser.tooltip()">' + row.orderMoney + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle', width:'300px',
+            formatter: function (value, row) {
+                if(typeof value != 'undefined'){
+                    return '<span title="' + value + '">' + value + '</span>';
+                }
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待接单" onfocus="TUser.tooltip()">待接单</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待出发" onfocus="TUser.tooltip()">待出发</p>']
+                    } else if (row.state == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待到达预约地点" onfocus="TUser.tooltip()">待到达预约地点</p>']
+                    } else if (row.state == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待取货" onfocus="TUser.tooltip()">待取货</p>']
+                    } else if (row.state == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="服务中" onfocus="TUser.tooltip()">服务中</p>']
+                    } else if (row.state == 6){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已送达" onfocus="TUser.tooltip()">已送达</p>']
+                    } else if (row.state == 7){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待支付" onfocus="TUser.tooltip()">待支付</p>']
+                    }else if (row.state == 8){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="需补差价" onfocus="TUser.tooltip()">需补差价</p>']
+                    } else if (row.state == 9){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取货" onfocus="TUser.tooltip()">已取货</p>']
+                    } else if (row.state == 10){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
+                    }else if (row.state == 11){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="改派中" onfocus="TUser.tooltip()">改派中</p>']
+                    }else if (row.state == 12){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已支付差价" onfocus="TUser.tooltip()">已支付差价</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TOrderLogistics.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TOrderLogistics.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 打开查看小件物流订单详情
+ */
+TOrderLogistics.detail = function () {
+    if(this.check()){
+        var index = layer.open({
+            type: 2,
+            title: '小件物流订单详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderLogistics/tOrderLogistics_detail/' + TOrderLogistics.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 取消订单
+ */
+TOrderLogistics.cancel = function(){
+    if (this.check()) {
+        var nickname = TOrderLogistics.seItem.orderNum;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该订单";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (TOrderLogistics.seItem.state == 5 || TOrderLogistics.seItem.state == 6 || TOrderLogistics.seItem.state == 9 || TOrderLogistics.seItem.state == 10 ) {
+            swal("取消失败", "该状态下不能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认取消订单" + nickname + "?",
+            text: "请谨慎操作,取消后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "取消订单",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOrderLogistics/cancel", function (data) {
+                swal("取消订单成功", "您已经成功取消了" + nickname + "。", "success");
+                TOrderLogistics.table.refresh();
+            }, function (data) {
+                swal("取消订单失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tOrderLogisticsId", TOrderLogistics.seItem.id);
+            ajax.start();
+        });
+    }
+}
+
+/**
+ * 删除小件物流订单
+ */
+TOrderLogistics.delete = function () {
+    if (this.check()) {
+        var orderNum = TOrderLogistics.seItem.orderNum;
+        if (orderNum == "" || orderNum == null || orderNum == undefined) {
+            orderNum = "该订单";
+        } else {
+            orderNum = "【" + orderNum + "】";
+        }
+        if (TOrderLogistics.seItem.state != 10) {
+            swal("删除失败", "【已取消】状态下才能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除" + orderNum + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOrderLogistics/delete", function (data) {
+                swal("删除成功", "您已经删除了" + orderNum + "。", "success");
+                TOrderLogistics.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tOrderLogisticsId", TOrderLogistics.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询小件物流订单列表
+ */
+TOrderLogistics.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['orderNum'] = $("#orderNum").val();
+    queryData['type'] = $("#type").val();
+    queryData['orderSource'] = $("#orderSource").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['userPhone'] = $("#userPhone").val();
+    queryData['recipient'] = $("#recipient").val();
+    queryData['recipientPhone'] = $("#recipientPhone").val();
+    queryData['driver'] = $("#driver").val();
+    queryData['state'] = $("#state").val();
+    TOrderLogistics.table.refresh({query: queryData});
+};
+
+TOrderLogistics.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#orderNum").val("");
+    $("#type").val("");
+    $("#orderSource").val("");
+    $("#userName").val("");
+    $("#userPhone").val("");
+    $("#recipient").val("");
+    $("#recipientPhone").val("");
+    $("#driver").val("");
+    $("#state").val("");
+    TOrderLogistics.search();
+};
+
+$(function () {
+    var defaultColunms = TOrderLogistics.initColumn();
+    var table = new BSTable(TOrderLogistics.id, "/tOrderLogistics/list", defaultColunms);
+    table.setPaginationType("server");
+    TOrderLogistics.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderLogistics/tOrderLogistics_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderLogistics/tOrderLogistics_info.js
new file mode 100644
index 0000000..f3a8225
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderLogistics/tOrderLogistics_info.js
@@ -0,0 +1,149 @@
+/**
+ * 初始化小件物流订单详情对话框
+ */
+var TOrderLogisticsInfoDlg = {
+    tOrderLogisticsInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TOrderLogisticsInfoDlg.clearData = function() {
+    this.tOrderLogisticsInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderLogisticsInfoDlg.set = function(key, val) {
+    this.tOrderLogisticsInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderLogisticsInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TOrderLogisticsInfoDlg.close = function() {
+    parent.layer.close(window.parent.TOrderLogistics.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TOrderLogisticsInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('type')
+    .set('userId')
+    .set('driverId')
+    .set('carId')
+    .set('orderNum')
+    .set('cargoType')
+    .set('cargoNumber')
+    .set('remark')
+    .set('placementLon')
+    .set('placementLat')
+    .set('placementAddress')
+    .set('startLon')
+    .set('startLat')
+    .set('startAddress')
+    .set('endLon')
+    .set('endLat')
+    .set('endAddress')
+    .set('recipient')
+    .set('recipientPhone')
+    .set('boardingLon')
+    .set('boardingLat')
+    .set('boardingAddress')
+    .set('boardingTime')
+    .set('getoffLon')
+    .set('getoffLat')
+    .set('getoffAddress')
+    .set('getoffTime')
+    .set('mileage')
+    .set('payManner')
+    .set('payType')
+    .set('orderMoney')
+    .set('travelMoney')
+    .set('tipMoney')
+    .set('redPacketMoney')
+    .set('couponMoney')
+    .set('redPacketId')
+    .set('couponId')
+    .set('discount')
+    .set('discountMoney')
+    .set('activityId')
+    .set('companyId')
+    .set('payMoney')
+    .set('state')
+    .set('insertTime')
+    .set('travelTime')
+    .set('snatchOrderTime')
+    .set('setOutTime')
+    .set('arriveTime')
+    .set('startServiceTime')
+    .set('endServiceTime')
+    .set('orderSource')
+    .set('invoiceId')
+    .set('trackId')
+    .set('isDelete')
+    .set('telX')
+    .set('bindId');
+}
+
+/**
+ * 提交添加
+ */
+TOrderLogisticsInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderLogistics/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TOrderLogistics.table.refresh();
+        TOrderLogisticsInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderLogisticsInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TOrderLogisticsInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderLogistics/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TOrderLogistics.table.refresh();
+        TOrderLogisticsInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderLogisticsInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderPrivateCar/tOrderPrivateCar.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderPrivateCar/tOrderPrivateCar.js
new file mode 100644
index 0000000..06d562c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderPrivateCar/tOrderPrivateCar.js
@@ -0,0 +1,379 @@
+/**
+ * 专车订单管理初始化
+ */
+var TOrderPrivateCar = {
+    id: "TOrderPrivateCarTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TOrderPrivateCar.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '下单时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单编号', field: 'orderNum', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderNum != '' && row.orderNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderNum + '" onfocus="TUser.tooltip()">' + row.orderNum + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单来源', field: 'orderSource', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderSource != '' && row.orderSource != null) {
+                    if (row.orderSource == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="APP下单" onfocus="TUser.tooltip()">APP下单</p>']
+                    } else if (row.orderSource == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="扫码下单" onfocus="TUser.tooltip()">扫码下单</p>']
+                    } else if (row.orderSource == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="小程序下单" onfocus="TUser.tooltip()">小程序下单</p>']
+                    } else if (row.orderSource == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="司机下单" onfocus="TUser.tooltip()">司机下单</p>']
+                    } else if (row.orderSource == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="调度下单" onfocus="TUser.tooltip()">调度下单</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '乘车时间', field: 'travelTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.travelTime != '' && row.travelTime != null) {
+                    var time = row.travelTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.travelTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用户id', field: 'userId', visible: false, align: 'center', valign: 'middle'},
+        {title: '下单用<br/>户昵称', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '下单用<br/>户手机', field: 'userPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userPhone != '' && row.userPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userPhone + '" onfocus="TUser.tooltip()">' + row.userPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '乘车用<br/>户姓名', field: 'passengers', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.passengers != '' && row.passengers != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.passengers + '" onfocus="TUser.tooltip()">' + row.passengers + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '乘车用<br/>户手机', field: 'passengersPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.passengersPhone != '' && row.passengersPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.passengersPhone + '" onfocus="TUser.tooltip()">' + row.passengersPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '起点', field: 'startAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.startAddress != '' && row.startAddress != null) {
+                    var str = row.startAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.startAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '终点', field: 'endAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.endAddress != '' && row.endAddress != null) {
+                    var str = row.endAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.endAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '选择车型', field: 'serverCarModel', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.serverCarModel != '' && row.serverCarModel != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.serverCarModel + '" onfocus="TUser.tooltip()">' + row.serverCarModel + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '接单司机', field: 'driver', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driver != '' && row.driver != null) {
+                    var driverName1 = row.driver.replace("-","<br>");
+                    var driverName2 = row.driver.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + driverName2 + '" onfocus="TUser.tooltip()">' + driverName1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '接单车辆', field: 'car', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.car != '' && row.car != null) {
+                    var car1 = row.car.replace("-","<br>");
+                    var car2 = row.car.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + car2 + '" onfocus="TUser.tooltip()">' + car1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单金额', field: 'orderMoney', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderMoney != '' && row.orderMoney != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderMoney + '" onfocus="TUser.tooltip()">' + row.orderMoney + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待接单" onfocus="TUser.tooltip()">待接单</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待出发" onfocus="TUser.tooltip()">待出发</p>']
+                    } else if (row.state == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待到达预约地点" onfocus="TUser.tooltip()">待到达预约地点</p>']
+                    } else if (row.state == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待乘客上车" onfocus="TUser.tooltip()">待乘客上车</p>']
+                    } else if (row.state == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="服务中" onfocus="TUser.tooltip()">服务中</p>']
+                    } else if (row.state == 6){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="完成服务" onfocus="TUser.tooltip()">完成服务</p>']
+                    } else if (row.state == 7){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待支付" onfocus="TUser.tooltip()">待支付</p>']
+                    } else if (row.state == 8){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待评价" onfocus="TUser.tooltip()">待评价</p>']
+                    } else if (row.state == 9){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已完成" onfocus="TUser.tooltip()">已完成</p>']
+                    } else if (row.state == 10){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
+                    } else if (row.state == 11){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="改派中" onfocus="TUser.tooltip()">改派中</p>']
+                    } else if (row.state == 12){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="取消待支付" onfocus="TUser.tooltip()">取消待支付</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TOrderPrivateCar.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TOrderPrivateCar.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 打开查看专车订单详情
+ */
+TOrderPrivateCar.orderDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '专车订单详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderPrivateCar/tOrderPrivateCar_orderDetail/' + TOrderPrivateCar.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 取消订单
+ */
+TOrderPrivateCar.cancelOrder = function(){
+    if (this.check()) {
+        var nickname = TOrderPrivateCar.seItem.orderNum;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该订单";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (TOrderPrivateCar.seItem.state == 7 || TOrderPrivateCar.seItem.state == 8 || TOrderPrivateCar.seItem.state == 9 || TOrderPrivateCar.seItem.state == 10 ) {
+            swal("取消失败", "【待评价】【已完成】【已取消】状态下不能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认取消订单" + nickname + "?",
+            text: "请谨慎操作,取消后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "取消订单",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/cancel", function (data) {
+                layer.msg("加载中...",{
+                    icon:16,
+                    time:-1
+                });
+                swal("取消订单成功", "您已经成功取消了" + nickname + "。", "success");
+                TOrderPrivateCar.table.refresh();
+                layer.closeAll()
+            }, function (data) {
+                swal("取消订单失败", data.responseJSON.message + "!", "warning");
+                layer.closeAll()
+            });
+            ajax.set("tOrderPrivateCarId", TOrderPrivateCar.seItem.id);
+            ajax.start();
+        });
+    }
+}
+
+/**
+ * 订单轨迹
+ */
+TOrderPrivateCar.trajectory = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '专车订单轨迹',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderPrivateCar/tOrderPrivateCar_trajectory/' + TOrderPrivateCar.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+
+/**
+ * 删除专车订单
+ */
+TOrderPrivateCar.deleteOrder = function () {
+    if (this.check()) {
+        var orderNum = TOrderPrivateCar.seItem.orderNum;
+        if (orderNum == "" || orderNum == null || orderNum == undefined) {
+            orderNum = "该订单";
+        } else {
+            orderNum = "【" + orderNum + "】";
+        }
+        if (TOrderPrivateCar.seItem.state != 10) {
+            swal("删除失败", "【已取消】状态下才能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除" + orderNum + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/delete", function (data) {
+                swal("删除成功", "您已经删除了" + orderNum + "。", "success");
+                TOrderPrivateCar.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tOrderPrivateCarId", TOrderPrivateCar.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询专车订单列表
+ */
+TOrderPrivateCar.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['orderNum'] = $("#orderNum").val();
+    queryData['orderSource'] = $("#orderSource").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['userPhone'] = $("#userPhone").val();
+    queryData['passengers'] = $("#passengers").val();
+    queryData['passengersPhone'] = $("#passengersPhone").val();
+    queryData['serverCarModelId'] = $("#serverCarModelId").val();
+    queryData['driver'] = $("#driver").val();
+    queryData['state'] = $("#state").val();
+    TOrderPrivateCar.table.refresh({query: queryData});
+};
+
+TOrderPrivateCar.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#orderNum").val("");
+    $("#orderSource").val("");
+    $("#userName").val("");
+    $("#userPhone").val("");
+    $("#passengers").val("");
+    $("#passengersPhone").val("");
+    $("#serverCarModelId").val("");
+    $("#driver").val("");
+    $("#state").val("");
+    TOrderPrivateCar.search();
+};
+
+$(function () {
+    var defaultColunms = TOrderPrivateCar.initColumn();
+    var table = new BSTable(TOrderPrivateCar.id, "/tOrderPrivateCar/list", defaultColunms);
+    table.setPaginationType("server");
+    TOrderPrivateCar.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderPrivateCar/tOrderPrivateCar_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderPrivateCar/tOrderPrivateCar_info.js
new file mode 100644
index 0000000..b18641b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderPrivateCar/tOrderPrivateCar_info.js
@@ -0,0 +1,248 @@
+/**
+ * 初始化专车订单详情对话框
+ */
+var TOrderPrivateCarInfoDlg = {
+    tOrderPrivateCarInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TOrderPrivateCarInfoDlg.clearData = function() {
+    this.tOrderPrivateCarInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderPrivateCarInfoDlg.set = function(key, val) {
+    this.tOrderPrivateCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderPrivateCarInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TOrderPrivateCarInfoDlg.close = function() {
+    parent.layer.close(window.parent.TOrderPrivateCar.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TOrderPrivateCarInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('type')
+    .set('userId')
+    .set('driverId')
+    .set('carId')
+    .set('orderNum')
+    .set('placementLon')
+    .set('placementLat')
+    .set('placementAddress')
+    .set('startLon')
+    .set('startLat')
+    .set('endLon')
+    .set('startAddress')
+    .set('endLat')
+    .set('endAddress')
+    .set('boardingLon')
+    .set('boardingLat')
+    .set('boardingAddress')
+    .set('boardingTime')
+    .set('getoffLon')
+    .set('getoffLat')
+    .set('getoffAddress')
+    .set('getoffTime')
+    .set('mileage')
+    .set('payManner')
+    .set('payType')
+    .set('orderMoney')
+    .set('startMoney')
+    .set('mileageMoney')
+    .set('durationMoney')
+    .set('longDistanceMoney')
+    .set('parkMoney')
+    .set('roadTollMoney')
+    .set('redPacketMoney')
+    .set('couponMoney')
+    .set('redPacketId')
+    .set('couponId')
+    .set('discount')
+    .set('discountMoney')
+    .set('activityId')
+    .set('companyId')
+    .set('payMoney')
+    .set('substitute')
+    .set('passengers')
+    .set('passengersPhone')
+    .set('state')
+    .set('insertTime')
+    .set('travelTime')
+    .set('snatchOrderTime')
+    .set('setOutTime')
+    .set('arriveTime')
+    .set('startServiceTime')
+    .set('endServiceTime')
+    .set('orderType')
+    .set('orderSource')
+    .set('invoiceId')
+    .set('isReassign')
+    .set('reassignNotice')
+    .set('trackId')
+    .set('isDelete')
+    .set('oldState')
+    .set('telX')
+    .set('bindId')
+    .set('serverCarModelId');
+}
+
+/**
+ * 提交添加
+ */
+TOrderPrivateCarInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TOrderPrivateCar.table.refresh();
+        TOrderPrivateCarInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderPrivateCarInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TOrderPrivateCarInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TOrderPrivateCar.table.refresh();
+        TOrderPrivateCarInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderPrivateCarInfoData);
+    ajax.start();
+}
+
+var map = new AMap.Map("container", {
+    resizeEnable: true,
+    zoom: 14
+});
+$(function() {
+    getTrajectory();
+});
+
+function getTrajectory() {
+    $.ajax({
+        url: Feng.ctxPath + '/tOrderPrivateCar/getOrderTrack',
+        type: 'POST',
+        data:{
+            orderDetailId: $("#id").val()
+        },
+        success: function (res) {
+            if(res.status == 200){
+                var data = res.data;
+                if(data.length > 0){
+                    orderTrack(data);
+                }/*else{
+                    Feng.error("当前订单没有轨迹");
+                }*/
+            }else{
+                Feng.error(res.msg);
+            }
+        }
+    });
+}
+
+var marker, lineArr = [];
+
+function orderTrack(data) {
+    for(var i in data){
+        var waypoints = [];
+        var lon = parseFloat(data[i].lon);
+        var lat = parseFloat(data[i].lat);
+        waypoints.push(lon);
+        waypoints.push(lat);
+        lineArr.push(waypoints);
+    }
+
+    marker = new AMap.Marker({
+        map: map,
+        position: lineArr[0],
+        icon: "https://webapi.amap.com/images/car.png",
+        offset: new AMap.Pixel(-26, -13),
+        autoRotation: true,
+        angle:-90,
+    });
+
+    // 绘制轨迹
+    var polyline = new AMap.Polyline({
+        map: map,
+        path: lineArr,
+        showDir:true,
+        strokeColor: "#28F",  //线颜色
+        // strokeOpacity: 1,     //线透明度
+        strokeWeight: 6,      //线宽
+        // strokeStyle: "solid"  //线样式
+    });
+
+    var passedPolyline = new AMap.Polyline({
+        map: map,
+        // path: lineArr,
+        strokeColor: "#AF5",  //线颜色
+        // strokeOpacity: 1,     //线透明度
+        strokeWeight: 6,      //线宽
+        // strokeStyle: "solid"  //线样式
+    });
+
+
+    marker.on('moving', function (e) {
+        passedPolyline.setPath(e.passedPath);
+    });
+
+    map.setFitView();
+}
+
+
+function startAnimation () {
+    marker.moveAlong(lineArr, 200);
+}
+
+function pauseAnimation () {
+    marker.pauseMove();
+}
+
+function resumeAnimation () {
+    marker.resumeMove();
+}
+
+function stopAnimation () {
+    marker.stopMove();
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/selectDriver.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/selectDriver.js
new file mode 100644
index 0000000..43b492e
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/selectDriver.js
@@ -0,0 +1,150 @@
+/**
+ * 选择司机
+ */
+var SelectDriver = {
+    id: "SelectDriverTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SelectDriver.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle',width:'10%'},
+        {title: '姓名', field: 'name', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '头像', field: 'headImgUrl', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                if (row.headImgUrl == null || row.headImgUrl == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.headImgUrl + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '手机号', field: 'phone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.phone != '' && row.phone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.phone + '" onfocus="TUser.tooltip()">' + row.phone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '性别', field: 'sex', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.sex != '' && row.sex != null) {
+                    if (row.sex == 1) {
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="男" onfocus="TUser.tooltip()">男</p>']
+                    }else if (row.sex == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="女" onfocus="TUser.tooltip()">女</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '所属<br/>分公司', field: 'companyName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyName != '' && row.companyName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyName + '" onfocus="TUser.tooltip()">' + row.companyName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '所属<br/>加盟商', field: 'franchiseeName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.franchiseeName != '' && row.franchiseeName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.franchiseeName + '" onfocus="TUser.tooltip()">' + row.franchiseeName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+SelectDriver.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        SelectDriver.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 查询司机审核列表列表
+ */
+SelectDriver.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['phone'] = $("#phone").val();
+    SelectDriver.table.refresh({query: queryData});
+};
+SelectDriver.resetSearch = function () {
+    $("#name").val("");
+    $("#phone").val("");
+    SelectDriver.search();
+};
+
+$(function () {
+    var orderId = $("#id").val();
+    var defaultColunms = SelectDriver.initColumn();
+    var table = new BSTable(SelectDriver.id, "/tOrderTaxi/selectDriver/"+orderId, defaultColunms);
+    table.setPaginationType("server");
+    SelectDriver.table = table.init();
+});
+
+/**
+ * 关闭此对话框
+ */
+SelectDriver.close = function() {
+    parent.layer.close(window.parent.TOrderTaxi.layerIndex);
+}
+
+/**
+ * 选择司机
+ */
+SelectDriver.selectDriver = function () {
+   /* var selected = $("#"+ this.id).bootstrapTable('getSelections');
+    if (selected.length== 0) {
+        Feng.info("请选择司机!");
+        return ;
+    }*/
+    if (this.check()) {
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/tOrderTaxi/selectDriver", function(data){
+            Feng.success("改派成功!");
+            window.parent.TOrderTaxi.table.refresh();
+            SelectDriver.close();
+        },function(data){
+            Feng.error("修改失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("orderId",$("#id").val());
+        ajax.set("driverId",SelectDriver.seItem.id);
+        ajax.start();
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/tOrderTaxi.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/tOrderTaxi.js
new file mode 100644
index 0000000..177e68b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/tOrderTaxi.js
@@ -0,0 +1,405 @@
+/**
+ * 出租车订单管理初始化
+ */
+var TOrderTaxi = {
+    id: "TOrderTaxiTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TOrderTaxi.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '下单时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单编号', field: 'orderNum', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderNum != '' && row.orderNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderNum + '" onfocus="TUser.tooltip()">' + row.orderNum+ '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单来源', field: 'orderSource', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderSource != '' && row.orderSource != null) {
+                    if (row.orderSource == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="APP下单" onfocus="TUser.tooltip()">APP下单</p>']
+                    } else if (row.orderSource == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="扫码下单" onfocus="TUser.tooltip()">扫码下单</p>']
+                    } else if (row.orderSource == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="小程序下单" onfocus="TUser.tooltip()">小程序下单</p>']
+                    } else if (row.orderSource == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="司机下单" onfocus="TUser.tooltip()">司机下单</p>']
+                    } else if (row.orderSource == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="调度下单" onfocus="TUser.tooltip()">调度下单</p>']
+                    } else if (row.orderSource == 6){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="道行龙城下单" onfocus="TUser.tooltip()">道行龙城下单</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '乘车时间', field: 'travelTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.travelTime != '' && row.travelTime != null) {
+                    var time = row.travelTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.travelTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用户id', field: 'userId', visible: false, align: 'center', valign: 'middle'},
+        {title: '下单用<br/>户昵称', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '下单用<br/>户手机', field: 'userPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userPhone != '' && row.userPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userPhone + '" onfocus="TUser.tooltip()">' + row.userPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '乘车用<br/>户姓名', field: 'passengers', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.passengers != '' && row.passengers != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.passengers + '" onfocus="TUser.tooltip()">' + row.passengers + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '乘车用<br/>户手机', field: 'passengersPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.passengersPhone != '' && row.passengersPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.passengersPhone + '" onfocus="TUser.tooltip()">' + row.passengersPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '起点', field: 'startAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.startAddress != '' && row.startAddress != null) {
+                    var str = row.startAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.startAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '终点', field: 'endAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.endAddress != '' && row.endAddress != null) {
+                    var str = row.endAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.endAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '接单司机', field: 'driver', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.driver != '' && row.driver != null) {
+                    var driverName1 = row.driver.replace("-","<br>");
+                    var driverName2 = row.driver.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + driverName2 + '" onfocus="TUser.tooltip()">' + driverName1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '接单车辆', field: 'car', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.car != '' && row.car != null) {
+                    var car1 = row.car.replace("-","<br>");
+                    var car2 = row.car.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + car2 + '" onfocus="TUser.tooltip()">' + car1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单金额', field: 'orderMoney', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderMoney != '' && row.orderMoney != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderMoney + '" onfocus="TUser.tooltip()">' + row.orderMoney + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待接单" onfocus="TUser.tooltip()">待接单</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待出发" onfocus="TUser.tooltip()">待出发</p>']
+                    } else if (row.state == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待到达预约地点" onfocus="TUser.tooltip()">待到达预约地点</p>']
+                    } else if (row.state == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待乘客上车" onfocus="TUser.tooltip()">待乘客上车</p>']
+                    } else if (row.state == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="服务中" onfocus="TUser.tooltip()">服务中</p>']
+                    } else if (row.state == 6){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="完成服务" onfocus="TUser.tooltip()">完成服务</p>']
+                    } else if (row.state == 7){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待支付" onfocus="TUser.tooltip()">待支付</p>']
+                    } else if (row.state == 8){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待评价" onfocus="TUser.tooltip()">待评价</p>']
+                    } else if (row.state == 9){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已完成" onfocus="TUser.tooltip()">已完成</p>']
+                    } else if (row.state == 10){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
+                    } else if (row.state == 11){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="改派中" onfocus="TUser.tooltip()">改派中</p>']
+                    } else if (row.state == 12){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="取消待支付" onfocus="TUser.tooltip()">取消待支付</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TOrderTaxi.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TOrderTaxi.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加出租车订单
+ */
+TOrderTaxi.openAddTOrderTaxi = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加出租车订单',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tOrderTaxi/tOrderTaxi_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看出租车订单详情
+ */
+TOrderTaxi.detail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '出租车订单详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderTaxi/tOrderTaxi_update/' + TOrderTaxi.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 取消订单
+ */
+TOrderTaxi.cancel = function(){
+    if (this.check()) {
+        var nickname = TOrderTaxi.seItem.orderNum;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该订单";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (TOrderTaxi.seItem.state == 8 || TOrderTaxi.seItem.state == 9 || TOrderTaxi.seItem.state == 10 ) {
+            swal("取消失败", "【待评价】【已完成】【已取消】状态下不能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认取消订单" + nickname + "?",
+            text: "请谨慎操作,取消后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "取消订单",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOrderTaxi/cancel", function (data) {
+                swal("取消订单成功", "您已经成功取消了" + nickname + "。", "success");
+                TOrderTaxi.table.refresh();
+            }, function (data) {
+                swal("取消订单失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tOrderTaxiId", TOrderTaxi.seItem.id);
+            ajax.start();
+        });
+    }
+}
+
+/**
+ * 删除出租车订单
+ */
+TOrderTaxi.delete = function () {
+    if (this.check()) {
+        var nickname = TOrderTaxi.seItem.orderNum;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该订单";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (TOrderTaxi.seItem.state != 10) {
+            swal("删除失败", "【已取消】状态下才能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除" + nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOrderTaxi/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "。", "success");
+                TOrderTaxi.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tOrderTaxiId", TOrderTaxi.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 改派订单操作
+ */
+TOrderTaxi.changeOrder = function(){
+    if (this.check()) {
+        var nickname = TOrderTaxi.seItem.orderNum;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该订单";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (TOrderTaxi.seItem.state != 11) {
+            swal("改派失败", "【改派中】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '出租车订单改派',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderTaxi/tOrderTaxi_changeOrder/' + TOrderTaxi.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+/**
+ * 订单轨迹
+ */
+TOrderTaxi.trajectory = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '出租车订单轨迹',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderTaxi/tOrderTaxi_trajectory/' + TOrderTaxi.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+/**
+ * 查询出租车订单列表
+ */
+TOrderTaxi.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['orderNum'] = $("#orderNum").val();
+    queryData['orderSource'] = $("#orderSource").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['userPhone'] = $("#userPhone").val();
+    queryData['passengers'] = $("#passengers").val();
+    queryData['passengersPhone'] = $("#passengersPhone").val();
+    queryData['driver'] = $("#driver").val();
+    queryData['state'] = $("#state").val();
+    TOrderTaxi.table.refresh({query: queryData});
+};
+
+TOrderTaxi.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#orderNum").val("");
+    $("#orderSource").val("");
+    $("#userName").val("");
+    $("#userPhone").val("");
+    $("#passengers").val("");
+    $("#passengersPhone").val("");
+    $("#driver").val("");
+    $("#state").val("");
+    TOrderTaxi.search();
+};
+
+$(function () {
+    var defaultColunms = TOrderTaxi.initColumn();
+    var table = new BSTable(TOrderTaxi.id, "/tOrderTaxi/list", defaultColunms);
+    table.setPaginationType("server");
+    TOrderTaxi.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/tOrderTaxi_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/tOrderTaxi_info.js
new file mode 100644
index 0000000..c53d3af
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tOrderTaxi/tOrderTaxi_info.js
@@ -0,0 +1,236 @@
+/**
+ * 初始化出租车订单详情对话框
+ */
+var TOrderTaxiInfoDlg = {
+    tOrderTaxiInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TOrderTaxiInfoDlg.clearData = function() {
+    this.tOrderTaxiInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderTaxiInfoDlg.set = function(key, val) {
+    this.tOrderTaxiInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderTaxiInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TOrderTaxiInfoDlg.close = function() {
+    parent.layer.close(window.parent.TOrderTaxi.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TOrderTaxiInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('userId')
+    .set('driverId')
+    .set('carId')
+    .set('orderNum')
+    .set('placementLon')
+    .set('placementLat')
+    .set('placementAddress')
+    .set('startLon')
+    .set('startLat')
+    .set('endLon')
+    .set('startAddress')
+    .set('endLat')
+    .set('endAddress')
+    .set('boardingLon')
+    .set('boardingLat')
+    .set('boardingAddress')
+    .set('boardingTime')
+    .set('getoffLon')
+    .set('getoffLat')
+    .set('getoffAddress')
+    .set('getoffTime')
+    .set('mileage')
+    .set('payManner')
+    .set('payType')
+    .set('orderMoney')
+    .set('travelMoney')
+    .set('parkMoney')
+    .set('roadTollMoney')
+    .set('tipMoney')
+    .set('redPacketMoney')
+    .set('couponMoney')
+    .set('redPacketId')
+    .set('couponId')
+    .set('companyId')
+    .set('payMoney')
+    .set('substitute')
+    .set('passengers')
+    .set('passengersPhone')
+    .set('state')
+    .set('insertTime')
+    .set('travelTime')
+    .set('snatchOrderTime')
+    .set('setOutTime')
+    .set('arriveTime')
+    .set('startServiceTime')
+    .set('endServiceTime')
+    .set('orderType')
+    .set('orderSource')
+    .set('invoiceId')
+    .set('isReassign');
+}
+
+/**
+ * 提交添加
+ */
+TOrderTaxiInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderTaxi/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TOrderTaxi.table.refresh();
+        TOrderTaxiInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderTaxiInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TOrderTaxiInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderTaxi/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TOrderTaxi.table.refresh();
+        TOrderTaxiInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderTaxiInfoData);
+    ajax.start();
+}
+
+
+var map = new AMap.Map("container", {
+    resizeEnable: true,
+    zoom: 14
+});
+$(function() {
+    getTrajectory();
+});
+
+function getTrajectory() {
+    $.ajax({
+        url: Feng.ctxPath + '/tOrderTaxi/getOrderTrack',
+        type: 'POST',
+        data:{
+            orderDetailId: $("#id").val()
+        },
+        success: function (res) {
+            if(res.status == 200){
+                var data = res.data;
+                if(data.length > 0){
+                    orderTrack(data);
+                }/*else{
+                    Feng.error("当前订单没有轨迹");
+                }*/
+            }else{
+                Feng.error(res.msg);
+            }
+        }
+    });
+}
+
+var marker, lineArr = [];
+
+function orderTrack(data) {
+    for(var i in data){
+        var waypoints = [];
+        var lon = parseFloat(data[i].lon);
+        var lat = parseFloat(data[i].lat);
+        waypoints.push(lon);
+        waypoints.push(lat);
+        lineArr.push(waypoints);
+    }
+
+    marker = new AMap.Marker({
+        map: map,
+        position: lineArr[0],
+        icon: "https://webapi.amap.com/images/car.png",
+        offset: new AMap.Pixel(-26, -13),
+        autoRotation: true,
+        angle:-90,
+    });
+
+    // 绘制轨迹
+    var polyline = new AMap.Polyline({
+        map: map,
+        path: lineArr,
+        showDir:true,
+        strokeColor: "#28F",  //线颜色
+        // strokeOpacity: 1,     //线透明度
+        strokeWeight: 6,      //线宽
+        // strokeStyle: "solid"  //线样式
+    });
+
+    var passedPolyline = new AMap.Polyline({
+        map: map,
+        // path: lineArr,
+        strokeColor: "#AF5",  //线颜色
+        // strokeOpacity: 1,     //线透明度
+        strokeWeight: 6,      //线宽
+        // strokeStyle: "solid"  //线样式
+    });
+
+
+    marker.on('moving', function (e) {
+        passedPolyline.setPath(e.passedPath);
+    });
+
+    map.setFitView();
+}
+
+
+function startAnimation () {
+    marker.moveAlong(lineArr, 200);
+}
+
+function pauseAnimation () {
+    marker.pauseMove();
+}
+
+function resumeAnimation () {
+    marker.resumeMove();
+}
+
+function stopAnimation () {
+    marker.stopMove();
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tProblem/tProblem.js b/management/guns-admin/src/main/webapp/static/modular/system/tProblem/tProblem.js
new file mode 100644
index 0000000..6e38610
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tProblem/tProblem.js
@@ -0,0 +1,182 @@
+/**
+ * 用户留言管理管理初始化
+ */
+var TProblem = {
+    id: "TProblemTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TProblem.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '提问时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用户id', field: 'userId', visible: false, align: 'center', valign: 'middle'},
+        {title: '留言用户', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '留言用户<br/>电话', field: 'userPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userPhone != '' && row.userPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userPhone + '" onfocus="TUser.tooltip()">' + row.userPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '提问<br/>内容', field: 'content', visible: true, align: 'center', valign: 'middle',width:'20%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.content != '' && row.content != null) {
+                    var str = row.content;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TProblem.buttonClick(' +  row.id+','+ 1+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.content + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '处理状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待处理" onfocus="AppUserInfo.tooltip()">待处理</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已处理" onfocus="AppUserInfo.tooltip()">已处理</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '处理时间', field: 'handleTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.handleTime != '' && row.handleTime != null) {
+                    var time = row.handleTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.handleTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '回复内容', field: 'answer', visible: true, align: 'center', valign: 'middle',width:'20%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.answer != '' && row.answer != null) {
+                    var str = row.answer;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TProblem.buttonClick(' +  row.id+','+ 2+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.answer + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '处理人id', field: 'handleUserId', visible: false, align: 'center', valign: 'middle'},
+        {title: '处理人', field: 'handleUserName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.handleUserName != '' && row.handleUserName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.handleUserName + '" onfocus="TUser.tooltip()">' + row.handleUserName + '</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 查看更多按钮
+ * @param con
+ */
+TProblem.buttonClick = function (id,type) {
+    var index = layer.open({
+        type: 2,
+        title: '查看详情',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tProblem/lookDetail/'+id+"/"+type
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 检查是否选中
+ */
+TProblem.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TProblem.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 立即处理
+ */
+TProblem.immediately = function () {
+    if (this.check()) {
+        var state = TProblem.seItem.state;
+        if (2 == state){
+            swal("操作失败", "【待处理】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即处理',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tProblem/tProblem_immediately/' + TProblem.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 查询用户留言管理列表
+ */
+TProblem.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['state'] = $("#state").val();
+    TProblem.table.refresh({query: queryData});
+};
+TProblem.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#userName").val("");
+    $("#state").val("");
+    TProblem.search();
+};
+$(function () {
+    var defaultColunms = TProblem.initColumn();
+    var table = new BSTable(TProblem.id, "/tProblem/list", defaultColunms);
+    table.setPaginationType("server");
+    TProblem.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tProblem/tProblem_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tProblem/tProblem_info.js
new file mode 100644
index 0000000..e83df21
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tProblem/tProblem_info.js
@@ -0,0 +1,111 @@
+/**
+ * 初始化用户留言管理详情对话框
+ */
+var TProblemInfoDlg = {
+    tProblemInfoData : {},
+    validateFields: {
+        answer: {
+            validators: {
+                notEmpty: {
+                    message: '回复内容不能为空'
+                }/*,
+                regexp: {
+                    regexp: /^.{1,500}$/,
+                    message: '回复内容不能超过500个长度'
+                }*/
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TProblemInfoDlg.validate = function () {
+    $('#problemInfoForm').data("bootstrapValidator").resetForm();
+    $('#problemInfoForm').bootstrapValidator('validate');
+    return $("#problemInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TProblemInfoDlg.clearData = function() {
+    this.tProblemInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TProblemInfoDlg.set = function(key, val) {
+    this.tProblemInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TProblemInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TProblemInfoDlg.close = function() {
+    parent.layer.close(window.parent.TProblem.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TProblemInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('userId')
+    .set('content')
+    .set('answer')
+    .set('handleUserId')
+    .set('handleTime')
+    .set('insertTime')
+    .set('state');
+}
+
+/**
+ * 立即处理
+ */
+TProblemInfoDlg.immediately = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var answer = $("#answer").val();
+    if (answer.length > 500){
+        Feng.info("回复内容不能超过500个字");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tProblem/immediately", function(data){
+        Feng.success("处理成功!");
+        window.parent.TProblem.table.refresh();
+        TProblemInfoDlg.close();
+    },function(data){
+        Feng.error("处理失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("tProblemId",$("#tProblemId").val());
+    ajax.set("answer",answer);
+    ajax.start();
+}
+
+
+$(function() {
+    Feng.initValidator("problemInfoForm", TProblemInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tPubWithdrawal/tPubWithdrawal.js b/management/guns-admin/src/main/webapp/static/modular/system/tPubWithdrawal/tPubWithdrawal.js
new file mode 100644
index 0000000..3b5600b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tPubWithdrawal/tPubWithdrawal.js
@@ -0,0 +1,197 @@
+/**
+ * 提现列表管理初始化
+ */
+var TPubWithdrawal = {
+    id: "TPubWithdrawalTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TPubWithdrawal.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '申请时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '提现人', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '提现方式', field: 'withdrawalType', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.withdrawalType != '' && row.withdrawalType != null) {
+                    if (row.withdrawalType == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="银行卡" onfocus="TUser.tooltip()">银行卡</p>']
+                    } else if (row.withdrawalType == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="线下" onfocus="TUser.tooltip()">线下</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '账户余额', field: 'balance', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.money != '' && row.money != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.money + '" onfocus="TUser.tooltip()">' + row.money + '</p>']
+                }else if (row.withdrawalType == 2){
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '提现金额', field: 'money', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.money != '' && row.money != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.money + '" onfocus="TUser.tooltip()">' + row.money + '</p>']
+                }else if (row.withdrawalType == 2){
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '联系人', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '联系电话', field: 'userPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userPhone != '' && row.userPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userPhone + '" onfocus="TUser.tooltip()">' + row.userPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.remark != '' && row.remark != null) {
+                    var str = row.remark;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TPubWithdrawal.buttonClick(' +  row.id+','+ 1+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.remark + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if(row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="待处理" onfocus="TUser.tooltip()">待处理</p>']
+                    }else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已同意" onfocus="TUser.tooltip()">已同意</p>']
+                    }else if (row.state == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已拒绝" onfocus="TUser.tooltip()">已拒绝</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 查看更多按钮
+ * @param con
+ */
+TPubWithdrawal.buttonClick = function (id,type) {
+    var index = layer.open({
+        type: 2,
+        title: '查看详情',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tPubWithdrawal/lookDetail/'+id+"/"+type
+    });
+    this.layerIndex = index;
+}
+
+
+/**
+ * 检查是否选中
+ */
+TPubWithdrawal.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TPubWithdrawal.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 打开立即处理页面
+ */
+TPubWithdrawal.immediately = function () {
+    if (this.check()) {
+        var state = TPubWithdrawal.seItem.state;
+        if (1 != state){
+            swal("操作失败", "【待处理】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即处理',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tPubWithdrawal/tPubWithdrawal_immediately/' + TPubWithdrawal.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 查询提现列表列表
+ */
+TPubWithdrawal.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['withdrawalType'] = $("#withdrawalType").val();
+    TPubWithdrawal.table.refresh({query: queryData});
+};
+
+TPubWithdrawal.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#name").val("");
+    $("#withdrawalType").val("");
+    TPubWithdrawal.search();
+};
+
+$(function () {
+    var defaultColunms = TPubWithdrawal.initColumn();
+    var table = new BSTable(TPubWithdrawal.id, "/tPubWithdrawal/list", defaultColunms);
+    table.setPaginationType("server");
+    TPubWithdrawal.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tPubWithdrawal/tPubWithdrawal_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tPubWithdrawal/tPubWithdrawal_info.js
new file mode 100644
index 0000000..1590b5f
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tPubWithdrawal/tPubWithdrawal_info.js
@@ -0,0 +1,119 @@
+/**
+ * 初始化提现列表详情对话框
+ */
+var TPubWithdrawalInfoDlg = {
+    tPubWithdrawalInfoData : {},
+    validateFields: {
+        remark: {
+            validators: {
+                notEmpty: {
+                    message: '备注不能为空'
+                }/*,
+                regexp: {
+                    regexp: /^.{1,250}$/,
+                    message: '备注不能超过250个长度'
+                }*/
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TPubWithdrawalInfoDlg.validate = function () {
+    $('#withdrawalInfoForm').data("bootstrapValidator").resetForm();
+    $('#withdrawalInfoForm').bootstrapValidator('validate');
+    return $("#withdrawalInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TPubWithdrawalInfoDlg.clearData = function() {
+    this.tPubWithdrawalInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TPubWithdrawalInfoDlg.set = function(key, val) {
+    this.tPubWithdrawalInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TPubWithdrawalInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TPubWithdrawalInfoDlg.close = function() {
+    parent.layer.close(window.parent.TPubWithdrawal.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TPubWithdrawalInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('userId')
+    .set('handleTime')
+    .set('balance')
+    .set('money')
+    .set('state')
+    .set('remark')
+    .set('code')
+    .set('name')
+    .set('userType')
+    .set('insertTime')
+    .set('flag')
+    .set('withdrawalType');
+}
+
+/**
+ * 立即处理
+ */
+TPubWithdrawalInfoDlg.immediately = function(){
+
+    this.clearData();
+    this.collectData();
+
+    if(!this.validate()){
+        return ;
+    }
+    var remark = $("#remark").val();
+    if (remark.length > 250){
+        Feng.info("备注不能超过250个字");
+        return;
+    }
+    var state = $("input[name='state']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tPubWithdrawal/immediately", function(data){
+        Feng.success("处理成功!");
+        window.parent.TPubWithdrawal.table.refresh();
+        TPubWithdrawalInfoDlg.close();
+    },function(data){
+        Feng.error("处理失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("state",state);
+    ajax.set("remark",$("#remark").val());
+    ajax.start();
+}
+
+
+$(function() {
+    Feng.initValidator("withdrawalInfoForm", TPubWithdrawalInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectCrossDriver.js b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectCrossDriver.js
new file mode 100644
index 0000000..020b5a4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectCrossDriver.js
@@ -0,0 +1,156 @@
+/**
+ * 选择司机
+ */
+var SelectCrossDriver = {
+    id: "SelectCrossDriverTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SelectCrossDriver.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle',width:'10%'},
+        {title: '姓名', field: 'name', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '头像', field: 'headImgUrl', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                if (row.headImgUrl == null || row.headImgUrl == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.headImgUrl + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '手机号', field: 'phone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.phone != '' && row.phone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.phone + '" onfocus="TUser.tooltip()">' + row.phone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '性别', field: 'sex', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.sex != '' && row.sex != null) {
+                    if (row.sex == 1) {
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="男" onfocus="TUser.tooltip()">男</p>']
+                    }else if (row.sex == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="女" onfocus="TUser.tooltip()">女</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '所属<br/>分公司', field: 'companyName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyName != '' && row.companyName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyName + '" onfocus="TUser.tooltip()">' + row.companyName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '所属<br/>加盟商', field: 'franchiseeName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.franchiseeName != '' && row.franchiseeName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.franchiseeName + '" onfocus="TUser.tooltip()">' + row.franchiseeName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+SelectCrossDriver.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        SelectCrossDriver.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 查询司机审核列表列表
+ */
+SelectCrossDriver.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['phone'] = $("#phone").val();
+    SelectCrossDriver.table.refresh({query: queryData});
+};
+SelectCrossDriver.resetSearch = function () {
+    $("#name").val("");
+    $("#phone").val("");
+    SelectCrossDriver.search();
+};
+
+$(function () {
+    var orderId = $("#id").val();
+    var defaultColunms = SelectCrossDriver.initColumn();
+    var table = new BSTable(SelectCrossDriver.id, "/tReassign/selectCrossDriver/"+orderId, defaultColunms);
+    table.setPaginationType("server");
+    SelectCrossDriver.table = table.init();
+});
+
+/**
+ * 关闭此对话框
+ */
+SelectCrossDriver.close = function() {
+    parent.layer.close(window.parent.TCross.layerIndex);
+}
+
+/**
+ * 选择司机
+ */
+SelectCrossDriver.selectDriver = function () {
+    /* var selected = $("#"+ this.id).bootstrapTable('getSelections');
+     if (selected.length== 0) {
+         Feng.info("请选择司机!");
+         return ;
+     }*/
+    if (this.check()) {
+        //提交信息
+        layer.msg("加载中...",{
+            icon:16,
+            time:-1
+        });
+        var ajax = new $ax(Feng.ctxPath + "/tReassign/selectCrossDriver", function(data){
+            Feng.success("改派成功!");
+            window.parent.TCross.table.refresh();
+            SelectCrossDriver.close();
+            layer.closeAll()
+        },function(data){
+            Feng.error("修改失败!" + data.responseJSON.message + "!");
+            layer.closeAll()
+        });
+        ajax.set("orderId",$("#id").val());
+        ajax.set("driverId",SelectCrossDriver.seItem.id);
+        ajax.start();
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectPrivateCarDriver.js b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectPrivateCarDriver.js
new file mode 100644
index 0000000..b9e17bb
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectPrivateCarDriver.js
@@ -0,0 +1,156 @@
+/**
+ * 选择司机
+ */
+var SelectPrivateCarDriver = {
+    id: "SelectPrivateCarDriverTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SelectPrivateCarDriver.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle',width:'10%'},
+        {title: '姓名', field: 'name', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '头像', field: 'headImgUrl', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                if (row.headImgUrl == null || row.headImgUrl == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.headImgUrl + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '手机号', field: 'phone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.phone != '' && row.phone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.phone + '" onfocus="TUser.tooltip()">' + row.phone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '性别', field: 'sex', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.sex != '' && row.sex != null) {
+                    if (row.sex == 1) {
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="男" onfocus="TUser.tooltip()">男</p>']
+                    }else if (row.sex == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="女" onfocus="TUser.tooltip()">女</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '所属<br/>分公司', field: 'companyName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyName != '' && row.companyName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyName + '" onfocus="TUser.tooltip()">' + row.companyName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '所属<br/>加盟商', field: 'franchiseeName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.franchiseeName != '' && row.franchiseeName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.franchiseeName + '" onfocus="TUser.tooltip()">' + row.franchiseeName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+SelectPrivateCarDriver.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        SelectPrivateCarDriver.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 查询司机审核列表列表
+ */
+SelectPrivateCarDriver.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['phone'] = $("#phone").val();
+    SelectPrivateCarDriver.table.refresh({query: queryData});
+};
+SelectPrivateCarDriver.resetSearch = function () {
+    $("#name").val("");
+    $("#phone").val("");
+    SelectPrivateCarDriver.search();
+};
+
+$(function () {
+    var orderId = $("#id").val();
+    var defaultColunms = SelectPrivateCarDriver.initColumn();
+    var table = new BSTable(SelectPrivateCarDriver.id, "/tReassign/selectDriver/"+orderId, defaultColunms);
+    table.setPaginationType("server");
+    SelectPrivateCarDriver.table = table.init();
+});
+
+/**
+ * 关闭此对话框
+ */
+SelectPrivateCarDriver.close = function() {
+    parent.layer.close(window.parent.TReassign.layerIndex);
+}
+
+/**
+ * 选择司机
+ */
+SelectPrivateCarDriver.selectDriver = function () {
+    /* var selected = $("#"+ this.id).bootstrapTable('getSelections');
+     if (selected.length== 0) {
+         Feng.info("请选择司机!");
+         return ;
+     }*/
+    if (this.check()) {
+        //提交信息
+        layer.msg("加载中...",{
+            icon:16,
+            time:-1
+        });
+        var ajax = new $ax(Feng.ctxPath + "/tReassign/selectDriver", function(data){
+            Feng.success("改派成功!");
+            window.parent.TReassign.table.refresh();
+            SelectPrivateCarDriver.close();
+            layer.closeAll()
+        },function(data){
+            Feng.error("修改失败!" + data.responseJSON.message + "!");
+            layer.closeAll()
+        });
+        ajax.set("orderId",$("#id").val());
+        ajax.set("driverId",SelectPrivateCarDriver.seItem.id);
+        ajax.start();
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectSmallDriver.js b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectSmallDriver.js
new file mode 100644
index 0000000..9d85720
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/selectSmallDriver.js
@@ -0,0 +1,156 @@
+/**
+ * 选择司机
+ */
+var SelectPrivateCarDriver = {
+    id: "SelectPrivateCarDriverTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SelectPrivateCarDriver.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle',width:'10%'},
+        {title: '姓名', field: 'name', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '头像', field: 'headImgUrl', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                if (row.headImgUrl == null || row.headImgUrl == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.headImgUrl + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '手机号', field: 'phone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.phone != '' && row.phone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.phone + '" onfocus="TUser.tooltip()">' + row.phone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '性别', field: 'sex', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.sex != '' && row.sex != null) {
+                    if (row.sex == 1) {
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="男" onfocus="TUser.tooltip()">男</p>']
+                    }else if (row.sex == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="女" onfocus="TUser.tooltip()">女</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '所属<br/>分公司', field: 'companyName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyName != '' && row.companyName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyName + '" onfocus="TUser.tooltip()">' + row.companyName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '所属<br/>加盟商', field: 'franchiseeName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.franchiseeName != '' && row.franchiseeName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.franchiseeName + '" onfocus="TUser.tooltip()">' + row.franchiseeName + '</p>']
+                }else{
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="-" onfocus="TUser.tooltip()">-</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+SelectPrivateCarDriver.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        SelectPrivateCarDriver.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 查询司机审核列表列表
+ */
+SelectPrivateCarDriver.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['phone'] = $("#phone").val();
+    SelectPrivateCarDriver.table.refresh({query: queryData});
+};
+SelectPrivateCarDriver.resetSearch = function () {
+    $("#name").val("");
+    $("#phone").val("");
+    SelectPrivateCarDriver.search();
+};
+
+$(function () {
+    var orderId = $("#id").val();
+    var defaultColunms = SelectPrivateCarDriver.initColumn();
+    var table = new BSTable(SelectPrivateCarDriver.id, "/tReassign/selectSmallDriver/"+orderId, defaultColunms);
+    table.setPaginationType("server");
+    SelectPrivateCarDriver.table = table.init();
+});
+
+/**
+ * 关闭此对话框
+ */
+SelectPrivateCarDriver.close = function() {
+    parent.layer.close(window.parent.TReassign.layerIndex);
+}
+
+/**
+ * 选择司机
+ */
+SelectPrivateCarDriver.selectDriver = function () {
+    /* var selected = $("#"+ this.id).bootstrapTable('getSelections');
+     if (selected.length== 0) {
+         Feng.info("请选择司机!");
+         return ;
+     }*/
+    if (this.check()) {
+        //提交信息
+        layer.msg("加载中...",{
+            icon:16,
+            time:-1
+        });
+        var ajax = new $ax(Feng.ctxPath + "/tReassign/selectSmallDriver", function(data){
+            Feng.success("改派成功!");
+            window.parent.TReassign.table.refresh();
+            SelectPrivateCarDriver.close();
+            layer.closeAll()
+        },function(data){
+            Feng.error("修改失败!" + data.responseJSON.message + "!");
+            layer.closeAll()
+        });
+        ajax.set("orderId",$("#id").val());
+        ajax.set("driverId",SelectPrivateCarDriver.seItem.id);
+        ajax.start();
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tReassign/smallPieceLogistics.js b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/smallPieceLogistics.js
new file mode 100644
index 0000000..c79c585
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/smallPieceLogistics.js
@@ -0,0 +1,325 @@
+/**
+ * 专车改派管理管理初始化
+ */
+var TReassign = {
+    id: "TReassignTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TReassign.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '申请改<br/>派时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '申请司机id', field: 'originalDriverId', visible: false, align: 'center', valign: 'middle'},
+        {title: '申请司机', field: 'originalDriver', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.originalDriver != '' && row.originalDriver != null) {
+                    var driverName1 = row.originalDriver.replace("-","<br>");
+                    var driverName2 = row.originalDriver.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + driverName2 + '" onfocus="TUser.tooltip()">' + driverName1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '申请原因', field: 'reason', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.reason != '' && row.reason != null) {
+                    var str = row.reason;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TReassign.buttonClick(' +  row.id + ',1)">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.reason + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单id', field: 'orderId', visible: false, align: 'center', valign: 'middle'},
+        {title: '订单编号', field: 'orderNum', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderNum != '' && row.orderNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderNum + '" onfocus="TUser.tooltip()">' + row.orderNum + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '下单用户', field: 'addOrderUser', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.addOrderUser != '' && row.addOrderUser != null) {
+                    var name1 = row.addOrderUser.replace("-","<br>");
+                    var name2 = row.addOrderUser.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + name2 + '" onfocus="TUser.tooltip()">' + name1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '出发时间', field: 'travelTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.travelTime != '' && row.travelTime != null) {
+                    var time = row.travelTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.travelTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '出发地', field: 'startAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.startAddress != '' && row.startAddress != null) {
+                    var str = row.startAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.startAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '目的地', field: 'endAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.endAddress != '' && row.endAddress != null) {
+                    var str = row.endAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.endAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '原始车辆id', field: 'originalCarId', visible: false, align: 'center', valign: 'middle'},
+        {title: '原服务<br/>车辆', field: 'originalCar', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.originalCar != '' && row.originalCar != null) {
+                    var car1 = row.originalCar.replace("-","<br>");
+                    var car2 = row.originalCar.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + car2 + '" onfocus="TUser.tooltip()">' + car1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '改派<br/>处罚金', field: 'money', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.money != '' && row.money != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.money + '" onfocus="TUser.tooltip()">' + row.money + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '改派后的司机id', field: 'nowDriverId', visible: false, align: 'center', valign: 'middle'},
+        {title: '改派服<br/>务司机', field: 'nowDriver', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.nowDriver != '' && row.nowDriver != null) {
+                    var driverName1 = row.nowDriver.replace("-","<br>");
+                    var driverName2 = row.nowDriver.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + driverName2 + '" onfocus="TUser.tooltip()">' + driverName1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '改派后的车辆id', field: 'nowCarId', visible: false, align: 'center', valign: 'middle'},
+        {title: '改派服<br/>务车辆', field: 'nowCar', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.nowCar != '' && row.nowCar != null) {
+                    var car1 = row.nowCar.replace("-","<br>");
+                    var car2 = row.nowCar.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + car2 + '" onfocus="TUser.tooltip()">' + car1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单当<br/>前状态', field: 'orderState', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderState != '' && row.orderState != null) {
+                    if (row.orderState == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待接单" onfocus="TUser.tooltip()">待接单</p>']
+                    } else if (row.orderState == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待出发" onfocus="TUser.tooltip()">待出发</p>']
+                    } else if (row.orderState == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待到达预约地点" onfocus="TUser.tooltip()">待到达预约地点</p>']
+                    } else if (row.orderState == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待取货" onfocus="TUser.tooltip()">待乘客上车</p>']
+                    } else if (row.orderState == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="服务中" onfocus="TUser.tooltip()">服务中</p>']
+                    } else if (row.orderState == 6){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已送达" onfocus="TUser.tooltip()">完成服务</p>']
+                    } else if (row.orderState == 7){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待支付" onfocus="TUser.tooltip()">待支付</p>']
+                    } else if (row.orderState == 8){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="需补差价" onfocus="TUser.tooltip()">待评价</p>']
+                    } else if (row.orderState == 9){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取货" onfocus="TUser.tooltip()">已完成</p>']
+                    } else if (row.orderState == 10){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
+                    } else if (row.orderState == 11){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="改派中" onfocus="TUser.tooltip()">改派中</p>']
+                    } else if (row.orderState == 12){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已支付差价" onfocus="TUser.tooltip()">取消待支付</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '改派<br/>状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="提交申请" onfocus="TUser.tooltip()">提交申请</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已支付" onfocus="TUser.tooltip()">已支付</p>']
+                    } else if (row.state == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已改派" onfocus="TUser.tooltip()">已改派</p>']
+                    } else if (row.state == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
+                    } else if (row.state == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已拒绝" onfocus="TUser.tooltip()">已拒绝</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TReassign.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TReassign.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 打开查看专车改派管理详情
+ */
+TReassign.reassignment = function () {
+    if (this.check()) {
+        if (TReassign.seItem.orderState != 11) {
+            swal("改派失败", "【改派中】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即改派',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tReassign/tReassign_reassignmentSmall/' + TReassign.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 操作  1=拒绝 2=取消
+ */
+TReassign.opt = function (type) {
+    if (this.check()) {
+        var confirm = "";
+        if (1 == type){
+            confirm = "拒绝改派";
+        }else if (2 == type){
+            confirm = "取消订单";
+        }
+        if (TReassign.seItem.orderState != 11) {
+            swal("操作失败", "【改派中】状态下才能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确定" + confirm + "?",
+            text: "请谨慎操作,操作后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: confirm,
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tReassign/optSmall", function (data) {
+                swal(confirm+"成功", "您已经成功" + confirm + "。", "success");
+                TReassign.table.refresh();
+            }, function (data) {
+                swal(confirm+"失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tReassignId", TReassign.seItem.id);
+            ajax.set("optType", type);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询专车改派管理列表
+ */
+TReassign.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['originalDriverName'] = $("#originalDriverName").val();
+    queryData['originalDriverPhone'] = $("#originalDriverPhone").val();
+    queryData['orderNum'] = $("#orderNum").val();
+    queryData['nowDriverName'] = $("#nowDriverName").val();
+    queryData['nowDriverPhone'] = $("#nowDriverPhone").val();
+    queryData['orderState'] = $("#orderState").val();
+    queryData['state'] = $("#state").val();
+    TReassign.table.refresh({query: queryData});
+};
+
+TReassign.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#originalDriverName").val("");
+    $("#originalDriverPhone").val("");
+    $("#orderNum").val("");
+    $("#nowDriverName").val("");
+    $("#nowDriverPhone").val("");
+    $("#orderState").val("");
+    $("#state").val("");
+    TReassign.search();
+};
+
+$(function () {
+    var defaultColunms = TReassign.initColumn();
+    var table = new BSTable(TReassign.id, "/tReassign/listSmallPieceLogistics", defaultColunms);
+    table.setPaginationType("server");
+    TReassign.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tReassign/tCross.js b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/tCross.js
new file mode 100644
index 0000000..ac1b634
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/tCross.js
@@ -0,0 +1,325 @@
+/**
+ * 跨城改派管理管理初始化
+ */
+var TCross = {
+    id: "TCrossTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TCross.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '申请改<br/>派时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '申请司机id', field: 'originalDriverId', visible: false, align: 'center', valign: 'middle'},
+        {title: '申请司机', field: 'originalDriver', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.originalDriver != '' && row.originalDriver != null) {
+                    var driverName1 = row.originalDriver.replace("-","<br>");
+                    var driverName2 = row.originalDriver.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + driverName2 + '" onfocus="TUser.tooltip()">' + driverName1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '申请原因', field: 'reason', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.reason != '' && row.reason != null) {
+                    var str = row.reason;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TReassign.buttonClick(' +  row.id + ',1)">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.reason + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单id', field: 'orderId', visible: false, align: 'center', valign: 'middle'},
+        {title: '订单编号', field: 'orderNum', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderNum != '' && row.orderNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderNum + '" onfocus="TUser.tooltip()">' + row.orderNum + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '下单用户', field: 'addOrderUser', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.addOrderUser != '' && row.addOrderUser != null) {
+                    var name1 = row.addOrderUser.replace("-","<br>");
+                    var name2 = row.addOrderUser.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + name2 + '" onfocus="TUser.tooltip()">' + name1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '出发时间', field: 'travelTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.travelTime != '' && row.travelTime != null) {
+                    var time = row.travelTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.travelTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '出发地', field: 'startAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.startAddress != '' && row.startAddress != null) {
+                    var str = row.startAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.startAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '目的地', field: 'endAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.endAddress != '' && row.endAddress != null) {
+                    var str = row.endAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.endAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '原始车辆id', field: 'originalCarId', visible: false, align: 'center', valign: 'middle'},
+        {title: '原服务<br/>车辆', field: 'originalCar', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.originalCar != '' && row.originalCar != null) {
+                    var car1 = row.originalCar.replace("-","<br>");
+                    var car2 = row.originalCar.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + car2 + '" onfocus="TUser.tooltip()">' + car1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '改派<br/>处罚金', field: 'money', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.money != '' && row.money != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.money + '" onfocus="TUser.tooltip()">' + row.money + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '改派后的司机id', field: 'nowDriverId', visible: false, align: 'center', valign: 'middle'},
+        {title: '改派服<br/>务司机', field: 'nowDriver', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.nowDriver != '' && row.nowDriver != null) {
+                    var driverName1 = row.nowDriver.replace("-","<br>");
+                    var driverName2 = row.nowDriver.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + driverName2 + '" onfocus="TUser.tooltip()">' + driverName1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '改派后的车辆id', field: 'nowCarId', visible: false, align: 'center', valign: 'middle'},
+        {title: '改派服<br/>务车辆', field: 'nowCar', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.nowCar != '' && row.nowCar != null) {
+                    var car1 = row.nowCar.replace("-","<br>");
+                    var car2 = row.nowCar.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + car2 + '" onfocus="TUser.tooltip()">' + car1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单当<br/>前状态', field: 'orderState', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderState != '' && row.orderState != null) {
+                    if (row.orderState == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待接单" onfocus="TUser.tooltip()">待接单</p>']
+                    } else if (row.orderState == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待出发" onfocus="TUser.tooltip()">待出发</p>']
+                    } else if (row.orderState == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待到达预约地点" onfocus="TUser.tooltip()">待到达预约地点</p>']
+                    } else if (row.orderState == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待乘客上车" onfocus="TUser.tooltip()">待乘客上车</p>']
+                    } else if (row.orderState == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="服务中" onfocus="TUser.tooltip()">服务中</p>']
+                    } else if (row.orderState == 6){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="完成服务" onfocus="TUser.tooltip()">完成服务</p>']
+                    } else if (row.orderState == 7){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待支付" onfocus="TUser.tooltip()">待支付</p>']
+                    } else if (row.orderState == 8){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待评价" onfocus="TUser.tooltip()">待评价</p>']
+                    } else if (row.orderState == 9){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已完成" onfocus="TUser.tooltip()">已完成</p>']
+                    } else if (row.orderState == 10){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
+                    } else if (row.orderState == 11){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="改派中" onfocus="TUser.tooltip()">改派中</p>']
+                    } else if (row.orderState == 12){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="取消待支付" onfocus="TUser.tooltip()">取消待支付</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '改派<br/>状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="提交申请" onfocus="TUser.tooltip()">提交申请</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已支付" onfocus="TUser.tooltip()">已支付</p>']
+                    } else if (row.state == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已改派" onfocus="TUser.tooltip()">已改派</p>']
+                    } else if (row.state == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
+                    } else if (row.state == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已拒绝" onfocus="TUser.tooltip()">已拒绝</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TCross.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCross.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 打开查看跨城改派管理详情
+ */
+TCross.reassignmentCross = function () {
+    if (this.check()) {
+        if (TCross.seItem.state != 2 ) {
+            swal("改派失败", "【已支付】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即改派',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tReassign/tReassign_reassignmentCross/' + TCross.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 操作  1=拒绝 2=取消
+ */
+TCross.opt = function (type) {
+    if (this.check()) {
+        var confirm = "";
+        if (1 == type){
+            confirm = "拒绝改派";
+        }else if (2 == type){
+            confirm = "取消订单";
+        }
+        if (TCross.seItem.state != 2 ) {
+            swal("操作失败", "【已支付】状态下才能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确定" + confirm + "?",
+            text: "请谨慎操作,操作后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: confirm,
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tReassign/optCross", function (data) {
+                swal(confirm+"成功", "您已经成功" + confirm + "。", "success");
+                TCross.table.refresh();
+            }, function (data) {
+                swal(confirm+"失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tReassignId", TCross.seItem.id);
+            ajax.set("optType", type);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询跨城改派管理列表
+ */
+TCross.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['originalDriverName'] = $("#originalDriverName").val();
+    queryData['originalDriverPhone'] = $("#originalDriverPhone").val();
+    queryData['orderNum'] = $("#orderNum").val();
+    queryData['nowDriverName'] = $("#nowDriverName").val();
+    queryData['nowDriverPhone'] = $("#nowDriverPhone").val();
+    queryData['orderState'] = $("#orderState").val();
+    queryData['state'] = $("#state").val();
+    TCross.table.refresh({query: queryData});
+};
+
+TCross.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#originalDriverName").val("");
+    $("#originalDriverPhone").val("");
+    $("#orderNum").val("");
+    $("#nowDriverName").val("");
+    $("#nowDriverPhone").val("");
+    $("#orderState").val("");
+    $("#state").val("");
+    TCross.search();
+};
+
+$(function () {
+    var defaultColunms = TCross.initColumn();
+    var table = new BSTable(TCross.id, "/tReassign/listCross", defaultColunms);
+    table.setPaginationType("server");
+    TCross.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tReassign/tReassign.js b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/tReassign.js
new file mode 100644
index 0000000..c8c3e5c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/tReassign.js
@@ -0,0 +1,325 @@
+/**
+ * 专车改派管理管理初始化
+ */
+var TReassign = {
+    id: "TReassignTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TReassign.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '申请改<br/>派时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '申请司机id', field: 'originalDriverId', visible: false, align: 'center', valign: 'middle'},
+        {title: '申请司机', field: 'originalDriver', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.originalDriver != '' && row.originalDriver != null) {
+                    var driverName1 = row.originalDriver.replace("-","<br>");
+                    var driverName2 = row.originalDriver.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + driverName2 + '" onfocus="TUser.tooltip()">' + driverName1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '申请原因', field: 'reason', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.reason != '' && row.reason != null) {
+                    var str = row.reason;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TReassign.buttonClick(' +  row.id + ',1)">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.reason + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单id', field: 'orderId', visible: false, align: 'center', valign: 'middle'},
+        {title: '订单编号', field: 'orderNum', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderNum != '' && row.orderNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderNum + '" onfocus="TUser.tooltip()">' + row.orderNum + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '下单用户', field: 'addOrderUser', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.addOrderUser != '' && row.addOrderUser != null) {
+                    var name1 = row.addOrderUser.replace("-","<br>");
+                    var name2 = row.addOrderUser.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + name2 + '" onfocus="TUser.tooltip()">' + name1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '出发时间', field: 'travelTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.travelTime != '' && row.travelTime != null) {
+                    var time = row.travelTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.travelTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '出发地', field: 'startAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.startAddress != '' && row.startAddress != null) {
+                    var str = row.startAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.startAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '目的地', field: 'endAddress', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.endAddress != '' && row.endAddress != null) {
+                    var str = row.endAddress;
+                    var str1 = "";
+                    var arr = "";
+                    for(var i=0,len=str.length/15;i<len;i++) {
+                        str1 = str.substr(0,15);
+                        str = str.replace(str1,'');
+                        arr += str1 + "<br>";
+                    }
+                    arr = arr.substring(0,arr.length-4);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.endAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '原始车辆id', field: 'originalCarId', visible: false, align: 'center', valign: 'middle'},
+        {title: '原服务<br/>车辆', field: 'originalCar', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.originalCar != '' && row.originalCar != null) {
+                    var car1 = row.originalCar.replace("-","<br>");
+                    var car2 = row.originalCar.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + car2 + '" onfocus="TUser.tooltip()">' + car1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '改派<br/>处罚金', field: 'money', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.money != '' && row.money != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.money + '" onfocus="TUser.tooltip()">' + row.money + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '改派后的司机id', field: 'nowDriverId', visible: false, align: 'center', valign: 'middle'},
+        {title: '改派服<br/>务司机', field: 'nowDriver', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.nowDriver != '' && row.nowDriver != null) {
+                    var driverName1 = row.nowDriver.replace("-","<br>");
+                    var driverName2 = row.nowDriver.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + driverName2 + '" onfocus="TUser.tooltip()">' + driverName1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '改派后的车辆id', field: 'nowCarId', visible: false, align: 'center', valign: 'middle'},
+        {title: '改派服<br/>务车辆', field: 'nowCar', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.nowCar != '' && row.nowCar != null) {
+                    var car1 = row.nowCar.replace("-","<br>");
+                    var car2 = row.nowCar.replace("-","&#10;");
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + car2 + '" onfocus="TUser.tooltip()">' + car1 + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '订单当<br/>前状态', field: 'orderState', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.orderState != '' && row.orderState != null) {
+                    if (row.orderState == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待接单" onfocus="TUser.tooltip()">待接单</p>']
+                    } else if (row.orderState == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待出发" onfocus="TUser.tooltip()">待出发</p>']
+                    } else if (row.orderState == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待到达预约地点" onfocus="TUser.tooltip()">待到达预约地点</p>']
+                    } else if (row.orderState == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待乘客上车" onfocus="TUser.tooltip()">待乘客上车</p>']
+                    } else if (row.orderState == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="服务中" onfocus="TUser.tooltip()">服务中</p>']
+                    } else if (row.orderState == 6){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="完成服务" onfocus="TUser.tooltip()">完成服务</p>']
+                    } else if (row.orderState == 7){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待支付" onfocus="TUser.tooltip()">待支付</p>']
+                    } else if (row.orderState == 8){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待评价" onfocus="TUser.tooltip()">待评价</p>']
+                    } else if (row.orderState == 9){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已完成" onfocus="TUser.tooltip()">已完成</p>']
+                    } else if (row.orderState == 10){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
+                    } else if (row.orderState == 11){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="改派中" onfocus="TUser.tooltip()">改派中</p>']
+                    } else if (row.orderState == 12){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="取消待支付" onfocus="TUser.tooltip()">取消待支付</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '改派<br/>状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="提交申请" onfocus="TUser.tooltip()">提交申请</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已支付" onfocus="TUser.tooltip()">已支付</p>']
+                    } else if (row.state == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已改派" onfocus="TUser.tooltip()">已改派</p>']
+                    } else if (row.state == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
+                    } else if (row.state == 5){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已拒绝" onfocus="TUser.tooltip()">已拒绝</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TReassign.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TReassign.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 打开查看专车改派管理详情
+ */
+TReassign.reassignment = function () {
+    if (this.check()) {
+        if (TReassign.seItem.orderState != 11) {
+            swal("改派失败", "【改派中】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即改派',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tReassign/tReassign_reassignment/' + TReassign.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 操作  1=拒绝 2=取消
+ */
+TReassign.opt = function (type) {
+    if (this.check()) {
+        var confirm = "";
+        if (1 == type){
+            confirm = "拒绝改派";
+        }else if (2 == type){
+            confirm = "取消订单";
+        }
+        if (TReassign.seItem.orderState != 11) {
+            swal("操作失败", "【改派中】状态下才能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确定" + confirm + "?",
+            text: "请谨慎操作,操作后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: confirm,
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tReassign/opt", function (data) {
+                swal(confirm+"成功", "您已经成功" + confirm + "。", "success");
+                TReassign.table.refresh();
+            }, function (data) {
+                swal(confirm+"失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tReassignId", TReassign.seItem.id);
+            ajax.set("optType", type);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询专车改派管理列表
+ */
+TReassign.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['originalDriverName'] = $("#originalDriverName").val();
+    queryData['originalDriverPhone'] = $("#originalDriverPhone").val();
+    queryData['orderNum'] = $("#orderNum").val();
+    queryData['nowDriverName'] = $("#nowDriverName").val();
+    queryData['nowDriverPhone'] = $("#nowDriverPhone").val();
+    queryData['orderState'] = $("#orderState").val();
+    queryData['state'] = $("#state").val();
+    TReassign.table.refresh({query: queryData});
+};
+
+TReassign.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#originalDriverName").val("");
+    $("#originalDriverPhone").val("");
+    $("#orderNum").val("");
+    $("#nowDriverName").val("");
+    $("#nowDriverPhone").val("");
+    $("#orderState").val("");
+    $("#state").val("");
+    TReassign.search();
+};
+
+$(function () {
+    var defaultColunms = TReassign.initColumn();
+    var table = new BSTable(TReassign.id, "/tReassign/list", defaultColunms);
+    table.setPaginationType("server");
+    TReassign.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tReassign/tReassign_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/tReassign_info.js
new file mode 100644
index 0000000..3d3eec2
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tReassign/tReassign_info.js
@@ -0,0 +1,108 @@
+/**
+ * 初始化专车改派管理详情对话框
+ */
+var TReassignInfoDlg = {
+    tReassignInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TReassignInfoDlg.clearData = function() {
+    this.tReassignInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TReassignInfoDlg.set = function(key, val) {
+    this.tReassignInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TReassignInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TReassignInfoDlg.close = function() {
+    parent.layer.close(window.parent.TReassign.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TReassignInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('orderType')
+    .set('orderId')
+    .set('originalDriverId')
+    .set('originalCarId')
+    .set('insertTime')
+    .set('nowDriverId')
+    .set('nowCarId')
+    .set('money')
+    .set('payType')
+    .set('payTime')
+    .set('payOrder')
+    .set('state')
+    .set('reason')
+    .set('remark')
+    .set('completeTime');
+}
+
+/**
+ * 提交添加
+ */
+TReassignInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tReassign/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TReassign.table.refresh();
+        TReassignInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tReassignInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TReassignInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tReassign/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TReassign.table.refresh();
+        TReassignInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tReassignInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/acrossCity.js b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/acrossCity.js
new file mode 100644
index 0000000..22cf168
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/acrossCity.js
@@ -0,0 +1,209 @@
+/**
+ * 专车车型设置管理初始化
+ */
+var TAcrossCity = {
+    id: "TAcrossCityTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TAcrossCity.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'20%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    // var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + row.insertTime + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车型名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车型图片', field: 'img', visible: true, align: 'center', valign: 'middle',width:'20%',
+            formatter: function (value, row) {
+                if (row.img == null || row.img == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.img + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if(row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                    }else if(row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="禁用" onfocus="TUser.tooltip()">禁用</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TAcrossCity.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TAcrossCity.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加专车车型设置
+ */
+TAcrossCity.addAcrossCity = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加跨城车型设置',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tServerCarmodel/acrossCity_add'
+    });
+    this.layerIndex = index;
+};
+
+
+/**
+ * 修改
+ */
+TAcrossCity.updateServerCarmodel = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '修改跨城车型设置',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tServerCarmodel/acrossCity_edit?id=' + TAcrossCity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+
+/**
+ * 禁用
+ */
+TAcrossCity.noAcrossCity = function () {
+    if (this.check()) {
+        var name = TAcrossCity.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该车型";
+        } else {
+            name = "【" + name + "】";
+        }
+        if (TAcrossCity.seItem.state != 1) {
+            swal("禁用失败", "【正常】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            swal({
+                title: "您是否确认禁用"+ name + "?",
+                text: "请谨慎操作!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "禁用",
+                closeOnConfirm: true
+            }, function () {
+                var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/opt", function (data) {
+                    swal("禁用成功", "您已经禁用了" + name + "。", "success");
+                    TAcrossCity.table.refresh();
+                }, function (data) {
+                    swal("禁用失败", data.responseJSON.message + "!", "warning");
+                });
+                ajax.set("tServerCarmodelId", TAcrossCity.seItem.id);
+                ajax.set("optType", 1);
+                ajax.start();
+            });
+        }
+    }
+};
+
+/**
+ * 启用
+ */
+TAcrossCity.yesAcrossCity = function () {
+    if (this.check()) {
+        var name = TAcrossCity.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该车型";
+        } else {
+            name = "【" + name + "】";
+        }
+        if (TAcrossCity.seItem.state != 2) {
+            swal("启用失败", "【禁用】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            swal({
+                title: "您是否确认启用"+ name + "?",
+                text: "请谨慎操作!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "启用",
+                closeOnConfirm: true
+            }, function () {
+                var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/opt", function (data) {
+                    swal("启用成功", "您已经启用了" + name + "。", "success");
+                    TAcrossCity.table.refresh();
+                }, function (data) {
+                    swal("启用失败", data.responseJSON.message + "!", "warning");
+                });
+                ajax.set("tServerCarmodelId", TAcrossCity.seItem.id);
+                ajax.set("optType", 2);
+                ajax.start();
+            });
+        }
+    }
+};
+
+/**
+ * 查询专车车型设置列表
+ */
+TAcrossCity.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['state'] = $("#state").val();
+    TAcrossCity.table.refresh({query: queryData});
+};
+
+TAcrossCity.resetSearch = function () {
+    $("#name").val("");
+    $("#state").val("");
+    TAcrossCity.search();
+};
+
+$(function () {
+    var defaultColunms = TAcrossCity.initColumn();
+    var table = new BSTable(TAcrossCity.id, "/tServerCarmodel/listAcrossCity", defaultColunms);
+    table.setPaginationType("server");
+    TAcrossCity.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/acrossCity_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/acrossCity_info.js
new file mode 100644
index 0000000..0587142
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/acrossCity_info.js
@@ -0,0 +1,141 @@
+/**
+ * 初始化专车车型设置详情对话框
+ */
+var TAcrossCityInfoDlg = {
+    tServerCarmodelInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '车型名称不能为空'
+                },
+                regexp: {
+                    regexp: /^.{1,15}$/,
+                    message: '车型名称不能超过15个字'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TAcrossCityInfoDlg.validate = function () {
+    $('#acrossCityInfoForm').data("bootstrapValidator").resetForm();
+    $('#acrossCityInfoForm').bootstrapValidator('validate');
+    return $("#acrossCityInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TAcrossCityInfoDlg.clearData = function() {
+    this.tServerCarmodelInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TAcrossCityInfoDlg.set = function(key, val) {
+    this.tServerCarmodelInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TAcrossCityInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TAcrossCityInfoDlg.close = function() {
+    parent.layer.close(window.parent.TAcrossCity.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TAcrossCityInfoDlg.collectData = function() {
+    this
+        .set('id')
+        .set('type')
+        .set('name')
+        .set('img')
+        .set('state')
+        .set('insertTime');
+}
+
+/**
+ * 提交添加
+ */
+TAcrossCityInfoDlg.addAcrossCity = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/addAcrossCity", function(data){
+        if (500 == data.code){
+            Feng.error(data.message);
+            return;
+        }else{
+            Feng.success("添加成功!");
+            window.parent.TAcrossCity.table.refresh();
+            TAcrossCityInfoDlg.close();
+        }
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tServerCarmodelInfoData);
+    ajax.start();
+}
+
+
+/**
+ * 提交添加
+ */
+TAcrossCityInfoDlg.editAcrossCity = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/editAcrossCity", function(data){
+        if (500 == data.code){
+            Feng.error(data.message);
+            return;
+        }else{
+            Feng.success("添加成功!");
+            window.parent.TAcrossCity.table.refresh();
+            TAcrossCityInfoDlg.close();
+        }
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tServerCarmodelInfoData);
+    ajax.start();
+}
+
+
+
+$(function() {
+    Feng.initValidator("acrossCityInfoForm", TAcrossCityInfoDlg.validateFields);
+    // 初始化图片上传
+    var img = new $WebUpload("img");
+    img.setUploadBarId("progressBar");
+    img.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/charter.js b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/charter.js
new file mode 100644
index 0000000..b6d63a0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/charter.js
@@ -0,0 +1,214 @@
+/**
+ * 包车车型设置管理初始化
+ */
+var TCharter = {
+    id: "TCharterTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TCharter.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'20%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    // var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + row.insertTime + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车型名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车型价格范围', field: 'price', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.price != '' && row.price != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.price + '" onfocus="TUser.tooltip()">' + row.price + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车型图片', field: 'img', visible: true, align: 'center', valign: 'middle',width:'20%',
+            formatter: function (value, row) {
+                if (row.img == null || row.img == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.img + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if(row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                    }else if(row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="禁用" onfocus="TUser.tooltip()">禁用</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TCharter.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TCharter.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加包车车型设置
+ */
+TCharter.addCharter = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加包车车型设置',
+        area: ['800px', '520px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tServerCarmodel/charter_add'
+    });
+    this.layerIndex = index;
+};
+
+
+TCharter.editCharter = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑包车车型设置',
+            area: ['800px', '520px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tServerCarmodel/charter_edit?id=' + TCharter.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+
+/**
+ * 禁用
+ */
+TCharter.noCharter = function () {
+    if (this.check()) {
+        var name = TCharter.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该车型";
+        } else {
+            name = "【" + name + "】";
+        }
+        if (TCharter.seItem.state != 1) {
+            swal("禁用失败", "【正常】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            swal({
+                title: "您是否确认禁用"+ name + "?",
+                text: "请谨慎操作!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "禁用",
+                closeOnConfirm: true
+            }, function () {
+                var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/opt", function (data) {
+                    swal("禁用成功", "您已经禁用了" + name + "。", "success");
+                    TCharter.table.refresh();
+                }, function (data) {
+                    swal("禁用失败", data.responseJSON.message + "!", "warning");
+                });
+                ajax.set("tServerCarmodelId", TCharter.seItem.id);
+                ajax.set("optType", 1);
+                ajax.start();
+            });
+        }
+    }
+};
+
+/**
+ * 启用
+ */
+TCharter.yesCharter = function () {
+    if (this.check()) {
+        var name = TCharter.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该车型";
+        } else {
+            name = "【" + name + "】";
+        }
+        if (TCharter.seItem.state != 2) {
+            swal("启用失败", "【禁用】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            swal({
+                title: "您是否确认启用"+ name + "?",
+                text: "请谨慎操作!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "启用",
+                closeOnConfirm: true
+            }, function () {
+                var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/opt", function (data) {
+                    swal("启用成功", "您已经启用了" + name + "。", "success");
+                    TCharter.table.refresh();
+                }, function (data) {
+                    swal("启用失败", data.responseJSON.message + "!", "warning");
+                });
+                ajax.set("tServerCarmodelId", TCharter.seItem.id);
+                ajax.set("optType", 2);
+                ajax.start();
+            });
+        }
+    }
+};
+
+/**
+ * 查询专车车型设置列表
+ */
+TCharter.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['state'] = $("#state").val();
+    TCharter.table.refresh({query: queryData});
+};
+
+TCharter.resetSearch = function () {
+    $("#name").val("");
+    $("#state").val("");
+    TCharter.search();
+};
+
+$(function () {
+    var defaultColunms = TCharter.initColumn();
+    var table = new BSTable(TCharter.id, "/tServerCarmodel/listCharter", defaultColunms);
+    table.setPaginationType("server");
+    TCharter.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/charter_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/charter_info.js
new file mode 100644
index 0000000..ff02477
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/charter_info.js
@@ -0,0 +1,173 @@
+/**
+ * 初始化专车车型设置详情对话框
+ */
+var TCharterInfoDlg = {
+    tServerCarmodelInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '车型名称不能为空'
+                },
+                regexp: {
+                    regexp: /^.{1,15}$/,
+                    message: '车型名称不能超过15个字'
+                }
+            }
+        },
+        one: {
+            validators: {
+                notEmpty: {
+                    message: '车型价格起始值不能为空'
+                },
+                regexp: {
+                    regexp: /^(([1-9]{1}\d*)|(0{1}))(\.\d{0,2})?$/,
+                    message: '车型价格起始值格式不正确'
+                }
+            }
+        },
+        two: {
+            validators: {
+                notEmpty: {
+                    message: '车型价格结束值不能为空'
+                },
+                regexp: {
+                    regexp: /^(([1-9]{1}\d*)|(0{1}))(\.\d{0,2})?$/,
+                    message: '车型价格结束值格式不正确'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TCharterInfoDlg.validate = function () {
+    $('#charterInfoForm').data("bootstrapValidator").resetForm();
+    $('#charterInfoForm').bootstrapValidator('validate');
+    return $("#charterInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TCharterInfoDlg.clearData = function() {
+    this.tServerCarmodelInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCharterInfoDlg.set = function(key, val) {
+    this.tServerCarmodelInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TCharterInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TCharterInfoDlg.close = function() {
+    parent.layer.close(window.parent.TCharter.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TCharterInfoDlg.collectData = function() {
+    this
+        .set('id')
+        .set('type')
+        .set('name')
+        .set('img')
+        .set('state')
+        .set('insertTime');
+}
+
+/**
+ * 提交添加
+ */
+TCharterInfoDlg.addCharter = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var one = $("#one").val();
+    var two = $("#two").val();
+    if (parseFloat(one) >= parseFloat(two)){
+        Feng.info("车型价格范围不正确");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/addCharter", function(data){
+        if (500 == data.code){
+            Feng.error(data.message);
+            return;
+        }else{
+            Feng.success("添加成功!");
+            window.parent.TCharter.table.refresh();
+            TCharterInfoDlg.close();
+        }
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tServerCarmodelInfoData);
+    ajax.set("price",one+"-"+two);
+    ajax.start();
+}
+
+TCharterInfoDlg.editCharter = function(){
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var one = $("#one").val();
+    var two = $("#two").val();
+    if (parseFloat(one) >= parseFloat(two)){
+        Feng.info("车型价格范围不正确");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/editCharter", function(data){
+        if (500 == data.code){
+            Feng.error(data.message);
+            return;
+        }else{
+            Feng.success("修改成功!");
+            window.parent.TCharter.table.refresh();
+            TCharterInfoDlg.close();
+        }
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tServerCarmodelInfoData);
+    ajax.set("price",one+"-"+two);
+    ajax.start();
+}
+
+
+
+
+$(function() {
+    Feng.initValidator("charterInfoForm", TCharterInfoDlg.validateFields);
+    // 初始化图片上传
+    var img = new $WebUpload("img");
+    img.setUploadBarId("progressBar");
+    img.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/tServerCarmodel.js b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/tServerCarmodel.js
new file mode 100644
index 0000000..178d026
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/tServerCarmodel.js
@@ -0,0 +1,205 @@
+/**
+ * 专车车型设置管理初始化
+ */
+var TServerCarmodel = {
+    id: "TServerCarmodelTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TServerCarmodel.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'20%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    // var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + row.insertTime + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车型名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车型图片', field: 'img', visible: true, align: 'center', valign: 'middle',width:'20%',
+            formatter: function (value, row) {
+                if (row.img == null || row.img == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.img + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if(row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                    }else if(row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="禁用" onfocus="TUser.tooltip()">禁用</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TServerCarmodel.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TServerCarmodel.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加专车车型设置
+ */
+TServerCarmodel.openAddTServerCarmodel = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加专车车型设置',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tServerCarmodel/tServerCarmodel_add'
+    });
+    this.layerIndex = index;
+};
+
+TServerCarmodel.updateTOrderEvaluateDetail = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '修改专车车型设置',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tServerCarmodel/tServerCarmodel_edit?id=' + TServerCarmodel.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+
+
+/**
+ * 禁用
+ */
+TServerCarmodel.no = function () {
+    if (this.check()) {
+        var name = TServerCarmodel.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该车型";
+        } else {
+            name = "【" + name + "】";
+        }
+        if (TServerCarmodel.seItem.state != 1) {
+            swal("禁用失败", "【正常】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            swal({
+                title: "您是否确认禁用"+ name + "?",
+                text: "请谨慎操作!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "禁用",
+                closeOnConfirm: true
+            }, function () {
+                var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/opt", function (data) {
+                    swal("禁用成功", "您已经禁用了" + name + "。", "success");
+                    TServerCarmodel.table.refresh();
+                }, function (data) {
+                    swal("禁用失败", data.responseJSON.message + "!", "warning");
+                });
+                ajax.set("tServerCarmodelId", TServerCarmodel.seItem.id);
+                ajax.set("optType", 1);
+                ajax.start();
+            });
+        }
+    }
+};
+
+/**
+ * 启用
+ */
+TServerCarmodel.yes = function () {
+    if (this.check()) {
+        var name = TServerCarmodel.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该车型";
+        } else {
+            name = "【" + name + "】";
+        }
+        if (TServerCarmodel.seItem.state != 2) {
+            swal("启用失败", "【禁用】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            swal({
+                title: "您是否确认启用"+ name + "?",
+                text: "请谨慎操作!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "启用",
+                closeOnConfirm: true
+            }, function () {
+                var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/opt", function (data) {
+                    swal("启用成功", "您已经启用了" + name + "。", "success");
+                    TServerCarmodel.table.refresh();
+                }, function (data) {
+                    swal("启用失败", data.responseJSON.message + "!", "warning");
+                });
+                ajax.set("tServerCarmodelId", TServerCarmodel.seItem.id);
+                ajax.set("optType", 2);
+                ajax.start();
+            });
+        }
+    }
+};
+
+/**
+ * 查询专车车型设置列表
+ */
+TServerCarmodel.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['state'] = $("#state").val();
+    TServerCarmodel.table.refresh({query: queryData});
+};
+
+TServerCarmodel.resetSearch = function () {
+    $("#name").val("");
+    $("#state").val("");
+    TServerCarmodel.search();
+};
+
+$(function () {
+    var defaultColunms = TServerCarmodel.initColumn();
+    var table = new BSTable(TServerCarmodel.id, "/tServerCarmodel/list", defaultColunms);
+    table.setPaginationType("server");
+    TServerCarmodel.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/tServerCarmodel_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/tServerCarmodel_info.js
new file mode 100644
index 0000000..5a535f6
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tServerCarmodel/tServerCarmodel_info.js
@@ -0,0 +1,131 @@
+/**
+ * 初始化专车车型设置详情对话框
+ */
+var TServerCarmodelInfoDlg = {
+    tServerCarmodelInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '车型名称不能为空'
+                },
+                regexp: {
+                    regexp: /^.{1,15}$/,
+                    message: '车型名称不能超过15个字'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TServerCarmodelInfoDlg.validate = function () {
+    $('#serverCarModelInfoForm').data("bootstrapValidator").resetForm();
+    $('#serverCarModelInfoForm').bootstrapValidator('validate');
+    return $("#serverCarModelInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TServerCarmodelInfoDlg.clearData = function() {
+    this.tServerCarmodelInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TServerCarmodelInfoDlg.set = function(key, val) {
+    this.tServerCarmodelInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TServerCarmodelInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TServerCarmodelInfoDlg.close = function() {
+    parent.layer.close(window.parent.TServerCarmodel.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TServerCarmodelInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('type')
+    .set('name')
+    .set('img')
+    .set('state')
+    .set('insertTime');
+}
+
+/**
+ * 提交添加
+ */
+TServerCarmodelInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/add", function(data){
+        if (500 == data.code){
+            Feng.error(data.message);
+            return;
+        }else{
+            Feng.success("添加成功!");
+            window.parent.TServerCarmodel.table.refresh();
+            TServerCarmodelInfoDlg.close();
+        }
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tServerCarmodelInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TServerCarmodelInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tServerCarmodel/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TServerCarmodel.table.refresh();
+        TServerCarmodelInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tServerCarmodelInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("serverCarModelInfoForm", TServerCarmodelInfoDlg.validateFields);
+    // 初始化图片上传
+    var img = new $WebUpload("img");
+    img.setUploadBarId("progressBar");
+    img.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tSite/electricFence.js b/management/guns-admin/src/main/webapp/static/modular/system/tSite/electricFence.js
new file mode 100644
index 0000000..8881503
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tSite/electricFence.js
@@ -0,0 +1,329 @@
+var map = new AMap.Map('container',{
+    resizeEnable: true,
+    zoom:10
+});
+
+
+var value = "";
+map.getCity(
+    callback=function (result) {
+        value = result.city;
+        drawBounds();
+    }
+);
+
+
+var mouseTool = new AMap.MouseTool(map);
+//监听draw事件可获取画好的覆盖物
+var overlays = [];
+var name = null;
+var coordinate = '';//存储坐标
+var objs = {//存储各种类型的覆盖物对象
+    "polyline":[],
+    "polygon":[],
+    "rectangle":[],
+    "circle":[]
+};
+var editors = [];
+mouseTool.on('draw',function(e){
+    overlays.push(e.obj);
+    console.log(e.obj.getPath());
+
+    switch (name) {
+        case 'polyline':{//折线图
+            var polyline = e.obj.getPath();
+            getCoordinate(polyline);
+            objs.polyline.push(e.obj);
+            break;
+        }
+        case 'polygon':{//多边形
+            var polygon = e.obj.getPath();
+            getCoordinate(polygon);
+            objs.polygon.push(e.obj);
+            break;
+        }
+        case 'rectangle':{//矩形
+            var rectangle = e.obj.getPath();
+            getCoordinate(rectangle);
+            objs.rectangle.push(e.obj);
+            break;
+        }
+        case 'circle':{//圆形
+            var center = e.obj.getCenter();
+            var radius = e.obj.getRadius();
+            if(radius > 5000){
+                Feng.error("创建电子围栏失败,圆半径不能大于5000米");
+                return;
+            }
+            coordinate += center.lng + ',' + center.lat + ';' + radius + "_";
+            objs.circle.push(e.obj);
+            break;
+        }
+    }
+    console.log(coordinate);
+})
+
+
+var district = null;
+var polygons=[];
+function drawBounds() {
+    if(value == ''){
+        value = '北京市';
+    }
+
+    //加载行政区划插件
+    if(!district){
+        //实例化DistrictSearch
+        var opts = {
+            subdistrict: 0,   //获取边界不需要返回下级行政区
+            extensions: 'all',  //返回行政区边界坐标组等具体信息
+            level: 'district'  //查询行政级别为 市
+        };
+        district = new AMap.DistrictSearch(opts);
+    }
+    //行政区查询
+    district.setLevel(document.getElementById('level').value)
+    district.search(value, function(status, result) {
+        map.remove(polygons)//清除上次结果
+        polygons = [];
+        var bounds = result.districtList[0].boundaries;
+        if (bounds) {
+            for (var i = 0, l = bounds.length; i < l; i++) {
+                //生成行政区划polygon
+                var polygon = new AMap.Polygon({
+                    strokeWeight: 1,
+                    path: bounds[i],
+                    fillOpacity: 0.4,
+                    fillColor: '#80d8ff',
+                    strokeColor: '#0091ea'
+                });
+                polygons.push(polygon);
+            }
+        }
+        map.add(polygons)
+        map.setFitView(polygons);//视口自适应
+    });
+}
+
+document.getElementById('find').onclick = function () {
+    value = document.getElementById('district').value;
+    if(value == ''){
+        value = "北京市";
+    }
+    drawBounds()
+};
+document.getElementById('district').onkeydown = function(e) {
+    if (e.keyCode === 13) {
+        value = document.getElementById('district').value;
+        if(value == ''){
+            value = "北京市";
+        }
+        drawBounds();
+        return false;
+    }
+    return true;
+};
+
+
+
+
+//处理坐标结果
+function getCoordinate(arr){
+    var str = '';
+    for(var i = 0; i < arr.length; i++){
+        var lng = arr[i].lng;
+        var lat = arr[i].lat;
+        str += lng + ',' + lat + ';';
+    }
+    coordinate += str.substring(0, str.length - 1) + "_";
+}
+
+
+function draw(type){
+    switch(type){
+        case 'marker':{
+            mouseTool.marker({
+                //同Marker的Option设置
+            });
+            break;
+        }
+        case 'polyline':{
+            mouseTool.polyline({
+                strokeColor:'#80d8ff'
+                //同Polyline的Option设置
+            });
+            break;
+        }
+        case 'polygon':{
+            mouseTool.polygon({
+                fillColor:'#00b0ff',
+                strokeColor:'#80d8ff'
+                //同Polygon的Option设置
+            });
+            break;
+        }
+        case 'rectangle':{
+            mouseTool.rectangle({
+                fillColor:'#00b0ff',
+                strokeColor:'#80d8ff'
+                //同Polygon的Option设置
+            });
+            break;
+        }
+        case 'circle':{
+            mouseTool.circle({
+                fillColor:'#00b0ff',
+                strokeColor:'#80d8ff'
+                //同Circle的Option设置
+            });
+            break;
+        }
+    }
+}
+var radios = document.getElementsByName('func');
+for(var i=0;i<radios.length;i+=1){
+    radios[i].onchange = function(e){
+        draw(e.target.value)
+        name = e.target.value;
+    }
+}
+// draw('marker')
+
+document.getElementById('clear').onclick = function(){
+    map.remove(overlays)
+    overlays = [];
+    coordinate = '';
+    objs.circle = [];
+    objs.rectangle = [];
+    objs.polygon = [];
+    objs.polyline = [];
+    closeEdit();
+}
+document.getElementById('close').onclick = function(){
+    mouseTool.close()//关闭,并清除覆盖物
+    for(var i=0;i<radios.length;i+=1){
+        radios[i].checked = false;
+    }
+    closeEdit();
+}
+
+
+//点击提交处理函数
+function submitCoordinate(){
+    var name = $('#addressName').val();
+    if('' == name){
+        Feng.error('请填写地址名称');
+        return;
+    }
+    if('' == coordinate){
+        Feng.error('请在地图上规划区域');
+        return;
+    }
+    coordinate = coordinate.substring(0, coordinate.length - 1);
+
+}
+
+function editAll() {
+    coordinate = '';
+    editors = [];
+    //折线
+    for(var i in objs.polyline){
+        var polyline = objs.polyline[i];
+        var polyEditor = new AMap.PolyEditor(map, polyline)
+        polyEditor.on('addnode', function(event) {
+            // log.info('触发事件:addnode')
+        })
+
+        polyEditor.on('adjust', function(event) {
+            // log.info('触发事件:adjust')
+        })
+
+        polyEditor.on('removenode', function(event) {
+            // log.info('触发事件:removenode')
+        })
+
+        polyEditor.on('end', function(e) {
+            var polyline = e.target.getPath();
+            getCoordinate(polyline);
+        })
+        editors.push(polyEditor);
+        polyEditor.open();
+    }
+
+    //多边形
+    for(var i in objs.polygon){
+        var polygon = objs.polygon[i];
+        var polyEditor = new AMap.PolyEditor(map, polygon)
+
+        polyEditor.on('addnode', function(event) {
+            // log.info('触发事件:addnode')
+        })
+
+        polyEditor.on('adjust', function(event) {
+            // log.info('触发事件:adjust')
+        })
+
+        polyEditor.on('removenode', function(event) {
+            // log.info('触发事件:removenode')
+        })
+
+        polyEditor.on('end', function(e) {
+            var polygon = e.target.getPath();
+            getCoordinate(polygon);
+        })
+        editors.push(polyEditor);
+        polyEditor.open();
+    }
+
+
+    //矩形
+    for(var i in objs.rectangle){
+        var rectangle = objs.rectangle[i];
+        var rectangleEditor = new AMap.RectangleEditor(map, rectangle)
+
+        rectangleEditor.on('adjust', function(event) {
+            // log.info('触发事件:adjust')
+        })
+
+        rectangleEditor.on('end', function(e) {
+            var polygon = e.target.getPath();
+            getCoordinate(polygon);
+        })
+        editors.push(rectangleEditor);
+        rectangleEditor.open();
+    }
+
+    //圆形
+    for(var i in objs.circle){
+        var circle = objs.circle[i];
+        var circleEditor = new AMap.CircleEditor(map, circle)
+
+        circleEditor.on('move', function(event) {
+            // log.info('触发事件:move')
+        })
+
+        circleEditor.on('adjust', function(e) {
+            var radius = e.target.getRadius();
+            if(radius > 5000){
+                Feng.error("创建电子围栏失败,圆半径不能大于5000米");
+                return;
+            }
+        })
+
+        circleEditor.on('end', function(e) {
+            var center = e.target.getCenter();
+            var radius = e.target.getRadius();
+            coordinate += center.lng + ',' + center.lat + ';' + radius + "_";
+        })
+        editors.push(circleEditor);
+        circleEditor.open();
+    }
+}
+
+
+function closeEdit() {
+    for(var i in editors){
+        var editor = editors[i];
+        editor.close();
+    }
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tSite/tSite.js b/management/guns-admin/src/main/webapp/static/modular/system/tSite/tSite.js
new file mode 100644
index 0000000..137512c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tSite/tSite.js
@@ -0,0 +1,231 @@
+/**
+ * 跨城站点管理管理初始化
+ */
+var TSite = {
+    id: "TSiteTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TSite.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'20%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + row.insertTime + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '站点名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '添加人ID', field: 'insertUserId', visible: false, align: 'center', valign: 'middle'},
+        {title: '创建者', field: 'insertUser', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertUser != '' && row.insertUser != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertUser + '" onfocus="TUser.tooltip()">' + row.insertUser + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '所属城市', field: 'province', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.province != '' && row.province != null) {
+                    var str = "";
+                    if ("" != row.province && undefined != row.province){
+                        str = str + row.province+"-";
+                    }
+                    if ("" != row.city && undefined != row.city){
+                        str = str + row.city+"-";
+                    }
+                    if ("" != row.district && undefined != row.district){
+                        str = str + row.district+"-";
+                    }
+                    str = str.substring(0,str.length-1);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="'+ str +'" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '关联线路', field: 'lineNum', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.lineNum != '' && row.lineNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.lineNum + '" onfocus="TUser.tooltip()">' + row.lineNum + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if(row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                    }else if(row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="冻结" onfocus="TUser.tooltip()">冻结</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TSite.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TSite.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加跨城站点管理
+ */
+TSite.openAddTSite = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加跨城站点',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tSite/tSite_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看跨城站点管理详情
+ */
+TSite.openTSiteDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑跨城站点',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tSite/tSite_update/' + TSite.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 操作跨城站点管理
+ */
+TSite.opt = function (type) {
+    if (this.check()) {
+        var name = TSite.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该站点";
+        } else {
+            name = "【" + name + "】";
+        }
+        var str = "";
+        var text = "请谨慎操作!";
+        var title = "请谨慎操作!";
+        if (1 == type){
+            str = "删除";
+            title = "您是否确认删除"+name+"?";
+            text = "请谨慎操作,删除后数据无法恢复!";
+        } else if (2 == type){
+            str = "冻结";
+            title = "您是否确认冻结"+name+"?";
+        } else if (3 == type){
+            str = "解冻";
+            title = "您是否确认解冻"+name+"?";
+        }
+        if (1 == type){
+            if (TSite.seItem.lineNum != "" && TSite.seItem.lineNum != null && TSite.seItem.lineNum > 0) {
+                swal("删除失败", "该站点还有关联线路!", "warning");
+                return;
+            }
+        }
+        if(2 == type){
+            if (TSite.seItem.state != 1) {
+                swal("冻结失败", "【正常】状态下才能执行此操作!", "warning");
+                return;
+            }
+        }
+        if (3 == type){
+            if (TSite.seItem.state != 2){
+                swal("解冻失败", "【冻结】状态下才能执行此操作!", "warning");
+                return;
+            }
+        }
+
+        swal({
+            title: title,
+            text: text,
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: str,
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tSite/opt", function (data) {
+                swal(str+"成功", "您已经"+str+"了" + name + "。", "success");
+                TSite.table.refresh();
+            }, function (data) {
+                swal(str+"失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tSiteId",TSite.seItem.id);
+            ajax.set("optType", type);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询跨城站点管理列表
+ */
+TSite.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['insertUser'] = $("#insertUser").val();
+    queryData['city'] = $("#city").val();
+    queryData['state'] = $("#state").val();
+    TSite.table.refresh({query: queryData});
+};
+
+TSite.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#name").val("");
+    $("#insertUser").val("");
+    $("#city").val("");
+    $("#state").val("");
+    TSite.search();
+};
+
+$(function () {
+    var defaultColunms = TSite.initColumn();
+    var table = new BSTable(TSite.id, "/tSite/list", defaultColunms);
+    table.setPaginationType("server");
+    TSite.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tSite/tSite_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tSite/tSite_info.js
new file mode 100644
index 0000000..320af8b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tSite/tSite_info.js
@@ -0,0 +1,376 @@
+/**
+ * 初始化跨城站点管理详情对话框
+ */
+var TSiteInfoDlg = {
+    tSiteInfoData : {},
+    validateFields: {
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '站点名称不能为空'
+                }
+            }
+        },
+        provinceCode: {
+            validators: {
+                notEmpty: {
+                    message: '请选择站点所属省'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TSiteInfoDlg.validate = function () {
+    $('#siteInfoForm').data("bootstrapValidator").resetForm();
+    $('#siteInfoForm').bootstrapValidator('validate');
+    return $("#siteInfoForm").data('bootstrapValidator').isValid();
+};
+
+
+/**
+ * 清除数据
+ */
+TSiteInfoDlg.clearData = function() {
+    this.tSiteInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TSiteInfoDlg.set = function(key, val) {
+    this.tSiteInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TSiteInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TSiteInfoDlg.close = function() {
+    parent.layer.close(window.parent.TSite.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TSiteInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('name')
+    .set('province')
+    .set('provinceCode')
+    .set('city')
+    .set('cityCode')
+    .set('district')
+    .set('districtCode')
+    .set('state')
+    .set('insertTime')
+    .set('insertUserId');
+}
+
+/**
+ * 提交添加
+ */
+TSiteInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var name = $("#name").val();
+    var provinceCode = $("#provinceCode").val();
+    var cityCode = $("#cityCode").val();
+    var districtCode = $("#districtCode").val();
+    if ("" == provinceCode){
+        Feng.error("请选择所属城市");
+        return;
+    }
+    var subArr=[];
+    $(".areaValueClass").each(function () {
+        subArr.push({
+            id:$(this).find("input[name*='id']").val(),
+            areaType:$(this).find("input[name*='areaType1']").val(),
+            time:$(this).find("input[name*='time']").val(),
+            name:$(this).find("input[name*='name']").val(),
+            province:$(this).find("input[name*='province1']").val(),
+            provinceCode:$(this).find("input[name*='provinceCode1']").val(),
+            city:$(this).find("input[name*='city1']").val(),
+            cityCode:$(this).find("input[name*='cityCode1']").val(),
+            district:$(this).find("input[name*='district1']").val(),
+            districtCode:$(this).find("input[name*='districtCode1']").val(),
+            coordinate:$(this).find("input[name*='coordinate1']").val(),
+        })
+    });
+    if(subArr.length <= 0){
+        Feng.error("请至少填写一条站点区域");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tSite/add", function(data){
+        if(data.status == 200){
+            Feng.success("添加成功!");
+            window.parent.TSite.table.refresh();
+            TSiteInfoDlg.close();
+        }else{
+            Feng.error(data.msg);
+        }
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("name",name);
+    ajax.set("provinceCode",provinceCode);
+    ajax.set("province",$("#provinceCode option:selected").text());
+    if ("" != cityCode && null != cityCode && undefined != cityCode){
+        ajax.set("cityCode",cityCode);
+        ajax.set("city",$("#cityCode option:selected").text());
+    }
+    if ("" != districtCode && null != districtCode && undefined != districtCode){
+        ajax.set("districtCode",$("#districtCode").val());
+        ajax.set("district",$("#districtCode option:selected").text());
+    }
+    ajax.set("subArr",JSON.stringify(subArr));
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TSiteInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var name = $("#name").val();
+    var provinceCode = $("#provinceCode").val();
+    var cityCode = $("#cityCode").val();
+    var districtCode = $("#districtCode").val();
+    if ("" == provinceCode){
+        Feng.error("请选择所属城市");
+        return;
+    }
+    var subArr=[];
+    $(".areaValueClass").each(function () {
+        subArr.push({
+            id:$(this).find("input[name*='id']").val(),
+            areaType:$(this).find("input[name*='areaType1']").val(),
+            time:$(this).find("input[name*='time']").val(),
+            name:$(this).find("input[name*='name']").val(),
+            province:$(this).find("input[name*='province1']").val(),
+            provinceCode:$(this).find("input[name*='provinceCode1']").val(),
+            city:$(this).find("input[name*='city1']").val(),
+            cityCode:$(this).find("input[name*='cityCode1']").val(),
+            district:$(this).find("input[name*='district1']").val(),
+            districtCode:$(this).find("input[name*='districtCode1']").val(),
+            coordinate:$(this).find("input[name*='coordinate1']").val(),
+        })
+    });
+    if(subArr.length <= 0){
+        Feng.error("请至少填写一条站点区域");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tSite/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TSite.table.refresh();
+        TSiteInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("name",name);
+    ajax.set("provinceCode",provinceCode);
+    ajax.set("province",$("#provinceCode option:selected").text());
+    if ("" != cityCode && null != cityCode && undefined != cityCode){
+        ajax.set("cityCode",cityCode);
+        ajax.set("city",$("#cityCode option:selected").text());
+    }
+    if ("" != districtCode && null != districtCode && undefined != districtCode){
+        ajax.set("districtCode",$("#districtCode").val());
+        ajax.set("district",$("#districtCode option:selected").text());
+    }
+    ajax.set("subArr",JSON.stringify(subArr));
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("siteInfoForm", TSiteInfoDlg.validateFields);
+});
+
+
+//省改变
+TSiteInfoDlg.provinceChange = function (e) {
+    var provinceCode=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
+        if(data!=null){
+            var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cityCode").empty().append(content);
+            $("#districtCode").empty().append('<option value="">选择区</option>');
+        }
+    });
+    ajax.set("code",provinceCode);
+    ajax.start();
+}
+//市改变
+TSiteInfoDlg.cityChange = function (e) {
+    var cityCode=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
+        if(data!=null){
+            var content='<option value="">选择区</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#districtCode").empty().append(content);
+        }
+    });
+    ajax.set("code",cityCode);
+    ajax.start();
+}
+/**
+ * 类型改变执行
+ * @param e
+ */
+TSiteInfoDlg.areaTypeClick = function (e) {
+    if (1 == e){//行政区域
+        $("#areaType1Div").show();
+        $("#areaType2Div").hide();
+    } else if (2 == e){
+        $("#areaType2Div").show();
+        $("#areaType1Div").hide();
+    }
+}
+
+//站点区域省改变
+TSiteInfoDlg.provinceChange1 = function (e) {
+    var provinceCode=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
+        if(data!=null){
+            var content='<option value="">选择市</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#cityCode1").empty().append(content);
+            $("#districtCode1").empty().append('<option value="">选择区</option>');
+        }
+    });
+    ajax.set("code",provinceCode);
+    ajax.start();
+}
+//站点区域市改变
+TSiteInfoDlg.cityChange1 = function (e) {
+    var cityCode=$(e).val();
+    var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
+        if(data!=null){
+            var content='<option value="">选择区</option>';
+            $.each(data, function(k,v) {
+                content += "<option value='"+v.code+"'>"+v.name+"</option>";
+            });
+            $("#districtCode1").empty().append(content);
+        }
+    });
+    ajax.set("code",cityCode);
+    ajax.start();
+}
+
+/**
+ * 添加区域
+ */
+TSiteInfoDlg.addArea = function () {
+    var areaName = $("#areaName").val();
+    if ("" == areaName || null == areaName){
+        Feng.error("区域名称不能为空");
+        return;
+    }
+    var areaType = $("input[name='areaType']:checked").val();
+    var b = false;
+    $(".areaValueClass").each(function () {
+        var areaType1 = $(this).find("input[name*='areaType1']").val();
+        if(areaType != areaType1){
+            b = true;
+            return
+        }
+    });
+    if(b){
+        Feng.error("电子围栏和行政区域不能混合使用");
+        return;
+    }
+
+    if (1 == areaType){
+        var provinceCode1 = $("#provinceCode1").val();
+        var province1 = $("#provinceCode1 option:selected").text();
+        var cityCode1 = $("#cityCode1").val();
+        var city1 = $("#cityCode1 option:selected").text();
+        var districtCode1 = $("#districtCode1").val();
+        var district1 = $("#districtCode1 option:selected").text();
+        if ("" == provinceCode1){
+            Feng.error("请选择行政区域所属省");
+            return;
+        }
+    }else if (2 == areaType) {
+        if("" == coordinate){
+            Feng.error('请在地图上规划区域');
+            return;
+        }
+    }
+    var subArr=[];
+    $(".areaValueClass").each(function () {
+        subArr.push({
+            areaType:$(this).find("input[name*='areaType1']").val(),
+            time:$(this).find("input[name*='time']").val(),
+            name:$(this).find("input[name*='name']").val(),
+            province:$(this).find("input[name*='province1']").val(),
+            provinceCode:$(this).find("input[name*='provinceCode1']").val(),
+            city:$(this).find("input[name*='city1']").val(),
+            cityCode:$(this).find("input[name*='cityCode1']").val(),
+            district:$(this).find("input[name*='district1']").val(),
+            districtCode:$(this).find("input[name*='districtCode1']").val(),
+            coordinate:$(this).find("input[name*='coordinate1']").val(),
+        })
+    });
+    var str = '<tr class="areaValueClass">' +
+        // '<td>' + (subArr.length+1) + '</td>' +
+        '<td style="text-align: center;">' +
+        '<input type="hidden" id="areaType1" name="areaType1" value="'+areaType+'">' +
+        '<input type="hidden" id="time" name="time" value="'+getNowFormatDate()+'">' + getNowFormatDate() + '</td>' +
+
+        '<td style="text-align: center;">' +
+        '<input type="hidden" id="name" name="name" value="'+areaName+'">' +
+        '<input type="hidden" id="provinceCode1" name="provinceCode1" value="'+provinceCode1+'">' +
+        '<input type="hidden" id="province1" name="province1" value="'+province1+'">' +
+        '<input type="hidden" id="cityCode1" name="cityCode1" value="'+cityCode1+'">' +
+        '<input type="hidden" id="city1" name="city1" value="'+city1+'">' +
+        '<input type="hidden" id="districtCode1" name="districtCode1" value="'+districtCode1+'">' +
+        '<input type="hidden" id="district1" name="district1" value="'+district1+'">' +
+        '<input type="hidden" id="coordinate1" name="coordinate1" value="'+coordinate+'">' + areaName + '</td>' +
+
+        '<td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#areaValue").append(str);
+
+    //清除电子围栏数据
+    $("#clear").click();
+}
+//删除数据
+function deleteSub(e) {
+    $(e).parent().parent().remove();
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tSmsrecord/tSmsrecord.js b/management/guns-admin/src/main/webapp/static/modular/system/tSmsrecord/tSmsrecord.js
new file mode 100644
index 0000000..9ac4317
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tSmsrecord/tSmsrecord.js
@@ -0,0 +1,158 @@
+/**
+ * 短信记录管理初始化
+ */
+var TSmsrecord = {
+    id: "TSmsrecordTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TSmsrecord.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '序号', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '发送时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '接收人手机号', field: 'phone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.phone != '' && row.phone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.phone + '" onfocus="TUser.tooltip()">' + row.phone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '发送内容', field: 'content', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.content != '' && row.content != null) {
+                    var str = row.content;
+                    if (str.length > 50){
+                        str = str.substring(0,50)+'...<br><button class="btn btn-outline btn-primary" onclick="TSmsrecord.buttonClick(' +  row.id+','+ 1+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.content + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '发送结果', field: 'result', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="成功" onfocus="TUser.tooltip()">成功</p>']
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 查看更多按钮
+ * @param con
+ */
+TSmsrecord.buttonClick = function (id,type) {
+    var index = layer.open({
+        type: 2,
+        title: '查看详情',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tSmsrecord/lookDetail/'+id+"/"+type
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 检查是否选中
+ */
+TSmsrecord.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TSmsrecord.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加短信记录
+ */
+TSmsrecord.openAddTSmsrecord = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加短信记录',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tSmsrecord/tSmsrecord_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看短信记录详情
+ */
+TSmsrecord.openTSmsrecordDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '短信记录详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tSmsrecord/tSmsrecord_update/' + TSmsrecord.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除短信记录
+ */
+TSmsrecord.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tSmsrecord/delete", function (data) {
+            Feng.success("删除成功!");
+            TSmsrecord.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tSmsrecordId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询短信记录列表
+ */
+TSmsrecord.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['phone'] = $("#phone").val();
+    TSmsrecord.table.refresh({query: queryData});
+};
+
+TSmsrecord.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#phone").val("");
+    TSmsrecord.search();
+};
+
+$(function () {
+    var defaultColunms = TSmsrecord.initColumn();
+    var table = new BSTable(TSmsrecord.id, "/tSmsrecord/list", defaultColunms);
+    table.setPaginationType("server");
+    TSmsrecord.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tSmsrecord/tSmsrecord_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tSmsrecord/tSmsrecord_info.js
new file mode 100644
index 0000000..8591eab
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tSmsrecord/tSmsrecord_info.js
@@ -0,0 +1,98 @@
+/**
+ * 初始化短信记录详情对话框
+ */
+var TSmsrecordInfoDlg = {
+    tSmsrecordInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TSmsrecordInfoDlg.clearData = function() {
+    this.tSmsrecordInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TSmsrecordInfoDlg.set = function(key, val) {
+    this.tSmsrecordInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TSmsrecordInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TSmsrecordInfoDlg.close = function() {
+    parent.layer.close(window.parent.TSmsrecord.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TSmsrecordInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('type')
+    .set('phone')
+    .set('code')
+    .set('content')
+    .set('createTime');
+}
+
+/**
+ * 提交添加
+ */
+TSmsrecordInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tSmsrecord/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TSmsrecord.table.refresh();
+        TSmsrecordInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tSmsrecordInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TSmsrecordInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tSmsrecord/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TSmsrecord.table.refresh();
+        TSmsrecordInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tSmsrecordInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tSysSensitiveWords/tSysSensitiveWords.js b/management/guns-admin/src/main/webapp/static/modular/system/tSysSensitiveWords/tSysSensitiveWords.js
new file mode 100644
index 0000000..5a8c975
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tSysSensitiveWords/tSysSensitiveWords.js
@@ -0,0 +1,122 @@
+/**
+ * 敏感词管理管理初始化
+ */
+var TSysSensitiveWords = {
+    id: "TSysSensitiveWordsTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TSysSensitiveWords.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '创建时间', field: 'createTime', visible: true, align: 'center', valign: 'middle',width:'50%'},
+        {title: '敏感词', field: 'content', visible: true, align: 'center', valign: 'middle',width:'50%'}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TSysSensitiveWords.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TSysSensitiveWords.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加敏感词管理
+ */
+TSysSensitiveWords.openAddTSysSensitiveWords = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加敏感词管理',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tSysSensitiveWords/tSysSensitiveWords_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看敏感词管理详情
+ */
+TSysSensitiveWords.openTSysSensitiveWordsDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '敏感词管理详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tSysSensitiveWords/tSysSensitiveWords_update/' + TSysSensitiveWords.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除敏感词管理
+ */
+TSysSensitiveWords.delete = function () {
+    if (this.check()) {
+        var nickname = TSysSensitiveWords.seItem.content;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该敏感词";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        swal({
+            title: "您是否确认删除" + nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tSysSensitiveWords/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "。", "success");
+                TSysSensitiveWords.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tSysSensitiveWordsId",TSysSensitiveWords.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询敏感词管理列表
+ */
+TSysSensitiveWords.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['content'] = $("#content").val();
+    TSysSensitiveWords.table.refresh({query: queryData});
+};
+
+TSysSensitiveWords.resetSearch = function () {
+    $("#createTime").val("");
+    $("#content").val("");
+    TSysSensitiveWords.search();
+};
+
+$(function () {
+    var defaultColunms = TSysSensitiveWords.initColumn();
+    var table = new BSTable(TSysSensitiveWords.id, "/tSysSensitiveWords/list", defaultColunms);
+    table.setPaginationType("server");
+    TSysSensitiveWords.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tSysSensitiveWords/tSysSensitiveWords_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tSysSensitiveWords/tSysSensitiveWords_info.js
new file mode 100644
index 0000000..9447050
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tSysSensitiveWords/tSysSensitiveWords_info.js
@@ -0,0 +1,105 @@
+/**
+ * 初始化敏感词管理详情对话框
+ */
+var TSysSensitiveWordsInfoDlg = {
+    tSysSensitiveWordsInfoData : {},
+    validateFields: {
+        content: {
+            validators: {
+                notEmpty: {
+                    message: '敏感词不能为空'
+                }/*,
+                regexp: {
+                    regexp: /^.{1,15}$/,
+                    message: '敏感词最多15个字'
+                }*/
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TSysSensitiveWordsInfoDlg.validate = function () {
+    $('#sysSensitiveWordsForm').data("bootstrapValidator").resetForm();
+    $('#sysSensitiveWordsForm').bootstrapValidator('validate');
+    return $("#sysSensitiveWordsForm").data('bootstrapValidator').isValid();
+};
+
+
+/**
+ * 清除数据
+ */
+TSysSensitiveWordsInfoDlg.clearData = function() {
+    this.tSysSensitiveWordsInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TSysSensitiveWordsInfoDlg.set = function(key, val) {
+    this.tSysSensitiveWordsInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TSysSensitiveWordsInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TSysSensitiveWordsInfoDlg.close = function() {
+    parent.layer.close(window.parent.TSysSensitiveWords.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TSysSensitiveWordsInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('createTime')
+    .set('content');
+}
+
+/**
+ * 提交添加
+ */
+TSysSensitiveWordsInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var content = $("#content").val();
+    if (content.length > 15){
+        Feng.info("敏感词不能超过15个字");
+        return;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tSysSensitiveWords/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TSysSensitiveWords.table.refresh();
+        TSysSensitiveWordsInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tSysSensitiveWordsInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("sysSensitiveWordsForm", TSysSensitiveWordsInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tSystemPrice/tSystemPrice.js b/management/guns-admin/src/main/webapp/static/modular/system/tSystemPrice/tSystemPrice.js
new file mode 100644
index 0000000..2ff9bae
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tSystemPrice/tSystemPrice.js
@@ -0,0 +1,229 @@
+/**
+ * 专车价格设置管理初始化
+ */
+var TSystemPrice = {
+    id: "TSystemPriceTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TSystemPrice.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '车型名称', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '车型图片', field: 'img', visible: true, align: 'center', valign: 'middle',width:'20%',
+            formatter: function (value, row) {
+                if (row.img == null || row.img == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.img + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if(row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                    }else if(row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="冻结" onfocus="TUser.tooltip()">冻结</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TSystemPrice.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TSystemPrice.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加专车价格设置
+ */
+TSystemPrice.addSpecial = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加专车价格设置',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tSystemPrice/tSystemPrice_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看专车价格设置详情
+ */
+TSystemPrice.updateSpecial = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '专车价格设置详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tSystemPrice/tSystemPrice_update/' + TSystemPrice.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除专车价格设置
+ */
+TSystemPrice.deleteSpecial = function () {
+    if (this.check()) {
+        var name = TSystemPrice.seItem.name;
+        if (name == "" || name == null || name == undefined){
+            name = "该专车车型价格配置";
+        }else{
+            name = "【"+name+"】价格配置";
+        }
+        swal({
+            title: "您是否确认删除"+ name + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: true
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tSystemPrice/opt", function (data) {
+                swal("删除成功", "您已经删除了" + name + "。", "success");
+                TSystemPrice.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tSystemPriceId",TSystemPrice.seItem.id);
+            ajax.set("optType",3);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 冻结
+ */
+TSystemPrice.freezeSpecial = function(){
+    if (this.check()) {
+        var name = TSystemPrice.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该专车车型价格配置";
+        } else {
+            name = "【" + name + "】价格配置";
+        }
+        if (TSystemPrice.seItem.state != 1) {
+            swal("冻结失败", "【正常】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            swal({
+                title: "您是否确认冻结"+ name + "?",
+                text: "请谨慎操作,删除后数据无法恢复!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "冻结",
+                closeOnConfirm: true
+            }, function () {
+                var ajax = new $ax(Feng.ctxPath + "/tSystemPrice/opt", function (data) {
+                    swal("冻结成功", "您已经冻结了" + name + "。", "success");
+                    TSystemPrice.table.refresh();
+                }, function (data) {
+                    swal("冻结失败", data.responseJSON.message + "!", "warning");
+                });
+                ajax.set("tSystemPriceId",TSystemPrice.seItem.id);
+                ajax.set("optType", 1);
+                ajax.start();
+            });
+        }
+    }
+}
+
+/**
+ * 解冻
+ */
+TSystemPrice.thawSpecial = function(){
+    if (this.check()) {
+        var name = TSystemPrice.seItem.name;
+        if (name == "" || name == null || name == undefined) {
+            name = "该专车车型价格配置";
+        } else {
+            name = "【" + name + "】价格配置";
+        }
+        if (TSystemPrice.seItem.state != 2) {
+            swal("解冻失败", "【冻结】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            swal({
+                title: "您是否确认解冻"+ name + "?",
+                text: "请谨慎操作,删除后数据无法恢复!",
+                type: "warning",
+                showCancelButton: true,
+                confirmButtonColor: "#DD6B55",
+                confirmButtonText: "解冻",
+                closeOnConfirm: true
+            }, function () {
+                var ajax = new $ax(Feng.ctxPath + "/tSystemPrice/opt", function (data) {
+                    swal("解冻成功", "您已经解冻了" + name + "。", "success");
+                    TSystemPrice.table.refresh();
+                }, function (data) {
+                    swal("解冻失败", data.responseJSON.message + "!", "warning");
+                });
+                ajax.set("tSystemPriceId",TSystemPrice.seItem.id);
+                ajax.set("optType", 2);
+                ajax.start();
+            });
+        }
+    }
+}
+
+/**
+ * 查询专车价格设置列表
+ */
+TSystemPrice.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['state'] = $("#state").val();
+    TSystemPrice.table.refresh({query: queryData});
+};
+
+TSystemPrice.resetSearch = function () {
+    $("#name").val("");
+    $("#state").val("");
+    TSystemPrice.search();
+};
+
+$(function () {
+    var defaultColunms = TSystemPrice.initColumn();
+    var table = new BSTable(TSystemPrice.id, "/tSystemPrice/listSpecial", defaultColunms);
+    table.setPaginationType("server");
+    TSystemPrice.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tSystemPrice/tSystemPrice_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tSystemPrice/tSystemPrice_info.js
new file mode 100644
index 0000000..e328209
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tSystemPrice/tSystemPrice_info.js
@@ -0,0 +1,477 @@
+/**
+ * 初始化专车价格设置详情对话框
+ */
+var TSystemPriceInfoDlg = {
+    tSystemPriceInfoData : {},
+    validateFields: {
+        serverCarModelId: {
+            validators: {
+                notEmpty: {
+                    message: '请选择车型'
+                }
+            }
+        },
+        fareTypeNote: {
+            validators: {
+                notEmpty: {
+                    message: '运价类型说明不能为空'
+                }
+            }
+        },
+        num1: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num2: {
+            validators: {
+                notEmpty: {
+                    message: '【公里】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【公里】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num3: {
+            validators: {
+                notEmpty: {
+                    message: '【分钟】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^[0-9]{0,3}$/,
+                    message: '【分钟】输入框不能超过3位数'
+                }
+            }
+        },
+        num4: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num5: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num6: {
+            validators: {
+                notEmpty: {
+                    message: '【分钟】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^[0-9]{0,3}$/,
+                    message: '【分钟】输入框不能超过3位数'
+                }
+            }
+        },
+        num7: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num8: {
+            validators: {
+                notEmpty: {
+                    message: '【公里】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【公里】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num9: {
+            validators: {
+                notEmpty: {
+                    message: '【公里】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【公里】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num10: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num11: {
+            validators: {
+                notEmpty: {
+                    message: '【公里】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【公里】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num12: {
+            validators: {
+                notEmpty: {
+                    message: '【公里】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【公里】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num13: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num14: {
+            validators: {
+                notEmpty: {
+                    message: '【公里】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【公里】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num15: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num16: {
+            validators: {
+                notEmpty: {
+                    message: '【时间】输入框不能为空'
+                }
+            }
+        },
+        num17: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num18: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num19: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num20: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num21: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num22: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num23: {
+            validators: {
+                notEmpty: {
+                    message: '【时间】输入框不能为空'
+                }
+            }
+        },
+        num24: {
+            validators: {
+                notEmpty: {
+                    message: '【时间】输入框不能为空'
+                }
+            }
+        },
+        num25: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num26: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num27: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num28: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num29: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        },
+        num30: {
+            validators: {
+                notEmpty: {
+                    message: '【元】输入框不能为空'
+                },
+                regexp: {
+                    regexp: /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/,
+                    message: '【元】输入框不能超过3位数,保留两位小数'
+                }
+            }
+        }
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TSystemPriceInfoDlg.validate = function () {
+    $('#specialPriceInfoForm').data("bootstrapValidator").resetForm();
+    $('#specialPriceInfoForm').bootstrapValidator('validate');
+    return $("#specialPriceInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TSystemPriceInfoDlg.clearData = function() {
+    this.tSystemPriceInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TSystemPriceInfoDlg.set = function(key, val) {
+    this.tSystemPriceInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TSystemPriceInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TSystemPriceInfoDlg.close = function() {
+    parent.layer.close(window.parent.TSystemPrice.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TSystemPriceInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('type')
+    .set('companyId')
+    .set('serverCarModelId')
+    .set('fareTypeNote')
+    .set('content');
+}
+
+/**
+ * 提交添加
+ */
+TSystemPriceInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var content = '{';
+    //拼接数据
+    $("input").each(function(){
+        var value = $(this).val();
+        content = content + '"'+$(this)[0].name+'":"'+value+'",';
+    });
+    content = content.substring(0,content.length-1);
+    content += '}';
+    console.log(content);
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tSystemPrice/add", function(data){
+        if (500 == data.code){
+            Feng.error(data.message);
+            return;
+        }else{
+            Feng.success("添加成功!");
+            window.parent.TSystemPrice.table.refresh();
+            TSystemPriceInfoDlg.close();
+        }
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tSystemPriceInfoData);
+    ajax.set("content",content);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TSystemPriceInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var content = '{';
+    //拼接数据
+    $("input").each(function(){
+        var value = $(this).val();
+        content = content + '"'+$(this)[0].name+'":"'+value+'",';
+    });
+    content = content.substring(0,content.length-1);
+    content += '}';
+    console.log(content);
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tSystemPrice/update", function(data){
+        if (500 == data.code){
+            Feng.error(data.message);
+            return;
+        }else {
+            Feng.success("修改成功!");
+            window.parent.TSystemPrice.table.refresh();
+            TSystemPriceInfoDlg.close();
+        }
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tSystemPriceInfoData);
+    ajax.set("id",$("#id").html());
+    ajax.set("content",content);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("specialPriceInfoForm", TSystemPriceInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tUser/tUser.js b/management/guns-admin/src/main/webapp/static/modular/system/tUser/tUser.js
new file mode 100644
index 0000000..176a1f5
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tUser/tUser.js
@@ -0,0 +1,386 @@
+/**
+ * 用户管理管理初始化
+ */
+var TUser = {
+    id: "TUserTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 鼠标悬停提示框 class .toolTip 为无效样式,作用于个别选择器使用
+ */
+TUser.tooltip = function(){
+    $(".toolTip").tooltip();
+};
+
+/**
+ * 初始化表格的列
+ */
+TUser.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '注册时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用户ID', field: 'id', visible: true, align: 'center', valign: 'middle',width:'8%'},
+       /* {title: '注册地IP', field: 'registIp', visible: true, align: 'center', valign: 'middle',width:'5%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.registIp != '' && row.registIp != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.registIp + '" onfocus="TUser.tooltip()">' + row.registIp + '</p>']
+                }
+                return btn;
+            }
+        },*/
+        {title: '注册地所<br/>属分公司ID', field: 'companyId', visible: false, align: 'center', valign: 'middle',width:'8%'},
+        {title: '注册地所<br/>属分公司', field: 'companyName', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.companyName != '' && row.companyName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.companyName + '" onfocus="TUser.tooltip()">' + row.companyName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '昵称', field: 'nickName', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.nickName != '' && row.nickName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.nickName + '" onfocus="TUser.tooltip()">' + row.nickName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '手机号', field: 'phone', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.phone != '' && row.phone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.phone + '" onfocus="TUser.tooltip()">' + row.phone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '紧急联系人<br/>姓名', field: 'emergencyContact', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.emergencyContact != '' && row.emergencyContact != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.emergencyContact + '" onfocus="TUser.tooltip()">' + row.emergencyContact + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '紧急联系人<br/>电话', field: 'emergencyContactNumber', visible: true, align: 'center', valign: 'middle',width:'8%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.emergencyContactNumber != '' && row.emergencyContactNumber != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.emergencyContactNumber + '" onfocus="TUser.tooltip()">' + row.emergencyContactNumber + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '是否实<br/>名认证', field: 'isAuth', visible: true, align: 'center', valign: 'middle',width:'5%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.isAuth != '' && row.isAuth != null) {
+                    if (row.isAuth == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="否" onfocus="TUser.tooltip()">否</p>']
+                    } else if (row.isAuth == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="是" onfocus="TUser.tooltip()">是</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '历史出<br/>行次数', field: 'historyNum', visible: true, align: 'center', valign: 'middle',width:'5%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.historyNum != '' && row.historyNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.historyNum + '" onfocus="TUser.tooltip()">' + row.historyNum + '</p>']
+                }else {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '历史消费', field: 'consumptionNum', visible: true, align: 'center', valign: 'middle',width:'5%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.consumptionNum != '' && row.consumptionNum != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="¥' + row.consumptionNum + '" onfocus="TUser.tooltip()">¥' + row.consumptionNum + '</p>']
+                }else {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="¥0.00" onfocus="TUser.tooltip()">¥0.00</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '积分', field: 'integral', visible: true, align: 'center', valign: 'middle',width:'5%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.integral != '' && row.integral != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.integral + '" onfocus="TUser.tooltip()">' + row.integral + '</p>']
+                }else {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="0" onfocus="TUser.tooltip()">0</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.remark != '' && row.remark != null){
+                    var str = row.remark;
+                    if (row.remark.length > 10){
+                        str = row.remark.substring(0,10)+"...";
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.remark + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',width:'5%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if (row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: #0d8ddb;" title="正常" onfocus="TUser.tooltip()">正常</p>']
+                    } else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="冻结" onfocus="TUser.tooltip()">冻结</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TUser.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TUser.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 修改余额
+ */
+TUser.updateBalance = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '修改余额',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tUser/tUser_updateBalance/'+ TUser.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+/**
+ * 修改密码
+ */
+TUser.updatePassword = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '修改密码',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tUser/tUser_updatePassword/'+ TUser.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 打开查看用户管理详情
+ */
+TUser.userDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '用户详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tUser/tUser_userDetail/' + TUser.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 冻结用户
+ */
+TUser.freezeUser = function () {
+    if (this.check()) {
+        var nickname = TUser.seItem.nickName;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该用户";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (TUser.seItem.state != 1) {
+            swal("冻结失败", "【正常】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            var index = layer.open({
+                type: 2,
+                title: '冻结用户',
+                area: ['800px', '420px'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/tUser/tUser_optUser/' + TUser.seItem.id +"/"+1
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+/**
+ * 解冻用户
+ */
+TUser.trawUser = function () {
+    if (this.check()) {
+        var nickname = TUser.seItem.nickName;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该用户";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (TUser.seItem.state != 2) {
+            swal("启用失败", "【冻结】状态下才能执行此操作", "warning");
+            return;
+        } else {
+            var index = layer.open({
+                type: 2,
+                title: '解冻用户',
+                area: ['800px', '420px'], //宽高
+                fix: false, //不固定
+                maxmin: true,
+                content: Feng.ctxPath + '/tUser/tUser_optUser/' + TUser.seItem.id +"/"+2
+            });
+            this.layerIndex = index;
+        }
+    }
+};
+
+/**
+ * 查询用户管理列表
+ */
+TUser.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['id'] = $("#id").val();
+    queryData['nickName'] = $("#nickName").val();
+    queryData['phone'] = $("#phone").val();
+    queryData['isAuth'] = $("#isAuth").val();
+    queryData['state'] = $("#state").val();
+    TUser.table.refresh({query: queryData});
+};
+TUser.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#id").val("");
+    $("#nickName").val("");
+    $("#phone").val("");
+    $("#isAuth").val("");
+    $("#state").val("");
+    TUser.search();
+};
+
+$(function () {
+    var defaultColunms = TUser.initColumn();
+    var table = new BSTable(TUser.id, "/tUser/list", defaultColunms);
+    // 设置物理分页server(逻辑分页client)
+    table.setPaginationType("server");
+    TUser.table = table.init();
+});
+
+/**
+ * 下载模板
+ */
+TUser.uploadUserModel = function () {
+    window.location.href = Feng.ctxPath + "/tUser/uploadUserModel";
+}
+
+var agreement = function(){
+    this.init = function(){
+        //模拟上传excel  
+        $("#uploadEventBtn").unbind("click").bind("click",function(){
+            $("#uploadEventFile").click();
+        });
+    };
+}
+/**
+ * 导入合同
+ */
+TUser.exportUser = function () {
+    var uploadEventFile = $("#uploadEventFile").val();
+    if(uploadEventFile == ''){
+        Feng.info("请选择Excel,再上传");
+    }else if(uploadEventFile.lastIndexOf(".xls")<0){//可判断以.xls和.xlsx结尾的excel  
+        Feng.info("只能上传Excel文件");
+    }else{
+        var url = Feng.ctxPath + '/tUser/exportUser';
+        var file = document.querySelector('input[name=file]').files[0];
+        var reader = new FileReader();
+        if (file) {
+            var formData = new FormData();
+            formData.append("myfile", file);
+            this.sendAjaxRequest(url, 'POST', formData);
+        }
+    }
+}
+TUser.sendAjaxRequest = function(url,type,data){
+    $.ajax({
+        url : url,
+        type : type,
+        data : data,
+        success : function(result) {
+            if(result.code==500) {
+                Feng.info(result.message);
+            }else {
+                Feng.success("导入成功!");
+            }
+            TUser.table.refresh();
+        },
+        error : function() {
+            Feng.error("excel上传失败!");
+        },
+        cache : false,
+        contentType : false,
+        processData : false
+    });
+};
+
+var agreement;
+$(function(){
+    agreement = new agreement();
+    agreement.init();
+});
+
+/**
+ * 导出车辆操作
+ */
+TUser.outUser = function () {
+    var operation = function() {
+        window.location.href = Feng.ctxPath + "/tUser/outUser";
+    };
+    Feng.confirm("是否确认导出用户信息?", operation);
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tUser/tUser_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tUser/tUser_info.js
new file mode 100644
index 0000000..9b91c59
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tUser/tUser_info.js
@@ -0,0 +1,218 @@
+/**
+ * 初始化用户管理详情对话框
+ */
+var TUserInfoDlg = {
+    tUserInfoData : {},
+    validateFields: {
+        updateType: {
+            validators: {
+                notEmpty: {
+                    message: '请选择修改类型'
+                }
+            }
+        },
+        money: {
+            validators: {
+                notEmpty: {
+                    message: '修改值不能为空'
+                },
+                regexp: {
+                    regexp: /^(([1-9]{1}\d*)|(0{1}))(\.\d{0,2})?$/,
+                    message: '修改值不正确,并保留两位小数'
+                }
+            }
+        },
+        password: {
+            validators: {
+                notEmpty: {
+                    message: '密码不能为空'
+                },
+                regexp:{
+                    regexp: /^.{6,18}$/,
+                    message: '密码长度为6-18'
+                },
+                identical: {
+                    field: 'rePassword',
+                    message: '两次密码不一致'
+                },
+            }
+        },
+        rePassword: {
+            validators: {
+                notEmpty: {
+                    message: '密码不能为空'
+                },
+                regexp:{
+                    regexp: /^.{6,18}$/,
+                    message: '密码长度为6-18'
+                },
+                identical: {
+                    field: 'password',
+                    message: '两次密码不一致'
+                },
+            }
+        },
+        remark: {
+            validators: {
+                notEmpty: {
+                    message: '备注不能为空'
+                }
+            }
+        }
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TUserInfoDlg.validate = function () {
+    $('#userInfoForm').data("bootstrapValidator").resetForm();
+    $('#userInfoForm').bootstrapValidator('validate');
+    return $("#userInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TUserInfoDlg.clearData = function() {
+    this.tUserInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TUserInfoDlg.set = function(key, val) {
+    this.tUserInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TUserInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TUserInfoDlg.close = function() {
+    parent.layer.close(window.parent.TUser.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TUserInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('companyId')
+    .set('registIp')
+    .set('registAreaCode')
+    .set('phone')
+    .set('nickName')
+    .set('avatar')
+    .set('birthday')
+    .set('sex')
+    .set('emergencyContact')
+    .set('emergencyContactNumber')
+    .set('isAuth')
+    .set('name')
+    .set('idCard')
+    .set('idCardFront')
+    .set('idCardReverse')
+    .set('consumption')
+    .set('balance')
+    .set('integral')
+    .set('passWord')
+    .set('openId')
+    .set('unionid')
+    .set('remark')
+    .set('state')
+    .set('flag')
+    .set('insertTime')
+    .set('insertUser')
+    .set('updateTime')
+    .set('updateUser');
+}
+
+/**
+ * 修改余额
+ */
+TUserInfoDlg.updateBalance = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tUser/updateBalance", function(data){
+        Feng.success("修改成功!");
+        window.parent.TUser.table.refresh();
+        TUserInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("tUserId",$("#tUserId").val());
+    ajax.set("updateType",$("#updateType").val());
+    ajax.set("money",$("#money").val());
+    ajax.start();
+}
+
+/**
+ * 修改密码
+ */
+TUserInfoDlg.updatePassword = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tUser/updatePassword", function(data){
+        Feng.success("修改成功!");
+        window.parent.TUser.table.refresh();
+        TUserInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("tUserId",$("#tUserId").val());
+    ajax.set("password",$("#password").val());
+    ajax.start();
+}
+
+/**
+ * 操作提交
+ */
+TUserInfoDlg.optUser = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tUser/optUser", function(data){
+        Feng.success("修改成功!");
+        window.parent.TUser.table.refresh();
+        TUserInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("tUserId",$("#tUserId").val());
+    ajax.set("optType",$("#optType").val());
+    ajax.set("remark",$("#remark").val());
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("userInfoForm", TUserInfoDlg.validateFields);
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tUserRedPacketRecord/tUserRedPacketRecord.js b/management/guns-admin/src/main/webapp/static/modular/system/tUserRedPacketRecord/tUserRedPacketRecord.js
new file mode 100644
index 0000000..9b51d96
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tUserRedPacketRecord/tUserRedPacketRecord.js
@@ -0,0 +1,130 @@
+/**
+ * 管理初始化
+ */
+var TUserRedPacketRecord = {
+    id: "TUserRedPacketRecordTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TUserRedPacketRecord.initColumn = function () {
+    return [
+        {title: '', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '领取时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '领取人', field: 'nickName', visible: true, align: 'center', valign: 'middle'},
+        {title: '领取人电话', field: 'phone', visible: true, align: 'center', valign: 'middle'},
+        {title: '领取金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+        {title: '到期时间', field: 'expirationTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                if(value==1){
+                    return "未使用";
+                }else if(value==2){
+                    return "已使用";
+                }else if(value==3){
+                    return "已过期";
+                }else{
+                    return "";
+                }
+            }
+        },
+        {title: '使用时间', field: 'useTime', visible: true, align: 'center', valign: 'middle'}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TUserRedPacketRecord.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TUserRedPacketRecord.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+TUserRedPacketRecord.openAddTUserRedPacketRecord = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tUserRedPacketRecord/tUserRedPacketRecord_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+TUserRedPacketRecord.openTUserRedPacketRecordDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tUserRedPacketRecord/tUserRedPacketRecord_update/' + TUserRedPacketRecord.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+TUserRedPacketRecord.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/tUserRedPacketRecord/delete", function (data) {
+            Feng.success("删除成功!");
+            TUserRedPacketRecord.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tUserRedPacketRecordId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询列表
+ */
+TUserRedPacketRecord.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['couponActivityId'] = $("#couponActivityId").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['userPhone'] = $("#userPhone").val();
+    queryData['state'] = $("#state").val();
+    TUserRedPacketRecord.table.refresh({query: queryData});
+};
+TUserRedPacketRecord.resetSearch = function () {
+    $("#createTime").val("");
+    $("#userName").val("");
+    $("#userPhone").val("");
+    $("#state").val("");
+    TUserRedPacketRecord.search();
+};
+$(function () {
+    var defaultColunms = TUserRedPacketRecord.initColumn();
+    var table = new BSTable(TUserRedPacketRecord.id, "/tUserRedPacketRecord/list", defaultColunms);
+    table.setPaginationType("server");
+
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['couponActivityId'] = $("#couponActivityId").val();
+    table.setQueryParams(queryData);
+    TUserRedPacketRecord.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tUserRedPacketRecord/tUserRedPacketRecord_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tUserRedPacketRecord/tUserRedPacketRecord_info.js
new file mode 100644
index 0000000..3a46fa1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tUserRedPacketRecord/tUserRedPacketRecord_info.js
@@ -0,0 +1,102 @@
+/**
+ * 初始化详情对话框
+ */
+var TUserRedPacketRecordInfoDlg = {
+    tUserRedPacketRecordInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TUserRedPacketRecordInfoDlg.clearData = function() {
+    this.tUserRedPacketRecordInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TUserRedPacketRecordInfoDlg.set = function(key, val) {
+    this.tUserRedPacketRecordInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TUserRedPacketRecordInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TUserRedPacketRecordInfoDlg.close = function() {
+    parent.layer.close(window.parent.TUserRedPacketRecord.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TUserRedPacketRecordInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('money')
+    .set('expirationTime')
+    .set('insertTime')
+    .set('companyId')
+    .set('state')
+    .set('orderId')
+    .set('orderType')
+    .set('userId')
+    .set('redPacketActivityId');
+}
+
+/**
+ * 提交添加
+ */
+TUserRedPacketRecordInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tUserRedPacketRecord/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TUserRedPacketRecord.table.refresh();
+        TUserRedPacketRecordInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tUserRedPacketRecordInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TUserRedPacketRecordInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tUserRedPacketRecord/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TUserRedPacketRecord.table.refresh();
+        TUserRedPacketRecordInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tUserRedPacketRecordInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tVerified/tVerified.js b/management/guns-admin/src/main/webapp/static/modular/system/tVerified/tVerified.js
new file mode 100644
index 0000000..0a7c0a3
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tVerified/tVerified.js
@@ -0,0 +1,217 @@
+/**
+ * 实名认证列表管理初始化
+ */
+var TVerified = {
+    id: "TVerifiedTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TVerified.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '提交时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '用户ID', field: 'userId', visible: false, align: 'center', valign: 'middle'},
+        {title: '提交用户<br/>昵称', field: 'userName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userName != '' && row.userName != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '提交用户<br/>手机号', field: 'userPhone', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.userPhone != '' && row.userPhone != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userPhone + '" onfocus="TUser.tooltip()">' + row.userPhone + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '认证姓名', field: 'name', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.name != '' && row.name != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.name + '" onfocus="TUser.tooltip()">' + row.name + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '身份证<br/>号码', field: 'idcode', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.idcode != '' && row.idcode != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.idcode + '" onfocus="TUser.tooltip()">' + row.idcode + '</p>']
+                }
+                return btn;
+            }
+        },
+       /* {title: '身份证正面照', field: 'img1', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                if (row.img1 == null || row.img1 == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.img1 + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },
+        {title: '身份证背面照', field: 'img2', visible: true, align: 'center', valign: 'middle',width:'15%',
+            formatter: function (value, row) {
+                if (row.img2 == null || row.img2 == '') {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 50px;height:50px;" src="' + Feng.ctxPath + '/static/img/NoPIC.png" /></a>';
+                } else {
+                    return '<a class = "view"  href="javascript:void(0)"><img style="width: 90px;height:50px;" src="' + row.img2 + '" /></a>';
+                }
+            },
+            events: 'operateEvents'
+        },*/
+        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.state != '' && row.state != null) {
+                    if(row.state == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="待认证" onfocus="TUser.tooltip()">待认证</p>']
+                    }else if (row.state == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="认证通过" onfocus="TUser.tooltip()">认证通过</p>']
+                    }else if (row.state == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="认证失败" onfocus="TUser.tooltip()">认证失败</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TVerified.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TVerified.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加实名认证列表
+ */
+TVerified.openAddTVerified = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加实名认证列表',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tVerified/tVerified_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开立即审核页面
+ */
+TVerified.immediately = function () {
+    if (this.check()) {
+        if (TVerified.seItem.state != 1 ) {
+            swal("审核失败", "【待认证】状态下才能执行此操作", "warning");
+            return;
+        }
+        var index = layer.open({
+            type: 2,
+            title: '立即审核',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tVerified/tVerified_immediately/' + TVerified.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除实名认证列表
+ */
+TVerified.delete = function () {
+    if (this.check()) {
+        var nickname = TVerified.seItem.name;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该认证";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        if (TVerified.seItem.state != 3) {
+            swal("删除失败", "【认证失败】状态下才能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除" + nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tVerified/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "。", "success");
+                TVerified.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tVerifiedId",TVerified.seItem.id);
+            ajax.start();
+        });
+    }
+
+};
+
+/**
+ * 查询实名认证列表列表
+ */
+TVerified.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['userPhone'] = $("#userPhone").val();
+    queryData['name'] = $("#name").val();
+    queryData['state'] = $("#state").val();
+    TVerified.table.refresh({query: queryData});
+};
+
+TVerified.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#userName").val("");
+    $("#userPhone").val("");
+    $("#name").val("");
+    $("#state").val("");
+    TVerified.search();
+};
+
+$(function () {
+    var defaultColunms = TVerified.initColumn();
+    var table = new BSTable(TVerified.id, "/tVerified/list", defaultColunms);
+    table.setPaginationType("server");
+    TVerified.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tVerified/tVerified_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tVerified/tVerified_info.js
new file mode 100644
index 0000000..c8b321a
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tVerified/tVerified_info.js
@@ -0,0 +1,118 @@
+/**
+ * 初始化实名认证列表详情对话框
+ */
+var TVerifiedInfoDlg = {
+    tVerifiedInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TVerifiedInfoDlg.clearData = function() {
+    this.tVerifiedInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TVerifiedInfoDlg.set = function(key, val) {
+    this.tVerifiedInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TVerifiedInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TVerifiedInfoDlg.close = function() {
+    parent.layer.close(window.parent.TVerified.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TVerifiedInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('userId')
+    .set('name')
+    .set('idcode')
+    .set('img1')
+    .set('img2')
+    .set('state')
+    .set('insertTime');
+}
+
+/**
+ * 提交添加
+ */
+TVerifiedInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tVerified/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TVerified.table.refresh();
+        TVerifiedInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tVerifiedInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TVerifiedInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tVerified/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TVerified.table.refresh();
+        TVerifiedInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tVerifiedInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
+
+/**
+ * 立即处理操作
+ */
+TVerifiedInfoDlg.immediately = function () {
+    var state = $("input[name='state']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tVerified/immediately", function(data){
+        Feng.success("操作成功!");
+        window.parent.TVerified.table.refresh();
+        TVerifiedInfoDlg.close();
+    },function(data){
+        Feng.error("操作失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("state",state);
+    ajax.start();
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tVersionManagement/tVersionManagement.js b/management/guns-admin/src/main/webapp/static/modular/system/tVersionManagement/tVersionManagement.js
new file mode 100644
index 0000000..55c73c1
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tVersionManagement/tVersionManagement.js
@@ -0,0 +1,222 @@
+/**
+ * 版本管理管理初始化
+ */
+var TVersionManagement = {
+    id: "TVersionManagementTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TVersionManagement.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '序号', field: 'id', visible: true, align: 'center', valign: 'middle',width:'5%'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle',width:'10%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.insertTime != '' && row.insertTime != null) {
+                    var time = row.insertTime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '版本编号', field: 'version', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.version != '' && row.version != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.version + '" onfocus="TUser.tooltip()">' + row.version + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '端口类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.type != '' && row.type != null) {
+                    if (row.type == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="用户端" onfocus="TUser.tooltip()">用户端</p>']
+                    } else if (row.type == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="司机端" onfocus="TUser.tooltip()">司机端</p>']
+                    } else if (row.type == 3){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="车载端" onfocus="TUser.tooltip()">车载端</p>']
+                    }else if (row.type == 4){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="调度端" onfocus="TUser.tooltip()">调度端</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '文件', field: 'url', visible: true, align: 'center', valign: 'middle',width:'40%',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.url != '' && row.url != null) {
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.url + '" onfocus="AppUserInfo.tooltip()">' + row.url + '</p>' +
+                    '<button class="btn" onclick="TVersionManagement.copy(\''+row.url+'\')"> 复制 </button>']
+                }
+                return btn;
+            }
+        },
+        {title: '是否强制<br/>更新', field: 'mandatory', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.mandatory != '' && row.mandatory != null) {
+                    if (row.mandatory == 1){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="是" onfocus="AppUserInfo.tooltip()">是</p>']
+                    } else if (row.mandatory == 2){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="否" onfocus="AppUserInfo.tooltip()">否</p>']
+                    }
+                }
+                return btn;
+            }
+        },
+        {title: '版本<br/>公告', field: 'content', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.content != '' && row.content != null) {
+                    var str = row.content;
+                    if (str.length > 20){
+                        str = str.substring(0,20)+'...<br><button class="btn btn-outline btn-primary" onclick="TVersionManagement.buttonClick(' +  row.id+','+ 1+ ')">查看更多</button>';
+                    }
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.content + '" onfocus="TUser.tooltip()">' + str + '</p>']
+                }
+                return btn;
+            }
+        }
+    ];
+};
+
+/**
+ * 查看更多按钮
+ * @param con
+ */
+TVersionManagement.buttonClick = function (id,type) {
+    var index = layer.open({
+        type: 2,
+        title: '查看详情',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tVersionManagement/lookDetail/'+id+"/"+type
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 复制文本内容
+ * @param value
+ */
+TVersionManagement.copy = function(value){
+    var sss = document.getElementById("input");
+    sss.value = value;
+    if (document.execCommand("copy")) {
+        sss.select();
+        document.execCommand("copy");
+    }
+}
+
+/**
+ * 检查是否选中
+ */
+TVersionManagement.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TVersionManagement.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加版本管理
+ */
+TVersionManagement.openAddTVersionManagement = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加版本',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tVersionManagement/tVersionManagement_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看版本管理详情
+ */
+TVersionManagement.openTVersionManagementDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '版本管理详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tVersionManagement/tVersionManagement_update/' + TVersionManagement.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除版本管理
+ */
+TVersionManagement.delete = function () {
+    if (this.check()) {
+        var nickname = TVersionManagement.seItem.version;
+        if (nickname == "" || nickname == null || nickname == undefined) {
+            nickname = "该版本";
+        } else {
+            nickname = "【" + nickname + "】";
+        }
+        swal({
+            title: "您是否确认删除" + nickname + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tVersionManagement/delete", function (data) {
+                swal("删除成功", "您已经删除了" + nickname + "。", "success");
+                TVersionManagement.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tVersionManagementId",TVersionManagement.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+/**
+ * 查询版本管理列表
+ */
+TVersionManagement.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['version'] = $("#version").val();
+    TVersionManagement.table.refresh({query: queryData});
+};
+
+TVersionManagement.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#version").val("");
+    TVersionManagement.search();
+};
+
+
+$(function () {
+    var defaultColunms = TVersionManagement.initColumn();
+    var table = new BSTable(TVersionManagement.id, "/tVersionManagement/list", defaultColunms);
+    table.setPaginationType("server");
+    TVersionManagement.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tVersionManagement/tVersionManagement_info.js b/management/guns-admin/src/main/webapp/static/modular/system/tVersionManagement/tVersionManagement_info.js
new file mode 100644
index 0000000..b0354b4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/tVersionManagement/tVersionManagement_info.js
@@ -0,0 +1,175 @@
+/**
+ * 初始化版本管理详情对话框
+ */
+var TVersionManagementInfoDlg = {
+    tVersionManagementInfoData : {},
+    validateFields: {
+        version: {
+            validators: {
+                notEmpty: {
+                    message: '版本编号不能为空'
+                }
+            }
+        },
+        url: {
+            validators: {
+                notEmpty: {
+                    message: '请上传apk文件'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+TVersionManagementInfoDlg.validate = function () {
+    $('#versionInfoForm').data("bootstrapValidator").resetForm();
+    $('#versionInfoForm').bootstrapValidator('validate');
+    return $("#versionInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+TVersionManagementInfoDlg.clearData = function() {
+    this.tVersionManagementInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TVersionManagementInfoDlg.set = function(key, val) {
+    this.tVersionManagementInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TVersionManagementInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TVersionManagementInfoDlg.close = function() {
+    parent.layer.close(window.parent.TVersionManagement.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TVersionManagementInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('url')
+    .set('version')
+    .set('content')
+    .set('mandatory')
+    .set('insertTime')
+    .set('type');
+}
+
+/**
+ * 提交添加
+ */
+TVersionManagementInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var url = $("#url").val();
+    if ("" == url){
+        Feng.info("请上传安装包!");
+        return;
+    }
+    var type = $("input[name='type']:checked").val();
+    var mandatory = $("input[name='mandatory']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tVersionManagement/add", function(data){
+        if ("error" == data){
+            Feng.error("添加失败,版本号已存在,请重新输入!");
+            return;
+        }else{
+            Feng.success("添加成功!");
+            window.parent.TVersionManagement.table.refresh();
+            TVersionManagementInfoDlg.close();
+        }
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tVersionManagementInfoData);
+    ajax.set("mandatory",mandatory);
+    ajax.set("type",type);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TVersionManagementInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tVersionManagement/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TVersionManagement.table.refresh();
+        TVersionManagementInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tVersionManagementInfoData);
+    ajax.start();
+}
+
+$(function() {
+    Feng.initValidator("versionInfoForm", TVersionManagementInfoDlg.validateFields);
+});
+
+/**
+ * 文件上传
+ */
+TVersionManagementInfoDlg.previewFile = function(){
+    var file = document.querySelector('input[name=images]').files[0];
+    if (file) {
+        uploadApk(file);
+    } else {
+    }
+}
+//异步提交图片
+function uploadApk(file){
+    var index = layer.load(1, {
+        shade: [0.1,'#fff'] //0.1透明度的白色背景
+    });
+    var formData = new FormData();
+    formData.append("myfile", file);
+    $.ajax({
+        url : Feng.ctxPath + "/tVersionManagement/saveApk",
+        type : "POST",
+        data : formData,
+        contentType : false,
+        processData : false,
+        success : function(data) {
+            $("#url").val(data.imgUrl);
+            Feng.success("上传成功!");
+            layer.close(index);
+        },
+        error : function() {
+            Feng.error("上传失败");
+            layer.close(index);
+        }
+    })
+}
\ No newline at end of file
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/user/user.js b/management/guns-admin/src/main/webapp/static/modular/system/user/user.js
new file mode 100644
index 0000000..89e2ae0
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/user/user.js
@@ -0,0 +1,265 @@
+/**
+ * 系统管理--用户管理的单例对象
+ */
+var MgrUser = {
+    id: "managerTable",//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1,
+    deptid:0
+};
+
+/**
+ * 初始化表格的列
+ */
+MgrUser.initColumn = function () {
+    var columns = [
+        {field: 'selectItem', radio: true,
+            formatter: function (value, row) {
+                if (row.id == 1)
+                    return {
+                        disabled : true,//设置是否可用
+                    };
+                return "";
+            }
+        },
+        {title: 'id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '账号', field: 'account', align: 'center', valign: 'middle', sortable: true},
+        {title: '姓名', field: 'name', align: 'center', valign: 'middle', sortable: true},
+        {title: '性别', field: 'sexName', align: 'center', valign: 'middle', sortable: true},
+        {title: '角色', field: 'roleName', visible: true, align: 'center', valign: 'middle', sortable: true,
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.roleName != '' && row.roleName != null) {
+                    var labelStr = "";
+                    var labelStrs = "";
+                    var labelArray = row.roleName.split(",");
+                    for(var i=0;i<labelArray.length;i++){
+                        labelStr += labelArray[i] +"<br>";
+                        labelStrs += labelArray[i] + "&#10;";
+                    }
+                    labelStr = labelStr.substring(0,labelStr.length-4);
+                    labelStrs = labelStrs.substring(0,labelStrs.length-5);
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + labelStrs + '" onfocus="AppCar.tooltip()">' + labelStr + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '部门', field: 'deptName', align: 'center', valign: 'middle', sortable: true},
+        {title: '邮箱', field: 'email', align: 'center', valign: 'middle', sortable: true},
+        {title: '电话', field: 'phone', align: 'center', valign: 'middle', sortable: true},
+        {title: '创建时间', field: 'createtime', visible: true, align: 'center', valign: 'middle', sortable: true,
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.createtime != '' && row.createtime != null) {
+                    var time = row.createtime.replace(" ",'<br>');
+                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.createtime + '" onfocus="AppCar.tooltip()">' + time + '</p>']
+                }
+                return btn;
+            }
+        },
+        {title: '状态', field: 'statusName', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                var btn = "";
+                if(row.statusName != '' && row.statusName != null) {
+                    if (row.statusName == "冻结"){
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color: red;" title="' + row.statusName + '" onfocus="AppUserInfo.tooltip()">' + row.statusName + '</p>']
+                    }else{
+                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.statusName + '" onfocus="AppUserInfo.tooltip()">' + row.statusName + '</p>']
+                    }
+                }
+                return btn;
+            }
+        }
+        ];
+    return columns;
+};
+
+/**
+ * 检查是否选中
+ */
+MgrUser.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        MgrUser.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加管理员
+ */
+MgrUser.openAddMgr = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加管理员',
+        area: ['800px', '560px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/mgr/user_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 点击修改按钮时
+ * @param userId 管理员id
+ */
+MgrUser.openChangeUser = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑管理员',
+            area: ['800px', '450px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/mgr/user_edit/' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 点击角色分配
+ * @param
+ */
+MgrUser.roleAssign = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '角色分配',
+            area: ['300px', '400px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/mgr/role_assign/' + this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除用户
+ */
+MgrUser.delMgrUser = function () {
+    if (this.check()) {
+
+        var operation = function(){
+            var userId = MgrUser.seItem.id;
+            var ajax = new $ax(Feng.ctxPath + "/mgr/delete", function () {
+                Feng.success("删除成功!");
+                MgrUser.table.refresh();
+            }, function (data) {
+                Feng.error("删除失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("userId", userId);
+            ajax.start();
+        };
+
+        Feng.confirm("是否删除用户" + MgrUser.seItem.account + "?",operation);
+    }
+};
+
+/**
+ * 冻结用户账户
+ * @param userId
+ */
+MgrUser.freezeAccount = function () {
+    if (this.check()) {
+        var userId = this.seItem.id;
+        var ajax = new $ax(Feng.ctxPath + "/mgr/freeze", function (data) {
+            Feng.success("冻结成功!");
+            MgrUser.table.refresh();
+        }, function (data) {
+            Feng.error("冻结失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("userId", userId);
+        ajax.start();
+    }
+};
+
+/**
+ * 解除冻结用户账户
+ * @param userId
+ */
+MgrUser.unfreeze = function () {
+    if (this.check()) {
+        var userId = this.seItem.id;
+        var ajax = new $ax(Feng.ctxPath + "/mgr/unfreeze", function (data) {
+            Feng.success("解除冻结成功!");
+            MgrUser.table.refresh();
+        }, function (data) {
+            Feng.error("解除冻结失败!");
+        });
+        ajax.set("userId", userId);
+        ajax.start();
+    }
+}
+
+/**
+ * 重置密码
+ */
+MgrUser.resetPwd = function () {
+    if (this.check()) {
+        var userId = this.seItem.id;
+        parent.layer.confirm('是否重置密码为111111?', {
+            btn: ['确定', '取消'],
+            shade: false //不显示遮罩
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/mgr/reset", function (data) {
+                Feng.success("重置密码成功!");
+            }, function (data) {
+                Feng.error("重置密码失败!");
+            });
+            ajax.set("userId", userId);
+            ajax.start();
+        });
+    }
+};
+
+MgrUser.resetSearch = function () {
+    $("#name").val("");
+    $("#createTime").val("");
+
+    MgrUser.search();
+}
+
+MgrUser.search = function () {
+    var queryData = {};
+
+    queryData['deptid'] = MgrUser.deptid;
+    queryData['name'] = $("#name").val();
+    queryData['createTime'] = $("#createTime").val();
+
+    MgrUser.table.refresh({query: queryData});
+}
+
+MgrUser.onClickDept = function (e, treeId, treeNode) {
+    MgrUser.deptid = treeNode.id;
+    MgrUser.search();
+};
+
+$(function () {
+    var defaultColunms = MgrUser.initColumn();
+    var table = new BSTable(MgrUser.id, "/mgr/list", defaultColunms);
+    // 设置物理分页server(逻辑分页client)
+    table.setPaginationType("server");
+    // 表单提交参数
+    var queryData = {};
+    queryData['deptid'] = MgrUser.deptid;
+    queryData['name'] = $("#name").val();
+    queryData['createTime'] = $("#createTime").val();
+    table.setQueryParams(queryData);
+    MgrUser.table = table.init();
+
+    /*var defaultColunms = MgrUser.initColumn();
+    var table = new BSTable("managerTable", "/mgr/list", defaultColunms);
+    table.setPaginationType("client");
+    MgrUser.table = table.init();*/
+
+    var ztree = new $ZTree("deptTree", "/dept/tree");
+    ztree.bindOnClick(MgrUser.onClickDept);
+    ztree.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/user/user_info.js b/management/guns-admin/src/main/webapp/static/modular/system/user/user_info.js
new file mode 100644
index 0000000..258a7df
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/user/user_info.js
@@ -0,0 +1,341 @@
+/**
+ * 用户详情对话框(可用于添加和修改对话框)
+ */
+var UserInfoDlg = {
+    userInfoData: {},
+    validateFields: {
+        account: {
+            validators: {
+                notEmpty: {
+                    message: '账户不能为空'
+                }
+            }
+        },
+        name: {
+            validators: {
+                notEmpty: {
+                    message: '姓名不能为空'
+                }
+            }
+        },
+        /*citySel: {
+            validators: {
+                notEmpty: {
+                    message: '部门不能为空'
+                }
+            }
+        },*/
+        password: {
+            validators: {
+                notEmpty: {
+                    message: '密码不能为空'
+                },
+                identical: {
+                    field: 'rePassword',
+                    message: '两次密码不一致'
+                },
+                regexp: {
+                    regexp: /(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]).{8,30}/,
+                    message: '密码中必须包含大小字母、数字、特称字符,至少8个字符,最多30个字符'
+                },
+            }
+        },
+        rePassword: {
+            validators: {
+                notEmpty: {
+                    message: '密码不能为空'
+                },
+                identical: {
+                    field: 'password',
+                    message: '两次密码不一致'
+                },
+                regexp: {
+                    regexp: /(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]).{8,30}/,
+                    message: '密码中必须包含大小字母、数字、特称字符,至少8个字符,最多30个字符'
+                },
+            }
+        }
+    }
+};
+
+/**
+ * 清除数据
+ */
+UserInfoDlg.clearData = function () {
+    this.userInfoData = {};
+};
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+UserInfoDlg.set = function (key, value) {
+    if(typeof value == "undefined"){
+        if(typeof $("#" + key).val() =="undefined"){
+            var str="";
+            var ids="";
+            $("input[name='"+key+"']:checkbox").each(function(){
+                if(true == $(this).is(':checked')){
+                    str+=$(this).val()+",";
+                }
+            });
+            if(str){
+                if(str.substr(str.length-1)== ','){
+                    ids = str.substr(0,str.length-1);
+                }
+            }else{
+                $("input[name='"+key+"']:radio").each(function(){
+                    if(true == $(this).is(':checked')){
+                        ids=$(this).val()
+                    }
+                });
+            }
+            this.userInfoData[key] = ids;
+        }else{
+            this.userInfoData[key]= $("#" + key).val();
+        }
+    }
+
+    return this;
+};
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+UserInfoDlg.get = function (key) {
+    return $("#" + key).val();
+};
+
+/**
+ * 关闭此对话框
+ */
+UserInfoDlg.close = function () {
+    parent.layer.close(window.parent.MgrUser.layerIndex);
+};
+
+/**
+ * 点击部门input框时
+ *
+ * @param e
+ * @param treeId
+ * @param treeNode
+ * @returns
+ */
+UserInfoDlg.onClickDept = function (e, treeId, treeNode) {
+    $("#citySel").attr("value", instance.getSelectedVal());
+    $("#deptid").attr("value", treeNode.id);
+};
+
+/**
+ * 显示部门选择的树
+ *
+ * @returns
+ */
+UserInfoDlg.showDeptSelectTree = function () {
+    var cityObj = $("#citySel");
+    var cityOffset = $("#citySel").offset();
+    $("#menuContent").css({
+        left: cityOffset.left + "px",
+        top: cityOffset.top + cityObj.outerHeight() + "px"
+    }).slideDown("fast");
+
+    $("body").bind("mousedown", onBodyDown);
+};
+
+/**
+ * 显示用户详情部门选择的树
+ *
+ * @returns
+ */
+UserInfoDlg.showInfoDeptSelectTree = function () {
+    var cityObj = $("#citySel");
+    var cityPosition = $("#citySel").position();
+    $("#menuContent").css({
+        left: cityPosition.left + "px",
+        top: cityPosition.top + cityObj.outerHeight() + "px"
+    }).slideDown("fast");
+
+    $("body").bind("mousedown", onBodyDown);
+};
+
+/**
+ * 隐藏部门选择的树
+ */
+UserInfoDlg.hideDeptSelectTree = function () {
+    $("#menuContent").fadeOut("fast");
+    $("body").unbind("mousedown", onBodyDown);// mousedown当鼠标按下就可以触发,不用弹起
+};
+
+/**
+ * 收集数据
+ */
+UserInfoDlg.collectData = function () {
+    this.set('id').set('account').set('sex').set('password').set('avatar')
+        .set('email').set('name').set('birthday').set('rePassword').set('deptid').set('phone');
+};
+
+/**
+ * 验证两个密码是否一致
+ */
+UserInfoDlg.validatePwd = function () {
+    var password = this.get("password");
+    var rePassword = this.get("rePassword");
+    if (password == rePassword) {
+        return true;
+    } else {
+        return false;
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+UserInfoDlg.validate = function () {
+    $('#userInfoForm').data("bootstrapValidator").resetForm();
+    $('#userInfoForm').bootstrapValidator('validate');
+    return $("#userInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 提交添加用户
+ */
+UserInfoDlg.addSubmit = function () {
+
+    this.clearData();
+    this.collectData();
+
+    if (!this.validate()) {
+        return;
+    }
+
+    if (!this.validatePwd()) {
+        Feng.error("两次密码输入不一致");
+        return;
+    }
+
+    var birthday = $("#birthday").val();
+    if ("" == birthday){
+        Feng.info("出生日期不能为空!");
+        return;
+    }
+
+    var citySel = $("#citySel").val();
+    if ("" == citySel){
+        Feng.info("部门不能为空!");
+        return;
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/mgr/add", function (data) {
+        Feng.success("添加成功!");
+        window.parent.MgrUser.table.refresh();
+        UserInfoDlg.close();
+        $(".img-circle").each(function () {
+            $(this).attr("src",Feng.ctxPath+$("#avatar").val());
+        })
+    }, function (data) {
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.userInfoData);
+    ajax.start();
+};
+
+/**
+ * 提交修改
+ */
+UserInfoDlg.editSubmit = function () {
+
+    this.clearData();
+    this.collectData();
+
+    if (!this.validate()) {
+        return;
+    }
+
+    var birthday = $("#birthday").val();
+    if ("" == birthday){
+        Feng.info("出生日期不能为空!");
+        return;
+    }
+
+    var citySel = $("#citySel").val();
+    if ("" == citySel){
+        Feng.info("部门不能为空!");
+        return;
+    }
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/mgr/edit", function (data) {
+        Feng.success("修改成功!");
+        if (window.parent.MgrUser != undefined) {
+            window.parent.MgrUser.table.refresh();
+            UserInfoDlg.close();
+        }
+        window.parent.$(".img-circle").each(function () {
+            $(this).attr("src",$("#avatar").val());
+        })
+
+        window.parent.$("#userNameTab").text($("#name").val());
+    }, function (data) {
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.userInfoData);
+    ajax.start();
+};
+
+/**
+ * 修改密码
+ */
+UserInfoDlg.chPwd = function () {
+    let oldPwd = $('#oldPwd').val();
+    let newPwd = $('#newPwd').val();
+    if(oldPwd == newPwd){
+        Feng.error("新密码不能和原始密码相同");
+        return
+    }
+    let patt = /(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]).{8,30}/;
+    if(!patt.test(newPwd)){
+        Feng.error("密码中必须包含大小字母、数字、特称字符,至少8个字符,最多30个字符");
+        return
+    }
+    var ajax = new $ax(Feng.ctxPath + "/mgr/changePwd", function (data) {
+        Feng.success("修改成功!");
+    }, function (data) {
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("oldPwd");
+    ajax.set("newPwd");
+    ajax.set("rePwd");
+    ajax.start();
+
+};
+
+function onBodyDown(event) {
+    if (!(event.target.id == "menuBtn" || event.target.id == "menuContent" || $(
+            event.target).parents("#menuContent").length > 0)) {
+        UserInfoDlg.hideDeptSelectTree();
+    }
+}
+
+$(function () {
+    Feng.initValidator("userInfoForm", UserInfoDlg.validateFields);
+
+    //初始化性别选项
+    $("#sex").val($("#sexValue").val());
+
+    var ztree = new $ZTree("treeDemo", "/dept/tree");
+    ztree.bindOnClick(UserInfoDlg.onClickDept);
+    ztree.init();
+    instance = ztree;
+
+    // 初始化头像上传
+    var avatarUp = new $WebUpload("avatar");
+    avatarUp.setUploadBarId("progressBar");
+    avatarUp.init();
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/userActivity/addRegist.js b/management/guns-admin/src/main/webapp/static/modular/system/userActivity/addRegist.js
new file mode 100644
index 0000000..38adc1b
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/userActivity/addRegist.js
@@ -0,0 +1,110 @@
+
+var RegistInfoDlg = {
+    id: "UserActivityTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+/**
+ * 选择优惠券后数据回显
+ * @param id
+ * @param couponUseType
+ * @param couponType
+ * @param money
+ */
+RegistInfoDlg.selectCouponOpt=function(id,money,couponUseType){
+    if(couponUseType==0){
+        $("#id1").val(id);
+        $("#num3").val(money);
+    }else if(couponUseType==1){
+        $("#id2").val(id);
+        $("#num5").val(money);
+    }else if(couponUseType==2){
+        $("#id3").val(id);
+        $("#num7").val(money);
+    }else if(couponUseType==3){
+        $("#id4").val(id);
+        $("#num9").val(money);
+    }
+}
+
+RegistInfoDlg.selecteCoupon = function(type){
+    var index = layer.open({
+        type: 2,
+        title: '选择优惠券',
+        area: ['90%', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/userActivity/sysCouponRecord2?type='+type
+    });
+    this.layerIndex = index;
+}
+/**
+ * 关闭添加赠送优惠券页面
+ */
+
+function close() {
+    parent.layer.close(window.parent.UserActivityInfoDlg.layerIndex);
+}
+
+/**
+ * 确认添加
+ */
+function addSubmit() {
+    var num1=$("#num1").val();
+    var num2=$("#num2").val();
+    var num3=$("#num3").val();
+    var num4=$("#num4").val();
+    var num5=$("#num5").val();
+    var num6=$("#num6").val();
+    var num7=$("#num7").val();
+    var num8=$("#num8").val();
+    var num9=$("#num9").val();
+    var num10=$("#num10").val();
+    var num11=$("#num11").val();
+    var re =  /^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/;
+    if (!re.test(num1)) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+    if (!re.test(num3)) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }if (!re.test(num5)) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }if (!re.test(num7)) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }if (!re.test(num9)) {
+        Feng.error("请输入正确金额数!");
+        return;
+    }
+
+    if (!/^[1-9]\d*$/.test(num2)) {
+        Feng.error("请输入正确张数!");
+        return;
+    }
+    if (!/^[1-9]\d*$/.test(num4)) {
+        Feng.error("请输入正确张数!");
+        return;
+    }
+    if (!/^[1-9]\d*$/.test(num6)) {
+        Feng.error("请输入正确张数!");
+        return;
+    }if (!/^[1-9]\d*$/.test(num8)) {
+        Feng.error("请输入正确张数!");
+        return;
+    }if (!/^[1-9]\d*$/.test(num10)) {
+        Feng.error("请输入正确天数!");
+        return;
+    }
+
+    var id1=$("#id1").val();
+    var id2=$("#id2").val();
+    var id3=$("#id3").val();
+    var id4=$("#id4").val();
+    var obj = $("#obj").val();
+    window.parent.UserActivityInfoDlg.addRegistOpt(num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,num11,id1,id2,id3,id4);
+    close();
+}
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/userActivity/sysCouponRecord.js b/management/guns-admin/src/main/webapp/static/modular/system/userActivity/sysCouponRecord.js
new file mode 100644
index 0000000..f5bd99d
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/userActivity/sysCouponRecord.js
@@ -0,0 +1,162 @@
+/**
+ * 管理初始化
+ */
+var SysCouponRecord = {
+    id: "SysCouponRecordTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SysCouponRecord.initColumn = function () {
+    return [
+            {field: 'selectItem', radio: true},
+            {title: '序号', field: 'id', visible: true, align: 'center', valign: 'middle',width:'8%'},
+            {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+            {title: '条件金额', field: 'fullMoney', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券类型', field: 'couponUseType', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==0){
+                        return "通用券";
+                    }else if(value==1){
+                        return "专车券";
+                    }else if(value==2){
+                        return "出租券";
+                    }else if(value==3){
+                        return "跨城出行券";
+                    }else{
+                        return "";
+                    }
+                }
+            },
+            {title: '服务类型', field: 'couponType', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==1){
+                        return "抵扣";
+                    }else if(value==2){
+                        return "满减";
+                    }else{
+                        return "";
+                    }
+                }
+            }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+SysCouponRecord.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        SysCouponRecord.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 关闭选择用户页面
+ */
+SysCouponRecord.close = function () {
+    parent.layer.close(window.parent.UserActivityInfoDlg.layerIndex);
+}
+SysCouponRecord.close1 = function () {
+    parent.layer.close(window.parent.RegistInfoDlg.layerIndex);
+}
+
+/**
+ * 确认选择
+ */
+SysCouponRecord.selectCouponOpt = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }
+    var id = selected[0].id;
+    var couponUseType = selected[0].couponUseType;
+    var couponType = selected[0].couponType;
+    var money = selected[0].money;
+    var name = selected[0].name;
+    if ("" == id || null == id || undefined == id){
+        Feng.info("请先选中表格中的某一记录!");
+        return ;
+    }
+    var obj = $("#obj").val();
+    window.parent.UserActivityInfoDlg.selectCouponOpt(id,couponUseType,couponType,money,name);
+    SysCouponRecord.close();
+}
+
+
+/**
+ * 确认选择
+ */
+SysCouponRecord.selectCouponOpt1 = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }
+    var id = selected[0].id;
+    var couponUseType = selected[0].couponUseType;
+    var couponType = selected[0].couponType;
+    var money = selected[0].money;
+    var name = selected[0].name;
+    if ("" == id || null == id || undefined == id){
+        Feng.info("请先选中表格中的某一记录!");
+        return ;
+    }
+    var obj = $("#obj").val();
+    window.parent.UserActivityInfoDlg.selectCouponOpt1(id,couponUseType,couponType,money,name);
+    SysCouponRecord.close();
+}
+/**
+ * 确认选择
+ */
+SysCouponRecord.selectCouponOpt2 = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }
+    var id = selected[0].id;
+    var money = selected[0].money;
+    var couponUseType = selected[0].couponUseType;
+    if ("" == id || null == id || undefined == id){
+        Feng.info("请先选中表格中的某一记录!");
+        return ;
+    }
+    var obj = $("#obj").val();
+    window.parent.RegistInfoDlg.selectCouponOpt(id,money,couponUseType);
+    parent.layer.close(window.parent.RegistInfoDlg.layerIndex);
+}
+/**
+ * 查询列表
+ */
+SysCouponRecord.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['couponUseType'] = $("#couponUseType").val();
+    SysCouponRecord.table.refresh({query: queryData});
+};
+SysCouponRecord.resetSearch = function () {
+    $("#createTime").val("");
+    SysCouponRecord.search();
+};
+$(function () {
+    var defaultColunms = SysCouponRecord.initColumn();
+    var table = new BSTable(SysCouponRecord.id, "/sysCouponRecord/list", defaultColunms);
+    table.setPaginationType("server");
+    var queryData = {};
+    queryData['couponUseType'] = $("#couponUseType").val();
+    table.setQueryParams(queryData);
+    SysCouponRecord.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/userActivity/sysRedPacketRecord.js b/management/guns-admin/src/main/webapp/static/modular/system/userActivity/sysRedPacketRecord.js
new file mode 100644
index 0000000..5e2c756
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/userActivity/sysRedPacketRecord.js
@@ -0,0 +1,104 @@
+/**
+ * 管理初始化
+ */
+var SysRedPacketRecord = {
+    id: "SysRedPacketRecordTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SysRedPacketRecord.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '序号', field: 'id', visible: true, align: 'center', valign: 'middle',width:'8%'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '红包名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+        {title: '红包金额类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                if(value==1){
+                    return "固定金额";
+                }else if(value==2){
+                    return "随机金额";
+                }else{
+                    return "";
+                }
+            }
+        },
+        {title: '总金额', field: 'totalMoney', visible: true, align: 'center', valign: 'middle'},
+        {title: '每个红包金额', field: 'money', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                if(row.type==1){
+                    return row.money;
+                }else if(row.type==2){
+                    return row.startMoney+"-"+row.endMoney;
+                }
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+SysRedPacketRecord.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        SysRedPacketRecord.seItem = selected[0];
+        return true;
+    }
+};
+/**
+ * 关闭选择用户页面
+ */
+SysRedPacketRecord.close = function () {
+    parent.layer.close(window.parent.UserActivityInfoDlg.layerIndex);
+}
+/**
+ * 确认选择
+ */
+SysRedPacketRecord.selectRedOpt = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }
+    var id = selected[0].id;
+    var type = selected[0].type;
+    var totalMoney = selected[0].totalMoney;
+    var money = selected[0].money;
+    var startMoney = selected[0].startMoney;
+    var endMoney = selected[0].endMoney;
+    var effective = selected[0].effective;
+    if ("" == id || null == id || undefined == id){
+        Feng.info("请先选中表格中的某一记录!");
+        return ;
+    }
+    var obj = $("#obj").val();
+    window.parent.UserActivityInfoDlg.selectRedOpt(id,type,totalMoney,money,startMoney,endMoney,effective);
+    SysRedPacketRecord.close();
+}
+/**
+ * 查询列表
+ */
+SysRedPacketRecord.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    SysRedPacketRecord.table.refresh({query: queryData});
+};
+SysRedPacketRecord.resetSearch = function () {
+    $("#createTime").val("");
+    SysRedPacketRecord.search();
+};
+$(function () {
+    var defaultColunms = SysRedPacketRecord.initColumn();
+    var table = new BSTable(SysRedPacketRecord.id, "/sysRedPacketRecord/list", defaultColunms);
+    table.setPaginationType("server");
+    SysRedPacketRecord.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/userActivity/userActivity.js b/management/guns-admin/src/main/webapp/static/modular/system/userActivity/userActivity.js
new file mode 100644
index 0000000..af78ee9
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/userActivity/userActivity.js
@@ -0,0 +1,209 @@
+/**
+ * 管理初始化
+ */
+var UserActivity = {
+    id: "UserActivityTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+UserActivity.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '活动名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+        {title: '开始时间', field: 'startTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '结束时间', field: 'endTime', visible: true, align: 'center', valign: 'middle'},
+        {title: '参与人次', field: 'number', visible: true, align: 'center', valign: 'middle'},
+        {title: '备注', field: 'remark', visible: true, align: 'center', valign: 'middle'},
+        {title: '状态', field: 'status', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row) {
+                if(value==1){
+                    return "待审核";
+                }else if(value==2){
+                    return "已驳回";
+                }else if(value==3){
+                    if(new Date()<new Date(row.startTime.replace(/-/g,"/"))){
+                        return "未开始";
+                    }else if(new Date()>new Date(row.endTime.replace(/-/g,"/"))){
+                        return "已结束";
+                    }else{
+                        return "进行中";
+                    }
+                }else if(value==4){
+                    return "已暂停";
+                }
+            }
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+UserActivity.check = function (type) {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+
+        //验证类型null删除,1=审核,2=编辑,3=启动/暂停
+        if(type==null){
+            UserActivity.seItem = selected[0];
+            return true;
+        }else if(type==3 && selected[0].status!=3 && selected[0].status!=4){
+            Feng.info("当前状态不能暂停/启动!");
+            return false;
+        }else if(type==3 && selected[0].status==3 && (selected[0].startTime>new Date() || new Date()>selected[0].endTime)){
+            Feng.info("当前状态不能暂停/启动!");
+            return false;
+        }else if(type==1 && selected[0].status!=1){
+            Feng.info("当前状态不能审核!");
+            return false;
+        }else if(type==2 && selected[0].status!=2){
+            Feng.info("当前状态不能编辑!");
+            return false;
+        }
+        UserActivity.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+UserActivity.openAddUserActivity = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/userActivity/userActivity_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+UserActivity.openUserActivityDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/userActivity/userActivity_detail/' + UserActivity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+/**
+ * 打开编辑
+ */
+UserActivity.openUpdateUserActivity = function () {
+    if (this.check(2)) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/userActivity/userActivity_update/' + UserActivity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+/**
+ * 删除
+ */
+UserActivity.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/userActivity/delete", function (data) {
+            Feng.success("删除成功!");
+            UserActivity.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("userActivityId",this.seItem.id);
+        ajax.start();
+    }
+};
+/**
+ * 启动/暂停
+ */
+UserActivity.updateStatus = function () {
+    if (this.check(3)) {
+        var ajax = new $ax(Feng.ctxPath + "/userActivity/updateStatus", function (data) {
+            Feng.success("启动/暂停成功!");
+            UserActivity.table.refresh();
+        }, function (data) {
+            Feng.error("动/暂停失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",this.seItem.id);
+        ajax.set("status",this.seItem.status==3?4:3);
+        ajax.start();
+    }
+};
+/**
+ * 打开立即处理页面
+ */
+UserActivity.immediately = function () {
+    if (this.check(1)) {
+        var index = layer.open({
+            type: 2,
+            title: '审核',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/userActivity/userActivity_immediately/' +  this.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+/**
+ * 领取记录
+ */
+UserActivity.receiveRecord= function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '领取记录',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/userActivity/receiveRecord?activityId='+ UserActivity.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+/**
+ * 查询列表
+ */
+UserActivity.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['status'] = $("#status").val();
+    UserActivity.table.refresh({query: queryData});
+};
+UserActivity.resetSearch = function () {
+    $("#createTime").val("");
+    $("#name").val("");
+    $("#status").val("");
+    DriverActivity.search();
+};
+$(function () {
+    var defaultColunms = UserActivity.initColumn();
+    var table = new BSTable(UserActivity.id, "/userActivity/list", defaultColunms);
+    table.setPaginationType("server");
+    UserActivity.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/userActivity/userActivity_info.js b/management/guns-admin/src/main/webapp/static/modular/system/userActivity/userActivity_info.js
new file mode 100644
index 0000000..19ceca4
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/userActivity/userActivity_info.js
@@ -0,0 +1,466 @@
+/**
+ * 初始化详情对话框
+ */
+var UserActivityInfoDlg = {
+    userActivityInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+UserActivityInfoDlg.clearData = function() {
+    this.userActivityInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+UserActivityInfoDlg.set = function(key, val) {
+    this.userActivityInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+UserActivityInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+UserActivityInfoDlg.close = function() {
+    parent.layer.close(window.parent.UserActivity.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+UserActivityInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('name')
+    .set('startTime')
+    .set('endTime')
+    .set('insertTime')
+    .set('status')
+    .set('remark')
+    .set('companyType');
+}
+
+/**
+ * 提交添加
+ */
+UserActivityInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if ($.trim($("#name").val())=="") {
+        Feng.error("名称不能为空!");
+        getContent(1);
+        return;
+    }
+    if($.trim($("#startTime").val())==""){
+        Feng.error("请选择活动时间!");
+        getContent(1);
+        return;
+    }
+
+    var content2CouponId = $("#content2CouponId").val();
+    if($.trim(content2CouponId)!=""){
+        if (!/^[1-9]\d*$/.test($("#content2Num5").val())) {
+            Feng.error("请输入正确有效期!");
+            getContent(2);
+            return;
+        }
+        if (!/^[1-9]\d*$/.test($("#content2Num6").val())) {
+            Feng.error("请输入正确张数!");
+            getContent(2);
+            return;
+        }
+    }
+    var content3CouponId = $("#content3CouponId").val();
+    if($.trim(content3CouponId)!=""){
+        if (!/^[1-9]\d*$/.test($("#content3Num5").val())) {
+            Feng.error("请输入正确有效期!");
+            getContent(3);
+            return;
+        }
+        if (!/^[1-9]\d*$/.test($("#content3Num6").val())) {
+            Feng.error("请输入正确张数!");
+            getContent(3);
+            return;
+        }
+    }
+    var subArr=[];
+    $(".timeClass").each(function () {
+        subArr.push({
+            //companyName,nickName,phone
+            id1:$(this).find("input[name*='id1']").val(),
+            id2:$(this).find("input[name*='id2']").val(),
+            id3:$(this).find("input[name*='id3']").val(),
+            id4:$(this).find("input[name*='id4']").val(),
+            num1:$(this).find("input[name*='num1']").val(),
+            num2:$(this).find("input[name*='num2']").val(),
+            num3:$(this).find("input[name*='num3']").val(),
+            num4:$(this).find("input[name*='num4']").val(),
+            num5:$(this).find("input[name*='num5']").val(),
+            num6:$(this).find("input[name*='num6']").val(),
+            num7:$(this).find("input[name*='num7']").val(),
+            num8:$(this).find("input[name*='num8']").val(),
+            num9:$(this).find("input[name*='num9']").val(),
+            num10:$(this).find("input[name*='num10']").val(),
+            num11:$(this).find("input[name*='num11']").val(),
+        })
+    });
+    var content5Num1 = $("#content5Num1").val();
+    if($.trim(content5Num1)!=""){
+        if(isNaN(content5Num1) || content5Num1<=0 || content5Num1>10){
+            Feng.error("请输入正确折扣数!");
+            getContent(5);
+            return;
+        }
+    }
+    var content5Num2 = $("#content5Num2").val();
+    if($.trim(content5Num2)!=""){
+        if(isNaN(content5Num2) || content5Num2<=0 || content5Num2>10){
+            Feng.error("请输入正确折扣数!");
+            getContent(5);
+            return;
+        }
+    }
+    var content5Num3 = $("#content5Num3").val();
+    if($.trim(content5Num3)!=""){
+        if(isNaN(content5Num3) || content5Num3<=0 || content5Num3>10){
+            Feng.error("请输入正确折扣数!");
+            getContent(5);
+            return;
+        }
+    }
+    var content6RedId = $("#content6RedId").val();
+    var elem1 = document.querySelector('.js-switch');
+    var elem2 = document.querySelector('.js-switch1');
+    var elem4 = document.querySelector('.js-switch2');
+    var elem5 = document.querySelector('.js-switch3');
+    var elem3 = document.querySelector('.js-switch4');
+    console.log(JSON.stringify(subArr))
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/userActivity/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.UserActivity.table.refresh();
+        UserActivityInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("name",$("#name").val());
+    ajax.set("startTime",$("#startTime").val());
+    ajax.set("registCouponId",content2CouponId);
+    ajax.set("registEnable",elem1.checked==true?2:1);
+    ajax.set("registNumber",$("#content2Num6").val());
+    ajax.set("registEffective",$("#content2Num5").val());
+    ajax.set("registerPrice",$("#content2Num7").val());
+    ajax.set("inviteCouponId",content3CouponId);
+    ajax.set("inviteEnable",elem2.checked==true?2:1);
+    ajax.set("inviteNumber",$("#content3Num6").val());
+    ajax.set("inviteEffective",$("#content3Num5").val());
+    ajax.set("invitationPrice",$("#content3Num7").val());
+    ajax.set("balanceEnable",elem3.checked==true?2:1);
+    ajax.set("balanceInfo",JSON.stringify(subArr));
+    ajax.set("discountEnable",elem4.checked==true?2:1);
+    ajax.set("discountSpecial",content5Num1);
+    ajax.set("discountTaxi",content5Num2);
+    ajax.set("discountLogistics",content5Num3);
+    ajax.set("redenvelopeId",$("#content6RedId").val());
+    ajax.set("redenvelopeEnable",elem5.checked==true?2:1);
+    ajax.set('redPrice', $('#content6Num5').val());
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+UserActivityInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if ($.trim($("#name").val())=="") {
+        Feng.error("名称不能为空!");
+        getContent(1);
+        return;
+    }
+    if($.trim($("#startTime").val())==""){
+        Feng.error("请选择活动时间!");
+        getContent(1);
+        return;
+    }
+
+    var content2CouponId = $("#content2CouponId").val();
+    if($.trim(content2CouponId)!=""){
+        if (!/^[1-9]\d*$/.test($("#content2Num5").val())) {
+            Feng.error("请输入正确有效期!");
+            getContent(2);
+            return;
+        }
+        if (!/^[1-9]\d*$/.test($("#content2Num6").val())) {
+            Feng.error("请输入正确张数!");
+            getContent(2);
+            return;
+        }
+    }
+    var content3CouponId = $("#content3CouponId").val();
+    if($.trim(content3CouponId)!=""){
+        if (!/^[1-9]\d*$/.test($("#content3Num5").val())) {
+            Feng.error("请输入正确有效期!");
+            getContent(3);
+            return;
+        }
+        if (!/^[1-9]\d*$/.test($("#content3Num6").val())) {
+            Feng.error("请输入正确张数!");
+            getContent(3);
+            return;
+        }
+    }
+    var subArr=[];
+    $(".timeClass").each(function () {
+        subArr.push({
+            //companyName,nickName,phone
+            id1:$(this).find("input[name*='id1']").val(),
+            id2:$(this).find("input[name*='id2']").val(),
+            id3:$(this).find("input[name*='id3']").val(),
+            id4:$(this).find("input[name*='id4']").val(),
+            num1:$(this).find("input[name*='num1']").val(),
+            num2:$(this).find("input[name*='num2']").val(),
+            num3:$(this).find("input[name*='num3']").val(),
+            num4:$(this).find("input[name*='num4']").val(),
+            num5:$(this).find("input[name*='num5']").val(),
+            num6:$(this).find("input[name*='num6']").val(),
+            num7:$(this).find("input[name*='num7']").val(),
+            num8:$(this).find("input[name*='num8']").val(),
+            num9:$(this).find("input[name*='num9']").val(),
+            num10:$(this).find("input[name*='num10']").val(),
+            num11:$(this).find("input[name*='num11']").val(),
+        })
+    });
+    var content5Num1 = $("#content5Num1").val();
+    if($.trim(content5Num1)!=""){
+        if(isNaN(content5Num1) || content5Num1<=0 || content5Num1>10){
+            Feng.error("请输入正确折扣数!");
+            getContent(5);
+            return;
+        }
+    }
+    var content5Num2 = $("#content5Num2").val();
+    if($.trim(content5Num2)!=""){
+        if(isNaN(content5Num2) || content5Num2<=0 || content5Num2>10){
+            Feng.error("请输入正确折扣数!");
+            getContent(5);
+            return;
+        }
+    }
+    var content5Num3 = $("#content5Num3").val();
+    if($.trim(content5Num3)!=""){
+        if(isNaN(content5Num3) || content5Num3<=0 || content5Num3>10){
+            Feng.error("请输入正确折扣数!");
+            getContent(5);
+            return;
+        }
+    }
+    var content6RedId = $("#content6RedId").val();
+    var elem1 = document.querySelector('.js-switch');
+    var elem2 = document.querySelector('.js-switch1');
+    var elem4 = document.querySelector('.js-switch2');
+    var elem5 = document.querySelector('.js-switch3');
+    var elem3 = document.querySelector('.js-switch4');
+    console.log(JSON.stringify(subArr))
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/userActivity/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.UserActivity.table.refresh();
+        UserActivityInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("name",$("#name").val());
+    ajax.set("startTime",$("#startTime").val());
+    ajax.set("registCouponId",content2CouponId);
+    ajax.set("registEnable",elem1.checked==true?2:1);
+    ajax.set("registNumber",$("#content2Num6").val());
+    ajax.set("registEffective",$("#content2Num5").val());
+    ajax.set("registerPrice",$("#content2Num7").val());
+    ajax.set("inviteCouponId",content3CouponId);
+    ajax.set("inviteEnable",elem2.checked==true?2:1);
+    ajax.set("inviteNumber",$("#content3Num6").val());
+    ajax.set("inviteEffective",$("#content3Num5").val());
+    ajax.set("invitationPrice",$("#content3Num7").val());
+    ajax.set("balanceEnable",elem3.checked==true?2:1);
+    ajax.set("balanceInfo",JSON.stringify(subArr));
+    ajax.set("discountEnable",elem4.checked==true?2:1);
+    ajax.set("discountSpecial",parseFloat(content5Num1));
+    ajax.set("discountTaxi",parseFloat(content5Num2));
+    ajax.set("discountLogistics",parseFloat(content5Num3));
+    ajax.set("redenvelopeId",$("#content6RedId").val());
+    ajax.set("redenvelopeEnable",elem5.checked==true?2:1);
+    ajax.set('redPrice', $('#content6Num5').val());
+    ajax.start();
+}
+/**
+ * 立即处理
+ */
+UserActivityInfoDlg.immediately = function(){
+
+    this.clearData();
+    this.collectData();
+
+    var remark = $("#remark").val();
+    if (remark.length > 250){
+        Feng.info("备注不能超过250个字");
+        return;
+    }
+    var state = $("input[name='state']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/userActivity/immediately", function(data){
+        Feng.success("处理成功!");
+        window.parent.UserActivity.table.refresh();
+        UserActivityInfoDlg.close();
+    },function(data){
+        Feng.error("处理失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("state",state);
+    ajax.set("remark",$("#remark").val());
+    ajax.start();
+}
+
+/**
+ * 跳转到选择优惠券页面
+ */
+UserActivityInfoDlg.toSelectCouponOpt = function () {
+    var index = layer.open({
+        type: 2,
+        title: '选择优惠券',
+        area: ['90%', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/userActivity/sysCouponRecord'
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 选择优惠券后数据回显
+ * @param id
+ * @param couponUseType
+ * @param couponType
+ * @param money
+ */
+UserActivityInfoDlg.selectCouponOpt=function(id,couponUseType,couponType,money,name){
+    $("#content2Num2").val(couponUseType==0?"通用券":couponUseType==1?"专车券":couponUseType==2?"出租券":"跨城出行券");
+    $("#content2Num3").val(couponType==1?"抵扣":"满减");
+    $("#content2Num4").val(money);
+    $("#content2CouponId").val(id);
+    $("#content2Num1").val(name);
+}
+
+
+/**
+ * 跳转到选择优惠券页面
+ */
+UserActivityInfoDlg.toSelectCouponOpt1 = function () {
+    var index = layer.open({
+        type: 2,
+        title: '选择优惠券',
+        area: ['90%', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/userActivity/sysCouponRecord1'
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 选择优惠券后数据回显
+ * @param id
+ * @param couponUseType
+ * @param couponType
+ * @param money
+ */
+UserActivityInfoDlg.selectCouponOpt1=function(id,couponUseType,couponType,money,name){
+    $("#content3Num2").val(couponUseType==0?"通用券":couponUseType==1?"专车券":couponUseType==2?"出租券":"跨城出行券");
+    $("#content3Num3").val(couponType==1?"抵扣":"满减");
+    $("#content3Num4").val(money);
+    $("#content3CouponId").val(id);
+    $("#content3Num1").val(name);
+}
+/**
+ * 跳转到选择优惠券页面
+ */
+UserActivityInfoDlg.toSelectRedOpt = function () {
+    var index = layer.open({
+        type: 2,
+        title: '选择红包',
+        area: ['90%', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/userActivity/sysRedPacketRecord'
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 选择优惠券后数据回显
+ * @param id
+ * @param couponUseType
+ * @param couponType
+ * @param money
+ */
+UserActivityInfoDlg.selectRedOpt=function(id,type,totalMoney,money,startMoney,endMoney,effective){
+    $("#content6Num1").val(type==1?"固定金额":"随机金额");
+    $("#content6Num3").val(type==1?money:startMoney+"-"+endMoney);
+    $("#content6Num4").val(effective);
+    $("#content6RedId").val(id);
+    $("#content6Num2").val(totalMoney);
+}
+/**
+ * 跳转添加充值送优惠券页面
+ */
+UserActivityInfoDlg.toAddRegistOpt = function () {
+    var index = layer.open({
+        type: 2,
+        title: '充值赠送优惠券',
+        area: ['90%', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/userActivity/addRegist'
+    });
+    this.layerIndex = index;
+}
+UserActivityInfoDlg.addRegistOpt = function (num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,num11,id1,id2,id3,id4) {
+    var str = '<tr class="timeClass">' +
+        '<td><input type="hidden" id="id1" name="id1" value="'+id1+'"><input type="hidden" id="num1" name="num1" value="'+num1+'">' + num1 + '</td>' +
+        '<td><input type="hidden" id="id2" name="id2" value="'+id2+'"><input type="hidden" id="num10" name="num10" value="'+num10+'">' + num10 + '</td>' +
+        '<td><input type="hidden" id="num11" name="num11" value="'+num11+'">' + num11 + '</td>' +
+        '<td><input type="hidden" id="id3" name="id3" value="'+id3+'"><input type="hidden" id="num3" name="num3" value="'+num3+'">' + num3 + '</td>' +
+        '<td><input type="hidden" id="id4" name="id4" value="'+id4+'"><input type="hidden" id="num2" name="num2" value="'+num2+'">' + num2 + '</td>' +
+        '<td><input type="hidden" id="num5" name="num5" value="'+num5+'">' + num5 + '</td>' +
+        '<td><input type="hidden" id="num4" name="num4" value="'+num4+'">' + num4 + '</td>' +
+        '<td><input type="hidden" id="num7" name="num7" value="'+num7+'">' + num7 + '</td>' +
+        '<td><input type="hidden" id="num6" name="num6" value="'+num6+'">' + num6 + '</td>' +
+        '<td><input type="hidden" id="num9" name="num9" value="'+num9+'">' + num9 + '</td>' +
+        '<td><input type="hidden" id="num8" name="num8" value="'+num8+'">' + num8 + '</td>' +
+        '<td><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#coun").append(str);
+}
+function deleteSub(e) {
+    $(e).parent().parent().remove();
+}
+$(function() {
+
+});
diff --git a/management/guns-admin/src/main/webapp/static/modular/system/userCouponRecord/userCouponRecord.js b/management/guns-admin/src/main/webapp/static/modular/system/userCouponRecord/userCouponRecord.js
new file mode 100644
index 0000000..56b132c
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/modular/system/userCouponRecord/userCouponRecord.js
@@ -0,0 +1,146 @@
+/**
+ * 管理初始化
+ */
+var UserCouponRecord = {
+    id: "UserCouponRecordTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+UserCouponRecord.initColumn = function () {
+    return [
+            {title: '', field: 'id', visible: false, align: 'center', valign: 'middle'},
+            {title: '领取时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '领取人', field: 'nickName', visible: true, align: 'center', valign: 'middle'},
+            {title: '领取人电话', field: 'phone', visible: true, align: 'center', valign: 'middle'},
+            {title: '领取金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+            {title: '到期时间', field: 'expirationTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '领取类型', field: 'couponUseType', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==0){
+                        return "通用券";
+                    }else if(value==1){
+                        return "专车券";
+                    }else if(value==2){
+                        return "出租券";
+                    }else if(value==3){
+                        return "跨城出行券";
+                    }else{
+                        return "";
+                    }
+                }
+            } ,
+            {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==1){
+                        return "未使用";
+                    }else if(value==2){
+                        return "已使用";
+                    }else if(value==3){
+                        return "已过期";
+                    }else{
+                        return "";
+                    }
+                }
+            },
+        {title: '使用时间', field: 'useTime', visible: true, align: 'center', valign: 'middle'}
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+UserCouponRecord.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        UserCouponRecord.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+UserCouponRecord.openAddUserCouponRecord = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/userCouponRecord/userCouponRecord_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+UserCouponRecord.openUserCouponRecordDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/userCouponRecord/userCouponRecord_update/' + UserCouponRecord.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除
+ */
+UserCouponRecord.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/userCouponRecord/delete", function (data) {
+            Feng.success("删除成功!");
+            UserCouponRecord.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("userCouponRecordId",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询列表
+ */
+UserCouponRecord.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['activityType'] = $("#activityType").val();
+    queryData['couponActivityId'] = $("#couponActivityId").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['userPhone'] = $("#userPhone").val();
+    queryData['state'] = $("#state").val();
+    UserCouponRecord.table.refresh({query: queryData});
+};
+UserCouponRecord.resetSearch = function () {
+    $("#createTime").val("");
+    $("#userName").val("");
+    $("#userPhone").val("");
+    $("#state").val("");
+    UserCouponRecord.search();
+};
+$(function () {
+    var defaultColunms = UserCouponRecord.initColumn();
+    var table = new BSTable(UserCouponRecord.id, "/userCouponRecord/list", defaultColunms);
+    table.setPaginationType("server");
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['activityType'] = $("#activityType").val();
+    queryData['couponActivityId'] = $("#couponActivityId").val();
+    table.setQueryParams(queryData);
+    UserCouponRecord.table = table.init();
+});
diff --git a/management/guns-admin/src/main/webapp/static/netCarInfo.js b/management/guns-admin/src/main/webapp/static/netCarInfo.js
new file mode 100644
index 0000000..2ac5c59
--- /dev/null
+++ b/management/guns-admin/src/main/webapp/static/netCarInfo.js
@@ -0,0 +1,69 @@
+var driverId = $('#driverId').val();
+
+$(function () {
+    getDataInfo();
+})
+
+
+/**
+ * 分公司信息管理初始化
+ */
+var VersionAdd = {
+    id: "OpenCity",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1,
+
+};
+
+
+/**
+ * 关闭此对话框
+ */
+VersionAdd.close = function () {
+    parent.layer.close(window.parent.Home.layerIndex);
+};
+
+
+
+function getDataInfo() {
+    $.ajax({
+        url: Feng.ctxPath + '/home/getDriverInfo',
+        type: 'POST',
+        data: {
+            driverId: driverId
+        },
+        success: function (res) {
+            var netcarDriver = res.netcarDriver;
+            var netcar = res.netcar;
+            var order = res.order;
+            var str = '<table>';
+            if('' != netcar){
+                str += '<tr><td><h4>车辆信息:</h4></td><td></td><td></td><td></td></tr>' +
+                    '<tr><td>车牌号</td><td>' + netcar.carLicensePlate + '</td><td></td><td></td></tr>' +
+                    '<tr><td>车辆品牌</td><td>' + res.carBrand + '</td><td></td><td></td></tr>' +
+                    '<tr><td>车辆型号</td><td>' + res.carModel + '</td><td></td><td></td></tr>' +
+                    '<tr><td>车辆颜色</td><td>' + netcar.carColor + '</td><td></td><td></td></tr>';
+            }
+
+            if(netcarDriver != ''){
+                str += '' +
+                    '<tr><td><h4>司机信息:</h4></td><td></td><td></td><td></td></tr>' +
+                    '<tr><td>司机姓名</td><td>' + netcarDriver.name + '</td><td></td><td></td></tr>' +
+                    '<tr><td>司机电话</td><td>' + netcarDriver.phone + '</td><td></td><td></td></tr>';
+            }
+            if(order.length > 0){
+                for(var i in order){
+                    str += '<tr><td><h4>订单' + (parseInt(i) + 1) + '</h4></td><td></td><td></td><td></td></tr>' +
+                        '<tr><td>起点</td><td>' + order[i].startAddress + '</td><td>终点</td><td>' + order[i].endAddress + '</td></tr>' +
+                        '<tr><td>出行时间</td><td>' + order[i].travelTime + '</td><td></td><td></td></tr>' +
+                        '<tr><td>乘客姓名</td><td>' + order[i].passengers + '</td><td></td><td></td></tr>' +
+                        '<tr><td>乘客电话</td><td>' + order[i].passengersPhone + '</td><td></td><td></td></tr>';
+                }
+            }
+            str += '</table>';
+            $('#content').html(str);
+        }
+    });
+}
+
diff --git a/management/guns-admin/src/test/sql/test.sql b/management/guns-admin/src/test/sql/test.sql
new file mode 100644
index 0000000..04b15ca
--- /dev/null
+++ b/management/guns-admin/src/test/sql/test.sql
@@ -0,0 +1,35 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50719
+ Source Host           : localhost:3306
+ Source Schema         : guns
+
+ Target Server Type    : MySQL
+ Target Server Version : 50719
+ File Encoding         : 65001
+
+ Date: 10/07/2018 14:09:19
+*/
+
+DROP DATABASE IF EXISTS guns_test;
+CREATE DATABASE IF NOT EXISTS guns_test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
+
+use guns_test;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for test
+-- ----------------------------
+DROP TABLE IF EXISTS `test`;
+CREATE TABLE `test` (
+  `aaa` int(11) NOT NULL AUTO_INCREMENT,
+  `bbb` varchar(255) DEFAULT NULL,
+  PRIMARY KEY (`aaa`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/management/guns-core/pom.xml b/management/guns-core/pom.xml
new file mode 100644
index 0000000..76a87ff
--- /dev/null
+++ b/management/guns-core/pom.xml
@@ -0,0 +1,156 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>com.stylefeng</groupId>
+        <artifactId>guns-parent</artifactId>
+        <version>1.0.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>guns-core</artifactId>
+    <packaging>jar</packaging>
+
+    <name>guns-core</name>
+    <url>http://maven.apache.org</url>
+
+    <dependencies>
+
+        <!--通用依赖-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatisplus-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+
+        <!--web-->
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <!--aop-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <!--二维码-->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <!--缓存-->
+        <dependency>
+            <groupId>org.ehcache</groupId>
+            <artifactId>ehcache</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-cache</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>net.sf.ehcache</groupId>
+            <artifactId>ehcache-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <!--导出Excel工具类-->
+        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.9</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.9</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-examples -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-examples</artifactId>
+            <version>3.9</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-excelant -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-excelant</artifactId>
+            <version>3.9</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>3.9</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-scratchpad</artifactId>
+            <version>3.9</version>
+        </dependency>
+
+        <!--华为云的obs-->
+        <dependency>
+            <groupId>com.huaweicloud</groupId>
+            <artifactId>esdk-obs-java</artifactId>
+            <version>3.19.5</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+    </build>
+</project>
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/CoreFlag.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/CoreFlag.java
new file mode 100644
index 0000000..c96eb96
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/CoreFlag.java
@@ -0,0 +1,11 @@
+package com.stylefeng.guns.core;
+
+/**
+ * 此类用来获取core模块的包路径
+ *
+ * @author fengshuonan
+ * @Date 2017/12/5 下午12:44
+ */
+public class CoreFlag {
+
+}
\ No newline at end of file
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/aop/BaseControllerExceptionHandler.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/aop/BaseControllerExceptionHandler.java
new file mode 100644
index 0000000..cbc06c3
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/aop/BaseControllerExceptionHandler.java
@@ -0,0 +1,45 @@
+package com.stylefeng.guns.core.aop;
+
+import com.stylefeng.guns.core.base.tips.ErrorTip;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.exception.GunsExceptionEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * 全局的的异常拦截器(拦截所有的控制器)(带有@RequestMapping注解的方法上都会拦截)
+ *
+ * @author fengshuonan
+ * @date 2016年11月12日 下午3:19:56
+ */
+public class BaseControllerExceptionHandler {
+
+    private Logger log = LoggerFactory.getLogger(this.getClass());
+
+    /**
+     * 拦截业务异常
+     */
+    @ExceptionHandler(GunsException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    @ResponseBody
+    public ErrorTip notFount(GunsException e) {
+        log.error("业务异常:", e);
+        return new ErrorTip(e.getCode(), e.getMessage());
+    }
+
+    /**
+     * 拦截未知的运行时异常
+     */
+    @ExceptionHandler(RuntimeException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    @ResponseBody
+    public ErrorTip notFount(RuntimeException e) {
+        log.error("运行时异常:", e);
+        return new ErrorTip(GunsExceptionEnum.SERVER_ERROR.getCode(), GunsExceptionEnum.SERVER_ERROR.getMessage());
+    }
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/BaseController.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/BaseController.java
new file mode 100644
index 0000000..9b17a14
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/BaseController.java
@@ -0,0 +1,127 @@
+package com.stylefeng.guns.core.base.controller;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.tips.SuccessTip;
+import com.stylefeng.guns.core.base.warpper.BaseControllerWarpper;
+import com.stylefeng.guns.core.page.PageInfoBT;
+import com.stylefeng.guns.core.support.HttpKit;
+import com.stylefeng.guns.core.util.FileUtil;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.UnsupportedEncodingException;
+
+public class BaseController {
+
+    protected static String SUCCESS = "SUCCESS";
+    protected static String ERROR = "ERROR";
+
+    protected static String REDIRECT = "redirect:";
+    protected static String FORWARD = "forward:";
+
+    protected static SuccessTip SUCCESS_TIP = new SuccessTip();
+
+    protected HttpServletRequest getHttpServletRequest() {
+        return HttpKit.getRequest();
+    }
+
+    protected HttpServletResponse getHttpServletResponse() {
+        return HttpKit.getResponse();
+    }
+
+    protected HttpSession getSession() {
+        return HttpKit.getRequest().getSession();
+    }
+
+    protected HttpSession getSession(Boolean flag) {
+        return HttpKit.getRequest().getSession(flag);
+    }
+
+    protected String getPara(String name) {
+        return HttpKit.getRequest().getParameter(name);
+    }
+
+    protected void setAttr(String name, Object value) {
+        HttpKit.getRequest().setAttribute(name, value);
+    }
+
+    protected Integer getSystemInvokCount() {
+        return (Integer) this.getHttpServletRequest().getServletContext().getAttribute("systemCount");
+    }
+
+    /**
+     * 把service层的分页信息,封装为bootstrap table通用的分页封装
+     */
+    protected <T> PageInfoBT<T> packForBT(Page<T> page) {
+        return new PageInfoBT<T>(page);
+    }
+
+    /**
+     * 包装一个list,让list增加额外属性
+     */
+    protected Object warpObject(BaseControllerWarpper warpper) {
+        return warpper.warp();
+    }
+
+    /**
+     * 删除cookie
+     */
+    protected void deleteCookieByName(String cookieName) {
+        Cookie[] cookies = this.getHttpServletRequest().getCookies();
+        for (Cookie cookie : cookies) {
+            if (cookie.getName().equals(cookieName)) {
+                Cookie temp = new Cookie(cookie.getName(), "");
+                temp.setMaxAge(0);
+                this.getHttpServletResponse().addCookie(temp);
+            }
+        }
+    }
+
+    /**
+     * 删除所有cookie
+     */
+    protected void deleteAllCookie() {
+        Cookie[] cookies = this.getHttpServletRequest().getCookies();
+        for (Cookie cookie : cookies) {
+            Cookie temp = new Cookie(cookie.getName(), "");
+            temp.setMaxAge(0);
+            this.getHttpServletResponse().addCookie(temp);
+        }
+    }
+
+    /**
+     * 返回前台文件流
+     *
+     * @author fengshuonan
+     * @date 2017年2月28日 下午2:53:19
+     */
+    protected ResponseEntity<byte[]> renderFile(String fileName, String filePath) {
+        byte[] bytes = FileUtil.toByteArray(filePath);
+        return renderFile(fileName, bytes);
+    }
+
+    /**
+     * 返回前台文件流
+     *
+     * @author fengshuonan
+     * @date 2017年2月28日 下午2:53:19
+     */
+    protected ResponseEntity<byte[]> renderFile(String fileName, byte[] fileBytes) {
+        String dfileName = null;
+        try {
+            dfileName = new String(fileName.getBytes("gb2312"), "iso8859-1");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+        headers.setContentDispositionFormData("attachment", dfileName);
+        return new ResponseEntity<byte[]>(fileBytes, headers, HttpStatus.CREATED);
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/GlobalController.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/GlobalController.java
new file mode 100644
index 0000000..1285ada
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/GlobalController.java
@@ -0,0 +1,37 @@
+package com.stylefeng.guns.core.base.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * 全局的控制器
+ *
+ * @author fengshuonan
+ * @date 2016年11月13日 下午11:04:45
+ */
+@Controller
+@RequestMapping("/global")
+public class GlobalController {
+
+    /**
+     * 跳转到404页面
+     *
+     * @author fengshuonan
+     */
+    @RequestMapping(path = "/error")
+    public String errorPage() {
+        return "/404.html";
+    }
+
+    /**
+     * 跳转到session超时页面
+     *
+     * @author fengshuonan
+     */
+    @RequestMapping(path = "/sessionError")
+    public String errorPageInfo(Model model) {
+        model.addAttribute("tips", "session超时");
+        return "/login.html";
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/GunsErrorView.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/GunsErrorView.java
new file mode 100644
index 0000000..42a6edc
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/controller/GunsErrorView.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.core.base.controller;
+
+import org.springframework.web.servlet.View;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * 错误页面的默认跳转(例如请求404的时候,默认走这个视图解析器)
+ *
+ * @author fengshuonan
+ * @date 2017-05-21 11:34
+ */
+public class GunsErrorView implements View {
+
+    @Override
+    public String getContentType() {
+        return "text/html";
+    }
+
+    @Override
+    public void render(Map<String, ?> map, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
+        httpServletRequest.getRequestDispatcher("/global/error").forward(httpServletRequest, httpServletResponse);
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/ErrorTip.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/ErrorTip.java
new file mode 100644
index 0000000..8744571
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/ErrorTip.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.core.base.tips;
+
+/**
+ * 返回给前台的错误提示
+ *
+ * @author fengshuonan
+ * @date 2016年11月12日 下午5:05:22
+ */
+public class ErrorTip extends Tip {
+
+    public ErrorTip(int code, String message) {
+        super();
+        this.code = code;
+        this.message = message;
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/SuccessTip.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/SuccessTip.java
new file mode 100644
index 0000000..69e5766
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/SuccessTip.java
@@ -0,0 +1,15 @@
+package com.stylefeng.guns.core.base.tips;
+
+/**
+ * 返回给前台的成功提示
+ *
+ * @author fengshuonan
+ * @date 2016年11月12日 下午5:05:22
+ */
+public class SuccessTip extends Tip {
+	
+	public SuccessTip(){
+		super.code = 200;
+		super.message = "操作成功";
+	}
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/Tip.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/Tip.java
new file mode 100644
index 0000000..f380904
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/tips/Tip.java
@@ -0,0 +1,29 @@
+package com.stylefeng.guns.core.base.tips;
+
+/**
+ * 返回给前台的提示(最终转化为json形式)
+ *
+ * @author fengshuonan
+ * @Date 2017年1月11日 下午11:58:00
+ */
+public abstract class Tip {
+
+    protected int code;
+    protected String message;
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/base/warpper/BaseControllerWarpper.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/warpper/BaseControllerWarpper.java
new file mode 100644
index 0000000..e25afb4
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/base/warpper/BaseControllerWarpper.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.core.base.warpper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 控制器查询结果的包装类基类
+ *
+ * @author fengshuonan
+ * @date 2017年2月13日 下午10:49:36
+ */
+public abstract class BaseControllerWarpper {
+
+    public Object obj = null;
+
+    public BaseControllerWarpper(Object obj) {
+        this.obj = obj;
+    }
+
+    @SuppressWarnings("unchecked")
+    public Object warp() {
+        if (this.obj instanceof List) {
+            List<Map<String, Object>> list = (List<Map<String, Object>>) this.obj;
+            for (Map<String, Object> map : list) {
+                warpTheMap(map);
+            }
+            return list;
+        } else if (this.obj instanceof Map) {
+            Map<String, Object> map = (Map<String, Object>) this.obj;
+            warpTheMap(map);
+            return map;
+        } else {
+            return this.obj;
+        }
+    }
+
+    protected abstract void warpTheMap(Map<String, Object> map);
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/BaseCacheFactory.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/BaseCacheFactory.java
new file mode 100644
index 0000000..ee58e93
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/BaseCacheFactory.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ *
+ * 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.
+ */
+package com.stylefeng.guns.core.cache;
+
+
+/**
+ * 缓存工厂基类
+ */
+public abstract class BaseCacheFactory implements ICache {
+
+	@SuppressWarnings("unchecked")
+	public <T> T get(String cacheName, Object key, ILoader iLoader) {
+		Object data = get(cacheName, key);
+		if (data == null) {
+			data = iLoader.load();
+			put(cacheName, key, data);
+		}
+		return (T) data;
+	}
+
+	@SuppressWarnings("unchecked")
+	public <T> T get(String cacheName, Object key, Class<? extends ILoader> iLoaderClass) {
+		Object data = get(cacheName, key);
+		if (data == null) {
+			try {
+				ILoader dataLoader = iLoaderClass.newInstance();
+				data = dataLoader.load();
+				put(cacheName, key, data);
+			} catch (Exception e) {
+				throw new RuntimeException(e);
+			}
+		}
+		return (T) data;
+	}
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/CacheKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/CacheKit.java
new file mode 100644
index 0000000..e860c53
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/CacheKit.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ *
+ * 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.
+ */
+
+package com.stylefeng.guns.core.cache;
+
+import java.util.List;
+
+/**
+ * 缓存工具类
+ */
+public class CacheKit {
+	
+	private static ICache defaultCacheFactory = new EhcacheFactory();
+
+	public static void put(String cacheName, Object key, Object value) {
+		defaultCacheFactory.put(cacheName, key, value);
+	}
+	
+	public static <T> T get(String cacheName, Object key) {
+		return defaultCacheFactory.get(cacheName, key);
+	}
+	
+	@SuppressWarnings("rawtypes")
+	public static List getKeys(String cacheName) {
+		return defaultCacheFactory.getKeys(cacheName);
+	}
+	
+	public static void remove(String cacheName, Object key) {
+		defaultCacheFactory.remove(cacheName, key);
+	}
+	
+	public static void removeAll(String cacheName) {
+		defaultCacheFactory.removeAll(cacheName);
+	}
+	
+	public static <T> T get(String cacheName, Object key, ILoader iLoader) {
+		return defaultCacheFactory.get(cacheName, key, iLoader);
+	}
+	
+	public static <T> T get(String cacheName, Object key, Class<? extends ILoader> iLoaderClass) {
+		return defaultCacheFactory.get(cacheName, key, iLoaderClass);
+	}
+	
+}
+
+
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/EhcacheFactory.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/EhcacheFactory.java
new file mode 100644
index 0000000..16cb2fc
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/EhcacheFactory.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2011-2016, James Zhan 詹波 (jfinal@126.com).
+ *
+ * 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.
+ */
+package com.stylefeng.guns.core.cache;
+
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.CacheManager;
+import net.sf.ehcache.Element;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+/**
+ * Ehcache缓存工厂
+ */
+public class EhcacheFactory extends BaseCacheFactory {
+	
+	private static CacheManager cacheManager;
+	private static volatile Object locker = new Object();
+	private static final Logger log = LoggerFactory.getLogger(EhcacheFactory.class);
+	
+	private static CacheManager getCacheManager() {
+		if (cacheManager == null) {
+			synchronized (EhcacheFactory.class) {
+				if (cacheManager == null) {
+					cacheManager = CacheManager.create();
+				}
+			}
+		}
+		return cacheManager;
+	}
+	
+	static Cache getOrAddCache(String cacheName) {
+		CacheManager cacheManager = getCacheManager();
+		Cache cache = cacheManager.getCache(cacheName);
+		if (cache == null) {
+			synchronized(locker) {
+				cache = cacheManager.getCache(cacheName);
+				if (cache == null) {
+					log.warn("无法找到缓存 [" + cacheName + "]的配置, 使用默认配置.");
+					cacheManager.addCacheIfAbsent(cacheName);
+					cache = cacheManager.getCache(cacheName);
+					log.debug("缓存 [" + cacheName + "] 启动.");
+				}
+			}
+		}
+		return cache;
+	}
+	
+	public void put(String cacheName, Object key, Object value) {
+		getOrAddCache(cacheName).put(new Element(key, value));
+	}
+	
+	@SuppressWarnings("unchecked")
+	public <T> T get(String cacheName, Object key) {
+		Element element = getOrAddCache(cacheName).get(key);
+		return element != null ? (T)element.getObjectValue() : null;
+	}
+	
+	@SuppressWarnings("rawtypes")
+	public List getKeys(String cacheName) {
+		return getOrAddCache(cacheName).getKeys();
+	}
+	
+	public void remove(String cacheName, Object key) {
+		getOrAddCache(cacheName).remove(key);
+	}
+	
+	public void removeAll(String cacheName) {
+		getOrAddCache(cacheName).removeAll();
+	}
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/ICache.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/ICache.java
new file mode 100644
index 0000000..15d2f4c
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/ICache.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ *
+ * 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.
+ */
+package com.stylefeng.guns.core.cache;
+
+import java.util.List;
+
+/**
+ * 通用缓存接口
+ */
+public interface ICache {
+	
+	void put(String cacheName, Object key, Object value);
+	
+	<T> T get(String cacheName, Object key);
+	
+	@SuppressWarnings("rawtypes")
+	List getKeys(String cacheName);
+	
+	void remove(String cacheName, Object key);
+	
+	void removeAll(String cacheName);
+	
+	<T> T get(String cacheName, Object key, ILoader iLoader);
+	
+	<T> T get(String cacheName, Object key, Class<? extends ILoader> iLoaderClass);
+	
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/ILoader.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/ILoader.java
new file mode 100644
index 0000000..ec94c33
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/cache/ILoader.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ *
+ * 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.
+ */
+package com.stylefeng.guns.core.cache;
+
+/**
+ *  数据重载
+ */
+public interface ILoader {
+	Object load();
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultFastjsonConfig.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultFastjsonConfig.java
new file mode 100644
index 0000000..1819147
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultFastjsonConfig.java
@@ -0,0 +1,81 @@
+package com.stylefeng.guns.core.config;
+
+import com.alibaba.fastjson.serializer.SerializeConfig;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.alibaba.fastjson.serializer.ToStringSerializer;
+import com.alibaba.fastjson.serializer.ValueFilter;
+import com.alibaba.fastjson.support.config.FastJsonConfig;
+import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+
+import java.math.BigInteger;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * fastjson配置类
+ *
+ * @author fengshuonan
+ * @date 2017-05-23 22:56
+ */
+@Configuration("defaultFastjsonConfig")
+@ConditionalOnClass(com.alibaba.fastjson.JSON.class)
+@ConditionalOnMissingBean(FastJsonHttpMessageConverter.class)
+@ConditionalOnWebApplication
+public class DefaultFastjsonConfig {
+
+    @Bean
+    public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
+        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
+        converter.setFastJsonConfig(fastjsonConfig());
+        converter.setSupportedMediaTypes(getSupportedMediaType());
+        return converter;
+    }
+
+    /**
+     * fastjson的配置
+     */
+    public FastJsonConfig fastjsonConfig() {
+        FastJsonConfig fastJsonConfig = new FastJsonConfig();
+        fastJsonConfig.setSerializerFeatures(
+                SerializerFeature.PrettyFormat,
+                SerializerFeature.WriteMapNullValue,
+                SerializerFeature.WriteEnumUsingToString
+        );
+        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
+        ValueFilter valueFilter = new ValueFilter() {
+            public Object process(Object o, String s, Object o1) {
+                if (null == o1) {
+                    o1 = "";
+                }
+                return o1;
+            }
+        };
+        fastJsonConfig.setCharset(Charset.forName("utf-8"));
+        fastJsonConfig.setSerializeFilters(valueFilter);
+
+        //解决Long转json精度丢失的问题
+        SerializeConfig serializeConfig = SerializeConfig.globalInstance;
+        serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
+        serializeConfig.put(Long.class, ToStringSerializer.instance);
+        serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
+        fastJsonConfig.setSerializeConfig(serializeConfig);
+        return fastJsonConfig;
+    }
+
+    /**
+     * 支持的mediaType类型
+     */
+    public List<MediaType> getSupportedMediaType() {
+        ArrayList<MediaType> mediaTypes = new ArrayList<>();
+        mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
+        return mediaTypes;
+    }
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultMultiConfig.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultMultiConfig.java
new file mode 100644
index 0000000..f05c344
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultMultiConfig.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.core.config;
+
+import com.stylefeng.guns.core.mutidatasource.aop.MultiSourceExAop;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 多数据源配置
+ *
+ * @author stylefeng
+ * @Date 2017/5/20 21:58
+ */
+@Configuration
+@ConditionalOnProperty(prefix = "guns", name = "muti-datasource-open", havingValue = "true")
+public class DefaultMultiConfig {
+
+    @Bean
+    public MultiSourceExAop multiSourceExAop() {
+        return new MultiSourceExAop();
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultProperties.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultProperties.java
new file mode 100644
index 0000000..cd69e4a
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultProperties.java
@@ -0,0 +1,25 @@
+package com.stylefeng.guns.core.config;
+
+import com.stylefeng.guns.core.config.properties.DruidProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+/**
+ * 默认的配置
+ *
+ * @author fengshuonan
+ * @date 2018-01-07 12:33
+ */
+@Configuration
+@PropertySource("classpath:/default-config.properties")
+public class DefaultProperties {
+
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource")
+    public DruidProperties druidProperties() {
+        return new DruidProperties();
+    }
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultWebConfig.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultWebConfig.java
new file mode 100644
index 0000000..f6abb63
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/DefaultWebConfig.java
@@ -0,0 +1,65 @@
+package com.stylefeng.guns.core.config;
+
+import com.stylefeng.guns.core.base.controller.GunsErrorView;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.exception.GunsExceptionEnum;
+import com.stylefeng.guns.core.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.core.convert.support.GenericConversionService;
+import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
+
+import javax.annotation.PostConstruct;
+import java.util.Date;
+import java.util.regex.Pattern;
+
+@Configuration
+public class DefaultWebConfig extends WebMvcConfigurationSupport {
+
+    @Autowired
+    private RequestMappingHandlerAdapter handlerAdapter;
+
+    @Bean("error")
+    public GunsErrorView error() {
+        return new GunsErrorView();
+    }
+
+    @PostConstruct
+    public void addConversionConfig() {
+        ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) handlerAdapter.getWebBindingInitializer();
+        GenericConversionService genericConversionService = (GenericConversionService) initializer.getConversionService();
+        genericConversionService.addConverter(new StringToDateConverter());
+    }
+
+    public class StringToDateConverter implements Converter<String, Date> {
+
+        @Override
+        public Date convert(String dateString) {
+
+            String patternDate = "\\d{4}-\\d{1,2}-\\d{1,2}";
+            String patternTimeMinutes = "\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}";
+            String patternTimeSeconds = "\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}";
+
+            boolean dateFlag = Pattern.matches(patternDate, dateString);
+            boolean timeMinutesFlag = Pattern.matches(patternTimeMinutes, dateString);
+            boolean timeSecondsFlag = Pattern.matches(patternTimeSeconds, dateString);
+
+            if (dateFlag) {
+                return DateUtil.parseDate(dateString);
+            } else if (timeMinutesFlag) {
+                return DateUtil.parseTimeMinutes(dateString);
+            } else if (timeSecondsFlag) {
+                return DateUtil.parseTime(dateString);
+            } else {
+                throw new GunsException(GunsExceptionEnum.INVLIDE_DATE_STRING);
+            }
+
+        }
+    }
+}
+
+
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java
new file mode 100644
index 0000000..17ffd3a
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java
@@ -0,0 +1,217 @@
+package com.stylefeng.guns.core.config.properties;
+
+import com.alibaba.druid.pool.DruidDataSource;
+
+import java.sql.SQLException;
+
+/**
+ * <p>数据库数据源配置</p>
+ * <p>说明:这个类中包含了许多默认配置,若这些配置符合您的情况,您可以不用管,若不符合,建议不要修改本类,建议直接在"application.yml"中配置即可</p>
+ * @author stylefeng
+ * @date 2017-05-21 11:18
+ */
+public class DruidProperties {
+
+    private String url = "jdbc:mysql://127.0.0.1:3306/guns?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull";
+
+    private String username = "root";
+
+    private String password = "root";
+
+    private String driverClassName = "com.mysql.cj.jdbc.Driver";
+
+    private Integer initialSize = 2;
+
+    private Integer minIdle = 1;
+
+    private Integer maxActive = 20;
+
+    private Integer maxWait = 60000;
+
+    private Integer timeBetweenEvictionRunsMillis = 60000;
+
+    private Integer minEvictableIdleTimeMillis = 300000;
+
+    private String validationQuery = "SELECT 'x'";
+
+    private Boolean testWhileIdle = true;
+
+    private Boolean testOnBorrow = false;
+
+    private Boolean testOnReturn = false;
+
+    private Boolean poolPreparedStatements = true;
+
+    private Integer maxPoolPreparedStatementPerConnectionSize = 20;
+
+    private String filters = "stat";
+
+    public void config(DruidDataSource dataSource) {
+
+        dataSource.setUrl(url);
+        dataSource.setUsername(username);
+        dataSource.setPassword(password);
+
+        dataSource.setDriverClassName(driverClassName);
+        dataSource.setInitialSize(initialSize);     //定义初始连接数
+        dataSource.setMinIdle(minIdle);             //最小空闲
+        dataSource.setMaxActive(maxActive);         //定义最大连接数
+        dataSource.setMaxWait(maxWait);             //最长等待时间
+
+        // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
+
+        // 配置一个连接在池中最小生存的时间,单位是毫秒
+        dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
+        dataSource.setValidationQuery(validationQuery);
+        dataSource.setTestWhileIdle(testWhileIdle);
+        dataSource.setTestOnBorrow(testOnBorrow);
+        dataSource.setTestOnReturn(testOnReturn);
+
+        // 打开PSCache,并且指定每个连接上PSCache的大小
+        dataSource.setPoolPreparedStatements(poolPreparedStatements);
+        dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
+
+        try {
+            dataSource.setFilters(filters);
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getDriverClassName() {
+        return driverClassName;
+    }
+
+    public void setDriverClassName(String driverClassName) {
+        this.driverClassName = driverClassName;
+    }
+
+    public Integer getInitialSize() {
+        return initialSize;
+    }
+
+    public void setInitialSize(Integer initialSize) {
+        this.initialSize = initialSize;
+    }
+
+    public Integer getMinIdle() {
+        return minIdle;
+    }
+
+    public void setMinIdle(Integer minIdle) {
+        this.minIdle = minIdle;
+    }
+
+    public Integer getMaxActive() {
+        return maxActive;
+    }
+
+    public void setMaxActive(Integer maxActive) {
+        this.maxActive = maxActive;
+    }
+
+    public Integer getMaxWait() {
+        return maxWait;
+    }
+
+    public void setMaxWait(Integer maxWait) {
+        this.maxWait = maxWait;
+    }
+
+    public Integer getTimeBetweenEvictionRunsMillis() {
+        return timeBetweenEvictionRunsMillis;
+    }
+
+    public void setTimeBetweenEvictionRunsMillis(Integer timeBetweenEvictionRunsMillis) {
+        this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
+    }
+
+    public Integer getMinEvictableIdleTimeMillis() {
+        return minEvictableIdleTimeMillis;
+    }
+
+    public void setMinEvictableIdleTimeMillis(Integer minEvictableIdleTimeMillis) {
+        this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
+    }
+
+    public String getValidationQuery() {
+        return validationQuery;
+    }
+
+    public void setValidationQuery(String validationQuery) {
+        this.validationQuery = validationQuery;
+    }
+
+    public Boolean getTestWhileIdle() {
+        return testWhileIdle;
+    }
+
+    public void setTestWhileIdle(Boolean testWhileIdle) {
+        this.testWhileIdle = testWhileIdle;
+    }
+
+    public Boolean getTestOnBorrow() {
+        return testOnBorrow;
+    }
+
+    public void setTestOnBorrow(Boolean testOnBorrow) {
+        this.testOnBorrow = testOnBorrow;
+    }
+
+    public Boolean getTestOnReturn() {
+        return testOnReturn;
+    }
+
+    public void setTestOnReturn(Boolean testOnReturn) {
+        this.testOnReturn = testOnReturn;
+    }
+
+    public Boolean getPoolPreparedStatements() {
+        return poolPreparedStatements;
+    }
+
+    public void setPoolPreparedStatements(Boolean poolPreparedStatements) {
+        this.poolPreparedStatements = poolPreparedStatements;
+    }
+
+    public Integer getMaxPoolPreparedStatementPerConnectionSize() {
+        return maxPoolPreparedStatementPerConnectionSize;
+    }
+
+    public void setMaxPoolPreparedStatementPerConnectionSize(Integer maxPoolPreparedStatementPerConnectionSize) {
+        this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
+    }
+
+    public String getFilters() {
+        return filters;
+    }
+
+    public void setFilters(String filters) {
+        this.filters = filters;
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/MutiDataSourceProperties.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/MutiDataSourceProperties.java
new file mode 100644
index 0000000..60fc761
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/MutiDataSourceProperties.java
@@ -0,0 +1,80 @@
+package com.stylefeng.guns.core.config.properties;
+
+import com.alibaba.druid.pool.DruidDataSource;
+
+/**
+ * 默认多数据源配置
+ *
+ * @author fengshuonan
+ * @date 2017-08-16 10:02
+ */
+public class MutiDataSourceProperties {
+
+    private String url = "jdbc:mysql://127.0.0.1:3306/biz?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull";
+
+    private String username = "root";
+
+    private String password = "root";
+
+    private String driverClassName = "com.mysql.cj.jdbc.Driver";
+
+    private String validationQuery = "SELECT 'x'";
+
+    private String[] dataSourceNames = {"dataSourceGuns", "dataSourceBiz"};
+
+    public void config(DruidDataSource dataSource) {
+        dataSource.setUrl(url);
+        dataSource.setUsername(username);
+        dataSource.setPassword(password);
+        dataSource.setDriverClassName(driverClassName);
+        dataSource.setValidationQuery(validationQuery);
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getDriverClassName() {
+        return driverClassName;
+    }
+
+    public void setDriverClassName(String driverClassName) {
+        this.driverClassName = driverClassName;
+    }
+
+    public String getValidationQuery() {
+        return validationQuery;
+    }
+
+    public void setValidationQuery(String validationQuery) {
+        this.validationQuery = validationQuery;
+    }
+
+    public String[] getDataSourceNames() {
+        return dataSourceNames;
+    }
+
+    public void setDataSourceNames(String[] dataSourceNames) {
+        this.dataSourceNames = dataSourceNames;
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/constant/IsMenu.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/constant/IsMenu.java
new file mode 100644
index 0000000..f973103
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/constant/IsMenu.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.core.constant;
+
+/**
+ * 是否是菜单的枚举
+ *
+ * @author fengshuonan
+ * @date 2017年6月1日22:50:11
+ */
+public enum IsMenu {
+
+    YES(1, "是"),
+    NO(0, "不是"); //不是菜单的是按钮
+
+    int code;
+    String message;
+
+    IsMenu(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public static String valueOf(Integer status) {
+        if (status == null) {
+            return "";
+        } else {
+            for (IsMenu s : IsMenu.values()) {
+                if (s.getCode() == status) {
+                    return s.getMessage();
+                }
+            }
+            return "";
+        }
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/datascope/DataScope.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/datascope/DataScope.java
new file mode 100644
index 0000000..c43e362
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/datascope/DataScope.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.core.datascope;
+
+import java.util.List;
+
+/**
+ * 数据范围
+ *
+ * @author fengshuonan
+ * @date 2017-07-23 22:19
+ */
+public class DataScope {
+
+    /**
+     * 限制范围的字段名称
+     */
+    private String scopeName = "deptid";
+
+    /**
+     * 具体的数据范围
+     */
+    private List<Integer> deptIds;
+
+    public DataScope() {
+    }
+
+    public DataScope(List<Integer> deptIds) {
+        this.deptIds = deptIds;
+    }
+
+    public DataScope(String scopeName, List<Integer> deptIds) {
+        this.scopeName = scopeName;
+        this.deptIds = deptIds;
+    }
+
+    public List<Integer> getDeptIds() {
+        return deptIds;
+    }
+
+    public void setDeptIds(List<Integer> deptIds) {
+        this.deptIds = deptIds;
+    }
+
+    public String getScopeName() {
+        return scopeName;
+    }
+
+    public void setScopeName(String scopeName) {
+        this.scopeName = scopeName;
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/datascope/DataScopeInterceptor.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/datascope/DataScopeInterceptor.java
new file mode 100644
index 0000000..5b1ed5b
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/datascope/DataScopeInterceptor.java
@@ -0,0 +1,82 @@
+package com.stylefeng.guns.core.datascope;
+
+
+import com.baomidou.mybatisplus.toolkit.PluginUtils;
+import com.stylefeng.guns.core.support.CollectionKit;
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlCommandType;
+import org.apache.ibatis.plugin.*;
+import org.apache.ibatis.reflection.MetaObject;
+import org.apache.ibatis.reflection.SystemMetaObject;
+
+import java.sql.Connection;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * 数据范围的拦截器
+ *
+ * @author fengshuonan
+ * @date 2017-07-23 21:26
+ */
+@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
+public class DataScopeInterceptor implements Interceptor {
+
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        StatementHandler statementHandler = (StatementHandler) PluginUtils.realTarget(invocation.getTarget());
+        MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler);
+        MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement");
+
+        if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) {
+            return invocation.proceed();
+        }
+
+        BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql");
+        String originalSql = boundSql.getSql();
+        Object parameterObject = boundSql.getParameterObject();
+
+        //查找参数中包含DataScope类型的参数
+        DataScope dataScope = findDataScopeObject(parameterObject);
+
+        if (dataScope == null) {
+            return invocation.proceed();
+        } else {
+            String scopeName = dataScope.getScopeName();
+            List<Integer> deptIds = dataScope.getDeptIds();
+            String join = CollectionKit.join(deptIds, ",");
+            originalSql = "select * from (" + originalSql + ") temp_data_scope where temp_data_scope." + scopeName + " in (" + join + ")";
+            metaStatementHandler.setValue("delegate.boundSql.sql", originalSql);
+            return invocation.proceed();
+        }
+    }
+
+    /**
+     * 查找参数是否包括DataScope对象
+     */
+    public DataScope findDataScopeObject(Object parameterObj) {
+        if (parameterObj instanceof DataScope) {
+            return (DataScope) parameterObj;
+        } else if (parameterObj instanceof Map) {
+            for (Object val : ((Map<?, ?>) parameterObj).values()) {
+                if (val instanceof DataScope) {
+                    return (DataScope) val;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Object plugin(Object target) {
+        return Plugin.wrap(target, this);
+    }
+
+    @Override
+    public void setProperties(Properties properties) {
+
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/db/Db.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/db/Db.java
new file mode 100644
index 0000000..12f2cf9
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/db/Db.java
@@ -0,0 +1,108 @@
+package com.stylefeng.guns.core.db;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.core.util.SpringContextHolder;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 便捷数据库操作类
+ * <p>
+ * <p>
+ * 本类的使用情景:
+ * <p>
+ * 1.单纯想创建现有的Mapper
+ * <p>例如:
+ * Db.getMapper(UserLoginMapper.class).selectById("14779707158513204");<br>
+ * <p>
+ *
+ * @author fengshuonan
+ * @date 2017年2月22日 下午8:07:17
+ */
+@SuppressWarnings("all")
+public class Db<T> {
+
+    /**
+     * 每个Db类,包装一个Mapper接口,这个clazz就是接口的类类型,例如UserMapper.class
+     */
+    private Class<T> clazz;
+
+    /**
+     * Mapper的父类接口
+     */
+    private BaseMapper<?> baseMapper;
+
+    /**
+     * 私有构造方法,不允许自己创建
+     */
+    private Db(Class clazz) {
+        this.clazz = clazz;
+        this.baseMapper = (BaseMapper<?>) SpringContextHolder.getBean(clazz);
+    }
+
+    /**
+     * <p>
+     * 创建包含指定mapper的Db工具类,使用本类的第一种用法
+     *
+     * @param clazz mapper的类类型
+     * @date 2017年2月22日 下午10:09:31
+     */
+    public static <T> Db<T> create(Class<T> clazz) {
+        return new Db<T>(clazz);
+    }
+
+    /**
+     * <p>
+     * 获取一个mapper的快捷方法
+     *
+     * @param clazz mapper类的类对象
+     * @date 2017年2月22日 下午10:31:35
+     */
+    public BaseMapper<?> getMapper() {
+        return this.baseMapper;
+    }
+
+    /**
+     * <p>
+     * 获取一个mapper的快捷方法
+     *
+     * @param clazz mapper类的类对象
+     * @date 2017年2月22日 下午10:31:35
+     */
+    public static <T> T getMapper(Class<T> clazz) {
+        return SpringContextHolder.getBean(clazz);
+    }
+
+    /**
+     * 通过一个条件获取数据库中的一条记录(会返回null)
+     *
+     * @date 2017年2月22日 下午10:45:51
+     */
+    public <E> E selectOneByCon(String condition, Object value) {
+        List<?> results = selectOneByConList(condition, value);
+        if (results != null && results.size() > 0) {
+            return (E) results.get(0);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 通过一个条件获取一堆记录(会返回null)
+     *
+     * @date 2017年2月22日 下午10:45:51
+     */
+    public <E> List<E> selectOneByConList(String condition, Object value) {
+        HashMap<String, Object> conditionMap = new HashMap<String, Object>();
+        conditionMap.put(condition, value);
+
+        List<E> results = (List<E>) this.baseMapper.selectByMap(conditionMap);
+        if (results == null || results.size() == 0) {
+            return null;
+        } else {
+            return results;
+        }
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/exception/GunsException.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/exception/GunsException.java
new file mode 100644
index 0000000..2cdfcb0
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/exception/GunsException.java
@@ -0,0 +1,36 @@
+package com.stylefeng.guns.core.exception;
+
+/**
+ * 封装guns的异常
+ *
+ * @author fengshuonan
+ * @Date 2017/12/28 下午10:32
+ */
+public class GunsException extends RuntimeException {
+
+    private Integer code;
+
+    private String message;
+
+    public GunsException(ServiceExceptionEnum serviceExceptionEnum) {
+        this.code = serviceExceptionEnum.getCode();
+        this.message = serviceExceptionEnum.getMessage();
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/exception/GunsExceptionEnum.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/exception/GunsExceptionEnum.java
new file mode 100644
index 0000000..8a0765f
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/exception/GunsExceptionEnum.java
@@ -0,0 +1,59 @@
+package com.stylefeng.guns.core.exception;
+
+/**
+ * Guns异常枚举
+ *
+ * @author fengshuonan
+ * @Date 2017/12/28 下午10:33
+ */
+public enum GunsExceptionEnum implements ServiceExceptionEnum {
+
+    /**
+     * 其他
+     */
+    INVLIDE_DATE_STRING(400, "输入日期格式不对"),
+
+    /**
+     * 其他
+     */
+    WRITE_ERROR(500, "渲染界面错误"),
+
+    /**
+     * 文件上传
+     */
+    FILE_READING_ERROR(400, "FILE_READING_ERROR!"),
+    FILE_NOT_FOUND(400, "FILE_NOT_FOUND!"),
+
+    /**
+     * 错误的请求
+     */
+    REQUEST_NULL(400, "请求有错误"),
+    SERVER_ERROR(500, "服务器异常");
+
+    GunsExceptionEnum(int code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    private Integer code;
+
+    private String message;
+
+    @Override
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/exception/ServiceExceptionEnum.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/exception/ServiceExceptionEnum.java
new file mode 100644
index 0000000..80531be
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/exception/ServiceExceptionEnum.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.core.exception;
+
+/**
+ * 抽象接口
+ *
+ * @author fengshuonan
+ * @date 2017-12-28-下午10:27
+ */
+public interface ServiceExceptionEnum {
+
+    /**
+     * 获取异常编码
+     */
+    Integer getCode();
+
+    /**
+     * 获取异常信息
+     */
+    String getMessage();
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/DataSourceContextHolder.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/DataSourceContextHolder.java
new file mode 100644
index 0000000..bee13e8
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/DataSourceContextHolder.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.core.mutidatasource;
+
+/**
+ * datasource的上下文
+ *
+ * @author fengshuonan
+ * @date 2017年3月5日 上午9:10:58
+ */
+public class DataSourceContextHolder {
+
+    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
+
+    /**
+     * 设置数据源类型
+     *
+     * @param dataSourceType 数据库类型
+     */
+    public static void setDataSourceType(String dataSourceType) {
+        contextHolder.set(dataSourceType);
+    }
+
+    /**
+     * 获取数据源类型
+     */
+    public static String getDataSourceType() {
+        return contextHolder.get();
+    }
+
+    /**
+     * 清除数据源类型
+     */
+    public static void clearDataSourceType() {
+        contextHolder.remove();
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/DynamicDataSource.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/DynamicDataSource.java
new file mode 100644
index 0000000..e2cf4be
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/DynamicDataSource.java
@@ -0,0 +1,18 @@
+package com.stylefeng.guns.core.mutidatasource;
+
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+
+/**
+ * 动态数据源
+ *
+ * @author fengshuonan
+ * @date 2017年3月5日 上午9:11:49
+ */
+public class DynamicDataSource extends AbstractRoutingDataSource {
+
+	@Override
+	protected Object determineCurrentLookupKey() {
+		return DataSourceContextHolder.getDataSourceType();
+	}
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/annotion/DataSource.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/annotion/DataSource.java
new file mode 100644
index 0000000..c7da1c6
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/annotion/DataSource.java
@@ -0,0 +1,18 @@
+package com.stylefeng.guns.core.mutidatasource.annotion;
+
+import java.lang.annotation.*;
+
+/**
+ * 
+ * 多数据源标识
+ *
+ * @author fengshuonan
+ * @date 2017年3月5日 上午9:44:24
+ */
+@Inherited
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.METHOD })
+public @interface DataSource {
+
+	String name() default "";
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/aop/MultiSourceExAop.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/aop/MultiSourceExAop.java
new file mode 100644
index 0000000..890f9c9
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/mutidatasource/aop/MultiSourceExAop.java
@@ -0,0 +1,77 @@
+package com.stylefeng.guns.core.mutidatasource.aop;
+
+import com.stylefeng.guns.core.mutidatasource.DataSourceContextHolder;
+import com.stylefeng.guns.core.mutidatasource.annotion.DataSource;
+import com.stylefeng.guns.core.config.properties.MutiDataSourceProperties;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.Ordered;
+
+import java.lang.reflect.Method;
+
+/**
+ * 多数据源切换的aop
+ *
+ * @author fengshuonan
+ * @date 2017年3月5日 上午10:22:16
+ */
+@Aspect
+public class MultiSourceExAop implements Ordered {
+
+    private Logger log = LoggerFactory.getLogger(this.getClass());
+
+    @Autowired
+    MutiDataSourceProperties mutiDataSourceProperties;
+
+    @Pointcut(value = "@annotation(com.stylefeng.guns.core.mutidatasource.annotion.DataSource)")
+    private void cut() {
+
+    }
+
+    @Around("cut()")
+    public Object around(ProceedingJoinPoint point) throws Throwable {
+
+        Signature signature = point.getSignature();
+        MethodSignature methodSignature = null;
+        if (!(signature instanceof MethodSignature)) {
+            throw new IllegalArgumentException("该注解只能用于方法");
+        }
+        methodSignature = (MethodSignature) signature;
+
+        Object target = point.getTarget();
+        Method currentMethod = target.getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes());
+
+        DataSource datasource = currentMethod.getAnnotation(DataSource.class);
+        if (datasource != null) {
+            DataSourceContextHolder.setDataSourceType(datasource.name());
+            log.debug("设置数据源为:" + datasource.name());
+        } else {
+            DataSourceContextHolder.setDataSourceType(mutiDataSourceProperties.getDataSourceNames()[0]);
+            log.debug("设置数据源为:dataSourceCurrent");
+        }
+
+        try {
+            return point.proceed();
+        } finally {
+            log.debug("清空数据源信息!");
+            DataSourceContextHolder.clearDataSourceType();
+        }
+    }
+
+
+    /**
+     * aop的顺序要早于spring的事务
+     */
+    @Override
+    public int getOrder() {
+        return 1;
+    }
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/node/MenuNode.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/node/MenuNode.java
new file mode 100644
index 0000000..61bf3fc
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/node/MenuNode.java
@@ -0,0 +1,239 @@
+package com.stylefeng.guns.core.node;
+
+import com.stylefeng.guns.core.constant.IsMenu;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+
+/**
+ * @author fengshuonan
+ * @Description 菜单的节点
+ * @date 2016年12月6日 上午11:34:17
+ */
+public class MenuNode implements Comparable {
+
+    /**
+     * 节点id
+     */
+    private Long id;
+
+    /**
+     * 父节点
+     */
+    private Long parentId;
+
+    /**
+     * 节点名称
+     */
+    private String name;
+
+    /**
+     * 按钮级别
+     */
+    private Integer levels;
+
+    /**
+     * 按钮级别
+     */
+    private Integer ismenu;
+
+    /**
+     * 按钮的排序
+     */
+    private Integer num;
+
+    /**
+     * 节点的url
+     */
+    private String url;
+
+    /**
+     * 节点图标
+     */
+    private String icon;
+
+    /**
+     * 子节点的集合
+     */
+    private List<MenuNode> children;
+
+    /**
+     * 查询子节点时候的临时集合
+     */
+    private List<MenuNode> linkedList = new ArrayList<MenuNode>();
+
+    public MenuNode() {
+        super();
+    }
+
+    public MenuNode(Long id, Long parentId) {
+        super();
+        this.id = id;
+        this.parentId = parentId;
+    }
+
+    public Integer getLevels() {
+        return levels;
+    }
+
+    public void setLevels(Integer levels) {
+        this.levels = levels;
+    }
+
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    public static MenuNode createRoot() {
+        return new MenuNode(0L, -1L);
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public List<MenuNode> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<MenuNode> children) {
+        this.children = children;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public Integer getIsmenu() {
+        return ismenu;
+    }
+
+    public void setIsmenu(Integer ismenu) {
+        this.ismenu = ismenu;
+    }
+
+    @Override
+    public String toString() {
+        return "MenuNode{" +
+                "id=" + id +
+                ", parentId=" + parentId +
+                ", name='" + name + '\'' +
+                ", levels=" + levels +
+                ", num=" + num +
+                ", url='" + url + '\'' +
+                ", icon='" + icon + '\'' +
+                ", children=" + children +
+                ", linkedList=" + linkedList +
+                '}';
+    }
+
+    /**
+     * 重写排序比较接口,首先根据等级排序,然后更具排序字段排序
+     *
+     * @param o
+     * @return
+     */
+    @Override
+    public int compareTo(Object o) {
+        MenuNode menuNode = (MenuNode) o;
+        Integer num = menuNode.getNum();
+        Integer levels = menuNode.getLevels();
+        if (num == null) {
+            num = 0;
+        }
+        if (levels == null) {
+            levels = 0;
+        }
+        if (this.levels.compareTo(levels) == 0) {
+            return this.num.compareTo(num);
+        } else {
+            return this.levels.compareTo(levels);
+        }
+
+    }
+
+    /**
+     * 构建页面菜单列表
+     */
+    public static List<MenuNode> buildTitle(List<MenuNode> nodes) {
+        if (nodes.size() <= 0) {
+            return nodes;
+        }
+        //剔除非菜单
+        nodes.removeIf(node -> node.getIsmenu() != IsMenu.YES.getCode());
+        //对菜单排序,返回列表按菜单等级,序号的排序方式排列
+        Collections.sort(nodes);
+        return mergeList(nodes, nodes.get(nodes.size() - 1).getLevels(), null);
+    }
+
+    /**
+     * 递归合并数组为子数组,最后返回第一层
+     *
+     * @param menuList
+     * @param listMap
+     * @return
+     */
+    private static List<MenuNode> mergeList(List<MenuNode> menuList, int rank, Map<Long, List<MenuNode>> listMap) {
+        //保存当次调用总共合并了多少元素
+        int n;
+        //保存当次调用总共合并出来的list
+        Map<Long, List<MenuNode>> currentMap = new HashMap<>();
+        //由于按等级从小到大排序,需要从后往前排序
+        //判断该节点是否属于当前循环的等级,不等于则跳出循环
+        for (n = menuList.size() - 1; n >=0&&menuList.get(n).getLevels() == rank; n--) {
+            //判断之前的调用是否有返回以该节点的id为key的map,有则设置为children列表。
+            if (listMap != null && listMap.get(menuList.get(n).getId()) != null) {
+                menuList.get(n).setChildren(listMap.get(menuList.get(n).getId()));
+            }
+            if (menuList.get(n).getParentId()!=null&&menuList.get(n).getParentId()!=0) {
+                //判断当前节点所属的pid是否已经创建了以该pid为key的键值对,没有则创建新的链表
+                currentMap.computeIfAbsent(menuList.get(n).getParentId(), k -> new LinkedList<>());
+                //将该节点插入到对应的list的头部
+                currentMap.get(menuList.get(n).getParentId()).add(0, menuList.get(n));
+            }
+        }
+        if (n <0) {
+            return menuList;
+        } else {
+            return mergeList(menuList.subList(0, n+1), menuList.get(n).getLevels(), currentMap);
+        }
+    }
+
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/node/ZTreeNode.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/node/ZTreeNode.java
new file mode 100644
index 0000000..a330514
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/node/ZTreeNode.java
@@ -0,0 +1,79 @@
+package com.stylefeng.guns.core.node;
+
+/**
+ * 
+ * jquery ztree 插件的节点
+ * 
+ * @author fengshuonan
+ * @date 2017年2月17日 下午8:25:14
+ */
+public class ZTreeNode {
+
+	private Long id;	//节点id
+	
+	private Long pId;//父节点id
+	
+	private String name;//节点名称
+	
+	private Boolean open;//是否打开节点
+	
+	private Boolean checked;//是否被选中
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getpId() {
+		return pId;
+	}
+
+	public void setpId(Long pId) {
+		this.pId = pId;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Boolean getOpen() {
+		return open;
+	}
+
+	public void setOpen(Boolean open) {
+		this.open = open;
+	}
+
+	public Boolean getIsOpen() {
+		return open;
+	}
+
+	public void setIsOpen(Boolean open) {
+		this.open = open;
+	}
+
+	public Boolean getChecked() {
+		return checked;
+	}
+
+	public void setChecked(Boolean checked) {
+		this.checked = checked;
+	}
+	
+	public static ZTreeNode createParent(){
+		ZTreeNode zTreeNode = new ZTreeNode();
+		zTreeNode.setChecked(true);
+		zTreeNode.setId(0L);
+		zTreeNode.setName("顶级");
+		zTreeNode.setOpen(true);
+		zTreeNode.setpId(0L);
+		return zTreeNode;
+	}
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/page/PageBT.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/page/PageBT.java
new file mode 100644
index 0000000..7af90f9
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/page/PageBT.java
@@ -0,0 +1,65 @@
+package com.stylefeng.guns.core.page;
+
+/**
+ * 分页参数类(for BootStrap Table)
+ *
+ * @author fengshuonan
+ * @date 2017年1月21日 下午2:21:35
+ */
+public class PageBT {
+
+    private int limit;          // 每页显示个数
+
+    private int offset;         // 查询的偏移量(查询的页数 = offset/limit + 1)
+
+    private String order;       // 排序方式
+
+
+    public PageBT() {
+        super();
+    }
+
+    public PageBT(int limit, int offset) {
+        super();
+        this.limit = limit;
+        this.offset = offset;
+    }
+
+    public int getLimit() {
+        return limit;
+    }
+
+    public void setLimit(int limit) {
+        this.limit = limit;
+    }
+
+    public int getOffset() {
+        return offset;
+    }
+
+    public void setOffset(int offset) {
+        this.offset = offset;
+    }
+
+    public String getOrder() {
+        return order;
+    }
+
+    public void setOrder(String order) {
+        this.order = order;
+    }
+
+    public int getPageSize() {
+        return this.limit;
+    }
+
+    public int getPageNumber() {
+        return this.offset / this.limit + 1;
+    }
+
+    @Override
+    public String toString() {
+        return "PageBT [limit=" + limit + ", offset=" + offset + ", order=" + order + "]";
+    }
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/page/PageInfoBT.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/page/PageInfoBT.java
new file mode 100644
index 0000000..6230e13
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/page/PageInfoBT.java
@@ -0,0 +1,41 @@
+package com.stylefeng.guns.core.page;
+
+import com.baomidou.mybatisplus.plugins.Page;
+
+import java.util.List;
+
+/**
+ * 分页结果的封装(for Bootstrap Table)
+ *
+ * @author fengshuonan
+ * @Date 2017年1月22日 下午11:06:41
+ */
+public class PageInfoBT<T> {
+
+    // 结果集
+    private List<T> rows;
+
+    // 总数
+    private long total;
+
+    public PageInfoBT(Page<T> page) {
+        this.rows = page.getRecords();
+        this.total = page.getTotal();
+    }
+
+    public List<T> getRows() {
+        return rows;
+    }
+
+    public void setRows(List<T> rows) {
+        this.rows = rows;
+    }
+
+    public long getTotal() {
+        return total;
+    }
+
+    public void setTotal(long total) {
+        this.total = total;
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/ImgQrTool.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/ImgQrTool.java
new file mode 100644
index 0000000..f17a25b
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/ImgQrTool.java
@@ -0,0 +1,294 @@
+package com.stylefeng.guns.core.qr;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.geom.AffineTransform;
+import java.awt.image.AffineTransformOp;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 内嵌图片的二维码生成器
+ *
+ * @author lichunxi
+ */
+public class ImgQrTool {
+
+    private static Logger log = LoggerFactory.getLogger(ImgQrTool.class);
+
+    // 镶嵌的图片宽度的一般
+    private static final int IMAGE_WIDTH = 80;
+    private static final int IMAGE_HEIGHT = 80;
+    private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;
+    private static final int FRAME_WIDTH = 2;
+
+    // 二维码写码器
+    private static MultiFormatWriter mutiWriter = new MultiFormatWriter();
+
+    /**
+     * 生成带图片的二维码
+     *
+     * @param content       二维码的内容
+     * @param width         宽度
+     * @param height        高度
+     * @param srcImagePath  被镶嵌的图片的地址
+     * @param destImagePath 生成二维码图片的地址
+     * @author fengshuonan
+     * @since 2.3.0
+     */
+    public static void encode(String content, int width, int height, String srcImagePath, String destImagePath) {
+        try {
+            ImageIO.write(genBarcode(content, width, height, srcImagePath), "jpg", new File(destImagePath));
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (WriterException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 生成带图片的二维码
+     *
+     * @param content       二维码的内容
+     * @param width         宽度
+     * @param height        高度
+     * @param srcImagePath  被镶嵌的图片的地址
+     * @author fengshuonan
+     * @since 2.3.0
+     */
+    public static void encode(String content, int width, int height, String srcImagePath, OutputStream outputStream) {
+        try {
+            ImageIO.write(genBarcode(content, width, height, srcImagePath), "jpg", outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (WriterException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 创建不带参数的二维码
+     *
+     * @author fengshuonan
+     * @since 2.3.0
+     */
+    public static void createSimpleQr(String content, int width, int height, String destImagePath) {
+
+        FileOutputStream output = null;
+
+        try {
+            String format = "jpg";// 图像类型
+            Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
+            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
+            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);// 生成矩阵
+            File dest = new File(destImagePath);
+            output = new FileOutputStream(dest);
+            MatrixToImageWriter.writeToStream(bitMatrix, format, output);// 输出图像
+        } catch (Exception e) {
+            log.error("生成二维码出错!ImgQrTool:createSimpleQr()", e);
+        } finally {
+            try {
+                output.close();
+            } catch (IOException e) {
+                log.error("生成二维码出错!ImgQrTool:createSimpleQr()", e);
+            }
+        }
+    }
+
+    private static BufferedImage genBarcode(String content, int width, int height, String srcImagePath)
+            throws WriterException, IOException {
+        // 读取源图像
+        BufferedImage scaleImage = scale(srcImagePath, IMAGE_WIDTH, IMAGE_HEIGHT, true);
+        int[][] srcPixels = new int[IMAGE_WIDTH][IMAGE_HEIGHT];
+        for (int i = 0; i < scaleImage.getWidth(); i++) {
+            for (int j = 0; j < scaleImage.getHeight(); j++) {
+                srcPixels[i][j] = scaleImage.getRGB(i, j);
+            }
+        }
+
+        Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>();
+        hint.put(EncodeHintType.CHARACTER_SET, "utf-8");
+        hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        hint.put(EncodeHintType.MARGIN, 1);// 二维码整体白框
+
+        // 生成二维码
+        BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hint);
+
+        // 二维矩阵转为一维像素数组
+        int halfW = matrix.getWidth() / 2;
+        int halfH = matrix.getHeight() / 2;
+        int[] pixels = new int[width * height];
+
+        for (int y = 0; y < matrix.getHeight(); y++) {
+            for (int x = 0; x < matrix.getWidth(); x++) {
+                // 读取图片
+                if (x > halfW - IMAGE_HALF_WIDTH && x < halfW + IMAGE_HALF_WIDTH && y > halfH - IMAGE_HALF_WIDTH
+                        && y < halfH + IMAGE_HALF_WIDTH) {
+                    pixels[y * width + x] = srcPixels[x - halfW + IMAGE_HALF_WIDTH][y - halfH + IMAGE_HALF_WIDTH];
+                }
+                // 在图片四周形成边框
+                else if ((x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH && x < halfW - IMAGE_HALF_WIDTH + FRAME_WIDTH
+                        && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH + IMAGE_HALF_WIDTH + FRAME_WIDTH)
+                        || (x > halfW + IMAGE_HALF_WIDTH - FRAME_WIDTH && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
+                        && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH
+                        && y < halfH + IMAGE_HALF_WIDTH + FRAME_WIDTH)
+                        || (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
+                        && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH
+                        && y < halfH - IMAGE_HALF_WIDTH + FRAME_WIDTH)
+                        || (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
+                        && y > halfH + IMAGE_HALF_WIDTH - FRAME_WIDTH
+                        && y < halfH + IMAGE_HALF_WIDTH + FRAME_WIDTH)) {
+                    pixels[y * width + x] = 0xfffffff;
+                } else {
+                    // 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;
+                    pixels[y * width + x] = matrix.get(x, y) ? 0xff000000 : 0xfffffff;
+                }
+            }
+        }
+
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        image.getRaster().setDataElements(0, 0, width, height, pixels);
+
+        return image;
+    }
+
+    /**
+     * 把传入的原始图像按高度和宽度进行缩放,生成符合要求的图标
+     *
+     * @param srcImageFile 源文件地址
+     * @param height       目标高度
+     * @param width        目标宽度
+     * @param hasFiller    比例不对时是否需要补白:true为补白; false为不补白;
+     * @throws IOException
+     */
+    private static BufferedImage scale(String srcImageFile, int height, int width, boolean hasFiller)
+            throws IOException {
+        double ratio = 0.0; // 缩放比例
+        File file = new File(srcImageFile);
+        BufferedImage srcImage = ImageIO.read(file);
+        Image destImage = srcImage.getScaledInstance(width, height, BufferedImage.SCALE_SMOOTH);
+        // 计算比例
+        if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) {
+            if (srcImage.getHeight() > srcImage.getWidth()) {
+                ratio = (new Integer(height)).doubleValue() / srcImage.getHeight();
+            } else {
+                ratio = (new Integer(width)).doubleValue() / srcImage.getWidth();
+            }
+            AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);
+            destImage = op.filter(srcImage, null);
+        }
+        if (hasFiller) {// 补白
+            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+            Graphics2D graphic = image.createGraphics();
+            graphic.setColor(Color.white);
+            graphic.fillRect(0, 0, width, height);
+            if (width == destImage.getWidth(null))
+                graphic.drawImage(destImage, 0, (height - destImage.getHeight(null)) / 2, destImage.getWidth(null),
+                        destImage.getHeight(null), Color.white, null);
+            else
+                graphic.drawImage(destImage, (width - destImage.getWidth(null)) / 2, 0, destImage.getWidth(null),
+                        destImage.getHeight(null), Color.white, null);
+            graphic.dispose();
+            destImage = image;
+        }
+        return (BufferedImage) destImage;
+    }
+
+    /**
+     * 生成上方带文字的二维码
+     */
+    public static void createQrWithFontsAbove(QrImage para) {
+        try {
+            // 首先生成二维码图片
+            BufferedImage qrImage = genBarcode(para.getQrContent(), para.getQrWidth(), para.getQrHeight(), para.getQrIconFilePath());
+
+            int qrImageWidth = qrImage.getWidth();
+            int qrImageHeight = qrImage.getHeight();
+
+            String[] splitStrLines = null;
+            splitStrLines = splitStrLines(para.getWordContent(), qrImageWidth / para.getWordSize());
+            int fontsImageHeight = splitStrLines.length * para.getWordSize() + 10; //防止文字遮挡
+
+            //创建顶部文字的图片
+            BufferedImage imageWithFonts = new BufferedImage(qrImageWidth, fontsImageHeight, BufferedImage.TYPE_4BYTE_ABGR);
+            Graphics fontsImageGraphics = imageWithFonts.getGraphics();
+            fontsImageGraphics.fillRect(0, 0, qrImageWidth, fontsImageHeight);
+            fontsImageGraphics.setColor(Color.black);
+            fontsImageGraphics.setFont(new Font("宋体", Font.PLAIN, para.getWordSize()));
+
+            //文字长度大于一行的长度,进行分行
+            if (para.getWordContent().length() > qrImageWidth / para.getWordSize()) {//每行限制的文字个数
+                for (int i = 0; i < splitStrLines.length; i++) {
+                    fontsImageGraphics.drawString(splitStrLines[i], 0, para.getWordSize() * (i + 1));
+                }
+            } else {
+                fontsImageGraphics.drawString(
+                        para.getWordContent(),
+                        ((qrImageWidth / para.getWordSize() - para.getWordContent().length()) / 2) * para.getWordSize() + 20, //总长度减去字长度除以2为向右偏移长度
+                        para.getWordSize());
+            }
+
+            // 从图片中读取RGB
+            int[] ImageArrayFonts = new int[qrImageWidth * fontsImageHeight];
+            ImageArrayFonts = imageWithFonts.getRGB(0, 0, qrImageWidth, fontsImageHeight, ImageArrayFonts, 0, qrImageWidth);
+
+            int[] ImageArrayQr = new int[qrImageWidth * qrImageHeight];
+            ImageArrayQr = qrImage.getRGB(0, 0, qrImageWidth, qrImageHeight, ImageArrayQr, 0, qrImageWidth);
+
+            // 生成新图片
+            BufferedImage ImageNew = new BufferedImage(qrImageWidth, qrImageHeight + fontsImageHeight, BufferedImage.TYPE_INT_RGB);
+            ImageNew.setRGB(0, 0, qrImageWidth, fontsImageHeight, ImageArrayFonts, 0, qrImageWidth);// 设置上半部分的RGB
+            ImageNew.setRGB(0, fontsImageHeight, qrImageWidth, qrImageHeight, ImageArrayQr, 0, qrImageWidth);// 设置下半部分的RGB
+
+            File outFile = new File(para.getFileOutputPath());
+            ImageIO.write(ImageNew, "jpg", outFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 一行字符串拆分成多行
+     */
+    private static String[] splitStrLines(String str, int len) {
+        int blocks = str.length() / len + 1;
+        String[] strs = new String[blocks];
+        for (int i = 0; i < blocks; i++) {
+            if ((i + 1) * len > str.length()) {
+                strs[i] = str.substring(i * len);
+            } else {
+                strs[i] = str.substring(i * len, (i + 1) * len);
+            }
+        }
+        return strs;
+    }
+
+    public static void main(String[] args) throws IOException {
+        for (int i = 1; i <= 1; i++) {
+            QrImage para = new QrImage.Builder()
+                    .setFileOutputPath("D:\\二维码\\test\\" + i + ".jpg")
+                    .setQrContent("http://www.baidu.com?a=" + "123")
+                    .setQrHeight(300)
+                    .setQrWidth(300)
+                    .setQrIconFilePath("D:\\二维码\\中间图标\\1.png")
+                    .setTopWrodHeight(100)
+                    .setWordContent("test" + 1)
+                    .setWordSize(18).build();
+            ImgQrTool.createQrWithFontsAbove(para);
+        }
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/MatrixToImageConfig.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/MatrixToImageConfig.java
new file mode 100644
index 0000000..5c264c2
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/MatrixToImageConfig.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 ZXing authors
+ *
+ * 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.
+ */
+
+package com.stylefeng.guns.core.qr;
+
+import java.awt.image.BufferedImage;
+
+/**
+ * Encapsulates custom configuration used in methods of {@link MatrixToImageWriter}.
+ */
+public final class MatrixToImageConfig {
+
+  public static final int BLACK = 0xFF000000;
+  public static final int WHITE = 0xFFFFFFFF;
+  
+  private final int onColor;
+  private final int offColor;
+
+  /**
+   * Creates a default config with on color {@link #BLACK} and off color {@link #WHITE}, generating normal
+   * black-on-white barcodes.
+   */
+  public MatrixToImageConfig() {
+    this(BLACK, WHITE);
+  }
+
+  /**
+   * @param onColor pixel on color, specified as an ARGB value as an int
+   * @param offColor pixel off color, specified as an ARGB value as an int
+   */
+  public MatrixToImageConfig(int onColor, int offColor) {
+    this.onColor = onColor;
+    this.offColor = offColor;
+  }
+
+  public int getPixelOnColor() {
+    return onColor;
+  }
+
+  public int getPixelOffColor() {
+    return offColor;
+  }
+
+  int getBufferedImageColorModel() {
+    // Use faster BINARY if colors match default
+    return onColor == BLACK && offColor == WHITE ? BufferedImage.TYPE_BYTE_BINARY : BufferedImage.TYPE_INT_RGB;
+  }
+
+}
\ No newline at end of file
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/MatrixToImageWriter.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/MatrixToImageWriter.java
new file mode 100644
index 0000000..1bbf4b0
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/MatrixToImageWriter.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2009 ZXing authors
+ *
+ * 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.
+ */
+package com.stylefeng.guns.core.qr;
+
+import com.google.zxing.common.BitMatrix;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Path;
+
+/**
+ * Writes a {@link BitMatrix} to {@link BufferedImage},
+ * file or stream. Provided here instead of core since it depends on
+ * Java SE libraries.
+ *
+ * @author Sean Owen
+ */
+public final class MatrixToImageWriter {
+
+  private static final MatrixToImageConfig DEFAULT_CONFIG = new MatrixToImageConfig();
+
+  private MatrixToImageWriter() {}
+
+  /**
+   * Renders a {@link BitMatrix} as an image, where "false" bits are rendered
+   * as white, and "true" bits are rendered as black.
+   */
+  public static BufferedImage toBufferedImage(BitMatrix matrix) {
+    return toBufferedImage(matrix, DEFAULT_CONFIG);
+  }
+
+  /**
+   * As {@link #toBufferedImage(BitMatrix)}, but allows customization of the output.
+   */
+  public static BufferedImage toBufferedImage(BitMatrix matrix, MatrixToImageConfig config) {
+    int width = matrix.getWidth();
+    int height = matrix.getHeight();
+    BufferedImage image = new BufferedImage(width, height, config.getBufferedImageColorModel());
+    int onColor = config.getPixelOnColor();
+    int offColor = config.getPixelOffColor();
+    for (int x = 0; x < width; x++) {
+      for (int y = 0; y < height; y++) {
+        image.setRGB(x, y, matrix.get(x, y) ? onColor : offColor);
+      }
+    }
+    return image;
+  }
+
+  /**
+   * @deprecated use {@link #writeToPath(BitMatrix, String, Path)}
+   */
+  @Deprecated
+  public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
+    writeToPath(matrix, format, file.toPath());
+  }
+
+  /**
+   * Writes a {@link BitMatrix} to a file.
+   *
+   * @see #toBufferedImage(BitMatrix)
+   */
+  public static void writeToPath(BitMatrix matrix, String format, Path file) throws IOException {
+    writeToPath(matrix, format, file, DEFAULT_CONFIG);
+  }
+
+  /**
+   * @deprecated use {@link #writeToPath(BitMatrix, String, Path, MatrixToImageConfig)}
+   */
+  @Deprecated
+  public static void writeToFile(BitMatrix matrix, String format, File file, MatrixToImageConfig config) 
+      throws IOException {
+    writeToPath(matrix, format, file.toPath(), config);
+  }
+
+  /**
+   * As {@link #writeToFile(BitMatrix, String, File)}, but allows customization of the output.
+   */
+  public static void writeToPath(BitMatrix matrix, String format, Path file, MatrixToImageConfig config)
+      throws IOException {
+    BufferedImage image = toBufferedImage(matrix, config);
+    if (!ImageIO.write(image, format, file.toFile())) {
+      throw new IOException("Could not write an image of format " + format + " to " + file);
+    }
+  }
+
+  /**
+   * Writes a {@link BitMatrix} to a stream.
+   *
+   * @see #toBufferedImage(BitMatrix)
+   */
+  public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException {
+    writeToStream(matrix, format, stream, DEFAULT_CONFIG);
+  }
+
+  /**
+   * As {@link #writeToStream(BitMatrix, String, OutputStream)}, but allows customization of the output.
+   */
+  public static void writeToStream(BitMatrix matrix, String format, OutputStream stream, MatrixToImageConfig config) 
+      throws IOException {  
+    BufferedImage image = toBufferedImage(matrix, config);
+    if (!ImageIO.write(image, format, stream)) {
+      throw new IOException("Could not write an image of format " + format);
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/QrImage.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/QrImage.java
new file mode 100644
index 0000000..ce4e48a
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/qr/QrImage.java
@@ -0,0 +1,170 @@
+package com.stylefeng.guns.core.qr;
+
+/**
+ * 二维码图片对象
+ *
+ * @author fengshuonan
+ * @date 2016年12月8日 上午11:37:09
+ */
+public class QrImage {
+
+    /**
+     * 二维码的内容
+     */
+    private String qrContent;
+
+    /**
+     * 二维码的宽度
+     */
+    private int qrWidth;
+
+    /**
+     * 二维码的高度
+     */
+    private int qrHeight;
+
+    /**
+     * 二维码中间图标的文件路径
+     */
+    private String qrIconFilePath;
+
+    /**
+     * 二维码中间小图标的边长
+     */
+    private int qrIconWidth;
+
+    /**
+     * 顶部文字的高度
+     */
+    private int topWrodHeight;
+
+    /**
+     * 文字的大小
+     */
+    private int wordSize;
+
+    /**
+     * 文字的内容
+     */
+    private String wordContent;
+
+    /**
+     * 文件的输出路径
+     */
+    private String fileOutputPath;
+
+    public static class Builder {
+        private String qrContent;
+        private int qrWidth;
+        private int qrHeight;
+        private String qrIconFilePath;
+        private int topWrodHeight;
+        private int wordSize;
+        private String wordContent;
+        private String fileOutputPath;
+        private int qrIconWidth;
+
+        public Builder() {
+        }
+
+        public Builder setQrContent(String qrContent) {
+            this.qrContent = qrContent;
+            return this;
+        }
+
+        public Builder setQrWidth(int qrWidth) {
+            this.qrWidth = qrWidth;
+            return this;
+        }
+
+        public Builder setQrHeight(int qrHeight) {
+            this.qrHeight = qrHeight;
+            return this;
+        }
+
+        public Builder setQrIconFilePath(String qrIconFilePath) {
+            this.qrIconFilePath = qrIconFilePath;
+            return this;
+        }
+
+        public Builder setTopWrodHeight(int topWrodHeight) {
+            this.topWrodHeight = topWrodHeight;
+            return this;
+        }
+
+        public Builder setWordSize(int wordSize) {
+            this.wordSize = wordSize;
+            return this;
+        }
+
+        public Builder setWordContent(String wordContent) {
+            this.wordContent = wordContent;
+            return this;
+        }
+
+        public Builder setFileOutputPath(String fileOutputPath) {
+            this.fileOutputPath = fileOutputPath;
+            return this;
+        }
+
+        public Builder setQrIconWidth(int qrIconWidth) {
+            this.qrIconWidth = qrIconWidth;
+            return this;
+        }
+
+        public QrImage build() {
+            return new QrImage(this.qrContent, this.qrWidth, this.qrHeight, this.qrIconFilePath, this.qrIconWidth,
+                    this.topWrodHeight, this.wordSize, this.wordContent, this.fileOutputPath);
+        }
+    }
+
+    public QrImage(String qrContent, int qrWidth, int qrHeight, String qrIconFilePath, int qrIconWidth,
+                   int topWrodHeight, int wordSize, String wordContent, String fileOutputPath) {
+        super();
+        this.qrContent = qrContent;
+        this.qrWidth = qrWidth;
+        this.qrHeight = qrHeight;
+        this.qrIconFilePath = qrIconFilePath;
+        this.qrIconWidth = qrIconWidth;
+        this.topWrodHeight = topWrodHeight;
+        this.wordSize = wordSize;
+        this.wordContent = wordContent;
+        this.fileOutputPath = fileOutputPath;
+    }
+
+    public String getQrContent() {
+        return qrContent;
+    }
+
+    public int getQrWidth() {
+        return qrWidth;
+    }
+
+    public int getQrHeight() {
+        return qrHeight;
+    }
+
+    public String getQrIconFilePath() {
+        return qrIconFilePath;
+    }
+
+    public int getTopWrodHeight() {
+        return topWrodHeight;
+    }
+
+    public int getWordSize() {
+        return wordSize;
+    }
+
+    public String getWordContent() {
+        return wordContent;
+    }
+
+    public String getFileOutputPath() {
+        return fileOutputPath;
+    }
+
+    public int getQrIconWidth() {
+        return qrIconWidth;
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/BasicType.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/BasicType.java
new file mode 100644
index 0000000..322d23d
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/BasicType.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.core.support;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 基本变量类型的枚举
+ *
+ * @author xiaoleilu
+ */
+public enum BasicType {
+    BYTE, SHORT, INT, INTEGER, LONG, DOUBLE, FLOAT, BOOLEAN, CHAR, CHARACTER, STRING;
+
+    /**
+     * 原始类型为Key,包装类型为Value,例如: int.class -> Integer.class.
+     */
+    public static final Map<Class<?>, Class<?>> wrapperPrimitiveMap = new HashMap<Class<?>, Class<?>>(8);
+
+    /**
+     * 包装类型为Key,原始类型为Value,例如: Integer.class -> int.class.
+     */
+    public static final Map<Class<?>, Class<?>> primitiveWrapperMap = new HashMap<Class<?>, Class<?>>(8);
+
+    static {
+        wrapperPrimitiveMap.put(Boolean.class, boolean.class);
+        wrapperPrimitiveMap.put(Byte.class, byte.class);
+        wrapperPrimitiveMap.put(Character.class, char.class);
+        wrapperPrimitiveMap.put(Double.class, double.class);
+        wrapperPrimitiveMap.put(Float.class, float.class);
+        wrapperPrimitiveMap.put(Integer.class, int.class);
+        wrapperPrimitiveMap.put(Long.class, long.class);
+        wrapperPrimitiveMap.put(Short.class, short.class);
+
+        for (Map.Entry<Class<?>, Class<?>> entry : wrapperPrimitiveMap.entrySet()) {
+            primitiveWrapperMap.put(entry.getValue(), entry.getKey());
+        }
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/BeanKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/BeanKit.java
new file mode 100644
index 0000000..b0ec608
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/BeanKit.java
@@ -0,0 +1,508 @@
+package com.stylefeng.guns.core.support;
+
+import com.stylefeng.guns.core.support.exception.ToolBoxException;
+import com.stylefeng.guns.core.util.Convert;
+
+import java.beans.*;
+import java.lang.reflect.Method;
+import java.util.*;
+import java.util.Map.Entry;
+
+/**
+ * Bean工具类
+ *
+ * @author Looly
+ */
+public class BeanKit {
+
+    /**
+     * 判断是否为Bean对象
+     *
+     * @param clazz 待测试类
+     * @return 是否为Bean对象
+     */
+    public static boolean isBean(Class<?> clazz) {
+        if (ClassKit.isNormalClass(clazz)) {
+            Method[] methods = clazz.getMethods();
+            for (Method method : methods) {
+                if (method.getParameterTypes().length == 1 && method.getName().startsWith("set")) {
+                    //检测包含标准的setXXX方法即视为标准的JavaBean
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    public static PropertyEditor findEditor(Class<?> type) {
+        return PropertyEditorManager.findEditor(type);
+    }
+
+    /**
+     * 获得Bean字段描述数组
+     *
+     * @param clazz Bean类
+     * @return 字段描述数组
+     * @throws IntrospectionException
+     */
+    public static PropertyDescriptor[] getPropertyDescriptors(Class<?> clazz) throws IntrospectionException {
+        return Introspector.getBeanInfo(clazz).getPropertyDescriptors();
+    }
+
+    /**
+     * 获得字段名和字段描述Map
+     *
+     * @param clazz Bean类
+     * @return 字段名和字段描述Map
+     * @throws IntrospectionException
+     */
+    public static Map<String, PropertyDescriptor> getFieldNamePropertyDescriptorMap(Class<?> clazz) throws IntrospectionException {
+        final PropertyDescriptor[] propertyDescriptors = getPropertyDescriptors(clazz);
+        Map<String, PropertyDescriptor> map = new HashMap<>();
+        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
+            map.put(propertyDescriptor.getName(), propertyDescriptor);
+        }
+        return map;
+    }
+
+    /**
+     * 获得Bean类属性描述
+     *
+     * @param clazz     Bean类
+     * @param fieldName 字段名
+     * @return PropertyDescriptor
+     * @throws IntrospectionException
+     */
+    public static PropertyDescriptor getPropertyDescriptor(Class<?> clazz, final String fieldName) throws IntrospectionException {
+        PropertyDescriptor[] propertyDescriptors = getPropertyDescriptors(clazz);
+        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
+            if (ObjectKit.equals(fieldName, propertyDescriptor.getName())) {
+                return propertyDescriptor;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Map转换为Bean对象
+     *
+     * @param map       Map
+     * @param beanClass Bean Class
+     * @return Bean
+     */
+    public static <T> T mapToBean(Map<?, ?> map, Class<T> beanClass) {
+        return fillBeanWithMap(map, ClassKit.newInstance(beanClass));
+    }
+
+    /**
+     * Map转换为Bean对象<br>
+     * 忽略大小写
+     *
+     * @param map       Map
+     * @param beanClass Bean Class
+     * @return Bean
+     */
+    public static <T> T mapToBeanIgnoreCase(Map<?, ?> map, Class<T> beanClass) {
+        return fillBeanWithMapIgnoreCase(map, ClassKit.newInstance(beanClass));
+    }
+
+    /**
+     * 使用Map填充Bean对象
+     *
+     * @param map  Map
+     * @param bean Bean
+     * @return Bean
+     */
+    public static <T> T fillBeanWithMap(final Map<?, ?> map, T bean) {
+        return fillBean(bean, new ValueProvider() {
+            @Override
+            public Object value(String name) {
+                return map.get(name);
+            }
+        });
+    }
+
+    /**
+     * 使用Map填充Bean对象,可配置将下划线转换为驼峰
+     *
+     * @param map           Map
+     * @param bean          Bean
+     * @param isToCamelCase 是否将下划线模式转换为驼峰模式
+     * @return Bean
+     */
+    public static <T> T fillBeanWithMap(Map<?, ?> map, T bean, boolean isToCamelCase) {
+        if (isToCamelCase) {
+            final Map<Object, Object> map2 = new HashMap<Object, Object>();
+            for (Entry<?, ?> entry : map.entrySet()) {
+                final Object key = entry.getKey();
+                if (null != key && key instanceof String) {
+                    final String keyStr = (String) key;
+                    map2.put(StrKit.toCamelCase(keyStr), entry.getValue());
+                } else {
+                    map2.put(key, entry.getValue());
+                }
+            }
+            return fillBeanWithMap(map2, bean);
+        }
+
+        return fillBeanWithMap(map, bean);
+    }
+
+    /**
+     * 使用Map填充Bean对象,忽略大小写
+     *
+     * @param map  Map
+     * @param bean Bean
+     * @return Bean
+     */
+    public static <T> T fillBeanWithMapIgnoreCase(Map<?, ?> map, T bean) {
+        final Map<Object, Object> map2 = new HashMap<Object, Object>();
+        for (Entry<?, ?> entry : map.entrySet()) {
+            final Object key = entry.getKey();
+            if (key instanceof String) {
+                final String keyStr = (String) key;
+                map2.put(keyStr.toLowerCase(), entry.getValue());
+            } else {
+                map2.put(key, entry.getValue());
+            }
+        }
+
+        return fillBean(bean, new ValueProvider() {
+            @Override
+            public Object value(String name) {
+                return map2.get(name.toLowerCase());
+            }
+        });
+    }
+
+    /**
+     * ServletRequest 参数转Bean
+     *
+     * @param request   ServletRequest
+     * @param beanClass Bean Class
+     * @return Bean
+     */
+    public static <T> T requestParamToBean(javax.servlet.ServletRequest request, Class<T> beanClass) {
+        return fillBeanWithRequestParam(request, ClassKit.newInstance(beanClass));
+    }
+
+    /**
+     * ServletRequest 参数转Bean
+     *
+     * @param request ServletRequest
+     * @param bean    Bean
+     * @return Bean
+     */
+    public static <T> T fillBeanWithRequestParam(final javax.servlet.ServletRequest request, T bean) {
+        final String beanName = StrKit.lowerFirst(bean.getClass().getSimpleName());
+        return fillBean(bean, new ValueProvider() {
+            @Override
+            public Object value(String name) {
+                String value = request.getParameter(name);
+                if (StrKit.isEmpty(value)) {
+                    // 使用类名前缀尝试查找值
+                    value = request.getParameter(beanName + StrKit.DOT + name);
+                    if (StrKit.isEmpty(value)) {
+                        // 此处取得的值为空时跳过,包括null和""
+                        value = null;
+                    }
+                }
+                return value;
+            }
+        });
+    }
+
+    /**
+     * ServletRequest 参数转Bean
+     *
+     * @param <T>
+     * @param beanClass     Bean Class
+     * @param valueProvider 值提供者
+     * @return Bean
+     */
+    public static <T> T toBean(Class<T> beanClass, ValueProvider valueProvider) {
+        return fillBean(ClassKit.newInstance(beanClass), valueProvider);
+    }
+
+    /**
+     * 填充Bean
+     *
+     * @param <T>
+     * @param bean          Bean
+     * @param valueProvider 值提供者
+     * @return Bean
+     */
+    public static <T> T fillBean(T bean, ValueProvider valueProvider) {
+        if (null == valueProvider) {
+            return bean;
+        }
+
+        Class<?> beanClass = bean.getClass();
+        try {
+            PropertyDescriptor[] propertyDescriptors = getPropertyDescriptors(beanClass);
+            String propertyName;
+            Object value;
+            for (PropertyDescriptor property : propertyDescriptors) {
+                propertyName = property.getName();
+                value = valueProvider.value(propertyName);
+                if (null == value) {
+                    continue;
+                }
+                try {
+                    property.getWriteMethod().invoke(bean, Convert.parse(property.getPropertyType(), value));
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        } catch (Exception e) {
+            throw new ToolBoxException(e);
+        }
+        return bean;
+    }
+
+    /**
+     * 对象转Map
+     *
+     * @param bean bean对象
+     * @return Map
+     */
+    public static <T> Map<String, Object> beanToMap(T bean) {
+        return beanToMap(bean, false);
+    }
+
+    /**
+     * 对象转Map
+     *
+     * @param bean bean对象
+     * @return Map
+     */
+    public static <T> List<Map<String, Object>> listToMapList(List<T> bean) {
+        ArrayList<Map<String, Object>> maps = new ArrayList<>();
+        for (T t : bean) {
+            maps.add(beanToMap(bean, false));
+        }
+        return maps;
+    }
+
+    /**
+     * 对象转Map
+     *
+     * @param bean              bean对象
+     * @param isToUnderlineCase 是否转换为下划线模式
+     * @return Map
+     */
+    public static <T> Map<String, Object> beanToMap(T bean, boolean isToUnderlineCase) {
+
+        if (bean == null) {
+            return null;
+        }
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            final PropertyDescriptor[] propertyDescriptors = getPropertyDescriptors(bean.getClass());
+            for (PropertyDescriptor property : propertyDescriptors) {
+                String key = property.getName();
+                // 过滤class属性
+                if (false == key.equals("class")) {
+                    // 得到property对应的getter方法
+                    Method getter = property.getReadMethod();
+                    Object value = getter.invoke(bean);
+                    if (null != value) {
+                        map.put(isToUnderlineCase ? StrKit.toUnderlineCase(key) : key, value);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            throw new ToolBoxException(e);
+        }
+        return map;
+    }
+
+    /**
+     * 复制Bean对象属性
+     *
+     * @param source 源Bean对象
+     * @param target 目标Bean对象
+     */
+    public static void copyProperties(Object source, Object target) {
+        copyProperties(source, target, CopyOptions.create());
+    }
+
+    /**
+     * 复制Bean对象属性<br>
+     * 限制类用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类
+     *
+     * @param source           源Bean对象
+     * @param target           目标Bean对象
+     * @param ignoreProperties 不拷贝的的属性列表
+     */
+    public static void copyProperties(Object source, Object target, String... ignoreProperties) {
+        copyProperties(source, target, CopyOptions.create().setIgnoreProperties(ignoreProperties));
+    }
+
+    /**
+     * 复制Bean对象属性<br>
+     * 限制类用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类
+     *
+     * @param source      源Bean对象
+     * @param target      目标Bean对象
+     * @param copyOptions 拷贝选项,见 {@link CopyOptions}
+     */
+    public static void copyProperties(Object source, Object target, CopyOptions copyOptions) {
+        if (null == copyOptions) {
+            copyOptions = new CopyOptions();
+        }
+
+        Class<?> actualEditable = target.getClass();
+        if (copyOptions.editable != null) {
+            //检查限制类是否为target的父类或接口
+            if (!copyOptions.editable.isInstance(target)) {
+                throw new IllegalArgumentException(StrKit.format("Target class [{}] not assignable to Editable class [{}]", target.getClass().getName(), copyOptions.editable.getName()));
+            }
+            actualEditable = copyOptions.editable;
+        }
+        PropertyDescriptor[] targetPds = null;
+        Map<String, PropertyDescriptor> sourcePdMap;
+        try {
+            sourcePdMap = getFieldNamePropertyDescriptorMap(source.getClass());
+            targetPds = getPropertyDescriptors(actualEditable);
+        } catch (IntrospectionException e) {
+            throw new ToolBoxException(e);
+        }
+
+        HashSet<String> ignoreSet = copyOptions.ignoreProperties != null ? CollectionKit.newHashSet(copyOptions.ignoreProperties) : null;
+        for (PropertyDescriptor targetPd : targetPds) {
+            Method writeMethod = targetPd.getWriteMethod();
+            if (writeMethod != null && (ignoreSet == null || false == ignoreSet.contains(targetPd.getName()))) {
+                PropertyDescriptor sourcePd = sourcePdMap.get(targetPd.getName());
+                if (sourcePd != null) {
+                    Method readMethod = sourcePd.getReadMethod();
+                    // 源对象字段的getter方法返回值必须可转换为目标对象setter方法的第一个参数
+                    if (readMethod != null && ClassKit.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) {
+                        try {
+                            Object value = ClassKit.setAccessible(readMethod).invoke(source);
+                            if (null != value || false == copyOptions.isIgnoreNullValue) {
+                                ClassKit.setAccessible(writeMethod).invoke(target, value);
+                            }
+                        } catch (Throwable ex) {
+                            throw new ToolBoxException(ex, "Copy property [{}] to [{}] error: {}", sourcePd.getName(), targetPd.getName(), ex.getMessage());
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 值提供者,用于提供Bean注入时参数对应值得抽象接口<br>
+     * 继承或匿名实例化此接口<br>
+     * 在Bean注入过程中,Bean获得字段名,通过外部方式根据这个字段名查找相应的字段值,然后注入Bean<br>
+     *
+     * @author Looly
+     */
+    public static interface ValueProvider {
+        /**
+         * 获取值
+         *
+         * @param name Bean对象中参数名
+         * @return 对应参数名的值
+         */
+        public Object value(String name);
+    }
+
+    /**
+     * 属性拷贝选项<br>
+     * 包括:<br>
+     * 1、限制的类或接口,必须为目标对象的实现接口或父类,用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类<br>
+     * 2、是否忽略空值,当源对象的值为null时,true: 忽略而不注入此值,false: 注入null<br>
+     * 3、忽略的属性列表,设置一个属性列表,不拷贝这些属性值<br>
+     *
+     * @author Looly
+     */
+    public static class CopyOptions {
+        /**
+         * 限制的类或接口,必须为目标对象的实现接口或父类,用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类
+         */
+        private Class<?> editable;
+        /**
+         * 是否忽略空值,当源对象的值为null时,true: 忽略而不注入此值,false: 注入null
+         */
+        private boolean isIgnoreNullValue;
+        /**
+         * 忽略的属性列表,设置一个属性列表,不拷贝这些属性值
+         */
+        private String[] ignoreProperties;
+
+        /**
+         * 创建拷贝选项
+         *
+         * @return 拷贝选项
+         */
+        public static CopyOptions create() {
+            return new CopyOptions();
+        }
+
+        /**
+         * 创建拷贝选项
+         *
+         * @param editable          限制的类或接口,必须为目标对象的实现接口或父类,用于限制拷贝的属性
+         * @param isIgnoreNullValue 是否忽略空值,当源对象的值为null时,true: 忽略而不注入此值,false: 注入null
+         * @param ignoreProperties  忽略的属性列表,设置一个属性列表,不拷贝这些属性值
+         * @return 拷贝选项
+         */
+        public static CopyOptions create(Class<?> editable, boolean isIgnoreNullValue, String... ignoreProperties) {
+            return new CopyOptions(editable, isIgnoreNullValue, ignoreProperties);
+        }
+
+        /**
+         * 构造拷贝选项
+         */
+        public CopyOptions() {
+        }
+
+        /**
+         * 构造拷贝选项
+         *
+         * @param editable          限制的类或接口,必须为目标对象的实现接口或父类,用于限制拷贝的属性
+         * @param isIgnoreNullValue 是否忽略空值,当源对象的值为null时,true: 忽略而不注入此值,false: 注入null
+         * @param ignoreProperties  忽略的属性列表,设置一个属性列表,不拷贝这些属性值
+         */
+        public CopyOptions(Class<?> editable, boolean isIgnoreNullValue, String... ignoreProperties) {
+            this.editable = editable;
+            this.isIgnoreNullValue = isIgnoreNullValue;
+            this.ignoreProperties = ignoreProperties;
+        }
+
+        /**
+         * 设置限制的类或接口,必须为目标对象的实现接口或父类,用于限制拷贝的属性
+         *
+         * @param editable 限制的类或接口
+         * @return CopyOptions
+         */
+        public CopyOptions setEditable(Class<?> editable) {
+            this.editable = editable;
+            return this;
+        }
+
+        /**
+         * 设置是否忽略空值,当源对象的值为null时,true: 忽略而不注入此值,false: 注入null
+         *
+         * @param isIgnoreNullVall 是否忽略空值,当源对象的值为null时,true: 忽略而不注入此值,false: 注入null
+         * @return CopyOptions
+         */
+        public CopyOptions setIgnoreNullValue(boolean isIgnoreNullVall) {
+            this.isIgnoreNullValue = isIgnoreNullVall;
+            return this;
+        }
+
+        /**
+         * 设置忽略的属性列表,设置一个属性列表,不拷贝这些属性值
+         *
+         * @param ignoreProperties 忽略的属性列表,设置一个属性列表,不拷贝这些属性值
+         * @return CopyOptions
+         */
+        public CopyOptions setIgnoreProperties(String... ignoreProperties) {
+            this.ignoreProperties = ignoreProperties;
+            return this;
+        }
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/ClassKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/ClassKit.java
new file mode 100644
index 0000000..805fc35
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/ClassKit.java
@@ -0,0 +1,206 @@
+package com.stylefeng.guns.core.support;
+
+
+import com.stylefeng.guns.core.support.exception.ToolBoxException;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+/**
+ * 类工具类
+ * 1、扫描指定包下的所有类<br>
+ * 参考 http://www.oschina.net/code/snippet_234657_22722
+ * @author seaside_hi, xiaoleilu, chill
+ *
+ */
+public class ClassKit {
+	
+	private ClassKit() {
+		// 静态类不可实例化
+	}
+	
+	/**
+	 * 是否为标准的类<br>
+	 * 这个类必须:<br>
+	 * 1、非接口 2、非抽象类 3、非Enum枚举 4、非数组 5、非注解 6、非原始类型(int, long等)
+	 * 
+	 * @param clazz 类
+	 * @return 是否为标准类
+	 */
+	public static boolean isNormalClass(Class<?> clazz) {
+		return null != clazz && false == clazz.isInterface() && false == isAbstract(clazz) && false == clazz.isEnum() && false == clazz.isArray() && false == clazz.isAnnotation() && false == clazz
+				.isSynthetic() && false == clazz.isPrimitive();
+	}
+	
+	/**
+	 * 是否为抽象类
+	 * 
+	 * @param clazz 类
+	 * @return 是否为抽象类
+	 */
+	public static boolean isAbstract(Class<?> clazz) {
+		return Modifier.isAbstract(clazz.getModifiers());
+	}
+	
+	/**
+	 * 实例化对象
+	 * 
+	 * @param clazz 类名
+	 * @return 对象
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T newInstance(String clazz) {
+		if (null == clazz)
+			return null;
+		try {
+			return (T) Class.forName(clazz).newInstance();
+		} catch (Exception e) {
+			throw new ToolBoxException(StrKit.format("Instance class [{}] error!", clazz), e);
+		}
+	}
+
+	/**
+	 * 实例化对象
+	 * 
+	 * @param clazz 类
+	 * @return 对象
+	 */
+	public static <T> T newInstance(Class<T> clazz) {
+		if (null == clazz)
+			return null;
+		try {
+			return (T) clazz.newInstance();
+		} catch (Exception e) {
+			throw new ToolBoxException(StrKit.format("Instance class [{}] error!", clazz), e);
+		}
+	}
+
+	/**
+	 * 实例化对象
+	 * 
+	 * @param clazz 类
+	 * @return 对象
+	 */
+	public static <T> T newInstance(Class<T> clazz, Object... params) {
+		if (null == clazz)
+			return null;
+		if (CollectionKit.isEmpty(params)) {
+			return newInstance(clazz);
+		}
+		try {
+			return clazz.getDeclaredConstructor(getClasses(params)).newInstance(params);
+		} catch (Exception e) {
+			throw new ToolBoxException(StrKit.format("Instance class [{}] error!", clazz), e);
+		}
+	}
+	
+	/**
+	 * 获得对象数组的类数组
+	 * @param objects 对象数组
+	 * @return 类数组
+	 */
+	public static Class<?>[] getClasses(Object... objects){
+		Class<?>[] classes = new Class<?>[objects.length];
+		for (int i = 0; i < objects.length; i++) {
+			classes[i] = objects[i].getClass();
+		}
+		return classes;
+	}
+	
+	/**
+	 * 检查目标类是否可以从原类转化<br>
+	 * 转化包括:<br>
+	 * 1、原类是对象,目标类型是原类型实现的接口<br>
+	 * 2、目标类型是原类型的父类<br>
+	 * 3、两者是原始类型或者包装类型(相互转换)
+	 * 
+	 * @param targetType 目标类型
+	 * @param sourceType 原类型
+	 * @return 是否可转化
+	 */
+	public static boolean isAssignable(Class<?> targetType, Class<?> sourceType) {
+		if (null == targetType || null == sourceType) {
+			return false;
+		}
+
+		// 对象类型
+		if (targetType.isAssignableFrom(sourceType)) {
+			return true;
+		}
+
+		// 基本类型
+		if (targetType.isPrimitive()) {
+			// 原始类型
+			Class<?> resolvedPrimitive = BasicType.wrapperPrimitiveMap.get(sourceType);
+			if (resolvedPrimitive != null && targetType.equals(resolvedPrimitive)) {
+				return true;
+			}
+		} else {
+			// 包装类型
+			Class<?> resolvedWrapper = BasicType.primitiveWrapperMap.get(sourceType);
+			if (resolvedWrapper != null && targetType.isAssignableFrom(resolvedWrapper)) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	/**
+	 * 设置方法为可访问
+	 * 
+	 * @param method 方法
+	 * @return 方法
+	 */
+	public static Method setAccessible(Method method) {
+		if (null != method && ClassKit.isNotPublic(method)) {
+			method.setAccessible(true);
+		}
+		return method;
+	}
+	
+	/**
+	 * 指定类是否为非public
+	 * 
+	 * @param clazz 类
+	 * @return 是否为非public
+	 */
+	public static boolean isNotPublic(Class<?> clazz) {
+		return false == isPublic(clazz);
+	}
+
+	/**
+	 * 指定方法是否为非public
+	 * 
+	 * @param method 方法
+	 * @return 是否为非public
+	 */
+	public static boolean isNotPublic(Method method) {
+		return false == isPublic(method);
+	}
+	
+	/**
+	 * 指定类是否为Public
+	 * 
+	 * @param clazz 类
+	 * @return 是否为public
+	 */
+	public static boolean isPublic(Class<?> clazz) {
+		if (null == clazz) {
+			throw new NullPointerException("Class to provided is null.");
+		}
+		return Modifier.isPublic(clazz.getModifiers());
+	}
+	
+	/**
+	 * 指定方法是否为Public
+	 * 
+	 * @param method 方法
+	 * @return 是否为public
+	 */
+	public static boolean isPublic(Method method) {
+		if (null == method) {
+			throw new NullPointerException("Method to provided is null.");
+		}
+		return isPublic(method.getDeclaringClass());
+	}
+}
\ No newline at end of file
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/CollectionKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/CollectionKit.java
new file mode 100644
index 0000000..15063e4
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/CollectionKit.java
@@ -0,0 +1,801 @@
+package com.stylefeng.guns.core.support;
+
+
+import com.stylefeng.guns.core.support.exception.ToolBoxException;
+
+import java.lang.reflect.Array;
+import java.util.*;
+import java.util.Map.Entry;
+
+/**
+ * 集合相关工具类,包括数组
+ * 
+ * @author xiaoleilu
+ * 
+ */
+public class CollectionKit {
+	
+	private CollectionKit() {
+		// 静态类不可实例化
+	}
+	
+	/**
+	 * 以 conjunction 为分隔符将集合转换为字符串
+	 * 
+	 * @param <T> 被处理的集合
+	 * @param collection 集合
+	 * @param conjunction 分隔符
+	 * @return 连接后的字符串
+	 */
+	public static <T> String join(Iterable<T> collection, String conjunction) {
+		StringBuilder sb = new StringBuilder();
+		boolean isFirst = true;
+		for (T item : collection) {
+			if (isFirst) {
+				isFirst = false;
+			} else {
+				sb.append(conjunction);
+			}
+			sb.append(item);
+		}
+		return sb.toString();
+	}
+	
+	/**
+	 * 以 conjunction 为分隔符将数组转换为字符串
+	 * 
+	 * @param <T> 被处理的集合
+	 * @param array 数组
+	 * @param conjunction 分隔符
+	 * @return 连接后的字符串
+	 */
+	public static <T> String join(T[] array, String conjunction) {
+		StringBuilder sb = new StringBuilder();
+		boolean isFirst = true;
+		for (T item : array) {
+			if (isFirst) {
+				isFirst = false;
+			} else {
+				sb.append(conjunction);
+			}
+			sb.append(item);
+		}
+		return sb.toString();
+	}
+	
+	/**
+	 * 将多个集合排序并显示不同的段落(分页)
+	 * @param pageNo 页码
+	 * @param numPerPage 每页的条目数
+	 * @param comparator 比较器
+	 * @param colls 集合数组
+	 * @return 分页后的段落内容
+	 */
+	@SafeVarargs
+	public static <T> List<T> sortPageAll(int pageNo, int numPerPage, Comparator<T> comparator, Collection<T>... colls) {
+		final List<T> result = new ArrayList<T>();
+		for (Collection<T> coll : colls) {
+			result.addAll(coll);
+		}
+		
+		Collections.sort(result, comparator);
+		
+		//第一页且数目少于第一页显示的数目
+		if(pageNo <=1 && result.size() <= numPerPage) {
+			return result;
+		}
+		
+		final int[] startEnd = PageKit.transToStartEnd(pageNo, numPerPage);
+		return result.subList(startEnd[0], startEnd[1]);
+	}
+
+	/**
+	 * 将多个集合排序并显示不同的段落(分页)
+	 * @param pageNo 页码
+	 * @param numPerPage 每页的条目数
+	 * @param comparator 比较器
+	 * @param colls 集合数组
+	 * @return 分业后的段落内容
+	 */
+//	@SafeVarargs
+//	public static <T> List<T> sortPageAll2(int pageNo, int numPerPage, Comparator<T> comparator, Collection<T>... colls) {
+//		BoundedPriorityQueue<T> queue = new BoundedPriorityQueue<T>(pageNo * numPerPage);
+//		for (Collection<T> coll : colls) {
+//			queue.addAll(coll);
+//		}
+//
+//		//第一页且数目少于第一页显示的数目
+//		if(pageNo <=1 && queue.size() <= numPerPage) {
+//			return queue.toList();
+//		}
+//
+//		final int[] startEnd = PageKit.transToStartEnd(pageNo, numPerPage);
+//		return queue.toList().subList(startEnd[0], startEnd[1]);
+//	}
+
+	/**
+	 * 将Set排序(根据Entry的值)
+	 *
+	 * @param set 被排序的Set
+	 * @return 排序后的Set
+	 */
+	public static List<Entry<Long, Long>> sortEntrySetToList(Set<Entry<Long, Long>> set) {
+		List<Entry<Long, Long>> list = new LinkedList<Entry<Long, Long>>(set);
+		Collections.sort(list, new Comparator<Entry<Long, Long>>(){
+
+			@Override
+			public int compare(Entry<Long, Long> o1, Entry<Long, Long> o2) {
+				if (o1.getValue() > o2.getValue()){
+					return 1;
+				}
+				if (o1.getValue() < o2.getValue()){
+					return -1;
+				}
+				return 0;
+			}
+		});
+		return list;
+	}
+
+	/**
+	 * 切取部分数据
+	 *
+	 * @param <T> 集合元素类型
+	 * @param surplusAlaDatas 原数据
+	 * @param partSize 每部分数据的长度
+	 * @return 切取出的数据或null
+	 */
+	public static <T> List<T> popPart(Stack<T> surplusAlaDatas, int partSize) {
+		if (surplusAlaDatas == null || surplusAlaDatas.size() <= 0){
+			return null;
+		}
+
+		final List<T> currentAlaDatas = new ArrayList<T>();
+		int size = surplusAlaDatas.size();
+		// 切割
+		if (size > partSize) {
+			for (int i = 0; i < partSize; i++) {
+				currentAlaDatas.add(surplusAlaDatas.pop());
+			}
+		} else {
+			for (int i = 0; i < size; i++) {
+				currentAlaDatas.add(surplusAlaDatas.pop());
+			}
+		}
+		return currentAlaDatas;
+	}
+
+	/**
+	 * 切取部分数据
+	 *
+	 * @param <T> 集合元素类型
+	 * @param surplusAlaDatas 原数据
+	 * @param partSize 每部分数据的长度
+	 * @return 切取出的数据或null
+	 */
+	public static <T> List<T> popPart(Deque<T> surplusAlaDatas, int partSize) {
+		if (surplusAlaDatas == null || surplusAlaDatas.size() <= 0){
+			return null;
+		}
+
+		final List<T> currentAlaDatas = new ArrayList<T>();
+		int size = surplusAlaDatas.size();
+		// 切割
+		if (size > partSize) {
+			for (int i = 0; i < partSize; i++) {
+				currentAlaDatas.add(surplusAlaDatas.pop());
+			}
+		} else {
+			for (int i = 0; i < size; i++) {
+				currentAlaDatas.add(surplusAlaDatas.pop());
+			}
+		}
+		return currentAlaDatas;
+	}
+
+	/**
+	 * 新建一个HashMap
+	 *
+	 * @return HashMap对象
+	 */
+	public static <T, K> HashMap<T, K> newHashMap() {
+		return new HashMap<T, K>();
+	}
+
+	/**
+	 * 新建一个HashMap
+	 * @param size 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75
+	 * @return HashMap对象
+	 */
+	public static <T, K> HashMap<T, K> newHashMap(int size) {
+		return new HashMap<T, K>((int)(size / 0.75));
+	}
+
+	/**
+	 * 新建一个HashSet
+	 *
+	 * @return HashSet对象
+	 */
+	public static <T> HashSet<T> newHashSet() {
+		return new HashSet<T>();
+	}
+
+	/**
+	 * 新建一个HashSet
+	 *
+	 * @return HashSet对象
+	 */
+	@SafeVarargs
+	public static <T> HashSet<T> newHashSet(T... ts) {
+		HashSet<T> set = new HashSet<T>();
+		for (T t : ts) {
+			set.add(t);
+		}
+		return set;
+	}
+
+	/**
+	 * 新建一个ArrayList
+	 *
+	 * @return ArrayList对象
+	 */
+	public static <T> ArrayList<T> newArrayList() {
+		return new ArrayList<T>();
+	}
+
+	/**
+	 * 新建一个ArrayList
+	 *
+	 * @return ArrayList对象
+	 */
+	@SafeVarargs
+	public static <T> ArrayList<T> newArrayList(T... values) {
+		return new ArrayList<T>(Arrays.asList(values));
+	}
+
+	/**
+	 * 将新元素添加到已有数组中<br/>
+	 * 添加新元素会生成一个新的数组,不影响原数组
+	 *
+	 * @param buffer 已有数组
+	 * @param newElement 新元素
+	 * @return 新数组
+	 */
+	public static <T> T[] append(T[] buffer, T newElement) {
+		T[] t = resize(buffer, buffer.length + 1, newElement.getClass());
+		t[buffer.length] = newElement;
+		return t;
+	}
+
+	/**
+	 * 生成一个新的重新设置大小的数组
+	 *
+	 * @param buffer 原数组
+	 * @param newSize 新的数组大小
+	 * @param componentType 数组元素类型
+	 * @return 调整后的新数组
+	 */
+	public static <T> T[] resize(T[] buffer, int newSize, Class<?> componentType) {
+		T[] newArray = newArray(componentType, newSize);
+		System.arraycopy(buffer, 0, newArray, 0, buffer.length >= newSize ? newSize : buffer.length);
+		return newArray;
+	}
+
+	/**
+	 * 新建一个空数组
+	 * @param componentType 元素类型
+	 * @param newSize 大小
+	 * @return 空数组
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T[] newArray(Class<?> componentType, int newSize) {
+		return (T[]) Array.newInstance(componentType, newSize);
+	}
+
+	/**
+	 * 生成一个新的重新设置大小的数组<br/>
+	 * 新数组的类型为原数组的类型
+	 *
+	 * @param buffer 原数组
+	 * @param newSize 新的数组大小
+	 * @return 调整后的新数组
+	 */
+	public static <T> T[] resize(T[] buffer, int newSize) {
+		return resize(buffer, newSize, buffer.getClass().getComponentType());
+	}
+
+	/**
+	 * 将多个数组合并在一起<br>
+	 * 忽略null的数组
+	 *
+	 * @param arrays 数组集合
+	 * @return 合并后的数组
+	 */
+	@SafeVarargs
+	public static <T> T[] addAll(T[]... arrays) {
+		if (arrays.length == 1) {
+			return arrays[0];
+		}
+
+		int length = 0;
+		for (T[] array : arrays) {
+			if(array == null) {
+				continue;
+			}
+			length += array.length;
+		}
+		T[] result = newArray(arrays.getClass().getComponentType().getComponentType(), length);
+
+		length = 0;
+		for (T[] array : arrays) {
+			if(array == null) {
+				continue;
+			}
+			System.arraycopy(array, 0, result, length, array.length);
+			length += array.length;
+		}
+		return result;
+	}
+
+	/**
+	 * 克隆数组
+	 * @param array 被克隆的数组
+	 * @return 新数组
+	 */
+	public static <T> T[] clone(T[] array) {
+		if (array == null) {
+			return null;
+		}
+		return array.clone();
+	}
+
+	/**
+	 * 生成一个数字列表<br>
+	 * 自动判定正序反序
+	 * @param excludedEnd 结束的数字(不包含)
+	 * @return 数字列表
+	 */
+	public static int[] range(int excludedEnd) {
+		return range(0, excludedEnd, 1);
+	}
+
+	/**
+	 * 生成一个数字列表<br>
+	 * 自动判定正序反序
+	 * @param includedStart 开始的数字(包含)
+	 * @param excludedEnd 结束的数字(不包含)
+	 * @return 数字列表
+	 */
+	public static int[] range(int includedStart, int excludedEnd) {
+		return range(includedStart, excludedEnd, 1);
+	}
+
+	/**
+	 * 生成一个数字列表<br>
+	 * 自动判定正序反序
+	 * @param includedStart 开始的数字(包含)
+	 * @param excludedEnd 结束的数字(不包含)
+	 * @param step 步进
+	 * @return 数字列表
+	 */
+	public static int[] range(int includedStart, int excludedEnd, int step) {
+		if(includedStart > excludedEnd) {
+			int tmp = includedStart;
+			includedStart = excludedEnd;
+			excludedEnd = tmp;
+		}
+
+		if(step <=0) {
+			step = 1;
+		}
+
+		int deviation = excludedEnd - includedStart;
+		int length = deviation / step;
+		if(deviation % step != 0) {
+			length += 1;
+		}
+		int[] range = new int[length];
+		for(int i = 0; i < length; i++) {
+			range[i] = includedStart;
+			includedStart += step;
+		}
+		return range;
+	}
+
+	/**
+	 * 截取数组的部分
+	 * @param list 被截取的数组
+	 * @param start 开始位置(包含)
+	 * @param end 结束位置(不包含)
+	 * @return 截取后的数组,当开始位置超过最大时,返回null
+	 */
+	public static <T> List<T> sub(List<T> list, int start, int end) {
+		if(list == null || list.isEmpty()) {
+			return null;
+		}
+
+		if(start < 0) {
+			start = 0;
+		}
+		if(end < 0) {
+			end = 0;
+		}
+
+		if(start > end) {
+			int tmp = start;
+			start = end;
+			end = tmp;
+		}
+
+		final int size = list.size();
+		if(end > size) {
+			if(start >= size) {
+				return null;
+			}
+			end = size;
+		}
+
+		return list.subList(start, end);
+	}
+
+	/**
+	 * 截取集合的部分
+	 * @param list 被截取的数组
+	 * @param start 开始位置(包含)
+	 * @param end 结束位置(不包含)
+	 * @return 截取后的数组,当开始位置超过最大时,返回null
+	 */
+	public static <T> List<T> sub(Collection<T> list, int start, int end) {
+		if(list == null || list.isEmpty()) {
+			return null;
+		}
+
+		return sub(new ArrayList<T>(list), start, end);
+	}
+
+	/**
+	 * 数组是否为空
+	 * @param array 数组
+	 * @return 是否为空
+	 */
+	public static <T> boolean isEmpty(T[] array) {
+		return array == null || array.length == 0;
+	}
+
+	/**
+	 * 数组是否为非空
+	 * @param array 数组
+	 * @return 是否为非空
+	 */
+	public static <T> boolean isNotEmpty(T[] array) {
+		return false == isEmpty(array);
+	}
+
+	/**
+	 * 集合是否为空
+	 * @param collection 集合
+	 * @return 是否为空
+	 */
+	public static boolean isEmpty(Collection<?> collection) {
+		return collection == null || collection.isEmpty();
+	}
+
+	/**
+	 * 集合是否为非空
+	 * @param collection 集合
+	 * @return 是否为非空
+	 */
+	public static boolean isNotEmpty(Collection<?> collection) {
+		return false == isEmpty(collection);
+	}
+
+	/**
+	 * Map是否为空
+	 * @param map 集合
+	 * @return 是否为空
+	 */
+	public static boolean isEmpty(Map<?, ?> map) {
+		return map == null || map.isEmpty();
+	}
+
+	/**
+	 * Map是否为非空
+	 * @param map 集合
+	 * @return 是否为非空
+	 */
+	public static <T> boolean isNotEmpty(Map<?, ?> map) {
+		return false == isEmpty(map);
+	}
+
+	/**
+	 * 映射键值(参考Python的zip()函数)<br>
+	 * 例如:<br>
+	 * 		keys =    [a,b,c,d]<br>
+	 *		values = [1,2,3,4]<br>
+	 * 则得到的Map是 {a=1, b=2, c=3, d=4}<br>
+	 * 如果两个数组长度不同,则只对应最短部分
+	 * @param keys 键列表
+	 * @param values 值列表
+	 * @return Map
+	 */
+	public static <T, K> Map<T, K> zip(T[] keys, K[] values) {
+		if(isEmpty(keys) || isEmpty(values)) {
+			return null;
+		}
+
+		final int size = Math.min(keys.length, values.length);
+		final Map<T, K> map = new HashMap<T, K>((int)(size / 0.75));
+		for(int i = 0; i < size; i++) {
+			map.put(keys[i], values[i]);
+		}
+
+		return map;
+	}
+
+	/**
+	 * 映射键值(参考Python的zip()函数)<br>
+	 * 例如:<br>
+	 * 		keys =    a,b,c,d<br>
+	 *		values = 1,2,3,4<br>
+	 *		delimiter = ,
+	 * 则得到的Map是 {a=1, b=2, c=3, d=4}<br>
+	 * 如果两个数组长度不同,则只对应最短部分
+	 * @param keys 键列表
+	 * @param values 值列表
+	 * @return Map
+	 */
+	public static Map<String, String> zip(String keys, String values, String delimiter) {
+		return zip(StrKit.split(keys, delimiter), StrKit.split(values, delimiter));
+	}
+	
+	/**
+	 * 映射键值(参考Python的zip()函数)<br>
+	 * 例如:<br>
+	 * 		keys =    [a,b,c,d]<br>
+	 *		values = [1,2,3,4]<br>
+	 * 则得到的Map是 {a=1, b=2, c=3, d=4}<br>
+	 * 如果两个数组长度不同,则只对应最短部分
+	 * @param keys 键列表
+	 * @param values 值列表
+	 * @return Map
+	 */
+	public static <T, K> Map<T, K> zip(Collection<T> keys, Collection<K> values) {
+		if(isEmpty(keys) || isEmpty(values)) {
+			return null;
+		}
+		
+		final List<T> keyList = new ArrayList<T>(keys);
+		final List<K> valueList = new ArrayList<K>(values);
+		
+		final int size = Math.min(keys.size(), values.size());
+		final Map<T, K> map = new HashMap<T, K>((int)(size / 0.75));
+		for(int i = 0; i < size; i++) {
+			map.put(keyList.get(i), valueList.get(i));
+		}
+		
+		return map;
+	}
+	
+	/**
+	 * 数组中是否包含元素
+	 * @param array 数组
+	 * @param value 被检查的元素
+	 * @return 是否包含
+	 */
+	public static <T> boolean contains(T[] array, T value) {
+		final Class<?> componetType = array.getClass().getComponentType();
+		boolean isPrimitive = false;
+		if(null != componetType) {
+			isPrimitive = componetType.isPrimitive();
+		}
+		for (T t : array) {
+			if(t == value) {
+				return true;
+			}else if(false == isPrimitive && null != value && value.equals(t)) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	/**
+	 * 将Entry集合转换为HashMap
+	 * @param entryCollection entry集合
+	 * @return Map
+	 */
+	public static <T, K> HashMap<T, K> toMap(Collection<Entry<T, K>> entryCollection) {
+		HashMap<T,K> map = new HashMap<T, K>();
+		for (Entry<T, K> entry : entryCollection) {
+			map.put(entry.getKey(), entry.getValue());
+		}
+		return map;
+	}
+	
+	/**
+	 * 将集合转换为排序后的TreeSet
+	 * @param collection 集合
+	 * @param comparator 比较器
+	 * @return treeSet
+	 */
+	public static <T> TreeSet<T> toTreeSet(Collection<T> collection, Comparator<T> comparator){
+		final TreeSet<T> treeSet = new TreeSet<T>(comparator);
+		for (T t : collection) {
+			treeSet.add(t);
+		}
+		return treeSet;
+	}
+	
+	/**
+	 * 排序集合
+	 * @param collection 集合
+	 * @param comparator 比较器
+	 * @return treeSet
+	 */
+	public static <T> List<T> sort(Collection<T> collection, Comparator<T> comparator){
+		List<T> list = new ArrayList<T>(collection);
+		Collections.sort(list, comparator);
+		return list;
+	}
+	
+	//------------------------------------------------------------------- 基本类型的数组转换为包装类型数组
+	/**
+	 * 将基本类型数组包装为包装类型
+	 * @param values 基本类型数组
+	 * @return 包装类型数组
+	 */
+	public static Integer[] wrap(int... values){
+		final int length = values.length;
+		Integer[] array = new Integer[length];
+		for(int i = 0; i < length; i++){
+			array[i] = values[i];
+		}
+		return array;
+	}
+	
+	/**
+	 * 将基本类型数组包装为包装类型
+	 * @param values 基本类型数组
+	 * @return 包装类型数组
+	 */
+	public static Long[] wrap(long... values){
+		final int length = values.length;
+		Long[] array = new Long[length];
+		for(int i = 0; i < length; i++){
+			array[i] = values[i];
+		}
+		return array;
+	}
+	
+	/**
+	 * 将基本类型数组包装为包装类型
+	 * @param values 基本类型数组
+	 * @return 包装类型数组
+	 */
+	public static Character[] wrap(char... values){
+		final int length = values.length;
+		Character[] array = new Character[length];
+		for(int i = 0; i < length; i++){
+			array[i] = values[i];
+		}
+		return array;
+	}
+	
+	/**
+	 * 将基本类型数组包装为包装类型
+	 * @param values 基本类型数组
+	 * @return 包装类型数组
+	 */
+	public static Byte[] wrap(byte... values){
+		final int length = values.length;
+		Byte[] array = new Byte[length];
+		for(int i = 0; i < length; i++){
+			array[i] = values[i];
+		}
+		return array;
+	}
+	
+	/**
+	 * 将基本类型数组包装为包装类型
+	 * @param values 基本类型数组
+	 * @return 包装类型数组
+	 */
+	public static Short[] wrap(short... values){
+		final int length = values.length;
+		Short[] array = new Short[length];
+		for(int i = 0; i < length; i++){
+			array[i] = values[i];
+		}
+		return array;
+	}
+	
+	/**
+	 * 将基本类型数组包装为包装类型
+	 * @param values 基本类型数组
+	 * @return 包装类型数组
+	 */
+	public static Float[] wrap(float... values){
+		final int length = values.length;
+		Float[] array = new Float[length];
+		for(int i = 0; i < length; i++){
+			array[i] = values[i];
+		}
+		return array;
+	}
+	
+	/**
+	 * 将基本类型数组包装为包装类型
+	 * @param values 基本类型数组
+	 * @return 包装类型数组
+	 */
+	public static Double[] wrap(double... values){
+		final int length = values.length;
+		Double[] array = new Double[length];
+		for(int i = 0; i < length; i++){
+			array[i] = values[i];
+		}
+		return array;
+	}
+	
+	/**
+	 * 将基本类型数组包装为包装类型
+	 * @param values 基本类型数组
+	 * @return 包装类型数组
+	 */
+	public static Boolean[] wrap(boolean... values){
+		final int length = values.length;
+		Boolean[] array = new Boolean[length];
+		for(int i = 0; i < length; i++){
+			array[i] = values[i];
+		}
+		return array;
+	}
+	
+	/**
+	 * 判定给定对象是否为数组类型
+	 * @param obj 对象
+	 * @return 是否为数组类型
+	 */
+	public static boolean isArray(Object obj){
+		return obj.getClass().isArray();
+	}
+	
+	/**
+	 * 数组或集合转String
+	 * 
+	 * @param obj 集合或数组对象
+	 * @return 数组字符串,与集合转字符串格式相同
+	 */
+	public static String toString(Object obj) {
+		if (null == obj) {
+			return null;
+		}
+		if (isArray(obj)) {
+			try {
+				return Arrays.deepToString((Object[]) obj);
+			} catch (Exception e) {
+				final String className = obj.getClass().getComponentType().getName();
+				switch (className) {
+					case "long":
+						return Arrays.toString((long[]) obj);
+					case "int":
+						return Arrays.toString((int[]) obj);
+					case "short":
+						return Arrays.toString((short[]) obj);
+					case "char":
+						return Arrays.toString((char[]) obj);
+					case "byte":
+						return Arrays.toString((byte[]) obj);
+					case "boolean":
+						return Arrays.toString((boolean[]) obj);
+					case "float":
+						return Arrays.toString((float[]) obj);
+					case "double":
+						return Arrays.toString((double[]) obj);
+					default:
+						throw new ToolBoxException(e);
+				}
+			}
+		}
+		return obj.toString();
+	}
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/DateTime.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/DateTime.java
new file mode 100644
index 0000000..e055458
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/DateTime.java
@@ -0,0 +1,67 @@
+package com.stylefeng.guns.core.support;
+
+import java.util.Date;
+
+/**
+ * 封装java.util.Date
+ * @author xiaoleilu
+ *
+ */
+public class DateTime extends Date{
+	private static final long serialVersionUID = -5395712593979185936L;
+	
+	/**
+	 * 转换JDK date为 DateTime
+	 * @param date JDK Date
+	 * @return DateTime
+	 */
+	public static DateTime parse(Date date) {
+		return new DateTime(date);
+	}
+	
+	/**
+	 * 当前时间
+	 */
+	public DateTime() {
+		super();
+	}
+	
+	/**
+	 * 给定日期的构造
+	 * @param date 日期
+	 */
+	public DateTime(Date date) {
+		this(date.getTime());
+	}
+	
+	/**
+	 * 给定日期毫秒数的构造
+	 * @param timeMillis 日期毫秒数
+	 */
+	public DateTime(long timeMillis) {
+		super(timeMillis);
+	}
+	
+	@Override
+	public String toString() {
+		return DateTimeKit.formatDateTime(this);
+	}
+	
+	public String toString(String format) {
+		return DateTimeKit.format(this, format);
+	}
+	
+	/**
+	 * @return 输出精确到毫秒的标准日期形式
+	 */
+	public String toMsStr() {
+		return DateTimeKit.format(this, DateTimeKit.NORM_DATETIME_MS_PATTERN);
+	}
+	
+	/**   
+	 * @return java.util.Date
+	*/
+	public Date toDate() {
+		return new Date(this.getTime());
+	}
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/DateTimeKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/DateTimeKit.java
new file mode 100644
index 0000000..0edfc9c
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/DateTimeKit.java
@@ -0,0 +1,665 @@
+package com.stylefeng.guns.core.support;
+
+import com.stylefeng.guns.core.support.exception.ToolBoxException;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.Locale;
+
+/**
+ * 时间工具类
+ * @author xiaoleilu
+ */
+public class DateTimeKit {
+	/** 毫秒 */
+	public final static long MS = 1;
+	/** 每秒钟的毫秒数 */
+	public final static long SECOND_MS = MS * 1000;
+	/** 每分钟的毫秒数 */
+	public final static long MINUTE_MS = SECOND_MS * 60;
+	/** 每小时的毫秒数 */
+	public final static long HOUR_MS = MINUTE_MS * 60;
+	/** 每天的毫秒数 */
+	public final static long DAY_MS = HOUR_MS * 24;
+
+	/** 标准日期格式 */
+	public final static String NORM_DATE_PATTERN = "yyyy-MM-dd";
+	/** 标准时间格式 */
+	public final static String NORM_TIME_PATTERN = "HH:mm:ss";
+	/** 标准日期时间格式,精确到分 */
+	public final static String NORM_DATETIME_MINUTE_PATTERN = "yyyy-MM-dd HH:mm";
+	/** 标准日期时间格式,精确到秒 */
+	public final static String NORM_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+	/** 标准日期时间格式,精确到毫秒 */
+	public final static String NORM_DATETIME_MS_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
+	/** HTTP头中日期时间格式 */
+	public final static String HTTP_DATETIME_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z";
+
+	/** 标准日期(不含时间)格式化器 */
+	// private final static SimpleDateFormat NORM_DATE_FORMAT = new SimpleDateFormat(NORM_DATE_PATTERN);
+	private static ThreadLocal<SimpleDateFormat> NORM_DATE_FORMAT = new ThreadLocal<SimpleDateFormat>(){
+		synchronized protected SimpleDateFormat initialValue() {
+			return new SimpleDateFormat(NORM_DATE_PATTERN);
+		};
+	};
+	/** 标准时间格式化器 */
+	// private final static SimpleDateFormat NORM_TIME_FORMAT = new SimpleDateFormat(NORM_TIME_PATTERN);
+	private static ThreadLocal<SimpleDateFormat> NORM_TIME_FORMAT = new ThreadLocal<SimpleDateFormat>(){
+		synchronized protected SimpleDateFormat initialValue() {
+			return new SimpleDateFormat(NORM_TIME_PATTERN);
+		};
+	};
+	/** 标准日期时间格式化器 */
+	// private final static SimpleDateFormat NORM_DATETIME_FORMAT = new SimpleDateFormat(NORM_DATETIME_PATTERN);
+	private static ThreadLocal<SimpleDateFormat> NORM_DATETIME_FORMAT = new ThreadLocal<SimpleDateFormat>(){
+		synchronized protected SimpleDateFormat initialValue() {
+			return new SimpleDateFormat(NORM_DATETIME_PATTERN);
+		};
+	};
+	/** HTTP日期时间格式化器 */
+	// private final static SimpleDateFormat HTTP_DATETIME_FORMAT = new SimpleDateFormat(HTTP_DATETIME_PATTERN, Locale.US);
+	private static ThreadLocal<SimpleDateFormat> HTTP_DATETIME_FORMAT = new ThreadLocal<SimpleDateFormat>(){
+		synchronized protected SimpleDateFormat initialValue() {
+			return new SimpleDateFormat(HTTP_DATETIME_PATTERN, Locale.US);
+		};
+	};
+
+	/**
+	 * 当前时间,格式 yyyy-MM-dd HH:mm:ss
+	 * 
+	 * @return 当前时间的标准形式字符串
+	 */
+	public static String now() {
+		return formatDateTime(new DateTime());
+	}
+
+	/**
+	 * 当前时间long
+	 *
+	 * @param isNano 是否为高精度时间
+	 * @return 时间
+	 */
+	public static long current(boolean isNano) {
+		return isNano ? System.nanoTime() : System.currentTimeMillis();
+	}
+
+	/**
+	 * 当前日期,格式 yyyy-MM-dd
+	 *
+	 * @return 当前日期的标准形式字符串
+	 */
+	public static String today() {
+		return formatDate(new DateTime());
+	}
+
+	/**
+	 * @return 当前月份
+	 */
+	public static int thisMonth() {
+		return month(date());
+	}
+
+	/**
+	 * @return 今年
+	 */
+	public static int thisYear() {
+		return year(date());
+	}
+
+	/**
+	 * @return 当前时间
+	 */
+	public static DateTime date() {
+		return new DateTime();
+	}
+
+	/**
+	 * Long类型时间转为Date
+	 *
+	 * @param date Long类型Date(Unix时间戳)
+	 * @return 时间对象
+	 */
+	public static DateTime date(long date) {
+		return new DateTime(date);
+	}
+
+	/**
+	 * 转换为Calendar对象
+	 *
+	 * @param date 日期对象
+	 * @return Calendar对象
+	 */
+	public static Calendar toCalendar(Date date) {
+		final Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		return cal;
+	}
+
+	/**
+	 * 获得月份,从1月开始计数
+	 *
+	 * @param date 日期
+	 * @return 月份
+	 */
+	public static int month(Date date) {
+		return toCalendar(date).get(Calendar.MONTH) + 1;
+	}
+
+	/**
+	 * 获得年
+	 *
+	 * @param date 日期
+	 * @return 年
+	 */
+	public static int year(Date date) {
+		return toCalendar(date).get(Calendar.YEAR);
+	}
+
+	/**
+	 * 获得季节
+	 *
+	 * @param date 日期
+	 * @return 第几个季节
+	 */
+	public static int season(Date date) {
+		return toCalendar(date).get(Calendar.MONTH) / 3 + 1;
+	}
+
+	/**
+	 * 获得指定日期年份和季节<br>
+	 * 格式:[20131]表示2013年第一季度
+	 *
+	 * @param date 日期
+	 * @return Season ,类似于 20132
+	 */
+	public static String yearAndSeason(Date date) {
+		return yearAndSeason(toCalendar(date));
+	}
+
+	/**
+	 * 获得指定日期区间内的年份和季节<br>
+	 *
+	 * @param startDate 其实日期(包含)
+	 * @param endDate 结束日期(包含)
+	 * @return Season列表 ,元素类似于 20132
+	 */
+	public static LinkedHashSet<String> yearAndSeasons(Date startDate, Date endDate) {
+		final LinkedHashSet<String> seasons = new LinkedHashSet<String>();
+		if (startDate == null || endDate == null) {
+			return seasons;
+		}
+
+		final Calendar cal = Calendar.getInstance();
+		cal.setTime(startDate);
+		while (true) {
+			// 如果开始时间超出结束时间,让结束时间为开始时间,处理完后结束循环
+			if (startDate.after(endDate)) {
+				startDate = endDate;
+			}
+
+			seasons.add(yearAndSeason(cal));
+
+			if (startDate.equals(endDate)) {
+				break;
+			}
+
+			cal.add(Calendar.MONTH, 3);
+			startDate = cal.getTime();
+		}
+
+		return seasons;
+	}
+
+	// ------------------------------------ Format start ----------------------------------------------
+	/**
+	 * 根据特定格式格式化日期
+	 *
+	 * @param date 被格式化的日期
+	 * @param format 格式
+	 * @return 格式化后的字符串
+	 */
+	public static String format(Date date, String format) {
+		return new SimpleDateFormat(format).format(date);
+	}
+
+	/**
+	 * 格式 yyyy-MM-dd HH:mm:ss
+	 *
+	 * @param date 被格式化的日期
+	 * @return 格式化后的日期
+	 */
+	public static String formatDateTime(Date date) {
+		if(null == date){
+			return null;
+		}
+		return NORM_DATETIME_FORMAT.get().format(date);
+	}
+
+	/**
+	 * 格式 yyyy-MM-dd
+	 *
+	 * @param date 被格式化的日期
+	 * @return 格式化后的字符串
+	 */
+	public static String formatDate(Date date) {
+		if(null == date){
+			return null;
+		}
+		return NORM_DATE_FORMAT.get().format(date);
+	}
+
+	/**
+	 * 格式化为Http的标准日期格式
+	 *
+	 * @param date 被格式化的日期
+	 * @return HTTP标准形式日期字符串
+	 */
+	public static String formatHttpDate(Date date) {
+		if(null == date){
+			return null;
+		}
+		return HTTP_DATETIME_FORMAT.get().format(date);
+	}
+	// ------------------------------------ Format end ----------------------------------------------
+
+	// ------------------------------------ Parse start ----------------------------------------------
+
+	/**
+	 * 构建DateTime对象
+	 *
+	 * @param dateStr Date字符串
+	 * @param simpleDateFormat 格式化器
+	 * @return DateTime对象
+	 */
+	public static DateTime parse(String dateStr, SimpleDateFormat simpleDateFormat) {
+		try {
+			return new DateTime(simpleDateFormat.parse(dateStr));
+		} catch (Exception e) {
+			throw new ToolBoxException(StrKit.format("Parse [{}] with format [{}] error!", dateStr, simpleDateFormat.toPattern()), e);
+		}
+	}
+
+	/**
+	 * 将特定格式的日期转换为Date对象
+	 *
+	 * @param dateString 特定格式的日期
+	 * @param format 格式,例如yyyy-MM-dd
+	 * @return 日期对象
+	 */
+	public static DateTime parse(String dateString, String format) {
+		return parse(dateString, new SimpleDateFormat(format));
+	}
+
+	/**
+	 * 格式yyyy-MM-dd HH:mm:ss
+	 *
+	 * @param dateString 标准形式的时间字符串
+	 * @return 日期对象
+	 */
+	public static DateTime parseDateTime(String dateString) {
+		return parse(dateString, NORM_DATETIME_FORMAT.get());
+	}
+
+	/**
+	 * 格式yyyy-MM-dd
+	 *
+	 * @param dateString 标准形式的日期字符串
+	 * @return 日期对象
+	 */
+	public static DateTime parseDate(String dateString) {
+		return parse(dateString, NORM_DATE_FORMAT.get());
+	}
+
+	/**
+	 * 格式HH:mm:ss
+	 *
+	 * @param timeString 标准形式的日期字符串
+	 * @return 日期对象
+	 */
+	public static DateTime parseTime(String timeString) {
+		return parse(timeString, NORM_TIME_FORMAT.get());
+	}
+
+	/**
+	 * 格式:<br>
+	 * 1、yyyy-MM-dd HH:mm:ss<br>
+	 * 2、yyyy-MM-dd<br>
+	 * 3、HH:mm:ss<br>
+	 * 4、yyyy-MM-dd HH:mm 5、yyyy-MM-dd HH:mm:ss.SSS
+	 *
+	 * @param dateStr 日期字符串
+	 * @return 日期
+	 */
+	public static DateTime parse(String dateStr) {
+		if (null == dateStr) {
+			return null;
+		}
+		dateStr = dateStr.trim();
+		int length = dateStr.length();
+		try {
+			if (length == NORM_DATETIME_PATTERN.length()) {
+				return parseDateTime(dateStr);
+			} else if (length == NORM_DATE_PATTERN.length()) {
+				return parseDate(dateStr);
+			} else if (length == NORM_TIME_PATTERN.length()) {
+				return parseTime(dateStr);
+			} else if (length == NORM_DATETIME_MINUTE_PATTERN.length()) {
+				return parse(dateStr, NORM_DATETIME_MINUTE_PATTERN);
+			} else if (length >= NORM_DATETIME_MS_PATTERN.length() - 2) {
+				return parse(dateStr, NORM_DATETIME_MS_PATTERN);
+			}
+		} catch (Exception e) {
+			throw new ToolBoxException(StrKit.format("Parse [{}] with format normal error!", dateStr));
+		}
+
+		// 没有更多匹配的时间格式
+		throw new ToolBoxException(StrKit.format(" [{}] format is not fit for date pattern!", dateStr));
+	}
+	// ------------------------------------ Parse end ----------------------------------------------
+
+	// ------------------------------------ Offset start ----------------------------------------------
+	/**
+	 * 获取某天的开始时间
+	 *
+	 * @param date 日期
+	 * @return 某天的开始时间
+	 */
+	public static DateTime getBeginTimeOfDay(Date date) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.set(Calendar.HOUR_OF_DAY, 0);
+		calendar.set(Calendar.MINUTE, 0);
+		calendar.set(Calendar.SECOND, 0);
+		calendar.set(Calendar.MILLISECOND, 0);
+		return new DateTime(calendar.getTime());
+	}
+
+	/**
+	 * 获取某天的结束时间
+	 *
+	 * @param date 日期
+	 * @return 某天的结束时间
+	 */
+	public static DateTime getEndTimeOfDay(Date date) {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(date);
+		calendar.set(Calendar.HOUR_OF_DAY, 23);
+		calendar.set(Calendar.MINUTE, 59);
+		calendar.set(Calendar.SECOND, 59);
+		calendar.set(Calendar.MILLISECOND, 999);
+		return new DateTime(calendar.getTime());
+	}
+
+	/**
+	 * 昨天
+	 *
+	 * @return 昨天
+	 */
+	public static DateTime yesterday() {
+		return offsiteDay(new DateTime(), -1);
+	}
+
+	/**
+	 * 上周
+	 *
+	 * @return 上周
+	 */
+	public static DateTime lastWeek() {
+		return offsiteWeek(new DateTime(), -1);
+	}
+
+	/**
+	 * 上个月
+	 *
+	 * @return 上个月
+	 */
+	public static DateTime lastMouth() {
+		return offsiteMonth(new DateTime(), -1);
+	}
+
+	/**
+	 * 偏移天
+	 *
+	 * @param date 日期
+	 * @param offsite 偏移天数,正数向未来偏移,负数向历史偏移
+	 * @return 偏移后的日期
+	 */
+	public static DateTime offsiteDay(Date date, int offsite) {
+		return offsiteDate(date, Calendar.DAY_OF_YEAR, offsite);
+	}
+
+	/**
+	 * 偏移周
+	 *
+	 * @param date 日期
+	 * @param offsite 偏移周数,正数向未来偏移,负数向历史偏移
+	 * @return 偏移后的日期
+	 */
+	public static DateTime offsiteWeek(Date date, int offsite) {
+		return offsiteDate(date, Calendar.WEEK_OF_YEAR, offsite);
+	}
+
+	/**
+	 * 偏移月
+	 *
+	 * @param date 日期
+	 * @param offsite 偏移月数,正数向未来偏移,负数向历史偏移
+	 * @return 偏移后的日期
+	 */
+	public static DateTime offsiteMonth(Date date, int offsite) {
+		return offsiteDate(date, Calendar.MONTH, offsite);
+	}
+
+	/**
+	 * 获取指定日期偏移指定时间后的时间
+	 *
+	 * @param date 基准日期
+	 * @param calendarField 偏移的粒度大小(小时、天、月等)使用Calendar中的常数
+	 * @param offsite 偏移量,正数为向后偏移,负数为向前偏移
+	 * @return 偏移后的日期
+	 */
+	public static DateTime offsiteDate(Date date, int calendarField, int offsite) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		cal.add(calendarField, offsite);
+		return new DateTime(cal.getTime());
+	}
+	// ------------------------------------ Offset end ----------------------------------------------
+
+	/**
+	 * 判断两个日期相差的时长<br/>
+	 * 返回 minuend - subtrahend 的差
+	 * 
+	 * @param subtrahend 减数日期
+	 * @param minuend 被减数日期
+	 * @param diffField 相差的选项:相差的天、小时
+	 * @return 日期差
+	 */
+	public static long diff(Date subtrahend, Date minuend, long diffField) {
+		long diff = minuend.getTime() - subtrahend.getTime();
+		return diff / diffField;
+	}
+
+	/**
+	 * 计时,常用于记录某段代码的执行时间,单位:纳秒
+	 * 
+	 * @param preTime 之前记录的时间
+	 * @return 时间差,纳秒
+	 */
+	public static long spendNt(long preTime) {
+		return System.nanoTime() - preTime;
+	}
+
+	/**
+	 * 计时,常用于记录某段代码的执行时间,单位:毫秒
+	 * 
+	 * @param preTime 之前记录的时间
+	 * @return 时间差,毫秒
+	 */
+	public static long spendMs(long preTime) {
+		return System.currentTimeMillis() - preTime;
+	}
+
+	/**
+	 * 格式化成yyMMddHHmm后转换为int型
+	 * 
+	 * @param date 日期
+	 * @return int
+	 */
+	public static int toIntSecond(Date date) {
+		return Integer.parseInt(format(date, "yyMMddHHmm"));
+	}
+
+	/**
+	 * 计算指定指定时间区间内的周数
+	 * 
+	 * @param start 开始时间
+	 * @param end 结束时间
+	 * @return 周数
+	 */
+	public static int weekCount(Date start, Date end) {
+		final Calendar startCalendar = Calendar.getInstance();
+		startCalendar.setTime(start);
+		final Calendar endCalendar = Calendar.getInstance();
+		endCalendar.setTime(end);
+
+		final int startWeekofYear = startCalendar.get(Calendar.WEEK_OF_YEAR);
+		final int endWeekofYear = endCalendar.get(Calendar.WEEK_OF_YEAR);
+
+		int count = endWeekofYear - startWeekofYear + 1;
+
+		if (Calendar.SUNDAY != startCalendar.get(Calendar.DAY_OF_WEEK)) {
+			count--;
+		}
+
+		return count;
+	}
+
+	/**
+	 * 计时器<br>
+	 * 计算某个过程话费的时间,精确到毫秒
+	 * 
+	 * @return Timer
+	 */
+	public static Timer timer() {
+		return new Timer();
+
+	}
+	
+	/**
+	 * 生日转为年龄,计算法定年龄
+	 * @param birthDay 生日,标准日期字符串
+	 * @return 年龄
+	 * @throws Exception
+	 */
+	public static int ageOfNow(String birthDay) {
+		return ageOfNow(parse(birthDay));
+	}
+
+	/**
+	 * 生日转为年龄,计算法定年龄
+	 * @param birthDay 生日
+	 * @return 年龄
+	 * @throws Exception
+	 */
+	public static int ageOfNow(Date birthDay) {
+		return age(birthDay,date());
+	}
+	
+	/**
+	 * 计算相对于dateToCompare的年龄,长用于计算指定生日在某年的年龄
+	 * @param birthDay 生日
+	 * @param dateToCompare 需要对比的日期
+	 * @return 年龄
+	 * @throws Exception
+	 */
+	public static int age(Date birthDay, Date dateToCompare) {
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(dateToCompare);
+
+		if (cal.before(birthDay)) {
+			throw new IllegalArgumentException(StrKit.format("Birthday is after date {}!", formatDate(dateToCompare)));
+		}
+
+		int year = cal.get(Calendar.YEAR);
+		int month = cal.get(Calendar.MONTH);
+		int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
+
+		cal.setTime(birthDay);
+		int age = year - cal.get(Calendar.YEAR);
+		
+		int monthBirth = cal.get(Calendar.MONTH);
+		if (month == monthBirth) {
+			int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
+			if (dayOfMonth < dayOfMonthBirth) {
+				//如果生日在当月,但是未达到生日当天的日期,年龄减一
+				age--;
+			}
+		} else if (month < monthBirth){
+			//如果当前月份未达到生日的月份,年龄计算减一
+			age--;
+		}
+
+		return age;
+	}
+
+	/**
+	 * 计时器<br>
+	 * 计算某个过程话费的时间,精确到毫秒
+	 * 
+	 * @author Looly
+	 *
+	 */
+	public static class Timer {
+		private long time;
+		private boolean isNano;
+
+		public Timer() {
+			this(false);
+		}
+
+		public Timer(boolean isNano) {
+			this.isNano = isNano;
+			start();
+		}
+
+		/**
+		 * @return 开始计时并返回当前时间
+		 */
+		public long start() {
+			time = current(isNano);
+			return time;
+		}
+
+		/**
+		 * @return 重新计时并返回从开始到当前的持续时间
+		 */
+		public long durationRestart() {
+			long now = current(isNano);
+			long d = now - time;
+			time = now;
+			return d;
+		}
+
+		/**
+		 * @return 从开始到当前的持续时间
+		 */
+		public long duration() {
+			return current(isNano) - time;
+		}
+	}
+
+	// ------------------------------------------------------------------------ Private method start
+	/**
+	 * 获得指定日期年份和季节<br>
+	 * 格式:[20131]表示2013年第一季度
+	 * 
+	 * @param cal 日期
+	 */
+	private static String yearAndSeason(Calendar cal) {
+		return new StringBuilder().append(cal.get(Calendar.YEAR)).append(cal.get(Calendar.MONTH) / 3 + 1).toString();
+	}
+	// ------------------------------------------------------------------------ Private method end
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/HexKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/HexKit.java
new file mode 100644
index 0000000..61dcc03
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/HexKit.java
@@ -0,0 +1,254 @@
+package com.stylefeng.guns.core.support;
+
+import java.nio.charset.Charset;
+
+/**
+ * 十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制,一般用数字0到9和字母A到F表示(其中:A~F即10~15)。<br>
+ * 例如十进制数57,在二进制写作111001,在16进制写作39。<br>
+ * 像java,c这样的语言为了区分十六进制和十进制数值,会在十六进制数的前面加上 0x,比如0x20是十进制的32,而不是十进制的20<br>
+ * 
+ * 参考:https://my.oschina.net/xinxingegeya/blog/287476
+ * 
+ * @author Looly
+ *
+ */
+public class HexKit {
+
+	/**
+	 * 用于建立十六进制字符的输出的小写字符数组
+	 */
+	private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+	/**
+	 * 用于建立十六进制字符的输出的大写字符数组
+	 */
+	private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+	//---------------------------------------------------------------------------------------------------- encode
+	/**
+	 * 将字节数组转换为十六进制字符数组
+	 *
+	 * @param data byte[]
+	 * @return 十六进制char[]
+	 */
+	public static char[] encodeHex(byte[] data) {
+		return encodeHex(data, true);
+	}
+	
+	/**
+	 * 将字节数组转换为十六进制字符数组
+	 *
+	 * @param str 字符串
+	 * @param charset 编码
+	 * @return 十六进制char[]
+	 */
+	public static char[] encodeHex(String str, Charset charset) {
+		return encodeHex(StrKit.getBytes(str, charset), true);
+	}
+
+	/**
+	 * 将字节数组转换为十六进制字符数组
+	 *
+	 * @param data byte[]
+	 * @param toLowerCase <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式
+	 * @return 十六进制char[]
+	 */
+	public static char[] encodeHex(byte[] data, boolean toLowerCase) {
+		return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
+	}
+
+	/**
+	 * 将字节数组转换为十六进制字符串
+	 *
+	 * @param data byte[]
+	 * @return 十六进制String
+	 */
+	public static String encodeHexStr(byte[] data) {
+		return encodeHexStr(data, true);
+	}
+
+	/**
+	 * 将字节数组转换为十六进制字符串
+	 *
+	 * @param data byte[]
+	 * @param toLowerCase <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式
+	 * @return 十六进制String
+	 */
+	public static String encodeHexStr(byte[] data, boolean toLowerCase) {
+		return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
+	}
+	
+	//---------------------------------------------------------------------------------------------------- decode
+	/**
+	 * 将十六进制字符数组转换为字符串
+	 *
+	 * @param hexStr 十六进制String
+	 * @param charset 编码
+	 * @return 字符串
+	 */
+	public static String decodeHexStr(String hexStr, Charset charset) {
+		if(StrKit.isEmpty(hexStr)){
+			return hexStr;
+		}
+		return decodeHexStr(hexStr.toCharArray(), charset);
+	}
+	
+	/**
+	 * 将十六进制字符数组转换为字符串
+	 *
+	 * @param hexData 十六进制char[]
+	 * @param charset 编码
+	 * @return 字符串
+	 */
+	public static String decodeHexStr(char[] hexData, Charset charset) {
+		return StrKit.str(decodeHex(hexData), charset);
+	}
+
+	/**
+	 * 将十六进制字符数组转换为字节数组
+	 *
+	 * @param hexData 十六进制char[]
+	 * @return byte[]
+	 * @throws RuntimeException 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常
+	 */
+	public static byte[] decodeHex(char[] hexData) {
+
+		int len = hexData.length;
+
+		if ((len & 0x01) != 0) {
+			throw new RuntimeException("Odd number of characters.");
+		}
+
+		byte[] out = new byte[len >> 1];
+
+		// two characters form the hex value.
+		for (int i = 0, j = 0; j < len; i++) {
+			int f = toDigit(hexData[j], j) << 4;
+			j++;
+			f = f | toDigit(hexData[j], j);
+			j++;
+			out[i] = (byte) (f & 0xFF);
+		}
+
+		return out;
+	}
+	
+	//---------------------------------------------------------------------------------------- Private method start
+	/**
+	 * 将字节数组转换为十六进制字符串
+	 *
+	 * @param data byte[]
+	 * @param toDigits 用于控制输出的char[]
+	 * @return 十六进制String
+	 */
+	private static String encodeHexStr(byte[] data, char[] toDigits) {
+		return new String(encodeHex(data, toDigits));
+	}
+	
+	/**
+	 * 将字节数组转换为十六进制字符数组
+	 *
+	 * @param data byte[]
+	 * @param toDigits 用于控制输出的char[]
+	 * @return 十六进制char[]
+	 */
+	private static char[] encodeHex(byte[] data, char[] toDigits) {
+		int l = data.length;
+		char[] out = new char[l << 1];
+		// two characters form the hex value.
+		for (int i = 0, j = 0; i < l; i++) {
+			out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
+			out[j++] = toDigits[0x0F & data[i]];
+		}
+		return out;
+	}
+
+	/**
+	 * 将十六进制字符转换成一个整数
+	 *
+	 * @param ch 十六进制char
+	 * @param index 十六进制字符在字符数组中的位置
+	 * @return 一个整数
+	 * @throws RuntimeException 当ch不是一个合法的十六进制字符时,抛出运行时异常
+	 */
+	private static int toDigit(char ch, int index) {
+		int digit = Character.digit(ch, 16);
+		if (digit == -1) {
+			throw new RuntimeException("Illegal hexadecimal character " + ch + " at index " + index);
+		}
+		return digit;
+	}
+	//---------------------------------------------------------------------------------------- Private method end
+	
+	
+	
+	/**
+	 * 2进制转16进制
+	 * @param bString 2进制字符串
+	 * @return
+	 */
+	public static String binary2Hex(String bString) {
+		if (bString == null || bString.equals("") || bString.length() % 8 != 0)
+			return null;
+		StringBuffer tmp = new StringBuffer();
+		int iTmp = 0;
+		for (int i = 0; i < bString.length(); i += 4) {
+			iTmp = 0;
+			for (int j = 0; j < 4; j++) {
+				iTmp += Integer.parseInt(bString.substring(i + j, i + j + 1)) << (4 - j - 1);
+			}
+			tmp.append(Integer.toHexString(iTmp));
+		}
+		return tmp.toString();
+	}
+
+	/**
+	 * 16进制转2进制
+	 * @param hexString
+	 * @return
+	 */
+	public static String hex2Binary(String hexString) {
+		if (hexString == null || hexString.length() % 2 != 0)
+			return null;
+		String bString = "", tmp;
+		for (int i = 0; i < hexString.length(); i++) {
+			tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16));
+			bString += tmp.substring(tmp.length() - 4);
+		}
+		return bString;
+	}
+
+	/**
+	 * 将二进制转换成16进制
+	 * @param buf
+	 * @return
+	 */
+	public static String binary2Hex(byte buf[]) {
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; i < buf.length; i++) {
+			String hex = Integer.toHexString(buf[i] & 0xFF);
+			if (hex.length() == 1) {
+				hex = '0' + hex;
+			}
+			sb.append(hex.toUpperCase());
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * 将16进制转换为二进制
+	 * @param hexStr
+	 * @return
+	 */
+	public static byte[] hex2Byte(String hexStr) {
+		if (hexStr.length() < 1)
+			return null;
+		byte[] result = new byte[hexStr.length() / 2];
+		for (int i = 0; i < hexStr.length() / 2; i++) {
+			int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
+			int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
+			result[i] = (byte) (high * 16 + low);
+		}
+		return result;
+	}
+	
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/HttpKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/HttpKit.java
new file mode 100644
index 0000000..be94455
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/HttpKit.java
@@ -0,0 +1,195 @@
+/**
+ * Copyright (c) 2015-2016, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package com.stylefeng.guns.core.support;
+
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Enumeration;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class HttpKit {
+
+    public static String getIp(){
+       return HttpKit.getRequest().getRemoteHost();
+    }
+
+    /**
+     * 获取所有请求的值
+     */
+    public static Map<String, String> getRequestParameters() {
+        HashMap<String, String> values = new HashMap<>();
+        HttpServletRequest request = HttpKit.getRequest();
+        Enumeration enums = request.getParameterNames();
+        while ( enums.hasMoreElements()){
+            String paramName = (String) enums.nextElement();
+            String paramValue = request.getParameter(paramName);
+            values.put(paramName, paramValue);
+        }
+        return values;
+    }
+
+    /**
+     * 获取 HttpServletRequest
+     */
+    public static HttpServletResponse getResponse() {
+        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+        return response;
+    }
+
+    /**
+     * 获取 包装防Xss Sql注入的 HttpServletRequest
+     * @return request
+     */
+    public static HttpServletRequest getRequest() {
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        return new WafRequestWrapper(request);
+    }
+
+    /**
+     * 向指定URL发送GET方法的请求
+     *
+     * @param url 发送请求的URL
+     * @param param 请求参数
+     * @return URL 所代表远程资源的响应结果
+     */
+    public static String sendGet(String url, Map<String, String> param) {
+        String result = "";
+        BufferedReader in = null;
+        try {
+            StringBuffer query = new StringBuffer();
+
+            for (Map.Entry<String, String> kv : param.entrySet()) {
+                query.append(URLEncoder.encode(kv.getKey(), "UTF-8") + "=");
+                query.append(URLEncoder.encode(kv.getValue(), "UTF-8") + "&");
+            }
+            if (query.lastIndexOf("&") > 0) {
+                query.deleteCharAt(query.length() - 1);
+            }
+
+            String urlNameString = url + "?" + query.toString();
+            URL realUrl = new URL(urlNameString);
+            // 打开和URL之间的连接
+            URLConnection connection = realUrl.openConnection();
+            // 设置通用的请求属性
+            connection.setRequestProperty("accept", "*/*");
+            connection.setRequestProperty("connection", "Keep-Alive");
+            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            // 建立实际的连接
+            connection.connect();
+            // 获取所有响应头字段
+            Map<String, List<String>> map = connection.getHeaderFields();
+            // 遍历所有的响应头字段
+            for (String key : map.keySet()) {
+                System.out.println(key + "--->" + map.get(key));
+            }
+            // 定义 BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result += line;
+            }
+        } catch (Exception e) {
+            System.out.println("发送GET请求出现异常!" + e);
+            e.printStackTrace();
+        }
+        // 使用finally块来关闭输入流
+        finally {
+            try {
+                if (in != null) {
+                    in.close();
+                }
+            } catch (Exception e2) {
+                e2.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 向指定 URL 发送POST方法的请求
+     *
+     * @param url 发送请求的 URL
+     * @param param  请求参数
+     * @return 所代表远程资源的响应结果
+     */
+    public static String sendPost(String url, Map<String, String> param) {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        String result = "";
+        try {
+            String para = "";
+            for (String key : param.keySet()) {
+                para += (key + "=" + param.get(key) + "&");
+            }
+            if (para.lastIndexOf("&") > 0) {
+                para = para.substring(0, para.length() - 1);
+            }
+            String urlNameString = url + "?" + para;
+            URL realUrl = new URL(urlNameString);
+            // 打开和URL之间的连接
+            URLConnection conn = realUrl.openConnection();
+            // 设置通用的请求属性
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            // 发送POST请求必须设置如下两行
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            out = new PrintWriter(conn.getOutputStream());
+            // 发送请求参数
+            out.print(param);
+            // flush输出流的缓冲
+            out.flush();
+            // 定义BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result += line;
+            }
+        } catch (Exception e) {
+            System.out.println("发送 POST 请求出现异常!" + e);
+            e.printStackTrace();
+        }
+        // 使用finally块来关闭输出流、输入流
+        finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/ObjectKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/ObjectKit.java
new file mode 100644
index 0000000..d0f83e4
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/ObjectKit.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.core.support;
+
+/**
+ * 一些通用的函数
+ * 
+ * @author Looly
+ *
+ */
+public class ObjectKit {
+	/**
+	 * 比较两个对象是否相等。<br>
+	 * 相同的条件有两个,满足其一即可:<br>
+	 * 1. obj1 == null && obj2 == null; 2. obj1.equals(obj2)
+	 * 
+	 * @param obj1 对象1
+	 * @param obj2 对象2
+	 * @return 是否相等
+	 */
+	public static boolean equals(Object obj1, Object obj2) {
+		return (obj1 != null) ? (obj1.equals(obj2)) : (obj2 == null);
+	}
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/PageKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/PageKit.java
new file mode 100644
index 0000000..a57a9c2
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/PageKit.java
@@ -0,0 +1,57 @@
+package com.stylefeng.guns.core.support;
+
+/**
+ * 分页工具类
+ * 
+ * @author xiaoleilu
+ * 
+ */
+public class PageKit {
+
+	/**
+	 * 将页数和每页条目数转换为开始位置和结束位置<br>
+	 * 此方法用于不包括结束位置的分页方法<br>
+	 * 例如:<br>
+	 * 页码:1,每页10 -> [0, 10]<br>
+	 * 页码:2,每页10 -> [10, 20]<br>
+	 * 。。。<br>
+	 * 
+	 * @param pageNo
+	 *            页码(从1计数)
+	 * @param countPerPage
+	 *            每页条目数
+	 * @return 第一个数为开始位置,第二个数为结束位置
+	 */
+	public static int[] transToStartEnd(int pageNo, int countPerPage) {
+		if (pageNo < 1) {
+			pageNo = 1;
+		}
+
+		if (countPerPage < 1) {
+			countPerPage = 0;
+//			LogKit.warn("Count per page  [" + countPerPage + "] is not valid!");
+		}
+
+		int start = (pageNo - 1) * countPerPage;
+		int end = start + countPerPage;
+
+		return new int[] { start, end };
+	}
+
+	/**
+	 * 根据总数计算总页数
+	 * 
+	 * @param totalCount
+	 *            总数
+	 * @param numPerPage
+	 *            每页数
+	 * @return 总页数
+	 */
+	public static int totalPage(int totalCount, int numPerPage) {
+		if (numPerPage == 0) {
+			return 0;
+		}
+		return totalCount % numPerPage == 0 ? (totalCount / numPerPage)
+				: (totalCount / numPerPage + 1);
+	}
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/StrKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/StrKit.java
new file mode 100644
index 0000000..49aa9ab
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/StrKit.java
@@ -0,0 +1,1370 @@
+package com.stylefeng.guns.core.support;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * 字符串工具类
+ * 
+ * @author xiaoleilu
+ *
+ */
+public class StrKit {
+
+	public static final String SPACE = " ";
+	public static final String DOT = ".";
+	public static final String SLASH = "/";
+	public static final String BACKSLASH = "\\";
+	public static final String EMPTY = "";
+	public static final String CRLF = "\r\n";
+	public static final String NEWLINE = "\n";
+	public static final String UNDERLINE = "_";
+	public static final String COMMA = ",";
+
+	public static final String HTML_NBSP = "&nbsp;";
+	public static final String HTML_AMP = "&amp";
+	public static final String HTML_QUOTE = "&quot;";
+	public static final String HTML_LT = "&lt;";
+	public static final String HTML_GT = "&gt;";
+
+	public static final String EMPTY_JSON = "{}";
+
+
+	/**
+	 * 首字母变小写
+	 */
+	public static String firstCharToLowerCase(String str) {
+		char firstChar = str.charAt(0);
+		if (firstChar >= 'A' && firstChar <= 'Z') {
+			char[] arr = str.toCharArray();
+			arr[0] += ('a' - 'A');
+			return new String(arr);
+		}
+		return str;
+	}
+	
+	/**
+	 * 首字母变大写
+	 */
+	public static String firstCharToUpperCase(String str) {
+		char firstChar = str.charAt(0);
+		if (firstChar >= 'a' && firstChar <= 'z') {
+			char[] arr = str.toCharArray();
+			arr[0] -= ('a' - 'A');
+			return new String(arr);
+		}
+		return str;
+	}
+
+	// ------------------------------------------------------------------------ Blank
+	/**
+	 * 字符串是否为空白 空白的定义如下: <br>
+	 * 1、为null <br>
+	 * 2、为不可见字符(如空格)<br>
+	 * 3、""<br>
+	 * 
+	 * @param str 被检测的字符串
+	 * @return 是否为空
+	 */
+	public static boolean isBlank(String str) {
+		int length;
+		if ((str == null) || ((length = str.length()) == 0)) {
+			return true;
+		}
+		for (int i = 0; i < length; i++) {
+			// 只要有一个非空字符即为非空字符串
+			if (false == Character.isWhitespace(str.charAt(i))) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 字符串是否为非空白 空白的定义如下: <br>
+	 * 1、不为null <br>
+	 * 2、不为不可见字符(如空格)<br>
+	 * 3、不为""<br>
+	 * 
+	 * @param str 被检测的字符串
+	 * @return 是否为非空
+	 */
+	public static boolean notBlank(String str) {
+		return false == isBlank(str);
+	}
+
+	/**
+	 * 是否包含空字符串
+	 * 
+	 * @param strs 字符串列表
+	 * @return 是否包含空字符串
+	 */
+	public static boolean hasBlank(String... strs) {
+		if (CollectionKit.isEmpty(strs)) {
+			return true;
+		}
+		for (String str : strs) {
+			if (isBlank(str)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * 给定所有字符串是否为空白
+	 * 
+	 * @param strs 字符串
+	 * @return 所有字符串是否为空白
+	 */
+	public static boolean isAllBlank(String... strs) {
+		if (CollectionKit.isEmpty(strs)) {
+			return true;
+		}
+		for (String str : strs) {
+			if (notBlank(str)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	// ------------------------------------------------------------------------ Empty
+	/**
+	 * 字符串是否为空,空的定义如下 1、为null <br>
+	 * 2、为""<br>
+	 * 
+	 * @param str 被检测的字符串
+	 * @return 是否为空
+	 */
+	public static boolean isEmpty(String str) {
+		return str == null || str.length() == 0;
+	}
+
+	/**
+	 * 字符串是否为非空白 空白的定义如下: <br>
+	 * 1、不为null <br>
+	 * 2、不为""<br>
+	 * 
+	 * @param str 被检测的字符串
+	 * @return 是否为非空
+	 */
+	public static boolean isNotEmpty(String str) {
+		return false == isEmpty(str);
+	}
+
+	/**
+	 * 当给定字符串为null时,转换为Empty
+	 * 
+	 * @param str 被转换的字符串
+	 * @return 转换后的字符串
+	 */
+	public static String nullToEmpty(String str) {
+		return nullToDefault(str, EMPTY);
+	}
+
+	/**
+	 * 如果字符串是<code>null</code>,则返回指定默认字符串,否则返回字符串本身。
+	 * 
+	 * <pre>
+	 * nullToDefault(null, &quot;default&quot;)  = &quot;default&quot;
+	 * nullToDefault(&quot;&quot;, &quot;default&quot;)    = &quot;&quot;
+	 * nullToDefault(&quot;  &quot;, &quot;default&quot;)  = &quot;  &quot;
+	 * nullToDefault(&quot;bat&quot;, &quot;default&quot;) = &quot;bat&quot;
+	 * </pre>
+	 * 
+	 * @param str 要转换的字符串
+	 * @param defaultStr 默认字符串
+	 * 
+	 * @return 字符串本身或指定的默认字符串
+	 */
+	public static String nullToDefault(String str, String defaultStr) {
+		return (str == null) ? defaultStr : str;
+	}
+
+	/**
+	 * 当给定字符串为空字符串时,转换为<code>null</code>
+	 * 
+	 * @param str 被转换的字符串
+	 * @return 转换后的字符串
+	 */
+	public static String emptyToNull(String str) {
+		return isEmpty(str) ? null : str;
+	}
+
+	/**
+	 * 是否包含空字符串
+	 * 
+	 * @param strs 字符串列表
+	 * @return 是否包含空字符串
+	 */
+	public static boolean hasEmpty(String... strs) {
+		if (CollectionKit.isEmpty(strs)) {
+			return true;
+		}
+
+		for (String str : strs) {
+			if (isEmpty(str)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * 是否全部为空字符串
+	 * 
+	 * @param strs 字符串列表
+	 * @return 是否全部为空字符串
+	 */
+	public static boolean isAllEmpty(String... strs) {
+		if (CollectionKit.isEmpty(strs)) {
+			return true;
+		}
+
+		for (String str : strs) {
+			if (isNotEmpty(str)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	// ------------------------------------------------------------------------ Trim
+	/**
+	 * 除去字符串头尾部的空白,如果字符串是<code>null</code>,依然返回<code>null</code>。
+	 * 
+	 * <p>
+	 * 注意,和<code>String.trim</code>不同,此方法使用<code>Character.isWhitespace</code> 来判定空白, 因而可以除去英文字符集之外的其它空白,如中文空格。
+	 * 
+	 * <pre>
+	 * trim(null)          = null
+	 * trim(&quot;&quot;)            = &quot;&quot;
+	 * trim(&quot;     &quot;)       = &quot;&quot;
+	 * trim(&quot;abc&quot;)         = &quot;abc&quot;
+	 * trim(&quot;    abc    &quot;) = &quot;abc&quot;
+	 * </pre>
+	 * 
+	 * </p>
+	 * 
+	 * @param str 要处理的字符串
+	 * 
+	 * @return 除去空白的字符串,如果原字串为<code>null</code>,则返回<code>null</code>
+	 */
+	public static String trim(String str) {
+		return (null == str) ? null : trim(str, 0);
+	}
+
+	/**
+	 * 给定字符串数组全部做去首尾空格
+	 * 
+	 * @param strs 字符串数组
+	 */
+	public static void trim(String[] strs) {
+		if (null == strs) {
+			return;
+		}
+		String str;
+		for (int i = 0; i < strs.length; i++) {
+			str = strs[i];
+			if (null != str) {
+				strs[i] = str.trim();
+			}
+		}
+	}
+
+	/**
+	 * 除去字符串头部的空白,如果字符串是<code>null</code>,则返回<code>null</code>。
+	 * 
+	 * <p>
+	 * 注意,和<code>String.trim</code>不同,此方法使用<code>Character.isWhitespace</code> 来判定空白, 因而可以除去英文字符集之外的其它空白,如中文空格。
+	 * 
+	 * <pre>
+	 * trimStart(null)         = null
+	 * trimStart(&quot;&quot;)           = &quot;&quot;
+	 * trimStart(&quot;abc&quot;)        = &quot;abc&quot;
+	 * trimStart(&quot;  abc&quot;)      = &quot;abc&quot;
+	 * trimStart(&quot;abc  &quot;)      = &quot;abc  &quot;
+	 * trimStart(&quot; abc &quot;)      = &quot;abc &quot;
+	 * </pre>
+	 * 
+	 * </p>
+	 * 
+	 * @param str 要处理的字符串
+	 * 
+	 * @return 除去空白的字符串,如果原字串为<code>null</code>或结果字符串为<code>""</code>,则返回 <code>null</code>
+	 */
+	public static String trimStart(String str) {
+		return trim(str, -1);
+	}
+
+	/**
+	 * 除去字符串尾部的空白,如果字符串是<code>null</code>,则返回<code>null</code>。
+	 * 
+	 * <p>
+	 * 注意,和<code>String.trim</code>不同,此方法使用<code>Character.isWhitespace</code> 来判定空白, 因而可以除去英文字符集之外的其它空白,如中文空格。
+	 * 
+	 * <pre>
+	 * trimEnd(null)       = null
+	 * trimEnd(&quot;&quot;)         = &quot;&quot;
+	 * trimEnd(&quot;abc&quot;)      = &quot;abc&quot;
+	 * trimEnd(&quot;  abc&quot;)    = &quot;  abc&quot;
+	 * trimEnd(&quot;abc  &quot;)    = &quot;abc&quot;
+	 * trimEnd(&quot; abc &quot;)    = &quot; abc&quot;
+	 * </pre>
+	 * 
+	 * </p>
+	 * 
+	 * @param str 要处理的字符串
+	 * 
+	 * @return 除去空白的字符串,如果原字串为<code>null</code>或结果字符串为<code>""</code>,则返回 <code>null</code>
+	 */
+	public static String trimEnd(String str) {
+		return trim(str, 1);
+	}
+
+	/**
+	 * 除去字符串头尾部的空白符,如果字符串是<code>null</code>,依然返回<code>null</code>。
+	 * 
+	 * @param str 要处理的字符串
+	 * @param mode <code>-1</code>表示trimStart,<code>0</code>表示trim全部, <code>1</code>表示trimEnd
+	 * 
+	 * @return 除去指定字符后的的字符串,如果原字串为<code>null</code>,则返回<code>null</code>
+	 */
+	public static String trim(String str, int mode) {
+		if (str == null) {
+			return null;
+		}
+
+		int length = str.length();
+		int start = 0;
+		int end = length;
+
+		// 扫描字符串头部
+		if (mode <= 0) {
+			while ((start < end) && (Character.isWhitespace(str.charAt(start)))) {
+				start++;
+			}
+		}
+
+		// 扫描字符串尾部
+		if (mode >= 0) {
+			while ((start < end) && (Character.isWhitespace(str.charAt(end - 1)))) {
+				end--;
+			}
+		}
+
+		if ((start > 0) || (end < length)) {
+			return str.substring(start, end);
+		}
+
+		return str;
+	}
+	
+	/**
+	 * 是否以指定字符串开头
+	 * @param str 被监测字符串
+	 * @param prefix 开头字符串
+	 * @param isIgnoreCase 是否忽略大小写
+	 * @return 是否以指定字符串开头
+	 */
+	public static boolean startWith(String str, String prefix, boolean isIgnoreCase){
+		if(isIgnoreCase){
+			return str.toLowerCase().startsWith(prefix.toLowerCase());
+		}else{
+			return str.startsWith(prefix);
+		}
+	}
+	
+	/**
+	 * 是否以指定字符串结尾
+	 * @param str 被监测字符串
+	 * @param suffix 结尾字符串
+	 * @param isIgnoreCase 是否忽略大小写
+	 * @return 是否以指定字符串结尾
+	 */
+	public static boolean endWith(String str, String suffix, boolean isIgnoreCase){
+		if(isIgnoreCase){
+			return str.toLowerCase().endsWith(suffix.toLowerCase());
+		}else{
+			return str.endsWith(suffix);
+		}
+	}
+	
+	/**
+	 * 是否包含特定字符,忽略大小写,如果给定两个参数都为<code>null</code>,返回true
+	 * @param str 被检测字符串
+	 * @param testStr 被测试是否包含的字符串
+	 * @return 是否包含
+	 */
+	public static boolean containsIgnoreCase(String str, String testStr){
+		if(null == str){
+			//如果被监测字符串和 
+			return null == testStr;
+		}
+		return str.toLowerCase().contains(testStr.toLowerCase());
+	}
+
+	/**
+	 * 获得set或get方法对应的标准属性名<br/>
+	 * 例如:setName 返回 name
+	 * 
+	 * @param getOrSetMethodName
+	 * @return 如果是set或get方法名,返回field, 否则null
+	 */
+	public static String getGeneralField(String getOrSetMethodName) {
+		if (getOrSetMethodName.startsWith("get") || getOrSetMethodName.startsWith("set")) {
+			return cutPreAndLowerFirst(getOrSetMethodName, 3);
+		}
+		return null;
+	}
+
+	/**
+	 * 生成set方法名<br/>
+	 * 例如:name 返回 setName
+	 * 
+	 * @param fieldName 属性名
+	 * @return setXxx
+	 */
+	public static String genSetter(String fieldName) {
+		return upperFirstAndAddPre(fieldName, "set");
+	}
+
+	/**
+	 * 生成get方法名
+	 * 
+	 * @param fieldName 属性名
+	 * @return getXxx
+	 */
+	public static String genGetter(String fieldName) {
+		return upperFirstAndAddPre(fieldName, "get");
+	}
+
+	/**
+	 * 去掉首部指定长度的字符串并将剩余字符串首字母小写<br/>
+	 * 例如:str=setName, preLength=3 -> return name
+	 * 
+	 * @param str 被处理的字符串
+	 * @param preLength 去掉的长度
+	 * @return 处理后的字符串,不符合规范返回null
+	 */
+	public static String cutPreAndLowerFirst(String str, int preLength) {
+		if (str == null) {
+			return null;
+		}
+		if (str.length() > preLength) {
+			char first = Character.toLowerCase(str.charAt(preLength));
+			if (str.length() > preLength + 1) {
+				return first + str.substring(preLength + 1);
+			}
+			return String.valueOf(first);
+		}
+		return null;
+	}
+
+	/**
+	 * 原字符串首字母大写并在其首部添加指定字符串 例如:str=name, preString=get -> return getName
+	 * 
+	 * @param str 被处理的字符串
+	 * @param preString 添加的首部
+	 * @return 处理后的字符串
+	 */
+	public static String upperFirstAndAddPre(String str, String preString) {
+		if (str == null || preString == null) {
+			return null;
+		}
+		return preString + upperFirst(str);
+	}
+
+	/**
+	 * 大写首字母<br>
+	 * 例如:str = name, return Name
+	 * 
+	 * @param str 字符串
+	 * @return 字符串
+	 */
+	public static String upperFirst(String str) {
+		return Character.toUpperCase(str.charAt(0)) + str.substring(1);
+	}
+
+	/**
+	 * 小写首字母<br>
+	 * 例如:str = Name, return name
+	 * 
+	 * @param str 字符串
+	 * @return 字符串
+	 */
+	public static String lowerFirst(String str) {
+		if(isBlank(str)){
+			return str;
+		}
+		return Character.toLowerCase(str.charAt(0)) + str.substring(1);
+	}
+
+	/**
+	 * 去掉指定前缀
+	 * 
+	 * @param str 字符串
+	 * @param prefix 前缀
+	 * @return 切掉后的字符串,若前缀不是 preffix, 返回原字符串
+	 */
+	public static String removePrefix(String str, String prefix) {
+		if(isEmpty(str) || isEmpty(prefix)){
+			return str;
+		}
+		
+		if (str.startsWith(prefix)) {
+			return str.substring(prefix.length());
+		}
+		return str;
+	}
+
+	/**
+	 * 忽略大小写去掉指定前缀
+	 * 
+	 * @param str 字符串
+	 * @param prefix 前缀
+	 * @return 切掉后的字符串,若前缀不是 prefix, 返回原字符串
+	 */
+	public static String removePrefixIgnoreCase(String str, String prefix) {
+		if(isEmpty(str) || isEmpty(prefix)){
+			return str;
+		}
+		
+		if (str.toLowerCase().startsWith(prefix.toLowerCase())) {
+			return str.substring(prefix.length());
+		}
+		return str;
+	}
+
+	/**
+	 * 去掉指定后缀
+	 * 
+	 * @param str 字符串
+	 * @param suffix 后缀
+	 * @return 切掉后的字符串,若后缀不是 suffix, 返回原字符串
+	 */
+	public static String removeSuffix(String str, String suffix) {
+		if(isEmpty(str) || isEmpty(suffix)){
+			return str;
+		}
+		
+		if (str.endsWith(suffix)) {
+			return str.substring(0, str.length() - suffix.length());
+		}
+		return str;
+	}
+	
+	/**
+	 * 获得字符串对应byte数组
+	 * @param str 字符串
+	 * @param charset 编码,如果为<code>null</code>使用系统默认编码
+	 * @return bytes
+	 */
+	public static byte[] getBytes(String str, Charset charset){
+		if(null == str){
+			return null;
+		}
+		return null == charset ? str.getBytes() : str.getBytes(charset);
+	}
+
+	/**
+	 * 忽略大小写去掉指定后缀
+	 * 
+	 * @param str 字符串
+	 * @param suffix 后缀
+	 * @return 切掉后的字符串,若后缀不是 suffix, 返回原字符串
+	 */
+	public static String removeSuffixIgnoreCase(String str, String suffix) {
+		if(isEmpty(str) || isEmpty(suffix)){
+			return str;
+		}
+		
+		if (str.toLowerCase().endsWith(suffix.toLowerCase())) {
+			return str.substring(0, str.length() - suffix.length());
+		}
+		return str;
+	}
+	
+	/**
+	 * 如果给定字符串不是以prefix开头的,在开头补充 prefix
+	 * @param str 字符串
+	 * @param prefix 前缀
+	 * @return 补充后的字符串
+	 */
+	public static String addPrefixIfNot(String str, String prefix){
+		if(isEmpty(str) || isEmpty(prefix)){
+			return str;
+		}
+		if(false == str.startsWith(prefix)){
+			str = prefix + str;
+		}
+		return str;
+	}
+	
+	/**
+	 * 如果给定字符串不是以suffix结尾的,在尾部补充 suffix
+	 * @param str 字符串
+	 * @param suffix 后缀
+	 * @return 补充后的字符串
+	 */
+	public static String addSuffixIfNot(String str, String suffix){
+		if(isEmpty(str) || isEmpty(suffix)){
+			return str;
+		}
+		if(false == str.endsWith(suffix)){
+			str += suffix;
+		}
+		return str;
+	}
+
+	/**
+	 * 清理空白字符
+	 * 
+	 * @param str 被清理的字符串
+	 * @return 清理后的字符串
+	 */
+	public static String cleanBlank(String str) {
+		if (str == null) {
+			return null;
+		}
+
+		return str.replaceAll("\\s*", EMPTY);
+	}
+
+	/**
+	 * 切分字符串<br>
+	 * a#b#c -> [a,b,c] <br>
+	 * a##b#c -> [a,"",b,c]
+	 * 
+	 * @param str 被切分的字符串
+	 * @param separator 分隔符字符
+	 * @return 切分后的集合
+	 */
+	public static List<String> split(String str, char separator) {
+		return split(str, separator, 0);
+	}
+
+	/**
+	 * 切分字符串
+	 * 
+	 * @param str 被切分的字符串
+	 * @param separator 分隔符字符
+	 * @param limit 限制分片数
+	 * @return 切分后的集合
+	 */
+	public static List<String> split(String str, char separator, int limit) {
+		if (str == null) {
+			return null;
+		}
+		List<String> list = new ArrayList<String>(limit == 0 ? 16 : limit);
+		if (limit == 1) {
+			list.add(str);
+			return list;
+		}
+
+		boolean isNotEnd = true; // 未结束切分的标志
+		int strLen = str.length();
+		StringBuilder sb = new StringBuilder(strLen);
+		for (int i = 0; i < strLen; i++) {
+			char c = str.charAt(i);
+			if (isNotEnd && c == separator) {
+				list.add(sb.toString());
+				// 清空StringBuilder
+				sb.delete(0, sb.length());
+
+				// 当达到切分上限-1的量时,将所剩字符全部作为最后一个串
+				if (limit != 0 && list.size() == limit - 1) {
+					isNotEnd = false;
+				}
+			} else {
+				sb.append(c);
+			}
+		}
+		list.add(sb.toString());// 加入尾串
+		return list;
+	}
+
+	/**
+	 * 切分字符串<br>
+	 * from jodd
+	 * 
+	 * @param str 被切分的字符串
+	 * @param delimiter 分隔符
+	 * @return 字符串
+	 */
+	public static String[] split(String str, String delimiter) {
+		if (str == null) {
+			return null;
+		}
+		if (str.trim().length() == 0) {
+			return new String[] { str };
+		}
+
+		int dellen = delimiter.length(); // del length
+		int maxparts = (str.length() / dellen) + 2; // one more for the last
+		int[] positions = new int[maxparts];
+
+		int i, j = 0;
+		int count = 0;
+		positions[0] = -dellen;
+		while ((i = str.indexOf(delimiter, j)) != -1) {
+			count++;
+			positions[count] = i;
+			j = i + dellen;
+		}
+		count++;
+		positions[count] = str.length();
+
+		String[] result = new String[count];
+
+		for (i = 0; i < count; i++) {
+			result[i] = str.substring(positions[i] + dellen, positions[i + 1]);
+		}
+		return result;
+	}
+
+	/**
+	 * 改进JDK subString<br>
+	 * index从0开始计算,最后一个字符为-1<br>
+	 * 如果from和to位置一样,返回 "" <br>
+	 * 如果from或to为负数,则按照length从后向前数位置,如果绝对值大于字符串长度,则from归到0,to归到length<br>
+	 * 如果经过修正的index中from大于to,则互换from和to
+	 * example: <br>
+	 * 	abcdefgh 2 3 -> c <br>
+	 * 	abcdefgh 2 -3 -> cde <br>
+	 * 
+	 * @param string String
+	 * @param fromIndex 开始的index(包括)
+	 * @param toIndex 结束的index(不包括)
+	 * @return 字串
+	 */
+	public static String sub(String string, int fromIndex, int toIndex) {
+		int len = string.length();
+		if (fromIndex < 0) {
+			fromIndex = len + fromIndex;
+			if(fromIndex < 0 ) { 
+				fromIndex = 0;
+			}
+		} else if(fromIndex >= len) {
+			fromIndex = len -1;
+		}
+		if (toIndex < 0) {
+			toIndex = len + toIndex;
+			if(toIndex < 0) {
+				toIndex = len;
+			}
+		} else if(toIndex > len) {
+			toIndex = len;
+		}
+		if (toIndex < fromIndex) {
+			int tmp = fromIndex;
+			fromIndex = toIndex;
+			toIndex = tmp;
+		}
+		if (fromIndex == toIndex) {
+			return EMPTY;
+		}
+		char[] strArray = string.toCharArray();
+		char[] newStrArray = Arrays.copyOfRange(strArray, fromIndex, toIndex);
+		return new String(newStrArray);
+	}
+
+	/**
+	 * 切割前部分
+	 * 
+	 * @param string 字符串
+	 * @param toIndex 切割到的位置(不包括)
+	 * @return 切割后的字符串
+	 */
+	public static String subPre(String string, int toIndex) {
+		return sub(string, 0, toIndex);
+	}
+
+	/**
+	 * 切割后部分
+	 * 
+	 * @param string 字符串
+	 * @param fromIndex 切割开始的位置(包括)
+	 * @return 切割后的字符串
+	 */
+	public static String subSuf(String string, int fromIndex) {
+		if (isEmpty(string)) {
+			return null;
+		}
+		return sub(string, fromIndex, string.length());
+	}
+
+	/**
+	 * 给定字符串是否被字符包围
+	 * 
+	 * @param str 字符串
+	 * @param prefix 前缀
+	 * @param suffix 后缀
+	 * @return 是否包围,空串不包围
+	 */
+	public static boolean isSurround(String str, String prefix, String suffix) {
+		if (StrKit.isBlank(str)) {
+			return false;
+		}
+		if (str.length() < (prefix.length() + suffix.length())) {
+			return false;
+		}
+
+		return str.startsWith(prefix) && str.endsWith(suffix);
+	}
+
+	/**
+	 * 给定字符串是否被字符包围
+	 * 
+	 * @param str 字符串
+	 * @param prefix 前缀
+	 * @param suffix 后缀
+	 * @return 是否包围,空串不包围
+	 */
+	public static boolean isSurround(String str, char prefix, char suffix) {
+		if (StrKit.isBlank(str)) {
+			return false;
+		}
+		if (str.length() < 2) {
+			return false;
+		}
+
+		return str.charAt(0) == prefix && str.charAt(str.length() - 1) == suffix;
+	}
+
+	/**
+	 * 重复某个字符
+	 * 
+	 * @param c 被重复的字符
+	 * @param count 重复的数目
+	 * @return 重复字符字符串
+	 */
+	public static String repeat(char c, int count) {
+		char[] result = new char[count];
+		for (int i = 0; i < count; i++) {
+			result[i] = c;
+		}
+		return new String(result);
+	}
+
+	/**
+	 * 重复某个字符串
+	 * 
+	 * @param str 被重复的字符
+	 * @param count 重复的数目
+	 * @return 重复字符字符串
+	 */
+	public static String repeat(String str, int count) {
+
+		// 检查
+		final int len = str.length();
+		final long longSize = (long) len * (long) count;
+		final int size = (int) longSize;
+		if (size != longSize) {
+			throw new ArrayIndexOutOfBoundsException("Required String length is too large: " + longSize);
+		}
+
+		final char[] array = new char[size];
+		str.getChars(0, len, array, 0);
+		int n;
+		for (n = len; n < size - n; n <<= 1) {// n <<= 1相当于n *2
+			System.arraycopy(array, 0, array, n, n);
+		}
+		System.arraycopy(array, 0, array, n, size - n);
+		return new String(array);
+	}
+
+	/**
+	 * 比较两个字符串(大小写敏感)。
+	 * 
+	 * <pre>
+	 * equals(null, null)   = true
+	 * equals(null, &quot;abc&quot;)  = false
+	 * equals(&quot;abc&quot;, null)  = false
+	 * equals(&quot;abc&quot;, &quot;abc&quot;) = true
+	 * equals(&quot;abc&quot;, &quot;ABC&quot;) = false
+	 * </pre>
+	 * 
+	 * @param str1 要比较的字符串1
+	 * @param str2 要比较的字符串2
+	 * 
+	 * @return 如果两个字符串相同,或者都是<code>null</code>,则返回<code>true</code>
+	 */
+	public static boolean equals(String str1, String str2) {
+		if (str1 == null) {
+			return str2 == null;
+		}
+
+		return str1.equals(str2);
+	}
+
+	/**
+	 * 比较两个字符串(大小写不敏感)。
+	 * 
+	 * <pre>
+	 * equalsIgnoreCase(null, null)   = true
+	 * equalsIgnoreCase(null, &quot;abc&quot;)  = false
+	 * equalsIgnoreCase(&quot;abc&quot;, null)  = false
+	 * equalsIgnoreCase(&quot;abc&quot;, &quot;abc&quot;) = true
+	 * equalsIgnoreCase(&quot;abc&quot;, &quot;ABC&quot;) = true
+	 * </pre>
+	 * 
+	 * @param str1 要比较的字符串1
+	 * @param str2 要比较的字符串2
+	 * 
+	 * @return 如果两个字符串相同,或者都是<code>null</code>,则返回<code>true</code>
+	 */
+	public static boolean equalsIgnoreCase(String str1, String str2) {
+		if (str1 == null) {
+			return str2 == null;
+		}
+
+		return str1.equalsIgnoreCase(str2);
+	}
+
+	/**
+	 * 格式化文本, {} 表示占位符<br>
+	 * 例如:format("aaa {} ccc", "bbb")   ---->    aaa bbb ccc
+	 * 
+	 * @param template 文本模板,被替换的部分用 {} 表示
+	 * @param values 参数值
+	 * @return 格式化后的文本
+	 */
+	public static String format(String template, Object... values) {
+		if (CollectionKit.isEmpty(values) || isBlank(template)) {
+			return template;
+		}
+
+		final StringBuilder sb = new StringBuilder();
+		final int length = template.length();
+
+		int valueIndex = 0;
+		char currentChar;
+		for (int i = 0; i < length; i++) {
+			if (valueIndex >= values.length) {
+				sb.append(sub(template, i, length));
+				break;
+			}
+
+			currentChar = template.charAt(i);
+			if (currentChar == '{') {
+				final char nextChar = template.charAt(++i);
+				if (nextChar == '}') {
+					sb.append(values[valueIndex++]);
+				} else {
+					sb.append('{').append(nextChar);
+				}
+			} else {
+				sb.append(currentChar);
+			}
+
+		}
+
+		return sb.toString();
+	}
+
+	/**
+	 * 格式化文本,使用 {varName} 占位<br>
+	 * map = {a: "aValue", b: "bValue"}
+	 * format("{a} and {b}", map)    ---->    aValue and bValue
+	 * 
+	 * @param template 文本模板,被替换的部分用 {key} 表示
+	 * @param map 参数值对
+	 * @return 格式化后的文本
+	 */
+	public static String format(String template, Map<?, ?> map) {
+		if (null == map || map.isEmpty()) {
+			return template;
+		}
+
+		for (Entry<?, ?> entry : map.entrySet()) {
+			template = template.replace("{" + entry.getKey() + "}", entry.getValue().toString());
+		}
+		return template;
+	}
+	
+	/**
+	 * 编码字符串
+	 * 
+	 * @param str 字符串
+	 * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
+	 * @return 编码后的字节码
+	 */
+	public static byte[] bytes(String str, String charset) {
+		return bytes(str, isBlank(charset) ? Charset.defaultCharset() : Charset.forName(charset));
+	}
+
+	/**
+	 * 编码字符串
+	 * 
+	 * @param str 字符串
+	 * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
+	 * @return 编码后的字节码
+	 */
+	public static byte[] bytes(String str, Charset charset) {
+		if (str == null) {
+			return null;
+		}
+
+		if (null == charset) {
+			return str.getBytes();
+		}
+		return str.getBytes(charset);
+	}
+	
+	/**
+	 * 将byte数组转为字符串
+	 * 
+	 * @param bytes byte数组
+	 * @param charset 字符集
+	 * @return 字符串
+	 */
+	public static String str(byte[] bytes, String charset) {
+		return str(bytes, isBlank(charset) ? Charset.defaultCharset() : Charset.forName(charset));
+	}
+
+	/**
+	 * 解码字节码
+	 * 
+	 * @param data 字符串
+	 * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
+	 * @return 解码后的字符串
+	 */
+	public static String str(byte[] data, Charset charset) {
+		if (data == null) {
+			return null;
+		}
+
+		if (null == charset) {
+			return new String(data);
+		}
+		return new String(data, charset);
+	}
+	
+	/**
+	 * 将编码的byteBuffer数据转换为字符串
+	 * @param data 数据
+	 * @param charset 字符集,如果为空使用当前系统字符集
+	 * @return 字符串
+	 */
+	public static String str(ByteBuffer data, String charset){
+		if(data == null) {
+			return null;
+		}
+		
+		return str(data, Charset.forName(charset));
+	}
+	
+	/**
+	 * 将编码的byteBuffer数据转换为字符串
+	 * @param data 数据
+	 * @param charset 字符集,如果为空使用当前系统字符集
+	 * @return 字符串
+	 */
+	public static String str(ByteBuffer data, Charset charset){
+		if(null == charset) {
+			charset = Charset.defaultCharset();
+		}
+		return charset.decode(data).toString();
+	}
+	
+	/**
+	 * 字符串转换为byteBuffer
+	 * @param str 字符串
+	 * @param charset 编码
+	 * @return byteBuffer
+	 */
+	public static ByteBuffer byteBuffer(String str, String charset) {
+		return ByteBuffer.wrap(StrKit.bytes(str, charset));
+	}
+
+	/**
+	 * 以 conjunction 为分隔符将多个对象转换为字符串
+	 * 
+	 * @param conjunction 分隔符
+	 * @param objs 数组
+	 * @return 连接后的字符串
+	 */
+	public static String join(String conjunction, Object... objs) {
+		StringBuilder sb = new StringBuilder();
+		boolean isFirst = true;
+		for (Object item : objs) {
+			if (isFirst) {
+				isFirst = false;
+			} else {
+				sb.append(conjunction);
+			}
+			sb.append(item);
+		}
+		return sb.toString();
+	}
+	
+	/**
+	 * 将驼峰式命名的字符串转换为下划线方式。如果转换前的驼峰式命名的字符串为空,则返回空字符串。</br>
+	 * 例如:HelloWorld->hello_world
+	 *
+	 * @param camelCaseStr 转换前的驼峰式命名的字符串
+	 * @return 转换后下划线大写方式命名的字符串
+	 */
+	public static String toUnderlineCase(String camelCaseStr) {
+		if (camelCaseStr == null) {
+			return null;
+		}
+
+		final int length = camelCaseStr.length();
+		StringBuilder sb = new StringBuilder();
+		char c;
+		boolean isPreUpperCase = false;
+		for (int i = 0; i < length; i++) {
+			c = camelCaseStr.charAt(i);
+			boolean isNextUpperCase = true;
+			if (i < (length - 1)) {
+				isNextUpperCase = Character.isUpperCase(camelCaseStr.charAt(i + 1));
+			}
+			if (Character.isUpperCase(c)) {
+				if (!isPreUpperCase || !isNextUpperCase) {
+					if (i > 0) sb.append(UNDERLINE);
+				}
+				isPreUpperCase = true;
+			} else {
+				isPreUpperCase = false;
+			}
+			sb.append(Character.toLowerCase(c));
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * 将下划线方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br>
+	 * 例如:hello_world->HelloWorld
+	 *
+	 * @param name 转换前的下划线大写方式命名的字符串
+	 * @return 转换后的驼峰式命名的字符串
+	 */
+	public static String toCamelCase(String name) {
+		if (name == null) {
+			return null;
+		}
+		if (name.contains(UNDERLINE)) {
+			name = name.toLowerCase();
+
+			StringBuilder sb = new StringBuilder(name.length());
+			boolean upperCase = false;
+			for (int i = 0; i < name.length(); i++) {
+				char c = name.charAt(i);
+
+				if (c == '_') {
+					upperCase = true;
+				} else if (upperCase) {
+					sb.append(Character.toUpperCase(c));
+					upperCase = false;
+				} else {
+					sb.append(c);
+				}
+			}
+			return sb.toString();
+		} else
+			return name;
+	}
+
+	/**
+	 * 包装指定字符串
+	 * 
+	 * @param str 被包装的字符串
+	 * @param prefix 前缀
+	 * @param suffix 后缀
+	 * @return 包装后的字符串
+	 */
+	public static String wrap(String str, String prefix, String suffix) {
+		return format("{}{}{}", prefix, str, suffix);
+	}
+
+	/**
+	 * 指定字符串是否被包装
+	 * 
+	 * @param str 字符串
+	 * @param prefix 前缀
+	 * @param suffix 后缀
+	 * @return 是否被包装
+	 */
+	public static boolean isWrap(String str, String prefix, String suffix) {
+		return str.startsWith(prefix) && str.endsWith(suffix);
+	}
+
+	/**
+	 * 指定字符串是否被同一字符包装(前后都有这些字符串)
+	 * 
+	 * @param str 字符串
+	 * @param wrapper 包装字符串
+	 * @return 是否被包装
+	 */
+	public static boolean isWrap(String str, String wrapper) {
+		return isWrap(str, wrapper, wrapper);
+	}
+
+	/**
+	 * 指定字符串是否被同一字符包装(前后都有这些字符串)
+	 * 
+	 * @param str 字符串
+	 * @param wrapper 包装字符
+	 * @return 是否被包装
+	 */
+	public static boolean isWrap(String str, char wrapper) {
+		return isWrap(str, wrapper, wrapper);
+	}
+
+	/**
+	 * 指定字符串是否被包装
+	 * 
+	 * @param str 字符串
+	 * @param prefixChar 前缀
+	 * @param suffixChar 后缀
+	 * @return 是否被包装
+	 */
+	public static boolean isWrap(String str, char prefixChar, char suffixChar) {
+		return str.charAt(0) == prefixChar && str.charAt(str.length() - 1) == suffixChar;
+	}
+
+	/**
+	 * 补充字符串以满足最小长度 StrUtil.padPre("1", 3, '0');//"001"
+	 * 
+	 * @param str 字符串
+	 * @param minLength 最小长度
+	 * @param padChar 补充的字符
+	 * @return 补充后的字符串
+	 */
+	public static String padPre(String str, int minLength, char padChar) {
+		if (str.length() >= minLength) {
+			return str;
+		}
+		StringBuilder sb = new StringBuilder(minLength);
+		for (int i = str.length(); i < minLength; i++) {
+			sb.append(padChar);
+		}
+		sb.append(str);
+		return sb.toString();
+	}
+
+	/**
+	 * 补充字符串以满足最小长度 StrUtil.padEnd("1", 3, '0');//"100"
+	 * 
+	 * @param str 字符串
+	 * @param minLength 最小长度
+	 * @param padChar 补充的字符
+	 * @return 补充后的字符串
+	 */
+	public static String padEnd(String str, int minLength, char padChar) {
+		if (str.length() >= minLength) {
+			return str;
+		}
+		StringBuilder sb = new StringBuilder(minLength);
+		sb.append(str);
+		for (int i = str.length(); i < minLength; i++) {
+			sb.append(padChar);
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * 创建StringBuilder对象
+	 * 
+	 * @return StringBuilder对象
+	 */
+	public static StringBuilder builder() {
+		return new StringBuilder();
+	}
+
+	/**
+	 * 创建StringBuilder对象
+	 * 
+	 * @return StringBuilder对象
+	 */
+	public static StringBuilder builder(int capacity) {
+		return new StringBuilder(capacity);
+	}
+
+	/**
+	 * 创建StringBuilder对象
+	 * 
+	 * @return StringBuilder对象
+	 */
+	public static StringBuilder builder(String... strs) {
+		final StringBuilder sb = new StringBuilder();
+		for (String str : strs) {
+			sb.append(str);
+		}
+		return sb;
+	}
+
+	/**
+	 * 获得StringReader
+	 * 
+	 * @param str 字符串
+	 * @return StringReader
+	 */
+	public static StringReader getReader(String str) {
+		return new StringReader(str);
+	}
+
+	/**
+	 * 获得StringWriter
+	 * 
+	 * @return StringWriter
+	 */
+	public static StringWriter getWriter() {
+		return new StringWriter();
+	}
+
+		/**
+	 * 编码字符串
+	 * 
+	 * @param str 字符串
+	 * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
+	 * @return 编码后的字节码
+	 */
+	public static byte[] encode(String str, String charset) {
+		if (str == null) {
+			return null;
+		}
+
+		if(isBlank(charset)) {
+			return str.getBytes();
+		}
+		try {
+			return str.getBytes(charset);
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(format("Charset [{}] unsupported!", charset));
+		}
+	}
+
+	/**
+	 * 解码字节码
+	 * 
+	 * @param data 字符串
+	 * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
+	 * @return 解码后的字符串
+	 */
+	public static String decode(byte[] data, String charset) {
+		if (data == null) {
+			return null;
+		}
+
+		if(isBlank(charset)) {
+			return new String(data);
+		}
+		try {
+			return new String(data, charset);
+		} catch (UnsupportedEncodingException e) {
+			throw new RuntimeException(format("Charset [{}] unsupported!", charset));
+		}
+	}
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/WafKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/WafKit.java
new file mode 100644
index 0000000..3af28f4
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/WafKit.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2011-2014, hubin (jobob@qq.com).
+ *
+ * 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.
+ */
+package com.stylefeng.guns.core.support;
+
+import java.util.regex.Pattern;
+
+/**
+ * Web防火墙工具类
+ * <p>
+ * @author   hubin
+ * @Date	 2014-5-8 	 
+ */
+public class WafKit {
+
+	/**
+	 * @Description 过滤XSS脚本内容
+	 * @param value
+	 * 				待处理内容
+	 * @return
+	 */
+	public static String stripXSS(String value) {
+		String rlt = null;
+
+		if (null != value) {
+			// NOTE: It's highly recommended to use the ESAPI library and uncomment the following line to
+			// avoid encoded attacks.
+			// value = ESAPI.encoder().canonicalize(value);
+
+			// Avoid null characters
+			rlt = value.replaceAll("", "");
+
+			// Avoid anything between script tags
+			Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
+			rlt = scriptPattern.matcher(rlt).replaceAll("");
+
+			// Avoid anything in a src='...' type of expression
+			/*scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE
+					| Pattern.MULTILINE | Pattern.DOTALL);
+			rlt = scriptPattern.matcher(rlt).replaceAll("");
+
+			scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE
+					| Pattern.MULTILINE | Pattern.DOTALL);
+			rlt = scriptPattern.matcher(rlt).replaceAll("");*/
+
+			// Remove any lonesome </script> tag
+			scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
+			rlt = scriptPattern.matcher(rlt).replaceAll("");
+
+			// Remove any lonesome <script ...> tag
+			scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE
+					| Pattern.MULTILINE | Pattern.DOTALL);
+			rlt = scriptPattern.matcher(rlt).replaceAll("");
+
+			// Avoid eval(...) expressions
+			scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE
+					| Pattern.MULTILINE | Pattern.DOTALL);
+			rlt = scriptPattern.matcher(rlt).replaceAll("");
+
+			// Avoid expression(...) expressions
+			scriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE
+					| Pattern.MULTILINE | Pattern.DOTALL);
+			rlt = scriptPattern.matcher(rlt).replaceAll("");
+
+			// Avoid javascript:... expressions
+			scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
+			rlt = scriptPattern.matcher(rlt).replaceAll("");
+
+			// Avoid vbscript:... expressions
+			scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
+			rlt = scriptPattern.matcher(rlt).replaceAll("");
+
+			// Avoid onload= expressions
+			scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE
+					| Pattern.MULTILINE | Pattern.DOTALL);
+			rlt = scriptPattern.matcher(rlt).replaceAll("");
+		}
+		
+		return rlt;
+	}
+
+	/**
+	 * @Description 过滤SQL注入内容
+	 * @param value
+	 * 				待处理内容
+	 * @return
+	 */
+	public static String stripSqlInjection(String value) {
+		return (null == value) ? null : value.replaceAll("('.+--)|(--)|(%7C)", ""); //value.replaceAll("('.+--)|(--)|(\\|)|(%7C)", "");
+	}
+
+	/**
+	 * @Description 过滤SQL/XSS注入内容
+	 * @param value
+	 * 				待处理内容
+	 * @return
+	 */
+	public static String stripSqlXSS(String value) {
+		return stripXSS(stripSqlInjection(value));
+	}
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/WafRequestWrapper.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/WafRequestWrapper.java
new file mode 100644
index 0000000..42a2e91
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/WafRequestWrapper.java
@@ -0,0 +1,149 @@
+/**
+ * Copyright (c) 2011-2014, hubin (jobob@qq.com).
+ *
+ * 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.
+ */
+package com.stylefeng.guns.core.support;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Request请求过滤包装
+ * <p>
+ * @author   hubin
+ * @Date	 2014-5-8 	 
+ */
+public class WafRequestWrapper extends HttpServletRequestWrapper {
+
+	private boolean filterXSS = true;
+
+	private boolean filterSQL = true;
+
+
+	public WafRequestWrapper(HttpServletRequest request, boolean filterXSS, boolean filterSQL) {
+		super(request);
+		this.filterXSS = filterXSS;
+		this.filterSQL = filterSQL;
+	}
+
+
+	public WafRequestWrapper(HttpServletRequest request) {
+		this(request, true, true);
+	}
+
+
+	/**
+	 * @Description 数组参数过滤
+	 * @param parameter
+	 * 				过滤参数
+	 * @return
+	 */
+	@Override
+	public String[] getParameterValues(String parameter) {
+		String[] values = super.getParameterValues(parameter);
+		if ( values == null ) {
+			return null;
+		}
+
+		int count = values.length;
+		String[] encodedValues = new String[count];
+		for ( int i = 0 ; i < count ; i++ ) {
+			encodedValues[i] = filterParamString(values[i]);
+		}
+
+		return encodedValues;
+	}
+
+	@Override
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	public Map getParameterMap() {
+		Map<String, String[]> primary = super.getParameterMap();
+		Map<String, String[]> result = new HashMap<String, String[]>(primary.size());
+		for ( Map.Entry<String, String[]> entry : primary.entrySet() ) {
+			result.put(entry.getKey(), filterEntryString(entry.getValue()));
+		}
+		return result;
+
+	}
+	
+	protected String[] filterEntryString(String[] rawValue) {
+		for ( int i = 0 ; i < rawValue.length ; i++ ) {
+			rawValue[i] = filterParamString(rawValue[i]);
+		}
+		return rawValue;
+	}
+
+	/**
+	 * @Description 参数过滤
+	 * @param parameter
+	 * 				过滤参数
+	 * @return
+	 */
+	@Override
+	public String getParameter(String parameter) {
+		return filterParamString(super.getParameter(parameter));
+	}
+
+
+	/**
+	 * @Description 请求头过滤 
+	 * @param name
+	 * 				过滤内容
+	 * @return
+	 */
+	@Override
+	public String getHeader(String name) {
+		return filterParamString(super.getHeader(name));
+	}
+
+
+	/**
+	 * @Description Cookie内容过滤
+	 * @return
+	 */
+	@Override
+	public Cookie[] getCookies() {
+		Cookie[] existingCookies = super.getCookies();
+		if (existingCookies != null) {
+			for (int i = 0 ; i < existingCookies.length ; ++i) {
+				Cookie cookie = existingCookies[i];
+				cookie.setValue(filterParamString(cookie.getValue()));
+			}
+		}
+		return existingCookies;
+	}
+
+	/**
+	 * @Description 过滤字符串内容
+	 * @param rawValue
+	 * 				待处理内容
+	 * @return
+	 */
+	protected String filterParamString(String rawValue) {
+		if (null == rawValue) {
+			return null;
+		}
+		String tmpStr = rawValue;
+		if (this.filterXSS) {
+			tmpStr = WafKit.stripXSS(rawValue);
+		}
+		if (this.filterSQL) {
+			tmpStr = WafKit.stripSqlInjection(tmpStr);
+		}
+		return tmpStr;
+	}
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/support/exception/ToolBoxException.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/exception/ToolBoxException.java
new file mode 100644
index 0000000..9580b7b
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/support/exception/ToolBoxException.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com).
+ *
+ * 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.
+ */
+package com.stylefeng.guns.core.support.exception;
+
+import com.stylefeng.guns.core.support.StrKit;
+
+/**
+ * 工具类初始化异常
+ */
+public class ToolBoxException extends RuntimeException{
+	private static final long serialVersionUID = 8247610319171014183L;
+
+	public ToolBoxException(Throwable e) {
+		super(e.getMessage(), e);
+	}
+	
+	public ToolBoxException(String message) {
+		super(message);
+	}
+	
+	public ToolBoxException(String messageTemplate, Object... params) {
+		super(StrKit.format(messageTemplate, params));
+	}
+	
+	public ToolBoxException(String message, Throwable throwable) {
+		super(message, throwable);
+	}
+	
+	public ToolBoxException(Throwable throwable, String messageTemplate, Object... params) {
+		super(StrKit.format(messageTemplate, params), throwable);
+	}
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/Convert.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/Convert.java
new file mode 100644
index 0000000..06558b4
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/Convert.java
@@ -0,0 +1,1060 @@
+package com.stylefeng.guns.core.util;
+
+import com.stylefeng.guns.core.support.*;
+import com.stylefeng.guns.core.support.exception.ToolBoxException;
+
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.charset.Charset;
+import java.text.NumberFormat;
+import java.util.Date;
+import java.util.Set;
+
+
+/**
+ * 类型转换器
+ * 
+ * @author xiaoleilu
+ * 
+ */
+public class Convert {
+	
+
+	private Convert() {
+		// 静态类不可实例化
+	}
+
+	/**
+	 * 强制转换类型
+	 * 
+	 * @param clazz 被转换成的类型
+	 * @param value 需要转换的对象
+	 * @return 转换后的对象
+	 */
+	public static Object parse(Class<?> clazz, Object value) {
+		try {
+			if (clazz.isAssignableFrom(String.class)) {
+				// ----2016-12-19---zhuangqian----防止beetlsql对空字符串不检测导致无法入库的问题----
+				if (StrKit.isBlank(String.valueOf(value)))
+					return " ";
+				else
+					return String.valueOf(value);
+			}
+			return clazz.cast(value);
+		} catch (ClassCastException e) {
+			String valueStr = String.valueOf(value);
+
+			Object result = parseBasic(clazz, valueStr);
+			if (result != null) {
+				return result;
+			}
+
+			if (Date.class.isAssignableFrom(clazz)) {
+				// 判断标准日期
+				// ----2016-11-24---zhuangqian----需要加toDate(),不然beetlsql转换date类型的时候会报错----
+				return DateTimeKit.parse(valueStr).toDate();
+			} else if (clazz == BigInteger.class) {
+				// 数学计算数字
+				return new BigInteger(valueStr);
+			} else if (clazz == BigDecimal.class) {
+				// 数学计算数字
+				return new BigDecimal(valueStr);
+			} else if (clazz == byte[].class) {
+				// 流,由于有字符编码问题,在此使用系统默认
+				return valueStr.getBytes();
+			}
+			// 未找到可转换的类型,返回原值
+			return (StrKit.isBlank(valueStr)) ? null : value;
+		}
+	}
+
+	/**
+	 * 转换基本类型<br>
+	 * 将字符串转换为原始类型或包装类型
+	 * 
+	 * @param clazz 转换到的类,可以是原始类型类,也可以是包装类型类
+	 * @param valueStr 被转换的字符串
+	 * @return 转换后的对象,如果非基本类型,返回null
+	 */
+	public static Object parseBasic(Class<?> clazz, String valueStr) {
+		if (null == clazz || null == valueStr) {
+			return null;
+		}
+
+		if (StrKit.isBlank(valueStr)) return null;
+		
+		BasicType basicType = null;
+		try {
+			basicType = BasicType.valueOf(clazz.getSimpleName().toUpperCase());
+		} catch (Exception e) {
+			// 非基本类型数据
+			return null;
+		}
+
+		switch (basicType) {
+			case BYTE:
+				if (clazz == byte.class) {
+					return Byte.parseByte(valueStr);
+				}
+				return Byte.valueOf(valueStr);
+			case SHORT:
+				if (clazz == short.class) {
+					return Short.parseShort(valueStr);
+				}
+				return Short.valueOf(valueStr);
+			case INT:
+				return Integer.parseInt(valueStr);
+			case INTEGER:
+				return Integer.valueOf(valueStr);
+			case LONG:
+				if (clazz == long.class) {
+					return new BigDecimal(valueStr).longValue();
+				}
+				return Long.valueOf(valueStr);
+			case DOUBLE:
+				if (clazz == double.class) {
+					return new BigDecimal(valueStr).doubleValue();
+				}
+			case FLOAT:
+				if (clazz == float.class) {
+					return Float.parseFloat(valueStr);
+				}
+				return Float.valueOf(valueStr);
+			case BOOLEAN:
+				if (clazz == boolean.class) {
+					return Boolean.parseBoolean(valueStr);
+				}
+				return Boolean.valueOf(valueStr);
+			case CHAR:
+				return valueStr.charAt(0);
+			case CHARACTER:
+				return Character.valueOf(valueStr.charAt(0));
+			default:
+				return null;
+		}
+	}
+
+	/**
+	 * 转换为字符串<br>
+	 * 如果给定的值为null,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static String toStr(Object value, String defaultValue) {
+		if (null == value) {
+			return defaultValue;
+		}
+		if (value instanceof String) {
+			return (String) value;
+		} else if (CollectionKit.isArray(value)) {
+			return CollectionKit.toString(value);
+		}
+		return value.toString();
+	}
+
+	/**
+	 * 转换为字符串<br>
+	 * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static String toStr(Object value) {
+		return toStr(value, null);
+	}
+
+	/**
+	 * 转换为字符<br>
+	 * 如果给定的值为null,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static Character toChar(Object value, Character defaultValue) {
+		if (null == value) {
+			return defaultValue;
+		}
+		if (value instanceof Character) {
+			return (Character) value;
+		}
+
+		final String valueStr = toStr(value, null);
+		return StrKit.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
+	}
+
+	/**
+	 * 转换为字符<br>
+	 * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static Character toChar(Object value) {
+		return toChar(value, null);
+	}
+
+	/**
+	 * 转换为byte<br>
+	 * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static Byte toByte(Object value, Byte defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (value instanceof Byte) {
+			return (Byte) value;
+		}
+		if (value instanceof Number) {
+			return ((Number) value).byteValue();
+		}
+		final String valueStr = toStr(value, null);
+		if (StrKit.isBlank(valueStr)) {
+			return defaultValue;
+		}
+		try {
+			return Byte.parseByte(valueStr);
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为byte<br>
+	 * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static Byte toByte(Object value) {
+		return toByte(value, null);
+	}
+
+	/**
+	 * 转换为Short<br>
+	 * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static Short toShort(Object value, Short defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (value instanceof Short) {
+			return (Short) value;
+		}
+		if (value instanceof Number) {
+			return ((Number) value).shortValue();
+		}
+		final String valueStr = toStr(value, null);
+		if (StrKit.isBlank(valueStr)) {
+			return defaultValue;
+		}
+		try {
+			return Short.parseShort(valueStr.trim());
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为Short<br>
+	 * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static Short toShort(Object value) {
+		return toShort(value, null);
+	}
+
+	/**
+	 * 转换为Number<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static Number toNumber(Object value, Number defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (value instanceof Number) {
+			return (Number) value;
+		}
+		final String valueStr = toStr(value, null);
+		if (StrKit.isBlank(valueStr)) {
+			return defaultValue;
+		}
+		try {
+			return NumberFormat.getInstance().parse(valueStr);
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为Number<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static Number toNumber(Object value) {
+		return toNumber(value, null);
+	}
+
+	/**
+	 * 转换为int<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static Integer toInt(Object value, Integer defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (value instanceof Integer) {
+			return (Integer) value;
+		}
+		if (value instanceof Number) {
+			return ((Number) value).intValue();
+		}
+		final String valueStr = toStr(value, null);
+		if (StrKit.isBlank(valueStr)) {
+			return defaultValue;
+		}
+		try {
+			return Integer.parseInt(valueStr.trim());
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为int<br>
+	 * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static Integer toInt(Object value) {
+		return toInt(value, null);
+	}
+
+	/**
+	 * 转换为Integer数组<br>
+	 * 
+	 * @param isIgnoreConvertError 是否忽略转换错误,忽略则给值null
+	 * @param values 被转换的值
+	 * @return 结果
+	 */
+	public static Integer[] toIntArray(boolean isIgnoreConvertError, Object... values) {
+		if (CollectionKit.isEmpty(values)) {
+			return new Integer[] {};
+		}
+		final Integer[] ints = new Integer[values.length];
+		for (int i = 0; i < values.length; i++) {
+			final Integer v = toInt(values[i], null);
+			if (null == v && isIgnoreConvertError == false) {
+				throw new ToolBoxException(StrKit.format("Convert [{}] to Integer error!", values[i]));
+			}
+			ints[i] = v;
+		}
+		return ints;
+	}
+	
+	
+	/**
+	 * 转换为Integer数组<br>
+	 * 
+	 * @param split 被转换的值
+	 * @return 结果
+	 */
+	public static Integer[] toIntArray(String str) {
+		return toIntArray(",", str);
+	}
+	
+	/**
+	 * 转换为Integer数组<br>
+	 * 
+	 * @param split 分隔符
+	 * @param split 被转换的值
+	 * @return 结果
+	 */
+	public static Integer[] toIntArray(String split, String str) {
+		if (StrKit.isEmpty(str)) {
+			return new Integer[] {};
+		}
+		String[] arr = str.split(split);
+		final Integer[] ints = new Integer[arr.length];
+		for (int i = 0; i < arr.length; i++) {
+			final Integer v = toInt(arr[i], 0);
+			ints[i] = v;
+		}
+		return ints;
+	}
+	
+	/**
+	 * 转换为String数组<br>
+	 * 
+	 * @param split 被转换的值
+	 * @return 结果
+	 */
+	public static String[] toStrArray(String str) {
+		return toStrArray("", str);
+	}
+	
+	/**
+	 * 转换为String数组<br>
+	 * 
+	 * @param split 分隔符
+	 * @param split 被转换的值
+	 * @return 结果
+	 */
+	public static String[] toStrArray(String split, String str) {
+		return str.split(split);
+	}
+
+	/**
+	 * 转换为long<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static Long toLong(Object value, Long defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (value instanceof Long) {
+			return (Long) value;
+		}
+		if (value instanceof Number) {
+			return ((Number) value).longValue();
+		}
+		final String valueStr = toStr(value, null);
+		if (StrKit.isBlank(valueStr)) {
+			return defaultValue;
+		}
+		try {
+			// 支持科学计数法
+			return new BigDecimal(valueStr.trim()).longValue();
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为long<br>
+	 * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static Long toLong(Object value) {
+		return toLong(value, null);
+	}
+
+	/**
+	 * 转换为Long数组<br>
+	 * 
+	 * @param isIgnoreConvertError 是否忽略转换错误,忽略则给值null
+	 * @param values 被转换的值
+	 * @return 结果
+	 */
+	public static Long[] toLongArray(boolean isIgnoreConvertError, Object... values) {
+		if (CollectionKit.isEmpty(values)) {
+			return new Long[] {};
+		}
+		final Long[] longs = new Long[values.length];
+		for (int i = 0; i < values.length; i++) {
+			final Long v = toLong(values[i], null);
+			if (null == v && isIgnoreConvertError == false) {
+				throw new ToolBoxException(StrKit.format("Convert [{}] to Long error!", values[i]));
+			}
+			longs[i] = v;
+		}
+		return longs;
+	}
+
+	/**
+	 * 转换为double<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static Double toDouble(Object value, Double defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (value instanceof Double) {
+			return (Double) value;
+		}
+		if (value instanceof Number) {
+			return ((Number) value).doubleValue();
+		}
+		final String valueStr = toStr(value, null);
+		if (StrKit.isBlank(valueStr)) {
+			return defaultValue;
+		}
+		try {
+			// 支持科学计数法
+			return new BigDecimal(valueStr.trim()).doubleValue();
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为double<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static Double toDouble(Object value) {
+		return toDouble(value, null);
+	}
+
+	/**
+	 * 转换为Double数组<br>
+	 * 
+	 * @param isIgnoreConvertError 是否忽略转换错误,忽略则给值null
+	 * @param values 被转换的值
+	 * @return 结果
+	 */
+	public static Double[] toDoubleArray(boolean isIgnoreConvertError, Object... values) {
+		if (CollectionKit.isEmpty(values)) {
+			return new Double[] {};
+		}
+		final Double[] doubles = new Double[values.length];
+		for (int i = 0; i < values.length; i++) {
+			final Double v = toDouble(values[i], null);
+			if (null == v && isIgnoreConvertError == false) {
+				throw new ToolBoxException(StrKit.format("Convert [{}] to Double error!", values[i]));
+			}
+			doubles[i] = v;
+		}
+		return doubles;
+	}
+
+	/**
+	 * 转换为Float<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static Float toFloat(Object value, Float defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (value instanceof Float) {
+			return (Float) value;
+		}
+		if (value instanceof Number) {
+			return ((Number) value).floatValue();
+		}
+		final String valueStr = toStr(value, null);
+		if (StrKit.isBlank(valueStr)) {
+			return defaultValue;
+		}
+		try {
+			return Float.parseFloat(valueStr.trim());
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为Float<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static Float toFloat(Object value) {
+		return toFloat(value, null);
+	}
+
+	/**
+	 * 转换为Float数组<br>
+	 * 
+	 * @param isIgnoreConvertError 是否忽略转换错误,忽略则给值null
+	 * @param values 被转换的值
+	 * @return 结果
+	 */
+	public static <T> Float[] toFloatArray(boolean isIgnoreConvertError, Object... values) {
+		if (CollectionKit.isEmpty(values)) {
+			return new Float[] {};
+		}
+		final Float[] floats = new Float[values.length];
+		for (int i = 0; i < values.length; i++) {
+			final Float v = toFloat(values[i], null);
+			if (null == v && isIgnoreConvertError == false) {
+				throw new ToolBoxException(StrKit.format("Convert [{}] to Float error!", values[i]));
+			}
+			floats[i] = v;
+		}
+		return floats;
+	}
+
+	/**
+	 * 转换为boolean<br>
+	 * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static Boolean toBool(Object value, Boolean defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (value instanceof Boolean) {
+			return (Boolean) value;
+		}
+		String valueStr = toStr(value, null);
+		if (StrKit.isBlank(valueStr)) {
+			return defaultValue;
+		}
+		valueStr = valueStr.trim().toLowerCase();
+		switch (valueStr) {
+			case "true":
+				return true;
+			case "false":
+				return false;
+			case "yes":
+				return true;
+			case "ok":
+				return true;
+			case "no":
+				return false;
+			case "1":
+				return true;
+			case "0":
+				return false;
+			default:
+				return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为boolean<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static Boolean toBool(Object value) {
+		return toBool(value, null);
+	}
+
+	/**
+	 * 转换为Boolean数组<br>
+	 * 
+	 * @param isIgnoreConvertError 是否忽略转换错误,忽略则给值null
+	 * @param values 被转换的值
+	 * @return 结果
+	 */
+	public static Boolean[] toBooleanArray(boolean isIgnoreConvertError, Object... values) {
+		if (CollectionKit.isEmpty(values)) {
+			return new Boolean[] {};
+		}
+		final Boolean[] bools = new Boolean[values.length];
+		for (int i = 0; i < values.length; i++) {
+			final Boolean v = toBool(values[i], null);
+			if (null == v && isIgnoreConvertError == false) {
+				throw new ToolBoxException(StrKit.format("Convert [{}] to Boolean error!", values[i]));
+			}
+			bools[i] = v;
+		}
+		return bools;
+	}
+
+	/**
+	 * 转换为Enum对象<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<br>
+	 * 
+	 * @param clazz Enum的Class
+	 * @param value 值
+	 * @param defaultValue 默认值
+	 * @return Enum
+	 */
+	public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value, E defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (clazz.isAssignableFrom(value.getClass())) {
+			@SuppressWarnings("unchecked")
+			E myE = (E) value;
+			return myE;
+		}
+		final String valueStr = toStr(value, null);
+		if (StrKit.isBlank(valueStr)) {
+			return defaultValue;
+		}
+		try {
+			return Enum.valueOf(clazz, valueStr);
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为Enum对象<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+	 * 
+	 * @param clazz Enum的Class
+	 * @param value 值
+	 * @return Enum
+	 */
+	public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value) {
+		return toEnum(clazz, value, null);
+	}
+
+	/**
+	 * 转换为BigInteger<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static BigInteger toBigInteger(Object value, BigInteger defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (value instanceof BigInteger) {
+			return (BigInteger) value;
+		}
+		if (value instanceof Long) {
+			return BigInteger.valueOf((Long) value);
+		}
+		final String valueStr = toStr(value, null);
+		if (StrKit.isBlank(valueStr)) {
+			return defaultValue;
+		}
+		try {
+			return new BigInteger(valueStr);
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为BigInteger<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static BigInteger toBigInteger(Object value) {
+		return toBigInteger(value, null);
+	}
+
+	/**
+	 * 转换为BigDecimal<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (value instanceof BigDecimal) {
+			return (BigDecimal) value;
+		}
+		if (value instanceof Long) {
+			return new BigDecimal((Long) value);
+		}
+		if (value instanceof Double) {
+			return new BigDecimal((Double) value);
+		}
+		if (value instanceof Integer) {
+			return new BigDecimal((Integer) value);
+		}
+		final String valueStr = toStr(value, null);
+		if (StrKit.isBlank(valueStr)) {
+			return defaultValue;
+		}
+		try {
+			return new BigDecimal(valueStr);
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为BigDecimal<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @return 结果
+	 */
+	public static BigDecimal toBigDecimal(Object value) {
+		return toBigDecimal(value, null);
+	}
+
+	// ----------------------------------------------------------------------- 全角半角转换
+	/**
+	 * 半角转全角
+	 * 
+	 * @param input String.
+	 * @return 全角字符串.
+	 */
+	public static String toSBC(String input) {
+		return toSBC(input, null);
+	}
+
+	/**
+	 * 半角转全角
+	 * 
+	 * @param input String
+	 * @param notConvertSet 不替换的字符集合
+	 * @return 全角字符串.
+	 */
+	public static String toSBC(String input, Set<Character> notConvertSet) {
+		char c[] = input.toCharArray();
+		for (int i = 0; i < c.length; i++) {
+			if (null != notConvertSet && notConvertSet.contains(c[i])) {
+				// 跳过不替换的字符
+				continue;
+			}
+
+			if (c[i] == ' ') {
+				c[i] = '\u3000';
+			} else if (c[i] < '\177') {
+				c[i] = (char) (c[i] + 65248);
+
+			}
+		}
+		return new String(c);
+	}
+
+	/**
+	 * 全角转半角
+	 * 
+	 * @param input String.
+	 * @return 半角字符串
+	 */
+	public static String toDBC(String input) {
+		return toDBC(input, null);
+	}
+
+	/**
+	 * 替换全角为半角
+	 * 
+	 * @param text 文本
+	 * @param notConvertSet 不替换的字符集合
+	 * @return 替换后的字符
+	 */
+	public static String toDBC(String text, Set<Character> notConvertSet) {
+		char c[] = text.toCharArray();
+		for (int i = 0; i < c.length; i++) {
+			if (null != notConvertSet && notConvertSet.contains(c[i])) {
+				// 跳过不替换的字符
+				continue;
+			}
+
+			if (c[i] == '\u3000') {
+				c[i] = ' ';
+			} else if (c[i] > '\uFF00' && c[i] < '\uFF5F') {
+				c[i] = (char) (c[i] - 65248);
+			}
+		}
+		String returnString = new String(c);
+
+		return returnString;
+	}
+
+	// --------------------------------------------------------------------- hex
+	/**
+	 * 字符串转换成十六进制字符串
+	 * 
+	 * @param str 待转换的ASCII字符串
+	 * @return 16进制字符串
+	 */
+	public static String toHex(String str) {
+		return HexKit.encodeHexStr(str.getBytes());
+	}
+
+	/**
+	 * byte数组转16进制串
+	 * 
+	 * @param bytes 被转换的byte数组
+	 * @return 转换后的值
+	 */
+	public static String toHex(byte[] bytes) {
+		return HexKit.encodeHexStr(bytes);
+	}
+
+	/**
+	 * Hex字符串转换为Byte值
+	 * 
+	 * @param src Byte字符串,每个Byte之间没有分隔符
+	 * @return byte[]
+	 */
+	public static byte[] hexToBytes(String src) {
+		return HexKit.decodeHex(src.toCharArray());
+	}
+
+	/**
+	 * 十六进制转换字符串
+	 * 
+	 * @param hexStr Byte字符串(Byte之间无分隔符 如:[616C6B])
+	 * @param charset 编码 {@link Charset}
+	 * @return 对应的字符串
+	 */
+	public static String hexStrToStr(String hexStr, Charset charset) {
+		return HexKit.decodeHexStr(hexStr, charset);
+	}
+
+	/**
+	 * String的字符串转换成unicode的String
+	 * 
+	 * @param strText 全角字符串
+	 * @return String 每个unicode之间无分隔符
+	 * @throws Exception
+	 */
+	public static String strToUnicode(String strText) throws Exception {
+		char c;
+		StringBuilder str = new StringBuilder();
+		int intAsc;
+		String strHex;
+		for (int i = 0; i < strText.length(); i++) {
+			c = strText.charAt(i);
+			intAsc = (int) c;
+			strHex = Integer.toHexString(intAsc);
+			if (intAsc > 128)
+				str.append("\\u" + strHex);
+			else // 低位在前面补00
+				str.append("\\u00" + strHex);
+		}
+		return str.toString();
+	}
+
+	/**
+	 * unicode的String转换成String的字符串
+	 * 
+	 * @param hex 16进制值字符串 (一个unicode为2byte)
+	 * @return String 全角字符串
+	 */
+	public static String unicodeToStr(String hex) {
+		int t = hex.length() / 6;
+		StringBuilder str = new StringBuilder();
+		for (int i = 0; i < t; i++) {
+			String s = hex.substring(i * 6, (i + 1) * 6);
+			// 高位需要补上00再转
+			String s1 = s.substring(2, 4) + "00";
+			// 低位直接转
+			String s2 = s.substring(4);
+			// 将16进制的string转为int
+			int n = Integer.valueOf(s1, 16) + Integer.valueOf(s2, 16);
+			// 将int转换为字符
+			char[] chars = Character.toChars(n);
+			str.append(new String(chars));
+		}
+		return str.toString();
+	}
+
+	/**
+	 * 给定字符串转换字符编码<br/>
+	 * 如果参数为空,则返回原字符串,不报错。
+	 * 
+	 * @param str 被转码的字符串
+	 * @param sourceCharset 原字符集
+	 * @param destCharset 目标字符集
+	 * @return 转换后的字符串
+	 */
+	public static String convertCharset(String str, String sourceCharset, String destCharset) {
+		if (StrKit.hasBlank(str, sourceCharset, destCharset)) {
+			return str;
+		}
+
+		try {
+			return new String(str.getBytes(sourceCharset), destCharset);
+		} catch (UnsupportedEncodingException e) {
+			return str;
+		}
+	}
+
+	/**
+	 * 数字金额大写转换 先写个完整的然后将如零拾替换成零
+	 * 
+	 * @param n 数字
+	 * @return 中文大写数字
+	 */
+	public static String digitUppercase(double n) {
+		String fraction[] = { "角", "分" };
+		String digit[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
+		String unit[][] = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } };
+
+		String head = n < 0 ? "负" : "";
+		n = Math.abs(n);
+
+		String s = "";
+		for (int i = 0; i < fraction.length; i++) {
+			s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
+		}
+		if (s.length() < 1) {
+			s = "整";
+		}
+		int integerPart = (int) Math.floor(n);
+
+		for (int i = 0; i < unit[0].length && integerPart > 0; i++) {
+			String p = "";
+			for (int j = 0; j < unit[1].length && n > 0; j++) {
+				p = digit[integerPart % 10] + unit[1][j] + p;
+				integerPart = integerPart / 10;
+			}
+			s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
+		}
+		return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
+	}
+	
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/DateUtil.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/DateUtil.java
new file mode 100644
index 0000000..9dbcdab
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/DateUtil.java
@@ -0,0 +1,353 @@
+/**
+ * Copyright (c) 2015-2016, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package com.stylefeng.guns.core.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class DateUtil {
+
+    private static TimeZone tz = TimeZone.getTimeZone("GMT+8");
+
+    /**
+     * 获取YYYY格式
+     */
+    public static String getYear() {
+        return formatDate(new Date(), "yyyy");
+    }
+
+    /**
+     * 获取YYYY格式
+     */
+    public static String getYear(Date date) {
+        return formatDate(date, "yyyy");
+    }
+
+    /**
+     * 获取YYYY-MM-DD格式
+     */
+    public static String getDay() {
+        return formatDate(new Date(), "yyyy-MM-dd");
+    }
+
+    /**
+     * 获取YYYY-MM-DD格式
+     */
+    public static String getDay(Date date) {
+        return formatDate(date, "yyyy-MM-dd");
+    }
+
+    /**
+     * 获取YYYYMMDD格式
+     */
+    public static String getDays() {
+        return formatDate(new Date(), "yyyyMMdd");
+    }
+
+    /**
+     * 获取YYYYMMDD格式
+     */
+    public static String getDays(Date date) {
+        return formatDate(date, "yyyyMMdd");
+    }
+
+    /**
+     * 获取YYYY-MM-DD HH:mm:ss格式
+     */
+    public static String getTime() {
+        return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
+    }
+
+    /**
+     * 获取YYYY-MM-DD HH:mm:ss.SSS格式
+     */
+    public static String getMsTime() {
+        return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss.SSS");
+    }
+
+    /**
+     * 获取YYYYMMDDHHmmss格式
+     */
+    public static String getAllTime() {
+        return formatDate(new Date(), "yyyyMMddHHmmss");
+    }
+
+    /**
+     * 获取YYYY-MM-DD HH:mm:ss格式
+     */
+    public static String getTime(Date date) {
+        return formatDate(date, "yyyy-MM-dd HH:mm:ss");
+    }
+
+    public static String formatDate(Date date, String pattern) {
+        String formatDate = null;
+        if (StringUtils.isNotBlank(pattern)) {
+            formatDate = DateFormatUtils.format(date, pattern);
+        } else {
+            formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
+        }
+        return formatDate;
+    }
+
+    /**
+     * 日期比较,如果s>=e 返回true 否则返回false)
+     *
+     * @author luguosui
+     */
+    public static boolean compareDate(String s, String e) {
+        if (parseDate(s) == null || parseDate(e) == null) {
+            return false;
+        }
+        return parseDate(s).getTime() >= parseDate(e).getTime();
+    }
+
+    /**
+     * 格式化日期
+     */
+    public static Date parseDate(String date) {
+        return parse(date, "yyyy-MM-dd");
+    }
+
+    /**
+     * 格式化日期
+     */
+    public static Date parseTimeMinutes(String date) {
+        return parse(date, "yyyy-MM-dd HH:mm");
+    }
+
+    /**
+     * 格式化日期
+     */
+    public static Date parseTime(String date) {
+        return parse(date, "yyyy-MM-dd HH:mm:ss");
+    }
+
+    /**
+     * 格式化日期
+     */
+    public static Date parse(String date, String pattern) {
+        try {
+            return DateUtils.parseDate(date, pattern);
+        } catch (ParseException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 格式化日期
+     */
+    public static String format(Date date, String pattern) {
+        return DateFormatUtils.format(date, pattern);
+    }
+
+    /**
+     * 把日期转换为Timestamp
+     */
+    public static Timestamp format(Date date) {
+        return new Timestamp(date.getTime());
+    }
+
+    /**
+     * 校验日期是否合法
+     */
+    public static boolean isValidDate(String s) {
+        return parse(s, "yyyy-MM-dd HH:mm:ss") != null;
+    }
+
+    /**
+     * 校验日期是否合法
+     */
+    public static boolean isValidDate(String s, String pattern) {
+        return parse(s, pattern) != null;
+    }
+
+    public static int getDiffYear(String startTime, String endTime) {
+        DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            int years = (int) (((fmt.parse(endTime).getTime() - fmt.parse(
+                    startTime).getTime()) / (1000 * 60 * 60 * 24)) / 365);
+            return years;
+        } catch (Exception e) {
+            // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
+            return 0;
+        }
+    }
+
+    /**
+     * <li>功能描述:时间相减得到天数
+     */
+    public static long getDaySub(String beginDateStr, String endDateStr) {
+        long day = 0;
+        SimpleDateFormat format = new SimpleDateFormat(
+                "yyyy-MM-dd");
+        Date beginDate = null;
+        Date endDate = null;
+
+        try {
+            beginDate = format.parse(beginDateStr);
+            endDate = format.parse(endDateStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        day = (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
+        // System.out.println("相隔的天数="+day);
+
+        return day;
+    }
+
+    /**
+     * 得到n天之后的日期
+     */
+    public static Date getAfterDayDate(Integer daysInt) {
+
+        Calendar canlendar = Calendar.getInstance(); // java.util包
+        canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动
+        Date date = canlendar.getTime();
+
+        SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String dateStr = sdfd.format(date);
+
+        return date;
+    }
+    /**
+     * 得到n天之后的日期
+     */
+    public static String getAfterDayDate(String days, String pattern) {
+        int daysInt = Integer.parseInt(days);
+
+        Calendar canlendar = Calendar.getInstance(); // java.util包
+        canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动
+        Date date = canlendar.getTime();
+
+        SimpleDateFormat sdfd = new SimpleDateFormat(pattern == null ? "yyyy-MM-dd HH:mm:ss" : "yyyy-MM-dd");
+        String dateStr = sdfd.format(date);
+
+        return dateStr;
+    }
+
+    /**
+     * 得到n天之后是周几
+     */
+    public static String getAfterDayWeek(String days) {
+        int daysInt = Integer.parseInt(days);
+
+        Calendar canlendar = Calendar.getInstance(); // java.util包
+        canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动
+        Date date = canlendar.getTime();
+
+        SimpleDateFormat sdf = new SimpleDateFormat("E");
+        String dateStr = sdf.format(date);
+
+        return dateStr;
+    }
+
+    /**
+     * 得到系统日期
+     *
+     * @return
+     */
+    public static Date getDate() {
+        TimeZone.setDefault(tz);
+        return new Date();
+    }
+
+    /**
+     * 字符串日期转Date yyyy-MM-dd HH:mm:ss
+     * @param dateStr
+     * @return
+     */
+    public static Date getDate_str3(String dateStr) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        sdf.setTimeZone(tz);
+        if ("".equals(dateStr)) {
+            dateStr = sdf.format(DateUtil.getDate());
+        }
+        Date date = null;
+        try {
+            date = sdf.parse(dateStr);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return date;
+    }
+
+    /**
+     * 获取当前毫秒数
+     * @return long
+     */
+    public static long getCurMilli() {
+        long millisecond = 0;
+        Calendar cal = Calendar.getInstance();
+        millisecond = cal.getTimeInMillis();
+        return millisecond;
+    }
+
+    /**
+     * 毫秒转Date
+     * @param dateStr
+     * @return
+     */
+    public static Date getDate_strYMdHms(Long dateStr) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        if (dateStr == null) {
+            dateStr = DateUtil.getCurMilli();
+        }
+        Date date = null;
+        try {
+            date = sdf.parse(sdf.format(new Date(dateStr)));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return date;
+    }
+
+    /**
+     * 得到系统Calendar日期
+     * @return
+     */
+    public static Calendar getCalendar() {
+        TimeZone.setDefault(tz);
+        Calendar cal = Calendar.getInstance();
+        return cal;
+    }
+
+    /**
+     *
+     * 获取之前几天日期
+     * @param pattern yyyy-MM-dd(默认)
+     * @param few 之前几天
+     */
+    public static String beforeFewDayStr(String pattern, Integer few) {
+
+        if(pattern == null || "".equals(pattern)){
+            pattern = "yyyy-MM-dd";
+        }
+        Calendar c = getCalendar();
+        c.add(Calendar.DATE,-few);
+        return new SimpleDateFormat(pattern).format(c.getTime());
+    }
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/ExcelExportUtil.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/ExcelExportUtil.java
new file mode 100644
index 0000000..ed88e82
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/ExcelExportUtil.java
@@ -0,0 +1,271 @@
+package com.stylefeng.guns.core.util;
+
+import org.apache.poi.hssf.usermodel.HSSFCellStyle;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddress;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.List;
+
+/**
+ * Excel报表导出工具类
+ */
+public class ExcelExportUtil {
+
+	/**
+	 * 简单模板excel导出功能
+	 * @param fileName 报表文件名
+	 * @param sheetName 报表表名
+	 * @param dataList 报表数据(包含行头和列内容)
+	 * @param request
+	 * @param response
+	 * @throws IOException
+	 */
+	public static void easySheet(String fileName, String sheetName, List<List<String>> dataList, HttpServletRequest request, HttpServletResponse response) throws IOException {
+		//设置响应头,输出文件
+		setResponseHeader(response, fileName);
+
+		HSSFWorkbook  workbook = new HSSFWorkbook();
+		Sheet sheet = null;
+
+		HSSFCellStyle style = workbook.createCellStyle();
+		// 创建字体对象
+		Font ztFont = workbook.createFont();
+		ztFont.setItalic(true);                     // 设置字体为斜体字
+		ztFont.setColor(Font.COLOR_RED);            // 将字体设置为“红色”
+		ztFont.setFontHeightInPoints((short)22);    // 将字体大小设置为18px
+		ztFont.setFontName("华文行楷");             // 将“华文行楷”字体应用到当前单元格上
+		ztFont.setUnderline(Font.U_DOUBLE);         // 添加(Font.U_SINGLE单条下划线/Font.U_DOUBLE双条下划线)
+		style.setFont(ztFont);                    // 将字体应用到样式上面
+
+//		// 设置单元格边框样式
+//		style.setBorderBottom(CellStyle.BORDER_THICK);
+//		style.setBorderTop(CellStyle.BORDER_DASHED);
+//		style.setBorderLeft(CellStyle.BORDER_DOUBLE);
+//		style.setBorderRight(CellStyle.BORDER_THIN);
+//
+//		// 设置单元格边框颜色
+//		style.setBottomBorderColor(HSSFColor.ORANGE.index);
+//		style.setTopBorderColor(HSSFColor.ORANGE.index);
+//		style.setLeftBorderColor(HSSFColor.ORANGE.index);
+//
+//		style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
+//		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
+//		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
+//
+//		// 设置单元格内容垂直对其方式
+//		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
+		sheet = workbook.createSheet(sheetName);//设置表明
+		sheet.setDefaultColumnWidth(15);//setColumnWidth设置cell的宽度
+		sheet.setDefaultRowHeightInPoints(20);
+
+		//填充报表数据
+		for (int y = 0; y < dataList.size(); y++) {
+			List<String> cellList = dataList.get(y);
+			Row row = sheet.createRow(y);
+			for (int x = 0; x < cellList.size(); x++) {
+				row.createCell(x).setCellValue(cellList.get(x));
+			}
+		}
+
+		OutputStream outStream = response.getOutputStream();
+		try {
+			workbook.write(outStream);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		outStream.flush();
+		outStream.close();
+	}
+
+	/**
+	 * 复杂杂模板excel导出(合并单元格、设置表格样式等)
+	 * @param request
+	 * @param response
+	 * @throws IOException
+	 */
+	public static void carSheet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+		HSSFWorkbook  workbook = new HSSFWorkbook();
+		Sheet sheet = null;
+		HSSFCellStyle style = workbook.createCellStyle();
+		/** 创建字体对象   */
+		Font ztFont = workbook.createFont();
+		ztFont.setItalic(true);                     // 设置字体为斜体字
+		ztFont.setColor(Font.COLOR_RED);            // 将字体设置为“红色”
+		ztFont.setFontHeightInPoints((short)22);    // 将字体大小设置为18px
+		ztFont.setFontName("华文行楷");             // 将“华文行楷”字体应用到当前单元格上
+		ztFont.setUnderline(Font.U_DOUBLE);         // 添加(Font.U_SINGLE单条下划线/Font.U_DOUBLE双条下划线)
+		//ztFont.setStrikeout(true);                  // 是否添加删除线
+		style.setFont(ztFont);                    // 将字体应用到样式上面
+		//ztCell.setCellStyle(ztStyle);               // 样式应用到该单元格上
+
+		/** 设置单元格边框样式   */
+		// CellStyle.BORDER_DOUBLE      双边线
+		// CellStyle.BORDER_THIN        细边线
+		// CellStyle.BORDER_MEDIUM      中等边线
+		// CellStyle.BORDER_DASHED      虚线边线
+		// CellStyle.BORDER_HAIR        小圆点虚线边线
+		// CellStyle.BORDER_THICK       粗边线
+		style.setBorderBottom(CellStyle.BORDER_THICK);
+		style.setBorderTop(CellStyle.BORDER_DASHED);
+		style.setBorderLeft(CellStyle.BORDER_DOUBLE);
+		style.setBorderRight(CellStyle.BORDER_THIN);
+
+		// 设置单元格边框颜色
+		style.setBottomBorderColor(HSSFColor.ORANGE.index);
+		style.setTopBorderColor(HSSFColor.ORANGE.index);
+		style.setLeftBorderColor(HSSFColor.ORANGE.index);
+
+		style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
+		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
+		// 设置单元格内容水平对其方式   
+		// XSSFCellStyle.ALIGN_CENTER       居中对齐
+		// XSSFCellStyle.ALIGN_LEFT         左对齐
+		// XSSFCellStyle.ALIGN_RIGHT        右对齐
+		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
+		// 设置单元格内容垂直对其方式
+		// XSSFCellStyle.VERTICAL_TOP       上对齐
+		// XSSFCellStyle.VERTICAL_CENTER    中对齐
+		// XSSFCellStyle.VERTICAL_BOTTOM    下对齐
+		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
+		sheet = workbook.createSheet("测试数据导出");
+		sheet.setDefaultColumnWidth(14);//setColumnWidth设置cell的宽度
+		sheet.setDefaultRowHeightInPoints(20);
+		//sheet.setColumnWidth(0, 12 * 256);//setColumnWidth设置cell的宽度 
+		Row row = sheet.createRow(0);
+		//heightInPoints 设置的值永远是height属性值的20倍  
+		row.setHeightInPoints(20);
+		row.createCell(0).setCellValue("用户代码");
+		//合并单元格 (起始行,结束行,起始列,结束列)
+		sheet.addMergedRegion(new CellRangeAddress(0,(short)1,0,(short)(0)));
+		row.createCell(1).setCellValue("用户名");
+		sheet.addMergedRegion(new CellRangeAddress(0,(short)1,1,(short)(1)));
+		row.createCell(2).setCellValue("资金总额");
+		sheet.addMergedRegion(new CellRangeAddress(0,(short)1,2,(short)(2)));
+		row.createCell(3).setCellValue("可用金额");
+		sheet.addMergedRegion(new CellRangeAddress(0,(short)1,3,(short)(3)));
+		row.createCell(4).setCellValue("冻结");
+		sheet.addMergedRegion(new CellRangeAddress(0,(short)1,4,(short)(4)));
+		row.createCell(5).setCellValue("收入");
+		sheet.addMergedRegion(new CellRangeAddress(0,(short)0,5,(short)(11)));
+		row.createCell(12).setCellValue("待收");
+		sheet.addMergedRegion(new CellRangeAddress(0,(short)0,12,(short)(14)));
+		Row row1 = sheet.createRow(1);
+		row1.setHeightInPoints(20);
+		row1.createCell(5).setCellValue("总计");
+		row1.createCell(6).setCellValue("本金");
+		row1.createCell(7).setCellValue("利息");
+		row1.createCell(8).setCellValue("提前还款罚息");
+		row1.createCell(9).setCellValue("逾期罚息");
+		row1.createCell(10).setCellValue("奖励");
+		row1.createCell(11).setCellValue("活动");
+		row1.createCell(12).setCellValue("总计");
+		row1.createCell(13).setCellValue("本金");
+		row1.createCell(14).setCellValue("利息");
+		row = sheet.createRow(2);
+		//heightInPoints 设置的值永远是height属性值的20倍  
+		row.setHeightInPoints(20);
+		row.createCell(0).setCellValue("测试");
+		row.createCell(1).setCellValue("测试数据");
+		row.createCell(2).setCellValue(Double.parseDouble("7599.68"));
+		row.createCell(3).setCellValue(Double.parseDouble("8599.68"));
+		row.createCell(4).setCellValue(Double.parseDouble("9599.68"));
+		row.createCell(5).setCellValue(Double.parseDouble("9699.68"));
+		row.createCell(6).setCellValue(Double.parseDouble("9799.68"));
+		row.createCell(7).setCellValue(Double.parseDouble("9899.68"));
+		row.createCell(8).setCellValue(Double.parseDouble("9999.68"));
+		row.createCell(9).setCellValue(Double.parseDouble("17599.68"));
+		row.createCell(10).setCellValue(Double.parseDouble("12599.68"));
+		row.createCell(11).setCellValue(Double.parseDouble("17599.68"));
+		row.createCell(12).setCellValue(Double.parseDouble("17699.68"));
+		row.createCell(13).setCellValue(Double.parseDouble("17799.68"));
+		row.createCell(14).setCellValue(Double.parseDouble("17899.68"));
+		row = sheet.createRow(3);
+		row.setHeightInPoints(20);
+		row.createCell(0).setCellValue("测试2");
+		row.createCell(1).setCellValue("测试数据3");
+		row.createCell(2).setCellValue(Double.parseDouble("7599.61"));
+		row.createCell(3).setCellValue(Double.parseDouble("8599.62"));
+		row.createCell(4).setCellValue(Double.parseDouble("9599.63"));
+		row.createCell(5).setCellValue(Double.parseDouble("9699.64"));
+		row.createCell(6).setCellValue(Double.parseDouble("9799.65"));
+		row.createCell(7).setCellValue(Double.parseDouble("9899.66"));
+		row.createCell(8).setCellValue(Double.parseDouble("9999.67"));
+		row.createCell(9).setCellValue(Double.parseDouble("17599.88"));
+		row.createCell(10).setCellValue(Double.parseDouble("12599.69"));
+		row.createCell(11).setCellValue(Double.parseDouble("17599.70"));
+		row.createCell(12).setCellValue(Double.parseDouble("17699.71"));
+		row.createCell(13).setCellValue(Double.parseDouble("17799.72"));
+		row.createCell(14).setCellValue(Double.parseDouble("17899.73"));
+		OutputStream outStream = new FileOutputStream(new File(request.getSession().getServletContext().getRealPath("/resource/xls/finance.xls")));
+		try {
+			workbook.write(outStream);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		outStream.flush();
+		outStream.close();
+		/*int z = 2;
+		DecimalFormat df = new DecimalFormat("#,##0.00");
+		for (Iterator<Object> it = objPageView.getRecords().iterator(); it.hasNext();) {
+			row = sheet.createRow(z);
+			Object[] obj = (Object[])it.next();
+			row.createCell(0).setCellValue(obj[2] != null ? obj[2].toString() : null);
+			row.createCell(1).setCellValue(obj[1] != null ? obj[1].toString() : null);
+			row.createCell(2).setCellValue(df.format(Double.parseDouble(obj[4].toString())+Double.parseDouble(obj[11].toString())+Double.parseDouble(obj[12].toString())));
+			row.createCell(3).setCellValue(df.format(Double.parseDouble(obj[4].toString())));
+			row.createCell(4).setCellValue(df.format(Double.parseDouble(obj[11].toString())));
+			row.createCell(5).setCellValue(df.format(Double.parseDouble(obj[6].toString())));
+			row.createCell(6).setCellValue(df.format(Double.parseDouble(obj[7].toString())));
+			row.createCell(7).setCellValue(df.format(Double.parseDouble(obj[8].toString())));
+			row.createCell(8).setCellValue(df.format(Double.parseDouble(obj[15].toString())));
+			row.createCell(9).setCellValue(df.format(Double.parseDouble(obj[16].toString())));
+			row.createCell(10).setCellValue(df.format(Double.parseDouble(obj[9].toString())));
+			row.createCell(11).setCellValue(df.format(Double.parseDouble(obj[10].toString())));
+			row.createCell(12).setCellValue(df.format(Double.parseDouble(obj[12].toString())));
+			row.createCell(13).setCellValue(df.format(Double.parseDouble(obj[13].toString())));
+			row.createCell(14).setCellValue(df.format(Double.parseDouble(obj[14].toString())));
+			z++;
+		}
+			row = sheet.createRow(z);
+			row.createCell(1).setCellValue("总计");
+			row.createCell(2).setCellValue(df.format(fundsAccountTotal.getTotal()));
+			row.createCell(3).setCellValue(df.format(fundsAccountTotal.getBalance()));
+			row.createCell(4).setCellValue(df.format(fundsAccountTotal.getFrost()));
+			row.createCell(5).setCellValue(df.format(fundsAccountTotal.getIncome()));
+			row.createCell(6).setCellValue(df.format(fundsAccountTotal.getIncomeCapital()));
+			row.createCell(7).setCellValue(df.format(fundsAccountTotal.getIncomeInterest()));
+			row.createCell(8).setCellValue(df.format(fundsAccountTotal.getIncomePrepayment()));
+			row.createCell(9).setCellValue(df.format(fundsAccountTotal.getIncomeOverdue()));
+			row.createCell(10).setCellValue(df.format(fundsAccountTotal.getIncomeAward()));
+			row.createCell(11).setCellValue(df.format(fundsAccountTotal.getIncomeActivity()));
+			row.createCell(12).setCellValue(df.format(fundsAccountTotal.getAwait()));
+			row.createCell(13).setCellValue(df.format(fundsAccountTotal.getAwaitCapital()));
+			row.createCell(14).setCellValue(df.format(fundsAccountTotal.getAwaitInterest()));*/
+	}
+
+	/**
+	 * 设置响应头 
+	 * @param response
+	 */
+	public static void setResponseHeader(HttpServletResponse response,String excelName) {
+		response.setContentType("application/octet-stream;charset=ISO8859-1");
+		try {
+			excelName = new String(excelName.getBytes("gb2312"),"ISO8859-1");
+			response.setHeader("Content-Disposition", "attachment;filename="+excelName+URLEncoder.encode(".xls", "ISO8859-1"));
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/FileUtil.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/FileUtil.java
new file mode 100644
index 0000000..f876183
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/FileUtil.java
@@ -0,0 +1,73 @@
+package com.stylefeng.guns.core.util;
+
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.exception.GunsExceptionEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+
+public class FileUtil {
+
+    private static Logger log = LoggerFactory.getLogger(FileUtil.class);
+
+    /**
+     * NIO way
+     */
+    public static byte[] toByteArray(String filename) {
+
+        File f = new File(filename);
+        if (!f.exists()) {
+            log.error("文件未找到!" + filename);
+            throw new GunsException(GunsExceptionEnum.FILE_NOT_FOUND);
+        }
+        FileChannel channel = null;
+        FileInputStream fs = null;
+        try {
+            fs = new FileInputStream(f);
+            channel = fs.getChannel();
+            ByteBuffer byteBuffer = ByteBuffer.allocate((int) channel.size());
+            while ((channel.read(byteBuffer)) > 0) {
+                // do nothing
+                // System.out.println("reading");
+            }
+            return byteBuffer.array();
+        } catch (IOException e) {
+            throw new GunsException(GunsExceptionEnum.FILE_READING_ERROR);
+        } finally {
+            try {
+                channel.close();
+            } catch (IOException e) {
+                throw new GunsException(GunsExceptionEnum.FILE_READING_ERROR);
+            }
+            try {
+                fs.close();
+            } catch (IOException e) {
+                throw new GunsException(GunsExceptionEnum.FILE_READING_ERROR);
+            }
+        }
+    }
+
+    /**
+     * 删除目录
+     *
+     * @author fengshuonan
+     * @Date 2017/10/30 下午4:15
+     */
+    public static boolean deleteDir(File dir) {
+        if (dir.isDirectory()) {
+            String[] children = dir.list();
+            for (int i = 0; i < children.length; i++) {
+                boolean success = deleteDir(new File(dir, children[i]));
+                if (!success) {
+                    return false;
+                }
+            }
+        }
+        return dir.delete();
+    }
+}
\ No newline at end of file
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/HttpSessionHolder.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/HttpSessionHolder.java
new file mode 100644
index 0000000..6eb8d80
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/HttpSessionHolder.java
@@ -0,0 +1,26 @@
+package com.stylefeng.guns.core.util;
+
+import javax.servlet.http.HttpSession;
+
+/**
+ * 非Controller中获取当前session的工具类
+ *
+ * @author fengshuonan
+ * @date 2016年11月28日 上午10:24:31
+ */
+public class HttpSessionHolder {
+
+    private static ThreadLocal<HttpSession> tl = new ThreadLocal<HttpSession>();
+
+    public static void put(HttpSession s) {
+        tl.set(s);
+    }
+
+    public static HttpSession get() {
+        return tl.get();
+    }
+
+    public static void remove() {
+        tl.remove();
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/IdGenerator.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/IdGenerator.java
new file mode 100644
index 0000000..77c3393
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/IdGenerator.java
@@ -0,0 +1,20 @@
+package com.stylefeng.guns.core.util;
+
+import com.baomidou.mybatisplus.toolkit.IdWorker;
+
+/**
+ * 唯一id生成器
+ *
+ * @author fengshuonan
+ * @date 2017-08-23 11:10
+ */
+public class IdGenerator {
+
+    public static String getId() {
+        return String.valueOf(IdWorker.getId());
+    }
+
+    public static long getIdLong() {
+        return IdWorker.getId();
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/MD5Util.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/MD5Util.java
new file mode 100644
index 0000000..87e21bd
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/MD5Util.java
@@ -0,0 +1,39 @@
+package com.stylefeng.guns.core.util;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * MD5加密类(封装jdk自带的md5加密方法)
+ *
+ * @author fengshuonan
+ * @date 2016年12月2日 下午4:14:22
+ */
+public class MD5Util {
+
+    public static String encrypt(String source) {
+        return encodeMd5(source.getBytes());
+    }
+
+    private static String encodeMd5(byte[] source) {
+        try {
+            return encodeHex(MessageDigest.getInstance("MD5").digest(source));
+        } catch (NoSuchAlgorithmException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    private static String encodeHex(byte[] bytes) {
+        StringBuffer buffer = new StringBuffer(bytes.length * 2);
+        for (int i = 0; i < bytes.length; i++) {
+            if (((int) bytes[i] & 0xff) < 0x10)
+                buffer.append("0");
+            buffer.append(Long.toString((int) bytes[i] & 0xff, 16));
+        }
+        return buffer.toString();
+    }
+
+    public static void main(String[] args) {
+        System.out.println(encrypt("123456"));
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/NumUtil.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/NumUtil.java
new file mode 100644
index 0000000..6213b66
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/NumUtil.java
@@ -0,0 +1,89 @@
+package com.stylefeng.guns.core.util;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+
+/**
+ * 数字格式化的类
+ *
+ * @author fengshuonan
+ * @date 2016年11月30日 下午5:58:40
+ */
+public class NumUtil {
+
+    /**
+     * @Description 保留指定位数的小数(少的位数不补零)
+     * @author fengshuonan
+     */
+    public static String keepRandomPoint(Double value, int n) {
+        if (value == null) {
+            value = 0.00;
+            return new BigDecimal(value).setScale(n, RoundingMode.HALF_UP).toString();
+        } else {
+            return new BigDecimal(value).setScale(n, RoundingMode.HALF_UP).toString();
+        }
+    }
+
+    /**
+     * @Description 浮点保留两位小数(少的位数不补零)
+     * @author fengshuonan
+     */
+    public static String keep2Point(double value) {
+        return keepRandomPoint(value, 2);
+    }
+
+    /**
+     * @Description 浮点保留1位小数(少的位数不补零)
+     * @author fengshuonan
+     */
+    public static String keep1Point(double value) {
+        return keepRandomPoint(value, 1);
+    }
+
+    /**
+     * @Description 浮点保留任意位小数(少位补零)
+     * @author fengshuonan
+     */
+    public static String keepRandomPointZero(double value, int n) {
+        DecimalFormat df = new DecimalFormat("#0.00");
+        return df.format(Double.valueOf(keepRandomPoint(value, n)));
+    }
+
+    /**
+     * @Description 浮点保留两位小数(少位补零)
+     * @author fengshuonan
+     */
+    public static String keep2PointZero(double value) {
+        return keepRandomPointZero(value, 2);
+    }
+
+    /**
+     * @Description 获取任意小数点位的百分比表示
+     * @author fengshuonan
+     */
+    public static String percentRandomPoint(double value, int n) {
+        NumberFormat percent = NumberFormat.getPercentInstance();
+        percent.setGroupingUsed(false);
+        percent.setMaximumFractionDigits(n);
+        return percent.format(value);
+    }
+
+    /**
+     * @Description 百分比保留两位小数
+     * @author fengshuonan
+     */
+    public static String percent2Point(double value) {
+        return percentRandomPoint(value, 2);
+    }
+
+    /**
+     * @Description 获取格式化经纬度后的小数(保留3位)
+     * @author fengshuonan
+     */
+    public static String latLngPoint(double value) {
+        return keepRandomPoint(value, 3);
+    }
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/PingYinUtil.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/PingYinUtil.java
new file mode 100644
index 0000000..f8592e0
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/PingYinUtil.java
@@ -0,0 +1,206 @@
+package com.stylefeng.guns.core.util;
+
+import java.util.Random;
+
+/***
+ * 
+ * 得到中文首字母
+ * 
+ * @author lxm_09
+ * 
+ */
+
+public class PingYinUtil {
+
+	public static void main(String[] args) {
+		String str = "这是一个测试";
+		System.out.println("中文首字母:" + getPYIndexStr(str, true));
+	}
+
+	/**
+	 * 返回首字母
+	 */
+	public static String getPYIndexStr(String strChinese, boolean bUpCase) {
+		try {
+			StringBuffer buffer = new StringBuffer();
+			byte b[] = strChinese.getBytes("GBK");// 把中文转化成byte数组
+			for (int i = 0; i < b.length; i++) {
+				if ((b[i] & 255) > 128) {
+					int char1 = b[i++] & 255;
+					char1 <<= 8;// 左移运算符用“<<”表示,是将运算符左边的对象,向左移动运算符右边指定的位数,并且在低位补零。其实,向左移n位,就相当于乘上2的n次方
+					int chart = char1 + (b[i] & 255);
+					buffer.append(getPYIndexChar((char) chart, bUpCase));
+					continue;
+				}
+				char c = (char) b[i];
+				if (!Character.isJavaIdentifierPart(c))// 确定指定字符是否可以是 Java
+														// 标识符中首字符以外的部分。
+					c = 'A';
+				buffer.append(c);
+			}
+			return buffer.toString();
+		} catch (Exception e) {
+			System.out.println((new StringBuilder()).append("\u53D6\u4E2D\u6587\u62FC\u97F3\u6709\u9519")
+					.append(e.getMessage()).toString());
+		}
+		return null;
+	}
+
+	/**
+	 * 得到首字母
+	 */
+	private static char getPYIndexChar(char strChinese, boolean bUpCase) {
+
+		int charGBK = strChinese;
+
+		char result;
+
+		if (charGBK >= 45217 && charGBK <= 45252)
+
+			result = 'A';
+
+		else
+
+		if (charGBK >= 45253 && charGBK <= 45760)
+
+			result = 'B';
+
+		else
+
+		if (charGBK >= 45761 && charGBK <= 46317)
+
+			result = 'C';
+
+		else
+
+		if (charGBK >= 46318 && charGBK <= 46825)
+
+			result = 'D';
+
+		else
+
+		if (charGBK >= 46826 && charGBK <= 47009)
+
+			result = 'E';
+
+		else
+
+		if (charGBK >= 47010 && charGBK <= 47296)
+
+			result = 'F';
+
+		else
+
+		if (charGBK >= 47297 && charGBK <= 47613)
+
+			result = 'G';
+
+		else
+
+		if (charGBK >= 47614 && charGBK <= 48118)
+
+			result = 'H';
+
+		else
+
+		if (charGBK >= 48119 && charGBK <= 49061)
+
+			result = 'J';
+
+		else
+
+		if (charGBK >= 49062 && charGBK <= 49323)
+
+			result = 'K';
+
+		else
+
+		if (charGBK >= 49324 && charGBK <= 49895)
+
+			result = 'L';
+
+		else
+
+		if (charGBK >= 49896 && charGBK <= 50370)
+
+			result = 'M';
+
+		else
+
+		if (charGBK >= 50371 && charGBK <= 50613)
+
+			result = 'N';
+
+		else
+
+		if (charGBK >= 50614 && charGBK <= 50621)
+
+			result = 'O';
+
+		else
+
+		if (charGBK >= 50622 && charGBK <= 50905)
+
+			result = 'P';
+
+		else
+
+		if (charGBK >= 50906 && charGBK <= 51386)
+
+			result = 'Q';
+
+		else
+
+		if (charGBK >= 51387 && charGBK <= 51445)
+
+			result = 'R';
+
+		else
+
+		if (charGBK >= 51446 && charGBK <= 52217)
+
+			result = 'S';
+
+		else
+
+		if (charGBK >= 52218 && charGBK <= 52697)
+
+			result = 'T';
+
+		else
+
+		if (charGBK >= 52698 && charGBK <= 52979)
+
+			result = 'W';
+
+		else
+
+		if (charGBK >= 52980 && charGBK <= 53688)
+
+			result = 'X';
+
+		else
+
+		if (charGBK >= 53689 && charGBK <= 54480)
+
+			result = 'Y';
+
+		else
+
+		if (charGBK >= 54481 && charGBK <= 55289)
+
+			result = 'Z';
+
+		else
+
+			result = (char) (65 + (new Random()).nextInt(25));
+
+		if (!bUpCase)
+
+			result = Character.toLowerCase(result);
+
+		return result;
+
+	}
+
+}
\ No newline at end of file
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/RenderUtil.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/RenderUtil.java
new file mode 100644
index 0000000..14d6e55
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/RenderUtil.java
@@ -0,0 +1,32 @@
+package com.stylefeng.guns.core.util;
+
+import com.alibaba.fastjson.JSON;
+import com.stylefeng.guns.core.exception.GunsException;
+import com.stylefeng.guns.core.exception.GunsExceptionEnum;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * 渲染工具类
+ *
+ * @author stylefeng
+ * @date 2017-08-25 14:13
+ */
+public class RenderUtil {
+
+    /**
+     * 渲染json对象
+     */
+    public static void renderJson(HttpServletResponse response, Object jsonObject) {
+        try {
+            response.setContentType("application/json");
+            response.setCharacterEncoding("UTF-8");
+            PrintWriter writer = response.getWriter();
+            writer.write(JSON.toJSONString(jsonObject));
+        } catch (IOException e) {
+            throw new GunsException(GunsExceptionEnum.WRITE_ERROR);
+        }
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/ResKit.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/ResKit.java
new file mode 100644
index 0000000..dc735af
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/ResKit.java
@@ -0,0 +1,38 @@
+package com.stylefeng.guns.core.util;
+
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+
+import java.io.IOException;
+
+/**
+ * 资源文件相关的操作类
+ *
+ * @author fengshuonan
+ * @date 2016年11月17日 下午10:09:23
+ */
+public class ResKit {
+
+    /**
+     * @Description 批量获取ClassPath下的资源文件
+     * @author fengshuonan
+     */
+    public static Resource[] getClassPathResources(String pattern) {
+        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+        try {
+            return resolver.getResources(pattern);
+        } catch (IOException e) {
+            throw new RuntimeException("加载resource文件时,找不到文件,所找文件为:" + pattern);
+        }
+    }
+
+    /**
+     * @Description 批量获取ClassPath下的资源文件
+     * @author fengshuonan
+     */
+    public static String getClassPathFile(String file) {
+		//return ResKit.class.getClassLoader().getResource(file).getPath();
+        return Thread.currentThread().getContextClassLoader().getResource(file).getPath();
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/SimpleContrast.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/SimpleContrast.java
new file mode 100644
index 0000000..41659db
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/SimpleContrast.java
@@ -0,0 +1,58 @@
+package com.stylefeng.guns.core.util;
+
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Date;
+
+/**
+ * 对比两个对象的变化的工具类
+ *
+ * @author fengshuonan
+ * @Date 2017/3/31 10:36
+ */
+public class SimpleContrast {
+
+    //记录每个修改字段的分隔符
+    public static final String separator = ";;;";
+
+    /**
+     * 比较两个对象,并返回不一致的信息
+     *
+     * @author stylefeng
+     * @Date 2017/5/9 19:34
+     */
+    public static String contrastObj(Object pojo1, Object pojo2) {
+        String str = "";
+        try {
+            Class clazz = pojo1.getClass();
+            Field[] fields = pojo1.getClass().getDeclaredFields();
+            int i = 1;
+            for (Field field : fields) {
+                if ("serialVersionUID".equals(field.getName())) {
+                    continue;
+                }
+                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
+                Method getMethod = pd.getReadMethod();
+                Object o1 = getMethod.invoke(pojo1);
+                Object o2 = getMethod.invoke(pojo2);
+                if (o1 == null || o2 == null) {
+                    continue;
+                }
+                if (o1 instanceof Date) {
+                    o1 = DateUtil.getDay((Date) o1);
+                }
+                if (!o1.toString().equals(o2.toString())) {
+                    if (i != 1) {
+                        str += separator;
+                    }
+                    str += "字段名称" + field.getName() + ",旧值:" + o1 + ",新值:" + o2;
+                    i++;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return str;
+    }
+}
\ No newline at end of file
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/SpringContextHolder.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/SpringContextHolder.java
new file mode 100644
index 0000000..9074c41
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/SpringContextHolder.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.core.util;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * Spring的ApplicationContext的持有者,可以用静态方法的方式获取spring容器中的bean
+ *
+ * @author fengshuonan
+ * @date 2016年11月27日 下午3:32:11
+ */
+@Component
+public class SpringContextHolder implements ApplicationContextAware {
+
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringContextHolder.applicationContext = applicationContext;
+    }
+
+    public static ApplicationContext getApplicationContext() {
+        assertApplicationContext();
+        return applicationContext;
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T getBean(String beanName) {
+        assertApplicationContext();
+        return (T) applicationContext.getBean(beanName);
+    }
+
+    public static <T> T getBean(Class<T> requiredType) {
+        assertApplicationContext();
+        return applicationContext.getBean(requiredType);
+    }
+
+    private static void assertApplicationContext() {
+        if (SpringContextHolder.applicationContext == null) {
+            throw new RuntimeException("applicaitonContext属性为null,请检查是否注入了SpringContextHolder!");
+        }
+    }
+
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/SqlUtil.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/SqlUtil.java
new file mode 100644
index 0000000..3c6132e
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/SqlUtil.java
@@ -0,0 +1,35 @@
+package com.stylefeng.guns.core.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * sql语句工具类
+ *
+ * @author fengshuonan
+ * @date 2016年12月6日 下午1:01:54
+ */
+public class SqlUtil {
+
+    /**
+     * @Description 根据集合的大小,输出相应个数"?"
+     * @author fengshuonan
+     */
+    public static String parse(List<?> list) {
+        String str = "";
+        if (list != null && list.size() > 0) {
+            str = str + "?";
+            for (int i = 1; i < list.size(); i++) {
+                str = str + ",?";
+            }
+        }
+        return str;
+    }
+
+    public static void main(String[] args) {
+        ArrayList<Object> arrayList = new ArrayList<>();
+        arrayList.add(2);
+        arrayList.add(2);
+        System.out.println(parse(arrayList));
+    }
+}
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/util/ToolUtil.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/ToolUtil.java
new file mode 100644
index 0000000..0347ac2
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/util/ToolUtil.java
@@ -0,0 +1,582 @@
+/**
+ * Copyright (c) 2015-2016, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.
+ */
+package com.stylefeng.guns.core.util;
+
+import com.stylefeng.guns.core.support.StrKit;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.reflect.Array;
+import java.math.BigDecimal;
+import java.net.URISyntaxException;
+import java.util.*;
+import java.util.Map.Entry;
+
+/**
+ * 高频方法集合类
+ */
+public class ToolUtil {
+
+    /**
+     * 获取随机位数的字符串
+     *
+     * @author fengshuonan
+     * @Date 2017/8/24 14:09
+     */
+    public static String getRandomString(int length) {
+        String base = "abcdefghijklmnopqrstuvwxyz0123456789";
+        Random random = new Random();
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < length; i++) {
+            int number = random.nextInt(base.length());
+            sb.append(base.charAt(number));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 判断一个对象是否是时间类型
+     *
+     * @author stylefeng
+     * @Date 2017/4/18 12:55
+     */
+    public static String dateType(Object o) {
+        if (o instanceof Date) {
+            return DateUtil.getDay((Date) o);
+        } else {
+            return o.toString();
+        }
+    }
+
+    /**
+     * 获取异常的具体信息
+     *
+     * @author fengshuonan
+     * @Date 2017/3/30 9:21
+     * @version 2.0
+     */
+    public static String getExceptionMsg(Exception e) {
+        StringWriter sw = new StringWriter();
+        try {
+            e.printStackTrace(new PrintWriter(sw));
+        } finally {
+            try {
+                sw.close();
+            } catch (IOException e1) {
+                e1.printStackTrace();
+            }
+        }
+        return sw.getBuffer().toString().replaceAll("\\$", "T");
+    }
+
+    /**
+     * 比较两个对象是否相等。<br>
+     * 相同的条件有两个,满足其一即可:<br>
+     * 1. obj1 == null && obj2 == null; 2. obj1.equals(obj2)
+     *
+     * @param obj1 对象1
+     * @param obj2 对象2
+     * @return 是否相等
+     */
+    public static boolean equals(Object obj1, Object obj2) {
+        return (obj1 != null) ? (obj1.equals(obj2)) : (obj2 == null);
+    }
+
+    /**
+     * 计算对象长度,如果是字符串调用其length函数,集合类调用其size函数,数组调用其length属性,其他可遍历对象遍历计算长度
+     *
+     * @param obj 被计算长度的对象
+     * @return 长度
+     */
+    public static int length(Object obj) {
+        if (obj == null) {
+            return 0;
+        }
+        if (obj instanceof CharSequence) {
+            return ((CharSequence) obj).length();
+        }
+        if (obj instanceof Collection) {
+            return ((Collection<?>) obj).size();
+        }
+        if (obj instanceof Map) {
+            return ((Map<?, ?>) obj).size();
+        }
+
+        int count;
+        if (obj instanceof Iterator) {
+            Iterator<?> iter = (Iterator<?>) obj;
+            count = 0;
+            while (iter.hasNext()) {
+                count++;
+                iter.next();
+            }
+            return count;
+        }
+        if (obj instanceof Enumeration) {
+            Enumeration<?> enumeration = (Enumeration<?>) obj;
+            count = 0;
+            while (enumeration.hasMoreElements()) {
+                count++;
+                enumeration.nextElement();
+            }
+            return count;
+        }
+        if (obj.getClass().isArray() == true) {
+            return Array.getLength(obj);
+        }
+        return -1;
+    }
+
+    /**
+     * 对象中是否包含元素
+     *
+     * @param obj     对象
+     * @param element 元素
+     * @return 是否包含
+     */
+    public static boolean contains(Object obj, Object element) {
+        if (obj == null) {
+            return false;
+        }
+        if (obj instanceof String) {
+            if (element == null) {
+                return false;
+            }
+            return ((String) obj).contains(element.toString());
+        }
+        if (obj instanceof Collection) {
+            return ((Collection<?>) obj).contains(element);
+        }
+        if (obj instanceof Map) {
+            return ((Map<?, ?>) obj).values().contains(element);
+        }
+
+        if (obj instanceof Iterator) {
+            Iterator<?> iter = (Iterator<?>) obj;
+            while (iter.hasNext()) {
+                Object o = iter.next();
+                if (equals(o, element)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+        if (obj instanceof Enumeration) {
+            Enumeration<?> enumeration = (Enumeration<?>) obj;
+            while (enumeration.hasMoreElements()) {
+                Object o = enumeration.nextElement();
+                if (equals(o, element)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+        if (obj.getClass().isArray() == true) {
+            int len = Array.getLength(obj);
+            for (int i = 0; i < len; i++) {
+                Object o = Array.get(obj, i);
+                if (equals(o, element)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 对象是否不为空(新增)
+     *
+     * @param obj String,List,Map,Object[],int[],long[]
+     * @return
+     */
+    public static boolean isNotEmpty(Object o) {
+        return !isEmpty(o);
+    }
+
+    /**
+     * 对象是否为空
+     *
+     * @param obj String,List,Map,Object[],int[],long[]
+     * @return
+     */
+    @SuppressWarnings("rawtypes")
+    public static boolean isEmpty(Object o) {
+        if (o == null) {
+            return true;
+        }
+        if (o instanceof String) {
+            if (o.toString().trim().equals("")) {
+                return true;
+            }
+        } else if (o instanceof List) {
+            if (((List) o).size() == 0) {
+                return true;
+            }
+        } else if (o instanceof Map) {
+            if (((Map) o).size() == 0) {
+                return true;
+            }
+        } else if (o instanceof Set) {
+            if (((Set) o).size() == 0) {
+                return true;
+            }
+        } else if (o instanceof Object[]) {
+            if (((Object[]) o).length == 0) {
+                return true;
+            }
+        } else if (o instanceof int[]) {
+            if (((int[]) o).length == 0) {
+                return true;
+            }
+        } else if (o instanceof long[]) {
+            if (((long[]) o).length == 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 对象组中是否存在 Empty Object
+     *
+     * @param os 对象组
+     * @return
+     */
+    public static boolean isOneEmpty(Object... os) {
+        for (Object o : os) {
+            if (isEmpty(o)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 对象组中是否全是 Empty Object
+     *
+     * @param os
+     * @return
+     */
+    public static boolean isAllEmpty(Object... os) {
+        for (Object o : os) {
+            if (!isEmpty(o)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 是否为数字
+     *
+     * @param obj
+     * @return
+     */
+    public static boolean isNum(Object obj) {
+        try {
+            Integer.parseInt(obj.toString());
+        } catch (Exception e) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 如果为空, 则调用默认值
+     *
+     * @param str
+     * @return
+     */
+    public static Object getValue(Object str, Object defaultValue) {
+        if (isEmpty(str)) {
+            return defaultValue;
+        }
+        return str;
+    }
+
+    /**
+     * 格式化文本
+     *
+     * @param template 文本模板,被替换的部分用 {} 表示
+     * @param values   参数值
+     * @return 格式化后的文本
+     */
+    public static String format(String template, Object... values) {
+        return StrKit.format(template, values);
+    }
+
+    /**
+     * 格式化文本
+     *
+     * @param template 文本模板,被替换的部分用 {key} 表示
+     * @param map      参数值对
+     * @return 格式化后的文本
+     */
+    public static String format(String template, Map<?, ?> map) {
+        return StrKit.format(template, map);
+    }
+
+    /**
+     * 强转->string,并去掉多余空格
+     *
+     * @param str
+     * @return
+     */
+    public static String toStr(Object str) {
+        return toStr(str, "");
+    }
+
+    /**
+     * 强转->string,并去掉多余空格
+     *
+     * @param str
+     * @param defaultValue
+     * @return
+     */
+    public static String toStr(Object str, String defaultValue) {
+        if (null == str) {
+            return defaultValue;
+        }
+        return str.toString().trim();
+    }
+
+    /**
+     * 强转->int
+     *
+     * @param obj
+     * @return
+     */
+//	public static int toInt(Object value) {
+//		return toInt(value, -1);
+//	}
+
+    /**
+     * 强转->int
+     *
+     * @param obj
+     * @param defaultValue
+     * @return
+     */
+//	public static int toInt(Object value, int defaultValue) {
+//		return Convert.toInt(value, defaultValue);
+//	}
+
+    /**
+     * 强转->long
+     *
+     * @param obj
+     * @return
+     */
+//	public static long toLong(Object value) {
+//		return toLong(value, -1);
+//	}
+
+    /**
+     * 强转->long
+     *
+     * @param obj
+     * @param defaultValue
+     * @return
+     */
+//	public static long toLong(Object value, long defaultValue) {
+//		return Convert.toLong(value, defaultValue);
+//	}
+//
+//	public static String encodeUrl(String url) {
+//		return URLKit.encode(url, CharsetKit.UTF_8);
+//	}
+//
+//	public static String decodeUrl(String url) {
+//		return URLKit.decode(url, CharsetKit.UTF_8);
+//	}
+
+    /**
+     * map的key转为小写
+     *
+     * @param map
+     * @return Map<String , Object>
+     */
+    public static Map<String, Object> caseInsensitiveMap(Map<String, Object> map) {
+        Map<String, Object> tempMap = new HashMap<>();
+        for (String key : map.keySet()) {
+            tempMap.put(key.toLowerCase(), map.get(key));
+        }
+        return tempMap;
+    }
+
+    /**
+     * 获取map中第一个数据值
+     *
+     * @param <K> Key的类型
+     * @param <V> Value的类型
+     * @param map 数据源
+     * @return 返回的值
+     */
+    public static <K, V> V getFirstOrNull(Map<K, V> map) {
+        V obj = null;
+        for (Entry<K, V> entry : map.entrySet()) {
+            obj = entry.getValue();
+            if (obj != null) {
+                break;
+            }
+        }
+        return obj;
+    }
+
+    /**
+     * 创建StringBuilder对象
+     *
+     * @return StringBuilder对象
+     */
+    public static StringBuilder builder(String... strs) {
+        final StringBuilder sb = new StringBuilder();
+        for (String str : strs) {
+            sb.append(str);
+        }
+        return sb;
+    }
+
+    /**
+     * 创建StringBuilder对象
+     *
+     * @return StringBuilder对象
+     */
+    public static void builder(StringBuilder sb, String... strs) {
+        for (String str : strs) {
+            sb.append(str);
+        }
+    }
+
+    /**
+     * 去掉指定后缀
+     *
+     * @param str    字符串
+     * @param suffix 后缀
+     * @return 切掉后的字符串,若后缀不是 suffix, 返回原字符串
+     */
+    public static String removeSuffix(String str, String suffix) {
+        if (isEmpty(str) || isEmpty(suffix)) {
+            return str;
+        }
+
+        if (str.endsWith(suffix)) {
+            return str.substring(0, str.length() - suffix.length());
+        }
+        return str;
+    }
+
+    /**
+     * 当前时间
+     *
+     * @author stylefeng
+     * @Date 2017/5/7 21:56
+     */
+    public static String currentTime() {
+        return DateUtil.getTime();
+    }
+
+    /**
+     * 首字母大写
+     *
+     * @author stylefeng
+     * @Date 2017/5/7 22:01
+     */
+    public static String firstLetterToUpper(String val) {
+        return StrKit.firstCharToUpperCase(val);
+    }
+
+    /**
+     * 首字母小写
+     *
+     * @author stylefeng
+     * @Date 2017/5/7 22:02
+     */
+    public static String firstLetterToLower(String val) {
+        return StrKit.firstCharToLowerCase(val);
+    }
+
+    /**
+     * 判断是否是windows操作系统
+     *
+     * @author stylefeng
+     * @Date 2017/5/24 22:34
+     */
+    public static Boolean isWinOs() {
+        String os = System.getProperty("os.name");
+        if (os.toLowerCase().startsWith("win")) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 获取临时目录
+     *
+     * @author stylefeng
+     * @Date 2017/5/24 22:35
+     */
+    public static String getTempPath() {
+        return System.getProperty("java.io.tmpdir");
+    }
+
+    /**
+     * 把一个数转化为int
+     *
+     * @author fengshuonan
+     * @Date 2017/11/15 下午11:10
+     */
+    public static Integer toInt(Object val) {
+        if (val instanceof Double) {
+            BigDecimal bigDecimal = new BigDecimal((Double) val);
+            return bigDecimal.intValue();
+        } else {
+            return Integer.valueOf(val.toString());
+        }
+
+    }
+
+    /**
+     * 获取项目路径
+     */
+    public static String getWebRootPath(String filePath) {
+        try {
+            String path = ToolUtil.class.getClassLoader().getResource("").toURI().getPath();
+            path = path.replace("/WEB-INF/classes/", "");
+            path = path.replace("/target/classes/", "");
+            path = path.replace("file:/", "");
+            if (ToolUtil.isEmpty(filePath)) {
+                return path;
+            } else {
+                return path + "/" + filePath;
+            }
+        } catch (URISyntaxException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 获取文件后缀名 不包含点
+     */
+    public static String getFileSuffix(String fileWholeName) {
+        if (ToolUtil.isEmpty(fileWholeName)) {
+            return "none";
+        }
+        int lastIndexOf = fileWholeName.lastIndexOf(".");
+        return fileWholeName.substring(lastIndexOf + 1);
+    }
+}
\ No newline at end of file
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/xss/XssFilter.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/xss/XssFilter.java
new file mode 100644
index 0000000..ec44eb2
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/xss/XssFilter.java
@@ -0,0 +1,42 @@
+package com.stylefeng.guns.core.xss;
+
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.List;
+
+
+public class XssFilter implements Filter {
+
+    FilterConfig filterConfig = null;
+
+    private List<String> urlExclusion = null;
+
+    public void init(FilterConfig filterConfig) throws ServletException {
+        this.filterConfig = filterConfig;
+    }
+
+    public void destroy() {
+        this.filterConfig = null;
+    }
+
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+        String servletPath = httpServletRequest.getServletPath();
+
+        if (urlExclusion != null && urlExclusion.contains(servletPath)) {
+            chain.doFilter(request, response);
+        } else {
+            chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);
+        }
+    }
+
+    public List<String> getUrlExclusion() {
+        return urlExclusion;
+    }
+
+    public void setUrlExclusion(List<String> urlExclusion) {
+        this.urlExclusion = urlExclusion;
+    }
+}
\ No newline at end of file
diff --git a/management/guns-core/src/main/java/com/stylefeng/guns/core/xss/XssHttpServletRequestWrapper.java b/management/guns-core/src/main/java/com/stylefeng/guns/core/xss/XssHttpServletRequestWrapper.java
new file mode 100644
index 0000000..693b828
--- /dev/null
+++ b/management/guns-core/src/main/java/com/stylefeng/guns/core/xss/XssHttpServletRequestWrapper.java
@@ -0,0 +1,87 @@
+package com.stylefeng.guns.core.xss;
+
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+
+public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
+
+    public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {
+
+        super(servletRequest);
+
+    }
+
+    public String[] getParameterValues(String parameter) {
+
+        String[] values = super.getParameterValues(parameter);
+
+        if (values == null) {
+
+            return null;
+
+        }
+
+        int count = values.length;
+
+        String[] encodedValues = new String[count];
+
+        for (int i = 0; i < count; i++) {
+
+            encodedValues[i] = cleanXSS(values[i]);
+
+        }
+
+        return encodedValues;
+
+    }
+
+    public String getParameter(String parameter) {
+
+        String value = super.getParameter(parameter);
+
+        if (value == null) {
+
+            return null;
+
+        }
+
+        return cleanXSS(value);
+
+    }
+
+    public String getHeader(String name) {
+
+        String value = super.getHeader(name);
+
+        if (value == null)
+
+            return null;
+
+        return cleanXSS(value);
+
+    }
+
+    private String cleanXSS(String value) {
+
+        //You'll need to remove the spaces from the html entities below
+
+        value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
+
+        value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
+
+        value = value.replaceAll("'", "& #39;");
+
+        value = value.replaceAll("eval\\((.*)\\)", "");
+
+        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
+
+        value = value.replaceAll("script", "");
+
+        return value;
+
+    }
+
+
+}
\ No newline at end of file
diff --git a/management/guns-core/src/main/resources/META-INF/spring.factories b/management/guns-core/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000..0dc03f2
--- /dev/null
+++ b/management/guns-core/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,6 @@
+# AutoConfiguration
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.stylefeng.guns.core.base.controller.GlobalController,\
+com.stylefeng.guns.core.config.DefaultFastjsonConfig,\
+com.stylefeng.guns.core.config.DefaultProperties,\
+com.stylefeng.guns.core.config.DefaultWebConfig
\ No newline at end of file
diff --git a/management/guns-core/src/main/resources/default-config.properties b/management/guns-core/src/main/resources/default-config.properties
new file mode 100644
index 0000000..8d458f7
--- /dev/null
+++ b/management/guns-core/src/main/resources/default-config.properties
@@ -0,0 +1,36 @@
+#\u8FD9\u4E2A\u914D\u7F6E\u6587\u4EF6\u91CC\u5199\u5176\u4ED6\u9879\u76EE\u53EF\u80FD\u5171\u7528\u7684\u914D\u7F6E,\u53EF\u4EE5\u5728application.yml\u4E2D\u914D\u7F6E\u4FE1\u606F\u8986\u76D6\u8FD9\u91CC\u7684\u914D\u7F6E
+
+
+######################### springs\u9ED8\u8BA4\u914D\u7F6E #########################
+spring.aop.proxy-target-class=true
+
+
+###################### mybatis-plus\u9ED8\u8BA4\u914D\u7F6E #######################
+mybatis-plus.mapper-locations=classpath*:com/stylefeng/guns/**/mapping/*.xml
+# 0:\u6570\u636E\u5E93ID\u81EA\u589E   1:\u7528\u6237\u8F93\u5165id  2:\u5168\u5C40\u552F\u4E00id(IdWorker)  3:\u5168\u5C40\u552F\u4E00ID(uuid)
+mybatis-plus.global-config.id-type=0
+mybatis-plus.global-config.db-column-underline=false
+mybatis-plus.global-config.refresh-mapper=true
+mybatis-plus.global-config.logic-delete-value=0
+mybatis-plus.global-config.logic-not-delete-value=1
+mybatis-plus.global-config.sql-injector=com.baomidou.mybatisplus.mapper.LogicSqlInjector
+mybatis-plus.configuration.map-underscore-to-camel-case=false
+#\u914D\u7F6E\u7684\u7F13\u5B58\u7684\u5168\u5C40\u5F00\u5173
+mybatis-plus.configuration.cache-enabled=true
+# \u5EF6\u65F6\u52A0\u8F7D\u7684\u5F00\u5173
+mybatis-plus.configuration.lazyLoadingEnabled=true
+# \u5F00\u542F\u7684\u8BDD\uFF0C\u5EF6\u65F6\u52A0\u8F7D\u4E00\u4E2A\u5C5E\u6027\u65F6\u4F1A\u52A0\u8F7D\u8BE5\u5BF9\u8C61\u5168\u90E8\u5C5E\u6027\uFF0C\u5426\u5219\u6309\u9700\u52A0\u8F7D\u5C5E\u6027
+mybatis-plus.configuration.multipleResultSetsEnabled=true
+# \u6253\u5370sql\u8BED\u53E5,\u8C03\u8BD5\u7528
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+
+
+########################## beetl\u9ED8\u8BA4\u914D\u7F6E ###########################
+#\u5F00\u59CB\u7ED3\u675F\u6807\u7B7E(yaml\u4E0D\u5141\u8BB8@\u5F00\u5934)
+beetl.delimiter-statement-start=@
+beetl.delimiter-statement-end=null
+#\u81EA\u5B9A\u4E49\u6807\u7B7E\u6587\u4EF6Root\u76EE\u5F55\u548C\u540E\u7F00
+beetl.resource-tagroot=common/tags
+beetl.resource-tagsuffix=tag
+#\u662F\u5426\u68C0\u6D4B\u6587\u4EF6\u53D8\u5316,\u5F00\u53D1\u7528true\u5408\u9002\uFF0C\u4F46\u7EBF\u4E0A\u8981\u6539\u4E3Afalse
+beetl.resource-auto-check=true
\ No newline at end of file
diff --git a/management/guns-generator/pom.xml b/management/guns-generator/pom.xml
new file mode 100644
index 0000000..1328611
--- /dev/null
+++ b/management/guns-generator/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>guns-generator</artifactId>
+    <packaging>jar</packaging>
+
+    <name>guns-generator</name>
+    <description>代码生成器</description>
+
+    <parent>
+        <groupId>com.stylefeng</groupId>
+        <artifactId>guns-parent</artifactId>
+        <version>1.0.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.stylefeng</groupId>
+            <artifactId>guns-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.ibeetl</groupId>
+            <artifactId>beetl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generate</artifactId>
+        </dependency>
+    </dependencies>
+
+
+</project>
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/GunsCodeGenerator.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/GunsCodeGenerator.java
new file mode 100644
index 0000000..bcd169b
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/GunsCodeGenerator.java
@@ -0,0 +1,30 @@
+package com.stylefeng.guns.generator.action;
+
+
+import com.stylefeng.guns.generator.action.config.GunsGeneratorConfig;
+
+/**
+ * 代码生成器,可以生成实体,dao,service,controller,html,js
+ *
+ * @author stylefeng
+ * @Date 2017/5/21 12:38
+ */
+public class GunsCodeGenerator {
+
+    public static void main(String[] args) {
+
+        /**
+         * Mybatis-Plus的代码生成器:
+         *      mp的代码生成器可以生成实体,mapper,mapper对应的xml,service
+         */
+        GunsGeneratorConfig gunsGeneratorConfig = new GunsGeneratorConfig();
+        gunsGeneratorConfig.doMpGeneration();
+
+        /**
+         * guns的生成器:
+         *      guns的代码生成器可以生成controller,html页面,页面对应的js
+         */
+        gunsGeneratorConfig.doGunsGeneration();
+    }
+
+}
\ No newline at end of file
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/AbstractGeneratorConfig.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/AbstractGeneratorConfig.java
new file mode 100644
index 0000000..e50b78a
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/AbstractGeneratorConfig.java
@@ -0,0 +1,109 @@
+package com.stylefeng.guns.generator.action.config;
+
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.stylefeng.guns.core.util.FileUtil;
+import com.stylefeng.guns.generator.engine.SimpleTemplateEngine;
+import com.stylefeng.guns.generator.engine.base.GunsTemplateEngine;
+import com.stylefeng.guns.generator.engine.config.ContextConfig;
+import com.stylefeng.guns.generator.engine.config.SqlConfig;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * 代码生成的抽象配置
+ *
+ * @author fengshuonan
+ * @date 2017-10-28-下午8:22
+ */
+public abstract class AbstractGeneratorConfig {
+
+    /**
+     * mybatis-plus代码生成器配置
+     */
+    GlobalConfig globalConfig = new GlobalConfig();
+
+    DataSourceConfig dataSourceConfig = new DataSourceConfig();
+
+    StrategyConfig strategyConfig = new StrategyConfig();
+
+    PackageConfig packageConfig = new PackageConfig();
+
+    TableInfo tableInfo = null;
+
+    /**
+     * Guns代码生成器配置
+     */
+    ContextConfig contextConfig = new ContextConfig();
+
+    SqlConfig sqlConfig = new SqlConfig();
+
+    protected abstract void config();
+
+    public void init() {
+        config();
+
+        packageConfig.setService(contextConfig.getProPackage() + ".modular." + contextConfig.getModuleName() + ".service");
+        packageConfig.setServiceImpl(contextConfig.getProPackage() + ".modular." + contextConfig.getModuleName() + ".service.impl");
+
+        //controller没用掉,生成之后会自动删掉
+        packageConfig.setController("TTT");
+
+        if (!contextConfig.getEntitySwitch()) {
+            packageConfig.setEntity("TTT");
+        }
+
+        if (!contextConfig.getDaoSwitch()) {
+            packageConfig.setMapper("TTT");
+            packageConfig.setXml("TTT");
+        }
+
+        if (!contextConfig.getServiceSwitch()) {
+            packageConfig.setService("TTT");
+            packageConfig.setServiceImpl("TTT");
+        }
+
+    }
+
+    /**
+     * 删除不必要的代码
+     */
+    public void destory() {
+        String outputDir = globalConfig.getOutputDir() + "/TTT";
+        FileUtil.deleteDir(new File(outputDir));
+    }
+
+    public AbstractGeneratorConfig() {
+    }
+
+    public void doMpGeneration() {
+        init();
+        AutoGenerator autoGenerator = new AutoGenerator();
+        autoGenerator.setGlobalConfig(globalConfig);
+        autoGenerator.setDataSource(dataSourceConfig);
+        autoGenerator.setStrategy(strategyConfig);
+        autoGenerator.setPackageInfo(packageConfig);
+        autoGenerator.execute();
+        destory();
+
+        //获取table信息,用于guns代码生成
+        List<TableInfo> tableInfoList = autoGenerator.getConfig().getTableInfoList();
+        if (tableInfoList != null && tableInfoList.size() > 0) {
+            this.tableInfo = tableInfoList.get(0);
+        }
+    }
+
+    public void doGunsGeneration() {
+        GunsTemplateEngine GunsTemplateEngine = new SimpleTemplateEngine();
+        GunsTemplateEngine.setContextConfig(contextConfig);
+        sqlConfig.setConnection(dataSourceConfig.getConn());
+        GunsTemplateEngine.setSqlConfig(sqlConfig);
+        GunsTemplateEngine.setTableInfo(tableInfo);
+        GunsTemplateEngine.start();
+    }
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/GunsGeneratorConfig.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/GunsGeneratorConfig.java
new file mode 100644
index 0000000..43012ab
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/GunsGeneratorConfig.java
@@ -0,0 +1,81 @@
+package com.stylefeng.guns.generator.action.config;
+
+import com.baomidou.mybatisplus.generator.config.rules.DbType;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+/**
+ * 默认的代码生成的配置
+ *
+ * @author fengshuonan
+ * @date 2017-10-28-下午8:27
+ */
+public class GunsGeneratorConfig extends AbstractGeneratorConfig {
+
+    protected void globalConfig() {
+        globalConfig.setOutputDir("D:\\ttt");//写自己项目的绝对路径,注意具体到java目录
+        globalConfig.setFileOverride(true);
+        globalConfig.setEnableCache(false);
+        globalConfig.setBaseResultMap(true);
+        globalConfig.setBaseColumnList(true);
+        globalConfig.setOpen(false);
+        globalConfig.setAuthor("stylefeng");
+    }
+
+    protected void dataSourceConfig() {
+        dataSourceConfig.setDbType(DbType.MYSQL);
+        dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
+        dataSourceConfig.setUsername("root");
+        dataSourceConfig.setPassword("root");
+        dataSourceConfig.setUrl("jdbc:mysql://127.0.0.1:3306/guns?characterEncoding=utf8");
+    }
+
+    protected void strategyConfig() {
+        strategyConfig.setTablePrefix(new String[]{"sys_"});// 此处可以修改为您的表前缀
+        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
+    }
+
+    protected void packageConfig() {
+        packageConfig.setParent(null);
+        packageConfig.setEntity("com.stylefeng.guns.admin.common.persistence.model");
+        packageConfig.setMapper("com.stylefeng.guns.admin.common.persistence.dao");
+        packageConfig.setXml("com.stylefeng.guns.admin.common.persistence.dao.mapping");
+    }
+
+    protected void contextConfig() {
+        contextConfig.setProPackage("com.stylefeng.guns.admin");
+        contextConfig.setCoreBasePackage("com.stylefeng.guns.core");
+        contextConfig.setBizChName("字典管理");
+        contextConfig.setBizEnName("sysDict");
+        contextConfig.setModuleName("system");
+        contextConfig.setProjectPath("D:\\ideaSpace\\guns\\guns-admin");//写自己项目的绝对路径
+        contextConfig.setEntityName("SysDict");
+        sqlConfig.setParentMenuName(null);//这里写已有菜单的名称,当做父节点
+
+        /**
+         * mybatis-plus 生成器开关
+         */
+        contextConfig.setEntitySwitch(true);
+        contextConfig.setDaoSwitch(true);
+        contextConfig.setServiceSwitch(true);
+
+        /**
+         * guns 生成器开关
+         */
+        contextConfig.setControllerSwitch(true);
+        contextConfig.setIndexPageSwitch(true);
+        contextConfig.setAddPageSwitch(true);
+        contextConfig.setEditPageSwitch(true);
+        contextConfig.setJsSwitch(true);
+        contextConfig.setInfoJsSwitch(true);
+        contextConfig.setSqlSwitch(true);
+    }
+
+    @Override
+    protected void config() {
+        globalConfig();
+        dataSourceConfig();
+        strategyConfig();
+        packageConfig();
+        contextConfig();
+    }
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/WebGeneratorConfig.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/WebGeneratorConfig.java
new file mode 100644
index 0000000..6b821f5
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/config/WebGeneratorConfig.java
@@ -0,0 +1,97 @@
+package com.stylefeng.guns.generator.action.config;
+
+import com.baomidou.mybatisplus.generator.config.rules.DbType;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.stylefeng.guns.core.support.StrKit;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.generator.action.model.GenQo;
+
+import java.io.File;
+
+/**
+ * 默认的代码生成的配置
+ *
+ * @author fengshuonan
+ * @date 2017-10-28-下午8:27
+ */
+public class WebGeneratorConfig extends AbstractGeneratorConfig {
+
+    private GenQo genQo;
+
+    public WebGeneratorConfig(GenQo genQo) {
+        this.genQo = genQo;
+    }
+
+    @Override
+    protected void config() {
+        /**
+         * 数据库配置
+         */
+        dataSourceConfig.setDbType(DbType.MYSQL);
+        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
+        dataSourceConfig.setUsername(genQo.getUserName());
+        dataSourceConfig.setPassword(genQo.getPassword());
+        dataSourceConfig.setUrl(genQo.getUrl());
+
+        /**
+         * 全局配置
+         */
+        globalConfig.setOutputDir(genQo.getProjectPath() + File.separator + "src" + File.separator + "main" + File.separator + "java");
+        globalConfig.setFileOverride(true);
+        globalConfig.setEnableCache(false);
+        globalConfig.setBaseResultMap(true);
+        globalConfig.setBaseColumnList(true);
+        globalConfig.setOpen(false);
+        globalConfig.setAuthor(genQo.getAuthor());
+        contextConfig.setProPackage(genQo.getProjectPackage());
+        contextConfig.setCoreBasePackage(genQo.getCorePackage());
+
+        /**
+         * 生成策略
+         */
+        if (genQo.getIgnoreTabelPrefix() != null) {
+            strategyConfig.setTablePrefix(new String[]{genQo.getIgnoreTabelPrefix()});
+        }
+        strategyConfig.setInclude(new String[]{genQo.getTableName()});
+        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
+        packageConfig.setParent(null);
+        packageConfig.setEntity(genQo.getProjectPackage() + ".modular.system.model");
+        packageConfig.setMapper(genQo.getProjectPackage() + ".modular.system.dao");
+        packageConfig.setXml(genQo.getProjectPackage() + ".modular.system.dao.mapping");
+
+        /**
+         * 业务代码配置
+         */
+        contextConfig.setBizChName(genQo.getBizName());
+        contextConfig.setModuleName(genQo.getModuleName());
+        contextConfig.setProjectPath(genQo.getProjectPath());//写自己项目的绝对路径
+        if(ToolUtil.isEmpty(genQo.getIgnoreTabelPrefix())){
+            String entityName = StrKit.toCamelCase(genQo.getTableName());
+            contextConfig.setEntityName(StrKit.firstCharToUpperCase(entityName));
+            contextConfig.setBizEnName(StrKit.firstCharToLowerCase(entityName));
+        }else{
+            String entiyName = StrKit.toCamelCase(StrKit.removePrefix(genQo.getTableName(), genQo.getIgnoreTabelPrefix()));
+            contextConfig.setEntityName(StrKit.firstCharToUpperCase(entiyName));
+            contextConfig.setBizEnName(StrKit.firstCharToLowerCase(entiyName));
+        }
+        sqlConfig.setParentMenuName(genQo.getParentMenuName());//这里写已有菜单的名称,当做父节点
+
+        /**
+         * mybatis-plus 生成器开关
+         */
+        contextConfig.setEntitySwitch(genQo.getEntitySwitch());
+        contextConfig.setDaoSwitch(genQo.getDaoSwitch());
+        contextConfig.setServiceSwitch(genQo.getServiceSwitch());
+
+        /**
+         * guns 生成器开关
+         */
+        contextConfig.setControllerSwitch(genQo.getControllerSwitch());
+        contextConfig.setIndexPageSwitch(genQo.getIndexPageSwitch());
+        contextConfig.setAddPageSwitch(genQo.getAddPageSwitch());
+        contextConfig.setEditPageSwitch(genQo.getEditPageSwitch());
+        contextConfig.setJsSwitch(genQo.getJsSwitch());
+        contextConfig.setInfoJsSwitch(genQo.getInfoJsSwitch());
+        contextConfig.setSqlSwitch(genQo.getSqlSwitch());
+    }
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/model/GenQo.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/model/GenQo.java
new file mode 100644
index 0000000..b09d948
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/action/model/GenQo.java
@@ -0,0 +1,297 @@
+package com.stylefeng.guns.generator.action.model;
+
+/**
+ * 代码生成的查询参数
+ *
+ * @author fengshuonan
+ * @date 2017-11-30-下午2:05
+ */
+public class GenQo {
+
+    /**
+     * 数据库账号
+     */
+    private String userName;
+
+    /**
+     * 数据库密码
+     */
+    private String password;
+
+    /**
+     * 数据库url
+     */
+    private String url;
+
+    /**
+     * 项目地址
+     */
+    private String projectPath;
+
+    /**
+     * 作者
+     */
+    private String author;
+
+    /**
+     * 项目的包
+     */
+    private String projectPackage;
+
+    /**
+     * 核心模块的包
+     */
+    private String corePackage;
+
+    /**
+     * 表名称
+     */
+    private String tableName;
+
+    /**
+     * 忽略的表前缀
+     */
+    private String ignoreTabelPrefix;
+
+    /**
+     * 业务名称
+     */
+    private String bizName;
+
+    /**
+     * 模块名
+     */
+    private String moduleName;
+    
+    /**
+     * 父级菜单名称
+     */
+    private String parentMenuName;
+
+    /**
+     * 是否生成控制器代码开关
+     */
+    private Boolean controllerSwitch = false;
+
+    /**
+     * 主页
+     */
+    private Boolean indexPageSwitch = false;
+
+    /**
+     * 添加页面
+     */
+    private Boolean addPageSwitch = false;
+
+    /**
+     * 编辑页面
+     */
+    private Boolean editPageSwitch = false;
+
+    /**
+     * 主页的js
+     */
+    private Boolean jsSwitch = false;
+
+    /**
+     * 详情页面js
+     */
+    private Boolean infoJsSwitch = false;
+
+    /**
+     * dao的开关
+     */
+    private Boolean daoSwitch = false;
+
+    /**
+     * service
+     */
+    private Boolean serviceSwitch = false;
+
+    /**
+     * 生成实体的开关
+     */
+    private Boolean entitySwitch = false;
+
+    /**
+     * 生成sql的开关
+     */
+    private Boolean sqlSwitch = false;
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getProjectPath() {
+        return projectPath;
+    }
+
+    public void setProjectPath(String projectPath) {
+        this.projectPath = projectPath;
+    }
+
+    public String getAuthor() {
+        return author;
+    }
+
+    public void setAuthor(String author) {
+        this.author = author;
+    }
+
+    public String getCorePackage() {
+        return corePackage;
+    }
+
+    public void setCorePackage(String corePackage) {
+        this.corePackage = corePackage;
+    }
+
+    public String getProjectPackage() {
+
+        return projectPackage;
+    }
+
+    public void setProjectPackage(String projectPackage) {
+        this.projectPackage = projectPackage;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public String getIgnoreTabelPrefix() {
+        return ignoreTabelPrefix;
+    }
+
+    public void setIgnoreTabelPrefix(String ignoreTabelPrefix) {
+        this.ignoreTabelPrefix = ignoreTabelPrefix;
+    }
+
+    public String getBizName() {
+        return bizName;
+    }
+
+    public void setBizName(String bizName) {
+        this.bizName = bizName;
+    }
+
+    public String getModuleName() {
+        return moduleName;
+    }
+
+    public void setModuleName(String moduleName) {
+        this.moduleName = moduleName;
+    }
+
+    public Boolean getControllerSwitch() {
+        return controllerSwitch;
+    }
+
+    public void setControllerSwitch(Boolean controllerSwitch) {
+        this.controllerSwitch = controllerSwitch;
+    }
+
+    public Boolean getIndexPageSwitch() {
+        return indexPageSwitch;
+    }
+
+    public void setIndexPageSwitch(Boolean indexPageSwitch) {
+        this.indexPageSwitch = indexPageSwitch;
+    }
+
+    public Boolean getAddPageSwitch() {
+        return addPageSwitch;
+    }
+
+    public void setAddPageSwitch(Boolean addPageSwitch) {
+        this.addPageSwitch = addPageSwitch;
+    }
+
+    public Boolean getEditPageSwitch() {
+        return editPageSwitch;
+    }
+
+    public void setEditPageSwitch(Boolean editPageSwitch) {
+        this.editPageSwitch = editPageSwitch;
+    }
+
+    public Boolean getJsSwitch() {
+        return jsSwitch;
+    }
+
+    public void setJsSwitch(Boolean jsSwitch) {
+        this.jsSwitch = jsSwitch;
+    }
+
+    public Boolean getInfoJsSwitch() {
+        return infoJsSwitch;
+    }
+
+    public void setInfoJsSwitch(Boolean infoJsSwitch) {
+        this.infoJsSwitch = infoJsSwitch;
+    }
+
+    public Boolean getDaoSwitch() {
+        return daoSwitch;
+    }
+
+    public void setDaoSwitch(Boolean daoSwitch) {
+        this.daoSwitch = daoSwitch;
+    }
+
+    public Boolean getServiceSwitch() {
+        return serviceSwitch;
+    }
+
+    public void setServiceSwitch(Boolean serviceSwitch) {
+        this.serviceSwitch = serviceSwitch;
+    }
+
+    public Boolean getEntitySwitch() {
+        return entitySwitch;
+    }
+
+    public void setEntitySwitch(Boolean entitySwitch) {
+        this.entitySwitch = entitySwitch;
+    }
+
+    public Boolean getSqlSwitch() {
+        return sqlSwitch;
+    }
+
+    public void setSqlSwitch(Boolean sqlSwitch) {
+        this.sqlSwitch = sqlSwitch;
+    }
+
+    public String getParentMenuName() {
+        return parentMenuName;
+    }
+
+    public void setParentMenuName(String parentMenuName) {
+        this.parentMenuName = parentMenuName;
+    }
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/SimpleTemplateEngine.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/SimpleTemplateEngine.java
new file mode 100644
index 0000000..9e057c7
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/SimpleTemplateEngine.java
@@ -0,0 +1,70 @@
+package com.stylefeng.guns.generator.engine;
+
+
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.generator.engine.base.GunsTemplateEngine;
+
+/**
+ * 通用的模板生成引擎
+ *
+ * @author fengshuonan
+ * @date 2017-05-09 20:32
+ */
+public class SimpleTemplateEngine extends GunsTemplateEngine {
+
+    @Override
+    protected void generatePageEditHtml() {
+        String path = ToolUtil.format(super.getContextConfig().getProjectPath() + getPageConfig().getPageEditPathTemplate(),
+                super.getContextConfig().getBizEnName(), super.getContextConfig().getBizEnName());
+        generateFile(super.getContextConfig().getTemplatePrefixPath() + "/page_edit.html.btl", path);
+        System.out.println("生成编辑页面成功!");
+    }
+
+    @Override
+    protected void generatePageAddHtml() {
+        String path = ToolUtil.format(super.getContextConfig().getProjectPath() + getPageConfig().getPageAddPathTemplate(),
+                super.getContextConfig().getBizEnName(), super.getContextConfig().getBizEnName());
+        generateFile(super.getContextConfig().getTemplatePrefixPath() + "/page_add.html.btl", path);
+        System.out.println("生成添加页面成功!");
+    }
+
+    @Override
+    protected void generatePageInfoJs() {
+        String path = ToolUtil.format(super.getContextConfig().getProjectPath() + getPageConfig().getPageInfoJsPathTemplate(),
+                super.getContextConfig().getBizEnName(), super.getContextConfig().getBizEnName());
+        generateFile(super.getContextConfig().getTemplatePrefixPath() + "/page_info.js.btl", path);
+        System.out.println("生成页面详情js成功!");
+    }
+
+    @Override
+    protected void generatePageJs() {
+        String path = ToolUtil.format(super.getContextConfig().getProjectPath() + getPageConfig().getPageJsPathTemplate(),
+                super.getContextConfig().getBizEnName(), super.getContextConfig().getBizEnName());
+        generateFile(super.getContextConfig().getTemplatePrefixPath() + "/page.js.btl", path);
+        System.out.println("生成页面js成功!");
+    }
+
+    @Override
+    protected void generatePageHtml() {
+        String path = ToolUtil.format(super.getContextConfig().getProjectPath() + getPageConfig().getPagePathTemplate(),
+                super.getContextConfig().getBizEnName(), super.getContextConfig().getBizEnName());
+        generateFile(super.getContextConfig().getTemplatePrefixPath() + "/page.html.btl", path);
+        System.out.println("生成页面成功!");
+    }
+
+    @Override
+    protected void generateController() {
+        String controllerPath = ToolUtil.format(super.getContextConfig().getProjectPath() + super.getControllerConfig().getControllerPathTemplate(),
+                ToolUtil.firstLetterToUpper(super.getContextConfig().getBizEnName()));
+        generateFile(super.getContextConfig().getTemplatePrefixPath() + "/Controller.java.btl", controllerPath);
+        System.out.println("生成控制器成功!");
+    }
+
+    @Override
+    protected void generateSqls() {
+        String path = ToolUtil.format(super.getContextConfig().getProjectPath() + super.sqlConfig.getSqlPathTemplate(),
+                ToolUtil.firstLetterToUpper(super.getContextConfig().getBizEnName()));
+        generateFile(super.getContextConfig().getTemplatePrefixPath() + "/menu_sql.sql.btl", path);
+        System.out.println("生成sql成功!");
+    }
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/base/AbstractTemplateEngine.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/base/AbstractTemplateEngine.java
new file mode 100644
index 0000000..ef2512e
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/base/AbstractTemplateEngine.java
@@ -0,0 +1,115 @@
+package com.stylefeng.guns.generator.engine.base;
+
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.stylefeng.guns.generator.engine.config.*;
+
+/**
+ * 模板生成父类
+ *
+ * @author fengshuonan
+ * @date 2017-05-08 20:17
+ */
+public class AbstractTemplateEngine {
+
+    protected ContextConfig contextConfig;                //全局配置
+    protected ControllerConfig controllerConfig;          //控制器的配置
+    protected PageConfig pageConfig;                      //页面的控制器
+    protected DaoConfig daoConfig;                        //Dao配置
+    protected ServiceConfig serviceConfig;                //Service配置
+    protected SqlConfig sqlConfig;                        //sql配置
+    protected TableInfo tableInfo;                        //表的信息
+
+    public void initConfig() {
+        if (this.contextConfig == null) {
+            this.contextConfig = new ContextConfig();
+        }
+        if (this.controllerConfig == null) {
+            this.controllerConfig = new ControllerConfig();
+        }
+        if (this.pageConfig == null) {
+            this.pageConfig = new PageConfig();
+        }
+        if (this.daoConfig == null) {
+            this.daoConfig = new DaoConfig();
+        }
+        if (this.serviceConfig == null) {
+            this.serviceConfig = new ServiceConfig();
+        }
+        if (this.sqlConfig == null) {
+            this.sqlConfig = new SqlConfig();
+        }
+        this.contextConfig.init();
+
+        this.controllerConfig.setContextConfig(this.contextConfig);
+        this.controllerConfig.init();
+
+        this.serviceConfig.setContextConfig(this.contextConfig);
+        this.serviceConfig.init();
+
+        this.daoConfig.setContextConfig(this.contextConfig);
+        this.daoConfig.init();
+
+        this.pageConfig.setContextConfig(this.contextConfig);
+        this.pageConfig.init();
+
+        this.sqlConfig.setContextConfig(this.contextConfig);
+        this.sqlConfig.init();
+    }
+
+    public PageConfig getPageConfig() {
+        return pageConfig;
+    }
+
+    public void setPageConfig(PageConfig pageConfig) {
+        this.pageConfig = pageConfig;
+    }
+
+    public ContextConfig getContextConfig() {
+        return contextConfig;
+    }
+
+    public void setContextConfig(ContextConfig contextConfig) {
+        this.contextConfig = contextConfig;
+    }
+
+    public ControllerConfig getControllerConfig() {
+        return controllerConfig;
+    }
+
+    public void setControllerConfig(ControllerConfig controllerConfig) {
+        this.controllerConfig = controllerConfig;
+    }
+
+    public DaoConfig getDaoConfig() {
+        return daoConfig;
+    }
+
+    public void setDaoConfig(DaoConfig daoConfig) {
+        this.daoConfig = daoConfig;
+    }
+
+    public ServiceConfig getServiceConfig() {
+        return serviceConfig;
+    }
+
+    public void setServiceConfig(ServiceConfig serviceConfig) {
+        this.serviceConfig = serviceConfig;
+    }
+
+    public SqlConfig getSqlConfig() {
+        return sqlConfig;
+    }
+
+    public void setSqlConfig(SqlConfig sqlConfig) {
+        this.sqlConfig = sqlConfig;
+    }
+
+    public TableInfo getTableInfo() {
+        return tableInfo;
+    }
+
+    public void setTableInfo(TableInfo tableInfo) {
+        this.tableInfo = tableInfo;
+    }
+}
+
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/base/GunsTemplateEngine.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/base/GunsTemplateEngine.java
new file mode 100644
index 0000000..e107d30
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/base/GunsTemplateEngine.java
@@ -0,0 +1,126 @@
+package com.stylefeng.guns.generator.engine.base;
+
+import com.stylefeng.guns.core.util.ToolUtil;
+import org.beetl.core.Configuration;
+import org.beetl.core.GroupTemplate;
+import org.beetl.core.Template;
+import org.beetl.core.resource.ClasspathResourceLoader;
+import com.sun.javafx.PlatformUtil;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+/**
+ * ADI项目模板生成 引擎
+ *
+ * @author fengshuonan
+ * @date 2017-05-07 22:15
+ */
+public abstract class GunsTemplateEngine extends AbstractTemplateEngine {
+
+    private GroupTemplate groupTemplate;
+
+    public GunsTemplateEngine() {
+        initBeetlEngine();
+    }
+
+    protected void initBeetlEngine() {
+        Properties properties = new Properties();
+        properties.put("RESOURCE.root", "");
+        properties.put("DELIMITER_STATEMENT_START", "<%");
+        properties.put("DELIMITER_STATEMENT_END", "%>");
+        properties.put("HTML_TAG_FLAG", "##");
+        Configuration cfg = null;
+        try {
+            cfg = new Configuration(properties);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        ClasspathResourceLoader resourceLoader = new ClasspathResourceLoader();
+        groupTemplate = new GroupTemplate(resourceLoader, cfg);
+        groupTemplate.registerFunctionPackage("tool", new ToolUtil());
+    }
+
+    protected void configTemplate(Template template) {
+        template.binding("controller", super.controllerConfig);
+        template.binding("context", super.contextConfig);
+        template.binding("dao", super.daoConfig);
+        template.binding("service", super.serviceConfig);
+        template.binding("sqls", super.sqlConfig);
+        template.binding("table", super.tableInfo);
+    }
+
+    protected void generateFile(String template, String filePath) {
+        Template pageTemplate = groupTemplate.getTemplate(template);
+        configTemplate(pageTemplate);
+        if (PlatformUtil.isWindows()) {
+            filePath = filePath.replaceAll("/+|\\\\+", "\\\\");
+        } else {
+            filePath = filePath.replaceAll("/+|\\\\+", "/");
+        }
+        File file = new File(filePath);
+        File parentFile = file.getParentFile();
+        if (!parentFile.exists()) {
+            parentFile.mkdirs();
+        }
+        FileOutputStream fileOutputStream = null;
+        try {
+            fileOutputStream = new FileOutputStream(file);
+            pageTemplate.renderTo(fileOutputStream);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                fileOutputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public void start() {
+        //配置之间的相互依赖
+        super.initConfig();
+
+        //生成模板
+        if (super.contextConfig.getControllerSwitch()) {
+            generateController();
+        }
+        if (super.contextConfig.getIndexPageSwitch()) {
+            generatePageHtml();
+        }
+        if (super.contextConfig.getAddPageSwitch()) {
+            generatePageAddHtml();
+        }
+        if (super.contextConfig.getEditPageSwitch()) {
+            generatePageEditHtml();
+        }
+        if (super.contextConfig.getJsSwitch()) {
+            generatePageJs();
+        }
+        if (super.contextConfig.getInfoJsSwitch()) {
+            generatePageInfoJs();
+        }
+        if (super.contextConfig.getSqlSwitch()) {
+            generateSqls();
+        }
+    }
+
+    protected abstract void generatePageEditHtml();
+
+    protected abstract void generatePageAddHtml();
+
+    protected abstract void generatePageInfoJs();
+
+    protected abstract void generatePageJs();
+
+    protected abstract void generatePageHtml();
+
+    protected abstract void generateController();
+
+    protected abstract void generateSqls();
+
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ContextConfig.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ContextConfig.java
new file mode 100644
index 0000000..d8403d8
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ContextConfig.java
@@ -0,0 +1,214 @@
+package com.stylefeng.guns.generator.engine.config;
+
+
+import com.stylefeng.guns.core.util.ToolUtil;
+
+/**
+ * 全局配置
+ *
+ * @author fengshuonan
+ * @date 2017-05-08 20:21
+ */
+public class ContextConfig {
+
+    private String templatePrefixPath = "gunsTemplate/advanced";
+    private String projectPath = "D:\\ideaSpace\\guns";//模板输出的项目目录
+    private String bizChName;   //业务名称
+    private String bizEnName;   //业务英文名称
+    private String bizEnBigName;//业务英文名称(大写)
+    private String moduleName = "system";  //模块名称
+
+    private String proPackage = "com.stylefeng.guns.admin";
+    private String coreBasePackage = "com.stylefeng.guns.core";
+    private String modelPackageName = "com.stylefeng.guns.modular.system.model";        //model的包名
+    private String modelMapperPackageName = "com.stylefeng.guns.modular.system.dao";    //model的dao
+    private String entityName;              //实体的名称
+
+    private Boolean controllerSwitch = true;    //是否生成控制器代码开关
+    private Boolean indexPageSwitch = true;     //主页
+    private Boolean addPageSwitch = true;       //添加页面
+    private Boolean editPageSwitch = true;      //编辑页面
+    private Boolean jsSwitch = true;            //js
+    private Boolean infoJsSwitch = true;        //详情页面js
+    private Boolean daoSwitch = true;           //dao
+    private Boolean serviceSwitch = true;       //service
+    private Boolean entitySwitch = true;        //生成实体的开关
+    private Boolean sqlSwitch = true;           //生成sql的开关
+
+    public void init() {
+        if (entityName == null) {
+            entityName = bizEnBigName;
+        }
+        modelPackageName = proPackage + "." + "modular.system.model";
+        modelMapperPackageName = proPackage + "." + "modular.system.dao";
+    }
+
+    public String getBizEnBigName() {
+        return bizEnBigName;
+    }
+
+    public void setBizEnBigName(String bizEnBigName) {
+        this.bizEnBigName = bizEnBigName;
+    }
+
+    public String getBizChName() {
+        return bizChName;
+    }
+
+    public void setBizChName(String bizChName) {
+        this.bizChName = bizChName;
+    }
+
+    public String getBizEnName() {
+        return bizEnName;
+    }
+
+    public void setBizEnName(String bizEnName) {
+        this.bizEnName = bizEnName;
+        this.bizEnBigName = ToolUtil.firstLetterToUpper(this.bizEnName);
+    }
+
+    public String getProjectPath() {
+        return projectPath;
+    }
+
+    public void setProjectPath(String projectPath) {
+        this.projectPath = projectPath;
+    }
+
+    public String getModuleName() {
+        return moduleName;
+    }
+
+    public void setModuleName(String moduleName) {
+        this.moduleName = moduleName;
+    }
+
+    public Boolean getControllerSwitch() {
+        return controllerSwitch;
+    }
+
+    public void setControllerSwitch(Boolean controllerSwitch) {
+        this.controllerSwitch = controllerSwitch;
+    }
+
+    public Boolean getIndexPageSwitch() {
+        return indexPageSwitch;
+    }
+
+    public void setIndexPageSwitch(Boolean indexPageSwitch) {
+        this.indexPageSwitch = indexPageSwitch;
+    }
+
+    public Boolean getAddPageSwitch() {
+        return addPageSwitch;
+    }
+
+    public void setAddPageSwitch(Boolean addPageSwitch) {
+        this.addPageSwitch = addPageSwitch;
+    }
+
+    public Boolean getEditPageSwitch() {
+        return editPageSwitch;
+    }
+
+    public void setEditPageSwitch(Boolean editPageSwitch) {
+        this.editPageSwitch = editPageSwitch;
+    }
+
+    public Boolean getJsSwitch() {
+        return jsSwitch;
+    }
+
+    public void setJsSwitch(Boolean jsSwitch) {
+        this.jsSwitch = jsSwitch;
+    }
+
+    public Boolean getInfoJsSwitch() {
+        return infoJsSwitch;
+    }
+
+    public void setInfoJsSwitch(Boolean infoJsSwitch) {
+        this.infoJsSwitch = infoJsSwitch;
+    }
+
+    public Boolean getDaoSwitch() {
+        return daoSwitch;
+    }
+
+    public void setDaoSwitch(Boolean daoSwitch) {
+        this.daoSwitch = daoSwitch;
+    }
+
+    public Boolean getServiceSwitch() {
+        return serviceSwitch;
+    }
+
+    public void setServiceSwitch(Boolean serviceSwitch) {
+        this.serviceSwitch = serviceSwitch;
+    }
+
+    public String getTemplatePrefixPath() {
+        return templatePrefixPath;
+    }
+
+    public void setTemplatePrefixPath(String templatePrefixPath) {
+        this.templatePrefixPath = templatePrefixPath;
+    }
+
+    public String getModelPackageName() {
+        return modelPackageName;
+    }
+
+    public void setModelPackageName(String modelPackageName) {
+        this.modelPackageName = modelPackageName;
+    }
+
+    public String getEntityName() {
+        return entityName;
+    }
+
+    public void setEntityName(String entityName) {
+        this.entityName = entityName;
+    }
+
+    public String getModelMapperPackageName() {
+        return modelMapperPackageName;
+    }
+
+    public void setModelMapperPackageName(String modelMapperPackageName) {
+        this.modelMapperPackageName = modelMapperPackageName;
+    }
+
+    public Boolean getEntitySwitch() {
+        return entitySwitch;
+    }
+
+    public void setEntitySwitch(Boolean entitySwitch) {
+        this.entitySwitch = entitySwitch;
+    }
+
+    public Boolean getSqlSwitch() {
+        return sqlSwitch;
+    }
+
+    public void setSqlSwitch(Boolean sqlSwitch) {
+        this.sqlSwitch = sqlSwitch;
+    }
+
+    public String getProPackage() {
+        return proPackage;
+    }
+
+    public void setProPackage(String proPackage) {
+        this.proPackage = proPackage;
+    }
+
+    public String getCoreBasePackage() {
+        return coreBasePackage;
+    }
+
+    public void setCoreBasePackage(String coreBasePackage) {
+        this.coreBasePackage = coreBasePackage;
+    }
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ControllerConfig.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ControllerConfig.java
new file mode 100644
index 0000000..8775b3c
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ControllerConfig.java
@@ -0,0 +1,70 @@
+package com.stylefeng.guns.generator.engine.config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 控制器模板生成的配置
+ *
+ * @author fengshuonan
+ * @date 2017-05-07 22:12
+ */
+public class ControllerConfig {
+
+    private ContextConfig contextConfig;
+
+    private String controllerPathTemplate;
+    private String packageName;//包名称
+    private List<String> imports;//所引入的包
+
+    public void init() {
+        ArrayList<String> imports = new ArrayList<>();
+        imports.add(contextConfig.getCoreBasePackage() + ".base.controller.BaseController");
+        imports.add("org.springframework.stereotype.Controller");
+        imports.add("org.springframework.web.bind.annotation.RequestMapping");
+        imports.add("org.springframework.web.bind.annotation.ResponseBody");
+        imports.add("org.springframework.ui.Model");
+        imports.add("org.springframework.web.bind.annotation.PathVariable");
+        imports.add("org.springframework.beans.factory.annotation.Autowired");
+        imports.add(contextConfig.getProPackage() + ".core.log.LogObjectHolder");
+        imports.add("org.springframework.web.bind.annotation.RequestParam");
+        imports.add(contextConfig.getModelPackageName() + "." + contextConfig.getEntityName());
+        imports.add(contextConfig.getProPackage() + ".modular." + contextConfig.getModuleName() + ".service" + ".I" + contextConfig.getEntityName() + "Service");
+        this.imports = imports;
+        this.packageName = contextConfig.getProPackage() + ".modular." + contextConfig.getModuleName() + ".controller";
+        this.controllerPathTemplate = "\\src\\main\\java\\"+contextConfig.getProPackage().replaceAll("\\.","\\\\")+"\\modular\\" + contextConfig.getModuleName() + "\\controller\\{}Controller.java";
+    }
+
+    public String getPackageName() {
+        return packageName;
+    }
+
+    public void setPackageName(String packageName) {
+        this.packageName = packageName;
+    }
+
+    public List<String> getImports() {
+        return imports;
+    }
+
+    public void setImports(List<String> imports) {
+        this.imports = imports;
+    }
+
+    public String getControllerPathTemplate() {
+        return controllerPathTemplate;
+    }
+
+    public void setControllerPathTemplate(String controllerPathTemplate) {
+        this.controllerPathTemplate = controllerPathTemplate;
+    }
+
+    public ContextConfig getContextConfig() {
+        return contextConfig;
+    }
+
+    public void setContextConfig(ContextConfig contextConfig) {
+        this.contextConfig = contextConfig;
+    }
+
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/DaoConfig.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/DaoConfig.java
new file mode 100644
index 0000000..00e3092
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/DaoConfig.java
@@ -0,0 +1,55 @@
+package com.stylefeng.guns.generator.engine.config;
+
+/**
+ * Dao模板生成的配置
+ *
+ * @author fengshuonan
+ * @date 2017-05-07 22:12
+ */
+public class DaoConfig {
+
+    private ContextConfig contextConfig;
+
+    private String daoPathTemplate;
+    private String xmlPathTemplate;
+
+    private String packageName;
+
+    public void init() {
+        this.daoPathTemplate = "\\src\\main\\java\\" + contextConfig.getProPackage().replaceAll("\\.", "\\\\") + "\\modular\\" + contextConfig.getModuleName() + "\\dao\\{}Dao.java";
+        this.xmlPathTemplate = "\\src\\main\\java\\" + contextConfig.getProPackage().replaceAll("\\.", "\\\\") + "\\modular\\" + contextConfig.getModuleName() + "\\dao\\mapping\\{}Dao.xml";
+        this.packageName = contextConfig.getProPackage() + ".modular." + contextConfig.getModuleName() + ".dao";
+    }
+
+    public String getPackageName() {
+        return packageName;
+    }
+
+    public void setPackageName(String packageName) {
+        this.packageName = packageName;
+    }
+
+    public String getDaoPathTemplate() {
+        return daoPathTemplate;
+    }
+
+    public void setDaoPathTemplate(String daoPathTemplate) {
+        this.daoPathTemplate = daoPathTemplate;
+    }
+
+    public String getXmlPathTemplate() {
+        return xmlPathTemplate;
+    }
+
+    public void setXmlPathTemplate(String xmlPathTemplate) {
+        this.xmlPathTemplate = xmlPathTemplate;
+    }
+
+    public ContextConfig getContextConfig() {
+        return contextConfig;
+    }
+
+    public void setContextConfig(ContextConfig contextConfig) {
+        this.contextConfig = contextConfig;
+    }
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/Menu.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/Menu.java
new file mode 100644
index 0000000..2770128
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/Menu.java
@@ -0,0 +1,203 @@
+package com.stylefeng.guns.generator.engine.config;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 菜单表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2017-07-11
+ */
+public class Menu extends Model<Menu> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 菜单编号
+     */
+    private String code;
+    /**
+     * 菜单父编号
+     */
+    private String pcode;
+    /**
+     * 当前菜单的所有父菜单编号
+     */
+    private String pcodes;
+    /**
+     * 菜单名称
+     */
+    private String name;
+    /**
+     * 菜单图标
+     */
+    private String icon;
+    /**
+     * url地址
+     */
+    private String url;
+    /**
+     * 菜单排序号
+     */
+    private Integer num;
+    /**
+     * 菜单层级
+     */
+    private Integer levels;
+    /**
+     * 是否是菜单(1:是  0:不是)
+     */
+    private Integer ismenu;
+    /**
+     * 备注
+     */
+    private String tips;
+    /**
+     * 菜单状态 :  1:启用   0:不启用
+     */
+    private Integer status;
+    /**
+     * 是否打开:    1:打开   0:不打开
+     */
+    private Integer isopen;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getPcode() {
+        return pcode;
+    }
+
+    public void setPcode(String pcode) {
+        this.pcode = pcode;
+    }
+
+    public String getPcodes() {
+        return pcodes;
+    }
+
+    public void setPcodes(String pcodes) {
+        this.pcodes = pcodes;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+
+    public void setNum(Integer num) {
+        this.num = num;
+    }
+
+    public Integer getLevels() {
+        return levels;
+    }
+
+    public void setLevels(Integer levels) {
+        this.levels = levels;
+    }
+
+    public Integer getIsmenu() {
+        return ismenu;
+    }
+
+    public void setIsmenu(Integer ismenu) {
+        this.ismenu = ismenu;
+    }
+
+    public String getTips() {
+        return tips;
+    }
+
+    public void setTips(String tips) {
+        this.tips = tips;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getIsopen() {
+        return isopen;
+    }
+
+    public void setIsopen(Integer isopen) {
+        this.isopen = isopen;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "Menu{" +
+                "id=" + id +
+                ", code=" + code +
+                ", pcode=" + pcode +
+                ", pcodes=" + pcodes +
+                ", name=" + name +
+                ", icon=" + icon +
+                ", url=" + url +
+                ", num=" + num +
+                ", levels=" + levels +
+                ", ismenu=" + ismenu +
+                ", tips=" + tips +
+                ", status=" + status +
+                ", isopen=" + isopen +
+                "}";
+    }
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/PageConfig.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/PageConfig.java
new file mode 100644
index 0000000..a3324ea
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/PageConfig.java
@@ -0,0 +1,74 @@
+package com.stylefeng.guns.generator.engine.config;
+
+/**
+ * 页面 模板生成的配置
+ *
+ * @author fengshuonan
+ * @date 2017-05-07 22:12
+ */
+public class PageConfig {
+
+    private ContextConfig contextConfig;
+
+    private String pagePathTemplate;
+    private String pageAddPathTemplate;
+    private String pageEditPathTemplate;
+    private String pageJsPathTemplate;
+    private String pageInfoJsPathTemplate;
+
+    public void init() {
+        pagePathTemplate = "\\src\\main\\webapp\\WEB-INF\\view\\" + contextConfig.getModuleName() + "\\{}\\{}.html";
+        pageAddPathTemplate = "\\src\\main\\webapp\\WEB-INF\\view\\" + contextConfig.getModuleName() + "\\{}\\{}_add.html";
+        pageEditPathTemplate = "\\src\\main\\webapp\\WEB-INF\\view\\" + contextConfig.getModuleName() + "\\{}\\{}_edit.html";
+        pageJsPathTemplate = "\\src\\main\\webapp\\static\\modular\\" + contextConfig.getModuleName() + "\\{}\\{}.js";
+        pageInfoJsPathTemplate = "\\src\\main\\webapp\\static\\modular\\" + contextConfig.getModuleName() + "\\{}\\{}_info.js";
+    }
+
+    public String getPagePathTemplate() {
+        return pagePathTemplate;
+    }
+
+    public void setPagePathTemplate(String pagePathTemplate) {
+        this.pagePathTemplate = pagePathTemplate;
+    }
+
+    public String getPageJsPathTemplate() {
+        return pageJsPathTemplate;
+    }
+
+    public void setPageJsPathTemplate(String pageJsPathTemplate) {
+        this.pageJsPathTemplate = pageJsPathTemplate;
+    }
+
+    public String getPageAddPathTemplate() {
+        return pageAddPathTemplate;
+    }
+
+    public void setPageAddPathTemplate(String pageAddPathTemplate) {
+        this.pageAddPathTemplate = pageAddPathTemplate;
+    }
+
+    public String getPageEditPathTemplate() {
+        return pageEditPathTemplate;
+    }
+
+    public void setPageEditPathTemplate(String pageEditPathTemplate) {
+        this.pageEditPathTemplate = pageEditPathTemplate;
+    }
+
+    public String getPageInfoJsPathTemplate() {
+        return pageInfoJsPathTemplate;
+    }
+
+    public void setPageInfoJsPathTemplate(String pageInfoJsPathTemplate) {
+        this.pageInfoJsPathTemplate = pageInfoJsPathTemplate;
+    }
+
+    public ContextConfig getContextConfig() {
+        return contextConfig;
+    }
+
+    public void setContextConfig(ContextConfig contextConfig) {
+        this.contextConfig = contextConfig;
+    }
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ServiceConfig.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ServiceConfig.java
new file mode 100644
index 0000000..e6cc865
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/ServiceConfig.java
@@ -0,0 +1,91 @@
+package com.stylefeng.guns.generator.engine.config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Service模板生成的配置
+ *
+ * @author fengshuonan
+ * @date 2017-05-07 22:12
+ */
+public class ServiceConfig {
+
+    private ContextConfig contextConfig;
+
+    private String servicePathTemplate;
+    private String serviceImplPathTemplate;
+
+    private String packageName;
+
+    private List<String> serviceInterfaceImports;
+    private List<String> serviceImplImports;
+
+    public void init() {
+        ArrayList<String> imports = new ArrayList<>();
+        imports.add("org.springframework.stereotype.Service");
+        imports.add("com.baomidou.mybatisplus.service.impl.ServiceImpl");
+        imports.add(contextConfig.getModelPackageName() + "." + contextConfig.getEntityName());
+        imports.add(contextConfig.getModelMapperPackageName() + "." + contextConfig.getEntityName() + "Mapper");
+        imports.add(contextConfig.getProPackage() + ".modular." + contextConfig.getModuleName() + ".service.I" + contextConfig.getBizEnBigName() + "Service");
+        this.serviceImplImports = imports;
+
+        ArrayList<String> interfaceImports = new ArrayList<>();
+        interfaceImports.add("com.baomidou.mybatisplus.service.IService");
+        interfaceImports.add(contextConfig.getModelPackageName() + "." + contextConfig.getEntityName());
+        this.serviceInterfaceImports = interfaceImports;
+
+        this.servicePathTemplate = "\\src\\main\\java\\" + contextConfig.getProPackage().replaceAll("\\.", "\\\\") + "\\modular\\" + contextConfig.getModuleName() + "\\service\\I{}Service.java";
+        this.serviceImplPathTemplate = "\\src\\main\\java\\" + contextConfig.getProPackage().replaceAll("\\.", "\\\\") + "\\modular\\" + contextConfig.getModuleName() + "\\service\\impl\\{}ServiceImpl.java";
+        this.packageName = contextConfig.getProPackage() + ".modular." + contextConfig.getModuleName() + ".service";
+    }
+
+
+    public String getServicePathTemplate() {
+        return servicePathTemplate;
+    }
+
+    public void setServicePathTemplate(String servicePathTemplate) {
+        this.servicePathTemplate = servicePathTemplate;
+    }
+
+    public String getPackageName() {
+        return packageName;
+    }
+
+    public void setPackageName(String packageName) {
+        this.packageName = packageName;
+    }
+
+    public String getServiceImplPathTemplate() {
+        return serviceImplPathTemplate;
+    }
+
+    public void setServiceImplPathTemplate(String serviceImplPathTemplate) {
+        this.serviceImplPathTemplate = serviceImplPathTemplate;
+    }
+
+    public List<String> getServiceImplImports() {
+        return serviceImplImports;
+    }
+
+    public void setServiceImplImports(List<String> serviceImplImports) {
+        this.serviceImplImports = serviceImplImports;
+    }
+
+    public ContextConfig getContextConfig() {
+        return contextConfig;
+    }
+
+    public void setContextConfig(ContextConfig contextConfig) {
+        this.contextConfig = contextConfig;
+    }
+
+    public List<String> getServiceInterfaceImports() {
+        return serviceInterfaceImports;
+    }
+
+    public void setServiceInterfaceImports(List<String> serviceInterfaceImports) {
+        this.serviceInterfaceImports = serviceInterfaceImports;
+    }
+}
diff --git a/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/SqlConfig.java b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/SqlConfig.java
new file mode 100644
index 0000000..ec64b55
--- /dev/null
+++ b/management/guns-generator/src/main/java/com/stylefeng/guns/generator/engine/config/SqlConfig.java
@@ -0,0 +1,194 @@
+package com.stylefeng.guns.generator.engine.config;
+
+import com.baomidou.mybatisplus.toolkit.IdWorker;
+import com.stylefeng.guns.core.constant.IsMenu;
+import com.stylefeng.guns.core.util.ToolUtil;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 全局配置
+ *
+ * @author fengshuonan
+ * @date 2017-05-08 20:21
+ */
+public class SqlConfig {
+
+    private String sqlPathTemplate;
+
+    private ContextConfig contextConfig;
+
+    private Connection connection;
+
+    private String parentMenuName;
+
+    private List<Menu> menus = new ArrayList<>(6);
+
+    public void init() {
+
+        this.sqlPathTemplate = "\\src\\main\\java\\{}.sql";
+
+        if (parentMenuName == null) {
+            return;
+        }
+
+        //根据父菜单查询数据库中的pcode和pcodes
+        String[] pcodeAndPcodes = getPcodeAndPcodes();
+        if (pcodeAndPcodes == null) {
+            System.err.println("父级菜单名称输入有误!!!!");
+            return;
+        }
+
+        //业务菜单
+        Menu menu = new Menu();
+        menu.setId(IdWorker.getId());
+        menu.setCode(contextConfig.getBizEnName());
+        menu.setPcode(pcodeAndPcodes[0]);
+        menu.setPcodes(pcodeAndPcodes[1] + "[" + pcodeAndPcodes[0] + "],");
+        menu.setName(contextConfig.getBizChName());
+        menu.setIcon("");
+        menu.setUrl("/" + contextConfig.getBizEnName());
+        menu.setNum(99);
+
+        if (parentMenuName.equals("顶级")) {
+            menu.setLevels(1);
+        } else {
+            menu.setLevels(2);
+        }
+        menu.setIsmenu(IsMenu.YES.getCode());
+        menu.setStatus(1);
+        menu.setIsopen(0);
+        menus.add(menu);
+
+        //列表
+        Menu list = createSubMenu(menu);
+        list.setCode(contextConfig.getBizEnName() + "_list");
+        list.setName(contextConfig.getBizChName() + "列表");
+        list.setUrl("/" + contextConfig.getBizEnName() + "/list");
+        menus.add(list);
+
+        //添加
+        Menu add = createSubMenu(menu);
+        add.setCode(contextConfig.getBizEnName() + "_add");
+        add.setName(contextConfig.getBizChName() + "添加");
+        add.setUrl("/" + contextConfig.getBizEnName() + "/add");
+        menus.add(add);
+
+        //更新
+        Menu update = createSubMenu(menu);
+        update.setCode(contextConfig.getBizEnName() + "_update");
+        update.setName(contextConfig.getBizChName() + "更新");
+        update.setUrl("/" + contextConfig.getBizEnName() + "/update");
+        menus.add(update);
+
+        //删除
+        Menu delete = createSubMenu(menu);
+        delete.setCode(contextConfig.getBizEnName() + "_delete");
+        delete.setName(contextConfig.getBizChName() + "删除");
+        delete.setUrl("/" + contextConfig.getBizEnName() + "/delete");
+        menus.add(delete);
+
+        //详情
+        Menu detail = createSubMenu(menu);
+        detail.setCode(contextConfig.getBizEnName() + "_detail");
+        detail.setName(contextConfig.getBizChName() + "详情");
+        detail.setUrl("/" + contextConfig.getBizEnName() + "/detail");
+        menus.add(detail);
+    }
+
+    private Menu createSubMenu(Menu parentMenu) {
+        Menu menu = new Menu();
+        menu.setId(IdWorker.getId());
+        menu.setPcode(parentMenu.getCode());
+        menu.setPcodes(parentMenu.getPcodes() + "[" + parentMenu.getCode() + "],");
+        menu.setIcon("");
+        menu.setNum(99);
+        menu.setLevels(parentMenu.getLevels() + 1);
+        menu.setIsmenu(IsMenu.NO.getCode());
+        menu.setStatus(1);
+        menu.setIsopen(0);
+        return menu;
+    }
+
+    public String[] getPcodeAndPcodes() {
+        if (parentMenuName.equals("顶级")) {
+            return new String[]{"0", ""};
+        }
+        PreparedStatement preparedStatement = null;
+        try {
+            preparedStatement = connection.prepareStatement("select * from sys_menu where name like ?");
+            preparedStatement.setString(1, "%" + parentMenuName + "%");
+            ResultSet results = preparedStatement.executeQuery();
+            while (results.next()) {
+                String pcode = results.getString("code");
+                String pcodes = results.getString("pcodes");
+                if (ToolUtil.isNotEmpty(pcode) && ToolUtil.isNotEmpty(pcodes)) {
+                    String[] strings = {pcode, pcodes};
+                    return strings;
+                } else {
+                    return null;
+                }
+            }
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            // 释放资源
+            try {
+                if (preparedStatement != null) {
+                    preparedStatement.close();
+                }
+                if (connection != null) {
+                    connection.close();
+                }
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+    public ContextConfig getContextConfig() {
+        return contextConfig;
+    }
+
+    public void setContextConfig(ContextConfig contextConfig) {
+        this.contextConfig = contextConfig;
+    }
+
+    public String getParentMenuName() {
+        return parentMenuName;
+    }
+
+    public void setParentMenuName(String parentMenuName) {
+        this.parentMenuName = parentMenuName;
+    }
+
+    public Connection getConnection() {
+        return connection;
+    }
+
+    public void setConnection(Connection connection) {
+        this.connection = connection;
+    }
+
+    public String getSqlPathTemplate() {
+        return sqlPathTemplate;
+    }
+
+    public void setSqlPathTemplate(String sqlPathTemplate) {
+        this.sqlPathTemplate = sqlPathTemplate;
+    }
+
+    public List<Menu> getMenus() {
+        return menus;
+    }
+
+    public void setMenus(List<Menu> menus) {
+        this.menus = menus;
+    }
+}
diff --git a/management/guns-generator/src/main/resources/gunsTemplate/advanced/Controller.java.btl b/management/guns-generator/src/main/resources/gunsTemplate/advanced/Controller.java.btl
new file mode 100644
index 0000000..a187a36
--- /dev/null
+++ b/management/guns-generator/src/main/resources/gunsTemplate/advanced/Controller.java.btl
@@ -0,0 +1,96 @@
+package ${controller.packageName};
+
+<% for(import in controller.imports!){ %>
+import ${import};
+<% } %>
+
+/**
+ * ${context.bizChName}控制器
+ *
+ * @author fengshuonan
+ * @Date ${tool.currentTime()}
+ */
+@Controller
+@RequestMapping("/${context.bizEnName}")
+public class ${context.bizEnBigName}Controller extends BaseController {
+
+    private String PREFIX = "/${context.moduleName}/${context.bizEnName}/";
+
+    @Autowired
+    private I${context.entityName}Service ${context.bizEnName}Service;
+
+    /**
+     * 跳转到${context.bizChName}首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "${context.bizEnName}.html";
+    }
+
+    /**
+     * 跳转到添加${context.bizChName}
+     */
+    @RequestMapping("/${context.bizEnName}_add")
+    public String ${context.bizEnName}Add() {
+        return PREFIX + "${context.bizEnName}_add.html";
+    }
+
+    /**
+     * 跳转到修改${context.bizChName}
+     */
+    @RequestMapping("/${context.bizEnName}_update/{${context.bizEnName}Id}")
+    public String ${context.bizEnName}Update(@PathVariable Integer ${context.bizEnName}Id, Model model) {
+        ${context.entityName} ${context.bizEnName} = ${context.bizEnName}Service.selectById(${context.bizEnName}Id);
+        model.addAttribute("item",${context.bizEnName});
+        LogObjectHolder.me().set(${context.bizEnName});
+        return PREFIX + "${context.bizEnName}_edit.html";
+    }
+
+    /**
+     * 获取${context.bizChName}列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String condition) {
+        return ${context.bizEnName}Service.selectList(null);
+    }
+
+    /**
+     * 新增${context.bizChName}
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(${context.entityName} ${context.bizEnName}) {
+        ${context.bizEnName}Service.insert(${context.bizEnName});
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除${context.bizChName}
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer ${context.bizEnName}Id) {
+        ${context.bizEnName}Service.deleteById(${context.bizEnName}Id);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改${context.bizChName}
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(${context.entityName} ${context.bizEnName}) {
+        ${context.bizEnName}Service.updateById(${context.bizEnName});
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * ${context.bizChName}详情
+     */
+    @RequestMapping(value = "/detail/{${context.bizEnName}Id}")
+    @ResponseBody
+    public Object detail(@PathVariable("${context.bizEnName}Id") Integer ${context.bizEnName}Id) {
+        return ${context.bizEnName}Service.selectById(${context.bizEnName}Id);
+    }
+}
diff --git a/management/guns-generator/src/main/resources/gunsTemplate/advanced/menu_sql.sql.btl b/management/guns-generator/src/main/resources/gunsTemplate/advanced/menu_sql.sql.btl
new file mode 100644
index 0000000..07b094c
--- /dev/null
+++ b/management/guns-generator/src/main/resources/gunsTemplate/advanced/menu_sql.sql.btl
@@ -0,0 +1,3 @@
+<% for(menu in sqls.menus!){ %>
+INSERT INTO `guns`.`sys_menu` (`id`, `code`, `pcode`, `pcodes`, `name`, `icon`, `url`, `num`, `levels`, `ismenu`, `tips`, `status`, `isopen`) VALUES ('${menu.id}', '${menu.code}', '${menu.pcode}', '${menu.pcodes}', '${menu.name}', '${menu.icon}', '${menu.url}', '${menu.num}', '${menu.levels}', '${menu.ismenu}', NULL, '${menu.status}', '${menu.isopen}');
+<% } %>
\ No newline at end of file
diff --git a/management/guns-generator/src/main/resources/gunsTemplate/advanced/page.html.btl b/management/guns-generator/src/main/resources/gunsTemplate/advanced/page.html.btl
new file mode 100644
index 0000000..b21f29e
--- /dev/null
+++ b/management/guns-generator/src/main/resources/gunsTemplate/advanced/page.html.btl
@@ -0,0 +1,38 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>${context.bizChName}管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="condition" name="名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="${context.bizEnBigName}.search()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="${context.bizEnBigName}TableToolbar" role="group">
+                            @if(shiro.hasPermission("/${context.bizEnName}/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="${context.bizEnBigName}.openAdd${context.bizEnBigName}()"/>
+                            @}
+                            @if(shiro.hasPermission("/${context.bizEnName}/update")){
+                                <#button name="修改" icon="fa-edit" clickFun="${context.bizEnBigName}.open${context.bizEnBigName}Detail()" space="true"/>
+                            @}
+                            @if(shiro.hasPermission("/${context.bizEnName}/delete")){
+                                <#button name="删除" icon="fa-remove" clickFun="${context.bizEnBigName}.delete()" space="true"/>
+                            @}
+                        </div>
+                        <#table id="${context.bizEnBigName}Table"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="\${ctxPath}/static/modular/${context.moduleName}/${context.bizEnName}/${context.bizEnName}.js"></script>
+@}
diff --git a/management/guns-generator/src/main/resources/gunsTemplate/advanced/page.js.btl b/management/guns-generator/src/main/resources/gunsTemplate/advanced/page.js.btl
new file mode 100644
index 0000000..71c6477
--- /dev/null
+++ b/management/guns-generator/src/main/resources/gunsTemplate/advanced/page.js.btl
@@ -0,0 +1,102 @@
+/**
+ * ${context.bizChName}管理初始化
+ */
+var ${context.bizEnBigName} = {
+    id: "${context.bizEnBigName}Table",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+${context.bizEnBigName}.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        <% for(item in table.fields!){ %>
+        <% if(itemLP.last != true){ %>
+            {title: '${item.comment}', field: '${item.propertyName}', visible: true, align: 'center', valign: 'middle'},
+        <% }else{ %>
+            {title: '${item.comment}', field: '${item.propertyName}', visible: true, align: 'center', valign: 'middle'}
+        <% }} %>
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+${context.bizEnBigName}.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        ${context.bizEnBigName}.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加${context.bizChName}
+ */
+${context.bizEnBigName}.openAdd${context.bizEnBigName} = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加${context.bizChName}',
+        area: ['800px', '420px'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/${context.bizEnName}/${context.bizEnName}_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看${context.bizChName}详情
+ */
+${context.bizEnBigName}.open${context.bizEnBigName}Detail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '${context.bizChName}详情',
+            area: ['800px', '420px'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/${context.bizEnName}/${context.bizEnName}_update/' + ${context.bizEnBigName}.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 删除${context.bizChName}
+ */
+${context.bizEnBigName}.delete = function () {
+    if (this.check()) {
+        var ajax = new $ax(Feng.ctxPath + "/${context.bizEnName}/delete", function (data) {
+            Feng.success("删除成功!");
+            ${context.bizEnBigName}.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("${context.bizEnName}Id",this.seItem.id);
+        ajax.start();
+    }
+};
+
+/**
+ * 查询${context.bizChName}列表
+ */
+${context.bizEnBigName}.search = function () {
+    var queryData = {};
+    queryData['condition'] = $("#condition").val();
+    ${context.bizEnBigName}.table.refresh({query: queryData});
+};
+
+$(function () {
+    var defaultColunms = ${context.bizEnBigName}.initColumn();
+    var table = new BSTable(${context.bizEnBigName}.id, "/${context.bizEnName}/list", defaultColunms);
+    table.setPaginationType("client");
+    ${context.bizEnBigName}.table = table.init();
+});
diff --git a/management/guns-generator/src/main/resources/gunsTemplate/advanced/page_add.html.btl b/management/guns-generator/src/main/resources/gunsTemplate/advanced/page_add.html.btl
new file mode 100644
index 0000000..1b8d41e
--- /dev/null
+++ b/management/guns-generator/src/main/resources/gunsTemplate/advanced/page_add.html.btl
@@ -0,0 +1,41 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <% var leftSize = tool.toInt((table.fields.~size + 1) / 2); %>
+                    <% var rightSize = tool.toInt(table.fields.~size - leftSize); %>
+                    <% for(var i=0;i<leftSize;i++){ %>
+                        <% if(i != (leftSize-1) ){ %>
+                            <#input id="${table.fields[i].propertyName}" name="${table.fields[i].comment}" underline="true"/>
+                        <% }else{ %>
+                            <#input id="${table.fields[i].propertyName}" name="${table.fields[i].comment}"/>
+                        <% } %>
+                    <% } %>
+                </div>
+
+                <div class="col-sm-6">
+                    <% for(var i=leftSize;i<table.fields.~size;i++){ %>
+                        <% if(i != (rightSize-1) ){ %>
+                            <#input id="${table.fields[i].propertyName}" name="${table.fields[i].comment}" underline="true"/>
+                        <% }else{ %>
+                            <#input id="${table.fields[i].propertyName}" name="${table.fields[i].comment}"/>
+                        <% } %>
+                    <% } %>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="${context.bizEnBigName}InfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="${context.bizEnBigName}InfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="\${ctxPath}/static/modular/${context.moduleName}/${context.bizEnName}/${context.bizEnName}_info.js"></script>
+@}
diff --git a/management/guns-generator/src/main/resources/gunsTemplate/advanced/page_edit.html.btl b/management/guns-generator/src/main/resources/gunsTemplate/advanced/page_edit.html.btl
new file mode 100644
index 0000000..7839f5b
--- /dev/null
+++ b/management/guns-generator/src/main/resources/gunsTemplate/advanced/page_edit.html.btl
@@ -0,0 +1,41 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-6 b-r">
+                    <% var leftSize = tool.toInt((table.fields.~size + 1) / 2); %>
+                    <% var rightSize = tool.toInt(table.fields.~size - leftSize); %>
+                    <% for(var i=0;i<leftSize;i++){ %>
+                        <% if(i != (leftSize-1) ){ %>
+                            <#input id="${table.fields[i].propertyName}" name="${table.fields[i].comment}" value="\${item.${table.fields[i].propertyName}}" underline="true"/>
+                        <% }else{ %>
+                            <#input id="${table.fields[i].propertyName}" name="${table.fields[i].comment}" value="\${item.${table.fields[i].propertyName}}" />
+                        <% } %>
+                    <% } %>
+                </div>
+
+                <div class="col-sm-6">
+                    <% for(var i=leftSize;i<table.fields.~size;i++){ %>
+                        <% if(i != (table.fields.~size-1) ){ %>
+                            <#input id="${table.fields[i].propertyName}" name="${table.fields[i].comment}" value="\${item.${table.fields[i].propertyName}}" underline="true"/>
+                        <% }else{ %>
+                            <#input id="${table.fields[i].propertyName}" name="${table.fields[i].comment}" value="\${item.${table.fields[i].propertyName}}" />
+                        <% } %>
+                    <% } %>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="${context.bizEnBigName}InfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="${context.bizEnBigName}InfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="\${ctxPath}/static/modular/${context.moduleName}/${context.bizEnName}/${context.bizEnName}_info.js"></script>
+@}
diff --git a/management/guns-generator/src/main/resources/gunsTemplate/advanced/page_info.js.btl b/management/guns-generator/src/main/resources/gunsTemplate/advanced/page_info.js.btl
new file mode 100644
index 0000000..7430b88
--- /dev/null
+++ b/management/guns-generator/src/main/resources/gunsTemplate/advanced/page_info.js.btl
@@ -0,0 +1,98 @@
+/**
+ * 初始化${context.bizChName}详情对话框
+ */
+var ${context.bizEnBigName}InfoDlg = {
+    ${context.bizEnName}InfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+${context.bizEnBigName}InfoDlg.clearData = function() {
+    this.${context.bizEnName}InfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+${context.bizEnBigName}InfoDlg.set = function(key, val) {
+    this.${context.bizEnName}InfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+${context.bizEnBigName}InfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+${context.bizEnBigName}InfoDlg.close = function() {
+    parent.layer.close(window.parent.${context.bizEnBigName}.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+${context.bizEnBigName}InfoDlg.collectData = function() {
+    this
+    <% for(item in table.fields!){ %>
+    <% if(itemLP.last != true){ %>
+    .set('${item.propertyName}')
+    <% }else{ %>
+    .set('${item.propertyName}');
+    <% }} %>
+}
+
+/**
+ * 提交添加
+ */
+${context.bizEnBigName}InfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/${context.bizEnName}/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.${context.bizEnBigName}.table.refresh();
+        ${context.bizEnBigName}InfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.${context.bizEnName}InfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+${context.bizEnBigName}InfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/${context.bizEnName}/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.${context.bizEnBigName}.table.refresh();
+        ${context.bizEnBigName}InfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.${context.bizEnName}InfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/management/pom.xml b/management/pom.xml
new file mode 100644
index 0000000..bbae030
--- /dev/null
+++ b/management/pom.xml
@@ -0,0 +1,253 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.stylefeng</groupId>
+    <artifactId>guns-parent</artifactId>
+    <version>1.0.0</version>
+
+    <name>guns-parent</name>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>guns-admin</module>
+        <module>guns-core</module>
+        <module>guns-rest</module>
+        <module>guns-generator</module>
+    </modules>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.0.4.RELEASE</version>
+    </parent>
+
+    <properties>
+        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <guns.version>1.0.0</guns.version>
+        <mybatisplus-spring-boot-starter.version>1.0.5</mybatisplus-spring-boot-starter.version>
+        <shiro.version>1.8.0</shiro.version>
+        <mybatis-plus.version>2.3</mybatis-plus.version>
+        <fastjson.version>1.2.47</fastjson.version>
+        <velocity.version>1.7</velocity.version>
+        <kaptcha.version>2.3.2</kaptcha.version>
+        <ehcache.version>3.3.1</ehcache.version>
+        <zxing.version>3.2.1</zxing.version>
+        <druid.version>1.1.10</druid.version>
+        <beetl.version>2.8.5</beetl.version>
+        <swagger.version>2.9.2</swagger.version>
+        <commons-lang3.version>3.7</commons-lang3.version>
+        <ehcache.core.version>2.6.11</ehcache.core.version>
+        <mysql-connector-java.version>8.0.11</mysql-connector-java.version>
+        <jwt.version>0.9.0</jwt.version>
+        <hutool.version>4.1.1</hutool.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.stylefeng</groupId>
+                <artifactId>guns-generator</artifactId>
+                <version>${guns.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.stylefeng</groupId>
+                <artifactId>guns-core</artifactId>
+                <version>${guns.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>2.0.1.RELEASE</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatisplus-spring-boot-starter</artifactId>
+                <version>${mybatisplus-spring-boot-starter.version}</version>
+            </dependency>
+            <!--shiro依赖-->
+            <dependency>
+                <groupId>org.apache.shiro</groupId>
+                <artifactId>shiro-core</artifactId>
+                <version>${shiro.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.shiro</groupId>
+                <artifactId>shiro-spring</artifactId>
+                <version>${shiro.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.shiro</groupId>
+                <artifactId>shiro-ehcache</artifactId>
+                <version>${shiro.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>mysql</groupId>
+                <artifactId>mysql-connector-java</artifactId>
+                <version>${mysql-connector-java.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-generate</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.github.penggle</groupId>
+                <artifactId>kaptcha</artifactId>
+                <version>${kaptcha.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ehcache</groupId>
+                <artifactId>ehcache</artifactId>
+                <version>${ehcache.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.zxing</groupId>
+                <artifactId>core</artifactId>
+                <version>${zxing.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.velocity</groupId>
+                <artifactId>velocity</artifactId>
+                <version>${velocity.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.ibeetl</groupId>
+                <artifactId>beetl</artifactId>
+                <version>${beetl.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger2</artifactId>
+                <version>${swagger.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-swagger-ui</artifactId>
+                <version>${swagger.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commons-lang3.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>net.sf.ehcache</groupId>
+                <artifactId>ehcache-core</artifactId>
+                <version>${ehcache.core.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.jsonwebtoken</groupId>
+                <artifactId>jjwt</artifactId>
+                <version>${jwt.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>3.1</version>
+                    <configuration>
+                        <source>${java.version}</source>
+                        <target>${java.version}</target>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-maven-plugin</artifactId>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <delimiters>
+                        <delimiter>@</delimiter>
+                    </delimiters>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                </configuration>
+            </plugin>
+        </plugins>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>local</id>
+            <properties>
+                <spring.active>local</spring.active>
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <spring.active>dev</spring.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>test</id>
+            <properties>
+                <spring.active>test</spring.active>
+            </properties>
+        </profile>
+        <profile>
+            <id>produce</id>
+            <properties>
+                <spring.active>produce</spring.active>
+            </properties>
+        </profile>
+    </profiles>
+
+</project>

--
Gitblit v1.7.1